diff --git a/lib/constants.d.ts b/lib/constants.d.ts
index 58e0a9e..36a355a 100644
--- a/lib/constants.d.ts
+++ b/lib/constants.d.ts
@@ -17,6 +17,8 @@
     email?: string;
     /** The folder to deploy. */
     folder: string;
+    /** The auto generated folder path. */
+    folderPath?: string;
     /** GitHub deployment token. */
     gitHubToken?: string | null;
     /** Determines if the action is running in test mode or not. */
@@ -31,8 +33,6 @@
     repositoryName?: string;
     /** The fully qualified repositpory path, this gets auto generated if repositoryName is provided. */
     repositoryPath?: string;
-    /** The root directory where your project lives. */
-    root?: string;
     /** Wipes the commit history from the deployment branch in favor of a single commit. */
     singleCommit?: boolean | null;
     /** Determines if the action should run in silent mode or not. */
@@ -46,7 +46,28 @@
     /** The folder where your deployment project lives. */
     workspace: string;
 }
+/** The minimum required values to run the action as a node module. */
+export interface NodeActionInterface {
+    /** Deployment access token. */
+    accessToken?: string | null;
+    /** The branch that the action should deploy to. */
+    branch: string;
+    /** The folder to deploy. */
+    folder: string;
+    /** GitHub deployment token. */
+    gitHubToken?: string | null;
+    /** The repository path, for example JamesIves/github-pages-deploy-action. */
+    repositoryName: string;
+    /** Determines if the action should run in silent mode or not. */
+    silent: boolean;
+    /** Set to true if you're using an ssh client in your build step. */
+    ssh?: boolean | null;
+    /** The folder where your deployment project lives. */
+    workspace: string;
+}
 export declare const action: ActionInterface;
+/** Types for the required action parameters. */
+export declare type RequiredActionParameters = Pick<ActionInterface, 'accessToken' | 'gitHubToken' | 'ssh' | 'branch' | 'folder'>;
 /** Status codes for the action. */
 export declare enum Status {
     SUCCESS = "success",
diff --git a/lib/constants.js b/lib/constants.js
index 05e5110..5422832 100644
--- a/lib/constants.js
+++ b/lib/constants.js
@@ -63,7 +63,6 @@
         : repository && repository.full_name
             ? repository.full_name
             : process.env.GITHUB_REPOSITORY,
-    root: '.',
     singleCommit: !util_1.isNullOrUndefined(core_1.getInput('SINGLE_COMMIT'))
         ? core_1.getInput('SINGLE_COMMIT').toLowerCase() === 'true'
         : false,
diff --git a/lib/git.js b/lib/git.js
index 9ac52e1..8237030 100644
--- a/lib/git.js
+++ b/lib/git.js
@@ -23,7 +23,6 @@
 function init(action) {
     return __awaiter(this, void 0, void 0, function* () {
         try {
-            util_1.hasRequiredParameters(action);
             core_1.info(`Deploying using ${action.tokenType}… 🔑`);
             core_1.info('Configuring git…');
             yield execute_1.execute(`git init`, action.workspace, action.silent);
@@ -56,7 +55,6 @@
 function switchToBaseBranch(action) {
     return __awaiter(this, void 0, void 0, function* () {
         try {
-            util_1.hasRequiredParameters(action);
             yield execute_1.execute(`git checkout --progress --force ${action.baseBranch ? action.baseBranch : action.defaultBranch}`, action.workspace, action.silent);
         }
         catch (error) {
@@ -69,7 +67,6 @@
 function generateBranch(action) {
     return __awaiter(this, void 0, void 0, function* () {
         try {
-            util_1.hasRequiredParameters(action);
             core_1.info(`Creating the ${action.branch} branch…`);
             yield switchToBaseBranch(action);
             yield execute_1.execute(`git checkout --orphan ${action.branch}`, action.workspace, action.silent);
@@ -94,7 +91,6 @@
             .substr(2, 9)}`;
         core_1.info('Starting to commit changes…');
         try {
-            util_1.hasRequiredParameters(action);
             const commitMessage = !util_1.isNullOrUndefined(action.commitMessage)
                 ? action.commitMessage
                 : `Deploying to ${action.branch} from ${action.baseBranch} ${process.env.GITHUB_SHA ? `@ ${process.env.GITHUB_SHA}` : ''} 🚀`;
@@ -118,9 +114,6 @@
                 core_1.info(`Applying stashed workspace changes… ⬆️`);
                 try {
                     yield execute_1.execute(`git stash apply`, action.workspace, action.silent);
-                    if (action.isTest) {
-                        throw new Error();
-                    }
                 }
                 catch (_a) {
                     core_1.info('Unable to apply from stash, continuing…');
@@ -150,13 +143,15 @@
               Pushes all of the build files into the deployment directory.
               Allows the user to specify the root if '.' is provided.
               rsync is used to prevent file duplication. */
-            yield execute_1.execute(`rsync -q -av --checksum --progress ${action.folder}/. ${action.targetFolder
+            yield execute_1.execute(`rsync -q -av --checksum --progress ${action.folderPath}/. ${action.targetFolder
                 ? `${temporaryDeploymentDirectory}/${action.targetFolder}`
                 : temporaryDeploymentDirectory} ${action.clean
-                ? `--delete ${excludes} ${!fs_1.default.existsSync(`${action.folder}/CNAME`) ? '--exclude CNAME' : ''} ${!fs_1.default.existsSync(`${action.folder}/.nojekyll`)
+                ? `--delete ${excludes} ${!fs_1.default.existsSync(`${action.folderPath}/CNAME`)
+                    ? '--exclude CNAME'
+                    : ''} ${!fs_1.default.existsSync(`${action.folderPath}/.nojekyll`)
                     ? '--exclude .nojekyll'
                     : ''}`
-                : ''}  --exclude .ssh --exclude .git --exclude .github ${action.folder === action.root
+                : ''}  --exclude .ssh --exclude .git --exclude .github ${action.folderPath === action.workspace
                 ? `--exclude ${temporaryDeploymentDirectory}`
                 : ''}`, action.workspace, action.silent);
             const hasFilesToCommit = yield execute_1.execute(`git status --porcelain`, `${action.workspace}/${temporaryDeploymentDirectory}`, action.silent);
diff --git a/lib/lib.d.ts b/lib/lib.d.ts
index ed545d5..90d04d2 100644
--- a/lib/lib.d.ts
+++ b/lib/lib.d.ts
@@ -1,8 +1,6 @@
-import { ActionInterface } from './constants';
-import { deploy, generateBranch, init } from './git';
+import { ActionInterface, NodeActionInterface } from './constants';
 /** Initializes and runs the action.
  *
  * @param {object} configuration - The action configuration.
  */
-export default function run(configuration: ActionInterface): Promise<void>;
-export { init, deploy, generateBranch, ActionInterface };
+export default function run(configuration: ActionInterface | NodeActionInterface): Promise<void>;
diff --git a/lib/lib.js b/lib/lib.js
index 9ba68e8..2de5ff2 100644
--- a/lib/lib.js
+++ b/lib/lib.js
@@ -9,13 +9,9 @@
     });
 };
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.generateBranch = exports.deploy = exports.init = void 0;
 const core_1 = require("@actions/core");
 const constants_1 = require("./constants");
 const git_1 = require("./git");
-Object.defineProperty(exports, "deploy", { enumerable: true, get: function () { return git_1.deploy; } });
-Object.defineProperty(exports, "generateBranch", { enumerable: true, get: function () { return git_1.generateBranch; } });
-Object.defineProperty(exports, "init", { enumerable: true, get: function () { return git_1.init; } });
 const util_1 = require("./util");
 /** Initializes and runs the action.
  *
@@ -29,14 +25,17 @@
     GitHub Pages Deploy Action 🚀
 
     🚀 Getting Started Guide: https://github.com/marketplace/actions/deploy-to-github-pages
-    ❓ FAQ/Wiki: https://github.com/JamesIves/github-pages-deploy-action/wiki
-    🔧 Support: https://github.com/JamesIves/github-pages-deploy-action/issues
-    ⭐ Contribute: https://github.com/JamesIves/github-pages-deploy-action/blob/dev/CONTRIBUTING.md
+    ❓ Discussions / Q&A: https://github.com/JamesIves/github-pages-deploy-action/discussions
+    🔧 Report a Bug: https://github.com/JamesIves/github-pages-deploy-action/issues
 
-    📣 Maintained by James Ives (https://jamesiv.es)`);
+    📣 Maintained by James Ives: https://jamesiv.es
+    💖 Support: https://github.com/sponsors/JamesIves`);
             core_1.info('Checking configuration and starting deployment… 🚦');
-            const settings = Object.assign(Object.assign({}, constants_1.action), configuration);
-            // Defines the repository paths and token types.
+            const settings = Object.assign({}, configuration);
+            // Defines the repository/folder paths and token types.
+            // Also verifies that the action has all of the required parameters.
+            settings.folderPath = util_1.generateFolderPath(settings);
+            util_1.checkParameters(settings);
             settings.repositoryPath = util_1.generateRepositoryPath(settings);
             settings.tokenType = util_1.generateTokenType(settings);
             yield git_1.init(settings);
diff --git a/lib/util.d.ts b/lib/util.d.ts
index b4e30ab..d110e8b 100644
--- a/lib/util.d.ts
+++ b/lib/util.d.ts
@@ -2,5 +2,6 @@
 export declare const isNullOrUndefined: (value: any) => boolean;
 export declare const generateTokenType: (action: ActionInterface) => string;
 export declare const generateRepositoryPath: (action: ActionInterface) => string;
-export declare const hasRequiredParameters: (action: ActionInterface) => void;
+export declare const generateFolderPath: (action: ActionInterface) => string;
+export declare const checkParameters: (action: ActionInterface) => void;
 export declare const suppressSensitiveInformation: (str: string, action: ActionInterface) => string;
diff --git a/lib/util.js b/lib/util.js
index 697f5d2..9d24472 100644
--- a/lib/util.js
+++ b/lib/util.js
@@ -1,7 +1,13 @@
 "use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.suppressSensitiveInformation = exports.hasRequiredParameters = exports.generateRepositoryPath = exports.generateTokenType = exports.isNullOrUndefined = void 0;
+exports.suppressSensitiveInformation = exports.checkParameters = exports.generateFolderPath = exports.generateRepositoryPath = exports.generateTokenType = exports.isNullOrUndefined = void 0;
+const fs_1 = require("fs");
+const path_1 = __importDefault(require("path"));
 const core_1 = require("@actions/core");
+/* Replaces all instances of a match in a string. */
 const replaceAll = (input, find, replace) => input.split(find).join(replace);
 /* Utility function that checks to see if a value is undefined or not. */
 exports.isNullOrUndefined = (value) => typeof value === 'undefined' || value === null || value === '';
@@ -17,23 +23,33 @@
 exports.generateRepositoryPath = (action) => action.ssh
     ? `git@github.com:${action.repositoryName}`
     : `https://${action.accessToken || `x-access-token:${action.gitHubToken}`}@github.com/${action.repositoryName}.git`;
+/* Genetate absolute folder path by the provided folder name */
+exports.generateFolderPath = (action) => {
+    const folderName = action['folder'];
+    return path_1.default.isAbsolute(folderName)
+        ? folderName
+        : folderName.startsWith('~')
+            ? folderName.replace('~', process.env.HOME)
+            : path_1.default.join(action.workspace, folderName);
+};
 /* Checks for the required tokens and formatting. Throws an error if any case is matched. */
-exports.hasRequiredParameters = (action) => {
-    if ((exports.isNullOrUndefined(action.accessToken) &&
-        exports.isNullOrUndefined(action.gitHubToken) &&
-        exports.isNullOrUndefined(action.ssh)) ||
-        exports.isNullOrUndefined(action.repositoryPath) ||
-        (action.accessToken && action.accessToken === '')) {
+const hasRequiredParameters = (action, params) => {
+    const nonNullParams = params.filter(param => !exports.isNullOrUndefined(action[param]));
+    return Boolean(nonNullParams.length);
+};
+/* Verifies the action has the required parameters to run, otherwise throw an error. */
+exports.checkParameters = (action) => {
+    if (!hasRequiredParameters(action, ['accessToken', 'gitHubToken', 'ssh'])) {
         throw new Error('No deployment token/method was provided. You must provide the action with either a Personal Access Token or the GitHub Token secret in order to deploy. If you wish to use an ssh deploy token then you must set SSH to true.');
     }
-    if (exports.isNullOrUndefined(action.branch)) {
+    if (!hasRequiredParameters(action, ['branch'])) {
         throw new Error('Branch is required.');
     }
-    if (!action.folder || exports.isNullOrUndefined(action.folder)) {
+    if (!hasRequiredParameters(action, ['folder'])) {
         throw new Error('You must provide the action with a folder to deploy.');
     }
-    if (action.folder.startsWith('/') || action.folder.startsWith('./')) {
-        throw new Error("Incorrectly formatted build folder. The deployment folder cannot be prefixed with '/' or './'. Instead reference the folder name directly.");
+    if (!fs_1.existsSync(action.folderPath)) {
+        throw new Error(`The directory you're trying to deploy named ${action.folderPath} doesn't exist. Please double check the path and any prerequisite build scripts and try again. ❗`);
     }
 };
 /* Suppresses sensitive information from being exposed in error messages. */
diff --git a/node_modules/.bin/eslint-github-init b/node_modules/.bin/eslint-github-init
deleted file mode 120000
index 5f657e9..0000000
--- a/node_modules/.bin/eslint-github-init
+++ /dev/null
@@ -1 +0,0 @@
-../eslint-plugin-github/bin/eslint-github-init.js
\ No newline at end of file
diff --git a/node_modules/.bin/eslint-unused-modules b/node_modules/.bin/eslint-unused-modules
deleted file mode 120000
index abc0e5d..0000000
--- a/node_modules/.bin/eslint-unused-modules
+++ /dev/null
@@ -1 +0,0 @@
-../eslint-plugin-github/bin/eslint-unused-modules.js
\ No newline at end of file
diff --git a/node_modules/.bin/flow-coverage b/node_modules/.bin/flow-coverage
deleted file mode 120000
index 05e9f7a..0000000
--- a/node_modules/.bin/flow-coverage
+++ /dev/null
@@ -1 +0,0 @@
-../eslint-plugin-github/bin/flow-coverage.js
\ No newline at end of file
diff --git a/node_modules/.bin/github-lint b/node_modules/.bin/github-lint
deleted file mode 120000
index 466698f..0000000
--- a/node_modules/.bin/github-lint
+++ /dev/null
@@ -1 +0,0 @@
-../eslint-plugin-github/bin/github-lint.js
\ No newline at end of file
diff --git a/node_modules/.bin/jsdoctypeparser b/node_modules/.bin/jsdoctypeparser
deleted file mode 120000
index 5b82c28..0000000
--- a/node_modules/.bin/jsdoctypeparser
+++ /dev/null
@@ -1 +0,0 @@
-../jsdoctypeparser/bin/jsdoctypeparser
\ No newline at end of file
diff --git a/node_modules/.bin/loose-envify b/node_modules/.bin/loose-envify
deleted file mode 120000
index ed9009c..0000000
--- a/node_modules/.bin/loose-envify
+++ /dev/null
@@ -1 +0,0 @@
-../loose-envify/cli.js
\ No newline at end of file
diff --git a/node_modules/.bin/npm-check-github-package-requirements b/node_modules/.bin/npm-check-github-package-requirements
deleted file mode 120000
index fdeac3b..0000000
--- a/node_modules/.bin/npm-check-github-package-requirements
+++ /dev/null
@@ -1 +0,0 @@
-../eslint-plugin-github/bin/npm-check-github-package-requirements.js
\ No newline at end of file
diff --git a/node_modules/.bin/rimraf b/node_modules/.bin/rimraf
index 7d23b3f..4cd49a4 120000
--- a/node_modules/.bin/rimraf
+++ b/node_modules/.bin/rimraf
@@ -1 +1 @@
-../flat-cache/node_modules/rimraf/bin.js
\ No newline at end of file
+../rimraf/bin.js
\ No newline at end of file
diff --git a/node_modules/@babel/core/node_modules/.bin/semver b/node_modules/@babel/core/node_modules/.bin/semver
index 317eb29..085f561 120000
--- a/node_modules/@babel/core/node_modules/.bin/semver
+++ b/node_modules/@babel/core/node_modules/.bin/semver
@@ -1 +1 @@
-../semver/bin/semver
\ No newline at end of file
+../../../../normalize-package-data/node_modules/semver/bin/semver
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/LICENSE b/node_modules/@babel/runtime-corejs3/LICENSE
deleted file mode 100644
index f31575e..0000000
--- a/node_modules/@babel/runtime-corejs3/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-MIT License
-
-Copyright (c) 2014-present Sebastian McKenzie and other contributors
-
-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/node_modules/@babel/runtime-corejs3/README.md b/node_modules/@babel/runtime-corejs3/README.md
deleted file mode 100644
index 78ce1b4..0000000
--- a/node_modules/@babel/runtime-corejs3/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# @babel/runtime-corejs3
-
-> babel's modular runtime helpers with core-js@3 polyfilling
-
-## Install
-
-Using npm:
-
-```sh
-npm install --save-dev @babel/runtime-corejs3
-```
-
-or using yarn:
-
-```sh
-yarn add @babel/runtime-corejs3 --dev
-```
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js b/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js
deleted file mode 100644
index 468393e..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/array/from.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/array/from");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js b/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js
deleted file mode 100644
index 974dfb4..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/array/is-array.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/array/is-array");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/array/of.js b/node_modules/@babel/runtime-corejs3/core-js-stable/array/of.js
deleted file mode 100644
index c3355a8..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/array/of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/array/of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/clear-immediate.js b/node_modules/@babel/runtime-corejs3/core-js-stable/clear-immediate.js
deleted file mode 100644
index f2e7116..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/clear-immediate.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/clear-immediate");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/date/now.js b/node_modules/@babel/runtime-corejs3/core-js-stable/date/now.js
deleted file mode 100644
index de1eb3f..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/date/now.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/date/now");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js
deleted file mode 100644
index 7e53580..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/bind.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/bind");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/code-point-at.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/code-point-at.js
deleted file mode 100644
index 4301cab..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/code-point-at.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/code-point-at");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js
deleted file mode 100644
index 3e9fe5d..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/concat.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/concat");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/copy-within.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/copy-within.js
deleted file mode 100644
index 4c6b64c..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/copy-within.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/copy-within");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/ends-with.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/ends-with.js
deleted file mode 100644
index 8c87327..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/ends-with.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/ends-with");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/entries.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/entries.js
deleted file mode 100644
index 536beb0..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/entries.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/entries");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/every.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/every.js
deleted file mode 100644
index b8caa69..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/every.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/every");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/fill.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/fill.js
deleted file mode 100644
index ab4e00d..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/fill.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/fill");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js
deleted file mode 100644
index 82c3d4f..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/filter.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/filter");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find-index.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find-index.js
deleted file mode 100644
index 54547e0..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find-index.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/find-index");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js
deleted file mode 100644
index a97795c..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/find.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/find");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flags.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flags.js
deleted file mode 100644
index 126ca63..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flags.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/flags");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flat-map.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flat-map.js
deleted file mode 100644
index 5008ceb..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flat-map.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/flat-map");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flat.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flat.js
deleted file mode 100644
index 9113bd4..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/flat.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/flat");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js
deleted file mode 100644
index def7519..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/for-each.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/for-each");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js
deleted file mode 100644
index 6481029..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/includes.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/includes");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js
deleted file mode 100644
index 349cbb2..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/index-of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/index-of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/keys.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/keys.js
deleted file mode 100644
index e418fa7..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/keys.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/keys");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/last-index-of.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/last-index-of.js
deleted file mode 100644
index 0493997..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/last-index-of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/last-index-of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js
deleted file mode 100644
index 823c96d..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/map");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-end.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-end.js
deleted file mode 100644
index 4643368..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-end.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/pad-end");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-start.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-start.js
deleted file mode 100644
index 0fc1290..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/pad-start.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/pad-start");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce-right.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce-right.js
deleted file mode 100644
index 05939ae..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce-right.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/reduce-right");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js
deleted file mode 100644
index 6b268bf..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reduce.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/reduce");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/repeat.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/repeat.js
deleted file mode 100644
index cf6db61..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/repeat.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/repeat");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reverse.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reverse.js
deleted file mode 100644
index 665219c..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/reverse.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/reverse");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js
deleted file mode 100644
index 237e11d..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/slice.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/slice");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js
deleted file mode 100644
index 1d9c925..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/some.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/some");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/sort.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/sort.js
deleted file mode 100644
index 43c83a8..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/sort.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/sort");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js
deleted file mode 100644
index 70794ea..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/splice.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/splice");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/starts-with.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/starts-with.js
deleted file mode 100644
index 5898867..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/starts-with.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/starts-with");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim-end.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim-end.js
deleted file mode 100644
index 3684244..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim-end.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/trim-end");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim-left.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim-left.js
deleted file mode 100644
index 9b63733..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim-left.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/trim-left");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim-right.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim-right.js
deleted file mode 100644
index 4680046..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim-right.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/trim-right");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim-start.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim-start.js
deleted file mode 100644
index c964460..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim-start.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/trim-start");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js
deleted file mode 100644
index fa394d7..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/trim.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/trim");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js b/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js
deleted file mode 100644
index 17def65..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/instance/values.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/instance/values");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js b/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js
deleted file mode 100644
index 16028c0..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/json/stringify.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/json/stringify");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/map.js b/node_modules/@babel/runtime-corejs3/core-js-stable/map.js
deleted file mode 100644
index 007829f..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/map.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/map");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/acosh.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/acosh.js
deleted file mode 100644
index 9ad4163..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/acosh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/acosh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/asinh.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/asinh.js
deleted file mode 100644
index 3cfde2b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/asinh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/asinh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/atanh.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/atanh.js
deleted file mode 100644
index 4fb7f70..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/atanh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/atanh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/cbrt.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/cbrt.js
deleted file mode 100644
index ea8b8bb..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/cbrt.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/cbrt");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/clz32.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/clz32.js
deleted file mode 100644
index b407eea..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/clz32.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/clz32");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/cosh.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/cosh.js
deleted file mode 100644
index 1fb429e..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/cosh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/cosh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/expm1.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/expm1.js
deleted file mode 100644
index 7263979..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/expm1.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/expm1");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/fround.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/fround.js
deleted file mode 100644
index 3cc97d0..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/fround.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/fround");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/hypot.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/hypot.js
deleted file mode 100644
index 3ce6bd5..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/hypot.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/hypot");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/imul.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/imul.js
deleted file mode 100644
index 5a34abd..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/imul.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/imul");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/log10.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/log10.js
deleted file mode 100644
index f2879dc..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/log10.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/log10");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/log1p.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/log1p.js
deleted file mode 100644
index 3a0247d..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/log1p.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/log1p");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/log2.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/log2.js
deleted file mode 100644
index 908d2f6..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/log2.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/log2");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/sign.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/sign.js
deleted file mode 100644
index 9e8d539..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/sign.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/sign");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/sinh.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/sinh.js
deleted file mode 100644
index 5cc1b55..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/sinh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/sinh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/tanh.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/tanh.js
deleted file mode 100644
index f3859e7..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/tanh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/tanh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/math/trunc.js b/node_modules/@babel/runtime-corejs3/core-js-stable/math/trunc.js
deleted file mode 100644
index 93bbcff..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/math/trunc.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/math/trunc");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/number/epsilon.js b/node_modules/@babel/runtime-corejs3/core-js-stable/number/epsilon.js
deleted file mode 100644
index dfb1c3b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/number/epsilon.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/number/epsilon");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-finite.js b/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-finite.js
deleted file mode 100644
index d65bd35..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-finite.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/number/is-finite");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-integer.js b/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-integer.js
deleted file mode 100644
index fc11947..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-integer.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/number/is-integer");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-nan.js b/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-nan.js
deleted file mode 100644
index a9939a4..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-nan.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/number/is-nan");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-safe-integer.js b/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-safe-integer.js
deleted file mode 100644
index a333254..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/number/is-safe-integer.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/number/is-safe-integer");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/number/max-safe-integer.js b/node_modules/@babel/runtime-corejs3/core-js-stable/number/max-safe-integer.js
deleted file mode 100644
index 855bd4c..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/number/max-safe-integer.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/number/max-safe-integer");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/number/min-safe-integer.js b/node_modules/@babel/runtime-corejs3/core-js-stable/number/min-safe-integer.js
deleted file mode 100644
index b242906..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/number/min-safe-integer.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/number/min-safe-integer");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/number/parse-float.js b/node_modules/@babel/runtime-corejs3/core-js-stable/number/parse-float.js
deleted file mode 100644
index 9d2c7c4..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/number/parse-float.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/number/parse-float");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/number/parse-int.js b/node_modules/@babel/runtime-corejs3/core-js-stable/number/parse-int.js
deleted file mode 100644
index 54120af..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/number/parse-int.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/number/parse-int");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/assign.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/assign.js
deleted file mode 100644
index 5e3e128..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/assign.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/assign");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/create.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/create.js
deleted file mode 100644
index b0d00d3..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/create.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/create");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js
deleted file mode 100644
index 60d7637..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-properties.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/define-properties");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js
deleted file mode 100644
index bdf30c6..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/define-property.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/define-property");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/entries.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/entries.js
deleted file mode 100644
index 0b0b76c..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/entries.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/entries");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/freeze.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/freeze.js
deleted file mode 100644
index abbc7d6..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/freeze.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/freeze");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/from-entries.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/from-entries.js
deleted file mode 100644
index 01164ef..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/from-entries.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/from-entries");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js
deleted file mode 100644
index c2ed98b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/get-own-property-descriptor");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js
deleted file mode 100644
index 8f0fc95..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/get-own-property-descriptors");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-names.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-names.js
deleted file mode 100644
index 0807d5d..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-names.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/get-own-property-names");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js
deleted file mode 100644
index bf45955..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/get-own-property-symbols");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-prototype-of.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-prototype-of.js
deleted file mode 100644
index f22b095..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/get-prototype-of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/get-prototype-of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/is-extensible.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/is-extensible.js
deleted file mode 100644
index 2cafb77..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/is-extensible.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/is-extensible");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/is-frozen.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/is-frozen.js
deleted file mode 100644
index 8067ae7..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/is-frozen.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/is-frozen");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/is-sealed.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/is-sealed.js
deleted file mode 100644
index fb94859..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/is-sealed.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/is-sealed");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/is.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/is.js
deleted file mode 100644
index 056f817..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/is.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/is");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js
deleted file mode 100644
index 40bccaf..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/keys.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/keys");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/prevent-extensions.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/prevent-extensions.js
deleted file mode 100644
index ae6d21d..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/prevent-extensions.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/prevent-extensions");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/seal.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/seal.js
deleted file mode 100644
index faa2d34..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/seal.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/seal");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/set-prototype-of.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/set-prototype-of.js
deleted file mode 100644
index 28a8b6a..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/set-prototype-of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/set-prototype-of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/object/values.js b/node_modules/@babel/runtime-corejs3/core-js-stable/object/values.js
deleted file mode 100644
index 3ccfa47..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/object/values.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/object/values");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/parse-float.js b/node_modules/@babel/runtime-corejs3/core-js-stable/parse-float.js
deleted file mode 100644
index 994dc6a..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/parse-float.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/parse-float");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js b/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js
deleted file mode 100644
index c9d10ed..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/parse-int.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/parse-int");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/promise.js b/node_modules/@babel/runtime-corejs3/core-js-stable/promise.js
deleted file mode 100644
index 32f1fab..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/promise.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/promise");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/queue-microtask.js b/node_modules/@babel/runtime-corejs3/core-js-stable/queue-microtask.js
deleted file mode 100644
index 743d81b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/queue-microtask.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/queue-microtask");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/apply.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/apply.js
deleted file mode 100644
index 3ef9afb..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/apply.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/apply");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js
deleted file mode 100644
index 24d1ac3..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/construct.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/construct");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/define-property.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/define-property.js
deleted file mode 100644
index 92a1f7a..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/define-property.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/define-property");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/delete-property.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/delete-property.js
deleted file mode 100644
index 21bb710..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/delete-property.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/delete-property");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/get-own-property-descriptor.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/get-own-property-descriptor.js
deleted file mode 100644
index def452d..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/get-own-property-descriptor.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/get-own-property-descriptor");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/get-prototype-of.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/get-prototype-of.js
deleted file mode 100644
index 0219996..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/get-prototype-of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/get-prototype-of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/get.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/get.js
deleted file mode 100644
index c4c91de..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/get.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/get");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/has.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/has.js
deleted file mode 100644
index 66082e9..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/has.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/has");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/is-extensible.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/is-extensible.js
deleted file mode 100644
index 93446d0..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/is-extensible.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/is-extensible");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/own-keys.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/own-keys.js
deleted file mode 100644
index 443b23b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/own-keys.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/own-keys");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/prevent-extensions.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/prevent-extensions.js
deleted file mode 100644
index 77c69d9..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/prevent-extensions.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/prevent-extensions");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/set-prototype-of.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/set-prototype-of.js
deleted file mode 100644
index bb0cdff..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/set-prototype-of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/set-prototype-of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/set.js b/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/set.js
deleted file mode 100644
index 857bdc9..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/reflect/set.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/reflect/set");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/set-immediate.js b/node_modules/@babel/runtime-corejs3/core-js-stable/set-immediate.js
deleted file mode 100644
index f941542..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/set-immediate.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/set-immediate");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/set-interval.js b/node_modules/@babel/runtime-corejs3/core-js-stable/set-interval.js
deleted file mode 100644
index 0e41ff5..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/set-interval.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/set-interval");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js b/node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js
deleted file mode 100644
index 401edca..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/set-timeout.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/set-timeout");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/set.js b/node_modules/@babel/runtime-corejs3/core-js-stable/set.js
deleted file mode 100644
index 21ef670..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/set.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/set");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/string/from-code-point.js b/node_modules/@babel/runtime-corejs3/core-js-stable/string/from-code-point.js
deleted file mode 100644
index f1d0c10..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/string/from-code-point.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/string/from-code-point");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/string/raw.js b/node_modules/@babel/runtime-corejs3/core-js-stable/string/raw.js
deleted file mode 100644
index 894439a..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/string/raw.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/string/raw");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js
deleted file mode 100644
index 060d2c8..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/async-iterator.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/async-iterator.js
deleted file mode 100644
index 2794af4..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/async-iterator.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/async-iterator");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/for.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/for.js
deleted file mode 100644
index e7cbdb2..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/for.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/for");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/has-instance.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/has-instance.js
deleted file mode 100644
index e12df6e..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/has-instance.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/has-instance");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/is-concat-spreadable.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/is-concat-spreadable.js
deleted file mode 100644
index c82b4aa..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/is-concat-spreadable.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/is-concat-spreadable");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/iterator.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/iterator.js
deleted file mode 100644
index a1fbb82..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/iterator.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/iterator");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/key-for.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/key-for.js
deleted file mode 100644
index 9a061e1..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/key-for.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/key-for");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/match.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/match.js
deleted file mode 100644
index 8491342..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/match.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/match");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/replace.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/replace.js
deleted file mode 100644
index 1e00079..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/replace.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/replace");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/search.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/search.js
deleted file mode 100644
index 439812c..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/search.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/search");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/species.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/species.js
deleted file mode 100644
index 5aa5fac..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/species.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/species");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/split.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/split.js
deleted file mode 100644
index 3d19398..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/split.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/split");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/to-primitive.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/to-primitive.js
deleted file mode 100644
index 2751de4..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/to-primitive.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/to-primitive");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/to-string-tag.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/to-string-tag.js
deleted file mode 100644
index 6132896..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/to-string-tag.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/to-string-tag");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/unscopables.js b/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/unscopables.js
deleted file mode 100644
index b84e75e..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/symbol/unscopables.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/symbol/unscopables");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/url-search-params.js b/node_modules/@babel/runtime-corejs3/core-js-stable/url-search-params.js
deleted file mode 100644
index 4147a64..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/url-search-params.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/url-search-params");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/url.js b/node_modules/@babel/runtime-corejs3/core-js-stable/url.js
deleted file mode 100644
index 8d302fc..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/url.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/url");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js b/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js
deleted file mode 100644
index d6715bb..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/weak-map.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/weak-map");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js-stable/weak-set.js b/node_modules/@babel/runtime-corejs3/core-js-stable/weak-set.js
deleted file mode 100644
index d73724c..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js-stable/weak-set.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/stable/weak-set");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/aggregate-error.js b/node_modules/@babel/runtime-corejs3/core-js/aggregate-error.js
deleted file mode 100644
index 8adca0a..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/aggregate-error.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/aggregate-error");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/array/from.js b/node_modules/@babel/runtime-corejs3/core-js/array/from.js
deleted file mode 100644
index cfba3a9..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/array/from.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/array/from");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/array/is-array.js b/node_modules/@babel/runtime-corejs3/core-js/array/is-array.js
deleted file mode 100644
index b1d8071..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/array/is-array.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/array/is-array");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/array/of.js b/node_modules/@babel/runtime-corejs3/core-js/array/of.js
deleted file mode 100644
index fb8b393..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/array/of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/array/of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/clear-immediate.js b/node_modules/@babel/runtime-corejs3/core-js/clear-immediate.js
deleted file mode 100644
index a7db03b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/clear-immediate.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/clear-immediate");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/composite-key.js b/node_modules/@babel/runtime-corejs3/core-js/composite-key.js
deleted file mode 100644
index 13af38a..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/composite-key.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/composite-key");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/composite-symbol.js b/node_modules/@babel/runtime-corejs3/core-js/composite-symbol.js
deleted file mode 100644
index 1e1d420..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/composite-symbol.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/composite-symbol");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/date/now.js b/node_modules/@babel/runtime-corejs3/core-js/date/now.js
deleted file mode 100644
index 65e4acd..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/date/now.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/date/now");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js b/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js
deleted file mode 100644
index 16a1cfe..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/get-iterator-method.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/get-iterator-method");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/get-iterator.js b/node_modules/@babel/runtime-corejs3/core-js/get-iterator.js
deleted file mode 100644
index efb412e..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/get-iterator.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/get-iterator");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/global-this.js b/node_modules/@babel/runtime-corejs3/core-js/global-this.js
deleted file mode 100644
index 37f697a..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/global-this.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/global-this");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/at.js b/node_modules/@babel/runtime-corejs3/core-js/instance/at.js
deleted file mode 100644
index b997e2a..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/at.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/at");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/bind.js b/node_modules/@babel/runtime-corejs3/core-js/instance/bind.js
deleted file mode 100644
index c22c3ac..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/bind.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/bind");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/code-point-at.js b/node_modules/@babel/runtime-corejs3/core-js/instance/code-point-at.js
deleted file mode 100644
index 9662545..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/code-point-at.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/code-point-at");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/code-points.js b/node_modules/@babel/runtime-corejs3/core-js/instance/code-points.js
deleted file mode 100644
index c356dc2..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/code-points.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/code-points");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/concat.js b/node_modules/@babel/runtime-corejs3/core-js/instance/concat.js
deleted file mode 100644
index 9c78c5b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/concat.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/concat");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/copy-within.js b/node_modules/@babel/runtime-corejs3/core-js/instance/copy-within.js
deleted file mode 100644
index f3be320..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/copy-within.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/copy-within");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/ends-with.js b/node_modules/@babel/runtime-corejs3/core-js/instance/ends-with.js
deleted file mode 100644
index 98cf0cc..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/ends-with.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/ends-with");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/entries.js b/node_modules/@babel/runtime-corejs3/core-js/instance/entries.js
deleted file mode 100644
index 32864e2..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/entries.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/entries");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/every.js b/node_modules/@babel/runtime-corejs3/core-js/instance/every.js
deleted file mode 100644
index 4663214..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/every.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/every");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/fill.js b/node_modules/@babel/runtime-corejs3/core-js/instance/fill.js
deleted file mode 100644
index 69eba3d..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/fill.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/fill");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/filter.js b/node_modules/@babel/runtime-corejs3/core-js/instance/filter.js
deleted file mode 100644
index e147151..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/filter.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/filter");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/find-index.js b/node_modules/@babel/runtime-corejs3/core-js/instance/find-index.js
deleted file mode 100644
index fccbd05..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/find-index.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/find-index");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/find.js b/node_modules/@babel/runtime-corejs3/core-js/instance/find.js
deleted file mode 100644
index ae62982..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/find.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/find");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/flags.js b/node_modules/@babel/runtime-corejs3/core-js/instance/flags.js
deleted file mode 100644
index 984243e..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/flags.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/flags");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/flat-map.js b/node_modules/@babel/runtime-corejs3/core-js/instance/flat-map.js
deleted file mode 100644
index 8bc910d..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/flat-map.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/flat-map");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/flat.js b/node_modules/@babel/runtime-corejs3/core-js/instance/flat.js
deleted file mode 100644
index 71143f9..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/flat.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/flat");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/for-each.js b/node_modules/@babel/runtime-corejs3/core-js/instance/for-each.js
deleted file mode 100644
index 520c6ea..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/for-each.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/for-each");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/includes.js b/node_modules/@babel/runtime-corejs3/core-js/instance/includes.js
deleted file mode 100644
index 4a8a5bd..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/includes.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/includes");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/index-of.js b/node_modules/@babel/runtime-corejs3/core-js/instance/index-of.js
deleted file mode 100644
index 68a1200..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/index-of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/index-of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/keys.js b/node_modules/@babel/runtime-corejs3/core-js/instance/keys.js
deleted file mode 100644
index 704da3f..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/keys.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/keys");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/last-index-of.js b/node_modules/@babel/runtime-corejs3/core-js/instance/last-index-of.js
deleted file mode 100644
index 1552e76..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/last-index-of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/last-index-of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/map.js b/node_modules/@babel/runtime-corejs3/core-js/instance/map.js
deleted file mode 100644
index f7cc5e0..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/map.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/map");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/match-all.js b/node_modules/@babel/runtime-corejs3/core-js/instance/match-all.js
deleted file mode 100644
index d69fb2f..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/match-all.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/match-all");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/pad-end.js b/node_modules/@babel/runtime-corejs3/core-js/instance/pad-end.js
deleted file mode 100644
index d2ea8bb..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/pad-end.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/pad-end");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/pad-start.js b/node_modules/@babel/runtime-corejs3/core-js/instance/pad-start.js
deleted file mode 100644
index 8ad02c0..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/pad-start.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/pad-start");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/reduce-right.js b/node_modules/@babel/runtime-corejs3/core-js/instance/reduce-right.js
deleted file mode 100644
index 8d15c13..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/reduce-right.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/reduce-right");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/reduce.js b/node_modules/@babel/runtime-corejs3/core-js/instance/reduce.js
deleted file mode 100644
index 86e5ba6..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/reduce.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/reduce");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/repeat.js b/node_modules/@babel/runtime-corejs3/core-js/instance/repeat.js
deleted file mode 100644
index 9671960..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/repeat.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/repeat");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/replace-all.js b/node_modules/@babel/runtime-corejs3/core-js/instance/replace-all.js
deleted file mode 100644
index 61aae15..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/replace-all.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/replace-all");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/reverse.js b/node_modules/@babel/runtime-corejs3/core-js/instance/reverse.js
deleted file mode 100644
index 93d6f41..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/reverse.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/reverse");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/slice.js b/node_modules/@babel/runtime-corejs3/core-js/instance/slice.js
deleted file mode 100644
index b09f830..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/slice.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/slice");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/some.js b/node_modules/@babel/runtime-corejs3/core-js/instance/some.js
deleted file mode 100644
index 2492d93..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/some.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/some");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/sort.js b/node_modules/@babel/runtime-corejs3/core-js/instance/sort.js
deleted file mode 100644
index b2446c8..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/sort.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/sort");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/splice.js b/node_modules/@babel/runtime-corejs3/core-js/instance/splice.js
deleted file mode 100644
index a11dd12..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/splice.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/splice");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/starts-with.js b/node_modules/@babel/runtime-corejs3/core-js/instance/starts-with.js
deleted file mode 100644
index 207e095..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/starts-with.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/starts-with");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/trim-end.js b/node_modules/@babel/runtime-corejs3/core-js/instance/trim-end.js
deleted file mode 100644
index 0168e67..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/trim-end.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/trim-end");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/trim-left.js b/node_modules/@babel/runtime-corejs3/core-js/instance/trim-left.js
deleted file mode 100644
index 08c5ddb..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/trim-left.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/trim-left");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/trim-right.js b/node_modules/@babel/runtime-corejs3/core-js/instance/trim-right.js
deleted file mode 100644
index db70121..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/trim-right.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/trim-right");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/trim-start.js b/node_modules/@babel/runtime-corejs3/core-js/instance/trim-start.js
deleted file mode 100644
index 9bd4e4a..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/trim-start.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/trim-start");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/trim.js b/node_modules/@babel/runtime-corejs3/core-js/instance/trim.js
deleted file mode 100644
index 3fc0269..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/trim.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/trim");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/instance/values.js b/node_modules/@babel/runtime-corejs3/core-js/instance/values.js
deleted file mode 100644
index 9a8607d..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/instance/values.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/instance/values");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/is-iterable.js b/node_modules/@babel/runtime-corejs3/core-js/is-iterable.js
deleted file mode 100644
index b2323fe..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/is-iterable.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/is-iterable");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/json/stringify.js b/node_modules/@babel/runtime-corejs3/core-js/json/stringify.js
deleted file mode 100644
index 4f20a95..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/json/stringify.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/json/stringify");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/map.js b/node_modules/@babel/runtime-corejs3/core-js/map.js
deleted file mode 100644
index 9dc3dd1..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/map.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/map");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/acosh.js b/node_modules/@babel/runtime-corejs3/core-js/math/acosh.js
deleted file mode 100644
index 630dfa3..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/acosh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/acosh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/asinh.js b/node_modules/@babel/runtime-corejs3/core-js/math/asinh.js
deleted file mode 100644
index 58c55cd..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/asinh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/asinh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/atanh.js b/node_modules/@babel/runtime-corejs3/core-js/math/atanh.js
deleted file mode 100644
index 1f85a68..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/atanh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/atanh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/cbrt.js b/node_modules/@babel/runtime-corejs3/core-js/math/cbrt.js
deleted file mode 100644
index bcdfa5c..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/cbrt.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/cbrt");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/clamp.js b/node_modules/@babel/runtime-corejs3/core-js/math/clamp.js
deleted file mode 100644
index 6517db9..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/clamp.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/clamp");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/clz32.js b/node_modules/@babel/runtime-corejs3/core-js/math/clz32.js
deleted file mode 100644
index 39fc6a2..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/clz32.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/clz32");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/cosh.js b/node_modules/@babel/runtime-corejs3/core-js/math/cosh.js
deleted file mode 100644
index 0471ef5..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/cosh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/cosh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/deg-per-rad.js b/node_modules/@babel/runtime-corejs3/core-js/math/deg-per-rad.js
deleted file mode 100644
index bb1717b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/deg-per-rad.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/deg-per-rad");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/degrees.js b/node_modules/@babel/runtime-corejs3/core-js/math/degrees.js
deleted file mode 100644
index 56ee32a..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/degrees.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/degrees");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/expm1.js b/node_modules/@babel/runtime-corejs3/core-js/math/expm1.js
deleted file mode 100644
index 3dda5cf..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/expm1.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/expm1");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/fround.js b/node_modules/@babel/runtime-corejs3/core-js/math/fround.js
deleted file mode 100644
index 2e7bb79..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/fround.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/fround");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/fscale.js b/node_modules/@babel/runtime-corejs3/core-js/math/fscale.js
deleted file mode 100644
index 6e4deff..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/fscale.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/fscale");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/hypot.js b/node_modules/@babel/runtime-corejs3/core-js/math/hypot.js
deleted file mode 100644
index 1eb1f88..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/hypot.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/hypot");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/iaddh.js b/node_modules/@babel/runtime-corejs3/core-js/math/iaddh.js
deleted file mode 100644
index ae8cb2b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/iaddh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/iaddh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/imul.js b/node_modules/@babel/runtime-corejs3/core-js/math/imul.js
deleted file mode 100644
index c0577a7..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/imul.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/imul");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/imulh.js b/node_modules/@babel/runtime-corejs3/core-js/math/imulh.js
deleted file mode 100644
index ae2226a..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/imulh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/imulh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/isubh.js b/node_modules/@babel/runtime-corejs3/core-js/math/isubh.js
deleted file mode 100644
index 7f5f30b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/isubh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/isubh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/log10.js b/node_modules/@babel/runtime-corejs3/core-js/math/log10.js
deleted file mode 100644
index d9aaf59..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/log10.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/log10");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/log1p.js b/node_modules/@babel/runtime-corejs3/core-js/math/log1p.js
deleted file mode 100644
index 19be200..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/log1p.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/log1p");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/log2.js b/node_modules/@babel/runtime-corejs3/core-js/math/log2.js
deleted file mode 100644
index b23be53..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/log2.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/log2");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/rad-per-deg.js b/node_modules/@babel/runtime-corejs3/core-js/math/rad-per-deg.js
deleted file mode 100644
index f702240..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/rad-per-deg.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/rad-per-deg");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/radians.js b/node_modules/@babel/runtime-corejs3/core-js/math/radians.js
deleted file mode 100644
index e81c8e0..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/radians.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/radians");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/scale.js b/node_modules/@babel/runtime-corejs3/core-js/math/scale.js
deleted file mode 100644
index 997a9e8..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/scale.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/scale");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/seeded-prng.js b/node_modules/@babel/runtime-corejs3/core-js/math/seeded-prng.js
deleted file mode 100644
index 0ee49f6..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/seeded-prng.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/seeded-prng");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/sign.js b/node_modules/@babel/runtime-corejs3/core-js/math/sign.js
deleted file mode 100644
index a077429..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/sign.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/sign");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/signbit.js b/node_modules/@babel/runtime-corejs3/core-js/math/signbit.js
deleted file mode 100644
index fe0d3bf..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/signbit.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/signbit");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/sinh.js b/node_modules/@babel/runtime-corejs3/core-js/math/sinh.js
deleted file mode 100644
index 5d04b70..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/sinh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/sinh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/tanh.js b/node_modules/@babel/runtime-corejs3/core-js/math/tanh.js
deleted file mode 100644
index ac400f4..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/tanh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/tanh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/trunc.js b/node_modules/@babel/runtime-corejs3/core-js/math/trunc.js
deleted file mode 100644
index cdeb996..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/trunc.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/trunc");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/math/umulh.js b/node_modules/@babel/runtime-corejs3/core-js/math/umulh.js
deleted file mode 100644
index af11f0b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/math/umulh.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/math/umulh");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/number/epsilon.js b/node_modules/@babel/runtime-corejs3/core-js/number/epsilon.js
deleted file mode 100644
index 994cd88..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/number/epsilon.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/number/epsilon");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/number/from-string.js b/node_modules/@babel/runtime-corejs3/core-js/number/from-string.js
deleted file mode 100644
index d81c011..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/number/from-string.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/number/from-string");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/number/is-finite.js b/node_modules/@babel/runtime-corejs3/core-js/number/is-finite.js
deleted file mode 100644
index 3de1455..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/number/is-finite.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/number/is-finite");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/number/is-integer.js b/node_modules/@babel/runtime-corejs3/core-js/number/is-integer.js
deleted file mode 100644
index 4023e4e..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/number/is-integer.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/number/is-integer");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/number/is-nan.js b/node_modules/@babel/runtime-corejs3/core-js/number/is-nan.js
deleted file mode 100644
index 7a38bc3..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/number/is-nan.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/number/is-nan");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/number/is-safe-integer.js b/node_modules/@babel/runtime-corejs3/core-js/number/is-safe-integer.js
deleted file mode 100644
index 35dd12b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/number/is-safe-integer.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/number/is-safe-integer");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/number/max-safe-integer.js b/node_modules/@babel/runtime-corejs3/core-js/number/max-safe-integer.js
deleted file mode 100644
index 351d645..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/number/max-safe-integer.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/number/max-safe-integer");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/number/min-safe-integer.js b/node_modules/@babel/runtime-corejs3/core-js/number/min-safe-integer.js
deleted file mode 100644
index e2c6f22..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/number/min-safe-integer.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/number/min-safe-integer");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/number/parse-float.js b/node_modules/@babel/runtime-corejs3/core-js/number/parse-float.js
deleted file mode 100644
index c468d11..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/number/parse-float.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/number/parse-float");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/number/parse-int.js b/node_modules/@babel/runtime-corejs3/core-js/number/parse-int.js
deleted file mode 100644
index e694ff0..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/number/parse-int.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/number/parse-int");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/assign.js b/node_modules/@babel/runtime-corejs3/core-js/object/assign.js
deleted file mode 100644
index 6c9b32f..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/assign.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/assign");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/create.js b/node_modules/@babel/runtime-corejs3/core-js/object/create.js
deleted file mode 100644
index 582da6e..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/create.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/create");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/define-properties.js b/node_modules/@babel/runtime-corejs3/core-js/object/define-properties.js
deleted file mode 100644
index f326118..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/define-properties.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/define-properties");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/define-property.js b/node_modules/@babel/runtime-corejs3/core-js/object/define-property.js
deleted file mode 100644
index 9aa5e2b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/define-property.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/define-property");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/entries.js b/node_modules/@babel/runtime-corejs3/core-js/object/entries.js
deleted file mode 100644
index 3cefbcf..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/entries.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/entries");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/freeze.js b/node_modules/@babel/runtime-corejs3/core-js/object/freeze.js
deleted file mode 100644
index 9c93002..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/freeze.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/freeze");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/from-entries.js b/node_modules/@babel/runtime-corejs3/core-js/object/from-entries.js
deleted file mode 100644
index 7000f10..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/from-entries.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/from-entries");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-descriptor.js b/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-descriptor.js
deleted file mode 100644
index 8a04870..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-descriptor.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/get-own-property-descriptor");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-descriptors.js b/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-descriptors.js
deleted file mode 100644
index d6a59e6..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-descriptors.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/get-own-property-descriptors");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-names.js b/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-names.js
deleted file mode 100644
index b825da0..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-names.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/get-own-property-names");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-symbols.js b/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-symbols.js
deleted file mode 100644
index c998127..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/get-own-property-symbols.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/get-own-property-symbols");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/get-prototype-of.js b/node_modules/@babel/runtime-corejs3/core-js/object/get-prototype-of.js
deleted file mode 100644
index 97d61f1..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/get-prototype-of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/get-prototype-of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/is-extensible.js b/node_modules/@babel/runtime-corejs3/core-js/object/is-extensible.js
deleted file mode 100644
index 2be029c..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/is-extensible.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/is-extensible");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/is-frozen.js b/node_modules/@babel/runtime-corejs3/core-js/object/is-frozen.js
deleted file mode 100644
index 0c4906f..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/is-frozen.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/is-frozen");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/is-sealed.js b/node_modules/@babel/runtime-corejs3/core-js/object/is-sealed.js
deleted file mode 100644
index d343920..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/is-sealed.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/is-sealed");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/is.js b/node_modules/@babel/runtime-corejs3/core-js/object/is.js
deleted file mode 100644
index 8a764ae..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/is.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/is");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/keys.js b/node_modules/@babel/runtime-corejs3/core-js/object/keys.js
deleted file mode 100644
index 8121852..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/keys.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/keys");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/prevent-extensions.js b/node_modules/@babel/runtime-corejs3/core-js/object/prevent-extensions.js
deleted file mode 100644
index ad55d7b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/prevent-extensions.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/prevent-extensions");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/seal.js b/node_modules/@babel/runtime-corejs3/core-js/object/seal.js
deleted file mode 100644
index f98205e..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/seal.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/seal");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/set-prototype-of.js b/node_modules/@babel/runtime-corejs3/core-js/object/set-prototype-of.js
deleted file mode 100644
index 3535dbc..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/set-prototype-of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/set-prototype-of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/object/values.js b/node_modules/@babel/runtime-corejs3/core-js/object/values.js
deleted file mode 100644
index e192401..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/object/values.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/object/values");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/observable.js b/node_modules/@babel/runtime-corejs3/core-js/observable.js
deleted file mode 100644
index 9a0cd33..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/observable.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/observable");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/parse-float.js b/node_modules/@babel/runtime-corejs3/core-js/parse-float.js
deleted file mode 100644
index d6ab95d..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/parse-float.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/parse-float");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/parse-int.js b/node_modules/@babel/runtime-corejs3/core-js/parse-int.js
deleted file mode 100644
index 73ed9db..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/parse-int.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/parse-int");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/promise.js b/node_modules/@babel/runtime-corejs3/core-js/promise.js
deleted file mode 100644
index 46b8ddd..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/promise.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/promise");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/queue-microtask.js b/node_modules/@babel/runtime-corejs3/core-js/queue-microtask.js
deleted file mode 100644
index 131d625..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/queue-microtask.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/queue-microtask");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/apply.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/apply.js
deleted file mode 100644
index db86be6..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/apply.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/apply");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/construct.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/construct.js
deleted file mode 100644
index 3e7f8f7..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/construct.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/construct");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/define-metadata.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/define-metadata.js
deleted file mode 100644
index 0eadd23..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/define-metadata.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/define-metadata");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/define-property.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/define-property.js
deleted file mode 100644
index 9665eeb..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/define-property.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/define-property");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/delete-metadata.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/delete-metadata.js
deleted file mode 100644
index d65f6b4..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/delete-metadata.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/delete-metadata");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/delete-property.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/delete-property.js
deleted file mode 100644
index c1db05f..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/delete-property.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/delete-property");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/get-metadata-keys.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/get-metadata-keys.js
deleted file mode 100644
index 179a701..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/get-metadata-keys.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/get-metadata-keys");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/get-metadata.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/get-metadata.js
deleted file mode 100644
index d1c1f7f..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/get-metadata.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/get-metadata");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/get-own-metadata-keys.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/get-own-metadata-keys.js
deleted file mode 100644
index 8061b75..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/get-own-metadata-keys.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/get-own-metadata-keys");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/get-own-metadata.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/get-own-metadata.js
deleted file mode 100644
index c9c1345..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/get-own-metadata.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/get-own-metadata");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/get-own-property-descriptor.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/get-own-property-descriptor.js
deleted file mode 100644
index 19634a7..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/get-own-property-descriptor.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/get-own-property-descriptor");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/get-prototype-of.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/get-prototype-of.js
deleted file mode 100644
index 6499584..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/get-prototype-of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/get-prototype-of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/get.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/get.js
deleted file mode 100644
index f123bfc..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/get.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/get");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/has-metadata.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/has-metadata.js
deleted file mode 100644
index 28e8758..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/has-metadata.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/has-metadata");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/has-own-metadata.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/has-own-metadata.js
deleted file mode 100644
index d14f150..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/has-own-metadata.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/has-own-metadata");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/has.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/has.js
deleted file mode 100644
index 66072e0..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/has.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/has");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/is-extensible.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/is-extensible.js
deleted file mode 100644
index f358991..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/is-extensible.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/is-extensible");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/metadata.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/metadata.js
deleted file mode 100644
index 5d3b28c..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/metadata.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/metadata");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/own-keys.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/own-keys.js
deleted file mode 100644
index 703fb6e..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/own-keys.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/own-keys");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/prevent-extensions.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/prevent-extensions.js
deleted file mode 100644
index 35f54e5..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/prevent-extensions.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/prevent-extensions");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/set-prototype-of.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/set-prototype-of.js
deleted file mode 100644
index b8e09ef..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/set-prototype-of.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/set-prototype-of");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/reflect/set.js b/node_modules/@babel/runtime-corejs3/core-js/reflect/set.js
deleted file mode 100644
index 0bd4a84..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/reflect/set.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/reflect/set");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/set-immediate.js b/node_modules/@babel/runtime-corejs3/core-js/set-immediate.js
deleted file mode 100644
index d41ffb1..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/set-immediate.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/set-immediate");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/set-interval.js b/node_modules/@babel/runtime-corejs3/core-js/set-interval.js
deleted file mode 100644
index 091f3a9..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/set-interval.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/set-interval");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/set-timeout.js b/node_modules/@babel/runtime-corejs3/core-js/set-timeout.js
deleted file mode 100644
index 3938f30..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/set-timeout.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/set-timeout");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/set.js b/node_modules/@babel/runtime-corejs3/core-js/set.js
deleted file mode 100644
index 20d7679..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/set.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/set");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/string/from-code-point.js b/node_modules/@babel/runtime-corejs3/core-js/string/from-code-point.js
deleted file mode 100644
index 2fc0d7f..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/string/from-code-point.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/string/from-code-point");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/string/raw.js b/node_modules/@babel/runtime-corejs3/core-js/string/raw.js
deleted file mode 100644
index 6f6af11..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/string/raw.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/string/raw");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol.js b/node_modules/@babel/runtime-corejs3/core-js/symbol.js
deleted file mode 100644
index ded5c62..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/async-iterator.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/async-iterator.js
deleted file mode 100644
index 0e3012e..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/async-iterator.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/async-iterator");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/dispose.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/dispose.js
deleted file mode 100644
index cf5db36..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/dispose.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/dispose");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/for.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/for.js
deleted file mode 100644
index a05c72f..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/for.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/for");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/has-instance.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/has-instance.js
deleted file mode 100644
index ee6c73b..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/has-instance.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/has-instance");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/is-concat-spreadable.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/is-concat-spreadable.js
deleted file mode 100644
index ed3aec0..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/is-concat-spreadable.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/is-concat-spreadable");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/iterator.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/iterator.js
deleted file mode 100644
index 305a0c2..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/iterator.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/iterator");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/key-for.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/key-for.js
deleted file mode 100644
index 5855279..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/key-for.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/key-for");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/match.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/match.js
deleted file mode 100644
index 8cf9e94..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/match.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/match");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/observable.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/observable.js
deleted file mode 100644
index e035146..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/observable.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/observable");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/pattern-match.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/pattern-match.js
deleted file mode 100644
index 2f36f0a..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/pattern-match.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/pattern-match");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/replace.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/replace.js
deleted file mode 100644
index dcc29ca..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/replace.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/replace");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/search.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/search.js
deleted file mode 100644
index ef064ca..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/search.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/search");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/species.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/species.js
deleted file mode 100644
index c034dff..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/species.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/species");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/split.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/split.js
deleted file mode 100644
index a8414a1..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/split.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/split");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/to-primitive.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/to-primitive.js
deleted file mode 100644
index e2b9ada..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/to-primitive.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/to-primitive");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/to-string-tag.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/to-string-tag.js
deleted file mode 100644
index 238bb98..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/to-string-tag.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/to-string-tag");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/symbol/unscopables.js b/node_modules/@babel/runtime-corejs3/core-js/symbol/unscopables.js
deleted file mode 100644
index 9fe1283..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/symbol/unscopables.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/symbol/unscopables");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/url-search-params.js b/node_modules/@babel/runtime-corejs3/core-js/url-search-params.js
deleted file mode 100644
index 3fe02ce..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/url-search-params.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/url-search-params");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/url.js b/node_modules/@babel/runtime-corejs3/core-js/url.js
deleted file mode 100644
index 4b3e1f1..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/url.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/url");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/weak-map.js b/node_modules/@babel/runtime-corejs3/core-js/weak-map.js
deleted file mode 100644
index a8e96be..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/weak-map.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/weak-map");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/core-js/weak-set.js b/node_modules/@babel/runtime-corejs3/core-js/weak-set.js
deleted file mode 100644
index f512041..0000000
--- a/node_modules/@babel/runtime-corejs3/core-js/weak-set.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("core-js-pure/features/weak-set");
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/AsyncGenerator.js b/node_modules/@babel/runtime-corejs3/helpers/AsyncGenerator.js
deleted file mode 100644
index 46c0358..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/AsyncGenerator.js
+++ /dev/null
@@ -1,107 +0,0 @@
-var _Symbol$asyncIterator = require("../core-js/symbol/async-iterator");
-
-var _Symbol = require("../core-js/symbol");
-
-var _Promise = require("../core-js/promise");
-
-var AwaitValue = require("./AwaitValue");
-
-function AsyncGenerator(gen) {
-  var front, back;
-
-  function send(key, arg) {
-    return new _Promise(function (resolve, reject) {
-      var request = {
-        key: key,
-        arg: arg,
-        resolve: resolve,
-        reject: reject,
-        next: null
-      };
-
-      if (back) {
-        back = back.next = request;
-      } else {
-        front = back = request;
-        resume(key, arg);
-      }
-    });
-  }
-
-  function resume(key, arg) {
-    try {
-      var result = gen[key](arg);
-      var value = result.value;
-      var wrappedAwait = value instanceof AwaitValue;
-
-      _Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
-        if (wrappedAwait) {
-          resume(key === "return" ? "return" : "next", arg);
-          return;
-        }
-
-        settle(result.done ? "return" : "normal", arg);
-      }, function (err) {
-        resume("throw", err);
-      });
-    } catch (err) {
-      settle("throw", err);
-    }
-  }
-
-  function settle(type, value) {
-    switch (type) {
-      case "return":
-        front.resolve({
-          value: value,
-          done: true
-        });
-        break;
-
-      case "throw":
-        front.reject(value);
-        break;
-
-      default:
-        front.resolve({
-          value: value,
-          done: false
-        });
-        break;
-    }
-
-    front = front.next;
-
-    if (front) {
-      resume(front.key, front.arg);
-    } else {
-      back = null;
-    }
-  }
-
-  this._invoke = send;
-
-  if (typeof gen["return"] !== "function") {
-    this["return"] = undefined;
-  }
-}
-
-if (typeof _Symbol === "function" && _Symbol$asyncIterator) {
-  AsyncGenerator.prototype[_Symbol$asyncIterator] = function () {
-    return this;
-  };
-}
-
-AsyncGenerator.prototype.next = function (arg) {
-  return this._invoke("next", arg);
-};
-
-AsyncGenerator.prototype["throw"] = function (arg) {
-  return this._invoke("throw", arg);
-};
-
-AsyncGenerator.prototype["return"] = function (arg) {
-  return this._invoke("return", arg);
-};
-
-module.exports = AsyncGenerator;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/AwaitValue.js b/node_modules/@babel/runtime-corejs3/helpers/AwaitValue.js
deleted file mode 100644
index f9f4184..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/AwaitValue.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _AwaitValue(value) {
-  this.wrapped = value;
-}
-
-module.exports = _AwaitValue;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/applyDecoratedDescriptor.js b/node_modules/@babel/runtime-corejs3/helpers/applyDecoratedDescriptor.js
deleted file mode 100644
index 7558588..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/applyDecoratedDescriptor.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var _Object$defineProperty = require("../core-js/object/define-property");
-
-var _sliceInstanceProperty = require("../core-js/instance/slice");
-
-var _reverseInstanceProperty = require("../core-js/instance/reverse");
-
-var _reduceInstanceProperty = require("../core-js/instance/reduce");
-
-var _Object$keys = require("../core-js/object/keys");
-
-var _forEachInstanceProperty = require("../core-js/instance/for-each");
-
-function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
-  var _context, _context2, _context3;
-
-  var desc = {};
-
-  _forEachInstanceProperty(_context = _Object$keys(descriptor)).call(_context, function (key) {
-    desc[key] = descriptor[key];
-  });
-
-  desc.enumerable = !!desc.enumerable;
-  desc.configurable = !!desc.configurable;
-
-  if ('value' in desc || desc.initializer) {
-    desc.writable = true;
-  }
-
-  desc = _reduceInstanceProperty(_context2 = _reverseInstanceProperty(_context3 = _sliceInstanceProperty(decorators).call(decorators)).call(_context3)).call(_context2, function (desc, decorator) {
-    return decorator(target, property, desc) || desc;
-  }, desc);
-
-  if (context && desc.initializer !== void 0) {
-    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
-    desc.initializer = undefined;
-  }
-
-  if (desc.initializer === void 0) {
-    _Object$defineProperty(target, property, desc);
-
-    desc = null;
-  }
-
-  return desc;
-}
-
-module.exports = _applyDecoratedDescriptor;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/arrayWithHoles.js b/node_modules/@babel/runtime-corejs3/helpers/arrayWithHoles.js
deleted file mode 100644
index 4522bd5..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/arrayWithHoles.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var _Array$isArray = require("../core-js/array/is-array");
-
-function _arrayWithHoles(arr) {
-  if (_Array$isArray(arr)) return arr;
-}
-
-module.exports = _arrayWithHoles;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/arrayWithoutHoles.js b/node_modules/@babel/runtime-corejs3/helpers/arrayWithoutHoles.js
deleted file mode 100644
index 13f124c..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/arrayWithoutHoles.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var _Array$isArray = require("../core-js/array/is-array");
-
-function _arrayWithoutHoles(arr) {
-  if (_Array$isArray(arr)) {
-    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
-      arr2[i] = arr[i];
-    }
-
-    return arr2;
-  }
-}
-
-module.exports = _arrayWithoutHoles;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js b/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js
deleted file mode 100644
index 98d2949..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/assertThisInitialized.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function _assertThisInitialized(self) {
-  if (self === void 0) {
-    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
-  }
-
-  return self;
-}
-
-module.exports = _assertThisInitialized;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/asyncGeneratorDelegate.js b/node_modules/@babel/runtime-corejs3/helpers/asyncGeneratorDelegate.js
deleted file mode 100644
index 839f973..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/asyncGeneratorDelegate.js
+++ /dev/null
@@ -1,64 +0,0 @@
-var _Symbol$iterator = require("../core-js/symbol/iterator");
-
-var _Symbol = require("../core-js/symbol");
-
-var _Promise = require("../core-js/promise");
-
-function _asyncGeneratorDelegate(inner, awaitWrap) {
-  var iter = {},
-      waiting = false;
-
-  function pump(key, value) {
-    waiting = true;
-    value = new _Promise(function (resolve) {
-      resolve(inner[key](value));
-    });
-    return {
-      done: false,
-      value: awaitWrap(value)
-    };
-  }
-
-  ;
-
-  if (typeof _Symbol === "function" && _Symbol$iterator) {
-    iter[_Symbol$iterator] = function () {
-      return this;
-    };
-  }
-
-  iter.next = function (value) {
-    if (waiting) {
-      waiting = false;
-      return value;
-    }
-
-    return pump("next", value);
-  };
-
-  if (typeof inner["throw"] === "function") {
-    iter["throw"] = function (value) {
-      if (waiting) {
-        waiting = false;
-        throw value;
-      }
-
-      return pump("throw", value);
-    };
-  }
-
-  if (typeof inner["return"] === "function") {
-    iter["return"] = function (value) {
-      if (waiting) {
-        waiting = false;
-        return value;
-      }
-
-      return pump("return", value);
-    };
-  }
-
-  return iter;
-}
-
-module.exports = _asyncGeneratorDelegate;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/asyncIterator.js b/node_modules/@babel/runtime-corejs3/helpers/asyncIterator.js
deleted file mode 100644
index 1366cc6..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/asyncIterator.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var _getIteratorMethod = require("../core-js/get-iterator-method");
-
-var _Symbol$iterator = require("../core-js/symbol/iterator");
-
-var _Symbol$asyncIterator = require("../core-js/symbol/async-iterator");
-
-var _Symbol = require("../core-js/symbol");
-
-function _asyncIterator(iterable) {
-  var method;
-
-  if (typeof _Symbol !== "undefined") {
-    if (_Symbol$asyncIterator) {
-      method = iterable[_Symbol$asyncIterator];
-      if (method != null) return method.call(iterable);
-    }
-
-    if (_Symbol$iterator) {
-      method = _getIteratorMethod(iterable);
-      if (method != null) return method.call(iterable);
-    }
-  }
-
-  throw new TypeError("Object is not async iterable");
-}
-
-module.exports = _asyncIterator;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js b/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js
deleted file mode 100644
index f15531d..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/asyncToGenerator.js
+++ /dev/null
@@ -1,39 +0,0 @@
-var _Promise = require("../core-js/promise");
-
-function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
-  try {
-    var info = gen[key](arg);
-    var value = info.value;
-  } catch (error) {
-    reject(error);
-    return;
-  }
-
-  if (info.done) {
-    resolve(value);
-  } else {
-    _Promise.resolve(value).then(_next, _throw);
-  }
-}
-
-function _asyncToGenerator(fn) {
-  return function () {
-    var self = this,
-        args = arguments;
-    return new _Promise(function (resolve, reject) {
-      var gen = fn.apply(self, args);
-
-      function _next(value) {
-        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
-      }
-
-      function _throw(err) {
-        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
-      }
-
-      _next(undefined);
-    });
-  };
-}
-
-module.exports = _asyncToGenerator;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/awaitAsyncGenerator.js b/node_modules/@babel/runtime-corejs3/helpers/awaitAsyncGenerator.js
deleted file mode 100644
index 59f797a..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/awaitAsyncGenerator.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var AwaitValue = require("./AwaitValue");
-
-function _awaitAsyncGenerator(value) {
-  return new AwaitValue(value);
-}
-
-module.exports = _awaitAsyncGenerator;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js b/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js
deleted file mode 100644
index f389f2e..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classCallCheck.js
+++ /dev/null
@@ -1,7 +0,0 @@
-function _classCallCheck(instance, Constructor) {
-  if (!(instance instanceof Constructor)) {
-    throw new TypeError("Cannot call a class as a function");
-  }
-}
-
-module.exports = _classCallCheck;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classNameTDZError.js b/node_modules/@babel/runtime-corejs3/helpers/classNameTDZError.js
deleted file mode 100644
index 8c1bdf5..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classNameTDZError.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _classNameTDZError(name) {
-  throw new Error("Class \"" + name + "\" cannot be referenced in computed property keys.");
-}
-
-module.exports = _classNameTDZError;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldDestructureSet.js b/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldDestructureSet.js
deleted file mode 100644
index fab9105..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldDestructureSet.js
+++ /dev/null
@@ -1,28 +0,0 @@
-function _classPrivateFieldDestructureSet(receiver, privateMap) {
-  if (!privateMap.has(receiver)) {
-    throw new TypeError("attempted to set private field on non-instance");
-  }
-
-  var descriptor = privateMap.get(receiver);
-
-  if (descriptor.set) {
-    if (!("__destrObj" in descriptor)) {
-      descriptor.__destrObj = {
-        set value(v) {
-          descriptor.set.call(receiver, v);
-        }
-
-      };
-    }
-
-    return descriptor.__destrObj;
-  } else {
-    if (!descriptor.writable) {
-      throw new TypeError("attempted to set read only private field");
-    }
-
-    return descriptor;
-  }
-}
-
-module.exports = _classPrivateFieldDestructureSet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldGet.js b/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldGet.js
deleted file mode 100644
index 106c3cd..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldGet.js
+++ /dev/null
@@ -1,15 +0,0 @@
-function _classPrivateFieldGet(receiver, privateMap) {
-  var descriptor = privateMap.get(receiver);
-
-  if (!descriptor) {
-    throw new TypeError("attempted to get private field on non-instance");
-  }
-
-  if (descriptor.get) {
-    return descriptor.get.call(receiver);
-  }
-
-  return descriptor.value;
-}
-
-module.exports = _classPrivateFieldGet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldLooseBase.js b/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldLooseBase.js
deleted file mode 100644
index 64ed79d..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldLooseBase.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function _classPrivateFieldBase(receiver, privateKey) {
-  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
-    throw new TypeError("attempted to use private field on non-instance");
-  }
-
-  return receiver;
-}
-
-module.exports = _classPrivateFieldBase;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldLooseKey.js b/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldLooseKey.js
deleted file mode 100644
index a1a6417..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldLooseKey.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var id = 0;
-
-function _classPrivateFieldKey(name) {
-  return "__private_" + id++ + "_" + name;
-}
-
-module.exports = _classPrivateFieldKey;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldSet.js b/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldSet.js
deleted file mode 100644
index c92f97a..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classPrivateFieldSet.js
+++ /dev/null
@@ -1,21 +0,0 @@
-function _classPrivateFieldSet(receiver, privateMap, value) {
-  var descriptor = privateMap.get(receiver);
-
-  if (!descriptor) {
-    throw new TypeError("attempted to set private field on non-instance");
-  }
-
-  if (descriptor.set) {
-    descriptor.set.call(receiver, value);
-  } else {
-    if (!descriptor.writable) {
-      throw new TypeError("attempted to set read only private field");
-    }
-
-    descriptor.value = value;
-  }
-
-  return value;
-}
-
-module.exports = _classPrivateFieldSet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classPrivateMethodGet.js b/node_modules/@babel/runtime-corejs3/helpers/classPrivateMethodGet.js
deleted file mode 100644
index a3432b9..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classPrivateMethodGet.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function _classPrivateMethodGet(receiver, privateSet, fn) {
-  if (!privateSet.has(receiver)) {
-    throw new TypeError("attempted to get private field on non-instance");
-  }
-
-  return fn;
-}
-
-module.exports = _classPrivateMethodGet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classPrivateMethodSet.js b/node_modules/@babel/runtime-corejs3/helpers/classPrivateMethodSet.js
deleted file mode 100644
index 3847284..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classPrivateMethodSet.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _classPrivateMethodSet() {
-  throw new TypeError("attempted to reassign private method");
-}
-
-module.exports = _classPrivateMethodSet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classStaticPrivateFieldSpecGet.js b/node_modules/@babel/runtime-corejs3/helpers/classStaticPrivateFieldSpecGet.js
deleted file mode 100644
index c2b6766..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classStaticPrivateFieldSpecGet.js
+++ /dev/null
@@ -1,13 +0,0 @@
-function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {
-  if (receiver !== classConstructor) {
-    throw new TypeError("Private static access of wrong provenance");
-  }
-
-  if (descriptor.get) {
-    return descriptor.get.call(receiver);
-  }
-
-  return descriptor.value;
-}
-
-module.exports = _classStaticPrivateFieldSpecGet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classStaticPrivateFieldSpecSet.js b/node_modules/@babel/runtime-corejs3/helpers/classStaticPrivateFieldSpecSet.js
deleted file mode 100644
index 8799fbb..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classStaticPrivateFieldSpecSet.js
+++ /dev/null
@@ -1,19 +0,0 @@
-function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {
-  if (receiver !== classConstructor) {
-    throw new TypeError("Private static access of wrong provenance");
-  }
-
-  if (descriptor.set) {
-    descriptor.set.call(receiver, value);
-  } else {
-    if (!descriptor.writable) {
-      throw new TypeError("attempted to set read only private field");
-    }
-
-    descriptor.value = value;
-  }
-
-  return value;
-}
-
-module.exports = _classStaticPrivateFieldSpecSet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classStaticPrivateMethodGet.js b/node_modules/@babel/runtime-corejs3/helpers/classStaticPrivateMethodGet.js
deleted file mode 100644
index f9b0d00..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classStaticPrivateMethodGet.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function _classStaticPrivateMethodGet(receiver, classConstructor, method) {
-  if (receiver !== classConstructor) {
-    throw new TypeError("Private static access of wrong provenance");
-  }
-
-  return method;
-}
-
-module.exports = _classStaticPrivateMethodGet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/classStaticPrivateMethodSet.js b/node_modules/@babel/runtime-corejs3/helpers/classStaticPrivateMethodSet.js
deleted file mode 100644
index 89042da..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/classStaticPrivateMethodSet.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _classStaticPrivateMethodSet() {
-  throw new TypeError("attempted to set read only static private field");
-}
-
-module.exports = _classStaticPrivateMethodSet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/construct.js b/node_modules/@babel/runtime-corejs3/helpers/construct.js
deleted file mode 100644
index 1869f24..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/construct.js
+++ /dev/null
@@ -1,39 +0,0 @@
-var _bindInstanceProperty = require("../core-js/instance/bind");
-
-var _Reflect$construct = require("../core-js/reflect/construct");
-
-var setPrototypeOf = require("./setPrototypeOf");
-
-function isNativeReflectConstruct() {
-  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
-  if (_Reflect$construct.sham) return false;
-  if (typeof Proxy === "function") return true;
-
-  try {
-    Date.prototype.toString.call(_Reflect$construct(Date, [], function () {}));
-    return true;
-  } catch (e) {
-    return false;
-  }
-}
-
-function _construct(Parent, args, Class) {
-  if (isNativeReflectConstruct()) {
-    module.exports = _construct = _Reflect$construct;
-  } else {
-    module.exports = _construct = function _construct(Parent, args, Class) {
-      var a = [null];
-      a.push.apply(a, args);
-
-      var Constructor = _bindInstanceProperty(Function).apply(Parent, a);
-
-      var instance = new Constructor();
-      if (Class) setPrototypeOf(instance, Class.prototype);
-      return instance;
-    };
-  }
-
-  return _construct.apply(null, arguments);
-}
-
-module.exports = _construct;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/createClass.js b/node_modules/@babel/runtime-corejs3/helpers/createClass.js
deleted file mode 100644
index c04c910..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/createClass.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var _Object$defineProperty = require("../core-js/object/define-property");
-
-function _defineProperties(target, props) {
-  for (var i = 0; i < props.length; i++) {
-    var descriptor = props[i];
-    descriptor.enumerable = descriptor.enumerable || false;
-    descriptor.configurable = true;
-    if ("value" in descriptor) descriptor.writable = true;
-
-    _Object$defineProperty(target, descriptor.key, descriptor);
-  }
-}
-
-function _createClass(Constructor, protoProps, staticProps) {
-  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
-  if (staticProps) _defineProperties(Constructor, staticProps);
-  return Constructor;
-}
-
-module.exports = _createClass;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/decorate.js b/node_modules/@babel/runtime-corejs3/helpers/decorate.js
deleted file mode 100644
index 1b98c4e..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/decorate.js
+++ /dev/null
@@ -1,433 +0,0 @@
-var _findInstanceProperty = require("../core-js/instance/find");
-
-var _Object$assign = require("../core-js/object/assign");
-
-var _Symbol$toStringTag = require("../core-js/symbol/to-string-tag");
-
-var _spliceInstanceProperty = require("../core-js/instance/splice");
-
-var _indexOfInstanceProperty = require("../core-js/instance/index-of");
-
-var _Object$defineProperty = require("../core-js/object/define-property");
-
-var _forEachInstanceProperty = require("../core-js/instance/for-each");
-
-var _mapInstanceProperty = require("../core-js/instance/map");
-
-var toArray = require("./toArray");
-
-var toPropertyKey = require("./toPropertyKey");
-
-function _decorate(decorators, factory, superClass, mixins) {
-  var _context;
-
-  var api = _getDecoratorsApi();
-
-  if (mixins) {
-    for (var i = 0; i < mixins.length; i++) {
-      api = mixins[i](api);
-    }
-  }
-
-  var r = factory(function initialize(O) {
-    api.initializeInstanceElements(O, decorated.elements);
-  }, superClass);
-  var decorated = api.decorateClass(_coalesceClassElements(_mapInstanceProperty(_context = r.d).call(_context, _createElementDescriptor)), decorators);
-  api.initializeClassElements(r.F, decorated.elements);
-  return api.runClassFinishers(r.F, decorated.finishers);
-}
-
-function _getDecoratorsApi() {
-  _getDecoratorsApi = function _getDecoratorsApi() {
-    return api;
-  };
-
-  var api = {
-    elementsDefinitionOrder: [["method"], ["field"]],
-    initializeInstanceElements: function initializeInstanceElements(O, elements) {
-      var _context2;
-
-      _forEachInstanceProperty(_context2 = ["method", "field"]).call(_context2, function (kind) {
-        _forEachInstanceProperty(elements).call(elements, function (element) {
-          if (element.kind === kind && element.placement === "own") {
-            this.defineClassElement(O, element);
-          }
-        }, this);
-      }, this);
-    },
-    initializeClassElements: function initializeClassElements(F, elements) {
-      var _context3;
-
-      var proto = F.prototype;
-
-      _forEachInstanceProperty(_context3 = ["method", "field"]).call(_context3, function (kind) {
-        _forEachInstanceProperty(elements).call(elements, function (element) {
-          var placement = element.placement;
-
-          if (element.kind === kind && (placement === "static" || placement === "prototype")) {
-            var receiver = placement === "static" ? F : proto;
-            this.defineClassElement(receiver, element);
-          }
-        }, this);
-      }, this);
-    },
-    defineClassElement: function defineClassElement(receiver, element) {
-      var descriptor = element.descriptor;
-
-      if (element.kind === "field") {
-        var initializer = element.initializer;
-        descriptor = {
-          enumerable: descriptor.enumerable,
-          writable: descriptor.writable,
-          configurable: descriptor.configurable,
-          value: initializer === void 0 ? void 0 : initializer.call(receiver)
-        };
-      }
-
-      _Object$defineProperty(receiver, element.key, descriptor);
-    },
-    decorateClass: function decorateClass(elements, decorators) {
-      var newElements = [];
-      var finishers = [];
-      var placements = {
-        "static": [],
-        prototype: [],
-        own: []
-      };
-
-      _forEachInstanceProperty(elements).call(elements, function (element) {
-        this.addElementPlacement(element, placements);
-      }, this);
-
-      _forEachInstanceProperty(elements).call(elements, function (element) {
-        if (!_hasDecorators(element)) return newElements.push(element);
-        var elementFinishersExtras = this.decorateElement(element, placements);
-        newElements.push(elementFinishersExtras.element);
-        newElements.push.apply(newElements, elementFinishersExtras.extras);
-        finishers.push.apply(finishers, elementFinishersExtras.finishers);
-      }, this);
-
-      if (!decorators) {
-        return {
-          elements: newElements,
-          finishers: finishers
-        };
-      }
-
-      var result = this.decorateConstructor(newElements, decorators);
-      finishers.push.apply(finishers, result.finishers);
-      result.finishers = finishers;
-      return result;
-    },
-    addElementPlacement: function addElementPlacement(element, placements, silent) {
-      var keys = placements[element.placement];
-
-      if (!silent && _indexOfInstanceProperty(keys).call(keys, element.key) !== -1) {
-        throw new TypeError("Duplicated element (" + element.key + ")");
-      }
-
-      keys.push(element.key);
-    },
-    decorateElement: function decorateElement(element, placements) {
-      var extras = [];
-      var finishers = [];
-
-      for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
-        var keys = placements[element.placement];
-
-        _spliceInstanceProperty(keys).call(keys, _indexOfInstanceProperty(keys).call(keys, element.key), 1);
-
-        var elementObject = this.fromElementDescriptor(element);
-        var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);
-        element = elementFinisherExtras.element;
-        this.addElementPlacement(element, placements);
-
-        if (elementFinisherExtras.finisher) {
-          finishers.push(elementFinisherExtras.finisher);
-        }
-
-        var newExtras = elementFinisherExtras.extras;
-
-        if (newExtras) {
-          for (var j = 0; j < newExtras.length; j++) {
-            this.addElementPlacement(newExtras[j], placements);
-          }
-
-          extras.push.apply(extras, newExtras);
-        }
-      }
-
-      return {
-        element: element,
-        finishers: finishers,
-        extras: extras
-      };
-    },
-    decorateConstructor: function decorateConstructor(elements, decorators) {
-      var finishers = [];
-
-      for (var i = decorators.length - 1; i >= 0; i--) {
-        var obj = this.fromClassDescriptor(elements);
-        var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj);
-
-        if (elementsAndFinisher.finisher !== undefined) {
-          finishers.push(elementsAndFinisher.finisher);
-        }
-
-        if (elementsAndFinisher.elements !== undefined) {
-          elements = elementsAndFinisher.elements;
-
-          for (var j = 0; j < elements.length - 1; j++) {
-            for (var k = j + 1; k < elements.length; k++) {
-              if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {
-                throw new TypeError("Duplicated element (" + elements[j].key + ")");
-              }
-            }
-          }
-        }
-      }
-
-      return {
-        elements: elements,
-        finishers: finishers
-      };
-    },
-    fromElementDescriptor: function fromElementDescriptor(element) {
-      var obj = {
-        kind: element.kind,
-        key: element.key,
-        placement: element.placement,
-        descriptor: element.descriptor
-      };
-      var desc = {
-        value: "Descriptor",
-        configurable: true
-      };
-
-      _Object$defineProperty(obj, _Symbol$toStringTag, desc);
-
-      if (element.kind === "field") obj.initializer = element.initializer;
-      return obj;
-    },
-    toElementDescriptors: function toElementDescriptors(elementObjects) {
-      var _context4;
-
-      if (elementObjects === undefined) return;
-      return _mapInstanceProperty(_context4 = toArray(elementObjects)).call(_context4, function (elementObject) {
-        var element = this.toElementDescriptor(elementObject);
-        this.disallowProperty(elementObject, "finisher", "An element descriptor");
-        this.disallowProperty(elementObject, "extras", "An element descriptor");
-        return element;
-      }, this);
-    },
-    toElementDescriptor: function toElementDescriptor(elementObject) {
-      var kind = String(elementObject.kind);
-
-      if (kind !== "method" && kind !== "field") {
-        throw new TypeError('An element descriptor\'s .kind property must be either "method" or' + ' "field", but a decorator created an element descriptor with' + ' .kind "' + kind + '"');
-      }
-
-      var key = toPropertyKey(elementObject.key);
-      var placement = String(elementObject.placement);
-
-      if (placement !== "static" && placement !== "prototype" && placement !== "own") {
-        throw new TypeError('An element descriptor\'s .placement property must be one of "static",' + ' "prototype" or "own", but a decorator created an element descriptor' + ' with .placement "' + placement + '"');
-      }
-
-      var descriptor = elementObject.descriptor;
-      this.disallowProperty(elementObject, "elements", "An element descriptor");
-      var element = {
-        kind: kind,
-        key: key,
-        placement: placement,
-        descriptor: _Object$assign({}, descriptor)
-      };
-
-      if (kind !== "field") {
-        this.disallowProperty(elementObject, "initializer", "A method descriptor");
-      } else {
-        this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor");
-        this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor");
-        this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor");
-        element.initializer = elementObject.initializer;
-      }
-
-      return element;
-    },
-    toElementFinisherExtras: function toElementFinisherExtras(elementObject) {
-      var element = this.toElementDescriptor(elementObject);
-
-      var finisher = _optionalCallableProperty(elementObject, "finisher");
-
-      var extras = this.toElementDescriptors(elementObject.extras);
-      return {
-        element: element,
-        finisher: finisher,
-        extras: extras
-      };
-    },
-    fromClassDescriptor: function fromClassDescriptor(elements) {
-      var obj = {
-        kind: "class",
-        elements: _mapInstanceProperty(elements).call(elements, this.fromElementDescriptor, this)
-      };
-      var desc = {
-        value: "Descriptor",
-        configurable: true
-      };
-
-      _Object$defineProperty(obj, _Symbol$toStringTag, desc);
-
-      return obj;
-    },
-    toClassDescriptor: function toClassDescriptor(obj) {
-      var kind = String(obj.kind);
-
-      if (kind !== "class") {
-        throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator' + ' created a class descriptor with .kind "' + kind + '"');
-      }
-
-      this.disallowProperty(obj, "key", "A class descriptor");
-      this.disallowProperty(obj, "placement", "A class descriptor");
-      this.disallowProperty(obj, "descriptor", "A class descriptor");
-      this.disallowProperty(obj, "initializer", "A class descriptor");
-      this.disallowProperty(obj, "extras", "A class descriptor");
-
-      var finisher = _optionalCallableProperty(obj, "finisher");
-
-      var elements = this.toElementDescriptors(obj.elements);
-      return {
-        elements: elements,
-        finisher: finisher
-      };
-    },
-    runClassFinishers: function runClassFinishers(constructor, finishers) {
-      for (var i = 0; i < finishers.length; i++) {
-        var newConstructor = (0, finishers[i])(constructor);
-
-        if (newConstructor !== undefined) {
-          if (typeof newConstructor !== "function") {
-            throw new TypeError("Finishers must return a constructor.");
-          }
-
-          constructor = newConstructor;
-        }
-      }
-
-      return constructor;
-    },
-    disallowProperty: function disallowProperty(obj, name, objectType) {
-      if (obj[name] !== undefined) {
-        throw new TypeError(objectType + " can't have a ." + name + " property.");
-      }
-    }
-  };
-  return api;
-}
-
-function _createElementDescriptor(def) {
-  var key = toPropertyKey(def.key);
-  var descriptor;
-
-  if (def.kind === "method") {
-    descriptor = {
-      value: def.value,
-      writable: true,
-      configurable: true,
-      enumerable: false
-    };
-  } else if (def.kind === "get") {
-    descriptor = {
-      get: def.value,
-      configurable: true,
-      enumerable: false
-    };
-  } else if (def.kind === "set") {
-    descriptor = {
-      set: def.value,
-      configurable: true,
-      enumerable: false
-    };
-  } else if (def.kind === "field") {
-    descriptor = {
-      configurable: true,
-      writable: true,
-      enumerable: true
-    };
-  }
-
-  var element = {
-    kind: def.kind === "field" ? "field" : "method",
-    key: key,
-    placement: def["static"] ? "static" : def.kind === "field" ? "own" : "prototype",
-    descriptor: descriptor
-  };
-  if (def.decorators) element.decorators = def.decorators;
-  if (def.kind === "field") element.initializer = def.value;
-  return element;
-}
-
-function _coalesceGetterSetter(element, other) {
-  if (element.descriptor.get !== undefined) {
-    other.descriptor.get = element.descriptor.get;
-  } else {
-    other.descriptor.set = element.descriptor.set;
-  }
-}
-
-function _coalesceClassElements(elements) {
-  var newElements = [];
-
-  var isSameElement = function isSameElement(other) {
-    return other.kind === "method" && other.key === element.key && other.placement === element.placement;
-  };
-
-  for (var i = 0; i < elements.length; i++) {
-    var element = elements[i];
-    var other;
-
-    if (element.kind === "method" && (other = _findInstanceProperty(newElements).call(newElements, isSameElement))) {
-      if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
-        if (_hasDecorators(element) || _hasDecorators(other)) {
-          throw new ReferenceError("Duplicated methods (" + element.key + ") can't be decorated.");
-        }
-
-        other.descriptor = element.descriptor;
-      } else {
-        if (_hasDecorators(element)) {
-          if (_hasDecorators(other)) {
-            throw new ReferenceError("Decorators can't be placed on different accessors with for " + "the same property (" + element.key + ").");
-          }
-
-          other.decorators = element.decorators;
-        }
-
-        _coalesceGetterSetter(element, other);
-      }
-    } else {
-      newElements.push(element);
-    }
-  }
-
-  return newElements;
-}
-
-function _hasDecorators(element) {
-  return element.decorators && element.decorators.length;
-}
-
-function _isDataDescriptor(desc) {
-  return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);
-}
-
-function _optionalCallableProperty(obj, name) {
-  var value = obj[name];
-
-  if (value !== undefined && typeof value !== "function") {
-    throw new TypeError("Expected '" + name + "' to be a function");
-  }
-
-  return value;
-}
-
-module.exports = _decorate;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/defaults.js b/node_modules/@babel/runtime-corejs3/helpers/defaults.js
deleted file mode 100644
index 77c4b85..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/defaults.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var _Object$defineProperty = require("../core-js/object/define-property");
-
-var _Object$getOwnPropertyDescriptor = require("../core-js/object/get-own-property-descriptor");
-
-var _Object$getOwnPropertyNames = require("../core-js/object/get-own-property-names");
-
-function _defaults(obj, defaults) {
-  var keys = _Object$getOwnPropertyNames(defaults);
-
-  for (var i = 0; i < keys.length; i++) {
-    var key = keys[i];
-
-    var value = _Object$getOwnPropertyDescriptor(defaults, key);
-
-    if (value && value.configurable && obj[key] === undefined) {
-      _Object$defineProperty(obj, key, value);
-    }
-  }
-
-  return obj;
-}
-
-module.exports = _defaults;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/defineEnumerableProperties.js b/node_modules/@babel/runtime-corejs3/helpers/defineEnumerableProperties.js
deleted file mode 100644
index 0ef3a34..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/defineEnumerableProperties.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var _Object$getOwnPropertySymbols = require("../core-js/object/get-own-property-symbols");
-
-var _Object$defineProperty = require("../core-js/object/define-property");
-
-function _defineEnumerableProperties(obj, descs) {
-  for (var key in descs) {
-    var desc = descs[key];
-    desc.configurable = desc.enumerable = true;
-    if ("value" in desc) desc.writable = true;
-
-    _Object$defineProperty(obj, key, desc);
-  }
-
-  if (_Object$getOwnPropertySymbols) {
-    var objectSymbols = _Object$getOwnPropertySymbols(descs);
-
-    for (var i = 0; i < objectSymbols.length; i++) {
-      var sym = objectSymbols[i];
-      var desc = descs[sym];
-      desc.configurable = desc.enumerable = true;
-      if ("value" in desc) desc.writable = true;
-
-      _Object$defineProperty(obj, sym, desc);
-    }
-  }
-
-  return obj;
-}
-
-module.exports = _defineEnumerableProperties;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js b/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js
deleted file mode 100644
index b08c5e8..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/defineProperty.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var _Object$defineProperty = require("../core-js/object/define-property");
-
-function _defineProperty(obj, key, value) {
-  if (key in obj) {
-    _Object$defineProperty(obj, key, {
-      value: value,
-      enumerable: true,
-      configurable: true,
-      writable: true
-    });
-  } else {
-    obj[key] = value;
-  }
-
-  return obj;
-}
-
-module.exports = _defineProperty;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/AsyncGenerator.js b/node_modules/@babel/runtime-corejs3/helpers/esm/AsyncGenerator.js
deleted file mode 100644
index d37824f..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/AsyncGenerator.js
+++ /dev/null
@@ -1,101 +0,0 @@
-import _Symbol$asyncIterator from "../../core-js/symbol/async-iterator";
-import _Symbol from "../../core-js/symbol";
-import _Promise from "../../core-js/promise";
-import AwaitValue from "./AwaitValue";
-export default function AsyncGenerator(gen) {
-  var front, back;
-
-  function send(key, arg) {
-    return new _Promise(function (resolve, reject) {
-      var request = {
-        key: key,
-        arg: arg,
-        resolve: resolve,
-        reject: reject,
-        next: null
-      };
-
-      if (back) {
-        back = back.next = request;
-      } else {
-        front = back = request;
-        resume(key, arg);
-      }
-    });
-  }
-
-  function resume(key, arg) {
-    try {
-      var result = gen[key](arg);
-      var value = result.value;
-      var wrappedAwait = value instanceof AwaitValue;
-
-      _Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
-        if (wrappedAwait) {
-          resume(key === "return" ? "return" : "next", arg);
-          return;
-        }
-
-        settle(result.done ? "return" : "normal", arg);
-      }, function (err) {
-        resume("throw", err);
-      });
-    } catch (err) {
-      settle("throw", err);
-    }
-  }
-
-  function settle(type, value) {
-    switch (type) {
-      case "return":
-        front.resolve({
-          value: value,
-          done: true
-        });
-        break;
-
-      case "throw":
-        front.reject(value);
-        break;
-
-      default:
-        front.resolve({
-          value: value,
-          done: false
-        });
-        break;
-    }
-
-    front = front.next;
-
-    if (front) {
-      resume(front.key, front.arg);
-    } else {
-      back = null;
-    }
-  }
-
-  this._invoke = send;
-
-  if (typeof gen["return"] !== "function") {
-    this["return"] = undefined;
-  }
-}
-
-if (typeof _Symbol === "function" && _Symbol$asyncIterator) {
-  AsyncGenerator.prototype[_Symbol$asyncIterator] = function () {
-    return this;
-  };
-}
-
-AsyncGenerator.prototype.next = function (arg) {
-  return this._invoke("next", arg);
-};
-
-AsyncGenerator.prototype["throw"] = function (arg) {
-  return this._invoke("throw", arg);
-};
-
-AsyncGenerator.prototype["return"] = function (arg) {
-  return this._invoke("return", arg);
-};
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/AwaitValue.js b/node_modules/@babel/runtime-corejs3/helpers/esm/AwaitValue.js
deleted file mode 100644
index 5237e18..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/AwaitValue.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _AwaitValue(value) {
-  this.wrapped = value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/applyDecoratedDescriptor.js b/node_modules/@babel/runtime-corejs3/helpers/esm/applyDecoratedDescriptor.js
deleted file mode 100644
index 52f9e4e..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/applyDecoratedDescriptor.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import _Object$defineProperty from "../../core-js/object/define-property";
-import _sliceInstanceProperty from "../../core-js/instance/slice";
-import _reverseInstanceProperty from "../../core-js/instance/reverse";
-import _reduceInstanceProperty from "../../core-js/instance/reduce";
-import _Object$keys from "../../core-js/object/keys";
-import _forEachInstanceProperty from "../../core-js/instance/for-each";
-export default function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
-  var _context, _context2, _context3;
-
-  var desc = {};
-
-  _forEachInstanceProperty(_context = _Object$keys(descriptor)).call(_context, function (key) {
-    desc[key] = descriptor[key];
-  });
-
-  desc.enumerable = !!desc.enumerable;
-  desc.configurable = !!desc.configurable;
-
-  if ('value' in desc || desc.initializer) {
-    desc.writable = true;
-  }
-
-  desc = _reduceInstanceProperty(_context2 = _reverseInstanceProperty(_context3 = _sliceInstanceProperty(decorators).call(decorators)).call(_context3)).call(_context2, function (desc, decorator) {
-    return decorator(target, property, desc) || desc;
-  }, desc);
-
-  if (context && desc.initializer !== void 0) {
-    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
-    desc.initializer = undefined;
-  }
-
-  if (desc.initializer === void 0) {
-    _Object$defineProperty(target, property, desc);
-
-    desc = null;
-  }
-
-  return desc;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/arrayWithHoles.js b/node_modules/@babel/runtime-corejs3/helpers/esm/arrayWithHoles.js
deleted file mode 100644
index 2c3a087..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/arrayWithHoles.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import _Array$isArray from "../../core-js/array/is-array";
-export default function _arrayWithHoles(arr) {
-  if (_Array$isArray(arr)) return arr;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/arrayWithoutHoles.js b/node_modules/@babel/runtime-corejs3/helpers/esm/arrayWithoutHoles.js
deleted file mode 100644
index 5f86abc..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/arrayWithoutHoles.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import _Array$isArray from "../../core-js/array/is-array";
-export default function _arrayWithoutHoles(arr) {
-  if (_Array$isArray(arr)) {
-    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
-      arr2[i] = arr[i];
-    }
-
-    return arr2;
-  }
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/assertThisInitialized.js b/node_modules/@babel/runtime-corejs3/helpers/esm/assertThisInitialized.js
deleted file mode 100644
index bbf849c..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/assertThisInitialized.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function _assertThisInitialized(self) {
-  if (self === void 0) {
-    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
-  }
-
-  return self;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/asyncGeneratorDelegate.js b/node_modules/@babel/runtime-corejs3/helpers/esm/asyncGeneratorDelegate.js
deleted file mode 100644
index 13088ef..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/asyncGeneratorDelegate.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import _Symbol$iterator from "../../core-js/symbol/iterator";
-import _Symbol from "../../core-js/symbol";
-import _Promise from "../../core-js/promise";
-export default function _asyncGeneratorDelegate(inner, awaitWrap) {
-  var iter = {},
-      waiting = false;
-
-  function pump(key, value) {
-    waiting = true;
-    value = new _Promise(function (resolve) {
-      resolve(inner[key](value));
-    });
-    return {
-      done: false,
-      value: awaitWrap(value)
-    };
-  }
-
-  ;
-
-  if (typeof _Symbol === "function" && _Symbol$iterator) {
-    iter[_Symbol$iterator] = function () {
-      return this;
-    };
-  }
-
-  iter.next = function (value) {
-    if (waiting) {
-      waiting = false;
-      return value;
-    }
-
-    return pump("next", value);
-  };
-
-  if (typeof inner["throw"] === "function") {
-    iter["throw"] = function (value) {
-      if (waiting) {
-        waiting = false;
-        throw value;
-      }
-
-      return pump("throw", value);
-    };
-  }
-
-  if (typeof inner["return"] === "function") {
-    iter["return"] = function (value) {
-      if (waiting) {
-        waiting = false;
-        return value;
-      }
-
-      return pump("return", value);
-    };
-  }
-
-  return iter;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/asyncIterator.js b/node_modules/@babel/runtime-corejs3/helpers/esm/asyncIterator.js
deleted file mode 100644
index b2d65bf..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/asyncIterator.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import _getIteratorMethod from "../../core-js/get-iterator-method";
-import _Symbol$iterator from "../../core-js/symbol/iterator";
-import _Symbol$asyncIterator from "../../core-js/symbol/async-iterator";
-import _Symbol from "../../core-js/symbol";
-export default function _asyncIterator(iterable) {
-  var method;
-
-  if (typeof _Symbol !== "undefined") {
-    if (_Symbol$asyncIterator) {
-      method = iterable[_Symbol$asyncIterator];
-      if (method != null) return method.call(iterable);
-    }
-
-    if (_Symbol$iterator) {
-      method = _getIteratorMethod(iterable);
-      if (method != null) return method.call(iterable);
-    }
-  }
-
-  throw new TypeError("Object is not async iterable");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js b/node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js
deleted file mode 100644
index c597faa..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/asyncToGenerator.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import _Promise from "../../core-js/promise";
-
-function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
-  try {
-    var info = gen[key](arg);
-    var value = info.value;
-  } catch (error) {
-    reject(error);
-    return;
-  }
-
-  if (info.done) {
-    resolve(value);
-  } else {
-    _Promise.resolve(value).then(_next, _throw);
-  }
-}
-
-export default function _asyncToGenerator(fn) {
-  return function () {
-    var self = this,
-        args = arguments;
-    return new _Promise(function (resolve, reject) {
-      var gen = fn.apply(self, args);
-
-      function _next(value) {
-        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
-      }
-
-      function _throw(err) {
-        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
-      }
-
-      _next(undefined);
-    });
-  };
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/awaitAsyncGenerator.js b/node_modules/@babel/runtime-corejs3/helpers/esm/awaitAsyncGenerator.js
deleted file mode 100644
index 462f99c..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/awaitAsyncGenerator.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import AwaitValue from "./AwaitValue";
-export default function _awaitAsyncGenerator(value) {
-  return new AwaitValue(value);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classCallCheck.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classCallCheck.js
deleted file mode 100644
index 2f1738a..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classCallCheck.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function _classCallCheck(instance, Constructor) {
-  if (!(instance instanceof Constructor)) {
-    throw new TypeError("Cannot call a class as a function");
-  }
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classNameTDZError.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classNameTDZError.js
deleted file mode 100644
index f7b6dd5..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classNameTDZError.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _classNameTDZError(name) {
-  throw new Error("Class \"" + name + "\" cannot be referenced in computed property keys.");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldDestructureSet.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldDestructureSet.js
deleted file mode 100644
index 1f265bc..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldDestructureSet.js
+++ /dev/null
@@ -1,26 +0,0 @@
-export default function _classPrivateFieldDestructureSet(receiver, privateMap) {
-  if (!privateMap.has(receiver)) {
-    throw new TypeError("attempted to set private field on non-instance");
-  }
-
-  var descriptor = privateMap.get(receiver);
-
-  if (descriptor.set) {
-    if (!("__destrObj" in descriptor)) {
-      descriptor.__destrObj = {
-        set value(v) {
-          descriptor.set.call(receiver, v);
-        }
-
-      };
-    }
-
-    return descriptor.__destrObj;
-  } else {
-    if (!descriptor.writable) {
-      throw new TypeError("attempted to set read only private field");
-    }
-
-    return descriptor;
-  }
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldGet.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldGet.js
deleted file mode 100644
index f8287f1..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldGet.js
+++ /dev/null
@@ -1,13 +0,0 @@
-export default function _classPrivateFieldGet(receiver, privateMap) {
-  var descriptor = privateMap.get(receiver);
-
-  if (!descriptor) {
-    throw new TypeError("attempted to get private field on non-instance");
-  }
-
-  if (descriptor.get) {
-    return descriptor.get.call(receiver);
-  }
-
-  return descriptor.value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldLooseBase.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldLooseBase.js
deleted file mode 100644
index 5b10916..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldLooseBase.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function _classPrivateFieldBase(receiver, privateKey) {
-  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
-    throw new TypeError("attempted to use private field on non-instance");
-  }
-
-  return receiver;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldLooseKey.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldLooseKey.js
deleted file mode 100644
index 5b7e5ac..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldLooseKey.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var id = 0;
-export default function _classPrivateFieldKey(name) {
-  return "__private_" + id++ + "_" + name;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldSet.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldSet.js
deleted file mode 100644
index fb4e5d2..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateFieldSet.js
+++ /dev/null
@@ -1,19 +0,0 @@
-export default function _classPrivateFieldSet(receiver, privateMap, value) {
-  var descriptor = privateMap.get(receiver);
-
-  if (!descriptor) {
-    throw new TypeError("attempted to set private field on non-instance");
-  }
-
-  if (descriptor.set) {
-    descriptor.set.call(receiver, value);
-  } else {
-    if (!descriptor.writable) {
-      throw new TypeError("attempted to set read only private field");
-    }
-
-    descriptor.value = value;
-  }
-
-  return value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateMethodGet.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateMethodGet.js
deleted file mode 100644
index 38b9d58..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateMethodGet.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function _classPrivateMethodGet(receiver, privateSet, fn) {
-  if (!privateSet.has(receiver)) {
-    throw new TypeError("attempted to get private field on non-instance");
-  }
-
-  return fn;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateMethodSet.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateMethodSet.js
deleted file mode 100644
index 2bbaf3a..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classPrivateMethodSet.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _classPrivateMethodSet() {
-  throw new TypeError("attempted to reassign private method");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classStaticPrivateFieldSpecGet.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classStaticPrivateFieldSpecGet.js
deleted file mode 100644
index 75a9b7c..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classStaticPrivateFieldSpecGet.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export default function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {
-  if (receiver !== classConstructor) {
-    throw new TypeError("Private static access of wrong provenance");
-  }
-
-  if (descriptor.get) {
-    return descriptor.get.call(receiver);
-  }
-
-  return descriptor.value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classStaticPrivateFieldSpecSet.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classStaticPrivateFieldSpecSet.js
deleted file mode 100644
index 163279f..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classStaticPrivateFieldSpecSet.js
+++ /dev/null
@@ -1,17 +0,0 @@
-export default function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {
-  if (receiver !== classConstructor) {
-    throw new TypeError("Private static access of wrong provenance");
-  }
-
-  if (descriptor.set) {
-    descriptor.set.call(receiver, value);
-  } else {
-    if (!descriptor.writable) {
-      throw new TypeError("attempted to set read only private field");
-    }
-
-    descriptor.value = value;
-  }
-
-  return value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classStaticPrivateMethodGet.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classStaticPrivateMethodGet.js
deleted file mode 100644
index da9b1e5..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classStaticPrivateMethodGet.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function _classStaticPrivateMethodGet(receiver, classConstructor, method) {
-  if (receiver !== classConstructor) {
-    throw new TypeError("Private static access of wrong provenance");
-  }
-
-  return method;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/classStaticPrivateMethodSet.js b/node_modules/@babel/runtime-corejs3/helpers/esm/classStaticPrivateMethodSet.js
deleted file mode 100644
index d5ab60a..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/classStaticPrivateMethodSet.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _classStaticPrivateMethodSet() {
-  throw new TypeError("attempted to set read only static private field");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/construct.js b/node_modules/@babel/runtime-corejs3/helpers/esm/construct.js
deleted file mode 100644
index 213320e..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/construct.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import _bindInstanceProperty from "../../core-js/instance/bind";
-import _Reflect$construct from "../../core-js/reflect/construct";
-import setPrototypeOf from "./setPrototypeOf";
-
-function isNativeReflectConstruct() {
-  if (typeof Reflect === "undefined" || !_Reflect$construct) return false;
-  if (_Reflect$construct.sham) return false;
-  if (typeof Proxy === "function") return true;
-
-  try {
-    Date.prototype.toString.call(_Reflect$construct(Date, [], function () {}));
-    return true;
-  } catch (e) {
-    return false;
-  }
-}
-
-export default function _construct(Parent, args, Class) {
-  if (isNativeReflectConstruct()) {
-    _construct = _Reflect$construct;
-  } else {
-    _construct = function _construct(Parent, args, Class) {
-      var a = [null];
-      a.push.apply(a, args);
-
-      var Constructor = _bindInstanceProperty(Function).apply(Parent, a);
-
-      var instance = new Constructor();
-      if (Class) setPrototypeOf(instance, Class.prototype);
-      return instance;
-    };
-  }
-
-  return _construct.apply(null, arguments);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/createClass.js b/node_modules/@babel/runtime-corejs3/helpers/esm/createClass.js
deleted file mode 100644
index 8a6ab38..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/createClass.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import _Object$defineProperty from "../../core-js/object/define-property";
-
-function _defineProperties(target, props) {
-  for (var i = 0; i < props.length; i++) {
-    var descriptor = props[i];
-    descriptor.enumerable = descriptor.enumerable || false;
-    descriptor.configurable = true;
-    if ("value" in descriptor) descriptor.writable = true;
-
-    _Object$defineProperty(target, descriptor.key, descriptor);
-  }
-}
-
-export default function _createClass(Constructor, protoProps, staticProps) {
-  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
-  if (staticProps) _defineProperties(Constructor, staticProps);
-  return Constructor;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/decorate.js b/node_modules/@babel/runtime-corejs3/helpers/esm/decorate.js
deleted file mode 100644
index b91bd49..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/decorate.js
+++ /dev/null
@@ -1,421 +0,0 @@
-import _findInstanceProperty from "../../core-js/instance/find";
-import _Object$assign from "../../core-js/object/assign";
-import _Symbol$toStringTag from "../../core-js/symbol/to-string-tag";
-import _spliceInstanceProperty from "../../core-js/instance/splice";
-import _indexOfInstanceProperty from "../../core-js/instance/index-of";
-import _Object$defineProperty from "../../core-js/object/define-property";
-import _forEachInstanceProperty from "../../core-js/instance/for-each";
-import _mapInstanceProperty from "../../core-js/instance/map";
-import toArray from "./toArray";
-import toPropertyKey from "./toPropertyKey";
-export default function _decorate(decorators, factory, superClass, mixins) {
-  var _context;
-
-  var api = _getDecoratorsApi();
-
-  if (mixins) {
-    for (var i = 0; i < mixins.length; i++) {
-      api = mixins[i](api);
-    }
-  }
-
-  var r = factory(function initialize(O) {
-    api.initializeInstanceElements(O, decorated.elements);
-  }, superClass);
-  var decorated = api.decorateClass(_coalesceClassElements(_mapInstanceProperty(_context = r.d).call(_context, _createElementDescriptor)), decorators);
-  api.initializeClassElements(r.F, decorated.elements);
-  return api.runClassFinishers(r.F, decorated.finishers);
-}
-
-function _getDecoratorsApi() {
-  _getDecoratorsApi = function _getDecoratorsApi() {
-    return api;
-  };
-
-  var api = {
-    elementsDefinitionOrder: [["method"], ["field"]],
-    initializeInstanceElements: function initializeInstanceElements(O, elements) {
-      var _context2;
-
-      _forEachInstanceProperty(_context2 = ["method", "field"]).call(_context2, function (kind) {
-        _forEachInstanceProperty(elements).call(elements, function (element) {
-          if (element.kind === kind && element.placement === "own") {
-            this.defineClassElement(O, element);
-          }
-        }, this);
-      }, this);
-    },
-    initializeClassElements: function initializeClassElements(F, elements) {
-      var _context3;
-
-      var proto = F.prototype;
-
-      _forEachInstanceProperty(_context3 = ["method", "field"]).call(_context3, function (kind) {
-        _forEachInstanceProperty(elements).call(elements, function (element) {
-          var placement = element.placement;
-
-          if (element.kind === kind && (placement === "static" || placement === "prototype")) {
-            var receiver = placement === "static" ? F : proto;
-            this.defineClassElement(receiver, element);
-          }
-        }, this);
-      }, this);
-    },
-    defineClassElement: function defineClassElement(receiver, element) {
-      var descriptor = element.descriptor;
-
-      if (element.kind === "field") {
-        var initializer = element.initializer;
-        descriptor = {
-          enumerable: descriptor.enumerable,
-          writable: descriptor.writable,
-          configurable: descriptor.configurable,
-          value: initializer === void 0 ? void 0 : initializer.call(receiver)
-        };
-      }
-
-      _Object$defineProperty(receiver, element.key, descriptor);
-    },
-    decorateClass: function decorateClass(elements, decorators) {
-      var newElements = [];
-      var finishers = [];
-      var placements = {
-        "static": [],
-        prototype: [],
-        own: []
-      };
-
-      _forEachInstanceProperty(elements).call(elements, function (element) {
-        this.addElementPlacement(element, placements);
-      }, this);
-
-      _forEachInstanceProperty(elements).call(elements, function (element) {
-        if (!_hasDecorators(element)) return newElements.push(element);
-        var elementFinishersExtras = this.decorateElement(element, placements);
-        newElements.push(elementFinishersExtras.element);
-        newElements.push.apply(newElements, elementFinishersExtras.extras);
-        finishers.push.apply(finishers, elementFinishersExtras.finishers);
-      }, this);
-
-      if (!decorators) {
-        return {
-          elements: newElements,
-          finishers: finishers
-        };
-      }
-
-      var result = this.decorateConstructor(newElements, decorators);
-      finishers.push.apply(finishers, result.finishers);
-      result.finishers = finishers;
-      return result;
-    },
-    addElementPlacement: function addElementPlacement(element, placements, silent) {
-      var keys = placements[element.placement];
-
-      if (!silent && _indexOfInstanceProperty(keys).call(keys, element.key) !== -1) {
-        throw new TypeError("Duplicated element (" + element.key + ")");
-      }
-
-      keys.push(element.key);
-    },
-    decorateElement: function decorateElement(element, placements) {
-      var extras = [];
-      var finishers = [];
-
-      for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
-        var keys = placements[element.placement];
-
-        _spliceInstanceProperty(keys).call(keys, _indexOfInstanceProperty(keys).call(keys, element.key), 1);
-
-        var elementObject = this.fromElementDescriptor(element);
-        var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);
-        element = elementFinisherExtras.element;
-        this.addElementPlacement(element, placements);
-
-        if (elementFinisherExtras.finisher) {
-          finishers.push(elementFinisherExtras.finisher);
-        }
-
-        var newExtras = elementFinisherExtras.extras;
-
-        if (newExtras) {
-          for (var j = 0; j < newExtras.length; j++) {
-            this.addElementPlacement(newExtras[j], placements);
-          }
-
-          extras.push.apply(extras, newExtras);
-        }
-      }
-
-      return {
-        element: element,
-        finishers: finishers,
-        extras: extras
-      };
-    },
-    decorateConstructor: function decorateConstructor(elements, decorators) {
-      var finishers = [];
-
-      for (var i = decorators.length - 1; i >= 0; i--) {
-        var obj = this.fromClassDescriptor(elements);
-        var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj);
-
-        if (elementsAndFinisher.finisher !== undefined) {
-          finishers.push(elementsAndFinisher.finisher);
-        }
-
-        if (elementsAndFinisher.elements !== undefined) {
-          elements = elementsAndFinisher.elements;
-
-          for (var j = 0; j < elements.length - 1; j++) {
-            for (var k = j + 1; k < elements.length; k++) {
-              if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {
-                throw new TypeError("Duplicated element (" + elements[j].key + ")");
-              }
-            }
-          }
-        }
-      }
-
-      return {
-        elements: elements,
-        finishers: finishers
-      };
-    },
-    fromElementDescriptor: function fromElementDescriptor(element) {
-      var obj = {
-        kind: element.kind,
-        key: element.key,
-        placement: element.placement,
-        descriptor: element.descriptor
-      };
-      var desc = {
-        value: "Descriptor",
-        configurable: true
-      };
-
-      _Object$defineProperty(obj, _Symbol$toStringTag, desc);
-
-      if (element.kind === "field") obj.initializer = element.initializer;
-      return obj;
-    },
-    toElementDescriptors: function toElementDescriptors(elementObjects) {
-      var _context4;
-
-      if (elementObjects === undefined) return;
-      return _mapInstanceProperty(_context4 = toArray(elementObjects)).call(_context4, function (elementObject) {
-        var element = this.toElementDescriptor(elementObject);
-        this.disallowProperty(elementObject, "finisher", "An element descriptor");
-        this.disallowProperty(elementObject, "extras", "An element descriptor");
-        return element;
-      }, this);
-    },
-    toElementDescriptor: function toElementDescriptor(elementObject) {
-      var kind = String(elementObject.kind);
-
-      if (kind !== "method" && kind !== "field") {
-        throw new TypeError('An element descriptor\'s .kind property must be either "method" or' + ' "field", but a decorator created an element descriptor with' + ' .kind "' + kind + '"');
-      }
-
-      var key = toPropertyKey(elementObject.key);
-      var placement = String(elementObject.placement);
-
-      if (placement !== "static" && placement !== "prototype" && placement !== "own") {
-        throw new TypeError('An element descriptor\'s .placement property must be one of "static",' + ' "prototype" or "own", but a decorator created an element descriptor' + ' with .placement "' + placement + '"');
-      }
-
-      var descriptor = elementObject.descriptor;
-      this.disallowProperty(elementObject, "elements", "An element descriptor");
-      var element = {
-        kind: kind,
-        key: key,
-        placement: placement,
-        descriptor: _Object$assign({}, descriptor)
-      };
-
-      if (kind !== "field") {
-        this.disallowProperty(elementObject, "initializer", "A method descriptor");
-      } else {
-        this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor");
-        this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor");
-        this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor");
-        element.initializer = elementObject.initializer;
-      }
-
-      return element;
-    },
-    toElementFinisherExtras: function toElementFinisherExtras(elementObject) {
-      var element = this.toElementDescriptor(elementObject);
-
-      var finisher = _optionalCallableProperty(elementObject, "finisher");
-
-      var extras = this.toElementDescriptors(elementObject.extras);
-      return {
-        element: element,
-        finisher: finisher,
-        extras: extras
-      };
-    },
-    fromClassDescriptor: function fromClassDescriptor(elements) {
-      var obj = {
-        kind: "class",
-        elements: _mapInstanceProperty(elements).call(elements, this.fromElementDescriptor, this)
-      };
-      var desc = {
-        value: "Descriptor",
-        configurable: true
-      };
-
-      _Object$defineProperty(obj, _Symbol$toStringTag, desc);
-
-      return obj;
-    },
-    toClassDescriptor: function toClassDescriptor(obj) {
-      var kind = String(obj.kind);
-
-      if (kind !== "class") {
-        throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator' + ' created a class descriptor with .kind "' + kind + '"');
-      }
-
-      this.disallowProperty(obj, "key", "A class descriptor");
-      this.disallowProperty(obj, "placement", "A class descriptor");
-      this.disallowProperty(obj, "descriptor", "A class descriptor");
-      this.disallowProperty(obj, "initializer", "A class descriptor");
-      this.disallowProperty(obj, "extras", "A class descriptor");
-
-      var finisher = _optionalCallableProperty(obj, "finisher");
-
-      var elements = this.toElementDescriptors(obj.elements);
-      return {
-        elements: elements,
-        finisher: finisher
-      };
-    },
-    runClassFinishers: function runClassFinishers(constructor, finishers) {
-      for (var i = 0; i < finishers.length; i++) {
-        var newConstructor = (0, finishers[i])(constructor);
-
-        if (newConstructor !== undefined) {
-          if (typeof newConstructor !== "function") {
-            throw new TypeError("Finishers must return a constructor.");
-          }
-
-          constructor = newConstructor;
-        }
-      }
-
-      return constructor;
-    },
-    disallowProperty: function disallowProperty(obj, name, objectType) {
-      if (obj[name] !== undefined) {
-        throw new TypeError(objectType + " can't have a ." + name + " property.");
-      }
-    }
-  };
-  return api;
-}
-
-function _createElementDescriptor(def) {
-  var key = toPropertyKey(def.key);
-  var descriptor;
-
-  if (def.kind === "method") {
-    descriptor = {
-      value: def.value,
-      writable: true,
-      configurable: true,
-      enumerable: false
-    };
-  } else if (def.kind === "get") {
-    descriptor = {
-      get: def.value,
-      configurable: true,
-      enumerable: false
-    };
-  } else if (def.kind === "set") {
-    descriptor = {
-      set: def.value,
-      configurable: true,
-      enumerable: false
-    };
-  } else if (def.kind === "field") {
-    descriptor = {
-      configurable: true,
-      writable: true,
-      enumerable: true
-    };
-  }
-
-  var element = {
-    kind: def.kind === "field" ? "field" : "method",
-    key: key,
-    placement: def["static"] ? "static" : def.kind === "field" ? "own" : "prototype",
-    descriptor: descriptor
-  };
-  if (def.decorators) element.decorators = def.decorators;
-  if (def.kind === "field") element.initializer = def.value;
-  return element;
-}
-
-function _coalesceGetterSetter(element, other) {
-  if (element.descriptor.get !== undefined) {
-    other.descriptor.get = element.descriptor.get;
-  } else {
-    other.descriptor.set = element.descriptor.set;
-  }
-}
-
-function _coalesceClassElements(elements) {
-  var newElements = [];
-
-  var isSameElement = function isSameElement(other) {
-    return other.kind === "method" && other.key === element.key && other.placement === element.placement;
-  };
-
-  for (var i = 0; i < elements.length; i++) {
-    var element = elements[i];
-    var other;
-
-    if (element.kind === "method" && (other = _findInstanceProperty(newElements).call(newElements, isSameElement))) {
-      if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
-        if (_hasDecorators(element) || _hasDecorators(other)) {
-          throw new ReferenceError("Duplicated methods (" + element.key + ") can't be decorated.");
-        }
-
-        other.descriptor = element.descriptor;
-      } else {
-        if (_hasDecorators(element)) {
-          if (_hasDecorators(other)) {
-            throw new ReferenceError("Decorators can't be placed on different accessors with for " + "the same property (" + element.key + ").");
-          }
-
-          other.decorators = element.decorators;
-        }
-
-        _coalesceGetterSetter(element, other);
-      }
-    } else {
-      newElements.push(element);
-    }
-  }
-
-  return newElements;
-}
-
-function _hasDecorators(element) {
-  return element.decorators && element.decorators.length;
-}
-
-function _isDataDescriptor(desc) {
-  return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);
-}
-
-function _optionalCallableProperty(obj, name) {
-  var value = obj[name];
-
-  if (value !== undefined && typeof value !== "function") {
-    throw new TypeError("Expected '" + name + "' to be a function");
-  }
-
-  return value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/defaults.js b/node_modules/@babel/runtime-corejs3/helpers/esm/defaults.js
deleted file mode 100644
index 8f7670a..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/defaults.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import _Object$defineProperty from "../../core-js/object/define-property";
-import _Object$getOwnPropertyDescriptor from "../../core-js/object/get-own-property-descriptor";
-import _Object$getOwnPropertyNames from "../../core-js/object/get-own-property-names";
-export default function _defaults(obj, defaults) {
-  var keys = _Object$getOwnPropertyNames(defaults);
-
-  for (var i = 0; i < keys.length; i++) {
-    var key = keys[i];
-
-    var value = _Object$getOwnPropertyDescriptor(defaults, key);
-
-    if (value && value.configurable && obj[key] === undefined) {
-      _Object$defineProperty(obj, key, value);
-    }
-  }
-
-  return obj;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/defineEnumerableProperties.js b/node_modules/@babel/runtime-corejs3/helpers/esm/defineEnumerableProperties.js
deleted file mode 100644
index 5c19c68..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/defineEnumerableProperties.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import _Object$getOwnPropertySymbols from "../../core-js/object/get-own-property-symbols";
-import _Object$defineProperty from "../../core-js/object/define-property";
-export default function _defineEnumerableProperties(obj, descs) {
-  for (var key in descs) {
-    var desc = descs[key];
-    desc.configurable = desc.enumerable = true;
-    if ("value" in desc) desc.writable = true;
-
-    _Object$defineProperty(obj, key, desc);
-  }
-
-  if (_Object$getOwnPropertySymbols) {
-    var objectSymbols = _Object$getOwnPropertySymbols(descs);
-
-    for (var i = 0; i < objectSymbols.length; i++) {
-      var sym = objectSymbols[i];
-      var desc = descs[sym];
-      desc.configurable = desc.enumerable = true;
-      if ("value" in desc) desc.writable = true;
-
-      _Object$defineProperty(obj, sym, desc);
-    }
-  }
-
-  return obj;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/defineProperty.js b/node_modules/@babel/runtime-corejs3/helpers/esm/defineProperty.js
deleted file mode 100644
index 54752ab..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/defineProperty.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import _Object$defineProperty from "../../core-js/object/define-property";
-export default function _defineProperty(obj, key, value) {
-  if (key in obj) {
-    _Object$defineProperty(obj, key, {
-      value: value,
-      enumerable: true,
-      configurable: true,
-      writable: true
-    });
-  } else {
-    obj[key] = value;
-  }
-
-  return obj;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/extends.js b/node_modules/@babel/runtime-corejs3/helpers/esm/extends.js
deleted file mode 100644
index ed3c050..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/extends.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import _Object$assign from "../../core-js/object/assign";
-export default function _extends() {
-  _extends = _Object$assign || function (target) {
-    for (var i = 1; i < arguments.length; i++) {
-      var source = arguments[i];
-
-      for (var key in source) {
-        if (Object.prototype.hasOwnProperty.call(source, key)) {
-          target[key] = source[key];
-        }
-      }
-    }
-
-    return target;
-  };
-
-  return _extends.apply(this, arguments);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/get.js b/node_modules/@babel/runtime-corejs3/helpers/esm/get.js
deleted file mode 100644
index 7c30d6b..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/get.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import _Object$getOwnPropertyDescriptor from "../../core-js/object/get-own-property-descriptor";
-import _Reflect$get from "../../core-js/reflect/get";
-import superPropBase from "./superPropBase";
-export default function _get(target, property, receiver) {
-  if (typeof Reflect !== "undefined" && _Reflect$get) {
-    _get = _Reflect$get;
-  } else {
-    _get = function _get(target, property, receiver) {
-      var base = superPropBase(target, property);
-      if (!base) return;
-
-      var desc = _Object$getOwnPropertyDescriptor(base, property);
-
-      if (desc.get) {
-        return desc.get.call(receiver);
-      }
-
-      return desc.value;
-    };
-  }
-
-  return _get(target, property, receiver || target);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/getPrototypeOf.js b/node_modules/@babel/runtime-corejs3/helpers/esm/getPrototypeOf.js
deleted file mode 100644
index 5fb6b56..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/getPrototypeOf.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import _Object$getPrototypeOf from "../../core-js/object/get-prototype-of";
-import _Object$setPrototypeOf from "../../core-js/object/set-prototype-of";
-export default function _getPrototypeOf(o) {
-  _getPrototypeOf = _Object$setPrototypeOf ? _Object$getPrototypeOf : function _getPrototypeOf(o) {
-    return o.__proto__ || _Object$getPrototypeOf(o);
-  };
-  return _getPrototypeOf(o);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/inherits.js b/node_modules/@babel/runtime-corejs3/helpers/esm/inherits.js
deleted file mode 100644
index a80b414..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/inherits.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import _Object$create from "../../core-js/object/create";
-import setPrototypeOf from "./setPrototypeOf";
-export default function _inherits(subClass, superClass) {
-  if (typeof superClass !== "function" && superClass !== null) {
-    throw new TypeError("Super expression must either be null or a function");
-  }
-
-  subClass.prototype = _Object$create(superClass && superClass.prototype, {
-    constructor: {
-      value: subClass,
-      writable: true,
-      configurable: true
-    }
-  });
-  if (superClass) setPrototypeOf(subClass, superClass);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/inheritsLoose.js b/node_modules/@babel/runtime-corejs3/helpers/esm/inheritsLoose.js
deleted file mode 100644
index a5fc29d..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/inheritsLoose.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import _Object$create from "../../core-js/object/create";
-export default function _inheritsLoose(subClass, superClass) {
-  subClass.prototype = _Object$create(superClass.prototype);
-  subClass.prototype.constructor = subClass;
-  subClass.__proto__ = superClass;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/initializerDefineProperty.js b/node_modules/@babel/runtime-corejs3/helpers/esm/initializerDefineProperty.js
deleted file mode 100644
index d43d6a4..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/initializerDefineProperty.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import _Object$defineProperty from "../../core-js/object/define-property";
-export default function _initializerDefineProperty(target, property, descriptor, context) {
-  if (!descriptor) return;
-
-  _Object$defineProperty(target, property, {
-    enumerable: descriptor.enumerable,
-    configurable: descriptor.configurable,
-    writable: descriptor.writable,
-    value: descriptor.initializer ? descriptor.initializer.call(context) : void 0
-  });
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/initializerWarningHelper.js b/node_modules/@babel/runtime-corejs3/helpers/esm/initializerWarningHelper.js
deleted file mode 100644
index 30d518c..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/initializerWarningHelper.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _initializerWarningHelper(descriptor, context) {
-  throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/instanceof.js b/node_modules/@babel/runtime-corejs3/helpers/esm/instanceof.js
deleted file mode 100644
index 3769adc..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/instanceof.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import _Symbol$hasInstance from "../../core-js/symbol/has-instance";
-import _Symbol from "../../core-js/symbol";
-export default function _instanceof(left, right) {
-  if (right != null && typeof _Symbol !== "undefined" && right[_Symbol$hasInstance]) {
-    return !!right[_Symbol$hasInstance](left);
-  } else {
-    return left instanceof right;
-  }
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/interopRequireDefault.js b/node_modules/@babel/runtime-corejs3/helpers/esm/interopRequireDefault.js
deleted file mode 100644
index c2df7b6..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/interopRequireDefault.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function _interopRequireDefault(obj) {
-  return obj && obj.__esModule ? obj : {
-    "default": obj
-  };
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/interopRequireWildcard.js b/node_modules/@babel/runtime-corejs3/helpers/esm/interopRequireWildcard.js
deleted file mode 100644
index a51ab4d..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/interopRequireWildcard.js
+++ /dev/null
@@ -1,56 +0,0 @@
-import _Object$getOwnPropertyDescriptor from "../../core-js/object/get-own-property-descriptor";
-import _Object$defineProperty from "../../core-js/object/define-property";
-import _typeof from "../../helpers/esm/typeof";
-import _WeakMap from "../../core-js/weak-map";
-
-function _getRequireWildcardCache() {
-  if (typeof _WeakMap !== "function") return null;
-  var cache = new _WeakMap();
-
-  _getRequireWildcardCache = function _getRequireWildcardCache() {
-    return cache;
-  };
-
-  return cache;
-}
-
-export default function _interopRequireWildcard(obj) {
-  if (obj && obj.__esModule) {
-    return obj;
-  }
-
-  if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") {
-    return {
-      "default": obj
-    };
-  }
-
-  var cache = _getRequireWildcardCache();
-
-  if (cache && cache.has(obj)) {
-    return cache.get(obj);
-  }
-
-  var newObj = {};
-  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;
-
-  for (var key in obj) {
-    if (Object.prototype.hasOwnProperty.call(obj, key)) {
-      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;
-
-      if (desc && (desc.get || desc.set)) {
-        _Object$defineProperty(newObj, key, desc);
-      } else {
-        newObj[key] = obj[key];
-      }
-    }
-  }
-
-  newObj["default"] = obj;
-
-  if (cache) {
-    cache.set(obj, newObj);
-  }
-
-  return newObj;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/isNativeFunction.js b/node_modules/@babel/runtime-corejs3/helpers/esm/isNativeFunction.js
deleted file mode 100644
index 102a53a..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/isNativeFunction.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import _indexOfInstanceProperty from "../../core-js/instance/index-of";
-export default function _isNativeFunction(fn) {
-  var _context;
-
-  return _indexOfInstanceProperty(_context = Function.toString.call(fn)).call(_context, "[native code]") !== -1;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/iterableToArray.js b/node_modules/@babel/runtime-corejs3/helpers/esm/iterableToArray.js
deleted file mode 100644
index 9f20ecd..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/iterableToArray.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import _Array$from from "../../core-js/array/from";
-import _isIterable from "../../core-js/is-iterable";
-export default function _iterableToArray(iter) {
-  if (_isIterable(Object(iter)) || Object.prototype.toString.call(iter) === "[object Arguments]") return _Array$from(iter);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/iterableToArrayLimit.js b/node_modules/@babel/runtime-corejs3/helpers/esm/iterableToArrayLimit.js
deleted file mode 100644
index 748cf7b..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/iterableToArrayLimit.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import _getIterator from "../../core-js/get-iterator";
-import _isIterable from "../../core-js/is-iterable";
-export default function _iterableToArrayLimit(arr, i) {
-  if (!(_isIterable(Object(arr)) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
-    return;
-  }
-
-  var _arr = [];
-  var _n = true;
-  var _d = false;
-  var _e = undefined;
-
-  try {
-    for (var _i = _getIterator(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {
-      _arr.push(_s.value);
-
-      if (i && _arr.length === i) break;
-    }
-  } catch (err) {
-    _d = true;
-    _e = err;
-  } finally {
-    try {
-      if (!_n && _i["return"] != null) _i["return"]();
-    } finally {
-      if (_d) throw _e;
-    }
-  }
-
-  return _arr;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/iterableToArrayLimitLoose.js b/node_modules/@babel/runtime-corejs3/helpers/esm/iterableToArrayLimitLoose.js
deleted file mode 100644
index 13b8ff9..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/iterableToArrayLimitLoose.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import _getIterator from "../../core-js/get-iterator";
-import _isIterable from "../../core-js/is-iterable";
-export default function _iterableToArrayLimitLoose(arr, i) {
-  if (!(_isIterable(Object(arr)) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
-    return;
-  }
-
-  var _arr = [];
-
-  for (var _iterator = _getIterator(arr), _step; !(_step = _iterator.next()).done;) {
-    _arr.push(_step.value);
-
-    if (i && _arr.length === i) break;
-  }
-
-  return _arr;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/jsx.js b/node_modules/@babel/runtime-corejs3/helpers/esm/jsx.js
deleted file mode 100644
index 6a6f5db..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/jsx.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import _Symbol$for from "../../core-js/symbol/for";
-import _Symbol from "../../core-js/symbol";
-var REACT_ELEMENT_TYPE;
-export default function _createRawReactElement(type, props, key, children) {
-  if (!REACT_ELEMENT_TYPE) {
-    REACT_ELEMENT_TYPE = typeof _Symbol === "function" && _Symbol$for && _Symbol$for("react.element") || 0xeac7;
-  }
-
-  var defaultProps = type && type.defaultProps;
-  var childrenLength = arguments.length - 3;
-
-  if (!props && childrenLength !== 0) {
-    props = {
-      children: void 0
-    };
-  }
-
-  if (childrenLength === 1) {
-    props.children = children;
-  } else if (childrenLength > 1) {
-    var childArray = new Array(childrenLength);
-
-    for (var i = 0; i < childrenLength; i++) {
-      childArray[i] = arguments[i + 3];
-    }
-
-    props.children = childArray;
-  }
-
-  if (props && defaultProps) {
-    for (var propName in defaultProps) {
-      if (props[propName] === void 0) {
-        props[propName] = defaultProps[propName];
-      }
-    }
-  } else if (!props) {
-    props = defaultProps || {};
-  }
-
-  return {
-    $$typeof: REACT_ELEMENT_TYPE,
-    type: type,
-    key: key === undefined ? null : '' + key,
-    ref: null,
-    props: props,
-    _owner: null
-  };
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/newArrowCheck.js b/node_modules/@babel/runtime-corejs3/helpers/esm/newArrowCheck.js
deleted file mode 100644
index d6cd864..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/newArrowCheck.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function _newArrowCheck(innerThis, boundThis) {
-  if (innerThis !== boundThis) {
-    throw new TypeError("Cannot instantiate an arrow function");
-  }
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/nonIterableRest.js b/node_modules/@babel/runtime-corejs3/helpers/esm/nonIterableRest.js
deleted file mode 100644
index f94186d..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/nonIterableRest.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _nonIterableRest() {
-  throw new TypeError("Invalid attempt to destructure non-iterable instance");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/nonIterableSpread.js b/node_modules/@babel/runtime-corejs3/helpers/esm/nonIterableSpread.js
deleted file mode 100644
index d6bc738..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/nonIterableSpread.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _nonIterableSpread() {
-  throw new TypeError("Invalid attempt to spread non-iterable instance");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/objectDestructuringEmpty.js b/node_modules/@babel/runtime-corejs3/helpers/esm/objectDestructuringEmpty.js
deleted file mode 100644
index 82b67d2..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/objectDestructuringEmpty.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _objectDestructuringEmpty(obj) {
-  if (obj == null) throw new TypeError("Cannot destructure undefined");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/objectSpread.js b/node_modules/@babel/runtime-corejs3/helpers/esm/objectSpread.js
deleted file mode 100644
index 50bb9ca..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/objectSpread.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import _forEachInstanceProperty from "../../core-js/instance/for-each";
-import _Object$getOwnPropertyDescriptor from "../../core-js/object/get-own-property-descriptor";
-import _filterInstanceProperty from "../../core-js/instance/filter";
-import _concatInstanceProperty from "../../core-js/instance/concat";
-import _Object$getOwnPropertySymbols from "../../core-js/object/get-own-property-symbols";
-import _Object$keys from "../../core-js/object/keys";
-import defineProperty from "./defineProperty";
-export default function _objectSpread(target) {
-  for (var i = 1; i < arguments.length; i++) {
-    var source = arguments[i] != null ? Object(arguments[i]) : {};
-
-    var ownKeys = _Object$keys(source);
-
-    if (typeof _Object$getOwnPropertySymbols === 'function') {
-      var _context;
-
-      ownKeys = _concatInstanceProperty(ownKeys).call(ownKeys, _filterInstanceProperty(_context = _Object$getOwnPropertySymbols(source)).call(_context, function (sym) {
-        return _Object$getOwnPropertyDescriptor(source, sym).enumerable;
-      }));
-    }
-
-    _forEachInstanceProperty(ownKeys).call(ownKeys, function (key) {
-      defineProperty(target, key, source[key]);
-    });
-  }
-
-  return target;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/objectSpread2.js b/node_modules/@babel/runtime-corejs3/helpers/esm/objectSpread2.js
deleted file mode 100644
index e203c5e..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/objectSpread2.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import _Object$defineProperty from "../../core-js/object/define-property";
-import _Object$defineProperties from "../../core-js/object/define-properties";
-import _Object$getOwnPropertyDescriptors from "../../core-js/object/get-own-property-descriptors";
-import _forEachInstanceProperty from "../../core-js/instance/for-each";
-import _Object$getOwnPropertyDescriptor from "../../core-js/object/get-own-property-descriptor";
-import _filterInstanceProperty from "../../core-js/instance/filter";
-import _Object$getOwnPropertySymbols from "../../core-js/object/get-own-property-symbols";
-import _Object$keys from "../../core-js/object/keys";
-import defineProperty from "./defineProperty";
-
-function ownKeys(object, enumerableOnly) {
-  var keys = _Object$keys(object);
-
-  if (_Object$getOwnPropertySymbols) {
-    var symbols = _Object$getOwnPropertySymbols(object);
-
-    if (enumerableOnly) symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
-      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
-    });
-    keys.push.apply(keys, symbols);
-  }
-
-  return keys;
-}
-
-export default function _objectSpread2(target) {
-  for (var i = 1; i < arguments.length; i++) {
-    var source = arguments[i] != null ? arguments[i] : {};
-
-    if (i % 2) {
-      var _context;
-
-      _forEachInstanceProperty(_context = ownKeys(Object(source), true)).call(_context, function (key) {
-        defineProperty(target, key, source[key]);
-      });
-    } else if (_Object$getOwnPropertyDescriptors) {
-      _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source));
-    } else {
-      var _context2;
-
-      _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) {
-        _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
-      });
-    }
-  }
-
-  return target;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/objectWithoutProperties.js b/node_modules/@babel/runtime-corejs3/helpers/esm/objectWithoutProperties.js
deleted file mode 100644
index 04df2e1..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/objectWithoutProperties.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import _indexOfInstanceProperty from "../../core-js/instance/index-of";
-import _Object$getOwnPropertySymbols from "../../core-js/object/get-own-property-symbols";
-import objectWithoutPropertiesLoose from "./objectWithoutPropertiesLoose";
-export default function _objectWithoutProperties(source, excluded) {
-  if (source == null) return {};
-  var target = objectWithoutPropertiesLoose(source, excluded);
-  var key, i;
-
-  if (_Object$getOwnPropertySymbols) {
-    var sourceSymbolKeys = _Object$getOwnPropertySymbols(source);
-
-    for (i = 0; i < sourceSymbolKeys.length; i++) {
-      key = sourceSymbolKeys[i];
-      if (_indexOfInstanceProperty(excluded).call(excluded, key) >= 0) continue;
-      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
-      target[key] = source[key];
-    }
-  }
-
-  return target;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/objectWithoutPropertiesLoose.js b/node_modules/@babel/runtime-corejs3/helpers/esm/objectWithoutPropertiesLoose.js
deleted file mode 100644
index 6518d0b..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/objectWithoutPropertiesLoose.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import _indexOfInstanceProperty from "../../core-js/instance/index-of";
-import _Object$keys from "../../core-js/object/keys";
-export default function _objectWithoutPropertiesLoose(source, excluded) {
-  if (source == null) return {};
-  var target = {};
-
-  var sourceKeys = _Object$keys(source);
-
-  var key, i;
-
-  for (i = 0; i < sourceKeys.length; i++) {
-    key = sourceKeys[i];
-    if (_indexOfInstanceProperty(excluded).call(excluded, key) >= 0) continue;
-    target[key] = source[key];
-  }
-
-  return target;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/package.json b/node_modules/@babel/runtime-corejs3/helpers/esm/package.json
deleted file mode 100644
index aead43d..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/package.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "type": "module"
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/possibleConstructorReturn.js b/node_modules/@babel/runtime-corejs3/helpers/esm/possibleConstructorReturn.js
deleted file mode 100644
index be7b7a4..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/possibleConstructorReturn.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import _typeof from "../../helpers/esm/typeof";
-import assertThisInitialized from "./assertThisInitialized";
-export default function _possibleConstructorReturn(self, call) {
-  if (call && (_typeof(call) === "object" || typeof call === "function")) {
-    return call;
-  }
-
-  return assertThisInitialized(self);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/readOnlyError.js b/node_modules/@babel/runtime-corejs3/helpers/esm/readOnlyError.js
deleted file mode 100644
index 45d01d7..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/readOnlyError.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _readOnlyError(name) {
-  throw new Error("\"" + name + "\" is read-only");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/set.js b/node_modules/@babel/runtime-corejs3/helpers/esm/set.js
deleted file mode 100644
index 7a5a804..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/set.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import _Object$defineProperty from "../../core-js/object/define-property";
-import _Object$getOwnPropertyDescriptor from "../../core-js/object/get-own-property-descriptor";
-import _Reflect$set from "../../core-js/reflect/set";
-import superPropBase from "./superPropBase";
-import defineProperty from "./defineProperty";
-
-function set(target, property, value, receiver) {
-  if (typeof Reflect !== "undefined" && _Reflect$set) {
-    set = _Reflect$set;
-  } else {
-    set = function set(target, property, value, receiver) {
-      var base = superPropBase(target, property);
-      var desc;
-
-      if (base) {
-        desc = _Object$getOwnPropertyDescriptor(base, property);
-
-        if (desc.set) {
-          desc.set.call(receiver, value);
-          return true;
-        } else if (!desc.writable) {
-          return false;
-        }
-      }
-
-      desc = _Object$getOwnPropertyDescriptor(receiver, property);
-
-      if (desc) {
-        if (!desc.writable) {
-          return false;
-        }
-
-        desc.value = value;
-
-        _Object$defineProperty(receiver, property, desc);
-      } else {
-        defineProperty(receiver, property, value);
-      }
-
-      return true;
-    };
-  }
-
-  return set(target, property, value, receiver);
-}
-
-export default function _set(target, property, value, receiver, isStrict) {
-  var s = set(target, property, value, receiver || target);
-
-  if (!s && isStrict) {
-    throw new Error('failed to set property');
-  }
-
-  return value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/setPrototypeOf.js b/node_modules/@babel/runtime-corejs3/helpers/esm/setPrototypeOf.js
deleted file mode 100644
index 56682d5..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/setPrototypeOf.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import _Object$setPrototypeOf from "../../core-js/object/set-prototype-of";
-export default function _setPrototypeOf(o, p) {
-  _setPrototypeOf = _Object$setPrototypeOf || function _setPrototypeOf(o, p) {
-    o.__proto__ = p;
-    return o;
-  };
-
-  return _setPrototypeOf(o, p);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/skipFirstGeneratorNext.js b/node_modules/@babel/runtime-corejs3/helpers/esm/skipFirstGeneratorNext.js
deleted file mode 100644
index cadd9bb..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/skipFirstGeneratorNext.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function _skipFirstGeneratorNext(fn) {
-  return function () {
-    var it = fn.apply(this, arguments);
-    it.next();
-    return it;
-  };
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/slicedToArray.js b/node_modules/@babel/runtime-corejs3/helpers/esm/slicedToArray.js
deleted file mode 100644
index f6f1081..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/slicedToArray.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import arrayWithHoles from "./arrayWithHoles";
-import iterableToArrayLimit from "./iterableToArrayLimit";
-import nonIterableRest from "./nonIterableRest";
-export default function _slicedToArray(arr, i) {
-  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/slicedToArrayLoose.js b/node_modules/@babel/runtime-corejs3/helpers/esm/slicedToArrayLoose.js
deleted file mode 100644
index e675789..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/slicedToArrayLoose.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import arrayWithHoles from "./arrayWithHoles";
-import iterableToArrayLimitLoose from "./iterableToArrayLimitLoose";
-import nonIterableRest from "./nonIterableRest";
-export default function _slicedToArrayLoose(arr, i) {
-  return arrayWithHoles(arr) || iterableToArrayLimitLoose(arr, i) || nonIterableRest();
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/superPropBase.js b/node_modules/@babel/runtime-corejs3/helpers/esm/superPropBase.js
deleted file mode 100644
index eace947..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/superPropBase.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import getPrototypeOf from "./getPrototypeOf";
-export default function _superPropBase(object, property) {
-  while (!Object.prototype.hasOwnProperty.call(object, property)) {
-    object = getPrototypeOf(object);
-    if (object === null) break;
-  }
-
-  return object;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/taggedTemplateLiteral.js b/node_modules/@babel/runtime-corejs3/helpers/esm/taggedTemplateLiteral.js
deleted file mode 100644
index d29648a..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/taggedTemplateLiteral.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import _Object$defineProperties from "../../core-js/object/define-properties";
-import _Object$freeze from "../../core-js/object/freeze";
-import _sliceInstanceProperty from "../../core-js/instance/slice";
-export default function _taggedTemplateLiteral(strings, raw) {
-  if (!raw) {
-    raw = _sliceInstanceProperty(strings).call(strings, 0);
-  }
-
-  return _Object$freeze(_Object$defineProperties(strings, {
-    raw: {
-      value: _Object$freeze(raw)
-    }
-  }));
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/taggedTemplateLiteralLoose.js b/node_modules/@babel/runtime-corejs3/helpers/esm/taggedTemplateLiteralLoose.js
deleted file mode 100644
index cc03511..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/taggedTemplateLiteralLoose.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import _sliceInstanceProperty from "../../core-js/instance/slice";
-export default function _taggedTemplateLiteralLoose(strings, raw) {
-  if (!raw) {
-    raw = _sliceInstanceProperty(strings).call(strings, 0);
-  }
-
-  strings.raw = raw;
-  return strings;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/tdz.js b/node_modules/@babel/runtime-corejs3/helpers/esm/tdz.js
deleted file mode 100644
index d5d0adc..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/tdz.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _tdzError(name) {
-  throw new ReferenceError(name + " is not defined - temporal dead zone");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/temporalRef.js b/node_modules/@babel/runtime-corejs3/helpers/esm/temporalRef.js
deleted file mode 100644
index 6d167a3..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/temporalRef.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import undef from "./temporalUndefined";
-import err from "./tdz";
-export default function _temporalRef(val, name) {
-  return val === undef ? err(name) : val;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/temporalUndefined.js b/node_modules/@babel/runtime-corejs3/helpers/esm/temporalUndefined.js
deleted file mode 100644
index 1a35717..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/temporalUndefined.js
+++ /dev/null
@@ -1 +0,0 @@
-export default function _temporalUndefined() {}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/toArray.js b/node_modules/@babel/runtime-corejs3/helpers/esm/toArray.js
deleted file mode 100644
index 5acb22b..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/toArray.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import arrayWithHoles from "./arrayWithHoles";
-import iterableToArray from "./iterableToArray";
-import nonIterableRest from "./nonIterableRest";
-export default function _toArray(arr) {
-  return arrayWithHoles(arr) || iterableToArray(arr) || nonIterableRest();
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/toConsumableArray.js b/node_modules/@babel/runtime-corejs3/helpers/esm/toConsumableArray.js
deleted file mode 100644
index 7e480b9..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/toConsumableArray.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import arrayWithoutHoles from "./arrayWithoutHoles";
-import iterableToArray from "./iterableToArray";
-import nonIterableSpread from "./nonIterableSpread";
-export default function _toConsumableArray(arr) {
-  return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/toPrimitive.js b/node_modules/@babel/runtime-corejs3/helpers/esm/toPrimitive.js
deleted file mode 100644
index ddfb41e..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/toPrimitive.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import _Symbol$toPrimitive from "../../core-js/symbol/to-primitive";
-import _typeof from "../../helpers/esm/typeof";
-export default function _toPrimitive(input, hint) {
-  if (_typeof(input) !== "object" || input === null) return input;
-  var prim = input[_Symbol$toPrimitive];
-
-  if (prim !== undefined) {
-    var res = prim.call(input, hint || "default");
-    if (_typeof(res) !== "object") return res;
-    throw new TypeError("@@toPrimitive must return a primitive value.");
-  }
-
-  return (hint === "string" ? String : Number)(input);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/toPropertyKey.js b/node_modules/@babel/runtime-corejs3/helpers/esm/toPropertyKey.js
deleted file mode 100644
index 7b53a4d..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/toPropertyKey.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import _typeof from "../../helpers/esm/typeof";
-import toPrimitive from "./toPrimitive";
-export default function _toPropertyKey(arg) {
-  var key = toPrimitive(arg, "string");
-  return _typeof(key) === "symbol" ? key : String(key);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/typeof.js b/node_modules/@babel/runtime-corejs3/helpers/esm/typeof.js
deleted file mode 100644
index 499dd0c..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/typeof.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import _Symbol$iterator from "../../core-js/symbol/iterator";
-import _Symbol from "../../core-js/symbol";
-export default function _typeof(obj) {
-  "@babel/helpers - typeof";
-
-  if (typeof _Symbol === "function" && typeof _Symbol$iterator === "symbol") {
-    _typeof = function _typeof(obj) {
-      return typeof obj;
-    };
-  } else {
-    _typeof = function _typeof(obj) {
-      return obj && typeof _Symbol === "function" && obj.constructor === _Symbol && obj !== _Symbol.prototype ? "symbol" : typeof obj;
-    };
-  }
-
-  return _typeof(obj);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/wrapAsyncGenerator.js b/node_modules/@babel/runtime-corejs3/helpers/esm/wrapAsyncGenerator.js
deleted file mode 100644
index 6d6d981..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/wrapAsyncGenerator.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import AsyncGenerator from "./AsyncGenerator";
-export default function _wrapAsyncGenerator(fn) {
-  return function () {
-    return new AsyncGenerator(fn.apply(this, arguments));
-  };
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/wrapNativeSuper.js b/node_modules/@babel/runtime-corejs3/helpers/esm/wrapNativeSuper.js
deleted file mode 100644
index c2778d8..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/wrapNativeSuper.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import _Object$create from "../../core-js/object/create";
-import _Map from "../../core-js/map";
-import getPrototypeOf from "./getPrototypeOf";
-import setPrototypeOf from "./setPrototypeOf";
-import isNativeFunction from "./isNativeFunction";
-import construct from "./construct";
-export default function _wrapNativeSuper(Class) {
-  var _cache = typeof _Map === "function" ? new _Map() : undefined;
-
-  _wrapNativeSuper = function _wrapNativeSuper(Class) {
-    if (Class === null || !isNativeFunction(Class)) return Class;
-
-    if (typeof Class !== "function") {
-      throw new TypeError("Super expression must either be null or a function");
-    }
-
-    if (typeof _cache !== "undefined") {
-      if (_cache.has(Class)) return _cache.get(Class);
-
-      _cache.set(Class, Wrapper);
-    }
-
-    function Wrapper() {
-      return construct(Class, arguments, getPrototypeOf(this).constructor);
-    }
-
-    Wrapper.prototype = _Object$create(Class.prototype, {
-      constructor: {
-        value: Wrapper,
-        enumerable: false,
-        writable: true,
-        configurable: true
-      }
-    });
-    return setPrototypeOf(Wrapper, Class);
-  };
-
-  return _wrapNativeSuper(Class);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/esm/wrapRegExp.js b/node_modules/@babel/runtime-corejs3/helpers/esm/wrapRegExp.js
deleted file mode 100644
index 8b32bac..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/esm/wrapRegExp.js
+++ /dev/null
@@ -1,76 +0,0 @@
-import _Object$create from "../../core-js/object/create";
-import _Object$keys from "../../core-js/object/keys";
-import _reduceInstanceProperty from "../../core-js/instance/reduce";
-import _typeof from "../../helpers/esm/typeof";
-import _Symbol$replace from "../../core-js/symbol/replace";
-import _WeakMap from "../../core-js/weak-map";
-import wrapNativeSuper from "./wrapNativeSuper";
-import getPrototypeOf from "./getPrototypeOf";
-import possibleConstructorReturn from "./possibleConstructorReturn";
-import inherits from "./inherits";
-export default function _wrapRegExp(re, groups) {
-  _wrapRegExp = function _wrapRegExp(re, groups) {
-    return new BabelRegExp(re, undefined, groups);
-  };
-
-  var _RegExp = wrapNativeSuper(RegExp);
-
-  var _super = RegExp.prototype;
-
-  var _groups = new _WeakMap();
-
-  function BabelRegExp(re, flags, groups) {
-    var _this = _RegExp.call(this, re, flags);
-
-    _groups.set(_this, groups || _groups.get(re));
-
-    return _this;
-  }
-
-  inherits(BabelRegExp, _RegExp);
-
-  BabelRegExp.prototype.exec = function (str) {
-    var result = _super.exec.call(this, str);
-
-    if (result) result.groups = buildGroups(result, this);
-    return result;
-  };
-
-  BabelRegExp.prototype[_Symbol$replace] = function (str, substitution) {
-    if (typeof substitution === "string") {
-      var groups = _groups.get(this);
-
-      return _super[_Symbol$replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
-        return "$" + groups[name];
-      }));
-    } else if (typeof substitution === "function") {
-      var _this = this;
-
-      return _super[_Symbol$replace].call(this, str, function () {
-        var args = [];
-        args.push.apply(args, arguments);
-
-        if (_typeof(args[args.length - 1]) !== "object") {
-          args.push(buildGroups(args, _this));
-        }
-
-        return substitution.apply(this, args);
-      });
-    } else {
-      return _super[_Symbol$replace].call(this, str, substitution);
-    }
-  };
-
-  function buildGroups(result, re) {
-    var _context;
-
-    var g = _groups.get(re);
-
-    return _reduceInstanceProperty(_context = _Object$keys(g)).call(_context, function (groups, name) {
-      groups[name] = result[g[name]];
-      return groups;
-    }, _Object$create(null));
-  }
-
-  return _wrapRegExp.apply(this, arguments);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/extends.js b/node_modules/@babel/runtime-corejs3/helpers/extends.js
deleted file mode 100644
index 7327dea..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/extends.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var _Object$assign = require("../core-js/object/assign");
-
-function _extends() {
-  module.exports = _extends = _Object$assign || function (target) {
-    for (var i = 1; i < arguments.length; i++) {
-      var source = arguments[i];
-
-      for (var key in source) {
-        if (Object.prototype.hasOwnProperty.call(source, key)) {
-          target[key] = source[key];
-        }
-      }
-    }
-
-    return target;
-  };
-
-  return _extends.apply(this, arguments);
-}
-
-module.exports = _extends;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/get.js b/node_modules/@babel/runtime-corejs3/helpers/get.js
deleted file mode 100644
index a51e99d..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/get.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var _Object$getOwnPropertyDescriptor = require("../core-js/object/get-own-property-descriptor");
-
-var _Reflect$get = require("../core-js/reflect/get");
-
-var superPropBase = require("./superPropBase");
-
-function _get(target, property, receiver) {
-  if (typeof Reflect !== "undefined" && _Reflect$get) {
-    module.exports = _get = _Reflect$get;
-  } else {
-    module.exports = _get = function _get(target, property, receiver) {
-      var base = superPropBase(target, property);
-      if (!base) return;
-
-      var desc = _Object$getOwnPropertyDescriptor(base, property);
-
-      if (desc.get) {
-        return desc.get.call(receiver);
-      }
-
-      return desc.value;
-    };
-  }
-
-  return _get(target, property, receiver || target);
-}
-
-module.exports = _get;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js b/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js
deleted file mode 100644
index ac8d552..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/getPrototypeOf.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var _Object$getPrototypeOf = require("../core-js/object/get-prototype-of");
-
-var _Object$setPrototypeOf = require("../core-js/object/set-prototype-of");
-
-function _getPrototypeOf(o) {
-  module.exports = _getPrototypeOf = _Object$setPrototypeOf ? _Object$getPrototypeOf : function _getPrototypeOf(o) {
-    return o.__proto__ || _Object$getPrototypeOf(o);
-  };
-  return _getPrototypeOf(o);
-}
-
-module.exports = _getPrototypeOf;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/inherits.js b/node_modules/@babel/runtime-corejs3/helpers/inherits.js
deleted file mode 100644
index 4540e02..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/inherits.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var _Object$create = require("../core-js/object/create");
-
-var setPrototypeOf = require("./setPrototypeOf");
-
-function _inherits(subClass, superClass) {
-  if (typeof superClass !== "function" && superClass !== null) {
-    throw new TypeError("Super expression must either be null or a function");
-  }
-
-  subClass.prototype = _Object$create(superClass && superClass.prototype, {
-    constructor: {
-      value: subClass,
-      writable: true,
-      configurable: true
-    }
-  });
-  if (superClass) setPrototypeOf(subClass, superClass);
-}
-
-module.exports = _inherits;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/inheritsLoose.js b/node_modules/@babel/runtime-corejs3/helpers/inheritsLoose.js
deleted file mode 100644
index bb367a5..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/inheritsLoose.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var _Object$create = require("../core-js/object/create");
-
-function _inheritsLoose(subClass, superClass) {
-  subClass.prototype = _Object$create(superClass.prototype);
-  subClass.prototype.constructor = subClass;
-  subClass.__proto__ = superClass;
-}
-
-module.exports = _inheritsLoose;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/initializerDefineProperty.js b/node_modules/@babel/runtime-corejs3/helpers/initializerDefineProperty.js
deleted file mode 100644
index c0b86d9..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/initializerDefineProperty.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var _Object$defineProperty = require("../core-js/object/define-property");
-
-function _initializerDefineProperty(target, property, descriptor, context) {
-  if (!descriptor) return;
-
-  _Object$defineProperty(target, property, {
-    enumerable: descriptor.enumerable,
-    configurable: descriptor.configurable,
-    writable: descriptor.writable,
-    value: descriptor.initializer ? descriptor.initializer.call(context) : void 0
-  });
-}
-
-module.exports = _initializerDefineProperty;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/initializerWarningHelper.js b/node_modules/@babel/runtime-corejs3/helpers/initializerWarningHelper.js
deleted file mode 100644
index 50ec82c..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/initializerWarningHelper.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _initializerWarningHelper(descriptor, context) {
-  throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');
-}
-
-module.exports = _initializerWarningHelper;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/instanceof.js b/node_modules/@babel/runtime-corejs3/helpers/instanceof.js
deleted file mode 100644
index 9ccb3f6..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/instanceof.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var _Symbol$hasInstance = require("../core-js/symbol/has-instance");
-
-var _Symbol = require("../core-js/symbol");
-
-function _instanceof(left, right) {
-  if (right != null && typeof _Symbol !== "undefined" && right[_Symbol$hasInstance]) {
-    return !!right[_Symbol$hasInstance](left);
-  } else {
-    return left instanceof right;
-  }
-}
-
-module.exports = _instanceof;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js b/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js
deleted file mode 100644
index f713d13..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/interopRequireDefault.js
+++ /dev/null
@@ -1,7 +0,0 @@
-function _interopRequireDefault(obj) {
-  return obj && obj.__esModule ? obj : {
-    "default": obj
-  };
-}
-
-module.exports = _interopRequireDefault;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/interopRequireWildcard.js b/node_modules/@babel/runtime-corejs3/helpers/interopRequireWildcard.js
deleted file mode 100644
index 812a934..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/interopRequireWildcard.js
+++ /dev/null
@@ -1,61 +0,0 @@
-var _Object$getOwnPropertyDescriptor = require("../core-js/object/get-own-property-descriptor");
-
-var _Object$defineProperty = require("../core-js/object/define-property");
-
-var _typeof = require("../helpers/typeof");
-
-var _WeakMap = require("../core-js/weak-map");
-
-function _getRequireWildcardCache() {
-  if (typeof _WeakMap !== "function") return null;
-  var cache = new _WeakMap();
-
-  _getRequireWildcardCache = function _getRequireWildcardCache() {
-    return cache;
-  };
-
-  return cache;
-}
-
-function _interopRequireWildcard(obj) {
-  if (obj && obj.__esModule) {
-    return obj;
-  }
-
-  if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") {
-    return {
-      "default": obj
-    };
-  }
-
-  var cache = _getRequireWildcardCache();
-
-  if (cache && cache.has(obj)) {
-    return cache.get(obj);
-  }
-
-  var newObj = {};
-  var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor;
-
-  for (var key in obj) {
-    if (Object.prototype.hasOwnProperty.call(obj, key)) {
-      var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null;
-
-      if (desc && (desc.get || desc.set)) {
-        _Object$defineProperty(newObj, key, desc);
-      } else {
-        newObj[key] = obj[key];
-      }
-    }
-  }
-
-  newObj["default"] = obj;
-
-  if (cache) {
-    cache.set(obj, newObj);
-  }
-
-  return newObj;
-}
-
-module.exports = _interopRequireWildcard;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/isNativeFunction.js b/node_modules/@babel/runtime-corejs3/helpers/isNativeFunction.js
deleted file mode 100644
index 5f44eb5..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/isNativeFunction.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var _indexOfInstanceProperty = require("../core-js/instance/index-of");
-
-function _isNativeFunction(fn) {
-  var _context;
-
-  return _indexOfInstanceProperty(_context = Function.toString.call(fn)).call(_context, "[native code]") !== -1;
-}
-
-module.exports = _isNativeFunction;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/iterableToArray.js b/node_modules/@babel/runtime-corejs3/helpers/iterableToArray.js
deleted file mode 100644
index c7834a3..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/iterableToArray.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var _Array$from = require("../core-js/array/from");
-
-var _isIterable = require("../core-js/is-iterable");
-
-function _iterableToArray(iter) {
-  if (_isIterable(Object(iter)) || Object.prototype.toString.call(iter) === "[object Arguments]") return _Array$from(iter);
-}
-
-module.exports = _iterableToArray;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/iterableToArrayLimit.js b/node_modules/@babel/runtime-corejs3/helpers/iterableToArrayLimit.js
deleted file mode 100644
index c52fd5e..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/iterableToArrayLimit.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var _getIterator = require("../core-js/get-iterator");
-
-var _isIterable = require("../core-js/is-iterable");
-
-function _iterableToArrayLimit(arr, i) {
-  if (!(_isIterable(Object(arr)) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
-    return;
-  }
-
-  var _arr = [];
-  var _n = true;
-  var _d = false;
-  var _e = undefined;
-
-  try {
-    for (var _i = _getIterator(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {
-      _arr.push(_s.value);
-
-      if (i && _arr.length === i) break;
-    }
-  } catch (err) {
-    _d = true;
-    _e = err;
-  } finally {
-    try {
-      if (!_n && _i["return"] != null) _i["return"]();
-    } finally {
-      if (_d) throw _e;
-    }
-  }
-
-  return _arr;
-}
-
-module.exports = _iterableToArrayLimit;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/iterableToArrayLimitLoose.js b/node_modules/@babel/runtime-corejs3/helpers/iterableToArrayLimitLoose.js
deleted file mode 100644
index 326d8dd..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/iterableToArrayLimitLoose.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var _getIterator = require("../core-js/get-iterator");
-
-var _isIterable = require("../core-js/is-iterable");
-
-function _iterableToArrayLimitLoose(arr, i) {
-  if (!(_isIterable(Object(arr)) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
-    return;
-  }
-
-  var _arr = [];
-
-  for (var _iterator = _getIterator(arr), _step; !(_step = _iterator.next()).done;) {
-    _arr.push(_step.value);
-
-    if (i && _arr.length === i) break;
-  }
-
-  return _arr;
-}
-
-module.exports = _iterableToArrayLimitLoose;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/jsx.js b/node_modules/@babel/runtime-corejs3/helpers/jsx.js
deleted file mode 100644
index 6b72de2..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/jsx.js
+++ /dev/null
@@ -1,53 +0,0 @@
-var _Symbol$for = require("../core-js/symbol/for");
-
-var _Symbol = require("../core-js/symbol");
-
-var REACT_ELEMENT_TYPE;
-
-function _createRawReactElement(type, props, key, children) {
-  if (!REACT_ELEMENT_TYPE) {
-    REACT_ELEMENT_TYPE = typeof _Symbol === "function" && _Symbol$for && _Symbol$for("react.element") || 0xeac7;
-  }
-
-  var defaultProps = type && type.defaultProps;
-  var childrenLength = arguments.length - 3;
-
-  if (!props && childrenLength !== 0) {
-    props = {
-      children: void 0
-    };
-  }
-
-  if (childrenLength === 1) {
-    props.children = children;
-  } else if (childrenLength > 1) {
-    var childArray = new Array(childrenLength);
-
-    for (var i = 0; i < childrenLength; i++) {
-      childArray[i] = arguments[i + 3];
-    }
-
-    props.children = childArray;
-  }
-
-  if (props && defaultProps) {
-    for (var propName in defaultProps) {
-      if (props[propName] === void 0) {
-        props[propName] = defaultProps[propName];
-      }
-    }
-  } else if (!props) {
-    props = defaultProps || {};
-  }
-
-  return {
-    $$typeof: REACT_ELEMENT_TYPE,
-    type: type,
-    key: key === undefined ? null : '' + key,
-    ref: null,
-    props: props,
-    _owner: null
-  };
-}
-
-module.exports = _createRawReactElement;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/newArrowCheck.js b/node_modules/@babel/runtime-corejs3/helpers/newArrowCheck.js
deleted file mode 100644
index 9b59f58..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/newArrowCheck.js
+++ /dev/null
@@ -1,7 +0,0 @@
-function _newArrowCheck(innerThis, boundThis) {
-  if (innerThis !== boundThis) {
-    throw new TypeError("Cannot instantiate an arrow function");
-  }
-}
-
-module.exports = _newArrowCheck;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/nonIterableRest.js b/node_modules/@babel/runtime-corejs3/helpers/nonIterableRest.js
deleted file mode 100644
index eb447dd..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/nonIterableRest.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _nonIterableRest() {
-  throw new TypeError("Invalid attempt to destructure non-iterable instance");
-}
-
-module.exports = _nonIterableRest;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/nonIterableSpread.js b/node_modules/@babel/runtime-corejs3/helpers/nonIterableSpread.js
deleted file mode 100644
index 7d7ca43..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/nonIterableSpread.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _nonIterableSpread() {
-  throw new TypeError("Invalid attempt to spread non-iterable instance");
-}
-
-module.exports = _nonIterableSpread;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/objectDestructuringEmpty.js b/node_modules/@babel/runtime-corejs3/helpers/objectDestructuringEmpty.js
deleted file mode 100644
index 1d5c04a..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/objectDestructuringEmpty.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _objectDestructuringEmpty(obj) {
-  if (obj == null) throw new TypeError("Cannot destructure undefined");
-}
-
-module.exports = _objectDestructuringEmpty;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/objectSpread.js b/node_modules/@babel/runtime-corejs3/helpers/objectSpread.js
deleted file mode 100644
index 09a794a..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/objectSpread.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var _forEachInstanceProperty = require("../core-js/instance/for-each");
-
-var _Object$getOwnPropertyDescriptor = require("../core-js/object/get-own-property-descriptor");
-
-var _filterInstanceProperty = require("../core-js/instance/filter");
-
-var _concatInstanceProperty = require("../core-js/instance/concat");
-
-var _Object$getOwnPropertySymbols = require("../core-js/object/get-own-property-symbols");
-
-var _Object$keys = require("../core-js/object/keys");
-
-var defineProperty = require("./defineProperty");
-
-function _objectSpread(target) {
-  for (var i = 1; i < arguments.length; i++) {
-    var source = arguments[i] != null ? Object(arguments[i]) : {};
-
-    var ownKeys = _Object$keys(source);
-
-    if (typeof _Object$getOwnPropertySymbols === 'function') {
-      var _context;
-
-      ownKeys = _concatInstanceProperty(ownKeys).call(ownKeys, _filterInstanceProperty(_context = _Object$getOwnPropertySymbols(source)).call(_context, function (sym) {
-        return _Object$getOwnPropertyDescriptor(source, sym).enumerable;
-      }));
-    }
-
-    _forEachInstanceProperty(ownKeys).call(ownKeys, function (key) {
-      defineProperty(target, key, source[key]);
-    });
-  }
-
-  return target;
-}
-
-module.exports = _objectSpread;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/objectSpread2.js b/node_modules/@babel/runtime-corejs3/helpers/objectSpread2.js
deleted file mode 100644
index ab4a226..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/objectSpread2.js
+++ /dev/null
@@ -1,58 +0,0 @@
-var _Object$defineProperty = require("../core-js/object/define-property");
-
-var _Object$defineProperties = require("../core-js/object/define-properties");
-
-var _Object$getOwnPropertyDescriptors = require("../core-js/object/get-own-property-descriptors");
-
-var _forEachInstanceProperty = require("../core-js/instance/for-each");
-
-var _Object$getOwnPropertyDescriptor = require("../core-js/object/get-own-property-descriptor");
-
-var _filterInstanceProperty = require("../core-js/instance/filter");
-
-var _Object$getOwnPropertySymbols = require("../core-js/object/get-own-property-symbols");
-
-var _Object$keys = require("../core-js/object/keys");
-
-var defineProperty = require("./defineProperty");
-
-function ownKeys(object, enumerableOnly) {
-  var keys = _Object$keys(object);
-
-  if (_Object$getOwnPropertySymbols) {
-    var symbols = _Object$getOwnPropertySymbols(object);
-
-    if (enumerableOnly) symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) {
-      return _Object$getOwnPropertyDescriptor(object, sym).enumerable;
-    });
-    keys.push.apply(keys, symbols);
-  }
-
-  return keys;
-}
-
-function _objectSpread2(target) {
-  for (var i = 1; i < arguments.length; i++) {
-    var source = arguments[i] != null ? arguments[i] : {};
-
-    if (i % 2) {
-      var _context;
-
-      _forEachInstanceProperty(_context = ownKeys(Object(source), true)).call(_context, function (key) {
-        defineProperty(target, key, source[key]);
-      });
-    } else if (_Object$getOwnPropertyDescriptors) {
-      _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source));
-    } else {
-      var _context2;
-
-      _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) {
-        _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key));
-      });
-    }
-  }
-
-  return target;
-}
-
-module.exports = _objectSpread2;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/objectWithoutProperties.js b/node_modules/@babel/runtime-corejs3/helpers/objectWithoutProperties.js
deleted file mode 100644
index 85672e2..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/objectWithoutProperties.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var _indexOfInstanceProperty = require("../core-js/instance/index-of");
-
-var _Object$getOwnPropertySymbols = require("../core-js/object/get-own-property-symbols");
-
-var objectWithoutPropertiesLoose = require("./objectWithoutPropertiesLoose");
-
-function _objectWithoutProperties(source, excluded) {
-  if (source == null) return {};
-  var target = objectWithoutPropertiesLoose(source, excluded);
-  var key, i;
-
-  if (_Object$getOwnPropertySymbols) {
-    var sourceSymbolKeys = _Object$getOwnPropertySymbols(source);
-
-    for (i = 0; i < sourceSymbolKeys.length; i++) {
-      key = sourceSymbolKeys[i];
-      if (_indexOfInstanceProperty(excluded).call(excluded, key) >= 0) continue;
-      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
-      target[key] = source[key];
-    }
-  }
-
-  return target;
-}
-
-module.exports = _objectWithoutProperties;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/objectWithoutPropertiesLoose.js b/node_modules/@babel/runtime-corejs3/helpers/objectWithoutPropertiesLoose.js
deleted file mode 100644
index ad79fd4..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/objectWithoutPropertiesLoose.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var _indexOfInstanceProperty = require("../core-js/instance/index-of");
-
-var _Object$keys = require("../core-js/object/keys");
-
-function _objectWithoutPropertiesLoose(source, excluded) {
-  if (source == null) return {};
-  var target = {};
-
-  var sourceKeys = _Object$keys(source);
-
-  var key, i;
-
-  for (i = 0; i < sourceKeys.length; i++) {
-    key = sourceKeys[i];
-    if (_indexOfInstanceProperty(excluded).call(excluded, key) >= 0) continue;
-    target[key] = source[key];
-  }
-
-  return target;
-}
-
-module.exports = _objectWithoutPropertiesLoose;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js b/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js
deleted file mode 100644
index 84f7bf6..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/possibleConstructorReturn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var _typeof = require("../helpers/typeof");
-
-var assertThisInitialized = require("./assertThisInitialized");
-
-function _possibleConstructorReturn(self, call) {
-  if (call && (_typeof(call) === "object" || typeof call === "function")) {
-    return call;
-  }
-
-  return assertThisInitialized(self);
-}
-
-module.exports = _possibleConstructorReturn;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/readOnlyError.js b/node_modules/@babel/runtime-corejs3/helpers/readOnlyError.js
deleted file mode 100644
index 4e61e3f..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/readOnlyError.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _readOnlyError(name) {
-  throw new Error("\"" + name + "\" is read-only");
-}
-
-module.exports = _readOnlyError;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/set.js b/node_modules/@babel/runtime-corejs3/helpers/set.js
deleted file mode 100644
index ca46857..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/set.js
+++ /dev/null
@@ -1,61 +0,0 @@
-var _Object$defineProperty = require("../core-js/object/define-property");
-
-var _Object$getOwnPropertyDescriptor = require("../core-js/object/get-own-property-descriptor");
-
-var _Reflect$set = require("../core-js/reflect/set");
-
-var superPropBase = require("./superPropBase");
-
-var defineProperty = require("./defineProperty");
-
-function set(target, property, value, receiver) {
-  if (typeof Reflect !== "undefined" && _Reflect$set) {
-    set = _Reflect$set;
-  } else {
-    set = function set(target, property, value, receiver) {
-      var base = superPropBase(target, property);
-      var desc;
-
-      if (base) {
-        desc = _Object$getOwnPropertyDescriptor(base, property);
-
-        if (desc.set) {
-          desc.set.call(receiver, value);
-          return true;
-        } else if (!desc.writable) {
-          return false;
-        }
-      }
-
-      desc = _Object$getOwnPropertyDescriptor(receiver, property);
-
-      if (desc) {
-        if (!desc.writable) {
-          return false;
-        }
-
-        desc.value = value;
-
-        _Object$defineProperty(receiver, property, desc);
-      } else {
-        defineProperty(receiver, property, value);
-      }
-
-      return true;
-    };
-  }
-
-  return set(target, property, value, receiver);
-}
-
-function _set(target, property, value, receiver, isStrict) {
-  var s = set(target, property, value, receiver || target);
-
-  if (!s && isStrict) {
-    throw new Error('failed to set property');
-  }
-
-  return value;
-}
-
-module.exports = _set;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/setPrototypeOf.js b/node_modules/@babel/runtime-corejs3/helpers/setPrototypeOf.js
deleted file mode 100644
index ccca1c2..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/setPrototypeOf.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var _Object$setPrototypeOf = require("../core-js/object/set-prototype-of");
-
-function _setPrototypeOf(o, p) {
-  module.exports = _setPrototypeOf = _Object$setPrototypeOf || function _setPrototypeOf(o, p) {
-    o.__proto__ = p;
-    return o;
-  };
-
-  return _setPrototypeOf(o, p);
-}
-
-module.exports = _setPrototypeOf;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/skipFirstGeneratorNext.js b/node_modules/@babel/runtime-corejs3/helpers/skipFirstGeneratorNext.js
deleted file mode 100644
index e1d6c86..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/skipFirstGeneratorNext.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function _skipFirstGeneratorNext(fn) {
-  return function () {
-    var it = fn.apply(this, arguments);
-    it.next();
-    return it;
-  };
-}
-
-module.exports = _skipFirstGeneratorNext;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js b/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js
deleted file mode 100644
index 243ea9e..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/slicedToArray.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var arrayWithHoles = require("./arrayWithHoles");
-
-var iterableToArrayLimit = require("./iterableToArrayLimit");
-
-var nonIterableRest = require("./nonIterableRest");
-
-function _slicedToArray(arr, i) {
-  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();
-}
-
-module.exports = _slicedToArray;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/slicedToArrayLoose.js b/node_modules/@babel/runtime-corejs3/helpers/slicedToArrayLoose.js
deleted file mode 100644
index c7e4313..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/slicedToArrayLoose.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var arrayWithHoles = require("./arrayWithHoles");
-
-var iterableToArrayLimitLoose = require("./iterableToArrayLimitLoose");
-
-var nonIterableRest = require("./nonIterableRest");
-
-function _slicedToArrayLoose(arr, i) {
-  return arrayWithHoles(arr) || iterableToArrayLimitLoose(arr, i) || nonIterableRest();
-}
-
-module.exports = _slicedToArrayLoose;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/superPropBase.js b/node_modules/@babel/runtime-corejs3/helpers/superPropBase.js
deleted file mode 100644
index bbb34a2..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/superPropBase.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var getPrototypeOf = require("./getPrototypeOf");
-
-function _superPropBase(object, property) {
-  while (!Object.prototype.hasOwnProperty.call(object, property)) {
-    object = getPrototypeOf(object);
-    if (object === null) break;
-  }
-
-  return object;
-}
-
-module.exports = _superPropBase;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/taggedTemplateLiteral.js b/node_modules/@babel/runtime-corejs3/helpers/taggedTemplateLiteral.js
deleted file mode 100644
index 6385c66..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/taggedTemplateLiteral.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var _Object$defineProperties = require("../core-js/object/define-properties");
-
-var _Object$freeze = require("../core-js/object/freeze");
-
-var _sliceInstanceProperty = require("../core-js/instance/slice");
-
-function _taggedTemplateLiteral(strings, raw) {
-  if (!raw) {
-    raw = _sliceInstanceProperty(strings).call(strings, 0);
-  }
-
-  return _Object$freeze(_Object$defineProperties(strings, {
-    raw: {
-      value: _Object$freeze(raw)
-    }
-  }));
-}
-
-module.exports = _taggedTemplateLiteral;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/taggedTemplateLiteralLoose.js b/node_modules/@babel/runtime-corejs3/helpers/taggedTemplateLiteralLoose.js
deleted file mode 100644
index 223ab3e..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/taggedTemplateLiteralLoose.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var _sliceInstanceProperty = require("../core-js/instance/slice");
-
-function _taggedTemplateLiteralLoose(strings, raw) {
-  if (!raw) {
-    raw = _sliceInstanceProperty(strings).call(strings, 0);
-  }
-
-  strings.raw = raw;
-  return strings;
-}
-
-module.exports = _taggedTemplateLiteralLoose;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/tdz.js b/node_modules/@babel/runtime-corejs3/helpers/tdz.js
deleted file mode 100644
index 6075e8d..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/tdz.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _tdzError(name) {
-  throw new ReferenceError(name + " is not defined - temporal dead zone");
-}
-
-module.exports = _tdzError;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/temporalRef.js b/node_modules/@babel/runtime-corejs3/helpers/temporalRef.js
deleted file mode 100644
index 8aa5e5e..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/temporalRef.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var temporalUndefined = require("./temporalUndefined");
-
-var tdz = require("./tdz");
-
-function _temporalRef(val, name) {
-  return val === temporalUndefined ? tdz(name) : val;
-}
-
-module.exports = _temporalRef;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/temporalUndefined.js b/node_modules/@babel/runtime-corejs3/helpers/temporalUndefined.js
deleted file mode 100644
index 416d9b3..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/temporalUndefined.js
+++ /dev/null
@@ -1,3 +0,0 @@
-function _temporalUndefined() {}
-
-module.exports = _temporalUndefined;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/toArray.js b/node_modules/@babel/runtime-corejs3/helpers/toArray.js
deleted file mode 100644
index c28fd9e..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/toArray.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var arrayWithHoles = require("./arrayWithHoles");
-
-var iterableToArray = require("./iterableToArray");
-
-var nonIterableRest = require("./nonIterableRest");
-
-function _toArray(arr) {
-  return arrayWithHoles(arr) || iterableToArray(arr) || nonIterableRest();
-}
-
-module.exports = _toArray;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js b/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js
deleted file mode 100644
index 4cd54a3..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/toConsumableArray.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var arrayWithoutHoles = require("./arrayWithoutHoles");
-
-var iterableToArray = require("./iterableToArray");
-
-var nonIterableSpread = require("./nonIterableSpread");
-
-function _toConsumableArray(arr) {
-  return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();
-}
-
-module.exports = _toConsumableArray;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/toPrimitive.js b/node_modules/@babel/runtime-corejs3/helpers/toPrimitive.js
deleted file mode 100644
index 9959204..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/toPrimitive.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var _Symbol$toPrimitive = require("../core-js/symbol/to-primitive");
-
-var _typeof = require("../helpers/typeof");
-
-function _toPrimitive(input, hint) {
-  if (_typeof(input) !== "object" || input === null) return input;
-  var prim = input[_Symbol$toPrimitive];
-
-  if (prim !== undefined) {
-    var res = prim.call(input, hint || "default");
-    if (_typeof(res) !== "object") return res;
-    throw new TypeError("@@toPrimitive must return a primitive value.");
-  }
-
-  return (hint === "string" ? String : Number)(input);
-}
-
-module.exports = _toPrimitive;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/toPropertyKey.js b/node_modules/@babel/runtime-corejs3/helpers/toPropertyKey.js
deleted file mode 100644
index 108b083..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/toPropertyKey.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var _typeof = require("../helpers/typeof");
-
-var toPrimitive = require("./toPrimitive");
-
-function _toPropertyKey(arg) {
-  var key = toPrimitive(arg, "string");
-  return _typeof(key) === "symbol" ? key : String(key);
-}
-
-module.exports = _toPropertyKey;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/typeof.js b/node_modules/@babel/runtime-corejs3/helpers/typeof.js
deleted file mode 100644
index 897af2a..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/typeof.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var _Symbol$iterator = require("../core-js/symbol/iterator");
-
-var _Symbol = require("../core-js/symbol");
-
-function _typeof(obj) {
-  "@babel/helpers - typeof";
-
-  if (typeof _Symbol === "function" && typeof _Symbol$iterator === "symbol") {
-    module.exports = _typeof = function _typeof(obj) {
-      return typeof obj;
-    };
-  } else {
-    module.exports = _typeof = function _typeof(obj) {
-      return obj && typeof _Symbol === "function" && obj.constructor === _Symbol && obj !== _Symbol.prototype ? "symbol" : typeof obj;
-    };
-  }
-
-  return _typeof(obj);
-}
-
-module.exports = _typeof;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/wrapAsyncGenerator.js b/node_modules/@babel/runtime-corejs3/helpers/wrapAsyncGenerator.js
deleted file mode 100644
index 11554f3..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/wrapAsyncGenerator.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var AsyncGenerator = require("./AsyncGenerator");
-
-function _wrapAsyncGenerator(fn) {
-  return function () {
-    return new AsyncGenerator(fn.apply(this, arguments));
-  };
-}
-
-module.exports = _wrapAsyncGenerator;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/wrapNativeSuper.js b/node_modules/@babel/runtime-corejs3/helpers/wrapNativeSuper.js
deleted file mode 100644
index 0d9cb7a..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/wrapNativeSuper.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var _Object$create = require("../core-js/object/create");
-
-var _Map = require("../core-js/map");
-
-var getPrototypeOf = require("./getPrototypeOf");
-
-var setPrototypeOf = require("./setPrototypeOf");
-
-var isNativeFunction = require("./isNativeFunction");
-
-var construct = require("./construct");
-
-function _wrapNativeSuper(Class) {
-  var _cache = typeof _Map === "function" ? new _Map() : undefined;
-
-  module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) {
-    if (Class === null || !isNativeFunction(Class)) return Class;
-
-    if (typeof Class !== "function") {
-      throw new TypeError("Super expression must either be null or a function");
-    }
-
-    if (typeof _cache !== "undefined") {
-      if (_cache.has(Class)) return _cache.get(Class);
-
-      _cache.set(Class, Wrapper);
-    }
-
-    function Wrapper() {
-      return construct(Class, arguments, getPrototypeOf(this).constructor);
-    }
-
-    Wrapper.prototype = _Object$create(Class.prototype, {
-      constructor: {
-        value: Wrapper,
-        enumerable: false,
-        writable: true,
-        configurable: true
-      }
-    });
-    return setPrototypeOf(Wrapper, Class);
-  };
-
-  return _wrapNativeSuper(Class);
-}
-
-module.exports = _wrapNativeSuper;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/helpers/wrapRegExp.js b/node_modules/@babel/runtime-corejs3/helpers/wrapRegExp.js
deleted file mode 100644
index 84c123f..0000000
--- a/node_modules/@babel/runtime-corejs3/helpers/wrapRegExp.js
+++ /dev/null
@@ -1,88 +0,0 @@
-var _Object$create = require("../core-js/object/create");
-
-var _Object$keys = require("../core-js/object/keys");
-
-var _reduceInstanceProperty = require("../core-js/instance/reduce");
-
-var _typeof = require("../helpers/typeof");
-
-var _Symbol$replace = require("../core-js/symbol/replace");
-
-var _WeakMap = require("../core-js/weak-map");
-
-var wrapNativeSuper = require("./wrapNativeSuper");
-
-var getPrototypeOf = require("./getPrototypeOf");
-
-var possibleConstructorReturn = require("./possibleConstructorReturn");
-
-var inherits = require("./inherits");
-
-function _wrapRegExp(re, groups) {
-  module.exports = _wrapRegExp = function _wrapRegExp(re, groups) {
-    return new BabelRegExp(re, undefined, groups);
-  };
-
-  var _RegExp = wrapNativeSuper(RegExp);
-
-  var _super = RegExp.prototype;
-
-  var _groups = new _WeakMap();
-
-  function BabelRegExp(re, flags, groups) {
-    var _this = _RegExp.call(this, re, flags);
-
-    _groups.set(_this, groups || _groups.get(re));
-
-    return _this;
-  }
-
-  inherits(BabelRegExp, _RegExp);
-
-  BabelRegExp.prototype.exec = function (str) {
-    var result = _super.exec.call(this, str);
-
-    if (result) result.groups = buildGroups(result, this);
-    return result;
-  };
-
-  BabelRegExp.prototype[_Symbol$replace] = function (str, substitution) {
-    if (typeof substitution === "string") {
-      var groups = _groups.get(this);
-
-      return _super[_Symbol$replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
-        return "$" + groups[name];
-      }));
-    } else if (typeof substitution === "function") {
-      var _this = this;
-
-      return _super[_Symbol$replace].call(this, str, function () {
-        var args = [];
-        args.push.apply(args, arguments);
-
-        if (_typeof(args[args.length - 1]) !== "object") {
-          args.push(buildGroups(args, _this));
-        }
-
-        return substitution.apply(this, args);
-      });
-    } else {
-      return _super[_Symbol$replace].call(this, str, substitution);
-    }
-  };
-
-  function buildGroups(result, re) {
-    var _context;
-
-    var g = _groups.get(re);
-
-    return _reduceInstanceProperty(_context = _Object$keys(g)).call(_context, function (groups, name) {
-      groups[name] = result[g[name]];
-      return groups;
-    }, _Object$create(null));
-  }
-
-  return _wrapRegExp.apply(this, arguments);
-}
-
-module.exports = _wrapRegExp;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime-corejs3/package.json b/node_modules/@babel/runtime-corejs3/package.json
deleted file mode 100644
index d00f5de..0000000
--- a/node_modules/@babel/runtime-corejs3/package.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "name": "@babel/runtime-corejs3",
-  "version": "7.8.7",
-  "description": "babel's modular runtime helpers with core-js@3 polyfilling",
-  "license": "MIT",
-  "publishConfig": {
-    "access": "public"
-  },
-  "repository": "https://github.com/babel/babel/tree/master/packages/babel-runtime-corejs3",
-  "author": "Denis Pushkarev <zloirock@zloirock.ru>",
-  "dependencies": {
-    "core-js-pure": "^3.0.0",
-    "regenerator-runtime": "^0.13.4"
-  },
-  "gitHead": "595f65f33b8e948e34d12be83f700cf8d070c790"
-}
diff --git a/node_modules/@babel/runtime-corejs3/regenerator/index.js b/node_modules/@babel/runtime-corejs3/regenerator/index.js
deleted file mode 100644
index 9fd4158..0000000
--- a/node_modules/@babel/runtime-corejs3/regenerator/index.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("regenerator-runtime");
diff --git a/node_modules/@babel/runtime/LICENSE b/node_modules/@babel/runtime/LICENSE
deleted file mode 100644
index f31575e..0000000
--- a/node_modules/@babel/runtime/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-MIT License
-
-Copyright (c) 2014-present Sebastian McKenzie and other contributors
-
-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/node_modules/@babel/runtime/README.md b/node_modules/@babel/runtime/README.md
deleted file mode 100644
index 72e8daa..0000000
--- a/node_modules/@babel/runtime/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# @babel/runtime
-
-> babel's modular runtime helpers
-
-See our website [@babel/runtime](https://babeljs.io/docs/en/next/babel-runtime.html) for more information.
-
-## Install
-
-Using npm:
-
-```sh
-npm install --save @babel/runtime
-```
-
-or using yarn:
-
-```sh
-yarn add @babel/runtime 
-```
diff --git a/node_modules/@babel/runtime/helpers/AsyncGenerator.js b/node_modules/@babel/runtime/helpers/AsyncGenerator.js
deleted file mode 100644
index 5e23730..0000000
--- a/node_modules/@babel/runtime/helpers/AsyncGenerator.js
+++ /dev/null
@@ -1,100 +0,0 @@
-var AwaitValue = require("./AwaitValue");
-
-function AsyncGenerator(gen) {
-  var front, back;
-
-  function send(key, arg) {
-    return new Promise(function (resolve, reject) {
-      var request = {
-        key: key,
-        arg: arg,
-        resolve: resolve,
-        reject: reject,
-        next: null
-      };
-
-      if (back) {
-        back = back.next = request;
-      } else {
-        front = back = request;
-        resume(key, arg);
-      }
-    });
-  }
-
-  function resume(key, arg) {
-    try {
-      var result = gen[key](arg);
-      var value = result.value;
-      var wrappedAwait = value instanceof AwaitValue;
-      Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
-        if (wrappedAwait) {
-          resume(key === "return" ? "return" : "next", arg);
-          return;
-        }
-
-        settle(result.done ? "return" : "normal", arg);
-      }, function (err) {
-        resume("throw", err);
-      });
-    } catch (err) {
-      settle("throw", err);
-    }
-  }
-
-  function settle(type, value) {
-    switch (type) {
-      case "return":
-        front.resolve({
-          value: value,
-          done: true
-        });
-        break;
-
-      case "throw":
-        front.reject(value);
-        break;
-
-      default:
-        front.resolve({
-          value: value,
-          done: false
-        });
-        break;
-    }
-
-    front = front.next;
-
-    if (front) {
-      resume(front.key, front.arg);
-    } else {
-      back = null;
-    }
-  }
-
-  this._invoke = send;
-
-  if (typeof gen["return"] !== "function") {
-    this["return"] = undefined;
-  }
-}
-
-if (typeof Symbol === "function" && Symbol.asyncIterator) {
-  AsyncGenerator.prototype[Symbol.asyncIterator] = function () {
-    return this;
-  };
-}
-
-AsyncGenerator.prototype.next = function (arg) {
-  return this._invoke("next", arg);
-};
-
-AsyncGenerator.prototype["throw"] = function (arg) {
-  return this._invoke("throw", arg);
-};
-
-AsyncGenerator.prototype["return"] = function (arg) {
-  return this._invoke("return", arg);
-};
-
-module.exports = AsyncGenerator;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/AwaitValue.js b/node_modules/@babel/runtime/helpers/AwaitValue.js
deleted file mode 100644
index f9f4184..0000000
--- a/node_modules/@babel/runtime/helpers/AwaitValue.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _AwaitValue(value) {
-  this.wrapped = value;
-}
-
-module.exports = _AwaitValue;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js b/node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js
deleted file mode 100644
index b0b41dd..0000000
--- a/node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js
+++ /dev/null
@@ -1,30 +0,0 @@
-function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
-  var desc = {};
-  Object.keys(descriptor).forEach(function (key) {
-    desc[key] = descriptor[key];
-  });
-  desc.enumerable = !!desc.enumerable;
-  desc.configurable = !!desc.configurable;
-
-  if ('value' in desc || desc.initializer) {
-    desc.writable = true;
-  }
-
-  desc = decorators.slice().reverse().reduce(function (desc, decorator) {
-    return decorator(target, property, desc) || desc;
-  }, desc);
-
-  if (context && desc.initializer !== void 0) {
-    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
-    desc.initializer = undefined;
-  }
-
-  if (desc.initializer === void 0) {
-    Object.defineProperty(target, property, desc);
-    desc = null;
-  }
-
-  return desc;
-}
-
-module.exports = _applyDecoratedDescriptor;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/arrayWithHoles.js b/node_modules/@babel/runtime/helpers/arrayWithHoles.js
deleted file mode 100644
index 5a62a8c..0000000
--- a/node_modules/@babel/runtime/helpers/arrayWithHoles.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _arrayWithHoles(arr) {
-  if (Array.isArray(arr)) return arr;
-}
-
-module.exports = _arrayWithHoles;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js b/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js
deleted file mode 100644
index 3234017..0000000
--- a/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function _arrayWithoutHoles(arr) {
-  if (Array.isArray(arr)) {
-    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
-      arr2[i] = arr[i];
-    }
-
-    return arr2;
-  }
-}
-
-module.exports = _arrayWithoutHoles;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/assertThisInitialized.js b/node_modules/@babel/runtime/helpers/assertThisInitialized.js
deleted file mode 100644
index 98d2949..0000000
--- a/node_modules/@babel/runtime/helpers/assertThisInitialized.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function _assertThisInitialized(self) {
-  if (self === void 0) {
-    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
-  }
-
-  return self;
-}
-
-module.exports = _assertThisInitialized;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/asyncGeneratorDelegate.js b/node_modules/@babel/runtime/helpers/asyncGeneratorDelegate.js
deleted file mode 100644
index c37ecf2..0000000
--- a/node_modules/@babel/runtime/helpers/asyncGeneratorDelegate.js
+++ /dev/null
@@ -1,58 +0,0 @@
-function _asyncGeneratorDelegate(inner, awaitWrap) {
-  var iter = {},
-      waiting = false;
-
-  function pump(key, value) {
-    waiting = true;
-    value = new Promise(function (resolve) {
-      resolve(inner[key](value));
-    });
-    return {
-      done: false,
-      value: awaitWrap(value)
-    };
-  }
-
-  ;
-
-  if (typeof Symbol === "function" && Symbol.iterator) {
-    iter[Symbol.iterator] = function () {
-      return this;
-    };
-  }
-
-  iter.next = function (value) {
-    if (waiting) {
-      waiting = false;
-      return value;
-    }
-
-    return pump("next", value);
-  };
-
-  if (typeof inner["throw"] === "function") {
-    iter["throw"] = function (value) {
-      if (waiting) {
-        waiting = false;
-        throw value;
-      }
-
-      return pump("throw", value);
-    };
-  }
-
-  if (typeof inner["return"] === "function") {
-    iter["return"] = function (value) {
-      if (waiting) {
-        waiting = false;
-        return value;
-      }
-
-      return pump("return", value);
-    };
-  }
-
-  return iter;
-}
-
-module.exports = _asyncGeneratorDelegate;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/asyncIterator.js b/node_modules/@babel/runtime/helpers/asyncIterator.js
deleted file mode 100644
index ef5db27..0000000
--- a/node_modules/@babel/runtime/helpers/asyncIterator.js
+++ /dev/null
@@ -1,19 +0,0 @@
-function _asyncIterator(iterable) {
-  var method;
-
-  if (typeof Symbol !== "undefined") {
-    if (Symbol.asyncIterator) {
-      method = iterable[Symbol.asyncIterator];
-      if (method != null) return method.call(iterable);
-    }
-
-    if (Symbol.iterator) {
-      method = iterable[Symbol.iterator];
-      if (method != null) return method.call(iterable);
-    }
-  }
-
-  throw new TypeError("Object is not async iterable");
-}
-
-module.exports = _asyncIterator;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/asyncToGenerator.js b/node_modules/@babel/runtime/helpers/asyncToGenerator.js
deleted file mode 100644
index f5db93d..0000000
--- a/node_modules/@babel/runtime/helpers/asyncToGenerator.js
+++ /dev/null
@@ -1,37 +0,0 @@
-function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
-  try {
-    var info = gen[key](arg);
-    var value = info.value;
-  } catch (error) {
-    reject(error);
-    return;
-  }
-
-  if (info.done) {
-    resolve(value);
-  } else {
-    Promise.resolve(value).then(_next, _throw);
-  }
-}
-
-function _asyncToGenerator(fn) {
-  return function () {
-    var self = this,
-        args = arguments;
-    return new Promise(function (resolve, reject) {
-      var gen = fn.apply(self, args);
-
-      function _next(value) {
-        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
-      }
-
-      function _throw(err) {
-        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
-      }
-
-      _next(undefined);
-    });
-  };
-}
-
-module.exports = _asyncToGenerator;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/awaitAsyncGenerator.js b/node_modules/@babel/runtime/helpers/awaitAsyncGenerator.js
deleted file mode 100644
index 59f797a..0000000
--- a/node_modules/@babel/runtime/helpers/awaitAsyncGenerator.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var AwaitValue = require("./AwaitValue");
-
-function _awaitAsyncGenerator(value) {
-  return new AwaitValue(value);
-}
-
-module.exports = _awaitAsyncGenerator;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classCallCheck.js b/node_modules/@babel/runtime/helpers/classCallCheck.js
deleted file mode 100644
index f389f2e..0000000
--- a/node_modules/@babel/runtime/helpers/classCallCheck.js
+++ /dev/null
@@ -1,7 +0,0 @@
-function _classCallCheck(instance, Constructor) {
-  if (!(instance instanceof Constructor)) {
-    throw new TypeError("Cannot call a class as a function");
-  }
-}
-
-module.exports = _classCallCheck;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classNameTDZError.js b/node_modules/@babel/runtime/helpers/classNameTDZError.js
deleted file mode 100644
index 8c1bdf5..0000000
--- a/node_modules/@babel/runtime/helpers/classNameTDZError.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _classNameTDZError(name) {
-  throw new Error("Class \"" + name + "\" cannot be referenced in computed property keys.");
-}
-
-module.exports = _classNameTDZError;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classPrivateFieldDestructureSet.js b/node_modules/@babel/runtime/helpers/classPrivateFieldDestructureSet.js
deleted file mode 100644
index fab9105..0000000
--- a/node_modules/@babel/runtime/helpers/classPrivateFieldDestructureSet.js
+++ /dev/null
@@ -1,28 +0,0 @@
-function _classPrivateFieldDestructureSet(receiver, privateMap) {
-  if (!privateMap.has(receiver)) {
-    throw new TypeError("attempted to set private field on non-instance");
-  }
-
-  var descriptor = privateMap.get(receiver);
-
-  if (descriptor.set) {
-    if (!("__destrObj" in descriptor)) {
-      descriptor.__destrObj = {
-        set value(v) {
-          descriptor.set.call(receiver, v);
-        }
-
-      };
-    }
-
-    return descriptor.__destrObj;
-  } else {
-    if (!descriptor.writable) {
-      throw new TypeError("attempted to set read only private field");
-    }
-
-    return descriptor;
-  }
-}
-
-module.exports = _classPrivateFieldDestructureSet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classPrivateFieldGet.js b/node_modules/@babel/runtime/helpers/classPrivateFieldGet.js
deleted file mode 100644
index 106c3cd..0000000
--- a/node_modules/@babel/runtime/helpers/classPrivateFieldGet.js
+++ /dev/null
@@ -1,15 +0,0 @@
-function _classPrivateFieldGet(receiver, privateMap) {
-  var descriptor = privateMap.get(receiver);
-
-  if (!descriptor) {
-    throw new TypeError("attempted to get private field on non-instance");
-  }
-
-  if (descriptor.get) {
-    return descriptor.get.call(receiver);
-  }
-
-  return descriptor.value;
-}
-
-module.exports = _classPrivateFieldGet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classPrivateFieldLooseBase.js b/node_modules/@babel/runtime/helpers/classPrivateFieldLooseBase.js
deleted file mode 100644
index 64ed79d..0000000
--- a/node_modules/@babel/runtime/helpers/classPrivateFieldLooseBase.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function _classPrivateFieldBase(receiver, privateKey) {
-  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
-    throw new TypeError("attempted to use private field on non-instance");
-  }
-
-  return receiver;
-}
-
-module.exports = _classPrivateFieldBase;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classPrivateFieldLooseKey.js b/node_modules/@babel/runtime/helpers/classPrivateFieldLooseKey.js
deleted file mode 100644
index a1a6417..0000000
--- a/node_modules/@babel/runtime/helpers/classPrivateFieldLooseKey.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var id = 0;
-
-function _classPrivateFieldKey(name) {
-  return "__private_" + id++ + "_" + name;
-}
-
-module.exports = _classPrivateFieldKey;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classPrivateFieldSet.js b/node_modules/@babel/runtime/helpers/classPrivateFieldSet.js
deleted file mode 100644
index c92f97a..0000000
--- a/node_modules/@babel/runtime/helpers/classPrivateFieldSet.js
+++ /dev/null
@@ -1,21 +0,0 @@
-function _classPrivateFieldSet(receiver, privateMap, value) {
-  var descriptor = privateMap.get(receiver);
-
-  if (!descriptor) {
-    throw new TypeError("attempted to set private field on non-instance");
-  }
-
-  if (descriptor.set) {
-    descriptor.set.call(receiver, value);
-  } else {
-    if (!descriptor.writable) {
-      throw new TypeError("attempted to set read only private field");
-    }
-
-    descriptor.value = value;
-  }
-
-  return value;
-}
-
-module.exports = _classPrivateFieldSet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classPrivateMethodGet.js b/node_modules/@babel/runtime/helpers/classPrivateMethodGet.js
deleted file mode 100644
index a3432b9..0000000
--- a/node_modules/@babel/runtime/helpers/classPrivateMethodGet.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function _classPrivateMethodGet(receiver, privateSet, fn) {
-  if (!privateSet.has(receiver)) {
-    throw new TypeError("attempted to get private field on non-instance");
-  }
-
-  return fn;
-}
-
-module.exports = _classPrivateMethodGet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classPrivateMethodSet.js b/node_modules/@babel/runtime/helpers/classPrivateMethodSet.js
deleted file mode 100644
index 3847284..0000000
--- a/node_modules/@babel/runtime/helpers/classPrivateMethodSet.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _classPrivateMethodSet() {
-  throw new TypeError("attempted to reassign private method");
-}
-
-module.exports = _classPrivateMethodSet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecGet.js b/node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecGet.js
deleted file mode 100644
index c2b6766..0000000
--- a/node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecGet.js
+++ /dev/null
@@ -1,13 +0,0 @@
-function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {
-  if (receiver !== classConstructor) {
-    throw new TypeError("Private static access of wrong provenance");
-  }
-
-  if (descriptor.get) {
-    return descriptor.get.call(receiver);
-  }
-
-  return descriptor.value;
-}
-
-module.exports = _classStaticPrivateFieldSpecGet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecSet.js b/node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecSet.js
deleted file mode 100644
index 8799fbb..0000000
--- a/node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecSet.js
+++ /dev/null
@@ -1,19 +0,0 @@
-function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {
-  if (receiver !== classConstructor) {
-    throw new TypeError("Private static access of wrong provenance");
-  }
-
-  if (descriptor.set) {
-    descriptor.set.call(receiver, value);
-  } else {
-    if (!descriptor.writable) {
-      throw new TypeError("attempted to set read only private field");
-    }
-
-    descriptor.value = value;
-  }
-
-  return value;
-}
-
-module.exports = _classStaticPrivateFieldSpecSet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classStaticPrivateMethodGet.js b/node_modules/@babel/runtime/helpers/classStaticPrivateMethodGet.js
deleted file mode 100644
index f9b0d00..0000000
--- a/node_modules/@babel/runtime/helpers/classStaticPrivateMethodGet.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function _classStaticPrivateMethodGet(receiver, classConstructor, method) {
-  if (receiver !== classConstructor) {
-    throw new TypeError("Private static access of wrong provenance");
-  }
-
-  return method;
-}
-
-module.exports = _classStaticPrivateMethodGet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/classStaticPrivateMethodSet.js b/node_modules/@babel/runtime/helpers/classStaticPrivateMethodSet.js
deleted file mode 100644
index 89042da..0000000
--- a/node_modules/@babel/runtime/helpers/classStaticPrivateMethodSet.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _classStaticPrivateMethodSet() {
-  throw new TypeError("attempted to set read only static private field");
-}
-
-module.exports = _classStaticPrivateMethodSet;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/construct.js b/node_modules/@babel/runtime/helpers/construct.js
deleted file mode 100644
index 723a7ea..0000000
--- a/node_modules/@babel/runtime/helpers/construct.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var setPrototypeOf = require("./setPrototypeOf");
-
-function isNativeReflectConstruct() {
-  if (typeof Reflect === "undefined" || !Reflect.construct) return false;
-  if (Reflect.construct.sham) return false;
-  if (typeof Proxy === "function") return true;
-
-  try {
-    Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
-    return true;
-  } catch (e) {
-    return false;
-  }
-}
-
-function _construct(Parent, args, Class) {
-  if (isNativeReflectConstruct()) {
-    module.exports = _construct = Reflect.construct;
-  } else {
-    module.exports = _construct = function _construct(Parent, args, Class) {
-      var a = [null];
-      a.push.apply(a, args);
-      var Constructor = Function.bind.apply(Parent, a);
-      var instance = new Constructor();
-      if (Class) setPrototypeOf(instance, Class.prototype);
-      return instance;
-    };
-  }
-
-  return _construct.apply(null, arguments);
-}
-
-module.exports = _construct;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/createClass.js b/node_modules/@babel/runtime/helpers/createClass.js
deleted file mode 100644
index f9d4841..0000000
--- a/node_modules/@babel/runtime/helpers/createClass.js
+++ /dev/null
@@ -1,17 +0,0 @@
-function _defineProperties(target, props) {
-  for (var i = 0; i < props.length; i++) {
-    var descriptor = props[i];
-    descriptor.enumerable = descriptor.enumerable || false;
-    descriptor.configurable = true;
-    if ("value" in descriptor) descriptor.writable = true;
-    Object.defineProperty(target, descriptor.key, descriptor);
-  }
-}
-
-function _createClass(Constructor, protoProps, staticProps) {
-  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
-  if (staticProps) _defineProperties(Constructor, staticProps);
-  return Constructor;
-}
-
-module.exports = _createClass;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/decorate.js b/node_modules/@babel/runtime/helpers/decorate.js
deleted file mode 100644
index 77c0b98..0000000
--- a/node_modules/@babel/runtime/helpers/decorate.js
+++ /dev/null
@@ -1,400 +0,0 @@
-var toArray = require("./toArray");
-
-var toPropertyKey = require("./toPropertyKey");
-
-function _decorate(decorators, factory, superClass, mixins) {
-  var api = _getDecoratorsApi();
-
-  if (mixins) {
-    for (var i = 0; i < mixins.length; i++) {
-      api = mixins[i](api);
-    }
-  }
-
-  var r = factory(function initialize(O) {
-    api.initializeInstanceElements(O, decorated.elements);
-  }, superClass);
-  var decorated = api.decorateClass(_coalesceClassElements(r.d.map(_createElementDescriptor)), decorators);
-  api.initializeClassElements(r.F, decorated.elements);
-  return api.runClassFinishers(r.F, decorated.finishers);
-}
-
-function _getDecoratorsApi() {
-  _getDecoratorsApi = function _getDecoratorsApi() {
-    return api;
-  };
-
-  var api = {
-    elementsDefinitionOrder: [["method"], ["field"]],
-    initializeInstanceElements: function initializeInstanceElements(O, elements) {
-      ["method", "field"].forEach(function (kind) {
-        elements.forEach(function (element) {
-          if (element.kind === kind && element.placement === "own") {
-            this.defineClassElement(O, element);
-          }
-        }, this);
-      }, this);
-    },
-    initializeClassElements: function initializeClassElements(F, elements) {
-      var proto = F.prototype;
-      ["method", "field"].forEach(function (kind) {
-        elements.forEach(function (element) {
-          var placement = element.placement;
-
-          if (element.kind === kind && (placement === "static" || placement === "prototype")) {
-            var receiver = placement === "static" ? F : proto;
-            this.defineClassElement(receiver, element);
-          }
-        }, this);
-      }, this);
-    },
-    defineClassElement: function defineClassElement(receiver, element) {
-      var descriptor = element.descriptor;
-
-      if (element.kind === "field") {
-        var initializer = element.initializer;
-        descriptor = {
-          enumerable: descriptor.enumerable,
-          writable: descriptor.writable,
-          configurable: descriptor.configurable,
-          value: initializer === void 0 ? void 0 : initializer.call(receiver)
-        };
-      }
-
-      Object.defineProperty(receiver, element.key, descriptor);
-    },
-    decorateClass: function decorateClass(elements, decorators) {
-      var newElements = [];
-      var finishers = [];
-      var placements = {
-        "static": [],
-        prototype: [],
-        own: []
-      };
-      elements.forEach(function (element) {
-        this.addElementPlacement(element, placements);
-      }, this);
-      elements.forEach(function (element) {
-        if (!_hasDecorators(element)) return newElements.push(element);
-        var elementFinishersExtras = this.decorateElement(element, placements);
-        newElements.push(elementFinishersExtras.element);
-        newElements.push.apply(newElements, elementFinishersExtras.extras);
-        finishers.push.apply(finishers, elementFinishersExtras.finishers);
-      }, this);
-
-      if (!decorators) {
-        return {
-          elements: newElements,
-          finishers: finishers
-        };
-      }
-
-      var result = this.decorateConstructor(newElements, decorators);
-      finishers.push.apply(finishers, result.finishers);
-      result.finishers = finishers;
-      return result;
-    },
-    addElementPlacement: function addElementPlacement(element, placements, silent) {
-      var keys = placements[element.placement];
-
-      if (!silent && keys.indexOf(element.key) !== -1) {
-        throw new TypeError("Duplicated element (" + element.key + ")");
-      }
-
-      keys.push(element.key);
-    },
-    decorateElement: function decorateElement(element, placements) {
-      var extras = [];
-      var finishers = [];
-
-      for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
-        var keys = placements[element.placement];
-        keys.splice(keys.indexOf(element.key), 1);
-        var elementObject = this.fromElementDescriptor(element);
-        var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);
-        element = elementFinisherExtras.element;
-        this.addElementPlacement(element, placements);
-
-        if (elementFinisherExtras.finisher) {
-          finishers.push(elementFinisherExtras.finisher);
-        }
-
-        var newExtras = elementFinisherExtras.extras;
-
-        if (newExtras) {
-          for (var j = 0; j < newExtras.length; j++) {
-            this.addElementPlacement(newExtras[j], placements);
-          }
-
-          extras.push.apply(extras, newExtras);
-        }
-      }
-
-      return {
-        element: element,
-        finishers: finishers,
-        extras: extras
-      };
-    },
-    decorateConstructor: function decorateConstructor(elements, decorators) {
-      var finishers = [];
-
-      for (var i = decorators.length - 1; i >= 0; i--) {
-        var obj = this.fromClassDescriptor(elements);
-        var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj);
-
-        if (elementsAndFinisher.finisher !== undefined) {
-          finishers.push(elementsAndFinisher.finisher);
-        }
-
-        if (elementsAndFinisher.elements !== undefined) {
-          elements = elementsAndFinisher.elements;
-
-          for (var j = 0; j < elements.length - 1; j++) {
-            for (var k = j + 1; k < elements.length; k++) {
-              if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {
-                throw new TypeError("Duplicated element (" + elements[j].key + ")");
-              }
-            }
-          }
-        }
-      }
-
-      return {
-        elements: elements,
-        finishers: finishers
-      };
-    },
-    fromElementDescriptor: function fromElementDescriptor(element) {
-      var obj = {
-        kind: element.kind,
-        key: element.key,
-        placement: element.placement,
-        descriptor: element.descriptor
-      };
-      var desc = {
-        value: "Descriptor",
-        configurable: true
-      };
-      Object.defineProperty(obj, Symbol.toStringTag, desc);
-      if (element.kind === "field") obj.initializer = element.initializer;
-      return obj;
-    },
-    toElementDescriptors: function toElementDescriptors(elementObjects) {
-      if (elementObjects === undefined) return;
-      return toArray(elementObjects).map(function (elementObject) {
-        var element = this.toElementDescriptor(elementObject);
-        this.disallowProperty(elementObject, "finisher", "An element descriptor");
-        this.disallowProperty(elementObject, "extras", "An element descriptor");
-        return element;
-      }, this);
-    },
-    toElementDescriptor: function toElementDescriptor(elementObject) {
-      var kind = String(elementObject.kind);
-
-      if (kind !== "method" && kind !== "field") {
-        throw new TypeError('An element descriptor\'s .kind property must be either "method" or' + ' "field", but a decorator created an element descriptor with' + ' .kind "' + kind + '"');
-      }
-
-      var key = toPropertyKey(elementObject.key);
-      var placement = String(elementObject.placement);
-
-      if (placement !== "static" && placement !== "prototype" && placement !== "own") {
-        throw new TypeError('An element descriptor\'s .placement property must be one of "static",' + ' "prototype" or "own", but a decorator created an element descriptor' + ' with .placement "' + placement + '"');
-      }
-
-      var descriptor = elementObject.descriptor;
-      this.disallowProperty(elementObject, "elements", "An element descriptor");
-      var element = {
-        kind: kind,
-        key: key,
-        placement: placement,
-        descriptor: Object.assign({}, descriptor)
-      };
-
-      if (kind !== "field") {
-        this.disallowProperty(elementObject, "initializer", "A method descriptor");
-      } else {
-        this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor");
-        this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor");
-        this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor");
-        element.initializer = elementObject.initializer;
-      }
-
-      return element;
-    },
-    toElementFinisherExtras: function toElementFinisherExtras(elementObject) {
-      var element = this.toElementDescriptor(elementObject);
-
-      var finisher = _optionalCallableProperty(elementObject, "finisher");
-
-      var extras = this.toElementDescriptors(elementObject.extras);
-      return {
-        element: element,
-        finisher: finisher,
-        extras: extras
-      };
-    },
-    fromClassDescriptor: function fromClassDescriptor(elements) {
-      var obj = {
-        kind: "class",
-        elements: elements.map(this.fromElementDescriptor, this)
-      };
-      var desc = {
-        value: "Descriptor",
-        configurable: true
-      };
-      Object.defineProperty(obj, Symbol.toStringTag, desc);
-      return obj;
-    },
-    toClassDescriptor: function toClassDescriptor(obj) {
-      var kind = String(obj.kind);
-
-      if (kind !== "class") {
-        throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator' + ' created a class descriptor with .kind "' + kind + '"');
-      }
-
-      this.disallowProperty(obj, "key", "A class descriptor");
-      this.disallowProperty(obj, "placement", "A class descriptor");
-      this.disallowProperty(obj, "descriptor", "A class descriptor");
-      this.disallowProperty(obj, "initializer", "A class descriptor");
-      this.disallowProperty(obj, "extras", "A class descriptor");
-
-      var finisher = _optionalCallableProperty(obj, "finisher");
-
-      var elements = this.toElementDescriptors(obj.elements);
-      return {
-        elements: elements,
-        finisher: finisher
-      };
-    },
-    runClassFinishers: function runClassFinishers(constructor, finishers) {
-      for (var i = 0; i < finishers.length; i++) {
-        var newConstructor = (0, finishers[i])(constructor);
-
-        if (newConstructor !== undefined) {
-          if (typeof newConstructor !== "function") {
-            throw new TypeError("Finishers must return a constructor.");
-          }
-
-          constructor = newConstructor;
-        }
-      }
-
-      return constructor;
-    },
-    disallowProperty: function disallowProperty(obj, name, objectType) {
-      if (obj[name] !== undefined) {
-        throw new TypeError(objectType + " can't have a ." + name + " property.");
-      }
-    }
-  };
-  return api;
-}
-
-function _createElementDescriptor(def) {
-  var key = toPropertyKey(def.key);
-  var descriptor;
-
-  if (def.kind === "method") {
-    descriptor = {
-      value: def.value,
-      writable: true,
-      configurable: true,
-      enumerable: false
-    };
-  } else if (def.kind === "get") {
-    descriptor = {
-      get: def.value,
-      configurable: true,
-      enumerable: false
-    };
-  } else if (def.kind === "set") {
-    descriptor = {
-      set: def.value,
-      configurable: true,
-      enumerable: false
-    };
-  } else if (def.kind === "field") {
-    descriptor = {
-      configurable: true,
-      writable: true,
-      enumerable: true
-    };
-  }
-
-  var element = {
-    kind: def.kind === "field" ? "field" : "method",
-    key: key,
-    placement: def["static"] ? "static" : def.kind === "field" ? "own" : "prototype",
-    descriptor: descriptor
-  };
-  if (def.decorators) element.decorators = def.decorators;
-  if (def.kind === "field") element.initializer = def.value;
-  return element;
-}
-
-function _coalesceGetterSetter(element, other) {
-  if (element.descriptor.get !== undefined) {
-    other.descriptor.get = element.descriptor.get;
-  } else {
-    other.descriptor.set = element.descriptor.set;
-  }
-}
-
-function _coalesceClassElements(elements) {
-  var newElements = [];
-
-  var isSameElement = function isSameElement(other) {
-    return other.kind === "method" && other.key === element.key && other.placement === element.placement;
-  };
-
-  for (var i = 0; i < elements.length; i++) {
-    var element = elements[i];
-    var other;
-
-    if (element.kind === "method" && (other = newElements.find(isSameElement))) {
-      if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
-        if (_hasDecorators(element) || _hasDecorators(other)) {
-          throw new ReferenceError("Duplicated methods (" + element.key + ") can't be decorated.");
-        }
-
-        other.descriptor = element.descriptor;
-      } else {
-        if (_hasDecorators(element)) {
-          if (_hasDecorators(other)) {
-            throw new ReferenceError("Decorators can't be placed on different accessors with for " + "the same property (" + element.key + ").");
-          }
-
-          other.decorators = element.decorators;
-        }
-
-        _coalesceGetterSetter(element, other);
-      }
-    } else {
-      newElements.push(element);
-    }
-  }
-
-  return newElements;
-}
-
-function _hasDecorators(element) {
-  return element.decorators && element.decorators.length;
-}
-
-function _isDataDescriptor(desc) {
-  return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);
-}
-
-function _optionalCallableProperty(obj, name) {
-  var value = obj[name];
-
-  if (value !== undefined && typeof value !== "function") {
-    throw new TypeError("Expected '" + name + "' to be a function");
-  }
-
-  return value;
-}
-
-module.exports = _decorate;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/defaults.js b/node_modules/@babel/runtime/helpers/defaults.js
deleted file mode 100644
index 55ba1fe..0000000
--- a/node_modules/@babel/runtime/helpers/defaults.js
+++ /dev/null
@@ -1,16 +0,0 @@
-function _defaults(obj, defaults) {
-  var keys = Object.getOwnPropertyNames(defaults);
-
-  for (var i = 0; i < keys.length; i++) {
-    var key = keys[i];
-    var value = Object.getOwnPropertyDescriptor(defaults, key);
-
-    if (value && value.configurable && obj[key] === undefined) {
-      Object.defineProperty(obj, key, value);
-    }
-  }
-
-  return obj;
-}
-
-module.exports = _defaults;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/defineEnumerableProperties.js b/node_modules/@babel/runtime/helpers/defineEnumerableProperties.js
deleted file mode 100644
index 5d80ea1..0000000
--- a/node_modules/@babel/runtime/helpers/defineEnumerableProperties.js
+++ /dev/null
@@ -1,24 +0,0 @@
-function _defineEnumerableProperties(obj, descs) {
-  for (var key in descs) {
-    var desc = descs[key];
-    desc.configurable = desc.enumerable = true;
-    if ("value" in desc) desc.writable = true;
-    Object.defineProperty(obj, key, desc);
-  }
-
-  if (Object.getOwnPropertySymbols) {
-    var objectSymbols = Object.getOwnPropertySymbols(descs);
-
-    for (var i = 0; i < objectSymbols.length; i++) {
-      var sym = objectSymbols[i];
-      var desc = descs[sym];
-      desc.configurable = desc.enumerable = true;
-      if ("value" in desc) desc.writable = true;
-      Object.defineProperty(obj, sym, desc);
-    }
-  }
-
-  return obj;
-}
-
-module.exports = _defineEnumerableProperties;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/defineProperty.js b/node_modules/@babel/runtime/helpers/defineProperty.js
deleted file mode 100644
index 32a8d73..0000000
--- a/node_modules/@babel/runtime/helpers/defineProperty.js
+++ /dev/null
@@ -1,16 +0,0 @@
-function _defineProperty(obj, key, value) {
-  if (key in obj) {
-    Object.defineProperty(obj, key, {
-      value: value,
-      enumerable: true,
-      configurable: true,
-      writable: true
-    });
-  } else {
-    obj[key] = value;
-  }
-
-  return obj;
-}
-
-module.exports = _defineProperty;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/AsyncGenerator.js b/node_modules/@babel/runtime/helpers/esm/AsyncGenerator.js
deleted file mode 100644
index 65361d9..0000000
--- a/node_modules/@babel/runtime/helpers/esm/AsyncGenerator.js
+++ /dev/null
@@ -1,97 +0,0 @@
-import AwaitValue from "./AwaitValue";
-export default function AsyncGenerator(gen) {
-  var front, back;
-
-  function send(key, arg) {
-    return new Promise(function (resolve, reject) {
-      var request = {
-        key: key,
-        arg: arg,
-        resolve: resolve,
-        reject: reject,
-        next: null
-      };
-
-      if (back) {
-        back = back.next = request;
-      } else {
-        front = back = request;
-        resume(key, arg);
-      }
-    });
-  }
-
-  function resume(key, arg) {
-    try {
-      var result = gen[key](arg);
-      var value = result.value;
-      var wrappedAwait = value instanceof AwaitValue;
-      Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
-        if (wrappedAwait) {
-          resume(key === "return" ? "return" : "next", arg);
-          return;
-        }
-
-        settle(result.done ? "return" : "normal", arg);
-      }, function (err) {
-        resume("throw", err);
-      });
-    } catch (err) {
-      settle("throw", err);
-    }
-  }
-
-  function settle(type, value) {
-    switch (type) {
-      case "return":
-        front.resolve({
-          value: value,
-          done: true
-        });
-        break;
-
-      case "throw":
-        front.reject(value);
-        break;
-
-      default:
-        front.resolve({
-          value: value,
-          done: false
-        });
-        break;
-    }
-
-    front = front.next;
-
-    if (front) {
-      resume(front.key, front.arg);
-    } else {
-      back = null;
-    }
-  }
-
-  this._invoke = send;
-
-  if (typeof gen["return"] !== "function") {
-    this["return"] = undefined;
-  }
-}
-
-if (typeof Symbol === "function" && Symbol.asyncIterator) {
-  AsyncGenerator.prototype[Symbol.asyncIterator] = function () {
-    return this;
-  };
-}
-
-AsyncGenerator.prototype.next = function (arg) {
-  return this._invoke("next", arg);
-};
-
-AsyncGenerator.prototype["throw"] = function (arg) {
-  return this._invoke("throw", arg);
-};
-
-AsyncGenerator.prototype["return"] = function (arg) {
-  return this._invoke("return", arg);
-};
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/AwaitValue.js b/node_modules/@babel/runtime/helpers/esm/AwaitValue.js
deleted file mode 100644
index 5237e18..0000000
--- a/node_modules/@babel/runtime/helpers/esm/AwaitValue.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _AwaitValue(value) {
-  this.wrapped = value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/applyDecoratedDescriptor.js b/node_modules/@babel/runtime/helpers/esm/applyDecoratedDescriptor.js
deleted file mode 100644
index 84b5961..0000000
--- a/node_modules/@babel/runtime/helpers/esm/applyDecoratedDescriptor.js
+++ /dev/null
@@ -1,28 +0,0 @@
-export default function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
-  var desc = {};
-  Object.keys(descriptor).forEach(function (key) {
-    desc[key] = descriptor[key];
-  });
-  desc.enumerable = !!desc.enumerable;
-  desc.configurable = !!desc.configurable;
-
-  if ('value' in desc || desc.initializer) {
-    desc.writable = true;
-  }
-
-  desc = decorators.slice().reverse().reduce(function (desc, decorator) {
-    return decorator(target, property, desc) || desc;
-  }, desc);
-
-  if (context && desc.initializer !== void 0) {
-    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
-    desc.initializer = undefined;
-  }
-
-  if (desc.initializer === void 0) {
-    Object.defineProperty(target, property, desc);
-    desc = null;
-  }
-
-  return desc;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js b/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js
deleted file mode 100644
index be734fc..0000000
--- a/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _arrayWithHoles(arr) {
-  if (Array.isArray(arr)) return arr;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js b/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js
deleted file mode 100644
index cbcffa1..0000000
--- a/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js
+++ /dev/null
@@ -1,9 +0,0 @@
-export default function _arrayWithoutHoles(arr) {
-  if (Array.isArray(arr)) {
-    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
-      arr2[i] = arr[i];
-    }
-
-    return arr2;
-  }
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js b/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js
deleted file mode 100644
index bbf849c..0000000
--- a/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function _assertThisInitialized(self) {
-  if (self === void 0) {
-    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
-  }
-
-  return self;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/asyncGeneratorDelegate.js b/node_modules/@babel/runtime/helpers/esm/asyncGeneratorDelegate.js
deleted file mode 100644
index eb56fe5..0000000
--- a/node_modules/@babel/runtime/helpers/esm/asyncGeneratorDelegate.js
+++ /dev/null
@@ -1,56 +0,0 @@
-export default function _asyncGeneratorDelegate(inner, awaitWrap) {
-  var iter = {},
-      waiting = false;
-
-  function pump(key, value) {
-    waiting = true;
-    value = new Promise(function (resolve) {
-      resolve(inner[key](value));
-    });
-    return {
-      done: false,
-      value: awaitWrap(value)
-    };
-  }
-
-  ;
-
-  if (typeof Symbol === "function" && Symbol.iterator) {
-    iter[Symbol.iterator] = function () {
-      return this;
-    };
-  }
-
-  iter.next = function (value) {
-    if (waiting) {
-      waiting = false;
-      return value;
-    }
-
-    return pump("next", value);
-  };
-
-  if (typeof inner["throw"] === "function") {
-    iter["throw"] = function (value) {
-      if (waiting) {
-        waiting = false;
-        throw value;
-      }
-
-      return pump("throw", value);
-    };
-  }
-
-  if (typeof inner["return"] === "function") {
-    iter["return"] = function (value) {
-      if (waiting) {
-        waiting = false;
-        return value;
-      }
-
-      return pump("return", value);
-    };
-  }
-
-  return iter;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/asyncIterator.js b/node_modules/@babel/runtime/helpers/esm/asyncIterator.js
deleted file mode 100644
index e03fa97..0000000
--- a/node_modules/@babel/runtime/helpers/esm/asyncIterator.js
+++ /dev/null
@@ -1,17 +0,0 @@
-export default function _asyncIterator(iterable) {
-  var method;
-
-  if (typeof Symbol !== "undefined") {
-    if (Symbol.asyncIterator) {
-      method = iterable[Symbol.asyncIterator];
-      if (method != null) return method.call(iterable);
-    }
-
-    if (Symbol.iterator) {
-      method = iterable[Symbol.iterator];
-      if (method != null) return method.call(iterable);
-    }
-  }
-
-  throw new TypeError("Object is not async iterable");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js b/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js
deleted file mode 100644
index 2a25f54..0000000
--- a/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js
+++ /dev/null
@@ -1,35 +0,0 @@
-function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
-  try {
-    var info = gen[key](arg);
-    var value = info.value;
-  } catch (error) {
-    reject(error);
-    return;
-  }
-
-  if (info.done) {
-    resolve(value);
-  } else {
-    Promise.resolve(value).then(_next, _throw);
-  }
-}
-
-export default function _asyncToGenerator(fn) {
-  return function () {
-    var self = this,
-        args = arguments;
-    return new Promise(function (resolve, reject) {
-      var gen = fn.apply(self, args);
-
-      function _next(value) {
-        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
-      }
-
-      function _throw(err) {
-        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
-      }
-
-      _next(undefined);
-    });
-  };
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/awaitAsyncGenerator.js b/node_modules/@babel/runtime/helpers/esm/awaitAsyncGenerator.js
deleted file mode 100644
index 462f99c..0000000
--- a/node_modules/@babel/runtime/helpers/esm/awaitAsyncGenerator.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import AwaitValue from "./AwaitValue";
-export default function _awaitAsyncGenerator(value) {
-  return new AwaitValue(value);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classCallCheck.js b/node_modules/@babel/runtime/helpers/esm/classCallCheck.js
deleted file mode 100644
index 2f1738a..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classCallCheck.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function _classCallCheck(instance, Constructor) {
-  if (!(instance instanceof Constructor)) {
-    throw new TypeError("Cannot call a class as a function");
-  }
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classNameTDZError.js b/node_modules/@babel/runtime/helpers/esm/classNameTDZError.js
deleted file mode 100644
index f7b6dd5..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classNameTDZError.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _classNameTDZError(name) {
-  throw new Error("Class \"" + name + "\" cannot be referenced in computed property keys.");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classPrivateFieldDestructureSet.js b/node_modules/@babel/runtime/helpers/esm/classPrivateFieldDestructureSet.js
deleted file mode 100644
index 1f265bc..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classPrivateFieldDestructureSet.js
+++ /dev/null
@@ -1,26 +0,0 @@
-export default function _classPrivateFieldDestructureSet(receiver, privateMap) {
-  if (!privateMap.has(receiver)) {
-    throw new TypeError("attempted to set private field on non-instance");
-  }
-
-  var descriptor = privateMap.get(receiver);
-
-  if (descriptor.set) {
-    if (!("__destrObj" in descriptor)) {
-      descriptor.__destrObj = {
-        set value(v) {
-          descriptor.set.call(receiver, v);
-        }
-
-      };
-    }
-
-    return descriptor.__destrObj;
-  } else {
-    if (!descriptor.writable) {
-      throw new TypeError("attempted to set read only private field");
-    }
-
-    return descriptor;
-  }
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet.js b/node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet.js
deleted file mode 100644
index f8287f1..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet.js
+++ /dev/null
@@ -1,13 +0,0 @@
-export default function _classPrivateFieldGet(receiver, privateMap) {
-  var descriptor = privateMap.get(receiver);
-
-  if (!descriptor) {
-    throw new TypeError("attempted to get private field on non-instance");
-  }
-
-  if (descriptor.get) {
-    return descriptor.get.call(receiver);
-  }
-
-  return descriptor.value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseBase.js b/node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseBase.js
deleted file mode 100644
index 5b10916..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseBase.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function _classPrivateFieldBase(receiver, privateKey) {
-  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
-    throw new TypeError("attempted to use private field on non-instance");
-  }
-
-  return receiver;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseKey.js b/node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseKey.js
deleted file mode 100644
index 5b7e5ac..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseKey.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var id = 0;
-export default function _classPrivateFieldKey(name) {
-  return "__private_" + id++ + "_" + name;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet.js b/node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet.js
deleted file mode 100644
index fb4e5d2..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet.js
+++ /dev/null
@@ -1,19 +0,0 @@
-export default function _classPrivateFieldSet(receiver, privateMap, value) {
-  var descriptor = privateMap.get(receiver);
-
-  if (!descriptor) {
-    throw new TypeError("attempted to set private field on non-instance");
-  }
-
-  if (descriptor.set) {
-    descriptor.set.call(receiver, value);
-  } else {
-    if (!descriptor.writable) {
-      throw new TypeError("attempted to set read only private field");
-    }
-
-    descriptor.value = value;
-  }
-
-  return value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classPrivateMethodGet.js b/node_modules/@babel/runtime/helpers/esm/classPrivateMethodGet.js
deleted file mode 100644
index 38b9d58..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classPrivateMethodGet.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function _classPrivateMethodGet(receiver, privateSet, fn) {
-  if (!privateSet.has(receiver)) {
-    throw new TypeError("attempted to get private field on non-instance");
-  }
-
-  return fn;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classPrivateMethodSet.js b/node_modules/@babel/runtime/helpers/esm/classPrivateMethodSet.js
deleted file mode 100644
index 2bbaf3a..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classPrivateMethodSet.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _classPrivateMethodSet() {
-  throw new TypeError("attempted to reassign private method");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldSpecGet.js b/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldSpecGet.js
deleted file mode 100644
index 75a9b7c..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldSpecGet.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export default function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {
-  if (receiver !== classConstructor) {
-    throw new TypeError("Private static access of wrong provenance");
-  }
-
-  if (descriptor.get) {
-    return descriptor.get.call(receiver);
-  }
-
-  return descriptor.value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldSpecSet.js b/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldSpecSet.js
deleted file mode 100644
index 163279f..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldSpecSet.js
+++ /dev/null
@@ -1,17 +0,0 @@
-export default function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {
-  if (receiver !== classConstructor) {
-    throw new TypeError("Private static access of wrong provenance");
-  }
-
-  if (descriptor.set) {
-    descriptor.set.call(receiver, value);
-  } else {
-    if (!descriptor.writable) {
-      throw new TypeError("attempted to set read only private field");
-    }
-
-    descriptor.value = value;
-  }
-
-  return value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classStaticPrivateMethodGet.js b/node_modules/@babel/runtime/helpers/esm/classStaticPrivateMethodGet.js
deleted file mode 100644
index da9b1e5..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classStaticPrivateMethodGet.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function _classStaticPrivateMethodGet(receiver, classConstructor, method) {
-  if (receiver !== classConstructor) {
-    throw new TypeError("Private static access of wrong provenance");
-  }
-
-  return method;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/classStaticPrivateMethodSet.js b/node_modules/@babel/runtime/helpers/esm/classStaticPrivateMethodSet.js
deleted file mode 100644
index d5ab60a..0000000
--- a/node_modules/@babel/runtime/helpers/esm/classStaticPrivateMethodSet.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _classStaticPrivateMethodSet() {
-  throw new TypeError("attempted to set read only static private field");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/construct.js b/node_modules/@babel/runtime/helpers/esm/construct.js
deleted file mode 100644
index 82f20fa..0000000
--- a/node_modules/@babel/runtime/helpers/esm/construct.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import setPrototypeOf from "./setPrototypeOf";
-
-function isNativeReflectConstruct() {
-  if (typeof Reflect === "undefined" || !Reflect.construct) return false;
-  if (Reflect.construct.sham) return false;
-  if (typeof Proxy === "function") return true;
-
-  try {
-    Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
-    return true;
-  } catch (e) {
-    return false;
-  }
-}
-
-export default function _construct(Parent, args, Class) {
-  if (isNativeReflectConstruct()) {
-    _construct = Reflect.construct;
-  } else {
-    _construct = function _construct(Parent, args, Class) {
-      var a = [null];
-      a.push.apply(a, args);
-      var Constructor = Function.bind.apply(Parent, a);
-      var instance = new Constructor();
-      if (Class) setPrototypeOf(instance, Class.prototype);
-      return instance;
-    };
-  }
-
-  return _construct.apply(null, arguments);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/createClass.js b/node_modules/@babel/runtime/helpers/esm/createClass.js
deleted file mode 100644
index d6cf412..0000000
--- a/node_modules/@babel/runtime/helpers/esm/createClass.js
+++ /dev/null
@@ -1,15 +0,0 @@
-function _defineProperties(target, props) {
-  for (var i = 0; i < props.length; i++) {
-    var descriptor = props[i];
-    descriptor.enumerable = descriptor.enumerable || false;
-    descriptor.configurable = true;
-    if ("value" in descriptor) descriptor.writable = true;
-    Object.defineProperty(target, descriptor.key, descriptor);
-  }
-}
-
-export default function _createClass(Constructor, protoProps, staticProps) {
-  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
-  if (staticProps) _defineProperties(Constructor, staticProps);
-  return Constructor;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/decorate.js b/node_modules/@babel/runtime/helpers/esm/decorate.js
deleted file mode 100644
index b6acd1f..0000000
--- a/node_modules/@babel/runtime/helpers/esm/decorate.js
+++ /dev/null
@@ -1,396 +0,0 @@
-import toArray from "./toArray";
-import toPropertyKey from "./toPropertyKey";
-export default function _decorate(decorators, factory, superClass, mixins) {
-  var api = _getDecoratorsApi();
-
-  if (mixins) {
-    for (var i = 0; i < mixins.length; i++) {
-      api = mixins[i](api);
-    }
-  }
-
-  var r = factory(function initialize(O) {
-    api.initializeInstanceElements(O, decorated.elements);
-  }, superClass);
-  var decorated = api.decorateClass(_coalesceClassElements(r.d.map(_createElementDescriptor)), decorators);
-  api.initializeClassElements(r.F, decorated.elements);
-  return api.runClassFinishers(r.F, decorated.finishers);
-}
-
-function _getDecoratorsApi() {
-  _getDecoratorsApi = function _getDecoratorsApi() {
-    return api;
-  };
-
-  var api = {
-    elementsDefinitionOrder: [["method"], ["field"]],
-    initializeInstanceElements: function initializeInstanceElements(O, elements) {
-      ["method", "field"].forEach(function (kind) {
-        elements.forEach(function (element) {
-          if (element.kind === kind && element.placement === "own") {
-            this.defineClassElement(O, element);
-          }
-        }, this);
-      }, this);
-    },
-    initializeClassElements: function initializeClassElements(F, elements) {
-      var proto = F.prototype;
-      ["method", "field"].forEach(function (kind) {
-        elements.forEach(function (element) {
-          var placement = element.placement;
-
-          if (element.kind === kind && (placement === "static" || placement === "prototype")) {
-            var receiver = placement === "static" ? F : proto;
-            this.defineClassElement(receiver, element);
-          }
-        }, this);
-      }, this);
-    },
-    defineClassElement: function defineClassElement(receiver, element) {
-      var descriptor = element.descriptor;
-
-      if (element.kind === "field") {
-        var initializer = element.initializer;
-        descriptor = {
-          enumerable: descriptor.enumerable,
-          writable: descriptor.writable,
-          configurable: descriptor.configurable,
-          value: initializer === void 0 ? void 0 : initializer.call(receiver)
-        };
-      }
-
-      Object.defineProperty(receiver, element.key, descriptor);
-    },
-    decorateClass: function decorateClass(elements, decorators) {
-      var newElements = [];
-      var finishers = [];
-      var placements = {
-        "static": [],
-        prototype: [],
-        own: []
-      };
-      elements.forEach(function (element) {
-        this.addElementPlacement(element, placements);
-      }, this);
-      elements.forEach(function (element) {
-        if (!_hasDecorators(element)) return newElements.push(element);
-        var elementFinishersExtras = this.decorateElement(element, placements);
-        newElements.push(elementFinishersExtras.element);
-        newElements.push.apply(newElements, elementFinishersExtras.extras);
-        finishers.push.apply(finishers, elementFinishersExtras.finishers);
-      }, this);
-
-      if (!decorators) {
-        return {
-          elements: newElements,
-          finishers: finishers
-        };
-      }
-
-      var result = this.decorateConstructor(newElements, decorators);
-      finishers.push.apply(finishers, result.finishers);
-      result.finishers = finishers;
-      return result;
-    },
-    addElementPlacement: function addElementPlacement(element, placements, silent) {
-      var keys = placements[element.placement];
-
-      if (!silent && keys.indexOf(element.key) !== -1) {
-        throw new TypeError("Duplicated element (" + element.key + ")");
-      }
-
-      keys.push(element.key);
-    },
-    decorateElement: function decorateElement(element, placements) {
-      var extras = [];
-      var finishers = [];
-
-      for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
-        var keys = placements[element.placement];
-        keys.splice(keys.indexOf(element.key), 1);
-        var elementObject = this.fromElementDescriptor(element);
-        var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);
-        element = elementFinisherExtras.element;
-        this.addElementPlacement(element, placements);
-
-        if (elementFinisherExtras.finisher) {
-          finishers.push(elementFinisherExtras.finisher);
-        }
-
-        var newExtras = elementFinisherExtras.extras;
-
-        if (newExtras) {
-          for (var j = 0; j < newExtras.length; j++) {
-            this.addElementPlacement(newExtras[j], placements);
-          }
-
-          extras.push.apply(extras, newExtras);
-        }
-      }
-
-      return {
-        element: element,
-        finishers: finishers,
-        extras: extras
-      };
-    },
-    decorateConstructor: function decorateConstructor(elements, decorators) {
-      var finishers = [];
-
-      for (var i = decorators.length - 1; i >= 0; i--) {
-        var obj = this.fromClassDescriptor(elements);
-        var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj);
-
-        if (elementsAndFinisher.finisher !== undefined) {
-          finishers.push(elementsAndFinisher.finisher);
-        }
-
-        if (elementsAndFinisher.elements !== undefined) {
-          elements = elementsAndFinisher.elements;
-
-          for (var j = 0; j < elements.length - 1; j++) {
-            for (var k = j + 1; k < elements.length; k++) {
-              if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {
-                throw new TypeError("Duplicated element (" + elements[j].key + ")");
-              }
-            }
-          }
-        }
-      }
-
-      return {
-        elements: elements,
-        finishers: finishers
-      };
-    },
-    fromElementDescriptor: function fromElementDescriptor(element) {
-      var obj = {
-        kind: element.kind,
-        key: element.key,
-        placement: element.placement,
-        descriptor: element.descriptor
-      };
-      var desc = {
-        value: "Descriptor",
-        configurable: true
-      };
-      Object.defineProperty(obj, Symbol.toStringTag, desc);
-      if (element.kind === "field") obj.initializer = element.initializer;
-      return obj;
-    },
-    toElementDescriptors: function toElementDescriptors(elementObjects) {
-      if (elementObjects === undefined) return;
-      return toArray(elementObjects).map(function (elementObject) {
-        var element = this.toElementDescriptor(elementObject);
-        this.disallowProperty(elementObject, "finisher", "An element descriptor");
-        this.disallowProperty(elementObject, "extras", "An element descriptor");
-        return element;
-      }, this);
-    },
-    toElementDescriptor: function toElementDescriptor(elementObject) {
-      var kind = String(elementObject.kind);
-
-      if (kind !== "method" && kind !== "field") {
-        throw new TypeError('An element descriptor\'s .kind property must be either "method" or' + ' "field", but a decorator created an element descriptor with' + ' .kind "' + kind + '"');
-      }
-
-      var key = toPropertyKey(elementObject.key);
-      var placement = String(elementObject.placement);
-
-      if (placement !== "static" && placement !== "prototype" && placement !== "own") {
-        throw new TypeError('An element descriptor\'s .placement property must be one of "static",' + ' "prototype" or "own", but a decorator created an element descriptor' + ' with .placement "' + placement + '"');
-      }
-
-      var descriptor = elementObject.descriptor;
-      this.disallowProperty(elementObject, "elements", "An element descriptor");
-      var element = {
-        kind: kind,
-        key: key,
-        placement: placement,
-        descriptor: Object.assign({}, descriptor)
-      };
-
-      if (kind !== "field") {
-        this.disallowProperty(elementObject, "initializer", "A method descriptor");
-      } else {
-        this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor");
-        this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor");
-        this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor");
-        element.initializer = elementObject.initializer;
-      }
-
-      return element;
-    },
-    toElementFinisherExtras: function toElementFinisherExtras(elementObject) {
-      var element = this.toElementDescriptor(elementObject);
-
-      var finisher = _optionalCallableProperty(elementObject, "finisher");
-
-      var extras = this.toElementDescriptors(elementObject.extras);
-      return {
-        element: element,
-        finisher: finisher,
-        extras: extras
-      };
-    },
-    fromClassDescriptor: function fromClassDescriptor(elements) {
-      var obj = {
-        kind: "class",
-        elements: elements.map(this.fromElementDescriptor, this)
-      };
-      var desc = {
-        value: "Descriptor",
-        configurable: true
-      };
-      Object.defineProperty(obj, Symbol.toStringTag, desc);
-      return obj;
-    },
-    toClassDescriptor: function toClassDescriptor(obj) {
-      var kind = String(obj.kind);
-
-      if (kind !== "class") {
-        throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator' + ' created a class descriptor with .kind "' + kind + '"');
-      }
-
-      this.disallowProperty(obj, "key", "A class descriptor");
-      this.disallowProperty(obj, "placement", "A class descriptor");
-      this.disallowProperty(obj, "descriptor", "A class descriptor");
-      this.disallowProperty(obj, "initializer", "A class descriptor");
-      this.disallowProperty(obj, "extras", "A class descriptor");
-
-      var finisher = _optionalCallableProperty(obj, "finisher");
-
-      var elements = this.toElementDescriptors(obj.elements);
-      return {
-        elements: elements,
-        finisher: finisher
-      };
-    },
-    runClassFinishers: function runClassFinishers(constructor, finishers) {
-      for (var i = 0; i < finishers.length; i++) {
-        var newConstructor = (0, finishers[i])(constructor);
-
-        if (newConstructor !== undefined) {
-          if (typeof newConstructor !== "function") {
-            throw new TypeError("Finishers must return a constructor.");
-          }
-
-          constructor = newConstructor;
-        }
-      }
-
-      return constructor;
-    },
-    disallowProperty: function disallowProperty(obj, name, objectType) {
-      if (obj[name] !== undefined) {
-        throw new TypeError(objectType + " can't have a ." + name + " property.");
-      }
-    }
-  };
-  return api;
-}
-
-function _createElementDescriptor(def) {
-  var key = toPropertyKey(def.key);
-  var descriptor;
-
-  if (def.kind === "method") {
-    descriptor = {
-      value: def.value,
-      writable: true,
-      configurable: true,
-      enumerable: false
-    };
-  } else if (def.kind === "get") {
-    descriptor = {
-      get: def.value,
-      configurable: true,
-      enumerable: false
-    };
-  } else if (def.kind === "set") {
-    descriptor = {
-      set: def.value,
-      configurable: true,
-      enumerable: false
-    };
-  } else if (def.kind === "field") {
-    descriptor = {
-      configurable: true,
-      writable: true,
-      enumerable: true
-    };
-  }
-
-  var element = {
-    kind: def.kind === "field" ? "field" : "method",
-    key: key,
-    placement: def["static"] ? "static" : def.kind === "field" ? "own" : "prototype",
-    descriptor: descriptor
-  };
-  if (def.decorators) element.decorators = def.decorators;
-  if (def.kind === "field") element.initializer = def.value;
-  return element;
-}
-
-function _coalesceGetterSetter(element, other) {
-  if (element.descriptor.get !== undefined) {
-    other.descriptor.get = element.descriptor.get;
-  } else {
-    other.descriptor.set = element.descriptor.set;
-  }
-}
-
-function _coalesceClassElements(elements) {
-  var newElements = [];
-
-  var isSameElement = function isSameElement(other) {
-    return other.kind === "method" && other.key === element.key && other.placement === element.placement;
-  };
-
-  for (var i = 0; i < elements.length; i++) {
-    var element = elements[i];
-    var other;
-
-    if (element.kind === "method" && (other = newElements.find(isSameElement))) {
-      if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
-        if (_hasDecorators(element) || _hasDecorators(other)) {
-          throw new ReferenceError("Duplicated methods (" + element.key + ") can't be decorated.");
-        }
-
-        other.descriptor = element.descriptor;
-      } else {
-        if (_hasDecorators(element)) {
-          if (_hasDecorators(other)) {
-            throw new ReferenceError("Decorators can't be placed on different accessors with for " + "the same property (" + element.key + ").");
-          }
-
-          other.decorators = element.decorators;
-        }
-
-        _coalesceGetterSetter(element, other);
-      }
-    } else {
-      newElements.push(element);
-    }
-  }
-
-  return newElements;
-}
-
-function _hasDecorators(element) {
-  return element.decorators && element.decorators.length;
-}
-
-function _isDataDescriptor(desc) {
-  return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);
-}
-
-function _optionalCallableProperty(obj, name) {
-  var value = obj[name];
-
-  if (value !== undefined && typeof value !== "function") {
-    throw new TypeError("Expected '" + name + "' to be a function");
-  }
-
-  return value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/defaults.js b/node_modules/@babel/runtime/helpers/esm/defaults.js
deleted file mode 100644
index 3de1d8e..0000000
--- a/node_modules/@babel/runtime/helpers/esm/defaults.js
+++ /dev/null
@@ -1,14 +0,0 @@
-export default function _defaults(obj, defaults) {
-  var keys = Object.getOwnPropertyNames(defaults);
-
-  for (var i = 0; i < keys.length; i++) {
-    var key = keys[i];
-    var value = Object.getOwnPropertyDescriptor(defaults, key);
-
-    if (value && value.configurable && obj[key] === undefined) {
-      Object.defineProperty(obj, key, value);
-    }
-  }
-
-  return obj;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/defineEnumerableProperties.js b/node_modules/@babel/runtime/helpers/esm/defineEnumerableProperties.js
deleted file mode 100644
index 7981acd..0000000
--- a/node_modules/@babel/runtime/helpers/esm/defineEnumerableProperties.js
+++ /dev/null
@@ -1,22 +0,0 @@
-export default function _defineEnumerableProperties(obj, descs) {
-  for (var key in descs) {
-    var desc = descs[key];
-    desc.configurable = desc.enumerable = true;
-    if ("value" in desc) desc.writable = true;
-    Object.defineProperty(obj, key, desc);
-  }
-
-  if (Object.getOwnPropertySymbols) {
-    var objectSymbols = Object.getOwnPropertySymbols(descs);
-
-    for (var i = 0; i < objectSymbols.length; i++) {
-      var sym = objectSymbols[i];
-      var desc = descs[sym];
-      desc.configurable = desc.enumerable = true;
-      if ("value" in desc) desc.writable = true;
-      Object.defineProperty(obj, sym, desc);
-    }
-  }
-
-  return obj;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/defineProperty.js b/node_modules/@babel/runtime/helpers/esm/defineProperty.js
deleted file mode 100644
index 7cf6e59..0000000
--- a/node_modules/@babel/runtime/helpers/esm/defineProperty.js
+++ /dev/null
@@ -1,14 +0,0 @@
-export default function _defineProperty(obj, key, value) {
-  if (key in obj) {
-    Object.defineProperty(obj, key, {
-      value: value,
-      enumerable: true,
-      configurable: true,
-      writable: true
-    });
-  } else {
-    obj[key] = value;
-  }
-
-  return obj;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/extends.js b/node_modules/@babel/runtime/helpers/esm/extends.js
deleted file mode 100644
index b9b138d..0000000
--- a/node_modules/@babel/runtime/helpers/esm/extends.js
+++ /dev/null
@@ -1,17 +0,0 @@
-export default function _extends() {
-  _extends = Object.assign || function (target) {
-    for (var i = 1; i < arguments.length; i++) {
-      var source = arguments[i];
-
-      for (var key in source) {
-        if (Object.prototype.hasOwnProperty.call(source, key)) {
-          target[key] = source[key];
-        }
-      }
-    }
-
-    return target;
-  };
-
-  return _extends.apply(this, arguments);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/get.js b/node_modules/@babel/runtime/helpers/esm/get.js
deleted file mode 100644
index a369d4d..0000000
--- a/node_modules/@babel/runtime/helpers/esm/get.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import superPropBase from "./superPropBase";
-export default function _get(target, property, receiver) {
-  if (typeof Reflect !== "undefined" && Reflect.get) {
-    _get = Reflect.get;
-  } else {
-    _get = function _get(target, property, receiver) {
-      var base = superPropBase(target, property);
-      if (!base) return;
-      var desc = Object.getOwnPropertyDescriptor(base, property);
-
-      if (desc.get) {
-        return desc.get.call(receiver);
-      }
-
-      return desc.value;
-    };
-  }
-
-  return _get(target, property, receiver || target);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js b/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js
deleted file mode 100644
index 5abafe3..0000000
--- a/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js
+++ /dev/null
@@ -1,6 +0,0 @@
-export default function _getPrototypeOf(o) {
-  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
-    return o.__proto__ || Object.getPrototypeOf(o);
-  };
-  return _getPrototypeOf(o);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/inherits.js b/node_modules/@babel/runtime/helpers/esm/inherits.js
deleted file mode 100644
index 035648d..0000000
--- a/node_modules/@babel/runtime/helpers/esm/inherits.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import setPrototypeOf from "./setPrototypeOf";
-export default function _inherits(subClass, superClass) {
-  if (typeof superClass !== "function" && superClass !== null) {
-    throw new TypeError("Super expression must either be null or a function");
-  }
-
-  subClass.prototype = Object.create(superClass && superClass.prototype, {
-    constructor: {
-      value: subClass,
-      writable: true,
-      configurable: true
-    }
-  });
-  if (superClass) setPrototypeOf(subClass, superClass);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js b/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js
deleted file mode 100644
index 32017e6..0000000
--- a/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function _inheritsLoose(subClass, superClass) {
-  subClass.prototype = Object.create(superClass.prototype);
-  subClass.prototype.constructor = subClass;
-  subClass.__proto__ = superClass;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/initializerDefineProperty.js b/node_modules/@babel/runtime/helpers/esm/initializerDefineProperty.js
deleted file mode 100644
index 26fdea0..0000000
--- a/node_modules/@babel/runtime/helpers/esm/initializerDefineProperty.js
+++ /dev/null
@@ -1,9 +0,0 @@
-export default function _initializerDefineProperty(target, property, descriptor, context) {
-  if (!descriptor) return;
-  Object.defineProperty(target, property, {
-    enumerable: descriptor.enumerable,
-    configurable: descriptor.configurable,
-    writable: descriptor.writable,
-    value: descriptor.initializer ? descriptor.initializer.call(context) : void 0
-  });
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/initializerWarningHelper.js b/node_modules/@babel/runtime/helpers/esm/initializerWarningHelper.js
deleted file mode 100644
index 30d518c..0000000
--- a/node_modules/@babel/runtime/helpers/esm/initializerWarningHelper.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _initializerWarningHelper(descriptor, context) {
-  throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/instanceof.js b/node_modules/@babel/runtime/helpers/esm/instanceof.js
deleted file mode 100644
index 8c43b71..0000000
--- a/node_modules/@babel/runtime/helpers/esm/instanceof.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function _instanceof(left, right) {
-  if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
-    return !!right[Symbol.hasInstance](left);
-  } else {
-    return left instanceof right;
-  }
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/interopRequireDefault.js b/node_modules/@babel/runtime/helpers/esm/interopRequireDefault.js
deleted file mode 100644
index c2df7b6..0000000
--- a/node_modules/@babel/runtime/helpers/esm/interopRequireDefault.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function _interopRequireDefault(obj) {
-  return obj && obj.__esModule ? obj : {
-    "default": obj
-  };
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/interopRequireWildcard.js b/node_modules/@babel/runtime/helpers/esm/interopRequireWildcard.js
deleted file mode 100644
index d39be9e..0000000
--- a/node_modules/@babel/runtime/helpers/esm/interopRequireWildcard.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import _typeof from "../../helpers/esm/typeof";
-
-function _getRequireWildcardCache() {
-  if (typeof WeakMap !== "function") return null;
-  var cache = new WeakMap();
-
-  _getRequireWildcardCache = function _getRequireWildcardCache() {
-    return cache;
-  };
-
-  return cache;
-}
-
-export default function _interopRequireWildcard(obj) {
-  if (obj && obj.__esModule) {
-    return obj;
-  }
-
-  if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") {
-    return {
-      "default": obj
-    };
-  }
-
-  var cache = _getRequireWildcardCache();
-
-  if (cache && cache.has(obj)) {
-    return cache.get(obj);
-  }
-
-  var newObj = {};
-  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
-
-  for (var key in obj) {
-    if (Object.prototype.hasOwnProperty.call(obj, key)) {
-      var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
-
-      if (desc && (desc.get || desc.set)) {
-        Object.defineProperty(newObj, key, desc);
-      } else {
-        newObj[key] = obj[key];
-      }
-    }
-  }
-
-  newObj["default"] = obj;
-
-  if (cache) {
-    cache.set(obj, newObj);
-  }
-
-  return newObj;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/isNativeFunction.js b/node_modules/@babel/runtime/helpers/esm/isNativeFunction.js
deleted file mode 100644
index 7b1bc82..0000000
--- a/node_modules/@babel/runtime/helpers/esm/isNativeFunction.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _isNativeFunction(fn) {
-  return Function.toString.call(fn).indexOf("[native code]") !== -1;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/iterableToArray.js b/node_modules/@babel/runtime/helpers/esm/iterableToArray.js
deleted file mode 100644
index 671e400..0000000
--- a/node_modules/@babel/runtime/helpers/esm/iterableToArray.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _iterableToArray(iter) {
-  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js b/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js
deleted file mode 100644
index 535cdde..0000000
--- a/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js
+++ /dev/null
@@ -1,29 +0,0 @@
-export default function _iterableToArrayLimit(arr, i) {
-  if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
-    return;
-  }
-
-  var _arr = [];
-  var _n = true;
-  var _d = false;
-  var _e = undefined;
-
-  try {
-    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
-      _arr.push(_s.value);
-
-      if (i && _arr.length === i) break;
-    }
-  } catch (err) {
-    _d = true;
-    _e = err;
-  } finally {
-    try {
-      if (!_n && _i["return"] != null) _i["return"]();
-    } finally {
-      if (_d) throw _e;
-    }
-  }
-
-  return _arr;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimitLoose.js b/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimitLoose.js
deleted file mode 100644
index aac8223..0000000
--- a/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimitLoose.js
+++ /dev/null
@@ -1,15 +0,0 @@
-export default function _iterableToArrayLimitLoose(arr, i) {
-  if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
-    return;
-  }
-
-  var _arr = [];
-
-  for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
-    _arr.push(_step.value);
-
-    if (i && _arr.length === i) break;
-  }
-
-  return _arr;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/jsx.js b/node_modules/@babel/runtime/helpers/esm/jsx.js
deleted file mode 100644
index 3a98cec..0000000
--- a/node_modules/@babel/runtime/helpers/esm/jsx.js
+++ /dev/null
@@ -1,46 +0,0 @@
-var REACT_ELEMENT_TYPE;
-export default function _createRawReactElement(type, props, key, children) {
-  if (!REACT_ELEMENT_TYPE) {
-    REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol["for"] && Symbol["for"]("react.element") || 0xeac7;
-  }
-
-  var defaultProps = type && type.defaultProps;
-  var childrenLength = arguments.length - 3;
-
-  if (!props && childrenLength !== 0) {
-    props = {
-      children: void 0
-    };
-  }
-
-  if (childrenLength === 1) {
-    props.children = children;
-  } else if (childrenLength > 1) {
-    var childArray = new Array(childrenLength);
-
-    for (var i = 0; i < childrenLength; i++) {
-      childArray[i] = arguments[i + 3];
-    }
-
-    props.children = childArray;
-  }
-
-  if (props && defaultProps) {
-    for (var propName in defaultProps) {
-      if (props[propName] === void 0) {
-        props[propName] = defaultProps[propName];
-      }
-    }
-  } else if (!props) {
-    props = defaultProps || {};
-  }
-
-  return {
-    $$typeof: REACT_ELEMENT_TYPE,
-    type: type,
-    key: key === undefined ? null : '' + key,
-    ref: null,
-    props: props,
-    _owner: null
-  };
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/newArrowCheck.js b/node_modules/@babel/runtime/helpers/esm/newArrowCheck.js
deleted file mode 100644
index d6cd864..0000000
--- a/node_modules/@babel/runtime/helpers/esm/newArrowCheck.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export default function _newArrowCheck(innerThis, boundThis) {
-  if (innerThis !== boundThis) {
-    throw new TypeError("Cannot instantiate an arrow function");
-  }
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js b/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js
deleted file mode 100644
index f94186d..0000000
--- a/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _nonIterableRest() {
-  throw new TypeError("Invalid attempt to destructure non-iterable instance");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js b/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js
deleted file mode 100644
index d6bc738..0000000
--- a/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _nonIterableSpread() {
-  throw new TypeError("Invalid attempt to spread non-iterable instance");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/objectDestructuringEmpty.js b/node_modules/@babel/runtime/helpers/esm/objectDestructuringEmpty.js
deleted file mode 100644
index 82b67d2..0000000
--- a/node_modules/@babel/runtime/helpers/esm/objectDestructuringEmpty.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _objectDestructuringEmpty(obj) {
-  if (obj == null) throw new TypeError("Cannot destructure undefined");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/objectSpread.js b/node_modules/@babel/runtime/helpers/esm/objectSpread.js
deleted file mode 100644
index 0e189fb..0000000
--- a/node_modules/@babel/runtime/helpers/esm/objectSpread.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import defineProperty from "./defineProperty";
-export default function _objectSpread(target) {
-  for (var i = 1; i < arguments.length; i++) {
-    var source = arguments[i] != null ? Object(arguments[i]) : {};
-    var ownKeys = Object.keys(source);
-
-    if (typeof Object.getOwnPropertySymbols === 'function') {
-      ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
-        return Object.getOwnPropertyDescriptor(source, sym).enumerable;
-      }));
-    }
-
-    ownKeys.forEach(function (key) {
-      defineProperty(target, key, source[key]);
-    });
-  }
-
-  return target;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/objectSpread2.js b/node_modules/@babel/runtime/helpers/esm/objectSpread2.js
deleted file mode 100644
index 1da0866..0000000
--- a/node_modules/@babel/runtime/helpers/esm/objectSpread2.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import defineProperty from "./defineProperty";
-
-function ownKeys(object, enumerableOnly) {
-  var keys = Object.keys(object);
-
-  if (Object.getOwnPropertySymbols) {
-    var symbols = Object.getOwnPropertySymbols(object);
-    if (enumerableOnly) symbols = symbols.filter(function (sym) {
-      return Object.getOwnPropertyDescriptor(object, sym).enumerable;
-    });
-    keys.push.apply(keys, symbols);
-  }
-
-  return keys;
-}
-
-export default function _objectSpread2(target) {
-  for (var i = 1; i < arguments.length; i++) {
-    var source = arguments[i] != null ? arguments[i] : {};
-
-    if (i % 2) {
-      ownKeys(Object(source), true).forEach(function (key) {
-        defineProperty(target, key, source[key]);
-      });
-    } else if (Object.getOwnPropertyDescriptors) {
-      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
-    } else {
-      ownKeys(Object(source)).forEach(function (key) {
-        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
-      });
-    }
-  }
-
-  return target;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js b/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js
deleted file mode 100644
index 2af6091..0000000
--- a/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import objectWithoutPropertiesLoose from "./objectWithoutPropertiesLoose";
-export default function _objectWithoutProperties(source, excluded) {
-  if (source == null) return {};
-  var target = objectWithoutPropertiesLoose(source, excluded);
-  var key, i;
-
-  if (Object.getOwnPropertySymbols) {
-    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
-
-    for (i = 0; i < sourceSymbolKeys.length; i++) {
-      key = sourceSymbolKeys[i];
-      if (excluded.indexOf(key) >= 0) continue;
-      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
-      target[key] = source[key];
-    }
-  }
-
-  return target;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js b/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js
deleted file mode 100644
index c36815c..0000000
--- a/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js
+++ /dev/null
@@ -1,14 +0,0 @@
-export default function _objectWithoutPropertiesLoose(source, excluded) {
-  if (source == null) return {};
-  var target = {};
-  var sourceKeys = Object.keys(source);
-  var key, i;
-
-  for (i = 0; i < sourceKeys.length; i++) {
-    key = sourceKeys[i];
-    if (excluded.indexOf(key) >= 0) continue;
-    target[key] = source[key];
-  }
-
-  return target;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/package.json b/node_modules/@babel/runtime/helpers/esm/package.json
deleted file mode 100644
index aead43d..0000000
--- a/node_modules/@babel/runtime/helpers/esm/package.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "type": "module"
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js b/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js
deleted file mode 100644
index be7b7a4..0000000
--- a/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import _typeof from "../../helpers/esm/typeof";
-import assertThisInitialized from "./assertThisInitialized";
-export default function _possibleConstructorReturn(self, call) {
-  if (call && (_typeof(call) === "object" || typeof call === "function")) {
-    return call;
-  }
-
-  return assertThisInitialized(self);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/readOnlyError.js b/node_modules/@babel/runtime/helpers/esm/readOnlyError.js
deleted file mode 100644
index 45d01d7..0000000
--- a/node_modules/@babel/runtime/helpers/esm/readOnlyError.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _readOnlyError(name) {
-  throw new Error("\"" + name + "\" is read-only");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/set.js b/node_modules/@babel/runtime/helpers/esm/set.js
deleted file mode 100644
index fb20af7..0000000
--- a/node_modules/@babel/runtime/helpers/esm/set.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import superPropBase from "./superPropBase";
-import defineProperty from "./defineProperty";
-
-function set(target, property, value, receiver) {
-  if (typeof Reflect !== "undefined" && Reflect.set) {
-    set = Reflect.set;
-  } else {
-    set = function set(target, property, value, receiver) {
-      var base = superPropBase(target, property);
-      var desc;
-
-      if (base) {
-        desc = Object.getOwnPropertyDescriptor(base, property);
-
-        if (desc.set) {
-          desc.set.call(receiver, value);
-          return true;
-        } else if (!desc.writable) {
-          return false;
-        }
-      }
-
-      desc = Object.getOwnPropertyDescriptor(receiver, property);
-
-      if (desc) {
-        if (!desc.writable) {
-          return false;
-        }
-
-        desc.value = value;
-        Object.defineProperty(receiver, property, desc);
-      } else {
-        defineProperty(receiver, property, value);
-      }
-
-      return true;
-    };
-  }
-
-  return set(target, property, value, receiver);
-}
-
-export default function _set(target, property, value, receiver, isStrict) {
-  var s = set(target, property, value, receiver || target);
-
-  if (!s && isStrict) {
-    throw new Error('failed to set property');
-  }
-
-  return value;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js b/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js
deleted file mode 100644
index e6ef03e..0000000
--- a/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js
+++ /dev/null
@@ -1,8 +0,0 @@
-export default function _setPrototypeOf(o, p) {
-  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
-    o.__proto__ = p;
-    return o;
-  };
-
-  return _setPrototypeOf(o, p);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/skipFirstGeneratorNext.js b/node_modules/@babel/runtime/helpers/esm/skipFirstGeneratorNext.js
deleted file mode 100644
index cadd9bb..0000000
--- a/node_modules/@babel/runtime/helpers/esm/skipFirstGeneratorNext.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function _skipFirstGeneratorNext(fn) {
-  return function () {
-    var it = fn.apply(this, arguments);
-    it.next();
-    return it;
-  };
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/slicedToArray.js b/node_modules/@babel/runtime/helpers/esm/slicedToArray.js
deleted file mode 100644
index f6f1081..0000000
--- a/node_modules/@babel/runtime/helpers/esm/slicedToArray.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import arrayWithHoles from "./arrayWithHoles";
-import iterableToArrayLimit from "./iterableToArrayLimit";
-import nonIterableRest from "./nonIterableRest";
-export default function _slicedToArray(arr, i) {
-  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/slicedToArrayLoose.js b/node_modules/@babel/runtime/helpers/esm/slicedToArrayLoose.js
deleted file mode 100644
index e675789..0000000
--- a/node_modules/@babel/runtime/helpers/esm/slicedToArrayLoose.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import arrayWithHoles from "./arrayWithHoles";
-import iterableToArrayLimitLoose from "./iterableToArrayLimitLoose";
-import nonIterableRest from "./nonIterableRest";
-export default function _slicedToArrayLoose(arr, i) {
-  return arrayWithHoles(arr) || iterableToArrayLimitLoose(arr, i) || nonIterableRest();
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/superPropBase.js b/node_modules/@babel/runtime/helpers/esm/superPropBase.js
deleted file mode 100644
index eace947..0000000
--- a/node_modules/@babel/runtime/helpers/esm/superPropBase.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import getPrototypeOf from "./getPrototypeOf";
-export default function _superPropBase(object, property) {
-  while (!Object.prototype.hasOwnProperty.call(object, property)) {
-    object = getPrototypeOf(object);
-    if (object === null) break;
-  }
-
-  return object;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js b/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js
deleted file mode 100644
index 421f18a..0000000
--- a/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export default function _taggedTemplateLiteral(strings, raw) {
-  if (!raw) {
-    raw = strings.slice(0);
-  }
-
-  return Object.freeze(Object.defineProperties(strings, {
-    raw: {
-      value: Object.freeze(raw)
-    }
-  }));
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteralLoose.js b/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteralLoose.js
deleted file mode 100644
index c8f081e..0000000
--- a/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteralLoose.js
+++ /dev/null
@@ -1,8 +0,0 @@
-export default function _taggedTemplateLiteralLoose(strings, raw) {
-  if (!raw) {
-    raw = strings.slice(0);
-  }
-
-  strings.raw = raw;
-  return strings;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/tdz.js b/node_modules/@babel/runtime/helpers/esm/tdz.js
deleted file mode 100644
index d5d0adc..0000000
--- a/node_modules/@babel/runtime/helpers/esm/tdz.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function _tdzError(name) {
-  throw new ReferenceError(name + " is not defined - temporal dead zone");
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/temporalRef.js b/node_modules/@babel/runtime/helpers/esm/temporalRef.js
deleted file mode 100644
index 6d167a3..0000000
--- a/node_modules/@babel/runtime/helpers/esm/temporalRef.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import undef from "./temporalUndefined";
-import err from "./tdz";
-export default function _temporalRef(val, name) {
-  return val === undef ? err(name) : val;
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/temporalUndefined.js b/node_modules/@babel/runtime/helpers/esm/temporalUndefined.js
deleted file mode 100644
index 1a35717..0000000
--- a/node_modules/@babel/runtime/helpers/esm/temporalUndefined.js
+++ /dev/null
@@ -1 +0,0 @@
-export default function _temporalUndefined() {}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/toArray.js b/node_modules/@babel/runtime/helpers/esm/toArray.js
deleted file mode 100644
index 5acb22b..0000000
--- a/node_modules/@babel/runtime/helpers/esm/toArray.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import arrayWithHoles from "./arrayWithHoles";
-import iterableToArray from "./iterableToArray";
-import nonIterableRest from "./nonIterableRest";
-export default function _toArray(arr) {
-  return arrayWithHoles(arr) || iterableToArray(arr) || nonIterableRest();
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js b/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js
deleted file mode 100644
index 7e480b9..0000000
--- a/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import arrayWithoutHoles from "./arrayWithoutHoles";
-import iterableToArray from "./iterableToArray";
-import nonIterableSpread from "./nonIterableSpread";
-export default function _toConsumableArray(arr) {
-  return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/toPrimitive.js b/node_modules/@babel/runtime/helpers/esm/toPrimitive.js
deleted file mode 100644
index 72a4a09..0000000
--- a/node_modules/@babel/runtime/helpers/esm/toPrimitive.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import _typeof from "../../helpers/esm/typeof";
-export default function _toPrimitive(input, hint) {
-  if (_typeof(input) !== "object" || input === null) return input;
-  var prim = input[Symbol.toPrimitive];
-
-  if (prim !== undefined) {
-    var res = prim.call(input, hint || "default");
-    if (_typeof(res) !== "object") return res;
-    throw new TypeError("@@toPrimitive must return a primitive value.");
-  }
-
-  return (hint === "string" ? String : Number)(input);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js b/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js
deleted file mode 100644
index 7b53a4d..0000000
--- a/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import _typeof from "../../helpers/esm/typeof";
-import toPrimitive from "./toPrimitive";
-export default function _toPropertyKey(arg) {
-  var key = toPrimitive(arg, "string");
-  return _typeof(key) === "symbol" ? key : String(key);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/typeof.js b/node_modules/@babel/runtime/helpers/esm/typeof.js
deleted file mode 100644
index eb444f7..0000000
--- a/node_modules/@babel/runtime/helpers/esm/typeof.js
+++ /dev/null
@@ -1,15 +0,0 @@
-export default function _typeof(obj) {
-  "@babel/helpers - typeof";
-
-  if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
-    _typeof = function _typeof(obj) {
-      return typeof obj;
-    };
-  } else {
-    _typeof = function _typeof(obj) {
-      return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
-    };
-  }
-
-  return _typeof(obj);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/wrapAsyncGenerator.js b/node_modules/@babel/runtime/helpers/esm/wrapAsyncGenerator.js
deleted file mode 100644
index 6d6d981..0000000
--- a/node_modules/@babel/runtime/helpers/esm/wrapAsyncGenerator.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import AsyncGenerator from "./AsyncGenerator";
-export default function _wrapAsyncGenerator(fn) {
-  return function () {
-    return new AsyncGenerator(fn.apply(this, arguments));
-  };
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js b/node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js
deleted file mode 100644
index 5c55d05..0000000
--- a/node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import getPrototypeOf from "./getPrototypeOf";
-import setPrototypeOf from "./setPrototypeOf";
-import isNativeFunction from "./isNativeFunction";
-import construct from "./construct";
-export default function _wrapNativeSuper(Class) {
-  var _cache = typeof Map === "function" ? new Map() : undefined;
-
-  _wrapNativeSuper = function _wrapNativeSuper(Class) {
-    if (Class === null || !isNativeFunction(Class)) return Class;
-
-    if (typeof Class !== "function") {
-      throw new TypeError("Super expression must either be null or a function");
-    }
-
-    if (typeof _cache !== "undefined") {
-      if (_cache.has(Class)) return _cache.get(Class);
-
-      _cache.set(Class, Wrapper);
-    }
-
-    function Wrapper() {
-      return construct(Class, arguments, getPrototypeOf(this).constructor);
-    }
-
-    Wrapper.prototype = Object.create(Class.prototype, {
-      constructor: {
-        value: Wrapper,
-        enumerable: false,
-        writable: true,
-        configurable: true
-      }
-    });
-    return setPrototypeOf(Wrapper, Class);
-  };
-
-  return _wrapNativeSuper(Class);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/esm/wrapRegExp.js b/node_modules/@babel/runtime/helpers/esm/wrapRegExp.js
deleted file mode 100644
index c885450..0000000
--- a/node_modules/@babel/runtime/helpers/esm/wrapRegExp.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import _typeof from "../../helpers/esm/typeof";
-import wrapNativeSuper from "./wrapNativeSuper";
-import getPrototypeOf from "./getPrototypeOf";
-import possibleConstructorReturn from "./possibleConstructorReturn";
-import inherits from "./inherits";
-export default function _wrapRegExp(re, groups) {
-  _wrapRegExp = function _wrapRegExp(re, groups) {
-    return new BabelRegExp(re, undefined, groups);
-  };
-
-  var _RegExp = wrapNativeSuper(RegExp);
-
-  var _super = RegExp.prototype;
-
-  var _groups = new WeakMap();
-
-  function BabelRegExp(re, flags, groups) {
-    var _this = _RegExp.call(this, re, flags);
-
-    _groups.set(_this, groups || _groups.get(re));
-
-    return _this;
-  }
-
-  inherits(BabelRegExp, _RegExp);
-
-  BabelRegExp.prototype.exec = function (str) {
-    var result = _super.exec.call(this, str);
-
-    if (result) result.groups = buildGroups(result, this);
-    return result;
-  };
-
-  BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {
-    if (typeof substitution === "string") {
-      var groups = _groups.get(this);
-
-      return _super[Symbol.replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
-        return "$" + groups[name];
-      }));
-    } else if (typeof substitution === "function") {
-      var _this = this;
-
-      return _super[Symbol.replace].call(this, str, function () {
-        var args = [];
-        args.push.apply(args, arguments);
-
-        if (_typeof(args[args.length - 1]) !== "object") {
-          args.push(buildGroups(args, _this));
-        }
-
-        return substitution.apply(this, args);
-      });
-    } else {
-      return _super[Symbol.replace].call(this, str, substitution);
-    }
-  };
-
-  function buildGroups(result, re) {
-    var g = _groups.get(re);
-
-    return Object.keys(g).reduce(function (groups, name) {
-      groups[name] = result[g[name]];
-      return groups;
-    }, Object.create(null));
-  }
-
-  return _wrapRegExp.apply(this, arguments);
-}
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/extends.js b/node_modules/@babel/runtime/helpers/extends.js
deleted file mode 100644
index 1816877..0000000
--- a/node_modules/@babel/runtime/helpers/extends.js
+++ /dev/null
@@ -1,19 +0,0 @@
-function _extends() {
-  module.exports = _extends = Object.assign || function (target) {
-    for (var i = 1; i < arguments.length; i++) {
-      var source = arguments[i];
-
-      for (var key in source) {
-        if (Object.prototype.hasOwnProperty.call(source, key)) {
-          target[key] = source[key];
-        }
-      }
-    }
-
-    return target;
-  };
-
-  return _extends.apply(this, arguments);
-}
-
-module.exports = _extends;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/get.js b/node_modules/@babel/runtime/helpers/get.js
deleted file mode 100644
index 31ffc65..0000000
--- a/node_modules/@babel/runtime/helpers/get.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var superPropBase = require("./superPropBase");
-
-function _get(target, property, receiver) {
-  if (typeof Reflect !== "undefined" && Reflect.get) {
-    module.exports = _get = Reflect.get;
-  } else {
-    module.exports = _get = function _get(target, property, receiver) {
-      var base = superPropBase(target, property);
-      if (!base) return;
-      var desc = Object.getOwnPropertyDescriptor(base, property);
-
-      if (desc.get) {
-        return desc.get.call(receiver);
-      }
-
-      return desc.value;
-    };
-  }
-
-  return _get(target, property, receiver || target);
-}
-
-module.exports = _get;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/getPrototypeOf.js b/node_modules/@babel/runtime/helpers/getPrototypeOf.js
deleted file mode 100644
index 5fc9a16..0000000
--- a/node_modules/@babel/runtime/helpers/getPrototypeOf.js
+++ /dev/null
@@ -1,8 +0,0 @@
-function _getPrototypeOf(o) {
-  module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
-    return o.__proto__ || Object.getPrototypeOf(o);
-  };
-  return _getPrototypeOf(o);
-}
-
-module.exports = _getPrototypeOf;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/inherits.js b/node_modules/@babel/runtime/helpers/inherits.js
deleted file mode 100644
index 6b4f286..0000000
--- a/node_modules/@babel/runtime/helpers/inherits.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var setPrototypeOf = require("./setPrototypeOf");
-
-function _inherits(subClass, superClass) {
-  if (typeof superClass !== "function" && superClass !== null) {
-    throw new TypeError("Super expression must either be null or a function");
-  }
-
-  subClass.prototype = Object.create(superClass && superClass.prototype, {
-    constructor: {
-      value: subClass,
-      writable: true,
-      configurable: true
-    }
-  });
-  if (superClass) setPrototypeOf(subClass, superClass);
-}
-
-module.exports = _inherits;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/inheritsLoose.js b/node_modules/@babel/runtime/helpers/inheritsLoose.js
deleted file mode 100644
index c3f7cdb..0000000
--- a/node_modules/@babel/runtime/helpers/inheritsLoose.js
+++ /dev/null
@@ -1,7 +0,0 @@
-function _inheritsLoose(subClass, superClass) {
-  subClass.prototype = Object.create(superClass.prototype);
-  subClass.prototype.constructor = subClass;
-  subClass.__proto__ = superClass;
-}
-
-module.exports = _inheritsLoose;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/initializerDefineProperty.js b/node_modules/@babel/runtime/helpers/initializerDefineProperty.js
deleted file mode 100644
index 4caa5ca..0000000
--- a/node_modules/@babel/runtime/helpers/initializerDefineProperty.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function _initializerDefineProperty(target, property, descriptor, context) {
-  if (!descriptor) return;
-  Object.defineProperty(target, property, {
-    enumerable: descriptor.enumerable,
-    configurable: descriptor.configurable,
-    writable: descriptor.writable,
-    value: descriptor.initializer ? descriptor.initializer.call(context) : void 0
-  });
-}
-
-module.exports = _initializerDefineProperty;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/initializerWarningHelper.js b/node_modules/@babel/runtime/helpers/initializerWarningHelper.js
deleted file mode 100644
index 50ec82c..0000000
--- a/node_modules/@babel/runtime/helpers/initializerWarningHelper.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _initializerWarningHelper(descriptor, context) {
-  throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');
-}
-
-module.exports = _initializerWarningHelper;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/instanceof.js b/node_modules/@babel/runtime/helpers/instanceof.js
deleted file mode 100644
index efe134c..0000000
--- a/node_modules/@babel/runtime/helpers/instanceof.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function _instanceof(left, right) {
-  if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
-    return !!right[Symbol.hasInstance](left);
-  } else {
-    return left instanceof right;
-  }
-}
-
-module.exports = _instanceof;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/interopRequireDefault.js b/node_modules/@babel/runtime/helpers/interopRequireDefault.js
deleted file mode 100644
index f713d13..0000000
--- a/node_modules/@babel/runtime/helpers/interopRequireDefault.js
+++ /dev/null
@@ -1,7 +0,0 @@
-function _interopRequireDefault(obj) {
-  return obj && obj.__esModule ? obj : {
-    "default": obj
-  };
-}
-
-module.exports = _interopRequireDefault;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/interopRequireWildcard.js b/node_modules/@babel/runtime/helpers/interopRequireWildcard.js
deleted file mode 100644
index 68fd84c..0000000
--- a/node_modules/@babel/runtime/helpers/interopRequireWildcard.js
+++ /dev/null
@@ -1,55 +0,0 @@
-var _typeof = require("../helpers/typeof");
-
-function _getRequireWildcardCache() {
-  if (typeof WeakMap !== "function") return null;
-  var cache = new WeakMap();
-
-  _getRequireWildcardCache = function _getRequireWildcardCache() {
-    return cache;
-  };
-
-  return cache;
-}
-
-function _interopRequireWildcard(obj) {
-  if (obj && obj.__esModule) {
-    return obj;
-  }
-
-  if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") {
-    return {
-      "default": obj
-    };
-  }
-
-  var cache = _getRequireWildcardCache();
-
-  if (cache && cache.has(obj)) {
-    return cache.get(obj);
-  }
-
-  var newObj = {};
-  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
-
-  for (var key in obj) {
-    if (Object.prototype.hasOwnProperty.call(obj, key)) {
-      var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
-
-      if (desc && (desc.get || desc.set)) {
-        Object.defineProperty(newObj, key, desc);
-      } else {
-        newObj[key] = obj[key];
-      }
-    }
-  }
-
-  newObj["default"] = obj;
-
-  if (cache) {
-    cache.set(obj, newObj);
-  }
-
-  return newObj;
-}
-
-module.exports = _interopRequireWildcard;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/isNativeFunction.js b/node_modules/@babel/runtime/helpers/isNativeFunction.js
deleted file mode 100644
index e2dc3ed..0000000
--- a/node_modules/@babel/runtime/helpers/isNativeFunction.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _isNativeFunction(fn) {
-  return Function.toString.call(fn).indexOf("[native code]") !== -1;
-}
-
-module.exports = _isNativeFunction;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/iterableToArray.js b/node_modules/@babel/runtime/helpers/iterableToArray.js
deleted file mode 100644
index e917e57..0000000
--- a/node_modules/@babel/runtime/helpers/iterableToArray.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _iterableToArray(iter) {
-  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
-}
-
-module.exports = _iterableToArray;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/iterableToArrayLimit.js b/node_modules/@babel/runtime/helpers/iterableToArrayLimit.js
deleted file mode 100644
index cd01642..0000000
--- a/node_modules/@babel/runtime/helpers/iterableToArrayLimit.js
+++ /dev/null
@@ -1,31 +0,0 @@
-function _iterableToArrayLimit(arr, i) {
-  if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
-    return;
-  }
-
-  var _arr = [];
-  var _n = true;
-  var _d = false;
-  var _e = undefined;
-
-  try {
-    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
-      _arr.push(_s.value);
-
-      if (i && _arr.length === i) break;
-    }
-  } catch (err) {
-    _d = true;
-    _e = err;
-  } finally {
-    try {
-      if (!_n && _i["return"] != null) _i["return"]();
-    } finally {
-      if (_d) throw _e;
-    }
-  }
-
-  return _arr;
-}
-
-module.exports = _iterableToArrayLimit;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/iterableToArrayLimitLoose.js b/node_modules/@babel/runtime/helpers/iterableToArrayLimitLoose.js
deleted file mode 100644
index ccf8d2f..0000000
--- a/node_modules/@babel/runtime/helpers/iterableToArrayLimitLoose.js
+++ /dev/null
@@ -1,17 +0,0 @@
-function _iterableToArrayLimitLoose(arr, i) {
-  if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
-    return;
-  }
-
-  var _arr = [];
-
-  for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
-    _arr.push(_step.value);
-
-    if (i && _arr.length === i) break;
-  }
-
-  return _arr;
-}
-
-module.exports = _iterableToArrayLimitLoose;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/jsx.js b/node_modules/@babel/runtime/helpers/jsx.js
deleted file mode 100644
index 4b1ee54..0000000
--- a/node_modules/@babel/runtime/helpers/jsx.js
+++ /dev/null
@@ -1,49 +0,0 @@
-var REACT_ELEMENT_TYPE;
-
-function _createRawReactElement(type, props, key, children) {
-  if (!REACT_ELEMENT_TYPE) {
-    REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol["for"] && Symbol["for"]("react.element") || 0xeac7;
-  }
-
-  var defaultProps = type && type.defaultProps;
-  var childrenLength = arguments.length - 3;
-
-  if (!props && childrenLength !== 0) {
-    props = {
-      children: void 0
-    };
-  }
-
-  if (childrenLength === 1) {
-    props.children = children;
-  } else if (childrenLength > 1) {
-    var childArray = new Array(childrenLength);
-
-    for (var i = 0; i < childrenLength; i++) {
-      childArray[i] = arguments[i + 3];
-    }
-
-    props.children = childArray;
-  }
-
-  if (props && defaultProps) {
-    for (var propName in defaultProps) {
-      if (props[propName] === void 0) {
-        props[propName] = defaultProps[propName];
-      }
-    }
-  } else if (!props) {
-    props = defaultProps || {};
-  }
-
-  return {
-    $$typeof: REACT_ELEMENT_TYPE,
-    type: type,
-    key: key === undefined ? null : '' + key,
-    ref: null,
-    props: props,
-    _owner: null
-  };
-}
-
-module.exports = _createRawReactElement;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/newArrowCheck.js b/node_modules/@babel/runtime/helpers/newArrowCheck.js
deleted file mode 100644
index 9b59f58..0000000
--- a/node_modules/@babel/runtime/helpers/newArrowCheck.js
+++ /dev/null
@@ -1,7 +0,0 @@
-function _newArrowCheck(innerThis, boundThis) {
-  if (innerThis !== boundThis) {
-    throw new TypeError("Cannot instantiate an arrow function");
-  }
-}
-
-module.exports = _newArrowCheck;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/nonIterableRest.js b/node_modules/@babel/runtime/helpers/nonIterableRest.js
deleted file mode 100644
index eb447dd..0000000
--- a/node_modules/@babel/runtime/helpers/nonIterableRest.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _nonIterableRest() {
-  throw new TypeError("Invalid attempt to destructure non-iterable instance");
-}
-
-module.exports = _nonIterableRest;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/nonIterableSpread.js b/node_modules/@babel/runtime/helpers/nonIterableSpread.js
deleted file mode 100644
index 7d7ca43..0000000
--- a/node_modules/@babel/runtime/helpers/nonIterableSpread.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _nonIterableSpread() {
-  throw new TypeError("Invalid attempt to spread non-iterable instance");
-}
-
-module.exports = _nonIterableSpread;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/objectDestructuringEmpty.js b/node_modules/@babel/runtime/helpers/objectDestructuringEmpty.js
deleted file mode 100644
index 1d5c04a..0000000
--- a/node_modules/@babel/runtime/helpers/objectDestructuringEmpty.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _objectDestructuringEmpty(obj) {
-  if (obj == null) throw new TypeError("Cannot destructure undefined");
-}
-
-module.exports = _objectDestructuringEmpty;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/objectSpread.js b/node_modules/@babel/runtime/helpers/objectSpread.js
deleted file mode 100644
index ad8036e..0000000
--- a/node_modules/@babel/runtime/helpers/objectSpread.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var defineProperty = require("./defineProperty");
-
-function _objectSpread(target) {
-  for (var i = 1; i < arguments.length; i++) {
-    var source = arguments[i] != null ? Object(arguments[i]) : {};
-    var ownKeys = Object.keys(source);
-
-    if (typeof Object.getOwnPropertySymbols === 'function') {
-      ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
-        return Object.getOwnPropertyDescriptor(source, sym).enumerable;
-      }));
-    }
-
-    ownKeys.forEach(function (key) {
-      defineProperty(target, key, source[key]);
-    });
-  }
-
-  return target;
-}
-
-module.exports = _objectSpread;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/objectSpread2.js b/node_modules/@babel/runtime/helpers/objectSpread2.js
deleted file mode 100644
index f067f3e..0000000
--- a/node_modules/@babel/runtime/helpers/objectSpread2.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var defineProperty = require("./defineProperty");
-
-function ownKeys(object, enumerableOnly) {
-  var keys = Object.keys(object);
-
-  if (Object.getOwnPropertySymbols) {
-    var symbols = Object.getOwnPropertySymbols(object);
-    if (enumerableOnly) symbols = symbols.filter(function (sym) {
-      return Object.getOwnPropertyDescriptor(object, sym).enumerable;
-    });
-    keys.push.apply(keys, symbols);
-  }
-
-  return keys;
-}
-
-function _objectSpread2(target) {
-  for (var i = 1; i < arguments.length; i++) {
-    var source = arguments[i] != null ? arguments[i] : {};
-
-    if (i % 2) {
-      ownKeys(Object(source), true).forEach(function (key) {
-        defineProperty(target, key, source[key]);
-      });
-    } else if (Object.getOwnPropertyDescriptors) {
-      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
-    } else {
-      ownKeys(Object(source)).forEach(function (key) {
-        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
-      });
-    }
-  }
-
-  return target;
-}
-
-module.exports = _objectSpread2;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/objectWithoutProperties.js b/node_modules/@babel/runtime/helpers/objectWithoutProperties.js
deleted file mode 100644
index 253d33c..0000000
--- a/node_modules/@babel/runtime/helpers/objectWithoutProperties.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var objectWithoutPropertiesLoose = require("./objectWithoutPropertiesLoose");
-
-function _objectWithoutProperties(source, excluded) {
-  if (source == null) return {};
-  var target = objectWithoutPropertiesLoose(source, excluded);
-  var key, i;
-
-  if (Object.getOwnPropertySymbols) {
-    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
-
-    for (i = 0; i < sourceSymbolKeys.length; i++) {
-      key = sourceSymbolKeys[i];
-      if (excluded.indexOf(key) >= 0) continue;
-      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
-      target[key] = source[key];
-    }
-  }
-
-  return target;
-}
-
-module.exports = _objectWithoutProperties;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js b/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js
deleted file mode 100644
index a58c56b..0000000
--- a/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js
+++ /dev/null
@@ -1,16 +0,0 @@
-function _objectWithoutPropertiesLoose(source, excluded) {
-  if (source == null) return {};
-  var target = {};
-  var sourceKeys = Object.keys(source);
-  var key, i;
-
-  for (i = 0; i < sourceKeys.length; i++) {
-    key = sourceKeys[i];
-    if (excluded.indexOf(key) >= 0) continue;
-    target[key] = source[key];
-  }
-
-  return target;
-}
-
-module.exports = _objectWithoutPropertiesLoose;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/possibleConstructorReturn.js b/node_modules/@babel/runtime/helpers/possibleConstructorReturn.js
deleted file mode 100644
index 84f7bf6..0000000
--- a/node_modules/@babel/runtime/helpers/possibleConstructorReturn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var _typeof = require("../helpers/typeof");
-
-var assertThisInitialized = require("./assertThisInitialized");
-
-function _possibleConstructorReturn(self, call) {
-  if (call && (_typeof(call) === "object" || typeof call === "function")) {
-    return call;
-  }
-
-  return assertThisInitialized(self);
-}
-
-module.exports = _possibleConstructorReturn;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/readOnlyError.js b/node_modules/@babel/runtime/helpers/readOnlyError.js
deleted file mode 100644
index 4e61e3f..0000000
--- a/node_modules/@babel/runtime/helpers/readOnlyError.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _readOnlyError(name) {
-  throw new Error("\"" + name + "\" is read-only");
-}
-
-module.exports = _readOnlyError;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/set.js b/node_modules/@babel/runtime/helpers/set.js
deleted file mode 100644
index 97fa8c3..0000000
--- a/node_modules/@babel/runtime/helpers/set.js
+++ /dev/null
@@ -1,54 +0,0 @@
-var superPropBase = require("./superPropBase");
-
-var defineProperty = require("./defineProperty");
-
-function set(target, property, value, receiver) {
-  if (typeof Reflect !== "undefined" && Reflect.set) {
-    set = Reflect.set;
-  } else {
-    set = function set(target, property, value, receiver) {
-      var base = superPropBase(target, property);
-      var desc;
-
-      if (base) {
-        desc = Object.getOwnPropertyDescriptor(base, property);
-
-        if (desc.set) {
-          desc.set.call(receiver, value);
-          return true;
-        } else if (!desc.writable) {
-          return false;
-        }
-      }
-
-      desc = Object.getOwnPropertyDescriptor(receiver, property);
-
-      if (desc) {
-        if (!desc.writable) {
-          return false;
-        }
-
-        desc.value = value;
-        Object.defineProperty(receiver, property, desc);
-      } else {
-        defineProperty(receiver, property, value);
-      }
-
-      return true;
-    };
-  }
-
-  return set(target, property, value, receiver);
-}
-
-function _set(target, property, value, receiver, isStrict) {
-  var s = set(target, property, value, receiver || target);
-
-  if (!s && isStrict) {
-    throw new Error('failed to set property');
-  }
-
-  return value;
-}
-
-module.exports = _set;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/setPrototypeOf.js b/node_modules/@babel/runtime/helpers/setPrototypeOf.js
deleted file mode 100644
index d86e2fc..0000000
--- a/node_modules/@babel/runtime/helpers/setPrototypeOf.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function _setPrototypeOf(o, p) {
-  module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
-    o.__proto__ = p;
-    return o;
-  };
-
-  return _setPrototypeOf(o, p);
-}
-
-module.exports = _setPrototypeOf;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/skipFirstGeneratorNext.js b/node_modules/@babel/runtime/helpers/skipFirstGeneratorNext.js
deleted file mode 100644
index e1d6c86..0000000
--- a/node_modules/@babel/runtime/helpers/skipFirstGeneratorNext.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function _skipFirstGeneratorNext(fn) {
-  return function () {
-    var it = fn.apply(this, arguments);
-    it.next();
-    return it;
-  };
-}
-
-module.exports = _skipFirstGeneratorNext;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/slicedToArray.js b/node_modules/@babel/runtime/helpers/slicedToArray.js
deleted file mode 100644
index 243ea9e..0000000
--- a/node_modules/@babel/runtime/helpers/slicedToArray.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var arrayWithHoles = require("./arrayWithHoles");
-
-var iterableToArrayLimit = require("./iterableToArrayLimit");
-
-var nonIterableRest = require("./nonIterableRest");
-
-function _slicedToArray(arr, i) {
-  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();
-}
-
-module.exports = _slicedToArray;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/slicedToArrayLoose.js b/node_modules/@babel/runtime/helpers/slicedToArrayLoose.js
deleted file mode 100644
index c7e4313..0000000
--- a/node_modules/@babel/runtime/helpers/slicedToArrayLoose.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var arrayWithHoles = require("./arrayWithHoles");
-
-var iterableToArrayLimitLoose = require("./iterableToArrayLimitLoose");
-
-var nonIterableRest = require("./nonIterableRest");
-
-function _slicedToArrayLoose(arr, i) {
-  return arrayWithHoles(arr) || iterableToArrayLimitLoose(arr, i) || nonIterableRest();
-}
-
-module.exports = _slicedToArrayLoose;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/superPropBase.js b/node_modules/@babel/runtime/helpers/superPropBase.js
deleted file mode 100644
index bbb34a2..0000000
--- a/node_modules/@babel/runtime/helpers/superPropBase.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var getPrototypeOf = require("./getPrototypeOf");
-
-function _superPropBase(object, property) {
-  while (!Object.prototype.hasOwnProperty.call(object, property)) {
-    object = getPrototypeOf(object);
-    if (object === null) break;
-  }
-
-  return object;
-}
-
-module.exports = _superPropBase;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/taggedTemplateLiteral.js b/node_modules/@babel/runtime/helpers/taggedTemplateLiteral.js
deleted file mode 100644
index bdcc1e9..0000000
--- a/node_modules/@babel/runtime/helpers/taggedTemplateLiteral.js
+++ /dev/null
@@ -1,13 +0,0 @@
-function _taggedTemplateLiteral(strings, raw) {
-  if (!raw) {
-    raw = strings.slice(0);
-  }
-
-  return Object.freeze(Object.defineProperties(strings, {
-    raw: {
-      value: Object.freeze(raw)
-    }
-  }));
-}
-
-module.exports = _taggedTemplateLiteral;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/taggedTemplateLiteralLoose.js b/node_modules/@babel/runtime/helpers/taggedTemplateLiteralLoose.js
deleted file mode 100644
index beced54..0000000
--- a/node_modules/@babel/runtime/helpers/taggedTemplateLiteralLoose.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function _taggedTemplateLiteralLoose(strings, raw) {
-  if (!raw) {
-    raw = strings.slice(0);
-  }
-
-  strings.raw = raw;
-  return strings;
-}
-
-module.exports = _taggedTemplateLiteralLoose;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/tdz.js b/node_modules/@babel/runtime/helpers/tdz.js
deleted file mode 100644
index 6075e8d..0000000
--- a/node_modules/@babel/runtime/helpers/tdz.js
+++ /dev/null
@@ -1,5 +0,0 @@
-function _tdzError(name) {
-  throw new ReferenceError(name + " is not defined - temporal dead zone");
-}
-
-module.exports = _tdzError;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/temporalRef.js b/node_modules/@babel/runtime/helpers/temporalRef.js
deleted file mode 100644
index 8aa5e5e..0000000
--- a/node_modules/@babel/runtime/helpers/temporalRef.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var temporalUndefined = require("./temporalUndefined");
-
-var tdz = require("./tdz");
-
-function _temporalRef(val, name) {
-  return val === temporalUndefined ? tdz(name) : val;
-}
-
-module.exports = _temporalRef;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/temporalUndefined.js b/node_modules/@babel/runtime/helpers/temporalUndefined.js
deleted file mode 100644
index 416d9b3..0000000
--- a/node_modules/@babel/runtime/helpers/temporalUndefined.js
+++ /dev/null
@@ -1,3 +0,0 @@
-function _temporalUndefined() {}
-
-module.exports = _temporalUndefined;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/toArray.js b/node_modules/@babel/runtime/helpers/toArray.js
deleted file mode 100644
index c28fd9e..0000000
--- a/node_modules/@babel/runtime/helpers/toArray.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var arrayWithHoles = require("./arrayWithHoles");
-
-var iterableToArray = require("./iterableToArray");
-
-var nonIterableRest = require("./nonIterableRest");
-
-function _toArray(arr) {
-  return arrayWithHoles(arr) || iterableToArray(arr) || nonIterableRest();
-}
-
-module.exports = _toArray;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/toConsumableArray.js b/node_modules/@babel/runtime/helpers/toConsumableArray.js
deleted file mode 100644
index 4cd54a3..0000000
--- a/node_modules/@babel/runtime/helpers/toConsumableArray.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var arrayWithoutHoles = require("./arrayWithoutHoles");
-
-var iterableToArray = require("./iterableToArray");
-
-var nonIterableSpread = require("./nonIterableSpread");
-
-function _toConsumableArray(arr) {
-  return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();
-}
-
-module.exports = _toConsumableArray;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/toPrimitive.js b/node_modules/@babel/runtime/helpers/toPrimitive.js
deleted file mode 100644
index cd1d383..0000000
--- a/node_modules/@babel/runtime/helpers/toPrimitive.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var _typeof = require("../helpers/typeof");
-
-function _toPrimitive(input, hint) {
-  if (_typeof(input) !== "object" || input === null) return input;
-  var prim = input[Symbol.toPrimitive];
-
-  if (prim !== undefined) {
-    var res = prim.call(input, hint || "default");
-    if (_typeof(res) !== "object") return res;
-    throw new TypeError("@@toPrimitive must return a primitive value.");
-  }
-
-  return (hint === "string" ? String : Number)(input);
-}
-
-module.exports = _toPrimitive;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/toPropertyKey.js b/node_modules/@babel/runtime/helpers/toPropertyKey.js
deleted file mode 100644
index 108b083..0000000
--- a/node_modules/@babel/runtime/helpers/toPropertyKey.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var _typeof = require("../helpers/typeof");
-
-var toPrimitive = require("./toPrimitive");
-
-function _toPropertyKey(arg) {
-  var key = toPrimitive(arg, "string");
-  return _typeof(key) === "symbol" ? key : String(key);
-}
-
-module.exports = _toPropertyKey;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/typeof.js b/node_modules/@babel/runtime/helpers/typeof.js
deleted file mode 100644
index cad1233..0000000
--- a/node_modules/@babel/runtime/helpers/typeof.js
+++ /dev/null
@@ -1,17 +0,0 @@
-function _typeof(obj) {
-  "@babel/helpers - typeof";
-
-  if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
-    module.exports = _typeof = function _typeof(obj) {
-      return typeof obj;
-    };
-  } else {
-    module.exports = _typeof = function _typeof(obj) {
-      return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
-    };
-  }
-
-  return _typeof(obj);
-}
-
-module.exports = _typeof;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/wrapAsyncGenerator.js b/node_modules/@babel/runtime/helpers/wrapAsyncGenerator.js
deleted file mode 100644
index 11554f3..0000000
--- a/node_modules/@babel/runtime/helpers/wrapAsyncGenerator.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var AsyncGenerator = require("./AsyncGenerator");
-
-function _wrapAsyncGenerator(fn) {
-  return function () {
-    return new AsyncGenerator(fn.apply(this, arguments));
-  };
-}
-
-module.exports = _wrapAsyncGenerator;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/wrapNativeSuper.js b/node_modules/@babel/runtime/helpers/wrapNativeSuper.js
deleted file mode 100644
index 3d4bd7a..0000000
--- a/node_modules/@babel/runtime/helpers/wrapNativeSuper.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var getPrototypeOf = require("./getPrototypeOf");
-
-var setPrototypeOf = require("./setPrototypeOf");
-
-var isNativeFunction = require("./isNativeFunction");
-
-var construct = require("./construct");
-
-function _wrapNativeSuper(Class) {
-  var _cache = typeof Map === "function" ? new Map() : undefined;
-
-  module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) {
-    if (Class === null || !isNativeFunction(Class)) return Class;
-
-    if (typeof Class !== "function") {
-      throw new TypeError("Super expression must either be null or a function");
-    }
-
-    if (typeof _cache !== "undefined") {
-      if (_cache.has(Class)) return _cache.get(Class);
-
-      _cache.set(Class, Wrapper);
-    }
-
-    function Wrapper() {
-      return construct(Class, arguments, getPrototypeOf(this).constructor);
-    }
-
-    Wrapper.prototype = Object.create(Class.prototype, {
-      constructor: {
-        value: Wrapper,
-        enumerable: false,
-        writable: true,
-        configurable: true
-      }
-    });
-    return setPrototypeOf(Wrapper, Class);
-  };
-
-  return _wrapNativeSuper(Class);
-}
-
-module.exports = _wrapNativeSuper;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/helpers/wrapRegExp.js b/node_modules/@babel/runtime/helpers/wrapRegExp.js
deleted file mode 100644
index fcf91d8..0000000
--- a/node_modules/@babel/runtime/helpers/wrapRegExp.js
+++ /dev/null
@@ -1,76 +0,0 @@
-var _typeof = require("../helpers/typeof");
-
-var wrapNativeSuper = require("./wrapNativeSuper");
-
-var getPrototypeOf = require("./getPrototypeOf");
-
-var possibleConstructorReturn = require("./possibleConstructorReturn");
-
-var inherits = require("./inherits");
-
-function _wrapRegExp(re, groups) {
-  module.exports = _wrapRegExp = function _wrapRegExp(re, groups) {
-    return new BabelRegExp(re, undefined, groups);
-  };
-
-  var _RegExp = wrapNativeSuper(RegExp);
-
-  var _super = RegExp.prototype;
-
-  var _groups = new WeakMap();
-
-  function BabelRegExp(re, flags, groups) {
-    var _this = _RegExp.call(this, re, flags);
-
-    _groups.set(_this, groups || _groups.get(re));
-
-    return _this;
-  }
-
-  inherits(BabelRegExp, _RegExp);
-
-  BabelRegExp.prototype.exec = function (str) {
-    var result = _super.exec.call(this, str);
-
-    if (result) result.groups = buildGroups(result, this);
-    return result;
-  };
-
-  BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {
-    if (typeof substitution === "string") {
-      var groups = _groups.get(this);
-
-      return _super[Symbol.replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
-        return "$" + groups[name];
-      }));
-    } else if (typeof substitution === "function") {
-      var _this = this;
-
-      return _super[Symbol.replace].call(this, str, function () {
-        var args = [];
-        args.push.apply(args, arguments);
-
-        if (_typeof(args[args.length - 1]) !== "object") {
-          args.push(buildGroups(args, _this));
-        }
-
-        return substitution.apply(this, args);
-      });
-    } else {
-      return _super[Symbol.replace].call(this, str, substitution);
-    }
-  };
-
-  function buildGroups(result, re) {
-    var g = _groups.get(re);
-
-    return Object.keys(g).reduce(function (groups, name) {
-      groups[name] = result[g[name]];
-      return groups;
-    }, Object.create(null));
-  }
-
-  return _wrapRegExp.apply(this, arguments);
-}
-
-module.exports = _wrapRegExp;
\ No newline at end of file
diff --git a/node_modules/@babel/runtime/package.json b/node_modules/@babel/runtime/package.json
deleted file mode 100644
index 0d2b215..0000000
--- a/node_modules/@babel/runtime/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "name": "@babel/runtime",
-  "version": "7.8.7",
-  "description": "babel's modular runtime helpers",
-  "license": "MIT",
-  "publishConfig": {
-    "access": "public"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/babel/babel.git",
-    "directory": "packages/babel-runtime"
-  },
-  "homepage": "https://babeljs.io/docs/en/next/babel-runtime",
-  "author": "Sebastian McKenzie <sebmck@gmail.com>",
-  "dependencies": {
-    "regenerator-runtime": "^0.13.4"
-  },
-  "devDependencies": {
-    "@babel/helpers": "^7.8.4"
-  },
-  "gitHead": "595f65f33b8e948e34d12be83f700cf8d070c790"
-}
diff --git a/node_modules/@babel/runtime/regenerator/index.js b/node_modules/@babel/runtime/regenerator/index.js
deleted file mode 100644
index 9fd4158..0000000
--- a/node_modules/@babel/runtime/regenerator/index.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("regenerator-runtime");
diff --git a/node_modules/@babel/template/node_modules/.bin/parser b/node_modules/@babel/template/node_modules/.bin/parser
index ce7bf97..c99c430 120000
--- a/node_modules/@babel/template/node_modules/.bin/parser
+++ b/node_modules/@babel/template/node_modules/.bin/parser
@@ -1 +1 @@
-../@babel/parser/bin/babel-parser.js
\ No newline at end of file
+../../../../istanbul-lib-instrument/node_modules/@babel/parser/bin/babel-parser.js
\ No newline at end of file
diff --git a/node_modules/@babel/traverse/node_modules/.bin/parser b/node_modules/@babel/traverse/node_modules/.bin/parser
index ce7bf97..c99c430 120000
--- a/node_modules/@babel/traverse/node_modules/.bin/parser
+++ b/node_modules/@babel/traverse/node_modules/.bin/parser
@@ -1 +1 @@
-../@babel/parser/bin/babel-parser.js
\ No newline at end of file
+../../../../istanbul-lib-instrument/node_modules/@babel/parser/bin/babel-parser.js
\ No newline at end of file
diff --git a/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/index.d.ts b/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/index.d.ts
deleted file mode 100644
index dd5f5ef..0000000
--- a/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/index.d.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-declare const resolveFrom: {
-	/**
-	Resolve the path of a module like [`require.resolve()`](https://nodejs.org/api/globals.html#globals_require_resolve) but from a given path.
-
-	@param fromDirectory - Directory to resolve from.
-	@param moduleId - What you would use in `require()`.
-	@returns Resolved module path. Throws when the module can't be found.
-
-	@example
-	```
-	import resolveFrom = require('resolve-from');
-
-	// There is a file at `./foo/bar.js`
-
-	resolveFrom('foo', './bar');
-	//=> '/Users/sindresorhus/dev/test/foo/bar.js'
-	```
-	*/
-	(fromDirectory: string, moduleId: string): string;
-
-	/**
-	Resolve the path of a module like [`require.resolve()`](https://nodejs.org/api/globals.html#globals_require_resolve) but from a given path.
-
-	@param fromDirectory - Directory to resolve from.
-	@param moduleId - What you would use in `require()`.
-	@returns Resolved module path or `undefined` when the module can't be found.
-	*/
-	silent(fromDirectory: string, moduleId: string): string | undefined;
-};
-
-export = resolveFrom;
diff --git a/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/index.js b/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/index.js
deleted file mode 100644
index 44f291c..0000000
--- a/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/index.js
+++ /dev/null
@@ -1,47 +0,0 @@
-'use strict';
-const path = require('path');
-const Module = require('module');
-const fs = require('fs');
-
-const resolveFrom = (fromDirectory, moduleId, silent) => {
-	if (typeof fromDirectory !== 'string') {
-		throw new TypeError(`Expected \`fromDir\` to be of type \`string\`, got \`${typeof fromDirectory}\``);
-	}
-
-	if (typeof moduleId !== 'string') {
-		throw new TypeError(`Expected \`moduleId\` to be of type \`string\`, got \`${typeof moduleId}\``);
-	}
-
-	try {
-		fromDirectory = fs.realpathSync(fromDirectory);
-	} catch (error) {
-		if (error.code === 'ENOENT') {
-			fromDirectory = path.resolve(fromDirectory);
-		} else if (silent) {
-			return;
-		} else {
-			throw error;
-		}
-	}
-
-	const fromFile = path.join(fromDirectory, 'noop.js');
-
-	const resolveFileName = () => Module._resolveFilename(moduleId, {
-		id: fromFile,
-		filename: fromFile,
-		paths: Module._nodeModulePaths(fromDirectory)
-	});
-
-	if (silent) {
-		try {
-			return resolveFileName();
-		} catch (error) {
-			return;
-		}
-	}
-
-	return resolveFileName();
-};
-
-module.exports = (fromDirectory, moduleId) => resolveFrom(fromDirectory, moduleId);
-module.exports.silent = (fromDirectory, moduleId) => resolveFrom(fromDirectory, moduleId, true);
diff --git a/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/package.json b/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/package.json
deleted file mode 100644
index 733df16..0000000
--- a/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-	"name": "resolve-from",
-	"version": "5.0.0",
-	"description": "Resolve the path of a module like `require.resolve()` but from a given path",
-	"license": "MIT",
-	"repository": "sindresorhus/resolve-from",
-	"author": {
-		"name": "Sindre Sorhus",
-		"email": "sindresorhus@gmail.com",
-		"url": "sindresorhus.com"
-	},
-	"engines": {
-		"node": ">=8"
-	},
-	"scripts": {
-		"test": "xo && ava && tsd"
-	},
-	"files": [
-		"index.js",
-		"index.d.ts"
-	],
-	"keywords": [
-		"require",
-		"resolve",
-		"path",
-		"module",
-		"from",
-		"like",
-		"import"
-	],
-	"devDependencies": {
-		"ava": "^1.4.1",
-		"tsd": "^0.7.2",
-		"xo": "^0.24.0"
-	}
-}
diff --git a/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/readme.md b/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/readme.md
deleted file mode 100644
index fd4f46f..0000000
--- a/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/readme.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# resolve-from [![Build Status](https://travis-ci.org/sindresorhus/resolve-from.svg?branch=master)](https://travis-ci.org/sindresorhus/resolve-from)
-
-> Resolve the path of a module like [`require.resolve()`](https://nodejs.org/api/globals.html#globals_require_resolve) but from a given path
-
-
-## Install
-
-```
-$ npm install resolve-from
-```
-
-
-## Usage
-
-```js
-const resolveFrom = require('resolve-from');
-
-// There is a file at `./foo/bar.js`
-
-resolveFrom('foo', './bar');
-//=> '/Users/sindresorhus/dev/test/foo/bar.js'
-```
-
-
-## API
-
-### resolveFrom(fromDirectory, moduleId)
-
-Like `require()`, throws when the module can't be found.
-
-### resolveFrom.silent(fromDirectory, moduleId)
-
-Returns `undefined` instead of throwing when the module can't be found.
-
-#### fromDirectory
-
-Type: `string`
-
-Directory to resolve from.
-
-#### moduleId
-
-Type: `string`
-
-What you would use in `require()`.
-
-
-## Tip
-
-Create a partial using a bound function if you want to resolve from the same `fromDirectory` multiple times:
-
-```js
-const resolveFromFoo = resolveFrom.bind(null, 'foo');
-
-resolveFromFoo('./bar');
-resolveFromFoo('./baz');
-```
-
-
-## Related
-
-- [resolve-cwd](https://github.com/sindresorhus/resolve-cwd) - Resolve the path of a module from the current working directory
-- [import-from](https://github.com/sindresorhus/import-from) - Import a module from a given path
-- [import-cwd](https://github.com/sindresorhus/import-cwd) - Import a module from the current working directory
-- [resolve-pkg](https://github.com/sindresorhus/resolve-pkg) - Resolve the path of a package regardless of it having an entry point
-- [import-lazy](https://github.com/sindresorhus/import-lazy) - Import a module lazily
-- [resolve-global](https://github.com/sindresorhus/resolve-global) - Resolve the path of a globally installed module
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/@jest/core/node_modules/.bin/rimraf b/node_modules/@jest/core/node_modules/.bin/rimraf
index ec9dc7b..4cd49a4 120000
--- a/node_modules/@jest/core/node_modules/.bin/rimraf
+++ b/node_modules/@jest/core/node_modules/.bin/rimraf
@@ -1 +1 @@
-../../../../rimraf/bin.js
\ No newline at end of file
+../rimraf/bin.js
\ No newline at end of file
diff --git a/node_modules/mute-stream/LICENSE b/node_modules/@jest/core/node_modules/rimraf/LICENSE
similarity index 100%
rename from node_modules/mute-stream/LICENSE
rename to node_modules/@jest/core/node_modules/rimraf/LICENSE
diff --git a/node_modules/@jest/core/node_modules/rimraf/README.md b/node_modules/@jest/core/node_modules/rimraf/README.md
new file mode 100644
index 0000000..423b8cf
--- /dev/null
+++ b/node_modules/@jest/core/node_modules/rimraf/README.md
@@ -0,0 +1,101 @@
+[![Build Status](https://travis-ci.org/isaacs/rimraf.svg?branch=master)](https://travis-ci.org/isaacs/rimraf) [![Dependency Status](https://david-dm.org/isaacs/rimraf.svg)](https://david-dm.org/isaacs/rimraf) [![devDependency Status](https://david-dm.org/isaacs/rimraf/dev-status.svg)](https://david-dm.org/isaacs/rimraf#info=devDependencies)
+
+The [UNIX command](http://en.wikipedia.org/wiki/Rm_(Unix)) `rm -rf` for node.
+
+Install with `npm install rimraf`, or just drop rimraf.js somewhere.
+
+## API
+
+`rimraf(f, [opts], callback)`
+
+The first parameter will be interpreted as a globbing pattern for files. If you
+want to disable globbing you can do so with `opts.disableGlob` (defaults to
+`false`). This might be handy, for instance, if you have filenames that contain
+globbing wildcard characters.
+
+The callback will be called with an error if there is one.  Certain
+errors are handled for you:
+
+* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of
+  `opts.maxBusyTries` times before giving up, adding 100ms of wait
+  between each attempt.  The default `maxBusyTries` is 3.
+* `ENOENT` - If the file doesn't exist, rimraf will return
+  successfully, since your desired outcome is already the case.
+* `EMFILE` - Since `readdir` requires opening a file descriptor, it's
+  possible to hit `EMFILE` if too many file descriptors are in use.
+  In the sync case, there's nothing to be done for this.  But in the
+  async case, rimraf will gradually back off with timeouts up to
+  `opts.emfileWait` ms, which defaults to 1000.
+
+## options
+
+* unlink, chmod, stat, lstat, rmdir, readdir,
+  unlinkSync, chmodSync, statSync, lstatSync, rmdirSync, readdirSync
+
+    In order to use a custom file system library, you can override
+    specific fs functions on the options object.
+
+    If any of these functions are present on the options object, then
+    the supplied function will be used instead of the default fs
+    method.
+
+    Sync methods are only relevant for `rimraf.sync()`, of course.
+
+    For example:
+
+    ```javascript
+    var myCustomFS = require('some-custom-fs')
+
+    rimraf('some-thing', myCustomFS, callback)
+    ```
+
+* maxBusyTries
+
+    If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error code is encountered
+    on Windows systems, then rimraf will retry with a linear backoff
+    wait of 100ms longer on each try.  The default maxBusyTries is 3.
+
+    Only relevant for async usage.
+
+* emfileWait
+
+    If an `EMFILE` error is encountered, then rimraf will retry
+    repeatedly with a linear backoff of 1ms longer on each try, until
+    the timeout counter hits this max.  The default limit is 1000.
+
+    If you repeatedly encounter `EMFILE` errors, then consider using
+    [graceful-fs](http://npm.im/graceful-fs) in your program.
+
+    Only relevant for async usage.
+
+* glob
+
+    Set to `false` to disable [glob](http://npm.im/glob) pattern
+    matching.
+
+    Set to an object to pass options to the glob module.  The default
+    glob options are `{ nosort: true, silent: true }`.
+
+    Glob version 6 is used in this module.
+
+    Relevant for both sync and async usage.
+
+* disableGlob
+
+    Set to any non-falsey value to disable globbing entirely.
+    (Equivalent to setting `glob: false`.)
+
+## rimraf.sync
+
+It can remove stuff synchronously, too.  But that's not so good.  Use
+the async API.  It's better.
+
+## CLI
+
+If installed with `npm install rimraf -g` it can be used as a global
+command `rimraf <path> [<path> ...]` which is useful for cross platform support.
+
+## mkdirp
+
+If you need to create a directory recursively, check out
+[mkdirp](https://github.com/substack/node-mkdirp).
diff --git a/node_modules/@jest/core/node_modules/rimraf/bin.js b/node_modules/@jest/core/node_modules/rimraf/bin.js
new file mode 100755
index 0000000..023814c
--- /dev/null
+++ b/node_modules/@jest/core/node_modules/rimraf/bin.js
@@ -0,0 +1,68 @@
+#!/usr/bin/env node
+
+const rimraf = require('./')
+
+const path = require('path')
+
+const isRoot = arg => /^(\/|[a-zA-Z]:\\)$/.test(path.resolve(arg))
+const filterOutRoot = arg => {
+  const ok = preserveRoot === false || !isRoot(arg)
+  if (!ok) {
+    console.error(`refusing to remove ${arg}`)
+    console.error('Set --no-preserve-root to allow this')
+  }
+  return ok
+}
+
+let help = false
+let dashdash = false
+let noglob = false
+let preserveRoot = true
+const args = process.argv.slice(2).filter(arg => {
+  if (dashdash)
+    return !!arg
+  else if (arg === '--')
+    dashdash = true
+  else if (arg === '--no-glob' || arg === '-G')
+    noglob = true
+  else if (arg === '--glob' || arg === '-g')
+    noglob = false
+  else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/))
+    help = true
+  else if (arg === '--preserve-root')
+    preserveRoot = true
+  else if (arg === '--no-preserve-root')
+    preserveRoot = false
+  else
+    return !!arg
+}).filter(arg => !preserveRoot || filterOutRoot(arg))
+
+const go = n => {
+  if (n >= args.length)
+    return
+  const options = noglob ? { glob: false } : {}
+  rimraf(args[n], options, er => {
+    if (er)
+      throw er
+    go(n+1)
+  })
+}
+
+if (help || args.length === 0) {
+  // If they didn't ask for help, then this is not a "success"
+  const log = help ? console.log : console.error
+  log('Usage: rimraf <path> [<path> ...]')
+  log('')
+  log('  Deletes all files and folders at "path" recursively.')
+  log('')
+  log('Options:')
+  log('')
+  log('  -h, --help          Display this usage info')
+  log('  -G, --no-glob       Do not expand glob patterns in arguments')
+  log('  -g, --glob          Expand glob patterns in arguments (default)')
+  log('  --preserve-root     Do not remove \'/\' (default)')
+  log('  --no-preserve-root  Do not treat \'/\' specially')
+  log('  --                  Stop parsing flags')
+  process.exit(help ? 0 : 1)
+} else
+  go(0)
diff --git a/node_modules/@jest/core/node_modules/rimraf/package.json b/node_modules/@jest/core/node_modules/rimraf/package.json
new file mode 100644
index 0000000..68c98f9
--- /dev/null
+++ b/node_modules/@jest/core/node_modules/rimraf/package.json
@@ -0,0 +1,29 @@
+{
+  "name": "rimraf",
+  "version": "3.0.0",
+  "main": "rimraf.js",
+  "description": "A deep deletion module for node (like `rm -rf`)",
+  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
+  "license": "ISC",
+  "repository": "git://github.com/isaacs/rimraf.git",
+  "scripts": {
+    "preversion": "npm test",
+    "postversion": "npm publish",
+    "postpublish": "git push origin --follow-tags",
+    "test": "tap test/*.js"
+  },
+  "bin": "./bin.js",
+  "dependencies": {
+    "glob": "^7.1.3"
+  },
+  "files": [
+    "LICENSE",
+    "README.md",
+    "bin.js",
+    "rimraf.js"
+  ],
+  "devDependencies": {
+    "mkdirp": "^0.5.1",
+    "tap": "^12.1.1"
+  }
+}
diff --git a/node_modules/@jest/core/node_modules/rimraf/rimraf.js b/node_modules/@jest/core/node_modules/rimraf/rimraf.js
new file mode 100644
index 0000000..309b8ca
--- /dev/null
+++ b/node_modules/@jest/core/node_modules/rimraf/rimraf.js
@@ -0,0 +1,368 @@
+const assert = require("assert")
+const path = require("path")
+const fs = require("fs")
+let glob = undefined
+try {
+  glob = require("glob")
+} catch (_err) {
+  // treat glob as optional.
+}
+
+const defaultGlobOpts = {
+  nosort: true,
+  silent: true
+}
+
+// for EMFILE handling
+let timeout = 0
+
+const isWindows = (process.platform === "win32")
+
+const defaults = options => {
+  const methods = [
+    'unlink',
+    'chmod',
+    'stat',
+    'lstat',
+    'rmdir',
+    'readdir'
+  ]
+  methods.forEach(m => {
+    options[m] = options[m] || fs[m]
+    m = m + 'Sync'
+    options[m] = options[m] || fs[m]
+  })
+
+  options.maxBusyTries = options.maxBusyTries || 3
+  options.emfileWait = options.emfileWait || 1000
+  if (options.glob === false) {
+    options.disableGlob = true
+  }
+  if (options.disableGlob !== true && glob === undefined) {
+    throw Error('glob dependency not found, set `options.disableGlob = true` if intentional')
+  }
+  options.disableGlob = options.disableGlob || false
+  options.glob = options.glob || defaultGlobOpts
+}
+
+const rimraf = (p, options, cb) => {
+  if (typeof options === 'function') {
+    cb = options
+    options = {}
+  }
+
+  assert(p, 'rimraf: missing path')
+  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
+  assert.equal(typeof cb, 'function', 'rimraf: callback function required')
+  assert(options, 'rimraf: invalid options argument provided')
+  assert.equal(typeof options, 'object', 'rimraf: options should be object')
+
+  defaults(options)
+
+  let busyTries = 0
+  let errState = null
+  let n = 0
+
+  const next = (er) => {
+    errState = errState || er
+    if (--n === 0)
+      cb(errState)
+  }
+
+  const afterGlob = (er, results) => {
+    if (er)
+      return cb(er)
+
+    n = results.length
+    if (n === 0)
+      return cb()
+
+    results.forEach(p => {
+      const CB = (er) => {
+        if (er) {
+          if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") &&
+              busyTries < options.maxBusyTries) {
+            busyTries ++
+            // try again, with the same exact callback as this one.
+            return setTimeout(() => rimraf_(p, options, CB), busyTries * 100)
+          }
+
+          // this one won't happen if graceful-fs is used.
+          if (er.code === "EMFILE" && timeout < options.emfileWait) {
+            return setTimeout(() => rimraf_(p, options, CB), timeout ++)
+          }
+
+          // already gone
+          if (er.code === "ENOENT") er = null
+        }
+
+        timeout = 0
+        next(er)
+      }
+      rimraf_(p, options, CB)
+    })
+  }
+
+  if (options.disableGlob || !glob.hasMagic(p))
+    return afterGlob(null, [p])
+
+  options.lstat(p, (er, stat) => {
+    if (!er)
+      return afterGlob(null, [p])
+
+    glob(p, options.glob, afterGlob)
+  })
+
+}
+
+// Two possible strategies.
+// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
+// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
+//
+// Both result in an extra syscall when you guess wrong.  However, there
+// are likely far more normal files in the world than directories.  This
+// is based on the assumption that a the average number of files per
+// directory is >= 1.
+//
+// If anyone ever complains about this, then I guess the strategy could
+// be made configurable somehow.  But until then, YAGNI.
+const rimraf_ = (p, options, cb) => {
+  assert(p)
+  assert(options)
+  assert(typeof cb === 'function')
+
+  // sunos lets the root user unlink directories, which is... weird.
+  // so we have to lstat here and make sure it's not a dir.
+  options.lstat(p, (er, st) => {
+    if (er && er.code === "ENOENT")
+      return cb(null)
+
+    // Windows can EPERM on stat.  Life is suffering.
+    if (er && er.code === "EPERM" && isWindows)
+      fixWinEPERM(p, options, er, cb)
+
+    if (st && st.isDirectory())
+      return rmdir(p, options, er, cb)
+
+    options.unlink(p, er => {
+      if (er) {
+        if (er.code === "ENOENT")
+          return cb(null)
+        if (er.code === "EPERM")
+          return (isWindows)
+            ? fixWinEPERM(p, options, er, cb)
+            : rmdir(p, options, er, cb)
+        if (er.code === "EISDIR")
+          return rmdir(p, options, er, cb)
+      }
+      return cb(er)
+    })
+  })
+}
+
+const fixWinEPERM = (p, options, er, cb) => {
+  assert(p)
+  assert(options)
+  assert(typeof cb === 'function')
+  if (er)
+    assert(er instanceof Error)
+
+  options.chmod(p, 0o666, er2 => {
+    if (er2)
+      cb(er2.code === "ENOENT" ? null : er)
+    else
+      options.stat(p, (er3, stats) => {
+        if (er3)
+          cb(er3.code === "ENOENT" ? null : er)
+        else if (stats.isDirectory())
+          rmdir(p, options, er, cb)
+        else
+          options.unlink(p, cb)
+      })
+  })
+}
+
+const fixWinEPERMSync = (p, options, er) => {
+  assert(p)
+  assert(options)
+  if (er)
+    assert(er instanceof Error)
+
+  try {
+    options.chmodSync(p, 0o666)
+  } catch (er2) {
+    if (er2.code === "ENOENT")
+      return
+    else
+      throw er
+  }
+
+  let stats
+  try {
+    stats = options.statSync(p)
+  } catch (er3) {
+    if (er3.code === "ENOENT")
+      return
+    else
+      throw er
+  }
+
+  if (stats.isDirectory())
+    rmdirSync(p, options, er)
+  else
+    options.unlinkSync(p)
+}
+
+const rmdir = (p, options, originalEr, cb) => {
+  assert(p)
+  assert(options)
+  if (originalEr)
+    assert(originalEr instanceof Error)
+  assert(typeof cb === 'function')
+
+  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
+  // if we guessed wrong, and it's not a directory, then
+  // raise the original error.
+  options.rmdir(p, er => {
+    if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
+      rmkids(p, options, cb)
+    else if (er && er.code === "ENOTDIR")
+      cb(originalEr)
+    else
+      cb(er)
+  })
+}
+
+const rmkids = (p, options, cb) => {
+  assert(p)
+  assert(options)
+  assert(typeof cb === 'function')
+
+  options.readdir(p, (er, files) => {
+    if (er)
+      return cb(er)
+    let n = files.length
+    if (n === 0)
+      return options.rmdir(p, cb)
+    let errState
+    files.forEach(f => {
+      rimraf(path.join(p, f), options, er => {
+        if (errState)
+          return
+        if (er)
+          return cb(errState = er)
+        if (--n === 0)
+          options.rmdir(p, cb)
+      })
+    })
+  })
+}
+
+// this looks simpler, and is strictly *faster*, but will
+// tie up the JavaScript thread and fail on excessively
+// deep directory trees.
+const rimrafSync = (p, options) => {
+  options = options || {}
+  defaults(options)
+
+  assert(p, 'rimraf: missing path')
+  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
+  assert(options, 'rimraf: missing options')
+  assert.equal(typeof options, 'object', 'rimraf: options should be object')
+
+  let results
+
+  if (options.disableGlob || !glob.hasMagic(p)) {
+    results = [p]
+  } else {
+    try {
+      options.lstatSync(p)
+      results = [p]
+    } catch (er) {
+      results = glob.sync(p, options.glob)
+    }
+  }
+
+  if (!results.length)
+    return
+
+  for (let i = 0; i < results.length; i++) {
+    const p = results[i]
+
+    let st
+    try {
+      st = options.lstatSync(p)
+    } catch (er) {
+      if (er.code === "ENOENT")
+        return
+
+      // Windows can EPERM on stat.  Life is suffering.
+      if (er.code === "EPERM" && isWindows)
+        fixWinEPERMSync(p, options, er)
+    }
+
+    try {
+      // sunos lets the root user unlink directories, which is... weird.
+      if (st && st.isDirectory())
+        rmdirSync(p, options, null)
+      else
+        options.unlinkSync(p)
+    } catch (er) {
+      if (er.code === "ENOENT")
+        return
+      if (er.code === "EPERM")
+        return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
+      if (er.code !== "EISDIR")
+        throw er
+
+      rmdirSync(p, options, er)
+    }
+  }
+}
+
+const rmdirSync = (p, options, originalEr) => {
+  assert(p)
+  assert(options)
+  if (originalEr)
+    assert(originalEr instanceof Error)
+
+  try {
+    options.rmdirSync(p)
+  } catch (er) {
+    if (er.code === "ENOENT")
+      return
+    if (er.code === "ENOTDIR")
+      throw originalEr
+    if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")
+      rmkidsSync(p, options)
+  }
+}
+
+const rmkidsSync = (p, options) => {
+  assert(p)
+  assert(options)
+  options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))
+
+  // We only end up here once we got ENOTEMPTY at least once, and
+  // at this point, we are guaranteed to have removed all the kids.
+  // So, we know that it won't be ENOENT or ENOTDIR or anything else.
+  // try really hard to delete stuff on windows, because it has a
+  // PROFOUNDLY annoying habit of not closing handles promptly when
+  // files are deleted, resulting in spurious ENOTEMPTY errors.
+  const retries = isWindows ? 100 : 1
+  let i = 0
+  do {
+    let threw = true
+    try {
+      const ret = options.rmdirSync(p, options)
+      threw = false
+      return ret
+    } finally {
+      if (++i < retries && threw)
+        continue
+    }
+  } while (true)
+}
+
+module.exports = rimraf
+rimraf.sync = rimrafSync
diff --git a/node_modules/@jest/environment/build/index.d.ts b/node_modules/@jest/environment/build/index.d.ts
index 5310d92..4c5a409 100644
--- a/node_modules/@jest/environment/build/index.d.ts
+++ b/node_modules/@jest/environment/build/index.d.ts
@@ -16,7 +16,7 @@
     docblockPragmas: Record<string, string | Array<string>>;
     testPath: Config.Path;
 }>;
-export declare type ModuleWrapper = (this: Module['exports'], module: Module, exports: Module['exports'], require: Module['require'], __dirname: string, __filename: Module['filename'], global: Global.Global, jest: Jest, ...extraGlobals: Array<Global.Global[keyof Global.Global]>) => unknown;
+export declare type ModuleWrapper = (this: Module['exports'], module: Module, exports: Module['exports'], require: Module['require'], __dirname: string, __filename: Module['filename'], global: Global.Global, jest?: Jest, ...extraGlobals: Array<Global.Global[keyof Global.Global]>) => unknown;
 export declare class JestEnvironment {
     constructor(config: Config.ProjectConfig, context?: EnvironmentContext);
     global: Global.Global;
@@ -39,7 +39,7 @@
      *
      * @deprecated Use `expect.extend` instead
      */
-    addMatchers(matchers: Record<string, any>): void;
+    addMatchers(matchers: Record<string, unknown>): void;
     /**
      * Advances all timers by the needed milliseconds so that only the next timeouts/intervals will run.
      * Optionally, you can provide steps, so it will run steps amount of next timeouts/intervals.
@@ -118,7 +118,7 @@
     /**
      * Determines if the given function is a mocked function.
      */
-    isMockFunction(fn: Function): fn is ReturnType<JestMockFn>;
+    isMockFunction(fn: (...args: Array<any>) => unknown): fn is ReturnType<JestMockFn>;
     /**
      * Mocks a module with an auto-mocked version when it is being required.
      */
diff --git a/node_modules/@jest/environment/node_modules/@jest/types/build/Circus.d.ts b/node_modules/@jest/environment/node_modules/@jest/types/build/Circus.d.ts
index e6ad88d..417a5fe 100644
--- a/node_modules/@jest/environment/node_modules/@jest/types/build/Circus.d.ts
+++ b/node_modules/@jest/environment/node_modules/@jest/types/build/Circus.d.ts
@@ -18,7 +18,7 @@
 export declare type AsyncFn = TestFn | HookFn;
 export declare type SharedHookType = 'afterAll' | 'beforeAll';
 export declare type HookType = SharedHookType | 'afterEach' | 'beforeEach';
-export declare type TestContext = Record<string, any>;
+export declare type TestContext = Record<string, unknown>;
 export declare type Exception = any;
 export declare type FormattedError = string;
 export declare type Hook = {
@@ -33,6 +33,9 @@
     (event: SyncEvent, state: State): void;
 }
 export declare type Event = SyncEvent | AsyncEvent;
+interface JestGlobals extends Global.TestFrameworkGlobals {
+    expect: unknown;
+}
 export declare type SyncEvent = {
     asyncError: Error;
     mode: BlockMode;
@@ -62,6 +65,7 @@
 export declare type AsyncEvent = {
     name: 'setup';
     testNamePattern?: string;
+    runtimeGlobals: JestGlobals;
     parentProcess: Process;
 } | {
     name: 'include_test_location_in_result';
@@ -143,7 +147,7 @@
 export declare type TestResults = Array<TestResult>;
 export declare type GlobalErrorHandlers = {
     uncaughtException: Array<(exception: Exception) => void>;
-    unhandledRejection: Array<(exception: Exception, promise: Promise<any>) => void>;
+    unhandledRejection: Array<(exception: Exception, promise: Promise<unknown>) => void>;
 };
 export declare type State = {
     currentDescribeBlock: DescribeBlock;
diff --git a/node_modules/@jest/environment/node_modules/@jest/types/build/Config.d.ts b/node_modules/@jest/environment/node_modules/@jest/types/build/Config.d.ts
index f280c29..5f94989 100644
--- a/node_modules/@jest/environment/node_modules/@jest/types/build/Config.d.ts
+++ b/node_modules/@jest/environment/node_modules/@jest/types/build/Config.d.ts
@@ -42,6 +42,7 @@
     forceCoverageMatch: Array<Glob>;
     globals: ConfigGlobals;
     haste: HasteConfig;
+    injectGlobals: boolean;
     maxConcurrency: number;
     maxWorkers: number | string;
     moduleDirectories: Array<string>;
@@ -64,7 +65,7 @@
     slowTestThreshold: number;
     snapshotSerializers: Array<Path>;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testFailureExitCode: string | number;
     testLocationInResults: boolean;
     testMatch: Array<Glob>;
@@ -122,6 +123,7 @@
     globalSetup: string | null | undefined;
     globalTeardown: string | null | undefined;
     haste: HasteConfig;
+    injectGlobals: boolean;
     reporters: Array<string | ReporterConfig>;
     logHeapUsage: boolean;
     lastCommit: boolean;
@@ -169,7 +171,7 @@
     snapshotSerializers: Array<Path>;
     errorOnDeprecated: boolean;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testFailureExitCode: string | number;
     testLocationInResults: boolean;
     testMatch: Array<Glob>;
@@ -195,7 +197,7 @@
     watch: boolean;
     watchAll: boolean;
     watchman: boolean;
-    watchPlugins: Array<string | [string, Record<string, any>]>;
+    watchPlugins: Array<string | [string, Record<string, unknown>]>;
 }>;
 export declare type SnapshotUpdateState = 'all' | 'new' | 'none';
 declare type NotifyMode = 'always' | 'failure' | 'success' | 'change' | 'success-change' | 'failure-change';
@@ -273,7 +275,7 @@
     watchman: boolean;
     watchPlugins?: Array<{
         path: string;
-        config: Record<string, any>;
+        config: Record<string, unknown>;
     }> | null;
 };
 export declare type ProjectConfig = {
@@ -295,6 +297,7 @@
     globalTeardown?: string;
     globals: ConfigGlobals;
     haste: HasteConfig;
+    injectGlobals: boolean;
     moduleDirectories: Array<string>;
     moduleFileExtensions: Array<string>;
     moduleLoader?: Path;
@@ -318,7 +321,7 @@
     snapshotResolver?: Path;
     snapshotSerializers: Array<Path>;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testMatch: Array<Glob>;
     testLocationInResults: boolean;
     testPathIgnorePatterns: Array<string>;
@@ -363,6 +366,7 @@
     globalTeardown: string | null | undefined;
     haste: string;
     init: boolean;
+    injectGlobals: boolean;
     json: boolean;
     lastCommit: boolean;
     logHeapUsage: boolean;
diff --git a/node_modules/@jest/environment/node_modules/@jest/types/build/Global.d.ts b/node_modules/@jest/environment/node_modules/@jest/types/build/Global.d.ts
index c1d541b..8670a49 100644
--- a/node_modules/@jest/environment/node_modules/@jest/types/build/Global.d.ts
+++ b/node_modules/@jest/environment/node_modules/@jest/types/build/Global.d.ts
@@ -24,9 +24,12 @@
 export declare type EachTestFn<EachCallback extends TestCallback> = (...args: Array<any>) => ReturnType<EachCallback>;
 declare type Jasmine = {
     _DEFAULT_TIMEOUT_INTERVAL?: number;
-    addMatchers: Function;
+    addMatchers: (matchers: Record<string, unknown>) => void;
 };
-declare type Each<EachCallback extends TestCallback> = ((table: EachTable, ...taggedTemplateData: Array<unknown>) => (title: string, test: EachTestFn<EachCallback>, timeout?: number) => void) | (() => void);
+declare type Each<EachCallback extends TestCallback> = ((table: EachTable, ...taggedTemplateData: Array<unknown>) => (title: string, test: EachTestFn<EachCallback>, timeout?: number) => void) | (() => () => void);
+export interface HookBase {
+    (fn: HookFn, timeout?: number): void;
+}
 export interface ItBase {
     (testName: TestName, fn: TestFn, timeout?: number): void;
     each: Each<TestFn>;
@@ -34,7 +37,7 @@
 export interface It extends ItBase {
     only: ItBase;
     skip: ItBase;
-    todo: (testName: TestName, ...rest: Array<any>) => void;
+    todo: (testName: TestName) => void;
 }
 export interface ItConcurrentBase {
     (testName: string, testFn: ConcurrentTestFn, timeout?: number): void;
@@ -66,10 +69,10 @@
     describe: Describe;
     xdescribe: DescribeBase;
     fdescribe: DescribeBase;
-    beforeAll: HookFn;
-    beforeEach: HookFn;
-    afterEach: HookFn;
-    afterAll: HookFn;
+    beforeAll: HookBase;
+    beforeEach: HookBase;
+    afterEach: HookBase;
+    afterAll: HookBase;
 }
 export interface GlobalAdditions extends TestFrameworkGlobals {
     __coverage__: CoverageMapData;
@@ -80,6 +83,6 @@
     spyOnProperty: () => void;
 }
 export interface Global extends GlobalAdditions, Omit<NodeJS.Global, keyof GlobalAdditions> {
-    [extras: string]: any;
+    [extras: string]: unknown;
 }
 export {};
diff --git a/node_modules/@jest/environment/node_modules/@jest/types/package.json b/node_modules/@jest/environment/node_modules/@jest/types/package.json
index 772dfac..c8aa07c 100644
--- a/node_modules/@jest/environment/node_modules/@jest/types/package.json
+++ b/node_modules/@jest/environment/node_modules/@jest/types/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/types",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -22,5 +22,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/@jest/environment/node_modules/jest-mock/build/index.d.ts b/node_modules/@jest/environment/node_modules/jest-mock/build/index.d.ts
index 4360cd5..ce7ba58 100644
--- a/node_modules/@jest/environment/node_modules/jest-mock/build/index.d.ts
+++ b/node_modules/@jest/environment/node_modules/jest-mock/build/index.d.ts
@@ -42,12 +42,13 @@
         mockReturnThis(): this;
         mockReturnValue(value: T): this;
         mockReturnValueOnce(value: T): this;
-        mockResolvedValue(value: T): this;
-        mockResolvedValueOnce(value: T): this;
-        mockRejectedValue(value: T): this;
-        mockRejectedValueOnce(value: T): this;
+        mockResolvedValue(value: Unpromisify<T>): this;
+        mockResolvedValueOnce(value: Unpromisify<T>): this;
+        mockRejectedValue(value: unknown): this;
+        mockRejectedValueOnce(value: unknown): this;
     }
 }
+declare type Unpromisify<T> = T extends Promise<infer R> ? R : never;
 /**
  * Possible types of a MockFunctionResult.
  * 'return': The call completed by returning normally.
diff --git a/node_modules/@jest/environment/node_modules/jest-mock/build/index.js b/node_modules/@jest/environment/node_modules/jest-mock/build/index.js
index 7c1e40d..2ebc513 100644
--- a/node_modules/@jest/environment/node_modules/jest-mock/build/index.js
+++ b/node_modules/@jest/environment/node_modules/jest-mock/build/index.js
@@ -21,6 +21,8 @@
  * LICENSE file in the root directory of this source tree.
  */
 
+/* eslint-disable local/ban-types-eventually, local/prefer-rest-params-eventually */
+
 /**
  * Possible types of a MockFunctionResult.
  * 'return': The call completed by returning normally.
@@ -909,7 +911,6 @@
     return value == null ? '' + value : typeof value;
   }
 }
-/* eslint-disable-next-line no-redeclare */
 
 const JestMock = new ModuleMockerClass(global);
 module.exports = JestMock;
diff --git a/node_modules/@jest/environment/node_modules/jest-mock/package.json b/node_modules/@jest/environment/node_modules/jest-mock/package.json
index 7478b55..7d60952 100644
--- a/node_modules/@jest/environment/node_modules/jest-mock/package.json
+++ b/node_modules/@jest/environment/node_modules/jest-mock/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-mock",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,7 +10,7 @@
     "node": ">= 10.14.2"
   },
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "@types/node": "*"
   },
   "license": "MIT",
@@ -19,5 +19,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/@jest/environment/package.json b/node_modules/@jest/environment/package.json
index 6d43ea9..ef830fa 100644
--- a/node_modules/@jest/environment/package.json
+++ b/node_modules/@jest/environment/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/environment",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,10 +10,10 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/fake-timers": "^26.3.0",
-    "@jest/types": "^26.3.0",
+    "@jest/fake-timers": "^26.5.2",
+    "@jest/types": "^26.5.2",
     "@types/node": "*",
-    "jest-mock": "^26.3.0"
+    "jest-mock": "^26.5.2"
   },
   "engines": {
     "node": ">= 10.14.2"
@@ -21,5 +21,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/@jest/fake-timers/node_modules/@jest/types/build/Circus.d.ts b/node_modules/@jest/fake-timers/node_modules/@jest/types/build/Circus.d.ts
index e6ad88d..417a5fe 100644
--- a/node_modules/@jest/fake-timers/node_modules/@jest/types/build/Circus.d.ts
+++ b/node_modules/@jest/fake-timers/node_modules/@jest/types/build/Circus.d.ts
@@ -18,7 +18,7 @@
 export declare type AsyncFn = TestFn | HookFn;
 export declare type SharedHookType = 'afterAll' | 'beforeAll';
 export declare type HookType = SharedHookType | 'afterEach' | 'beforeEach';
-export declare type TestContext = Record<string, any>;
+export declare type TestContext = Record<string, unknown>;
 export declare type Exception = any;
 export declare type FormattedError = string;
 export declare type Hook = {
@@ -33,6 +33,9 @@
     (event: SyncEvent, state: State): void;
 }
 export declare type Event = SyncEvent | AsyncEvent;
+interface JestGlobals extends Global.TestFrameworkGlobals {
+    expect: unknown;
+}
 export declare type SyncEvent = {
     asyncError: Error;
     mode: BlockMode;
@@ -62,6 +65,7 @@
 export declare type AsyncEvent = {
     name: 'setup';
     testNamePattern?: string;
+    runtimeGlobals: JestGlobals;
     parentProcess: Process;
 } | {
     name: 'include_test_location_in_result';
@@ -143,7 +147,7 @@
 export declare type TestResults = Array<TestResult>;
 export declare type GlobalErrorHandlers = {
     uncaughtException: Array<(exception: Exception) => void>;
-    unhandledRejection: Array<(exception: Exception, promise: Promise<any>) => void>;
+    unhandledRejection: Array<(exception: Exception, promise: Promise<unknown>) => void>;
 };
 export declare type State = {
     currentDescribeBlock: DescribeBlock;
diff --git a/node_modules/@jest/fake-timers/node_modules/@jest/types/build/Config.d.ts b/node_modules/@jest/fake-timers/node_modules/@jest/types/build/Config.d.ts
index f280c29..5f94989 100644
--- a/node_modules/@jest/fake-timers/node_modules/@jest/types/build/Config.d.ts
+++ b/node_modules/@jest/fake-timers/node_modules/@jest/types/build/Config.d.ts
@@ -42,6 +42,7 @@
     forceCoverageMatch: Array<Glob>;
     globals: ConfigGlobals;
     haste: HasteConfig;
+    injectGlobals: boolean;
     maxConcurrency: number;
     maxWorkers: number | string;
     moduleDirectories: Array<string>;
@@ -64,7 +65,7 @@
     slowTestThreshold: number;
     snapshotSerializers: Array<Path>;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testFailureExitCode: string | number;
     testLocationInResults: boolean;
     testMatch: Array<Glob>;
@@ -122,6 +123,7 @@
     globalSetup: string | null | undefined;
     globalTeardown: string | null | undefined;
     haste: HasteConfig;
+    injectGlobals: boolean;
     reporters: Array<string | ReporterConfig>;
     logHeapUsage: boolean;
     lastCommit: boolean;
@@ -169,7 +171,7 @@
     snapshotSerializers: Array<Path>;
     errorOnDeprecated: boolean;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testFailureExitCode: string | number;
     testLocationInResults: boolean;
     testMatch: Array<Glob>;
@@ -195,7 +197,7 @@
     watch: boolean;
     watchAll: boolean;
     watchman: boolean;
-    watchPlugins: Array<string | [string, Record<string, any>]>;
+    watchPlugins: Array<string | [string, Record<string, unknown>]>;
 }>;
 export declare type SnapshotUpdateState = 'all' | 'new' | 'none';
 declare type NotifyMode = 'always' | 'failure' | 'success' | 'change' | 'success-change' | 'failure-change';
@@ -273,7 +275,7 @@
     watchman: boolean;
     watchPlugins?: Array<{
         path: string;
-        config: Record<string, any>;
+        config: Record<string, unknown>;
     }> | null;
 };
 export declare type ProjectConfig = {
@@ -295,6 +297,7 @@
     globalTeardown?: string;
     globals: ConfigGlobals;
     haste: HasteConfig;
+    injectGlobals: boolean;
     moduleDirectories: Array<string>;
     moduleFileExtensions: Array<string>;
     moduleLoader?: Path;
@@ -318,7 +321,7 @@
     snapshotResolver?: Path;
     snapshotSerializers: Array<Path>;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testMatch: Array<Glob>;
     testLocationInResults: boolean;
     testPathIgnorePatterns: Array<string>;
@@ -363,6 +366,7 @@
     globalTeardown: string | null | undefined;
     haste: string;
     init: boolean;
+    injectGlobals: boolean;
     json: boolean;
     lastCommit: boolean;
     logHeapUsage: boolean;
diff --git a/node_modules/@jest/fake-timers/node_modules/@jest/types/build/Global.d.ts b/node_modules/@jest/fake-timers/node_modules/@jest/types/build/Global.d.ts
index c1d541b..8670a49 100644
--- a/node_modules/@jest/fake-timers/node_modules/@jest/types/build/Global.d.ts
+++ b/node_modules/@jest/fake-timers/node_modules/@jest/types/build/Global.d.ts
@@ -24,9 +24,12 @@
 export declare type EachTestFn<EachCallback extends TestCallback> = (...args: Array<any>) => ReturnType<EachCallback>;
 declare type Jasmine = {
     _DEFAULT_TIMEOUT_INTERVAL?: number;
-    addMatchers: Function;
+    addMatchers: (matchers: Record<string, unknown>) => void;
 };
-declare type Each<EachCallback extends TestCallback> = ((table: EachTable, ...taggedTemplateData: Array<unknown>) => (title: string, test: EachTestFn<EachCallback>, timeout?: number) => void) | (() => void);
+declare type Each<EachCallback extends TestCallback> = ((table: EachTable, ...taggedTemplateData: Array<unknown>) => (title: string, test: EachTestFn<EachCallback>, timeout?: number) => void) | (() => () => void);
+export interface HookBase {
+    (fn: HookFn, timeout?: number): void;
+}
 export interface ItBase {
     (testName: TestName, fn: TestFn, timeout?: number): void;
     each: Each<TestFn>;
@@ -34,7 +37,7 @@
 export interface It extends ItBase {
     only: ItBase;
     skip: ItBase;
-    todo: (testName: TestName, ...rest: Array<any>) => void;
+    todo: (testName: TestName) => void;
 }
 export interface ItConcurrentBase {
     (testName: string, testFn: ConcurrentTestFn, timeout?: number): void;
@@ -66,10 +69,10 @@
     describe: Describe;
     xdescribe: DescribeBase;
     fdescribe: DescribeBase;
-    beforeAll: HookFn;
-    beforeEach: HookFn;
-    afterEach: HookFn;
-    afterAll: HookFn;
+    beforeAll: HookBase;
+    beforeEach: HookBase;
+    afterEach: HookBase;
+    afterAll: HookBase;
 }
 export interface GlobalAdditions extends TestFrameworkGlobals {
     __coverage__: CoverageMapData;
@@ -80,6 +83,6 @@
     spyOnProperty: () => void;
 }
 export interface Global extends GlobalAdditions, Omit<NodeJS.Global, keyof GlobalAdditions> {
-    [extras: string]: any;
+    [extras: string]: unknown;
 }
 export {};
diff --git a/node_modules/@jest/fake-timers/node_modules/@jest/types/package.json b/node_modules/@jest/fake-timers/node_modules/@jest/types/package.json
index 772dfac..c8aa07c 100644
--- a/node_modules/@jest/fake-timers/node_modules/@jest/types/package.json
+++ b/node_modules/@jest/fake-timers/node_modules/@jest/types/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/types",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -22,5 +22,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/@jest/fake-timers/node_modules/@types/stack-utils/LICENSE b/node_modules/@jest/fake-timers/node_modules/@types/stack-utils/LICENSE
new file mode 100644
index 0000000..9e841e7
--- /dev/null
+++ b/node_modules/@jest/fake-timers/node_modules/@types/stack-utils/LICENSE
@@ -0,0 +1,21 @@
+    MIT License
+
+    Copyright (c) Microsoft Corporation.
+
+    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/node_modules/@jest/fake-timers/node_modules/@types/stack-utils/README.md b/node_modules/@jest/fake-timers/node_modules/@types/stack-utils/README.md
new file mode 100644
index 0000000..92a34de
--- /dev/null
+++ b/node_modules/@jest/fake-timers/node_modules/@types/stack-utils/README.md
@@ -0,0 +1,16 @@
+# Installation
+> `npm install --save @types/stack-utils`
+
+# Summary
+This package contains type definitions for stack-utils (https://github.com/tapjs/stack-utils#readme).
+
+# Details
+Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/stack-utils.
+
+### Additional Details
+ * Last updated: Tue, 22 Sep 2020 00:22:28 GMT
+ * Dependencies: none
+ * Global values: none
+
+# Credits
+These definitions were written by [BendingBender](https://github.com/BendingBender).
diff --git a/node_modules/@jest/fake-timers/node_modules/@types/stack-utils/index.d.ts b/node_modules/@jest/fake-timers/node_modules/@types/stack-utils/index.d.ts
new file mode 100644
index 0000000..3427e35
--- /dev/null
+++ b/node_modules/@jest/fake-timers/node_modules/@types/stack-utils/index.d.ts
@@ -0,0 +1,65 @@
+// Type definitions for stack-utils 2.0
+// Project: https://github.com/tapjs/stack-utils#readme
+// Definitions by: BendingBender <https://github.com/BendingBender>
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+// TypeScript Version: 2.2
+
+export = StackUtils;
+
+declare class StackUtils {
+    static nodeInternals(): RegExp[];
+    constructor(options?: StackUtils.Options);
+    clean(stack: string | string[]): string;
+    capture(limit?: number, startStackFunction?: Function): StackUtils.CallSite[];
+    capture(startStackFunction: Function): StackUtils.CallSite[];
+    captureString(limit?: number, startStackFunction?: Function): string;
+    captureString(startStackFunction: Function): string;
+    at(startStackFunction?: Function): StackUtils.CallSiteLike;
+    parseLine(line: string): StackUtils.StackLineData | null;
+}
+
+declare namespace StackUtils {
+    interface Options {
+        internals?: RegExp[];
+        ignoredPackages?: string[];
+        cwd?: string;
+        wrapCallSite?(callSite: CallSite): CallSite;
+    }
+
+    interface CallSite {
+        getThis(): object | undefined;
+        getTypeName(): string;
+        getFunction(): Function | undefined;
+        getFunctionName(): string;
+        getMethodName(): string | null;
+        getFileName(): string | undefined;
+        getLineNumber(): number;
+        getColumnNumber(): number;
+        getEvalOrigin(): CallSite | string;
+        isToplevel(): boolean;
+        isEval(): boolean;
+        isNative(): boolean;
+        isConstructor(): boolean;
+    }
+
+    interface CallSiteLike extends StackData {
+        type?: string;
+    }
+
+    interface StackLineData extends StackData {
+        evalLine?: number;
+        evalColumn?: number;
+        evalFile?: string;
+    }
+
+    interface StackData {
+        line?: number;
+        column?: number;
+        file?: string;
+        constructor?: boolean;
+        evalOrigin?: string;
+        native?: boolean;
+        function?: string;
+        method?: string;
+    }
+}
diff --git a/node_modules/@jest/fake-timers/node_modules/@types/stack-utils/package.json b/node_modules/@jest/fake-timers/node_modules/@types/stack-utils/package.json
new file mode 100644
index 0000000..1f9393a
--- /dev/null
+++ b/node_modules/@jest/fake-timers/node_modules/@types/stack-utils/package.json
@@ -0,0 +1,24 @@
+{
+    "name": "@types/stack-utils",
+    "version": "2.0.0",
+    "description": "TypeScript definitions for stack-utils",
+    "license": "MIT",
+    "contributors": [
+        {
+            "name": "BendingBender",
+            "url": "https://github.com/BendingBender",
+            "githubUsername": "BendingBender"
+        }
+    ],
+    "main": "",
+    "types": "index.d.ts",
+    "repository": {
+        "type": "git",
+        "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
+        "directory": "types/stack-utils"
+    },
+    "scripts": {},
+    "dependencies": {},
+    "typesPublisherContentHash": "53c84779043276d5e313653eabfc4fedae5b103c7dc645555065fdc3b4b0a982",
+    "typeScriptVersion": "3.2"
+}
\ No newline at end of file
diff --git a/node_modules/@jest/fake-timers/node_modules/jest-message-util/package.json b/node_modules/@jest/fake-timers/node_modules/jest-message-util/package.json
index 6f8b6c4..2bbf224 100644
--- a/node_modules/@jest/fake-timers/node_modules/jest-message-util/package.json
+++ b/node_modules/@jest/fake-timers/node_modules/jest-message-util/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-message-util",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -14,8 +14,8 @@
   "types": "build/index.d.ts",
   "dependencies": {
     "@babel/code-frame": "^7.0.0",
-    "@jest/types": "^26.3.0",
-    "@types/stack-utils": "^1.0.1",
+    "@jest/types": "^26.5.2",
+    "@types/stack-utils": "^2.0.0",
     "chalk": "^4.0.0",
     "graceful-fs": "^4.2.4",
     "micromatch": "^4.0.2",
@@ -30,5 +30,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/@jest/fake-timers/node_modules/jest-mock/build/index.d.ts b/node_modules/@jest/fake-timers/node_modules/jest-mock/build/index.d.ts
index 4360cd5..ce7ba58 100644
--- a/node_modules/@jest/fake-timers/node_modules/jest-mock/build/index.d.ts
+++ b/node_modules/@jest/fake-timers/node_modules/jest-mock/build/index.d.ts
@@ -42,12 +42,13 @@
         mockReturnThis(): this;
         mockReturnValue(value: T): this;
         mockReturnValueOnce(value: T): this;
-        mockResolvedValue(value: T): this;
-        mockResolvedValueOnce(value: T): this;
-        mockRejectedValue(value: T): this;
-        mockRejectedValueOnce(value: T): this;
+        mockResolvedValue(value: Unpromisify<T>): this;
+        mockResolvedValueOnce(value: Unpromisify<T>): this;
+        mockRejectedValue(value: unknown): this;
+        mockRejectedValueOnce(value: unknown): this;
     }
 }
+declare type Unpromisify<T> = T extends Promise<infer R> ? R : never;
 /**
  * Possible types of a MockFunctionResult.
  * 'return': The call completed by returning normally.
diff --git a/node_modules/@jest/fake-timers/node_modules/jest-mock/build/index.js b/node_modules/@jest/fake-timers/node_modules/jest-mock/build/index.js
index 7c1e40d..2ebc513 100644
--- a/node_modules/@jest/fake-timers/node_modules/jest-mock/build/index.js
+++ b/node_modules/@jest/fake-timers/node_modules/jest-mock/build/index.js
@@ -21,6 +21,8 @@
  * LICENSE file in the root directory of this source tree.
  */
 
+/* eslint-disable local/ban-types-eventually, local/prefer-rest-params-eventually */
+
 /**
  * Possible types of a MockFunctionResult.
  * 'return': The call completed by returning normally.
@@ -909,7 +911,6 @@
     return value == null ? '' + value : typeof value;
   }
 }
-/* eslint-disable-next-line no-redeclare */
 
 const JestMock = new ModuleMockerClass(global);
 module.exports = JestMock;
diff --git a/node_modules/@jest/fake-timers/node_modules/jest-mock/package.json b/node_modules/@jest/fake-timers/node_modules/jest-mock/package.json
index 7478b55..7d60952 100644
--- a/node_modules/@jest/fake-timers/node_modules/jest-mock/package.json
+++ b/node_modules/@jest/fake-timers/node_modules/jest-mock/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-mock",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,7 +10,7 @@
     "node": ">= 10.14.2"
   },
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "@types/node": "*"
   },
   "license": "MIT",
@@ -19,5 +19,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/@jest/fake-timers/node_modules/jest-util/build/ErrorWithStack.d.ts b/node_modules/@jest/fake-timers/node_modules/jest-util/build/ErrorWithStack.d.ts
index 2698f36..79764bd 100644
--- a/node_modules/@jest/fake-timers/node_modules/jest-util/build/ErrorWithStack.d.ts
+++ b/node_modules/@jest/fake-timers/node_modules/jest-util/build/ErrorWithStack.d.ts
@@ -5,5 +5,5 @@
  * LICENSE file in the root directory of this source tree.
  */
 export default class ErrorWithStack extends Error {
-    constructor(message: string | undefined, callsite: Function);
+    constructor(message: string | undefined, callsite: (...args: Array<any>) => unknown);
 }
diff --git a/node_modules/@jest/fake-timers/node_modules/jest-util/build/convertDescriptorToString.js b/node_modules/@jest/fake-timers/node_modules/jest-util/build/convertDescriptorToString.js
index 0cfab68..4b776af 100644
--- a/node_modules/@jest/fake-timers/node_modules/jest-util/build/convertDescriptorToString.js
+++ b/node_modules/@jest/fake-timers/node_modules/jest-util/build/convertDescriptorToString.js
@@ -11,6 +11,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+
+/* eslint-disable local/ban-types-eventually */
 // See: https://github.com/facebook/jest/pull/5154
 function convertDescriptorToString(descriptor) {
   if (
diff --git a/node_modules/@jest/fake-timers/node_modules/jest-util/build/globsToMatcher.d.ts b/node_modules/@jest/fake-timers/node_modules/jest-util/build/globsToMatcher.d.ts
index 4e6cc5b..687684f 100644
--- a/node_modules/@jest/fake-timers/node_modules/jest-util/build/globsToMatcher.d.ts
+++ b/node_modules/@jest/fake-timers/node_modules/jest-util/build/globsToMatcher.d.ts
@@ -5,6 +5,7 @@
  * LICENSE file in the root directory of this source tree.
  */
 import type { Config } from '@jest/types';
+declare type Matcher = (str: Config.Path) => boolean;
 /**
  * Converts a list of globs into a function that matches a path against the
  * globs.
@@ -22,4 +23,5 @@
  * isMatch('pizza.js'); // true
  * isMatch('pizza.test.js'); // false
  */
-export default function globsToMatcher(globs: Array<Config.Glob>): (path: Config.Path) => boolean;
+export default function globsToMatcher(globs: Array<Config.Glob>): Matcher;
+export {};
diff --git a/node_modules/@jest/fake-timers/node_modules/jest-util/build/globsToMatcher.js b/node_modules/@jest/fake-timers/node_modules/jest-util/build/globsToMatcher.js
index e517762..9e63c5c 100644
--- a/node_modules/@jest/fake-timers/node_modules/jest-util/build/globsToMatcher.js
+++ b/node_modules/@jest/fake-timers/node_modules/jest-util/build/globsToMatcher.js
@@ -55,7 +55,7 @@
   if (globs.length === 0) {
     // Since there were no globs given, we can simply have a fast path here and
     // return with a very simple function.
-    return _ => false;
+    return () => false;
   }
 
   const matchers = globs.map(glob => {
diff --git a/node_modules/@jest/fake-timers/node_modules/jest-util/package.json b/node_modules/@jest/fake-timers/node_modules/jest-util/package.json
index 01d0850..b584b93 100644
--- a/node_modules/@jest/fake-timers/node_modules/jest-util/package.json
+++ b/node_modules/@jest/fake-timers/node_modules/jest-util/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-util",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,7 +10,7 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "@types/node": "*",
     "chalk": "^4.0.0",
     "graceful-fs": "^4.2.4",
@@ -28,5 +28,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/@jest/fake-timers/package.json b/node_modules/@jest/fake-timers/package.json
index 73ddfc6..310497f 100644
--- a/node_modules/@jest/fake-timers/package.json
+++ b/node_modules/@jest/fake-timers/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/fake-timers",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,12 +10,12 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "@sinonjs/fake-timers": "^6.0.1",
     "@types/node": "*",
-    "jest-message-util": "^26.3.0",
-    "jest-mock": "^26.3.0",
-    "jest-util": "^26.3.0"
+    "jest-message-util": "^26.5.2",
+    "jest-mock": "^26.5.2",
+    "jest-util": "^26.5.2"
   },
   "devDependencies": {
     "@types/sinonjs__fake-timers": "^6.0.1"
@@ -26,5 +26,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/LICENSE b/node_modules/@octokit/request/node_modules/@octokit/endpoint/LICENSE
deleted file mode 100644
index af5366d..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License
-
-Copyright (c) 2018 Octokit contributors
-
-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/node_modules/@octokit/request/node_modules/@octokit/endpoint/README.md b/node_modules/@octokit/request/node_modules/@octokit/endpoint/README.md
deleted file mode 100644
index ec54be2..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/README.md
+++ /dev/null
@@ -1,421 +0,0 @@
-# endpoint.js
-
-> Turns GitHub REST API endpoints into generic request options
-
-[![@latest](https://img.shields.io/npm/v/@octokit/endpoint.svg)](https://www.npmjs.com/package/@octokit/endpoint)
-![Build Status](https://github.com/octokit/endpoint.js/workflows/Test/badge.svg)
-
-`@octokit/endpoint` combines [GitHub REST API routes](https://developer.github.com/v3/) with your parameters and turns them into generic request options that can be used in any request library.
-
-<!-- update table of contents by running `npx markdown-toc README.md -i` -->
-
-<!-- toc -->
-
-- [Usage](#usage)
-- [API](#api)
-  - [`endpoint(route, options)` or `endpoint(options)`](#endpointroute-options-or-endpointoptions)
-  - [`endpoint.defaults()`](#endpointdefaults)
-  - [`endpoint.DEFAULTS`](#endpointdefaults)
-  - [`endpoint.merge(route, options)` or `endpoint.merge(options)`](#endpointmergeroute-options-or-endpointmergeoptions)
-  - [`endpoint.parse()`](#endpointparse)
-- [Special cases](#special-cases)
-  - [The `data` parameter – set request body directly](#the-data-parameter-%E2%80%93-set-request-body-directly)
-  - [Set parameters for both the URL/query and the request body](#set-parameters-for-both-the-urlquery-and-the-request-body)
-- [LICENSE](#license)
-
-<!-- tocstop -->
-
-## Usage
-
-<table>
-<tbody valign=top align=left>
-<tr><th>
-Browsers
-</th><td width=100%>
-Load <code>@octokit/endpoint</code> directly from <a href="https://cdn.pika.dev">cdn.pika.dev</a>
-        
-```html
-<script type="module">
-import { endpoint } from "https://cdn.pika.dev/@octokit/endpoint";
-</script>
-```
-
-</td></tr>
-<tr><th>
-Node
-</th><td>
-
-Install with <code>npm install @octokit/endpoint</code>
-
-```js
-const { endpoint } = require("@octokit/endpoint");
-// or: import { endpoint } from "@octokit/endpoint";
-```
-
-</td></tr>
-</tbody>
-</table>
-
-Example for [List organization repositories](https://developer.github.com/v3/repos/#list-organization-repositories)
-
-```js
-const requestOptions = endpoint("GET /orgs/:org/repos", {
-  headers: {
-    authorization: "token 0000000000000000000000000000000000000001",
-  },
-  org: "octokit",
-  type: "private",
-});
-```
-
-The resulting `requestOptions` looks as follows
-
-```json
-{
-  "method": "GET",
-  "url": "https://api.github.com/orgs/octokit/repos?type=private",
-  "headers": {
-    "accept": "application/vnd.github.v3+json",
-    "authorization": "token 0000000000000000000000000000000000000001",
-    "user-agent": "octokit/endpoint.js v1.2.3"
-  }
-}
-```
-
-You can pass `requestOptions` to common request libraries
-
-```js
-const { url, ...options } = requestOptions;
-// using with fetch (https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
-fetch(url, options);
-// using with request (https://github.com/request/request)
-request(requestOptions);
-// using with got (https://github.com/sindresorhus/got)
-got[options.method](url, options);
-// using with axios
-axios(requestOptions);
-```
-
-## API
-
-### `endpoint(route, options)` or `endpoint(options)`
-
-<table>
-  <thead align=left>
-    <tr>
-      <th>
-        name
-      </th>
-      <th>
-        type
-      </th>
-      <th width=100%>
-        description
-      </th>
-    </tr>
-  </thead>
-  <tbody align=left valign=top>
-    <tr>
-      <th>
-        <code>route</code>
-      </th>
-      <td>
-        String
-      </td>
-      <td>
-        If set, it has to be a string consisting of URL and the request method, e.g., <code>GET /orgs/:org</code>. If it’s set to a URL, only the method defaults to <code>GET</code>.
-      </td>
-    </tr>
-    <tr>
-      <th>
-        <code>options.method</code>
-      </th>
-      <td>
-        String
-      </td>
-      <td>
-        <strong>Required unless <code>route</code> is set.</strong> Any supported <a href="https://developer.github.com/v3/#http-verbs">http verb</a>. <em>Defaults to <code>GET</code></em>.
-      </td>
-    </tr>
-    <tr>
-      <th>
-        <code>options.url</code>
-      </th>
-      <td>
-        String
-      </td>
-      <td>
-        <strong>Required unless <code>route</code> is set.</strong> A path or full URL which may contain <code>:variable</code> or <code>{variable}</code> placeholders,
-        e.g., <code>/orgs/:org/repos</code>. The <code>url</code> is parsed using <a href="https://github.com/bramstein/url-template">url-template</a>.
-      </td>
-    </tr>
-    <tr>
-      <th>
-        <code>options.baseUrl</code>
-      </th>
-      <td>
-        String
-      </td>
-      <td>
-        <em>Defaults to <code>https://api.github.com</code></em>.
-      </td>
-    </tr>
-    <tr>
-      <th>
-        <code>options.headers</code>
-      </th>
-      <td>
-        Object
-      </td>
-      <td>
-        Custom headers. Passed headers are merged with defaults:<br>
-        <em><code>headers['user-agent']</code> defaults to <code>octokit-endpoint.js/1.2.3</code> (where <code>1.2.3</code> is the released version)</em>.<br>
-        <em><code>headers['accept']</code> defaults to <code>application/vnd.github.v3+json</code></em>.<br>
-      </td>
-    </tr>
-    <tr>
-      <th>
-        <code>options.mediaType.format</code>
-      </th>
-      <td>
-        String
-      </td>
-      <td>
-        Media type param, such as <code>raw</code>, <code>diff</code>, or <code>text+json</code>. See <a href="https://developer.github.com/v3/media/">Media Types</a>. Setting <code>options.mediaType.format</code> will amend the <code>headers.accept</code> value.
-      </td>
-    </tr>
-    <tr>
-      <th>
-        <code>options.mediaType.previews</code>
-      </th>
-      <td>
-        Array of Strings
-      </td>
-      <td>
-        Name of previews, such as <code>mercy</code>, <code>symmetra</code>, or <code>scarlet-witch</code>. See <a href="https://developer.github.com/v3/previews/">API Previews</a>. If <code>options.mediaType.previews</code> was set as default, the new previews will be merged into the default ones. Setting <code>options.mediaType.previews</code> will amend the <code>headers.accept</code> value. <code>options.mediaType.previews</code> will be merged with an existing array set using <code>.defaults()</code>.
-      </td>
-    </tr>
-    <tr>
-      <th>
-        <code>options.data</code>
-      </th>
-      <td>
-        Any
-      </td>
-      <td>
-        Set request body directly instead of setting it to JSON based on additional parameters. See <a href="#data-parameter">"The <code>data</code> parameter"</a> below.
-      </td>
-    </tr>
-    <tr>
-      <th>
-        <code>options.request</code>
-      </th>
-      <td>
-        Object
-      </td>
-      <td>
-        Pass custom meta information for the request. The <code>request</code> object will be returned as is.
-      </td>
-    </tr>
-  </tbody>
-</table>
-
-All other options will be passed depending on the `method` and `url` options.
-
-1. If the option key has a placeholder in the `url`, it will be used as the replacement. For example, if the passed options are `{url: '/orgs/:org/repos', org: 'foo'}` the returned `options.url` is `https://api.github.com/orgs/foo/repos`.
-2. If the `method` is `GET` or `HEAD`, the option is passed as a query parameter.
-3. Otherwise, the parameter is passed in the request body as a JSON key.
-
-**Result**
-
-`endpoint()` is a synchronous method and returns an object with the following keys:
-
-<table>
-  <thead align=left>
-    <tr>
-      <th>
-        key
-      </th>
-      <th>
-        type
-      </th>
-      <th width=100%>
-        description
-      </th>
-    </tr>
-  </thead>
-  <tbody align=left valign=top>
-    <tr>
-      <th><code>method</code></th>
-      <td>String</td>
-      <td>The http method. Always lowercase.</td>
-    </tr>
-    <tr>
-      <th><code>url</code></th>
-      <td>String</td>
-      <td>The url with placeholders replaced with passed parameters.</td>
-    </tr>
-    <tr>
-      <th><code>headers</code></th>
-      <td>Object</td>
-      <td>All header names are lowercased.</td>
-    </tr>
-    <tr>
-      <th><code>body</code></th>
-      <td>Any</td>
-      <td>The request body if one is present. Only for <code>PATCH</code>, <code>POST</code>, <code>PUT</code>, <code>DELETE</code> requests.</td>
-    </tr>
-    <tr>
-      <th><code>request</code></th>
-      <td>Object</td>
-      <td>Request meta option, it will be returned as it was passed into <code>endpoint()</code></td>
-    </tr>
-  </tbody>
-</table>
-
-### `endpoint.defaults()`
-
-Override or set default options. Example:
-
-```js
-const request = require("request");
-const myEndpoint = require("@octokit/endpoint").defaults({
-  baseUrl: "https://github-enterprise.acme-inc.com/api/v3",
-  headers: {
-    "user-agent": "myApp/1.2.3",
-    authorization: `token 0000000000000000000000000000000000000001`,
-  },
-  org: "my-project",
-  per_page: 100,
-});
-
-request(myEndpoint(`GET /orgs/:org/repos`));
-```
-
-You can call `.defaults()` again on the returned method, the defaults will cascade.
-
-```js
-const myProjectEndpoint = endpoint.defaults({
-  baseUrl: "https://github-enterprise.acme-inc.com/api/v3",
-  headers: {
-    "user-agent": "myApp/1.2.3",
-  },
-  org: "my-project",
-});
-const myProjectEndpointWithAuth = myProjectEndpoint.defaults({
-  headers: {
-    authorization: `token 0000000000000000000000000000000000000001`,
-  },
-});
-```
-
-`myProjectEndpointWithAuth` now defaults the `baseUrl`, `headers['user-agent']`,
-`org` and `headers['authorization']` on top of `headers['accept']` that is set
-by the global default.
-
-### `endpoint.DEFAULTS`
-
-The current default options.
-
-```js
-endpoint.DEFAULTS.baseUrl; // https://api.github.com
-const myEndpoint = endpoint.defaults({
-  baseUrl: "https://github-enterprise.acme-inc.com/api/v3",
-});
-myEndpoint.DEFAULTS.baseUrl; // https://github-enterprise.acme-inc.com/api/v3
-```
-
-### `endpoint.merge(route, options)` or `endpoint.merge(options)`
-
-Get the defaulted endpoint options, but without parsing them into request options:
-
-```js
-const myProjectEndpoint = endpoint.defaults({
-  baseUrl: "https://github-enterprise.acme-inc.com/api/v3",
-  headers: {
-    "user-agent": "myApp/1.2.3",
-  },
-  org: "my-project",
-});
-myProjectEndpoint.merge("GET /orgs/:org/repos", {
-  headers: {
-    authorization: `token 0000000000000000000000000000000000000001`,
-  },
-  org: "my-secret-project",
-  type: "private",
-});
-
-// {
-//   baseUrl: 'https://github-enterprise.acme-inc.com/api/v3',
-//   method: 'GET',
-//   url: '/orgs/:org/repos',
-//   headers: {
-//     accept: 'application/vnd.github.v3+json',
-//     authorization: `token 0000000000000000000000000000000000000001`,
-//     'user-agent': 'myApp/1.2.3'
-//   },
-//   org: 'my-secret-project',
-//   type: 'private'
-// }
-```
-
-### `endpoint.parse()`
-
-Stateless method to turn endpoint options into request options. Calling
-`endpoint(options)` is the same as calling `endpoint.parse(endpoint.merge(options))`.
-
-## Special cases
-
-<a name="data-parameter"></a>
-
-### The `data` parameter – set request body directly
-
-Some endpoints such as [Render a Markdown document in raw mode](https://developer.github.com/v3/markdown/#render-a-markdown-document-in-raw-mode) don’t have parameters that are sent as request body keys, instead, the request body needs to be set directly. In these cases, set the `data` parameter.
-
-```js
-const options = endpoint("POST /markdown/raw", {
-  data: "Hello world github/linguist#1 **cool**, and #1!",
-  headers: {
-    accept: "text/html;charset=utf-8",
-    "content-type": "text/plain",
-  },
-});
-
-// options is
-// {
-//   method: 'post',
-//   url: 'https://api.github.com/markdown/raw',
-//   headers: {
-//     accept: 'text/html;charset=utf-8',
-//     'content-type': 'text/plain',
-//     'user-agent': userAgent
-//   },
-//   body: 'Hello world github/linguist#1 **cool**, and #1!'
-// }
-```
-
-### Set parameters for both the URL/query and the request body
-
-There are API endpoints that accept both query parameters as well as a body. In that case, you need to add the query parameters as templates to `options.url`, as defined in the [RFC 6570 URI Template specification](https://tools.ietf.org/html/rfc6570).
-
-Example
-
-```js
-endpoint(
-  "POST https://uploads.github.com/repos/octocat/Hello-World/releases/1/assets{?name,label}",
-  {
-    name: "example.zip",
-    label: "short description",
-    headers: {
-      "content-type": "text/plain",
-      "content-length": 14,
-      authorization: `token 0000000000000000000000000000000000000001`,
-    },
-    data: "Hello, world!",
-  }
-);
-```
-
-## LICENSE
-
-[MIT](LICENSE)
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-node/index.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-node/index.js
deleted file mode 100644
index 35f5878..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-node/index.js
+++ /dev/null
@@ -1,379 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, '__esModule', { value: true });
-
-function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
-
-var isPlainObject = _interopDefault(require('is-plain-object'));
-var universalUserAgent = require('universal-user-agent');
-
-function lowercaseKeys(object) {
-  if (!object) {
-    return {};
-  }
-
-  return Object.keys(object).reduce((newObj, key) => {
-    newObj[key.toLowerCase()] = object[key];
-    return newObj;
-  }, {});
-}
-
-function mergeDeep(defaults, options) {
-  const result = Object.assign({}, defaults);
-  Object.keys(options).forEach(key => {
-    if (isPlainObject(options[key])) {
-      if (!(key in defaults)) Object.assign(result, {
-        [key]: options[key]
-      });else result[key] = mergeDeep(defaults[key], options[key]);
-    } else {
-      Object.assign(result, {
-        [key]: options[key]
-      });
-    }
-  });
-  return result;
-}
-
-function merge(defaults, route, options) {
-  if (typeof route === "string") {
-    let [method, url] = route.split(" ");
-    options = Object.assign(url ? {
-      method,
-      url
-    } : {
-      url: method
-    }, options);
-  } else {
-    options = Object.assign({}, route);
-  } // lowercase header names before merging with defaults to avoid duplicates
-
-
-  options.headers = lowercaseKeys(options.headers);
-  const mergedOptions = mergeDeep(defaults || {}, options); // mediaType.previews arrays are merged, instead of overwritten
-
-  if (defaults && defaults.mediaType.previews.length) {
-    mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(preview => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews);
-  }
-
-  mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map(preview => preview.replace(/-preview/, ""));
-  return mergedOptions;
-}
-
-function addQueryParameters(url, parameters) {
-  const separator = /\?/.test(url) ? "&" : "?";
-  const names = Object.keys(parameters);
-
-  if (names.length === 0) {
-    return url;
-  }
-
-  return url + separator + names.map(name => {
-    if (name === "q") {
-      return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+");
-    }
-
-    return `${name}=${encodeURIComponent(parameters[name])}`;
-  }).join("&");
-}
-
-const urlVariableRegex = /\{[^}]+\}/g;
-
-function removeNonChars(variableName) {
-  return variableName.replace(/^\W+|\W+$/g, "").split(/,/);
-}
-
-function extractUrlVariableNames(url) {
-  const matches = url.match(urlVariableRegex);
-
-  if (!matches) {
-    return [];
-  }
-
-  return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);
-}
-
-function omit(object, keysToOmit) {
-  return Object.keys(object).filter(option => !keysToOmit.includes(option)).reduce((obj, key) => {
-    obj[key] = object[key];
-    return obj;
-  }, {});
-}
-
-// Based on https://github.com/bramstein/url-template, licensed under BSD
-// TODO: create separate package.
-//
-// Copyright (c) 2012-2014, Bram Stein
-// All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//  1. Redistributions of source code must retain the above copyright
-//     notice, this list of conditions and the following disclaimer.
-//  2. Redistributions in binary form must reproduce the above copyright
-//     notice, this list of conditions and the following disclaimer in the
-//     documentation and/or other materials provided with the distribution.
-//  3. The name of the author may not be used to endorse or promote products
-//     derived from this software without specific prior written permission.
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
-// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-/* istanbul ignore file */
-function encodeReserved(str) {
-  return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {
-    if (!/%[0-9A-Fa-f]/.test(part)) {
-      part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");
-    }
-
-    return part;
-  }).join("");
-}
-
-function encodeUnreserved(str) {
-  return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
-    return "%" + c.charCodeAt(0).toString(16).toUpperCase();
-  });
-}
-
-function encodeValue(operator, value, key) {
-  value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value);
-
-  if (key) {
-    return encodeUnreserved(key) + "=" + value;
-  } else {
-    return value;
-  }
-}
-
-function isDefined(value) {
-  return value !== undefined && value !== null;
-}
-
-function isKeyOperator(operator) {
-  return operator === ";" || operator === "&" || operator === "?";
-}
-
-function getValues(context, operator, key, modifier) {
-  var value = context[key],
-      result = [];
-
-  if (isDefined(value) && value !== "") {
-    if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
-      value = value.toString();
-
-      if (modifier && modifier !== "*") {
-        value = value.substring(0, parseInt(modifier, 10));
-      }
-
-      result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
-    } else {
-      if (modifier === "*") {
-        if (Array.isArray(value)) {
-          value.filter(isDefined).forEach(function (value) {
-            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
-          });
-        } else {
-          Object.keys(value).forEach(function (k) {
-            if (isDefined(value[k])) {
-              result.push(encodeValue(operator, value[k], k));
-            }
-          });
-        }
-      } else {
-        const tmp = [];
-
-        if (Array.isArray(value)) {
-          value.filter(isDefined).forEach(function (value) {
-            tmp.push(encodeValue(operator, value));
-          });
-        } else {
-          Object.keys(value).forEach(function (k) {
-            if (isDefined(value[k])) {
-              tmp.push(encodeUnreserved(k));
-              tmp.push(encodeValue(operator, value[k].toString()));
-            }
-          });
-        }
-
-        if (isKeyOperator(operator)) {
-          result.push(encodeUnreserved(key) + "=" + tmp.join(","));
-        } else if (tmp.length !== 0) {
-          result.push(tmp.join(","));
-        }
-      }
-    }
-  } else {
-    if (operator === ";") {
-      if (isDefined(value)) {
-        result.push(encodeUnreserved(key));
-      }
-    } else if (value === "" && (operator === "&" || operator === "?")) {
-      result.push(encodeUnreserved(key) + "=");
-    } else if (value === "") {
-      result.push("");
-    }
-  }
-
-  return result;
-}
-
-function parseUrl(template) {
-  return {
-    expand: expand.bind(null, template)
-  };
-}
-
-function expand(template, context) {
-  var operators = ["+", "#", ".", "/", ";", "?", "&"];
-  return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) {
-    if (expression) {
-      let operator = "";
-      const values = [];
-
-      if (operators.indexOf(expression.charAt(0)) !== -1) {
-        operator = expression.charAt(0);
-        expression = expression.substr(1);
-      }
-
-      expression.split(/,/g).forEach(function (variable) {
-        var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable);
-        values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
-      });
-
-      if (operator && operator !== "+") {
-        var separator = ",";
-
-        if (operator === "?") {
-          separator = "&";
-        } else if (operator !== "#") {
-          separator = operator;
-        }
-
-        return (values.length !== 0 ? operator : "") + values.join(separator);
-      } else {
-        return values.join(",");
-      }
-    } else {
-      return encodeReserved(literal);
-    }
-  });
-}
-
-function parse(options) {
-  // https://fetch.spec.whatwg.org/#methods
-  let method = options.method.toUpperCase(); // replace :varname with {varname} to make it RFC 6570 compatible
-
-  let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{+$1}");
-  let headers = Object.assign({}, options.headers);
-  let body;
-  let parameters = omit(options, ["method", "baseUrl", "url", "headers", "request", "mediaType"]); // extract variable names from URL to calculate remaining variables later
-
-  const urlVariableNames = extractUrlVariableNames(url);
-  url = parseUrl(url).expand(parameters);
-
-  if (!/^http/.test(url)) {
-    url = options.baseUrl + url;
-  }
-
-  const omittedParameters = Object.keys(options).filter(option => urlVariableNames.includes(option)).concat("baseUrl");
-  const remainingParameters = omit(parameters, omittedParameters);
-  const isBinaryRequset = /application\/octet-stream/i.test(headers.accept);
-
-  if (!isBinaryRequset) {
-    if (options.mediaType.format) {
-      // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw
-      headers.accept = headers.accept.split(/,/).map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(",");
-    }
-
-    if (options.mediaType.previews.length) {
-      const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || [];
-      headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map(preview => {
-        const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json";
-        return `application/vnd.github.${preview}-preview${format}`;
-      }).join(",");
-    }
-  } // for GET/HEAD requests, set URL query parameters from remaining parameters
-  // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters
-
-
-  if (["GET", "HEAD"].includes(method)) {
-    url = addQueryParameters(url, remainingParameters);
-  } else {
-    if ("data" in remainingParameters) {
-      body = remainingParameters.data;
-    } else {
-      if (Object.keys(remainingParameters).length) {
-        body = remainingParameters;
-      } else {
-        headers["content-length"] = 0;
-      }
-    }
-  } // default content-type for JSON if body is set
-
-
-  if (!headers["content-type"] && typeof body !== "undefined") {
-    headers["content-type"] = "application/json; charset=utf-8";
-  } // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body.
-  // fetch does not allow to set `content-length` header, but we can set body to an empty string
-
-
-  if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {
-    body = "";
-  } // Only return body/request keys if present
-
-
-  return Object.assign({
-    method,
-    url,
-    headers
-  }, typeof body !== "undefined" ? {
-    body
-  } : null, options.request ? {
-    request: options.request
-  } : null);
-}
-
-function endpointWithDefaults(defaults, route, options) {
-  return parse(merge(defaults, route, options));
-}
-
-function withDefaults(oldDefaults, newDefaults) {
-  const DEFAULTS = merge(oldDefaults, newDefaults);
-  const endpoint = endpointWithDefaults.bind(null, DEFAULTS);
-  return Object.assign(endpoint, {
-    DEFAULTS,
-    defaults: withDefaults.bind(null, DEFAULTS),
-    merge: merge.bind(null, DEFAULTS),
-    parse
-  });
-}
-
-const VERSION = "6.0.2";
-
-const userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`; // DEFAULTS has all properties set that EndpointOptions has, except url.
-// So we use RequestParameters and add method as additional required property.
-
-const DEFAULTS = {
-  method: "GET",
-  baseUrl: "https://api.github.com",
-  headers: {
-    accept: "application/vnd.github.v3+json",
-    "user-agent": userAgent
-  },
-  mediaType: {
-    format: "",
-    previews: []
-  }
-};
-
-const endpoint = withDefaults(null, DEFAULTS);
-
-exports.endpoint = endpoint;
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-node/index.js.map b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-node/index.js.map
deleted file mode 100644
index 911601b..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-node/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../dist-src/util/lowercase-keys.js","../dist-src/util/merge-deep.js","../dist-src/merge.js","../dist-src/util/add-query-parameters.js","../dist-src/util/extract-url-variable-names.js","../dist-src/util/omit.js","../dist-src/util/url-template.js","../dist-src/parse.js","../dist-src/endpoint-with-defaults.js","../dist-src/with-defaults.js","../dist-src/version.js","../dist-src/defaults.js","../dist-src/index.js"],"sourcesContent":["export function lowercaseKeys(object) {\n    if (!object) {\n        return {};\n    }\n    return Object.keys(object).reduce((newObj, key) => {\n        newObj[key.toLowerCase()] = object[key];\n        return newObj;\n    }, {});\n}\n","import isPlainObject from \"is-plain-object\";\nexport function mergeDeep(defaults, options) {\n    const result = Object.assign({}, defaults);\n    Object.keys(options).forEach((key) => {\n        if (isPlainObject(options[key])) {\n            if (!(key in defaults))\n                Object.assign(result, { [key]: options[key] });\n            else\n                result[key] = mergeDeep(defaults[key], options[key]);\n        }\n        else {\n            Object.assign(result, { [key]: options[key] });\n        }\n    });\n    return result;\n}\n","import { lowercaseKeys } from \"./util/lowercase-keys\";\nimport { mergeDeep } from \"./util/merge-deep\";\nexport function merge(defaults, route, options) {\n    if (typeof route === \"string\") {\n        let [method, url] = route.split(\" \");\n        options = Object.assign(url ? { method, url } : { url: method }, options);\n    }\n    else {\n        options = Object.assign({}, route);\n    }\n    // lowercase header names before merging with defaults to avoid duplicates\n    options.headers = lowercaseKeys(options.headers);\n    const mergedOptions = mergeDeep(defaults || {}, options);\n    // mediaType.previews arrays are merged, instead of overwritten\n    if (defaults && defaults.mediaType.previews.length) {\n        mergedOptions.mediaType.previews = defaults.mediaType.previews\n            .filter((preview) => !mergedOptions.mediaType.previews.includes(preview))\n            .concat(mergedOptions.mediaType.previews);\n    }\n    mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map((preview) => preview.replace(/-preview/, \"\"));\n    return mergedOptions;\n}\n","export function addQueryParameters(url, parameters) {\n    const separator = /\\?/.test(url) ? \"&\" : \"?\";\n    const names = Object.keys(parameters);\n    if (names.length === 0) {\n        return url;\n    }\n    return (url +\n        separator +\n        names\n            .map((name) => {\n            if (name === \"q\") {\n                return (\"q=\" + parameters.q.split(\"+\").map(encodeURIComponent).join(\"+\"));\n            }\n            return `${name}=${encodeURIComponent(parameters[name])}`;\n        })\n            .join(\"&\"));\n}\n","const urlVariableRegex = /\\{[^}]+\\}/g;\nfunction removeNonChars(variableName) {\n    return variableName.replace(/^\\W+|\\W+$/g, \"\").split(/,/);\n}\nexport function extractUrlVariableNames(url) {\n    const matches = url.match(urlVariableRegex);\n    if (!matches) {\n        return [];\n    }\n    return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);\n}\n","export function omit(object, keysToOmit) {\n    return Object.keys(object)\n        .filter((option) => !keysToOmit.includes(option))\n        .reduce((obj, key) => {\n        obj[key] = object[key];\n        return obj;\n    }, {});\n}\n","// Based on https://github.com/bramstein/url-template, licensed under BSD\n// TODO: create separate package.\n//\n// Copyright (c) 2012-2014, Bram Stein\n// All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//  1. Redistributions of source code must retain the above copyright\n//     notice, this list of conditions and the following disclaimer.\n//  2. Redistributions in binary form must reproduce the above copyright\n//     notice, this list of conditions and the following disclaimer in the\n//     documentation and/or other materials provided with the distribution.\n//  3. The name of the author may not be used to endorse or promote products\n//     derived from this software without specific prior written permission.\n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR \"AS IS\" AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n/* istanbul ignore file */\nfunction encodeReserved(str) {\n    return str\n        .split(/(%[0-9A-Fa-f]{2})/g)\n        .map(function (part) {\n        if (!/%[0-9A-Fa-f]/.test(part)) {\n            part = encodeURI(part).replace(/%5B/g, \"[\").replace(/%5D/g, \"]\");\n        }\n        return part;\n    })\n        .join(\"\");\n}\nfunction encodeUnreserved(str) {\n    return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {\n        return \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n    });\n}\nfunction encodeValue(operator, value, key) {\n    value =\n        operator === \"+\" || operator === \"#\"\n            ? encodeReserved(value)\n            : encodeUnreserved(value);\n    if (key) {\n        return encodeUnreserved(key) + \"=\" + value;\n    }\n    else {\n        return value;\n    }\n}\nfunction isDefined(value) {\n    return value !== undefined && value !== null;\n}\nfunction isKeyOperator(operator) {\n    return operator === \";\" || operator === \"&\" || operator === \"?\";\n}\nfunction getValues(context, operator, key, modifier) {\n    var value = context[key], result = [];\n    if (isDefined(value) && value !== \"\") {\n        if (typeof value === \"string\" ||\n            typeof value === \"number\" ||\n            typeof value === \"boolean\") {\n            value = value.toString();\n            if (modifier && modifier !== \"*\") {\n                value = value.substring(0, parseInt(modifier, 10));\n            }\n            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : \"\"));\n        }\n        else {\n            if (modifier === \"*\") {\n                if (Array.isArray(value)) {\n                    value.filter(isDefined).forEach(function (value) {\n                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : \"\"));\n                    });\n                }\n                else {\n                    Object.keys(value).forEach(function (k) {\n                        if (isDefined(value[k])) {\n                            result.push(encodeValue(operator, value[k], k));\n                        }\n                    });\n                }\n            }\n            else {\n                const tmp = [];\n                if (Array.isArray(value)) {\n                    value.filter(isDefined).forEach(function (value) {\n                        tmp.push(encodeValue(operator, value));\n                    });\n                }\n                else {\n                    Object.keys(value).forEach(function (k) {\n                        if (isDefined(value[k])) {\n                            tmp.push(encodeUnreserved(k));\n                            tmp.push(encodeValue(operator, value[k].toString()));\n                        }\n                    });\n                }\n                if (isKeyOperator(operator)) {\n                    result.push(encodeUnreserved(key) + \"=\" + tmp.join(\",\"));\n                }\n                else if (tmp.length !== 0) {\n                    result.push(tmp.join(\",\"));\n                }\n            }\n        }\n    }\n    else {\n        if (operator === \";\") {\n            if (isDefined(value)) {\n                result.push(encodeUnreserved(key));\n            }\n        }\n        else if (value === \"\" && (operator === \"&\" || operator === \"?\")) {\n            result.push(encodeUnreserved(key) + \"=\");\n        }\n        else if (value === \"\") {\n            result.push(\"\");\n        }\n    }\n    return result;\n}\nexport function parseUrl(template) {\n    return {\n        expand: expand.bind(null, template),\n    };\n}\nfunction expand(template, context) {\n    var operators = [\"+\", \"#\", \".\", \"/\", \";\", \"?\", \"&\"];\n    return template.replace(/\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g, function (_, expression, literal) {\n        if (expression) {\n            let operator = \"\";\n            const values = [];\n            if (operators.indexOf(expression.charAt(0)) !== -1) {\n                operator = expression.charAt(0);\n                expression = expression.substr(1);\n            }\n            expression.split(/,/g).forEach(function (variable) {\n                var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n                values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n            });\n            if (operator && operator !== \"+\") {\n                var separator = \",\";\n                if (operator === \"?\") {\n                    separator = \"&\";\n                }\n                else if (operator !== \"#\") {\n                    separator = operator;\n                }\n                return (values.length !== 0 ? operator : \"\") + values.join(separator);\n            }\n            else {\n                return values.join(\",\");\n            }\n        }\n        else {\n            return encodeReserved(literal);\n        }\n    });\n}\n","import { addQueryParameters } from \"./util/add-query-parameters\";\nimport { extractUrlVariableNames } from \"./util/extract-url-variable-names\";\nimport { omit } from \"./util/omit\";\nimport { parseUrl } from \"./util/url-template\";\nexport function parse(options) {\n    // https://fetch.spec.whatwg.org/#methods\n    let method = options.method.toUpperCase();\n    // replace :varname with {varname} to make it RFC 6570 compatible\n    let url = (options.url || \"/\").replace(/:([a-z]\\w+)/g, \"{+$1}\");\n    let headers = Object.assign({}, options.headers);\n    let body;\n    let parameters = omit(options, [\n        \"method\",\n        \"baseUrl\",\n        \"url\",\n        \"headers\",\n        \"request\",\n        \"mediaType\",\n    ]);\n    // extract variable names from URL to calculate remaining variables later\n    const urlVariableNames = extractUrlVariableNames(url);\n    url = parseUrl(url).expand(parameters);\n    if (!/^http/.test(url)) {\n        url = options.baseUrl + url;\n    }\n    const omittedParameters = Object.keys(options)\n        .filter((option) => urlVariableNames.includes(option))\n        .concat(\"baseUrl\");\n    const remainingParameters = omit(parameters, omittedParameters);\n    const isBinaryRequset = /application\\/octet-stream/i.test(headers.accept);\n    if (!isBinaryRequset) {\n        if (options.mediaType.format) {\n            // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw\n            headers.accept = headers.accept\n                .split(/,/)\n                .map((preview) => preview.replace(/application\\/vnd(\\.\\w+)(\\.v3)?(\\.\\w+)?(\\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`))\n                .join(\",\");\n        }\n        if (options.mediaType.previews.length) {\n            const previewsFromAcceptHeader = headers.accept.match(/[\\w-]+(?=-preview)/g) || [];\n            headers.accept = previewsFromAcceptHeader\n                .concat(options.mediaType.previews)\n                .map((preview) => {\n                const format = options.mediaType.format\n                    ? `.${options.mediaType.format}`\n                    : \"+json\";\n                return `application/vnd.github.${preview}-preview${format}`;\n            })\n                .join(\",\");\n        }\n    }\n    // for GET/HEAD requests, set URL query parameters from remaining parameters\n    // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters\n    if ([\"GET\", \"HEAD\"].includes(method)) {\n        url = addQueryParameters(url, remainingParameters);\n    }\n    else {\n        if (\"data\" in remainingParameters) {\n            body = remainingParameters.data;\n        }\n        else {\n            if (Object.keys(remainingParameters).length) {\n                body = remainingParameters;\n            }\n            else {\n                headers[\"content-length\"] = 0;\n            }\n        }\n    }\n    // default content-type for JSON if body is set\n    if (!headers[\"content-type\"] && typeof body !== \"undefined\") {\n        headers[\"content-type\"] = \"application/json; charset=utf-8\";\n    }\n    // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body.\n    // fetch does not allow to set `content-length` header, but we can set body to an empty string\n    if ([\"PATCH\", \"PUT\"].includes(method) && typeof body === \"undefined\") {\n        body = \"\";\n    }\n    // Only return body/request keys if present\n    return Object.assign({ method, url, headers }, typeof body !== \"undefined\" ? { body } : null, options.request ? { request: options.request } : null);\n}\n","import { merge } from \"./merge\";\nimport { parse } from \"./parse\";\nexport function endpointWithDefaults(defaults, route, options) {\n    return parse(merge(defaults, route, options));\n}\n","import { endpointWithDefaults } from \"./endpoint-with-defaults\";\nimport { merge } from \"./merge\";\nimport { parse } from \"./parse\";\nexport function withDefaults(oldDefaults, newDefaults) {\n    const DEFAULTS = merge(oldDefaults, newDefaults);\n    const endpoint = endpointWithDefaults.bind(null, DEFAULTS);\n    return Object.assign(endpoint, {\n        DEFAULTS,\n        defaults: withDefaults.bind(null, DEFAULTS),\n        merge: merge.bind(null, DEFAULTS),\n        parse,\n    });\n}\n","export const VERSION = \"6.0.2\";\n","import { getUserAgent } from \"universal-user-agent\";\nimport { VERSION } from \"./version\";\nconst userAgent = `octokit-endpoint.js/${VERSION} ${getUserAgent()}`;\n// DEFAULTS has all properties set that EndpointOptions has, except url.\n// So we use RequestParameters and add method as additional required property.\nexport const DEFAULTS = {\n    method: \"GET\",\n    baseUrl: \"https://api.github.com\",\n    headers: {\n        accept: \"application/vnd.github.v3+json\",\n        \"user-agent\": userAgent,\n    },\n    mediaType: {\n        format: \"\",\n        previews: [],\n    },\n};\n","import { withDefaults } from \"./with-defaults\";\nimport { DEFAULTS } from \"./defaults\";\nexport const endpoint = withDefaults(null, DEFAULTS);\n"],"names":["lowercaseKeys","object","Object","keys","reduce","newObj","key","toLowerCase","mergeDeep","defaults","options","result","assign","forEach","isPlainObject","merge","route","method","url","split","headers","mergedOptions","mediaType","previews","length","filter","preview","includes","concat","map","replace","addQueryParameters","parameters","separator","test","names","name","q","encodeURIComponent","join","urlVariableRegex","removeNonChars","variableName","extractUrlVariableNames","matches","match","a","b","omit","keysToOmit","option","obj","encodeReserved","str","part","encodeURI","encodeUnreserved","c","charCodeAt","toString","toUpperCase","encodeValue","operator","value","isDefined","undefined","isKeyOperator","getValues","context","modifier","substring","parseInt","push","Array","isArray","k","tmp","parseUrl","template","expand","bind","operators","_","expression","literal","values","indexOf","charAt","substr","variable","exec","parse","body","urlVariableNames","baseUrl","omittedParameters","remainingParameters","isBinaryRequset","accept","format","previewsFromAcceptHeader","data","request","endpointWithDefaults","withDefaults","oldDefaults","newDefaults","DEFAULTS","endpoint","VERSION","userAgent","getUserAgent"],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/defaults.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/defaults.js
deleted file mode 100644
index 456e586..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/defaults.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import { getUserAgent } from "universal-user-agent";
-import { VERSION } from "./version";
-const userAgent = `octokit-endpoint.js/${VERSION} ${getUserAgent()}`;
-// DEFAULTS has all properties set that EndpointOptions has, except url.
-// So we use RequestParameters and add method as additional required property.
-export const DEFAULTS = {
-    method: "GET",
-    baseUrl: "https://api.github.com",
-    headers: {
-        accept: "application/vnd.github.v3+json",
-        "user-agent": userAgent,
-    },
-    mediaType: {
-        format: "",
-        previews: [],
-    },
-};
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/endpoint-with-defaults.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/endpoint-with-defaults.js
deleted file mode 100644
index 5763758..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/endpoint-with-defaults.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { merge } from "./merge";
-import { parse } from "./parse";
-export function endpointWithDefaults(defaults, route, options) {
-    return parse(merge(defaults, route, options));
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/index.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/index.js
deleted file mode 100644
index 599917f..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import { withDefaults } from "./with-defaults";
-import { DEFAULTS } from "./defaults";
-export const endpoint = withDefaults(null, DEFAULTS);
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/merge.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/merge.js
deleted file mode 100644
index d79ae65..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/merge.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import { lowercaseKeys } from "./util/lowercase-keys";
-import { mergeDeep } from "./util/merge-deep";
-export function merge(defaults, route, options) {
-    if (typeof route === "string") {
-        let [method, url] = route.split(" ");
-        options = Object.assign(url ? { method, url } : { url: method }, options);
-    }
-    else {
-        options = Object.assign({}, route);
-    }
-    // lowercase header names before merging with defaults to avoid duplicates
-    options.headers = lowercaseKeys(options.headers);
-    const mergedOptions = mergeDeep(defaults || {}, options);
-    // mediaType.previews arrays are merged, instead of overwritten
-    if (defaults && defaults.mediaType.previews.length) {
-        mergedOptions.mediaType.previews = defaults.mediaType.previews
-            .filter((preview) => !mergedOptions.mediaType.previews.includes(preview))
-            .concat(mergedOptions.mediaType.previews);
-    }
-    mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map((preview) => preview.replace(/-preview/, ""));
-    return mergedOptions;
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/parse.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/parse.js
deleted file mode 100644
index 91197c8..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/parse.js
+++ /dev/null
@@ -1,81 +0,0 @@
-import { addQueryParameters } from "./util/add-query-parameters";
-import { extractUrlVariableNames } from "./util/extract-url-variable-names";
-import { omit } from "./util/omit";
-import { parseUrl } from "./util/url-template";
-export function parse(options) {
-    // https://fetch.spec.whatwg.org/#methods
-    let method = options.method.toUpperCase();
-    // replace :varname with {varname} to make it RFC 6570 compatible
-    let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{+$1}");
-    let headers = Object.assign({}, options.headers);
-    let body;
-    let parameters = omit(options, [
-        "method",
-        "baseUrl",
-        "url",
-        "headers",
-        "request",
-        "mediaType",
-    ]);
-    // extract variable names from URL to calculate remaining variables later
-    const urlVariableNames = extractUrlVariableNames(url);
-    url = parseUrl(url).expand(parameters);
-    if (!/^http/.test(url)) {
-        url = options.baseUrl + url;
-    }
-    const omittedParameters = Object.keys(options)
-        .filter((option) => urlVariableNames.includes(option))
-        .concat("baseUrl");
-    const remainingParameters = omit(parameters, omittedParameters);
-    const isBinaryRequset = /application\/octet-stream/i.test(headers.accept);
-    if (!isBinaryRequset) {
-        if (options.mediaType.format) {
-            // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw
-            headers.accept = headers.accept
-                .split(/,/)
-                .map((preview) => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`))
-                .join(",");
-        }
-        if (options.mediaType.previews.length) {
-            const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || [];
-            headers.accept = previewsFromAcceptHeader
-                .concat(options.mediaType.previews)
-                .map((preview) => {
-                const format = options.mediaType.format
-                    ? `.${options.mediaType.format}`
-                    : "+json";
-                return `application/vnd.github.${preview}-preview${format}`;
-            })
-                .join(",");
-        }
-    }
-    // for GET/HEAD requests, set URL query parameters from remaining parameters
-    // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters
-    if (["GET", "HEAD"].includes(method)) {
-        url = addQueryParameters(url, remainingParameters);
-    }
-    else {
-        if ("data" in remainingParameters) {
-            body = remainingParameters.data;
-        }
-        else {
-            if (Object.keys(remainingParameters).length) {
-                body = remainingParameters;
-            }
-            else {
-                headers["content-length"] = 0;
-            }
-        }
-    }
-    // default content-type for JSON if body is set
-    if (!headers["content-type"] && typeof body !== "undefined") {
-        headers["content-type"] = "application/json; charset=utf-8";
-    }
-    // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body.
-    // fetch does not allow to set `content-length` header, but we can set body to an empty string
-    if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {
-        body = "";
-    }
-    // Only return body/request keys if present
-    return Object.assign({ method, url, headers }, typeof body !== "undefined" ? { body } : null, options.request ? { request: options.request } : null);
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/add-query-parameters.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/add-query-parameters.js
deleted file mode 100644
index d26be31..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/add-query-parameters.js
+++ /dev/null
@@ -1,17 +0,0 @@
-export function addQueryParameters(url, parameters) {
-    const separator = /\?/.test(url) ? "&" : "?";
-    const names = Object.keys(parameters);
-    if (names.length === 0) {
-        return url;
-    }
-    return (url +
-        separator +
-        names
-            .map((name) => {
-            if (name === "q") {
-                return ("q=" + parameters.q.split("+").map(encodeURIComponent).join("+"));
-            }
-            return `${name}=${encodeURIComponent(parameters[name])}`;
-        })
-            .join("&"));
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/extract-url-variable-names.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/extract-url-variable-names.js
deleted file mode 100644
index 3e75db2..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/extract-url-variable-names.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const urlVariableRegex = /\{[^}]+\}/g;
-function removeNonChars(variableName) {
-    return variableName.replace(/^\W+|\W+$/g, "").split(/,/);
-}
-export function extractUrlVariableNames(url) {
-    const matches = url.match(urlVariableRegex);
-    if (!matches) {
-        return [];
-    }
-    return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/lowercase-keys.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/lowercase-keys.js
deleted file mode 100644
index 0780642..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/lowercase-keys.js
+++ /dev/null
@@ -1,9 +0,0 @@
-export function lowercaseKeys(object) {
-    if (!object) {
-        return {};
-    }
-    return Object.keys(object).reduce((newObj, key) => {
-        newObj[key.toLowerCase()] = object[key];
-        return newObj;
-    }, {});
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/merge-deep.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/merge-deep.js
deleted file mode 100644
index eca9a72..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/merge-deep.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import isPlainObject from "is-plain-object";
-export function mergeDeep(defaults, options) {
-    const result = Object.assign({}, defaults);
-    Object.keys(options).forEach((key) => {
-        if (isPlainObject(options[key])) {
-            if (!(key in defaults))
-                Object.assign(result, { [key]: options[key] });
-            else
-                result[key] = mergeDeep(defaults[key], options[key]);
-        }
-        else {
-            Object.assign(result, { [key]: options[key] });
-        }
-    });
-    return result;
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/omit.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/omit.js
deleted file mode 100644
index 6245031..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/omit.js
+++ /dev/null
@@ -1,8 +0,0 @@
-export function omit(object, keysToOmit) {
-    return Object.keys(object)
-        .filter((option) => !keysToOmit.includes(option))
-        .reduce((obj, key) => {
-        obj[key] = object[key];
-        return obj;
-    }, {});
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/url-template.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/url-template.js
deleted file mode 100644
index 439b3fe..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/util/url-template.js
+++ /dev/null
@@ -1,164 +0,0 @@
-// Based on https://github.com/bramstein/url-template, licensed under BSD
-// TODO: create separate package.
-//
-// Copyright (c) 2012-2014, Bram Stein
-// All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//  1. Redistributions of source code must retain the above copyright
-//     notice, this list of conditions and the following disclaimer.
-//  2. Redistributions in binary form must reproduce the above copyright
-//     notice, this list of conditions and the following disclaimer in the
-//     documentation and/or other materials provided with the distribution.
-//  3. The name of the author may not be used to endorse or promote products
-//     derived from this software without specific prior written permission.
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
-// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-/* istanbul ignore file */
-function encodeReserved(str) {
-    return str
-        .split(/(%[0-9A-Fa-f]{2})/g)
-        .map(function (part) {
-        if (!/%[0-9A-Fa-f]/.test(part)) {
-            part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");
-        }
-        return part;
-    })
-        .join("");
-}
-function encodeUnreserved(str) {
-    return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
-        return "%" + c.charCodeAt(0).toString(16).toUpperCase();
-    });
-}
-function encodeValue(operator, value, key) {
-    value =
-        operator === "+" || operator === "#"
-            ? encodeReserved(value)
-            : encodeUnreserved(value);
-    if (key) {
-        return encodeUnreserved(key) + "=" + value;
-    }
-    else {
-        return value;
-    }
-}
-function isDefined(value) {
-    return value !== undefined && value !== null;
-}
-function isKeyOperator(operator) {
-    return operator === ";" || operator === "&" || operator === "?";
-}
-function getValues(context, operator, key, modifier) {
-    var value = context[key], result = [];
-    if (isDefined(value) && value !== "") {
-        if (typeof value === "string" ||
-            typeof value === "number" ||
-            typeof value === "boolean") {
-            value = value.toString();
-            if (modifier && modifier !== "*") {
-                value = value.substring(0, parseInt(modifier, 10));
-            }
-            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
-        }
-        else {
-            if (modifier === "*") {
-                if (Array.isArray(value)) {
-                    value.filter(isDefined).forEach(function (value) {
-                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
-                    });
-                }
-                else {
-                    Object.keys(value).forEach(function (k) {
-                        if (isDefined(value[k])) {
-                            result.push(encodeValue(operator, value[k], k));
-                        }
-                    });
-                }
-            }
-            else {
-                const tmp = [];
-                if (Array.isArray(value)) {
-                    value.filter(isDefined).forEach(function (value) {
-                        tmp.push(encodeValue(operator, value));
-                    });
-                }
-                else {
-                    Object.keys(value).forEach(function (k) {
-                        if (isDefined(value[k])) {
-                            tmp.push(encodeUnreserved(k));
-                            tmp.push(encodeValue(operator, value[k].toString()));
-                        }
-                    });
-                }
-                if (isKeyOperator(operator)) {
-                    result.push(encodeUnreserved(key) + "=" + tmp.join(","));
-                }
-                else if (tmp.length !== 0) {
-                    result.push(tmp.join(","));
-                }
-            }
-        }
-    }
-    else {
-        if (operator === ";") {
-            if (isDefined(value)) {
-                result.push(encodeUnreserved(key));
-            }
-        }
-        else if (value === "" && (operator === "&" || operator === "?")) {
-            result.push(encodeUnreserved(key) + "=");
-        }
-        else if (value === "") {
-            result.push("");
-        }
-    }
-    return result;
-}
-export function parseUrl(template) {
-    return {
-        expand: expand.bind(null, template),
-    };
-}
-function expand(template, context) {
-    var operators = ["+", "#", ".", "/", ";", "?", "&"];
-    return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) {
-        if (expression) {
-            let operator = "";
-            const values = [];
-            if (operators.indexOf(expression.charAt(0)) !== -1) {
-                operator = expression.charAt(0);
-                expression = expression.substr(1);
-            }
-            expression.split(/,/g).forEach(function (variable) {
-                var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable);
-                values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
-            });
-            if (operator && operator !== "+") {
-                var separator = ",";
-                if (operator === "?") {
-                    separator = "&";
-                }
-                else if (operator !== "#") {
-                    separator = operator;
-                }
-                return (values.length !== 0 ? operator : "") + values.join(separator);
-            }
-            else {
-                return values.join(",");
-            }
-        }
-        else {
-            return encodeReserved(literal);
-        }
-    });
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/version.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/version.js
deleted file mode 100644
index 8a0d49c..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/version.js
+++ /dev/null
@@ -1 +0,0 @@
-export const VERSION = "6.0.2";
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/with-defaults.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/with-defaults.js
deleted file mode 100644
index 81baf6c..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-src/with-defaults.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { endpointWithDefaults } from "./endpoint-with-defaults";
-import { merge } from "./merge";
-import { parse } from "./parse";
-export function withDefaults(oldDefaults, newDefaults) {
-    const DEFAULTS = merge(oldDefaults, newDefaults);
-    const endpoint = endpointWithDefaults.bind(null, DEFAULTS);
-    return Object.assign(endpoint, {
-        DEFAULTS,
-        defaults: withDefaults.bind(null, DEFAULTS),
-        merge: merge.bind(null, DEFAULTS),
-        parse,
-    });
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/defaults.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/defaults.d.ts
deleted file mode 100644
index 30fcd20..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/defaults.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { EndpointDefaults } from "@octokit/types";
-export declare const DEFAULTS: EndpointDefaults;
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/endpoint-with-defaults.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/endpoint-with-defaults.d.ts
deleted file mode 100644
index ff39e5e..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/endpoint-with-defaults.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { EndpointOptions, RequestParameters, Route } from "@octokit/types";
-import { DEFAULTS } from "./defaults";
-export declare function endpointWithDefaults(defaults: typeof DEFAULTS, route: Route | EndpointOptions, options?: RequestParameters): import("@octokit/types").RequestOptions;
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/index.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/index.d.ts
deleted file mode 100644
index 1ede136..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/index.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare const endpoint: import("@octokit/types").EndpointInterface<object>;
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/merge.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/merge.d.ts
deleted file mode 100644
index b75a15e..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/merge.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { EndpointDefaults, RequestParameters, Route } from "@octokit/types";
-export declare function merge(defaults: EndpointDefaults | null, route?: Route | RequestParameters, options?: RequestParameters): EndpointDefaults;
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/parse.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/parse.d.ts
deleted file mode 100644
index fbe2144..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/parse.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { EndpointDefaults, RequestOptions } from "@octokit/types";
-export declare function parse(options: EndpointDefaults): RequestOptions;
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/add-query-parameters.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/add-query-parameters.d.ts
deleted file mode 100644
index 4b192ac..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/add-query-parameters.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export declare function addQueryParameters(url: string, parameters: {
-    [x: string]: string | undefined;
-    q?: string;
-}): string;
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/extract-url-variable-names.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/extract-url-variable-names.d.ts
deleted file mode 100644
index 93586d4..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/extract-url-variable-names.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare function extractUrlVariableNames(url: string): string[];
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/lowercase-keys.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/lowercase-keys.d.ts
deleted file mode 100644
index 1daf307..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/lowercase-keys.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export declare function lowercaseKeys(object?: {
-    [key: string]: any;
-}): {
-    [key: string]: any;
-};
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/merge-deep.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/merge-deep.d.ts
deleted file mode 100644
index 914411c..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/merge-deep.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare function mergeDeep(defaults: any, options: any): object;
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/omit.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/omit.d.ts
deleted file mode 100644
index 06927d6..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/omit.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export declare function omit(object: {
-    [key: string]: any;
-}, keysToOmit: string[]): {
-    [key: string]: any;
-};
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/url-template.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/url-template.d.ts
deleted file mode 100644
index 5d967ca..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/util/url-template.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export declare function parseUrl(template: string): {
-    expand: (context: object) => string;
-};
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/version.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/version.d.ts
deleted file mode 100644
index 8aaf0c6..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/version.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare const VERSION = "6.0.2";
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/with-defaults.d.ts b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/with-defaults.d.ts
deleted file mode 100644
index 6f5afd1..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-types/with-defaults.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { EndpointInterface, RequestParameters, EndpointDefaults } from "@octokit/types";
-export declare function withDefaults(oldDefaults: EndpointDefaults | null, newDefaults: RequestParameters): EndpointInterface;
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-web/index.js b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-web/index.js
deleted file mode 100644
index 87b4369..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-web/index.js
+++ /dev/null
@@ -1,369 +0,0 @@
-import isPlainObject from 'is-plain-object';
-import { getUserAgent } from 'universal-user-agent';
-
-function lowercaseKeys(object) {
-    if (!object) {
-        return {};
-    }
-    return Object.keys(object).reduce((newObj, key) => {
-        newObj[key.toLowerCase()] = object[key];
-        return newObj;
-    }, {});
-}
-
-function mergeDeep(defaults, options) {
-    const result = Object.assign({}, defaults);
-    Object.keys(options).forEach((key) => {
-        if (isPlainObject(options[key])) {
-            if (!(key in defaults))
-                Object.assign(result, { [key]: options[key] });
-            else
-                result[key] = mergeDeep(defaults[key], options[key]);
-        }
-        else {
-            Object.assign(result, { [key]: options[key] });
-        }
-    });
-    return result;
-}
-
-function merge(defaults, route, options) {
-    if (typeof route === "string") {
-        let [method, url] = route.split(" ");
-        options = Object.assign(url ? { method, url } : { url: method }, options);
-    }
-    else {
-        options = Object.assign({}, route);
-    }
-    // lowercase header names before merging with defaults to avoid duplicates
-    options.headers = lowercaseKeys(options.headers);
-    const mergedOptions = mergeDeep(defaults || {}, options);
-    // mediaType.previews arrays are merged, instead of overwritten
-    if (defaults && defaults.mediaType.previews.length) {
-        mergedOptions.mediaType.previews = defaults.mediaType.previews
-            .filter((preview) => !mergedOptions.mediaType.previews.includes(preview))
-            .concat(mergedOptions.mediaType.previews);
-    }
-    mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map((preview) => preview.replace(/-preview/, ""));
-    return mergedOptions;
-}
-
-function addQueryParameters(url, parameters) {
-    const separator = /\?/.test(url) ? "&" : "?";
-    const names = Object.keys(parameters);
-    if (names.length === 0) {
-        return url;
-    }
-    return (url +
-        separator +
-        names
-            .map((name) => {
-            if (name === "q") {
-                return ("q=" + parameters.q.split("+").map(encodeURIComponent).join("+"));
-            }
-            return `${name}=${encodeURIComponent(parameters[name])}`;
-        })
-            .join("&"));
-}
-
-const urlVariableRegex = /\{[^}]+\}/g;
-function removeNonChars(variableName) {
-    return variableName.replace(/^\W+|\W+$/g, "").split(/,/);
-}
-function extractUrlVariableNames(url) {
-    const matches = url.match(urlVariableRegex);
-    if (!matches) {
-        return [];
-    }
-    return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);
-}
-
-function omit(object, keysToOmit) {
-    return Object.keys(object)
-        .filter((option) => !keysToOmit.includes(option))
-        .reduce((obj, key) => {
-        obj[key] = object[key];
-        return obj;
-    }, {});
-}
-
-// Based on https://github.com/bramstein/url-template, licensed under BSD
-// TODO: create separate package.
-//
-// Copyright (c) 2012-2014, Bram Stein
-// All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//  1. Redistributions of source code must retain the above copyright
-//     notice, this list of conditions and the following disclaimer.
-//  2. Redistributions in binary form must reproduce the above copyright
-//     notice, this list of conditions and the following disclaimer in the
-//     documentation and/or other materials provided with the distribution.
-//  3. The name of the author may not be used to endorse or promote products
-//     derived from this software without specific prior written permission.
-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
-// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-/* istanbul ignore file */
-function encodeReserved(str) {
-    return str
-        .split(/(%[0-9A-Fa-f]{2})/g)
-        .map(function (part) {
-        if (!/%[0-9A-Fa-f]/.test(part)) {
-            part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");
-        }
-        return part;
-    })
-        .join("");
-}
-function encodeUnreserved(str) {
-    return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
-        return "%" + c.charCodeAt(0).toString(16).toUpperCase();
-    });
-}
-function encodeValue(operator, value, key) {
-    value =
-        operator === "+" || operator === "#"
-            ? encodeReserved(value)
-            : encodeUnreserved(value);
-    if (key) {
-        return encodeUnreserved(key) + "=" + value;
-    }
-    else {
-        return value;
-    }
-}
-function isDefined(value) {
-    return value !== undefined && value !== null;
-}
-function isKeyOperator(operator) {
-    return operator === ";" || operator === "&" || operator === "?";
-}
-function getValues(context, operator, key, modifier) {
-    var value = context[key], result = [];
-    if (isDefined(value) && value !== "") {
-        if (typeof value === "string" ||
-            typeof value === "number" ||
-            typeof value === "boolean") {
-            value = value.toString();
-            if (modifier && modifier !== "*") {
-                value = value.substring(0, parseInt(modifier, 10));
-            }
-            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
-        }
-        else {
-            if (modifier === "*") {
-                if (Array.isArray(value)) {
-                    value.filter(isDefined).forEach(function (value) {
-                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
-                    });
-                }
-                else {
-                    Object.keys(value).forEach(function (k) {
-                        if (isDefined(value[k])) {
-                            result.push(encodeValue(operator, value[k], k));
-                        }
-                    });
-                }
-            }
-            else {
-                const tmp = [];
-                if (Array.isArray(value)) {
-                    value.filter(isDefined).forEach(function (value) {
-                        tmp.push(encodeValue(operator, value));
-                    });
-                }
-                else {
-                    Object.keys(value).forEach(function (k) {
-                        if (isDefined(value[k])) {
-                            tmp.push(encodeUnreserved(k));
-                            tmp.push(encodeValue(operator, value[k].toString()));
-                        }
-                    });
-                }
-                if (isKeyOperator(operator)) {
-                    result.push(encodeUnreserved(key) + "=" + tmp.join(","));
-                }
-                else if (tmp.length !== 0) {
-                    result.push(tmp.join(","));
-                }
-            }
-        }
-    }
-    else {
-        if (operator === ";") {
-            if (isDefined(value)) {
-                result.push(encodeUnreserved(key));
-            }
-        }
-        else if (value === "" && (operator === "&" || operator === "?")) {
-            result.push(encodeUnreserved(key) + "=");
-        }
-        else if (value === "") {
-            result.push("");
-        }
-    }
-    return result;
-}
-function parseUrl(template) {
-    return {
-        expand: expand.bind(null, template),
-    };
-}
-function expand(template, context) {
-    var operators = ["+", "#", ".", "/", ";", "?", "&"];
-    return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) {
-        if (expression) {
-            let operator = "";
-            const values = [];
-            if (operators.indexOf(expression.charAt(0)) !== -1) {
-                operator = expression.charAt(0);
-                expression = expression.substr(1);
-            }
-            expression.split(/,/g).forEach(function (variable) {
-                var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable);
-                values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
-            });
-            if (operator && operator !== "+") {
-                var separator = ",";
-                if (operator === "?") {
-                    separator = "&";
-                }
-                else if (operator !== "#") {
-                    separator = operator;
-                }
-                return (values.length !== 0 ? operator : "") + values.join(separator);
-            }
-            else {
-                return values.join(",");
-            }
-        }
-        else {
-            return encodeReserved(literal);
-        }
-    });
-}
-
-function parse(options) {
-    // https://fetch.spec.whatwg.org/#methods
-    let method = options.method.toUpperCase();
-    // replace :varname with {varname} to make it RFC 6570 compatible
-    let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{+$1}");
-    let headers = Object.assign({}, options.headers);
-    let body;
-    let parameters = omit(options, [
-        "method",
-        "baseUrl",
-        "url",
-        "headers",
-        "request",
-        "mediaType",
-    ]);
-    // extract variable names from URL to calculate remaining variables later
-    const urlVariableNames = extractUrlVariableNames(url);
-    url = parseUrl(url).expand(parameters);
-    if (!/^http/.test(url)) {
-        url = options.baseUrl + url;
-    }
-    const omittedParameters = Object.keys(options)
-        .filter((option) => urlVariableNames.includes(option))
-        .concat("baseUrl");
-    const remainingParameters = omit(parameters, omittedParameters);
-    const isBinaryRequset = /application\/octet-stream/i.test(headers.accept);
-    if (!isBinaryRequset) {
-        if (options.mediaType.format) {
-            // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw
-            headers.accept = headers.accept
-                .split(/,/)
-                .map((preview) => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`))
-                .join(",");
-        }
-        if (options.mediaType.previews.length) {
-            const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || [];
-            headers.accept = previewsFromAcceptHeader
-                .concat(options.mediaType.previews)
-                .map((preview) => {
-                const format = options.mediaType.format
-                    ? `.${options.mediaType.format}`
-                    : "+json";
-                return `application/vnd.github.${preview}-preview${format}`;
-            })
-                .join(",");
-        }
-    }
-    // for GET/HEAD requests, set URL query parameters from remaining parameters
-    // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters
-    if (["GET", "HEAD"].includes(method)) {
-        url = addQueryParameters(url, remainingParameters);
-    }
-    else {
-        if ("data" in remainingParameters) {
-            body = remainingParameters.data;
-        }
-        else {
-            if (Object.keys(remainingParameters).length) {
-                body = remainingParameters;
-            }
-            else {
-                headers["content-length"] = 0;
-            }
-        }
-    }
-    // default content-type for JSON if body is set
-    if (!headers["content-type"] && typeof body !== "undefined") {
-        headers["content-type"] = "application/json; charset=utf-8";
-    }
-    // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body.
-    // fetch does not allow to set `content-length` header, but we can set body to an empty string
-    if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {
-        body = "";
-    }
-    // Only return body/request keys if present
-    return Object.assign({ method, url, headers }, typeof body !== "undefined" ? { body } : null, options.request ? { request: options.request } : null);
-}
-
-function endpointWithDefaults(defaults, route, options) {
-    return parse(merge(defaults, route, options));
-}
-
-function withDefaults(oldDefaults, newDefaults) {
-    const DEFAULTS = merge(oldDefaults, newDefaults);
-    const endpoint = endpointWithDefaults.bind(null, DEFAULTS);
-    return Object.assign(endpoint, {
-        DEFAULTS,
-        defaults: withDefaults.bind(null, DEFAULTS),
-        merge: merge.bind(null, DEFAULTS),
-        parse,
-    });
-}
-
-const VERSION = "6.0.2";
-
-const userAgent = `octokit-endpoint.js/${VERSION} ${getUserAgent()}`;
-// DEFAULTS has all properties set that EndpointOptions has, except url.
-// So we use RequestParameters and add method as additional required property.
-const DEFAULTS = {
-    method: "GET",
-    baseUrl: "https://api.github.com",
-    headers: {
-        accept: "application/vnd.github.v3+json",
-        "user-agent": userAgent,
-    },
-    mediaType: {
-        format: "",
-        previews: [],
-    },
-};
-
-const endpoint = withDefaults(null, DEFAULTS);
-
-export { endpoint };
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-web/index.js.map b/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-web/index.js.map
deleted file mode 100644
index 8f1749b..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-web/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../dist-src/util/lowercase-keys.js","../dist-src/util/merge-deep.js","../dist-src/merge.js","../dist-src/util/add-query-parameters.js","../dist-src/util/extract-url-variable-names.js","../dist-src/util/omit.js","../dist-src/util/url-template.js","../dist-src/parse.js","../dist-src/endpoint-with-defaults.js","../dist-src/with-defaults.js","../dist-src/version.js","../dist-src/defaults.js","../dist-src/index.js"],"sourcesContent":["export function lowercaseKeys(object) {\n    if (!object) {\n        return {};\n    }\n    return Object.keys(object).reduce((newObj, key) => {\n        newObj[key.toLowerCase()] = object[key];\n        return newObj;\n    }, {});\n}\n","import isPlainObject from \"is-plain-object\";\nexport function mergeDeep(defaults, options) {\n    const result = Object.assign({}, defaults);\n    Object.keys(options).forEach((key) => {\n        if (isPlainObject(options[key])) {\n            if (!(key in defaults))\n                Object.assign(result, { [key]: options[key] });\n            else\n                result[key] = mergeDeep(defaults[key], options[key]);\n        }\n        else {\n            Object.assign(result, { [key]: options[key] });\n        }\n    });\n    return result;\n}\n","import { lowercaseKeys } from \"./util/lowercase-keys\";\nimport { mergeDeep } from \"./util/merge-deep\";\nexport function merge(defaults, route, options) {\n    if (typeof route === \"string\") {\n        let [method, url] = route.split(\" \");\n        options = Object.assign(url ? { method, url } : { url: method }, options);\n    }\n    else {\n        options = Object.assign({}, route);\n    }\n    // lowercase header names before merging with defaults to avoid duplicates\n    options.headers = lowercaseKeys(options.headers);\n    const mergedOptions = mergeDeep(defaults || {}, options);\n    // mediaType.previews arrays are merged, instead of overwritten\n    if (defaults && defaults.mediaType.previews.length) {\n        mergedOptions.mediaType.previews = defaults.mediaType.previews\n            .filter((preview) => !mergedOptions.mediaType.previews.includes(preview))\n            .concat(mergedOptions.mediaType.previews);\n    }\n    mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map((preview) => preview.replace(/-preview/, \"\"));\n    return mergedOptions;\n}\n","export function addQueryParameters(url, parameters) {\n    const separator = /\\?/.test(url) ? \"&\" : \"?\";\n    const names = Object.keys(parameters);\n    if (names.length === 0) {\n        return url;\n    }\n    return (url +\n        separator +\n        names\n            .map((name) => {\n            if (name === \"q\") {\n                return (\"q=\" + parameters.q.split(\"+\").map(encodeURIComponent).join(\"+\"));\n            }\n            return `${name}=${encodeURIComponent(parameters[name])}`;\n        })\n            .join(\"&\"));\n}\n","const urlVariableRegex = /\\{[^}]+\\}/g;\nfunction removeNonChars(variableName) {\n    return variableName.replace(/^\\W+|\\W+$/g, \"\").split(/,/);\n}\nexport function extractUrlVariableNames(url) {\n    const matches = url.match(urlVariableRegex);\n    if (!matches) {\n        return [];\n    }\n    return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);\n}\n","export function omit(object, keysToOmit) {\n    return Object.keys(object)\n        .filter((option) => !keysToOmit.includes(option))\n        .reduce((obj, key) => {\n        obj[key] = object[key];\n        return obj;\n    }, {});\n}\n","// Based on https://github.com/bramstein/url-template, licensed under BSD\n// TODO: create separate package.\n//\n// Copyright (c) 2012-2014, Bram Stein\n// All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//  1. Redistributions of source code must retain the above copyright\n//     notice, this list of conditions and the following disclaimer.\n//  2. Redistributions in binary form must reproduce the above copyright\n//     notice, this list of conditions and the following disclaimer in the\n//     documentation and/or other materials provided with the distribution.\n//  3. The name of the author may not be used to endorse or promote products\n//     derived from this software without specific prior written permission.\n// THIS SOFTWARE IS PROVIDED BY THE AUTHOR \"AS IS\" AND ANY EXPRESS OR IMPLIED\n// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n/* istanbul ignore file */\nfunction encodeReserved(str) {\n    return str\n        .split(/(%[0-9A-Fa-f]{2})/g)\n        .map(function (part) {\n        if (!/%[0-9A-Fa-f]/.test(part)) {\n            part = encodeURI(part).replace(/%5B/g, \"[\").replace(/%5D/g, \"]\");\n        }\n        return part;\n    })\n        .join(\"\");\n}\nfunction encodeUnreserved(str) {\n    return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {\n        return \"%\" + c.charCodeAt(0).toString(16).toUpperCase();\n    });\n}\nfunction encodeValue(operator, value, key) {\n    value =\n        operator === \"+\" || operator === \"#\"\n            ? encodeReserved(value)\n            : encodeUnreserved(value);\n    if (key) {\n        return encodeUnreserved(key) + \"=\" + value;\n    }\n    else {\n        return value;\n    }\n}\nfunction isDefined(value) {\n    return value !== undefined && value !== null;\n}\nfunction isKeyOperator(operator) {\n    return operator === \";\" || operator === \"&\" || operator === \"?\";\n}\nfunction getValues(context, operator, key, modifier) {\n    var value = context[key], result = [];\n    if (isDefined(value) && value !== \"\") {\n        if (typeof value === \"string\" ||\n            typeof value === \"number\" ||\n            typeof value === \"boolean\") {\n            value = value.toString();\n            if (modifier && modifier !== \"*\") {\n                value = value.substring(0, parseInt(modifier, 10));\n            }\n            result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : \"\"));\n        }\n        else {\n            if (modifier === \"*\") {\n                if (Array.isArray(value)) {\n                    value.filter(isDefined).forEach(function (value) {\n                        result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : \"\"));\n                    });\n                }\n                else {\n                    Object.keys(value).forEach(function (k) {\n                        if (isDefined(value[k])) {\n                            result.push(encodeValue(operator, value[k], k));\n                        }\n                    });\n                }\n            }\n            else {\n                const tmp = [];\n                if (Array.isArray(value)) {\n                    value.filter(isDefined).forEach(function (value) {\n                        tmp.push(encodeValue(operator, value));\n                    });\n                }\n                else {\n                    Object.keys(value).forEach(function (k) {\n                        if (isDefined(value[k])) {\n                            tmp.push(encodeUnreserved(k));\n                            tmp.push(encodeValue(operator, value[k].toString()));\n                        }\n                    });\n                }\n                if (isKeyOperator(operator)) {\n                    result.push(encodeUnreserved(key) + \"=\" + tmp.join(\",\"));\n                }\n                else if (tmp.length !== 0) {\n                    result.push(tmp.join(\",\"));\n                }\n            }\n        }\n    }\n    else {\n        if (operator === \";\") {\n            if (isDefined(value)) {\n                result.push(encodeUnreserved(key));\n            }\n        }\n        else if (value === \"\" && (operator === \"&\" || operator === \"?\")) {\n            result.push(encodeUnreserved(key) + \"=\");\n        }\n        else if (value === \"\") {\n            result.push(\"\");\n        }\n    }\n    return result;\n}\nexport function parseUrl(template) {\n    return {\n        expand: expand.bind(null, template),\n    };\n}\nfunction expand(template, context) {\n    var operators = [\"+\", \"#\", \".\", \"/\", \";\", \"?\", \"&\"];\n    return template.replace(/\\{([^\\{\\}]+)\\}|([^\\{\\}]+)/g, function (_, expression, literal) {\n        if (expression) {\n            let operator = \"\";\n            const values = [];\n            if (operators.indexOf(expression.charAt(0)) !== -1) {\n                operator = expression.charAt(0);\n                expression = expression.substr(1);\n            }\n            expression.split(/,/g).forEach(function (variable) {\n                var tmp = /([^:\\*]*)(?::(\\d+)|(\\*))?/.exec(variable);\n                values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));\n            });\n            if (operator && operator !== \"+\") {\n                var separator = \",\";\n                if (operator === \"?\") {\n                    separator = \"&\";\n                }\n                else if (operator !== \"#\") {\n                    separator = operator;\n                }\n                return (values.length !== 0 ? operator : \"\") + values.join(separator);\n            }\n            else {\n                return values.join(\",\");\n            }\n        }\n        else {\n            return encodeReserved(literal);\n        }\n    });\n}\n","import { addQueryParameters } from \"./util/add-query-parameters\";\nimport { extractUrlVariableNames } from \"./util/extract-url-variable-names\";\nimport { omit } from \"./util/omit\";\nimport { parseUrl } from \"./util/url-template\";\nexport function parse(options) {\n    // https://fetch.spec.whatwg.org/#methods\n    let method = options.method.toUpperCase();\n    // replace :varname with {varname} to make it RFC 6570 compatible\n    let url = (options.url || \"/\").replace(/:([a-z]\\w+)/g, \"{+$1}\");\n    let headers = Object.assign({}, options.headers);\n    let body;\n    let parameters = omit(options, [\n        \"method\",\n        \"baseUrl\",\n        \"url\",\n        \"headers\",\n        \"request\",\n        \"mediaType\",\n    ]);\n    // extract variable names from URL to calculate remaining variables later\n    const urlVariableNames = extractUrlVariableNames(url);\n    url = parseUrl(url).expand(parameters);\n    if (!/^http/.test(url)) {\n        url = options.baseUrl + url;\n    }\n    const omittedParameters = Object.keys(options)\n        .filter((option) => urlVariableNames.includes(option))\n        .concat(\"baseUrl\");\n    const remainingParameters = omit(parameters, omittedParameters);\n    const isBinaryRequset = /application\\/octet-stream/i.test(headers.accept);\n    if (!isBinaryRequset) {\n        if (options.mediaType.format) {\n            // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw\n            headers.accept = headers.accept\n                .split(/,/)\n                .map((preview) => preview.replace(/application\\/vnd(\\.\\w+)(\\.v3)?(\\.\\w+)?(\\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`))\n                .join(\",\");\n        }\n        if (options.mediaType.previews.length) {\n            const previewsFromAcceptHeader = headers.accept.match(/[\\w-]+(?=-preview)/g) || [];\n            headers.accept = previewsFromAcceptHeader\n                .concat(options.mediaType.previews)\n                .map((preview) => {\n                const format = options.mediaType.format\n                    ? `.${options.mediaType.format}`\n                    : \"+json\";\n                return `application/vnd.github.${preview}-preview${format}`;\n            })\n                .join(\",\");\n        }\n    }\n    // for GET/HEAD requests, set URL query parameters from remaining parameters\n    // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters\n    if ([\"GET\", \"HEAD\"].includes(method)) {\n        url = addQueryParameters(url, remainingParameters);\n    }\n    else {\n        if (\"data\" in remainingParameters) {\n            body = remainingParameters.data;\n        }\n        else {\n            if (Object.keys(remainingParameters).length) {\n                body = remainingParameters;\n            }\n            else {\n                headers[\"content-length\"] = 0;\n            }\n        }\n    }\n    // default content-type for JSON if body is set\n    if (!headers[\"content-type\"] && typeof body !== \"undefined\") {\n        headers[\"content-type\"] = \"application/json; charset=utf-8\";\n    }\n    // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body.\n    // fetch does not allow to set `content-length` header, but we can set body to an empty string\n    if ([\"PATCH\", \"PUT\"].includes(method) && typeof body === \"undefined\") {\n        body = \"\";\n    }\n    // Only return body/request keys if present\n    return Object.assign({ method, url, headers }, typeof body !== \"undefined\" ? { body } : null, options.request ? { request: options.request } : null);\n}\n","import { merge } from \"./merge\";\nimport { parse } from \"./parse\";\nexport function endpointWithDefaults(defaults, route, options) {\n    return parse(merge(defaults, route, options));\n}\n","import { endpointWithDefaults } from \"./endpoint-with-defaults\";\nimport { merge } from \"./merge\";\nimport { parse } from \"./parse\";\nexport function withDefaults(oldDefaults, newDefaults) {\n    const DEFAULTS = merge(oldDefaults, newDefaults);\n    const endpoint = endpointWithDefaults.bind(null, DEFAULTS);\n    return Object.assign(endpoint, {\n        DEFAULTS,\n        defaults: withDefaults.bind(null, DEFAULTS),\n        merge: merge.bind(null, DEFAULTS),\n        parse,\n    });\n}\n","export const VERSION = \"6.0.2\";\n","import { getUserAgent } from \"universal-user-agent\";\nimport { VERSION } from \"./version\";\nconst userAgent = `octokit-endpoint.js/${VERSION} ${getUserAgent()}`;\n// DEFAULTS has all properties set that EndpointOptions has, except url.\n// So we use RequestParameters and add method as additional required property.\nexport const DEFAULTS = {\n    method: \"GET\",\n    baseUrl: \"https://api.github.com\",\n    headers: {\n        accept: \"application/vnd.github.v3+json\",\n        \"user-agent\": userAgent,\n    },\n    mediaType: {\n        format: \"\",\n        previews: [],\n    },\n};\n","import { withDefaults } from \"./with-defaults\";\nimport { DEFAULTS } from \"./defaults\";\nexport const endpoint = withDefaults(null, DEFAULTS);\n"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@octokit/request/node_modules/@octokit/endpoint/package.json b/node_modules/@octokit/request/node_modules/@octokit/endpoint/package.json
deleted file mode 100644
index ca7c780..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/endpoint/package.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-  "name": "@octokit/endpoint",
-  "description": "Turns REST API endpoints into generic request options",
-  "version": "6.0.2",
-  "license": "MIT",
-  "files": [
-    "dist-*/",
-    "bin/"
-  ],
-  "pika": true,
-  "sideEffects": false,
-  "keywords": [
-    "octokit",
-    "github",
-    "api",
-    "rest"
-  ],
-  "homepage": "https://github.com/octokit/endpoint.js#readme",
-  "bugs": {
-    "url": "https://github.com/octokit/endpoint.js/issues"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/octokit/endpoint.js.git"
-  },
-  "dependencies": {
-    "@octokit/types": "^4.0.1",
-    "is-plain-object": "^3.0.0",
-    "universal-user-agent": "^5.0.0"
-  },
-  "devDependencies": {
-    "@pika/pack": "^0.5.0",
-    "@pika/plugin-build-node": "^0.9.0",
-    "@pika/plugin-build-web": "^0.9.0",
-    "@pika/plugin-ts-standard-pkg": "^0.9.0",
-    "@types/jest": "^25.1.0",
-    "jest": "^26.0.1",
-    "prettier": "2.0.5",
-    "semantic-release": "^17.0.0",
-    "semantic-release-plugin-update-version-in-files": "^1.0.0",
-    "ts-jest": "^26.0.0",
-    "typescript": "^3.4.5"
-  },
-  "publishConfig": {
-    "access": "public"
-  },
-  "source": "dist-src/index.js",
-  "types": "dist-types/index.d.ts",
-  "main": "dist-node/index.js",
-  "module": "dist-web/index.js"
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/LICENSE b/node_modules/@octokit/request/node_modules/@octokit/request-error/LICENSE
deleted file mode 100644
index ef2c18e..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/request-error/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License
-
-Copyright (c) 2019 Octokit contributors
-
-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/node_modules/@octokit/request/node_modules/@octokit/request-error/README.md b/node_modules/@octokit/request/node_modules/@octokit/request-error/README.md
deleted file mode 100644
index 315064c..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/request-error/README.md
+++ /dev/null
@@ -1,67 +0,0 @@
-# http-error.js
-
-> Error class for Octokit request errors
-
-[![@latest](https://img.shields.io/npm/v/@octokit/request-error.svg)](https://www.npmjs.com/package/@octokit/request-error)
-[![Build Status](https://github.com/octokit/request-error.js/workflows/Test/badge.svg)](https://github.com/octokit/request-error.js/actions?query=workflow%3ATest)
-
-## Usage
-
-<table>
-<tbody valign=top align=left>
-<tr><th>
-Browsers
-</th><td width=100%>
-Load <code>@octokit/request-error</code> directly from <a href="https://cdn.pika.dev">cdn.pika.dev</a>
-        
-```html
-<script type="module">
-import { RequestError } from "https://cdn.pika.dev/@octokit/request-error";
-</script>
-```
-
-</td></tr>
-<tr><th>
-Node
-</th><td>
-
-Install with <code>npm install @octokit/request-error</code>
-
-```js
-const { RequestError } = require("@octokit/request-error");
-// or: import { RequestError } from "@octokit/request-error";
-```
-
-</td></tr>
-</tbody>
-</table>
-
-```js
-const error = new RequestError("Oops", 500, {
-  headers: {
-    "x-github-request-id": "1:2:3:4",
-  }, // response headers
-  request: {
-    method: "POST",
-    url: "https://api.github.com/foo",
-    body: {
-      bar: "baz",
-    },
-    headers: {
-      authorization: "token secret123",
-    },
-  },
-});
-
-error.message; // Oops
-error.status; // 500
-error.headers; // { 'x-github-request-id': '1:2:3:4' }
-error.request.method; // POST
-error.request.url; // https://api.github.com/foo
-error.request.body; // { bar: 'baz' }
-error.request.headers; // { authorization: 'token [REDACTED]' }
-```
-
-## LICENSE
-
-[MIT](LICENSE)
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-node/index.js b/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-node/index.js
deleted file mode 100644
index 95b9c57..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-node/index.js
+++ /dev/null
@@ -1,55 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, '__esModule', { value: true });
-
-function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
-
-var deprecation = require('deprecation');
-var once = _interopDefault(require('once'));
-
-const logOnce = once(deprecation => console.warn(deprecation));
-/**
- * Error with extra properties to help with debugging
- */
-
-class RequestError extends Error {
-  constructor(message, statusCode, options) {
-    super(message); // Maintains proper stack trace (only available on V8)
-
-    /* istanbul ignore next */
-
-    if (Error.captureStackTrace) {
-      Error.captureStackTrace(this, this.constructor);
-    }
-
-    this.name = "HttpError";
-    this.status = statusCode;
-    Object.defineProperty(this, "code", {
-      get() {
-        logOnce(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`."));
-        return statusCode;
-      }
-
-    });
-    this.headers = options.headers || {}; // redact request credentials without mutating original request options
-
-    const requestCopy = Object.assign({}, options.request);
-
-    if (options.request.headers.authorization) {
-      requestCopy.headers = Object.assign({}, options.request.headers, {
-        authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]")
-      });
-    }
-
-    requestCopy.url = requestCopy.url // client_id & client_secret can be passed as URL query parameters to increase rate limit
-    // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications
-    .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]") // OAuth tokens can be passed as URL query parameters, although it is not recommended
-    // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header
-    .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]");
-    this.request = requestCopy;
-  }
-
-}
-
-exports.RequestError = RequestError;
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-node/index.js.map b/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-node/index.js.map
deleted file mode 100644
index 2562006..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-node/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../dist-src/index.js"],"sourcesContent":["import { Deprecation } from \"deprecation\";\nimport once from \"once\";\nconst logOnce = once((deprecation) => console.warn(deprecation));\n/**\n * Error with extra properties to help with debugging\n */\nexport class RequestError extends Error {\n    constructor(message, statusCode, options) {\n        super(message);\n        // Maintains proper stack trace (only available on V8)\n        /* istanbul ignore next */\n        if (Error.captureStackTrace) {\n            Error.captureStackTrace(this, this.constructor);\n        }\n        this.name = \"HttpError\";\n        this.status = statusCode;\n        Object.defineProperty(this, \"code\", {\n            get() {\n                logOnce(new Deprecation(\"[@octokit/request-error] `error.code` is deprecated, use `error.status`.\"));\n                return statusCode;\n            },\n        });\n        this.headers = options.headers || {};\n        // redact request credentials without mutating original request options\n        const requestCopy = Object.assign({}, options.request);\n        if (options.request.headers.authorization) {\n            requestCopy.headers = Object.assign({}, options.request.headers, {\n                authorization: options.request.headers.authorization.replace(/ .*$/, \" [REDACTED]\"),\n            });\n        }\n        requestCopy.url = requestCopy.url\n            // client_id & client_secret can be passed as URL query parameters to increase rate limit\n            // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications\n            .replace(/\\bclient_secret=\\w+/g, \"client_secret=[REDACTED]\")\n            // OAuth tokens can be passed as URL query parameters, although it is not recommended\n            // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header\n            .replace(/\\baccess_token=\\w+/g, \"access_token=[REDACTED]\");\n        this.request = requestCopy;\n    }\n}\n"],"names":["logOnce","once","deprecation","console","warn","RequestError","Error","constructor","message","statusCode","options","captureStackTrace","name","status","Object","defineProperty","get","Deprecation","headers","requestCopy","assign","request","authorization","replace","url"],"mappings":";;;;;;;;;AAEA,MAAMA,OAAO,GAAGC,IAAI,CAAEC,WAAD,IAAiBC,OAAO,CAACC,IAAR,CAAaF,WAAb,CAAlB,CAApB;AACA;;;;AAGO,MAAMG,YAAN,SAA2BC,KAA3B,CAAiC;AACpCC,EAAAA,WAAW,CAACC,OAAD,EAAUC,UAAV,EAAsBC,OAAtB,EAA+B;AACtC,UAAMF,OAAN,EADsC;;AAGtC;;AACA,QAAIF,KAAK,CAACK,iBAAV,EAA6B;AACzBL,MAAAA,KAAK,CAACK,iBAAN,CAAwB,IAAxB,EAA8B,KAAKJ,WAAnC;AACH;;AACD,SAAKK,IAAL,GAAY,WAAZ;AACA,SAAKC,MAAL,GAAcJ,UAAd;AACAK,IAAAA,MAAM,CAACC,cAAP,CAAsB,IAAtB,EAA4B,MAA5B,EAAoC;AAChCC,MAAAA,GAAG,GAAG;AACFhB,QAAAA,OAAO,CAAC,IAAIiB,uBAAJ,CAAgB,0EAAhB,CAAD,CAAP;AACA,eAAOR,UAAP;AACH;;AAJ+B,KAApC;AAMA,SAAKS,OAAL,GAAeR,OAAO,CAACQ,OAAR,IAAmB,EAAlC,CAfsC;;AAiBtC,UAAMC,WAAW,GAAGL,MAAM,CAACM,MAAP,CAAc,EAAd,EAAkBV,OAAO,CAACW,OAA1B,CAApB;;AACA,QAAIX,OAAO,CAACW,OAAR,CAAgBH,OAAhB,CAAwBI,aAA5B,EAA2C;AACvCH,MAAAA,WAAW,CAACD,OAAZ,GAAsBJ,MAAM,CAACM,MAAP,CAAc,EAAd,EAAkBV,OAAO,CAACW,OAAR,CAAgBH,OAAlC,EAA2C;AAC7DI,QAAAA,aAAa,EAAEZ,OAAO,CAACW,OAAR,CAAgBH,OAAhB,CAAwBI,aAAxB,CAAsCC,OAAtC,CAA8C,MAA9C,EAAsD,aAAtD;AAD8C,OAA3C,CAAtB;AAGH;;AACDJ,IAAAA,WAAW,CAACK,GAAZ,GAAkBL,WAAW,CAACK,GAAZ;AAEd;AAFc,KAGbD,OAHa,CAGL,sBAHK,EAGmB,0BAHnB;AAKd;AALc,KAMbA,OANa,CAML,qBANK,EAMkB,yBANlB,CAAlB;AAOA,SAAKF,OAAL,GAAeF,WAAf;AACH;;AAhCmC;;;;"}
\ No newline at end of file
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/index.js b/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/index.js
deleted file mode 100644
index c880b45..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/index.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import { Deprecation } from "deprecation";
-import once from "once";
-const logOnce = once((deprecation) => console.warn(deprecation));
-/**
- * Error with extra properties to help with debugging
- */
-export class RequestError extends Error {
-    constructor(message, statusCode, options) {
-        super(message);
-        // Maintains proper stack trace (only available on V8)
-        /* istanbul ignore next */
-        if (Error.captureStackTrace) {
-            Error.captureStackTrace(this, this.constructor);
-        }
-        this.name = "HttpError";
-        this.status = statusCode;
-        Object.defineProperty(this, "code", {
-            get() {
-                logOnce(new Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`."));
-                return statusCode;
-            },
-        });
-        this.headers = options.headers || {};
-        // redact request credentials without mutating original request options
-        const requestCopy = Object.assign({}, options.request);
-        if (options.request.headers.authorization) {
-            requestCopy.headers = Object.assign({}, options.request.headers, {
-                authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]"),
-            });
-        }
-        requestCopy.url = requestCopy.url
-            // client_id & client_secret can be passed as URL query parameters to increase rate limit
-            // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications
-            .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]")
-            // OAuth tokens can be passed as URL query parameters, although it is not recommended
-            // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header
-            .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]");
-        this.request = requestCopy;
-    }
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-types/index.d.ts b/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-types/index.d.ts
deleted file mode 100644
index baa8a0e..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-types/index.d.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { RequestOptions, ResponseHeaders } from "@octokit/types";
-import { RequestErrorOptions } from "./types";
-/**
- * Error with extra properties to help with debugging
- */
-export declare class RequestError extends Error {
-    name: "HttpError";
-    /**
-     * http status code
-     */
-    status: number;
-    /**
-     * http status code
-     *
-     * @deprecated `error.code` is deprecated in favor of `error.status`
-     */
-    code: number;
-    /**
-     * error response headers
-     */
-    headers: ResponseHeaders;
-    /**
-     * Request options that lead to the error.
-     */
-    request: RequestOptions;
-    constructor(message: string, statusCode: number, options: RequestErrorOptions);
-}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-types/types.d.ts b/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-types/types.d.ts
deleted file mode 100644
index 865d213..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-types/types.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { RequestOptions, ResponseHeaders } from "@octokit/types";
-export declare type RequestErrorOptions = {
-    headers?: ResponseHeaders;
-    request: RequestOptions;
-};
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-web/index.js b/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-web/index.js
deleted file mode 100644
index feec58e..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-web/index.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import { Deprecation } from 'deprecation';
-import once from 'once';
-
-const logOnce = once((deprecation) => console.warn(deprecation));
-/**
- * Error with extra properties to help with debugging
- */
-class RequestError extends Error {
-    constructor(message, statusCode, options) {
-        super(message);
-        // Maintains proper stack trace (only available on V8)
-        /* istanbul ignore next */
-        if (Error.captureStackTrace) {
-            Error.captureStackTrace(this, this.constructor);
-        }
-        this.name = "HttpError";
-        this.status = statusCode;
-        Object.defineProperty(this, "code", {
-            get() {
-                logOnce(new Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`."));
-                return statusCode;
-            },
-        });
-        this.headers = options.headers || {};
-        // redact request credentials without mutating original request options
-        const requestCopy = Object.assign({}, options.request);
-        if (options.request.headers.authorization) {
-            requestCopy.headers = Object.assign({}, options.request.headers, {
-                authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]"),
-            });
-        }
-        requestCopy.url = requestCopy.url
-            // client_id & client_secret can be passed as URL query parameters to increase rate limit
-            // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications
-            .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]")
-            // OAuth tokens can be passed as URL query parameters, although it is not recommended
-            // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header
-            .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]");
-        this.request = requestCopy;
-    }
-}
-
-export { RequestError };
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-web/index.js.map b/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-web/index.js.map
deleted file mode 100644
index 130740d..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-web/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../dist-src/index.js"],"sourcesContent":["import { Deprecation } from \"deprecation\";\nimport once from \"once\";\nconst logOnce = once((deprecation) => console.warn(deprecation));\n/**\n * Error with extra properties to help with debugging\n */\nexport class RequestError extends Error {\n    constructor(message, statusCode, options) {\n        super(message);\n        // Maintains proper stack trace (only available on V8)\n        /* istanbul ignore next */\n        if (Error.captureStackTrace) {\n            Error.captureStackTrace(this, this.constructor);\n        }\n        this.name = \"HttpError\";\n        this.status = statusCode;\n        Object.defineProperty(this, \"code\", {\n            get() {\n                logOnce(new Deprecation(\"[@octokit/request-error] `error.code` is deprecated, use `error.status`.\"));\n                return statusCode;\n            },\n        });\n        this.headers = options.headers || {};\n        // redact request credentials without mutating original request options\n        const requestCopy = Object.assign({}, options.request);\n        if (options.request.headers.authorization) {\n            requestCopy.headers = Object.assign({}, options.request.headers, {\n                authorization: options.request.headers.authorization.replace(/ .*$/, \" [REDACTED]\"),\n            });\n        }\n        requestCopy.url = requestCopy.url\n            // client_id & client_secret can be passed as URL query parameters to increase rate limit\n            // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications\n            .replace(/\\bclient_secret=\\w+/g, \"client_secret=[REDACTED]\")\n            // OAuth tokens can be passed as URL query parameters, although it is not recommended\n            // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header\n            .replace(/\\baccess_token=\\w+/g, \"access_token=[REDACTED]\");\n        this.request = requestCopy;\n    }\n}\n"],"names":[],"mappings":";;;AAEA,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AACjE;AACA;AACA;AACO,MAAM,YAAY,SAAS,KAAK,CAAC;AACxC,IAAI,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE;AAC9C,QAAQ,KAAK,CAAC,OAAO,CAAC,CAAC;AACvB;AACA;AACA,QAAQ,IAAI,KAAK,CAAC,iBAAiB,EAAE;AACrC,YAAY,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;AAC5D,SAAS;AACT,QAAQ,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;AAChC,QAAQ,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;AACjC,QAAQ,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE;AAC5C,YAAY,GAAG,GAAG;AAClB,gBAAgB,OAAO,CAAC,IAAI,WAAW,CAAC,0EAA0E,CAAC,CAAC,CAAC;AACrH,gBAAgB,OAAO,UAAU,CAAC;AAClC,aAAa;AACb,SAAS,CAAC,CAAC;AACX,QAAQ,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;AAC7C;AACA,QAAQ,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;AAC/D,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE;AACnD,YAAY,WAAW,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE;AAC7E,gBAAgB,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC;AACnG,aAAa,CAAC,CAAC;AACf,SAAS;AACT,QAAQ,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG;AACzC;AACA;AACA,aAAa,OAAO,CAAC,sBAAsB,EAAE,0BAA0B,CAAC;AACxE;AACA;AACA,aAAa,OAAO,CAAC,qBAAqB,EAAE,yBAAyB,CAAC,CAAC;AACvE,QAAQ,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC;AACnC,KAAK;AACL;;;;"}
\ No newline at end of file
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/package.json b/node_modules/@octokit/request/node_modules/@octokit/request-error/package.json
deleted file mode 100644
index 7559a54..0000000
--- a/node_modules/@octokit/request/node_modules/@octokit/request-error/package.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
-  "name": "@octokit/request-error",
-  "description": "Error class for Octokit request errors",
-  "version": "2.0.1",
-  "license": "MIT",
-  "files": [
-    "dist-*/",
-    "bin/"
-  ],
-  "pika": true,
-  "sideEffects": false,
-  "keywords": [
-    "octokit",
-    "github",
-    "api",
-    "error"
-  ],
-  "homepage": "https://github.com/octokit/request-error.js#readme",
-  "bugs": {
-    "url": "https://github.com/octokit/request-error.js/issues"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/octokit/request-error.js.git"
-  },
-  "dependencies": {
-    "@octokit/types": "^4.0.1",
-    "deprecation": "^2.0.0",
-    "once": "^1.4.0"
-  },
-  "devDependencies": {
-    "@pika/pack": "^0.5.0",
-    "@pika/plugin-build-node": "^0.9.0",
-    "@pika/plugin-build-web": "^0.9.0",
-    "@pika/plugin-bundle-web": "^0.9.0",
-    "@pika/plugin-ts-standard-pkg": "^0.9.0",
-    "@types/jest": "^25.1.0",
-    "@types/node": "^14.0.4",
-    "@types/once": "^1.4.0",
-    "jest": "^25.1.0",
-    "pika-plugin-unpkg-field": "^1.1.0",
-    "prettier": "^2.0.1",
-    "semantic-release": "^17.0.0",
-    "ts-jest": "^25.1.0",
-    "typescript": "^3.4.5"
-  },
-  "publishConfig": {
-    "access": "public"
-  },
-  "source": "dist-src/index.js",
-  "types": "dist-types/index.d.ts",
-  "main": "dist-node/index.js",
-  "module": "dist-web/index.js"
-}
diff --git a/node_modules/@types/babel__traverse/LICENSE b/node_modules/@types/babel__traverse/LICENSE
index 4b1ad51..9e841e7 100644
--- a/node_modules/@types/babel__traverse/LICENSE
+++ b/node_modules/@types/babel__traverse/LICENSE
@@ -1,21 +1,21 @@
-    MIT License
-
-    Copyright (c) Microsoft Corporation. All rights reserved.
-
-    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
+    MIT License
+
+    Copyright (c) Microsoft Corporation.
+
+    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/node_modules/@types/babel__traverse/README.md b/node_modules/@types/babel__traverse/README.md
index f2e1c54..ddd8134 100644
--- a/node_modules/@types/babel__traverse/README.md
+++ b/node_modules/@types/babel__traverse/README.md
@@ -2,15 +2,15 @@
 > `npm install --save @types/babel__traverse`
 
 # Summary
-This package contains type definitions for @babel/traverse ( https://github.com/babel/babel/tree/master/packages/babel-traverse ).
+This package contains type definitions for @babel/traverse (https://github.com/babel/babel/tree/main/packages/babel-traverse).
 
 # Details
-Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/babel__traverse
+Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/babel__traverse.
 
-Additional Details
- * Last updated: Tue, 11 Jun 2019 02:00:21 GMT
- * Dependencies: @types/babel__types
+### Additional Details
+ * Last updated: Fri, 25 Sep 2020 23:55:30 GMT
+ * Dependencies: [@types/babel__types](https://npmjs.com/package/@types/babel__types)
  * Global values: none
 
 # Credits
-These definitions were written by Troy Gerwien <https://github.com/yortus>, Marvin Hagemeister <https://github.com/marvinhagemeister>, Ryan Petrich <https://github.com/rpetrich>, Melvin Groenhoff <https://github.com/mgroenhoff>.
+These definitions were written by [Troy Gerwien](https://github.com/yortus), [Marvin Hagemeister](https://github.com/marvinhagemeister), [Ryan Petrich](https://github.com/rpetrich), [Melvin Groenhoff](https://github.com/mgroenhoff), [Dean L.](https://github.com/dlgrit), [Ifiok Jr.](https://github.com/ifiokjr), and [ExE Boss](https://github.com/ExE-Boss).
diff --git a/node_modules/@types/babel__traverse/index.d.ts b/node_modules/@types/babel__traverse/index.d.ts
index 0e9ff76..827bae1 100644
--- a/node_modules/@types/babel__traverse/index.d.ts
+++ b/node_modules/@types/babel__traverse/index.d.ts
@@ -1,44 +1,80 @@
 // Type definitions for @babel/traverse 7.0
-// Project: https://github.com/babel/babel/tree/master/packages/babel-traverse, https://babeljs.io
+// Project: https://github.com/babel/babel/tree/main/packages/babel-traverse, https://babeljs.io
 // Definitions by: Troy Gerwien <https://github.com/yortus>
 //                 Marvin Hagemeister <https://github.com/marvinhagemeister>
 //                 Ryan Petrich <https://github.com/rpetrich>
 //                 Melvin Groenhoff <https://github.com/mgroenhoff>
+//                 Dean L. <https://github.com/dlgrit>
+//                 Ifiok Jr. <https://github.com/ifiokjr>
+//                 ExE Boss <https://github.com/ExE-Boss>
 // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
-// TypeScript Version: 2.9
+// Minimum TypeScript Version: 3.4
 
-import * as t from "@babel/types";
+import * as t from '@babel/types';
+export import Node = t.Node;
 
-export type Node = t.Node;
+declare const traverse: {
+    <S>(
+        parent: Node | Node[] | null | undefined,
+        opts: TraverseOptions<S>,
+        scope: Scope | undefined,
+        state: S,
+        parentPath?: NodePath,
+    ): void;
+    (
+        parent: Node | Node[] | null | undefined,
+        opts?: TraverseOptions,
+        scope?: Scope,
+        state?: any,
+        parentPath?: NodePath,
+    ): void;
 
-export default function traverse<S>(
-    parent: Node | Node[],
-    opts: TraverseOptions<S>,
-    scope: Scope | undefined,
-    state: S,
-    parentPath?: NodePath,
-): void;
-export default function traverse(
-    parent: Node | Node[],
-    opts: TraverseOptions,
-    scope?: Scope,
-    state?: any,
-    parentPath?: NodePath,
-): void;
+    visitors: typeof visitors;
+    verify: typeof visitors.verify;
+    explode: typeof visitors.explode;
+};
+
+export namespace visitors {
+    /**
+     * `explode()` will take a `Visitor` object with all of the various shorthands
+     * that we support, and validates & normalizes it into a common format, ready
+     * to be used in traversal.
+     *
+     * The various shorthands are:
+     * - `Identifier() { ... }` -> `Identifier: { enter() { ... } }`
+     * - `"Identifier|NumericLiteral": { ... }` -> `Identifier: { ... }, NumericLiteral: { ... }`
+     * - Aliases in `@babel/types`: e.g. `Property: { ... }` -> `ObjectProperty: { ... }, ClassProperty: { ... }`
+     *
+     * Other normalizations are:
+     * - Visitors of virtual types are wrapped, so that they are only visited when their dynamic check passes
+     * - `enter` and `exit` functions are wrapped in arrays, to ease merging of visitors
+     */
+    function explode<S = {}>(
+        visitor: Visitor<S>,
+    ): {
+        [Type in Node['type']]?: VisitNodeObject<S, Extract<Node, { type: Type }>>;
+    };
+    function verify(visitor: Visitor): void;
+    function merge<S = {}>(visitors: Array<Visitor<S>>, states?: S[]): Visitor<unknown>;
+}
+
+export default traverse;
 
 export interface TraverseOptions<S = Node> extends Visitor<S> {
     scope?: Scope;
     noScope?: boolean;
 }
 
+export type ArrayKeys<T> = { [P in keyof T]: T[P] extends any[] ? P : never }[keyof T];
+
 export class Scope {
     constructor(path: NodePath, parentScope?: Scope);
     path: NodePath;
     block: Node;
     parentBlock: Node;
     parent: Scope;
-    hub: Hub;
-    bindings: { [name: string]: Binding; };
+    hub: HubInterface;
+    bindings: { [name: string]: Binding };
 
     /** Traverse node with current scope and path. */
     traverse<S>(node: Node | Node[], opts: TraverseOptions<S>, state: S): void;
@@ -102,12 +138,7 @@
 
     removeData(key: string): void;
 
-    push(opts: {
-        id: t.LVal,
-        init?: t.Expression,
-        unique?: boolean,
-        kind?: "var" | "let" | "const",
-    }): void;
+    push(opts: { id: t.LVal; init?: t.Expression; unique?: boolean; kind?: 'var' | 'let' | 'const' }): void;
 
     getProgramParent(): Scope;
 
@@ -143,11 +174,17 @@
 }
 
 export class Binding {
-    constructor(opts: { existing: Binding; identifier: t.Identifier; scope: Scope; path: NodePath; kind: "var" | "let" | "const"; });
+    constructor(opts: {
+        existing: Binding;
+        identifier: t.Identifier;
+        scope: Scope;
+        path: NodePath;
+        kind: 'var' | 'let' | 'const';
+    });
     identifier: t.Identifier;
     scope: Scope;
     path: NodePath;
-    kind: "var" | "let" | "const" | "module";
+    kind: 'var' | 'let' | 'const' | 'module';
     referenced: boolean;
     references: number;
     referencePaths: NodePath[];
@@ -155,21 +192,29 @@
     constantViolations: NodePath[];
 }
 
-export type Visitor<S = {}> = VisitNodeObject<S, Node> & {
-    [Type in Node["type"]]?: VisitNode<S, Extract<Node, { type: Type; }>>;
-} & {
-    [K in keyof t.Aliases]?: VisitNode<S, t.Aliases[K]>
-};
+export type Visitor<S = {}> = VisitNodeObject<S, Node> &
+    {
+        [Type in Node['type']]?: VisitNode<S, Extract<Node, { type: Type }>>;
+    } &
+    {
+        [K in keyof t.Aliases]?: VisitNode<S, t.Aliases[K]>;
+    };
 
-export type VisitNode<S, P> = VisitNodeFunction<S, P> | VisitNodeObject<S, P>;
+export type VisitNode<S, P extends Node> = VisitNodeFunction<S, P> | VisitNodeObject<S, P>;
 
-export type VisitNodeFunction<S, P> = (this: S, path: NodePath<P>, state: S) => void;
+export type VisitNodeFunction<S, P extends Node> = (this: S, path: NodePath<P>, state: S) => void;
 
-export interface VisitNodeObject<S, P> {
+export interface VisitNodeObject<S, P extends Node> {
     enter?: VisitNodeFunction<S, P>;
     exit?: VisitNodeFunction<S, P>;
 }
 
+export type NodePaths<T extends Node | readonly Node[]> = T extends readonly Node[]
+    ? { -readonly [K in keyof T]: NodePath<Extract<T[K], Node>> }
+    : T extends Node
+    ? [NodePath<T>]
+    : never;
+
 export class NodePath<T = Node> {
     constructor(hub: Hub, parent: Node);
     parent: Node;
@@ -191,7 +236,7 @@
     key: string | number;
     node: T;
     scope: Scope;
-    type: T extends undefined | null ? string | null : string;
+    type: T extends null | undefined ? undefined : T extends Node ? T['type'] : string | undefined;
     typeAnnotation: object;
 
     getScope(scope: Scope): Scope;
@@ -212,20 +257,36 @@
     // Example: https://github.com/babel/babel/blob/63204ae51e020d84a5b246312f5eeb4d981ab952/packages/babel-traverse/src/path/modification.js#L83
     debug(buildMessage: () => string): void;
 
-    // ------------------------- ancestry -------------------------
-    /**
-     * Call the provided `callback` with the `NodePath`s of all the parents.
-     * When the `callback` returns a truthy value, we return that node path.
-     */
-    findParent(callback: (path: NodePath) => boolean): NodePath;
+    static get<C extends Node, K extends keyof C>(opts: {
+        hub: HubInterface;
+        parentPath: NodePath | null;
+        parent: Node;
+        container: C;
+        listKey?: string;
+        key: K;
+    }): NodePath<C[K]>;
 
-    find(callback: (path: NodePath) => boolean): NodePath;
+    //#region ------------------------- ancestry -------------------------
+    /**
+     * Starting at the parent path of the current `NodePath` and going up the
+     * tree, return the first `NodePath` that causes the provided `callback`
+     * to return a truthy value, or `null` if the `callback` never returns a
+     * truthy value.
+     */
+    findParent(callback: (path: NodePath) => boolean): NodePath | null;
+
+    /**
+     * Starting at current `NodePath` and going up the tree, return the first
+     * `NodePath` that causes the provided `callback` to return a truthy value,
+     * or `null` if the `callback` never returns a truthy value.
+     */
+    find(callback: (path: NodePath) => boolean): NodePath | null;
 
     /** Get the parent function of the current path. */
-    getFunctionParent(): NodePath<t.Function>;
+    getFunctionParent(): NodePath<t.Function> | null;
 
     /** Walk up the tree until we hit a parent node path in a list. */
-    getStatementParent(): NodePath<t.Statement>;
+    getStatementParent(): NodePath<t.Statement> | null;
 
     /**
      * Get the deepest common ancestor and then from it, get the earliest relationship path
@@ -234,12 +295,12 @@
      * Earliest is defined as being "before" all the other nodes in terms of list container
      * position and visiting key.
      */
-    getEarliestCommonAncestorFrom(paths: NodePath[]): NodePath[];
+    getEarliestCommonAncestorFrom(paths: NodePath[]): NodePath;
 
     /** Get the earliest path in the tree where the provided `paths` intersect. */
     getDeepestCommonAncestorFrom(
         paths: NodePath[],
-        filter?: (deepest: Node, i: number, ancestries: NodePath[]) => NodePath
+        filter?: (deepest: Node, i: number, ancestries: NodePath[]) => NodePath,
     ): NodePath;
 
     /**
@@ -247,11 +308,22 @@
      *
      * NOTE: The current node path is included in this.
      */
-    getAncestry(): NodePath[];
+    getAncestry(): [this, ...NodePath[]];
+
+    /**
+     * A helper to find if `this` path is an ancestor of `maybeDescendant`
+     */
+    isAncestor(maybeDescendant: NodePath): boolean;
+
+    /**
+     * A helper to find if `this` path is a descendant of `maybeAncestor`
+     */
+    isDescendant(maybeAncestor: NodePath): boolean;
 
     inType(...candidateTypes: string[]): boolean;
+    //#endregion
 
-    // ------------------------- inference -------------------------
+    //#region ------------------------- inference -------------------------
     /** Infer the type of the current `NodePath`. */
     getTypeAnnotation(): t.FlowType;
 
@@ -262,8 +334,9 @@
     baseTypeStrictlyMatches(right: NodePath): boolean;
 
     isGenericType(genericName: string): boolean;
+    //#endregion
 
-    // ------------------------- replacement -------------------------
+    //#region ------------------------- replacement -------------------------
     /**
      * Replace a node with an array of multiple. This method performs the following steps:
      *
@@ -271,7 +344,7 @@
      *  - Insert the provided nodes after the current node.
      *  - Remove the current node.
      */
-    replaceWithMultiple(nodes: Node[]): void;
+    replaceWithMultiple<Nodes extends readonly Node[]>(nodes: Nodes): NodePaths<Nodes>;
 
     /**
      * Parse a string as an expression and replace the current node with the result.
@@ -280,21 +353,22 @@
      * transforming ASTs is an antipattern and SHOULD NOT be encouraged. Even if it's
      * easier to use, your transforms will be extremely brittle.
      */
-    replaceWithSourceString(replacement: any): void;
+    replaceWithSourceString(replacement: any): [NodePath];
 
     /** Replace the current node with another. */
-    replaceWith(replacement: Node | NodePath): void;
+    replaceWith<T extends Node>(replacement: T | NodePath<T>): [NodePath<T>];
 
     /**
      * This method takes an array of statements nodes and then explodes it
      * into expressions. This method retains completion records which is
      * extremely important to retain original semantics.
      */
-    replaceExpressionWithStatements(nodes: Node[]): Node;
+    replaceExpressionWithStatements<Nodes extends readonly Node[]>(nodes: Nodes): NodePaths<Nodes>;
 
-    replaceInline(nodes: Node | Node[]): void;
+    replaceInline<Nodes extends Node | readonly Node[]>(nodes: Nodes): NodePaths<Nodes>;
+    //#endregion
 
-    // ------------------------- evaluation -------------------------
+    //#region ------------------------- evaluation -------------------------
     /**
      * Walk the input `node` and statically evaluate if it's truthy.
      *
@@ -319,8 +393,9 @@
      *   t.evaluate(parse("foo + foo")) // { confident: false, value: undefined }
      */
     evaluate(): { confident: boolean; value: any };
+    //#endregion
 
-    // ------------------------- introspection -------------------------
+    //#region ------------------------- introspection -------------------------
     /**
      * Match the current node if it matches the provided `pattern`.
      *
@@ -389,8 +464,9 @@
 
     /** Check if the current path will maybe execute before another path */
     willIMaybeExecuteBefore(path: NodePath): boolean;
+    //#endregion
 
-    // ------------------------- context -------------------------
+    //#region ------------------------- context -------------------------
     call(key: string): boolean;
 
     isBlacklisted(): boolean;
@@ -410,27 +486,44 @@
     popContext(): void;
 
     pushContext(context: TraversalContext): void;
+    //#endregion
 
-    // ------------------------- removal -------------------------
+    //#region ------------------------- removal -------------------------
     remove(): void;
+    //#endregion
 
-    // ------------------------- modification -------------------------
+    //#region ------------------------- modification -------------------------
     /** Insert the provided nodes before the current one. */
-    insertBefore(nodes: Node | Node[]): any;
+    insertBefore<Nodes extends Node | readonly Node[]>(nodes: Nodes): NodePaths<Nodes>;
 
     /**
      * Insert the provided nodes after the current one. When inserting nodes after an
      * expression, ensure that the completion record is correct by pushing the current node.
      */
-    insertAfter(nodes: Node | Node[]): any;
+    insertAfter<Nodes extends Node | readonly Node[]>(nodes: Nodes): NodePaths<Nodes>;
 
     /** Update all sibling node paths after `fromIndex` by `incrementBy`. */
     updateSiblingKeys(fromIndex: number, incrementBy: number): void;
 
+    /**
+     * Insert child nodes at the start of the current node.
+     * @param listKey - The key at which the child nodes are stored (usually body).
+     * @param nodes - the nodes to insert.
+     */
+    unshiftContainer<Nodes extends Node | readonly Node[]>(listKey: ArrayKeys<T>, nodes: Nodes): NodePaths<Nodes>;
+
+    /**
+     * Insert child nodes at the end of the current node.
+     * @param listKey - The key at which the child nodes are stored (usually body).
+     * @param nodes - the nodes to insert.
+     */
+    pushContainer<Nodes extends Node | readonly Node[]>(listKey: ArrayKeys<T>, nodes: Nodes): NodePaths<Nodes>;
+
     /** Hoist the current node to the highest scope possible and return a UID referencing it. */
     hoist(scope: Scope): void;
+    //#endregion
 
-    // ------------------------- family -------------------------
+    //#region ------------------------- family -------------------------
     getOpposite(): NodePath;
 
     getCompletionRecords(): NodePath[];
@@ -439,17 +532,22 @@
     getAllPrevSiblings(): NodePath[];
     getAllNextSiblings(): NodePath[];
 
-    get<K extends keyof T>(key: K, context?: boolean | TraversalContext):
-        T[K] extends Array<Node | null | undefined> ? Array<NodePath<T[K][number]>> :
-        T[K] extends Node | null | undefined ? NodePath<T[K]> :
-        never;
+    get<K extends keyof T>(
+        key: K,
+        context?: boolean | TraversalContext,
+    ): T[K] extends Array<Node | null | undefined>
+        ? Array<NodePath<T[K][number]>>
+        : T[K] extends Node | null | undefined
+        ? NodePath<T[K]>
+        : never;
     get(key: string, context?: boolean | TraversalContext): NodePath | NodePath[];
 
     getBindingIdentifiers(duplicates?: boolean): Node[];
 
     getOuterBindingIdentifiers(duplicates?: boolean): Node[];
+    //#endregion
 
-    // ------------------------- comments -------------------------
+    //#region ------------------------- comments -------------------------
     /** Share comments amongst siblings. */
     shareCommentsWithSiblings(): void;
 
@@ -457,368 +555,602 @@
 
     /** Give node `comments` of the specified `type`. */
     addComments(type: string, comments: any[]): void;
+    //#endregion
 
-    // ------------------------- isXXX -------------------------
-    isArrayExpression(opts?: object): this is NodePath<t.ArrayExpression>;
-    isAssignmentExpression(opts?: object): this is NodePath<t.AssignmentExpression>;
-    isBinaryExpression(opts?: object): this is NodePath<t.BinaryExpression>;
-    isDirective(opts?: object): this is NodePath<t.Directive>;
-    isDirectiveLiteral(opts?: object): this is NodePath<t.DirectiveLiteral>;
-    isBlockStatement(opts?: object): this is NodePath<t.BlockStatement>;
-    isBreakStatement(opts?: object): this is NodePath<t.BreakStatement>;
-    isCallExpression(opts?: object): this is NodePath<t.CallExpression>;
-    isCatchClause(opts?: object): this is NodePath<t.CatchClause>;
-    isConditionalExpression(opts?: object): this is NodePath<t.ConditionalExpression>;
-    isContinueStatement(opts?: object): this is NodePath<t.ContinueStatement>;
-    isDebuggerStatement(opts?: object): this is NodePath<t.DebuggerStatement>;
-    isDoWhileStatement(opts?: object): this is NodePath<t.DoWhileStatement>;
-    isEmptyStatement(opts?: object): this is NodePath<t.EmptyStatement>;
-    isExpressionStatement(opts?: object): this is NodePath<t.ExpressionStatement>;
-    isFile(opts?: object): this is NodePath<t.File>;
-    isForInStatement(opts?: object): this is NodePath<t.ForInStatement>;
-    isForStatement(opts?: object): this is NodePath<t.ForStatement>;
-    isFunctionDeclaration(opts?: object): this is NodePath<t.FunctionDeclaration>;
-    isFunctionExpression(opts?: object): this is NodePath<t.FunctionExpression>;
-    isIdentifier(opts?: object): this is NodePath<t.Identifier>;
-    isIfStatement(opts?: object): this is NodePath<t.IfStatement>;
-    isLabeledStatement(opts?: object): this is NodePath<t.LabeledStatement>;
-    isStringLiteral(opts?: object): this is NodePath<t.StringLiteral>;
-    isNumericLiteral(opts?: object): this is NodePath<t.NumericLiteral>;
-    isNullLiteral(opts?: object): this is NodePath<t.NullLiteral>;
-    isBooleanLiteral(opts?: object): this is NodePath<t.BooleanLiteral>;
-    isRegExpLiteral(opts?: object): this is NodePath<t.RegExpLiteral>;
-    isLogicalExpression(opts?: object): this is NodePath<t.LogicalExpression>;
-    isMemberExpression(opts?: object): this is NodePath<t.MemberExpression>;
-    isNewExpression(opts?: object): this is NodePath<t.NewExpression>;
-    isProgram(opts?: object): this is NodePath<t.Program>;
-    isObjectExpression(opts?: object): this is NodePath<t.ObjectExpression>;
-    isObjectMethod(opts?: object): this is NodePath<t.ObjectMethod>;
-    isObjectProperty(opts?: object): this is NodePath<t.ObjectProperty>;
-    isRestElement(opts?: object): this is NodePath<t.RestElement>;
-    isReturnStatement(opts?: object): this is NodePath<t.ReturnStatement>;
-    isSequenceExpression(opts?: object): this is NodePath<t.SequenceExpression>;
-    isSwitchCase(opts?: object): this is NodePath<t.SwitchCase>;
-    isSwitchStatement(opts?: object): this is NodePath<t.SwitchStatement>;
-    isThisExpression(opts?: object): this is NodePath<t.ThisExpression>;
-    isThrowStatement(opts?: object): this is NodePath<t.ThrowStatement>;
-    isTryStatement(opts?: object): this is NodePath<t.TryStatement>;
-    isUnaryExpression(opts?: object): this is NodePath<t.UnaryExpression>;
-    isUpdateExpression(opts?: object): this is NodePath<t.UpdateExpression>;
-    isVariableDeclaration(opts?: object): this is NodePath<t.VariableDeclaration>;
-    isVariableDeclarator(opts?: object): this is NodePath<t.VariableDeclarator>;
-    isWhileStatement(opts?: object): this is NodePath<t.WhileStatement>;
-    isWithStatement(opts?: object): this is NodePath<t.WithStatement>;
-    isAssignmentPattern(opts?: object): this is NodePath<t.AssignmentPattern>;
-    isArrayPattern(opts?: object): this is NodePath<t.ArrayPattern>;
-    isArrowFunctionExpression(opts?: object): this is NodePath<t.ArrowFunctionExpression>;
-    isClassBody(opts?: object): this is NodePath<t.ClassBody>;
-    isClassDeclaration(opts?: object): this is NodePath<t.ClassDeclaration>;
-    isClassExpression(opts?: object): this is NodePath<t.ClassExpression>;
-    isExportAllDeclaration(opts?: object): this is NodePath<t.ExportAllDeclaration>;
-    isExportDefaultDeclaration(opts?: object): this is NodePath<t.ExportDefaultDeclaration>;
-    isExportNamedDeclaration(opts?: object): this is NodePath<t.ExportNamedDeclaration>;
-    isExportSpecifier(opts?: object): this is NodePath<t.ExportSpecifier>;
-    isForOfStatement(opts?: object): this is NodePath<t.ForOfStatement>;
-    isImportDeclaration(opts?: object): this is NodePath<t.ImportDeclaration>;
-    isImportDefaultSpecifier(opts?: object): this is NodePath<t.ImportDefaultSpecifier>;
-    isImportNamespaceSpecifier(opts?: object): this is NodePath<t.ImportNamespaceSpecifier>;
-    isImportSpecifier(opts?: object): this is NodePath<t.ImportSpecifier>;
-    isMetaProperty(opts?: object): this is NodePath<t.MetaProperty>;
-    isClassMethod(opts?: object): this is NodePath<t.ClassMethod>;
-    isObjectPattern(opts?: object): this is NodePath<t.ObjectPattern>;
-    isSpreadElement(opts?: object): this is NodePath<t.SpreadElement>;
-    isSuper(opts?: object): this is NodePath<t.Super>;
-    isTaggedTemplateExpression(opts?: object): this is NodePath<t.TaggedTemplateExpression>;
-    isTemplateElement(opts?: object): this is NodePath<t.TemplateElement>;
-    isTemplateLiteral(opts?: object): this is NodePath<t.TemplateLiteral>;
-    isYieldExpression(opts?: object): this is NodePath<t.YieldExpression>;
-    isAnyTypeAnnotation(opts?: object): this is NodePath<t.AnyTypeAnnotation>;
-    isArrayTypeAnnotation(opts?: object): this is NodePath<t.ArrayTypeAnnotation>;
-    isBooleanTypeAnnotation(opts?: object): this is NodePath<t.BooleanTypeAnnotation>;
-    isBooleanLiteralTypeAnnotation(opts?: object): this is NodePath<t.BooleanLiteralTypeAnnotation>;
-    isNullLiteralTypeAnnotation(opts?: object): this is NodePath<t.NullLiteralTypeAnnotation>;
-    isClassImplements(opts?: object): this is NodePath<t.ClassImplements>;
-    isClassProperty(opts?: object): this is NodePath<t.ClassProperty>;
-    isDeclareClass(opts?: object): this is NodePath<t.DeclareClass>;
-    isDeclareFunction(opts?: object): this is NodePath<t.DeclareFunction>;
-    isDeclareInterface(opts?: object): this is NodePath<t.DeclareInterface>;
-    isDeclareModule(opts?: object): this is NodePath<t.DeclareModule>;
-    isDeclareTypeAlias(opts?: object): this is NodePath<t.DeclareTypeAlias>;
-    isDeclareVariable(opts?: object): this is NodePath<t.DeclareVariable>;
-    isFunctionTypeAnnotation(opts?: object): this is NodePath<t.FunctionTypeAnnotation>;
-    isFunctionTypeParam(opts?: object): this is NodePath<t.FunctionTypeParam>;
-    isGenericTypeAnnotation(opts?: object): this is NodePath<t.GenericTypeAnnotation>;
-    isInterfaceExtends(opts?: object): this is NodePath<t.InterfaceExtends>;
-    isInterfaceDeclaration(opts?: object): this is NodePath<t.InterfaceDeclaration>;
-    isIntersectionTypeAnnotation(opts?: object): this is NodePath<t.IntersectionTypeAnnotation>;
-    isMixedTypeAnnotation(opts?: object): this is NodePath<t.MixedTypeAnnotation>;
-    isNullableTypeAnnotation(opts?: object): this is NodePath<t.NullableTypeAnnotation>;
-    isNumberTypeAnnotation(opts?: object): this is NodePath<t.NumberTypeAnnotation>;
-    isStringLiteralTypeAnnotation(opts?: object): this is NodePath<t.StringLiteralTypeAnnotation>;
-    isStringTypeAnnotation(opts?: object): this is NodePath<t.StringTypeAnnotation>;
-    isThisTypeAnnotation(opts?: object): this is NodePath<t.ThisTypeAnnotation>;
-    isTupleTypeAnnotation(opts?: object): this is NodePath<t.TupleTypeAnnotation>;
-    isTypeofTypeAnnotation(opts?: object): this is NodePath<t.TypeofTypeAnnotation>;
-    isTypeAlias(opts?: object): this is NodePath<t.TypeAlias>;
-    isTypeAnnotation(opts?: object): this is NodePath<t.TypeAnnotation>;
-    isTypeCastExpression(opts?: object): this is NodePath<t.TypeCastExpression>;
-    isTypeParameterDeclaration(opts?: object): this is NodePath<t.TypeParameterDeclaration>;
-    isTypeParameterInstantiation(opts?: object): this is NodePath<t.TypeParameterInstantiation>;
-    isObjectTypeAnnotation(opts?: object): this is NodePath<t.ObjectTypeAnnotation>;
-    isObjectTypeCallProperty(opts?: object): this is NodePath<t.ObjectTypeCallProperty>;
-    isObjectTypeIndexer(opts?: object): this is NodePath<t.ObjectTypeIndexer>;
-    isObjectTypeProperty(opts?: object): this is NodePath<t.ObjectTypeProperty>;
-    isQualifiedTypeIdentifier(opts?: object): this is NodePath<t.QualifiedTypeIdentifier>;
-    isUnionTypeAnnotation(opts?: object): this is NodePath<t.UnionTypeAnnotation>;
-    isVoidTypeAnnotation(opts?: object): this is NodePath<t.VoidTypeAnnotation>;
-    isJSXAttribute(opts?: object): this is NodePath<t.JSXAttribute>;
-    isJSXClosingElement(opts?: object): this is NodePath<t.JSXClosingElement>;
-    isJSXElement(opts?: object): this is NodePath<t.JSXElement>;
-    isJSXEmptyExpression(opts?: object): this is NodePath<t.JSXEmptyExpression>;
-    isJSXExpressionContainer(opts?: object): this is NodePath<t.JSXExpressionContainer>;
-    isJSXIdentifier(opts?: object): this is NodePath<t.JSXIdentifier>;
-    isJSXMemberExpression(opts?: object): this is NodePath<t.JSXMemberExpression>;
-    isJSXNamespacedName(opts?: object): this is NodePath<t.JSXNamespacedName>;
-    isJSXOpeningElement(opts?: object): this is NodePath<t.JSXOpeningElement>;
-    isJSXSpreadAttribute(opts?: object): this is NodePath<t.JSXSpreadAttribute>;
-    isJSXText(opts?: object): this is NodePath<t.JSXText>;
-    isNoop(opts?: object): this is NodePath<t.Noop>;
-    isParenthesizedExpression(opts?: object): this is NodePath<t.ParenthesizedExpression>;
-    isAwaitExpression(opts?: object): this is NodePath<t.AwaitExpression>;
-    isBindExpression(opts?: object): this is NodePath<t.BindExpression>;
-    isDecorator(opts?: object): this is NodePath<t.Decorator>;
-    isDoExpression(opts?: object): this is NodePath<t.DoExpression>;
-    isExportDefaultSpecifier(opts?: object): this is NodePath<t.ExportDefaultSpecifier>;
-    isExportNamespaceSpecifier(opts?: object): this is NodePath<t.ExportNamespaceSpecifier>;
-    isRestProperty(opts?: object): this is NodePath<t.RestProperty>;
-    isSpreadProperty(opts?: object): this is NodePath<t.SpreadProperty>;
-    isExpression(opts?: object): this is NodePath<t.Expression>;
-    isBinary(opts?: object): this is NodePath<t.Binary>;
-    isScopable(opts?: object): this is NodePath<t.Scopable>;
-    isBlockParent(opts?: object): this is NodePath<t.BlockParent>;
-    isBlock(opts?: object): this is NodePath<t.Block>;
-    isStatement(opts?: object): this is NodePath<t.Statement>;
-    isTerminatorless(opts?: object): this is NodePath<t.Terminatorless>;
-    isCompletionStatement(opts?: object): this is NodePath<t.CompletionStatement>;
-    isConditional(opts?: object): this is NodePath<t.Conditional>;
-    isLoop(opts?: object): this is NodePath<t.Loop>;
-    isWhile(opts?: object): this is NodePath<t.While>;
-    isExpressionWrapper(opts?: object): this is NodePath<t.ExpressionWrapper>;
-    isFor(opts?: object): this is NodePath<t.For>;
-    isForXStatement(opts?: object): this is NodePath<t.ForXStatement>;
-    isFunction(opts?: object): this is NodePath<t.Function>;
-    isFunctionParent(opts?: object): this is NodePath<t.FunctionParent>;
-    isPureish(opts?: object): this is NodePath<t.Pureish>;
-    isDeclaration(opts?: object): this is NodePath<t.Declaration>;
-    isLVal(opts?: object): this is NodePath<t.LVal>;
-    isLiteral(opts?: object): this is NodePath<t.Literal>;
-    isImmutable(opts?: object): this is NodePath<t.Immutable>;
-    isUserWhitespacable(opts?: object): this is NodePath<t.UserWhitespacable>;
-    isMethod(opts?: object): this is NodePath<t.Method>;
-    isObjectMember(opts?: object): this is NodePath<t.ObjectMember>;
-    isProperty(opts?: object): this is NodePath<t.Property>;
-    isUnaryLike(opts?: object): this is NodePath<t.UnaryLike>;
-    isPattern(opts?: object): this is NodePath<t.Pattern>;
-    isClass(opts?: object): this is NodePath<t.Class>;
-    isModuleDeclaration(opts?: object): this is NodePath<t.ModuleDeclaration>;
-    isExportDeclaration(opts?: object): this is NodePath<t.ExportDeclaration>;
-    isModuleSpecifier(opts?: object): this is NodePath<t.ModuleSpecifier>;
-    isFlow(opts?: object): this is NodePath<t.Flow>;
-    isFlowBaseAnnotation(opts?: object): this is NodePath<t.FlowBaseAnnotation>;
-    isFlowDeclaration(opts?: object): this is NodePath<t.FlowDeclaration>;
-    isJSX(opts?: object): this is NodePath<t.JSX>;
-    isNumberLiteral(opts?: object): this is NodePath<t.NumericLiteral>;
-    isRegexLiteral(opts?: object): this is NodePath<t.RegExpLiteral>;
-    isReferencedIdentifier(opts?: object): this is NodePath<t.Identifier | t.JSXIdentifier>;
-    isReferencedMemberExpression(opts?: object): this is NodePath<t.MemberExpression>;
-    isBindingIdentifier(opts?: object): this is NodePath<t.Identifier>;
-    isScope(opts?: object): this is NodePath<t.Scopable>;
-    isReferenced(opts?: object): boolean;
-    isBlockScoped(opts?: object): this is NodePath<t.FunctionDeclaration | t.ClassDeclaration | t.VariableDeclaration>;
-    isVar(opts?: object): this is NodePath<t.VariableDeclaration>;
-    isUser(opts?: object): boolean;
-    isGenerated(opts?: object): boolean;
-    isPure(opts?: object): boolean;
+    //#region ------------------------- isXXX -------------------------
+    isAnyTypeAnnotation(props?: object | null): this is NodePath<t.AnyTypeAnnotation>;
+    isArrayExpression(props?: object | null): this is NodePath<t.ArrayExpression>;
+    isArrayPattern(props?: object | null): this is NodePath<t.ArrayPattern>;
+    isArrayTypeAnnotation(props?: object | null): this is NodePath<t.ArrayTypeAnnotation>;
+    isArrowFunctionExpression(props?: object | null): this is NodePath<t.ArrowFunctionExpression>;
+    isAssignmentExpression(props?: object | null): this is NodePath<t.AssignmentExpression>;
+    isAssignmentPattern(props?: object | null): this is NodePath<t.AssignmentPattern>;
+    isAwaitExpression(props?: object | null): this is NodePath<t.AwaitExpression>;
+    isBigIntLiteral(props?: object | null): this is NodePath<t.BigIntLiteral>;
+    isBinary(props?: object | null): this is NodePath<t.Binary>;
+    isBinaryExpression(props?: object | null): this is NodePath<t.BinaryExpression>;
+    isBindExpression(props?: object | null): this is NodePath<t.BindExpression>;
+    isBlock(props?: object | null): this is NodePath<t.Block>;
+    isBlockParent(props?: object | null): this is NodePath<t.BlockParent>;
+    isBlockStatement(props?: object | null): this is NodePath<t.BlockStatement>;
+    isBooleanLiteral(props?: object | null): this is NodePath<t.BooleanLiteral>;
+    isBooleanLiteralTypeAnnotation(props?: object | null): this is NodePath<t.BooleanLiteralTypeAnnotation>;
+    isBooleanTypeAnnotation(props?: object | null): this is NodePath<t.BooleanTypeAnnotation>;
+    isBreakStatement(props?: object | null): this is NodePath<t.BreakStatement>;
+    isCallExpression(props?: object | null): this is NodePath<t.CallExpression>;
+    isCatchClause(props?: object | null): this is NodePath<t.CatchClause>;
+    isClass(props?: object | null): this is NodePath<t.Class>;
+    isClassBody(props?: object | null): this is NodePath<t.ClassBody>;
+    isClassDeclaration(props?: object | null): this is NodePath<t.ClassDeclaration>;
+    isClassExpression(props?: object | null): this is NodePath<t.ClassExpression>;
+    isClassImplements(props?: object | null): this is NodePath<t.ClassImplements>;
+    isClassMethod(props?: object | null): this is NodePath<t.ClassMethod>;
+    isClassPrivateMethod(props?: object | null): this is NodePath<t.ClassPrivateMethod>;
+    isClassPrivateProperty(props?: object | null): this is NodePath<t.ClassPrivateProperty>;
+    isClassProperty(props?: object | null): this is NodePath<t.ClassProperty>;
+    isCompletionStatement(props?: object | null): this is NodePath<t.CompletionStatement>;
+    isConditional(props?: object | null): this is NodePath<t.Conditional>;
+    isConditionalExpression(props?: object | null): this is NodePath<t.ConditionalExpression>;
+    isContinueStatement(props?: object | null): this is NodePath<t.ContinueStatement>;
+    isDebuggerStatement(props?: object | null): this is NodePath<t.DebuggerStatement>;
+    isDeclaration(props?: object | null): this is NodePath<t.Declaration>;
+    isDeclareClass(props?: object | null): this is NodePath<t.DeclareClass>;
+    isDeclareExportAllDeclaration(props?: object | null): this is NodePath<t.DeclareExportAllDeclaration>;
+    isDeclareExportDeclaration(props?: object | null): this is NodePath<t.DeclareExportDeclaration>;
+    isDeclareFunction(props?: object | null): this is NodePath<t.DeclareFunction>;
+    isDeclareInterface(props?: object | null): this is NodePath<t.DeclareInterface>;
+    isDeclareModule(props?: object | null): this is NodePath<t.DeclareModule>;
+    isDeclareModuleExports(props?: object | null): this is NodePath<t.DeclareModuleExports>;
+    isDeclareOpaqueType(props?: object | null): this is NodePath<t.DeclareOpaqueType>;
+    isDeclareTypeAlias(props?: object | null): this is NodePath<t.DeclareTypeAlias>;
+    isDeclareVariable(props?: object | null): this is NodePath<t.DeclareVariable>;
+    isDeclaredPredicate(props?: object | null): this is NodePath<t.DeclaredPredicate>;
+    isDecorator(props?: object | null): this is NodePath<t.Decorator>;
+    isDirective(props?: object | null): this is NodePath<t.Directive>;
+    isDirectiveLiteral(props?: object | null): this is NodePath<t.DirectiveLiteral>;
+    isDoExpression(props?: object | null): this is NodePath<t.DoExpression>;
+    isDoWhileStatement(props?: object | null): this is NodePath<t.DoWhileStatement>;
+    isEmptyStatement(props?: object | null): this is NodePath<t.EmptyStatement>;
+    isEmptyTypeAnnotation(props?: object | null): this is NodePath<t.EmptyTypeAnnotation>;
+    isExistsTypeAnnotation(props?: object | null): this is NodePath<t.ExistsTypeAnnotation>;
+    isExportAllDeclaration(props?: object | null): this is NodePath<t.ExportAllDeclaration>;
+    isExportDeclaration(props?: object | null): this is NodePath<t.ExportDeclaration>;
+    isExportDefaultDeclaration(props?: object | null): this is NodePath<t.ExportDefaultDeclaration>;
+    isExportDefaultSpecifier(props?: object | null): this is NodePath<t.ExportDefaultSpecifier>;
+    isExportNamedDeclaration(props?: object | null): this is NodePath<t.ExportNamedDeclaration>;
+    isExportNamespaceSpecifier(props?: object | null): this is NodePath<t.ExportNamespaceSpecifier>;
+    isExportSpecifier(props?: object | null): this is NodePath<t.ExportSpecifier>;
+    isExpression(props?: object | null): this is NodePath<t.Expression>;
+    isExpressionStatement(props?: object | null): this is NodePath<t.ExpressionStatement>;
+    isExpressionWrapper(props?: object | null): this is NodePath<t.ExpressionWrapper>;
+    isFile(props?: object | null): this is NodePath<t.File>;
+    isFlow(props?: object | null): this is NodePath<t.Flow>;
+    isFlowBaseAnnotation(props?: object | null): this is NodePath<t.FlowBaseAnnotation>;
+    isFlowDeclaration(props?: object | null): this is NodePath<t.FlowDeclaration>;
+    isFlowPredicate(props?: object | null): this is NodePath<t.FlowPredicate>;
+    isFlowType(props?: object | null): this is NodePath<t.FlowType>;
+    isFor(props?: object | null): this is NodePath<t.For>;
+    isForInStatement(props?: object | null): this is NodePath<t.ForInStatement>;
+    isForOfStatement(props?: object | null): this is NodePath<t.ForOfStatement>;
+    isForStatement(props?: object | null): this is NodePath<t.ForStatement>;
+    isForXStatement(props?: object | null): this is NodePath<t.ForXStatement>;
+    isFunction(props?: object | null): this is NodePath<t.Function>;
+    isFunctionDeclaration(props?: object | null): this is NodePath<t.FunctionDeclaration>;
+    isFunctionExpression(props?: object | null): this is NodePath<t.FunctionExpression>;
+    isFunctionParent(props?: object | null): this is NodePath<t.FunctionParent>;
+    isFunctionTypeAnnotation(props?: object | null): this is NodePath<t.FunctionTypeAnnotation>;
+    isFunctionTypeParam(props?: object | null): this is NodePath<t.FunctionTypeParam>;
+    isGenericTypeAnnotation(props?: object | null): this is NodePath<t.GenericTypeAnnotation>;
+    isIdentifier(props?: object | null): this is NodePath<t.Identifier>;
+    isIfStatement(props?: object | null): this is NodePath<t.IfStatement>;
+    isImmutable(props?: object | null): this is NodePath<t.Immutable>;
+    isImport(props?: object | null): this is NodePath<t.Import>;
+    isImportDeclaration(props?: object | null): this is NodePath<t.ImportDeclaration>;
+    isImportDefaultSpecifier(props?: object | null): this is NodePath<t.ImportDefaultSpecifier>;
+    isImportNamespaceSpecifier(props?: object | null): this is NodePath<t.ImportNamespaceSpecifier>;
+    isImportSpecifier(props?: object | null): this is NodePath<t.ImportSpecifier>;
+    isInferredPredicate(props?: object | null): this is NodePath<t.InferredPredicate>;
+    isInterfaceDeclaration(props?: object | null): this is NodePath<t.InterfaceDeclaration>;
+    isInterfaceExtends(props?: object | null): this is NodePath<t.InterfaceExtends>;
+    isInterfaceTypeAnnotation(props?: object | null): this is NodePath<t.InterfaceTypeAnnotation>;
+    isInterpreterDirective(props?: object | null): this is NodePath<t.InterpreterDirective>;
+    isIntersectionTypeAnnotation(props?: object | null): this is NodePath<t.IntersectionTypeAnnotation>;
+    isJSX(props?: object | null): this is NodePath<t.JSX>;
+    isJSXAttribute(props?: object | null): this is NodePath<t.JSXAttribute>;
+    isJSXClosingElement(props?: object | null): this is NodePath<t.JSXClosingElement>;
+    isJSXClosingFragment(props?: object | null): this is NodePath<t.JSXClosingFragment>;
+    isJSXElement(props?: object | null): this is NodePath<t.JSXElement>;
+    isJSXEmptyExpression(props?: object | null): this is NodePath<t.JSXEmptyExpression>;
+    isJSXExpressionContainer(props?: object | null): this is NodePath<t.JSXExpressionContainer>;
+    isJSXFragment(props?: object | null): this is NodePath<t.JSXFragment>;
+    isJSXIdentifier(props?: object | null): this is NodePath<t.JSXIdentifier>;
+    isJSXMemberExpression(props?: object | null): this is NodePath<t.JSXMemberExpression>;
+    isJSXNamespacedName(props?: object | null): this is NodePath<t.JSXNamespacedName>;
+    isJSXOpeningElement(props?: object | null): this is NodePath<t.JSXOpeningElement>;
+    isJSXOpeningFragment(props?: object | null): this is NodePath<t.JSXOpeningFragment>;
+    isJSXSpreadAttribute(props?: object | null): this is NodePath<t.JSXSpreadAttribute>;
+    isJSXSpreadChild(props?: object | null): this is NodePath<t.JSXSpreadChild>;
+    isJSXText(props?: object | null): this is NodePath<t.JSXText>;
+    isLVal(props?: object | null): this is NodePath<t.LVal>;
+    isLabeledStatement(props?: object | null): this is NodePath<t.LabeledStatement>;
+    isLiteral(props?: object | null): this is NodePath<t.Literal>;
+    isLogicalExpression(props?: object | null): this is NodePath<t.LogicalExpression>;
+    isLoop(props?: object | null): this is NodePath<t.Loop>;
+    isMemberExpression(props?: object | null): this is NodePath<t.MemberExpression>;
+    isMetaProperty(props?: object | null): this is NodePath<t.MetaProperty>;
+    isMethod(props?: object | null): this is NodePath<t.Method>;
+    isMixedTypeAnnotation(props?: object | null): this is NodePath<t.MixedTypeAnnotation>;
+    isModuleDeclaration(props?: object | null): this is NodePath<t.ModuleDeclaration>;
+    isModuleSpecifier(props?: object | null): this is NodePath<t.ModuleSpecifier>;
+    isNewExpression(props?: object | null): this is NodePath<t.NewExpression>;
+    isNoop(props?: object | null): this is NodePath<t.Noop>;
+    isNullLiteral(props?: object | null): this is NodePath<t.NullLiteral>;
+    isNullLiteralTypeAnnotation(props?: object | null): this is NodePath<t.NullLiteralTypeAnnotation>;
+    isNullableTypeAnnotation(props?: object | null): this is NodePath<t.NullableTypeAnnotation>;
 
-    // ------------------------- assertXXX -------------------------
-    assertArrayExpression(opts?: object): void;
-    assertAssignmentExpression(opts?: object): void;
-    assertBinaryExpression(opts?: object): void;
-    assertDirective(opts?: object): void;
-    assertDirectiveLiteral(opts?: object): void;
-    assertBlockStatement(opts?: object): void;
-    assertBreakStatement(opts?: object): void;
-    assertCallExpression(opts?: object): void;
-    assertCatchClause(opts?: object): void;
-    assertConditionalExpression(opts?: object): void;
-    assertContinueStatement(opts?: object): void;
-    assertDebuggerStatement(opts?: object): void;
-    assertDoWhileStatement(opts?: object): void;
-    assertEmptyStatement(opts?: object): void;
-    assertExpressionStatement(opts?: object): void;
-    assertFile(opts?: object): void;
-    assertForInStatement(opts?: object): void;
-    assertForStatement(opts?: object): void;
-    assertFunctionDeclaration(opts?: object): void;
-    assertFunctionExpression(opts?: object): void;
-    assertIdentifier(opts?: object): void;
-    assertIfStatement(opts?: object): void;
-    assertLabeledStatement(opts?: object): void;
-    assertStringLiteral(opts?: object): void;
-    assertNumericLiteral(opts?: object): void;
-    assertNullLiteral(opts?: object): void;
-    assertBooleanLiteral(opts?: object): void;
-    assertRegExpLiteral(opts?: object): void;
-    assertLogicalExpression(opts?: object): void;
-    assertMemberExpression(opts?: object): void;
-    assertNewExpression(opts?: object): void;
-    assertProgram(opts?: object): void;
-    assertObjectExpression(opts?: object): void;
-    assertObjectMethod(opts?: object): void;
-    assertObjectProperty(opts?: object): void;
-    assertRestElement(opts?: object): void;
-    assertReturnStatement(opts?: object): void;
-    assertSequenceExpression(opts?: object): void;
-    assertSwitchCase(opts?: object): void;
-    assertSwitchStatement(opts?: object): void;
-    assertThisExpression(opts?: object): void;
-    assertThrowStatement(opts?: object): void;
-    assertTryStatement(opts?: object): void;
-    assertUnaryExpression(opts?: object): void;
-    assertUpdateExpression(opts?: object): void;
-    assertVariableDeclaration(opts?: object): void;
-    assertVariableDeclarator(opts?: object): void;
-    assertWhileStatement(opts?: object): void;
-    assertWithStatement(opts?: object): void;
-    assertAssignmentPattern(opts?: object): void;
-    assertArrayPattern(opts?: object): void;
-    assertArrowFunctionExpression(opts?: object): void;
-    assertClassBody(opts?: object): void;
-    assertClassDeclaration(opts?: object): void;
-    assertClassExpression(opts?: object): void;
-    assertExportAllDeclaration(opts?: object): void;
-    assertExportDefaultDeclaration(opts?: object): void;
-    assertExportNamedDeclaration(opts?: object): void;
-    assertExportSpecifier(opts?: object): void;
-    assertForOfStatement(opts?: object): void;
-    assertImportDeclaration(opts?: object): void;
-    assertImportDefaultSpecifier(opts?: object): void;
-    assertImportNamespaceSpecifier(opts?: object): void;
-    assertImportSpecifier(opts?: object): void;
-    assertMetaProperty(opts?: object): void;
-    assertClassMethod(opts?: object): void;
-    assertObjectPattern(opts?: object): void;
-    assertSpreadElement(opts?: object): void;
-    assertSuper(opts?: object): void;
-    assertTaggedTemplateExpression(opts?: object): void;
-    assertTemplateElement(opts?: object): void;
-    assertTemplateLiteral(opts?: object): void;
-    assertYieldExpression(opts?: object): void;
-    assertAnyTypeAnnotation(opts?: object): void;
-    assertArrayTypeAnnotation(opts?: object): void;
-    assertBooleanTypeAnnotation(opts?: object): void;
-    assertBooleanLiteralTypeAnnotation(opts?: object): void;
-    assertNullLiteralTypeAnnotation(opts?: object): void;
-    assertClassImplements(opts?: object): void;
-    assertClassProperty(opts?: object): void;
-    assertDeclareClass(opts?: object): void;
-    assertDeclareFunction(opts?: object): void;
-    assertDeclareInterface(opts?: object): void;
-    assertDeclareModule(opts?: object): void;
-    assertDeclareTypeAlias(opts?: object): void;
-    assertDeclareVariable(opts?: object): void;
-    assertExistentialTypeParam(opts?: object): void;
-    assertFunctionTypeAnnotation(opts?: object): void;
-    assertFunctionTypeParam(opts?: object): void;
-    assertGenericTypeAnnotation(opts?: object): void;
-    assertInterfaceExtends(opts?: object): void;
-    assertInterfaceDeclaration(opts?: object): void;
-    assertIntersectionTypeAnnotation(opts?: object): void;
-    assertMixedTypeAnnotation(opts?: object): void;
-    assertNullableTypeAnnotation(opts?: object): void;
-    assertNumericLiteralTypeAnnotation(opts?: object): void;
-    assertNumberTypeAnnotation(opts?: object): void;
-    assertStringLiteralTypeAnnotation(opts?: object): void;
-    assertStringTypeAnnotation(opts?: object): void;
-    assertThisTypeAnnotation(opts?: object): void;
-    assertTupleTypeAnnotation(opts?: object): void;
-    assertTypeofTypeAnnotation(opts?: object): void;
-    assertTypeAlias(opts?: object): void;
-    assertTypeAnnotation(opts?: object): void;
-    assertTypeCastExpression(opts?: object): void;
-    assertTypeParameterDeclaration(opts?: object): void;
-    assertTypeParameterInstantiation(opts?: object): void;
-    assertObjectTypeAnnotation(opts?: object): void;
-    assertObjectTypeCallProperty(opts?: object): void;
-    assertObjectTypeIndexer(opts?: object): void;
-    assertObjectTypeProperty(opts?: object): void;
-    assertQualifiedTypeIdentifier(opts?: object): void;
-    assertUnionTypeAnnotation(opts?: object): void;
-    assertVoidTypeAnnotation(opts?: object): void;
-    assertJSXAttribute(opts?: object): void;
-    assertJSXClosingElement(opts?: object): void;
-    assertJSXElement(opts?: object): void;
-    assertJSXEmptyExpression(opts?: object): void;
-    assertJSXExpressionContainer(opts?: object): void;
-    assertJSXIdentifier(opts?: object): void;
-    assertJSXMemberExpression(opts?: object): void;
-    assertJSXNamespacedName(opts?: object): void;
-    assertJSXOpeningElement(opts?: object): void;
-    assertJSXSpreadAttribute(opts?: object): void;
-    assertJSXText(opts?: object): void;
-    assertNoop(opts?: object): void;
-    assertParenthesizedExpression(opts?: object): void;
-    assertAwaitExpression(opts?: object): void;
-    assertBindExpression(opts?: object): void;
-    assertDecorator(opts?: object): void;
-    assertDoExpression(opts?: object): void;
-    assertExportDefaultSpecifier(opts?: object): void;
-    assertExportNamespaceSpecifier(opts?: object): void;
-    assertRestProperty(opts?: object): void;
-    assertSpreadProperty(opts?: object): void;
-    assertExpression(opts?: object): void;
-    assertBinary(opts?: object): void;
-    assertScopable(opts?: object): void;
-    assertBlockParent(opts?: object): void;
-    assertBlock(opts?: object): void;
-    assertStatement(opts?: object): void;
-    assertTerminatorless(opts?: object): void;
-    assertCompletionStatement(opts?: object): void;
-    assertConditional(opts?: object): void;
-    assertLoop(opts?: object): void;
-    assertWhile(opts?: object): void;
-    assertExpressionWrapper(opts?: object): void;
-    assertFor(opts?: object): void;
-    assertForXStatement(opts?: object): void;
-    assertFunction(opts?: object): void;
-    assertFunctionParent(opts?: object): void;
-    assertPureish(opts?: object): void;
-    assertDeclaration(opts?: object): void;
-    assertLVal(opts?: object): void;
-    assertLiteral(opts?: object): void;
-    assertImmutable(opts?: object): void;
-    assertUserWhitespacable(opts?: object): void;
-    assertMethod(opts?: object): void;
-    assertObjectMember(opts?: object): void;
-    assertProperty(opts?: object): void;
-    assertUnaryLike(opts?: object): void;
-    assertPattern(opts?: object): void;
-    assertClass(opts?: object): void;
-    assertModuleDeclaration(opts?: object): void;
-    assertExportDeclaration(opts?: object): void;
-    assertModuleSpecifier(opts?: object): void;
-    assertFlow(opts?: object): void;
-    assertFlowBaseAnnotation(opts?: object): void;
-    assertFlowDeclaration(opts?: object): void;
-    assertJSX(opts?: object): void;
-    assertNumberLiteral(opts?: object): void;
-    assertRegexLiteral(opts?: object): void;
+    /** @deprecated Use `isNumericLiteral` */
+    isNumberLiteral(props?: object | null): this is NodePath<t.NumericLiteral>;
+    isNumberLiteralTypeAnnotation(props?: object | null): this is NodePath<t.NumberLiteralTypeAnnotation>;
+    isNumberTypeAnnotation(props?: object | null): this is NodePath<t.NumberTypeAnnotation>;
+    isNumericLiteral(props?: object | null): this is NodePath<t.NumericLiteral>;
+    isObjectExpression(props?: object | null): this is NodePath<t.ObjectExpression>;
+    isObjectMember(props?: object | null): this is NodePath<t.ObjectMember>;
+    isObjectMethod(props?: object | null): this is NodePath<t.ObjectMethod>;
+    isObjectPattern(props?: object | null): this is NodePath<t.ObjectPattern>;
+    isObjectProperty(props?: object | null): this is NodePath<t.ObjectProperty>;
+    isObjectTypeAnnotation(props?: object | null): this is NodePath<t.ObjectTypeAnnotation>;
+    isObjectTypeCallProperty(props?: object | null): this is NodePath<t.ObjectTypeCallProperty>;
+    isObjectTypeIndexer(props?: object | null): this is NodePath<t.ObjectTypeIndexer>;
+    isObjectTypeInternalSlot(props?: object | null): this is NodePath<t.ObjectTypeInternalSlot>;
+    isObjectTypeProperty(props?: object | null): this is NodePath<t.ObjectTypeProperty>;
+    isObjectTypeSpreadProperty(props?: object | null): this is NodePath<t.ObjectTypeSpreadProperty>;
+    isOpaqueType(props?: object | null): this is NodePath<t.OpaqueType>;
+    isOptionalCallExpression(props?: object | null): this is NodePath<t.OptionalCallExpression>;
+    isOptionalMemberExpression(props?: object | null): this is NodePath<t.OptionalMemberExpression>;
+    isParenthesizedExpression(props?: object | null): this is NodePath<t.ParenthesizedExpression>;
+    isPattern(props?: object | null): this is NodePath<t.Pattern>;
+    isPatternLike(props?: object | null): this is NodePath<t.PatternLike>;
+    isPipelineBareFunction(props?: object | null): this is NodePath<t.PipelineBareFunction>;
+    isPipelinePrimaryTopicReference(props?: object | null): this is NodePath<t.PipelinePrimaryTopicReference>;
+    isPipelineTopicExpression(props?: object | null): this is NodePath<t.PipelineTopicExpression>;
+    isPrivate(props?: object | null): this is NodePath<t.Private>;
+    isPrivateName(props?: object | null): this is NodePath<t.PrivateName>;
+    isProgram(props?: object | null): this is NodePath<t.Program>;
+    isProperty(props?: object | null): this is NodePath<t.Property>;
+    isPureish(props?: object | null): this is NodePath<t.Pureish>;
+    isQualifiedTypeIdentifier(props?: object | null): this is NodePath<t.QualifiedTypeIdentifier>;
+    isRegExpLiteral(props?: object | null): this is NodePath<t.RegExpLiteral>;
+
+    /** @deprecated Use `isRegExpLiteral` */
+    isRegexLiteral(props?: object | null): this is NodePath<t.RegExpLiteral>;
+    isRestElement(props?: object | null): this is NodePath<t.RestElement>;
+
+    /** @deprecated Use `isRestElement` */
+    isRestProperty(props?: object | null): this is NodePath<t.RestElement>;
+    isReturnStatement(props?: object | null): this is NodePath<t.ReturnStatement>;
+    isScopable(props?: object | null): this is NodePath<t.Scopable>;
+    isSequenceExpression(props?: object | null): this is NodePath<t.SequenceExpression>;
+    isSpreadElement(props?: object | null): this is NodePath<t.SpreadElement>;
+
+    /** @deprecated Use `isSpreadElement` */
+    isSpreadProperty(props?: object | null): this is NodePath<t.SpreadElement>;
+    isStatement(props?: object | null): this is NodePath<t.Statement>;
+    isStringLiteral(props?: object | null): this is NodePath<t.StringLiteral>;
+    isStringLiteralTypeAnnotation(props?: object | null): this is NodePath<t.StringLiteralTypeAnnotation>;
+    isStringTypeAnnotation(props?: object | null): this is NodePath<t.StringTypeAnnotation>;
+    isSuper(props?: object | null): this is NodePath<t.Super>;
+    isSwitchCase(props?: object | null): this is NodePath<t.SwitchCase>;
+    isSwitchStatement(props?: object | null): this is NodePath<t.SwitchStatement>;
+    isTSAnyKeyword(props?: object | null): this is NodePath<t.TSAnyKeyword>;
+    isTSArrayType(props?: object | null): this is NodePath<t.TSArrayType>;
+    isTSAsExpression(props?: object | null): this is NodePath<t.TSAsExpression>;
+    isTSBooleanKeyword(props?: object | null): this is NodePath<t.TSBooleanKeyword>;
+    isTSCallSignatureDeclaration(props?: object | null): this is NodePath<t.TSCallSignatureDeclaration>;
+    isTSConditionalType(props?: object | null): this is NodePath<t.TSConditionalType>;
+    isTSConstructSignatureDeclaration(props?: object | null): this is NodePath<t.TSConstructSignatureDeclaration>;
+    isTSConstructorType(props?: object | null): this is NodePath<t.TSConstructorType>;
+    isTSDeclareFunction(props?: object | null): this is NodePath<t.TSDeclareFunction>;
+    isTSDeclareMethod(props?: object | null): this is NodePath<t.TSDeclareMethod>;
+    isTSEntityName(props?: object | null): this is NodePath<t.TSEntityName>;
+    isTSEnumDeclaration(props?: object | null): this is NodePath<t.TSEnumDeclaration>;
+    isTSEnumMember(props?: object | null): this is NodePath<t.TSEnumMember>;
+    isTSExportAssignment(props?: object | null): this is NodePath<t.TSExportAssignment>;
+    isTSExpressionWithTypeArguments(props?: object | null): this is NodePath<t.TSExpressionWithTypeArguments>;
+    isTSExternalModuleReference(props?: object | null): this is NodePath<t.TSExternalModuleReference>;
+    isTSFunctionType(props?: object | null): this is NodePath<t.TSFunctionType>;
+    isTSImportEqualsDeclaration(props?: object | null): this is NodePath<t.TSImportEqualsDeclaration>;
+    isTSImportType(props?: object | null): this is NodePath<t.TSImportType>;
+    isTSIndexSignature(props?: object | null): this is NodePath<t.TSIndexSignature>;
+    isTSIndexedAccessType(props?: object | null): this is NodePath<t.TSIndexedAccessType>;
+    isTSInferType(props?: object | null): this is NodePath<t.TSInferType>;
+    isTSInterfaceBody(props?: object | null): this is NodePath<t.TSInterfaceBody>;
+    isTSInterfaceDeclaration(props?: object | null): this is NodePath<t.TSInterfaceDeclaration>;
+    isTSIntersectionType(props?: object | null): this is NodePath<t.TSIntersectionType>;
+    isTSLiteralType(props?: object | null): this is NodePath<t.TSLiteralType>;
+    isTSMappedType(props?: object | null): this is NodePath<t.TSMappedType>;
+    isTSMethodSignature(props?: object | null): this is NodePath<t.TSMethodSignature>;
+    isTSModuleBlock(props?: object | null): this is NodePath<t.TSModuleBlock>;
+    isTSModuleDeclaration(props?: object | null): this is NodePath<t.TSModuleDeclaration>;
+    isTSNamespaceExportDeclaration(props?: object | null): this is NodePath<t.TSNamespaceExportDeclaration>;
+    isTSNeverKeyword(props?: object | null): this is NodePath<t.TSNeverKeyword>;
+    isTSNonNullExpression(props?: object | null): this is NodePath<t.TSNonNullExpression>;
+    isTSNullKeyword(props?: object | null): this is NodePath<t.TSNullKeyword>;
+    isTSNumberKeyword(props?: object | null): this is NodePath<t.TSNumberKeyword>;
+    isTSObjectKeyword(props?: object | null): this is NodePath<t.TSObjectKeyword>;
+    isTSOptionalType(props?: object | null): this is NodePath<t.TSOptionalType>;
+    isTSParameterProperty(props?: object | null): this is NodePath<t.TSParameterProperty>;
+    isTSParenthesizedType(props?: object | null): this is NodePath<t.TSParenthesizedType>;
+    isTSPropertySignature(props?: object | null): this is NodePath<t.TSPropertySignature>;
+    isTSQualifiedName(props?: object | null): this is NodePath<t.TSQualifiedName>;
+    isTSRestType(props?: object | null): this is NodePath<t.TSRestType>;
+    isTSStringKeyword(props?: object | null): this is NodePath<t.TSStringKeyword>;
+    isTSSymbolKeyword(props?: object | null): this is NodePath<t.TSSymbolKeyword>;
+    isTSThisType(props?: object | null): this is NodePath<t.TSThisType>;
+    isTSTupleType(props?: object | null): this is NodePath<t.TSTupleType>;
+    isTSType(props?: object | null): this is NodePath<t.TSType>;
+    isTSTypeAliasDeclaration(props?: object | null): this is NodePath<t.TSTypeAliasDeclaration>;
+    isTSTypeAnnotation(props?: object | null): this is NodePath<t.TSTypeAnnotation>;
+    isTSTypeAssertion(props?: object | null): this is NodePath<t.TSTypeAssertion>;
+    isTSTypeElement(props?: object | null): this is NodePath<t.TSTypeElement>;
+    isTSTypeLiteral(props?: object | null): this is NodePath<t.TSTypeLiteral>;
+    isTSTypeOperator(props?: object | null): this is NodePath<t.TSTypeOperator>;
+    isTSTypeParameter(props?: object | null): this is NodePath<t.TSTypeParameter>;
+    isTSTypeParameterDeclaration(props?: object | null): this is NodePath<t.TSTypeParameterDeclaration>;
+    isTSTypeParameterInstantiation(props?: object | null): this is NodePath<t.TSTypeParameterInstantiation>;
+    isTSTypePredicate(props?: object | null): this is NodePath<t.TSTypePredicate>;
+    isTSTypeQuery(props?: object | null): this is NodePath<t.TSTypeQuery>;
+    isTSTypeReference(props?: object | null): this is NodePath<t.TSTypeReference>;
+    isTSUndefinedKeyword(props?: object | null): this is NodePath<t.TSUndefinedKeyword>;
+    isTSUnionType(props?: object | null): this is NodePath<t.TSUnionType>;
+    isTSUnknownKeyword(props?: object | null): this is NodePath<t.TSUnknownKeyword>;
+    isTSVoidKeyword(props?: object | null): this is NodePath<t.TSVoidKeyword>;
+    isTaggedTemplateExpression(props?: object | null): this is NodePath<t.TaggedTemplateExpression>;
+    isTemplateElement(props?: object | null): this is NodePath<t.TemplateElement>;
+    isTemplateLiteral(props?: object | null): this is NodePath<t.TemplateLiteral>;
+    isTerminatorless(props?: object | null): this is NodePath<t.Terminatorless>;
+    isThisExpression(props?: object | null): this is NodePath<t.ThisExpression>;
+    isThisTypeAnnotation(props?: object | null): this is NodePath<t.ThisTypeAnnotation>;
+    isThrowStatement(props?: object | null): this is NodePath<t.ThrowStatement>;
+    isTryStatement(props?: object | null): this is NodePath<t.TryStatement>;
+    isTupleTypeAnnotation(props?: object | null): this is NodePath<t.TupleTypeAnnotation>;
+    isTypeAlias(props?: object | null): this is NodePath<t.TypeAlias>;
+    isTypeAnnotation(props?: object | null): this is NodePath<t.TypeAnnotation>;
+    isTypeCastExpression(props?: object | null): this is NodePath<t.TypeCastExpression>;
+    isTypeParameter(props?: object | null): this is NodePath<t.TypeParameter>;
+    isTypeParameterDeclaration(props?: object | null): this is NodePath<t.TypeParameterDeclaration>;
+    isTypeParameterInstantiation(props?: object | null): this is NodePath<t.TypeParameterInstantiation>;
+    isTypeofTypeAnnotation(props?: object | null): this is NodePath<t.TypeofTypeAnnotation>;
+    isUnaryExpression(props?: object | null): this is NodePath<t.UnaryExpression>;
+    isUnaryLike(props?: object | null): this is NodePath<t.UnaryLike>;
+    isUnionTypeAnnotation(props?: object | null): this is NodePath<t.UnionTypeAnnotation>;
+    isUpdateExpression(props?: object | null): this is NodePath<t.UpdateExpression>;
+    isUserWhitespacable(props?: object | null): this is NodePath<t.UserWhitespacable>;
+    isVariableDeclaration(props?: object | null): this is NodePath<t.VariableDeclaration>;
+    isVariableDeclarator(props?: object | null): this is NodePath<t.VariableDeclarator>;
+    isVariance(props?: object | null): this is NodePath<t.Variance>;
+    isVoidTypeAnnotation(props?: object | null): this is NodePath<t.VoidTypeAnnotation>;
+    isWhile(props?: object | null): this is NodePath<t.While>;
+    isWhileStatement(props?: object | null): this is NodePath<t.WhileStatement>;
+    isWithStatement(props?: object | null): this is NodePath<t.WithStatement>;
+    isYieldExpression(props?: object | null): this is NodePath<t.YieldExpression>;
+
+    isBindingIdentifier(props?: object | null): this is NodePath<t.Identifier>;
+    isBlockScoped(
+        props?: object | null,
+    ): this is NodePath<t.FunctionDeclaration | t.ClassDeclaration | t.VariableDeclaration>;
+    isGenerated(props?: object | null): boolean;
+    isPure(props?: object | null): boolean;
+    isReferenced(props?: object | null): boolean;
+    isReferencedIdentifier(props?: object | null): this is NodePath<t.Identifier | t.JSXIdentifier>;
+    isReferencedMemberExpression(props?: object | null): this is NodePath<t.MemberExpression>;
+    isScope(props?: object | null): this is NodePath<t.Scopable>;
+    isUser(props?: object | null): boolean;
+    isVar(props?: object | null): this is NodePath<t.VariableDeclaration>;
+    //#endregion
+
+    //#region ------------------------- assertXXX -------------------------
+    assertAnyTypeAnnotation(props?: object | null): void;
+    assertArrayExpression(props?: object | null): void;
+    assertArrayPattern(props?: object | null): void;
+    assertArrayTypeAnnotation(props?: object | null): void;
+    assertArrowFunctionExpression(props?: object | null): void;
+    assertAssignmentExpression(props?: object | null): void;
+    assertAssignmentPattern(props?: object | null): void;
+    assertAwaitExpression(props?: object | null): void;
+    assertBigIntLiteral(props?: object | null): void;
+    assertBinary(props?: object | null): void;
+    assertBinaryExpression(props?: object | null): void;
+    assertBindExpression(props?: object | null): void;
+    assertBlock(props?: object | null): void;
+    assertBlockParent(props?: object | null): void;
+    assertBlockStatement(props?: object | null): void;
+    assertBooleanLiteral(props?: object | null): void;
+    assertBooleanLiteralTypeAnnotation(props?: object | null): void;
+    assertBooleanTypeAnnotation(props?: object | null): void;
+    assertBreakStatement(props?: object | null): void;
+    assertCallExpression(props?: object | null): void;
+    assertCatchClause(props?: object | null): void;
+    assertClass(props?: object | null): void;
+    assertClassBody(props?: object | null): void;
+    assertClassDeclaration(props?: object | null): void;
+    assertClassExpression(props?: object | null): void;
+    assertClassImplements(props?: object | null): void;
+    assertClassMethod(props?: object | null): void;
+    assertClassPrivateMethod(props?: object | null): void;
+    assertClassPrivateProperty(props?: object | null): void;
+    assertClassProperty(props?: object | null): void;
+    assertCompletionStatement(props?: object | null): void;
+    assertConditional(props?: object | null): void;
+    assertConditionalExpression(props?: object | null): void;
+    assertContinueStatement(props?: object | null): void;
+    assertDebuggerStatement(props?: object | null): void;
+    assertDeclaration(props?: object | null): void;
+    assertDeclareClass(props?: object | null): void;
+    assertDeclareExportAllDeclaration(props?: object | null): void;
+    assertDeclareExportDeclaration(props?: object | null): void;
+    assertDeclareFunction(props?: object | null): void;
+    assertDeclareInterface(props?: object | null): void;
+    assertDeclareModule(props?: object | null): void;
+    assertDeclareModuleExports(props?: object | null): void;
+    assertDeclareOpaqueType(props?: object | null): void;
+    assertDeclareTypeAlias(props?: object | null): void;
+    assertDeclareVariable(props?: object | null): void;
+    assertDeclaredPredicate(props?: object | null): void;
+    assertDecorator(props?: object | null): void;
+    assertDirective(props?: object | null): void;
+    assertDirectiveLiteral(props?: object | null): void;
+    assertDoExpression(props?: object | null): void;
+    assertDoWhileStatement(props?: object | null): void;
+    assertEmptyStatement(props?: object | null): void;
+    assertEmptyTypeAnnotation(props?: object | null): void;
+    assertExistsTypeAnnotation(props?: object | null): void;
+    assertExportAllDeclaration(props?: object | null): void;
+    assertExportDeclaration(props?: object | null): void;
+    assertExportDefaultDeclaration(props?: object | null): void;
+    assertExportDefaultSpecifier(props?: object | null): void;
+    assertExportNamedDeclaration(props?: object | null): void;
+    assertExportNamespaceSpecifier(props?: object | null): void;
+    assertExportSpecifier(props?: object | null): void;
+    assertExpression(props?: object | null): void;
+    assertExpressionStatement(props?: object | null): void;
+    assertExpressionWrapper(props?: object | null): void;
+    assertFile(props?: object | null): void;
+    assertFlow(props?: object | null): void;
+    assertFlowBaseAnnotation(props?: object | null): void;
+    assertFlowDeclaration(props?: object | null): void;
+    assertFlowPredicate(props?: object | null): void;
+    assertFlowType(props?: object | null): void;
+    assertFor(props?: object | null): void;
+    assertForInStatement(props?: object | null): void;
+    assertForOfStatement(props?: object | null): void;
+    assertForStatement(props?: object | null): void;
+    assertForXStatement(props?: object | null): void;
+    assertFunction(props?: object | null): void;
+    assertFunctionDeclaration(props?: object | null): void;
+    assertFunctionExpression(props?: object | null): void;
+    assertFunctionParent(props?: object | null): void;
+    assertFunctionTypeAnnotation(props?: object | null): void;
+    assertFunctionTypeParam(props?: object | null): void;
+    assertGenericTypeAnnotation(props?: object | null): void;
+    assertIdentifier(props?: object | null): void;
+    assertIfStatement(props?: object | null): void;
+    assertImmutable(props?: object | null): void;
+    assertImport(props?: object | null): void;
+    assertImportDeclaration(props?: object | null): void;
+    assertImportDefaultSpecifier(props?: object | null): void;
+    assertImportNamespaceSpecifier(props?: object | null): void;
+    assertImportSpecifier(props?: object | null): void;
+    assertInferredPredicate(props?: object | null): void;
+    assertInterfaceDeclaration(props?: object | null): void;
+    assertInterfaceExtends(props?: object | null): void;
+    assertInterfaceTypeAnnotation(props?: object | null): void;
+    assertInterpreterDirective(props?: object | null): void;
+    assertIntersectionTypeAnnotation(props?: object | null): void;
+    assertJSX(props?: object | null): void;
+    assertJSXAttribute(props?: object | null): void;
+    assertJSXClosingElement(props?: object | null): void;
+    assertJSXClosingFragment(props?: object | null): void;
+    assertJSXElement(props?: object | null): void;
+    assertJSXEmptyExpression(props?: object | null): void;
+    assertJSXExpressionContainer(props?: object | null): void;
+    assertJSXFragment(props?: object | null): void;
+    assertJSXIdentifier(props?: object | null): void;
+    assertJSXMemberExpression(props?: object | null): void;
+    assertJSXNamespacedName(props?: object | null): void;
+    assertJSXOpeningElement(props?: object | null): void;
+    assertJSXOpeningFragment(props?: object | null): void;
+    assertJSXSpreadAttribute(props?: object | null): void;
+    assertJSXSpreadChild(props?: object | null): void;
+    assertJSXText(props?: object | null): void;
+    assertLVal(props?: object | null): void;
+    assertLabeledStatement(props?: object | null): void;
+    assertLiteral(props?: object | null): void;
+    assertLogicalExpression(props?: object | null): void;
+    assertLoop(props?: object | null): void;
+    assertMemberExpression(props?: object | null): void;
+    assertMetaProperty(props?: object | null): void;
+    assertMethod(props?: object | null): void;
+    assertMixedTypeAnnotation(props?: object | null): void;
+    assertModuleDeclaration(props?: object | null): void;
+    assertModuleSpecifier(props?: object | null): void;
+    assertNewExpression(props?: object | null): void;
+    assertNoop(props?: object | null): void;
+    assertNullLiteral(props?: object | null): void;
+    assertNullLiteralTypeAnnotation(props?: object | null): void;
+    assertNullableTypeAnnotation(props?: object | null): void;
+
+    /** @deprecated Use `assertNumericLiteral` */
+    assertNumberLiteral(props?: object | null): void;
+    assertNumberLiteralTypeAnnotation(props?: object | null): void;
+    assertNumberTypeAnnotation(props?: object | null): void;
+    assertNumericLiteral(props?: object | null): void;
+    assertObjectExpression(props?: object | null): void;
+    assertObjectMember(props?: object | null): void;
+    assertObjectMethod(props?: object | null): void;
+    assertObjectPattern(props?: object | null): void;
+    assertObjectProperty(props?: object | null): void;
+    assertObjectTypeAnnotation(props?: object | null): void;
+    assertObjectTypeCallProperty(props?: object | null): void;
+    assertObjectTypeIndexer(props?: object | null): void;
+    assertObjectTypeInternalSlot(props?: object | null): void;
+    assertObjectTypeProperty(props?: object | null): void;
+    assertObjectTypeSpreadProperty(props?: object | null): void;
+    assertOpaqueType(props?: object | null): void;
+    assertOptionalCallExpression(props?: object | null): void;
+    assertOptionalMemberExpression(props?: object | null): void;
+    assertParenthesizedExpression(props?: object | null): void;
+    assertPattern(props?: object | null): void;
+    assertPatternLike(props?: object | null): void;
+    assertPipelineBareFunction(props?: object | null): void;
+    assertPipelinePrimaryTopicReference(props?: object | null): void;
+    assertPipelineTopicExpression(props?: object | null): void;
+    assertPrivate(props?: object | null): void;
+    assertPrivateName(props?: object | null): void;
+    assertProgram(props?: object | null): void;
+    assertProperty(props?: object | null): void;
+    assertPureish(props?: object | null): void;
+    assertQualifiedTypeIdentifier(props?: object | null): void;
+    assertRegExpLiteral(props?: object | null): void;
+
+    /** @deprecated Use `assertRegExpLiteral` */
+    assertRegexLiteral(props?: object | null): void;
+    assertRestElement(props?: object | null): void;
+
+    /** @deprecated Use `assertRestElement` */
+    assertRestProperty(props?: object | null): void;
+    assertReturnStatement(props?: object | null): void;
+    assertScopable(props?: object | null): void;
+    assertSequenceExpression(props?: object | null): void;
+    assertSpreadElement(props?: object | null): void;
+
+    /** @deprecated Use `assertSpreadElement` */
+    assertSpreadProperty(props?: object | null): void;
+    assertStatement(props?: object | null): void;
+    assertStringLiteral(props?: object | null): void;
+    assertStringLiteralTypeAnnotation(props?: object | null): void;
+    assertStringTypeAnnotation(props?: object | null): void;
+    assertSuper(props?: object | null): void;
+    assertSwitchCase(props?: object | null): void;
+    assertSwitchStatement(props?: object | null): void;
+    assertTSAnyKeyword(props?: object | null): void;
+    assertTSArrayType(props?: object | null): void;
+    assertTSAsExpression(props?: object | null): void;
+    assertTSBooleanKeyword(props?: object | null): void;
+    assertTSCallSignatureDeclaration(props?: object | null): void;
+    assertTSConditionalType(props?: object | null): void;
+    assertTSConstructSignatureDeclaration(props?: object | null): void;
+    assertTSConstructorType(props?: object | null): void;
+    assertTSDeclareFunction(props?: object | null): void;
+    assertTSDeclareMethod(props?: object | null): void;
+    assertTSEntityName(props?: object | null): void;
+    assertTSEnumDeclaration(props?: object | null): void;
+    assertTSEnumMember(props?: object | null): void;
+    assertTSExportAssignment(props?: object | null): void;
+    assertTSExpressionWithTypeArguments(props?: object | null): void;
+    assertTSExternalModuleReference(props?: object | null): void;
+    assertTSFunctionType(props?: object | null): void;
+    assertTSImportEqualsDeclaration(props?: object | null): void;
+    assertTSImportType(props?: object | null): void;
+    assertTSIndexSignature(props?: object | null): void;
+    assertTSIndexedAccessType(props?: object | null): void;
+    assertTSInferType(props?: object | null): void;
+    assertTSInterfaceBody(props?: object | null): void;
+    assertTSInterfaceDeclaration(props?: object | null): void;
+    assertTSIntersectionType(props?: object | null): void;
+    assertTSLiteralType(props?: object | null): void;
+    assertTSMappedType(props?: object | null): void;
+    assertTSMethodSignature(props?: object | null): void;
+    assertTSModuleBlock(props?: object | null): void;
+    assertTSModuleDeclaration(props?: object | null): void;
+    assertTSNamespaceExportDeclaration(props?: object | null): void;
+    assertTSNeverKeyword(props?: object | null): void;
+    assertTSNonNullExpression(props?: object | null): void;
+    assertTSNullKeyword(props?: object | null): void;
+    assertTSNumberKeyword(props?: object | null): void;
+    assertTSObjectKeyword(props?: object | null): void;
+    assertTSOptionalType(props?: object | null): void;
+    assertTSParameterProperty(props?: object | null): void;
+    assertTSParenthesizedType(props?: object | null): void;
+    assertTSPropertySignature(props?: object | null): void;
+    assertTSQualifiedName(props?: object | null): void;
+    assertTSRestType(props?: object | null): void;
+    assertTSStringKeyword(props?: object | null): void;
+    assertTSSymbolKeyword(props?: object | null): void;
+    assertTSThisType(props?: object | null): void;
+    assertTSTupleType(props?: object | null): void;
+    assertTSType(props?: object | null): void;
+    assertTSTypeAliasDeclaration(props?: object | null): void;
+    assertTSTypeAnnotation(props?: object | null): void;
+    assertTSTypeAssertion(props?: object | null): void;
+    assertTSTypeElement(props?: object | null): void;
+    assertTSTypeLiteral(props?: object | null): void;
+    assertTSTypeOperator(props?: object | null): void;
+    assertTSTypeParameter(props?: object | null): void;
+    assertTSTypeParameterDeclaration(props?: object | null): void;
+    assertTSTypeParameterInstantiation(props?: object | null): void;
+    assertTSTypePredicate(props?: object | null): void;
+    assertTSTypeQuery(props?: object | null): void;
+    assertTSTypeReference(props?: object | null): void;
+    assertTSUndefinedKeyword(props?: object | null): void;
+    assertTSUnionType(props?: object | null): void;
+    assertTSUnknownKeyword(props?: object | null): void;
+    assertTSVoidKeyword(props?: object | null): void;
+    assertTaggedTemplateExpression(props?: object | null): void;
+    assertTemplateElement(props?: object | null): void;
+    assertTemplateLiteral(props?: object | null): void;
+    assertTerminatorless(props?: object | null): void;
+    assertThisExpression(props?: object | null): void;
+    assertThisTypeAnnotation(props?: object | null): void;
+    assertThrowStatement(props?: object | null): void;
+    assertTryStatement(props?: object | null): void;
+    assertTupleTypeAnnotation(props?: object | null): void;
+    assertTypeAlias(props?: object | null): void;
+    assertTypeAnnotation(props?: object | null): void;
+    assertTypeCastExpression(props?: object | null): void;
+    assertTypeParameter(props?: object | null): void;
+    assertTypeParameterDeclaration(props?: object | null): void;
+    assertTypeParameterInstantiation(props?: object | null): void;
+    assertTypeofTypeAnnotation(props?: object | null): void;
+    assertUnaryExpression(props?: object | null): void;
+    assertUnaryLike(props?: object | null): void;
+    assertUnionTypeAnnotation(props?: object | null): void;
+    assertUpdateExpression(props?: object | null): void;
+    assertUserWhitespacable(props?: object | null): void;
+    assertVariableDeclaration(props?: object | null): void;
+    assertVariableDeclarator(props?: object | null): void;
+    assertVariance(props?: object | null): void;
+    assertVoidTypeAnnotation(props?: object | null): void;
+    assertWhile(props?: object | null): void;
+    assertWhileStatement(props?: object | null): void;
+    assertWithStatement(props?: object | null): void;
+    assertYieldExpression(props?: object | null): void;
+
+    assertBindingIdentifier(props?: object | null): void;
+    assertBlockScoped(props?: object | null): void;
+    assertGenerated(props?: object | null): void;
+    assertPure(props?: object | null): void;
+    assertReferenced(props?: object | null): void;
+    assertReferencedIdentifier(props?: object | null): void;
+    assertReferencedMemberExpression(props?: object | null): void;
+    assertScope(props?: object | null): void;
+    assertUser(props?: object | null): void;
+    assertVar(props?: object | null): void;
+    //#endregion
 }
 
-export class Hub {
-    constructor(file: any, options: any);
-    file: any;
-    options: any;
+export interface HubInterface {
+    getCode(): string | undefined;
+    getScope(): Scope | undefined;
+    addHelper(name: string): any;
+    buildError<E extends Error>(node: Node, msg: string, Error: new (message?: string) => E): E;
+}
+
+export class Hub implements HubInterface {
+    constructor();
+    getCode(): string | undefined;
+    getScope(): Scope | undefined;
+    addHelper(name: string): any;
+    buildError<E extends Error>(node: Node, msg: string, Constructor: new (message?: string) => E): E;
 }
 
 export interface TraversalContext {
diff --git a/node_modules/@types/babel__traverse/package.json b/node_modules/@types/babel__traverse/package.json
index ff9b6e1..5a40b28 100644
--- a/node_modules/@types/babel__traverse/package.json
+++ b/node_modules/@types/babel__traverse/package.json
@@ -1,6 +1,6 @@
 {
     "name": "@types/babel__traverse",
-    "version": "7.0.7",
+    "version": "7.0.15",
     "description": "TypeScript definitions for @babel/traverse",
     "license": "MIT",
     "contributors": [
@@ -23,10 +23,25 @@
             "name": "Melvin Groenhoff",
             "url": "https://github.com/mgroenhoff",
             "githubUsername": "mgroenhoff"
+        },
+        {
+            "name": "Dean L.",
+            "url": "https://github.com/dlgrit",
+            "githubUsername": "dlgrit"
+        },
+        {
+            "name": "Ifiok Jr.",
+            "url": "https://github.com/ifiokjr",
+            "githubUsername": "ifiokjr"
+        },
+        {
+            "name": "ExE Boss",
+            "url": "https://github.com/ExE-Boss",
+            "githubUsername": "ExE-Boss"
         }
     ],
     "main": "",
-    "types": "index",
+    "types": "index.d.ts",
     "repository": {
         "type": "git",
         "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
@@ -36,6 +51,6 @@
     "dependencies": {
         "@babel/types": "^7.3.0"
     },
-    "typesPublisherContentHash": "37e6c080b57f5b07ab86b0af01352617892a3cd9fc9db8bd3c69fa0610672457",
-    "typeScriptVersion": "2.9"
+    "typesPublisherContentHash": "b641c5a48237d080c85b2821d25a5c49c2677fe8418c25b0b0d1df7b70cbcda9",
+    "typeScriptVersion": "3.4"
 }
\ No newline at end of file
diff --git a/node_modules/@types/eslint-visitor-keys/LICENSE b/node_modules/@types/eslint-visitor-keys/LICENSE
deleted file mode 100644
index 2107107..0000000
--- a/node_modules/@types/eslint-visitor-keys/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-    MIT License
-
-    Copyright (c) Microsoft Corporation. All rights reserved.
-
-    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/node_modules/@types/eslint-visitor-keys/README.md b/node_modules/@types/eslint-visitor-keys/README.md
deleted file mode 100644
index 46bc834..0000000
--- a/node_modules/@types/eslint-visitor-keys/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Installation
-> `npm install --save @types/eslint-visitor-keys`
-
-# Summary
-This package contains type definitions for eslint-visitor-keys (https://github.com/eslint/eslint-visitor-keys#readme).
-
-# Details
-Files were exported from https://www.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/eslint-visitor-keys
-
-Additional Details
- * Last updated: Sun, 18 Feb 2018 01:53:11 GMT
- * Dependencies: none
- * Global values: none
-
-# Credits
-These definitions were written by Toru Nagashima <https://github.com/mysticatea>.
diff --git a/node_modules/@types/eslint-visitor-keys/index.d.ts b/node_modules/@types/eslint-visitor-keys/index.d.ts
deleted file mode 100644
index b63c4f8..0000000
--- a/node_modules/@types/eslint-visitor-keys/index.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-// Type definitions for eslint-visitor-keys 1.0
-// Project: https://github.com/eslint/eslint-visitor-keys#readme
-// Definitions by: Toru Nagashima <https://github.com/mysticatea>
-// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
-// TypeScript Version: 2.2
-
-export interface VisitorKeys {
-    readonly [type: string]: ReadonlyArray<string> | undefined;
-}
-
-export const KEYS: VisitorKeys;
-export function getKeys(node: {}): ReadonlyArray<string>;
-export function unionWith(keys: VisitorKeys): VisitorKeys;
diff --git a/node_modules/@types/eslint-visitor-keys/package.json b/node_modules/@types/eslint-visitor-keys/package.json
deleted file mode 100644
index a004d66..0000000
--- a/node_modules/@types/eslint-visitor-keys/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-    "name": "@types/eslint-visitor-keys",
-    "version": "1.0.0",
-    "description": "TypeScript definitions for eslint-visitor-keys",
-    "license": "MIT",
-    "contributors": [
-        {
-            "name": "Toru Nagashima",
-            "url": "https://github.com/mysticatea",
-            "githubUsername": "mysticatea"
-        }
-    ],
-    "main": "",
-    "repository": {
-        "type": "git",
-        "url": "https://www.github.com/DefinitelyTyped/DefinitelyTyped.git"
-    },
-    "scripts": {},
-    "dependencies": {},
-    "typesPublisherContentHash": "439a0b912c49f6aedb6456cd8485eddf2444a36dd4ae5767258b663df3dfb6dc",
-    "typeScriptVersion": "2.2"
-}
\ No newline at end of file
diff --git a/node_modules/@types/json5/README.md b/node_modules/@types/json5/README.md
new file mode 100644
index 0000000..ea81c5c
--- /dev/null
+++ b/node_modules/@types/json5/README.md
@@ -0,0 +1,18 @@
+# Installation
+> `npm install --save @types/json5`
+
+# Summary
+This package contains type definitions for JSON5 (http://json5.org/).
+
+# Details
+Files were exported from https://www.github.com/DefinitelyTyped/DefinitelyTyped/tree/types-2.0/json5
+
+Additional Details
+ * Last updated: Mon, 19 Sep 2016 17:28:59 GMT
+ * File structure: ProperModule
+ * Library Dependencies: none
+ * Module Dependencies: none
+ * Global values: json5
+
+# Credits
+These definitions were written by Jason Swearingen <https://jasonswearingen.github.io>.
diff --git a/node_modules/@types/json5/index.d.ts b/node_modules/@types/json5/index.d.ts
new file mode 100644
index 0000000..76a0352
--- /dev/null
+++ b/node_modules/@types/json5/index.d.ts
@@ -0,0 +1,44 @@
+﻿// Type definitions for JSON5
+// Project: http://json5.org/
+// Definitions by: Jason Swearingen <https://jasonswearingen.github.io>
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+
+//commonjs loader
+
+/** 
+ * The following is the exact list of additions to JSON's syntax introduced by JSON5. All of these are optional, and all of these come from ES5.
+
+Objects
+
+Object keys can be unquoted if they're valid identifiers. Yes, even reserved keywords (like default) are valid unquoted keys in ES5 [§11.1.5, §7.6]. (More info)
+
+(TODO: Unicode characters and escape sequences aren’t yet supported in this implementation.)
+
+Objects can have trailing commas.
+
+Arrays
+
+Arrays can have trailing commas.
+Strings
+
+Strings can be single-quoted.
+
+Strings can be split across multiple lines; just prefix each newline with a backslash. [ES5 §7.8.4]
+
+Numbers
+
+Numbers can be hexadecimal (base 16).
+
+Numbers can begin or end with a (leading or trailing) decimal point.
+
+Numbers can include Infinity, -Infinity, NaN, and -NaN.
+
+Numbers can begin with an explicit plus sign.
+
+Comments
+
+Both inline (single-line) and block (multi-line) comments are allowed.
+  */
+declare var json5: JSON;
+export = json5;
diff --git a/node_modules/@types/json5/package.json b/node_modules/@types/json5/package.json
new file mode 100644
index 0000000..ff784d5
--- /dev/null
+++ b/node_modules/@types/json5/package.json
@@ -0,0 +1,16 @@
+{
+    "name": "@types/json5",
+    "version": "0.0.29",
+    "description": "TypeScript definitions for JSON5",
+    "license": "MIT",
+    "author": "Jason Swearingen <https://jasonswearingen.github.io>",
+    "main": "",
+    "repository": {
+        "type": "git",
+        "url": "https://www.github.com/DefinitelyTyped/DefinitelyTyped.git"
+    },
+    "scripts": {},
+    "dependencies": {},
+    "typings": "index.d.ts",
+    "typesPublisherContentHash": "1ed77f2bfd59d290798abf89db281c36565f4a78d97d4e9caab25319d54c6331"
+}
\ No newline at end of file
diff --git a/node_modules/@types/json5/types-metadata.json b/node_modules/@types/json5/types-metadata.json
new file mode 100644
index 0000000..1c02afe
--- /dev/null
+++ b/node_modules/@types/json5/types-metadata.json
@@ -0,0 +1,25 @@
+{
+    "authors": "Jason Swearingen <https://jasonswearingen.github.io>",
+    "definitionFilename": "index.d.ts",
+    "libraryDependencies": [],
+    "moduleDependencies": [],
+    "libraryMajorVersion": "0",
+    "libraryMinorVersion": "0",
+    "libraryName": "JSON5",
+    "typingsPackageName": "json5",
+    "projectName": "http://json5.org/",
+    "sourceRepoURL": "https://www.github.com/DefinitelyTyped/DefinitelyTyped",
+    "sourceBranch": "types-2.0",
+    "kind": "ProperModule",
+    "globals": [
+        "json5"
+    ],
+    "declaredModules": [
+        "json5"
+    ],
+    "files": [
+        "index.d.ts"
+    ],
+    "hasPackageJson": false,
+    "contentHash": "1ed77f2bfd59d290798abf89db281c36565f4a78d97d4e9caab25319d54c6331"
+}
\ No newline at end of file
diff --git a/node_modules/@types/node/README.md b/node_modules/@types/node/README.md
index 2e47ae2..2a792d6 100644
--- a/node_modules/@types/node/README.md
+++ b/node_modules/@types/node/README.md
@@ -8,7 +8,7 @@
 Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node.
 
 ### Additional Details
- * Last updated: Tue, 22 Sep 2020 00:22:04 GMT
+ * Last updated: Fri, 09 Oct 2020 06:51:10 GMT
  * Dependencies: none
  * Global values: `Buffer`, `__dirname`, `__filename`, `clearImmediate`, `clearInterval`, `clearTimeout`, `console`, `exports`, `global`, `module`, `process`, `queueMicrotask`, `require`, `setImmediate`, `setInterval`, `setTimeout`
 
diff --git a/node_modules/@types/node/assert.d.ts b/node_modules/@types/node/assert.d.ts
index 5feaa34..3706d99 100644
--- a/node_modules/@types/node/assert.d.ts
+++ b/node_modules/@types/node/assert.d.ts
@@ -1,4 +1,4 @@
-declare module "assert" {
+declare module 'assert' {
     /** An alias of `assert.ok()`. */
     function assert(value: any, message?: string | Error): asserts value;
     namespace assert {
@@ -21,7 +21,7 @@
                 /** The `operator` property on the error instance. */
                 operator?: string;
                 /** If provided, the generated stack trace omits frames before this function. */
-                stackStartFn?: Function
+                stackStartFn?: Function;
             });
         }
 
@@ -43,11 +43,17 @@
             stack: object;
         }
 
-        type AssertPredicate = RegExp | (new() => object) | ((thrown: any) => boolean) | object | Error;
+        type AssertPredicate = RegExp | (new () => object) | ((thrown: any) => boolean) | object | Error;
 
         function fail(message?: string | Error): never;
         /** @deprecated since v10.0.0 - use fail([message]) or other assert functions instead. */
-        function fail(actual: any, expected: any, message?: string | Error, operator?: string, stackStartFn?: Function): never;
+        function fail(
+            actual: any,
+            expected: any,
+            message?: string | Error,
+            operator?: string,
+            stackStartFn?: Function,
+        ): never;
         function ok(value: any, message?: string | Error): asserts value;
         /** @deprecated since v9.9.0 - use strictEqual() instead. */
         function equal(actual: any, expected: any, message?: string | Error): void;
@@ -70,14 +76,44 @@
         function ifError(value: any): asserts value is null | undefined;
 
         function rejects(block: (() => Promise<any>) | Promise<any>, message?: string | Error): Promise<void>;
-        function rejects(block: (() => Promise<any>) | Promise<any>, error: AssertPredicate, message?: string | Error): Promise<void>;
+        function rejects(
+            block: (() => Promise<any>) | Promise<any>,
+            error: AssertPredicate,
+            message?: string | Error,
+        ): Promise<void>;
         function doesNotReject(block: (() => Promise<any>) | Promise<any>, message?: string | Error): Promise<void>;
-        function doesNotReject(block: (() => Promise<any>) | Promise<any>, error: RegExp | Function, message?: string | Error): Promise<void>;
+        function doesNotReject(
+            block: (() => Promise<any>) | Promise<any>,
+            error: RegExp | Function,
+            message?: string | Error,
+        ): Promise<void>;
 
         function match(value: string, regExp: RegExp, message?: string | Error): void;
         function doesNotMatch(value: string, regExp: RegExp, message?: string | Error): void;
 
-        const strict: typeof assert;
+        const strict: Omit<
+            typeof assert,
+            | 'strict'
+            | 'deepEqual'
+            | 'notDeepEqual'
+            | 'equal'
+            | 'notEqual'
+            | 'ok'
+            | 'strictEqual'
+            | 'deepStrictEqual'
+            | 'ifError'
+        > & {
+            (value: any, message?: string | Error): asserts value;
+            strict: typeof strict;
+            deepEqual: typeof deepStrictEqual;
+            notDeepEqual: typeof notDeepStrictEqual;
+            equal: typeof strictEqual;
+            notEqual: typeof notStrictEqual;
+            ok(value: any, message?: string | Error): asserts value;
+            strictEqual<T>(actual: any, expected: T, message?: string | Error): asserts actual is T;
+            deepStrictEqual<T>(actual: any, expected: T, message?: string | Error): asserts actual is T;
+            ifError(value: any): asserts value is null | undefined;
+        };
     }
 
     export = assert;
diff --git a/node_modules/@types/node/crypto.d.ts b/node_modules/@types/node/crypto.d.ts
index 258ea7f..17660cf 100644
--- a/node_modules/@types/node/crypto.d.ts
+++ b/node_modules/@types/node/crypto.d.ts
@@ -278,7 +278,7 @@
 
     function createPrivateKey(key: PrivateKeyInput | string | Buffer): KeyObject;
     function createPublicKey(key: PublicKeyInput | string | Buffer | KeyObject): KeyObject;
-    function createSecretKey(key: Buffer): KeyObject;
+    function createSecretKey(key: NodeJS.ArrayBufferView): KeyObject;
 
     function createSign(algorithm: string, options?: stream.WritableOptions): Signer;
 
@@ -448,7 +448,7 @@
     /** @deprecated since v10.0.0 */
     const DEFAULT_ENCODING: BufferEncoding;
 
-    type KeyType = 'rsa' | 'dsa' | 'ec' | 'ed25519' | 'x25519';
+    type KeyType = 'rsa' | 'dsa' | 'ec' | 'ed25519' | 'ed448' | 'x25519' | 'x448';
     type KeyFormat = 'pem' | 'der';
 
     interface BasePrivateKeyEncodingOptions<T extends KeyFormat> {
@@ -468,12 +468,24 @@
          */
     }
 
+    interface ED448KeyPairKeyObjectOptions {
+        /**
+         * No options.
+         */
+    }
+
     interface X25519KeyPairKeyObjectOptions {
        /**
         * No options.
         */
     }
 
+    interface X448KeyPairKeyObjectOptions {
+       /**
+        * No options.
+        */
+    }
+
     interface ECKeyPairKeyObjectOptions {
         /**
          * Name of the curve to use.
@@ -568,6 +580,16 @@
         };
     }
 
+    interface ED448KeyPairOptions<PubF extends KeyFormat, PrivF extends KeyFormat> {
+        publicKeyEncoding: {
+            type: 'spki';
+            format: PubF;
+        };
+        privateKeyEncoding: BasePrivateKeyEncodingOptions<PrivF> & {
+            type: 'pkcs8';
+        };
+    }
+
     interface X25519KeyPairOptions<PubF extends KeyFormat, PrivF extends KeyFormat> {
         publicKeyEncoding: {
             type: 'spki';
@@ -578,6 +600,16 @@
         };
     }
 
+    interface X448KeyPairOptions<PubF extends KeyFormat, PrivF extends KeyFormat> {
+        publicKeyEncoding: {
+            type: 'spki';
+            format: PubF;
+        };
+        privateKeyEncoding: BasePrivateKeyEncodingOptions<PrivF> & {
+            type: 'pkcs8';
+        };
+    }
+
     interface KeyPairSyncResult<T1 extends string | Buffer, T2 extends string | Buffer> {
         publicKey: T1;
         privateKey: T2;
@@ -605,13 +637,25 @@
     function generateKeyPairSync(type: 'ed25519', options: ED25519KeyPairOptions<'pem', 'der'>): KeyPairSyncResult<string, Buffer>;
     function generateKeyPairSync(type: 'ed25519', options: ED25519KeyPairOptions<'der', 'pem'>): KeyPairSyncResult<Buffer, string>;
     function generateKeyPairSync(type: 'ed25519', options: ED25519KeyPairOptions<'der', 'der'>): KeyPairSyncResult<Buffer, Buffer>;
-    function generateKeyPairSync(type: 'ed25519', options: ED25519KeyPairKeyObjectOptions): KeyPairKeyObjectResult;
+    function generateKeyPairSync(type: 'ed25519', options?: ED25519KeyPairKeyObjectOptions): KeyPairKeyObjectResult;
+
+    function generateKeyPairSync(type: 'ed448', options: ED448KeyPairOptions<'pem', 'pem'>): KeyPairSyncResult<string, string>;
+    function generateKeyPairSync(type: 'ed448', options: ED448KeyPairOptions<'pem', 'der'>): KeyPairSyncResult<string, Buffer>;
+    function generateKeyPairSync(type: 'ed448', options: ED448KeyPairOptions<'der', 'pem'>): KeyPairSyncResult<Buffer, string>;
+    function generateKeyPairSync(type: 'ed448', options: ED448KeyPairOptions<'der', 'der'>): KeyPairSyncResult<Buffer, Buffer>;
+    function generateKeyPairSync(type: 'ed448', options?: ED448KeyPairKeyObjectOptions): KeyPairKeyObjectResult;
 
     function generateKeyPairSync(type: 'x25519', options: X25519KeyPairOptions<'pem', 'pem'>): KeyPairSyncResult<string, string>;
     function generateKeyPairSync(type: 'x25519', options: X25519KeyPairOptions<'pem', 'der'>): KeyPairSyncResult<string, Buffer>;
     function generateKeyPairSync(type: 'x25519', options: X25519KeyPairOptions<'der', 'pem'>): KeyPairSyncResult<Buffer, string>;
     function generateKeyPairSync(type: 'x25519', options: X25519KeyPairOptions<'der', 'der'>): KeyPairSyncResult<Buffer, Buffer>;
-    function generateKeyPairSync(type: 'x25519', options: X25519KeyPairKeyObjectOptions): KeyPairKeyObjectResult;
+    function generateKeyPairSync(type: 'x25519', options?: X25519KeyPairKeyObjectOptions): KeyPairKeyObjectResult;
+
+    function generateKeyPairSync(type: 'x448', options: X448KeyPairOptions<'pem', 'pem'>): KeyPairSyncResult<string, string>;
+    function generateKeyPairSync(type: 'x448', options: X448KeyPairOptions<'pem', 'der'>): KeyPairSyncResult<string, Buffer>;
+    function generateKeyPairSync(type: 'x448', options: X448KeyPairOptions<'der', 'pem'>): KeyPairSyncResult<Buffer, string>;
+    function generateKeyPairSync(type: 'x448', options: X448KeyPairOptions<'der', 'der'>): KeyPairSyncResult<Buffer, Buffer>;
+    function generateKeyPairSync(type: 'x448', options?: X448KeyPairKeyObjectOptions): KeyPairKeyObjectResult;
 
     function generateKeyPair(type: 'rsa', options: RSAKeyPairOptions<'pem', 'pem'>, callback: (err: Error | null, publicKey: string, privateKey: string) => void): void;
     function generateKeyPair(type: 'rsa', options: RSAKeyPairOptions<'pem', 'der'>, callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void): void;
@@ -635,13 +679,25 @@
     function generateKeyPair(type: 'ed25519', options: ED25519KeyPairOptions<'pem', 'der'>, callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void): void;
     function generateKeyPair(type: 'ed25519', options: ED25519KeyPairOptions<'der', 'pem'>, callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void): void;
     function generateKeyPair(type: 'ed25519', options: ED25519KeyPairOptions<'der', 'der'>, callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void): void;
-    function generateKeyPair(type: 'ed25519', options: ED25519KeyPairKeyObjectOptions, callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void): void;
+    function generateKeyPair(type: 'ed25519', options: ED25519KeyPairKeyObjectOptions | undefined, callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void): void;
+
+    function generateKeyPair(type: 'ed448', options: ED448KeyPairOptions<'pem', 'pem'>, callback: (err: Error | null, publicKey: string, privateKey: string) => void): void;
+    function generateKeyPair(type: 'ed448', options: ED448KeyPairOptions<'pem', 'der'>, callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void): void;
+    function generateKeyPair(type: 'ed448', options: ED448KeyPairOptions<'der', 'pem'>, callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void): void;
+    function generateKeyPair(type: 'ed448', options: ED448KeyPairOptions<'der', 'der'>, callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void): void;
+    function generateKeyPair(type: 'ed448', options: ED448KeyPairKeyObjectOptions | undefined, callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void): void;
 
     function generateKeyPair(type: 'x25519', options: X25519KeyPairOptions<'pem', 'pem'>, callback: (err: Error | null, publicKey: string, privateKey: string) => void): void;
     function generateKeyPair(type: 'x25519', options: X25519KeyPairOptions<'pem', 'der'>, callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void): void;
     function generateKeyPair(type: 'x25519', options: X25519KeyPairOptions<'der', 'pem'>, callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void): void;
     function generateKeyPair(type: 'x25519', options: X25519KeyPairOptions<'der', 'der'>, callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void): void;
-    function generateKeyPair(type: 'x25519', options: X25519KeyPairKeyObjectOptions, callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void): void;
+    function generateKeyPair(type: 'x25519', options: X25519KeyPairKeyObjectOptions | undefined, callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void): void;
+
+    function generateKeyPair(type: 'x448', options: X448KeyPairOptions<'pem', 'pem'>, callback: (err: Error | null, publicKey: string, privateKey: string) => void): void;
+    function generateKeyPair(type: 'x448', options: X448KeyPairOptions<'pem', 'der'>, callback: (err: Error | null, publicKey: string, privateKey: Buffer) => void): void;
+    function generateKeyPair(type: 'x448', options: X448KeyPairOptions<'der', 'pem'>, callback: (err: Error | null, publicKey: Buffer, privateKey: string) => void): void;
+    function generateKeyPair(type: 'x448', options: X448KeyPairOptions<'der', 'der'>, callback: (err: Error | null, publicKey: Buffer, privateKey: Buffer) => void): void;
+    function generateKeyPair(type: 'x448', options: X448KeyPairKeyObjectOptions | undefined, callback: (err: Error | null, publicKey: KeyObject, privateKey: KeyObject) => void): void;
 
     namespace generateKeyPair {
         function __promisify__(type: "rsa", options: RSAKeyPairOptions<'pem', 'pem'>): Promise<{ publicKey: string, privateKey: string }>;
@@ -666,13 +722,25 @@
         function __promisify__(type: "ed25519", options: ED25519KeyPairOptions<'pem', 'der'>): Promise<{ publicKey: string, privateKey: Buffer }>;
         function __promisify__(type: "ed25519", options: ED25519KeyPairOptions<'der', 'pem'>): Promise<{ publicKey: Buffer, privateKey: string }>;
         function __promisify__(type: "ed25519", options: ED25519KeyPairOptions<'der', 'der'>): Promise<{ publicKey: Buffer, privateKey: Buffer }>;
-        function __promisify__(type: "ed25519", options: ED25519KeyPairKeyObjectOptions): Promise<KeyPairKeyObjectResult>;
+        function __promisify__(type: "ed25519", options?: ED25519KeyPairKeyObjectOptions): Promise<KeyPairKeyObjectResult>;
+
+        function __promisify__(type: "ed448", options: ED448KeyPairOptions<'pem', 'pem'>): Promise<{ publicKey: string, privateKey: string }>;
+        function __promisify__(type: "ed448", options: ED448KeyPairOptions<'pem', 'der'>): Promise<{ publicKey: string, privateKey: Buffer }>;
+        function __promisify__(type: "ed448", options: ED448KeyPairOptions<'der', 'pem'>): Promise<{ publicKey: Buffer, privateKey: string }>;
+        function __promisify__(type: "ed448", options: ED448KeyPairOptions<'der', 'der'>): Promise<{ publicKey: Buffer, privateKey: Buffer }>;
+        function __promisify__(type: "ed448", options?: ED448KeyPairKeyObjectOptions): Promise<KeyPairKeyObjectResult>;
 
         function __promisify__(type: "x25519", options: X25519KeyPairOptions<'pem', 'pem'>): Promise<{ publicKey: string, privateKey: string }>;
         function __promisify__(type: "x25519", options: X25519KeyPairOptions<'pem', 'der'>): Promise<{ publicKey: string, privateKey: Buffer }>;
         function __promisify__(type: "x25519", options: X25519KeyPairOptions<'der', 'pem'>): Promise<{ publicKey: Buffer, privateKey: string }>;
         function __promisify__(type: "x25519", options: X25519KeyPairOptions<'der', 'der'>): Promise<{ publicKey: Buffer, privateKey: Buffer }>;
-        function __promisify__(type: "x25519", options: X25519KeyPairKeyObjectOptions): Promise<KeyPairKeyObjectResult>;
+        function __promisify__(type: "x25519", options?: X25519KeyPairKeyObjectOptions): Promise<KeyPairKeyObjectResult>;
+
+        function __promisify__(type: "x448", options: X448KeyPairOptions<'pem', 'pem'>): Promise<{ publicKey: string, privateKey: string }>;
+        function __promisify__(type: "x448", options: X448KeyPairOptions<'pem', 'der'>): Promise<{ publicKey: string, privateKey: Buffer }>;
+        function __promisify__(type: "x448", options: X448KeyPairOptions<'der', 'pem'>): Promise<{ publicKey: Buffer, privateKey: string }>;
+        function __promisify__(type: "x448", options: X448KeyPairOptions<'der', 'der'>): Promise<{ publicKey: Buffer, privateKey: Buffer }>;
+        function __promisify__(type: "x448", options?: X448KeyPairKeyObjectOptions): Promise<KeyPairKeyObjectResult>;
     }
 
     /**
diff --git a/node_modules/@types/node/http.d.ts b/node_modules/@types/node/http.d.ts
index 673196c..0cfb456 100644
--- a/node_modules/@types/node/http.d.ts
+++ b/node_modules/@types/node/http.d.ts
@@ -160,8 +160,8 @@
         /**
          * @deprecate Use `socket` instead.
          */
-        connection: Socket;
-        socket: Socket;
+        connection: Socket | null;
+        socket: Socket | null;
 
         constructor();
 
@@ -205,8 +205,6 @@
 
     // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L77
     class ClientRequest extends OutgoingMessage {
-        connection: Socket;
-        socket: Socket;
         aborted: number;
 
         constructor(url: string | URL | ClientRequestArgs, cb?: (res: IncomingMessage) => void);
diff --git a/node_modules/@types/node/package.json b/node_modules/@types/node/package.json
index 58a0d64..e15aee1 100644
--- a/node_modules/@types/node/package.json
+++ b/node_modules/@types/node/package.json
@@ -1,6 +1,6 @@
 {
     "name": "@types/node",
-    "version": "14.11.2",
+    "version": "14.11.8",
     "description": "TypeScript definitions for Node.js",
     "license": "MIT",
     "contributors": [
@@ -246,6 +246,6 @@
     },
     "scripts": {},
     "dependencies": {},
-    "typesPublisherContentHash": "95c31ecd7dac923f86a6c9be84dca043a8e12b784d38a9fd13883ee95fac1971",
+    "typesPublisherContentHash": "2648fdcf6d0b183d3a081cb17833d47c55084f5245aa4f9a8ea246ed71a45a8b",
     "typeScriptVersion": "3.2"
 }
\ No newline at end of file
diff --git a/node_modules/@types/node/punycode.d.ts b/node_modules/@types/node/punycode.d.ts
index 75d2811..9089773 100644
--- a/node_modules/@types/node/punycode.d.ts
+++ b/node_modules/@types/node/punycode.d.ts
@@ -1,12 +1,68 @@
 declare module "punycode" {
+    /**
+     * @deprecated since v7.0.0
+     * The version of the punycode module bundled in Node.js is being deprecated.
+     * In a future major version of Node.js this module will be removed.
+     * Users currently depending on the punycode module should switch to using
+     * the userland-provided Punycode.js module instead.
+     */
     function decode(string: string): string;
+    /**
+     * @deprecated since v7.0.0
+     * The version of the punycode module bundled in Node.js is being deprecated.
+     * In a future major version of Node.js this module will be removed.
+     * Users currently depending on the punycode module should switch to using
+     * the userland-provided Punycode.js module instead.
+     */
     function encode(string: string): string;
+    /**
+     * @deprecated since v7.0.0
+     * The version of the punycode module bundled in Node.js is being deprecated.
+     * In a future major version of Node.js this module will be removed.
+     * Users currently depending on the punycode module should switch to using
+     * the userland-provided Punycode.js module instead.
+     */
     function toUnicode(domain: string): string;
+    /**
+     * @deprecated since v7.0.0
+     * The version of the punycode module bundled in Node.js is being deprecated.
+     * In a future major version of Node.js this module will be removed.
+     * Users currently depending on the punycode module should switch to using
+     * the userland-provided Punycode.js module instead.
+     */
     function toASCII(domain: string): string;
+    /**
+     * @deprecated since v7.0.0
+     * The version of the punycode module bundled in Node.js is being deprecated.
+     * In a future major version of Node.js this module will be removed.
+     * Users currently depending on the punycode module should switch to using
+     * the userland-provided Punycode.js module instead.
+     */
     const ucs2: ucs2;
     interface ucs2 {
+        /**
+         * @deprecated since v7.0.0
+         * The version of the punycode module bundled in Node.js is being deprecated.
+         * In a future major version of Node.js this module will be removed.
+         * Users currently depending on the punycode module should switch to using
+         * the userland-provided Punycode.js module instead.
+         */
         decode(string: string): number[];
+        /**
+         * @deprecated since v7.0.0
+         * The version of the punycode module bundled in Node.js is being deprecated.
+         * In a future major version of Node.js this module will be removed.
+         * Users currently depending on the punycode module should switch to using
+         * the userland-provided Punycode.js module instead.
+         */
         encode(codePoints: number[]): string;
     }
+    /**
+     * @deprecated since v7.0.0
+     * The version of the punycode module bundled in Node.js is being deprecated.
+     * In a future major version of Node.js this module will be removed.
+     * Users currently depending on the punycode module should switch to using
+     * the userland-provided Punycode.js module instead.
+     */
     const version: string;
 }
diff --git a/node_modules/@types/node/ts3.4/assert.d.ts b/node_modules/@types/node/ts3.4/assert.d.ts
index 3f01820..68b189c 100644
--- a/node_modules/@types/node/ts3.4/assert.d.ts
+++ b/node_modules/@types/node/ts3.4/assert.d.ts
@@ -1,4 +1,4 @@
-declare module "assert" {
+declare module 'assert' {
     function assert(value: any, message?: string | Error): void;
     namespace assert {
         class AssertionError implements Error {
@@ -11,16 +11,25 @@
             code: 'ERR_ASSERTION';
 
             constructor(options?: {
-                message?: string; actual?: any; expected?: any;
-                operator?: string; stackStartFn?: Function
+                message?: string;
+                actual?: any;
+                expected?: any;
+                operator?: string;
+                stackStartFn?: Function;
             });
         }
 
-        type AssertPredicate = RegExp | (new() => object) | ((thrown: any) => boolean) | object | Error;
+        type AssertPredicate = RegExp | (new () => object) | ((thrown: any) => boolean) | object | Error;
 
         function fail(message?: string | Error): never;
         /** @deprecated since v10.0.0 - use `fail([message])` or other assert functions instead. */
-        function fail(actual: any, expected: any, message?: string | Error, operator?: string, stackStartFn?: Function): never;
+        function fail(
+            actual: any,
+            expected: any,
+            message?: string | Error,
+            operator?: string,
+            stackStartFn?: Function,
+        ): never;
         function ok(value: any, message?: string | Error): void;
         /** @deprecated since v9.9.0 - use `strictEqual()` instead. */
         function equal(actual: any, expected: any, message?: string | Error): void;
@@ -43,9 +52,17 @@
         function ifError(value: any): void;
 
         function rejects(block: (() => Promise<any>) | Promise<any>, message?: string | Error): Promise<void>;
-        function rejects(block: (() => Promise<any>) | Promise<any>, error: AssertPredicate, message?: string | Error): Promise<void>;
+        function rejects(
+            block: (() => Promise<any>) | Promise<any>,
+            error: AssertPredicate,
+            message?: string | Error,
+        ): Promise<void>;
         function doesNotReject(block: (() => Promise<any>) | Promise<any>, message?: string | Error): Promise<void>;
-        function doesNotReject(block: (() => Promise<any>) | Promise<any>, error: RegExp | Function, message?: string | Error): Promise<void>;
+        function doesNotReject(
+            block: (() => Promise<any>) | Promise<any>,
+            error: RegExp | Function,
+            message?: string | Error,
+        ): Promise<void>;
 
         function match(value: string, regExp: RegExp, message?: string | Error): void;
         function doesNotMatch(value: string, regExp: RegExp, message?: string | Error): void;
diff --git a/node_modules/@types/node/wasi.d.ts b/node_modules/@types/node/wasi.d.ts
index ecf3170..fe2b2aa 100644
--- a/node_modules/@types/node/wasi.d.ts
+++ b/node_modules/@types/node/wasi.d.ts
@@ -6,11 +6,13 @@
          * WASI command itself.
          */
         args?: string[];
+
         /**
          * An object similar to `process.env` that the WebAssembly
          * application will see as its environment.
          */
         env?: object;
+
         /**
          * This object represents the WebAssembly application's
          * sandbox directory structure. The string keys of `preopens` are treated as
@@ -27,6 +29,24 @@
          * @default false
          */
         returnOnExit?: boolean;
+
+        /**
+         * The file descriptor used as standard input in the WebAssembly application.
+         * @default 0
+         */
+        stdin?: number;
+
+        /**
+         * The file descriptor used as standard output in the WebAssembly application.
+         * @default 1
+         */
+        stdout?: number;
+
+        /**
+         * The file descriptor used as standard error in the WebAssembly application.
+         * @default 2
+         */
+        stderr?: number;
     }
 
     class WASI {
@@ -40,11 +60,25 @@
          *
          * `start()` requires that `instance` exports a [`WebAssembly.Memory`][] named
          * `memory`. If `instance` does not have a `memory` export an exception is thrown.
+         *
+         * If `start()` is called more than once, an exception is thrown.
          */
         start(instance: object): void; // TODO: avoid DOM dependency until WASM moved to own lib.
+
+        /**
+         * Attempt to initialize `instance` as a WASI reactor by invoking its `_initialize()` export, if it is present.
+         * If `instance` contains a `_start()` export, then an exception is thrown.
+         *
+         * `start()` requires that `instance` exports a [`WebAssembly.Memory`][] named
+         * `memory`. If `instance` does not have a `memory` export an exception is thrown.
+         *
+         * If `initialize()` is called more than once, an exception is thrown.
+         */
+        initialize(instance: object): void; // TODO: avoid DOM dependency until WASM moved to own lib.
+
         /**
          * Is an object that implements the WASI system call API. This object
-         * should be passed as the `wasi_unstable` import during the instantiation of a
+         * should be passed as the `wasi_snapshot_preview1` import during the instantiation of a
          * [`WebAssembly.Instance`][].
          */
         readonly wasiImport: NodeJS.Dict<any>; // TODO: Narrow to DOM types
diff --git a/node_modules/@types/node/worker_threads.d.ts b/node_modules/@types/node/worker_threads.d.ts
index 1aea5d4..b1e59df 100644
--- a/node_modules/@types/node/worker_threads.d.ts
+++ b/node_modules/@types/node/worker_threads.d.ts
@@ -3,9 +3,11 @@
     import { EventEmitter } from "events";
     import { Readable, Writable } from "stream";
     import { URL } from "url";
+    import { FileHandle } from "fs/promises";
 
     const isMainThread: boolean;
     const parentPort: null | MessagePort;
+    const resourceLimits: ResourceLimits;
     const SHARE_ENV: unique symbol;
     const threadId: number;
     const workerData: any;
@@ -15,43 +17,53 @@
         readonly port2: MessagePort;
     }
 
+    type TransferListItem = ArrayBuffer | MessagePort | FileHandle;
+
     class MessagePort extends EventEmitter {
         close(): void;
-        postMessage(value: any, transferList?: Array<ArrayBuffer | MessagePort>): void;
+        postMessage(value: any, transferList?: TransferListItem[]): void;
         ref(): void;
         unref(): void;
         start(): void;
 
         addListener(event: "close", listener: () => void): this;
         addListener(event: "message", listener: (value: any) => void): this;
+        addListener(event: "messageerror", listener: (error: Error) => void): this;
         addListener(event: string | symbol, listener: (...args: any[]) => void): this;
 
         emit(event: "close"): boolean;
         emit(event: "message", value: any): boolean;
+        emit(event: "messageerror", error: Error): boolean;
         emit(event: string | symbol, ...args: any[]): boolean;
 
         on(event: "close", listener: () => void): this;
         on(event: "message", listener: (value: any) => void): this;
+        on(event: "messageerror", listener: (error: Error) => void): this;
         on(event: string | symbol, listener: (...args: any[]) => void): this;
 
         once(event: "close", listener: () => void): this;
         once(event: "message", listener: (value: any) => void): this;
+        once(event: "messageerror", listener: (error: Error) => void): this;
         once(event: string | symbol, listener: (...args: any[]) => void): this;
 
         prependListener(event: "close", listener: () => void): this;
         prependListener(event: "message", listener: (value: any) => void): this;
+        prependListener(event: "messageerror", listener: (error: Error) => void): this;
         prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
 
         prependOnceListener(event: "close", listener: () => void): this;
         prependOnceListener(event: "message", listener: (value: any) => void): this;
+        prependOnceListener(event: "messageerror", listener: (error: Error) => void): this;
         prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
 
         removeListener(event: "close", listener: () => void): this;
         removeListener(event: "message", listener: (value: any) => void): this;
+        removeListener(event: "messageerror", listener: (error: Error) => void): this;
         removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
 
         off(event: "close", listener: () => void): this;
         off(event: "message", listener: (value: any) => void): this;
+        off(event: "messageerror", listener: (error: Error) => void): this;
         off(event: string | symbol, listener: (...args: any[]) => void): this;
     }
 
@@ -74,14 +86,28 @@
         /**
          * Additional data to send in the first worker message.
          */
-        transferList?: Array<ArrayBuffer | MessagePort>;
+        transferList?: TransferListItem[];
         trackUnmanagedFds?: boolean;
     }
 
     interface ResourceLimits {
+        /**
+         * The maximum size of a heap space for recently created objects.
+         */
         maxYoungGenerationSizeMb?: number;
+        /**
+         * The maximum size of the main heap in MB.
+         */
         maxOldGenerationSizeMb?: number;
+        /**
+         * The size of a pre-allocated memory range used for generated code.
+         */
         codeRangeSizeMb?: number;
+        /**
+         * The default maximum stack size for the thread. Small values may lead to unusable Worker instances.
+         * @default 4
+         */
+        stackSizeMb?: number;
     }
 
     class Worker extends EventEmitter {
@@ -98,7 +124,7 @@
          */
         constructor(filename: string | URL, options?: WorkerOptions);
 
-        postMessage(value: any, transferList?: Array<ArrayBuffer | MessagePort>): void;
+        postMessage(value: any, transferList?: TransferListItem[]): void;
         ref(): void;
         unref(): void;
         /**
@@ -120,53 +146,73 @@
         addListener(event: "error", listener: (err: Error) => void): this;
         addListener(event: "exit", listener: (exitCode: number) => void): this;
         addListener(event: "message", listener: (value: any) => void): this;
+        addListener(event: "messageerror", listener: (error: Error) => void): this;
         addListener(event: "online", listener: () => void): this;
         addListener(event: string | symbol, listener: (...args: any[]) => void): this;
 
         emit(event: "error", err: Error): boolean;
         emit(event: "exit", exitCode: number): boolean;
         emit(event: "message", value: any): boolean;
+        emit(event: "messageerror", error: Error): boolean;
         emit(event: "online"): boolean;
         emit(event: string | symbol, ...args: any[]): boolean;
 
         on(event: "error", listener: (err: Error) => void): this;
         on(event: "exit", listener: (exitCode: number) => void): this;
         on(event: "message", listener: (value: any) => void): this;
+        on(event: "messageerror", listener: (error: Error) => void): this;
         on(event: "online", listener: () => void): this;
         on(event: string | symbol, listener: (...args: any[]) => void): this;
 
         once(event: "error", listener: (err: Error) => void): this;
         once(event: "exit", listener: (exitCode: number) => void): this;
         once(event: "message", listener: (value: any) => void): this;
+        once(event: "messageerror", listener: (error: Error) => void): this;
         once(event: "online", listener: () => void): this;
         once(event: string | symbol, listener: (...args: any[]) => void): this;
 
         prependListener(event: "error", listener: (err: Error) => void): this;
         prependListener(event: "exit", listener: (exitCode: number) => void): this;
         prependListener(event: "message", listener: (value: any) => void): this;
+        prependListener(event: "messageerror", listener: (error: Error) => void): this;
         prependListener(event: "online", listener: () => void): this;
         prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
 
         prependOnceListener(event: "error", listener: (err: Error) => void): this;
         prependOnceListener(event: "exit", listener: (exitCode: number) => void): this;
         prependOnceListener(event: "message", listener: (value: any) => void): this;
+        prependOnceListener(event: "messageerror", listener: (error: Error) => void): this;
         prependOnceListener(event: "online", listener: () => void): this;
         prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
 
         removeListener(event: "error", listener: (err: Error) => void): this;
         removeListener(event: "exit", listener: (exitCode: number) => void): this;
         removeListener(event: "message", listener: (value: any) => void): this;
+        removeListener(event: "messageerror", listener: (error: Error) => void): this;
         removeListener(event: "online", listener: () => void): this;
         removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
 
         off(event: "error", listener: (err: Error) => void): this;
         off(event: "exit", listener: (exitCode: number) => void): this;
         off(event: "message", listener: (value: any) => void): this;
+        off(event: "messageerror", listener: (error: Error) => void): this;
         off(event: "online", listener: () => void): this;
         off(event: string | symbol, listener: (...args: any[]) => void): this;
     }
 
     /**
+     * Mark an object as not transferable.
+     * If `object` occurs in the transfer list of a `port.postMessage()` call, it will be ignored.
+     *
+     * In particular, this makes sense for objects that can be cloned, rather than transferred,
+     * and which are used by other objects on the sending side. For example, Node.js marks
+     * the `ArrayBuffer`s it uses for its Buffer pool with this.
+     *
+     * This operation cannot be undone.
+     */
+    function markAsUntransferable(object: object): void;
+
+    /**
      * Transfer a `MessagePort` to a different `vm` Context. The original `port`
      * object will be rendered unusable, and the returned `MessagePort` instance will
      * take its place.
diff --git a/node_modules/@types/node/zlib.d.ts b/node_modules/@types/node/zlib.d.ts
index a03e900..5ed1a0c 100644
--- a/node_modules/@types/node/zlib.d.ts
+++ b/node_modules/@types/node/zlib.d.ts
@@ -19,6 +19,8 @@
         memLevel?: number; // compression only
         strategy?: number; // compression only
         dictionary?: NodeJS.ArrayBufferView | ArrayBuffer; // deflate/inflate only, empty dictionary by default
+        info?: boolean;
+        maxOutputLength?: number;
     }
 
     interface BrotliOptions {
@@ -40,6 +42,7 @@
              */
             [key: number]: boolean | number;
         };
+        maxOutputLength?: number;
     }
 
     interface Zlib {
@@ -111,6 +114,43 @@
     function unzip(buf: InputType, options: ZlibOptions, callback: CompressCallback): void;
     function unzipSync(buf: InputType, options?: ZlibOptions): Buffer;
 
+    namespace brotliCompress {
+        function __promisify__(buffer: InputType, options: BrotliOptions): Promise<Buffer>;
+        function __promisify__(buffer: InputType): Promise<Buffer>;
+    }
+    namespace brotliDecompress {
+        function __promisify__(buffer: InputType, options: BrotliOptions): Promise<Buffer>;
+        function __promisify__(buffer: InputType): Promise<Buffer>;
+    }
+    namespace deflate {
+        function __promisify__(buffer: InputType): Promise<Buffer>;
+        function __promisify__(buffer: InputType, options: ZlibOptions): Promise<Buffer>;
+    }
+    namespace deflateRaw {
+        function __promisify__(buffer: InputType): Promise<Buffer>;
+        function __promisify__(buffer: InputType, options: ZlibOptions): Promise<Buffer>;
+    }
+    namespace gzip {
+        function __promisify__(buffer: InputType): Promise<Buffer>;
+        function __promisify__(buffer: InputType, options: ZlibOptions): Promise<Buffer>;
+    }
+    namespace gunzip {
+        function __promisify__(buffer: InputType): Promise<Buffer>;
+        function __promisify__(buffer: InputType, options: ZlibOptions): Promise<Buffer>;
+    }
+    namespace inflate {
+        function __promisify__(buffer: InputType): Promise<Buffer>;
+        function __promisify__(buffer: InputType, options: ZlibOptions): Promise<Buffer>;
+    }
+    namespace inflateRaw {
+        function __promisify__(buffer: InputType): Promise<Buffer>;
+        function __promisify__(buffer: InputType, options: ZlibOptions): Promise<Buffer>;
+    }
+    namespace unzip {
+        function __promisify__(buffer: InputType): Promise<Buffer>;
+        function __promisify__(buffer: InputType, options: ZlibOptions): Promise<Buffer>;
+    }
+
     namespace constants {
         const BROTLI_DECODE: number;
         const BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: number;
diff --git a/node_modules/@typescript-eslint/eslint-plugin/CHANGELOG.md b/node_modules/@typescript-eslint/eslint-plugin/CHANGELOG.md
index 09fdc41..eb0a0c0 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/CHANGELOG.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/CHANGELOG.md
@@ -3,6 +3,638 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [4.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.2.0...v4.3.0) (2020-09-28)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** added safe getTypeOfPropertyOfType wrapper ([#2567](https://github.com/typescript-eslint/typescript-eslint/issues/2567)) ([7cba2de](https://github.com/typescript-eslint/typescript-eslint/commit/7cba2de138542563d678fbfc738cd1b3ebf01e07))
+* **experimental-utils:** treat RuleTester arrays as readonly ([#2601](https://github.com/typescript-eslint/typescript-eslint/issues/2601)) ([8025777](https://github.com/typescript-eslint/typescript-eslint/commit/80257776b78bd2b2b4389d6bd530b009a75fb520))
+
+
+### Features
+
+* **eslint-plugin:** [no-invalid-void-type] add option to allow `this: void` ([#2481](https://github.com/typescript-eslint/typescript-eslint/issues/2481)) ([ddf5660](https://github.com/typescript-eslint/typescript-eslint/commit/ddf5660846784003cab4b10ae7a5e510b9dd562b))
+
+
+
+
+
+# [4.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.1...v4.2.0) (2020-09-21)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [naming-convention] ignore properties inside object patterns ([#2566](https://github.com/typescript-eslint/typescript-eslint/issues/2566)) ([53a3cbc](https://github.com/typescript-eslint/typescript-eslint/commit/53a3cbc6f002e55135efbdf4982a3ad308ac708b))
+* **eslint-plugin:** [prefer-ts-expect-error] support block comments ([#2541](https://github.com/typescript-eslint/typescript-eslint/issues/2541)) ([c6f72fb](https://github.com/typescript-eslint/typescript-eslint/commit/c6f72fbd3ccc19e39954cfe3d36d358ef43b7daa))
+* **scope-manager:** correct analysis of inferred types in conditional types ([#2537](https://github.com/typescript-eslint/typescript-eslint/issues/2537)) ([4f660fd](https://github.com/typescript-eslint/typescript-eslint/commit/4f660fd31acbb88b30719f925dcb2b3022cc2bab))
+
+
+### Features
+
+* **eslint-plugin:** add extension rule `comma-dangle` ([#2416](https://github.com/typescript-eslint/typescript-eslint/issues/2416)) ([f7babcf](https://github.com/typescript-eslint/typescript-eslint/commit/f7babcf4e6da3e5cba8f2c75d57abf8089432d05))
+
+
+
+
+
+## [4.1.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.0...v4.1.1) (2020-09-14)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [naming-convention] allow an array of selectors with types and modifiers ([#2415](https://github.com/typescript-eslint/typescript-eslint/issues/2415)) ([7ca54c3](https://github.com/typescript-eslint/typescript-eslint/commit/7ca54c3e4601ad07db5b882a67965cd67a18c4b3))
+* **eslint-plugin:** [no-implied-eval] handle the `Function` type ([#2435](https://github.com/typescript-eslint/typescript-eslint/issues/2435)) ([e1401dc](https://github.com/typescript-eslint/typescript-eslint/commit/e1401dc5897d01da516802cfb2333cf4bc6d0e93))
+* **eslint-plugin:** [no-unused-vars] better handling for declared modules ([#2553](https://github.com/typescript-eslint/typescript-eslint/issues/2553)) ([02d72d4](https://github.com/typescript-eslint/typescript-eslint/commit/02d72d480be7a8f7ddc66a028338cfb996886f3c)), closes [#2523](https://github.com/typescript-eslint/typescript-eslint/issues/2523)
+* **eslint-plugin:** [no-use-before-define] false positive for function type arguments ([#2554](https://github.com/typescript-eslint/typescript-eslint/issues/2554)) ([189162d](https://github.com/typescript-eslint/typescript-eslint/commit/189162d46ecb116c420232937a7f86df913f4e79)), closes [#2527](https://github.com/typescript-eslint/typescript-eslint/issues/2527)
+* **eslint-plugin:** [prefer-function-type] handle `this` return ([#2437](https://github.com/typescript-eslint/typescript-eslint/issues/2437)) ([7c6fcee](https://github.com/typescript-eslint/typescript-eslint/commit/7c6fcee657dffd041e389e0aeaa4f3e278e92986))
+* **eslint-plugin:** [return-await] don't error for `in-try-catch` if the return is in a `catch` without a `finally` ([#2356](https://github.com/typescript-eslint/typescript-eslint/issues/2356)) ([efdd521](https://github.com/typescript-eslint/typescript-eslint/commit/efdd5213ceaef332cf0b2c26573176f844d22a09))
+
+
+
+
+
+# [4.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.1...v4.1.0) (2020-09-07)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [explicit-module-boundary-types] cyclical reference infinite recursion crash ([#2482](https://github.com/typescript-eslint/typescript-eslint/issues/2482)) ([8693653](https://github.com/typescript-eslint/typescript-eslint/commit/86936537bd6f1075cbceeb8d2d4e254d75188409))
+* **eslint-plugin:** [no-unused-vars] correct detection of unused vars in a declared module with `export =` ([#2505](https://github.com/typescript-eslint/typescript-eslint/issues/2505)) ([3d07a99](https://github.com/typescript-eslint/typescript-eslint/commit/3d07a99faa0a5fc1b44acdb43ddbfc90a5105833))
+* **eslint-plugin:** [no-unused-vars] properly handle ambient declaration exports ([#2496](https://github.com/typescript-eslint/typescript-eslint/issues/2496)) ([4d3ce5f](https://github.com/typescript-eslint/typescript-eslint/commit/4d3ce5f696985389bf53a31d62766041c703c70c))
+* **eslint-plugin:** [no-use-before-define] false positive with jsx pragma reference ([#2503](https://github.com/typescript-eslint/typescript-eslint/issues/2503)) ([5afeeab](https://github.com/typescript-eslint/typescript-eslint/commit/5afeeab24ad013142f2431750f24e6085d0a6f3a)), closes [#2502](https://github.com/typescript-eslint/typescript-eslint/issues/2502)
+* **eslint-plugin:** [typedef] false positive for rest parameter with array destructuring ([#2441](https://github.com/typescript-eslint/typescript-eslint/issues/2441)) ([2ada5af](https://github.com/typescript-eslint/typescript-eslint/commit/2ada5aff1ef37bc260d7a0eaafe9ff04f8a08fe4))
+* **eslint-plugin:** handle missing message IDs in eslint v5/v6 ([#2461](https://github.com/typescript-eslint/typescript-eslint/issues/2461)) ([ffdfade](https://github.com/typescript-eslint/typescript-eslint/commit/ffdfade106d602bcc12b074bdfa489e9f661491e))
+* **scope-manager:** add `const` as a global type variable ([#2499](https://github.com/typescript-eslint/typescript-eslint/issues/2499)) ([eb3f6e3](https://github.com/typescript-eslint/typescript-eslint/commit/eb3f6e39391d62ac424baa305a15e61806b2fd65))
+* **scope-manager:** correctly handle inferred types in nested type scopes ([#2497](https://github.com/typescript-eslint/typescript-eslint/issues/2497)) ([95f6bf4](https://github.com/typescript-eslint/typescript-eslint/commit/95f6bf4818cdec48a0583bf82f928c598af22736))
+* **scope-manager:** don't create references for intrinsic JSX elements ([#2504](https://github.com/typescript-eslint/typescript-eslint/issues/2504)) ([cdb9807](https://github.com/typescript-eslint/typescript-eslint/commit/cdb9807a5a368a136856cd03048b68e0f2dfb405))
+* **scope-manager:** support rest function type parameters ([#2491](https://github.com/typescript-eslint/typescript-eslint/issues/2491)) ([9d8b4c4](https://github.com/typescript-eslint/typescript-eslint/commit/9d8b4c479c98623e4198aa07639321929a8a876f)), closes [#2449](https://github.com/typescript-eslint/typescript-eslint/issues/2449)
+* **scope-manager:** support tagged template string generic type parameters ([#2492](https://github.com/typescript-eslint/typescript-eslint/issues/2492)) ([a2686c0](https://github.com/typescript-eslint/typescript-eslint/commit/a2686c04293ab9070c1500a0dab7e205bd1fa9d2))
+* **scope-manager:** support type predicates ([#2493](https://github.com/typescript-eslint/typescript-eslint/issues/2493)) ([a40f54c](https://github.com/typescript-eslint/typescript-eslint/commit/a40f54c39d59096a0d12a492807dcd52fbcdc384)), closes [#2462](https://github.com/typescript-eslint/typescript-eslint/issues/2462)
+* **scope-manager:** treat type imports as both values and types ([#2494](https://github.com/typescript-eslint/typescript-eslint/issues/2494)) ([916e95a](https://github.com/typescript-eslint/typescript-eslint/commit/916e95a505689746dda38a67148c95cc7d207d9f)), closes [#2453](https://github.com/typescript-eslint/typescript-eslint/issues/2453)
+
+
+### Features
+
+* **eslint-plugin:** [no-shadow] add option `ignoreFunctionTypeParameterNameValueShadow` ([#2470](https://github.com/typescript-eslint/typescript-eslint/issues/2470)) ([bfe255f](https://github.com/typescript-eslint/typescript-eslint/commit/bfe255fde0cb5fe5e32c02eb5ba35d27fb23d9ea))
+* **eslint-plugin:** add extension rule `no-loop-func` ([#2490](https://github.com/typescript-eslint/typescript-eslint/issues/2490)) ([36305df](https://github.com/typescript-eslint/typescript-eslint/commit/36305df74b3c26b60364f7ec13390be492b4b2ec))
+* **scope-manager:** add support for JSX scope analysis ([#2498](https://github.com/typescript-eslint/typescript-eslint/issues/2498)) ([f887ab5](https://github.com/typescript-eslint/typescript-eslint/commit/f887ab51f58c1b3571f9a14832864bc0ca59623f)), closes [#2455](https://github.com/typescript-eslint/typescript-eslint/issues/2455) [#2477](https://github.com/typescript-eslint/typescript-eslint/issues/2477)
+
+
+
+
+
+## [4.0.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.0...v4.0.1) (2020-08-31)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** update parser dependency range ([#2445](https://github.com/typescript-eslint/typescript-eslint/issues/2445)) ([2cb6620](https://github.com/typescript-eslint/typescript-eslint/commit/2cb66205de797479d9b2d362652c42fe032e913b)), closes [#2444](https://github.com/typescript-eslint/typescript-eslint/issues/2444)
+
+
+
+
+
+# [4.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.10.1...v4.0.0) (2020-08-31)
+
+## [Please see the release notes for v4.0.0](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v4.0.0)
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-shadow] fix false-positive on enum declaration ([#2374](https://github.com/typescript-eslint/typescript-eslint/issues/2374)) ([9de669f](https://github.com/typescript-eslint/typescript-eslint/commit/9de669f339fef62a98f745dc08b833aa5c632e62))
+* **eslint-plugin:** [no-unused-vars] handle TSCallSignature ([#2336](https://github.com/typescript-eslint/typescript-eslint/issues/2336)) ([c70f54f](https://github.com/typescript-eslint/typescript-eslint/commit/c70f54fd3a46a12060ae3aec0faae872c431dd88))
+* correct decorator traversal for AssignmentPattern ([#2375](https://github.com/typescript-eslint/typescript-eslint/issues/2375)) ([d738fa4](https://github.com/typescript-eslint/typescript-eslint/commit/d738fa4eff0a5c4cfc9b30b1c0502f8d1e78d7b6))
+* **scope-manager:** correct analysis of abstract class properties ([#2420](https://github.com/typescript-eslint/typescript-eslint/issues/2420)) ([cd84549](https://github.com/typescript-eslint/typescript-eslint/commit/cd84549beba3cf471d75cfd9ba26f80366842ed5))
+* **typescript-estree:** correct ChainExpression interaction with parentheses and non-nulls ([#2380](https://github.com/typescript-eslint/typescript-eslint/issues/2380)) ([762bc99](https://github.com/typescript-eslint/typescript-eslint/commit/762bc99584ede4d0b8099a743991e957aec86aa8))
+
+
+### Features
+
+* consume new scope analysis package ([#2039](https://github.com/typescript-eslint/typescript-eslint/issues/2039)) ([3be125d](https://github.com/typescript-eslint/typescript-eslint/commit/3be125d9bdbee1984ac6037874edf619213bd3d0))
+* support ESTree optional chaining representation ([#2308](https://github.com/typescript-eslint/typescript-eslint/issues/2308)) ([e9d2ab6](https://github.com/typescript-eslint/typescript-eslint/commit/e9d2ab638b6767700b52797e74b814ea059beaae))
+* **eslint-plugin:** [ban-ts-comment] change default for `ts-expect-error` to `allow-with-description` ([#2351](https://github.com/typescript-eslint/typescript-eslint/issues/2351)) ([a3f163a](https://github.com/typescript-eslint/typescript-eslint/commit/a3f163abc03f0fefc6dca1f205b728a4425209e4)), closes [#2146](https://github.com/typescript-eslint/typescript-eslint/issues/2146)
+* **eslint-plugin:** [no-unnecessary-condition][strict-boolean-expressions] add option to make the rules error on files without `strictNullChecks` turned on ([#2345](https://github.com/typescript-eslint/typescript-eslint/issues/2345)) ([9273441](https://github.com/typescript-eslint/typescript-eslint/commit/9273441f7592b52620e10432cb2dd4dc5c3b4db1))
+* **eslint-plugin:** [typedef] remove all defaults ([#2352](https://github.com/typescript-eslint/typescript-eslint/issues/2352)) ([a9cd6fb](https://github.com/typescript-eslint/typescript-eslint/commit/a9cd6fb893074e4f2ca9ad3497eaddfacb3cfd25))
+* **eslint-plugin:** add `consistent-type-imports` rule ([#2367](https://github.com/typescript-eslint/typescript-eslint/issues/2367)) ([58b1c2d](https://github.com/typescript-eslint/typescript-eslint/commit/58b1c2d463f34895798b9a61340e49ffc3ec4f1a))
+
+
+### BREAKING CHANGES
+
+* - Removed decorators property from several Nodes that could never semantically have them (FunctionDeclaration, TSEnumDeclaration, and TSInterfaceDeclaration)
+- Removed AST_NODE_TYPES.Import. This is a minor breaking change as the node type that used this was removed ages ago.
+* **eslint-plugin:** Default rule options is a breaking change.
+
+
+
+
+
+## [3.10.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.10.0...v3.10.1) (2020-08-25)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-unnecessary-condition] correct regression with unary negations ([#2422](https://github.com/typescript-eslint/typescript-eslint/issues/2422)) ([d1f0887](https://github.com/typescript-eslint/typescript-eslint/commit/d1f08879338c825a1a20406fe47c051a287d6519)), closes [#2421](https://github.com/typescript-eslint/typescript-eslint/issues/2421)
+
+
+
+
+
+# [3.10.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.9.1...v3.10.0) (2020-08-24)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [explicit-module-boundary-types] ignore abstract setters ([#2410](https://github.com/typescript-eslint/typescript-eslint/issues/2410)) ([3764248](https://github.com/typescript-eslint/typescript-eslint/commit/3764248084455409f085c5bc4706079405cef618))
+* **eslint-plugin:** [explicit-module-boundary-types] ignore all bodyless setters ([#2413](https://github.com/typescript-eslint/typescript-eslint/issues/2413)) ([a53f8c6](https://github.com/typescript-eslint/typescript-eslint/commit/a53f8c6ff37aa47b3fc1b729e359d81ea079ff75))
+* **eslint-plugin:** [no-unnecessary-condition] better handling for unary negation ([#2382](https://github.com/typescript-eslint/typescript-eslint/issues/2382)) ([32fe2bb](https://github.com/typescript-eslint/typescript-eslint/commit/32fe2bb4fe5524355eef4f3a9bd85c824e9d7f46))
+
+
+### Features
+
+* **eslint-plugin:** add `no-implicit-any-catch` rule ([#2202](https://github.com/typescript-eslint/typescript-eslint/issues/2202)) ([fde89d4](https://github.com/typescript-eslint/typescript-eslint/commit/fde89d4d392ef35cac2bc09f2774bfe397b20100))
+
+
+
+
+
+## [3.9.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.9.0...v3.9.1) (2020-08-17)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-unnecessary-condition] fix false positive with nullish coalescing ([#2385](https://github.com/typescript-eslint/typescript-eslint/issues/2385)) ([092c969](https://github.com/typescript-eslint/typescript-eslint/commit/092c96967fd9b58fb2d8d325e1dbc750ccbeb746))
+* **eslint-plugin:** [prefer-includes] don't auto fix when `test` method's argument type doesn't have an 'includes' method ([#2391](https://github.com/typescript-eslint/typescript-eslint/issues/2391)) ([71c4c72](https://github.com/typescript-eslint/typescript-eslint/commit/71c4c729e90e308e0afd70af7db5e9d9ff238527))
+
+
+
+
+
+# [3.9.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.8.0...v3.9.0) (2020-08-10)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-throw-literal] support type assertions ([#2354](https://github.com/typescript-eslint/typescript-eslint/issues/2354)) ([470174a](https://github.com/typescript-eslint/typescript-eslint/commit/470174ad51fdb12d82129a896559075513f6c912))
+
+
+### Features
+
+* **eslint-plugin:** [no-unsafe-assignment/return] allow assigning any => unknown ([#2371](https://github.com/typescript-eslint/typescript-eslint/issues/2371)) ([e7528e6](https://github.com/typescript-eslint/typescript-eslint/commit/e7528e686f5fe5cce8504fc15d3cd06b8733712e))
+* **typescript-estree:** support TSv4 labelled tuple members ([#2378](https://github.com/typescript-eslint/typescript-eslint/issues/2378)) ([00d84ff](https://github.com/typescript-eslint/typescript-eslint/commit/00d84ffbcbe9d0ec98bdb2f2ce59959a27ce4dbe))
+
+
+
+
+
+# [3.8.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.7.1...v3.8.0) (2020-08-03)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-implied-eval] don't report when `Function` is imported ([#2348](https://github.com/typescript-eslint/typescript-eslint/issues/2348)) ([fa169e7](https://github.com/typescript-eslint/typescript-eslint/commit/fa169e79661821f0e0e64a56d6db9da42c3c8654))
+* **eslint-plugin:** [no-unsafe-assignment] fix typo in message ([#2347](https://github.com/typescript-eslint/typescript-eslint/issues/2347)) ([2027bb1](https://github.com/typescript-eslint/typescript-eslint/commit/2027bb11689b76c297f93ba8a918b35fe68e5b9d))
+
+
+### Features
+
+* **eslint-plugin:** [naming-convention] allow specifying an array of selectors ([#2335](https://github.com/typescript-eslint/typescript-eslint/issues/2335)) ([3ef6bd5](https://github.com/typescript-eslint/typescript-eslint/commit/3ef6bd5cadc225e42ef1330d15919a39f53f2a2b))
+* **eslint-plugin:** add `prefer-enum-initializers` rule ([#2326](https://github.com/typescript-eslint/typescript-eslint/issues/2326)) ([4f38ea3](https://github.com/typescript-eslint/typescript-eslint/commit/4f38ea39c97289db11501d6368d01db8c5787257))
+
+
+
+
+
+## [3.7.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.7.0...v3.7.1) (2020-07-27)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [adjacent-overload-signatures] fix false positive on call signatures and a method named `call` ([#2313](https://github.com/typescript-eslint/typescript-eslint/issues/2313)) ([30fafb0](https://github.com/typescript-eslint/typescript-eslint/commit/30fafb09422b3aca881f4785d89b0536092d4952))
+* **eslint-plugin:** [no-extra-parens] stop reporting on calling generic functions with one argument and type parameters containing parentheses ([#2319](https://github.com/typescript-eslint/typescript-eslint/issues/2319)) ([616a841](https://github.com/typescript-eslint/typescript-eslint/commit/616a841032bec310d9f31f1c987888273df27008))
+
+
+
+
+
+# [3.7.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.6.1...v3.7.0) (2020-07-20)
+
+
+### Features
+
+* **eslint-plugin:** [naming-convention] allow selecting only `const` variables ([#2291](https://github.com/typescript-eslint/typescript-eslint/issues/2291)) ([156d058](https://github.com/typescript-eslint/typescript-eslint/commit/156d058fee835fdf1ed827a5ad4a80d57190cc54))
+* **eslint-plugin:** [no-empty-function] add `decoratedFunctions` option ([#2295](https://github.com/typescript-eslint/typescript-eslint/issues/2295)) ([88f08f4](https://github.com/typescript-eslint/typescript-eslint/commit/88f08f410760f58fdc2de58ecd9dab9610821642))
+
+
+
+
+
+## [3.6.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.6.0...v3.6.1) (2020-07-13)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-unnecessary-condition] handle computed member access ([#2288](https://github.com/typescript-eslint/typescript-eslint/issues/2288)) ([3a187ca](https://github.com/typescript-eslint/typescript-eslint/commit/3a187cafb7302a3c05de0e6a236dd142a5e2d741))
+* **eslint-plugin:** [prefer-literal-enum-member] allow negative numbers ([#2277](https://github.com/typescript-eslint/typescript-eslint/issues/2277)) ([00ac9c3](https://github.com/typescript-eslint/typescript-eslint/commit/00ac9c3ccaad27bab08ec3c3a104f612bb593df5))
+* **eslint-plugin:** [space-before-function-paren] incorrect handling of abstract methods ([#2275](https://github.com/typescript-eslint/typescript-eslint/issues/2275)) ([ced6591](https://github.com/typescript-eslint/typescript-eslint/commit/ced65918b16f46c383496a9b4bd43eca8a76baf6)), closes [#2274](https://github.com/typescript-eslint/typescript-eslint/issues/2274)
+* **eslint-plugin:** [switch-exhaustiveness-check] handle special characters in enum keys ([#2207](https://github.com/typescript-eslint/typescript-eslint/issues/2207)) ([98ab010](https://github.com/typescript-eslint/typescript-eslint/commit/98ab010fb7fca884984bb4200fd806ecee8071b6))
+
+
+
+
+
+# [3.6.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.5.0...v3.6.0) (2020-07-06)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-namespace] allow namespaces in nested declarations with `allowDeclarations` ([#2238](https://github.com/typescript-eslint/typescript-eslint/issues/2238)) ([c1df669](https://github.com/typescript-eslint/typescript-eslint/commit/c1df6694f7866d3ef7ede0b1c6c9dd6f3955e682))
+* **eslint-plugin:** [space-before-function-paren] handle abstract functions ([#2199](https://github.com/typescript-eslint/typescript-eslint/issues/2199)) ([88a3edf](https://github.com/typescript-eslint/typescript-eslint/commit/88a3edfce8349f871b7b660d2b76508b67c94eda))
+
+
+### Features
+
+* **eslint-plugin:** add rule `prefer-literal-enum-member` ([#1898](https://github.com/typescript-eslint/typescript-eslint/issues/1898)) ([fe2b2ec](https://github.com/typescript-eslint/typescript-eslint/commit/fe2b2ec39ef04ac8b73eef9d29d12fd1b24fa183))
+
+
+
+
+
+# [3.5.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.4.0...v3.5.0) (2020-06-29)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [naming-convention] support unicode in regex ([#2241](https://github.com/typescript-eslint/typescript-eslint/issues/2241)) ([5fdd21a](https://github.com/typescript-eslint/typescript-eslint/commit/5fdd21a1726fb6928098c4152aec55a30df960d4))
+
+
+### Features
+
+* add package scope-manager ([#1939](https://github.com/typescript-eslint/typescript-eslint/issues/1939)) ([682eb7e](https://github.com/typescript-eslint/typescript-eslint/commit/682eb7e009c3f22a542882dfd3602196a60d2a1e))
+
+
+
+
+
+# [3.4.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.3.0...v3.4.0) (2020-06-22)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-base-to-string] handle intersection types ([#2170](https://github.com/typescript-eslint/typescript-eslint/issues/2170)) ([9cca3a9](https://github.com/typescript-eslint/typescript-eslint/commit/9cca3a9584d5d5ef0536219c5a734f4e87efb543))
+* **eslint-plugin:** [unbound-method] handling destructuring ([#2228](https://github.com/typescript-eslint/typescript-eslint/issues/2228)) ([c3753c2](https://github.com/typescript-eslint/typescript-eslint/commit/c3753c21768d355ecdb9e7ae8e0bfdfbbc1d3bbe))
+
+
+### Features
+
+* **eslint-plugin:** [no-unnecessary-boolean-literal-compare] add option to check nullable booleans ([#1983](https://github.com/typescript-eslint/typescript-eslint/issues/1983)) ([c0b3057](https://github.com/typescript-eslint/typescript-eslint/commit/c0b3057b7f7d515891ad2efe32e4ef8c01e0478f))
+* **eslint-plugin:** add extension rule `no-loss-of-precision` ([#2196](https://github.com/typescript-eslint/typescript-eslint/issues/2196)) ([535b0f2](https://github.com/typescript-eslint/typescript-eslint/commit/535b0f2ddd82efa6a2c40307a61c480f4b3cdea3))
+
+
+
+
+
+# [3.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.2.0...v3.3.0) (2020-06-15)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-unused-expressions] handle ternary and short-circuit options ([#2194](https://github.com/typescript-eslint/typescript-eslint/issues/2194)) ([ee9f100](https://github.com/typescript-eslint/typescript-eslint/commit/ee9f100a2f9a874c2b361482742686eeaa9bdac7))
+
+
+### Features
+
+* **eslint-plugin:** [naming-convention] better error message and docs for prefix/suffix ([#2195](https://github.com/typescript-eslint/typescript-eslint/issues/2195)) ([a2ffe55](https://github.com/typescript-eslint/typescript-eslint/commit/a2ffe5568df0f7224bfe9141d298e538383d5f09))
+
+
+
+
+
+# [3.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.1.0...v3.2.0) (2020-06-08)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [explicit-module-boundary-types] dont report return type errors on constructor overloads ([#2158](https://github.com/typescript-eslint/typescript-eslint/issues/2158)) ([53232d7](https://github.com/typescript-eslint/typescript-eslint/commit/53232d775ca0b808e2d75d9501f4411a868b2b48))
+* **eslint-plugin:** [explicit-module-boundary-types] handle bodyless arrow functions with explicit return types that return functions ([#2169](https://github.com/typescript-eslint/typescript-eslint/issues/2169)) ([58db655](https://github.com/typescript-eslint/typescript-eslint/commit/58db655133aaae006efe3e3ceee971cf88dc348f))
+* **eslint-plugin:** [explicit-module-boundary-types] handle nested functions and functions expressions in a typed variable declaration ([#2176](https://github.com/typescript-eslint/typescript-eslint/issues/2176)) ([6ff450d](https://github.com/typescript-eslint/typescript-eslint/commit/6ff450da3abec93223a33f6b52484c9ca99b7abe))
+* **eslint-plugin:** [no-extra-non-null-assertion] dont report for assertions not followed by the optional chain ([#2167](https://github.com/typescript-eslint/typescript-eslint/issues/2167)) ([e4c1834](https://github.com/typescript-eslint/typescript-eslint/commit/e4c1834c7c5934332dd1d58c09018453568c4889))
+* **eslint-plugin:** [no-unnecessary-conditionals] Handle comparison of generics and loose comparisons with undefined values ([#2152](https://github.com/typescript-eslint/typescript-eslint/issues/2152)) ([c86e2a2](https://github.com/typescript-eslint/typescript-eslint/commit/c86e2a235372149db9b1700d39c2145e0ce5221a))
+* **eslint-plugin:** [prefer-optional-chain] handling first member expression ([#2156](https://github.com/typescript-eslint/typescript-eslint/issues/2156)) ([de18660](https://github.com/typescript-eslint/typescript-eslint/commit/de18660a8cf8f7033798646d8c5b0938d1accb12))
+* **eslint-plugin:** [return-await] correct handling of ternaries ([#2168](https://github.com/typescript-eslint/typescript-eslint/issues/2168)) ([fe4c0bf](https://github.com/typescript-eslint/typescript-eslint/commit/fe4c0bf8c04f070d6642fbe86c5e5614bc88e8fd))
+
+
+### Features
+
+* **eslint-plugin:** [naming-convention] put identifiers in quotes in error messages ([#2182](https://github.com/typescript-eslint/typescript-eslint/issues/2182)) ([fc61932](https://github.com/typescript-eslint/typescript-eslint/commit/fc619326eedf7ef2efa51444ecdead81a36a204f)), closes [#2178](https://github.com/typescript-eslint/typescript-eslint/issues/2178)
+* **eslint-plugin:** [require-array-sort-compare] add `ignoreStringArrays` option ([#1972](https://github.com/typescript-eslint/typescript-eslint/issues/1972)) ([6dee784](https://github.com/typescript-eslint/typescript-eslint/commit/6dee7840a3af1dfe4c38a128d1c4655bdac625df))
+* **eslint-plugin:** add rule `ban-tslint-comment` ([#2140](https://github.com/typescript-eslint/typescript-eslint/issues/2140)) ([43ee226](https://github.com/typescript-eslint/typescript-eslint/commit/43ee226ffbaaa3e7126081db9476c24b89ec16e9))
+* **eslint-plugin:** add rule `no-confusing-non-null-assertion` ([#1941](https://github.com/typescript-eslint/typescript-eslint/issues/1941)) ([9b51c44](https://github.com/typescript-eslint/typescript-eslint/commit/9b51c44f29d8b3e95a510985544e8ded8a14404d))
+
+
+
+
+
+# [3.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.2...v3.1.0) (2020-06-01)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [explicit-module-boundary-types] don't check returned functions if parent function has return type ([#2084](https://github.com/typescript-eslint/typescript-eslint/issues/2084)) ([d7d4eeb](https://github.com/typescript-eslint/typescript-eslint/commit/d7d4eeb03f2918d5d9e361fdb47c2d42e83bd593))
+* **eslint-plugin:** [no-unnecessary-condition] handle comparison of any, unknown and loose comparisons with nullish values ([#2123](https://github.com/typescript-eslint/typescript-eslint/issues/2123)) ([1ae1d01](https://github.com/typescript-eslint/typescript-eslint/commit/1ae1d01e5603ec7cef8051ed018c3c3c88b29867))
+* **eslint-plugin:** [no-unnecessary-condition] improve optional chain handling ([#2111](https://github.com/typescript-eslint/typescript-eslint/issues/2111)) ([9ee399b](https://github.com/typescript-eslint/typescript-eslint/commit/9ee399b5906e82f346ff89141207a6630786de54))
+* **eslint-plugin:** [no-unnecessary-condition] improve optional chain handling 2 - electric boogaloo ([#2138](https://github.com/typescript-eslint/typescript-eslint/issues/2138)) ([c87cfaf](https://github.com/typescript-eslint/typescript-eslint/commit/c87cfaf6746775bb8ad9eb45b0002f068a822dbe))
+* **eslint-plugin:** [no-unused-expressions] ignore import expressions ([#2130](https://github.com/typescript-eslint/typescript-eslint/issues/2130)) ([e383691](https://github.com/typescript-eslint/typescript-eslint/commit/e3836910efdafd9edf04daed149c9e839c08047e))
+* **eslint-plugin:** [no-var-requires] false negative for TSAsExpression and MemberExpression ([#2139](https://github.com/typescript-eslint/typescript-eslint/issues/2139)) ([df95338](https://github.com/typescript-eslint/typescript-eslint/commit/df953388913b22d45242e65ce231d92a8b8a0080))
+* **experimental-utils:** downlevel type declarations for versions older than 3.8 ([#2133](https://github.com/typescript-eslint/typescript-eslint/issues/2133)) ([7925823](https://github.com/typescript-eslint/typescript-eslint/commit/792582326a8065270b69a0ffcaad5a7b4b103ff3))
+
+
+### Features
+
+* **eslint-plugin:** [ban-ts-comments] add "allow-with-description" option ([#2099](https://github.com/typescript-eslint/typescript-eslint/issues/2099)) ([8a0fd18](https://github.com/typescript-eslint/typescript-eslint/commit/8a0fd1899f544470a35afb3117f4c71aad7e4e42))
+* **eslint-plugin:** [ban-types] allow selective disable of default options with `false` value ([#2137](https://github.com/typescript-eslint/typescript-eslint/issues/2137)) ([1cb8ca4](https://github.com/typescript-eslint/typescript-eslint/commit/1cb8ca483d029935310e6904580df8501837084d))
+* **eslint-plugin:** [explicit-module-boundary-types] improve accuracy and coverage ([#2135](https://github.com/typescript-eslint/typescript-eslint/issues/2135)) ([caaa859](https://github.com/typescript-eslint/typescript-eslint/commit/caaa8599284d02ab3341e282cad35a52d0fb86c7))
+
+
+
+
+
+## [3.0.2](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.1...v3.0.2) (2020-05-27)
+
+**Note:** Version bump only for package @typescript-eslint/eslint-plugin
+
+
+
+
+
+## [3.0.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.0...v3.0.1) (2020-05-25)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [naming-convention] handle no options correctly ([#2095](https://github.com/typescript-eslint/typescript-eslint/issues/2095)) ([fd7d02b](https://github.com/typescript-eslint/typescript-eslint/commit/fd7d02b31ebd995b7fdd857d7c054042aa4f2001))
+* **eslint-plugin:** [no-throw-literal] handle intersection and union types ([#2085](https://github.com/typescript-eslint/typescript-eslint/issues/2085)) ([cae037f](https://github.com/typescript-eslint/typescript-eslint/commit/cae037ff9b20363b970cc600a09505b98bf10a14))
+* **eslint-plugin:** [unbound-method] fix crash due to missing `Intl` ([#2090](https://github.com/typescript-eslint/typescript-eslint/issues/2090)) ([f2fa82c](https://github.com/typescript-eslint/typescript-eslint/commit/f2fa82c532ae858ccfb064268cfcc9df657a54be))
+
+
+
+
+
+# [3.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.34.0...v3.0.0) (2020-05-21)
+
+## [Please see the release notes for v3.0.0](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v3.0.0)
+
+### Bug Fixes
+
+* **eslint-plugin:** [dot-notation] fix typo in schema ([#2040](https://github.com/typescript-eslint/typescript-eslint/issues/2040)) ([242328f](https://github.com/typescript-eslint/typescript-eslint/commit/242328fa749ee4c72af93433a9bef95f329ac62f))
+* **eslint-plugin:** correct parser peerDep version ([fe59f69](https://github.com/typescript-eslint/typescript-eslint/commit/fe59f69381a0915a4f5135e2e88637a5eea246ba))
+* **experimental-utils:** add back SourceCode.isSpaceBetweenTokens ([ae82ea4](https://github.com/typescript-eslint/typescript-eslint/commit/ae82ea4a85a4ca332ebe6104e96c59dba30411be))
+* **typescript-estree:** remove now defunct `Import` node type ([f199cbd](https://github.com/typescript-eslint/typescript-eslint/commit/f199cbdbbd892b5ba03bfff66f463f3d9c92ee9b))
+* **typescript-estree:** use `TSEmptyBodyFunctionExpression` for body-less nodes ([#1289](https://github.com/typescript-eslint/typescript-eslint/issues/1289)) ([82e7163](https://github.com/typescript-eslint/typescript-eslint/commit/82e7163214b56ccde93ba97807b161669a50a60b))
+
+
+### Features
+
+* **eslint-plugin:** [ban-types] rework default options ([#848](https://github.com/typescript-eslint/typescript-eslint/issues/848)) ([8e31d5d](https://github.com/typescript-eslint/typescript-eslint/commit/8e31d5dbe9fe5227fdbefcecfd50ce5dd51360c3))
+* **eslint-plugin:** [no-floating-promises] ignore void operator by default ([#2003](https://github.com/typescript-eslint/typescript-eslint/issues/2003)) ([3626a67](https://github.com/typescript-eslint/typescript-eslint/commit/3626a673cf8117cc995245cd86e466e2553e9b0e))
+* **eslint-plugin:** [prefer-nullish-coalescing][prefer-optional-chain] remove unsafe fixers ([52b6085](https://github.com/typescript-eslint/typescript-eslint/commit/52b60852d0ba6bb6abe519c9d3ec1b231793e91d))
+* **experimental-utils:** upgrade eslint types for v7 ([#2023](https://github.com/typescript-eslint/typescript-eslint/issues/2023)) ([06869c9](https://github.com/typescript-eslint/typescript-eslint/commit/06869c9656fa37936126666845aee40aad546ebd))
+* upgrade to ESLint v7 ([#2022](https://github.com/typescript-eslint/typescript-eslint/issues/2022)) ([208de71](https://github.com/typescript-eslint/typescript-eslint/commit/208de71059746bf38e94bd460346ffb2698a3e12))
+* **eslint-plugin:** [no-unnecessary-condition] remove `checkArrayPredicates` and always check it ([#1579](https://github.com/typescript-eslint/typescript-eslint/issues/1579)) ([bfd9b60](https://github.com/typescript-eslint/typescript-eslint/commit/bfd9b606d17d30d5694967a1f01e0e1501ba1022))
+* **eslint-plugin:** [no-unnecessary-condition] remove option `ignoreRHS` ([#1163](https://github.com/typescript-eslint/typescript-eslint/issues/1163)) ([ee8dd8f](https://github.com/typescript-eslint/typescript-eslint/commit/ee8dd8f8a9e6c25ac426ce9bb71c5f012c51f264))
+* **eslint-plugin:** [no-unnecessary-condition] report when non-nullish is compared to `null`/`undefined` ([#1659](https://github.com/typescript-eslint/typescript-eslint/issues/1659)) ([7fa9060](https://github.com/typescript-eslint/typescript-eslint/commit/7fa906073903c5eb70609c25f1a91ada14dcdc71))
+* **eslint-plugin:** [restrict-template-expressions] `allowNumber: true` by default ([#2005](https://github.com/typescript-eslint/typescript-eslint/issues/2005)) ([643ec24](https://github.com/typescript-eslint/typescript-eslint/commit/643ec240bd901295d9e9ea5c43fc20109c33e982))
+* **eslint-plugin:** [restrict-template-expressions] rename `allowNullable` to `allowNullish` ([#2006](https://github.com/typescript-eslint/typescript-eslint/issues/2006)) ([264b017](https://github.com/typescript-eslint/typescript-eslint/commit/264b017c11c2ab132fcbad18b42a9a0fe639386e))
+* **eslint-plugin:** [strict-boolean-expression] rework options ([#1631](https://github.com/typescript-eslint/typescript-eslint/issues/1631)) ([cd14482](https://github.com/typescript-eslint/typescript-eslint/commit/cd1448240dca11762fcb9c10e18bb6541a840485))
+* **eslint-plugin:** delete deprecated rules ([#2002](https://github.com/typescript-eslint/typescript-eslint/issues/2002)) ([da0aec2](https://github.com/typescript-eslint/typescript-eslint/commit/da0aec2cfa27902aae7c438a2fe91343c822e4ae))
+* **eslint-plugin:** eslint-recommended: disable no-func-assign ([#984](https://github.com/typescript-eslint/typescript-eslint/issues/984)) ([ae9b8a9](https://github.com/typescript-eslint/typescript-eslint/commit/ae9b8a9c73c0328287de956466257d8bbfbdb20f))
+* **eslint-plugin:** eslint-recommended: disable no-obj-calls ([#1000](https://github.com/typescript-eslint/typescript-eslint/issues/1000)) ([b9ca14c](https://github.com/typescript-eslint/typescript-eslint/commit/b9ca14c5f5ec28a3fde1a9b2d2f6a4dc74d903e4))
+* **eslint-plugin:** update `eslint-recommended` set ([#1996](https://github.com/typescript-eslint/typescript-eslint/issues/1996)) ([9a96e18](https://github.com/typescript-eslint/typescript-eslint/commit/9a96e18400e0a0d738d159d9d01faf41d3586249))
+* **eslint-plugin:** update recommended sets ([#2001](https://github.com/typescript-eslint/typescript-eslint/issues/2001)) ([0126b4f](https://github.com/typescript-eslint/typescript-eslint/commit/0126b4f56f9197d561e90b09962ccceb4f88bc41))
+* **typescript-estree:** align nodes with estree 2020 ([#1389](https://github.com/typescript-eslint/typescript-eslint/issues/1389)) ([aff5b62](https://github.com/typescript-eslint/typescript-eslint/commit/aff5b62044f9b93f2087a1d261e9be3f8d6fd54d))
+* drop support for node v8 ([#1997](https://github.com/typescript-eslint/typescript-eslint/issues/1997)) ([b6c3b7b](https://github.com/typescript-eslint/typescript-eslint/commit/b6c3b7b84b8d199fa75a46432febd4a364a63217))
+* **typescript-estree:** always return parserServices ([#716](https://github.com/typescript-eslint/typescript-eslint/issues/716)) ([5b23443](https://github.com/typescript-eslint/typescript-eslint/commit/5b23443c48f3f62424db3e742243f3568080b946))
+* **typescript-estree:** handle 3.9's non-null assertion changes ([#2036](https://github.com/typescript-eslint/typescript-eslint/issues/2036)) ([06bec63](https://github.com/typescript-eslint/typescript-eslint/commit/06bec63c56536db070608ab136d2ad57083f0c6a))
+
+
+
+
+
+# [2.34.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.33.0...v2.34.0) (2020-05-18)
+
+
+### Features
+
+* **eslint-plugin:** [no-invalid-void-type] allow union of void and `allowInGenericTypeArguments` ([#1960](https://github.com/typescript-eslint/typescript-eslint/issues/1960)) ([1bc105a](https://github.com/typescript-eslint/typescript-eslint/commit/1bc105a2c6ae3fde9596f0419fed0de699dc57c7))
+* **eslint-plugin:** [restrict-template-expressions] improve error message ([#1926](https://github.com/typescript-eslint/typescript-eslint/issues/1926)) ([1af59ba](https://github.com/typescript-eslint/typescript-eslint/commit/1af59ba8ac0ceabb008d9c61556acf7db0a1d352))
+* **experimental-utils:** add `suggestion` property for rule  modules ([#2033](https://github.com/typescript-eslint/typescript-eslint/issues/2033)) ([f42a5b0](https://github.com/typescript-eslint/typescript-eslint/commit/f42a5b09ebfa173f418a99c552b0cbe221567194))
+
+
+
+
+
+# [2.33.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.32.0...v2.33.0) (2020-05-12)
+
+
+### Features
+
+* **eslint-plugin:** add extension rule `lines-between-class-members` ([#1684](https://github.com/typescript-eslint/typescript-eslint/issues/1684)) ([08f93e6](https://github.com/typescript-eslint/typescript-eslint/commit/08f93e69347a8e7f3a7e8a1455bb5d069c2faeef))
+
+
+
+
+
+# [2.32.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.31.0...v2.32.0) (2020-05-11)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-base-to-string] support boolean in unions ([#1979](https://github.com/typescript-eslint/typescript-eslint/issues/1979)) ([6987ecc](https://github.com/typescript-eslint/typescript-eslint/commit/6987ecc1dacfb45c0f8ed3e81d08aa708eb96ad1))
+* **eslint-plugin:** [no-type-alias] handle readonly types in aliases ([#1990](https://github.com/typescript-eslint/typescript-eslint/issues/1990)) ([56d9870](https://github.com/typescript-eslint/typescript-eslint/commit/56d987070f83d1b6410b04750b20a761fd793073))
+* **eslint-plugin:** [no-unused-expressions] inherit `messages` from base rule ([#1992](https://github.com/typescript-eslint/typescript-eslint/issues/1992)) ([51ca404](https://github.com/typescript-eslint/typescript-eslint/commit/51ca404af645eed194269ab7f8f67b97bd52e32d))
+
+
+### Features
+
+* bump dependencies and align AST ([#2007](https://github.com/typescript-eslint/typescript-eslint/issues/2007)) ([18668b7](https://github.com/typescript-eslint/typescript-eslint/commit/18668b78fd7d1e5281af7fc26c76e0ca53297f69))
+
+
+
+
+
+# [2.31.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.30.0...v2.31.0) (2020-05-04)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [dot-notation] handle missing declarations ([#1947](https://github.com/typescript-eslint/typescript-eslint/issues/1947)) ([383f931](https://github.com/typescript-eslint/typescript-eslint/commit/383f93182599c00e231a0f0d36575ca0e19369a6))
+* **eslint-plugin:** [method-signature-style] fix overloaded methods to an intersection type ([#1966](https://github.com/typescript-eslint/typescript-eslint/issues/1966)) ([7f3fba3](https://github.com/typescript-eslint/typescript-eslint/commit/7f3fba348d432d7637e1c737df943ee1f9105062))
+* **eslint-plugin:** [return-await] await in a normal function ([#1962](https://github.com/typescript-eslint/typescript-eslint/issues/1962)) ([f82fd7b](https://github.com/typescript-eslint/typescript-eslint/commit/f82fd7bb81f986c4861d0b4e2ecdb0c496d7a602))
+* **eslint-plugin:** [unbound-method] false positives for unary expressions ([#1964](https://github.com/typescript-eslint/typescript-eslint/issues/1964)) ([b35070e](https://github.com/typescript-eslint/typescript-eslint/commit/b35070ec6f84ad5ce606386cdb6eeb91488dfdd7))
+* **eslint-plugin:** no-base-to-string boolean expression detect ([#1969](https://github.com/typescript-eslint/typescript-eslint/issues/1969)) ([f78f13a](https://github.com/typescript-eslint/typescript-eslint/commit/f78f13aedd59d5b5880903d48c779a6c50fd937e))
+
+
+### Features
+
+* **eslint-plugin:** [member-ordering] add decorators support ([#1870](https://github.com/typescript-eslint/typescript-eslint/issues/1870)) ([f7ec192](https://github.com/typescript-eslint/typescript-eslint/commit/f7ec1920607cb8eec8020b08cd7247de0bf19ce1))
+* **eslint-plugin:** [prefer-optional-chain] added option to convert to suggestion fixer ([#1965](https://github.com/typescript-eslint/typescript-eslint/issues/1965)) ([2f0824b](https://github.com/typescript-eslint/typescript-eslint/commit/2f0824b0a41f3043b6242fc1d49faae540abaf22))
+* **eslint-plugin:** new extended rule 'no-invalid-this' ([#1823](https://github.com/typescript-eslint/typescript-eslint/issues/1823)) ([b18bc35](https://github.com/typescript-eslint/typescript-eslint/commit/b18bc357507337b9725f8d9c1b549513075a0da5))
+* **experimental-utils:** expose our RuleTester extension ([#1948](https://github.com/typescript-eslint/typescript-eslint/issues/1948)) ([2dd1638](https://github.com/typescript-eslint/typescript-eslint/commit/2dd1638aaa2658ba99b2341861146b586f489121))
+
+
+
+
+
+# [2.30.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.29.0...v2.30.0) (2020-04-27)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [prefer-string-starts-ends-with] check for negative start index in slice ([#1920](https://github.com/typescript-eslint/typescript-eslint/issues/1920)) ([ed2bd60](https://github.com/typescript-eslint/typescript-eslint/commit/ed2bd6067f74ae33e36a084719bb91efedfba599))
+* **eslint-plugin:** fix no-base-to-string boolean literal check ([#1850](https://github.com/typescript-eslint/typescript-eslint/issues/1850)) ([2f45e99](https://github.com/typescript-eslint/typescript-eslint/commit/2f45e9992a8f12b6233716e77a6159f9cea2c879))
+
+
+### Features
+
+* **eslint-plugin:** add extension rule `dot-notation` ([#1867](https://github.com/typescript-eslint/typescript-eslint/issues/1867)) ([a85c3e1](https://github.com/typescript-eslint/typescript-eslint/commit/a85c3e1515d735b6c245cc658cdaec6deb05d630))
+* **eslint-plugin:** create `no-invalid-void-type` rule ([#1847](https://github.com/typescript-eslint/typescript-eslint/issues/1847)) ([f667ff1](https://github.com/typescript-eslint/typescript-eslint/commit/f667ff1708d4ed28b7ea5beea742889da69a76d9))
+
+
+
+
+
+# [2.29.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.28.0...v2.29.0) (2020-04-20)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-base-to-string] soft remove `ignoreTaggedTemplateExpressions` option ([#1916](https://github.com/typescript-eslint/typescript-eslint/issues/1916)) ([369978e](https://github.com/typescript-eslint/typescript-eslint/commit/369978e9685bacb3e3882b0510ff06eaf8df4ca1))
+
+
+### Features
+
+* **eslint-plugin:** [no-floating-promise] add option to ignore IIFEs ([#1799](https://github.com/typescript-eslint/typescript-eslint/issues/1799)) ([cea51bf](https://github.com/typescript-eslint/typescript-eslint/commit/cea51bf130d6d3c2935f5e2dcc468196f2ad9d00))
+* **eslint-plugin:** [restrict-template-expressions] add support for intersection types ([#1803](https://github.com/typescript-eslint/typescript-eslint/issues/1803)) ([cc70e4f](https://github.com/typescript-eslint/typescript-eslint/commit/cc70e4fbadd0b15fd6af913a2e1e2ddd346fa558))
+* **eslint-plugin:** add extension rule `init-declarations` ([#1814](https://github.com/typescript-eslint/typescript-eslint/issues/1814)) ([b01f5e7](https://github.com/typescript-eslint/typescript-eslint/commit/b01f5e778ac28e0797a3734fc58d025bb224f418))
+* **eslint-plugin:** add extension rule `keyword-spacing` ([#1739](https://github.com/typescript-eslint/typescript-eslint/issues/1739)) ([c5106dd](https://github.com/typescript-eslint/typescript-eslint/commit/c5106dd4bf2bc8846cc39aa8bb50c33bec026d4d))
+
+
+
+
+
+# [2.28.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.27.0...v2.28.0) (2020-04-13)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [method-signature-style] handle multiline params ([#1861](https://github.com/typescript-eslint/typescript-eslint/issues/1861)) ([5832a86](https://github.com/typescript-eslint/typescript-eslint/commit/5832a8643bbe174ec02df5966bb333e506e45f5d))
+* **eslint-plugin:** [no-empty-interface] use suggestion fixer for ambient contexts ([#1880](https://github.com/typescript-eslint/typescript-eslint/issues/1880)) ([62b2278](https://github.com/typescript-eslint/typescript-eslint/commit/62b2278aec0011c93eae17bed8b278114d3379a2))
+* **eslint-plugin:** [unbound-method] false positive on property function initializer ([#1890](https://github.com/typescript-eslint/typescript-eslint/issues/1890)) ([f1c3b18](https://github.com/typescript-eslint/typescript-eslint/commit/f1c3b18f7aadc81f7dca7aa32aa1a8fe424e04e7))
+* **eslint-plugin:** [unbound-method] ignore assignments _to_ methods ([#1736](https://github.com/typescript-eslint/typescript-eslint/issues/1736)) ([6b4680b](https://github.com/typescript-eslint/typescript-eslint/commit/6b4680b6e7343d9d98fa1de170f387a36d98b73e))
+* **eslint-plugin:** no-empty-interface autofix ([#1865](https://github.com/typescript-eslint/typescript-eslint/issues/1865)) ([829a2f7](https://github.com/typescript-eslint/typescript-eslint/commit/829a2f728f876d356908e2338c2d6620e58f9943)), closes [#1864](https://github.com/typescript-eslint/typescript-eslint/issues/1864)
+* **eslint-plugin:** use `isTypeArrayTypeOrUnionOfArrayTypes` util for checking if type is array ([#1728](https://github.com/typescript-eslint/typescript-eslint/issues/1728)) ([05030f8](https://github.com/typescript-eslint/typescript-eslint/commit/05030f8d2bd5a50e95053bc61380891da71cc567))
+
+
+### Features
+
+* **eslint-plugin:** [ban-ts-comment] support `ts-expect-error` ([#1706](https://github.com/typescript-eslint/typescript-eslint/issues/1706)) ([469cff3](https://github.com/typescript-eslint/typescript-eslint/commit/469cff332c041f38f60de052769287342455cff1))
+* **eslint-plugin:** [consistent-type-assertions] always allow `const` assertions ([#1713](https://github.com/typescript-eslint/typescript-eslint/issues/1713)) ([af2c00d](https://github.com/typescript-eslint/typescript-eslint/commit/af2c00de62f7e31eaeb88996ebf3f330cc8473b9))
+* **eslint-plugin:** [explicit-function-return-type] add option to allow concise arrows that start with void ([#1732](https://github.com/typescript-eslint/typescript-eslint/issues/1732)) ([2e9c202](https://github.com/typescript-eslint/typescript-eslint/commit/2e9c2028a8a0b226e0f87d4bcc997fa259ca3ebd))
+* **eslint-plugin:** [explicit-module-boundary-types] add optio… ([#1778](https://github.com/typescript-eslint/typescript-eslint/issues/1778)) ([3eee804](https://github.com/typescript-eslint/typescript-eslint/commit/3eee804461d017ea6189cd7f64fcd473623684b4))
+* **eslint-plugin:** [no-base-to-string] add option to ignore tagged templates ([#1763](https://github.com/typescript-eslint/typescript-eslint/issues/1763)) ([f5edb99](https://github.com/typescript-eslint/typescript-eslint/commit/f5edb9938c33f8b68f026eba00db3abe9359ced3))
+* **eslint-plugin:** [restrict-template-expressions] add option `allowAny` ([#1762](https://github.com/typescript-eslint/typescript-eslint/issues/1762)) ([d44c0f9](https://github.com/typescript-eslint/typescript-eslint/commit/d44c0f9bed2404ca00b020b35fd825929e213398))
+* **eslint-plugin:** add rule `prefer-reduce-type-parameter` ([#1707](https://github.com/typescript-eslint/typescript-eslint/issues/1707)) ([c92d240](https://github.com/typescript-eslint/typescript-eslint/commit/c92d240e49113779053eac32038382b282812afc))
+* **eslint-plugin:** add rule `prefer-ts-expect-error` ([#1705](https://github.com/typescript-eslint/typescript-eslint/issues/1705)) ([7021f21](https://github.com/typescript-eslint/typescript-eslint/commit/7021f2151a25db2a8edf17e06cd6f21e90761ec8))
+* **eslint-plugin:** add rule no-unsafe-assignment ([#1694](https://github.com/typescript-eslint/typescript-eslint/issues/1694)) ([a49b860](https://github.com/typescript-eslint/typescript-eslint/commit/a49b860cbbb2c7d718b99f561e2fb6eaadf16f17))
+
+
+
+
+
+# [2.27.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.26.0...v2.27.0) (2020-04-06)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-throw-literal] fix crash caused by getBaseTypes ([#1830](https://github.com/typescript-eslint/typescript-eslint/issues/1830)) ([9d53c76](https://github.com/typescript-eslint/typescript-eslint/commit/9d53c761983dd964109b9f13eb9bfe20caf9defb))
+* **eslint-plugin:** [no-unsafe-call] fix incorrect selector ([#1826](https://github.com/typescript-eslint/typescript-eslint/issues/1826)) ([8ec53a3](https://github.com/typescript-eslint/typescript-eslint/commit/8ec53a3579fcb59cdffea0c60fbb755d056f4c8a))
+* **eslint-plugin:** [require-await] handle async generators ([#1782](https://github.com/typescript-eslint/typescript-eslint/issues/1782)) ([9642d9d](https://github.com/typescript-eslint/typescript-eslint/commit/9642d9dce693befac89a4e9d8bf8dd18f4361e2a))
+* **eslint-plugin:** no-explicit-any constructor functions (& mo… ([#1711](https://github.com/typescript-eslint/typescript-eslint/issues/1711)) ([ab8572e](https://github.com/typescript-eslint/typescript-eslint/commit/ab8572e30e14ebda91c8437be5ee35e7dc9add2e))
+
+
+### Features
+
+* **eslint-plugin:** new rule method-signature-style ([#1685](https://github.com/typescript-eslint/typescript-eslint/issues/1685)) ([c49d771](https://github.com/typescript-eslint/typescript-eslint/commit/c49d771ba62f1a21d3c1aec106341daddfcd3c9a))
+* **eslint-plugin:** sort members alphabetically ([#263](https://github.com/typescript-eslint/typescript-eslint/issues/263)) ([485e902](https://github.com/typescript-eslint/typescript-eslint/commit/485e90213a0f8baac0587f7d56925448883fc5bd))
+* **eslint-plugin-internal:** add plugin-test-formatting rule ([#1821](https://github.com/typescript-eslint/typescript-eslint/issues/1821)) ([9b0023a](https://github.com/typescript-eslint/typescript-eslint/commit/9b0023a4996ecdd7dfcb30abd1678091a78f3064))
+
+
+
+
+
+# [2.26.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.25.0...v2.26.0) (2020-03-30)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-explicit-any] error with ignoreRestArgs ([#1796](https://github.com/typescript-eslint/typescript-eslint/issues/1796)) ([638d84d](https://github.com/typescript-eslint/typescript-eslint/commit/638d84ddd77d07117b3ec7c5431f3b0e44b1995d))
+* **eslint-plugin:** [no-unsafe-call] allow import expressions ([#1800](https://github.com/typescript-eslint/typescript-eslint/issues/1800)) ([4fa7107](https://github.com/typescript-eslint/typescript-eslint/commit/4fa710754ecc412b65ac3864fe0c7857c254ac1b))
+* **eslint-plugin:** [no-unsafe-return] error with <TS3.7 ([#1815](https://github.com/typescript-eslint/typescript-eslint/issues/1815)) ([f3160b4](https://github.com/typescript-eslint/typescript-eslint/commit/f3160b471f8247e157555b6cf5b40a1f6ccdc233))
+
+
+
+
+
+# [2.25.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.24.0...v2.25.0) (2020-03-23)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [quotes] false positive with backtick in import equals statement ([#1769](https://github.com/typescript-eslint/typescript-eslint/issues/1769)) ([199863d](https://github.com/typescript-eslint/typescript-eslint/commit/199863d35cb36bdb7178b8116d146258506644c7))
+* **eslint-plugin:** fix message of no-base-to-string ([#1755](https://github.com/typescript-eslint/typescript-eslint/issues/1755)) ([6646959](https://github.com/typescript-eslint/typescript-eslint/commit/6646959b255b08afe5175bba6621bad11b9e1d5e))
+
+
+### Features
+
+* **eslint-plugin:** [no-unnec-type-assertion] allow const assertions ([#1741](https://github.com/typescript-eslint/typescript-eslint/issues/1741)) ([f76a1b3](https://github.com/typescript-eslint/typescript-eslint/commit/f76a1b3e63afda9f239e46f4ad5b36c1d7a6e8da))
+* **eslint-plugin:** [no-unnecessary-condition] ignore basic array indexing false positives ([#1534](https://github.com/typescript-eslint/typescript-eslint/issues/1534)) ([2b9603d](https://github.com/typescript-eslint/typescript-eslint/commit/2b9603d868c57556d8cd6087685e798d74cb6f26))
+* **eslint-plugin:** add `class-literal-property-style` rule ([#1582](https://github.com/typescript-eslint/typescript-eslint/issues/1582)) ([b2dbd89](https://github.com/typescript-eslint/typescript-eslint/commit/b2dbd890a5bef81aa6978d68c166457838ee04a1))
+* **experimental-utils:** expose ast utility functions ([#1670](https://github.com/typescript-eslint/typescript-eslint/issues/1670)) ([3eb5d45](https://github.com/typescript-eslint/typescript-eslint/commit/3eb5d4525e95c8ab990f55588b8d830a02ce5a9c))
+
+
+
+
+
+# [2.24.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.23.0...v2.24.0) (2020-03-16)
+
+**Note:** Version bump only for package @typescript-eslint/eslint-plugin
+
+
+
+
+
+# [2.23.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.22.0...v2.23.0) (2020-03-09)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [prefer-readonly-parameter-types] handle recursive types ([#1672](https://github.com/typescript-eslint/typescript-eslint/issues/1672)) ([e5db36f](https://github.com/typescript-eslint/typescript-eslint/commit/e5db36f140b6463965858ad4ed77f71a9a00c5a7)), closes [#1665](https://github.com/typescript-eslint/typescript-eslint/issues/1665)
+* **eslint-plugin:** [type-annotation-spacing] handle constructor types ([#1664](https://github.com/typescript-eslint/typescript-eslint/issues/1664)) ([fbf1640](https://github.com/typescript-eslint/typescript-eslint/commit/fbf1640c5ab67770a1ace5a9bad2bddfa35bd88d)), closes [#1663](https://github.com/typescript-eslint/typescript-eslint/issues/1663)
+* **eslint-plugin:** fix autofixer for computed properties ([#1662](https://github.com/typescript-eslint/typescript-eslint/issues/1662)) ([ba22ea7](https://github.com/typescript-eslint/typescript-eslint/commit/ba22ea7f604b236828ce4dcff75831ec1da01ec1))
+* **eslint-plugin:** fix placeholder in `ban-ts-comment` ([#1703](https://github.com/typescript-eslint/typescript-eslint/issues/1703)) ([144345c](https://github.com/typescript-eslint/typescript-eslint/commit/144345c4774c0664752116ef2cf28f46cf52052f))
+
+
+### Features
+
+* **eslint-plugin:** [no-unsafe-call] support tagged templates ([#1680](https://github.com/typescript-eslint/typescript-eslint/issues/1680)) ([55a58ff](https://github.com/typescript-eslint/typescript-eslint/commit/55a58ff0ae0434970537657ec2cb0bc7ab64c13d))
+* **eslint-plugin:** [no-unsafe-member-access] report any typed… ([#1683](https://github.com/typescript-eslint/typescript-eslint/issues/1683)) ([1543117](https://github.com/typescript-eslint/typescript-eslint/commit/1543117874047726a6bc1b71bd2f68779f266591))
+* **eslint-plugin:** add rule no-unsafe-call ([#1647](https://github.com/typescript-eslint/typescript-eslint/issues/1647)) ([91423e4](https://github.com/typescript-eslint/typescript-eslint/commit/91423e49d19163fae7b03cbc79bb3cd3db8c2c6d))
+* **eslint-plugin:** add rule no-unsafe-member-access ([#1643](https://github.com/typescript-eslint/typescript-eslint/issues/1643)) ([608a750](https://github.com/typescript-eslint/typescript-eslint/commit/608a750d53c39e892fdb982aeea9e4f9c5e2382d))
+* **eslint-plugin:** add rule no-unsafe-return ([#1644](https://github.com/typescript-eslint/typescript-eslint/issues/1644)) ([cfc3ef1](https://github.com/typescript-eslint/typescript-eslint/commit/cfc3ef10941f46cdbc084e99e1d48d6d3a928903))
+
+
+
+
+
 # [2.22.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.21.0...v2.22.0) (2020-03-02)
 
 
diff --git a/node_modules/@typescript-eslint/eslint-plugin/README.md b/node_modules/@typescript-eslint/eslint-plugin/README.md
index 19ee263..37a27ca 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/README.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/README.md
@@ -1,11 +1,11 @@
 <h1 align="center">ESLint Plugin TypeScript</h1>
 
+<p align="center">An ESLint plugin which provides lint rules for TypeScript codebases.</p>
+
 <p align="center">
-    <a href="https://dev.azure.com/typescript-eslint/TypeScript%20ESLint/_build/latest?definitionId=1&branchName=master"><img src="https://img.shields.io/azure-devops/build/typescript-eslint/TypeScript%20ESLint/1/master.svg?label=%F0%9F%9A%80%20Azure%20Pipelines&style=flat-square" alt="Azure Pipelines"/></a>
-    <a href="https://github.com/typescript-eslint/typescript-eslint/blob/master/LICENSE"><img src="https://img.shields.io/npm/l/typescript-estree.svg?style=flat-square" alt="GitHub license" /></a>
+    <img src="https://github.com/typescript-eslint/typescript-eslint/workflows/CI/badge.svg" alt="CI" />
     <a href="https://www.npmjs.com/package/@typescript-eslint/eslint-plugin"><img src="https://img.shields.io/npm/v/@typescript-eslint/eslint-plugin.svg?style=flat-square" alt="NPM Version" /></a>
     <a href="https://www.npmjs.com/package/@typescript-eslint/eslint-plugin"><img src="https://img.shields.io/npm/dm/@typescript-eslint/eslint-plugin.svg?style=flat-square" alt="NPM Downloads" /></a>
-    <a href="http://commitizen.github.io/cz-cli/"><img src="https://img.shields.io/badge/commitizen-friendly-brightgreen.svg?style=flat-square" alt="Commitizen friendly" /></a>
 </p>
 
 ## Getting Started
@@ -19,10 +19,18 @@
 
 ### Installation
 
-Make sure you have TypeScript and [`@typescript-eslint/parser`](../parser) installed, then install the plugin:
+Make sure you have TypeScript and [`@typescript-eslint/parser`](../parser) installed:
 
-```sh
-yarn add -D @typescript-eslint/eslint-plugin
+```bash
+$ yarn add -D typescript @typescript-eslint/parser
+$ npm i --save-dev typescript @typescript-eslint/parser
+```
+
+Then install the plugin:
+
+```bash
+$ yarn add -D @typescript-eslint/eslint-plugin
+$ npm i --save-dev @typescript-eslint/eslint-plugin
 ```
 
 It is important that you use the same version number for `@typescript-eslint/parser` and `@typescript-eslint/eslint-plugin`.
@@ -55,15 +63,11 @@
 
 ### Recommended Configs
 
-You can also use [`eslint:recommended`](https://eslint.org/docs/rules/) (the set of rules which are recommended for all projects by the ESLint Team) with this plugin. As noted in the root README, not all ESLint core rules are compatible with TypeScript, so you need to add both `eslint:recommended` and `plugin:@typescript-eslint/eslint-recommended` (which will adjust the one from ESLint appropriately for TypeScript) to your config:
+You can also use [`eslint:recommended`](https://eslint.org/docs/rules/) (the set of rules which are recommended for all projects by the ESLint Team) with this plugin:
 
 ```json
 {
-  "extends": [
-    "eslint:recommended",
-    "plugin:@typescript-eslint/eslint-recommended",
-    "plugin:@typescript-eslint/recommended"
-  ]
+  "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"]
 }
 ```
 
@@ -75,7 +79,6 @@
 {
   "extends": [
     "eslint:recommended",
-    "plugin:@typescript-eslint/eslint-recommended",
     "plugin:@typescript-eslint/recommended",
     "plugin:@typescript-eslint/recommended-requiring-type-checking"
   ]
@@ -97,30 +100,37 @@
 | [`@typescript-eslint/adjacent-overload-signatures`](./docs/rules/adjacent-overload-signatures.md)                     | Require that member overloads be consecutive                                                                            | :heavy_check_mark: |          |                   |
 | [`@typescript-eslint/array-type`](./docs/rules/array-type.md)                                                         | Requires using either `T[]` or `Array<T>` for arrays                                                                    |                    | :wrench: |                   |
 | [`@typescript-eslint/await-thenable`](./docs/rules/await-thenable.md)                                                 | Disallows awaiting a value that is not a Thenable                                                                       | :heavy_check_mark: |          | :thought_balloon: |
-| [`@typescript-eslint/ban-ts-comment`](./docs/rules/ban-ts-comment.md)                                                 | Bans `// @ts-<directive>` comments from being used                                                                      |                    |          |                   |
+| [`@typescript-eslint/ban-ts-comment`](./docs/rules/ban-ts-comment.md)                                                 | Bans `// @ts-<directive>` comments from being used or requires descriptions after directive                             | :heavy_check_mark: |          |                   |
+| [`@typescript-eslint/ban-tslint-comment`](./docs/rules/ban-tslint-comment.md)                                         | Bans `// tslint:<rule-flag>` comments from being used                                                                   |                    | :wrench: |                   |
 | [`@typescript-eslint/ban-types`](./docs/rules/ban-types.md)                                                           | Bans specific types from being used                                                                                     | :heavy_check_mark: | :wrench: |                   |
-| [`@typescript-eslint/consistent-type-assertions`](./docs/rules/consistent-type-assertions.md)                         | Enforces consistent usage of type assertions                                                                            | :heavy_check_mark: |          |                   |
+| [`@typescript-eslint/class-literal-property-style`](./docs/rules/class-literal-property-style.md)                     | Ensures that literals on classes are exposed in a consistent style                                                      |                    | :wrench: |                   |
+| [`@typescript-eslint/consistent-type-assertions`](./docs/rules/consistent-type-assertions.md)                         | Enforces consistent usage of type assertions                                                                            |                    |          |                   |
 | [`@typescript-eslint/consistent-type-definitions`](./docs/rules/consistent-type-definitions.md)                       | Consistent with type definition either `interface` or `type`                                                            |                    | :wrench: |                   |
-| [`@typescript-eslint/explicit-function-return-type`](./docs/rules/explicit-function-return-type.md)                   | Require explicit return types on functions and class methods                                                            | :heavy_check_mark: |          |                   |
+| [`@typescript-eslint/consistent-type-imports`](./docs/rules/consistent-type-imports.md)                               | Enforces consistent usage of type imports                                                                               |                    | :wrench: |                   |
+| [`@typescript-eslint/explicit-function-return-type`](./docs/rules/explicit-function-return-type.md)                   | Require explicit return types on functions and class methods                                                            |                    |          |                   |
 | [`@typescript-eslint/explicit-member-accessibility`](./docs/rules/explicit-member-accessibility.md)                   | Require explicit accessibility modifiers on class properties and methods                                                |                    | :wrench: |                   |
-| [`@typescript-eslint/explicit-module-boundary-types`](./docs/rules/explicit-module-boundary-types.md)                 | Require explicit return and argument types on exported functions' and classes' public class methods                     |                    |          |                   |
-| [`@typescript-eslint/member-delimiter-style`](./docs/rules/member-delimiter-style.md)                                 | Require a specific member delimiter style for interfaces and type literals                                              | :heavy_check_mark: | :wrench: |                   |
+| [`@typescript-eslint/explicit-module-boundary-types`](./docs/rules/explicit-module-boundary-types.md)                 | Require explicit return and argument types on exported functions' and classes' public class methods                     | :heavy_check_mark: |          |                   |
+| [`@typescript-eslint/member-delimiter-style`](./docs/rules/member-delimiter-style.md)                                 | Require a specific member delimiter style for interfaces and type literals                                              |                    | :wrench: |                   |
 | [`@typescript-eslint/member-ordering`](./docs/rules/member-ordering.md)                                               | Require a consistent member declaration order                                                                           |                    |          |                   |
+| [`@typescript-eslint/method-signature-style`](./docs/rules/method-signature-style.md)                                 | Enforces using a particular method signature syntax.                                                                    |                    | :wrench: |                   |
 | [`@typescript-eslint/naming-convention`](./docs/rules/naming-convention.md)                                           | Enforces naming conventions for everything across a codebase                                                            |                    |          | :thought_balloon: |
 | [`@typescript-eslint/no-base-to-string`](./docs/rules/no-base-to-string.md)                                           | Requires that `.toString()` is only called on objects which provide useful information when stringified                 |                    |          | :thought_balloon: |
+| [`@typescript-eslint/no-confusing-non-null-assertion`](./docs/rules/no-confusing-non-null-assertion.md)               | Disallow non-null assertion in locations that may be confusing                                                          |                    | :wrench: |                   |
 | [`@typescript-eslint/no-dynamic-delete`](./docs/rules/no-dynamic-delete.md)                                           | Disallow the delete operator with computed key expressions                                                              |                    | :wrench: |                   |
 | [`@typescript-eslint/no-empty-interface`](./docs/rules/no-empty-interface.md)                                         | Disallow the declaration of empty interfaces                                                                            | :heavy_check_mark: | :wrench: |                   |
 | [`@typescript-eslint/no-explicit-any`](./docs/rules/no-explicit-any.md)                                               | Disallow usage of the `any` type                                                                                        | :heavy_check_mark: | :wrench: |                   |
-| [`@typescript-eslint/no-extra-non-null-assertion`](./docs/rules/no-extra-non-null-assertion.md)                       | Disallow extra non-null assertion                                                                                       |                    | :wrench: |                   |
+| [`@typescript-eslint/no-extra-non-null-assertion`](./docs/rules/no-extra-non-null-assertion.md)                       | Disallow extra non-null assertion                                                                                       | :heavy_check_mark: | :wrench: |                   |
 | [`@typescript-eslint/no-extraneous-class`](./docs/rules/no-extraneous-class.md)                                       | Forbids the use of classes as namespaces                                                                                |                    |          |                   |
-| [`@typescript-eslint/no-floating-promises`](./docs/rules/no-floating-promises.md)                                     | Requires Promise-like values to be handled appropriately                                                                |                    |          | :thought_balloon: |
+| [`@typescript-eslint/no-floating-promises`](./docs/rules/no-floating-promises.md)                                     | Requires Promise-like values to be handled appropriately                                                                | :heavy_check_mark: |          | :thought_balloon: |
 | [`@typescript-eslint/no-for-in-array`](./docs/rules/no-for-in-array.md)                                               | Disallow iterating over an array with a for-in loop                                                                     | :heavy_check_mark: |          | :thought_balloon: |
-| [`@typescript-eslint/no-implied-eval`](./docs/rules/no-implied-eval.md)                                               | Disallow the use of `eval()`-like methods                                                                               |                    |          | :thought_balloon: |
+| [`@typescript-eslint/no-implicit-any-catch`](./docs/rules/no-implicit-any-catch.md)                                   | Disallow usage of the implicit `any` type in catch clauses                                                              |                    | :wrench: |                   |
+| [`@typescript-eslint/no-implied-eval`](./docs/rules/no-implied-eval.md)                                               | Disallow the use of `eval()`-like methods                                                                               | :heavy_check_mark: |          | :thought_balloon: |
 | [`@typescript-eslint/no-inferrable-types`](./docs/rules/no-inferrable-types.md)                                       | Disallows explicit type declarations for variables or parameters initialized to a number, string, or boolean            | :heavy_check_mark: | :wrench: |                   |
+| [`@typescript-eslint/no-invalid-void-type`](./docs/rules/no-invalid-void-type.md)                                     | Disallows usage of `void` type outside of generic or return types                                                       |                    |          |                   |
 | [`@typescript-eslint/no-misused-new`](./docs/rules/no-misused-new.md)                                                 | Enforce valid definition of `new` and `constructor`                                                                     | :heavy_check_mark: |          |                   |
 | [`@typescript-eslint/no-misused-promises`](./docs/rules/no-misused-promises.md)                                       | Avoid using promises in places not designed to handle them                                                              | :heavy_check_mark: |          | :thought_balloon: |
 | [`@typescript-eslint/no-namespace`](./docs/rules/no-namespace.md)                                                     | Disallow the use of custom TypeScript modules and namespaces                                                            | :heavy_check_mark: |          |                   |
-| [`@typescript-eslint/no-non-null-asserted-optional-chain`](./docs/rules/no-non-null-asserted-optional-chain.md)       | Disallows using a non-null assertion after an optional chain expression                                                 |                    |          |                   |
+| [`@typescript-eslint/no-non-null-asserted-optional-chain`](./docs/rules/no-non-null-asserted-optional-chain.md)       | Disallows using a non-null assertion after an optional chain expression                                                 | :heavy_check_mark: |          |                   |
 | [`@typescript-eslint/no-non-null-assertion`](./docs/rules/no-non-null-assertion.md)                                   | Disallows non-null assertions using the `!` postfix operator                                                            | :heavy_check_mark: |          |                   |
 | [`@typescript-eslint/no-parameter-properties`](./docs/rules/no-parameter-properties.md)                               | Disallow the use of parameter properties in class constructors                                                          |                    |          |                   |
 | [`@typescript-eslint/no-require-imports`](./docs/rules/no-require-imports.md)                                         | Disallows invocation of `require()`                                                                                     |                    |          |                   |
@@ -132,27 +142,34 @@
 | [`@typescript-eslint/no-unnecessary-qualifier`](./docs/rules/no-unnecessary-qualifier.md)                             | Warns when a namespace qualifier is unnecessary                                                                         |                    | :wrench: | :thought_balloon: |
 | [`@typescript-eslint/no-unnecessary-type-arguments`](./docs/rules/no-unnecessary-type-arguments.md)                   | Enforces that type arguments will not be used if not required                                                           |                    | :wrench: | :thought_balloon: |
 | [`@typescript-eslint/no-unnecessary-type-assertion`](./docs/rules/no-unnecessary-type-assertion.md)                   | Warns if a type assertion does not change the type of an expression                                                     | :heavy_check_mark: | :wrench: | :thought_balloon: |
-| [`@typescript-eslint/no-unused-vars-experimental`](./docs/rules/no-unused-vars-experimental.md)                       | Disallow unused variables and arguments                                                                                 |                    |          | :thought_balloon: |
+| [`@typescript-eslint/no-unsafe-assignment`](./docs/rules/no-unsafe-assignment.md)                                     | Disallows assigning any to variables and properties                                                                     | :heavy_check_mark: |          | :thought_balloon: |
+| [`@typescript-eslint/no-unsafe-call`](./docs/rules/no-unsafe-call.md)                                                 | Disallows calling an any type value                                                                                     | :heavy_check_mark: |          | :thought_balloon: |
+| [`@typescript-eslint/no-unsafe-member-access`](./docs/rules/no-unsafe-member-access.md)                               | Disallows member access on any typed variables                                                                          | :heavy_check_mark: |          | :thought_balloon: |
+| [`@typescript-eslint/no-unsafe-return`](./docs/rules/no-unsafe-return.md)                                             | Disallows returning any from a function                                                                                 | :heavy_check_mark: |          | :thought_balloon: |
 | [`@typescript-eslint/no-var-requires`](./docs/rules/no-var-requires.md)                                               | Disallows the use of require statements except in import statements                                                     | :heavy_check_mark: |          |                   |
-| [`@typescript-eslint/prefer-as-const`](./docs/rules/prefer-as-const.md)                                               | Prefer usage of `as const` over literal type                                                                            |                    | :wrench: |                   |
+| [`@typescript-eslint/prefer-as-const`](./docs/rules/prefer-as-const.md)                                               | Prefer usage of `as const` over literal type                                                                            | :heavy_check_mark: | :wrench: |                   |
+| [`@typescript-eslint/prefer-enum-initializers`](./docs/rules/prefer-enum-initializers.md)                             | Prefer initializing each enums member value                                                                             |                    |          |                   |
 | [`@typescript-eslint/prefer-for-of`](./docs/rules/prefer-for-of.md)                                                   | Prefer a ‘for-of’ loop over a standard ‘for’ loop if the index is only used to access the array being iterated          |                    |          |                   |
 | [`@typescript-eslint/prefer-function-type`](./docs/rules/prefer-function-type.md)                                     | Use function types instead of interfaces with call signatures                                                           |                    | :wrench: |                   |
-| [`@typescript-eslint/prefer-includes`](./docs/rules/prefer-includes.md)                                               | Enforce `includes` method over `indexOf` method                                                                         | :heavy_check_mark: | :wrench: | :thought_balloon: |
+| [`@typescript-eslint/prefer-includes`](./docs/rules/prefer-includes.md)                                               | Enforce `includes` method over `indexOf` method                                                                         |                    | :wrench: | :thought_balloon: |
+| [`@typescript-eslint/prefer-literal-enum-member`](./docs/rules/prefer-literal-enum-member.md)                         | Require that all enum members be literal values to prevent unintended enum member name shadow issues                    |                    |          |                   |
 | [`@typescript-eslint/prefer-namespace-keyword`](./docs/rules/prefer-namespace-keyword.md)                             | Require the use of the `namespace` keyword instead of the `module` keyword to declare custom TypeScript modules         | :heavy_check_mark: | :wrench: |                   |
-| [`@typescript-eslint/prefer-nullish-coalescing`](./docs/rules/prefer-nullish-coalescing.md)                           | Enforce the usage of the nullish coalescing operator instead of logical chaining                                        |                    | :wrench: | :thought_balloon: |
-| [`@typescript-eslint/prefer-optional-chain`](./docs/rules/prefer-optional-chain.md)                                   | Prefer using concise optional chain expressions instead of chained logical ands                                         |                    | :wrench: |                   |
+| [`@typescript-eslint/prefer-nullish-coalescing`](./docs/rules/prefer-nullish-coalescing.md)                           | Enforce the usage of the nullish coalescing operator instead of logical chaining                                        |                    |          | :thought_balloon: |
+| [`@typescript-eslint/prefer-optional-chain`](./docs/rules/prefer-optional-chain.md)                                   | Prefer using concise optional chain expressions instead of chained logical ands                                         |                    |          |                   |
 | [`@typescript-eslint/prefer-readonly`](./docs/rules/prefer-readonly.md)                                               | Requires that private members are marked as `readonly` if they're never modified outside of the constructor             |                    | :wrench: | :thought_balloon: |
 | [`@typescript-eslint/prefer-readonly-parameter-types`](./docs/rules/prefer-readonly-parameter-types.md)               | Requires that function parameters are typed as readonly to prevent accidental mutation of inputs                        |                    |          | :thought_balloon: |
+| [`@typescript-eslint/prefer-reduce-type-parameter`](./docs/rules/prefer-reduce-type-parameter.md)                     | Prefer using type parameter when calling `Array#reduce` instead of casting                                              |                    | :wrench: | :thought_balloon: |
 | [`@typescript-eslint/prefer-regexp-exec`](./docs/rules/prefer-regexp-exec.md)                                         | Enforce that `RegExp#exec` is used instead of `String#match` if no global flag is provided                              | :heavy_check_mark: |          | :thought_balloon: |
-| [`@typescript-eslint/prefer-string-starts-ends-with`](./docs/rules/prefer-string-starts-ends-with.md)                 | Enforce the use of `String#startsWith` and `String#endsWith` instead of other equivalent methods of checking substrings | :heavy_check_mark: | :wrench: | :thought_balloon: |
+| [`@typescript-eslint/prefer-string-starts-ends-with`](./docs/rules/prefer-string-starts-ends-with.md)                 | Enforce the use of `String#startsWith` and `String#endsWith` instead of other equivalent methods of checking substrings |                    | :wrench: | :thought_balloon: |
+| [`@typescript-eslint/prefer-ts-expect-error`](./docs/rules/prefer-ts-expect-error.md)                                 | Recommends using `@ts-expect-error` over `@ts-ignore`                                                                   |                    | :wrench: |                   |
 | [`@typescript-eslint/promise-function-async`](./docs/rules/promise-function-async.md)                                 | Requires any function or method that returns a Promise to be marked async                                               |                    |          | :thought_balloon: |
 | [`@typescript-eslint/require-array-sort-compare`](./docs/rules/require-array-sort-compare.md)                         | Requires `Array#sort` calls to always provide a `compareFunction`                                                       |                    |          | :thought_balloon: |
-| [`@typescript-eslint/restrict-plus-operands`](./docs/rules/restrict-plus-operands.md)                                 | When adding two variables, operands must both be of type number or of type string                                       |                    |          | :thought_balloon: |
-| [`@typescript-eslint/restrict-template-expressions`](./docs/rules/restrict-template-expressions.md)                   | Enforce template literal expressions to be of string type                                                               |                    |          | :thought_balloon: |
+| [`@typescript-eslint/restrict-plus-operands`](./docs/rules/restrict-plus-operands.md)                                 | When adding two variables, operands must both be of type number or of type string                                       | :heavy_check_mark: |          | :thought_balloon: |
+| [`@typescript-eslint/restrict-template-expressions`](./docs/rules/restrict-template-expressions.md)                   | Enforce template literal expressions to be of string type                                                               | :heavy_check_mark: |          | :thought_balloon: |
 | [`@typescript-eslint/strict-boolean-expressions`](./docs/rules/strict-boolean-expressions.md)                         | Restricts the types allowed in boolean expressions                                                                      |                    |          | :thought_balloon: |
 | [`@typescript-eslint/switch-exhaustiveness-check`](./docs/rules/switch-exhaustiveness-check.md)                       | Exhaustiveness checking in switch with union type                                                                       |                    |          | :thought_balloon: |
 | [`@typescript-eslint/triple-slash-reference`](./docs/rules/triple-slash-reference.md)                                 | Sets preference level for triple slash directives versus ES6-style import declarations                                  | :heavy_check_mark: |          |                   |
-| [`@typescript-eslint/type-annotation-spacing`](./docs/rules/type-annotation-spacing.md)                               | Require consistent spacing around type annotations                                                                      | :heavy_check_mark: | :wrench: |                   |
+| [`@typescript-eslint/type-annotation-spacing`](./docs/rules/type-annotation-spacing.md)                               | Require consistent spacing around type annotations                                                                      |                    | :wrench: |                   |
 | [`@typescript-eslint/typedef`](./docs/rules/typedef.md)                                                               | Requires type annotations to exist                                                                                      |                    |          |                   |
 | [`@typescript-eslint/unbound-method`](./docs/rules/unbound-method.md)                                                 | Enforces unbound methods are called with their expected scope                                                           | :heavy_check_mark: |          | :thought_balloon: |
 | [`@typescript-eslint/unified-signatures`](./docs/rules/unified-signatures.md)                                         | Warns for any two overloads that could be unified into one by using a union or an optional/rest parameter               |                    |          |                   |
@@ -168,28 +185,38 @@
 
 **Key**: :heavy_check_mark: = recommended, :wrench: = fixable, :thought_balloon: = requires type information
 
-| Name                                                                                            | Description                                                                    | :heavy_check_mark: | :wrench: | :thought_balloon: |
-| ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | ------------------ | -------- | ----------------- |
-| [`@typescript-eslint/brace-style`](./docs/rules/brace-style.md)                                 | Enforce consistent brace style for blocks                                      |                    | :wrench: |                   |
-| [`@typescript-eslint/comma-spacing`](./docs/rules/comma-spacing.md)                             | Enforces consistent spacing before and after commas                            |                    | :wrench: |                   |
-| [`@typescript-eslint/default-param-last`](./docs/rules/default-param-last.md)                   | Enforce default parameters to be last                                          |                    |          |                   |
-| [`@typescript-eslint/func-call-spacing`](./docs/rules/func-call-spacing.md)                     | Require or disallow spacing between function identifiers and their invocations |                    | :wrench: |                   |
-| [`@typescript-eslint/indent`](./docs/rules/indent.md)                                           | Enforce consistent indentation                                                 |                    | :wrench: |                   |
-| [`@typescript-eslint/no-array-constructor`](./docs/rules/no-array-constructor.md)               | Disallow generic `Array` constructors                                          | :heavy_check_mark: | :wrench: |                   |
-| [`@typescript-eslint/no-dupe-class-members`](./docs/rules/no-dupe-class-members.md)             | Disallow duplicate class members                                               |                    |          |                   |
-| [`@typescript-eslint/no-empty-function`](./docs/rules/no-empty-function.md)                     | Disallow empty functions                                                       | :heavy_check_mark: |          |                   |
-| [`@typescript-eslint/no-extra-parens`](./docs/rules/no-extra-parens.md)                         | Disallow unnecessary parentheses                                               |                    | :wrench: |                   |
-| [`@typescript-eslint/no-extra-semi`](./docs/rules/no-extra-semi.md)                             | Disallow unnecessary semicolons                                                |                    | :wrench: |                   |
-| [`@typescript-eslint/no-magic-numbers`](./docs/rules/no-magic-numbers.md)                       | Disallow magic numbers                                                         |                    |          |                   |
-| [`@typescript-eslint/no-unused-expressions`](./docs/rules/no-unused-expressions.md)             | Disallow unused expressions                                                    |                    |          |                   |
-| [`@typescript-eslint/no-unused-vars`](./docs/rules/no-unused-vars.md)                           | Disallow unused variables                                                      | :heavy_check_mark: |          |                   |
-| [`@typescript-eslint/no-use-before-define`](./docs/rules/no-use-before-define.md)               | Disallow the use of variables before they are defined                          | :heavy_check_mark: |          |                   |
-| [`@typescript-eslint/no-useless-constructor`](./docs/rules/no-useless-constructor.md)           | Disallow unnecessary constructors                                              |                    |          |                   |
-| [`@typescript-eslint/quotes`](./docs/rules/quotes.md)                                           | Enforce the consistent use of either backticks, double, or single quotes       |                    | :wrench: |                   |
-| [`@typescript-eslint/require-await`](./docs/rules/require-await.md)                             | Disallow async functions which have no `await` expression                      | :heavy_check_mark: |          | :thought_balloon: |
-| [`@typescript-eslint/return-await`](./docs/rules/return-await.md)                               | Enforces consistent returning of awaited values                                |                    | :wrench: | :thought_balloon: |
-| [`@typescript-eslint/semi`](./docs/rules/semi.md)                                               | Require or disallow semicolons instead of ASI                                  |                    | :wrench: |                   |
-| [`@typescript-eslint/space-before-function-paren`](./docs/rules/space-before-function-paren.md) | Enforces consistent spacing before function parenthesis                        |                    | :wrench: |                   |
+| Name                                                                                            | Description                                                                          | :heavy_check_mark: | :wrench: | :thought_balloon: |
+| ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | ------------------ | -------- | ----------------- |
+| [`@typescript-eslint/brace-style`](./docs/rules/brace-style.md)                                 | Enforce consistent brace style for blocks                                            |                    | :wrench: |                   |
+| [`@typescript-eslint/comma-dangle`](./docs/rules/comma-dangle.md)                               | Require or disallow trailing comma                                                   |                    | :wrench: |                   |
+| [`@typescript-eslint/comma-spacing`](./docs/rules/comma-spacing.md)                             | Enforces consistent spacing before and after commas                                  |                    | :wrench: |                   |
+| [`@typescript-eslint/default-param-last`](./docs/rules/default-param-last.md)                   | Enforce default parameters to be last                                                |                    |          |                   |
+| [`@typescript-eslint/dot-notation`](./docs/rules/dot-notation.md)                               | enforce dot notation whenever possible                                               |                    | :wrench: | :thought_balloon: |
+| [`@typescript-eslint/func-call-spacing`](./docs/rules/func-call-spacing.md)                     | Require or disallow spacing between function identifiers and their invocations       |                    | :wrench: |                   |
+| [`@typescript-eslint/indent`](./docs/rules/indent.md)                                           | Enforce consistent indentation                                                       |                    | :wrench: |                   |
+| [`@typescript-eslint/init-declarations`](./docs/rules/init-declarations.md)                     | require or disallow initialization in variable declarations                          |                    |          |                   |
+| [`@typescript-eslint/keyword-spacing`](./docs/rules/keyword-spacing.md)                         | Enforce consistent spacing before and after keywords                                 |                    | :wrench: |                   |
+| [`@typescript-eslint/lines-between-class-members`](./docs/rules/lines-between-class-members.md) | Require or disallow an empty line between class members                              |                    | :wrench: |                   |
+| [`@typescript-eslint/no-array-constructor`](./docs/rules/no-array-constructor.md)               | Disallow generic `Array` constructors                                                | :heavy_check_mark: | :wrench: |                   |
+| [`@typescript-eslint/no-dupe-class-members`](./docs/rules/no-dupe-class-members.md)             | Disallow duplicate class members                                                     |                    |          |                   |
+| [`@typescript-eslint/no-empty-function`](./docs/rules/no-empty-function.md)                     | Disallow empty functions                                                             | :heavy_check_mark: |          |                   |
+| [`@typescript-eslint/no-extra-parens`](./docs/rules/no-extra-parens.md)                         | Disallow unnecessary parentheses                                                     |                    | :wrench: |                   |
+| [`@typescript-eslint/no-extra-semi`](./docs/rules/no-extra-semi.md)                             | Disallow unnecessary semicolons                                                      | :heavy_check_mark: | :wrench: |                   |
+| [`@typescript-eslint/no-invalid-this`](./docs/rules/no-invalid-this.md)                         | disallow `this` keywords outside of classes or class-like objects                    |                    |          |                   |
+| [`@typescript-eslint/no-loop-func`](./docs/rules/no-loop-func.md)                               | Disallow function declarations that contain unsafe references inside loop statements |                    |          |                   |
+| [`@typescript-eslint/no-loss-of-precision`](./docs/rules/no-loss-of-precision.md)               | Disallow literal numbers that lose precision                                         |                    |          |                   |
+| [`@typescript-eslint/no-magic-numbers`](./docs/rules/no-magic-numbers.md)                       | Disallow magic numbers                                                               |                    |          |                   |
+| [`@typescript-eslint/no-redeclare`](./docs/rules/no-redeclare.md)                               | Disallow variable redeclaration                                                      |                    |          |                   |
+| [`@typescript-eslint/no-shadow`](./docs/rules/no-shadow.md)                                     | Disallow variable declarations from shadowing variables declared in the outer scope  |                    |          |                   |
+| [`@typescript-eslint/no-unused-expressions`](./docs/rules/no-unused-expressions.md)             | Disallow unused expressions                                                          |                    |          |                   |
+| [`@typescript-eslint/no-unused-vars`](./docs/rules/no-unused-vars.md)                           | Disallow unused variables                                                            | :heavy_check_mark: |          |                   |
+| [`@typescript-eslint/no-use-before-define`](./docs/rules/no-use-before-define.md)               | Disallow the use of variables before they are defined                                |                    |          |                   |
+| [`@typescript-eslint/no-useless-constructor`](./docs/rules/no-useless-constructor.md)           | Disallow unnecessary constructors                                                    |                    |          |                   |
+| [`@typescript-eslint/quotes`](./docs/rules/quotes.md)                                           | Enforce the consistent use of either backticks, double, or single quotes             |                    | :wrench: |                   |
+| [`@typescript-eslint/require-await`](./docs/rules/require-await.md)                             | Disallow async functions which have no `await` expression                            | :heavy_check_mark: |          | :thought_balloon: |
+| [`@typescript-eslint/return-await`](./docs/rules/return-await.md)                               | Enforces consistent returning of awaited values                                      |                    | :wrench: | :thought_balloon: |
+| [`@typescript-eslint/semi`](./docs/rules/semi.md)                                               | Require or disallow semicolons instead of ASI                                        |                    | :wrench: |                   |
+| [`@typescript-eslint/space-before-function-paren`](./docs/rules/space-before-function-paren.md) | Enforces consistent spacing before function parenthesis                              |                    | :wrench: |                   |
 
 <!-- end extension rule list -->
 
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/all.js b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/all.js
new file mode 100644
index 0000000..cf3bab7
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/all.js
@@ -0,0 +1,146 @@
+"use strict";
+// THIS CODE WAS AUTOMATICALLY GENERATED
+// DO NOT EDIT THIS CODE BY HAND
+// YOU CAN REGENERATE IT USING yarn generate:configs
+module.exports = {
+    extends: ['./configs/base', './configs/eslint-recommended'],
+    rules: {
+        '@typescript-eslint/adjacent-overload-signatures': 'error',
+        '@typescript-eslint/array-type': 'error',
+        '@typescript-eslint/await-thenable': 'error',
+        '@typescript-eslint/ban-ts-comment': 'error',
+        '@typescript-eslint/ban-tslint-comment': 'error',
+        '@typescript-eslint/ban-types': 'error',
+        'brace-style': 'off',
+        '@typescript-eslint/brace-style': 'error',
+        '@typescript-eslint/class-literal-property-style': 'error',
+        'comma-spacing': 'off',
+        '@typescript-eslint/comma-spacing': 'error',
+        '@typescript-eslint/consistent-type-assertions': 'error',
+        '@typescript-eslint/consistent-type-definitions': 'error',
+        '@typescript-eslint/consistent-type-imports': 'error',
+        'default-param-last': 'off',
+        '@typescript-eslint/default-param-last': 'error',
+        'dot-notation': 'off',
+        '@typescript-eslint/dot-notation': 'error',
+        '@typescript-eslint/explicit-function-return-type': 'error',
+        '@typescript-eslint/explicit-member-accessibility': 'error',
+        '@typescript-eslint/explicit-module-boundary-types': 'error',
+        'func-call-spacing': 'off',
+        '@typescript-eslint/func-call-spacing': 'error',
+        indent: 'off',
+        '@typescript-eslint/indent': 'error',
+        'init-declarations': 'off',
+        '@typescript-eslint/init-declarations': 'error',
+        'keyword-spacing': 'off',
+        '@typescript-eslint/keyword-spacing': 'error',
+        'lines-between-class-members': 'off',
+        '@typescript-eslint/lines-between-class-members': 'error',
+        '@typescript-eslint/member-delimiter-style': 'error',
+        '@typescript-eslint/member-ordering': 'error',
+        '@typescript-eslint/method-signature-style': 'error',
+        '@typescript-eslint/naming-convention': 'error',
+        'no-array-constructor': 'off',
+        '@typescript-eslint/no-array-constructor': 'error',
+        '@typescript-eslint/no-base-to-string': 'error',
+        '@typescript-eslint/no-confusing-non-null-assertion': 'error',
+        'no-dupe-class-members': 'off',
+        '@typescript-eslint/no-dupe-class-members': 'error',
+        '@typescript-eslint/no-dynamic-delete': 'error',
+        'no-empty-function': 'off',
+        '@typescript-eslint/no-empty-function': 'error',
+        '@typescript-eslint/no-empty-interface': 'error',
+        '@typescript-eslint/no-explicit-any': 'error',
+        '@typescript-eslint/no-extra-non-null-assertion': 'error',
+        'no-extra-parens': 'off',
+        '@typescript-eslint/no-extra-parens': 'error',
+        'no-extra-semi': 'off',
+        '@typescript-eslint/no-extra-semi': 'error',
+        '@typescript-eslint/no-extraneous-class': 'error',
+        '@typescript-eslint/no-floating-promises': 'error',
+        '@typescript-eslint/no-for-in-array': 'error',
+        '@typescript-eslint/no-implicit-any-catch': 'error',
+        '@typescript-eslint/no-implied-eval': 'error',
+        '@typescript-eslint/no-inferrable-types': 'error',
+        'no-invalid-this': 'off',
+        '@typescript-eslint/no-invalid-this': 'error',
+        '@typescript-eslint/no-invalid-void-type': 'error',
+        'no-loop-func': 'off',
+        '@typescript-eslint/no-loop-func': 'error',
+        'no-loss-of-precision': 'off',
+        '@typescript-eslint/no-loss-of-precision': 'error',
+        'no-magic-numbers': 'off',
+        '@typescript-eslint/no-magic-numbers': 'error',
+        '@typescript-eslint/no-misused-new': 'error',
+        '@typescript-eslint/no-misused-promises': 'error',
+        '@typescript-eslint/no-namespace': 'error',
+        '@typescript-eslint/no-non-null-asserted-optional-chain': 'error',
+        '@typescript-eslint/no-non-null-assertion': 'error',
+        '@typescript-eslint/no-parameter-properties': 'error',
+        'no-redeclare': 'off',
+        '@typescript-eslint/no-redeclare': 'error',
+        '@typescript-eslint/no-require-imports': 'error',
+        'no-shadow': 'off',
+        '@typescript-eslint/no-shadow': 'error',
+        '@typescript-eslint/no-this-alias': 'error',
+        '@typescript-eslint/no-throw-literal': 'error',
+        '@typescript-eslint/no-type-alias': 'error',
+        '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'error',
+        '@typescript-eslint/no-unnecessary-condition': 'error',
+        '@typescript-eslint/no-unnecessary-qualifier': 'error',
+        '@typescript-eslint/no-unnecessary-type-arguments': 'error',
+        '@typescript-eslint/no-unnecessary-type-assertion': 'error',
+        '@typescript-eslint/no-unsafe-assignment': 'error',
+        '@typescript-eslint/no-unsafe-call': 'error',
+        '@typescript-eslint/no-unsafe-member-access': 'error',
+        '@typescript-eslint/no-unsafe-return': 'error',
+        'no-unused-expressions': 'off',
+        '@typescript-eslint/no-unused-expressions': 'error',
+        'no-unused-vars': 'off',
+        '@typescript-eslint/no-unused-vars': 'error',
+        'no-use-before-define': 'off',
+        '@typescript-eslint/no-use-before-define': 'error',
+        'no-useless-constructor': 'off',
+        '@typescript-eslint/no-useless-constructor': 'error',
+        '@typescript-eslint/no-var-requires': 'error',
+        '@typescript-eslint/prefer-as-const': 'error',
+        '@typescript-eslint/prefer-enum-initializers': 'error',
+        '@typescript-eslint/prefer-for-of': 'error',
+        '@typescript-eslint/prefer-function-type': 'error',
+        '@typescript-eslint/prefer-includes': 'error',
+        '@typescript-eslint/prefer-literal-enum-member': 'error',
+        '@typescript-eslint/prefer-namespace-keyword': 'error',
+        '@typescript-eslint/prefer-nullish-coalescing': 'error',
+        '@typescript-eslint/prefer-optional-chain': 'error',
+        '@typescript-eslint/prefer-readonly': 'error',
+        '@typescript-eslint/prefer-readonly-parameter-types': 'error',
+        '@typescript-eslint/prefer-reduce-type-parameter': 'error',
+        '@typescript-eslint/prefer-regexp-exec': 'error',
+        '@typescript-eslint/prefer-string-starts-ends-with': 'error',
+        '@typescript-eslint/prefer-ts-expect-error': 'error',
+        '@typescript-eslint/promise-function-async': 'error',
+        quotes: 'off',
+        '@typescript-eslint/quotes': 'error',
+        '@typescript-eslint/require-array-sort-compare': 'error',
+        'require-await': 'off',
+        '@typescript-eslint/require-await': 'error',
+        '@typescript-eslint/restrict-plus-operands': 'error',
+        '@typescript-eslint/restrict-template-expressions': 'error',
+        'no-return-await': 'off',
+        '@typescript-eslint/return-await': 'error',
+        semi: 'off',
+        '@typescript-eslint/semi': 'error',
+        'space-before-function-paren': 'off',
+        '@typescript-eslint/space-before-function-paren': 'error',
+        '@typescript-eslint/strict-boolean-expressions': 'error',
+        '@typescript-eslint/switch-exhaustiveness-check': 'error',
+        '@typescript-eslint/triple-slash-reference': 'error',
+        '@typescript-eslint/type-annotation-spacing': 'error',
+        '@typescript-eslint/typedef': 'error',
+        '@typescript-eslint/unbound-method': 'error',
+        '@typescript-eslint/unified-signatures': 'error',
+        'comma-dangle': 'off',
+        '@typescript-eslint/comma-dangle': 'error',
+    },
+};
+//# sourceMappingURL=all.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/all.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/all.js.map
new file mode 100644
index 0000000..35b7760
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/all.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"all.js","sourceRoot":"","sources":["../../src/configs/all.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/all.json b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/all.json
deleted file mode 100644
index ff629e0..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/all.json
+++ /dev/null
@@ -1,107 +0,0 @@
-{
-    "extends": "./configs/base.json",
-    "rules": {
-        "@typescript-eslint/adjacent-overload-signatures": "error",
-        "@typescript-eslint/array-type": "error",
-        "@typescript-eslint/await-thenable": "error",
-        "@typescript-eslint/ban-ts-comment": "error",
-        "@typescript-eslint/ban-types": "error",
-        "brace-style": "off",
-        "@typescript-eslint/brace-style": "error",
-        "comma-spacing": "off",
-        "@typescript-eslint/comma-spacing": "error",
-        "@typescript-eslint/consistent-type-assertions": "error",
-        "@typescript-eslint/consistent-type-definitions": "error",
-        "default-param-last": "off",
-        "@typescript-eslint/default-param-last": "error",
-        "@typescript-eslint/explicit-function-return-type": "error",
-        "@typescript-eslint/explicit-member-accessibility": "error",
-        "@typescript-eslint/explicit-module-boundary-types": "error",
-        "func-call-spacing": "off",
-        "@typescript-eslint/func-call-spacing": "error",
-        "indent": "off",
-        "@typescript-eslint/indent": "error",
-        "@typescript-eslint/member-delimiter-style": "error",
-        "@typescript-eslint/member-ordering": "error",
-        "@typescript-eslint/naming-convention": "error",
-        "no-array-constructor": "off",
-        "@typescript-eslint/no-array-constructor": "error",
-        "@typescript-eslint/no-base-to-string": "error",
-        "no-dupe-class-members": "off",
-        "@typescript-eslint/no-dupe-class-members": "error",
-        "@typescript-eslint/no-dynamic-delete": "error",
-        "no-empty-function": "off",
-        "@typescript-eslint/no-empty-function": "error",
-        "@typescript-eslint/no-empty-interface": "error",
-        "@typescript-eslint/no-explicit-any": "error",
-        "@typescript-eslint/no-extra-non-null-assertion": "error",
-        "no-extra-parens": "off",
-        "@typescript-eslint/no-extra-parens": "error",
-        "no-extra-semi": "off",
-        "@typescript-eslint/no-extra-semi": "error",
-        "@typescript-eslint/no-extraneous-class": "error",
-        "@typescript-eslint/no-floating-promises": "error",
-        "@typescript-eslint/no-for-in-array": "error",
-        "@typescript-eslint/no-implied-eval": "error",
-        "@typescript-eslint/no-inferrable-types": "error",
-        "no-magic-numbers": "off",
-        "@typescript-eslint/no-magic-numbers": "error",
-        "@typescript-eslint/no-misused-new": "error",
-        "@typescript-eslint/no-misused-promises": "error",
-        "@typescript-eslint/no-namespace": "error",
-        "@typescript-eslint/no-non-null-asserted-optional-chain": "error",
-        "@typescript-eslint/no-non-null-assertion": "error",
-        "@typescript-eslint/no-parameter-properties": "error",
-        "@typescript-eslint/no-require-imports": "error",
-        "@typescript-eslint/no-this-alias": "error",
-        "@typescript-eslint/no-throw-literal": "error",
-        "@typescript-eslint/no-type-alias": "error",
-        "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error",
-        "@typescript-eslint/no-unnecessary-condition": "error",
-        "@typescript-eslint/no-unnecessary-qualifier": "error",
-        "@typescript-eslint/no-unnecessary-type-arguments": "error",
-        "@typescript-eslint/no-unnecessary-type-assertion": "error",
-        "no-unused-expressions": "off",
-        "@typescript-eslint/no-unused-expressions": "error",
-        "no-unused-vars": "off",
-        "@typescript-eslint/no-unused-vars": "error",
-        "@typescript-eslint/no-unused-vars-experimental": "error",
-        "no-use-before-define": "off",
-        "@typescript-eslint/no-use-before-define": "error",
-        "no-useless-constructor": "off",
-        "@typescript-eslint/no-useless-constructor": "error",
-        "@typescript-eslint/no-var-requires": "error",
-        "@typescript-eslint/prefer-as-const": "error",
-        "@typescript-eslint/prefer-for-of": "error",
-        "@typescript-eslint/prefer-function-type": "error",
-        "@typescript-eslint/prefer-includes": "error",
-        "@typescript-eslint/prefer-namespace-keyword": "error",
-        "@typescript-eslint/prefer-nullish-coalescing": "error",
-        "@typescript-eslint/prefer-optional-chain": "error",
-        "@typescript-eslint/prefer-readonly": "error",
-        "@typescript-eslint/prefer-readonly-parameter-types": "error",
-        "@typescript-eslint/prefer-regexp-exec": "error",
-        "@typescript-eslint/prefer-string-starts-ends-with": "error",
-        "@typescript-eslint/promise-function-async": "error",
-        "quotes": "off",
-        "@typescript-eslint/quotes": "error",
-        "@typescript-eslint/require-array-sort-compare": "error",
-        "require-await": "off",
-        "@typescript-eslint/require-await": "error",
-        "@typescript-eslint/restrict-plus-operands": "error",
-        "@typescript-eslint/restrict-template-expressions": "error",
-        "no-return-await": "off",
-        "@typescript-eslint/return-await": "error",
-        "semi": "off",
-        "@typescript-eslint/semi": "error",
-        "space-before-function-paren": "off",
-        "@typescript-eslint/space-before-function-paren": "error",
-        "@typescript-eslint/strict-boolean-expressions": "error",
-        "@typescript-eslint/switch-exhaustiveness-check": "error",
-        "@typescript-eslint/triple-slash-reference": "error",
-        "@typescript-eslint/type-annotation-spacing": "error",
-        "@typescript-eslint/typedef": "error",
-        "@typescript-eslint/unbound-method": "error",
-        "@typescript-eslint/unified-signatures": "error"
-    }
-}
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.js b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.js
new file mode 100644
index 0000000..52d1fe8
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.js
@@ -0,0 +1,10 @@
+"use strict";
+// THIS CODE WAS AUTOMATICALLY GENERATED
+// DO NOT EDIT THIS CODE BY HAND
+// YOU CAN REGENERATE IT USING yarn generate:configs
+module.exports = {
+    parser: '@typescript-eslint/parser',
+    parserOptions: { sourceType: 'module' },
+    plugins: ['@typescript-eslint'],
+};
+//# sourceMappingURL=base.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.js.map
new file mode 100644
index 0000000..a2f415f
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/configs/base.ts"],"names":[],"mappings":";AAAA,wCAAwC;AACxC,gCAAgC;AAChC,oDAAoD;AAEpD,iBAAS;IACP,MAAM,EAAE,2BAA2B;IACnC,aAAa,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE;IACvC,OAAO,EAAE,CAAC,oBAAoB,CAAC;CAChC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.json b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.json
deleted file mode 100644
index e5af602..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "parser": "@typescript-eslint/parser",
-    "parserOptions": { "sourceType": "module" },
-    "plugins": ["@typescript-eslint"]
-}
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/eslint-recommended.js b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/eslint-recommended.js
index 4395919..f1b5191 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/eslint-recommended.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/eslint-recommended.js
@@ -1,36 +1,30 @@
 "use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * This is a compatibility ruleset that disables rules from eslint:recommended
- * which are already handled by TypeScript.
- */
-exports.default = {
+module.exports = {
     overrides: [
         {
             files: ['*.ts', '*.tsx'],
             rules: {
-                // Checked by Typescript - ts(2378)
+                'constructor-super': 'off',
                 'getter-return': 'off',
-                // Checked by Typescript - ts(2300)
-                'no-dupe-args': 'off',
-                // Checked by Typescript - ts(1117)
-                'no-dupe-keys': 'off',
-                // Checked by Typescript - ts(7027)
-                'no-unreachable': 'off',
-                // Checked by Typescript - ts(2367)
-                'valid-typeof': 'off',
-                // Checked by Typescript - ts(2588)
                 'no-const-assign': 'off',
-                // Checked by Typescript - ts(2588)
-                'no-new-symbol': 'off',
-                // Checked by Typescript - ts(2376)
-                'no-this-before-super': 'off',
-                // This is checked by Typescript using the option `strictNullChecks`.
-                'no-undef': 'off',
-                // This is already checked by Typescript.
+                'no-dupe-args': 'off',
                 'no-dupe-class-members': 'off',
-                // This is already checked by Typescript.
+                'no-dupe-keys': 'off',
+                'no-func-assign': 'off',
+                'no-import-assign': 'off',
+                'no-new-symbol': 'off',
+                'no-obj-calls': 'off',
                 'no-redeclare': 'off',
+                'no-setter-return': 'off',
+                'no-this-before-super': 'off',
+                'no-undef': 'off',
+                'no-unreachable': 'off',
+                'no-unsafe-negation': 'off',
+                'no-var': 'error',
+                'prefer-const': 'error',
+                'prefer-rest-params': 'error',
+                'prefer-spread': 'error',
+                'valid-typeof': 'off',
             },
         },
     ],
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/eslint-recommended.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/eslint-recommended.js.map
index 21b2ecb..8181881 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/eslint-recommended.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/eslint-recommended.js.map
@@ -1 +1 @@
-{"version":3,"file":"eslint-recommended.js","sourceRoot":"","sources":["../../src/configs/eslint-recommended.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,kBAAe;IACb,SAAS,EAAE;QACT;YACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YACxB,KAAK,EAAE;gBACL,mCAAmC;gBACnC,eAAe,EAAE,KAAK;gBACtB,mCAAmC;gBACnC,cAAc,EAAE,KAAK;gBACrB,mCAAmC;gBACnC,cAAc,EAAE,KAAK;gBACrB,mCAAmC;gBACnC,gBAAgB,EAAE,KAAK;gBACvB,mCAAmC;gBACnC,cAAc,EAAE,KAAK;gBACrB,mCAAmC;gBACnC,iBAAiB,EAAE,KAAK;gBACxB,mCAAmC;gBACnC,eAAe,EAAE,KAAK;gBACtB,mCAAmC;gBACnC,sBAAsB,EAAE,KAAK;gBAC7B,qEAAqE;gBACrE,UAAU,EAAE,KAAK;gBACjB,yCAAyC;gBACzC,uBAAuB,EAAE,KAAK;gBAC9B,yCAAyC;gBACzC,cAAc,EAAE,KAAK;aACtB;SACF;KACF;CACF,CAAC"}
\ No newline at end of file
+{"version":3,"file":"eslint-recommended.js","sourceRoot":"","sources":["../../src/configs/eslint-recommended.ts"],"names":[],"mappings":";AAKA,iBAAS;IACP,SAAS,EAAE;QACT;YACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YACxB,KAAK,EAAE;gBACL,mBAAmB,EAAE,KAAK;gBAC1B,eAAe,EAAE,KAAK;gBACtB,iBAAiB,EAAE,KAAK;gBACxB,cAAc,EAAE,KAAK;gBACrB,uBAAuB,EAAE,KAAK;gBAC9B,cAAc,EAAE,KAAK;gBACrB,gBAAgB,EAAE,KAAK;gBACvB,kBAAkB,EAAE,KAAK;gBACzB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,KAAK;gBACrB,cAAc,EAAE,KAAK;gBACrB,kBAAkB,EAAE,KAAK;gBACzB,sBAAsB,EAAE,KAAK;gBAC7B,UAAU,EAAE,KAAK;gBACjB,gBAAgB,EAAE,KAAK;gBACvB,oBAAoB,EAAE,KAAK;gBAC3B,QAAQ,EAAE,OAAO;gBACjB,cAAc,EAAE,OAAO;gBACvB,oBAAoB,EAAE,OAAO;gBAC7B,eAAe,EAAE,OAAO;gBACxB,cAAc,EAAE,KAAK;aACtB;SACF;KACF;CACF,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended-requiring-type-checking.js b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended-requiring-type-checking.js
new file mode 100644
index 0000000..cb31319
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended-requiring-type-checking.js
@@ -0,0 +1,26 @@
+"use strict";
+// THIS CODE WAS AUTOMATICALLY GENERATED
+// DO NOT EDIT THIS CODE BY HAND
+// YOU CAN REGENERATE IT USING yarn generate:configs
+module.exports = {
+    extends: ['./configs/base', './configs/eslint-recommended'],
+    rules: {
+        '@typescript-eslint/await-thenable': 'error',
+        '@typescript-eslint/no-floating-promises': 'error',
+        '@typescript-eslint/no-for-in-array': 'error',
+        '@typescript-eslint/no-implied-eval': 'error',
+        '@typescript-eslint/no-misused-promises': 'error',
+        '@typescript-eslint/no-unnecessary-type-assertion': 'error',
+        '@typescript-eslint/no-unsafe-assignment': 'error',
+        '@typescript-eslint/no-unsafe-call': 'error',
+        '@typescript-eslint/no-unsafe-member-access': 'error',
+        '@typescript-eslint/no-unsafe-return': 'error',
+        '@typescript-eslint/prefer-regexp-exec': 'error',
+        'require-await': 'off',
+        '@typescript-eslint/require-await': 'error',
+        '@typescript-eslint/restrict-plus-operands': 'error',
+        '@typescript-eslint/restrict-template-expressions': 'error',
+        '@typescript-eslint/unbound-method': 'error',
+    },
+};
+//# sourceMappingURL=recommended-requiring-type-checking.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended-requiring-type-checking.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended-requiring-type-checking.js.map
new file mode 100644
index 0000000..ef21991
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended-requiring-type-checking.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"recommended-requiring-type-checking.js","sourceRoot":"","sources":["../../src/configs/recommended-requiring-type-checking.ts"],"names":[],"mappings":";AAAA,wCAAwC;AACxC,gCAAgC;AAChC,oDAAoD;AAEpD,iBAAS;IACP,OAAO,EAAE,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;IAC3D,KAAK,EAAE;QACL,mCAAmC,EAAE,OAAO;QAC5C,yCAAyC,EAAE,OAAO;QAClD,oCAAoC,EAAE,OAAO;QAC7C,oCAAoC,EAAE,OAAO;QAC7C,wCAAwC,EAAE,OAAO;QACjD,kDAAkD,EAAE,OAAO;QAC3D,yCAAyC,EAAE,OAAO;QAClD,mCAAmC,EAAE,OAAO;QAC5C,4CAA4C,EAAE,OAAO;QACrD,qCAAqC,EAAE,OAAO;QAC9C,uCAAuC,EAAE,OAAO;QAChD,eAAe,EAAE,KAAK;QACtB,kCAAkC,EAAE,OAAO;QAC3C,2CAA2C,EAAE,OAAO;QACpD,kDAAkD,EAAE,OAAO;QAC3D,mCAAmC,EAAE,OAAO;KAC7C;CACF,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended-requiring-type-checking.json b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended-requiring-type-checking.json
deleted file mode 100644
index 2f56a1b..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended-requiring-type-checking.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-    "extends": "./configs/base.json",
-    "rules": {
-        "@typescript-eslint/await-thenable": "error",
-        "@typescript-eslint/no-for-in-array": "error",
-        "@typescript-eslint/no-misused-promises": "error",
-        "@typescript-eslint/no-unnecessary-type-assertion": "error",
-        "@typescript-eslint/prefer-includes": "error",
-        "@typescript-eslint/prefer-regexp-exec": "error",
-        "@typescript-eslint/prefer-string-starts-ends-with": "error",
-        "require-await": "off",
-        "@typescript-eslint/require-await": "error",
-        "@typescript-eslint/unbound-method": "error",
-        "no-var": "error",
-        "prefer-const": "error",
-        "prefer-rest-params": "error",
-        "prefer-spread": "error"
-    }
-}
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended.js b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended.js
new file mode 100644
index 0000000..e8e5a6f
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended.js
@@ -0,0 +1,35 @@
+"use strict";
+// THIS CODE WAS AUTOMATICALLY GENERATED
+// DO NOT EDIT THIS CODE BY HAND
+// YOU CAN REGENERATE IT USING yarn generate:configs
+module.exports = {
+    extends: ['./configs/base', './configs/eslint-recommended'],
+    rules: {
+        '@typescript-eslint/adjacent-overload-signatures': 'error',
+        '@typescript-eslint/ban-ts-comment': 'error',
+        '@typescript-eslint/ban-types': 'error',
+        '@typescript-eslint/explicit-module-boundary-types': 'warn',
+        'no-array-constructor': 'off',
+        '@typescript-eslint/no-array-constructor': 'error',
+        'no-empty-function': 'off',
+        '@typescript-eslint/no-empty-function': 'error',
+        '@typescript-eslint/no-empty-interface': 'error',
+        '@typescript-eslint/no-explicit-any': 'warn',
+        '@typescript-eslint/no-extra-non-null-assertion': 'error',
+        'no-extra-semi': 'off',
+        '@typescript-eslint/no-extra-semi': 'error',
+        '@typescript-eslint/no-inferrable-types': 'error',
+        '@typescript-eslint/no-misused-new': 'error',
+        '@typescript-eslint/no-namespace': 'error',
+        '@typescript-eslint/no-non-null-asserted-optional-chain': 'error',
+        '@typescript-eslint/no-non-null-assertion': 'warn',
+        '@typescript-eslint/no-this-alias': 'error',
+        'no-unused-vars': 'off',
+        '@typescript-eslint/no-unused-vars': 'warn',
+        '@typescript-eslint/no-var-requires': 'error',
+        '@typescript-eslint/prefer-as-const': 'error',
+        '@typescript-eslint/prefer-namespace-keyword': 'error',
+        '@typescript-eslint/triple-slash-reference': 'error',
+    },
+};
+//# sourceMappingURL=recommended.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended.js.map
new file mode 100644
index 0000000..406ea3f
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"recommended.js","sourceRoot":"","sources":["../../src/configs/recommended.ts"],"names":[],"mappings":";AAAA,wCAAwC;AACxC,gCAAgC;AAChC,oDAAoD;AAEpD,iBAAS;IACP,OAAO,EAAE,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;IAC3D,KAAK,EAAE;QACL,iDAAiD,EAAE,OAAO;QAC1D,mCAAmC,EAAE,OAAO;QAC5C,8BAA8B,EAAE,OAAO;QACvC,mDAAmD,EAAE,MAAM;QAC3D,sBAAsB,EAAE,KAAK;QAC7B,yCAAyC,EAAE,OAAO;QAClD,mBAAmB,EAAE,KAAK;QAC1B,sCAAsC,EAAE,OAAO;QAC/C,uCAAuC,EAAE,OAAO;QAChD,oCAAoC,EAAE,MAAM;QAC5C,gDAAgD,EAAE,OAAO;QACzD,eAAe,EAAE,KAAK;QACtB,kCAAkC,EAAE,OAAO;QAC3C,wCAAwC,EAAE,OAAO;QACjD,mCAAmC,EAAE,OAAO;QAC5C,iCAAiC,EAAE,OAAO;QAC1C,wDAAwD,EAAE,OAAO;QACjE,0CAA0C,EAAE,MAAM;QAClD,kCAAkC,EAAE,OAAO;QAC3C,gBAAgB,EAAE,KAAK;QACvB,mCAAmC,EAAE,MAAM;QAC3C,oCAAoC,EAAE,OAAO;QAC7C,oCAAoC,EAAE,OAAO;QAC7C,6CAA6C,EAAE,OAAO;QACtD,2CAA2C,EAAE,OAAO;KACrD;CACF,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended.json b/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended.json
deleted file mode 100644
index 2ea1819..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/configs/recommended.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-    "extends": "./configs/base.json",
-    "rules": {
-        "@typescript-eslint/adjacent-overload-signatures": "error",
-        "@typescript-eslint/ban-ts-ignore": "error",
-        "@typescript-eslint/ban-types": "error",
-        "camelcase": "off",
-        "@typescript-eslint/camelcase": "error",
-        "@typescript-eslint/class-name-casing": "error",
-        "@typescript-eslint/consistent-type-assertions": "error",
-        "@typescript-eslint/explicit-function-return-type": "warn",
-        "@typescript-eslint/interface-name-prefix": "error",
-        "@typescript-eslint/member-delimiter-style": "error",
-        "no-array-constructor": "off",
-        "@typescript-eslint/no-array-constructor": "error",
-        "no-empty-function": "off",
-        "@typescript-eslint/no-empty-function": "error",
-        "@typescript-eslint/no-empty-interface": "error",
-        "@typescript-eslint/no-explicit-any": "warn",
-        "@typescript-eslint/no-inferrable-types": "error",
-        "@typescript-eslint/no-misused-new": "error",
-        "@typescript-eslint/no-namespace": "error",
-        "@typescript-eslint/no-non-null-assertion": "warn",
-        "@typescript-eslint/no-this-alias": "error",
-        "no-unused-vars": "off",
-        "@typescript-eslint/no-unused-vars": "warn",
-        "no-use-before-define": "off",
-        "@typescript-eslint/no-use-before-define": "error",
-        "@typescript-eslint/no-var-requires": "error",
-        "@typescript-eslint/prefer-namespace-keyword": "error",
-        "@typescript-eslint/triple-slash-reference": "error",
-        "@typescript-eslint/type-annotation-spacing": "error",
-        "no-var": "error",
-        "prefer-const": "error",
-        "prefer-rest-params": "error",
-        "prefer-spread": "error"
-    }
-}
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/index.js b/node_modules/@typescript-eslint/eslint-plugin/dist/index.js
index 12dffdf..37426f2 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/index.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/index.js
@@ -3,19 +3,19 @@
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 const rules_1 = __importDefault(require("./rules"));
-const all_json_1 = __importDefault(require("./configs/all.json"));
-const base_json_1 = __importDefault(require("./configs/base.json"));
-const recommended_json_1 = __importDefault(require("./configs/recommended.json"));
-const recommended_requiring_type_checking_json_1 = __importDefault(require("./configs/recommended-requiring-type-checking.json"));
+const all_1 = __importDefault(require("./configs/all"));
+const base_1 = __importDefault(require("./configs/base"));
+const recommended_1 = __importDefault(require("./configs/recommended"));
+const recommended_requiring_type_checking_1 = __importDefault(require("./configs/recommended-requiring-type-checking"));
 const eslint_recommended_1 = __importDefault(require("./configs/eslint-recommended"));
 module.exports = {
     rules: rules_1.default,
     configs: {
-        all: all_json_1.default,
-        base: base_json_1.default,
-        recommended: recommended_json_1.default,
+        all: all_1.default,
+        base: base_1.default,
+        recommended: recommended_1.default,
         'eslint-recommended': eslint_recommended_1.default,
-        'recommended-requiring-type-checking': recommended_requiring_type_checking_json_1.default,
+        'recommended-requiring-type-checking': recommended_requiring_type_checking_1.default,
     },
 };
 //# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/index.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/index.js.map
index 13a4000..2469809 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/index.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,oDAA4B;AAE5B,kEAAqC;AACrC,oEAAuC;AACvC,kFAAqD;AACrD,kIAAkG;AAClG,sFAA6D;AAE7D,iBAAS;IACP,KAAK,EAAL,eAAK;IACL,OAAO,EAAE;QACP,GAAG,EAAH,kBAAG;QACH,IAAI,EAAJ,mBAAI;QACJ,WAAW,EAAX,0BAAW;QACX,oBAAoB,EAAE,4BAAiB;QACvC,qCAAqC,EAAE,kDAAgC;KACxE;CACF,CAAC"}
\ No newline at end of file
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,oDAA4B;AAE5B,wDAAgC;AAChC,0DAAkC;AAClC,wEAAgD;AAChD,wHAA6F;AAC7F,sFAA6D;AAE7D,iBAAS;IACP,KAAK,EAAL,eAAK;IACL,OAAO,EAAE;QACP,GAAG,EAAH,aAAG;QACH,IAAI,EAAJ,cAAI;QACJ,WAAW,EAAX,qBAAW;QACX,oBAAoB,EAAE,4BAAiB;QACvC,qCAAqC,EAAE,6CAAgC;KACxE;CACF,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/adjacent-overload-signatures.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/adjacent-overload-signatures.js
index 06c8fac..6b68714 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/adjacent-overload-signatures.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/adjacent-overload-signatures.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -27,14 +39,16 @@
     create(context) {
         const sourceCode = context.getSourceCode();
         /**
-         * Gets the name of the member being processed.
+         * Gets the name and attribute of the member being processed.
          * @param member the member being processed.
-         * @returns the name of the member or null if it's a member not relevant to the rule.
+         * @returns the name and attribute of the member or null if it's a member not relevant to the rule.
          */
-        function getMemberName(member) {
+        function getMemberMethod(member) {
+            var _a, _b;
             if (!member) {
                 return null;
             }
+            const isStatic = 'static' in member && !!member.static;
             switch (member.type) {
                 case experimental_utils_1.AST_NODE_TYPES.ExportDefaultDeclaration:
                 case experimental_utils_1.AST_NODE_TYPES.ExportNamedDeclaration: {
@@ -43,26 +57,52 @@
                     if (!member.declaration) {
                         return null;
                     }
-                    return getMemberName(member.declaration);
+                    return getMemberMethod(member.declaration);
                 }
                 case experimental_utils_1.AST_NODE_TYPES.TSDeclareFunction:
-                case experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration:
-                    return member.id && member.id.name;
+                case experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration: {
+                    const name = (_b = (_a = member.id) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : null;
+                    if (name === null) {
+                        return null;
+                    }
+                    return {
+                        name,
+                        static: isStatic,
+                        callSignature: false,
+                    };
+                }
                 case experimental_utils_1.AST_NODE_TYPES.TSMethodSignature:
-                    return util.getNameFromMember(member, sourceCode);
+                    return {
+                        name: util.getNameFromMember(member, sourceCode),
+                        static: isStatic,
+                        callSignature: false,
+                    };
                 case experimental_utils_1.AST_NODE_TYPES.TSCallSignatureDeclaration:
-                    return 'call';
+                    return {
+                        name: 'call',
+                        static: isStatic,
+                        callSignature: true,
+                    };
                 case experimental_utils_1.AST_NODE_TYPES.TSConstructSignatureDeclaration:
-                    return 'new';
+                    return {
+                        name: 'new',
+                        static: isStatic,
+                        callSignature: false,
+                    };
                 case experimental_utils_1.AST_NODE_TYPES.MethodDefinition:
-                    return util.getNameFromMember(member, sourceCode);
+                    return {
+                        name: util.getNameFromMember(member, sourceCode),
+                        static: isStatic,
+                        callSignature: false,
+                    };
             }
             return null;
         }
         function isSameMethod(method1, method2) {
             return (!!method2 &&
                 method1.name === method2.name &&
-                method1.static === method2.static);
+                method1.static === method2.static &&
+                method1.callSignature === method2.callSignature);
         }
         function getMembers(node) {
             switch (node.type) {
@@ -85,15 +125,11 @@
                 let lastMethod = null;
                 const seenMethods = [];
                 members.forEach(member => {
-                    const name = getMemberName(member);
-                    if (name === null) {
+                    const method = getMemberMethod(member);
+                    if (method === null) {
                         lastMethod = null;
                         return;
                     }
-                    const method = {
-                        name,
-                        static: 'static' in member && !!member.static,
-                    };
                     const index = seenMethods.findIndex(seenMethod => isSameMethod(method, seenMethod));
                     if (index > -1 && !isSameMethod(method, lastMethod)) {
                         context.report({
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/adjacent-overload-signatures.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/adjacent-overload-signatures.js.map
index 0a11771..7371090 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/adjacent-overload-signatures.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/adjacent-overload-signatures.js.map
@@ -1 +1 @@
-{"version":3,"file":"adjacent-overload-signatures.js","sourceRoot":"","sources":["../../src/rules/adjacent-overload-signatures.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"adjacent-overload-signatures.js","sourceRoot":"","sources":["../../src/rules/adjacent-overload-signatures.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/array-type.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/array-type.js
index 3ab552a..4f4d2d1 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/array-type.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/array-type.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -110,7 +122,7 @@
         var _a;
         const sourceCode = context.getSourceCode();
         const defaultOption = options.default;
-        const readonlyOption = (_a = options.readonly, (_a !== null && _a !== void 0 ? _a : defaultOption));
+        const readonlyOption = (_a = options.readonly) !== null && _a !== void 0 ? _a : defaultOption;
         const isArraySimpleOption = defaultOption === 'array-simple' && readonlyOption === 'array-simple';
         const isArrayOption = defaultOption === 'array' && readonlyOption === 'array';
         const isGenericOption = defaultOption === 'generic' && readonlyOption === 'generic';
@@ -206,6 +218,7 @@
                 });
             },
             TSTypeReference(node) {
+                var _a;
                 if (isGenericOption ||
                     node.typeName.type !== experimental_utils_1.AST_NODE_TYPES.Identifier) {
                     return;
@@ -218,7 +231,7 @@
                     return;
                 }
                 const readonlyPrefix = isReadonlyArrayType ? 'readonly ' : '';
-                const typeParams = node.typeParameters && node.typeParameters.params;
+                const typeParams = (_a = node.typeParameters) === null || _a === void 0 ? void 0 : _a.params;
                 const messageId = defaultOption === 'array'
                     ? 'errorStringArray'
                     : 'errorStringArraySimple';
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/array-type.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/array-type.js.map
index 02df701..2acd2d2 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/array-type.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/array-type.js.map
@@ -1 +1 @@
-{"version":3,"file":"array-type.js","sourceRoot":"","sources":["../../src/rules/array-type.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"array-type.js","sourceRoot":"","sources":["../../src/rules/array-type.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/await-thenable.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/await-thenable.js
index 3e58858..e00e853 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/await-thenable.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/await-thenable.js
@@ -1,14 +1,25 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 const tsutils = __importStar(require("tsutils"));
-const ts = __importStar(require("typescript"));
 const util = __importStar(require("../util"));
 exports.default = util.createRule({
     name: 'await-thenable',
@@ -33,8 +44,8 @@
             AwaitExpression(node) {
                 const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
                 const type = checker.getTypeAtLocation(originalNode.expression);
-                if (!tsutils.isTypeFlagSet(type, ts.TypeFlags.Any) &&
-                    !tsutils.isTypeFlagSet(type, ts.TypeFlags.Unknown) &&
+                if (!util.isTypeAnyType(type) &&
+                    !util.isTypeUnknownType(type) &&
                     !tsutils.isThenableType(checker, originalNode.expression, type)) {
                     context.report({
                         messageId: 'await',
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/await-thenable.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/await-thenable.js.map
index d8df670..b53e8dc 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/await-thenable.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/await-thenable.js.map
@@ -1 +1 @@
-{"version":3,"file":"await-thenable.js","sourceRoot":"","sources":["../../src/rules/await-thenable.ts"],"names":[],"mappings":";;;;;;;;;AAAA,iDAAmC;AACnC,+CAAiC;AAEjC,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,WAAW,EAAE,mDAAmD;YAChE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;YACpB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,6DAA6D;SACrE;QACD,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,SAAS;KAChB;IACD,cAAc,EAAE,EAAE;IAElB,MAAM,CAAC,OAAO;QACZ,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAExD,OAAO;YACL,eAAe,CAAC,IAAI;gBAClB,MAAM,YAAY,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpE,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;gBAEhE,IACE,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC;oBAC9C,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC;oBAClD,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,EAC/D;oBACA,OAAO,CAAC,MAAM,CAAC;wBACb,SAAS,EAAE,OAAO;wBAClB,IAAI;qBACL,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"await-thenable.js","sourceRoot":"","sources":["../../src/rules/await-thenable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmC;AAEnC,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,WAAW,EAAE,mDAAmD;YAChE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;YACpB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,KAAK,EAAE,6DAA6D;SACrE;QACD,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,SAAS;KAChB;IACD,cAAc,EAAE,EAAE;IAElB,MAAM,CAAC,OAAO;QACZ,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAExD,OAAO;YACL,eAAe,CAAC,IAAI;gBAClB,MAAM,YAAY,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpE,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;gBAEhE,IACE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;oBACzB,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;oBAC7B,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,EAC/D;oBACA,OAAO,CAAC,MAAM,CAAC;wBACb,SAAS,EAAE,OAAO;wBAClB,IAAI;qBACL,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-comment.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-comment.js
index 83f25bc..d2a19b4 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-comment.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-comment.js
@@ -1,57 +1,109 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.defaultMinimumDescriptionLength = void 0;
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const util = __importStar(require("../util"));
-const defaultOptions = [
-    {
-        'ts-ignore': true,
-        'ts-nocheck': true,
-        'ts-check': false,
-    },
-];
+exports.defaultMinimumDescriptionLength = 3;
 exports.default = util.createRule({
     name: 'ban-ts-comment',
     meta: {
         type: 'problem',
         docs: {
-            description: 'Bans `// @ts-<directive>` comments from being used',
+            description: 'Bans `// @ts-<directive>` comments from being used or requires descriptions after directive',
             category: 'Best Practices',
-            recommended: false,
+            recommended: 'error',
         },
         messages: {
-            tsDirectiveComment: 'Do not use "// @ts-{directive}" because it alters compilation errors.',
+            tsDirectiveComment: 'Do not use "// @ts-{{directive}}" because it alters compilation errors.',
+            tsDirectiveCommentRequiresDescription: 'Include a description after the "// @ts-{{directive}}" directive to explain why the @ts-{{directive}} is necessary. The description must be {{minimumDescriptionLength}} characters or longer.',
         },
         schema: [
             {
                 type: 'object',
                 properties: {
+                    'ts-expect-error': {
+                        oneOf: [
+                            {
+                                type: 'boolean',
+                                default: true,
+                            },
+                            {
+                                enum: ['allow-with-description'],
+                            },
+                        ],
+                    },
                     'ts-ignore': {
-                        type: 'boolean',
-                        default: true,
+                        oneOf: [
+                            {
+                                type: 'boolean',
+                                default: true,
+                            },
+                            {
+                                enum: ['allow-with-description'],
+                            },
+                        ],
                     },
                     'ts-nocheck': {
-                        type: 'boolean',
-                        default: true,
+                        oneOf: [
+                            {
+                                type: 'boolean',
+                                default: true,
+                            },
+                            {
+                                enum: ['allow-with-description'],
+                            },
+                        ],
                     },
                     'ts-check': {
-                        type: 'boolean',
-                        default: false,
+                        oneOf: [
+                            {
+                                type: 'boolean',
+                                default: true,
+                            },
+                            {
+                                enum: ['allow-with-description'],
+                            },
+                        ],
+                    },
+                    minimumDescriptionLength: {
+                        type: 'number',
+                        default: exports.defaultMinimumDescriptionLength,
                     },
                 },
                 additionalProperties: false,
             },
         ],
     },
-    defaultOptions,
+    defaultOptions: [
+        {
+            'ts-expect-error': 'allow-with-description',
+            'ts-ignore': true,
+            'ts-nocheck': true,
+            'ts-check': false,
+            minimumDescriptionLength: exports.defaultMinimumDescriptionLength,
+        },
+    ],
     create(context, [options]) {
-        const tsCommentRegExp = /^\/*\s*@ts-(ignore|check|nocheck)/;
+        const tsCommentRegExp = /^\/*\s*@ts-(expect-error|ignore|check|nocheck)(.*)/;
         const sourceCode = context.getSourceCode();
         return {
             Program() {
@@ -61,15 +113,26 @@
                     if (comment.type !== experimental_utils_1.AST_TOKEN_TYPES.Line) {
                         return;
                     }
-                    const [, directive] = (_a = tsCommentRegExp.exec(comment.value), (_a !== null && _a !== void 0 ? _a : []));
+                    const [, directive, description] = (_a = tsCommentRegExp.exec(comment.value)) !== null && _a !== void 0 ? _a : [];
                     const fullDirective = `ts-${directive}`;
-                    if (options[fullDirective]) {
+                    const option = options[fullDirective];
+                    if (option === true) {
                         context.report({
                             data: { directive },
                             node: comment,
                             messageId: 'tsDirectiveComment',
                         });
                     }
+                    if (option === 'allow-with-description') {
+                        const { minimumDescriptionLength = exports.defaultMinimumDescriptionLength, } = options;
+                        if (description.trim().length < minimumDescriptionLength) {
+                            context.report({
+                                data: { directive, minimumDescriptionLength },
+                                node: comment,
+                                messageId: 'tsDirectiveCommentRequiresDescription',
+                            });
+                        }
+                    }
                 });
             },
         };
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-comment.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-comment.js.map
index 2766ba5..7d6e421 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-comment.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-comment.js.map
@@ -1 +1 @@
-{"version":3,"file":"ban-ts-comment.js","sourceRoot":"","sources":["../../src/rules/ban-ts-comment.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAAwE;AACxE,8CAAgC;AAQhC,MAAM,cAAc,GAAc;IAChC;QACE,WAAW,EAAE,IAAI;QACjB,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,KAAK;KAClB;CACF,CAAC;AAIF,kBAAe,IAAI,CAAC,UAAU,CAAwB;IACpD,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,oDAAoD;YACjE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;SACnB;QACD,QAAQ,EAAE;YACR,kBAAkB,EAChB,uEAAuE;SAC1E;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,WAAW,EAAE;wBACX,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,IAAI;qBACd;oBACD,YAAY,EAAE;wBACZ,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,IAAI;qBACd;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,KAAK;qBACf;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc;IACd,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC;QACvB,MAAM,eAAe,GAAG,mCAAmC,CAAC;QAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAE3C,OAAO;YACL,OAAO;gBACL,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;gBAE7C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;;oBACzB,IAAI,OAAO,CAAC,IAAI,KAAK,oCAAe,CAAC,IAAI,EAAE;wBACzC,OAAO;qBACR;oBAED,MAAM,CAAC,EAAE,SAAS,CAAC,SAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,uCAAI,EAAE,EAAA,CAAC;oBAEhE,MAAM,aAAa,GAAG,MAAM,SAAS,EAAmB,CAAC;oBAEzD,IAAI,OAAO,CAAC,aAAa,CAAC,EAAE;wBAC1B,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,EAAE,SAAS,EAAE;4BACnB,IAAI,EAAE,OAAO;4BACb,SAAS,EAAE,oBAAoB;yBAChC,CAAC,CAAC;qBACJ;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"ban-ts-comment.js","sourceRoot":"","sources":["../../src/rules/ban-ts-comment.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-ignore.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-ignore.js
deleted file mode 100644
index 8c2e441..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-ignore.js
+++ /dev/null
@@ -1,50 +0,0 @@
-"use strict";
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const util = __importStar(require("../util"));
-exports.default = util.createRule({
-    name: 'ban-ts-ignore',
-    meta: {
-        type: 'problem',
-        docs: {
-            description: 'Bans “// @ts-ignore” comments from being used',
-            category: 'Best Practices',
-            recommended: 'error',
-        },
-        schema: [],
-        messages: {
-            tsIgnoreComment: 'Do not use "// @ts-ignore" comments because they suppress compilation errors.',
-        },
-        deprecated: true,
-        replacedBy: ['@typescript-eslint/ban-ts-comment'],
-    },
-    defaultOptions: [],
-    create(context) {
-        const tsIgnoreRegExp = /^\/*\s*@ts-ignore/;
-        const sourceCode = context.getSourceCode();
-        return {
-            Program() {
-                const comments = sourceCode.getAllComments();
-                comments.forEach(comment => {
-                    if (comment.type !== experimental_utils_1.AST_TOKEN_TYPES.Line) {
-                        return;
-                    }
-                    if (tsIgnoreRegExp.test(comment.value)) {
-                        context.report({
-                            node: comment,
-                            messageId: 'tsIgnoreComment',
-                        });
-                    }
-                });
-            },
-        };
-    },
-});
-//# sourceMappingURL=ban-ts-ignore.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-ignore.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-ignore.js.map
deleted file mode 100644
index 077bc4a..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-ts-ignore.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ban-ts-ignore.js","sourceRoot":"","sources":["../../src/rules/ban-ts-ignore.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAAwE;AACxE,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,+CAA+C;YAC5D,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;SACrB;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,eAAe,EACb,+EAA+E;SAClF;QACD,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,CAAC,mCAAmC,CAAC;KAClD;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,cAAc,GAAG,mBAAmB,CAAC;QAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAE3C,OAAO;YACL,OAAO;gBACL,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;gBAE7C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBACzB,IAAI,OAAO,CAAC,IAAI,KAAK,oCAAe,CAAC,IAAI,EAAE;wBACzC,OAAO;qBACR;oBACD,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;wBACtC,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,OAAO;4BACb,SAAS,EAAE,iBAAiB;yBAC7B,CAAC,CAAC;qBACJ;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-tslint-comment.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-tslint-comment.js
new file mode 100644
index 0000000..46cab0d
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-tslint-comment.js
@@ -0,0 +1,75 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const util = __importStar(require("../util"));
+// tslint regex
+// https://github.com/palantir/tslint/blob/95d9d958833fd9dc0002d18cbe34db20d0fbf437/src/enableDisableRules.ts#L32
+const ENABLE_DISABLE_REGEX = /^\s*tslint:(enable|disable)(?:-(line|next-line))?(:|\s|$)/;
+const toText = (text, type) => type === experimental_utils_1.AST_TOKEN_TYPES.Line
+    ? ['//', text.trim()].join(' ')
+    : ['/*', text.trim(), '*/'].join(' ');
+exports.default = util.createRule({
+    name: 'ban-tslint-comment',
+    meta: {
+        type: 'suggestion',
+        docs: {
+            description: 'Bans `// tslint:<rule-flag>` comments from being used',
+            category: 'Stylistic Issues',
+            recommended: false,
+        },
+        messages: {
+            commentDetected: 'tslint comment detected: "{{ text }}"',
+        },
+        schema: [],
+        fixable: 'code',
+    },
+    defaultOptions: [],
+    create: context => {
+        const sourceCode = context.getSourceCode();
+        return {
+            Program() {
+                const comments = sourceCode.getAllComments();
+                comments.forEach(c => {
+                    if (ENABLE_DISABLE_REGEX.test(c.value)) {
+                        context.report({
+                            data: { text: toText(c.value, c.type) },
+                            node: c,
+                            messageId: 'commentDetected',
+                            fix(fixer) {
+                                const rangeStart = sourceCode.getIndexFromLoc({
+                                    column: c.loc.start.column > 0 ? c.loc.start.column - 1 : 0,
+                                    line: c.loc.start.line,
+                                });
+                                const rangeEnd = sourceCode.getIndexFromLoc({
+                                    column: c.loc.end.column,
+                                    line: c.loc.end.line,
+                                });
+                                return fixer.removeRange([rangeStart, rangeEnd + 1]);
+                            },
+                        });
+                    }
+                });
+            },
+        };
+    },
+});
+//# sourceMappingURL=ban-tslint-comment.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-tslint-comment.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-tslint-comment.js.map
new file mode 100644
index 0000000..301958f
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-tslint-comment.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"ban-tslint-comment.js","sourceRoot":"","sources":["../../src/rules/ban-tslint-comment.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAAwE;AACxE,8CAAgC;AAEhC,eAAe;AACf,iHAAiH;AACjH,MAAM,oBAAoB,GAAG,2DAA2D,CAAC;AAEzF,MAAM,MAAM,GAAG,CACb,IAAY,EACZ,IAAkD,EAC1C,EAAE,CACV,IAAI,KAAK,oCAAe,CAAC,IAAI;IAC3B,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/B,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE1C,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,uDAAuD;YACpE,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,KAAK;SACnB;QACD,QAAQ,EAAE;YACR,eAAe,EAAE,uCAAuC;SACzD;QACD,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,MAAM;KAChB;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,OAAO,CAAC,EAAE;QAChB,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3C,OAAO;YACL,OAAO;gBACL,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;gBAC7C,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBACnB,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;wBACtC,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE;4BACvC,IAAI,EAAE,CAAC;4BACP,SAAS,EAAE,iBAAiB;4BAC5B,GAAG,CAAC,KAAK;gCACP,MAAM,UAAU,GAAG,UAAU,CAAC,eAAe,CAAC;oCAC5C,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oCAC3D,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI;iCACvB,CAAC,CAAC;gCACH,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC;oCAC1C,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM;oCACxB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;iCACrB,CAAC,CAAC;gCACH,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;4BACvD,CAAC;yBACF,CAAC,CAAC;qBACJ;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-types.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-types.js
index f0cba4b..eb9fc2d 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-types.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-types.js
@@ -1,12 +1,26 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.TYPE_KEYWORDS = void 0;
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const util = __importStar(require("../util"));
 function removeSpaces(str) {
     return str.replace(/ /g, '');
@@ -26,12 +40,6 @@
     }
     return '';
 }
-/*
-  Defaults for this rule should be treated as an "all or nothing"
-  merge, so we need special handling here.
-
-  See: https://github.com/typescript-eslint/typescript-eslint/issues/686
- */
 const defaultTypes = {
     String: {
         message: 'Use string instead',
@@ -45,14 +53,52 @@
         message: 'Use number instead',
         fixWith: 'number',
     },
-    Object: {
-        message: 'Use Record<string, any> instead',
-        fixWith: 'Record<string, any>',
-    },
     Symbol: {
         message: 'Use symbol instead',
         fixWith: 'symbol',
     },
+    Function: {
+        message: [
+            'The `Function` type accepts any function-like value.',
+            'It provides no type safety when calling the function, which can be a common source of bugs.',
+            'It also accepts things like class declarations, which will throw at runtime as they will not be called with `new`.',
+            'If you are expecting the function to accept certain arguments, you should explicitly define the function shape.',
+        ].join('\n'),
+    },
+    // object typing
+    Object: {
+        message: [
+            'The `Object` type actually means "any non-nullish value", so it is marginally better than `unknown`.',
+            '- If you want a type meaning "any object", you probably want `Record<string, unknown>` instead.',
+            '- If you want a type meaning "any value", you probably want `unknown` instead.',
+        ].join('\n'),
+    },
+    '{}': {
+        message: [
+            '`{}` actually means "any non-nullish value".',
+            '- If you want a type meaning "any object", you probably want `Record<string, unknown>` instead.',
+            '- If you want a type meaning "any value", you probably want `unknown` instead.',
+        ].join('\n'),
+    },
+    object: {
+        message: [
+            'The `object` type is currently hard to use ([see this issue](https://github.com/microsoft/TypeScript/issues/21732)).',
+            'Consider using `Record<string, unknown>` instead, as it allows you to more easily inspect and use the keys.',
+        ].join('\n'),
+    },
+};
+exports.TYPE_KEYWORDS = {
+    bigint: experimental_utils_1.AST_NODE_TYPES.TSBigIntKeyword,
+    boolean: experimental_utils_1.AST_NODE_TYPES.TSBooleanKeyword,
+    never: experimental_utils_1.AST_NODE_TYPES.TSNeverKeyword,
+    null: experimental_utils_1.AST_NODE_TYPES.TSNullKeyword,
+    number: experimental_utils_1.AST_NODE_TYPES.TSNumberKeyword,
+    object: experimental_utils_1.AST_NODE_TYPES.TSObjectKeyword,
+    string: experimental_utils_1.AST_NODE_TYPES.TSStringKeyword,
+    symbol: experimental_utils_1.AST_NODE_TYPES.TSSymbolKeyword,
+    undefined: experimental_utils_1.AST_NODE_TYPES.TSUndefinedKeyword,
+    unknown: experimental_utils_1.AST_NODE_TYPES.TSUnknownKeyword,
+    void: experimental_utils_1.AST_NODE_TYPES.TSVoidKeyword,
 };
 exports.default = util.createRule({
     name: 'ban-types',
@@ -65,7 +111,7 @@
         },
         fixable: 'code',
         messages: {
-            bannedTypeMessage: "Don't use '{{name}}' as a type.{{customMessage}}",
+            bannedTypeMessage: "Don't use `{{name}}` as a type.{{customMessage}}",
         },
         schema: [
             {
@@ -76,6 +122,7 @@
                         additionalProperties: {
                             oneOf: [
                                 { type: 'null' },
+                                { type: 'boolean' },
                                 { type: 'string' },
                                 {
                                     type: 'object',
@@ -99,37 +146,36 @@
     defaultOptions: [{}],
     create(context, [options]) {
         var _a, _b;
-        const extendDefaults = (_a = options.extendDefaults, (_a !== null && _a !== void 0 ? _a : true));
-        const customTypes = (_b = options.types, (_b !== null && _b !== void 0 ? _b : {}));
-        const types = Object.assign(Object.assign({}, (extendDefaults ? defaultTypes : {})), customTypes);
+        const extendDefaults = (_a = options.extendDefaults) !== null && _a !== void 0 ? _a : true;
+        const customTypes = (_b = options.types) !== null && _b !== void 0 ? _b : {};
+        const types = Object.assign({}, extendDefaults ? defaultTypes : {}, customTypes);
         const bannedTypes = new Map(Object.entries(types).map(([type, data]) => [removeSpaces(type), data]));
         function checkBannedTypes(typeNode, name = stringifyTypeName(typeNode, context.getSourceCode())) {
             const bannedType = bannedTypes.get(name);
-            if (bannedType !== undefined) {
-                const customMessage = getCustomMessage(bannedType);
-                const fixWith = bannedType && typeof bannedType === 'object' && bannedType.fixWith;
-                context.report({
-                    node: typeNode,
-                    messageId: 'bannedTypeMessage',
-                    data: {
-                        name,
-                        customMessage,
-                    },
-                    fix: fixWith
-                        ? (fixer) => fixer.replaceText(typeNode, fixWith)
-                        : null,
-                });
+            if (bannedType === undefined || bannedType === false) {
+                return;
             }
+            const customMessage = getCustomMessage(bannedType);
+            const fixWith = bannedType && typeof bannedType === 'object' && bannedType.fixWith;
+            context.report({
+                node: typeNode,
+                messageId: 'bannedTypeMessage',
+                data: {
+                    name,
+                    customMessage,
+                },
+                fix: fixWith
+                    ? (fixer) => fixer.replaceText(typeNode, fixWith)
+                    : null,
+            });
         }
-        return Object.assign(Object.assign(Object.assign({}, (bannedTypes.has('null') && {
-            TSNullKeyword(node) {
-                checkBannedTypes(node, 'null');
-            },
-        })), (bannedTypes.has('undefined') && {
-            TSUndefinedKeyword(node) {
-                checkBannedTypes(node, 'undefined');
-            },
-        })), { TSTypeLiteral(node) {
+        const keywordSelectors = util.objectReduceKey(exports.TYPE_KEYWORDS, (acc, keyword) => {
+            if (bannedTypes.has(keyword)) {
+                acc[exports.TYPE_KEYWORDS[keyword]] = (node) => checkBannedTypes(node, keyword);
+            }
+            return acc;
+        }, {});
+        return Object.assign(Object.assign({}, keywordSelectors), { TSTypeLiteral(node) {
                 if (node.members.length) {
                     return;
                 }
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-types.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-types.js.map
index 686410e..3f3eb61 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-types.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/ban-types.js.map
@@ -1 +1 @@
-{"version":3,"file":"ban-types.js","sourceRoot":"","sources":["../../src/rules/ban-types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"ban-types.js","sourceRoot":"","sources":["../../src/rules/ban-types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/camelcase.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/camelcase.js
deleted file mode 100644
index 9a31bc0..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/camelcase.js
+++ /dev/null
@@ -1,144 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const camelcase_1 = __importDefault(require("eslint/lib/rules/camelcase"));
-const util = __importStar(require("../util"));
-const schema = util.deepMerge(Array.isArray(camelcase_1.default.meta.schema)
-    ? camelcase_1.default.meta.schema[0]
-    : camelcase_1.default.meta.schema, {
-    properties: {
-        genericType: {
-            enum: ['always', 'never'],
-        },
-    },
-});
-exports.default = util.createRule({
-    name: 'camelcase',
-    meta: {
-        type: 'suggestion',
-        docs: {
-            description: 'Enforce camelCase naming convention',
-            category: 'Stylistic Issues',
-            recommended: 'error',
-            extendsBaseRule: true,
-        },
-        deprecated: true,
-        replacedBy: ['naming-convention'],
-        schema: [schema],
-        messages: camelcase_1.default.meta.messages,
-    },
-    defaultOptions: [
-        {
-            allow: ['^UNSAFE_'],
-            ignoreDestructuring: false,
-            properties: 'never',
-            genericType: 'never',
-        },
-    ],
-    create(context, [options]) {
-        var _a, _b;
-        const rules = camelcase_1.default.create(context);
-        const TS_PROPERTY_TYPES = [
-            experimental_utils_1.AST_NODE_TYPES.TSPropertySignature,
-            experimental_utils_1.AST_NODE_TYPES.ClassProperty,
-            experimental_utils_1.AST_NODE_TYPES.TSParameterProperty,
-            experimental_utils_1.AST_NODE_TYPES.TSAbstractClassProperty,
-        ];
-        const genericType = options.genericType;
-        const properties = options.properties;
-        const allow = (_b = (_a = options.allow) === null || _a === void 0 ? void 0 : _a.map(entry => ({
-            name: entry,
-            regex: new RegExp(entry),
-        })), (_b !== null && _b !== void 0 ? _b : []));
-        /**
-         * Checks if a string contains an underscore and isn't all upper-case
-         * @param  name The string to check.
-         */
-        function isUnderscored(name) {
-            // if there's an underscore, it might be A_CONSTANT, which is okay
-            return name.includes('_') && name !== name.toUpperCase();
-        }
-        /**
-         * Checks if a string match the ignore list
-         * @param name The string to check.
-         * @returns if the string is ignored
-         * @private
-         */
-        function isAllowed(name) {
-            return (allow.findIndex(entry => name === entry.name || entry.regex.test(name)) !== -1);
-        }
-        /**
-         * Checks if the the node is a valid TypeScript property type.
-         * @param node the node to be validated.
-         * @returns true if the node is a TypeScript property type.
-         * @private
-         */
-        function isTSPropertyType(node) {
-            if (TS_PROPERTY_TYPES.includes(node.type)) {
-                return true;
-            }
-            if (node.type === experimental_utils_1.AST_NODE_TYPES.AssignmentPattern) {
-                return (node.parent !== undefined &&
-                    TS_PROPERTY_TYPES.includes(node.parent.type));
-            }
-            return false;
-        }
-        function report(node) {
-            context.report({
-                node,
-                messageId: 'notCamelCase',
-                data: { name: node.name },
-            });
-        }
-        return {
-            Identifier(node) {
-                /*
-                 * Leading and trailing underscores are commonly used to flag
-                 * private/protected identifiers, strip them
-                 */
-                const name = node.name.replace(/^_+|_+$/g, '');
-                // First, we ignore the node if it match the ignore list
-                if (isAllowed(name)) {
-                    return;
-                }
-                // Check TypeScript specific nodes
-                const parent = node.parent;
-                if (parent && isTSPropertyType(parent)) {
-                    if (properties === 'always' && isUnderscored(name)) {
-                        report(node);
-                    }
-                    return;
-                }
-                if (parent && parent.type === experimental_utils_1.AST_NODE_TYPES.TSTypeParameter) {
-                    if (genericType === 'always' && isUnderscored(name)) {
-                        report(node);
-                    }
-                    return;
-                }
-                if (parent && parent.type === experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression) {
-                    // Report underscored object names
-                    if (properties === 'always' &&
-                        parent.object.type === experimental_utils_1.AST_NODE_TYPES.Identifier &&
-                        parent.object.name === node.name &&
-                        isUnderscored(name)) {
-                        report(node);
-                    }
-                    return;
-                }
-                // Let the base rule deal with the rest
-                rules.Identifier(node);
-            },
-        };
-    },
-});
-//# sourceMappingURL=camelcase.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/camelcase.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/camelcase.js.map
deleted file mode 100644
index 73957ec..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/camelcase.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"camelcase.js","sourceRoot":"","sources":["../../src/rules/camelcase.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/class-literal-property-style.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/class-literal-property-style.js
new file mode 100644
index 0000000..2d6e062
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/class-literal-property-style.js
@@ -0,0 +1,114 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const util = __importStar(require("../util"));
+const printNodeModifiers = (node, final) => {
+    var _a;
+    return `${(_a = node.accessibility) !== null && _a !== void 0 ? _a : ''}${node.static ? ' static' : ''} ${final} `.trimLeft();
+};
+const isSupportedLiteral = (node) => {
+    if (node.type === experimental_utils_1.AST_NODE_TYPES.Literal) {
+        return true;
+    }
+    if (node.type === experimental_utils_1.AST_NODE_TYPES.TaggedTemplateExpression ||
+        node.type === experimental_utils_1.AST_NODE_TYPES.TemplateLiteral) {
+        return ('quasi' in node ? node.quasi.quasis : node.quasis).length === 1;
+    }
+    return false;
+};
+exports.default = util.createRule({
+    name: 'class-literal-property-style',
+    meta: {
+        type: 'problem',
+        docs: {
+            description: 'Ensures that literals on classes are exposed in a consistent style',
+            category: 'Best Practices',
+            recommended: false,
+        },
+        fixable: 'code',
+        messages: {
+            preferFieldStyle: 'Literals should be exposed using readonly fields.',
+            preferGetterStyle: 'Literals should be exposed using getters.',
+        },
+        schema: [{ enum: ['fields', 'getters'] }],
+    },
+    defaultOptions: ['fields'],
+    create(context, [style]) {
+        if (style === 'fields') {
+            return {
+                MethodDefinition(node) {
+                    if (node.kind !== 'get' ||
+                        !node.value.body ||
+                        !node.value.body.body.length) {
+                        return;
+                    }
+                    const [statement] = node.value.body.body;
+                    if (statement.type !== experimental_utils_1.AST_NODE_TYPES.ReturnStatement) {
+                        return;
+                    }
+                    const { argument } = statement;
+                    if (!argument || !isSupportedLiteral(argument)) {
+                        return;
+                    }
+                    context.report({
+                        node: node.key,
+                        messageId: 'preferFieldStyle',
+                        fix(fixer) {
+                            const sourceCode = context.getSourceCode();
+                            const name = sourceCode.getText(node.key);
+                            let text = '';
+                            text += printNodeModifiers(node, 'readonly');
+                            text += node.computed ? `[${name}]` : name;
+                            text += ` = ${sourceCode.getText(argument)};`;
+                            return fixer.replaceText(node, text);
+                        },
+                    });
+                },
+            };
+        }
+        return {
+            ClassProperty(node) {
+                if (!node.readonly || node.declare) {
+                    return;
+                }
+                const { value } = node;
+                if (!value || !isSupportedLiteral(value)) {
+                    return;
+                }
+                context.report({
+                    node: node.key,
+                    messageId: 'preferGetterStyle',
+                    fix(fixer) {
+                        const sourceCode = context.getSourceCode();
+                        const name = sourceCode.getText(node.key);
+                        let text = '';
+                        text += printNodeModifiers(node, 'get');
+                        text += node.computed ? `[${name}]` : name;
+                        text += `() { return ${sourceCode.getText(value)}; }`;
+                        return fixer.replaceText(node, text);
+                    },
+                });
+            },
+        };
+    },
+});
+//# sourceMappingURL=class-literal-property-style.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/class-literal-property-style.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/class-literal-property-style.js.map
new file mode 100644
index 0000000..99fba14
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/class-literal-property-style.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"class-literal-property-style.js","sourceRoot":"","sources":["../../src/rules/class-literal-property-style.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/class-name-casing.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/class-name-casing.js
deleted file mode 100644
index 2103564..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/class-name-casing.js
+++ /dev/null
@@ -1,112 +0,0 @@
-"use strict";
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const util = __importStar(require("../util"));
-exports.default = util.createRule({
-    name: 'class-name-casing',
-    meta: {
-        type: 'suggestion',
-        docs: {
-            description: 'Require PascalCased class and interface names',
-            category: 'Best Practices',
-            recommended: 'error',
-        },
-        deprecated: true,
-        replacedBy: ['naming-convention'],
-        messages: {
-            notPascalCased: "{{friendlyName}} '{{name}}' must be PascalCased.",
-        },
-        schema: [
-            {
-                type: 'object',
-                properties: {
-                    allowUnderscorePrefix: {
-                        type: 'boolean',
-                        default: false,
-                    },
-                },
-                additionalProperties: false,
-            },
-        ],
-    },
-    defaultOptions: [{ allowUnderscorePrefix: false }],
-    create(context, [options]) {
-        const UNDERSCORE = '_';
-        /**
-         * Determine if the string is Upper cased
-         * @param str
-         */
-        function isUpperCase(str) {
-            return str === str.toUpperCase();
-        }
-        /**
-         * Determine if the identifier name is PascalCased
-         * @param name The identifier name
-         */
-        function isPascalCase(name) {
-            const startIndex = options.allowUnderscorePrefix && name.startsWith(UNDERSCORE) ? 1 : 0;
-            return (isUpperCase(name.charAt(startIndex)) &&
-                !name.includes(UNDERSCORE, startIndex));
-        }
-        /**
-         * Report a class declaration as invalid
-         * @param decl The declaration
-         * @param id The name of the declaration
-         */
-        function report(decl, id) {
-            let friendlyName;
-            switch (decl.type) {
-                case experimental_utils_1.AST_NODE_TYPES.ClassDeclaration:
-                case experimental_utils_1.AST_NODE_TYPES.ClassExpression:
-                    friendlyName = decl.abstract ? 'Abstract class' : 'Class';
-                    break;
-                case experimental_utils_1.AST_NODE_TYPES.TSInterfaceDeclaration:
-                    friendlyName = 'Interface';
-                    break;
-            }
-            context.report({
-                node: id,
-                messageId: 'notPascalCased',
-                data: {
-                    friendlyName,
-                    name: id.name,
-                },
-            });
-        }
-        return {
-            'ClassDeclaration, TSInterfaceDeclaration, ClassExpression'(node) {
-                // class expressions (i.e. export default class {}) are OK
-                if (node.id && !isPascalCase(node.id.name)) {
-                    report(node, node.id);
-                }
-            },
-            "VariableDeclarator[init.type='ClassExpression']"(node) {
-                if (node.id.type === experimental_utils_1.AST_NODE_TYPES.ArrayPattern ||
-                    node.id.type === experimental_utils_1.AST_NODE_TYPES.ObjectPattern) {
-                    // TODO - handle the BindingPattern case maybe?
-                    /*
-                    // this example makes me barf, but it's valid code
-                    var { bar } = class {
-                      static bar() { return 2 }
-                    }
-                    */
-                }
-                else {
-                    const id = node.id;
-                    const nodeInit = node.init;
-                    if (id && !nodeInit.id && !isPascalCase(id.name)) {
-                        report(nodeInit, id);
-                    }
-                }
-            },
-        };
-    },
-});
-//# sourceMappingURL=class-name-casing.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/class-name-casing.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/class-name-casing.js.map
deleted file mode 100644
index cd520f2..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/class-name-casing.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"class-name-casing.js","sourceRoot":"","sources":["../../src/rules/class-name-casing.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-dangle.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-dangle.js
new file mode 100644
index 0000000..5083584
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-dangle.js
@@ -0,0 +1,177 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const util = __importStar(require("../util"));
+const comma_dangle_1 = __importDefault(require("eslint/lib/rules/comma-dangle"));
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const OPTION_VALUE_SCHEME = [
+    'always-multiline',
+    'always',
+    'never',
+    'only-multiline',
+];
+const DEFAULT_OPTION_VALUE = 'never';
+function normalizeOptions(options) {
+    var _a, _b, _c;
+    if (typeof options === 'string') {
+        return {
+            enums: options,
+            generics: options,
+            tuples: options,
+        };
+    }
+    return {
+        enums: (_a = options.enums) !== null && _a !== void 0 ? _a : DEFAULT_OPTION_VALUE,
+        generics: (_b = options.generics) !== null && _b !== void 0 ? _b : DEFAULT_OPTION_VALUE,
+        tuples: (_c = options.tuples) !== null && _c !== void 0 ? _c : DEFAULT_OPTION_VALUE,
+    };
+}
+exports.default = util.createRule({
+    name: 'comma-dangle',
+    meta: {
+        type: 'layout',
+        docs: {
+            description: 'Require or disallow trailing comma',
+            category: 'Stylistic Issues',
+            recommended: false,
+            extendsBaseRule: true,
+        },
+        schema: {
+            definitions: {
+                value: {
+                    enum: OPTION_VALUE_SCHEME,
+                },
+                valueWithIgnore: {
+                    enum: [...OPTION_VALUE_SCHEME, 'ignore'],
+                },
+            },
+            type: 'array',
+            items: [
+                {
+                    oneOf: [
+                        {
+                            $ref: '#/definitions/value',
+                        },
+                        {
+                            type: 'object',
+                            properties: {
+                                arrays: { $ref: '#/definitions/valueWithIgnore' },
+                                objects: { $ref: '#/definitions/valueWithIgnore' },
+                                imports: { $ref: '#/definitions/valueWithIgnore' },
+                                exports: { $ref: '#/definitions/valueWithIgnore' },
+                                functions: { $ref: '#/definitions/valueWithIgnore' },
+                                enums: { $ref: '#/definitions/valueWithIgnore' },
+                                generics: { $ref: '#/definitions/valueWithIgnore' },
+                                tuples: { $ref: '#/definitions/valueWithIgnore' },
+                            },
+                            additionalProperties: false,
+                        },
+                    ],
+                },
+            ],
+        },
+        fixable: 'code',
+        messages: comma_dangle_1.default.meta.messages,
+    },
+    defaultOptions: ['never'],
+    create(context, [options]) {
+        const rules = comma_dangle_1.default.create(context);
+        const sourceCode = context.getSourceCode();
+        const normalizedOptions = normalizeOptions(options);
+        const predicate = {
+            always: forceComma,
+            'always-multiline': forceCommaIfMultiline,
+            'only-multiline': allowCommaIfMultiline,
+            never: forbidComma,
+            ignore: () => { },
+        };
+        function last(nodes) {
+            var _a;
+            return (_a = nodes[nodes.length - 1]) !== null && _a !== void 0 ? _a : null;
+        }
+        function getLastItem(node) {
+            switch (node.type) {
+                case experimental_utils_1.AST_NODE_TYPES.TSEnumDeclaration:
+                    return last(node.members);
+                case experimental_utils_1.AST_NODE_TYPES.TSTypeParameterDeclaration:
+                    return last(node.params);
+                case experimental_utils_1.AST_NODE_TYPES.TSTupleType:
+                    return last(node.elementTypes);
+                default:
+                    return null;
+            }
+        }
+        function getTrailingToken(node) {
+            const last = getLastItem(node);
+            const trailing = last && sourceCode.getTokenAfter(last);
+            return trailing;
+        }
+        function isMultiline(node) {
+            const last = getLastItem(node);
+            const lastToken = sourceCode.getLastToken(node);
+            return (last === null || last === void 0 ? void 0 : last.loc.end.line) !== (lastToken === null || lastToken === void 0 ? void 0 : lastToken.loc.end.line);
+        }
+        function forbidComma(node) {
+            const last = getLastItem(node);
+            const trailing = getTrailingToken(node);
+            if (last && trailing && util.isCommaToken(trailing)) {
+                context.report({
+                    node,
+                    messageId: 'unexpected',
+                    fix(fixer) {
+                        return fixer.remove(trailing);
+                    },
+                });
+            }
+        }
+        function forceComma(node) {
+            const last = getLastItem(node);
+            const trailing = getTrailingToken(node);
+            if (last && trailing && !util.isCommaToken(trailing)) {
+                context.report({
+                    node,
+                    messageId: 'missing',
+                    fix(fixer) {
+                        return fixer.insertTextAfter(last, ',');
+                    },
+                });
+            }
+        }
+        function allowCommaIfMultiline(node) {
+            if (!isMultiline(node)) {
+                forbidComma(node);
+            }
+        }
+        function forceCommaIfMultiline(node) {
+            if (isMultiline(node)) {
+                forceComma(node);
+            }
+            else {
+                forbidComma(node);
+            }
+        }
+        return Object.assign(Object.assign({}, rules), { TSEnumDeclaration: predicate[normalizedOptions.enums], TSTypeParameterDeclaration: predicate[normalizedOptions.generics], TSTupleType: predicate[normalizedOptions.tuples] });
+    },
+});
+//# sourceMappingURL=comma-dangle.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-dangle.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-dangle.js.map
new file mode 100644
index 0000000..d9f1400
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-dangle.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"comma-dangle.js","sourceRoot":"","sources":["../../src/rules/comma-dangle.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-spacing.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-spacing.js
index 59a10e2..6e2c440 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-spacing.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-spacing.js
@@ -1,7 +1,6 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const eslint_utils_1 = require("eslint-utils");
 const util_1 = require("../util");
 exports.default = util_1.createRule({
     name: 'comma-spacing',
@@ -55,7 +54,7 @@
                 let token;
                 if (element === null) {
                     token = sourceCode.getTokenAfter(previousToken);
-                    if (token && eslint_utils_1.isCommaToken(token)) {
+                    if (token && util_1.isCommaToken(token)) {
                         ignoredTokens.add(token);
                     }
                 }
@@ -72,7 +71,7 @@
         function addTypeParametersTrailingCommaToIgnoreList(node) {
             const param = node.params[node.params.length - 1];
             const afterToken = sourceCode.getTokenAfter(param);
-            if (afterToken && eslint_utils_1.isCommaToken(afterToken)) {
+            if (afterToken && util_1.isCommaToken(afterToken)) {
                 ignoredTokens.add(afterToken);
             }
         }
@@ -85,7 +84,7 @@
         function validateCommaSpacing(commaToken, prevToken, nextToken) {
             if (prevToken &&
                 util_1.isTokenOnSameLine(prevToken, commaToken) &&
-                spaceBefore !== sourceCode.isSpaceBetween(prevToken, commaToken)) {
+                spaceBefore !== sourceCode.isSpaceBetweenTokens(prevToken, commaToken)) {
                 context.report({
                     node: commaToken,
                     data: {
@@ -97,7 +96,7 @@
                         : fixer.replaceTextRange([prevToken.range[1], commaToken.range[0]], ''),
                 });
             }
-            if (nextToken && eslint_utils_1.isClosingParenToken(nextToken)) {
+            if (nextToken && util_1.isClosingParenToken(nextToken)) {
                 return;
             }
             if (!spaceAfter && nextToken && nextToken.type === experimental_utils_1.AST_TOKEN_TYPES.Line) {
@@ -105,7 +104,7 @@
             }
             if (nextToken &&
                 util_1.isTokenOnSameLine(commaToken, nextToken) &&
-                spaceAfter !== sourceCode.isSpaceBetween(commaToken, nextToken)) {
+                spaceAfter !== sourceCode.isSpaceBetweenTokens(commaToken, nextToken)) {
                 context.report({
                     node: commaToken,
                     data: {
@@ -124,14 +123,14 @@
             ArrayPattern: addNullElementsToIgnoreList,
             'Program:exit'() {
                 tokensAndComments.forEach((token, i) => {
-                    if (!eslint_utils_1.isCommaToken(token)) {
+                    if (!util_1.isCommaToken(token)) {
                         return;
                     }
                     const prevToken = tokensAndComments[i - 1];
                     const nextToken = tokensAndComments[i + 1];
-                    validateCommaSpacing(token, eslint_utils_1.isCommaToken(prevToken) || ignoredTokens.has(token)
+                    validateCommaSpacing(token, util_1.isCommaToken(prevToken) || ignoredTokens.has(token)
                         ? null
-                        : prevToken, eslint_utils_1.isCommaToken(nextToken) || ignoredTokens.has(token)
+                        : prevToken, util_1.isCommaToken(nextToken) || ignoredTokens.has(token)
                         ? null
                         : nextToken);
                 });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-spacing.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-spacing.js.map
index 82702c1..9ddd17a 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-spacing.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/comma-spacing.js.map
@@ -1 +1 @@
-{"version":3,"file":"comma-spacing.js","sourceRoot":"","sources":["../../src/rules/comma-spacing.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"comma-spacing.js","sourceRoot":"","sources":["../../src/rules/comma-spacing.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-assertions.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-assertions.js
index 7f517a1..00e292a 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-assertions.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-assertions.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -16,7 +28,7 @@
         docs: {
             category: 'Best Practices',
             description: 'Enforces consistent usage of type assertions',
-            recommended: 'error',
+            recommended: false,
         },
         messages: {
             as: "Use 'as {{cast}}' instead of '<{{cast}}>'.",
@@ -62,7 +74,18 @@
     ],
     create(context, [options]) {
         const sourceCode = context.getSourceCode();
+        function isConst(node) {
+            if (node.type !== experimental_utils_1.AST_NODE_TYPES.TSTypeReference) {
+                return false;
+            }
+            return (node.typeName.type === experimental_utils_1.AST_NODE_TYPES.Identifier &&
+                node.typeName.name === 'const');
+        }
         function reportIncorrectAssertionType(node) {
+            // If this node is `as const`, then don't report an error.
+            if (isConst(node.typeAnnotation)) {
+                return;
+            }
             const messageId = options.assertionStyle;
             context.report({
                 node,
@@ -80,8 +103,7 @@
                 case experimental_utils_1.AST_NODE_TYPES.TSTypeReference:
                     return (
                     // Ignore `as const` and `<const>`
-                    (node.typeName.type === experimental_utils_1.AST_NODE_TYPES.Identifier &&
-                        node.typeName.name !== 'const') ||
+                    !isConst(node) ||
                         // Allow qualified names which have dots between identifiers, `Foo.Bar`
                         node.typeName.type === experimental_utils_1.AST_NODE_TYPES.TSQualifiedName);
                 default:
@@ -98,7 +120,6 @@
                 node.parent &&
                 (node.parent.type === experimental_utils_1.AST_NODE_TYPES.NewExpression ||
                     node.parent.type === experimental_utils_1.AST_NODE_TYPES.CallExpression ||
-                    node.parent.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression ||
                     node.parent.type === experimental_utils_1.AST_NODE_TYPES.ThrowStatement ||
                     node.parent.type === experimental_utils_1.AST_NODE_TYPES.AssignmentPattern)) {
                 return;
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-assertions.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-assertions.js.map
index b30cb14..41dd8b1 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-assertions.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-assertions.js.map
@@ -1 +1 @@
-{"version":3,"file":"consistent-type-assertions.js","sourceRoot":"","sources":["../../src/rules/consistent-type-assertions.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"consistent-type-assertions.js","sourceRoot":"","sources":["../../src/rules/consistent-type-assertions.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-definitions.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-definitions.js
index 2789140..cd0de69 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-definitions.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-definitions.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -20,8 +32,8 @@
             recommended: false,
         },
         messages: {
-            interfaceOverType: 'Use an `interface` instead of a `type`',
-            typeOverInterface: 'Use a `type` instead of an `interface`',
+            interfaceOverType: 'Use an `interface` instead of a `type`.',
+            typeOverInterface: 'Use a `type` instead of an `interface`.',
         },
         schema: [
             {
@@ -41,7 +53,7 @@
                         messageId: 'interfaceOverType',
                         fix(fixer) {
                             var _a;
-                            const typeNode = (_a = node.typeParameters, (_a !== null && _a !== void 0 ? _a : node.id));
+                            const typeNode = (_a = node.typeParameters) !== null && _a !== void 0 ? _a : node.id;
                             const fixes = [];
                             const firstToken = sourceCode.getFirstToken(node);
                             if (firstToken) {
@@ -66,7 +78,7 @@
                         messageId: 'typeOverInterface',
                         fix(fixer) {
                             var _a;
-                            const typeNode = (_a = node.typeParameters, (_a !== null && _a !== void 0 ? _a : node.id));
+                            const typeNode = (_a = node.typeParameters) !== null && _a !== void 0 ? _a : node.id;
                             const fixes = [];
                             const firstToken = sourceCode.getFirstToken(node);
                             if (firstToken) {
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-definitions.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-definitions.js.map
index 593e029..a9d96cb 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-definitions.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-definitions.js.map
@@ -1 +1 @@
-{"version":3,"file":"consistent-type-definitions.js","sourceRoot":"","sources":["../../src/rules/consistent-type-definitions.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"consistent-type-definitions.js","sourceRoot":"","sources":["../../src/rules/consistent-type-definitions.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-imports.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-imports.js
new file mode 100644
index 0000000..c61196c
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-imports.js
@@ -0,0 +1,392 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const util = __importStar(require("../util"));
+function isImportToken(token) {
+    return token.type === experimental_utils_1.AST_TOKEN_TYPES.Keyword && token.value === 'import';
+}
+function isTypeToken(token) {
+    return token.type === experimental_utils_1.AST_TOKEN_TYPES.Identifier && token.value === 'type';
+}
+exports.default = util.createRule({
+    name: 'consistent-type-imports',
+    meta: {
+        type: 'suggestion',
+        docs: {
+            description: 'Enforces consistent usage of type imports',
+            category: 'Stylistic Issues',
+            recommended: false,
+        },
+        messages: {
+            typeOverValue: 'All imports in the declaration are only used as types. Use `import type`',
+            someImportsAreOnlyTypes: 'Imports {{typeImports}} are only used as types',
+            aImportIsOnlyTypes: 'Import {{typeImports}} is only used as types',
+            valueOverType: 'Use an `import` instead of an `import type`.',
+            noImportTypeAnnotations: '`import()` type annotations are forbidden.',
+        },
+        schema: [
+            {
+                type: 'object',
+                properties: {
+                    prefer: {
+                        enum: ['type-imports', 'no-type-imports'],
+                    },
+                    disallowTypeAnnotations: {
+                        type: 'boolean',
+                    },
+                },
+                additionalProperties: false,
+            },
+        ],
+        fixable: 'code',
+    },
+    defaultOptions: [
+        {
+            prefer: 'type-imports',
+            disallowTypeAnnotations: true,
+        },
+    ],
+    create(context, [option]) {
+        var _a;
+        const prefer = (_a = option.prefer) !== null && _a !== void 0 ? _a : 'type-imports';
+        const disallowTypeAnnotations = option.disallowTypeAnnotations !== false;
+        const sourceCode = context.getSourceCode();
+        const sourceImportsMap = {};
+        return Object.assign(Object.assign({}, (prefer === 'type-imports'
+            ? {
+                // prefer type imports
+                ImportDeclaration(node) {
+                    var _a;
+                    const source = node.source.value;
+                    const sourceImports = (_a = sourceImportsMap[source]) !== null && _a !== void 0 ? _a : (sourceImportsMap[source] = {
+                        source,
+                        reportValueImports: [],
+                        typeOnlyNamedImport: null,
+                    });
+                    if (node.importKind === 'type') {
+                        if (!sourceImports.typeOnlyNamedImport &&
+                            node.specifiers.every(specifier => specifier.type === experimental_utils_1.AST_NODE_TYPES.ImportSpecifier)) {
+                            sourceImports.typeOnlyNamedImport = node;
+                        }
+                        return;
+                    }
+                    // if importKind === 'value'
+                    const typeSpecifiers = [];
+                    const valueSpecifiers = [];
+                    const unusedSpecifiers = [];
+                    for (const specifier of node.specifiers) {
+                        const [variable] = context.getDeclaredVariables(specifier);
+                        if (variable.references.length === 0) {
+                            unusedSpecifiers.push(specifier);
+                        }
+                        else {
+                            const onlyHasTypeReferences = variable.references.every(ref => {
+                                if (ref.isValueReference) {
+                                    // `type T = typeof foo` will create a value reference because "foo" must be a value type
+                                    // however this value reference is safe to use with type-only imports
+                                    let parent = ref.identifier.parent;
+                                    while (parent) {
+                                        if (parent.type === experimental_utils_1.AST_NODE_TYPES.TSTypeQuery) {
+                                            return true;
+                                        }
+                                        // TSTypeQuery must have a TSESTree.EntityName as its child, so we can filter here and break early
+                                        if (parent.type !== experimental_utils_1.AST_NODE_TYPES.TSQualifiedName) {
+                                            break;
+                                        }
+                                        parent = parent.parent;
+                                    }
+                                    return false;
+                                }
+                                return ref.isTypeReference;
+                            });
+                            if (onlyHasTypeReferences) {
+                                typeSpecifiers.push(specifier);
+                            }
+                            else {
+                                valueSpecifiers.push(specifier);
+                            }
+                        }
+                    }
+                    if (typeSpecifiers.length) {
+                        sourceImports.reportValueImports.push({
+                            node,
+                            typeSpecifiers,
+                            valueSpecifiers,
+                            unusedSpecifiers,
+                        });
+                    }
+                },
+                'Program:exit'() {
+                    for (const sourceImports of Object.values(sourceImportsMap)) {
+                        if (sourceImports.reportValueImports.length === 0) {
+                            continue;
+                        }
+                        for (const report of sourceImports.reportValueImports) {
+                            if (report.valueSpecifiers.length === 0 &&
+                                report.unusedSpecifiers.length === 0) {
+                                // import is all type-only, convert the entire import to `import type`
+                                context.report({
+                                    node: report.node,
+                                    messageId: 'typeOverValue',
+                                    *fix(fixer) {
+                                        yield* fixToTypeImport(fixer, report, sourceImports);
+                                    },
+                                });
+                            }
+                            else {
+                                // we have a mixed type/value import, so we need to split them out into multiple exports
+                                const typeImportNames = report.typeSpecifiers.map(specifier => `"${specifier.local.name}"`);
+                                context.report({
+                                    node: report.node,
+                                    messageId: typeImportNames.length === 1
+                                        ? 'aImportIsOnlyTypes'
+                                        : 'someImportsAreOnlyTypes',
+                                    data: {
+                                        typeImports: typeImportNames.length === 1
+                                            ? typeImportNames[0]
+                                            : [
+                                                typeImportNames.slice(0, -1).join(', '),
+                                                typeImportNames.slice(-1)[0],
+                                            ].join(' and '),
+                                    },
+                                    *fix(fixer) {
+                                        yield* fixToTypeImport(fixer, report, sourceImports);
+                                    },
+                                });
+                            }
+                        }
+                    }
+                },
+            }
+            : {
+                // prefer no type imports
+                'ImportDeclaration[importKind = "type"]'(node) {
+                    context.report({
+                        node,
+                        messageId: 'valueOverType',
+                        fix(fixer) {
+                            return fixToValueImport(fixer, node);
+                        },
+                    });
+                },
+            })), (disallowTypeAnnotations
+            ? {
+                // disallow `import()` type
+                TSImportType(node) {
+                    context.report({
+                        node,
+                        messageId: 'noImportTypeAnnotations',
+                    });
+                },
+            }
+            : {}));
+        function* fixToTypeImport(fixer, report, sourceImports) {
+            const { node } = report;
+            const defaultSpecifier = node.specifiers[0].type === experimental_utils_1.AST_NODE_TYPES.ImportDefaultSpecifier
+                ? node.specifiers[0]
+                : null;
+            const namespaceSpecifier = node.specifiers[0].type === experimental_utils_1.AST_NODE_TYPES.ImportNamespaceSpecifier
+                ? node.specifiers[0]
+                : null;
+            const namedSpecifiers = node.specifiers.filter((specifier) => specifier.type === experimental_utils_1.AST_NODE_TYPES.ImportSpecifier);
+            if (namespaceSpecifier) {
+                // e.g.
+                // import * as types from 'foo'
+                yield* fixToTypeImportByInsertType(fixer, node, false);
+                return;
+            }
+            else if (defaultSpecifier) {
+                if (report.typeSpecifiers.includes(defaultSpecifier) &&
+                    namedSpecifiers.length === 0) {
+                    // e.g.
+                    // import Type from 'foo'
+                    yield* fixToTypeImportByInsertType(fixer, node, true);
+                    return;
+                }
+            }
+            else {
+                if (namedSpecifiers.every(specifier => report.typeSpecifiers.includes(specifier))) {
+                    // e.g.
+                    // import {Type1, Type2} from 'foo'
+                    yield* fixToTypeImportByInsertType(fixer, node, false);
+                    return;
+                }
+            }
+            const typeNamedSpecifiers = namedSpecifiers.filter(specifier => report.typeSpecifiers.includes(specifier));
+            const fixesNamedSpecifiers = getFixesNamedSpecifiers(typeNamedSpecifiers, namedSpecifiers);
+            const afterFixes = [];
+            if (typeNamedSpecifiers.length) {
+                if (sourceImports.typeOnlyNamedImport) {
+                    const closingBraceToken = util.nullThrows(sourceCode.getFirstTokenBetween(sourceCode.getFirstToken(sourceImports.typeOnlyNamedImport), sourceImports.typeOnlyNamedImport.source, util.isClosingBraceToken), util.NullThrowsReasons.MissingToken('}', sourceImports.typeOnlyNamedImport.type));
+                    let insertText = fixesNamedSpecifiers.typeNamedSpecifiersText;
+                    const before = sourceCode.getTokenBefore(closingBraceToken);
+                    if (!util.isCommaToken(before) && !util.isOpeningBraceToken(before)) {
+                        insertText = ',' + insertText;
+                    }
+                    // import type { Already, Type1, Type2 } from 'foo'
+                    //                       ^^^^^^^^^^^^^ insert
+                    const insertTypeNamedSpecifiers = fixer.insertTextBefore(closingBraceToken, insertText);
+                    if (sourceImports.typeOnlyNamedImport.range[1] <= node.range[0]) {
+                        yield insertTypeNamedSpecifiers;
+                    }
+                    else {
+                        afterFixes.push(insertTypeNamedSpecifiers);
+                    }
+                }
+                else {
+                    yield fixer.insertTextBefore(node, `import type {${fixesNamedSpecifiers.typeNamedSpecifiersText}} from ${sourceCode.getText(node.source)};\n`);
+                }
+            }
+            if (defaultSpecifier &&
+                report.typeSpecifiers.includes(defaultSpecifier)) {
+                if (typeNamedSpecifiers.length === namedSpecifiers.length) {
+                    const importToken = util.nullThrows(sourceCode.getFirstToken(node, isImportToken), util.NullThrowsReasons.MissingToken('import', node.type));
+                    // import type Type from 'foo'
+                    //        ^^^^ insert
+                    yield fixer.insertTextAfter(importToken, ' type');
+                }
+                else {
+                    yield fixer.insertTextBefore(node, `import type ${sourceCode.getText(defaultSpecifier)} from ${sourceCode.getText(node.source)};\n`);
+                    // import Type , {...} from 'foo'
+                    //        ^^^^^^ remove
+                    yield fixer.remove(defaultSpecifier);
+                    yield fixer.remove(sourceCode.getTokenAfter(defaultSpecifier));
+                }
+            }
+            yield* fixesNamedSpecifiers.removeTypeNamedSpecifiers;
+            yield* afterFixes;
+            /**
+             * Returns information for fixing named specifiers.
+             */
+            function getFixesNamedSpecifiers(typeNamedSpecifiers, allNamedSpecifiers) {
+                const typeNamedSpecifiersTexts = [];
+                const removeTypeNamedSpecifiers = [];
+                if (typeNamedSpecifiers.length === allNamedSpecifiers.length) {
+                    // e.g.
+                    // import Foo, {Type1, Type2} from 'foo'
+                    // import DefType, {Type1, Type2} from 'foo'
+                    const openingBraceToken = util.nullThrows(sourceCode.getTokenBefore(typeNamedSpecifiers[0], util.isOpeningBraceToken), util.NullThrowsReasons.MissingToken('{', node.type));
+                    const commaToken = util.nullThrows(sourceCode.getTokenBefore(openingBraceToken, util.isCommaToken), util.NullThrowsReasons.MissingToken(',', node.type));
+                    const closingBraceToken = util.nullThrows(sourceCode.getFirstTokenBetween(openingBraceToken, node.source, util.isClosingBraceToken), util.NullThrowsReasons.MissingToken('}', node.type));
+                    // import DefType, {...} from 'foo'
+                    //               ^^^^^^^ remove
+                    removeTypeNamedSpecifiers.push(fixer.removeRange([
+                        commaToken.range[0],
+                        closingBraceToken.range[1],
+                    ]));
+                    typeNamedSpecifiersTexts.push(sourceCode.text.slice(openingBraceToken.range[1], closingBraceToken.range[0]));
+                }
+                else {
+                    const typeNamedSpecifierGroups = [];
+                    let group = [];
+                    for (const namedSpecifier of allNamedSpecifiers) {
+                        if (typeNamedSpecifiers.includes(namedSpecifier)) {
+                            group.push(namedSpecifier);
+                        }
+                        else if (group.length) {
+                            typeNamedSpecifierGroups.push(group);
+                            group = [];
+                        }
+                    }
+                    if (group.length) {
+                        typeNamedSpecifierGroups.push(group);
+                    }
+                    for (const namedSpecifiers of typeNamedSpecifierGroups) {
+                        const { removeRange, textRange } = getNamedSpecifierRanges(namedSpecifiers, allNamedSpecifiers);
+                        removeTypeNamedSpecifiers.push(fixer.removeRange(removeRange));
+                        typeNamedSpecifiersTexts.push(sourceCode.text.slice(...textRange));
+                    }
+                }
+                return {
+                    typeNamedSpecifiersText: typeNamedSpecifiersTexts.join(','),
+                    removeTypeNamedSpecifiers,
+                };
+            }
+            /**
+             * Returns ranges for fixing named specifier.
+             */
+            function getNamedSpecifierRanges(namedSpecifierGroup, allNamedSpecifiers) {
+                const first = namedSpecifierGroup[0];
+                const last = namedSpecifierGroup[namedSpecifierGroup.length - 1];
+                const removeRange = [first.range[0], last.range[1]];
+                const textRange = [...removeRange];
+                const before = sourceCode.getTokenBefore(first);
+                textRange[0] = before.range[1];
+                if (util.isCommaToken(before)) {
+                    removeRange[0] = before.range[0];
+                }
+                else {
+                    removeRange[0] = before.range[1];
+                }
+                const isFirst = allNamedSpecifiers[0] === first;
+                const isLast = allNamedSpecifiers[allNamedSpecifiers.length - 1] === last;
+                const after = sourceCode.getTokenAfter(last);
+                textRange[1] = after.range[0];
+                if (isFirst || isLast) {
+                    if (util.isCommaToken(after)) {
+                        removeRange[1] = after.range[1];
+                    }
+                }
+                return {
+                    textRange,
+                    removeRange,
+                };
+            }
+        }
+        function* fixToTypeImportByInsertType(fixer, node, isDefaultImport) {
+            // import type Foo from 'foo'
+            //       ^^^^^ insert
+            const importToken = util.nullThrows(sourceCode.getFirstToken(node, isImportToken), util.NullThrowsReasons.MissingToken('import', node.type));
+            yield fixer.insertTextAfter(importToken, ' type');
+            if (isDefaultImport) {
+                // Has default import
+                const openingBraceToken = sourceCode.getFirstTokenBetween(importToken, node.source, util.isOpeningBraceToken);
+                if (openingBraceToken) {
+                    // Only braces. e.g. import Foo, {} from 'foo'
+                    const commaToken = util.nullThrows(sourceCode.getTokenBefore(openingBraceToken, util.isCommaToken), util.NullThrowsReasons.MissingToken(',', node.type));
+                    const closingBraceToken = util.nullThrows(sourceCode.getFirstTokenBetween(openingBraceToken, node.source, util.isClosingBraceToken), util.NullThrowsReasons.MissingToken('}', node.type));
+                    // import type Foo, {} from 'foo'
+                    //                  ^^ remove
+                    yield fixer.removeRange([
+                        commaToken.range[0],
+                        closingBraceToken.range[1],
+                    ]);
+                    const specifiersText = sourceCode.text.slice(commaToken.range[1], closingBraceToken.range[1]);
+                    if (node.specifiers.length > 1) {
+                        // import type Foo from 'foo'
+                        // import type {...} from 'foo' // <- insert
+                        yield fixer.insertTextAfter(node, `\nimport type${specifiersText} from ${sourceCode.getText(node.source)};`);
+                    }
+                }
+            }
+        }
+        function fixToValueImport(fixer, node) {
+            var _a, _b;
+            // import type Foo from 'foo'
+            //        ^^^^ remove
+            const importToken = util.nullThrows(sourceCode.getFirstToken(node, isImportToken), util.NullThrowsReasons.MissingToken('import', node.type));
+            const typeToken = util.nullThrows(sourceCode.getFirstTokenBetween(importToken, (_b = (_a = node.specifiers[0]) === null || _a === void 0 ? void 0 : _a.local) !== null && _b !== void 0 ? _b : node.source, isTypeToken), util.NullThrowsReasons.MissingToken('type', node.type));
+            return fixer.remove(typeToken);
+        }
+    },
+});
+//# sourceMappingURL=consistent-type-imports.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-imports.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-imports.js.map
new file mode 100644
index 0000000..ce74bfd
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/consistent-type-imports.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"consistent-type-imports.js","sourceRoot":"","sources":["../../src/rules/consistent-type-imports.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/dot-notation.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/dot-notation.js
new file mode 100644
index 0000000..a4a89d0
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/dot-notation.js
@@ -0,0 +1,90 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const ts = __importStar(require("typescript"));
+const dot_notation_1 = __importDefault(require("eslint/lib/rules/dot-notation"));
+const util_1 = require("../util");
+exports.default = util_1.createRule({
+    name: 'dot-notation',
+    meta: {
+        type: 'suggestion',
+        docs: {
+            description: 'enforce dot notation whenever possible',
+            category: 'Best Practices',
+            recommended: false,
+            extendsBaseRule: true,
+            requiresTypeChecking: true,
+        },
+        schema: [
+            {
+                type: 'object',
+                properties: {
+                    allowKeywords: {
+                        type: 'boolean',
+                        default: true,
+                    },
+                    allowPattern: {
+                        type: 'string',
+                        default: '',
+                    },
+                    allowPrivateClassPropertyAccess: {
+                        type: 'boolean',
+                        default: false,
+                    },
+                },
+                additionalProperties: false,
+            },
+        ],
+        fixable: dot_notation_1.default.meta.fixable,
+        messages: dot_notation_1.default.meta.messages,
+    },
+    defaultOptions: [
+        {
+            allowPrivateClassPropertyAccess: false,
+            allowKeywords: true,
+            allowPattern: '',
+        },
+    ],
+    create(context, [options]) {
+        const rules = dot_notation_1.default.create(context);
+        const allowPrivateClassPropertyAccess = options.allowPrivateClassPropertyAccess;
+        const parserServices = util_1.getParserServices(context);
+        const typeChecker = parserServices.program.getTypeChecker();
+        return {
+            MemberExpression(node) {
+                var _a, _b, _c;
+                if (allowPrivateClassPropertyAccess && node.computed) {
+                    // for perf reasons - only fetch the symbol if we have to
+                    const objectSymbol = typeChecker.getSymbolAtLocation(parserServices.esTreeNodeToTSNodeMap.get(node.property));
+                    if (((_c = (_b = (_a = objectSymbol === null || objectSymbol === void 0 ? void 0 : objectSymbol.getDeclarations()) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.modifiers) === null || _c === void 0 ? void 0 : _c[0].kind) ===
+                        ts.SyntaxKind.PrivateKeyword) {
+                        return;
+                    }
+                }
+                rules.MemberExpression(node);
+            },
+        };
+    },
+});
+//# sourceMappingURL=dot-notation.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/dot-notation.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/dot-notation.js.map
new file mode 100644
index 0000000..297244e
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/dot-notation.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"dot-notation.js","sourceRoot":"","sources":["../../src/rules/dot-notation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,+CAAiC;AACjC,iFAAqD;AACrD,kCAKiB;AAKjB,kBAAe,iBAAU,CAAsB;IAC7C,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,wCAAwC;YACrD,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;YACrB,oBAAoB,EAAE,IAAI;SAC3B;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,aAAa,EAAE;wBACb,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,IAAI;qBACd;oBACD,YAAY,EAAE;wBACZ,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,EAAE;qBACZ;oBACD,+BAA+B,EAAE;wBAC/B,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,KAAK;qBACf;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;QACD,OAAO,EAAE,sBAAQ,CAAC,IAAI,CAAC,OAAO;QAC9B,QAAQ,EAAE,sBAAQ,CAAC,IAAI,CAAC,QAAQ;KACjC;IACD,cAAc,EAAE;QACd;YACE,+BAA+B,EAAE,KAAK;YACtC,aAAa,EAAE,IAAI;YACnB,YAAY,EAAE,EAAE;SACjB;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC;QACvB,MAAM,KAAK,GAAG,sBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,+BAA+B,GACnC,OAAO,CAAC,+BAA+B,CAAC;QAE1C,MAAM,cAAc,GAAG,wBAAiB,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAE5D,OAAO;YACL,gBAAgB,CAAC,IAA+B;;gBAC9C,IAAI,+BAA+B,IAAI,IAAI,CAAC,QAAQ,EAAE;oBACpD,yDAAyD;oBACzD,MAAM,YAAY,GAAG,WAAW,CAAC,mBAAmB,CAClD,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CACxD,CAAC;oBACF,IACE,mBAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,eAAe,4CAAK,CAAC,2CAAG,SAAS,0CAAG,CAAC,EAAE,IAAI;wBACzD,EAAE,CAAC,UAAU,CAAC,cAAc,EAC5B;wBACA,OAAO;qBACR;iBACF;gBACD,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-function-return-type.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-function-return-type.js
index 4bac6cc..5f39168 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-function-return-type.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-function-return-type.js
@@ -1,12 +1,25 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const util = __importStar(require("../util"));
 const explicitReturnTypeUtils_1 = require("../util/explicitReturnTypeUtils");
 exports.default = util.createRule({
@@ -16,7 +29,7 @@
         docs: {
             description: 'Require explicit return types on functions and class methods',
             category: 'Stylistic Issues',
-            recommended: 'warn',
+            recommended: false,
         },
         messages: {
             missingReturnType: 'Missing return type on function.',
@@ -37,6 +50,9 @@
                     allowDirectConstAssertionInArrowFunctions: {
                         type: 'boolean',
                     },
+                    allowConciseArrowFunctionExpressionsStartingWithVoid: {
+                        type: 'boolean',
+                    },
                 },
                 additionalProperties: false,
             },
@@ -48,12 +64,20 @@
             allowTypedFunctionExpressions: true,
             allowHigherOrderFunctions: true,
             allowDirectConstAssertionInArrowFunctions: true,
+            allowConciseArrowFunctionExpressionsStartingWithVoid: false,
         },
     ],
     create(context, [options]) {
         const sourceCode = context.getSourceCode();
         return {
             'ArrowFunctionExpression, FunctionExpression'(node) {
+                if (options.allowConciseArrowFunctionExpressionsStartingWithVoid &&
+                    node.type === experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression &&
+                    node.expression &&
+                    node.body.type === experimental_utils_1.AST_NODE_TYPES.UnaryExpression &&
+                    node.body.operator === 'void') {
+                    return;
+                }
                 explicitReturnTypeUtils_1.checkFunctionExpressionReturnType(node, options, sourceCode, loc => context.report({
                     node,
                     loc,
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-function-return-type.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-function-return-type.js.map
index 2cca7b6..6384a05 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-function-return-type.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-function-return-type.js.map
@@ -1 +1 @@
-{"version":3,"file":"explicit-function-return-type.js","sourceRoot":"","sources":["../../src/rules/explicit-function-return-type.ts"],"names":[],"mappings":";;;;;;;;;AACA,8CAAgC;AAChC,6EAGyC;AAYzC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,+BAA+B;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,8DAA8D;YAChE,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,MAAM;SACpB;QACD,QAAQ,EAAE;YACR,iBAAiB,EAAE,kCAAkC;SACtD;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,gBAAgB,EAAE;wBAChB,IAAI,EAAE,SAAS;qBAChB;oBACD,6BAA6B,EAAE;wBAC7B,IAAI,EAAE,SAAS;qBAChB;oBACD,yBAAyB,EAAE;wBACzB,IAAI,EAAE,SAAS;qBAChB;oBACD,yCAAyC,EAAE;wBACzC,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,gBAAgB,EAAE,KAAK;YACvB,6BAA6B,EAAE,IAAI;YACnC,yBAAyB,EAAE,IAAI;YAC/B,yCAAyC,EAAE,IAAI;SAChD;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC;QACvB,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAE3C,OAAO;YACL,6CAA6C,CAC3C,IAAoE;gBAEpE,2DAAiC,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,CACjE,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,GAAG;oBACH,SAAS,EAAE,mBAAmB;iBAC/B,CAAC,CACH,CAAC;YACJ,CAAC;YACD,mBAAmB,CAAC,IAAI;gBACtB,iDAAuB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,CACvD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,GAAG;oBACH,SAAS,EAAE,mBAAmB;iBAC/B,CAAC,CACH,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"explicit-function-return-type.js","sourceRoot":"","sources":["../../src/rules/explicit-function-return-type.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAChC,6EAGyC;AAazC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,+BAA+B;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,8DAA8D;YAChE,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,KAAK;SACnB;QACD,QAAQ,EAAE;YACR,iBAAiB,EAAE,kCAAkC;SACtD;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,gBAAgB,EAAE;wBAChB,IAAI,EAAE,SAAS;qBAChB;oBACD,6BAA6B,EAAE;wBAC7B,IAAI,EAAE,SAAS;qBAChB;oBACD,yBAAyB,EAAE;wBACzB,IAAI,EAAE,SAAS;qBAChB;oBACD,yCAAyC,EAAE;wBACzC,IAAI,EAAE,SAAS;qBAChB;oBACD,oDAAoD,EAAE;wBACpD,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,gBAAgB,EAAE,KAAK;YACvB,6BAA6B,EAAE,IAAI;YACnC,yBAAyB,EAAE,IAAI;YAC/B,yCAAyC,EAAE,IAAI;YAC/C,oDAAoD,EAAE,KAAK;SAC5D;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC;QACvB,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAE3C,OAAO;YACL,6CAA6C,CAC3C,IAAoE;gBAEpE,IACE,OAAO,CAAC,oDAAoD;oBAC5D,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,uBAAuB;oBACpD,IAAI,CAAC,UAAU;oBACf,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,eAAe;oBACjD,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,MAAM,EAC7B;oBACA,OAAO;iBACR;gBAED,2DAAiC,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,CACjE,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,GAAG;oBACH,SAAS,EAAE,mBAAmB;iBAC/B,CAAC,CACH,CAAC;YACJ,CAAC;YACD,mBAAmB,CAAC,IAAI;gBACtB,iDAAuB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,CACvD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,GAAG;oBACH,SAAS,EAAE,mBAAmB;iBAC/B,CAAC,CACH,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-member-accessibility.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-member-accessibility.js
index 3e48adb..d6d7063 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-member-accessibility.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-member-accessibility.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -56,14 +68,14 @@
     create(context, [option]) {
         var _a, _b, _c, _d, _e, _f, _g, _h;
         const sourceCode = context.getSourceCode();
-        const baseCheck = (_a = option.accessibility, (_a !== null && _a !== void 0 ? _a : 'explicit'));
-        const overrides = (_b = option.overrides, (_b !== null && _b !== void 0 ? _b : {}));
-        const ctorCheck = (_c = overrides.constructors, (_c !== null && _c !== void 0 ? _c : baseCheck));
-        const accessorCheck = (_d = overrides.accessors, (_d !== null && _d !== void 0 ? _d : baseCheck));
-        const methodCheck = (_e = overrides.methods, (_e !== null && _e !== void 0 ? _e : baseCheck));
-        const propCheck = (_f = overrides.properties, (_f !== null && _f !== void 0 ? _f : baseCheck));
-        const paramPropCheck = (_g = overrides.parameterProperties, (_g !== null && _g !== void 0 ? _g : baseCheck));
-        const ignoredMethodNames = new Set((_h = option.ignoredMethodNames, (_h !== null && _h !== void 0 ? _h : [])));
+        const baseCheck = (_a = option.accessibility) !== null && _a !== void 0 ? _a : 'explicit';
+        const overrides = (_b = option.overrides) !== null && _b !== void 0 ? _b : {};
+        const ctorCheck = (_c = overrides.constructors) !== null && _c !== void 0 ? _c : baseCheck;
+        const accessorCheck = (_d = overrides.accessors) !== null && _d !== void 0 ? _d : baseCheck;
+        const methodCheck = (_e = overrides.methods) !== null && _e !== void 0 ? _e : baseCheck;
+        const propCheck = (_f = overrides.properties) !== null && _f !== void 0 ? _f : baseCheck;
+        const paramPropCheck = (_g = overrides.parameterProperties) !== null && _g !== void 0 ? _g : baseCheck;
+        const ignoredMethodNames = new Set((_h = option.ignoredMethodNames) !== null && _h !== void 0 ? _h : []);
         /**
          * Generates the report for rule violations
          */
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-member-accessibility.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-member-accessibility.js.map
index feac814..ba2416f 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-member-accessibility.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-member-accessibility.js.map
@@ -1 +1 @@
-{"version":3,"file":"explicit-member-accessibility.js","sourceRoot":"","sources":["../../src/rules/explicit-member-accessibility.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAK+C;AAC/C,8CAAgC;AAuBhC,MAAM,kBAAkB,GAAG,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;AAEtE,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,+BAA+B;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,0EAA0E;YAC5E,QAAQ,EAAE,kBAAkB;YAC5B,oCAAoC;YACpC,WAAW,EAAE,KAAK;SACnB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,oBAAoB,EAClB,sDAAsD;YACxD,2BAA2B,EACzB,qDAAqD;SACxD;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,aAAa,EAAE,kBAAkB;oBACjC,SAAS,EAAE;wBACT,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,SAAS,EAAE,kBAAkB;4BAC7B,YAAY,EAAE,kBAAkB;4BAChC,OAAO,EAAE,kBAAkB;4BAC3B,UAAU,EAAE,kBAAkB;4BAC9B,mBAAmB,EAAE,kBAAkB;yBACxC;wBAED,oBAAoB,EAAE,KAAK;qBAC5B;oBACD,kBAAkB,EAAE;wBAClB,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;yBACf;qBACF;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc,EAAE,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;IAC/C,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;;QACtB,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,SAAS,SAAuB,MAAM,CAAC,aAAa,uCAAI,UAAU,EAAA,CAAC;QACzE,MAAM,SAAS,SAAG,MAAM,CAAC,SAAS,uCAAI,EAAE,EAAA,CAAC;QACzC,MAAM,SAAS,SAAG,SAAS,CAAC,YAAY,uCAAI,SAAS,EAAA,CAAC;QACtD,MAAM,aAAa,SAAG,SAAS,CAAC,SAAS,uCAAI,SAAS,EAAA,CAAC;QACvD,MAAM,WAAW,SAAG,SAAS,CAAC,OAAO,uCAAI,SAAS,EAAA,CAAC;QACnD,MAAM,SAAS,SAAG,SAAS,CAAC,UAAU,uCAAI,SAAS,EAAA,CAAC;QACpD,MAAM,cAAc,SAAG,SAAS,CAAC,mBAAmB,uCAAI,SAAS,EAAA,CAAC;QAClE,MAAM,kBAAkB,GAAG,IAAI,GAAG,OAAC,MAAM,CAAC,kBAAkB,uCAAI,EAAE,GAAC,CAAC;QACpE;;WAEG;QACH,SAAS,WAAW,CAClB,SAAqB,EACrB,QAAgB,EAChB,IAAmB,EACnB,QAAgB,EAChB,MAAyC,IAAI;YAE7C,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI,EAAE,IAAI;gBACV,SAAS,EAAE,SAAS;gBACpB,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,QAAQ;iBACf;gBACD,GAAG,EAAE,GAAG;aACT,CAAC,CAAC;QACL,CAAC;QAED;;;WAGG;QACH,SAAS,gCAAgC,CACvC,gBAA2C;YAE3C,IAAI,QAAQ,GAAG,mBAAmB,CAAC;YACnC,IAAI,KAAK,GAAG,SAAS,CAAC;YACtB,QAAQ,gBAAgB,CAAC,IAAI,EAAE;gBAC7B,KAAK,QAAQ;oBACX,KAAK,GAAG,WAAW,CAAC;oBACpB,MAAM;gBACR,KAAK,aAAa;oBAChB,KAAK,GAAG,SAAS,CAAC;oBAClB,MAAM;gBACR,KAAK,KAAK,CAAC;gBACX,KAAK,KAAK;oBACR,KAAK,GAAG,aAAa,CAAC;oBACtB,QAAQ,GAAG,GAAG,gBAAgB,CAAC,IAAI,oBAAoB,CAAC;oBACxD,MAAM;aACT;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;YAExE,IAAI,KAAK,KAAK,KAAK,IAAI,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;gBACzD,OAAO;aACR;YAED,IACE,KAAK,KAAK,WAAW;gBACrB,gBAAgB,CAAC,aAAa,KAAK,QAAQ,EAC3C;gBACA,WAAW,CACT,6BAA6B,EAC7B,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,mCAAmC,CAAC,gBAAgB,CAAC,CACtD,CAAC;aACH;iBAAM,IAAI,KAAK,KAAK,UAAU,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE;gBAClE,WAAW,CACT,sBAAsB,EACtB,QAAQ,EACR,gBAAgB,EAChB,UAAU,CACX,CAAC;aACH;QACH,CAAC;QAED;;WAEG;QACH,SAAS,mCAAmC,CAC1C,IAGgC;YAEhC,OAAO,UAAS,KAAyB;gBACvC,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,aAAiC,CAAC;gBACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACxB,IACE,KAAK,CAAC,IAAI,KAAK,oCAAe,CAAC,OAAO;wBACtC,KAAK,CAAC,KAAK,KAAK,QAAQ,EACxB;wBACA,MAAM,yBAAyB,GAAG,UAAU,CAAC,gBAAgB,CAC3D,KAAK,CACN,CAAC;wBACF,IAAI,yBAAyB,CAAC,MAAM,EAAE;4BACpC,sCAAsC;4BACtC,UAAU;4BACV,aAAa,GAAG;gCACd,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gCACd,yBAAyB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;6BACtC,CAAC;4BACF,MAAM;yBACP;6BAAM;4BACL,sBAAsB;4BACtB,UAAU;4BACV,aAAa,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;4BACzD,MAAM;yBACP;qBACF;iBACF;gBACD,OAAO,KAAK,CAAC,WAAW,CAAC,aAAc,CAAC,CAAC;YAC3C,CAAC,CAAC;QACJ,CAAC;QAED;;;WAGG;QACH,SAAS,kCAAkC,CACzC,aAAqC;YAErC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;YAElC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACvE,IACE,SAAS,KAAK,WAAW;gBACzB,aAAa,CAAC,aAAa,KAAK,QAAQ,EACxC;gBACA,WAAW,CACT,6BAA6B,EAC7B,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,mCAAmC,CAAC,aAAa,CAAC,CACnD,CAAC;aACH;iBAAM,IAAI,SAAS,KAAK,UAAU,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE;gBACnE,WAAW,CACT,sBAAsB,EACtB,QAAQ,EACR,aAAa,EACb,YAAY,CACb,CAAC;aACH;QACH,CAAC;QAED;;;WAGG;QACH,SAAS,2CAA2C,CAClD,IAAkC;YAElC,MAAM,QAAQ,GAAG,oBAAoB,CAAC;YACtC,0DAA0D;YAC1D,IACE,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;gBACjD,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,iBAAiB,EACxD;gBACA,OAAO;aACR;YAED,MAAM,QAAQ,GACZ,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;gBAC/C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI;gBACrB,CAAC,CAAC,qDAAqD;oBACpD,IAAI,CAAC,SAAS,CAAC,IAA4B,CAAC,IAAI,CAAC;YAExD,QAAQ,cAAc,EAAE;gBACtB,KAAK,UAAU,CAAC,CAAC;oBACf,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;wBACvB,WAAW,CAAC,sBAAsB,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;qBAC/D;oBACD,MAAM;iBACP;gBACD,KAAK,WAAW,CAAC,CAAC;oBAChB,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE;wBACpD,WAAW,CACT,6BAA6B,EAC7B,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,mCAAmC,CAAC,IAAI,CAAC,CAC1C,CAAC;qBACH;oBACD,MAAM;iBACP;aACF;QACH,CAAC;QAED,OAAO;YACL,mBAAmB,EAAE,2CAA2C;YAChE,aAAa,EAAE,kCAAkC;YACjD,gBAAgB,EAAE,gCAAgC;SACnD,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"explicit-member-accessibility.js","sourceRoot":"","sources":["../../src/rules/explicit-member-accessibility.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-module-boundary-types.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-module-boundary-types.js
index 2b982e0..61858dc 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-module-boundary-types.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-module-boundary-types.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -17,20 +29,20 @@
         docs: {
             description: "Require explicit return and argument types on exported functions' and classes' public class methods",
             category: 'Stylistic Issues',
-            recommended: false,
+            recommended: 'warn',
         },
         messages: {
             missingReturnType: 'Missing return type on function.',
             missingArgType: "Argument '{{name}}' should be typed.",
+            missingArgTypeUnnamed: '{{type}} argument should be typed.',
+            anyTypedArg: "Argument '{{name}}' should be typed with a non-any type.",
+            anyTypedArgUnnamed: '{{type}} argument should be typed with a non-any type.',
         },
         schema: [
             {
                 type: 'object',
                 properties: {
-                    allowTypedFunctionExpressions: {
-                        type: 'boolean',
-                    },
-                    allowHigherOrderFunctions: {
+                    allowArgumentsExplicitlyTypedAsAny: {
                         type: 'boolean',
                     },
                     allowDirectConstAssertionInArrowFunctions: {
@@ -42,6 +54,16 @@
                             type: 'string',
                         },
                     },
+                    allowHigherOrderFunctions: {
+                        type: 'boolean',
+                    },
+                    allowTypedFunctionExpressions: {
+                        type: 'boolean',
+                    },
+                    // DEPRECATED - To be removed in next major
+                    shouldTrackReferences: {
+                        type: 'boolean',
+                    },
                 },
                 additionalProperties: false,
             },
@@ -49,57 +71,124 @@
     },
     defaultOptions: [
         {
-            allowTypedFunctionExpressions: true,
-            allowHigherOrderFunctions: true,
+            allowArgumentsExplicitlyTypedAsAny: false,
             allowDirectConstAssertionInArrowFunctions: true,
             allowedNames: [],
+            allowHigherOrderFunctions: true,
+            allowTypedFunctionExpressions: true,
         },
     ],
     create(context, [options]) {
         const sourceCode = context.getSourceCode();
-        function isUnexported(node) {
-            let isReturnedValue = false;
-            while (node) {
-                if (node.type === experimental_utils_1.AST_NODE_TYPES.ExportDefaultDeclaration ||
-                    node.type === experimental_utils_1.AST_NODE_TYPES.ExportNamedDeclaration ||
-                    node.type === experimental_utils_1.AST_NODE_TYPES.ExportSpecifier) {
-                    return false;
+        // tracks all of the functions we've already checked
+        const checkedFunctions = new Set();
+        // tracks functions that were found whilst traversing
+        const foundFunctions = [];
+        // all nodes visited, avoids infinite recursion for cyclic references
+        // (such as class member referring to itself)
+        const alreadyVisited = new Set();
+        /*
+        # How the rule works:
+    
+        As the rule traverses the AST, it immediately checks every single function that it finds is exported.
+        "exported" means that it is either directly exported, or that its name is exported.
+    
+        It also collects a list of every single function it finds on the way, but does not check them.
+        After it's finished traversing the AST, it then iterates through the list of found functions, and checks to see if
+        any of them are part of a higher-order function
+        */
+        return {
+            ExportDefaultDeclaration(node) {
+                checkNode(node.declaration);
+            },
+            'ExportNamedDeclaration:not([source])'(node) {
+                if (node.declaration) {
+                    checkNode(node.declaration);
                 }
-                if (node.type === experimental_utils_1.AST_NODE_TYPES.JSXExpressionContainer) {
-                    return true;
+                else {
+                    for (const specifier of node.specifiers) {
+                        followReference(specifier.local);
+                    }
                 }
-                if (node.type === experimental_utils_1.AST_NODE_TYPES.ReturnStatement) {
-                    isReturnedValue = true;
+            },
+            TSExportAssignment(node) {
+                checkNode(node.expression);
+            },
+            'ArrowFunctionExpression, FunctionDeclaration, FunctionExpression'(node) {
+                foundFunctions.push(node);
+            },
+            'Program:exit'() {
+                for (const func of foundFunctions) {
+                    if (isExportedHigherOrderFunction(func)) {
+                        checkNode(func);
+                    }
                 }
-                if (node.type === experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression ||
-                    node.type === experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration ||
-                    node.type === experimental_utils_1.AST_NODE_TYPES.FunctionExpression) {
-                    isReturnedValue = false;
+            },
+        };
+        function checkParameters(node) {
+            function checkParameter(param) {
+                function report(namedMessageId, unnamedMessageId) {
+                    if (param.type === experimental_utils_1.AST_NODE_TYPES.Identifier) {
+                        context.report({
+                            node: param,
+                            messageId: namedMessageId,
+                            data: { name: param.name },
+                        });
+                    }
+                    else if (param.type === experimental_utils_1.AST_NODE_TYPES.ArrayPattern) {
+                        context.report({
+                            node: param,
+                            messageId: unnamedMessageId,
+                            data: { type: 'Array pattern' },
+                        });
+                    }
+                    else if (param.type === experimental_utils_1.AST_NODE_TYPES.ObjectPattern) {
+                        context.report({
+                            node: param,
+                            messageId: unnamedMessageId,
+                            data: { type: 'Object pattern' },
+                        });
+                    }
+                    else if (param.type === experimental_utils_1.AST_NODE_TYPES.RestElement) {
+                        if (param.argument.type === experimental_utils_1.AST_NODE_TYPES.Identifier) {
+                            context.report({
+                                node: param,
+                                messageId: namedMessageId,
+                                data: { name: param.argument.name },
+                            });
+                        }
+                        else {
+                            context.report({
+                                node: param,
+                                messageId: unnamedMessageId,
+                                data: { type: 'Rest' },
+                            });
+                        }
+                    }
                 }
-                if (node.type === experimental_utils_1.AST_NODE_TYPES.BlockStatement && !isReturnedValue) {
-                    return true;
+                switch (param.type) {
+                    case experimental_utils_1.AST_NODE_TYPES.ArrayPattern:
+                    case experimental_utils_1.AST_NODE_TYPES.Identifier:
+                    case experimental_utils_1.AST_NODE_TYPES.ObjectPattern:
+                    case experimental_utils_1.AST_NODE_TYPES.RestElement:
+                        if (!param.typeAnnotation) {
+                            report('missingArgType', 'missingArgTypeUnnamed');
+                        }
+                        else if (options.allowArgumentsExplicitlyTypedAsAny !== true &&
+                            param.typeAnnotation.typeAnnotation.type ===
+                                experimental_utils_1.AST_NODE_TYPES.TSAnyKeyword) {
+                            report('anyTypedArg', 'anyTypedArgUnnamed');
+                        }
+                        return;
+                    case experimental_utils_1.AST_NODE_TYPES.TSParameterProperty:
+                        return checkParameter(param.parameter);
+                    case experimental_utils_1.AST_NODE_TYPES.AssignmentPattern: // ignored as it has a type via its assignment
+                        return;
                 }
-                node = node.parent;
             }
-            return true;
-        }
-        function isArgumentUntyped(node) {
-            return (!node.typeAnnotation ||
-                node.typeAnnotation.typeAnnotation.type === experimental_utils_1.AST_NODE_TYPES.TSAnyKeyword);
-        }
-        /**
-         * Checks if a function declaration/expression has a return type.
-         */
-        function checkArguments(node) {
-            const paramIdentifiers = node.params.filter(util.isIdentifier);
-            const untypedArgs = paramIdentifiers.filter(isArgumentUntyped);
-            untypedArgs.forEach(untypedArg => context.report({
-                node,
-                messageId: 'missingArgType',
-                data: {
-                    name: untypedArg.name,
-                },
-            }));
+            for (const arg of node.params) {
+                checkParameter(arg);
+            }
         }
         /**
          * Checks if a function name is allowed and should not be checked.
@@ -128,38 +217,196 @@
             }
             return false;
         }
-        return {
-            'ArrowFunctionExpression, FunctionExpression'(node) {
-                var _a;
-                if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.MethodDefinition &&
-                    node.parent.accessibility === 'private') {
-                    // don't check private methods as they aren't part of the public signature
-                    return;
+        function isExportedHigherOrderFunction(node) {
+            var _a;
+            let current = node.parent;
+            while (current) {
+                if (current.type === experimental_utils_1.AST_NODE_TYPES.ReturnStatement) {
+                    // the parent of a return will always be a block statement, so we can skip over it
+                    current = (_a = current.parent) === null || _a === void 0 ? void 0 : _a.parent;
+                    continue;
                 }
-                if (isAllowedName(node.parent) ||
-                    isUnexported(node) ||
-                    explicitReturnTypeUtils_1.isTypedFunctionExpression(node, options)) {
-                    return;
+                if (!util.isFunction(current) ||
+                    !explicitReturnTypeUtils_1.doesImmediatelyReturnFunctionExpression(current)) {
+                    return false;
                 }
-                explicitReturnTypeUtils_1.checkFunctionExpressionReturnType(node, options, sourceCode, loc => context.report({
+                if (checkedFunctions.has(current)) {
+                    return true;
+                }
+                current = current.parent;
+            }
+            return false;
+        }
+        function followReference(node) {
+            const scope = context.getScope();
+            const variable = scope.set.get(node.name);
+            /* istanbul ignore if */ if (!variable) {
+                return;
+            }
+            // check all of the definitions
+            for (const definition of variable.defs) {
+                // cases we don't care about in this rule
+                if (definition.type === 'ImplicitGlobalVariable' ||
+                    definition.type === 'ImportBinding' ||
+                    // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum
+                    definition.type === 'CatchClause' ||
+                    definition.type === 'Parameter') {
+                    continue;
+                }
+                checkNode(definition.node);
+            }
+            // follow references to find writes to the variable
+            for (const reference of variable.references) {
+                if (
+                // we don't want to check the initialization ref, as this is handled by the declaration check
+                !reference.init &&
+                    reference.writeExpr) {
+                    checkNode(reference.writeExpr);
+                }
+            }
+        }
+        function checkNode(node) {
+            if (node == null || alreadyVisited.has(node)) {
+                return;
+            }
+            alreadyVisited.add(node);
+            switch (node.type) {
+                case experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression:
+                case experimental_utils_1.AST_NODE_TYPES.FunctionExpression:
+                    return checkFunctionExpression(node);
+                case experimental_utils_1.AST_NODE_TYPES.ArrayExpression:
+                    for (const element of node.elements) {
+                        checkNode(element);
+                    }
+                    return;
+                case experimental_utils_1.AST_NODE_TYPES.ClassProperty:
+                case experimental_utils_1.AST_NODE_TYPES.TSAbstractClassProperty:
+                    if (node.accessibility === 'private') {
+                        return;
+                    }
+                    return checkNode(node.value);
+                case experimental_utils_1.AST_NODE_TYPES.ClassDeclaration:
+                case experimental_utils_1.AST_NODE_TYPES.ClassExpression:
+                    for (const element of node.body.body) {
+                        checkNode(element);
+                    }
+                    return;
+                case experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration:
+                    return checkFunction(node);
+                case experimental_utils_1.AST_NODE_TYPES.MethodDefinition:
+                case experimental_utils_1.AST_NODE_TYPES.TSAbstractMethodDefinition:
+                    if (node.accessibility === 'private') {
+                        return;
+                    }
+                    return checkNode(node.value);
+                case experimental_utils_1.AST_NODE_TYPES.Identifier:
+                    return followReference(node);
+                case experimental_utils_1.AST_NODE_TYPES.ObjectExpression:
+                    for (const property of node.properties) {
+                        checkNode(property);
+                    }
+                    return;
+                case experimental_utils_1.AST_NODE_TYPES.Property:
+                    return checkNode(node.value);
+                case experimental_utils_1.AST_NODE_TYPES.TSEmptyBodyFunctionExpression:
+                    return checkEmptyBodyFunctionExpression(node);
+                case experimental_utils_1.AST_NODE_TYPES.VariableDeclaration:
+                    for (const declaration of node.declarations) {
+                        checkNode(declaration);
+                    }
+                    return;
+                case experimental_utils_1.AST_NODE_TYPES.VariableDeclarator:
+                    return checkNode(node.init);
+            }
+        }
+        /**
+         * Check whether any ancestor of the provided function has a valid return type.
+         * This function assumes that the function either:
+         * - belongs to an exported function chain validated by isExportedHigherOrderFunction
+         * - is directly exported itself
+         */
+        function ancestorHasReturnType(node) {
+            let ancestor = node.parent;
+            // if the ancestor is not a return, then this function was not returned at all, so we can exit early
+            const isReturnStatement = (ancestor === null || ancestor === void 0 ? void 0 : ancestor.type) === experimental_utils_1.AST_NODE_TYPES.ReturnStatement;
+            const isBodylessArrow = (ancestor === null || ancestor === void 0 ? void 0 : ancestor.type) === experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression &&
+                ancestor.body.type !== experimental_utils_1.AST_NODE_TYPES.BlockStatement;
+            if (!isReturnStatement && !isBodylessArrow) {
+                return false;
+            }
+            while (ancestor) {
+                switch (ancestor.type) {
+                    case experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression:
+                    case experimental_utils_1.AST_NODE_TYPES.FunctionExpression:
+                    case experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration:
+                        if (ancestor.returnType) {
+                            return true;
+                        }
+                        // assume
+                        break;
+                    // const x: Foo = () => {};
+                    // Assume that a typed variable types the function expression
+                    case experimental_utils_1.AST_NODE_TYPES.VariableDeclarator:
+                        if (ancestor.id.typeAnnotation) {
+                            return true;
+                        }
+                        break;
+                }
+                ancestor = ancestor.parent;
+            }
+            return false;
+        }
+        function checkEmptyBodyFunctionExpression(node) {
+            var _a, _b, _c;
+            const isConstructor = ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.MethodDefinition &&
+                node.parent.kind === 'constructor';
+            const isSetAccessor = (((_b = node.parent) === null || _b === void 0 ? void 0 : _b.type) === experimental_utils_1.AST_NODE_TYPES.TSAbstractMethodDefinition ||
+                ((_c = node.parent) === null || _c === void 0 ? void 0 : _c.type) === experimental_utils_1.AST_NODE_TYPES.MethodDefinition) &&
+                node.parent.kind === 'set';
+            if (!isConstructor && !isSetAccessor && !node.returnType) {
+                context.report({
+                    node,
+                    messageId: 'missingReturnType',
+                });
+            }
+            checkParameters(node);
+        }
+        function checkFunctionExpression(node) {
+            if (checkedFunctions.has(node)) {
+                return;
+            }
+            checkedFunctions.add(node);
+            if (isAllowedName(node.parent) ||
+                explicitReturnTypeUtils_1.isTypedFunctionExpression(node, options) ||
+                ancestorHasReturnType(node)) {
+                return;
+            }
+            explicitReturnTypeUtils_1.checkFunctionExpressionReturnType(node, options, sourceCode, loc => {
+                context.report({
                     node,
                     loc,
                     messageId: 'missingReturnType',
-                }));
-                checkArguments(node);
-            },
-            FunctionDeclaration(node) {
-                if (isAllowedName(node.parent) || isUnexported(node)) {
-                    return;
-                }
-                explicitReturnTypeUtils_1.checkFunctionReturnType(node, options, sourceCode, loc => context.report({
+                });
+            });
+            checkParameters(node);
+        }
+        function checkFunction(node) {
+            if (checkedFunctions.has(node)) {
+                return;
+            }
+            checkedFunctions.add(node);
+            if (isAllowedName(node.parent) || ancestorHasReturnType(node)) {
+                return;
+            }
+            explicitReturnTypeUtils_1.checkFunctionReturnType(node, options, sourceCode, loc => {
+                context.report({
                     node,
                     loc,
                     messageId: 'missingReturnType',
-                }));
-                checkArguments(node);
-            },
-        };
+                });
+            });
+            checkParameters(node);
+        }
     },
 });
 //# sourceMappingURL=explicit-module-boundary-types.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-module-boundary-types.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-module-boundary-types.js.map
index 5f6e0d5..564b792 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-module-boundary-types.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/explicit-module-boundary-types.js.map
@@ -1 +1 @@
-{"version":3,"file":"explicit-module-boundary-types.js","sourceRoot":"","sources":["../../src/rules/explicit-module-boundary-types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"explicit-module-boundary-types.js","sourceRoot":"","sources":["../../src/rules/explicit-module-boundary-types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/func-call-spacing.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/func-call-spacing.js
index 02c709f..ab51dee 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/func-call-spacing.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/func-call-spacing.js
@@ -1,13 +1,24 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
-const eslint_utils_1 = require("eslint-utils");
 const util = __importStar(require("../util"));
 exports.default = util.createRule({
     name: 'func-call-spacing',
@@ -54,7 +65,8 @@
             ],
         },
         messages: {
-            unexpected: 'Unexpected space or newline between function name and paren.',
+            unexpectedWhitespace: 'Unexpected whitespace between function name and paren.',
+            unexpectedNewline: 'Unexpected newline between function name and paren.',
             missing: 'Missing space between function name and paren.',
         },
     },
@@ -70,10 +82,10 @@
          */
         function checkSpacing(node) {
             var _a;
-            const isOptionalCall = util.isOptionalOptionalChain(node);
+            const isOptionalCall = util.isOptionalCallExpression(node);
             const closingParenToken = sourceCode.getLastToken(node);
-            const lastCalleeTokenWithoutPossibleParens = sourceCode.getLastToken((_a = node.typeParameters, (_a !== null && _a !== void 0 ? _a : node.callee)));
-            const openingParenToken = sourceCode.getFirstTokenBetween(lastCalleeTokenWithoutPossibleParens, closingParenToken, eslint_utils_1.isOpeningParenToken);
+            const lastCalleeTokenWithoutPossibleParens = sourceCode.getLastToken((_a = node.typeParameters) !== null && _a !== void 0 ? _a : node.callee);
+            const openingParenToken = sourceCode.getFirstTokenBetween(lastCalleeTokenWithoutPossibleParens, closingParenToken, util.isOpeningParenToken);
             if (!openingParenToken || openingParenToken.range[1] >= node.range[1]) {
                 // new expression with no parens...
                 return;
@@ -89,7 +101,7 @@
                     return context.report({
                         node,
                         loc: lastCalleeToken.loc.start,
-                        messageId: 'unexpected',
+                        messageId: 'unexpectedWhitespace',
                         fix(fixer) {
                             /*
                              * Only autofix if there is no newline
@@ -117,7 +129,7 @@
                     context.report({
                         node,
                         loc: lastCalleeToken.loc.start,
-                        messageId: 'unexpected',
+                        messageId: 'unexpectedWhitespace',
                     });
                 }
             }
@@ -136,7 +148,7 @@
                     context.report({
                         node,
                         loc: lastCalleeToken.loc.start,
-                        messageId: 'unexpected',
+                        messageId: 'unexpectedNewline',
                         fix(fixer) {
                             return fixer.replaceTextRange([lastCalleeToken.range[1], openingParenToken.range[0]], ' ');
                         },
@@ -146,7 +158,6 @@
         }
         return {
             CallExpression: checkSpacing,
-            OptionalCallExpression: checkSpacing,
             NewExpression: checkSpacing,
         };
     },
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/func-call-spacing.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/func-call-spacing.js.map
index e03cb08..a677e9d 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/func-call-spacing.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/func-call-spacing.js.map
@@ -1 +1 @@
-{"version":3,"file":"func-call-spacing.js","sourceRoot":"","sources":["../../src/rules/func-call-spacing.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"func-call-spacing.js","sourceRoot":"","sources":["../../src/rules/func-call-spacing.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/generic-type-naming.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/generic-type-naming.js
deleted file mode 100644
index c7da0b0..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/generic-type-naming.js
+++ /dev/null
@@ -1,55 +0,0 @@
-"use strict";
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const util = __importStar(require("../util"));
-exports.default = util.createRule({
-    name: 'generic-type-naming',
-    meta: {
-        type: 'suggestion',
-        docs: {
-            description: 'Enforces naming of generic type variables',
-            category: 'Stylistic Issues',
-            // too opinionated to be recommended
-            recommended: false,
-        },
-        deprecated: true,
-        replacedBy: ['naming-convention'],
-        messages: {
-            paramNotMatchRule: 'Type parameter {{name}} does not match rule {{rule}}.',
-        },
-        schema: [
-            {
-                type: 'string',
-            },
-        ],
-    },
-    defaultOptions: [
-        // Matches: T , TA , TAbc , TA1Bca , T1 , T2
-        '^T([A-Z0-9][a-zA-Z0-9]*){0,1}$',
-    ],
-    create(context, [rule]) {
-        const regex = new RegExp(rule);
-        return {
-            TSTypeParameter(node) {
-                const name = node.name.name;
-                if (name && !regex.test(name)) {
-                    context.report({
-                        node,
-                        messageId: 'paramNotMatchRule',
-                        data: {
-                            name,
-                            rule,
-                        },
-                    });
-                }
-            },
-        };
-    },
-});
-//# sourceMappingURL=generic-type-naming.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/generic-type-naming.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/generic-type-naming.js.map
deleted file mode 100644
index 3dc33ca..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/generic-type-naming.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"generic-type-naming.js","sourceRoot":"","sources":["../../src/rules/generic-type-naming.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,qBAAqB;IAC3B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,2CAA2C;YACxD,QAAQ,EAAE,kBAAkB;YAC5B,oCAAoC;YACpC,WAAW,EAAE,KAAK;SACnB;QACD,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,CAAC,mBAAmB,CAAC;QACjC,QAAQ,EAAE;YACR,iBAAiB,EACf,uDAAuD;SAC1D;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;aACf;SACF;KACF;IACD,cAAc,EAAE;QACd,4CAA4C;QAC5C,gCAAgC;KACjC;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAK,CAAC,CAAC;QAEhC,OAAO;YACL,eAAe,CAAC,IAAI;gBAClB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAE5B,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAC7B,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,mBAAmB;wBAC9B,IAAI,EAAE;4BACJ,IAAI;4BACJ,IAAI;yBACL;qBACF,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/BinarySearchTree.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/BinarySearchTree.js
index f9d4b5f..9ae7106 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/BinarySearchTree.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/BinarySearchTree.js
@@ -5,6 +5,7 @@
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.BinarySearchTree = void 0;
 const functional_red_black_tree_1 = __importDefault(require("functional-red-black-tree"));
 /**
  * A mutable balanced binary search tree that stores (key, value) pairs. The keys are numeric, and must be unique.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/BinarySearchTree.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/BinarySearchTree.js.map
index 1101ca4..6f0c20e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/BinarySearchTree.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/BinarySearchTree.js.map
@@ -1 +1 @@
-{"version":3,"file":"BinarySearchTree.js","sourceRoot":"","sources":["../../../src/rules/indent-new-do-not-use/BinarySearchTree.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,kGAAkG;;;;;AAGlG,0FAAmD;AASnD;;;;GAIG;AACH,MAAa,gBAAgB;IAA7B;QACU,WAAM,GAAG,mCAAU,EAAa,CAAC;IAwC3C,CAAC;IAtCC;;OAEG;IACI,MAAM,CAAC,GAAW,EAAE,KAAgB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,QAAQ,CAAC,KAAK,EAAE;YAClB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACtC;aAAM;YACL,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAC9C;IACH,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,GAAW;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAErC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IACtD,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,KAAa,EAAE,GAAW;QAC3C,+DAA+D;QAC/D,IAAI,KAAK,KAAK,GAAG,EAAE;YACjB,OAAO;SACR;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAEvC,OAAO,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,GAAG,GAAG,GAAG,EAAE;YAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC/C,QAAQ,CAAC,IAAI,EAAE,CAAC;SACjB;IACH,CAAC;CACF;AAzCD,4CAyCC"}
\ No newline at end of file
+{"version":3,"file":"BinarySearchTree.js","sourceRoot":"","sources":["../../../src/rules/indent-new-do-not-use/BinarySearchTree.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,kGAAkG;;;;;;AAGlG,0FAAmD;AASnD;;;;GAIG;AACH,MAAa,gBAAgB;IAA7B;QACU,WAAM,GAAG,mCAAU,EAAa,CAAC;IAwC3C,CAAC;IAtCC;;OAEG;IACI,MAAM,CAAC,GAAW,EAAE,KAAgB;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,QAAQ,CAAC,KAAK,EAAE;YAClB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACtC;aAAM;YACL,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAC9C;IACH,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,GAAW;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAErC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IACtD,CAAC;IAED;;OAEG;IACI,WAAW,CAAC,KAAa,EAAE,GAAW;QAC3C,+DAA+D;QAC/D,IAAI,KAAK,KAAK,GAAG,EAAE;YACjB,OAAO;SACR;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAEvC,OAAO,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,GAAG,GAAG,GAAG,EAAE;YAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC/C,QAAQ,CAAC,IAAI,EAAE,CAAC;SACjB;IACH,CAAC;CACF;AAzCD,4CAyCC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/OffsetStorage.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/OffsetStorage.js
index 7a2fdf1..a48651d 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/OffsetStorage.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/OffsetStorage.js
@@ -2,6 +2,7 @@
 // The following code is adapted from the the code in eslint.
 // License: https://github.com/eslint/eslint/blob/48700fc8408f394887cdedd071b22b757700fdcb/LICENSE
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.OffsetStorage = void 0;
 const BinarySearchTree_1 = require("./BinarySearchTree");
 /**
  * A class to store information on desired offsets of tokens from each other
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/OffsetStorage.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/OffsetStorage.js.map
index 74d053e..dc3aa66 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/OffsetStorage.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/OffsetStorage.js.map
@@ -1 +1 @@
-{"version":3,"file":"OffsetStorage.js","sourceRoot":"","sources":["../../../src/rules/indent-new-do-not-use/OffsetStorage.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"OffsetStorage.js","sourceRoot":"","sources":["../../../src/rules/indent-new-do-not-use/OffsetStorage.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/TokenInfo.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/TokenInfo.js
index 7fb64dd..5da8a48 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/TokenInfo.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/TokenInfo.js
@@ -2,6 +2,7 @@
 // The following code is adapted from the the code in eslint.
 // License: https://github.com/eslint/eslint/blob/48700fc8408f394887cdedd071b22b757700fdcb/LICENSE
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.TokenInfo = void 0;
 /**
  * A helper class to get token-based info related to indentation
  */
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/TokenInfo.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/TokenInfo.js.map
index 2c96727..7bc04ad 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/TokenInfo.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/TokenInfo.js.map
@@ -1 +1 @@
-{"version":3,"file":"TokenInfo.js","sourceRoot":"","sources":["../../../src/rules/indent-new-do-not-use/TokenInfo.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,kGAAkG;;AAKlG;;GAEG;AACH,MAAa,SAAS;IAIpB,YAAY,UAA+B;QACzC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,uBAAuB,GAAG,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAChE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACb,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBAClC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;aACtC;YACD,IACE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC5B,UAAU,CAAC,IAAI;qBACZ,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;qBAC5D,IAAI,EAAE,EACT;gBACA,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;aACpC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EACD,IAAI,GAAG,EAAE,CACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,mBAAmB,CACxB,KAAqC;QAErC,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC;IACjE,CAAC;IAED;;;OAGG;IACI,kBAAkB,CAAC,KAAqB;QAC7C,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,KAAqB;QACzC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAC/B,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EACvC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CACf,CAAC;IACJ,CAAC;CACF;AAtDD,8BAsDC"}
\ No newline at end of file
+{"version":3,"file":"TokenInfo.js","sourceRoot":"","sources":["../../../src/rules/indent-new-do-not-use/TokenInfo.ts"],"names":[],"mappings":";AAAA,6DAA6D;AAC7D,kGAAkG;;;AAKlG;;GAEG;AACH,MAAa,SAAS;IAIpB,YAAY,UAA+B;QACzC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,uBAAuB,GAAG,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAChE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACb,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBAClC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;aACtC;YACD,IACE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC5B,UAAU,CAAC,IAAI;qBACZ,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;qBAC5D,IAAI,EAAE,EACT;gBACA,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;aACpC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EACD,IAAI,GAAG,EAAE,CACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,mBAAmB,CACxB,KAAqC;QAErC,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC;IACjE,CAAC;IAED;;;OAGG;IACI,kBAAkB,CAAC,KAAqB;QAC7C,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,KAAqB;QACzC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAC/B,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EACvC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CACf,CAAC;IACJ,CAAC;CACF;AAtDD,8BAsDC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/index.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/index.js
index 536a9f8..c43a8a3 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/index.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/index.js
@@ -4,7 +4,6 @@
 //------------------------------------------------------------------------------
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const eslint_utils_1 = require("eslint-utils");
 const OffsetStorage_1 = require("./OffsetStorage");
 const TokenInfo_1 = require("./TokenInfo");
 const util_1 = require("../../util");
@@ -425,6 +424,7 @@
          * @returns True if the node is the outer IIFE
          */
         function isOuterIIFE(node) {
+            var _a;
             /*
              * Verify that the node is an IIFE
              */
@@ -438,7 +438,7 @@
              * A "legal ancestor" is an expression or statement that causes the function to get executed immediately.
              * For example, `!(function(){})()` is an outer IIFE even though it is preceded by a ! operator.
              */
-            let statement = node.parent && node.parent.parent;
+            let statement = (_a = node.parent) === null || _a === void 0 ? void 0 : _a.parent;
             while (statement &&
                 ((statement.type === experimental_utils_1.AST_NODE_TYPES.UnaryExpression &&
                     ['!', '~', '+', '-'].includes(statement.operator)) ||
@@ -480,7 +480,7 @@
              */
             function getFirstToken(element) {
                 let token = sourceCode.getTokenBefore(element);
-                while (eslint_utils_1.isOpeningParenToken(token) && token !== startToken) {
+                while (util_1.isOpeningParenToken(token) && token !== startToken) {
                     token = sourceCode.getTokenBefore(token);
                 }
                 return sourceCode.getTokenAfter(token);
@@ -530,11 +530,11 @@
          */
         function addBlocklessNodeIndent(node) {
             if (node.type !== experimental_utils_1.AST_NODE_TYPES.BlockStatement) {
-                const lastParentToken = sourceCode.getTokenBefore(node, eslint_utils_1.isNotOpeningParenToken);
+                const lastParentToken = sourceCode.getTokenBefore(node, util_1.isNotOpeningParenToken);
                 let firstBodyToken = sourceCode.getFirstToken(node);
                 let lastBodyToken = sourceCode.getLastToken(node);
-                while (eslint_utils_1.isOpeningParenToken(sourceCode.getTokenBefore(firstBodyToken)) &&
-                    eslint_utils_1.isClosingParenToken(sourceCode.getTokenAfter(lastBodyToken))) {
+                while (util_1.isOpeningParenToken(sourceCode.getTokenBefore(firstBodyToken)) &&
+                    util_1.isClosingParenToken(sourceCode.getTokenAfter(lastBodyToken))) {
                     firstBodyToken = sourceCode.getTokenBefore(firstBodyToken);
                     lastBodyToken = sourceCode.getTokenAfter(lastBodyToken);
                 }
@@ -548,7 +548,7 @@
                 const lastToken = sourceCode.getLastToken(node);
                 if (lastToken &&
                     node.type !== experimental_utils_1.AST_NODE_TYPES.EmptyStatement &&
-                    eslint_utils_1.isSemicolonToken(lastToken)) {
+                    util_1.isSemicolonToken(lastToken)) {
                     offsets.setDesiredOffset(lastToken, lastParentToken, 0);
                 }
             }
@@ -558,7 +558,7 @@
          */
         function addFunctionCallIndent(node) {
             const openingParen = node.arguments.length
-                ? sourceCode.getFirstTokenBetween(node.callee, node.arguments[0], eslint_utils_1.isOpeningParenToken)
+                ? sourceCode.getFirstTokenBetween(node.callee, node.arguments[0], util_1.isOpeningParenToken)
                 : sourceCode.getLastToken(node, 1);
             const closingParen = sourceCode.getLastToken(node);
             parameterParens.add(openingParen);
@@ -575,10 +575,10 @@
             const parenPairs = [];
             tokens.forEach(nextToken => {
                 // Accumulate a list of parenthesis pairs
-                if (eslint_utils_1.isOpeningParenToken(nextToken)) {
+                if (util_1.isOpeningParenToken(nextToken)) {
                     parenStack.push(nextToken);
                 }
-                else if (eslint_utils_1.isClosingParenToken(nextToken)) {
+                else if (util_1.isClosingParenToken(nextToken)) {
                     parenPairs.unshift({ left: parenStack.pop(), right: nextToken });
                 }
             });
@@ -656,14 +656,14 @@
             'ArrayExpression, ArrayPattern'(node) {
                 var _a;
                 const openingBracket = sourceCode.getFirstToken(node);
-                const closingBracket = sourceCode.getTokenAfter((_a = node.elements[node.elements.length - 1], (_a !== null && _a !== void 0 ? _a : openingBracket)), eslint_utils_1.isClosingBracketToken);
+                const closingBracket = sourceCode.getTokenAfter((_a = node.elements[node.elements.length - 1]) !== null && _a !== void 0 ? _a : openingBracket, util_1.isClosingBracketToken);
                 addElementListIndent(node.elements, openingBracket, closingBracket, options.ArrayExpression);
             },
             ArrowFunctionExpression(node) {
                 const firstToken = sourceCode.getFirstToken(node);
-                if (eslint_utils_1.isOpeningParenToken(firstToken)) {
+                if (util_1.isOpeningParenToken(firstToken)) {
                     const openingParen = firstToken;
-                    const closingParen = sourceCode.getTokenBefore(node.body, eslint_utils_1.isClosingParenToken);
+                    const closingParen = sourceCode.getTokenBefore(node.body, util_1.isClosingParenToken);
                     parameterParens.add(openingParen);
                     parameterParens.add(closingParen);
                     addElementListIndent(node.params, openingParen, closingParen, options.FunctionExpression.parameters);
@@ -717,7 +717,7 @@
             CallExpression: addFunctionCallIndent,
             'ClassDeclaration[superClass], ClassExpression[superClass]'(node) {
                 const classToken = sourceCode.getFirstToken(node);
-                const extendsToken = sourceCode.getTokenBefore(node.superClass, eslint_utils_1.isNotOpeningParenToken);
+                const extendsToken = sourceCode.getTokenBefore(node.superClass, util_1.isNotOpeningParenToken);
                 offsets.setDesiredOffsets([extendsToken.range[0], node.body.range[0]], classToken, 1);
             },
             ConditionalExpression(node) {
@@ -771,7 +771,7 @@
             },
             ExportNamedDeclaration(node) {
                 if (node.declaration === null) {
-                    const closingCurly = sourceCode.getLastToken(node, eslint_utils_1.isClosingBraceToken);
+                    const closingCurly = sourceCode.getLastToken(node, util_1.isClosingBraceToken);
                     // Indent the specifiers in `export {foo, bar, baz}`
                     addElementListIndent(node.specifiers, sourceCode.getFirstToken(node, { skip: 1 }), closingCurly, 1);
                     if (node.source) {
@@ -809,8 +809,8 @@
             },
             ImportDeclaration(node) {
                 if (node.specifiers.some(specifier => specifier.type === experimental_utils_1.AST_NODE_TYPES.ImportSpecifier)) {
-                    const openingCurly = sourceCode.getFirstToken(node, eslint_utils_1.isOpeningBraceToken);
-                    const closingCurly = sourceCode.getLastToken(node, eslint_utils_1.isClosingBraceToken);
+                    const openingCurly = sourceCode.getFirstToken(node, util_1.isOpeningBraceToken);
+                    const closingCurly = sourceCode.getLastToken(node, util_1.isClosingBraceToken);
                     addElementListIndent(node.specifiers.filter(specifier => specifier.type === experimental_utils_1.AST_NODE_TYPES.ImportSpecifier), openingCurly, closingCurly, options.ImportDeclaration);
                 }
                 const fromToken = sourceCode.getLastToken(node, token => token.type === experimental_utils_1.AST_TOKEN_TYPES.Identifier && token.value === 'from');
@@ -826,9 +826,9 @@
             'MemberExpression, JSXMemberExpression, MetaProperty'(node) {
                 const object = node.type === experimental_utils_1.AST_NODE_TYPES.MetaProperty ? node.meta : node.object;
                 const isComputed = 'computed' in node && node.computed;
-                const firstNonObjectToken = sourceCode.getFirstTokenBetween(object, node.property, eslint_utils_1.isNotClosingParenToken);
+                const firstNonObjectToken = sourceCode.getFirstTokenBetween(object, node.property, util_1.isNotClosingParenToken);
                 const secondNonObjectToken = sourceCode.getTokenAfter(firstNonObjectToken);
-                const objectParenCount = sourceCode.getTokensBetween(object, node.property, { filter: eslint_utils_1.isClosingParenToken }).length;
+                const objectParenCount = sourceCode.getTokensBetween(object, node.property, { filter: util_1.isClosingParenToken }).length;
                 const firstObjectToken = objectParenCount
                     ? sourceCode.getTokenBefore(object, { skip: objectParenCount - 1 })
                     : sourceCode.getFirstToken(object);
@@ -874,8 +874,8 @@
             NewExpression(node) {
                 // Only indent the arguments if the NewExpression has parens (e.g. `new Foo(bar)` or `new Foo()`, but not `new Foo`
                 if (node.arguments.length > 0 ||
-                    (eslint_utils_1.isClosingParenToken(sourceCode.getLastToken(node)) &&
-                        eslint_utils_1.isOpeningParenToken(sourceCode.getLastToken(node, 1)))) {
+                    (util_1.isClosingParenToken(sourceCode.getLastToken(node)) &&
+                        util_1.isOpeningParenToken(sourceCode.getLastToken(node, 1)))) {
                     addFunctionCallIndent(node);
                 }
             },
@@ -883,24 +883,24 @@
                 const openingCurly = sourceCode.getFirstToken(node);
                 const closingCurly = sourceCode.getTokenAfter(node.properties.length
                     ? node.properties[node.properties.length - 1]
-                    : openingCurly, eslint_utils_1.isClosingBraceToken);
+                    : openingCurly, util_1.isClosingBraceToken);
                 addElementListIndent(node.properties, openingCurly, closingCurly, options.ObjectExpression);
             },
             Property(node) {
                 if (!node.shorthand && !node.method && node.kind === 'init') {
-                    const colon = sourceCode.getFirstTokenBetween(node.key, node.value, eslint_utils_1.isColonToken);
+                    const colon = sourceCode.getFirstTokenBetween(node.key, node.value, util_1.isColonToken);
                     offsets.ignoreToken(sourceCode.getTokenAfter(colon));
                 }
             },
             SwitchStatement(node) {
-                const openingCurly = sourceCode.getTokenAfter(node.discriminant, eslint_utils_1.isOpeningBraceToken);
+                const openingCurly = sourceCode.getTokenAfter(node.discriminant, util_1.isOpeningBraceToken);
                 const closingCurly = sourceCode.getLastToken(node);
                 offsets.setDesiredOffsets([openingCurly.range[1], closingCurly.range[0]], openingCurly, options.SwitchCase);
                 if (node.cases.length) {
                     sourceCode
                         .getTokensBetween(node.cases[node.cases.length - 1], closingCurly, {
                         includeComments: true,
-                        filter: eslint_utils_1.isCommentToken,
+                        filter: util_1.isCommentToken,
                     })
                         .forEach(token => offsets.ignoreToken(token));
                 }
@@ -966,13 +966,13 @@
                 else {
                     offsets.setDesiredOffsets(node.range, firstToken, variableIndent);
                 }
-                if (eslint_utils_1.isSemicolonToken(lastToken)) {
+                if (util_1.isSemicolonToken(lastToken)) {
                     offsets.ignoreToken(lastToken);
                 }
             },
             VariableDeclarator(node) {
                 if (node.init) {
-                    const equalOperator = sourceCode.getTokenBefore(node.init, eslint_utils_1.isNotOpeningParenToken);
+                    const equalOperator = sourceCode.getTokenBefore(node.init, util_1.isNotOpeningParenToken);
                     const tokenAfterOperator = sourceCode.getTokenAfter(equalOperator);
                     offsets.ignoreToken(equalOperator);
                     offsets.ignoreToken(tokenAfterOperator);
@@ -1117,7 +1117,7 @@
                     if (validateTokenIndent(firstTokenOfLine, offsets.getDesiredIndent(firstTokenOfLine))) {
                         return;
                     }
-                    if (eslint_utils_1.isCommentToken(firstTokenOfLine)) {
+                    if (util_1.isCommentToken(firstTokenOfLine)) {
                         const tokenBefore = precedingTokens.get(firstTokenOfLine);
                         const tokenAfter = tokenBefore
                             ? sourceCode.getTokenAfter(tokenBefore)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/index.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/index.js.map
index c26f167..5556626 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/index.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/indent-new-do-not-use/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rules/indent-new-do-not-use/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent.js
index abb3c23..bdb0d7a 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent.js
@@ -5,16 +5,29 @@
  * This is done intentionally based on the internal implementation of the base indent rule.
  */
 /* eslint-disable @typescript-eslint/no-explicit-any */
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var _a;
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const indent_1 = __importDefault(require("eslint/lib/rules/indent"));
@@ -98,7 +111,9 @@
         },
         fixable: 'whitespace',
         schema: indent_1.default.meta.schema,
-        messages: indent_1.default.meta.messages,
+        messages: (_a = indent_1.default.meta.messages) !== null && _a !== void 0 ? _a : {
+            wrongIndentation: 'Expected indentation of {{expected}} but found {{actual}}.',
+        },
     },
     defaultOptions: [
         // typescript docs and playground use 4 space indent
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent.js.map
index d4c35b4..9ec4bd5 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent.js.map
@@ -1 +1 @@
-{"version":3,"file":"indent.js","sourceRoot":"","sources":["../../src/rules/indent.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"indent.js","sourceRoot":"","sources":["../../src/rules/indent.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/index.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/index.js
index 4a9a552..314f327 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/index.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/index.js
@@ -7,25 +7,29 @@
 const array_type_1 = __importDefault(require("./array-type"));
 const await_thenable_1 = __importDefault(require("./await-thenable"));
 const ban_ts_comment_1 = __importDefault(require("./ban-ts-comment"));
-const ban_ts_ignore_1 = __importDefault(require("./ban-ts-ignore"));
+const ban_tslint_comment_1 = __importDefault(require("./ban-tslint-comment"));
 const ban_types_1 = __importDefault(require("./ban-types"));
 const brace_style_1 = __importDefault(require("./brace-style"));
-const camelcase_1 = __importDefault(require("./camelcase"));
-const class_name_casing_1 = __importDefault(require("./class-name-casing"));
+const class_literal_property_style_1 = __importDefault(require("./class-literal-property-style"));
+const comma_dangle_1 = __importDefault(require("./comma-dangle"));
 const comma_spacing_1 = __importDefault(require("./comma-spacing"));
+const no_confusing_non_null_assertion_1 = __importDefault(require("./no-confusing-non-null-assertion"));
 const consistent_type_assertions_1 = __importDefault(require("./consistent-type-assertions"));
 const consistent_type_definitions_1 = __importDefault(require("./consistent-type-definitions"));
+const consistent_type_imports_1 = __importDefault(require("./consistent-type-imports"));
 const default_param_last_1 = __importDefault(require("./default-param-last"));
+const dot_notation_1 = __importDefault(require("./dot-notation"));
 const explicit_function_return_type_1 = __importDefault(require("./explicit-function-return-type"));
 const explicit_member_accessibility_1 = __importDefault(require("./explicit-member-accessibility"));
 const explicit_module_boundary_types_1 = __importDefault(require("./explicit-module-boundary-types"));
 const func_call_spacing_1 = __importDefault(require("./func-call-spacing"));
-const generic_type_naming_1 = __importDefault(require("./generic-type-naming"));
 const indent_1 = __importDefault(require("./indent"));
-const interface_name_prefix_1 = __importDefault(require("./interface-name-prefix"));
+const init_declarations_1 = __importDefault(require("./init-declarations"));
+const keyword_spacing_1 = __importDefault(require("./keyword-spacing"));
+const lines_between_class_members_1 = __importDefault(require("./lines-between-class-members"));
 const member_delimiter_style_1 = __importDefault(require("./member-delimiter-style"));
-const member_naming_1 = __importDefault(require("./member-naming"));
 const member_ordering_1 = __importDefault(require("./member-ordering"));
+const method_signature_style_1 = __importDefault(require("./method-signature-style"));
 const naming_convention_1 = __importDefault(require("./naming-convention"));
 const no_array_constructor_1 = __importDefault(require("./no-array-constructor"));
 const no_base_to_string_1 = __importDefault(require("./no-base-to-string"));
@@ -34,14 +38,20 @@
 const no_empty_function_1 = __importDefault(require("./no-empty-function"));
 const no_empty_interface_1 = __importDefault(require("./no-empty-interface"));
 const no_explicit_any_1 = __importDefault(require("./no-explicit-any"));
+const no_implicit_any_catch_1 = __importDefault(require("./no-implicit-any-catch"));
 const no_extraneous_class_1 = __importDefault(require("./no-extraneous-class"));
 const no_extra_non_null_assertion_1 = __importDefault(require("./no-extra-non-null-assertion"));
 const no_extra_parens_1 = __importDefault(require("./no-extra-parens"));
 const no_extra_semi_1 = __importDefault(require("./no-extra-semi"));
 const no_floating_promises_1 = __importDefault(require("./no-floating-promises"));
 const no_for_in_array_1 = __importDefault(require("./no-for-in-array"));
+const prefer_literal_enum_member_1 = __importDefault(require("./prefer-literal-enum-member"));
 const no_implied_eval_1 = __importDefault(require("./no-implied-eval"));
 const no_inferrable_types_1 = __importDefault(require("./no-inferrable-types"));
+const no_invalid_this_1 = __importDefault(require("./no-invalid-this"));
+const no_invalid_void_type_1 = __importDefault(require("./no-invalid-void-type"));
+const no_loss_of_precision_1 = __importDefault(require("./no-loss-of-precision"));
+const no_loop_func_1 = __importDefault(require("./no-loop-func"));
 const no_magic_numbers_1 = __importDefault(require("./no-magic-numbers"));
 const no_misused_new_1 = __importDefault(require("./no-misused-new"));
 const no_misused_promises_1 = __importDefault(require("./no-misused-promises"));
@@ -49,7 +59,9 @@
 const no_non_null_asserted_optional_chain_1 = __importDefault(require("./no-non-null-asserted-optional-chain"));
 const no_non_null_assertion_1 = __importDefault(require("./no-non-null-assertion"));
 const no_parameter_properties_1 = __importDefault(require("./no-parameter-properties"));
+const no_redeclare_1 = __importDefault(require("./no-redeclare"));
 const no_require_imports_1 = __importDefault(require("./no-require-imports"));
+const no_shadow_1 = __importDefault(require("./no-shadow"));
 const no_this_alias_1 = __importDefault(require("./no-this-alias"));
 const no_throw_literal_1 = __importDefault(require("./no-throw-literal"));
 const no_type_alias_1 = __importDefault(require("./no-type-alias"));
@@ -58,7 +70,10 @@
 const no_unnecessary_qualifier_1 = __importDefault(require("./no-unnecessary-qualifier"));
 const no_unnecessary_type_arguments_1 = __importDefault(require("./no-unnecessary-type-arguments"));
 const no_unnecessary_type_assertion_1 = __importDefault(require("./no-unnecessary-type-assertion"));
-const no_untyped_public_signature_1 = __importDefault(require("./no-untyped-public-signature"));
+const no_unsafe_assignment_1 = __importDefault(require("./no-unsafe-assignment"));
+const no_unsafe_call_1 = __importDefault(require("./no-unsafe-call"));
+const no_unsafe_member_access_1 = __importDefault(require("./no-unsafe-member-access"));
+const no_unsafe_return_1 = __importDefault(require("./no-unsafe-return"));
 const no_unused_expressions_1 = __importDefault(require("./no-unused-expressions"));
 const no_unused_vars_1 = __importDefault(require("./no-unused-vars"));
 const no_unused_vars_experimental_1 = __importDefault(require("./no-unused-vars-experimental"));
@@ -66,6 +81,7 @@
 const no_useless_constructor_1 = __importDefault(require("./no-useless-constructor"));
 const no_var_requires_1 = __importDefault(require("./no-var-requires"));
 const prefer_as_const_1 = __importDefault(require("./prefer-as-const"));
+const prefer_enum_initializers_1 = __importDefault(require("./prefer-enum-initializers"));
 const prefer_for_of_1 = __importDefault(require("./prefer-for-of"));
 const prefer_function_type_1 = __importDefault(require("./prefer-function-type"));
 const prefer_includes_1 = __importDefault(require("./prefer-includes"));
@@ -74,8 +90,10 @@
 const prefer_optional_chain_1 = __importDefault(require("./prefer-optional-chain"));
 const prefer_readonly_1 = __importDefault(require("./prefer-readonly"));
 const prefer_readonly_parameter_types_1 = __importDefault(require("./prefer-readonly-parameter-types"));
+const prefer_reduce_type_parameter_1 = __importDefault(require("./prefer-reduce-type-parameter"));
 const prefer_regexp_exec_1 = __importDefault(require("./prefer-regexp-exec"));
 const prefer_string_starts_ends_with_1 = __importDefault(require("./prefer-string-starts-ends-with"));
+const prefer_ts_expect_error_1 = __importDefault(require("./prefer-ts-expect-error"));
 const promise_function_async_1 = __importDefault(require("./promise-function-async"));
 const quotes_1 = __importDefault(require("./quotes"));
 const require_array_sort_compare_1 = __importDefault(require("./require-array-sort-compare"));
@@ -97,28 +115,31 @@
     'array-type': array_type_1.default,
     'await-thenable': await_thenable_1.default,
     'ban-ts-comment': ban_ts_comment_1.default,
-    'ban-ts-ignore': ban_ts_ignore_1.default,
+    'ban-tslint-comment': ban_tslint_comment_1.default,
     'ban-types': ban_types_1.default,
-    'no-base-to-string': no_base_to_string_1.default,
     'brace-style': brace_style_1.default,
-    camelcase: camelcase_1.default,
-    'class-name-casing': class_name_casing_1.default,
+    'class-literal-property-style': class_literal_property_style_1.default,
+    'comma-dangle': comma_dangle_1.default,
     'comma-spacing': comma_spacing_1.default,
     'consistent-type-assertions': consistent_type_assertions_1.default,
     'consistent-type-definitions': consistent_type_definitions_1.default,
+    'consistent-type-imports': consistent_type_imports_1.default,
     'default-param-last': default_param_last_1.default,
+    'dot-notation': dot_notation_1.default,
     'explicit-function-return-type': explicit_function_return_type_1.default,
     'explicit-member-accessibility': explicit_member_accessibility_1.default,
     'explicit-module-boundary-types': explicit_module_boundary_types_1.default,
     'func-call-spacing': func_call_spacing_1.default,
-    'generic-type-naming': generic_type_naming_1.default,
-    indent: indent_1.default,
-    'interface-name-prefix': interface_name_prefix_1.default,
+    'init-declarations': init_declarations_1.default,
+    'keyword-spacing': keyword_spacing_1.default,
+    'lines-between-class-members': lines_between_class_members_1.default,
     'member-delimiter-style': member_delimiter_style_1.default,
-    'member-naming': member_naming_1.default,
     'member-ordering': member_ordering_1.default,
+    'method-signature-style': method_signature_style_1.default,
     'naming-convention': naming_convention_1.default,
     'no-array-constructor': no_array_constructor_1.default,
+    'no-base-to-string': no_base_to_string_1.default,
+    'no-confusing-non-null-assertion': no_confusing_non_null_assertion_1.default,
     'no-dupe-class-members': no_dupe_class_members_1.default,
     'no-dynamic-delete': no_dynamic_delete_1.default,
     'no-empty-function': no_empty_function_1.default,
@@ -130,8 +151,13 @@
     'no-extraneous-class': no_extraneous_class_1.default,
     'no-floating-promises': no_floating_promises_1.default,
     'no-for-in-array': no_for_in_array_1.default,
+    'no-implicit-any-catch': no_implicit_any_catch_1.default,
     'no-implied-eval': no_implied_eval_1.default,
     'no-inferrable-types': no_inferrable_types_1.default,
+    'no-invalid-this': no_invalid_this_1.default,
+    'no-invalid-void-type': no_invalid_void_type_1.default,
+    'no-loop-func': no_loop_func_1.default,
+    'no-loss-of-precision': no_loss_of_precision_1.default,
     'no-magic-numbers': no_magic_numbers_1.default,
     'no-misused-new': no_misused_new_1.default,
     'no-misused-promises': no_misused_promises_1.default,
@@ -139,7 +165,9 @@
     'no-non-null-asserted-optional-chain': no_non_null_asserted_optional_chain_1.default,
     'no-non-null-assertion': no_non_null_assertion_1.default,
     'no-parameter-properties': no_parameter_properties_1.default,
+    'no-redeclare': no_redeclare_1.default,
     'no-require-imports': no_require_imports_1.default,
+    'no-shadow': no_shadow_1.default,
     'no-this-alias': no_this_alias_1.default,
     'no-throw-literal': no_throw_literal_1.default,
     'no-type-alias': no_type_alias_1.default,
@@ -148,7 +176,10 @@
     'no-unnecessary-qualifier': no_unnecessary_qualifier_1.default,
     'no-unnecessary-type-arguments': no_unnecessary_type_arguments_1.default,
     'no-unnecessary-type-assertion': no_unnecessary_type_assertion_1.default,
-    'no-untyped-public-signature': no_untyped_public_signature_1.default,
+    'no-unsafe-assignment': no_unsafe_assignment_1.default,
+    'no-unsafe-call': no_unsafe_call_1.default,
+    'no-unsafe-member-access': no_unsafe_member_access_1.default,
+    'no-unsafe-return': no_unsafe_return_1.default,
     'no-unused-expressions': no_unused_expressions_1.default,
     'no-unused-vars-experimental': no_unused_vars_experimental_1.default,
     'no-unused-vars': no_unused_vars_1.default,
@@ -156,31 +187,36 @@
     'no-useless-constructor': no_useless_constructor_1.default,
     'no-var-requires': no_var_requires_1.default,
     'prefer-as-const': prefer_as_const_1.default,
+    'prefer-enum-initializers': prefer_enum_initializers_1.default,
     'prefer-for-of': prefer_for_of_1.default,
     'prefer-function-type': prefer_function_type_1.default,
     'prefer-includes': prefer_includes_1.default,
+    'prefer-literal-enum-member': prefer_literal_enum_member_1.default,
     'prefer-namespace-keyword': prefer_namespace_keyword_1.default,
     'prefer-nullish-coalescing': prefer_nullish_coalescing_1.default,
     'prefer-optional-chain': prefer_optional_chain_1.default,
     'prefer-readonly-parameter-types': prefer_readonly_parameter_types_1.default,
     'prefer-readonly': prefer_readonly_1.default,
+    'prefer-reduce-type-parameter': prefer_reduce_type_parameter_1.default,
     'prefer-regexp-exec': prefer_regexp_exec_1.default,
     'prefer-string-starts-ends-with': prefer_string_starts_ends_with_1.default,
+    'prefer-ts-expect-error': prefer_ts_expect_error_1.default,
     'promise-function-async': promise_function_async_1.default,
-    quotes: quotes_1.default,
     'require-array-sort-compare': require_array_sort_compare_1.default,
     'require-await': require_await_1.default,
     'restrict-plus-operands': restrict_plus_operands_1.default,
     'restrict-template-expressions': restrict_template_expressions_1.default,
     'return-await': return_await_1.default,
-    semi: semi_1.default,
     'space-before-function-paren': space_before_function_paren_1.default,
     'strict-boolean-expressions': strict_boolean_expressions_1.default,
     'switch-exhaustiveness-check': switch_exhaustiveness_check_1.default,
     'triple-slash-reference': triple_slash_reference_1.default,
     'type-annotation-spacing': type_annotation_spacing_1.default,
-    typedef: typedef_1.default,
     'unbound-method': unbound_method_1.default,
     'unified-signatures': unified_signatures_1.default,
+    indent: indent_1.default,
+    quotes: quotes_1.default,
+    semi: semi_1.default,
+    typedef: typedef_1.default,
 };
 //# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/index.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/index.js.map
index 531d336..ca13740 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/index.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/init-declarations.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/init-declarations.js
new file mode 100644
index 0000000..9b4b331
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/init-declarations.js
@@ -0,0 +1,47 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var _a;
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const init_declarations_1 = __importDefault(require("eslint/lib/rules/init-declarations"));
+const util_1 = require("../util");
+exports.default = util_1.createRule({
+    name: 'init-declarations',
+    meta: {
+        type: 'suggestion',
+        docs: {
+            description: 'require or disallow initialization in variable declarations',
+            category: 'Variables',
+            recommended: false,
+            extendsBaseRule: true,
+        },
+        schema: init_declarations_1.default.meta.schema,
+        messages: (_a = init_declarations_1.default.meta.messages) !== null && _a !== void 0 ? _a : {
+            initialized: "Variable '{{idName}}' should be initialized on declaration.",
+            notInitialized: "Variable '{{idName}}' should not be initialized on declaration.",
+        },
+    },
+    defaultOptions: ['always'],
+    create(context) {
+        const rules = init_declarations_1.default.create(context);
+        const mode = context.options[0] || 'always';
+        return {
+            'VariableDeclaration:exit'(node) {
+                var _a, _b, _c;
+                if (mode === 'always') {
+                    if (node.declare) {
+                        return;
+                    }
+                    if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.TSModuleBlock &&
+                        ((_b = node.parent.parent) === null || _b === void 0 ? void 0 : _b.type) === experimental_utils_1.AST_NODE_TYPES.TSModuleDeclaration && ((_c = node.parent.parent) === null || _c === void 0 ? void 0 : _c.declare)) {
+                        return;
+                    }
+                }
+                rules['VariableDeclaration:exit'](node);
+            },
+        };
+    },
+});
+//# sourceMappingURL=init-declarations.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/init-declarations.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/init-declarations.js.map
new file mode 100644
index 0000000..99bf077
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/init-declarations.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"init-declarations.js","sourceRoot":"","sources":["../../src/rules/init-declarations.ts"],"names":[],"mappings":";;;;;;AAAA,8EAG+C;AAC/C,2FAA0D;AAC1D,kCAIiB;AAKjB,kBAAe,iBAAU,CAAsB;IAC7C,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,6DAA6D;YAC/D,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,MAAM,EAAE,2BAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,QAAE,2BAAQ,CAAC,IAAI,CAAC,QAAQ,mCAAI;YAClC,WAAW,EACT,6DAA6D;YAC/D,cAAc,EACZ,iEAAiE;SACpE;KACF;IACD,cAAc,EAAE,CAAC,QAAQ,CAAC;IAC1B,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,2BAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;QAE5C,OAAO;YACL,0BAA0B,CAAC,IAAkC;;gBAC3D,IAAI,IAAI,KAAK,QAAQ,EAAE;oBACrB,IAAI,IAAI,CAAC,OAAO,EAAE;wBAChB,OAAO;qBACR;oBACD,IACE,OAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,MAAK,mCAAc,CAAC,aAAa;wBAClD,OAAA,IAAI,CAAC,MAAM,CAAC,MAAM,0CAAE,IAAI,MAAK,mCAAc,CAAC,mBAAmB,WAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,0CAAE,OAAO,CAAA,EAC3B;wBACA,OAAO;qBACR;iBACF;gBAED,KAAK,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1C,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/interface-name-prefix.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/interface-name-prefix.js
deleted file mode 100644
index 17ca3f4..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/interface-name-prefix.js
+++ /dev/null
@@ -1,132 +0,0 @@
-"use strict";
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const util = __importStar(require("../util"));
-/**
- * Parses a given value as options.
- */
-function parseOptions([options]) {
-    if (options === 'always') {
-        return { prefixWithI: 'always', allowUnderscorePrefix: false };
-    }
-    if (options !== 'never' && options.prefixWithI === 'always') {
-        return {
-            prefixWithI: 'always',
-            allowUnderscorePrefix: !!options.allowUnderscorePrefix,
-        };
-    }
-    return { prefixWithI: 'never' };
-}
-exports.parseOptions = parseOptions;
-exports.default = util.createRule({
-    name: 'interface-name-prefix',
-    meta: {
-        type: 'suggestion',
-        docs: {
-            description: 'Require that interface names should or should not prefixed with `I`',
-            category: 'Stylistic Issues',
-            // this will always be recommended as there's no reason to use this convention
-            // https://github.com/typescript-eslint/typescript-eslint/issues/374
-            recommended: 'error',
-        },
-        deprecated: true,
-        replacedBy: ['naming-convention'],
-        messages: {
-            noPrefix: 'Interface name must not be prefixed with "I".',
-            alwaysPrefix: 'Interface name must be prefixed with "I".',
-        },
-        schema: [
-            {
-                oneOf: [
-                    {
-                        enum: [
-                            // Deprecated, equivalent to: { prefixWithI: 'never' }
-                            'never',
-                            // Deprecated, equivalent to: { prefixWithI: 'always', allowUnderscorePrefix: false }
-                            'always',
-                        ],
-                    },
-                    {
-                        type: 'object',
-                        properties: {
-                            prefixWithI: {
-                                type: 'string',
-                                enum: ['never'],
-                            },
-                        },
-                        additionalProperties: false,
-                    },
-                    {
-                        type: 'object',
-                        properties: {
-                            prefixWithI: {
-                                type: 'string',
-                                enum: ['always'],
-                            },
-                            allowUnderscorePrefix: {
-                                type: 'boolean',
-                            },
-                        },
-                        required: ['prefixWithI'],
-                        additionalProperties: false,
-                    },
-                ],
-            },
-        ],
-    },
-    defaultOptions: [{ prefixWithI: 'never' }],
-    create(context, [options]) {
-        const parsedOptions = parseOptions([options]);
-        /**
-         * Checks if a string is prefixed with "I".
-         * @param name The string to check
-         */
-        function isPrefixedWithI(name) {
-            return /^I[A-Z]/.test(name);
-        }
-        /**
-         * Checks if a string is prefixed with "I" or "_I".
-         * @param name The string to check
-         */
-        function isPrefixedWithIOrUnderscoreI(name) {
-            return /^_?I[A-Z]/.test(name);
-        }
-        return {
-            TSInterfaceDeclaration(node) {
-                if (parsedOptions.prefixWithI === 'never') {
-                    if (isPrefixedWithIOrUnderscoreI(node.id.name)) {
-                        context.report({
-                            node: node.id,
-                            messageId: 'noPrefix',
-                        });
-                    }
-                }
-                else {
-                    if (parsedOptions.allowUnderscorePrefix) {
-                        if (!isPrefixedWithIOrUnderscoreI(node.id.name)) {
-                            context.report({
-                                node: node.id,
-                                messageId: 'alwaysPrefix',
-                            });
-                        }
-                    }
-                    else {
-                        if (!isPrefixedWithI(node.id.name)) {
-                            context.report({
-                                node: node.id,
-                                messageId: 'alwaysPrefix',
-                            });
-                        }
-                    }
-                }
-            },
-        };
-    },
-});
-//# sourceMappingURL=interface-name-prefix.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/interface-name-prefix.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/interface-name-prefix.js.map
deleted file mode 100644
index a015464..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/interface-name-prefix.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"interface-name-prefix.js","sourceRoot":"","sources":["../../src/rules/interface-name-prefix.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/keyword-spacing.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/keyword-spacing.js
new file mode 100644
index 0000000..a0d9871
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/keyword-spacing.js
@@ -0,0 +1,67 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var _a;
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const keyword_spacing_1 = __importDefault(require("eslint/lib/rules/keyword-spacing"));
+const util = __importStar(require("../util"));
+exports.default = util.createRule({
+    name: 'keyword-spacing',
+    meta: {
+        type: 'layout',
+        docs: {
+            description: 'Enforce consistent spacing before and after keywords',
+            category: 'Stylistic Issues',
+            recommended: false,
+            extendsBaseRule: true,
+        },
+        fixable: 'whitespace',
+        schema: keyword_spacing_1.default.meta.schema,
+        messages: (_a = keyword_spacing_1.default.meta.messages) !== null && _a !== void 0 ? _a : {
+            expectedBefore: 'Expected space(s) before "{{value}}".',
+            expectedAfter: 'Expected space(s) after "{{value}}".',
+            unexpectedBefore: 'Unexpected space(s) before "{{value}}".',
+            unexpectedAfter: 'Unexpected space(s) after "{{value}}".',
+        },
+    },
+    defaultOptions: [{}],
+    create(context) {
+        const sourceCode = context.getSourceCode();
+        const baseRules = keyword_spacing_1.default.create(context);
+        return Object.assign(Object.assign({}, baseRules), { TSAsExpression(node) {
+                const asToken = util.nullThrows(sourceCode.getTokenAfter(node.expression, token => token.value === 'as'), util.NullThrowsReasons.MissingToken('as', node.type));
+                const oldTokenType = asToken.type;
+                // as is a contextual keyword, so it's always reported as an Identifier
+                // the rule looks for keyword tokens, so we temporarily override it
+                // we mutate it at the token level because the rule calls sourceCode.getFirstToken,
+                // so mutating a copy would not change the underlying copy returned by that method
+                asToken.type = experimental_utils_1.AST_TOKEN_TYPES.Keyword;
+                // use this selector just because it is just a call to `checkSpacingAroundFirstToken`
+                baseRules.DebuggerStatement(asToken);
+                // make sure to reset the type afterward so we don't permanently mutate the AST
+                asToken.type = oldTokenType;
+            } });
+    },
+});
+//# sourceMappingURL=keyword-spacing.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/keyword-spacing.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/keyword-spacing.js.map
new file mode 100644
index 0000000..181f8ee
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/keyword-spacing.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"keyword-spacing.js","sourceRoot":"","sources":["../../src/rules/keyword-spacing.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8EAAwE;AACxE,uFAAwD;AACxD,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE;YACJ,WAAW,EAAE,sDAAsD;YACnE,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,yBAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,QAAE,yBAAQ,CAAC,IAAI,CAAC,QAAQ,mCAAI;YAClC,cAAc,EAAE,uCAAuC;YACvD,aAAa,EAAE,sCAAsC;YACrD,gBAAgB,EAAE,yCAAyC;YAC3D,eAAe,EAAE,wCAAwC;SAC1D;KACF;IACD,cAAc,EAAE,CAAC,EAAE,CAAC;IAEpB,MAAM,CAAC,OAAO;QACZ,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,yBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3C,uCACK,SAAS,KACZ,cAAc,CAAC,IAAI;gBACjB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAC7B,UAAU,CAAC,aAAa,CACtB,IAAI,CAAC,UAAU,EACf,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAC9B,EACD,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CACrD,CAAC;gBACF,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;gBAClC,uEAAuE;gBACvE,mEAAmE;gBACnE,mFAAmF;gBACnF,kFAAkF;gBAClF,OAAO,CAAC,IAAI,GAAG,oCAAe,CAAC,OAAO,CAAC;gBAEvC,qFAAqF;gBACrF,SAAS,CAAC,iBAAiB,CAAC,OAAgB,CAAC,CAAC;gBAE9C,+EAA+E;gBAC/E,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;YAC9B,CAAC,IACD;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/lines-between-class-members.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/lines-between-class-members.js
new file mode 100644
index 0000000..7d55e43
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/lines-between-class-members.js
@@ -0,0 +1,79 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var _a;
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const lines_between_class_members_1 = __importDefault(require("eslint/lib/rules/lines-between-class-members"));
+const util = __importStar(require("../util"));
+const schema = util.deepMerge(Object.assign({}, lines_between_class_members_1.default.meta.schema), {
+    1: {
+        exceptAfterOverload: {
+            type: 'booleean',
+            default: true,
+        },
+    },
+});
+exports.default = util.createRule({
+    name: 'lines-between-class-members',
+    meta: {
+        type: 'layout',
+        docs: {
+            description: 'Require or disallow an empty line between class members',
+            category: 'Stylistic Issues',
+            recommended: false,
+            extendsBaseRule: true,
+        },
+        fixable: 'whitespace',
+        schema,
+        messages: (_a = lines_between_class_members_1.default.meta.messages) !== null && _a !== void 0 ? _a : {
+            never: 'Unexpected blank line between class members.',
+            always: 'Expected blank line between class members.',
+        },
+    },
+    defaultOptions: [
+        'always',
+        {
+            exceptAfterOverload: true,
+            exceptAfterSingleLine: false,
+        },
+    ],
+    create(context, options) {
+        var _a;
+        const rules = lines_between_class_members_1.default.create(context);
+        const exceptAfterOverload = ((_a = options[1]) === null || _a === void 0 ? void 0 : _a.exceptAfterOverload) && options[0] === 'always';
+        function isOverload(node) {
+            return (node.type === experimental_utils_1.AST_NODE_TYPES.MethodDefinition &&
+                node.value.type === experimental_utils_1.AST_NODE_TYPES.TSEmptyBodyFunctionExpression);
+        }
+        return {
+            ClassBody(node) {
+                const body = exceptAfterOverload
+                    ? node.body.filter(node => !isOverload(node))
+                    : node.body;
+                rules.ClassBody(Object.assign(Object.assign({}, node), { body }));
+            },
+        };
+    },
+});
+//# sourceMappingURL=lines-between-class-members.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/lines-between-class-members.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/lines-between-class-members.js.map
new file mode 100644
index 0000000..f8300c0
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/lines-between-class-members.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lines-between-class-members.js","sourceRoot":"","sources":["../../src/rules/lines-between-class-members.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,+GAAoE;AACpE,8CAAgC;AAKhC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,mBACtB,qCAAQ,CAAC,IAAI,CAAC,MAAM,GACzB;IACE,CAAC,EAAE;QACD,mBAAmB,EAAE;YACnB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,IAAI;SACd;KACF;CACF,CACF,CAAC;AAEF,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,6BAA6B;IACnC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE;YACJ,WAAW,EAAE,yDAAyD;YACtE,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,OAAO,EAAE,YAAY;QACrB,MAAM;QACN,QAAQ,QAAE,qCAAQ,CAAC,IAAI,CAAC,QAAQ,mCAAI;YAClC,KAAK,EAAE,8CAA8C;YACrD,MAAM,EAAE,4CAA4C;SACrD;KACF;IACD,cAAc,EAAE;QACd,QAAQ;QACR;YACE,mBAAmB,EAAE,IAAI;YACzB,qBAAqB,EAAE,KAAK;SAC7B;KACF;IACD,MAAM,CAAC,OAAO,EAAE,OAAO;;QACrB,MAAM,KAAK,GAAG,qCAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,mBAAmB,GACvB,OAAA,OAAO,CAAC,CAAC,CAAC,0CAAE,mBAAmB,KAAI,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;QAE7D,SAAS,UAAU,CAAC,IAAmB;YACrC,OAAO,CACL,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,gBAAgB;gBAC7C,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,6BAA6B,CACjE,CAAC;QACJ,CAAC;QAED,OAAO;YACL,SAAS,CAAC,IAAI;gBACZ,MAAM,IAAI,GAAG,mBAAmB;oBAC9B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC7C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAEd,KAAK,CAAC,SAAS,iCAAM,IAAI,KAAE,IAAI,IAAG,CAAC;YACrC,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-delimiter-style.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-delimiter-style.js
index c9de8f9..2faac1c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-delimiter-style.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-delimiter-style.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -39,7 +51,7 @@
         docs: {
             description: 'Require a specific member delimiter style for interfaces and type literals',
             category: 'Stylistic Issues',
-            recommended: 'error',
+            recommended: false,
         },
         fixable: 'code',
         messages: {
@@ -82,7 +94,7 @@
         const sourceCode = context.getSourceCode();
         // use the base options as the defaults for the cases
         const baseOptions = options;
-        const overrides = (_a = baseOptions.overrides, (_a !== null && _a !== void 0 ? _a : {}));
+        const overrides = (_a = baseOptions.overrides) !== null && _a !== void 0 ? _a : {};
         const interfaceOptions = util.deepMerge(baseOptions, overrides.interface);
         const typeLiteralOptions = util.deepMerge(baseOptions, overrides.typeLiteral);
         /**
@@ -184,7 +196,7 @@
                 : typeLiteralOptions;
             const opts = isSingleLine ? typeOpts.singleline : typeOpts.multiline;
             members.forEach((member, index) => {
-                checkLastToken(member, (opts !== null && opts !== void 0 ? opts : {}), index === members.length - 1);
+                checkLastToken(member, opts !== null && opts !== void 0 ? opts : {}, index === members.length - 1);
             });
         }
         return {
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-delimiter-style.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-delimiter-style.js.map
index 1b06390..f48cf7b 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-delimiter-style.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-delimiter-style.js.map
@@ -1 +1 @@
-{"version":3,"file":"member-delimiter-style.js","sourceRoot":"","sources":["../../src/rules/member-delimiter-style.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"member-delimiter-style.js","sourceRoot":"","sources":["../../src/rules/member-delimiter-style.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-naming.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-naming.js
deleted file mode 100644
index 6b31f7f..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-naming.js
+++ /dev/null
@@ -1,107 +0,0 @@
-"use strict";
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const util = __importStar(require("../util"));
-exports.default = util.createRule({
-    name: 'member-naming',
-    meta: {
-        type: 'suggestion',
-        docs: {
-            description: 'Enforces naming conventions for class members by visibility',
-            category: 'Stylistic Issues',
-            recommended: false,
-        },
-        deprecated: true,
-        replacedBy: ['naming-convention'],
-        messages: {
-            incorrectName: '{{accessibility}} property {{name}} should match {{convention}}.',
-        },
-        schema: [
-            {
-                type: 'object',
-                properties: {
-                    public: {
-                        type: 'string',
-                        minLength: 1,
-                        format: 'regex',
-                    },
-                    protected: {
-                        type: 'string',
-                        minLength: 1,
-                        format: 'regex',
-                    },
-                    private: {
-                        type: 'string',
-                        minLength: 1,
-                        format: 'regex',
-                    },
-                },
-                additionalProperties: false,
-                minProperties: 1,
-            },
-        ],
-    },
-    defaultOptions: [{}],
-    create(context, [config]) {
-        const sourceCode = context.getSourceCode();
-        const conventions = Object.keys(config).reduce((acc, accessibility) => {
-            acc[accessibility] = new RegExp(config[accessibility]);
-            return acc;
-        }, {});
-        function getParameterNode(node) {
-            if (node.parameter.type === experimental_utils_1.AST_NODE_TYPES.AssignmentPattern) {
-                return node.parameter.left;
-            }
-            if (node.parameter.type === experimental_utils_1.AST_NODE_TYPES.Identifier) {
-                return node.parameter;
-            }
-            return null;
-        }
-        function validateParameterName(node) {
-            const parameterNode = getParameterNode(node);
-            if (!parameterNode) {
-                return;
-            }
-            validate(parameterNode, parameterNode.name, node.accessibility);
-        }
-        function validateName(node) {
-            if (node.type === experimental_utils_1.AST_NODE_TYPES.MethodDefinition &&
-                node.kind === 'constructor') {
-                return;
-            }
-            validate(node.key, util.getNameFromMember(node, sourceCode), node.accessibility);
-        }
-        /**
-         * Check that the name matches the convention for its accessibility.
-         * @param {ASTNode}   node the named node to evaluate.
-         * @param {string}    name
-         * @param {Modifiers} accessibility
-         * @returns {void}
-         * @private
-         */
-        function validate(node, name, accessibility = 'public') {
-            const convention = conventions[accessibility];
-            if (!convention || convention.test(name)) {
-                return;
-            }
-            context.report({
-                node,
-                messageId: 'incorrectName',
-                data: { accessibility, name, convention },
-            });
-        }
-        return {
-            TSParameterProperty: validateParameterName,
-            MethodDefinition: validateName,
-            ClassProperty: validateName,
-        };
-    },
-});
-//# sourceMappingURL=member-naming.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-naming.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-naming.js.map
deleted file mode 100644
index 8d39643..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-naming.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"member-naming.js","sourceRoot":"","sources":["../../src/rules/member-naming.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-ordering.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-ordering.js
index 8eb1f94..2dbbe7d 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-ordering.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-ordering.js
@@ -1,20 +1,120 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.defaultOrder = void 0;
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const util = __importStar(require("../util"));
-const allMemberTypes = ['field', 'method', 'constructor'].reduce((all, type) => {
+const neverConfig = {
+    type: 'string',
+    enum: ['never'],
+};
+const arrayConfig = (memberTypes) => ({
+    type: 'array',
+    items: {
+        enum: memberTypes,
+    },
+});
+const objectConfig = (memberTypes) => ({
+    type: 'object',
+    properties: {
+        memberTypes: {
+            oneOf: [arrayConfig(memberTypes), neverConfig],
+        },
+        order: {
+            type: 'string',
+            enum: ['alphabetically', 'as-written'],
+        },
+    },
+    additionalProperties: false,
+});
+exports.defaultOrder = [
+    // Index signature
+    'signature',
+    // Fields
+    'public-static-field',
+    'protected-static-field',
+    'private-static-field',
+    'public-decorated-field',
+    'protected-decorated-field',
+    'private-decorated-field',
+    'public-instance-field',
+    'protected-instance-field',
+    'private-instance-field',
+    'public-abstract-field',
+    'protected-abstract-field',
+    'private-abstract-field',
+    'public-field',
+    'protected-field',
+    'private-field',
+    'static-field',
+    'instance-field',
+    'abstract-field',
+    'decorated-field',
+    'field',
+    // Constructors
+    'public-constructor',
+    'protected-constructor',
+    'private-constructor',
+    'constructor',
+    // Methods
+    'public-static-method',
+    'protected-static-method',
+    'private-static-method',
+    'public-decorated-method',
+    'protected-decorated-method',
+    'private-decorated-method',
+    'public-instance-method',
+    'protected-instance-method',
+    'private-instance-method',
+    'public-abstract-method',
+    'protected-abstract-method',
+    'private-abstract-method',
+    'public-method',
+    'protected-method',
+    'private-method',
+    'static-method',
+    'instance-method',
+    'abstract-method',
+    'decorated-method',
+    'method',
+];
+const allMemberTypes = ['signature', 'field', 'method', 'constructor'].reduce((all, type) => {
     all.push(type);
     ['public', 'protected', 'private'].forEach(accessibility => {
-        all.push(`${accessibility}-${type}`); // e.g. `public-field`
-        if (type !== 'constructor') {
-            // There is no `static-constructor` or `instance-constructor or `abstract-constructor`
+        if (type !== 'signature') {
+            all.push(`${accessibility}-${type}`); // e.g. `public-field`
+        }
+        // Only class instance fields and methods can have decorators attached to them
+        if (type === 'field' || type === 'method') {
+            const decoratedMemberType = `${accessibility}-decorated-${type}`;
+            const decoratedMemberTypeNoAccessibility = `decorated-${type}`;
+            if (!all.includes(decoratedMemberType)) {
+                all.push(decoratedMemberType);
+            }
+            if (!all.includes(decoratedMemberTypeNoAccessibility)) {
+                all.push(decoratedMemberTypeNoAccessibility);
+            }
+        }
+        if (type !== 'constructor' && type !== 'signature') {
+            // There is no `static-constructor` or `instance-constructor` or `abstract-constructor`
             ['static', 'instance', 'abstract'].forEach(scope => {
                 if (!all.includes(`${scope}-${type}`)) {
                     all.push(`${scope}-${type}`);
@@ -25,7 +125,152 @@
     });
     return all;
 }, []);
-allMemberTypes.unshift('signature');
+const functionExpressions = [
+    experimental_utils_1.AST_NODE_TYPES.FunctionExpression,
+    experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression,
+];
+/**
+ * Gets the node type.
+ *
+ * @param node the node to be evaluated.
+ */
+function getNodeType(node) {
+    // TODO: add missing TSCallSignatureDeclaration
+    switch (node.type) {
+        case experimental_utils_1.AST_NODE_TYPES.TSAbstractMethodDefinition:
+        case experimental_utils_1.AST_NODE_TYPES.MethodDefinition:
+            return node.kind;
+        case experimental_utils_1.AST_NODE_TYPES.TSMethodSignature:
+            return 'method';
+        case experimental_utils_1.AST_NODE_TYPES.TSConstructSignatureDeclaration:
+            return 'constructor';
+        case experimental_utils_1.AST_NODE_TYPES.TSAbstractClassProperty:
+        case experimental_utils_1.AST_NODE_TYPES.ClassProperty:
+            return node.value && functionExpressions.includes(node.value.type)
+                ? 'method'
+                : 'field';
+        case experimental_utils_1.AST_NODE_TYPES.TSPropertySignature:
+            return 'field';
+        case experimental_utils_1.AST_NODE_TYPES.TSIndexSignature:
+            return 'signature';
+        default:
+            return null;
+    }
+}
+/**
+ * Gets the member name based on the member type.
+ *
+ * @param node the node to be evaluated.
+ * @param sourceCode
+ */
+function getMemberName(node, sourceCode) {
+    switch (node.type) {
+        case experimental_utils_1.AST_NODE_TYPES.TSPropertySignature:
+        case experimental_utils_1.AST_NODE_TYPES.TSMethodSignature:
+        case experimental_utils_1.AST_NODE_TYPES.TSAbstractClassProperty:
+        case experimental_utils_1.AST_NODE_TYPES.ClassProperty:
+            return util.getNameFromMember(node, sourceCode);
+        case experimental_utils_1.AST_NODE_TYPES.TSAbstractMethodDefinition:
+        case experimental_utils_1.AST_NODE_TYPES.MethodDefinition:
+            return node.kind === 'constructor'
+                ? 'constructor'
+                : util.getNameFromMember(node, sourceCode);
+        case experimental_utils_1.AST_NODE_TYPES.TSConstructSignatureDeclaration:
+            return 'new';
+        case experimental_utils_1.AST_NODE_TYPES.TSIndexSignature:
+            return util.getNameFromIndexSignature(node);
+        default:
+            return null;
+    }
+}
+/**
+ * Gets the calculated rank using the provided method definition.
+ * The algorithm is as follows:
+ * - Get the rank based on the accessibility-scope-type name, e.g. public-instance-field
+ * - If there is no order for accessibility-scope-type, then strip out the accessibility.
+ * - If there is no order for scope-type, then strip out the scope.
+ * - If there is no order for type, then return -1
+ * @param memberGroups the valid names to be validated.
+ * @param orderConfig the current order to be validated.
+ *
+ * @return Index of the matching member type in the order configuration.
+ */
+function getRankOrder(memberGroups, orderConfig) {
+    let rank = -1;
+    const stack = memberGroups.slice(); // Get a copy of the member groups
+    while (stack.length > 0 && rank === -1) {
+        rank = orderConfig.indexOf(stack.shift());
+    }
+    return rank;
+}
+/**
+ * Gets the rank of the node given the order.
+ * @param node the node to be evaluated.
+ * @param orderConfig the current order to be validated.
+ * @param supportsModifiers a flag indicating whether the type supports modifiers (scope or accessibility) or not.
+ */
+function getRank(node, orderConfig, supportsModifiers) {
+    const type = getNodeType(node);
+    if (type === null) {
+        // shouldn't happen but just in case, put it on the end
+        return orderConfig.length - 1;
+    }
+    const abstract = node.type === experimental_utils_1.AST_NODE_TYPES.TSAbstractClassProperty ||
+        node.type === experimental_utils_1.AST_NODE_TYPES.TSAbstractMethodDefinition;
+    const scope = 'static' in node && node.static
+        ? 'static'
+        : abstract
+            ? 'abstract'
+            : 'instance';
+    const accessibility = 'accessibility' in node && node.accessibility
+        ? node.accessibility
+        : 'public';
+    // Collect all existing member groups (e.g. 'public-instance-field', 'instance-field', 'public-field', 'constructor' etc.)
+    const memberGroups = [];
+    if (supportsModifiers) {
+        const decorated = 'decorators' in node && node.decorators.length > 0;
+        if (decorated && (type === 'field' || type === 'method')) {
+            memberGroups.push(`${accessibility}-decorated-${type}`);
+            memberGroups.push(`decorated-${type}`);
+        }
+        if (type !== 'constructor') {
+            // Constructors have no scope
+            memberGroups.push(`${accessibility}-${scope}-${type}`);
+            memberGroups.push(`${scope}-${type}`);
+        }
+        memberGroups.push(`${accessibility}-${type}`);
+    }
+    memberGroups.push(type);
+    return getRankOrder(memberGroups, orderConfig);
+}
+/**
+ * Gets the lowest possible rank higher than target.
+ * e.g. given the following order:
+ *   ...
+ *   public-static-method
+ *   protected-static-method
+ *   private-static-method
+ *   public-instance-method
+ *   protected-instance-method
+ *   private-instance-method
+ *   ...
+ * and considering that a public-instance-method has already been declared, so ranks contains
+ * public-instance-method, then the lowest possible rank for public-static-method is
+ * public-instance-method.
+ * @param ranks the existing ranks in the object.
+ * @param target the target rank.
+ * @param order the current order to be validated.
+ * @returns the name of the lowest possible rank without dashes (-).
+ */
+function getLowestRank(ranks, target, order) {
+    let lowest = ranks[ranks.length - 1];
+    ranks.forEach(rank => {
+        if (rank > target) {
+            lowest = Math.min(lowest, rank);
+        }
+    });
+    return order[lowest].replace(/-/g, ' ');
+}
 exports.default = util.createRule({
     name: 'member-ordering',
     meta: {
@@ -36,7 +281,8 @@
             recommended: false,
         },
         messages: {
-            incorrectOrder: 'Member {{name}} should be declared before all {{rank}} definitions.',
+            incorrectOrder: 'Member "{{member}}" should be declared before member "{{beforeMember}}".',
+            incorrectGroupOrder: 'Member {{name}} should be declared before all {{rank}} definitions.',
         },
         schema: [
             {
@@ -44,67 +290,37 @@
                 properties: {
                     default: {
                         oneOf: [
-                            {
-                                enum: ['never'],
-                            },
-                            {
-                                type: 'array',
-                                items: {
-                                    enum: allMemberTypes,
-                                },
-                            },
+                            neverConfig,
+                            arrayConfig(allMemberTypes),
+                            objectConfig(allMemberTypes),
                         ],
                     },
                     classes: {
                         oneOf: [
-                            {
-                                enum: ['never'],
-                            },
-                            {
-                                type: 'array',
-                                items: {
-                                    enum: allMemberTypes,
-                                },
-                            },
+                            neverConfig,
+                            arrayConfig(allMemberTypes),
+                            objectConfig(allMemberTypes),
                         ],
                     },
                     classExpressions: {
                         oneOf: [
-                            {
-                                enum: ['never'],
-                            },
-                            {
-                                type: 'array',
-                                items: {
-                                    enum: allMemberTypes,
-                                },
-                            },
+                            neverConfig,
+                            arrayConfig(allMemberTypes),
+                            objectConfig(allMemberTypes),
                         ],
                     },
                     interfaces: {
                         oneOf: [
-                            {
-                                enum: ['never'],
-                            },
-                            {
-                                type: 'array',
-                                items: {
-                                    enum: ['signature', 'field', 'method', 'constructor'],
-                                },
-                            },
+                            neverConfig,
+                            arrayConfig(['signature', 'field', 'method', 'constructor']),
+                            objectConfig(['signature', 'field', 'method', 'constructor']),
                         ],
                     },
                     typeLiterals: {
                         oneOf: [
-                            {
-                                enum: ['never'],
-                            },
-                            {
-                                type: 'array',
-                                items: {
-                                    enum: ['signature', 'field', 'method', 'constructor'],
-                                },
-                            },
+                            neverConfig,
+                            arrayConfig(['signature', 'field', 'method', 'constructor']),
+                            objectConfig(['signature', 'field', 'method', 'constructor']),
                         ],
                     },
                 },
@@ -114,230 +330,137 @@
     },
     defaultOptions: [
         {
-            default: [
-                'signature',
-                'public-static-field',
-                'protected-static-field',
-                'private-static-field',
-                'public-instance-field',
-                'protected-instance-field',
-                'private-instance-field',
-                'public-abstract-field',
-                'protected-abstract-field',
-                'private-abstract-field',
-                'public-field',
-                'protected-field',
-                'private-field',
-                'static-field',
-                'instance-field',
-                'abstract-field',
-                'field',
-                'constructor',
-                'public-static-method',
-                'protected-static-method',
-                'private-static-method',
-                'public-instance-method',
-                'protected-instance-method',
-                'private-instance-method',
-                'public-abstract-method',
-                'protected-abstract-method',
-                'private-abstract-method',
-                'public-method',
-                'protected-method',
-                'private-method',
-                'static-method',
-                'instance-method',
-                'abstract-method',
-                'method',
-            ],
+            default: exports.defaultOrder,
         },
     ],
     create(context, [options]) {
-        const sourceCode = context.getSourceCode();
-        const functionExpressions = [
-            experimental_utils_1.AST_NODE_TYPES.FunctionExpression,
-            experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression,
-        ];
         /**
-         * Gets the node type.
-         * @param node the node to be evaluated.
-         */
-        function getNodeType(node) {
-            // TODO: add missing TSCallSignatureDeclaration
-            switch (node.type) {
-                case experimental_utils_1.AST_NODE_TYPES.TSAbstractMethodDefinition:
-                case experimental_utils_1.AST_NODE_TYPES.MethodDefinition:
-                    return node.kind;
-                case experimental_utils_1.AST_NODE_TYPES.TSMethodSignature:
-                    return 'method';
-                case experimental_utils_1.AST_NODE_TYPES.TSConstructSignatureDeclaration:
-                    return 'constructor';
-                case experimental_utils_1.AST_NODE_TYPES.TSAbstractClassProperty:
-                case experimental_utils_1.AST_NODE_TYPES.ClassProperty:
-                    return node.value && functionExpressions.includes(node.value.type)
-                        ? 'method'
-                        : 'field';
-                case experimental_utils_1.AST_NODE_TYPES.TSPropertySignature:
-                    return 'field';
-                case experimental_utils_1.AST_NODE_TYPES.TSIndexSignature:
-                    return 'signature';
-                default:
-                    return null;
-            }
-        }
-        /**
-         * Gets the member name based on the member type.
-         * @param node the node to be evaluated.
-         */
-        function getMemberName(node) {
-            switch (node.type) {
-                case experimental_utils_1.AST_NODE_TYPES.TSPropertySignature:
-                case experimental_utils_1.AST_NODE_TYPES.TSMethodSignature:
-                case experimental_utils_1.AST_NODE_TYPES.TSAbstractClassProperty:
-                case experimental_utils_1.AST_NODE_TYPES.ClassProperty:
-                    return util.getNameFromMember(node, sourceCode);
-                case experimental_utils_1.AST_NODE_TYPES.TSAbstractMethodDefinition:
-                case experimental_utils_1.AST_NODE_TYPES.MethodDefinition:
-                    return node.kind === 'constructor'
-                        ? 'constructor'
-                        : util.getNameFromMember(node, sourceCode);
-                case experimental_utils_1.AST_NODE_TYPES.TSConstructSignatureDeclaration:
-                    return 'new';
-                case experimental_utils_1.AST_NODE_TYPES.TSIndexSignature:
-                    return util.getNameFromIndexSignature(node);
-                default:
-                    return null;
-            }
-        }
-        /**
-         * Gets the calculated rank using the provided method definition.
-         * The algorithm is as follows:
-         * - Get the rank based on the accessibility-scope-type name, e.g. public-instance-field
-         * - If there is no order for accessibility-scope-type, then strip out the accessibility.
-         * - If there is no order for scope-type, then strip out the scope.
-         * - If there is no order for type, then return -1
-         * @param memberTypes the valid names to be validated.
-         * @param order the current order to be validated.
+         * Checks if the member groups are correctly sorted.
          *
-         * @return Index of the matching member type in the order configuration.
+         * @param members Members to be validated.
+         * @param groupOrder Group order to be validated.
+         * @param supportsModifiers A flag indicating whether the type supports modifiers (scope or accessibility) or not.
+         *
+         * @return Array of member groups or null if one of the groups is not correctly sorted.
          */
-        function getRankOrder(memberTypes, order) {
-            let rank = -1;
-            const stack = memberTypes.slice(); // Get a copy of the member types
-            while (stack.length > 0 && rank === -1) {
-                rank = order.indexOf(stack.shift());
-            }
-            return rank;
-        }
-        /**
-         * Gets the rank of the node given the order.
-         * @param node the node to be evaluated.
-         * @param order the current order to be validated.
-         * @param supportsModifiers a flag indicating whether the type supports modifiers (scope or accessibility) or not.
-         */
-        function getRank(node, order, supportsModifiers) {
-            const type = getNodeType(node);
-            if (type === null) {
-                // shouldn't happen but just in case, put it on the end
-                return order.length - 1;
-            }
-            const abstract = node.type === experimental_utils_1.AST_NODE_TYPES.TSAbstractClassProperty ||
-                node.type === experimental_utils_1.AST_NODE_TYPES.TSAbstractMethodDefinition;
-            const scope = 'static' in node && node.static
-                ? 'static'
-                : abstract
-                    ? 'abstract'
-                    : 'instance';
-            const accessibility = 'accessibility' in node && node.accessibility
-                ? node.accessibility
-                : 'public';
-            const memberTypes = [];
-            if (supportsModifiers) {
-                if (type !== 'constructor') {
-                    // Constructors have no scope
-                    memberTypes.push(`${accessibility}-${scope}-${type}`);
-                    memberTypes.push(`${scope}-${type}`);
+        function checkGroupSort(members, groupOrder, supportsModifiers) {
+            const previousRanks = [];
+            const memberGroups = [];
+            let isCorrectlySorted = true;
+            // Find first member which isn't correctly sorted
+            members.forEach(member => {
+                const rank = getRank(member, groupOrder, supportsModifiers);
+                const name = getMemberName(member, context.getSourceCode());
+                const rankLastMember = previousRanks[previousRanks.length - 1];
+                if (rank === -1) {
+                    return;
                 }
-                memberTypes.push(`${accessibility}-${type}`);
-            }
-            memberTypes.push(type);
-            return getRankOrder(memberTypes, order);
-        }
-        /**
-         * Gets the lowest possible rank higher than target.
-         * e.g. given the following order:
-         *   ...
-         *   public-static-method
-         *   protected-static-method
-         *   private-static-method
-         *   public-instance-method
-         *   protected-instance-method
-         *   private-instance-method
-         *   ...
-         * and considering that a public-instance-method has already been declared, so ranks contains
-         * public-instance-method, then the lowest possible rank for public-static-method is
-         * public-instance-method.
-         * @param ranks the existing ranks in the object.
-         * @param target the target rank.
-         * @param order the current order to be validated.
-         * @returns the name of the lowest possible rank without dashes (-).
-         */
-        function getLowestRank(ranks, target, order) {
-            let lowest = ranks[ranks.length - 1];
-            ranks.forEach(rank => {
-                if (rank > target) {
-                    lowest = Math.min(lowest, rank);
+                // Works for 1st item because x < undefined === false for any x (typeof string)
+                if (rank < rankLastMember) {
+                    context.report({
+                        node: member,
+                        messageId: 'incorrectGroupOrder',
+                        data: {
+                            name,
+                            rank: getLowestRank(previousRanks, rank, groupOrder),
+                        },
+                    });
+                    isCorrectlySorted = false;
+                }
+                else if (rank === rankLastMember) {
+                    // Same member group --> Push to existing member group array
+                    memberGroups[memberGroups.length - 1].push(member);
+                }
+                else {
+                    // New member group --> Create new member group array
+                    previousRanks.push(rank);
+                    memberGroups.push([member]);
                 }
             });
-            return order[lowest].replace(/-/g, ' ');
+            return isCorrectlySorted ? memberGroups : null;
+        }
+        /**
+         * Checks if the members are alphabetically sorted.
+         *
+         * @param members Members to be validated.
+         *
+         * @return True if all members are correctly sorted.
+         */
+        function checkAlphaSort(members) {
+            let previousName = '';
+            let isCorrectlySorted = true;
+            // Find first member which isn't correctly sorted
+            members.forEach(member => {
+                const name = getMemberName(member, context.getSourceCode());
+                // Note: Not all members have names
+                if (name) {
+                    if (name < previousName) {
+                        context.report({
+                            node: member,
+                            messageId: 'incorrectOrder',
+                            data: {
+                                member: name,
+                                beforeMember: previousName,
+                            },
+                        });
+                        isCorrectlySorted = false;
+                    }
+                    previousName = name;
+                }
+            });
+            return isCorrectlySorted;
         }
         /**
          * Validates if all members are correctly sorted.
          *
          * @param members Members to be validated.
-         * @param order Current order to be validated.
+         * @param orderConfig Order config to be validated.
          * @param supportsModifiers A flag indicating whether the type supports modifiers (scope or accessibility) or not.
          */
-        function validateMembersOrder(members, order, supportsModifiers) {
-            if (members && order !== 'never') {
-                const previousRanks = [];
-                // Find first member which isn't correctly sorted
-                members.forEach(member => {
-                    const rank = getRank(member, order, supportsModifiers);
-                    if (rank !== -1) {
-                        if (rank < previousRanks[previousRanks.length - 1]) {
-                            context.report({
-                                node: member,
-                                messageId: 'incorrectOrder',
-                                data: {
-                                    name: getMemberName(member),
-                                    rank: getLowestRank(previousRanks, rank, order),
-                                },
-                            });
-                        }
-                        else {
-                            previousRanks.push(rank);
-                        }
-                    }
-                });
+        function validateMembersOrder(members, orderConfig, supportsModifiers) {
+            if (orderConfig === 'never') {
+                return;
+            }
+            // Standardize config
+            let order = null;
+            let memberTypes;
+            if (Array.isArray(orderConfig)) {
+                memberTypes = orderConfig;
+            }
+            else {
+                order = orderConfig.order;
+                memberTypes = orderConfig.memberTypes;
+            }
+            // Check order
+            if (Array.isArray(memberTypes)) {
+                const grouped = checkGroupSort(members, memberTypes, supportsModifiers);
+                if (grouped === null) {
+                    return;
+                }
+                if (order === 'alphabetically') {
+                    grouped.some(groupMember => !checkAlphaSort(groupMember));
+                }
+            }
+            else if (order === 'alphabetically') {
+                checkAlphaSort(members);
             }
         }
         return {
             ClassDeclaration(node) {
                 var _a;
-                validateMembersOrder(node.body.body, (_a = options.classes, (_a !== null && _a !== void 0 ? _a : options.default)), true);
+                validateMembersOrder(node.body.body, (_a = options.classes) !== null && _a !== void 0 ? _a : options.default, true);
             },
             ClassExpression(node) {
                 var _a;
-                validateMembersOrder(node.body.body, (_a = options.classExpressions, (_a !== null && _a !== void 0 ? _a : options.default)), true);
+                validateMembersOrder(node.body.body, (_a = options.classExpressions) !== null && _a !== void 0 ? _a : options.default, true);
             },
             TSInterfaceDeclaration(node) {
                 var _a;
-                validateMembersOrder(node.body.body, (_a = options.interfaces, (_a !== null && _a !== void 0 ? _a : options.default)), false);
+                validateMembersOrder(node.body.body, (_a = options.interfaces) !== null && _a !== void 0 ? _a : options.default, false);
             },
             TSTypeLiteral(node) {
                 var _a;
-                validateMembersOrder(node.members, (_a = options.typeLiterals, (_a !== null && _a !== void 0 ? _a : options.default)), false);
+                validateMembersOrder(node.members, (_a = options.typeLiterals) !== null && _a !== void 0 ? _a : options.default, false);
             },
         };
     },
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-ordering.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-ordering.js.map
index 27863fd..912eb4b 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-ordering.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/member-ordering.js.map
@@ -1 +1 @@
-{"version":3,"file":"member-ordering.js","sourceRoot":"","sources":["../../src/rules/member-ordering.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"member-ordering.js","sourceRoot":"","sources":["../../src/rules/member-ordering.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/method-signature-style.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/method-signature-style.js
new file mode 100644
index 0000000..f73a017
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/method-signature-style.js
@@ -0,0 +1,162 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const util = __importStar(require("../util"));
+exports.default = util.createRule({
+    name: 'method-signature-style',
+    meta: {
+        type: 'suggestion',
+        docs: {
+            description: 'Enforces using a particular method signature syntax.',
+            category: 'Best Practices',
+            recommended: false,
+        },
+        fixable: 'code',
+        messages: {
+            errorMethod: 'Shorthand method signature is forbidden. Use a function property instead.',
+            errorProperty: 'Function property signature is forbidden. Use a method shorthand instead.',
+        },
+        schema: [
+            {
+                enum: ['property', 'method'],
+            },
+        ],
+    },
+    defaultOptions: ['property'],
+    create(context, [mode]) {
+        const sourceCode = context.getSourceCode();
+        function getMethodKey(node) {
+            let key = sourceCode.getText(node.key);
+            if (node.computed) {
+                key = `[${key}]`;
+            }
+            if (node.optional) {
+                key = `${key}?`;
+            }
+            if (node.readonly) {
+                key = `readonly ${key}`;
+            }
+            return key;
+        }
+        function getMethodParams(node) {
+            let params = '()';
+            if (node.params.length > 0) {
+                const openingParen = util.nullThrows(sourceCode.getTokenBefore(node.params[0], util.isOpeningParenToken), 'Missing opening paren before first parameter');
+                const closingParen = util.nullThrows(sourceCode.getTokenAfter(node.params[node.params.length - 1], util.isClosingParenToken), 'Missing closing paren after last parameter');
+                params = sourceCode.text.substring(openingParen.range[0], closingParen.range[1]);
+            }
+            if (node.typeParameters != null) {
+                const typeParams = sourceCode.getText(node.typeParameters);
+                params = `${typeParams}${params}`;
+            }
+            return params;
+        }
+        function getMethodReturnType(node) {
+            return sourceCode.getText(node.returnType.typeAnnotation);
+        }
+        function getDelimiter(node) {
+            const lastToken = sourceCode.getLastToken(node);
+            if (lastToken &&
+                (util.isSemicolonToken(lastToken) || util.isCommaToken(lastToken))) {
+                return lastToken.value;
+            }
+            return '';
+        }
+        return {
+            TSMethodSignature(methodNode) {
+                var _a;
+                if (mode === 'method') {
+                    return;
+                }
+                const duplicatedKeyMethodNodes = ((_a = methodNode.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.TSInterfaceBody
+                    ? methodNode.parent.body.filter((element) => element.type === experimental_utils_1.AST_NODE_TYPES.TSMethodSignature &&
+                        element !== methodNode &&
+                        getMethodKey(element) === getMethodKey(methodNode))
+                    : [];
+                if (duplicatedKeyMethodNodes.length > 0) {
+                    context.report({
+                        node: methodNode,
+                        messageId: 'errorMethod',
+                        *fix(fixer) {
+                            const methodNodes = [
+                                methodNode,
+                                ...duplicatedKeyMethodNodes,
+                            ].sort((a, b) => (a.range[0] < b.range[0] ? -1 : 1));
+                            const typeString = methodNodes.reduce((str, node, idx, nodes) => {
+                                const params = getMethodParams(node);
+                                const returnType = getMethodReturnType(node);
+                                return `${str}(${params} => ${returnType})${idx !== nodes.length - 1 ? ' & ' : ''}`;
+                            }, '');
+                            const key = getMethodKey(methodNode);
+                            const delimiter = getDelimiter(methodNode);
+                            yield fixer.replaceText(methodNode, `${key}: ${typeString}${delimiter}`);
+                            for (const node of duplicatedKeyMethodNodes) {
+                                const lastToken = sourceCode.getLastToken(node);
+                                if (lastToken) {
+                                    const nextToken = sourceCode.getTokenAfter(lastToken);
+                                    if (nextToken) {
+                                        yield fixer.remove(node);
+                                        yield fixer.replaceTextRange([lastToken.range[1], nextToken.range[0]], '');
+                                    }
+                                }
+                            }
+                        },
+                    });
+                    return;
+                }
+                context.report({
+                    node: methodNode,
+                    messageId: 'errorMethod',
+                    fix: fixer => {
+                        const key = getMethodKey(methodNode);
+                        const params = getMethodParams(methodNode);
+                        const returnType = getMethodReturnType(methodNode);
+                        const delimiter = getDelimiter(methodNode);
+                        return fixer.replaceText(methodNode, `${key}: ${params} => ${returnType}${delimiter}`);
+                    },
+                });
+            },
+            TSPropertySignature(propertyNode) {
+                var _a;
+                const typeNode = (_a = propertyNode.typeAnnotation) === null || _a === void 0 ? void 0 : _a.typeAnnotation;
+                if ((typeNode === null || typeNode === void 0 ? void 0 : typeNode.type) !== experimental_utils_1.AST_NODE_TYPES.TSFunctionType) {
+                    return;
+                }
+                if (mode === 'property') {
+                    return;
+                }
+                context.report({
+                    node: propertyNode,
+                    messageId: 'errorProperty',
+                    fix: fixer => {
+                        const key = getMethodKey(propertyNode);
+                        const params = getMethodParams(typeNode);
+                        const returnType = getMethodReturnType(typeNode);
+                        const delimiter = getDelimiter(propertyNode);
+                        return fixer.replaceText(propertyNode, `${key}${params}: ${returnType}${delimiter}`);
+                    },
+                });
+            },
+        };
+    },
+});
+//# sourceMappingURL=method-signature-style.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/method-signature-style.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/method-signature-style.js.map
new file mode 100644
index 0000000..e7081d2
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/method-signature-style.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"method-signature-style.js","sourceRoot":"","sources":["../../src/rules/method-signature-style.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/naming-convention.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/naming-convention.js
index 7f2e651..e709fd7 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/naming-convention.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/naming-convention.js
@@ -1,12 +1,25 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.selectorTypeToMessageString = void 0;
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const util = __importStar(require("../util"));
 // #region Options Type Config
@@ -16,7 +29,6 @@
     PredefinedFormats[PredefinedFormats["strictCamelCase"] = 2] = "strictCamelCase";
     PredefinedFormats[PredefinedFormats["PascalCase"] = 4] = "PascalCase";
     PredefinedFormats[PredefinedFormats["StrictPascalCase"] = 8] = "StrictPascalCase";
-    // eslint-disable-next-line @typescript-eslint/camelcase
     PredefinedFormats[PredefinedFormats["snake_case"] = 16] = "snake_case";
     PredefinedFormats[PredefinedFormats["UPPER_CASE"] = 32] = "UPPER_CASE";
 })(PredefinedFormats || (PredefinedFormats = {}));
@@ -55,12 +67,13 @@
 })(MetaSelectors || (MetaSelectors = {}));
 var Modifiers;
 (function (Modifiers) {
-    Modifiers[Modifiers["readonly"] = 1] = "readonly";
-    Modifiers[Modifiers["static"] = 2] = "static";
-    Modifiers[Modifiers["public"] = 4] = "public";
-    Modifiers[Modifiers["protected"] = 8] = "protected";
-    Modifiers[Modifiers["private"] = 16] = "private";
-    Modifiers[Modifiers["abstract"] = 32] = "abstract";
+    Modifiers[Modifiers["const"] = 1] = "const";
+    Modifiers[Modifiers["readonly"] = 2] = "readonly";
+    Modifiers[Modifiers["static"] = 4] = "static";
+    Modifiers[Modifiers["public"] = 8] = "public";
+    Modifiers[Modifiers["protected"] = 16] = "protected";
+    Modifiers[Modifiers["private"] = 32] = "private";
+    Modifiers[Modifiers["abstract"] = 64] = "abstract";
 })(Modifiers || (Modifiers = {}));
 var TypeModifiers;
 (function (TypeModifiers) {
@@ -159,13 +172,59 @@
         },
     ];
 }
+function selectorsSchema() {
+    return {
+        type: 'object',
+        properties: Object.assign(Object.assign({}, FORMAT_OPTIONS_PROPERTIES), {
+            filter: {
+                oneOf: [
+                    {
+                        type: 'string',
+                        minLength: 1,
+                    },
+                    MATCH_REGEX_SCHEMA,
+                ],
+            },
+            selector: {
+                type: 'array',
+                items: {
+                    type: 'string',
+                    enum: [
+                        ...util.getEnumNames(MetaSelectors),
+                        ...util.getEnumNames(Selectors),
+                    ],
+                },
+                additionalItems: false,
+            },
+            modifiers: {
+                type: 'array',
+                items: {
+                    type: 'string',
+                    enum: util.getEnumNames(Modifiers),
+                },
+                additionalItems: false,
+            },
+            types: {
+                type: 'array',
+                items: {
+                    type: 'string',
+                    enum: util.getEnumNames(TypeModifiers),
+                },
+                additionalItems: false,
+            },
+        }),
+        required: ['selector', 'format'],
+        additionalProperties: false,
+    };
+}
 const SCHEMA = {
     type: 'array',
     items: {
         oneOf: [
+            selectorsSchema(),
             ...selectorSchema('default', false, util.getEnumNames(Modifiers)),
             ...selectorSchema('variableLike', false),
-            ...selectorSchema('variable', true),
+            ...selectorSchema('variable', true, ['const']),
             ...selectorSchema('function', false),
             ...selectorSchema('parameter', true),
             ...selectorSchema('memberLike', false, [
@@ -248,17 +307,19 @@
         },
         type: 'suggestion',
         messages: {
-            unexpectedUnderscore: '{{type}} name {{name}} must not have a {{position}} underscore.',
-            missingUnderscore: '{{type}} name {{name}} must have a {{position}} underscore',
-            missingAffix: '{{type}} name {{name}} must have one of the following {{position}}es: {{affixes}}',
-            satisfyCustom: '{{type}} name {{name}} must {{regexMatch}} the RegExp: {{regex}}',
-            doesNotMatchFormat: '{{type}} name {{name}} must match one of the following formats: {{formats}}',
+            unexpectedUnderscore: '{{type}} name `{{name}}` must not have a {{position}} underscore.',
+            missingUnderscore: '{{type}} name `{{name}}` must have a {{position}} underscore.',
+            missingAffix: '{{type}} name `{{name}}` must have one of the following {{position}}es: {{affixes}}',
+            satisfyCustom: '{{type}} name `{{name}}` must {{regexMatch}} the RegExp: {{regex}}',
+            doesNotMatchFormat: '{{type}} name `{{name}}` must match one of the following formats: {{formats}}',
+            doesNotMatchFormatTrimmed: '{{type}} name `{{name}}` trimmed as `{{processedName}}` must match one of the following formats: {{formats}}',
         },
         schema: SCHEMA,
     },
     defaultOptions: defaultCamelCaseAllTheThingsConfig,
     create(contextWithoutDefaults) {
-        const context = contextWithoutDefaults.options
+        const context = contextWithoutDefaults.options &&
+            contextWithoutDefaults.options.length > 0
             ? contextWithoutDefaults
             : // only apply the defaults when the user provides no config
                 Object.setPrototypeOf({
@@ -301,8 +362,15 @@
                 }
                 const identifiers = [];
                 getIdentifiersFromPattern(node.id, identifiers);
+                const modifiers = new Set();
+                const parent = node.parent;
+                if (parent &&
+                    parent.type === experimental_utils_1.AST_NODE_TYPES.VariableDeclaration &&
+                    parent.kind === 'const') {
+                    modifiers.add(Modifiers.const);
+                }
                 identifiers.forEach(i => {
-                    validator(i);
+                    validator(i, modifiers);
                 });
             },
             // #endregion
@@ -348,7 +416,7 @@
             },
             // #endregion parameterProperty
             // #region property
-            'Property[computed = false][kind = "init"][value.type != "ArrowFunctionExpression"][value.type != "FunctionExpression"][value.type != "TSEmptyBodyFunctionExpression"]'(node) {
+            ':not(ObjectPattern) > Property[computed = false][kind = "init"][value.type != "ArrowFunctionExpression"][value.type != "FunctionExpression"][value.type != "TSEmptyBodyFunctionExpression"]'(node) {
                 const modifiers = new Set([Modifiers.public]);
                 handleMember(validators.property, node, modifiers);
             },
@@ -502,12 +570,13 @@
     }
 }
 function parseOptions(context) {
-    const normalizedOptions = context.options.map(opt => normalizeOption(opt));
-    const parsedOptions = util.getEnumNames(Selectors).reduce((acc, k) => {
+    const normalizedOptions = context.options
+        .map(opt => normalizeOption(opt))
+        .reduce((acc, val) => acc.concat(val), []);
+    return util.getEnumNames(Selectors).reduce((acc, k) => {
         acc[k] = createValidator(k, context, normalizedOptions);
         return acc;
     }, {});
-    return parsedOptions;
 }
 function createValidator(type, context, allConfigs) {
     // make sure the "highest priority" configs are checked first
@@ -589,18 +658,19 @@
         }
     };
     // centralizes the logic for formatting the report data
-    function formatReportData({ affixes, formats, originalName, position, custom, }) {
-        var _a, _b, _c, _d, _e, _f;
+    function formatReportData({ affixes, formats, originalName, processedName, position, custom, }) {
+        var _a;
         return {
             type: selectorTypeToMessageString(type),
             name: originalName,
+            processedName,
             position,
-            affixes: (_a = affixes) === null || _a === void 0 ? void 0 : _a.join(', '),
-            formats: (_b = formats) === null || _b === void 0 ? void 0 : _b.map(f => PredefinedFormats[f]).join(', '),
-            regex: (_d = (_c = custom) === null || _c === void 0 ? void 0 : _c.regex) === null || _d === void 0 ? void 0 : _d.toString(),
-            regexMatch: ((_e = custom) === null || _e === void 0 ? void 0 : _e.match) === true
+            affixes: affixes === null || affixes === void 0 ? void 0 : affixes.join(', '),
+            formats: formats === null || formats === void 0 ? void 0 : formats.map(f => PredefinedFormats[f]).join(', '),
+            regex: (_a = custom === null || custom === void 0 ? void 0 : custom.regex) === null || _a === void 0 ? void 0 : _a.toString(),
+            regexMatch: (custom === null || custom === void 0 ? void 0 : custom.match) === true
                 ? 'match'
-                : ((_f = custom) === null || _f === void 0 ? void 0 : _f.match) === false
+                : (custom === null || custom === void 0 ? void 0 : custom.match) === false
                     ? 'not match'
                     : null,
         };
@@ -721,9 +791,12 @@
         }
         context.report({
             node,
-            messageId: 'doesNotMatchFormat',
+            messageId: originalName === name
+                ? 'doesNotMatchFormat'
+                : 'doesNotMatchFormatTrimmed',
             data: formatReportData({
                 originalName,
+                processedName: name,
                 formats,
             }),
         });
@@ -745,22 +818,18 @@
 */
 function isPascalCase(name) {
     return (name.length === 0 ||
-        // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
         (name[0] === name[0].toUpperCase() && !name.includes('_')));
 }
 function isStrictPascalCase(name) {
     return (name.length === 0 ||
-        // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
         (name[0] === name[0].toUpperCase() && hasStrictCamelHumps(name, true)));
 }
 function isCamelCase(name) {
     return (name.length === 0 ||
-        // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
         (name[0] === name[0].toLowerCase() && !name.includes('_')));
 }
 function isStrictCamelCase(name) {
     return (name.length === 0 ||
-        // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
         (name[0] === name[0].toLowerCase() && hasStrictCamelHumps(name, false)));
 }
 function hasStrictCamelHumps(name, isUpper) {
@@ -842,12 +911,12 @@
     if (option.filter) {
         weight |= 1 << 30;
     }
-    return {
+    const normalizedOption = {
         // format options
         format: option.format ? option.format.map(f => PredefinedFormats[f]) : null,
         custom: option.custom
             ? {
-                regex: new RegExp(option.custom.regex),
+                regex: new RegExp(option.custom.regex, 'u'),
                 match: option.custom.match,
             }
             : null,
@@ -859,23 +928,36 @@
             : null,
         prefix: option.prefix && option.prefix.length > 0 ? option.prefix : null,
         suffix: option.suffix && option.suffix.length > 0 ? option.suffix : null,
-        // selector options
-        selector: isMetaSelector(option.selector)
-            ? MetaSelectors[option.selector]
-            : Selectors[option.selector],
-        modifiers: (_d = (_c = option.modifiers) === null || _c === void 0 ? void 0 : _c.map(m => Modifiers[m]), (_d !== null && _d !== void 0 ? _d : null)),
-        types: (_f = (_e = option.types) === null || _e === void 0 ? void 0 : _e.map(m => TypeModifiers[m]), (_f !== null && _f !== void 0 ? _f : null)),
+        modifiers: (_d = (_c = option.modifiers) === null || _c === void 0 ? void 0 : _c.map(m => Modifiers[m])) !== null && _d !== void 0 ? _d : null,
+        types: (_f = (_e = option.types) === null || _e === void 0 ? void 0 : _e.map(m => TypeModifiers[m])) !== null && _f !== void 0 ? _f : null,
         filter: option.filter !== undefined
             ? typeof option.filter === 'string'
-                ? { regex: new RegExp(option.filter), match: true }
+                ? { regex: new RegExp(option.filter, 'u'), match: true }
                 : {
-                    regex: new RegExp(option.filter.regex),
+                    regex: new RegExp(option.filter.regex, 'u'),
                     match: option.filter.match,
                 }
             : null,
         // calculated ordering weight based on modifiers
         modifierWeight: weight,
     };
+    const selectors = Array.isArray(option.selector)
+        ? option.selector
+        : [option.selector];
+    const selectorsAllowedToHaveTypes = [
+        Selectors.variable,
+        Selectors.parameter,
+        Selectors.property,
+        Selectors.parameterProperty,
+        Selectors.accessor,
+    ];
+    const config = [];
+    selectors
+        .map(selector => isMetaSelector(selector) ? MetaSelectors[selector] : Selectors[selector])
+        .forEach(selector => selectorsAllowedToHaveTypes.includes(selector)
+        ? config.push(Object.assign({ selector: selector }, normalizedOption))
+        : config.push(Object.assign(Object.assign({ selector: selector }, normalizedOption), { types: null })));
+    return config;
 }
 function isCorrectType(node, config, context) {
     if (config.types === null) {
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/naming-convention.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/naming-convention.js.map
index 200d2ce..76ea393 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/naming-convention.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/naming-convention.js.map
@@ -1 +1 @@
-{"version":3,"file":"naming-convention.js","sourceRoot":"","sources":["../../src/rules/naming-convention.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAK+C;AAE/C,8CAAgC;AAShC,8BAA8B;AAE9B,IAAK,iBAQJ;AARD,WAAK,iBAAiB;IACpB,mEAAkB,CAAA;IAClB,+EAAwB,CAAA;IACxB,qEAAmB,CAAA;IACnB,iFAAyB,CAAA;IACzB,wDAAwD;IACxD,sEAAmB,CAAA;IACnB,sEAAmB,CAAA;AACrB,CAAC,EARI,iBAAiB,KAAjB,iBAAiB,QAQrB;AAGD,IAAK,iBAIJ;AAJD,WAAK,iBAAiB;IACpB,6DAAe,CAAA;IACf,2DAAc,CAAA;IACd,+DAAgB,CAAA;AAClB,CAAC,EAJI,iBAAiB,KAAjB,iBAAiB,QAIrB;AAGD,IAAK,SAmBJ;AAnBD,WAAK,SAAS;IACZ,eAAe;IACf,iDAAiB,CAAA;IACjB,iDAAiB,CAAA;IACjB,mDAAkB,CAAA;IAElB,aAAa;IACb,iDAAiB,CAAA;IACjB,oEAA0B,CAAA;IAC1B,8CAAe,CAAA;IACf,kDAAiB,CAAA;IACjB,uDAAmB,CAAA;IAEnB,WAAW;IACX,6CAAc,CAAA;IACd,qDAAkB,CAAA;IAClB,sDAAmB,CAAA;IACnB,4CAAc,CAAA;IACd,8DAAuB,CAAA;AACzB,CAAC,EAnBI,SAAS,KAAT,SAAS,QAmBb;AAED,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;AAE3D,IAAK,aAkBJ;AAlBD,WAAK,aAAa;IAChB,wDAAY,CAAA;IACZ,iEAGqB,CAAA;IACrB,+DAKoB,CAAA;IACpB,4DAKyB,CAAA;AAC3B,CAAC,EAlBI,aAAa,KAAb,aAAa,QAkBjB;AAID,IAAK,SAOJ;AAPD,WAAK,SAAS;IACZ,iDAAiB,CAAA;IACjB,6CAAe,CAAA;IACf,6CAAe,CAAA;IACf,mDAAkB,CAAA;IAClB,gDAAgB,CAAA;IAChB,kDAAiB,CAAA;AACnB,CAAC,EAPI,SAAS,KAAT,SAAS,QAOb;AAGD,IAAK,aAMJ;AAND,WAAK,aAAa;IAChB,0DAAiB,CAAA;IACjB,wDAAgB,CAAA;IAChB,wDAAgB,CAAA;IAChB,4DAAkB,CAAA;IAClB,uDAAe,CAAA;AACjB,CAAC,EANI,aAAa,KAAb,aAAa,QAMjB;AAqDD,iCAAiC;AAEjC,wBAAwB;AAExB,MAAM,iBAAiB,GAA2B;IAChD,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;CAC3C,CAAC;AACF,MAAM,oBAAoB,GAA2B;IACnD,IAAI,EAAE,OAAO;IACb,KAAK,EAAE;QACL,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,CAAC;KACb;IACD,eAAe,EAAE,KAAK;CACvB,CAAC;AACF,MAAM,kBAAkB,GAA2B;IACjD,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC1B;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,yBAAyB,GAAyB;IACtD,MAAM,EAAE;QACN,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC;iBAC3C;gBACD,eAAe,EAAE,KAAK;aACvB;YACD;gBACE,IAAI,EAAE,MAAM;aACb;SACF;KACF;IACD,MAAM,EAAE,kBAAkB;IAC1B,iBAAiB,EAAE,iBAAiB;IACpC,kBAAkB,EAAE,iBAAiB;IACrC,MAAM,EAAE,oBAAoB;IAC5B,MAAM,EAAE,oBAAoB;CAC7B,CAAC;AACF,SAAS,cAAc,CACrB,cAAgD,EAChD,SAAkB,EAClB,SAA6B;IAE7B,MAAM,QAAQ,GAAyB;QACrC,MAAM,EAAE;YACN,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE,CAAC;iBACb;gBACD,kBAAkB;aACnB;SACF;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,cAAc,CAAC;SACvB;KACF,CAAC;IACF,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QACrC,QAAQ,CAAC,SAAS,GAAG;YACnB,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,SAAS;aAChB;YACD,eAAe,EAAE,KAAK;SACvB,CAAC;KACH;IACD,IAAI,SAAS,EAAE;QACb,QAAQ,CAAC,KAAK,GAAG;YACf,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;aACvC;YACD,eAAe,EAAE,KAAK;SACvB,CAAC;KACH;IAED,OAAO;QACL;YACE,IAAI,EAAE,QAAQ;YACd,UAAU,kCACL,yBAAyB,GACzB,QAAQ,CACZ;YACD,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;YAChC,oBAAoB,EAAE,KAAK;SAC5B;KACF,CAAC;AACJ,CAAC;AACD,MAAM,MAAM,GAA2B;IACrC,IAAI,EAAE,OAAO;IACb,KAAK,EAAE;QACL,KAAK,EAAE;YACL,GAAG,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAEjE,GAAG,cAAc,CAAC,cAAc,EAAE,KAAK,CAAC;YACxC,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC;YACnC,GAAG,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC;YACpC,GAAG,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC;YAEpC,GAAG,cAAc,CAAC,YAAY,EAAE,KAAK,EAAE;gBACrC,SAAS;gBACT,WAAW;gBACX,QAAQ;gBACR,QAAQ;gBACR,UAAU;gBACV,UAAU;aACX,CAAC;YACF,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE;gBAClC,SAAS;gBACT,WAAW;gBACX,QAAQ;gBACR,QAAQ;gBACR,UAAU;gBACV,UAAU;aACX,CAAC;YACF,GAAG,cAAc,CAAC,mBAAmB,EAAE,IAAI,EAAE;gBAC3C,SAAS;gBACT,WAAW;gBACX,QAAQ;gBACR,UAAU;aACX,CAAC;YACF,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE;gBACjC,SAAS;gBACT,WAAW;gBACX,QAAQ;gBACR,QAAQ;gBACR,UAAU;aACX,CAAC;YACF,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE;gBAClC,SAAS;gBACT,WAAW;gBACX,QAAQ;gBACR,QAAQ;gBACR,UAAU;aACX,CAAC;YACF,GAAG,cAAc,CAAC,YAAY,EAAE,KAAK,CAAC;YAEtC,GAAG,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC;YAClD,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC;YAC/C,GAAG,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC;YACrC,GAAG,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC;YACrC,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC;YAChC,GAAG,cAAc,CAAC,eAAe,EAAE,KAAK,CAAC;SAC1C;KACF;IACD,eAAe,EAAE,KAAK;CACvB,CAAC;AAEF,2BAA2B;AAE3B,qDAAqD;AACrD,sHAAsH;AACtH,MAAM,kCAAkC,GAAY;IAClD;QACE,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,CAAC,WAAW,CAAC;QACrB,iBAAiB,EAAE,OAAO;QAC1B,kBAAkB,EAAE,OAAO;KAC5B;IAED;QACE,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;QACnC,iBAAiB,EAAE,OAAO;QAC1B,kBAAkB,EAAE,OAAO;KAC5B;IAED;QACE,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,CAAC,YAAY,CAAC;KACvB;CACF,CAAC;AAEF,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,QAAQ,EAAE,WAAW;YACrB,WAAW,EACT,8DAA8D;YAChE,WAAW,EAAE,KAAK;YAClB,4EAA4E;YAC5E,oBAAoB,EAAE,IAAI;SAC3B;QACD,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR,oBAAoB,EAClB,iEAAiE;YACnE,iBAAiB,EACf,4DAA4D;YAC9D,YAAY,EACV,mFAAmF;YACrF,aAAa,EACX,kEAAkE;YACpE,kBAAkB,EAChB,6EAA6E;SAChF;QACD,MAAM,EAAE,MAAM;KACf;IACD,cAAc,EAAE,kCAAkC;IAClD,MAAM,CAAC,sBAAsB;QAC3B,MAAM,OAAO,GAAY,sBAAsB,CAAC,OAAO;YACrD,CAAC,CAAC,sBAAsB;YACxB,CAAC,CAAC,2DAA2D;gBAC3D,MAAM,CAAC,cAAc,CACnB;oBACE,OAAO,EAAE,kCAAkC;iBAC5C,EACD,sBAAsB,CACvB,CAAC;QAEN,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAEzC,SAAS,YAAY,CACnB,SAAmC,EACnC,IAO6C,EAC7C,SAAyB;YAEzB,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO;aACR;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5B,CAAC;QAED,SAAS,kBAAkB,CACzB,IAKgC;YAEhC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAa,CAAC;YACvC,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;aAC9C;iBAAM;gBACL,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;aACjC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;aACjC;YACD,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACvC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;aACnC;YACD,IACE,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,uBAAuB;gBACpD,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,0BAA0B,EACvD;gBACA,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;aACnC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO;YACL,mBAAmB;YAEnB,kBAAkB,CAAC,IAAiC;gBAClD,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC;gBACtC,IAAI,CAAC,SAAS,EAAE;oBACd,OAAO;iBACR;gBAED,MAAM,WAAW,GAA0B,EAAE,CAAC;gBAC9C,yBAAyB,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBAEhD,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBACtB,SAAS,CAAC,CAAC,CAAC,CAAC;gBACf,CAAC,CAAC,CAAC;YACL,CAAC;YAED,aAAa;YAEb,mBAAmB;YAEnB,4DAA4D,CAC1D,IAG+B;gBAE/B,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC;gBACtC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE;oBAClC,OAAO;iBACR;gBAED,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC;YAED,sBAAsB;YAEtB,oBAAoB;YAEpB,qFAAqF,CACnF,IAGoC;gBAEpC,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;gBACvC,IAAI,CAAC,SAAS,EAAE;oBACd,OAAO;iBACR;gBAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,mBAAmB,EAAE;wBACrD,OAAO;qBACR;oBAED,MAAM,WAAW,GAA0B,EAAE,CAAC;oBAC9C,yBAAyB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;oBAE9C,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;wBACtB,SAAS,CAAC,CAAC,CAAC,CAAC;oBACf,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;YAED,uBAAuB;YAEvB,4BAA4B;YAE5B,mBAAmB,CAAC,IAAI;gBACtB,MAAM,SAAS,GAAG,UAAU,CAAC,iBAAiB,CAAC;gBAC/C,IAAI,CAAC,SAAS,EAAE;oBACd,OAAO;iBACR;gBAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAE3C,MAAM,WAAW,GAA0B,EAAE,CAAC;gBAC9C,yBAAyB,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBAEvD,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBACtB,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBAC1B,CAAC,CAAC,CAAC;YACL,CAAC;YAED,+BAA+B;YAE/B,mBAAmB;YAEnB,uKAAuK,CACrK,IAAsC;gBAEtC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBACzD,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YACrD,CAAC;YAED,gMAAgM,CAC9L,IAEmD;gBAEnD,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAC3C,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YACrD,CAAC;YAED,uCAAuC,CACrC,IAAiD;gBAEjD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBACzD,IAAI,IAAI,CAAC,QAAQ,EAAE;oBACjB,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;iBACnC;gBAED,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YACrD,CAAC;YAED,sBAAsB;YAEtB,iBAAiB;YAEjB,CAAC;gBACC,mFAAmF;gBACnF,8EAA8E;gBAC9E,yFAAyF;gBACzF,qCAAqC;aACtC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACX,IAE6C;gBAE7C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBACzD,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YACnD,CAAC;YAED,CAAC;gBACC,4GAA4G;gBAC5G,uGAAuG;gBACvG,kHAAkH;gBAClH,2FAA2F;aAC5F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACX,IAIsD;gBAEtD,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAC3C,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YACnD,CAAC;YAED,oBAAoB;YAEpB,mBAAmB;YAEnB,oEAAoE,CAClE,IAAsC;gBAEtC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBACzD,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YACrD,CAAC;YAED,4EAA4E,CAC1E,IAA8C;gBAE9C,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAC3C,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YACrD,CAAC;YAED,sBAAsB;YAEtB,qBAAqB;YAErB,uDAAuD;YACvD,gCAAgC,CAC9B,IAA0C;gBAE1C,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC;gBACxC,IAAI,CAAC,SAAS,EAAE;oBACd,OAAO;iBACR;gBAED,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;gBACnB,SAAS,CAAC,EAAE,CAAC,CAAC;YAChB,CAAC;YAED,wBAAwB;YAExB,gBAAgB;YAEhB,mCAAmC,CACjC,IAA0D;gBAE1D,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC;gBACnC,IAAI,CAAC,SAAS,EAAE;oBACd,OAAO;iBACR;gBAED,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAI,EAAE,KAAK,IAAI,EAAE;oBACf,OAAO;iBACR;gBAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAa,CAAC;gBACvC,IAAI,IAAI,CAAC,QAAQ,EAAE;oBACjB,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;iBACnC;gBAED,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YAC3B,CAAC;YAED,mBAAmB;YAEnB,oBAAoB;YAEpB,sBAAsB,CAAC,IAAI;gBACzB,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;gBACvC,IAAI,CAAC,SAAS,EAAE;oBACd,OAAO;iBACR;gBAED,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC;YAED,uBAAuB;YAEvB,oBAAoB;YAEpB,sBAAsB,CAAC,IAAI;gBACzB,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;gBACvC,IAAI,CAAC,SAAS,EAAE;oBACd,OAAO;iBACR;gBAED,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC;YAED,uBAAuB;YAEvB,eAAe;YAEf,iBAAiB,CAAC,IAAI;gBACpB,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC;gBAClC,IAAI,CAAC,SAAS,EAAE;oBACd,OAAO;iBACR;gBAED,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC;YAED,kBAAkB;YAElB,wBAAwB;YAExB,8CAA8C,CAC5C,IAA8B;gBAE9B,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC;gBAC3C,IAAI,CAAC,SAAS,EAAE;oBACd,OAAO;iBACR;gBAED,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;SAGF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,yBAAyB,CAChC,OAAsC,EACtC,WAAkC;IAElC,QAAQ,OAAO,CAAC,IAAI,EAAE;QACpB,KAAK,mCAAc,CAAC,UAAU;YAC5B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,MAAM;QAER,KAAK,mCAAc,CAAC,YAAY;YAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBACjC,IAAI,OAAO,KAAK,IAAI,EAAE;oBACpB,yBAAyB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;iBACjD;YACH,CAAC,CAAC,CAAC;YACH,MAAM;QAER,KAAK,mCAAc,CAAC,aAAa;YAC/B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACpC,IAAI,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,WAAW,EAAE;oBAChD,yBAAyB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;iBAClD;qBAAM;oBACL,4EAA4E;oBAC5E,mEAAmE;oBACnE,qGAAqG;oBACrG,4EAA4E;oBAC5E,yBAAyB,CACvB,QAAQ,CAAC,KAAsC,EAC/C,WAAW,CACZ,CAAC;iBACH;YACH,CAAC,CAAC,CAAC;YACH,MAAM;QAER,KAAK,mCAAc,CAAC,WAAW;YAC7B,yBAAyB,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACzD,MAAM;QAER,KAAK,mCAAc,CAAC,iBAAiB;YACnC,yBAAyB,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACrD,MAAM;QAER,KAAK,mCAAc,CAAC,gBAAgB;YAClC,uEAAuE;YACvE,MAAM;QAER;YACE,qEAAqE;YACrE,4EAA4E;YAC5E,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;KAC/D;AACH,CAAC;AAQD,SAAS,YAAY,CAAC,OAAgB;IACpC,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3E,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACnE,GAAG,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAmB,CAAC,CAAC;IAExB,OAAO,aAAa,CAAC;AACvB,CAAC;AACD,SAAS,eAAe,CACtB,IAAqB,EACrB,OAAgB,EAChB,UAAgC;IAEhC,6DAA6D;IAC7D,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,UAAU;QACxB,yCAAyC;SACxC,MAAM,CACL,CAAC,CAAC,EAAE,CACF,CAAC,CAAC,CAAC,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC;QACjC,CAAC,CAAC,QAAQ,KAAK,aAAa,CAAC,OAAO,CACvC;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE;YAC7B,8DAA8D;YAC9D,4DAA4D;YAC5D,OAAO,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;SAC5C;QAED;;;;;UAKE;QACF,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC1C,CAAC,CAAC,CAAC,CAAC,QAAQ;YACZ,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,cAAc,CAAC;QACjC,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC1C,CAAC,CAAC,CAAC,CAAC,QAAQ;YACZ,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,cAAc,CAAC;QAEjC,6DAA6D;QAC7D,OAAO,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEL,OAAO,CACL,IAA4C,EAC5C,YAA4B,IAAI,GAAG,EAAa,EAC1C,EAAE;;QACR,MAAM,YAAY,GAChB,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAExE,uDAAuD;QACvD,+EAA+E;QAC/E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,IAAI,OAAA,MAAM,CAAC,MAAM,0CAAE,KAAK,CAAC,IAAI,CAAC,YAAY,cAAM,MAAM,CAAC,MAAM,0CAAE,KAAK,CAAA,EAAE;gBACpE,iCAAiC;gBACjC,SAAS;aACV;YAED,UAAI,MAAM,CAAC,SAAS,0CAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG;gBAChE,uCAAuC;gBACvC,SAAS;aACV;YAED,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;gBACzC,0BAA0B;gBAC1B,SAAS;aACV;YAED,IAAI,IAAI,GAAkB,YAAY,CAAC;YAEvC,IAAI,GAAG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YACvE,IAAI,IAAI,KAAK,IAAI,EAAE;gBACjB,OAAO;gBACP,OAAO;aACR;YAED,IAAI,GAAG,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YACxE,IAAI,IAAI,KAAK,IAAI,EAAE;gBACjB,OAAO;gBACP,OAAO;aACR;YAED,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YACjE,IAAI,IAAI,KAAK,IAAI,EAAE;gBACjB,OAAO;gBACP,OAAO;aACR;YAED,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YACjE,IAAI,IAAI,KAAK,IAAI,EAAE;gBACjB,OAAO;gBACP,OAAO;aACR;YAED,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE;gBACrD,OAAO;gBACP,OAAO;aACR;YAED,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE;gBAC/D,OAAO;gBACP,OAAO;aACR;YAED,yEAAyE;YACzE,OAAO;SACR;IACH,CAAC,CAAC;IAEF,uDAAuD;IACvD,SAAS,gBAAgB,CAAC,EACxB,OAAO,EACP,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,MAAM,GAOP;;QACC,OAAO;YACL,IAAI,EAAE,2BAA2B,CAAC,IAAI,CAAC;YACvC,IAAI,EAAE,YAAY;YAClB,QAAQ;YACR,OAAO,QAAE,OAAO,0CAAE,IAAI,CAAC,IAAI,CAAC;YAC5B,OAAO,QAAE,OAAO,0CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;YAC3D,KAAK,cAAE,MAAM,0CAAE,KAAK,0CAAE,QAAQ,EAAE;YAChC,UAAU,EACR,OAAA,MAAM,0CAAE,KAAK,MAAK,IAAI;gBACpB,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,OAAA,MAAM,0CAAE,KAAK,MAAK,KAAK;oBACzB,CAAC,CAAC,WAAW;oBACb,CAAC,CAAC,IAAI;SACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,SAAS,kBAAkB,CACzB,QAAgC,EAChC,MAA0B,EAC1B,IAAY,EACZ,IAA4C,EAC5C,YAAoB;QAEpB,MAAM,MAAM,GACV,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,MAAM,CAAC,iBAAiB;YAC1B,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC;QAChC,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,IAAI,CAAC;SACb;QAED,MAAM,aAAa,GACjB,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrE,MAAM,cAAc,GAClB,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,GAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7B,CAAC,CAAC,GAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEtC,QAAQ,MAAM,EAAE;YACd,KAAK,iBAAiB,CAAC,KAAK;gBAC1B,wDAAwD;gBACxD,MAAM;YAER,KAAK,iBAAiB,CAAC,MAAM;gBAC3B,IAAI,aAAa,EAAE;oBACjB,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,sBAAsB;wBACjC,IAAI,EAAE,gBAAgB,CAAC;4BACrB,YAAY;4BACZ,QAAQ;yBACT,CAAC;qBACH,CAAC,CAAC;oBACH,OAAO,IAAI,CAAC;iBACb;gBACD,MAAM;YAER,KAAK,iBAAiB,CAAC,OAAO;gBAC5B,IAAI,CAAC,aAAa,EAAE;oBAClB,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,mBAAmB;wBAC9B,IAAI,EAAE,gBAAgB,CAAC;4BACrB,YAAY;4BACZ,QAAQ;yBACT,CAAC;qBACH,CAAC,CAAC;oBACH,OAAO,IAAI,CAAC;iBACb;SACJ;QAED,OAAO,aAAa,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,SAAS,aAAa,CACpB,QAA6B,EAC7B,MAA0B,EAC1B,IAAY,EACZ,IAA4C,EAC5C,YAAoB;QAEpB,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACpC,OAAO,IAAI,CAAC;SACb;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;YAC3B,MAAM,QAAQ,GACZ,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,SAAS,GACb,QAAQ,KAAK,QAAQ;gBACnB,CAAC,CAAC,GAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;gBACxC,CAAC,CAAC,GAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEjD,IAAI,QAAQ,EAAE;gBACZ,iCAAiC;gBACjC,OAAO,SAAS,EAAE,CAAC;aACpB;SACF;QAED,OAAO,CAAC,MAAM,CAAC;YACb,IAAI;YACJ,SAAS,EAAE,cAAc;YACzB,IAAI,EAAE,gBAAgB,CAAC;gBACrB,YAAY;gBACZ,QAAQ;gBACR,OAAO;aACR,CAAC;SACH,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,SAAS,cAAc,CACrB,MAA0B,EAC1B,IAAY,EACZ,IAA4C,EAC5C,YAAoB;QAEpB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,IAAI,CAAC;SACb;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,EAAE;YAC1B,OAAO,IAAI,CAAC;SACb;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE;YAC5B,OAAO,IAAI,CAAC;SACb;QAED,OAAO,CAAC,MAAM,CAAC;YACb,IAAI;YACJ,SAAS,EAAE,eAAe;YAC1B,IAAI,EAAE,gBAAgB,CAAC;gBACrB,YAAY;gBACZ,MAAM;aACP,CAAC;SACH,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,SAAS,wBAAwB,CAC/B,MAA0B,EAC1B,IAAY,EACZ,IAA4C,EAC5C,YAAoB;QAEpB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5C,OAAO,IAAI,CAAC;SACb;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,MAAM,OAAO,GAAG,+BAA+B,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE;gBACjB,OAAO,IAAI,CAAC;aACb;SACF;QAED,OAAO,CAAC,MAAM,CAAC;YACb,IAAI;YACJ,SAAS,EAAE,oBAAoB;YAC/B,IAAI,EAAE,gBAAgB,CAAC;gBACrB,YAAY;gBACZ,OAAO;aACR,CAAC;SACH,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,sCAAsC;AAEtC;;;;;;EAME;AAEF;;;;EAIE;AAEF,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,CACL,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,6EAA6E;QAC7E,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAC3D,CAAC;AACJ,CAAC;AACD,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,CACL,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,6EAA6E;QAC7E,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CACvE,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,CACL,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,6EAA6E;QAC7E,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAC3D,CAAC;AACJ,CAAC;AACD,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,CACL,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,6EAA6E;QAC7E,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CACxE,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY,EAAE,OAAgB;IACzD,SAAS,eAAe,CAAC,IAAY;QACnC,OAAO,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;IACpE,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;QACxB,OAAO,KAAK,CAAC;KACd;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACpC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;YACnB,OAAO,KAAK,CAAC;SACd;QACD,IAAI,OAAO,KAAK,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;YACxC,IAAI,OAAO,EAAE;gBACX,OAAO,KAAK,CAAC;aACd;SACF;aAAM;YACL,OAAO,GAAG,CAAC,OAAO,CAAC;SACpB;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,CACL,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,CACL,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED,0DAA0D;AAC1D,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;QACxB,OAAO,KAAK,CAAC;KACd;IACD,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACpC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;YACnB,IAAI,aAAa,EAAE;gBACjB,OAAO,KAAK,CAAC;aACd;YACD,aAAa,GAAG,IAAI,CAAC;SACtB;aAAM;YACL,aAAa,GAAG,KAAK,CAAC;SACvB;KACF;IACD,OAAO,CAAC,aAAa,CAAC;AACxB,CAAC;AAED,MAAM,+BAA+B,GAGhC;IACH,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,YAAY;IAC5C,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,kBAAkB;IACxD,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,WAAW;IAC1C,CAAC,iBAAiB,CAAC,eAAe,CAAC,EAAE,iBAAiB;IACtD,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,WAAW;IAC3C,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,WAAW;CAC5C,CAAC;AAEF,yCAAyC;AAEzC,SAAS,2BAA2B,CAAC,YAA6B;IAChE,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC7D,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAsIC,kEAA2B;AApI7B,SAAS,cAAc,CACrB,QAAsE;IAEtE,OAAO,QAAQ,IAAI,aAAa,CAAC;AACnC,CAAC;AACD,SAAS,eAAe,CAAC,MAAgB;;IACvC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAA,MAAM,CAAC,SAAS,0CAAE,OAAO,CAAC,GAAG,CAAC,EAAE;QAC9B,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,EAAE;IACH,MAAA,MAAM,CAAC,KAAK,0CAAE,OAAO,CAAC,GAAG,CAAC,EAAE;QAC1B,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC,EAAE;IAEH,sDAAsD;IACtD,IAAI,MAAM,CAAC,MAAM,EAAE;QACjB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;KACnB;IAED,OAAO;QACL,iBAAiB;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAC3E,MAAM,EAAE,MAAM,CAAC,MAAM;YACnB,CAAC,CAAC;gBACE,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;gBACtC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;aAC3B;YACH,CAAC,CAAC,IAAI;QACR,iBAAiB,EACf,MAAM,CAAC,iBAAiB,KAAK,SAAS;YACpC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC7C,CAAC,CAAC,IAAI;QACV,kBAAkB,EAChB,MAAM,CAAC,kBAAkB,KAAK,SAAS;YACrC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC9C,CAAC,CAAC,IAAI;QACV,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QACxE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QACxE,mBAAmB;QACnB,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;YACvC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC;YAChC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC9B,SAAS,cAAE,MAAM,CAAC,SAAS,0CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,wCAAK,IAAI,EAAA;QAC3D,KAAK,cAAE,MAAM,CAAC,KAAK,0CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,wCAAK,IAAI,EAAA;QACvD,MAAM,EACJ,MAAM,CAAC,MAAM,KAAK,SAAS;YACzB,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;gBACjC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;gBACnD,CAAC,CAAC;oBACE,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;oBACtC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;iBAC3B;YACL,CAAC,CAAC,IAAI;QACV,gDAAgD;QAChD,cAAc,EAAE,MAAM;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,IAAmB,EACnB,MAA0B,EAC1B,OAAgB;IAEhB,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;QACzB,OAAO,IAAI,CAAC;KACb;IAED,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,OAAO;SACjB,iBAAiB,CAAC,MAAM,CAAC;QAC1B,0EAA0E;SACzE,kBAAkB,EAAE,CAAC;IAExB,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE;QACtC,QAAQ,WAAW,EAAE;YACnB,KAAK,aAAa,CAAC,KAAK;gBACtB,IACE,eAAe,CACb,IAAI,EACJ,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CACtD,EACD;oBACA,OAAO,IAAI,CAAC;iBACb;gBACD,MAAM;YAER,KAAK,aAAa,CAAC,QAAQ;gBACzB,IAAI,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;oBAChE,OAAO,IAAI,CAAC;iBACb;gBACD,MAAM;YAER,KAAK,aAAa,CAAC,OAAO,CAAC;YAC3B,KAAK,aAAa,CAAC,MAAM,CAAC;YAC1B,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC;gBACzB,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY;gBACrC,+EAA+E;gBAC/E,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAC/D,CAAC;gBACF,MAAM,iBAAiB,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;gBACrD,IAAI,UAAU,KAAK,iBAAiB,EAAE;oBACpC,OAAO,IAAI,CAAC;iBACb;gBACD,MAAM;aACP;SACF;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,IAAa,EACb,EAA8B;IAE9B,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KACrC;IAED,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC"}
\ No newline at end of file
+{"version":3,"file":"naming-convention.js","sourceRoot":"","sources":["../../src/rules/naming-convention.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-array-constructor.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-array-constructor.js
index 861a4c4..806672e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-array-constructor.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-array-constructor.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -36,7 +48,7 @@
                 node.callee.type === experimental_utils_1.AST_NODE_TYPES.Identifier &&
                 node.callee.name === 'Array' &&
                 !node.typeParameters &&
-                !util.isOptionalOptionalChain(node)) {
+                !util.isOptionalCallExpression(node)) {
                 context.report({
                     node,
                     messageId: 'useLiteral',
@@ -53,7 +65,6 @@
         }
         return {
             CallExpression: check,
-            OptionalCallExpression: check,
             NewExpression: check,
         };
     },
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-array-constructor.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-array-constructor.js.map
index 7f4596e..db44e48 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-array-constructor.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-array-constructor.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-array-constructor.js","sourceRoot":"","sources":["../../src/rules/no-array-constructor.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,uCAAuC;YACpD,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,OAAO;YACpB,eAAe,EAAE,IAAI;SACtB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,UAAU,EAAE,8CAA8C;SAC3D;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ;;;WAGG;QACH,SAAS,KAAK,CACZ,IAG0B;YAE1B,IACE,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;gBAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;gBAC5B,CAAC,IAAI,CAAC,cAAc;gBACpB,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,EACnC;gBACA,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,YAAY;oBACvB,GAAG,CAAC,KAAK;wBACP,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;4BAC/B,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;yBACtC;wBACD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBACvD,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAE5D,OAAO,KAAK,CAAC,WAAW,CACtB,IAAI,EACJ,IAAI,QAAQ,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAC9C,CAAC;oBACJ,CAAC;iBACF,CAAC,CAAC;aACJ;QACH,CAAC;QAED,OAAO;YACL,cAAc,EAAE,KAAK;YACrB,sBAAsB,EAAE,KAAK;YAC7B,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-array-constructor.js","sourceRoot":"","sources":["../../src/rules/no-array-constructor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,uCAAuC;YACpD,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,OAAO;YACpB,eAAe,EAAE,IAAI;SACtB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,UAAU,EAAE,8CAA8C;SAC3D;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ;;;WAGG;QACH,SAAS,KAAK,CACZ,IAAsD;YAEtD,IACE,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;gBAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;gBAC5B,CAAC,IAAI,CAAC,cAAc;gBACpB,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,EACpC;gBACA,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,YAAY;oBACvB,GAAG,CAAC,KAAK;wBACP,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;4BAC/B,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;yBACtC;wBACD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBACvD,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAE5D,OAAO,KAAK,CAAC,WAAW,CACtB,IAAI,EACJ,IAAI,QAAQ,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAC9C,CAAC;oBACJ,CAAC;iBACF,CAAC,CAAC;aACJ;QACH,CAAC;QAED,OAAO;YACL,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-base-to-string.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-base-to-string.js
index c2f33cc..b3b994b 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-base-to-string.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-base-to-string.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -26,20 +38,39 @@
             requiresTypeChecking: true,
         },
         messages: {
-            baseToString: "'{{name}} {{certainty}} evaluate to '[Object object]' when stringified.",
+            baseToString: "'{{name}} {{certainty}} evaluate to '[object Object]' when stringified.",
         },
-        schema: [],
+        schema: [
+            {
+                type: 'object',
+                properties: {
+                    ignoredTypeNames: {
+                        type: 'array',
+                        items: {
+                            type: 'string',
+                        },
+                    },
+                },
+                additionalProperties: false,
+            },
+        ],
         type: 'suggestion',
     },
-    defaultOptions: [],
-    create(context) {
+    defaultOptions: [
+        {
+            ignoredTypeNames: ['RegExp'],
+        },
+    ],
+    create(context, [option]) {
+        var _a;
         const parserServices = util.getParserServices(context);
         const typeChecker = parserServices.program.getTypeChecker();
+        const ignoredTypeNames = (_a = option.ignoredTypeNames) !== null && _a !== void 0 ? _a : [];
         function checkExpression(node, type) {
             if (node.type === experimental_utils_1.AST_NODE_TYPES.Literal) {
                 return;
             }
-            const certainty = collectToStringCertainty((type !== null && type !== void 0 ? type : typeChecker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(node))));
+            const certainty = collectToStringCertainty(type !== null && type !== void 0 ? type : typeChecker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(node)));
             if (certainty === Usefulness.Always) {
                 return;
             }
@@ -54,19 +85,49 @@
         }
         function collectToStringCertainty(type) {
             const toString = typeChecker.getPropertyOfType(type, 'toString');
-            if (toString === undefined || toString.declarations.length === 0) {
+            const declarations = toString === null || toString === void 0 ? void 0 : toString.getDeclarations();
+            if (!toString || !declarations || declarations.length === 0) {
                 return Usefulness.Always;
             }
-            if (toString.declarations.every(({ parent }) => !ts.isInterfaceDeclaration(parent) || parent.name.text !== 'Object')) {
+            // Patch for old version TypeScript, the Boolean type definition missing toString()
+            if (type.flags & ts.TypeFlags.Boolean ||
+                type.flags & ts.TypeFlags.BooleanLiteral) {
                 return Usefulness.Always;
             }
+            if (ignoredTypeNames.includes(util.getTypeName(typeChecker, type))) {
+                return Usefulness.Always;
+            }
+            if (declarations.every(({ parent }) => !ts.isInterfaceDeclaration(parent) || parent.name.text !== 'Object')) {
+                return Usefulness.Always;
+            }
+            if (type.isIntersection()) {
+                for (const subType of type.types) {
+                    const subtypeUsefulness = collectToStringCertainty(subType);
+                    if (subtypeUsefulness === Usefulness.Always) {
+                        return Usefulness.Always;
+                    }
+                }
+                return Usefulness.Never;
+            }
             if (!type.isUnion()) {
                 return Usefulness.Never;
             }
+            let allSubtypesUseful = true;
+            let someSubtypeUseful = false;
             for (const subType of type.types) {
-                if (collectToStringCertainty(subType) !== Usefulness.Never) {
-                    return Usefulness.Sometimes;
+                const subtypeUsefulness = collectToStringCertainty(subType);
+                if (subtypeUsefulness !== Usefulness.Always && allSubtypesUseful) {
+                    allSubtypesUseful = false;
                 }
+                if (subtypeUsefulness !== Usefulness.Never && !someSubtypeUseful) {
+                    someSubtypeUseful = true;
+                }
+            }
+            if (allSubtypesUseful && someSubtypeUseful) {
+                return Usefulness.Always;
+            }
+            if (someSubtypeUseful) {
+                return Usefulness.Sometimes;
             }
             return Usefulness.Never;
         }
@@ -86,6 +147,10 @@
                 checkExpression(memberExpr.object);
             },
             TemplateLiteral(node) {
+                if (node.parent &&
+                    node.parent.type === experimental_utils_1.AST_NODE_TYPES.TaggedTemplateExpression) {
+                    return;
+                }
                 for (const expression of node.expressions) {
                     checkExpression(expression);
                 }
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-base-to-string.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-base-to-string.js.map
index 48f5468..378fe4c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-base-to-string.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-base-to-string.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-base-to-string.js","sourceRoot":"","sources":["../../src/rules/no-base-to-string.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-base-to-string.js","sourceRoot":"","sources":["../../src/rules/no-base-to-string.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-confusing-non-null-assertion.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-confusing-non-null-assertion.js
new file mode 100644
index 0000000..9369dc9
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-confusing-non-null-assertion.js
@@ -0,0 +1,97 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const util = __importStar(require("../util"));
+exports.default = util.createRule({
+    name: 'no-confusing-non-null-assertion',
+    meta: {
+        type: 'problem',
+        docs: {
+            description: 'Disallow non-null assertion in locations that may be confusing',
+            category: 'Stylistic Issues',
+            recommended: false,
+        },
+        fixable: 'code',
+        messages: {
+            confusingEqual: 'Confusing combinations of non-null assertion and equal test like "a! == b", which looks very similar to not equal "a !== b"',
+            confusingAssign: 'Confusing combinations of non-null assertion and equal test like "a! = b", which looks very similar to not equal "a != b"',
+            notNeedInEqualTest: 'Unnecessary non-null assertion (!) in equal test',
+            notNeedInAssign: 'Unnecessary non-null assertion (!) in assignment left hand',
+            wrapUpLeft: 'Wrap up left hand to avoid putting non-null assertion "!" and "=" together',
+        },
+        schema: [],
+    },
+    defaultOptions: [],
+    create(context) {
+        const sourceCode = context.getSourceCode();
+        return {
+            'BinaryExpression, AssignmentExpression'(node) {
+                function isLeftHandPrimaryExpression(node) {
+                    return node.type === experimental_utils_1.AST_NODE_TYPES.TSNonNullExpression;
+                }
+                if (node.operator === '==' ||
+                    node.operator === '===' ||
+                    node.operator === '=') {
+                    const isAssign = node.operator === '=';
+                    const leftHandFinalToken = sourceCode.getLastToken(node.left);
+                    const tokenAfterLeft = sourceCode.getTokenAfter(node.left);
+                    if ((leftHandFinalToken === null || leftHandFinalToken === void 0 ? void 0 : leftHandFinalToken.type) === experimental_utils_1.AST_TOKEN_TYPES.Punctuator &&
+                        (leftHandFinalToken === null || leftHandFinalToken === void 0 ? void 0 : leftHandFinalToken.value) === '!' &&
+                        (tokenAfterLeft === null || tokenAfterLeft === void 0 ? void 0 : tokenAfterLeft.value) !== ')') {
+                        if (isLeftHandPrimaryExpression(node.left)) {
+                            context.report({
+                                node,
+                                messageId: isAssign ? 'confusingAssign' : 'confusingEqual',
+                                suggest: [
+                                    {
+                                        messageId: isAssign
+                                            ? 'notNeedInAssign'
+                                            : 'notNeedInEqualTest',
+                                        fix: (fixer) => [
+                                            fixer.remove(leftHandFinalToken),
+                                        ],
+                                    },
+                                ],
+                            });
+                        }
+                        else {
+                            context.report({
+                                node,
+                                messageId: isAssign ? 'confusingAssign' : 'confusingEqual',
+                                suggest: [
+                                    {
+                                        messageId: 'wrapUpLeft',
+                                        fix: (fixer) => [
+                                            fixer.insertTextBefore(node.left, '('),
+                                            fixer.insertTextAfter(node.left, ')'),
+                                        ],
+                                    },
+                                ],
+                            });
+                        }
+                    }
+                }
+            },
+        };
+    },
+});
+//# sourceMappingURL=no-confusing-non-null-assertion.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-confusing-non-null-assertion.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-confusing-non-null-assertion.js.map
new file mode 100644
index 0000000..d789e54
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-confusing-non-null-assertion.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"no-confusing-non-null-assertion.js","sourceRoot":"","sources":["../../src/rules/no-confusing-non-null-assertion.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAK+C;AAC/C,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,iCAAiC;IACvC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,gEAAgE;YAClE,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,KAAK;SACnB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,cAAc,EACZ,6HAA6H;YAC/H,eAAe,EACb,2HAA2H;YAC7H,kBAAkB,EAAE,kDAAkD;YACtE,eAAe,EACb,4DAA4D;YAC9D,UAAU,EACR,4EAA4E;SAC/E;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3C,OAAO;YACL,wCAAwC,CACtC,IAA+D;gBAE/D,SAAS,2BAA2B,CAClC,IAAyB;oBAEzB,OAAO,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,mBAAmB,CAAC;gBAC1D,CAAC;gBAED,IACE,IAAI,CAAC,QAAQ,KAAK,IAAI;oBACtB,IAAI,CAAC,QAAQ,KAAK,KAAK;oBACvB,IAAI,CAAC,QAAQ,KAAK,GAAG,EACrB;oBACA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC;oBACvC,MAAM,kBAAkB,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC9D,MAAM,cAAc,GAAG,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC3D,IACE,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,IAAI,MAAK,oCAAe,CAAC,UAAU;wBACvD,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,KAAK,MAAK,GAAG;wBACjC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,KAAK,MAAK,GAAG,EAC7B;wBACA,IAAI,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;4BAC1C,OAAO,CAAC,MAAM,CAAC;gCACb,IAAI;gCACJ,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB;gCAC1D,OAAO,EAAE;oCACP;wCACE,SAAS,EAAE,QAAQ;4CACjB,CAAC,CAAC,iBAAiB;4CACnB,CAAC,CAAC,oBAAoB;wCACxB,GAAG,EAAE,CAAC,KAAK,EAAsB,EAAE,CAAC;4CAClC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC;yCACjC;qCACF;iCACF;6BACF,CAAC,CAAC;yBACJ;6BAAM;4BACL,OAAO,CAAC,MAAM,CAAC;gCACb,IAAI;gCACJ,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB;gCAC1D,OAAO,EAAE;oCACP;wCACE,SAAS,EAAE,YAAY;wCACvB,GAAG,EAAE,CAAC,KAAK,EAAsB,EAAE,CAAC;4CAClC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC;4CACtC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC;yCACtC;qCACF;iCACF;6BACF,CAAC,CAAC;yBACJ;qBACF;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dupe-class-members.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dupe-class-members.js
index 9c4a211..a823830 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dupe-class-members.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dupe-class-members.js
@@ -1,14 +1,26 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const no_dupe_class_members_1 = __importDefault(require("eslint/lib/rules/no-dupe-class-members"));
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dupe-class-members.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dupe-class-members.js.map
index 010b7b7..7e93bad 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dupe-class-members.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dupe-class-members.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-dupe-class-members.js","sourceRoot":"","sources":["../../src/rules/no-dupe-class-members.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8EAAuE;AACvE,mGAA8D;AAC9D,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,uBAAuB;IAC7B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,kCAAkC;YAC/C,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,MAAM,EAAE,+BAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,EAAE,+BAAQ,CAAC,IAAI,CAAC,QAAQ;KACjC;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,+BAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvC,uCACK,KAAK,KACR,gBAAgB,CAAC,IAAI;gBACnB,IAAI,IAAI,CAAC,QAAQ,EAAE;oBACjB,OAAO;iBACR;gBAED,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,6BAA6B,EAAE;oBACpE,OAAO;iBACR;gBAED,OAAO,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC,IACD;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-dupe-class-members.js","sourceRoot":"","sources":["../../src/rules/no-dupe-class-members.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,8EAAuE;AACvE,mGAA8D;AAC9D,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,uBAAuB;IAC7B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,kCAAkC;YAC/C,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,MAAM,EAAE,+BAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,EAAE,+BAAQ,CAAC,IAAI,CAAC,QAAQ;KACjC;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,+BAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvC,uCACK,KAAK,KACR,gBAAgB,CAAC,IAAI;gBACnB,IAAI,IAAI,CAAC,QAAQ,EAAE;oBACjB,OAAO;iBACR;gBAED,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,6BAA6B,EAAE;oBACpE,OAAO;iBACR;gBAED,OAAO,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC,IACD;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dynamic-delete.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dynamic-delete.js
index 8d254e0..911e401 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dynamic-delete.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dynamic-delete.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dynamic-delete.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dynamic-delete.js.map
index fc1a44e..bf3450b 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dynamic-delete.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-dynamic-delete.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-dynamic-delete.js","sourceRoot":"","sources":["../../src/rules/no-dynamic-delete.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAI+C;AAC/C,iDAAmC;AACnC,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,4DAA4D;YACzE,WAAW,EAAE,KAAK;SACnB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,aAAa,EAAE,mDAAmD;SACnE;QACD,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,YAAY;KACnB;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,SAAS,WAAW,CAClB,MAAiC;YAEjC,IACE,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO;gBAC/C,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,KAAK,QAAQ,EACzC;gBACA,OAAO,yBAAyB,CAC9B,MAAM,CAAC,QAAQ,EACf,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAC5B,CAAC;aACH;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO;YACL,kCAAkC,CAAC,IAA8B;gBAC/D,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,gBAAgB;oBACtD,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ;oBACvB,wBAAwB,CACtB,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACnD,EACD;oBACA,OAAO;iBACR;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAC/B,SAAS,EAAE,eAAe;oBAC1B,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;iBAC7B,CAAC,CAAC;YACL,CAAC;SACF,CAAC;QAEF,SAAS,yBAAyB,CAChC,QAA6B,EAC7B,WAAmB;YAEnB,OAAO,CAAC,KAAyB,EAAoB,EAAE,CACrD,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;QACjE,CAAC;QAED,SAAS,aAAa,CAAC,QAA6B;YAClD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAE3C,OAAO;gBACL,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7C,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC;aAC7C,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,0BAA0B,CACjC,IAAyB;IAEzB,IAAI,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,eAAe,EAAE;QAChD,OAAO,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KAClD;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,wBAAwB,CAAC,QAA6B;IAC7D,IAAI,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO,EAAE;QAC5C,OAAO,KAAK,CAAC;KACd;IAED,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE;QACtC,OAAO,IAAI,CAAC;KACb;IAED,OAAO,CACL,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;QAClC,CAAC,OAAO,CAAC,qBAAqB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC/C,CAAC;AACJ,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-dynamic-delete.js","sourceRoot":"","sources":["../../src/rules/no-dynamic-delete.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAI+C;AAC/C,iDAAmC;AACnC,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,4DAA4D;YACzE,WAAW,EAAE,KAAK;SACnB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,aAAa,EAAE,mDAAmD;SACnE;QACD,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,YAAY;KACnB;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,SAAS,WAAW,CAClB,MAAiC;YAEjC,IACE,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO;gBAC/C,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,KAAK,QAAQ,EACzC;gBACA,OAAO,yBAAyB,CAC9B,MAAM,CAAC,QAAQ,EACf,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAC5B,CAAC;aACH;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO;YACL,kCAAkC,CAAC,IAA8B;gBAC/D,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,gBAAgB;oBACtD,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ;oBACvB,wBAAwB,CACtB,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACnD,EACD;oBACA,OAAO;iBACR;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAC/B,SAAS,EAAE,eAAe;oBAC1B,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;iBAC7B,CAAC,CAAC;YACL,CAAC;SACF,CAAC;QAEF,SAAS,yBAAyB,CAChC,QAA6B,EAC7B,WAAmB;YAEnB,OAAO,CAAC,KAAyB,EAAoB,EAAE,CACrD,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;QACjE,CAAC;QAED,SAAS,aAAa,CAAC,QAA6B;YAClD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAE3C,OAAO;gBACL,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7C,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC;aAC7C,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,0BAA0B,CACjC,IAAyB;IAEzB,IAAI,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,eAAe,EAAE;QAChD,OAAO,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KAClD;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,wBAAwB,CAAC,QAA6B;IAC7D,IAAI,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO,EAAE;QAC5C,OAAO,KAAK,CAAC;KACd;IAED,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE;QACtC,OAAO,IAAI,CAAC;KACb;IAED,OAAO,CACL,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ;QAClC,CAAC,OAAO,CAAC,qBAAqB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC/C,CAAC;AACJ,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-function.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-function.js
index c2ac27d..775e85c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-function.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-function.js
@@ -1,14 +1,26 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const no_empty_function_1 = __importDefault(require("eslint/lib/rules/no-empty-function"));
@@ -30,6 +42,9 @@
                     'constructors',
                     'private-constructors',
                     'protected-constructors',
+                    'asyncFunctions',
+                    'asyncMethods',
+                    'decoratedFunctions',
                 ],
             },
         },
@@ -57,6 +72,7 @@
         const rules = no_empty_function_1.default.create(context);
         const isAllowedProtectedConstructors = allow.includes('protected-constructors');
         const isAllowedPrivateConstructors = allow.includes('private-constructors');
+        const isAllowedDecoratedFunctions = allow.includes('decoratedFunctions');
         /**
          * Check if the method body is empty
          * @param node the node to be validated
@@ -73,8 +89,8 @@
          * @private
          */
         function hasParameterProperties(node) {
-            return (node.params &&
-                node.params.some(param => param.type === experimental_utils_1.AST_NODE_TYPES.TSParameterProperty));
+            var _a;
+            return (_a = node.params) === null || _a === void 0 ? void 0 : _a.some(param => param.type === experimental_utils_1.AST_NODE_TYPES.TSParameterProperty);
         }
         /**
          * @param node the node to be validated
@@ -82,10 +98,9 @@
          * @private
          */
         function isAllowedEmptyConstructor(node) {
-            var _a;
             const parent = node.parent;
             if (isBodyEmpty(node) &&
-                ((_a = parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.MethodDefinition &&
+                (parent === null || parent === void 0 ? void 0 : parent.type) === experimental_utils_1.AST_NODE_TYPES.MethodDefinition &&
                 parent.kind === 'constructor') {
                 const { accessibility } = parent;
                 return (
@@ -98,11 +113,33 @@
             }
             return false;
         }
+        /**
+         * @param node the node to be validated
+         * @returns true if a function has decorators
+         * @private
+         */
+        function isAllowedEmptyDecoratedFunctions(node) {
+            var _a;
+            if (isAllowedDecoratedFunctions && isBodyEmpty(node)) {
+                const decorators = ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.MethodDefinition
+                    ? node.parent.decorators
+                    : undefined;
+                return !!decorators && !!decorators.length;
+            }
+            return false;
+        }
         return Object.assign(Object.assign({}, rules), { FunctionExpression(node) {
-                if (isAllowedEmptyConstructor(node)) {
+                if (isAllowedEmptyConstructor(node) ||
+                    isAllowedEmptyDecoratedFunctions(node)) {
                     return;
                 }
                 rules.FunctionExpression(node);
+            },
+            FunctionDeclaration(node) {
+                if (isAllowedEmptyDecoratedFunctions(node)) {
+                    return;
+                }
+                rules.FunctionDeclaration(node);
             } });
     },
 });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-function.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-function.js.map
index 4507125..e081d10 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-function.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-function.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-empty-function.js","sourceRoot":"","sources":["../../src/rules/no-empty-function.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-empty-function.js","sourceRoot":"","sources":["../../src/rules/no-empty-function.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-interface.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-interface.js
index 6944792..f4037c2 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-interface.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-interface.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -16,6 +28,7 @@
             description: 'Disallow the declaration of empty interfaces',
             category: 'Best Practices',
             recommended: 'error',
+            suggestion: true,
         },
         fixable: 'code',
         messages: {
@@ -43,6 +56,7 @@
         return {
             TSInterfaceDeclaration(node) {
                 const sourceCode = context.getSourceCode();
+                const filename = context.getFilename();
                 if (node.body.body.length !== 0) {
                     // interface contains members --> Nothing to report
                     return;
@@ -57,11 +71,31 @@
                 else if (extend.length === 1) {
                     // interface extends exactly 1 interface --> Report depending on rule setting
                     if (!allowSingleExtends) {
-                        context.report({
-                            node: node.id,
-                            messageId: 'noEmptyWithSuper',
-                            fix: fixer => fixer.replaceText(node, `type ${sourceCode.getText(node.id)} = ${sourceCode.getText(extend[0])}`),
-                        });
+                        const fix = (fixer) => {
+                            let typeParam = '';
+                            if (node.typeParameters) {
+                                typeParam = sourceCode.getText(node.typeParameters);
+                            }
+                            return fixer.replaceText(node, `type ${sourceCode.getText(node.id)}${typeParam} = ${sourceCode.getText(extend[0])}`);
+                        };
+                        // Check if interface is within ambient declaration
+                        let useAutoFix = true;
+                        if (util.isDefinitionFile(filename)) {
+                            const scope = context.getScope();
+                            if (scope.type === 'tsModule' && scope.block.declare) {
+                                useAutoFix = false;
+                            }
+                        }
+                        context.report(Object.assign({ node: node.id, messageId: 'noEmptyWithSuper' }, (useAutoFix
+                            ? { fix }
+                            : {
+                                suggest: [
+                                    {
+                                        messageId: 'noEmptyWithSuper',
+                                        fix,
+                                    },
+                                ],
+                            })));
                     }
                 }
             },
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-interface.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-interface.js.map
index 1588210..ba663fe 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-interface.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-empty-interface.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-empty-interface.js","sourceRoot":"","sources":["../../src/rules/no-empty-interface.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8CAAgC;AAShC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,8CAA8C;YAC3D,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;SACrB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,OAAO,EAAE,2CAA2C;YACpD,gBAAgB,EACd,mEAAmE;SACtE;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE;oBACV,kBAAkB,EAAE;wBAClB,IAAI,EAAE,SAAS;qBAChB;iBACF;aACF;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,kBAAkB,EAAE,KAAK;SAC1B;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC;QACtC,OAAO;YACL,sBAAsB,CAAC,IAAI;gBACzB,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;gBAE3C,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC/B,mDAAmD;oBACnD,OAAO;iBACR;gBAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC5B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;oBAClC,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,IAAI,CAAC,EAAE;wBACb,SAAS,EAAE,SAAS;qBACrB,CAAC,CAAC;iBACJ;qBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC9B,6EAA6E;oBAC7E,IAAI,CAAC,kBAAkB,EAAE;wBACvB,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,IAAI,CAAC,EAAE;4BACb,SAAS,EAAE,kBAAkB;4BAC7B,GAAG,EAAE,KAAK,CAAC,EAAE,CACX,KAAK,CAAC,WAAW,CACf,IAAI,EACJ,QAAQ,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,OAAO,CACzD,MAAM,CAAC,CAAC,CAAC,CACV,EAAE,CACJ;yBACJ,CAAC,CAAC;qBACJ;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-empty-interface.js","sourceRoot":"","sources":["../../src/rules/no-empty-interface.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8CAAgC;AAUhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,8CAA8C;YAC3D,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;YACpB,UAAU,EAAE,IAAI;SACjB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,OAAO,EAAE,2CAA2C;YACpD,gBAAgB,EACd,mEAAmE;SACtE;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE;oBACV,kBAAkB,EAAE;wBAClB,IAAI,EAAE,SAAS;qBAChB;iBACF;aACF;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,kBAAkB,EAAE,KAAK;SAC1B;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC;QACtC,OAAO;YACL,sBAAsB,CAAC,IAAI;gBACzB,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;gBAEvC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC/B,mDAAmD;oBACnD,OAAO;iBACR;gBAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC5B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;oBAClC,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,IAAI,CAAC,EAAE;wBACb,SAAS,EAAE,SAAS;qBACrB,CAAC,CAAC;iBACJ;qBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC9B,6EAA6E;oBAC7E,IAAI,CAAC,kBAAkB,EAAE;wBACvB,MAAM,GAAG,GAAG,CAAC,KAAyB,EAAoB,EAAE;4BAC1D,IAAI,SAAS,GAAG,EAAE,CAAC;4BACnB,IAAI,IAAI,CAAC,cAAc,EAAE;gCACvB,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;6BACrD;4BACD,OAAO,KAAK,CAAC,WAAW,CACtB,IAAI,EACJ,QAAQ,UAAU,CAAC,OAAO,CACxB,IAAI,CAAC,EAAE,CACR,GAAG,SAAS,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CACnD,CAAC;wBACJ,CAAC,CAAC;wBAEF,mDAAmD;wBACnD,IAAI,UAAU,GAAG,IAAI,CAAC;wBACtB,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE;4BACnC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;4BACjC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE;gCACpD,UAAU,GAAG,KAAK,CAAC;6BACpB;yBACF;wBAED,OAAO,CAAC,MAAM,iBACZ,IAAI,EAAE,IAAI,CAAC,EAAE,EACb,SAAS,EAAE,kBAAkB,IAC1B,CAAC,UAAU;4BACZ,CAAC,CAAC,EAAE,GAAG,EAAE;4BACT,CAAC,CAAC;gCACE,OAAO,EAAE;oCACP;wCACE,SAAS,EAAE,kBAAkB;wCAC7B,GAAG;qCACJ;iCACF;6BACF,CAAC,EACN,CAAC;qBACJ;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-explicit-any.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-explicit-any.js
index 4940491..f64ee14 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-explicit-any.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-explicit-any.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -17,6 +29,7 @@
             description: 'Disallow usage of the `any` type',
             category: 'Best Practices',
             recommended: 'warn',
+            suggestion: true,
         },
         fixable: 'code',
         messages: {
@@ -47,9 +60,9 @@
     ],
     create(context, [{ ignoreRestArgs, fixToUnknown }]) {
         /**
-         * Checks if the node is an arrow function, function declaration or function expression
+         * Checks if the node is an arrow function, function/constructor declaration or function expression
          * @param node the node to be validated.
-         * @returns true if the node is an arrow function, function declaration, function expression, function type, or call signature
+         * @returns true if the node is any kind of function declaration or expression
          * @private
          */
         function isNodeValidFunction(node) {
@@ -57,8 +70,13 @@
                 experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression,
                 experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration,
                 experimental_utils_1.AST_NODE_TYPES.FunctionExpression,
+                experimental_utils_1.AST_NODE_TYPES.TSEmptyBodyFunctionExpression,
                 experimental_utils_1.AST_NODE_TYPES.TSFunctionType,
+                experimental_utils_1.AST_NODE_TYPES.TSConstructorType,
                 experimental_utils_1.AST_NODE_TYPES.TSCallSignatureDeclaration,
+                experimental_utils_1.AST_NODE_TYPES.TSConstructSignatureDeclaration,
+                experimental_utils_1.AST_NODE_TYPES.TSMethodSignature,
+                experimental_utils_1.AST_NODE_TYPES.TSDeclareFunction,
             ].includes(node.type);
         }
         /**
@@ -111,9 +129,8 @@
          * @private
          */
         function isGreatGrandparentRestElement(node) {
-            return (typeof node.parent !== 'undefined' &&
-                typeof node.parent.parent !== 'undefined' &&
-                typeof node.parent.parent.parent !== 'undefined' &&
+            var _a, _b;
+            return (((_b = (_a = node === null || node === void 0 ? void 0 : node.parent) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.parent) != null &&
                 isNodeRestElementInFunction(node.parent.parent.parent));
         }
         /**
@@ -123,11 +140,9 @@
          * @private
          */
         function isGreatGreatGrandparentRestElement(node) {
-            return (typeof node.parent !== 'undefined' &&
-                typeof node.parent.parent !== 'undefined' &&
+            var _a, _b, _c;
+            return (((_c = (_b = (_a = node.parent) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.parent) === null || _c === void 0 ? void 0 : _c.parent) != null &&
                 isNodeValidTSType(node.parent.parent) &&
-                typeof node.parent.parent.parent !== 'undefined' &&
-                typeof node.parent.parent.parent.parent !== 'undefined' &&
                 isNodeRestElementInFunction(node.parent.parent.parent.parent));
         }
         /**
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-explicit-any.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-explicit-any.js.map
index f3311cd..d9f8f54 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-explicit-any.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-explicit-any.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-explicit-any.js","sourceRoot":"","sources":["../../src/rules/no-explicit-any.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-explicit-any.js","sourceRoot":"","sources":["../../src/rules/no-explicit-any.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-non-null-assertion.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-non-null-assertion.js
index 47a814d..9c0ac37 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-non-null-assertion.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-non-null-assertion.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -15,7 +27,7 @@
         docs: {
             description: 'Disallow extra non-null assertion',
             category: 'Stylistic Issues',
-            recommended: false,
+            recommended: 'error',
         },
         fixable: 'code',
         schema: [],
@@ -36,8 +48,8 @@
         }
         return {
             'TSNonNullExpression > TSNonNullExpression': checkExtraNonNullAssertion,
-            'OptionalMemberExpression > TSNonNullExpression': checkExtraNonNullAssertion,
-            'OptionalCallExpression > TSNonNullExpression.callee': checkExtraNonNullAssertion,
+            'MemberExpression[optional = true] > TSNonNullExpression': checkExtraNonNullAssertion,
+            'CallExpression[optional = true] > TSNonNullExpression.callee': checkExtraNonNullAssertion,
         };
     },
 });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-non-null-assertion.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-non-null-assertion.js.map
index 4799984..ad93d3f 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-non-null-assertion.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-non-null-assertion.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-extra-non-null-assertion.js","sourceRoot":"","sources":["../../src/rules/no-extra-non-null-assertion.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8CAAgC;AAGhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,6BAA6B;IACnC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,mCAAmC;YAChD,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,KAAK;SACnB;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,uBAAuB,EAAE,qCAAqC;SAC/D;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,SAAS,0BAA0B,CACjC,IAAkC;YAElC,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI;gBACJ,SAAS,EAAE,yBAAyB;gBACpC,GAAG,CAAC,KAAK;oBACP,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/D,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,2CAA2C,EAAE,0BAA0B;YACvE,gDAAgD,EAAE,0BAA0B;YAC5E,qDAAqD,EAAE,0BAA0B;SAClF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-extra-non-null-assertion.js","sourceRoot":"","sources":["../../src/rules/no-extra-non-null-assertion.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,6BAA6B;IACnC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,mCAAmC;YAChD,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,OAAO;SACrB;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,uBAAuB,EAAE,qCAAqC;SAC/D;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,SAAS,0BAA0B,CACjC,IAAkC;YAElC,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI;gBACJ,SAAS,EAAE,yBAAyB;gBACpC,GAAG,CAAC,KAAK;oBACP,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/D,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,2CAA2C,EAAE,0BAA0B;YACvE,yDAAyD,EAAE,0BAA0B;YACrF,8DAA8D,EAAE,0BAA0B;SAC3F,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-parens.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-parens.js
index 18d7a2a..713be4d 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-parens.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-parens.js
@@ -1,16 +1,28 @@
 "use strict";
 // any is required to work around manipulating the AST in weird ways
 /* eslint-disable @typescript-eslint/no-explicit-any */
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const no_extra_parens_1 = __importDefault(require("eslint/lib/rules/no-extra-parens"));
@@ -49,11 +61,18 @@
             return rule(node);
         }
         function callExp(node) {
+            var _a;
             const rule = rules.CallExpression;
             if (util.isTypeAssertion(node.callee)) {
                 // reduces the precedence of the node so the rule thinks it needs to be wrapped
                 return rule(Object.assign(Object.assign({}, node), { callee: Object.assign(Object.assign({}, node.callee), { type: experimental_utils_1.AST_NODE_TYPES.SequenceExpression }) }));
             }
+            if (node.arguments.length === 1 && ((_a = node.typeParameters) === null || _a === void 0 ? void 0 : _a.params.some(param => param.type === experimental_utils_1.AST_NODE_TYPES.TSParenthesizedType ||
+                param.type === experimental_utils_1.AST_NODE_TYPES.TSImportType))) {
+                return rule(Object.assign(Object.assign({}, node), { arguments: [
+                        Object.assign(Object.assign({}, node.arguments[0]), { type: experimental_utils_1.AST_NODE_TYPES.SequenceExpression }),
+                    ] }));
+            }
             return rule(node);
         }
         function unaryUpdateExpression(node) {
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-parens.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-parens.js.map
index a010fc2..b3b7d7e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-parens.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-parens.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-extra-parens.js","sourceRoot":"","sources":["../../src/rules/no-extra-parens.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-extra-parens.js","sourceRoot":"","sources":["../../src/rules/no-extra-parens.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-semi.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-semi.js
index 0c1d99b..7c89f97 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-semi.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-semi.js
@@ -1,14 +1,26 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
 const no_extra_semi_1 = __importDefault(require("eslint/lib/rules/no-extra-semi"));
 const util = __importStar(require("../util"));
@@ -19,7 +31,7 @@
         docs: {
             description: 'Disallow unnecessary semicolons',
             category: 'Possible Errors',
-            recommended: false,
+            recommended: 'error',
             extendsBaseRule: true,
         },
         fixable: 'code',
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-semi.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-semi.js.map
index ac68a4f..c7e87d7 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-semi.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extra-semi.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-extra-semi.js","sourceRoot":"","sources":["../../src/rules/no-extra-semi.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mFAAsD;AACtD,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,iCAAiC;YAC9C,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,uBAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,EAAE,uBAAQ,CAAC,IAAI,CAAC,QAAQ;KACjC;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,uBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvC,uCACK,KAAK,KACR,aAAa,CAAC,IAAI;gBAChB,KAAK,CAAC,gBAAgB,CAAC,IAAa,CAAC,CAAC;YACxC,CAAC,IACD;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-extra-semi.js","sourceRoot":"","sources":["../../src/rules/no-extra-semi.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,mFAAsD;AACtD,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,iCAAiC;YAC9C,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,OAAO;YACpB,eAAe,EAAE,IAAI;SACtB;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,uBAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,EAAE,uBAAQ,CAAC,IAAI,CAAC,QAAQ;KACjC;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,uBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvC,uCACK,KAAK,KACR,aAAa,CAAC,IAAI;gBAChB,KAAK,CAAC,gBAAgB,CAAC,IAAa,CAAC,CAAC;YACxC,CAAC,IACD;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extraneous-class.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extraneous-class.js
index 1b7c971..3e81369 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extraneous-class.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extraneous-class.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extraneous-class.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extraneous-class.js.map
index aa83cc0..6865a15 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extraneous-class.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-extraneous-class.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-extraneous-class.js","sourceRoot":"","sources":["../../src/rules/no-extraneous-class.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-extraneous-class.js","sourceRoot":"","sources":["../../src/rules/no-extraneous-class.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-floating-promises.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-floating-promises.js
index 6ee0cb6..38191bc 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-floating-promises.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-floating-promises.js
@@ -1,14 +1,27 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 const tsutils = __importStar(require("tsutils"));
 const ts = __importStar(require("typescript"));
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const util = __importStar(require("../util"));
 exports.default = util.createRule({
     name: 'no-floating-promises',
@@ -16,20 +29,22 @@
         docs: {
             description: 'Requires Promise-like values to be handled appropriately',
             category: 'Best Practices',
-            recommended: false,
+            recommended: 'error',
+            suggestion: true,
             requiresTypeChecking: true,
         },
         messages: {
-            floating: 'Promises must be handled appropriately',
+            floating: 'Promises must be handled appropriately.',
             floatingVoid: 'Promises must be handled appropriately' +
-                ' or explicitly marked as ignored with the `void` operator',
-            floatingFixVoid: 'Add void operator to ignore',
+                ' or explicitly marked as ignored with the `void` operator.',
+            floatingFixVoid: 'Add void operator to ignore.',
         },
         schema: [
             {
                 type: 'object',
                 properties: {
                     ignoreVoid: { type: 'boolean' },
+                    ignoreIIFE: { type: 'boolean' },
                 },
                 additionalProperties: false,
             },
@@ -38,7 +53,8 @@
     },
     defaultOptions: [
         {
-            ignoreVoid: false,
+            ignoreVoid: true,
+            ignoreIIFE: false,
         },
     ],
     create(context, [options]) {
@@ -48,6 +64,9 @@
         return {
             ExpressionStatement(node) {
                 const { expression } = parserServices.esTreeNodeToTSNodeMap.get(node);
+                if (options.ignoreIIFE && isAsyncIife(node)) {
+                    return;
+                }
                 if (isUnhandledPromise(checker, expression)) {
                     if (options.ignoreVoid) {
                         context.report({
@@ -74,6 +93,15 @@
                 }
             },
         };
+        function isAsyncIife(node) {
+            if (node.expression.type !== experimental_utils_1.AST_NODE_TYPES.CallExpression) {
+                return false;
+            }
+            return (node.expression.type === experimental_utils_1.AST_NODE_TYPES.CallExpression &&
+                (node.expression.callee.type ===
+                    experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression ||
+                    node.expression.callee.type === experimental_utils_1.AST_NODE_TYPES.FunctionExpression));
+        }
         function isUnhandledPromise(checker, node) {
             // First, check expressions whose resulting types may not be promise-like
             if (ts.isBinaryExpression(node) &&
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-floating-promises.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-floating-promises.js.map
index bbc262e..d025287 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-floating-promises.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-floating-promises.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-floating-promises.js","sourceRoot":"","sources":["../../src/rules/no-floating-promises.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-floating-promises.js","sourceRoot":"","sources":["../../src/rules/no-floating-promises.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-for-in-array.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-for-in-array.js
index 8f6d962..e1b7fc7 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-for-in-array.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-for-in-array.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -31,9 +43,8 @@
                 const parserServices = util.getParserServices(context);
                 const checker = parserServices.program.getTypeChecker();
                 const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
-                const type = checker.getTypeAtLocation(originalNode.expression);
-                if ((typeof type.symbol !== 'undefined' &&
-                    type.symbol.name === 'Array') ||
+                const type = util.getConstrainedTypeAtLocation(checker, originalNode.expression);
+                if (util.isTypeArrayTypeOrUnionOfArrayTypes(type, checker) ||
                     (type.flags & ts.TypeFlags.StringLike) !== 0) {
                     context.report({
                         node,
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-for-in-array.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-for-in-array.js.map
index 88288ab..67767b3 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-for-in-array.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-for-in-array.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-for-in-array.js","sourceRoot":"","sources":["../../src/rules/no-for-in-array.ts"],"names":[],"mappings":";;;;;;;;;AAAA,+CAAiC;AACjC,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,WAAW,EAAE,qDAAqD;YAClE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;YACpB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,cAAc,EACZ,8EAA8E;SACjF;QACD,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,SAAS;KAChB;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,cAAc,CAAC,IAAI;gBACjB,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBACvD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;gBACxD,MAAM,YAAY,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEpE,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;gBAEhE,IACE,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW;oBACjC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;oBAC/B,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAC5C;oBACA,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,gBAAgB;qBAC5B,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-for-in-array.js","sourceRoot":"","sources":["../../src/rules/no-for-in-array.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,WAAW,EAAE,qDAAqD;YAClE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;YACpB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,cAAc,EACZ,8EAA8E;SACjF;QACD,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,SAAS;KAChB;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,cAAc,CAAC,IAAI;gBACjB,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBACvD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;gBACxD,MAAM,YAAY,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEpE,MAAM,IAAI,GAAG,IAAI,CAAC,4BAA4B,CAC5C,OAAO,EACP,YAAY,CAAC,UAAU,CACxB,CAAC;gBAEF,IACE,IAAI,CAAC,kCAAkC,CAAC,IAAI,EAAE,OAAO,CAAC;oBACtD,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAC5C;oBACA,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,gBAAgB;qBAC5B,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implicit-any-catch.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implicit-any-catch.js
new file mode 100644
index 0000000..fb3d31e
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implicit-any-catch.js
@@ -0,0 +1,97 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const util = __importStar(require("../util"));
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+exports.default = util.createRule({
+    name: 'no-implicit-any-catch',
+    meta: {
+        type: 'suggestion',
+        docs: {
+            description: 'Disallow usage of the implicit `any` type in catch clauses',
+            category: 'Best Practices',
+            recommended: false,
+            suggestion: true,
+        },
+        fixable: 'code',
+        messages: {
+            implicitAnyInCatch: 'Implicit any in catch clause',
+            explicitAnyInCatch: 'Explicit any in catch clause',
+            suggestExplicitUnknown: 'Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct.',
+        },
+        schema: [
+            {
+                type: 'object',
+                additionalProperties: false,
+                properties: {
+                    allowExplicitAny: {
+                        type: 'boolean',
+                    },
+                },
+            },
+        ],
+    },
+    defaultOptions: [
+        {
+            allowExplicitAny: false,
+        },
+    ],
+    create(context, [{ allowExplicitAny }]) {
+        return {
+            CatchClause(node) {
+                if (!node.param) {
+                    return; // ignore catch without variable
+                }
+                if (!node.param.typeAnnotation) {
+                    context.report({
+                        node,
+                        messageId: 'implicitAnyInCatch',
+                        suggest: [
+                            {
+                                messageId: 'suggestExplicitUnknown',
+                                fix(fixer) {
+                                    return fixer.insertTextAfter(node.param, ': unknown');
+                                },
+                            },
+                        ],
+                    });
+                }
+                else if (!allowExplicitAny &&
+                    node.param.typeAnnotation.typeAnnotation.type ===
+                        experimental_utils_1.AST_NODE_TYPES.TSAnyKeyword) {
+                    context.report({
+                        node,
+                        messageId: 'explicitAnyInCatch',
+                        suggest: [
+                            {
+                                messageId: 'suggestExplicitUnknown',
+                                fix(fixer) {
+                                    return fixer.replaceText(node.param.typeAnnotation, ': unknown');
+                                },
+                            },
+                        ],
+                    });
+                }
+            },
+        };
+    },
+});
+//# sourceMappingURL=no-implicit-any-catch.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implicit-any-catch.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implicit-any-catch.js.map
new file mode 100644
index 0000000..e5ed504
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implicit-any-catch.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"no-implicit-any-catch.js","sourceRoot":"","sources":["../../src/rules/no-implicit-any-catch.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8CAAgC;AAChC,8EAG+C;AAY/C,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,uBAAuB;IAC7B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,4DAA4D;YACzE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,UAAU,EAAE,IAAI;SACjB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,kBAAkB,EAAE,8BAA8B;YAClD,kBAAkB,EAAE,8BAA8B;YAClD,sBAAsB,EACpB,kGAAkG;SACrG;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE;oBACV,gBAAgB,EAAE;wBAChB,IAAI,EAAE,SAAS;qBAChB;iBACF;aACF;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,gBAAgB,EAAE,KAAK;SACxB;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC;QACpC,OAAO;YACL,WAAW,CAAC,IAAI;gBACd,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;oBACf,OAAO,CAAC,gCAAgC;iBACzC;gBAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;oBAC9B,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,oBAAoB;wBAC/B,OAAO,EAAE;4BACP;gCACE,SAAS,EAAE,wBAAwB;gCACnC,GAAG,CAAC,KAAK;oCACP,OAAO,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,KAAM,EAAE,WAAW,CAAC,CAAC;gCACzD,CAAC;6BACF;yBACF;qBACF,CAAC,CAAC;iBACJ;qBAAM,IACL,CAAC,gBAAgB;oBACjB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI;wBAC3C,mCAAc,CAAC,YAAY,EAC7B;oBACA,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,oBAAoB;wBAC/B,OAAO,EAAE;4BACP;gCACE,SAAS,EAAE,wBAAwB;gCACnC,GAAG,CAAC,KAAK;oCACP,OAAO,KAAK,CAAC,WAAW,CACtB,IAAI,CAAC,KAAM,CAAC,cAAe,EAC3B,WAAW,CACZ,CAAC;gCACJ,CAAC;6BACF;yBACF;qBACF,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implied-eval.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implied-eval.js
index f4d4f62..86eb806 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implied-eval.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implied-eval.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -12,6 +24,7 @@
 const tsutils = __importStar(require("tsutils"));
 const util = __importStar(require("../util"));
 const FUNCTION_CONSTRUCTOR = 'Function';
+const GLOBAL_CANDIDATES = new Set(['global', 'window', 'globalThis']);
 const EVAL_LIKE_METHODS = new Set([
     'setImmediate',
     'setInterval',
@@ -24,7 +37,7 @@
         docs: {
             description: 'Disallow the use of `eval()`-like methods',
             category: 'Best Practices',
-            recommended: false,
+            recommended: 'error',
             requiresTypeChecking: true,
         },
         messages: {
@@ -37,6 +50,7 @@
     defaultOptions: [],
     create(context) {
         const parserServices = util.getParserServices(context);
+        const program = parserServices.program;
         const checker = parserServices.program.getTypeChecker();
         function getCalleeName(node) {
             if (node.type === experimental_utils_1.AST_NODE_TYPES.Identifier) {
@@ -44,7 +58,7 @@
             }
             if (node.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression &&
                 node.object.type === experimental_utils_1.AST_NODE_TYPES.Identifier &&
-                node.object.name === 'window') {
+                GLOBAL_CANDIDATES.has(node.object.name)) {
                 if (node.property.type === experimental_utils_1.AST_NODE_TYPES.Identifier) {
                     return node.property.name;
                 }
@@ -56,6 +70,7 @@
             return null;
         }
         function isFunctionType(node) {
+            var _a;
             const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);
             const type = checker.getTypeAtLocation(tsNode);
             const symbol = type.getSymbol();
@@ -63,6 +78,15 @@
                 tsutils.isSymbolFlagSet(symbol, ts.SymbolFlags.Function | ts.SymbolFlags.Method)) {
                 return true;
             }
+            if (symbol && symbol.escapedName === FUNCTION_CONSTRUCTOR) {
+                const declarations = (_a = symbol.getDeclarations()) !== null && _a !== void 0 ? _a : [];
+                for (const declaration of declarations) {
+                    const sourceFile = declaration.getSourceFile();
+                    if (program.isSourceFileDefaultLibrary(sourceFile)) {
+                        return true;
+                    }
+                }
+            }
             const signatures = checker.getSignaturesOfType(type, ts.SignatureKind.Call);
             return signatures.length > 0;
         }
@@ -84,13 +108,29 @@
             }
         }
         function checkImpliedEval(node) {
+            var _a;
+            const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node.callee);
+            const type = checker.getTypeAtLocation(tsNode);
             const calleeName = getCalleeName(node.callee);
             if (calleeName === null) {
                 return;
             }
             if (calleeName === FUNCTION_CONSTRUCTOR) {
-                context.report({ node, messageId: 'noFunctionConstructor' });
-                return;
+                const symbol = type.getSymbol();
+                if (symbol) {
+                    const declarations = (_a = symbol.getDeclarations()) !== null && _a !== void 0 ? _a : [];
+                    for (const declaration of declarations) {
+                        const sourceFile = declaration.getSourceFile();
+                        if (program.isSourceFileDefaultLibrary(sourceFile)) {
+                            context.report({ node, messageId: 'noFunctionConstructor' });
+                            return;
+                        }
+                    }
+                }
+                else {
+                    context.report({ node, messageId: 'noFunctionConstructor' });
+                    return;
+                }
             }
             if (node.arguments.length === 0) {
                 return;
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implied-eval.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implied-eval.js.map
index a20d459..38b1988 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implied-eval.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-implied-eval.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-implied-eval.js","sourceRoot":"","sources":["../../src/rules/no-implied-eval.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-implied-eval.js","sourceRoot":"","sources":["../../src/rules/no-implied-eval.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-inferrable-types.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-inferrable-types.js
index b4006a0..60ff6fb 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-inferrable-types.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-inferrable-types.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -45,8 +57,10 @@
     ],
     create(context, [{ ignoreParameters, ignoreProperties }]) {
         function isFunctionCall(init, callName) {
-            return ((init.type === experimental_utils_1.AST_NODE_TYPES.CallExpression ||
-                init.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression) &&
+            if (init.type === experimental_utils_1.AST_NODE_TYPES.ChainExpression) {
+                return isFunctionCall(init.expression, callName);
+            }
+            return (init.type === experimental_utils_1.AST_NODE_TYPES.CallExpression &&
                 init.callee.type === experimental_utils_1.AST_NODE_TYPES.Identifier &&
                 init.callee.name === callName);
         }
@@ -80,7 +94,8 @@
                         ? init.argument
                         : init;
                     return (isFunctionCall(unwrappedInit, 'BigInt') ||
-                        unwrappedInit.type === experimental_utils_1.AST_NODE_TYPES.BigIntLiteral);
+                        (unwrappedInit.type === experimental_utils_1.AST_NODE_TYPES.Literal &&
+                            'bigint' in unwrappedInit));
                 }
                 case experimental_utils_1.AST_NODE_TYPES.TSBooleanKeyword:
                     return (hasUnaryPrefix(init, '!') ||
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-inferrable-types.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-inferrable-types.js.map
index 25be70a..a31baf2 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-inferrable-types.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-inferrable-types.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-inferrable-types.js","sourceRoot":"","sources":["../../src/rules/no-inferrable-types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-inferrable-types.js","sourceRoot":"","sources":["../../src/rules/no-inferrable-types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-invalid-this.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-invalid-this.js
new file mode 100644
index 0000000..bfa7ae2
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-invalid-this.js
@@ -0,0 +1,59 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var _a;
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const no_invalid_this_1 = __importDefault(require("eslint/lib/rules/no-invalid-this"));
+const util_1 = require("../util");
+exports.default = util_1.createRule({
+    name: 'no-invalid-this',
+    meta: {
+        type: 'suggestion',
+        docs: {
+            description: 'disallow `this` keywords outside of classes or class-like objects',
+            category: 'Best Practices',
+            recommended: false,
+            extendsBaseRule: true,
+        },
+        messages: (_a = no_invalid_this_1.default.meta.messages) !== null && _a !== void 0 ? _a : {
+            unexpectedThis: "Unexpected 'this'.",
+        },
+        schema: no_invalid_this_1.default.meta.schema,
+    },
+    defaultOptions: [{ capIsConstructor: true }],
+    create(context) {
+        const rules = no_invalid_this_1.default.create(context);
+        const argList = [];
+        return Object.assign(Object.assign({}, rules), { FunctionDeclaration(node) {
+                argList.push(node.params.some(param => param.type === experimental_utils_1.AST_NODE_TYPES.Identifier && param.name === 'this'));
+                // baseRule's work
+                rules.FunctionDeclaration(node);
+            },
+            'FunctionDeclaration:exit'(node) {
+                argList.pop();
+                // baseRule's work
+                rules['FunctionDeclaration:exit'](node);
+            },
+            FunctionExpression(node) {
+                argList.push(node.params.some(param => param.type === experimental_utils_1.AST_NODE_TYPES.Identifier && param.name === 'this'));
+                // baseRule's work
+                rules.FunctionExpression(node);
+            },
+            'FunctionExpression:exit'(node) {
+                argList.pop();
+                // baseRule's work
+                rules['FunctionExpression:exit'](node);
+            },
+            ThisExpression(node) {
+                const lastFnArg = argList[argList.length - 1];
+                if (lastFnArg) {
+                    return;
+                }
+                // baseRule's work
+                rules.ThisExpression(node);
+            } });
+    },
+});
+//# sourceMappingURL=no-invalid-this.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-invalid-this.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-invalid-this.js.map
new file mode 100644
index 0000000..1d60a4e
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-invalid-this.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"no-invalid-this.js","sourceRoot":"","sources":["../../src/rules/no-invalid-this.ts"],"names":[],"mappings":";;;;;;AAAA,8EAG+C;AAC/C,uFAAwD;AACxD,kCAIiB;AAKjB,kBAAe,iBAAU,CAAsB;IAC7C,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,mEAAmE;YACrE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,QAAQ,QAAE,yBAAQ,CAAC,IAAI,CAAC,QAAQ,mCAAI;YAClC,cAAc,EAAE,oBAAoB;SACrC;QACD,MAAM,EAAE,yBAAQ,CAAC,IAAI,CAAC,MAAM;KAC7B;IACD,cAAc,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAC5C,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,yBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,OAAO,GAAc,EAAE,CAAC;QAE9B,uCACK,KAAK,KACR,mBAAmB,CAAC,IAAkC;gBACpD,OAAO,CAAC,IAAI,CACV,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,KAAK,CAAC,EAAE,CACN,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CACpE,CACF,CAAC;gBACF,kBAAkB;gBAClB,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;YACD,0BAA0B,CAAC,IAAkC;gBAC3D,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,kBAAkB;gBAClB,KAAK,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1C,CAAC;YACD,kBAAkB,CAAC,IAAiC;gBAClD,OAAO,CAAC,IAAI,CACV,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,KAAK,CAAC,EAAE,CACN,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CACpE,CACF,CAAC;gBACF,kBAAkB;gBAClB,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YACD,yBAAyB,CAAC,IAAiC;gBACzD,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,kBAAkB;gBAClB,KAAK,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;YACD,cAAc,CAAC,IAA6B;gBAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAE9C,IAAI,SAAS,EAAE;oBACb,OAAO;iBACR;gBAED,kBAAkB;gBAClB,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,IACD;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-invalid-void-type.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-invalid-void-type.js
new file mode 100644
index 0000000..f58aa23
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-invalid-void-type.js
@@ -0,0 +1,183 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const util = __importStar(require("../util"));
+exports.default = util.createRule({
+    name: 'no-invalid-void-type',
+    meta: {
+        type: 'problem',
+        docs: {
+            description: 'Disallows usage of `void` type outside of generic or return types',
+            category: 'Best Practices',
+            recommended: false,
+        },
+        messages: {
+            invalidVoidForGeneric: '{{ generic }} may not have void as a type variable',
+            invalidVoidNotReturnOrGeneric: 'void is only valid as a return type or generic type variable',
+            invalidVoidNotReturn: 'void is only valid as a return type',
+            invalidVoidNotReturnOrThisParam: 'void is only valid as return type or type of `this` parameter',
+            invalidVoidNotReturnOrThisParamOrGeneric: 'void is only valid as a return type or generic type variable or the type of a `this` parameter',
+        },
+        schema: [
+            {
+                type: 'object',
+                properties: {
+                    allowInGenericTypeArguments: {
+                        oneOf: [
+                            { type: 'boolean' },
+                            {
+                                type: 'array',
+                                items: { type: 'string' },
+                                minLength: 1,
+                            },
+                        ],
+                    },
+                    allowAsThisParameter: {
+                        type: 'boolean',
+                    },
+                },
+                additionalProperties: false,
+            },
+        ],
+    },
+    defaultOptions: [
+        { allowInGenericTypeArguments: true, allowAsThisParameter: false },
+    ],
+    create(context, [{ allowInGenericTypeArguments, allowAsThisParameter }]) {
+        const validParents = [
+            experimental_utils_1.AST_NODE_TYPES.TSTypeAnnotation,
+        ];
+        const invalidGrandParents = [
+            experimental_utils_1.AST_NODE_TYPES.TSPropertySignature,
+            experimental_utils_1.AST_NODE_TYPES.CallExpression,
+            experimental_utils_1.AST_NODE_TYPES.ClassProperty,
+            experimental_utils_1.AST_NODE_TYPES.Identifier,
+        ];
+        const validUnionMembers = [
+            experimental_utils_1.AST_NODE_TYPES.TSVoidKeyword,
+            experimental_utils_1.AST_NODE_TYPES.TSNeverKeyword,
+        ];
+        if (allowInGenericTypeArguments === true) {
+            validParents.push(experimental_utils_1.AST_NODE_TYPES.TSTypeParameterInstantiation);
+        }
+        /**
+         * @brief check if the given void keyword is used as a valid generic type
+         *
+         * reports if the type parametrized by void is not in the whitelist, or
+         * allowInGenericTypeArguments is false.
+         * no-op if the given void keyword is not used as generic type
+         */
+        function checkGenericTypeArgument(node) {
+            var _a, _b;
+            // only matches T<..., void, ...>
+            // extra check for precaution
+            /* istanbul ignore next */
+            if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) !== experimental_utils_1.AST_NODE_TYPES.TSTypeParameterInstantiation ||
+                ((_b = node.parent.parent) === null || _b === void 0 ? void 0 : _b.type) !== experimental_utils_1.AST_NODE_TYPES.TSTypeReference) {
+                return;
+            }
+            // check whitelist
+            if (Array.isArray(allowInGenericTypeArguments)) {
+                const sourceCode = context.getSourceCode();
+                const fullyQualifiedName = sourceCode
+                    .getText(node.parent.parent.typeName)
+                    .replace(/ /gu, '');
+                if (!allowInGenericTypeArguments
+                    .map(s => s.replace(/ /gu, ''))
+                    .includes(fullyQualifiedName)) {
+                    context.report({
+                        messageId: 'invalidVoidForGeneric',
+                        data: { generic: fullyQualifiedName },
+                        node,
+                    });
+                }
+                return;
+            }
+            if (!allowInGenericTypeArguments) {
+                context.report({
+                    messageId: allowAsThisParameter
+                        ? 'invalidVoidNotReturnOrThisParam'
+                        : 'invalidVoidNotReturn',
+                    node,
+                });
+            }
+        }
+        /**
+         * @brief checks that a union containing void is valid
+         * @return true if every member of the union is specified as a valid type in
+         * validUnionMembers, or is a valid generic type parametrized by void
+         */
+        function isValidUnionType(node) {
+            return node.types.every(member => {
+                var _a, _b;
+                return validUnionMembers.includes(member.type) ||
+                    // allows any T<..., void, ...> here, checked by checkGenericTypeArgument
+                    (member.type === experimental_utils_1.AST_NODE_TYPES.TSTypeReference &&
+                        ((_a = member.typeParameters) === null || _a === void 0 ? void 0 : _a.type) ===
+                            experimental_utils_1.AST_NODE_TYPES.TSTypeParameterInstantiation && ((_b = member.typeParameters) === null || _b === void 0 ? void 0 : _b.params.map(param => param.type).includes(experimental_utils_1.AST_NODE_TYPES.TSVoidKeyword)));
+            });
+        }
+        return {
+            TSVoidKeyword(node) {
+                var _a;
+                /* istanbul ignore next */
+                if (!((_a = node.parent) === null || _a === void 0 ? void 0 : _a.parent)) {
+                    return;
+                }
+                // checks T<..., void, ...> against specification of allowInGenericArguments option
+                if (node.parent.type === experimental_utils_1.AST_NODE_TYPES.TSTypeParameterInstantiation &&
+                    node.parent.parent.type === experimental_utils_1.AST_NODE_TYPES.TSTypeReference) {
+                    checkGenericTypeArgument(node);
+                    return;
+                }
+                // union w/ void must contain types from validUnionMembers, or a valid generic void type
+                if (node.parent.type === experimental_utils_1.AST_NODE_TYPES.TSUnionType &&
+                    isValidUnionType(node.parent)) {
+                    return;
+                }
+                // this parameter is ok to be void.
+                if (allowAsThisParameter &&
+                    node.parent.type === experimental_utils_1.AST_NODE_TYPES.TSTypeAnnotation &&
+                    node.parent.parent.type === experimental_utils_1.AST_NODE_TYPES.Identifier &&
+                    node.parent.parent.name === 'this') {
+                    return;
+                }
+                // default cases
+                if (validParents.includes(node.parent.type) &&
+                    !invalidGrandParents.includes(node.parent.parent.type)) {
+                    return;
+                }
+                context.report({
+                    messageId: allowInGenericTypeArguments && allowAsThisParameter
+                        ? 'invalidVoidNotReturnOrThisParamOrGeneric'
+                        : allowInGenericTypeArguments
+                            ? 'invalidVoidNotReturnOrGeneric'
+                            : allowAsThisParameter
+                                ? 'invalidVoidNotReturnOrThisParam'
+                                : 'invalidVoidNotReturn',
+                    node,
+                });
+            },
+        };
+    },
+});
+//# sourceMappingURL=no-invalid-void-type.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-invalid-void-type.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-invalid-void-type.js.map
new file mode 100644
index 0000000..bd9e5ae
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-invalid-void-type.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"no-invalid-void-type.js","sourceRoot":"","sources":["../../src/rules/no-invalid-void-type.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAchC,kBAAe,IAAI,CAAC,UAAU,CAAwB;IACpD,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,mEAAmE;YACrE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;SACnB;QACD,QAAQ,EAAE;YACR,qBAAqB,EACnB,oDAAoD;YACtD,6BAA6B,EAC3B,8DAA8D;YAChE,oBAAoB,EAAE,qCAAqC;YAC3D,+BAA+B,EAC7B,+DAA+D;YACjE,wCAAwC,EACtC,gGAAgG;SACnG;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,2BAA2B,EAAE;wBAC3B,KAAK,EAAE;4BACL,EAAE,IAAI,EAAE,SAAS,EAAE;4BACnB;gCACE,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCACzB,SAAS,EAAE,CAAC;6BACb;yBACF;qBACF;oBACD,oBAAoB,EAAE;wBACpB,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc,EAAE;QACd,EAAE,2BAA2B,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE;KACnE;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,CAAC;QACrE,MAAM,YAAY,GAAqB;YACrC,mCAAc,CAAC,gBAAgB;SAChC,CAAC;QACF,MAAM,mBAAmB,GAAqB;YAC5C,mCAAc,CAAC,mBAAmB;YAClC,mCAAc,CAAC,cAAc;YAC7B,mCAAc,CAAC,aAAa;YAC5B,mCAAc,CAAC,UAAU;SAC1B,CAAC;QACF,MAAM,iBAAiB,GAAqB;YAC1C,mCAAc,CAAC,aAAa;YAC5B,mCAAc,CAAC,cAAc;SAC9B,CAAC;QAEF,IAAI,2BAA2B,KAAK,IAAI,EAAE;YACxC,YAAY,CAAC,IAAI,CAAC,mCAAc,CAAC,4BAA4B,CAAC,CAAC;SAChE;QAED;;;;;;WAMG;QACH,SAAS,wBAAwB,CAAC,IAA4B;;YAC5D,iCAAiC;YACjC,6BAA6B;YAC7B,0BAA0B;YAC1B,IACE,OAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,MAAK,mCAAc,CAAC,4BAA4B;gBACjE,OAAA,IAAI,CAAC,MAAM,CAAC,MAAM,0CAAE,IAAI,MAAK,mCAAc,CAAC,eAAe,EAC3D;gBACA,OAAO;aACR;YAED,kBAAkB;YAClB,IAAI,KAAK,CAAC,OAAO,CAAC,2BAA2B,CAAC,EAAE;gBAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC3C,MAAM,kBAAkB,GAAG,UAAU;qBAClC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;qBACpC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAEtB,IACE,CAAC,2BAA2B;qBACzB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;qBAC9B,QAAQ,CAAC,kBAAkB,CAAC,EAC/B;oBACA,OAAO,CAAC,MAAM,CAAC;wBACb,SAAS,EAAE,uBAAuB;wBAClC,IAAI,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE;wBACrC,IAAI;qBACL,CAAC,CAAC;iBACJ;gBACD,OAAO;aACR;YAED,IAAI,CAAC,2BAA2B,EAAE;gBAChC,OAAO,CAAC,MAAM,CAAC;oBACb,SAAS,EAAE,oBAAoB;wBAC7B,CAAC,CAAC,iCAAiC;wBACnC,CAAC,CAAC,sBAAsB;oBAC1B,IAAI;iBACL,CAAC,CAAC;aACJ;QACH,CAAC;QAED;;;;WAIG;QACH,SAAS,gBAAgB,CAAC,IAA0B;YAClD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CACrB,MAAM,CAAC,EAAE;;gBACP,OAAA,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;oBACvC,yEAAyE;oBACzE,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,eAAe;wBAC7C,OAAA,MAAM,CAAC,cAAc,0CAAE,IAAI;4BACzB,mCAAc,CAAC,4BAA4B,WAC7C,MAAM,CAAC,cAAc,0CAAE,MAAM,CAC1B,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EACvB,QAAQ,CAAC,mCAAc,CAAC,aAAa,EAAC,CAAC,CAAA;aAAA,CAC/C,CAAC;QACJ,CAAC;QAED,OAAO;YACL,aAAa,CAAC,IAA4B;;gBACxC,0BAA0B;gBAC1B,IAAI,QAAC,IAAI,CAAC,MAAM,0CAAE,MAAM,CAAA,EAAE;oBACxB,OAAO;iBACR;gBAED,mFAAmF;gBACnF,IACE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,4BAA4B;oBAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,eAAe,EAC1D;oBACA,wBAAwB,CAAC,IAAI,CAAC,CAAC;oBAC/B,OAAO;iBACR;gBAED,wFAAwF;gBACxF,IACE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,WAAW;oBAC/C,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAC7B;oBACA,OAAO;iBACR;gBAED,mCAAmC;gBACnC,IACE,oBAAoB;oBACpB,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,gBAAgB;oBACpD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;oBACrD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,EAClC;oBACA,OAAO;iBACR;gBAED,gBAAgB;gBAChB,IACE,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBACvC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EACtD;oBACA,OAAO;iBACR;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,SAAS,EACP,2BAA2B,IAAI,oBAAoB;wBACjD,CAAC,CAAC,0CAA0C;wBAC5C,CAAC,CAAC,2BAA2B;4BAC7B,CAAC,CAAC,+BAA+B;4BACjC,CAAC,CAAC,oBAAoB;gCACtB,CAAC,CAAC,iCAAiC;gCACnC,CAAC,CAAC,sBAAsB;oBAC5B,IAAI;iBACL,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loop-func.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loop-func.js
new file mode 100644
index 0000000..50e42bb
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loop-func.js
@@ -0,0 +1,196 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var _a;
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const no_loop_func_1 = __importDefault(require("eslint/lib/rules/no-loop-func"));
+const util = __importStar(require("../util"));
+exports.default = util.createRule({
+    name: 'no-loop-func',
+    meta: {
+        type: 'suggestion',
+        docs: {
+            description: 'Disallow function declarations that contain unsafe references inside loop statements',
+            category: 'Best Practices',
+            recommended: false,
+            extendsBaseRule: true,
+        },
+        schema: [],
+        messages: (_a = no_loop_func_1.default === null || no_loop_func_1.default === void 0 ? void 0 : no_loop_func_1.default.meta.messages) !== null && _a !== void 0 ? _a : {
+            unsafeRefs: 'Function declared in a loop contains unsafe references to variable(s) {{ varNames }}.',
+        },
+    },
+    defaultOptions: [],
+    create(context) {
+        /**
+         * Reports functions which match the following condition:
+         * - has a loop node in ancestors.
+         * - has any references which refers to an unsafe variable.
+         *
+         * @param node The AST node to check.
+         * @returns Whether or not the node is within a loop.
+         */
+        function checkForLoops(node) {
+            const loopNode = getContainingLoopNode(node);
+            if (!loopNode) {
+                return;
+            }
+            const references = context.getScope().through;
+            const unsafeRefs = references
+                .filter(r => !isSafe(loopNode, r))
+                .map(r => r.identifier.name);
+            if (unsafeRefs.length > 0) {
+                context.report({
+                    node,
+                    messageId: 'unsafeRefs',
+                    data: { varNames: `'${unsafeRefs.join("', '")}'` },
+                });
+            }
+        }
+        return {
+            ArrowFunctionExpression: checkForLoops,
+            FunctionExpression: checkForLoops,
+            FunctionDeclaration: checkForLoops,
+        };
+    },
+});
+/**
+ * Gets the containing loop node of a specified node.
+ *
+ * We don't need to check nested functions, so this ignores those.
+ * `Scope.through` contains references of nested functions.
+ *
+ * @param node An AST node to get.
+ * @returns The containing loop node of the specified node, or `null`.
+ */
+function getContainingLoopNode(node) {
+    for (let currentNode = node; currentNode.parent; currentNode = currentNode.parent) {
+        const parent = currentNode.parent;
+        switch (parent.type) {
+            case experimental_utils_1.AST_NODE_TYPES.WhileStatement:
+            case experimental_utils_1.AST_NODE_TYPES.DoWhileStatement:
+                return parent;
+            case experimental_utils_1.AST_NODE_TYPES.ForStatement:
+                // `init` is outside of the loop.
+                if (parent.init !== currentNode) {
+                    return parent;
+                }
+                break;
+            case experimental_utils_1.AST_NODE_TYPES.ForInStatement:
+            case experimental_utils_1.AST_NODE_TYPES.ForOfStatement:
+                // `right` is outside of the loop.
+                if (parent.right !== currentNode) {
+                    return parent;
+                }
+                break;
+            case experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression:
+            case experimental_utils_1.AST_NODE_TYPES.FunctionExpression:
+            case experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration:
+                // We don't need to check nested functions.
+                return null;
+            default:
+                break;
+        }
+    }
+    return null;
+}
+/**
+ * Gets the containing loop node of a given node.
+ * If the loop was nested, this returns the most outer loop.
+ * @param node A node to get. This is a loop node.
+ * @param excludedNode A node that the result node should not include.
+ * @returns The most outer loop node.
+ */
+function getTopLoopNode(node, excludedNode) {
+    const border = excludedNode ? excludedNode.range[1] : 0;
+    let retv = node;
+    let containingLoopNode = node;
+    while (containingLoopNode && containingLoopNode.range[0] >= border) {
+        retv = containingLoopNode;
+        containingLoopNode = getContainingLoopNode(containingLoopNode);
+    }
+    return retv;
+}
+/**
+ * Checks whether a given reference which refers to an upper scope's variable is
+ * safe or not.
+ * @param loopNode A containing loop node.
+ * @param reference A reference to check.
+ * @returns `true` if the reference is safe or not.
+ */
+function isSafe(loopNode, reference) {
+    var _a;
+    const variable = reference.resolved;
+    const definition = variable === null || variable === void 0 ? void 0 : variable.defs[0];
+    const declaration = definition === null || definition === void 0 ? void 0 : definition.parent;
+    const kind = (declaration === null || declaration === void 0 ? void 0 : declaration.type) === experimental_utils_1.AST_NODE_TYPES.VariableDeclaration
+        ? declaration.kind
+        : '';
+    // type references are all safe
+    // this only really matters for global types that haven't been configured
+    if (reference.isTypeReference) {
+        return true;
+    }
+    // Variables which are declared by `const` is safe.
+    if (kind === 'const') {
+        return true;
+    }
+    /*
+     * Variables which are declared by `let` in the loop is safe.
+     * It's a different instance from the next loop step's.
+     */
+    if (kind === 'let' &&
+        declaration &&
+        declaration.range[0] > loopNode.range[0] &&
+        declaration.range[1] < loopNode.range[1]) {
+        return true;
+    }
+    /*
+     * WriteReferences which exist after this border are unsafe because those
+     * can modify the variable.
+     */
+    const border = getTopLoopNode(loopNode, kind === 'let' ? declaration : null)
+        .range[0];
+    /**
+     * Checks whether a given reference is safe or not.
+     * The reference is every reference of the upper scope's variable we are
+     * looking now.
+     *
+     * It's safe if the reference matches one of the following condition.
+     * - is readonly.
+     * - doesn't exist inside a local function and after the border.
+     *
+     * @param upperRef A reference to check.
+     * @returns `true` if the reference is safe.
+     */
+    function isSafeReference(upperRef) {
+        var _a;
+        const id = upperRef.identifier;
+        return (!upperRef.isWrite() ||
+            (((_a = variable === null || variable === void 0 ? void 0 : variable.scope) === null || _a === void 0 ? void 0 : _a.variableScope) === upperRef.from.variableScope &&
+                id.range[0] < border));
+    }
+    return (_a = variable === null || variable === void 0 ? void 0 : variable.references.every(isSafeReference)) !== null && _a !== void 0 ? _a : false;
+}
+//# sourceMappingURL=no-loop-func.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loop-func.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loop-func.js.map
new file mode 100644
index 0000000..45c6496
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loop-func.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"no-loop-func.js","sourceRoot":"","sources":["../../src/rules/no-loop-func.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loss-of-precision.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loss-of-precision.js
new file mode 100644
index 0000000..154caa1
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loss-of-precision.js
@@ -0,0 +1,63 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+var _a;
+Object.defineProperty(exports, "__esModule", { value: true });
+const util = __importStar(require("../util"));
+const baseRule = (() => {
+    try {
+        return require('eslint/lib/rules/no-loss-of-precision');
+    }
+    catch (_a) {
+        /* istanbul ignore next */
+        return null;
+    }
+})();
+exports.default = util.createRule({
+    name: 'no-loss-of-precision',
+    meta: {
+        type: 'problem',
+        docs: {
+            description: 'Disallow literal numbers that lose precision',
+            category: 'Possible Errors',
+            recommended: false,
+            extendsBaseRule: true,
+        },
+        schema: [],
+        messages: (_a = baseRule === null || baseRule === void 0 ? void 0 : baseRule.meta.messages) !== null && _a !== void 0 ? _a : { noLossOfPrecision: '' },
+    },
+    defaultOptions: [],
+    create(context) {
+        /* istanbul ignore if */ if (baseRule === null) {
+            throw new Error('@typescript-eslint/no-loss-of-precision requires at least ESLint v7.1.0');
+        }
+        // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
+        const rules = baseRule.create(context);
+        function isSeperatedNumeric(node) {
+            return typeof node.value === 'number' && node.raw.includes('_');
+        }
+        return {
+            Literal(node) {
+                rules.Literal(Object.assign(Object.assign({}, node), { raw: isSeperatedNumeric(node) ? node.raw.replace(/_/g, '') : node.raw }));
+            },
+        };
+    },
+});
+//# sourceMappingURL=no-loss-of-precision.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loss-of-precision.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loss-of-precision.js.map
new file mode 100644
index 0000000..ad268ed
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-loss-of-precision.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"no-loss-of-precision.js","sourceRoot":"","sources":["../../src/rules/no-loss-of-precision.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAEA,8CAAgC;AAEhC,MAAM,QAAQ,GAAG,CAAC,GAA2B,EAAE;IAC7C,IAAI;QACF,OAAO,OAAO,CAAC,uCAAuC,CAAC,CAAC;KACzD;IAAC,WAAM;QACN,0BAA0B;QAC1B,OAAO,IAAI,CAAC;KACb;AACH,CAAC,CAAC,EAAE,CAAC;AAKL,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,8CAA8C;YAC3D,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,QAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,CAAC,QAAQ,mCAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE;KAC/D;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,wBAAwB,CAAC,IAAI,QAAQ,KAAK,IAAI,EAAE;YAC9C,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;SACH;QAED,4EAA4E;QAC5E,MAAM,KAAK,GAAG,QAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAExC,SAAS,kBAAkB,CAAC,IAAsB;YAChD,OAAO,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAClE,CAAC;QACD,OAAO;YACL,OAAO,CAAC,IAAsB;gBAC5B,KAAK,CAAC,OAAO,iCACR,IAAI,KACP,GAAG,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IACrE,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-magic-numbers.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-magic-numbers.js
index 9d4c33f..f413422 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-magic-numbers.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-magic-numbers.js
@@ -1,14 +1,27 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var _a;
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const no_magic_numbers_1 = __importDefault(require("eslint/lib/rules/no-magic-numbers"));
@@ -36,7 +49,10 @@
                         type: 'boolean',
                     } }) }),
         ],
-        messages: no_magic_numbers_1.default.meta.messages,
+        messages: (_a = no_magic_numbers_1.default.meta.messages) !== null && _a !== void 0 ? _a : {
+            useConst: "Number constants declarations must use 'const'.",
+            noMagic: 'No magic number: {{raw}}.',
+        },
     },
     defaultOptions: [
         {
@@ -133,9 +149,8 @@
  * @private
  */
 function isParentTSEnumDeclaration(node) {
-    var _a;
     const parent = getLiteralParent(node);
-    return ((_a = parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.TSEnumMember;
+    return (parent === null || parent === void 0 ? void 0 : parent.type) === experimental_utils_1.AST_NODE_TYPES.TSEnumMember;
 }
 /**
  * Checks if the node parent is a Typescript literal type
@@ -181,9 +196,8 @@
  * @private
  */
 function isParentTSReadonlyClassProperty(node) {
-    var _a;
     const parent = getLiteralParent(node);
-    if (((_a = parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.ClassProperty && parent.readonly) {
+    if ((parent === null || parent === void 0 ? void 0 : parent.type) === experimental_utils_1.AST_NODE_TYPES.ClassProperty && parent.readonly) {
         return true;
     }
     return false;
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-magic-numbers.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-magic-numbers.js.map
index 76a327a..98542b9 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-magic-numbers.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-magic-numbers.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-magic-numbers.js","sourceRoot":"","sources":["../../src/rules/no-magic-numbers.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-magic-numbers.js","sourceRoot":"","sources":["../../src/rules/no-magic-numbers.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-new.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-new.js
index 2c3b8e9..3a310de 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-new.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-new.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-new.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-new.js.map
index f04b8f5..36e0d34 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-new.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-new.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-misused-new.js","sourceRoot":"","sources":["../../src/rules/no-misused-new.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,qDAAqD;YAClE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;SACrB;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,qBAAqB,EAAE,iDAAiD;YACxE,iBAAiB,EAAE,uCAAuC;SAC3D;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ;;;WAGG;QACH,SAAS,oBAAoB,CAC3B,IAIa;YAEb,IAAI,IAAI,EAAE;gBACR,QAAQ,IAAI,CAAC,IAAI,EAAE;oBACjB,KAAK,mCAAc,CAAC,gBAAgB;wBAClC,OAAO,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBACnD,KAAK,mCAAc,CAAC,eAAe;wBACjC,OAAO,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC7C,KAAK,mCAAc,CAAC,UAAU;wBAC5B,OAAO,IAAI,CAAC,IAAI,CAAC;oBACnB;wBACE,MAAM;iBACT;aACF;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED;;;WAGG;QACH,SAAS,oBAAoB,CAC3B,MAAiC,EACjC,UAAiD;YAEjD,IACE,MAAM;gBACN,IAAI,IAAI,MAAM;gBACd,MAAM,CAAC,EAAE;gBACT,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,EAC5C;gBACA,OAAO,oBAAoB,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;aAC5D;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO;YACL,mDAAmD,CACjD,IAA8C;gBAE9C,IACE,oBAAoB,CAClB,IAAI,CAAC,MAAO,CAAC,MAAyC,EACtD,IAAI,CAAC,UAAU,CAChB,EACD;oBACA,cAAc;oBACd,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,uBAAuB;qBACnC,CAAC,CAAC;iBACJ;YACH,CAAC;YACD,2CAA2C,CACzC,IAAgC;gBAEhC,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,uBAAuB;iBACnC,CAAC,CAAC;YACL,CAAC;YACD,8CAA8C,CAC5C,IAA+B;gBAE/B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,6BAA6B,EAAE;oBACpE,IACE,IAAI,CAAC,MAAM;wBACX,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAC/D;wBACA,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI;4BACJ,SAAS,EAAE,mBAAmB;yBAC/B,CAAC,CAAC;qBACJ;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-misused-new.js","sourceRoot":"","sources":["../../src/rules/no-misused-new.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,qDAAqD;YAClE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;SACrB;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,qBAAqB,EAAE,iDAAiD;YACxE,iBAAiB,EAAE,uCAAuC;SAC3D;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ;;;WAGG;QACH,SAAS,oBAAoB,CAC3B,IAIa;YAEb,IAAI,IAAI,EAAE;gBACR,QAAQ,IAAI,CAAC,IAAI,EAAE;oBACjB,KAAK,mCAAc,CAAC,gBAAgB;wBAClC,OAAO,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBACnD,KAAK,mCAAc,CAAC,eAAe;wBACjC,OAAO,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC7C,KAAK,mCAAc,CAAC,UAAU;wBAC5B,OAAO,IAAI,CAAC,IAAI,CAAC;oBACnB;wBACE,MAAM;iBACT;aACF;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED;;;WAGG;QACH,SAAS,oBAAoB,CAC3B,MAAiC,EACjC,UAAiD;YAEjD,IACE,MAAM;gBACN,IAAI,IAAI,MAAM;gBACd,MAAM,CAAC,EAAE;gBACT,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,EAC5C;gBACA,OAAO,oBAAoB,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;aAC5D;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO;YACL,mDAAmD,CACjD,IAA8C;gBAE9C,IACE,oBAAoB,CAClB,IAAI,CAAC,MAAO,CAAC,MAAyC,EACtD,IAAI,CAAC,UAAU,CAChB,EACD;oBACA,cAAc;oBACd,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,uBAAuB;qBACnC,CAAC,CAAC;iBACJ;YACH,CAAC;YACD,2CAA2C,CACzC,IAAgC;gBAEhC,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,uBAAuB;iBACnC,CAAC,CAAC;YACL,CAAC;YACD,8CAA8C,CAC5C,IAA+B;gBAE/B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,6BAA6B,EAAE;oBACpE,IACE,IAAI,CAAC,MAAM;wBACX,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAC/D;wBACA,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI;4BACJ,SAAS,EAAE,mBAAmB;yBAC/B,CAAC,CAAC;qBACJ;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-promises.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-promises.js
index acaaca1..5c5b72f 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-promises.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-promises.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -66,7 +78,6 @@
         };
         const voidReturnChecks = {
             CallExpression: checkArguments,
-            OptionalCallExpression: checkArguments,
             NewExpression: checkArguments,
         };
         function checkTestConditional(node) {
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-promises.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-promises.js.map
index 097ee07..ae24636 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-promises.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-misused-promises.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-misused-promises.js","sourceRoot":"","sources":["../../src/rules/no-misused-promises.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-misused-promises.js","sourceRoot":"","sources":["../../src/rules/no-misused-promises.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,iDAAmC;AACnC,+CAAiC;AAEjC,8CAAgC;AAShC,kBAAe,IAAI,CAAC,UAAU,CAAwC;IACpE,IAAI,EAAE,qBAAqB;IAC3B,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,WAAW,EAAE,4DAA4D;YACzE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;YACpB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,UAAU,EACR,yEAAyE;YAC3E,WAAW,EAAE,sDAAsD;SACpE;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,kBAAkB,EAAE;wBAClB,IAAI,EAAE,SAAS;qBAChB;oBACD,gBAAgB,EAAE;wBAChB,IAAI,EAAE,SAAS;qBAChB;iBACF;aACF;SACF;QACD,IAAI,EAAE,SAAS;KAChB;IACD,cAAc,EAAE;QACd;YACE,kBAAkB,EAAE,IAAI;YACxB,gBAAgB,EAAE,IAAI;SACvB;KACF;IAED,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC;QACxD,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAExD,MAAM,iBAAiB,GAA0B;YAC/C,qBAAqB,EAAE,oBAAoB;YAC3C,gBAAgB,EAAE,oBAAoB;YACtC,YAAY,EAAE,oBAAoB;YAClC,WAAW,EAAE,oBAAoB;YACjC,iBAAiB,CAAC,IAAI;gBACpB,sEAAsE;gBACtE,qDAAqD;gBACrD,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;YACD,eAAe,CAAC,IAAI;gBAClB,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE;oBACzB,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACjC;YACH,CAAC;YACD,cAAc,EAAE,oBAAoB;SACrC,CAAC;QAEF,MAAM,gBAAgB,GAA0B;YAC9C,cAAc,EAAE,cAAc;YAC9B,aAAa,EAAE,cAAc;SAC9B,CAAC;QAEF,SAAS,oBAAoB,CAAC,IAE7B;YACC,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC7B;QACH,CAAC;QAED,SAAS,gBAAgB,CAAC,IAAyB;YACjD,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9D,IAAI,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;gBACrC,OAAO,CAAC,MAAM,CAAC;oBACb,SAAS,EAAE,aAAa;oBACxB,IAAI;iBACL,CAAC,CAAC;aACJ;QACH,CAAC;QAED,SAAS,cAAc,CACrB,IAAsD;YAEtD,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACvD,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE;gBACzB,OAAO;aACR;YAED,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE;gBACxD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;oBAC1B,SAAS;iBACV;gBAED,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAClE,IAAI,eAAe,CAAC,OAAO,EAAE,MAAuB,CAAC,EAAE;oBACrD,OAAO,CAAC,MAAM,CAAC;wBACb,SAAS,EAAE,YAAY;wBACvB,IAAI,EAAE,QAAQ;qBACf,CAAC,CAAC;iBACJ;aACF;QACH,CAAC;QAED,uCACK,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,GAC7C,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,EAC7C;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,8EAA8E;AAC9E,2EAA2E;AAC3E,+EAA+E;AAC/E,wBAAwB;AACxB,SAAS,gBAAgB,CAAC,OAAuB,EAAE,IAAa;IAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE7C,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE;QAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE7C,2EAA2E;QAC3E,SAAS;QACT,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,OAAO,KAAK,CAAC;SACd;QAED,wEAAwE;QACxE,uEAAuE;QACvE,gDAAgD;QAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,yBAAyB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACnE,IAAI,oBAAoB,GAAG,KAAK,CAAC;QACjC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;YACtD,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,iBAAiB,EAAE,EAAE;gBACnD,IACE,SAAS,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;oBACjC,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EACvD;oBACA,oBAAoB,GAAG,IAAI,CAAC;oBAC5B,MAAM;iBACP;aACF;YAED,mEAAmE;YACnE,4CAA4C;YAC5C,IAAI,oBAAoB,EAAE;gBACxB,MAAM;aACP;SACF;QAED,yEAAyE;QACzE,8BAA8B;QAC9B,IAAI,CAAC,oBAAoB,EAAE;YACzB,OAAO,KAAK,CAAC;SACd;KACF;IAED,4EAA4E;IAC5E,qCAAqC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CACtB,OAAuB,EACvB,KAAgB,EAChB,IAAa;IAEb,MAAM,IAAI,GAAwB,OAAO,CAAC,eAAe,CACvD,OAAO,CAAC,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,CAC/C,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;QAClD,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5C,OAAO,IAAI,CAAC;SACb;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yEAAyE;AACzE,6EAA6E;AAC7E,yBAAyB;AACzB,SAAS,kBAAkB,CACzB,OAAuB,EACvB,IAA0C;IAE1C,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAU,CAAC;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAExD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;QAClD,2EAA2E;QAC3E,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAC1C,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE;YAC7B,CAAC,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;QACrC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE;gBAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,yBAAyB,CAC5C,SAAS,EACT,IAAI,CAAC,UAAU,CAChB,CAAC;gBACF,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;oBAClD,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,iBAAiB,EAAE,EAAE;wBACnD,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;wBAC7C,IAAI,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;4BACxD,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;yBAC9B;6BAAM,IACL,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAC5D;4BACA,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;yBAClC;qBACF;iBACF;aACF;SACF;KACF;IAED,2EAA2E;IAC3E,wCAAwC;IACxC,KAAK,MAAM,QAAQ,IAAI,qBAAqB,EAAE;QAC5C,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;KACpC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,uEAAuE;AACvE,SAAS,eAAe,CACtB,OAAuB,EACvB,IAAmB;IAEnB,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtE,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;QAClD,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,iBAAiB,EAAE,EAAE;YACnD,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;YAC7C,IAAI,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE;gBACrD,OAAO,IAAI,CAAC;aACb;SACF;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-namespace.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-namespace.js
index ad0ec8e..cfd3d37 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-namespace.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-namespace.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -44,12 +56,18 @@
     ],
     create(context, [{ allowDeclarations, allowDefinitionFiles }]) {
         const filename = context.getFilename();
+        function isDeclaration(node) {
+            var _a;
+            return (node.declare === true ||
+                (((_a = node.parent.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.TSModuleDeclaration &&
+                    isDeclaration(node.parent.parent)));
+        }
         return {
             "TSModuleDeclaration[global!=true][id.type='Identifier']"(node) {
                 if ((node.parent &&
                     node.parent.type === experimental_utils_1.AST_NODE_TYPES.TSModuleDeclaration) ||
                     (allowDefinitionFiles && util.isDefinitionFile(filename)) ||
-                    (allowDeclarations && node.declare === true)) {
+                    (allowDeclarations && isDeclaration(node))) {
                     return;
                 }
                 context.report({
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-namespace.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-namespace.js.map
index d1b04f6..db4bd76 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-namespace.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-namespace.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-namespace.js","sourceRoot":"","sources":["../../src/rules/no-namespace.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAUhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,8DAA8D;YAChE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;SACrB;QACD,QAAQ,EAAE;YACR,uBAAuB,EACrB,kFAAkF;SACrF;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,iBAAiB,EAAE;wBACjB,IAAI,EAAE,SAAS;qBAChB;oBACD,oBAAoB,EAAE;wBACpB,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,iBAAiB,EAAE,KAAK;YACxB,oBAAoB,EAAE,IAAI;SAC3B;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAEvC,OAAO;YACL,yDAAyD,CACvD,IAAkC;gBAElC,IACE,CAAC,IAAI,CAAC,MAAM;oBACV,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,mBAAmB,CAAC;oBAC1D,CAAC,oBAAoB,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;oBACzD,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,EAC5C;oBACA,OAAO;iBACR;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,yBAAyB;iBACrC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-namespace.js","sourceRoot":"","sources":["../../src/rules/no-namespace.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAUhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,8DAA8D;YAChE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;SACrB;QACD,QAAQ,EAAE;YACR,uBAAuB,EACrB,kFAAkF;SACrF;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,iBAAiB,EAAE;wBACjB,IAAI,EAAE,SAAS;qBAChB;oBACD,oBAAoB,EAAE;wBACpB,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,iBAAiB,EAAE,KAAK;YACxB,oBAAoB,EAAE,IAAI;SAC3B;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAEvC,SAAS,aAAa,CAAC,IAAkC;;YACvD,OAAO,CACL,IAAI,CAAC,OAAO,KAAK,IAAI;gBACrB,CAAC,OAAA,IAAI,CAAC,MAAO,CAAC,MAAM,0CAAE,IAAI,MAAK,mCAAc,CAAC,mBAAmB;oBAC/D,aAAa,CAAC,IAAI,CAAC,MAAO,CAAC,MAAM,CAAC,CAAC,CACtC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,yDAAyD,CACvD,IAAkC;gBAElC,IACE,CAAC,IAAI,CAAC,MAAM;oBACV,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,mBAAmB,CAAC;oBAC1D,CAAC,oBAAoB,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;oBACzD,CAAC,iBAAiB,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,EAC1C;oBACA,OAAO;iBACR;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,yBAAyB;iBACrC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-asserted-optional-chain.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-asserted-optional-chain.js
index 2fbea0f..e86f3ce 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-asserted-optional-chain.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-asserted-optional-chain.js
@@ -1,13 +1,31 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const ts = __importStar(require("typescript"));
+const semver = __importStar(require("semver"));
 const util = __importStar(require("../util"));
+const is3dot9 = semver.satisfies(ts.version, `>= 3.9.0 || >= 3.9.1-rc || >= 3.9.0-beta`, {
+    includePrerelease: true,
+});
 exports.default = util.createRule({
     name: 'no-non-null-asserted-optional-chain',
     meta: {
@@ -15,7 +33,8 @@
         docs: {
             description: 'Disallows using a non-null assertion after an optional chain expression',
             category: 'Possible Errors',
-            recommended: false,
+            recommended: 'error',
+            suggestion: true,
         },
         messages: {
             noNonNullOptionalChain: 'Optional chain expressions can return undefined by design - using a non-null assertion is unsafe and wrong.',
@@ -25,8 +44,19 @@
     },
     defaultOptions: [],
     create(context) {
-        return {
-            'TSNonNullExpression > :matches(OptionalMemberExpression, OptionalCallExpression)'(node) {
+        // TS3.9 made a breaking change to how non-null works with optional chains.
+        // Pre-3.9,  `x?.y!.z` means `(x?.y).z` - i.e. it essentially scrubbed the optionality from the chain
+        // Post-3.9, `x?.y!.z` means `x?.y!.z`  - i.e. it just asserts that the property `y` is non-null, not the result of `x?.y`.
+        // This means that for > 3.9, x?.y!.z is valid!
+        //
+        // NOTE: these cases are still invalid for 3.9:
+        // - x?.y.z!
+        // - (x?.y)!.z
+        const baseSelectors = {
+            // non-nulling a wrapped chain will scrub all nulls introduced by the chain
+            // (x?.y)!
+            // (x?.())!
+            'TSNonNullExpression > ChainExpression'(node) {
                 // selector guarantees this assertion
                 const parent = node.parent;
                 context.report({
@@ -46,7 +76,71 @@
                     ],
                 });
             },
+            // non-nulling at the end of a chain will scrub all nulls introduced by the chain
+            // x?.y!
+            // x?.()!
+            'ChainExpression > TSNonNullExpression'(node) {
+                context.report({
+                    node,
+                    messageId: 'noNonNullOptionalChain',
+                    // use a suggestion instead of a fixer, because this can obviously break type checks
+                    suggest: [
+                        {
+                            messageId: 'suggestRemovingNonNull',
+                            fix(fixer) {
+                                return fixer.removeRange([node.range[1] - 1, node.range[1]]);
+                            },
+                        },
+                    ],
+                });
+            },
         };
+        if (is3dot9) {
+            return baseSelectors;
+        }
+        return Object.assign(Object.assign({}, baseSelectors), { [[
+                // > :not(ChainExpression) because that case is handled by a previous selector
+                'MemberExpression > TSNonNullExpression.object > :not(ChainExpression)',
+                'CallExpression > TSNonNullExpression.callee > :not(ChainExpression)',
+            ].join(', ')](child) {
+                // selector guarantees this assertion
+                const node = child.parent;
+                let current = child;
+                while (current) {
+                    switch (current.type) {
+                        case experimental_utils_1.AST_NODE_TYPES.MemberExpression:
+                            if (current.optional) {
+                                // found an optional chain! stop traversing
+                                break;
+                            }
+                            current = current.object;
+                            continue;
+                        case experimental_utils_1.AST_NODE_TYPES.CallExpression:
+                            if (current.optional) {
+                                // found an optional chain! stop traversing
+                                break;
+                            }
+                            current = current.callee;
+                            continue;
+                        default:
+                            // something that's not a ChainElement, which means this is not an optional chain we want to check
+                            return;
+                    }
+                }
+                context.report({
+                    node,
+                    messageId: 'noNonNullOptionalChain',
+                    // use a suggestion instead of a fixer, because this can obviously break type checks
+                    suggest: [
+                        {
+                            messageId: 'suggestRemovingNonNull',
+                            fix(fixer) {
+                                return fixer.removeRange([node.range[1] - 1, node.range[1]]);
+                            },
+                        },
+                    ],
+                });
+            } });
     },
 });
 //# sourceMappingURL=no-non-null-asserted-optional-chain.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-asserted-optional-chain.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-asserted-optional-chain.js.map
index 63375b6..21f4056 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-asserted-optional-chain.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-asserted-optional-chain.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-non-null-asserted-optional-chain.js","sourceRoot":"","sources":["../../src/rules/no-non-null-asserted-optional-chain.ts"],"names":[],"mappings":";;;;;;;;;AACA,8CAAgC;AAIhC,kBAAe,IAAI,CAAC,UAAU,CAAiB;IAC7C,IAAI,EAAE,qCAAqC;IAC3C,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,yEAAyE;YAC3E,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,KAAK;SACnB;QACD,QAAQ,EAAE;YACR,sBAAsB,EACpB,6GAA6G;YAC/G,sBAAsB,EAAE,2CAA2C;SACpE;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,kFAAkF,CAChF,IAEqC;gBAErC,qCAAqC;gBACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAsC,CAAC;gBAC3D,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,wBAAwB;oBACnC,oFAAoF;oBACpF,OAAO,EAAE;wBACP;4BACE,SAAS,EAAE,wBAAwB;4BACnC,GAAG,CAAC,KAAK;gCACP,OAAO,KAAK,CAAC,WAAW,CAAC;oCACvB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;oCACnB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;iCAChB,CAAC,CAAC;4BACL,CAAC;yBACF;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-non-null-asserted-optional-chain.js","sourceRoot":"","sources":["../../src/rules/no-non-null-asserted-optional-chain.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-assertion.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-assertion.js
index e9e0333..82ab1fd 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-assertion.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-assertion.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -17,6 +29,7 @@
             description: 'Disallows non-null assertions using the `!` postfix operator',
             category: 'Stylistic Issues',
             recommended: 'warn',
+            suggestion: true,
         },
         messages: {
             noNonNull: 'Forbidden non-null assertion.',
@@ -29,6 +42,7 @@
         const sourceCode = context.getSourceCode();
         return {
             TSNonNullExpression(node) {
+                var _a, _b;
                 const suggest = [];
                 function convertTokenToOptional(replacement) {
                     return (fixer) => {
@@ -48,60 +62,56 @@
                         return null;
                     };
                 }
-                if (node.parent) {
-                    if ((node.parent.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression ||
-                        node.parent.type === experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression) &&
-                        node.parent.object === node) {
-                        if (!node.parent.optional) {
-                            if (node.parent.computed) {
-                                // it is x![y]?.z
-                                suggest.push({
-                                    messageId: 'suggestOptionalChain',
-                                    fix: convertTokenToOptional('?.'),
-                                });
-                            }
-                            else {
-                                // it is x!.y?.z
-                                suggest.push({
-                                    messageId: 'suggestOptionalChain',
-                                    fix: convertTokenToOptional('?'),
-                                });
-                            }
-                        }
-                        else {
-                            if (node.parent.computed) {
-                                // it is x!?.[y].z
-                                suggest.push({
-                                    messageId: 'suggestOptionalChain',
-                                    fix: removeToken(),
-                                });
-                            }
-                            else {
-                                // it is x!?.y.z
-                                suggest.push({
-                                    messageId: 'suggestOptionalChain',
-                                    fix: removeToken(),
-                                });
-                            }
-                        }
-                    }
-                    else if ((node.parent.type === experimental_utils_1.AST_NODE_TYPES.CallExpression ||
-                        node.parent.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression) &&
-                        node.parent.callee === node) {
-                        if (!node.parent.optional) {
-                            // it is x.y?.z!()
+                if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.MemberExpression &&
+                    node.parent.object === node) {
+                    if (!node.parent.optional) {
+                        if (node.parent.computed) {
+                            // it is x![y]?.z
                             suggest.push({
                                 messageId: 'suggestOptionalChain',
                                 fix: convertTokenToOptional('?.'),
                             });
                         }
                         else {
-                            // it is x.y.z!?.()
+                            // it is x!.y?.z
+                            suggest.push({
+                                messageId: 'suggestOptionalChain',
+                                fix: convertTokenToOptional('?'),
+                            });
+                        }
+                    }
+                    else {
+                        if (node.parent.computed) {
+                            // it is x!?.[y].z
                             suggest.push({
                                 messageId: 'suggestOptionalChain',
                                 fix: removeToken(),
                             });
                         }
+                        else {
+                            // it is x!?.y.z
+                            suggest.push({
+                                messageId: 'suggestOptionalChain',
+                                fix: removeToken(),
+                            });
+                        }
+                    }
+                }
+                else if (((_b = node.parent) === null || _b === void 0 ? void 0 : _b.type) === experimental_utils_1.AST_NODE_TYPES.CallExpression &&
+                    node.parent.callee === node) {
+                    if (!node.parent.optional) {
+                        // it is x.y?.z!()
+                        suggest.push({
+                            messageId: 'suggestOptionalChain',
+                            fix: convertTokenToOptional('?.'),
+                        });
+                    }
+                    else {
+                        // it is x.y.z!?.()
+                        suggest.push({
+                            messageId: 'suggestOptionalChain',
+                            fix: removeToken(),
+                        });
                     }
                 }
                 context.report({
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-assertion.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-assertion.js.map
index 4a3b4d2..4f1d31d 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-assertion.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-non-null-assertion.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-non-null-assertion.js","sourceRoot":"","sources":["../../src/rules/no-non-null-assertion.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-non-null-assertion.js","sourceRoot":"","sources":["../../src/rules/no-non-null-assertion.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAIhC,kBAAe,IAAI,CAAC,UAAU,CAAiB;IAC7C,IAAI,EAAE,uBAAuB;IAC7B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,8DAA8D;YAChE,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,MAAM;YACnB,UAAU,EAAE,IAAI;SACjB;QACD,QAAQ,EAAE;YACR,SAAS,EAAE,+BAA+B;YAC1C,oBAAoB,EAClB,mKAAmK;SACtK;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3C,OAAO;YACL,mBAAmB,CAAC,IAAI;;gBACtB,MAAM,OAAO,GAA+C,EAAE,CAAC;gBAC/D,SAAS,sBAAsB,CAC7B,WAAuB;oBAEvB,OAAO,CAAC,KAAyB,EAA2B,EAAE;wBAC5D,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,CACvC,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,4BAA4B,CAClC,CAAC;wBACF,IAAI,QAAQ,EAAE;4BACZ,OAAO,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;yBACjD;wBAED,OAAO,IAAI,CAAC;oBACd,CAAC,CAAC;gBACJ,CAAC;gBACD,SAAS,WAAW;oBAClB,OAAO,CAAC,KAAyB,EAA2B,EAAE;wBAC5D,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,CACvC,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,4BAA4B,CAClC,CAAC;wBACF,IAAI,QAAQ,EAAE;4BACZ,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;yBAC/B;wBAED,OAAO,IAAI,CAAC;oBACd,CAAC,CAAC;gBACJ,CAAC;gBAED,IACE,OAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,MAAK,mCAAc,CAAC,gBAAgB;oBACrD,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,EAC3B;oBACA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;wBACzB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;4BACxB,iBAAiB;4BACjB,OAAO,CAAC,IAAI,CAAC;gCACX,SAAS,EAAE,sBAAsB;gCACjC,GAAG,EAAE,sBAAsB,CAAC,IAAI,CAAC;6BAClC,CAAC,CAAC;yBACJ;6BAAM;4BACL,gBAAgB;4BAChB,OAAO,CAAC,IAAI,CAAC;gCACX,SAAS,EAAE,sBAAsB;gCACjC,GAAG,EAAE,sBAAsB,CAAC,GAAG,CAAC;6BACjC,CAAC,CAAC;yBACJ;qBACF;yBAAM;wBACL,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;4BACxB,kBAAkB;4BAClB,OAAO,CAAC,IAAI,CAAC;gCACX,SAAS,EAAE,sBAAsB;gCACjC,GAAG,EAAE,WAAW,EAAE;6BACnB,CAAC,CAAC;yBACJ;6BAAM;4BACL,gBAAgB;4BAChB,OAAO,CAAC,IAAI,CAAC;gCACX,SAAS,EAAE,sBAAsB;gCACjC,GAAG,EAAE,WAAW,EAAE;6BACnB,CAAC,CAAC;yBACJ;qBACF;iBACF;qBAAM,IACL,OAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,MAAK,mCAAc,CAAC,cAAc;oBACnD,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,EAC3B;oBACA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;wBACzB,kBAAkB;wBAClB,OAAO,CAAC,IAAI,CAAC;4BACX,SAAS,EAAE,sBAAsB;4BACjC,GAAG,EAAE,sBAAsB,CAAC,IAAI,CAAC;yBAClC,CAAC,CAAC;qBACJ;yBAAM;wBACL,mBAAmB;wBACnB,OAAO,CAAC,IAAI,CAAC;4BACX,SAAS,EAAE,sBAAsB;4BACjC,GAAG,EAAE,WAAW,EAAE;yBACnB,CAAC,CAAC;qBACJ;iBACF;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,WAAW;oBACtB,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-parameter-properties.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-parameter-properties.js
index daef997..7e7a10b 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-parameter-properties.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-parameter-properties.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-parameter-properties.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-parameter-properties.js.map
index 43e9a71..3a15f4c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-parameter-properties.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-parameter-properties.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-parameter-properties.js","sourceRoot":"","sources":["../../src/rules/no-parameter-properties.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAiBhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,yBAAyB;IAC/B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,gEAAgE;YAClE,QAAQ,EAAE,kBAAkB;YAC5B,oCAAoC;YACpC,WAAW,EAAE,KAAK;SACnB;QACD,QAAQ,EAAE;YACR,WAAW,EACT,+DAA+D;SAClE;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE;wBACN,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACL,IAAI,EAAE;gCACJ,UAAU;gCACV,SAAS;gCACT,WAAW;gCACX,QAAQ;gCACR,kBAAkB;gCAClB,oBAAoB;gCACpB,iBAAiB;6BAClB;yBACF;wBACD,QAAQ,EAAE,CAAC;qBACZ;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,MAAM,EAAE,EAAE;SACX;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B;;;WAGG;QACH,SAAS,YAAY,CAAC,IAAkC;YACtD,MAAM,SAAS,GAAe,EAAE,CAAC;YAEjC,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;aACpC;YACD,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aAC5B;YAED,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAa,CAAC;QACzD,CAAC;QAED,OAAO;YACL,mBAAmB,CAAC,IAAI;gBACtB,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;gBAErC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;oBAC/B,0DAA0D;oBAC1D,IACE,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;wBACjD,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,iBAAiB,EACxD;wBACA,OAAO;qBACR;oBAED,MAAM,IAAI,GACR,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;wBAC/C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI;wBACrB,CAAC,CAAC,qDAAqD;4BACpD,IAAI,CAAC,SAAS,CAAC,IAA4B,CAAC,IAAI,CAAC;oBAExD,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,aAAa;wBACxB,IAAI,EAAE;4BACJ,SAAS,EAAE,IAAI;yBAChB;qBACF,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-parameter-properties.js","sourceRoot":"","sources":["../../src/rules/no-parameter-properties.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAiBhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,yBAAyB;IAC/B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,gEAAgE;YAClE,QAAQ,EAAE,kBAAkB;YAC5B,oCAAoC;YACpC,WAAW,EAAE,KAAK;SACnB;QACD,QAAQ,EAAE;YACR,WAAW,EACT,+DAA+D;SAClE;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE;wBACN,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACL,IAAI,EAAE;gCACJ,UAAU;gCACV,SAAS;gCACT,WAAW;gCACX,QAAQ;gCACR,kBAAkB;gCAClB,oBAAoB;gCACpB,iBAAiB;6BAClB;yBACF;wBACD,QAAQ,EAAE,CAAC;qBACZ;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,MAAM,EAAE,EAAE;SACX;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B;;;WAGG;QACH,SAAS,YAAY,CAAC,IAAkC;YACtD,MAAM,SAAS,GAAe,EAAE,CAAC;YAEjC,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;aACpC;YACD,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aAC5B;YAED,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAa,CAAC;QACzD,CAAC;QAED,OAAO;YACL,mBAAmB,CAAC,IAAI;gBACtB,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;gBAErC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;oBAC/B,0DAA0D;oBAC1D,IACE,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;wBACjD,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,iBAAiB,EACxD;wBACA,OAAO;qBACR;oBAED,MAAM,IAAI,GACR,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;wBAC/C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI;wBACrB,CAAC,CAAC,qDAAqD;4BACpD,IAAI,CAAC,SAAS,CAAC,IAA4B,CAAC,IAAI,CAAC;oBAExD,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,aAAa;wBACxB,IAAI,EAAE;4BACJ,SAAS,EAAE,IAAI;yBAChB;qBACF,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-redeclare.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-redeclare.js
new file mode 100644
index 0000000..ccea8a9
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-redeclare.js
@@ -0,0 +1,224 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const util = __importStar(require("../util"));
+// https://github.com/lodash/lodash/blob/86a852fe763935bb64c12589df5391fd7d3bb14d/escapeRegExp.js
+const reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
+const reHasRegExpChar = RegExp(reRegExpChar.source);
+function escapeRegExp(str) {
+    return str && reHasRegExpChar.test(str)
+        ? str.replace(reRegExpChar, '\\$&')
+        : str || '';
+}
+function getNameLocationInGlobalDirectiveComment(sourceCode, comment, name) {
+    const namePattern = new RegExp(`[\\s,]${escapeRegExp(name)}(?:$|[\\s,:])`, 'gu');
+    // To ignore the first text "global".
+    namePattern.lastIndex = comment.value.indexOf('global') + 6;
+    // Search a given variable name.
+    const match = namePattern.exec(comment.value);
+    // Convert the index to loc.
+    const start = sourceCode.getLocFromIndex(comment.range[0] + '/*'.length + (match ? match.index + 1 : 0));
+    const end = {
+        line: start.line,
+        column: start.column + (match ? name.length : 1),
+    };
+    return { start, end };
+}
+exports.default = util.createRule({
+    name: 'no-redeclare',
+    meta: {
+        type: 'suggestion',
+        docs: {
+            description: 'Disallow variable redeclaration',
+            category: 'Best Practices',
+            recommended: false,
+            extendsBaseRule: true,
+        },
+        schema: [
+            {
+                type: 'object',
+                properties: {
+                    builtinGlobals: {
+                        type: 'boolean',
+                    },
+                    ignoreDeclarationMerge: {
+                        type: 'boolean',
+                    },
+                },
+                additionalProperties: false,
+            },
+        ],
+        messages: {
+            redeclared: "'{{id}}' is already defined.",
+            redeclaredAsBuiltin: "'{{id}}' is already defined as a built-in global variable.",
+            redeclaredBySyntax: "'{{id}}' is already defined by a variable declaration.",
+        },
+    },
+    defaultOptions: [
+        {
+            builtinGlobals: true,
+            ignoreDeclarationMerge: true,
+        },
+    ],
+    create(context, [options]) {
+        const sourceCode = context.getSourceCode();
+        const CLASS_DECLARATION_MERGE_NODES = new Set([
+            experimental_utils_1.AST_NODE_TYPES.TSInterfaceDeclaration,
+            experimental_utils_1.AST_NODE_TYPES.TSModuleDeclaration,
+            experimental_utils_1.AST_NODE_TYPES.ClassDeclaration,
+        ]);
+        const FUNCTION_DECLARATION_MERGE_NODES = new Set([
+            experimental_utils_1.AST_NODE_TYPES.TSModuleDeclaration,
+            experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration,
+        ]);
+        function* iterateDeclarations(variable) {
+            if ((options === null || options === void 0 ? void 0 : options.builtinGlobals) &&
+                'eslintImplicitGlobalSetting' in variable &&
+                (variable.eslintImplicitGlobalSetting === 'readonly' ||
+                    variable.eslintImplicitGlobalSetting === 'writable')) {
+                yield { type: 'builtin' };
+            }
+            if ('eslintExplicitGlobalComments' in variable &&
+                variable.eslintExplicitGlobalComments) {
+                for (const comment of variable.eslintExplicitGlobalComments) {
+                    yield {
+                        type: 'comment',
+                        node: comment,
+                        loc: getNameLocationInGlobalDirectiveComment(sourceCode, comment, variable.name),
+                    };
+                }
+            }
+            const identifiers = variable.identifiers
+                .map(id => ({
+                identifier: id,
+                parent: id.parent,
+            }))
+                // ignore function declarations because TS will treat them as an overload
+                .filter(({ parent }) => parent.type !== experimental_utils_1.AST_NODE_TYPES.TSDeclareFunction);
+            if (options.ignoreDeclarationMerge && identifiers.length > 1) {
+                if (
+                // interfaces merging
+                identifiers.every(({ parent }) => parent.type === experimental_utils_1.AST_NODE_TYPES.TSInterfaceDeclaration)) {
+                    return;
+                }
+                if (
+                // namespace/module merging
+                identifiers.every(({ parent }) => parent.type === experimental_utils_1.AST_NODE_TYPES.TSModuleDeclaration)) {
+                    return;
+                }
+                if (
+                // class + interface/namespace merging
+                identifiers.every(({ parent }) => CLASS_DECLARATION_MERGE_NODES.has(parent.type))) {
+                    const classDecls = identifiers.filter(({ parent }) => parent.type === experimental_utils_1.AST_NODE_TYPES.ClassDeclaration);
+                    if (classDecls.length === 1) {
+                        // safe declaration merging
+                        return;
+                    }
+                    // there's more than one class declaration, which needs to be reported
+                    for (const { identifier } of classDecls) {
+                        yield { type: 'syntax', node: identifier, loc: identifier.loc };
+                    }
+                    return;
+                }
+                if (
+                // class + interface/namespace merging
+                identifiers.every(({ parent }) => FUNCTION_DECLARATION_MERGE_NODES.has(parent.type))) {
+                    const functionDecls = identifiers.filter(({ parent }) => parent.type === experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration);
+                    if (functionDecls.length === 1) {
+                        // safe declaration merging
+                        return;
+                    }
+                    // there's more than one class declaration, which needs to be reported
+                    for (const { identifier } of functionDecls) {
+                        yield { type: 'syntax', node: identifier, loc: identifier.loc };
+                    }
+                    return;
+                }
+            }
+            for (const { identifier } of identifiers) {
+                yield { type: 'syntax', node: identifier, loc: identifier.loc };
+            }
+        }
+        function findVariablesInScope(scope) {
+            for (const variable of scope.variables) {
+                const [declaration, ...extraDeclarations] = iterateDeclarations(variable);
+                if (extraDeclarations.length === 0) {
+                    continue;
+                }
+                /*
+                 * If the type of a declaration is different from the type of
+                 * the first declaration, it shows the location of the first
+                 * declaration.
+                 */
+                const detailMessageId = declaration.type === 'builtin'
+                    ? 'redeclaredAsBuiltin'
+                    : 'redeclaredBySyntax';
+                const data = { id: variable.name };
+                // Report extra declarations.
+                for (const { type, node, loc } of extraDeclarations) {
+                    const messageId = type === declaration.type ? 'redeclared' : detailMessageId;
+                    if (node) {
+                        context.report({ node, loc, messageId, data });
+                    }
+                    else if (loc) {
+                        context.report({ loc, messageId, data });
+                    }
+                }
+            }
+        }
+        /**
+         * Find variables in the current scope.
+         */
+        function checkForBlock(node) {
+            const scope = context.getScope();
+            /*
+             * In ES5, some node type such as `BlockStatement` doesn't have that scope.
+             * `scope.block` is a different node in such a case.
+             */
+            if (scope.block === node) {
+                findVariablesInScope(scope);
+            }
+        }
+        return {
+            Program() {
+                const scope = context.getScope();
+                findVariablesInScope(scope);
+                // Node.js or ES modules has a special scope.
+                if (scope.type === 'global' &&
+                    scope.childScopes[0] &&
+                    // The special scope's block is the Program node.
+                    scope.block === scope.childScopes[0].block) {
+                    findVariablesInScope(scope.childScopes[0]);
+                }
+            },
+            FunctionDeclaration: checkForBlock,
+            FunctionExpression: checkForBlock,
+            ArrowFunctionExpression: checkForBlock,
+            BlockStatement: checkForBlock,
+            ForStatement: checkForBlock,
+            ForInStatement: checkForBlock,
+            ForOfStatement: checkForBlock,
+            SwitchStatement: checkForBlock,
+        };
+    },
+});
+//# sourceMappingURL=no-redeclare.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-redeclare.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-redeclare.js.map
new file mode 100644
index 0000000..38aac7a
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-redeclare.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"no-redeclare.js","sourceRoot":"","sources":["../../src/rules/no-redeclare.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAI+C;AAC/C,8CAAgC;AAUhC,iGAAiG;AACjG,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAC3C,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AACpD,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;QACrC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACnC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,uCAAuC,CAC9C,UAA+B,EAC/B,OAAyB,EACzB,IAAY;IAEZ,MAAM,WAAW,GAAG,IAAI,MAAM,CAC5B,SAAS,YAAY,CAAC,IAAI,CAAC,eAAe,EAC1C,IAAI,CACL,CAAC;IAEF,qCAAqC;IACrC,WAAW,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE5D,gCAAgC;IAChC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAE9C,4BAA4B;IAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,eAAe,CACtC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC/D,CAAC;IACF,MAAM,GAAG,GAAG;QACV,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;KACjD,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC;AAED,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,iCAAiC;YAC9C,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,cAAc,EAAE;wBACd,IAAI,EAAE,SAAS;qBAChB;oBACD,sBAAsB,EAAE;wBACtB,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;QACD,QAAQ,EAAE;YACR,UAAU,EAAE,8BAA8B;YAC1C,mBAAmB,EACjB,4DAA4D;YAC9D,kBAAkB,EAChB,wDAAwD;SAC3D;KACF;IACD,cAAc,EAAE;QACd;YACE,cAAc,EAAE,IAAI;YACpB,sBAAsB,EAAE,IAAI;SAC7B;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC;QACvB,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAE3C,MAAM,6BAA6B,GAAG,IAAI,GAAG,CAAiB;YAC5D,mCAAc,CAAC,sBAAsB;YACrC,mCAAc,CAAC,mBAAmB;YAClC,mCAAc,CAAC,gBAAgB;SAChC,CAAC,CAAC;QACH,MAAM,gCAAgC,GAAG,IAAI,GAAG,CAAiB;YAC/D,mCAAc,CAAC,mBAAmB;YAClC,mCAAc,CAAC,mBAAmB;SACnC,CAAC,CAAC;QAEH,QAAQ,CAAC,CAAC,mBAAmB,CAC3B,QAAiC;YAUjC,IACE,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc;gBACvB,6BAA6B,IAAI,QAAQ;gBACzC,CAAC,QAAQ,CAAC,2BAA2B,KAAK,UAAU;oBAClD,QAAQ,CAAC,2BAA2B,KAAK,UAAU,CAAC,EACtD;gBACA,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;aAC3B;YAED,IACE,8BAA8B,IAAI,QAAQ;gBAC1C,QAAQ,CAAC,4BAA4B,EACrC;gBACA,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,4BAA4B,EAAE;oBAC3D,MAAM;wBACJ,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,OAAO;wBACb,GAAG,EAAE,uCAAuC,CAC1C,UAAU,EACV,OAAO,EACP,QAAQ,CAAC,IAAI,CACd;qBACF,CAAC;iBACH;aACF;YAED,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW;iBACrC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACV,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE,EAAE,CAAC,MAAO;aACnB,CAAC,CAAC;gBACH,yEAAyE;iBACxE,MAAM,CACL,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,iBAAiB,CACjE,CAAC;YAEJ,IAAI,OAAO,CAAC,sBAAsB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC5D;gBACE,qBAAqB;gBACrB,WAAW,CAAC,KAAK,CACf,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CACb,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,sBAAsB,CACxD,EACD;oBACA,OAAO;iBACR;gBAED;gBACE,2BAA2B;gBAC3B,WAAW,CAAC,KAAK,CACf,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,mBAAmB,CACnE,EACD;oBACA,OAAO;iBACR;gBAED;gBACE,sCAAsC;gBACtC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAC/B,6BAA6B,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAC/C,EACD;oBACA,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CACnC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,gBAAgB,CAChE,CAAC;oBACF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;wBAC3B,2BAA2B;wBAC3B,OAAO;qBACR;oBAED,sEAAsE;oBACtE,KAAK,MAAM,EAAE,UAAU,EAAE,IAAI,UAAU,EAAE;wBACvC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC;qBACjE;oBACD,OAAO;iBACR;gBAED;gBACE,sCAAsC;gBACtC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAC/B,gCAAgC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAClD,EACD;oBACA,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CACtC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,mBAAmB,CACnE,CAAC;oBACF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;wBAC9B,2BAA2B;wBAC3B,OAAO;qBACR;oBAED,sEAAsE;oBACtE,KAAK,MAAM,EAAE,UAAU,EAAE,IAAI,aAAa,EAAE;wBAC1C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC;qBACjE;oBACD,OAAO;iBACR;aACF;YAED,KAAK,MAAM,EAAE,UAAU,EAAE,IAAI,WAAW,EAAE;gBACxC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC;aACjE;QACH,CAAC;QAED,SAAS,oBAAoB,CAAC,KAA2B;YACvD,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE;gBACtC,MAAM,CAAC,WAAW,EAAE,GAAG,iBAAiB,CAAC,GAAG,mBAAmB,CAC7D,QAAQ,CACT,CAAC;gBAEF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE;oBAClC,SAAS;iBACV;gBAED;;;;mBAIG;gBACH,MAAM,eAAe,GACnB,WAAW,CAAC,IAAI,KAAK,SAAS;oBAC5B,CAAC,CAAC,qBAAqB;oBACvB,CAAC,CAAC,oBAAoB,CAAC;gBAC3B,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAEnC,6BAA6B;gBAC7B,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,iBAAiB,EAAE;oBACnD,MAAM,SAAS,GACb,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC;oBAE7D,IAAI,IAAI,EAAE;wBACR,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;qBAChD;yBAAM,IAAI,GAAG,EAAE;wBACd,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC1C;iBACF;aACF;QACH,CAAC;QAED;;WAEG;QACH,SAAS,aAAa,CAAC,IAAmB;YACxC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YAEjC;;;eAGG;YACH,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE;gBACxB,oBAAoB,CAAC,KAAK,CAAC,CAAC;aAC7B;QACH,CAAC;QAED,OAAO;YACL,OAAO;gBACL,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAEjC,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBAE5B,6CAA6C;gBAC7C,IACE,KAAK,CAAC,IAAI,KAAK,QAAQ;oBACvB,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;oBACpB,iDAAiD;oBACjD,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,EAC1C;oBACA,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC5C;YACH,CAAC;YAED,mBAAmB,EAAE,aAAa;YAClC,kBAAkB,EAAE,aAAa;YACjC,uBAAuB,EAAE,aAAa;YAEtC,cAAc,EAAE,aAAa;YAC7B,YAAY,EAAE,aAAa;YAC3B,cAAc,EAAE,aAAa;YAC7B,cAAc,EAAE,aAAa;YAC7B,eAAe,EAAE,aAAa;SAC/B,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-require-imports.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-require-imports.js
index 1439b2b..3bf5f6b 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-require-imports.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-require-imports.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -25,7 +37,7 @@
     defaultOptions: [],
     create(context) {
         return {
-            ':matches(CallExpression, OptionalCallExpression) > Identifier[name="require"]'(node) {
+            'CallExpression > Identifier[name="require"]'(node) {
                 context.report({
                     node: node.parent,
                     messageId: 'noRequireImports',
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-require-imports.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-require-imports.js.map
index c3f3da7..48ae71e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-require-imports.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-require-imports.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-require-imports.js","sourceRoot":"","sources":["../../src/rules/no-require-imports.ts"],"names":[],"mappings":";;;;;;;;;AACA,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,qCAAqC;YAClD,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;SACnB;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,gBAAgB,EAAE,0CAA0C;SAC7D;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,+EAA+E,CAC7E,IAAyB;gBAEzB,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,IAAI,CAAC,MAAO;oBAClB,SAAS,EAAE,kBAAkB;iBAC9B,CAAC,CAAC;YACL,CAAC;YACD,yBAAyB,CAAC,IAAI;gBAC5B,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,kBAAkB;iBAC9B,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-require-imports.js","sourceRoot":"","sources":["../../src/rules/no-require-imports.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,qCAAqC;YAClD,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;SACnB;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,gBAAgB,EAAE,0CAA0C;SAC7D;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,6CAA6C,CAC3C,IAAyB;gBAEzB,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,IAAI,CAAC,MAAO;oBAClB,SAAS,EAAE,kBAAkB;iBAC9B,CAAC,CAAC;YACL,CAAC;YACD,yBAAyB,CAAC,IAAI;gBAC5B,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,kBAAkB;iBAC9B,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-shadow.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-shadow.js
new file mode 100644
index 0000000..e70d5c1
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-shadow.js
@@ -0,0 +1,278 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const util = __importStar(require("../util"));
+exports.default = util.createRule({
+    name: 'no-shadow',
+    meta: {
+        type: 'suggestion',
+        docs: {
+            description: 'Disallow variable declarations from shadowing variables declared in the outer scope',
+            category: 'Variables',
+            recommended: false,
+            extendsBaseRule: true,
+        },
+        schema: [
+            {
+                type: 'object',
+                properties: {
+                    builtinGlobals: {
+                        type: 'boolean',
+                    },
+                    hoist: {
+                        enum: ['all', 'functions', 'never'],
+                    },
+                    allow: {
+                        type: 'array',
+                        items: {
+                            type: 'string',
+                        },
+                    },
+                    ignoreTypeValueShadow: {
+                        type: 'boolean',
+                    },
+                    ignoreFunctionTypeParameterNameValueShadow: {
+                        type: 'boolean',
+                    },
+                },
+                additionalProperties: false,
+            },
+        ],
+        messages: {
+            noShadow: "'{{name}}' is already declared in the upper scope.",
+        },
+    },
+    defaultOptions: [
+        {
+            allow: [],
+            builtinGlobals: false,
+            hoist: 'functions',
+            ignoreTypeValueShadow: true,
+            ignoreFunctionTypeParameterNameValueShadow: true,
+        },
+    ],
+    create(context, [options]) {
+        /**
+         * Check if variable is a `this` parameter.
+         */
+        function isThisParam(variable) {
+            return variable.defs[0].type === 'Parameter' && variable.name === 'this';
+        }
+        function isTypeValueShadow(variable, shadowed) {
+            if (options.ignoreTypeValueShadow !== true) {
+                return false;
+            }
+            if (!('isValueVariable' in variable)) {
+                // this shouldn't happen...
+                return false;
+            }
+            const isShadowedValue = 'isValueVariable' in shadowed ? shadowed.isValueVariable : true;
+            return variable.isValueVariable !== isShadowedValue;
+        }
+        function isFunctionTypeParameterNameValueShadow(variable, shadowed) {
+            if (options.ignoreFunctionTypeParameterNameValueShadow !== true) {
+                return false;
+            }
+            if (!('isValueVariable' in variable)) {
+                // this shouldn't happen...
+                return false;
+            }
+            const isShadowedValue = 'isValueVariable' in shadowed ? shadowed.isValueVariable : true;
+            if (!isShadowedValue) {
+                return false;
+            }
+            const id = variable.identifiers[0];
+            return util.isFunctionType(id.parent);
+        }
+        /**
+         * Check if variable name is allowed.
+         * @param variable The variable to check.
+         * @returns Whether or not the variable name is allowed.
+         */
+        function isAllowed(variable) {
+            return options.allow.indexOf(variable.name) !== -1;
+        }
+        /**
+         * Checks if a variable of the class name in the class scope of ClassDeclaration.
+         *
+         * ClassDeclaration creates two variables of its name into its outer scope and its class scope.
+         * So we should ignore the variable in the class scope.
+         * @param variable The variable to check.
+         * @returns Whether or not the variable of the class name in the class scope of ClassDeclaration.
+         */
+        function isDuplicatedClassNameVariable(variable) {
+            const block = variable.scope.block;
+            return (block.type === experimental_utils_1.AST_NODE_TYPES.ClassDeclaration &&
+                block.id === variable.identifiers[0]);
+        }
+        /**
+         * Checks if a variable of the class name in the class scope of TSEnumDeclaration.
+         *
+         * TSEnumDeclaration creates two variables of its name into its outer scope and its class scope.
+         * So we should ignore the variable in the class scope.
+         * @param variable The variable to check.
+         * @returns Whether or not the variable of the class name in the class scope of TSEnumDeclaration.
+         */
+        function isDuplicatedEnumNameVariable(variable) {
+            const block = variable.scope.block;
+            return (block.type === experimental_utils_1.AST_NODE_TYPES.TSEnumDeclaration &&
+                block.id === variable.identifiers[0]);
+        }
+        /**
+         * Checks if a variable is inside the initializer of scopeVar.
+         *
+         * To avoid reporting at declarations such as `var a = function a() {};`.
+         * But it should report `var a = function(a) {};` or `var a = function() { function a() {} };`.
+         * @param variable The variable to check.
+         * @param scopeVar The scope variable to look for.
+         * @returns Whether or not the variable is inside initializer of scopeVar.
+         */
+        function isOnInitializer(variable, scopeVar) {
+            var _a;
+            const outerScope = scopeVar.scope;
+            const outerDef = scopeVar.defs[0];
+            const outer = (_a = outerDef === null || outerDef === void 0 ? void 0 : outerDef.parent) === null || _a === void 0 ? void 0 : _a.range;
+            const innerScope = variable.scope;
+            const innerDef = variable.defs[0];
+            const inner = innerDef === null || innerDef === void 0 ? void 0 : innerDef.name.range;
+            return !!(outer &&
+                inner &&
+                outer[0] < inner[0] &&
+                inner[1] < outer[1] &&
+                ((innerDef.type === 'FunctionName' &&
+                    innerDef.node.type === experimental_utils_1.AST_NODE_TYPES.FunctionExpression) ||
+                    innerDef.node.type === experimental_utils_1.AST_NODE_TYPES.ClassExpression) &&
+                outerScope === innerScope.upper);
+        }
+        /**
+         * Get a range of a variable's identifier node.
+         * @param variable The variable to get.
+         * @returns The range of the variable's identifier node.
+         */
+        function getNameRange(variable) {
+            const def = variable.defs[0];
+            return def === null || def === void 0 ? void 0 : def.name.range;
+        }
+        /**
+         * Checks if a variable is in TDZ of scopeVar.
+         * @param variable The variable to check.
+         * @param scopeVar The variable of TDZ.
+         * @returns Whether or not the variable is in TDZ of scopeVar.
+         */
+        function isInTdz(variable, scopeVar) {
+            const outerDef = scopeVar.defs[0];
+            const inner = getNameRange(variable);
+            const outer = getNameRange(scopeVar);
+            return !!(inner &&
+                outer &&
+                inner[1] < outer[0] &&
+                // Excepts FunctionDeclaration if is {"hoist":"function"}.
+                (options.hoist !== 'functions' ||
+                    !outerDef ||
+                    outerDef.node.type !== experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration));
+        }
+        /**
+         * Finds the variable by a given name in a given scope and its upper scopes.
+         * @param initScope A scope to start find.
+         * @param name A variable name to find.
+         * @returns A found variable or `null`.
+         */
+        function getVariableByName(initScope, name) {
+            let scope = initScope;
+            while (scope) {
+                const variable = scope.set.get(name);
+                if (variable) {
+                    return variable;
+                }
+                scope = scope.upper;
+            }
+            return null;
+        }
+        /**
+         * Checks the current context for shadowed variables.
+         * @param {Scope} scope Fixme
+         */
+        function checkForShadows(scope) {
+            const variables = scope.variables;
+            for (const variable of variables) {
+                // ignore "arguments"
+                if (variable.identifiers.length === 0) {
+                    continue;
+                }
+                // this params are pseudo-params that cannot be shadowed
+                if (isThisParam(variable)) {
+                    continue;
+                }
+                // ignore variables of a class name in the class scope of ClassDeclaration
+                if (isDuplicatedClassNameVariable(variable)) {
+                    continue;
+                }
+                // ignore variables of a class name in the class scope of ClassDeclaration
+                if (isDuplicatedEnumNameVariable(variable)) {
+                    continue;
+                }
+                // ignore configured allowed names
+                if (isAllowed(variable)) {
+                    continue;
+                }
+                // Gets shadowed variable.
+                const shadowed = getVariableByName(scope.upper, variable.name);
+                if (!shadowed) {
+                    continue;
+                }
+                // ignore type value variable shadowing if configured
+                if (isTypeValueShadow(variable, shadowed)) {
+                    continue;
+                }
+                // ignore function type parameter name shadowing if configured
+                if (isFunctionTypeParameterNameValueShadow(variable, shadowed)) {
+                    continue;
+                }
+                const isESLintGlobal = 'writeable' in shadowed;
+                if ((shadowed.identifiers.length > 0 ||
+                    (options.builtinGlobals && isESLintGlobal)) &&
+                    !isOnInitializer(variable, shadowed) &&
+                    !(options.hoist !== 'all' && isInTdz(variable, shadowed))) {
+                    context.report({
+                        node: variable.identifiers[0],
+                        messageId: 'noShadow',
+                        data: {
+                            name: variable.name,
+                        },
+                    });
+                }
+            }
+        }
+        return {
+            'Program:exit'() {
+                const globalScope = context.getScope();
+                const stack = globalScope.childScopes.slice();
+                while (stack.length) {
+                    const scope = stack.pop();
+                    stack.push(...scope.childScopes);
+                    checkForShadows(scope);
+                }
+            },
+        };
+    },
+});
+//# sourceMappingURL=no-shadow.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-shadow.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-shadow.js.map
new file mode 100644
index 0000000..188c172
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-shadow.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"no-shadow.js","sourceRoot":"","sources":["../../src/rules/no-shadow.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-this-alias.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-this-alias.js
index ca6e7e3..cd0ae56 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-this-alias.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-this-alias.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-this-alias.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-this-alias.js.map
index fb80481..99bf7d3 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-this-alias.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-this-alias.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-this-alias.js","sourceRoot":"","sources":["../../src/rules/no-this-alias.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAUhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,0BAA0B;YACvC,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;SACrB;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE;oBACV,kBAAkB,EAAE;wBAClB,IAAI,EAAE,SAAS;qBAChB;oBACD,YAAY,EAAE;wBACZ,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;yBACf;qBACF;iBACF;aACF;SACF;QACD,QAAQ,EAAE;YACR,cAAc,EAAE,kDAAkD;YAClE,eAAe,EACb,8DAA8D;SACjE;KACF;IACD,cAAc,EAAE;QACd;YACE,kBAAkB,EAAE,IAAI;YACxB,YAAY,EAAE,EAAE;SACjB;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;QACpD,OAAO;YACL,gDAAgD,CAC9C,IAAiC;gBAEjC,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;gBAEpB,IAAI,kBAAkB,IAAI,EAAE,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,EAAE;oBAC/D,OAAO;iBACR;gBAED,MAAM,cAAc,GAClB,EAAE,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;oBACnC,CAAC,CAAC,YAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC;oBACjC,CAAC,CAAC,KAAK,CAAC;gBACZ,IAAI,CAAC,cAAc,EAAE;oBACnB,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,EAAE;wBACR,SAAS,EACP,EAAE,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;4BACnC,CAAC,CAAC,gBAAgB;4BAClB,CAAC,CAAC,iBAAiB;qBACxB,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-this-alias.js","sourceRoot":"","sources":["../../src/rules/no-this-alias.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAUhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,0BAA0B;YACvC,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;SACrB;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE;oBACV,kBAAkB,EAAE;wBAClB,IAAI,EAAE,SAAS;qBAChB;oBACD,YAAY,EAAE;wBACZ,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;yBACf;qBACF;iBACF;aACF;SACF;QACD,QAAQ,EAAE;YACR,cAAc,EAAE,kDAAkD;YAClE,eAAe,EACb,8DAA8D;SACjE;KACF;IACD,cAAc,EAAE;QACd;YACE,kBAAkB,EAAE,IAAI;YACxB,YAAY,EAAE,EAAE;SACjB;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;QACpD,OAAO;YACL,gDAAgD,CAC9C,IAAiC;gBAEjC,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;gBAEpB,IAAI,kBAAkB,IAAI,EAAE,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,EAAE;oBAC/D,OAAO;iBACR;gBAED,MAAM,cAAc,GAClB,EAAE,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;oBACnC,CAAC,CAAC,YAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC;oBACjC,CAAC,CAAC,KAAK,CAAC;gBACZ,IAAI,CAAC,cAAc,EAAE;oBACnB,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,EAAE;wBACR,SAAS,EACP,EAAE,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;4BACnC,CAAC,CAAC,gBAAgB;4BAClB,CAAC,CAAC,iBAAiB;qBACxB,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-throw-literal.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-throw-literal.js
index bb155f8..b11fa4b 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-throw-literal.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-throw-literal.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -33,12 +45,18 @@
         const checker = program.getTypeChecker();
         function isErrorLike(type) {
             var _a;
+            if (type.isIntersection()) {
+                return type.types.some(isErrorLike);
+            }
+            if (type.isUnion()) {
+                return type.types.every(isErrorLike);
+            }
             const symbol = type.getSymbol();
             if (!symbol) {
                 return false;
             }
             if (symbol.getName() === 'Error') {
-                const declarations = (_a = symbol.getDeclarations(), (_a !== null && _a !== void 0 ? _a : []));
+                const declarations = (_a = symbol.getDeclarations()) !== null && _a !== void 0 ? _a : [];
                 for (const declaration of declarations) {
                     const sourceFile = declaration.getSourceFile();
                     if (program.isSourceFileDefaultLibrary(sourceFile)) {
@@ -46,10 +64,11 @@
                     }
                 }
             }
-            const baseTypes = checker.getBaseTypes(type);
-            for (const baseType of baseTypes) {
-                if (isErrorLike(baseType)) {
-                    return true;
+            if (symbol.flags & (ts.SymbolFlags.Class | ts.SymbolFlags.Interface)) {
+                for (const baseType of checker.getBaseTypes(type)) {
+                    if (isErrorLike(baseType)) {
+                        return true;
+                    }
                 }
             }
             return false;
@@ -59,7 +78,8 @@
                 case experimental_utils_1.AST_NODE_TYPES.Identifier:
                 case experimental_utils_1.AST_NODE_TYPES.CallExpression:
                 case experimental_utils_1.AST_NODE_TYPES.NewExpression:
-                case experimental_utils_1.AST_NODE_TYPES.MemberExpression: {
+                case experimental_utils_1.AST_NODE_TYPES.MemberExpression:
+                case experimental_utils_1.AST_NODE_TYPES.TSAsExpression: {
                     const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);
                     return checker.getTypeAtLocation(tsNode);
                 }
@@ -69,11 +89,11 @@
                     return tryGetThrowArgumentType(node.expressions[node.expressions.length - 1]);
                 case experimental_utils_1.AST_NODE_TYPES.LogicalExpression: {
                     const left = tryGetThrowArgumentType(node.left);
-                    return (left !== null && left !== void 0 ? left : tryGetThrowArgumentType(node.right));
+                    return left !== null && left !== void 0 ? left : tryGetThrowArgumentType(node.right);
                 }
                 case experimental_utils_1.AST_NODE_TYPES.ConditionalExpression: {
                     const consequent = tryGetThrowArgumentType(node.consequent);
-                    return (consequent !== null && consequent !== void 0 ? consequent : tryGetThrowArgumentType(node.alternate));
+                    return consequent !== null && consequent !== void 0 ? consequent : tryGetThrowArgumentType(node.alternate);
                 }
                 default:
                     return null;
@@ -90,7 +110,8 @@
                     context.report({ node, messageId: 'undef' });
                     return;
                 }
-                if (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown) ||
+                if (util.isTypeAnyType(type) ||
+                    util.isTypeUnknownType(type) ||
                     isErrorLike(type)) {
                     return;
                 }
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-throw-literal.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-throw-literal.js.map
index 9a52e80..86d94ff 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-throw-literal.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-throw-literal.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-throw-literal.js","sourceRoot":"","sources":["../../src/rules/no-throw-literal.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-throw-literal.js","sourceRoot":"","sources":["../../src/rules/no-throw-literal.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-type-alias.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-type-alias.js
index b03e5df..62b9398 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-type-alias.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-type-alias.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -191,7 +203,11 @@
             else if (
             // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum
             type.node.type.endsWith('Keyword') ||
-                aliasTypes.has(type.node.type)) {
+                aliasTypes.has(type.node.type) ||
+                (type.node.type === experimental_utils_1.AST_NODE_TYPES.TSTypeOperator &&
+                    type.node.operator === 'readonly' &&
+                    type.node.typeAnnotation &&
+                    aliasTypes.has(type.node.typeAnnotation.type))) {
                 // alias / keyword
                 checkAndReport(allowAliases, isTopLevel, type, 'Aliases');
             }
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-type-alias.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-type-alias.js.map
index 22018ed..ad55508 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-type-alias.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-type-alias.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-type-alias.js","sourceRoot":"","sources":["../../src/rules/no-type-alias.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-type-alias.js","sourceRoot":"","sources":["../../src/rules/no-type-alias.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-boolean-literal-compare.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-boolean-literal-compare.js
index 935feb1..7da37ad 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-boolean-literal-compare.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-boolean-literal-compare.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -22,14 +34,35 @@
         },
         fixable: 'code',
         messages: {
-            direct: 'This expression unnecessarily compares a boolean value to a boolean instead of using it directly',
+            direct: 'This expression unnecessarily compares a boolean value to a boolean instead of using it directly.',
             negated: 'This expression unnecessarily compares a boolean value to a boolean instead of negating it.',
+            comparingNullableToTrueDirect: 'This expression unnecessarily compares a nullable boolean value to true instead of using it directly.',
+            comparingNullableToTrueNegated: 'This expression unnecessarily compares a nullable boolean value to true instead of negating it.',
+            comparingNullableToFalse: 'This expression unnecessarily compares a nullable boolean value to false instead of using the ?? operator to provide a default.',
         },
-        schema: [],
+        schema: [
+            {
+                type: 'object',
+                properties: {
+                    allowComparingNullableBooleansToTrue: {
+                        type: 'boolean',
+                    },
+                    allowComparingNullableBooleansToFalse: {
+                        type: 'boolean',
+                    },
+                },
+                additionalProperties: false,
+            },
+        ],
         type: 'suggestion',
     },
-    defaultOptions: [],
-    create(context) {
+    defaultOptions: [
+        {
+            allowComparingNullableBooleansToTrue: true,
+            allowComparingNullableBooleansToFalse: true,
+        },
+    ],
+    create(context, [options]) {
         const parserServices = util.getParserServices(context);
         const checker = parserServices.program.getTypeChecker();
         function getBooleanComparison(node) {
@@ -38,10 +71,42 @@
                 return undefined;
             }
             const expressionType = checker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(comparison.expression));
-            if (!tsutils.isTypeFlagSet(expressionType, ts.TypeFlags.Boolean | ts.TypeFlags.BooleanLiteral)) {
-                return undefined;
+            if (isBooleanType(expressionType)) {
+                return Object.assign(Object.assign({}, comparison), { expressionIsNullableBoolean: false });
             }
-            return comparison;
+            if (isNullableBoolean(expressionType)) {
+                return Object.assign(Object.assign({}, comparison), { expressionIsNullableBoolean: true });
+            }
+            return undefined;
+        }
+        function isBooleanType(expressionType) {
+            return tsutils.isTypeFlagSet(expressionType, ts.TypeFlags.Boolean | ts.TypeFlags.BooleanLiteral);
+        }
+        /**
+         * checks if the expressionType is a union that
+         *   1) contains at least one nullish type (null or undefined)
+         *   2) contains at least once boolean type (true or false or boolean)
+         *   3) does not contain any types besides nullish and boolean types
+         */
+        function isNullableBoolean(expressionType) {
+            if (!expressionType.isUnion()) {
+                return false;
+            }
+            const { types } = expressionType;
+            const nonNullishTypes = types.filter(type => !tsutils.isTypeFlagSet(type, ts.TypeFlags.Undefined | ts.TypeFlags.Null));
+            const hasNonNullishType = nonNullishTypes.length > 0;
+            if (!hasNonNullishType) {
+                return false;
+            }
+            const hasNullableType = nonNullishTypes.length < types.length;
+            if (!hasNullableType) {
+                return false;
+            }
+            const allNonNullishTypesAreBoolean = nonNullishTypes.every(isBooleanType);
+            if (!allNonNullishTypesAreBoolean) {
+                return false;
+            }
+            return true;
         }
         function deconstructComparison(node) {
             const comparisonType = util.getEqualsKind(node.operator);
@@ -56,10 +121,11 @@
                     typeof against.value !== 'boolean') {
                     continue;
                 }
-                const { value } = against;
-                const negated = node.operator.startsWith('!');
+                const { value: literalBooleanInComparison } = against;
+                const negated = !comparisonType.isPositive;
                 return {
-                    forTruthy: value ? !negated : negated,
+                    literalBooleanInComparison,
+                    forTruthy: literalBooleanInComparison ? !negated : negated,
                     expression,
                     negated,
                     range: expression.range[0] < against.range[0]
@@ -69,21 +135,71 @@
             }
             return undefined;
         }
+        function nodeIsUnaryNegation(node) {
+            return (node.type === experimental_utils_1.AST_NODE_TYPES.UnaryExpression &&
+                node.prefix &&
+                node.operator === '!');
+        }
         return {
             BinaryExpression(node) {
                 const comparison = getBooleanComparison(node);
-                if (comparison) {
-                    context.report({
-                        fix: function* (fixer) {
-                            yield fixer.removeRange(comparison.range);
+                if (comparison === undefined) {
+                    return;
+                }
+                if (comparison.expressionIsNullableBoolean) {
+                    if (comparison.literalBooleanInComparison &&
+                        options.allowComparingNullableBooleansToTrue) {
+                        return;
+                    }
+                    if (!comparison.literalBooleanInComparison &&
+                        options.allowComparingNullableBooleansToFalse) {
+                        return;
+                    }
+                }
+                context.report({
+                    fix: function* (fixer) {
+                        yield fixer.removeRange(comparison.range);
+                        // if the expression `exp` isn't nullable, or we're comparing to `true`,
+                        // we can just replace the entire comparison with `exp` or `!exp`
+                        if (!comparison.expressionIsNullableBoolean ||
+                            comparison.literalBooleanInComparison) {
                             if (!comparison.forTruthy) {
                                 yield fixer.insertTextBefore(node, '!');
                             }
-                        },
-                        messageId: comparison.negated ? 'negated' : 'direct',
-                        node,
-                    });
-                }
+                            return;
+                        }
+                        // if we're here, then the expression is a nullable boolean and we're
+                        // comparing to a literal `false`
+                        // if we're doing `== false` or `=== false`, then we need to negate the expression
+                        if (!comparison.negated) {
+                            const { parent } = node;
+                            // if the parent is a negation, we can instead just get rid of the parent's negation.
+                            // i.e. instead of resulting in `!(!(exp))`, we can just result in `exp`
+                            if (parent != null && nodeIsUnaryNegation(parent)) {
+                                // remove from the beginning of the parent to the beginning of this node
+                                yield fixer.removeRange([parent.range[0], node.range[0]]);
+                                // remove from the end of the node to the end of the parent
+                                yield fixer.removeRange([node.range[1], parent.range[1]]);
+                            }
+                            else {
+                                yield fixer.insertTextBefore(node, '!');
+                            }
+                        }
+                        // provide the default `true`
+                        yield fixer.insertTextBefore(node, '(');
+                        yield fixer.insertTextAfter(node, ' ?? true)');
+                    },
+                    messageId: comparison.expressionIsNullableBoolean
+                        ? comparison.literalBooleanInComparison
+                            ? comparison.negated
+                                ? 'comparingNullableToTrueNegated'
+                                : 'comparingNullableToTrueDirect'
+                            : 'comparingNullableToFalse'
+                        : comparison.negated
+                            ? 'negated'
+                            : 'direct',
+                    node,
+                });
             },
         };
     },
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-boolean-literal-compare.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-boolean-literal-compare.js.map
index 6c7c170..be36dbf 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-boolean-literal-compare.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-boolean-literal-compare.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-unnecessary-boolean-literal-compare.js","sourceRoot":"","sources":["../../src/rules/no-unnecessary-boolean-literal-compare.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-unnecessary-boolean-literal-compare.js","sourceRoot":"","sources":["../../src/rules/no-unnecessary-boolean-literal-compare.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-condition.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-condition.js
index eeacb86..32b7139 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-condition.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-condition.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -18,11 +30,11 @@
     // PossiblyFalsy flag includes literal values, so exclude ones that
     // are definitely truthy
     .filter(t => !isTruthyLiteral(t))
-    .some(type => tsutils_1.isTypeFlagSet(type, ts.TypeFlags.PossiblyFalsy));
+    .some(type => util_1.isTypeFlagSet(type, ts.TypeFlags.PossiblyFalsy));
 const isPossiblyTruthy = (type) => tsutils_1.unionTypeParts(type).some(type => !tsutils_1.isFalsyType(type));
 // Nullish utilities
 const nullishFlag = ts.TypeFlags.Undefined | ts.TypeFlags.Null;
-const isNullishType = (type) => tsutils_1.isTypeFlagSet(type, nullishFlag);
+const isNullishType = (type) => util_1.isTypeFlagSet(type, nullishFlag);
 const isPossiblyNullish = (type) => tsutils_1.unionTypeParts(type).some(isNullishType);
 const isAlwaysNullish = (type) => tsutils_1.unionTypeParts(type).every(isNullishType);
 // isLiteralType only covers numbers and strings, this is a more exhaustive check.
@@ -49,10 +61,7 @@
                     allowConstantLoopConditions: {
                         type: 'boolean',
                     },
-                    ignoreRhs: {
-                        type: 'boolean',
-                    },
-                    checkArrayPredicates: {
+                    allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing: {
                         type: 'boolean',
                     },
                 },
@@ -63,71 +72,133 @@
         messages: {
             alwaysTruthy: 'Unnecessary conditional, value is always truthy.',
             alwaysFalsy: 'Unnecessary conditional, value is always falsy.',
-            alwaysTruthyFunc: 'This callback should return a conditional, but return is always truthy',
-            alwaysFalsyFunc: 'This callback should return a conditional, but return is always falsy',
+            alwaysTruthyFunc: 'This callback should return a conditional, but return is always truthy.',
+            alwaysFalsyFunc: 'This callback should return a conditional, but return is always falsy.',
             neverNullish: 'Unnecessary conditional, expected left-hand side of `??` operator to be possibly null or undefined.',
-            alwaysNullish: 'Unnecessary conditional, left-hand side of `??` operator is always `null` or `undefined`',
+            alwaysNullish: 'Unnecessary conditional, left-hand side of `??` operator is always `null` or `undefined`.',
             literalBooleanExpression: 'Unnecessary conditional, both sides of the expression are literal values',
+            noOverlapBooleanExpression: 'Unnecessary conditional, the types have no overlap',
             never: 'Unnecessary conditional, value is `never`',
             neverOptionalChain: 'Unnecessary optional chain on a non-nullish value',
+            noStrictNullCheck: 'This rule requires the `strictNullChecks` compiler option to be turned on to function correctly.',
         },
     },
     defaultOptions: [
         {
             allowConstantLoopConditions: false,
-            ignoreRhs: false,
-            checkArrayPredicates: false,
+            allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing: false,
         },
     ],
-    create(context, [{ allowConstantLoopConditions, checkArrayPredicates, ignoreRhs }]) {
+    create(context, [{ allowConstantLoopConditions, allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing, },]) {
         const service = util_1.getParserServices(context);
         const checker = service.program.getTypeChecker();
         const sourceCode = context.getSourceCode();
+        const compilerOptions = service.program.getCompilerOptions();
+        const isStrictNullChecks = tsutils_1.isStrictCompilerOptionEnabled(compilerOptions, 'strictNullChecks');
+        if (!isStrictNullChecks &&
+            allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing !== true) {
+            context.report({
+                loc: {
+                    start: { line: 0, column: 0 },
+                    end: { line: 0, column: 0 },
+                },
+                messageId: 'noStrictNullCheck',
+            });
+        }
         function getNodeType(node) {
             const tsNode = service.esTreeNodeToTSNodeMap.get(node);
             return util_1.getConstrainedTypeAtLocation(checker, tsNode);
         }
         function nodeIsArrayType(node) {
             const nodeType = getNodeType(node);
-            return checker.isArrayType(nodeType) || checker.isTupleType(nodeType);
+            return checker.isArrayType(nodeType);
+        }
+        function nodeIsTupleType(node) {
+            const nodeType = getNodeType(node);
+            return checker.isTupleType(nodeType);
+        }
+        function isArrayIndexExpression(node) {
+            return (
+            // Is an index signature
+            node.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression &&
+                node.computed &&
+                // ...into an array type
+                (nodeIsArrayType(node.object) ||
+                    // ... or a tuple type
+                    (nodeIsTupleType(node.object) &&
+                        // Exception: literal index into a tuple - will have a sound type
+                        node.property.type !== experimental_utils_1.AST_NODE_TYPES.Literal)));
         }
         /**
          * Checks if a conditional node is necessary:
          * if the type of the node is always true or always false, it's not necessary.
          */
-        function checkNode(node) {
+        function checkNode(node, isUnaryNotArgument = false) {
+            // Check if the node is Unary Negation expression and handle it
+            if (node.type === experimental_utils_1.AST_NODE_TYPES.UnaryExpression &&
+                node.operator === '!') {
+                return checkNode(node.argument, true);
+            }
+            // Since typescript array index signature types don't represent the
+            //  possibility of out-of-bounds access, if we're indexing into an array
+            //  just skip the check, to avoid false positives
+            if (isArrayIndexExpression(node)) {
+                return;
+            }
+            // When checking logical expressions, only check the right side
+            //  as the left side has been checked by checkLogicalExpressionForUnnecessaryConditionals
+            //
+            // Unless the node is nullish coalescing, as it's common to use patterns like `nullBool ?? true` to to strict
+            //  boolean checks if we inspect the right here, it'll usually be a constant condition on purpose.
+            // In this case it's better to inspect the type of the expression as a whole.
+            if (node.type === experimental_utils_1.AST_NODE_TYPES.LogicalExpression &&
+                node.operator !== '??') {
+                return checkNode(node.right);
+            }
             const type = getNodeType(node);
             // Conditional is always necessary if it involves:
             //    `any` or `unknown` or a naked type parameter
-            if (tsutils_1.unionTypeParts(type).some(part => tsutils_1.isTypeFlagSet(part, ts.TypeFlags.Any |
-                ts.TypeFlags.Unknown |
-                ts.TypeFlags.TypeParameter))) {
+            if (tsutils_1.unionTypeParts(type).some(part => util_1.isTypeAnyType(part) ||
+                util_1.isTypeUnknownType(part) ||
+                util_1.isTypeFlagSet(part, ts.TypeFlags.TypeParameter))) {
                 return;
             }
-            const messageId = tsutils_1.isTypeFlagSet(type, ts.TypeFlags.Never)
-                ? 'never'
-                : !isPossiblyTruthy(type)
-                    ? 'alwaysFalsy'
-                    : !isPossiblyFalsy(type)
-                        ? 'alwaysTruthy'
-                        : undefined;
+            let messageId = null;
+            if (util_1.isTypeFlagSet(type, ts.TypeFlags.Never)) {
+                messageId = 'never';
+            }
+            else if (!isPossiblyTruthy(type)) {
+                messageId = !isUnaryNotArgument ? 'alwaysFalsy' : 'alwaysTruthy';
+            }
+            else if (!isPossiblyFalsy(type)) {
+                messageId = !isUnaryNotArgument ? 'alwaysTruthy' : 'alwaysFalsy';
+            }
             if (messageId) {
                 context.report({ node, messageId });
             }
         }
         function checkNodeForNullish(node) {
-            const type = getNodeType(node);
-            // Conditional is always necessary if it involves `any` or `unknown`
-            if (tsutils_1.isTypeFlagSet(type, ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {
+            // Since typescript array index signature types don't represent the
+            //  possibility of out-of-bounds access, if we're indexing into an array
+            //  just skip the check, to avoid false positives
+            if (isArrayIndexExpression(node)) {
                 return;
             }
-            const messageId = tsutils_1.isTypeFlagSet(type, ts.TypeFlags.Never)
-                ? 'never'
-                : !isPossiblyNullish(type)
-                    ? 'neverNullish'
-                    : isAlwaysNullish(type)
-                        ? 'alwaysNullish'
-                        : undefined;
+            const type = getNodeType(node);
+            // Conditional is always necessary if it involves `any` or `unknown`
+            if (util_1.isTypeAnyType(type) || util_1.isTypeUnknownType(type)) {
+                return;
+            }
+            let messageId = null;
+            if (util_1.isTypeFlagSet(type, ts.TypeFlags.Never)) {
+                messageId = 'never';
+            }
+            else if (!isPossiblyNullish(type)) {
+                messageId = 'neverNullish';
+            }
+            else if (isAlwaysNullish(type)) {
+                messageId = 'alwaysNullish';
+            }
             if (messageId) {
                 context.report({ node, messageId });
             }
@@ -138,6 +209,9 @@
          *
          * NOTE: It's also unnecessary if the types that don't overlap at all
          *    but that case is handled by the Typescript compiler itself.
+         *    Known exceptions:
+         *      * https://github.com/microsoft/TypeScript/issues/32627
+         *      * https://github.com/microsoft/TypeScript/issues/37160 (handled)
          */
         const BOOL_OPERATORS = new Set([
             '<',
@@ -150,21 +224,41 @@
             '!==',
         ]);
         function checkIfBinaryExpressionIsNecessaryConditional(node) {
-            if (BOOL_OPERATORS.has(node.operator) &&
-                isLiteral(getNodeType(node.left)) &&
-                isLiteral(getNodeType(node.right))) {
-                context.report({ node, messageId: 'literalBooleanExpression' });
-            }
-        }
-        /**
-         * Checks that a testable expression is necessarily conditional, reports otherwise.
-         * Filters all LogicalExpressions to prevent some duplicate reports.
-         */
-        function checkIfTestExpressionIsNecessaryConditional(node) {
-            if (node.test.type === experimental_utils_1.AST_NODE_TYPES.LogicalExpression) {
+            if (!BOOL_OPERATORS.has(node.operator)) {
                 return;
             }
-            checkNode(node.test);
+            const leftType = getNodeType(node.left);
+            const rightType = getNodeType(node.right);
+            if (isLiteral(leftType) && isLiteral(rightType)) {
+                context.report({ node, messageId: 'literalBooleanExpression' });
+                return;
+            }
+            // Workaround for https://github.com/microsoft/TypeScript/issues/37160
+            if (isStrictNullChecks) {
+                const UNDEFINED = ts.TypeFlags.Undefined;
+                const NULL = ts.TypeFlags.Null;
+                const isComparable = (type, flag) => {
+                    // Allow comparison to `any`, `unknown` or a naked type parameter.
+                    flag |=
+                        ts.TypeFlags.Any |
+                            ts.TypeFlags.Unknown |
+                            ts.TypeFlags.TypeParameter;
+                    // Allow loose comparison to nullish values.
+                    if (node.operator === '==' || node.operator === '!=') {
+                        flag |= NULL | UNDEFINED;
+                    }
+                    return util_1.isTypeFlagSet(type, flag);
+                };
+                if ((leftType.flags === UNDEFINED &&
+                    !isComparable(rightType, UNDEFINED)) ||
+                    (rightType.flags === UNDEFINED &&
+                        !isComparable(leftType, UNDEFINED)) ||
+                    (leftType.flags === NULL && !isComparable(rightType, NULL)) ||
+                    (rightType.flags === NULL && !isComparable(leftType, NULL))) {
+                    context.report({ node, messageId: 'noOverlapBooleanExpression' });
+                    return;
+                }
+            }
         }
         /**
          * Checks that a logical expression contains a boolean, reports otherwise.
@@ -174,17 +268,16 @@
                 checkNodeForNullish(node.left);
                 return;
             }
+            // Only checks the left side, since the right side might not be "conditional" at all.
+            // The right side will be checked if the LogicalExpression is used in a conditional context
             checkNode(node.left);
-            if (!ignoreRhs) {
-                checkNode(node.right);
-            }
         }
         /**
          * Checks that a testable expression of a loop is necessarily conditional, reports otherwise.
          */
         function checkIfLoopIsNecessaryConditional(node) {
-            if (node.test === null ||
-                node.test.type === experimental_utils_1.AST_NODE_TYPES.LogicalExpression) {
+            if (node.test === null) {
+                // e.g. `for(;;)`
                 return;
             }
             /**
@@ -205,21 +298,20 @@
             'some',
             'every',
         ]);
-        function shouldCheckCallback(node) {
+        function isArrayPredicateFunction(node) {
             const { callee } = node;
             return (
-            // option is on
-            !!checkArrayPredicates &&
-                // looks like `something.filter` or `something.find`
-                callee.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression &&
+            // looks like `something.filter` or `something.find`
+            callee.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression &&
                 callee.property.type === experimental_utils_1.AST_NODE_TYPES.Identifier &&
                 ARRAY_PREDICATE_FUNCTIONS.has(callee.property.name) &&
                 // and the left-hand side is an array, according to the types
-                nodeIsArrayType(callee.object));
+                (nodeIsArrayType(callee.object) || nodeIsTupleType(callee.object)));
         }
         function checkCallExpression(node) {
-            const { arguments: [callback], } = node;
-            if (callback && shouldCheckCallback(node)) {
+            // If this is something like arr.filter(x => /*condition*/), check `condition`
+            if (isArrayPredicateFunction(node) && node.arguments.length) {
+                const callback = node.arguments[0];
                 // Inline defined functions
                 if ((callback.type === experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression ||
                     callback.type === experimental_utils_1.AST_NODE_TYPES.FunctionExpression) &&
@@ -260,16 +352,88 @@
                 }
             }
         }
+        // Recursively searches an optional chain for an array index expression
+        //  Has to search the entire chain, because an array index will "infect" the rest of the types
+        //  Example:
+        //  ```
+        //  [{x: {y: "z"} }][n] // type is {x: {y: "z"}}
+        //    ?.x // type is {y: "z"}
+        //    ?.y // This access is considered "unnecessary" according to the types
+        //  ```
+        function optionChainContainsArrayIndex(node) {
+            const lhsNode = node.type === experimental_utils_1.AST_NODE_TYPES.CallExpression ? node.callee : node.object;
+            if (isArrayIndexExpression(lhsNode)) {
+                return true;
+            }
+            if (lhsNode.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression ||
+                lhsNode.type === experimental_utils_1.AST_NODE_TYPES.CallExpression) {
+                return optionChainContainsArrayIndex(lhsNode);
+            }
+            return false;
+        }
+        function isNullablePropertyType(objType, propertyType) {
+            if (propertyType.isUnion()) {
+                return propertyType.types.some(type => isNullablePropertyType(objType, type));
+            }
+            if (propertyType.isNumberLiteral() || propertyType.isStringLiteral()) {
+                const propType = util_1.getTypeOfPropertyOfName(checker, objType, propertyType.value.toString());
+                if (propType) {
+                    return util_1.isNullableType(propType, { allowUndefined: true });
+                }
+            }
+            const typeName = util_1.getTypeName(checker, propertyType);
+            return !!((typeName === 'string' &&
+                checker.getIndexInfoOfType(objType, ts.IndexKind.String)) ||
+                (typeName === 'number' &&
+                    checker.getIndexInfoOfType(objType, ts.IndexKind.Number)));
+        }
+        // Checks whether a member expression is nullable or not regardless of it's previous node.
+        //  Example:
+        //  ```
+        //  // 'bar' is nullable if 'foo' is null.
+        //  // but this function checks regardless of 'foo' type, so returns 'true'.
+        //  declare const foo: { bar : { baz: string } } | null
+        //  foo?.bar;
+        //  ```
+        function isNullableOriginFromPrev(node) {
+            const prevType = getNodeType(node.object);
+            const property = node.property;
+            if (prevType.isUnion() && util_1.isIdentifier(property)) {
+                const isOwnNullable = prevType.types.some(type => {
+                    if (node.computed) {
+                        const propertyType = getNodeType(node.property);
+                        return isNullablePropertyType(type, propertyType);
+                    }
+                    const propType = util_1.getTypeOfPropertyOfName(checker, type, property.name);
+                    return propType && util_1.isNullableType(propType, { allowUndefined: true });
+                });
+                return (!isOwnNullable && util_1.isNullableType(prevType, { allowUndefined: true }));
+            }
+            return false;
+        }
+        function isOptionableExpression(node) {
+            const type = getNodeType(node);
+            const isOwnNullable = node.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression
+                ? !isNullableOriginFromPrev(node)
+                : true;
+            return (util_1.isTypeAnyType(type) ||
+                util_1.isTypeUnknownType(type) ||
+                (util_1.isNullableType(type, { allowUndefined: true }) && isOwnNullable));
+        }
         function checkOptionalChain(node, beforeOperator, fix) {
             // We only care if this step in the chain is optional. If just descend
             // from an optional chain, then that's fine.
             if (!node.optional) {
                 return;
             }
-            const type = getNodeType(node);
-            if (tsutils_1.isTypeFlagSet(type, ts.TypeFlags.Any) ||
-                tsutils_1.isTypeFlagSet(type, ts.TypeFlags.Unknown) ||
-                util_1.isNullableType(type, { allowUndefined: true })) {
+            // Since typescript array index signature types don't represent the
+            //  possibility of out-of-bounds access, if we're indexing into an array
+            //  just skip the check, to avoid false positives
+            if (optionChainContainsArrayIndex(node)) {
+                return;
+            }
+            const nodeToCheck = node.type === experimental_utils_1.AST_NODE_TYPES.CallExpression ? node.callee : node.object;
+            if (isOptionableExpression(nodeToCheck)) {
                 return;
             }
             const questionDotOperator = util_1.nullThrows(sourceCode.getTokenAfter(beforeOperator, token => token.type === experimental_utils_1.AST_TOKEN_TYPES.Punctuator && token.value === '?.'), util_1.NullThrowsReasons.MissingToken('operator', node.type));
@@ -283,7 +447,7 @@
             });
         }
         function checkOptionalMemberExpression(node) {
-            checkOptionalChain(node, node.object, '.');
+            checkOptionalChain(node, node.object, node.computed ? '' : '.');
         }
         function checkOptionalCallExpression(node) {
             checkOptionalChain(node, node.callee, '');
@@ -291,14 +455,14 @@
         return {
             BinaryExpression: checkIfBinaryExpressionIsNecessaryConditional,
             CallExpression: checkCallExpression,
-            ConditionalExpression: checkIfTestExpressionIsNecessaryConditional,
+            ConditionalExpression: (node) => checkNode(node.test),
             DoWhileStatement: checkIfLoopIsNecessaryConditional,
             ForStatement: checkIfLoopIsNecessaryConditional,
-            IfStatement: checkIfTestExpressionIsNecessaryConditional,
+            IfStatement: (node) => checkNode(node.test),
             LogicalExpression: checkLogicalExpressionForUnnecessaryConditionals,
             WhileStatement: checkIfLoopIsNecessaryConditional,
-            OptionalMemberExpression: checkOptionalMemberExpression,
-            OptionalCallExpression: checkOptionalCallExpression,
+            'MemberExpression[optional = true]': checkOptionalMemberExpression,
+            'CallExpression[optional = true]': checkOptionalCallExpression,
         };
     },
 });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-condition.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-condition.js.map
index c0bb104..d3b5c58 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-condition.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-condition.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-unnecessary-condition.js","sourceRoot":"","sources":["../../src/rules/no-unnecessary-condition.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-unnecessary-condition.js","sourceRoot":"","sources":["../../src/rules/no-unnecessary-condition.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-qualifier.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-qualifier.js
index aca12b0..52202a0 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-qualifier.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-qualifier.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -43,7 +55,7 @@
         }
         function symbolIsNamespaceInScope(symbol) {
             var _a;
-            const symbolDeclarations = (_a = symbol.getDeclarations(), (_a !== null && _a !== void 0 ? _a : []));
+            const symbolDeclarations = (_a = symbol.getDeclarations()) !== null && _a !== void 0 ? _a : [];
             if (symbolDeclarations.some(decl => namespacesInScope.some(ns => ns === decl))) {
                 return true;
             }
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-qualifier.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-qualifier.js.map
index ecb696f..c516a45 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-qualifier.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-qualifier.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-unnecessary-qualifier.js","sourceRoot":"","sources":["../../src/rules/no-unnecessary-qualifier.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-unnecessary-qualifier.js","sourceRoot":"","sources":["../../src/rules/no-unnecessary-qualifier.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-arguments.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-arguments.js
index 5fa768b..d8fab61 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-arguments.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-arguments.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -33,13 +45,12 @@
         const checker = parserServices.program.getTypeChecker();
         const sourceCode = context.getSourceCode();
         function checkTSArgsAndParameters(esParameters, typeParameters) {
-            var _a;
             // Just check the last one. Must specify previous type parameters if the last one is specified.
             const i = esParameters.params.length - 1;
             const arg = esParameters.params[i];
             const param = typeParameters[i];
             // TODO: would like checker.areTypesEquivalent. https://github.com/Microsoft/TypeScript/issues/13502
-            if (!((_a = param) === null || _a === void 0 ? void 0 : _a.default) ||
+            if (!(param === null || param === void 0 ? void 0 : param.default) ||
                 param.default.getText() !== sourceCode.getText(arg)) {
                 return;
             }
@@ -80,19 +91,19 @@
         return undefined;
     }
     const sym = getAliasedSymbol(symAtLocation, checker);
-    if (!sym.declarations) {
+    const declarations = sym.getDeclarations();
+    if (!declarations) {
         return undefined;
     }
-    return util_1.findFirstResult(sym.declarations, decl => tsutils.isClassLikeDeclaration(decl) ||
+    return util_1.findFirstResult(declarations, decl => tsutils.isClassLikeDeclaration(decl) ||
         ts.isTypeAliasDeclaration(decl) ||
         ts.isInterfaceDeclaration(decl)
         ? decl.typeParameters
         : undefined);
 }
 function getTypeParametersFromCall(node, checker) {
-    var _a;
     const sig = checker.getResolvedSignature(node);
-    const sigDecl = (_a = sig) === null || _a === void 0 ? void 0 : _a.getDeclaration();
+    const sigDecl = sig === null || sig === void 0 ? void 0 : sig.getDeclaration();
     if (!sigDecl) {
         return ts.isNewExpression(node)
             ? getTypeParametersFromType(node.expression, checker)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-arguments.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-arguments.js.map
index 9cf40b2..c669509 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-arguments.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-arguments.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-unnecessary-type-arguments.js","sourceRoot":"","sources":["../../src/rules/no-unnecessary-type-arguments.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-unnecessary-type-arguments.js","sourceRoot":"","sources":["../../src/rules/no-unnecessary-type-arguments.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-assertion.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-assertion.js
index 379c846..249849f 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-assertion.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-assertion.js
@@ -1,12 +1,25 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const tsutils_1 = require("tsutils");
 const ts = __importStar(require("typescript"));
 const util = __importStar(require("../util"));
@@ -73,39 +86,6 @@
             return true;
         }
         /**
-         * Returns the contextual type of a given node.
-         * Contextual type is the type of the target the node is going into.
-         * i.e. the type of a called function's parameter, or the defined type of a variable declaration
-         */
-        function getContextualType(checker, node) {
-            const parent = node.parent;
-            if (!parent) {
-                return;
-            }
-            if (tsutils_1.isCallExpression(parent) || tsutils_1.isNewExpression(parent)) {
-                if (node === parent.expression) {
-                    // is the callee, so has no contextual type
-                    return;
-                }
-            }
-            else if (tsutils_1.isVariableDeclaration(parent) ||
-                tsutils_1.isPropertyDeclaration(parent) ||
-                tsutils_1.isParameterDeclaration(parent)) {
-                return parent.type
-                    ? checker.getTypeFromTypeNode(parent.type)
-                    : undefined;
-            }
-            else if (tsutils_1.isJsxExpression(parent)) {
-                return checker.getContextualType(parent);
-            }
-            else if (![ts.SyntaxKind.TemplateSpan, ts.SyntaxKind.JsxExpression].includes(parent.kind)) {
-                // parent is not something we know we can get the contextual type of
-                return;
-            }
-            // TODO - support return statement checking
-            return checker.getContextualType(node);
-        }
-        /**
          * Returns true if there's a chance the variable has been used before a value has been assigned to it
          */
         function isPossiblyUsedBeforeAssigned(node) {
@@ -138,6 +118,11 @@
             }
             return false;
         }
+        function isConstAssertion(node) {
+            return (node.type === experimental_utils_1.AST_NODE_TYPES.TSTypeReference &&
+                node.typeName.type === experimental_utils_1.AST_NODE_TYPES.Identifier &&
+                node.typeName.name === 'const');
+        }
         return {
             TSNonNullExpression(node) {
                 const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
@@ -160,7 +145,7 @@
                 else {
                     // we know it's a nullable type
                     // so figure out if the variable is used in a place that accepts nullable types
-                    const contextualType = getContextualType(checker, originalNode);
+                    const contextualType = util.getContextualType(checker, originalNode);
                     if (contextualType) {
                         // in strict mode you can't assign null to undefined, so we have to make sure that
                         // the two types share a nullable type
@@ -193,7 +178,8 @@
             },
             'TSAsExpression, TSTypeAssertion'(node) {
                 var _a;
-                if ((_a = options.typesToIgnore) === null || _a === void 0 ? void 0 : _a.includes(sourceCode.getText(node.typeAnnotation))) {
+                if (((_a = options.typesToIgnore) === null || _a === void 0 ? void 0 : _a.includes(sourceCode.getText(node.typeAnnotation))) ||
+                    isConstAssertion(node.typeAnnotation)) {
                     return;
                 }
                 const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-assertion.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-assertion.js.map
index e9e0957..31dfa14 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-assertion.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unnecessary-type-assertion.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-unnecessary-type-assertion.js","sourceRoot":"","sources":["../../src/rules/no-unnecessary-type-assertion.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-unnecessary-type-assertion.js","sourceRoot":"","sources":["../../src/rules/no-unnecessary-type-assertion.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-assignment.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-assignment.js
new file mode 100644
index 0000000..42b1f9c
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-assignment.js
@@ -0,0 +1,265 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const util = __importStar(require("../util"));
+exports.default = util.createRule({
+    name: 'no-unsafe-assignment',
+    meta: {
+        type: 'problem',
+        docs: {
+            description: 'Disallows assigning any to variables and properties',
+            category: 'Possible Errors',
+            recommended: 'error',
+            requiresTypeChecking: true,
+        },
+        messages: {
+            anyAssignment: 'Unsafe assignment of an any value.',
+            unsafeArrayPattern: 'Unsafe array destructuring of an any array value.',
+            unsafeArrayPatternFromTuple: 'Unsafe array destructuring of a tuple element with an any value.',
+            unsafeAssignment: 'Unsafe assignment of type {{sender}} to a variable of type {{receiver}}.',
+            unsafeArraySpread: 'Unsafe spread of an any value in an array.',
+        },
+        schema: [],
+    },
+    defaultOptions: [],
+    create(context) {
+        const { program, esTreeNodeToTSNodeMap } = util.getParserServices(context);
+        const checker = program.getTypeChecker();
+        // returns true if the assignment reported
+        function checkArrayDestructureHelper(receiverNode, senderNode) {
+            if (receiverNode.type !== experimental_utils_1.AST_NODE_TYPES.ArrayPattern) {
+                return false;
+            }
+            const senderTsNode = esTreeNodeToTSNodeMap.get(senderNode);
+            const senderType = checker.getTypeAtLocation(senderTsNode);
+            return checkArrayDestructure(receiverNode, senderType, senderTsNode);
+        }
+        // returns true if the assignment reported
+        function checkArrayDestructure(receiverNode, senderType, senderNode) {
+            // any array
+            // const [x] = ([] as any[]);
+            if (util.isTypeAnyArrayType(senderType, checker)) {
+                context.report({
+                    node: receiverNode,
+                    messageId: 'unsafeArrayPattern',
+                });
+                return false;
+            }
+            if (!checker.isTupleType(senderType)) {
+                return true;
+            }
+            const tupleElements = util.getTypeArguments(senderType, checker);
+            // tuple with any
+            // const [x] = [1 as any];
+            let didReport = false;
+            for (let receiverIndex = 0; receiverIndex < receiverNode.elements.length; receiverIndex += 1) {
+                const receiverElement = receiverNode.elements[receiverIndex];
+                if (!receiverElement) {
+                    continue;
+                }
+                if (receiverElement.type === experimental_utils_1.AST_NODE_TYPES.RestElement) {
+                    // don't handle rests as they're not a 1:1 assignment
+                    continue;
+                }
+                const senderType = tupleElements[receiverIndex];
+                if (!senderType) {
+                    continue;
+                }
+                // check for the any type first so we can handle [[[x]]] = [any]
+                if (util.isTypeAnyType(senderType)) {
+                    context.report({
+                        node: receiverElement,
+                        messageId: 'unsafeArrayPatternFromTuple',
+                    });
+                    // we want to report on every invalid element in the tuple
+                    didReport = true;
+                }
+                else if (receiverElement.type === experimental_utils_1.AST_NODE_TYPES.ArrayPattern) {
+                    didReport = checkArrayDestructure(receiverElement, senderType, senderNode);
+                }
+                else if (receiverElement.type === experimental_utils_1.AST_NODE_TYPES.ObjectPattern) {
+                    didReport = checkObjectDestructure(receiverElement, senderType, senderNode);
+                }
+            }
+            return didReport;
+        }
+        // returns true if the assignment reported
+        function checkObjectDestructureHelper(receiverNode, senderNode) {
+            if (receiverNode.type !== experimental_utils_1.AST_NODE_TYPES.ObjectPattern) {
+                return false;
+            }
+            const senderTsNode = esTreeNodeToTSNodeMap.get(senderNode);
+            const senderType = checker.getTypeAtLocation(senderTsNode);
+            return checkObjectDestructure(receiverNode, senderType, senderTsNode);
+        }
+        // returns true if the assignment reported
+        function checkObjectDestructure(receiverNode, senderType, senderNode) {
+            const properties = new Map(senderType
+                .getProperties()
+                .map(property => [
+                property.getName(),
+                checker.getTypeOfSymbolAtLocation(property, senderNode),
+            ]));
+            let didReport = false;
+            for (let receiverIndex = 0; receiverIndex < receiverNode.properties.length; receiverIndex += 1) {
+                const receiverProperty = receiverNode.properties[receiverIndex];
+                if (receiverProperty.type === experimental_utils_1.AST_NODE_TYPES.RestElement) {
+                    // don't bother checking rest
+                    continue;
+                }
+                let key;
+                if (receiverProperty.computed === false) {
+                    key =
+                        receiverProperty.key.type === experimental_utils_1.AST_NODE_TYPES.Identifier
+                            ? receiverProperty.key.name
+                            : String(receiverProperty.key.value);
+                }
+                else if (receiverProperty.key.type === experimental_utils_1.AST_NODE_TYPES.Literal) {
+                    key = String(receiverProperty.key.value);
+                }
+                else if (receiverProperty.key.type === experimental_utils_1.AST_NODE_TYPES.TemplateLiteral &&
+                    receiverProperty.key.quasis.length === 1) {
+                    key = String(receiverProperty.key.quasis[0].value.cooked);
+                }
+                else {
+                    // can't figure out the name, so skip it
+                    continue;
+                }
+                const senderType = properties.get(key);
+                if (!senderType) {
+                    continue;
+                }
+                // check for the any type first so we can handle {x: {y: z}} = {x: any}
+                if (util.isTypeAnyType(senderType)) {
+                    context.report({
+                        node: receiverProperty.value,
+                        messageId: 'unsafeArrayPatternFromTuple',
+                    });
+                    didReport = true;
+                }
+                else if (receiverProperty.value.type === experimental_utils_1.AST_NODE_TYPES.ArrayPattern) {
+                    didReport = checkArrayDestructure(receiverProperty.value, senderType, senderNode);
+                }
+                else if (receiverProperty.value.type === experimental_utils_1.AST_NODE_TYPES.ObjectPattern) {
+                    didReport = checkObjectDestructure(receiverProperty.value, senderType, senderNode);
+                }
+            }
+            return didReport;
+        }
+        // returns true if the assignment reported
+        function checkAssignment(receiverNode, senderNode, reportingNode, comparisonType) {
+            var _a;
+            const receiverTsNode = esTreeNodeToTSNodeMap.get(receiverNode);
+            const receiverType = comparisonType === 2 /* Contextual */
+                ? (_a = util.getContextualType(checker, receiverTsNode)) !== null && _a !== void 0 ? _a : checker.getTypeAtLocation(receiverTsNode) : checker.getTypeAtLocation(receiverTsNode);
+            const senderType = checker.getTypeAtLocation(esTreeNodeToTSNodeMap.get(senderNode));
+            if (util.isTypeAnyType(senderType)) {
+                // handle cases when we assign any ==> unknown.
+                if (util.isTypeUnknownType(receiverType)) {
+                    return false;
+                }
+                context.report({
+                    node: reportingNode,
+                    messageId: 'anyAssignment',
+                });
+                return true;
+            }
+            if (comparisonType === 0 /* None */) {
+                return false;
+            }
+            const result = util.isUnsafeAssignment(senderType, receiverType, checker);
+            if (!result) {
+                return false;
+            }
+            const { sender, receiver } = result;
+            context.report({
+                node: reportingNode,
+                messageId: 'unsafeAssignment',
+                data: {
+                    sender: checker.typeToString(sender),
+                    receiver: checker.typeToString(receiver),
+                },
+            });
+            return true;
+        }
+        function getComparisonType(typeAnnotation) {
+            return typeAnnotation
+                ? // if there's a type annotation, we can do a comparison
+                    1 /* Basic */
+                : // no type annotation means the variable's type will just be inferred, thus equal
+                    0 /* None */;
+        }
+        return {
+            'VariableDeclarator[init != null]'(node) {
+                const init = util.nullThrows(node.init, util.NullThrowsReasons.MissingToken(node.type, 'init'));
+                let didReport = checkAssignment(node.id, init, node, getComparisonType(node.id.typeAnnotation));
+                if (!didReport) {
+                    didReport = checkArrayDestructureHelper(node.id, init);
+                }
+                if (!didReport) {
+                    checkObjectDestructureHelper(node.id, init);
+                }
+            },
+            'ClassProperty[value != null]'(node) {
+                checkAssignment(node.key, node.value, node, getComparisonType(node.typeAnnotation));
+            },
+            'AssignmentExpression[operator = "="], AssignmentPattern'(node) {
+                let didReport = checkAssignment(node.left, node.right, node, 1 /* Basic */);
+                if (!didReport) {
+                    didReport = checkArrayDestructureHelper(node.left, node.right);
+                }
+                if (!didReport) {
+                    checkObjectDestructureHelper(node.left, node.right);
+                }
+            },
+            // object pattern props are checked via assignments
+            ':not(ObjectPattern) > Property'(node) {
+                if (node.value.type === experimental_utils_1.AST_NODE_TYPES.AssignmentPattern ||
+                    node.value.type === experimental_utils_1.AST_NODE_TYPES.TSEmptyBodyFunctionExpression) {
+                    // handled by other selector
+                    return;
+                }
+                checkAssignment(node.key, node.value, node, 2 /* Contextual */);
+            },
+            'ArrayExpression > SpreadElement'(node) {
+                const resetNode = esTreeNodeToTSNodeMap.get(node.argument);
+                const restType = checker.getTypeAtLocation(resetNode);
+                if (util.isTypeAnyType(restType) ||
+                    util.isTypeAnyArrayType(restType, checker)) {
+                    context.report({
+                        node: node,
+                        messageId: 'unsafeArraySpread',
+                    });
+                }
+            },
+            'JSXAttribute[value != null]'(node) {
+                const value = util.nullThrows(node.value, util.NullThrowsReasons.MissingToken(node.type, 'value'));
+                if (value.type !== experimental_utils_1.AST_NODE_TYPES.JSXExpressionContainer ||
+                    value.expression.type === experimental_utils_1.AST_NODE_TYPES.JSXEmptyExpression) {
+                    return;
+                }
+                checkAssignment(node.name, value.expression, value.expression, 2 /* Contextual */);
+            },
+        };
+    },
+});
+//# sourceMappingURL=no-unsafe-assignment.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-assignment.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-assignment.js.map
new file mode 100644
index 0000000..272d4ac
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-assignment.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"no-unsafe-assignment.js","sourceRoot":"","sources":["../../src/rules/no-unsafe-assignment.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAE/C,8CAAgC;AAWhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,qDAAqD;YAClE,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,OAAO;YACpB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,aAAa,EAAE,oCAAoC;YACnD,kBAAkB,EAAE,mDAAmD;YACvE,2BAA2B,EACzB,kEAAkE;YACpE,gBAAgB,EACd,0EAA0E;YAC5E,iBAAiB,EAAE,4CAA4C;SAChE;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QAEzC,0CAA0C;QAC1C,SAAS,2BAA2B,CAClC,YAA2B,EAC3B,UAAyB;YAEzB,IAAI,YAAY,CAAC,IAAI,KAAK,mCAAc,CAAC,YAAY,EAAE;gBACrD,OAAO,KAAK,CAAC;aACd;YAED,MAAM,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAE3D,OAAO,qBAAqB,CAAC,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QACvE,CAAC;QAED,0CAA0C;QAC1C,SAAS,qBAAqB,CAC5B,YAAmC,EACnC,UAAmB,EACnB,UAAmB;YAEnB,YAAY;YACZ,6BAA6B;YAC7B,IAAI,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE;gBAChD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,YAAY;oBAClB,SAAS,EAAE,oBAAoB;iBAChC,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC;aACd;YAED,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;gBACpC,OAAO,IAAI,CAAC;aACb;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAEjE,iBAAiB;YACjB,0BAA0B;YAC1B,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,KACE,IAAI,aAAa,GAAG,CAAC,EACrB,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,EAC5C,aAAa,IAAI,CAAC,EAClB;gBACA,MAAM,eAAe,GAAG,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;gBAC7D,IAAI,CAAC,eAAe,EAAE;oBACpB,SAAS;iBACV;gBAED,IAAI,eAAe,CAAC,IAAI,KAAK,mCAAc,CAAC,WAAW,EAAE;oBACvD,qDAAqD;oBACrD,SAAS;iBACV;gBAED,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAwB,CAAC;gBACvE,IAAI,CAAC,UAAU,EAAE;oBACf,SAAS;iBACV;gBAED,gEAAgE;gBAChE,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE;oBAClC,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,eAAe;wBACrB,SAAS,EAAE,6BAA6B;qBACzC,CAAC,CAAC;oBACH,0DAA0D;oBAC1D,SAAS,GAAG,IAAI,CAAC;iBAClB;qBAAM,IAAI,eAAe,CAAC,IAAI,KAAK,mCAAc,CAAC,YAAY,EAAE;oBAC/D,SAAS,GAAG,qBAAqB,CAC/B,eAAe,EACf,UAAU,EACV,UAAU,CACX,CAAC;iBACH;qBAAM,IAAI,eAAe,CAAC,IAAI,KAAK,mCAAc,CAAC,aAAa,EAAE;oBAChE,SAAS,GAAG,sBAAsB,CAChC,eAAe,EACf,UAAU,EACV,UAAU,CACX,CAAC;iBACH;aACF;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,0CAA0C;QAC1C,SAAS,4BAA4B,CACnC,YAA2B,EAC3B,UAAyB;YAEzB,IAAI,YAAY,CAAC,IAAI,KAAK,mCAAc,CAAC,aAAa,EAAE;gBACtD,OAAO,KAAK,CAAC;aACd;YAED,MAAM,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAE3D,OAAO,sBAAsB,CAAC,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QACxE,CAAC;QAED,0CAA0C;QAC1C,SAAS,sBAAsB,CAC7B,YAAoC,EACpC,UAAmB,EACnB,UAAmB;YAEnB,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,UAAU;iBACP,aAAa,EAAE;iBACf,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACf,QAAQ,CAAC,OAAO,EAAE;gBAClB,OAAO,CAAC,yBAAyB,CAAC,QAAQ,EAAE,UAAU,CAAC;aACxD,CAAC,CACL,CAAC;YAEF,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,KACE,IAAI,aAAa,GAAG,CAAC,EACrB,aAAa,GAAG,YAAY,CAAC,UAAU,CAAC,MAAM,EAC9C,aAAa,IAAI,CAAC,EAClB;gBACA,MAAM,gBAAgB,GAAG,YAAY,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;gBAChE,IAAI,gBAAgB,CAAC,IAAI,KAAK,mCAAc,CAAC,WAAW,EAAE;oBACxD,6BAA6B;oBAC7B,SAAS;iBACV;gBAED,IAAI,GAAW,CAAC;gBAChB,IAAI,gBAAgB,CAAC,QAAQ,KAAK,KAAK,EAAE;oBACvC,GAAG;wBACD,gBAAgB,CAAC,GAAG,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;4BACrD,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI;4BAC3B,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;iBAC1C;qBAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO,EAAE;oBAC/D,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;iBAC1C;qBAAM,IACL,gBAAgB,CAAC,GAAG,CAAC,IAAI,KAAK,mCAAc,CAAC,eAAe;oBAC5D,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EACxC;oBACA,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;iBAC3D;qBAAM;oBACL,wCAAwC;oBACxC,SAAS;iBACV;gBAED,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACvC,IAAI,CAAC,UAAU,EAAE;oBACf,SAAS;iBACV;gBAED,uEAAuE;gBACvE,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE;oBAClC,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,gBAAgB,CAAC,KAAK;wBAC5B,SAAS,EAAE,6BAA6B;qBACzC,CAAC,CAAC;oBACH,SAAS,GAAG,IAAI,CAAC;iBAClB;qBAAM,IACL,gBAAgB,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,YAAY,EAC3D;oBACA,SAAS,GAAG,qBAAqB,CAC/B,gBAAgB,CAAC,KAAK,EACtB,UAAU,EACV,UAAU,CACX,CAAC;iBACH;qBAAM,IACL,gBAAgB,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,aAAa,EAC5D;oBACA,SAAS,GAAG,sBAAsB,CAChC,gBAAgB,CAAC,KAAK,EACtB,UAAU,EACV,UAAU,CACX,CAAC;iBACH;aACF;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,0CAA0C;QAC1C,SAAS,eAAe,CACtB,YAA2B,EAC3B,UAA+B,EAC/B,aAA4B,EAC5B,cAA8B;;YAE9B,MAAM,cAAc,GAAG,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC/D,MAAM,YAAY,GAChB,cAAc,uBAA8B;gBAC1C,CAAC,OAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,cAA+B,CAAC,mCAChE,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAC3C,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;YAChD,MAAM,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAC1C,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,CACtC,CAAC;YAEF,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE;gBAClC,+CAA+C;gBAC/C,IAAI,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE;oBACxC,OAAO,KAAK,CAAC;iBACd;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,aAAa;oBACnB,SAAS,EAAE,eAAe;iBAC3B,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;aACb;YAED,IAAI,cAAc,iBAAwB,EAAE;gBAC1C,OAAO,KAAK,CAAC;aACd;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAC1E,IAAI,CAAC,MAAM,EAAE;gBACX,OAAO,KAAK,CAAC;aACd;YAED,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;YACpC,OAAO,CAAC,MAAM,CAAC;gBACb,IAAI,EAAE,aAAa;gBACnB,SAAS,EAAE,kBAAkB;gBAC7B,IAAI,EAAE;oBACJ,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;oBACpC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC;iBACzC;aACF,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,SAAS,iBAAiB,CACxB,cAAqD;YAErD,OAAO,cAAc;gBACnB,CAAC,CAAC,uDAAuD;;gBAEzD,CAAC,CAAC,iFAAiF;gCAC9D,CAAC;QAC1B,CAAC;QAED,OAAO;YACL,kCAAkC,CAChC,IAAiC;gBAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAC1B,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CACvD,CAAC;gBACF,IAAI,SAAS,GAAG,eAAe,CAC7B,IAAI,CAAC,EAAE,EACP,IAAI,EACJ,IAAI,EACJ,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,CAC1C,CAAC;gBAEF,IAAI,CAAC,SAAS,EAAE;oBACd,SAAS,GAAG,2BAA2B,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;iBACxD;gBACD,IAAI,CAAC,SAAS,EAAE;oBACd,4BAA4B,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;iBAC7C;YACH,CAAC;YACD,8BAA8B,CAAC,IAA4B;gBACzD,eAAe,CACb,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,KAAM,EACX,IAAI,EACJ,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CACvC,CAAC;YACJ,CAAC;YACD,yDAAyD,CACvD,IAAgE;gBAEhE,IAAI,SAAS,GAAG,eAAe,CAC7B,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,EACV,IAAI,gBAGL,CAAC;gBAEF,IAAI,CAAC,SAAS,EAAE;oBACd,SAAS,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;iBAChE;gBACD,IAAI,CAAC,SAAS,EAAE;oBACd,4BAA4B,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;iBACrD;YACH,CAAC;YACD,mDAAmD;YACnD,gCAAgC,CAAC,IAAuB;gBACtD,IACE,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,iBAAiB;oBACpD,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,6BAA6B,EAChE;oBACA,4BAA4B;oBAC5B,OAAO;iBACR;gBAED,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,qBAA4B,CAAC;YACzE,CAAC;YACD,iCAAiC,CAAC,IAA4B;gBAC5D,MAAM,SAAS,GAAG,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBACtD,IACE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAC5B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAC1C;oBACA,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,IAAI;wBACV,SAAS,EAAE,mBAAmB;qBAC/B,CAAC,CAAC;iBACJ;YACH,CAAC;YACD,6BAA6B,CAAC,IAA2B;gBACvD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAC3B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CACxD,CAAC;gBACF,IACE,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,sBAAsB;oBACpD,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,mCAAc,CAAC,kBAAkB,EAC3D;oBACA,OAAO;iBACR;gBAED,eAAe,CACb,IAAI,CAAC,IAAI,EACT,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,UAAU,qBAEjB,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-call.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-call.js
new file mode 100644
index 0000000..b3d4b5d
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-call.js
@@ -0,0 +1,67 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const util = __importStar(require("../util"));
+exports.default = util.createRule({
+    name: 'no-unsafe-call',
+    meta: {
+        type: 'problem',
+        docs: {
+            description: 'Disallows calling an any type value',
+            category: 'Possible Errors',
+            recommended: 'error',
+            requiresTypeChecking: true,
+        },
+        messages: {
+            unsafeCall: 'Unsafe call of an any typed value.',
+            unsafeNew: 'Unsafe construction of an any type value.',
+            unsafeTemplateTag: 'Unsafe any typed template tag.',
+        },
+        schema: [],
+    },
+    defaultOptions: [],
+    create(context) {
+        const { program, esTreeNodeToTSNodeMap } = util.getParserServices(context);
+        const checker = program.getTypeChecker();
+        function checkCall(node, reportingNode, messageId) {
+            const tsNode = esTreeNodeToTSNodeMap.get(node);
+            const type = util.getConstrainedTypeAtLocation(checker, tsNode);
+            if (util.isTypeAnyType(type)) {
+                context.report({
+                    node: reportingNode,
+                    messageId: messageId,
+                });
+            }
+        }
+        return {
+            'CallExpression > *.callee'(node) {
+                checkCall(node, node, 'unsafeCall');
+            },
+            NewExpression(node) {
+                checkCall(node.callee, node, 'unsafeNew');
+            },
+            'TaggedTemplateExpression > *.tag'(node) {
+                checkCall(node, node, 'unsafeTemplateTag');
+            },
+        };
+    },
+});
+//# sourceMappingURL=no-unsafe-call.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-call.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-call.js.map
new file mode 100644
index 0000000..2f8e7e8
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-call.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"no-unsafe-call.js","sourceRoot":"","sources":["../../src/rules/no-unsafe-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,8CAAgC;AAIhC,kBAAe,IAAI,CAAC,UAAU,CAAiB;IAC7C,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,qCAAqC;YAClD,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,OAAO;YACpB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,UAAU,EAAE,oCAAoC;YAChD,SAAS,EAAE,2CAA2C;YACtD,iBAAiB,EAAE,gCAAgC;SACpD;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QAEzC,SAAS,SAAS,CAChB,IAAmB,EACnB,aAA4B,EAC5B,SAAqB;YAErB,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,4BAA4B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAEhE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;gBAC5B,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,aAAa;oBACnB,SAAS,EAAE,SAAS;iBACrB,CAAC,CAAC;aACJ;QACH,CAAC;QAED,OAAO;YACL,2BAA2B,CACzB,IAAuC;gBAEvC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YACtC,CAAC;YACD,aAAa,CAAC,IAAI;gBAChB,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC5C,CAAC;YACD,kCAAkC,CAAC,IAAmB;gBACpD,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC;YAC7C,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-member-access.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-member-access.js
new file mode 100644
index 0000000..21c6c31
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-member-access.js
@@ -0,0 +1,105 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const util = __importStar(require("../util"));
+exports.default = util.createRule({
+    name: 'no-unsafe-member-access',
+    meta: {
+        type: 'problem',
+        docs: {
+            description: 'Disallows member access on any typed variables',
+            category: 'Possible Errors',
+            recommended: 'error',
+            requiresTypeChecking: true,
+        },
+        messages: {
+            unsafeMemberExpression: 'Unsafe member access {{property}} on an any value.',
+            unsafeComputedMemberAccess: 'Computed name {{property}} resolves to an any value.',
+        },
+        schema: [],
+    },
+    defaultOptions: [],
+    create(context) {
+        const { program, esTreeNodeToTSNodeMap } = util.getParserServices(context);
+        const checker = program.getTypeChecker();
+        const sourceCode = context.getSourceCode();
+        const stateCache = new Map();
+        function checkMemberExpression(node) {
+            const cachedState = stateCache.get(node);
+            if (cachedState) {
+                return cachedState;
+            }
+            if (node.object.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression) {
+                const objectState = checkMemberExpression(node.object);
+                if (objectState === 1 /* Unsafe */) {
+                    // if the object is unsafe, we know this will be unsafe as well
+                    // we don't need to report, as we have already reported on the inner member expr
+                    stateCache.set(node, objectState);
+                    return objectState;
+                }
+            }
+            const tsNode = esTreeNodeToTSNodeMap.get(node.object);
+            const type = checker.getTypeAtLocation(tsNode);
+            const state = util.isTypeAnyType(type) ? 1 /* Unsafe */ : 2 /* Safe */;
+            stateCache.set(node, state);
+            if (state === 1 /* Unsafe */) {
+                const propertyName = sourceCode.getText(node.property);
+                context.report({
+                    node,
+                    messageId: 'unsafeMemberExpression',
+                    data: {
+                        property: node.computed ? `[${propertyName}]` : `.${propertyName}`,
+                    },
+                });
+            }
+            return state;
+        }
+        return {
+            MemberExpression: checkMemberExpression,
+            'MemberExpression[computed = true] > *.property'(node) {
+                if (
+                // x[1]
+                node.type === experimental_utils_1.AST_NODE_TYPES.Literal ||
+                    // x[1++] x[++x] etc
+                    // FUN FACT - **all** update expressions return type number, regardless of the argument's type,
+                    // because JS engines return NaN if there the argument is not a number.
+                    node.type === experimental_utils_1.AST_NODE_TYPES.UpdateExpression) {
+                    // perf optimizations - literals can obviously never be `any`
+                    return;
+                }
+                const tsNode = esTreeNodeToTSNodeMap.get(node);
+                const type = checker.getTypeAtLocation(tsNode);
+                if (util.isTypeAnyType(type)) {
+                    const propertyName = sourceCode.getText(node);
+                    context.report({
+                        node,
+                        messageId: 'unsafeComputedMemberAccess',
+                        data: {
+                            property: `[${propertyName}]`,
+                        },
+                    });
+                }
+            },
+        };
+    },
+});
+//# sourceMappingURL=no-unsafe-member-access.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-member-access.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-member-access.js.map
new file mode 100644
index 0000000..4a2df7a
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-member-access.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"no-unsafe-member-access.js","sourceRoot":"","sources":["../../src/rules/no-unsafe-member-access.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-return.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-return.js
new file mode 100644
index 0000000..50b809c
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-return.js
@@ -0,0 +1,137 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const tsutils_1 = require("tsutils");
+const util = __importStar(require("../util"));
+exports.default = util.createRule({
+    name: 'no-unsafe-return',
+    meta: {
+        type: 'problem',
+        docs: {
+            description: 'Disallows returning any from a function',
+            category: 'Possible Errors',
+            recommended: 'error',
+            requiresTypeChecking: true,
+        },
+        messages: {
+            unsafeReturn: 'Unsafe return of an {{type}} typed value',
+            unsafeReturnAssignment: 'Unsafe return of type {{sender}} from function with return type {{receiver}}.',
+        },
+        schema: [],
+    },
+    defaultOptions: [],
+    create(context) {
+        const { program, esTreeNodeToTSNodeMap } = util.getParserServices(context);
+        const checker = program.getTypeChecker();
+        function getParentFunctionNode(node) {
+            let current = node.parent;
+            while (current) {
+                if (current.type === experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression ||
+                    current.type === experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration ||
+                    current.type === experimental_utils_1.AST_NODE_TYPES.FunctionExpression) {
+                    return current;
+                }
+                current = current.parent;
+            }
+            // this shouldn't happen in correct code, but someone may attempt to parse bad code
+            // the parser won't error, so we shouldn't throw here
+            /* istanbul ignore next */ return null;
+        }
+        function checkReturn(returnNode, reportingNode = returnNode) {
+            const tsNode = esTreeNodeToTSNodeMap.get(returnNode);
+            const anyType = util.isAnyOrAnyArrayTypeDiscriminated(tsNode, checker);
+            const functionNode = getParentFunctionNode(returnNode);
+            /* istanbul ignore if */ if (!functionNode) {
+                return;
+            }
+            // function has an explicit return type, so ensure it's a safe return
+            const returnNodeType = util.getConstrainedTypeAtLocation(checker, esTreeNodeToTSNodeMap.get(returnNode));
+            const functionTSNode = esTreeNodeToTSNodeMap.get(functionNode);
+            // function expressions will not have their return type modified based on receiver typing
+            // so we have to use the contextual typing in these cases, i.e.
+            // const foo1: () => Set<string> = () => new Set<any>();
+            // the return type of the arrow function is Set<any> even though the variable is typed as Set<string>
+            let functionType = tsutils_1.isExpression(functionTSNode)
+                ? util.getContextualType(checker, functionTSNode)
+                : checker.getTypeAtLocation(functionTSNode);
+            if (!functionType) {
+                functionType = checker.getTypeAtLocation(functionTSNode);
+            }
+            if (anyType !== 2 /* Safe */) {
+                // Allow cases when the declared return type of the function is either unknown or unknown[]
+                // and the function is returning any or any[].
+                for (const signature of functionType.getCallSignatures()) {
+                    const functionReturnType = signature.getReturnType();
+                    if (anyType === 0 /* Any */ &&
+                        util.isTypeUnknownType(functionReturnType)) {
+                        return;
+                    }
+                    if (anyType === 1 /* AnyArray */ &&
+                        util.isTypeUnknownArrayType(functionReturnType, checker)) {
+                        return;
+                    }
+                }
+                // If the function return type was not unknown/unknown[], mark usage as unsafeReturn.
+                return context.report({
+                    node: reportingNode,
+                    messageId: 'unsafeReturn',
+                    data: {
+                        type: anyType === 0 /* Any */ ? 'any' : 'any[]',
+                    },
+                });
+            }
+            for (const signature of functionType.getCallSignatures()) {
+                const functionReturnType = signature.getReturnType();
+                if (returnNodeType === functionReturnType) {
+                    // don't bother checking if they're the same
+                    // either the function is explicitly declared to return the same type
+                    // or there was no declaration, so the return type is implicit
+                    return;
+                }
+                const result = util.isUnsafeAssignment(returnNodeType, functionReturnType, checker);
+                if (!result) {
+                    return;
+                }
+                const { sender, receiver } = result;
+                return context.report({
+                    node: reportingNode,
+                    messageId: 'unsafeReturnAssignment',
+                    data: {
+                        sender: checker.typeToString(sender),
+                        receiver: checker.typeToString(receiver),
+                    },
+                });
+            }
+        }
+        return {
+            ReturnStatement(node) {
+                const argument = node.argument;
+                if (!argument) {
+                    return;
+                }
+                checkReturn(argument, node);
+            },
+            'ArrowFunctionExpression > :not(BlockStatement).body': checkReturn,
+        };
+    },
+});
+//# sourceMappingURL=no-unsafe-return.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-return.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-return.js.map
new file mode 100644
index 0000000..e2f30ca
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unsafe-return.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"no-unsafe-return.js","sourceRoot":"","sources":["../../src/rules/no-unsafe-return.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-untyped-public-signature.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-untyped-public-signature.js
deleted file mode 100644
index 6834e58..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-untyped-public-signature.js
+++ /dev/null
@@ -1,99 +0,0 @@
-"use strict";
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const util = __importStar(require("../util"));
-const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-exports.default = util.createRule({
-    name: 'no-untyped-public-signature',
-    meta: {
-        deprecated: true,
-        replacedBy: ['explicit-module-boundary-types'],
-        docs: {
-            description: 'Disallow untyped public methods',
-            category: 'Best Practices',
-            recommended: false,
-        },
-        messages: {
-            noReturnType: 'Public method has no return type',
-            untypedParameter: 'Public method parameters should be typed',
-        },
-        schema: [
-            {
-                allowAdditionalProperties: false,
-                properties: {
-                    ignoredMethods: {
-                        type: 'array',
-                        items: {
-                            type: 'string',
-                        },
-                    },
-                },
-                type: 'object',
-            },
-        ],
-        type: 'suggestion',
-    },
-    defaultOptions: [{ ignoredMethods: [] }],
-    create(context, [options]) {
-        const ignoredMethods = new Set(options.ignoredMethods);
-        function isPublicMethod(node) {
-            return node.accessibility === 'public' || !node.accessibility;
-        }
-        function isIgnoredMethod(node, ignoredMethods) {
-            if (node.key.type === experimental_utils_1.AST_NODE_TYPES.Literal &&
-                typeof node.key.value === 'string') {
-                return ignoredMethods.has(node.key.value);
-            }
-            if (node.key.type === experimental_utils_1.AST_NODE_TYPES.TemplateLiteral &&
-                node.key.expressions.length === 0) {
-                return ignoredMethods.has(node.key.quasis[0].value.raw);
-            }
-            if (!node.computed && node.key.type === experimental_utils_1.AST_NODE_TYPES.Identifier) {
-                return ignoredMethods.has(node.key.name);
-            }
-            return false;
-        }
-        function isParamTyped(node) {
-            return (!!node.typeAnnotation &&
-                node.typeAnnotation.typeAnnotation.type !== experimental_utils_1.AST_NODE_TYPES.TSAnyKeyword);
-        }
-        function isReturnTyped(node) {
-            if (!node) {
-                return false;
-            }
-            return (node.typeAnnotation &&
-                node.typeAnnotation.type !== experimental_utils_1.AST_NODE_TYPES.TSAnyKeyword);
-        }
-        return {
-            'TSAbstractMethodDefinition, MethodDefinition'(node) {
-                if (isPublicMethod(node) && !isIgnoredMethod(node, ignoredMethods)) {
-                    const paramIdentifiers = node.value.params.filter(param => param.type === experimental_utils_1.AST_NODE_TYPES.Identifier);
-                    const identifiersHaveTypes = paramIdentifiers.every(isParamTyped);
-                    if (!identifiersHaveTypes) {
-                        context.report({
-                            node,
-                            messageId: 'untypedParameter',
-                            data: {},
-                        });
-                    }
-                    if (node.kind !== 'constructor' &&
-                        node.kind !== 'set' &&
-                        !isReturnTyped(node.value.returnType)) {
-                        context.report({
-                            node,
-                            messageId: 'noReturnType',
-                            data: {},
-                        });
-                    }
-                }
-            },
-        };
-    },
-});
-//# sourceMappingURL=no-untyped-public-signature.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-untyped-public-signature.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-untyped-public-signature.js.map
deleted file mode 100644
index a51d901..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-untyped-public-signature.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"no-untyped-public-signature.js","sourceRoot":"","sources":["../../src/rules/no-untyped-public-signature.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-expressions.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-expressions.js
index 4842a26..1b3a2d4 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-expressions.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-expressions.js
@@ -1,14 +1,27 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var _a;
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const no_unused_expressions_1 = __importDefault(require("eslint/lib/rules/no-unused-expressions"));
@@ -24,15 +37,35 @@
             extendsBaseRule: true,
         },
         schema: no_unused_expressions_1.default.meta.schema,
-        messages: {},
+        messages: (_a = no_unused_expressions_1.default.meta.messages) !== null && _a !== void 0 ? _a : {
+            unusedExpression: 'Expected an assignment or function call and instead saw an expression.',
+        },
     },
-    defaultOptions: [],
-    create(context) {
+    defaultOptions: [
+        {
+            allowShortCircuit: false,
+            allowTernary: false,
+            allowTaggedTemplates: false,
+        },
+    ],
+    create(context, options) {
         const rules = no_unused_expressions_1.default.create(context);
+        const { allowShortCircuit = false, allowTernary = false } = options[0];
+        function isValidExpression(node) {
+            if (allowShortCircuit && node.type === experimental_utils_1.AST_NODE_TYPES.LogicalExpression) {
+                return isValidExpression(node.right);
+            }
+            if (allowTernary && node.type === experimental_utils_1.AST_NODE_TYPES.ConditionalExpression) {
+                return (isValidExpression(node.alternate) &&
+                    isValidExpression(node.consequent));
+            }
+            return ((node.type === experimental_utils_1.AST_NODE_TYPES.ChainExpression &&
+                node.expression.type === experimental_utils_1.AST_NODE_TYPES.CallExpression) ||
+                node.type === experimental_utils_1.AST_NODE_TYPES.ImportExpression);
+        }
         return {
             ExpressionStatement(node) {
-                if (node.directive ||
-                    node.expression.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression) {
+                if (node.directive || isValidExpression(node.expression)) {
                     return;
                 }
                 rules.ExpressionStatement(node);
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-expressions.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-expressions.js.map
index 3fa9a2e..d9fc646 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-expressions.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-expressions.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-unused-expressions.js","sourceRoot":"","sources":["../../src/rules/no-unused-expressions.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8EAAuE;AACvE,mGAA8D;AAC9D,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,uBAAuB;IAC7B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,6BAA6B;YAC1C,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,MAAM,EAAE,+BAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,EAAE,EAAE;KACb;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,+BAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvC,OAAO;YACL,mBAAmB,CAAC,IAAI;gBACtB,IACE,IAAI,CAAC,SAAS;oBACd,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,mCAAc,CAAC,sBAAsB,EAC9D;oBACA,OAAO;iBACR;gBAED,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-unused-expressions.js","sourceRoot":"","sources":["../../src/rules/no-unused-expressions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,mGAA8D;AAC9D,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,uBAAuB;IAC7B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,6BAA6B;YAC1C,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,MAAM,EAAE,+BAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,QAAE,+BAAQ,CAAC,IAAI,CAAC,QAAQ,mCAAI;YAClC,gBAAgB,EACd,wEAAwE;SAC3E;KACF;IACD,cAAc,EAAE;QACd;YACE,iBAAiB,EAAE,KAAK;YACxB,YAAY,EAAE,KAAK;YACnB,oBAAoB,EAAE,KAAK;SAC5B;KACF;IACD,MAAM,CAAC,OAAO,EAAE,OAAO;QACrB,MAAM,KAAK,GAAG,+BAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,EAAE,iBAAiB,GAAG,KAAK,EAAE,YAAY,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAEvE,SAAS,iBAAiB,CAAC,IAAmB;YAC5C,IAAI,iBAAiB,IAAI,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,iBAAiB,EAAE;gBACvE,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACtC;YACD,IAAI,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,qBAAqB,EAAE;gBACtE,OAAO,CACL,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;oBACjC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CACnC,CAAC;aACH;YACD,OAAO,CACL,CAAC,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,eAAe;gBAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,mCAAc,CAAC,cAAc,CAAC;gBACzD,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,gBAAgB,CAC9C,CAAC;QACJ,CAAC;QAED,OAAO;YACL,mBAAmB,CAAC,IAAI;gBACtB,IAAI,IAAI,CAAC,SAAS,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;oBACxD,OAAO;iBACR;gBAED,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars-experimental.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars-experimental.js
index 11b8b77..fd05722 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars-experimental.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars-experimental.js
@@ -1,13 +1,26 @@
 "use strict";
 /* eslint-disable no-fallthrough */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.DEFAULT_IGNORED_REGEX_STRING = void 0;
 const ts = __importStar(require("typescript"));
 const util = __importStar(require("../util"));
 exports.DEFAULT_IGNORED_REGEX_STRING = '^_';
@@ -19,8 +32,9 @@
             description: 'Disallow unused variables and arguments',
             category: 'Best Practices',
             recommended: false,
-            requiresTypeChecking: true,
         },
+        deprecated: true,
+        replacedBy: ['no-unused-vars'],
         schema: [
             {
                 type: 'object',
@@ -45,7 +59,7 @@
         ],
         messages: {
             unused: "{{type}} '{{name}}' is declared but its value is never read.",
-            unusedWithIgnorePattern: "{{type}} '{{name}}' is declared but its value is never read. Allowed unused names must match {{pattern}}",
+            unusedWithIgnorePattern: "{{type}} '{{name}}' is declared but its value is never read. Allowed unused names must match {{pattern}}.",
             unusedImport: 'All imports in import declaration are unused.',
             unusedTypeParameters: 'All type parameters are unused.',
         },
@@ -58,14 +72,14 @@
     ],
     create(context, [userOptions]) {
         var _a;
-        const parserServices = util.getParserServices(context);
+        const parserServices = util.getParserServices(context, true);
         const tsProgram = parserServices.program;
         const afterAllDiagnosticsCallbacks = [];
         const options = {
             ignoredNames: userOptions && typeof userOptions.ignoredNamesRegex === 'string'
                 ? new RegExp(userOptions.ignoredNamesRegex)
                 : null,
-            ignoreArgsIfArgsAfterAreUsed: (_a = userOptions.ignoreArgsIfArgsAfterAreUsed, (_a !== null && _a !== void 0 ? _a : false)),
+            ignoreArgsIfArgsAfterAreUsed: (_a = userOptions.ignoreArgsIfArgsAfterAreUsed) !== null && _a !== void 0 ? _a : false,
         };
         function handleIdentifier(identifier) {
             function report(type) {
@@ -122,7 +136,6 @@
                 case ts.SyntaxKind.ImportSpecifier:
                 // a namespace import is NOT used, but the default import is used
                 case ts.SyntaxKind.NamespaceImport:
-                    // eslint-disable-next-line @typescript-eslint/internal/prefer-ast-types-enum
                     report('Import');
                     break;
                 case ts.SyntaxKind.InterfaceDeclaration:
@@ -157,7 +170,7 @@
         const unusedParameters = new Set();
         function handleParameterDeclaration(identifier, parent) {
             const name = identifier.getText();
-            // regardless of if the paramter is ignored, track that it had a diagnostic fired on it
+            // regardless of if the parameter is ignored, track that it had a diagnostic fired on it
             unusedParameters.add(identifier);
             /*
             NOTE - Typescript will automatically ignore parameters that have a
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars-experimental.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars-experimental.js.map
index 55f3d88..d5e1583 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars-experimental.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars-experimental.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-unused-vars-experimental.js","sourceRoot":"","sources":["../../src/rules/no-unused-vars-experimental.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"no-unused-vars-experimental.js","sourceRoot":"","sources":["../../src/rules/no-unused-vars-experimental.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars.js
index 2ab3871..fbb7b03 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars.js
@@ -1,16 +1,30 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var _a;
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const scope_manager_1 = require("@typescript-eslint/scope-manager");
 const no_unused_vars_1 = __importDefault(require("eslint/lib/rules/no-unused-vars"));
 const util = __importStar(require("../util"));
 exports.default = util.createRule({
@@ -24,61 +38,320 @@
             extendsBaseRule: true,
         },
         schema: no_unused_vars_1.default.meta.schema,
-        messages: no_unused_vars_1.default.meta.messages,
+        messages: (_a = no_unused_vars_1.default.meta.messages) !== null && _a !== void 0 ? _a : {
+            unusedVar: "'{{varName}}' is {{action}} but never used{{additional}}.",
+        },
     },
-    defaultOptions: [],
+    defaultOptions: [{}],
     create(context) {
         const rules = no_unused_vars_1.default.create(context);
+        const filename = context.getFilename();
+        const MODULE_DECL_CACHE = new Map();
         /**
-         * Mark heritage clause as used
-         * @param node The node currently being traversed
+         * Gets a list of TS module definitions for a specified variable.
+         * @param variable eslint-scope variable object.
          */
-        function markHeritageAsUsed(node) {
+        function getModuleNameDeclarations(variable) {
+            const moduleDeclarations = [];
+            variable.defs.forEach(def => {
+                if (def.type === 'TSModuleName') {
+                    moduleDeclarations.push(def.node);
+                }
+            });
+            return moduleDeclarations;
+        }
+        /**
+         * Determine if an identifier is referencing an enclosing name.
+         * This only applies to declarations that create their own scope (modules, functions, classes)
+         * @param ref The reference to check.
+         * @param nodes The candidate function nodes.
+         * @returns True if it's a self-reference, false if not.
+         */
+        function isBlockSelfReference(ref, nodes) {
+            let scope = ref.from;
+            while (scope) {
+                if (nodes.indexOf(scope.block) >= 0) {
+                    return true;
+                }
+                scope = scope.upper;
+            }
+            return false;
+        }
+        function isExported(variable, target) {
+            // TS will require that all merged namespaces/interfaces are exported, so we only need to find one
+            return variable.defs.some(def => {
+                var _a, _b;
+                return def.node.type === target &&
+                    (((_a = def.node.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.ExportNamedDeclaration ||
+                        ((_b = def.node.parent) === null || _b === void 0 ? void 0 : _b.type) === experimental_utils_1.AST_NODE_TYPES.ExportDefaultDeclaration);
+            });
+        }
+        return Object.assign(Object.assign({}, rules), { 'TSCallSignatureDeclaration, TSConstructorType, TSConstructSignatureDeclaration, TSDeclareFunction, TSEmptyBodyFunctionExpression, TSFunctionType, TSMethodSignature'(node) {
+                // function type signature params create variables because they can be referenced within the signature,
+                // but they obviously aren't unused variables for the purposes of this rule.
+                for (const param of node.params) {
+                    visitPattern(param, name => {
+                        context.markVariableAsUsed(name.name);
+                    });
+                }
+            },
+            TSEnumDeclaration() {
+                // enum members create variables because they can be referenced within the enum,
+                // but they obviously aren't unused variables for the purposes of this rule.
+                const scope = context.getScope();
+                for (const variable of scope.variables) {
+                    context.markVariableAsUsed(variable.name);
+                }
+            },
+            TSMappedType(node) {
+                // mapped types create a variable for their type name, but it's not necessary to reference it,
+                // so we shouldn't consider it as unused for the purpose of this rule.
+                context.markVariableAsUsed(node.typeParameter.name.name);
+            },
+            TSModuleDeclaration() {
+                const childScope = context.getScope();
+                const scope = util.nullThrows(context.getScope().upper, util.NullThrowsReasons.MissingToken(childScope.type, 'upper scope'));
+                for (const variable of scope.variables) {
+                    const moduleNodes = getModuleNameDeclarations(variable);
+                    if (moduleNodes.length === 0 ||
+                        // ignore unreferenced module definitions, as the base rule will report on them
+                        variable.references.length === 0 ||
+                        // ignore exported nodes
+                        isExported(variable, experimental_utils_1.AST_NODE_TYPES.TSModuleDeclaration)) {
+                        continue;
+                    }
+                    // check if the only reference to a module's name is a self-reference in its body
+                    // this won't be caught by the base rule because it doesn't understand TS modules
+                    const isOnlySelfReferenced = variable.references.every(ref => {
+                        return isBlockSelfReference(ref, moduleNodes);
+                    });
+                    if (isOnlySelfReferenced) {
+                        context.report({
+                            node: variable.identifiers[0],
+                            messageId: 'unusedVar',
+                            data: {
+                                varName: variable.name,
+                                action: 'defined',
+                                additional: '',
+                            },
+                        });
+                    }
+                }
+            },
+            [[
+                'TSParameterProperty > AssignmentPattern > Identifier.left',
+                'TSParameterProperty > Identifier.parameter',
+            ].join(', ')](node) {
+                // just assume parameter properties are used as property usage tracking is beyond the scope of this rule
+                context.markVariableAsUsed(node.name);
+            },
+            ':matches(FunctionDeclaration, FunctionExpression, ArrowFunctionExpression) > Identifier[name="this"].params'(node) {
+                // this parameters should always be considered used as they're pseudo-parameters
+                context.markVariableAsUsed(node.name);
+            },
+            'TSInterfaceDeclaration, TSTypeAliasDeclaration'(node) {
+                const variable = context.getScope().set.get(node.id.name);
+                if (!variable) {
+                    return;
+                }
+                if (variable.references.length === 0 ||
+                    // ignore exported nodes
+                    isExported(variable, node.type)) {
+                    return;
+                }
+                // check if the type is only self-referenced
+                // this won't be caught by the base rule because it doesn't understand self-referencing types
+                const isOnlySelfReferenced = variable.references.every(ref => {
+                    if (ref.identifier.range[0] >= node.range[0] &&
+                        ref.identifier.range[1] <= node.range[1]) {
+                        return true;
+                    }
+                    return false;
+                });
+                if (isOnlySelfReferenced) {
+                    context.report({
+                        node: variable.identifiers[0],
+                        messageId: 'unusedVar',
+                        data: {
+                            varName: variable.name,
+                            action: 'defined',
+                            additional: '',
+                        },
+                    });
+                }
+            },
+            // declaration file handling
+            [ambientDeclarationSelector(experimental_utils_1.AST_NODE_TYPES.Program, true)](node) {
+                if (!util.isDefinitionFile(filename)) {
+                    return;
+                }
+                markDeclarationChildAsUsed(node);
+            },
+            // global augmentation can be in any file, and they do not need exports
+            'TSModuleDeclaration[declare = true][global = true]'() {
+                context.markVariableAsUsed('global');
+            },
+            // children of a namespace that is a child of a declared namespace are auto-exported
+            [ambientDeclarationSelector('TSModuleDeclaration[declare = true] > TSModuleBlock TSModuleDeclaration > TSModuleBlock', false)](node) {
+                markDeclarationChildAsUsed(node);
+            },
+            // declared namespace handling
+            [ambientDeclarationSelector('TSModuleDeclaration[declare = true] > TSModuleBlock', false)](node) {
+                var _a;
+                const moduleDecl = util.nullThrows((_a = node.parent) === null || _a === void 0 ? void 0 : _a.parent, util.NullThrowsReasons.MissingParent);
+                // declared ambient modules with an `export =` statement will only export that one thing
+                // all other statements are not automatically exported in this case
+                if (moduleDecl.id.type === experimental_utils_1.AST_NODE_TYPES.Literal &&
+                    checkModuleDeclForExportEquals(moduleDecl)) {
+                    return;
+                }
+                markDeclarationChildAsUsed(node);
+            } });
+        function checkModuleDeclForExportEquals(node) {
+            var _a, _b;
+            const cached = MODULE_DECL_CACHE.get(node);
+            if (cached != null) {
+                return cached;
+            }
+            for (const statement of (_b = (_a = node.body) === null || _a === void 0 ? void 0 : _a.body) !== null && _b !== void 0 ? _b : []) {
+                if (statement.type === experimental_utils_1.AST_NODE_TYPES.TSExportAssignment) {
+                    MODULE_DECL_CACHE.set(node, true);
+                    return true;
+                }
+            }
+            MODULE_DECL_CACHE.set(node, false);
+            return false;
+        }
+        function ambientDeclarationSelector(parent, childDeclare) {
+            return [
+                // Types are ambiently exported
+                `${parent} > :matches(${[
+                    experimental_utils_1.AST_NODE_TYPES.TSInterfaceDeclaration,
+                    experimental_utils_1.AST_NODE_TYPES.TSTypeAliasDeclaration,
+                ].join(', ')})`,
+                // Value things are ambiently exported if they are "declare"d
+                `${parent} > :matches(${[
+                    experimental_utils_1.AST_NODE_TYPES.ClassDeclaration,
+                    experimental_utils_1.AST_NODE_TYPES.TSDeclareFunction,
+                    experimental_utils_1.AST_NODE_TYPES.TSEnumDeclaration,
+                    experimental_utils_1.AST_NODE_TYPES.TSModuleDeclaration,
+                    experimental_utils_1.AST_NODE_TYPES.VariableDeclaration,
+                ].join(', ')})${childDeclare ? '[declare = true]' : ''}`,
+            ].join(', ');
+        }
+        function markDeclarationChildAsUsed(node) {
+            var _a;
+            const identifiers = [];
             switch (node.type) {
-                case experimental_utils_1.AST_NODE_TYPES.Identifier:
-                    context.markVariableAsUsed(node.name);
+                case experimental_utils_1.AST_NODE_TYPES.TSInterfaceDeclaration:
+                case experimental_utils_1.AST_NODE_TYPES.TSTypeAliasDeclaration:
+                case experimental_utils_1.AST_NODE_TYPES.ClassDeclaration:
+                case experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration:
+                case experimental_utils_1.AST_NODE_TYPES.TSDeclareFunction:
+                case experimental_utils_1.AST_NODE_TYPES.TSEnumDeclaration:
+                case experimental_utils_1.AST_NODE_TYPES.TSModuleDeclaration:
+                    if (((_a = node.id) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.Identifier) {
+                        identifiers.push(node.id);
+                    }
                     break;
-                case experimental_utils_1.AST_NODE_TYPES.MemberExpression:
-                    markHeritageAsUsed(node.object);
-                    break;
-                case experimental_utils_1.AST_NODE_TYPES.CallExpression:
-                    markHeritageAsUsed(node.callee);
+                case experimental_utils_1.AST_NODE_TYPES.VariableDeclaration:
+                    for (const declaration of node.declarations) {
+                        visitPattern(declaration, pattern => {
+                            identifiers.push(pattern);
+                        });
+                    }
                     break;
             }
-        }
-        return Object.assign({}, rules, {
-            'TSTypeReference Identifier'(node) {
-                context.markVariableAsUsed(node.name);
-            },
-            TSInterfaceHeritage(node) {
-                if (node.expression) {
-                    markHeritageAsUsed(node.expression);
-                }
-            },
-            TSClassImplements(node) {
-                if (node.expression) {
-                    markHeritageAsUsed(node.expression);
-                }
-            },
-            'TSParameterProperty Identifier'(node) {
-                // just assume parameter properties are used
-                context.markVariableAsUsed(node.name);
-            },
-            'TSEnumMember Identifier'(node) {
-                context.markVariableAsUsed(node.name);
-            },
-            '*[declare=true] Identifier'(node) {
-                context.markVariableAsUsed(node.name);
-                const scope = context.getScope();
-                const { variableScope } = scope;
-                if (variableScope !== scope) {
-                    const superVar = variableScope.set.get(node.name);
+            const scope = context.getScope();
+            const { variableScope } = scope;
+            if (variableScope !== scope) {
+                for (const id of identifiers) {
+                    const superVar = variableScope.set.get(id.name);
                     if (superVar) {
                         superVar.eslintUsed = true;
                     }
                 }
-            },
-        });
+            }
+            else {
+                for (const id of identifiers) {
+                    context.markVariableAsUsed(id.name);
+                }
+            }
+        }
+        function visitPattern(node, cb) {
+            const visitor = new scope_manager_1.PatternVisitor({}, node, cb);
+            visitor.visit(node);
+        }
     },
 });
+/*
+
+###### TODO ######
+
+Edge cases that aren't currently handled due to laziness and them being super edgy edge cases
+
+
+--- function params referenced in typeof type refs in the function declaration ---
+--- NOTE - TS gets these cases wrong
+
+function _foo(
+  arg: number // arg should be unused
+): typeof arg {
+  return 1 as any;
+}
+
+function _bar(
+  arg: number, // arg should be unused
+  _arg2: typeof arg,
+) {}
+
+
+--- function names referenced in typeof type refs in the function declaration ---
+--- NOTE - TS gets these cases right
+
+function foo( // foo should be unused
+): typeof foo {
+    return 1 as any;
+}
+
+function bar( // bar should be unused
+  _arg: typeof bar
+) {}
+
+*/
+/*
+
+###### TODO ######
+
+We currently extend base `no-unused-vars` implementation because it's easier and lighter-weight.
+
+Because of this, there are a few false-negatives which won't get caught.
+We could fix these if we fork the base rule; but that's a lot of code (~650 lines) to add in.
+I didn't want to do that just yet without some real-world issues, considering these are pretty rare edge-cases.
+
+These cases are mishandled because the base rule assumes that each variable has one def, but type-value shadowing
+creates a variable with two defs
+
+--- type-only or value-only references to type/value shadowed variables ---
+--- NOTE - TS gets these cases wrong
+
+type T = 1;
+const T = 2; // this T should be unused
+
+type U = T; // this U should be unused
+const U = 3;
+
+const _V = U;
+
+
+--- partially exported type/value shadowed variables ---
+--- NOTE - TS gets these cases wrong
+
+export interface Foo {}
+const Foo = 1; // this Foo should be unused
+
+interface Bar {} // this Bar should be unused
+export const Bar = 1;
+
+*/
 //# sourceMappingURL=no-unused-vars.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars.js.map
index 2c4990e..af5677d 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-unused-vars.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-unused-vars.js","sourceRoot":"","sources":["../../src/rules/no-unused-vars.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8EAG+C;AAC/C,qFAAuD;AACvD,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,2BAA2B;YACxC,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,MAAM;YACnB,eAAe,EAAE,IAAI;SACtB;QACD,MAAM,EAAE,wBAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,EAAE,wBAAQ,CAAC,IAAI,CAAC,QAAQ;KACjC;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,wBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvC;;;WAGG;QACH,SAAS,kBAAkB,CAAC,IAAyB;YACnD,QAAQ,IAAI,CAAC,IAAI,EAAE;gBACjB,KAAK,mCAAc,CAAC,UAAU;oBAC5B,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtC,MAAM;gBACR,KAAK,mCAAc,CAAC,gBAAgB;oBAClC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAChC,MAAM;gBACR,KAAK,mCAAc,CAAC,cAAc;oBAChC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAChC,MAAM;aACT;QACH,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE;YAC9B,4BAA4B,CAAC,IAAyB;gBACpD,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YACD,mBAAmB,CAAC,IAAkC;gBACpD,IAAI,IAAI,CAAC,UAAU,EAAE;oBACnB,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;iBACrC;YACH,CAAC;YACD,iBAAiB,CAAC,IAAgC;gBAChD,IAAI,IAAI,CAAC,UAAU,EAAE;oBACnB,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;iBACrC;YACH,CAAC;YACD,gCAAgC,CAAC,IAAyB;gBACxD,4CAA4C;gBAC5C,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YACD,yBAAyB,CAAC,IAAyB;gBACjD,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YACD,4BAA4B,CAAC,IAAyB;gBACpD,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACjC,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;gBAChC,IAAI,aAAa,KAAK,KAAK,EAAE;oBAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAClD,IAAI,QAAQ,EAAE;wBACZ,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC;qBAC5B;iBACF;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-unused-vars.js","sourceRoot":"","sources":["../../src/rules/no-unused-vars.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-use-before-define.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-use-before-define.js
index 5a14dab..c7807f1 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-use-before-define.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-use-before-define.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -19,6 +31,7 @@
     let enums = true;
     let variables = true;
     let typedefs = true;
+    let ignoreTypeReferences = true;
     if (typeof options === 'string') {
         functions = options !== 'nofunc';
     }
@@ -28,26 +41,16 @@
         enums = options.enums !== false;
         variables = options.variables !== false;
         typedefs = options.typedefs !== false;
+        ignoreTypeReferences = options.ignoreTypeReferences !== false;
     }
-    return { functions, classes, enums, variables, typedefs };
-}
-/**
- * Checks whether or not a given scope is a top level scope.
- */
-function isTopLevelScope(scope) {
-    return scope.type === 'module' || scope.type === 'global';
-}
-/**
- * Checks whether or not a given variable declaration in an upper scope.
- */
-function isOuterScope(variable, reference) {
-    if (variable.scope.variableScope === reference.from.variableScope) {
-        // allow the same scope only if it's the top level global/module scope
-        if (!isTopLevelScope(variable.scope.variableScope)) {
-            return false;
-        }
-    }
-    return true;
+    return {
+        functions,
+        classes,
+        enums,
+        variables,
+        typedefs,
+        ignoreTypeReferences,
+    };
 }
 /**
  * Checks whether or not a given variable is a function declaration.
@@ -56,24 +59,31 @@
     return variable.defs[0].type === 'FunctionName';
 }
 /**
- * Checks whether or not a given variable is a enum declaration in an upper function scope.
+ * Checks whether or not a given variable is a type declaration.
+ */
+function isTypedef(variable) {
+    return variable.defs[0].type === 'Type';
+}
+/**
+ * Checks whether or not a given variable is a enum declaration.
  */
 function isOuterEnum(variable, reference) {
-    const node = variable.defs[0].node;
-    return (node.type === experimental_utils_1.AST_NODE_TYPES.TSEnumDeclaration &&
-        isOuterScope(variable, reference));
+    return (variable.defs[0].type == 'TSEnumName' &&
+        variable.scope.variableScope !== reference.from.variableScope);
 }
 /**
  * Checks whether or not a given variable is a class declaration in an upper function scope.
  */
 function isOuterClass(variable, reference) {
-    return (variable.defs[0].type === 'ClassName' && isOuterScope(variable, reference));
+    return (variable.defs[0].type === 'ClassName' &&
+        variable.scope.variableScope !== reference.from.variableScope);
 }
 /**
  * Checks whether or not a given variable is a variable declaration in an upper function scope.
  */
 function isOuterVariable(variable, reference) {
-    return (variable.defs[0].type === 'Variable' && isOuterScope(variable, reference));
+    return (variable.defs[0].type === 'Variable' &&
+        variable.scope.variableScope !== reference.from.variableScope);
 }
 /**
  * Checks whether or not a given location is inside of the range of a given node.
@@ -92,6 +102,7 @@
  * - for (var a of a) {}
  */
 function isInInitializer(variable, reference) {
+    var _a;
     if (variable.scope !== reference.from) {
         return false;
     }
@@ -102,8 +113,7 @@
             if (isInRange(node.init, location)) {
                 return true;
             }
-            if (node.parent &&
-                node.parent.parent &&
+            if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.parent) &&
                 (node.parent.parent.type === experimental_utils_1.AST_NODE_TYPES.ForInStatement ||
                     node.parent.parent.type === experimental_utils_1.AST_NODE_TYPES.ForOfStatement) &&
                 isInRange(node.parent.parent.right, location)) {
@@ -130,7 +140,7 @@
         docs: {
             description: 'Disallow the use of variables before they are defined',
             category: 'Variables',
-            recommended: 'error',
+            recommended: false,
             extendsBaseRule: true,
         },
         messages: {
@@ -150,6 +160,7 @@
                             enums: { type: 'boolean' },
                             variables: { type: 'boolean' },
                             typedefs: { type: 'boolean' },
+                            ignoreTypeReferences: { type: 'boolean' },
                         },
                         additionalProperties: false,
                     },
@@ -164,6 +175,7 @@
             enums: true,
             variables: true,
             typedefs: true,
+            ignoreTypeReferences: true,
         },
     ],
     create(context, optionsWithDefault) {
@@ -174,17 +186,23 @@
          * @param reference The reference to the variable
          */
         function isForbidden(variable, reference) {
+            if (reference.isTypeReference && options.ignoreTypeReferences) {
+                return false;
+            }
             if (isFunction(variable)) {
-                return !!options.functions;
+                return options.functions;
             }
             if (isOuterClass(variable, reference)) {
-                return !!options.classes;
+                return options.classes;
             }
             if (isOuterVariable(variable, reference)) {
-                return !!options.variables;
+                return options.variables;
             }
             if (isOuterEnum(variable, reference)) {
-                return !!options.enums;
+                return options.enums;
+            }
+            if (isTypedef(variable)) {
+                return options.typedefs;
             }
             return true;
         }
@@ -203,9 +221,10 @@
                 if (reference.init ||
                     !variable ||
                     variable.identifiers.length === 0 ||
-                    (variable.identifiers[0].range[1] < reference.identifier.range[1] &&
+                    (variable.identifiers[0].range[1] <= reference.identifier.range[1] &&
                         !isInInitializer(variable, reference)) ||
-                    !isForbidden(variable, reference)) {
+                    !isForbidden(variable, reference) ||
+                    reference.from.type === experimental_utils_1.TSESLint.Scope.ScopeType.functionType) {
                     return;
                 }
                 // Reports.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-use-before-define.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-use-before-define.js.map
index ef84689..e715a5b 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-use-before-define.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-use-before-define.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-use-before-define.js","sourceRoot":"","sources":["../../src/rules/no-use-before-define.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAI+C;AAC/C,8CAAgC;AAEhC,MAAM,aAAa,GAAG,iIAAiI,CAAC;AAExJ;;GAEG;AACH,SAAS,YAAY,CAAC,OAA+B;IACnD,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,QAAQ,GAAG,IAAI,CAAC;IAEpB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAC/B,SAAS,GAAG,OAAO,KAAK,QAAQ,CAAC;KAClC;SAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE;QAC1D,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;QACxC,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC;QACpC,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC;QAChC,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;QACxC,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC;KACvC;IAED,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAA2B;IAClD,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CACnB,QAAiC,EACjC,SAAmC;IAEnC,IAAI,QAAQ,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE;QACjE,sEAAsE;QACtE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;YAClD,OAAO,KAAK,CAAC;SACd;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,QAAiC;IACnD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAClB,QAAiC,EACjC,SAAmC;IAEnC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAqB,CAAC;IAEpD,OAAO,CACL,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,iBAAiB;QAC9C,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAClC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CACnB,QAAiC,EACjC,SAAmC;IAEnC,OAAO,CACL,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,QAAiC,EACjC,SAAmC;IAEnC,OAAO,CACL,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAChB,IAA4C,EAC5C,QAAgB;IAEhB,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,eAAe,CACtB,QAAiC,EACjC,SAAmC;IAEnC,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,EAAE;QACrC,OAAO,KAAK,CAAC;KACd;IAED,IAAI,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE/C,OAAO,IAAI,EAAE;QACX,IAAI,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,kBAAkB,EAAE;YACnD,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;gBAClC,OAAO,IAAI,CAAC;aACb;YACD,IACE,IAAI,CAAC,MAAM;gBACX,IAAI,CAAC,MAAM,CAAC,MAAM;gBAClB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,cAAc;oBACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,cAAc,CAAC;gBAC5D,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,EAC7C;gBACA,OAAO,IAAI,CAAC;aACb;YACD,MAAM;SACP;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,iBAAiB,EAAE;YACzD,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE;gBACnC,OAAO,IAAI,CAAC;aACb;SACF;aAAM,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACxC,MAAM;SACP;QAED,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;KACpB;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAYD,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,uDAAuD;YACpE,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,OAAO;YACpB,eAAe,EAAE,IAAI;SACtB;QACD,QAAQ,EAAE;YACR,iBAAiB,EAAE,4CAA4C;SAChE;QACD,MAAM,EAAE;YACN;gBACE,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,CAAC,QAAQ,CAAC;qBACjB;oBACD;wBACE,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;4BAC9B,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;4BAC5B,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;4BAC1B,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;4BAC9B,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;yBAC9B;wBACD,oBAAoB,EAAE,KAAK;qBAC5B;iBACF;aACF;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;SACf;KACF;IACD,MAAM,CAAC,OAAO,EAAE,kBAAkB;QAChC,MAAM,OAAO,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpD;;;;WAIG;QACH,SAAS,WAAW,CAClB,QAAiC,EACjC,SAAmC;YAEnC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;gBACxB,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;aAC5B;YACD,IAAI,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;gBACrC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;aAC1B;YACD,IAAI,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;gBACxC,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;aAC5B;YACD,IAAI,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;gBACpC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;aACxB;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAED;;WAEG;QACH,SAAS,oBAAoB,CAAC,KAA2B;YACvD,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;gBACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;gBAEpC,+BAA+B;gBAC/B,qBAAqB;gBACrB,wCAAwC;gBACxC,0EAA0E;gBAC1E,+DAA+D;gBAC/D,wBAAwB;gBACxB,IACE,SAAS,CAAC,IAAI;oBACd,CAAC,QAAQ;oBACT,QAAQ,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;oBACjC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;wBAC/D,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;oBACxC,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,EACjC;oBACA,OAAO;iBACR;gBAED,WAAW;gBACX,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,SAAS,CAAC,UAAU;oBAC1B,SAAS,EAAE,mBAAmB;oBAC9B,IAAI,EAAE;wBACJ,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI;qBAChC;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAClD,CAAC;QAED,OAAO;YACL,OAAO;gBACL,oBAAoB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3C,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-use-before-define.js","sourceRoot":"","sources":["../../src/rules/no-use-before-define.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAI+C;AAC/C,8CAAgC;AAEhC,MAAM,aAAa,GAAG,iIAAiI,CAAC;AAExJ;;GAEG;AACH,SAAS,YAAY,CAAC,OAA+B;IACnD,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,oBAAoB,GAAG,IAAI,CAAC;IAEhC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAC/B,SAAS,GAAG,OAAO,KAAK,QAAQ,CAAC;KAClC;SAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE;QAC1D,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;QACxC,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC;QACpC,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC;QAChC,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;QACxC,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,KAAK,CAAC;QACtC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,KAAK,KAAK,CAAC;KAC/D;IAED,OAAO;QACL,SAAS;QACT,OAAO;QACP,KAAK;QACL,SAAS;QACT,QAAQ;QACR,oBAAoB;KACrB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,QAAiC;IACnD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,QAAiC;IAClD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAClB,QAAiC,EACjC,SAAmC;IAEnC,OAAO,CACL,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,YAAY;QACrC,QAAQ,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,IAAI,CAAC,aAAa,CAC9D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CACnB,QAAiC,EACjC,SAAmC;IAEnC,OAAO,CACL,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW;QACrC,QAAQ,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,IAAI,CAAC,aAAa,CAC9D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,QAAiC,EACjC,SAAmC;IAEnC,OAAO,CACL,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU;QACpC,QAAQ,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,IAAI,CAAC,aAAa,CAC9D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAChB,IAA4C,EAC5C,QAAgB;IAEhB,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,eAAe,CACtB,QAAiC,EACjC,SAAmC;;IAEnC,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,EAAE;QACrC,OAAO,KAAK,CAAC;KACd;IAED,IAAI,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE/C,OAAO,IAAI,EAAE;QACX,IAAI,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,kBAAkB,EAAE;YACnD,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;gBAClC,OAAO,IAAI,CAAC;aACb;YACD,IACE,OAAA,IAAI,CAAC,MAAM,0CAAE,MAAM;gBACnB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,cAAc;oBACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,cAAc,CAAC;gBAC5D,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,EAC7C;gBACA,OAAO,IAAI,CAAC;aACb;YACD,MAAM;SACP;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,iBAAiB,EAAE;YACzD,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE;gBACnC,OAAO,IAAI,CAAC;aACb;SACF;aAAM,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACxC,MAAM;SACP;QAED,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;KACpB;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAaD,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,uDAAuD;YACpE,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,QAAQ,EAAE;YACR,iBAAiB,EAAE,4CAA4C;SAChE;QACD,MAAM,EAAE;YACN;gBACE,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,CAAC,QAAQ,CAAC;qBACjB;oBACD;wBACE,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;4BAC9B,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;4BAC5B,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;4BAC1B,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;4BAC9B,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;4BAC7B,oBAAoB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;yBAC1C;wBACD,oBAAoB,EAAE,KAAK;qBAC5B;iBACF;aACF;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;YACd,oBAAoB,EAAE,IAAI;SAC3B;KACF;IACD,MAAM,CAAC,OAAO,EAAE,kBAAkB;QAChC,MAAM,OAAO,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpD;;;;WAIG;QACH,SAAS,WAAW,CAClB,QAAiC,EACjC,SAAmC;YAEnC,IAAI,SAAS,CAAC,eAAe,IAAI,OAAO,CAAC,oBAAoB,EAAE;gBAC7D,OAAO,KAAK,CAAC;aACd;YACD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;gBACxB,OAAO,OAAO,CAAC,SAAS,CAAC;aAC1B;YACD,IAAI,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;gBACrC,OAAO,OAAO,CAAC,OAAO,CAAC;aACxB;YACD,IAAI,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;gBACxC,OAAO,OAAO,CAAC,SAAS,CAAC;aAC1B;YACD,IAAI,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;gBACpC,OAAO,OAAO,CAAC,KAAK,CAAC;aACtB;YACD,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;gBACvB,OAAO,OAAO,CAAC,QAAQ,CAAC;aACzB;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAED;;WAEG;QACH,SAAS,oBAAoB,CAAC,KAA2B;YACvD,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;gBACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;gBAEpC,+BAA+B;gBAC/B,qBAAqB;gBACrB,wCAAwC;gBACxC,0EAA0E;gBAC1E,+DAA+D;gBAC/D,wBAAwB;gBACxB,IACE,SAAS,CAAC,IAAI;oBACd,CAAC,QAAQ;oBACT,QAAQ,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;oBACjC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;wBAChE,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;oBACxC,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC;oBACjC,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,6BAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,EAC7D;oBACA,OAAO;iBACR;gBAED,WAAW;gBACX,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,SAAS,CAAC,UAAU;oBAC1B,SAAS,EAAE,mBAAmB;oBAC9B,IAAI,EAAE;wBACJ,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI;qBAChC;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAClD,CAAC;QAED,OAAO;YACL,OAAO;gBACL,oBAAoB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3C,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-useless-constructor.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-useless-constructor.js
index 6c135a4..936e083 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-useless-constructor.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-useless-constructor.js
@@ -1,14 +1,27 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var _a;
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const no_useless_constructor_1 = __importDefault(require("eslint/lib/rules/no-useless-constructor"));
@@ -51,7 +64,9 @@
             extendsBaseRule: true,
         },
         schema: no_useless_constructor_1.default.meta.schema,
-        messages: no_useless_constructor_1.default.meta.messages,
+        messages: (_a = no_useless_constructor_1.default.meta.messages) !== null && _a !== void 0 ? _a : {
+            noUselessConstructor: 'Useless constructor.',
+        },
     },
     defaultOptions: [],
     create(context) {
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-useless-constructor.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-useless-constructor.js.map
index 5eb8159..865009c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-useless-constructor.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-useless-constructor.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-useless-constructor.js","sourceRoot":"","sources":["../../src/rules/no-useless-constructor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8EAG+C;AAC/C,qGAA+D;AAC/D,8CAAgC;AAKhC;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAA+B;IACzD,QAAQ,IAAI,CAAC,aAAa,EAAE;QAC1B,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,IACE,IAAI,CAAC,MAAM;gBACX,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,SAAS;gBAC7C,IAAI,CAAC,MAAM,CAAC,MAAM;gBAClB,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;gBAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAC7B;gBACA,OAAO,KAAK,CAAC;aACd;YACD,MAAM;KACT;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,IAA+B;IAClD,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;QAClB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CACrB,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,mBAAmB,CAC3D,CACF,CAAC;AACJ,CAAC;AAED,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,mCAAmC;YAChD,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,MAAM,EAAE,gCAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,EAAE,gCAAQ,CAAC,IAAI,CAAC,QAAQ;KACjC;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,gCAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO;YACL,gBAAgB,CAAC,IAAI;gBACnB,IACE,IAAI,CAAC,KAAK;oBACV,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,kBAAkB;oBACrD,IAAI,CAAC,KAAK,CAAC,IAAI;oBACf,kBAAkB,CAAC,IAAI,CAAC;oBACxB,WAAW,CAAC,IAAI,CAAC,EACjB;oBACA,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;iBAC9B;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-useless-constructor.js","sourceRoot":"","sources":["../../src/rules/no-useless-constructor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,qGAA+D;AAC/D,8CAAgC;AAKhC;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAA+B;IACzD,QAAQ,IAAI,CAAC,aAAa,EAAE;QAC1B,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,IACE,IAAI,CAAC,MAAM;gBACX,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,SAAS;gBAC7C,IAAI,CAAC,MAAM,CAAC,MAAM;gBAClB,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;gBAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAC7B;gBACA,OAAO,KAAK,CAAC;aACd;YACD,MAAM;KACT;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,IAA+B;IAClD,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;QAClB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CACrB,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,mBAAmB,CAC3D,CACF,CAAC;AACJ,CAAC;AAED,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,mCAAmC;YAChD,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,MAAM,EAAE,gCAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,QAAE,gCAAQ,CAAC,IAAI,CAAC,QAAQ,mCAAI;YAClC,oBAAoB,EAAE,sBAAsB;SAC7C;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,gCAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO;YACL,gBAAgB,CAAC,IAAI;gBACnB,IACE,IAAI,CAAC,KAAK;oBACV,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,kBAAkB;oBACrD,IAAI,CAAC,KAAK,CAAC,IAAI;oBACf,kBAAkB,CAAC,IAAI,CAAC;oBACxB,WAAW,CAAC,IAAI,CAAC,EACjB;oBACA,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;iBAC9B;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-var-requires.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-var-requires.js
index 0e0dc38..c042fe0 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-var-requires.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-var-requires.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -26,13 +38,18 @@
     defaultOptions: [],
     create(context) {
         return {
-            'CallExpression, OptionalCallExpression'(node) {
+            CallExpression(node) {
+                var _a;
+                const parent = ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.ChainExpression
+                    ? node.parent.parent
+                    : node.parent;
                 if (node.callee.type === experimental_utils_1.AST_NODE_TYPES.Identifier &&
                     node.callee.name === 'require' &&
-                    node.parent &&
-                    (node.parent.type === experimental_utils_1.AST_NODE_TYPES.VariableDeclarator ||
-                        node.parent.type === experimental_utils_1.AST_NODE_TYPES.CallExpression ||
-                        node.parent.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression)) {
+                    parent &&
+                    (parent.type === experimental_utils_1.AST_NODE_TYPES.VariableDeclarator ||
+                        parent.type === experimental_utils_1.AST_NODE_TYPES.CallExpression ||
+                        parent.type === experimental_utils_1.AST_NODE_TYPES.TSAsExpression ||
+                        parent.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression)) {
                     context.report({
                         node,
                         messageId: 'noVarReqs',
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-var-requires.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-var-requires.js.map
index 12dd67c..3d9eefc 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-var-requires.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/no-var-requires.js.map
@@ -1 +1 @@
-{"version":3,"file":"no-var-requires.js","sourceRoot":"","sources":["../../src/rules/no-var-requires.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,qEAAqE;YACvE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;SACrB;QACD,QAAQ,EAAE;YACR,SAAS,EAAE,iDAAiD;SAC7D;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,wCAAwC,CACtC,IAA+D;gBAE/D,IACE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;oBAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;oBAC9B,IAAI,CAAC,MAAM;oBACX,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,kBAAkB;wBACrD,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,cAAc;wBAClD,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,sBAAsB,CAAC,EAC7D;oBACA,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,WAAW;qBACvB,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"no-var-requires.js","sourceRoot":"","sources":["../../src/rules/no-var-requires.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,qEAAqE;YACvE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;SACrB;QACD,QAAQ,EAAE;YACR,SAAS,EAAE,iDAAiD;SAC7D;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,cAAc,CAAC,IAA6B;;gBAC1C,MAAM,MAAM,GACV,OAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,MAAK,mCAAc,CAAC,eAAe;oBAClD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;oBACpB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;gBAClB,IACE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;oBAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;oBAC9B,MAAM;oBACN,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,kBAAkB;wBAChD,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,cAAc;wBAC7C,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,cAAc;wBAC7C,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,gBAAgB,CAAC,EAClD;oBACA,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,WAAW;qBACvB,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-as-const.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-as-const.js
index 2c557b4..caf2a55 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-as-const.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-as-const.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -16,12 +28,13 @@
         docs: {
             description: 'Prefer usage of `as const` over literal type',
             category: 'Best Practices',
-            recommended: false,
+            recommended: 'error',
+            suggestion: true,
         },
         fixable: 'code',
         messages: {
-            preferConstAssertion: 'Expected a `const` instead of a literal type assertion',
-            variableConstAssertion: 'Expected a `const` assertion instead of a literal type annotation',
+            preferConstAssertion: 'Expected a `const` instead of a literal type assertion.',
+            variableConstAssertion: 'Expected a `const` assertion instead of a literal type annotation.',
             variableSuggest: 'You should use `as const` instead of type annotation.',
         },
         schema: [],
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-as-const.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-as-const.js.map
index 00a715e..93e89b8 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-as-const.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-as-const.js.map
@@ -1 +1 @@
-{"version":3,"file":"prefer-as-const.js","sourceRoot":"","sources":["../../src/rules/prefer-as-const.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAI+C;AAC/C,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,8CAA8C;YAC3D,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;SACnB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,oBAAoB,EAClB,wDAAwD;YAC1D,sBAAsB,EACpB,mEAAmE;YACrE,eAAe,EAAE,uDAAuD;SACzE;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,SAAS,YAAY,CACnB,SAA8B,EAC9B,QAA2B,EAC3B,MAAe;YAEf,IACE,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO;gBACzC,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,aAAa;gBAC9C,KAAK,IAAI,QAAQ,CAAC,OAAO;gBACzB,SAAS,CAAC,GAAG,KAAK,QAAQ,CAAC,OAAO,CAAC,GAAG,EACtC;gBACA,IAAI,MAAM,EAAE;oBACV,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,QAAQ;wBACd,SAAS,EAAE,sBAAsB;wBACjC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC;qBACnD,CAAC,CAAC;iBACJ;qBAAM;oBACL,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,QAAQ;wBACd,SAAS,EAAE,wBAAwB;wBACnC,OAAO,EAAE;4BACP;gCACE,SAAS,EAAE,iBAAiB;gCAC5B,GAAG,EAAE,CAAC,KAAK,EAAsB,EAAE,CAAC;oCAClC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAO,CAAC;oCAC9B,KAAK,CAAC,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC;iCAC9C;6BACF;yBACF;qBACF,CAAC,CAAC;iBACJ;aACF;QACH,CAAC;QAED,OAAO;YACL,cAAc,CAAC,IAAI;gBACjB,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAC3D,CAAC;YACD,eAAe,CAAC,IAAI;gBAClB,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAC3D,CAAC;YACD,kBAAkB,CAAC,IAAI;gBACrB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE;oBACvC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;iBACvE;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"prefer-as-const.js","sourceRoot":"","sources":["../../src/rules/prefer-as-const.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAI+C;AAC/C,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,8CAA8C;YAC3D,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;YACpB,UAAU,EAAE,IAAI;SACjB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,oBAAoB,EAClB,yDAAyD;YAC3D,sBAAsB,EACpB,oEAAoE;YACtE,eAAe,EAAE,uDAAuD;SACzE;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,SAAS,YAAY,CACnB,SAA8B,EAC9B,QAA2B,EAC3B,MAAe;YAEf,IACE,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO;gBACzC,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,aAAa;gBAC9C,KAAK,IAAI,QAAQ,CAAC,OAAO;gBACzB,SAAS,CAAC,GAAG,KAAK,QAAQ,CAAC,OAAO,CAAC,GAAG,EACtC;gBACA,IAAI,MAAM,EAAE;oBACV,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,QAAQ;wBACd,SAAS,EAAE,sBAAsB;wBACjC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC;qBACnD,CAAC,CAAC;iBACJ;qBAAM;oBACL,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,QAAQ;wBACd,SAAS,EAAE,wBAAwB;wBACnC,OAAO,EAAE;4BACP;gCACE,SAAS,EAAE,iBAAiB;gCAC5B,GAAG,EAAE,CAAC,KAAK,EAAsB,EAAE,CAAC;oCAClC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAO,CAAC;oCAC9B,KAAK,CAAC,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC;iCAC9C;6BACF;yBACF;qBACF,CAAC,CAAC;iBACJ;aACF;QACH,CAAC;QAED,OAAO;YACL,cAAc,CAAC,IAAI;gBACjB,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAC3D,CAAC;YACD,eAAe,CAAC,IAAI;gBAClB,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAC3D,CAAC;YACD,kBAAkB,CAAC,IAAI;gBACrB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE;oBACvC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;iBACvE;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-enum-initializers.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-enum-initializers.js
new file mode 100644
index 0000000..f81e3dc
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-enum-initializers.js
@@ -0,0 +1,85 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const util = __importStar(require("../util"));
+exports.default = util.createRule({
+    name: 'prefer-enum-initializers',
+    meta: {
+        type: 'suggestion',
+        docs: {
+            description: 'Prefer initializing each enums member value',
+            category: 'Best Practices',
+            recommended: false,
+            suggestion: true,
+        },
+        messages: {
+            defineInitializer: "The value of the member '{{ name }}' should be explicitly defined",
+            defineInitializerSuggestion: 'Can be fixed to {{ name }} = {{ suggested }}',
+        },
+        schema: [],
+    },
+    defaultOptions: [],
+    create(context) {
+        const sourceCode = context.getSourceCode();
+        function TSEnumDeclaration(node) {
+            const { members } = node;
+            members.forEach((member, index) => {
+                if (member.initializer == null) {
+                    const name = sourceCode.getText(member);
+                    context.report({
+                        node: member,
+                        messageId: 'defineInitializer',
+                        data: {
+                            name,
+                        },
+                        suggest: [
+                            {
+                                messageId: 'defineInitializerSuggestion',
+                                data: { name, suggested: index },
+                                fix: (fixer) => {
+                                    return fixer.replaceText(member, `${name} = ${index}`);
+                                },
+                            },
+                            {
+                                messageId: 'defineInitializerSuggestion',
+                                data: { name, suggested: index + 1 },
+                                fix: (fixer) => {
+                                    return fixer.replaceText(member, `${name} = ${index + 1}`);
+                                },
+                            },
+                            {
+                                messageId: 'defineInitializerSuggestion',
+                                data: { name, suggested: `'${name}'` },
+                                fix: (fixer) => {
+                                    return fixer.replaceText(member, `${name} = '${name}'`);
+                                },
+                            },
+                        ],
+                    });
+                }
+            });
+        }
+        return {
+            TSEnumDeclaration,
+        };
+    },
+});
+//# sourceMappingURL=prefer-enum-initializers.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-enum-initializers.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-enum-initializers.js.map
new file mode 100644
index 0000000..5a2c3bf
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-enum-initializers.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"prefer-enum-initializers.js","sourceRoot":"","sources":["../../src/rules/prefer-enum-initializers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAiB;IAC7C,IAAI,EAAE,0BAA0B;IAChC,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,6CAA6C;YAC1D,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,UAAU,EAAE,IAAI;SACjB;QACD,QAAQ,EAAE;YACR,iBAAiB,EACf,mEAAmE;YACrE,2BAA2B,EACzB,8CAA8C;SACjD;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAE3C,SAAS,iBAAiB,CAAC,IAAgC;YACzD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;YAEzB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAChC,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI,EAAE;oBAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACxC,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,MAAM;wBACZ,SAAS,EAAE,mBAAmB;wBAC9B,IAAI,EAAE;4BACJ,IAAI;yBACL;wBACD,OAAO,EAAE;4BACP;gCACE,SAAS,EAAE,6BAA6B;gCACxC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;gCAChC,GAAG,EAAE,CAAC,KAAK,EAAoB,EAAE;oCAC/B,OAAO,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,KAAK,EAAE,CAAC,CAAC;gCACzD,CAAC;6BACF;4BACD;gCACE,SAAS,EAAE,6BAA6B;gCACxC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE;gCACpC,GAAG,EAAE,CAAC,KAAK,EAAoB,EAAE;oCAC/B,OAAO,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;gCAC7D,CAAC;6BACF;4BACD;gCACE,SAAS,EAAE,6BAA6B;gCACxC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,GAAG,EAAE;gCACtC,GAAG,EAAE,CAAC,KAAK,EAAoB,EAAE;oCAC/B,OAAO,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC,CAAC;gCAC1D,CAAC;6BACF;yBACF;qBACF,CAAC,CAAC;iBACJ;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,iBAAiB;SAClB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-for-of.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-for-of.js
index d3d6771..acd31ea 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-for-of.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-for-of.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -19,7 +31,7 @@
             recommended: false,
         },
         messages: {
-            preferForOf: 'Expected a `for-of` loop instead of a `for` loop with this simple iteration',
+            preferForOf: 'Expected a `for-of` loop instead of a `for` loop with this simple iteration.',
         },
         schema: [],
     },
@@ -45,8 +57,7 @@
                 node.type === experimental_utils_1.AST_NODE_TYPES.BinaryExpression &&
                 node.operator === '<' &&
                 isMatchingIdentifier(node.left, name) &&
-                (node.right.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression ||
-                    node.right.type === experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression) &&
+                node.right.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression &&
                 isMatchingIdentifier(node.right.property, 'length')) {
                 return node.right.object;
             }
@@ -130,8 +141,7 @@
                 const node = id.parent;
                 return (!contains(body, id) ||
                     (node !== undefined &&
-                        (node.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression ||
-                            node.type === experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression) &&
+                        node.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression &&
                         node.property === id &&
                         sourceCode.getText(node.object) === arrayText &&
                         !isAssignee(node)));
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-for-of.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-for-of.js.map
index cdd145d..b7cc1d9 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-for-of.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-for-of.js.map
@@ -1 +1 @@
-{"version":3,"file":"prefer-for-of.js","sourceRoot":"","sources":["../../src/rules/prefer-for-of.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"prefer-for-of.js","sourceRoot":"","sources":["../../src/rules/prefer-for-of.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-function-type.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-function-type.js
index 08b3f53..b10172c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-function-type.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-function-type.js
@@ -1,14 +1,31 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.phrases = void 0;
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const util = __importStar(require("../util"));
+exports.phrases = {
+    [experimental_utils_1.AST_NODE_TYPES.TSTypeLiteral]: 'Type literal',
+    [experimental_utils_1.AST_NODE_TYPES.TSInterfaceDeclaration]: 'Interface',
+};
 exports.default = util.createRule({
     name: 'prefer-function-type',
     meta: {
@@ -19,7 +36,8 @@
         },
         fixable: 'code',
         messages: {
-            functionTypeOverCallableType: "{{ type }} has only a call signature - use '{{ sigSuggestion }}' instead.",
+            functionTypeOverCallableType: '{{ literalOrInterface }} only has a call signature, you should use a function type instead.',
+            unexpectedThisOnFunctionOnlyInterface: "`this` refers to the function type '{{ interfaceName }}', did you intend to use a generic `this` parameter like `<Self>(this: Self, ...) => Self` instead?",
         },
         schema: [],
         type: 'suggestion',
@@ -84,10 +102,24 @@
          * @param member The TypeElement being checked
          * @param node The parent of member being checked
          */
-        function checkMember(member, node) {
+        function checkMember(member, node, tsThisTypes = null) {
             if ((member.type === experimental_utils_1.AST_NODE_TYPES.TSCallSignatureDeclaration ||
                 member.type === experimental_utils_1.AST_NODE_TYPES.TSConstructSignatureDeclaration) &&
                 typeof member.returnType !== 'undefined') {
+                if (tsThisTypes !== null &&
+                    tsThisTypes.length > 0 &&
+                    node.type === experimental_utils_1.AST_NODE_TYPES.TSInterfaceDeclaration) {
+                    // the message can be confusing if we don't point directly to the `this` node instead of the whole member
+                    // and in favour of generating at most one error we'll only report the first occurrence of `this` if there are multiple
+                    context.report({
+                        node: tsThisTypes[0],
+                        messageId: 'unexpectedThisOnFunctionOnlyInterface',
+                        data: {
+                            interfaceName: node.id.name,
+                        },
+                    });
+                    return;
+                }
                 const suggestion = renderSuggestion(member, node);
                 const fixStart = node.type === experimental_utils_1.AST_NODE_TYPES.TSTypeLiteral
                     ? node.range[0]
@@ -99,10 +131,7 @@
                     node: member,
                     messageId: 'functionTypeOverCallableType',
                     data: {
-                        type: node.type === experimental_utils_1.AST_NODE_TYPES.TSTypeLiteral
-                            ? 'Type literal'
-                            : 'Interface',
-                        sigSuggestion: suggestion,
+                        literalOrInterface: exports.phrases[node.type],
                     },
                     fix(fixer) {
                         return fixer.replaceTextRange([fixStart, node.range[1]], suggestion);
@@ -110,12 +139,35 @@
                 });
             }
         }
+        let tsThisTypes = null;
+        let literalNesting = 0;
         return {
-            TSInterfaceDeclaration(node) {
-                if (!hasOneSupertype(node) && node.body.body.length === 1) {
-                    checkMember(node.body.body[0], node);
+            TSInterfaceDeclaration() {
+                // when entering an interface reset the count of `this`s to empty.
+                tsThisTypes = [];
+            },
+            'TSInterfaceDeclaration TSThisType'(node) {
+                // inside an interface keep track of all ThisType references.
+                // unless it's inside a nested type literal in which case it's invalid code anyway
+                // we don't want to incorrectly say "it refers to name" while typescript says it's completely invalid.
+                if (literalNesting === 0 && tsThisTypes !== null) {
+                    tsThisTypes.push(node);
                 }
             },
+            'TSInterfaceDeclaration:exit'(node) {
+                if (!hasOneSupertype(node) && node.body.body.length === 1) {
+                    checkMember(node.body.body[0], node, tsThisTypes);
+                }
+                // on exit check member and reset the array to nothing.
+                tsThisTypes = null;
+            },
+            // keep track of nested literals to avoid complaining about invalid `this` uses
+            'TSInterfaceDeclaration TSTypeLiteral'() {
+                literalNesting += 1;
+            },
+            'TSInterfaceDeclaration TSTypeLiteral:exit'() {
+                literalNesting -= 1;
+            },
             'TSTypeLiteral[members.length = 1]'(node) {
                 checkMember(node.members[0], node);
             },
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-function-type.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-function-type.js.map
index e8bcad2..e87d7e2 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-function-type.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-function-type.js.map
@@ -1 +1 @@
-{"version":3,"file":"prefer-function-type.js","sourceRoot":"","sources":["../../src/rules/prefer-function-type.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAI+C;AAC/C,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,WAAW,EACT,+DAA+D;YACjE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;SACnB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,4BAA4B,EAC1B,2EAA2E;SAC9E;QACD,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,YAAY;KACnB;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAE3C;;;WAGG;QACH,SAAS,eAAe,CAAC,IAAqC;YAC5D,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC9C,OAAO,KAAK,CAAC;aACd;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7B,OAAO,IAAI,CAAC;aACb;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YAExC,OAAO,CACL,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,CACpE,CAAC;QACJ,CAAC;QAED;;WAEG;QACH,SAAS,oBAAoB,CAAC,MAAiC;YAC7D,IAAI,CAAC,MAAM,EAAE;gBACX,OAAO,KAAK,CAAC;aACd;YAED,QAAQ,MAAM,CAAC,IAAI,EAAE;gBACnB,KAAK,mCAAc,CAAC,WAAW,CAAC;gBAChC,KAAK,mCAAc,CAAC,kBAAkB,CAAC;gBACvC,KAAK,mCAAc,CAAC,WAAW;oBAC7B,OAAO,IAAI,CAAC;gBACd;oBACE,OAAO,KAAK,CAAC;aAChB;QACH,CAAC;QAED;;;;WAIG;QACH,SAAS,gBAAgB,CACvB,IAE4C,EAC5C,MAAqB;YAErB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACnD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE9D,IAAI,UAAU,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CACzD,QAAQ,GAAG,CAAC,CACb,EAAE,CAAC;YAEJ,IAAI,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;gBACvC,UAAU,GAAG,IAAI,UAAU,GAAG,CAAC;aAChC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,sBAAsB,EAAE;gBACzD,IAAI,OAAO,MAAM,CAAC,cAAc,KAAK,WAAW,EAAE;oBAChD,OAAO,QAAQ,UAAU;yBACtB,OAAO,EAAE;yBACT,KAAK,CACJ,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAClB,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAC/B,MAAM,UAAU,EAAE,CAAC;iBACvB;gBACD,OAAO,QAAQ,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,UAAU,EAAE,CAAC;aACjD;YACD,OAAO,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACzE,CAAC;QAED;;;WAGG;QACH,SAAS,WAAW,CAClB,MAA4B,EAC5B,IAAmB;YAEnB,IACE,CAAC,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,0BAA0B;gBACxD,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,+BAA+B,CAAC;gBACjE,OAAO,MAAM,CAAC,UAAU,KAAK,WAAW,EACxC;gBACA,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAClD,MAAM,QAAQ,GACZ,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,aAAa;oBACxC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBACf,CAAC,CAAC,UAAU;yBACP,SAAS,CAAC,IAAI,CAAC;yBACf,MAAM,CACL,KAAK,CAAC,EAAE,CACN,KAAK,CAAC,IAAI,KAAK,oCAAe,CAAC,OAAO;wBACtC,KAAK,CAAC,KAAK,KAAK,WAAW,CAC9B,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAEtB,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE,8BAA8B;oBACzC,IAAI,EAAE;wBACJ,IAAI,EACF,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,aAAa;4BACxC,CAAC,CAAC,cAAc;4BAChB,CAAC,CAAC,WAAW;wBACjB,aAAa,EAAE,UAAU;qBAC1B;oBACD,GAAG,CAAC,KAAK;wBACP,OAAO,KAAK,CAAC,gBAAgB,CAC3B,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EACzB,UAAU,CACX,CAAC;oBACJ,CAAC;iBACF,CAAC,CAAC;aACJ;QACH,CAAC;QAED,OAAO;YACL,sBAAsB,CAAC,IAAI;gBACzB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;oBACzD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;iBACtC;YACH,CAAC;YACD,mCAAmC,CAAC,IAA4B;gBAC9D,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACrC,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"prefer-function-type.js","sourceRoot":"","sources":["../../src/rules/prefer-function-type.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-includes.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-includes.js
index 3627d3e..e352e96 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-includes.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-includes.js
@@ -1,14 +1,25 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const eslint_utils_1 = require("eslint-utils");
 const regexpp_1 = require("regexpp");
 const ts = __importStar(require("typescript"));
 const util_1 = require("../util");
@@ -20,7 +31,7 @@
         docs: {
             description: 'Enforce `includes` method over `indexOf` method',
             category: 'Best Practices',
-            recommended: 'error',
+            recommended: false,
             requiresTypeChecking: true,
         },
         fixable: 'code',
@@ -35,7 +46,7 @@
         const services = util_1.getParserServices(context);
         const types = services.program.getTypeChecker();
         function isNumber(node, value) {
-            const evaluated = eslint_utils_1.getStaticValue(node, globalScope);
+            const evaluated = util_1.getStaticValue(node, globalScope);
             return evaluated !== null && evaluated.value === value;
         }
         function isPositiveCheck(node) {
@@ -86,7 +97,7 @@
          * @param node The node to parse.
          */
         function parseRegExp(node) {
-            const evaluated = eslint_utils_1.getStaticValue(node, globalScope);
+            const evaluated = util_1.getStaticValue(node, globalScope);
             if (evaluated == null || !(evaluated.value instanceof RegExp)) {
                 return null;
             }
@@ -105,29 +116,40 @@
             return String.fromCodePoint(...chars.map(c => c.value));
         }
         return {
-            "BinaryExpression > :matches(CallExpression, OptionalCallExpression).left > :matches(MemberExpression, OptionalMemberExpression).callee[property.name='indexOf'][computed=false]"(node) {
+            [[
+                // a.indexOf(b) !== 1
+                "BinaryExpression > CallExpression.left > MemberExpression.callee[property.name='indexOf'][computed=false]",
+                // a?.indexOf(b) !== 1
+                "BinaryExpression > ChainExpression.left > CallExpression > MemberExpression.callee[property.name='indexOf'][computed=false]",
+            ].join(', ')](node) {
+                var _a, _b, _c;
                 // Check if the comparison is equivalent to `includes()`.
                 const callNode = node.parent;
-                const compareNode = callNode.parent;
+                const compareNode = (((_a = callNode.parent) === null || _a === void 0 ? void 0 : _a.type) ===
+                    experimental_utils_1.AST_NODE_TYPES.ChainExpression
+                    ? callNode.parent.parent
+                    : callNode.parent);
                 const negative = isNegativeCheck(compareNode);
                 if (!negative && !isPositiveCheck(compareNode)) {
                     return;
                 }
                 // Get the symbol of `indexOf` method.
                 const tsNode = services.esTreeNodeToTSNodeMap.get(node.property);
-                const indexofMethodSymbol = types.getSymbolAtLocation(tsNode);
-                if (indexofMethodSymbol == null ||
-                    indexofMethodSymbol.declarations.length === 0) {
+                const indexofMethodDeclarations = (_b = types
+                    .getSymbolAtLocation(tsNode)) === null || _b === void 0 ? void 0 : _b.getDeclarations();
+                if (indexofMethodDeclarations == null ||
+                    indexofMethodDeclarations.length === 0) {
                     return;
                 }
                 // Check if every declaration of `indexOf` method has `includes` method
                 // and the two methods have the same parameters.
-                for (const instanceofMethodDecl of indexofMethodSymbol.declarations) {
+                for (const instanceofMethodDecl of indexofMethodDeclarations) {
                     const typeDecl = instanceofMethodDecl.parent;
                     const type = types.getTypeAtLocation(typeDecl);
-                    const includesMethodSymbol = type.getProperty('includes');
-                    if (includesMethodSymbol == null ||
-                        !includesMethodSymbol.declarations.some(includesMethodDecl => hasSameParameters(includesMethodDecl, instanceofMethodDecl))) {
+                    const includesMethodDecl = (_c = type
+                        .getProperty('includes')) === null || _c === void 0 ? void 0 : _c.getDeclarations();
+                    if (includesMethodDecl == null ||
+                        !includesMethodDecl.some(includesMethodDecl => hasSameParameters(includesMethodDecl, instanceofMethodDecl))) {
                         return;
                     }
                 }
@@ -145,12 +167,22 @@
                 });
             },
             // /bar/.test(foo)
-            ':matches(CallExpression, OptionalCallExpression) > :matches(MemberExpression, OptionalMemberExpression).callee[property.name="test"][computed=false]'(node) {
+            'CallExpression > MemberExpression.callee[property.name="test"][computed=false]'(node) {
+                var _a;
                 const callNode = node.parent;
                 const text = callNode.arguments.length === 1 ? parseRegExp(node.object) : null;
                 if (text == null) {
                     return;
                 }
+                //check the argument type of test methods
+                const argument = callNode.arguments[0];
+                const tsNode = services.esTreeNodeToTSNodeMap.get(argument);
+                const type = util_1.getConstrainedTypeAtLocation(types, tsNode);
+                const includesMethodDecl = (_a = type
+                    .getProperty('includes')) === null || _a === void 0 ? void 0 : _a.getDeclarations();
+                if (includesMethodDecl == null) {
+                    return;
+                }
                 context.report({
                     node: callNode,
                     messageId: 'preferStringIncludes',
@@ -160,17 +192,13 @@
                             argNode.type !== experimental_utils_1.AST_NODE_TYPES.TemplateLiteral &&
                             argNode.type !== experimental_utils_1.AST_NODE_TYPES.Identifier &&
                             argNode.type !== experimental_utils_1.AST_NODE_TYPES.MemberExpression &&
-                            argNode.type !== experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression &&
-                            argNode.type !== experimental_utils_1.AST_NODE_TYPES.CallExpression &&
-                            argNode.type !== experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression;
+                            argNode.type !== experimental_utils_1.AST_NODE_TYPES.CallExpression;
                         yield fixer.removeRange([callNode.range[0], argNode.range[0]]);
                         if (needsParen) {
                             yield fixer.insertTextBefore(argNode, '(');
                             yield fixer.insertTextAfter(argNode, ')');
                         }
-                        yield fixer.insertTextAfter(argNode, `${callNode.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression
-                            ? '?.'
-                            : '.'}includes(${JSON.stringify(text)}`);
+                        yield fixer.insertTextAfter(argNode, `${node.optional ? '?.' : '.'}includes(${JSON.stringify(text)}`);
                     },
                 });
             },
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-includes.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-includes.js.map
index 4ec9f07..b0f5b80 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-includes.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-includes.js.map
@@ -1 +1 @@
-{"version":3,"file":"prefer-includes.js","sourceRoot":"","sources":["../../src/rules/prefer-includes.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAG+C;AAC/C,+CAA8C;AAC9C,qCAA+D;AAC/D,+CAAiC;AACjC,kCAAwD;AAExD,kBAAe,iBAAU,CAAC;IACxB,IAAI,EAAE,iBAAiB;IACvB,cAAc,EAAE,EAAE;IAElB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,iDAAiD;YAC9D,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;YACpB,oBAAoB,EAAE,IAAI;SAC3B;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,cAAc,EAAE,kCAAkC;YAClD,oBAAoB,EAClB,uDAAuD;SAC1D;QACD,MAAM,EAAE,EAAE;KACX;IAED,MAAM,CAAC,OAAO;QACZ,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,wBAAiB,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAEhD,SAAS,QAAQ,CAAC,IAAmB,EAAE,KAAa;YAClD,MAAM,SAAS,GAAG,6BAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACpD,OAAO,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC;QACzD,CAAC;QAED,SAAS,eAAe,CAAC,IAA+B;YACtD,QAAQ,IAAI,CAAC,QAAQ,EAAE;gBACrB,KAAK,KAAK,CAAC;gBACX,KAAK,IAAI,CAAC;gBACV,KAAK,GAAG;oBACN,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;gBAClC,KAAK,IAAI;oBACP,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACjC;oBACE,OAAO,KAAK,CAAC;aAChB;QACH,CAAC;QACD,SAAS,eAAe,CAAC,IAA+B;YACtD,QAAQ,IAAI,CAAC,QAAQ,EAAE;gBACrB,KAAK,KAAK,CAAC;gBACX,KAAK,IAAI,CAAC;gBACV,KAAK,IAAI;oBACP,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;gBAClC,KAAK,GAAG;oBACN,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACjC;oBACE,OAAO,KAAK,CAAC;aAChB;QACH,CAAC;QAED,SAAS,iBAAiB,CACxB,KAAqB,EACrB,KAAqB;YAErB,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;gBAC1D,OAAO,KAAK,CAAC;aACd;YAED,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC;YACjC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC;YACjC,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE;gBACrC,OAAO,KAAK,CAAC;aACd;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBACvC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAE1B,6CAA6C;gBAC7C,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,MAAM,CAAC,OAAO,EAAE,EAAE;oBACzC,OAAO,KAAK,CAAC;iBACd;aACF;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAED;;;WAGG;QACH,SAAS,WAAW,CAAC,IAAmB;YACtC,MAAM,SAAS,GAAG,6BAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACpD,IAAI,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,YAAY,MAAM,CAAC,EAAE;gBAC7D,OAAO,IAAI,CAAC;aACb;YAED,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,4BAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC/D,IACE,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;gBACjC,KAAK,CAAC,UAAU;gBAChB,KAAK,CAAC,MAAM,EACZ;gBACA,OAAO,IAAI,CAAC;aACb;YAED,6CAA6C;YAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC/C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE;gBAC7C,OAAO,IAAI,CAAC;aACb;YAED,aAAa;YACb,OAAO,MAAM,CAAC,aAAa,CACzB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAyB,CAAC,KAAK,CAAC,CACpD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,iLAAiL,CAC/K,IAAmE;gBAEnE,yDAAyD;gBACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAEa,CAAC;gBACpC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAmC,CAAC;gBACjE,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;gBAC9C,IAAI,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE;oBAC9C,OAAO;iBACR;gBAED,sCAAsC;gBACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACjE,MAAM,mBAAmB,GAAG,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;gBAC9D,IACE,mBAAmB,IAAI,IAAI;oBAC3B,mBAAmB,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAC7C;oBACA,OAAO;iBACR;gBAED,uEAAuE;gBACvE,gDAAgD;gBAChD,KAAK,MAAM,oBAAoB,IAAI,mBAAmB,CAAC,YAAY,EAAE;oBACnE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC;oBAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;oBAC/C,MAAM,oBAAoB,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;oBAC1D,IACE,oBAAoB,IAAI,IAAI;wBAC5B,CAAC,oBAAoB,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAC3D,iBAAiB,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAC5D,EACD;wBACA,OAAO;qBACR;iBACF;gBAED,aAAa;gBACb,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE,gBAAgB;oBAC3B,CAAC,GAAG,CAAC,KAAK;wBACR,IAAI,QAAQ,EAAE;4BACZ,MAAM,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;yBAC7C;wBACD,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;wBACnD,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrE,CAAC;iBACF,CAAC,CAAC;YACL,CAAC;YAED,kBAAkB;YAClB,sJAAsJ,CACpJ,IAAmE;gBAEnE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAEa,CAAC;gBACpC,MAAM,IAAI,GACR,QAAQ,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpE,IAAI,IAAI,IAAI,IAAI,EAAE;oBAChB,OAAO;iBACR;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE,sBAAsB;oBACjC,CAAC,GAAG,CAAC,KAAK;wBACR,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;wBACtC,MAAM,UAAU,GACd,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO;4BACvC,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,eAAe;4BAC/C,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU;4BAC1C,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,gBAAgB;4BAChD,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,wBAAwB;4BACxD,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,cAAc;4BAC9C,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,sBAAsB,CAAC;wBAEzD,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC/D,IAAI,UAAU,EAAE;4BACd,MAAM,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;4BAC3C,MAAM,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;yBAC3C;wBACD,MAAM,KAAK,CAAC,eAAe,CACzB,OAAO,EACP,GACE,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,sBAAsB;4BACrD,CAAC,CAAC,IAAI;4BACN,CAAC,CAAC,GACN,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CACnC,CAAC;oBACJ,CAAC;iBACF,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"prefer-includes.js","sourceRoot":"","sources":["../../src/rules/prefer-includes.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-literal-enum-member.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-literal-enum-member.js
new file mode 100644
index 0000000..475f4e7
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-literal-enum-member.js
@@ -0,0 +1,46 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const util_1 = require("../util");
+exports.default = util_1.createRule({
+    name: 'prefer-literal-enum-member',
+    meta: {
+        type: 'suggestion',
+        docs: {
+            description: 'Require that all enum members be literal values to prevent unintended enum member name shadow issues',
+            category: 'Best Practices',
+            recommended: false,
+            requiresTypeChecking: false,
+        },
+        messages: {
+            notLiteral: `Explicit enum value must only be a literal value (string, number, boolean, etc).`,
+        },
+        schema: [],
+    },
+    defaultOptions: [],
+    create(context) {
+        return {
+            TSEnumMember(node) {
+                // If there is no initializer, then this node is just the name of the member, so ignore.
+                if (node.initializer == null) {
+                    return;
+                }
+                // any old literal
+                if (node.initializer.type === experimental_utils_1.AST_NODE_TYPES.Literal) {
+                    return;
+                }
+                // -1 and +1
+                if (node.initializer.type === experimental_utils_1.AST_NODE_TYPES.UnaryExpression &&
+                    ['+', '-'].includes(node.initializer.operator) &&
+                    node.initializer.argument.type === experimental_utils_1.AST_NODE_TYPES.Literal) {
+                    return;
+                }
+                context.report({
+                    node: node.id,
+                    messageId: 'notLiteral',
+                });
+            },
+        };
+    },
+});
+//# sourceMappingURL=prefer-literal-enum-member.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-literal-enum-member.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-literal-enum-member.js.map
new file mode 100644
index 0000000..9d5f038
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-literal-enum-member.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"prefer-literal-enum-member.js","sourceRoot":"","sources":["../../src/rules/prefer-literal-enum-member.ts"],"names":[],"mappings":";;AAAA,8EAAuE;AACvE,kCAAqC;AAErC,kBAAe,iBAAU,CAAC;IACxB,IAAI,EAAE,4BAA4B;IAClC,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,sGAAsG;YACxG,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,oBAAoB,EAAE,KAAK;SAC5B;QACD,QAAQ,EAAE;YACR,UAAU,EAAE,kFAAkF;SAC/F;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,YAAY,CAAC,IAAI;gBACf,wFAAwF;gBACxF,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE;oBAC5B,OAAO;iBACR;gBACD,kBAAkB;gBAClB,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO,EAAE;oBACpD,OAAO;iBACR;gBACD,YAAY;gBACZ,IACE,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,mCAAc,CAAC,eAAe;oBACxD,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;oBAC9C,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO,EACzD;oBACA,OAAO;iBACR;gBAED,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,IAAI,CAAC,EAAE;oBACb,SAAS,EAAE,YAAY;iBACxB,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-namespace-keyword.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-namespace-keyword.js
index 866bf59..26303e7 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-namespace-keyword.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-namespace-keyword.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-namespace-keyword.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-namespace-keyword.js.map
index cfdf2e8..c4765a0 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-namespace-keyword.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-namespace-keyword.js.map
@@ -1 +1 @@
-{"version":3,"file":"prefer-namespace-keyword.js","sourceRoot":"","sources":["../../src/rules/prefer-namespace-keyword.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,0BAA0B;IAChC,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,iHAAiH;YACnH,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;SACrB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,YAAY,EACV,2EAA2E;SAC9E;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAE3C,OAAO;YACL,mBAAmB,CAAC,IAAI;gBACtB,sCAAsC;gBACtC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO,EAAE;oBACvD,OAAO;iBACR;gBACD,wCAAwC;gBACxC,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAEtD,IACE,UAAU;oBACV,UAAU,CAAC,IAAI,KAAK,oCAAe,CAAC,UAAU;oBAC9C,UAAU,CAAC,KAAK,KAAK,QAAQ,EAC7B;oBACA,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,cAAc;wBACzB,GAAG,CAAC,KAAK;4BACP,OAAO,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;wBACpD,CAAC;qBACF,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"prefer-namespace-keyword.js","sourceRoot":"","sources":["../../src/rules/prefer-namespace-keyword.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,0BAA0B;IAChC,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,iHAAiH;YACnH,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;SACrB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,YAAY,EACV,2EAA2E;SAC9E;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAE3C,OAAO;YACL,mBAAmB,CAAC,IAAI;gBACtB,sCAAsC;gBACtC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO,EAAE;oBACvD,OAAO;iBACR;gBACD,wCAAwC;gBACxC,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAEtD,IACE,UAAU;oBACV,UAAU,CAAC,IAAI,KAAK,oCAAe,CAAC,UAAU;oBAC9C,UAAU,CAAC,KAAK,KAAK,QAAQ,EAC7B;oBACA,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,cAAc;wBACzB,GAAG,CAAC,KAAK;4BACP,OAAO,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;wBACpD,CAAC;qBACF,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-nullish-coalescing.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-nullish-coalescing.js
index f6b4a6d..840e5c3 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-nullish-coalescing.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-nullish-coalescing.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -17,11 +29,12 @@
             description: 'Enforce the usage of the nullish coalescing operator instead of logical chaining',
             category: 'Best Practices',
             recommended: false,
+            suggestion: true,
             requiresTypeChecking: true,
         },
-        fixable: 'code',
         messages: {
             preferNullish: 'Prefer using nullish coalescing operator (`??`) instead of a logical or (`||`), as it is a safer operator.',
+            suggestNullish: 'Fix to nullish coalescing operator (`??`).',
         },
         schema: [
             {
@@ -45,10 +58,9 @@
         {
             ignoreConditionalTests: true,
             ignoreMixedLogicalExpressions: true,
-            forceSuggestionFixer: false,
         },
     ],
-    create(context, [{ ignoreConditionalTests, ignoreMixedLogicalExpressions, forceSuggestionFixer, },]) {
+    create(context, [{ ignoreConditionalTests, ignoreMixedLogicalExpressions }]) {
         const parserServices = util.getParserServices(context);
         const sourceCode = context.getSourceCode();
         const checker = parserServices.program.getTypeChecker();
@@ -83,18 +95,16 @@
                     }
                     yield fixer.replaceText(barBarOperator, '??');
                 }
-                const fixer = isMixedLogical || forceSuggestionFixer
-                    ? // suggestion instead for cases where we aren't sure if the fixer is completely safe
+                context.report({
+                    node: barBarOperator,
+                    messageId: 'preferNullish',
+                    suggest: [
                         {
-                            suggest: [
-                                {
-                                    messageId: 'preferNullish',
-                                    fix,
-                                },
-                            ],
-                        }
-                    : { fix };
-                context.report(Object.assign({ node: barBarOperator, messageId: 'preferNullish' }, fixer));
+                            messageId: 'suggestNullish',
+                            fix,
+                        },
+                    ],
+                });
             },
         };
     },
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-nullish-coalescing.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-nullish-coalescing.js.map
index 5e24231..b46f8d4 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-nullish-coalescing.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-nullish-coalescing.js.map
@@ -1 +1 @@
-{"version":3,"file":"prefer-nullish-coalescing.js","sourceRoot":"","sources":["../../src/rules/prefer-nullish-coalescing.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAK+C;AAC/C,8CAAgC;AAWhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,2BAA2B;IACjC,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,kFAAkF;YACpF,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,oBAAoB,EAAE,IAAI;SAC3B;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,aAAa,EACX,4GAA4G;SAC/G;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,sBAAsB,EAAE;wBACtB,IAAI,EAAE,SAAS;qBAChB;oBACD,6BAA6B,EAAE;wBAC7B,IAAI,EAAE,SAAS;qBAChB;oBACD,oBAAoB,EAAE;wBACpB,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,sBAAsB,EAAE,IAAI;YAC5B,6BAA6B,EAAE,IAAI;YACnC,oBAAoB,EAAE,KAAK;SAC5B;KACF;IACD,MAAM,CACJ,OAAO,EACP,CACE,EACE,sBAAsB,EACtB,6BAA6B,EAC7B,oBAAoB,GACrB,EACF;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAExD,OAAO;YACL,oCAAoC,CAClC,IAAgC;gBAEhC,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACpD,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtE,IAAI,CAAC,SAAS,EAAE;oBACd,OAAO;iBACR;gBAED,IAAI,sBAAsB,KAAK,IAAI,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE;oBAC9D,OAAO;iBACR;gBAED,MAAM,cAAc,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;gBACtD,IAAI,6BAA6B,KAAK,IAAI,IAAI,cAAc,EAAE;oBAC5D,OAAO;iBACR;gBAED,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CACpC,UAAU,CAAC,aAAa,CACtB,IAAI,CAAC,IAAI,EACT,KAAK,CAAC,EAAE,CACN,KAAK,CAAC,IAAI,KAAK,oCAAe,CAAC,UAAU;oBACzC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,CAChC,EACD,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAC3D,CAAC;gBAEF,QAAQ,CAAC,CAAC,GAAG,CACX,KAAyB;oBAEzB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;wBACxD,kFAAkF;wBAClF,IACE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,iBAAiB;4BACnD,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EACzC;4BACA,MAAM,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;yBACpD;6BAAM;4BACL,MAAM,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;yBAC9C;wBACD,MAAM,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;qBAC9C;oBACD,MAAM,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;gBAChD,CAAC;gBAED,MAAM,KAAK,GACT,cAAc,IAAI,oBAAoB;oBACpC,CAAC,CAAC,oFAAoF;wBACnF;4BACC,OAAO,EAAE;gCACP;oCACE,SAAS,EAAE,eAAe;oCAC1B,GAAG;iCACJ;6BACF;yBACQ;oBACb,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;gBAEd,OAAO,CAAC,MAAM,iBACZ,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,eAAe,IACvB,KAAK,EACR,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,iBAAiB,CAAC,IAAmB;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1B,OAAO,OAAO,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAErB,IACE,CAAC,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,qBAAqB;YACpD,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,gBAAgB;YAChD,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,WAAW;YAC3C,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,YAAY;YAC5C,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,cAAc,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EACzB;YACA,OAAO,IAAI,CAAC;SACb;QAED,IACE;YACE,mCAAc,CAAC,uBAAuB;YACtC,mCAAc,CAAC,kBAAkB;SAClC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EACxB;YACA;;;;eAIG;YACH,OAAO,KAAK,CAAC;SACd;QAED,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;KAC1B;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAgC;IAChE,MAAM,IAAI,GAAG,IAAI,GAAG,EAA6B,CAAC;IAClD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YACrB,SAAS;SACV;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAElB,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,mCAAc,CAAC,iBAAiB,EAAE;YAChE,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE;gBAC7B,OAAO,IAAI,CAAC;aACb;iBAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE;gBACpC,sEAAsE;gBACtE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;aACzD;SACF;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
\ No newline at end of file
+{"version":3,"file":"prefer-nullish-coalescing.js","sourceRoot":"","sources":["../../src/rules/prefer-nullish-coalescing.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-optional-chain.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-optional-chain.js
index 3673794..c8eb961 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-optional-chain.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-optional-chain.js
@@ -1,14 +1,25 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const eslint_utils_1 = require("eslint-utils");
 const util = __importStar(require("../util"));
 /*
 The AST is always constructed such the first element is always the deepest element.
@@ -34,10 +45,11 @@
             description: 'Prefer using concise optional chain expressions instead of chained logical ands',
             category: 'Best Practices',
             recommended: false,
+            suggestion: true,
         },
-        fixable: 'code',
         messages: {
             preferOptionalChain: "Prefer using an optional chain expression instead, as it's more concise and easier to read.",
+            optionalChainSuggest: 'Change to an optional chain.',
         },
         schema: [],
     },
@@ -47,13 +59,18 @@
         return {
             [[
                 'LogicalExpression[operator="&&"] > Identifier',
+                'LogicalExpression[operator="&&"] > MemberExpression',
+                'LogicalExpression[operator="&&"] > ChainExpression > MemberExpression',
                 'LogicalExpression[operator="&&"] > BinaryExpression[operator="!=="]',
                 'LogicalExpression[operator="&&"] > BinaryExpression[operator="!="]',
             ].join(',')](initialIdentifierOrNotEqualsExpr) {
+                var _a;
                 // selector guarantees this cast
-                const initialExpression = initialIdentifierOrNotEqualsExpr.parent;
+                const initialExpression = (((_a = initialIdentifierOrNotEqualsExpr.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.ChainExpression
+                    ? initialIdentifierOrNotEqualsExpr.parent.parent
+                    : initialIdentifierOrNotEqualsExpr.parent);
                 if (initialExpression.left !== initialIdentifierOrNotEqualsExpr) {
-                    // the identifier is not the deepest left node
+                    // the node(identifier or member expression) is not the deepest left node
                     return;
                 }
                 if (!isValidChainTarget(initialIdentifierOrNotEqualsExpr, true)) {
@@ -136,9 +153,14 @@
                     context.report({
                         node: previous,
                         messageId: 'preferOptionalChain',
-                        fix(fixer) {
-                            return fixer.replaceText(previous, optionallyChainedCode);
-                        },
+                        suggest: [
+                            {
+                                messageId: 'optionalChainSuggest',
+                                fix: (fixer) => [
+                                    fixer.replaceText(previous, optionallyChainedCode),
+                                ],
+                            },
+                        ],
                     });
                 }
             },
@@ -149,8 +171,7 @@
                 // isValidChainTarget ensures this is type safe
                 node.left);
             }
-            if (node.type === experimental_utils_1.AST_NODE_TYPES.CallExpression ||
-                node.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression) {
+            if (node.type === experimental_utils_1.AST_NODE_TYPES.CallExpression) {
                 const calleeText = getText(
                 // isValidChainTarget ensures this is type safe
                 node.callee);
@@ -158,7 +179,7 @@
                 // - JSX: <Foo Needs Space Between Attrs />
                 // - Unary Operators: typeof foo, await bar, delete baz
                 const closingParenToken = util.nullThrows(sourceCode.getLastToken(node), util.NullThrowsReasons.MissingToken('closing parenthesis', node.type));
-                const openingParenToken = util.nullThrows(sourceCode.getFirstTokenBetween(node.callee, closingParenToken, eslint_utils_1.isOpeningParenToken), util.NullThrowsReasons.MissingToken('opening parenthesis', node.type));
+                const openingParenToken = util.nullThrows(sourceCode.getFirstTokenBetween(node.callee, closingParenToken, util.isOpeningParenToken), util.NullThrowsReasons.MissingToken('opening parenthesis', node.type));
                 const argumentsText = sourceCode.text.substring(openingParenToken.range[0], closingParenToken.range[1]);
                 return `${calleeText}${argumentsText}`;
             }
@@ -168,6 +189,13 @@
             if (node.type === experimental_utils_1.AST_NODE_TYPES.ThisExpression) {
                 return 'this';
             }
+            if (node.type === experimental_utils_1.AST_NODE_TYPES.ChainExpression) {
+                /* istanbul ignore if */ if (node.expression.type === experimental_utils_1.AST_NODE_TYPES.TSNonNullExpression) {
+                    // this shouldn't happen
+                    return '';
+                }
+                return getText(node.expression);
+            }
             return getMemberExpressionText(node);
         }
         /**
@@ -178,12 +206,10 @@
             // cases should match the list in ALLOWED_MEMBER_OBJECT_TYPES
             switch (node.object.type) {
                 case experimental_utils_1.AST_NODE_TYPES.CallExpression:
-                case experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression:
                 case experimental_utils_1.AST_NODE_TYPES.Identifier:
                     objectText = getText(node.object);
                     break;
                 case experimental_utils_1.AST_NODE_TYPES.MemberExpression:
-                case experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression:
                     objectText = getMemberExpressionText(node.object);
                     break;
                 case experimental_utils_1.AST_NODE_TYPES.ThisExpression:
@@ -201,12 +227,10 @@
                         propertyText = getText(node.property);
                         break;
                     case experimental_utils_1.AST_NODE_TYPES.Literal:
-                    case experimental_utils_1.AST_NODE_TYPES.BigIntLiteral:
                     case experimental_utils_1.AST_NODE_TYPES.TemplateLiteral:
                         propertyText = sourceCode.getText(node.property);
                         break;
                     case experimental_utils_1.AST_NODE_TYPES.MemberExpression:
-                    case experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression:
                         propertyText = getMemberExpressionText(node.property);
                         break;
                     /* istanbul ignore next */
@@ -234,39 +258,35 @@
     experimental_utils_1.AST_NODE_TYPES.CallExpression,
     experimental_utils_1.AST_NODE_TYPES.Identifier,
     experimental_utils_1.AST_NODE_TYPES.MemberExpression,
-    experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression,
-    experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression,
     experimental_utils_1.AST_NODE_TYPES.ThisExpression,
 ]);
 const ALLOWED_COMPUTED_PROP_TYPES = new Set([
-    experimental_utils_1.AST_NODE_TYPES.BigIntLiteral,
     experimental_utils_1.AST_NODE_TYPES.Identifier,
     experimental_utils_1.AST_NODE_TYPES.Literal,
     experimental_utils_1.AST_NODE_TYPES.MemberExpression,
-    experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression,
     experimental_utils_1.AST_NODE_TYPES.TemplateLiteral,
 ]);
 const ALLOWED_NON_COMPUTED_PROP_TYPES = new Set([
     experimental_utils_1.AST_NODE_TYPES.Identifier,
 ]);
 function isValidChainTarget(node, allowIdentifier) {
-    if (node.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression ||
-        node.type === experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression) {
+    if (node.type === experimental_utils_1.AST_NODE_TYPES.ChainExpression) {
+        return isValidChainTarget(node.expression, allowIdentifier);
+    }
+    if (node.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression) {
         const isObjectValid = ALLOWED_MEMBER_OBJECT_TYPES.has(node.object.type) &&
             // make sure to validate the expression is of our expected structure
             isValidChainTarget(node.object, true);
         const isPropertyValid = node.computed
             ? ALLOWED_COMPUTED_PROP_TYPES.has(node.property.type) &&
                 // make sure to validate the member expression is of our expected structure
-                (node.property.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression ||
-                    node.property.type === experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression
+                (node.property.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression
                     ? isValidChainTarget(node.property, allowIdentifier)
                     : true)
             : ALLOWED_NON_COMPUTED_PROP_TYPES.has(node.property.type);
         return isObjectValid && isPropertyValid;
     }
-    if (node.type === experimental_utils_1.AST_NODE_TYPES.CallExpression ||
-        node.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression) {
+    if (node.type === experimental_utils_1.AST_NODE_TYPES.CallExpression) {
         return isValidChainTarget(node.callee, allowIdentifier);
     }
     if (allowIdentifier &&
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-optional-chain.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-optional-chain.js.map
index bf51065..1ce75dd 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-optional-chain.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-optional-chain.js.map
@@ -1 +1 @@
-{"version":3,"file":"prefer-optional-chain.js","sourceRoot":"","sources":["../../src/rules/prefer-optional-chain.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"prefer-optional-chain.js","sourceRoot":"","sources":["../../src/rules/prefer-optional-chain.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly-parameter-types.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly-parameter-types.js
index bb2269b..1c79049 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly-parameter-types.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly-parameter-types.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -31,7 +43,7 @@
             },
         ],
         messages: {
-            shouldBeReadonly: 'Parameter should be a read only type',
+            shouldBeReadonly: 'Parameter should be a read only type.',
         },
     },
     defaultOptions: [
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly-parameter-types.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly-parameter-types.js.map
index 58be343..be616c8 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly-parameter-types.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly-parameter-types.js.map
@@ -1 +1 @@
-{"version":3,"file":"prefer-readonly-parameter-types.js","sourceRoot":"","sources":["../../src/rules/prefer-readonly-parameter-types.ts"],"names":[],"mappings":";;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAShC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,iCAAiC;IACvC,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,kGAAkG;YACpG,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,KAAK;YAClB,oBAAoB,EAAE,IAAI;SAC3B;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE;oBACV,wBAAwB,EAAE;wBACxB,IAAI,EAAE,SAAS;qBAChB;iBACF;aACF;SACF;QACD,QAAQ,EAAE;YACR,gBAAgB,EAAE,sCAAsC;SACzD;KACF;IACD,cAAc,EAAE;QACd;YACE,wBAAwB,EAAE,IAAI;SAC/B;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,wBAAwB,EAAE,CAAC;QAC5C,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QAEzC,OAAO;YACL,CAAC;gBACC,mCAAc,CAAC,uBAAuB;gBACtC,mCAAc,CAAC,mBAAmB;gBAClC,mCAAc,CAAC,kBAAkB;gBACjC,mCAAc,CAAC,0BAA0B;gBACzC,mCAAc,CAAC,+BAA+B;gBAC9C,mCAAc,CAAC,iBAAiB;gBAChC,mCAAc,CAAC,6BAA6B;gBAC5C,mCAAc,CAAC,cAAc;gBAC7B,mCAAc,CAAC,iBAAiB;aACjC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACX,IAS8B;gBAE9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;oBAC/B,IACE,CAAC,wBAAwB;wBACzB,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,mBAAmB,EACjD;wBACA,SAAS;qBACV;oBAED,MAAM,WAAW,GACf,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,mBAAmB;wBAC/C,CAAC,CAAC,KAAK,CAAC,SAAS;wBACjB,CAAC,CAAC,KAAK,CAAC;oBACZ,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACtD,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;oBAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBAEtD,IAAI,CAAC,UAAU,EAAE;wBACf,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,WAAW;4BACjB,SAAS,EAAE,kBAAkB;yBAC9B,CAAC,CAAC;qBACJ;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"prefer-readonly-parameter-types.js","sourceRoot":"","sources":["../../src/rules/prefer-readonly-parameter-types.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAShC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,iCAAiC;IACvC,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,kGAAkG;YACpG,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,KAAK;YAClB,oBAAoB,EAAE,IAAI;SAC3B;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE;oBACV,wBAAwB,EAAE;wBACxB,IAAI,EAAE,SAAS;qBAChB;iBACF;aACF;SACF;QACD,QAAQ,EAAE;YACR,gBAAgB,EAAE,uCAAuC;SAC1D;KACF;IACD,cAAc,EAAE;QACd;YACE,wBAAwB,EAAE,IAAI;SAC/B;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,wBAAwB,EAAE,CAAC;QAC5C,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QAEzC,OAAO;YACL,CAAC;gBACC,mCAAc,CAAC,uBAAuB;gBACtC,mCAAc,CAAC,mBAAmB;gBAClC,mCAAc,CAAC,kBAAkB;gBACjC,mCAAc,CAAC,0BAA0B;gBACzC,mCAAc,CAAC,+BAA+B;gBAC9C,mCAAc,CAAC,iBAAiB;gBAChC,mCAAc,CAAC,6BAA6B;gBAC5C,mCAAc,CAAC,cAAc;gBAC7B,mCAAc,CAAC,iBAAiB;aACjC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACX,IAS8B;gBAE9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;oBAC/B,IACE,CAAC,wBAAwB;wBACzB,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,mBAAmB,EACjD;wBACA,SAAS;qBACV;oBAED,MAAM,WAAW,GACf,KAAK,CAAC,IAAI,KAAK,mCAAc,CAAC,mBAAmB;wBAC/C,CAAC,CAAC,KAAK,CAAC,SAAS;wBACjB,CAAC,CAAC,KAAK,CAAC;oBACZ,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACtD,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;oBAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBAEtD,IAAI,CAAC,UAAU,EAAE;wBACf,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,WAAW;4BACjB,SAAS,EAAE,kBAAkB;yBAC9B,CAAC,CAAC;qBACJ;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly.js
index 74d34ad..ede07d7 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -202,7 +214,7 @@
     }
     addVariableModification(node) {
         const modifierType = this.checker.getTypeAtLocation(node.expression);
-        if (modifierType.symbol === undefined ||
+        if (!modifierType.getSymbol() ||
             !util_1.typeIsOrHasBaseType(modifierType, this.classType)) {
             return;
         }
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly.js.map
index e550b41..1aae677 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-readonly.js.map
@@ -1 +1 @@
-{"version":3,"file":"prefer-readonly.js","sourceRoot":"","sources":["../../src/rules/prefer-readonly.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"prefer-readonly.js","sourceRoot":"","sources":["../../src/rules/prefer-readonly.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-reduce-type-parameter.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-reduce-type-parameter.js
new file mode 100644
index 0000000..d108479
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-reduce-type-parameter.js
@@ -0,0 +1,92 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+const util = __importStar(require("../util"));
+const getMemberExpressionName = (member) => {
+    if (!member.computed) {
+        return member.property.name;
+    }
+    if (member.property.type === experimental_utils_1.AST_NODE_TYPES.Literal &&
+        typeof member.property.value === 'string') {
+        return member.property.value;
+    }
+    return null;
+};
+exports.default = util.createRule({
+    name: 'prefer-reduce-type-parameter',
+    meta: {
+        type: 'problem',
+        docs: {
+            category: 'Best Practices',
+            recommended: false,
+            description: 'Prefer using type parameter when calling `Array#reduce` instead of casting',
+            requiresTypeChecking: true,
+        },
+        messages: {
+            preferTypeParameter: 'Unnecessary cast: Array#reduce accepts a type parameter for the default value.',
+        },
+        fixable: 'code',
+        schema: [],
+    },
+    defaultOptions: [],
+    create(context) {
+        const service = util.getParserServices(context);
+        const checker = service.program.getTypeChecker();
+        return {
+            'CallExpression > MemberExpression.callee'(callee) {
+                if (getMemberExpressionName(callee) !== 'reduce') {
+                    return;
+                }
+                const [, secondArg] = callee.parent.arguments;
+                if (callee.parent.arguments.length < 2 ||
+                    !util.isTypeAssertion(secondArg)) {
+                    return;
+                }
+                // Get the symbol of the `reduce` method.
+                const tsNode = service.esTreeNodeToTSNodeMap.get(callee.object);
+                const calleeObjType = util.getConstrainedTypeAtLocation(checker, tsNode);
+                // Check the owner type of the `reduce` method.
+                if (checker.isArrayType(calleeObjType)) {
+                    context.report({
+                        messageId: 'preferTypeParameter',
+                        node: secondArg,
+                        fix: fixer => [
+                            fixer.removeRange([
+                                secondArg.range[0],
+                                secondArg.expression.range[0],
+                            ]),
+                            fixer.removeRange([
+                                secondArg.expression.range[1],
+                                secondArg.range[1],
+                            ]),
+                            fixer.insertTextAfter(callee, `<${context
+                                .getSourceCode()
+                                .getText(secondArg.typeAnnotation)}>`),
+                        ],
+                    });
+                    return;
+                }
+            },
+        };
+    },
+});
+//# sourceMappingURL=prefer-reduce-type-parameter.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-reduce-type-parameter.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-reduce-type-parameter.js.map
new file mode 100644
index 0000000..647e716
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-reduce-type-parameter.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"prefer-reduce-type-parameter.js","sourceRoot":"","sources":["../../src/rules/prefer-reduce-type-parameter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,8CAAgC;AAMhC,MAAM,uBAAuB,GAAG,CAC9B,MAAiC,EAClB,EAAE;IACjB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;QACpB,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;KAC7B;IAED,IACE,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO;QAC/C,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,KAAK,QAAQ,EACzC;QACA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;KAC9B;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,8BAA8B;IACpC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,WAAW,EACT,4EAA4E;YAC9E,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,mBAAmB,EACjB,gFAAgF;SACnF;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAEjD,OAAO;YACL,0CAA0C,CACxC,MAAgD;gBAEhD,IAAI,uBAAuB,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE;oBAChD,OAAO;iBACR;gBAED,MAAM,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;gBAE9C,IACE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;oBAClC,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAChC;oBACA,OAAO;iBACR;gBAED,yCAAyC;gBACzC,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAChE,MAAM,aAAa,GAAG,IAAI,CAAC,4BAA4B,CACrD,OAAO,EACP,MAAM,CACP,CAAC;gBAEF,+CAA+C;gBAC/C,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE;oBACtC,OAAO,CAAC,MAAM,CAAC;wBACb,SAAS,EAAE,qBAAqB;wBAChC,IAAI,EAAE,SAAS;wBACf,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;4BACZ,KAAK,CAAC,WAAW,CAAC;gCAChB,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gCAClB,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;6BAC9B,CAAC;4BACF,KAAK,CAAC,WAAW,CAAC;gCAChB,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;gCAC7B,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;6BACnB,CAAC;4BACF,KAAK,CAAC,eAAe,CACnB,MAAM,EACN,IAAI,OAAO;iCACR,aAAa,EAAE;iCACf,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CACxC;yBACF;qBACF,CAAC,CAAC;oBAEH,OAAO;iBACR;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-regexp-exec.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-regexp-exec.js
index 59ccb3f..a09b655 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-regexp-exec.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-regexp-exec.js
@@ -1,6 +1,5 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-const eslint_utils_1 = require("eslint-utils");
 const util_1 = require("../util");
 exports.default = util_1.createRule({
     name: 'prefer-regexp-exec',
@@ -34,7 +33,7 @@
             "CallExpression[arguments.length=1] > MemberExpression.callee[property.name='match'][computed=false]"(node) {
                 const callNode = node.parent;
                 const arg = callNode.arguments[0];
-                const evaluated = eslint_utils_1.getStaticValue(arg, globalScope);
+                const evaluated = util_1.getStaticValue(arg, globalScope);
                 // Don't report regular expressions with global flag.
                 if (evaluated &&
                     evaluated.value instanceof RegExp &&
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-regexp-exec.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-regexp-exec.js.map
index c9b3091..3aa5e73 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-regexp-exec.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-regexp-exec.js.map
@@ -1 +1 @@
-{"version":3,"file":"prefer-regexp-exec.js","sourceRoot":"","sources":["../../src/rules/prefer-regexp-exec.ts"],"names":[],"mappings":";;AACA,+CAA8C;AAC9C,kCAAqE;AAErE,kBAAe,iBAAU,CAAC;IACxB,IAAI,EAAE,oBAAoB;IAC1B,cAAc,EAAE,EAAE;IAElB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,4FAA4F;YAC9F,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;YACpB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,yBAAyB,EAAE,yCAAyC;SACrE;QACD,MAAM,EAAE,EAAE;KACX;IAED,MAAM,CAAC,OAAO;QACZ,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,wBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAErD;;;WAGG;QACH,SAAS,YAAY,CAAC,IAAqC;YACzD,MAAM,UAAU,GAAG,WAAW,CAAC,iBAAiB,CAC9C,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CACxC,CAAC;YACF,OAAO,kBAAW,CAAC,WAAW,EAAE,UAAU,CAAC,KAAK,QAAQ,CAAC;QAC3D,CAAC;QAED,OAAO;YACL,qGAAqG,CACnG,IAA+B;gBAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAiC,CAAC;gBACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,SAAS,GAAG,6BAAc,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBAEnD,qDAAqD;gBACrD,IACE,SAAS;oBACT,SAAS,CAAC,KAAK,YAAY,MAAM;oBACjC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EACnC;oBACA,OAAO;iBACR;gBAED,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;oBAC7B,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,QAAQ;wBACd,SAAS,EAAE,2BAA2B;qBACvC,CAAC,CAAC;oBACH,OAAO;iBACR;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"prefer-regexp-exec.js","sourceRoot":"","sources":["../../src/rules/prefer-regexp-exec.ts"],"names":[],"mappings":";;AACA,kCAKiB;AAEjB,kBAAe,iBAAU,CAAC;IACxB,IAAI,EAAE,oBAAoB;IAC1B,cAAc,EAAE,EAAE;IAElB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,4FAA4F;YAC9F,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,OAAO;YACpB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,yBAAyB,EAAE,yCAAyC;SACrE;QACD,MAAM,EAAE,EAAE;KACX;IAED,MAAM,CAAC,OAAO;QACZ,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,wBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAErD;;;WAGG;QACH,SAAS,YAAY,CAAC,IAAqC;YACzD,MAAM,UAAU,GAAG,WAAW,CAAC,iBAAiB,CAC9C,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CACxC,CAAC;YACF,OAAO,kBAAW,CAAC,WAAW,EAAE,UAAU,CAAC,KAAK,QAAQ,CAAC;QAC3D,CAAC;QAED,OAAO;YACL,qGAAqG,CACnG,IAA+B;gBAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAiC,CAAC;gBACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,SAAS,GAAG,qBAAc,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBAEnD,qDAAqD;gBACrD,IACE,SAAS;oBACT,SAAS,CAAC,KAAK,YAAY,MAAM;oBACjC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EACnC;oBACA,OAAO;iBACR;gBAED,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;oBAC7B,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE,QAAQ;wBACd,SAAS,EAAE,2BAA2B;qBACvC,CAAC,CAAC;oBACH,OAAO;iBACR;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-string-starts-ends-with.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-string-starts-ends-with.js
index fa41e4c..5b3e028 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-string-starts-ends-with.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-string-starts-ends-with.js
@@ -1,7 +1,6 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const eslint_utils_1 = require("eslint-utils");
 const regexpp_1 = require("regexpp");
 const util_1 = require("../util");
 const EQ_OPERATORS = /^[=!]=/;
@@ -14,7 +13,7 @@
         docs: {
             description: 'Enforce the use of `String#startsWith` and `String#endsWith` instead of other equivalent methods of checking substrings',
             category: 'Best Practices',
-            recommended: 'error',
+            recommended: false,
             requiresTypeChecking: true,
         },
         messages: {
@@ -42,7 +41,7 @@
          * @param node The node to check.
          */
         function isNull(node) {
-            const evaluated = eslint_utils_1.getStaticValue(node, globalScope);
+            const evaluated = util_1.getStaticValue(node, globalScope);
             return evaluated != null && evaluated.value === null;
         }
         /**
@@ -51,7 +50,7 @@
          * @param value The expected value of the `Literal` node.
          */
         function isNumber(node, value) {
-            const evaluated = eslint_utils_1.getStaticValue(node, globalScope);
+            const evaluated = util_1.getStaticValue(node, globalScope);
             return evaluated != null && evaluated.value === value;
         }
         /**
@@ -60,11 +59,10 @@
          * @param kind The method name to get a character.
          */
         function isCharacter(node) {
-            const evaluated = eslint_utils_1.getStaticValue(node, globalScope);
+            const evaluated = util_1.getStaticValue(node, globalScope);
             return (evaluated != null &&
                 typeof evaluated.value === 'string' &&
                 // checks if the string is a character long
-                // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
                 evaluated.value[0] === evaluated.value);
         }
         /**
@@ -107,13 +105,12 @@
          * @param expectedObjectNode The node which is expected as the receiver of `length` property.
          */
         function isLengthExpression(node, expectedObjectNode) {
-            if (node.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression ||
-                node.type === experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression) {
-                return (eslint_utils_1.getPropertyName(node, globalScope) === 'length' &&
+            if (node.type === experimental_utils_1.AST_NODE_TYPES.MemberExpression) {
+                return (util_1.getPropertyName(node, globalScope) === 'length' &&
                     isSameTokens(node.object, expectedObjectNode));
             }
-            const evaluatedLength = eslint_utils_1.getStaticValue(node, globalScope);
-            const evaluatedString = eslint_utils_1.getStaticValue(expectedObjectNode, globalScope);
+            const evaluatedLength = util_1.getStaticValue(node, globalScope);
+            const evaluatedString = util_1.getStaticValue(expectedObjectNode, globalScope);
             return (evaluatedLength != null &&
                 evaluatedString != null &&
                 typeof evaluatedLength.value === 'number' &&
@@ -121,6 +118,21 @@
                 evaluatedLength.value === evaluatedString.value.length);
         }
         /**
+         * Check if a given node is a negative index expression
+         *
+         * E.g. `s.slice(- <expr>)`, `s.substring(s.length - <expr>)`
+         *
+         * @param node The node to check.
+         * @param expectedIndexedNode The node which is expected as the receiver of index expression.
+         */
+        function isNegativeIndexExpression(node, expectedIndexedNode) {
+            return ((node.type === experimental_utils_1.AST_NODE_TYPES.UnaryExpression &&
+                node.operator === '-') ||
+                (node.type === experimental_utils_1.AST_NODE_TYPES.BinaryExpression &&
+                    node.operator === '-' &&
+                    isLengthExpression(node.left, expectedIndexedNode)));
+        }
+        /**
          * Check if a given node is the expression of the last index.
          *
          * E.g. `foo.length - 1`
@@ -144,7 +156,7 @@
          * @param node The member expression node to get.
          */
         function getPropertyRange(node) {
-            const dotOrOpenBracket = sourceCode.getTokenAfter(node.object, eslint_utils_1.isNotClosingParenToken);
+            const dotOrOpenBracket = sourceCode.getTokenAfter(node.object, util_1.isNotClosingParenToken);
             return [dotOrOpenBracket.range[0], node.range[1]];
         }
         /**
@@ -179,7 +191,7 @@
          * @param node The node to parse.
          */
         function parseRegExp(node) {
-            const evaluated = eslint_utils_1.getStaticValue(node, globalScope);
+            const evaluated = util_1.getStaticValue(node, globalScope);
             if (evaluated == null || !(evaluated.value instanceof RegExp)) {
                 return null;
             }
@@ -197,6 +209,22 @@
             }
             return { isEndsWith, isStartsWith, text };
         }
+        function getLeftNode(node) {
+            if (node.type === experimental_utils_1.AST_NODE_TYPES.ChainExpression) {
+                return getLeftNode(node.expression);
+            }
+            let leftNode;
+            if (node.type === experimental_utils_1.AST_NODE_TYPES.CallExpression) {
+                leftNode = node.callee;
+            }
+            else {
+                leftNode = node;
+            }
+            if (leftNode.type !== experimental_utils_1.AST_NODE_TYPES.MemberExpression) {
+                throw new Error(`Expected a MemberExpression, got ${leftNode.type}`);
+            }
+            return leftNode;
+        }
         /**
          * Fix code with using the right operand as the search string.
          * For example: `foo.slice(0, 3) === 'bar'` → `foo.startsWith('bar')`
@@ -207,10 +235,7 @@
          */
         function* fixWithRightOperand(fixer, node, kind, isNegative, isOptional) {
             // left is CallExpression or MemberExpression.
-            const leftNode = (node.left.type === experimental_utils_1.AST_NODE_TYPES.CallExpression ||
-                node.left.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression
-                ? node.left.callee
-                : node.left);
+            const leftNode = getLeftNode(node.left);
             const propertyRange = getPropertyRange(leftNode);
             if (isNegative) {
                 yield fixer.insertTextBefore(node, '!');
@@ -226,32 +251,37 @@
          * @param kind The kind of the report.
          * @param negative The flag to fix to negative condition.
          */
-        function* fixWithArgument(fixer, node, kind, negative, isOptional) {
-            const callNode = node.left;
-            const calleeNode = callNode.callee;
+        function* fixWithArgument(fixer, node, callNode, calleeNode, kind, negative, isOptional) {
             if (negative) {
                 yield fixer.insertTextBefore(node, '!');
             }
             yield fixer.replaceTextRange(getPropertyRange(calleeNode), `${isOptional ? '?.' : '.'}${kind}sWith`);
             yield fixer.removeRange([callNode.range[1], node.range[1]]);
         }
+        function getParent(node) {
+            var _a;
+            return util_1.nullThrows(((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.ChainExpression
+                ? node.parent.parent
+                : node.parent, util_1.NullThrowsReasons.MissingParent);
+        }
         return {
             // foo[0] === "a"
             // foo.charAt(0) === "a"
             // foo[foo.length - 1] === "a"
             // foo.charAt(foo.length - 1) === "a"
             [[
-                'BinaryExpression > :matches(MemberExpression, OptionalMemberExpression).left[computed=true]',
-                'BinaryExpression > :matches(CallExpression, OptionalCallExpression).left > :matches(MemberExpression, OptionalMemberExpression).callee[property.name="charAt"][computed=false]',
+                'BinaryExpression > MemberExpression.left[computed=true]',
+                'BinaryExpression > CallExpression.left > MemberExpression.callee[property.name="charAt"][computed=false]',
+                'BinaryExpression > ChainExpression.left > MemberExpression[computed=true]',
+                'BinaryExpression > ChainExpression.left > CallExpression > MemberExpression.callee[property.name="charAt"][computed=false]',
             ].join(', ')](node) {
-                let parentNode = node.parent;
+                let parentNode = getParent(node);
                 let indexNode = null;
-                if (parentNode.type === experimental_utils_1.AST_NODE_TYPES.CallExpression ||
-                    parentNode.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression) {
+                if ((parentNode === null || parentNode === void 0 ? void 0 : parentNode.type) === experimental_utils_1.AST_NODE_TYPES.CallExpression) {
                     if (parentNode.arguments.length === 1) {
                         indexNode = parentNode.arguments[0];
                     }
-                    parentNode = parentNode.parent;
+                    parentNode = getParent(parentNode);
                 }
                 else {
                     indexNode = node.property;
@@ -280,12 +310,14 @@
                 });
             },
             // foo.indexOf('bar') === 0
-            'BinaryExpression > :matches(CallExpression, OptionalCallExpression).left > :matches(MemberExpression, OptionalMemberExpression).callee[property.name="indexOf"][computed=false]'(node) {
-                const callNode = node.parent;
-                const parentNode = callNode.parent;
+            [[
+                'BinaryExpression > CallExpression.left > MemberExpression.callee[property.name="indexOf"][computed=false]',
+                'BinaryExpression > ChainExpression.left > CallExpression > MemberExpression.callee[property.name="indexOf"][computed=false]',
+            ].join(', ')](node) {
+                const callNode = getParent(node);
+                const parentNode = getParent(callNode);
                 if (callNode.arguments.length !== 1 ||
                     !isEqualityComparison(parentNode) ||
-                    parentNode.left !== callNode ||
                     !isNumber(parentNode.right, 0) ||
                     !isStringType(node.object)) {
                     return;
@@ -294,18 +326,20 @@
                     node: parentNode,
                     messageId: 'preferStartsWith',
                     fix(fixer) {
-                        return fixWithArgument(fixer, parentNode, 'start', parentNode.operator.startsWith('!'), node.optional);
+                        return fixWithArgument(fixer, parentNode, callNode, node, 'start', parentNode.operator.startsWith('!'), node.optional);
                     },
                 });
             },
             // foo.lastIndexOf('bar') === foo.length - 3
             // foo.lastIndexOf(bar) === foo.length - bar.length
-            'BinaryExpression > :matches(CallExpression, OptionalCallExpression).left > :matches(MemberExpression, OptionalMemberExpression).callee[property.name="lastIndexOf"][computed=false]'(node) {
-                const callNode = node.parent;
-                const parentNode = callNode.parent;
+            [[
+                'BinaryExpression > CallExpression.left > MemberExpression.callee[property.name="lastIndexOf"][computed=false]',
+                'BinaryExpression > ChainExpression.left > CallExpression > MemberExpression.callee[property.name="lastIndexOf"][computed=false]',
+            ].join(', ')](node) {
+                const callNode = getParent(node);
+                const parentNode = getParent(callNode);
                 if (callNode.arguments.length !== 1 ||
                     !isEqualityComparison(parentNode) ||
-                    parentNode.left !== callNode ||
                     parentNode.right.type !== experimental_utils_1.AST_NODE_TYPES.BinaryExpression ||
                     parentNode.right.operator !== '-' ||
                     !isLengthExpression(parentNode.right.left, node.object) ||
@@ -317,15 +351,18 @@
                     node: parentNode,
                     messageId: 'preferEndsWith',
                     fix(fixer) {
-                        return fixWithArgument(fixer, parentNode, 'end', parentNode.operator.startsWith('!'), node.optional);
+                        return fixWithArgument(fixer, parentNode, callNode, node, 'end', parentNode.operator.startsWith('!'), node.optional);
                     },
                 });
             },
             // foo.match(/^bar/) === null
             // foo.match(/bar$/) === null
-            'BinaryExpression > :matches(CallExpression, OptionalCallExpression).left > :matches(MemberExpression, OptionalMemberExpression).callee[property.name="match"][computed=false]'(node) {
-                const callNode = node.parent;
-                const parentNode = callNode.parent;
+            [[
+                'BinaryExpression > CallExpression.left > MemberExpression.callee[property.name="match"][computed=false]',
+                'BinaryExpression > ChainExpression.left > CallExpression > MemberExpression.callee[property.name="match"][computed=false]',
+            ].join(', ')](node) {
+                const callNode = getParent(node);
+                const parentNode = getParent(callNode);
                 if (!isEqualityComparison(parentNode) ||
                     !isNull(parentNode.right) ||
                     !isStringType(node.object)) {
@@ -358,19 +395,20 @@
             // foo.substring(foo.length - 3) === 'bar'
             // foo.substring(foo.length - 3, foo.length) === 'bar'
             [[
-                ':matches(CallExpression, OptionalCallExpression) > :matches(MemberExpression, OptionalMemberExpression).callee[property.name="slice"][computed=false]',
-                ':matches(CallExpression, OptionalCallExpression) > :matches(MemberExpression, OptionalMemberExpression).callee[property.name="substring"][computed=false]',
+                'BinaryExpression > CallExpression.left > MemberExpression.callee[property.name="slice"][computed=false]',
+                'BinaryExpression > CallExpression.left > MemberExpression.callee[property.name="substring"][computed=false]',
+                'BinaryExpression > ChainExpression.left > CallExpression > MemberExpression.callee[property.name="slice"][computed=false]',
+                'BinaryExpression > ChainExpression.left > CallExpression > MemberExpression.callee[property.name="substring"][computed=false]',
             ].join(', ')](node) {
-                const callNode = node.parent;
-                const parentNode = callNode.parent;
-                if (!isEqualityComparison(parentNode) ||
-                    parentNode.left !== callNode ||
-                    !isStringType(node.object)) {
+                const callNode = getParent(node);
+                const parentNode = getParent(callNode);
+                if (!isEqualityComparison(parentNode) || !isStringType(node.object)) {
                     return;
                 }
-                const isEndsWith = callNode.arguments.length === 1 ||
+                const isEndsWith = (callNode.arguments.length === 1 ||
                     (callNode.arguments.length === 2 &&
-                        isLengthExpression(callNode.arguments[1], node.object));
+                        isLengthExpression(callNode.arguments[1], node.object))) &&
+                    isNegativeIndexExpression(callNode.arguments[0], node.object);
                 const isStartsWith = !isEndsWith &&
                     callNode.arguments.length === 2 &&
                     isNumber(callNode.arguments[0], 0);
@@ -389,6 +427,9 @@
                                 typeof eqNode.right.value !== 'string')) {
                             return null;
                         }
+                        // code being checked is likely mistake:
+                        // unequal length of strings being checked for equality
+                        // or reliant on behavior of substring (negative indices interpreted as 0)
                         if (isStartsWith) {
                             if (!isLengthExpression(callNode.arguments[1], eqNode.right)) {
                                 return null;
@@ -414,8 +455,8 @@
             },
             // /^bar/.test(foo)
             // /bar$/.test(foo)
-            ':matches(CallExpression, OptionalCallExpression) > :matches(MemberExpression, OptionalMemberExpression).callee[property.name="test"][computed=false]'(node) {
-                const callNode = node.parent;
+            'CallExpression > MemberExpression.callee[property.name="test"][computed=false]'(node) {
+                const callNode = getParent(node);
                 const parsed = callNode.arguments.length === 1 ? parseRegExp(node.object) : null;
                 if (parsed == null) {
                     return;
@@ -432,17 +473,13 @@
                             argNode.type !== experimental_utils_1.AST_NODE_TYPES.TemplateLiteral &&
                             argNode.type !== experimental_utils_1.AST_NODE_TYPES.Identifier &&
                             argNode.type !== experimental_utils_1.AST_NODE_TYPES.MemberExpression &&
-                            argNode.type !== experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression &&
-                            argNode.type !== experimental_utils_1.AST_NODE_TYPES.CallExpression &&
-                            argNode.type !== experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression;
+                            argNode.type !== experimental_utils_1.AST_NODE_TYPES.CallExpression;
                         yield fixer.removeRange([callNode.range[0], argNode.range[0]]);
                         if (needsParen) {
                             yield fixer.insertTextBefore(argNode, '(');
                             yield fixer.insertTextAfter(argNode, ')');
                         }
-                        yield fixer.insertTextAfter(argNode, `${callNode.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression
-                            ? '?.'
-                            : '.'}${methodName}(${JSON.stringify(text)}`);
+                        yield fixer.insertTextAfter(argNode, `${node.optional ? '?.' : '.'}${methodName}(${JSON.stringify(text)}`);
                     },
                 });
             },
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-string-starts-ends-with.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-string-starts-ends-with.js.map
index 9d229c0..55dc08b 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-string-starts-ends-with.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-string-starts-ends-with.js.map
@@ -1 +1 @@
-{"version":3,"file":"prefer-string-starts-ends-with.js","sourceRoot":"","sources":["../../src/rules/prefer-string-starts-ends-with.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"prefer-string-starts-ends-with.js","sourceRoot":"","sources":["../../src/rules/prefer-string-starts-ends-with.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-ts-expect-error.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-ts-expect-error.js
new file mode 100644
index 0000000..e086529
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-ts-expect-error.js
@@ -0,0 +1,81 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const util = __importStar(require("../util"));
+const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
+exports.default = util.createRule({
+    name: 'prefer-ts-expect-error',
+    meta: {
+        type: 'problem',
+        docs: {
+            description: 'Recommends using `@ts-expect-error` over `@ts-ignore`',
+            category: 'Best Practices',
+            recommended: false,
+        },
+        fixable: 'code',
+        messages: {
+            preferExpectErrorComment: 'Use "@ts-expect-error" to ensure an error is actually being suppressed.',
+        },
+        schema: [],
+    },
+    defaultOptions: [],
+    create(context) {
+        const tsIgnoreRegExpSingleLine = /^\s*\/?\s*@ts-ignore/;
+        const tsIgnoreRegExpMultiLine = /^\s*(?:\/|\*)*\s*@ts-ignore/;
+        const sourceCode = context.getSourceCode();
+        function isLineComment(comment) {
+            return comment.type === experimental_utils_1.AST_TOKEN_TYPES.Line;
+        }
+        function getLastCommentLine(comment) {
+            if (isLineComment(comment)) {
+                return comment.value;
+            }
+            // For multiline comments - we look at only the last line.
+            const commentlines = comment.value.split('\n');
+            return commentlines[commentlines.length - 1];
+        }
+        function isValidTsIgnorePresent(comment) {
+            const line = getLastCommentLine(comment);
+            return isLineComment(comment)
+                ? tsIgnoreRegExpSingleLine.test(line)
+                : tsIgnoreRegExpMultiLine.test(line);
+        }
+        return {
+            Program() {
+                const comments = sourceCode.getAllComments();
+                comments.forEach(comment => {
+                    if (isValidTsIgnorePresent(comment)) {
+                        const lineCommentRuleFixer = (fixer) => fixer.replaceText(comment, `//${comment.value.replace('@ts-ignore', '@ts-expect-error')}`);
+                        const blockCommentRuleFixer = (fixer) => fixer.replaceText(comment, `/*${comment.value.replace('@ts-ignore', '@ts-expect-error')}*/`);
+                        context.report({
+                            node: comment,
+                            messageId: 'preferExpectErrorComment',
+                            fix: isLineComment(comment)
+                                ? lineCommentRuleFixer
+                                : blockCommentRuleFixer,
+                        });
+                    }
+                });
+            },
+        };
+    },
+});
+//# sourceMappingURL=prefer-ts-expect-error.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-ts-expect-error.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-ts-expect-error.js.map
new file mode 100644
index 0000000..4680747
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/prefer-ts-expect-error.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"prefer-ts-expect-error.js","sourceRoot":"","sources":["../../src/rules/prefer-ts-expect-error.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8CAAgC;AAChC,8EAG+C;AAQ/C,kBAAe,IAAI,CAAC,UAAU,CAAiB;IAC7C,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,uDAAuD;YACpE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;SACnB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,wBAAwB,EACtB,yEAAyE;SAC5E;QACD,MAAM,EAAE,EAAE;KACX;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;QACxD,MAAM,uBAAuB,GAAG,6BAA6B,CAAC;QAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QAE3C,SAAS,aAAa,CAAC,OAAyB;YAC9C,OAAO,OAAO,CAAC,IAAI,KAAK,oCAAe,CAAC,IAAI,CAAC;QAC/C,CAAC;QAED,SAAS,kBAAkB,CAAC,OAAyB;YACnD,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE;gBAC1B,OAAO,OAAO,CAAC,KAAK,CAAC;aACtB;YAED,0DAA0D;YAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,OAAO,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,SAAS,sBAAsB,CAAC,OAAyB;YACvD,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO,aAAa,CAAC,OAAO,CAAC;gBAC3B,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;gBACrC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,OAAO;YACL,OAAO;gBACL,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;gBAC7C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBACzB,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE;wBACnC,MAAM,oBAAoB,GAAG,CAAC,KAAgB,EAAW,EAAE,CACzD,KAAK,CAAC,WAAW,CACf,OAAO,EACP,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,kBAAkB,CAAC,EAAE,CAC/D,CAAC;wBAEJ,MAAM,qBAAqB,GAAG,CAAC,KAAgB,EAAW,EAAE,CAC1D,KAAK,CAAC,WAAW,CACf,OAAO,EACP,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,CACxB,YAAY,EACZ,kBAAkB,CACnB,IAAI,CACN,CAAC;wBAEJ,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,OAAO;4BACb,SAAS,EAAE,0BAA0B;4BACrC,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC;gCACzB,CAAC,CAAC,oBAAoB;gCACtB,CAAC,CAAC,qBAAqB;yBAC1B,CAAC,CAAC;qBACJ;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/promise-function-async.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/promise-function-async.js
index c1dcaf5..b216a9c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/promise-function-async.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/promise-function-async.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/promise-function-async.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/promise-function-async.js.map
index 7d8cb4e..bfd56d5 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/promise-function-async.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/promise-function-async.js.map
@@ -1 +1 @@
-{"version":3,"file":"promise-function-async.js","sourceRoot":"","sources":["../../src/rules/promise-function-async.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"promise-function-async.js","sourceRoot":"","sources":["../../src/rules/promise-function-async.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/quotes.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/quotes.js
index 34653d8..17e820c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/quotes.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/quotes.js
@@ -1,14 +1,27 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var _a;
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const quotes_1 = __importDefault(require("eslint/lib/rules/quotes"));
@@ -24,7 +37,9 @@
             extendsBaseRule: true,
         },
         fixable: 'code',
-        messages: quotes_1.default.meta.messages,
+        messages: (_a = quotes_1.default.meta.messages) !== null && _a !== void 0 ? _a : {
+            wrongQuotes: 'Strings must use {{description}}.',
+        },
         schema: quotes_1.default.meta.schema,
     },
     defaultOptions: [
@@ -37,14 +52,14 @@
     create(context, [option]) {
         const rules = quotes_1.default.create(context);
         function isAllowedAsNonBacktick(node) {
-            var _a;
             const parent = node.parent;
-            switch ((_a = parent) === null || _a === void 0 ? void 0 : _a.type) {
+            switch (parent === null || parent === void 0 ? void 0 : parent.type) {
                 case experimental_utils_1.AST_NODE_TYPES.TSAbstractMethodDefinition:
                 case experimental_utils_1.AST_NODE_TYPES.TSMethodSignature:
                 case experimental_utils_1.AST_NODE_TYPES.TSPropertySignature:
                 case experimental_utils_1.AST_NODE_TYPES.TSModuleDeclaration:
                 case experimental_utils_1.AST_NODE_TYPES.TSLiteralType:
+                case experimental_utils_1.AST_NODE_TYPES.TSExternalModuleReference:
                     return true;
                 case experimental_utils_1.AST_NODE_TYPES.TSEnumMember:
                     return node === parent.id;
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/quotes.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/quotes.js.map
index 95dee9c..de3a0e5 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/quotes.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/quotes.js.map
@@ -1 +1 @@
-{"version":3,"file":"quotes.js","sourceRoot":"","sources":["../../src/rules/quotes.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8EAG+C;AAC/C,qEAA+C;AAC/C,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE;YACJ,WAAW,EACT,0EAA0E;YAC5E,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,gBAAQ,CAAC,IAAI,CAAC,QAAQ;QAChC,MAAM,EAAE,gBAAQ,CAAC,IAAI,CAAC,MAAM;KAC7B;IACD,cAAc,EAAE;QACd,QAAQ;QACR;YACE,qBAAqB,EAAE,KAAK;YAC5B,WAAW,EAAE,KAAK;SACnB;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;QACtB,MAAM,KAAK,GAAG,gBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvC,SAAS,sBAAsB,CAAC,IAAsB;;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAE3B,cAAQ,MAAM,0CAAE,IAAI,EAAE;gBACpB,KAAK,mCAAc,CAAC,0BAA0B,CAAC;gBAC/C,KAAK,mCAAc,CAAC,iBAAiB,CAAC;gBACtC,KAAK,mCAAc,CAAC,mBAAmB,CAAC;gBACxC,KAAK,mCAAc,CAAC,mBAAmB,CAAC;gBACxC,KAAK,mCAAc,CAAC,aAAa;oBAC/B,OAAO,IAAI,CAAC;gBAEd,KAAK,mCAAc,CAAC,YAAY;oBAC9B,OAAO,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;gBAE5B,KAAK,mCAAc,CAAC,uBAAuB,CAAC;gBAC5C,KAAK,mCAAc,CAAC,aAAa;oBAC/B,OAAO,IAAI,KAAK,MAAM,CAAC,GAAG,CAAC;gBAE7B;oBACE,OAAO,KAAK,CAAC;aAChB;QACH,CAAC;QAED,OAAO;YACL,OAAO,CAAC,IAAI;gBACV,IAAI,MAAM,KAAK,UAAU,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE;oBACzD,OAAO;iBACR;gBAED,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YAED,eAAe,CAAC,IAAI;gBAClB,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"quotes.js","sourceRoot":"","sources":["../../src/rules/quotes.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,qEAA+C;AAC/C,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE;YACJ,WAAW,EACT,0EAA0E;YAC5E,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,OAAO,EAAE,MAAM;QACf,QAAQ,QAAE,gBAAQ,CAAC,IAAI,CAAC,QAAQ,mCAAI;YAClC,WAAW,EAAE,mCAAmC;SACjD;QACD,MAAM,EAAE,gBAAQ,CAAC,IAAI,CAAC,MAAM;KAC7B;IACD,cAAc,EAAE;QACd,QAAQ;QACR;YACE,qBAAqB,EAAE,KAAK;YAC5B,WAAW,EAAE,KAAK;SACnB;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;QACtB,MAAM,KAAK,GAAG,gBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvC,SAAS,sBAAsB,CAAC,IAAsB;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAE3B,QAAQ,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,EAAE;gBACpB,KAAK,mCAAc,CAAC,0BAA0B,CAAC;gBAC/C,KAAK,mCAAc,CAAC,iBAAiB,CAAC;gBACtC,KAAK,mCAAc,CAAC,mBAAmB,CAAC;gBACxC,KAAK,mCAAc,CAAC,mBAAmB,CAAC;gBACxC,KAAK,mCAAc,CAAC,aAAa,CAAC;gBAClC,KAAK,mCAAc,CAAC,yBAAyB;oBAC3C,OAAO,IAAI,CAAC;gBAEd,KAAK,mCAAc,CAAC,YAAY;oBAC9B,OAAO,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;gBAE5B,KAAK,mCAAc,CAAC,uBAAuB,CAAC;gBAC5C,KAAK,mCAAc,CAAC,aAAa;oBAC/B,OAAO,IAAI,KAAK,MAAM,CAAC,GAAG,CAAC;gBAE7B;oBACE,OAAO,KAAK,CAAC;aAChB;QACH,CAAC;QAED,OAAO;YACL,OAAO,CAAC,IAAI;gBACV,IAAI,MAAM,KAAK,UAAU,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE;oBACzD,OAAO;iBACR;gBAED,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YAED,eAAe,CAAC,IAAI;gBAClB,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-array-sort-compare.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-array-sort-compare.js
index 797d091..e71e0d5 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-array-sort-compare.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-array-sort-compare.js
@@ -1,17 +1,32 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
-const ts = __importStar(require("typescript"));
 const util = __importStar(require("../util"));
 exports.default = util.createRule({
     name: 'require-array-sort-compare',
-    defaultOptions: [],
+    defaultOptions: [
+        {
+            ignoreStringArrays: false,
+        },
+    ],
     meta: {
         type: 'problem',
         docs: {
@@ -23,28 +38,41 @@
         messages: {
             requireCompare: "Require 'compare' argument.",
         },
-        schema: [],
+        schema: [
+            {
+                type: 'object',
+                properties: {
+                    ignoreStringArrays: {
+                        type: 'boolean',
+                    },
+                },
+            },
+        ],
     },
-    create(context) {
+    create(context, [options]) {
         const service = util.getParserServices(context);
         const checker = service.program.getTypeChecker();
+        /**
+         * Check if a given node is an array which all elements are string.
+         * @param node
+         */
+        function isStringArrayNode(node) {
+            const type = checker.getTypeAtLocation(service.esTreeNodeToTSNodeMap.get(node));
+            if (checker.isArrayType(type) || checker.isTupleType(type)) {
+                const typeArgs = checker.getTypeArguments(type);
+                return typeArgs.every(arg => util.getTypeName(checker, arg) === 'string');
+            }
+            return false;
+        }
         return {
-            ":matches(CallExpression, OptionalCallExpression)[arguments.length=0] > :matches(MemberExpression, OptionalMemberExpression)[property.name='sort'][computed=false]"(node) {
-                // Get the symbol of the `sort` method.
-                const tsNode = service.esTreeNodeToTSNodeMap.get(node);
-                const sortSymbol = checker.getSymbolAtLocation(tsNode);
-                if (sortSymbol == null) {
+            "CallExpression[arguments.length=0] > MemberExpression[property.name='sort'][computed=false]"(callee) {
+                const tsNode = service.esTreeNodeToTSNodeMap.get(callee.object);
+                const calleeObjType = util.getConstrainedTypeAtLocation(checker, tsNode);
+                if (options.ignoreStringArrays && isStringArrayNode(callee.object)) {
                     return;
                 }
-                // Check the owner type of the `sort` method.
-                for (const methodDecl of sortSymbol.declarations) {
-                    const typeDecl = methodDecl.parent;
-                    if (ts.isInterfaceDeclaration(typeDecl) &&
-                        ts.isSourceFile(typeDecl.parent) &&
-                        typeDecl.name.escapedText === 'Array') {
-                        context.report({ node: node.parent, messageId: 'requireCompare' });
-                        return;
-                    }
+                if (util.isTypeArrayTypeOrUnionOfArrayTypes(calleeObjType, checker)) {
+                    context.report({ node: callee.parent, messageId: 'requireCompare' });
                 }
             },
         };
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-array-sort-compare.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-array-sort-compare.js.map
index 1e1d48d..1a04cc4 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-array-sort-compare.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-array-sort-compare.js.map
@@ -1 +1 @@
-{"version":3,"file":"require-array-sort-compare.js","sourceRoot":"","sources":["../../src/rules/require-array-sort-compare.ts"],"names":[],"mappings":";;;;;;;;;AACA,+CAAiC;AACjC,8CAAgC;AAEhC,kBAAe,IAAI,CAAC,UAAU,CAAC;IAC7B,IAAI,EAAE,4BAA4B;IAClC,cAAc,EAAE,EAAE;IAElB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,mEAAmE;YACrE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,cAAc,EAAE,6BAA6B;SAC9C;QACD,MAAM,EAAE,EAAE;KACX;IAED,MAAM,CAAC,OAAO;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAEjD,OAAO;YACL,mKAAmK,CACjK,IAAmE;gBAEnE,uCAAuC;gBACvC,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACvD,MAAM,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;gBACvD,IAAI,UAAU,IAAI,IAAI,EAAE;oBACtB,OAAO;iBACR;gBAED,6CAA6C;gBAC7C,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,YAAY,EAAE;oBAChD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC;oBACnC,IACE,EAAE,CAAC,sBAAsB,CAAC,QAAQ,CAAC;wBACnC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;wBAChC,QAAQ,CAAC,IAAI,CAAC,WAAW,KAAK,OAAO,EACrC;wBACA,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;wBACpE,OAAO;qBACR;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"require-array-sort-compare.js","sourceRoot":"","sources":["../../src/rules/require-array-sort-compare.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,8CAAgC;AAShC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,4BAA4B;IAClC,cAAc,EAAE;QACd;YACE,kBAAkB,EAAE,KAAK;SAC1B;KACF;IAED,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,mEAAmE;YACrE,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,cAAc,EAAE,6BAA6B;SAC9C;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,kBAAkB,EAAE;wBAClB,IAAI,EAAE,SAAS;qBAChB;iBACF;aACF;SACF;KACF;IAED,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAEjD;;;WAGG;QACH,SAAS,iBAAiB,CAAC,IAAqC;YAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CACpC,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CACxC,CAAC;YACF,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;gBAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBAChD,OAAO,QAAQ,CAAC,KAAK,CACnB,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,QAAQ,CACnD,CAAC;aACH;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO;YACL,6FAA6F,CAC3F,MAAiC;gBAEjC,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAChE,MAAM,aAAa,GAAG,IAAI,CAAC,4BAA4B,CACrD,OAAO,EACP,MAAM,CACP,CAAC;gBAEF,IAAI,OAAO,CAAC,kBAAkB,IAAI,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;oBAClE,OAAO;iBACR;gBAED,IAAI,IAAI,CAAC,kCAAkC,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE;oBACnE,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;iBACvE;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-await.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-await.js
index 0da4691..3bdbc09 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-await.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-await.js
@@ -1,14 +1,25 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const eslint_utils_1 = require("eslint-utils");
 const tsutils = __importStar(require("tsutils"));
 const util = __importStar(require("../util"));
 exports.default = util.createRule({
@@ -41,6 +52,8 @@
                 upper: scopeInfo,
                 hasAwait: false,
                 hasAsync: node.async,
+                isGen: node.generator || false,
+                isAsyncYield: false,
             };
         }
         /**
@@ -52,13 +65,16 @@
                 // this shouldn't ever happen, as we have to exit a function after we enter it
                 return;
             }
-            if (node.async && !scopeInfo.hasAwait && !isEmptyFunction(node)) {
+            if (node.async &&
+                !scopeInfo.hasAwait &&
+                !isEmptyFunction(node) &&
+                !(scopeInfo.isGen && scopeInfo.isAsyncYield)) {
                 context.report({
                     node,
                     loc: getFunctionHeadLoc(node, sourceCode),
                     messageId: 'missingAwait',
                     data: {
-                        name: util.upperCaseFirst(eslint_utils_1.getFunctionNameWithKind(node)),
+                        name: util.upperCaseFirst(util.getFunctionNameWithKind(node)),
                     },
                 });
             }
@@ -80,6 +96,28 @@
             }
             scopeInfo.hasAwait = true;
         }
+        /**
+         * mark `scopeInfo.isAsyncYield` to `true` if its a generator
+         * function and the delegate is `true`
+         */
+        function markAsHasDelegateGen(node) {
+            var _a;
+            if (!scopeInfo || !scopeInfo.isGen || !node.argument) {
+                return;
+            }
+            if (((_a = node === null || node === void 0 ? void 0 : node.argument) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.Literal) {
+                // making this `false` as for literals we don't need to check the definition
+                // eg : async function* run() { yield* 1 }
+                scopeInfo.isAsyncYield = false;
+            }
+            const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node === null || node === void 0 ? void 0 : node.argument);
+            const type = checker.getTypeAtLocation(tsNode);
+            const symbol = type.getSymbol();
+            // async function* test1() {yield* asyncGenerator() }
+            if ((symbol === null || symbol === void 0 ? void 0 : symbol.getName()) === 'AsyncGenerator') {
+                scopeInfo.isAsyncYield = true;
+            }
+        }
         return {
             FunctionDeclaration: enterFunction,
             FunctionExpression: enterFunction,
@@ -89,6 +127,7 @@
             'ArrowFunctionExpression:exit': exitFunction,
             AwaitExpression: markAsHasAwait,
             'ForOfStatement[await = true]': markAsHasAwait,
+            'YieldExpression[delegate = true]': markAsHasDelegateGen,
             // check body-less async arrow function.
             // ignore `async () => await foo` because it's obviously correct
             'ArrowFunctionExpression[async = true] > :not(BlockStatement, AwaitExpression)'(node) {
@@ -121,8 +160,8 @@
  */
 function getOpeningParenOfParams(node, sourceCode) {
     return util.nullThrows(node.id
-        ? sourceCode.getTokenAfter(node.id, eslint_utils_1.isOpeningParenToken)
-        : sourceCode.getFirstToken(node, eslint_utils_1.isOpeningParenToken), util.NullThrowsReasons.MissingToken('(', node.type));
+        ? sourceCode.getTokenAfter(node.id, util.isOpeningParenToken)
+        : sourceCode.getFirstToken(node, util.isOpeningParenToken), util.NullThrowsReasons.MissingToken('(', node.type));
 }
 // https://github.com/eslint/eslint/blob/03a69dbe86d5b5768a310105416ae726822e3c1c/lib/rules/utils/ast-utils.js#L1220-L1242
 /**
@@ -133,7 +172,7 @@
     let start = null;
     let end = null;
     if (node.type === experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression) {
-        const arrowToken = util.nullThrows(sourceCode.getTokenBefore(node.body, eslint_utils_1.isArrowToken), util.NullThrowsReasons.MissingToken('=>', node.type));
+        const arrowToken = util.nullThrows(sourceCode.getTokenBefore(node.body, util.isArrowToken), util.NullThrowsReasons.MissingToken('=>', node.type));
         start = arrowToken.loc.start;
         end = arrowToken.loc.end;
     }
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-await.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-await.js.map
index 5c5e6ca..bab6931 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-await.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/require-await.js.map
@@ -1 +1 @@
-{"version":3,"file":"require-await.js","sourceRoot":"","sources":["../../src/rules/require-await.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"require-await.js","sourceRoot":"","sources":["../../src/rules/require-await.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-plus-operands.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-plus-operands.js
index b00a983..aa2ba07 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-plus-operands.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-plus-operands.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -16,7 +28,7 @@
         docs: {
             description: 'When adding two variables, operands must both be of type number or of type string',
             category: 'Best Practices',
-            recommended: false,
+            recommended: 'error',
             requiresTypeChecking: true,
         },
         messages: {
@@ -48,13 +60,6 @@
          * Helper function to get base type of node
          */
         function getBaseTypeOfLiteralType(type) {
-            const constraint = type.getConstraint();
-            if (constraint &&
-                // for generic types with union constraints, it will return itself from getConstraint
-                // so we have to guard against infinite recursion...
-                constraint !== type) {
-                return getBaseTypeOfLiteralType(constraint);
-            }
             if (type.isNumberLiteral()) {
                 return 'number';
             }
@@ -83,7 +88,7 @@
          */
         function getNodeType(node) {
             const tsNode = service.esTreeNodeToTSNodeMap.get(node);
-            const type = typeChecker.getTypeAtLocation(tsNode);
+            const type = util.getConstrainedTypeAtLocation(typeChecker, tsNode);
             return getBaseTypeOfLiteralType(type);
         }
         function checkPlusOperands(node) {
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-plus-operands.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-plus-operands.js.map
index ffacf1d..df5c3ce 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-plus-operands.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-plus-operands.js.map
@@ -1 +1 @@
-{"version":3,"file":"restrict-plus-operands.js","sourceRoot":"","sources":["../../src/rules/restrict-plus-operands.ts"],"names":[],"mappings":";;;;;;;;;AACA,+CAAiC;AACjC,8CAAgC;AAShC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,mFAAmF;YACrF,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,KAAK;YAClB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,UAAU,EACR,wEAAwE;YAC1E,UAAU,EACR,2GAA2G;YAC7G,UAAU,EAAE,iDAAiD;SAC9D;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE;oBACV,wBAAwB,EAAE;wBACxB,IAAI,EAAE,SAAS;qBAChB;iBACF;aACF;SACF;KACF;IACD,cAAc,EAAE;QACd;YACE,wBAAwB,EAAE,KAAK;SAChC;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,wBAAwB,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAIrD;;WAEG;QACH,SAAS,wBAAwB,CAAC,IAAa;YAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,IACE,UAAU;gBACV,qFAAqF;gBACrF,oDAAoD;gBACpD,UAAU,KAAK,IAAI,EACnB;gBACA,OAAO,wBAAwB,CAAC,UAAU,CAAC,CAAC;aAC7C;YAED,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;gBAC1B,OAAO,QAAQ,CAAC;aACjB;YACD,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;gBAC1B,OAAO,QAAQ,CAAC;aACjB;YACD,mBAAmB;YACnB,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE;gBAC3C,OAAO,QAAQ,CAAC;aACjB;YACD,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;gBAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBAEvD,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;aACxE;YAED,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAElD,IACE,UAAU,KAAK,QAAQ;gBACvB,UAAU,KAAK,QAAQ;gBACvB,UAAU,KAAK,QAAQ,EACvB;gBACA,OAAO,UAAU,CAAC;aACnB;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED;;;WAGG;QACH,SAAS,WAAW,CAAC,IAAyB;YAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAEnD,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAED,SAAS,iBAAiB,CACxB,IAA+D;YAE/D,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE1C,IACE,QAAQ,KAAK,SAAS;gBACtB,SAAS,KAAK,SAAS;gBACvB,QAAQ,KAAK,SAAS,EACtB;gBACA,IAAI,QAAQ,KAAK,QAAQ,IAAI,SAAS,KAAK,QAAQ,EAAE;oBACnD,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,YAAY;qBACxB,CAAC,CAAC;iBACJ;qBAAM,IAAI,QAAQ,KAAK,QAAQ,IAAI,SAAS,KAAK,QAAQ,EAAE;oBAC1D,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,YAAY;qBACxB,CAAC,CAAC;iBACJ;qBAAM;oBACL,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,YAAY;qBACxB,CAAC,CAAC;iBACJ;aACF;QACH,CAAC;QAED,OAAO;YACL,gCAAgC,EAAE,iBAAiB;YACnD,qCAAqC,CAAC,IAAI;gBACxC,IAAI,wBAAwB,EAAE;oBAC5B,iBAAiB,CAAC,IAAI,CAAC,CAAC;iBACzB;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"restrict-plus-operands.js","sourceRoot":"","sources":["../../src/rules/restrict-plus-operands.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-template-expressions.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-template-expressions.js
index b0bb7b9..e72f791 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-template-expressions.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-template-expressions.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -17,40 +29,52 @@
         docs: {
             description: 'Enforce template literal expressions to be of string type',
             category: 'Best Practices',
-            recommended: false,
+            recommended: 'error',
             requiresTypeChecking: true,
         },
         messages: {
-            invalidType: 'Invalid type of template literal expression.',
+            invalidType: 'Invalid type "{{type}}" of template literal expression.',
         },
         schema: [
             {
                 type: 'object',
                 properties: {
-                    allowBoolean: { type: 'boolean' },
-                    allowNullable: { type: 'boolean' },
                     allowNumber: { type: 'boolean' },
+                    allowBoolean: { type: 'boolean' },
+                    allowAny: { type: 'boolean' },
+                    allowNullish: { type: 'boolean' },
                 },
             },
         ],
     },
-    defaultOptions: [{}],
+    defaultOptions: [
+        {
+            allowNumber: true,
+        },
+    ],
     create(context, [options]) {
         const service = util.getParserServices(context);
         const typeChecker = service.program.getTypeChecker();
-        const allowedTypes = [
-            'string',
-            ...(options.allowNumber ? ['number', 'bigint'] : []),
-            ...(options.allowBoolean ? ['boolean'] : []),
-            ...(options.allowNullable ? ['null', 'undefined'] : []),
-        ];
-        function isAllowedType(types) {
-            for (const type of types) {
-                if (!allowedTypes.includes(type)) {
-                    return false;
-                }
+        function isUnderlyingTypePrimitive(type) {
+            if (util.isTypeFlagSet(type, ts.TypeFlags.StringLike)) {
+                return true;
             }
-            return true;
+            if (options.allowNumber &&
+                util.isTypeFlagSet(type, ts.TypeFlags.NumberLike | ts.TypeFlags.BigIntLike)) {
+                return true;
+            }
+            if (options.allowBoolean &&
+                util.isTypeFlagSet(type, ts.TypeFlags.BooleanLike)) {
+                return true;
+            }
+            if (options.allowAny && util.isTypeAnyType(type)) {
+                return true;
+            }
+            if (options.allowNullish &&
+                util.isTypeFlagSet(type, ts.TypeFlags.Null | ts.TypeFlags.Undefined)) {
+                return true;
+            }
+            return false;
         }
         return {
             TemplateLiteral(node) {
@@ -58,64 +82,29 @@
                 if (node.parent.type === experimental_utils_1.AST_NODE_TYPES.TaggedTemplateExpression) {
                     return;
                 }
-                for (const expr of node.expressions) {
-                    const type = getNodeType(expr);
-                    if (!isAllowedType(type)) {
+                for (const expression of node.expressions) {
+                    const expressionType = util.getConstrainedTypeAtLocation(typeChecker, service.esTreeNodeToTSNodeMap.get(expression));
+                    if (!isInnerUnionOrIntersectionConformingTo(expressionType, isUnderlyingTypePrimitive)) {
                         context.report({
-                            node: expr,
+                            node: expression,
                             messageId: 'invalidType',
+                            data: { type: typeChecker.typeToString(expressionType) },
                         });
                     }
                 }
             },
         };
-        /**
-         * Helper function to get base type of node
-         * @param node the node to be evaluated.
-         */
-        function getNodeType(node) {
-            const tsNode = service.esTreeNodeToTSNodeMap.get(node);
-            const type = typeChecker.getTypeAtLocation(tsNode);
-            return getBaseType(type);
-        }
-        function getBaseType(type) {
-            const constraint = type.getConstraint();
-            if (constraint &&
-                // for generic types with union constraints, it will return itself
-                constraint !== type) {
-                return getBaseType(constraint);
+        function isInnerUnionOrIntersectionConformingTo(type, predicate) {
+            return rec(type);
+            function rec(innerType) {
+                if (innerType.isUnion()) {
+                    return innerType.types.every(rec);
+                }
+                if (innerType.isIntersection()) {
+                    return innerType.types.some(rec);
+                }
+                return predicate(innerType);
             }
-            if (type.isStringLiteral()) {
-                return ['string'];
-            }
-            if (type.isNumberLiteral()) {
-                return ['number'];
-            }
-            if (type.flags & ts.TypeFlags.BigIntLiteral) {
-                return ['bigint'];
-            }
-            if (type.flags & ts.TypeFlags.BooleanLiteral) {
-                return ['boolean'];
-            }
-            if (type.flags & ts.TypeFlags.Null) {
-                return ['null'];
-            }
-            if (type.flags & ts.TypeFlags.Undefined) {
-                return ['undefined'];
-            }
-            if (type.isUnion()) {
-                return type.types
-                    .map(getBaseType)
-                    .reduce((all, array) => [...all, ...array], []);
-            }
-            const stringType = typeChecker.typeToString(type);
-            if (stringType === 'string' ||
-                stringType === 'number' ||
-                stringType === 'bigint' ||
-                stringType === 'boolean') {
-                return [stringType];
-            }
-            return ['other'];
         }
     },
 });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-template-expressions.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-template-expressions.js.map
index be2c177..2e51705 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-template-expressions.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/restrict-template-expressions.js.map
@@ -1 +1 @@
-{"version":3,"file":"restrict-template-expressions.js","sourceRoot":"","sources":["../../src/rules/restrict-template-expressions.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"restrict-template-expressions.js","sourceRoot":"","sources":["../../src/rules/restrict-template-expressions.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/return-await.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/return-await.js
index 193ecab..910c332 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/return-await.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/return-await.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -24,9 +36,9 @@
         fixable: 'code',
         type: 'problem',
         messages: {
-            nonPromiseAwait: 'returning an awaited value that is not a promise is not allowed',
-            disallowedPromiseAwait: 'returning an awaited promise is not allowed in this context',
-            requiredPromiseAwait: 'returning an awaited promise is required in this context',
+            nonPromiseAwait: 'Returning an awaited value that is not a promise is not allowed.',
+            disallowedPromiseAwait: 'Returning an awaited promise is not allowed in this context.',
+            requiredPromiseAwait: 'Returning an awaited promise is required in this context.',
         },
         schema: [
             {
@@ -39,27 +51,61 @@
         const parserServices = util.getParserServices(context);
         const checker = parserServices.program.getTypeChecker();
         const sourceCode = context.getSourceCode();
-        function inTryCatch(node) {
+        let scopeInfo = null;
+        function enterFunction(node) {
+            scopeInfo = {
+                hasAsync: node.async,
+            };
+        }
+        function inTry(node) {
             let ancestor = node.parent;
             while (ancestor && !ts.isFunctionLike(ancestor)) {
-                if (tsutils.isTryStatement(ancestor) ||
-                    tsutils.isCatchClause(ancestor)) {
+                if (tsutils.isTryStatement(ancestor)) {
                     return true;
                 }
                 ancestor = ancestor.parent;
             }
             return false;
         }
+        function inCatch(node) {
+            let ancestor = node.parent;
+            while (ancestor && !ts.isFunctionLike(ancestor)) {
+                if (tsutils.isCatchClause(ancestor)) {
+                    return true;
+                }
+                ancestor = ancestor.parent;
+            }
+            return false;
+        }
+        function isReturnPromiseInFinally(node) {
+            let ancestor = node.parent;
+            while (ancestor && !ts.isFunctionLike(ancestor)) {
+                if (tsutils.isTryStatement(ancestor.parent) &&
+                    tsutils.isBlock(ancestor) &&
+                    ancestor.parent.end === ancestor.end) {
+                    return true;
+                }
+                ancestor = ancestor.parent;
+            }
+            return false;
+        }
+        function hasFinallyBlock(node) {
+            let ancestor = node.parent;
+            while (ancestor && !ts.isFunctionLike(ancestor)) {
+                if (tsutils.isTryStatement(ancestor)) {
+                    return !!ancestor.finallyBlock;
+                }
+                ancestor = ancestor.parent;
+            }
+            return false;
+        }
         // function findTokensToRemove()
         function removeAwait(fixer, node) {
-            const awaitNode = node.type === experimental_utils_1.AST_NODE_TYPES.ReturnStatement
-                ? node.argument
-                : node.body;
             // Should always be an await node; but let's be safe.
-            /* istanbul ignore if */ if (!util.isAwaitExpression(awaitNode)) {
+            /* istanbul ignore if */ if (!util.isAwaitExpression(node)) {
                 return null;
             }
-            const awaitToken = sourceCode.getFirstToken(awaitNode, util.isAwaitKeyword);
+            const awaitToken = sourceCode.getFirstToken(node, util.isAwaitKeyword);
             // Should always be the case; but let's be safe.
             /* istanbul ignore if */ if (!awaitToken) {
                 return null;
@@ -76,14 +122,7 @@
             return fixer.removeRange([startAt, endAt]);
         }
         function insertAwait(fixer, node) {
-            const targetNode = node.type === experimental_utils_1.AST_NODE_TYPES.ReturnStatement
-                ? node.argument
-                : node.body;
-            // There should always be a target node; but let's be safe.
-            /* istanbul ignore if */ if (!targetNode) {
-                return null;
-            }
-            return fixer.insertTextBefore(targetNode, 'await ');
+            return fixer.insertTextBefore(node, 'await ');
         }
         function test(node, expression) {
             let child;
@@ -128,7 +167,7 @@
                 return;
             }
             if (option === 'in-try-catch') {
-                const isInTryCatch = inTryCatch(expression);
+                const isInTryCatch = inTry(expression) || inCatch(expression);
                 if (isAwait && !isInTryCatch) {
                     context.report({
                         messageId: 'disallowedPromiseAwait',
@@ -137,6 +176,12 @@
                     });
                 }
                 else if (!isAwait && isInTryCatch) {
+                    if (inCatch(expression) && !hasFinallyBlock(expression)) {
+                        return;
+                    }
+                    if (isReturnPromiseInFinally(expression)) {
+                        return;
+                    }
                     context.report({
                         messageId: 'requiredPromiseAwait',
                         node,
@@ -146,20 +191,35 @@
                 return;
             }
         }
+        function findPossiblyReturnedNodes(node) {
+            if (node.type === experimental_utils_1.AST_NODE_TYPES.ConditionalExpression) {
+                return [
+                    ...findPossiblyReturnedNodes(node.alternate),
+                    ...findPossiblyReturnedNodes(node.consequent),
+                ];
+            }
+            return [node];
+        }
         return {
+            FunctionDeclaration: enterFunction,
+            FunctionExpression: enterFunction,
+            ArrowFunctionExpression: enterFunction,
             'ArrowFunctionExpression[async = true]:exit'(node) {
                 if (node.body.type !== experimental_utils_1.AST_NODE_TYPES.BlockStatement) {
-                    const expression = parserServices.esTreeNodeToTSNodeMap.get(node.body);
-                    test(node, expression);
+                    findPossiblyReturnedNodes(node.body).forEach(node => {
+                        const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);
+                        test(node, tsNode);
+                    });
                 }
             },
             ReturnStatement(node) {
-                const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
-                const { expression } = originalNode;
-                if (!expression) {
+                if (!scopeInfo || !scopeInfo.hasAsync || !node.argument) {
                     return;
                 }
-                test(node, expression);
+                findPossiblyReturnedNodes(node.argument).forEach(node => {
+                    const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node);
+                    test(node, tsNode);
+                });
             },
         };
     },
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/return-await.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/return-await.js.map
index e765cc7..3806c18 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/return-await.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/return-await.js.map
@@ -1 +1 @@
-{"version":3,"file":"return-await.js","sourceRoot":"","sources":["../../src/rules/return-await.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"return-await.js","sourceRoot":"","sources":["../../src/rules/return-await.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/semi.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/semi.js
index 9a3cf0e..7e2ccde 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/semi.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/semi.js
@@ -1,14 +1,27 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+var _a;
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const semi_1 = __importDefault(require("eslint/lib/rules/semi"));
@@ -26,7 +39,10 @@
         },
         fixable: 'code',
         schema: semi_1.default.meta.schema,
-        messages: semi_1.default.meta.messages,
+        messages: (_a = semi_1.default.meta.messages) !== null && _a !== void 0 ? _a : {
+            missingSemi: 'Missing semicolon.',
+            extraSemi: 'Extra semicolon.',
+        },
     },
     defaultOptions: [
         'always',
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/semi.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/semi.js.map
index 5295d55..5c2e0f7 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/semi.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/semi.js.map
@@ -1 +1 @@
-{"version":3,"file":"semi.js","sourceRoot":"","sources":["../../src/rules/semi.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8EAI+C;AAC/C,iEAA6C;AAC7C,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE;YACJ,WAAW,EAAE,+CAA+C;YAC5D,QAAQ,EAAE,kBAAkB;YAC5B,oCAAoC;YACpC,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,cAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,EAAE,cAAQ,CAAC,IAAI,CAAC,QAAQ;KACjC;IACD,cAAc,EAAE;QACd,QAAQ;QACR;YACE,sBAAsB,EAAE,KAAK;YAC7B,gCAAgC,EAAE,KAAK;SACxC;KACF;IACD,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,cAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,iBAAiB,GAAG,KAAK,CAAC,mBAE/B,CAAC;QAEF;;;;;;;UAOE;QACF,MAAM,YAAY,GAAG;YACnB,mCAAc,CAAC,aAAa;YAC5B,mCAAc,CAAC,uBAAuB;YACtC,mCAAc,CAAC,0BAA0B;YACzC,mCAAc,CAAC,iBAAiB;YAChC,mCAAc,CAAC,kBAAkB;YACjC,mCAAc,CAAC,yBAAyB;YACxC,mCAAc,CAAC,sBAAsB;SACtC,CAAC,MAAM,CAAwB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAC5C,GAAG,CAAC,IAAc,CAAC,GAAG,iBAAiB,CAAC;YACxC,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,qDACK,KAAK,GACL,YAAY,KACf,wBAAwB,CAAC,IAAI;gBAC3B,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,mCAAc,CAAC,sBAAsB,EAAE;oBACnE,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;iBACtC;YACH,CAAC,IACD;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"semi.js","sourceRoot":"","sources":["../../src/rules/semi.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8EAI+C;AAC/C,iEAA6C;AAC7C,8CAAgC;AAKhC,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE;YACJ,WAAW,EAAE,+CAA+C;YAC5D,QAAQ,EAAE,kBAAkB;YAC5B,oCAAoC;YACpC,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;SACtB;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,cAAQ,CAAC,IAAI,CAAC,MAAM;QAC5B,QAAQ,QAAE,cAAQ,CAAC,IAAI,CAAC,QAAQ,mCAAI;YAClC,WAAW,EAAE,oBAAoB;YACjC,SAAS,EAAE,kBAAkB;SAC9B;KACF;IACD,cAAc,EAAE;QACd,QAAQ;QACR;YACE,sBAAsB,EAAE,KAAK;YAC7B,gCAAgC,EAAE,KAAK;SACxC;KACF;IACD,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,cAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,iBAAiB,GAAG,KAAK,CAAC,mBAE/B,CAAC;QAEF;;;;;;;UAOE;QACF,MAAM,YAAY,GAAG;YACnB,mCAAc,CAAC,aAAa;YAC5B,mCAAc,CAAC,uBAAuB;YACtC,mCAAc,CAAC,0BAA0B;YACzC,mCAAc,CAAC,iBAAiB;YAChC,mCAAc,CAAC,kBAAkB;YACjC,mCAAc,CAAC,yBAAyB;YACxC,mCAAc,CAAC,sBAAsB;SACtC,CAAC,MAAM,CAAwB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAC5C,GAAG,CAAC,IAAc,CAAC,GAAG,iBAAiB,CAAC;YACxC,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,qDACK,KAAK,GACL,YAAY,KACf,wBAAwB,CAAC,IAAI;gBAC3B,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,mCAAc,CAAC,sBAAsB,EAAE;oBACnE,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;iBACtC;YACH,CAAC,IACD;IACJ,CAAC;CACF,CAAC,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/space-before-function-paren.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/space-before-function-paren.js
index ae95604..3d97723 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/space-before-function-paren.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/space-before-function-paren.js
@@ -1,14 +1,25 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const eslint_utils_1 = require("eslint-utils");
 const util = __importStar(require("../util"));
 exports.default = util.createRule({
     name: 'space-before-function-paren',
@@ -61,11 +72,12 @@
          * @returns {boolean} Whether the function has a name.
          */
         function isNamedFunction(node) {
-            if (node.id) {
+            if (node.id != null) {
                 return true;
             }
             const parent = node.parent;
             return (parent.type === experimental_utils_1.AST_NODE_TYPES.MethodDefinition ||
+                parent.type === experimental_utils_1.AST_NODE_TYPES.TSAbstractMethodDefinition ||
                 (parent.type === experimental_utils_1.AST_NODE_TYPES.Property &&
                     (parent.kind === 'get' || parent.kind === 'set' || parent.method)));
         }
@@ -79,16 +91,16 @@
             if (node.type === experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression) {
                 // Always ignore non-async functions and arrow functions without parens, e.g. async foo => bar
                 if (node.async &&
-                    eslint_utils_1.isOpeningParenToken(sourceCode.getFirstToken(node, { skip: 1 }))) {
-                    return _a = overrideConfig.asyncArrow, (_a !== null && _a !== void 0 ? _a : baseConfig);
+                    util.isOpeningParenToken(sourceCode.getFirstToken(node, { skip: 1 }))) {
+                    return (_a = overrideConfig.asyncArrow) !== null && _a !== void 0 ? _a : baseConfig;
                 }
             }
             else if (isNamedFunction(node)) {
-                return _b = overrideConfig.named, (_b !== null && _b !== void 0 ? _b : baseConfig);
+                return (_b = overrideConfig.named) !== null && _b !== void 0 ? _b : baseConfig;
                 // `generator-star-spacing` should warn anonymous generators. E.g. `function* () {}`
             }
             else if (!node.generator) {
-                return _c = overrideConfig.anonymous, (_c !== null && _c !== void 0 ? _c : baseConfig);
+                return (_c = overrideConfig.anonymous) !== null && _c !== void 0 ? _c : baseConfig;
             }
             return 'ignore';
         }
@@ -108,14 +120,17 @@
                 rightToken = sourceCode.getTokenAfter(leftToken);
             }
             else {
-                rightToken = sourceCode.getFirstToken(node, eslint_utils_1.isOpeningParenToken);
+                rightToken = sourceCode.getFirstToken(node, util.isOpeningParenToken);
                 leftToken = sourceCode.getTokenBefore(rightToken);
             }
             const hasSpacing = sourceCode.isSpaceBetweenTokens(leftToken, rightToken);
             if (hasSpacing && functionConfig === 'never') {
                 context.report({
                     node,
-                    loc: leftToken.loc.end,
+                    loc: {
+                        start: leftToken.loc.end,
+                        end: rightToken.loc.start,
+                    },
                     messageId: 'unexpected',
                     fix: fixer => fixer.removeRange([leftToken.range[1], rightToken.range[0]]),
                 });
@@ -125,7 +140,7 @@
                 (!node.typeParameters || node.id)) {
                 context.report({
                     node,
-                    loc: leftToken.loc.end,
+                    loc: rightToken.loc,
                     messageId: 'missing',
                     fix: fixer => fixer.insertTextAfter(leftToken, ' '),
                 });
@@ -135,6 +150,8 @@
             ArrowFunctionExpression: checkFunction,
             FunctionDeclaration: checkFunction,
             FunctionExpression: checkFunction,
+            TSEmptyBodyFunctionExpression: checkFunction,
+            TSDeclareFunction: checkFunction,
         };
     },
 });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/space-before-function-paren.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/space-before-function-paren.js.map
index 91b155a..4f69e19 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/space-before-function-paren.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/space-before-function-paren.js.map
@@ -1 +1 @@
-{"version":3,"file":"space-before-function-paren.js","sourceRoot":"","sources":["../../src/rules/space-before-function-paren.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"space-before-function-paren.js","sourceRoot":"","sources":["../../src/rules/space-before-function-paren.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/strict-boolean-expressions.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/strict-boolean-expressions.js
index b18ba77..3f2454c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/strict-boolean-expressions.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/strict-boolean-expressions.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -25,13 +37,14 @@
             {
                 type: 'object',
                 properties: {
-                    ignoreRhs: {
-                        type: 'boolean',
-                    },
-                    allowNullable: {
-                        type: 'boolean',
-                    },
-                    allowSafe: {
+                    allowString: { type: 'boolean' },
+                    allowNumber: { type: 'boolean' },
+                    allowNullableObject: { type: 'boolean' },
+                    allowNullableBoolean: { type: 'boolean' },
+                    allowNullableString: { type: 'boolean' },
+                    allowNullableNumber: { type: 'boolean' },
+                    allowAny: { type: 'boolean' },
+                    allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing: {
                         type: 'boolean',
                     },
                 },
@@ -59,18 +72,36 @@
                 'The condition is always true.',
             conditionErrorNullableObject: 'Unexpected nullable object value in conditional. ' +
                 'An explicit null check is required.',
+            noStrictNullCheck: 'This rule requires the `strictNullChecks` compiler option to be turned on to function correctly.',
         },
     },
     defaultOptions: [
         {
-            ignoreRhs: false,
-            allowNullable: false,
-            allowSafe: false,
+            allowString: true,
+            allowNumber: true,
+            allowNullableObject: true,
+            allowNullableBoolean: false,
+            allowNullableString: false,
+            allowNullableNumber: false,
+            allowAny: false,
+            allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing: false,
         },
     ],
     create(context, [options]) {
         const service = util.getParserServices(context);
         const checker = service.program.getTypeChecker();
+        const compilerOptions = service.program.getCompilerOptions();
+        const isStrictNullChecks = tsutils.isStrictCompilerOptionEnabled(compilerOptions, 'strictNullChecks');
+        if (!isStrictNullChecks &&
+            options.allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing !== true) {
+            context.report({
+                loc: {
+                    start: { line: 0, column: 0 },
+                    end: { line: 0, column: 0 },
+                },
+                messageId: 'noStrictNullCheck',
+            });
+        }
         const checkedNodes = new Set();
         return {
             ConditionalExpression: checkTestExpression,
@@ -91,125 +122,106 @@
             checkNode(node.argument, true);
         }
         /**
-         * This function analyzes the type of a boolean expression node and checks if it is allowed.
-         * It can recurse when checking nested logical operators, so that only the outermost expressions are reported.
+         * This function analyzes the type of a node and checks if it is allowed in a boolean context.
+         * It can recurse when checking nested logical operators, so that only the outermost operands are reported.
+         * The right operand of a logical expression is ignored unless it's a part of a test expression (if/while/ternary/etc).
          * @param node The AST node to check.
-         * @param isRoot Whether it is the root of a logical expression and there was no recursion yet.
-         * @returns `true` if there was an error reported.
+         * @param isTestExpr Whether the node is a descendant of a test expression.
          */
-        function checkNode(node, isRoot = false) {
+        function checkNode(node, isTestExpr = false) {
             // prevent checking the same node multiple times
             if (checkedNodes.has(node)) {
-                return false;
+                return;
             }
             checkedNodes.add(node);
-            // for logical operator, we also check its operands
+            // for logical operator, we check its operands
             if (node.type === experimental_utils_1.AST_NODE_TYPES.LogicalExpression &&
                 node.operator !== '??') {
-                let hasError = false;
-                if (checkNode(node.left)) {
-                    hasError = true;
+                checkNode(node.left, isTestExpr);
+                // we ignore the right operand when not in a context of a test expression
+                if (isTestExpr) {
+                    checkNode(node.right, isTestExpr);
                 }
-                if (!options.ignoreRhs) {
-                    if (checkNode(node.right)) {
-                        hasError = true;
-                    }
-                }
-                // if this logical operator is not the root of a logical expression
-                // we only check its operands and return
-                if (!isRoot) {
-                    return hasError;
-                }
-                // if this is the root of a logical expression
-                // we want to check its resulting type too
-                else {
-                    // ...unless there already was an error, we exit so we don't double-report
-                    if (hasError) {
-                        return true;
-                    }
-                }
+                return;
             }
             const tsNode = service.esTreeNodeToTSNodeMap.get(node);
             const type = util.getConstrainedTypeAtLocation(checker, tsNode);
-            let messageId;
             const types = inspectVariantTypes(tsutils.unionTypeParts(type));
             const is = (...wantedTypes) => types.size === wantedTypes.length &&
                 wantedTypes.every(type => types.has(type));
             // boolean
             if (is('boolean')) {
                 // boolean is always okay
-                return false;
+                return;
             }
             // never
             if (is('never')) {
                 // never is always okay
-                return false;
+                return;
             }
             // nullish
-            else if (is('nullish')) {
+            if (is('nullish')) {
                 // condition is always false
-                messageId = 'conditionErrorNullish';
+                context.report({ node, messageId: 'conditionErrorNullish' });
+                return;
             }
             // nullable boolean
-            else if (is('nullish', 'boolean')) {
-                if (!options.allowNullable) {
-                    messageId = 'conditionErrorNullableBoolean';
+            if (is('nullish', 'boolean')) {
+                if (!options.allowNullableBoolean) {
+                    context.report({ node, messageId: 'conditionErrorNullableBoolean' });
                 }
+                return;
             }
             // string
-            else if (is('string')) {
-                messageId = 'conditionErrorString';
+            if (is('string')) {
+                if (!options.allowString) {
+                    context.report({ node, messageId: 'conditionErrorString' });
+                }
+                return;
             }
             // nullable string
-            else if (is('nullish', 'string')) {
-                messageId = 'conditionErrorNullableString';
+            if (is('nullish', 'string')) {
+                if (!options.allowNullableString) {
+                    context.report({ node, messageId: 'conditionErrorNullableString' });
+                }
+                return;
             }
             // number
-            else if (is('number')) {
-                messageId = 'conditionErrorNumber';
+            if (is('number')) {
+                if (!options.allowNumber) {
+                    context.report({ node, messageId: 'conditionErrorNumber' });
+                }
+                return;
             }
             // nullable number
-            else if (is('nullish', 'number')) {
-                messageId = 'conditionErrorNullableNumber';
+            if (is('nullish', 'number')) {
+                if (!options.allowNullableNumber) {
+                    context.report({ node, messageId: 'conditionErrorNullableNumber' });
+                }
+                return;
             }
             // object
-            else if (is('object')) {
+            if (is('object')) {
                 // condition is always true
-                if (!options.allowSafe) {
-                    messageId = 'conditionErrorObject';
-                }
+                context.report({ node, messageId: 'conditionErrorObject' });
+                return;
             }
             // nullable object
-            else if (is('nullish', 'object')) {
-                if (!options.allowSafe || !options.allowNullable) {
-                    messageId = 'conditionErrorNullableObject';
+            if (is('nullish', 'object')) {
+                if (!options.allowNullableObject) {
+                    context.report({ node, messageId: 'conditionErrorNullableObject' });
                 }
-            }
-            // boolean/object
-            else if (is('boolean', 'object')) {
-                if (!options.allowSafe) {
-                    messageId = 'conditionErrorOther';
-                }
-            }
-            // nullable boolean/object
-            else if (is('nullish', 'boolean', 'object')) {
-                if (!options.allowSafe || !options.allowNullable) {
-                    messageId = 'conditionErrorOther';
-                }
+                return;
             }
             // any
-            else if (is('any')) {
-                messageId = 'conditionErrorAny';
+            if (is('any')) {
+                if (!options.allowAny) {
+                    context.report({ node, messageId: 'conditionErrorAny' });
+                }
+                return;
             }
             // other
-            else {
-                messageId = 'conditionErrorOther';
-            }
-            if (messageId != null) {
-                context.report({ node, messageId });
-                return true;
-            }
-            return false;
+            context.report({ node, messageId: 'conditionErrorOther' });
         }
         /**
          * Check union variants for the types we care about
@@ -225,7 +237,7 @@
             if (types.some(type => tsutils.isTypeFlagSet(type, ts.TypeFlags.StringLike))) {
                 variantTypes.add('string');
             }
-            if (types.some(type => tsutils.isTypeFlagSet(type, ts.TypeFlags.NumberLike))) {
+            if (types.some(type => tsutils.isTypeFlagSet(type, ts.TypeFlags.NumberLike | ts.TypeFlags.BigIntLike))) {
                 variantTypes.add('number');
             }
             if (types.some(type => !tsutils.isTypeFlagSet(type, ts.TypeFlags.Null |
@@ -234,12 +246,13 @@
                 ts.TypeFlags.BooleanLike |
                 ts.TypeFlags.StringLike |
                 ts.TypeFlags.NumberLike |
+                ts.TypeFlags.BigIntLike |
                 ts.TypeFlags.Any |
                 ts.TypeFlags.Unknown |
                 ts.TypeFlags.Never))) {
                 variantTypes.add('object');
             }
-            if (types.some(type => tsutils.isTypeFlagSet(type, ts.TypeFlags.Any | ts.TypeFlags.Unknown))) {
+            if (types.some(type => util.isTypeAnyType(type) || util.isTypeUnknownType(type))) {
                 variantTypes.add('any');
             }
             if (types.some(type => tsutils.isTypeFlagSet(type, ts.TypeFlags.Never))) {
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/strict-boolean-expressions.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/strict-boolean-expressions.js.map
index e07cb44..0c4d8df 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/strict-boolean-expressions.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/strict-boolean-expressions.js.map
@@ -1 +1 @@
-{"version":3,"file":"strict-boolean-expressions.js","sourceRoot":"","sources":["../../src/rules/strict-boolean-expressions.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"strict-boolean-expressions.js","sourceRoot":"","sources":["../../src/rules/strict-boolean-expressions.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/switch-exhaustiveness-check.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/switch-exhaustiveness-check.js
index 3d927b4..92ea5fa 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/switch-exhaustiveness-check.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/switch-exhaustiveness-check.js
@@ -1,16 +1,27 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 const ts = __importStar(require("typescript"));
 const util_1 = require("../util");
 const tsutils_1 = require("tsutils");
-const eslint_utils_1 = require("eslint-utils");
 exports.default = util_1.createRule({
     name: 'switch-exhaustiveness-check',
     meta: {
@@ -19,12 +30,13 @@
             description: 'Exhaustiveness checking in switch with union type',
             category: 'Best Practices',
             recommended: false,
+            suggestion: true,
             requiresTypeChecking: true,
         },
         schema: [],
         messages: {
             switchIsNotExhaustive: 'Switch is not exhaustive. Cases not matched: {{missingBranches}}',
-            addMissingCases: 'Add branches for missing cases',
+            addMissingCases: 'Add branches for missing cases.',
         },
     },
     defaultOptions: [],
@@ -32,11 +44,27 @@
         const sourceCode = context.getSourceCode();
         const service = util_1.getParserServices(context);
         const checker = service.program.getTypeChecker();
+        const compilerOptions = service.program.getCompilerOptions();
+        function requiresQuoting(name) {
+            if (name.length === 0) {
+                return true;
+            }
+            if (!ts.isIdentifierStart(name.charCodeAt(0), compilerOptions.target)) {
+                return true;
+            }
+            for (let i = 1; i < name.length; i += 1) {
+                if (!ts.isIdentifierPart(name.charCodeAt(i), compilerOptions.target)) {
+                    return true;
+                }
+            }
+            return false;
+        }
         function getNodeType(node) {
             const tsNode = service.esTreeNodeToTSNodeMap.get(node);
             return util_1.getConstrainedTypeAtLocation(checker, tsNode);
         }
-        function fixSwitch(fixer, node, missingBranchTypes) {
+        function fixSwitch(fixer, node, missingBranchTypes, symbolName) {
+            var _a;
             const lastCase = node.cases.length > 0 ? node.cases[node.cases.length - 1] : null;
             const caseIndent = lastCase
                 ? ' '.repeat(lastCase.loc.start.column)
@@ -58,7 +86,13 @@
                 if (missingBranchType.isIntersection()) {
                     continue;
                 }
-                const caseTest = checker.typeToString(missingBranchType);
+                const missingBranchName = (_a = missingBranchType.getSymbol()) === null || _a === void 0 ? void 0 : _a.escapedName;
+                let caseTest = checker.typeToString(missingBranchType);
+                if (symbolName &&
+                    (missingBranchName || missingBranchName === '') &&
+                    requiresQuoting(missingBranchName.toString())) {
+                    caseTest = `${symbolName}['${missingBranchName}']`;
+                }
                 const errorMessage = `Not implemented yet: ${caseTest} case`;
                 missingCases.push(`case ${caseTest}: { throw new Error('${errorMessage}') }`);
             }
@@ -69,12 +103,14 @@
                 return fixer.insertTextAfter(lastCase, `\n${fixString}`);
             }
             // there were no existing cases
-            const openingBrace = sourceCode.getTokenAfter(node.discriminant, eslint_utils_1.isOpeningBraceToken);
-            const closingBrace = sourceCode.getTokenAfter(node.discriminant, eslint_utils_1.isClosingBraceToken);
+            const openingBrace = sourceCode.getTokenAfter(node.discriminant, util_1.isOpeningBraceToken);
+            const closingBrace = sourceCode.getTokenAfter(node.discriminant, util_1.isClosingBraceToken);
             return fixer.replaceTextRange([openingBrace.range[0], closingBrace.range[1]], ['{', fixString, `${caseIndent}}`].join('\n'));
         }
         function checkSwitchExhaustive(node) {
+            var _a;
             const discriminantType = getNodeType(node.discriminant);
+            const symbolName = (_a = discriminantType.getSymbol()) === null || _a === void 0 ? void 0 : _a.escapedName;
             if (discriminantType.isUnion()) {
                 const unionTypes = tsutils_1.unionTypeParts(discriminantType);
                 const caseTypes = new Set();
@@ -95,16 +131,19 @@
                     messageId: 'switchIsNotExhaustive',
                     data: {
                         missingBranches: missingBranchTypes
-                            .map(missingType => tsutils_1.isTypeFlagSet(missingType, ts.TypeFlags.ESSymbolLike)
-                            ? `typeof ${missingType.symbol.escapedName}`
-                            : checker.typeToString(missingType))
+                            .map(missingType => {
+                            var _a;
+                            return tsutils_1.isTypeFlagSet(missingType, ts.TypeFlags.ESSymbolLike)
+                                ? `typeof ${(_a = missingType.getSymbol()) === null || _a === void 0 ? void 0 : _a.escapedName}`
+                                : checker.typeToString(missingType);
+                        })
                             .join(' | '),
                     },
                     suggest: [
                         {
                             messageId: 'addMissingCases',
                             fix(fixer) {
-                                return fixSwitch(fixer, node, missingBranchTypes);
+                                return fixSwitch(fixer, node, missingBranchTypes, symbolName === null || symbolName === void 0 ? void 0 : symbolName.toString());
                             },
                         },
                     ],
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/switch-exhaustiveness-check.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/switch-exhaustiveness-check.js.map
index 0943b0f..0a8b9da 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/switch-exhaustiveness-check.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/switch-exhaustiveness-check.js.map
@@ -1 +1 @@
-{"version":3,"file":"switch-exhaustiveness-check.js","sourceRoot":"","sources":["../../src/rules/switch-exhaustiveness-check.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"switch-exhaustiveness-check.js","sourceRoot":"","sources":["../../src/rules/switch-exhaustiveness-check.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/triple-slash-reference.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/triple-slash-reference.js
index 45792ac..943df2e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/triple-slash-reference.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/triple-slash-reference.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/triple-slash-reference.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/triple-slash-reference.js.map
index 08e29db..3efae8a 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/triple-slash-reference.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/triple-slash-reference.js.map
@@ -1 +1 @@
-{"version":3,"file":"triple-slash-reference.js","sourceRoot":"","sources":["../../src/rules/triple-slash-reference.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"triple-slash-reference.js","sourceRoot":"","sources":["../../src/rules/triple-slash-reference.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/type-annotation-spacing.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/type-annotation-spacing.js
index fda4292..fc017d7 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/type-annotation-spacing.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/type-annotation-spacing.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -18,23 +30,22 @@
     additionalProperties: false,
 };
 function createRules(options) {
-    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
-    const globals = Object.assign(Object.assign({}, (((_a = options) === null || _a === void 0 ? void 0 : _a.before) !== undefined ? { before: options.before } : {})), (((_b = options) === null || _b === void 0 ? void 0 : _b.after) !== undefined ? { after: options.after } : {}));
-    const override = (_d = (_c = options) === null || _c === void 0 ? void 0 : _c.overrides, (_d !== null && _d !== void 0 ? _d : {}));
-    const colon = Object.assign(Object.assign({ before: false, after: true }, globals), (_e = override) === null || _e === void 0 ? void 0 : _e.colon);
-    const arrow = Object.assign(Object.assign({ before: true, after: true }, globals), (_f = override) === null || _f === void 0 ? void 0 : _f.arrow);
+    var _a;
+    const globals = Object.assign(Object.assign({}, ((options === null || options === void 0 ? void 0 : options.before) !== undefined ? { before: options.before } : {})), ((options === null || options === void 0 ? void 0 : options.after) !== undefined ? { after: options.after } : {}));
+    const override = (_a = options === null || options === void 0 ? void 0 : options.overrides) !== null && _a !== void 0 ? _a : {};
+    const colon = Object.assign(Object.assign({ before: false, after: true }, globals), override === null || override === void 0 ? void 0 : override.colon);
+    const arrow = Object.assign(Object.assign({ before: true, after: true }, globals), override === null || override === void 0 ? void 0 : override.arrow);
     return {
         colon: colon,
         arrow: arrow,
-        variable: Object.assign(Object.assign({}, colon), (_g = override) === null || _g === void 0 ? void 0 : _g.variable),
-        property: Object.assign(Object.assign({}, colon), (_h = override) === null || _h === void 0 ? void 0 : _h.property),
-        parameter: Object.assign(Object.assign({}, colon), (_j = override) === null || _j === void 0 ? void 0 : _j.parameter),
-        returnType: Object.assign(Object.assign({}, colon), (_k = override) === null || _k === void 0 ? void 0 : _k.returnType),
+        variable: Object.assign(Object.assign({}, colon), override === null || override === void 0 ? void 0 : override.variable),
+        property: Object.assign(Object.assign({}, colon), override === null || override === void 0 ? void 0 : override.property),
+        parameter: Object.assign(Object.assign({}, colon), override === null || override === void 0 ? void 0 : override.parameter),
+        returnType: Object.assign(Object.assign({}, colon), override === null || override === void 0 ? void 0 : override.returnType),
     };
 }
 function getIdentifierRules(rules, node) {
-    var _a;
-    const scope = (_a = node) === null || _a === void 0 ? void 0 : _a.parent;
+    const scope = node === null || node === void 0 ? void 0 : node.parent;
     if (util_1.isVariableDeclarator(scope)) {
         return rules.variable;
     }
@@ -46,9 +57,9 @@
     }
 }
 function getRules(rules, node) {
-    var _a, _b;
-    const scope = (_b = (_a = node) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.parent;
-    if (util_1.isTSFunctionType(scope)) {
+    var _a;
+    const scope = (_a = node === null || node === void 0 ? void 0 : node.parent) === null || _a === void 0 ? void 0 : _a.parent;
+    if (util_1.isTSFunctionType(scope) || util_1.isTSConstructorType(scope)) {
         return rules.arrow;
     }
     else if (util_1.isIdentifier(scope)) {
@@ -71,7 +82,7 @@
         docs: {
             description: 'Require consistent spacing around type annotations',
             category: 'Stylistic Issues',
-            recommended: 'error',
+            recommended: false,
         },
         fixable: 'whitespace',
         messages: {
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/type-annotation-spacing.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/type-annotation-spacing.js.map
index 932308a..fb00864 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/type-annotation-spacing.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/type-annotation-spacing.js.map
@@ -1 +1 @@
-{"version":3,"file":"type-annotation-spacing.js","sourceRoot":"","sources":["../../src/rules/type-annotation-spacing.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"type-annotation-spacing.js","sourceRoot":"","sources":["../../src/rules/type-annotation-spacing.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/typedef.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/typedef.js
index 6b42b03..fb4c63c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/typedef.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/typedef.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -18,8 +30,8 @@
             recommended: false,
         },
         messages: {
-            expectedTypedef: 'expected a type annotation',
-            expectedTypedefNamed: 'expected {{name}} to have a type annotation',
+            expectedTypedef: 'Expected a type annotation.',
+            expectedTypedefNamed: 'Expected {{name}} to have a type annotation.',
         },
         schema: [
             {
@@ -40,10 +52,14 @@
     },
     defaultOptions: [
         {
-            ["arrowParameter" /* ArrowParameter */]: true,
-            ["memberVariableDeclaration" /* MemberVariableDeclaration */]: true,
-            ["parameter" /* Parameter */]: true,
-            ["propertyDeclaration" /* PropertyDeclaration */]: true,
+            ["arrayDestructuring" /* ArrayDestructuring */]: false,
+            ["arrowParameter" /* ArrowParameter */]: false,
+            ["memberVariableDeclaration" /* MemberVariableDeclaration */]: false,
+            ["objectDestructuring" /* ObjectDestructuring */]: false,
+            ["parameter" /* Parameter */]: false,
+            ["propertyDeclaration" /* PropertyDeclaration */]: false,
+            ["variableDeclaration" /* VariableDeclaration */]: false,
+            ["variableDeclarationIgnoreFunction" /* VariableDeclarationIgnoreFunction */]: false,
         },
     ],
     create(context, [options]) {
@@ -107,6 +123,11 @@
         }
         return {
             ArrayPattern(node) {
+                var _a;
+                if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.RestElement &&
+                    node.parent.typeAnnotation) {
+                    return;
+                }
                 if (options["arrayDestructuring" /* ArrayDestructuring */] &&
                     !node.typeAnnotation &&
                     !isForOfStatementContext(node)) {
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/typedef.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/typedef.js.map
index a78b59c..bc20808 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/typedef.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/typedef.js.map
@@ -1 +1 @@
-{"version":3,"file":"typedef.js","sourceRoot":"","sources":["../../src/rules/typedef.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"typedef.js","sourceRoot":"","sources":["../../src/rules/typedef.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unbound-method.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unbound-method.js
index 7d166b5..88777e0 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unbound-method.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unbound-method.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -75,6 +87,11 @@
     'Intl',
 ];
 const nativelyBoundMembers = SUPPORTED_GLOBALS.map(namespace => {
+    if (!(namespace in global)) {
+        // node.js might not have namespaces like Intl depending on compilation options
+        // https://nodejs.org/api/intl.html#intl_options_for_building_node_js
+        return [];
+    }
     const object = global[namespace];
     return Object.getOwnPropertyNames(object)
         .filter(name => !name.startsWith('_') &&
@@ -83,7 +100,7 @@
 })
     .reduce((arr, names) => arr.concat(names), [])
     .filter(name => !nativelyNotBoundMembers.has(name));
-const isMemberNotImported = (symbol, currentSourceFile) => {
+const isNotImported = (symbol, currentSourceFile) => {
     const { valueDeclaration } = symbol;
     if (!valueDeclaration) {
         // working around https://github.com/microsoft/TypeScript/issues/31294
@@ -129,14 +146,14 @@
         const checker = parserServices.program.getTypeChecker();
         const currentSourceFile = parserServices.program.getSourceFile(context.getFilename());
         return {
-            'MemberExpression, OptionalMemberExpression'(node) {
+            MemberExpression(node) {
                 if (isSafeUse(node)) {
                     return;
                 }
                 const objectSymbol = checker.getSymbolAtLocation(parserServices.esTreeNodeToTSNodeMap.get(node.object));
                 if (objectSymbol &&
                     nativelyBoundMembers.includes(getMemberFullName(node)) &&
-                    isMemberNotImported(objectSymbol, currentSourceFile)) {
+                    isNotImported(objectSymbol, currentSourceFile)) {
                     return;
                 }
                 const originalNode = parserServices.esTreeNodeToTSNodeMap.get(node);
@@ -148,16 +165,48 @@
                     });
                 }
             },
+            'VariableDeclarator, AssignmentExpression'(node) {
+                const [idNode, initNode] = node.type === experimental_utils_1.AST_NODE_TYPES.VariableDeclarator
+                    ? [node.id, node.init]
+                    : [node.left, node.right];
+                if (initNode && idNode.type === experimental_utils_1.AST_NODE_TYPES.ObjectPattern) {
+                    const tsNode = parserServices.esTreeNodeToTSNodeMap.get(initNode);
+                    const rightSymbol = checker.getSymbolAtLocation(tsNode);
+                    const initTypes = checker.getTypeAtLocation(tsNode);
+                    const notImported = rightSymbol && isNotImported(rightSymbol, currentSourceFile);
+                    idNode.properties.forEach(property => {
+                        if (property.type === experimental_utils_1.AST_NODE_TYPES.Property &&
+                            property.key.type === experimental_utils_1.AST_NODE_TYPES.Identifier) {
+                            if (notImported &&
+                                util.isIdentifier(initNode) &&
+                                nativelyBoundMembers.includes(`${initNode.name}.${property.key.name}`)) {
+                                return;
+                            }
+                            const symbol = initTypes.getProperty(property.key.name);
+                            if (symbol && isDangerousMethod(symbol, ignoreStatic)) {
+                                context.report({
+                                    messageId: 'unbound',
+                                    node,
+                                });
+                            }
+                        }
+                    });
+                }
+            },
         };
     },
 });
 function isDangerousMethod(symbol, ignoreStatic) {
+    var _a;
     const { valueDeclaration } = symbol;
     if (!valueDeclaration) {
         // working around https://github.com/microsoft/TypeScript/issues/31294
         return false;
     }
     switch (valueDeclaration.kind) {
+        case ts.SyntaxKind.PropertyDeclaration:
+            return (((_a = valueDeclaration.initializer) === null || _a === void 0 ? void 0 : _a.kind) ===
+                ts.SyntaxKind.FunctionExpression);
         case ts.SyntaxKind.MethodDeclaration:
         case ts.SyntaxKind.MethodSignature:
             return !(ignoreStatic &&
@@ -166,28 +215,31 @@
     return false;
 }
 function isSafeUse(node) {
-    var _a;
     const parent = node.parent;
-    switch ((_a = parent) === null || _a === void 0 ? void 0 : _a.type) {
+    switch (parent === null || parent === void 0 ? void 0 : parent.type) {
         case experimental_utils_1.AST_NODE_TYPES.IfStatement:
         case experimental_utils_1.AST_NODE_TYPES.ForStatement:
         case experimental_utils_1.AST_NODE_TYPES.MemberExpression:
-        case experimental_utils_1.AST_NODE_TYPES.OptionalMemberExpression:
         case experimental_utils_1.AST_NODE_TYPES.SwitchStatement:
         case experimental_utils_1.AST_NODE_TYPES.UpdateExpression:
         case experimental_utils_1.AST_NODE_TYPES.WhileStatement:
             return true;
         case experimental_utils_1.AST_NODE_TYPES.CallExpression:
-        case experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression:
             return parent.callee === node;
         case experimental_utils_1.AST_NODE_TYPES.ConditionalExpression:
             return parent.test === node;
         case experimental_utils_1.AST_NODE_TYPES.TaggedTemplateExpression:
             return parent.tag === node;
         case experimental_utils_1.AST_NODE_TYPES.UnaryExpression:
-            return parent.operator === 'typeof';
+            // the first case is safe for obvious
+            // reasons. The second one is also fine
+            // since we're returning something falsy
+            return ['typeof', '!', 'void', 'delete'].includes(parent.operator);
         case experimental_utils_1.AST_NODE_TYPES.BinaryExpression:
             return ['instanceof', '==', '!=', '===', '!=='].includes(parent.operator);
+        case experimental_utils_1.AST_NODE_TYPES.AssignmentExpression:
+            return parent.operator === '=' && node === parent.left;
+        case experimental_utils_1.AST_NODE_TYPES.ChainExpression:
         case experimental_utils_1.AST_NODE_TYPES.TSNonNullExpression:
         case experimental_utils_1.AST_NODE_TYPES.TSAsExpression:
         case experimental_utils_1.AST_NODE_TYPES.TSTypeAssertion:
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unbound-method.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unbound-method.js.map
index 81ceae7..a42745e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unbound-method.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unbound-method.js.map
@@ -1 +1 @@
-{"version":3,"file":"unbound-method.js","sourceRoot":"","sources":["../../src/rules/unbound-method.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"unbound-method.js","sourceRoot":"","sources":["../../src/rules/unbound-method.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,8EAG+C;AAC/C,iDAAmC;AACnC,+CAAiC;AACjC,8CAAgC;AAchC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,aAAa;IACb,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,oBAAoB;IACpB,yBAAyB;IACzB,uBAAuB;IACvB,wBAAwB;IACxB,wBAAwB;IACxB,aAAa;IACb,kCAAkC;IAClC,wBAAwB;IACxB,aAAa;IACb,sBAAsB;IACtB,iBAAiB;IACjB,2BAA2B;IAC3B,aAAa;IACb,wBAAwB;CACzB,CAAC,CAAC;AACH,MAAM,iBAAiB,GAAG;IACxB,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,MAAM;IACN,UAAU;IACV,SAAS;IACT,SAAS;IACT,SAAS;IACT,MAAM;IACN,MAAM;IACN,MAAM;CACE,CAAC;AACX,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;IAC7D,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE;QAC1B,+EAA+E;QAC/E,qEAAqE;QACrE,OAAO,EAAE,CAAC;KACX;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC;SACtC,MAAM,CACL,IAAI,CAAC,EAAE,CACL,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,OAAQ,MAAkC,CAAC,IAAI,CAAC,KAAK,UAAU,CAClE;SACA,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC,CAAC;KACC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;KAC7C,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAEtD,MAAM,aAAa,GAAG,CACpB,MAAiB,EACjB,iBAA4C,EACnC,EAAE;IACX,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;IACpC,IAAI,CAAC,gBAAgB,EAAE;QACrB,sEAAsE;QACtE,OAAO,KAAK,CAAC;KACd;IAED,OAAO,CACL,CAAC,CAAC,iBAAiB;QACnB,iBAAiB,KAAK,gBAAgB,CAAC,aAAa,EAAE,CACvD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAmB,EAAiB,EAAE,CACzD,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAE7D,MAAM,iBAAiB,GAAG,CAAC,IAA+B,EAAU,EAAE,CACpE,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AAE9D,kBAAe,IAAI,CAAC,UAAU,CAAsB;IAClD,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EACT,+DAA+D;YACjE,WAAW,EAAE,OAAO;YACpB,oBAAoB,EAAE,IAAI;SAC3B;QACD,QAAQ,EAAE;YACR,OAAO,EACL,oFAAoF;SACvF;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,YAAY,EAAE;wBACZ,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,oBAAoB,EAAE,KAAK;aAC5B;SACF;QACD,IAAI,EAAE,SAAS;KAChB;IACD,cAAc,EAAE;QACd;YACE,YAAY,EAAE,KAAK;SACpB;KACF;IACD,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACxD,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,CAAC,aAAa,CAC5D,OAAO,CAAC,WAAW,EAAE,CACtB,CAAC;QAEF,OAAO;YACL,gBAAgB,CAAC,IAA+B;gBAC9C,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE;oBACnB,OAAO;iBACR;gBAED,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAC9C,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CACtD,CAAC;gBAEF,IACE,YAAY;oBACZ,oBAAoB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;oBACtD,aAAa,CAAC,YAAY,EAAE,iBAAiB,CAAC,EAC9C;oBACA,OAAO;iBACR;gBAED,MAAM,YAAY,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpE,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;gBAEzD,IAAI,MAAM,IAAI,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE;oBACrD,OAAO,CAAC,MAAM,CAAC;wBACb,SAAS,EAAE,SAAS;wBACpB,IAAI;qBACL,CAAC,CAAC;iBACJ;YACH,CAAC;YACD,0CAA0C,CACxC,IAAiE;gBAEjE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GACtB,IAAI,CAAC,IAAI,KAAK,mCAAc,CAAC,kBAAkB;oBAC7C,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC;oBACtB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAE9B,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,mCAAc,CAAC,aAAa,EAAE;oBAC5D,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAClE,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;oBACxD,MAAM,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;oBAEpD,MAAM,WAAW,GACf,WAAW,IAAI,aAAa,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;oBAE/D,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;wBACnC,IACE,QAAQ,CAAC,IAAI,KAAK,mCAAc,CAAC,QAAQ;4BACzC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,EAC/C;4BACA,IACE,WAAW;gCACX,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;gCAC3B,oBAAoB,CAAC,QAAQ,CAC3B,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CACxC,EACD;gCACA,OAAO;6BACR;4BAED,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;4BACxD,IAAI,MAAM,IAAI,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE;gCACrD,OAAO,CAAC,MAAM,CAAC;oCACb,SAAS,EAAE,SAAS;oCACpB,IAAI;iCACL,CAAC,CAAC;6BACJ;yBACF;oBACH,CAAC,CAAC,CAAC;iBACJ;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,iBAAiB,CAAC,MAAiB,EAAE,YAAqB;;IACjE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;IACpC,IAAI,CAAC,gBAAgB,EAAE;QACrB,sEAAsE;QACtE,OAAO,KAAK,CAAC;KACd;IAED,QAAQ,gBAAgB,CAAC,IAAI,EAAE;QAC7B,KAAK,EAAE,CAAC,UAAU,CAAC,mBAAmB;YACpC,OAAO,CACL,OAAC,gBAA2C,CAAC,WAAW,0CAAE,IAAI;gBAC9D,EAAE,CAAC,UAAU,CAAC,kBAAkB,CACjC,CAAC;QACJ,KAAK,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACrC,KAAK,EAAE,CAAC,UAAU,CAAC,eAAe;YAChC,OAAO,CAAC,CACN,YAAY;gBACZ,OAAO,CAAC,WAAW,CACjB,gBAAgB,CAAC,SAAS,EAC1B,EAAE,CAAC,UAAU,CAAC,aAAa,CAC5B,CACF,CAAC;KACL;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,IAAmB;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAE3B,QAAQ,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,EAAE;QACpB,KAAK,mCAAc,CAAC,WAAW,CAAC;QAChC,KAAK,mCAAc,CAAC,YAAY,CAAC;QACjC,KAAK,mCAAc,CAAC,gBAAgB,CAAC;QACrC,KAAK,mCAAc,CAAC,eAAe,CAAC;QACpC,KAAK,mCAAc,CAAC,gBAAgB,CAAC;QACrC,KAAK,mCAAc,CAAC,cAAc;YAChC,OAAO,IAAI,CAAC;QAEd,KAAK,mCAAc,CAAC,cAAc;YAChC,OAAO,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;QAEhC,KAAK,mCAAc,CAAC,qBAAqB;YACvC,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC;QAE9B,KAAK,mCAAc,CAAC,wBAAwB;YAC1C,OAAO,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC;QAE7B,KAAK,mCAAc,CAAC,eAAe;YACjC,qCAAqC;YACrC,uCAAuC;YACvC,wCAAwC;YACxC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAErE,KAAK,mCAAc,CAAC,gBAAgB;YAClC,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE5E,KAAK,mCAAc,CAAC,oBAAoB;YACtC,OAAO,MAAM,CAAC,QAAQ,KAAK,GAAG,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;QAEzD,KAAK,mCAAc,CAAC,eAAe,CAAC;QACpC,KAAK,mCAAc,CAAC,mBAAmB,CAAC;QACxC,KAAK,mCAAc,CAAC,cAAc,CAAC;QACnC,KAAK,mCAAc,CAAC,eAAe;YACjC,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;QAE3B,KAAK,mCAAc,CAAC,iBAAiB;YACnC,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;gBACpD,qEAAqE;gBACrE,OAAO,IAAI,CAAC;aACb;YAED,oFAAoF;YACpF,0CAA0C;YAC1C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;KAC5B;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unified-signatures.js b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unified-signatures.js
index 1ce3a0c..c20553a 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unified-signatures.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unified-signatures.js
@@ -1,9 +1,21 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
@@ -40,7 +52,6 @@
             return `${overloads} can be combined into one signature`;
         }
         function addFailures(failures) {
-            var _a, _b;
             for (const failure of failures) {
                 const { unify, only2 } = failure;
                 switch (unify.kind) {
@@ -58,8 +69,8 @@
                             messageId: 'singleParameterDifference',
                             data: {
                                 failureStringStart: failureStringStart(lineOfOtherOverload),
-                                type1: sourceCode.getText((_a = typeAnnotation0) === null || _a === void 0 ? void 0 : _a.typeAnnotation),
-                                type2: sourceCode.getText((_b = typeAnnotation1) === null || _b === void 0 ? void 0 : _b.typeAnnotation),
+                                type1: sourceCode.getText(typeAnnotation0 === null || typeAnnotation0 === void 0 ? void 0 : typeAnnotation0.typeAnnotation),
+                                type2: sourceCode.getText(typeAnnotation1 === null || typeAnnotation1 === void 0 ? void 0 : typeAnnotation1.typeAnnotation),
                             },
                             node: p1,
                         });
@@ -301,7 +312,7 @@
             currentScope = scopes.pop();
         }
         function addOverload(signature, key, containingNode) {
-            key = (key !== null && key !== void 0 ? key : getOverloadKey(signature));
+            key = key !== null && key !== void 0 ? key : getOverloadKey(signature);
             if (currentScope &&
                 (containingNode || signature).parent === currentScope.parent) {
                 const overloads = currentScope.overloads.get(key);
@@ -328,9 +339,9 @@
             TSTypeLiteral: createScope,
             // collect overloads
             TSDeclareFunction(node) {
-                var _a, _b, _c;
+                var _a, _b;
                 const exportingNode = getExportingNode(node);
-                addOverload(node, (_b = (_a = node.id) === null || _a === void 0 ? void 0 : _a.name, (_b !== null && _b !== void 0 ? _b : (_c = exportingNode) === null || _c === void 0 ? void 0 : _c.type)), exportingNode);
+                addOverload(node, (_b = (_a = node.id) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : exportingNode === null || exportingNode === void 0 ? void 0 : exportingNode.type, exportingNode);
             },
             TSCallSignatureDeclaration: addOverload,
             TSConstructSignatureDeclaration: addOverload,
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unified-signatures.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unified-signatures.js.map
index 395fdf6..ce84d5c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unified-signatures.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/rules/unified-signatures.js.map
@@ -1 +1 @@
-{"version":3,"file":"unified-signatures.js","sourceRoot":"","sources":["../../src/rules/unified-signatures.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"unified-signatures.js","sourceRoot":"","sources":["../../src/rules/unified-signatures.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/astUtils.js b/node_modules/@typescript-eslint/eslint-plugin/dist/util/astUtils.js
index 07fdb69..249bf79 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/astUtils.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/astUtils.js
@@ -1,161 +1,15 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
 Object.defineProperty(exports, "__esModule", { value: true });
-const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const LINEBREAK_MATCHER = /\r\n|[\r\n\u2028\u2029]/;
-exports.LINEBREAK_MATCHER = LINEBREAK_MATCHER;
-function isOptionalChainPunctuator(token) {
-    return token.type === experimental_utils_1.AST_TOKEN_TYPES.Punctuator && token.value === '?.';
-}
-exports.isOptionalChainPunctuator = isOptionalChainPunctuator;
-function isNotOptionalChainPunctuator(token) {
-    return !isOptionalChainPunctuator(token);
-}
-exports.isNotOptionalChainPunctuator = isNotOptionalChainPunctuator;
-function isNonNullAssertionPunctuator(token) {
-    return token.type === experimental_utils_1.AST_TOKEN_TYPES.Punctuator && token.value === '!';
-}
-exports.isNonNullAssertionPunctuator = isNonNullAssertionPunctuator;
-function isNotNonNullAssertionPunctuator(token) {
-    return !isNonNullAssertionPunctuator(token);
-}
-exports.isNotNonNullAssertionPunctuator = isNotNonNullAssertionPunctuator;
-/**
- * Returns true if and only if the node represents: foo?.() or foo.bar?.()
- */
-function isOptionalOptionalChain(node) {
-    return (node.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression &&
-        // this flag means the call expression itself is option
-        // i.e. it is foo.bar?.() and not foo?.bar()
-        node.optional);
-}
-exports.isOptionalOptionalChain = isOptionalOptionalChain;
-/**
- * Returns true if and only if the node represents logical OR
- */
-function isLogicalOrOperator(node) {
-    return (node.type === experimental_utils_1.AST_NODE_TYPES.LogicalExpression && node.operator === '||');
-}
-exports.isLogicalOrOperator = isLogicalOrOperator;
-/**
- * Determines whether two adjacent tokens are on the same line
- */
-function isTokenOnSameLine(left, right) {
-    return left.loc.end.line === right.loc.start.line;
-}
-exports.isTokenOnSameLine = isTokenOnSameLine;
-/**
- * Checks if a node is a type assertion:
- * ```
- * x as foo
- * <foo>x
- * ```
- */
-function isTypeAssertion(node) {
-    if (!node) {
-        return false;
-    }
-    return (node.type === experimental_utils_1.AST_NODE_TYPES.TSAsExpression ||
-        node.type === experimental_utils_1.AST_NODE_TYPES.TSTypeAssertion);
-}
-exports.isTypeAssertion = isTypeAssertion;
-function isVariableDeclarator(node) {
-    var _a;
-    return ((_a = node) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.VariableDeclarator;
-}
-exports.isVariableDeclarator = isVariableDeclarator;
-function isFunction(node) {
-    if (!node) {
-        return false;
-    }
-    return [
-        experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression,
-        experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration,
-        experimental_utils_1.AST_NODE_TYPES.FunctionExpression,
-    ].includes(node.type);
-}
-exports.isFunction = isFunction;
-function isFunctionType(node) {
-    if (!node) {
-        return false;
-    }
-    return [
-        experimental_utils_1.AST_NODE_TYPES.TSCallSignatureDeclaration,
-        experimental_utils_1.AST_NODE_TYPES.TSConstructSignatureDeclaration,
-        experimental_utils_1.AST_NODE_TYPES.TSEmptyBodyFunctionExpression,
-        experimental_utils_1.AST_NODE_TYPES.TSFunctionType,
-        experimental_utils_1.AST_NODE_TYPES.TSMethodSignature,
-    ].includes(node.type);
-}
-exports.isFunctionType = isFunctionType;
-function isFunctionOrFunctionType(node) {
-    return isFunction(node) || isFunctionType(node);
-}
-exports.isFunctionOrFunctionType = isFunctionOrFunctionType;
-function isTSFunctionType(node) {
-    var _a;
-    return ((_a = node) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.TSFunctionType;
-}
-exports.isTSFunctionType = isTSFunctionType;
-function isClassOrTypeElement(node) {
-    if (!node) {
-        return false;
-    }
-    return [
-        // ClassElement
-        experimental_utils_1.AST_NODE_TYPES.ClassProperty,
-        experimental_utils_1.AST_NODE_TYPES.FunctionExpression,
-        experimental_utils_1.AST_NODE_TYPES.MethodDefinition,
-        experimental_utils_1.AST_NODE_TYPES.TSAbstractClassProperty,
-        experimental_utils_1.AST_NODE_TYPES.TSAbstractMethodDefinition,
-        experimental_utils_1.AST_NODE_TYPES.TSEmptyBodyFunctionExpression,
-        experimental_utils_1.AST_NODE_TYPES.TSIndexSignature,
-        // TypeElement
-        experimental_utils_1.AST_NODE_TYPES.TSCallSignatureDeclaration,
-        experimental_utils_1.AST_NODE_TYPES.TSConstructSignatureDeclaration,
-        // AST_NODE_TYPES.TSIndexSignature,
-        experimental_utils_1.AST_NODE_TYPES.TSMethodSignature,
-        experimental_utils_1.AST_NODE_TYPES.TSPropertySignature,
-    ].includes(node.type);
-}
-exports.isClassOrTypeElement = isClassOrTypeElement;
-/**
- * Checks if a node is a constructor method.
- */
-function isConstructor(node) {
-    var _a;
-    return (((_a = node) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.MethodDefinition &&
-        node.kind === 'constructor');
-}
-exports.isConstructor = isConstructor;
-/**
- * Checks if a node is a setter method.
- */
-function isSetter(node) {
-    return (!!node &&
-        (node.type === experimental_utils_1.AST_NODE_TYPES.MethodDefinition ||
-            node.type === experimental_utils_1.AST_NODE_TYPES.Property) &&
-        node.kind === 'set');
-}
-exports.isSetter = isSetter;
-function isIdentifier(node) {
-    var _a;
-    return ((_a = node) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.Identifier;
-}
-exports.isIdentifier = isIdentifier;
-/**
- * Checks if a node represents an `await …` expression.
- */
-function isAwaitExpression(node) {
-    var _a;
-    return ((_a = node) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_NODE_TYPES.AwaitExpression;
-}
-exports.isAwaitExpression = isAwaitExpression;
-/**
- * Checks if a possible token is the `await` keyword.
- */
-function isAwaitKeyword(node) {
-    var _a;
-    return ((_a = node) === null || _a === void 0 ? void 0 : _a.type) === experimental_utils_1.AST_TOKEN_TYPES.Identifier && node.value === 'await';
-}
-exports.isAwaitKeyword = isAwaitKeyword;
+// deeply re-export, for convenience
+__exportStar(require("@typescript-eslint/experimental-utils/dist/ast-utils"), exports);
 //# sourceMappingURL=astUtils.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/astUtils.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/util/astUtils.js.map
index a203039..872e04e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/astUtils.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/astUtils.js.map
@@ -1 +1 @@
-{"version":3,"file":"astUtils.js","sourceRoot":"","sources":["../../src/util/astUtils.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"astUtils.js","sourceRoot":"","sources":["../../src/util/astUtils.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAoC;AACpC,uFAAqE"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/createRule.js b/node_modules/@typescript-eslint/eslint-plugin/dist/util/createRule.js
index fc86af0..b7066ab 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/createRule.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/createRule.js
@@ -1,5 +1,6 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.createRule = void 0;
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 // note - cannot migrate this to an import statement because it will make TSC copy the package.json to the dist folder
 const version = require('../../package.json').version;
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/createRule.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/util/createRule.js.map
index 1bbd139..768d51b 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/createRule.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/createRule.js.map
@@ -1 +1 @@
-{"version":3,"file":"createRule.js","sourceRoot":"","sources":["../../src/util/createRule.ts"],"names":[],"mappings":";;AAAA,8EAAoE;AAEpE,sHAAsH;AACtH,MAAM,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC;AAEzC,QAAA,UAAU,GAAG,gCAAW,CAAC,WAAW,CAC/C,IAAI,CAAC,EAAE,CACL,gEAAgE,OAAO,sCAAsC,IAAI,KAAK,CACzH,CAAC"}
\ No newline at end of file
+{"version":3,"file":"createRule.js","sourceRoot":"","sources":["../../src/util/createRule.ts"],"names":[],"mappings":";;;AAAA,8EAAoE;AAEpE,sHAAsH;AACtH,MAAM,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC;AAEzC,QAAA,UAAU,GAAG,gCAAW,CAAC,WAAW,CAC/C,IAAI,CAAC,EAAE,CACL,gEAAgE,OAAO,sCAAsC,IAAI,KAAK,CACzH,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/explicitReturnTypeUtils.js b/node_modules/@typescript-eslint/eslint-plugin/dist/util/explicitReturnTypeUtils.js
index f6835a1..ad10249 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/explicitReturnTypeUtils.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/explicitReturnTypeUtils.js
@@ -1,5 +1,6 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.isTypedFunctionExpression = exports.doesImmediatelyReturnFunctionExpression = exports.checkFunctionReturnType = exports.checkFunctionExpressionReturnType = void 0;
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 const astUtils_1 = require("./astUtils");
 const nullThrows_1 = require("./nullThrows");
@@ -132,6 +133,7 @@
     return (body.type === experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression ||
         body.type === experimental_utils_1.AST_NODE_TYPES.FunctionExpression);
 }
+exports.doesImmediatelyReturnFunctionExpression = doesImmediatelyReturnFunctionExpression;
 /**
  * Checks if a node belongs to:
  * ```
@@ -139,8 +141,7 @@
  * ```
  */
 function isFunctionArgument(parent, callee) {
-    return ((parent.type === experimental_utils_1.AST_NODE_TYPES.CallExpression ||
-        parent.type === experimental_utils_1.AST_NODE_TYPES.OptionalCallExpression) &&
+    return (parent.type === experimental_utils_1.AST_NODE_TYPES.CallExpression &&
         // make sure this isn't an IIFE
         parent.callee !== callee);
 }
@@ -165,19 +166,8 @@
     return false;
 }
 /**
- * Checks if a function declaration/expression has a return type.
+ * True when the provided function expression is typed.
  */
-function checkFunctionReturnType(node, options, sourceCode, report) {
-    if (options.allowHigherOrderFunctions &&
-        doesImmediatelyReturnFunctionExpression(node)) {
-        return;
-    }
-    if (node.returnType || astUtils_1.isConstructor(node.parent) || astUtils_1.isSetter(node.parent)) {
-        return;
-    }
-    report(getReporLoc(node, sourceCode));
-}
-exports.checkFunctionReturnType = checkFunctionReturnType;
 function isTypedFunctionExpression(node, options) {
     const parent = nullThrows_1.nullThrows(node.parent, nullThrows_1.NullThrowsReasons.MissingParent);
     if (!options.allowTypedFunctionExpressions) {
@@ -192,11 +182,12 @@
 }
 exports.isTypedFunctionExpression = isTypedFunctionExpression;
 /**
- * Checks if a function declaration/expression has a return type.
+ * Check whether the function expression return type is either typed or valid
+ * with the provided options.
  */
-function checkFunctionExpressionReturnType(node, options, sourceCode, report) {
+function isValidFunctionExpressionReturnType(node, options) {
     if (isTypedFunctionExpression(node, options)) {
-        return;
+        return true;
     }
     const parent = nullThrows_1.nullThrows(node.parent, nullThrows_1.NullThrowsReasons.MissingParent);
     if (options.allowExpressions &&
@@ -204,12 +195,44 @@
         parent.type !== experimental_utils_1.AST_NODE_TYPES.MethodDefinition &&
         parent.type !== experimental_utils_1.AST_NODE_TYPES.ExportDefaultDeclaration &&
         parent.type !== experimental_utils_1.AST_NODE_TYPES.ClassProperty) {
-        return;
+        return true;
     }
     // https://github.com/typescript-eslint/typescript-eslint/issues/653
     if (options.allowDirectConstAssertionInArrowFunctions &&
         node.type === experimental_utils_1.AST_NODE_TYPES.ArrowFunctionExpression &&
         returnsConstAssertionDirectly(node)) {
+        return true;
+    }
+    return false;
+}
+/**
+ * Check that the function expression or declaration is valid.
+ */
+function isValidFunctionReturnType(node, options) {
+    if (options.allowHigherOrderFunctions &&
+        doesImmediatelyReturnFunctionExpression(node)) {
+        return true;
+    }
+    if (node.returnType || astUtils_1.isConstructor(node.parent) || astUtils_1.isSetter(node.parent)) {
+        return true;
+    }
+    return false;
+}
+/**
+ * Checks if a function declaration/expression has a return type.
+ */
+function checkFunctionReturnType(node, options, sourceCode, report) {
+    if (isValidFunctionReturnType(node, options)) {
+        return;
+    }
+    report(getReporLoc(node, sourceCode));
+}
+exports.checkFunctionReturnType = checkFunctionReturnType;
+/**
+ * Checks if a function declaration/expression has a return type.
+ */
+function checkFunctionExpressionReturnType(node, options, sourceCode, report) {
+    if (isValidFunctionExpressionReturnType(node, options)) {
         return;
     }
     checkFunctionReturnType(node, options, sourceCode, report);
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/explicitReturnTypeUtils.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/util/explicitReturnTypeUtils.js.map
index d89a5d4..1dbb920 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/explicitReturnTypeUtils.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/explicitReturnTypeUtils.js.map
@@ -1 +1 @@
-{"version":3,"file":"explicitReturnTypeUtils.js","sourceRoot":"","sources":["../../src/util/explicitReturnTypeUtils.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"explicitReturnTypeUtils.js","sourceRoot":"","sources":["../../src/util/explicitReturnTypeUtils.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/index.js b/node_modules/@typescript-eslint/eslint-plugin/dist/util/index.js
index ef8976d..c625d72 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/index.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/index.js
@@ -1,15 +1,25 @@
 "use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.getParserServices = exports.isObjectNotArray = exports.deepMerge = exports.applyDefault = void 0;
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-__export(require("./astUtils"));
-__export(require("./createRule"));
-__export(require("./isTypeReadonly"));
-__export(require("./misc"));
-__export(require("./nullThrows"));
-__export(require("./types"));
+__exportStar(require("./astUtils"), exports);
+__exportStar(require("./createRule"), exports);
+__exportStar(require("./isTypeReadonly"), exports);
+__exportStar(require("./misc"), exports);
+__exportStar(require("./nullThrows"), exports);
+__exportStar(require("./objectIterators"), exports);
+__exportStar(require("./propertyTypes"), exports);
+__exportStar(require("./types"), exports);
 // this is done for convenience - saves migrating all of the old rules
 const { applyDefault, deepMerge, isObjectNotArray, getParserServices, } = experimental_utils_1.ESLintUtils;
 exports.applyDefault = applyDefault;
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/index.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/util/index.js.map
index 8079e78..b29dfed 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/index.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":";;;;;AAAA,8EAAoE;AAEpE,gCAA2B;AAC3B,kCAA6B;AAC7B,sCAAiC;AACjC,4BAAuB;AACvB,kCAA6B;AAC7B,6BAAwB;AAExB,sEAAsE;AACtE,MAAM,EACJ,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,iBAAiB,GAClB,GAAG,gCAAW,CAAC;AACP,oCAAY;AAAE,8BAAS;AAAE,4CAAgB;AAAE,8CAAiB"}
\ No newline at end of file
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,8EAAoE;AAEpE,6CAA2B;AAC3B,+CAA6B;AAC7B,mDAAiC;AACjC,yCAAuB;AACvB,+CAA6B;AAC7B,oDAAkC;AAClC,kDAAgC;AAChC,0CAAwB;AAExB,sEAAsE;AACtE,MAAM,EACJ,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,iBAAiB,GAClB,GAAG,gCAAW,CAAC;AAOd,oCAAY;AACZ,8BAAS;AACT,4CAAgB;AAChB,8CAAiB"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/isTypeReadonly.js b/node_modules/@typescript-eslint/eslint-plugin/dist/util/isTypeReadonly.js
index 840a5a5..78f5f46 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/isTypeReadonly.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/isTypeReadonly.js
@@ -1,72 +1,76 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.isTypeReadonly = void 0;
 const tsutils_1 = require("tsutils");
 const ts = __importStar(require("typescript"));
 const _1 = require(".");
-/**
- * Returns:
- * - null if the type is not an array or tuple,
- * - true if the type is a readonly array or readonly tuple,
- * - false if the type is a mutable array or mutable tuple.
- */
-function isTypeReadonlyArrayOrTuple(checker, type) {
+function isTypeReadonlyArrayOrTuple(checker, type, seenTypes) {
     function checkTypeArguments(arrayType) {
         const typeArguments = checker.getTypeArguments(arrayType);
+        // this shouldn't happen in reality as:
+        // - tuples require at least 1 type argument
+        // - ReadonlyArray requires at least 1 type argument
         /* istanbul ignore if */ if (typeArguments.length === 0) {
-            // this shouldn't happen in reality as:
-            // - tuples require at least 1 type argument
-            // - ReadonlyArray requires at least 1 type argument
-            return true;
+            return 3 /* Readonly */;
         }
         // validate the element types are also readonly
-        if (typeArguments.some(typeArg => !isTypeReadonly(checker, typeArg))) {
-            return false;
+        if (typeArguments.some(typeArg => isTypeReadonlyRecurser(checker, typeArg, seenTypes) ===
+            2 /* Mutable */)) {
+            return 2 /* Mutable */;
         }
-        return true;
+        return 3 /* Readonly */;
     }
     if (checker.isArrayType(type)) {
         const symbol = _1.nullThrows(type.getSymbol(), _1.NullThrowsReasons.MissingToken('symbol', 'array type'));
         const escapedName = symbol.getEscapedName();
-        if (escapedName === 'Array' && escapedName !== 'ReadonlyArray') {
-            return false;
+        if (escapedName === 'Array') {
+            return 2 /* Mutable */;
         }
         return checkTypeArguments(type);
     }
     if (checker.isTupleType(type)) {
         if (!type.target.readonly) {
-            return false;
+            return 2 /* Mutable */;
         }
         return checkTypeArguments(type);
     }
-    return null;
+    return 1 /* UnknownType */;
 }
-/**
- * Returns:
- * - null if the type is not an object,
- * - true if the type is an object with only readonly props,
- * - false if the type is an object with at least one mutable prop.
- */
-function isTypeReadonlyObject(checker, type) {
+function isTypeReadonlyObject(checker, type, seenTypes) {
     function checkIndexSignature(kind) {
         const indexInfo = checker.getIndexInfoOfType(type, kind);
         if (indexInfo) {
-            return indexInfo.isReadonly ? true : false;
+            return indexInfo.isReadonly
+                ? 3 /* Readonly */
+                : 2 /* Mutable */;
         }
-        return null;
+        return 1 /* UnknownType */;
     }
     const properties = type.getProperties();
     if (properties.length) {
         // ensure the properties are marked as readonly
         for (const property of properties) {
             if (!tsutils_1.isPropertyReadonlyInType(type, property.getEscapedName(), checker)) {
-                return false;
+                return 2 /* Mutable */;
             }
         }
         // all properties were readonly
@@ -75,49 +79,62 @@
         // as we might be able to bail out early due to a mutable property before
         // doing this deep, potentially expensive check.
         for (const property of properties) {
-            const propertyType = _1.nullThrows(checker.getTypeOfPropertyOfType(type, property.getName()), _1.NullThrowsReasons.MissingToken(`property "${property.name}"`, 'type'));
-            if (!isTypeReadonly(checker, propertyType)) {
-                return false;
+            const propertyType = _1.nullThrows(_1.getTypeOfPropertyOfType(checker, type, property), _1.NullThrowsReasons.MissingToken(`property "${property.name}"`, 'type'));
+            // handle recursive types.
+            // we only need this simple check, because a mutable recursive type will break via the above prop readonly check
+            if (seenTypes.has(propertyType)) {
+                continue;
+            }
+            if (isTypeReadonlyRecurser(checker, propertyType, seenTypes) ===
+                2 /* Mutable */) {
+                return 2 /* Mutable */;
             }
         }
     }
     const isStringIndexSigReadonly = checkIndexSignature(ts.IndexKind.String);
-    if (isStringIndexSigReadonly === false) {
+    if (isStringIndexSigReadonly === 2 /* Mutable */) {
         return isStringIndexSigReadonly;
     }
     const isNumberIndexSigReadonly = checkIndexSignature(ts.IndexKind.Number);
-    if (isNumberIndexSigReadonly === false) {
+    if (isNumberIndexSigReadonly === 2 /* Mutable */) {
         return isNumberIndexSigReadonly;
     }
-    return true;
+    return 3 /* Readonly */;
+}
+// a helper function to ensure the seenTypes map is always passed down, except by the external caller
+function isTypeReadonlyRecurser(checker, type, seenTypes) {
+    seenTypes.add(type);
+    if (tsutils_1.isUnionType(type)) {
+        // all types in the union must be readonly
+        const result = tsutils_1.unionTypeParts(type).every(t => isTypeReadonlyRecurser(checker, t, seenTypes));
+        const readonlyness = result ? 3 /* Readonly */ : 2 /* Mutable */;
+        return readonlyness;
+    }
+    // all non-object, non-intersection types are readonly.
+    // this should only be primitive types
+    if (!tsutils_1.isObjectType(type) && !tsutils_1.isUnionOrIntersectionType(type)) {
+        return 3 /* Readonly */;
+    }
+    // pure function types are readonly
+    if (type.getCallSignatures().length > 0 &&
+        type.getProperties().length === 0) {
+        return 3 /* Readonly */;
+    }
+    const isReadonlyArray = isTypeReadonlyArrayOrTuple(checker, type, seenTypes);
+    if (isReadonlyArray !== 1 /* UnknownType */) {
+        return isReadonlyArray;
+    }
+    const isReadonlyObject = isTypeReadonlyObject(checker, type, seenTypes);
+    /* istanbul ignore else */ if (isReadonlyObject !== 1 /* UnknownType */) {
+        return isReadonlyObject;
+    }
+    throw new Error('Unhandled type');
 }
 /**
  * Checks if the given type is readonly
  */
 function isTypeReadonly(checker, type) {
-    if (tsutils_1.isUnionType(type)) {
-        // all types in the union must be readonly
-        return tsutils_1.unionTypeParts(type).every(t => isTypeReadonly(checker, t));
-    }
-    // all non-object, non-intersection types are readonly.
-    // this should only be primitive types
-    if (!tsutils_1.isObjectType(type) && !tsutils_1.isUnionOrIntersectionType(type)) {
-        return true;
-    }
-    // pure function types are readonly
-    if (type.getCallSignatures().length > 0 &&
-        type.getProperties().length === 0) {
-        return true;
-    }
-    const isReadonlyArray = isTypeReadonlyArrayOrTuple(checker, type);
-    if (isReadonlyArray !== null) {
-        return isReadonlyArray;
-    }
-    const isReadonlyObject = isTypeReadonlyObject(checker, type);
-    /* istanbul ignore else */ if (isReadonlyObject !== null) {
-        return isReadonlyObject;
-    }
-    throw new Error('Unhandled type');
+    return (isTypeReadonlyRecurser(checker, type, new Set()) === 3 /* Readonly */);
 }
 exports.isTypeReadonly = isTypeReadonly;
 //# sourceMappingURL=isTypeReadonly.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/isTypeReadonly.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/util/isTypeReadonly.js.map
index ec3a1cc..7cfab62 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/isTypeReadonly.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/isTypeReadonly.js.map
@@ -1 +1 @@
-{"version":3,"file":"isTypeReadonly.js","sourceRoot":"","sources":["../../src/util/isTypeReadonly.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"isTypeReadonly.js","sourceRoot":"","sources":["../../src/util/isTypeReadonly.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/misc.js b/node_modules/@typescript-eslint/eslint-plugin/dist/util/misc.js
index d878416..0cb96ca 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/misc.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/misc.js
@@ -3,6 +3,7 @@
  * @fileoverview Really small utility functions that didn't deserve their own files
  */
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.upperCaseFirst = exports.isDefinitionFile = exports.getNameFromMember = exports.getNameFromIndexSignature = exports.getEnumNames = exports.findFirstResult = exports.arraysAreEqual = void 0;
 const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
 /**
  * Check if the context file name is *.d.ts or *.d.tsx
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/misc.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/util/misc.js.map
index db3bfb4..c3a0e48 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/misc.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/misc.js.map
@@ -1 +1 @@
-{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/util/misc.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAEH,8EAI+C;AAE/C;;GAEG;AACH,SAAS,gBAAgB,CAAC,QAAgB;IACxC,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC;AA8HC,4CAAgB;AA5HlB;;GAEG;AACH,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAyHC,wCAAc;AA1FhB,SAAS,cAAc,CACrB,CAAkB,EAClB,CAAkB,EAClB,EAA2B;IAE3B,OAAO,CACL,CAAC,KAAK,CAAC;QACP,CAAC,CAAC,KAAK,SAAS;YACd,CAAC,KAAK,SAAS;YACf,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACtC,CAAC;AACJ,CAAC;AAoEC,wCAAc;AAlEhB,gDAAgD;AAChD,SAAS,eAAe,CACtB,MAAW,EACX,SAAkC;IAElC,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE;QAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,SAAS,EAAE;YACxB,OAAO,MAAM,CAAC;SACf;KACF;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAyDC,0CAAe;AAvDjB;;GAEG;AACH,SAAgB,yBAAyB,CACvC,IAA+B;IAE/B,MAAM,QAAQ,GAAsC,IAAI,CAAC,UAAU,CAAC,IAAI,CACtE,CAAC,SAA6B,EAAoC,EAAE,CAClE,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,CAC/C,CAAC;IACF,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC;AACxD,CAAC;AARD,8DAQC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CACxB,MAOgC,EAChC,UAA+B;IAE/B,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,EAAE;QACjD,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;KACxB;IACD,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO,EAAE;QAC9C,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;KAC9B;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAqBC,8CAAiB;AAVnB,SAAS,YAAY,CAAmB,MAA0B;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAQ,CAAC;AACpE,CAAC;AAOC,oCAAY"}
\ No newline at end of file
+{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/util/misc.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,8EAI+C;AAE/C;;GAEG;AACH,SAAS,gBAAgB,CAAC,QAAgB;IACxC,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC;AAiGC,4CAAgB;AA/FlB;;GAEG;AACH,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AA4FC,wCAAc;AAvFhB,SAAS,cAAc,CACrB,CAAkB,EAClB,CAAkB,EAClB,EAA2B;IAE3B,OAAO,CACL,CAAC,KAAK,CAAC;QACP,CAAC,CAAC,KAAK,SAAS;YACd,CAAC,KAAK,SAAS;YACf,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACtC,CAAC;AACJ,CAAC;AAkEC,wCAAc;AAhEhB,gDAAgD;AAChD,SAAS,eAAe,CACtB,MAAW,EACX,SAAkC;IAElC,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE;QAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,SAAS,EAAE;YACxB,OAAO,MAAM,CAAC;SACf;KACF;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAuDC,0CAAe;AArDjB;;GAEG;AACH,SAAS,yBAAyB,CAAC,IAA+B;IAChE,MAAM,QAAQ,GAAsC,IAAI,CAAC,UAAU,CAAC,IAAI,CACtE,CAAC,SAA6B,EAAoC,EAAE,CAClE,SAAS,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,CAC/C,CAAC;IACF,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC;AACxD,CAAC;AA8CC,8DAAyB;AA5C3B;;;GAGG;AACH,SAAS,iBAAiB,CACxB,MAOgC,EAChC,UAA+B;IAE/B,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,mCAAc,CAAC,UAAU,EAAE;QACjD,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;KACxB;IACD,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,mCAAc,CAAC,OAAO,EAAE;QAC9C,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;KAC9B;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAsBC,8CAAiB;AAXnB,SAAS,YAAY,CAAmB,MAA0B;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAQ,CAAC;AACpE,CAAC;AAOC,oCAAY"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/nullThrows.js b/node_modules/@typescript-eslint/eslint-plugin/dist/util/nullThrows.js
index ff9eb73..e5507a2 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/nullThrows.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/nullThrows.js
@@ -1,5 +1,6 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.NullThrowsReasons = exports.nullThrows = void 0;
 /**
  * A set of common reasons for calling nullThrows
  */
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/nullThrows.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/util/nullThrows.js.map
index 60ddf86..acc485a 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/nullThrows.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/nullThrows.js.map
@@ -1 +1 @@
-{"version":3,"file":"nullThrows.js","sourceRoot":"","sources":["../../src/util/nullThrows.ts"],"names":[],"mappings":";;AAAA;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,aAAa,EAAE,iCAAiC;IAChD,YAAY,EAAE,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE,CAC7C,sBAAsB,KAAK,YAAY,KAAK,GAAG;CACzC,CAAC;AAoBU,8CAAiB;AAlBtC;;;GAGG;AACH,SAAS,UAAU,CAAI,KAA2B,EAAE,OAAe;IACjE,oEAAoE;IACpE,4DAA4D;IAC5D,sEAAsE;IAEtE,oCAAoC;IACpC,wBAAwB;IACxB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;QACzC,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;KAC1D;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAEQ,gCAAU"}
\ No newline at end of file
+{"version":3,"file":"nullThrows.js","sourceRoot":"","sources":["../../src/util/nullThrows.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,aAAa,EAAE,iCAAiC;IAChD,YAAY,EAAE,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE,CAC7C,sBAAsB,KAAK,YAAY,KAAK,GAAG;CACzC,CAAC;AAoBU,8CAAiB;AAlBtC;;;GAGG;AACH,SAAS,UAAU,CAAI,KAA2B,EAAE,OAAe;IACjE,oEAAoE;IACpE,4DAA4D;IAC5D,sEAAsE;IAEtE,oCAAoC;IACpC,wBAAwB;IACxB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;QACzC,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;KAC1D;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAEQ,gCAAU"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/objectIterators.js b/node_modules/@typescript-eslint/eslint-plugin/dist/util/objectIterators.js
new file mode 100644
index 0000000..16f7336
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/objectIterators.js
@@ -0,0 +1,27 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.objectReduceKey = exports.objectMapKey = exports.objectForEachKey = void 0;
+function objectForEachKey(obj, callback) {
+    const keys = Object.keys(obj);
+    for (const key of keys) {
+        callback(key);
+    }
+}
+exports.objectForEachKey = objectForEachKey;
+function objectMapKey(obj, callback) {
+    const values = [];
+    objectForEachKey(obj, key => {
+        values.push(callback(key));
+    });
+    return values;
+}
+exports.objectMapKey = objectMapKey;
+function objectReduceKey(obj, callback, initial) {
+    let accumulator = initial;
+    objectForEachKey(obj, key => {
+        accumulator = callback(accumulator, key);
+    });
+    return accumulator;
+}
+exports.objectReduceKey = objectReduceKey;
+//# sourceMappingURL=objectIterators.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/objectIterators.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/util/objectIterators.js.map
new file mode 100644
index 0000000..82a35bf
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/objectIterators.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"objectIterators.js","sourceRoot":"","sources":["../../src/util/objectIterators.ts"],"names":[],"mappings":";;;AAAA,SAAS,gBAAgB,CACvB,GAAM,EACN,QAAgC;IAEhC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACtB,QAAQ,CAAC,GAAG,CAAC,CAAC;KACf;AACH,CAAC;AAyBQ,4CAAgB;AAvBzB,SAAS,YAAY,CACnB,GAAM,EACN,QAAmC;IAEnC,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;QAC1B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAc0B,oCAAY;AAZvC,SAAS,eAAe,CACtB,GAAM,EACN,QAA2D,EAC3D,OAAqB;IAErB,IAAI,WAAW,GAAG,OAAO,CAAC;IAC1B,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;QAC1B,WAAW,GAAG,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,OAAO,WAAW,CAAC;AACrB,CAAC;AAEwC,0CAAe"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/propertyTypes.js b/node_modules/@typescript-eslint/eslint-plugin/dist/util/propertyTypes.js
new file mode 100644
index 0000000..6470d8f
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/propertyTypes.js
@@ -0,0 +1,23 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getTypeOfPropertyOfType = exports.getTypeOfPropertyOfName = void 0;
+function getTypeOfPropertyOfName(checker, type, name, escapedName) {
+    // Most names are directly usable in the checker and aren't different from escaped names
+    if (!escapedName || !name.startsWith('__')) {
+        return checker.getTypeOfPropertyOfType(type, name);
+    }
+    // Symbolic names may differ in their escaped name compared to their human-readable name
+    // https://github.com/typescript-eslint/typescript-eslint/issues/2143
+    const escapedProperty = type
+        .getProperties()
+        .find(property => property.escapedName === escapedName);
+    return escapedProperty
+        ? checker.getDeclaredTypeOfSymbol(escapedProperty)
+        : undefined;
+}
+exports.getTypeOfPropertyOfName = getTypeOfPropertyOfName;
+function getTypeOfPropertyOfType(checker, type, property) {
+    return getTypeOfPropertyOfName(checker, type, property.getName(), property.getEscapedName());
+}
+exports.getTypeOfPropertyOfType = getTypeOfPropertyOfType;
+//# sourceMappingURL=propertyTypes.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/propertyTypes.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/util/propertyTypes.js.map
new file mode 100644
index 0000000..06e4a07
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/propertyTypes.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"propertyTypes.js","sourceRoot":"","sources":["../../src/util/propertyTypes.ts"],"names":[],"mappings":";;;AAEA,SAAgB,uBAAuB,CACrC,OAAuB,EACvB,IAAa,EACb,IAAY,EACZ,WAAyB;IAEzB,wFAAwF;IACxF,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QAC1C,OAAO,OAAO,CAAC,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACpD;IAED,wFAAwF;IACxF,qEAAqE;IACrE,MAAM,eAAe,GAAG,IAAI;SACzB,aAAa,EAAE;SACf,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;IAE1D,OAAO,eAAe;QACpB,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,eAAe,CAAC;QAClD,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AApBD,0DAoBC;AAED,SAAgB,uBAAuB,CACrC,OAAuB,EACvB,IAAa,EACb,QAAmB;IAEnB,OAAO,uBAAuB,CAC5B,OAAO,EACP,IAAI,EACJ,QAAQ,CAAC,OAAO,EAAE,EAClB,QAAQ,CAAC,cAAc,EAAE,CAC1B,CAAC;AACJ,CAAC;AAXD,0DAWC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/types.js b/node_modules/@typescript-eslint/eslint-plugin/dist/util/types.js
index 47b7b58..bb543a3 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/types.js
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/types.js
@@ -1,14 +1,45 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.getContextualType = exports.isUnsafeAssignment = exports.isAnyOrAnyArrayTypeDiscriminated = exports.isTypeUnknownArrayType = exports.isTypeAnyArrayType = exports.isTypeAnyType = exports.isTypeUnknownType = exports.getTypeArguments = exports.getEqualsKind = exports.getTokenAtPosition = exports.getSourceFileOfNode = exports.typeIsOrHasBaseType = exports.isTypeFlagSet = exports.getTypeFlags = exports.getDeclaration = exports.isNullableType = exports.getConstrainedTypeAtLocation = exports.getTypeName = exports.containsAllTypesByName = exports.isTypeArrayTypeOrUnionOfArrayTypes = void 0;
+const debug_1 = __importDefault(require("debug"));
 const tsutils_1 = require("tsutils");
 const ts = __importStar(require("typescript"));
+const log = debug_1.default('typescript-eslint:eslint-plugin:utils:types');
+/**
+ * Checks if the given type is either an array type,
+ * or a union made up solely of array types.
+ */
+function isTypeArrayTypeOrUnionOfArrayTypes(type, checker) {
+    for (const t of tsutils_1.unionTypeParts(type)) {
+        if (!checker.isArrayType(t)) {
+            return false;
+        }
+    }
+    return true;
+}
+exports.isTypeArrayTypeOrUnionOfArrayTypes = isTypeArrayTypeOrUnionOfArrayTypes;
 /**
  * @param type Type being checked by name.
  * @param allowedNames Symbol names checking on the type.
@@ -21,8 +52,8 @@
     if (tsutils_1.isTypeReference(type)) {
         type = type.target;
     }
-    if (typeof type.symbol !== 'undefined' &&
-        allowedNames.has(type.symbol.name)) {
+    const symbol = type.getSymbol();
+    if (symbol && allowedNames.has(symbol.name)) {
         return true;
     }
     if (tsutils_1.isUnionOrIntersectionType(type)) {
@@ -51,9 +82,12 @@
         // `type.getConstraint()` method doesn't return the constraint type of
         // the type parameter for some reason. So this gets the constraint type
         // via AST.
-        const node = type.symbol.declarations[0];
-        if (node.constraint != null) {
-            return getTypeName(typeChecker, typeChecker.getTypeFromTypeNode(node.constraint));
+        const symbol = type.getSymbol();
+        const decls = symbol === null || symbol === void 0 ? void 0 : symbol.getDeclarations();
+        const typeParamDecl = decls === null || decls === void 0 ? void 0 : decls[0];
+        if (ts.isTypeParameterDeclaration(typeParamDecl) &&
+            typeParamDecl.constraint != null) {
+            return getTypeName(typeChecker, typeChecker.getTypeFromTypeNode(typeParamDecl.constraint));
         }
     }
     // If the type is a union and all types in the union are string like,
@@ -83,7 +117,7 @@
 function getConstrainedTypeAtLocation(checker, node) {
     const nodeType = checker.getTypeAtLocation(node);
     const constrained = checker.getBaseConstraintOfType(nodeType);
-    return (constrained !== null && constrained !== void 0 ? constrained : nodeType);
+    return constrained !== null && constrained !== void 0 ? constrained : nodeType;
 }
 exports.getConstrainedTypeAtLocation = getConstrainedTypeAtLocation;
 /**
@@ -107,15 +141,13 @@
  * Gets the declaration for the given variable
  */
 function getDeclaration(checker, node) {
+    var _a;
     const symbol = checker.getSymbolAtLocation(node);
     if (!symbol) {
         return null;
     }
-    const declarations = symbol.declarations;
-    if (!declarations) {
-        return null;
-    }
-    return declarations[0];
+    const declarations = symbol.getDeclarations();
+    return (_a = declarations === null || declarations === void 0 ? void 0 : declarations[0]) !== null && _a !== void 0 ? _a : null;
 }
 exports.getDeclaration = getDeclaration;
 /**
@@ -145,17 +177,18 @@
  * @returns Whether a type is an instance of the parent type, including for the parent's base types.
  */
 function typeIsOrHasBaseType(type, parentType) {
-    if (type.symbol === undefined || parentType.symbol === undefined) {
+    const parentSymbol = parentType.getSymbol();
+    if (!type.getSymbol() || !parentSymbol) {
         return false;
     }
     const typeAndBaseTypes = [type];
     const ancestorTypes = type.getBaseTypes();
-    if (ancestorTypes !== undefined) {
+    if (ancestorTypes) {
         typeAndBaseTypes.push(...ancestorTypes);
     }
     for (const baseType of typeAndBaseTypes) {
-        if (baseType.symbol !== undefined &&
-            baseType.symbol.name === parentType.symbol.name) {
+        const baseSymbol = baseType.getSymbol();
+        if (baseSymbol && baseSymbol.name === parentSymbol.name) {
             return true;
         }
     }
@@ -214,7 +247,7 @@
             };
         case '!==':
             return {
-                isPositive: true,
+                isPositive: false,
                 isStrict: true,
             };
         default:
@@ -222,4 +255,157 @@
     }
 }
 exports.getEqualsKind = getEqualsKind;
+function getTypeArguments(type, checker) {
+    var _a;
+    // getTypeArguments was only added in TS3.7
+    if (checker.getTypeArguments) {
+        return checker.getTypeArguments(type);
+    }
+    return (_a = type.typeArguments) !== null && _a !== void 0 ? _a : [];
+}
+exports.getTypeArguments = getTypeArguments;
+/**
+ * @returns true if the type is `unknown`
+ */
+function isTypeUnknownType(type) {
+    return isTypeFlagSet(type, ts.TypeFlags.Unknown);
+}
+exports.isTypeUnknownType = isTypeUnknownType;
+/**
+ * @returns true if the type is `any`
+ */
+function isTypeAnyType(type) {
+    if (isTypeFlagSet(type, ts.TypeFlags.Any)) {
+        if (type.intrinsicName === 'error') {
+            log('Found an "error" any type');
+        }
+        return true;
+    }
+    return false;
+}
+exports.isTypeAnyType = isTypeAnyType;
+/**
+ * @returns true if the type is `any[]`
+ */
+function isTypeAnyArrayType(type, checker) {
+    return (checker.isArrayType(type) &&
+        isTypeAnyType(
+        // getTypeArguments was only added in TS3.7
+        getTypeArguments(type, checker)[0]));
+}
+exports.isTypeAnyArrayType = isTypeAnyArrayType;
+/**
+ * @returns true if the type is `unknown[]`
+ */
+function isTypeUnknownArrayType(type, checker) {
+    return (checker.isArrayType(type) &&
+        isTypeUnknownType(
+        // getTypeArguments was only added in TS3.7
+        getTypeArguments(type, checker)[0]));
+}
+exports.isTypeUnknownArrayType = isTypeUnknownArrayType;
+/**
+ * @returns `AnyType.Any` if the type is `any`, `AnyType.AnyArray` if the type is `any[]` or `readonly any[]`,
+ *          otherwise it returns `AnyType.Safe`.
+ */
+function isAnyOrAnyArrayTypeDiscriminated(node, checker) {
+    const type = checker.getTypeAtLocation(node);
+    if (isTypeAnyType(type)) {
+        return 0 /* Any */;
+    }
+    if (isTypeAnyArrayType(type, checker)) {
+        return 1 /* AnyArray */;
+    }
+    return 2 /* Safe */;
+}
+exports.isAnyOrAnyArrayTypeDiscriminated = isAnyOrAnyArrayTypeDiscriminated;
+/**
+ * Does a simple check to see if there is an any being assigned to a non-any type.
+ *
+ * This also checks generic positions to ensure there's no unsafe sub-assignments.
+ * Note: in the case of generic positions, it makes the assumption that the two types are the same.
+ *
+ * @example See tests for examples
+ *
+ * @returns false if it's safe, or an object with the two types if it's unsafe
+ */
+function isUnsafeAssignment(type, receiver, checker) {
+    var _a, _b;
+    if (isTypeAnyType(type)) {
+        // Allow assignment of any ==> unknown.
+        if (isTypeUnknownType(receiver)) {
+            return false;
+        }
+        if (!isTypeAnyType(receiver)) {
+            return { sender: type, receiver };
+        }
+    }
+    if (tsutils_1.isTypeReference(type) && tsutils_1.isTypeReference(receiver)) {
+        // TODO - figure out how to handle cases like this,
+        // where the types are assignable, but not the same type
+        /*
+        function foo(): ReadonlySet<number> { return new Set<any>(); }
+    
+        // and
+    
+        type Test<T> = { prop: T }
+        type Test2 = { prop: string }
+        declare const a: Test<any>;
+        const b: Test2 = a;
+        */
+        if (type.target !== receiver.target) {
+            // if the type references are different, assume safe, as we won't know how to compare the two types
+            // the generic positions might not be equivalent for both types
+            return false;
+        }
+        const typeArguments = (_a = type.typeArguments) !== null && _a !== void 0 ? _a : [];
+        const receiverTypeArguments = (_b = receiver.typeArguments) !== null && _b !== void 0 ? _b : [];
+        for (let i = 0; i < typeArguments.length; i += 1) {
+            const arg = typeArguments[i];
+            const receiverArg = receiverTypeArguments[i];
+            const unsafe = isUnsafeAssignment(arg, receiverArg, checker);
+            if (unsafe) {
+                return { sender: type, receiver };
+            }
+        }
+        return false;
+    }
+    return false;
+}
+exports.isUnsafeAssignment = isUnsafeAssignment;
+/**
+ * Returns the contextual type of a given node.
+ * Contextual type is the type of the target the node is going into.
+ * i.e. the type of a called function's parameter, or the defined type of a variable declaration
+ */
+function getContextualType(checker, node) {
+    const parent = node.parent;
+    if (!parent) {
+        return;
+    }
+    if (tsutils_1.isCallExpression(parent) || tsutils_1.isNewExpression(parent)) {
+        if (node === parent.expression) {
+            // is the callee, so has no contextual type
+            return;
+        }
+    }
+    else if (tsutils_1.isVariableDeclaration(parent) ||
+        tsutils_1.isPropertyDeclaration(parent) ||
+        tsutils_1.isParameterDeclaration(parent)) {
+        return parent.type ? checker.getTypeFromTypeNode(parent.type) : undefined;
+    }
+    else if (tsutils_1.isJsxExpression(parent)) {
+        return checker.getContextualType(parent);
+    }
+    else if (tsutils_1.isPropertyAssignment(parent) && tsutils_1.isIdentifier(node)) {
+        return checker.getContextualType(node);
+    }
+    else if (![ts.SyntaxKind.TemplateSpan, ts.SyntaxKind.JsxExpression].includes(parent.kind)) {
+        // parent is not something we know we can get the contextual type of
+        return;
+    }
+    // TODO - support return statement checking
+    return checker.getContextualType(node);
+}
+exports.getContextualType = getContextualType;
 //# sourceMappingURL=types.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/dist/util/types.js.map b/node_modules/@typescript-eslint/eslint-plugin/dist/util/types.js.map
index 8d55857..275e1ee 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/dist/util/types.js.map
+++ b/node_modules/@typescript-eslint/eslint-plugin/dist/util/types.js.map
@@ -1 +1 @@
-{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/util/types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/util/types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-ts-comment.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-ts-comment.md
index 58f99dc..2509793 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-ts-comment.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-ts-comment.md
@@ -1,11 +1,12 @@
-# Bans `// @ts-<directive>` comments from being used (`ban-ts-comment`)
+# Bans `// @ts-<directive>` comments from being used or requires descriptions after directive (`ban-ts-comment`)
 
 TypeScript provides several directive comments that can be used to alter how it processes files.
 Using these to suppress TypeScript Compiler Errors reduces the effectiveness of TypeScript overall.
 
 The directive comments supported by TypeScript are:
 
-```
+```ts
+// @ts-expect-error
 // @ts-ignore
 // @ts-nocheck
 // @ts-check
@@ -14,24 +15,30 @@
 ## Rule Details
 
 This rule lets you set which directive comments you want to allow in your codebase.
-By default, only `@ts-check` is allowed, as it enables rather then suppresses errors.
+By default, only `@ts-check` is allowed, as it enables rather than suppresses errors.
 
 The configuration looks like this:
 
-```
+```ts
 interface Options {
-  'ts-ignore'?: boolean;
-  'ts-nocheck'?: boolean;
-  'ts-check'?: boolean;
+  'ts-expect-error'?: boolean | 'allow-with-description';
+  'ts-ignore'?: boolean | 'allow-with-description';
+  'ts-nocheck'?: boolean | 'allow-with-description';
+  'ts-check'?: boolean | 'allow-with-description';
+  minimumDescriptionLength?: number;
 }
 
 const defaultOptions: Options = {
+  'ts-expect-error': 'allow-with-description',
   'ts-ignore': true,
   'ts-nocheck': true,
-  'ts-check': false
-}
+  'ts-check': false,
+  minimumDescriptionLength: 3,
+};
 ```
 
+### `ts-expect-error`, `ts-ignore`, `ts-nocheck`, `ts-check` directives
+
 A value of `true` for a particular directive means that this rule will report if it finds any usage of said directive.
 
 For example, with the defaults above the following patterns are considered warnings:
@@ -52,6 +59,50 @@
 }
 ```
 
+### `allow-with-description`
+
+A value of `'allow-with-description'` for a particular directive means that this rule will report if it finds a directive that does not have a description following the directive (on the same line).
+
+For example, with `{ 'ts-expect-error': 'allow-with-description' }` the following pattern is considered a warning:
+
+```ts
+if (false) {
+  // @ts-expect-error
+  console.log('hello');
+}
+```
+
+The following pattern is not a warning:
+
+```ts
+if (false) {
+  // @ts-expect-error: Unreachable code error
+  console.log('hello');
+}
+```
+
+### `minimumDescriptionLength`
+
+Use `minimumDescriptionLength` to set a minimum length for descriptions when using the `allow-with-description` option for a directive.
+
+For example, with `{ 'ts-expect-error': 'allow-with-description', minimumDescriptionLength: 10 }` the following pattern is considered a warning:
+
+```ts
+if (false) {
+  // @ts-expect-error: TODO
+  console.log('hello');
+}
+```
+
+The following pattern is not a warning:
+
+```ts
+if (false) {
+  // @ts-expect-error The rationale for this override is described in issue #1337 on GitLab
+  console.log('hello');
+}
+```
+
 ## When Not To Use It
 
 If you want to use all of the TypeScript directives.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-ts-ignore.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-ts-ignore.md
deleted file mode 100644
index 8f69c86..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-ts-ignore.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# Bans “// @ts-ignore” comments from being used (`ban-ts-ignore`)
-
-This rule has been deprecated in favor of [`ban-ts-comment`](./ban-ts-comment.md)
-
-Suppressing TypeScript Compiler Errors can be hard to discover.
-
-## Rule Details
-
-Does not allow the use of `// @ts-ignore` comments.
-
-The following patterns are considered warnings:
-
-```ts
-if (false) {
-  // @ts-ignore: Unreachable code error
-  console.log('hello');
-}
-```
-
-The following patterns are not warnings:
-
-```ts
-if (false) {
-  // Compiler warns about unreachable code error
-  console.log('hello');
-}
-```
-
-## When Not To Use It
-
-If you are sure, compiler errors won't affect functionality and you need to disable them.
-
-## Further Reading
-
-- TypeScript [Type Checking JavaScript Files](https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html)
-
-## Compatibility
-
-- TSLint: [ban-ts-ignore](https://palantir.github.io/tslint/rules/ban-ts-ignore/)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-tslint-comment.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-tslint-comment.md
new file mode 100644
index 0000000..6af168f
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-tslint-comment.md
@@ -0,0 +1,29 @@
+# Bans `// tslint:<rule-flag>` comments from being used (`ban-tslint-comment`)
+
+Useful when migrating from TSLint to ESLint. Once TSLint has been removed, this rule helps locate TSLint annotations (e.g. `// tslint:disable`).
+
+## Rule Details
+
+Examples of **incorrect** code for this rule:
+
+All TSLint [rule flags](https://palantir.github.io/tslint/usage/rule-flags/)
+
+```js
+/* tslint:disable */
+/* tslint:enable */
+/* tslint:disable:rule1 rule2 rule3... */
+/* tslint:enable:rule1 rule2 rule3... */
+// tslint:disable-next-line
+someCode(); // tslint:disable-line
+// tslint:disable-next-line:rule1 rule2 rule3...
+```
+
+Examples of **correct** code for this rule:
+
+```js
+// This is a comment that just happens to mention tslint
+```
+
+## When Not To Use It
+
+If you are still using TSLint.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-types.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-types.md
index e92e57b..ab8320d 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-types.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/ban-types.md
@@ -1,93 +1,62 @@
 # Bans specific types from being used (`ban-types`)
 
-This rule bans specific types and can suggest alternatives. It does not ban the
-corresponding runtime objects from being used.
+Some builtin types have aliases, some types are considered dangerous or harmful.
+It's often a good idea to ban certain types to help with consistency and safety.
 
 ## Rule Details
 
-Examples of **incorrect** code for this rule `"String": "Use string instead"`
-
-```ts
-class Foo<F = String> extends Bar<String> implements Baz<String> {
-  constructor(foo: String) {}
-
-  exit(): Array<String> {
-    const foo: String = 1 as String;
-  }
-}
-```
-
-Examples of **correct** code for this rule `"String": "Use string instead"`
-
-```ts
-class Foo<F = string> extends Bar<string> implements Baz<string> {
-  constructor(foo: string) {}
-
-  exit(): Array<string> {
-    const foo: string = 1 as string;
-  }
-}
-```
+This rule bans specific types and can suggest alternatives.
+Note that it does not ban the corresponding runtime objects from being used.
 
 ## Options
 
-The banned type can either be a type name literal (`Foo`), a type name with generic parameter instantiations(s) (`Foo<Bar>`), or the empty object literal (`{}`).
-
-```CJSON
-{
-    "@typescript-eslint/ban-types": ["error", {
-        "types": {
-            // report usages of the type using the default error message
-            "Foo": null,
-
-            // add a custom message to help explain why not to use it
-            "Bar": "Don't use bar!",
-
-            // add a custom message, AND tell the plugin how to fix it
-            "String": {
-                "message": "Use string instead",
-                "fixWith": "string"
-            }
-
-            "{}": {
-              "message": "Use object instead",
-              "fixWith": "object"
-            }
-        }
-    }]
-}
+```ts
+type Options = {
+  types?: {
+    [typeName: string]:
+      | false
+      | string
+      | {
+          message: string;
+          fixWith?: string;
+        };
+  };
+  extendDefaults?: boolean;
+};
 ```
 
-By default, this rule includes types which are likely to be mistakes, such as `String` and `Number`. If you don't want these enabled, set the `extendDefaults` option to `false`:
+The rule accepts a single object as options, with the following keys:
 
-```CJSON
-{
-    "@typescript-eslint/ban-types": ["error", {
-        "types": {
-            // add a custom message, AND tell the plugin how to fix it
-            "String": {
-                "message": "Use string instead",
-                "fixWith": "string"
-            }
-        },
-        "extendDefaults": false
-    }]
-}
-```
+- `types` - An object whose keys are the types you want to ban, and the values are error messages.
+  - The type can either be a type name literal (`Foo`), a type name with generic parameter instantiation(s) (`Foo<Bar>`), or the empty object literal (`{}`).
+  - The values can be a string, which is the error message to be reported, `false` to specifically disable this type
+    or it can be an object with the following properties:
+    - `message: string` - the message to display when the type is matched.
+    - `fixWith?: string` - a string to replace the banned type with when the fixer is run. If this is omitted, no fix will be done.
+- `extendDefaults` - if you're specifying custom `types`, you can set this to `true` to extend the default `types` configuration.
+  - This is a convenience option to save you copying across the defaults when adding another type.
+  - If this is `false`, the rule will _only_ use the types defined in your configuration.
 
-### Example
+Example configuration:
 
-```json
+```jsonc
 {
   "@typescript-eslint/ban-types": [
     "error",
     {
       "types": {
-        "Array": null,
-        "Object": "Use {} instead",
+        // add a custom message to help explain why not to use it
+        "Foo": "Don't use Foo because it is unsafe",
+
+        // add a custom message, AND tell the plugin how to fix it
         "String": {
           "message": "Use string instead",
           "fixWith": "string"
+        },
+
+        "{}": {
+          "message": "Use object instead",
+          "fixWith": "object"
         }
       }
     }
@@ -95,6 +64,124 @@
 }
 ```
 
+### Default Options
+
+The default options provide a set of "best practices", intended to provide safety and standardization in your codebase:
+
+- Don't use the upper-case primitive types, you should use the lower-case types for consistency.
+- Avoid the `Function` type, as it provides little safety for the following reasons:
+  - It provides no type safety when calling the value, which means it's easy to provide the wrong arguments.
+  - It accepts class declarations, which will fail when called, as they are called without the `new` keyword.
+- Avoid the `Object` and `{}` types, as they mean "any non-nullish value".
+  - This is a point of confusion for many developers, who think it means "any object type".
+- Avoid the `object` type, as it is currently hard to use due to not being able to assert that keys exist.
+  - See [microsoft/TypeScript#21732](https://github.com/microsoft/TypeScript/issues/21732).
+
+**_Important note:_** the default options suggest using `Record<string, unknown>`; this was a stylistic decision, as the built-in `Record` type is considered to look cleaner.
+
+<details>
+<summary>Default Options</summary>
+
+```ts
+const defaultTypes = {
+  String: {
+    message: 'Use string instead',
+    fixWith: 'string',
+  },
+  Boolean: {
+    message: 'Use boolean instead',
+    fixWith: 'boolean',
+  },
+  Number: {
+    message: 'Use number instead',
+    fixWith: 'number',
+  },
+  Symbol: {
+    message: 'Use symbol instead',
+    fixWith: 'symbol',
+  },
+
+  Function: {
+    message: [
+      'The `Function` type accepts any function-like value.',
+      'It provides no type safety when calling the function, which can be a common source of bugs.',
+      'It also accepts things like class declarations, which will throw at runtime as they will not be called with `new`.',
+      'If you are expecting the function to accept certain arguments, you should explicitly define the function shape.',
+    ].join('\n'),
+  },
+
+  // object typing
+  Object: {
+    message: [
+      'The `Object` type actually means "any non-nullish value", so it is marginally better than `unknown`.',
+      '- If you want a type meaning "any object", you probably want `Record<string, unknown>` instead.',
+      '- If you want a type meaning "any value", you probably want `unknown` instead.',
+    ].join('\n'),
+  },
+  '{}': {
+    message: [
+      '`{}` actually means "any non-nullish value".',
+      '- If you want a type meaning "any object", you probably want `Record<string, unknown>` instead.',
+      '- If you want a type meaning "any value", you probably want `unknown` instead.',
+    ].join('\n'),
+  },
+  object: {
+    message: [
+      'The `object` type is currently hard to use ([see this issue](https://github.com/microsoft/TypeScript/issues/21732)).',
+      'Consider using `Record<string, unknown>` instead, as it allows you to more easily inspect and use the keys.',
+    ].join('\n'),
+  },
+};
+```
+
+</details>
+
+### Examples
+
+Examples of **incorrect** code with the default options:
+
+```ts
+// use lower-case primitives for consistency
+const str: String = 'foo';
+const bool: Boolean = true;
+const num: Number = 1;
+const symb: Symbol = Symbol('foo');
+
+// use a proper function type
+const func: Function = () => 1;
+
+// use safer object types
+const lowerObj: object = {};
+
+const capitalObj1: Object = 1;
+const capitalObj2: Object = { a: 'string' };
+
+const curly1: {} = 1;
+const curly2: {} = { a: 'string' };
+```
+
+Examples of **correct** code with the default options:
+
+```ts
+// use lower-case primitives for consistency
+const str: string = 'foo';
+const bool: boolean = true;
+const num: number = 1;
+const symb: symbol = Symbol('foo');
+
+// use a proper function type
+const func: () => number = () => 1;
+
+// use safer object types
+const lowerObj: Record<string, unknown> = {};
+
+const capitalObj1: number = 1;
+const capitalObj2: { a: string } = { a: 'string' };
+
+const curly1: number = 1;
+const curly2: Record<'a', string> = { a: 'string' };
+```
+
 ## Compatibility
 
 - TSLint: [ban-types](https://palantir.github.io/tslint/rules/ban-types/)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/brace-style.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/brace-style.md
index c8268de..06dfa16 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/brace-style.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/brace-style.md
@@ -3,11 +3,11 @@
 ## Rule Details
 
 This rule extends the base [`eslint/brace-style`](https://eslint.org/docs/rules/brace-style) rule.
-It supports all options and features of the base rule.
+It adds support for `enum`, `interface`, `namespace` and `module` declarations.
 
 ## How to use
 
-```cjson
+```jsonc
 {
   // note you must disable the base rule as it can report incorrect errors
   "brace-style": "off",
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/camelcase.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/camelcase.md
index f0b49d0..cea2822 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/camelcase.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/camelcase.md
@@ -1,298 +1,8 @@
-# Enforce camelCase naming convention (`camelcase`)
+## DEPRECATED
 
-When it comes to naming variables, style guides generally fall into one of two
-camps: camelCase (`variableName`) and underscores (`variable_name`). This rule
-focuses on using the camelCase approach. If your style guide calls for
-camelCasing your variable names, then this rule is for you!
+This rule has been deprecated in favour of the [`naming-convention`](./naming-convention.md) rule.
 
-## Rule Details
-
-This rule looks for any underscores (`_`) located within the source code.
-It ignores leading and trailing underscores and only checks those in the middle
-of a variable name. If ESLint decides that the variable is a constant
-(all uppercase), then no warning will be thrown. Otherwise, a warning will be
-thrown. This rule only flags definitions and assignments but not function calls.
-In case of ES6 `import` statements, this rule only targets the name of the
-variable that will be imported into the local module scope.
-
-**_This rule was taken from the ESLint core rule `camelcase`._**
-**_Available options and test cases may vary depending on the version of ESLint installed in the system._**
-
-## Options
-
-```cjson
-{
-    // note you must disable the base rule as it can report incorrect errors
-    "camelcase": "off",
-    "@typescript-eslint/camelcase": ["error", { "properties": "always" }]
-}
-```
-
-This rule has an object option:
-
-- `"properties": "never"` (default) does not check property names
-- `"properties": "always"` enforces camelCase style for property names
-- `"genericType": "never"` (default) does not check generic identifiers
-- `"genericType": "always"` enforces camelCase style for generic identifiers
-- `"ignoreDestructuring": false` (default) enforces camelCase style for destructured identifiers
-- `"ignoreDestructuring": true` does not check destructured identifiers
-- `allow` (`string[]`) list of properties to accept. Accept regex.
-
-### properties: "always"
-
-Examples of **incorrect** code for this rule with the default `{ "properties": "always" }` option:
-
-```js
-/*eslint @typescript-eslint/camelcase: "error"*/
-
-import { no_camelcased } from 'external-module';
-
-var my_favorite_color = '#112C85';
-
-function do_something() {
-  // ...
-}
-
-obj.do_something = function() {
-  // ...
-};
-
-function foo({ no_camelcased }) {
-  // ...
-}
-
-function foo({ isCamelcased: no_camelcased }) {
-  // ...
-}
-
-function foo({ no_camelcased = 'default value' }) {
-  // ...
-}
-
-var obj = {
-  my_pref: 1,
-};
-
-var { category_id = 1 } = query;
-
-var { foo: no_camelcased } = bar;
-
-var { foo: bar_baz = 1 } = quz;
-```
-
-Examples of **correct** code for this rule with the default `{ "properties": "always" }` option:
-
-```js
-/*eslint @typescript-eslint/camelcase: "error"*/
-
-import { no_camelcased as camelCased } from 'external-module';
-
-var myFavoriteColor = '#112C85';
-var _myFavoriteColor = '#112C85';
-var myFavoriteColor_ = '#112C85';
-var MY_FAVORITE_COLOR = '#112C85';
-var foo = bar.baz_boom;
-var foo = { qux: bar.baz_boom };
-
-obj.do_something();
-do_something();
-new do_something();
-
-var { category_id: category } = query;
-
-function foo({ isCamelCased }) {
-  // ...
-}
-
-function foo({ isCamelCased: isAlsoCamelCased }) {
-  // ...
-}
-
-function foo({ isCamelCased = 'default value' }) {
-  // ...
-}
-
-var { categoryId = 1 } = query;
-
-var { foo: isCamelCased } = bar;
-
-var { foo: isCamelCased = 1 } = quz;
-```
-
-### `properties: "never"`
-
-Examples of **correct** code for this rule with the `{ "properties": "never" }` option:
-
-```js
-/*eslint @typescript-eslint/camelcase: ["error", {properties: "never"}]*/
-
-var obj = {
-  my_pref: 1,
-};
-```
-
-### `genericType: "always"`
-
-Examples of **incorrect** code for this rule with the default `{ "genericType": "always" }` option:
-
-```typescript
-/* eslint @typescript-eslint/camelcase: ["error", { "genericType": "always" }] */
-
-interface Foo<t_foo> {}
-function foo<t_foo>() {}
-class Foo<t_foo> {}
-type Foo<t_foo> = {};
-class Foo {
-  method<t_foo>() {}
-}
-
-interface Foo<t_foo extends object> {}
-function foo<t_foo extends object>() {}
-class Foo<t_foo extends object> {}
-type Foo<t_foo extends object> = {};
-class Foo {
-  method<t_foo extends object>() {}
-}
-
-interface Foo<t_foo = object> {}
-function foo<t_foo = object>() {}
-class Foo<t_foo = object> {}
-type Foo<t_foo = object> = {};
-class Foo {
-  method<t_foo = object>() {}
-}
-```
-
-Examples of **correct** code for this rule with the default `{ "genericType": "always" }` option:
-
-```typescript
-/* eslint @typescript-eslint/camelcase: ["error", { "genericType": "always" }] */
-
-interface Foo<T> {}
-function foo<t>() {}
-class Foo<T> {}
-type Foo<T> = {};
-class Foo {
-  method<T>() {}
-}
-
-interface Foo<T extends object> {}
-function foo<T extends object>() {}
-class Foo<T extends object> {}
-type Foo<T extends object> = {};
-class Foo {
-  method<T extends object>() {}
-}
-
-interface Foo<T = object> {}
-function foo<T = object>() {}
-class Foo<T = object> {}
-type Foo<T = object> = {};
-class Foo {
-  method<T = object>() {}
-}
-```
-
-### `genericType: "never"`
-
-Examples of **correct** code for this rule with the `{ "genericType": "never" }` option:
-
-```typescript
-/* eslint @typescript-eslint/camelcase: ["error", { "genericType": "never" }] */
-
-interface Foo<t_foo> {}
-function foo<t_foo>() {}
-class Foo<t_foo> {}
-type Foo<t_foo> = {};
-class Foo {
-  method<t_foo>() {}
-}
-
-interface Foo<t_foo extends object> {}
-function foo<t_foo extends object>() {}
-class Foo<t_foo extends object> {}
-type Foo<t_foo extends object> = {};
-class Foo {
-  method<t_foo extends object>() {}
-}
-
-interface Foo<t_foo = object> {}
-function foo<t_foo = object>() {}
-class Foo<t_foo = object> {}
-type Foo<t_foo = object> = {};
-class Foo {
-  method<t_foo = object>() {}
-}
-```
-
-### `ignoreDestructuring: false`
-
-Examples of **incorrect** code for this rule with the default `{ "ignoreDestructuring": false }` option:
-
-```js
-/*eslint @typescript-eslint/camelcase: "error"*/
-
-var { category_id } = query;
-
-var { category_id = 1 } = query;
-
-var { category_id: category_id } = query;
-
-var { category_id: category_alias } = query;
-
-var { category_id: categoryId, ...other_props } = query;
-```
-
-### `ignoreDestructuring: true`
-
-Examples of **incorrect** code for this rule with the `{ "ignoreDestructuring": true }` option:
-
-```js
-/*eslint @typescript-eslint/camelcase: ["error", {ignoreDestructuring: true}]*/
-
-var { category_id: category_alias } = query;
-
-var { category_id, ...other_props } = query;
-```
-
-Examples of **correct** code for this rule with the `{ "ignoreDestructuring": true }` option:
-
-```js
-/*eslint @typescript-eslint/camelcase: ["error", {ignoreDestructuring: true}]*/
-
-var { category_id } = query;
-
-var { category_id = 1 } = query;
-
-var { category_id: category_id } = query;
-```
-
-## allow
-
-Examples of **correct** code for this rule with the `allow` option:
-
-```js
-/*eslint @typescript-eslint/camelcase: ["error", {allow: ["UNSAFE_componentWillMount"]}]*/
-
-function UNSAFE_componentWillMount() {
-  // ...
-}
-```
-
-```js
-/*eslint @typescript-eslint/camelcase: ["error", {allow: ["^UNSAFE_"]}]*/
-
-function UNSAFE_componentWillMount() {
-  // ...
-}
-
-function UNSAFE_componentWillMount() {
-  // ...
-}
-```
-
-## When Not To Use It
-
-If you have established coding standards using a different naming convention (separating words with underscores), turn this rule off.
-
-<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/camelcase.md)</sup>
+<!--
+This doc file has been left on purpose because `camelcase` is a core eslint rule.
+This exists to help direct people to the replacement rule.
+-->
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/class-literal-property-style.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/class-literal-property-style.md
new file mode 100644
index 0000000..1bca839
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/class-literal-property-style.md
@@ -0,0 +1,96 @@
+# Ensures that literals on classes are exposed in a consistent style (`class-literal-property-style`)
+
+When writing TypeScript applications, it's typically safe to store literal values on classes using fields with the `readonly` modifier to prevent them from being reassigned.
+When writing TypeScript libraries that could be used by JavaScript users however, it's typically safer to expose these literals using `getter`s, since the `readonly` modifier is enforced at compile type.
+
+## Rule Details
+
+This rule aims to ensure that literals exposed by classes are done so consistently, in one of the two style described above.
+By default this rule prefers the `fields` style as it means JS doesn't have to setup & teardown a function closure.
+
+Note that this rule only checks for constant _literal_ values (string, template string, number, bigint, boolean, regexp, null). It does not check objects or arrays, because a readonly field behaves differently to a getter in those cases. It also does not check functions, as it is a common pattern to use readonly fields with arrow function values as auto-bound methods.
+This is because these types can be mutated and carry with them more complex implications about their usage.
+
+### The `fields` style
+
+This style checks for any getter methods that return literal values, and requires them to be defined using fields with the `readonly` modifier instead.
+
+Examples of **correct** code with the `fields` style:
+
+```ts
+/* eslint @typescript-eslint/class-literal-property-style: ["error", "fields"] */
+
+class Mx {
+  public readonly myField1 = 1;
+
+  // not a literal
+  public readonly myField2 = [1, 2, 3];
+
+  private readonly ['myField3'] = 'hello world';
+
+  public get myField4() {
+    return `hello from ${window.location.href}`;
+  }
+}
+```
+
+Examples of **incorrect** code with the `fields` style:
+
+```ts
+/* eslint @typescript-eslint/class-literal-property-style: ["error", "fields"] */
+
+class Mx {
+  public static get myField1() {
+    return 1;
+  }
+
+  private get ['myField2']() {
+    return 'hello world';
+  }
+}
+```
+
+### The `getters` style
+
+This style checks for any `readonly` fields that are assigned literal values, and requires them to be defined as getters instead.
+This style pairs well with the [`@typescript-eslint/prefer-readonly`](prefer-readonly.md) rule,
+as it will identify fields that can be `readonly`, and thus should be made into getters.
+
+Examples of **correct** code with the `getters` style:
+
+```ts
+/* eslint @typescript-eslint/class-literal-property-style: ["error", "getters"] */
+
+class Mx {
+  // no readonly modifier
+  public myField1 = 'hello';
+
+  // not a literal
+  public readonly myField2 = [1, 2, 3];
+
+  public static get myField3() {
+    return 1;
+  }
+
+  private get ['myField4']() {
+    return 'hello world';
+  }
+}
+```
+
+Examples of **incorrect** code with the `getters` style:
+
+```ts
+/* eslint @typescript-eslint/class-literal-property-style: ["error", "getters"] */
+
+class Mx {
+  readonly myField1 = 1;
+  readonly myField2 = `hello world`;
+  private readonly myField3 = 'hello world';
+}
+```
+
+## When Not To Use It
+
+When you have no strong preference, or do not wish to enforce a particular style
+for how literal values are exposed by your classes.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/class-name-casing.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/class-name-casing.md
deleted file mode 100644
index 38c3060..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/class-name-casing.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# Require PascalCased class and interface names (`class-name-casing`)
-
-This rule enforces PascalCase names for classes and interfaces.
-
-## Rule Details
-
-This rule aims to make it easy to differentiate classes from regular variables at a glance.
-The `_` prefix is sometimes used to designate a private declaration, so the rule also supports a name
-that might be `_Example` instead of `Example`.
-
-## Options
-
-This rule has an object option:
-
-- `"allowUnderscorePrefix": false`: (default) does not allow the name to have an underscore prefix
-- `"allowUnderscorePrefix": true`: allows the name to optionally have an underscore prefix
-
-## Examples
-
-Examples of **incorrect** code for this rule:
-
-```ts
-class invalidClassName {}
-
-class Another_Invalid_Class_Name {}
-
-var bar = class invalidName {};
-
-interface someInterface {}
-
-class _InternalClass {}
-```
-
-Examples of **correct** code for this rule:
-
-```ts
-class ValidClassName {}
-
-export default class {}
-
-var foo = class {};
-
-interface SomeInterface {}
-
-/* eslint @typescript-eslint/class-name-casing: { "allowUnderscorePrefix": true } */
-class _InternalClass {}
-```
-
-## When Not To Use It
-
-You should turn off this rule if you do not care about class name casing, or if
-you use a different type of casing.
-
-## Further Reading
-
-- [`class-name`](https://palantir.github.io/tslint/rules/class-name/) in [TSLint](https://palantir.github.io/tslint/)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/comma-dangle.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/comma-dangle.md
new file mode 100644
index 0000000..bfb40d3
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/comma-dangle.md
@@ -0,0 +1,34 @@
+# Require or disallow trailing comma (`comma-dangle`)
+
+## Rule Details
+
+This rule extends the base [`eslint/comma-dangle`](https://eslint.org/docs/rules/comma-dangle) rule.
+It adds support for TypeScript syntax.
+
+See the [ESLint documentation](https://eslint.org/docs/rules/comma-dangle) for more details on the `comma-dangle` rule.
+
+## Rule Changes
+
+```cjson
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "comma-dangle": "off",
+  "@typescript-eslint/comma-dangle": ["error"]
+}
+```
+
+In addition to the options supported by the `comma-dangle` rule in ESLint core, the rule adds the following options:
+
+## Options
+
+This rule has a string option and an object option.
+
+- Object option:
+
+  - `"enums"` is for trailing comma in enum. (e.g. `enum Foo = {Bar,}`)
+  - `"generics"` is for trailing comma in generic. (e.g. `function foo<T,>() {}`)
+  - `"tuples"` is for trailing comma in tuple. (e.g. `type Foo = [string,]`)
+
+- [See the other options allowed](https://github.com/eslint/eslint/blob/master/docs/rules/comma-dangle.md#options)
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/comma-dangle.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/comma-spacing.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/comma-spacing.md
index 145e360..0920180 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/comma-spacing.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/comma-spacing.md
@@ -7,7 +7,7 @@
 
 ## How to use
 
-```cjson
+```jsonc
 {
   // note you must disable the base rule as it can report incorrect errors
   "comma-spacing": "off",
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/consistent-type-assertions.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/consistent-type-assertions.md
index cdf0fb7..43e67b7 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/consistent-type-assertions.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/consistent-type-assertions.md
@@ -8,6 +8,8 @@
 
 In addition to ensuring that type assertions are written in a consistent way, this rule also helps make your codebase more type-safe.
 
+`const` assertions, [introduced in TypeScript 3.4](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions), is always allowed by this rule. Examples of it include `let x = "hello" as const;` and `let x = <const>"hello";`.
+
 ## Options
 
 ```ts
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/consistent-type-definitions.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/consistent-type-definitions.md
index 1688552..52afd3f 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/consistent-type-definitions.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/consistent-type-definitions.md
@@ -25,10 +25,10 @@
 
 For example:
 
-```CJSON
+```jsonc
 {
-    // Use type for object definitions
-    "@typescript-eslint/consistent-type-definitions": ["error", "type"]
+  // Use type for object definitions
+  "@typescript-eslint/consistent-type-definitions": ["error", "type"]
 }
 ```
 
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/consistent-type-imports.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/consistent-type-imports.md
new file mode 100644
index 0000000..3487bf9
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/consistent-type-imports.md
@@ -0,0 +1,64 @@
+# Enforces consistent usage of type imports (`consistent-type-imports`)
+
+TypeScript 3.8 added support for type-only imports.
+Type-only imports allow you to specify that an import can only be used in a type location, allowing certain optimizations within compilers.
+
+## Rule Details
+
+This rule aims to standardize the use of type imports style across the codebase.
+
+## Options
+
+```ts
+type Options = {
+  prefer: 'type-imports' | 'no-type-imports';
+  disallowTypeAnnotations: boolean;
+};
+
+const defaultOptions: Options = {
+  prefer: 'type-imports',
+  disallowTypeAnnotations: true,
+};
+```
+
+### `prefer`
+
+This option defines the expected import kind for type-only imports. Valid values for `prefer` are:
+
+- `type-imports` will enforce that you always use `import type Foo from '...'`. It is default.
+- `no-type-imports` will enforce that you always use `import Foo from '...'`.
+
+Examples of **correct** code with `{prefer: 'type-imports'}`, and **incorrect** code with `{prefer: 'no-type-imports'}`.
+
+```ts
+import type { Foo } from 'Foo';
+import type Bar from 'Bar';
+type T = Foo;
+const x: Bar = 1;
+```
+
+Examples of **incorrect** code with `{prefer: 'type-imports'}`, and **correct** code with `{prefer: 'no-type-imports'}`.
+
+```ts
+import { Foo } from 'Foo';
+import Bar from 'Bar';
+type T = Foo;
+const x: Bar = 1;
+```
+
+### `disallowTypeAnnotations`
+
+If `true`, type imports in type annotations (`import()`) is not allowed.
+Default is `true`.
+
+Examples of **incorrect** code with `{disallowTypeAnnotations: true}`.
+
+```ts
+type T = import('Foo').Foo;
+const x: import('Bar') = 1;
+```
+
+## When Not To Use It
+
+- If you are not using TypeScript 3.8 (or greater), then you will not be able to use this rule, as type-only imports are not allowed.
+- If you specifically want to use both import kinds for stylistic reasons, you can disable this rule.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/default-param-last.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/default-param-last.md
index f3eb9f2..c9c51df 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/default-param-last.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/default-param-last.md
@@ -2,7 +2,8 @@
 
 ## Rule Details
 
-This rule enforces default or optional parameters to be the last of parameters.
+This rule extends the base [`eslint/default-param-last`](https://eslint.org/docs/rules/default-param-last) rule.
+It adds support for optional parameters.
 
 Examples of **incorrect** code for this rule:
 
@@ -38,4 +39,18 @@
 }
 ```
 
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "default-param-last": "off",
+  "@typescript-eslint/default-param-last": ["error"]
+}
+```
+
+## Options
+
+See [`eslint/default-param-last` options](https://eslint.org/docs/rules/default-param-last#options).
+
 <sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/default-param-last.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/dot-notation.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/dot-notation.md
new file mode 100644
index 0000000..bd1ea74
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/dot-notation.md
@@ -0,0 +1,46 @@
+# enforce dot notation whenever possible (`dot-notation`)
+
+## Rule Details
+
+This rule extends the base [`eslint/dot-notation`](https://eslint.org/docs/rules/dot-notation) rule.
+It adds support for optionally ignoring computed `private` member access.
+
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "dot-notation": "off",
+  "@typescript-eslint/dot-notation": ["error"]
+}
+```
+
+## Options
+
+See [`eslint/dot-notation`](https://eslint.org/docs/rules/dot-notation#options) options.
+This rule adds the following options:
+
+```ts
+interface Options extends BaseDotNotationOptions {
+  allowPrivateClassPropertyAccess?: boolean;
+}
+const defaultOptions: Options = {
+  ...baseDotNotationDefaultOptions,
+  allowPrivateClassPropertyAccess: false,
+};
+```
+
+### `allowPrivateClassPropertyAccess`
+
+Example of a correct code when `allowPrivateClassPropertyAccess` is set to `true`
+
+```ts
+class X {
+  private priv_prop = 123;
+}
+
+const x = new X();
+x['priv_prop'] = 123;
+```
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/dot-notation.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/explicit-function-return-type.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/explicit-function-return-type.md
index 360fdce..9e5b4c8 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/explicit-function-return-type.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/explicit-function-return-type.md
@@ -18,7 +18,7 @@
 }
 
 // Should indicate that a number is returned
-var fn = function() {
+var fn = function () {
   return 1;
 };
 
@@ -42,7 +42,7 @@
 }
 
 // A return value of type number
-var fn = function(): number {
+var fn = function (): number {
   return 1;
 };
 
@@ -69,12 +69,18 @@
   allowTypedFunctionExpressions?: boolean;
   // if true, functions immediately returning another function expression will not be checked
   allowHigherOrderFunctions?: boolean;
+  // if true, arrow functions immediately returning a `as const` value will not be checked
+  allowDirectConstAssertionInArrowFunctions?: boolean;
+  // if true, concise arrow functions that start with the void keyword will not be checked
+  allowConciseArrowFunctionExpressionsStartingWithVoid?: boolean;
 };
 
 const defaults = {
   allowExpressions: false,
   allowTypedFunctionExpressions: true,
   allowHigherOrderFunctions: true,
+  allowDirectConstAssertionInArrowFunctions: true,
+  allowConciseArrowFunctionExpressionsStartingWithVoid: true,
 };
 ```
 
@@ -117,7 +123,7 @@
 ```ts
 node.addEventListener('click', () => {});
 
-node.addEventListener('click', function() {});
+node.addEventListener('click', function () {});
 
 const foo = arr.map(i => i * i);
 ```
@@ -129,7 +135,7 @@
 ```ts
 let arrowFn = () => 'test';
 
-let funcExpr = function() {
+let funcExpr = function () {
   return 'test';
 };
 
@@ -184,7 +190,7 @@
 var arrowFn = () => () => {};
 
 function fn() {
-  return function() {};
+  return function () {};
 }
 ```
 
@@ -194,10 +200,44 @@
 var arrowFn = () => (): void => {};
 
 function fn() {
-  return function(): void {};
+  return function (): void {};
 }
 ```
 
+### `allowDirectConstAssertionInArrowFunctions`
+
+Examples of **incorrect** code for this rule with `{ allowDirectConstAssertionInArrowFunctions: true }`:
+
+```ts
+const func = (value: number) => ({ type: 'X', value } as any);
+const func = (value: number) => ({ type: 'X', value } as Action);
+```
+
+Examples of **correct** code for this rule with `{ allowDirectConstAssertionInArrowFunctions: true }`:
+
+```ts
+const func = (value: number) => ({ foo: 'bar', value } as const);
+const func = () => x as const;
+```
+
+### `allowConciseArrowFunctionExpressionsStartingWithVoid`
+
+Examples of **incorrect** code for this rule with `{ allowConciseArrowFunctionExpressionsStartingWithVoid: true }`:
+
+```ts
+var join = (a: string, b: string) => `${a}${b}`;
+
+const log = (message: string) => {
+  console.log(message);
+};
+```
+
+Examples of **correct** code for this rule with `{ allowConciseArrowFunctionExpressionsStartingWithVoid: true }`:
+
+```ts
+var log = (message: string) => void console.log(message);
+```
+
 ## When Not To Use It
 
 If you don't wish to prevent calling code from using function return values in unexpected ways, then
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/explicit-member-accessibility.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/explicit-member-accessibility.md
index 9b148d9..cfbb315 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/explicit-member-accessibility.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/explicit-member-accessibility.md
@@ -258,6 +258,10 @@
 class Animal {
   constructor(public animalName: string) {}
 }
+
+class Animal {
+  constructor(animalName: string) {}
+}
 ```
 
 e.g. `[ { accessibility: 'off', overrides: { parameterProperties: 'no-public' } } ]`
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/explicit-module-boundary-types.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/explicit-module-boundary-types.md
index a5327a1..f33a8d5 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/explicit-module-boundary-types.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/explicit-module-boundary-types.md
@@ -17,7 +17,7 @@
 }
 
 // Should indicate that a number is returned
-export default function() {
+export default function () {
   return 1;
 }
 
@@ -26,6 +26,7 @@
 
 // All arguments should be typed
 export var arrowFn = (arg): string => `test ${arg}`;
+export var arrowFn = (arg: any): string => `test ${arg}`;
 
 export class Test {
   // Should indicate that no value is returned (void)
@@ -44,13 +45,17 @@
 }
 
 // A return value of type number
-export var fn = function(): number {
+export var fn = function (): number {
   return 1;
 };
 
 // A return value of type string
 export var arrowFn = (arg: string): string => `test ${arg}`;
 
+// All arguments should be typed
+export var arrowFn = (arg: string): string => `test ${arg}`;
+export var arrowFn = (arg: unknown): string => `test ${arg}`;
+
 // Class is not exported
 class Test {
   method() {
@@ -66,16 +71,9 @@
 ```ts
 type Options = {
   /**
-   * If true, type annotations are also allowed on the variable of a function expression
-   * rather than on the function arguments/return value directly.
+   * If true, the rule will not report for arguments that are explicitly typed as `any`
    */
-  allowTypedFunctionExpressions?: boolean;
-  /**
-   * If true, functions immediately returning another function expression will not
-   * require an explicit return value annotation.
-   * You must still type the parameters of the function.
-   */
-  allowHigherOrderFunctions?: boolean;
+  allowArgumentsExplicitlyTypedAsAny?: boolean;
   /**
    * If true, body-less arrow functions that return an `as const` type assertion will not
    * require an explicit return value annotation.
@@ -86,12 +84,25 @@
    * An array of function/method names that will not have their arguments or their return values checked.
    */
   allowedNames?: string[];
+  /**
+   * If true, functions immediately returning another function expression will not
+   * require an explicit return value annotation.
+   * You must still type the parameters of the function.
+   */
+  allowHigherOrderFunctions?: boolean;
+  /**
+   * If true, type annotations are also allowed on the variable of a function expression
+   * rather than on the function arguments/return value directly.
+   */
+  allowTypedFunctionExpressions?: boolean;
 };
 
 const defaults = {
-  allowTypedFunctionExpressions: true,
-  allowHigherOrderFunctions: true,
+  allowArgumentsExplicitlyTypedAsAny: false,
+  allowDirectConstAssertionInArrowFunctions: true,
   allowedNames: [],
+  allowHigherOrderFunctions: true,
+  allowTypedFunctionExpressions: true,
 };
 ```
 
@@ -117,83 +128,20 @@
 }
 ```
 
-### `allowTypedFunctionExpressions`
+### `allowArgumentsExplicitlyTypedAsAny`
 
-Examples of **incorrect** code for this rule with `{ allowTypedFunctionExpressions: true }`:
+Examples of **incorrect** code for this rule with `{ allowArgumentsExplicitlyTypedAsAny: true }`:
 
 ```ts
-export let arrowFn = () => 'test';
-
-export let funcExpr = function() {
-  return 'test';
-};
-
-export let objectProp = {
-  foo: () => 1,
-};
-
-export const foo = bar => {};
+export const func = (value: any): void => ({ type: 'X', value });
+export function foo(value: any): void {}
 ```
 
-Examples of additional **correct** code for this rule with `{ allowTypedFunctionExpressions: true }`:
+Examples of **correct** code for this rule with `{ allowArgumentsExplicitlyTypedAsAny: true }`:
 
 ```ts
-type FuncType = () => string;
-
-export let arrowFn: FuncType = () => 'test';
-
-export let funcExpr: FuncType = function() {
-  return 'test';
-};
-
-export let asTyped = (() => '') as () => string;
-export let castTyped = <() => string>(() => '');
-
-interface ObjectType {
-  foo(): number;
-}
-export let objectProp: ObjectType = {
-  foo: () => 1,
-};
-export let objectPropAs = {
-  foo: () => 1,
-} as ObjectType;
-export let objectPropCast = <ObjectType>{
-  foo: () => 1,
-};
-
-type FooType = (bar: string) => void;
-export const foo: FooType = bar => {};
-```
-
-### `allowHigherOrderFunctions`
-
-Examples of **incorrect** code for this rule with `{ allowHigherOrderFunctions: true }`:
-
-```ts
-export var arrowFn = () => () => {};
-
-export function fn() {
-  return function() {};
-}
-
-export function foo(outer) {
-  return function(inner): void {};
-}
-```
-
-Examples of **correct** code for this rule with `{ allowHigherOrderFunctions: true }`:
-
-```ts
-export var arrowFn = () => (): void => {};
-
-export function fn() {
-  return function(): void {};
-}
-
-export function foo(outer: string) {
-  return function(inner: string): void {};
-}
+export const func = (value: number): void => ({ type: 'X', value });
+export function foo(value: number): void {}
 ```
 
 ### `allowDirectConstAssertionInArrowFunctions`
@@ -232,15 +180,94 @@
   "@typescript-eslint/explicit-module-boundary-types": [
     "error",
     {
-      "allowedName": ["ignoredFunctionName", "ignoredMethodName"]
+      "allowedNames": ["ignoredFunctionName", "ignoredMethodName"]
     }
   ]
 }
 ```
 
+### `allowHigherOrderFunctions`
+
+Examples of **incorrect** code for this rule with `{ allowHigherOrderFunctions: true }`:
+
+```ts
+export var arrowFn = () => () => {};
+
+export function fn() {
+  return function () {};
+}
+
+export function foo(outer) {
+  return function (inner): void {};
+}
+```
+
+Examples of **correct** code for this rule with `{ allowHigherOrderFunctions: true }`:
+
+```ts
+export var arrowFn = () => (): void => {};
+
+export function fn() {
+  return function (): void {};
+}
+
+export function foo(outer: string) {
+  return function (inner: string): void {};
+}
+```
+
+### `allowTypedFunctionExpressions`
+
+Examples of **incorrect** code for this rule with `{ allowTypedFunctionExpressions: true }`:
+
+```ts
+export let arrowFn = () => 'test';
+
+export let funcExpr = function () {
+  return 'test';
+};
+
+export let objectProp = {
+  foo: () => 1,
+};
+
+export const foo = bar => {};
+```
+
+Examples of additional **correct** code for this rule with `{ allowTypedFunctionExpressions: true }`:
+
+```ts
+type FuncType = () => string;
+
+export let arrowFn: FuncType = () => 'test';
+
+export let funcExpr: FuncType = function () {
+  return 'test';
+};
+
+export let asTyped = (() => '') as () => string;
+export let castTyped = <() => string>(() => '');
+
+interface ObjectType {
+  foo(): number;
+}
+export let objectProp: ObjectType = {
+  foo: () => 1,
+};
+export let objectPropAs = {
+  foo: () => 1,
+} as ObjectType;
+export let objectPropCast = <ObjectType>{
+  foo: () => 1,
+};
+
+type FooType = (bar: string) => void;
+export const foo: FooType = bar => {};
+```
+
 ## When Not To Use It
 
-If you wish to make sure all functions have explicit return types, as opposed to only the module boundaries, you can use [explicit-function-return-type](https://github.com/eslint/eslint/blob/master/docs/rules/explicit-function-return-type.md)
+If you wish to make sure all functions have explicit return types, as opposed to only the module boundaries, you can use [explicit-function-return-type](./explicit-function-return-type.md)
 
 ## Further Reading
 
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/func-call-spacing.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/func-call-spacing.md
index aa1d3fd..8aa9e7e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/func-call-spacing.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/func-call-spacing.md
@@ -1,17 +1,13 @@
 # Require or disallow spacing between function identifiers and their invocations (`func-call-spacing`)
 
-When calling a function, developers may insert optional whitespace between the function’s name and the parentheses that invoke it.
-This rule requires or disallows spaces between the function name and the opening parenthesis that calls it.
-
 ## Rule Details
 
 This rule extends the base [`eslint/func-call-spacing`](https://eslint.org/docs/rules/func-call-spacing) rule.
-It supports all options and features of the base rule.
-This version adds support for generic type parameters on function calls.
+It adds support for generic type parameters on function calls.
 
 ## How to use
 
-```cjson
+```jsonc
 {
   // note you must disable the base rule as it can report incorrect errors
   "func-call-spacing": "off",
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/generic-type-naming.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/generic-type-naming.md
deleted file mode 100644
index 185b381..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/generic-type-naming.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# Enforces naming of generic type variables (`generic-type-naming`)
-
-It can be helpful to enforce a consistent naming style for generic type variables used within a type.
-For example, prefixing them with `T` and ensuring a somewhat descriptive name, or enforcing Hungarian notation.
-
-## Rule Details
-
-This rule allows you to enforce conventions over type variables. By default, it does nothing.
-
-## Options
-
-The rule takes a single string option, which is a regular expression that type variables should match.
-
-Examples of **correct** code with a configuration of `'^T[A-Z][a-zA-Z]+$'`:
-
-```typescript
-type ReadOnly<TType extends object> = {
-  readonly [TKey in keyof TType]: TType[TKey];
-};
-
-interface SimpleMap<TValue> {
-  [key: string]: TValue;
-}
-```
-
-Examples of **incorrect** code with a configuration of `'^T[A-Z][a-zA-Z]+$'`:
-
-```typescript
-type ReadOnly<T extends object> = { readonly [Key in keyof T]: T[Key] };
-
-interface SimpleMap<T> {
-  [key: string]: T;
-}
-```
-
-## When Not To Use It
-
-If you do not want to enforce a naming convention for type variables.
-
-## Further Reading
-
-- [TypeScript Generics](https://www.typescriptlang.org/docs/handbook/generics.html)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/indent.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/indent.md
index 4636cfe..023c774 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/indent.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/indent.md
@@ -1,713 +1,24 @@
 # Enforce consistent indentation (`indent`)
 
-There are several common guidelines which require specific indentation of nested blocks and statements, like:
-
-```js
-function hello(indentSize, type) {
-  if (indentSize === 4 && type !== 'tab') {
-    console.log('Each next indentation will increase on 4 spaces');
-  }
-}
-```
-
-These are the most common scenarios recommended in different style guides:
-
-- Two spaces, not longer and no tabs: Google, npm, NodeJS, Idiomatic, Felix
-- Tabs: jQuery
-- Four spaces: Crockford
+## PLEASE READ THIS ISSUE BEFORE USING THIS RULE [#1824](https://github.com/typescript-eslint/typescript-eslint/issues/1824)
 
 ## Rule Details
 
-This rule enforces a consistent indentation style. The default style is `4 spaces`.
+This rule extends the base [`eslint/indent`](https://eslint.org/docs/rules/indent) rule.
+It adds support for TypeScript nodes.
+
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "indent": "off",
+  "@typescript-eslint/indent": ["error"]
+}
+```
 
 ## Options
 
-This rule has a mixed option:
-
-For example, for 2-space indentation:
-
-```cjson
-{
-    // note you must disable the base rule as it can report incorrect errors
-    "indent": "off",
-    "@typescript-eslint/indent": ["error", 2]
-}
-```
-
-Or for tabbed indentation:
-
-```cjson
-{
-    // note you must disable the base rule as it can report incorrect errors
-    "indent": "off",
-    "@typescript-eslint/indent": ["error", "tab"]
-}
-```
-
-Examples of **incorrect** code for this rule with the default options:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: "error"*/
-
-if (a) {
-  b=c;
-  function foo(d) {
-    e=f;
-  }
-}
-```
-
-Examples of **correct** code for this rule with the default options:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: "error"*/
-
-if (a) {
-    b=c;
-    function foo(d) {
-        e=f;
-    }
-}
-```
-
-This rule has an object option:
-
-- `"SwitchCase"` (default: 0) enforces indentation level for `case` clauses in `switch` statements
-- `"VariableDeclarator"` (default: 1) enforces indentation level for `var` declarators; can also take an object to define separate rules for `var`, `let` and `const` declarations.
-- `"outerIIFEBody"` (default: 1) enforces indentation level for file-level IIFEs.
-- `"MemberExpression"` (default: 1) enforces indentation level for multi-line property chains. This can also be set to `"off"` to disable checking for `MemberExpression` indentation.
-- `"FunctionDeclaration"` takes an object to define rules for function declarations.
-  - `parameters` (default: 1) enforces indentation level for parameters in a function declaration. This can either be a number indicating indentation level, or the string `"first"` indicating that all parameters of the declaration must be aligned with the first parameter. This can also be set to `"off"` to disable checking for `FunctionDeclaration` parameters.
-  - `body` (default: 1) enforces indentation level for the body of a function declaration.
-- `"FunctionExpression"` takes an object to define rules for function expressions.
-  - `parameters` (default: 1) enforces indentation level for parameters in a function expression. This can either be a number indicating indentation level, or the string `"first"` indicating that all parameters of the expression must be aligned with the first parameter. This can also be set to `"off"` to disable checking for `FunctionExpression` parameters.
-  - `body` (default: 1) enforces indentation level for the body of a function expression.
-- `"CallExpression"` takes an object to define rules for function call expressions.
-  - `arguments` (default: 1) enforces indentation level for arguments in a call expression. This can either be a number indicating indentation level, or the string `"first"` indicating that all arguments of the expression must be aligned with the first argument. This can also be set to `"off"` to disable checking for `CallExpression` arguments.
-- `"ArrayExpression"` (default: 1) enforces indentation level for elements in arrays. It can also be set to the string `"first"`, indicating that all the elements in the array should be aligned with the first element. This can also be set to `"off"` to disable checking for array elements.
-- `"ObjectExpression"` (default: 1) enforces indentation level for properties in objects. It can be set to the string `"first"`, indicating that all properties in the object should be aligned with the first property. This can also be set to `"off"` to disable checking for object properties.
-- `"ImportDeclaration"` (default: 1) enforces indentation level for import statements. It can be set to the string `"first"`, indicating that all imported members from a module should be aligned with the first member in the list. This can also be set to `"off"` to disable checking for imported module members.
-- `"flatTernaryExpressions": true` (`false` by default) requires no indentation for ternary expressions which are nested in other ternary expressions.
-- `"ignoredNodes"` accepts an array of [selectors](https://eslint.org/docs/developer-guide/selectors). If an AST node is matched by any of the selectors, the indentation of tokens which are direct children of that node will be ignored. This can be used as an escape hatch to relax the rule if you disagree with the indentation that it enforces for a particular syntactic pattern.
-- `"ignoreComments"` (default: false) can be used when comments do not need to be aligned with nodes on the previous or next line.
-
-Level of indentation denotes the multiple of the indent specified. Example:
-
-- Indent of 4 spaces with `VariableDeclarator` set to `2` will indent the multi-line variable declarations with 8 spaces.
-- Indent of 2 spaces with `VariableDeclarator` set to `2` will indent the multi-line variable declarations with 4 spaces.
-- Indent of 2 spaces with `VariableDeclarator` set to `{"var": 2, "let": 2, "const": 3}` will indent the multi-line variable declarations with 4 spaces for `var` and `let`, 6 spaces for `const` statements.
-- Indent of tab with `VariableDeclarator` set to `2` will indent the multi-line variable declarations with 2 tabs.
-- Indent of 2 spaces with `SwitchCase` set to `0` will not indent `case` clauses with respect to `switch` statements.
-- Indent of 2 spaces with `SwitchCase` set to `1` will indent `case` clauses with 2 spaces with respect to `switch` statements.
-- Indent of 2 spaces with `SwitchCase` set to `2` will indent `case` clauses with 4 spaces with respect to `switch` statements.
-- Indent of tab with `SwitchCase` set to `2` will indent `case` clauses with 2 tabs with respect to `switch` statements.
-- Indent of 2 spaces with `MemberExpression` set to `0` will indent the multi-line property chains with 0 spaces.
-- Indent of 2 spaces with `MemberExpression` set to `1` will indent the multi-line property chains with 2 spaces.
-- Indent of 2 spaces with `MemberExpression` set to `2` will indent the multi-line property chains with 4 spaces.
-- Indent of 4 spaces with `MemberExpression` set to `0` will indent the multi-line property chains with 0 spaces.
-- Indent of 4 spaces with `MemberExpression` set to `1` will indent the multi-line property chains with 4 spaces.
-- Indent of 4 spaces with `MemberExpression` set to `2` will indent the multi-line property chains with 8 spaces.
-
-### tab
-
-Examples of **incorrect** code for this rule with the `"tab"` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", "tab"]*/
-
-if (a) {
-     b=c;
-function foo(d) {
-           e=f;
- }
-}
-```
-
-Examples of **correct** code for this rule with the `"tab"` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", "tab"]*/
-
-if (a) {
-/*tab*/b=c;
-/*tab*/function foo(d) {
-/*tab*//*tab*/e=f;
-/*tab*/}
-}
-```
-
-### `SwitchCase`
-
-Examples of **incorrect** code for this rule with the `2, { "SwitchCase": 1 }` options:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "SwitchCase": 1 }]*/
-
-switch(a){
-case "a":
-    break;
-case "b":
-    break;
-}
-```
-
-Examples of **correct** code for this rule with the `2, { "SwitchCase": 1 }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "SwitchCase": 1 }]*/
-
-switch(a){
-  case "a":
-    break;
-  case "b":
-    break;
-}
-```
-
-### `VariableDeclarator`
-
-Examples of **incorrect** code for this rule with the `2, { "VariableDeclarator": 1 }` options:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "VariableDeclarator": 1 }]*/
-/*eslint-env es6*/
-
-var a,
-    b,
-    c;
-let a,
-    b,
-    c;
-const a = 1,
-    b = 2,
-    c = 3;
-```
-
-Examples of **correct** code for this rule with the `2, { "VariableDeclarator": 1 }` options:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "VariableDeclarator": 1 }]*/
-/*eslint-env es6*/
-
-var a,
-  b,
-  c;
-let a,
-  b,
-  c;
-const a = 1,
-  b = 2,
-  c = 3;
-```
-
-Examples of **correct** code for this rule with the `2, { "VariableDeclarator": 2 }` options:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "VariableDeclarator": 2 }]*/
-/*eslint-env es6*/
-
-var a,
-    b,
-    c;
-let a,
-    b,
-    c;
-const a = 1,
-    b = 2,
-    c = 3;
-```
-
-Examples of **correct** code for this rule with the `2, { "VariableDeclarator": { "var": 2, "let": 2, "const": 3 } }` options:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "VariableDeclarator": { "var": 2, "let": 2, "const": 3 } }]*/
-/*eslint-env es6*/
-
-var a,
-    b,
-    c;
-let a,
-    b,
-    c;
-const a = 1,
-      b = 2,
-      c = 3;
-```
-
-### `outerIIFEBody`
-
-Examples of **incorrect** code for this rule with the options `2, { "outerIIFEBody": 0 }`:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "outerIIFEBody": 0 }]*/
-
-(function() {
-
-  function foo(x) {
-    return x + 1;
-  }
-
-})();
-
-
-if(y) {
-console.log('foo');
-}
-```
-
-Examples of **correct** code for this rule with the options `2, {"outerIIFEBody": 0}`:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "outerIIFEBody": 0 }]*/
-
-(function() {
-
-function foo(x) {
-  return x + 1;
-}
-
-})();
-
-
-if(y) {
-   console.log('foo');
-}
-```
-
-### `MemberExpression`
-
-Examples of **incorrect** code for this rule with the `2, { "MemberExpression": 1 }` options:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "MemberExpression": 1 }]*/
-
-foo
-.bar
-.baz()
-```
-
-Examples of **correct** code for this rule with the `2, { "MemberExpression": 1 }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "MemberExpression": 1 }]*/
-
-foo
-  .bar
-  .baz();
-```
-
-### `FunctionDeclaration`
-
-Examples of **incorrect** code for this rule with the `2, { "FunctionDeclaration": {"body": 1, "parameters": 2} }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "FunctionDeclaration": {"body": 1, "parameters": 2} }]*/
-
-function foo(bar,
-  baz,
-  qux) {
-    qux();
-}
-```
-
-Examples of **correct** code for this rule with the `2, { "FunctionDeclaration": {"body": 1, "parameters": 2} }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "FunctionDeclaration": {"body": 1, "parameters": 2} }]*/
-
-function foo(bar,
-    baz,
-    qux) {
-  qux();
-}
-```
-
-Examples of **incorrect** code for this rule with the `2, { "FunctionDeclaration": {"parameters": "first"} }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, {"FunctionDeclaration": {"parameters": "first"}}]*/
-
-function foo(bar, baz,
-  qux, boop) {
-  qux();
-}
-```
-
-Examples of **correct** code for this rule with the `2, { "FunctionDeclaration": {"parameters": "first"} }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, {"FunctionDeclaration": {"parameters": "first"}}]*/
-
-function foo(bar, baz,
-             qux, boop) {
-  qux();
-}
-```
-
-### `FunctionExpression`
-
-Examples of **incorrect** code for this rule with the `2, { "FunctionExpression": {"body": 1, "parameters": 2} }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "FunctionExpression": {"body": 1, "parameters": 2} }]*/
-
-var foo = function(bar,
-  baz,
-  qux) {
-    qux();
-}
-```
-
-Examples of **correct** code for this rule with the `2, { "FunctionExpression": {"body": 1, "parameters": 2} }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "FunctionExpression": {"body": 1, "parameters": 2} }]*/
-
-var foo = function(bar,
-    baz,
-    qux) {
-  qux();
-}
-```
-
-Examples of **incorrect** code for this rule with the `2, { "FunctionExpression": {"parameters": "first"} }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, {"FunctionExpression": {"parameters": "first"}}]*/
-
-var foo = function(bar, baz,
-  qux, boop) {
-  qux();
-}
-```
-
-Examples of **correct** code for this rule with the `2, { "FunctionExpression": {"parameters": "first"} }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, {"FunctionExpression": {"parameters": "first"}}]*/
-
-var foo = function(bar, baz,
-                   qux, boop) {
-  qux();
-}
-```
-
-### `CallExpression`
-
-Examples of **incorrect** code for this rule with the `2, { "CallExpression": {"arguments": 1} }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "CallExpression": {"arguments": 1} }]*/
-
-foo(bar,
-    baz,
-      qux
-);
-```
-
-Examples of **correct** code for this rule with the `2, { "CallExpression": {"arguments": 1} }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "CallExpression": {"arguments": 1} }]*/
-
-foo(bar,
-  baz,
-  qux
-);
-```
-
-Examples of **incorrect** code for this rule with the `2, { "CallExpression": {"arguments": "first"} }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, {"CallExpression": {"arguments": "first"}}]*/
-
-foo(bar, baz,
-  baz, boop, beep);
-```
-
-Examples of **correct** code for this rule with the `2, { "CallExpression": {"arguments": "first"} }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, {"CallExpression": {"arguments": "first"}}]*/
-
-foo(bar, baz,
-    baz, boop, beep);
-```
-
-### `ArrayExpression`
-
-Examples of **incorrect** code for this rule with the `2, { "ArrayExpression": 1 }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "ArrayExpression": 1 }]*/
-
-var foo = [
-    bar,
-baz,
-      qux
-];
-```
-
-Examples of **correct** code for this rule with the `2, { "ArrayExpression": 1 }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "ArrayExpression": 1 }]*/
-
-var foo = [
-  bar,
-  baz,
-  qux
-];
-```
-
-Examples of **incorrect** code for this rule with the `2, { "ArrayExpression": "first" }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, {"ArrayExpression": "first"}]*/
-
-var foo = [bar,
-  baz,
-  qux
-];
-```
-
-Examples of **correct** code for this rule with the `2, { "ArrayExpression": "first" }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, {"ArrayExpression": "first"}]*/
-
-var foo = [bar,
-           baz,
-           qux
-];
-```
-
-### `ObjectExpression`
-
-Examples of **incorrect** code for this rule with the `2, { "ObjectExpression": 1 }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "ObjectExpression": 1 }]*/
-
-var foo = {
-    bar: 1,
-baz: 2,
-      qux: 3
-};
-```
-
-Examples of **correct** code for this rule with the `2, { "ObjectExpression": 1 }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, { "ObjectExpression": 1 }]*/
-
-var foo = {
-  bar: 1,
-  baz: 2,
-  qux: 3
-};
-```
-
-Examples of **incorrect** code for this rule with the `2, { "ObjectExpression": "first" }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, {"ObjectExpression": "first"}]*/
-
-var foo = { bar: 1,
-  baz: 2 };
-```
-
-Examples of **correct** code for this rule with the `2, { "ObjectExpression": "first" }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 2, {"ObjectExpression": "first"}]*/
-
-var foo = { bar: 1,
-            baz: 2 };
-```
-
-### `ImportDeclaration`
-
-Examples of **correct** code for this rule with the `4, { "ImportDeclaration": 1 }` option (the default):
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 4, { ImportDeclaration: 1 }]*/
-
-import { foo,
-    bar,
-    baz,
-} from 'qux';
-
-import {
-    foo,
-    bar,
-    baz,
-} from 'qux';
-```
-
-Examples of **incorrect** code for this rule with the `4, { ImportDeclaration: "first" }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 4, { ImportDeclaration: "first" }]*/
-
-import { foo,
-    bar,
-    baz,
-} from 'qux';
-```
-
-Examples of **correct** code for this rule with the `4, { ImportDeclaration: "first" }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 4, { ImportDeclaration: "first" }]*/
-
-import { foo,
-         bar,
-         baz,
-} from 'qux';
-```
-
-### `flatTernaryExpressions`
-
-Examples of **incorrect** code for this rule with the default `4, { "flatTernaryExpressions": false }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 4, { "flatTernaryExpressions": false }]*/
-
-var a =
-    foo ? bar :
-    baz ? qux :
-    boop;
-```
-
-Examples of **correct** code for this rule with the default `4, { "flatTernaryExpressions": false }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 4, { "flatTernaryExpressions": false }]*/
-
-var a =
-    foo ? bar :
-        baz ? qux :
-            boop;
-```
-
-Examples of **incorrect** code for this rule with the `4, { "flatTernaryExpressions": true }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 4, { "flatTernaryExpressions": true }]*/
-
-var a =
-    foo ? bar :
-        baz ? qux :
-            boop;
-```
-
-Examples of **correct** code for this rule with the `4, { "flatTernaryExpressions": true }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 4, { "flatTernaryExpressions": true }]*/
-
-var a =
-    foo ? bar :
-    baz ? qux :
-    boop;
-```
-
-### `ignoredNodes`
-
-The following configuration ignores the indentation of `ConditionalExpression` ("ternary expression") nodes:
-
-Examples of **correct** code for this rule with the `4, { "ignoredNodes": ["ConditionalExpression"] }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 4, { "ignoredNodes": ["ConditionalExpression"] }]*/
-
-var a = foo
-      ? bar
-      : baz;
-
-var a = foo
-                ? bar
-: baz;
-```
-
-The following configuration ignores indentation in the body of IIFEs.
-
-Examples of **correct** code for this rule with the `4, { "ignoredNodes": ["CallExpression > FunctionExpression.callee > BlockStatement.body"] }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 4, { "ignoredNodes": ["CallExpression > FunctionExpression.callee > BlockStatement.body"] }]*/
-
-(function() {
-
-foo();
-bar();
-
-})
-```
-
-### `ignoreComments`
-
-Examples of additional **correct** code for this rule with the `4, { "ignoreComments": true }` option:
-
-<!-- prettier-ignore -->
-```js
-/*eslint @typescript-eslint/indent: ["error", 4, { "ignoreComments": true }] */
-
-if (foo) {
-    doSomething();
-
-// comment intentionally de-indented
-    doSomethingElse();
-}
-```
-
-## Compatibility
-
-- **JSHint**: `indent`
-- **JSCS**: [`validateIndentation`](https://jscs-dev.github.io/rule/validateIndentation)
+See [`eslint/indent` options](https://eslint.org/docs/rules/indent#options).
 
 <sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/indent.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/init-declarations.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/init-declarations.md
new file mode 100644
index 0000000..f83c5bd
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/init-declarations.md
@@ -0,0 +1,22 @@
+# require or disallow initialization in variable declarations (`init-declarations`)
+
+## Rule Details
+
+This rule extends the base [`eslint/init-declarations`](https://eslint.org/docs/rules/init-declarations) rule.
+It adds support for TypeScript's `declare` variables.
+
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "init-declarations": "off",
+  "@typescript-eslint/init-declarations": ["error"]
+}
+```
+
+## Options
+
+See [`eslint/init-declarations` options](https://eslint.org/docs/rules/init-declarations#options).
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/init-declarations.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/interface-name-prefix.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/interface-name-prefix.md
deleted file mode 100644
index f6439b4..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/interface-name-prefix.md
+++ /dev/null
@@ -1,136 +0,0 @@
-# Require that interface names should or should not prefixed with `I` (`interface-name-prefix`)
-
-Interfaces often represent important software contracts, so it can be helpful to prefix their names with `I`.
-The unprefixed name is then available for a class that provides a standard implementation of the interface.
-Alternatively, the contributor guidelines for the TypeScript repo suggest
-[never prefixing](https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines#names) interfaces with `I`.
-
-## Rule Details
-
-This rule enforces whether or not the `I` prefix is required for interface names.
-The `_` prefix is sometimes used to designate a private declaration, so the rule also supports a private interface
-that might be named `_IAnimal` instead of `IAnimal`.
-
-## Options
-
-This rule has an object option:
-
-- `{ "prefixWithI": "never" }`: (default) disallows all interfaces being prefixed with `"I"` or `"_I"`
-- `{ "prefixWithI": "always" }`: requires all interfaces be prefixed with `"I"` (but does not allow `"_I"`)
-- `{ "prefixWithI": "always", "allowUnderscorePrefix": true }`: requires all interfaces be prefixed with
-  either `"I"` or `"_I"`
-
-For backwards compatibility, this rule supports a string option instead:
-
-- `"never"`: Equivalent to `{ "prefixWithI": "never" }`
-- `"always"`: Equivalent to `{ "prefixWithI": "always" }`
-
-## Examples
-
-### never
-
-**Configuration:** `{ "prefixWithI": "never" }`
-
-The following patterns are considered warnings:
-
-```ts
-interface IAnimal {
-  name: string;
-}
-
-interface IIguana {
-  name: string;
-}
-
-interface _IAnimal {
-  name: string;
-}
-```
-
-The following patterns are not warnings:
-
-```ts
-interface Animal {
-  name: string;
-}
-
-interface Iguana {
-  name: string;
-}
-```
-
-### always
-
-**Configuration:** `{ "prefixWithI": "always" }`
-
-The following patterns are considered warnings:
-
-```ts
-interface Animal {
-  name: string;
-}
-
-interface Iguana {
-  name: string;
-}
-
-interface _IAnimal {
-  name: string;
-}
-```
-
-The following patterns are not warnings:
-
-```ts
-interface IAnimal {
-  name: string;
-}
-
-interface IIguana {
-  name: string;
-}
-```
-
-### always and allowing underscores
-
-**Configuration:** `{ "prefixWithI": "always", "allowUnderscorePrefix": true }`
-
-The following patterns are considered warnings:
-
-```ts
-interface Animal {
-  name: string;
-}
-
-interface Iguana {
-  name: string;
-}
-```
-
-The following patterns are not warnings:
-
-```ts
-interface IAnimal {
-  name: string;
-}
-
-interface IIguana {
-  name: string;
-}
-
-interface _IAnimal {
-  name: string;
-}
-```
-
-## When Not To Use It
-
-If you do not want to enforce interface name prefixing.
-
-## Further Reading
-
-TypeScript [Interfaces](https://www.typescriptlang.org/docs/handbook/interfaces.html)
-
-## Compatibility
-
-TSLint: [interface-name](https://palantir.github.io/tslint/rules/interface-name/)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/keyword-spacing.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/keyword-spacing.md
new file mode 100644
index 0000000..3178542
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/keyword-spacing.md
@@ -0,0 +1,22 @@
+# Enforce consistent spacing before and after keywords (`keyword-spacing`)
+
+## Rule Details
+
+This rule extends the base [`eslint/keyword-spacing`](https://eslint.org/docs/rules/keyword-spacing) rule.
+This version adds support for generic type parameters on function calls.
+
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "keyword-spacing": "off",
+  "@typescript-eslint/keyword-spacing": ["error"]
+}
+```
+
+## Options
+
+See [`eslint/keyword-spacing` options](https://eslint.org/docs/rules/keyword-spacing#options).
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/keyword-spacing.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/lines-between-class-members.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/lines-between-class-members.md
new file mode 100644
index 0000000..e2692bb
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/lines-between-class-members.md
@@ -0,0 +1,73 @@
+# Require or disallow an empty line between class members (`lines-between-class-members`)
+
+This rule improves readability by enforcing lines between class members. It will not check empty lines before the first member and after the last member. This rule require or disallow an empty line between class members.
+
+## Rule Details
+
+This rule extends the base [`eslint/lines-between-class-members`](https://eslint.org/docs/rules/lines-between-class-members) rule.
+It adds support for ignoring overload methods in a class.
+
+See the [ESLint documentation](https://eslint.org/docs/rules/lines-between-class-members) for more details on the `lines-between-class-members` rule.
+
+## Rule Changes
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "lines-between-class-members": "off",
+  "@typescript-eslint/lines-between-class-members": ["error"]
+}
+```
+
+In addition to the options supported by the `lines-between-class-members` rule in ESLint core, the rule adds the following options:
+
+## Options
+
+This rule has a string option and an object option.
+
+- Object option:
+
+  - `"exceptAfterOverload": true` (default) - Skip checking empty lines after overload class members
+  - `"exceptAfterOverload": false` - **do not** skip checking empty lines after overload class members
+
+- [See the other options allowed](https://github.com/eslint/eslint/blob/master/docs/rules/lines-between-class-members.md#options)
+
+### `exceptAfterOverload: true`
+
+Examples of **correct** code for the `{ "exceptAfterOverload": true }` option:
+
+```ts
+/*eslint @typescript-eslint/lines-between-class-members: ["error", "always", { "exceptAfterOverload": true }]*/
+
+class foo {
+  bar(a: string): void;
+  bar(a: string, b: string): void;
+  bar(a: string, b: string) {}
+
+  baz() {}
+
+  qux() {}
+}
+```
+
+### `exceptAfterOverload: false`
+
+Examples of **correct** code for the `{ "exceptAfterOverload": false }` option:
+
+```ts
+/*eslint @typescript-eslint/lines-between-class-members: ["error", "always", { "exceptAfterOverload": false }]*/
+
+class foo {
+  bar(a: string): void;
+
+  bar(a: string, b: string): void;
+
+  bar(a: string, b: string) {}
+
+  baz() {}
+
+  qux() {}
+}
+```
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/lines-between-class-members.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/member-naming.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/member-naming.md
deleted file mode 100644
index e12f4f2..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/member-naming.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Enforces naming conventions for class members by visibility (`member-naming`)
-
-It can be helpful to enforce naming conventions for `private` (and sometimes `protected`) members of an object. For example, prefixing private properties with a `_` allows them to be easily discerned when being inspected by tools that do not have knowledge of TypeScript (such as most debuggers).
-
-## Rule Details
-
-This rule allows you to enforce conventions for class property and method names by their visibility. By default, it enforces nothing.
-
-> Note: constructors are explicitly ignored regardless of the the regular expression options provided
-
-## Options
-
-You can specify a regular expression to test the names of properties for each visibility level: `public`, `protected`, `private`.
-
-Examples of **correct** code with `{ "private": "^_" }` specified:
-
-```ts
-class HappyClass {
-  private _foo: string;
-  private _bar = 123;
-  private _fizz() {}
-}
-```
-
-Examples of **incorrect** code with `{ "private": "^_" }` specified:
-
-```ts
-class SadClass {
-  private foo: string;
-  private bar = 123;
-  private fizz() {}
-}
-```
-
-## When Not To Use It
-
-If you do not want to enforce per-visibility naming rules for member properties.
-
-## Further Reading
-
-- ESLint's [`camelcase` rule](https://eslint.org/docs/rules/camelcase)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/member-ordering.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/member-ordering.md
index d028d84..eda1c57 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/member-ordering.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/member-ordering.md
@@ -1,64 +1,95 @@
 # Require a consistent member declaration order (`member-ordering`)
 
-A consistent ordering of fields, methods and constructors can make interfaces, type literals, classes and class
-expressions easier to read, navigate and edit.
+A consistent ordering of fields, methods and constructors can make interfaces, type literals, classes and class expressions easier to read, navigate and edit.
 
 ## Rule Details
 
-This rule aims to standardize the way class declarations, class expressions, interfaces and type literals are structured.
+This rule aims to standardize the way class declarations, class expressions, interfaces and type literals are structured and ordered.
 
-It allows to group members by their type (e.g. `public-static-field`, `protected-static-field`, `private-static-field`, `public-instance-field`, ...). By default, their order is the same inside `classes`, `classExpressions`, `interfaces` and `typeLiterals` (note: not all member types apply to `interfaces` and `typeLiterals`). It is possible to define the order for any of those individually or to change the default order for all of them by setting the `default` option.
+### Grouping and sorting member groups
+
+It allows to group members by their type (e.g. `public-static-field`, `protected-static-field`, `private-static-field`, `public-instance-field`, ...) and enforce a certain order for these groups. By default, their order is the same inside `classes`, `classExpressions`, `interfaces` and `typeLiterals` (note: not all member types apply to `interfaces` and `typeLiterals`). It is possible to define the order for any of those individually or to change the default order for all of them by setting the `default` option.
+
+### Sorting members
+
+Besides grouping the members and sorting their groups, this rule also allows to sort the members themselves (e.g. `a`, `b`, `c`, ...). You have 2 options: Sort all of them while ignoring their type or sort them while respecting their types (e.g. sort all fields in an interface alphabetically).
 
 ## Options
 
-```ts
-{
-  default?: Array<MemberType> | never
-  classes?: Array<MemberType> | never
-  classExpressions?: Array<MemberType> | never
+These options allow to specify how to group the members and sort their groups.
 
-  interfaces?: ['signature' | 'field' | 'method' | 'constructor'] | never
-  typeLiterals?: ['signature' | 'field' | 'method' | 'constructor'] | never
+- Sort groups, don't enforce member order: Use `memberTypes`
+- Sort members, don't enforce group order: Use `order`
+- Sort members within groups: Use `memberTypes` and `order`
+
+```ts
+type TypeOptions<T> =
+  | {
+    memberTypes: Array<T> | 'never',
+    order?: 'alphabetically' | 'as-written',
+  }
+  | {
+    order: 'alphabetically',
+  };
+
+{
+  default?: TypeOptions<MemberTypes>,
+
+  classes?: TypeOptions<MemberTypes>,
+  classExpressions?: TypeOptions<MemberTypes>,
+
+  interfaces?: TypeOptions<'signature' | 'field' | 'method' | 'constructor'>,
+  typeLiterals?: TypeOptions<'signature' | 'field' | 'method' | 'constructor'>,
 }
 ```
 
 See below for the possible definitions of `MemberType`.
 
+### Deprecated syntax
+
+Note: There is a deprecated syntax to specify the member types as an array.
+
 ### Member types (granular form)
 
 There are multiple ways to specify the member types. The most explicit and granular form is the following:
 
-```json5
+```jsonc
 [
   // Index signature
-  'signature',
+  "signature",
 
   // Fields
-  'public-static-field',
-  'protected-static-field',
-  'private-static-field',
-  'public-instance-field',
-  'protected-instance-field',
-  'private-instance-field',
-  'public-abstract-field',
-  'protected-abstract-field',
-  'private-abstract-field',
+  "public-static-field",
+  "protected-static-field",
+  "private-static-field",
+  "public-decorated-field",
+  "protected-decorated-field",
+  "private-decorated-field",
+  "public-instance-field",
+  "protected-instance-field",
+  "private-instance-field",
+  "public-abstract-field",
+  "protected-abstract-field",
+  "private-abstract-field",
 
   // Constructors
-  'public-constructor',
-  'protected-constructor',
-  'private-constructor',
+  "public-constructor",
+  "protected-constructor",
+  "private-constructor",
 
   // Methods
-  'public-static-method',
-  'protected-static-method',
-  'private-static-method',
-  'public-instance-method',
-  'protected-instance-method',
-  'private-instance-method',
-  'public-abstract-method',
-  'protected-abstract-method',
-  'private-abstract-method',
+  "public-static-method",
+  "protected-static-method",
+  "private-static-method",
+  "public-decorated-method",
+  "protected-decorated-method",
+  "private-decorated-method",
+  "public-instance-method",
+  "protected-instance-method",
+  "private-instance-method",
+  "public-abstract-method",
+  "protected-abstract-method",
+  "private-abstract-method"
 ]
 ```
 
@@ -68,23 +99,51 @@
 
 It is also possible to group member types by their accessibility (`static`, `instance`, `abstract`), ignoring their scope.
 
-```json5
+```jsonc
 [
   // Index signature
   // No accessibility for index signature. See above.
 
   // Fields
-  'public-field', // = ['public-static-field', 'public-instance-field'])
-  'protected-field', // = ['protected-static-field', 'protected-instance-field'])
-  'private-field', // = ['private-static-field', 'private-instance-field'])
+  "public-field", // = ["public-static-field", "public-instance-field"]
+  "protected-field", // = ["protected-static-field", "protected-instance-field"]
+  "private-field", // = ["private-static-field", "private-instance-field"]
 
   // Constructors
   // Only the accessibility of constructors is configurable. See below.
 
   // Methods
-  'public-method', // = ['public-static-method', 'public-instance-method'])
-  'protected-method', // = ['protected-static-method', 'protected-instance-method'])
-  'private-method', // = ['private-static-method', 'private-instance-method'])
+  "public-method", // = ["public-static-method", "public-instance-method"]
+  "protected-method", // = ["protected-static-method", "protected-instance-method"]
+  "private-method" // = ["private-static-method", "private-instance-method"]
+]
+```
+
+### Member group types (with accessibility and a decorator)
+
+It is also possible to group methods or fields with a decorator separately, optionally specifying
+their accessibility.
+
+```jsonc
+[
+  // Index signature
+  // No decorators for index signature.
+
+  // Fields
+  "public-decorated-field",
+  "protected-decorated-field",
+  "private-decorated-field",
+
+  "decorated-field", // = ["public-decorated-field", "protected-decorated-field", "private-decorated-field"]
+
+  // Constructors
+  // There are no decorators for constructors.
+
+  "public-decorated-method",
+  "protected-decorated-method",
+  "private-decorated-method",
+
+  "decorated-method" // = ["public-decorated-method", "protected-decorated-method", "private-decorated-method"]
 ]
 ```
 
@@ -92,23 +151,23 @@
 
 Another option is to group the member types by their scope (`public`, `protected`, `private`), ignoring their accessibility.
 
-```json5
+```jsonc
 [
   // Index signature
   // No scope for index signature. See above.
 
   // Fields
-  'static-field', // = ['public-static-field', 'protected-static-field', 'private-static-field'])
-  'instance-field', // = ['public-instance-field', 'protected-instance-field', 'private-instance-field'])
-  'abstract-field', // = ['public-abstract-field', 'protected-abstract-field', 'private-abstract-field'])
+  "static-field", // = ["public-static-field", "protected-static-field", "private-static-field"]
+  "instance-field", // = ["public-instance-field", "protected-instance-field", "private-instance-field"]
+  "abstract-field", // = ["public-abstract-field", "protected-abstract-field", "private-abstract-field"]
 
   // Constructors
-  'constructor', // = ['public-constructor', 'protected-constructor', 'private-constructor'])
+  "constructor", // = ["public-constructor", "protected-constructor", "private-constructor"]
 
   // Methods
-  'static-method', // = ['public-static-method', 'protected-static-method', 'private-static-method'])
-  'instance-method', // = ['public-instance-method', 'protected-instance-method', 'private-instance-method'])
-  'abstract-method', // = ['public-abstract-method', 'protected-abstract-method', 'private-abstract-method'])
+  "static-method", // = ["public-static-method", "protected-static-method", "private-static-method"]
+  "instance-method", // = ["public-instance-method", "protected-instance-method", "private-instance-method"]
+  "abstract-method" // = ["public-abstract-method", "protected-abstract-method", "private-abstract-method"]
 ]
 ```
 
@@ -116,21 +175,21 @@
 
 The third grouping option is to ignore both scope and accessibility.
 
-```json5
+```jsonc
 [
   // Index signature
   // No grouping for index signature. See above.
 
   // Fields
-  'field', // = ['public-static-field', 'protected-static-field', 'private-static-field', 'public-instance-field', 'protected-instance-field', 'private-instance-field',
-  //              'public-abstract-field', 'protected-abstract-field', private-abstract-field'])
+  "field", // = ["public-static-field", "protected-static-field", "private-static-field", "public-instance-field", "protected-instance-field", "private-instance-field",
+  //              "public-abstract-field", "protected-abstract-field", private-abstract-field"]
 
   // Constructors
   // Only the accessibility of constructors is configurable. See above.
 
   // Methods
-  'method', // = ['public-static-method', 'protected-static-method', 'private-static-method', 'public-instance-method', 'protected-instance-method', 'private-instance-method',
-  //                'public-abstract-method', 'protected-abstract-method', 'private-abstract-method'])
+  "method" // = ["public-static-method", "protected-static-method", "private-static-method", "public-instance-method", "protected-instance-method", "private-instance-method",
+  //                "public-abstract-method", "protected-abstract-method", "private-abstract-method"]
 ]
 ```
 
@@ -138,15 +197,21 @@
 
 The default configuration looks as follows:
 
-```json
+```jsonc
 {
   "default": [
+    // Index signature
     "signature",
 
+    // Fields
     "public-static-field",
     "protected-static-field",
     "private-static-field",
 
+    "public-decorated-field",
+    "protected-decorated-field",
+    "private-decorated-field",
+
     "public-instance-field",
     "protected-instance-field",
     "private-instance-field",
@@ -163,14 +228,26 @@
     "instance-field",
     "abstract-field",
 
+    "decorated-field",
+
     "field",
 
+    // Constructors
+    "public-constructor",
+    "protected-constructor",
+    "private-constructor",
+
     "constructor",
 
+    // Methods
     "public-static-method",
     "protected-static-method",
     "private-static-method",
 
+    "public-decorated-method",
+    "protected-decorated-method",
+    "private-decorated-method",
+
     "public-instance-method",
     "protected-instance-method",
     "private-instance-method",
@@ -187,6 +264,8 @@
     "instance-method",
     "abstract-method",
 
+    "decorated-method",
+
     "method"
   ]
 }
@@ -194,6 +273,8 @@
 
 Note: The default configuration contains member group types which contain other member types (see above). This is intentional to provide better error messages.
 
+Note: By default, the members are not sorted. If you want to sort them alphabetically, you have to provide a custom configuration.
+
 ## Examples
 
 ### Custom `default` configuration
@@ -448,7 +529,7 @@
 };
 ```
 
-Issue: Public static fields should come first, followed by static fields and instance fields.
+Note: Public static fields should come first, followed by static fields and instance fields.
 
 ##### Correct examples
 
@@ -542,21 +623,19 @@
 
 ##### Correct example
 
-Examples of **correct** code for `{ "classes": [...] }` option:
-
 ```ts
 class Foo {
   private C: string; // (irrelevant)
 
   public D: string; // (irrelevant)
 
-  public static E: string; // -> public static field
+  public B(): void {} // -> public instance method
 
   constructor() {} // (irrelevant)
 
   public static A(): void {} // (irrelevant)
 
-  public B(): void {} // -> public instance method
+  public static E: string; // -> public static field
 }
 ```
 
@@ -712,6 +791,73 @@
 };
 ```
 
+### Sorting alphabetically within member groups
+
+It is possible to sort all members within a group alphabetically.
+
+#### Configuration: `{ "default": { "memberTypes": <Default Order>, "order": "alphabetically" } }`
+
+This will apply the default order (see above) and enforce an alphabetic order within each group.
+
+##### Incorrect examples
+
+```ts
+interface Foo {
+  a: x;
+  b: x;
+  c: x;
+
+  new (): Bar;
+  (): Baz;
+
+  a(): void;
+  b(): void;
+  c(): void;
+
+  // Wrong group order, should be placed before all field definitions
+  [a: string]: number;
+}
+```
+
+```ts
+interface Foo {
+  [a: string]: number;
+
+  a: x;
+  b: x;
+  c: x;
+
+  new (): Bar;
+  (): Baz;
+
+  // Wrong alphabetic order within group
+  c(): void;
+  b(): void;
+  a(): void;
+}
+```
+
+### Sorting alphabetically while ignoring member groups
+
+It is also possible to sort all members and ignore the member groups completely.
+
+#### Configuration: `{ "default": { "memberTypes": "never", "order": "alphabetically" } }`
+
+##### Incorrect example
+
+```ts
+interface Foo {
+  b(): void;
+  a: b;
+
+  [a: string]: number; // Order doesn't matter (no sortable identifier)
+  new (): Bar; // Order doesn't matter (no sortable identifier)
+  (): Baz; // Order doesn't matter (no sortable identifier)
+}
+```
+
+Note: Wrong alphabetic order `b(): void` should come after `a: b`.
+
 ## When Not To Use It
 
 If you don't care about the general structure of your classes and interfaces, then you will not need this rule.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/method-signature-style.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/method-signature-style.md
new file mode 100644
index 0000000..4358ee3
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/method-signature-style.md
@@ -0,0 +1,94 @@
+# Enforces using a particular method signature syntax. (`method-signature-style`)
+
+There are two ways to define an object/interface function property.
+
+```ts
+// method shorthand syntax
+interface T1 {
+  func(arg: string): number;
+}
+
+// regular property with function type
+interface T2 {
+  func: (arg: string) => number;
+}
+```
+
+A good practice is to use the TypeScript's `strict` option (which implies `strictFunctionTypes`) which enables correct typechecking for function properties only (method signatures get old behavior).
+
+TypeScript FAQ:
+
+> A method and a function property of the same type behave differently.
+> Methods are always bivariant in their argument, while function properties are contravariant in their argument under `strictFunctionTypes`.
+
+See the reasoning behind that in the [TypeScript PR for the compiler option](https://github.com/microsoft/TypeScript/pull/18654).
+
+## Options
+
+This rule accepts one string option:
+
+- `"property"`: Enforce using property signature for functions. Use this to enforce maximum correctness together with TypeScript's strict mode.
+- `"method"`: Enforce using method signature for functions. Use this if you aren't using TypeScript's strict mode and prefer this style.
+
+The default is `"property"`.
+
+## Rule Details
+
+Examples of **incorrect** code with `property` option.
+
+```ts
+interface T1 {
+  func(arg: string): number;
+}
+type T2 = {
+  func(arg: boolean): void;
+};
+interface T3 {
+  func(arg: number): void;
+  func(arg: string): void;
+  func(arg: boolean): void;
+}
+```
+
+Examples of **correct** code with `property` option.
+
+```ts
+interface T1 {
+  func: (arg: string) => number;
+}
+type T2 = {
+  func: (arg: boolean) => void;
+};
+// this is equivalent to the overload
+interface T3 {
+  func: ((arg: number) => void) &
+    ((arg: string) => void) &
+    ((arg: boolean) => void);
+}
+```
+
+Examples of **incorrect** code with `method` option.
+
+```ts
+interface T1 {
+  func: (arg: string) => number;
+}
+type T2 = {
+  func: (arg: boolean) => void;
+};
+```
+
+Examples of **correct** code with `method` option.
+
+```ts
+interface T1 {
+  func(arg: string): number;
+}
+type T2 = {
+  func(arg: boolean): void;
+};
+```
+
+## When Not To Use It
+
+If you don't want to enforce a particular style for object/interface function types, and/or if you don't use `strictFunctionTypes`, then you don't need this rule.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/naming-convention.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/naming-convention.md
index 7766123..d57bc1c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/naming-convention.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/naming-convention.md
@@ -1,7 +1,7 @@
 # Enforces naming conventions for everything across a codebase (`naming-convention`)
 
 Enforcing naming conventions helps keep the codebase consistent, and reduces overhead when thinking about how to name a variable.
-Additionally, a well designed style guide can help communicate intent, such as by enforcing all private properties begin with an `_`, and all global-level constants are written in `UPPER_CASE`.
+Additionally, a well-designed style guide can help communicate intent, such as by enforcing all private properties begin with an `_`, and all global-level constants are written in `UPPER_CASE`.
 
 There are many different rules that have existed over time, but they have had the problem of not having enough granularity, meaning it was hard to have a well defined style guide, and most of the time you needed 3 or more rules at once to enforce different conventions, hoping they didn't conflict.
 
@@ -39,7 +39,7 @@
   suffix?: string[];
 
   // selector options
-  selector: Selector;
+  selector: Selector | Selector[];
   filter?:
     | string
     | {
@@ -51,7 +51,7 @@
   types?: Types<Selector>[];
 }[];
 
-// the default config essentially does the same thing as ESLint's camelcase rule
+// the default config is similar to ESLint's camelcase rule but more strict
 const defaultOptions: Options = [
   {
     selector: 'default',
@@ -150,9 +150,13 @@
 
 If these are provided, the identifier must start with one of the provided values. For example, if you provide `{ prefix: ['IFace', 'Class', 'Type'] }`, then the following names are valid: `IFaceFoo`, `ClassBar`, `TypeBaz`, but the name `Bang` is not valid, as it contains none of the prefixes.
 
+**Note:** As [documented above](#format-options), the prefix is trimmed before format is validated, therefore PascalCase must be used to allow variables such as `isEnabled` using the prefix `is`.
+
 ### Selector Options
 
 - `selector` (see "Allowed Selectors, Modifiers and Types" below).
+  - Accepts one or array of selectors to define an option block that applies to one or multiple selectors.
+  - For example, if you provide `{ selector: ['variable', 'function'] }`, then it will apply the same option to variable and function nodes.
 - `modifiers` allows you to specify which modifiers to granularly apply to, such as the accessibility (`private`/`public`/`protected`), or if the thing is `static`, etc.
   - The name must match _all_ of the modifiers.
   - For example, if you provide `{ modifiers: ['private', 'static', 'readonly'] }`, then it will only match something that is `private static readonly`, and something that is just `private` will not match.
@@ -174,7 +178,7 @@
 [
   /* 1 */ { selector: 'default', format: ['camelCase'] },
   /* 2 */ { selector: 'variable', format: ['snake_case'] },
-  /* 3 */ { selector: 'variable', type: ['boolean'], format: ['UPPER_CASE'] },
+  /* 3 */ { selector: 'variable', types: ['boolean'], format: ['UPPER_CASE'] },
   /* 4 */ { selector: 'variableLike', format: ['PascalCase'] },
 ];
 ```
@@ -190,7 +194,7 @@
 Individual Selectors match specific, well-defined sets. There is no overlap between each of the individual selectors.
 
 - `variable` - matches any `var` / `let` / `const` variable name.
-  - Allowed `modifiers`: none.
+  - Allowed `modifiers`: `const`.
   - Allowed `types`: `boolean`, `string`, `number`, `function`, `array`.
 - `function` - matches any named function declaration or named function expression.
   - Allowed `modifiers`: none.
@@ -277,6 +281,8 @@
 
 ### Enforce that boolean variables are prefixed with an allowed verb
 
+**Note:** As [documented above](#format-options), the prefix is trimmed before format is validated, thus PascalCase must be used to allow variables such as `isEnabled`.
+
 ```json
 {
   "@typescript-eslint/naming-convention": [
@@ -305,8 +311,25 @@
 }
 ```
 
+### Enforce that all const variables are in UPPER_CASE
+
+```json
+{
+  "@typescript-eslint/naming-convention": [
+    "error",
+    {
+      "selector": "variable",
+      "modifiers": ["const"],
+      "format": ["UPPER_CASE"]
+    }
+  ]
+}
+```
+
 ### Enforce that type parameters (generics) are prefixed with `T`
 
+This allows you to emulate the old `generic-type-naming` rule.
+
 ```json
 {
   "@typescript-eslint/naming-convention": [
@@ -320,10 +343,91 @@
 }
 ```
 
+### Enforce that interface names do not begin with an `I`
+
+This allows you to emulate the old `interface-name-prefix` rule.
+
+```json
+{
+  "@typescript-eslint/naming-convention": [
+    "error",
+    {
+      "selector": "interface",
+      "format": ["PascalCase"],
+      "custom": {
+        "regex": "^I[A-Z]",
+        "match": false
+      }
+    }
+  ]
+}
+```
+
+### Enforce that variable and function names are in camelCase
+
+This allows you to lint multiple type with same pattern.
+
+```json
+{
+  "@typescript-eslint/naming-convention": [
+    "error",
+    {
+      "selector": ["variable", "function"],
+      "format": ["camelCase"],
+      "leadingUnderscore": "allow"
+    }
+  ]
+}
+```
+
+### Ignore properties that require quotes
+
+Sometimes you have to use a quoted name that breaks the convention (for example, HTTP headers).
+If this is a common thing in your codebase, then you can use the `filter` option in one of two ways:
+
+You can use the `filter` option to ignore specific names only:
+
+```jsonc
+{
+  "@typescript-eslint/naming-convention": [
+    "error",
+    {
+      "selector": "property",
+      "format": ["strictCamelCase"],
+      "filter": {
+        // you can expand this regex to add more allowed names
+        "regex": "^(Property-Name-One|Property-Name-Two)$",
+        "match": false
+      }
+    }
+  ]
+}
+```
+
+You can use the `filter` option to ignore names that require quoting:
+
+```jsonc
+{
+  "@typescript-eslint/naming-convention": [
+    "error",
+    {
+      "selector": "property",
+      "format": ["strictCamelCase"],
+      "filter": {
+        // you can expand this regex as you find more cases that require quoting that you want to allow
+        "regex": "[- ]",
+        "match": false
+      }
+    }
+  ]
+}
+```
+
 ### Enforce the codebase follows ESLint's `camelcase` conventions
 
 ```json
 {
+  "camelcase": "off",
   "@typescript-eslint/naming-convention": [
     "error",
     {
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-array-constructor.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-array-constructor.md
index 3ab59cb..fb9a68e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-array-constructor.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-array-constructor.md
@@ -1,10 +1,9 @@
 # Disallow generic `Array` constructors (`no-array-constructor`)
 
-Use of the `Array` constructor to construct a new array is generally discouraged in favor of array literal notation because of the single-argument pitfall and because the `Array` global may be redefined. Two exceptions are when the Array constructor is used to intentionally create sparse arrays of a specified size by giving the constructor a single numeric argument, or when using TypeScript type parameters to specify the type of the items of the array (`new Array<Foo>()`).
-
 ## Rule Details
 
-This rule disallows `Array` constructors.
+This rule extends the base [`eslint/no-array-constructor`](https://eslint.org/docs/rules/no-array-constructor) rule.
+It adds support for the generically typed `Array` constructor (`new Array<Foo>()`).
 
 Examples of **incorrect** code for this rule:
 
@@ -27,8 +26,18 @@
 new Array(someOtherArray.length);
 ```
 
-## When Not To Use It
+## How to use
 
-This rule enforces a nearly universal stylistic concern. That being said, this rule may be disabled if the constructor style is preferred.
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "no-array-constructor": "off",
+  "@typescript-eslint/no-array-constructor": ["error"]
+}
+```
 
-<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/7685fed33b15763ee3cf7dbe1facfc5ba85173f3/docs/rules/no-array-constructor.md)</sup>
+## Options
+
+See [`eslint/no-array-constructor` options](https://eslint.org/docs/rules/no-array-constructor#options).
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-array-constructor.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-base-to-string.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-base-to-string.md
index 4050047..f1c2aba 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-base-to-string.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-base-to-string.md
@@ -1,13 +1,13 @@
 # Requires that `.toString()` is only called on objects which provide useful information when stringified (`no-base-to-string`)
 
-JavaScript will call `toString()` on an object when it is converted to a string, such as when `+` adding to a string or in <code>`${}`</code> template literals.
+JavaScript will call `toString()` on an object when it is converted to a string, such as when `+` adding to a string or in `${}` template literals.
 
 The default Object `.toString()` returns `"[object Object]"`, so this rule requires stringified objects define a more useful `.toString()` method.
 
 Note that `Function` provides its own `.toString()` that returns the function's code.
 Functions are not flagged by this rule.
 
-This rule has some overlap with with [`restrict-plus-operands`](./restrict-plus-operands.md) and [`restrict-template-expressions`](./restrict-template-expressions.md).
+This rule has some overlap with [`restrict-plus-operands`](./restrict-plus-operands.md) and [`restrict-template-expressions`](./restrict-template-expressions.md).
 
 ## Rule Details
 
@@ -52,6 +52,34 @@
 `Value: ${literalWithToString}`;
 ```
 
+## Options
+
+```ts
+type Options = {
+  ignoredTypeNames?: string[];
+};
+
+const defaultOptions: Options = {
+  ignoredTypeNames: ['RegExp'],
+};
+```
+
+### `ignoredTypeNames`
+
+A string array of type names to ignore, this is useful for types missing `toString()` (but actually has `toString()`).
+There are some types missing `toString()` in old version TypeScript, like `RegExp`, `URL`, `URLSearchParams` etc.
+
+The following patterns are considered correct with the default options `{ ignoredTypeNames: ["RegExp"] }`:
+
+```ts
+`${/regex/}`;
+'' + /regex/;
+/regex/.toString();
+let value = /regex/;
+value.toString();
+let text = `${value}`;
+```
+
 ## When Not To Use It
 
 If you don't mind `"[object Object]"` in your strings, then you will not need this rule.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-confusing-non-null-assertion.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-confusing-non-null-assertion.md
new file mode 100644
index 0000000..a61f6a8
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-confusing-non-null-assertion.md
@@ -0,0 +1,46 @@
+# Disallow non-null assertion in locations that may be confusing (`no-confusing-non-null-assertion`)
+
+## Rule Details
+
+Using a non-null assertion (`!`) next to an assign or equals check (`=` or `==` or `===`) creates code that is confusing as it looks similar to a not equals check (`!=` `!==`).
+
+```typescript
+a! == b; // a non-null assertions(`!`) and an equals test(`==`)
+a !== b; // not equals test(`!==`)
+a! === b; // a non-null assertions(`!`) and an triple equals test(`===`)
+```
+
+Examples of **incorrect** code for this rule:
+
+```ts
+interface Foo {
+  bar?: string;
+  num?: number;
+}
+
+const foo: Foo = getFoo();
+const isEqualsBar = foo.bar! == 'hello';
+const isEqualsNum = 1 + foo.num! == 2;
+```
+
+Examples of **correct** code for this rule:
+
+<!-- prettier-ignore -->
+```ts
+interface Foo {
+  bar?: string;
+  num?: number;
+}
+
+const foo: Foo = getFoo();
+const isEqualsBar = foo.bar == 'hello';
+const isEqualsNum = (1 + foo.num!) == 2;
+```
+
+## When Not To Use It
+
+If you don't care about this confusion, then you will not need this rule.
+
+## Further Reading
+
+- [`Issue: Easy misunderstanding: "! ==="`](https://github.com/microsoft/TypeScript/issues/37837) in [TypeScript repo](https://github.com/microsoft/TypeScript)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-dupe-class-members.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-dupe-class-members.md
index d0b3b57..ddfc1b9 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-dupe-class-members.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-dupe-class-members.md
@@ -7,7 +7,7 @@
 
 ## How to use
 
-```cjson
+```jsonc
 {
   // note you must disable the base rule as it can report incorrect errors
   "no-dupe-class-members": "off",
@@ -15,4 +15,8 @@
 }
 ```
 
+## Options
+
+See [`eslint/no-dupe-class-members` options](https://eslint.org/docs/rules/no-dupe-class-members#options).
+
 <sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-dupe-class-members.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-empty-function.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-empty-function.md
index 17628cb..356700d 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-empty-function.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-empty-function.md
@@ -1,80 +1,90 @@
 # Disallow empty functions (`no-empty-function`)
 
-Empty functions can reduce readability because readers need to guess whether it’s intentional or not. So writing a clear comment for empty functions is a good practice.
-
 ## Rule Details
 
-The `@typescript-eslint/no-empty-function` rule extends the `no-empty-function` rule from ESLint core, and adds support for handling TypeScript specific code that would otherwise trigger the rule.
+This rule extends the base [`eslint/no-empty-function`](https://eslint.org/docs/rules/no-empty-function) rule.
+It adds support for handling TypeScript specific code that would otherwise trigger the rule.
 
-One example of valid TypeScript specific code that would otherwise trigger the `no-empty-function` rule is the use of [parameter properties](https://www.typescriptlang.org/docs/handbook/classes.html#parameter-properties) in constructor functions:
+One example of valid TypeScript specific code that would otherwise trigger the `no-empty-function` rule is the use of [parameter properties](https://www.typescriptlang.org/docs/handbook/classes.html#parameter-properties) in constructor functions.
 
-```typescript
-class Person {
-  constructor(private firstName: string, private surname: string) {}
-}
-```
+## How to use
 
-The above code is functionally equivalent to:
-
-```typescript
-class Person {
-  private firstName: string;
-  private surname: string;
-
-  constructor(firstName: string, surname: string) {
-    this.firstName = firstName;
-    this.surname = surname;
-  }
-}
-```
-
-Parameter properties enable both the _declaration_ and _initialization_ of member properties in a single location, avoiding the boilerplate & duplication that is common when initializing member properties from parameter values in a constructor function.
-
-In these cases, although the constructor has an empty function body, it is technically valid and should not trigger an error.
-
-See the [ESLint documentation](https://eslint.org/docs/rules/no-empty-function) for more details on the `no-empty-function` rule.
-
-## Rule Changes
-
-```cjson
+```jsonc
 {
-    // note you must disable the base rule as it can report incorrect errors
-    "no-empty-function": "off",
-    "@typescript-eslint/no-empty-function": "error"
+  // note you must disable the base rule as it can report incorrect errors
+  "no-empty-function": "off",
+  "@typescript-eslint/no-empty-function": ["error"]
 }
 ```
 
 ## Options
 
-This rule has an object option:
-
-- `allow` (`string[]`)
-  - `"protected-constructors"` - Protected class constructors.
-  - `"private-constructors"` - Private class constructors.
-  - [See the other options allowed](https://github.com/eslint/eslint/blob/master/docs/rules/no-empty-function.md#options)
-
-#### allow: protected-constructors
-
-Examples of **correct** code for the `{ "allow": ["protected-constructors"] }` option:
+See [`eslint/no-empty-function` options](https://eslint.org/docs/rules/no-empty-function#options).
+This rule adds the following options:
 
 ```ts
-/*eslint @typescript-eslint/no-empty-function: ["error", { "allow": ["protected-constructors"] }]*/
+type AdditionalAllowOptionEntries =
+  | 'private-constructors'
+  | 'protected-constructors'
+  | 'decoratedFunctions';
 
+type AllowOptionEntries =
+  | BaseNoEmptyFunctionAllowOptionEntries
+  | AdditionalAllowOptionEntries;
+
+interface Options extends BaseNoEmptyFunctionOptions {
+  allow?: Array<AllowOptionEntries>;
+}
+const defaultOptions: Options = {
+  ...baseNoEmptyFunctionDefaultOptions,
+  allow: [],
+};
+```
+
+### allow: `private-constructors`
+
+Examples of correct code for the `{ "allow": ["private-constructors"] }` option:
+
+```ts
+class Foo {
+  private constructor() {}
+}
+```
+
+### allow: `protected-constructors`
+
+Examples of correct code for the `{ "allow": ["protected-constructors"] }` option:
+
+```ts
 class Foo {
   protected constructor() {}
 }
 ```
 
-#### allow: private-constructors
+### allow: `decoratedFunctions`
 
-Examples of **correct** code for the `{ "allow": ["private-constructors"] }` option:
+Examples of correct code for the `{ "allow": ["decoratedFunctions"] }` option:
 
 ```ts
-/*eslint @typescript-eslint/no-empty-function: ["error", { "allow": ["private-constructors"] }]*/
+@decorator()
+function foo() {}
 
 class Foo {
-  private constructor() {}
+  @decorator()
+  foo() {}
 }
 ```
 
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "no-empty-function": "off",
+  "@typescript-eslint/no-empty-function": ["error"]
+}
+```
+
+---
+
 <sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-empty-function.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-explicit-any.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-explicit-any.md
index 0c27139..7aeb465 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-explicit-any.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-explicit-any.md
@@ -119,30 +119,23 @@
 function foo3(...args: Array<any>): void {}
 function foo4(...args: ReadonlyArray<any>): void {}
 
-const bar1 = (...args: any[]): void {}
-const bar2 = (...args: readonly any[]): void {}
-const bar3 = (...args: Array<any>): void {}
-const bar4 = (...args: ReadonlyArray<any>): void {}
+declare function bar(...args: any[]): void;
 
-const baz1 = function (...args: any[]) {}
-const baz2 = function (...args: readonly any[]) {}
-const baz3 = function (...args: Array<any>) {}
-const baz4 = function (...args: ReadonlyArray<any>) {}
+const baz = (...args: any[]) => {};
+const qux = function (...args: any[]) {};
 
-interface Qux1 { (...args: any[]): void; }
-interface Qux2 { (...args: readonly any[]): void; }
-interface Qux3 { (...args: Array<any>): void; }
-interface Qux4 { (...args: ReadonlyArray<any>): void; }
+type Quux = (...args: any[]) => void;
+type Quuz = new (...args: any[]) => void;
 
-function quux1(fn: (...args: any[]) => void): void {}
-function quux2(fn: (...args: readonly any[]) => void): void {}
-function quux3(fn: (...args: Array<any>) => void): void {}
-function quux4(fn: (...args: ReadonlyArray<any>) => void): void {}
-
-function quuz1(): ((...args: any[]) => void) {}
-function quuz2(): ((...args: readonly any[]) => void) {}
-function quuz3(): ((...args: Array<any>) => void) {}
-function quuz4(): ((...args: ReadonlyArray<any>) => void) {}
+interface Grault {
+  (...args: any[]): void;
+}
+interface Corge {
+  new (...args: any[]): void;
+}
+interface Garply {
+  f(...args: any[]): void;
+}
 ```
 
 Examples of **correct** code for the `{ "ignoreRestArgs": true }` option:
@@ -155,30 +148,23 @@
 function foo3(...args: Array<any>): void {}
 function foo4(...args: ReadonlyArray<any>): void {}
 
-const bar1 = (...args: any[]): void {}
-const bar2 = (...args: readonly any[]): void {}
-const bar3 = (...args: Array<any>): void {}
-const bar4 = (...args: ReadonlyArray<any>): void {}
+declare function bar(...args: any[]): void;
 
-const baz1 = function (...args: any[]) {}
-const baz2 = function (...args: readonly any[]) {}
-const baz3 = function (...args: Array<any>) {}
-const baz4 = function (...args: ReadonlyArray<any>) {}
+const baz = (...args: any[]) => {};
+const qux = function (...args: any[]) {};
 
-interface Qux1 { (...args: any[]): void; }
-interface Qux2 { (...args: readonly any[]): void; }
-interface Qux3 { (...args: Array<any>): void; }
-interface Qux4 { (...args: ReadonlyArray<any>): void; }
+type Quux = (...args: any[]) => void;
+type Quuz = new (...args: any[]) => void;
 
-function quux1(fn: (...args: any[]) => void): void {}
-function quux2(fn: (...args: readonly any[]) => void): void {}
-function quux3(fn: (...args: Array<any>) => void): void {}
-function quux4(fn: (...args: ReadonlyArray<any>) => void): void {}
-
-function quuz1(): ((...args: any[]) => void) {}
-function quuz2(): ((...args: readonly any[]) => void) {}
-function quuz3(): ((...args: Array<any>) => void) {}
-function quuz4(): ((...args: ReadonlyArray<any>) => void) {}
+interface Grault {
+  (...args: any[]): void;
+}
+interface Corge {
+  new (...args: any[]): void;
+}
+interface Garply {
+  f(...args: any[]): void;
+}
 ```
 
 ## When Not To Use It
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-extra-parens.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-extra-parens.md
index bcb21de..8173b2e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-extra-parens.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-extra-parens.md
@@ -1,22 +1,22 @@
 # Disallow unnecessary parentheses (`no-extra-parens`)
 
-This rule restricts the use of parentheses to only where they are necessary.
-
 ## Rule Details
 
 This rule extends the base [`eslint/no-extra-parens`](https://eslint.org/docs/rules/no-extra-parens) rule.
-It supports all options and features of the base rule plus TS type assertions.
+It adds support for TypeScript type assertions.
 
 ## How to use
 
-```cjson
+```jsonc
 {
-    // note you must disable the base rule as it can report incorrect errors
-    "no-extra-parens": "off",
-    "@typescript-eslint/no-extra-parens": ["error"]
+  // note you must disable the base rule as it can report incorrect errors
+  "no-extra-parens": "off",
+  "@typescript-eslint/no-extra-parens": ["error"]
 }
 ```
 
 ## Options
 
 See [`eslint/no-extra-parens` options](https://eslint.org/docs/rules/no-extra-parens#options).
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-extra-parens.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-extra-semi.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-extra-semi.md
index bed5e29..f6865bd 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-extra-semi.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-extra-semi.md
@@ -3,10 +3,11 @@
 ## Rule Details
 
 This rule extends the base [`eslint/no-extra-semi`](https://eslint.org/docs/rules/no-extra-semi) rule.
+It adds support for class properties.
 
 ## How to use
 
-```cjson
+```jsonc
 {
   // note you must disable the base rule as it can report incorrect errors
   "no-extra-semi": "off",
@@ -14,4 +15,8 @@
 }
 ```
 
+## Options
+
+See [`eslint/no-extra-semi` options](https://eslint.org/docs/rules/no-extra-semi#options).
+
 <sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-extra-semi.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-extraneous-class.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-extraneous-class.md
index b387d67..abc84f2 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-extraneous-class.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-extraneous-class.md
@@ -58,7 +58,7 @@
   allowEmpty?: boolean;
   // allow extraneous classes if they only contain static members
   allowStaticOnly?: boolean;
-  // allow extraneous classes if they are have a decorator
+  // allow extraneous classes if they have a decorator
   allowWithDecorator?: boolean;
 };
 
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-floating-promises.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-floating-promises.md
index ffaa542..bda8c26 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-floating-promises.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-floating-promises.md
@@ -51,16 +51,20 @@
 type Options = {
   // if true, checking void expressions will be skipped
   ignoreVoid?: boolean;
+  // if true, checking for async iife will be skipped
+  ignoreIIFE?: boolean;
 };
 
 const defaults = {
-  ignoreVoid: false,
+  ignoreVoid: true,
+  ignoreIIFE: false,
 };
 ```
 
 ### `ignoreVoid`
 
-This allows to easily suppress false-positives with void operator.
+This allows you to stop the rule reporting promises consumed with void operator.
+This can be a good way to explicitly mark a promise as intentionally not awaited.
 
 Examples of **correct** code for this rule with `{ ignoreVoid: true }`:
 
@@ -73,10 +77,27 @@
 void Promise.reject('value');
 ```
 
+With this option set to `true`, and if you are using `no-void`, you should turn on the [`allowAsAStatement`](https://eslint.org/docs/rules/no-void#allowasstatement) option.
+
+### `ignoreIIFE`
+
+This allows you to skip checking of async iife
+
+Examples of **correct** code for this rule with `{ ignoreIIFE: true }`:
+
+```ts
+await(async function () {
+  await res(1);
+})();
+
+(async function () {
+  await res(1);
+})();
+```
+
 ## When Not To Use It
 
-If you do not use Promise-like values in your codebase or want to allow them to
-remain unhandled.
+If you do not use Promise-like values in your codebase, or want to allow them to remain unhandled.
 
 ## Related to
 
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-implicit-any-catch.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-implicit-any-catch.md
new file mode 100644
index 0000000..8ef946b
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-implicit-any-catch.md
@@ -0,0 +1,76 @@
+# Disallow usage of the implicit `any` type in catch clauses (`no-implicit-any-catch`)
+
+TypeScript 4.0 added support for adding an explicit `any` or `unknown` type annotation on a catch clause variable.
+
+By default, TypeScript will type a catch clause variable as `any`, so explicitly annotating it as `unknown` can add a lot of safety to your codebase.
+
+The `noImplicitAny` flag in TypeScript does not cover this for backwards compatibility reasons.
+
+## Rule Details
+
+This rule requires an explicit type to be declared on a catch clause variable.
+
+The following pattern is considered a warning:
+
+```ts
+try {
+  // ...
+} catch (e) {
+  // ...
+}
+```
+
+The following pattern is **_not_** considered a warning:
+
+<!-- TODO: prettier currently removes the type annotations, re-enable this once prettier is updated -->
+<!-- prettier-ignore-start -->
+
+```ts
+try {
+  // ...
+} catch (e: unknown) {
+  // ...
+}
+```
+
+<!-- prettier-ignore-end -->
+
+## Options
+
+The rule accepts an options object with the following properties:
+
+```ts
+type Options = {
+  // if false, disallow specifying `: any` as the error type as well. See also `no-explicit-any`
+  allowExplicitAny: boolean;
+};
+
+const defaults = {
+  allowExplicitAny: false,
+};
+```
+
+### `allowExplicitAny`
+
+The follow is is **_not_** considered a warning with `{ allowExplicitAny: true }`
+
+<!-- TODO: prettier currently removes the type annotations, re-enable this once prettier is updated -->
+<!-- prettier-ignore-start -->
+
+```ts
+try {
+  // ...
+} catch (e: any) {
+  // ...
+}
+```
+
+<!-- prettier-ignore-end -->
+
+## When Not To Use It
+
+If you are not using TypeScript 4.0 (or greater), then you will not be able to use this rule, annotations on catch clauses is not supported.
+
+## Further Reading
+
+- [TypeScript 4.0 Beta Release Notes](https://devblogs.microsoft.com/typescript/announcing-typescript-4-0-beta/#unknown-on-catch)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-implied-eval.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-implied-eval.md
index a16844a..a03ce72 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-implied-eval.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-implied-eval.md
@@ -56,19 +56,19 @@
 ```ts
 /* eslint @typescript-eslint/no-implied-eval: "error" */
 
-setTimeout(function() {
+setTimeout(function () {
   alert('Hi!');
 }, 100);
 
-setInterval(function() {
+setInterval(function () {
   alert('Hi!');
 }, 100);
 
-setImmediate(function() {
+setImmediate(function () {
   alert('Hi!');
 });
 
-execScript(function() {
+execScript(function () {
   alert('Hi!');
 });
 
@@ -76,7 +76,7 @@
 setTimeout(fn, 100);
 
 const foo = {
-  fn: function() {},
+  fn: function () {},
 };
 setTimeout(foo.fn, 100);
 setTimeout(foo.fn.bind(this), 100);
@@ -88,6 +88,16 @@
 setTimeout(Foo.fn, 100);
 ```
 
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "no-implied-eval": "off",
+  "@typescript-eslint/no-implied-eval": ["error"]
+}
+```
+
 ## When Not To Use It
 
 If you want to allow `new Function()` or `setTimeout()`, `setInterval()`, `setImmediate()` and `execScript()` with string arguments, then you can safely disable this rule.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-invalid-this.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-invalid-this.md
new file mode 100644
index 0000000..728c42b
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-invalid-this.md
@@ -0,0 +1,26 @@
+# disallow `this` keywords outside of classes or class-like objects (`no-invalid-this`)
+
+## Rule Details
+
+This rule extends the base [`eslint/no-invalid-this`](https://eslint.org/docs/rules/no-invalid-this) rule.
+It adds support for TypeScript's `this` parameters.
+
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "no-invalid-this": "off",
+  "@typescript-eslint/no-invalid-this": ["error"]
+}
+```
+
+## Options
+
+See [`eslint/no-invalid-this` options](https://eslint.org/docs/rules/no-invalid-this#options).
+
+## When Not To Use It
+
+When you are indifferent as to how your variables are initialized.
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-invalid-this.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-invalid-void-type.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-invalid-void-type.md
new file mode 100644
index 0000000..567d9c0
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-invalid-void-type.md
@@ -0,0 +1,126 @@
+# Disallows usage of `void` type outside of generic or return types (`no-invalid-void-type`)
+
+Disallows usage of `void` type outside of return types or generic type arguments.
+If `void` is used as return type, it shouldn’t be a part of intersection/union type with most other types.
+
+## Rationale
+
+The `void` type means “nothing” or that a function does not return any value,
+in contrast with implicit `undefined` type which means that a function returns a value `undefined`.
+So “nothing” cannot be mixed with any other types, other than `never`, which accepts all types.
+If you need this - use the `undefined` type instead.
+
+## Rule Details
+
+This rule aims to ensure that the `void` type is only used in valid places.
+
+The following patterns are considered warnings:
+
+```ts
+type PossibleValues = string | number | void;
+type MorePossibleValues = string | ((number & any) | (string | void));
+
+function logSomething(thing: void) {}
+function printArg<T = void>(arg: T) {}
+
+logAndReturn<void>(undefined);
+
+interface Interface {
+  lambda: () => void;
+  prop: void;
+}
+
+class MyClass {
+  private readonly propName: void;
+}
+```
+
+The following patterns are not considered warnings:
+
+```ts
+type NoOp = () => void;
+
+function noop(): void {}
+
+let trulyUndefined = void 0;
+
+async function promiseMeSomething(): Promise<void> {}
+
+type stillVoid = void | never;
+```
+
+### Options
+
+```ts
+interface Options {
+  allowInGenericTypeArguments?: boolean | string[];
+  allowAsThisParameter?: boolean;
+}
+
+const defaultOptions: Options = {
+  allowInGenericTypeArguments: true,
+  allowAsThisParameter: false,
+};
+```
+
+#### `allowInGenericTypeArguments`
+
+This option lets you control if `void` can be used as a valid value for generic type parameters.
+
+Alternatively, you can provide an array of strings which whitelist which types may accept `void` as a generic type parameter.
+
+Any types considered valid by this option will be considered valid as part of a union type with `void`.
+
+This option is `true` by default.
+
+The following patterns are considered warnings with `{ allowInGenericTypeArguments: false }`:
+
+```ts
+logAndReturn<void>(undefined);
+
+let voidPromise: Promise<void> = new Promise<void>(() => {});
+let voidMap: Map<string, void> = new Map<string, void>();
+```
+
+The following patterns are considered warnings with `{ allowInGenericTypeArguments: ['Ex.Mx.Tx'] }`:
+
+```ts
+logAndReturn<void>(undefined);
+
+type NotAllowedVoid1 = Mx.Tx<void>;
+type NotAllowedVoid2 = Tx<void>;
+type NotAllowedVoid3 = Promise<void>;
+```
+
+The following patterns are not considered warnings with `{ allowInGenericTypeArguments: ['Ex.Mx.Tx'] }`:
+
+```ts
+type AllowedVoid = Ex.Mx.Tx<void>;
+type AllowedVoidUnion = void | Ex.Mx.Tx<void>;
+```
+
+#### `allowAsThisParameter`
+
+This option allows specifying a `this` parameter of a function to be `void` when set to `true`.
+This pattern can be useful to explicitly label function types that do not use a `this` argument. [See the TypeScript docs for more information](https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters-in-callbacks).
+
+This option is `false` by default.
+
+The following patterns are considered warnings with `{ allowAsThisParameter: false }` but valid with `{ allowAsThisParameter: true }`:
+
+```ts
+function doThing(this: void) {}
+class Example {
+  static helper(this: void) {}
+  callback(this: void) {}
+}
+```
+
+## When Not To Use It
+
+If you don't care about if `void` is used with other types,
+or in invalid places, then you don't need this rule.
+
+## Compatibility
+
+- TSLint: [invalid-void](https://palantir.github.io/tslint/rules/invalid-void/)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-loop-func.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-loop-func.md
new file mode 100644
index 0000000..d4e66d6
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-loop-func.md
@@ -0,0 +1,22 @@
+# Disallow function declarations that contain unsafe references inside loop statements (`no-loop-func`)
+
+## Rule Details
+
+This rule extends the base [`eslint/no-loop-func`](https://eslint.org/docs/rules/no-loop-func) rule.
+It adds support for TypeScript types.
+
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "no-loop-func": "off",
+  "@typescript-eslint/no-loop-func": ["error"]
+}
+```
+
+## Options
+
+See [`eslint/no-loop-func` options](https://eslint.org/docs/rules/no-loop-func#options).
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-loop-func.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-loss-of-precision.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-loss-of-precision.md
new file mode 100644
index 0000000..d6cf7b7
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-loss-of-precision.md
@@ -0,0 +1,19 @@
+# Disallow literal numbers that lose precision (`no-loss-of-precision`)
+
+## Rule Details
+
+This rule extends the base [`eslint/no-loss-of-precision`](https://eslint.org/docs/rules/no-loss-of-precision) rule.
+It adds support for [numeric separators](https://github.com/tc39/proposal-numeric-separator).
+Note that this rule requires ESLint v7.
+
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "no-loss-of-precision": "off",
+  "@typescript-eslint/no-loss-of-precision": ["error"]
+}
+```
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-loss-of-precision.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-magic-numbers.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-magic-numbers.md
index 377e927..f41204c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-magic-numbers.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-magic-numbers.md
@@ -1,25 +1,72 @@
 # Disallow magic numbers (`no-magic-numbers`)
 
-'Magic numbers' are numbers that occur multiple times in code without an explicit meaning.
-They should preferably be replaced by named constants.
-
 ## Rule Details
 
-The `@typescript-eslint/no-magic-numbers` rule extends the `no-magic-numbers` rule from ESLint core, and adds support for handling TypeScript specific code that would otherwise trigger the rule.
+This rule extends the base [`eslint/no-magic-numbers`](https://eslint.org/docs/rules/no-magic-numbers) rule.
+It adds support for:
 
-See the [ESLint documentation](https://eslint.org/docs/rules/no-magic-numbers) for more details on the `no-magic-numbers` rule.
+- numeric literal types (`type T = 1`),
+- `enum` members (`enum Foo { bar = 1 }`),
+- `readonly` class properties (`class Foo { readonly bar = 1 }`).
 
-## Rule Changes
+## How to use
 
-```cjson
+```jsonc
 {
-    // note you must disable the base rule as it can report incorrect errors
-    "no-magic-numbers": "off",
-    "@typescript-eslint/no-magic-numbers": ["error", { "ignoreNumericLiteralTypes": true }]
+  // note you must disable the base rule as it can report incorrect errors
+  "no-magic-numbers": "off",
+  "@typescript-eslint/no-magic-numbers": [
+    "error",
+    {
+      /* options */
+    }
+  ]
 }
 ```
 
-In addition to the options supported by the `no-magic-numbers` rule in ESLint core, the rule adds the following options:
+## Options
+
+See [`eslint/no-magic-numbers` options](https://eslint.org/docs/rules/no-magic-numbers#options).
+This rule adds the following options:
+
+```ts
+interface Options extends BaseNoMagicNumbersOptions {
+  ignoreEnums?: boolean;
+  ignoreNumericLiteralTypes?: boolean;
+  ignoreReadonlyClassProperties?: boolean;
+}
+
+const defaultOptions: Options = {
+  ...baseNoMagicNumbersDefaultOptions,
+  ignoreEnums: false,
+  ignoreNumericLiteralTypes: false,
+  ignoreReadonlyClassProperties: false,
+};
+```
+
+### `ignoreEnums`
+
+A boolean to specify if enums used in TypeScript are considered okay. `false` by default.
+
+Examples of **incorrect** code for the `{ "ignoreEnums": false }` option:
+
+```ts
+/*eslint @typescript-eslint/no-magic-numbers: ["error", { "ignoreEnums": false }]*/
+
+enum foo = {
+    SECOND = 1000,
+}
+```
+
+Examples of **correct** code for the `{ "ignoreEnums": true }` option:
+
+```ts
+/*eslint @typescript-eslint/no-magic-numbers: ["error", { "ignoreEnums": true }]*/
+
+enum foo = {
+    SECOND = 1000,
+}
+```
 
 ### `ignoreNumericLiteralTypes`
 
@@ -69,28 +116,4 @@
 }
 ```
 
-### `ignoreEnums`
-
-A boolean to specify if enums used in TypeScript are considered okay. `false` by default.
-
-Examples of **incorrect** code for the `{ "ignoreEnums": false }` option:
-
-```ts
-/*eslint @typescript-eslint/no-magic-numbers: ["error", { "ignoreEnums": false }]*/
-
-enum foo = {
-    SECOND = 1000,
-}
-```
-
-Examples of **correct** code for the `{ "ignoreEnums": true }` option:
-
-```ts
-/*eslint @typescript-eslint/no-magic-numbers: ["error", { "ignoreEnums": true }]*/
-
-enum foo = {
-    SECOND = 1000,
-}
-```
-
 <sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-magic-numbers.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-namespace.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-namespace.md
index 3bcb1a3..b155c2a 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-namespace.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-namespace.md
@@ -16,7 +16,7 @@
 
 - `allowDeclarations` set to `true` will allow you to `declare` custom TypeScript modules and namespaces (Default: `false`).
 - `allowDefinitionFiles` set to `true` will allow you to `declare` and use custom TypeScript modules and namespaces
-  inside definition files (Default: `false`).
+  inside definition files (Default: `true`).
 
 Examples of **incorrect** code for the default `{ "allowDeclarations": false, "allowDefinitionFiles": false }` options:
 
@@ -51,6 +51,14 @@
 declare module 'foo' {}
 declare module foo {}
 declare namespace foo {}
+
+declare global {
+  namespace foo {}
+}
+
+declare module foo {
+  namespace foo {}
+}
 ```
 
 Examples of **incorrect** code for the `{ "allowDeclarations": false }` option:
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-non-null-asserted-optional-chain.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-non-null-asserted-optional-chain.md
index 95ee927..fdb2a8a 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-non-null-asserted-optional-chain.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-non-null-asserted-optional-chain.md
@@ -11,8 +11,12 @@
 /* eslint @typescript-eslint/no-non-null-asserted-optional-chain: "error" */
 
 foo?.bar!;
-foo?.bar!.baz;
 foo?.bar()!;
+
+// Prior to TS3.9, foo?.bar!.baz meant (foo?.bar).baz - i.e. the non-null assertion is applied to the entire chain so far.
+// For TS3.9 and greater, the non-null assertion is only applied to the property itself, so it's safe.
+// The following is incorrect code if you're using less than TS3.9
+foo?.bar!.baz;
 foo?.bar!();
 foo?.bar!().baz;
 ```
@@ -27,6 +31,11 @@
 foo?.bar();
 foo?.bar();
 foo?.bar().baz;
+
+// The following is correct code if you're using TS3.9 or greater
+foo?.bar!.baz;
+foo?.bar!();
+foo?.bar!().baz;
 ```
 
 ## When Not To Use It
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-non-null-assertion.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-non-null-assertion.md
index 5241a43..04de576 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-non-null-assertion.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-non-null-assertion.md
@@ -23,7 +23,7 @@
 }
 
 const foo: Foo = getFoo();
-const includesBaz: boolean = foo.bar && foo.bar.includes('baz');
+const includesBaz: boolean = foo.bar?.includes('baz') ?? false;
 ```
 
 ## When Not To Use It
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-redeclare.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-redeclare.md
new file mode 100644
index 0000000..4b5164d
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-redeclare.md
@@ -0,0 +1,79 @@
+# Disallow variable redeclaration (`no-redeclare`)
+
+## Rule Details
+
+This rule extends the base [`eslint/no-redeclare`](https://eslint.org/docs/rules/no-redeclare) rule.
+It adds support for TypeScript function overloads, and declaration merging.
+
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "no-redeclare": "off",
+  "@typescript-eslint/no-redeclare": ["error"]
+}
+```
+
+## Options
+
+See [`eslint/no-redeclare` options](https://eslint.org/docs/rules/no-redeclare#options).
+This rule adds the following options:
+
+```ts
+interface Options extends BaseNoRedeclareOptions {
+  ignoreDeclarationMerge?: boolean;
+}
+
+const defaultOptions: Options = {
+  ...baseNoRedeclareDefaultOptions,
+  ignoreDeclarationMerge: true,
+};
+```
+
+### `ignoreDeclarationMerge`
+
+When set to `true`, the rule will ignore declaration merges between the following sets:
+
+- interface + interface
+- namespace + namespace
+- class + interface
+- class + namespace
+- class + interface + namespace
+- function + namespace
+
+Examples of **correct** code with `{ ignoreDeclarationMerge: true }`:
+
+```ts
+interface A {
+  prop1: 1;
+}
+interface A {
+  prop2: 2;
+}
+
+namespace Foo {
+  export const a = 1;
+}
+namespace Foo {
+  export const b = 2;
+}
+
+class Bar {}
+namespace Bar {}
+
+function Baz() {}
+namespace Baz {}
+```
+
+**Note:** Even with this option set to true, this rule will report if you name a type and a variable the same name. **_This is intentional_**.
+Declaring a variable and a type and a variable the same is usually an accident, and it can lead to hard-to-understand code.
+If you have a rare case where you're intentionally naming a type the same name as a variable, use a disable comment. For example:
+
+```ts
+type something = string;
+// eslint-disable-next-line @typescript-eslint/no-redeclare -- intentionally naming the variable the same as the type
+const something = 2;
+```
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-redeclare.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-shadow.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-shadow.md
new file mode 100644
index 0000000..ed241b8
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-shadow.md
@@ -0,0 +1,87 @@
+# Disallow variable declarations from shadowing variables declared in the outer scope (`no-shadow`)
+
+## Rule Details
+
+This rule extends the base [`eslint/no-shadow`](https://eslint.org/docs/rules/no-shadow) rule.
+It adds support for TypeScript's `this` parameters, and adds options for TypeScript features.
+
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "no-shadow": "off",
+  "@typescript-eslint/no-shadow": ["error"]
+}
+```
+
+## Options
+
+See [`eslint/no-shadow` options](https://eslint.org/docs/rules/no-shadow#options).
+This rule adds the following options:
+
+```ts
+interface Options extends BaseNoShadowOptions {
+  ignoreTypeValueShadow?: boolean;
+  ignoreFunctionTypeParameterNameValueShadow?: boolean;
+}
+
+const defaultOptions: Options = {
+  ...baseNoShadowDefaultOptions,
+  ignoreTypeValueShadow: true,
+  ignoreFunctionTypeParameterNameValueShadow: true,
+};
+```
+
+### `ignoreTypeValueShadow`
+
+When set to `true`, the rule will ignore the case when you name a type the same as a variable.
+
+TypeScript allows types and variables to shadow one-another. This is generally safe because you cannot use variables in type locations without a `typeof` operator, so there's little risk of confusion.
+
+Examples of **correct** code with `{ ignoreTypeValueShadow: true }`:
+
+```ts
+type Foo = number;
+const Foo = 1;
+
+interface Bar {
+  prop: number;
+}
+const Bar = 'test';
+```
+
+### `ignoreFunctionTypeParameterNameValueShadow`
+
+When set to `true`, the rule will ignore the case when you name a function type argument the same as a variable.
+
+Each of a function type's arguments creates a value variable within the scope of the function type. This is done so that you can reference the type later using the `typeof` operator:
+
+```ts
+type Func = (test: string) => typeof test;
+
+declare const fn: Func;
+const result = fn('str'); // typeof result === string
+```
+
+This means that function type arguments shadow value variable names in parent scopes:
+
+```ts
+let test = 1;
+type TestType = typeof test; // === number
+type Func = (test: string) => typeof test; // this "test" references the argument, not the variable
+
+declare const fn: Func;
+const result = fn('str'); // typeof result === string
+```
+
+If you do not use the `typeof` operator in a function type return type position, you can safely turn this option on.
+
+Examples of **correct** code with `{ ignoreFunctionTypeParameterNameValueShadow: true }`:
+
+```ts
+const test = 1;
+type Func = (test: string) => typeof test;
+```
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-shadow.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-this-alias.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-this-alias.md
index 7f5ee71..324929e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-this-alias.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-this-alias.md
@@ -14,7 +14,7 @@
 > ```js
 > const self = this;
 >
-> setTimeout(function() {
+> setTimeout(function () {
 >   self.doWork();
 > });
 > ```
@@ -39,15 +39,15 @@
 
 You can pass an object option:
 
-```json5
+```jsonc
 {
-  '@typescript-eslint/no-this-alias': [
-    'error',
+  "@typescript-eslint/no-this-alias": [
+    "error",
     {
-      allowDestructuring: true, // Allow `const { props, state } = this`; false by default
-      allowedNames: ['self'], // Allow `const self = this`; `[]` by default
-    },
-  ],
+      "allowDestructuring": true, // Allow `const { props, state } = this`; false by default
+      "allowedNames": ["self"] // Allow `const self = this`; `[]` by default
+    }
+  ]
 }
 ```
 
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-throw-literal.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-throw-literal.md
index 3b7ee9c..0b89f10 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-throw-literal.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-throw-literal.md
@@ -79,6 +79,16 @@
 throw new CustomError();
 ```
 
+## How to use
+
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "no-throw-literal": "off",
+  "@typescript-eslint/no-throw-literal": ["error"]
+}
+```
+
 ---
 
 <sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-throw-literal.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-type-alias.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-type-alias.md
index 9d7f1d4..5b720b2 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-type-alias.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-type-alias.md
@@ -69,7 +69,7 @@
 - Debug your code: interfaces create a new name, so is easy to identify the base type of an object
   while debugging the application.
 
-Finally, mapping types is an advance technique, leaving it open can quickly become a pain point
+Finally, mapping types is an advanced technique and leaving it open can quickly become a pain point
 in your application.
 
 ## Rule Details
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unnecessary-boolean-literal-compare.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unnecessary-boolean-literal-compare.md
index 81b4a5c..d600bb7 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unnecessary-boolean-literal-compare.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unnecessary-boolean-literal-compare.md
@@ -8,6 +8,12 @@
 A comparison is considered unnecessary if it checks a boolean literal against any variable with just the `boolean` type.
 A comparison is **_not_** considered unnecessary if the type is a union of booleans (`string | boolean`, `someObject | boolean`).
 
+**Note**: Throughout this page, only strict equality (`===` and `!==`) are
+used in the examples. However, the implementation of the rule does not
+distinguish between strict and loose equality. Any example below that uses
+`===` would be treated the same way if `==` was used, and any example below
+that uses `!==` would be treated the same way if `!=` was used.
+
 Examples of **incorrect** code for this rule:
 
 ```ts
@@ -30,12 +36,99 @@
 declare const someStringBoolean: boolean | string;
 if (someStringBoolean === true) {
 }
+```
 
+## Options
+
+The rule accepts an options object with the following properties.
+
+```ts
+type Options = {
+  // if false, comparisons between a nullable boolean variable to `true` will be checked and fixed
+  allowComparingNullableBooleansToTrue?: boolean;
+  // if false, comparisons between a nullable boolean variable to `false` will be checked and fixed
+  allowComparingNullableBooleansToFalse?: boolean;
+};
+```
+
+### Defaults
+
+This rule always checks comparisons between a boolean variable and a boolean
+literal. Comparisons between nullable boolean variables and boolean literals
+are **not** checked by default.
+
+```ts
+const defaults = {
+  allowComparingNullableBooleansToTrue: true,
+  allowComparingNullableBooleansToFalse: true,
+};
+```
+
+### `allowComparingNullableBooleansToTrue`
+
+Examples of **incorrect** code for this rule with `{ allowComparingNullableBooleansToTrue: false }`:
+
+```ts
+declare const someUndefinedCondition: boolean | undefined;
+if (someUndefinedCondition === true) {
+}
+
+declare const someNullCondition: boolean | null;
+if (someNullCondition !== true) {
+}
+```
+
+Examples of **correct** code for this rule with `{ allowComparingNullableBooleansToTrue: false }`:
+
+```ts
+declare const someUndefinedCondition: boolean | undefined;
+if (someUndefinedCondition) {
+}
+
+declare const someNullCondition: boolean | null;
+if (!someNullCondition) {
+}
+```
+
+### `allowComparingNullableBooleansToFalse`
+
+Examples of **incorrect** code for this rule with `{ allowComparingNullableBooleansToFalse: false }`:
+
+```ts
 declare const someUndefinedCondition: boolean | undefined;
 if (someUndefinedCondition === false) {
 }
+
+declare const someNullCondition: boolean | null;
+if (someNullCondition !== false) {
+}
 ```
 
+Examples of **correct** code for this rule with `{ allowComparingNullableBooleansToFalse: false }`:
+
+```ts
+declare const someUndefinedCondition: boolean | undefined;
+if (someUndefinedCondition ?? true) {
+}
+
+declare const someNullCondition: boolean | null;
+if (!(someNullCondition ?? true)) {
+}
+```
+
+## Fixer
+
+|           Comparison           | Fixer Output                    | Notes                                                                               |
+| :----------------------------: | ------------------------------- | ----------------------------------------------------------------------------------- |
+|     `booleanVar === true`      | `booleanLiteral`                |                                                                                     |
+|     `booleanVar !== true`      | `!booleanLiteral`               |                                                                                     |
+|     `booleanVar === false`     | `!booleanLiteral`               |                                                                                     |
+|     `booleanVar !== false`     | `booleanLiteral`                |                                                                                     |
+| `nullableBooleanVar === true`  | `nullableBooleanVar`            | Only checked/fixed if the `allowComparingNullableBooleansToTrue` option is `false`  |
+| `nullableBooleanVar !== true`  | `!nullableBooleanVar`           | Only checked/fixed if the `allowComparingNullableBooleansToTrue` option is `false`  |
+| `nullableBooleanVar === false` | `nullableBooleanVar ?? true`    | Only checked/fixed if the `allowComparingNullableBooleansToFalse` option is `false` |
+| `nullableBooleanVar !== false` | `!(nullableBooleanVar ?? true)` | Only checked/fixed if the `allowComparingNullableBooleansToFalse` option is `false` |
+
 ## Related to
 
 - TSLint: [no-boolean-literal-compare](https://palantir.github.io/tslint/rules/no-boolean-literal-compare)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unnecessary-condition.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unnecessary-condition.md
index f2bea6f..bff0f54 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unnecessary-condition.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unnecessary-condition.md
@@ -28,6 +28,12 @@
   // arg can never be nullish, so ?. is unnecessary
   return arg?.length;
 }
+
+// Checks array predicate return types, where possible
+[
+  [1, 2],
+  [3, 4],
+].filter(t => t); // number[] is always truthy
 ```
 
 Examples of **correct** code for this rule:
@@ -50,23 +56,29 @@
   // Necessary, since arg might be nullish
   return arg?.length;
 }
+
+[0, 1, 2, 3].filter(t => t); // number can be truthy or falsy
 ```
 
 ## Options
 
-Accepts an object with the following options:
-
-- `ignoreRhs` (default `false`) - doesn't check if the right-hand side of `&&` and `||` is a necessary condition. For example, the following code is valid with this option on:
-
 ```ts
-function head<T>(items: T[]) {
-  return items.length && items[0].toUpperCase();
-}
+type Options = {
+  // if true, the rule will ignore constant loop conditions
+  allowConstantLoopConditions?: boolean;
+  // if true, the rule will not error when running with a tsconfig that has strictNullChecks turned **off**
+  allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing?: boolean;
+};
+
+const defaultOptions: Options = {
+  allowConstantLoopConditions: false,
+  allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing: false,
+};
 ```
 
-- `allowConstantLoopConditions` (default `false`) - allows constant expressions in loops.
+### `allowConstantLoopConditions`
 
-Example of correct code for when `allowConstantLoopConditions` is `true`:
+Example of correct code for `{ allowConstantLoopConditions: true }`:
 
 ```ts
 while (true) {}
@@ -74,18 +86,15 @@
 do {} while (true);
 ```
 
-- `checkArrayPredicates` (default: `false`) - if set checks that the return value from certain array method callbacks (`filter`, `find`, `some`, `every`) is necessarily conditional.
+### `allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing`
 
-```ts
-// Valid: numbers can be truthy or falsy.
-[0, 1, 2, 3].filter(t => t);
+If this is set to `false`, then the rule will error on every file whose `tsconfig.json` does _not_ have the `strictNullChecks` compiler option (or `strict`) set to `true`.
 
-// Invalid: arrays are always falsy.
-[
-  [1, 2],
-  [3, 4],
-].filter(t => t);
-```
+Without `strictNullChecks`, TypeScript essentially erases `undefined` and `null` from the types. This means when this rule inspects the types from a variable, **it will not be able to tell that the variable might be `null` or `undefined`**, which essentially makes this rule useless.
+
+You should be using `strictNullChecks` to ensure complete type-safety in your codebase.
+
+If for some reason you cannot turn on `strictNullChecks`, but still want to use this rule - you can use this option to allow it - but know that the behavior of this rule is _undefined_ with the compiler option turned off. We will not accept bug reports if you are using this option.
 
 ## When Not To Use It
 
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unnecessary-type-assertion.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unnecessary-type-assertion.md
index 14819c5..4464b64 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unnecessary-type-assertion.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unnecessary-type-assertion.md
@@ -44,6 +44,10 @@
 ```
 
 ```ts
+const foo = 'foo' as const;
+```
+
+```ts
 function foo(x: number | undefined): number {
   return x!;
 }
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unsafe-assignment.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unsafe-assignment.md
new file mode 100644
index 0000000..64207e5
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unsafe-assignment.md
@@ -0,0 +1,72 @@
+# Disallows assigning any to variables and properties (`no-unsafe-assignment`)
+
+Despite your best intentions, the `any` type can sometimes leak into your codebase.
+Assigning an `any` typed value to a variable can be hard to pick up on, particularly if it leaks in from an external library. Operations on the variable will not be checked at all by TypeScript, so it creates a potential safety hole, and source of bugs in your codebase.
+
+## Rule Details
+
+This rule disallows assigning `any` to a variable, and assigning `any[]` to an array destructuring.
+This rule also compares the assigned type to the variable's type to ensure you don't assign an unsafe `any` in a generic position to a receiver that's expecting a specific type. For example, it will error if you assign `Set<any>` to a variable declared as `Set<string>`.
+
+Examples of **incorrect** code for this rule:
+
+```ts
+const x = 1 as any,
+  y = 1 as any;
+const [x] = 1 as any;
+const [x] = [] as any[];
+const [x] = [1 as any];
+[x] = [1] as [any];
+
+function foo(a = 1 as any) {}
+class Foo {
+  constructor(private a = 1 as any) {}
+}
+class Foo {
+  private a = 1 as any;
+}
+
+// generic position examples
+const x: Set<string> = new Set<any>();
+const x: Map<string, string> = new Map<string, any>();
+const x: Set<string[]> = new Set<any[]>();
+const x: Set<Set<Set<string>>> = new Set<Set<Set<any>>>();
+```
+
+Examples of **correct** code for this rule:
+
+```ts
+const x = 1,
+  y = 1;
+const [x] = [1];
+[x] = [1] as [number];
+
+function foo(a = 1) {}
+class Foo {
+  constructor(private a = 1) {}
+}
+class Foo {
+  private a = 1;
+}
+
+// generic position examples
+const x: Set<string> = new Set<string>();
+const x: Map<string, string> = new Map<string, string>();
+const x: Set<string[]> = new Set<string[]>();
+const x: Set<Set<Set<string>>> = new Set<Set<Set<string>>>();
+```
+
+There are cases where the rule allows assignment of `any` to `unknown`.
+
+Example of `any` to `unknown` assignment that are allowed.
+
+```ts
+const x: unknown = y as any;
+const x: unknown[] = y as any[];
+const x: Set<unknown> = y as Set<any>;
+```
+
+## Related to
+
+- [`no-explicit-any`](./no-explicit-any.md)
+- TSLint: [`no-unsafe-any`](https://palantir.github.io/tslint/rules/no-unsafe-any/)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unsafe-call.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unsafe-call.md
new file mode 100644
index 0000000..1000e59
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unsafe-call.md
@@ -0,0 +1,48 @@
+# Disallows calling an any type value (`no-unsafe-call`)
+
+Despite your best intentions, the `any` type can sometimes leak into your codebase.
+The arguments to, and return value of calling an `any` typed variable are not checked at all by TypeScript, so it creates a potential safety hole, and source of bugs in your codebase.
+
+## Rule Details
+
+This rule disallows calling any variable that is typed as `any`.
+
+Examples of **incorrect** code for this rule:
+
+```ts
+declare const anyVar: any;
+declare const nestedAny: { prop: any };
+
+anyVar();
+anyVar.a.b();
+
+nestedAny.prop();
+nestedAny.prop['a']();
+
+new anyVar();
+new nestedAny.prop();
+
+anyVar`foo`;
+nestedAny.prop`foo`;
+```
+
+Examples of **correct** code for this rule:
+
+```ts
+declare const typedVar: () => void;
+declare const typedNested: { prop: { a: () => void } };
+
+typedVar();
+typedNested.prop.a();
+
+(() => {})();
+
+new Map();
+
+String.raw`foo`;
+```
+
+## Related to
+
+- [`no-explicit-any`](./no-explicit-any.md)
+- TSLint: [`no-unsafe-any`](https://palantir.github.io/tslint/rules/no-unsafe-any/)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unsafe-member-access.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unsafe-member-access.md
new file mode 100644
index 0000000..e64294f
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unsafe-member-access.md
@@ -0,0 +1,54 @@
+# Disallows member access on any typed variables (`no-unsafe-member-access`)
+
+Despite your best intentions, the `any` type can sometimes leak into your codebase.
+Member access on `any` typed variables is not checked at all by TypeScript, so it creates a potential safety hole, and source of bugs in your codebase.
+
+## Rule Details
+
+This rule disallows member access on any variable that is typed as `any`.
+
+Examples of **incorrect** code for this rule:
+
+```ts
+declare const anyVar: any;
+declare const nestedAny: { prop: any };
+
+anyVar.a;
+anyVar.a.b;
+anyVar['a'];
+anyVar['a']['b'];
+
+nestedAny.prop.a;
+nestedAny.prop['a'];
+
+const key = 'a';
+nestedAny.prop[key];
+
+// Using an any to access a member is unsafe
+const arr = [1, 2, 3];
+arr[anyVar];
+nestedAny[anyVar];
+```
+
+Examples of **correct** code for this rule:
+
+```ts
+declare const properlyTyped: { prop: { a: string } };
+
+properlyTyped.prop.a;
+properlyTyped.prop['a'];
+
+const key = 'a';
+properlyTyped.prop[key];
+
+const arr = [1, 2, 3];
+arr[1];
+const idx = 1;
+arr[idx];
+arr[idx++];
+```
+
+## Related to
+
+- [`no-explicit-any`](./no-explicit-any.md)
+- TSLint: [`no-unsafe-any`](https://palantir.github.io/tslint/rules/no-unsafe-any/)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unsafe-return.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unsafe-return.md
new file mode 100644
index 0000000..9810be3
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unsafe-return.md
@@ -0,0 +1,89 @@
+# Disallows returning any from a function (`no-unsafe-return`)
+
+Despite your best intentions, the `any` type can sometimes leak into your codebase.
+Returned `any` typed values not checked at all by TypeScript, so it creates a potential safety hole, and source of bugs in your codebase.
+
+## Rule Details
+
+This rule disallows returning `any` or `any[]` from a function.
+This rule also compares the return type to the function's declared/inferred return type to ensure you don't return an unsafe `any` in a generic position to a receiver that's expecting a specific type. For example, it will error if you return `Set<any>` from a function declared as returning `Set<string>`.
+
+Examples of **incorrect** code for this rule:
+
+```ts
+function foo1() {
+  return 1 as any;
+}
+function foo2() {
+  return Object.create(null);
+}
+const foo3 = () => {
+  return 1 as any;
+};
+const foo4 = () => Object.create(null);
+
+function foo5() {
+  return [] as any[];
+}
+function foo6() {
+  return [] as Array<any>;
+}
+function foo7() {
+  return [] as readonly any[];
+}
+function foo8() {
+  return [] as Readonly<any[]>;
+}
+const foo9 = () => {
+  return [] as any[];
+};
+const foo10 = () => [] as any[];
+
+const foo11 = (): string[] => [1, 2, 3] as any[];
+
+// generic position examples
+function assignability1(): Set<string> {
+  return new Set<any>([1]);
+}
+type TAssign = () => Set<string>;
+const assignability2: TAssign = () => new Set<any>([true]);
+```
+
+Examples of **correct** code for this rule:
+
+```ts
+function foo1() {
+  return 1;
+}
+function foo2() {
+  return Object.create(null) as Record<string, unknown>;
+}
+
+const foo3 = () => [];
+const foo4 = () => ['a'];
+
+function assignability1(): Set<string> {
+  return new Set<string>(['foo']);
+}
+type TAssign = () => Set<string>;
+const assignability2: TAssign = () => new Set(['foo']);
+```
+
+There are cases where the rule allows to return `any` to `unknown`.
+
+Examples of `any` to `unknown` return that are allowed.
+
+```ts
+function foo1(): unknown {
+  return JSON.parse(singleObjString); // Return type for JSON.parse is any.
+}
+
+function foo2(): unknown[] {
+  return [] as any[];
+}
+```
+
+## Related to
+
+- [`no-explicit-any`](./no-explicit-any.md)
+- TSLint: [`no-unsafe-any`](https://palantir.github.io/tslint/rules/no-unsafe-any/)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-untyped-public-signature.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-untyped-public-signature.md
deleted file mode 100644
index 87a1789..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-untyped-public-signature.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# Disallow untyped public methods (`no-untyped-public-signature`)
-
-public methods are meant to be used by code outside of your class. By typing both the parameters and the return type of public methods they will be more readable and easy to use.
-
-## Rule Details
-
-This rule aims to ensure that only typed public methods are declared in the code.
-
-The following patterns are considered warnings:
-
-```ts
-// untyped parameter
-public foo(param1): void {
-}
-
-// untyped parameter
-public foo(param1: any): void {
-}
-
-// untyped return type
-public foo(param1: string) {
-}
-
-// untyped return type
-public foo(param1: string): any {
-}
-```
-
-The following patterns are not warnings:
-
-```ts
-// typed public method
-public foo(param1: string): void {
-}
-
-// untyped private method
-private foo(param1) {
-}
-```
-
-## Options
-
-This rule, in its default state, does not require any argument.
-
-### `ignoredMethods`
-
-You may pass method names you would like this rule to ignore, like so:
-
-```cjson
-{
-    "@typescript-eslint/no-untyped-public-signature": ["error", { "ignoredMethods": ["ignoredMethodName"] }]
-}
-```
-
-## When Not To Use It
-
-If you don't wish to type public methods.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unused-expressions.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unused-expressions.md
index 6367412..cb61c2e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unused-expressions.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unused-expressions.md
@@ -1,16 +1,13 @@
 # Disallow unused expressions (`no-unused-expressions`)
 
-This rule aims to eliminate unused expressions which have no effect on the state of the program.
-
 ## Rule Details
 
 This rule extends the base [`eslint/no-unused-expressions`](https://eslint.org/docs/rules/no-unused-expressions) rule.
-It supports all options and features of the base rule.
-This version adds support for numerous typescript features.
+It adds support for optional call expressions `x?.()`, and directive in module declarations.
 
 ## How to use
 
-```cjson
+```jsonc
 {
   // note you must disable the base rule as it can report incorrect errors
   "no-unused-expressions": "off",
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unused-vars.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unused-vars.md
index a84b436..5eaf167 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unused-vars.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-unused-vars.md
@@ -1,305 +1,22 @@
 # Disallow unused variables (`no-unused-vars`)
 
-Variables that are declared and not used anywhere in the code are most likely an error due to incomplete refactoring. Such variables take up space in the code and can lead to confusion by readers.
-
 ## Rule Details
 
-This rule is aimed at eliminating unused variables, functions, and parameters of functions.
+This rule extends the base [`eslint/no-unused-vars`](https://eslint.org/docs/rules/no-unused-vars) rule.
+It adds support for TypeScript features, such as types.
 
-A variable is considered to be used if any of the following are true:
+## How to use
 
-- It represents a function that is called (`doSomething()`)
-- It is read (`var y = x`)
-- It is passed into a function as an argument (`doSomething(x)`)
-- It is read inside of a function that is passed to another function (`doSomething(function() { foo(); })`)
-
-A variable is _not_ considered to be used if it is only ever assigned to (`var x = 5`) or declared.
-
-Examples of **incorrect** code for this rule:
-
-```js
-/*eslint no-unused-vars: "error"*/
-/*global some_unused_var*/
-
-// It checks variables you have defined as global
-some_unused_var = 42;
-
-var x;
-
-// Write-only variables are not considered as used.
-var y = 10;
-y = 5;
-
-// A read for a modification of itself is not considered as used.
-var z = 0;
-z = z + 1;
-
-// By default, unused arguments cause warnings.
-(function(foo) {
-  return 5;
-})();
-
-// Unused recursive functions also cause warnings.
-function fact(n) {
-  if (n < 2) return 1;
-  return n * fact(n - 1);
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "no-unused-vars": "off",
+  "@typescript-eslint/no-unused-vars": ["error"]
 }
-
-// When a function definition destructures an array, unused entries from the array also cause warnings.
-function getY([x, y]) {
-  return y;
-}
-```
-
-Examples of **correct** code for this rule:
-
-```js
-/*eslint no-unused-vars: "error"*/
-
-var x = 10;
-alert(x);
-
-// foo is considered used here
-myFunc(
-  function foo() {
-    // ...
-  }.bind(this),
-);
-
-(function(foo) {
-  return foo;
-})();
-
-var myFunc;
-myFunc = setTimeout(function() {
-  // myFunc is considered used
-  myFunc();
-}, 50);
-
-// Only the second argument from the destructured array is used.
-function getY([, y]) {
-  return y;
-}
-```
-
-### exported
-
-In environments outside of CommonJS or ECMAScript modules, you may use `var` to create a global variable that may be used by other scripts. You can use the `/* exported variableName */` comment block to indicate that this variable is being exported and therefore should not be considered unused.
-
-Note that `/* exported */` has no effect for any of the following:
-
-- when the environment is `node` or `commonjs`
-- when `parserOptions.sourceType` is `module`
-- when `ecmaFeatures.globalReturn` is `true`
-
-The line comment `// exported variableName` will not work as `exported` is not line-specific.
-
-Examples of **correct** code for `/* exported variableName */` operation:
-
-```js
-/* exported global_var */
-
-var global_var = 42;
 ```
 
 ## Options
 
-This rule takes one argument which can be a string or an object. The string settings are the same as those of the `vars` property (explained below).
-
-By default this rule is enabled with `all` option for variables and `after-used` for arguments.
-
-```CJSON
-{
-  "rules": {
-    // note you must disable the base rule as it can report incorrect errors
-    "no-unused-vars": "off",
-    "@typescript-eslint/no-unused-vars": ["error", {
-      "vars": "all",
-      "args": "after-used",
-      "ignoreRestSiblings": false
-    }]
-  }
-}
-```
-
-### `vars`
-
-The `vars` option has two settings:
-
-- `all` checks all variables for usage, including those in the global scope. This is the default setting.
-- `local` checks only that locally-declared variables are used but will allow global variables to be unused.
-
-#### `vars: local`
-
-Examples of **correct** code for the `{ "vars": "local" }` option:
-
-```js
-/*eslint no-unused-vars: ["error", { "vars": "local" }]*/
-/*global some_unused_var */
-
-some_unused_var = 42;
-```
-
-### `varsIgnorePattern`
-
-The `varsIgnorePattern` option specifies exceptions not to check for usage: variables whose names match a regexp pattern. For example, variables whose names contain `ignored` or `Ignored`.
-
-Examples of **correct** code for the `{ "varsIgnorePattern": "[iI]gnored" }` option:
-
-```js
-/*eslint no-unused-vars: ["error", { "varsIgnorePattern": "[iI]gnored" }]*/
-
-var firstVarIgnored = 1;
-var secondVar = 2;
-console.log(secondVar);
-```
-
-### `args`
-
-The `args` option has three settings:
-
-- `after-used` - unused positional arguments that occur before the last used argument will not be checked, but all named arguments and all positional arguments after the last used argument will be checked.
-- `all` - all named arguments must be used.
-- `none` - do not check arguments.
-
-#### `args: after-used`
-
-Examples of **incorrect** code for the default `{ "args": "after-used" }` option:
-
-```js
-/*eslint no-unused-vars: ["error", { "args": "after-used" }]*/
-
-// 2 errors, for the parameters after the last used parameter (bar)
-// "baz" is defined but never used
-// "qux" is defined but never used
-(function(foo, bar, baz, qux) {
-  return bar;
-})();
-```
-
-Examples of **correct** code for the default `{ "args": "after-used" }` option:
-
-```js
-/*eslint no-unused-vars: ["error", {"args": "after-used"}]*/
-
-(function(foo, bar, baz, qux) {
-  return qux;
-})();
-```
-
-#### `args: all`
-
-Examples of **incorrect** code for the `{ "args": "all" }` option:
-
-```js
-/*eslint no-unused-vars: ["error", { "args": "all" }]*/
-
-// 2 errors
-// "foo" is defined but never used
-// "baz" is defined but never used
-(function(foo, bar, baz) {
-  return bar;
-})();
-```
-
-#### `args: none`
-
-Examples of **correct** code for the `{ "args": "none" }` option:
-
-```js
-/*eslint no-unused-vars: ["error", { "args": "none" }]*/
-
-(function(foo, bar, baz) {
-  return bar;
-})();
-```
-
-### `ignoreRestSiblings`
-
-The `ignoreRestSiblings` option is a boolean (default: `false`). Using a [Rest Property](https://github.com/tc39/proposal-object-rest-spread) it is possible to "omit" properties from an object, but by default the sibling properties are marked as "unused". With this option enabled the rest property's siblings are ignored.
-
-Examples of **correct** code for the `{ "ignoreRestSiblings": true }` option:
-
-```js
-/*eslint no-unused-vars: ["error", { "ignoreRestSiblings": true }]*/
-// 'type' is ignored because it has a rest property sibling.
-var { type, ...coords } = data;
-```
-
-### `argsIgnorePattern`
-
-The `argsIgnorePattern` option specifies exceptions not to check for usage: arguments whose names match a regexp pattern. For example, variables whose names begin with an underscore.
-
-Examples of **correct** code for the `{ "argsIgnorePattern": "^_" }` option:
-
-```js
-/*eslint no-unused-vars: ["error", { "argsIgnorePattern": "^_" }]*/
-
-function foo(x, _y) {
-  return x + 1;
-}
-foo();
-```
-
-### `caughtErrors`
-
-The `caughtErrors` option is used for `catch` block arguments validation.
-
-It has two settings:
-
-- `none` - do not check error objects. This is the default setting.
-- `all` - all named arguments must be used.
-
-#### `caughtErrors: none`
-
-Not specifying this rule is equivalent of assigning it to `none`.
-
-Examples of **correct** code for the `{ "caughtErrors": "none" }` option:
-
-```js
-/*eslint no-unused-vars: ["error", { "caughtErrors": "none" }]*/
-
-try {
-  //...
-} catch (err) {
-  console.error('errors');
-}
-```
-
-#### `caughtErrors: all`
-
-Examples of **incorrect** code for the `{ "caughtErrors": "all" }` option:
-
-```js
-/*eslint no-unused-vars: ["error", { "caughtErrors": "all" }]*/
-
-// 1 error
-// "err" is defined but never used
-try {
-  //...
-} catch (err) {
-  console.error('errors');
-}
-```
-
-### `caughtErrorsIgnorePattern`
-
-The `caughtErrorsIgnorePattern` option specifies exceptions not to check for usage: catch arguments whose names match a regexp pattern. For example, variables whose names begin with a string 'ignore'.
-
-Examples of **correct** code for the `{ "caughtErrorsIgnorePattern": "^ignore" }` option:
-
-```js
-/*eslint no-unused-vars: ["error", { "caughtErrorsIgnorePattern": "^ignore" }]*/
-
-try {
-  //...
-} catch (ignoreErr) {
-  console.error('errors');
-}
-```
-
-## When Not To Use It
-
-If you don't want to be notified about unused variables or function arguments, you can safely turn this rule off.
+See [`eslint/no-unused-vars` options](https://eslint.org/docs/rules/no-unused-vars#options).
 
 <sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-unused-vars.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-use-before-define.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-use-before-define.md
index e6acf60..dfdab4d 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-use-before-define.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-use-before-define.md
@@ -1,164 +1,56 @@
 # Disallow the use of variables before they are defined (`no-use-before-define`)
 
-In JavaScript, prior to ES6, variable and function declarations are hoisted to the top of a scope, so it's possible to use identifiers before their formal declarations in code. This can be confusing and some believe it is best to always declare variables and functions before using them.
-
-In ES6, block-level bindings (`let` and `const`) introduce a "temporal dead zone" where a `ReferenceError` will be thrown with any attempt to access the variable before its declaration.
+## PLEASE READ THIS ISSUE BEFORE USING THIS RULE [#1856](https://github.com/typescript-eslint/typescript-eslint/issues/1856)
 
 ## Rule Details
 
-This rule will warn when it encounters a reference to an identifier that has not yet been declared.
+This rule extends the base [`eslint/no-use-before-define`](https://eslint.org/docs/rules/no-use-before-define) rule.
+It adds support for `type`, `interface` and `enum` declarations.
 
-Examples of **incorrect** code for this rule:
+## How to use
 
-```ts
-/*eslint no-use-before-define: "error"*/
-/*eslint-env es6*/
-
-alert(a);
-var a = 10;
-
-f();
-function f() {}
-
-function g() {
-  return b;
-}
-var b = 1;
-
-// With blockBindings: true
+```jsonc
 {
-  alert(c);
-  let c = 1;
+  // note you must disable the base rule as it can report incorrect errors
+  "no-use-before-define": "off",
+  "@typescript-eslint/no-use-before-define": ["error"]
 }
-
-let myVar: StringOrNumber;
-type StringOrNumber = string | number;
-```
-
-Examples of **correct** code for this rule:
-
-```ts
-/*eslint no-use-before-define: "error"*/
-/*eslint-env es6*/
-
-var a;
-a = 10;
-alert(a);
-
-function f() {}
-f(1);
-
-var b = 1;
-function g() {
-  return b;
-}
-
-// With blockBindings: true
-{
-  let C;
-  c++;
-}
-
-type StringOrNumber = string | number;
-let myVar: StringOrNumber;
 ```
 
 ## Options
 
-```json
-{
-  "no-use-before-define": ["error", { "functions": true, "classes": true }]
-}
-```
+See [`eslint/no-use-before-define` options](https://eslint.org/docs/rules/no-use-before-define#options).
+This rule adds the following options:
 
-- `functions` (`boolean`) -
-  The flag which shows whether or not this rule checks function declarations.
-  If this is `true`, this rule warns every reference to a function before the function declaration.
-  Otherwise, ignores those references.
-  Function declarations are hoisted, so it's safe.
-  Default is `true`.
-- `classes` (`boolean`) -
-  The flag which shows whether or not this rule checks class declarations of upper scopes.
-  If this is `true`, this rule warns every reference to a class before the class declaration.
-  Otherwise, ignores those references if the declaration is in upper function scopes.
-  Class declarations are not hoisted, so it might be danger.
-  Default is `true`.
-- `enums` (`boolean`) -
-  The flag which shows whether or not this rule checks enum declarations of upper scopes.
-  If this is `true`, this rule warns every reference to a enum before the enum declaration.
-  Otherwise, ignores those references.
-  Default is `true`.
-- `variables` (`boolean`) -
-  This flag determines whether or not the rule checks variable declarations in upper scopes.
-  If this is `true`, the rule warns every reference to a variable before the variable declaration.
-  Otherwise, the rule ignores a reference if the declaration is in an upper scope, while still reporting the reference if it's in the same scope as the declaration.
-  Default is `true`.
-- `typedefs` (`boolean`, **added** in `@typescript-eslint/eslint-plugin`) -
-  The flag which shows whether or not this rule checks type declarations.
-  If this is `true`, this rule warns every reference to a type before the type declaration.
-  Otherwise, ignores those references.
-  Type declarations are hoisted, so it's safe.
-  Default is `true`.
-
-This rule accepts `"nofunc"` string as an option.
-`"nofunc"` is the same as `{ "functions": false, "classes": true }`.
-
-### `functions`
-
-Examples of **correct** code for the `{ "functions": false }` option:
-
-```js
-/*eslint no-use-before-define: ["error", { "functions": false }]*/
-
-f();
-function f() {}
-```
-
-### `classes`
-
-Examples of **incorrect** code for the `{ "classes": false }` option:
-
-```js
-/*eslint no-use-before-define: ["error", { "classes": false }]*/
-/*eslint-env es6*/
-
-new A();
-class A {}
-```
-
-Examples of **correct** code for the `{ "classes": false }` option:
-
-```js
-/*eslint no-use-before-define: ["error", { "classes": false }]*/
-/*eslint-env es6*/
-
-function foo() {
-  return new A();
+```ts
+interface Options extends BaseNoUseBeforeDefineOptions {
+  enums?: boolean;
+  typedefs?: boolean;
+  ignoreTypeReferences?: boolean;
 }
 
-class A {}
+const defaultOptions: Options = {
+  ...baseNoUseBeforeDefineDefaultOptions,
+  enums: true,
+  typedefs: true,
+  ignoreTypeReferences: true,
+};
 ```
 
 ### `enums`
 
-Examples of **incorrect** code for the `{ "enums": true }` option:
+If this is `true`, this rule warns every reference to a enum before the enum declaration.
+If this is `false`, this rule will ignore references to enums, when the reference is in a child scope.
+
+Examples of **incorrect** code for the `{ "enums": false }` option:
 
 ```ts
-/*eslint no-use-before-define: ["error", { "enums": true }]*/
+/*eslint no-use-before-define: ["error", { "enums": false }]*/
 
-function foo() {
-  return Foo.FOO;
-}
-
-class Test {
-  foo() {
-    return Foo.FOO;
-  }
-}
+const x = Foo.FOO;
 
 enum Foo {
   FOO,
-  BAR,
 }
 ```
 
@@ -176,31 +68,11 @@
 }
 ```
 
-### `variables`
-
-Examples of **incorrect** code for the `{ "variables": false }` option:
-
-```js
-/*eslint no-use-before-define: ["error", { "variables": false }]*/
-
-console.log(foo);
-var foo = 1;
-```
-
-Examples of **correct** code for the `{ "variables": false }` option:
-
-```js
-/*eslint no-use-before-define: ["error", { "variables": false }]*/
-
-function baz() {
-  console.log(foo);
-}
-
-var foo = 1;
-```
-
 ### `typedefs`
 
+If this is `true`, this rule warns every reference to a type before the type declaration.
+If this is `false`, this rule will ignore references to types.
+
 Examples of **correct** code for the `{ "typedefs": false }` option:
 
 ```ts
@@ -210,4 +82,25 @@
 type StringOrNumber = string | number;
 ```
 
-Copied from [the original ESLint rule docs](https://github.com/eslint/eslint/blob/a113cd3/docs/rules/no-use-before-define.md)
+### `ignoreTypeReferences`
+
+If this is `true`, this rule ignores all type references, such as in type annotations and assertions.
+If this is `false`, this will will check all type references.
+
+Examples of **correct** code for the `{ "ignoreTypeReferences": true }` option:
+
+```ts
+/*eslint no-use-before-define: ["error", { "ignoreTypeReferences": true }]*/
+
+let var1: StringOrNumber;
+type StringOrNumber = string | number;
+
+let var2: Enum;
+enum Enum {}
+```
+
+### Other Options
+
+See [`eslint/no-use-before-define` options](https://eslint.org/docs/rules/no-use-before-define#options).
+
+<sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-use-before-define.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-useless-constructor.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-useless-constructor.md
index 757ae5d..524ad4b 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-useless-constructor.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/no-useless-constructor.md
@@ -1,88 +1,26 @@
 # Disallow unnecessary constructors (`no-useless-constructor`)
 
-ES2015 provides a default class constructor if one is not specified. As such, it is unnecessary to provide an empty constructor or one that simply delegates into its parent class, as in the following examples:
-
-```js
-class A {
-  constructor() {}
-}
-
-class A extends B {
-  constructor(value) {
-    super(value);
-  }
-}
-```
-
 ## Rule Details
 
-This rule flags class constructors that can be safely removed without changing how the class works.
+This rule extends the base [`eslint/no-useless-constructor`](https://eslint.org/docs/rules/no-useless-constructor) rule.
+It adds support for:
 
-## Examples
+- constructors marked as `protected` / `private` (i.e. marking a constructor as non-public),
+- `public` constructors when there is no superclass,
+- constructors with only parameter properties.
 
-Examples of **incorrect** code for this rule:
+## How to use
 
-```js
-/*eslint @typescript-eslint/no-useless-constructor: "error"*/
-
-class A {
-  constructor() {}
-}
-
-class A extends B {
-  constructor(...args) {
-    super(...args);
-  }
-}
-```
-
-Examples of **correct** code for this rule:
-
-```js
-/*eslint @typescript-eslint/no-useless-constructor: "error"*/
-
-class A {}
-
-class A {
-  constructor() {
-    doSomething();
-  }
-}
-
-class A extends B {
-  constructor() {
-    super('foo');
-  }
-}
-
-class A extends B {
-  constructor() {
-    super();
-    doSomething();
-  }
-}
-
-class A extends B {
-  constructor(protected name: string) {}
-}
-
-class A extends B {
-  protected constructor() {}
-}
-```
-
-## Rule Changes
-
-```cjson
+```jsonc
 {
-    // note you must disable the base rule as it can report incorrect errors
-    "no-useless-constructor": "off",
-    "@typescript-eslint/no-useless-constructor": "error",
+  // note you must disable the base rule as it can report incorrect errors
+  "no-useless-constructor": "off",
+  "@typescript-eslint/no-useless-constructor": ["error"]
 }
 ```
 
-## When Not To Use It
+## Options
 
-If you don't want to be notified about unnecessary constructors, you can safely disable this rule.
+See [`eslint/no-useless-constructor` options](https://eslint.org/docs/rules/no-useless-constructor#options).
 
 <sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-useless-constructor.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-as-const.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-as-const.md
index bb28819..b710a82 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-as-const.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-as-const.md
@@ -25,4 +25,4 @@
 
 ## When Not To Use It
 
-If you are using typescript < 3.4
+If you are using TypeScript < 3.4
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-enum-initializers.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-enum-initializers.md
new file mode 100644
index 0000000..1e8f568
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-enum-initializers.md
@@ -0,0 +1,70 @@
+# Prefer initializing each enums member value (`prefer-enum-initializers`)
+
+This rule recommends having each `enum`s member value explicitly initialized.
+
+`enum`s are a practical way to organize semantically related constant values. However, by implicitly defining values, `enum`s can lead to unexpected bugs if it's modified without paying attention to the order of its items.
+
+## Rule Details
+
+`enum`s infers sequential numbers automatically when initializers are omitted:
+
+```ts
+enum Status {
+  Open, // infer 0
+  Closed, // infer 1
+}
+```
+
+If a new member is added to the top of `Status`, both `Open` and `Closed` would have its values altered:
+
+```ts
+enum Status {
+  Pending, // infer 0
+  Open, // infer 1
+  Closed, // infer 2
+}
+```
+
+Examples of **incorrect** code for this rule:
+
+```ts
+enum Status {
+  Open = 1,
+  Close,
+}
+
+enum Direction {
+  Up,
+  Down,
+}
+
+enum Color {
+  Red,
+  Green = 'Green'
+  Blue = 'Blue',
+}
+```
+
+Examples of **correct** code for this rule:
+
+```ts
+enum Status {
+  Open = 'Open',
+  Close = 'Close',
+}
+
+enum Direction {
+  Up = 1,
+  Down = 2,
+}
+
+enum Color {
+  Red = 'Red',
+  Green = 'Green',
+  Blue = 'Blue',
+}
+```
+
+## When Not To Use It
+
+If you don't care about `enum`s having implicit values you can safely disable this rule.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-function-type.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-function-type.md
index a3210a1..5c3bc55 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-function-type.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-function-type.md
@@ -24,6 +24,13 @@
 }
 ```
 
+```ts
+interface MixinMethod {
+  // returns the function itself, not the `this` argument.
+  (arg: string): this;
+}
+```
+
 Examples of **correct** code for this rule:
 
 ```ts
@@ -48,6 +55,23 @@
 }
 ```
 
+```ts
+// returns the `this` argument of function, retaining it's type.
+type MixinMethod = <TSelf>(this: TSelf, arg: string) => TSelf;
+// a function that returns itself is much clearer in this form.
+type ReturnsSelf = (arg: string) => ReturnsSelf;
+```
+
+```ts
+// multiple call signatures (overloads) is allowed:
+interface Overloaded {
+  (data: string): number;
+  (id: number): string;
+}
+// this is equivelent to Overloaded interface.
+type Intersection = ((data: string) => number) & ((id: number) => string);
+```
+
 ## When Not To Use It
 
 If you specifically want to use an interface or type literal with a single call signature for stylistic reasons, you can disable this rule.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-literal-enum-member.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-literal-enum-member.md
new file mode 100644
index 0000000..e2350f3
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-literal-enum-member.md
@@ -0,0 +1,51 @@
+# Require that all enum members be literal values to prevent unintended enum member name shadow issues (`prefer-literal-enum-member`)
+
+TypeScript allows the value of an enum member to be many different kinds of valid JavaScript expressions. However, because enums create their own scope whereby each enum member becomes a variable in that scope, unexpected values could be used at runtime. Example:
+
+```ts
+const imOutside = 2;
+const b = 2;
+enum Foo {
+  outer = imOutside,
+  a = 1,
+  b = a,
+  c = b,
+  // does c == Foo.b == Foo.c == 1?
+  // or does c == b == 2?
+}
+```
+
+The answer is that `Foo.c` will be `1` at runtime. The [playground](https://www.typescriptlang.org/play/#src=const%20imOutside%20%3D%202%3B%0D%0Aconst%20b%20%3D%202%3B%0D%0Aenum%20Foo%20%7B%0D%0A%20%20%20%20outer%20%3D%20imOutside%2C%0D%0A%20%20%20%20a%20%3D%201%2C%0D%0A%20%20%20%20b%20%3D%20a%2C%0D%0A%20%20%20%20c%20%3D%20b%2C%0D%0A%20%20%20%20%2F%2F%20does%20c%20%3D%3D%20Foo.b%20%3D%3D%20Foo.c%20%3D%3D%201%3F%0D%0A%20%20%20%20%2F%2F%20or%20does%20c%20%3D%3D%20b%20%3D%3D%202%3F%0D%0A%7D) illustrates this quite nicely.
+
+## Rule Details
+
+This rule is meant to prevent unexpected results in code by requiring the use of literal values as enum members to prevent unexpected runtime behavior. Template literals, arrays, objects, constructors, and all other expression types can end up using a variable from its scope or the parent scope, which can result in the same unexpected behavior at runtime.
+
+Examples of **incorrect** code for this rule:
+
+```ts
+const str = 'Test';
+enum Invalid {
+  A = str, // Variable assignment
+  B = {}, // Object assignment
+  C = `A template literal string`, // Template literal
+  D = new Set(1, 2, 3), // Constructor in assignment
+  E = 2 + 2, // Expression assignment
+}
+```
+
+Examples of **correct** code for this rule:
+
+```ts
+enum Valid {
+  A,
+  B = 'TestStr', // A regular string
+  C = 4, // A number
+  D = null,
+  E = /some_regex/,
+}
+```
+
+## When Not To Use It
+
+If you want use anything other than simple literals as an enum value.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-nullish-coalescing.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-nullish-coalescing.md
index 5b99e5c..bb32c02 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-nullish-coalescing.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-nullish-coalescing.md
@@ -46,7 +46,6 @@
   {
     ignoreConditionalTests?: boolean;
     ignoreMixedLogicalExpressions?: boolean;
-    forceSuggestionFixer?: boolean;
   },
 ];
 
@@ -54,7 +53,6 @@
   {
     ignoreConditionalTests: true,
     ignoreMixedLogicalExpressions: true,
-    forceSuggestionFixer: false,
   },
 ];
 ```
@@ -133,12 +131,6 @@
 
 **_NOTE:_** Errors for this specific case will be presented as suggestions (see below), instead of fixes. This is because it is not always safe to automatically convert `||` to `??` within a mixed logical expression, as we cannot tell the intended precedence of the operator. Note that by design, `??` requires parentheses when used with `&&` or `||` in the same expression.
 
-### `forceSuggestionFixer`
-
-Setting this option to `true` will cause the rule to use ESLint's "suggested fix" mode for all fixes. _This option is provided as to aid in transitioning your codebase onto this rule_.
-
-Suggestion fixes cannot be automatically applied via the `--fix` CLI command, but can be _manually_ chosen to be applied one at a time via an IDE or similar. This makes it safe to run autofixers on an existing codebase without worrying about potential runtime behavior changes from this rule's fixer.
-
 ## When Not To Use It
 
 If you are not using TypeScript 3.7 (or greater), then you will not be able to use this rule, as the operator is not supported.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-optional-chain.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-optional-chain.md
index 9a046b3..6505c93 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-optional-chain.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-optional-chain.md
@@ -70,6 +70,8 @@
 foo?.a?.b?.c?.d?.e;
 ```
 
+**Note:** there are a few edge cases where this rule will false positive. Use your best judgement when evaluating reported errors.
+
 ## When Not To Use It
 
 If you are not using TypeScript 3.7 (or greater), then you will not be able to use this rule, as the operator is not supported.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md
index c69b3b2..74697f2 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md
@@ -74,7 +74,8 @@
 interface CustomArrayType extends ReadonlyArray<string> {
   readonly prop: string;
 }
-function custom1(arg: CustomArrayType) {}
+function custom1(arg: Readonly<CustomArrayType>) {}
+// interfaces that extend the array types are not considered arrays, and thus must be made readonly.
 
 interface CustomFunction {
   (): void;
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-readonly.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-readonly.md
index 6731a75..9ce16a8 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-readonly.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-readonly.md
@@ -52,9 +52,9 @@
 
 You may pass `"onlyInlineLambdas": true` as a rule option within an object to restrict checking only to members immediately assigned a lambda value.
 
-```cjson
+```jsonc
 {
-    "@typescript-eslint/prefer-readonly": ["error", { "onlyInlineLambdas": true }]
+  "@typescript-eslint/prefer-readonly": ["error", { "onlyInlineLambdas": true }]
 }
 ```
 
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-reduce-type-parameter.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-reduce-type-parameter.md
new file mode 100644
index 0000000..d6f6802
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-reduce-type-parameter.md
@@ -0,0 +1,54 @@
+# Prefer using type parameter when calling `Array#reduce` instead of casting (`prefer-reduce-type-parameter`)
+
+It's common to call `Array#reduce` with a generic type, such as an array or object, as the initial value.
+Since these values are empty, their types are not usable:
+
+- `[]` has type `never[]`, which can't have items pushed into it as nothing is type `never`
+- `{}` has type `{}`, which doesn't have an index signature and so can't have properties added to it
+
+A common solution to this problem is to cast the initial value. While this will work, it's not the most optimal
+solution as casting has subtle effects on the underlying types that can allow bugs to slip in.
+
+A better (and lesser known) solution is to pass the type in as a generic parameter to `Array#reduce` explicitly.
+This means that TypeScript doesn't have to try to infer the type, and avoids the common pitfalls that come with casting.
+
+## Rule Details
+
+This rule looks for calls to `Array#reduce`, and warns if an initial value is being passed & casted,
+suggesting instead to pass the cast type to `Array#reduce` as its generic parameter.
+
+Examples of **incorrect** code for this rule:
+
+```ts
+[1, 2, 3].reduce((arr, num) => arr.concat(num * 2), [] as number[]);
+
+['a', 'b'].reduce(
+  (accum, name) => ({
+    ...accum,
+    [name]: true,
+  }),
+  {} as Record<string, boolean>,
+);
+```
+
+Examples of **correct** code for this rule:
+
+```ts
+[1, 2, 3].reduce<number[]>((arr, num) => arr.concat(num * 2), []);
+
+['a', 'b'].reduce<Record<string, boolean>>(
+  (accum, name) => ({
+    ...accum,
+    [name]: true,
+  }),
+  {},
+);
+```
+
+## Options
+
+There are no options.
+
+## When Not To Use It
+
+If you don't want to use typechecking in your linting, you can't use this rule.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-ts-expect-error.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-ts-expect-error.md
new file mode 100644
index 0000000..60fdf79
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/prefer-ts-expect-error.md
@@ -0,0 +1,65 @@
+# Recommends using `@ts-expect-error` over `@ts-ignore` (`prefer-ts-expect-error`)
+
+TypeScript allows you to suppress all errors on a line by placing a single-line comment or a comment block line starting with `@ts-ignore` immediately before the erroring line.
+While powerful, there is no way to know if a `@ts-ignore` is actually suppressing an error without manually investigating what happens when the `@ts-ignore` is removed.
+
+This means its easy for `@ts-ignore`s to be forgotten about, and remain in code even after the error they were suppressing is fixed.
+This is dangerous, as if a new error arises on that line it'll be suppressed by the forgotten about `@ts-ignore`, and so be missed.
+
+To address this, TS3.9 ships with a new single-line comment directive: `// @ts-expect-error`.
+
+This directive operates in the same manner as `@ts-ignore`, but will error if the line it's meant to be suppressing doesn't actually contain an error, making it a lot safer.
+
+## Rule Details
+
+This rule looks for usages of `@ts-ignore`, and flags them to be replaced with `@ts-expect-error`.
+
+Examples of **incorrect** code for this rule:
+
+```ts
+// @ts-ignore
+const str: string = 1;
+
+/**
+ * Explaining comment
+ *
+ * @ts-ignore */
+const multiLine: number = 'value';
+
+/** @ts-ignore */
+const block: string = 1;
+
+const isOptionEnabled = (key: string): boolean => {
+  // @ts-ignore: if key isn't in globalOptions it'll be undefined which is false
+  return !!globalOptions[key];
+};
+```
+
+Examples of **correct** code for this rule:
+
+```ts
+// @ts-expect-error
+const str: string = 1;
+
+/**
+ * Explaining comment
+ *
+ * @ts-expect-error */
+const multiLine: number = 'value';
+
+/** @ts-expect-error */
+const block: string = 1;
+
+const isOptionEnabled = (key: string): boolean => {
+  // @ts-expect-error: if key isn't in globalOptions it'll be undefined which is false
+  return !!globalOptions[key];
+};
+```
+
+## When Not To Use It
+
+If you are **NOT** using TypeScript 3.9 (or greater), then you will not be able to use this rule, as the directive is not supported
+
+## Further Reading
+
+- [Original Implementing PR](https://github.com/microsoft/TypeScript/pull/36014)
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/quotes.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/quotes.md
index e9c37df..6b63587 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/quotes.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/quotes.md
@@ -3,11 +3,11 @@
 ## Rule Details
 
 This rule extends the base [`eslint/quotes`](https://eslint.org/docs/rules/quotes) rule.
-It supports all options and features of the base rule.
+It adds support for TypeScript features which allow quoted names, but not backtick quoted names.
 
 ## How to use
 
-```cjson
+```jsonc
 {
   // note you must disable the base rule as it can report incorrect errors
   "quotes": "off",
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/require-array-sort-compare.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/require-array-sort-compare.md
index 3a939f7..78de198 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/require-array-sort-compare.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/require-array-sort-compare.md
@@ -45,7 +45,40 @@
 
 ## Options
 
-None.
+The rule accepts an options object with the following properties:
+
+```ts
+type Options = {
+  /**
+   * If true, an array which all elements are string is ignored.
+   */
+  ignoreStringArrays?: boolean;
+};
+
+const defaults = {
+  ignoreStringArrays: false,
+};
+```
+
+### `ignoreStringArrays`
+
+Examples of **incorrect** code for this rule with `{ ignoreStringArrays: true }`:
+
+```ts
+const one = 1;
+const two = 2;
+const three = 3;
+[one, two, three].sort();
+```
+
+Examples of **correct** code for this rule with `{ ignoreStringArrays: true }`:
+
+```ts
+const one = '1';
+const two = '2';
+const three = '3';
+[one, two, three].sort();
+```
 
 ## When Not To Use It
 
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/require-await.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/require-await.md
index 23160dc..2d8ad41 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/require-await.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/require-await.md
@@ -1,49 +1,32 @@
 # Disallow async functions which have no `await` expression (`require-await`)
 
-Asynchronous functions that don’t use `await` might not need to be asynchronous functions and could be the unintentional result of refactoring.
-
 ## Rule Details
 
-The `@typescript-eslint/require-await` rule extends the `require-await` rule from ESLint core, and allows for cases where the additional typing information can prevent false positives that would otherwise trigger the rule.
+This rule extends the base [`eslint/require-await`](https://eslint.org/docs/rules/require-await) rule.
+It uses type information to add support for `async` functions that return a `Promise`.
 
-One example is when a function marked as `async` returns a value that is:
+Examples of **correct** code for this rule:
 
-1. already a promise; or
-2. the result of calling another `async` function
-
-```typescript
-async function numberOne(): Promise<number> {
+```ts
+async function returnsPromise1() {
   return Promise.resolve(1);
 }
 
-async function getDataFromApi(endpoint: string): Promise<Response> {
-  return fetch(endpoint);
-}
+const returnsPromise2 = () => returnsPromise1();
 ```
 
-In the above examples, the core `require-await` triggers the following warnings:
+## How to use
 
-```
-async function 'numberOne' has no 'await' expression
-async function 'getDataFromApi' has no 'await' expression
-```
-
-One way to resolve these errors is to remove the `async` keyword. However doing so can cause a conflict with the [`@typescript-eslint/promise-function-async`](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/promise-function-async.md) rule (if enabled), which requires any function returning a promise to be marked as `async`.
-
-Another way to resolve these errors is to add an `await` keyword to the return statements. However doing so can cause a conflict with the [`no-return-await`](https://eslint.org/docs/rules/no-return-await) rule (if enabled), which warns against using `return await` since the return value of an `async` function is always wrapped in `Promise.resolve` anyway.
-
-With the additional typing information available in TypeScript code, this extension to the `require-await` rule is able to look at the _actual_ return types of an `async` function (before being implicitly wrapped in `Promise.resolve`), and avoid the need for an `await` expression when the return value is already a promise.
-
-See the [ESLint documentation](https://eslint.org/docs/rules/require-await) for more details on the `require-await` rule.
-
-## Rule Changes
-
-```cjson
+```jsonc
 {
-    // note you must disable the base rule as it can report incorrect errors
-    "require-await": "off",
-    "@typescript-eslint/require-await": "error"
+  // note you must disable the base rule as it can report incorrect errors
+  "require-await": "off",
+  "@typescript-eslint/require-await": "error"
 }
 ```
 
+## Options
+
+See [`eslint/require-await` options](https://eslint.org/docs/rules/require-await#options).
+
 <sup>Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/require-await.md)</sup>
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/restrict-template-expressions.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/restrict-template-expressions.md
index 549da98..0ee7427 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/restrict-template-expressions.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/restrict-template-expressions.md
@@ -6,6 +6,9 @@
 const arg = 'foo';
 const msg1 = `arg = ${arg}`;
 const msg2 = `arg = ${arg || 'default'}`;
+
+const stringWithKindProp: string & { _kind?: 'MyString' } = 'foo';
+const msg3 = `stringWithKindProp = ${stringWithKindProp}`;
 ```
 
 Examples of **incorrect** code:
@@ -28,14 +31,17 @@
   allowNumber?: boolean;
   // if true, also allow boolean type in template expressions
   allowBoolean?: boolean;
+  // if true, also allow any in template expressions
+  allowAny?: boolean;
   // if true, also allow null and undefined in template expressions
-  allowNullable?: boolean;
+  allowNullish?: boolean;
 };
 
 const defaults = {
-  allowNumber: false,
+  allowNumber: true,
   allowBoolean: false,
-  allowNullable: false,
+  allowAny: false,
+  allowNullish: false,
 };
 ```
 
@@ -59,9 +65,19 @@
 const msg2 = `arg = ${arg || 'not truthy'}`;
 ```
 
-### `allowNullable`
+### `allowAny`
 
-Examples of additional **correct** code for this rule with `{ allowNullable: true }`:
+Examples of additional **correct** code for this rule with `{ allowAny: true }`:
+
+```ts
+const user = JSON.parse('{ "name": "foo" }');
+const msg1 = `arg = ${user.name}`;
+const msg2 = `arg = ${user.name || 'the user with no name'}`;
+```
+
+### `allowNullish`
+
+Examples of additional **correct** code for this rule with `{ allowNullish: true }`:
 
 ```ts
 const arg = condition ? 'ok' : null;
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/return-await.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/return-await.md
index c00c2be..3c621d2 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/return-await.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/return-await.md
@@ -4,65 +4,40 @@
 
 ## Rule Details
 
-The `@typescript-eslint/return-await` rule specifies that awaiting a returned non-promise is never allowed. By default, the rule requires awaiting a returned promise in a `try-catch-finally` block and disallows returning an awaited promise in any other context. Optionally, the rule can require awaiting returned promises in all contexts, or disallow them in all contexts.
+This rule builds on top of the [`eslint/no-return-await`](https://eslint.org/docs/rules/no-return-await) rule.
+It expands upon the base rule to add support for optionally requiring `return await` in certain cases.
 
-## Options
+## How to use
 
-`in-try-catch` (default): `await`-ing a returned promise is required in `try-catch-finally` blocks and disallowed elsewhere.
-
-`always`: `await`-ing a returned promise is required everywhere.
-
-`never`: `await`-ing a returned promise is disallowed everywhere.
-
-```typescript
-// valid in-try-catch
-async function validInTryCatch1() {
-  try {
-    return await Promise.resolve('try');
-  } catch (e) {}
-}
-
-async function validInTryCatch2() {
-  return Promise.resolve('try');
-}
-
-async function validInTryCatch3() {
-  return 'value';
-}
-
-// valid always
-async function validAlways1() {
-  try {
-    return await Promise.resolve('try');
-  } catch (e) {}
-}
-
-async function validAlways2() {
-  return await Promise.resolve('try');
-}
-
-async function validAlways3() {
-  return 'value';
-}
-
-// valid never
-async function validNever1() {
-  try {
-    return Promise.resolve('try');
-  } catch (e) {}
-}
-
-async function validNever2() {
-  return Promise.resolve('try');
-}
-
-async function validNever3() {
-  return 'value';
+```jsonc
+{
+  // note you must disable the base rule as it can report incorrect errors
+  "no-return-await": "off",
+  "@typescript-eslint/return-await": "error"
 }
 ```
 
-```typescript
-// invalid in-try-catch
+## Options
+
+```ts
+type Options = 'in-try-catch' | 'always' | 'never';
+
+const defaultOptions: Options = 'in-try-catch';
+```
+
+### `in-try-catch`
+
+Requires that a returned promise must be `await`ed in `try-catch-finally` blocks, and disallows it elsewhere.
+Specifically:
+
+- if you `return` a promise within a `try`, then it must be `await`ed.
+- if you `return` a promise within a `catch`, and there **_is no_** `finally`, then it **_must not_** be `await`ed.
+- if you `return` a promise within a `catch`, and there **_is a_** `finally`, then it **_must_** be `await`ed.
+- if you `return` a promise within a `finally`, then it **_must not_** be `await`ed.
+
+Examples of **incorrect** code with `in-try-catch`:
+
+```ts
 async function invalidInTryCatch1() {
   try {
     return Promise.resolve('try');
@@ -70,14 +45,95 @@
 }
 
 async function invalidInTryCatch2() {
-  return await Promise.resolve('try');
+  try {
+    throw new Error('error');
+  } catch (e) {
+    return await Promise.resolve('catch');
+  }
 }
 
 async function invalidInTryCatch3() {
-  return await 'value';
+  try {
+    throw new Error('error');
+  } catch (e) {
+    return Promise.resolve('catch');
+  } finally {
+    console.log('cleanup');
+  }
 }
 
-// invalid always
+async function invalidInTryCatch4() {
+  try {
+    throw new Error('error');
+  } catch (e) {
+    throw new Error('error2');
+  } finally {
+    return await Promise.resolve('finally');
+  }
+}
+
+async function invalidInTryCatch5() {
+  return await Promise.resolve('try');
+}
+
+async function invalidInTryCatch6() {
+  return await 'value';
+}
+```
+
+Examples of **correct** code with `in-try-catch`:
+
+```ts
+async function validInTryCatch1() {
+  try {
+    return await Promise.resolve('try');
+  } catch (e) {}
+}
+
+async function validInTryCatch2() {
+  try {
+    throw new Error('error');
+  } catch (e) {
+    return Promise.resolve('catch');
+  }
+}
+
+async function validInTryCatch3() {
+  try {
+    throw new Error('error');
+  } catch (e) {
+    return await Promise.resolve('catch');
+  } finally {
+    console.log('cleanup');
+  }
+}
+
+async function validInTryCatch4() {
+  try {
+    throw new Error('error');
+  } catch (e) {
+    throw new Error('error2');
+  } finally {
+    return Promise.resolve('finally');
+  }
+}
+
+async function validInTryCatch5() {
+  return Promise.resolve('try');
+}
+
+async function validInTryCatch6() {
+  return 'value';
+}
+```
+
+### `always`
+
+Requires that all returned promises are `await`ed.
+
+Examples of **incorrect** code with `always`:
+
+```ts
 async function invalidAlways1() {
   try {
     return Promise.resolve('try');
@@ -91,8 +147,33 @@
 async function invalidAlways3() {
   return await 'value';
 }
+```
 
-// invalid never
+Examples of **correct** code with `always`:
+
+```ts
+async function validAlways1() {
+  try {
+    return await Promise.resolve('try');
+  } catch (e) {}
+}
+
+async function validAlways2() {
+  return await Promise.resolve('try');
+}
+
+async function validAlways3() {
+  return 'value';
+}
+```
+
+### `never`
+
+Disallows all `await`ing any returned promises.
+
+Examples of **incorrect** code with `never`:
+
+```ts
 async function invalidNever1() {
   try {
     return await Promise.resolve('try');
@@ -108,16 +189,20 @@
 }
 ```
 
-The rule also applies to `finally` blocks. So the following would be invalid with default options:
+Examples of **correct** code with `never`:
 
-```typescript
-async function invalid() {
+```ts
+async function validNever1() {
   try {
-    return await Promise.resolve('try');
-  } catch (e) {
-    return Promise.resolve('catch');
-  } finally {
-    // cleanup
-  }
+    return Promise.resolve('try');
+  } catch (e) {}
+}
+
+async function validNever2() {
+  return Promise.resolve('try');
+}
+
+async function validNever3() {
+  return 'value';
 }
 ```
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/semi.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/semi.md
index bbb3154..c233d35 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/semi.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/semi.md
@@ -5,15 +5,13 @@
 ## Rule Details
 
 This rule extends the base [`eslint/semi`](https://eslint.org/docs/rules/semi) rule.
-It supports all options and features of the base rule.
-This version adds support for numerous typescript features.
+It adds support for TypeScript features that require semicolons.
 
-See also the [`@typescript-eslint/member-delimiter-style`](member-delimiter-style.md) rule,
-which allows you to specify the delimiter for `type` and `interface` members.
+See also the [`@typescript-eslint/member-delimiter-style`](member-delimiter-style.md) rule, which allows you to specify the delimiter for `type` and `interface` members.
 
 ## How to use
 
-```cjson
+```jsonc
 {
   // note you must disable the base rule as it can report incorrect errors
   "semi": "off",
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/space-before-function-paren.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/space-before-function-paren.md
index bfbcb22..db2579e 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/space-before-function-paren.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/space-before-function-paren.md
@@ -1,33 +1,13 @@
 # Enforces consistent spacing before function parenthesis (`space-before-function-paren`)
 
-When formatting a function, whitespace is allowed between the function name or `function` keyword and the opening parenthesis. Named functions also require a space between the `function` keyword and the function name, but anonymous functions require no whitespace. For example:
-
-<!-- prettier-ignore -->
-```ts
-function withoutSpace(x) {
-  // ...
-}
-
-function withSpace (x) {
-  // ...
-}
-
-var anonymousWithoutSpace = function() {};
-
-var anonymousWithSpace = function () {};
-```
-
-Style guides may require a space after the `function` keyword for anonymous functions, while others specify no whitespace. Similarly, the space after a function name may or may not be required.
-
 ## Rule Details
 
 This rule extends the base [`eslint/space-before-function-paren`](https://eslint.org/docs/rules/space-before-function-paren) rule.
-It supports all options and features of the base rule.
-This version adds support for generic type parameters on function calls.
+It adds support for generic type parameters on function calls.
 
 ## How to use
 
-```cjson
+```jsonc
 {
   // note you must disable the base rule as it can report incorrect errors
   "space-before-function-paren": "off",
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/strict-boolean-expressions.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/strict-boolean-expressions.md
index cec6215..243d54f 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/strict-boolean-expressions.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/strict-boolean-expressions.md
@@ -1,67 +1,162 @@
 # Restricts the types allowed in boolean expressions (`strict-boolean-expressions`)
 
-Requires that any boolean expression is limited to true booleans rather than
-casting another primitive to a boolean at runtime.
+Forbids usage of non-boolean types in expressions where a boolean is expected.
+`boolean` and `never` types are always allowed.
+Additional types which are considered safe in a boolean context can be configured via options.
 
-It is useful to be explicit, for example, if you were trying to check if a
-number was defined. Doing `if (number)` would evaluate to `false` if `number`
-was defined and `0`. This rule forces these expressions to be explicit and to
-strictly use booleans.
+The following nodes are considered boolean expressions and their type is checked:
 
-The following nodes are checked:
-
-- Arguments to the `!`, `&&`, and `||` operators
-- The condition in a conditional expression `(cond ? x : y)`
+- Argument to the logical negation operator (`!arg`).
+- The condition in a conditional expression (`cond ? x : y`).
 - Conditions for `if`, `for`, `while`, and `do-while` statements.
+- Operands of logical binary operators (`lhs || rhs` and `lhs && rhs`).
+  - Right-hand side operand is ignored when it's not a descendant of another boolean expression.
+    This is to allow usage of boolean operators for their short-circuiting behavior.
+
+## Examples
 
 Examples of **incorrect** code for this rule:
 
 ```ts
-const number = 0;
-if (number) {
-  return;
+// nullable numbers are considered unsafe by default
+let num: number | undefined = 0;
+if (num) {
+  console.log('num is defined');
 }
 
-let foo = bar || 'foobar';
+// nullable strings are considered unsafe by default
+let str: string | null = null;
+if (!str) {
+  console.log('str is empty');
+}
 
-let undefinedItem;
-let foo = undefinedItem ? 'foo' : 'bar';
+// nullable booleans are considered unsafe by default
+function foo(bool?: boolean) {
+  if (bool) {
+    bar();
+  }
+}
 
-let str = 'foo';
-while (str) {
-  break;
+// `any`, unconstrained generics and unions of more than one primitive type are disallowed
+const foo = <T>(arg: T) => (arg ? 1 : 0);
+
+// always-truthy and always-falsy types are disallowed
+let obj = {};
+while (obj) {
+  obj = getObj();
 }
 ```
 
 Examples of **correct** code for this rule:
 
-```ts
-const number = 0;
-if (typeof number !== 'undefined') {
-  return;
+```tsx
+// Using logical operators for their side effects is allowed
+const Component = () => {
+  const entry = map.get('foo') || {};
+  return entry && <p>Name: {entry.name}</p>;
+};
+
+// nullable values should be checked explicitly against null or undefined
+let num: number | undefined = 0;
+if (num != null) {
+  console.log('num is defined');
 }
 
-let foo = typeof bar !== 'undefined' ? bar : 'foobar';
-
-let undefinedItem;
-let foo = typeof undefinedItem !== 'undefined' ? 'foo' : 'bar';
-
-let str = 'foo';
-while (typeof str !== 'undefined') {
-  break;
+let str: string | null = null;
+if (str != null && !str) {
+  console.log('str is empty');
 }
+
+function foo(bool?: boolean) {
+  if (bool ?? false) {
+    bar();
+  }
+}
+
+// `any` types should be cast to boolean explicitly
+const foo = (arg: any) => (Boolean(arg) ? 1 : 0);
 ```
 
 ## Options
 
-Options may be provided as an object with:
+```ts
+type Options = {
+  allowString?: boolean;
+  allowNumber?: boolean;
+  allowNullableObject?: boolean;
+  allowNullableBoolean?: boolean;
+  allowNullableString?: boolean;
+  allowNullableNumber?: boolean;
+  allowAny?: boolean;
+};
 
-- `allowNullable` to allow `undefined` and `null` in addition to `boolean` as a type of all boolean expressions. (`false` by default).
-- `allowSafe` to allow non-falsy types (i.e. non string / number / boolean) in addition to `boolean` as a type of all boolean expressions. (`false` by default).
-- `ignoreRhs` to skip the check on the right hand side of expressions like `a && b` or `a || b` - allows these operators to be used for their short-circuiting behavior. (`false` by default).
+const defaultOptions: Options = {
+  allowString: true,
+  allowNumber: true,
+  allowNullableObject: true,
+  allowNullableBoolean: false,
+  allowNullableString: false,
+  allowNullableNumber: false,
+  allowAny: false,
+  allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing: false,
+};
+```
+
+### `allowString`
+
+Allows `string` in a boolean context.
+This is safe because strings have only one falsy value (`""`).
+Set this to `false` if you prefer the explicit `str != ""` or `str.length > 0` style.
+
+### `allowNumber`
+
+Allows `number` in a boolean context.
+This is safe because numbers have only two falsy values (`0` and `NaN`).
+Set this to `false` if you prefer the explicit `num != 0` and `!Number.isNaN(num)` style.
+
+### `allowNullableObject`
+
+Allows `object | function | symbol | null | undefined` in a boolean context.
+This is safe because objects, functions and symbols don't have falsy values.
+Set this to `false` if you prefer the explicit `obj != null` style.
+
+### `allowNullableBoolean`
+
+Allows `boolean | null | undefined` in a boolean context.
+This is unsafe because nullable booleans can be either `false` or nullish.
+Set this to `false` if you want to enforce explicit `bool ?? false` or `bool ?? true` style.
+Set this to `true` if you don't mind implicitly treating false the same as a nullish value.
+
+### `allowNullableString`
+
+Allows `string | null | undefined` in a boolean context.
+This is unsafe because nullable strings can be either an empty string or nullish.
+Set this to `true` if you don't mind implicitly treating an empty string the same as a nullish value.
+
+### `allowNullableNumber`
+
+Allows `number | null | undefined` in a boolean context.
+This is unsafe because nullable numbers can be either a falsy number or nullish.
+Set this to `true` if you don't mind implicitly treating zero or NaN the same as a nullish value.
+
+### `allowAny`
+
+Allows `any` in a boolean context.
+This is unsafe for obvious reasons.
+Set this to `true` at your own risk.
+
+### `allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing`
+
+If this is set to `false`, then the rule will error on every file whose `tsconfig.json` does _not_ have the `strictNullChecks` compiler option (or `strict`) set to `true`.
+
+Without `strictNullChecks`, TypeScript essentially erases `undefined` and `null` from the types. This means when this rule inspects the types from a variable, **it will not be able to tell that the variable might be `null` or `undefined`**, which essentially makes this rule a lot less useful.
+
+You should be using `strictNullChecks` to ensure complete type-safety in your codebase.
+
+If for some reason you cannot turn on `strictNullChecks`, but still want to use this rule - you can use this option to allow it - but know that the behavior of this rule is _undefined_ with the compiler option turned off. We will not accept bug reports if you are using this option.
 
 ## Related To
 
 - TSLint: [strict-boolean-expressions](https://palantir.github.io/tslint/rules/strict-boolean-expressions)
 
-- [no-unnecessary-condition](./no-unnecessary-condition.md) - essentially a less opinionated alternative to this rule. `strict-boolean-expressions` enforces a specific code style, while `no-unnecessary-condition` is about correctness.
+- [no-unnecessary-condition](./no-unnecessary-condition.md) - Similar rule which reports always-truthy and always-falsy values in conditions
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/type-annotation-spacing.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/type-annotation-spacing.md
index a7c43a7..32b7b65 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/type-annotation-spacing.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/type-annotation-spacing.md
@@ -69,6 +69,8 @@
     name : string;
 }
 
+type Foo = ()=>{};
+type Foo = () =>{};
 type Foo = ()=> {};
 ```
 
@@ -113,6 +115,8 @@
     name : string;
 }
 
+type Foo = ()=>{};
+type Foo = () =>{};
 type Foo = () => {};
 ```
 
@@ -156,6 +160,10 @@
 class Foo {
     name :string;
 }
+
+type Foo = ()=>{};
+type Foo = () =>{};
+type Foo = ()=> {};
 ```
 
 Examples of **correct** code for this rule with `{ "before": true, "after": true }` options:
@@ -169,6 +177,8 @@
 class Foo {
     name : string;
 }
+
+type Foo = () => {};
 ```
 
 ### overrides - colon
@@ -197,12 +207,12 @@
     name :string;
 }
 
-type Foo = {
-    name: (name:string) => string;
-}
+type Foo = () =>{};
+type Foo = ()=> {};
+type Foo = () => {};
 ```
 
-Examples of **correct** code for this rule with `{ "before": true, "after": true, overrides: { colon: { before: true, after: true }} }` options:
+Examples of **correct** code for this rule with `{ "before": false, "after": false, overrides: { colon: { before: true, after: true }} }` options:
 
 <!-- prettier-ignore -->
 ```ts
@@ -217,6 +227,8 @@
 type Foo = {
     name: (name : string)=>string;
 }
+
+type Foo = ()=>{};
 ```
 
 ### overrides - arrow
@@ -245,17 +257,9 @@
     name :string;
 }
 
-type Foo = {
-    name: (name : string)=>string;
-}
-
-type Foo = {
-    name: (name : string) =>string;
-}
-
-type Foo = {
-    name: (name : string)=> string;
-}
+type Foo = ()=>{};
+type Foo = () =>{};
+type Foo = ()=> {};
 ```
 
 Examples of **correct** code for this rule with `{ "before": false, "after": false, overrides: { arrow: { before: true, after: true }} }` options:
@@ -270,9 +274,7 @@
     name:string;
 }
 
-type Foo = {
-    name: (name:string) => string;
-}
+type Foo = () => {};
 ```
 
 ## When Not To Use It
diff --git a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/typedef.md b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/typedef.md
index 07f4bb1..6c96fa0 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/docs/rules/typedef.md
+++ b/node_modules/@typescript-eslint/eslint-plugin/docs/rules/typedef.md
@@ -16,29 +16,43 @@
 }
 ```
 
-> Note: requiring type annotations unnecessarily can be cumbersome to maintain and generally reduces code readability.
-> TypeScript is often better at inferring types than easily written type annotations would allow.
-> Instead of enabling `typedef`, it is generally recommended to use the `--noImplicitAny` and/or `--strictPropertyInitialization` compiler options to enforce type annotations only when useful.
+**_Note:_** requiring type annotations unnecessarily can be cumbersome to maintain and generally reduces code readability.
+TypeScript is often better at inferring types than easily written type annotations would allow.
+
+**Instead of enabling `typedef`, it is generally recommended to use the `--noImplicitAny` and `--strictPropertyInitialization` compiler options to enforce type annotations only when useful.**
 
 ## Rule Details
 
 This rule can enforce type annotations in locations regardless of whether they're required.
 This is typically used to maintain consistency for element types that sometimes require them.
 
-> To enforce type definitions existing on call signatures as per TSLint's `arrow-call-signature` and `call-signature` options, use `explicit-function-return-type`.
+> To enforce type definitions existing on call signatures as per TSLint's `arrow-call-signature` and `call-signature` options, use `explicit-function-return-type`, or `explicit-module-boundary-types`.
 
 ## Options
 
-This rule has an object option that may receive any of the following as booleans:
+```ts
+type Options = {
+  arrayDestructuring?: boolean;
+  arrowParameter?: boolean;
+  memberVariableDeclaration?: boolean;
+  objectDestructuring?: boolean;
+  parameter?: boolean;
+  propertyDeclaration?: boolean;
+  variableDeclaration?: boolean;
+  variableDeclarationIgnoreFunction?: boolean;
+};
 
-- `"arrayDestructuring"`
-- `"arrowParameter"`: `true` by default
-- `"memberVariableDeclaration"`: `true` by default
-- `"objectDestructuring"`
-- `"parameter"`: `true` by default
-- `"propertyDeclaration"`: `true` by default
-- `"variableDeclaration"`,
-- `"variableDeclarationIgnoreFunction"`
+const defaultOptions: Options = {
+  arrayDestructuring: false,
+  arrowParameter: false,
+  memberVariableDeclaration: false,
+  objectDestructuring: false,
+  parameter: false,
+  propertyDeclaration: false,
+  variableDeclaration: false,
+  variableDeclarationIgnoreFunction: false,
+};
+```
 
 For example, with the following configuration:
 
@@ -48,7 +62,7 @@
     "@typescript-eslint/typedef": [
       "error",
       {
-        "arrowParameter": false,
+        "arrowParameter": true,
         "variableDeclaration": true
       }
     ]
@@ -56,9 +70,8 @@
 }
 ```
 
-- Type annotations on arrow function parameters are not required
+- Type annotations on arrow function parameters are required
 - Type annotations on variables are required
-- Options otherwise adhere to the defaults
 
 ### `arrayDestructuring`
 
@@ -164,7 +177,7 @@
   console.log(size);
 }
 
-const doublesSize = function(size): number {
+const doublesSize = function (size): number {
   return size * 2;
 };
 
@@ -172,7 +185,7 @@
   curriesSize(size): number {
     return size;
   },
-  dividesSize: function(size): number {
+  dividesSize: function (size): number {
     return size / 2;
   },
 };
@@ -192,7 +205,7 @@
   console.log(size);
 }
 
-const doublesSize = function(size: number): number {
+const doublesSize = function (size: number): number {
   return size * 2;
 };
 
@@ -200,7 +213,7 @@
   curriesSize(size: number): number {
     return size;
   },
-  dividesSize: function(size: number): number {
+  dividesSize: function (size: number): number {
     return size / 2;
   },
 };
diff --git a/node_modules/@typescript-eslint/eslint-plugin/node_modules/.bin/eslint b/node_modules/@typescript-eslint/eslint-plugin/node_modules/.bin/eslint
new file mode 120000
index 0000000..da97b4e
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/node_modules/.bin/eslint
@@ -0,0 +1 @@
+../../../../eslint/bin/eslint.js
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/node_modules/.bin/semver b/node_modules/@typescript-eslint/eslint-plugin/node_modules/.bin/semver
new file mode 120000
index 0000000..bb49af1
--- /dev/null
+++ b/node_modules/@typescript-eslint/eslint-plugin/node_modules/.bin/semver
@@ -0,0 +1 @@
+../../../../jest-circus/node_modules/semver/bin/semver.js
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/LICENSE b/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/LICENSE
deleted file mode 100644
index 883ee1f..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2018 Toru Nagashima
-
-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/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/README.md b/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/README.md
deleted file mode 100644
index 0358380..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/README.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# eslint-utils
-
-[![npm version](https://img.shields.io/npm/v/eslint-utils.svg)](https://www.npmjs.com/package/eslint-utils)
-[![Downloads/month](https://img.shields.io/npm/dm/eslint-utils.svg)](http://www.npmtrends.com/eslint-utils)
-[![Build Status](https://github.com/mysticatea/eslint-utils/workflows/CI/badge.svg)](https://github.com/mysticatea/eslint-utils/actions)
-[![Coverage Status](https://codecov.io/gh/mysticatea/eslint-utils/branch/master/graph/badge.svg)](https://codecov.io/gh/mysticatea/eslint-utils)
-[![Dependency Status](https://david-dm.org/mysticatea/eslint-utils.svg)](https://david-dm.org/mysticatea/eslint-utils)
-
-## 🏁 Goal
-
-This package provides utility functions and classes for make ESLint custom rules.
-
-For examples:
-
-- [getStaticValue](https://eslint-utils.mysticatea.dev/api/ast-utils.html#getstaticvalue) evaluates static value on AST.
-- [PatternMatcher](https://eslint-utils.mysticatea.dev/api/ast-utils.html#patternmatcher-class) finds a regular expression pattern as handling escape sequences.
-- [ReferenceTracker](https://eslint-utils.mysticatea.dev/api/scope-utils.html#referencetracker-class) checks the members of modules/globals as handling assignments and destructuring.
-
-## 📖 Usage
-
-See [documentation](https://eslint-utils.mysticatea.dev/).
-
-## 📰 Changelog
-
-See [releases](https://github.com/mysticatea/eslint-utils/releases).
-
-## ❤️ Contributing
-
-Welcome contributing!
-
-Please use GitHub's Issues/PRs.
-
-### Development Tools
-
-- `npm test` runs tests and measures coverage.
-- `npm run clean` removes the coverage result of `npm test` command.
-- `npm run coverage` shows the coverage result of the last `npm test` command.
-- `npm run lint` runs ESLint.
-- `npm run watch` runs tests on each file change.
diff --git a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/index.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/index.js
deleted file mode 100644
index f5d3f3e..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/index.js
+++ /dev/null
@@ -1,1827 +0,0 @@
-/*! @author Toru Nagashima <https://github.com/mysticatea> */
-'use strict';
-
-Object.defineProperty(exports, '__esModule', { value: true });
-
-function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
-
-var evk = _interopDefault(require('eslint-visitor-keys'));
-
-/**
- * Get the innermost scope which contains a given location.
- * @param {Scope} initialScope The initial scope to search.
- * @param {Node} node The location to search.
- * @returns {Scope} The innermost scope.
- */
-function getInnermostScope(initialScope, node) {
-    const location = node.range[0];
-
-    let scope = initialScope;
-    let found = false;
-    do {
-        found = false;
-        for (const childScope of scope.childScopes) {
-            const range = childScope.block.range;
-
-            if (range[0] <= location && location < range[1]) {
-                scope = childScope;
-                found = true;
-                break
-            }
-        }
-    } while (found)
-
-    return scope
-}
-
-/**
- * Find the variable of a given name.
- * @param {Scope} initialScope The scope to start finding.
- * @param {string|Node} nameOrNode The variable name to find. If this is a Node object then it should be an Identifier node.
- * @returns {Variable|null} The found variable or null.
- */
-function findVariable(initialScope, nameOrNode) {
-    let name = "";
-    let scope = initialScope;
-
-    if (typeof nameOrNode === "string") {
-        name = nameOrNode;
-    } else {
-        name = nameOrNode.name;
-        scope = getInnermostScope(scope, nameOrNode);
-    }
-
-    while (scope != null) {
-        const variable = scope.set.get(name);
-        if (variable != null) {
-            return variable
-        }
-        scope = scope.upper;
-    }
-
-    return null
-}
-
-/**
- * Negate the result of `this` calling.
- * @param {Token} token The token to check.
- * @returns {boolean} `true` if the result of `this(token)` is `false`.
- */
-function negate0(token) {
-    return !this(token) //eslint-disable-line no-invalid-this
-}
-
-/**
- * Creates the negate function of the given function.
- * @param {function(Token):boolean} f - The function to negate.
- * @returns {function(Token):boolean} Negated function.
- */
-function negate(f) {
-    return negate0.bind(f)
-}
-
-/**
- * Checks if the given token is an arrow token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is an arrow token.
- */
-function isArrowToken(token) {
-    return token.value === "=>" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a comma token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a comma token.
- */
-function isCommaToken(token) {
-    return token.value === "," && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a semicolon token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a semicolon token.
- */
-function isSemicolonToken(token) {
-    return token.value === ";" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a colon token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a colon token.
- */
-function isColonToken(token) {
-    return token.value === ":" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is an opening parenthesis token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is an opening parenthesis token.
- */
-function isOpeningParenToken(token) {
-    return token.value === "(" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a closing parenthesis token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a closing parenthesis token.
- */
-function isClosingParenToken(token) {
-    return token.value === ")" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is an opening square bracket token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is an opening square bracket token.
- */
-function isOpeningBracketToken(token) {
-    return token.value === "[" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a closing square bracket token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a closing square bracket token.
- */
-function isClosingBracketToken(token) {
-    return token.value === "]" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is an opening brace token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is an opening brace token.
- */
-function isOpeningBraceToken(token) {
-    return token.value === "{" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a closing brace token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a closing brace token.
- */
-function isClosingBraceToken(token) {
-    return token.value === "}" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a comment token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a comment token.
- */
-function isCommentToken(token) {
-    return (
-        token.type === "Line" ||
-        token.type === "Block" ||
-        token.type === "Shebang"
-    )
-}
-
-const isNotArrowToken = negate(isArrowToken);
-const isNotCommaToken = negate(isCommaToken);
-const isNotSemicolonToken = negate(isSemicolonToken);
-const isNotColonToken = negate(isColonToken);
-const isNotOpeningParenToken = negate(isOpeningParenToken);
-const isNotClosingParenToken = negate(isClosingParenToken);
-const isNotOpeningBracketToken = negate(isOpeningBracketToken);
-const isNotClosingBracketToken = negate(isClosingBracketToken);
-const isNotOpeningBraceToken = negate(isOpeningBraceToken);
-const isNotClosingBraceToken = negate(isClosingBraceToken);
-const isNotCommentToken = negate(isCommentToken);
-
-/**
- * Get the `(` token of the given function node.
- * @param {Node} node - The function node to get.
- * @param {SourceCode} sourceCode - The source code object to get tokens.
- * @returns {Token} `(` token.
- */
-function getOpeningParenOfParams(node, sourceCode) {
-    return node.id
-        ? sourceCode.getTokenAfter(node.id, isOpeningParenToken)
-        : sourceCode.getFirstToken(node, isOpeningParenToken)
-}
-
-/**
- * Get the location of the given function node for reporting.
- * @param {Node} node - The function node to get.
- * @param {SourceCode} sourceCode - The source code object to get tokens.
- * @returns {string} The location of the function node for reporting.
- */
-function getFunctionHeadLocation(node, sourceCode) {
-    const parent = node.parent;
-    let start = null;
-    let end = null;
-
-    if (node.type === "ArrowFunctionExpression") {
-        const arrowToken = sourceCode.getTokenBefore(node.body, isArrowToken);
-
-        start = arrowToken.loc.start;
-        end = arrowToken.loc.end;
-    } else if (
-        parent.type === "Property" ||
-        parent.type === "MethodDefinition"
-    ) {
-        start = parent.loc.start;
-        end = getOpeningParenOfParams(node, sourceCode).loc.start;
-    } else {
-        start = node.loc.start;
-        end = getOpeningParenOfParams(node, sourceCode).loc.start;
-    }
-
-    return {
-        start: Object.assign({}, start),
-        end: Object.assign({}, end),
-    }
-}
-
-/* globals BigInt, globalThis, global, self, window */
-
-const globalObject =
-    typeof globalThis !== "undefined"
-        ? globalThis
-        : typeof self !== "undefined"
-        ? self
-        : typeof window !== "undefined"
-        ? window
-        : typeof global !== "undefined"
-        ? global
-        : {};
-
-const builtinNames = Object.freeze(
-    new Set([
-        "Array",
-        "ArrayBuffer",
-        "BigInt",
-        "BigInt64Array",
-        "BigUint64Array",
-        "Boolean",
-        "DataView",
-        "Date",
-        "decodeURI",
-        "decodeURIComponent",
-        "encodeURI",
-        "encodeURIComponent",
-        "escape",
-        "Float32Array",
-        "Float64Array",
-        "Function",
-        "Infinity",
-        "Int16Array",
-        "Int32Array",
-        "Int8Array",
-        "isFinite",
-        "isNaN",
-        "isPrototypeOf",
-        "JSON",
-        "Map",
-        "Math",
-        "NaN",
-        "Number",
-        "Object",
-        "parseFloat",
-        "parseInt",
-        "Promise",
-        "Proxy",
-        "Reflect",
-        "RegExp",
-        "Set",
-        "String",
-        "Symbol",
-        "Uint16Array",
-        "Uint32Array",
-        "Uint8Array",
-        "Uint8ClampedArray",
-        "undefined",
-        "unescape",
-        "WeakMap",
-        "WeakSet",
-    ])
-);
-const callAllowed = new Set(
-    [
-        Array.isArray,
-        typeof BigInt === "function" ? BigInt : undefined,
-        Boolean,
-        Date,
-        Date.parse,
-        decodeURI,
-        decodeURIComponent,
-        encodeURI,
-        encodeURIComponent,
-        escape,
-        isFinite,
-        isNaN,
-        isPrototypeOf,
-        ...Object.getOwnPropertyNames(Math)
-            .map(k => Math[k])
-            .filter(f => typeof f === "function"),
-        Number,
-        Number.isFinite,
-        Number.isNaN,
-        Number.parseFloat,
-        Number.parseInt,
-        Object,
-        Object.entries,
-        Object.is,
-        Object.isExtensible,
-        Object.isFrozen,
-        Object.isSealed,
-        Object.keys,
-        Object.values,
-        parseFloat,
-        parseInt,
-        RegExp,
-        String,
-        String.fromCharCode,
-        String.fromCodePoint,
-        String.raw,
-        Symbol,
-        Symbol.for,
-        Symbol.keyFor,
-        unescape,
-    ].filter(f => typeof f === "function")
-);
-const callPassThrough = new Set([
-    Object.freeze,
-    Object.preventExtensions,
-    Object.seal,
-]);
-
-/**
- * Get the property descriptor.
- * @param {object} object The object to get.
- * @param {string|number|symbol} name The property name to get.
- */
-function getPropertyDescriptor(object, name) {
-    let x = object;
-    while ((typeof x === "object" || typeof x === "function") && x !== null) {
-        const d = Object.getOwnPropertyDescriptor(x, name);
-        if (d) {
-            return d
-        }
-        x = Object.getPrototypeOf(x);
-    }
-    return null
-}
-
-/**
- * Check if a property is getter or not.
- * @param {object} object The object to check.
- * @param {string|number|symbol} name The property name to check.
- */
-function isGetter(object, name) {
-    const d = getPropertyDescriptor(object, name);
-    return d != null && d.get != null
-}
-
-/**
- * Get the element values of a given node list.
- * @param {Node[]} nodeList The node list to get values.
- * @param {Scope|undefined} initialScope The initial scope to find variables.
- * @returns {any[]|null} The value list if all nodes are constant. Otherwise, null.
- */
-function getElementValues(nodeList, initialScope) {
-    const valueList = [];
-
-    for (let i = 0; i < nodeList.length; ++i) {
-        const elementNode = nodeList[i];
-
-        if (elementNode == null) {
-            valueList.length = i + 1;
-        } else if (elementNode.type === "SpreadElement") {
-            const argument = getStaticValueR(elementNode.argument, initialScope);
-            if (argument == null) {
-                return null
-            }
-            valueList.push(...argument.value);
-        } else {
-            const element = getStaticValueR(elementNode, initialScope);
-            if (element == null) {
-                return null
-            }
-            valueList.push(element.value);
-        }
-    }
-
-    return valueList
-}
-
-const operations = Object.freeze({
-    ArrayExpression(node, initialScope) {
-        const elements = getElementValues(node.elements, initialScope);
-        return elements != null ? { value: elements } : null
-    },
-
-    AssignmentExpression(node, initialScope) {
-        if (node.operator === "=") {
-            return getStaticValueR(node.right, initialScope)
-        }
-        return null
-    },
-
-    //eslint-disable-next-line complexity
-    BinaryExpression(node, initialScope) {
-        if (node.operator === "in" || node.operator === "instanceof") {
-            // Not supported.
-            return null
-        }
-
-        const left = getStaticValueR(node.left, initialScope);
-        const right = getStaticValueR(node.right, initialScope);
-        if (left != null && right != null) {
-            switch (node.operator) {
-                case "==":
-                    return { value: left.value == right.value } //eslint-disable-line eqeqeq
-                case "!=":
-                    return { value: left.value != right.value } //eslint-disable-line eqeqeq
-                case "===":
-                    return { value: left.value === right.value }
-                case "!==":
-                    return { value: left.value !== right.value }
-                case "<":
-                    return { value: left.value < right.value }
-                case "<=":
-                    return { value: left.value <= right.value }
-                case ">":
-                    return { value: left.value > right.value }
-                case ">=":
-                    return { value: left.value >= right.value }
-                case "<<":
-                    return { value: left.value << right.value }
-                case ">>":
-                    return { value: left.value >> right.value }
-                case ">>>":
-                    return { value: left.value >>> right.value }
-                case "+":
-                    return { value: left.value + right.value }
-                case "-":
-                    return { value: left.value - right.value }
-                case "*":
-                    return { value: left.value * right.value }
-                case "/":
-                    return { value: left.value / right.value }
-                case "%":
-                    return { value: left.value % right.value }
-                case "**":
-                    return { value: Math.pow(left.value, right.value) }
-                case "|":
-                    return { value: left.value | right.value }
-                case "^":
-                    return { value: left.value ^ right.value }
-                case "&":
-                    return { value: left.value & right.value }
-
-                // no default
-            }
-        }
-
-        return null
-    },
-
-    CallExpression(node, initialScope) {
-        const calleeNode = node.callee;
-        const args = getElementValues(node.arguments, initialScope);
-
-        if (args != null) {
-            if (calleeNode.type === "MemberExpression") {
-                const object = getStaticValueR(calleeNode.object, initialScope);
-                const property = calleeNode.computed
-                    ? getStaticValueR(calleeNode.property, initialScope)
-                    : { value: calleeNode.property.name };
-
-                if (object != null && property != null) {
-                    const receiver = object.value;
-                    const methodName = property.value;
-                    if (callAllowed.has(receiver[methodName])) {
-                        return { value: receiver[methodName](...args) }
-                    }
-                    if (callPassThrough.has(receiver[methodName])) {
-                        return { value: args[0] }
-                    }
-                }
-            } else {
-                const callee = getStaticValueR(calleeNode, initialScope);
-                if (callee != null) {
-                    const func = callee.value;
-                    if (callAllowed.has(func)) {
-                        return { value: func(...args) }
-                    }
-                    if (callPassThrough.has(func)) {
-                        return { value: args[0] }
-                    }
-                }
-            }
-        }
-
-        return null
-    },
-
-    ConditionalExpression(node, initialScope) {
-        const test = getStaticValueR(node.test, initialScope);
-        if (test != null) {
-            return test.value
-                ? getStaticValueR(node.consequent, initialScope)
-                : getStaticValueR(node.alternate, initialScope)
-        }
-        return null
-    },
-
-    ExpressionStatement(node, initialScope) {
-        return getStaticValueR(node.expression, initialScope)
-    },
-
-    Identifier(node, initialScope) {
-        if (initialScope != null) {
-            const variable = findVariable(initialScope, node);
-
-            // Built-in globals.
-            if (
-                variable != null &&
-                variable.defs.length === 0 &&
-                builtinNames.has(variable.name) &&
-                variable.name in globalObject
-            ) {
-                return { value: globalObject[variable.name] }
-            }
-
-            // Constants.
-            if (variable != null && variable.defs.length === 1) {
-                const def = variable.defs[0];
-                if (
-                    def.parent &&
-                    def.parent.kind === "const" &&
-                    // TODO(mysticatea): don't support destructuring here.
-                    def.node.id.type === "Identifier"
-                ) {
-                    return getStaticValueR(def.node.init, initialScope)
-                }
-            }
-        }
-        return null
-    },
-
-    Literal(node) {
-        //istanbul ignore if : this is implementation-specific behavior.
-        if ((node.regex != null || node.bigint != null) && node.value == null) {
-            // It was a RegExp/BigInt literal, but Node.js didn't support it.
-            return null
-        }
-        return { value: node.value }
-    },
-
-    LogicalExpression(node, initialScope) {
-        const left = getStaticValueR(node.left, initialScope);
-        if (left != null) {
-            if (
-                (node.operator === "||" && Boolean(left.value) === true) ||
-                (node.operator === "&&" && Boolean(left.value) === false)
-            ) {
-                return left
-            }
-
-            const right = getStaticValueR(node.right, initialScope);
-            if (right != null) {
-                return right
-            }
-        }
-
-        return null
-    },
-
-    MemberExpression(node, initialScope) {
-        const object = getStaticValueR(node.object, initialScope);
-        const property = node.computed
-            ? getStaticValueR(node.property, initialScope)
-            : { value: node.property.name };
-
-        if (
-            object != null &&
-            property != null &&
-            !isGetter(object.value, property.value)
-        ) {
-            return { value: object.value[property.value] }
-        }
-        return null
-    },
-
-    NewExpression(node, initialScope) {
-        const callee = getStaticValueR(node.callee, initialScope);
-        const args = getElementValues(node.arguments, initialScope);
-
-        if (callee != null && args != null) {
-            const Func = callee.value;
-            if (callAllowed.has(Func)) {
-                return { value: new Func(...args) }
-            }
-        }
-
-        return null
-    },
-
-    ObjectExpression(node, initialScope) {
-        const object = {};
-
-        for (const propertyNode of node.properties) {
-            if (propertyNode.type === "Property") {
-                if (propertyNode.kind !== "init") {
-                    return null
-                }
-                const key = propertyNode.computed
-                    ? getStaticValueR(propertyNode.key, initialScope)
-                    : { value: propertyNode.key.name };
-                const value = getStaticValueR(propertyNode.value, initialScope);
-                if (key == null || value == null) {
-                    return null
-                }
-                object[key.value] = value.value;
-            } else if (
-                propertyNode.type === "SpreadElement" ||
-                propertyNode.type === "ExperimentalSpreadProperty"
-            ) {
-                const argument = getStaticValueR(
-                    propertyNode.argument,
-                    initialScope
-                );
-                if (argument == null) {
-                    return null
-                }
-                Object.assign(object, argument.value);
-            } else {
-                return null
-            }
-        }
-
-        return { value: object }
-    },
-
-    SequenceExpression(node, initialScope) {
-        const last = node.expressions[node.expressions.length - 1];
-        return getStaticValueR(last, initialScope)
-    },
-
-    TaggedTemplateExpression(node, initialScope) {
-        const tag = getStaticValueR(node.tag, initialScope);
-        const expressions = getElementValues(
-            node.quasi.expressions,
-            initialScope
-        );
-
-        if (tag != null && expressions != null) {
-            const func = tag.value;
-            const strings = node.quasi.quasis.map(q => q.value.cooked);
-            strings.raw = node.quasi.quasis.map(q => q.value.raw);
-
-            if (func === String.raw) {
-                return { value: func(strings, ...expressions) }
-            }
-        }
-
-        return null
-    },
-
-    TemplateLiteral(node, initialScope) {
-        const expressions = getElementValues(node.expressions, initialScope);
-        if (expressions != null) {
-            let value = node.quasis[0].value.cooked;
-            for (let i = 0; i < expressions.length; ++i) {
-                value += expressions[i];
-                value += node.quasis[i + 1].value.cooked;
-            }
-            return { value }
-        }
-        return null
-    },
-
-    UnaryExpression(node, initialScope) {
-        if (node.operator === "delete") {
-            // Not supported.
-            return null
-        }
-        if (node.operator === "void") {
-            return { value: undefined }
-        }
-
-        const arg = getStaticValueR(node.argument, initialScope);
-        if (arg != null) {
-            switch (node.operator) {
-                case "-":
-                    return { value: -arg.value }
-                case "+":
-                    return { value: +arg.value } //eslint-disable-line no-implicit-coercion
-                case "!":
-                    return { value: !arg.value }
-                case "~":
-                    return { value: ~arg.value }
-                case "typeof":
-                    return { value: typeof arg.value }
-
-                // no default
-            }
-        }
-
-        return null
-    },
-});
-
-/**
- * Get the value of a given node if it's a static value.
- * @param {Node} node The node to get.
- * @param {Scope|undefined} initialScope The scope to start finding variable.
- * @returns {{value:any}|null} The static value of the node, or `null`.
- */
-function getStaticValueR(node, initialScope) {
-    if (node != null && Object.hasOwnProperty.call(operations, node.type)) {
-        return operations[node.type](node, initialScope)
-    }
-    return null
-}
-
-/**
- * Get the value of a given node if it's a static value.
- * @param {Node} node The node to get.
- * @param {Scope} [initialScope] The scope to start finding variable. Optional. If this scope was given, this tries to resolve identifier references which are in the given node as much as possible.
- * @returns {{value:any}|null} The static value of the node, or `null`.
- */
-function getStaticValue(node, initialScope = null) {
-    try {
-        return getStaticValueR(node, initialScope)
-    } catch (_error) {
-        return null
-    }
-}
-
-/**
- * Get the value of a given node if it's a literal or a template literal.
- * @param {Node} node The node to get.
- * @param {Scope} [initialScope] The scope to start finding variable. Optional. If the node is an Identifier node and this scope was given, this checks the variable of the identifier, and returns the value of it if the variable is a constant.
- * @returns {string|null} The value of the node, or `null`.
- */
-function getStringIfConstant(node, initialScope = null) {
-    // Handle the literals that the platform doesn't support natively.
-    if (node && node.type === "Literal" && node.value === null) {
-        if (node.regex) {
-            return `/${node.regex.pattern}/${node.regex.flags}`
-        }
-        if (node.bigint) {
-            return node.bigint
-        }
-    }
-
-    const evaluated = getStaticValue(node, initialScope);
-    return evaluated && String(evaluated.value)
-}
-
-/**
- * Get the property name from a MemberExpression node or a Property node.
- * @param {Node} node The node to get.
- * @param {Scope} [initialScope] The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.
- * @returns {string|null} The property name of the node.
- */
-function getPropertyName(node, initialScope) {
-    switch (node.type) {
-        case "MemberExpression":
-            if (node.computed) {
-                return getStringIfConstant(node.property, initialScope)
-            }
-            return node.property.name
-
-        case "Property":
-        case "MethodDefinition":
-            if (node.computed) {
-                return getStringIfConstant(node.key, initialScope)
-            }
-            if (node.key.type === "Literal") {
-                return String(node.key.value)
-            }
-            return node.key.name
-
-        // no default
-    }
-
-    return null
-}
-
-/**
- * Get the name and kind of the given function node.
- * @param {ASTNode} node - The function node to get.
- * @returns {string} The name and kind of the function node.
- */
-function getFunctionNameWithKind(node) {
-    const parent = node.parent;
-    const tokens = [];
-
-    if (parent.type === "MethodDefinition" && parent.static) {
-        tokens.push("static");
-    }
-    if (node.async) {
-        tokens.push("async");
-    }
-    if (node.generator) {
-        tokens.push("generator");
-    }
-
-    if (node.type === "ArrowFunctionExpression") {
-        tokens.push("arrow", "function");
-    } else if (
-        parent.type === "Property" ||
-        parent.type === "MethodDefinition"
-    ) {
-        if (parent.kind === "constructor") {
-            return "constructor"
-        }
-        if (parent.kind === "get") {
-            tokens.push("getter");
-        } else if (parent.kind === "set") {
-            tokens.push("setter");
-        } else {
-            tokens.push("method");
-        }
-    } else {
-        tokens.push("function");
-    }
-
-    if (node.id) {
-        tokens.push(`'${node.id.name}'`);
-    } else {
-        const name = getPropertyName(parent);
-
-        if (name) {
-            tokens.push(`'${name}'`);
-        }
-    }
-
-    return tokens.join(" ")
-}
-
-const typeConversionBinaryOps = Object.freeze(
-    new Set([
-        "==",
-        "!=",
-        "<",
-        "<=",
-        ">",
-        ">=",
-        "<<",
-        ">>",
-        ">>>",
-        "+",
-        "-",
-        "*",
-        "/",
-        "%",
-        "|",
-        "^",
-        "&",
-        "in",
-    ])
-);
-const typeConversionUnaryOps = Object.freeze(new Set(["-", "+", "!", "~"]));
-const visitor = Object.freeze(
-    Object.assign(Object.create(null), {
-        $visit(node, options, visitorKeys) {
-            const { type } = node;
-
-            if (typeof this[type] === "function") {
-                return this[type](node, options, visitorKeys)
-            }
-
-            return this.$visitChildren(node, options, visitorKeys)
-        },
-
-        $visitChildren(node, options, visitorKeys) {
-            const { type } = node;
-
-            for (const key of visitorKeys[type] || evk.getKeys(node)) {
-                const value = node[key];
-
-                if (Array.isArray(value)) {
-                    for (const element of value) {
-                        if (
-                            element &&
-                            this.$visit(element, options, visitorKeys)
-                        ) {
-                            return true
-                        }
-                    }
-                } else if (value && this.$visit(value, options, visitorKeys)) {
-                    return true
-                }
-            }
-
-            return false
-        },
-
-        ArrowFunctionExpression() {
-            return false
-        },
-        AssignmentExpression() {
-            return true
-        },
-        AwaitExpression() {
-            return true
-        },
-        BinaryExpression(node, options, visitorKeys) {
-            if (
-                options.considerImplicitTypeConversion &&
-                typeConversionBinaryOps.has(node.operator) &&
-                (node.left.type !== "Literal" || node.right.type !== "Literal")
-            ) {
-                return true
-            }
-            return this.$visitChildren(node, options, visitorKeys)
-        },
-        CallExpression() {
-            return true
-        },
-        FunctionExpression() {
-            return false
-        },
-        ImportExpression() {
-            return true
-        },
-        MemberExpression(node, options, visitorKeys) {
-            if (options.considerGetters) {
-                return true
-            }
-            if (
-                options.considerImplicitTypeConversion &&
-                node.computed &&
-                node.property.type !== "Literal"
-            ) {
-                return true
-            }
-            return this.$visitChildren(node, options, visitorKeys)
-        },
-        MethodDefinition(node, options, visitorKeys) {
-            if (
-                options.considerImplicitTypeConversion &&
-                node.computed &&
-                node.key.type !== "Literal"
-            ) {
-                return true
-            }
-            return this.$visitChildren(node, options, visitorKeys)
-        },
-        NewExpression() {
-            return true
-        },
-        Property(node, options, visitorKeys) {
-            if (
-                options.considerImplicitTypeConversion &&
-                node.computed &&
-                node.key.type !== "Literal"
-            ) {
-                return true
-            }
-            return this.$visitChildren(node, options, visitorKeys)
-        },
-        UnaryExpression(node, options, visitorKeys) {
-            if (node.operator === "delete") {
-                return true
-            }
-            if (
-                options.considerImplicitTypeConversion &&
-                typeConversionUnaryOps.has(node.operator) &&
-                node.argument.type !== "Literal"
-            ) {
-                return true
-            }
-            return this.$visitChildren(node, options, visitorKeys)
-        },
-        UpdateExpression() {
-            return true
-        },
-        YieldExpression() {
-            return true
-        },
-    })
-);
-
-/**
- * Check whether a given node has any side effect or not.
- * @param {Node} node The node to get.
- * @param {SourceCode} sourceCode The source code object.
- * @param {object} [options] The option object.
- * @param {boolean} [options.considerGetters=false] If `true` then it considers member accesses as the node which has side effects.
- * @param {boolean} [options.considerImplicitTypeConversion=false] If `true` then it considers implicit type conversion as the node which has side effects.
- * @param {object} [options.visitorKeys=evk.KEYS] The keys to traverse nodes. Use `context.getSourceCode().visitorKeys`.
- * @returns {boolean} `true` if the node has a certain side effect.
- */
-function hasSideEffect(
-    node,
-    sourceCode,
-    { considerGetters = false, considerImplicitTypeConversion = false } = {}
-) {
-    return visitor.$visit(
-        node,
-        { considerGetters, considerImplicitTypeConversion },
-        sourceCode.visitorKeys || evk.KEYS
-    )
-}
-
-/**
- * Get the left parenthesis of the parent node syntax if it exists.
- * E.g., `if (a) {}` then the `(`.
- * @param {Node} node The AST node to check.
- * @param {SourceCode} sourceCode The source code object to get tokens.
- * @returns {Token|null} The left parenthesis of the parent node syntax
- */
-function getParentSyntaxParen(node, sourceCode) {
-    const parent = node.parent;
-
-    switch (parent.type) {
-        case "CallExpression":
-        case "NewExpression":
-            if (parent.arguments.length === 1 && parent.arguments[0] === node) {
-                return sourceCode.getTokenAfter(
-                    parent.callee,
-                    isOpeningParenToken
-                )
-            }
-            return null
-
-        case "DoWhileStatement":
-            if (parent.test === node) {
-                return sourceCode.getTokenAfter(
-                    parent.body,
-                    isOpeningParenToken
-                )
-            }
-            return null
-
-        case "IfStatement":
-        case "WhileStatement":
-            if (parent.test === node) {
-                return sourceCode.getFirstToken(parent, 1)
-            }
-            return null
-
-        case "ImportExpression":
-            if (parent.source === node) {
-                return sourceCode.getFirstToken(parent, 1)
-            }
-            return null
-
-        case "SwitchStatement":
-            if (parent.discriminant === node) {
-                return sourceCode.getFirstToken(parent, 1)
-            }
-            return null
-
-        case "WithStatement":
-            if (parent.object === node) {
-                return sourceCode.getFirstToken(parent, 1)
-            }
-            return null
-
-        default:
-            return null
-    }
-}
-
-/**
- * Check whether a given node is parenthesized or not.
- * @param {number} times The number of parantheses.
- * @param {Node} node The AST node to check.
- * @param {SourceCode} sourceCode The source code object to get tokens.
- * @returns {boolean} `true` if the node is parenthesized the given times.
- */
-/**
- * Check whether a given node is parenthesized or not.
- * @param {Node} node The AST node to check.
- * @param {SourceCode} sourceCode The source code object to get tokens.
- * @returns {boolean} `true` if the node is parenthesized.
- */
-function isParenthesized(
-    timesOrNode,
-    nodeOrSourceCode,
-    optionalSourceCode
-) {
-    let times, node, sourceCode, maybeLeftParen, maybeRightParen;
-    if (typeof timesOrNode === "number") {
-        times = timesOrNode | 0;
-        node = nodeOrSourceCode;
-        sourceCode = optionalSourceCode;
-        if (!(times >= 1)) {
-            throw new TypeError("'times' should be a positive integer.")
-        }
-    } else {
-        times = 1;
-        node = timesOrNode;
-        sourceCode = nodeOrSourceCode;
-    }
-
-    if (node == null) {
-        return false
-    }
-
-    maybeLeftParen = maybeRightParen = node;
-    do {
-        maybeLeftParen = sourceCode.getTokenBefore(maybeLeftParen);
-        maybeRightParen = sourceCode.getTokenAfter(maybeRightParen);
-    } while (
-        maybeLeftParen != null &&
-        maybeRightParen != null &&
-        isOpeningParenToken(maybeLeftParen) &&
-        isClosingParenToken(maybeRightParen) &&
-        // Avoid false positive such as `if (a) {}`
-        maybeLeftParen !== getParentSyntaxParen(node, sourceCode) &&
-        --times > 0
-    )
-
-    return times === 0
-}
-
-/**
- * @author Toru Nagashima <https://github.com/mysticatea>
- * See LICENSE file in root directory for full license.
- */
-
-const placeholder = /\$(?:[$&`']|[1-9][0-9]?)/gu;
-
-/** @type {WeakMap<PatternMatcher, {pattern:RegExp,escaped:boolean}>} */
-const internal = new WeakMap();
-
-/**
- * Check whether a given character is escaped or not.
- * @param {string} str The string to check.
- * @param {number} index The location of the character to check.
- * @returns {boolean} `true` if the character is escaped.
- */
-function isEscaped(str, index) {
-    let escaped = false;
-    for (let i = index - 1; i >= 0 && str.charCodeAt(i) === 0x5c; --i) {
-        escaped = !escaped;
-    }
-    return escaped
-}
-
-/**
- * Replace a given string by a given matcher.
- * @param {PatternMatcher} matcher The pattern matcher.
- * @param {string} str The string to be replaced.
- * @param {string} replacement The new substring to replace each matched part.
- * @returns {string} The replaced string.
- */
-function replaceS(matcher, str, replacement) {
-    const chunks = [];
-    let index = 0;
-
-    /** @type {RegExpExecArray} */
-    let match = null;
-
-    /**
-     * @param {string} key The placeholder.
-     * @returns {string} The replaced string.
-     */
-    function replacer(key) {
-        switch (key) {
-            case "$$":
-                return "$"
-            case "$&":
-                return match[0]
-            case "$`":
-                return str.slice(0, match.index)
-            case "$'":
-                return str.slice(match.index + match[0].length)
-            default: {
-                const i = key.slice(1);
-                if (i in match) {
-                    return match[i]
-                }
-                return key
-            }
-        }
-    }
-
-    for (match of matcher.execAll(str)) {
-        chunks.push(str.slice(index, match.index));
-        chunks.push(replacement.replace(placeholder, replacer));
-        index = match.index + match[0].length;
-    }
-    chunks.push(str.slice(index));
-
-    return chunks.join("")
-}
-
-/**
- * Replace a given string by a given matcher.
- * @param {PatternMatcher} matcher The pattern matcher.
- * @param {string} str The string to be replaced.
- * @param {(...strs[])=>string} replace The function to replace each matched part.
- * @returns {string} The replaced string.
- */
-function replaceF(matcher, str, replace) {
-    const chunks = [];
-    let index = 0;
-
-    for (const match of matcher.execAll(str)) {
-        chunks.push(str.slice(index, match.index));
-        chunks.push(String(replace(...match, match.index, match.input)));
-        index = match.index + match[0].length;
-    }
-    chunks.push(str.slice(index));
-
-    return chunks.join("")
-}
-
-/**
- * The class to find patterns as considering escape sequences.
- */
-class PatternMatcher {
-    /**
-     * Initialize this matcher.
-     * @param {RegExp} pattern The pattern to match.
-     * @param {{escaped:boolean}} options The options.
-     */
-    constructor(pattern, { escaped = false } = {}) {
-        if (!(pattern instanceof RegExp)) {
-            throw new TypeError("'pattern' should be a RegExp instance.")
-        }
-        if (!pattern.flags.includes("g")) {
-            throw new Error("'pattern' should contains 'g' flag.")
-        }
-
-        internal.set(this, {
-            pattern: new RegExp(pattern.source, pattern.flags),
-            escaped: Boolean(escaped),
-        });
-    }
-
-    /**
-     * Find the pattern in a given string.
-     * @param {string} str The string to find.
-     * @returns {IterableIterator<RegExpExecArray>} The iterator which iterate the matched information.
-     */
-    *execAll(str) {
-        const { pattern, escaped } = internal.get(this);
-        let match = null;
-        let lastIndex = 0;
-
-        pattern.lastIndex = 0;
-        while ((match = pattern.exec(str)) != null) {
-            if (escaped || !isEscaped(str, match.index)) {
-                lastIndex = pattern.lastIndex;
-                yield match;
-                pattern.lastIndex = lastIndex;
-            }
-        }
-    }
-
-    /**
-     * Check whether the pattern is found in a given string.
-     * @param {string} str The string to check.
-     * @returns {boolean} `true` if the pattern was found in the string.
-     */
-    test(str) {
-        const it = this.execAll(str);
-        const ret = it.next();
-        return !ret.done
-    }
-
-    /**
-     * Replace a given string.
-     * @param {string} str The string to be replaced.
-     * @param {(string|((...strs:string[])=>string))} replacer The string or function to replace. This is the same as the 2nd argument of `String.prototype.replace`.
-     * @returns {string} The replaced string.
-     */
-    [Symbol.replace](str, replacer) {
-        return typeof replacer === "function"
-            ? replaceF(this, String(str), replacer)
-            : replaceS(this, String(str), String(replacer))
-    }
-}
-
-const IMPORT_TYPE = /^(?:Import|Export(?:All|Default|Named))Declaration$/u;
-const has = Function.call.bind(Object.hasOwnProperty);
-
-const READ = Symbol("read");
-const CALL = Symbol("call");
-const CONSTRUCT = Symbol("construct");
-const ESM = Symbol("esm");
-
-const requireCall = { require: { [CALL]: true } };
-
-/**
- * Check whether a given variable is modified or not.
- * @param {Variable} variable The variable to check.
- * @returns {boolean} `true` if the variable is modified.
- */
-function isModifiedGlobal(variable) {
-    return (
-        variable == null ||
-        variable.defs.length !== 0 ||
-        variable.references.some(r => r.isWrite())
-    )
-}
-
-/**
- * Check if the value of a given node is passed through to the parent syntax as-is.
- * For example, `a` and `b` in (`a || b` and `c ? a : b`) are passed through.
- * @param {Node} node A node to check.
- * @returns {boolean} `true` if the node is passed through.
- */
-function isPassThrough(node) {
-    const parent = node.parent;
-
-    switch (parent && parent.type) {
-        case "ConditionalExpression":
-            return parent.consequent === node || parent.alternate === node
-        case "LogicalExpression":
-            return true
-        case "SequenceExpression":
-            return parent.expressions[parent.expressions.length - 1] === node
-
-        default:
-            return false
-    }
-}
-
-/**
- * The reference tracker.
- */
-class ReferenceTracker {
-    /**
-     * Initialize this tracker.
-     * @param {Scope} globalScope The global scope.
-     * @param {object} [options] The options.
-     * @param {"legacy"|"strict"} [options.mode="strict"] The mode to determine the ImportDeclaration's behavior for CJS modules.
-     * @param {string[]} [options.globalObjectNames=["global","self","window"]] The variable names for Global Object.
-     */
-    constructor(
-        globalScope,
-        {
-            mode = "strict",
-            globalObjectNames = ["global", "self", "window"],
-        } = {}
-    ) {
-        this.variableStack = [];
-        this.globalScope = globalScope;
-        this.mode = mode;
-        this.globalObjectNames = globalObjectNames.slice(0);
-    }
-
-    /**
-     * Iterate the references of global variables.
-     * @param {object} traceMap The trace map.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    *iterateGlobalReferences(traceMap) {
-        for (const key of Object.keys(traceMap)) {
-            const nextTraceMap = traceMap[key];
-            const path = [key];
-            const variable = this.globalScope.set.get(key);
-
-            if (isModifiedGlobal(variable)) {
-                continue
-            }
-
-            yield* this._iterateVariableReferences(
-                variable,
-                path,
-                nextTraceMap,
-                true
-            );
-        }
-
-        for (const key of this.globalObjectNames) {
-            const path = [];
-            const variable = this.globalScope.set.get(key);
-
-            if (isModifiedGlobal(variable)) {
-                continue
-            }
-
-            yield* this._iterateVariableReferences(
-                variable,
-                path,
-                traceMap,
-                false
-            );
-        }
-    }
-
-    /**
-     * Iterate the references of CommonJS modules.
-     * @param {object} traceMap The trace map.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    *iterateCjsReferences(traceMap) {
-        for (const { node } of this.iterateGlobalReferences(requireCall)) {
-            const key = getStringIfConstant(node.arguments[0]);
-            if (key == null || !has(traceMap, key)) {
-                continue
-            }
-
-            const nextTraceMap = traceMap[key];
-            const path = [key];
-
-            if (nextTraceMap[READ]) {
-                yield {
-                    node,
-                    path,
-                    type: READ,
-                    info: nextTraceMap[READ],
-                };
-            }
-            yield* this._iteratePropertyReferences(node, path, nextTraceMap);
-        }
-    }
-
-    /**
-     * Iterate the references of ES modules.
-     * @param {object} traceMap The trace map.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    *iterateEsmReferences(traceMap) {
-        const programNode = this.globalScope.block;
-
-        for (const node of programNode.body) {
-            if (!IMPORT_TYPE.test(node.type) || node.source == null) {
-                continue
-            }
-            const moduleId = node.source.value;
-
-            if (!has(traceMap, moduleId)) {
-                continue
-            }
-            const nextTraceMap = traceMap[moduleId];
-            const path = [moduleId];
-
-            if (nextTraceMap[READ]) {
-                yield { node, path, type: READ, info: nextTraceMap[READ] };
-            }
-
-            if (node.type === "ExportAllDeclaration") {
-                for (const key of Object.keys(nextTraceMap)) {
-                    const exportTraceMap = nextTraceMap[key];
-                    if (exportTraceMap[READ]) {
-                        yield {
-                            node,
-                            path: path.concat(key),
-                            type: READ,
-                            info: exportTraceMap[READ],
-                        };
-                    }
-                }
-            } else {
-                for (const specifier of node.specifiers) {
-                    const esm = has(nextTraceMap, ESM);
-                    const it = this._iterateImportReferences(
-                        specifier,
-                        path,
-                        esm
-                            ? nextTraceMap
-                            : this.mode === "legacy"
-                            ? Object.assign(
-                                  { default: nextTraceMap },
-                                  nextTraceMap
-                              )
-                            : { default: nextTraceMap }
-                    );
-
-                    if (esm) {
-                        yield* it;
-                    } else {
-                        for (const report of it) {
-                            report.path = report.path.filter(exceptDefault);
-                            if (
-                                report.path.length >= 2 ||
-                                report.type !== READ
-                            ) {
-                                yield report;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Iterate the references for a given variable.
-     * @param {Variable} variable The variable to iterate that references.
-     * @param {string[]} path The current path.
-     * @param {object} traceMap The trace map.
-     * @param {boolean} shouldReport = The flag to report those references.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    *_iterateVariableReferences(variable, path, traceMap, shouldReport) {
-        if (this.variableStack.includes(variable)) {
-            return
-        }
-        this.variableStack.push(variable);
-        try {
-            for (const reference of variable.references) {
-                if (!reference.isRead()) {
-                    continue
-                }
-                const node = reference.identifier;
-
-                if (shouldReport && traceMap[READ]) {
-                    yield { node, path, type: READ, info: traceMap[READ] };
-                }
-                yield* this._iteratePropertyReferences(node, path, traceMap);
-            }
-        } finally {
-            this.variableStack.pop();
-        }
-    }
-
-    /**
-     * Iterate the references for a given AST node.
-     * @param rootNode The AST node to iterate references.
-     * @param {string[]} path The current path.
-     * @param {object} traceMap The trace map.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    //eslint-disable-next-line complexity
-    *_iteratePropertyReferences(rootNode, path, traceMap) {
-        let node = rootNode;
-        while (isPassThrough(node)) {
-            node = node.parent;
-        }
-
-        const parent = node.parent;
-        if (parent.type === "MemberExpression") {
-            if (parent.object === node) {
-                const key = getPropertyName(parent);
-                if (key == null || !has(traceMap, key)) {
-                    return
-                }
-
-                path = path.concat(key); //eslint-disable-line no-param-reassign
-                const nextTraceMap = traceMap[key];
-                if (nextTraceMap[READ]) {
-                    yield {
-                        node: parent,
-                        path,
-                        type: READ,
-                        info: nextTraceMap[READ],
-                    };
-                }
-                yield* this._iteratePropertyReferences(
-                    parent,
-                    path,
-                    nextTraceMap
-                );
-            }
-            return
-        }
-        if (parent.type === "CallExpression") {
-            if (parent.callee === node && traceMap[CALL]) {
-                yield { node: parent, path, type: CALL, info: traceMap[CALL] };
-            }
-            return
-        }
-        if (parent.type === "NewExpression") {
-            if (parent.callee === node && traceMap[CONSTRUCT]) {
-                yield {
-                    node: parent,
-                    path,
-                    type: CONSTRUCT,
-                    info: traceMap[CONSTRUCT],
-                };
-            }
-            return
-        }
-        if (parent.type === "AssignmentExpression") {
-            if (parent.right === node) {
-                yield* this._iterateLhsReferences(parent.left, path, traceMap);
-                yield* this._iteratePropertyReferences(parent, path, traceMap);
-            }
-            return
-        }
-        if (parent.type === "AssignmentPattern") {
-            if (parent.right === node) {
-                yield* this._iterateLhsReferences(parent.left, path, traceMap);
-            }
-            return
-        }
-        if (parent.type === "VariableDeclarator") {
-            if (parent.init === node) {
-                yield* this._iterateLhsReferences(parent.id, path, traceMap);
-            }
-        }
-    }
-
-    /**
-     * Iterate the references for a given Pattern node.
-     * @param {Node} patternNode The Pattern node to iterate references.
-     * @param {string[]} path The current path.
-     * @param {object} traceMap The trace map.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    *_iterateLhsReferences(patternNode, path, traceMap) {
-        if (patternNode.type === "Identifier") {
-            const variable = findVariable(this.globalScope, patternNode);
-            if (variable != null) {
-                yield* this._iterateVariableReferences(
-                    variable,
-                    path,
-                    traceMap,
-                    false
-                );
-            }
-            return
-        }
-        if (patternNode.type === "ObjectPattern") {
-            for (const property of patternNode.properties) {
-                const key = getPropertyName(property);
-
-                if (key == null || !has(traceMap, key)) {
-                    continue
-                }
-
-                const nextPath = path.concat(key);
-                const nextTraceMap = traceMap[key];
-                if (nextTraceMap[READ]) {
-                    yield {
-                        node: property,
-                        path: nextPath,
-                        type: READ,
-                        info: nextTraceMap[READ],
-                    };
-                }
-                yield* this._iterateLhsReferences(
-                    property.value,
-                    nextPath,
-                    nextTraceMap
-                );
-            }
-            return
-        }
-        if (patternNode.type === "AssignmentPattern") {
-            yield* this._iterateLhsReferences(patternNode.left, path, traceMap);
-        }
-    }
-
-    /**
-     * Iterate the references for a given ModuleSpecifier node.
-     * @param {Node} specifierNode The ModuleSpecifier node to iterate references.
-     * @param {string[]} path The current path.
-     * @param {object} traceMap The trace map.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    *_iterateImportReferences(specifierNode, path, traceMap) {
-        const type = specifierNode.type;
-
-        if (type === "ImportSpecifier" || type === "ImportDefaultSpecifier") {
-            const key =
-                type === "ImportDefaultSpecifier"
-                    ? "default"
-                    : specifierNode.imported.name;
-            if (!has(traceMap, key)) {
-                return
-            }
-
-            path = path.concat(key); //eslint-disable-line no-param-reassign
-            const nextTraceMap = traceMap[key];
-            if (nextTraceMap[READ]) {
-                yield {
-                    node: specifierNode,
-                    path,
-                    type: READ,
-                    info: nextTraceMap[READ],
-                };
-            }
-            yield* this._iterateVariableReferences(
-                findVariable(this.globalScope, specifierNode.local),
-                path,
-                nextTraceMap,
-                false
-            );
-
-            return
-        }
-
-        if (type === "ImportNamespaceSpecifier") {
-            yield* this._iterateVariableReferences(
-                findVariable(this.globalScope, specifierNode.local),
-                path,
-                traceMap,
-                false
-            );
-            return
-        }
-
-        if (type === "ExportSpecifier") {
-            const key = specifierNode.local.name;
-            if (!has(traceMap, key)) {
-                return
-            }
-
-            path = path.concat(key); //eslint-disable-line no-param-reassign
-            const nextTraceMap = traceMap[key];
-            if (nextTraceMap[READ]) {
-                yield {
-                    node: specifierNode,
-                    path,
-                    type: READ,
-                    info: nextTraceMap[READ],
-                };
-            }
-        }
-    }
-}
-
-ReferenceTracker.READ = READ;
-ReferenceTracker.CALL = CALL;
-ReferenceTracker.CONSTRUCT = CONSTRUCT;
-ReferenceTracker.ESM = ESM;
-
-/**
- * This is a predicate function for Array#filter.
- * @param {string} name A name part.
- * @param {number} index The index of the name.
- * @returns {boolean} `false` if it's default.
- */
-function exceptDefault(name, index) {
-    return !(index === 1 && name === "default")
-}
-
-var index = {
-    CALL,
-    CONSTRUCT,
-    ESM,
-    findVariable,
-    getFunctionHeadLocation,
-    getFunctionNameWithKind,
-    getInnermostScope,
-    getPropertyName,
-    getStaticValue,
-    getStringIfConstant,
-    hasSideEffect,
-    isArrowToken,
-    isClosingBraceToken,
-    isClosingBracketToken,
-    isClosingParenToken,
-    isColonToken,
-    isCommaToken,
-    isCommentToken,
-    isNotArrowToken,
-    isNotClosingBraceToken,
-    isNotClosingBracketToken,
-    isNotClosingParenToken,
-    isNotColonToken,
-    isNotCommaToken,
-    isNotCommentToken,
-    isNotOpeningBraceToken,
-    isNotOpeningBracketToken,
-    isNotOpeningParenToken,
-    isNotSemicolonToken,
-    isOpeningBraceToken,
-    isOpeningBracketToken,
-    isOpeningParenToken,
-    isParenthesized,
-    isSemicolonToken,
-    PatternMatcher,
-    READ,
-    ReferenceTracker,
-};
-
-exports.CALL = CALL;
-exports.CONSTRUCT = CONSTRUCT;
-exports.ESM = ESM;
-exports.PatternMatcher = PatternMatcher;
-exports.READ = READ;
-exports.ReferenceTracker = ReferenceTracker;
-exports.default = index;
-exports.findVariable = findVariable;
-exports.getFunctionHeadLocation = getFunctionHeadLocation;
-exports.getFunctionNameWithKind = getFunctionNameWithKind;
-exports.getInnermostScope = getInnermostScope;
-exports.getPropertyName = getPropertyName;
-exports.getStaticValue = getStaticValue;
-exports.getStringIfConstant = getStringIfConstant;
-exports.hasSideEffect = hasSideEffect;
-exports.isArrowToken = isArrowToken;
-exports.isClosingBraceToken = isClosingBraceToken;
-exports.isClosingBracketToken = isClosingBracketToken;
-exports.isClosingParenToken = isClosingParenToken;
-exports.isColonToken = isColonToken;
-exports.isCommaToken = isCommaToken;
-exports.isCommentToken = isCommentToken;
-exports.isNotArrowToken = isNotArrowToken;
-exports.isNotClosingBraceToken = isNotClosingBraceToken;
-exports.isNotClosingBracketToken = isNotClosingBracketToken;
-exports.isNotClosingParenToken = isNotClosingParenToken;
-exports.isNotColonToken = isNotColonToken;
-exports.isNotCommaToken = isNotCommaToken;
-exports.isNotCommentToken = isNotCommentToken;
-exports.isNotOpeningBraceToken = isNotOpeningBraceToken;
-exports.isNotOpeningBracketToken = isNotOpeningBracketToken;
-exports.isNotOpeningParenToken = isNotOpeningParenToken;
-exports.isNotSemicolonToken = isNotSemicolonToken;
-exports.isOpeningBraceToken = isOpeningBraceToken;
-exports.isOpeningBracketToken = isOpeningBracketToken;
-exports.isOpeningParenToken = isOpeningParenToken;
-exports.isParenthesized = isParenthesized;
-exports.isSemicolonToken = isSemicolonToken;
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/index.js.map b/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/index.js.map
deleted file mode 100644
index de4dd42..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["src/get-innermost-scope.js","src/find-variable.js","src/token-predicate.js","src/get-function-head-location.js","src/get-static-value.js","src/get-string-if-constant.js","src/get-property-name.js","src/get-function-name-with-kind.js","src/has-side-effect.js","src/is-parenthesized.js","src/pattern-matcher.js","src/reference-tracker.js","src/index.js"],"sourcesContent":["/**\n * Get the innermost scope which contains a given location.\n * @param {Scope} initialScope The initial scope to search.\n * @param {Node} node The location to search.\n * @returns {Scope} The innermost scope.\n */\nexport function getInnermostScope(initialScope, node) {\n    const location = node.range[0]\n\n    let scope = initialScope\n    let found = false\n    do {\n        found = false\n        for (const childScope of scope.childScopes) {\n            const range = childScope.block.range\n\n            if (range[0] <= location && location < range[1]) {\n                scope = childScope\n                found = true\n                break\n            }\n        }\n    } while (found)\n\n    return scope\n}\n","import { getInnermostScope } from \"./get-innermost-scope\"\n\n/**\n * Find the variable of a given name.\n * @param {Scope} initialScope The scope to start finding.\n * @param {string|Node} nameOrNode The variable name to find. If this is a Node object then it should be an Identifier node.\n * @returns {Variable|null} The found variable or null.\n */\nexport function findVariable(initialScope, nameOrNode) {\n    let name = \"\"\n    let scope = initialScope\n\n    if (typeof nameOrNode === \"string\") {\n        name = nameOrNode\n    } else {\n        name = nameOrNode.name\n        scope = getInnermostScope(scope, nameOrNode)\n    }\n\n    while (scope != null) {\n        const variable = scope.set.get(name)\n        if (variable != null) {\n            return variable\n        }\n        scope = scope.upper\n    }\n\n    return null\n}\n","/**\n * Negate the result of `this` calling.\n * @param {Token} token The token to check.\n * @returns {boolean} `true` if the result of `this(token)` is `false`.\n */\nfunction negate0(token) {\n    return !this(token) //eslint-disable-line no-invalid-this\n}\n\n/**\n * Creates the negate function of the given function.\n * @param {function(Token):boolean} f - The function to negate.\n * @returns {function(Token):boolean} Negated function.\n */\nfunction negate(f) {\n    return negate0.bind(f)\n}\n\n/**\n * Checks if the given token is an arrow token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is an arrow token.\n */\nexport function isArrowToken(token) {\n    return token.value === \"=>\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a comma token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a comma token.\n */\nexport function isCommaToken(token) {\n    return token.value === \",\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a semicolon token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a semicolon token.\n */\nexport function isSemicolonToken(token) {\n    return token.value === \";\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a colon token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a colon token.\n */\nexport function isColonToken(token) {\n    return token.value === \":\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is an opening parenthesis token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is an opening parenthesis token.\n */\nexport function isOpeningParenToken(token) {\n    return token.value === \"(\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a closing parenthesis token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a closing parenthesis token.\n */\nexport function isClosingParenToken(token) {\n    return token.value === \")\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is an opening square bracket token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is an opening square bracket token.\n */\nexport function isOpeningBracketToken(token) {\n    return token.value === \"[\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a closing square bracket token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a closing square bracket token.\n */\nexport function isClosingBracketToken(token) {\n    return token.value === \"]\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is an opening brace token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is an opening brace token.\n */\nexport function isOpeningBraceToken(token) {\n    return token.value === \"{\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a closing brace token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a closing brace token.\n */\nexport function isClosingBraceToken(token) {\n    return token.value === \"}\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a comment token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a comment token.\n */\nexport function isCommentToken(token) {\n    return (\n        token.type === \"Line\" ||\n        token.type === \"Block\" ||\n        token.type === \"Shebang\"\n    )\n}\n\nexport const isNotArrowToken = negate(isArrowToken)\nexport const isNotCommaToken = negate(isCommaToken)\nexport const isNotSemicolonToken = negate(isSemicolonToken)\nexport const isNotColonToken = negate(isColonToken)\nexport const isNotOpeningParenToken = negate(isOpeningParenToken)\nexport const isNotClosingParenToken = negate(isClosingParenToken)\nexport const isNotOpeningBracketToken = negate(isOpeningBracketToken)\nexport const isNotClosingBracketToken = negate(isClosingBracketToken)\nexport const isNotOpeningBraceToken = negate(isOpeningBraceToken)\nexport const isNotClosingBraceToken = negate(isClosingBraceToken)\nexport const isNotCommentToken = negate(isCommentToken)\n","import { isArrowToken, isOpeningParenToken } from \"./token-predicate\"\n\n/**\n * Get the `(` token of the given function node.\n * @param {Node} node - The function node to get.\n * @param {SourceCode} sourceCode - The source code object to get tokens.\n * @returns {Token} `(` token.\n */\nfunction getOpeningParenOfParams(node, sourceCode) {\n    return node.id\n        ? sourceCode.getTokenAfter(node.id, isOpeningParenToken)\n        : sourceCode.getFirstToken(node, isOpeningParenToken)\n}\n\n/**\n * Get the location of the given function node for reporting.\n * @param {Node} node - The function node to get.\n * @param {SourceCode} sourceCode - The source code object to get tokens.\n * @returns {string} The location of the function node for reporting.\n */\nexport function getFunctionHeadLocation(node, sourceCode) {\n    const parent = node.parent\n    let start = null\n    let end = null\n\n    if (node.type === \"ArrowFunctionExpression\") {\n        const arrowToken = sourceCode.getTokenBefore(node.body, isArrowToken)\n\n        start = arrowToken.loc.start\n        end = arrowToken.loc.end\n    } else if (\n        parent.type === \"Property\" ||\n        parent.type === \"MethodDefinition\"\n    ) {\n        start = parent.loc.start\n        end = getOpeningParenOfParams(node, sourceCode).loc.start\n    } else {\n        start = node.loc.start\n        end = getOpeningParenOfParams(node, sourceCode).loc.start\n    }\n\n    return {\n        start: Object.assign({}, start),\n        end: Object.assign({}, end),\n    }\n}\n","/* globals BigInt, globalThis, global, self, window */\n\nimport { findVariable } from \"./find-variable\"\n\nconst globalObject =\n    typeof globalThis !== \"undefined\"\n        ? globalThis\n        : typeof self !== \"undefined\"\n        ? self\n        : typeof window !== \"undefined\"\n        ? window\n        : typeof global !== \"undefined\"\n        ? global\n        : {}\n\nconst builtinNames = Object.freeze(\n    new Set([\n        \"Array\",\n        \"ArrayBuffer\",\n        \"BigInt\",\n        \"BigInt64Array\",\n        \"BigUint64Array\",\n        \"Boolean\",\n        \"DataView\",\n        \"Date\",\n        \"decodeURI\",\n        \"decodeURIComponent\",\n        \"encodeURI\",\n        \"encodeURIComponent\",\n        \"escape\",\n        \"Float32Array\",\n        \"Float64Array\",\n        \"Function\",\n        \"Infinity\",\n        \"Int16Array\",\n        \"Int32Array\",\n        \"Int8Array\",\n        \"isFinite\",\n        \"isNaN\",\n        \"isPrototypeOf\",\n        \"JSON\",\n        \"Map\",\n        \"Math\",\n        \"NaN\",\n        \"Number\",\n        \"Object\",\n        \"parseFloat\",\n        \"parseInt\",\n        \"Promise\",\n        \"Proxy\",\n        \"Reflect\",\n        \"RegExp\",\n        \"Set\",\n        \"String\",\n        \"Symbol\",\n        \"Uint16Array\",\n        \"Uint32Array\",\n        \"Uint8Array\",\n        \"Uint8ClampedArray\",\n        \"undefined\",\n        \"unescape\",\n        \"WeakMap\",\n        \"WeakSet\",\n    ])\n)\nconst callAllowed = new Set(\n    [\n        Array.isArray,\n        typeof BigInt === \"function\" ? BigInt : undefined,\n        Boolean,\n        Date,\n        Date.parse,\n        decodeURI,\n        decodeURIComponent,\n        encodeURI,\n        encodeURIComponent,\n        escape,\n        isFinite,\n        isNaN,\n        isPrototypeOf,\n        ...Object.getOwnPropertyNames(Math)\n            .map(k => Math[k])\n            .filter(f => typeof f === \"function\"),\n        Number,\n        Number.isFinite,\n        Number.isNaN,\n        Number.parseFloat,\n        Number.parseInt,\n        Object,\n        Object.entries,\n        Object.is,\n        Object.isExtensible,\n        Object.isFrozen,\n        Object.isSealed,\n        Object.keys,\n        Object.values,\n        parseFloat,\n        parseInt,\n        RegExp,\n        String,\n        String.fromCharCode,\n        String.fromCodePoint,\n        String.raw,\n        Symbol,\n        Symbol.for,\n        Symbol.keyFor,\n        unescape,\n    ].filter(f => typeof f === \"function\")\n)\nconst callPassThrough = new Set([\n    Object.freeze,\n    Object.preventExtensions,\n    Object.seal,\n])\n\n/**\n * Get the property descriptor.\n * @param {object} object The object to get.\n * @param {string|number|symbol} name The property name to get.\n */\nfunction getPropertyDescriptor(object, name) {\n    let x = object\n    while ((typeof x === \"object\" || typeof x === \"function\") && x !== null) {\n        const d = Object.getOwnPropertyDescriptor(x, name)\n        if (d) {\n            return d\n        }\n        x = Object.getPrototypeOf(x)\n    }\n    return null\n}\n\n/**\n * Check if a property is getter or not.\n * @param {object} object The object to check.\n * @param {string|number|symbol} name The property name to check.\n */\nfunction isGetter(object, name) {\n    const d = getPropertyDescriptor(object, name)\n    return d != null && d.get != null\n}\n\n/**\n * Get the element values of a given node list.\n * @param {Node[]} nodeList The node list to get values.\n * @param {Scope|undefined} initialScope The initial scope to find variables.\n * @returns {any[]|null} The value list if all nodes are constant. Otherwise, null.\n */\nfunction getElementValues(nodeList, initialScope) {\n    const valueList = []\n\n    for (let i = 0; i < nodeList.length; ++i) {\n        const elementNode = nodeList[i]\n\n        if (elementNode == null) {\n            valueList.length = i + 1\n        } else if (elementNode.type === \"SpreadElement\") {\n            const argument = getStaticValueR(elementNode.argument, initialScope)\n            if (argument == null) {\n                return null\n            }\n            valueList.push(...argument.value)\n        } else {\n            const element = getStaticValueR(elementNode, initialScope)\n            if (element == null) {\n                return null\n            }\n            valueList.push(element.value)\n        }\n    }\n\n    return valueList\n}\n\nconst operations = Object.freeze({\n    ArrayExpression(node, initialScope) {\n        const elements = getElementValues(node.elements, initialScope)\n        return elements != null ? { value: elements } : null\n    },\n\n    AssignmentExpression(node, initialScope) {\n        if (node.operator === \"=\") {\n            return getStaticValueR(node.right, initialScope)\n        }\n        return null\n    },\n\n    //eslint-disable-next-line complexity\n    BinaryExpression(node, initialScope) {\n        if (node.operator === \"in\" || node.operator === \"instanceof\") {\n            // Not supported.\n            return null\n        }\n\n        const left = getStaticValueR(node.left, initialScope)\n        const right = getStaticValueR(node.right, initialScope)\n        if (left != null && right != null) {\n            switch (node.operator) {\n                case \"==\":\n                    return { value: left.value == right.value } //eslint-disable-line eqeqeq\n                case \"!=\":\n                    return { value: left.value != right.value } //eslint-disable-line eqeqeq\n                case \"===\":\n                    return { value: left.value === right.value }\n                case \"!==\":\n                    return { value: left.value !== right.value }\n                case \"<\":\n                    return { value: left.value < right.value }\n                case \"<=\":\n                    return { value: left.value <= right.value }\n                case \">\":\n                    return { value: left.value > right.value }\n                case \">=\":\n                    return { value: left.value >= right.value }\n                case \"<<\":\n                    return { value: left.value << right.value }\n                case \">>\":\n                    return { value: left.value >> right.value }\n                case \">>>\":\n                    return { value: left.value >>> right.value }\n                case \"+\":\n                    return { value: left.value + right.value }\n                case \"-\":\n                    return { value: left.value - right.value }\n                case \"*\":\n                    return { value: left.value * right.value }\n                case \"/\":\n                    return { value: left.value / right.value }\n                case \"%\":\n                    return { value: left.value % right.value }\n                case \"**\":\n                    return { value: Math.pow(left.value, right.value) }\n                case \"|\":\n                    return { value: left.value | right.value }\n                case \"^\":\n                    return { value: left.value ^ right.value }\n                case \"&\":\n                    return { value: left.value & right.value }\n\n                // no default\n            }\n        }\n\n        return null\n    },\n\n    CallExpression(node, initialScope) {\n        const calleeNode = node.callee\n        const args = getElementValues(node.arguments, initialScope)\n\n        if (args != null) {\n            if (calleeNode.type === \"MemberExpression\") {\n                const object = getStaticValueR(calleeNode.object, initialScope)\n                const property = calleeNode.computed\n                    ? getStaticValueR(calleeNode.property, initialScope)\n                    : { value: calleeNode.property.name }\n\n                if (object != null && property != null) {\n                    const receiver = object.value\n                    const methodName = property.value\n                    if (callAllowed.has(receiver[methodName])) {\n                        return { value: receiver[methodName](...args) }\n                    }\n                    if (callPassThrough.has(receiver[methodName])) {\n                        return { value: args[0] }\n                    }\n                }\n            } else {\n                const callee = getStaticValueR(calleeNode, initialScope)\n                if (callee != null) {\n                    const func = callee.value\n                    if (callAllowed.has(func)) {\n                        return { value: func(...args) }\n                    }\n                    if (callPassThrough.has(func)) {\n                        return { value: args[0] }\n                    }\n                }\n            }\n        }\n\n        return null\n    },\n\n    ConditionalExpression(node, initialScope) {\n        const test = getStaticValueR(node.test, initialScope)\n        if (test != null) {\n            return test.value\n                ? getStaticValueR(node.consequent, initialScope)\n                : getStaticValueR(node.alternate, initialScope)\n        }\n        return null\n    },\n\n    ExpressionStatement(node, initialScope) {\n        return getStaticValueR(node.expression, initialScope)\n    },\n\n    Identifier(node, initialScope) {\n        if (initialScope != null) {\n            const variable = findVariable(initialScope, node)\n\n            // Built-in globals.\n            if (\n                variable != null &&\n                variable.defs.length === 0 &&\n                builtinNames.has(variable.name) &&\n                variable.name in globalObject\n            ) {\n                return { value: globalObject[variable.name] }\n            }\n\n            // Constants.\n            if (variable != null && variable.defs.length === 1) {\n                const def = variable.defs[0]\n                if (\n                    def.parent &&\n                    def.parent.kind === \"const\" &&\n                    // TODO(mysticatea): don't support destructuring here.\n                    def.node.id.type === \"Identifier\"\n                ) {\n                    return getStaticValueR(def.node.init, initialScope)\n                }\n            }\n        }\n        return null\n    },\n\n    Literal(node) {\n        //istanbul ignore if : this is implementation-specific behavior.\n        if ((node.regex != null || node.bigint != null) && node.value == null) {\n            // It was a RegExp/BigInt literal, but Node.js didn't support it.\n            return null\n        }\n        return { value: node.value }\n    },\n\n    LogicalExpression(node, initialScope) {\n        const left = getStaticValueR(node.left, initialScope)\n        if (left != null) {\n            if (\n                (node.operator === \"||\" && Boolean(left.value) === true) ||\n                (node.operator === \"&&\" && Boolean(left.value) === false)\n            ) {\n                return left\n            }\n\n            const right = getStaticValueR(node.right, initialScope)\n            if (right != null) {\n                return right\n            }\n        }\n\n        return null\n    },\n\n    MemberExpression(node, initialScope) {\n        const object = getStaticValueR(node.object, initialScope)\n        const property = node.computed\n            ? getStaticValueR(node.property, initialScope)\n            : { value: node.property.name }\n\n        if (\n            object != null &&\n            property != null &&\n            !isGetter(object.value, property.value)\n        ) {\n            return { value: object.value[property.value] }\n        }\n        return null\n    },\n\n    NewExpression(node, initialScope) {\n        const callee = getStaticValueR(node.callee, initialScope)\n        const args = getElementValues(node.arguments, initialScope)\n\n        if (callee != null && args != null) {\n            const Func = callee.value\n            if (callAllowed.has(Func)) {\n                return { value: new Func(...args) }\n            }\n        }\n\n        return null\n    },\n\n    ObjectExpression(node, initialScope) {\n        const object = {}\n\n        for (const propertyNode of node.properties) {\n            if (propertyNode.type === \"Property\") {\n                if (propertyNode.kind !== \"init\") {\n                    return null\n                }\n                const key = propertyNode.computed\n                    ? getStaticValueR(propertyNode.key, initialScope)\n                    : { value: propertyNode.key.name }\n                const value = getStaticValueR(propertyNode.value, initialScope)\n                if (key == null || value == null) {\n                    return null\n                }\n                object[key.value] = value.value\n            } else if (\n                propertyNode.type === \"SpreadElement\" ||\n                propertyNode.type === \"ExperimentalSpreadProperty\"\n            ) {\n                const argument = getStaticValueR(\n                    propertyNode.argument,\n                    initialScope\n                )\n                if (argument == null) {\n                    return null\n                }\n                Object.assign(object, argument.value)\n            } else {\n                return null\n            }\n        }\n\n        return { value: object }\n    },\n\n    SequenceExpression(node, initialScope) {\n        const last = node.expressions[node.expressions.length - 1]\n        return getStaticValueR(last, initialScope)\n    },\n\n    TaggedTemplateExpression(node, initialScope) {\n        const tag = getStaticValueR(node.tag, initialScope)\n        const expressions = getElementValues(\n            node.quasi.expressions,\n            initialScope\n        )\n\n        if (tag != null && expressions != null) {\n            const func = tag.value\n            const strings = node.quasi.quasis.map(q => q.value.cooked)\n            strings.raw = node.quasi.quasis.map(q => q.value.raw)\n\n            if (func === String.raw) {\n                return { value: func(strings, ...expressions) }\n            }\n        }\n\n        return null\n    },\n\n    TemplateLiteral(node, initialScope) {\n        const expressions = getElementValues(node.expressions, initialScope)\n        if (expressions != null) {\n            let value = node.quasis[0].value.cooked\n            for (let i = 0; i < expressions.length; ++i) {\n                value += expressions[i]\n                value += node.quasis[i + 1].value.cooked\n            }\n            return { value }\n        }\n        return null\n    },\n\n    UnaryExpression(node, initialScope) {\n        if (node.operator === \"delete\") {\n            // Not supported.\n            return null\n        }\n        if (node.operator === \"void\") {\n            return { value: undefined }\n        }\n\n        const arg = getStaticValueR(node.argument, initialScope)\n        if (arg != null) {\n            switch (node.operator) {\n                case \"-\":\n                    return { value: -arg.value }\n                case \"+\":\n                    return { value: +arg.value } //eslint-disable-line no-implicit-coercion\n                case \"!\":\n                    return { value: !arg.value }\n                case \"~\":\n                    return { value: ~arg.value }\n                case \"typeof\":\n                    return { value: typeof arg.value }\n\n                // no default\n            }\n        }\n\n        return null\n    },\n})\n\n/**\n * Get the value of a given node if it's a static value.\n * @param {Node} node The node to get.\n * @param {Scope|undefined} initialScope The scope to start finding variable.\n * @returns {{value:any}|null} The static value of the node, or `null`.\n */\nfunction getStaticValueR(node, initialScope) {\n    if (node != null && Object.hasOwnProperty.call(operations, node.type)) {\n        return operations[node.type](node, initialScope)\n    }\n    return null\n}\n\n/**\n * Get the value of a given node if it's a static value.\n * @param {Node} node The node to get.\n * @param {Scope} [initialScope] The scope to start finding variable. Optional. If this scope was given, this tries to resolve identifier references which are in the given node as much as possible.\n * @returns {{value:any}|null} The static value of the node, or `null`.\n */\nexport function getStaticValue(node, initialScope = null) {\n    try {\n        return getStaticValueR(node, initialScope)\n    } catch (_error) {\n        return null\n    }\n}\n","import { getStaticValue } from \"./get-static-value\"\n\n/**\n * Get the value of a given node if it's a literal or a template literal.\n * @param {Node} node The node to get.\n * @param {Scope} [initialScope] The scope to start finding variable. Optional. If the node is an Identifier node and this scope was given, this checks the variable of the identifier, and returns the value of it if the variable is a constant.\n * @returns {string|null} The value of the node, or `null`.\n */\nexport function getStringIfConstant(node, initialScope = null) {\n    // Handle the literals that the platform doesn't support natively.\n    if (node && node.type === \"Literal\" && node.value === null) {\n        if (node.regex) {\n            return `/${node.regex.pattern}/${node.regex.flags}`\n        }\n        if (node.bigint) {\n            return node.bigint\n        }\n    }\n\n    const evaluated = getStaticValue(node, initialScope)\n    return evaluated && String(evaluated.value)\n}\n","import { getStringIfConstant } from \"./get-string-if-constant\"\n\n/**\n * Get the property name from a MemberExpression node or a Property node.\n * @param {Node} node The node to get.\n * @param {Scope} [initialScope] The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.\n * @returns {string|null} The property name of the node.\n */\nexport function getPropertyName(node, initialScope) {\n    switch (node.type) {\n        case \"MemberExpression\":\n            if (node.computed) {\n                return getStringIfConstant(node.property, initialScope)\n            }\n            return node.property.name\n\n        case \"Property\":\n        case \"MethodDefinition\":\n            if (node.computed) {\n                return getStringIfConstant(node.key, initialScope)\n            }\n            if (node.key.type === \"Literal\") {\n                return String(node.key.value)\n            }\n            return node.key.name\n\n        // no default\n    }\n\n    return null\n}\n","import { getPropertyName } from \"./get-property-name\"\n\n/**\n * Get the name and kind of the given function node.\n * @param {ASTNode} node - The function node to get.\n * @returns {string} The name and kind of the function node.\n */\nexport function getFunctionNameWithKind(node) {\n    const parent = node.parent\n    const tokens = []\n\n    if (parent.type === \"MethodDefinition\" && parent.static) {\n        tokens.push(\"static\")\n    }\n    if (node.async) {\n        tokens.push(\"async\")\n    }\n    if (node.generator) {\n        tokens.push(\"generator\")\n    }\n\n    if (node.type === \"ArrowFunctionExpression\") {\n        tokens.push(\"arrow\", \"function\")\n    } else if (\n        parent.type === \"Property\" ||\n        parent.type === \"MethodDefinition\"\n    ) {\n        if (parent.kind === \"constructor\") {\n            return \"constructor\"\n        }\n        if (parent.kind === \"get\") {\n            tokens.push(\"getter\")\n        } else if (parent.kind === \"set\") {\n            tokens.push(\"setter\")\n        } else {\n            tokens.push(\"method\")\n        }\n    } else {\n        tokens.push(\"function\")\n    }\n\n    if (node.id) {\n        tokens.push(`'${node.id.name}'`)\n    } else {\n        const name = getPropertyName(parent)\n\n        if (name) {\n            tokens.push(`'${name}'`)\n        }\n    }\n\n    return tokens.join(\" \")\n}\n","import evk from \"eslint-visitor-keys\"\n\nconst typeConversionBinaryOps = Object.freeze(\n    new Set([\n        \"==\",\n        \"!=\",\n        \"<\",\n        \"<=\",\n        \">\",\n        \">=\",\n        \"<<\",\n        \">>\",\n        \">>>\",\n        \"+\",\n        \"-\",\n        \"*\",\n        \"/\",\n        \"%\",\n        \"|\",\n        \"^\",\n        \"&\",\n        \"in\",\n    ])\n)\nconst typeConversionUnaryOps = Object.freeze(new Set([\"-\", \"+\", \"!\", \"~\"]))\nconst visitor = Object.freeze(\n    Object.assign(Object.create(null), {\n        $visit(node, options, visitorKeys) {\n            const { type } = node\n\n            if (typeof this[type] === \"function\") {\n                return this[type](node, options, visitorKeys)\n            }\n\n            return this.$visitChildren(node, options, visitorKeys)\n        },\n\n        $visitChildren(node, options, visitorKeys) {\n            const { type } = node\n\n            for (const key of visitorKeys[type] || evk.getKeys(node)) {\n                const value = node[key]\n\n                if (Array.isArray(value)) {\n                    for (const element of value) {\n                        if (\n                            element &&\n                            this.$visit(element, options, visitorKeys)\n                        ) {\n                            return true\n                        }\n                    }\n                } else if (value && this.$visit(value, options, visitorKeys)) {\n                    return true\n                }\n            }\n\n            return false\n        },\n\n        ArrowFunctionExpression() {\n            return false\n        },\n        AssignmentExpression() {\n            return true\n        },\n        AwaitExpression() {\n            return true\n        },\n        BinaryExpression(node, options, visitorKeys) {\n            if (\n                options.considerImplicitTypeConversion &&\n                typeConversionBinaryOps.has(node.operator) &&\n                (node.left.type !== \"Literal\" || node.right.type !== \"Literal\")\n            ) {\n                return true\n            }\n            return this.$visitChildren(node, options, visitorKeys)\n        },\n        CallExpression() {\n            return true\n        },\n        FunctionExpression() {\n            return false\n        },\n        ImportExpression() {\n            return true\n        },\n        MemberExpression(node, options, visitorKeys) {\n            if (options.considerGetters) {\n                return true\n            }\n            if (\n                options.considerImplicitTypeConversion &&\n                node.computed &&\n                node.property.type !== \"Literal\"\n            ) {\n                return true\n            }\n            return this.$visitChildren(node, options, visitorKeys)\n        },\n        MethodDefinition(node, options, visitorKeys) {\n            if (\n                options.considerImplicitTypeConversion &&\n                node.computed &&\n                node.key.type !== \"Literal\"\n            ) {\n                return true\n            }\n            return this.$visitChildren(node, options, visitorKeys)\n        },\n        NewExpression() {\n            return true\n        },\n        Property(node, options, visitorKeys) {\n            if (\n                options.considerImplicitTypeConversion &&\n                node.computed &&\n                node.key.type !== \"Literal\"\n            ) {\n                return true\n            }\n            return this.$visitChildren(node, options, visitorKeys)\n        },\n        UnaryExpression(node, options, visitorKeys) {\n            if (node.operator === \"delete\") {\n                return true\n            }\n            if (\n                options.considerImplicitTypeConversion &&\n                typeConversionUnaryOps.has(node.operator) &&\n                node.argument.type !== \"Literal\"\n            ) {\n                return true\n            }\n            return this.$visitChildren(node, options, visitorKeys)\n        },\n        UpdateExpression() {\n            return true\n        },\n        YieldExpression() {\n            return true\n        },\n    })\n)\n\n/**\n * Check whether a given node has any side effect or not.\n * @param {Node} node The node to get.\n * @param {SourceCode} sourceCode The source code object.\n * @param {object} [options] The option object.\n * @param {boolean} [options.considerGetters=false] If `true` then it considers member accesses as the node which has side effects.\n * @param {boolean} [options.considerImplicitTypeConversion=false] If `true` then it considers implicit type conversion as the node which has side effects.\n * @param {object} [options.visitorKeys=evk.KEYS] The keys to traverse nodes. Use `context.getSourceCode().visitorKeys`.\n * @returns {boolean} `true` if the node has a certain side effect.\n */\nexport function hasSideEffect(\n    node,\n    sourceCode,\n    { considerGetters = false, considerImplicitTypeConversion = false } = {}\n) {\n    return visitor.$visit(\n        node,\n        { considerGetters, considerImplicitTypeConversion },\n        sourceCode.visitorKeys || evk.KEYS\n    )\n}\n","import { isClosingParenToken, isOpeningParenToken } from \"./token-predicate\"\n\n/**\n * Get the left parenthesis of the parent node syntax if it exists.\n * E.g., `if (a) {}` then the `(`.\n * @param {Node} node The AST node to check.\n * @param {SourceCode} sourceCode The source code object to get tokens.\n * @returns {Token|null} The left parenthesis of the parent node syntax\n */\nfunction getParentSyntaxParen(node, sourceCode) {\n    const parent = node.parent\n\n    switch (parent.type) {\n        case \"CallExpression\":\n        case \"NewExpression\":\n            if (parent.arguments.length === 1 && parent.arguments[0] === node) {\n                return sourceCode.getTokenAfter(\n                    parent.callee,\n                    isOpeningParenToken\n                )\n            }\n            return null\n\n        case \"DoWhileStatement\":\n            if (parent.test === node) {\n                return sourceCode.getTokenAfter(\n                    parent.body,\n                    isOpeningParenToken\n                )\n            }\n            return null\n\n        case \"IfStatement\":\n        case \"WhileStatement\":\n            if (parent.test === node) {\n                return sourceCode.getFirstToken(parent, 1)\n            }\n            return null\n\n        case \"ImportExpression\":\n            if (parent.source === node) {\n                return sourceCode.getFirstToken(parent, 1)\n            }\n            return null\n\n        case \"SwitchStatement\":\n            if (parent.discriminant === node) {\n                return sourceCode.getFirstToken(parent, 1)\n            }\n            return null\n\n        case \"WithStatement\":\n            if (parent.object === node) {\n                return sourceCode.getFirstToken(parent, 1)\n            }\n            return null\n\n        default:\n            return null\n    }\n}\n\n/**\n * Check whether a given node is parenthesized or not.\n * @param {number} times The number of parantheses.\n * @param {Node} node The AST node to check.\n * @param {SourceCode} sourceCode The source code object to get tokens.\n * @returns {boolean} `true` if the node is parenthesized the given times.\n */\n/**\n * Check whether a given node is parenthesized or not.\n * @param {Node} node The AST node to check.\n * @param {SourceCode} sourceCode The source code object to get tokens.\n * @returns {boolean} `true` if the node is parenthesized.\n */\nexport function isParenthesized(\n    timesOrNode,\n    nodeOrSourceCode,\n    optionalSourceCode\n) {\n    let times, node, sourceCode, maybeLeftParen, maybeRightParen\n    if (typeof timesOrNode === \"number\") {\n        times = timesOrNode | 0\n        node = nodeOrSourceCode\n        sourceCode = optionalSourceCode\n        if (!(times >= 1)) {\n            throw new TypeError(\"'times' should be a positive integer.\")\n        }\n    } else {\n        times = 1\n        node = timesOrNode\n        sourceCode = nodeOrSourceCode\n    }\n\n    if (node == null) {\n        return false\n    }\n\n    maybeLeftParen = maybeRightParen = node\n    do {\n        maybeLeftParen = sourceCode.getTokenBefore(maybeLeftParen)\n        maybeRightParen = sourceCode.getTokenAfter(maybeRightParen)\n    } while (\n        maybeLeftParen != null &&\n        maybeRightParen != null &&\n        isOpeningParenToken(maybeLeftParen) &&\n        isClosingParenToken(maybeRightParen) &&\n        // Avoid false positive such as `if (a) {}`\n        maybeLeftParen !== getParentSyntaxParen(node, sourceCode) &&\n        --times > 0\n    )\n\n    return times === 0\n}\n","/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * See LICENSE file in root directory for full license.\n */\n\nconst placeholder = /\\$(?:[$&`']|[1-9][0-9]?)/gu\n\n/** @type {WeakMap<PatternMatcher, {pattern:RegExp,escaped:boolean}>} */\nconst internal = new WeakMap()\n\n/**\n * Check whether a given character is escaped or not.\n * @param {string} str The string to check.\n * @param {number} index The location of the character to check.\n * @returns {boolean} `true` if the character is escaped.\n */\nfunction isEscaped(str, index) {\n    let escaped = false\n    for (let i = index - 1; i >= 0 && str.charCodeAt(i) === 0x5c; --i) {\n        escaped = !escaped\n    }\n    return escaped\n}\n\n/**\n * Replace a given string by a given matcher.\n * @param {PatternMatcher} matcher The pattern matcher.\n * @param {string} str The string to be replaced.\n * @param {string} replacement The new substring to replace each matched part.\n * @returns {string} The replaced string.\n */\nfunction replaceS(matcher, str, replacement) {\n    const chunks = []\n    let index = 0\n\n    /** @type {RegExpExecArray} */\n    let match = null\n\n    /**\n     * @param {string} key The placeholder.\n     * @returns {string} The replaced string.\n     */\n    function replacer(key) {\n        switch (key) {\n            case \"$$\":\n                return \"$\"\n            case \"$&\":\n                return match[0]\n            case \"$`\":\n                return str.slice(0, match.index)\n            case \"$'\":\n                return str.slice(match.index + match[0].length)\n            default: {\n                const i = key.slice(1)\n                if (i in match) {\n                    return match[i]\n                }\n                return key\n            }\n        }\n    }\n\n    for (match of matcher.execAll(str)) {\n        chunks.push(str.slice(index, match.index))\n        chunks.push(replacement.replace(placeholder, replacer))\n        index = match.index + match[0].length\n    }\n    chunks.push(str.slice(index))\n\n    return chunks.join(\"\")\n}\n\n/**\n * Replace a given string by a given matcher.\n * @param {PatternMatcher} matcher The pattern matcher.\n * @param {string} str The string to be replaced.\n * @param {(...strs[])=>string} replace The function to replace each matched part.\n * @returns {string} The replaced string.\n */\nfunction replaceF(matcher, str, replace) {\n    const chunks = []\n    let index = 0\n\n    for (const match of matcher.execAll(str)) {\n        chunks.push(str.slice(index, match.index))\n        chunks.push(String(replace(...match, match.index, match.input)))\n        index = match.index + match[0].length\n    }\n    chunks.push(str.slice(index))\n\n    return chunks.join(\"\")\n}\n\n/**\n * The class to find patterns as considering escape sequences.\n */\nexport class PatternMatcher {\n    /**\n     * Initialize this matcher.\n     * @param {RegExp} pattern The pattern to match.\n     * @param {{escaped:boolean}} options The options.\n     */\n    constructor(pattern, { escaped = false } = {}) {\n        if (!(pattern instanceof RegExp)) {\n            throw new TypeError(\"'pattern' should be a RegExp instance.\")\n        }\n        if (!pattern.flags.includes(\"g\")) {\n            throw new Error(\"'pattern' should contains 'g' flag.\")\n        }\n\n        internal.set(this, {\n            pattern: new RegExp(pattern.source, pattern.flags),\n            escaped: Boolean(escaped),\n        })\n    }\n\n    /**\n     * Find the pattern in a given string.\n     * @param {string} str The string to find.\n     * @returns {IterableIterator<RegExpExecArray>} The iterator which iterate the matched information.\n     */\n    *execAll(str) {\n        const { pattern, escaped } = internal.get(this)\n        let match = null\n        let lastIndex = 0\n\n        pattern.lastIndex = 0\n        while ((match = pattern.exec(str)) != null) {\n            if (escaped || !isEscaped(str, match.index)) {\n                lastIndex = pattern.lastIndex\n                yield match\n                pattern.lastIndex = lastIndex\n            }\n        }\n    }\n\n    /**\n     * Check whether the pattern is found in a given string.\n     * @param {string} str The string to check.\n     * @returns {boolean} `true` if the pattern was found in the string.\n     */\n    test(str) {\n        const it = this.execAll(str)\n        const ret = it.next()\n        return !ret.done\n    }\n\n    /**\n     * Replace a given string.\n     * @param {string} str The string to be replaced.\n     * @param {(string|((...strs:string[])=>string))} replacer The string or function to replace. This is the same as the 2nd argument of `String.prototype.replace`.\n     * @returns {string} The replaced string.\n     */\n    [Symbol.replace](str, replacer) {\n        return typeof replacer === \"function\"\n            ? replaceF(this, String(str), replacer)\n            : replaceS(this, String(str), String(replacer))\n    }\n}\n","import { findVariable } from \"./find-variable\"\nimport { getPropertyName } from \"./get-property-name\"\nimport { getStringIfConstant } from \"./get-string-if-constant\"\n\nconst IMPORT_TYPE = /^(?:Import|Export(?:All|Default|Named))Declaration$/u\nconst has = Function.call.bind(Object.hasOwnProperty)\n\nexport const READ = Symbol(\"read\")\nexport const CALL = Symbol(\"call\")\nexport const CONSTRUCT = Symbol(\"construct\")\nexport const ESM = Symbol(\"esm\")\n\nconst requireCall = { require: { [CALL]: true } }\n\n/**\n * Check whether a given variable is modified or not.\n * @param {Variable} variable The variable to check.\n * @returns {boolean} `true` if the variable is modified.\n */\nfunction isModifiedGlobal(variable) {\n    return (\n        variable == null ||\n        variable.defs.length !== 0 ||\n        variable.references.some(r => r.isWrite())\n    )\n}\n\n/**\n * Check if the value of a given node is passed through to the parent syntax as-is.\n * For example, `a` and `b` in (`a || b` and `c ? a : b`) are passed through.\n * @param {Node} node A node to check.\n * @returns {boolean} `true` if the node is passed through.\n */\nfunction isPassThrough(node) {\n    const parent = node.parent\n\n    switch (parent && parent.type) {\n        case \"ConditionalExpression\":\n            return parent.consequent === node || parent.alternate === node\n        case \"LogicalExpression\":\n            return true\n        case \"SequenceExpression\":\n            return parent.expressions[parent.expressions.length - 1] === node\n\n        default:\n            return false\n    }\n}\n\n/**\n * The reference tracker.\n */\nexport class ReferenceTracker {\n    /**\n     * Initialize this tracker.\n     * @param {Scope} globalScope The global scope.\n     * @param {object} [options] The options.\n     * @param {\"legacy\"|\"strict\"} [options.mode=\"strict\"] The mode to determine the ImportDeclaration's behavior for CJS modules.\n     * @param {string[]} [options.globalObjectNames=[\"global\",\"self\",\"window\"]] The variable names for Global Object.\n     */\n    constructor(\n        globalScope,\n        {\n            mode = \"strict\",\n            globalObjectNames = [\"global\", \"self\", \"window\"],\n        } = {}\n    ) {\n        this.variableStack = []\n        this.globalScope = globalScope\n        this.mode = mode\n        this.globalObjectNames = globalObjectNames.slice(0)\n    }\n\n    /**\n     * Iterate the references of global variables.\n     * @param {object} traceMap The trace map.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    *iterateGlobalReferences(traceMap) {\n        for (const key of Object.keys(traceMap)) {\n            const nextTraceMap = traceMap[key]\n            const path = [key]\n            const variable = this.globalScope.set.get(key)\n\n            if (isModifiedGlobal(variable)) {\n                continue\n            }\n\n            yield* this._iterateVariableReferences(\n                variable,\n                path,\n                nextTraceMap,\n                true\n            )\n        }\n\n        for (const key of this.globalObjectNames) {\n            const path = []\n            const variable = this.globalScope.set.get(key)\n\n            if (isModifiedGlobal(variable)) {\n                continue\n            }\n\n            yield* this._iterateVariableReferences(\n                variable,\n                path,\n                traceMap,\n                false\n            )\n        }\n    }\n\n    /**\n     * Iterate the references of CommonJS modules.\n     * @param {object} traceMap The trace map.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    *iterateCjsReferences(traceMap) {\n        for (const { node } of this.iterateGlobalReferences(requireCall)) {\n            const key = getStringIfConstant(node.arguments[0])\n            if (key == null || !has(traceMap, key)) {\n                continue\n            }\n\n            const nextTraceMap = traceMap[key]\n            const path = [key]\n\n            if (nextTraceMap[READ]) {\n                yield {\n                    node,\n                    path,\n                    type: READ,\n                    info: nextTraceMap[READ],\n                }\n            }\n            yield* this._iteratePropertyReferences(node, path, nextTraceMap)\n        }\n    }\n\n    /**\n     * Iterate the references of ES modules.\n     * @param {object} traceMap The trace map.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    *iterateEsmReferences(traceMap) {\n        const programNode = this.globalScope.block\n\n        for (const node of programNode.body) {\n            if (!IMPORT_TYPE.test(node.type) || node.source == null) {\n                continue\n            }\n            const moduleId = node.source.value\n\n            if (!has(traceMap, moduleId)) {\n                continue\n            }\n            const nextTraceMap = traceMap[moduleId]\n            const path = [moduleId]\n\n            if (nextTraceMap[READ]) {\n                yield { node, path, type: READ, info: nextTraceMap[READ] }\n            }\n\n            if (node.type === \"ExportAllDeclaration\") {\n                for (const key of Object.keys(nextTraceMap)) {\n                    const exportTraceMap = nextTraceMap[key]\n                    if (exportTraceMap[READ]) {\n                        yield {\n                            node,\n                            path: path.concat(key),\n                            type: READ,\n                            info: exportTraceMap[READ],\n                        }\n                    }\n                }\n            } else {\n                for (const specifier of node.specifiers) {\n                    const esm = has(nextTraceMap, ESM)\n                    const it = this._iterateImportReferences(\n                        specifier,\n                        path,\n                        esm\n                            ? nextTraceMap\n                            : this.mode === \"legacy\"\n                            ? Object.assign(\n                                  { default: nextTraceMap },\n                                  nextTraceMap\n                              )\n                            : { default: nextTraceMap }\n                    )\n\n                    if (esm) {\n                        yield* it\n                    } else {\n                        for (const report of it) {\n                            report.path = report.path.filter(exceptDefault)\n                            if (\n                                report.path.length >= 2 ||\n                                report.type !== READ\n                            ) {\n                                yield report\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Iterate the references for a given variable.\n     * @param {Variable} variable The variable to iterate that references.\n     * @param {string[]} path The current path.\n     * @param {object} traceMap The trace map.\n     * @param {boolean} shouldReport = The flag to report those references.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    *_iterateVariableReferences(variable, path, traceMap, shouldReport) {\n        if (this.variableStack.includes(variable)) {\n            return\n        }\n        this.variableStack.push(variable)\n        try {\n            for (const reference of variable.references) {\n                if (!reference.isRead()) {\n                    continue\n                }\n                const node = reference.identifier\n\n                if (shouldReport && traceMap[READ]) {\n                    yield { node, path, type: READ, info: traceMap[READ] }\n                }\n                yield* this._iteratePropertyReferences(node, path, traceMap)\n            }\n        } finally {\n            this.variableStack.pop()\n        }\n    }\n\n    /**\n     * Iterate the references for a given AST node.\n     * @param rootNode The AST node to iterate references.\n     * @param {string[]} path The current path.\n     * @param {object} traceMap The trace map.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    //eslint-disable-next-line complexity\n    *_iteratePropertyReferences(rootNode, path, traceMap) {\n        let node = rootNode\n        while (isPassThrough(node)) {\n            node = node.parent\n        }\n\n        const parent = node.parent\n        if (parent.type === \"MemberExpression\") {\n            if (parent.object === node) {\n                const key = getPropertyName(parent)\n                if (key == null || !has(traceMap, key)) {\n                    return\n                }\n\n                path = path.concat(key) //eslint-disable-line no-param-reassign\n                const nextTraceMap = traceMap[key]\n                if (nextTraceMap[READ]) {\n                    yield {\n                        node: parent,\n                        path,\n                        type: READ,\n                        info: nextTraceMap[READ],\n                    }\n                }\n                yield* this._iteratePropertyReferences(\n                    parent,\n                    path,\n                    nextTraceMap\n                )\n            }\n            return\n        }\n        if (parent.type === \"CallExpression\") {\n            if (parent.callee === node && traceMap[CALL]) {\n                yield { node: parent, path, type: CALL, info: traceMap[CALL] }\n            }\n            return\n        }\n        if (parent.type === \"NewExpression\") {\n            if (parent.callee === node && traceMap[CONSTRUCT]) {\n                yield {\n                    node: parent,\n                    path,\n                    type: CONSTRUCT,\n                    info: traceMap[CONSTRUCT],\n                }\n            }\n            return\n        }\n        if (parent.type === \"AssignmentExpression\") {\n            if (parent.right === node) {\n                yield* this._iterateLhsReferences(parent.left, path, traceMap)\n                yield* this._iteratePropertyReferences(parent, path, traceMap)\n            }\n            return\n        }\n        if (parent.type === \"AssignmentPattern\") {\n            if (parent.right === node) {\n                yield* this._iterateLhsReferences(parent.left, path, traceMap)\n            }\n            return\n        }\n        if (parent.type === \"VariableDeclarator\") {\n            if (parent.init === node) {\n                yield* this._iterateLhsReferences(parent.id, path, traceMap)\n            }\n        }\n    }\n\n    /**\n     * Iterate the references for a given Pattern node.\n     * @param {Node} patternNode The Pattern node to iterate references.\n     * @param {string[]} path The current path.\n     * @param {object} traceMap The trace map.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    *_iterateLhsReferences(patternNode, path, traceMap) {\n        if (patternNode.type === \"Identifier\") {\n            const variable = findVariable(this.globalScope, patternNode)\n            if (variable != null) {\n                yield* this._iterateVariableReferences(\n                    variable,\n                    path,\n                    traceMap,\n                    false\n                )\n            }\n            return\n        }\n        if (patternNode.type === \"ObjectPattern\") {\n            for (const property of patternNode.properties) {\n                const key = getPropertyName(property)\n\n                if (key == null || !has(traceMap, key)) {\n                    continue\n                }\n\n                const nextPath = path.concat(key)\n                const nextTraceMap = traceMap[key]\n                if (nextTraceMap[READ]) {\n                    yield {\n                        node: property,\n                        path: nextPath,\n                        type: READ,\n                        info: nextTraceMap[READ],\n                    }\n                }\n                yield* this._iterateLhsReferences(\n                    property.value,\n                    nextPath,\n                    nextTraceMap\n                )\n            }\n            return\n        }\n        if (patternNode.type === \"AssignmentPattern\") {\n            yield* this._iterateLhsReferences(patternNode.left, path, traceMap)\n        }\n    }\n\n    /**\n     * Iterate the references for a given ModuleSpecifier node.\n     * @param {Node} specifierNode The ModuleSpecifier node to iterate references.\n     * @param {string[]} path The current path.\n     * @param {object} traceMap The trace map.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    *_iterateImportReferences(specifierNode, path, traceMap) {\n        const type = specifierNode.type\n\n        if (type === \"ImportSpecifier\" || type === \"ImportDefaultSpecifier\") {\n            const key =\n                type === \"ImportDefaultSpecifier\"\n                    ? \"default\"\n                    : specifierNode.imported.name\n            if (!has(traceMap, key)) {\n                return\n            }\n\n            path = path.concat(key) //eslint-disable-line no-param-reassign\n            const nextTraceMap = traceMap[key]\n            if (nextTraceMap[READ]) {\n                yield {\n                    node: specifierNode,\n                    path,\n                    type: READ,\n                    info: nextTraceMap[READ],\n                }\n            }\n            yield* this._iterateVariableReferences(\n                findVariable(this.globalScope, specifierNode.local),\n                path,\n                nextTraceMap,\n                false\n            )\n\n            return\n        }\n\n        if (type === \"ImportNamespaceSpecifier\") {\n            yield* this._iterateVariableReferences(\n                findVariable(this.globalScope, specifierNode.local),\n                path,\n                traceMap,\n                false\n            )\n            return\n        }\n\n        if (type === \"ExportSpecifier\") {\n            const key = specifierNode.local.name\n            if (!has(traceMap, key)) {\n                return\n            }\n\n            path = path.concat(key) //eslint-disable-line no-param-reassign\n            const nextTraceMap = traceMap[key]\n            if (nextTraceMap[READ]) {\n                yield {\n                    node: specifierNode,\n                    path,\n                    type: READ,\n                    info: nextTraceMap[READ],\n                }\n            }\n        }\n    }\n}\n\nReferenceTracker.READ = READ\nReferenceTracker.CALL = CALL\nReferenceTracker.CONSTRUCT = CONSTRUCT\nReferenceTracker.ESM = ESM\n\n/**\n * This is a predicate function for Array#filter.\n * @param {string} name A name part.\n * @param {number} index The index of the name.\n * @returns {boolean} `false` if it's default.\n */\nfunction exceptDefault(name, index) {\n    return !(index === 1 && name === \"default\")\n}\n","import { findVariable } from \"./find-variable\"\nimport { getFunctionHeadLocation } from \"./get-function-head-location\"\nimport { getFunctionNameWithKind } from \"./get-function-name-with-kind\"\nimport { getInnermostScope } from \"./get-innermost-scope\"\nimport { getPropertyName } from \"./get-property-name\"\nimport { getStaticValue } from \"./get-static-value\"\nimport { getStringIfConstant } from \"./get-string-if-constant\"\nimport { hasSideEffect } from \"./has-side-effect\"\nimport { isParenthesized } from \"./is-parenthesized\"\nimport { PatternMatcher } from \"./pattern-matcher\"\nimport {\n    CALL,\n    CONSTRUCT,\n    ESM,\n    READ,\n    ReferenceTracker,\n} from \"./reference-tracker\"\nimport {\n    isArrowToken,\n    isClosingBraceToken,\n    isClosingBracketToken,\n    isClosingParenToken,\n    isColonToken,\n    isCommaToken,\n    isCommentToken,\n    isNotArrowToken,\n    isNotClosingBraceToken,\n    isNotClosingBracketToken,\n    isNotClosingParenToken,\n    isNotColonToken,\n    isNotCommaToken,\n    isNotCommentToken,\n    isNotOpeningBraceToken,\n    isNotOpeningBracketToken,\n    isNotOpeningParenToken,\n    isNotSemicolonToken,\n    isOpeningBraceToken,\n    isOpeningBracketToken,\n    isOpeningParenToken,\n    isSemicolonToken,\n} from \"./token-predicate\"\n\nexport default {\n    CALL,\n    CONSTRUCT,\n    ESM,\n    findVariable,\n    getFunctionHeadLocation,\n    getFunctionNameWithKind,\n    getInnermostScope,\n    getPropertyName,\n    getStaticValue,\n    getStringIfConstant,\n    hasSideEffect,\n    isArrowToken,\n    isClosingBraceToken,\n    isClosingBracketToken,\n    isClosingParenToken,\n    isColonToken,\n    isCommaToken,\n    isCommentToken,\n    isNotArrowToken,\n    isNotClosingBraceToken,\n    isNotClosingBracketToken,\n    isNotClosingParenToken,\n    isNotColonToken,\n    isNotCommaToken,\n    isNotCommentToken,\n    isNotOpeningBraceToken,\n    isNotOpeningBracketToken,\n    isNotOpeningParenToken,\n    isNotSemicolonToken,\n    isOpeningBraceToken,\n    isOpeningBracketToken,\n    isOpeningParenToken,\n    isParenthesized,\n    isSemicolonToken,\n    PatternMatcher,\n    READ,\n    ReferenceTracker,\n}\nexport {\n    CALL,\n    CONSTRUCT,\n    ESM,\n    findVariable,\n    getFunctionHeadLocation,\n    getFunctionNameWithKind,\n    getInnermostScope,\n    getPropertyName,\n    getStaticValue,\n    getStringIfConstant,\n    hasSideEffect,\n    isArrowToken,\n    isClosingBraceToken,\n    isClosingBracketToken,\n    isClosingParenToken,\n    isColonToken,\n    isCommaToken,\n    isCommentToken,\n    isNotArrowToken,\n    isNotClosingBraceToken,\n    isNotClosingBracketToken,\n    isNotClosingParenToken,\n    isNotColonToken,\n    isNotCommaToken,\n    isNotCommentToken,\n    isNotOpeningBraceToken,\n    isNotOpeningBracketToken,\n    isNotOpeningParenToken,\n    isNotSemicolonToken,\n    isOpeningBraceToken,\n    isOpeningBracketToken,\n    isOpeningParenToken,\n    isParenthesized,\n    isSemicolonToken,\n    PatternMatcher,\n    READ,\n    ReferenceTracker,\n}\n"],"names":[],"mappings":";;;;;;;;;AAAA;;;;;;AAMA,AAAO,SAAS,iBAAiB,CAAC,YAAY,EAAE,IAAI,EAAE;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAC;;IAE9B,IAAI,KAAK,GAAG,aAAY;IACxB,IAAI,KAAK,GAAG,MAAK;IACjB,GAAG;QACC,KAAK,GAAG,MAAK;QACb,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE;YACxC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,MAAK;;YAEpC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE;gBAC7C,KAAK,GAAG,WAAU;gBAClB,KAAK,GAAG,KAAI;gBACZ,KAAK;aACR;SACJ;KACJ,QAAQ,KAAK,CAAC;;IAEf,OAAO,KAAK;CACf;;ACvBD;;;;;;AAMA,AAAO,SAAS,YAAY,CAAC,YAAY,EAAE,UAAU,EAAE;IACnD,IAAI,IAAI,GAAG,GAAE;IACb,IAAI,KAAK,GAAG,aAAY;;IAExB,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;QAChC,IAAI,GAAG,WAAU;KACpB,MAAM;QACH,IAAI,GAAG,UAAU,CAAC,KAAI;QACtB,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAC;KAC/C;;IAED,OAAO,KAAK,IAAI,IAAI,EAAE;QAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAC;QACpC,IAAI,QAAQ,IAAI,IAAI,EAAE;YAClB,OAAO,QAAQ;SAClB;QACD,KAAK,GAAG,KAAK,CAAC,MAAK;KACtB;;IAED,OAAO,IAAI;CACd;;AC5BD;;;;;AAKA,SAAS,OAAO,CAAC,KAAK,EAAE;IACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;CACtB;;;;;;;AAOD,SAAS,MAAM,CAAC,CAAC,EAAE;IACf,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;CACzB;;;;;;;AAOD,AAAO,SAAS,YAAY,CAAC,KAAK,EAAE;IAChC,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;CAC7D;;;;;;;AAOD,AAAO,SAAS,YAAY,CAAC,KAAK,EAAE;IAChC,OAAO,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;CAC5D;;;;;;;AAOD,AAAO,SAAS,gBAAgB,CAAC,KAAK,EAAE;IACpC,OAAO,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;CAC5D;;;;;;;AAOD,AAAO,SAAS,YAAY,CAAC,KAAK,EAAE;IAChC,OAAO,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;CAC5D;;;;;;;AAOD,AAAO,SAAS,mBAAmB,CAAC,KAAK,EAAE;IACvC,OAAO,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;CAC5D;;;;;;;AAOD,AAAO,SAAS,mBAAmB,CAAC,KAAK,EAAE;IACvC,OAAO,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;CAC5D;;;;;;;AAOD,AAAO,SAAS,qBAAqB,CAAC,KAAK,EAAE;IACzC,OAAO,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;CAC5D;;;;;;;AAOD,AAAO,SAAS,qBAAqB,CAAC,KAAK,EAAE;IACzC,OAAO,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;CAC5D;;;;;;;AAOD,AAAO,SAAS,mBAAmB,CAAC,KAAK,EAAE;IACvC,OAAO,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;CAC5D;;;;;;;AAOD,AAAO,SAAS,mBAAmB,CAAC,KAAK,EAAE;IACvC,OAAO,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;CAC5D;;;;;;;AAOD,AAAO,SAAS,cAAc,CAAC,KAAK,EAAE;IAClC;QACI,KAAK,CAAC,IAAI,KAAK,MAAM;QACrB,KAAK,CAAC,IAAI,KAAK,OAAO;QACtB,KAAK,CAAC,IAAI,KAAK,SAAS;KAC3B;CACJ;;AAED,AAAY,MAAC,eAAe,GAAG,MAAM,CAAC,YAAY,EAAC;AACnD,AAAY,MAAC,eAAe,GAAG,MAAM,CAAC,YAAY,EAAC;AACnD,AAAY,MAAC,mBAAmB,GAAG,MAAM,CAAC,gBAAgB,EAAC;AAC3D,AAAY,MAAC,eAAe,GAAG,MAAM,CAAC,YAAY,EAAC;AACnD,AAAY,MAAC,sBAAsB,GAAG,MAAM,CAAC,mBAAmB,EAAC;AACjE,AAAY,MAAC,sBAAsB,GAAG,MAAM,CAAC,mBAAmB,EAAC;AACjE,AAAY,MAAC,wBAAwB,GAAG,MAAM,CAAC,qBAAqB,EAAC;AACrE,AAAY,MAAC,wBAAwB,GAAG,MAAM,CAAC,qBAAqB,EAAC;AACrE,AAAY,MAAC,sBAAsB,GAAG,MAAM,CAAC,mBAAmB,EAAC;AACjE,AAAY,MAAC,sBAAsB,GAAG,MAAM,CAAC,mBAAmB,EAAC;AACjE,AAAY,MAAC,iBAAiB,GAAG,MAAM,CAAC,cAAc,CAAC;;ACjIvD;;;;;;AAMA,SAAS,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE;IAC/C,OAAO,IAAI,CAAC,EAAE;UACR,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,CAAC;UACtD,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,mBAAmB,CAAC;CAC5D;;;;;;;;AAQD,AAAO,SAAS,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAM;IAC1B,IAAI,KAAK,GAAG,KAAI;IAChB,IAAI,GAAG,GAAG,KAAI;;IAEd,IAAI,IAAI,CAAC,IAAI,KAAK,yBAAyB,EAAE;QACzC,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAC;;QAErE,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,MAAK;QAC5B,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,IAAG;KAC3B,MAAM;QACH,MAAM,CAAC,IAAI,KAAK,UAAU;QAC1B,MAAM,CAAC,IAAI,KAAK,kBAAkB;MACpC;QACE,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAK;QACxB,GAAG,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,MAAK;KAC5D,MAAM;QACH,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAK;QACtB,GAAG,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,MAAK;KAC5D;;IAED,OAAO;QACH,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC;QAC/B,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC;KAC9B;CACJ;;AC7CD;AACA,AAEA;AACA,MAAM,YAAY;IACd,OAAO,UAAU,KAAK,WAAW;UAC3B,UAAU;UACV,OAAO,IAAI,KAAK,WAAW;UAC3B,IAAI;UACJ,OAAO,MAAM,KAAK,WAAW;UAC7B,MAAM;UACN,OAAO,MAAM,KAAK,WAAW;UAC7B,MAAM;UACN,GAAE;;AAEZ,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM;IAC9B,IAAI,GAAG,CAAC;QACJ,OAAO;QACP,aAAa;QACb,QAAQ;QACR,eAAe;QACf,gBAAgB;QAChB,SAAS;QACT,UAAU;QACV,MAAM;QACN,WAAW;QACX,oBAAoB;QACpB,WAAW;QACX,oBAAoB;QACpB,QAAQ;QACR,cAAc;QACd,cAAc;QACd,UAAU;QACV,UAAU;QACV,YAAY;QACZ,YAAY;QACZ,WAAW;QACX,UAAU;QACV,OAAO;QACP,eAAe;QACf,MAAM;QACN,KAAK;QACL,MAAM;QACN,KAAK;QACL,QAAQ;QACR,QAAQ;QACR,YAAY;QACZ,UAAU;QACV,SAAS;QACT,OAAO;QACP,SAAS;QACT,QAAQ;QACR,KAAK;QACL,QAAQ;QACR,QAAQ;QACR,aAAa;QACb,aAAa;QACb,YAAY;QACZ,mBAAmB;QACnB,WAAW;QACX,UAAU;QACV,SAAS;QACT,SAAS;KACZ,CAAC;EACL;AACD,MAAM,WAAW,GAAG,IAAI,GAAG;IACvB;QACI,KAAK,CAAC,OAAO;QACb,OAAO,MAAM,KAAK,UAAU,GAAG,MAAM,GAAG,SAAS;QACjD,OAAO;QACP,IAAI;QACJ,IAAI,CAAC,KAAK;QACV,SAAS;QACT,kBAAkB;QAClB,SAAS;QACT,kBAAkB;QAClB,MAAM;QACN,QAAQ;QACR,KAAK;QACL,aAAa;QACb,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC;aAC9B,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;aACjB,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,UAAU,CAAC;QACzC,MAAM;QACN,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,KAAK;QACZ,MAAM,CAAC,UAAU;QACjB,MAAM,CAAC,QAAQ;QACf,MAAM;QACN,MAAM,CAAC,OAAO;QACd,MAAM,CAAC,EAAE;QACT,MAAM,CAAC,YAAY;QACnB,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,IAAI;QACX,MAAM,CAAC,MAAM;QACb,UAAU;QACV,QAAQ;QACR,MAAM;QACN,MAAM;QACN,MAAM,CAAC,YAAY;QACnB,MAAM,CAAC,aAAa;QACpB,MAAM,CAAC,GAAG;QACV,MAAM;QACN,MAAM,CAAC,GAAG;QACV,MAAM,CAAC,MAAM;QACb,QAAQ;KACX,CAAC,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,UAAU,CAAC;EACzC;AACD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC5B,MAAM,CAAC,MAAM;IACb,MAAM,CAAC,iBAAiB;IACxB,MAAM,CAAC,IAAI;CACd,EAAC;;;;;;;AAOF,SAAS,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAE;IACzC,IAAI,CAAC,GAAG,OAAM;IACd,OAAO,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,UAAU,KAAK,CAAC,KAAK,IAAI,EAAE;QACrE,MAAM,CAAC,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAAE,IAAI,EAAC;QAClD,IAAI,CAAC,EAAE;YACH,OAAO,CAAC;SACX;QACD,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,EAAC;KAC/B;IACD,OAAO,IAAI;CACd;;;;;;;AAOD,SAAS,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE;IAC5B,MAAM,CAAC,GAAG,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAC;IAC7C,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI;CACpC;;;;;;;;AAQD,SAAS,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE;IAC9C,MAAM,SAAS,GAAG,GAAE;;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,EAAC;;QAE/B,IAAI,WAAW,IAAI,IAAI,EAAE;YACrB,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,EAAC;SAC3B,MAAM,IAAI,WAAW,CAAC,IAAI,KAAK,eAAe,EAAE;YAC7C,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAC;YACpE,IAAI,QAAQ,IAAI,IAAI,EAAE;gBAClB,OAAO,IAAI;aACd;YACD,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAC;SACpC,MAAM;YACH,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,EAAE,YAAY,EAAC;YAC1D,IAAI,OAAO,IAAI,IAAI,EAAE;gBACjB,OAAO,IAAI;aACd;YACD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAC;SAChC;KACJ;;IAED,OAAO,SAAS;CACnB;;AAED,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE;QAChC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAC;QAC9D,OAAO,QAAQ,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;KACvD;;IAED,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE;QACrC,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,EAAE;YACvB,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;SACnD;QACD,OAAO,IAAI;KACd;;;IAGD,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE;QACjC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,EAAE;;YAE1D,OAAO,IAAI;SACd;;QAED,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAC;QACrD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAC;QACvD,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;YAC/B,QAAQ,IAAI,CAAC,QAAQ;gBACjB,KAAK,IAAI;oBACL,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;gBAC/C,KAAK,IAAI;oBACL,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;gBAC/C,KAAK,KAAK;oBACN,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE;gBAChD,KAAK,KAAK;oBACN,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE;gBAChD,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE;gBAC9C,KAAK,IAAI;oBACL,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;gBAC/C,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE;gBAC9C,KAAK,IAAI;oBACL,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;gBAC/C,KAAK,IAAI;oBACL,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;gBAC/C,KAAK,IAAI;oBACL,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;gBAC/C,KAAK,KAAK;oBACN,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE;gBAChD,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE;gBAC9C,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE;gBAC9C,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE;gBAC9C,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE;gBAC9C,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE;gBAC9C,KAAK,IAAI;oBACL,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;gBACvD,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE;gBAC9C,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE;gBAC9C,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE;;;aAGjD;SACJ;;QAED,OAAO,IAAI;KACd;;IAED,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAM;QAC9B,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAC;;QAE3D,IAAI,IAAI,IAAI,IAAI,EAAE;YACd,IAAI,UAAU,CAAC,IAAI,KAAK,kBAAkB,EAAE;gBACxC,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,EAAC;gBAC/D,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ;sBAC9B,eAAe,CAAC,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC;sBAClD,EAAE,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,GAAE;;gBAEzC,IAAI,MAAM,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,EAAE;oBACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAK;oBAC7B,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAK;oBACjC,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE;wBACvC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE;qBAClD;oBACD,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE;wBAC3C,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE;qBAC5B;iBACJ;aACJ,MAAM;gBACH,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,EAAE,YAAY,EAAC;gBACxD,IAAI,MAAM,IAAI,IAAI,EAAE;oBAChB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAK;oBACzB,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;wBACvB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;qBAClC;oBACD,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;wBAC3B,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE;qBAC5B;iBACJ;aACJ;SACJ;;QAED,OAAO,IAAI;KACd;;IAED,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE;QACtC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAC;QACrD,IAAI,IAAI,IAAI,IAAI,EAAE;YACd,OAAO,IAAI,CAAC,KAAK;kBACX,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;kBAC9C,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;SACtD;QACD,OAAO,IAAI;KACd;;IAED,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE;QACpC,OAAO,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;KACxD;;IAED,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE;QAC3B,IAAI,YAAY,IAAI,IAAI,EAAE;YACtB,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,IAAI,EAAC;;;YAGjD;gBACI,QAAQ,IAAI,IAAI;gBAChB,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBAC1B,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC/B,QAAQ,CAAC,IAAI,IAAI,YAAY;cAC/B;gBACE,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;aAChD;;;YAGD,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAC;gBAC5B;oBACI,GAAG,CAAC,MAAM;oBACV,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;;oBAE3B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY;kBACnC;oBACE,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;iBACtD;aACJ;SACJ;QACD,OAAO,IAAI;KACd;;IAED,OAAO,CAAC,IAAI,EAAE;;QAEV,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE;;YAEnE,OAAO,IAAI;SACd;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;KAC/B;;IAED,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE;QAClC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAC;QACrD,IAAI,IAAI,IAAI,IAAI,EAAE;YACd;gBACI,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI;iBACtD,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;cAC3D;gBACE,OAAO,IAAI;aACd;;YAED,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAC;YACvD,IAAI,KAAK,IAAI,IAAI,EAAE;gBACf,OAAO,KAAK;aACf;SACJ;;QAED,OAAO,IAAI;KACd;;IAED,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE;QACjC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;cACxB,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;cAC5C,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAE;;QAEnC;YACI,MAAM,IAAI,IAAI;YACd,QAAQ,IAAI,IAAI;YAChB,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;UACzC;YACE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;SACjD;QACD,OAAO,IAAI;KACd;;IAED,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE;QAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAC;QACzD,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAC;;QAE3D,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;YAChC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAK;YACzB,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACvB,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;aACtC;SACJ;;QAED,OAAO,IAAI;KACd;;IAED,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE;QACjC,MAAM,MAAM,GAAG,GAAE;;QAEjB,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE;YACxC,IAAI,YAAY,CAAC,IAAI,KAAK,UAAU,EAAE;gBAClC,IAAI,YAAY,CAAC,IAAI,KAAK,MAAM,EAAE;oBAC9B,OAAO,IAAI;iBACd;gBACD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ;sBAC3B,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC;sBAC/C,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,GAAE;gBACtC,MAAM,KAAK,GAAG,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,EAAC;gBAC/D,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;oBAC9B,OAAO,IAAI;iBACd;gBACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAK;aAClC,MAAM;gBACH,YAAY,CAAC,IAAI,KAAK,eAAe;gBACrC,YAAY,CAAC,IAAI,KAAK,4BAA4B;cACpD;gBACE,MAAM,QAAQ,GAAG,eAAe;oBAC5B,YAAY,CAAC,QAAQ;oBACrB,YAAY;kBACf;gBACD,IAAI,QAAQ,IAAI,IAAI,EAAE;oBAClB,OAAO,IAAI;iBACd;gBACD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAC;aACxC,MAAM;gBACH,OAAO,IAAI;aACd;SACJ;;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;KAC3B;;IAED,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAC;QAC1D,OAAO,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC;KAC7C;;IAED,wBAAwB,CAAC,IAAI,EAAE,YAAY,EAAE;QACzC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAC;QACnD,MAAM,WAAW,GAAG,gBAAgB;YAChC,IAAI,CAAC,KAAK,CAAC,WAAW;YACtB,YAAY;UACf;;QAED,IAAI,GAAG,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,EAAE;YACpC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAK;YACtB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,EAAC;YAC1D,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAC;;YAErD,IAAI,IAAI,KAAK,MAAM,CAAC,GAAG,EAAE;gBACrB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,EAAE;aAClD;SACJ;;QAED,OAAO,IAAI;KACd;;IAED,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE;QAChC,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAC;QACpE,IAAI,WAAW,IAAI,IAAI,EAAE;YACrB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAM;YACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBACzC,KAAK,IAAI,WAAW,CAAC,CAAC,EAAC;gBACvB,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,OAAM;aAC3C;YACD,OAAO,EAAE,KAAK,EAAE;SACnB;QACD,OAAO,IAAI;KACd;;IAED,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE;QAChC,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE;;YAE5B,OAAO,IAAI;SACd;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE;YAC1B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;SAC9B;;QAED,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAC;QACxD,IAAI,GAAG,IAAI,IAAI,EAAE;YACb,QAAQ,IAAI,CAAC,QAAQ;gBACjB,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE;gBAChC,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE;gBAChC,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE;gBAChC,KAAK,GAAG;oBACJ,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE;gBAChC,KAAK,QAAQ;oBACT,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,EAAE;;;aAGzC;SACJ;;QAED,OAAO,IAAI;KACd;CACJ,EAAC;;;;;;;;AAQF,SAAS,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE;IACzC,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;QACnE,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC;KACnD;IACD,OAAO,IAAI;CACd;;;;;;;;AAQD,AAAO,SAAS,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE;IACtD,IAAI;QACA,OAAO,eAAe,CAAC,IAAI,EAAE,YAAY,CAAC;KAC7C,CAAC,OAAO,MAAM,EAAE;QACb,OAAO,IAAI;KACd;CACJ;;AClgBD;;;;;;AAMA,AAAO,SAAS,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE;;IAE3D,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;QACxD,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACtD;QACD,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,OAAO,IAAI,CAAC,MAAM;SACrB;KACJ;;IAED,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,YAAY,EAAC;IACpD,OAAO,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;CAC9C;;ACnBD;;;;;;AAMA,AAAO,SAAS,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE;IAChD,QAAQ,IAAI,CAAC,IAAI;QACb,KAAK,kBAAkB;YACnB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACf,OAAO,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;aAC1D;YACD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI;;QAE7B,KAAK,UAAU,CAAC;QAChB,KAAK,kBAAkB;YACnB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACf,OAAO,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC;aACrD;YACD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE;gBAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;aAChC;YACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI;;;KAG3B;;IAED,OAAO,IAAI;CACd;;AC5BD;;;;;AAKA,AAAO,SAAS,uBAAuB,CAAC,IAAI,EAAE;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAM;IAC1B,MAAM,MAAM,GAAG,GAAE;;IAEjB,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE;QACrD,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAC;KACxB;IACD,IAAI,IAAI,CAAC,KAAK,EAAE;QACZ,MAAM,CAAC,IAAI,CAAC,OAAO,EAAC;KACvB;IACD,IAAI,IAAI,CAAC,SAAS,EAAE;QAChB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAC;KAC3B;;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,yBAAyB,EAAE;QACzC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAC;KACnC,MAAM;QACH,MAAM,CAAC,IAAI,KAAK,UAAU;QAC1B,MAAM,CAAC,IAAI,KAAK,kBAAkB;MACpC;QACE,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE;YAC/B,OAAO,aAAa;SACvB;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE;YACvB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAC;SACxB,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE;YAC9B,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAC;SACxB,MAAM;YACH,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAC;SACxB;KACJ,MAAM;QACH,MAAM,CAAC,IAAI,CAAC,UAAU,EAAC;KAC1B;;IAED,IAAI,IAAI,CAAC,EAAE,EAAE;QACT,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC;KACnC,MAAM;QACH,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAC;;QAEpC,IAAI,IAAI,EAAE;YACN,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAC;SAC3B;KACJ;;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;CAC1B;;AClDD,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM;IACzC,IAAI,GAAG,CAAC;QACJ,IAAI;QACJ,IAAI;QACJ,GAAG;QACH,IAAI;QACJ,GAAG;QACH,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,KAAK;QACL,GAAG;QACH,GAAG;QACH,GAAG;QACH,GAAG;QACH,GAAG;QACH,GAAG;QACH,GAAG;QACH,GAAG;QACH,IAAI;KACP,CAAC;EACL;AACD,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAC;AAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM;IACzB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC/B,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;YAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,KAAI;;YAErB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE;gBAClC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;aAChD;;YAED,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;SACzD;;QAED,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;YACvC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAI;;YAErB,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAC;;gBAEvB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBACtB,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE;wBACzB;4BACI,OAAO;4BACP,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC;0BAC5C;4BACE,OAAO,IAAI;yBACd;qBACJ;iBACJ,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE;oBAC1D,OAAO,IAAI;iBACd;aACJ;;YAED,OAAO,KAAK;SACf;;QAED,uBAAuB,GAAG;YACtB,OAAO,KAAK;SACf;QACD,oBAAoB,GAAG;YACnB,OAAO,IAAI;SACd;QACD,eAAe,GAAG;YACd,OAAO,IAAI;SACd;QACD,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;YACzC;gBACI,OAAO,CAAC,8BAA8B;gBACtC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;iBACzC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;cACjE;gBACE,OAAO,IAAI;aACd;YACD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;SACzD;QACD,cAAc,GAAG;YACb,OAAO,IAAI;SACd;QACD,kBAAkB,GAAG;YACjB,OAAO,KAAK;SACf;QACD,gBAAgB,GAAG;YACf,OAAO,IAAI;SACd;QACD,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;YACzC,IAAI,OAAO,CAAC,eAAe,EAAE;gBACzB,OAAO,IAAI;aACd;YACD;gBACI,OAAO,CAAC,8BAA8B;gBACtC,IAAI,CAAC,QAAQ;gBACb,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS;cAClC;gBACE,OAAO,IAAI;aACd;YACD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;SACzD;QACD,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;YACzC;gBACI,OAAO,CAAC,8BAA8B;gBACtC,IAAI,CAAC,QAAQ;gBACb,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS;cAC7B;gBACE,OAAO,IAAI;aACd;YACD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;SACzD;QACD,aAAa,GAAG;YACZ,OAAO,IAAI;SACd;QACD,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;YACjC;gBACI,OAAO,CAAC,8BAA8B;gBACtC,IAAI,CAAC,QAAQ;gBACb,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS;cAC7B;gBACE,OAAO,IAAI;aACd;YACD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;SACzD;QACD,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE;YACxC,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE;gBAC5B,OAAO,IAAI;aACd;YACD;gBACI,OAAO,CAAC,8BAA8B;gBACtC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACzC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS;cAClC;gBACE,OAAO,IAAI;aACd;YACD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;SACzD;QACD,gBAAgB,GAAG;YACf,OAAO,IAAI;SACd;QACD,eAAe,GAAG;YACd,OAAO,IAAI;SACd;KACJ,CAAC;EACL;;;;;;;;;;;;AAYD,AAAO,SAAS,aAAa;IACzB,IAAI;IACJ,UAAU;IACV,EAAE,eAAe,GAAG,KAAK,EAAE,8BAA8B,GAAG,KAAK,EAAE,GAAG,EAAE;EAC1E;IACE,OAAO,OAAO,CAAC,MAAM;QACjB,IAAI;QACJ,EAAE,eAAe,EAAE,8BAA8B,EAAE;QACnD,UAAU,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI;KACrC;CACJ;;ACpKD;;;;;;;AAOA,SAAS,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAM;;IAE1B,QAAQ,MAAM,CAAC,IAAI;QACf,KAAK,gBAAgB,CAAC;QACtB,KAAK,eAAe;YAChB,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;gBAC/D,OAAO,UAAU,CAAC,aAAa;oBAC3B,MAAM,CAAC,MAAM;oBACb,mBAAmB;iBACtB;aACJ;YACD,OAAO,IAAI;;QAEf,KAAK,kBAAkB;YACnB,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;gBACtB,OAAO,UAAU,CAAC,aAAa;oBAC3B,MAAM,CAAC,IAAI;oBACX,mBAAmB;iBACtB;aACJ;YACD,OAAO,IAAI;;QAEf,KAAK,aAAa,CAAC;QACnB,KAAK,gBAAgB;YACjB,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;gBACtB,OAAO,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;aAC7C;YACD,OAAO,IAAI;;QAEf,KAAK,kBAAkB;YACnB,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE;gBACxB,OAAO,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;aAC7C;YACD,OAAO,IAAI;;QAEf,KAAK,iBAAiB;YAClB,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI,EAAE;gBAC9B,OAAO,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;aAC7C;YACD,OAAO,IAAI;;QAEf,KAAK,eAAe;YAChB,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE;gBACxB,OAAO,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;aAC7C;YACD,OAAO,IAAI;;QAEf;YACI,OAAO,IAAI;KAClB;CACJ;;;;;;;;;;;;;;;AAeD,AAAO,SAAS,eAAe;IAC3B,WAAW;IACX,gBAAgB;IAChB,kBAAkB;EACpB;IACE,IAAI,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAe;IAC5D,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;QACjC,KAAK,GAAG,WAAW,GAAG,EAAC;QACvB,IAAI,GAAG,iBAAgB;QACvB,UAAU,GAAG,mBAAkB;QAC/B,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE;YACf,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC;SAC/D;KACJ,MAAM;QACH,KAAK,GAAG,EAAC;QACT,IAAI,GAAG,YAAW;QAClB,UAAU,GAAG,iBAAgB;KAChC;;IAED,IAAI,IAAI,IAAI,IAAI,EAAE;QACd,OAAO,KAAK;KACf;;IAED,cAAc,GAAG,eAAe,GAAG,KAAI;IACvC,GAAG;QACC,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,cAAc,EAAC;QAC1D,eAAe,GAAG,UAAU,CAAC,aAAa,CAAC,eAAe,EAAC;KAC9D;QACG,cAAc,IAAI,IAAI;QACtB,eAAe,IAAI,IAAI;QACvB,mBAAmB,CAAC,cAAc,CAAC;QACnC,mBAAmB,CAAC,eAAe,CAAC;;QAEpC,cAAc,KAAK,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC;QACzD,EAAE,KAAK,GAAG,CAAC;KACd;;IAED,OAAO,KAAK,KAAK,CAAC;CACrB;;ACjHD;;;;;AAKA,MAAM,WAAW,GAAG,6BAA4B;;;AAGhD,MAAM,QAAQ,GAAG,IAAI,OAAO,GAAE;;;;;;;;AAQ9B,SAAS,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE;IAC3B,IAAI,OAAO,GAAG,MAAK;IACnB,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE;QAC/D,OAAO,GAAG,CAAC,QAAO;KACrB;IACD,OAAO,OAAO;CACjB;;;;;;;;;AASD,SAAS,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE;IACzC,MAAM,MAAM,GAAG,GAAE;IACjB,IAAI,KAAK,GAAG,EAAC;;;IAGb,IAAI,KAAK,GAAG,KAAI;;;;;;IAMhB,SAAS,QAAQ,CAAC,GAAG,EAAE;QACnB,QAAQ,GAAG;YACP,KAAK,IAAI;gBACL,OAAO,GAAG;YACd,KAAK,IAAI;gBACL,OAAO,KAAK,CAAC,CAAC,CAAC;YACnB,KAAK,IAAI;gBACL,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;YACpC,KAAK,IAAI;gBACL,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACnD,SAAS;gBACL,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAC;gBACtB,IAAI,CAAC,IAAI,KAAK,EAAE;oBACZ,OAAO,KAAK,CAAC,CAAC,CAAC;iBAClB;gBACD,OAAO,GAAG;aACb;SACJ;KACJ;;IAED,KAAK,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAChC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAC;QACvD,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAM;KACxC;IACD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAC;;IAE7B,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;CACzB;;;;;;;;;AASD,SAAS,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;IACrC,MAAM,MAAM,GAAG,GAAE;IACjB,IAAI,KAAK,GAAG,EAAC;;IAEb,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACtC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAC;QAChE,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAM;KACxC;IACD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAC;;IAE7B,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;CACzB;;;;;AAKD,AAAO,MAAM,cAAc,CAAC;;;;;;IAMxB,WAAW,CAAC,OAAO,EAAE,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3C,IAAI,EAAE,OAAO,YAAY,MAAM,CAAC,EAAE;YAC9B,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC;SAChE;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC9B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC;SACzD;;QAED,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE;YACf,OAAO,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC;YAClD,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;SAC5B,EAAC;KACL;;;;;;;IAOD,CAAC,OAAO,CAAC,GAAG,EAAE;QACV,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAC;QAC/C,IAAI,KAAK,GAAG,KAAI;QAChB,IAAI,SAAS,GAAG,EAAC;;QAEjB,OAAO,CAAC,SAAS,GAAG,EAAC;QACrB,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YACxC,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;gBACzC,SAAS,GAAG,OAAO,CAAC,UAAS;gBAC7B,MAAM,MAAK;gBACX,OAAO,CAAC,SAAS,GAAG,UAAS;aAChC;SACJ;KACJ;;;;;;;IAOD,IAAI,CAAC,GAAG,EAAE;QACN,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAC;QAC5B,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,GAAE;QACrB,OAAO,CAAC,GAAG,CAAC,IAAI;KACnB;;;;;;;;IAQD,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE;QAC5B,OAAO,OAAO,QAAQ,KAAK,UAAU;cAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC;cACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;KACtD;CACJ;;AC1JD,MAAM,WAAW,GAAG,uDAAsD;AAC1E,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAC;;AAErD,AAAY,MAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAC;AAClC,AAAY,MAAC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAC;AAClC,AAAY,MAAC,SAAS,GAAG,MAAM,CAAC,WAAW,EAAC;AAC5C,AAAY,MAAC,GAAG,GAAG,MAAM,CAAC,KAAK,EAAC;;AAEhC,MAAM,WAAW,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,EAAE,GAAE;;;;;;;AAOjD,SAAS,gBAAgB,CAAC,QAAQ,EAAE;IAChC;QACI,QAAQ,IAAI,IAAI;QAChB,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAC1B,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;KAC7C;CACJ;;;;;;;;AAQD,SAAS,aAAa,CAAC,IAAI,EAAE;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAM;;IAE1B,QAAQ,MAAM,IAAI,MAAM,CAAC,IAAI;QACzB,KAAK,uBAAuB;YACxB,OAAO,MAAM,CAAC,UAAU,KAAK,IAAI,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI;QAClE,KAAK,mBAAmB;YACpB,OAAO,IAAI;QACf,KAAK,oBAAoB;YACrB,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;;QAErE;YACI,OAAO,KAAK;KACnB;CACJ;;;;;AAKD,AAAO,MAAM,gBAAgB,CAAC;;;;;;;;IAQ1B,WAAW;QACP,WAAW;QACX;YACI,IAAI,GAAG,QAAQ;YACf,iBAAiB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACnD,GAAG,EAAE;MACR;QACE,IAAI,CAAC,aAAa,GAAG,GAAE;QACvB,IAAI,CAAC,WAAW,GAAG,YAAW;QAC9B,IAAI,CAAC,IAAI,GAAG,KAAI;QAChB,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAC;KACtD;;;;;;;IAOD,CAAC,uBAAuB,CAAC,QAAQ,EAAE;QAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAC;YAClC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAC;YAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAC;;YAE9C,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE;gBAC5B,QAAQ;aACX;;YAED,OAAO,IAAI,CAAC,0BAA0B;gBAClC,QAAQ;gBACR,IAAI;gBACJ,YAAY;gBACZ,IAAI;cACP;SACJ;;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACtC,MAAM,IAAI,GAAG,GAAE;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAC;;YAE9C,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE;gBAC5B,QAAQ;aACX;;YAED,OAAO,IAAI,CAAC,0BAA0B;gBAClC,QAAQ;gBACR,IAAI;gBACJ,QAAQ;gBACR,KAAK;cACR;SACJ;KACJ;;;;;;;IAOD,CAAC,oBAAoB,CAAC,QAAQ,EAAE;QAC5B,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE;YAC9D,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAC;YAClD,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;gBACpC,QAAQ;aACX;;YAED,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAC;YAClC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAC;;YAElB,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;gBACpB,MAAM;oBACF,IAAI;oBACJ,IAAI;oBACJ,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;kBAC3B;aACJ;YACD,OAAO,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAC;SACnE;KACJ;;;;;;;IAOD,CAAC,oBAAoB,CAAC,QAAQ,EAAE;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAK;;QAE1C,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE;YACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;gBACrD,QAAQ;aACX;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAK;;YAElC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE;gBAC1B,QAAQ;aACX;YACD,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAC;YACvC,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAC;;YAEvB,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;gBACpB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAE;aAC7D;;YAED,IAAI,IAAI,CAAC,IAAI,KAAK,sBAAsB,EAAE;gBACtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;oBACzC,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,EAAC;oBACxC,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE;wBACtB,MAAM;4BACF,IAAI;4BACJ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;4BACtB,IAAI,EAAE,IAAI;4BACV,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;0BAC7B;qBACJ;iBACJ;aACJ,MAAM;gBACH,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;oBACrC,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,EAAC;oBAClC,MAAM,EAAE,GAAG,IAAI,CAAC,wBAAwB;wBACpC,SAAS;wBACT,IAAI;wBACJ,GAAG;8BACG,YAAY;8BACZ,IAAI,CAAC,IAAI,KAAK,QAAQ;8BACtB,MAAM,CAAC,MAAM;kCACT,EAAE,OAAO,EAAE,YAAY,EAAE;kCACzB,YAAY;+BACf;8BACD,EAAE,OAAO,EAAE,YAAY,EAAE;sBAClC;;oBAED,IAAI,GAAG,EAAE;wBACL,OAAO,GAAE;qBACZ,MAAM;wBACH,KAAK,MAAM,MAAM,IAAI,EAAE,EAAE;4BACrB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAC;4BAC/C;gCACI,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC;gCACvB,MAAM,CAAC,IAAI,KAAK,IAAI;8BACtB;gCACE,MAAM,OAAM;6BACf;yBACJ;qBACJ;iBACJ;aACJ;SACJ;KACJ;;;;;;;;;;IAUD,CAAC,0BAA0B,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE;QAChE,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YACvC,MAAM;SACT;QACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAC;QACjC,IAAI;YACA,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE;gBACzC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;oBACrB,QAAQ;iBACX;gBACD,MAAM,IAAI,GAAG,SAAS,CAAC,WAAU;;gBAEjC,IAAI,YAAY,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE;oBAChC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAE;iBACzD;gBACD,OAAO,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAC;aAC/D;SACJ,SAAS;YACN,IAAI,CAAC,aAAa,CAAC,GAAG,GAAE;SAC3B;KACJ;;;;;;;;;;IAUD,CAAC,0BAA0B,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;QAClD,IAAI,IAAI,GAAG,SAAQ;QACnB,OAAO,aAAa,CAAC,IAAI,CAAC,EAAE;YACxB,IAAI,GAAG,IAAI,CAAC,OAAM;SACrB;;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAM;QAC1B,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE;YACpC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE;gBACxB,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,EAAC;gBACnC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;oBACpC,MAAM;iBACT;;gBAED,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAC;gBACvB,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAC;gBAClC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;oBACpB,MAAM;wBACF,IAAI,EAAE,MAAM;wBACZ,IAAI;wBACJ,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;sBAC3B;iBACJ;gBACD,OAAO,IAAI,CAAC,0BAA0B;oBAClC,MAAM;oBACN,IAAI;oBACJ,YAAY;kBACf;aACJ;YACD,MAAM;SACT;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE;YAClC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE;gBAC1C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAE;aACjE;YACD,MAAM;SACT;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE;YACjC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE;gBAC/C,MAAM;oBACF,IAAI,EAAE,MAAM;oBACZ,IAAI;oBACJ,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC;kBAC5B;aACJ;YACD,MAAM;SACT;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB,EAAE;YACxC,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;gBACvB,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAC;gBAC9D,OAAO,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAC;aACjE;YACD,MAAM;SACT;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,mBAAmB,EAAE;YACrC,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;gBACvB,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAC;aACjE;YACD,MAAM;SACT;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,oBAAoB,EAAE;YACtC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;gBACtB,OAAO,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAC;aAC/D;SACJ;KACJ;;;;;;;;;IASD,CAAC,qBAAqB,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE;QAChD,IAAI,WAAW,CAAC,IAAI,KAAK,YAAY,EAAE;YACnC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAC;YAC5D,IAAI,QAAQ,IAAI,IAAI,EAAE;gBAClB,OAAO,IAAI,CAAC,0BAA0B;oBAClC,QAAQ;oBACR,IAAI;oBACJ,QAAQ;oBACR,KAAK;kBACR;aACJ;YACD,MAAM;SACT;QACD,IAAI,WAAW,CAAC,IAAI,KAAK,eAAe,EAAE;YACtC,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,UAAU,EAAE;gBAC3C,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,EAAC;;gBAErC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;oBACpC,QAAQ;iBACX;;gBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAC;gBACjC,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAC;gBAClC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;oBACpB,MAAM;wBACF,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;sBAC3B;iBACJ;gBACD,OAAO,IAAI,CAAC,qBAAqB;oBAC7B,QAAQ,CAAC,KAAK;oBACd,QAAQ;oBACR,YAAY;kBACf;aACJ;YACD,MAAM;SACT;QACD,IAAI,WAAW,CAAC,IAAI,KAAK,mBAAmB,EAAE;YAC1C,OAAO,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAC;SACtE;KACJ;;;;;;;;;IASD,CAAC,wBAAwB,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE;QACrD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAI;;QAE/B,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,wBAAwB,EAAE;YACjE,MAAM,GAAG;gBACL,IAAI,KAAK,wBAAwB;sBAC3B,SAAS;sBACT,aAAa,CAAC,QAAQ,CAAC,KAAI;YACrC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;gBACrB,MAAM;aACT;;YAED,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAC;YACvB,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAC;YAClC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;gBACpB,MAAM;oBACF,IAAI,EAAE,aAAa;oBACnB,IAAI;oBACJ,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;kBAC3B;aACJ;YACD,OAAO,IAAI,CAAC,0BAA0B;gBAClC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC;gBACnD,IAAI;gBACJ,YAAY;gBACZ,KAAK;cACR;;YAED,MAAM;SACT;;QAED,IAAI,IAAI,KAAK,0BAA0B,EAAE;YACrC,OAAO,IAAI,CAAC,0BAA0B;gBAClC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC;gBACnD,IAAI;gBACJ,QAAQ;gBACR,KAAK;cACR;YACD,MAAM;SACT;;QAED,IAAI,IAAI,KAAK,iBAAiB,EAAE;YAC5B,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,KAAI;YACpC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;gBACrB,MAAM;aACT;;YAED,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAC;YACvB,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAC;YAClC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;gBACpB,MAAM;oBACF,IAAI,EAAE,aAAa;oBACnB,IAAI;oBACJ,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC;kBAC3B;aACJ;SACJ;KACJ;CACJ;;AAED,gBAAgB,CAAC,IAAI,GAAG,KAAI;AAC5B,gBAAgB,CAAC,IAAI,GAAG,KAAI;AAC5B,gBAAgB,CAAC,SAAS,GAAG,UAAS;AACtC,gBAAgB,CAAC,GAAG,GAAG,IAAG;;;;;;;;AAQ1B,SAAS,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE;IAChC,OAAO,EAAE,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,SAAS,CAAC;CAC9C;;ACxZD,YAAe;IACX,IAAI;IACJ,SAAS;IACT,GAAG;IACH,YAAY;IACZ,uBAAuB;IACvB,uBAAuB;IACvB,iBAAiB;IACjB,eAAe;IACf,cAAc;IACd,mBAAmB;IACnB,aAAa;IACb,YAAY;IACZ,mBAAmB;IACnB,qBAAqB;IACrB,mBAAmB;IACnB,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,eAAe;IACf,sBAAsB;IACtB,wBAAwB;IACxB,sBAAsB;IACtB,eAAe;IACf,eAAe;IACf,iBAAiB;IACjB,sBAAsB;IACtB,wBAAwB;IACxB,sBAAsB;IACtB,mBAAmB;IACnB,mBAAmB;IACnB,qBAAqB;IACrB,mBAAmB;IACnB,eAAe;IACf,gBAAgB;IAChB,cAAc;IACd,IAAI;IACJ,gBAAgB;CACnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/index.mjs b/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/index.mjs
deleted file mode 100644
index 4b2a20e..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/index.mjs
+++ /dev/null
@@ -1,1785 +0,0 @@
-/*! @author Toru Nagashima <https://github.com/mysticatea> */
-import evk from 'eslint-visitor-keys';
-
-/**
- * Get the innermost scope which contains a given location.
- * @param {Scope} initialScope The initial scope to search.
- * @param {Node} node The location to search.
- * @returns {Scope} The innermost scope.
- */
-function getInnermostScope(initialScope, node) {
-    const location = node.range[0];
-
-    let scope = initialScope;
-    let found = false;
-    do {
-        found = false;
-        for (const childScope of scope.childScopes) {
-            const range = childScope.block.range;
-
-            if (range[0] <= location && location < range[1]) {
-                scope = childScope;
-                found = true;
-                break
-            }
-        }
-    } while (found)
-
-    return scope
-}
-
-/**
- * Find the variable of a given name.
- * @param {Scope} initialScope The scope to start finding.
- * @param {string|Node} nameOrNode The variable name to find. If this is a Node object then it should be an Identifier node.
- * @returns {Variable|null} The found variable or null.
- */
-function findVariable(initialScope, nameOrNode) {
-    let name = "";
-    let scope = initialScope;
-
-    if (typeof nameOrNode === "string") {
-        name = nameOrNode;
-    } else {
-        name = nameOrNode.name;
-        scope = getInnermostScope(scope, nameOrNode);
-    }
-
-    while (scope != null) {
-        const variable = scope.set.get(name);
-        if (variable != null) {
-            return variable
-        }
-        scope = scope.upper;
-    }
-
-    return null
-}
-
-/**
- * Negate the result of `this` calling.
- * @param {Token} token The token to check.
- * @returns {boolean} `true` if the result of `this(token)` is `false`.
- */
-function negate0(token) {
-    return !this(token) //eslint-disable-line no-invalid-this
-}
-
-/**
- * Creates the negate function of the given function.
- * @param {function(Token):boolean} f - The function to negate.
- * @returns {function(Token):boolean} Negated function.
- */
-function negate(f) {
-    return negate0.bind(f)
-}
-
-/**
- * Checks if the given token is an arrow token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is an arrow token.
- */
-function isArrowToken(token) {
-    return token.value === "=>" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a comma token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a comma token.
- */
-function isCommaToken(token) {
-    return token.value === "," && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a semicolon token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a semicolon token.
- */
-function isSemicolonToken(token) {
-    return token.value === ";" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a colon token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a colon token.
- */
-function isColonToken(token) {
-    return token.value === ":" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is an opening parenthesis token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is an opening parenthesis token.
- */
-function isOpeningParenToken(token) {
-    return token.value === "(" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a closing parenthesis token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a closing parenthesis token.
- */
-function isClosingParenToken(token) {
-    return token.value === ")" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is an opening square bracket token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is an opening square bracket token.
- */
-function isOpeningBracketToken(token) {
-    return token.value === "[" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a closing square bracket token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a closing square bracket token.
- */
-function isClosingBracketToken(token) {
-    return token.value === "]" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is an opening brace token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is an opening brace token.
- */
-function isOpeningBraceToken(token) {
-    return token.value === "{" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a closing brace token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a closing brace token.
- */
-function isClosingBraceToken(token) {
-    return token.value === "}" && token.type === "Punctuator"
-}
-
-/**
- * Checks if the given token is a comment token or not.
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a comment token.
- */
-function isCommentToken(token) {
-    return (
-        token.type === "Line" ||
-        token.type === "Block" ||
-        token.type === "Shebang"
-    )
-}
-
-const isNotArrowToken = negate(isArrowToken);
-const isNotCommaToken = negate(isCommaToken);
-const isNotSemicolonToken = negate(isSemicolonToken);
-const isNotColonToken = negate(isColonToken);
-const isNotOpeningParenToken = negate(isOpeningParenToken);
-const isNotClosingParenToken = negate(isClosingParenToken);
-const isNotOpeningBracketToken = negate(isOpeningBracketToken);
-const isNotClosingBracketToken = negate(isClosingBracketToken);
-const isNotOpeningBraceToken = negate(isOpeningBraceToken);
-const isNotClosingBraceToken = negate(isClosingBraceToken);
-const isNotCommentToken = negate(isCommentToken);
-
-/**
- * Get the `(` token of the given function node.
- * @param {Node} node - The function node to get.
- * @param {SourceCode} sourceCode - The source code object to get tokens.
- * @returns {Token} `(` token.
- */
-function getOpeningParenOfParams(node, sourceCode) {
-    return node.id
-        ? sourceCode.getTokenAfter(node.id, isOpeningParenToken)
-        : sourceCode.getFirstToken(node, isOpeningParenToken)
-}
-
-/**
- * Get the location of the given function node for reporting.
- * @param {Node} node - The function node to get.
- * @param {SourceCode} sourceCode - The source code object to get tokens.
- * @returns {string} The location of the function node for reporting.
- */
-function getFunctionHeadLocation(node, sourceCode) {
-    const parent = node.parent;
-    let start = null;
-    let end = null;
-
-    if (node.type === "ArrowFunctionExpression") {
-        const arrowToken = sourceCode.getTokenBefore(node.body, isArrowToken);
-
-        start = arrowToken.loc.start;
-        end = arrowToken.loc.end;
-    } else if (
-        parent.type === "Property" ||
-        parent.type === "MethodDefinition"
-    ) {
-        start = parent.loc.start;
-        end = getOpeningParenOfParams(node, sourceCode).loc.start;
-    } else {
-        start = node.loc.start;
-        end = getOpeningParenOfParams(node, sourceCode).loc.start;
-    }
-
-    return {
-        start: Object.assign({}, start),
-        end: Object.assign({}, end),
-    }
-}
-
-/* globals BigInt, globalThis, global, self, window */
-
-const globalObject =
-    typeof globalThis !== "undefined"
-        ? globalThis
-        : typeof self !== "undefined"
-        ? self
-        : typeof window !== "undefined"
-        ? window
-        : typeof global !== "undefined"
-        ? global
-        : {};
-
-const builtinNames = Object.freeze(
-    new Set([
-        "Array",
-        "ArrayBuffer",
-        "BigInt",
-        "BigInt64Array",
-        "BigUint64Array",
-        "Boolean",
-        "DataView",
-        "Date",
-        "decodeURI",
-        "decodeURIComponent",
-        "encodeURI",
-        "encodeURIComponent",
-        "escape",
-        "Float32Array",
-        "Float64Array",
-        "Function",
-        "Infinity",
-        "Int16Array",
-        "Int32Array",
-        "Int8Array",
-        "isFinite",
-        "isNaN",
-        "isPrototypeOf",
-        "JSON",
-        "Map",
-        "Math",
-        "NaN",
-        "Number",
-        "Object",
-        "parseFloat",
-        "parseInt",
-        "Promise",
-        "Proxy",
-        "Reflect",
-        "RegExp",
-        "Set",
-        "String",
-        "Symbol",
-        "Uint16Array",
-        "Uint32Array",
-        "Uint8Array",
-        "Uint8ClampedArray",
-        "undefined",
-        "unescape",
-        "WeakMap",
-        "WeakSet",
-    ])
-);
-const callAllowed = new Set(
-    [
-        Array.isArray,
-        typeof BigInt === "function" ? BigInt : undefined,
-        Boolean,
-        Date,
-        Date.parse,
-        decodeURI,
-        decodeURIComponent,
-        encodeURI,
-        encodeURIComponent,
-        escape,
-        isFinite,
-        isNaN,
-        isPrototypeOf,
-        ...Object.getOwnPropertyNames(Math)
-            .map(k => Math[k])
-            .filter(f => typeof f === "function"),
-        Number,
-        Number.isFinite,
-        Number.isNaN,
-        Number.parseFloat,
-        Number.parseInt,
-        Object,
-        Object.entries,
-        Object.is,
-        Object.isExtensible,
-        Object.isFrozen,
-        Object.isSealed,
-        Object.keys,
-        Object.values,
-        parseFloat,
-        parseInt,
-        RegExp,
-        String,
-        String.fromCharCode,
-        String.fromCodePoint,
-        String.raw,
-        Symbol,
-        Symbol.for,
-        Symbol.keyFor,
-        unescape,
-    ].filter(f => typeof f === "function")
-);
-const callPassThrough = new Set([
-    Object.freeze,
-    Object.preventExtensions,
-    Object.seal,
-]);
-
-/**
- * Get the property descriptor.
- * @param {object} object The object to get.
- * @param {string|number|symbol} name The property name to get.
- */
-function getPropertyDescriptor(object, name) {
-    let x = object;
-    while ((typeof x === "object" || typeof x === "function") && x !== null) {
-        const d = Object.getOwnPropertyDescriptor(x, name);
-        if (d) {
-            return d
-        }
-        x = Object.getPrototypeOf(x);
-    }
-    return null
-}
-
-/**
- * Check if a property is getter or not.
- * @param {object} object The object to check.
- * @param {string|number|symbol} name The property name to check.
- */
-function isGetter(object, name) {
-    const d = getPropertyDescriptor(object, name);
-    return d != null && d.get != null
-}
-
-/**
- * Get the element values of a given node list.
- * @param {Node[]} nodeList The node list to get values.
- * @param {Scope|undefined} initialScope The initial scope to find variables.
- * @returns {any[]|null} The value list if all nodes are constant. Otherwise, null.
- */
-function getElementValues(nodeList, initialScope) {
-    const valueList = [];
-
-    for (let i = 0; i < nodeList.length; ++i) {
-        const elementNode = nodeList[i];
-
-        if (elementNode == null) {
-            valueList.length = i + 1;
-        } else if (elementNode.type === "SpreadElement") {
-            const argument = getStaticValueR(elementNode.argument, initialScope);
-            if (argument == null) {
-                return null
-            }
-            valueList.push(...argument.value);
-        } else {
-            const element = getStaticValueR(elementNode, initialScope);
-            if (element == null) {
-                return null
-            }
-            valueList.push(element.value);
-        }
-    }
-
-    return valueList
-}
-
-const operations = Object.freeze({
-    ArrayExpression(node, initialScope) {
-        const elements = getElementValues(node.elements, initialScope);
-        return elements != null ? { value: elements } : null
-    },
-
-    AssignmentExpression(node, initialScope) {
-        if (node.operator === "=") {
-            return getStaticValueR(node.right, initialScope)
-        }
-        return null
-    },
-
-    //eslint-disable-next-line complexity
-    BinaryExpression(node, initialScope) {
-        if (node.operator === "in" || node.operator === "instanceof") {
-            // Not supported.
-            return null
-        }
-
-        const left = getStaticValueR(node.left, initialScope);
-        const right = getStaticValueR(node.right, initialScope);
-        if (left != null && right != null) {
-            switch (node.operator) {
-                case "==":
-                    return { value: left.value == right.value } //eslint-disable-line eqeqeq
-                case "!=":
-                    return { value: left.value != right.value } //eslint-disable-line eqeqeq
-                case "===":
-                    return { value: left.value === right.value }
-                case "!==":
-                    return { value: left.value !== right.value }
-                case "<":
-                    return { value: left.value < right.value }
-                case "<=":
-                    return { value: left.value <= right.value }
-                case ">":
-                    return { value: left.value > right.value }
-                case ">=":
-                    return { value: left.value >= right.value }
-                case "<<":
-                    return { value: left.value << right.value }
-                case ">>":
-                    return { value: left.value >> right.value }
-                case ">>>":
-                    return { value: left.value >>> right.value }
-                case "+":
-                    return { value: left.value + right.value }
-                case "-":
-                    return { value: left.value - right.value }
-                case "*":
-                    return { value: left.value * right.value }
-                case "/":
-                    return { value: left.value / right.value }
-                case "%":
-                    return { value: left.value % right.value }
-                case "**":
-                    return { value: Math.pow(left.value, right.value) }
-                case "|":
-                    return { value: left.value | right.value }
-                case "^":
-                    return { value: left.value ^ right.value }
-                case "&":
-                    return { value: left.value & right.value }
-
-                // no default
-            }
-        }
-
-        return null
-    },
-
-    CallExpression(node, initialScope) {
-        const calleeNode = node.callee;
-        const args = getElementValues(node.arguments, initialScope);
-
-        if (args != null) {
-            if (calleeNode.type === "MemberExpression") {
-                const object = getStaticValueR(calleeNode.object, initialScope);
-                const property = calleeNode.computed
-                    ? getStaticValueR(calleeNode.property, initialScope)
-                    : { value: calleeNode.property.name };
-
-                if (object != null && property != null) {
-                    const receiver = object.value;
-                    const methodName = property.value;
-                    if (callAllowed.has(receiver[methodName])) {
-                        return { value: receiver[methodName](...args) }
-                    }
-                    if (callPassThrough.has(receiver[methodName])) {
-                        return { value: args[0] }
-                    }
-                }
-            } else {
-                const callee = getStaticValueR(calleeNode, initialScope);
-                if (callee != null) {
-                    const func = callee.value;
-                    if (callAllowed.has(func)) {
-                        return { value: func(...args) }
-                    }
-                    if (callPassThrough.has(func)) {
-                        return { value: args[0] }
-                    }
-                }
-            }
-        }
-
-        return null
-    },
-
-    ConditionalExpression(node, initialScope) {
-        const test = getStaticValueR(node.test, initialScope);
-        if (test != null) {
-            return test.value
-                ? getStaticValueR(node.consequent, initialScope)
-                : getStaticValueR(node.alternate, initialScope)
-        }
-        return null
-    },
-
-    ExpressionStatement(node, initialScope) {
-        return getStaticValueR(node.expression, initialScope)
-    },
-
-    Identifier(node, initialScope) {
-        if (initialScope != null) {
-            const variable = findVariable(initialScope, node);
-
-            // Built-in globals.
-            if (
-                variable != null &&
-                variable.defs.length === 0 &&
-                builtinNames.has(variable.name) &&
-                variable.name in globalObject
-            ) {
-                return { value: globalObject[variable.name] }
-            }
-
-            // Constants.
-            if (variable != null && variable.defs.length === 1) {
-                const def = variable.defs[0];
-                if (
-                    def.parent &&
-                    def.parent.kind === "const" &&
-                    // TODO(mysticatea): don't support destructuring here.
-                    def.node.id.type === "Identifier"
-                ) {
-                    return getStaticValueR(def.node.init, initialScope)
-                }
-            }
-        }
-        return null
-    },
-
-    Literal(node) {
-        //istanbul ignore if : this is implementation-specific behavior.
-        if ((node.regex != null || node.bigint != null) && node.value == null) {
-            // It was a RegExp/BigInt literal, but Node.js didn't support it.
-            return null
-        }
-        return { value: node.value }
-    },
-
-    LogicalExpression(node, initialScope) {
-        const left = getStaticValueR(node.left, initialScope);
-        if (left != null) {
-            if (
-                (node.operator === "||" && Boolean(left.value) === true) ||
-                (node.operator === "&&" && Boolean(left.value) === false)
-            ) {
-                return left
-            }
-
-            const right = getStaticValueR(node.right, initialScope);
-            if (right != null) {
-                return right
-            }
-        }
-
-        return null
-    },
-
-    MemberExpression(node, initialScope) {
-        const object = getStaticValueR(node.object, initialScope);
-        const property = node.computed
-            ? getStaticValueR(node.property, initialScope)
-            : { value: node.property.name };
-
-        if (
-            object != null &&
-            property != null &&
-            !isGetter(object.value, property.value)
-        ) {
-            return { value: object.value[property.value] }
-        }
-        return null
-    },
-
-    NewExpression(node, initialScope) {
-        const callee = getStaticValueR(node.callee, initialScope);
-        const args = getElementValues(node.arguments, initialScope);
-
-        if (callee != null && args != null) {
-            const Func = callee.value;
-            if (callAllowed.has(Func)) {
-                return { value: new Func(...args) }
-            }
-        }
-
-        return null
-    },
-
-    ObjectExpression(node, initialScope) {
-        const object = {};
-
-        for (const propertyNode of node.properties) {
-            if (propertyNode.type === "Property") {
-                if (propertyNode.kind !== "init") {
-                    return null
-                }
-                const key = propertyNode.computed
-                    ? getStaticValueR(propertyNode.key, initialScope)
-                    : { value: propertyNode.key.name };
-                const value = getStaticValueR(propertyNode.value, initialScope);
-                if (key == null || value == null) {
-                    return null
-                }
-                object[key.value] = value.value;
-            } else if (
-                propertyNode.type === "SpreadElement" ||
-                propertyNode.type === "ExperimentalSpreadProperty"
-            ) {
-                const argument = getStaticValueR(
-                    propertyNode.argument,
-                    initialScope
-                );
-                if (argument == null) {
-                    return null
-                }
-                Object.assign(object, argument.value);
-            } else {
-                return null
-            }
-        }
-
-        return { value: object }
-    },
-
-    SequenceExpression(node, initialScope) {
-        const last = node.expressions[node.expressions.length - 1];
-        return getStaticValueR(last, initialScope)
-    },
-
-    TaggedTemplateExpression(node, initialScope) {
-        const tag = getStaticValueR(node.tag, initialScope);
-        const expressions = getElementValues(
-            node.quasi.expressions,
-            initialScope
-        );
-
-        if (tag != null && expressions != null) {
-            const func = tag.value;
-            const strings = node.quasi.quasis.map(q => q.value.cooked);
-            strings.raw = node.quasi.quasis.map(q => q.value.raw);
-
-            if (func === String.raw) {
-                return { value: func(strings, ...expressions) }
-            }
-        }
-
-        return null
-    },
-
-    TemplateLiteral(node, initialScope) {
-        const expressions = getElementValues(node.expressions, initialScope);
-        if (expressions != null) {
-            let value = node.quasis[0].value.cooked;
-            for (let i = 0; i < expressions.length; ++i) {
-                value += expressions[i];
-                value += node.quasis[i + 1].value.cooked;
-            }
-            return { value }
-        }
-        return null
-    },
-
-    UnaryExpression(node, initialScope) {
-        if (node.operator === "delete") {
-            // Not supported.
-            return null
-        }
-        if (node.operator === "void") {
-            return { value: undefined }
-        }
-
-        const arg = getStaticValueR(node.argument, initialScope);
-        if (arg != null) {
-            switch (node.operator) {
-                case "-":
-                    return { value: -arg.value }
-                case "+":
-                    return { value: +arg.value } //eslint-disable-line no-implicit-coercion
-                case "!":
-                    return { value: !arg.value }
-                case "~":
-                    return { value: ~arg.value }
-                case "typeof":
-                    return { value: typeof arg.value }
-
-                // no default
-            }
-        }
-
-        return null
-    },
-});
-
-/**
- * Get the value of a given node if it's a static value.
- * @param {Node} node The node to get.
- * @param {Scope|undefined} initialScope The scope to start finding variable.
- * @returns {{value:any}|null} The static value of the node, or `null`.
- */
-function getStaticValueR(node, initialScope) {
-    if (node != null && Object.hasOwnProperty.call(operations, node.type)) {
-        return operations[node.type](node, initialScope)
-    }
-    return null
-}
-
-/**
- * Get the value of a given node if it's a static value.
- * @param {Node} node The node to get.
- * @param {Scope} [initialScope] The scope to start finding variable. Optional. If this scope was given, this tries to resolve identifier references which are in the given node as much as possible.
- * @returns {{value:any}|null} The static value of the node, or `null`.
- */
-function getStaticValue(node, initialScope = null) {
-    try {
-        return getStaticValueR(node, initialScope)
-    } catch (_error) {
-        return null
-    }
-}
-
-/**
- * Get the value of a given node if it's a literal or a template literal.
- * @param {Node} node The node to get.
- * @param {Scope} [initialScope] The scope to start finding variable. Optional. If the node is an Identifier node and this scope was given, this checks the variable of the identifier, and returns the value of it if the variable is a constant.
- * @returns {string|null} The value of the node, or `null`.
- */
-function getStringIfConstant(node, initialScope = null) {
-    // Handle the literals that the platform doesn't support natively.
-    if (node && node.type === "Literal" && node.value === null) {
-        if (node.regex) {
-            return `/${node.regex.pattern}/${node.regex.flags}`
-        }
-        if (node.bigint) {
-            return node.bigint
-        }
-    }
-
-    const evaluated = getStaticValue(node, initialScope);
-    return evaluated && String(evaluated.value)
-}
-
-/**
- * Get the property name from a MemberExpression node or a Property node.
- * @param {Node} node The node to get.
- * @param {Scope} [initialScope] The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.
- * @returns {string|null} The property name of the node.
- */
-function getPropertyName(node, initialScope) {
-    switch (node.type) {
-        case "MemberExpression":
-            if (node.computed) {
-                return getStringIfConstant(node.property, initialScope)
-            }
-            return node.property.name
-
-        case "Property":
-        case "MethodDefinition":
-            if (node.computed) {
-                return getStringIfConstant(node.key, initialScope)
-            }
-            if (node.key.type === "Literal") {
-                return String(node.key.value)
-            }
-            return node.key.name
-
-        // no default
-    }
-
-    return null
-}
-
-/**
- * Get the name and kind of the given function node.
- * @param {ASTNode} node - The function node to get.
- * @returns {string} The name and kind of the function node.
- */
-function getFunctionNameWithKind(node) {
-    const parent = node.parent;
-    const tokens = [];
-
-    if (parent.type === "MethodDefinition" && parent.static) {
-        tokens.push("static");
-    }
-    if (node.async) {
-        tokens.push("async");
-    }
-    if (node.generator) {
-        tokens.push("generator");
-    }
-
-    if (node.type === "ArrowFunctionExpression") {
-        tokens.push("arrow", "function");
-    } else if (
-        parent.type === "Property" ||
-        parent.type === "MethodDefinition"
-    ) {
-        if (parent.kind === "constructor") {
-            return "constructor"
-        }
-        if (parent.kind === "get") {
-            tokens.push("getter");
-        } else if (parent.kind === "set") {
-            tokens.push("setter");
-        } else {
-            tokens.push("method");
-        }
-    } else {
-        tokens.push("function");
-    }
-
-    if (node.id) {
-        tokens.push(`'${node.id.name}'`);
-    } else {
-        const name = getPropertyName(parent);
-
-        if (name) {
-            tokens.push(`'${name}'`);
-        }
-    }
-
-    return tokens.join(" ")
-}
-
-const typeConversionBinaryOps = Object.freeze(
-    new Set([
-        "==",
-        "!=",
-        "<",
-        "<=",
-        ">",
-        ">=",
-        "<<",
-        ">>",
-        ">>>",
-        "+",
-        "-",
-        "*",
-        "/",
-        "%",
-        "|",
-        "^",
-        "&",
-        "in",
-    ])
-);
-const typeConversionUnaryOps = Object.freeze(new Set(["-", "+", "!", "~"]));
-const visitor = Object.freeze(
-    Object.assign(Object.create(null), {
-        $visit(node, options, visitorKeys) {
-            const { type } = node;
-
-            if (typeof this[type] === "function") {
-                return this[type](node, options, visitorKeys)
-            }
-
-            return this.$visitChildren(node, options, visitorKeys)
-        },
-
-        $visitChildren(node, options, visitorKeys) {
-            const { type } = node;
-
-            for (const key of visitorKeys[type] || evk.getKeys(node)) {
-                const value = node[key];
-
-                if (Array.isArray(value)) {
-                    for (const element of value) {
-                        if (
-                            element &&
-                            this.$visit(element, options, visitorKeys)
-                        ) {
-                            return true
-                        }
-                    }
-                } else if (value && this.$visit(value, options, visitorKeys)) {
-                    return true
-                }
-            }
-
-            return false
-        },
-
-        ArrowFunctionExpression() {
-            return false
-        },
-        AssignmentExpression() {
-            return true
-        },
-        AwaitExpression() {
-            return true
-        },
-        BinaryExpression(node, options, visitorKeys) {
-            if (
-                options.considerImplicitTypeConversion &&
-                typeConversionBinaryOps.has(node.operator) &&
-                (node.left.type !== "Literal" || node.right.type !== "Literal")
-            ) {
-                return true
-            }
-            return this.$visitChildren(node, options, visitorKeys)
-        },
-        CallExpression() {
-            return true
-        },
-        FunctionExpression() {
-            return false
-        },
-        ImportExpression() {
-            return true
-        },
-        MemberExpression(node, options, visitorKeys) {
-            if (options.considerGetters) {
-                return true
-            }
-            if (
-                options.considerImplicitTypeConversion &&
-                node.computed &&
-                node.property.type !== "Literal"
-            ) {
-                return true
-            }
-            return this.$visitChildren(node, options, visitorKeys)
-        },
-        MethodDefinition(node, options, visitorKeys) {
-            if (
-                options.considerImplicitTypeConversion &&
-                node.computed &&
-                node.key.type !== "Literal"
-            ) {
-                return true
-            }
-            return this.$visitChildren(node, options, visitorKeys)
-        },
-        NewExpression() {
-            return true
-        },
-        Property(node, options, visitorKeys) {
-            if (
-                options.considerImplicitTypeConversion &&
-                node.computed &&
-                node.key.type !== "Literal"
-            ) {
-                return true
-            }
-            return this.$visitChildren(node, options, visitorKeys)
-        },
-        UnaryExpression(node, options, visitorKeys) {
-            if (node.operator === "delete") {
-                return true
-            }
-            if (
-                options.considerImplicitTypeConversion &&
-                typeConversionUnaryOps.has(node.operator) &&
-                node.argument.type !== "Literal"
-            ) {
-                return true
-            }
-            return this.$visitChildren(node, options, visitorKeys)
-        },
-        UpdateExpression() {
-            return true
-        },
-        YieldExpression() {
-            return true
-        },
-    })
-);
-
-/**
- * Check whether a given node has any side effect or not.
- * @param {Node} node The node to get.
- * @param {SourceCode} sourceCode The source code object.
- * @param {object} [options] The option object.
- * @param {boolean} [options.considerGetters=false] If `true` then it considers member accesses as the node which has side effects.
- * @param {boolean} [options.considerImplicitTypeConversion=false] If `true` then it considers implicit type conversion as the node which has side effects.
- * @param {object} [options.visitorKeys=evk.KEYS] The keys to traverse nodes. Use `context.getSourceCode().visitorKeys`.
- * @returns {boolean} `true` if the node has a certain side effect.
- */
-function hasSideEffect(
-    node,
-    sourceCode,
-    { considerGetters = false, considerImplicitTypeConversion = false } = {}
-) {
-    return visitor.$visit(
-        node,
-        { considerGetters, considerImplicitTypeConversion },
-        sourceCode.visitorKeys || evk.KEYS
-    )
-}
-
-/**
- * Get the left parenthesis of the parent node syntax if it exists.
- * E.g., `if (a) {}` then the `(`.
- * @param {Node} node The AST node to check.
- * @param {SourceCode} sourceCode The source code object to get tokens.
- * @returns {Token|null} The left parenthesis of the parent node syntax
- */
-function getParentSyntaxParen(node, sourceCode) {
-    const parent = node.parent;
-
-    switch (parent.type) {
-        case "CallExpression":
-        case "NewExpression":
-            if (parent.arguments.length === 1 && parent.arguments[0] === node) {
-                return sourceCode.getTokenAfter(
-                    parent.callee,
-                    isOpeningParenToken
-                )
-            }
-            return null
-
-        case "DoWhileStatement":
-            if (parent.test === node) {
-                return sourceCode.getTokenAfter(
-                    parent.body,
-                    isOpeningParenToken
-                )
-            }
-            return null
-
-        case "IfStatement":
-        case "WhileStatement":
-            if (parent.test === node) {
-                return sourceCode.getFirstToken(parent, 1)
-            }
-            return null
-
-        case "ImportExpression":
-            if (parent.source === node) {
-                return sourceCode.getFirstToken(parent, 1)
-            }
-            return null
-
-        case "SwitchStatement":
-            if (parent.discriminant === node) {
-                return sourceCode.getFirstToken(parent, 1)
-            }
-            return null
-
-        case "WithStatement":
-            if (parent.object === node) {
-                return sourceCode.getFirstToken(parent, 1)
-            }
-            return null
-
-        default:
-            return null
-    }
-}
-
-/**
- * Check whether a given node is parenthesized or not.
- * @param {number} times The number of parantheses.
- * @param {Node} node The AST node to check.
- * @param {SourceCode} sourceCode The source code object to get tokens.
- * @returns {boolean} `true` if the node is parenthesized the given times.
- */
-/**
- * Check whether a given node is parenthesized or not.
- * @param {Node} node The AST node to check.
- * @param {SourceCode} sourceCode The source code object to get tokens.
- * @returns {boolean} `true` if the node is parenthesized.
- */
-function isParenthesized(
-    timesOrNode,
-    nodeOrSourceCode,
-    optionalSourceCode
-) {
-    let times, node, sourceCode, maybeLeftParen, maybeRightParen;
-    if (typeof timesOrNode === "number") {
-        times = timesOrNode | 0;
-        node = nodeOrSourceCode;
-        sourceCode = optionalSourceCode;
-        if (!(times >= 1)) {
-            throw new TypeError("'times' should be a positive integer.")
-        }
-    } else {
-        times = 1;
-        node = timesOrNode;
-        sourceCode = nodeOrSourceCode;
-    }
-
-    if (node == null) {
-        return false
-    }
-
-    maybeLeftParen = maybeRightParen = node;
-    do {
-        maybeLeftParen = sourceCode.getTokenBefore(maybeLeftParen);
-        maybeRightParen = sourceCode.getTokenAfter(maybeRightParen);
-    } while (
-        maybeLeftParen != null &&
-        maybeRightParen != null &&
-        isOpeningParenToken(maybeLeftParen) &&
-        isClosingParenToken(maybeRightParen) &&
-        // Avoid false positive such as `if (a) {}`
-        maybeLeftParen !== getParentSyntaxParen(node, sourceCode) &&
-        --times > 0
-    )
-
-    return times === 0
-}
-
-/**
- * @author Toru Nagashima <https://github.com/mysticatea>
- * See LICENSE file in root directory for full license.
- */
-
-const placeholder = /\$(?:[$&`']|[1-9][0-9]?)/gu;
-
-/** @type {WeakMap<PatternMatcher, {pattern:RegExp,escaped:boolean}>} */
-const internal = new WeakMap();
-
-/**
- * Check whether a given character is escaped or not.
- * @param {string} str The string to check.
- * @param {number} index The location of the character to check.
- * @returns {boolean} `true` if the character is escaped.
- */
-function isEscaped(str, index) {
-    let escaped = false;
-    for (let i = index - 1; i >= 0 && str.charCodeAt(i) === 0x5c; --i) {
-        escaped = !escaped;
-    }
-    return escaped
-}
-
-/**
- * Replace a given string by a given matcher.
- * @param {PatternMatcher} matcher The pattern matcher.
- * @param {string} str The string to be replaced.
- * @param {string} replacement The new substring to replace each matched part.
- * @returns {string} The replaced string.
- */
-function replaceS(matcher, str, replacement) {
-    const chunks = [];
-    let index = 0;
-
-    /** @type {RegExpExecArray} */
-    let match = null;
-
-    /**
-     * @param {string} key The placeholder.
-     * @returns {string} The replaced string.
-     */
-    function replacer(key) {
-        switch (key) {
-            case "$$":
-                return "$"
-            case "$&":
-                return match[0]
-            case "$`":
-                return str.slice(0, match.index)
-            case "$'":
-                return str.slice(match.index + match[0].length)
-            default: {
-                const i = key.slice(1);
-                if (i in match) {
-                    return match[i]
-                }
-                return key
-            }
-        }
-    }
-
-    for (match of matcher.execAll(str)) {
-        chunks.push(str.slice(index, match.index));
-        chunks.push(replacement.replace(placeholder, replacer));
-        index = match.index + match[0].length;
-    }
-    chunks.push(str.slice(index));
-
-    return chunks.join("")
-}
-
-/**
- * Replace a given string by a given matcher.
- * @param {PatternMatcher} matcher The pattern matcher.
- * @param {string} str The string to be replaced.
- * @param {(...strs[])=>string} replace The function to replace each matched part.
- * @returns {string} The replaced string.
- */
-function replaceF(matcher, str, replace) {
-    const chunks = [];
-    let index = 0;
-
-    for (const match of matcher.execAll(str)) {
-        chunks.push(str.slice(index, match.index));
-        chunks.push(String(replace(...match, match.index, match.input)));
-        index = match.index + match[0].length;
-    }
-    chunks.push(str.slice(index));
-
-    return chunks.join("")
-}
-
-/**
- * The class to find patterns as considering escape sequences.
- */
-class PatternMatcher {
-    /**
-     * Initialize this matcher.
-     * @param {RegExp} pattern The pattern to match.
-     * @param {{escaped:boolean}} options The options.
-     */
-    constructor(pattern, { escaped = false } = {}) {
-        if (!(pattern instanceof RegExp)) {
-            throw new TypeError("'pattern' should be a RegExp instance.")
-        }
-        if (!pattern.flags.includes("g")) {
-            throw new Error("'pattern' should contains 'g' flag.")
-        }
-
-        internal.set(this, {
-            pattern: new RegExp(pattern.source, pattern.flags),
-            escaped: Boolean(escaped),
-        });
-    }
-
-    /**
-     * Find the pattern in a given string.
-     * @param {string} str The string to find.
-     * @returns {IterableIterator<RegExpExecArray>} The iterator which iterate the matched information.
-     */
-    *execAll(str) {
-        const { pattern, escaped } = internal.get(this);
-        let match = null;
-        let lastIndex = 0;
-
-        pattern.lastIndex = 0;
-        while ((match = pattern.exec(str)) != null) {
-            if (escaped || !isEscaped(str, match.index)) {
-                lastIndex = pattern.lastIndex;
-                yield match;
-                pattern.lastIndex = lastIndex;
-            }
-        }
-    }
-
-    /**
-     * Check whether the pattern is found in a given string.
-     * @param {string} str The string to check.
-     * @returns {boolean} `true` if the pattern was found in the string.
-     */
-    test(str) {
-        const it = this.execAll(str);
-        const ret = it.next();
-        return !ret.done
-    }
-
-    /**
-     * Replace a given string.
-     * @param {string} str The string to be replaced.
-     * @param {(string|((...strs:string[])=>string))} replacer The string or function to replace. This is the same as the 2nd argument of `String.prototype.replace`.
-     * @returns {string} The replaced string.
-     */
-    [Symbol.replace](str, replacer) {
-        return typeof replacer === "function"
-            ? replaceF(this, String(str), replacer)
-            : replaceS(this, String(str), String(replacer))
-    }
-}
-
-const IMPORT_TYPE = /^(?:Import|Export(?:All|Default|Named))Declaration$/u;
-const has = Function.call.bind(Object.hasOwnProperty);
-
-const READ = Symbol("read");
-const CALL = Symbol("call");
-const CONSTRUCT = Symbol("construct");
-const ESM = Symbol("esm");
-
-const requireCall = { require: { [CALL]: true } };
-
-/**
- * Check whether a given variable is modified or not.
- * @param {Variable} variable The variable to check.
- * @returns {boolean} `true` if the variable is modified.
- */
-function isModifiedGlobal(variable) {
-    return (
-        variable == null ||
-        variable.defs.length !== 0 ||
-        variable.references.some(r => r.isWrite())
-    )
-}
-
-/**
- * Check if the value of a given node is passed through to the parent syntax as-is.
- * For example, `a` and `b` in (`a || b` and `c ? a : b`) are passed through.
- * @param {Node} node A node to check.
- * @returns {boolean} `true` if the node is passed through.
- */
-function isPassThrough(node) {
-    const parent = node.parent;
-
-    switch (parent && parent.type) {
-        case "ConditionalExpression":
-            return parent.consequent === node || parent.alternate === node
-        case "LogicalExpression":
-            return true
-        case "SequenceExpression":
-            return parent.expressions[parent.expressions.length - 1] === node
-
-        default:
-            return false
-    }
-}
-
-/**
- * The reference tracker.
- */
-class ReferenceTracker {
-    /**
-     * Initialize this tracker.
-     * @param {Scope} globalScope The global scope.
-     * @param {object} [options] The options.
-     * @param {"legacy"|"strict"} [options.mode="strict"] The mode to determine the ImportDeclaration's behavior for CJS modules.
-     * @param {string[]} [options.globalObjectNames=["global","self","window"]] The variable names for Global Object.
-     */
-    constructor(
-        globalScope,
-        {
-            mode = "strict",
-            globalObjectNames = ["global", "self", "window"],
-        } = {}
-    ) {
-        this.variableStack = [];
-        this.globalScope = globalScope;
-        this.mode = mode;
-        this.globalObjectNames = globalObjectNames.slice(0);
-    }
-
-    /**
-     * Iterate the references of global variables.
-     * @param {object} traceMap The trace map.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    *iterateGlobalReferences(traceMap) {
-        for (const key of Object.keys(traceMap)) {
-            const nextTraceMap = traceMap[key];
-            const path = [key];
-            const variable = this.globalScope.set.get(key);
-
-            if (isModifiedGlobal(variable)) {
-                continue
-            }
-
-            yield* this._iterateVariableReferences(
-                variable,
-                path,
-                nextTraceMap,
-                true
-            );
-        }
-
-        for (const key of this.globalObjectNames) {
-            const path = [];
-            const variable = this.globalScope.set.get(key);
-
-            if (isModifiedGlobal(variable)) {
-                continue
-            }
-
-            yield* this._iterateVariableReferences(
-                variable,
-                path,
-                traceMap,
-                false
-            );
-        }
-    }
-
-    /**
-     * Iterate the references of CommonJS modules.
-     * @param {object} traceMap The trace map.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    *iterateCjsReferences(traceMap) {
-        for (const { node } of this.iterateGlobalReferences(requireCall)) {
-            const key = getStringIfConstant(node.arguments[0]);
-            if (key == null || !has(traceMap, key)) {
-                continue
-            }
-
-            const nextTraceMap = traceMap[key];
-            const path = [key];
-
-            if (nextTraceMap[READ]) {
-                yield {
-                    node,
-                    path,
-                    type: READ,
-                    info: nextTraceMap[READ],
-                };
-            }
-            yield* this._iteratePropertyReferences(node, path, nextTraceMap);
-        }
-    }
-
-    /**
-     * Iterate the references of ES modules.
-     * @param {object} traceMap The trace map.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    *iterateEsmReferences(traceMap) {
-        const programNode = this.globalScope.block;
-
-        for (const node of programNode.body) {
-            if (!IMPORT_TYPE.test(node.type) || node.source == null) {
-                continue
-            }
-            const moduleId = node.source.value;
-
-            if (!has(traceMap, moduleId)) {
-                continue
-            }
-            const nextTraceMap = traceMap[moduleId];
-            const path = [moduleId];
-
-            if (nextTraceMap[READ]) {
-                yield { node, path, type: READ, info: nextTraceMap[READ] };
-            }
-
-            if (node.type === "ExportAllDeclaration") {
-                for (const key of Object.keys(nextTraceMap)) {
-                    const exportTraceMap = nextTraceMap[key];
-                    if (exportTraceMap[READ]) {
-                        yield {
-                            node,
-                            path: path.concat(key),
-                            type: READ,
-                            info: exportTraceMap[READ],
-                        };
-                    }
-                }
-            } else {
-                for (const specifier of node.specifiers) {
-                    const esm = has(nextTraceMap, ESM);
-                    const it = this._iterateImportReferences(
-                        specifier,
-                        path,
-                        esm
-                            ? nextTraceMap
-                            : this.mode === "legacy"
-                            ? Object.assign(
-                                  { default: nextTraceMap },
-                                  nextTraceMap
-                              )
-                            : { default: nextTraceMap }
-                    );
-
-                    if (esm) {
-                        yield* it;
-                    } else {
-                        for (const report of it) {
-                            report.path = report.path.filter(exceptDefault);
-                            if (
-                                report.path.length >= 2 ||
-                                report.type !== READ
-                            ) {
-                                yield report;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Iterate the references for a given variable.
-     * @param {Variable} variable The variable to iterate that references.
-     * @param {string[]} path The current path.
-     * @param {object} traceMap The trace map.
-     * @param {boolean} shouldReport = The flag to report those references.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    *_iterateVariableReferences(variable, path, traceMap, shouldReport) {
-        if (this.variableStack.includes(variable)) {
-            return
-        }
-        this.variableStack.push(variable);
-        try {
-            for (const reference of variable.references) {
-                if (!reference.isRead()) {
-                    continue
-                }
-                const node = reference.identifier;
-
-                if (shouldReport && traceMap[READ]) {
-                    yield { node, path, type: READ, info: traceMap[READ] };
-                }
-                yield* this._iteratePropertyReferences(node, path, traceMap);
-            }
-        } finally {
-            this.variableStack.pop();
-        }
-    }
-
-    /**
-     * Iterate the references for a given AST node.
-     * @param rootNode The AST node to iterate references.
-     * @param {string[]} path The current path.
-     * @param {object} traceMap The trace map.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    //eslint-disable-next-line complexity
-    *_iteratePropertyReferences(rootNode, path, traceMap) {
-        let node = rootNode;
-        while (isPassThrough(node)) {
-            node = node.parent;
-        }
-
-        const parent = node.parent;
-        if (parent.type === "MemberExpression") {
-            if (parent.object === node) {
-                const key = getPropertyName(parent);
-                if (key == null || !has(traceMap, key)) {
-                    return
-                }
-
-                path = path.concat(key); //eslint-disable-line no-param-reassign
-                const nextTraceMap = traceMap[key];
-                if (nextTraceMap[READ]) {
-                    yield {
-                        node: parent,
-                        path,
-                        type: READ,
-                        info: nextTraceMap[READ],
-                    };
-                }
-                yield* this._iteratePropertyReferences(
-                    parent,
-                    path,
-                    nextTraceMap
-                );
-            }
-            return
-        }
-        if (parent.type === "CallExpression") {
-            if (parent.callee === node && traceMap[CALL]) {
-                yield { node: parent, path, type: CALL, info: traceMap[CALL] };
-            }
-            return
-        }
-        if (parent.type === "NewExpression") {
-            if (parent.callee === node && traceMap[CONSTRUCT]) {
-                yield {
-                    node: parent,
-                    path,
-                    type: CONSTRUCT,
-                    info: traceMap[CONSTRUCT],
-                };
-            }
-            return
-        }
-        if (parent.type === "AssignmentExpression") {
-            if (parent.right === node) {
-                yield* this._iterateLhsReferences(parent.left, path, traceMap);
-                yield* this._iteratePropertyReferences(parent, path, traceMap);
-            }
-            return
-        }
-        if (parent.type === "AssignmentPattern") {
-            if (parent.right === node) {
-                yield* this._iterateLhsReferences(parent.left, path, traceMap);
-            }
-            return
-        }
-        if (parent.type === "VariableDeclarator") {
-            if (parent.init === node) {
-                yield* this._iterateLhsReferences(parent.id, path, traceMap);
-            }
-        }
-    }
-
-    /**
-     * Iterate the references for a given Pattern node.
-     * @param {Node} patternNode The Pattern node to iterate references.
-     * @param {string[]} path The current path.
-     * @param {object} traceMap The trace map.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    *_iterateLhsReferences(patternNode, path, traceMap) {
-        if (patternNode.type === "Identifier") {
-            const variable = findVariable(this.globalScope, patternNode);
-            if (variable != null) {
-                yield* this._iterateVariableReferences(
-                    variable,
-                    path,
-                    traceMap,
-                    false
-                );
-            }
-            return
-        }
-        if (patternNode.type === "ObjectPattern") {
-            for (const property of patternNode.properties) {
-                const key = getPropertyName(property);
-
-                if (key == null || !has(traceMap, key)) {
-                    continue
-                }
-
-                const nextPath = path.concat(key);
-                const nextTraceMap = traceMap[key];
-                if (nextTraceMap[READ]) {
-                    yield {
-                        node: property,
-                        path: nextPath,
-                        type: READ,
-                        info: nextTraceMap[READ],
-                    };
-                }
-                yield* this._iterateLhsReferences(
-                    property.value,
-                    nextPath,
-                    nextTraceMap
-                );
-            }
-            return
-        }
-        if (patternNode.type === "AssignmentPattern") {
-            yield* this._iterateLhsReferences(patternNode.left, path, traceMap);
-        }
-    }
-
-    /**
-     * Iterate the references for a given ModuleSpecifier node.
-     * @param {Node} specifierNode The ModuleSpecifier node to iterate references.
-     * @param {string[]} path The current path.
-     * @param {object} traceMap The trace map.
-     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.
-     */
-    *_iterateImportReferences(specifierNode, path, traceMap) {
-        const type = specifierNode.type;
-
-        if (type === "ImportSpecifier" || type === "ImportDefaultSpecifier") {
-            const key =
-                type === "ImportDefaultSpecifier"
-                    ? "default"
-                    : specifierNode.imported.name;
-            if (!has(traceMap, key)) {
-                return
-            }
-
-            path = path.concat(key); //eslint-disable-line no-param-reassign
-            const nextTraceMap = traceMap[key];
-            if (nextTraceMap[READ]) {
-                yield {
-                    node: specifierNode,
-                    path,
-                    type: READ,
-                    info: nextTraceMap[READ],
-                };
-            }
-            yield* this._iterateVariableReferences(
-                findVariable(this.globalScope, specifierNode.local),
-                path,
-                nextTraceMap,
-                false
-            );
-
-            return
-        }
-
-        if (type === "ImportNamespaceSpecifier") {
-            yield* this._iterateVariableReferences(
-                findVariable(this.globalScope, specifierNode.local),
-                path,
-                traceMap,
-                false
-            );
-            return
-        }
-
-        if (type === "ExportSpecifier") {
-            const key = specifierNode.local.name;
-            if (!has(traceMap, key)) {
-                return
-            }
-
-            path = path.concat(key); //eslint-disable-line no-param-reassign
-            const nextTraceMap = traceMap[key];
-            if (nextTraceMap[READ]) {
-                yield {
-                    node: specifierNode,
-                    path,
-                    type: READ,
-                    info: nextTraceMap[READ],
-                };
-            }
-        }
-    }
-}
-
-ReferenceTracker.READ = READ;
-ReferenceTracker.CALL = CALL;
-ReferenceTracker.CONSTRUCT = CONSTRUCT;
-ReferenceTracker.ESM = ESM;
-
-/**
- * This is a predicate function for Array#filter.
- * @param {string} name A name part.
- * @param {number} index The index of the name.
- * @returns {boolean} `false` if it's default.
- */
-function exceptDefault(name, index) {
-    return !(index === 1 && name === "default")
-}
-
-var index = {
-    CALL,
-    CONSTRUCT,
-    ESM,
-    findVariable,
-    getFunctionHeadLocation,
-    getFunctionNameWithKind,
-    getInnermostScope,
-    getPropertyName,
-    getStaticValue,
-    getStringIfConstant,
-    hasSideEffect,
-    isArrowToken,
-    isClosingBraceToken,
-    isClosingBracketToken,
-    isClosingParenToken,
-    isColonToken,
-    isCommaToken,
-    isCommentToken,
-    isNotArrowToken,
-    isNotClosingBraceToken,
-    isNotClosingBracketToken,
-    isNotClosingParenToken,
-    isNotColonToken,
-    isNotCommaToken,
-    isNotCommentToken,
-    isNotOpeningBraceToken,
-    isNotOpeningBracketToken,
-    isNotOpeningParenToken,
-    isNotSemicolonToken,
-    isOpeningBraceToken,
-    isOpeningBracketToken,
-    isOpeningParenToken,
-    isParenthesized,
-    isSemicolonToken,
-    PatternMatcher,
-    READ,
-    ReferenceTracker,
-};
-
-export default index;
-export { CALL, CONSTRUCT, ESM, PatternMatcher, READ, ReferenceTracker, findVariable, getFunctionHeadLocation, getFunctionNameWithKind, getInnermostScope, getPropertyName, getStaticValue, getStringIfConstant, hasSideEffect, isArrowToken, isClosingBraceToken, isClosingBracketToken, isClosingParenToken, isColonToken, isCommaToken, isCommentToken, isNotArrowToken, isNotClosingBraceToken, isNotClosingBracketToken, isNotClosingParenToken, isNotColonToken, isNotCommaToken, isNotCommentToken, isNotOpeningBraceToken, isNotOpeningBracketToken, isNotOpeningParenToken, isNotSemicolonToken, isOpeningBraceToken, isOpeningBracketToken, isOpeningParenToken, isParenthesized, isSemicolonToken };
-//# sourceMappingURL=index.mjs.map
diff --git a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/index.mjs.map b/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/index.mjs.map
deleted file mode 100644
index 62ad50a..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/index.mjs.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.mjs","sources":["src/get-innermost-scope.js","src/find-variable.js","src/token-predicate.js","src/get-function-head-location.js","src/get-static-value.js","src/get-string-if-constant.js","src/get-property-name.js","src/get-function-name-with-kind.js","src/has-side-effect.js","src/is-parenthesized.js","src/pattern-matcher.js","src/reference-tracker.js","src/index.js"],"sourcesContent":["/**\n * Get the innermost scope which contains a given location.\n * @param {Scope} initialScope The initial scope to search.\n * @param {Node} node The location to search.\n * @returns {Scope} The innermost scope.\n */\nexport function getInnermostScope(initialScope, node) {\n    const location = node.range[0]\n\n    let scope = initialScope\n    let found = false\n    do {\n        found = false\n        for (const childScope of scope.childScopes) {\n            const range = childScope.block.range\n\n            if (range[0] <= location && location < range[1]) {\n                scope = childScope\n                found = true\n                break\n            }\n        }\n    } while (found)\n\n    return scope\n}\n","import { getInnermostScope } from \"./get-innermost-scope\"\n\n/**\n * Find the variable of a given name.\n * @param {Scope} initialScope The scope to start finding.\n * @param {string|Node} nameOrNode The variable name to find. If this is a Node object then it should be an Identifier node.\n * @returns {Variable|null} The found variable or null.\n */\nexport function findVariable(initialScope, nameOrNode) {\n    let name = \"\"\n    let scope = initialScope\n\n    if (typeof nameOrNode === \"string\") {\n        name = nameOrNode\n    } else {\n        name = nameOrNode.name\n        scope = getInnermostScope(scope, nameOrNode)\n    }\n\n    while (scope != null) {\n        const variable = scope.set.get(name)\n        if (variable != null) {\n            return variable\n        }\n        scope = scope.upper\n    }\n\n    return null\n}\n","/**\n * Negate the result of `this` calling.\n * @param {Token} token The token to check.\n * @returns {boolean} `true` if the result of `this(token)` is `false`.\n */\nfunction negate0(token) {\n    return !this(token) //eslint-disable-line no-invalid-this\n}\n\n/**\n * Creates the negate function of the given function.\n * @param {function(Token):boolean} f - The function to negate.\n * @returns {function(Token):boolean} Negated function.\n */\nfunction negate(f) {\n    return negate0.bind(f)\n}\n\n/**\n * Checks if the given token is an arrow token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is an arrow token.\n */\nexport function isArrowToken(token) {\n    return token.value === \"=>\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a comma token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a comma token.\n */\nexport function isCommaToken(token) {\n    return token.value === \",\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a semicolon token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a semicolon token.\n */\nexport function isSemicolonToken(token) {\n    return token.value === \";\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a colon token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a colon token.\n */\nexport function isColonToken(token) {\n    return token.value === \":\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is an opening parenthesis token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is an opening parenthesis token.\n */\nexport function isOpeningParenToken(token) {\n    return token.value === \"(\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a closing parenthesis token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a closing parenthesis token.\n */\nexport function isClosingParenToken(token) {\n    return token.value === \")\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is an opening square bracket token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is an opening square bracket token.\n */\nexport function isOpeningBracketToken(token) {\n    return token.value === \"[\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a closing square bracket token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a closing square bracket token.\n */\nexport function isClosingBracketToken(token) {\n    return token.value === \"]\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is an opening brace token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is an opening brace token.\n */\nexport function isOpeningBraceToken(token) {\n    return token.value === \"{\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a closing brace token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a closing brace token.\n */\nexport function isClosingBraceToken(token) {\n    return token.value === \"}\" && token.type === \"Punctuator\"\n}\n\n/**\n * Checks if the given token is a comment token or not.\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a comment token.\n */\nexport function isCommentToken(token) {\n    return (\n        token.type === \"Line\" ||\n        token.type === \"Block\" ||\n        token.type === \"Shebang\"\n    )\n}\n\nexport const isNotArrowToken = negate(isArrowToken)\nexport const isNotCommaToken = negate(isCommaToken)\nexport const isNotSemicolonToken = negate(isSemicolonToken)\nexport const isNotColonToken = negate(isColonToken)\nexport const isNotOpeningParenToken = negate(isOpeningParenToken)\nexport const isNotClosingParenToken = negate(isClosingParenToken)\nexport const isNotOpeningBracketToken = negate(isOpeningBracketToken)\nexport const isNotClosingBracketToken = negate(isClosingBracketToken)\nexport const isNotOpeningBraceToken = negate(isOpeningBraceToken)\nexport const isNotClosingBraceToken = negate(isClosingBraceToken)\nexport const isNotCommentToken = negate(isCommentToken)\n","import { isArrowToken, isOpeningParenToken } from \"./token-predicate\"\n\n/**\n * Get the `(` token of the given function node.\n * @param {Node} node - The function node to get.\n * @param {SourceCode} sourceCode - The source code object to get tokens.\n * @returns {Token} `(` token.\n */\nfunction getOpeningParenOfParams(node, sourceCode) {\n    return node.id\n        ? sourceCode.getTokenAfter(node.id, isOpeningParenToken)\n        : sourceCode.getFirstToken(node, isOpeningParenToken)\n}\n\n/**\n * Get the location of the given function node for reporting.\n * @param {Node} node - The function node to get.\n * @param {SourceCode} sourceCode - The source code object to get tokens.\n * @returns {string} The location of the function node for reporting.\n */\nexport function getFunctionHeadLocation(node, sourceCode) {\n    const parent = node.parent\n    let start = null\n    let end = null\n\n    if (node.type === \"ArrowFunctionExpression\") {\n        const arrowToken = sourceCode.getTokenBefore(node.body, isArrowToken)\n\n        start = arrowToken.loc.start\n        end = arrowToken.loc.end\n    } else if (\n        parent.type === \"Property\" ||\n        parent.type === \"MethodDefinition\"\n    ) {\n        start = parent.loc.start\n        end = getOpeningParenOfParams(node, sourceCode).loc.start\n    } else {\n        start = node.loc.start\n        end = getOpeningParenOfParams(node, sourceCode).loc.start\n    }\n\n    return {\n        start: Object.assign({}, start),\n        end: Object.assign({}, end),\n    }\n}\n","/* globals BigInt, globalThis, global, self, window */\n\nimport { findVariable } from \"./find-variable\"\n\nconst globalObject =\n    typeof globalThis !== \"undefined\"\n        ? globalThis\n        : typeof self !== \"undefined\"\n        ? self\n        : typeof window !== \"undefined\"\n        ? window\n        : typeof global !== \"undefined\"\n        ? global\n        : {}\n\nconst builtinNames = Object.freeze(\n    new Set([\n        \"Array\",\n        \"ArrayBuffer\",\n        \"BigInt\",\n        \"BigInt64Array\",\n        \"BigUint64Array\",\n        \"Boolean\",\n        \"DataView\",\n        \"Date\",\n        \"decodeURI\",\n        \"decodeURIComponent\",\n        \"encodeURI\",\n        \"encodeURIComponent\",\n        \"escape\",\n        \"Float32Array\",\n        \"Float64Array\",\n        \"Function\",\n        \"Infinity\",\n        \"Int16Array\",\n        \"Int32Array\",\n        \"Int8Array\",\n        \"isFinite\",\n        \"isNaN\",\n        \"isPrototypeOf\",\n        \"JSON\",\n        \"Map\",\n        \"Math\",\n        \"NaN\",\n        \"Number\",\n        \"Object\",\n        \"parseFloat\",\n        \"parseInt\",\n        \"Promise\",\n        \"Proxy\",\n        \"Reflect\",\n        \"RegExp\",\n        \"Set\",\n        \"String\",\n        \"Symbol\",\n        \"Uint16Array\",\n        \"Uint32Array\",\n        \"Uint8Array\",\n        \"Uint8ClampedArray\",\n        \"undefined\",\n        \"unescape\",\n        \"WeakMap\",\n        \"WeakSet\",\n    ])\n)\nconst callAllowed = new Set(\n    [\n        Array.isArray,\n        typeof BigInt === \"function\" ? BigInt : undefined,\n        Boolean,\n        Date,\n        Date.parse,\n        decodeURI,\n        decodeURIComponent,\n        encodeURI,\n        encodeURIComponent,\n        escape,\n        isFinite,\n        isNaN,\n        isPrototypeOf,\n        ...Object.getOwnPropertyNames(Math)\n            .map(k => Math[k])\n            .filter(f => typeof f === \"function\"),\n        Number,\n        Number.isFinite,\n        Number.isNaN,\n        Number.parseFloat,\n        Number.parseInt,\n        Object,\n        Object.entries,\n        Object.is,\n        Object.isExtensible,\n        Object.isFrozen,\n        Object.isSealed,\n        Object.keys,\n        Object.values,\n        parseFloat,\n        parseInt,\n        RegExp,\n        String,\n        String.fromCharCode,\n        String.fromCodePoint,\n        String.raw,\n        Symbol,\n        Symbol.for,\n        Symbol.keyFor,\n        unescape,\n    ].filter(f => typeof f === \"function\")\n)\nconst callPassThrough = new Set([\n    Object.freeze,\n    Object.preventExtensions,\n    Object.seal,\n])\n\n/**\n * Get the property descriptor.\n * @param {object} object The object to get.\n * @param {string|number|symbol} name The property name to get.\n */\nfunction getPropertyDescriptor(object, name) {\n    let x = object\n    while ((typeof x === \"object\" || typeof x === \"function\") && x !== null) {\n        const d = Object.getOwnPropertyDescriptor(x, name)\n        if (d) {\n            return d\n        }\n        x = Object.getPrototypeOf(x)\n    }\n    return null\n}\n\n/**\n * Check if a property is getter or not.\n * @param {object} object The object to check.\n * @param {string|number|symbol} name The property name to check.\n */\nfunction isGetter(object, name) {\n    const d = getPropertyDescriptor(object, name)\n    return d != null && d.get != null\n}\n\n/**\n * Get the element values of a given node list.\n * @param {Node[]} nodeList The node list to get values.\n * @param {Scope|undefined} initialScope The initial scope to find variables.\n * @returns {any[]|null} The value list if all nodes are constant. Otherwise, null.\n */\nfunction getElementValues(nodeList, initialScope) {\n    const valueList = []\n\n    for (let i = 0; i < nodeList.length; ++i) {\n        const elementNode = nodeList[i]\n\n        if (elementNode == null) {\n            valueList.length = i + 1\n        } else if (elementNode.type === \"SpreadElement\") {\n            const argument = getStaticValueR(elementNode.argument, initialScope)\n            if (argument == null) {\n                return null\n            }\n            valueList.push(...argument.value)\n        } else {\n            const element = getStaticValueR(elementNode, initialScope)\n            if (element == null) {\n                return null\n            }\n            valueList.push(element.value)\n        }\n    }\n\n    return valueList\n}\n\nconst operations = Object.freeze({\n    ArrayExpression(node, initialScope) {\n        const elements = getElementValues(node.elements, initialScope)\n        return elements != null ? { value: elements } : null\n    },\n\n    AssignmentExpression(node, initialScope) {\n        if (node.operator === \"=\") {\n            return getStaticValueR(node.right, initialScope)\n        }\n        return null\n    },\n\n    //eslint-disable-next-line complexity\n    BinaryExpression(node, initialScope) {\n        if (node.operator === \"in\" || node.operator === \"instanceof\") {\n            // Not supported.\n            return null\n        }\n\n        const left = getStaticValueR(node.left, initialScope)\n        const right = getStaticValueR(node.right, initialScope)\n        if (left != null && right != null) {\n            switch (node.operator) {\n                case \"==\":\n                    return { value: left.value == right.value } //eslint-disable-line eqeqeq\n                case \"!=\":\n                    return { value: left.value != right.value } //eslint-disable-line eqeqeq\n                case \"===\":\n                    return { value: left.value === right.value }\n                case \"!==\":\n                    return { value: left.value !== right.value }\n                case \"<\":\n                    return { value: left.value < right.value }\n                case \"<=\":\n                    return { value: left.value <= right.value }\n                case \">\":\n                    return { value: left.value > right.value }\n                case \">=\":\n                    return { value: left.value >= right.value }\n                case \"<<\":\n                    return { value: left.value << right.value }\n                case \">>\":\n                    return { value: left.value >> right.value }\n                case \">>>\":\n                    return { value: left.value >>> right.value }\n                case \"+\":\n                    return { value: left.value + right.value }\n                case \"-\":\n                    return { value: left.value - right.value }\n                case \"*\":\n                    return { value: left.value * right.value }\n                case \"/\":\n                    return { value: left.value / right.value }\n                case \"%\":\n                    return { value: left.value % right.value }\n                case \"**\":\n                    return { value: Math.pow(left.value, right.value) }\n                case \"|\":\n                    return { value: left.value | right.value }\n                case \"^\":\n                    return { value: left.value ^ right.value }\n                case \"&\":\n                    return { value: left.value & right.value }\n\n                // no default\n            }\n        }\n\n        return null\n    },\n\n    CallExpression(node, initialScope) {\n        const calleeNode = node.callee\n        const args = getElementValues(node.arguments, initialScope)\n\n        if (args != null) {\n            if (calleeNode.type === \"MemberExpression\") {\n                const object = getStaticValueR(calleeNode.object, initialScope)\n                const property = calleeNode.computed\n                    ? getStaticValueR(calleeNode.property, initialScope)\n                    : { value: calleeNode.property.name }\n\n                if (object != null && property != null) {\n                    const receiver = object.value\n                    const methodName = property.value\n                    if (callAllowed.has(receiver[methodName])) {\n                        return { value: receiver[methodName](...args) }\n                    }\n                    if (callPassThrough.has(receiver[methodName])) {\n                        return { value: args[0] }\n                    }\n                }\n            } else {\n                const callee = getStaticValueR(calleeNode, initialScope)\n                if (callee != null) {\n                    const func = callee.value\n                    if (callAllowed.has(func)) {\n                        return { value: func(...args) }\n                    }\n                    if (callPassThrough.has(func)) {\n                        return { value: args[0] }\n                    }\n                }\n            }\n        }\n\n        return null\n    },\n\n    ConditionalExpression(node, initialScope) {\n        const test = getStaticValueR(node.test, initialScope)\n        if (test != null) {\n            return test.value\n                ? getStaticValueR(node.consequent, initialScope)\n                : getStaticValueR(node.alternate, initialScope)\n        }\n        return null\n    },\n\n    ExpressionStatement(node, initialScope) {\n        return getStaticValueR(node.expression, initialScope)\n    },\n\n    Identifier(node, initialScope) {\n        if (initialScope != null) {\n            const variable = findVariable(initialScope, node)\n\n            // Built-in globals.\n            if (\n                variable != null &&\n                variable.defs.length === 0 &&\n                builtinNames.has(variable.name) &&\n                variable.name in globalObject\n            ) {\n                return { value: globalObject[variable.name] }\n            }\n\n            // Constants.\n            if (variable != null && variable.defs.length === 1) {\n                const def = variable.defs[0]\n                if (\n                    def.parent &&\n                    def.parent.kind === \"const\" &&\n                    // TODO(mysticatea): don't support destructuring here.\n                    def.node.id.type === \"Identifier\"\n                ) {\n                    return getStaticValueR(def.node.init, initialScope)\n                }\n            }\n        }\n        return null\n    },\n\n    Literal(node) {\n        //istanbul ignore if : this is implementation-specific behavior.\n        if ((node.regex != null || node.bigint != null) && node.value == null) {\n            // It was a RegExp/BigInt literal, but Node.js didn't support it.\n            return null\n        }\n        return { value: node.value }\n    },\n\n    LogicalExpression(node, initialScope) {\n        const left = getStaticValueR(node.left, initialScope)\n        if (left != null) {\n            if (\n                (node.operator === \"||\" && Boolean(left.value) === true) ||\n                (node.operator === \"&&\" && Boolean(left.value) === false)\n            ) {\n                return left\n            }\n\n            const right = getStaticValueR(node.right, initialScope)\n            if (right != null) {\n                return right\n            }\n        }\n\n        return null\n    },\n\n    MemberExpression(node, initialScope) {\n        const object = getStaticValueR(node.object, initialScope)\n        const property = node.computed\n            ? getStaticValueR(node.property, initialScope)\n            : { value: node.property.name }\n\n        if (\n            object != null &&\n            property != null &&\n            !isGetter(object.value, property.value)\n        ) {\n            return { value: object.value[property.value] }\n        }\n        return null\n    },\n\n    NewExpression(node, initialScope) {\n        const callee = getStaticValueR(node.callee, initialScope)\n        const args = getElementValues(node.arguments, initialScope)\n\n        if (callee != null && args != null) {\n            const Func = callee.value\n            if (callAllowed.has(Func)) {\n                return { value: new Func(...args) }\n            }\n        }\n\n        return null\n    },\n\n    ObjectExpression(node, initialScope) {\n        const object = {}\n\n        for (const propertyNode of node.properties) {\n            if (propertyNode.type === \"Property\") {\n                if (propertyNode.kind !== \"init\") {\n                    return null\n                }\n                const key = propertyNode.computed\n                    ? getStaticValueR(propertyNode.key, initialScope)\n                    : { value: propertyNode.key.name }\n                const value = getStaticValueR(propertyNode.value, initialScope)\n                if (key == null || value == null) {\n                    return null\n                }\n                object[key.value] = value.value\n            } else if (\n                propertyNode.type === \"SpreadElement\" ||\n                propertyNode.type === \"ExperimentalSpreadProperty\"\n            ) {\n                const argument = getStaticValueR(\n                    propertyNode.argument,\n                    initialScope\n                )\n                if (argument == null) {\n                    return null\n                }\n                Object.assign(object, argument.value)\n            } else {\n                return null\n            }\n        }\n\n        return { value: object }\n    },\n\n    SequenceExpression(node, initialScope) {\n        const last = node.expressions[node.expressions.length - 1]\n        return getStaticValueR(last, initialScope)\n    },\n\n    TaggedTemplateExpression(node, initialScope) {\n        const tag = getStaticValueR(node.tag, initialScope)\n        const expressions = getElementValues(\n            node.quasi.expressions,\n            initialScope\n        )\n\n        if (tag != null && expressions != null) {\n            const func = tag.value\n            const strings = node.quasi.quasis.map(q => q.value.cooked)\n            strings.raw = node.quasi.quasis.map(q => q.value.raw)\n\n            if (func === String.raw) {\n                return { value: func(strings, ...expressions) }\n            }\n        }\n\n        return null\n    },\n\n    TemplateLiteral(node, initialScope) {\n        const expressions = getElementValues(node.expressions, initialScope)\n        if (expressions != null) {\n            let value = node.quasis[0].value.cooked\n            for (let i = 0; i < expressions.length; ++i) {\n                value += expressions[i]\n                value += node.quasis[i + 1].value.cooked\n            }\n            return { value }\n        }\n        return null\n    },\n\n    UnaryExpression(node, initialScope) {\n        if (node.operator === \"delete\") {\n            // Not supported.\n            return null\n        }\n        if (node.operator === \"void\") {\n            return { value: undefined }\n        }\n\n        const arg = getStaticValueR(node.argument, initialScope)\n        if (arg != null) {\n            switch (node.operator) {\n                case \"-\":\n                    return { value: -arg.value }\n                case \"+\":\n                    return { value: +arg.value } //eslint-disable-line no-implicit-coercion\n                case \"!\":\n                    return { value: !arg.value }\n                case \"~\":\n                    return { value: ~arg.value }\n                case \"typeof\":\n                    return { value: typeof arg.value }\n\n                // no default\n            }\n        }\n\n        return null\n    },\n})\n\n/**\n * Get the value of a given node if it's a static value.\n * @param {Node} node The node to get.\n * @param {Scope|undefined} initialScope The scope to start finding variable.\n * @returns {{value:any}|null} The static value of the node, or `null`.\n */\nfunction getStaticValueR(node, initialScope) {\n    if (node != null && Object.hasOwnProperty.call(operations, node.type)) {\n        return operations[node.type](node, initialScope)\n    }\n    return null\n}\n\n/**\n * Get the value of a given node if it's a static value.\n * @param {Node} node The node to get.\n * @param {Scope} [initialScope] The scope to start finding variable. Optional. If this scope was given, this tries to resolve identifier references which are in the given node as much as possible.\n * @returns {{value:any}|null} The static value of the node, or `null`.\n */\nexport function getStaticValue(node, initialScope = null) {\n    try {\n        return getStaticValueR(node, initialScope)\n    } catch (_error) {\n        return null\n    }\n}\n","import { getStaticValue } from \"./get-static-value\"\n\n/**\n * Get the value of a given node if it's a literal or a template literal.\n * @param {Node} node The node to get.\n * @param {Scope} [initialScope] The scope to start finding variable. Optional. If the node is an Identifier node and this scope was given, this checks the variable of the identifier, and returns the value of it if the variable is a constant.\n * @returns {string|null} The value of the node, or `null`.\n */\nexport function getStringIfConstant(node, initialScope = null) {\n    // Handle the literals that the platform doesn't support natively.\n    if (node && node.type === \"Literal\" && node.value === null) {\n        if (node.regex) {\n            return `/${node.regex.pattern}/${node.regex.flags}`\n        }\n        if (node.bigint) {\n            return node.bigint\n        }\n    }\n\n    const evaluated = getStaticValue(node, initialScope)\n    return evaluated && String(evaluated.value)\n}\n","import { getStringIfConstant } from \"./get-string-if-constant\"\n\n/**\n * Get the property name from a MemberExpression node or a Property node.\n * @param {Node} node The node to get.\n * @param {Scope} [initialScope] The scope to start finding variable. Optional. If the node is a computed property node and this scope was given, this checks the computed property name by the `getStringIfConstant` function with the scope, and returns the value of it.\n * @returns {string|null} The property name of the node.\n */\nexport function getPropertyName(node, initialScope) {\n    switch (node.type) {\n        case \"MemberExpression\":\n            if (node.computed) {\n                return getStringIfConstant(node.property, initialScope)\n            }\n            return node.property.name\n\n        case \"Property\":\n        case \"MethodDefinition\":\n            if (node.computed) {\n                return getStringIfConstant(node.key, initialScope)\n            }\n            if (node.key.type === \"Literal\") {\n                return String(node.key.value)\n            }\n            return node.key.name\n\n        // no default\n    }\n\n    return null\n}\n","import { getPropertyName } from \"./get-property-name\"\n\n/**\n * Get the name and kind of the given function node.\n * @param {ASTNode} node - The function node to get.\n * @returns {string} The name and kind of the function node.\n */\nexport function getFunctionNameWithKind(node) {\n    const parent = node.parent\n    const tokens = []\n\n    if (parent.type === \"MethodDefinition\" && parent.static) {\n        tokens.push(\"static\")\n    }\n    if (node.async) {\n        tokens.push(\"async\")\n    }\n    if (node.generator) {\n        tokens.push(\"generator\")\n    }\n\n    if (node.type === \"ArrowFunctionExpression\") {\n        tokens.push(\"arrow\", \"function\")\n    } else if (\n        parent.type === \"Property\" ||\n        parent.type === \"MethodDefinition\"\n    ) {\n        if (parent.kind === \"constructor\") {\n            return \"constructor\"\n        }\n        if (parent.kind === \"get\") {\n            tokens.push(\"getter\")\n        } else if (parent.kind === \"set\") {\n            tokens.push(\"setter\")\n        } else {\n            tokens.push(\"method\")\n        }\n    } else {\n        tokens.push(\"function\")\n    }\n\n    if (node.id) {\n        tokens.push(`'${node.id.name}'`)\n    } else {\n        const name = getPropertyName(parent)\n\n        if (name) {\n            tokens.push(`'${name}'`)\n        }\n    }\n\n    return tokens.join(\" \")\n}\n","import evk from \"eslint-visitor-keys\"\n\nconst typeConversionBinaryOps = Object.freeze(\n    new Set([\n        \"==\",\n        \"!=\",\n        \"<\",\n        \"<=\",\n        \">\",\n        \">=\",\n        \"<<\",\n        \">>\",\n        \">>>\",\n        \"+\",\n        \"-\",\n        \"*\",\n        \"/\",\n        \"%\",\n        \"|\",\n        \"^\",\n        \"&\",\n        \"in\",\n    ])\n)\nconst typeConversionUnaryOps = Object.freeze(new Set([\"-\", \"+\", \"!\", \"~\"]))\nconst visitor = Object.freeze(\n    Object.assign(Object.create(null), {\n        $visit(node, options, visitorKeys) {\n            const { type } = node\n\n            if (typeof this[type] === \"function\") {\n                return this[type](node, options, visitorKeys)\n            }\n\n            return this.$visitChildren(node, options, visitorKeys)\n        },\n\n        $visitChildren(node, options, visitorKeys) {\n            const { type } = node\n\n            for (const key of visitorKeys[type] || evk.getKeys(node)) {\n                const value = node[key]\n\n                if (Array.isArray(value)) {\n                    for (const element of value) {\n                        if (\n                            element &&\n                            this.$visit(element, options, visitorKeys)\n                        ) {\n                            return true\n                        }\n                    }\n                } else if (value && this.$visit(value, options, visitorKeys)) {\n                    return true\n                }\n            }\n\n            return false\n        },\n\n        ArrowFunctionExpression() {\n            return false\n        },\n        AssignmentExpression() {\n            return true\n        },\n        AwaitExpression() {\n            return true\n        },\n        BinaryExpression(node, options, visitorKeys) {\n            if (\n                options.considerImplicitTypeConversion &&\n                typeConversionBinaryOps.has(node.operator) &&\n                (node.left.type !== \"Literal\" || node.right.type !== \"Literal\")\n            ) {\n                return true\n            }\n            return this.$visitChildren(node, options, visitorKeys)\n        },\n        CallExpression() {\n            return true\n        },\n        FunctionExpression() {\n            return false\n        },\n        ImportExpression() {\n            return true\n        },\n        MemberExpression(node, options, visitorKeys) {\n            if (options.considerGetters) {\n                return true\n            }\n            if (\n                options.considerImplicitTypeConversion &&\n                node.computed &&\n                node.property.type !== \"Literal\"\n            ) {\n                return true\n            }\n            return this.$visitChildren(node, options, visitorKeys)\n        },\n        MethodDefinition(node, options, visitorKeys) {\n            if (\n                options.considerImplicitTypeConversion &&\n                node.computed &&\n                node.key.type !== \"Literal\"\n            ) {\n                return true\n            }\n            return this.$visitChildren(node, options, visitorKeys)\n        },\n        NewExpression() {\n            return true\n        },\n        Property(node, options, visitorKeys) {\n            if (\n                options.considerImplicitTypeConversion &&\n                node.computed &&\n                node.key.type !== \"Literal\"\n            ) {\n                return true\n            }\n            return this.$visitChildren(node, options, visitorKeys)\n        },\n        UnaryExpression(node, options, visitorKeys) {\n            if (node.operator === \"delete\") {\n                return true\n            }\n            if (\n                options.considerImplicitTypeConversion &&\n                typeConversionUnaryOps.has(node.operator) &&\n                node.argument.type !== \"Literal\"\n            ) {\n                return true\n            }\n            return this.$visitChildren(node, options, visitorKeys)\n        },\n        UpdateExpression() {\n            return true\n        },\n        YieldExpression() {\n            return true\n        },\n    })\n)\n\n/**\n * Check whether a given node has any side effect or not.\n * @param {Node} node The node to get.\n * @param {SourceCode} sourceCode The source code object.\n * @param {object} [options] The option object.\n * @param {boolean} [options.considerGetters=false] If `true` then it considers member accesses as the node which has side effects.\n * @param {boolean} [options.considerImplicitTypeConversion=false] If `true` then it considers implicit type conversion as the node which has side effects.\n * @param {object} [options.visitorKeys=evk.KEYS] The keys to traverse nodes. Use `context.getSourceCode().visitorKeys`.\n * @returns {boolean} `true` if the node has a certain side effect.\n */\nexport function hasSideEffect(\n    node,\n    sourceCode,\n    { considerGetters = false, considerImplicitTypeConversion = false } = {}\n) {\n    return visitor.$visit(\n        node,\n        { considerGetters, considerImplicitTypeConversion },\n        sourceCode.visitorKeys || evk.KEYS\n    )\n}\n","import { isClosingParenToken, isOpeningParenToken } from \"./token-predicate\"\n\n/**\n * Get the left parenthesis of the parent node syntax if it exists.\n * E.g., `if (a) {}` then the `(`.\n * @param {Node} node The AST node to check.\n * @param {SourceCode} sourceCode The source code object to get tokens.\n * @returns {Token|null} The left parenthesis of the parent node syntax\n */\nfunction getParentSyntaxParen(node, sourceCode) {\n    const parent = node.parent\n\n    switch (parent.type) {\n        case \"CallExpression\":\n        case \"NewExpression\":\n            if (parent.arguments.length === 1 && parent.arguments[0] === node) {\n                return sourceCode.getTokenAfter(\n                    parent.callee,\n                    isOpeningParenToken\n                )\n            }\n            return null\n\n        case \"DoWhileStatement\":\n            if (parent.test === node) {\n                return sourceCode.getTokenAfter(\n                    parent.body,\n                    isOpeningParenToken\n                )\n            }\n            return null\n\n        case \"IfStatement\":\n        case \"WhileStatement\":\n            if (parent.test === node) {\n                return sourceCode.getFirstToken(parent, 1)\n            }\n            return null\n\n        case \"ImportExpression\":\n            if (parent.source === node) {\n                return sourceCode.getFirstToken(parent, 1)\n            }\n            return null\n\n        case \"SwitchStatement\":\n            if (parent.discriminant === node) {\n                return sourceCode.getFirstToken(parent, 1)\n            }\n            return null\n\n        case \"WithStatement\":\n            if (parent.object === node) {\n                return sourceCode.getFirstToken(parent, 1)\n            }\n            return null\n\n        default:\n            return null\n    }\n}\n\n/**\n * Check whether a given node is parenthesized or not.\n * @param {number} times The number of parantheses.\n * @param {Node} node The AST node to check.\n * @param {SourceCode} sourceCode The source code object to get tokens.\n * @returns {boolean} `true` if the node is parenthesized the given times.\n */\n/**\n * Check whether a given node is parenthesized or not.\n * @param {Node} node The AST node to check.\n * @param {SourceCode} sourceCode The source code object to get tokens.\n * @returns {boolean} `true` if the node is parenthesized.\n */\nexport function isParenthesized(\n    timesOrNode,\n    nodeOrSourceCode,\n    optionalSourceCode\n) {\n    let times, node, sourceCode, maybeLeftParen, maybeRightParen\n    if (typeof timesOrNode === \"number\") {\n        times = timesOrNode | 0\n        node = nodeOrSourceCode\n        sourceCode = optionalSourceCode\n        if (!(times >= 1)) {\n            throw new TypeError(\"'times' should be a positive integer.\")\n        }\n    } else {\n        times = 1\n        node = timesOrNode\n        sourceCode = nodeOrSourceCode\n    }\n\n    if (node == null) {\n        return false\n    }\n\n    maybeLeftParen = maybeRightParen = node\n    do {\n        maybeLeftParen = sourceCode.getTokenBefore(maybeLeftParen)\n        maybeRightParen = sourceCode.getTokenAfter(maybeRightParen)\n    } while (\n        maybeLeftParen != null &&\n        maybeRightParen != null &&\n        isOpeningParenToken(maybeLeftParen) &&\n        isClosingParenToken(maybeRightParen) &&\n        // Avoid false positive such as `if (a) {}`\n        maybeLeftParen !== getParentSyntaxParen(node, sourceCode) &&\n        --times > 0\n    )\n\n    return times === 0\n}\n","/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * See LICENSE file in root directory for full license.\n */\n\nconst placeholder = /\\$(?:[$&`']|[1-9][0-9]?)/gu\n\n/** @type {WeakMap<PatternMatcher, {pattern:RegExp,escaped:boolean}>} */\nconst internal = new WeakMap()\n\n/**\n * Check whether a given character is escaped or not.\n * @param {string} str The string to check.\n * @param {number} index The location of the character to check.\n * @returns {boolean} `true` if the character is escaped.\n */\nfunction isEscaped(str, index) {\n    let escaped = false\n    for (let i = index - 1; i >= 0 && str.charCodeAt(i) === 0x5c; --i) {\n        escaped = !escaped\n    }\n    return escaped\n}\n\n/**\n * Replace a given string by a given matcher.\n * @param {PatternMatcher} matcher The pattern matcher.\n * @param {string} str The string to be replaced.\n * @param {string} replacement The new substring to replace each matched part.\n * @returns {string} The replaced string.\n */\nfunction replaceS(matcher, str, replacement) {\n    const chunks = []\n    let index = 0\n\n    /** @type {RegExpExecArray} */\n    let match = null\n\n    /**\n     * @param {string} key The placeholder.\n     * @returns {string} The replaced string.\n     */\n    function replacer(key) {\n        switch (key) {\n            case \"$$\":\n                return \"$\"\n            case \"$&\":\n                return match[0]\n            case \"$`\":\n                return str.slice(0, match.index)\n            case \"$'\":\n                return str.slice(match.index + match[0].length)\n            default: {\n                const i = key.slice(1)\n                if (i in match) {\n                    return match[i]\n                }\n                return key\n            }\n        }\n    }\n\n    for (match of matcher.execAll(str)) {\n        chunks.push(str.slice(index, match.index))\n        chunks.push(replacement.replace(placeholder, replacer))\n        index = match.index + match[0].length\n    }\n    chunks.push(str.slice(index))\n\n    return chunks.join(\"\")\n}\n\n/**\n * Replace a given string by a given matcher.\n * @param {PatternMatcher} matcher The pattern matcher.\n * @param {string} str The string to be replaced.\n * @param {(...strs[])=>string} replace The function to replace each matched part.\n * @returns {string} The replaced string.\n */\nfunction replaceF(matcher, str, replace) {\n    const chunks = []\n    let index = 0\n\n    for (const match of matcher.execAll(str)) {\n        chunks.push(str.slice(index, match.index))\n        chunks.push(String(replace(...match, match.index, match.input)))\n        index = match.index + match[0].length\n    }\n    chunks.push(str.slice(index))\n\n    return chunks.join(\"\")\n}\n\n/**\n * The class to find patterns as considering escape sequences.\n */\nexport class PatternMatcher {\n    /**\n     * Initialize this matcher.\n     * @param {RegExp} pattern The pattern to match.\n     * @param {{escaped:boolean}} options The options.\n     */\n    constructor(pattern, { escaped = false } = {}) {\n        if (!(pattern instanceof RegExp)) {\n            throw new TypeError(\"'pattern' should be a RegExp instance.\")\n        }\n        if (!pattern.flags.includes(\"g\")) {\n            throw new Error(\"'pattern' should contains 'g' flag.\")\n        }\n\n        internal.set(this, {\n            pattern: new RegExp(pattern.source, pattern.flags),\n            escaped: Boolean(escaped),\n        })\n    }\n\n    /**\n     * Find the pattern in a given string.\n     * @param {string} str The string to find.\n     * @returns {IterableIterator<RegExpExecArray>} The iterator which iterate the matched information.\n     */\n    *execAll(str) {\n        const { pattern, escaped } = internal.get(this)\n        let match = null\n        let lastIndex = 0\n\n        pattern.lastIndex = 0\n        while ((match = pattern.exec(str)) != null) {\n            if (escaped || !isEscaped(str, match.index)) {\n                lastIndex = pattern.lastIndex\n                yield match\n                pattern.lastIndex = lastIndex\n            }\n        }\n    }\n\n    /**\n     * Check whether the pattern is found in a given string.\n     * @param {string} str The string to check.\n     * @returns {boolean} `true` if the pattern was found in the string.\n     */\n    test(str) {\n        const it = this.execAll(str)\n        const ret = it.next()\n        return !ret.done\n    }\n\n    /**\n     * Replace a given string.\n     * @param {string} str The string to be replaced.\n     * @param {(string|((...strs:string[])=>string))} replacer The string or function to replace. This is the same as the 2nd argument of `String.prototype.replace`.\n     * @returns {string} The replaced string.\n     */\n    [Symbol.replace](str, replacer) {\n        return typeof replacer === \"function\"\n            ? replaceF(this, String(str), replacer)\n            : replaceS(this, String(str), String(replacer))\n    }\n}\n","import { findVariable } from \"./find-variable\"\nimport { getPropertyName } from \"./get-property-name\"\nimport { getStringIfConstant } from \"./get-string-if-constant\"\n\nconst IMPORT_TYPE = /^(?:Import|Export(?:All|Default|Named))Declaration$/u\nconst has = Function.call.bind(Object.hasOwnProperty)\n\nexport const READ = Symbol(\"read\")\nexport const CALL = Symbol(\"call\")\nexport const CONSTRUCT = Symbol(\"construct\")\nexport const ESM = Symbol(\"esm\")\n\nconst requireCall = { require: { [CALL]: true } }\n\n/**\n * Check whether a given variable is modified or not.\n * @param {Variable} variable The variable to check.\n * @returns {boolean} `true` if the variable is modified.\n */\nfunction isModifiedGlobal(variable) {\n    return (\n        variable == null ||\n        variable.defs.length !== 0 ||\n        variable.references.some(r => r.isWrite())\n    )\n}\n\n/**\n * Check if the value of a given node is passed through to the parent syntax as-is.\n * For example, `a` and `b` in (`a || b` and `c ? a : b`) are passed through.\n * @param {Node} node A node to check.\n * @returns {boolean} `true` if the node is passed through.\n */\nfunction isPassThrough(node) {\n    const parent = node.parent\n\n    switch (parent && parent.type) {\n        case \"ConditionalExpression\":\n            return parent.consequent === node || parent.alternate === node\n        case \"LogicalExpression\":\n            return true\n        case \"SequenceExpression\":\n            return parent.expressions[parent.expressions.length - 1] === node\n\n        default:\n            return false\n    }\n}\n\n/**\n * The reference tracker.\n */\nexport class ReferenceTracker {\n    /**\n     * Initialize this tracker.\n     * @param {Scope} globalScope The global scope.\n     * @param {object} [options] The options.\n     * @param {\"legacy\"|\"strict\"} [options.mode=\"strict\"] The mode to determine the ImportDeclaration's behavior for CJS modules.\n     * @param {string[]} [options.globalObjectNames=[\"global\",\"self\",\"window\"]] The variable names for Global Object.\n     */\n    constructor(\n        globalScope,\n        {\n            mode = \"strict\",\n            globalObjectNames = [\"global\", \"self\", \"window\"],\n        } = {}\n    ) {\n        this.variableStack = []\n        this.globalScope = globalScope\n        this.mode = mode\n        this.globalObjectNames = globalObjectNames.slice(0)\n    }\n\n    /**\n     * Iterate the references of global variables.\n     * @param {object} traceMap The trace map.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    *iterateGlobalReferences(traceMap) {\n        for (const key of Object.keys(traceMap)) {\n            const nextTraceMap = traceMap[key]\n            const path = [key]\n            const variable = this.globalScope.set.get(key)\n\n            if (isModifiedGlobal(variable)) {\n                continue\n            }\n\n            yield* this._iterateVariableReferences(\n                variable,\n                path,\n                nextTraceMap,\n                true\n            )\n        }\n\n        for (const key of this.globalObjectNames) {\n            const path = []\n            const variable = this.globalScope.set.get(key)\n\n            if (isModifiedGlobal(variable)) {\n                continue\n            }\n\n            yield* this._iterateVariableReferences(\n                variable,\n                path,\n                traceMap,\n                false\n            )\n        }\n    }\n\n    /**\n     * Iterate the references of CommonJS modules.\n     * @param {object} traceMap The trace map.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    *iterateCjsReferences(traceMap) {\n        for (const { node } of this.iterateGlobalReferences(requireCall)) {\n            const key = getStringIfConstant(node.arguments[0])\n            if (key == null || !has(traceMap, key)) {\n                continue\n            }\n\n            const nextTraceMap = traceMap[key]\n            const path = [key]\n\n            if (nextTraceMap[READ]) {\n                yield {\n                    node,\n                    path,\n                    type: READ,\n                    info: nextTraceMap[READ],\n                }\n            }\n            yield* this._iteratePropertyReferences(node, path, nextTraceMap)\n        }\n    }\n\n    /**\n     * Iterate the references of ES modules.\n     * @param {object} traceMap The trace map.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    *iterateEsmReferences(traceMap) {\n        const programNode = this.globalScope.block\n\n        for (const node of programNode.body) {\n            if (!IMPORT_TYPE.test(node.type) || node.source == null) {\n                continue\n            }\n            const moduleId = node.source.value\n\n            if (!has(traceMap, moduleId)) {\n                continue\n            }\n            const nextTraceMap = traceMap[moduleId]\n            const path = [moduleId]\n\n            if (nextTraceMap[READ]) {\n                yield { node, path, type: READ, info: nextTraceMap[READ] }\n            }\n\n            if (node.type === \"ExportAllDeclaration\") {\n                for (const key of Object.keys(nextTraceMap)) {\n                    const exportTraceMap = nextTraceMap[key]\n                    if (exportTraceMap[READ]) {\n                        yield {\n                            node,\n                            path: path.concat(key),\n                            type: READ,\n                            info: exportTraceMap[READ],\n                        }\n                    }\n                }\n            } else {\n                for (const specifier of node.specifiers) {\n                    const esm = has(nextTraceMap, ESM)\n                    const it = this._iterateImportReferences(\n                        specifier,\n                        path,\n                        esm\n                            ? nextTraceMap\n                            : this.mode === \"legacy\"\n                            ? Object.assign(\n                                  { default: nextTraceMap },\n                                  nextTraceMap\n                              )\n                            : { default: nextTraceMap }\n                    )\n\n                    if (esm) {\n                        yield* it\n                    } else {\n                        for (const report of it) {\n                            report.path = report.path.filter(exceptDefault)\n                            if (\n                                report.path.length >= 2 ||\n                                report.type !== READ\n                            ) {\n                                yield report\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Iterate the references for a given variable.\n     * @param {Variable} variable The variable to iterate that references.\n     * @param {string[]} path The current path.\n     * @param {object} traceMap The trace map.\n     * @param {boolean} shouldReport = The flag to report those references.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    *_iterateVariableReferences(variable, path, traceMap, shouldReport) {\n        if (this.variableStack.includes(variable)) {\n            return\n        }\n        this.variableStack.push(variable)\n        try {\n            for (const reference of variable.references) {\n                if (!reference.isRead()) {\n                    continue\n                }\n                const node = reference.identifier\n\n                if (shouldReport && traceMap[READ]) {\n                    yield { node, path, type: READ, info: traceMap[READ] }\n                }\n                yield* this._iteratePropertyReferences(node, path, traceMap)\n            }\n        } finally {\n            this.variableStack.pop()\n        }\n    }\n\n    /**\n     * Iterate the references for a given AST node.\n     * @param rootNode The AST node to iterate references.\n     * @param {string[]} path The current path.\n     * @param {object} traceMap The trace map.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    //eslint-disable-next-line complexity\n    *_iteratePropertyReferences(rootNode, path, traceMap) {\n        let node = rootNode\n        while (isPassThrough(node)) {\n            node = node.parent\n        }\n\n        const parent = node.parent\n        if (parent.type === \"MemberExpression\") {\n            if (parent.object === node) {\n                const key = getPropertyName(parent)\n                if (key == null || !has(traceMap, key)) {\n                    return\n                }\n\n                path = path.concat(key) //eslint-disable-line no-param-reassign\n                const nextTraceMap = traceMap[key]\n                if (nextTraceMap[READ]) {\n                    yield {\n                        node: parent,\n                        path,\n                        type: READ,\n                        info: nextTraceMap[READ],\n                    }\n                }\n                yield* this._iteratePropertyReferences(\n                    parent,\n                    path,\n                    nextTraceMap\n                )\n            }\n            return\n        }\n        if (parent.type === \"CallExpression\") {\n            if (parent.callee === node && traceMap[CALL]) {\n                yield { node: parent, path, type: CALL, info: traceMap[CALL] }\n            }\n            return\n        }\n        if (parent.type === \"NewExpression\") {\n            if (parent.callee === node && traceMap[CONSTRUCT]) {\n                yield {\n                    node: parent,\n                    path,\n                    type: CONSTRUCT,\n                    info: traceMap[CONSTRUCT],\n                }\n            }\n            return\n        }\n        if (parent.type === \"AssignmentExpression\") {\n            if (parent.right === node) {\n                yield* this._iterateLhsReferences(parent.left, path, traceMap)\n                yield* this._iteratePropertyReferences(parent, path, traceMap)\n            }\n            return\n        }\n        if (parent.type === \"AssignmentPattern\") {\n            if (parent.right === node) {\n                yield* this._iterateLhsReferences(parent.left, path, traceMap)\n            }\n            return\n        }\n        if (parent.type === \"VariableDeclarator\") {\n            if (parent.init === node) {\n                yield* this._iterateLhsReferences(parent.id, path, traceMap)\n            }\n        }\n    }\n\n    /**\n     * Iterate the references for a given Pattern node.\n     * @param {Node} patternNode The Pattern node to iterate references.\n     * @param {string[]} path The current path.\n     * @param {object} traceMap The trace map.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    *_iterateLhsReferences(patternNode, path, traceMap) {\n        if (patternNode.type === \"Identifier\") {\n            const variable = findVariable(this.globalScope, patternNode)\n            if (variable != null) {\n                yield* this._iterateVariableReferences(\n                    variable,\n                    path,\n                    traceMap,\n                    false\n                )\n            }\n            return\n        }\n        if (patternNode.type === \"ObjectPattern\") {\n            for (const property of patternNode.properties) {\n                const key = getPropertyName(property)\n\n                if (key == null || !has(traceMap, key)) {\n                    continue\n                }\n\n                const nextPath = path.concat(key)\n                const nextTraceMap = traceMap[key]\n                if (nextTraceMap[READ]) {\n                    yield {\n                        node: property,\n                        path: nextPath,\n                        type: READ,\n                        info: nextTraceMap[READ],\n                    }\n                }\n                yield* this._iterateLhsReferences(\n                    property.value,\n                    nextPath,\n                    nextTraceMap\n                )\n            }\n            return\n        }\n        if (patternNode.type === \"AssignmentPattern\") {\n            yield* this._iterateLhsReferences(patternNode.left, path, traceMap)\n        }\n    }\n\n    /**\n     * Iterate the references for a given ModuleSpecifier node.\n     * @param {Node} specifierNode The ModuleSpecifier node to iterate references.\n     * @param {string[]} path The current path.\n     * @param {object} traceMap The trace map.\n     * @returns {IterableIterator<{node:Node,path:string[],type:symbol,info:any}>} The iterator to iterate references.\n     */\n    *_iterateImportReferences(specifierNode, path, traceMap) {\n        const type = specifierNode.type\n\n        if (type === \"ImportSpecifier\" || type === \"ImportDefaultSpecifier\") {\n            const key =\n                type === \"ImportDefaultSpecifier\"\n                    ? \"default\"\n                    : specifierNode.imported.name\n            if (!has(traceMap, key)) {\n                return\n            }\n\n            path = path.concat(key) //eslint-disable-line no-param-reassign\n            const nextTraceMap = traceMap[key]\n            if (nextTraceMap[READ]) {\n                yield {\n                    node: specifierNode,\n                    path,\n                    type: READ,\n                    info: nextTraceMap[READ],\n                }\n            }\n            yield* this._iterateVariableReferences(\n                findVariable(this.globalScope, specifierNode.local),\n                path,\n                nextTraceMap,\n                false\n            )\n\n            return\n        }\n\n        if (type === \"ImportNamespaceSpecifier\") {\n            yield* this._iterateVariableReferences(\n                findVariable(this.globalScope, specifierNode.local),\n                path,\n                traceMap,\n                false\n            )\n            return\n        }\n\n        if (type === \"ExportSpecifier\") {\n            const key = specifierNode.local.name\n            if (!has(traceMap, key)) {\n                return\n            }\n\n            path = path.concat(key) //eslint-disable-line no-param-reassign\n            const nextTraceMap = traceMap[key]\n            if (nextTraceMap[READ]) {\n                yield {\n                    node: specifierNode,\n                    path,\n                    type: READ,\n                    info: nextTraceMap[READ],\n                }\n            }\n        }\n    }\n}\n\nReferenceTracker.READ = READ\nReferenceTracker.CALL = CALL\nReferenceTracker.CONSTRUCT = CONSTRUCT\nReferenceTracker.ESM = ESM\n\n/**\n * This is a predicate function for Array#filter.\n * @param {string} name A name part.\n * @param {number} index The index of the name.\n * @returns {boolean} `false` if it's default.\n */\nfunction exceptDefault(name, index) {\n    return !(index === 1 && name === \"default\")\n}\n","import { findVariable } from \"./find-variable\"\nimport { getFunctionHeadLocation } from \"./get-function-head-location\"\nimport { getFunctionNameWithKind } from \"./get-function-name-with-kind\"\nimport { getInnermostScope } from \"./get-innermost-scope\"\nimport { getPropertyName } from \"./get-property-name\"\nimport { getStaticValue } from \"./get-static-value\"\nimport { getStringIfConstant } from \"./get-string-if-constant\"\nimport { hasSideEffect } from \"./has-side-effect\"\nimport { isParenthesized } from \"./is-parenthesized\"\nimport { PatternMatcher } from \"./pattern-matcher\"\nimport {\n    CALL,\n    CONSTRUCT,\n    ESM,\n    READ,\n    ReferenceTracker,\n} from \"./reference-tracker\"\nimport {\n    isArrowToken,\n    isClosingBraceToken,\n    isClosingBracketToken,\n    isClosingParenToken,\n    isColonToken,\n    isCommaToken,\n    isCommentToken,\n    isNotArrowToken,\n    isNotClosingBraceToken,\n    isNotClosingBracketToken,\n    isNotClosingParenToken,\n    isNotColonToken,\n    isNotCommaToken,\n    isNotCommentToken,\n    isNotOpeningBraceToken,\n    isNotOpeningBracketToken,\n    isNotOpeningParenToken,\n    isNotSemicolonToken,\n    isOpeningBraceToken,\n    isOpeningBracketToken,\n    isOpeningParenToken,\n    isSemicolonToken,\n} from \"./token-predicate\"\n\nexport default {\n    CALL,\n    CONSTRUCT,\n    ESM,\n    findVariable,\n    getFunctionHeadLocation,\n    getFunctionNameWithKind,\n    getInnermostScope,\n    getPropertyName,\n    getStaticValue,\n    getStringIfConstant,\n    hasSideEffect,\n    isArrowToken,\n    isClosingBraceToken,\n    isClosingBracketToken,\n    isClosingParenToken,\n    isColonToken,\n    isCommaToken,\n    isCommentToken,\n    isNotArrowToken,\n    isNotClosingBraceToken,\n    isNotClosingBracketToken,\n    isNotClosingParenToken,\n    isNotColonToken,\n    isNotCommaToken,\n    isNotCommentToken,\n    isNotOpeningBraceToken,\n    isNotOpeningBracketToken,\n    isNotOpeningParenToken,\n    isNotSemicolonToken,\n    isOpeningBraceToken,\n    isOpeningBracketToken,\n    isOpeningParenToken,\n    isParenthesized,\n    isSemicolonToken,\n    PatternMatcher,\n    READ,\n    ReferenceTracker,\n}\nexport {\n    CALL,\n    CONSTRUCT,\n    ESM,\n    findVariable,\n    getFunctionHeadLocation,\n    getFunctionNameWithKind,\n    getInnermostScope,\n    getPropertyName,\n    getStaticValue,\n    getStringIfConstant,\n    hasSideEffect,\n    isArrowToken,\n    isClosingBraceToken,\n    isClosingBracketToken,\n    isClosingParenToken,\n    isColonToken,\n    isCommaToken,\n    isCommentToken,\n    isNotArrowToken,\n    isNotClosingBraceToken,\n    isNotClosingBracketToken,\n    isNotClosingParenToken,\n    isNotColonToken,\n    isNotCommaToken,\n    isNotCommentToken,\n    isNotOpeningBraceToken,\n    isNotOpeningBracketToken,\n    isNotOpeningParenToken,\n    isNotSemicolonToken,\n    isOpeningBraceToken,\n    isOpeningBracketToken,\n    isOpeningParenToken,\n    isParenthesized,\n    isSemicolonToken,\n    PatternMatcher,\n    READ,\n    ReferenceTracker,\n}\n"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/package.json b/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/package.json
deleted file mode 100644
index 8af7d4f..0000000
--- a/node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-utils/package.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "name": "eslint-utils",
-  "version": "1.4.3",
-  "description": "Utilities for ESLint plugins.",
-  "engines": {
-    "node": ">=6"
-  },
-  "sideEffects": false,
-  "main": "index",
-  "module": "index.mjs",
-  "files": [
-    "index.*"
-  ],
-  "dependencies": {
-    "eslint-visitor-keys": "^1.1.0"
-  },
-  "devDependencies": {
-    "@mysticatea/eslint-plugin": "^12.0.0",
-    "codecov": "^3.6.1",
-    "dot-prop": "^4.2.0",
-    "eslint": "^6.5.1",
-    "esm": "^3.2.25",
-    "espree": "^6.1.1",
-    "mocha": "^6.2.2",
-    "npm-run-all": "^4.1.5",
-    "nyc": "^14.1.1",
-    "opener": "^1.5.1",
-    "rimraf": "^3.0.0",
-    "rollup": "^1.25.0",
-    "rollup-plugin-sourcemaps": "^0.4.2",
-    "vuepress": "^1.2.0",
-    "warun": "^1.0.0"
-  },
-  "scripts": {
-    "prebuild": "npm run -s clean",
-    "build": "rollup -c",
-    "clean": "rimraf .nyc_output coverage index.*",
-    "codecov": "nyc report -r lcovonly && codecov",
-    "coverage": "opener ./coverage/lcov-report/index.html",
-    "docs:build": "vuepress build docs",
-    "docs:watch": "vuepress dev docs",
-    "lint": "eslint src test",
-    "test": "run-s lint build test:mocha",
-    "test:mocha": "nyc mocha --reporter dot \"test/*.js\"",
-    "preversion": "npm test && npm run -s build",
-    "postversion": "git push && git push --tags",
-    "prewatch": "npm run -s clean",
-    "watch": "warun \"{src,test}/**/*.js\" -- npm run -s test:mocha"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/mysticatea/eslint-utils.git"
-  },
-  "keywords": [
-    "eslint"
-  ],
-  "author": "Toru Nagashima",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/mysticatea/eslint-utils/issues"
-  },
-  "homepage": "https://github.com/mysticatea/eslint-utils#readme"
-}
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/CHANGELOG.md b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/CHANGELOG.md
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/CHANGELOG.md
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/CHANGELOG.md
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/LICENSE b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/LICENSE
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/LICENSE
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/LICENSE
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/README.md b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/README.md
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/README.md
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/README.md
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/bin/semver.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/bin/semver.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/bin/semver.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/bin/semver.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/classes/comparator.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/classes/comparator.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/classes/comparator.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/classes/comparator.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/classes/index.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/classes/index.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/classes/index.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/classes/index.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/classes/range.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/classes/range.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/classes/range.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/classes/range.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/classes/semver.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/classes/semver.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/classes/semver.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/classes/semver.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/clean.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/clean.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/clean.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/clean.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/cmp.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/cmp.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/cmp.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/cmp.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/coerce.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/coerce.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/coerce.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/coerce.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/compare-build.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/compare-build.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/compare-build.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/compare-build.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/compare-loose.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/compare-loose.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/compare-loose.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/compare-loose.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/compare.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/compare.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/compare.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/compare.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/diff.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/diff.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/diff.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/diff.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/eq.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/eq.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/eq.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/eq.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/gt.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/gt.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/gt.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/gt.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/gte.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/gte.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/gte.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/gte.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/inc.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/inc.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/inc.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/inc.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/lt.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/lt.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/lt.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/lt.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/lte.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/lte.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/lte.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/lte.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/major.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/major.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/major.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/major.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/minor.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/minor.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/minor.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/minor.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/neq.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/neq.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/neq.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/neq.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/parse.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/parse.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/parse.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/parse.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/patch.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/patch.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/patch.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/patch.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/prerelease.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/prerelease.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/prerelease.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/prerelease.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/rcompare.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/rcompare.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/rcompare.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/rcompare.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/rsort.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/rsort.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/rsort.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/rsort.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/satisfies.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/satisfies.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/satisfies.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/satisfies.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/sort.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/sort.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/sort.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/sort.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/valid.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/valid.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/functions/valid.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/functions/valid.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/index.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/index.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/index.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/index.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/internal/constants.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/internal/constants.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/internal/constants.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/internal/constants.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/internal/debug.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/internal/debug.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/internal/debug.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/internal/debug.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/internal/identifiers.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/internal/identifiers.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/internal/identifiers.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/internal/identifiers.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/internal/re.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/internal/re.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/internal/re.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/internal/re.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/package.json b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/package.json
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/package.json
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/package.json
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/preload.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/preload.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/preload.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/preload.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/range.bnf b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/range.bnf
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/range.bnf
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/range.bnf
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/gtr.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/gtr.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/ranges/gtr.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/gtr.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/intersects.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/intersects.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/ranges/intersects.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/intersects.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/ltr.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/ltr.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/ranges/ltr.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/ltr.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/max-satisfying.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/max-satisfying.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/ranges/max-satisfying.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/max-satisfying.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/min-satisfying.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/min-satisfying.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/ranges/min-satisfying.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/min-satisfying.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/min-version.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/min-version.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/ranges/min-version.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/min-version.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/outside.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/outside.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/ranges/outside.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/outside.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/simplify.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/simplify.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/ranges/simplify.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/simplify.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/subset.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/subset.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/ranges/subset.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/subset.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/to-comparators.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/to-comparators.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/ranges/to-comparators.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/to-comparators.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/valid.js b/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/valid.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/semver/ranges/valid.js
rename to node_modules/@typescript-eslint/eslint-plugin/node_modules/semver/ranges/valid.js
diff --git a/node_modules/@typescript-eslint/eslint-plugin/package.json b/node_modules/@typescript-eslint/eslint-plugin/package.json
index e2fa131..04c205c 100644
--- a/node_modules/@typescript-eslint/eslint-plugin/package.json
+++ b/node_modules/@typescript-eslint/eslint-plugin/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@typescript-eslint/eslint-plugin",
-  "version": "2.22.0",
+  "version": "4.3.0",
   "description": "TypeScript plugin for ESLint",
   "keywords": [
     "eslint",
@@ -9,7 +9,7 @@
     "typescript"
   ],
   "engines": {
-    "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
+    "node": "^10.12.0 || >=12.0.0"
   },
   "files": [
     "dist",
@@ -33,6 +33,7 @@
     "check:docs": "jest tests/docs.test.ts --runTestsByPath --silent --runInBand",
     "check:configs": "jest tests/configs.test.ts --runTestsByPath --silent --runInBand",
     "clean": "tsc -b tsconfig.build.json --clean",
+    "postclean": "rimraf dist",
     "format": "prettier --write \"./**/*.{ts,js,json,md}\" --ignore-path ../../.prettierignore",
     "generate:configs": "../../node_modules/.bin/ts-node --files --transpile-only tools/generate-configs.ts",
     "generate:rules-lists": "../../node_modules/.bin/ts-node --files --transpile-only tools/generate-rules-lists.ts",
@@ -41,24 +42,26 @@
     "typecheck": "tsc -p tsconfig.json --noEmit"
   },
   "dependencies": {
-    "@typescript-eslint/experimental-utils": "2.22.0",
-    "eslint-utils": "^1.4.3",
+    "@typescript-eslint/experimental-utils": "4.3.0",
+    "@typescript-eslint/scope-manager": "4.3.0",
+    "debug": "^4.1.1",
     "functional-red-black-tree": "^1.0.1",
     "regexpp": "^3.0.0",
+    "semver": "^7.3.2",
     "tsutils": "^3.17.1"
   },
   "devDependencies": {
-    "@types/json-schema": "^7.0.3",
-    "@types/marked": "^0.7.1",
-    "@types/prettier": "^1.18.2",
-    "chalk": "^3.0.0",
-    "marked": "^0.7.0",
+    "@types/debug": "*",
+    "@types/marked": "^1.1.0",
+    "@types/prettier": "*",
+    "chalk": "^4.0.0",
+    "marked": "^1.0.0",
     "prettier": "*",
     "typescript": "*"
   },
   "peerDependencies": {
-    "@typescript-eslint/parser": "^2.0.0",
-    "eslint": "^5.0.0 || ^6.0.0"
+    "@typescript-eslint/parser": "^4.0.0",
+    "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"
   },
   "peerDependenciesMeta": {
     "typescript": {
@@ -69,5 +72,5 @@
     "type": "opencollective",
     "url": "https://opencollective.com/typescript-eslint"
   },
-  "gitHead": "5a097d316fb084dc4b13e87d68fe9bf43d8a9548"
+  "gitHead": "229631e6cd90bba8f509a6d49fec72fd7a576ccf"
 }
diff --git a/node_modules/@typescript-eslint/experimental-utils/CHANGELOG.md b/node_modules/@typescript-eslint/experimental-utils/CHANGELOG.md
index fc8b6a8..88a8ced 100644
--- a/node_modules/@typescript-eslint/experimental-utils/CHANGELOG.md
+++ b/node_modules/@typescript-eslint/experimental-utils/CHANGELOG.md
@@ -3,6 +3,364 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [4.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.2.0...v4.3.0) (2020-09-28)
+
+
+### Bug Fixes
+
+* **experimental-utils:** treat RuleTester arrays as readonly ([#2601](https://github.com/typescript-eslint/typescript-eslint/issues/2601)) ([8025777](https://github.com/typescript-eslint/typescript-eslint/commit/80257776b78bd2b2b4389d6bd530b009a75fb520))
+
+
+
+
+
+# [4.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.1...v4.2.0) (2020-09-21)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+## [4.1.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.0...v4.1.1) (2020-09-14)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-use-before-define] false positive for function type arguments ([#2554](https://github.com/typescript-eslint/typescript-eslint/issues/2554)) ([189162d](https://github.com/typescript-eslint/typescript-eslint/commit/189162d46ecb116c420232937a7f86df913f4e79)), closes [#2527](https://github.com/typescript-eslint/typescript-eslint/issues/2527)
+
+
+
+
+
+# [4.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.1...v4.1.0) (2020-09-07)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+## [4.0.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.0...v4.0.1) (2020-08-31)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+# [4.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.10.1...v4.0.0) (2020-08-31)
+
+## [Please see the release notes for v4.0.0](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v4.0.0)
+
+### Features
+
+* consume new scope analysis package ([#2039](https://github.com/typescript-eslint/typescript-eslint/issues/2039)) ([3be125d](https://github.com/typescript-eslint/typescript-eslint/commit/3be125d9bdbee1984ac6037874edf619213bd3d0))
+* support ESTree optional chaining representation ([#2308](https://github.com/typescript-eslint/typescript-eslint/issues/2308)) ([e9d2ab6](https://github.com/typescript-eslint/typescript-eslint/commit/e9d2ab638b6767700b52797e74b814ea059beaae))
+
+
+
+
+
+## [3.10.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.10.0...v3.10.1) (2020-08-25)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+# [3.10.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.9.1...v3.10.0) (2020-08-24)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+## [3.9.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.9.0...v3.9.1) (2020-08-17)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+# [3.9.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.8.0...v3.9.0) (2020-08-10)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+# [3.8.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.7.1...v3.8.0) (2020-08-03)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+## [3.7.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.7.0...v3.7.1) (2020-07-27)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+# [3.7.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.6.1...v3.7.0) (2020-07-20)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+## [3.6.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.6.0...v3.6.1) (2020-07-13)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+# [3.6.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.5.0...v3.6.0) (2020-07-06)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+# [3.5.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.4.0...v3.5.0) (2020-06-29)
+
+
+### Features
+
+* add package scope-manager ([#1939](https://github.com/typescript-eslint/typescript-eslint/issues/1939)) ([682eb7e](https://github.com/typescript-eslint/typescript-eslint/commit/682eb7e009c3f22a542882dfd3602196a60d2a1e))
+* split types into their own package ([#2229](https://github.com/typescript-eslint/typescript-eslint/issues/2229)) ([5f45918](https://github.com/typescript-eslint/typescript-eslint/commit/5f4591886f3438329fbf2229b03ac66174334a24))
+
+
+
+
+
+# [3.4.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.3.0...v3.4.0) (2020-06-22)
+
+
+### Bug Fixes
+
+* **experimental-utils:** correct types for TS versions older than 3.8 ([#2217](https://github.com/typescript-eslint/typescript-eslint/issues/2217)) ([5e4dda2](https://github.com/typescript-eslint/typescript-eslint/commit/5e4dda264a7d6a6a1626848e7599faea1ac34922))
+* **experimental-utils:** getParserServices takes a readonly context ([#2235](https://github.com/typescript-eslint/typescript-eslint/issues/2235)) ([26da8de](https://github.com/typescript-eslint/typescript-eslint/commit/26da8de7fcde9eddec63212d79af781c4bb22991))
+
+
+
+
+
+# [3.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.2.0...v3.3.0) (2020-06-15)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+# [3.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.1.0...v3.2.0) (2020-06-08)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [prefer-optional-chain] handling first member expression ([#2156](https://github.com/typescript-eslint/typescript-eslint/issues/2156)) ([de18660](https://github.com/typescript-eslint/typescript-eslint/commit/de18660a8cf8f7033798646d8c5b0938d1accb12))
+
+
+
+
+
+# [3.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.2...v3.1.0) (2020-06-01)
+
+
+### Bug Fixes
+
+* **experimental-utils:** downlevel type declarations for versions older than 3.8 ([#2133](https://github.com/typescript-eslint/typescript-eslint/issues/2133)) ([7925823](https://github.com/typescript-eslint/typescript-eslint/commit/792582326a8065270b69a0ffcaad5a7b4b103ff3))
+
+
+### Features
+
+* **eslint-plugin:** [explicit-module-boundary-types] improve accuracy and coverage ([#2135](https://github.com/typescript-eslint/typescript-eslint/issues/2135)) ([caaa859](https://github.com/typescript-eslint/typescript-eslint/commit/caaa8599284d02ab3341e282cad35a52d0fb86c7))
+
+
+
+
+
+## [3.0.2](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.1...v3.0.2) (2020-05-27)
+
+
+### Bug Fixes
+
+* regression for eslint v6 ([#2105](https://github.com/typescript-eslint/typescript-eslint/issues/2105)) ([31fc503](https://github.com/typescript-eslint/typescript-eslint/commit/31fc5039ed919e1515fda673c186d5c83eb5beb3))
+
+
+
+
+
+## [3.0.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.0...v3.0.1) (2020-05-25)
+
+
+### Bug Fixes
+
+* **experimental-utils:** export `CLIEngine` & `ESLint` ([#2083](https://github.com/typescript-eslint/typescript-eslint/issues/2083)) ([014341b](https://github.com/typescript-eslint/typescript-eslint/commit/014341bb23261f609fc2a6fe7fece191466a084a))
+
+
+
+
+
+# [3.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.34.0...v3.0.0) (2020-05-21)
+
+## [Please see the release notes for v3.0.0](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v3.0.0)
+
+### Bug Fixes
+
+* **experimental-utils:** add back SourceCode.isSpaceBetweenTokens ([ae82ea4](https://github.com/typescript-eslint/typescript-eslint/commit/ae82ea4a85a4ca332ebe6104e96c59dba30411be))
+* **typescript-estree:** remove now defunct `Import` node type ([f199cbd](https://github.com/typescript-eslint/typescript-eslint/commit/f199cbdbbd892b5ba03bfff66f463f3d9c92ee9b))
+
+
+### Features
+
+* **experimental-utils:** upgrade eslint types for v7 ([#2023](https://github.com/typescript-eslint/typescript-eslint/issues/2023)) ([06869c9](https://github.com/typescript-eslint/typescript-eslint/commit/06869c9656fa37936126666845aee40aad546ebd))
+* drop support for node v8 ([#1997](https://github.com/typescript-eslint/typescript-eslint/issues/1997)) ([b6c3b7b](https://github.com/typescript-eslint/typescript-eslint/commit/b6c3b7b84b8d199fa75a46432febd4a364a63217))
+* upgrade to ESLint v7 ([#2022](https://github.com/typescript-eslint/typescript-eslint/issues/2022)) ([208de71](https://github.com/typescript-eslint/typescript-eslint/commit/208de71059746bf38e94bd460346ffb2698a3e12))
+* **eslint-plugin:** [ban-types] rework default options ([#848](https://github.com/typescript-eslint/typescript-eslint/issues/848)) ([8e31d5d](https://github.com/typescript-eslint/typescript-eslint/commit/8e31d5dbe9fe5227fdbefcecfd50ce5dd51360c3))
+* **typescript-estree:** always return parserServices ([#716](https://github.com/typescript-eslint/typescript-eslint/issues/716)) ([5b23443](https://github.com/typescript-eslint/typescript-eslint/commit/5b23443c48f3f62424db3e742243f3568080b946))
+
+
+
+
+
+# [2.34.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.33.0...v2.34.0) (2020-05-18)
+
+
+### Features
+
+* **experimental-utils:** add `suggestion` property for rule  modules ([#2033](https://github.com/typescript-eslint/typescript-eslint/issues/2033)) ([f42a5b0](https://github.com/typescript-eslint/typescript-eslint/commit/f42a5b09ebfa173f418a99c552b0cbe221567194))
+
+
+
+
+
+# [2.33.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.32.0...v2.33.0) (2020-05-12)
+
+
+### Bug Fixes
+
+* **experimental-utils:** remove accidental dep on json-schema ([#2010](https://github.com/typescript-eslint/typescript-eslint/issues/2010)) ([1875fba](https://github.com/typescript-eslint/typescript-eslint/commit/1875fbad41f2a3dda8f610f5dcd180c6205b73d3))
+
+
+
+
+
+# [2.32.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.31.0...v2.32.0) (2020-05-11)
+
+
+### Features
+
+* bump dependencies and align AST ([#2007](https://github.com/typescript-eslint/typescript-eslint/issues/2007)) ([18668b7](https://github.com/typescript-eslint/typescript-eslint/commit/18668b78fd7d1e5281af7fc26c76e0ca53297f69))
+
+
+
+
+
+# [2.31.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.30.0...v2.31.0) (2020-05-04)
+
+
+### Features
+
+* **experimental-utils:** expose our RuleTester extension ([#1948](https://github.com/typescript-eslint/typescript-eslint/issues/1948)) ([2dd1638](https://github.com/typescript-eslint/typescript-eslint/commit/2dd1638aaa2658ba99b2341861146b586f489121))
+
+
+
+
+
+# [2.30.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.29.0...v2.30.0) (2020-04-27)
+
+
+### Features
+
+* **experimental-utils:** allow rule options to be a readonly tuple ([#1924](https://github.com/typescript-eslint/typescript-eslint/issues/1924)) ([4ef6788](https://github.com/typescript-eslint/typescript-eslint/commit/4ef67884962b6aac61cc895aaa3ba16aa892ecf4))
+
+
+
+
+
+# [2.29.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.28.0...v2.29.0) (2020-04-20)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+# [2.28.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.27.0...v2.28.0) (2020-04-13)
+
+
+### Features
+
+* **eslint-plugin:** add rule `prefer-reduce-type-parameter` ([#1707](https://github.com/typescript-eslint/typescript-eslint/issues/1707)) ([c92d240](https://github.com/typescript-eslint/typescript-eslint/commit/c92d240e49113779053eac32038382b282812afc))
+
+
+
+
+
+# [2.27.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.26.0...v2.27.0) (2020-04-06)
+
+
+### Features
+
+* **experimental-utils:** add types for suggestions from CLIEngine ([#1844](https://github.com/typescript-eslint/typescript-eslint/issues/1844)) ([7c11bd6](https://github.com/typescript-eslint/typescript-eslint/commit/7c11bd66f2d0e5ea9d3943e6b8c66e6ddff50862))
+* **experimental-utils:** update eslint types to match v6.8 ([#1846](https://github.com/typescript-eslint/typescript-eslint/issues/1846)) ([16ce74d](https://github.com/typescript-eslint/typescript-eslint/commit/16ce74d247781ac890dc0baa30c384f97e581b6b))
+
+
+
+
+
+# [2.26.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.25.0...v2.26.0) (2020-03-30)
+
+
+### Features
+
+* **typescript-estree:** add option to ignore certain folders from glob resolution ([#1802](https://github.com/typescript-eslint/typescript-eslint/issues/1802)) ([1e29e69](https://github.com/typescript-eslint/typescript-eslint/commit/1e29e69b289d61107a7de67592beae331ba50222))
+
+
+
+
+
+# [2.25.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.24.0...v2.25.0) (2020-03-23)
+
+
+### Features
+
+* **experimental-utils:** expose ast utility functions ([#1670](https://github.com/typescript-eslint/typescript-eslint/issues/1670)) ([3eb5d45](https://github.com/typescript-eslint/typescript-eslint/commit/3eb5d4525e95c8ab990f55588b8d830a02ce5a9c))
+
+
+
+
+
+# [2.24.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.23.0...v2.24.0) (2020-03-16)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
+# [2.23.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.22.0...v2.23.0) (2020-03-09)
+
+**Note:** Version bump only for package @typescript-eslint/experimental-utils
+
+
+
+
+
 # [2.22.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.21.0...v2.22.0) (2020-03-02)
 
 **Note:** Version bump only for package @typescript-eslint/experimental-utils
diff --git a/node_modules/@typescript-eslint/experimental-utils/README.md b/node_modules/@typescript-eslint/experimental-utils/README.md
index 2f02ef1..208578b 100644
--- a/node_modules/@typescript-eslint/experimental-utils/README.md
+++ b/node_modules/@typescript-eslint/experimental-utils/README.md
@@ -1,27 +1,36 @@
-# `@typescript-eslint/experimental-utils`
+<h1 align="center">Utils for ESLint Plugins</h1>
 
-(Experimental) Utilities for working with TypeScript + ESLint together.
+<p align="center">Utilities for working with TypeScript + ESLint together.</p>
+
+<p align="center">
+    <img src="https://github.com/typescript-eslint/typescript-eslint/workflows/CI/badge.svg" alt="CI" />
+    <a href="https://www.npmjs.com/package/@typescript-eslint/eslint-plugin"><img src="https://img.shields.io/npm/v/@typescript-eslint/eslint-plugin.svg?style=flat-square" alt="NPM Version" /></a>
+    <a href="https://www.npmjs.com/package/@typescript-eslint/eslint-plugin"><img src="https://img.shields.io/npm/dm/@typescript-eslint/eslint-plugin.svg?style=flat-square" alt="NPM Downloads" /></a>
+</p>
 
 ## Note
 
 This package has inherited its version number from the `@typescript-eslint` project.
-Meaning that even though this package is `1.x.y`, you shouldn't expect 100% stability between minor version bumps.
+Meaning that even though this package is `2.x.y`, you shouldn't expect 100% stability between minor version bumps.
 i.e. treat it as a `0.x.y` package.
 
 Feel free to use it now, and let us know what utilities you need or send us PRs with utilities you build on top of it.
 
-Once it is stable, it will be renamed to `@typescript-eslint/util` for a `2.0.0` release.
+Once it is stable, it will be renamed to `@typescript-eslint/util` for a `4.0.0` release.
 
 ## Exports
 
-| Name                                                                               | Description                                                                                    |
-| ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
-| [`TSESTree`](../packages/typescript-estree/src/ts-estree/ts-estree.ts)             | Types for the TypeScript flavor of ESTree created by `@typescript-eslint/typescript-estree`.   |
-| [`AST_NODE_TYPES`](../packages/typescript-estree/src/ts-estree/ast-node-types.ts)  | An enum with the names of every single _node_ found in `TSESTree`.                             |
-| [`AST_TOKEN_TYPES`](../packages/typescript-estree/src/ts-estree/ast-node-types.ts) | An enum with the names of every single _token_ found in `TSESTree`.                            |
-| [`TSESLint`](./src/ts-eslint)                                                      | Types for ESLint, correctly typed to work with the types found in `TSESTree`.                  |
-| [`ESLintUtils`](./src/eslint-utils)                                                | Tools for creating ESLint rules with TypeScript.                                               |
-| [`ParserServices`](../packages/typescript-estree/src/ts-estree/parser.ts)          | The parser services provided when parsing a file using `@typescript-eslint/typescript-estree`. |
+| Name                                                           | Description                                                                                                                                                                                                                       |
+| -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [`ASTUtils`](./src/ast-utils)                                  | Tools for operating on the ESTree AST. Also includes the [`eslint-utils`](https://www.npmjs.com/package/eslint-utils) package, correctly typed to work with the types found in `TSESTree`                                         |
+| [`ESLintUtils`](./src/eslint-utils)                            | Tools for creating ESLint rules with TypeScript.                                                                                                                                                                                  |
+| `JSONSchema`                                                   | Types from the [`@types/json-schema`](https://www.npmjs.com/package/@types/json-schema) package, re-exported to save you having to manually import them. Also ensures you're using the same version of the types as this package. |
+| [`TSESLint`](./src/ts-eslint)                                  | Types for ESLint, correctly typed to work with the types found in `TSESTree`.                                                                                                                                                     |
+| [`TSESLintScope`](./src/ts-eslint-scope)                       | The [`eslint-scope`](https://www.npmjs.com/package/eslint-scope) package, correctly typed to work with the types found in both `TSESTree` and `TSESLint`                                                                          |
+| [`TSESTree`](../types/src/ts-estree.ts)                        | Types for the TypeScript flavor of ESTree created by `@typescript-eslint/typescript-estree`.                                                                                                                                      |
+| [`AST_NODE_TYPES`](../types/src/ast-node-types.ts)             | An enum with the names of every single _node_ found in `TSESTree`.                                                                                                                                                                |
+| [`AST_TOKEN_TYPES`](../types/src/ast-token-types.ts)           | An enum with the names of every single _token_ found in `TSESTree`.                                                                                                                                                               |
+| [`ParserServices`](../typescript-estree/src/parser-options.ts) | Typing for the parser services provided when parsing a file using `@typescript-eslint/typescript-estree`.                                                                                                                         |
 
 ## Contributing
 
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/PatternMatcher.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/PatternMatcher.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/PatternMatcher.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/PatternMatcher.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/ReferenceTracker.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/ReferenceTracker.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/ReferenceTracker.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/ReferenceTracker.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/astUtilities.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/astUtilities.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/astUtilities.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/astUtilities.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/index.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/index.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/index.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/index.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/predicates.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/predicates.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/predicates.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/predicates.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/scopeAnalysis.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/scopeAnalysis.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/scopeAnalysis.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/eslint-utils/scopeAnalysis.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/index.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/index.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/index.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/index.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/misc.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/misc.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/misc.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/misc.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/predicates.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/predicates.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/predicates.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ast-utils/predicates.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/InferTypesFromRule.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/InferTypesFromRule.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/InferTypesFromRule.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/InferTypesFromRule.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/RuleCreator.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/RuleCreator.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/RuleCreator.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/RuleCreator.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/RuleTester.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/RuleTester.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/RuleTester.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/RuleTester.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/applyDefault.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/applyDefault.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/applyDefault.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/applyDefault.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/batchedSingleLineTests.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/batchedSingleLineTests.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/batchedSingleLineTests.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/batchedSingleLineTests.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/deepMerge.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/deepMerge.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/deepMerge.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/deepMerge.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/getParserServices.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/getParserServices.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/getParserServices.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/getParserServices.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/index.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/index.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/index.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/eslint-utils/index.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/index.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/index.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/index.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/index.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/json-schema.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/json-schema.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/json-schema.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/json-schema.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Definition.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Definition.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Definition.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Definition.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Options.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Options.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Options.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Options.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/PatternVisitor.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/PatternVisitor.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/PatternVisitor.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/PatternVisitor.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Reference.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Reference.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Reference.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Reference.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Referencer.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Referencer.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Referencer.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Referencer.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Scope.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Scope.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Scope.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Scope.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/ScopeManager.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/ScopeManager.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/ScopeManager.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/ScopeManager.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Variable.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Variable.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Variable.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/Variable.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/analyze.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/analyze.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/analyze.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/analyze.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/index.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/index.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/index.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint-scope/index.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/AST.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/AST.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/AST.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/AST.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/CLIEngine.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/CLIEngine.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/CLIEngine.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/CLIEngine.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/ESLint.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/ESLint.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/ESLint.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/ESLint.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Linter.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Linter.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Linter.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Linter.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/ParserOptions.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/ParserOptions.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/ParserOptions.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/ParserOptions.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Rule.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Rule.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Rule.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Rule.d.ts
diff --git a/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/RuleTester.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/RuleTester.d.ts
new file mode 100644
index 0000000..c8f5d2f
--- /dev/null
+++ b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/RuleTester.d.ts
@@ -0,0 +1,137 @@
+import { AST_NODE_TYPES, AST_TOKEN_TYPES } from '../ts-estree';
+import { ParserOptions } from './ParserOptions';
+import { RuleModule } from './Rule';
+interface ValidTestCase<TOptions extends Readonly<unknown[]>> {
+    /**
+     * Code for the test case.
+     */
+    readonly code: string;
+    /**
+     * Environments for the test case.
+     */
+    readonly env?: Readonly<Record<string, boolean>>;
+    /**
+     * The fake filename for the test case. Useful for rules that make assertion about filenames.
+     */
+    readonly filename?: string;
+    /**
+     * The additional global variables.
+     */
+    readonly globals?: Record<string, 'readonly' | 'writable' | 'off'>;
+    /**
+     * Options for the test case.
+     */
+    readonly options?: Readonly<TOptions>;
+    /**
+     * The absolute path for the parser.
+     */
+    readonly parser?: string;
+    /**
+     * Options for the parser.
+     */
+    readonly parserOptions?: Readonly<ParserOptions>;
+    /**
+     * Settings for the test case.
+     */
+    readonly settings?: Readonly<Record<string, unknown>>;
+}
+interface SuggestionOutput<TMessageIds extends string> {
+    /**
+     * Reported message ID.
+     */
+    readonly messageId: TMessageIds;
+    /**
+     * The data used to fill the message template.
+     */
+    readonly data?: Readonly<Record<string, unknown>>;
+    /**
+     * NOTE: Suggestions will be applied as a stand-alone change, without triggering multi-pass fixes.
+     * Each individual error has its own suggestion, so you have to show the correct, _isolated_ output for each suggestion.
+     */
+    readonly output: string;
+}
+interface InvalidTestCase<TMessageIds extends string, TOptions extends Readonly<unknown[]>> extends ValidTestCase<TOptions> {
+    /**
+     * Expected errors.
+     */
+    readonly errors: readonly TestCaseError<TMessageIds>[];
+    /**
+     * The expected code after autofixes are applied. If set to `null`, the test runner will assert that no autofix is suggested.
+     */
+    readonly output?: string | null;
+}
+interface TestCaseError<TMessageIds extends string> {
+    /**
+     * The 1-based column number of the reported start location.
+     */
+    readonly column?: number;
+    /**
+     * The data used to fill the message template.
+     */
+    readonly data?: Readonly<Record<string, unknown>>;
+    /**
+     * The 1-based column number of the reported end location.
+     */
+    readonly endColumn?: number;
+    /**
+     * The 1-based line number of the reported end location.
+     */
+    readonly endLine?: number;
+    /**
+     * The 1-based line number of the reported start location.
+     */
+    readonly line?: number;
+    /**
+     * Reported message ID.
+     */
+    readonly messageId: TMessageIds;
+    /**
+     * Reported suggestions.
+     */
+    readonly suggestions?: SuggestionOutput<TMessageIds>[] | null;
+    /**
+     * The type of the reported AST node.
+     */
+    readonly type?: AST_NODE_TYPES | AST_TOKEN_TYPES;
+}
+interface RunTests<TMessageIds extends string, TOptions extends Readonly<unknown[]>> {
+    readonly valid: readonly (ValidTestCase<TOptions> | string)[];
+    readonly invalid: readonly InvalidTestCase<TMessageIds, TOptions>[];
+}
+interface RuleTesterConfig {
+    readonly parser: string;
+    readonly parserOptions?: Readonly<ParserOptions>;
+}
+declare class RuleTesterBase {
+    /**
+     * Creates a new instance of RuleTester.
+     * @param testerConfig extra configuration for the tester
+     */
+    constructor(testerConfig?: RuleTesterConfig);
+    /**
+     * Adds a new rule test to execute.
+     * @param ruleName The name of the rule to run.
+     * @param rule The rule to test.
+     * @param test The collection of tests to run.
+     */
+    run<TMessageIds extends string, TOptions extends Readonly<unknown[]>>(ruleName: string, rule: RuleModule<TMessageIds, TOptions>, tests: RunTests<TMessageIds, TOptions>): void;
+    /**
+     * If you supply a value to this property, the rule tester will call this instead of using the version defined on
+     * the global namespace.
+     * @param text a string describing the rule
+     * @param callback the test callback
+     */
+    static describe?: (text: string, callback: () => void) => void;
+    /**
+     * If you supply a value to this property, the rule tester will call this instead of using the version defined on
+     * the global namespace.
+     * @param text a string describing the test case
+     * @param callback the test callback
+     */
+    static it?: (text: string, callback: () => void) => void;
+}
+declare const RuleTester_base: typeof RuleTesterBase;
+declare class RuleTester extends RuleTester_base {
+}
+export { InvalidTestCase, SuggestionOutput, RuleTester, RuleTesterConfig, RunTests, TestCaseError, ValidTestCase, };
+//# sourceMappingURL=RuleTester.d.ts.map
diff --git a/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Scope.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Scope.d.ts
new file mode 100644
index 0000000..57b425c
--- /dev/null
+++ b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Scope.d.ts
@@ -0,0 +1,46 @@
+import * as scopeManager from '@typescript-eslint/scope-manager';
+import { TSESTree } from '@typescript-eslint/types';
+declare namespace Scope {
+    class ESLintScopeVariable {
+        readonly defs: Definition[];
+        readonly identifiers: TSESTree.Identifier[];
+        readonly name: string;
+        readonly references: Reference[];
+        readonly scope: Scope;
+        /**
+         * Written to by ESLint.
+         * If this key exists, this variable is a global variable added by ESLint.
+         * If this is `true`, this variable can be assigned arbitrary values.
+         * If this is `false`, this variable is readonly.
+         */
+        writeable?: boolean;
+        /**
+         * Written to by ESLint.
+         * This property is undefined if there are no globals directive comments.
+         * The array of globals directive comments which defined this global variable in the source code file.
+         */
+        eslintExplicitGlobal?: boolean;
+        /**
+         * Written to by ESLint.
+         * The configured value in config files. This can be different from `variable.writeable` if there are globals directive comments.
+         */
+        eslintImplicitGlobalSetting?: 'readonly' | 'writable';
+        /**
+         * Written to by ESLint.
+         * If this key exists, it is a global variable added by ESLint.
+         * If `true`, this global variable was defined by a globals directive comment in the source code file.
+         */
+        eslintExplicitGlobalComments?: TSESTree.Comment[];
+    }
+    export type ScopeManager = scopeManager.ScopeManager;
+    export type Reference = scopeManager.Reference;
+    export type Variable = scopeManager.Variable | ESLintScopeVariable;
+    export type Scope = scopeManager.Scope;
+    export const ScopeType: typeof scopeManager.ScopeType;
+    export type DefinitionType = scopeManager.Definition;
+    export type Definition = scopeManager.Definition;
+    export const DefinitionType: typeof scopeManager.DefinitionType;
+    export {};
+}
+export { Scope };
+//# sourceMappingURL=Scope.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/SourceCode.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/SourceCode.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/SourceCode.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/SourceCode.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/index.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/index.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/index.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/index.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-estree.d.ts b/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-estree.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-estree.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-estree.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.js b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/PatternMatcher.js.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.js b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/ReferenceTracker.js.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.js b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/astUtilities.js.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.js b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/index.js.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.js b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/predicates.js.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.js b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils/scopeAnalysis.js.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.js b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/index.js.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.js b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/misc.js.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.js b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/predicates.js.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.js b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/InferTypesFromRule.js.map
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts
index 8b7158c..565a6a9 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts
@@ -3,11 +3,11 @@
 declare type CreateRuleMeta<TMessageIds extends string> = {
     docs: CreateRuleMetaDocs;
 } & Omit<RuleMetaData<TMessageIds>, 'docs'>;
-export declare function RuleCreator(urlCreator: (ruleName: string) => string): <TOptions extends unknown[], TMessageIds extends string, TRuleListener extends RuleListener = RuleListener>({ name, meta, defaultOptions, create, }: {
+declare function RuleCreator(urlCreator: (ruleName: string) => string): <TOptions extends readonly unknown[], TMessageIds extends string, TRuleListener extends RuleListener = RuleListener>({ name, meta, defaultOptions, create, }: Readonly<{
     name: string;
     meta: CreateRuleMeta<TMessageIds>;
-    defaultOptions: TOptions;
-    create: (context: RuleContext<TMessageIds, TOptions>, optionsWithDefault: TOptions) => TRuleListener;
-}) => RuleModule<TMessageIds, TOptions, TRuleListener>;
-export {};
+    defaultOptions: Readonly<TOptions>;
+    create: (context: Readonly<RuleContext<TMessageIds, TOptions>>, optionsWithDefault: Readonly<TOptions>) => TRuleListener;
+}>) => RuleModule<TMessageIds, TOptions, TRuleListener>;
+export { RuleCreator };
 //# sourceMappingURL=RuleCreator.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts.map
index fd10e53..2d86f2a 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"RuleCreator.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/RuleCreator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,UAAU,EACX,MAAM,mBAAmB,CAAC;AAI3B,aAAK,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AACxD,aAAK,cAAc,CAAC,WAAW,SAAS,MAAM,IAAI;IAChD,IAAI,EAAE,kBAAkB,CAAC;CAC1B,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;AAE5C,wBAAgB,WAAW,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM;;;;;uDAsCnE"}
\ No newline at end of file
+{"version":3,"file":"RuleCreator.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/RuleCreator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,UAAU,EACX,MAAM,mBAAmB,CAAC;AAI3B,aAAK,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AACxD,aAAK,cAAc,CAAC,WAAW,SAAS,MAAM,IAAI;IAChD,IAAI,EAAE,kBAAkB,CAAC;CAC1B,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;AAE5C,iBAAS,WAAW,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM;UAanD,MAAM;;;;wDA2Bf;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js
index a7f5999..cba8ed6 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js
@@ -1,5 +1,6 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.RuleCreator = void 0;
 const applyDefault_1 = require("./applyDefault");
 function RuleCreator(urlCreator) {
     // This function will get much easier to call when this is merged https://github.com/Microsoft/TypeScript/pull/26349
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js.map
index 1939fbb..cea4eb0 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js.map
@@ -1 +1 @@
-{"version":3,"file":"RuleCreator.js","sourceRoot":"","sources":["../../src/eslint-utils/RuleCreator.ts"],"names":[],"mappings":";;AAOA,iDAA8C;AAQ9C,SAAgB,WAAW,CAAC,UAAwC;IAClE,oHAAoH;IACpH,2FAA2F;IAC3F,OAAO,SAAS,UAAU,CAIxB,EACA,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,MAAM,GASP;QACC,OAAO;YACL,IAAI,kCACC,IAAI,KACP,IAAI,kCACC,IAAI,CAAC,IAAI,KACZ,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,MAExB;YACD,MAAM,CAAC,OAAO;gBACZ,MAAM,kBAAkB,GAAG,2BAAY,CACrC,cAAc,EACd,OAAO,CAAC,OAAO,CAChB,CAAC;gBACF,OAAO,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YAC7C,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAtCD,kCAsCC"}
\ No newline at end of file
+{"version":3,"file":"RuleCreator.js","sourceRoot":"","sources":["../../src/eslint-utils/RuleCreator.ts"],"names":[],"mappings":";;;AAOA,iDAA8C;AAQ9C,SAAS,WAAW,CAAC,UAAwC;IAC3D,oHAAoH;IACpH,2FAA2F;IAC3F,OAAO,SAAS,UAAU,CAIxB,EACA,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,MAAM,GASN;QACA,OAAO;YACL,IAAI,kCACC,IAAI,KACP,IAAI,kCACC,IAAI,CAAC,IAAI,KACZ,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,MAExB;YACD,MAAM,CACJ,OAAqD;gBAErD,MAAM,kBAAkB,GAAG,2BAAY,CACrC,cAAc,EACd,OAAO,CAAC,OAAO,CAChB,CAAC;gBACF,OAAO,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YAC7C,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAEQ,kCAAW"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.js b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleTester.js.map
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts
index bbee816..b92df58 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts
@@ -5,5 +5,6 @@
  * @param userOptions the user opts
  * @returns the options with defaults
  */
-export declare function applyDefault<TUser extends unknown[], TDefault extends TUser>(defaultOptions: TDefault, userOptions: TUser | null): TDefault;
+declare function applyDefault<TUser extends readonly unknown[], TDefault extends TUser>(defaultOptions: TDefault, userOptions: TUser | null): TDefault;
+export { applyDefault };
 //# sourceMappingURL=applyDefault.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts.map
index 69af49e..50c710e 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"applyDefault.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/applyDefault.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,QAAQ,SAAS,KAAK,EAC1E,cAAc,EAAE,QAAQ,EACxB,WAAW,EAAE,KAAK,GAAG,IAAI,GACxB,QAAQ,CAqBV"}
\ No newline at end of file
+{"version":3,"file":"applyDefault.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/applyDefault.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,iBAAS,YAAY,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EAAE,QAAQ,SAAS,KAAK,EAC5E,cAAc,EAAE,QAAQ,EACxB,WAAW,EAAE,KAAK,GAAG,IAAI,GACxB,QAAQ,CAuBV;AAMD,OAAO,EAAE,YAAY,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js
index 3519fc7..6ae1a79 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js
@@ -1,5 +1,6 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.applyDefault = void 0;
 const deepMerge_1 = require("./deepMerge");
 /**
  * Pure function - doesn't mutate either parameter!
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js.map
index 3de41a5..797a3b5 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js.map
@@ -1 +1 @@
-{"version":3,"file":"applyDefault.js","sourceRoot":"","sources":["../../src/eslint-utils/applyDefault.ts"],"names":[],"mappings":";;AAAA,2CAA0D;AAE1D;;;;;;GAMG;AACH,SAAgB,YAAY,CAC1B,cAAwB,EACxB,WAAyB;IAEzB,iBAAiB;IACjB,MAAM,OAAO,GAAa,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;IAErE,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE;QACrD,OAAO,OAAO,CAAC;KAChB;IAED,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACzB,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;YAChC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAE/B,IAAI,4BAAgB,CAAC,OAAO,CAAC,IAAI,4BAAgB,CAAC,GAAG,CAAC,EAAE;gBACtD,OAAO,CAAC,CAAC,CAAC,GAAG,qBAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;aACtC;iBAAM;gBACL,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;aACtB;SACF;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAxBD,oCAwBC"}
\ No newline at end of file
+{"version":3,"file":"applyDefault.js","sourceRoot":"","sources":["../../src/eslint-utils/applyDefault.ts"],"names":[],"mappings":";;;AAAA,2CAA0D;AAE1D;;;;;;GAMG;AACH,SAAS,YAAY,CACnB,cAAwB,EACxB,WAAyB;IAEzB,iBAAiB;IACjB,MAAM,OAAO,GAAwB,IAAI,CAAC,KAAK,CAC7C,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAC/B,CAAC;IAEF,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE;QACrD,OAAO,OAAO,CAAC;KAChB;IAED,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACzB,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;YAChC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAE/B,IAAI,4BAAgB,CAAC,OAAO,CAAC,IAAI,4BAAgB,CAAC,GAAG,CAAC,EAAE;gBACtD,OAAO,CAAC,CAAC,CAAC,GAAG,qBAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;aACtC;iBAAM;gBACL,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;aACtB;SACF;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAMQ,oCAAY"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js
index 31ce405..7ff9390 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js
@@ -1,5 +1,6 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.batchedSingleLineTests = void 0;
 function batchedSingleLineTests(options) {
     // eslint counts lines from 1
     const lineOffset = options.code.startsWith('\n') ? 2 : 1;
@@ -10,13 +11,12 @@
         .trim()
         .split('\n')
         .map((code, i) => {
-        var _a;
         const lineNum = i + lineOffset;
         const errors = 'errors' in options
             ? options.errors.filter(e => e.line === lineNum)
             : [];
         const returnVal = Object.assign(Object.assign({}, options), { code, errors: errors.map(e => (Object.assign(Object.assign({}, e), { line: 1 }))) });
-        if ((_a = output) === null || _a === void 0 ? void 0 : _a[i]) {
+        if (output === null || output === void 0 ? void 0 : output[i]) {
             return Object.assign(Object.assign({}, returnVal), { output: output[i] });
         }
         return returnVal;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js.map
index 2bb0224..31f68d6 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js.map
@@ -1 +1 @@
-{"version":3,"file":"batchedSingleLineTests.js","sourceRoot":"","sources":["../../src/eslint-utils/batchedSingleLineTests.ts"],"names":[],"mappings":";;AA8BA,SAAS,sBAAsB,CAI7B,OAAyE;IAEzE,6BAA6B;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GACV,QAAQ,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM;QACnC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC;IACX,OAAO,OAAO,CAAC,IAAI;SAChB,IAAI,EAAE;SACN,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;;QACf,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC;QAC/B,MAAM,MAAM,GACV,QAAQ,IAAI,OAAO;YACjB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;YAChD,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,SAAS,mCACV,OAAO,KACV,IAAI,EACJ,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iCACnB,CAAC,KACJ,IAAI,EAAE,CAAC,IACP,CAAC,GACJ,CAAC;QACF,UAAI,MAAM,0CAAG,CAAC,GAAG;YACf,uCACK,SAAS,KACZ,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IACjB;SACH;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACP,CAAC;AAEQ,wDAAsB"}
\ No newline at end of file
+{"version":3,"file":"batchedSingleLineTests.js","sourceRoot":"","sources":["../../src/eslint-utils/batchedSingleLineTests.ts"],"names":[],"mappings":";;;AA8BA,SAAS,sBAAsB,CAI7B,OAAyE;IAEzE,6BAA6B;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GACV,QAAQ,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM;QACnC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC;IACX,OAAO,OAAO,CAAC,IAAI;SAChB,IAAI,EAAE;SACN,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACf,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC;QAC/B,MAAM,MAAM,GACV,QAAQ,IAAI,OAAO;YACjB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;YAChD,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,SAAS,mCACV,OAAO,KACV,IAAI,EACJ,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iCACnB,CAAC,KACJ,IAAI,EAAE,CAAC,IACP,CAAC,GACJ,CAAC;QACF,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,CAAC,GAAG;YACf,uCACK,SAAS,KACZ,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IACjB;SACH;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACP,CAAC;AAEQ,wDAAsB"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts
index b09d1fa..9650020 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts
@@ -4,7 +4,7 @@
  * @param obj an object
  * @returns `true` if obj is an object
  */
-export declare function isObjectNotArray<T extends ObjectLike>(obj: unknown | unknown[]): obj is T;
+declare function isObjectNotArray<T extends ObjectLike>(obj: unknown | unknown[]): obj is T;
 /**
  * Pure function - doesn't mutate either parameter!
  * Merges two objects together deeply, overwriting the properties in first with the properties in second
@@ -13,5 +13,5 @@
  * @returns a new object
  */
 export declare function deepMerge(first?: ObjectLike, second?: ObjectLike): Record<string, unknown>;
-export {};
+export { isObjectNotArray };
 //# sourceMappingURL=deepMerge.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts.map
index 93c6cd6..769f39c 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"deepMerge.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/deepMerge.ts"],"names":[],"mappings":"AAAA,aAAK,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,UAAU,EACnD,GAAG,EAAE,OAAO,GAAG,OAAO,EAAE,GACvB,GAAG,IAAI,CAAC,CAEV;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,KAAK,GAAE,UAAe,EACtB,MAAM,GAAE,UAAe,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0BzB"}
\ No newline at end of file
+{"version":3,"file":"deepMerge.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/deepMerge.ts"],"names":[],"mappings":"AAAA,aAAK,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAEjD;;;;GAIG;AACH,iBAAS,gBAAgB,CAAC,CAAC,SAAS,UAAU,EAC5C,GAAG,EAAE,OAAO,GAAG,OAAO,EAAE,GACvB,GAAG,IAAI,CAAC,CAEV;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,KAAK,GAAE,UAAe,EACtB,MAAM,GAAE,UAAe,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0BzB;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js
index 6df1ceb..34fdffc 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js
@@ -1,5 +1,6 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.isObjectNotArray = exports.deepMerge = void 0;
 /**
  * Check if the variable contains an object strictly rejecting arrays
  * @param obj an object
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js.map
index 34941bd..7ee4604 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js.map
@@ -1 +1 @@
-{"version":3,"file":"deepMerge.js","sourceRoot":"","sources":["../../src/eslint-utils/deepMerge.ts"],"names":[],"mappings":";;AAEA;;;;GAIG;AACH,SAAgB,gBAAgB,CAC9B,GAAwB;IAExB,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC;AAJD,4CAIC;AAED;;;;;;GAMG;AACH,SAAgB,SAAS,CACvB,QAAoB,EAAE,EACtB,SAAqB,EAAE;IAEvB,iDAAiD;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAErE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1C,MAAM,WAAW,GAAG,GAAG,IAAI,KAAK,CAAC;QACjC,MAAM,YAAY,GAAG,GAAG,IAAI,MAAM,CAAC;QACnC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,WAAW,IAAI,YAAY,EAAE;YAC/B,IAAI,gBAAgB,CAAC,UAAU,CAAC,IAAI,gBAAgB,CAAC,WAAW,CAAC,EAAE;gBACjE,cAAc;gBACd,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;aAC/C;iBAAM;gBACL,aAAa;gBACb,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;aACxB;SACF;aAAM,IAAI,WAAW,EAAE;YACtB,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;SACvB;aAAM;YACL,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;SACxB;QAED,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAgB,CAAC,CAAC;AACvB,CAAC;AA7BD,8BA6BC"}
\ No newline at end of file
+{"version":3,"file":"deepMerge.js","sourceRoot":"","sources":["../../src/eslint-utils/deepMerge.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,SAAS,gBAAgB,CACvB,GAAwB;IAExB,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC;AAwCQ,4CAAgB;AAtCzB;;;;;;GAMG;AACH,SAAgB,SAAS,CACvB,QAAoB,EAAE,EACtB,SAAqB,EAAE;IAEvB,iDAAiD;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAErE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAa,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACtD,MAAM,WAAW,GAAG,GAAG,IAAI,KAAK,CAAC;QACjC,MAAM,YAAY,GAAG,GAAG,IAAI,MAAM,CAAC;QACnC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,WAAW,IAAI,YAAY,EAAE;YAC/B,IAAI,gBAAgB,CAAC,UAAU,CAAC,IAAI,gBAAgB,CAAC,WAAW,CAAC,EAAE;gBACjE,cAAc;gBACd,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;aAC/C;iBAAM;gBACL,aAAa;gBACb,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;aACxB;SACF;aAAM,IAAI,WAAW,EAAE;YACtB,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;SACvB;aAAM;YACL,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;SACxB;QAED,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AA7BD,8BA6BC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts
index ad9926c..98626f4 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts
@@ -1,10 +1,8 @@
-import { ParserServices, TSESLint } from '../';
-declare type RequiredParserServices = {
-    [k in keyof ParserServices]: Exclude<ParserServices[k], undefined>;
-};
+import * as TSESLint from '../ts-eslint';
+import { ParserServices } from '../ts-estree';
 /**
  * Try to retrieve typescript parser service from context
  */
-export declare function getParserServices<TMessageIds extends string, TOptions extends unknown[]>(context: TSESLint.RuleContext<TMessageIds, TOptions>): RequiredParserServices;
-export {};
+declare function getParserServices<TMessageIds extends string, TOptions extends readonly unknown[]>(context: Readonly<TSESLint.RuleContext<TMessageIds, TOptions>>, allowWithoutFullTypeInformation?: boolean): ParserServices;
+export { getParserServices };
 //# sourceMappingURL=getParserServices.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts.map
index 7e76cfb..52fea2c 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"getParserServices.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/getParserServices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAK/C,aAAK,sBAAsB,GAAG;KAC3B,CAAC,IAAI,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;CACnE,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,SAAS,MAAM,EAC1B,QAAQ,SAAS,OAAO,EAAE,EAE1B,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,GACnD,sBAAsB,CAaxB"}
\ No newline at end of file
+{"version":3,"file":"getParserServices.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/getParserServices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAK9C;;GAEG;AACH,iBAAS,iBAAiB,CACxB,WAAW,SAAS,MAAM,EAC1B,QAAQ,SAAS,SAAS,OAAO,EAAE,EAEnC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,EAC9D,+BAA+B,UAAQ,GACtC,cAAc,CAuBhB;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js
index 5e7862b..09302fd 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js
@@ -1,17 +1,25 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.getParserServices = void 0;
 const ERROR_MESSAGE = 'You have used a rule which requires parserServices to be generated. You must therefore provide a value for the "parserOptions.project" property for @typescript-eslint/parser.';
 /**
  * Try to retrieve typescript parser service from context
  */
-function getParserServices(context) {
+function getParserServices(context, allowWithoutFullTypeInformation = false) {
+    var _a;
+    // backwards compatibility check
+    // old versions of the parser would not return any parserServices unless parserOptions.project was set
     if (!context.parserServices ||
         !context.parserServices.program ||
-        !context.parserServices.esTreeNodeToTSNodeMap) {
-        /**
-         * The user needs to have configured "project" in their parserOptions
-         * for @typescript-eslint/parser
-         */
+        !context.parserServices.esTreeNodeToTSNodeMap ||
+        !context.parserServices.tsNodeToESTreeNodeMap) {
+        throw new Error(ERROR_MESSAGE);
+    }
+    const hasFullTypeInformation = (_a = context.parserServices.hasFullTypeInformation) !== null && _a !== void 0 ? _a : 
+    /* backwards compatible */ true;
+    // if a rule requires full type information, then hard fail if it doesn't exist
+    // this forces the user to supply parserOptions.project
+    if (!hasFullTypeInformation && !allowWithoutFullTypeInformation) {
         throw new Error(ERROR_MESSAGE);
     }
     return context.parserServices;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js.map
index 2fc7ad2..4d40125 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js.map
@@ -1 +1 @@
-{"version":3,"file":"getParserServices.js","sourceRoot":"","sources":["../../src/eslint-utils/getParserServices.ts"],"names":[],"mappings":";;AAEA,MAAM,aAAa,GACjB,gLAAgL,CAAC;AAMnL;;GAEG;AACH,SAAgB,iBAAiB,CAI/B,OAAoD;IAEpD,IACE,CAAC,OAAO,CAAC,cAAc;QACvB,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO;QAC/B,CAAC,OAAO,CAAC,cAAc,CAAC,qBAAqB,EAC7C;QACA;;;WAGG;QACH,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;KAChC;IACD,OAAO,OAAO,CAAC,cAAwC,CAAC;AAC1D,CAAC;AAlBD,8CAkBC"}
\ No newline at end of file
+{"version":3,"file":"getParserServices.js","sourceRoot":"","sources":["../../src/eslint-utils/getParserServices.ts"],"names":[],"mappings":";;;AAGA,MAAM,aAAa,GACjB,gLAAgL,CAAC;AAEnL;;GAEG;AACH,SAAS,iBAAiB,CAIxB,OAA8D,EAC9D,+BAA+B,GAAG,KAAK;;IAEvC,gCAAgC;IAChC,sGAAsG;IACtG,IACE,CAAC,OAAO,CAAC,cAAc;QACvB,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO;QAC/B,CAAC,OAAO,CAAC,cAAc,CAAC,qBAAqB;QAC7C,CAAC,OAAO,CAAC,cAAc,CAAC,qBAAqB,EAC7C;QACA,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;KAChC;IAED,MAAM,sBAAsB,SAC1B,OAAO,CAAC,cAAc,CAAC,sBAAsB;IAC7C,0BAA0B,CAAC,IAAI,CAAC;IAElC,+EAA+E;IAC/E,uDAAuD;IACvD,IAAI,CAAC,sBAAsB,IAAI,CAAC,+BAA+B,EAAE;QAC/D,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;KAChC;IAED,OAAO,OAAO,CAAC,cAAc,CAAC;AAChC,CAAC;AAEQ,8CAAiB"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts
index 512f280..8cdfcb0 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts
@@ -1,6 +1,8 @@
 export * from './applyDefault';
 export * from './batchedSingleLineTests';
 export * from './getParserServices';
+export * from './InferTypesFromRule';
 export * from './RuleCreator';
+export * from './RuleTester';
 export * from './deepMerge';
 //# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts.map
index 7af1995..7aca90d 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
\ No newline at end of file
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js
index dc41bf3..dde280d 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js
@@ -1,11 +1,20 @@
 "use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
 Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("./applyDefault"));
-__export(require("./batchedSingleLineTests"));
-__export(require("./getParserServices"));
-__export(require("./RuleCreator"));
-__export(require("./deepMerge"));
+__exportStar(require("./applyDefault"), exports);
+__exportStar(require("./batchedSingleLineTests"), exports);
+__exportStar(require("./getParserServices"), exports);
+__exportStar(require("./InferTypesFromRule"), exports);
+__exportStar(require("./RuleCreator"), exports);
+__exportStar(require("./RuleTester"), exports);
+__exportStar(require("./deepMerge"), exports);
 //# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js.map
index 2f54b5b..f24be47 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eslint-utils/index.ts"],"names":[],"mappings":";;;;;AAAA,oCAA+B;AAC/B,8CAAyC;AACzC,yCAAoC;AACpC,mCAA8B;AAC9B,iCAA4B"}
\ No newline at end of file
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eslint-utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAA+B;AAC/B,2DAAyC;AACzC,sDAAoC;AACpC,uDAAqC;AACrC,gDAA8B;AAC9B,+CAA6B;AAC7B,8CAA4B"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts
index 43f41b7..b8a60a9 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts
@@ -1,8 +1,8 @@
+import * as ASTUtils from './ast-utils';
 import * as ESLintUtils from './eslint-utils';
+import * as JSONSchema from './json-schema';
 import * as TSESLint from './ts-eslint';
 import * as TSESLintScope from './ts-eslint-scope';
-import * as JSONSchema from './json-schema';
-export { ESLintUtils, JSONSchema, TSESLint, TSESLintScope };
-export { AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree, } from '@typescript-eslint/typescript-estree/dist/ts-estree';
-export { ParserServices } from '@typescript-eslint/typescript-estree/dist/parser-options';
+export { ASTUtils, ESLintUtils, JSONSchema, TSESLint, TSESLintScope };
+export * from './ts-estree';
 //# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts.map
index 4e4d616..822db07 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AAQ5D,OAAO,EACL,cAAc,EACd,eAAe,EACf,QAAQ,GACT,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC"}
\ No newline at end of file
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,UAAU,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AACtE,cAAc,aAAa,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/index.js b/node_modules/@typescript-eslint/experimental-utils/dist/index.js
index b502f73..ef12e06 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/index.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/index.js
@@ -1,27 +1,37 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.TSESLintScope = exports.TSESLint = exports.JSONSchema = exports.ESLintUtils = exports.ASTUtils = void 0;
+const ASTUtils = __importStar(require("./ast-utils"));
+exports.ASTUtils = ASTUtils;
 const ESLintUtils = __importStar(require("./eslint-utils"));
 exports.ESLintUtils = ESLintUtils;
+const JSONSchema = __importStar(require("./json-schema"));
+exports.JSONSchema = JSONSchema;
 const TSESLint = __importStar(require("./ts-eslint"));
 exports.TSESLint = TSESLint;
 const TSESLintScope = __importStar(require("./ts-eslint-scope"));
 exports.TSESLintScope = TSESLintScope;
-const JSONSchema = __importStar(require("./json-schema"));
-exports.JSONSchema = JSONSchema;
-// for convenience's sake - export the types directly from here so consumers
-// don't need to reference/install both packages in their code
-// NOTE - this uses hard links inside ts-estree to avoid initialization of entire package
-//        via its main file (which imports typescript at runtime).
-//        Not every eslint-plugin written in typescript requires typescript at runtime.
-var ts_estree_1 = require("@typescript-eslint/typescript-estree/dist/ts-estree");
-exports.AST_NODE_TYPES = ts_estree_1.AST_NODE_TYPES;
-exports.AST_TOKEN_TYPES = ts_estree_1.AST_TOKEN_TYPES;
-exports.TSESTree = ts_estree_1.TSESTree;
+__exportStar(require("./ts-estree"), exports);
 //# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/index.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/index.js.map
index c3c8160..b500da1 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/index.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,4DAA8C;AAKrC,kCAAW;AAJpB,sDAAwC;AAIN,4BAAQ;AAH1C,iEAAmD;AAGP,sCAAa;AAFzD,0DAA4C;AAEtB,gCAAU;AAEhC,4EAA4E;AAC5E,8DAA8D;AAE9D,yFAAyF;AACzF,kEAAkE;AAClE,uFAAuF;AACvF,iFAI6D;AAH3D,qCAAA,cAAc,CAAA;AACd,sCAAA,eAAe,CAAA;AACf,+BAAA,QAAQ,CAAA"}
\ No newline at end of file
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAAwC;AAM/B,4BAAQ;AALjB,4DAA8C;AAK3B,kCAAW;AAJ9B,0DAA4C;AAIZ,gCAAU;AAH1C,sDAAwC;AAGI,4BAAQ;AAFpD,iEAAmD;AAEG,sCAAa;AACnE,8CAA4B"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts
index 26619fa..bd6f29c 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts
@@ -1,2 +1,2 @@
-export * from 'json-schema';
+export { JSONSchema4, JSONSchema4Type, JSONSchema4TypeName, JSONSchema4Version, JSONSchema6, JSONSchema6Definition, JSONSchema6Type, JSONSchema6TypeName, JSONSchema6Version, JSONSchema7, JSONSchema7Array, JSONSchema7Definition, JSONSchema7Type, JSONSchema7TypeName, JSONSchema7Version, ValidationError, ValidationResult, } from 'json-schema';
 //# sourceMappingURL=json-schema.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts.map
index 37965b4..845788b 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"json-schema.d.ts","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
\ No newline at end of file
+{"version":3,"file":"json-schema.d.ts","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js b/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js
index 2d8f98d..289fb57 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js
@@ -1,3 +1,6 @@
 "use strict";
+// Note - @types/json-schema@7.0.4 added some function declarations to the type package
+// If we do export *, then it will also export these function declarations.
+// This will cause typescript to not scrub the require from the build, breaking anyone who doesn't have it as a dependency
 Object.defineProperty(exports, "__esModule", { value: true });
 //# sourceMappingURL=json-schema.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js.map
index d826a14..51d0b02 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js.map
@@ -1 +1 @@
-{"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":""}
\ No newline at end of file
+{"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":";AAAA,uFAAuF;AACvF,2EAA2E;AAC3E,0HAA0H"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts
index a42899e..bcaf94a 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts
@@ -1,4 +1,4 @@
-import { TSESTree } from '@typescript-eslint/typescript-estree';
+import { TSESTree } from '../ts-estree';
 interface Definition {
     type: string;
     name: TSESTree.BindingName;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts.map
index fea0bd8..ab9c638 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Definition.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAMhE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC;IAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AACD,UAAU,qBAAqB;IAC7B,KACE,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,YAAY,EAClD,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,EAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,UAAU,CAAC;CACf;AACD,QAAA,MAAM,UAAU,uBAA4C,CAAC;AAG7D,UAAU,mBAAoB,SAAQ,UAAU;CAAG;AACnD,QAAA,MAAM,mBAAmB,gKAOxB,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC"}
\ No newline at end of file
+{"version":3,"file":"Definition.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Definition.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC;IAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AACD,UAAU,qBAAqB;IAC7B,KACE,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,YAAY,EAClD,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,EAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,UAAU,CAAC;CACf;AACD,QAAA,MAAM,UAAU,uBAA4C,CAAC;AAG7D,UAAU,mBAAoB,SAAQ,UAAU;CAAG;AACnD,QAAA,MAAM,mBAAmB,sCAEf,SAAS,IAAI,QACb,SAAS,IAAI,oEAGlB,mBAAmB,CACvB,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js
index 46d90a0..dd3de1f 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js
@@ -1,5 +1,6 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.ParameterDefinition = exports.Definition = void 0;
 const definition_1 = require("eslint-scope/lib/definition");
 const Definition = definition_1.Definition;
 exports.Definition = Definition;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js.map
index 99c0988..fa19c8c 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js.map
@@ -1 +1 @@
-{"version":3,"file":"Definition.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Definition.ts"],"names":[],"mappings":";;AACA,4DAGqC;AAqBrC,MAAM,UAAU,GAAG,uBAAyC,CAAC;AAapD,gCAAU;AATnB,MAAM,mBAAmB,GAAG,gCAO3B,CAAC;AAEmB,kDAAmB"}
\ No newline at end of file
+{"version":3,"file":"Definition.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Definition.ts"],"names":[],"mappings":";;;AAAA,4DAGqC;AAsBrC,MAAM,UAAU,GAAG,uBAAyC,CAAC;AAapD,gCAAU;AATnB,MAAM,mBAAmB,GAAG,gCAO3B,CAAC;AAEmB,kDAAmB"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts
index f87c44d..48ce3c5 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts
@@ -1,4 +1,4 @@
-import { TSESTree } from '@typescript-eslint/typescript-estree';
+import { TSESTree } from '../ts-estree';
 declare type PatternVisitorCallback = (pattern: TSESTree.Identifier, info: {
     rest: boolean;
     topLevel: boolean;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts.map
index b505a49..fae66aa 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Options.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAEhE,aAAK,sBAAsB,GAAG,CAC5B,OAAO,EAAE,QAAQ,CAAC,UAAU,EAC5B,IAAI,EAAE;IACJ,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;CAC3C,KACE,IAAI,CAAC;AAEV,UAAU,qBAAqB;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,UAAU,OAAO;IACf,aAAa,CAAC,CAAC,SAAS,QAAQ,CAAC,QAAQ,GAAG,SAAS,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAC9E,KAAK,CAAC,CAAC,SAAS,QAAQ,CAAC,QAAQ,GAAG,SAAS,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;CACvE;AAED,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC"}
\ No newline at end of file
+{"version":3,"file":"Options.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,aAAK,sBAAsB,GAAG,CAC5B,OAAO,EAAE,QAAQ,CAAC,UAAU,EAC5B,IAAI,EAAE;IACJ,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;CAC3C,KACE,IAAI,CAAC;AAEV,UAAU,qBAAqB;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,UAAU,OAAO;IACf,aAAa,CAAC,CAAC,SAAS,QAAQ,CAAC,QAAQ,GAAG,SAAS,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAC9E,KAAK,CAAC,CAAC,SAAS,QAAQ,CAAC,QAAQ,GAAG,SAAS,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;CACvE;AAED,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts
index 32127a0..e21224b 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts
@@ -1,4 +1,4 @@
-import { TSESTree } from '@typescript-eslint/typescript-estree';
+import { TSESTree } from '../ts-estree';
 import { ScopeManager } from './ScopeManager';
 import { PatternVisitorCallback, PatternVisitorOptions, Visitor } from './Options';
 interface PatternVisitor extends Visitor {
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts.map
index 4949422..eec5b0b 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"PatternVisitor.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/PatternVisitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,OAAO,EACR,MAAM,WAAW,CAAC;AAEnB,UAAU,cAAe,SAAQ,OAAO;IACtC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;IACvB,cAAc,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEhC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACxC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3C,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAChD,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC1C,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC5C,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACzC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3C,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAChD,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;CAC3C;AACD,QAAA,MAAM,cAAc;;;CASnB,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
\ No newline at end of file
+{"version":3,"file":"PatternVisitor.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/PatternVisitor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,OAAO,EACR,MAAM,WAAW,CAAC;AAEnB,UAAU,cAAe,SAAQ,OAAO;IACtC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;IACvB,cAAc,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEhC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACxC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3C,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAChD,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC1C,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC5C,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACzC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3C,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAChD,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;CAC3C;AACD,QAAA,MAAM,cAAc;kBAEP,qBAAqB,eACjB,SAAS,QAAQ,YACpB,sBAAsB,GAC/B,cAAc;oBAGD,SAAS,IAAI,GAAG,OAAO;CACxC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js
index 9682bd0..43aa849 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js
@@ -3,6 +3,7 @@
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.PatternVisitor = void 0;
 const pattern_visitor_1 = __importDefault(require("eslint-scope/lib/pattern-visitor"));
 const PatternVisitor = pattern_visitor_1.default;
 exports.PatternVisitor = PatternVisitor;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js.map
index 631dd9e..e08efc8 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js.map
@@ -1 +1 @@
-{"version":3,"file":"PatternVisitor.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/PatternVisitor.ts"],"names":[],"mappings":";;;;;AACA,uFAAoE;AAyBpE,MAAM,cAAc,GAAG,yBAStB,CAAC;AAEO,wCAAc"}
\ No newline at end of file
+{"version":3,"file":"PatternVisitor.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/PatternVisitor.ts"],"names":[],"mappings":";;;;;;AAAA,uFAAoE;AA0BpE,MAAM,cAAc,GAAG,yBAStB,CAAC;AAEO,wCAAc"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts
index 27b24a5..0d479b3 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts
@@ -1,4 +1,4 @@
-import { TSESTree } from '@typescript-eslint/typescript-estree';
+import { TSESTree } from '../ts-estree';
 import { Scope } from './Scope';
 import { Variable } from './Variable';
 export declare type ReferenceFlag = 0x1 | 0x2 | 0x3;
@@ -19,10 +19,10 @@
     isReadWrite(): boolean;
 }
 declare const Reference: {
-    new (identifier: TSESTree.Identifier, scope: Scope, flag?: 1 | 2 | 3 | undefined, writeExpr?: TSESTree.ArrayExpression | TSESTree.ArrayPattern | TSESTree.ArrowFunctionExpression | TSESTree.AssignmentExpression | TSESTree.AssignmentPattern | TSESTree.AwaitExpression | TSESTree.BigIntLiteral | TSESTree.BinaryExpression | TSESTree.BlockStatement | TSESTree.BreakStatement | TSESTree.CallExpression | TSESTree.CatchClause | TSESTree.ClassBody | TSESTree.ClassDeclaration | TSESTree.ClassExpression | TSESTree.ClassPropertyComputedName | TSESTree.ClassPropertyNonComputedName | TSESTree.ConditionalExpression | TSESTree.ContinueStatement | TSESTree.DebuggerStatement | TSESTree.Decorator | TSESTree.DoWhileStatement | TSESTree.EmptyStatement | TSESTree.ExportAllDeclaration | TSESTree.ExportDefaultDeclaration | TSESTree.ExportNamedDeclaration | TSESTree.ExportSpecifier | TSESTree.ExpressionStatement | TSESTree.ForInStatement | TSESTree.ForOfStatement | TSESTree.ForStatement | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.Identifier | TSESTree.IfStatement | TSESTree.Import | TSESTree.ImportDeclaration | TSESTree.ImportDefaultSpecifier | TSESTree.ImportNamespaceSpecifier | TSESTree.ImportSpecifier | TSESTree.JSXAttribute | TSESTree.JSXClosingElement | TSESTree.JSXClosingFragment | TSESTree.JSXElement | TSESTree.JSXEmptyExpression | TSESTree.JSXExpressionContainer | TSESTree.JSXFragment | TSESTree.JSXIdentifier | TSESTree.JSXOpeningElement | TSESTree.JSXOpeningFragment | TSESTree.JSXSpreadAttribute | TSESTree.JSXSpreadChild | TSESTree.JSXMemberExpression | TSESTree.JSXText | TSESTree.LabeledStatement | TSESTree.BooleanLiteral | TSESTree.NumberLiteral | TSESTree.NullLiteral | TSESTree.RegExpLiteral | TSESTree.StringLiteral | TSESTree.LogicalExpression | TSESTree.MemberExpressionComputedName | TSESTree.MemberExpressionNonComputedName | TSESTree.MetaProperty | TSESTree.MethodDefinitionComputedName | TSESTree.MethodDefinitionNonComputedName | TSESTree.NewExpression | TSESTree.ObjectExpression | TSESTree.ObjectPattern | TSESTree.OptionalCallExpression | TSESTree.OptionalMemberExpressionComputedName | TSESTree.OptionalMemberExpressionNonComputedName | TSESTree.Program | TSESTree.PropertyComputedName | TSESTree.PropertyNonComputedName | TSESTree.RestElement | TSESTree.ReturnStatement | TSESTree.SequenceExpression | TSESTree.SpreadElement | TSESTree.Super | TSESTree.SwitchCase | TSESTree.SwitchStatement | TSESTree.TaggedTemplateExpression | TSESTree.TemplateElement | TSESTree.TemplateLiteral | TSESTree.ThisExpression | TSESTree.ThrowStatement | TSESTree.TryStatement | TSESTree.TSAbstractClassPropertyComputedName | TSESTree.TSAbstractClassPropertyNonComputedName | TSESTree.TSAbstractKeyword | TSESTree.TSAbstractMethodDefinitionComputedName | TSESTree.TSAbstractMethodDefinitionNonComputedName | TSESTree.TSAnyKeyword | TSESTree.TSArrayType | TSESTree.TSAsExpression | TSESTree.TSAsyncKeyword | TSESTree.TSBigIntKeyword | TSESTree.TSBooleanKeyword | TSESTree.TSCallSignatureDeclaration | TSESTree.TSClassImplements | TSESTree.TSConditionalType | TSESTree.TSConstructorType | TSESTree.TSConstructSignatureDeclaration | TSESTree.TSDeclareFunction | TSESTree.TSDeclareKeyword | TSESTree.TSEmptyBodyFunctionExpression | TSESTree.TSEnumDeclaration | TSESTree.TSEnumMemberComputedName | TSESTree.TSEnumMemberNonComputedName | TSESTree.TSExportAssignment | TSESTree.TSExportKeyword | TSESTree.TSExternalModuleReference | TSESTree.TSFunctionType | TSESTree.TSImportEqualsDeclaration | TSESTree.TSImportType | TSESTree.TSIndexedAccessType | TSESTree.TSIndexSignature | TSESTree.TSInferType | TSESTree.TSInterfaceDeclaration | TSESTree.TSInterfaceBody | TSESTree.TSInterfaceHeritage | TSESTree.TSIntersectionType | TSESTree.TSLiteralType | TSESTree.TSMappedType | TSESTree.TSMethodSignatureComputedName | TSESTree.TSMethodSignatureNonComputedName | TSESTree.TSModuleBlock | TSESTree.TSModuleDeclaration | TSESTree.TSNamespaceExportDeclaration | TSESTree.TSNeverKeyword | TSESTree.TSNonNullExpression | TSESTree.TSNullKeyword | TSESTree.TSNumberKeyword | TSESTree.TSObjectKeyword | TSESTree.TSOptionalType | TSESTree.TSParameterProperty | TSESTree.TSParenthesizedType | TSESTree.TSPropertySignatureComputedName | TSESTree.TSPropertySignatureNonComputedName | TSESTree.TSPublicKeyword | TSESTree.TSPrivateKeyword | TSESTree.TSProtectedKeyword | TSESTree.TSQualifiedName | TSESTree.TSReadonlyKeyword | TSESTree.TSRestType | TSESTree.TSStaticKeyword | TSESTree.TSStringKeyword | TSESTree.TSSymbolKeyword | TSESTree.TSThisType | TSESTree.TSTupleType | TSESTree.TSTypeAliasDeclaration | TSESTree.TSTypeAnnotation | TSESTree.TSTypeAssertion | TSESTree.TSTypeLiteral | TSESTree.TSTypeOperator | TSESTree.TSTypeParameter | TSESTree.TSTypeParameterDeclaration | TSESTree.TSTypeParameterInstantiation | TSESTree.TSTypePredicate | TSESTree.TSTypeQuery | TSESTree.TSTypeReference | TSESTree.TSUndefinedKeyword | TSESTree.TSUnionType | TSESTree.TSUnknownKeyword | TSESTree.TSVoidKeyword | TSESTree.UpdateExpression | TSESTree.UnaryExpression | TSESTree.VariableDeclaration | TSESTree.VariableDeclarator | TSESTree.WhileStatement | TSESTree.WithStatement | TSESTree.YieldExpression | null | undefined, maybeImplicitGlobal?: boolean | undefined, partial?: boolean | undefined, init?: boolean | undefined): Reference;
-    READ: 1;
-    WRITE: 2;
-    RW: 3;
+    new (identifier: TSESTree.Identifier, scope: Scope, flag?: 2 | 3 | 1 | undefined, writeExpr?: TSESTree.ArrayExpression | TSESTree.ArrayPattern | TSESTree.ArrowFunctionExpression | TSESTree.AssignmentExpression | TSESTree.AssignmentPattern | TSESTree.AwaitExpression | TSESTree.BigIntLiteral | TSESTree.BinaryExpression | TSESTree.BlockStatement | TSESTree.BreakStatement | TSESTree.CallExpression | TSESTree.CatchClause | TSESTree.ChainExpression | TSESTree.ClassBody | TSESTree.ClassDeclaration | TSESTree.ClassExpression | TSESTree.ClassPropertyComputedName | TSESTree.ClassPropertyNonComputedName | TSESTree.ConditionalExpression | TSESTree.ContinueStatement | TSESTree.DebuggerStatement | TSESTree.Decorator | TSESTree.DoWhileStatement | TSESTree.EmptyStatement | TSESTree.ExportAllDeclaration | TSESTree.ExportDefaultDeclaration | TSESTree.ExportNamedDeclaration | TSESTree.ExportSpecifier | TSESTree.ExpressionStatement | TSESTree.ForInStatement | TSESTree.ForOfStatement | TSESTree.ForStatement | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.Identifier | TSESTree.IfStatement | TSESTree.ImportDeclaration | TSESTree.ImportDefaultSpecifier | TSESTree.ImportExpression | TSESTree.ImportNamespaceSpecifier | TSESTree.ImportSpecifier | TSESTree.JSXAttribute | TSESTree.JSXClosingElement | TSESTree.JSXClosingFragment | TSESTree.JSXElement | TSESTree.JSXEmptyExpression | TSESTree.JSXExpressionContainer | TSESTree.JSXFragment | TSESTree.JSXIdentifier | TSESTree.JSXMemberExpression | TSESTree.JSXOpeningElement | TSESTree.JSXOpeningFragment | TSESTree.JSXSpreadAttribute | TSESTree.JSXSpreadChild | TSESTree.JSXText | TSESTree.LabeledStatement | TSESTree.BooleanLiteral | TSESTree.NumberLiteral | TSESTree.NullLiteral | TSESTree.RegExpLiteral | TSESTree.StringLiteral | TSESTree.LogicalExpression | TSESTree.MemberExpressionComputedName | TSESTree.MemberExpressionNonComputedName | TSESTree.MetaProperty | TSESTree.MethodDefinitionComputedName | TSESTree.MethodDefinitionNonComputedName | TSESTree.NewExpression | TSESTree.ObjectExpression | TSESTree.ObjectPattern | TSESTree.Program | TSESTree.PropertyComputedName | TSESTree.PropertyNonComputedName | TSESTree.RestElement | TSESTree.ReturnStatement | TSESTree.SequenceExpression | TSESTree.SpreadElement | TSESTree.Super | TSESTree.SwitchCase | TSESTree.SwitchStatement | TSESTree.TaggedTemplateExpression | TSESTree.TemplateElement | TSESTree.TemplateLiteral | TSESTree.ThisExpression | TSESTree.ThrowStatement | TSESTree.TryStatement | TSESTree.TSAbstractClassPropertyComputedName | TSESTree.TSAbstractClassPropertyNonComputedName | TSESTree.TSAbstractKeyword | TSESTree.TSAbstractMethodDefinitionComputedName | TSESTree.TSAbstractMethodDefinitionNonComputedName | TSESTree.TSAnyKeyword | TSESTree.TSArrayType | TSESTree.TSAsExpression | TSESTree.TSAsyncKeyword | TSESTree.TSBigIntKeyword | TSESTree.TSBooleanKeyword | TSESTree.TSCallSignatureDeclaration | TSESTree.TSClassImplements | TSESTree.TSConditionalType | TSESTree.TSConstructorType | TSESTree.TSConstructSignatureDeclaration | TSESTree.TSDeclareFunction | TSESTree.TSDeclareKeyword | TSESTree.TSEmptyBodyFunctionExpression | TSESTree.TSEnumDeclaration | TSESTree.TSEnumMemberComputedName | TSESTree.TSEnumMemberNonComputedName | TSESTree.TSExportAssignment | TSESTree.TSExportKeyword | TSESTree.TSExternalModuleReference | TSESTree.TSFunctionType | TSESTree.TSImportEqualsDeclaration | TSESTree.TSImportType | TSESTree.TSIndexedAccessType | TSESTree.TSIndexSignature | TSESTree.TSInferType | TSESTree.TSInterfaceBody | TSESTree.TSInterfaceDeclaration | TSESTree.TSInterfaceHeritage | TSESTree.TSIntersectionType | TSESTree.TSLiteralType | TSESTree.TSMappedType | TSESTree.TSMethodSignatureComputedName | TSESTree.TSMethodSignatureNonComputedName | TSESTree.TSModuleBlock | TSESTree.TSModuleDeclaration | TSESTree.TSNamedTupleMember | TSESTree.TSNamespaceExportDeclaration | TSESTree.TSNeverKeyword | TSESTree.TSNonNullExpression | TSESTree.TSNullKeyword | TSESTree.TSNumberKeyword | TSESTree.TSObjectKeyword | TSESTree.TSOptionalType | TSESTree.TSParameterProperty | TSESTree.TSParenthesizedType | TSESTree.TSPrivateKeyword | TSESTree.TSPropertySignatureComputedName | TSESTree.TSPropertySignatureNonComputedName | TSESTree.TSProtectedKeyword | TSESTree.TSPublicKeyword | TSESTree.TSQualifiedName | TSESTree.TSReadonlyKeyword | TSESTree.TSRestType | TSESTree.TSStaticKeyword | TSESTree.TSStringKeyword | TSESTree.TSSymbolKeyword | TSESTree.TSThisType | TSESTree.TSTupleType | TSESTree.TSTypeAliasDeclaration | TSESTree.TSTypeAnnotation | TSESTree.TSTypeAssertion | TSESTree.TSTypeLiteral | TSESTree.TSTypeOperator | TSESTree.TSTypeParameter | TSESTree.TSTypeParameterDeclaration | TSESTree.TSTypeParameterInstantiation | TSESTree.TSTypePredicate | TSESTree.TSTypeQuery | TSESTree.TSTypeReference | TSESTree.TSUndefinedKeyword | TSESTree.TSUnionType | TSESTree.TSUnknownKeyword | TSESTree.TSVoidKeyword | TSESTree.UnaryExpression | TSESTree.UpdateExpression | TSESTree.VariableDeclaration | TSESTree.VariableDeclarator | TSESTree.WhileStatement | TSESTree.WithStatement | TSESTree.YieldExpression | null | undefined, maybeImplicitGlobal?: boolean | undefined, partial?: boolean | undefined, init?: boolean | undefined): Reference;
+    READ: 0x1;
+    WRITE: 0x2;
+    RW: 0x3;
 };
 export { Reference };
 //# sourceMappingURL=Reference.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts.map
index 635aa0c..1384afb 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Reference.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAEhE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,oBAAY,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE5C,UAAU,SAAS;IACjB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAChC,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IAEd,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,OAAO,IAAI,OAAO,CAAC;IACnB,MAAM,IAAI,OAAO,CAAC;IAClB,WAAW,IAAI,OAAO,CAAC;IACvB,UAAU,IAAI,OAAO,CAAC;IACtB,WAAW,IAAI,OAAO,CAAC;CACxB;AACD,QAAA,MAAM,SAAS;;;;;CAcd,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
\ No newline at end of file
+{"version":3,"file":"Reference.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Reference.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,oBAAY,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE5C,UAAU,SAAS;IACjB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAChC,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IAEd,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,OAAO,IAAI,OAAO,CAAC;IACnB,MAAM,IAAI,OAAO,CAAC;IAClB,WAAW,IAAI,OAAO,CAAC;IACvB,UAAU,IAAI,OAAO,CAAC;IACtB,WAAW,IAAI,OAAO,CAAC;CACxB;AACD,QAAA,MAAM,SAAS;qBAEC,SAAS,UAAU,SACxB,KAAK,2lKAMX,SAAS;UAEN,GAAG;WACF,GAAG;QACN,GAAG;CACR,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js
index 9723b7d..71a4559 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js
@@ -3,6 +3,7 @@
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Reference = void 0;
 const reference_1 = __importDefault(require("eslint-scope/lib/reference"));
 const Reference = reference_1.default;
 exports.Reference = Reference;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js.map
index b4dd782..8b1c95b 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js.map
@@ -1 +1 @@
-{"version":3,"file":"Reference.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Reference.ts"],"names":[],"mappings":";;;;;AACA,2EAAyD;AAwBzD,MAAM,SAAS,GAAG,mBAcjB,CAAC;AAEO,8BAAS"}
\ No newline at end of file
+{"version":3,"file":"Reference.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Reference.ts"],"names":[],"mappings":";;;;;;AAAA,2EAAyD;AAyBzD,MAAM,SAAS,GAAG,mBAcjB,CAAC;AAEO,8BAAS"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts
index 43a39ea..beeb288 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts
@@ -1,4 +1,4 @@
-import { TSESTree } from '@typescript-eslint/typescript-estree';
+import { TSESTree } from '../ts-estree';
 import { PatternVisitorCallback, PatternVisitorOptions, Visitor } from './Options';
 import { Scope } from './Scope';
 import { ScopeManager } from './ScopeManager';
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts.map
index 89740fb..37a11bf 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Referencer.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Referencer.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"Referencer.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Referencer.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js
index ed33411..4aafa5a 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js
@@ -3,6 +3,8 @@
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Referencer = void 0;
+/* eslint-disable @typescript-eslint/no-explicit-any */
 const referencer_1 = __importDefault(require("eslint-scope/lib/referencer"));
 const Referencer = referencer_1.default;
 exports.Referencer = Referencer;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js.map
index 44ec03a..2d80e28 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js.map
@@ -1 +1 @@
-{"version":3,"file":"Referencer.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Referencer.ts"],"names":[],"mappings":";;;;;AAEA,6EAA2D;AA0E3D,MAAM,UAAU,GAAG,oBAElB,CAAC;AAEO,gCAAU"}
\ No newline at end of file
+{"version":3,"file":"Referencer.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Referencer.ts"],"names":[],"mappings":";;;;;;AAAA,uDAAuD;AACvD,6EAA2D;AA2E3D,MAAM,UAAU,GAAG,oBAElB,CAAC;AAEO,gCAAU"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts
index 8093856..ae6bd11 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts
@@ -1,4 +1,4 @@
-import { TSESTree } from '@typescript-eslint/typescript-estree';
+import { TSESTree } from '../ts-estree';
 import { Definition } from './Definition';
 import { Reference, ReferenceFlag } from './Reference';
 import { ScopeManager } from './ScopeManager';
@@ -71,7 +71,7 @@
 }
 interface GlobalScope extends Scope {
 }
-declare const GlobalScope: ScopeConstructor & (new (scopeManager: ScopeManager, block: TSESTree.ArrayExpression | TSESTree.ArrayPattern | TSESTree.ArrowFunctionExpression | TSESTree.AssignmentExpression | TSESTree.AssignmentPattern | TSESTree.AwaitExpression | TSESTree.BigIntLiteral | TSESTree.BinaryExpression | TSESTree.BlockStatement | TSESTree.BreakStatement | TSESTree.CallExpression | TSESTree.CatchClause | TSESTree.ClassBody | TSESTree.ClassDeclaration | TSESTree.ClassExpression | TSESTree.ClassPropertyComputedName | TSESTree.ClassPropertyNonComputedName | TSESTree.ConditionalExpression | TSESTree.ContinueStatement | TSESTree.DebuggerStatement | TSESTree.Decorator | TSESTree.DoWhileStatement | TSESTree.EmptyStatement | TSESTree.ExportAllDeclaration | TSESTree.ExportDefaultDeclaration | TSESTree.ExportNamedDeclaration | TSESTree.ExportSpecifier | TSESTree.ExpressionStatement | TSESTree.ForInStatement | TSESTree.ForOfStatement | TSESTree.ForStatement | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.Identifier | TSESTree.IfStatement | TSESTree.Import | TSESTree.ImportDeclaration | TSESTree.ImportDefaultSpecifier | TSESTree.ImportNamespaceSpecifier | TSESTree.ImportSpecifier | TSESTree.JSXAttribute | TSESTree.JSXClosingElement | TSESTree.JSXClosingFragment | TSESTree.JSXElement | TSESTree.JSXEmptyExpression | TSESTree.JSXExpressionContainer | TSESTree.JSXFragment | TSESTree.JSXIdentifier | TSESTree.JSXOpeningElement | TSESTree.JSXOpeningFragment | TSESTree.JSXSpreadAttribute | TSESTree.JSXSpreadChild | TSESTree.JSXMemberExpression | TSESTree.JSXText | TSESTree.LabeledStatement | TSESTree.BooleanLiteral | TSESTree.NumberLiteral | TSESTree.NullLiteral | TSESTree.RegExpLiteral | TSESTree.StringLiteral | TSESTree.LogicalExpression | TSESTree.MemberExpressionComputedName | TSESTree.MemberExpressionNonComputedName | TSESTree.MetaProperty | TSESTree.MethodDefinitionComputedName | TSESTree.MethodDefinitionNonComputedName | TSESTree.NewExpression | TSESTree.ObjectExpression | TSESTree.ObjectPattern | TSESTree.OptionalCallExpression | TSESTree.OptionalMemberExpressionComputedName | TSESTree.OptionalMemberExpressionNonComputedName | TSESTree.Program | TSESTree.PropertyComputedName | TSESTree.PropertyNonComputedName | TSESTree.RestElement | TSESTree.ReturnStatement | TSESTree.SequenceExpression | TSESTree.SpreadElement | TSESTree.Super | TSESTree.SwitchCase | TSESTree.SwitchStatement | TSESTree.TaggedTemplateExpression | TSESTree.TemplateElement | TSESTree.TemplateLiteral | TSESTree.ThisExpression | TSESTree.ThrowStatement | TSESTree.TryStatement | TSESTree.TSAbstractClassPropertyComputedName | TSESTree.TSAbstractClassPropertyNonComputedName | TSESTree.TSAbstractKeyword | TSESTree.TSAbstractMethodDefinitionComputedName | TSESTree.TSAbstractMethodDefinitionNonComputedName | TSESTree.TSAnyKeyword | TSESTree.TSArrayType | TSESTree.TSAsExpression | TSESTree.TSAsyncKeyword | TSESTree.TSBigIntKeyword | TSESTree.TSBooleanKeyword | TSESTree.TSCallSignatureDeclaration | TSESTree.TSClassImplements | TSESTree.TSConditionalType | TSESTree.TSConstructorType | TSESTree.TSConstructSignatureDeclaration | TSESTree.TSDeclareFunction | TSESTree.TSDeclareKeyword | TSESTree.TSEmptyBodyFunctionExpression | TSESTree.TSEnumDeclaration | TSESTree.TSEnumMemberComputedName | TSESTree.TSEnumMemberNonComputedName | TSESTree.TSExportAssignment | TSESTree.TSExportKeyword | TSESTree.TSExternalModuleReference | TSESTree.TSFunctionType | TSESTree.TSImportEqualsDeclaration | TSESTree.TSImportType | TSESTree.TSIndexedAccessType | TSESTree.TSIndexSignature | TSESTree.TSInferType | TSESTree.TSInterfaceDeclaration | TSESTree.TSInterfaceBody | TSESTree.TSInterfaceHeritage | TSESTree.TSIntersectionType | TSESTree.TSLiteralType | TSESTree.TSMappedType | TSESTree.TSMethodSignatureComputedName | TSESTree.TSMethodSignatureNonComputedName | TSESTree.TSModuleBlock | TSESTree.TSModuleDeclaration | TSESTree.TSNamespaceExportDeclaration | TSESTree.TSNeverKeyword | TSESTree.TSNonNullExpression | TSESTree.TSNullKeyword | TSESTree.TSNumberKeyword | TSESTree.TSObjectKeyword | TSESTree.TSOptionalType | TSESTree.TSParameterProperty | TSESTree.TSParenthesizedType | TSESTree.TSPropertySignatureComputedName | TSESTree.TSPropertySignatureNonComputedName | TSESTree.TSPublicKeyword | TSESTree.TSPrivateKeyword | TSESTree.TSProtectedKeyword | TSESTree.TSQualifiedName | TSESTree.TSReadonlyKeyword | TSESTree.TSRestType | TSESTree.TSStaticKeyword | TSESTree.TSStringKeyword | TSESTree.TSSymbolKeyword | TSESTree.TSThisType | TSESTree.TSTupleType | TSESTree.TSTypeAliasDeclaration | TSESTree.TSTypeAnnotation | TSESTree.TSTypeAssertion | TSESTree.TSTypeLiteral | TSESTree.TSTypeOperator | TSESTree.TSTypeParameter | TSESTree.TSTypeParameterDeclaration | TSESTree.TSTypeParameterInstantiation | TSESTree.TSTypePredicate | TSESTree.TSTypeQuery | TSESTree.TSTypeReference | TSESTree.TSUndefinedKeyword | TSESTree.TSUnionType | TSESTree.TSUnknownKeyword | TSESTree.TSVoidKeyword | TSESTree.UpdateExpression | TSESTree.UnaryExpression | TSESTree.VariableDeclaration | TSESTree.VariableDeclarator | TSESTree.WhileStatement | TSESTree.WithStatement | TSESTree.YieldExpression | null) => GlobalScope);
+declare const GlobalScope: ScopeConstructor & (new (scopeManager: ScopeManager, block: TSESTree.Node | null) => GlobalScope);
 interface ModuleScope extends Scope {
 }
 declare const ModuleScope: ScopeConstructor & ScopeChildConstructorWithUpperScope<ModuleScope>;
@@ -92,7 +92,7 @@
 declare const SwitchScope: ScopeConstructor & ScopeChildConstructorWithUpperScope<SwitchScope>;
 interface FunctionScope extends Scope {
 }
-declare const FunctionScope: ScopeConstructor & (new (scopeManager: ScopeManager, upperScope: Scope, block: TSESTree.ArrayExpression | TSESTree.ArrayPattern | TSESTree.ArrowFunctionExpression | TSESTree.AssignmentExpression | TSESTree.AssignmentPattern | TSESTree.AwaitExpression | TSESTree.BigIntLiteral | TSESTree.BinaryExpression | TSESTree.BlockStatement | TSESTree.BreakStatement | TSESTree.CallExpression | TSESTree.CatchClause | TSESTree.ClassBody | TSESTree.ClassDeclaration | TSESTree.ClassExpression | TSESTree.ClassPropertyComputedName | TSESTree.ClassPropertyNonComputedName | TSESTree.ConditionalExpression | TSESTree.ContinueStatement | TSESTree.DebuggerStatement | TSESTree.Decorator | TSESTree.DoWhileStatement | TSESTree.EmptyStatement | TSESTree.ExportAllDeclaration | TSESTree.ExportDefaultDeclaration | TSESTree.ExportNamedDeclaration | TSESTree.ExportSpecifier | TSESTree.ExpressionStatement | TSESTree.ForInStatement | TSESTree.ForOfStatement | TSESTree.ForStatement | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.Identifier | TSESTree.IfStatement | TSESTree.Import | TSESTree.ImportDeclaration | TSESTree.ImportDefaultSpecifier | TSESTree.ImportNamespaceSpecifier | TSESTree.ImportSpecifier | TSESTree.JSXAttribute | TSESTree.JSXClosingElement | TSESTree.JSXClosingFragment | TSESTree.JSXElement | TSESTree.JSXEmptyExpression | TSESTree.JSXExpressionContainer | TSESTree.JSXFragment | TSESTree.JSXIdentifier | TSESTree.JSXOpeningElement | TSESTree.JSXOpeningFragment | TSESTree.JSXSpreadAttribute | TSESTree.JSXSpreadChild | TSESTree.JSXMemberExpression | TSESTree.JSXText | TSESTree.LabeledStatement | TSESTree.BooleanLiteral | TSESTree.NumberLiteral | TSESTree.NullLiteral | TSESTree.RegExpLiteral | TSESTree.StringLiteral | TSESTree.LogicalExpression | TSESTree.MemberExpressionComputedName | TSESTree.MemberExpressionNonComputedName | TSESTree.MetaProperty | TSESTree.MethodDefinitionComputedName | TSESTree.MethodDefinitionNonComputedName | TSESTree.NewExpression | TSESTree.ObjectExpression | TSESTree.ObjectPattern | TSESTree.OptionalCallExpression | TSESTree.OptionalMemberExpressionComputedName | TSESTree.OptionalMemberExpressionNonComputedName | TSESTree.Program | TSESTree.PropertyComputedName | TSESTree.PropertyNonComputedName | TSESTree.RestElement | TSESTree.ReturnStatement | TSESTree.SequenceExpression | TSESTree.SpreadElement | TSESTree.Super | TSESTree.SwitchCase | TSESTree.SwitchStatement | TSESTree.TaggedTemplateExpression | TSESTree.TemplateElement | TSESTree.TemplateLiteral | TSESTree.ThisExpression | TSESTree.ThrowStatement | TSESTree.TryStatement | TSESTree.TSAbstractClassPropertyComputedName | TSESTree.TSAbstractClassPropertyNonComputedName | TSESTree.TSAbstractKeyword | TSESTree.TSAbstractMethodDefinitionComputedName | TSESTree.TSAbstractMethodDefinitionNonComputedName | TSESTree.TSAnyKeyword | TSESTree.TSArrayType | TSESTree.TSAsExpression | TSESTree.TSAsyncKeyword | TSESTree.TSBigIntKeyword | TSESTree.TSBooleanKeyword | TSESTree.TSCallSignatureDeclaration | TSESTree.TSClassImplements | TSESTree.TSConditionalType | TSESTree.TSConstructorType | TSESTree.TSConstructSignatureDeclaration | TSESTree.TSDeclareFunction | TSESTree.TSDeclareKeyword | TSESTree.TSEmptyBodyFunctionExpression | TSESTree.TSEnumDeclaration | TSESTree.TSEnumMemberComputedName | TSESTree.TSEnumMemberNonComputedName | TSESTree.TSExportAssignment | TSESTree.TSExportKeyword | TSESTree.TSExternalModuleReference | TSESTree.TSFunctionType | TSESTree.TSImportEqualsDeclaration | TSESTree.TSImportType | TSESTree.TSIndexedAccessType | TSESTree.TSIndexSignature | TSESTree.TSInferType | TSESTree.TSInterfaceDeclaration | TSESTree.TSInterfaceBody | TSESTree.TSInterfaceHeritage | TSESTree.TSIntersectionType | TSESTree.TSLiteralType | TSESTree.TSMappedType | TSESTree.TSMethodSignatureComputedName | TSESTree.TSMethodSignatureNonComputedName | TSESTree.TSModuleBlock | TSESTree.TSModuleDeclaration | TSESTree.TSNamespaceExportDeclaration | TSESTree.TSNeverKeyword | TSESTree.TSNonNullExpression | TSESTree.TSNullKeyword | TSESTree.TSNumberKeyword | TSESTree.TSObjectKeyword | TSESTree.TSOptionalType | TSESTree.TSParameterProperty | TSESTree.TSParenthesizedType | TSESTree.TSPropertySignatureComputedName | TSESTree.TSPropertySignatureNonComputedName | TSESTree.TSPublicKeyword | TSESTree.TSPrivateKeyword | TSESTree.TSProtectedKeyword | TSESTree.TSQualifiedName | TSESTree.TSReadonlyKeyword | TSESTree.TSRestType | TSESTree.TSStaticKeyword | TSESTree.TSStringKeyword | TSESTree.TSSymbolKeyword | TSESTree.TSThisType | TSESTree.TSTupleType | TSESTree.TSTypeAliasDeclaration | TSESTree.TSTypeAnnotation | TSESTree.TSTypeAssertion | TSESTree.TSTypeLiteral | TSESTree.TSTypeOperator | TSESTree.TSTypeParameter | TSESTree.TSTypeParameterDeclaration | TSESTree.TSTypeParameterInstantiation | TSESTree.TSTypePredicate | TSESTree.TSTypeQuery | TSESTree.TSTypeReference | TSESTree.TSUndefinedKeyword | TSESTree.TSUnionType | TSESTree.TSUnknownKeyword | TSESTree.TSVoidKeyword | TSESTree.UpdateExpression | TSESTree.UnaryExpression | TSESTree.VariableDeclaration | TSESTree.VariableDeclarator | TSESTree.WhileStatement | TSESTree.WithStatement | TSESTree.YieldExpression | null, isMethodDefinition: boolean) => FunctionScope);
+declare const FunctionScope: ScopeConstructor & (new (scopeManager: ScopeManager, upperScope: Scope, block: TSESTree.Node | null, isMethodDefinition: boolean) => FunctionScope);
 interface ForScope extends Scope {
 }
 declare const ForScope: ScopeConstructor & ScopeChildConstructorWithUpperScope<ForScope>;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts.map
index 7f7bd63..8b6f342 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Scope.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Scope.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"Scope.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Scope.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,aAAK,SAAS,GACV,OAAO,GACP,OAAO,GACP,OAAO,GACP,KAAK,GACL,UAAU,GACV,0BAA0B,GAC1B,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,KAAK,GACL,MAAM,GACN,gBAAgB,CAAC;AAErB,UAAU,KAAK;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,KAAK,EAAE,CAAC;IACrB,aAAa,EAAE,KAAK,CAAC;IACrB,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC;IACrB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,uBAAuB,EAAE,OAAO,CAAC;IACjC,MAAM,EAAE,SAAS,EAAE,CAAC;IAEpB,uBAAuB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC;IAC7D,gCAAgC,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC;IACpD,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IACjC,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAClC,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IACjC,OAAO,CAAC,YAAY,EAAE,YAAY,GAAG,KAAK,CAAC;IAC3C,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,QAAQ,IAAI,QAAQ,CAAC;IACnE,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC;IACnC,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IACvC,4BAA4B,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACvE,eAAe,CACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC1B,SAAS,EAAE,QAAQ,EAAE,EACrB,IAAI,EAAE,QAAQ,CAAC,UAAU,EACzB,GAAG,EAAE,UAAU,GACd,IAAI,CAAC;IAER,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;IAErD,aAAa,CACX,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,MAAM,CAAC,EAAE,aAAa,EACtB,SAAS,CAAC,EAAE,QAAQ,CAAC,IAAI,EACzB,mBAAmB,CAAC,EAAE,GAAG,EACzB,OAAO,CAAC,EAAE,GAAG,EACb,IAAI,CAAC,EAAE,GAAG,GACT,IAAI,CAAC;IAER,YAAY,IAAI,IAAI,CAAC;IACrB,YAAY,IAAI,IAAI,CAAC;IACrB,UAAU,IAAI,OAAO,CAAC;IACtB;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC;IAEzC;;;;OAIG;IACH,QAAQ,IAAI,OAAO,CAAC;IAEpB;;;;OAIG;IACH,uBAAuB,IAAI,OAAO,CAAC;IAEnC;;;;OAIG;IACH,kBAAkB,IAAI,OAAO,CAAC;IAE9B,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;CAChC;AACD,UAAU,gBAAgB;IACxB,KACE,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,KAAK,GAAG,IAAI,EACxB,KAAK,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,EAC3B,kBAAkB,EAAE,OAAO,GAC1B,KAAK,CAAC;CACV;AACD,QAAA,MAAM,KAAK,kBAAkC,CAAC;AAE9C,UAAU,mCAAmC,CAAC,CAAC;IAC7C,KACE,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,KAAK,EACjB,KAAK,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,GAC1B,CAAC,CAAC;CACN;AAED,UAAU,WAAY,SAAQ,KAAK;CAAG;AACtC,QAAA,MAAM,WAAW,yCACI,YAAY,SAAS,SAAS,IAAI,GAAG,IAAI,KAAG,WAAW,CAC3E,CAAC;AAEF,UAAU,WAAY,SAAQ,KAAK;CAAG;AACtC,QAAA,MAAM,WAAW,qEACiC,CAAC;AAEnD,UAAU,2BAA4B,SAAQ,KAAK;CAAG;AACtD,QAAA,MAAM,2BAA2B,qFACiC,CAAC;AAEnE,UAAU,UAAW,SAAQ,KAAK;CAAG;AACrC,QAAA,MAAM,UAAU,oEACiC,CAAC;AAElD,UAAU,SAAU,SAAQ,KAAK;CAAG;AACpC,QAAA,MAAM,SAAS,mEACiC,CAAC;AAEjD,UAAU,UAAW,SAAQ,KAAK;CAAG;AACrC,QAAA,MAAM,UAAU,oEACiC,CAAC;AAElD,UAAU,WAAY,SAAQ,KAAK;CAAG;AACtC,QAAA,MAAM,WAAW,qEACiC,CAAC;AAEnD,UAAU,aAAc,SAAQ,KAAK;CAAG;AACxC,QAAA,MAAM,aAAa,yCAED,YAAY,cACd,KAAK,SACV,SAAS,IAAI,GAAG,IAAI,sBACP,OAAO,KAC1B,aAAa,CACjB,CAAC;AAEF,UAAU,QAAS,SAAQ,KAAK;CAAG;AACnC,QAAA,MAAM,QAAQ,kEACiC,CAAC;AAEhD,UAAU,UAAW,SAAQ,KAAK;CAAG;AACrC,QAAA,MAAM,UAAU,oEACiC,CAAC;AAElD,OAAO,EACL,SAAS,EACT,KAAK,EACL,WAAW,EACX,WAAW,EACX,2BAA2B,EAC3B,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,aAAa,EACb,QAAQ,EACR,UAAU,GACX,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js
index 6965dc6..f4f604f 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js
@@ -1,6 +1,7 @@
 "use strict";
 /* eslint-disable @typescript-eslint/no-empty-interface, @typescript-eslint/no-explicit-any */
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.ClassScope = exports.ForScope = exports.FunctionScope = exports.SwitchScope = exports.BlockScope = exports.WithScope = exports.CatchScope = exports.FunctionExpressionNameScope = exports.ModuleScope = exports.GlobalScope = exports.Scope = void 0;
 const scope_1 = require("eslint-scope/lib/scope");
 const Scope = scope_1.Scope;
 exports.Scope = Scope;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js.map
index 2832582..b0d7969 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js.map
@@ -1 +1 @@
-{"version":3,"file":"Scope.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Scope.ts"],"names":[],"mappings":";AAAA,8FAA8F;;AAG9F,kDAYgC;AA6GhC,MAAM,KAAK,GAAG,aAA+B,CAAC;AA2D5C,sBAAK;AAhDP,MAAM,WAAW,GAAG,mBAEnB,CAAC;AA+CA,kCAAW;AA5Cb,MAAM,WAAW,GAAG,mBAC8B,CAAC;AA4CjD,kCAAW;AAzCb,MAAM,2BAA2B,GAAG,mCAC8B,CAAC;AAyCjE,kEAA2B;AAtC7B,MAAM,UAAU,GAAG,kBAC8B,CAAC;AAsChD,gCAAU;AAnCZ,MAAM,SAAS,GAAG,iBAC8B,CAAC;AAmC/C,8BAAS;AAhCX,MAAM,UAAU,GAAG,kBAC8B,CAAC;AAgChD,gCAAU;AA7BZ,MAAM,WAAW,GAAG,mBAC8B,CAAC;AA6BjD,kCAAW;AA1Bb,MAAM,aAAa,GAAG,qBAOrB,CAAC;AAoBA,sCAAa;AAjBf,MAAM,QAAQ,GAAG,gBAC8B,CAAC;AAiB9C,4BAAQ;AAdV,MAAM,UAAU,GAAG,kBAC8B,CAAC;AAchD,gCAAU"}
\ No newline at end of file
+{"version":3,"file":"Scope.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Scope.ts"],"names":[],"mappings":";AAAA,8FAA8F;;;AAE9F,kDAYgC;AA8GhC,MAAM,KAAK,GAAG,aAA+B,CAAC;AA2D5C,sBAAK;AAhDP,MAAM,WAAW,GAAG,mBAEnB,CAAC;AA+CA,kCAAW;AA5Cb,MAAM,WAAW,GAAG,mBAC8B,CAAC;AA4CjD,kCAAW;AAzCb,MAAM,2BAA2B,GAAG,mCAC8B,CAAC;AAyCjE,kEAA2B;AAtC7B,MAAM,UAAU,GAAG,kBAC8B,CAAC;AAsChD,gCAAU;AAnCZ,MAAM,SAAS,GAAG,iBAC8B,CAAC;AAmC/C,8BAAS;AAhCX,MAAM,UAAU,GAAG,kBAC8B,CAAC;AAgChD,gCAAU;AA7BZ,MAAM,WAAW,GAAG,mBAC8B,CAAC;AA6BjD,kCAAW;AA1Bb,MAAM,aAAa,GAAG,qBAOrB,CAAC;AAoBA,sCAAa;AAjBf,MAAM,QAAQ,GAAG,gBAC8B,CAAC;AAiB9C,4BAAQ;AAdV,MAAM,UAAU,GAAG,kBAC8B,CAAC;AAchD,gCAAU"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts
index a865aa7..9b7e929 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts
@@ -1,4 +1,5 @@
-import { TSESTree } from '@typescript-eslint/typescript-estree';
+import { TSESTree } from '../ts-estree';
+import { EcmaVersion } from '../ts-eslint';
 import { Scope } from './Scope';
 import { Variable } from './Variable';
 interface ScopeManagerOptions {
@@ -8,7 +9,7 @@
     nodejsScope?: boolean;
     sourceType?: 'module' | 'script';
     impliedStrict?: boolean;
-    ecmaVersion?: number;
+    ecmaVersion?: EcmaVersion;
 }
 interface ScopeManager {
     __options: ScopeManagerOptions;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts.map
index aeb32e3..7c9ba53 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"ScopeManager.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/ScopeManager.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"ScopeManager.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/ScopeManager.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js
index a37ab9c..c886eb7 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js
@@ -3,6 +3,7 @@
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.ScopeManager = void 0;
 const scope_manager_1 = __importDefault(require("eslint-scope/lib/scope-manager"));
 const ScopeManager = scope_manager_1.default;
 exports.ScopeManager = ScopeManager;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js.map
index 4cb95d6..35d90d1 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js.map
@@ -1 +1 @@
-{"version":3,"file":"ScopeManager.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/ScopeManager.ts"],"names":[],"mappings":";;;;;AACA,mFAAgE;AAsDhE,MAAM,YAAY,GAAG,uBAEpB,CAAC;AAEO,oCAAY"}
\ No newline at end of file
+{"version":3,"file":"ScopeManager.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/ScopeManager.ts"],"names":[],"mappings":";;;;;;AAAA,mFAAgE;AAwDhE,MAAM,YAAY,GAAG,uBAEpB,CAAC;AAEO,oCAAY"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts
index 14323b0..a5d6ddf 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts
@@ -1,4 +1,4 @@
-import { TSESTree } from '@typescript-eslint/typescript-estree';
+import { TSESTree } from '../ts-estree';
 import { Reference } from './Reference';
 import { Definition } from './Definition';
 import { Scope } from './Scope';
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts.map
index 9c581e3..604e185 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Variable.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Variable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;IACnC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,QAAA,MAAM,QAAQ,oBAEb,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
\ No newline at end of file
+{"version":3,"file":"Variable.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Variable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;IACnC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,QAAA,MAAM,QAAQ,YACJ,QACT,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js
index 1fe0510..c0fdac2 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js
@@ -3,6 +3,7 @@
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Variable = void 0;
 const variable_1 = __importDefault(require("eslint-scope/lib/variable"));
 const Variable = variable_1.default;
 exports.Variable = Variable;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js.map
index 3d3036f..d6545bb 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js.map
@@ -1 +1 @@
-{"version":3,"file":"Variable.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Variable.ts"],"names":[],"mappings":";;;;;AACA,yEAAuD;AAgBvD,MAAM,QAAQ,GAAG,kBAEhB,CAAC;AAEO,4BAAQ"}
\ No newline at end of file
+{"version":3,"file":"Variable.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Variable.ts"],"names":[],"mappings":";;;;;;AAAA,yEAAuD;AAiBvD,MAAM,QAAQ,GAAG,kBAEhB,CAAC;AAEO,4BAAQ"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts
index a719dd6..dbcb76b 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts
@@ -1,3 +1,5 @@
+import { EcmaVersion } from '../ts-eslint';
+import { TSESTree } from '../ts-estree';
 import { ScopeManager } from './ScopeManager';
 interface AnalysisOptions {
     optimistic?: boolean;
@@ -5,10 +7,10 @@
     ignoreEval?: boolean;
     nodejsScope?: boolean;
     impliedStrict?: boolean;
-    fallback?: string | ((node: {}) => string[]);
+    fallback?: string | ((node: TSESTree.Node) => string[]);
     sourceType?: 'script' | 'module';
-    ecmaVersion?: number;
+    ecmaVersion?: EcmaVersion;
 }
-declare const analyze: (ast: {}, options?: AnalysisOptions | undefined) => ScopeManager;
+declare const analyze: (ast: TSESTree.Node, options?: AnalysisOptions | undefined) => ScopeManager;
 export { analyze, AnalysisOptions };
 //# sourceMappingURL=analyze.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts.map
index aa13050..9a3654b 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/analyze.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,UAAU,eAAe;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AACD,QAAA,MAAM,OAAO,kEAGI,CAAC;AAElB,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC"}
\ No newline at end of file
+{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/analyze.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,UAAU,eAAe;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;IACxD,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AACD,QAAA,MAAM,OAAO,QACN,SAAS,IAAI,4CAEf,YAAY,CAAC;AAElB,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js
index 4f34a8f..7fddff1 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js
@@ -1,5 +1,6 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.analyze = void 0;
 const eslint_scope_1 = require("eslint-scope");
 const analyze = eslint_scope_1.analyze;
 exports.analyze = analyze;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js.map
index 4db6fd8..f015cc4 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js.map
@@ -1 +1 @@
-{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/analyze.ts"],"names":[],"mappings":";;AAAA,+CAAwD;AAaxD,MAAM,OAAO,GAAG,sBAGC,CAAC;AAET,0BAAO"}
\ No newline at end of file
+{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/analyze.ts"],"names":[],"mappings":";;;AAAA,+CAAwD;AAexD,MAAM,OAAO,GAAG,sBAGC,CAAC;AAET,0BAAO"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js
index 7735874..34d3243 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js
@@ -1,16 +1,25 @@
 "use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.version = void 0;
 const eslint_scope_1 = require("eslint-scope");
-__export(require("./analyze"));
-__export(require("./Definition"));
-__export(require("./PatternVisitor"));
-__export(require("./Reference"));
-__export(require("./Referencer"));
-__export(require("./Scope"));
-__export(require("./ScopeManager"));
-__export(require("./Variable"));
+__exportStar(require("./analyze"), exports);
+__exportStar(require("./Definition"), exports);
+__exportStar(require("./Options"), exports);
+__exportStar(require("./PatternVisitor"), exports);
+__exportStar(require("./Reference"), exports);
+__exportStar(require("./Referencer"), exports);
+__exportStar(require("./Scope"), exports);
+__exportStar(require("./ScopeManager"), exports);
+__exportStar(require("./Variable"), exports);
 exports.version = eslint_scope_1.version;
 //# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js.map
index 5e963f6..8872a9f 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/index.ts"],"names":[],"mappings":";;;;;AAAA,+CAAwD;AAExD,+BAA0B;AAC1B,kCAA6B;AAE7B,sCAAiC;AACjC,iCAA4B;AAC5B,kCAA6B;AAC7B,6BAAwB;AACxB,oCAA+B;AAC/B,gCAA2B;AACd,QAAA,OAAO,GAAW,sBAAa,CAAC"}
\ No newline at end of file
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,+CAAwD;AAExD,4CAA0B;AAC1B,+CAA6B;AAC7B,4CAA0B;AAC1B,mDAAiC;AACjC,8CAA4B;AAC5B,+CAA6B;AAC7B,0CAAwB;AACxB,iDAA+B;AAC/B,6CAA2B;AACd,QAAA,OAAO,GAAW,sBAAa,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts
index bd38a81..88d6379 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts
@@ -1,4 +1,4 @@
-import { TSESTree, AST_TOKEN_TYPES } from '@typescript-eslint/typescript-estree';
+import { TSESTree, AST_TOKEN_TYPES } from '../ts-estree';
 declare namespace AST {
     type TokenType = AST_TOKEN_TYPES;
     type Token = TSESTree.Token;
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts.map
index e9b730d..8dca544 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"AST.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/AST.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EACR,eAAe,EAChB,MAAM,sCAAsC,CAAC;AAE9C,kBAAU,GAAG,CAAC;IACZ,KAAY,SAAS,GAAG,eAAe,CAAC;IAExC,KAAY,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAEnC,KAAY,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;IAErD,KAAY,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CACpC;AAED,OAAO,EAAE,GAAG,EAAE,CAAC"}
\ No newline at end of file
+{"version":3,"file":"AST.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/AST.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEzD,kBAAU,GAAG,CAAC;IACZ,KAAY,SAAS,GAAG,eAAe,CAAC;IAExC,KAAY,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAEnC,KAAY,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;IAErD,KAAY,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CACpC;AAED,OAAO,EAAE,GAAG,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts
index 412c3b3..f996162 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts
@@ -1,15 +1,75 @@
 import { Linter } from './Linter';
-import { RuleModule, RuleListener } from './Rule';
-interface CLIEngine {
-    version: string;
+import { RuleListener, RuleMetaData, RuleModule } from './Rule';
+declare class CLIEngineBase {
+    /**
+     * Creates a new instance of the core CLI engine.
+     * @param providedOptions The options for this instance.
+     */
+    constructor(options: CLIEngine.Options);
+    /**
+     * Add a plugin by passing its configuration
+     * @param name Name of the plugin.
+     * @param pluginObject Plugin configuration object.
+     */
+    addPlugin(name: string, pluginObject: Linter.Plugin): void;
+    /**
+     * Executes the current configuration on an array of file and directory names.
+     * @param patterns An array of file and directory names.
+     * @returns The results for all files that were linted.
+     */
     executeOnFiles(patterns: string[]): CLIEngine.LintReport;
-    resolveFileGlobPatterns(patterns: string[]): string[];
+    /**
+     * Executes the current configuration on text.
+     * @param text A string of JavaScript code to lint.
+     * @param filename An optional string representing the texts filename.
+     * @param warnIgnored Always warn when a file is ignored
+     * @returns The results for the linting.
+     */
+    executeOnText(text: string, filename?: string, warnIgnored?: boolean): CLIEngine.LintReport;
+    /**
+     * Returns a configuration object for the given file based on the CLI options.
+     * This is the same logic used by the ESLint CLI executable to determine configuration for each file it processes.
+     * @param filePath The path of the file to retrieve a config object for.
+     * @returns A configuration object for the file.
+     */
     getConfigForFile(filePath: string): Linter.Config;
-    executeOnText(text: string, filename?: string): CLIEngine.LintReport;
-    addPlugin(name: string, pluginObject: unknown): void;
-    isPathIgnored(filePath: string): boolean;
+    /**
+     * Returns the formatter representing the given format.
+     * @param format The name of the format to load or the path to a custom formatter.
+     * @returns The formatter function.
+     */
     getFormatter(format?: string): CLIEngine.Formatter;
+    /**
+     * Checks if a given path is ignored by ESLint.
+     * @param filePath The path of the file to check.
+     * @returns Whether or not the given path is ignored.
+     */
+    isPathIgnored(filePath: string): boolean;
+    /**
+     * Resolves the patterns passed into `executeOnFiles()` into glob-based patterns for easier handling.
+     * @param patterns The file patterns passed on the command line.
+     * @returns The equivalent glob patterns.
+     */
+    resolveFileGlobPatterns(patterns: string[]): string[];
     getRules<TMessageIds extends string = string, TOptions extends readonly unknown[] = unknown[], TRuleListener extends RuleListener = RuleListener>(): Map<string, RuleModule<TMessageIds, TOptions, TRuleListener>>;
+    /**
+     * Returns results that only contains errors.
+     * @param results The results to filter.
+     * @returns The filtered results.
+     */
+    static getErrorResults(results: CLIEngine.LintResult[]): CLIEngine.LintResult[];
+    /**
+     * Returns the formatter representing the given format or null if the `format` is not a string.
+     * @param format The name of the format to load or the path to a custom formatter.
+     * @returns The formatter function.
+     */
+    static getFormatter(format?: string): CLIEngine.Formatter;
+    /**
+     * Outputs fixes from the given results to files.
+     * @param report The report object created by CLIEngine.
+     */
+    static outputFixes(report: CLIEngine.LintReport): void;
+    static version: string;
 }
 declare namespace CLIEngine {
     interface Options {
@@ -23,6 +83,7 @@
         configFile?: string;
         cwd?: string;
         envs?: string[];
+        errorOnUnmatchedPattern?: boolean;
         extensions?: string[];
         fix?: boolean;
         globals?: string[];
@@ -33,6 +94,7 @@
         parser?: string;
         parserOptions?: Linter.ParserOptions;
         plugins?: string[];
+        resolvePluginsRelativeTo?: string;
         rules?: {
             [name: string]: Linter.RuleLevel | Linter.RuleLevelAndOptions;
         };
@@ -55,13 +117,27 @@
         warningCount: number;
         fixableErrorCount: number;
         fixableWarningCount: number;
+        usedDeprecatedRules: DeprecatedRuleUse[];
     }
-    type Formatter = (results: LintResult[]) => string;
+    interface DeprecatedRuleUse {
+        ruleId: string;
+        replacedBy: string[];
+    }
+    interface LintResultData<TMessageIds extends string> {
+        rulesMeta: {
+            [ruleId: string]: RuleMetaData<TMessageIds>;
+        };
+    }
+    type Formatter = <TMessageIds extends string>(results: LintResult[], data?: LintResultData<TMessageIds>) => string;
 }
-declare const CLIEngine: {
-    new (options: CLIEngine.Options): CLIEngine;
-    getErrorResults(results: CLIEngine.LintResult[]): CLIEngine.LintResult[];
-    outputFixes(report: CLIEngine.LintReport): void;
-};
+declare const CLIEngine_base: typeof CLIEngineBase;
+/**
+ * The underlying utility that runs the ESLint command line interface. This object will read the filesystem for
+ * configuration and file information but will not output any results. Instead, it allows you direct access to the
+ * important information so you can deal with the output yourself.
+ * @deprecated use the ESLint class instead
+ */
+declare class CLIEngine extends CLIEngine_base {
+}
 export { CLIEngine };
 //# sourceMappingURL=CLIEngine.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts.map
index 4adb507..6d8d24e 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"CLIEngine.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/CLIEngine.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"CLIEngine.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/CLIEngine.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js
index 861cf4a..8ccf2b7 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js
@@ -1,7 +1,15 @@
 "use strict";
 /* eslint-disable @typescript-eslint/no-namespace */
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.CLIEngine = void 0;
 const eslint_1 = require("eslint");
-const CLIEngine = eslint_1.CLIEngine;
+/**
+ * The underlying utility that runs the ESLint command line interface. This object will read the filesystem for
+ * configuration and file information but will not output any results. Instead, it allows you direct access to the
+ * important information so you can deal with the output yourself.
+ * @deprecated use the ESLint class instead
+ */
+class CLIEngine extends eslint_1.CLIEngine {
+}
 exports.CLIEngine = CLIEngine;
 //# sourceMappingURL=CLIEngine.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js.map
index 81a10f2..4ac1481 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js.map
@@ -1 +1 @@
-{"version":3,"file":"CLIEngine.js","sourceRoot":"","sources":["../../src/ts-eslint/CLIEngine.ts"],"names":[],"mappings":";AAAA,oDAAoD;;AAEpD,mCAAsD;AA8EtD,MAAM,SAAS,GAAG,kBAOjB,CAAC;AAEO,8BAAS"}
\ No newline at end of file
+{"version":3,"file":"CLIEngine.js","sourceRoot":"","sources":["../../src/ts-eslint/CLIEngine.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;AAEpD,mCAAsD;AAyKtD;;;;;GAKG;AACH,MAAM,SAAU,SAAS,kBAAwC;CAAG;AAE3D,8BAAS"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ESLint.js.map
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts
index 572ad34..248e8fb 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts
@@ -1,84 +1,324 @@
-import { TSESTree, ParserServices } from '@typescript-eslint/typescript-estree';
+import { TSESTree, ParserServices } from '../ts-estree';
 import { ParserOptions as TSParserOptions } from './ParserOptions';
-import { RuleModule, RuleFix } from './Rule';
+import { RuleCreateFunction, RuleFix, RuleModule } from './Rule';
 import { Scope } from './Scope';
 import { SourceCode } from './SourceCode';
-interface Linter {
-    version: string;
-    verify(code: SourceCode | string, config: Linter.Config, filename?: string): Linter.LintMessage[];
-    verify(code: SourceCode | string, config: Linter.Config, options: Linter.LintOptions): Linter.LintMessage[];
-    verifyAndFix(code: string, config: Linter.Config, filename?: string): Linter.FixReport;
-    verifyAndFix(code: string, config: Linter.Config, options: Linter.FixOptions): Linter.FixReport;
+declare class LinterBase {
+    /**
+     * Initialize the Linter.
+     * @param config the config object
+     */
+    constructor(config?: Linter.LinterOptions);
+    /**
+     * Define a new parser module
+     * @param parserId Name of the parser
+     * @param parserModule The parser object
+     */
+    defineParser(parserId: string, parserModule: Linter.ParserModule): void;
+    /**
+     * Defines a new linting rule.
+     * @param ruleId A unique rule identifier
+     * @param ruleModule Function from context to object mapping AST node types to event handlers
+     */
+    defineRule<TMessageIds extends string, TOptions extends readonly unknown[]>(ruleId: string, ruleModule: RuleModule<TMessageIds, TOptions> | RuleCreateFunction): void;
+    /**
+     * Defines many new linting rules.
+     * @param rulesToDefine map from unique rule identifier to rule
+     */
+    defineRules<TMessageIds extends string, TOptions extends readonly unknown[]>(rulesToDefine: Record<string, RuleModule<TMessageIds, TOptions> | RuleCreateFunction>): void;
+    /**
+     * Gets an object with all loaded rules.
+     * @returns All loaded rules
+     */
+    getRules(): Map<string, RuleModule<string, unknown[]>>;
+    /**
+     * Gets the `SourceCode` object representing the parsed source.
+     * @returns The `SourceCode` object.
+     */
     getSourceCode(): SourceCode;
-    defineRule<TMessageIds extends string, TOptions extends readonly unknown[]>(name: string, rule: {
-        meta?: RuleModule<TMessageIds, TOptions>['meta'];
-        create: RuleModule<TMessageIds, TOptions>['create'];
-    }): void;
-    defineRules<TMessageIds extends string, TOptions extends readonly unknown[]>(rules: Record<string, RuleModule<TMessageIds, TOptions>>): void;
-    getRules<TMessageIds extends string, TOptions extends readonly unknown[]>(): Map<string, RuleModule<TMessageIds, TOptions>>;
-    defineParser(name: string, parser: Linter.ParserModule): void;
+    /**
+     * Verifies the text against the rules specified by the second argument.
+     * @param textOrSourceCode The text to parse or a SourceCode object.
+     * @param config An ESLintConfig instance to configure everything.
+     * @param filenameOrOptions The optional filename of the file being checked.
+     *        If this is not set, the filename will default to '<input>' in the rule context.
+     *        If this is an object, then it has "filename", "allowInlineConfig", and some properties.
+     * @returns The results as an array of messages or an empty array if no messages.
+     */
+    verify(textOrSourceCode: SourceCode | string, config: Linter.Config, filenameOrOptions?: string | Linter.VerifyOptions): Linter.LintMessage[];
+    /**
+     * Performs multiple autofix passes over the text until as many fixes as possible have been applied.
+     * @param text The source text to apply fixes to.
+     * @param config The ESLint config object to use.
+     * @param options The ESLint options object to use.
+     * @returns The result of the fix operation as returned from the SourceCodeFixer.
+     */
+    verifyAndFix(code: string, config: Linter.Config, options: Linter.FixOptions): Linter.FixReport;
+    /**
+     * The version from package.json.
+     */
+    readonly version: string;
+    /**
+     * The version from package.json.
+     */
+    static readonly version: string;
 }
 declare namespace Linter {
-    type Severity = 0 | 1 | 2;
-    type RuleLevel = Severity | 'off' | 'warn' | 'error';
-    type RuleLevelAndOptions = [RuleLevel, ...unknown[]];
-    interface Config {
-        rules?: {
-            [name: string]: RuleLevel | RuleLevelAndOptions;
-        };
-        parser?: string;
-        parserOptions?: ParserOptions;
-        settings?: {
-            [name: string]: unknown;
-        };
+    export interface LinterOptions {
+        /**
+         * path to a directory that should be considered as the current working directory.
+         */
+        cwd?: string;
+    }
+    export type Severity = 0 | 1 | 2;
+    export type SeverityString = 'off' | 'warn' | 'error';
+    export type RuleLevel = Severity | SeverityString;
+    export type RuleLevelAndOptions = [RuleLevel, ...unknown[]];
+    export type RuleEntry = RuleLevel | RuleLevelAndOptions;
+    export type RulesRecord = Partial<Record<string, RuleEntry>>;
+    interface BaseConfig {
+        $schema?: string;
+        /**
+         * The environment settings.
+         */
         env?: {
             [name: string]: boolean;
         };
+        /**
+         * The path to other config files or the package name of shareable configs.
+         */
+        extends?: string | string[];
+        /**
+         * The global variable settings.
+         */
         globals?: {
             [name: string]: boolean;
         };
-    }
-    type ParserOptions = TSParserOptions;
-    interface LintOptions {
-        filename?: string;
-        preprocess?: (code: string) => string[];
-        postprocess?: (problemLists: LintMessage[][]) => LintMessage[];
-        allowInlineConfig?: boolean;
+        /**
+         * The flag that disables directive comments.
+         */
+        noInlineConfig?: boolean;
+        /**
+         * The override settings per kind of files.
+         */
+        overrides?: ConfigOverride[];
+        /**
+         * The path to a parser or the package name of a parser.
+         */
+        parser?: string;
+        /**
+         * The parser options.
+         */
+        parserOptions?: ParserOptions;
+        /**
+         * The plugin specifiers.
+         */
+        plugins?: string[];
+        /**
+         * The processor specifier.
+         */
+        processor?: string;
+        /**
+         * The flag to report unused `eslint-disable` comments.
+         */
         reportUnusedDisableDirectives?: boolean;
+        /**
+         * The rule settings.
+         */
+        rules?: RulesRecord;
+        /**
+         * The shared settings.
+         */
+        settings?: {
+            [name: string]: unknown;
+        };
     }
-    interface LintMessage {
-        column: number;
-        line: number;
-        endColumn?: number;
-        endLine?: number;
-        ruleId: string | null;
-        message: string;
-        nodeType: string;
-        fatal?: true;
-        severity: Severity;
-        fix?: RuleFix;
-        source: string | null;
+    export interface ConfigOverride extends BaseConfig {
+        excludedFiles?: string | string[];
+        files: string | string[];
     }
-    interface FixOptions extends LintOptions {
+    export interface Config extends BaseConfig {
+        /**
+         * The glob patterns that ignore to lint.
+         */
+        ignorePatterns?: string | string[];
+        /**
+         * The root flag.
+         */
+        root?: boolean;
+    }
+    export type ParserOptions = TSParserOptions;
+    export interface VerifyOptions {
+        /**
+         * Allow/disallow inline comments' ability to change config once it is set. Defaults to true if not supplied.
+         * Useful if you want to validate JS without comments overriding rules.
+         */
+        allowInlineConfig?: boolean;
+        /**
+         * if `true` then the linter doesn't make `fix` properties into the lint result.
+         */
+        disableFixes?: boolean;
+        /**
+         * the filename of the source code.
+         */
+        filename?: string;
+        /**
+         * the predicate function that selects adopt code blocks.
+         */
+        filterCodeBlock?: (filename: string, text: string) => boolean;
+        /**
+         * postprocessor for report messages.
+         * If provided, this should accept an array of the message lists
+         * for each code block returned from the preprocessor, apply a mapping to
+         * the messages as appropriate, and return a one-dimensional array of
+         * messages.
+         */
+        postprocess?: Processor['postprocess'];
+        /**
+         * preprocessor for source text.
+         * If provided, this should accept a string of source text, and return an array of code blocks to lint.
+         */
+        preprocess?: Processor['preprocess'];
+        /**
+         * Adds reported errors for unused `eslint-disable` directives.
+         */
+        reportUnusedDisableDirectives?: boolean | SeverityString;
+    }
+    export interface FixOptions extends VerifyOptions {
+        /**
+         * Determines whether fixes should be applied.
+         */
         fix?: boolean;
     }
-    interface FixReport {
+    export interface LintSuggestion {
+        desc: string;
+        fix: RuleFix;
+        messageId?: string;
+    }
+    export interface LintMessage {
+        /**
+         * The 1-based column number.
+         */
+        column: number;
+        /**
+         * The 1-based column number of the end location.
+         */
+        endColumn?: number;
+        /**
+         * The 1-based line number of the end location.
+         */
+        endLine?: number;
+        /**
+         * If `true` then this is a fatal error.
+         */
+        fatal?: true;
+        /**
+         * Information for autofix.
+         */
+        fix?: RuleFix;
+        /**
+         * The 1-based line number.
+         */
+        line: number;
+        /**
+         * The error message.
+         */
+        message: string;
+        messageId?: string;
+        nodeType: string;
+        /**
+         * The ID of the rule which makes this message.
+         */
+        ruleId: string | null;
+        /**
+         * The severity of this message.
+         */
+        severity: Severity;
+        source: string | null;
+        /**
+         * Information for suggestions
+         */
+        suggestions?: LintSuggestion[];
+    }
+    export interface FixReport {
+        /**
+         * True, if the code was fixed
+         */
         fixed: boolean;
+        /**
+         * Fixed code text (might be the same as input if no fixes were applied).
+         */
         output: string;
+        /**
+         * Collection of all messages for the given code
+         */
         messages: LintMessage[];
     }
-    type ParserModule = {
-        parse(text: string, options?: unknown): TSESTree.Program;
+    export type ParserModule = {
+        parse(text: string, options?: ParserOptions): TSESTree.Program;
     } | {
-        parseForESLint(text: string, options?: unknown): ESLintParseResult;
+        parseForESLint(text: string, options?: ParserOptions): ESLintParseResult;
     };
-    interface ESLintParseResult {
+    export interface ESLintParseResult {
         ast: TSESTree.Program;
         parserServices?: ParserServices;
         scopeManager?: Scope.ScopeManager;
         visitorKeys?: SourceCode.VisitorKeys;
     }
+    export interface Processor {
+        /**
+         * The function to extract code blocks.
+         */
+        preprocess?: (text: string, filename: string) => Array<string | {
+            text: string;
+            filename: string;
+        }>;
+        /**
+         * The function to merge messages.
+         */
+        postprocess?: (messagesList: Linter.LintMessage[][], filename: string) => Linter.LintMessage[];
+        /**
+         * If `true` then it means the processor supports autofix.
+         */
+        supportsAutofix?: boolean;
+    }
+    export interface Environment {
+        /**
+         * The definition of global variables.
+         */
+        globals?: Record<string, Linter.Config>;
+        /**
+         * The parser options that will be enabled under this environment.
+         */
+        parserOptions?: ParserOptions;
+    }
+    export interface Plugin {
+        /**
+         * The definition of plugin configs.
+         */
+        configs?: Record<string, Linter.Config>;
+        /**
+         * The definition of plugin environments.
+         */
+        environments?: Record<string, Environment>;
+        /**
+         * The definition of plugin processors.
+         */
+        processors?: Record<string, Processor>;
+        /**
+         * The definition of plugin rules.
+         */
+        rules?: Record<string, RuleCreateFunction | RuleModule<string, unknown[]>>;
+    }
+    export {};
 }
-declare const Linter: new () => Linter;
+declare const Linter_base: typeof LinterBase;
+/**
+ * The Linter object does the actual evaluation of the JavaScript code. It doesn't do any filesystem operations, it
+ * simply parses and reports on the code. In particular, the Linter object does not process configuration objects
+ * or files.
+ */
+declare class Linter extends Linter_base {
+}
 export { Linter };
 //# sourceMappingURL=Linter.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts.map
index 608e0a7..5c2bc13 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Linter.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/Linter.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"Linter.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/Linter.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js
index a8a046c..4fd16f1 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js
@@ -1,7 +1,14 @@
 "use strict";
 /* eslint-disable @typescript-eslint/no-namespace */
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Linter = void 0;
 const eslint_1 = require("eslint");
-const Linter = eslint_1.Linter;
+/**
+ * The Linter object does the actual evaluation of the JavaScript code. It doesn't do any filesystem operations, it
+ * simply parses and reports on the code. In particular, the Linter object does not process configuration objects
+ * or files.
+ */
+class Linter extends eslint_1.Linter {
+}
 exports.Linter = Linter;
 //# sourceMappingURL=Linter.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js.map
index 7d93985..8c8e207 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js.map
@@ -1 +1 @@
-{"version":3,"file":"Linter.js","sourceRoot":"","sources":["../../src/ts-eslint/Linter.ts"],"names":[],"mappings":";AAAA,oDAAoD;;AAGpD,mCAAgD;AAwHhD,MAAM,MAAM,GAAG,eAEd,CAAC;AAEO,wBAAM"}
\ No newline at end of file
+{"version":3,"file":"Linter.js","sourceRoot":"","sources":["../../src/ts-eslint/Linter.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;AAEpD,mCAAgD;AA8WhD;;;;GAIG;AACH,MAAM,MAAO,SAAS,eAAkC;CAAG;AAElD,wBAAM"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts
index 05c9f40..d864322 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts
@@ -1,24 +1,2 @@
-import { TSESTreeOptions } from '@typescript-eslint/typescript-estree';
-export interface ParserOptions {
-    comment?: boolean;
-    ecmaFeatures?: {
-        globalReturn?: boolean;
-        jsx?: boolean;
-    };
-    ecmaVersion?: 3 | 5 | 6 | 7 | 8 | 9 | 10 | 2015 | 2016 | 2017 | 2018 | 2019;
-    errorOnTypeScriptSyntacticAndSemanticIssues?: boolean;
-    errorOnUnknownASTType?: boolean;
-    extraFileExtensions?: string[];
-    debugLevel?: TSESTreeOptions['debugLevel'];
-    filePath?: string;
-    loc?: boolean;
-    noWatch?: boolean;
-    project?: string | string[];
-    range?: boolean;
-    sourceType?: 'script' | 'module';
-    tokens?: boolean;
-    tsconfigRootDir?: string;
-    useJSXTextNode?: boolean;
-    warnOnUnsupportedTypeScriptVersion?: boolean;
-}
+export { DebugLevel, EcmaVersion, ParserOptions, SourceType, } from '@typescript-eslint/types';
 //# sourceMappingURL=ParserOptions.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts.map
index 26b50de..33c6d0e 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"ParserOptions.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/ParserOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE;QACb,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;IACF,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5E,2CAA2C,CAAC,EAAE,OAAO,CAAC;IACtD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE/B,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kCAAkC,CAAC,EAAE,OAAO,CAAC;CAC9C"}
\ No newline at end of file
+{"version":3,"file":"ParserOptions.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/ParserOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,UAAU,GACX,MAAM,0BAA0B,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts
index 87e3dd9..66a6599 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts
@@ -1,5 +1,5 @@
-import { ParserServices, TSESTree } from '@typescript-eslint/typescript-estree';
 import { JSONSchema4 } from '../json-schema';
+import { ParserServices, TSESTree } from '../ts-estree';
 import { AST } from './AST';
 import { Linter } from './Linter';
 import { Scope } from './Scope';
@@ -24,6 +24,10 @@
      */
     url: string;
     /**
+     * Specifies whether the rule can return suggestions.
+     */
+    suggestion?: boolean;
+    /**
      * Does the rule require us to create a full TypeScript Program in order for it
      * to type-check code. This is only used for documentation purposes.
      */
@@ -90,37 +94,37 @@
     /**
      * The parameters for the message string associated with `messageId`.
      */
-    data?: Record<string, unknown>;
+    readonly data?: Readonly<Record<string, unknown>>;
     /**
      * The fixer function.
      */
-    fix?: ReportFixFunction | null;
+    readonly fix?: ReportFixFunction | null;
     /**
      * The messageId which is being reported.
      */
-    messageId: TMessageIds;
+    readonly messageId: TMessageIds;
 }
 interface ReportDescriptorWithSuggestion<TMessageIds extends string> extends ReportDescriptorBase<TMessageIds> {
     /**
      * 6.7's Suggestions API
      */
-    suggest?: Readonly<ReportSuggestionArray<TMessageIds>> | null;
+    readonly suggest?: Readonly<ReportSuggestionArray<TMessageIds>> | null;
 }
 interface ReportDescriptorNodeOptionalLoc {
     /**
      * The Node or AST Token which the report is being attached to
      */
-    node: TSESTree.Node | TSESTree.Comment | TSESTree.Token;
+    readonly node: TSESTree.Node | TSESTree.Comment | TSESTree.Token;
     /**
      * An override of the location of the report
      */
-    loc?: TSESTree.SourceLocation | TSESTree.LineAndColumnData;
+    readonly loc?: Readonly<TSESTree.SourceLocation> | Readonly<TSESTree.LineAndColumnData>;
 }
 interface ReportDescriptorLocOnly {
     /**
      * An override of the location of the report
      */
-    loc: TSESTree.SourceLocation | TSESTree.LineAndColumnData;
+    loc: Readonly<TSESTree.SourceLocation> | Readonly<TSESTree.LineAndColumnData>;
 }
 declare type ReportDescriptor<TMessageIds extends string> = ReportDescriptorWithSuggestion<TMessageIds> & (ReportDescriptorNodeOptionalLoc | ReportDescriptorLocOnly);
 interface RuleContext<TMessageIds extends string, TOptions extends readonly unknown[]> {
@@ -134,11 +138,6 @@
      */
     options: TOptions;
     /**
-     * The shared settings from configuration.
-     * We do not have any shared settings in this plugin.
-     */
-    settings: Record<string, unknown>;
-    /**
      * The name of the parser from configuration.
      */
     parserPath: string;
@@ -151,6 +150,11 @@
      */
     parserServices?: ParserServices;
     /**
+     * The shared settings from configuration.
+     * We do not have any shared settings in this plugin.
+     */
+    settings: Record<string, unknown>;
+    /**
      * Returns an array of the ancestors of the currently-traversed node, starting at
      * the root of the AST and continuing through the direct parent of the current node.
      * This array does not include the currently-traversed node itself.
@@ -174,7 +178,7 @@
      * Returns a SourceCode object that you can use to work with the source that
      * was passed to ESLint.
      */
-    getSourceCode(): SourceCode;
+    getSourceCode(): Readonly<SourceCode>;
     /**
      * Marks a variable with the given name in the current scope as used.
      * This affects the no-unused-vars rule.
@@ -200,6 +204,7 @@
     BreakStatement?: RuleFunction<TSESTree.BreakStatement>;
     CallExpression?: RuleFunction<TSESTree.CallExpression>;
     CatchClause?: RuleFunction<TSESTree.CatchClause>;
+    ChainExpression?: RuleFunction<TSESTree.ChainExpression>;
     ClassBody?: RuleFunction<TSESTree.ClassBody>;
     ClassDeclaration?: RuleFunction<TSESTree.ClassDeclaration>;
     ClassExpression?: RuleFunction<TSESTree.ClassExpression>;
@@ -223,9 +228,9 @@
     FunctionExpression?: RuleFunction<TSESTree.FunctionExpression>;
     Identifier?: RuleFunction<TSESTree.Identifier>;
     IfStatement?: RuleFunction<TSESTree.IfStatement>;
-    Import?: RuleFunction<TSESTree.Import>;
     ImportDeclaration?: RuleFunction<TSESTree.ImportDeclaration>;
     ImportDefaultSpecifier?: RuleFunction<TSESTree.ImportDefaultSpecifier>;
+    ImportExpression?: RuleFunction<TSESTree.ImportExpression>;
     ImportNamespaceSpecifier?: RuleFunction<TSESTree.ImportNamespaceSpecifier>;
     ImportSpecifier?: RuleFunction<TSESTree.ImportSpecifier>;
     JSXAttribute?: RuleFunction<TSESTree.JSXAttribute>;
@@ -251,8 +256,6 @@
     NewExpression?: RuleFunction<TSESTree.NewExpression>;
     ObjectExpression?: RuleFunction<TSESTree.ObjectExpression>;
     ObjectPattern?: RuleFunction<TSESTree.ObjectPattern>;
-    OptionalCallExpression?: RuleFunction<TSESTree.OptionalCallExpression>;
-    OptionalMemberExpression?: RuleFunction<TSESTree.OptionalMemberExpression>;
     Program?: RuleFunction<TSESTree.Program>;
     Property?: RuleFunction<TSESTree.Property>;
     RestElement?: RuleFunction<TSESTree.RestElement>;
@@ -359,7 +362,8 @@
      * Function which returns an object with methods that ESLint calls to “visit”
      * nodes while traversing the abstract syntax tree.
      */
-    create(context: RuleContext<TMessageIds, TOptions>): TRuleListener;
+    create(context: Readonly<RuleContext<TMessageIds, TOptions>>): TRuleListener;
 }
-export { ReportDescriptor, ReportFixFunction, ReportSuggestionArray, RuleContext, RuleFix, RuleFixer, RuleFunction, RuleListener, RuleMetaData, RuleMetaDataDocs, RuleModule, };
+declare type RuleCreateFunction = (context: Readonly<RuleContext<never, unknown[]>>) => RuleListener;
+export { ReportDescriptor, ReportFixFunction, ReportSuggestionArray, RuleContext, RuleCreateFunction, RuleFix, RuleFixer, RuleFunction, RuleListener, RuleMetaData, RuleMetaDataDocs, RuleModule, };
 //# sourceMappingURL=Rule.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts.map
index 38bdbbd..0e858f8 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Rule.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/Rule.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"Rule.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/Rule.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts
index 9496d90..12de0ff 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts
@@ -1,53 +1,137 @@
-import { AST_NODE_TYPES, AST_TOKEN_TYPES } from '@typescript-eslint/typescript-estree';
+import { AST_NODE_TYPES, AST_TOKEN_TYPES } from '../ts-estree';
 import { ParserOptions } from './ParserOptions';
 import { RuleModule } from './Rule';
 interface ValidTestCase<TOptions extends Readonly<unknown[]>> {
-    code: string;
-    options?: TOptions;
-    filename?: string;
-    parserOptions?: ParserOptions;
-    settings?: Record<string, unknown>;
-    parser?: string;
-    globals?: Record<string, boolean>;
-    env?: {
-        browser?: boolean;
-    };
+    /**
+     * Code for the test case.
+     */
+    readonly code: string;
+    /**
+     * Environments for the test case.
+     */
+    readonly env?: Readonly<Record<string, boolean>>;
+    /**
+     * The fake filename for the test case. Useful for rules that make assertion about filenames.
+     */
+    readonly filename?: string;
+    /**
+     * The additional global variables.
+     */
+    readonly globals?: Record<string, 'readonly' | 'writable' | 'off'>;
+    /**
+     * Options for the test case.
+     */
+    readonly options?: Readonly<TOptions>;
+    /**
+     * The absolute path for the parser.
+     */
+    readonly parser?: string;
+    /**
+     * Options for the parser.
+     */
+    readonly parserOptions?: Readonly<ParserOptions>;
+    /**
+     * Settings for the test case.
+     */
+    readonly settings?: Readonly<Record<string, unknown>>;
 }
 interface SuggestionOutput<TMessageIds extends string> {
-    messageId: TMessageIds;
-    data?: Record<string, unknown>;
+    /**
+     * Reported message ID.
+     */
+    readonly messageId: TMessageIds;
+    /**
+     * The data used to fill the message template.
+     */
+    readonly data?: Readonly<Record<string, unknown>>;
     /**
      * NOTE: Suggestions will be applied as a stand-alone change, without triggering multi-pass fixes.
      * Each individual error has its own suggestion, so you have to show the correct, _isolated_ output for each suggestion.
      */
-    output: string;
+    readonly output: string;
 }
 interface InvalidTestCase<TMessageIds extends string, TOptions extends Readonly<unknown[]>> extends ValidTestCase<TOptions> {
-    errors: TestCaseError<TMessageIds>[];
-    output?: string | null;
+    /**
+     * Expected errors.
+     */
+    readonly errors: readonly TestCaseError<TMessageIds>[];
+    /**
+     * The expected code after autofixes are applied. If set to `null`, the test runner will assert that no autofix is suggested.
+     */
+    readonly output?: string | null;
 }
 interface TestCaseError<TMessageIds extends string> {
-    messageId: TMessageIds;
-    data?: Record<string, unknown>;
-    type?: AST_NODE_TYPES | AST_TOKEN_TYPES;
-    line?: number;
-    column?: number;
-    endLine?: number;
-    endColumn?: number;
-    suggestions?: SuggestionOutput<TMessageIds>[] | null;
+    /**
+     * The 1-based column number of the reported start location.
+     */
+    readonly column?: number;
+    /**
+     * The data used to fill the message template.
+     */
+    readonly data?: Readonly<Record<string, unknown>>;
+    /**
+     * The 1-based column number of the reported end location.
+     */
+    readonly endColumn?: number;
+    /**
+     * The 1-based line number of the reported end location.
+     */
+    readonly endLine?: number;
+    /**
+     * The 1-based line number of the reported start location.
+     */
+    readonly line?: number;
+    /**
+     * Reported message ID.
+     */
+    readonly messageId: TMessageIds;
+    /**
+     * Reported suggestions.
+     */
+    readonly suggestions?: SuggestionOutput<TMessageIds>[] | null;
+    /**
+     * The type of the reported AST node.
+     */
+    readonly type?: AST_NODE_TYPES | AST_TOKEN_TYPES;
 }
 interface RunTests<TMessageIds extends string, TOptions extends Readonly<unknown[]>> {
-    valid: (ValidTestCase<TOptions> | string)[];
-    invalid: InvalidTestCase<TMessageIds, TOptions>[];
+    readonly valid: readonly (ValidTestCase<TOptions> | string)[];
+    readonly invalid: readonly InvalidTestCase<TMessageIds, TOptions>[];
 }
 interface RuleTesterConfig {
-    parser: string;
-    parserOptions?: ParserOptions;
+    readonly parser: string;
+    readonly parserOptions?: Readonly<ParserOptions>;
 }
-declare const RuleTester_base: new (...args: unknown[]) => any;
+declare class RuleTesterBase {
+    /**
+     * Creates a new instance of RuleTester.
+     * @param testerConfig extra configuration for the tester
+     */
+    constructor(testerConfig?: RuleTesterConfig);
+    /**
+     * Adds a new rule test to execute.
+     * @param ruleName The name of the rule to run.
+     * @param rule The rule to test.
+     * @param test The collection of tests to run.
+     */
+    run<TMessageIds extends string, TOptions extends Readonly<unknown[]>>(ruleName: string, rule: RuleModule<TMessageIds, TOptions>, tests: RunTests<TMessageIds, TOptions>): void;
+    /**
+     * If you supply a value to this property, the rule tester will call this instead of using the version defined on
+     * the global namespace.
+     * @param text a string describing the rule
+     * @param callback the test callback
+     */
+    static describe?: (text: string, callback: () => void) => void;
+    /**
+     * If you supply a value to this property, the rule tester will call this instead of using the version defined on
+     * the global namespace.
+     * @param text a string describing the test case
+     * @param callback the test callback
+     */
+    static it?: (text: string, callback: () => void) => void;
+}
+declare const RuleTester_base: typeof RuleTesterBase;
 declare class RuleTester extends RuleTester_base {
-    constructor(config?: RuleTesterConfig);
-    run<TMessageIds extends string, TOptions extends Readonly<unknown[]>>(name: string, rule: RuleModule<TMessageIds, TOptions>, tests: RunTests<TMessageIds, TOptions>): void;
 }
 export { InvalidTestCase, SuggestionOutput, RuleTester, RuleTesterConfig, RunTests, TestCaseError, ValidTestCase, };
 //# sourceMappingURL=RuleTester.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts.map
index 582cd76..209fca5 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"RuleTester.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/RuleTester.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EAChB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,UAAU,aAAa,CAAC,QAAQ,SAAS,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,GAAG,CAAC,EAAE;QACJ,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED,UAAU,gBAAgB,CAAC,WAAW,SAAS,MAAM;IACnD,SAAS,EAAE,WAAW,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAe,CACvB,WAAW,SAAS,MAAM,EAC1B,QAAQ,SAAS,QAAQ,CAAC,OAAO,EAAE,CAAC,CACpC,SAAQ,aAAa,CAAC,QAAQ,CAAC;IAC/B,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,UAAU,aAAa,CAAC,WAAW,SAAS,MAAM;IAChD,SAAS,EAAE,WAAW,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,cAAc,GAAG,eAAe,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC;CACtD;AAED,UAAU,QAAQ,CAChB,WAAW,SAAS,MAAM,EAC1B,QAAQ,SAAS,QAAQ,CAAC,OAAO,EAAE,CAAC;IAGpC,KAAK,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;IAC5C,OAAO,EAAE,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;CACnD;AACD,UAAU,gBAAgB;IAExB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;;AAGD,cAAM,UAAW,SAAQ,eAGvB;gBACY,MAAM,CAAC,EAAE,gBAAgB;IAWrC,GAAG,CAAC,WAAW,SAAS,MAAM,EAAE,QAAQ,SAAS,QAAQ,CAAC,OAAO,EAAE,CAAC,EAClE,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,EACvC,KAAK,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,GACrC,IAAI;CAIR;AAED,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,aAAa,GACd,CAAC"}
\ No newline at end of file
+{"version":3,"file":"RuleTester.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/RuleTester.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,UAAU,aAAa,CAAC,QAAQ,SAAS,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1D;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC;IACnE;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtC;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjD;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAED,UAAU,gBAAgB,CAAC,WAAW,SAAS,MAAM;IACnD;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAIzB;AAED,UAAU,eAAe,CACvB,WAAW,SAAS,MAAM,EAC1B,QAAQ,SAAS,QAAQ,CAAC,OAAO,EAAE,CAAC,CACpC,SAAQ,aAAa,CAAC,QAAQ,CAAC;IAC/B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;IACvD;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,UAAU,aAAa,CAAC,WAAW,SAAS,MAAM;IAChD;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC;IAC9D;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,eAAe,CAAC;CAIlD;AAED,UAAU,QAAQ,CAChB,WAAW,SAAS,MAAM,EAC1B,QAAQ,SAAS,QAAQ,CAAC,OAAO,EAAE,CAAC;IAGpC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;IAC9D,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;CACrE;AACD,UAAU,gBAAgB;IAExB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;CAClD;AAED,OAAO,OAAO,cAAc;IAC1B;;;OAGG;gBACS,YAAY,CAAC,EAAE,gBAAgB;IAE3C;;;;;OAKG;IACH,GAAG,CAAC,WAAW,SAAS,MAAM,EAAE,QAAQ,SAAS,QAAQ,CAAC,OAAO,EAAE,CAAC,EAClE,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,EACvC,KAAK,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,GACrC,IAAI;IAEP;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAE/D;;;;;OAKG;IACH,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CAC1D;;AAED,cAAM,UAAW,SAAQ,eAA2C;CAAG;AAEvE,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,aAAa,GACd,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js
index 1e04595..f31d0a6 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js
@@ -1,22 +1,8 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.RuleTester = void 0;
 const eslint_1 = require("eslint");
-// the cast on the extends is so that we don't want to have the built type defs to attempt to import eslint
 class RuleTester extends eslint_1.RuleTester {
-    constructor(config) {
-        var _a, _b;
-        super(config);
-        // nobody will ever need watching in tests
-        // so we can give everyone a perf win by disabling watching
-        if ((_b = (_a = config) === null || _a === void 0 ? void 0 : _a.parserOptions) === null || _b === void 0 ? void 0 : _b.project) {
-            config.parserOptions.noWatch =
-                typeof config.parserOptions.noWatch === 'boolean' || true;
-        }
-    }
-    run(name, rule, tests) {
-        // this method is only defined here because we lazily type the eslint import with `any`
-        super.run(name, rule, tests);
-    }
 }
 exports.RuleTester = RuleTester;
 //# sourceMappingURL=RuleTester.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js.map
index 1374a80..4fe5fc6 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js.map
@@ -1 +1 @@
-{"version":3,"file":"RuleTester.js","sourceRoot":"","sources":["../../src/ts-eslint/RuleTester.ts"],"names":[],"mappings":";;AAIA,mCAAwD;AA4DxD,2GAA2G;AAC3G,MAAM,UAAW,SAAS,mBAGxB;IACA,YAAY,MAAyB;;QACnC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,0CAA0C;QAC1C,2DAA2D;QAC3D,gBAAI,MAAM,0CAAE,aAAa,0CAAE,OAAO,EAAE;YAClC,MAAM,CAAC,aAAa,CAAC,OAAO;gBAC1B,OAAO,MAAM,CAAC,aAAa,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC;SAC7D;IACH,CAAC;IAED,GAAG,CACD,IAAY,EACZ,IAAuC,EACvC,KAAsC;QAEtC,uFAAuF;QACvF,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;CACF;AAKC,gCAAU"}
\ No newline at end of file
+{"version":3,"file":"RuleTester.js","sourceRoot":"","sources":["../../src/ts-eslint/RuleTester.ts"],"names":[],"mappings":";;;AAAA,mCAAwD;AAiKxD,MAAM,UAAW,SAAS,mBAA0C;CAAG;AAKrE,gCAAU"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts
index 43afac6..a1389e7 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts
@@ -1,80 +1,46 @@
-import { TSESTree } from '@typescript-eslint/typescript-estree';
+import * as scopeManager from '@typescript-eslint/scope-manager';
+import { TSESTree } from '@typescript-eslint/types';
 declare namespace Scope {
-    interface ScopeManager {
-        scopes: Scope[];
-        globalScope: Scope | null;
-        acquire(node: TSESTree.Node, inner?: boolean): Scope | null;
-        getDeclaredVariables(node: TSESTree.Node): Variable[];
+    class ESLintScopeVariable {
+        readonly defs: Definition[];
+        readonly identifiers: TSESTree.Identifier[];
+        readonly name: string;
+        readonly references: Reference[];
+        readonly scope: Scope;
+        /**
+         * Written to by ESLint.
+         * If this key exists, this variable is a global variable added by ESLint.
+         * If this is `true`, this variable can be assigned arbitrary values.
+         * If this is `false`, this variable is readonly.
+         */
+        writeable?: boolean;
+        /**
+         * Written to by ESLint.
+         * This property is undefined if there are no globals directive comments.
+         * The array of globals directive comments which defined this global variable in the source code file.
+         */
+        eslintExplicitGlobal?: boolean;
+        /**
+         * Written to by ESLint.
+         * The configured value in config files. This can be different from `variable.writeable` if there are globals directive comments.
+         */
+        eslintImplicitGlobalSetting?: 'readonly' | 'writable';
+        /**
+         * Written to by ESLint.
+         * If this key exists, it is a global variable added by ESLint.
+         * If `true`, this global variable was defined by a globals directive comment in the source code file.
+         */
+        eslintExplicitGlobalComments?: TSESTree.Comment[];
     }
-    interface Reference {
-        identifier: TSESTree.Identifier;
-        from: Scope;
-        resolved: Variable | null;
-        writeExpr: TSESTree.Node | null;
-        init: boolean;
-        isWrite(): boolean;
-        isRead(): boolean;
-        isWriteOnly(): boolean;
-        isReadOnly(): boolean;
-        isReadWrite(): boolean;
-    }
-    interface Variable {
-        name: string;
-        identifiers: TSESTree.Identifier[];
-        references: Reference[];
-        defs: Definition[];
-        scope: Scope;
-        eslintUsed?: boolean;
-    }
-    interface Scope {
-        type: 'block' | 'catch' | 'class' | 'for' | 'function' | 'function-expression-name' | 'global' | 'module' | 'switch' | 'with' | 'TDZ';
-        isStrict: boolean;
-        upper: Scope | null;
-        childScopes: Scope[];
-        variableScope: Scope;
-        block: TSESTree.Node;
-        variables: Variable[];
-        set: Map<string, Variable>;
-        references: Reference[];
-        through: Reference[];
-        functionExpressionScope: boolean;
-    }
-    type DefinitionType = {
-        type: 'CatchClause';
-        node: TSESTree.CatchClause;
-        parent: null;
-    } | {
-        type: 'ClassName';
-        node: TSESTree.ClassDeclaration | TSESTree.ClassExpression;
-        parent: null;
-    } | {
-        type: 'FunctionName';
-        node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression;
-        parent: null;
-    } | {
-        type: 'ImplicitGlobalVariable';
-        node: TSESTree.Program;
-        parent: null;
-    } | {
-        type: 'ImportBinding';
-        node: TSESTree.ImportSpecifier | TSESTree.ImportDefaultSpecifier | TSESTree.ImportNamespaceSpecifier;
-        parent: TSESTree.ImportDeclaration;
-    } | {
-        type: 'Parameter';
-        node: TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.ArrowFunctionExpression;
-        parent: null;
-    } | {
-        type: 'TDZ';
-        node: unknown;
-        parent: null;
-    } | {
-        type: 'Variable';
-        node: TSESTree.VariableDeclarator;
-        parent: TSESTree.VariableDeclaration;
-    };
-    type Definition = DefinitionType & {
-        name: TSESTree.Identifier;
-    };
+    export type ScopeManager = scopeManager.ScopeManager;
+    export type Reference = scopeManager.Reference;
+    export type Variable = scopeManager.Variable | ESLintScopeVariable;
+    export type Scope = scopeManager.Scope;
+    export const ScopeType: typeof scopeManager.ScopeType;
+    export type DefinitionType = scopeManager.Definition;
+    export type Definition = scopeManager.Definition;
+    export const DefinitionType: typeof scopeManager.DefinitionType;
+    export {};
 }
 export { Scope };
 //# sourceMappingURL=Scope.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts.map
index c7c3311..0a97fe2 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"Scope.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/Scope.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"Scope.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/Scope.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,YAAY,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,kBAAU,KAAK,CAAC;IAGd,MAAc,mBAAmB;QAC/B,SAAgB,IAAI,EAAE,UAAU,EAAE,CAAC;QACnC,SAAgB,WAAW,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;QACnD,SAAgB,IAAI,EAAE,MAAM,CAAC;QAC7B,SAAgB,UAAU,EAAE,SAAS,EAAE,CAAC;QACxC,SAAgB,KAAK,EAAE,KAAK,CAAC;QAE7B;;;;;WAKG;QACI,SAAS,CAAC,EAAE,OAAO,CAAC;QAE3B;;;;WAIG;QACI,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAEtC;;;WAGG;QACI,2BAA2B,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;QAE7D;;;;WAIG;QACI,4BAA4B,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;KAC1D;IAED,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC;IACrD,MAAM,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;IAC/C,MAAM,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,GAAG,mBAAmB,CAAC;IACnE,MAAM,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;IACvC,MAAM,CAAC,MAAM,SAAS,+BAAyB,CAAC;IAEhD,MAAM,MAAM,cAAc,GAAG,YAAY,CAAC,UAAU,CAAC;IACrD,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;IACjD,MAAM,CAAC,MAAM,cAAc,oCAA8B,CAAC;;CAC3D;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js
index 58352c5..f2d43b6 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js
@@ -1,4 +1,31 @@
 "use strict";
 /* eslint-disable @typescript-eslint/no-namespace */
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Scope = void 0;
+const scopeManager = __importStar(require("@typescript-eslint/scope-manager"));
+var Scope;
+(function (Scope) {
+    Scope.ScopeType = scopeManager.ScopeType;
+    Scope.DefinitionType = scopeManager.DefinitionType;
+})(Scope || (Scope = {}));
+exports.Scope = Scope;
 //# sourceMappingURL=Scope.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js.map
index aa9a3e0..6c89e79 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js.map
@@ -1 +1 @@
-{"version":3,"file":"Scope.js","sourceRoot":"","sources":["../../src/ts-eslint/Scope.ts"],"names":[],"mappings":";AAAA,oDAAoD"}
\ No newline at end of file
+{"version":3,"file":"Scope.js","sourceRoot":"","sources":["../../src/ts-eslint/Scope.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;;;;;;;;;;;;;;;;;;;;AAEpD,+EAAiE;AAGjE,IAAU,KAAK,CAgDd;AAhDD,WAAU,KAAK;IA2CA,eAAS,GAAG,YAAY,CAAC,SAAS,CAAC;IAInC,oBAAc,GAAG,YAAY,CAAC,cAAc,CAAC;AAC5D,CAAC,EAhDS,KAAK,KAAL,KAAK,QAgDd;AAEQ,sBAAK"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts
index d4c3a8c..5d5b193 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts
@@ -1,64 +1,311 @@
-import { ParserServices, TSESTree } from '@typescript-eslint/typescript-estree';
+import { ParserServices, TSESTree } from '../ts-estree';
 import { Scope } from './Scope';
-declare interface SourceCode {
-    text: string;
+declare class TokenStore {
+    /**
+     * Checks whether any comments exist or not between the given 2 nodes.
+     * @param left The node to check.
+     * @param right The node to check.
+     * @returns `true` if one or more comments exist.
+     */
+    commentsExistBetween(left: TSESTree.Node | TSESTree.Token, right: TSESTree.Node | TSESTree.Token): boolean;
+    /**
+     * Gets all comment tokens directly after the given node or token.
+     * @param nodeOrToken The AST node or token to check for adjacent comment tokens.
+     * @returns An array of comments in occurrence order.
+     */
+    getCommentsAfter(nodeOrToken: TSESTree.Node | TSESTree.Token): TSESTree.Comment[];
+    /**
+     * Gets all comment tokens directly before the given node or token.
+     * @param nodeOrToken The AST node or token to check for adjacent comment tokens.
+     * @returns An array of comments in occurrence order.
+     */
+    getCommentsBefore(nodeOrToken: TSESTree.Node | TSESTree.Token): TSESTree.Comment[];
+    /**
+     * Gets all comment tokens inside the given node.
+     * @param node The AST node to get the comments for.
+     * @returns An array of comments in occurrence order.
+     */
+    getCommentsInside(node: TSESTree.Node): TSESTree.Comment[];
+    /**
+     * Gets the first token of the given node.
+     * @param node The AST node.
+     * @param option The option object. If this is a number then it's `options.skip`. If this is a function then it's `options.filter`.
+     * @returns An object representing the token.
+     */
+    getFirstToken<T extends SourceCode.CursorWithSkipOptions>(node: TSESTree.Node, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
+    /**
+     * Gets the first token between two non-overlapping nodes.
+     * @param left Node before the desired token range.
+     * @param right Node after the desired token range.
+     * @param option The option object. If this is a number then it's `options.skip`. If this is a function then it's `options.filter`.
+     * @returns An object representing the token.
+     */
+    getFirstTokenBetween<T extends SourceCode.CursorWithSkipOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
+    /**
+     * Gets the first `count` tokens of the given node.
+     * @param node The AST node.
+     * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.
+     * @returns Tokens.
+     */
+    getFirstTokens<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
+    /**
+     * Gets the first `count` tokens between two non-overlapping nodes.
+     * @param left Node before the desired token range.
+     * @param right Node after the desired token range.
+     * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.
+     * @returns Tokens between left and right.
+     */
+    getFirstTokensBetween<T extends SourceCode.CursorWithCountOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
+    /**
+     * Gets the last token of the given node.
+     * @param node The AST node.
+     * @param option The option object. If this is a number then it's `options.skip`. If this is a function then it's `options.filter`.
+     * @returns An object representing the token.
+     */
+    getLastToken<T extends SourceCode.CursorWithSkipOptions>(node: TSESTree.Node, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
+    /**
+     * Gets the last token between two non-overlapping nodes.
+     * @param left Node before the desired token range.
+     * @param right Node after the desired token range.
+     * @param option The option object. If this is a number then it's `options.skip`. If this is a function then it's `options.filter`.
+     * @returns An object representing the token.
+     */
+    getLastTokenBetween<T extends SourceCode.CursorWithSkipOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
+    /**
+     * Gets the last `count` tokens of the given node.
+     * @param node The AST node.
+     * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.
+     * @returns Tokens.
+     */
+    getLastTokens<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
+    /**
+     * Gets the last `count` tokens between two non-overlapping nodes.
+     * @param left Node before the desired token range.
+     * @param right Node after the desired token range.
+     * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.
+     * @returns Tokens between left and right.
+     */
+    getLastTokensBetween<T extends SourceCode.CursorWithCountOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
+    /**
+     * Gets the token that follows a given node or token.
+     * @param node The AST node or token.
+     * @param option The option object. If this is a number then it's `options.skip`. If this is a function then it's `options.filter`.
+     * @returns An object representing the token.
+     */
+    getTokenAfter<T extends SourceCode.CursorWithSkipOptions>(node: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
+    /**
+     * Gets the token that precedes a given node or token.
+     * @param node The AST node or token.
+     * @param options The option object
+     * @returns An object representing the token.
+     */
+    getTokenBefore<T extends SourceCode.CursorWithSkipOptions>(node: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
+    /**
+     * Gets the token starting at the specified index.
+     * @param offset Index of the start of the token's range.
+     * @param option The option object. If this is a number then it's `options.skip`. If this is a function then it's `options.filter`.
+     * @returns The token starting at index, or null if no such token.
+     */
+    getTokenByRangeStart<T extends {
+        includeComments?: boolean;
+    }>(offset: number, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
+    /**
+     * Gets all tokens that are related to the given node.
+     * @param node The AST node.
+     * @param beforeCount The number of tokens before the node to retrieve.
+     * @param afterCount The number of tokens after the node to retrieve.
+     * @returns Array of objects representing tokens.
+     */
+    getTokens(node: TSESTree.Node, beforeCount?: number, afterCount?: number): TSESTree.Token[];
+    /**
+     * Gets all tokens that are related to the given node.
+     * @param node The AST node.
+     * @param options The option object. If this is a function then it's `options.filter`.
+     * @returns Array of objects representing tokens.
+     */
+    getTokens<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node, options: T): SourceCode.ReturnTypeFromOptions<T>[];
+    /**
+     * Gets the `count` tokens that follows a given node or token.
+     * @param node The AST node.
+     * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.
+     * @returns Tokens.
+     */
+    getTokensAfter<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
+    /**
+     * Gets the `count` tokens that precedes a given node or token.
+     * @param node The AST node.
+     * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.
+     * @returns Tokens.
+     */
+    getTokensBefore<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
+    /**
+     * Gets all of the tokens between two non-overlapping nodes.
+     * @param left Node before the desired token range.
+     * @param right Node after the desired token range.
+     * @param options The option object. If this is a function then it's `options.filter`.
+     * @returns Tokens between left and right.
+     */
+    getTokensBetween<T extends SourceCode.CursorWithCountOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, padding?: T): SourceCode.ReturnTypeFromOptions<T>[];
+    /**
+     * Gets all of the tokens between two non-overlapping nodes.
+     * @param left Node before the desired token range.
+     * @param right Node after the desired token range.
+     * @param padding Number of extra tokens on either side of center.
+     * @returns Tokens between left and right.
+     */
+    getTokensBetween<T extends SourceCode.CursorWithCountOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, padding?: number): SourceCode.ReturnTypeFromOptions<T>[];
+}
+declare class SourceCodeBase extends TokenStore {
+    /**
+     * Represents parsed source code.
+     * @param text The source code text.
+     * @param ast The Program node of the AST representing the code. This AST should be created from the text that BOM was stripped.
+     */
+    constructor(text: string, ast: SourceCode.Program);
+    /**
+     * Represents parsed source code.
+     * @param config The config object.
+     */
+    constructor(config: SourceCode.SourceCodeConfig);
+    /**
+     * The parsed AST for the source code.
+     */
     ast: SourceCode.Program;
-    lines: string[];
-    hasBOM: boolean;
-    parserServices: ParserServices;
-    scopeManager: Scope.ScopeManager;
-    visitorKeys: SourceCode.VisitorKeys;
-    tokensAndComments: (TSESTree.Comment | TSESTree.Token)[];
-    getText(node?: TSESTree.Node, beforeCount?: number, afterCount?: number): string;
-    getLines(): string[];
+    /**
+     * Retrieves an array containing all comments in the source code.
+     * @returns An array of comment nodes.
+     */
     getAllComments(): TSESTree.Comment[];
+    /**
+     * Gets all comments for the given node.
+     * @param node The AST node to get the comments for.
+     * @returns An object containing a leading and trailing array of comments indexed by their position.
+     */
     getComments(node: TSESTree.Node): {
         leading: TSESTree.Comment[];
         trailing: TSESTree.Comment[];
     };
-    getJSDocComment(node: TSESTree.Node): TSESTree.Node | TSESTree.Token | null;
-    getNodeByRangeIndex(index: number): TSESTree.Node | null;
-    isSpaceBetween(first: TSESTree.Token | TSESTree.Comment | TSESTree.Node, second: TSESTree.Token | TSESTree.Comment | TSESTree.Node): boolean;
     /**
-     * @deprecated in favor of isSpaceBetween()
+     * Converts a (line, column) pair into a range index.
+     * @param loc A line/column location
+     * @returns The range index of the location in the file.
+     */
+    getIndexFromLoc(location: TSESTree.LineAndColumnData): number;
+    /**
+     * Gets the entire source text split into an array of lines.
+     * @returns The source text as an array of lines.
+     */
+    getLines(): string[];
+    /**
+     * Converts a source text index into a (line, column) pair.
+     * @param index The index of a character in a file
+     * @returns A {line, column} location object with a 0-indexed column
+     */
+    getLocFromIndex(index: number): TSESTree.LineAndColumnData;
+    /**
+     * Gets the deepest node containing a range index.
+     * @param index Range index of the desired node.
+     * @returns The node if found or `null` if not found.
+     */
+    getNodeByRangeIndex(index: number): TSESTree.Node | null;
+    /**
+     * Gets the source code for the given node.
+     * @param node The AST node to get the text for.
+     * @param beforeCount The number of characters before the node to retrieve.
+     * @param afterCount The number of characters after the node to retrieve.
+     * @returns The text representing the AST node.
+     */
+    getText(node?: TSESTree.Node, beforeCount?: number, afterCount?: number): string;
+    /**
+     * The flag to indicate that the source code has Unicode BOM.
+     */
+    hasBOM: boolean;
+    /**
+     * Determines if two nodes or tokens have at least one whitespace character
+     * between them. Order does not matter. Returns false if the given nodes or
+     * tokens overlap.
+     * This was added in v6.7.0.
+     * @since 6.7.0
+     * @param first The first node or token to check between.
+     * @param second The second node or token to check between.
+     * @returns True if there is a whitespace character between any of the tokens found between the two given nodes or tokens.
+     */
+    isSpaceBetween?(first: TSESTree.Token | TSESTree.Comment | TSESTree.Node, second: TSESTree.Token | TSESTree.Comment | TSESTree.Node): boolean;
+    /**
+     * Determines if two nodes or tokens have at least one whitespace character
+     * between them. Order does not matter. Returns false if the given nodes or
+     * tokens overlap.
+     * For backward compatibility, this method returns true if there are
+     * `JSXText` tokens that contain whitespace between the two.
+     * @param first The first node or token to check between.
+     * @param second The second node or token to check between.
+     * @returns {boolean} True if there is a whitespace character between
+     * any of the tokens found between the two given nodes or tokens.
+     * @deprecated in favor of isSpaceBetween
      */
     isSpaceBetweenTokens(first: TSESTree.Token, second: TSESTree.Token): boolean;
-    getLocFromIndex(index: number): TSESTree.LineAndColumnData;
-    getIndexFromLoc(location: TSESTree.LineAndColumnData): number;
-    getTokenByRangeStart<T extends {
-        includeComments?: boolean;
-    }>(offset: number, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    getFirstToken<T extends SourceCode.CursorWithSkipOptions>(node: TSESTree.Node, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    getFirstTokens<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    getLastToken<T extends SourceCode.CursorWithSkipOptions>(node: TSESTree.Node, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    getLastTokens<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    getTokenBefore<T extends SourceCode.CursorWithSkipOptions>(node: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    getTokensBefore<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    getTokenAfter<T extends SourceCode.CursorWithSkipOptions>(node: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    getTokensAfter<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    getFirstTokenBetween<T extends SourceCode.CursorWithSkipOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    getFirstTokensBetween<T extends SourceCode.CursorWithCountOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    getLastTokenBetween<T extends SourceCode.CursorWithSkipOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    getLastTokensBetween<T extends SourceCode.CursorWithCountOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    getTokensBetween<T extends SourceCode.CursorWithCountOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, padding?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    getTokens(node: TSESTree.Node, beforeCount?: number, afterCount?: number): TSESTree.Token[];
-    getTokens<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node, options: T): SourceCode.ReturnTypeFromOptions<T>[];
-    commentsExistBetween(left: TSESTree.Node | TSESTree.Token, right: TSESTree.Node | TSESTree.Token): boolean;
-    getCommentsBefore(nodeOrToken: TSESTree.Node | TSESTree.Token): TSESTree.Comment[];
-    getCommentsAfter(nodeOrToken: TSESTree.Node | TSESTree.Token): TSESTree.Comment[];
-    getCommentsInside(node: TSESTree.Node): TSESTree.Comment[];
+    /**
+     * The source code split into lines according to ECMA-262 specification.
+     * This is done to avoid each rule needing to do so separately.
+     */
+    lines: string[];
+    /**
+     * The indexes in `text` that each line starts
+     */
+    lineStartIndices: number[];
+    /**
+     * The parser services of this source code.
+     */
+    parserServices: ParserServices;
+    /**
+     * The scope of this source code.
+     */
+    scopeManager: Scope.ScopeManager | null;
+    /**
+     * The original text source code. BOM was stripped from this text.
+     */
+    text: string;
+    /**
+     * All of the tokens and comments in the AST.
+     */
+    tokensAndComments: (TSESTree.Comment | TSESTree.Token)[];
+    /**
+     * The visitor keys to traverse AST.
+     */
+    visitorKeys: SourceCode.VisitorKeys;
+    /**
+     * Split the source code into multiple lines based on the line delimiters.
+     * @param text Source code as a string.
+     * @returns Array of source code lines.
+     */
+    static splitLines(text: string): string[];
 }
 declare namespace SourceCode {
     interface Program extends TSESTree.Program {
         comments: TSESTree.Comment[];
         tokens: TSESTree.Token[];
     }
-    interface Config {
-        text: string;
+    interface SourceCodeConfig {
+        /**
+         * The Program node of the AST representing the code. This AST should be created from the text that BOM was stripped.
+         */
         ast: Program;
-        parserServices?: ParserServices;
-        scopeManager?: Scope.ScopeManager;
-        visitorKeys?: VisitorKeys;
+        /**
+         * The parser services.
+         */
+        parserServices: ParserServices | null;
+        /**
+         * The scope of this source code.
+         */
+        scopeManager: Scope.ScopeManager | null;
+        /**
+         * The source code text.
+         */
+        text: string;
+        /**
+         * The visitor keys to traverse AST.
+         */
+        visitorKeys: VisitorKeys | null;
     }
     interface VisitorKeys {
         [nodeType: string]: string[];
@@ -66,22 +313,38 @@
     type FilterPredicate = (tokenOrComment: TSESTree.Token | TSESTree.Comment) => boolean;
     type ReturnTypeFromOptions<T> = T extends {
         includeComments: true;
-    } ? TSESTree.Token | TSESTree.Comment : TSESTree.Token;
+    } ? TSESTree.Token : Exclude<TSESTree.Token, TSESTree.Comment>;
     type CursorWithSkipOptions = number | FilterPredicate | {
-        includeComments?: boolean;
+        /**
+         * The predicate function to choose tokens.
+         */
         filter?: FilterPredicate;
+        /**
+         * The flag to iterate comments as well.
+         */
+        includeComments?: boolean;
+        /**
+         * The count of tokens the cursor skips.
+         */
         skip?: number;
     };
     type CursorWithCountOptions = number | FilterPredicate | {
-        includeComments?: boolean;
+        /**
+         * The predicate function to choose tokens.
+         */
         filter?: FilterPredicate;
+        /**
+         * The flag to iterate comments as well.
+         */
+        includeComments?: boolean;
+        /**
+         * The maximum count of tokens the cursor iterates.
+         */
         count?: number;
     };
 }
-declare const SourceCode: {
-    new (text: string, ast: SourceCode.Program): SourceCode;
-    new (config: SourceCode.Config): SourceCode;
-    splitLines(text: string): string[];
-};
+declare const SourceCode_base: typeof SourceCodeBase;
+declare class SourceCode extends SourceCode_base {
+}
 export { SourceCode };
 //# sourceMappingURL=SourceCode.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts.map
index da39616..18f49a7 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"SourceCode.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/SourceCode.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"SourceCode.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/SourceCode.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js
index 6d18c4b..8e029b1 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js
@@ -1,7 +1,9 @@
 "use strict";
 /* eslint-disable @typescript-eslint/no-namespace */
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.SourceCode = void 0;
 const eslint_1 = require("eslint");
-const SourceCode = eslint_1.SourceCode;
+class SourceCode extends eslint_1.SourceCode {
+}
 exports.SourceCode = SourceCode;
 //# sourceMappingURL=SourceCode.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js.map
index 50641bd..60f58ea 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js.map
@@ -1 +1 @@
-{"version":3,"file":"SourceCode.js","sourceRoot":"","sources":["../../src/ts-eslint/SourceCode.ts"],"names":[],"mappings":";AAAA,oDAAoD;;AAGpD,mCAAwD;AAkMxD,MAAM,UAAU,GAAG,mBAMlB,CAAC;AAEO,gCAAU"}
\ No newline at end of file
+{"version":3,"file":"SourceCode.js","sourceRoot":"","sources":["../../src/ts-eslint/SourceCode.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;AAEpD,mCAAwD;AAubxD,MAAM,UAAW,SAAS,mBAA0C;CAAG;AAE9D,gCAAU"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts
index b8762a7..05d889d 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts
@@ -1,4 +1,6 @@
 export * from './AST';
+export * from './CLIEngine';
+export * from './ESLint';
 export * from './Linter';
 export * from './ParserOptions';
 export * from './Rule';
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts.map
index d81d9f7..6b3df41 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
\ No newline at end of file
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js
index 10c07ab..4125958 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js
@@ -1,9 +1,22 @@
 "use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
 Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("./Linter"));
-__export(require("./RuleTester"));
-__export(require("./SourceCode"));
+__exportStar(require("./AST"), exports);
+__exportStar(require("./CLIEngine"), exports);
+__exportStar(require("./ESLint"), exports);
+__exportStar(require("./Linter"), exports);
+__exportStar(require("./ParserOptions"), exports);
+__exportStar(require("./Rule"), exports);
+__exportStar(require("./RuleTester"), exports);
+__exportStar(require("./Scope"), exports);
+__exportStar(require("./SourceCode"), exports);
 //# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js.map
index 7e9c6a3..7ffb898 100644
--- a/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js.map
+++ b/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ts-eslint/index.ts"],"names":[],"mappings":";;;;;AACA,8BAAyB;AAGzB,kCAA6B;AAE7B,kCAA6B"}
\ No newline at end of file
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ts-eslint/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAAsB;AACtB,8CAA4B;AAC5B,2CAAyB;AACzB,2CAAyB;AACzB,kDAAgC;AAChC,yCAAuB;AACvB,+CAA6B;AAC7B,0CAAwB;AACxB,+CAA6B"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.d.ts b/node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.d.ts
rename to node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.d.ts.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.d.ts.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.js b/node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.js
rename to node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.js.map b/node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.js.map
rename to node_modules/@typescript-eslint/experimental-utils/dist/ts-estree.js.map
diff --git a/node_modules/@typescript-eslint/experimental-utils/package.json b/node_modules/@typescript-eslint/experimental-utils/package.json
index 06af978..5750f69 100644
--- a/node_modules/@typescript-eslint/experimental-utils/package.json
+++ b/node_modules/@typescript-eslint/experimental-utils/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@typescript-eslint/experimental-utils",
-  "version": "2.22.0",
+  "version": "4.3.0",
   "description": "(Experimental) Utilities for working with TypeScript + ESLint together",
   "keywords": [
     "eslint",
@@ -8,10 +8,11 @@
     "estree"
   ],
   "engines": {
-    "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
+    "node": "^10.12.0 || >=12.0.0"
   },
   "files": [
     "dist",
+    "_ts3.4",
     "package.json",
     "README.md",
     "LICENSE"
@@ -29,7 +30,9 @@
   "types": "dist/index.d.ts",
   "scripts": {
     "build": "tsc -b tsconfig.build.json",
+    "postbuild": "downlevel-dts dist _ts3.4/dist",
     "clean": "tsc -b tsconfig.build.json --clean",
+    "postclean": "rimraf dist && rimraf _ts3.4",
     "format": "prettier --write \"./**/*.{ts,js,json,md}\" --ignore-path ../../.prettierignore",
     "lint": "eslint . --ext .js,.ts --ignore-path='../../.eslintignore'",
     "test": "jest --coverage",
@@ -37,8 +40,11 @@
   },
   "dependencies": {
     "@types/json-schema": "^7.0.3",
-    "@typescript-eslint/typescript-estree": "2.22.0",
-    "eslint-scope": "^5.0.0"
+    "@typescript-eslint/scope-manager": "4.3.0",
+    "@typescript-eslint/types": "4.3.0",
+    "@typescript-eslint/typescript-estree": "4.3.0",
+    "eslint-scope": "^5.0.0",
+    "eslint-utils": "^2.0.0"
   },
   "peerDependencies": {
     "eslint": "*"
@@ -50,5 +56,12 @@
     "type": "opencollective",
     "url": "https://opencollective.com/typescript-eslint"
   },
-  "gitHead": "5a097d316fb084dc4b13e87d68fe9bf43d8a9548"
+  "typesVersions": {
+    "<3.8": {
+      "*": [
+        "_ts3.4/*"
+      ]
+    }
+  },
+  "gitHead": "229631e6cd90bba8f509a6d49fec72fd7a576ccf"
 }
diff --git a/node_modules/@typescript-eslint/parser/CHANGELOG.md b/node_modules/@typescript-eslint/parser/CHANGELOG.md
index 963551c..4b41359 100644
--- a/node_modules/@typescript-eslint/parser/CHANGELOG.md
+++ b/node_modules/@typescript-eslint/parser/CHANGELOG.md
@@ -3,6 +3,347 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [4.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.2.0...v4.3.0) (2020-09-28)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [4.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.1...v4.2.0) (2020-09-21)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+## [4.1.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.0...v4.1.1) (2020-09-14)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [4.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.1...v4.1.0) (2020-09-07)
+
+
+### Features
+
+* **scope-manager:** add support for JSX scope analysis ([#2498](https://github.com/typescript-eslint/typescript-eslint/issues/2498)) ([f887ab5](https://github.com/typescript-eslint/typescript-eslint/commit/f887ab51f58c1b3571f9a14832864bc0ca59623f)), closes [#2455](https://github.com/typescript-eslint/typescript-eslint/issues/2455) [#2477](https://github.com/typescript-eslint/typescript-eslint/issues/2477)
+
+
+
+
+
+## [4.0.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.0...v4.0.1) (2020-08-31)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [4.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.10.1...v4.0.0) (2020-08-31)
+
+## [Please see the release notes for v4.0.0](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v4.0.0)
+
+### Features
+
+* consume new scope analysis package ([#2039](https://github.com/typescript-eslint/typescript-eslint/issues/2039)) ([3be125d](https://github.com/typescript-eslint/typescript-eslint/commit/3be125d9bdbee1984ac6037874edf619213bd3d0))
+* support ESTree optional chaining representation ([#2308](https://github.com/typescript-eslint/typescript-eslint/issues/2308)) ([e9d2ab6](https://github.com/typescript-eslint/typescript-eslint/commit/e9d2ab638b6767700b52797e74b814ea059beaae))
+* **typescript-estree:** switch to globby ([#2418](https://github.com/typescript-eslint/typescript-eslint/issues/2418)) ([3a7ec9b](https://github.com/typescript-eslint/typescript-eslint/commit/3a7ec9bcf1873a99c6da2f19ade8ab4763b4793c)), closes [#2398](https://github.com/typescript-eslint/typescript-eslint/issues/2398)
+
+
+### BREAKING CHANGES
+
+* **typescript-estree:** - removes the ability to supply a `RegExp` to `projectFolderIgnoreList`, and changes the meaning of the string value from a regex to a glob.
+
+
+
+
+
+## [3.10.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.10.0...v3.10.1) (2020-08-25)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [3.10.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.9.1...v3.10.0) (2020-08-24)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+## [3.9.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.9.0...v3.9.1) (2020-08-17)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [3.9.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.8.0...v3.9.0) (2020-08-10)
+
+
+### Features
+
+* **typescript-estree:** support TSv4 labelled tuple members ([#2378](https://github.com/typescript-eslint/typescript-eslint/issues/2378)) ([00d84ff](https://github.com/typescript-eslint/typescript-eslint/commit/00d84ffbcbe9d0ec98bdb2f2ce59959a27ce4dbe))
+
+
+
+
+
+# [3.8.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.7.1...v3.8.0) (2020-08-03)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+## [3.7.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.7.0...v3.7.1) (2020-07-27)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [3.7.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.6.1...v3.7.0) (2020-07-20)
+
+
+### Features
+
+* **typescript-estree:** support short-circuiting assignment operators ([#2307](https://github.com/typescript-eslint/typescript-eslint/issues/2307)) ([2c90d9f](https://github.com/typescript-eslint/typescript-eslint/commit/2c90d9fa3aa5ebd7db697dddb7762bca2dd0e06b))
+* **typescript-estree:** support type annotations on catch clauses ([#2306](https://github.com/typescript-eslint/typescript-eslint/issues/2306)) ([b5afe9c](https://github.com/typescript-eslint/typescript-eslint/commit/b5afe9c560b9f38c8dffc312a600db30944129c8))
+
+
+
+
+
+## [3.6.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.6.0...v3.6.1) (2020-07-13)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [3.6.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.5.0...v3.6.0) (2020-07-06)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [3.5.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.4.0...v3.5.0) (2020-06-29)
+
+
+### Features
+
+* split types into their own package ([#2229](https://github.com/typescript-eslint/typescript-eslint/issues/2229)) ([5f45918](https://github.com/typescript-eslint/typescript-eslint/commit/5f4591886f3438329fbf2229b03ac66174334a24))
+
+
+
+
+
+# [3.4.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.3.0...v3.4.0) (2020-06-22)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [3.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.2.0...v3.3.0) (2020-06-15)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [3.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.1.0...v3.2.0) (2020-06-08)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [prefer-optional-chain] handling first member expression ([#2156](https://github.com/typescript-eslint/typescript-eslint/issues/2156)) ([de18660](https://github.com/typescript-eslint/typescript-eslint/commit/de18660a8cf8f7033798646d8c5b0938d1accb12))
+
+
+
+
+
+# [3.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.2...v3.1.0) (2020-06-01)
+
+
+### Bug Fixes
+
+* **experimental-utils:** downlevel type declarations for versions older than 3.8 ([#2133](https://github.com/typescript-eslint/typescript-eslint/issues/2133)) ([7925823](https://github.com/typescript-eslint/typescript-eslint/commit/792582326a8065270b69a0ffcaad5a7b4b103ff3))
+
+
+
+
+
+## [3.0.2](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.1...v3.0.2) (2020-05-27)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+## [3.0.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.0...v3.0.1) (2020-05-25)
+
+
+### Bug Fixes
+
+* **typescript-estree:** handle `BigInt` with `_` numeric separator ([#2067](https://github.com/typescript-eslint/typescript-eslint/issues/2067)) ([66f1627](https://github.com/typescript-eslint/typescript-eslint/commit/66f1627b11a566d5b925a577e800f99d5c808be2))
+
+
+
+
+
+# [3.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.34.0...v3.0.0) (2020-05-21)
+
+## [Please see the release notes for v3.0.0](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v3.0.0)
+
+### Bug Fixes
+
+* **typescript-estree:** use `TSEmptyBodyFunctionExpression` for body-less nodes ([#1289](https://github.com/typescript-eslint/typescript-eslint/issues/1289)) ([82e7163](https://github.com/typescript-eslint/typescript-eslint/commit/82e7163214b56ccde93ba97807b161669a50a60b))
+
+
+### Features
+
+* add index files to parser and typescript-estree ([3dfc46d](https://github.com/typescript-eslint/typescript-eslint/commit/3dfc46dccbbd28eed2d74c7b6cacddf1a0848598))
+* **experimental-utils:** upgrade eslint types for v7 ([#2023](https://github.com/typescript-eslint/typescript-eslint/issues/2023)) ([06869c9](https://github.com/typescript-eslint/typescript-eslint/commit/06869c9656fa37936126666845aee40aad546ebd))
+* upgrade to ESLint v7 ([#2022](https://github.com/typescript-eslint/typescript-eslint/issues/2022)) ([208de71](https://github.com/typescript-eslint/typescript-eslint/commit/208de71059746bf38e94bd460346ffb2698a3e12))
+* **typescript-estree:** align nodes with estree 2020 ([#1389](https://github.com/typescript-eslint/typescript-eslint/issues/1389)) ([aff5b62](https://github.com/typescript-eslint/typescript-eslint/commit/aff5b62044f9b93f2087a1d261e9be3f8d6fd54d))
+* **typescript-estree:** align optional fields ([#1429](https://github.com/typescript-eslint/typescript-eslint/issues/1429)) ([0e0010f](https://github.com/typescript-eslint/typescript-eslint/commit/0e0010f82952f9beeeb84136eea00cc5eecc9db6))
+* drop support for node v8 ([#1997](https://github.com/typescript-eslint/typescript-eslint/issues/1997)) ([b6c3b7b](https://github.com/typescript-eslint/typescript-eslint/commit/b6c3b7b84b8d199fa75a46432febd4a364a63217))
+* **eslint-plugin:** [ban-types] rework default options ([#848](https://github.com/typescript-eslint/typescript-eslint/issues/848)) ([8e31d5d](https://github.com/typescript-eslint/typescript-eslint/commit/8e31d5dbe9fe5227fdbefcecfd50ce5dd51360c3))
+* **typescript-estree:** handle 3.9's non-null assertion changes ([#2036](https://github.com/typescript-eslint/typescript-eslint/issues/2036)) ([06bec63](https://github.com/typescript-eslint/typescript-eslint/commit/06bec63c56536db070608ab136d2ad57083f0c6a))
+
+
+
+
+
+# [2.34.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.33.0...v2.34.0) (2020-05-18)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [2.33.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.32.0...v2.33.0) (2020-05-12)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [2.32.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.31.0...v2.32.0) (2020-05-11)
+
+
+### Features
+
+* bump dependencies and align AST ([#2007](https://github.com/typescript-eslint/typescript-eslint/issues/2007)) ([18668b7](https://github.com/typescript-eslint/typescript-eslint/commit/18668b78fd7d1e5281af7fc26c76e0ca53297f69))
+
+
+
+
+
+# [2.31.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.30.0...v2.31.0) (2020-05-04)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [2.30.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.29.0...v2.30.0) (2020-04-27)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [2.29.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.28.0...v2.29.0) (2020-04-20)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [2.28.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.27.0...v2.28.0) (2020-04-13)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [2.27.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.26.0...v2.27.0) (2020-04-06)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [2.26.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.25.0...v2.26.0) (2020-03-30)
+
+
+### Features
+
+* **typescript-estree:** add option to ignore certain folders from glob resolution ([#1802](https://github.com/typescript-eslint/typescript-eslint/issues/1802)) ([1e29e69](https://github.com/typescript-eslint/typescript-eslint/commit/1e29e69b289d61107a7de67592beae331ba50222))
+
+
+
+
+
+# [2.25.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.24.0...v2.25.0) (2020-03-23)
+
+**Note:** Version bump only for package @typescript-eslint/parser
+
+
+
+
+
+# [2.24.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.23.0...v2.24.0) (2020-03-16)
+
+
+### Features
+
+* **typescript-estree:** support 3.8 `export * as ns` ([#1698](https://github.com/typescript-eslint/typescript-eslint/issues/1698)) ([133f622](https://github.com/typescript-eslint/typescript-eslint/commit/133f622f38a286eac45288a9789d2ee529d5e582))
+
+
+
+
+
+# [2.23.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.22.0...v2.23.0) (2020-03-09)
+
+
+### Features
+
+* **typescript-estree:** support 3.8 import/export type ([#1697](https://github.com/typescript-eslint/typescript-eslint/issues/1697)) ([625d603](https://github.com/typescript-eslint/typescript-eslint/commit/625d603f94bf0521f834313bf31c734ce4948b7a))
+
+
+
+
+
 # [2.22.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.21.0...v2.22.0) (2020-03-02)
 
 **Note:** Version bump only for package @typescript-eslint/parser
diff --git a/node_modules/@typescript-eslint/parser/README.md b/node_modules/@typescript-eslint/parser/README.md
index cf69891..f6417fd 100644
--- a/node_modules/@typescript-eslint/parser/README.md
+++ b/node_modules/@typescript-eslint/parser/README.md
@@ -1,13 +1,11 @@
 <h1 align="center">TypeScript ESLint Parser</h1>
 
-<p align="center">An ESLint custom parser which leverages <a href="https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/typescript-estree">TypeScript ESTree</a> to allow for ESLint to lint TypeScript source code.</p>
+<p align="center">An ESLint parser which leverages <a href="https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/typescript-estree">TypeScript ESTree</a> to allow for ESLint to lint TypeScript source code.</p>
 
 <p align="center">
-    <a href="https://dev.azure.com/typescript-eslint/TypeScript%20ESLint/_build/latest?definitionId=1&branchName=master"><img src="https://img.shields.io/azure-devops/build/typescript-eslint/TypeScript%20ESLint/1/master.svg?label=%F0%9F%9A%80%20Azure%20Pipelines&style=flat-square" alt="Azure Pipelines"/></a>
-    <a href="https://github.com/typescript-eslint/typescript-eslint/blob/master/LICENSE"><img src="https://img.shields.io/npm/l/typescript-estree.svg?style=flat-square" alt="GitHub license" /></a>
+    <img src="https://github.com/typescript-eslint/typescript-eslint/workflows/CI/badge.svg" alt="CI" />
     <a href="https://www.npmjs.com/package/@typescript-eslint/parser"><img src="https://img.shields.io/npm/v/@typescript-eslint/parser.svg?style=flat-square" alt="NPM Version" /></a>
     <a href="https://www.npmjs.com/package/@typescript-eslint/parser"><img src="https://img.shields.io/npm/dm/@typescript-eslint/parser.svg?style=flat-square" alt="NPM Downloads" /></a>
-    <a href="http://commitizen.github.io/cz-cli/"><img src="https://img.shields.io/badge/commitizen-friendly-brightgreen.svg?style=flat-square" alt="Commitizen friendly" /></a>
 </p>
 
 ## Getting Started
@@ -20,8 +18,9 @@
 
 ### Installation
 
-```sh
-yarn add -D @typescript-eslint/parser
+```bash
+$ yarn add -D typescript @typescript-eslint/parser
+$ npm i --save-dev typescript @typescript-eslint/parser
 ```
 
 ### Usage
@@ -52,8 +51,16 @@
 interface ParserOptions {
   ecmaFeatures?: {
     jsx?: boolean;
+    globalReturn?: boolean;
   };
+  ecmaVersion?: number;
+
+  jsxPragma?: string;
+  jsxFragmentName?: string | null;
+  lib?: string[];
+
   project?: string | string[];
+  projectFolderIgnoreList?: string[];
   tsconfigRootDir?: string;
   extraFileExtensions?: string[];
   warnOnUnsupportedTypeScriptVersion?: boolean;
@@ -66,7 +73,7 @@
 
 Enable parsing JSX when `true`. More details can be found [here](https://www.typescriptlang.org/docs/handbook/jsx.html).
 
-**NOTE:** this setting does not affect known file types (`.js`, `.jsx`, `.ts`, `.tsx`, `.json`) because the typescript compiler has its own internal handling for known file extensions. The exact behavior is as follows:
+**NOTE:** this setting does not affect known file types (`.js`, `.jsx`, `.ts`, `.tsx`, `.json`) because the TypeScript compiler has its own internal handling for known file extensions. The exact behavior is as follows:
 
 - if `parserOptions.project` is _not_ provided:
   - `.js`, `.jsx`, `.tsx` files are parsed as if this is true.
@@ -77,6 +84,54 @@
   - `.ts` files are parsed as if this is false.
   - "unknown" extensions (`.md`, `.vue`) **are parsed as if this is false**.
 
+### `parserOptions.ecmaFeatures.globalReturn`
+
+Default `false`.
+
+This options allows you to tell the parser if you want to allow global `return` statements in your codebase.
+
+### `parserOptions.ecmaVersion`
+
+Default `2018`.
+
+Accepts any valid ECMAScript version number:
+
+- A version: es3, es5, es6, es7, es8, es9, es10, es11, ..., or
+- A year: es2015, es2016, es2017, es2018, es2019, es2020, ...
+
+Specifies the version of ECMAScript syntax you want to use. This is used by the parser to determine how to perform scope analysis, and it affects the default
+
+### `parserOptions.jsxPragma`
+
+Default `'React'`
+
+The identifier that's used for JSX Elements creation (after transpilation).
+If you're using a library other than React (like `preact`), then you should change this value.
+
+This should not be a member expression - just the root identifier (i.e. use `"React"` instead of `"React.createElement"`).
+
+If you provide `parserOptions.project`, you do not need to set this, as it will automatically detected from the compiler.
+
+### `parserOptions.jsxFragmentName`
+
+Default `null`
+
+The identifier that's used for JSX fragment elements (after transpilation).
+If `null`, assumes transpilation will always use a member of the configured `jsxPragma`.
+This should not be a member expression - just the root identifier (i.e. use `"h"` instead of `"h.Fragment"`).
+
+If you provide `parserOptions.project`, you do not need to set this, as it will automatically detected from the compiler.
+
+### `parserOptions.lib`
+
+Default `['es2018']`
+
+For valid options, see the [TypeScript compiler options](https://www.typescriptlang.org/tsconfig#lib).
+
+Specifies the TypeScript `lib`s that are available. This is used by the scope analyser to ensure there are global variables declared for the types exposed by TypeScript.
+
+If you provide `parserOptions.project`, you do not need to set this, as it will automatically detected from the compiler.
+
 ### `parserOptions.project`
 
 Default `undefined`.
@@ -118,26 +173,37 @@
   }
   ```
 
-### `tsconfigRootDir`
+### `parserOptions.tsconfigRootDir`
 
 Default `undefined`.
 
 This option allows you to provide the root directory for relative tsconfig paths specified in the `project` option above.
 
-### `extraFileExtensions`
+### `parserOptions.projectFolderIgnoreList`
+
+Default `["**/node_modules/**"]`.
+
+This option allows you to ignore folders from being included in your provided list of `project`s.
+This is useful if you have configured glob patterns, but want to make sure you ignore certain folders.
+
+It accepts an array of globs to exclude from the `project` globs.
+
+For example, by default it will ensure that a glob like `./**/tsconfig.json` will not match any `tsconfig`s within your `node_modules` folder (some npm packages do not exclude their source files from their published packages).
+
+### `parserOptions.extraFileExtensions`
 
 Default `undefined`.
 
 This option allows you to provide one or more additional file extensions which should be considered in the TypeScript Program compilation.
 The default extensions are `.ts`, `.tsx`, `.js`, and `.jsx`. Add extensions starting with `.`, followed by the file extension. E.g. for a `.vue` file use `"extraFileExtensions: [".vue"]`.
 
-### `warnOnUnsupportedTypeScriptVersion`
+### `parserOptions.warnOnUnsupportedTypeScriptVersion`
 
 Default `true`.
 
 This option allows you to toggle the warning that the parser will give you if you use a version of TypeScript which is not explicitly supported
 
-### `createDefaultProgram`
+### `parserOptions.createDefaultProgram`
 
 Default `false`.
 
diff --git a/node_modules/@typescript-eslint/parser/dist/analyze-scope.d.ts b/node_modules/@typescript-eslint/parser/dist/analyze-scope.d.ts
deleted file mode 100644
index d039e61..0000000
--- a/node_modules/@typescript-eslint/parser/dist/analyze-scope.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { TSESTree } from '@typescript-eslint/experimental-utils';
-import { ParserOptions } from './parser-options';
-import { ScopeManager } from './scope/scope-manager';
-export declare function analyzeScope(ast: TSESTree.Program, parserOptions: ParserOptions): ScopeManager;
-//# sourceMappingURL=analyze-scope.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/analyze-scope.d.ts.map b/node_modules/@typescript-eslint/parser/dist/analyze-scope.d.ts.map
deleted file mode 100644
index 469f570..0000000
--- a/node_modules/@typescript-eslint/parser/dist/analyze-scope.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"analyze-scope.d.ts","sourceRoot":"","sources":["../src/analyze-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAGT,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AA21BrD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,QAAQ,CAAC,OAAO,EACrB,aAAa,EAAE,aAAa,GAC3B,YAAY,CAsBd"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/analyze-scope.js b/node_modules/@typescript-eslint/parser/dist/analyze-scope.js
deleted file mode 100644
index 0f25f49..0000000
--- a/node_modules/@typescript-eslint/parser/dist/analyze-scope.js
+++ /dev/null
@@ -1,684 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const eslint_visitor_keys_1 = require("eslint-visitor-keys");
-const scope_manager_1 = require("./scope/scope-manager");
-const typescript_estree_1 = require("@typescript-eslint/typescript-estree");
-/**
- * Define the override function of `Scope#__define` for global augmentation.
- * @param {Function} define The original Scope#__define method.
- * @returns {Function} The override function.
- */
-function overrideDefine(define) {
-    return function (node, definition) {
-        define.call(this, node, definition);
-        // Set `variable.eslintUsed` to tell ESLint that the variable is exported.
-        const variable = 'name' in node &&
-            typeof node.name === 'string' &&
-            this.set.get(node.name);
-        if (variable) {
-            variable.eslintUsed = true;
-        }
-    };
-}
-class PatternVisitor extends experimental_utils_1.TSESLintScope.PatternVisitor {
-    constructor(options, rootPattern, callback) {
-        super(options, rootPattern, callback);
-    }
-    Identifier(node) {
-        super.Identifier(node);
-        if (node.decorators) {
-            this.rightHandNodes.push(...node.decorators);
-        }
-        if (node.typeAnnotation) {
-            this.rightHandNodes.push(node.typeAnnotation);
-        }
-    }
-    ArrayPattern(node) {
-        node.elements.forEach(this.visit, this);
-        if (node.decorators) {
-            this.rightHandNodes.push(...node.decorators);
-        }
-        if (node.typeAnnotation) {
-            this.rightHandNodes.push(node.typeAnnotation);
-        }
-    }
-    ObjectPattern(node) {
-        node.properties.forEach(this.visit, this);
-        if (node.decorators) {
-            this.rightHandNodes.push(...node.decorators);
-        }
-        if (node.typeAnnotation) {
-            this.rightHandNodes.push(node.typeAnnotation);
-        }
-    }
-    RestElement(node) {
-        super.RestElement(node);
-        if (node.decorators) {
-            this.rightHandNodes.push(...node.decorators);
-        }
-        if (node.typeAnnotation) {
-            this.rightHandNodes.push(node.typeAnnotation);
-        }
-    }
-    TSParameterProperty(node) {
-        this.visit(node.parameter);
-        if (node.decorators) {
-            this.rightHandNodes.push(...node.decorators);
-        }
-    }
-}
-class Referencer extends experimental_utils_1.TSESLintScope.Referencer {
-    constructor(options, scopeManager) {
-        super(options, scopeManager);
-        this.typeMode = false;
-    }
-    /**
-     * Override to use PatternVisitor we overrode.
-     * @param node The Identifier node to visit.
-     * @param [options] The flag to visit right-hand side nodes.
-     * @param callback The callback function for left-hand side nodes.
-     */
-    visitPattern(node, options, callback) {
-        if (!node) {
-            return;
-        }
-        if (typeof options === 'function') {
-            callback = options;
-            options = { processRightHandNodes: false };
-        }
-        const visitor = new PatternVisitor(this.options, node, callback);
-        visitor.visit(node);
-        if (options.processRightHandNodes) {
-            visitor.rightHandNodes.forEach(this.visit, this);
-        }
-    }
-    /**
-     * Override.
-     * Visit `node.typeParameters` and `node.returnType` additionally to find `typeof` expressions.
-     * @param node The function node to visit.
-     */
-    visitFunction(node) {
-        const { type, id, typeParameters, params, returnType, body } = node;
-        const scopeManager = this.scopeManager;
-        const upperScope = this.currentScope();
-        // Process the name.
-        if (type === experimental_utils_1.AST_NODE_TYPES.FunctionDeclaration && id) {
-            upperScope.__define(id, new experimental_utils_1.TSESLintScope.Definition('FunctionName', id, node, null, null, null));
-            // Remove overload definition to avoid confusion of no-redeclare rule.
-            const { defs, identifiers } = upperScope.set.get(id.name);
-            for (let i = 0; i < defs.length; ++i) {
-                const def = defs[i];
-                if (def.type === 'FunctionName' &&
-                    def.node.type === experimental_utils_1.AST_NODE_TYPES.TSDeclareFunction) {
-                    defs.splice(i, 1);
-                    identifiers.splice(i, 1);
-                    break;
-                }
-            }
-        }
-        else if (type === experimental_utils_1.AST_NODE_TYPES.FunctionExpression && id) {
-            scopeManager.__nestFunctionExpressionNameScope(node);
-        }
-        // Open the function scope.
-        scopeManager.__nestFunctionScope(node, this.isInnerMethodDefinition);
-        const innerScope = this.currentScope();
-        // Process the type parameters
-        this.visit(typeParameters);
-        // Process parameter declarations.
-        for (let i = 0; i < params.length; ++i) {
-            this.visitPattern(params[i], { processRightHandNodes: true }, (pattern, info) => {
-                if (pattern.type !== experimental_utils_1.AST_NODE_TYPES.Identifier ||
-                    pattern.name !== 'this') {
-                    innerScope.__define(pattern, new experimental_utils_1.TSESLintScope.ParameterDefinition(pattern, node, i, info.rest));
-                    this.referencingDefaultValue(pattern, info.assignments, null, true);
-                }
-            });
-        }
-        // Process the return type.
-        this.visit(returnType);
-        // Process the body.
-        if (body && body.type === experimental_utils_1.AST_NODE_TYPES.BlockStatement) {
-            this.visitChildren(body);
-        }
-        else {
-            this.visit(body);
-        }
-        // Close the function scope.
-        this.close(node);
-    }
-    /**
-     * Override.
-     * Visit decorators.
-     * @param node The class node to visit.
-     */
-    visitClass(node) {
-        this.visitDecorators(node.decorators);
-        const upperTypeMode = this.typeMode;
-        this.typeMode = true;
-        if (node.superTypeParameters) {
-            this.visit(node.superTypeParameters);
-        }
-        if (node.implements) {
-            node.implements.forEach(this.visit, this);
-        }
-        this.typeMode = upperTypeMode;
-        super.visitClass(node);
-    }
-    /**
-     * Visit typeParameters.
-     * @param node The node to visit.
-     */
-    visitTypeParameters(node) {
-        if (node.typeParameters) {
-            const upperTypeMode = this.typeMode;
-            this.typeMode = true;
-            this.visit(node.typeParameters);
-            this.typeMode = upperTypeMode;
-        }
-    }
-    /**
-     * Override.
-     */
-    JSXOpeningElement(node) {
-        this.visit(node.name);
-        this.visitTypeParameters(node);
-        node.attributes.forEach(this.visit, this);
-    }
-    /**
-     * Override.
-     * Don't create the reference object in the type mode.
-     * @param node The Identifier node to visit.
-     */
-    Identifier(node) {
-        this.visitDecorators(node.decorators);
-        if (!this.typeMode) {
-            super.Identifier(node);
-        }
-        this.visit(node.typeAnnotation);
-    }
-    /**
-     * Override.
-     * Visit decorators.
-     * @param node The MethodDefinition node to visit.
-     */
-    MethodDefinition(node) {
-        this.visitDecorators(node.decorators);
-        super.MethodDefinition(node);
-    }
-    /**
-     * Don't create the reference object for the key if not computed.
-     * @param node The ClassProperty node to visit.
-     */
-    ClassProperty(node) {
-        const upperTypeMode = this.typeMode;
-        const { computed, decorators, key, typeAnnotation, value } = node;
-        this.typeMode = false;
-        this.visitDecorators(decorators);
-        if (computed) {
-            this.visit(key);
-        }
-        this.typeMode = true;
-        this.visit(typeAnnotation);
-        this.typeMode = false;
-        this.visit(value);
-        this.typeMode = upperTypeMode;
-    }
-    /**
-     * Visit new expression.
-     * @param node The NewExpression node to visit.
-     */
-    NewExpression(node) {
-        this.visitTypeParameters(node);
-        this.visit(node.callee);
-        node.arguments.forEach(this.visit, this);
-    }
-    /**
-     * Override.
-     * Visit call expression.
-     * @param node The CallExpression node to visit.
-     */
-    CallExpression(node) {
-        this.visitTypeParameters(node);
-        this.visit(node.callee);
-        node.arguments.forEach(this.visit, this);
-    }
-    /**
-     * Visit optional member expression.
-     * @param node The OptionalMemberExpression node to visit.
-     */
-    OptionalMemberExpression(node) {
-        this.visit(node.object);
-        if (node.computed) {
-            this.visit(node.property);
-        }
-    }
-    /**
-     * Visit optional call expression.
-     * @param node The OptionalMemberExpression node to visit.
-     */
-    OptionalCallExpression(node) {
-        this.visitTypeParameters(node);
-        this.visit(node.callee);
-        node.arguments.forEach(this.visit, this);
-    }
-    /**
-     * Define the variable of this function declaration only once.
-     * Because to avoid confusion of `no-redeclare` rule by overloading.
-     * @param node The TSDeclareFunction node to visit.
-     */
-    TSDeclareFunction(node) {
-        var _a, _b;
-        const scopeManager = this.scopeManager;
-        const upperScope = this.currentScope();
-        const { id, typeParameters, params, returnType } = node;
-        // Ignore this if other overload have already existed.
-        if (id) {
-            const variable = upperScope.set.get(id.name);
-            const defs = (_a = variable) === null || _a === void 0 ? void 0 : _a.defs;
-            const existed = (_b = defs) === null || _b === void 0 ? void 0 : _b.some((d) => d.type === 'FunctionName');
-            if (!existed) {
-                upperScope.__define(id, new experimental_utils_1.TSESLintScope.Definition('FunctionName', id, node, null, null, null));
-            }
-        }
-        // Open the function scope.
-        scopeManager.__nestEmptyFunctionScope(node);
-        const innerScope = this.currentScope();
-        // Process the type parameters
-        this.visit(typeParameters);
-        // Process parameter declarations.
-        for (let i = 0; i < params.length; ++i) {
-            this.visitPattern(params[i], { processRightHandNodes: true }, (pattern, info) => {
-                innerScope.__define(pattern, new experimental_utils_1.TSESLintScope.ParameterDefinition(pattern, node, i, info.rest));
-                // Set `variable.eslintUsed` to tell ESLint that the variable is used.
-                const variable = innerScope.set.get(pattern.name);
-                if (variable) {
-                    variable.eslintUsed = true;
-                }
-                this.referencingDefaultValue(pattern, info.assignments, null, true);
-            });
-        }
-        // Process the return type.
-        this.visit(returnType);
-        // Close the function scope.
-        this.close(node);
-    }
-    /**
-     * Create reference objects for the references in parameters and return type.
-     * @param node The TSEmptyBodyFunctionExpression node to visit.
-     */
-    TSEmptyBodyFunctionExpression(node) {
-        const upperTypeMode = this.typeMode;
-        const { typeParameters, params, returnType } = node;
-        this.typeMode = true;
-        this.visit(typeParameters);
-        params.forEach(this.visit, this);
-        this.visit(returnType);
-        this.typeMode = upperTypeMode;
-    }
-    /**
-     * Don't make variable because it declares only types.
-     * Switch to the type mode and visit child nodes to find `typeof x` expression in type declarations.
-     * @param node The TSInterfaceDeclaration node to visit.
-     */
-    TSInterfaceDeclaration(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * Don't make variable because it declares only types.
-     * Switch to the type mode and visit child nodes to find `typeof x` expression in type declarations.
-     * @param node The TSClassImplements node to visit.
-     */
-    TSClassImplements(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * Don't make variable because it declares only types.
-     * Switch to the type mode and visit child nodes to find `typeof x` expression in type declarations.
-     * @param node The TSIndexSignature node to visit.
-     */
-    TSIndexSignature(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * Visit type assertion.
-     * @param node The TSTypeAssertion node to visit.
-     */
-    TSTypeAssertion(node) {
-        if (this.typeMode) {
-            this.visit(node.typeAnnotation);
-        }
-        else {
-            this.typeMode = true;
-            this.visit(node.typeAnnotation);
-            this.typeMode = false;
-        }
-        this.visit(node.expression);
-    }
-    /**
-     * Visit as expression.
-     * @param node The TSAsExpression node to visit.
-     */
-    TSAsExpression(node) {
-        this.visit(node.expression);
-        if (this.typeMode) {
-            this.visit(node.typeAnnotation);
-        }
-        else {
-            this.typeMode = true;
-            this.visit(node.typeAnnotation);
-            this.typeMode = false;
-        }
-    }
-    /**
-     * Switch to the type mode and visit child nodes to find `typeof x` expression in type declarations.
-     * @param node The TSTypeAnnotation node to visit.
-     */
-    TSTypeAnnotation(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * Switch to the type mode and visit child nodes to find `typeof x` expression in type declarations.
-     * @param node The TSTypeParameterDeclaration node to visit.
-     */
-    TSTypeParameterDeclaration(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * Create reference objects for the references in `typeof` expression.
-     * @param node The TSTypeQuery node to visit.
-     */
-    TSTypeQuery(node) {
-        if (this.typeMode) {
-            this.typeMode = false;
-            this.visitChildren(node);
-            this.typeMode = true;
-        }
-        else {
-            this.visitChildren(node);
-        }
-    }
-    /**
-     * @param node The TSTypeParameter node to visit.
-     */
-    TSTypeParameter(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * @param node The TSInferType node to visit.
-     */
-    TSInferType(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * @param node The TSTypeReference node to visit.
-     */
-    TSTypeReference(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * @param node The TSTypeLiteral node to visit.
-     */
-    TSTypeLiteral(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * @param node The TSLiteralType node to visit.
-     */
-    TSLiteralType(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * @param node The TSIntersectionType node to visit.
-     */
-    TSIntersectionType(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * @param node The TSConditionalType node to visit.
-     */
-    TSConditionalType(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * @param node The TSIndexedAccessType node to visit.
-     */
-    TSIndexedAccessType(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * @param node The TSMappedType node to visit.
-     */
-    TSMappedType(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * @param node The TSOptionalType node to visit.
-     */
-    TSOptionalType(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * @param node The TSParenthesizedType node to visit.
-     */
-    TSParenthesizedType(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * @param node The TSRestType node to visit.
-     */
-    TSRestType(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * @param node The TSTupleType node to visit.
-     */
-    TSTupleType(node) {
-        this.visitTypeNodes(node);
-    }
-    /**
-     * Create reference objects for the object part. (This is `obj.prop`)
-     * @param node The TSQualifiedName node to visit.
-     */
-    TSQualifiedName(node) {
-        this.visit(node.left);
-    }
-    /**
-     * Create reference objects for the references in computed keys.
-     * @param node The TSPropertySignature node to visit.
-     */
-    TSPropertySignature(node) {
-        const upperTypeMode = this.typeMode;
-        const { computed, key, typeAnnotation, initializer } = node;
-        if (computed) {
-            this.typeMode = false;
-            this.visit(key);
-            this.typeMode = true;
-        }
-        else {
-            this.typeMode = true;
-            this.visit(key);
-        }
-        this.visit(typeAnnotation);
-        this.visit(initializer);
-        this.typeMode = upperTypeMode;
-    }
-    /**
-     * Create reference objects for the references in computed keys.
-     * @param node The TSMethodSignature node to visit.
-     */
-    TSMethodSignature(node) {
-        const upperTypeMode = this.typeMode;
-        const { computed, key, typeParameters, params, returnType } = node;
-        if (computed) {
-            this.typeMode = false;
-            this.visit(key);
-            this.typeMode = true;
-        }
-        else {
-            this.typeMode = true;
-            this.visit(key);
-        }
-        this.visit(typeParameters);
-        params.forEach(this.visit, this);
-        this.visit(returnType);
-        this.typeMode = upperTypeMode;
-    }
-    /**
-     * Create variable object for the enum.
-     * The enum declaration creates a scope for the enum members.
-     *
-     * enum E {
-     *   A,
-     *   B,
-     *   C = A + B // A and B are references to the enum member.
-     * }
-     *
-     * const a = 0
-     * enum E {
-     *   A = a // a is above constant.
-     * }
-     *
-     * @param node The TSEnumDeclaration node to visit.
-     */
-    TSEnumDeclaration(node) {
-        const { id, members } = node;
-        const scopeManager = this.scopeManager;
-        const scope = this.currentScope();
-        if (id) {
-            scope.__define(id, new experimental_utils_1.TSESLintScope.Definition('EnumName', id, node));
-        }
-        scopeManager.__nestEnumScope(node);
-        for (const member of members) {
-            this.visit(member);
-        }
-        this.close(node);
-    }
-    /**
-     * Create variable object for the enum member and create reference object for the initializer.
-     * And visit the initializer.
-     *
-     * @param node The TSEnumMember node to visit.
-     */
-    TSEnumMember(node) {
-        const { id, initializer } = node;
-        const scope = this.currentScope();
-        scope.__define(id, new experimental_utils_1.TSESLintScope.Definition('EnumMemberName', id, node));
-        if (initializer) {
-            scope.__referencing(id, experimental_utils_1.TSESLintScope.Reference.WRITE, initializer, null, false, true);
-            this.visit(initializer);
-        }
-    }
-    /**
-     * Create the variable object for the module name, and visit children.
-     * @param node The TSModuleDeclaration node to visit.
-     */
-    TSModuleDeclaration(node) {
-        const scope = this.currentScope();
-        const { id, body } = node;
-        if (node.global) {
-            this.visitGlobalAugmentation(node);
-            return;
-        }
-        if (id && id.type === experimental_utils_1.AST_NODE_TYPES.Identifier) {
-            scope.__define(id, new experimental_utils_1.TSESLintScope.Definition('NamespaceName', id, node, null, null, null));
-        }
-        this.visit(body);
-    }
-    TSTypeAliasDeclaration(node) {
-        this.typeMode = true;
-        this.visitChildren(node);
-        this.typeMode = false;
-    }
-    /**
-     * Process the module block.
-     * @param node The TSModuleBlock node to visit.
-     */
-    TSModuleBlock(node) {
-        this.scopeManager.__nestBlockScope(node);
-        this.visitChildren(node);
-        this.close(node);
-    }
-    TSAbstractClassProperty(node) {
-        this.ClassProperty(node);
-    }
-    TSAbstractMethodDefinition(node) {
-        this.MethodDefinition(node);
-    }
-    /**
-     * Process import equal declaration
-     * @param node The TSImportEqualsDeclaration node to visit.
-     */
-    TSImportEqualsDeclaration(node) {
-        const { id, moduleReference } = node;
-        if (id && id.type === experimental_utils_1.AST_NODE_TYPES.Identifier) {
-            this.currentScope().__define(id, new experimental_utils_1.TSESLintScope.Definition('ImportBinding', id, node, null, null, null));
-        }
-        this.visit(moduleReference);
-    }
-    /**
-     * Process the global augmentation.
-     * 1. Set the global scope as the current scope.
-     * 2. Configure the global scope to set `variable.eslintUsed = true` for all defined variables. This means `no-unused-vars` doesn't warn those.
-     * @param node The TSModuleDeclaration node to visit.
-     */
-    visitGlobalAugmentation(node) {
-        const scopeManager = this.scopeManager;
-        const currentScope = this.currentScope();
-        const globalScope = scopeManager.globalScope;
-        const originalDefine = globalScope.__define;
-        globalScope.__define = overrideDefine(originalDefine);
-        scopeManager.__currentScope = globalScope;
-        // Skip TSModuleBlock to avoid to create that block scope.
-        if (node.body && node.body.type === experimental_utils_1.AST_NODE_TYPES.TSModuleBlock) {
-            node.body.body.forEach(this.visit, this);
-        }
-        scopeManager.__currentScope = currentScope;
-        globalScope.__define = originalDefine;
-    }
-    /**
-     * Process decorators.
-     * @param decorators The decorator nodes to visit.
-     */
-    visitDecorators(decorators) {
-        if (decorators) {
-            decorators.forEach(this.visit, this);
-        }
-    }
-    /**
-     * Process all child of type nodes
-     * @param node node to be processed
-     */
-    visitTypeNodes(node) {
-        if (this.typeMode) {
-            this.visitChildren(node);
-        }
-        else {
-            this.typeMode = true;
-            this.visitChildren(node);
-            this.typeMode = false;
-        }
-    }
-}
-function analyzeScope(ast, parserOptions) {
-    var _a;
-    const options = {
-        ignoreEval: true,
-        optimistic: false,
-        directive: false,
-        nodejsScope: parserOptions.sourceType === 'script' &&
-            (parserOptions.ecmaFeatures &&
-                parserOptions.ecmaFeatures.globalReturn) === true,
-        impliedStrict: false,
-        sourceType: parserOptions.sourceType,
-        ecmaVersion: (_a = parserOptions.ecmaVersion, (_a !== null && _a !== void 0 ? _a : 2018)),
-        childVisitorKeys: typescript_estree_1.visitorKeys,
-        fallback: eslint_visitor_keys_1.getKeys,
-    };
-    const scopeManager = new scope_manager_1.ScopeManager(options);
-    const referencer = new Referencer(options, scopeManager);
-    referencer.visit(ast);
-    return scopeManager;
-}
-exports.analyzeScope = analyzeScope;
-//# sourceMappingURL=analyze-scope.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/analyze-scope.js.map b/node_modules/@typescript-eslint/parser/dist/analyze-scope.js.map
deleted file mode 100644
index 7de3a9d..0000000
--- a/node_modules/@typescript-eslint/parser/dist/analyze-scope.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"analyze-scope.js","sourceRoot":"","sources":["../src/analyze-scope.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/index.d.ts b/node_modules/@typescript-eslint/parser/dist/index.d.ts
new file mode 100644
index 0000000..2229e01
--- /dev/null
+++ b/node_modules/@typescript-eslint/parser/dist/index.d.ts
@@ -0,0 +1,5 @@
+export { parse, parseForESLint, ParserOptions } from './parser';
+export { ParserServices } from '@typescript-eslint/typescript-estree';
+export { clearCaches } from '@typescript-eslint/typescript-estree';
+export declare const version: string;
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/index.d.ts.map b/node_modules/@typescript-eslint/parser/dist/index.d.ts.map
new file mode 100644
index 0000000..69632b8
--- /dev/null
+++ b/node_modules/@typescript-eslint/parser/dist/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAGnE,eAAO,MAAM,OAAO,EAAE,MAA2C,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/index.js b/node_modules/@typescript-eslint/parser/dist/index.js
new file mode 100644
index 0000000..b9e888a
--- /dev/null
+++ b/node_modules/@typescript-eslint/parser/dist/index.js
@@ -0,0 +1,11 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.version = exports.clearCaches = exports.parseForESLint = exports.parse = void 0;
+var parser_1 = require("./parser");
+Object.defineProperty(exports, "parse", { enumerable: true, get: function () { return parser_1.parse; } });
+Object.defineProperty(exports, "parseForESLint", { enumerable: true, get: function () { return parser_1.parseForESLint; } });
+var typescript_estree_1 = require("@typescript-eslint/typescript-estree");
+Object.defineProperty(exports, "clearCaches", { enumerable: true, get: function () { return typescript_estree_1.clearCaches; } });
+// note - cannot migrate this to an import statement because it will make TSC copy the package.json to the dist folder
+exports.version = require('../package.json').version;
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/index.js.map b/node_modules/@typescript-eslint/parser/dist/index.js.map
new file mode 100644
index 0000000..604901f
--- /dev/null
+++ b/node_modules/@typescript-eslint/parser/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAgE;AAAvD,+FAAA,KAAK,OAAA;AAAE,wGAAA,cAAc,OAAA;AAE9B,0EAAmE;AAA1D,gHAAA,WAAW,OAAA;AAEpB,sHAAsH;AACzG,QAAA,OAAO,GAAW,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/parser-options.d.ts b/node_modules/@typescript-eslint/parser/dist/parser-options.d.ts
index bbe3a54..a829c40 100644
--- a/node_modules/@typescript-eslint/parser/dist/parser-options.d.ts
+++ b/node_modules/@typescript-eslint/parser/dist/parser-options.d.ts
@@ -1,3 +1,2 @@
-import { TSESLint } from '@typescript-eslint/experimental-utils';
-export declare type ParserOptions = TSESLint.ParserOptions;
+export { ParserOptions } from '@typescript-eslint/types';
 //# sourceMappingURL=parser-options.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/parser-options.d.ts.map b/node_modules/@typescript-eslint/parser/dist/parser-options.d.ts.map
index 65dc7fa..85aeca5 100644
--- a/node_modules/@typescript-eslint/parser/dist/parser-options.d.ts.map
+++ b/node_modules/@typescript-eslint/parser/dist/parser-options.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"parser-options.d.ts","sourceRoot":"","sources":["../src/parser-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AAEjE,oBAAY,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC"}
\ No newline at end of file
+{"version":3,"file":"parser-options.d.ts","sourceRoot":"","sources":["../src/parser-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/parser.d.ts b/node_modules/@typescript-eslint/parser/dist/parser.d.ts
index 8001037..0d501b8 100644
--- a/node_modules/@typescript-eslint/parser/dist/parser.d.ts
+++ b/node_modules/@typescript-eslint/parser/dist/parser.d.ts
@@ -1,7 +1,6 @@
-import { TSESLint } from '@typescript-eslint/experimental-utils';
-import { AST_NODE_TYPES, ParserServices, TSESTree, visitorKeys } from '@typescript-eslint/typescript-estree';
-import { analyzeScope } from './analyze-scope';
-declare type ParserOptions = TSESLint.ParserOptions;
+import { ParserOptions, TSESTree } from '@typescript-eslint/types';
+import { ParserServices, visitorKeys } from '@typescript-eslint/typescript-estree';
+import { ScopeManager } from '@typescript-eslint/scope-manager';
 interface ParseForESLintResult {
     ast: TSESTree.Program & {
         range?: [number, number];
@@ -10,12 +9,9 @@
     };
     services: ParserServices;
     visitorKeys: typeof visitorKeys;
-    scopeManager: ReturnType<typeof analyzeScope>;
+    scopeManager: ScopeManager;
 }
-export declare const version: any;
-export declare const Syntax: Readonly<typeof AST_NODE_TYPES>;
-export declare function parse(code: string, options?: ParserOptions): ParseForESLintResult['ast'];
-export declare function parseForESLint(code: string, options?: ParserOptions | null): ParseForESLintResult;
-export { ParserServices, ParserOptions };
-export { clearCaches } from '@typescript-eslint/typescript-estree';
+declare function parse(code: string, options?: ParserOptions): ParseForESLintResult['ast'];
+declare function parseForESLint(code: string, options?: ParserOptions | null): ParseForESLintResult;
+export { parse, parseForESLint, ParserOptions };
 //# sourceMappingURL=parser.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/parser.d.ts.map b/node_modules/@typescript-eslint/parser/dist/parser.d.ts.map
index 71cc381..2e25638 100644
--- a/node_modules/@typescript-eslint/parser/dist/parser.d.ts.map
+++ b/node_modules/@typescript-eslint/parser/dist/parser.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AACjE,OAAO,EACL,cAAc,EAEd,cAAc,EAEd,QAAQ,EAER,WAAW,EACZ,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,aAAK,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;AAK5C,UAAU,oBAAoB;IAC5B,GAAG,EAAE,QAAQ,CAAC,OAAO,GAAG;QACtB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzB,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;KAC/B,CAAC;IACF,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,YAAY,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;CAC/C;AAgBD,eAAO,MAAM,OAAO,KAAsB,CAAC;AAE3C,eAAO,MAAM,MAAM,iCAAgC,CAAC;AAEpD,wBAAgB,KAAK,CACnB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,GACtB,oBAAoB,CAAC,KAAK,CAAC,CAE7B;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,GAC7B,oBAAoB,CA0DtB;AAED,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAO,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAEL,cAAc,EAEd,WAAW,EACZ,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAGL,YAAY,EACb,MAAM,kCAAkC,CAAC;AAM1C,UAAU,oBAAoB;IAC5B,GAAG,EAAE,QAAQ,CAAC,OAAO,GAAG;QACtB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzB,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;KAC/B,CAAC;IACF,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,YAAY,EAAE,YAAY,CAAC;CAC5B;AAiDD,iBAAS,KAAK,CACZ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,GACtB,oBAAoB,CAAC,KAAK,CAAC,CAE7B;AAED,iBAAS,cAAc,CACrB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,GAC7B,oBAAoB,CAwFtB;AAED,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/parser.js b/node_modules/@typescript-eslint/parser/dist/parser.js
index 115f5a0..3b6a30c 100644
--- a/node_modules/@typescript-eslint/parser/dist/parser.js
+++ b/node_modules/@typescript-eslint/parser/dist/parser.js
@@ -1,20 +1,55 @@
 "use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.parseForESLint = exports.parse = void 0;
 const typescript_estree_1 = require("@typescript-eslint/typescript-estree");
-const analyze_scope_1 = require("./analyze-scope");
-// note - cannot migrate this to an import statement because it will make TSC copy the package.json to the dist folder
-const packageJSON = require('../package.json');
+const scope_manager_1 = require("@typescript-eslint/scope-manager");
+const debug_1 = __importDefault(require("debug"));
+const typescript_1 = require("typescript");
+const log = debug_1.default('typescript-eslint:parser:parser');
 function validateBoolean(value, fallback = false) {
     if (typeof value !== 'boolean') {
         return fallback;
     }
     return value;
 }
-//------------------------------------------------------------------------------
-// Public
-//------------------------------------------------------------------------------
-exports.version = packageJSON.version;
-exports.Syntax = Object.freeze(typescript_estree_1.AST_NODE_TYPES);
+const LIB_FILENAME_REGEX = /lib\.(.+)\.d\.ts/;
+function getLib(compilerOptions) {
+    var _a;
+    if (compilerOptions.lib) {
+        return compilerOptions.lib
+            .map(lib => {
+            const match = LIB_FILENAME_REGEX.exec(lib.toLowerCase());
+            if (!match) {
+                return null;
+            }
+            return match[1];
+        })
+            .filter(l => l != null);
+    }
+    const target = (_a = compilerOptions.target) !== null && _a !== void 0 ? _a : typescript_1.ScriptTarget.ES5;
+    // https://github.com/Microsoft/TypeScript/blob/59ad375234dc2efe38d8ee0ba58414474c1d5169/src/compiler/utilitiesPublic.ts#L13-L32
+    switch (target) {
+        case typescript_1.ScriptTarget.ESNext:
+            return ['esnext.full'];
+        case typescript_1.ScriptTarget.ES2020:
+            return ['es2020.full'];
+        case typescript_1.ScriptTarget.ES2019:
+            return ['es2019.full'];
+        case typescript_1.ScriptTarget.ES2018:
+            return ['es2018.full'];
+        case typescript_1.ScriptTarget.ES2017:
+            return ['es2017.full'];
+        case typescript_1.ScriptTarget.ES2016:
+            return ['es2016.full'];
+        case typescript_1.ScriptTarget.ES2015:
+            return ['es6'];
+        default:
+            return ['lib'];
+    }
+}
 function parse(code, options) {
     return parseForESLint(code, options).ast;
 }
@@ -23,6 +58,9 @@
     if (!options || typeof options !== 'object') {
         options = {};
     }
+    else {
+        options = Object.assign({}, options);
+    }
     // https://eslint.org/docs/user-guide/configuring#specifying-parser-options
     // if sourceType is not provided by default eslint expect that it will be set to "script"
     if (options.sourceType !== 'module' && options.sourceType !== 'script') {
@@ -36,6 +74,14 @@
         useJSXTextNode: validateBoolean(options.useJSXTextNode, true),
         jsx: validateBoolean(options.ecmaFeatures.jsx),
     });
+    const analyzeOptions = {
+        ecmaVersion: options.ecmaVersion,
+        globalReturn: options.ecmaFeatures.globalReturn,
+        jsxPragma: options.jsxPragma,
+        jsxFragmentName: options.jsxFragmentName,
+        lib: options.lib,
+        sourceType: options.sourceType,
+    };
     if (typeof options.filePath === 'string') {
         const tsx = options.filePath.endsWith('.tsx');
         if (tsx || options.filePath.endsWith('.ts')) {
@@ -52,24 +98,34 @@
     }
     const { ast, services } = typescript_estree_1.parseAndGenerateServices(code, parserOptions);
     ast.sourceType = options.sourceType;
-    typescript_estree_1.simpleTraverse(ast, {
-        enter(node) {
-            switch (node.type) {
-                // Function#body cannot be null in ESTree spec.
-                case typescript_estree_1.AST_NODE_TYPES.FunctionExpression:
-                    if (!node.body) {
-                        // eslint-disable-next-line @typescript-eslint/no-explicit-any
-                        node.type = `TSEmptyBody${node.type}`;
-                    }
-                    break;
-                // no default
+    if (services.hasFullTypeInformation) {
+        // automatically apply the options configured for the program
+        const compilerOptions = services.program.getCompilerOptions();
+        if (analyzeOptions.lib == null) {
+            analyzeOptions.lib = getLib(compilerOptions);
+            log('Resolved libs from program: %o', analyzeOptions.lib);
+        }
+        if (parserOptions.jsx === true) {
+            if (analyzeOptions.jsxPragma === undefined &&
+                compilerOptions.jsxFactory != null) {
+                // in case the user has specified something like "preact.h"
+                const factory = compilerOptions.jsxFactory.split('.')[0].trim();
+                analyzeOptions.jsxPragma = factory;
+                log('Resolved jsxPragma from program: %s', analyzeOptions.jsxPragma);
             }
-        },
-    });
-    const scopeManager = analyze_scope_1.analyzeScope(ast, options);
+            if (analyzeOptions.jsxFragmentName === undefined &&
+                compilerOptions.jsxFragmentFactory != null) {
+                // in case the user has specified something like "preact.Fragment"
+                const fragFactory = compilerOptions.jsxFragmentFactory
+                    .split('.')[0]
+                    .trim();
+                analyzeOptions.jsxFragmentName = fragFactory;
+                log('Resolved jsxFragmentName from program: %s', analyzeOptions.jsxFragmentName);
+            }
+        }
+    }
+    const scopeManager = scope_manager_1.analyze(ast, analyzeOptions);
     return { ast, services, scopeManager, visitorKeys: typescript_estree_1.visitorKeys };
 }
 exports.parseForESLint = parseForESLint;
-var typescript_estree_2 = require("@typescript-eslint/typescript-estree");
-exports.clearCaches = typescript_estree_2.clearCaches;
 //# sourceMappingURL=parser.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/parser.js.map b/node_modules/@typescript-eslint/parser/dist/parser.js.map
index cd37c55..e3b8dd0 100644
--- a/node_modules/@typescript-eslint/parser/dist/parser.js.map
+++ b/node_modules/@typescript-eslint/parser/dist/parser.js.map
@@ -1 +1 @@
-{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":";;;;;;AACA,4EAK8C;AAC9C,oEAI0C;AAC1C,kDAA0B;AAC1B,2CAA2D;AAE3D,MAAM,GAAG,GAAG,eAAK,CAAC,iCAAiC,CAAC,CAAC;AAarD,SAAS,eAAe,CACtB,KAA0B,EAC1B,QAAQ,GAAG,KAAK;IAEhB,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;QAC9B,OAAO,QAAQ,CAAC;KACjB;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AAC9C,SAAS,MAAM,CAAC,eAAgC;;IAC9C,IAAI,eAAe,CAAC,GAAG,EAAE;QACvB,OAAO,eAAe,CAAC,GAAG;aACvB,GAAG,CAAC,GAAG,CAAC,EAAE;YACT,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,KAAK,EAAE;gBACV,OAAO,IAAI,CAAC;aACb;YAED,OAAO,KAAK,CAAC,CAAC,CAAQ,CAAC;QACzB,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAU,CAAC;KACpC;IAED,MAAM,MAAM,SAAG,eAAe,CAAC,MAAM,mCAAI,yBAAY,CAAC,GAAG,CAAC;IAC1D,gIAAgI;IAChI,QAAQ,MAAM,EAAE;QACd,KAAK,yBAAY,CAAC,MAAM;YACtB,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,KAAK,yBAAY,CAAC,MAAM;YACtB,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,KAAK,yBAAY,CAAC,MAAM;YACtB,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,KAAK,yBAAY,CAAC,MAAM;YACtB,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,KAAK,yBAAY,CAAC,MAAM;YACtB,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,KAAK,yBAAY,CAAC,MAAM;YACtB,OAAO,CAAC,aAAa,CAAC,CAAC;QACzB,KAAK,yBAAY,CAAC,MAAM;YACtB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB;YACE,OAAO,CAAC,KAAK,CAAC,CAAC;KAClB;AACH,CAAC;AAED,SAAS,KAAK,CACZ,IAAY,EACZ,OAAuB;IAEvB,OAAO,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC;AAC3C,CAAC;AA+FQ,sBAAK;AA7Fd,SAAS,cAAc,CACrB,IAAY,EACZ,OAA8B;IAE9B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAC3C,OAAO,GAAG,EAAE,CAAC;KACd;SAAM;QACL,OAAO,qBAAQ,OAAO,CAAE,CAAC;KAC1B;IACD,2EAA2E;IAC3E,yFAAyF;IACzF,IAAI,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE;QACtE,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC;KAC/B;IACD,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,EAAE;QAC5C,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;KAC3B;IAED,MAAM,aAAa,GAAoB,EAAE,CAAC;IAC1C,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,EAAE;QACpC,cAAc,EAAE,eAAe,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;QAC7D,GAAG,EAAE,eAAe,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC;KAC/C,CAAC,CAAC;IACH,MAAM,cAAc,GAAmB;QACrC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,YAAY;QAC/C,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;IAEF,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE;QACxC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAC3C,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;SACzB;KACF;IAED;;;OAGG;IACH,MAAM,kCAAkC,GAAG,eAAe,CACxD,OAAO,CAAC,kCAAkC,EAC1C,IAAI,CACL,CAAC;IACF,IAAI,CAAC,kCAAkC,EAAE;QACvC,aAAa,CAAC,QAAQ,GAAG,KAAK,CAAC;KAChC;IAED,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,4CAAwB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxE,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAEpC,IAAI,QAAQ,CAAC,sBAAsB,EAAE;QACnC,6DAA6D;QAC7D,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC9D,IAAI,cAAc,CAAC,GAAG,IAAI,IAAI,EAAE;YAC9B,cAAc,CAAC,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;YAC7C,GAAG,CAAC,gCAAgC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;SAC3D;QACD,IAAI,aAAa,CAAC,GAAG,KAAK,IAAI,EAAE;YAC9B,IACE,cAAc,CAAC,SAAS,KAAK,SAAS;gBACtC,eAAe,CAAC,UAAU,IAAI,IAAI,EAClC;gBACA,2DAA2D;gBAC3D,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAChE,cAAc,CAAC,SAAS,GAAG,OAAO,CAAC;gBACnC,GAAG,CAAC,qCAAqC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;aACtE;YACD,IACE,cAAc,CAAC,eAAe,KAAK,SAAS;gBAC5C,eAAe,CAAC,kBAAkB,IAAI,IAAI,EAC1C;gBACA,kEAAkE;gBAClE,MAAM,WAAW,GAAG,eAAe,CAAC,kBAAkB;qBACnD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;qBACb,IAAI,EAAE,CAAC;gBACV,cAAc,CAAC,eAAe,GAAG,WAAW,CAAC;gBAC7C,GAAG,CACD,2CAA2C,EAC3C,cAAc,CAAC,eAAe,CAC/B,CAAC;aACH;SACF;KACF;IAED,MAAM,YAAY,GAAG,uBAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAElD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAX,+BAAW,EAAE,CAAC;AACtD,CAAC;AAEe,wCAAc"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/scope/scope-manager.d.ts b/node_modules/@typescript-eslint/parser/dist/scope/scope-manager.d.ts
deleted file mode 100644
index 739952b..0000000
--- a/node_modules/@typescript-eslint/parser/dist/scope/scope-manager.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { TSESTree, TSESLintScope } from '@typescript-eslint/experimental-utils';
-/**
- * based on eslint-scope
- */
-export declare class ScopeManager extends TSESLintScope.ScopeManager {
-    scopes: TSESLintScope.Scope[];
-    globalScope: TSESLintScope.Scope;
-    constructor(options: TSESLintScope.ScopeManagerOptions);
-    /** @internal */
-    __nestEnumScope(node: TSESTree.TSEnumDeclaration): TSESLintScope.Scope;
-    /** @internal */
-    __nestEmptyFunctionScope(node: TSESTree.TSDeclareFunction): TSESLintScope.Scope;
-}
-//# sourceMappingURL=scope-manager.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/scope/scope-manager.d.ts.map b/node_modules/@typescript-eslint/parser/dist/scope/scope-manager.d.ts.map
deleted file mode 100644
index 0b213c7..0000000
--- a/node_modules/@typescript-eslint/parser/dist/scope/scope-manager.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scope-manager.d.ts","sourceRoot":"","sources":["../../src/scope/scope-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAGhF;;GAEG;AACH,qBAAa,YAAa,SAAQ,aAAa,CAAC,YAAY;IAC1D,MAAM,EAAG,aAAa,CAAC,KAAK,EAAE,CAAC;IAC/B,WAAW,EAAG,aAAa,CAAC,KAAK,CAAC;gBAEtB,OAAO,EAAE,aAAa,CAAC,mBAAmB;IAItD,gBAAgB;IAChB,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,GAAG,aAAa,CAAC,KAAK;IAItE,gBAAgB;IAChB,wBAAwB,CACtB,IAAI,EAAE,QAAQ,CAAC,iBAAiB,GAC/B,aAAa,CAAC,KAAK;CAKvB"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/scope/scope-manager.js b/node_modules/@typescript-eslint/parser/dist/scope/scope-manager.js
deleted file mode 100644
index 33d7b28..0000000
--- a/node_modules/@typescript-eslint/parser/dist/scope/scope-manager.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-const scopes_1 = require("./scopes");
-/**
- * based on eslint-scope
- */
-class ScopeManager extends experimental_utils_1.TSESLintScope.ScopeManager {
-    constructor(options) {
-        super(options);
-    }
-    /** @internal */
-    __nestEnumScope(node) {
-        return this.__nestScope(new scopes_1.EnumScope(this, this.__currentScope, node));
-    }
-    /** @internal */
-    __nestEmptyFunctionScope(node) {
-        return this.__nestScope(new scopes_1.EmptyFunctionScope(this, this.__currentScope, node));
-    }
-}
-exports.ScopeManager = ScopeManager;
-//# sourceMappingURL=scope-manager.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/scope/scope-manager.js.map b/node_modules/@typescript-eslint/parser/dist/scope/scope-manager.js.map
deleted file mode 100644
index 5c3847e..0000000
--- a/node_modules/@typescript-eslint/parser/dist/scope/scope-manager.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scope-manager.js","sourceRoot":"","sources":["../../src/scope/scope-manager.ts"],"names":[],"mappings":";;AAAA,8EAAgF;AAChF,qCAAyD;AAEzD;;GAEG;AACH,MAAa,YAAa,SAAQ,kCAAa,CAAC,YAAY;IAI1D,YAAY,OAA0C;QACpD,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;IAED,gBAAgB;IAChB,eAAe,CAAC,IAAgC;QAC9C,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,kBAAS,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,gBAAgB;IAChB,wBAAwB,CACtB,IAAgC;QAEhC,OAAO,IAAI,CAAC,WAAW,CACrB,IAAI,2BAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CACxD,CAAC;IACJ,CAAC;CACF;AArBD,oCAqBC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/scope/scopes.d.ts b/node_modules/@typescript-eslint/parser/dist/scope/scopes.d.ts
deleted file mode 100644
index b41e1cd..0000000
--- a/node_modules/@typescript-eslint/parser/dist/scope/scopes.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { TSESTree, TSESLintScope } from '@typescript-eslint/experimental-utils';
-import { ScopeManager } from './scope-manager';
-/** The scope class for enum. */
-export declare class EnumScope extends TSESLintScope.Scope {
-    constructor(scopeManager: ScopeManager, upperScope: TSESLintScope.Scope, block: TSESTree.TSEnumDeclaration | null);
-}
-/** The scope class for empty functions. */
-export declare class EmptyFunctionScope extends TSESLintScope.Scope {
-    constructor(scopeManager: ScopeManager, upperScope: TSESLintScope.Scope, block: TSESTree.TSDeclareFunction | null);
-}
-//# sourceMappingURL=scopes.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/scope/scopes.d.ts.map b/node_modules/@typescript-eslint/parser/dist/scope/scopes.d.ts.map
deleted file mode 100644
index 65f2a1f..0000000
--- a/node_modules/@typescript-eslint/parser/dist/scope/scopes.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scopes.d.ts","sourceRoot":"","sources":["../../src/scope/scopes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,gCAAgC;AAChC,qBAAa,SAAU,SAAQ,aAAa,CAAC,KAAK;gBAE9C,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,aAAa,CAAC,KAAK,EAC/B,KAAK,EAAE,QAAQ,CAAC,iBAAiB,GAAG,IAAI;CAI3C;AAED,2CAA2C;AAC3C,qBAAa,kBAAmB,SAAQ,aAAa,CAAC,KAAK;gBAEvD,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,aAAa,CAAC,KAAK,EAC/B,KAAK,EAAE,QAAQ,CAAC,iBAAiB,GAAG,IAAI;CAI3C"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/scope/scopes.js b/node_modules/@typescript-eslint/parser/dist/scope/scopes.js
deleted file mode 100644
index 52bc504..0000000
--- a/node_modules/@typescript-eslint/parser/dist/scope/scopes.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const experimental_utils_1 = require("@typescript-eslint/experimental-utils");
-/** The scope class for enum. */
-class EnumScope extends experimental_utils_1.TSESLintScope.Scope {
-    constructor(scopeManager, upperScope, block) {
-        super(scopeManager, 'enum', upperScope, block, false);
-    }
-}
-exports.EnumScope = EnumScope;
-/** The scope class for empty functions. */
-class EmptyFunctionScope extends experimental_utils_1.TSESLintScope.Scope {
-    constructor(scopeManager, upperScope, block) {
-        super(scopeManager, 'empty-function', upperScope, block, false);
-    }
-}
-exports.EmptyFunctionScope = EmptyFunctionScope;
-//# sourceMappingURL=scopes.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/dist/scope/scopes.js.map b/node_modules/@typescript-eslint/parser/dist/scope/scopes.js.map
deleted file mode 100644
index 18850e0..0000000
--- a/node_modules/@typescript-eslint/parser/dist/scope/scopes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scopes.js","sourceRoot":"","sources":["../../src/scope/scopes.ts"],"names":[],"mappings":";;AAAA,8EAAgF;AAGhF,gCAAgC;AAChC,MAAa,SAAU,SAAQ,kCAAa,CAAC,KAAK;IAChD,YACE,YAA0B,EAC1B,UAA+B,EAC/B,KAAwC;QAExC,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;CACF;AARD,8BAQC;AAED,2CAA2C;AAC3C,MAAa,kBAAmB,SAAQ,kCAAa,CAAC,KAAK;IACzD,YACE,YAA0B,EAC1B,UAA+B,EAC/B,KAAwC;QAExC,KAAK,CAAC,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;CACF;AARD,gDAQC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/node_modules/.bin/eslint b/node_modules/@typescript-eslint/parser/node_modules/.bin/eslint
new file mode 120000
index 0000000..da97b4e
--- /dev/null
+++ b/node_modules/@typescript-eslint/parser/node_modules/.bin/eslint
@@ -0,0 +1 @@
+../../../../eslint/bin/eslint.js
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/parser/package.json b/node_modules/@typescript-eslint/parser/package.json
index 0b061a8..214ff28 100644
--- a/node_modules/@typescript-eslint/parser/package.json
+++ b/node_modules/@typescript-eslint/parser/package.json
@@ -1,16 +1,16 @@
 {
   "name": "@typescript-eslint/parser",
-  "version": "2.22.0",
+  "version": "4.3.0",
   "description": "An ESLint custom parser which leverages TypeScript ESTree",
-  "main": "dist/parser.js",
-  "types": "dist/parser.d.ts",
+  "main": "dist/index.js",
+  "types": "dist/index.d.ts",
   "files": [
     "dist",
     "README.md",
     "LICENSE"
   ],
   "engines": {
-    "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
+    "node": "^10.12.0 || >=12.0.0"
   },
   "repository": {
     "type": "git",
@@ -32,25 +32,29 @@
   ],
   "scripts": {
     "build": "tsc -b tsconfig.build.json",
+    "postbuild": "downlevel-dts dist _ts3.4/dist",
     "clean": "tsc -b tsconfig.build.json --clean",
+    "postclean": "rimraf dist",
     "format": "prettier --write \"./**/*.{ts,js,json,md}\" --ignore-path ../../.prettierignore",
     "lint": "eslint . --ext .js,.ts --ignore-path='../../.eslintignore'",
     "test": "jest --coverage",
     "typecheck": "tsc -p tsconfig.json --noEmit"
   },
   "peerDependencies": {
-    "eslint": "^5.0.0 || ^6.0.0"
+    "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0"
   },
   "dependencies": {
-    "@types/eslint-visitor-keys": "^1.0.0",
-    "@typescript-eslint/experimental-utils": "2.22.0",
-    "@typescript-eslint/typescript-estree": "2.22.0",
-    "eslint-visitor-keys": "^1.1.0"
+    "@typescript-eslint/scope-manager": "4.3.0",
+    "@typescript-eslint/types": "4.3.0",
+    "@typescript-eslint/typescript-estree": "4.3.0",
+    "debug": "^4.1.1"
   },
   "devDependencies": {
-    "@types/glob": "^7.1.1",
-    "@typescript-eslint/shared-fixtures": "2.22.0",
-    "glob": "*"
+    "@types/glob": "*",
+    "@typescript-eslint/experimental-utils": "4.3.0",
+    "@typescript-eslint/shared-fixtures": "4.3.0",
+    "glob": "*",
+    "typescript": "*"
   },
   "peerDependenciesMeta": {
     "typescript": {
@@ -61,5 +65,12 @@
     "type": "opencollective",
     "url": "https://opencollective.com/typescript-eslint"
   },
-  "gitHead": "5a097d316fb084dc4b13e87d68fe9bf43d8a9548"
+  "typesVersions": {
+    "<3.8": {
+      "*": [
+        "_ts3.4/*"
+      ]
+    }
+  },
+  "gitHead": "229631e6cd90bba8f509a6d49fec72fd7a576ccf"
 }
diff --git a/node_modules/@typescript-eslint/scope-manager/CHANGELOG.md b/node_modules/@typescript-eslint/scope-manager/CHANGELOG.md
index cf0ad48..d68103f 100644
--- a/node_modules/@typescript-eslint/scope-manager/CHANGELOG.md
+++ b/node_modules/@typescript-eslint/scope-manager/CHANGELOG.md
@@ -3,6 +3,33 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [4.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.2.0...v4.3.0) (2020-09-28)
+
+**Note:** Version bump only for package @typescript-eslint/scope-manager
+
+
+
+
+
+# [4.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.1...v4.2.0) (2020-09-21)
+
+
+### Bug Fixes
+
+* **scope-manager:** correct analysis of inferred types in conditional types ([#2537](https://github.com/typescript-eslint/typescript-eslint/issues/2537)) ([4f660fd](https://github.com/typescript-eslint/typescript-eslint/commit/4f660fd31acbb88b30719f925dcb2b3022cc2bab))
+
+
+
+
+
+## [4.1.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.0...v4.1.1) (2020-09-14)
+
+**Note:** Version bump only for package @typescript-eslint/scope-manager
+
+
+
+
+
 # [4.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.1...v4.1.0) (2020-09-07)
 
 
diff --git a/node_modules/@typescript-eslint/scope-manager/dist/referencer/TypeVisitor.d.ts.map b/node_modules/@typescript-eslint/scope-manager/dist/referencer/TypeVisitor.d.ts.map
index a471358..7003cbe 100644
--- a/node_modules/@typescript-eslint/scope-manager/dist/referencer/TypeVisitor.d.ts.map
+++ b/node_modules/@typescript-eslint/scope-manager/dist/referencer/TypeVisitor.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"TypeVisitor.d.ts","sourceRoot":"","sources":["../../src/referencer/TypeVisitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,cAAM,WAAY,SAAQ,OAAO;;gBAGnB,UAAU,EAAE,UAAU;IAKlC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI;IAS/D,SAAS,CAAC,iBAAiB,CACzB,IAAI,EACA,QAAQ,CAAC,0BAA0B,GACnC,QAAQ,CAAC,iBAAiB,GAC1B,QAAQ,CAAC,+BAA+B,GACxC,QAAQ,CAAC,cAAc,GACvB,QAAQ,CAAC,iBAAiB,GAC7B,IAAI;IAgCP,SAAS,CAAC,gBAAgB,CACxB,IAAI,EAAE,QAAQ,CAAC,iBAAiB,GAAG,QAAQ,CAAC,mBAAmB,GAC9D,IAAI;IAYP,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,GAAG,IAAI;IAIrD,SAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAAG,IAAI;IAKjE,SAAS,CAAC,0BAA0B,CAClC,IAAI,EAAE,QAAQ,CAAC,0BAA0B,GACxC,IAAI;IAIP,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,GAAG,IAAI;IAUnE,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,GAAG,IAAI;IAInE,SAAS,CAAC,+BAA+B,CACvC,IAAI,EAAE,QAAQ,CAAC,+BAA+B,GAC7C,IAAI;IAIP,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,GAAG,IAAI;IAI7D,SAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAAG,IAAI;IASjE,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,GAAG,IAAI;IAsCvD,SAAS,CAAC,sBAAsB,CAC9B,IAAI,EAAE,QAAQ,CAAC,sBAAsB,GACpC,IAAI;IAoBP,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,GAAG,IAAI;IAOzD,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,GAAG,IAAI;IAKnE,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,GAAG,IAAI;IAKrE,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,mBAAmB,GAAG,IAAI;IAKvE,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,GAAG,IAAI;IAK/D,SAAS,CAAC,sBAAsB,CAC9B,IAAI,EAAE,QAAQ,CAAC,sBAAsB,GACpC,IAAI;IAkBP,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,GAAG,IAAI;IAS/D,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,GAAG,IAAI;IAQ/D,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,GAAG,IAAI;CAWxD;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
\ No newline at end of file
+{"version":3,"file":"TypeVisitor.d.ts","sourceRoot":"","sources":["../../src/referencer/TypeVisitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,cAAM,WAAY,SAAQ,OAAO;;gBAGnB,UAAU,EAAE,UAAU;IAKlC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI;IAS/D,SAAS,CAAC,iBAAiB,CACzB,IAAI,EACA,QAAQ,CAAC,0BAA0B,GACnC,QAAQ,CAAC,iBAAiB,GAC1B,QAAQ,CAAC,+BAA+B,GACxC,QAAQ,CAAC,cAAc,GACvB,QAAQ,CAAC,iBAAiB,GAC7B,IAAI;IAgCP,SAAS,CAAC,gBAAgB,CACxB,IAAI,EAAE,QAAQ,CAAC,iBAAiB,GAAG,QAAQ,CAAC,mBAAmB,GAC9D,IAAI;IAYP,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,GAAG,IAAI;IAIrD,SAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAAG,IAAI;IAKjE,SAAS,CAAC,0BAA0B,CAClC,IAAI,EAAE,QAAQ,CAAC,0BAA0B,GACxC,IAAI;IAIP,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,GAAG,IAAI;IAanE,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,GAAG,IAAI;IAInE,SAAS,CAAC,+BAA+B,CACvC,IAAI,EAAE,QAAQ,CAAC,+BAA+B,GAC7C,IAAI;IAIP,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,cAAc,GAAG,IAAI;IAI7D,SAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,GAAG,IAAI;IASjE,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,GAAG,IAAI;IAsCvD,SAAS,CAAC,sBAAsB,CAC9B,IAAI,EAAE,QAAQ,CAAC,sBAAsB,GACpC,IAAI;IAoBP,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,GAAG,IAAI;IAOzD,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,GAAG,IAAI;IAKnE,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,GAAG,IAAI;IAKrE,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,mBAAmB,GAAG,IAAI;IAKvE,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,GAAG,IAAI;IAK/D,SAAS,CAAC,sBAAsB,CAC9B,IAAI,EAAE,QAAQ,CAAC,sBAAsB,GACpC,IAAI;IAkBP,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,GAAG,IAAI;IAS/D,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,GAAG,IAAI;IAQ/D,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,GAAG,IAAI;CAWxD;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/scope-manager/dist/referencer/TypeVisitor.js b/node_modules/@typescript-eslint/scope-manager/dist/referencer/TypeVisitor.js
index 6a3d4e6..10b05f6 100644
--- a/node_modules/@typescript-eslint/scope-manager/dist/referencer/TypeVisitor.js
+++ b/node_modules/@typescript-eslint/scope-manager/dist/referencer/TypeVisitor.js
@@ -79,8 +79,10 @@
         // conditional types can define inferred type parameters
         // which are only accessible from inside the conditional parameter
         __classPrivateFieldGet(this, _referencer).scopeManager.nestConditionalTypeScope(node);
-        this.visitChildren(node);
+        // type parameters inferred in the condition clause are not accessible within the false branch
+        this.visitChildren(node, ['falseType']);
         __classPrivateFieldGet(this, _referencer).close(node);
+        this.visit(node.falseType);
     }
     TSConstructorType(node) {
         this.visitFunctionType(node);
diff --git a/node_modules/@typescript-eslint/scope-manager/dist/referencer/TypeVisitor.js.map b/node_modules/@typescript-eslint/scope-manager/dist/referencer/TypeVisitor.js.map
index 6ef5c83..19d692c 100644
--- a/node_modules/@typescript-eslint/scope-manager/dist/referencer/TypeVisitor.js.map
+++ b/node_modules/@typescript-eslint/scope-manager/dist/referencer/TypeVisitor.js.map
@@ -1 +1 @@
-{"version":3,"file":"TypeVisitor.js","sourceRoot":"","sources":["../../src/referencer/TypeVisitor.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"TypeVisitor.js","sourceRoot":"","sources":["../../src/referencer/TypeVisitor.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/scope-manager/package.json b/node_modules/@typescript-eslint/scope-manager/package.json
index 10cf383..d93a700 100644
--- a/node_modules/@typescript-eslint/scope-manager/package.json
+++ b/node_modules/@typescript-eslint/scope-manager/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@typescript-eslint/scope-manager",
-  "version": "4.1.0",
+  "version": "4.3.0",
   "description": "TypeScript scope analyser for ESLint",
   "keywords": [
     "eslint",
@@ -39,12 +39,12 @@
     "typecheck": "tsc -p tsconfig.json --noEmit"
   },
   "dependencies": {
-    "@typescript-eslint/types": "4.1.0",
-    "@typescript-eslint/visitor-keys": "4.1.0"
+    "@typescript-eslint/types": "4.3.0",
+    "@typescript-eslint/visitor-keys": "4.3.0"
   },
   "devDependencies": {
     "@types/glob": "*",
-    "@typescript-eslint/typescript-estree": "4.1.0",
+    "@typescript-eslint/typescript-estree": "4.3.0",
     "glob": "*",
     "jest-specific-snapshot": "*",
     "make-dir": "*",
@@ -64,5 +64,5 @@
       ]
     }
   },
-  "gitHead": "00a24706222254774121ee62038e67d0efa993e7"
+  "gitHead": "229631e6cd90bba8f509a6d49fec72fd7a576ccf"
 }
diff --git a/node_modules/@typescript-eslint/types/CHANGELOG.md b/node_modules/@typescript-eslint/types/CHANGELOG.md
index 43d0346..a9206bf 100644
--- a/node_modules/@typescript-eslint/types/CHANGELOG.md
+++ b/node_modules/@typescript-eslint/types/CHANGELOG.md
@@ -3,6 +3,33 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [4.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.2.0...v4.3.0) (2020-09-28)
+
+**Note:** Version bump only for package @typescript-eslint/types
+
+
+
+
+
+# [4.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.1...v4.2.0) (2020-09-21)
+
+**Note:** Version bump only for package @typescript-eslint/types
+
+
+
+
+
+## [4.1.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.0...v4.1.1) (2020-09-14)
+
+
+### Bug Fixes
+
+* **types:** artificial fix needed to trigger release ([b577daf](https://github.com/typescript-eslint/typescript-eslint/commit/b577daf27cd87870b6e095e4e995519f96d321dd))
+
+
+
+
+
 # [4.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.1...v4.1.0) (2020-09-07)
 
 
diff --git a/node_modules/@typescript-eslint/types/package.json b/node_modules/@typescript-eslint/types/package.json
index 641725a..9b0ca10 100644
--- a/node_modules/@typescript-eslint/types/package.json
+++ b/node_modules/@typescript-eslint/types/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@typescript-eslint/types",
-  "version": "4.1.0",
+  "version": "4.3.0",
   "description": "Types for the TypeScript-ESTree AST spec",
   "keywords": [
     "eslint",
@@ -48,5 +48,5 @@
       ]
     }
   },
-  "gitHead": "00a24706222254774121ee62038e67d0efa993e7"
+  "gitHead": "229631e6cd90bba8f509a6d49fec72fd7a576ccf"
 }
diff --git a/node_modules/@typescript-eslint/typescript-estree/CHANGELOG.md b/node_modules/@typescript-eslint/typescript-estree/CHANGELOG.md
index ffd7ae3..0a5a33b 100644
--- a/node_modules/@typescript-eslint/typescript-estree/CHANGELOG.md
+++ b/node_modules/@typescript-eslint/typescript-estree/CHANGELOG.md
@@ -3,6 +3,400 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [4.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.2.0...v4.3.0) (2020-09-28)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+# [4.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.1...v4.2.0) (2020-09-21)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+## [4.1.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.0...v4.1.1) (2020-09-14)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+# [4.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.1...v4.1.0) (2020-09-07)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+## [4.0.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.0...v4.0.1) (2020-08-31)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+# [4.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.10.1...v4.0.0) (2020-08-31)
+
+
+### Bug Fixes
+
+* correct decorator traversal for AssignmentPattern ([#2375](https://github.com/typescript-eslint/typescript-eslint/issues/2375)) ([d738fa4](https://github.com/typescript-eslint/typescript-eslint/commit/d738fa4eff0a5c4cfc9b30b1c0502f8d1e78d7b6))
+* **typescript-estree:** correct ChainExpression interaction with parentheses and non-nulls ([#2380](https://github.com/typescript-eslint/typescript-eslint/issues/2380)) ([762bc99](https://github.com/typescript-eslint/typescript-eslint/commit/762bc99584ede4d0b8099a743991e957aec86aa8))
+
+
+### Features
+
+* support ESTree optional chaining representation ([#2308](https://github.com/typescript-eslint/typescript-eslint/issues/2308)) ([e9d2ab6](https://github.com/typescript-eslint/typescript-eslint/commit/e9d2ab638b6767700b52797e74b814ea059beaae))
+* **typescript-estree:** switch to globby ([#2418](https://github.com/typescript-eslint/typescript-eslint/issues/2418)) ([3a7ec9b](https://github.com/typescript-eslint/typescript-eslint/commit/3a7ec9bcf1873a99c6da2f19ade8ab4763b4793c)), closes [#2398](https://github.com/typescript-eslint/typescript-eslint/issues/2398)
+
+
+### BREAKING CHANGES
+
+* **typescript-estree:** - removes the ability to supply a `RegExp` to `projectFolderIgnoreList`, and changes the meaning of the string value from a regex to a glob.
+* - Removed decorators property from several Nodes that could never semantically have them (FunctionDeclaration, TSEnumDeclaration, and TSInterfaceDeclaration)
+- Removed AST_NODE_TYPES.Import. This is a minor breaking change as the node type that used this was removed ages ago.
+
+
+
+
+
+## [3.10.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.10.0...v3.10.1) (2020-08-25)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+# [3.10.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.9.1...v3.10.0) (2020-08-24)
+
+
+### Bug Fixes
+
+* **typescript-estree:** ts.NamedTupleMember workaround for <TS4.0 ([#2405](https://github.com/typescript-eslint/typescript-eslint/issues/2405)) ([b62331a](https://github.com/typescript-eslint/typescript-eslint/commit/b62331ad02dcff3236e18f10eb92d59e7371d4c3))
+
+
+### Features
+
+* **typescript-estree:** update allowed TS version range ([#2419](https://github.com/typescript-eslint/typescript-eslint/issues/2419)) ([e6be621](https://github.com/typescript-eslint/typescript-eslint/commit/e6be62128b3a98541fe590512892c4b501914e46))
+
+
+
+
+
+## [3.9.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.9.0...v3.9.1) (2020-08-17)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+# [3.9.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.8.0...v3.9.0) (2020-08-10)
+
+
+### Features
+
+* **typescript-estree:** support TSv4 labelled tuple members ([#2378](https://github.com/typescript-eslint/typescript-eslint/issues/2378)) ([00d84ff](https://github.com/typescript-eslint/typescript-eslint/commit/00d84ffbcbe9d0ec98bdb2f2ce59959a27ce4dbe))
+
+
+
+
+
+# [3.8.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.7.1...v3.8.0) (2020-08-03)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+## [3.7.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.7.0...v3.7.1) (2020-07-27)
+
+
+### Bug Fixes
+
+* **typescript-estree:** correct AST regression introduced by TS4.0 upgrade ([#2316](https://github.com/typescript-eslint/typescript-eslint/issues/2316)) ([d7fefba](https://github.com/typescript-eslint/typescript-eslint/commit/d7fefba3741a526ff2b58dd713995c3ee5603962))
+
+
+
+
+
+# [3.7.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.6.1...v3.7.0) (2020-07-20)
+
+
+### Features
+
+* **typescript-estree:** support short-circuiting assignment operators ([#2307](https://github.com/typescript-eslint/typescript-eslint/issues/2307)) ([2c90d9f](https://github.com/typescript-eslint/typescript-eslint/commit/2c90d9fa3aa5ebd7db697dddb7762bca2dd0e06b))
+* **typescript-estree:** support type annotations on catch clauses ([#2306](https://github.com/typescript-eslint/typescript-eslint/issues/2306)) ([b5afe9c](https://github.com/typescript-eslint/typescript-eslint/commit/b5afe9c560b9f38c8dffc312a600db30944129c8))
+
+
+
+
+
+## [3.6.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.6.0...v3.6.1) (2020-07-13)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+# [3.6.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.5.0...v3.6.0) (2020-07-06)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+# [3.5.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.4.0...v3.5.0) (2020-06-29)
+
+
+### Bug Fixes
+
+* **typescript-estree:** forward compatibility for new compound assignment operators ([#2253](https://github.com/typescript-eslint/typescript-eslint/issues/2253)) ([ba41680](https://github.com/typescript-eslint/typescript-eslint/commit/ba41680f2a25b1aa4d05c2d4b132ac73a6faefbd))
+
+
+### Features
+
+* add package scope-manager ([#1939](https://github.com/typescript-eslint/typescript-eslint/issues/1939)) ([682eb7e](https://github.com/typescript-eslint/typescript-eslint/commit/682eb7e009c3f22a542882dfd3602196a60d2a1e))
+* split types into their own package ([#2229](https://github.com/typescript-eslint/typescript-eslint/issues/2229)) ([5f45918](https://github.com/typescript-eslint/typescript-eslint/commit/5f4591886f3438329fbf2229b03ac66174334a24))
+* split visitor keys into their own package ([#2230](https://github.com/typescript-eslint/typescript-eslint/issues/2230)) ([689dae3](https://github.com/typescript-eslint/typescript-eslint/commit/689dae37392d527c64ae83db2a4c3e6b7fecece7))
+
+
+
+
+
+# [3.4.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.3.0...v3.4.0) (2020-06-22)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+# [3.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.2.0...v3.3.0) (2020-06-15)
+
+
+### Bug Fixes
+
+* **typescript-estree:** handle TS4.0 breaking change in TupleType ([#2197](https://github.com/typescript-eslint/typescript-eslint/issues/2197)) ([5d68129](https://github.com/typescript-eslint/typescript-eslint/commit/5d6812914831a386997b453b4db1e3283e26005d))
+
+
+
+
+
+# [3.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.1.0...v3.2.0) (2020-06-08)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [prefer-optional-chain] handling first member expression ([#2156](https://github.com/typescript-eslint/typescript-eslint/issues/2156)) ([de18660](https://github.com/typescript-eslint/typescript-eslint/commit/de18660a8cf8f7033798646d8c5b0938d1accb12))
+
+
+
+
+
+# [3.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.2...v3.1.0) (2020-06-01)
+
+
+### Bug Fixes
+
+* **eslint-plugin:** [no-unused-expressions] ignore import expressions ([#2130](https://github.com/typescript-eslint/typescript-eslint/issues/2130)) ([e383691](https://github.com/typescript-eslint/typescript-eslint/commit/e3836910efdafd9edf04daed149c9e839c08047e))
+* **experimental-utils:** downlevel type declarations for versions older than 3.8 ([#2133](https://github.com/typescript-eslint/typescript-eslint/issues/2133)) ([7925823](https://github.com/typescript-eslint/typescript-eslint/commit/792582326a8065270b69a0ffcaad5a7b4b103ff3))
+
+
+
+
+
+## [3.0.2](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.1...v3.0.2) (2020-05-27)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+## [3.0.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.0...v3.0.1) (2020-05-25)
+
+
+### Bug Fixes
+
+* **typescript-estree:** handle `BigInt` with `_` numeric separator ([#2067](https://github.com/typescript-eslint/typescript-eslint/issues/2067)) ([66f1627](https://github.com/typescript-eslint/typescript-eslint/commit/66f1627b11a566d5b925a577e800f99d5c808be2))
+* **typescript-estree:** mark TS 3.8 and 3.9 as "supported" ([#2057](https://github.com/typescript-eslint/typescript-eslint/issues/2057)) ([5eedbff](https://github.com/typescript-eslint/typescript-eslint/commit/5eedbff01178ea33b98ab22e556df4c1a195f839)), closes [#1436](https://github.com/typescript-eslint/typescript-eslint/issues/1436) [#1436](https://github.com/typescript-eslint/typescript-eslint/issues/1436)
+
+
+
+
+
+# [3.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.34.0...v3.0.0) (2020-05-21)
+
+## [Please see the release notes for v3.0.0](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v3.0.0)
+
+### Bug Fixes
+
+* **typescript-estree:** remove now defunct `Import` node type ([f199cbd](https://github.com/typescript-eslint/typescript-eslint/commit/f199cbdbbd892b5ba03bfff66f463f3d9c92ee9b))
+* **typescript-estree:** use `TSEmptyBodyFunctionExpression` for body-less nodes ([#1289](https://github.com/typescript-eslint/typescript-eslint/issues/1289)) ([82e7163](https://github.com/typescript-eslint/typescript-eslint/commit/82e7163214b56ccde93ba97807b161669a50a60b))
+
+
+### Features
+
+* add index files to parser and typescript-estree ([3dfc46d](https://github.com/typescript-eslint/typescript-eslint/commit/3dfc46dccbbd28eed2d74c7b6cacddf1a0848598))
+* bump minimum required TS version ([#2004](https://github.com/typescript-eslint/typescript-eslint/issues/2004)) ([7ad4d7c](https://github.com/typescript-eslint/typescript-eslint/commit/7ad4d7c2db088b6f779b9d883a4acad13eee3775))
+* **eslint-plugin:** [ban-types] rework default options ([#848](https://github.com/typescript-eslint/typescript-eslint/issues/848)) ([8e31d5d](https://github.com/typescript-eslint/typescript-eslint/commit/8e31d5dbe9fe5227fdbefcecfd50ce5dd51360c3))
+* **typescript-estree:** align nodes with estree 2020 ([#1389](https://github.com/typescript-eslint/typescript-eslint/issues/1389)) ([aff5b62](https://github.com/typescript-eslint/typescript-eslint/commit/aff5b62044f9b93f2087a1d261e9be3f8d6fd54d))
+* **typescript-estree:** align optional fields ([#1429](https://github.com/typescript-eslint/typescript-eslint/issues/1429)) ([0e0010f](https://github.com/typescript-eslint/typescript-eslint/commit/0e0010f82952f9beeeb84136eea00cc5eecc9db6))
+* drop support for node v8 ([#1997](https://github.com/typescript-eslint/typescript-eslint/issues/1997)) ([b6c3b7b](https://github.com/typescript-eslint/typescript-eslint/commit/b6c3b7b84b8d199fa75a46432febd4a364a63217))
+* **typescript-estree:** always return parserServices ([#716](https://github.com/typescript-eslint/typescript-eslint/issues/716)) ([5b23443](https://github.com/typescript-eslint/typescript-eslint/commit/5b23443c48f3f62424db3e742243f3568080b946))
+* **typescript-estree:** handle 3.9's non-null assertion changes ([#2036](https://github.com/typescript-eslint/typescript-eslint/issues/2036)) ([06bec63](https://github.com/typescript-eslint/typescript-eslint/commit/06bec63c56536db070608ab136d2ad57083f0c6a))
+
+
+
+
+
+# [2.34.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.33.0...v2.34.0) (2020-05-18)
+
+
+### Bug Fixes
+
+* **typescript-estree:** fix handling of range/loc removal ([#2028](https://github.com/typescript-eslint/typescript-eslint/issues/2028)) ([ce344d9](https://github.com/typescript-eslint/typescript-eslint/commit/ce344d90e7c78b0c4b4b823494a3e78190f45c64))
+
+
+
+
+
+# [2.33.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.32.0...v2.33.0) (2020-05-12)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+# [2.32.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.31.0...v2.32.0) (2020-05-11)
+
+
+### Features
+
+* bump dependencies and align AST ([#2007](https://github.com/typescript-eslint/typescript-eslint/issues/2007)) ([18668b7](https://github.com/typescript-eslint/typescript-eslint/commit/18668b78fd7d1e5281af7fc26c76e0ca53297f69))
+
+
+
+
+
+# [2.31.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.30.0...v2.31.0) (2020-05-04)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+# [2.30.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.29.0...v2.30.0) (2020-04-27)
+
+**Note:** Version bump only for package @typescript-eslint/typescript-estree
+
+
+
+
+
+# [2.29.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.28.0...v2.29.0) (2020-04-20)
+
+
+### Features
+
+* **eslint-plugin:** [no-floating-promise] add option to ignore IIFEs ([#1799](https://github.com/typescript-eslint/typescript-eslint/issues/1799)) ([cea51bf](https://github.com/typescript-eslint/typescript-eslint/commit/cea51bf130d6d3c2935f5e2dcc468196f2ad9d00))
+
+
+
+
+
+# [2.28.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.27.0...v2.28.0) (2020-04-13)
+
+
+### Features
+
+* **eslint-plugin:** add rule `prefer-ts-expect-error` ([#1705](https://github.com/typescript-eslint/typescript-eslint/issues/1705)) ([7021f21](https://github.com/typescript-eslint/typescript-eslint/commit/7021f2151a25db2a8edf17e06cd6f21e90761ec8))
+* **eslint-plugin:** add rule no-unsafe-assignment ([#1694](https://github.com/typescript-eslint/typescript-eslint/issues/1694)) ([a49b860](https://github.com/typescript-eslint/typescript-eslint/commit/a49b860cbbb2c7d718b99f561e2fb6eaadf16f17))
+
+
+
+
+
+# [2.27.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.26.0...v2.27.0) (2020-04-06)
+
+
+### Bug Fixes
+
+* **typescript-estree:** add support for TS3.9 extra file extensions ([#1833](https://github.com/typescript-eslint/typescript-eslint/issues/1833)) ([1f0ff41](https://github.com/typescript-eslint/typescript-eslint/commit/1f0ff41aa1bc3b7c5330b2f5fe22e24bf578a6b2))
+
+
+### Features
+
+* **eslint-plugin:** sort members alphabetically ([#263](https://github.com/typescript-eslint/typescript-eslint/issues/263)) ([485e902](https://github.com/typescript-eslint/typescript-eslint/commit/485e90213a0f8baac0587f7d56925448883fc5bd))
+
+
+
+
+
+# [2.26.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.25.0...v2.26.0) (2020-03-30)
+
+
+### Features
+
+* **typescript-estree:** add option to ignore certain folders from glob resolution ([#1802](https://github.com/typescript-eslint/typescript-eslint/issues/1802)) ([1e29e69](https://github.com/typescript-eslint/typescript-eslint/commit/1e29e69b289d61107a7de67592beae331ba50222))
+
+
+
+
+
+# [2.25.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.24.0...v2.25.0) (2020-03-23)
+
+
+### Bug Fixes
+
+* **typescript-estree:** export * regression from 133f622f ([#1751](https://github.com/typescript-eslint/typescript-eslint/issues/1751)) ([09d8afc](https://github.com/typescript-eslint/typescript-eslint/commit/09d8afca684635b5ac604bc1794240484a70ce91))
+
+
+
+
+
+# [2.24.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.23.0...v2.24.0) (2020-03-16)
+
+
+### Bug Fixes
+
+* **typescript-estree:** unnecessary program updates by removing timeout methods ([#1693](https://github.com/typescript-eslint/typescript-eslint/issues/1693)) ([2ccd66b](https://github.com/typescript-eslint/typescript-eslint/commit/2ccd66b920816d54cc1a639059f60410df665900))
+
+
+### Features
+
+* **typescript-estree:** support 3.8 `export * as ns` ([#1698](https://github.com/typescript-eslint/typescript-eslint/issues/1698)) ([133f622](https://github.com/typescript-eslint/typescript-eslint/commit/133f622f38a286eac45288a9789d2ee529d5e582))
+
+
+
+
+
+# [2.23.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.22.0...v2.23.0) (2020-03-09)
+
+
+### Features
+
+* **typescript-estree:** support 3.8 import/export type ([#1697](https://github.com/typescript-eslint/typescript-eslint/issues/1697)) ([625d603](https://github.com/typescript-eslint/typescript-eslint/commit/625d603f94bf0521f834313bf31c734ce4948b7a))
+
+
+
+
+
 # [2.22.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.21.0...v2.22.0) (2020-03-02)
 
 **Note:** Version bump only for package @typescript-eslint/typescript-estree
diff --git a/node_modules/@typescript-eslint/typescript-estree/README.md b/node_modules/@typescript-eslint/typescript-estree/README.md
index 54706cf..3a434c7 100644
--- a/node_modules/@typescript-eslint/typescript-estree/README.md
+++ b/node_modules/@typescript-eslint/typescript-estree/README.md
@@ -3,14 +3,14 @@
 <p align="center">A parser that converts TypeScript source code into an <a href="https://github.com/estree/estree">ESTree</a>-compatible form</p>
 
 <p align="center">
-    <a href="https://dev.azure.com/typescript-eslint/TypeScript%20ESLint/_build/latest?definitionId=1&branchName=master"><img src="https://img.shields.io/azure-devops/build/typescript-eslint/TypeScript%20ESLint/1/master.svg?label=%F0%9F%9A%80%20Azure%20Pipelines&style=flat-square" alt="Azure Pipelines"/></a>
-    <a href="https://github.com/typescript-eslint/typescript-eslint/blob/master/LICENSE"><img src="https://img.shields.io/npm/l/typescript-estree.svg?style=flat-square" alt="GitHub license" /></a>
+    <img src="https://github.com/typescript-eslint/typescript-eslint/workflows/CI/badge.svg" alt="CI" />
     <a href="https://www.npmjs.com/package/@typescript-eslint/typescript-estree"><img src="https://img.shields.io/npm/v/@typescript-eslint/typescript-estree.svg?style=flat-square" alt="NPM Version" /></a>
     <a href="https://www.npmjs.com/package/@typescript-eslint/typescript-estree"><img src="https://img.shields.io/npm/dm/@typescript-eslint/typescript-estree.svg?style=flat-square" alt="NPM Downloads" /></a>
-    <a href="http://commitizen.github.io/cz-cli/"><img src="https://img.shields.io/badge/commitizen-friendly-brightgreen.svg?style=flat-square" alt="Commitizen friendly" /></a>
 </p>
 
-<br>
+## Getting Started
+
+**[You can find our Getting Started docs here](../../docs/getting-started/linting/README.md)**
 
 ## About
 
@@ -183,6 +183,15 @@
   project?: string | string[];
 
   /**
+   * If you provide a glob (or globs) to the project option, you can use this option to ignore certain folders from
+   * being matched by the globs.
+   * This accepts an array of globs to ignore.
+   *
+   * By default, this is set to ["/node_modules/"]
+   */
+  projectFolderIgnoreList?: string[];
+
+  /**
    * The absolute path to the root directory for all provided `project`s.
    */
   tsconfigRootDir?: string;
@@ -205,6 +214,7 @@
   extraFileExtensions: [],
   preserveNodeMaps: false, // or true, if you do not set this, but pass `project`
   project: undefined,
+  projectFolderIgnoreList: ['/node_modules/'],
   tsconfigRootDir: process.cwd(),
 };
 
@@ -238,9 +248,7 @@
 
 ## Supported TypeScript Version
 
-We will always endeavor to support the latest stable version of TypeScript.
-
-The version of TypeScript currently supported by this parser is `~3.2.1`. This is reflected in the `devDependency` requirement within the package.json file, and it is what the tests will be run against. We have an open `peerDependency` requirement in order to allow for experimentation on newer/beta versions of TypeScript.
+See the [Supported TypeScript Version](../../README.md#supported-typescript-version) section in the project root.
 
 If you use a non-supported version of TypeScript, the parser will log a warning to the console.
 
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts
index cecb91f..61bc2f1 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts
@@ -4,6 +4,6 @@
 import { TSESTree } from './ts-estree';
 export declare function astConverter(ast: SourceFile, extra: Extra, shouldPreserveNodeMaps: boolean): {
     estree: TSESTree.Program;
-    astMaps: ASTMaps | undefined;
+    astMaps: ASTMaps;
 };
 //# sourceMappingURL=ast-converter.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts.map
index 5ade0e4..df6276c 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"ast-converter.d.ts","sourceRoot":"","sources":["../src/ast-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAA2B,OAAO,EAAE,MAAM,WAAW,CAAC;AAG7D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,wBAAgB,YAAY,CAC1B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,KAAK,EACZ,sBAAsB,EAAE,OAAO,GAC9B;IAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,CAwD5D"}
\ No newline at end of file
+{"version":3,"file":"ast-converter.d.ts","sourceRoot":"","sources":["../src/ast-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAA2B,OAAO,EAAE,MAAM,WAAW,CAAC;AAG7D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,wBAAgB,YAAY,CAC1B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,KAAK,EACZ,sBAAsB,EAAE,OAAO,GAC9B;IAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA4DhD"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js b/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js
index b6d818c..6af960e 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js
@@ -1,5 +1,6 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.astConverter = void 0;
 const convert_1 = require("./convert");
 const convert_comments_1 = require("./convert-comments");
 const node_utils_1 = require("./node-utils");
@@ -27,13 +28,17 @@
     /**
      * Optionally remove range and loc if specified
      */
-    if (extra.range || extra.loc) {
+    if (!extra.range || !extra.loc) {
         simple_traverse_1.simpleTraverse(estree, {
             enter: node => {
                 if (!extra.range) {
+                    // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- TS 4.0 made this an error because the types aren't optional
+                    // @ts-expect-error
                     delete node.range;
                 }
                 if (!extra.loc) {
+                    // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- TS 4.0 made this an error because the types aren't optional
+                    // @ts-expect-error
                     delete node.loc;
                 }
             },
@@ -51,7 +56,7 @@
     if (extra.comment) {
         estree.comments = convert_comments_1.convertComments(ast, extra.code);
     }
-    const astMaps = shouldPreserveNodeMaps ? instance.getASTMaps() : undefined;
+    const astMaps = instance.getASTMaps();
     return { estree, astMaps };
 }
 exports.astConverter = astConverter;
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js.map
index c379ca4..6a5b215 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js.map
@@ -1 +1 @@
-{"version":3,"file":"ast-converter.js","sourceRoot":"","sources":["../src/ast-converter.ts"],"names":[],"mappings":";;AACA,uCAA6D;AAC7D,yDAAqD;AACrD,6CAA6C;AAG7C,uDAAmD;AAEnD,SAAgB,YAAY,CAC1B,GAAe,EACf,KAAY,EACZ,sBAA+B;IAE/B;;;OAGG;IACH,6BAA6B;IAC7B,8DAA8D;IAC9D,MAAM,gBAAgB,GAAI,GAAW,CAAC,gBAAgB,CAAC;IACvD,IAAI,gBAAgB,CAAC,MAAM,EAAE;QAC3B,MAAM,sBAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;KACzC;IAED;;OAEG;IACH,MAAM,QAAQ,GAAG,IAAI,mBAAS,CAAC,GAAG,EAAE;QAClC,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,IAAI,KAAK;QAC3D,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK;QAC7C,sBAAsB;KACvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IAEzC;;OAEG;IACH,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,EAAE;QAC5B,gCAAc,CAAC,MAAM,EAAE;YACrB,KAAK,EAAE,IAAI,CAAC,EAAE;gBACZ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;oBAChB,OAAO,IAAI,CAAC,KAAK,CAAC;iBACnB;gBACD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;oBACd,OAAO,IAAI,CAAC,GAAG,CAAC;iBACjB;YACH,CAAC;SACF,CAAC,CAAC;KACJ;IAED;;OAEG;IACH,IAAI,KAAK,CAAC,MAAM,EAAE;QAChB,MAAM,CAAC,MAAM,GAAG,0BAAa,CAAC,GAAG,CAAC,CAAC;KACpC;IAED;;OAEG;IACH,IAAI,KAAK,CAAC,OAAO,EAAE;QACjB,MAAM,CAAC,QAAQ,GAAG,kCAAe,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;KACpD;IAED,MAAM,OAAO,GAAG,sBAAsB,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AA5DD,oCA4DC"}
\ No newline at end of file
+{"version":3,"file":"ast-converter.js","sourceRoot":"","sources":["../src/ast-converter.ts"],"names":[],"mappings":";;;AACA,uCAA6D;AAC7D,yDAAqD;AACrD,6CAA6C;AAG7C,uDAAmD;AAEnD,SAAgB,YAAY,CAC1B,GAAe,EACf,KAAY,EACZ,sBAA+B;IAE/B;;;OAGG;IACH,6BAA6B;IAC7B,8DAA8D;IAC9D,MAAM,gBAAgB,GAAI,GAAW,CAAC,gBAAgB,CAAC;IACvD,IAAI,gBAAgB,CAAC,MAAM,EAAE;QAC3B,MAAM,sBAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;KACzC;IAED;;OAEG;IACH,MAAM,QAAQ,GAAG,IAAI,mBAAS,CAAC,GAAG,EAAE;QAClC,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,IAAI,KAAK;QAC3D,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK;QAC7C,sBAAsB;KACvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IAEzC;;OAEG;IACH,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;QAC9B,gCAAc,CAAC,MAAM,EAAE;YACrB,KAAK,EAAE,IAAI,CAAC,EAAE;gBACZ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;oBAChB,4HAA4H;oBAC5H,mBAAmB;oBACnB,OAAO,IAAI,CAAC,KAAK,CAAC;iBACnB;gBACD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;oBACd,4HAA4H;oBAC5H,mBAAmB;oBACnB,OAAO,IAAI,CAAC,GAAG,CAAC;iBACjB;YACH,CAAC;SACF,CAAC,CAAC;KACJ;IAED;;OAEG;IACH,IAAI,KAAK,CAAC,MAAM,EAAE;QAChB,MAAM,CAAC,MAAM,GAAG,0BAAa,CAAC,GAAG,CAAC,CAAC;KACpC;IAED;;OAEG;IACH,IAAI,KAAK,CAAC,OAAO,EAAE;QACjB,MAAM,CAAC,QAAQ,GAAG,kCAAe,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;KACpD;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;IAEtC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAhED,oCAgEC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js b/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js
index 56c0e58..de4a735 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js
@@ -1,12 +1,25 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.convertComments = void 0;
 const ts = __importStar(require("typescript"));
 const util_1 = require("tsutils/util/util");
 const node_utils_1 = require("./node-utils");
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js.map
index 0525030..6952a58 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js.map
@@ -1 +1 @@
-{"version":3,"file":"convert-comments.js","sourceRoot":"","sources":["../src/convert-comments.ts"],"names":[],"mappings":";;;;;;;;;AAAA,+CAAiC;AACjC,4CAAmD;AACnD,6CAAyC;AACzC,2CAAwD;AAExD;;;;;;GAMG;AACH,SAAgB,eAAe,CAC7B,GAAkB,EAClB,IAAY;IAEZ,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,qBAAc,CACZ,GAAG,EACH,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;QACb,MAAM,IAAI,GACR,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAuB;YACnD,CAAC,CAAC,2BAAe,CAAC,IAAI;YACtB,CAAC,CAAC,2BAAe,CAAC,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,sBAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAE/C,mDAAmD;QACnD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,OAAO,GACX,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;YACpD,CAAC,CAAC,sCAAsC;gBACtC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS;YACtB,CAAC,CAAC,4CAA4C;gBAC5C,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;YACtC,KAAK;YACL,GAAG;SACJ,CAAC,CAAC;IACL,CAAC,EACD,GAAG,CACJ,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAnCD,0CAmCC"}
\ No newline at end of file
+{"version":3,"file":"convert-comments.js","sourceRoot":"","sources":["../src/convert-comments.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,4CAAmD;AACnD,6CAAyC;AACzC,2CAAwD;AAExD;;;;;;GAMG;AACH,SAAgB,eAAe,CAC7B,GAAkB,EAClB,IAAY;IAEZ,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,qBAAc,CACZ,GAAG,EACH,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;QACb,MAAM,IAAI,GACR,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAuB;YACnD,CAAC,CAAC,2BAAe,CAAC,IAAI;YACtB,CAAC,CAAC,2BAAe,CAAC,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,sBAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAE/C,mDAAmD;QACnD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,OAAO,GACX,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;YACpD,CAAC,CAAC,sCAAsC;gBACtC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS;YACtB,CAAC,CAAC,4CAA4C;gBAC5C,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;YACtC,KAAK;YACL,GAAG;SACJ,CAAC,CAAC;IACL,CAAC,EACD,GAAG,CACJ,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAnCD,0CAmCC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts
index a56f7ce..c065e15 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts
@@ -1,7 +1,7 @@
 import * as ts from 'typescript';
 import { TSError } from './node-utils';
-import { TSESTree, TSNode } from './ts-estree';
 import { ParserWeakMap, ParserWeakMapESTreeToTSNode } from './parser-options';
+import { TSESTree, TSNode } from './ts-estree';
 interface ConverterOptions {
     errorOnUnknownASTType: boolean;
     useJSXTextNode: boolean;
@@ -75,6 +75,7 @@
      */
     private convertType;
     private createNode;
+    private convertBindingNameWithTypeAnnotation;
     /**
      * Converts a child into a type annotation. This creates an intermediary
      * TypeAnnotation node to match what Flow does.
@@ -109,6 +110,7 @@
      * @returns an array of converted ESTreeNode params
      */
     private convertParameters;
+    private convertChainExpression;
     /**
      * For nodes that are copied directly from the TypeScript AST into
      * ESTree mostly as-is. The only difference is the addition of a type
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts.map
index 1956b44..c1f6816 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAkBL,OAAO,EACR,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,QAAQ,EACR,MAAM,EAEP,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAI9E,UAAU,gBAAgB;IACxB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAMhD;AAED,MAAM,WAAW,OAAO;IACtB,qBAAqB,EAAE,2BAA2B,CAAC;IACnD,qBAAqB,EAAE,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAiB;IACvD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAiB;IAEvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;OAKG;gBACS,GAAG,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,gBAAgB;IAKzD,UAAU,IAAI,OAAO;IAOrB,cAAc,IAAI,QAAQ,CAAC,OAAO;IAIlC;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;IAkCjB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAmDlB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAItB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAIpB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAkBlB;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAqB7B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IA8B9B;;;;;OAKG;IACH,OAAO,CAAC,oCAAoC;IAa5C;;;;OAIG;IACH,OAAO,CAAC,kDAAkD;IAe1D;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAmElB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAmCzB;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAkD9B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAczB;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;CAkiEpB"}
\ No newline at end of file
+{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAkBL,OAAO,EAGR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAEL,QAAQ,EACR,MAAM,EAEP,MAAM,aAAa,CAAC;AAKrB,UAAU,gBAAgB;IACxB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAMhD;AAED,MAAM,WAAW,OAAO;IACtB,qBAAqB,EAAE,2BAA2B,CAAC;IACnD,qBAAqB,EAAE,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAiB;IACvD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAiB;IAEvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;OAKG;gBACS,GAAG,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,gBAAgB;IAKzD,UAAU,IAAI,OAAO;IAOrB,cAAc,IAAI,QAAQ,CAAC,OAAO;IAIlC;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;IAkCjB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAyDlB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAItB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAIpB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,oCAAoC;IAe5C;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAqB7B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IA8B9B;;;;;OAKG;IACH,OAAO,CAAC,oCAAoC;IAa5C;;;;OAIG;IACH,OAAO,CAAC,kDAAkD;IAe1D;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,sBAAsB;IA4C9B;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAmElB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA2CzB;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAkD9B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAczB;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;CA8iEpB"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/convert.js b/node_modules/@typescript-eslint/typescript-estree/dist/convert.js
index 2fcd472..e45592f 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/convert.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/convert.js
@@ -1,17 +1,31 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.Converter = exports.convertError = void 0;
 // There's lots of funny stuff due to the typing of ts.Node
 /* eslint-disable @typescript-eslint/no-explicit-any */
 const ts = __importStar(require("typescript"));
 const node_utils_1 = require("./node-utils");
 const ts_estree_1 = require("./ts-estree");
+const version_check_1 = require("./version-check");
 const SyntaxKind = ts.SyntaxKind;
 /**
  * Extends and formats a given error object
@@ -69,7 +83,7 @@
         if (allowPattern !== undefined) {
             this.allowPattern = allowPattern;
         }
-        const result = this.convertNode(node, ((parent !== null && parent !== void 0 ? parent : node.parent)));
+        const result = this.convertNode(node, (parent !== null && parent !== void 0 ? parent : node.parent));
         this.registerTSNodeInNodeMap(node, result);
         this.inTypeMode = typeMode;
         this.allowPattern = pattern;
@@ -101,14 +115,19 @@
                     type: ts_estree_1.AST_NODE_TYPES.ExportDefaultDeclaration,
                     declaration: result,
                     range: [exportKeyword.getStart(this.ast), result.range[1]],
+                    exportKind: 'value',
                 });
             }
             else {
+                const isType = result.type === ts_estree_1.AST_NODE_TYPES.TSInterfaceDeclaration ||
+                    result.type === ts_estree_1.AST_NODE_TYPES.TSTypeAliasDeclaration;
+                const isDeclare = result.declare === true;
                 return this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.ExportNamedDeclaration,
                     declaration: result,
                     specifiers: [],
                     source: null,
+                    exportKind: isType || isDeclare ? 'type' : 'value',
                     range: [exportKeyword.getStart(this.ast), result.range[1]],
                 });
             }
@@ -155,7 +174,9 @@
     createNode(node, data) {
         const result = data;
         if (!result.range) {
-            result.range = node_utils_1.getRange(node, this.ast);
+            result.range = node_utils_1.getRange(
+            // this is completely valid, but TS hates it
+            node, this.ast);
         }
         if (!result.loc) {
             result.loc = node_utils_1.getLocFor(result.range[0], result.range[1], this.ast);
@@ -165,6 +186,14 @@
         }
         return result;
     }
+    convertBindingNameWithTypeAnnotation(name, tsType, parent) {
+        const id = this.convertPattern(name);
+        if (tsType) {
+            id.typeAnnotation = this.convertTypeAnnotation(tsType, parent);
+            this.fixParentLocation(id, id.typeAnnotation.range);
+        }
+        return id;
+    }
     /**
      * Converts a child into a type annotation. This creates an intermediary
      * TypeAnnotation node to match what Flow does.
@@ -174,8 +203,8 @@
      */
     convertTypeAnnotation(child, parent) {
         // in FunctionType and ConstructorType typeAnnotation has 2 characters `=>` and in other places is just colon
-        const offset = parent.kind === SyntaxKind.FunctionType ||
-            parent.kind === SyntaxKind.ConstructorType
+        const offset = (parent === null || parent === void 0 ? void 0 : parent.kind) === SyntaxKind.FunctionType ||
+            (parent === null || parent === void 0 ? void 0 : parent.kind) === SyntaxKind.ConstructorType
             ? 2
             : 1;
         const annotationStartCol = child.getFullStart() - offset;
@@ -197,10 +226,9 @@
         let allowDirectives = node_utils_1.canContainDirective(parent);
         return (nodes
             .map(statement => {
-            var _a;
             const child = this.convertChild(statement);
             if (allowDirectives) {
-                if (((_a = child) === null || _a === void 0 ? void 0 : _a.expression) &&
+                if ((child === null || child === void 0 ? void 0 : child.expression) &&
                     ts.isExpressionStatement(statement) &&
                     ts.isStringLiteral(statement.expression)) {
                     const raw = child.expression.raw;
@@ -254,13 +282,46 @@
             return [];
         }
         return parameters.map(param => {
+            var _a;
             const convertedParam = this.convertChild(param);
-            if (param.decorators && param.decorators.length) {
+            if ((_a = param.decorators) === null || _a === void 0 ? void 0 : _a.length) {
                 convertedParam.decorators = param.decorators.map(el => this.convertChild(el));
             }
             return convertedParam;
         });
     }
+    convertChainExpression(node, tsNode) {
+        const { child, isOptional } = (() => {
+            if (node.type === ts_estree_1.AST_NODE_TYPES.MemberExpression) {
+                return { child: node.object, isOptional: node.optional };
+            }
+            if (node.type === ts_estree_1.AST_NODE_TYPES.CallExpression) {
+                return { child: node.callee, isOptional: node.optional };
+            }
+            return { child: node.expression, isOptional: false };
+        })();
+        const isChildUnwrappable = node_utils_1.isChildUnwrappableOptionalChain(tsNode, child);
+        if (!isChildUnwrappable && !isOptional) {
+            return node;
+        }
+        if (isChildUnwrappable && node_utils_1.isChainExpression(child)) {
+            // unwrap the chain expression child
+            const newChild = child.expression;
+            if (node.type === ts_estree_1.AST_NODE_TYPES.MemberExpression) {
+                node.object = newChild;
+            }
+            else if (node.type === ts_estree_1.AST_NODE_TYPES.CallExpression) {
+                node.callee = newChild;
+            }
+            else {
+                node.expression = newChild;
+            }
+        }
+        return this.createNode(tsNode, {
+            type: ts_estree_1.AST_NODE_TYPES.ChainExpression,
+            expression: node,
+        });
+    }
     /**
      * For nodes that are copied directly from the TypeScript AST into
      * ESTree mostly as-is. The only difference is the addition of a type
@@ -328,6 +389,11 @@
         let result;
         switch (node.kind) {
             case SyntaxKind.PropertyAccessExpression:
+                if (node.name.kind === SyntaxKind.PrivateIdentifier) {
+                    // This is one of the few times where TS explicitly errors, and doesn't even gracefully handle the syntax.
+                    // So we shouldn't ever get into this state to begin with.
+                    throw new Error('Non-private identifier expected.');
+                }
                 result = this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.JSXMemberExpression,
                     object: this.convertJSXTagName(node.expression, parent),
@@ -426,16 +492,13 @@
      * @returns the converted ESTree node
      */
     convertNode(node, parent) {
-        var _a, _b, _c, _d, _e, _f, _g, _h;
+        var _a, _b, _c, _d, _e, _f, _g, _h, _j;
         switch (node.kind) {
             case SyntaxKind.SourceFile: {
                 return this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.Program,
                     body: this.convertBodyExpressions(node.statements, node),
-                    // externalModuleIndicator is internal field in TSC
-                    sourceType: node.externalModuleIndicator
-                        ? 'module'
-                        : 'script',
+                    sourceType: node.externalModuleIndicator ? 'module' : 'script',
                     range: [node.getStart(this.ast), node.endOfFileToken.end],
                 });
             }
@@ -520,7 +583,7 @@
                 return this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.CatchClause,
                     param: node.variableDeclaration
-                        ? this.convertChild(node.variableDeclaration.name)
+                        ? this.convertBindingNameWithTypeAnnotation(node.variableDeclaration.name, node.variableDeclaration.type)
                         : null,
                     body: this.convertChild(node.block),
                 });
@@ -590,30 +653,18 @@
                 if (node.typeParameters) {
                     result.typeParameters = this.convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters);
                 }
-                /**
-                 * Semantically, decorators are not allowed on function declarations,
-                 * but the TypeScript compiler will parse them and produce a valid AST,
-                 * so we handle them here too.
-                 */
-                if (node.decorators) {
-                    result.decorators = node.decorators.map(el => this.convertChild(el));
-                }
                 // check for exports
                 return this.fixExports(node, result);
             }
             case SyntaxKind.VariableDeclaration: {
                 const result = this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.VariableDeclarator,
-                    id: this.convertPattern(node.name),
+                    id: this.convertBindingNameWithTypeAnnotation(node.name, node.type, node),
                     init: this.convertChild(node.initializer),
                 });
                 if (node.exclamationToken) {
                     result.definite = true;
                 }
-                if (node.type) {
-                    result.id.typeAnnotation = this.convertTypeAnnotation(node.type, node);
-                    this.fixParentLocation(result.id, result.id.typeAnnotation.range);
-                }
                 return result;
             }
             case SyntaxKind.VariableStatement: {
@@ -763,7 +814,9 @@
             case SyntaxKind.SetAccessor:
             case SyntaxKind.MethodDeclaration: {
                 const method = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.FunctionExpression,
+                    type: !node.body
+                        ? ts_estree_1.AST_NODE_TYPES.TSEmptyBodyFunctionExpression
+                        : ts_estree_1.AST_NODE_TYPES.FunctionExpression,
                     id: null,
                     generator: !!node.asteriskToken,
                     expression: false,
@@ -821,9 +874,8 @@
                         result.accessibility = accessibility;
                     }
                 }
-                if (result.key.type === ts_estree_1.AST_NODE_TYPES.Identifier &&
-                    node.questionToken) {
-                    result.key.optional = true;
+                if (node.questionToken) {
+                    result.optional = true;
                 }
                 if (node.kind === SyntaxKind.GetAccessor) {
                     result.kind = 'get';
@@ -845,7 +897,9 @@
                 const constructorToken = (lastModifier && node_utils_1.findNextToken(lastModifier, node, this.ast)) ||
                     node.getFirstToken();
                 const constructor = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.FunctionExpression,
+                    type: !node.body
+                        ? ts_estree_1.AST_NODE_TYPES.TSEmptyBodyFunctionExpression
+                        : ts_estree_1.AST_NODE_TYPES.FunctionExpression,
                     id: null,
                     params: this.convertParameters(node.parameters),
                     generator: false,
@@ -947,13 +1001,13 @@
                     if (node.dotDotDotToken) {
                         result = this.createNode(node, {
                             type: ts_estree_1.AST_NODE_TYPES.RestElement,
-                            argument: this.convertChild((_a = node.propertyName, (_a !== null && _a !== void 0 ? _a : node.name))),
+                            argument: this.convertChild((_a = node.propertyName) !== null && _a !== void 0 ? _a : node.name),
                         });
                     }
                     else {
                         result = this.createNode(node, {
                             type: ts_estree_1.AST_NODE_TYPES.Property,
-                            key: this.convertChild((_b = node.propertyName, (_b !== null && _b !== void 0 ? _b : node.name))),
+                            key: this.convertChild((_b = node.propertyName) !== null && _b !== void 0 ? _b : node.name),
                             value: this.convertChild(node.name),
                             computed: Boolean(node.propertyName &&
                                 node.propertyName.kind === SyntaxKind.ComputedPropertyName),
@@ -1109,7 +1163,7 @@
                 if (node.modifiers) {
                     return this.createNode(node, {
                         type: ts_estree_1.AST_NODE_TYPES.TSParameterProperty,
-                        accessibility: (_c = node_utils_1.getTSNodeAccessibility(node), (_c !== null && _c !== void 0 ? _c : undefined)),
+                        accessibility: (_c = node_utils_1.getTSNodeAccessibility(node)) !== null && _c !== void 0 ? _c : undefined,
                         readonly: node_utils_1.hasModifier(SyntaxKind.ReadonlyKeyword, node) || undefined,
                         static: node_utils_1.hasModifier(SyntaxKind.StaticKeyword, node) || undefined,
                         export: node_utils_1.hasModifier(SyntaxKind.ExportKeyword, node) || undefined,
@@ -1121,7 +1175,7 @@
             // Classes
             case SyntaxKind.ClassDeclaration:
             case SyntaxKind.ClassExpression: {
-                const heritageClauses = (_d = node.heritageClauses, (_d !== null && _d !== void 0 ? _d : []));
+                const heritageClauses = (_d = node.heritageClauses) !== null && _d !== void 0 ? _d : [];
                 const classNodeType = node.kind === SyntaxKind.ClassDeclaration
                     ? ts_estree_1.AST_NODE_TYPES.ClassDeclaration
                     : ts_estree_1.AST_NODE_TYPES.ClassExpression;
@@ -1135,14 +1189,14 @@
                         body: [],
                         range: [node.members.pos - 1, node.end],
                     }),
-                    superClass: ((_e = superClass) === null || _e === void 0 ? void 0 : _e.types[0]) ? this.convertChild(superClass.types[0].expression)
+                    superClass: (superClass === null || superClass === void 0 ? void 0 : superClass.types[0]) ? this.convertChild(superClass.types[0].expression)
                         : null,
                 });
                 if (superClass) {
                     if (superClass.types.length > 1) {
                         throw node_utils_1.createError(this.ast, superClass.types[1].pos, 'Classes can only extend a single class.');
                     }
-                    if (superClass.types[0] && superClass.types[0].typeArguments) {
+                    if ((_e = superClass.types[0]) === null || _e === void 0 ? void 0 : _e.typeArguments) {
                         result.superTypeParameters = this.convertTypeArgumentsToTypeParameters(superClass.types[0].typeArguments, superClass.types[0]);
                     }
                 }
@@ -1182,8 +1236,12 @@
                     type: ts_estree_1.AST_NODE_TYPES.ImportDeclaration,
                     source: this.convertChild(node.moduleSpecifier),
                     specifiers: [],
+                    importKind: 'value',
                 });
                 if (node.importClause) {
+                    if (node.importClause.isTypeOnly) {
+                        result.importKind = 'type';
+                    }
                     if (node.importClause.name) {
                         result.specifiers.push(this.convertChild(node.importClause));
                     }
@@ -1209,20 +1267,23 @@
                 return this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.ImportSpecifier,
                     local: this.convertChild(node.name),
-                    imported: this.convertChild((_f = node.propertyName, (_f !== null && _f !== void 0 ? _f : node.name))),
+                    imported: this.convertChild((_f = node.propertyName) !== null && _f !== void 0 ? _f : node.name),
                 });
-            case SyntaxKind.ImportClause:
+            case SyntaxKind.ImportClause: {
+                const local = this.convertChild(node.name);
                 return this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.ImportDefaultSpecifier,
-                    local: this.convertChild(node.name),
-                    range: [node.getStart(this.ast), node.name.end],
+                    local,
+                    range: local.range,
                 });
+            }
             case SyntaxKind.ExportDeclaration:
-                if (node.exportClause) {
+                if (((_g = node.exportClause) === null || _g === void 0 ? void 0 : _g.kind) === SyntaxKind.NamedExports) {
                     return this.createNode(node, {
                         type: ts_estree_1.AST_NODE_TYPES.ExportNamedDeclaration,
                         source: this.convertChild(node.moduleSpecifier),
                         specifiers: node.exportClause.elements.map(el => this.convertChild(el)),
+                        exportKind: node.isTypeOnly ? 'type' : 'value',
                         declaration: null,
                     });
                 }
@@ -1230,12 +1291,22 @@
                     return this.createNode(node, {
                         type: ts_estree_1.AST_NODE_TYPES.ExportAllDeclaration,
                         source: this.convertChild(node.moduleSpecifier),
+                        exportKind: node.isTypeOnly ? 'type' : 'value',
+                        exported: 
+                        // note - for compat with 3.7.x, where node.exportClause is always undefined and
+                        //        SyntaxKind.NamespaceExport does not exist yet (i.e. is undefined), this
+                        //        cannot be shortened to an optional chain, or else you end up with
+                        //        undefined === undefined, and the true path will hard error at runtime
+                        node.exportClause &&
+                            node.exportClause.kind === SyntaxKind.NamespaceExport
+                            ? this.convertChild(node.exportClause.name)
+                            : null,
                     });
                 }
             case SyntaxKind.ExportSpecifier:
                 return this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.ExportSpecifier,
-                    local: this.convertChild((_g = node.propertyName, (_g !== null && _g !== void 0 ? _g : node.name))),
+                    local: this.convertChild((_h = node.propertyName) !== null && _h !== void 0 ? _h : node.name),
                     exported: this.convertChild(node.name),
                 });
             case SyntaxKind.ExportAssignment:
@@ -1249,6 +1320,7 @@
                     return this.createNode(node, {
                         type: ts_estree_1.AST_NODE_TYPES.ExportDefaultDeclaration,
                         declaration: this.convertChild(node.expression),
+                        exportKind: 'value',
                     });
                 }
             // Unary Operations
@@ -1343,90 +1415,50 @@
                 const object = this.convertChild(node.expression);
                 const property = this.convertChild(node.name);
                 const computed = false;
-                const isLocallyOptional = node.questionDotToken !== undefined;
-                // the optional expression should propagate up the member expression tree
-                const isChildOptional = (object.type === ts_estree_1.AST_NODE_TYPES.OptionalMemberExpression ||
-                    object.type === ts_estree_1.AST_NODE_TYPES.OptionalCallExpression) &&
-                    // (x?.y).z is semantically different, and as such .z is no longer optional
-                    node.expression.kind !== ts.SyntaxKind.ParenthesizedExpression;
-                if (isLocallyOptional || isChildOptional) {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.OptionalMemberExpression,
-                        object,
-                        property,
-                        computed,
-                        optional: isLocallyOptional,
-                    });
-                }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.MemberExpression,
-                        object,
-                        property,
-                        computed,
-                        optional: false,
-                    });
-                }
+                const result = this.createNode(node, {
+                    type: ts_estree_1.AST_NODE_TYPES.MemberExpression,
+                    object,
+                    property,
+                    computed,
+                    optional: node.questionDotToken !== undefined,
+                });
+                return this.convertChainExpression(result, node);
             }
             case SyntaxKind.ElementAccessExpression: {
                 const object = this.convertChild(node.expression);
                 const property = this.convertChild(node.argumentExpression);
                 const computed = true;
-                const isLocallyOptional = node.questionDotToken !== undefined;
-                // the optional expression should propagate up the member expression tree
-                const isChildOptional = (object.type === ts_estree_1.AST_NODE_TYPES.OptionalMemberExpression ||
-                    object.type === ts_estree_1.AST_NODE_TYPES.OptionalCallExpression) &&
-                    // (x?.y).z is semantically different, and as such .z is no longer optional
-                    node.expression.kind !== ts.SyntaxKind.ParenthesizedExpression;
-                if (isLocallyOptional || isChildOptional) {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.OptionalMemberExpression,
-                        object,
-                        property,
-                        computed,
-                        optional: isLocallyOptional,
-                    });
-                }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.MemberExpression,
-                        object,
-                        property,
-                        computed,
-                        optional: false,
-                    });
-                }
+                const result = this.createNode(node, {
+                    type: ts_estree_1.AST_NODE_TYPES.MemberExpression,
+                    object,
+                    property,
+                    computed,
+                    optional: node.questionDotToken !== undefined,
+                });
+                return this.convertChainExpression(result, node);
             }
             case SyntaxKind.CallExpression: {
+                if (node.expression.kind === SyntaxKind.ImportKeyword) {
+                    if (node.arguments.length !== 1) {
+                        throw node_utils_1.createError(this.ast, node.arguments.pos, 'Dynamic import must have one specifier as an argument.');
+                    }
+                    return this.createNode(node, {
+                        type: ts_estree_1.AST_NODE_TYPES.ImportExpression,
+                        source: this.convertChild(node.arguments[0]),
+                    });
+                }
                 const callee = this.convertChild(node.expression);
                 const args = node.arguments.map(el => this.convertChild(el));
-                let result;
-                const isLocallyOptional = node.questionDotToken !== undefined;
-                // the optional expression should propagate up the member expression tree
-                const isChildOptional = (callee.type === ts_estree_1.AST_NODE_TYPES.OptionalMemberExpression ||
-                    callee.type === ts_estree_1.AST_NODE_TYPES.OptionalCallExpression) &&
-                    // (x?.y).z() is semantically different, and as such .z() is no longer optional
-                    node.expression.kind !== ts.SyntaxKind.ParenthesizedExpression;
-                if (isLocallyOptional || isChildOptional) {
-                    result = this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.OptionalCallExpression,
-                        callee,
-                        arguments: args,
-                        optional: isLocallyOptional,
-                    });
-                }
-                else {
-                    result = this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.CallExpression,
-                        callee,
-                        arguments: args,
-                        optional: false,
-                    });
-                }
+                const result = this.createNode(node, {
+                    type: ts_estree_1.AST_NODE_TYPES.CallExpression,
+                    callee,
+                    arguments: args,
+                    optional: node.questionDotToken !== undefined,
+                });
                 if (node.typeArguments) {
                     result.typeParameters = this.convertTypeArgumentsToTypeParameters(node.typeArguments, node);
                 }
-                return result;
+                return this.convertChainExpression(result, node);
             }
             case SyntaxKind.NewExpression: {
                 // NOTE - NewExpression cannot have an optional chain in it
@@ -1491,14 +1523,22 @@
                 });
             }
             case SyntaxKind.BigIntLiteral: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.BigIntLiteral,
-                    raw: '',
-                    value: '',
+                const range = node_utils_1.getRange(node, this.ast);
+                const rawValue = this.ast.text.slice(range[0], range[1]);
+                const bigint = rawValue
+                    // remove suffix `n`
+                    .slice(0, -1)
+                    // `BigInt` doesn't accept numeric separator
+                    // and `bigint` property should not include numeric separator
+                    .replace(/_/g, '');
+                const value = typeof BigInt !== 'undefined' ? BigInt(bigint) : null;
+                return this.createNode(node, {
+                    type: ts_estree_1.AST_NODE_TYPES.Literal,
+                    raw: rawValue,
+                    value: value,
+                    bigint: value === null ? bigint : String(value),
+                    range,
                 });
-                result.raw = this.ast.text.slice(result.range[0], result.range[1]);
-                result.value = result.raw.slice(0, -1); // remove suffix `n`
-                return result;
             }
             case SyntaxKind.RegularExpressionLiteral: {
                 const pattern = node.text.slice(1, node.text.lastIndexOf('/'));
@@ -1533,23 +1573,18 @@
                     raw: 'false',
                 });
             case SyntaxKind.NullKeyword: {
-                if (this.inTypeMode) {
+                if (!version_check_1.typescriptVersionIsAtLeast['4.0'] && this.inTypeMode) {
+                    // 4.0 started nesting null types inside a LiteralType node, but we still need to support pre-4.0
                     return this.createNode(node, {
                         type: ts_estree_1.AST_NODE_TYPES.TSNullKeyword,
                     });
                 }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.Literal,
-                        value: null,
-                        raw: 'null',
-                    });
-                }
-            }
-            case SyntaxKind.ImportKeyword:
                 return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Import,
+                    type: ts_estree_1.AST_NODE_TYPES.Literal,
+                    value: null,
+                    raw: 'null',
                 });
+            }
             case SyntaxKind.EmptyStatement:
                 return this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.EmptyStatement,
@@ -1724,10 +1759,11 @@
                 });
             }
             case SyntaxKind.NonNullExpression: {
-                return this.createNode(node, {
+                const nnExpr = this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.TSNonNullExpression,
                     expression: this.convertChild(node.expression),
                 });
+                return this.convertChainExpression(nnExpr, node);
             }
             case SyntaxKind.TypeLiteral: {
                 return this.createNode(node, {
@@ -1926,7 +1962,7 @@
                 return result;
             }
             case SyntaxKind.InterfaceDeclaration: {
-                const interfaceHeritageClauses = (_h = node.heritageClauses, (_h !== null && _h !== void 0 ? _h : []));
+                const interfaceHeritageClauses = (_j = node.heritageClauses) !== null && _j !== void 0 ? _j : [];
                 const result = this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.TSInterfaceDeclaration,
                     body: this.createNode(node, {
@@ -1961,14 +1997,6 @@
                         result.implements = interfaceImplements;
                     }
                 }
-                /**
-                 * Semantically, decorators are not allowed on interface declarations,
-                 * but the TypeScript compiler will parse them and produce a valid AST,
-                 * so we handle them here too.
-                 */
-                if (node.decorators) {
-                    result.decorators = node.decorators.map(el => this.convertChild(el));
-                }
                 if (node_utils_1.hasModifier(SyntaxKind.AbstractKeyword, node)) {
                     result.abstract = true;
                 }
@@ -2014,14 +2042,6 @@
                 });
                 // apply modifiers first...
                 this.applyModifiersToResult(result, node.modifiers);
-                /**
-                 * Semantically, decorators are not allowed on enum declarations,
-                 * but the TypeScript compiler will parse them and produce a valid AST,
-                 * so we handle them here too.
-                 */
-                if (node.decorators) {
-                    result.decorators = node.decorators.map(el => this.convertChild(el));
-                }
                 // ...then check for exports
                 return this.fixExports(node, result);
             }
@@ -2055,24 +2075,12 @@
                 return this.fixExports(node, result);
             }
             // TypeScript specific types
-            case SyntaxKind.OptionalType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSOptionalType,
-                    typeAnnotation: this.convertType(node.type),
-                });
-            }
             case SyntaxKind.ParenthesizedType: {
                 return this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.TSParenthesizedType,
                     typeAnnotation: this.convertType(node.type),
                 });
             }
-            case SyntaxKind.TupleType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSTupleType,
-                    elementTypes: node.elementTypes.map(el => this.convertType(el)),
-                });
-            }
             case SyntaxKind.UnionType: {
                 return this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.TSUnionType,
@@ -2085,12 +2093,6 @@
                     types: node.types.map(el => this.convertType(el)),
                 });
             }
-            case SyntaxKind.RestType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSRestType,
-                    typeAnnotation: this.convertType(node.type),
-                });
-            }
             case SyntaxKind.AsExpression: {
                 return this.createNode(node, {
                     type: ts_estree_1.AST_NODE_TYPES.TSAsExpression,
@@ -2105,10 +2107,20 @@
                 });
             }
             case SyntaxKind.LiteralType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSLiteralType,
-                    literal: this.convertType(node.literal),
-                });
+                if (version_check_1.typescriptVersionIsAtLeast['4.0'] &&
+                    node.literal.kind === SyntaxKind.NullKeyword) {
+                    // 4.0 started nesting null types inside a LiteralType node
+                    // but our AST is designed around the old way of null being a keyword
+                    return this.createNode(node.literal, {
+                        type: ts_estree_1.AST_NODE_TYPES.TSNullKeyword,
+                    });
+                }
+                else {
+                    return this.createNode(node, {
+                        type: ts_estree_1.AST_NODE_TYPES.TSLiteralType,
+                        literal: this.convertType(node.literal),
+                    });
+                }
             }
             case SyntaxKind.TypeAssertionExpression: {
                 return this.createNode(node, {
@@ -2142,6 +2154,49 @@
                     type: ts_estree_1.AST_NODE_TYPES.TSAbstractKeyword,
                 });
             }
+            // Tuple
+            case SyntaxKind.TupleType: {
+                // In TS 4.0, the `elementTypes` property was changed to `elements`.
+                // To support both at compile time, we cast to access the newer version
+                // if the former does not exist.
+                const elementTypes = 'elementTypes' in node
+                    ? node.elementTypes.map((el) => this.convertType(el))
+                    : node.elements.map((el) => this.convertType(el));
+                return this.createNode(node, {
+                    type: ts_estree_1.AST_NODE_TYPES.TSTupleType,
+                    elementTypes,
+                });
+            }
+            case SyntaxKind.NamedTupleMember: {
+                const member = this.createNode(node, {
+                    type: ts_estree_1.AST_NODE_TYPES.TSNamedTupleMember,
+                    elementType: this.convertType(node.type, node),
+                    label: this.convertChild(node.name, node),
+                    optional: node.questionToken != null,
+                });
+                if (node.dotDotDotToken) {
+                    // adjust the start to account for the "..."
+                    member.range[0] = member.label.range[0];
+                    member.loc.start = member.label.loc.start;
+                    return this.createNode(node, {
+                        type: ts_estree_1.AST_NODE_TYPES.TSRestType,
+                        typeAnnotation: member,
+                    });
+                }
+                return member;
+            }
+            case SyntaxKind.OptionalType: {
+                return this.createNode(node, {
+                    type: ts_estree_1.AST_NODE_TYPES.TSOptionalType,
+                    typeAnnotation: this.convertType(node.type),
+                });
+            }
+            case SyntaxKind.RestType: {
+                return this.createNode(node, {
+                    type: ts_estree_1.AST_NODE_TYPES.TSRestType,
+                    typeAnnotation: this.convertType(node.type),
+                });
+            }
             default:
                 return this.deeplyCopy(node);
         }
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/convert.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/convert.js.map
index ba6630d..da4e64d 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/convert.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/convert.js.map
@@ -1 +1 @@
-{"version":3,"file":"convert.js","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"convert.js","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts
index 562517c..85764ac 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts
@@ -7,6 +7,7 @@
 }
 interface WatchCompilerHostOfConfigFile<T extends ts.BuilderProgram> extends ts.WatchCompilerHostOfConfigFile<T> {
     onCachedDirectoryStructureHostCreate(host: CachedDirectoryStructureHost): void;
+    extraFileExtensions?: readonly ts.FileExtensionInfo[];
 }
 export { WatchCompilerHostOfConfigFile };
 //# sourceMappingURL=WatchCompilerHostOfConfigFile.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts.map
index 6bb6a9a..408e42e 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"WatchCompilerHostOfConfigFile.d.ts","sourceRoot":"","sources":["../../src/create-program/WatchCompilerHostOfConfigFile.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAGjC,UAAU,sBAAsB;IAC9B,aAAa,CAAC,CACZ,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,EAAE,CAAC;CACb;AAGD,UAAU,4BAA6B,SAAQ,sBAAsB;IACnE,aAAa,CACX,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,EAAE,CAAC;CACb;AAGD,UAAU,6BAA6B,CAAC,CAAC,SAAS,EAAE,CAAC,cAAc,CACjE,SAAQ,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC3C,oCAAoC,CAClC,IAAI,EAAE,4BAA4B,GACjC,IAAI,CAAC;CACT;AAED,OAAO,EAAE,6BAA6B,EAAE,CAAC"}
\ No newline at end of file
+{"version":3,"file":"WatchCompilerHostOfConfigFile.d.ts","sourceRoot":"","sources":["../../src/create-program/WatchCompilerHostOfConfigFile.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAGjC,UAAU,sBAAsB;IAC9B,aAAa,CAAC,CACZ,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,EAAE,CAAC;CACb;AAGD,UAAU,4BAA6B,SAAQ,sBAAsB;IACnE,aAAa,CACX,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,EAAE,CAAC;CACb;AAGD,UAAU,6BAA6B,CAAC,CAAC,SAAS,EAAE,CAAC,cAAc,CACjE,SAAQ,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC3C,oCAAoC,CAClC,IAAI,EAAE,4BAA4B,GACjC,IAAI,CAAC;IACR,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAC;CACvD;AAED,OAAO,EAAE,6BAA6B,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js
index c3fd55f..9f60bc0 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js
@@ -1,15 +1,28 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.createDefaultProgram = void 0;
 const debug_1 = __importDefault(require("debug"));
 const path_1 = __importDefault(require("path"));
 const ts = __importStar(require("typescript"));
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js.map
index 820b18a..7ae63e4 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js.map
@@ -1 +1 @@
-{"version":3,"file":"createDefaultProgram.js","sourceRoot":"","sources":["../../src/create-program/createDefaultProgram.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kDAA0B;AAC1B,gDAAwB;AACxB,+CAAiC;AAEjC,qCAIkB;AAElB,MAAM,GAAG,GAAG,eAAK,CAAC,0DAA0D,CAAC,CAAC;AAE9E;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,IAAY,EACZ,KAAY;IAEZ,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,QAAQ,IAAI,cAAc,CAAC,CAAC;IAEzE,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QAClD,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,YAAY,GAAG,wBAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,EAAE,CAAC,gCAAgC,CACrD,YAAY,EACZ,8CAAqC,CAAC,KAAK,CAAC,kCACvC,EAAE,CAAC,GAAG,KAAE,mCAAmC,EAAE,GAAG,EAAE,GAAE,CAAC,IAC3D,CAAC;IAEF,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,YAAY,GAAG,EAAE,CAAC,kBAAkB,CACxC,WAAW,CAAC,OAAO;IACnB,oBAAoB,CAAC,IAAI,CAC1B,CAAC;IACF,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC;IAC1C,YAAY,CAAC,QAAQ,GAAG,CAAC,QAAgB,EAAsB,EAAE,CAC/D,cAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,cAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;QACzD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE5B,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAC9B,CAAC,KAAK,CAAC,QAAQ,CAAC,EAChB,WAAW,CAAC,OAAO,EACnB,YAAY,CACb,CAAC;IACF,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAElD,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC;AAEQ,oDAAoB"}
\ No newline at end of file
+{"version":3,"file":"createDefaultProgram.js","sourceRoot":"","sources":["../../src/create-program/createDefaultProgram.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,gDAAwB;AACxB,+CAAiC;AAEjC,qCAIkB;AAElB,MAAM,GAAG,GAAG,eAAK,CAAC,0DAA0D,CAAC,CAAC;AAE9E;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,IAAY,EACZ,KAAY;IAEZ,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,QAAQ,IAAI,cAAc,CAAC,CAAC;IAEzE,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QAClD,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,YAAY,GAAG,wBAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,EAAE,CAAC,gCAAgC,CACrD,YAAY,EACZ,8CAAqC,CAAC,KAAK,CAAC,kCACvC,EAAE,CAAC,GAAG,KAAE,mCAAmC,EAAE,GAAG,EAAE,GAAE,CAAC,IAC3D,CAAC;IAEF,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,YAAY,GAAG,EAAE,CAAC,kBAAkB,CACxC,WAAW,CAAC,OAAO;IACnB,oBAAoB,CAAC,IAAI,CAC1B,CAAC;IACF,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC;IAC1C,YAAY,CAAC,QAAQ,GAAG,CAAC,QAAgB,EAAsB,EAAE,CAC/D,cAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,cAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;QACzD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE5B,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAC9B,CAAC,KAAK,CAAC,QAAQ,CAAC,EAChB,WAAW,CAAC,OAAO,EACnB,YAAY,CACb,CAAC;IACF,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAElD,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC;AAEQ,oDAAoB"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js
index e0f9447..88d4ba3 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js
@@ -1,15 +1,28 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.createIsolatedProgram = void 0;
 const debug_1 = __importDefault(require("debug"));
 const ts = __importStar(require("typescript"));
 const shared_1 = require("./shared");
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js.map
index e2ca441..75a6145 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js.map
@@ -1 +1 @@
-{"version":3,"file":"createIsolatedProgram.js","sourceRoot":"","sources":["../../src/create-program/createIsolatedProgram.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kDAA0B;AAC1B,+CAAiC;AAEjC,qCAIkB;AAElB,MAAM,GAAG,GAAG,eAAK,CAAC,2DAA2D,CAAC,CAAC;AAE/E;;;GAGG;AACH,SAAS,qBAAqB,CAAC,IAAY,EAAE,KAAY;IACvD,GAAG,CACD,6CAA6C,EAC7C,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EACxB,KAAK,CAAC,QAAQ,CACf,CAAC;IAEF,MAAM,YAAY,GAAoB;QACpC,UAAU;YACR,OAAO,IAAI,CAAC;QACd,CAAC;QACD,oBAAoB;YAClB,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;QACD,mBAAmB;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,cAAc;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,qBAAqB;YACnB,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,6BAA6B;QAC7B,UAAU;YACR,OAAO,IAAI,CAAC;QACd,CAAC;QACD,aAAa,CAAC,QAAgB;YAC5B,OAAO,EAAE,CAAC,gBAAgB,CACxB,QAAQ,EACR,IAAI,EACJ,EAAE,CAAC,YAAY,CAAC,MAAM;YACtB,oBAAoB,CAAC,IAAI,EACzB,sBAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAC/B,CAAC;QACJ,CAAC;QACD,QAAQ;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,yBAAyB;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,SAAS;YACP,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;IAEF,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAC9B,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAEd,SAAS,EAAE,IAAI,EACf,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAC9B,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAC7C,8CAAqC,CAAC,KAAK,CAAC,GAEjD,YAAY,CACb,CAAC;IAEF,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,EAAE;QACR,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;KACH;IAED,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC;AAEQ,sDAAqB"}
\ No newline at end of file
+{"version":3,"file":"createIsolatedProgram.js","sourceRoot":"","sources":["../../src/create-program/createIsolatedProgram.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,+CAAiC;AAEjC,qCAIkB;AAElB,MAAM,GAAG,GAAG,eAAK,CAAC,2DAA2D,CAAC,CAAC;AAE/E;;;GAGG;AACH,SAAS,qBAAqB,CAAC,IAAY,EAAE,KAAY;IACvD,GAAG,CACD,6CAA6C,EAC7C,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EACxB,KAAK,CAAC,QAAQ,CACf,CAAC;IAEF,MAAM,YAAY,GAAoB;QACpC,UAAU;YACR,OAAO,IAAI,CAAC;QACd,CAAC;QACD,oBAAoB;YAClB,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;QACD,mBAAmB;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,cAAc;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,qBAAqB;YACnB,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,6BAA6B;QAC7B,UAAU;YACR,OAAO,IAAI,CAAC;QACd,CAAC;QACD,aAAa,CAAC,QAAgB;YAC5B,OAAO,EAAE,CAAC,gBAAgB,CACxB,QAAQ,EACR,IAAI,EACJ,EAAE,CAAC,YAAY,CAAC,MAAM;YACtB,oBAAoB,CAAC,IAAI,EACzB,sBAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAC/B,CAAC;QACJ,CAAC;QACD,QAAQ;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,yBAAyB;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,SAAS;YACP,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;IAEF,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAC9B,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAEd,SAAS,EAAE,IAAI,EACf,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAC9B,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAC7C,8CAAqC,CAAC,KAAK,CAAC,GAEjD,YAAY,CACb,CAAC;IAEF,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,EAAE;QACR,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;KACH;IAED,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC;AAEQ,sDAAqB"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.d.ts.map
index 254a67f..1838090 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"createProjectProgram.d.ts","sourceRoot":"","sources":["../../src/create-program/createProjectProgram.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAazC;;;;;GAKG;AACH,iBAAS,oBAAoB,CAC3B,IAAI,EAAE,MAAM,EACZ,oBAAoB,EAAE,OAAO,EAC7B,KAAK,EAAE,KAAK,GACX,aAAa,GAAG,SAAS,CA0E3B;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
\ No newline at end of file
+{"version":3,"file":"createProjectProgram.d.ts","sourceRoot":"","sources":["../../src/create-program/createProjectProgram.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAazC;;;;;GAKG;AACH,iBAAS,oBAAoB,CAC3B,IAAI,EAAE,MAAM,EACZ,oBAAoB,EAAE,OAAO,EAC7B,KAAK,EAAE,KAAK,GACX,aAAa,GAAG,SAAS,CAyE3B;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js
index 23cd187..917330b 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js
@@ -3,6 +3,7 @@
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.createProjectProgram = void 0;
 const debug_1 = __importDefault(require("debug"));
 const path_1 = __importDefault(require("path"));
 const createWatchProgram_1 = require("./createWatchProgram");
@@ -24,11 +25,10 @@
 function createProjectProgram(code, createDefaultProgram, extra) {
     log('Creating project program for: %s', extra.filePath);
     const astAndProgram = node_utils_1.firstDefined(createWatchProgram_1.getProgramsForProjects(code, extra.filePath, extra), currentProgram => {
-        var _a;
         const ast = currentProgram.getSourceFile(extra.filePath);
         // working around https://github.com/typescript-eslint/typescript-eslint/issues/1573
         const expectedExt = getExtension(extra.filePath);
-        const returnedExt = getExtension((_a = ast) === null || _a === void 0 ? void 0 : _a.fileName);
+        const returnedExt = getExtension(ast === null || ast === void 0 ? void 0 : ast.fileName);
         if (expectedExt !== returnedExt) {
             return;
         }
@@ -66,7 +66,6 @@
         }
         if (!hasMatchedAnError) {
             errorLines.push('The file must be included in at least one of the projects provided.');
-            hasMatchedAnError = true;
         }
         throw new Error(errorLines.join('\n'));
     }
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js.map
index e930b49..a39bb00 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js.map
@@ -1 +1 @@
-{"version":3,"file":"createProjectProgram.js","sourceRoot":"","sources":["../../src/create-program/createProjectProgram.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"createProjectProgram.js","sourceRoot":"","sources":["../../src/create-program/createProjectProgram.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js
index 38ef750..910a1fa 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js
@@ -1,15 +1,28 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.createSourceFile = void 0;
 const debug_1 = __importDefault(require("debug"));
 const ts = __importStar(require("typescript"));
 const shared_1 = require("./shared");
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js.map
index 05dc944..693f43c 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js.map
@@ -1 +1 @@
-{"version":3,"file":"createSourceFile.js","sourceRoot":"","sources":["../../src/create-program/createSourceFile.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kDAA0B;AAC1B,+CAAiC;AAEjC,qCAAyC;AAEzC,MAAM,GAAG,GAAG,eAAK,CAAC,sDAAsD,CAAC,CAAC;AAE1E,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAAY;IAClD,GAAG,CACD,yDAAyD,EACzD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EACxB,KAAK,CAAC,QAAQ,CACf,CAAC;IAEF,OAAO,EAAE,CAAC,gBAAgB,CACxB,KAAK,CAAC,QAAQ,EACd,IAAI,EACJ,EAAE,CAAC,YAAY,CAAC,MAAM;IACtB,oBAAoB,CAAC,IAAI,EACzB,sBAAa,CAAC,KAAK,CAAC,CACrB,CAAC;AACJ,CAAC;AAEQ,4CAAgB"}
\ No newline at end of file
+{"version":3,"file":"createSourceFile.js","sourceRoot":"","sources":["../../src/create-program/createSourceFile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,+CAAiC;AAEjC,qCAAyC;AAEzC,MAAM,GAAG,GAAG,eAAK,CAAC,sDAAsD,CAAC,CAAC;AAE1E,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAAY;IAClD,GAAG,CACD,yDAAyD,EACzD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EACxB,KAAK,CAAC,QAAQ,CACf,CAAC;IAEF,OAAO,EAAE,CAAC,gBAAgB,CACxB,KAAK,CAAC,QAAQ,EACd,IAAI,EACJ,EAAE,CAAC,YAAY,CAAC,MAAM;IACtB,oBAAoB,CAAC,IAAI,EACzB,sBAAa,CAAC,KAAK,CAAC,CACrB,CAAC;AACJ,CAAC;AAEQ,4CAAgB"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts
index 5a0b783..af73e0c 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts
@@ -14,6 +14,6 @@
  * @returns The programs corresponding to the supplied tsconfig paths
  */
 declare function getProgramsForProjects(code: string, filePathIn: string, extra: Extra): ts.Program[];
-declare function createWatchProgram(tsconfigPath: string, extra: Extra): ts.WatchOfConfigFile<ts.SemanticDiagnosticsBuilderProgram>;
+declare function createWatchProgram(tsconfigPath: string, extra: Extra): ts.WatchOfConfigFile<ts.BuilderProgram>;
 export { clearCaches, createWatchProgram, getProgramsForProjects };
 //# sourceMappingURL=createWatchProgram.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts.map
index 4f6b465..5e6bce8 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"createWatchProgram.d.ts","sourceRoot":"","sources":["../../src/create-program/createWatchProgram.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AA6C1C;;;GAGG;AACH,iBAAS,WAAW,IAAI,IAAI,CAO3B;AA2DD;;;;;;;GAOG;AACH,iBAAS,sBAAsB,CAC7B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,KAAK,GACX,EAAE,CAAC,OAAO,EAAE,CAgGd;AAED,iBAAS,kBAAkB,CACzB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,KAAK,GACX,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,iCAAiC,CAAC,CAmG5D;AAoJD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,CAAC"}
\ No newline at end of file
+{"version":3,"file":"createWatchProgram.d.ts","sourceRoot":"","sources":["../../src/create-program/createWatchProgram.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AA6C1C;;;GAGG;AACH,iBAAS,WAAW,IAAI,IAAI,CAO3B;AA2DD;;;;;;;GAOG;AACH,iBAAS,sBAAsB,CAC7B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,KAAK,GACX,EAAE,CAAC,OAAO,EAAE,CAgGd;AAMD,iBAAS,kBAAkB,CACzB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,KAAK,GACX,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,cAAc,CAAC,CAwHzC;AAoJD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js
index ba5c505..fe03663 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js
@@ -1,17 +1,31 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.getProgramsForProjects = exports.createWatchProgram = exports.clearCaches = void 0;
 const debug_1 = __importDefault(require("debug"));
 const fs_1 = __importDefault(require("fs"));
+const semver_1 = __importDefault(require("semver"));
 const ts = __importStar(require("typescript"));
 const shared_1 = require("./shared");
 const log = debug_1.default('typescript-eslint:typescript-estree:createWatchProgram');
@@ -86,8 +100,9 @@
  * @returns hashed result
  */
 function createHash(content) {
+    var _a;
     // No ts.sys in browser environments.
-    if (ts.sys && ts.sys.createHash) {
+    if ((_a = ts.sys) === null || _a === void 0 ? void 0 : _a.createHash) {
         return ts.sys.createHash(content);
     }
     return content;
@@ -133,7 +148,7 @@
         }
         if (fileList.has(filePath)) {
             log('Found existing program for file. %s', filePath);
-            updatedProgram = (updatedProgram !== null && updatedProgram !== void 0 ? updatedProgram : existingWatch.getProgram().getProgram());
+            updatedProgram = updatedProgram !== null && updatedProgram !== void 0 ? updatedProgram : existingWatch.getProgram().getProgram();
             // sets parent pointers in source files
             updatedProgram.getTypeChecker();
             return [updatedProgram];
@@ -169,10 +184,13 @@
     return results;
 }
 exports.getProgramsForProjects = getProgramsForProjects;
+const isRunningNoTimeoutFix = semver_1.default.satisfies(ts.version, '>=3.9.0-beta', {
+    includePrerelease: true,
+});
 function createWatchProgram(tsconfigPath, extra) {
     log('Creating watch program for %s.', tsconfigPath);
     // create compiler host
-    const watchCompilerHost = ts.createWatchCompilerHost(tsconfigPath, shared_1.createDefaultCompilerOptionsFromExtra(extra), ts.sys, ts.createSemanticDiagnosticsBuilderProgram, diagnosticReporter, 
+    const watchCompilerHost = ts.createWatchCompilerHost(tsconfigPath, shared_1.createDefaultCompilerOptionsFromExtra(extra), ts.sys, ts.createAbstractBuilder, diagnosticReporter, 
     /*reportWatchStatus*/ () => { });
     // ensure readFile reads the code being linted instead of the copy on disk
     const oldReadFile = watchCompilerHost.readFile;
@@ -181,7 +199,7 @@
         const fileContent = filePath === currentLintOperationState.filePath
             ? currentLintOperationState.code
             : oldReadFile(filePath, encoding);
-        if (fileContent) {
+        if (fileContent !== undefined) {
             parsedFilesSeenHash.set(filePath, createHash(fileContent));
         }
         return fileContent;
@@ -217,23 +235,44 @@
         host.readDirectory = (path, extensions, exclude, include, depth) => oldReadDirectory(path, !extensions ? undefined : extensions.concat(extra.extraFileExtensions), exclude, include, depth);
         oldOnDirectoryStructureHostCreate(host);
     };
-    /*
-     * The watch change callbacks TS provides us all have a 250ms delay before firing
-     * https://github.com/microsoft/TypeScript/blob/b845800bdfcc81c8c72e2ac6fdc2c1df0cdab6f9/src/compiler/watch.ts#L1013
-     *
-     * We live in a synchronous world, so we can't wait for that.
-     * This is a bit of a hack, but it lets us immediately force updates when we detect a tsconfig or directory change
-     */
-    const oldSetTimeout = watchCompilerHost.setTimeout;
-    watchCompilerHost.setTimeout = (cb, ms, ...args) => {
-        var _a;
-        if (ms === 250) {
-            cb();
-            return null;
-        }
-        return (_a = oldSetTimeout) === null || _a === void 0 ? void 0 : _a(cb, ms, ...args);
-    };
-    return ts.createWatchProgram(watchCompilerHost);
+    // This works only on 3.9
+    watchCompilerHost.extraFileExtensions = extra.extraFileExtensions.map(extension => ({
+        extension,
+        isMixedContent: true,
+        scriptKind: ts.ScriptKind.Deferred,
+    }));
+    watchCompilerHost.trace = log;
+    // Since we don't want to asynchronously update program we want to disable timeout methods
+    // So any changes in the program will be delayed and updated when getProgram is called on watch
+    let callback;
+    if (isRunningNoTimeoutFix) {
+        watchCompilerHost.setTimeout = undefined;
+        watchCompilerHost.clearTimeout = undefined;
+    }
+    else {
+        log('Running without timeout fix');
+        // But because of https://github.com/microsoft/TypeScript/pull/37308 we cannot just set it to undefined
+        // instead save it and call before getProgram is called
+        watchCompilerHost.setTimeout = (cb, _ms, ...args) => {
+            callback = cb.bind(/*this*/ undefined, ...args);
+            return callback;
+        };
+        watchCompilerHost.clearTimeout = () => {
+            callback = undefined;
+        };
+    }
+    const watch = ts.createWatchProgram(watchCompilerHost);
+    if (!isRunningNoTimeoutFix) {
+        const originalGetProgram = watch.getProgram;
+        watch.getProgram = () => {
+            if (callback) {
+                callback();
+            }
+            callback = undefined;
+            return originalGetProgram.call(watch);
+        };
+    }
+    return watch;
 }
 exports.createWatchProgram = createWatchProgram;
 function hasTSConfigChanged(tsconfigPath) {
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js.map
index 67c1e32..326e15a 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js.map
@@ -1 +1 @@
-{"version":3,"file":"createWatchProgram.js","sourceRoot":"","sources":["../../src/create-program/createWatchProgram.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"createWatchProgram.js","sourceRoot":"","sources":["../../src/create-program/createWatchProgram.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts
index 51c52d4..ea10a48 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts
@@ -2,7 +2,7 @@
 import { Extra } from '../parser-options';
 interface ASTAndProgram {
     ast: ts.SourceFile;
-    program: ts.Program | undefined;
+    program: ts.Program;
 }
 declare function createDefaultCompilerOptionsFromExtra(extra: Extra): ts.CompilerOptions;
 declare type CanonicalPath = string & {
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts.map
index f4eee56..3e22bc4 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/create-program/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,UAAU,aAAa;IACrB,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC;IACnB,OAAO,EAAE,EAAE,CAAC,OAAO,GAAG,SAAS,CAAC;CACjC;AAeD,iBAAS,qCAAqC,CAC5C,KAAK,EAAE,KAAK,GACX,EAAE,CAAC,eAAe,CASpB;AAGD,aAAK,aAAa,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AASnD,iBAAS,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAM7D;AAED,iBAAS,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAI3D;AAED,iBAAS,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,aAAa,CAE1E;AAED,iBAAS,gBAAgB,CAAC,CAAC,EAAE,aAAa,GAAG,aAAa,CAEzD;AAED,iBAAS,aAAa,CACpB,KAAK,EAAE,KAAK,EACZ,QAAQ,GAAE,MAAuB,GAChC,EAAE,CAAC,UAAU,CAwBf;AAED,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,qCAAqC,EACrC,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,CAAC"}
\ No newline at end of file
+{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/create-program/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,UAAU,aAAa;IACrB,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC;IACnB,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;CACrB;AAkBD,iBAAS,qCAAqC,CAC5C,KAAK,EAAE,KAAK,GACX,EAAE,CAAC,eAAe,CASpB;AAGD,aAAK,aAAa,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AASnD,iBAAS,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAM7D;AAED,iBAAS,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAI3D;AAED,iBAAS,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,aAAa,CAE1E;AAED,iBAAS,gBAAgB,CAAC,CAAC,EAAE,aAAa,GAAG,aAAa,CAEzD;AAED,iBAAS,aAAa,CACpB,KAAK,EAAE,KAAK,EACZ,QAAQ,GAAE,MAAuB,GAChC,EAAE,CAAC,UAAU,CAwBf;AAED,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,qCAAqC,EACrC,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js
index f3b388b..5e8c198 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js
@@ -1,15 +1,28 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.getTsconfigPath = exports.getScriptKind = exports.getCanonicalFileName = exports.ensureAbsolutePath = exports.createDefaultCompilerOptionsFromExtra = exports.canonicalDirname = void 0;
 const path_1 = __importDefault(require("path"));
 const ts = __importStar(require("typescript"));
 /**
@@ -21,6 +34,9 @@
     checkJs: true,
     noEmit: true,
     // extendedDiagnostics: true,
+    /**
+     * Flags required to make no-unused-vars work
+     */
     noUnusedLocals: true,
     noUnusedParameters: true,
 };
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js.map
index 6a6ff25..30f05b2 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js.map
@@ -1 +1 @@
-{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/create-program/shared.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/create-program/shared.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/index.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/index.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/index.d.ts
rename to node_modules/@typescript-eslint/typescript-estree/dist/index.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/index.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/index.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/index.d.ts.map
rename to node_modules/@typescript-eslint/typescript-estree/dist/index.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/index.js b/node_modules/@typescript-eslint/typescript-estree/dist/index.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/index.js
rename to node_modules/@typescript-eslint/typescript-estree/dist/index.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/index.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/index.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/index.js.map
rename to node_modules/@typescript-eslint/typescript-estree/dist/index.js.map
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts
index 887e074..e9b5d41 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts
@@ -1,71 +1,74 @@
 import * as ts from 'typescript';
 import { AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree } from './ts-estree';
 declare const SyntaxKind: typeof ts.SyntaxKind;
-declare const TOKEN_TO_TEXT: {
-    readonly [SyntaxKind.OpenBraceToken]: "{";
-    readonly [SyntaxKind.CloseBraceToken]: "}";
-    readonly [SyntaxKind.OpenParenToken]: "(";
-    readonly [SyntaxKind.CloseParenToken]: ")";
-    readonly [SyntaxKind.OpenBracketToken]: "[";
-    readonly [SyntaxKind.CloseBracketToken]: "]";
-    readonly [SyntaxKind.DotToken]: ".";
-    readonly [SyntaxKind.DotDotDotToken]: "...";
-    readonly [SyntaxKind.SemicolonToken]: ";";
-    readonly [SyntaxKind.CommaToken]: ",";
-    readonly [SyntaxKind.LessThanToken]: "<";
-    readonly [SyntaxKind.GreaterThanToken]: ">";
-    readonly [SyntaxKind.LessThanEqualsToken]: "<=";
-    readonly [SyntaxKind.GreaterThanEqualsToken]: ">=";
-    readonly [SyntaxKind.EqualsEqualsToken]: "==";
-    readonly [SyntaxKind.ExclamationEqualsToken]: "!=";
-    readonly [SyntaxKind.EqualsEqualsEqualsToken]: "===";
-    readonly [SyntaxKind.InstanceOfKeyword]: "instanceof";
-    readonly [SyntaxKind.ExclamationEqualsEqualsToken]: "!==";
-    readonly [SyntaxKind.EqualsGreaterThanToken]: "=>";
-    readonly [SyntaxKind.PlusToken]: "+";
-    readonly [SyntaxKind.MinusToken]: "-";
-    readonly [SyntaxKind.AsteriskToken]: "*";
-    readonly [SyntaxKind.AsteriskAsteriskToken]: "**";
-    readonly [SyntaxKind.SlashToken]: "/";
-    readonly [SyntaxKind.PercentToken]: "%";
-    readonly [SyntaxKind.PlusPlusToken]: "++";
-    readonly [SyntaxKind.MinusMinusToken]: "--";
-    readonly [SyntaxKind.LessThanLessThanToken]: "<<";
-    readonly [SyntaxKind.LessThanSlashToken]: "</";
-    readonly [SyntaxKind.GreaterThanGreaterThanToken]: ">>";
-    readonly [SyntaxKind.GreaterThanGreaterThanGreaterThanToken]: ">>>";
-    readonly [SyntaxKind.AmpersandToken]: "&";
-    readonly [SyntaxKind.BarToken]: "|";
-    readonly [SyntaxKind.CaretToken]: "^";
-    readonly [SyntaxKind.ExclamationToken]: "!";
-    readonly [SyntaxKind.TildeToken]: "~";
-    readonly [SyntaxKind.AmpersandAmpersandToken]: "&&";
-    readonly [SyntaxKind.BarBarToken]: "||";
-    readonly [SyntaxKind.QuestionToken]: "?";
-    readonly [SyntaxKind.ColonToken]: ":";
-    readonly [SyntaxKind.EqualsToken]: "=";
-    readonly [SyntaxKind.PlusEqualsToken]: "+=";
-    readonly [SyntaxKind.MinusEqualsToken]: "-=";
-    readonly [SyntaxKind.AsteriskEqualsToken]: "*=";
-    readonly [SyntaxKind.AsteriskAsteriskEqualsToken]: "**=";
-    readonly [SyntaxKind.SlashEqualsToken]: "/=";
-    readonly [SyntaxKind.PercentEqualsToken]: "%=";
-    readonly [SyntaxKind.LessThanLessThanEqualsToken]: "<<=";
-    readonly [SyntaxKind.GreaterThanGreaterThanEqualsToken]: ">>=";
-    readonly [SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: ">>>=";
-    readonly [SyntaxKind.AmpersandEqualsToken]: "&=";
-    readonly [SyntaxKind.BarEqualsToken]: "|=";
-    readonly [SyntaxKind.CaretEqualsToken]: "^=";
-    readonly [SyntaxKind.AtToken]: "@";
-    readonly [SyntaxKind.InKeyword]: "in";
-    readonly [SyntaxKind.UniqueKeyword]: "unique";
-    readonly [SyntaxKind.KeyOfKeyword]: "keyof";
-    readonly [SyntaxKind.NewKeyword]: "new";
-    readonly [SyntaxKind.ImportKeyword]: "import";
-    readonly [SyntaxKind.ReadonlyKeyword]: "readonly";
-    readonly [SyntaxKind.QuestionQuestionToken]: "??";
-    readonly [SyntaxKind.QuestionDotToken]: "?.";
-};
+interface TokenToText {
+    [SyntaxKind.OpenBraceToken]: '{';
+    [SyntaxKind.CloseBraceToken]: '}';
+    [SyntaxKind.OpenParenToken]: '(';
+    [SyntaxKind.CloseParenToken]: ')';
+    [SyntaxKind.OpenBracketToken]: '[';
+    [SyntaxKind.CloseBracketToken]: ']';
+    [SyntaxKind.DotToken]: '.';
+    [SyntaxKind.DotDotDotToken]: '...';
+    [SyntaxKind.SemicolonToken]: ';';
+    [SyntaxKind.CommaToken]: ',';
+    [SyntaxKind.LessThanToken]: '<';
+    [SyntaxKind.GreaterThanToken]: '>';
+    [SyntaxKind.LessThanEqualsToken]: '<=';
+    [SyntaxKind.GreaterThanEqualsToken]: '>=';
+    [SyntaxKind.EqualsEqualsToken]: '==';
+    [SyntaxKind.ExclamationEqualsToken]: '!=';
+    [SyntaxKind.EqualsEqualsEqualsToken]: '===';
+    [SyntaxKind.InstanceOfKeyword]: 'instanceof';
+    [SyntaxKind.ExclamationEqualsEqualsToken]: '!==';
+    [SyntaxKind.EqualsGreaterThanToken]: '=>';
+    [SyntaxKind.PlusToken]: '+';
+    [SyntaxKind.MinusToken]: '-';
+    [SyntaxKind.AsteriskToken]: '*';
+    [SyntaxKind.AsteriskAsteriskToken]: '**';
+    [SyntaxKind.SlashToken]: '/';
+    [SyntaxKind.PercentToken]: '%';
+    [SyntaxKind.PlusPlusToken]: '++';
+    [SyntaxKind.MinusMinusToken]: '--';
+    [SyntaxKind.LessThanLessThanToken]: '<<';
+    [SyntaxKind.LessThanSlashToken]: '</';
+    [SyntaxKind.GreaterThanGreaterThanToken]: '>>';
+    [SyntaxKind.GreaterThanGreaterThanGreaterThanToken]: '>>>';
+    [SyntaxKind.AmpersandToken]: '&';
+    [SyntaxKind.BarToken]: '|';
+    [SyntaxKind.CaretToken]: '^';
+    [SyntaxKind.ExclamationToken]: '!';
+    [SyntaxKind.TildeToken]: '~';
+    [SyntaxKind.AmpersandAmpersandToken]: '&&';
+    [SyntaxKind.BarBarToken]: '||';
+    [SyntaxKind.QuestionToken]: '?';
+    [SyntaxKind.ColonToken]: ':';
+    [SyntaxKind.EqualsToken]: '=';
+    [SyntaxKind.PlusEqualsToken]: '+=';
+    [SyntaxKind.MinusEqualsToken]: '-=';
+    [SyntaxKind.AsteriskEqualsToken]: '*=';
+    [SyntaxKind.AsteriskAsteriskEqualsToken]: '**=';
+    [SyntaxKind.SlashEqualsToken]: '/=';
+    [SyntaxKind.PercentEqualsToken]: '%=';
+    [SyntaxKind.LessThanLessThanEqualsToken]: '<<=';
+    [SyntaxKind.GreaterThanGreaterThanEqualsToken]: '>>=';
+    [SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: '>>>=';
+    [SyntaxKind.AmpersandEqualsToken]: '&=';
+    [SyntaxKind.AmpersandAmpersandEqualsToken]: '&&=';
+    [SyntaxKind.BarEqualsToken]: '|=';
+    [SyntaxKind.BarBarEqualsToken]: '||=';
+    [SyntaxKind.CaretEqualsToken]: '^=';
+    [SyntaxKind.QuestionQuestionEqualsToken]: '??=';
+    [SyntaxKind.AtToken]: '@';
+    [SyntaxKind.InKeyword]: 'in';
+    [SyntaxKind.UniqueKeyword]: 'unique';
+    [SyntaxKind.KeyOfKeyword]: 'keyof';
+    [SyntaxKind.NewKeyword]: 'new';
+    [SyntaxKind.ImportKeyword]: 'import';
+    [SyntaxKind.ReadonlyKeyword]: 'readonly';
+    [SyntaxKind.QuestionQuestionToken]: '??';
+    [SyntaxKind.QuestionDotToken]: '?.';
+}
 /**
  * Returns true if the given ts.Token is the assignment operator
  * @param operator the operator token
@@ -83,7 +86,7 @@
  * @param kind the token's SyntaxKind
  * @returns the token applicable token as a string
  */
-export declare function getTextForTokenKind<T extends ts.SyntaxKind>(kind: T): T extends keyof typeof TOKEN_TO_TEXT ? typeof TOKEN_TO_TEXT[T] : undefined;
+export declare function getTextForTokenKind<T extends ts.SyntaxKind>(kind: T): T extends keyof TokenToText ? TokenToText[T] : string | undefined;
 /**
  * Returns true if the given ts.Node is a valid ESTree class member
  * @param node TypeScript AST node
@@ -223,6 +226,14 @@
     questionToken?: ts.QuestionToken;
 }): boolean;
 /**
+ * Returns true if the node is an optional chain node
+ */
+export declare function isChainExpression(node: TSESTree.Node): node is TSESTree.ChainExpression;
+/**
+ * Returns true of the child of property access expression is an optional chain
+ */
+export declare function isChildUnwrappableOptionalChain(node: ts.PropertyAccessExpression | ts.ElementAccessExpression | ts.CallExpression | ts.NonNullExpression, child: TSESTree.Node): boolean;
+/**
  * Returns the type of a given ts.Token
  * @param token the ts.Token
  * @returns the token type
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts.map
index f42b868..f898a2f 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"node-utils.d.ts","sourceRoot":"","sources":["../src/node-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAExE,QAAA,MAAM,UAAU,sBAAgB,CAAC;AA2BjC,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgET,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,EAAE,CAAC,UAAU,EAC1D,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GACpB,OAAO,CAET;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,EAAE,CAAC,UAAU,EACvD,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GACpB,OAAO,CAET;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,EAAE,CAAC,UAAU,EACzD,IAAI,EAAE,CAAC,GACN,CAAC,SAAS,MAAM,OAAO,aAAa,GAAG,OAAO,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAG5E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,YAAY,EAAE,EAAE,CAAC,iBAAiB,EAClC,IAAI,EAAE,EAAE,CAAC,IAAI,GACZ,OAAO,CAMT;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,QAAQ,GAAG,IAAI,CAOjE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAKhD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,EAAE,CAAC,UAAU,EAC7D,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAEnB,cAAc,CAAC,oBAAoB,GACnC,cAAc,CAAC,iBAAiB,GAChC,cAAc,CAAC,gBAAgB,CAOlC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,EAAE,CAAC,UAAU,GACjB,QAAQ,CAAC,iBAAiB,CAM5B;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,EAAE,CAAC,UAAU,GACjB,QAAQ,CAAC,cAAc,CAKzB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,GAC9C,OAAO,CAgBT;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE5E;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAI9C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAIjD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,EAAE,CAAC,uBAAuB,GAC/B,KAAK,GAAG,OAAO,GAAG,KAAK,CAQzB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,EAAE,CAAC,IAAI,GACZ,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,CAmB3C;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,aAAa,EAAE,EAAE,CAAC,SAAS,EAC3B,MAAM,EAAE,EAAE,CAAC,IAAI,EACf,GAAG,EAAE,EAAE,CAAC,UAAU,GACjB,EAAE,CAAC,IAAI,GAAG,SAAS,CAmBrB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,GACpC,EAAE,CAAC,IAAI,GAAG,SAAS,CAQrB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,aAAa,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC;CAClC,GAAG,OAAO,CAIV;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,GAC7C,OAAO,CAAC,eAAe,EAAE,eAAe,CAAC,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAwFxE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,EAAE,CAAC,IAAI,EACd,GAAG,EAAE,EAAE,CAAC,UAAU,GACjB,QAAQ,CAAC,KAAK,CA4BhB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,GAAG,QAAQ,CAAC,KAAK,EAAE,CAwBlE;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,EAAE,CAAC,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAQT;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,CAOrE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAC/B,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,EAC/B,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,GACrD,CAAC,GAAG,SAAS,CAYf"}
\ No newline at end of file
+{"version":3,"file":"node-utils.d.ts","sourceRoot":"","sources":["../src/node-utils.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js b/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js
index 883251e..05c95cf 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js
@@ -1,111 +1,45 @@
 "use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.firstDefined = exports.nodeHasTokens = exports.createError = exports.convertTokens = exports.convertToken = exports.getTokenType = exports.isChildUnwrappableOptionalChain = exports.isChainExpression = exports.isOptional = exports.isComputedProperty = exports.unescapeStringLiteralText = exports.hasJSXAncestor = exports.findFirstMatchingAncestor = exports.findNextToken = exports.getTSNodeAccessibility = exports.getDeclarationKind = exports.isJSXToken = exports.isToken = exports.getRange = exports.canContainDirective = exports.getLocFor = exports.getLineAndCharacterFor = exports.getBinaryExpressionType = exports.isJSDocComment = exports.isComment = exports.isComma = exports.getLastModifier = exports.hasModifier = exports.isESTreeClassMember = exports.getTextForTokenKind = exports.isLogicalOperator = exports.isAssignmentOperator = void 0;
 const unescape_1 = __importDefault(require("lodash/unescape"));
 const ts = __importStar(require("typescript"));
 const ts_estree_1 = require("./ts-estree");
 const SyntaxKind = ts.SyntaxKind;
-const ASSIGNMENT_OPERATORS = [
-    SyntaxKind.EqualsToken,
-    SyntaxKind.PlusEqualsToken,
-    SyntaxKind.MinusEqualsToken,
-    SyntaxKind.AsteriskEqualsToken,
-    SyntaxKind.AsteriskAsteriskEqualsToken,
-    SyntaxKind.SlashEqualsToken,
-    SyntaxKind.PercentEqualsToken,
-    SyntaxKind.LessThanLessThanEqualsToken,
-    SyntaxKind.GreaterThanGreaterThanEqualsToken,
-    SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken,
-    SyntaxKind.AmpersandEqualsToken,
-    SyntaxKind.BarEqualsToken,
-    SyntaxKind.CaretEqualsToken,
-];
 const LOGICAL_OPERATORS = [
     SyntaxKind.BarBarToken,
     SyntaxKind.AmpersandAmpersandToken,
     SyntaxKind.QuestionQuestionToken,
 ];
-const TOKEN_TO_TEXT = {
-    [SyntaxKind.OpenBraceToken]: '{',
-    [SyntaxKind.CloseBraceToken]: '}',
-    [SyntaxKind.OpenParenToken]: '(',
-    [SyntaxKind.CloseParenToken]: ')',
-    [SyntaxKind.OpenBracketToken]: '[',
-    [SyntaxKind.CloseBracketToken]: ']',
-    [SyntaxKind.DotToken]: '.',
-    [SyntaxKind.DotDotDotToken]: '...',
-    [SyntaxKind.SemicolonToken]: ';',
-    [SyntaxKind.CommaToken]: ',',
-    [SyntaxKind.LessThanToken]: '<',
-    [SyntaxKind.GreaterThanToken]: '>',
-    [SyntaxKind.LessThanEqualsToken]: '<=',
-    [SyntaxKind.GreaterThanEqualsToken]: '>=',
-    [SyntaxKind.EqualsEqualsToken]: '==',
-    [SyntaxKind.ExclamationEqualsToken]: '!=',
-    [SyntaxKind.EqualsEqualsEqualsToken]: '===',
-    [SyntaxKind.InstanceOfKeyword]: 'instanceof',
-    [SyntaxKind.ExclamationEqualsEqualsToken]: '!==',
-    [SyntaxKind.EqualsGreaterThanToken]: '=>',
-    [SyntaxKind.PlusToken]: '+',
-    [SyntaxKind.MinusToken]: '-',
-    [SyntaxKind.AsteriskToken]: '*',
-    [SyntaxKind.AsteriskAsteriskToken]: '**',
-    [SyntaxKind.SlashToken]: '/',
-    [SyntaxKind.PercentToken]: '%',
-    [SyntaxKind.PlusPlusToken]: '++',
-    [SyntaxKind.MinusMinusToken]: '--',
-    [SyntaxKind.LessThanLessThanToken]: '<<',
-    [SyntaxKind.LessThanSlashToken]: '</',
-    [SyntaxKind.GreaterThanGreaterThanToken]: '>>',
-    [SyntaxKind.GreaterThanGreaterThanGreaterThanToken]: '>>>',
-    [SyntaxKind.AmpersandToken]: '&',
-    [SyntaxKind.BarToken]: '|',
-    [SyntaxKind.CaretToken]: '^',
-    [SyntaxKind.ExclamationToken]: '!',
-    [SyntaxKind.TildeToken]: '~',
-    [SyntaxKind.AmpersandAmpersandToken]: '&&',
-    [SyntaxKind.BarBarToken]: '||',
-    [SyntaxKind.QuestionToken]: '?',
-    [SyntaxKind.ColonToken]: ':',
-    [SyntaxKind.EqualsToken]: '=',
-    [SyntaxKind.PlusEqualsToken]: '+=',
-    [SyntaxKind.MinusEqualsToken]: '-=',
-    [SyntaxKind.AsteriskEqualsToken]: '*=',
-    [SyntaxKind.AsteriskAsteriskEqualsToken]: '**=',
-    [SyntaxKind.SlashEqualsToken]: '/=',
-    [SyntaxKind.PercentEqualsToken]: '%=',
-    [SyntaxKind.LessThanLessThanEqualsToken]: '<<=',
-    [SyntaxKind.GreaterThanGreaterThanEqualsToken]: '>>=',
-    [SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: '>>>=',
-    [SyntaxKind.AmpersandEqualsToken]: '&=',
-    [SyntaxKind.BarEqualsToken]: '|=',
-    [SyntaxKind.CaretEqualsToken]: '^=',
-    [SyntaxKind.AtToken]: '@',
-    [SyntaxKind.InKeyword]: 'in',
-    [SyntaxKind.UniqueKeyword]: 'unique',
-    [SyntaxKind.KeyOfKeyword]: 'keyof',
-    [SyntaxKind.NewKeyword]: 'new',
-    [SyntaxKind.ImportKeyword]: 'import',
-    [SyntaxKind.ReadonlyKeyword]: 'readonly',
-    [SyntaxKind.QuestionQuestionToken]: '??',
-    [SyntaxKind.QuestionDotToken]: '?.',
-};
 /**
  * Returns true if the given ts.Token is the assignment operator
  * @param operator the operator token
  * @returns is assignment
  */
 function isAssignmentOperator(operator) {
-    return ASSIGNMENT_OPERATORS.includes(operator.kind);
+    return (operator.kind >= SyntaxKind.FirstAssignment &&
+        operator.kind <= SyntaxKind.LastAssignment);
 }
 exports.isAssignmentOperator = isAssignmentOperator;
 /**
@@ -123,8 +57,7 @@
  * @returns the token applicable token as a string
  */
 function getTextForTokenKind(kind) {
-    // eslint-disable-next-line @typescript-eslint/no-explicit-any
-    return kind in TOKEN_TO_TEXT ? TOKEN_TO_TEXT[kind] : undefined;
+    return ts.tokenToString(kind);
 }
 exports.getTextForTokenKind = getTextForTokenKind;
 /**
@@ -407,6 +340,25 @@
 }
 exports.isOptional = isOptional;
 /**
+ * Returns true if the node is an optional chain node
+ */
+function isChainExpression(node) {
+    return node.type === ts_estree_1.AST_NODE_TYPES.ChainExpression;
+}
+exports.isChainExpression = isChainExpression;
+/**
+ * Returns true of the child of property access expression is an optional chain
+ */
+function isChildUnwrappableOptionalChain(node, child) {
+    if (isChainExpression(child) &&
+        // (x?.y).z is semantically different, and as such .z is no longer optional
+        node.expression.kind !== ts.SyntaxKind.ParenthesizedExpression) {
+        return true;
+    }
+    return false;
+}
+exports.isChildUnwrappableOptionalChain = isChildUnwrappableOptionalChain;
+/**
  * Returns the type of a given ts.Token
  * @param token the ts.Token
  * @returns the token type
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js.map
index c1644ea..306ba36 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js.map
@@ -1 +1 @@
-{"version":3,"file":"node-utils.js","sourceRoot":"","sources":["../src/node-utils.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"node-utils.js","sourceRoot":"","sources":["../src/node-utils.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts
index ac7d925..e64a09d 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts
@@ -1,3 +1,4 @@
+import { DebugLevel } from '@typescript-eslint/types';
 import { Program } from 'typescript';
 import { TSESTree, TSNode, TSESTreeToTSNode, TSToken } from './ts-estree';
 declare type DebugModule = 'typescript-eslint' | 'eslint' | 'typescript';
@@ -13,7 +14,7 @@
     filePath: string;
     jsx: boolean;
     loc: boolean;
-    log: Function;
+    log: (message: string) => void;
     preserveNodeMaps?: boolean;
     projects: string[];
     range: boolean;
@@ -22,39 +23,29 @@
     tsconfigRootDir: string;
     useJSXTextNode: boolean;
 }
-export interface TSESTreeOptions {
+interface ParseOptions {
     /**
      * create a top-level comments array containing all comments
      */
     comment?: boolean;
     /**
-     * For convenience:
-     * - true === ['typescript-eslint']
-     * - false === []
-     *
      * An array of modules to turn explicit debugging on for.
      * - 'typescript-eslint' is the same as setting the env var `DEBUG=typescript-eslint:*`
      * - 'eslint' is the same as setting the env var `DEBUG=eslint:*`
      * - 'typescript' is the same as setting `extendedDiagnostics: true` in your tsconfig compilerOptions
+     *
+     * For convenience, also supports a boolean:
+     * - true === ['typescript-eslint']
+     * - false === []
      */
-    debugLevel?: boolean | DebugModule[];
-    /**
-     * Causes the parser to error if the TypeScript compiler returns any unexpected syntax/semantic errors.
-     */
-    errorOnTypeScriptSyntacticAndSemanticIssues?: boolean;
+    debugLevel?: DebugLevel;
     /**
      * Cause the parser to error if it encounters an unknown AST node type (useful for testing).
      * This case only usually occurs when TypeScript releases new features.
      */
     errorOnUnknownASTType?: boolean;
     /**
-     * When `project` is provided, this controls the non-standard file extensions which will be parsed.
-     * It accepts an array of file extensions, each preceded by a `.`.
-     */
-    extraFileExtensions?: string[];
-    /**
-     * Absolute (or relative to `tsconfigRootDir`) path to the file being parsed.
-     * When `project` is provided, this is required, as it is used to fetch the file from the TypeScript compiler's cache.
+     * Absolute (or relative to `cwd`) path to the file being parsed.
      */
     filePath?: string;
     /**
@@ -73,7 +64,34 @@
      * This is similar to the `range` property, except it is line/column relative.
      */
     loc?: boolean;
-    loggerFn?: Function | false;
+    loggerFn?: ((message: string) => void) | false;
+    /**
+     * Controls whether the `range` property is included on AST nodes.
+     * The `range` property is a [number, number] which indicates the start/end index of the node in the file contents.
+     * This is similar to the `loc` property, except this is the absolute index.
+     */
+    range?: boolean;
+    /**
+     * Set to true to create a top-level array containing all tokens from the file.
+     */
+    tokens?: boolean;
+    useJSXTextNode?: boolean;
+}
+interface ParseAndGenerateServicesOptions extends ParseOptions {
+    /**
+     * Causes the parser to error if the TypeScript compiler returns any unexpected syntax/semantic errors.
+     */
+    errorOnTypeScriptSyntacticAndSemanticIssues?: boolean;
+    /**
+     * When `project` is provided, this controls the non-standard file extensions which will be parsed.
+     * It accepts an array of file extensions, each preceded by a `.`.
+     */
+    extraFileExtensions?: string[];
+    /**
+     * Absolute (or relative to `tsconfigRootDir`) path to the file being parsed.
+     * When `project` is provided, this is required, as it is used to fetch the file from the TypeScript compiler's cache.
+     */
+    filePath?: string;
     /**
      * Allows the user to control whether or not two-way AST node maps are preserved
      * during the AST conversion process.
@@ -91,20 +109,17 @@
      */
     project?: string | string[];
     /**
-     * Controls whether the `range` property is included on AST nodes.
-     * The `range` property is a [number, number] which indicates the start/end index of the node in the file contents.
-     * This is similar to the `loc` property, except this is the absolute index.
+     * If you provide a glob (or globs) to the project option, you can use this option to ignore certain folders from
+     * being matched by the globs.
+     * This accepts an array of globs to ignore.
+     *
+     * By default, this is set to ["**\/node_modules/**"]
      */
-    range?: boolean;
-    /**
-     * Set to true to create a top-level array containing all tokens from the file.
-     */
-    tokens?: boolean;
+    projectFolderIgnoreList?: string[];
     /**
      * The absolute path to the root directory for all provided `project`s.
      */
     tsconfigRootDir?: string;
-    useJSXTextNode?: boolean;
     /**
      ***************************************************************************************
      * IT IS RECOMMENDED THAT YOU DO NOT USE THIS OPTION, AS IT CAUSES PERFORMANCE ISSUES. *
@@ -113,11 +128,10 @@
      * When passed with `project`, this allows the parser to create a catch-all, default program.
      * This means that if the parser encounters a file not included in any of the provided `project`s,
      * it will not error, but will instead parse the file and its dependencies in a new program.
-     *
-     * This
      */
     createDefaultProgram?: boolean;
 }
+export declare type TSESTreeOptions = ParseAndGenerateServicesOptions;
 export interface ParserWeakMap<TKey, TValueBase> {
     get<TValue extends TValueBase>(key: TKey): TValue;
     has(key: unknown): boolean;
@@ -127,9 +141,10 @@
     has(key: unknown): boolean;
 }
 export interface ParserServices {
-    program: Program | undefined;
-    esTreeNodeToTSNodeMap: ParserWeakMapESTreeToTSNode | undefined;
-    tsNodeToESTreeNodeMap: ParserWeakMap<TSNode | TSToken, TSESTree.Node> | undefined;
+    program: Program;
+    esTreeNodeToTSNodeMap: ParserWeakMapESTreeToTSNode;
+    tsNodeToESTreeNodeMap: ParserWeakMap<TSNode | TSToken, TSESTree.Node>;
+    hasFullTypeInformation: boolean;
 }
 export {};
 //# sourceMappingURL=parser-options.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts.map
index 273d6ea..af6375f 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"parser-options.d.ts","sourceRoot":"","sources":["../src/parser-options.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"parser-options.d.ts","sourceRoot":"","sources":["../src/parser-options.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts
index 63ac4c8..d31f3a7 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts
@@ -1,21 +1,17 @@
 import { TSESTreeOptions, ParserServices } from './parser-options';
 import { TSESTree } from './ts-estree';
+interface EmptyObject {
+}
 declare type AST<T extends TSESTreeOptions> = TSESTree.Program & (T['tokens'] extends true ? {
     tokens: TSESTree.Token[];
-} : {}) & (T['comment'] extends true ? {
+} : EmptyObject) & (T['comment'] extends true ? {
     comments: TSESTree.Comment[];
-} : {});
+} : EmptyObject);
 interface ParseAndGenerateServicesResult<T extends TSESTreeOptions> {
     ast: AST<T>;
     services: ParserServices;
 }
-declare const version: string;
 declare function parse<T extends TSESTreeOptions = TSESTreeOptions>(code: string, options?: T): AST<T>;
 declare function parseAndGenerateServices<T extends TSESTreeOptions = TSESTreeOptions>(code: string, options: T): ParseAndGenerateServicesResult<T>;
-export { AST, parse, parseAndGenerateServices, ParseAndGenerateServicesResult, version, };
-export { ParserServices, TSESTreeOptions } from './parser-options';
-export { simpleTraverse } from './simple-traverse';
-export { visitorKeys } from './visitor-keys';
-export * from './ts-estree';
-export { clearCaches } from './create-program/createWatchProgram';
+export { AST, parse, parseAndGenerateServices, ParseAndGenerateServicesResult };
 //# sourceMappingURL=parser.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts.map
index a9a6f40..0647033 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAWA,OAAO,EAAS,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE1E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAgRvC,aAAK,GAAG,CAAC,CAAC,SAAS,eAAe,IAAI,QAAQ,CAAC,OAAO,GACpD,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,GAAG;IAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAA;CAAE,GAAG,EAAE,CAAC,GAC9D,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAA;CAAE,GAAG,EAAE,CAAC,CAAC;AAEtE,UAAU,8BAA8B,CAAC,CAAC,SAAS,eAAe;IAChE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACZ,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAMD,QAAA,MAAM,OAAO,EAAE,MAA2C,CAAC;AAE3D,iBAAS,KAAK,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,EACxD,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,CAAC,GACV,GAAG,CAAC,CAAC,CAAC,CA4CR;AAED,iBAAS,wBAAwB,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,EAC3E,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,GACT,8BAA8B,CAAC,CAAC,CAAC,CAsFnC;AAED,OAAO,EACL,GAAG,EACH,KAAK,EACL,wBAAwB,EACxB,8BAA8B,EAC9B,OAAO,GACR,CAAC;AACF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAWA,OAAO,EAAS,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE1E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAwSvC,UAAU,WAAW;CAAG;AACxB,aAAK,GAAG,CAAC,CAAC,SAAS,eAAe,IAAI,QAAQ,CAAC,OAAO,GACpD,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,GAAG;IAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAA;CAAE,GAAG,WAAW,CAAC,GACvE,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAA;CAAE,GAAG,WAAW,CAAC,CAAC;AAE/E,UAAU,8BAA8B,CAAC,CAAC,SAAS,eAAe;IAChE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACZ,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,iBAAS,KAAK,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,EACxD,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,CAAC,GACV,GAAG,CAAC,CAAC,CAAC,CA4CR;AAED,iBAAS,wBAAwB,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,EAC3E,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,GACT,8BAA8B,CAAC,CAAC,CAAC,CA0EnC;AAED,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/parser.js b/node_modules/@typescript-eslint/typescript-estree/dist/parser.js
index ce9ab9e..20db621 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/parser.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/parser.js
@@ -1,20 +1,30 @@
 "use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.parseAndGenerateServices = exports.parse = void 0;
 const debug_1 = __importDefault(require("debug"));
-const glob_1 = require("glob");
+const globby_1 = require("globby");
 const is_glob_1 = __importDefault(require("is-glob"));
 const semver_1 = __importDefault(require("semver"));
 const ts = __importStar(require("typescript"));
@@ -26,16 +36,17 @@
 const createSourceFile_1 = require("./create-program/createSourceFile");
 const semantic_or_syntactic_errors_1 = require("./semantic-or-syntactic-errors");
 const shared_1 = require("./create-program/shared");
+const log = debug_1.default('typescript-eslint:typescript-estree:parser');
 /**
  * This needs to be kept in sync with the top-level README.md in the
  * typescript-eslint monorepo
  */
-const SUPPORTED_TYPESCRIPT_VERSIONS = '>=3.2.1 <3.8.0';
+const SUPPORTED_TYPESCRIPT_VERSIONS = '>=3.3.1 <4.1.0';
 /*
  * The semver package will ignore prerelease ranges, and we don't want to explicitly document every one
  * List them all separately here, so we can automatically create the full string
  */
-const SUPPORTED_PRERELEASE_RANGES = ['>3.7.0-dev.0', '3.7.1-rc'];
+const SUPPORTED_PRERELEASE_RANGES = [];
 const ACTIVE_TYPESCRIPT_VERSION = ts.version;
 const isRunningSupportedTypeScriptVersion = semver_1.default.satisfies(ACTIVE_TYPESCRIPT_VERSION, [SUPPORTED_TYPESCRIPT_VERSIONS]
     .concat(SUPPORTED_PRERELEASE_RANGES)
@@ -93,7 +104,7 @@
         jsx: false,
         loc: false,
         log: console.log,
-        preserveNodeMaps: undefined,
+        preserveNodeMaps: true,
         projects: [],
         range: false,
         strict: false,
@@ -102,7 +113,37 @@
         useJSXTextNode: false,
     };
 }
+/**
+ * Normalizes, sanitizes, resolves and filters the provided
+ */
+function prepareAndTransformProjects(projectsInput, ignoreListInput) {
+    let projects = [];
+    // Normalize and sanitize the project paths
+    if (typeof projectsInput === 'string') {
+        projects.push(projectsInput);
+    }
+    else if (Array.isArray(projectsInput)) {
+        for (const project of projectsInput) {
+            if (typeof project === 'string') {
+                projects.push(project);
+            }
+        }
+    }
+    if (projects.length === 0) {
+        return projects;
+    }
+    // Transform glob patterns into paths
+    const globbedProjects = projects.filter(project => is_glob_1.default(project));
+    projects = projects
+        .filter(project => !is_glob_1.default(project))
+        .concat(globby_1.sync([...globbedProjects, ...ignoreListInput], {
+        cwd: extra.tsconfigRootDir,
+    }));
+    log('parserOptions.project (excluding ignored) matched projects: %s', projects);
+    return projects;
+}
 function applyParserOptionsToExtra(options) {
+    var _a;
     /**
      * Configure Debug logging
      */
@@ -151,7 +192,7 @@
         extra.jsx = true;
     }
     /**
-     * Get the file extension
+     * Get the file path
      */
     if (typeof options.filePath === 'string' && options.filePath !== '<input>') {
         extra.filePath = options.filePath;
@@ -184,27 +225,24 @@
         extra.log = options.loggerFn;
     }
     else if (options.loggerFn === false) {
-        extra.log = Function.prototype;
-    }
-    if (typeof options.project === 'string') {
-        extra.projects = [options.project];
-    }
-    else if (Array.isArray(options.project) &&
-        options.project.every(projectPath => typeof projectPath === 'string')) {
-        extra.projects = options.project;
+        extra.log = () => { };
     }
     if (typeof options.tsconfigRootDir === 'string') {
         extra.tsconfigRootDir = options.tsconfigRootDir;
     }
+    // NOTE - ensureAbsolutePath relies upon having the correct tsconfigRootDir in extra
     extra.filePath = shared_1.ensureAbsolutePath(extra.filePath, extra);
-    // Transform glob patterns into paths
-    if (extra.projects) {
-        extra.projects = extra.projects.reduce((projects, project) => projects.concat(is_glob_1.default(project)
-            ? glob_1.sync(project, {
-                cwd: extra.tsconfigRootDir || process.cwd(),
-            })
-            : project), []);
-    }
+    // NOTE - prepareAndTransformProjects relies upon having the correct tsconfigRootDir in extra
+    const projectFolderIgnoreList = ((_a = options.projectFolderIgnoreList) !== null && _a !== void 0 ? _a : [])
+        .reduce((acc, folder) => {
+        if (typeof folder === 'string') {
+            acc.push(folder);
+        }
+        return acc;
+    }, [])
+        // prefix with a ! for not match glob
+        .map(folder => (folder.startsWith('!') ? folder : `!${folder}`));
+    extra.projects = prepareAndTransformProjects(options.project, projectFolderIgnoreList);
     if (Array.isArray(options.extraFileExtensions) &&
         options.extraFileExtensions.every(ext => typeof ext === 'string')) {
         extra.extraFileExtensions = options.extraFileExtensions;
@@ -212,14 +250,9 @@
     /**
      * Allow the user to enable or disable the preservation of the AST node maps
      * during the conversion process.
-     *
-     * NOTE: For backwards compatibility we also preserve node maps in the case where `project` is set,
-     * and `preserveNodeMaps` is not explicitly set to anything.
      */
-    extra.preserveNodeMaps =
-        typeof options.preserveNodeMaps === 'boolean' && options.preserveNodeMaps;
-    if (options.preserveNodeMaps === undefined && extra.projects.length > 0) {
-        extra.preserveNodeMaps = true;
+    if (typeof options.preserveNodeMaps === 'boolean') {
+        extra.preserveNodeMaps = options.preserveNodeMaps;
     }
     extra.createDefaultProgram =
         typeof options.createDefaultProgram === 'boolean' &&
@@ -245,13 +278,7 @@
         warnedAboutTSVersion = true;
     }
 }
-//------------------------------------------------------------------------------
-// Public
-//------------------------------------------------------------------------------
-const version = require('../package.json').version;
-exports.version = version;
 function parse(code, options) {
-    var _a;
     /**
      * Reset the parse configuration
      */
@@ -259,7 +286,7 @@
     /**
      * Ensure users do not attempt to use parse() when they need parseAndGenerateServices()
      */
-    if ((_a = options) === null || _a === void 0 ? void 0 : _a.errorOnTypeScriptSyntacticAndSemanticIssues) {
+    if (options === null || options === void 0 ? void 0 : options.errorOnTypeScriptSyntacticAndSemanticIssues) {
         throw new Error(`"errorOnTypeScriptSyntacticAndSemanticIssues" is only supported for parseAndGenerateServices()`);
     }
     /**
@@ -321,17 +348,11 @@
     const shouldProvideParserServices = extra.projects && extra.projects.length > 0;
     const { ast, program } = getProgramAndAST(code, shouldProvideParserServices, extra.createDefaultProgram);
     /**
-     * Determine if two-way maps of converted AST nodes should be preserved
-     * during the conversion process
-     */
-    const shouldPreserveNodeMaps = extra.preserveNodeMaps !== undefined
-        ? extra.preserveNodeMaps
-        : shouldProvideParserServices;
-    /**
      * Convert the TypeScript AST to an ESTree-compatible one, and optionally preserve
      * mappings between converted and original AST nodes
      */
-    const { estree, astMaps } = ast_converter_1.astConverter(ast, extra, shouldPreserveNodeMaps);
+    const preserveNodeMaps = typeof extra.preserveNodeMaps === 'boolean' ? extra.preserveNodeMaps : true;
+    const { estree, astMaps } = ast_converter_1.astConverter(ast, extra, preserveNodeMaps);
     /**
      * Even if TypeScript parsed the source code ok, and we had no problems converting the AST,
      * there may be other syntactic or semantic issues in the code that we can optionally report on.
@@ -348,22 +369,12 @@
     return {
         ast: estree,
         services: {
-            program: shouldProvideParserServices ? program : undefined,
-            esTreeNodeToTSNodeMap: shouldPreserveNodeMaps && astMaps
-                ? astMaps.esTreeNodeToTSNodeMap
-                : undefined,
-            tsNodeToESTreeNodeMap: shouldPreserveNodeMaps && astMaps
-                ? astMaps.tsNodeToESTreeNodeMap
-                : undefined,
+            hasFullTypeInformation: shouldProvideParserServices,
+            program,
+            esTreeNodeToTSNodeMap: astMaps.esTreeNodeToTSNodeMap,
+            tsNodeToESTreeNodeMap: astMaps.tsNodeToESTreeNodeMap,
         },
     };
 }
 exports.parseAndGenerateServices = parseAndGenerateServices;
-var simple_traverse_1 = require("./simple-traverse");
-exports.simpleTraverse = simple_traverse_1.simpleTraverse;
-var visitor_keys_1 = require("./visitor-keys");
-exports.visitorKeys = visitor_keys_1.visitorKeys;
-__export(require("./ts-estree"));
-var createWatchProgram_1 = require("./create-program/createWatchProgram");
-exports.clearCaches = createWatchProgram_1.clearCaches;
 //# sourceMappingURL=parser.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/parser.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/parser.js.map
index 400a223..d717c37 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/parser.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/parser.js.map
@@ -1 +1 @@
-{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js b/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js
index e77e4e6..96473c4 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js
@@ -1,12 +1,25 @@
 "use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
 var __importStar = (this && this.__importStar) || function (mod) {
     if (mod && mod.__esModule) return mod;
     var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+exports.getFirstSemanticOrSyntacticError = void 0;
 const ts = __importStar(require("typescript"));
 /**
  * By default, diagnostics from the TypeScript compiler contain all errors - regardless of whether
@@ -73,6 +86,7 @@
             case 1175: // "'implements' clause already seen."
             case 1176: // "Interface declaration cannot have 'implements' clause."
             case 1190: // "The variable declaration of a 'for...of' statement cannot have an initializer."
+            case 1196: // "Catch clause variable type annotation must be 'any' or 'unknown' if specified."
             case 1200: // "Line terminator not permitted before arrow."
             case 1206: // "Decorators are not valid here."
             case 1211: // "A class declaration without the 'default' modifier must have a name."
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js.map
index e26f894..af69657 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js.map
@@ -1 +1 @@
-{"version":3,"file":"semantic-or-syntactic-errors.js","sourceRoot":"","sources":["../src/semantic-or-syntactic-errors.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"semantic-or-syntactic-errors.js","sourceRoot":"","sources":["../src/semantic-or-syntactic-errors.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts
index d7f3efa..be2b1fc 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts
@@ -1,7 +1,9 @@
 import { TSESTree } from './ts-estree';
-interface SimpleTraverseOptions {
+declare type SimpleTraverseOptions = {
     enter: (node: TSESTree.Node, parent: TSESTree.Node | undefined) => void;
-}
-export declare function simpleTraverse(startingNode: TSESTree.Node, options: SimpleTraverseOptions): void;
+} | {
+    [key: string]: (node: TSESTree.Node, parent: TSESTree.Node | undefined) => void;
+};
+export declare function simpleTraverse(startingNode: TSESTree.Node, options: SimpleTraverseOptions, setParentPointers?: boolean): void;
 export {};
 //# sourceMappingURL=simple-traverse.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts.map
index 66894a6..7acdb86 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"simple-traverse.d.ts","sourceRoot":"","sources":["../src/simple-traverse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAgBvC,UAAU,qBAAqB;IAC7B,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;CACzE;AAmCD,wBAAgB,cAAc,CAC5B,YAAY,EAAE,QAAQ,CAAC,IAAI,EAC3B,OAAO,EAAE,qBAAqB,GAC7B,IAAI,CAEN"}
\ No newline at end of file
+{"version":3,"file":"simple-traverse.d.ts","sourceRoot":"","sources":["../src/simple-traverse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAevC,aAAK,qBAAqB,GACtB;IACE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;CACzE,GACD;IACE,CAAC,GAAG,EAAE,MAAM,GAAG,CACb,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,SAAS,KAC9B,IAAI,CAAC;CACX,CAAC;AA8CN,wBAAgB,cAAc,CAC5B,YAAY,EAAE,QAAQ,CAAC,IAAI,EAC3B,OAAO,EAAE,qBAAqB,EAC9B,iBAAiB,UAAQ,GACxB,IAAI,CAKN"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js b/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js
index 73f0bbd..b19f9b7 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js
@@ -1,6 +1,7 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-const visitor_keys_1 = require("./visitor-keys");
+exports.simpleTraverse = void 0;
+const visitor_keys_1 = require("@typescript-eslint/visitor-keys");
 // eslint-disable-next-line @typescript-eslint/no-explicit-any
 function isValidNode(x) {
     return x !== null && typeof x === 'object' && typeof x.type === 'string';
@@ -10,15 +11,24 @@
     return (keys !== null && keys !== void 0 ? keys : []);
 }
 class SimpleTraverser {
-    constructor({ enter }) {
+    constructor(selectors, setParentPointers = false) {
         this.allVisitorKeys = visitor_keys_1.visitorKeys;
-        this.enter = enter;
+        this.selectors = selectors;
+        this.setParentPointers = setParentPointers;
     }
     traverse(node, parent) {
         if (!isValidNode(node)) {
             return;
         }
-        this.enter(node, parent);
+        if (this.setParentPointers) {
+            node.parent = parent;
+        }
+        if ('enter' in this.selectors) {
+            this.selectors.enter(node, parent);
+        }
+        else if (node.type in this.selectors) {
+            this.selectors[node.type](node, parent);
+        }
         const keys = getVisitorKeysForNode(this.allVisitorKeys, node);
         if (keys.length < 1) {
             return;
@@ -36,8 +46,8 @@
         }
     }
 }
-function simpleTraverse(startingNode, options) {
-    new SimpleTraverser(options).traverse(startingNode, undefined);
+function simpleTraverse(startingNode, options, setParentPointers = false) {
+    new SimpleTraverser(options, setParentPointers).traverse(startingNode, undefined);
 }
 exports.simpleTraverse = simpleTraverse;
 //# sourceMappingURL=simple-traverse.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js.map
index ca35677..910f55e 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js.map
@@ -1 +1 @@
-{"version":3,"file":"simple-traverse.js","sourceRoot":"","sources":["../src/simple-traverse.ts"],"names":[],"mappings":";;AACA,iDAA6C;AAE7C,8DAA8D;AAC9D,SAAS,WAAW,CAAC,CAAM;IACzB,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC3E,CAAC;AAED,SAAS,qBAAqB,CAC5B,cAAkC,EAClC,IAAmB;IAEnB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,QAAO,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,EAAC;AACpB,CAAC;AAMD,MAAM,eAAe;IAInB,YAAY,EAAE,KAAK,EAAyB;QAHpC,mBAAc,GAAG,0BAAW,CAAC;QAInC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,IAAa,EAAE,MAAiC;QACvD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YACtB,OAAO;SACR;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEzB,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,OAAO;SACR;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,MAAM,eAAe,GAAG,IAAI,CAAC,GAA0B,CAAC,CAAC;YAEzD,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;gBAClC,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE;oBACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;iBAC5B;aACF;iBAAM;gBACL,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;aACtC;SACF;IACH,CAAC;CACF;AAED,SAAgB,cAAc,CAC5B,YAA2B,EAC3B,OAA8B;IAE9B,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;AACjE,CAAC;AALD,wCAKC"}
\ No newline at end of file
+{"version":3,"file":"simple-traverse.js","sourceRoot":"","sources":["../src/simple-traverse.ts"],"names":[],"mappings":";;;AAAA,kEAA8D;AAG9D,8DAA8D;AAC9D,SAAS,WAAW,CAAC,CAAM;IACzB,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC3E,CAAC;AAED,SAAS,qBAAqB,CAC5B,cAAkC,EAClC,IAAmB;IAEnB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,CAAU,CAAC;AAC/B,CAAC;AAaD,MAAM,eAAe;IAKnB,YAAY,SAAgC,EAAE,iBAAiB,GAAG,KAAK;QAJtD,mBAAc,GAAG,0BAAW,CAAC;QAK5C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAED,QAAQ,CAAC,IAAa,EAAE,MAAiC;QACvD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YACtB,OAAO;SACR;QAED,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;SACtB;QAED,IAAI,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE;YAC7B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;SACpC;aAAM,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;YACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;SACzC;QAED,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,OAAO;SACR;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YAElC,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;gBAClC,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE;oBACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;iBAC5B;aACF;iBAAM;gBACL,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;aACtC;SACF;IACH,CAAC;CACF;AAED,SAAgB,cAAc,CAC5B,YAA2B,EAC3B,OAA8B,EAC9B,iBAAiB,GAAG,KAAK;IAEzB,IAAI,eAAe,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CACtD,YAAY,EACZ,SAAS,CACV,CAAC;AACJ,CAAC;AATD,wCASC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ast-node-types.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ast-node-types.d.ts
deleted file mode 100644
index 7dc8290..0000000
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ast-node-types.d.ts
+++ /dev/null
@@ -1,180 +0,0 @@
-export declare enum AST_NODE_TYPES {
-    ArrayExpression = "ArrayExpression",
-    ArrayPattern = "ArrayPattern",
-    ArrowFunctionExpression = "ArrowFunctionExpression",
-    AssignmentExpression = "AssignmentExpression",
-    AssignmentPattern = "AssignmentPattern",
-    AwaitExpression = "AwaitExpression",
-    BigIntLiteral = "BigIntLiteral",
-    BinaryExpression = "BinaryExpression",
-    BlockStatement = "BlockStatement",
-    BreakStatement = "BreakStatement",
-    CallExpression = "CallExpression",
-    CatchClause = "CatchClause",
-    ClassBody = "ClassBody",
-    ClassDeclaration = "ClassDeclaration",
-    ClassExpression = "ClassExpression",
-    ClassProperty = "ClassProperty",
-    ConditionalExpression = "ConditionalExpression",
-    ContinueStatement = "ContinueStatement",
-    DebuggerStatement = "DebuggerStatement",
-    Decorator = "Decorator",
-    DoWhileStatement = "DoWhileStatement",
-    EmptyStatement = "EmptyStatement",
-    ExportAllDeclaration = "ExportAllDeclaration",
-    ExportDefaultDeclaration = "ExportDefaultDeclaration",
-    ExportNamedDeclaration = "ExportNamedDeclaration",
-    ExportSpecifier = "ExportSpecifier",
-    ExpressionStatement = "ExpressionStatement",
-    ForInStatement = "ForInStatement",
-    ForOfStatement = "ForOfStatement",
-    ForStatement = "ForStatement",
-    FunctionDeclaration = "FunctionDeclaration",
-    FunctionExpression = "FunctionExpression",
-    Identifier = "Identifier",
-    IfStatement = "IfStatement",
-    Import = "Import",
-    ImportDeclaration = "ImportDeclaration",
-    ImportDefaultSpecifier = "ImportDefaultSpecifier",
-    ImportNamespaceSpecifier = "ImportNamespaceSpecifier",
-    ImportSpecifier = "ImportSpecifier",
-    JSXAttribute = "JSXAttribute",
-    JSXClosingElement = "JSXClosingElement",
-    JSXClosingFragment = "JSXClosingFragment",
-    JSXElement = "JSXElement",
-    JSXEmptyExpression = "JSXEmptyExpression",
-    JSXExpressionContainer = "JSXExpressionContainer",
-    JSXFragment = "JSXFragment",
-    JSXIdentifier = "JSXIdentifier",
-    JSXMemberExpression = "JSXMemberExpression",
-    JSXOpeningElement = "JSXOpeningElement",
-    JSXOpeningFragment = "JSXOpeningFragment",
-    JSXSpreadAttribute = "JSXSpreadAttribute",
-    JSXSpreadChild = "JSXSpreadChild",
-    JSXText = "JSXText",
-    LabeledStatement = "LabeledStatement",
-    Literal = "Literal",
-    LogicalExpression = "LogicalExpression",
-    MemberExpression = "MemberExpression",
-    MetaProperty = "MetaProperty",
-    MethodDefinition = "MethodDefinition",
-    NewExpression = "NewExpression",
-    ObjectExpression = "ObjectExpression",
-    ObjectPattern = "ObjectPattern",
-    OptionalCallExpression = "OptionalCallExpression",
-    OptionalMemberExpression = "OptionalMemberExpression",
-    Program = "Program",
-    Property = "Property",
-    RestElement = "RestElement",
-    ReturnStatement = "ReturnStatement",
-    SequenceExpression = "SequenceExpression",
-    SpreadElement = "SpreadElement",
-    Super = "Super",
-    SwitchCase = "SwitchCase",
-    SwitchStatement = "SwitchStatement",
-    TaggedTemplateExpression = "TaggedTemplateExpression",
-    TemplateElement = "TemplateElement",
-    TemplateLiteral = "TemplateLiteral",
-    ThisExpression = "ThisExpression",
-    ThrowStatement = "ThrowStatement",
-    TryStatement = "TryStatement",
-    UnaryExpression = "UnaryExpression",
-    UpdateExpression = "UpdateExpression",
-    VariableDeclaration = "VariableDeclaration",
-    VariableDeclarator = "VariableDeclarator",
-    WhileStatement = "WhileStatement",
-    WithStatement = "WithStatement",
-    YieldExpression = "YieldExpression",
-    /**
-     * TS-prefixed nodes
-     */
-    TSAbstractClassProperty = "TSAbstractClassProperty",
-    TSAbstractKeyword = "TSAbstractKeyword",
-    TSAbstractMethodDefinition = "TSAbstractMethodDefinition",
-    TSAnyKeyword = "TSAnyKeyword",
-    TSArrayType = "TSArrayType",
-    TSAsExpression = "TSAsExpression",
-    TSAsyncKeyword = "TSAsyncKeyword",
-    TSBooleanKeyword = "TSBooleanKeyword",
-    TSBigIntKeyword = "TSBigIntKeyword",
-    TSConditionalType = "TSConditionalType",
-    TSConstructorType = "TSConstructorType",
-    TSCallSignatureDeclaration = "TSCallSignatureDeclaration",
-    TSClassImplements = "TSClassImplements",
-    TSConstructSignatureDeclaration = "TSConstructSignatureDeclaration",
-    TSDeclareKeyword = "TSDeclareKeyword",
-    TSDeclareFunction = "TSDeclareFunction",
-    TSEmptyBodyFunctionExpression = "TSEmptyBodyFunctionExpression",
-    TSEnumDeclaration = "TSEnumDeclaration",
-    TSEnumMember = "TSEnumMember",
-    TSExportAssignment = "TSExportAssignment",
-    TSExportKeyword = "TSExportKeyword",
-    TSExternalModuleReference = "TSExternalModuleReference",
-    TSImportType = "TSImportType",
-    TSInferType = "TSInferType",
-    TSLiteralType = "TSLiteralType",
-    TSIndexedAccessType = "TSIndexedAccessType",
-    TSIndexSignature = "TSIndexSignature",
-    TSInterfaceBody = "TSInterfaceBody",
-    TSInterfaceDeclaration = "TSInterfaceDeclaration",
-    TSInterfaceHeritage = "TSInterfaceHeritage",
-    TSImportEqualsDeclaration = "TSImportEqualsDeclaration",
-    TSFunctionType = "TSFunctionType",
-    TSMethodSignature = "TSMethodSignature",
-    TSModuleBlock = "TSModuleBlock",
-    TSModuleDeclaration = "TSModuleDeclaration",
-    TSNamespaceExportDeclaration = "TSNamespaceExportDeclaration",
-    TSNonNullExpression = "TSNonNullExpression",
-    TSNeverKeyword = "TSNeverKeyword",
-    TSNullKeyword = "TSNullKeyword",
-    TSNumberKeyword = "TSNumberKeyword",
-    TSMappedType = "TSMappedType",
-    TSObjectKeyword = "TSObjectKeyword",
-    TSParameterProperty = "TSParameterProperty",
-    TSPrivateKeyword = "TSPrivateKeyword",
-    TSPropertySignature = "TSPropertySignature",
-    TSProtectedKeyword = "TSProtectedKeyword",
-    TSPublicKeyword = "TSPublicKeyword",
-    TSQualifiedName = "TSQualifiedName",
-    TSReadonlyKeyword = "TSReadonlyKeyword",
-    TSRestType = "TSRestType",
-    TSStaticKeyword = "TSStaticKeyword",
-    TSStringKeyword = "TSStringKeyword",
-    TSSymbolKeyword = "TSSymbolKeyword",
-    TSThisType = "TSThisType",
-    TSTypeAnnotation = "TSTypeAnnotation",
-    TSTypeAliasDeclaration = "TSTypeAliasDeclaration",
-    TSTypeAssertion = "TSTypeAssertion",
-    TSTypeLiteral = "TSTypeLiteral",
-    TSTypeOperator = "TSTypeOperator",
-    TSTypeParameter = "TSTypeParameter",
-    TSTypeParameterDeclaration = "TSTypeParameterDeclaration",
-    TSTypeParameterInstantiation = "TSTypeParameterInstantiation",
-    TSTypePredicate = "TSTypePredicate",
-    TSTypeReference = "TSTypeReference",
-    TSTypeQuery = "TSTypeQuery",
-    TSIntersectionType = "TSIntersectionType",
-    TSTupleType = "TSTupleType",
-    TSOptionalType = "TSOptionalType",
-    TSParenthesizedType = "TSParenthesizedType",
-    TSUnionType = "TSUnionType",
-    TSUndefinedKeyword = "TSUndefinedKeyword",
-    TSUnknownKeyword = "TSUnknownKeyword",
-    TSVoidKeyword = "TSVoidKeyword"
-}
-export declare enum AST_TOKEN_TYPES {
-    Boolean = "Boolean",
-    Identifier = "Identifier",
-    JSXIdentifier = "JSXIdentifier",
-    JSXText = "JSXText",
-    Keyword = "Keyword",
-    Null = "Null",
-    Numeric = "Numeric",
-    Punctuator = "Punctuator",
-    RegularExpression = "RegularExpression",
-    String = "String",
-    Template = "Template",
-    Block = "Block",
-    Line = "Line"
-}
-//# sourceMappingURL=ast-node-types.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ast-node-types.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ast-node-types.d.ts.map
deleted file mode 100644
index 3c6fc53..0000000
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ast-node-types.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ast-node-types.d.ts","sourceRoot":"","sources":["../../src/ts-estree/ast-node-types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ast-node-types.js b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ast-node-types.js
deleted file mode 100644
index e1e723d..0000000
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ast-node-types.js
+++ /dev/null
@@ -1,185 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AST_NODE_TYPES;
-(function (AST_NODE_TYPES) {
-    AST_NODE_TYPES["ArrayExpression"] = "ArrayExpression";
-    AST_NODE_TYPES["ArrayPattern"] = "ArrayPattern";
-    AST_NODE_TYPES["ArrowFunctionExpression"] = "ArrowFunctionExpression";
-    AST_NODE_TYPES["AssignmentExpression"] = "AssignmentExpression";
-    AST_NODE_TYPES["AssignmentPattern"] = "AssignmentPattern";
-    AST_NODE_TYPES["AwaitExpression"] = "AwaitExpression";
-    AST_NODE_TYPES["BigIntLiteral"] = "BigIntLiteral";
-    AST_NODE_TYPES["BinaryExpression"] = "BinaryExpression";
-    AST_NODE_TYPES["BlockStatement"] = "BlockStatement";
-    AST_NODE_TYPES["BreakStatement"] = "BreakStatement";
-    AST_NODE_TYPES["CallExpression"] = "CallExpression";
-    AST_NODE_TYPES["CatchClause"] = "CatchClause";
-    AST_NODE_TYPES["ClassBody"] = "ClassBody";
-    AST_NODE_TYPES["ClassDeclaration"] = "ClassDeclaration";
-    AST_NODE_TYPES["ClassExpression"] = "ClassExpression";
-    AST_NODE_TYPES["ClassProperty"] = "ClassProperty";
-    AST_NODE_TYPES["ConditionalExpression"] = "ConditionalExpression";
-    AST_NODE_TYPES["ContinueStatement"] = "ContinueStatement";
-    AST_NODE_TYPES["DebuggerStatement"] = "DebuggerStatement";
-    AST_NODE_TYPES["Decorator"] = "Decorator";
-    AST_NODE_TYPES["DoWhileStatement"] = "DoWhileStatement";
-    AST_NODE_TYPES["EmptyStatement"] = "EmptyStatement";
-    AST_NODE_TYPES["ExportAllDeclaration"] = "ExportAllDeclaration";
-    AST_NODE_TYPES["ExportDefaultDeclaration"] = "ExportDefaultDeclaration";
-    AST_NODE_TYPES["ExportNamedDeclaration"] = "ExportNamedDeclaration";
-    AST_NODE_TYPES["ExportSpecifier"] = "ExportSpecifier";
-    AST_NODE_TYPES["ExpressionStatement"] = "ExpressionStatement";
-    AST_NODE_TYPES["ForInStatement"] = "ForInStatement";
-    AST_NODE_TYPES["ForOfStatement"] = "ForOfStatement";
-    AST_NODE_TYPES["ForStatement"] = "ForStatement";
-    AST_NODE_TYPES["FunctionDeclaration"] = "FunctionDeclaration";
-    AST_NODE_TYPES["FunctionExpression"] = "FunctionExpression";
-    AST_NODE_TYPES["Identifier"] = "Identifier";
-    AST_NODE_TYPES["IfStatement"] = "IfStatement";
-    AST_NODE_TYPES["Import"] = "Import";
-    AST_NODE_TYPES["ImportDeclaration"] = "ImportDeclaration";
-    AST_NODE_TYPES["ImportDefaultSpecifier"] = "ImportDefaultSpecifier";
-    AST_NODE_TYPES["ImportNamespaceSpecifier"] = "ImportNamespaceSpecifier";
-    AST_NODE_TYPES["ImportSpecifier"] = "ImportSpecifier";
-    AST_NODE_TYPES["JSXAttribute"] = "JSXAttribute";
-    AST_NODE_TYPES["JSXClosingElement"] = "JSXClosingElement";
-    AST_NODE_TYPES["JSXClosingFragment"] = "JSXClosingFragment";
-    AST_NODE_TYPES["JSXElement"] = "JSXElement";
-    AST_NODE_TYPES["JSXEmptyExpression"] = "JSXEmptyExpression";
-    AST_NODE_TYPES["JSXExpressionContainer"] = "JSXExpressionContainer";
-    AST_NODE_TYPES["JSXFragment"] = "JSXFragment";
-    AST_NODE_TYPES["JSXIdentifier"] = "JSXIdentifier";
-    AST_NODE_TYPES["JSXMemberExpression"] = "JSXMemberExpression";
-    AST_NODE_TYPES["JSXOpeningElement"] = "JSXOpeningElement";
-    AST_NODE_TYPES["JSXOpeningFragment"] = "JSXOpeningFragment";
-    AST_NODE_TYPES["JSXSpreadAttribute"] = "JSXSpreadAttribute";
-    AST_NODE_TYPES["JSXSpreadChild"] = "JSXSpreadChild";
-    AST_NODE_TYPES["JSXText"] = "JSXText";
-    AST_NODE_TYPES["LabeledStatement"] = "LabeledStatement";
-    AST_NODE_TYPES["Literal"] = "Literal";
-    AST_NODE_TYPES["LogicalExpression"] = "LogicalExpression";
-    AST_NODE_TYPES["MemberExpression"] = "MemberExpression";
-    AST_NODE_TYPES["MetaProperty"] = "MetaProperty";
-    AST_NODE_TYPES["MethodDefinition"] = "MethodDefinition";
-    AST_NODE_TYPES["NewExpression"] = "NewExpression";
-    AST_NODE_TYPES["ObjectExpression"] = "ObjectExpression";
-    AST_NODE_TYPES["ObjectPattern"] = "ObjectPattern";
-    AST_NODE_TYPES["OptionalCallExpression"] = "OptionalCallExpression";
-    AST_NODE_TYPES["OptionalMemberExpression"] = "OptionalMemberExpression";
-    AST_NODE_TYPES["Program"] = "Program";
-    AST_NODE_TYPES["Property"] = "Property";
-    AST_NODE_TYPES["RestElement"] = "RestElement";
-    AST_NODE_TYPES["ReturnStatement"] = "ReturnStatement";
-    AST_NODE_TYPES["SequenceExpression"] = "SequenceExpression";
-    AST_NODE_TYPES["SpreadElement"] = "SpreadElement";
-    AST_NODE_TYPES["Super"] = "Super";
-    AST_NODE_TYPES["SwitchCase"] = "SwitchCase";
-    AST_NODE_TYPES["SwitchStatement"] = "SwitchStatement";
-    AST_NODE_TYPES["TaggedTemplateExpression"] = "TaggedTemplateExpression";
-    AST_NODE_TYPES["TemplateElement"] = "TemplateElement";
-    AST_NODE_TYPES["TemplateLiteral"] = "TemplateLiteral";
-    AST_NODE_TYPES["ThisExpression"] = "ThisExpression";
-    AST_NODE_TYPES["ThrowStatement"] = "ThrowStatement";
-    AST_NODE_TYPES["TryStatement"] = "TryStatement";
-    AST_NODE_TYPES["UnaryExpression"] = "UnaryExpression";
-    AST_NODE_TYPES["UpdateExpression"] = "UpdateExpression";
-    AST_NODE_TYPES["VariableDeclaration"] = "VariableDeclaration";
-    AST_NODE_TYPES["VariableDeclarator"] = "VariableDeclarator";
-    AST_NODE_TYPES["WhileStatement"] = "WhileStatement";
-    AST_NODE_TYPES["WithStatement"] = "WithStatement";
-    AST_NODE_TYPES["YieldExpression"] = "YieldExpression";
-    /**
-     * TS-prefixed nodes
-     */
-    AST_NODE_TYPES["TSAbstractClassProperty"] = "TSAbstractClassProperty";
-    AST_NODE_TYPES["TSAbstractKeyword"] = "TSAbstractKeyword";
-    AST_NODE_TYPES["TSAbstractMethodDefinition"] = "TSAbstractMethodDefinition";
-    AST_NODE_TYPES["TSAnyKeyword"] = "TSAnyKeyword";
-    AST_NODE_TYPES["TSArrayType"] = "TSArrayType";
-    AST_NODE_TYPES["TSAsExpression"] = "TSAsExpression";
-    AST_NODE_TYPES["TSAsyncKeyword"] = "TSAsyncKeyword";
-    AST_NODE_TYPES["TSBooleanKeyword"] = "TSBooleanKeyword";
-    AST_NODE_TYPES["TSBigIntKeyword"] = "TSBigIntKeyword";
-    AST_NODE_TYPES["TSConditionalType"] = "TSConditionalType";
-    AST_NODE_TYPES["TSConstructorType"] = "TSConstructorType";
-    AST_NODE_TYPES["TSCallSignatureDeclaration"] = "TSCallSignatureDeclaration";
-    AST_NODE_TYPES["TSClassImplements"] = "TSClassImplements";
-    AST_NODE_TYPES["TSConstructSignatureDeclaration"] = "TSConstructSignatureDeclaration";
-    AST_NODE_TYPES["TSDeclareKeyword"] = "TSDeclareKeyword";
-    AST_NODE_TYPES["TSDeclareFunction"] = "TSDeclareFunction";
-    AST_NODE_TYPES["TSEmptyBodyFunctionExpression"] = "TSEmptyBodyFunctionExpression";
-    AST_NODE_TYPES["TSEnumDeclaration"] = "TSEnumDeclaration";
-    AST_NODE_TYPES["TSEnumMember"] = "TSEnumMember";
-    AST_NODE_TYPES["TSExportAssignment"] = "TSExportAssignment";
-    AST_NODE_TYPES["TSExportKeyword"] = "TSExportKeyword";
-    AST_NODE_TYPES["TSExternalModuleReference"] = "TSExternalModuleReference";
-    AST_NODE_TYPES["TSImportType"] = "TSImportType";
-    AST_NODE_TYPES["TSInferType"] = "TSInferType";
-    AST_NODE_TYPES["TSLiteralType"] = "TSLiteralType";
-    AST_NODE_TYPES["TSIndexedAccessType"] = "TSIndexedAccessType";
-    AST_NODE_TYPES["TSIndexSignature"] = "TSIndexSignature";
-    AST_NODE_TYPES["TSInterfaceBody"] = "TSInterfaceBody";
-    AST_NODE_TYPES["TSInterfaceDeclaration"] = "TSInterfaceDeclaration";
-    AST_NODE_TYPES["TSInterfaceHeritage"] = "TSInterfaceHeritage";
-    AST_NODE_TYPES["TSImportEqualsDeclaration"] = "TSImportEqualsDeclaration";
-    AST_NODE_TYPES["TSFunctionType"] = "TSFunctionType";
-    AST_NODE_TYPES["TSMethodSignature"] = "TSMethodSignature";
-    AST_NODE_TYPES["TSModuleBlock"] = "TSModuleBlock";
-    AST_NODE_TYPES["TSModuleDeclaration"] = "TSModuleDeclaration";
-    AST_NODE_TYPES["TSNamespaceExportDeclaration"] = "TSNamespaceExportDeclaration";
-    AST_NODE_TYPES["TSNonNullExpression"] = "TSNonNullExpression";
-    AST_NODE_TYPES["TSNeverKeyword"] = "TSNeverKeyword";
-    AST_NODE_TYPES["TSNullKeyword"] = "TSNullKeyword";
-    AST_NODE_TYPES["TSNumberKeyword"] = "TSNumberKeyword";
-    AST_NODE_TYPES["TSMappedType"] = "TSMappedType";
-    AST_NODE_TYPES["TSObjectKeyword"] = "TSObjectKeyword";
-    AST_NODE_TYPES["TSParameterProperty"] = "TSParameterProperty";
-    AST_NODE_TYPES["TSPrivateKeyword"] = "TSPrivateKeyword";
-    AST_NODE_TYPES["TSPropertySignature"] = "TSPropertySignature";
-    AST_NODE_TYPES["TSProtectedKeyword"] = "TSProtectedKeyword";
-    AST_NODE_TYPES["TSPublicKeyword"] = "TSPublicKeyword";
-    AST_NODE_TYPES["TSQualifiedName"] = "TSQualifiedName";
-    AST_NODE_TYPES["TSReadonlyKeyword"] = "TSReadonlyKeyword";
-    AST_NODE_TYPES["TSRestType"] = "TSRestType";
-    AST_NODE_TYPES["TSStaticKeyword"] = "TSStaticKeyword";
-    AST_NODE_TYPES["TSStringKeyword"] = "TSStringKeyword";
-    AST_NODE_TYPES["TSSymbolKeyword"] = "TSSymbolKeyword";
-    AST_NODE_TYPES["TSThisType"] = "TSThisType";
-    AST_NODE_TYPES["TSTypeAnnotation"] = "TSTypeAnnotation";
-    AST_NODE_TYPES["TSTypeAliasDeclaration"] = "TSTypeAliasDeclaration";
-    AST_NODE_TYPES["TSTypeAssertion"] = "TSTypeAssertion";
-    AST_NODE_TYPES["TSTypeLiteral"] = "TSTypeLiteral";
-    AST_NODE_TYPES["TSTypeOperator"] = "TSTypeOperator";
-    AST_NODE_TYPES["TSTypeParameter"] = "TSTypeParameter";
-    AST_NODE_TYPES["TSTypeParameterDeclaration"] = "TSTypeParameterDeclaration";
-    AST_NODE_TYPES["TSTypeParameterInstantiation"] = "TSTypeParameterInstantiation";
-    AST_NODE_TYPES["TSTypePredicate"] = "TSTypePredicate";
-    AST_NODE_TYPES["TSTypeReference"] = "TSTypeReference";
-    AST_NODE_TYPES["TSTypeQuery"] = "TSTypeQuery";
-    AST_NODE_TYPES["TSIntersectionType"] = "TSIntersectionType";
-    AST_NODE_TYPES["TSTupleType"] = "TSTupleType";
-    AST_NODE_TYPES["TSOptionalType"] = "TSOptionalType";
-    AST_NODE_TYPES["TSParenthesizedType"] = "TSParenthesizedType";
-    AST_NODE_TYPES["TSUnionType"] = "TSUnionType";
-    AST_NODE_TYPES["TSUndefinedKeyword"] = "TSUndefinedKeyword";
-    AST_NODE_TYPES["TSUnknownKeyword"] = "TSUnknownKeyword";
-    AST_NODE_TYPES["TSVoidKeyword"] = "TSVoidKeyword";
-})(AST_NODE_TYPES = exports.AST_NODE_TYPES || (exports.AST_NODE_TYPES = {}));
-var AST_TOKEN_TYPES;
-(function (AST_TOKEN_TYPES) {
-    AST_TOKEN_TYPES["Boolean"] = "Boolean";
-    AST_TOKEN_TYPES["Identifier"] = "Identifier";
-    AST_TOKEN_TYPES["JSXIdentifier"] = "JSXIdentifier";
-    AST_TOKEN_TYPES["JSXText"] = "JSXText";
-    AST_TOKEN_TYPES["Keyword"] = "Keyword";
-    AST_TOKEN_TYPES["Null"] = "Null";
-    AST_TOKEN_TYPES["Numeric"] = "Numeric";
-    AST_TOKEN_TYPES["Punctuator"] = "Punctuator";
-    AST_TOKEN_TYPES["RegularExpression"] = "RegularExpression";
-    AST_TOKEN_TYPES["String"] = "String";
-    AST_TOKEN_TYPES["Template"] = "Template";
-    // comment types
-    AST_TOKEN_TYPES["Block"] = "Block";
-    AST_TOKEN_TYPES["Line"] = "Line";
-})(AST_TOKEN_TYPES = exports.AST_TOKEN_TYPES || (exports.AST_TOKEN_TYPES = {}));
-//# sourceMappingURL=ast-node-types.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ast-node-types.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ast-node-types.js.map
deleted file mode 100644
index cdb2576..0000000
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ast-node-types.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ast-node-types.js","sourceRoot":"","sources":["../../src/ts-estree/ast-node-types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts
index 0cbb78f..c3aa41b 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts
@@ -1,7 +1,6 @@
-import { TSNode } from './ts-nodes';
-import { AST_NODE_TYPES } from './ast-node-types';
-import { Node } from './ts-estree';
+import { AST_NODE_TYPES, TSESTree } from '@typescript-eslint/types';
 import * as ts from 'typescript';
+import { TSNode } from './ts-nodes';
 export interface EstreeToTsNodeTypes {
     [AST_NODE_TYPES.ArrayExpression]: ts.ArrayLiteralExpression;
     [AST_NODE_TYPES.ArrayPattern]: ts.ArrayLiteralExpression | ts.ArrayBindingPattern;
@@ -9,12 +8,12 @@
     [AST_NODE_TYPES.AssignmentExpression]: ts.BinaryExpression;
     [AST_NODE_TYPES.AssignmentPattern]: ts.ShorthandPropertyAssignment | ts.BindingElement | ts.BinaryExpression | ts.ParameterDeclaration;
     [AST_NODE_TYPES.AwaitExpression]: ts.AwaitExpression;
-    [AST_NODE_TYPES.BigIntLiteral]: ts.BigIntLiteral;
     [AST_NODE_TYPES.BinaryExpression]: ts.BinaryExpression;
     [AST_NODE_TYPES.BlockStatement]: ts.Block;
     [AST_NODE_TYPES.BreakStatement]: ts.BreakStatement;
     [AST_NODE_TYPES.CallExpression]: ts.CallExpression;
     [AST_NODE_TYPES.CatchClause]: ts.CatchClause;
+    [AST_NODE_TYPES.ChainExpression]: ts.CallExpression | ts.PropertyAccessExpression | ts.ElementAccessExpression | ts.NonNullExpression;
     [AST_NODE_TYPES.ClassBody]: ts.ClassDeclaration | ts.ClassExpression;
     [AST_NODE_TYPES.ClassDeclaration]: ts.ClassDeclaration;
     [AST_NODE_TYPES.ClassExpression]: ts.ClassExpression;
@@ -37,9 +36,9 @@
     [AST_NODE_TYPES.FunctionExpression]: ts.FunctionExpression | ts.ConstructorDeclaration | ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.MethodDeclaration;
     [AST_NODE_TYPES.Identifier]: ts.Identifier | ts.ConstructorDeclaration | ts.Token<ts.SyntaxKind.NewKeyword | ts.SyntaxKind.ImportKeyword>;
     [AST_NODE_TYPES.IfStatement]: ts.IfStatement;
-    [AST_NODE_TYPES.Import]: ts.ImportExpression;
     [AST_NODE_TYPES.ImportDeclaration]: ts.ImportDeclaration;
     [AST_NODE_TYPES.ImportDefaultSpecifier]: ts.ImportClause;
+    [AST_NODE_TYPES.ImportExpression]: ts.CallExpression;
     [AST_NODE_TYPES.ImportNamespaceSpecifier]: ts.NamespaceImport;
     [AST_NODE_TYPES.ImportSpecifier]: ts.ImportSpecifier;
     [AST_NODE_TYPES.JSXAttribute]: ts.JsxAttribute;
@@ -57,7 +56,7 @@
     [AST_NODE_TYPES.JSXMemberExpression]: ts.PropertyAccessExpression;
     [AST_NODE_TYPES.JSXText]: ts.JsxText;
     [AST_NODE_TYPES.LabeledStatement]: ts.LabeledStatement;
-    [AST_NODE_TYPES.Literal]: ts.StringLiteral | ts.NumericLiteral | ts.RegularExpressionLiteral | ts.JsxText | ts.NullLiteral | ts.BooleanLiteral;
+    [AST_NODE_TYPES.Literal]: ts.StringLiteral | ts.NumericLiteral | ts.RegularExpressionLiteral | ts.JsxText | ts.NullLiteral | ts.BooleanLiteral | ts.BigIntLiteral;
     [AST_NODE_TYPES.LogicalExpression]: ts.BinaryExpression;
     [AST_NODE_TYPES.MemberExpression]: ts.PropertyAccessExpression | ts.ElementAccessExpression;
     [AST_NODE_TYPES.MetaProperty]: ts.MetaProperty;
@@ -65,8 +64,6 @@
     [AST_NODE_TYPES.NewExpression]: ts.NewExpression;
     [AST_NODE_TYPES.ObjectExpression]: ts.ObjectLiteralExpression;
     [AST_NODE_TYPES.ObjectPattern]: ts.ObjectLiteralExpression | ts.ObjectBindingPattern;
-    [AST_NODE_TYPES.OptionalCallExpression]: ts.CallExpression;
-    [AST_NODE_TYPES.OptionalMemberExpression]: ts.PropertyAccessExpression | ts.ElementAccessExpression;
     [AST_NODE_TYPES.Program]: ts.SourceFile;
     [AST_NODE_TYPES.Property]: ts.PropertyAssignment | ts.ShorthandPropertyAssignment | ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.MethodDeclaration | ts.BindingElement;
     [AST_NODE_TYPES.RestElement]: ts.BindingElement | ts.SpreadAssignment | ts.SpreadElement | ts.ParameterDeclaration;
@@ -111,6 +108,7 @@
     [AST_NODE_TYPES.TSMethodSignature]: ts.MethodSignature;
     [AST_NODE_TYPES.TSModuleBlock]: ts.ModuleBlock;
     [AST_NODE_TYPES.TSModuleDeclaration]: ts.ModuleDeclaration;
+    [AST_NODE_TYPES.TSNamedTupleMember]: ts.NamedTupleMember;
     [AST_NODE_TYPES.TSNamespaceExportDeclaration]: ts.NamespaceExportDeclaration;
     [AST_NODE_TYPES.TSNonNullExpression]: ts.NonNullExpression;
     [AST_NODE_TYPES.TSOptionalType]: ts.OptionalTypeNode;
@@ -118,7 +116,7 @@
     [AST_NODE_TYPES.TSParenthesizedType]: ts.ParenthesizedTypeNode;
     [AST_NODE_TYPES.TSPropertySignature]: ts.PropertySignature;
     [AST_NODE_TYPES.TSQualifiedName]: ts.QualifiedName;
-    [AST_NODE_TYPES.TSRestType]: ts.RestTypeNode;
+    [AST_NODE_TYPES.TSRestType]: ts.RestTypeNode | ts.NamedTupleMember;
     [AST_NODE_TYPES.TSThisType]: ts.ThisTypeNode;
     [AST_NODE_TYPES.TSTupleType]: ts.TupleTypeNode;
     [AST_NODE_TYPES.TSTypeAliasDeclaration]: ts.TypeAliasDeclaration;
@@ -167,5 +165,5 @@
  * Maps TSESTree AST Node type to the expected TypeScript AST Node type(s).
  * This mapping is based on the internal logic of the parser.
  */
-export declare type TSESTreeToTSNode<T extends Node = Node> = Extract<TSNode | ts.Token<ts.SyntaxKind.NewKeyword | ts.SyntaxKind.ImportKeyword>, EstreeToTsNodeTypes[T['type']]>;
+export declare type TSESTreeToTSNode<T extends TSESTree.Node = TSESTree.Node> = Extract<TSNode | ts.Token<ts.SyntaxKind.NewKeyword | ts.SyntaxKind.ImportKeyword>, EstreeToTsNodeTypes[T['type']]>;
 //# sourceMappingURL=estree-to-ts-node-types.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts.map
index 5f9a976..8704471 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"estree-to-ts-node-types.d.ts","sourceRoot":"","sources":["../../src/ts-estree/estree-to-ts-node-types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"estree-to-ts-node-types.d.ts","sourceRoot":"","sources":["../../src/ts-estree/estree-to-ts-node-types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js
index 04cd0fc..1a133cd 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js
@@ -1,4 +1,4 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-const ast_node_types_1 = require("./ast-node-types");
+const types_1 = require("@typescript-eslint/types");
 //# sourceMappingURL=estree-to-ts-node-types.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js.map
index bb7fe26..b48e0fd 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js.map
@@ -1 +1 @@
-{"version":3,"file":"estree-to-ts-node-types.js","sourceRoot":"","sources":["../../src/ts-estree/estree-to-ts-node-types.ts"],"names":[],"mappings":";;AACA,qDAAkD"}
\ No newline at end of file
+{"version":3,"file":"estree-to-ts-node-types.js","sourceRoot":"","sources":["../../src/ts-estree/estree-to-ts-node-types.ts"],"names":[],"mappings":";;AAAA,oDAAoE"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts
index 2a01139..37f26a3 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts
@@ -1,6 +1,4 @@
-import * as TSESTree from './ts-estree';
-export { TSESTree };
-export * from './ast-node-types';
+export { AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree, } from '@typescript-eslint/types';
 export * from './ts-nodes';
 export * from './estree-to-ts-node-types';
 //# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts.map
index 8c3e424..6a839dc 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ts-estree/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,2BAA2B,CAAC"}
\ No newline at end of file
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ts-estree/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,eAAe,EACf,QAAQ,GACT,MAAM,0BAA0B,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,2BAA2B,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js
index e844b61..7f93802 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js
@@ -1,16 +1,21 @@
 "use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
-    return result;
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
 };
 Object.defineProperty(exports, "__esModule", { value: true });
-const TSESTree = __importStar(require("./ts-estree"));
-exports.TSESTree = TSESTree;
-__export(require("./ast-node-types"));
+exports.TSESTree = exports.AST_TOKEN_TYPES = exports.AST_NODE_TYPES = void 0;
+// for simplicity and backwards-compatibility
+var types_1 = require("@typescript-eslint/types");
+Object.defineProperty(exports, "AST_NODE_TYPES", { enumerable: true, get: function () { return types_1.AST_NODE_TYPES; } });
+Object.defineProperty(exports, "AST_TOKEN_TYPES", { enumerable: true, get: function () { return types_1.AST_TOKEN_TYPES; } });
+Object.defineProperty(exports, "TSESTree", { enumerable: true, get: function () { return types_1.TSESTree; } });
+__exportStar(require("./ts-nodes"), exports);
+__exportStar(require("./estree-to-ts-node-types"), exports);
 //# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js.map
index 0b84b6d..5325d5d 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ts-estree/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sDAAwC;AAE/B,4BAAQ;AACjB,sCAAiC"}
\ No newline at end of file
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ts-estree/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,6CAA6C;AAC7C,kDAIkC;AAHhC,uGAAA,cAAc,OAAA;AACd,wGAAA,eAAe,OAAA;AACf,iGAAA,QAAQ,OAAA;AAEV,6CAA2B;AAC3B,4DAA0C"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-estree.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-estree.d.ts
deleted file mode 100644
index cf8b2f9..0000000
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-estree.d.ts
+++ /dev/null
@@ -1,1064 +0,0 @@
-import { AST_NODE_TYPES, AST_TOKEN_TYPES } from './ast-node-types';
-export interface LineAndColumnData {
-    /**
-     * Line number (1-indexed)
-     */
-    line: number;
-    /**
-     * Column number on the line (0-indexed)
-     */
-    column: number;
-}
-export interface SourceLocation {
-    /**
-     * The position of the first character of the parsed source region
-     */
-    start: LineAndColumnData;
-    /**
-     * The position of the first character after the parsed source region
-     */
-    end: LineAndColumnData;
-}
-export declare type Range = [number, number];
-export interface BaseNode {
-    /**
-     * The source location information of the node.
-     */
-    loc: SourceLocation;
-    /**
-     * An array of two numbers.
-     * Both numbers are a 0-based index which is the position in the array of source code characters.
-     * The first is the start position of the node, the second is the end position of the node.
-     */
-    range: Range;
-    /**
-     * The parent node of the current node
-     */
-    parent?: Node;
-}
-interface BaseToken extends BaseNode {
-    value: string;
-}
-export interface BooleanToken extends BaseToken {
-    type: AST_TOKEN_TYPES.Boolean;
-}
-export interface IdentifierToken extends BaseToken {
-    type: AST_TOKEN_TYPES.Identifier;
-}
-export interface JSXIdentifierToken extends BaseToken {
-    type: AST_TOKEN_TYPES.JSXIdentifier;
-}
-export interface JSXTextToken extends BaseToken {
-    type: AST_TOKEN_TYPES.JSXText;
-}
-export interface KeywordToken extends BaseToken {
-    type: AST_TOKEN_TYPES.Keyword;
-}
-export interface NullToken extends BaseToken {
-    type: AST_TOKEN_TYPES.Null;
-}
-export interface NumericToken extends BaseToken {
-    type: AST_TOKEN_TYPES.Numeric;
-}
-export interface PunctuatorToken extends BaseToken {
-    type: AST_TOKEN_TYPES.Punctuator;
-}
-export interface RegularExpressionToken extends BaseToken {
-    type: AST_TOKEN_TYPES.RegularExpression;
-    regex: {
-        pattern: string;
-        flags: string;
-    };
-}
-export interface StringToken extends BaseToken {
-    type: AST_TOKEN_TYPES.String;
-}
-export interface TemplateToken extends BaseToken {
-    type: AST_TOKEN_TYPES.Template;
-}
-export interface BlockComment extends BaseToken {
-    type: AST_TOKEN_TYPES.Block;
-}
-export interface LineComment extends BaseToken {
-    type: AST_TOKEN_TYPES.Line;
-}
-export declare type Comment = BlockComment | LineComment;
-export declare type Token = BooleanToken | IdentifierToken | JSXIdentifierToken | JSXTextToken | KeywordToken | NullToken | NumericToken | PunctuatorToken | RegularExpressionToken | StringToken | TemplateToken;
-export declare type OptionalRangeAndLoc<T> = Pick<T, Exclude<keyof T, 'range' | 'loc'>> & {
-    range?: Range;
-    loc?: SourceLocation;
-};
-export declare type Node = ArrayExpression | ArrayPattern | ArrowFunctionExpression | AssignmentExpression | AssignmentPattern | AwaitExpression | BigIntLiteral | BinaryExpression | BlockStatement | BreakStatement | CallExpression | CatchClause | ClassBody | ClassDeclaration | ClassExpression | ClassProperty | ConditionalExpression | ContinueStatement | DebuggerStatement | Decorator | DoWhileStatement | EmptyStatement | ExportAllDeclaration | ExportDefaultDeclaration | ExportNamedDeclaration | ExportSpecifier | ExpressionStatement | ForInStatement | ForOfStatement | ForStatement | FunctionDeclaration | FunctionExpression | Identifier | IfStatement | Import | ImportDeclaration | ImportDefaultSpecifier | ImportNamespaceSpecifier | ImportSpecifier | JSXAttribute | JSXClosingElement | JSXClosingFragment | JSXElement | JSXEmptyExpression | JSXExpressionContainer | JSXFragment | JSXIdentifier | JSXOpeningElement | JSXOpeningFragment | JSXSpreadAttribute | JSXSpreadChild | JSXMemberExpression | JSXText | LabeledStatement | Literal | LogicalExpression | MemberExpression | MetaProperty | MethodDefinition | NewExpression | ObjectExpression | ObjectPattern | OptionalCallExpression | OptionalMemberExpression | Program | Property | RestElement | ReturnStatement | SequenceExpression | SpreadElement | Super | SwitchCase | SwitchStatement | TaggedTemplateExpression | TemplateElement | TemplateLiteral | ThisExpression | ThrowStatement | TryStatement | TSAbstractClassProperty | TSAbstractKeyword | TSAbstractMethodDefinition | TSAnyKeyword | TSArrayType | TSAsExpression | TSAsyncKeyword | TSBigIntKeyword | TSBooleanKeyword | TSCallSignatureDeclaration | TSClassImplements | TSConditionalType | TSConstructorType | TSConstructSignatureDeclaration | TSDeclareFunction | TSDeclareKeyword | TSEmptyBodyFunctionExpression | TSEnumDeclaration | TSEnumMember | TSExportAssignment | TSExportKeyword | TSExternalModuleReference | TSFunctionType | TSImportEqualsDeclaration | TSImportType | TSIndexedAccessType | TSIndexSignature | TSInferType | TSInterfaceDeclaration | TSInterfaceBody | TSInterfaceHeritage | TSIntersectionType | TSLiteralType | TSMappedType | TSMethodSignature | TSModuleBlock | TSModuleDeclaration | TSNamespaceExportDeclaration | TSNeverKeyword | TSNonNullExpression | TSNullKeyword | TSNumberKeyword | TSObjectKeyword | TSOptionalType | TSParameterProperty | TSParenthesizedType | TSPropertySignature | TSPublicKeyword | TSPrivateKeyword | TSProtectedKeyword | TSQualifiedName | TSReadonlyKeyword | TSRestType | TSStaticKeyword | TSStringKeyword | TSSymbolKeyword | TSThisType | TSTupleType | TSTypeAliasDeclaration | TSTypeAnnotation | TSTypeAssertion | TSTypeLiteral | TSTypeOperator | TSTypeParameter | TSTypeParameterDeclaration | TSTypeParameterInstantiation | TSTypePredicate | TSTypeQuery | TSTypeReference | TSUndefinedKeyword | TSUnionType | TSUnknownKeyword | TSVoidKeyword | UpdateExpression | UnaryExpression | VariableDeclaration | VariableDeclarator | WhileStatement | WithStatement | YieldExpression;
-export declare type Accessibility = 'public' | 'protected' | 'private';
-export declare type BindingPattern = ArrayPattern | ObjectPattern;
-export declare type BindingName = BindingPattern | Identifier;
-export declare type ClassElement = ClassProperty | FunctionExpression | MethodDefinition | TSAbstractClassProperty | TSAbstractMethodDefinition | TSEmptyBodyFunctionExpression | TSIndexSignature;
-export declare type ClassProperty = ClassPropertyComputedName | ClassPropertyNonComputedName;
-export declare type DeclarationStatement = ClassDeclaration | ClassExpression | ExportDefaultDeclaration | ExportAllDeclaration | ExportNamedDeclaration | FunctionDeclaration | TSDeclareFunction | TSImportEqualsDeclaration | TSInterfaceDeclaration | TSModuleDeclaration | TSNamespaceExportDeclaration | TSTypeAliasDeclaration | TSEnumDeclaration;
-export declare type EntityName = Identifier | TSQualifiedName;
-export declare type ExportDeclaration = ClassDeclaration | ClassExpression | FunctionDeclaration | TSDeclareFunction | TSEnumDeclaration | TSInterfaceDeclaration | TSModuleDeclaration | TSTypeAliasDeclaration | VariableDeclaration;
-export declare type Expression = ArrowFunctionExpression | AssignmentExpression | BinaryExpression | ConditionalExpression | JSXClosingElement | JSXClosingFragment | JSXExpressionContainer | JSXOpeningElement | JSXOpeningFragment | JSXSpreadChild | LogicalExpression | NewExpression | RestElement | SequenceExpression | SpreadElement | TSAsExpression | TSUnaryExpression | YieldExpression;
-export declare type ExpressionWithTypeArguments = TSClassImplements | TSInterfaceHeritage;
-export declare type ForInitialiser = Expression | VariableDeclaration;
-export declare type ImportClause = ImportDefaultSpecifier | ImportNamespaceSpecifier | ImportSpecifier;
-export declare type IterationStatement = DoWhileStatement | ForInStatement | ForOfStatement | ForStatement | WhileStatement;
-export declare type JSXChild = JSXElement | JSXExpression | JSXFragment | JSXText;
-export declare type JSXExpression = JSXEmptyExpression | JSXSpreadChild | JSXExpressionContainer;
-export declare type JSXTagNameExpression = JSXIdentifier | JSXMemberExpression;
-export declare type LeftHandSideExpression = CallExpression | ClassExpression | ClassDeclaration | FunctionExpression | LiteralExpression | MemberExpression | OptionalCallExpression | OptionalMemberExpression | PrimaryExpression | TaggedTemplateExpression | TSNonNullExpression | TSAsExpression;
-export declare type Literal = BooleanLiteral | NumberLiteral | NullLiteral | RegExpLiteral | StringLiteral;
-export declare type LiteralExpression = BigIntLiteral | Literal | TemplateLiteral;
-export declare type MemberExpression = MemberExpressionComputedName | MemberExpressionNonComputedName;
-export declare type MethodDefinition = MethodDefinitionComputedName | MethodDefinitionNonComputedName;
-export declare type Modifier = TSAbstractKeyword | TSAsyncKeyword | TSDeclareKeyword | TSExportKeyword | TSPublicKeyword | TSPrivateKeyword | TSProtectedKeyword | TSReadonlyKeyword | TSStaticKeyword;
-export declare type ObjectLiteralElementLike = MethodDefinition | Property | SpreadElement | TSAbstractMethodDefinition;
-export declare type OptionalMemberExpression = OptionalMemberExpressionComputedName | OptionalMemberExpressionNonComputedName;
-export declare type Parameter = AssignmentPattern | RestElement | ArrayPattern | ObjectPattern | Identifier | TSParameterProperty;
-export declare type DestructuringPattern = Identifier | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | MemberExpression;
-export declare type PrimaryExpression = ArrayExpression | ArrayPattern | ClassExpression | FunctionExpression | Identifier | Import | JSXElement | JSXFragment | JSXOpeningElement | Literal | LiteralExpression | MetaProperty | ObjectExpression | ObjectPattern | Super | TemplateLiteral | ThisExpression | TSNullKeyword;
-export declare type Property = PropertyComputedName | PropertyNonComputedName;
-export declare type PropertyName = PropertyNameComputed | PropertyNameNonComputed;
-export declare type PropertyNameComputed = Expression;
-export declare type PropertyNameNonComputed = Identifier | StringLiteral | NumberLiteral;
-export declare type Statement = BlockStatement | BreakStatement | ContinueStatement | DebuggerStatement | DeclarationStatement | EmptyStatement | ExpressionStatement | IfStatement | IterationStatement | ImportDeclaration | LabeledStatement | TSModuleBlock | ReturnStatement | SwitchStatement | ThrowStatement | TryStatement | VariableDeclaration | WithStatement;
-export declare type TSAbstractClassProperty = TSAbstractClassPropertyComputedName | TSAbstractClassPropertyNonComputedName;
-export declare type TSAbstractMethodDefinition = TSAbstractMethodDefinitionComputedName | TSAbstractMethodDefinitionNonComputedName;
-export declare type TSMethodSignature = TSMethodSignatureComputedName | TSMethodSignatureNonComputedName;
-export declare type TSPropertySignature = TSPropertySignatureComputedName | TSPropertySignatureNonComputedName;
-export declare type TSEnumMember = TSEnumMemberComputedName | TSEnumMemberNonComputedName;
-export declare type TSUnaryExpression = AwaitExpression | LeftHandSideExpression | TSTypeAssertion | UnaryExpression | UpdateExpression;
-export declare type TypeElement = TSCallSignatureDeclaration | TSConstructSignatureDeclaration | TSIndexSignature | TSMethodSignature | TSPropertySignature;
-export declare type TypeNode = ThisExpression | TSAnyKeyword | TSArrayType | TSBigIntKeyword | TSBooleanKeyword | TSClassImplements | TSConditionalType | TSConstructorType | TSFunctionType | TSImportType | TSIndexedAccessType | TSInferType | TSInterfaceHeritage | TSIntersectionType | TSLiteralType | TSMappedType | TSNeverKeyword | TSNullKeyword | TSNumberKeyword | TSObjectKeyword | TSOptionalType | TSParenthesizedType | TSRestType | TSStringKeyword | TSSymbolKeyword | TSThisType | TSTupleType | TSTypeLiteral | TSTypeOperator | TSTypePredicate | TSTypeReference | TSTypeQuery | TSUndefinedKeyword | TSUnionType | TSUnknownKeyword | TSVoidKeyword;
-interface BinaryExpressionBase extends BaseNode {
-    operator: string;
-    left: Expression;
-    right: Expression;
-}
-interface CallExpressionBase extends BaseNode {
-    callee: LeftHandSideExpression;
-    arguments: Expression[];
-    typeParameters?: TSTypeParameterInstantiation;
-    optional: boolean;
-}
-interface ClassDeclarationBase extends BaseNode {
-    typeParameters?: TSTypeParameterDeclaration;
-    superTypeParameters?: TSTypeParameterInstantiation;
-    id: Identifier | null;
-    body: ClassBody;
-    superClass: LeftHandSideExpression | null;
-    implements?: ExpressionWithTypeArguments[];
-    abstract?: boolean;
-    declare?: boolean;
-    decorators?: Decorator[];
-}
-/** this should not be directly used - instead use ClassPropertyComputedNameBase or ClassPropertyNonComputedNameBase */
-interface ClassPropertyBase extends BaseNode {
-    key: PropertyName;
-    value: Expression | null;
-    computed: boolean;
-    static: boolean;
-    declare: boolean;
-    readonly?: boolean;
-    decorators?: Decorator[];
-    accessibility?: Accessibility;
-    optional?: boolean;
-    definite?: boolean;
-    typeAnnotation?: TSTypeAnnotation;
-}
-interface ClassPropertyComputedNameBase extends ClassPropertyBase {
-    key: PropertyNameComputed;
-    computed: true;
-}
-interface ClassPropertyNonComputedNameBase extends ClassPropertyBase {
-    key: PropertyNameNonComputed;
-    computed: false;
-}
-interface FunctionDeclarationBase extends BaseNode {
-    id: Identifier | null;
-    generator: boolean;
-    expression: boolean;
-    async: boolean;
-    params: Parameter[];
-    body?: BlockStatement | null;
-    returnType?: TSTypeAnnotation;
-    typeParameters?: TSTypeParameterDeclaration;
-    declare?: boolean;
-}
-interface FunctionSignatureBase extends BaseNode {
-    params: Parameter[];
-    returnType?: TSTypeAnnotation;
-    typeParameters?: TSTypeParameterDeclaration;
-}
-interface LiteralBase extends BaseNode {
-    raw: string;
-    value: boolean | number | RegExp | string | null;
-    regex?: {
-        pattern: string;
-        flags: string;
-    };
-}
-/** this should not be directly used - instead use MemberExpressionComputedNameBase or MemberExpressionNonComputedNameBase */
-interface MemberExpressionBase extends BaseNode {
-    object: LeftHandSideExpression;
-    property: Expression | Identifier;
-    computed: boolean;
-    optional: boolean;
-}
-interface MemberExpressionComputedNameBase extends MemberExpressionBase {
-    property: Expression;
-    computed: true;
-}
-interface MemberExpressionNonComputedNameBase extends MemberExpressionBase {
-    property: Identifier;
-    computed: false;
-}
-/** this should not be directly used - instead use MethodDefinitionComputedNameBase or MethodDefinitionNonComputedNameBase */
-interface MethodDefinitionBase extends BaseNode {
-    key: PropertyName;
-    value: FunctionExpression | TSEmptyBodyFunctionExpression;
-    computed: boolean;
-    static: boolean;
-    kind: 'method' | 'get' | 'set' | 'constructor';
-    decorators?: Decorator[];
-    accessibility?: Accessibility;
-    typeParameters?: TSTypeParameterDeclaration;
-}
-interface MethodDefinitionComputedNameBase extends MethodDefinitionBase {
-    key: PropertyNameComputed;
-    computed: true;
-}
-interface MethodDefinitionNonComputedNameBase extends MethodDefinitionBase {
-    key: PropertyNameNonComputed;
-    computed: false;
-}
-interface PropertyBase extends BaseNode {
-    type: AST_NODE_TYPES.Property;
-    key: PropertyName;
-    value: Expression | AssignmentPattern | BindingName;
-    computed: boolean;
-    method: boolean;
-    shorthand: boolean;
-    kind: 'init' | 'get' | 'set';
-}
-interface TSEnumMemberBase extends BaseNode {
-    type: AST_NODE_TYPES.TSEnumMember;
-    id: PropertyNameNonComputed | PropertyNameComputed;
-    initializer?: Expression;
-    computed?: boolean;
-}
-interface TSHeritageBase extends BaseNode {
-    expression: Expression;
-    typeParameters?: TSTypeParameterInstantiation;
-}
-interface TSMethodSignatureBase extends BaseNode {
-    type: AST_NODE_TYPES.TSMethodSignature;
-    key: PropertyName;
-    computed: boolean;
-    params: Parameter[];
-    optional?: boolean;
-    returnType?: TSTypeAnnotation;
-    readonly?: boolean;
-    typeParameters?: TSTypeParameterDeclaration;
-    accessibility?: Accessibility;
-    export?: boolean;
-    static?: boolean;
-}
-interface TSPropertySignatureBase extends BaseNode {
-    type: AST_NODE_TYPES.TSPropertySignature;
-    key: PropertyName;
-    optional?: boolean;
-    computed: boolean;
-    typeAnnotation?: TSTypeAnnotation;
-    initializer?: Expression;
-    readonly?: boolean;
-    static?: boolean;
-    export?: boolean;
-    accessibility?: Accessibility;
-}
-interface UnaryExpressionBase extends BaseNode {
-    operator: string;
-    prefix: boolean;
-    argument: LeftHandSideExpression | Literal | UnaryExpression;
-}
-export interface ArrayExpression extends BaseNode {
-    type: AST_NODE_TYPES.ArrayExpression;
-    elements: Expression[];
-}
-export interface ArrayPattern extends BaseNode {
-    type: AST_NODE_TYPES.ArrayPattern;
-    elements: (DestructuringPattern | null)[];
-    typeAnnotation?: TSTypeAnnotation;
-    optional?: boolean;
-    decorators?: Decorator[];
-}
-export interface ArrowFunctionExpression extends BaseNode {
-    type: AST_NODE_TYPES.ArrowFunctionExpression;
-    generator: boolean;
-    id: null;
-    params: Parameter[];
-    body: Expression | BlockStatement;
-    async: boolean;
-    expression: boolean;
-    returnType?: TSTypeAnnotation;
-    typeParameters?: TSTypeParameterDeclaration;
-}
-export interface AssignmentExpression extends BinaryExpressionBase {
-    type: AST_NODE_TYPES.AssignmentExpression;
-}
-export interface AssignmentPattern extends BaseNode {
-    type: AST_NODE_TYPES.AssignmentPattern;
-    left: BindingName;
-    right?: Expression;
-    typeAnnotation?: TSTypeAnnotation;
-    optional?: boolean;
-    decorators?: Decorator[];
-}
-export interface AwaitExpression extends BaseNode {
-    type: AST_NODE_TYPES.AwaitExpression;
-    argument: TSUnaryExpression;
-}
-export interface BigIntLiteral extends LiteralBase {
-    type: AST_NODE_TYPES.BigIntLiteral;
-}
-export interface BinaryExpression extends BinaryExpressionBase {
-    type: AST_NODE_TYPES.BinaryExpression;
-}
-export interface BlockStatement extends BaseNode {
-    type: AST_NODE_TYPES.BlockStatement;
-    body: Statement[];
-}
-export interface BooleanLiteral extends LiteralBase {
-    type: AST_NODE_TYPES.Literal;
-    value: boolean;
-}
-export interface BreakStatement extends BaseNode {
-    type: AST_NODE_TYPES.BreakStatement;
-    label: Identifier | null;
-}
-export interface CallExpression extends CallExpressionBase {
-    type: AST_NODE_TYPES.CallExpression;
-    optional: false;
-}
-export interface CatchClause extends BaseNode {
-    type: AST_NODE_TYPES.CatchClause;
-    param: BindingName | null;
-    body: BlockStatement;
-}
-export interface ClassBody extends BaseNode {
-    type: AST_NODE_TYPES.ClassBody;
-    body: ClassElement[];
-}
-export interface ClassDeclaration extends ClassDeclarationBase {
-    type: AST_NODE_TYPES.ClassDeclaration;
-}
-export interface ClassExpression extends ClassDeclarationBase {
-    type: AST_NODE_TYPES.ClassExpression;
-}
-export interface ClassPropertyComputedName extends ClassPropertyComputedNameBase {
-    type: AST_NODE_TYPES.ClassProperty;
-}
-export interface ClassPropertyNonComputedName extends ClassPropertyNonComputedNameBase {
-    type: AST_NODE_TYPES.ClassProperty;
-}
-export interface ConditionalExpression extends BaseNode {
-    type: AST_NODE_TYPES.ConditionalExpression;
-    test: Expression;
-    consequent: Expression;
-    alternate: Expression;
-}
-export interface ContinueStatement extends BaseNode {
-    type: AST_NODE_TYPES.ContinueStatement;
-    label: Identifier | null;
-}
-export interface DebuggerStatement extends BaseNode {
-    type: AST_NODE_TYPES.DebuggerStatement;
-}
-export interface Decorator extends BaseNode {
-    type: AST_NODE_TYPES.Decorator;
-    expression: LeftHandSideExpression;
-}
-export interface DoWhileStatement extends BaseNode {
-    type: AST_NODE_TYPES.DoWhileStatement;
-    test: Expression;
-    body: Statement;
-}
-export interface EmptyStatement extends BaseNode {
-    type: AST_NODE_TYPES.EmptyStatement;
-}
-export interface ExportAllDeclaration extends BaseNode {
-    type: AST_NODE_TYPES.ExportAllDeclaration;
-    source: Expression | null;
-}
-export interface ExportDefaultDeclaration extends BaseNode {
-    type: AST_NODE_TYPES.ExportDefaultDeclaration;
-    declaration: ExportDeclaration | Expression;
-}
-export interface ExportNamedDeclaration extends BaseNode {
-    type: AST_NODE_TYPES.ExportNamedDeclaration;
-    declaration: ExportDeclaration | null;
-    specifiers: ExportSpecifier[];
-    source: Expression | null;
-}
-export interface ExportSpecifier extends BaseNode {
-    type: AST_NODE_TYPES.ExportSpecifier;
-    local: Identifier;
-    exported: Identifier;
-}
-export interface ExpressionStatement extends BaseNode {
-    type: AST_NODE_TYPES.ExpressionStatement;
-    expression: Expression;
-    directive?: string;
-}
-export interface ForInStatement extends BaseNode {
-    type: AST_NODE_TYPES.ForInStatement;
-    left: ForInitialiser;
-    right: Expression;
-    body: Statement;
-}
-export interface ForOfStatement extends BaseNode {
-    type: AST_NODE_TYPES.ForOfStatement;
-    left: ForInitialiser;
-    right: Expression;
-    body: Statement;
-    await: boolean;
-}
-export interface ForStatement extends BaseNode {
-    type: AST_NODE_TYPES.ForStatement;
-    init: Expression | ForInitialiser | null;
-    test: Expression | null;
-    update: Expression | null;
-    body: Statement;
-}
-export interface FunctionDeclaration extends FunctionDeclarationBase {
-    type: AST_NODE_TYPES.FunctionDeclaration;
-    body: BlockStatement;
-}
-export interface FunctionExpression extends FunctionDeclarationBase {
-    type: AST_NODE_TYPES.FunctionExpression;
-}
-export interface Identifier extends BaseNode {
-    type: AST_NODE_TYPES.Identifier;
-    name: string;
-    typeAnnotation?: TSTypeAnnotation;
-    optional?: boolean;
-    decorators?: Decorator[];
-}
-export interface IfStatement extends BaseNode {
-    type: AST_NODE_TYPES.IfStatement;
-    test: Expression;
-    consequent: Statement;
-    alternate: Statement | null;
-}
-export interface Import extends BaseNode {
-    type: AST_NODE_TYPES.Import;
-}
-export interface ImportDeclaration extends BaseNode {
-    type: AST_NODE_TYPES.ImportDeclaration;
-    source: Literal;
-    specifiers: ImportClause[];
-}
-export interface ImportDefaultSpecifier extends BaseNode {
-    type: AST_NODE_TYPES.ImportDefaultSpecifier;
-    local: Identifier;
-}
-export interface ImportNamespaceSpecifier extends BaseNode {
-    type: AST_NODE_TYPES.ImportNamespaceSpecifier;
-    local: Identifier;
-}
-export interface ImportSpecifier extends BaseNode {
-    type: AST_NODE_TYPES.ImportSpecifier;
-    local: Identifier;
-    imported: Identifier;
-}
-export interface JSXAttribute extends BaseNode {
-    type: AST_NODE_TYPES.JSXAttribute;
-    name: JSXIdentifier;
-    value: Literal | JSXExpression | null;
-}
-export interface JSXClosingElement extends BaseNode {
-    type: AST_NODE_TYPES.JSXClosingElement;
-    name: JSXTagNameExpression;
-}
-export interface JSXClosingFragment extends BaseNode {
-    type: AST_NODE_TYPES.JSXClosingFragment;
-}
-export interface JSXElement extends BaseNode {
-    type: AST_NODE_TYPES.JSXElement;
-    openingElement: JSXOpeningElement;
-    closingElement: JSXClosingElement | null;
-    children: JSXChild[];
-}
-export interface JSXEmptyExpression extends BaseNode {
-    type: AST_NODE_TYPES.JSXEmptyExpression;
-}
-export interface JSXExpressionContainer extends BaseNode {
-    type: AST_NODE_TYPES.JSXExpressionContainer;
-    expression: Expression | JSXEmptyExpression;
-}
-export interface JSXFragment extends BaseNode {
-    type: AST_NODE_TYPES.JSXFragment;
-    openingFragment: JSXOpeningFragment;
-    closingFragment: JSXClosingFragment;
-    children: JSXChild[];
-}
-export interface JSXIdentifier extends BaseNode {
-    type: AST_NODE_TYPES.JSXIdentifier;
-    name: string;
-}
-export interface JSXMemberExpression extends BaseNode {
-    type: AST_NODE_TYPES.JSXMemberExpression;
-    object: JSXTagNameExpression;
-    property: JSXIdentifier;
-}
-export interface JSXOpeningElement extends BaseNode {
-    type: AST_NODE_TYPES.JSXOpeningElement;
-    typeParameters?: TSTypeParameterInstantiation;
-    selfClosing: boolean;
-    name: JSXTagNameExpression;
-    attributes: JSXAttribute[];
-}
-export interface JSXOpeningFragment extends BaseNode {
-    type: AST_NODE_TYPES.JSXOpeningFragment;
-}
-export interface JSXSpreadAttribute extends BaseNode {
-    type: AST_NODE_TYPES.JSXSpreadAttribute;
-    argument: Expression;
-}
-export interface JSXSpreadChild extends BaseNode {
-    type: AST_NODE_TYPES.JSXSpreadChild;
-    expression: Expression | JSXEmptyExpression;
-}
-export interface JSXText extends BaseNode {
-    type: AST_NODE_TYPES.JSXText;
-    value: string;
-    raw: string;
-}
-export interface LabeledStatement extends BaseNode {
-    type: AST_NODE_TYPES.LabeledStatement;
-    label: Identifier;
-    body: Statement;
-}
-export interface LogicalExpression extends BinaryExpressionBase {
-    type: AST_NODE_TYPES.LogicalExpression;
-}
-export interface MemberExpressionComputedName extends MemberExpressionComputedNameBase {
-    type: AST_NODE_TYPES.MemberExpression;
-    optional: false;
-}
-export interface MemberExpressionNonComputedName extends MemberExpressionNonComputedNameBase {
-    type: AST_NODE_TYPES.MemberExpression;
-    optional: false;
-}
-export interface MetaProperty extends BaseNode {
-    type: AST_NODE_TYPES.MetaProperty;
-    meta: Identifier;
-    property: Identifier;
-}
-export interface MethodDefinitionComputedName extends MethodDefinitionComputedNameBase {
-    type: AST_NODE_TYPES.MethodDefinition;
-}
-export interface MethodDefinitionNonComputedName extends MethodDefinitionNonComputedNameBase {
-    type: AST_NODE_TYPES.MethodDefinition;
-}
-export interface NewExpression extends BaseNode {
-    type: AST_NODE_TYPES.NewExpression;
-    callee: LeftHandSideExpression;
-    arguments: Expression[];
-    typeParameters?: TSTypeParameterInstantiation;
-}
-export interface NumberLiteral extends LiteralBase {
-    type: AST_NODE_TYPES.Literal;
-    value: number;
-}
-export interface NullLiteral extends LiteralBase {
-    type: AST_NODE_TYPES.Literal;
-    value: null;
-}
-export interface ObjectExpression extends BaseNode {
-    type: AST_NODE_TYPES.ObjectExpression;
-    properties: ObjectLiteralElementLike[];
-}
-export interface ObjectPattern extends BaseNode {
-    type: AST_NODE_TYPES.ObjectPattern;
-    properties: (Property | RestElement)[];
-    typeAnnotation?: TSTypeAnnotation;
-    optional?: boolean;
-    decorators?: Decorator[];
-}
-export interface OptionalCallExpression extends CallExpressionBase {
-    type: AST_NODE_TYPES.OptionalCallExpression;
-    optional: boolean;
-}
-export interface OptionalMemberExpressionComputedName extends MemberExpressionComputedNameBase {
-    type: AST_NODE_TYPES.OptionalMemberExpression;
-    optional: boolean;
-}
-export interface OptionalMemberExpressionNonComputedName extends MemberExpressionNonComputedNameBase {
-    type: AST_NODE_TYPES.OptionalMemberExpression;
-    optional: boolean;
-}
-export interface Program extends BaseNode {
-    type: AST_NODE_TYPES.Program;
-    body: Statement[];
-    sourceType: 'module' | 'script';
-    comments?: Comment[];
-    tokens?: Token[];
-}
-export interface PropertyComputedName extends PropertyBase {
-    key: PropertyNameComputed;
-    computed: true;
-}
-export interface PropertyNonComputedName extends PropertyBase {
-    key: PropertyNameNonComputed;
-    computed: false;
-}
-export interface RegExpLiteral extends LiteralBase {
-    type: AST_NODE_TYPES.Literal;
-    value: RegExp;
-}
-export interface RestElement extends BaseNode {
-    type: AST_NODE_TYPES.RestElement;
-    argument: DestructuringPattern;
-    typeAnnotation?: TSTypeAnnotation;
-    optional?: boolean;
-    value?: AssignmentPattern;
-    decorators?: Decorator[];
-}
-export interface ReturnStatement extends BaseNode {
-    type: AST_NODE_TYPES.ReturnStatement;
-    argument: Expression | null;
-}
-export interface SequenceExpression extends BaseNode {
-    type: AST_NODE_TYPES.SequenceExpression;
-    expressions: Expression[];
-}
-export interface SpreadElement extends BaseNode {
-    type: AST_NODE_TYPES.SpreadElement;
-    argument: Expression;
-}
-export interface StringLiteral extends LiteralBase {
-    type: AST_NODE_TYPES.Literal;
-    value: string;
-}
-export interface Super extends BaseNode {
-    type: AST_NODE_TYPES.Super;
-}
-export interface SwitchCase extends BaseNode {
-    type: AST_NODE_TYPES.SwitchCase;
-    test: Expression | null;
-    consequent: Statement[];
-}
-export interface SwitchStatement extends BaseNode {
-    type: AST_NODE_TYPES.SwitchStatement;
-    discriminant: Expression;
-    cases: SwitchCase[];
-}
-export interface TaggedTemplateExpression extends BaseNode {
-    type: AST_NODE_TYPES.TaggedTemplateExpression;
-    typeParameters?: TSTypeParameterInstantiation;
-    tag: LeftHandSideExpression;
-    quasi: TemplateLiteral;
-}
-export interface TemplateElement extends BaseNode {
-    type: AST_NODE_TYPES.TemplateElement;
-    value: {
-        raw: string;
-        cooked: string;
-    };
-    tail: boolean;
-}
-export interface TemplateLiteral extends BaseNode {
-    type: AST_NODE_TYPES.TemplateLiteral;
-    quasis: TemplateElement[];
-    expressions: Expression[];
-}
-export interface ThisExpression extends BaseNode {
-    type: AST_NODE_TYPES.ThisExpression;
-}
-export interface ThrowStatement extends BaseNode {
-    type: AST_NODE_TYPES.ThrowStatement;
-    argument: Statement | TSAsExpression | null;
-}
-export interface TryStatement extends BaseNode {
-    type: AST_NODE_TYPES.TryStatement;
-    block: BlockStatement;
-    handler: CatchClause | null;
-    finalizer: BlockStatement;
-}
-export interface TSAbstractClassPropertyComputedName extends ClassPropertyComputedNameBase {
-    type: AST_NODE_TYPES.TSAbstractClassProperty;
-}
-export interface TSAbstractClassPropertyNonComputedName extends ClassPropertyNonComputedNameBase {
-    type: AST_NODE_TYPES.TSAbstractClassProperty;
-}
-export interface TSAbstractKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSAbstractKeyword;
-}
-export interface TSAbstractMethodDefinitionComputedName extends MethodDefinitionComputedNameBase {
-    type: AST_NODE_TYPES.TSAbstractMethodDefinition;
-}
-export interface TSAbstractMethodDefinitionNonComputedName extends MethodDefinitionNonComputedNameBase {
-    type: AST_NODE_TYPES.TSAbstractMethodDefinition;
-}
-export interface TSAnyKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSAnyKeyword;
-}
-export interface TSArrayType extends BaseNode {
-    type: AST_NODE_TYPES.TSArrayType;
-    elementType: TypeNode;
-}
-export interface TSAsExpression extends BaseNode {
-    type: AST_NODE_TYPES.TSAsExpression;
-    expression: Expression;
-    typeAnnotation: TypeNode;
-}
-export interface TSAsyncKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSAsyncKeyword;
-}
-export interface TSBigIntKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSBigIntKeyword;
-}
-export interface TSBooleanKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSBooleanKeyword;
-}
-export interface TSCallSignatureDeclaration extends FunctionSignatureBase {
-    type: AST_NODE_TYPES.TSCallSignatureDeclaration;
-}
-export interface TSClassImplements extends TSHeritageBase {
-    type: AST_NODE_TYPES.TSClassImplements;
-}
-export interface TSConditionalType extends BaseNode {
-    type: AST_NODE_TYPES.TSConditionalType;
-    checkType: TypeNode;
-    extendsType: TypeNode;
-    trueType: TypeNode;
-    falseType: TypeNode;
-}
-export interface TSConstructorType extends FunctionSignatureBase {
-    type: AST_NODE_TYPES.TSConstructorType;
-}
-export interface TSConstructSignatureDeclaration extends FunctionSignatureBase {
-    type: AST_NODE_TYPES.TSConstructSignatureDeclaration;
-}
-export interface TSDeclareFunction extends FunctionDeclarationBase {
-    type: AST_NODE_TYPES.TSDeclareFunction;
-}
-export interface TSDeclareKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSDeclareKeyword;
-}
-export interface TSEmptyBodyFunctionExpression extends FunctionDeclarationBase {
-    type: AST_NODE_TYPES.TSEmptyBodyFunctionExpression;
-    body: null;
-}
-export interface TSEnumDeclaration extends BaseNode {
-    type: AST_NODE_TYPES.TSEnumDeclaration;
-    id: Identifier;
-    members: TSEnumMember[];
-    const?: boolean;
-    declare?: boolean;
-    modifiers?: Modifier[];
-    decorators?: Decorator[];
-}
-/**
- * this should only really happen in semantically invalid code (errors 1164 and 2452)
- *
- * VALID:
- * enum Foo { ['a'] }
- *
- * INVALID:
- * const x = 'a';
- * enum Foo { [x] }
- * enum Bar { ['a' + 'b'] }
- */
-export interface TSEnumMemberComputedName extends TSEnumMemberBase {
-    id: PropertyNameComputed;
-    computed: true;
-}
-export interface TSEnumMemberNonComputedName extends TSEnumMemberBase {
-    id: PropertyNameNonComputed;
-    computed?: false;
-}
-export interface TSExportAssignment extends BaseNode {
-    type: AST_NODE_TYPES.TSExportAssignment;
-    expression: Expression;
-}
-export interface TSExportKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSExportKeyword;
-}
-export interface TSExternalModuleReference extends BaseNode {
-    type: AST_NODE_TYPES.TSExternalModuleReference;
-    expression: Expression;
-}
-export interface TSFunctionType extends FunctionSignatureBase {
-    type: AST_NODE_TYPES.TSFunctionType;
-}
-export interface TSImportEqualsDeclaration extends BaseNode {
-    type: AST_NODE_TYPES.TSImportEqualsDeclaration;
-    id: Identifier;
-    moduleReference: EntityName | TSExternalModuleReference;
-    isExport: boolean;
-}
-export interface TSImportType extends BaseNode {
-    type: AST_NODE_TYPES.TSImportType;
-    isTypeOf: boolean;
-    parameter: TypeNode;
-    qualifier: EntityName | null;
-    typeParameters: TSTypeParameterInstantiation | null;
-}
-export interface TSIndexedAccessType extends BaseNode {
-    type: AST_NODE_TYPES.TSIndexedAccessType;
-    objectType: TypeNode;
-    indexType: TypeNode;
-}
-export interface TSIndexSignature extends BaseNode {
-    type: AST_NODE_TYPES.TSIndexSignature;
-    parameters: Parameter[];
-    typeAnnotation?: TSTypeAnnotation;
-    readonly?: boolean;
-    accessibility?: Accessibility;
-    export?: boolean;
-    static?: boolean;
-}
-export interface TSInferType extends BaseNode {
-    type: AST_NODE_TYPES.TSInferType;
-    typeParameter: TSTypeParameterDeclaration;
-}
-export interface TSInterfaceDeclaration extends BaseNode {
-    type: AST_NODE_TYPES.TSInterfaceDeclaration;
-    body: TSInterfaceBody;
-    id: Identifier;
-    typeParameters?: TSTypeParameterDeclaration;
-    extends?: ExpressionWithTypeArguments[];
-    implements?: ExpressionWithTypeArguments[];
-    decorators?: Decorator[];
-    abstract?: boolean;
-    declare?: boolean;
-}
-export interface TSInterfaceBody extends BaseNode {
-    type: AST_NODE_TYPES.TSInterfaceBody;
-    body: TypeElement[];
-}
-export interface TSInterfaceHeritage extends TSHeritageBase {
-    type: AST_NODE_TYPES.TSInterfaceHeritage;
-}
-export interface TSIntersectionType extends BaseNode {
-    type: AST_NODE_TYPES.TSIntersectionType;
-    types: TypeNode[];
-}
-export interface TSLiteralType extends BaseNode {
-    type: AST_NODE_TYPES.TSLiteralType;
-    literal: LiteralExpression | UnaryExpression | UpdateExpression;
-}
-export interface TSMappedType extends BaseNode {
-    type: AST_NODE_TYPES.TSMappedType;
-    typeParameter: TSTypeParameterDeclaration;
-    readonly?: boolean | '-' | '+';
-    optional?: boolean | '-' | '+';
-    typeAnnotation?: TypeNode;
-}
-export interface TSMethodSignatureComputedName extends TSMethodSignatureBase {
-    key: PropertyNameComputed;
-    computed: true;
-}
-export interface TSMethodSignatureNonComputedName extends TSMethodSignatureBase {
-    key: PropertyNameNonComputed;
-    computed: false;
-}
-export interface TSModuleBlock extends BaseNode {
-    type: AST_NODE_TYPES.TSModuleBlock;
-    body: Statement[];
-}
-export interface TSModuleDeclaration extends BaseNode {
-    type: AST_NODE_TYPES.TSModuleDeclaration;
-    id: Identifier | Literal;
-    body?: TSModuleBlock | TSModuleDeclaration;
-    global?: boolean;
-    declare?: boolean;
-    modifiers?: Modifier[];
-}
-export interface TSNamespaceExportDeclaration extends BaseNode {
-    type: AST_NODE_TYPES.TSNamespaceExportDeclaration;
-    id: Identifier;
-}
-export interface TSNeverKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSNeverKeyword;
-}
-export interface TSNonNullExpression extends BaseNode {
-    type: AST_NODE_TYPES.TSNonNullExpression;
-    expression: Expression;
-}
-export interface TSNullKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSNullKeyword;
-}
-export interface TSNumberKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSNumberKeyword;
-}
-export interface TSObjectKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSObjectKeyword;
-}
-export interface TSOptionalType extends BaseNode {
-    type: AST_NODE_TYPES.TSOptionalType;
-    typeAnnotation: TypeNode;
-}
-export interface TSParameterProperty extends BaseNode {
-    type: AST_NODE_TYPES.TSParameterProperty;
-    accessibility?: Accessibility;
-    readonly?: boolean;
-    static?: boolean;
-    export?: boolean;
-    parameter: AssignmentPattern | BindingName | RestElement;
-    decorators?: Decorator[];
-}
-export interface TSParenthesizedType extends BaseNode {
-    type: AST_NODE_TYPES.TSParenthesizedType;
-    typeAnnotation: TypeNode;
-}
-export interface TSPropertySignatureComputedName extends TSPropertySignatureBase {
-    key: PropertyNameComputed;
-    computed: true;
-}
-export interface TSPropertySignatureNonComputedName extends TSPropertySignatureBase {
-    key: PropertyNameNonComputed;
-    computed: false;
-}
-export interface TSPublicKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSPublicKeyword;
-}
-export interface TSPrivateKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSPrivateKeyword;
-}
-export interface TSProtectedKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSProtectedKeyword;
-}
-export interface TSQualifiedName extends BaseNode {
-    type: AST_NODE_TYPES.TSQualifiedName;
-    left: EntityName;
-    right: Identifier;
-}
-export interface TSReadonlyKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSReadonlyKeyword;
-}
-export interface TSRestType extends BaseNode {
-    type: AST_NODE_TYPES.TSRestType;
-    typeAnnotation: TypeNode;
-}
-export interface TSStaticKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSStaticKeyword;
-}
-export interface TSStringKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSStringKeyword;
-}
-export interface TSSymbolKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSSymbolKeyword;
-}
-export interface TSThisType extends BaseNode {
-    type: AST_NODE_TYPES.TSThisType;
-}
-export interface TSTupleType extends BaseNode {
-    type: AST_NODE_TYPES.TSTupleType;
-    elementTypes: TypeNode[];
-}
-export interface TSTypeAliasDeclaration extends BaseNode {
-    type: AST_NODE_TYPES.TSTypeAliasDeclaration;
-    id: Identifier;
-    typeAnnotation: TypeNode;
-    declare?: boolean;
-    typeParameters?: TSTypeParameterDeclaration;
-}
-export interface TSTypeAnnotation extends BaseNode {
-    type: AST_NODE_TYPES.TSTypeAnnotation;
-    typeAnnotation: TypeNode;
-}
-export interface TSTypeAssertion extends BaseNode {
-    type: AST_NODE_TYPES.TSTypeAssertion;
-    typeAnnotation: TypeNode;
-    expression: Expression;
-}
-export interface TSTypeLiteral extends BaseNode {
-    type: AST_NODE_TYPES.TSTypeLiteral;
-    members: TypeElement[];
-}
-export interface TSTypeOperator extends BaseNode {
-    type: AST_NODE_TYPES.TSTypeOperator;
-    operator: 'keyof' | 'unique' | 'readonly';
-    typeAnnotation?: TypeNode;
-}
-export interface TSTypeParameter extends BaseNode {
-    type: AST_NODE_TYPES.TSTypeParameter;
-    name: Identifier;
-    constraint?: TypeNode;
-    default?: TypeNode;
-}
-export interface TSTypeParameterDeclaration extends BaseNode {
-    type: AST_NODE_TYPES.TSTypeParameterDeclaration;
-    params: TSTypeParameter[];
-}
-export interface TSTypeParameterInstantiation extends BaseNode {
-    type: AST_NODE_TYPES.TSTypeParameterInstantiation;
-    params: TypeNode[];
-}
-export interface TSTypePredicate extends BaseNode {
-    type: AST_NODE_TYPES.TSTypePredicate;
-    asserts: boolean;
-    parameterName: Identifier | TSThisType;
-    typeAnnotation: TSTypeAnnotation | null;
-}
-export interface TSTypeQuery extends BaseNode {
-    type: AST_NODE_TYPES.TSTypeQuery;
-    exprName: EntityName;
-}
-export interface TSTypeReference extends BaseNode {
-    type: AST_NODE_TYPES.TSTypeReference;
-    typeName: EntityName;
-    typeParameters?: TSTypeParameterInstantiation;
-}
-export interface TSUndefinedKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSUndefinedKeyword;
-}
-export interface TSUnionType extends BaseNode {
-    type: AST_NODE_TYPES.TSUnionType;
-    types: TypeNode[];
-}
-export interface TSUnknownKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSUnknownKeyword;
-}
-export interface TSVoidKeyword extends BaseNode {
-    type: AST_NODE_TYPES.TSVoidKeyword;
-}
-export interface UpdateExpression extends UnaryExpressionBase {
-    type: AST_NODE_TYPES.UpdateExpression;
-    operator: '++' | '--';
-}
-export interface UnaryExpression extends UnaryExpressionBase {
-    type: AST_NODE_TYPES.UnaryExpression;
-    operator: '+' | '-' | '!' | '~' | 'delete' | 'void' | 'typeof';
-}
-export interface VariableDeclaration extends BaseNode {
-    type: AST_NODE_TYPES.VariableDeclaration;
-    declarations: VariableDeclarator[];
-    kind: 'let' | 'const' | 'var';
-    declare?: boolean;
-}
-export interface VariableDeclarator extends BaseNode {
-    type: AST_NODE_TYPES.VariableDeclarator;
-    id: BindingName;
-    init: Expression | null;
-    definite?: boolean;
-}
-export interface WhileStatement extends BaseNode {
-    type: AST_NODE_TYPES.WhileStatement;
-    test: Expression;
-    body: Statement;
-}
-export interface WithStatement extends BaseNode {
-    type: AST_NODE_TYPES.WithStatement;
-    object: Expression;
-    body: Statement;
-}
-export interface YieldExpression extends BaseNode {
-    type: AST_NODE_TYPES.YieldExpression;
-    delegate: boolean;
-    argument?: Expression;
-}
-export {};
-//# sourceMappingURL=ts-estree.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-estree.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-estree.d.ts.map
deleted file mode 100644
index f8d1d32..0000000
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-estree.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ts-estree.d.ts","sourceRoot":"","sources":["../../src/ts-estree/ts-estree.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-estree.js b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-estree.js
deleted file mode 100644
index 47f7a01..0000000
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-estree.js
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=ts-estree.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-estree.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-estree.js.map
deleted file mode 100644
index 0b1c09c..0000000
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-estree.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ts-estree.js","sourceRoot":"","sources":["../../src/ts-estree/ts-estree.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts
index 1b72d58..8142fc4 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts
@@ -1,4 +1,8 @@
 import * as ts from 'typescript';
+declare module 'typescript' {
+    interface NamedTupleMember extends ts.Node {
+    }
+}
 export declare type TSToken = ts.Token<ts.SyntaxKind>;
-export declare type TSNode = ts.Node & (ts.Modifier | ts.Identifier | ts.QualifiedName | ts.ComputedPropertyName | ts.Decorator | ts.TypeParameterDeclaration | ts.CallSignatureDeclaration | ts.ConstructSignatureDeclaration | ts.VariableDeclaration | ts.VariableDeclarationList | ts.ParameterDeclaration | ts.BindingElement | ts.PropertySignature | ts.PropertyDeclaration | ts.PropertyAssignment | ts.ShorthandPropertyAssignment | ts.SpreadAssignment | ts.ObjectBindingPattern | ts.ArrayBindingPattern | ts.FunctionDeclaration | ts.MethodSignature | ts.MethodDeclaration | ts.ConstructorDeclaration | ts.SemicolonClassElement | ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.IndexSignatureDeclaration | ts.KeywordTypeNode | ts.ImportTypeNode | ts.ThisTypeNode | ts.ConstructorTypeNode | ts.FunctionTypeNode | ts.TypeReferenceNode | ts.TypePredicateNode | ts.TypeQueryNode | ts.TypeLiteralNode | ts.ArrayTypeNode | ts.TupleTypeNode | ts.OptionalTypeNode | ts.RestTypeNode | ts.UnionTypeNode | ts.IntersectionTypeNode | ts.ConditionalTypeNode | ts.InferTypeNode | ts.ParenthesizedTypeNode | ts.TypeOperatorNode | ts.IndexedAccessTypeNode | ts.MappedTypeNode | ts.LiteralTypeNode | ts.StringLiteral | ts.OmittedExpression | ts.PartiallyEmittedExpression | ts.PrefixUnaryExpression | ts.PostfixUnaryExpression | ts.NullLiteral | ts.BooleanLiteral | ts.ThisExpression | ts.SuperExpression | ts.ImportExpression | ts.DeleteExpression | ts.TypeOfExpression | ts.VoidExpression | ts.AwaitExpression | ts.YieldExpression | ts.SyntheticExpression | ts.BinaryExpression | ts.ConditionalExpression | ts.FunctionExpression | ts.ArrowFunction | ts.RegularExpressionLiteral | ts.NoSubstitutionTemplateLiteral | ts.NumericLiteral | ts.BigIntLiteral | ts.TemplateHead | ts.TemplateMiddle | ts.TemplateTail | ts.TemplateExpression | ts.TemplateSpan | ts.ParenthesizedExpression | ts.ArrayLiteralExpression | ts.SpreadElement | ts.ObjectLiteralExpression | ts.PropertyAccessExpression | ts.ElementAccessExpression | ts.CallExpression | ts.ExpressionWithTypeArguments | ts.NewExpression | ts.TaggedTemplateExpression | ts.AsExpression | ts.TypeAssertion | ts.NonNullExpression | ts.MetaProperty | ts.JsxElement | ts.JsxOpeningElement | ts.JsxSelfClosingElement | ts.JsxFragment | ts.JsxOpeningFragment | ts.JsxClosingFragment | ts.JsxAttribute | ts.JsxSpreadAttribute | ts.JsxClosingElement | ts.JsxExpression | ts.JsxText | ts.NotEmittedStatement | ts.CommaListExpression | ts.EmptyStatement | ts.DebuggerStatement | ts.MissingDeclaration | ts.Block | ts.VariableStatement | ts.ExpressionStatement | ts.IfStatement | ts.DoStatement | ts.WhileStatement | ts.ForStatement | ts.ForInStatement | ts.ForOfStatement | ts.BreakStatement | ts.ContinueStatement | ts.ReturnStatement | ts.WithStatement | ts.SwitchStatement | ts.CaseBlock | ts.CaseClause | ts.DefaultClause | ts.LabeledStatement | ts.ThrowStatement | ts.TryStatement | ts.CatchClause | ts.ClassDeclaration | ts.ClassExpression | ts.InterfaceDeclaration | ts.HeritageClause | ts.TypeAliasDeclaration | ts.EnumMember | ts.EnumDeclaration | ts.ModuleDeclaration | ts.ModuleBlock | ts.ImportEqualsDeclaration | ts.ExternalModuleReference | ts.ImportDeclaration | ts.ImportClause | ts.NamespaceImport | ts.NamespaceExportDeclaration | ts.ExportDeclaration | ts.NamedImports | ts.NamedExports | ts.ImportSpecifier | ts.ExportSpecifier | ts.ExportAssignment | ts.CommentRange | ts.SourceFile | ts.Bundle | ts.InputFiles | ts.UnparsedSource | ts.JsonMinusNumericLiteral | ts.JSDoc | ts.JSDocTypeExpression | ts.JSDocUnknownTag | ts.JSDocAugmentsTag | ts.JSDocClassTag | ts.JSDocEnumTag | ts.JSDocThisTag | ts.JSDocTemplateTag | ts.JSDocReturnTag | ts.JSDocTypeTag | ts.JSDocTypedefTag | ts.JSDocCallbackTag | ts.JSDocSignature | ts.JSDocPropertyTag | ts.JSDocParameterTag | ts.JSDocTypeLiteral | ts.JSDocFunctionType | ts.JSDocAllType | ts.JSDocUnknownType | ts.JSDocNullableType | ts.JSDocNonNullableType | ts.JSDocOptionalType | ts.JSDocVariadicType | ts.JSDocAuthorTag);
+export declare type TSNode = ts.Modifier | ts.Identifier | ts.QualifiedName | ts.ComputedPropertyName | ts.Decorator | ts.TypeParameterDeclaration | ts.CallSignatureDeclaration | ts.ConstructSignatureDeclaration | ts.VariableDeclaration | ts.VariableDeclarationList | ts.ParameterDeclaration | ts.BindingElement | ts.PropertySignature | ts.PropertyDeclaration | ts.PropertyAssignment | ts.ShorthandPropertyAssignment | ts.SpreadAssignment | ts.ObjectBindingPattern | ts.ArrayBindingPattern | ts.FunctionDeclaration | ts.MethodSignature | ts.MethodDeclaration | ts.ConstructorDeclaration | ts.SemicolonClassElement | ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.IndexSignatureDeclaration | ts.KeywordTypeNode | ts.ImportTypeNode | ts.ThisTypeNode | ts.ConstructorTypeNode | ts.FunctionTypeNode | ts.TypeReferenceNode | ts.TypePredicateNode | ts.TypeQueryNode | ts.TypeLiteralNode | ts.ArrayTypeNode | ts.NamedTupleMember | ts.TupleTypeNode | ts.OptionalTypeNode | ts.RestTypeNode | ts.UnionTypeNode | ts.IntersectionTypeNode | ts.ConditionalTypeNode | ts.InferTypeNode | ts.ParenthesizedTypeNode | ts.TypeOperatorNode | ts.IndexedAccessTypeNode | ts.MappedTypeNode | ts.LiteralTypeNode | ts.StringLiteral | ts.OmittedExpression | ts.PartiallyEmittedExpression | ts.PrefixUnaryExpression | ts.PostfixUnaryExpression | ts.NullLiteral | ts.BooleanLiteral | ts.ThisExpression | ts.SuperExpression | ts.ImportExpression | ts.DeleteExpression | ts.TypeOfExpression | ts.VoidExpression | ts.AwaitExpression | ts.YieldExpression | ts.SyntheticExpression | ts.BinaryExpression | ts.ConditionalExpression | ts.FunctionExpression | ts.ArrowFunction | ts.RegularExpressionLiteral | ts.NoSubstitutionTemplateLiteral | ts.NumericLiteral | ts.BigIntLiteral | ts.TemplateHead | ts.TemplateMiddle | ts.TemplateTail | ts.TemplateExpression | ts.TemplateSpan | ts.ParenthesizedExpression | ts.ArrayLiteralExpression | ts.SpreadElement | ts.ObjectLiteralExpression | ts.PropertyAccessExpression | ts.ElementAccessExpression | ts.CallExpression | ts.ExpressionWithTypeArguments | ts.NewExpression | ts.TaggedTemplateExpression | ts.AsExpression | ts.TypeAssertion | ts.NonNullExpression | ts.MetaProperty | ts.JsxElement | ts.JsxOpeningElement | ts.JsxSelfClosingElement | ts.JsxFragment | ts.JsxOpeningFragment | ts.JsxClosingFragment | ts.JsxAttribute | ts.JsxSpreadAttribute | ts.JsxClosingElement | ts.JsxExpression | ts.JsxText | ts.NotEmittedStatement | ts.CommaListExpression | ts.EmptyStatement | ts.DebuggerStatement | ts.MissingDeclaration | ts.Block | ts.VariableStatement | ts.ExpressionStatement | ts.IfStatement | ts.DoStatement | ts.WhileStatement | ts.ForStatement | ts.ForInStatement | ts.ForOfStatement | ts.BreakStatement | ts.ContinueStatement | ts.ReturnStatement | ts.WithStatement | ts.SwitchStatement | ts.CaseBlock | ts.CaseClause | ts.DefaultClause | ts.LabeledStatement | ts.ThrowStatement | ts.TryStatement | ts.CatchClause | ts.ClassDeclaration | ts.ClassExpression | ts.InterfaceDeclaration | ts.HeritageClause | ts.TypeAliasDeclaration | ts.EnumMember | ts.EnumDeclaration | ts.ModuleDeclaration | ts.ModuleBlock | ts.ImportEqualsDeclaration | ts.ExternalModuleReference | ts.ImportDeclaration | ts.ImportClause | ts.NamespaceImport | ts.NamespaceExportDeclaration | ts.ExportDeclaration | ts.NamedImports | ts.NamedExports | ts.ImportSpecifier | ts.ExportSpecifier | ts.ExportAssignment | ts.SourceFile | ts.Bundle | ts.InputFiles | ts.UnparsedSource | ts.JsonMinusNumericLiteral | ts.JSDoc | ts.JSDocTypeExpression | ts.JSDocUnknownTag | ts.JSDocAugmentsTag | ts.JSDocClassTag | ts.JSDocEnumTag | ts.JSDocThisTag | ts.JSDocTemplateTag | ts.JSDocReturnTag | ts.JSDocTypeTag | ts.JSDocTypedefTag | ts.JSDocCallbackTag | ts.JSDocSignature | ts.JSDocPropertyTag | ts.JSDocParameterTag | ts.JSDocTypeLiteral | ts.JSDocFunctionType | ts.JSDocAllType | ts.JSDocUnknownType | ts.JSDocNullableType | ts.JSDocNonNullableType | ts.JSDocOptionalType | ts.JSDocVariadicType | ts.JSDocAuthorTag;
 //# sourceMappingURL=ts-nodes.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts.map
index 16a4e63..aacaf81 100644
--- a/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts.map
+++ b/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts.map
@@ -1 +1 @@
-{"version":3,"file":"ts-nodes.d.ts","sourceRoot":"","sources":["../../src/ts-estree/ts-nodes.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"ts-nodes.d.ts","sourceRoot":"","sources":["../../src/ts-estree/ts-nodes.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/version-check.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/version-check.d.ts
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/version-check.d.ts
rename to node_modules/@typescript-eslint/typescript-estree/dist/version-check.d.ts
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/version-check.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/version-check.d.ts.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/version-check.d.ts.map
rename to node_modules/@typescript-eslint/typescript-estree/dist/version-check.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/version-check.js b/node_modules/@typescript-eslint/typescript-estree/dist/version-check.js
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/version-check.js
rename to node_modules/@typescript-eslint/typescript-estree/dist/version-check.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/version-check.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/version-check.js.map
similarity index 100%
rename from node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/version-check.js.map
rename to node_modules/@typescript-eslint/typescript-estree/dist/version-check.js.map
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/visitor-keys.d.ts b/node_modules/@typescript-eslint/typescript-estree/dist/visitor-keys.d.ts
deleted file mode 100644
index d119826..0000000
--- a/node_modules/@typescript-eslint/typescript-estree/dist/visitor-keys.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import * as eslintVisitorKeys from 'eslint-visitor-keys';
-export declare const visitorKeys: eslintVisitorKeys.VisitorKeys;
-//# sourceMappingURL=visitor-keys.d.ts.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/visitor-keys.d.ts.map b/node_modules/@typescript-eslint/typescript-estree/dist/visitor-keys.d.ts.map
deleted file mode 100644
index 6e7ea9e..0000000
--- a/node_modules/@typescript-eslint/typescript-estree/dist/visitor-keys.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"visitor-keys.d.ts","sourceRoot":"","sources":["../src/visitor-keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,iBAAiB,MAAM,qBAAqB,CAAC;AAEzD,eAAO,MAAM,WAAW,+BA2HtB,CAAC"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/visitor-keys.js b/node_modules/@typescript-eslint/typescript-estree/dist/visitor-keys.js
deleted file mode 100644
index 01e880e..0000000
--- a/node_modules/@typescript-eslint/typescript-estree/dist/visitor-keys.js
+++ /dev/null
@@ -1,134 +0,0 @@
-"use strict";
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result["default"] = mod;
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const eslintVisitorKeys = __importStar(require("eslint-visitor-keys"));
-exports.visitorKeys = eslintVisitorKeys.unionWith({
-    // Additional estree nodes.
-    Import: [],
-    // Additional Properties.
-    ArrayPattern: ['decorators', 'elements', 'typeAnnotation'],
-    ArrowFunctionExpression: ['typeParameters', 'params', 'returnType', 'body'],
-    ClassDeclaration: [
-        'decorators',
-        'id',
-        'typeParameters',
-        'superClass',
-        'superTypeParameters',
-        'implements',
-        'body',
-    ],
-    ClassExpression: [
-        'decorators',
-        'id',
-        'typeParameters',
-        'superClass',
-        'superTypeParameters',
-        'implements',
-        'body',
-    ],
-    TaggedTemplateExpression: ['tag', 'typeParameters', 'quasi'],
-    FunctionDeclaration: ['id', 'typeParameters', 'params', 'returnType', 'body'],
-    FunctionExpression: ['id', 'typeParameters', 'params', 'returnType', 'body'],
-    Identifier: ['decorators', 'typeAnnotation'],
-    MethodDefinition: ['decorators', 'key', 'value'],
-    ObjectPattern: ['decorators', 'properties', 'typeAnnotation'],
-    RestElement: ['decorators', 'argument', 'typeAnnotation'],
-    NewExpression: ['callee', 'typeParameters', 'arguments'],
-    CallExpression: ['callee', 'typeParameters', 'arguments'],
-    // JSX
-    JSXOpeningElement: ['name', 'typeParameters', 'attributes'],
-    JSXClosingFragment: [],
-    JSXOpeningFragment: [],
-    JSXSpreadChild: ['expression'],
-    // Additional Nodes.
-    BigIntLiteral: [],
-    ClassProperty: ['decorators', 'key', 'typeAnnotation', 'value'],
-    Decorator: ['expression'],
-    OptionalCallExpression: ['callee', 'typeParameters', 'arguments'],
-    OptionalMemberExpression: eslintVisitorKeys.KEYS.MemberExpression,
-    TSAbstractClassProperty: ['decorators', 'key', 'typeAnnotation', 'value'],
-    TSAbstractKeyword: [],
-    TSAbstractMethodDefinition: ['key', 'value'],
-    TSAnyKeyword: [],
-    TSArrayType: ['elementType'],
-    TSAsExpression: ['expression', 'typeAnnotation'],
-    TSAsyncKeyword: [],
-    TSBigIntKeyword: [],
-    TSBooleanKeyword: [],
-    TSCallSignatureDeclaration: ['typeParameters', 'params', 'returnType'],
-    TSClassImplements: ['expression', 'typeParameters'],
-    TSConditionalType: ['checkType', 'extendsType', 'trueType', 'falseType'],
-    TSConstructSignatureDeclaration: ['typeParameters', 'params', 'returnType'],
-    TSConstructorType: ['typeParameters', 'params', 'returnType'],
-    TSDeclareFunction: ['id', 'typeParameters', 'params', 'returnType', 'body'],
-    TSDeclareKeyword: [],
-    TSEmptyBodyFunctionExpression: [
-        'id',
-        'typeParameters',
-        'params',
-        'returnType',
-    ],
-    TSEnumDeclaration: ['id', 'members'],
-    TSEnumMember: ['id', 'initializer'],
-    TSExportAssignment: ['expression'],
-    TSExportKeyword: [],
-    TSExternalModuleReference: ['expression'],
-    TSImportType: ['parameter', 'qualifier', 'typeParameters'],
-    TSInferType: ['typeParameter'],
-    TSLiteralType: ['literal'],
-    TSIntersectionType: ['types'],
-    TSIndexedAccessType: ['indexType', 'objectType'],
-    TSIndexSignature: ['parameters', 'typeAnnotation'],
-    TSInterfaceBody: ['body'],
-    TSInterfaceDeclaration: ['id', 'typeParameters', 'extends', 'body'],
-    TSInterfaceHeritage: ['expression', 'typeParameters'],
-    TSImportEqualsDeclaration: ['id', 'moduleReference'],
-    TSFunctionType: ['typeParameters', 'params', 'returnType'],
-    TSMappedType: ['typeParameter', 'typeAnnotation'],
-    TSMethodSignature: ['typeParameters', 'key', 'params', 'returnType'],
-    TSModuleBlock: ['body'],
-    TSModuleDeclaration: ['id', 'body'],
-    TSNamespaceExportDeclaration: ['id'],
-    TSNonNullExpression: ['expression'],
-    TSNeverKeyword: [],
-    TSNullKeyword: [],
-    TSNumberKeyword: [],
-    TSObjectKeyword: [],
-    TSOptionalType: ['typeAnnotation'],
-    TSParameterProperty: ['decorators', 'parameter'],
-    TSParenthesizedType: ['typeAnnotation'],
-    TSPrivateKeyword: [],
-    TSPropertySignature: ['typeAnnotation', 'key', 'initializer'],
-    TSProtectedKeyword: [],
-    TSPublicKeyword: [],
-    TSQualifiedName: ['left', 'right'],
-    TSReadonlyKeyword: [],
-    TSRestType: ['typeAnnotation'],
-    TSStaticKeyword: [],
-    TSStringKeyword: [],
-    TSSymbolKeyword: [],
-    TSThisType: [],
-    TSTupleType: ['elementTypes'],
-    TSTypeAliasDeclaration: ['id', 'typeParameters', 'typeAnnotation'],
-    TSTypeAnnotation: ['typeAnnotation'],
-    TSTypeAssertion: ['typeAnnotation', 'expression'],
-    TSTypeLiteral: ['members'],
-    TSTypeOperator: ['typeAnnotation'],
-    TSTypeParameter: ['name', 'constraint', 'default'],
-    TSTypeParameterDeclaration: ['params'],
-    TSTypeParameterInstantiation: ['params'],
-    TSTypePredicate: ['typeAnnotation', 'parameterName'],
-    TSTypeReference: ['typeName', 'typeParameters'],
-    TSTypeQuery: ['exprName'],
-    TSUnionType: ['types'],
-    TSUndefinedKeyword: [],
-    TSUnknownKeyword: [],
-    TSVoidKeyword: [],
-});
-//# sourceMappingURL=visitor-keys.js.map
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/visitor-keys.js.map b/node_modules/@typescript-eslint/typescript-estree/dist/visitor-keys.js.map
deleted file mode 100644
index 061adf9..0000000
--- a/node_modules/@typescript-eslint/typescript-estree/dist/visitor-keys.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"visitor-keys.js","sourceRoot":"","sources":["../src/visitor-keys.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/@typescript-eslint/typescript-estree/node_modules/.bin/semver b/node_modules/@typescript-eslint/typescript-estree/node_modules/.bin/semver
index 501bb2f..bb49af1 120000
--- a/node_modules/@typescript-eslint/typescript-estree/node_modules/.bin/semver
+++ b/node_modules/@typescript-eslint/typescript-estree/node_modules/.bin/semver
@@ -1 +1 @@
-../../../../semver/bin/semver.js
\ No newline at end of file
+../../../../jest-circus/node_modules/semver/bin/semver.js
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/CHANGELOG.md b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/CHANGELOG.md
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/CHANGELOG.md
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/CHANGELOG.md
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/LICENSE b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/LICENSE
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/LICENSE
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/LICENSE
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/README.md b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/README.md
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/README.md
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/README.md
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/bin/semver.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/bin/semver.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/bin/semver.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/bin/semver.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/classes/comparator.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/classes/comparator.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/classes/comparator.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/classes/comparator.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/classes/index.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/classes/index.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/classes/index.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/classes/index.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/classes/range.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/classes/range.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/classes/range.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/classes/range.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/classes/semver.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/classes/semver.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/classes/semver.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/classes/semver.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/clean.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/clean.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/clean.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/clean.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/cmp.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/cmp.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/cmp.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/cmp.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/coerce.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/coerce.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/coerce.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/coerce.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/compare-build.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/compare-build.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/compare-build.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/compare-build.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/compare-loose.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/compare-loose.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/compare-loose.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/compare-loose.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/compare.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/compare.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/compare.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/compare.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/diff.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/diff.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/diff.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/diff.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/eq.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/eq.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/eq.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/eq.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/gt.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/gt.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/gt.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/gt.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/gte.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/gte.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/gte.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/gte.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/inc.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/inc.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/inc.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/inc.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/lt.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/lt.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/lt.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/lt.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/lte.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/lte.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/lte.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/lte.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/major.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/major.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/major.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/major.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/minor.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/minor.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/minor.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/minor.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/neq.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/neq.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/neq.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/neq.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/parse.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/parse.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/parse.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/parse.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/patch.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/patch.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/patch.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/patch.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/prerelease.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/prerelease.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/prerelease.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/prerelease.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/rcompare.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/rcompare.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/rcompare.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/rcompare.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/rsort.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/rsort.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/rsort.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/rsort.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/satisfies.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/satisfies.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/satisfies.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/satisfies.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/sort.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/sort.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/sort.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/sort.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/functions/valid.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/valid.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/functions/valid.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/functions/valid.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/index.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/index.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/index.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/index.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/internal/constants.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/internal/constants.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/internal/constants.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/internal/constants.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/internal/debug.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/internal/debug.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/internal/debug.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/internal/debug.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/internal/identifiers.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/internal/identifiers.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/internal/identifiers.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/internal/identifiers.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/internal/re.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/internal/re.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/internal/re.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/internal/re.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/package.json b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/package.json
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/package.json
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/package.json
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/preload.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/preload.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/preload.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/preload.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/range.bnf b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/range.bnf
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/range.bnf
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/range.bnf
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/gtr.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/gtr.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/ranges/gtr.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/gtr.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/intersects.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/intersects.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/ranges/intersects.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/intersects.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/ltr.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/ltr.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/ranges/ltr.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/ltr.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/max-satisfying.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/max-satisfying.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/ranges/max-satisfying.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/max-satisfying.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/min-satisfying.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/min-satisfying.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/ranges/min-satisfying.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/min-satisfying.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/min-version.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/min-version.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/ranges/min-version.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/min-version.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/outside.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/outside.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/ranges/outside.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/outside.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/simplify.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/simplify.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/ranges/simplify.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/simplify.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/subset.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/subset.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/ranges/subset.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/subset.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/to-comparators.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/to-comparators.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/ranges/to-comparators.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/to-comparators.js
diff --git a/node_modules/eslint-plugin-jest/node_modules/semver/ranges/valid.js b/node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/valid.js
similarity index 100%
copy from node_modules/eslint-plugin-jest/node_modules/semver/ranges/valid.js
copy to node_modules/@typescript-eslint/typescript-estree/node_modules/semver/ranges/valid.js
diff --git a/node_modules/@typescript-eslint/typescript-estree/package.json b/node_modules/@typescript-eslint/typescript-estree/package.json
index b4353db..840d2d0 100644
--- a/node_modules/@typescript-eslint/typescript-estree/package.json
+++ b/node_modules/@typescript-eslint/typescript-estree/package.json
@@ -1,16 +1,16 @@
 {
   "name": "@typescript-eslint/typescript-estree",
-  "version": "2.22.0",
+  "version": "4.3.0",
   "description": "A parser that converts TypeScript source code into an ESTree compatible form",
-  "main": "dist/parser.js",
-  "types": "dist/parser.d.ts",
+  "main": "dist/index.js",
+  "types": "dist/index.d.ts",
   "files": [
     "dist",
     "README.md",
     "LICENSE"
   ],
   "engines": {
-    "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
+    "node": "^10.12.0 || >=12.0.0"
   },
   "repository": {
     "type": "git",
@@ -32,34 +32,40 @@
   ],
   "scripts": {
     "build": "tsc -b tsconfig.build.json",
+    "postbuild": "downlevel-dts dist _ts3.4/dist",
     "clean": "tsc -b tsconfig.build.json --clean",
+    "postclean": "rimraf dist",
     "format": "prettier --write \"./**/*.{ts,js,json,md}\" --ignore-path ../../.prettierignore",
     "lint": "eslint . --ext .js,.ts --ignore-path='../../.eslintignore'",
     "test": "jest --coverage",
     "typecheck": "tsc -p tsconfig.json --noEmit"
   },
   "dependencies": {
+    "@typescript-eslint/types": "4.3.0",
+    "@typescript-eslint/visitor-keys": "4.3.0",
     "debug": "^4.1.1",
-    "eslint-visitor-keys": "^1.1.0",
-    "glob": "^7.1.6",
+    "globby": "^11.0.1",
     "is-glob": "^4.0.1",
     "lodash": "^4.17.15",
-    "semver": "^6.3.0",
+    "semver": "^7.3.2",
     "tsutils": "^3.17.1"
   },
   "devDependencies": {
-    "@babel/code-frame": "^7.8.3",
-    "@babel/parser": "^7.8.3",
-    "@babel/types": "^7.8.3",
+    "@babel/code-frame": "^7.10.4",
+    "@babel/parser": "^7.11.3",
+    "@babel/types": "^7.11.0",
     "@types/babel__code-frame": "^7.0.1",
-    "@types/debug": "^4.1.5",
-    "@types/glob": "^7.1.1",
+    "@types/debug": "*",
+    "@types/glob": "*",
     "@types/is-glob": "^4.0.1",
-    "@types/lodash": "^4.14.149",
-    "@types/semver": "^6.2.0",
-    "@types/tmp": "^0.1.0",
-    "@typescript-eslint/shared-fixtures": "2.22.0",
-    "tmp": "^0.1.0",
+    "@types/lodash": "*",
+    "@types/semver": "^7.1.0",
+    "@types/tmp": "^0.2.0",
+    "@typescript-eslint/shared-fixtures": "4.3.0",
+    "glob": "*",
+    "jest-specific-snapshot": "*",
+    "make-dir": "*",
+    "tmp": "^0.2.1",
     "typescript": "*"
   },
   "peerDependenciesMeta": {
@@ -71,5 +77,12 @@
     "type": "opencollective",
     "url": "https://opencollective.com/typescript-eslint"
   },
-  "gitHead": "5a097d316fb084dc4b13e87d68fe9bf43d8a9548"
+  "typesVersions": {
+    "<3.8": {
+      "*": [
+        "_ts3.4/*"
+      ]
+    }
+  },
+  "gitHead": "229631e6cd90bba8f509a6d49fec72fd7a576ccf"
 }
diff --git a/node_modules/@typescript-eslint/visitor-keys/CHANGELOG.md b/node_modules/@typescript-eslint/visitor-keys/CHANGELOG.md
index ef43303..4ef4cf6 100644
--- a/node_modules/@typescript-eslint/visitor-keys/CHANGELOG.md
+++ b/node_modules/@typescript-eslint/visitor-keys/CHANGELOG.md
@@ -3,6 +3,30 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+# [4.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.2.0...v4.3.0) (2020-09-28)
+
+**Note:** Version bump only for package @typescript-eslint/visitor-keys
+
+
+
+
+
+# [4.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.1...v4.2.0) (2020-09-21)
+
+**Note:** Version bump only for package @typescript-eslint/visitor-keys
+
+
+
+
+
+## [4.1.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.1.0...v4.1.1) (2020-09-14)
+
+**Note:** Version bump only for package @typescript-eslint/visitor-keys
+
+
+
+
+
 # [4.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.1...v4.1.0) (2020-09-07)
 
 **Note:** Version bump only for package @typescript-eslint/visitor-keys
diff --git a/node_modules/@typescript-eslint/visitor-keys/package.json b/node_modules/@typescript-eslint/visitor-keys/package.json
index cca9d90..5d07456 100644
--- a/node_modules/@typescript-eslint/visitor-keys/package.json
+++ b/node_modules/@typescript-eslint/visitor-keys/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@typescript-eslint/visitor-keys",
-  "version": "4.1.0",
+  "version": "4.3.0",
   "description": "Visitor keys used to help traverse the TypeScript-ESTree AST",
   "keywords": [
     "eslint",
@@ -38,7 +38,7 @@
     "typecheck": "tsc -p tsconfig.json --noEmit"
   },
   "dependencies": {
-    "@typescript-eslint/types": "4.1.0",
+    "@typescript-eslint/types": "4.3.0",
     "eslint-visitor-keys": "^2.0.0"
   },
   "devDependencies": {
@@ -55,5 +55,5 @@
       ]
     }
   },
-  "gitHead": "00a24706222254774121ee62038e67d0efa993e7"
+  "gitHead": "229631e6cd90bba8f509a6d49fec72fd7a576ccf"
 }
diff --git a/node_modules/aria-query/CHANGELOG.md b/node_modules/aria-query/CHANGELOG.md
deleted file mode 100644
index ec8be48..0000000
--- a/node_modules/aria-query/CHANGELOG.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# aria-query Change Log
-
-## 1.0.0
-
-- Updated values of aria-haspopup to include ARIA 1.1 role values
-- Added the CHANGELOG file
-
-## 2.0.0
-
-- Remove package-lock file.
-- Add Watchman config file.
-
-## 2.0.1
-
-- Added aria-errormessage to the ARIA Props Map.
-
-## 3.0.0
-
-- Bumping to a major version because of a previous breaking change.
diff --git a/node_modules/aria-query/LICENSE b/node_modules/aria-query/LICENSE
deleted file mode 100644
index 5e0fd33..0000000
--- a/node_modules/aria-query/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-Apache License
-Version 2.0, January 2004
-http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction,
-and distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by
-the copyright owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all
-other entities that control, are controlled by, or are under common
-control with that entity. For the purposes of this definition,
-"control" means (i) the power, direct or indirect, to cause the
-direction or management of such entity, whether by contract or
-otherwise, or (ii) ownership of fifty percent (50%) or more of the
-outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity
-exercising permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications,
-including but not limited to software source code, documentation
-source, and configuration files.
-
-"Object" form shall mean any form resulting from mechanical
-transformation or translation of a Source form, including but
-not limited to compiled object code, generated documentation,
-and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or
-Object form, made available under the License, as indicated by a
-copyright notice that is included in or attached to the work
-(an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object
-form, that is based on (or derived from) the Work and for which the
-editorial revisions, annotations, elaborations, or other modifications
-represent, as a whole, an original work of authorship. For the purposes
-of this License, Derivative Works shall not include works that remain
-separable from, or merely link (or bind by name) to the interfaces of,
-the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including
-the original version of the Work and any modifications or additions
-to that Work or Derivative Works thereof, that is intentionally
-submitted to Licensor for inclusion in the Work by the copyright owner
-or by an individual or Legal Entity authorized to submit on behalf of
-the copyright owner. For the purposes of this definition, "submitted"
-means any form of electronic, verbal, or written communication sent
-to the Licensor or its representatives, including but not limited to
-communication on electronic mailing lists, source code control systems,
-and issue tracking systems that are managed by, or on behalf of, the
-Licensor for the purpose of discussing and improving the Work, but
-excluding communication that is conspicuously marked or otherwise
-designated in writing by the copyright owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity
-on behalf of whom a Contribution has been received by Licensor and
-subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-this License, each Contributor hereby grants to You a perpetual,
-worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-copyright license to reproduce, prepare Derivative Works of,
-publicly display, publicly perform, sublicense, and distribute the
-Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-this License, each Contributor hereby grants to You a perpetual,
-worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-(except as stated in this section) patent license to make, have made,
-use, offer to sell, sell, import, and otherwise transfer the Work,
-where such license applies only to those patent claims licensable
-by such Contributor that are necessarily infringed by their
-Contribution(s) alone or by combination of their Contribution(s)
-with the Work to which such Contribution(s) was submitted. If You
-institute patent litigation against any entity (including a
-cross-claim or counterclaim in a lawsuit) alleging that the Work
-or a Contribution incorporated within the Work constitutes direct
-or contributory patent infringement, then any patent licenses
-granted to You under this License for that Work shall terminate
-as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-Work or Derivative Works thereof in any medium, with or without
-modifications, and in Source or Object form, provided that You
-meet the following conditions:
-
-(a) You must give any other recipients of the Work or
-Derivative Works a copy of this License; and
-
-(b) You must cause any modified files to carry prominent notices
-stating that You changed the files; and
-
-(c) You must retain, in the Source form of any Derivative Works
-that You distribute, all copyright, patent, trademark, and
-attribution notices from the Source form of the Work,
-excluding those notices that do not pertain to any part of
-the Derivative Works; and
-
-(d) If the Work includes a "NOTICE" text file as part of its
-distribution, then any Derivative Works that You distribute must
-include a readable copy of the attribution notices contained
-within such NOTICE file, excluding those notices that do not
-pertain to any part of the Derivative Works, in at least one
-of the following places: within a NOTICE text file distributed
-as part of the Derivative Works; within the Source form or
-documentation, if provided along with the Derivative Works; or,
-within a display generated by the Derivative Works, if and
-wherever such third-party notices normally appear. The contents
-of the NOTICE file are for informational purposes only and
-do not modify the License. You may add Your own attribution
-notices within Derivative Works that You distribute, alongside
-or as an addendum to the NOTICE text from the Work, provided
-that such additional attribution notices cannot be construed
-as modifying the License.
-
-You may add Your own copyright statement to Your modifications and
-may provide additional or different license terms and conditions
-for use, reproduction, or distribution of Your modifications, or
-for any such Derivative Works as a whole, provided Your use,
-reproduction, and distribution of the Work otherwise complies with
-the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-any Contribution intentionally submitted for inclusion in the Work
-by You to the Licensor shall be under the terms and conditions of
-this License, without any additional terms or conditions.
-Notwithstanding the above, nothing herein shall supersede or modify
-the terms of any separate license agreement you may have executed
-with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-names, trademarks, service marks, or product names of the Licensor,
-except as required for reasonable and customary use in describing the
-origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-agreed to in writing, Licensor provides the Work (and each
-Contributor provides its Contributions) on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-implied, including, without limitation, any warranties or conditions
-of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-PARTICULAR PURPOSE. You are solely responsible for determining the
-appropriateness of using or redistributing the Work and assume any
-risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-whether in tort (including negligence), contract, or otherwise,
-unless required by applicable law (such as deliberate and grossly
-negligent acts) or agreed to in writing, shall any Contributor be
-liable to You for damages, including any direct, indirect, special,
-incidental, or consequential damages of any character arising as a
-result of this License or out of the use or inability to use the
-Work (including but not limited to damages for loss of goodwill,
-work stoppage, computer failure or malfunction, or any and all
-other commercial damages or losses), even if such Contributor
-has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-the Work or Derivative Works thereof, You may choose to offer,
-and charge a fee for, acceptance of support, warranty, indemnity,
-or other liability obligations and/or rights consistent with this
-License. However, in accepting such obligations, You may act only
-on Your own behalf and on Your sole responsibility, not on behalf
-of any other Contributor, and only if You agree to indemnify,
-defend, and hold each Contributor harmless for any liability
-incurred by, or claims asserted against, such Contributor by reason
-of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-To apply the Apache License to your work, attach the following
-boilerplate notice, with the fields enclosed by brackets "{}"
-replaced with your own identifying information. (Don't include
-the brackets!)  The text should be enclosed in the appropriate
-comment syntax for the file format. We also recommend that a
-file or class name and description of purpose be included on the
-same "printed page" as the copyright notice for easier
-identification within third-party archives.
-
-Copyright {yyyy} {name of copyright owner}
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
diff --git a/node_modules/aria-query/README.md b/node_modules/aria-query/README.md
deleted file mode 100644
index df8fd0d..0000000
--- a/node_modules/aria-query/README.md
+++ /dev/null
@@ -1,161 +0,0 @@
-[![Build Status](https://travis-ci.org/A11yance/aria-query.svg?branch=master)](https://travis-ci.org/A11yance/aria-query)
-
-CDN URL: https://npm-cdn.com/pkg/aria-query/
-
-# ARIA Query
-
-Programmatic access to the [WAI-ARIA 1.1 Roles Model](https://www.w3.org/TR/wai-aria-1.1/#roles).
-
-## Utilities
-
-### Roles
-
-```
-import { roles } from 'aria-query';
-```
-
-A [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) of
-role names to the role definition. For example:
-
-```
-let alertRole = roles.get('alert');
-/**
- * Value of alertRole
- * {
- *   "requiredProps": [],
- *   "props": [
- *     "aria-expanded",
- *     "aria-atomic",
- *     "aria-busy",
- *     "aria-controls",
- *     "aria-describedby",
- *     "aria-disabled",
- *     "aria-dropeffect",
- *     "aria-flowto",
- *     "aria-grabbed",
- *     "aria-haspopup",
- *     "aria-hidden",
- *     "aria-invalid",
- *     "aria-label",
- *     "aria-labelledby",
- *     "aria-live",
- *     "aria-owns",
- *     "aria-relevant"
- *   ],
- *   "abstract": false,
- *   "interactive": false,
- *   "childrenPresentational": false,
- *   "baseConcepts": [],
- *   "relatedConcepts": [ {
- *     "module": "XForms",
- *     "concept": {
- *       "name": "alert"
- *     }
- *   }]
- * }
-```
-
-### Elements to Roles
-
-```
-import { elementRoles } from 'aria-query';
-```
-
-HTML Elements with inherent roles are mapped to those roles. In the case of an element like `<input>`, the element often requires a `type` attribute to map to an ARIA role.
-
-```
-Map {
-  '{"name": "article"}' => Set { 'article' },
-  '{"name": "button"}' => Set { 'button' },
-  '{"name": "td"}' => Set { 'cell', 'gridcell' },
-  '{"name": "input", "attributes": [ {"name": "type", "value": "checkbox"}] }' => Set { 'checkbox' },
-  '{"name": "th"}' => Set { 'columnheader' },
-  '{"name": "select"}' => Set { 'combobox', 'listbox' },
-  '{"name": "menuitem"}' => Set { 'command', 'menuitem' },
-  '{"name": "dd"}' => Set { 'definition' },
-  '{"name": "dfn"}' => Set { 'definition' },
-  '{"name": "figure"}' => Set { 'figure' },
-  '{"name": "form"}' => Set { 'form' },
-  '{"name": "table"}' => Set { 'grid', 'table' },
-  '{"name": "fieldset"}' => Set { 'group' },
-  '{"name": "h1"}' => Set { 'heading' },
-  '{"name": "h2"}' => Set { 'heading' },
-  '{"name": "h3"}' => Set { 'heading' },
-  '{"name": "h4"}' => Set { 'heading' },
-  '{"name": "h5"}' => Set { 'heading' },
-  '{"name": "h6"}' => Set { 'heading' },
-  '{"name": "img"}' => Set { 'img' },
-  '{"name": "a"}' => Set { 'link' },
-  '{"name": "link"}' => Set { 'link' },
-  '{"name": "ol"}' => Set { 'list' },
-  '{"name": "ul"}' => Set { 'list' },
-  '{"name": "li"}' => Set { 'listitem' },
-  '{"name": "nav"}' => Set { 'navigation' },
-  '{"name": "option"}' => Set { 'option' },
-  '{"name": "input", "attributes": [ {"name": "type", "value": "radio"}] }' => Set { 'radio' },
-  '{"name": "frame"}' => Set { 'region' },
-  '{"name": "rel"}' => Set { 'roletype' },
-  '{"name": "tr"}' => Set { 'row' },
-  '{"name": "tbody"}' => Set { 'rowgroup' },
-  '{"name": "tfoot"}' => Set { 'rowgroup' },
-  '{"name": "thead"}' => Set { 'rowgroup' },
-  '{"name": "th", "attributes": [ {"name": "scope", "value": "row"}] }' => Set { 'rowheader' },
-  '{"name": "input", "attributes": [ {"name": "type", "value": "search"}] }' => Set { 'searchbox' },
-  '{"name": "hr"}' => Set { 'separator' },
-  '{"name": "dt"}' => Set { 'term' },
-  '{"name": "textarea"}' => Set { 'textbox' },
-  '{"name": "input", "attributes": [ {"name": "type", "value": "text"}] }' => Set { 'textbox' }
-}
-```
-
-The map of elements to roles is keyed by an HTML concept. An HTML concept corresponds to the `baseConcepts` and `relatedConcepts` of an ARIA role. Concepts exist in the context of a `module`: HTML, XForms, Dublin Core, for example.  The concept representation is an object literal with a name property (the element name) and an optional attributes array.
-
-The roles are provided in a [Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set).
-
-### Role to element
-
-```
-import { roleElements } from 'aria-query';
-```
-
-ARIA roles are mapped to the HTML Elements with the same inherent role. Some roles, such as `columnheader` are only mapped to an HMTL element that expresses specific attributes. In the case of `<input>`, the element often requires a `type` attribute to map to an ARIA role.
-
-```
-Map {
-  'article' => Set { '{"name": "article"}' },
-  'button' => Set { '{"name": "button"}' },
-  'cell' => Set { '{"name": "td"}' },
-  'checkbox' => Set { '{"name": "input", "attributes": [ {"name": "type", "value": "checkbox"}] }' },
-  'columnheader' => Set { '{"name": "th"}' },
-  'combobox' => Set { '{"name": "select"}' },
-  'command' => Set { '{"name": "menuitem"}' },
-  'definition' => Set { '{"name": "dd"}', '{"name": "dfn"}' },
-  'figure' => Set { '{"name": "figure"}' },
-  'form' => Set { '{"name": "form"}' },
-  'grid' => Set { '{"name": "table"}' },
-  'gridcell' => Set { '{"name": "td"}' },
-  'group' => Set { '{"name": "fieldset"}' },
-  'heading' => Set { '{"name": "h1"}', '{"name": "h2"}', '{"name": "h3"}', '{"name": "h4"}',  '{"name": "h5"}', '{"name": "h6"}' },
-  'img' => Set { '{"name": "img"}' },
-  'link' => Set { '{"name": "a"}', '{"name": "link"}' },
-  'list' => Set { '{"name": "ol"}', '{"name": "ul"}' },
-  'listbox' => Set { '{"name": "select"}' },
-  'listitem' => Set { '{"name": "li"}' },
-  'menuitem' => Set { '{"name": "menuitem"}' },
-  'navigation' => Set { '{"name": "nav"}' },
-  'option' => Set { '{"name": "option"}' },
-  'radio' => Set { '{"name": "input", "attributes": [ {"name": "type", "value": "radio"}] }' },
-  'region' => Set { '{"name": "frame"}' },
-  'roletype' => Set { '{"name": "rel"}' },
-  'row' => Set { '{"name": "tr"}' },
-  'rowgroup' => Set { '{"name": "tbody"}', '{"name": "tfoot"}', '{"name": "thead"}' },
-  'rowheader' => Set { '{"name": "th", "attributes": [ {"name": "scope", "value": "row"}] }' },
-  'searchbox' => Set { '{"name": "input", "attributes": [ {"name": "type", "value": "search"}] }' },
-  'separator' => Set { '{"name": "hr"}' },
-  'table' => Set { '{"name": "table"}' },
-  'term' => Set { '{"name": "dt"}' },
-  'textbox' => Set { '{"name": "textarea"}', '{"name": "input", "attributes": [ {"name": "type", "value": "text"}] }' }
-}
-```
-
-The HTML concept values are provided in a [Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set).
diff --git a/node_modules/aria-query/lib/ariaPropsMap.js b/node_modules/aria-query/lib/ariaPropsMap.js
deleted file mode 100644
index f049e28..0000000
--- a/node_modules/aria-query/lib/ariaPropsMap.js
+++ /dev/null
@@ -1,116 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-
-var ariaPropsMap = new Map([['aria-activedescendant', {
-  'type': 'id'
-}], ['aria-atomic', {
-  'type': 'boolean'
-}], ['aria-autocomplete', {
-  'type': 'token',
-  'values': ['inline', 'list', 'both', 'none']
-}], ['aria-busy', {
-  'type': 'boolean'
-}], ['aria-checked', {
-  'type': 'tristate'
-}], ['aria-colcount', {
-  type: 'integer'
-}], ['aria-colindex', {
-  type: 'integer'
-}], ['aria-colspan', {
-  type: 'integer'
-}], ['aria-controls', {
-  'type': 'idlist'
-}], ['aria-current', {
-  type: 'token',
-  values: ['page', 'step', 'location', 'date', 'time', true, false]
-}], ['aria-describedby', {
-  'type': 'idlist'
-}], ['aria-disabled', {
-  'type': 'boolean'
-}], ['aria-dropeffect', {
-  'type': 'tokenlist',
-  'values': ['copy', 'move', 'link', 'execute', 'popup', 'none']
-}], ['aria-errormessage', {
-  'type': 'string'
-}], ['aria-expanded', {
-  'type': 'boolean',
-  'allowundefined': true
-}], ['aria-flowto', {
-  'type': 'idlist'
-}], ['aria-grabbed', {
-  'type': 'boolean',
-  'allowundefined': true
-}], ['aria-haspopup', {
-  'type': 'token',
-  'values': [false, true, 'menu', 'listbox', 'tree', 'grid', 'dialog']
-}], ['aria-hidden', {
-  'type': 'boolean'
-}], ['aria-invalid', {
-  'type': 'token',
-  'values': ['grammar', false, 'spelling', true]
-}], ['aria-keyshortcuts', {
-  type: 'string'
-}], ['aria-label', {
-  'type': 'string'
-}], ['aria-labelledby', {
-  'type': 'idlist'
-}], ['aria-level', {
-  'type': 'integer'
-}], ['aria-live', {
-  'type': 'token',
-  'values': ['off', 'polite', 'assertive']
-}], ['aria-modal', {
-  type: 'boolean'
-}], ['aria-multiline', {
-  'type': 'boolean'
-}], ['aria-multiselectable', {
-  'type': 'boolean'
-}], ['aria-orientation', {
-  'type': 'token',
-  'values': ['vertical', 'horizontal']
-}], ['aria-owns', {
-  'type': 'idlist'
-}], ['aria-placeholder', {
-  type: 'string'
-}], ['aria-posinset', {
-  'type': 'integer'
-}], ['aria-pressed', {
-  'type': 'tristate'
-}], ['aria-readonly', {
-  'type': 'boolean'
-}], ['aria-relevant', {
-  'type': 'tokenlist',
-  'values': ['additions', 'removals', 'text', 'all']
-}], ['aria-required', {
-  'type': 'boolean'
-}], ['aria-roledescription', {
-  type: 'string'
-}], ['aria-rowcount', {
-  type: 'integer'
-}], ['aria-rowindex', {
-  type: 'integer'
-}], ['aria-rowspan', {
-  type: 'integer'
-}], ['aria-selected', {
-  'type': 'boolean',
-  'allowundefined': true
-}], ['aria-setsize', {
-  'type': 'integer'
-}], ['aria-sort', {
-  'type': 'token',
-  'values': ['ascending', 'descending', 'none', 'other']
-}], ['aria-valuemax', {
-  'type': 'number'
-}], ['aria-valuemin', {
-  'type': 'number'
-}], ['aria-valuenow', {
-  'type': 'number'
-}], ['aria-valuetext', {
-  'type': 'string'
-}]]);
-
-exports.default = ariaPropsMap;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/domMap.js b/node_modules/aria-query/lib/domMap.js
deleted file mode 100644
index 56691c0..0000000
--- a/node_modules/aria-query/lib/domMap.js
+++ /dev/null
@@ -1,266 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var domMap = new Map([['a', {
-  reserved: false
-}], ['abbr', {
-  reserved: false
-}], ['acronym', {
-  reserved: false
-}], ['address', {
-  reserved: false
-}], ['applet', {
-  reserved: false
-}], ['area', {
-  reserved: false
-}], ['article', {
-  reserved: false
-}], ['aside', {
-  reserved: false
-}], ['audio', {
-  reserved: false
-}], ['b', {
-  reserved: false
-}], ['base', {
-  reserved: true
-}], ['bdi', {
-  reserved: false
-}], ['bdo', {
-  reserved: false
-}], ['big', {
-  reserved: false
-}], ['blink', {
-  reserved: false
-}], ['blockquote', {
-  reserved: false
-}], ['body', {
-  reserved: false
-}], ['br', {
-  reserved: false
-}], ['button', {
-  reserved: false
-}], ['canvas', {
-  reserved: false
-}], ['caption', {
-  reserved: false
-}], ['center', {
-  reserved: false
-}], ['cite', {
-  reserved: false
-}], ['code', {
-  reserved: false
-}], ['col', {
-  reserved: true
-}], ['colgroup', {
-  reserved: true
-}], ['content', {
-  reserved: false
-}], ['data', {
-  reserved: false
-}], ['datalist', {
-  reserved: false
-}], ['dd', {
-  reserved: false
-}], ['del', {
-  reserved: false
-}], ['details', {
-  reserved: false
-}], ['dfn', {
-  reserved: false
-}], ['dialog', {
-  reserved: false
-}], ['dir', {
-  reserved: false
-}], ['div', {
-  reserved: false
-}], ['dl', {
-  reserved: false
-}], ['dt', {
-  reserved: false
-}], ['em', {
-  reserved: false
-}], ['embed', {
-  reserved: false
-}], ['fieldset', {
-  reserved: false
-}], ['figcaption', {
-  reserved: false
-}], ['figure', {
-  reserved: false
-}], ['font', {
-  reserved: false
-}], ['footer', {
-  reserved: false
-}], ['form', {
-  reserved: false
-}], ['frame', {
-  reserved: false
-}], ['frameset', {
-  reserved: false
-}], ['h1', {
-  reserved: false
-}], ['h2', {
-  reserved: false
-}], ['h3', {
-  reserved: false
-}], ['h4', {
-  reserved: false
-}], ['h5', {
-  reserved: false
-}], ['h6', {
-  reserved: false
-}], ['head', {
-  reserved: true
-}], ['header', {
-  reserved: false
-}], ['hgroup', {
-  reserved: false
-}], ['hr', {
-  reserved: false
-}], ['html', {
-  reserved: true
-}], ['i', {
-  reserved: false
-}], ['iframe', {
-  reserved: false
-}], ['img', {
-  reserved: false
-}], ['input', {
-  reserved: false
-}], ['ins', {
-  reserved: false
-}], ['kbd', {
-  reserved: false
-}], ['keygen', {
-  reserved: false
-}], ['label', {
-  reserved: false
-}], ['legend', {
-  reserved: false
-}], ['li', {
-  reserved: false
-}], ['link', {
-  reserved: true
-}], ['main', {
-  reserved: false
-}], ['map', {
-  reserved: false
-}], ['mark', {
-  reserved: false
-}], ['marquee', {
-  reserved: false
-}], ['menu', {
-  reserved: false
-}], ['menuitem', {
-  reserved: false
-}], ['meta', {
-  reserved: true
-}], ['meter', {
-  reserved: false
-}], ['nav', {
-  reserved: false
-}], ['noembed', {
-  reserved: true
-}], ['noscript', {
-  reserved: true
-}], ['object', {
-  reserved: false
-}], ['ol', {
-  reserved: false
-}], ['optgroup', {
-  reserved: false
-}], ['option', {
-  reserved: false
-}], ['output', {
-  reserved: false
-}], ['p', {
-  reserved: false
-}], ['param', {
-  reserved: true
-}], ['picture', {
-  reserved: true
-}], ['pre', {
-  reserved: false
-}], ['progress', {
-  reserved: false
-}], ['q', {
-  reserved: false
-}], ['rp', {
-  reserved: false
-}], ['rt', {
-  reserved: false
-}], ['rtc', {
-  reserved: false
-}], ['ruby', {
-  reserved: false
-}], ['s', {
-  reserved: false
-}], ['samp', {
-  reserved: false
-}], ['script', {
-  reserved: true
-}], ['section', {
-  reserved: false
-}], ['select', {
-  reserved: false
-}], ['small', {
-  reserved: false
-}], ['source', {
-  reserved: true
-}], ['spacer', {
-  reserved: false
-}], ['span', {
-  reserved: false
-}], ['strike', {
-  reserved: false
-}], ['strong', {
-  reserved: false
-}], ['style', {
-  reserved: true
-}], ['sub', {
-  reserved: false
-}], ['summary', {
-  reserved: false
-}], ['sup', {
-  reserved: false
-}], ['table', {
-  reserved: false
-}], ['tbody', {
-  reserved: false
-}], ['td', {
-  reserved: false
-}], ['textarea', {
-  reserved: false
-}], ['tfoot', {
-  reserved: false
-}], ['th', {
-  reserved: false
-}], ['thead', {
-  reserved: false
-}], ['time', {
-  reserved: false
-}], ['title', {
-  reserved: true
-}], ['tr', {
-  reserved: false
-}], ['track', {
-  reserved: true
-}], ['tt', {
-  reserved: false
-}], ['u', {
-  reserved: false
-}], ['ul', {
-  reserved: false
-}], ['var', {
-  reserved: false
-}], ['video', {
-  reserved: false
-}], ['wbr', {
-  reserved: false
-}], ['xmp', {
-  reserved: false
-}]]);
-
-exports.default = domMap;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/elementRoleMap.js b/node_modules/aria-query/lib/elementRoleMap.js
deleted file mode 100644
index dcb8bc0..0000000
--- a/node_modules/aria-query/lib/elementRoleMap.js
+++ /dev/null
@@ -1,47 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
-var _rolesMap = require('./rolesMap');
-
-var _rolesMap2 = _interopRequireDefault(_rolesMap);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
-
-var elementRoleMap = new Map([]);
-
-[].concat(_toConsumableArray(_rolesMap2.default.keys())).forEach(function (key) {
-  var role = _rolesMap2.default.get(key);
-  if (role) {
-    [].concat(_toConsumableArray(role.baseConcepts), _toConsumableArray(role.relatedConcepts)).forEach(function (relation) {
-      if (relation.module === 'HTML') {
-        var concept = relation.concept;
-        if (concept) {
-          var conceptStr = JSON.stringify(concept);
-
-          var roles = ([].concat(_toConsumableArray(elementRoleMap.entries())).find(function (_ref) {
-            var _ref2 = _slicedToArray(_ref, 2),
-                key = _ref2[0],
-                value = _ref2[1];
-
-            return JSON.stringify(key) === conceptStr;
-          }) || [])[1];
-
-          if (!roles) {
-            roles = new Set([]);
-          }
-          roles.add(key);
-          elementRoleMap.set(concept, roles);
-        }
-      }
-    });
-  }
-});
-
-exports.default = elementRoleMap;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/abstract/commandRole.js b/node_modules/aria-query/lib/etc/roles/abstract/commandRole.js
deleted file mode 100644
index 7dbaa0d..0000000
--- a/node_modules/aria-query/lib/etc/roles/abstract/commandRole.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var commandRole = {
-  abstract: true,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'menuitem'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget']]
-};
-
-exports.default = commandRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/abstract/compositeRole.js b/node_modules/aria-query/lib/etc/roles/abstract/compositeRole.js
deleted file mode 100644
index c60a7dd..0000000
--- a/node_modules/aria-query/lib/etc/roles/abstract/compositeRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var compositeRole = {
-  abstract: true,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-activedescendant': null
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget']]
-};
-
-exports.default = compositeRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/abstract/inputRole.js b/node_modules/aria-query/lib/etc/roles/abstract/inputRole.js
deleted file mode 100644
index fad691f..0000000
--- a/node_modules/aria-query/lib/etc/roles/abstract/inputRole.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var inputRole = {
-  abstract: true,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'XForms',
-    concept: {
-      name: 'input'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget']]
-};
-
-exports.default = inputRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/abstract/landmarkRole.js b/node_modules/aria-query/lib/etc/roles/abstract/landmarkRole.js
deleted file mode 100644
index 4ba2a0c..0000000
--- a/node_modules/aria-query/lib/etc/roles/abstract/landmarkRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var landmarkRole = {
-  abstract: true,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = landmarkRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/abstract/rangeRole.js b/node_modules/aria-query/lib/etc/roles/abstract/rangeRole.js
deleted file mode 100644
index 3d56765..0000000
--- a/node_modules/aria-query/lib/etc/roles/abstract/rangeRole.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var rangeRole = {
-  abstract: true,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-valuemax': null,
-    'aria-valuemin': null,
-    'aria-valuenow': null,
-    'aria-valuetext': null
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget']]
-};
-
-exports.default = rangeRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/abstract/roletypeRole.js b/node_modules/aria-query/lib/etc/roles/abstract/roletypeRole.js
deleted file mode 100644
index d1b24d9..0000000
--- a/node_modules/aria-query/lib/etc/roles/abstract/roletypeRole.js
+++ /dev/null
@@ -1,57 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var roletypeRole = {
-  abstract: true,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-atomic': null,
-    'aria-busy': null,
-    'aria-controls': null,
-    'aria-current': null,
-    'aria-describedby': null,
-    'aria-details': null,
-    'aria-disabled': null,
-    'aria-dropeffect': null,
-    'aria-errormessage': null,
-    'aria-flowto': null,
-    'aria-grabbed': null,
-    'aria-haspopup': null,
-    'aria-hidden': null,
-    'aria-invalid': null,
-    'aria-keyshortcuts': null,
-    'aria-label': null,
-    'aria-labelledby': null,
-    'aria-live': null,
-    'aria-owns': null,
-    'aria-relevant': null,
-    'aria-roledescription': null
-  },
-  relatedConcepts: [{
-    module: 'XHTML',
-    concept: {
-      name: 'role'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'rel'
-    }
-  }, {
-    module: 'Dublin Core',
-    concept: {
-      name: 'type'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: []
-};
-
-exports.default = roletypeRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/abstract/sectionRole.js b/node_modules/aria-query/lib/etc/roles/abstract/sectionRole.js
deleted file mode 100644
index 2022e90..0000000
--- a/node_modules/aria-query/lib/etc/roles/abstract/sectionRole.js
+++ /dev/null
@@ -1,37 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var sectionRole = {
-  abstract: true,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: [],
-  props: {
-    'aria-expanded': null
-  },
-  relatedConcepts: [{
-    module: 'DTB',
-    concept: {
-      name: 'frontmatter'
-    }
-  }, {
-    module: 'DTB',
-    concept: {
-      name: 'level'
-    }
-  }, {
-    module: 'SMIL',
-    concept: {
-      name: 'level'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure']]
-};
-
-exports.default = sectionRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/abstract/sectionheadRole.js b/node_modules/aria-query/lib/etc/roles/abstract/sectionheadRole.js
deleted file mode 100644
index cea7043..0000000
--- a/node_modules/aria-query/lib/etc/roles/abstract/sectionheadRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var sectionheadRole = {
-  abstract: true,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-expanded': null
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure']]
-};
-
-exports.default = sectionheadRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/abstract/selectRole.js b/node_modules/aria-query/lib/etc/roles/abstract/selectRole.js
deleted file mode 100644
index 76b627e..0000000
--- a/node_modules/aria-query/lib/etc/roles/abstract/selectRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var selectRole = {
-  abstract: true,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-orientation': null
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'composite'], ['roletype', 'structure', 'section', 'group']]
-};
-
-exports.default = selectRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/abstract/structureRole.js b/node_modules/aria-query/lib/etc/roles/abstract/structureRole.js
deleted file mode 100644
index ccd6f9b..0000000
--- a/node_modules/aria-query/lib/etc/roles/abstract/structureRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var structureRole = {
-  abstract: true,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: [],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype']]
-};
-
-exports.default = structureRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/abstract/widgetRole.js b/node_modules/aria-query/lib/etc/roles/abstract/widgetRole.js
deleted file mode 100644
index d994135..0000000
--- a/node_modules/aria-query/lib/etc/roles/abstract/widgetRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var widgetRole = {
-  abstract: true,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: [],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype']]
-};
-
-exports.default = widgetRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/abstract/windowRole.js b/node_modules/aria-query/lib/etc/roles/abstract/windowRole.js
deleted file mode 100644
index ce31439..0000000
--- a/node_modules/aria-query/lib/etc/roles/abstract/windowRole.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var windowRole = {
-  abstract: true,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-expanded': null,
-    'aria-modal': null
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype']]
-};
-
-exports.default = windowRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/ariaAbstractRoles.js b/node_modules/aria-query/lib/etc/roles/ariaAbstractRoles.js
deleted file mode 100644
index a7c136a..0000000
--- a/node_modules/aria-query/lib/etc/roles/ariaAbstractRoles.js
+++ /dev/null
@@ -1,59 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _commandRole = require('./abstract/commandRole');
-
-var _commandRole2 = _interopRequireDefault(_commandRole);
-
-var _compositeRole = require('./abstract/compositeRole');
-
-var _compositeRole2 = _interopRequireDefault(_compositeRole);
-
-var _inputRole = require('./abstract/inputRole');
-
-var _inputRole2 = _interopRequireDefault(_inputRole);
-
-var _landmarkRole = require('./abstract/landmarkRole');
-
-var _landmarkRole2 = _interopRequireDefault(_landmarkRole);
-
-var _rangeRole = require('./abstract/rangeRole');
-
-var _rangeRole2 = _interopRequireDefault(_rangeRole);
-
-var _roletypeRole = require('./abstract/roletypeRole');
-
-var _roletypeRole2 = _interopRequireDefault(_roletypeRole);
-
-var _sectionRole = require('./abstract/sectionRole');
-
-var _sectionRole2 = _interopRequireDefault(_sectionRole);
-
-var _sectionheadRole = require('./abstract/sectionheadRole');
-
-var _sectionheadRole2 = _interopRequireDefault(_sectionheadRole);
-
-var _selectRole = require('./abstract/selectRole');
-
-var _selectRole2 = _interopRequireDefault(_selectRole);
-
-var _structureRole = require('./abstract/structureRole');
-
-var _structureRole2 = _interopRequireDefault(_structureRole);
-
-var _widgetRole = require('./abstract/widgetRole');
-
-var _widgetRole2 = _interopRequireDefault(_widgetRole);
-
-var _windowRole = require('./abstract/windowRole');
-
-var _windowRole2 = _interopRequireDefault(_windowRole);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var ariaAbstractRoles = new Map([['command', _commandRole2.default], ['composite', _compositeRole2.default], ['input', _inputRole2.default], ['landmark', _landmarkRole2.default], ['range', _rangeRole2.default], ['roletype', _roletypeRole2.default], ['section', _sectionRole2.default], ['sectionhead', _sectionheadRole2.default], ['select', _selectRole2.default], ['structure', _structureRole2.default], ['widget', _widgetRole2.default], ['window', _windowRole2.default]]);
-
-exports.default = ariaAbstractRoles;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/ariaDpubRoles.js b/node_modules/aria-query/lib/etc/roles/ariaDpubRoles.js
deleted file mode 100644
index 9fe38c0..0000000
--- a/node_modules/aria-query/lib/etc/roles/ariaDpubRoles.js
+++ /dev/null
@@ -1,166 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _docAbstractRole = require('./dpub/docAbstractRole');
-
-var _docAbstractRole2 = _interopRequireDefault(_docAbstractRole);
-
-var _docAcknowledgmentsRole = require('./dpub/docAcknowledgmentsRole');
-
-var _docAcknowledgmentsRole2 = _interopRequireDefault(_docAcknowledgmentsRole);
-
-var _docAfterwordRole = require('./dpub/docAfterwordRole');
-
-var _docAfterwordRole2 = _interopRequireDefault(_docAfterwordRole);
-
-var _docAppendixRole = require('./dpub/docAppendixRole');
-
-var _docAppendixRole2 = _interopRequireDefault(_docAppendixRole);
-
-var _docBacklinkRole = require('./dpub/docBacklinkRole');
-
-var _docBacklinkRole2 = _interopRequireDefault(_docBacklinkRole);
-
-var _docBiblioentryRole = require('./dpub/docBiblioentryRole');
-
-var _docBiblioentryRole2 = _interopRequireDefault(_docBiblioentryRole);
-
-var _docBibliographyRole = require('./dpub/docBibliographyRole');
-
-var _docBibliographyRole2 = _interopRequireDefault(_docBibliographyRole);
-
-var _docBibliorefRole = require('./dpub/docBibliorefRole');
-
-var _docBibliorefRole2 = _interopRequireDefault(_docBibliorefRole);
-
-var _docChapterRole = require('./dpub/docChapterRole');
-
-var _docChapterRole2 = _interopRequireDefault(_docChapterRole);
-
-var _docColophonRole = require('./dpub/docColophonRole');
-
-var _docColophonRole2 = _interopRequireDefault(_docColophonRole);
-
-var _docConclusionRole = require('./dpub/docConclusionRole');
-
-var _docConclusionRole2 = _interopRequireDefault(_docConclusionRole);
-
-var _docCoverRole = require('./dpub/docCoverRole');
-
-var _docCoverRole2 = _interopRequireDefault(_docCoverRole);
-
-var _docCreditRole = require('./dpub/docCreditRole');
-
-var _docCreditRole2 = _interopRequireDefault(_docCreditRole);
-
-var _docCreditsRole = require('./dpub/docCreditsRole');
-
-var _docCreditsRole2 = _interopRequireDefault(_docCreditsRole);
-
-var _docDedicationRole = require('./dpub/docDedicationRole');
-
-var _docDedicationRole2 = _interopRequireDefault(_docDedicationRole);
-
-var _docEndnoteRole = require('./dpub/docEndnoteRole');
-
-var _docEndnoteRole2 = _interopRequireDefault(_docEndnoteRole);
-
-var _docEndnotesRole = require('./dpub/docEndnotesRole');
-
-var _docEndnotesRole2 = _interopRequireDefault(_docEndnotesRole);
-
-var _docEpigraphRole = require('./dpub/docEpigraphRole');
-
-var _docEpigraphRole2 = _interopRequireDefault(_docEpigraphRole);
-
-var _docEpilogueRole = require('./dpub/docEpilogueRole');
-
-var _docEpilogueRole2 = _interopRequireDefault(_docEpilogueRole);
-
-var _docErrataRole = require('./dpub/docErrataRole');
-
-var _docErrataRole2 = _interopRequireDefault(_docErrataRole);
-
-var _docExampleRole = require('./dpub/docExampleRole');
-
-var _docExampleRole2 = _interopRequireDefault(_docExampleRole);
-
-var _docFootnoteRole = require('./dpub/docFootnoteRole');
-
-var _docFootnoteRole2 = _interopRequireDefault(_docFootnoteRole);
-
-var _docForewordRole = require('./dpub/docForewordRole');
-
-var _docForewordRole2 = _interopRequireDefault(_docForewordRole);
-
-var _docGlossaryRole = require('./dpub/docGlossaryRole');
-
-var _docGlossaryRole2 = _interopRequireDefault(_docGlossaryRole);
-
-var _docGlossrefRole = require('./dpub/docGlossrefRole');
-
-var _docGlossrefRole2 = _interopRequireDefault(_docGlossrefRole);
-
-var _docIndexRole = require('./dpub/docIndexRole');
-
-var _docIndexRole2 = _interopRequireDefault(_docIndexRole);
-
-var _docIntroductionRole = require('./dpub/docIntroductionRole');
-
-var _docIntroductionRole2 = _interopRequireDefault(_docIntroductionRole);
-
-var _docNoterefRole = require('./dpub/docNoterefRole');
-
-var _docNoterefRole2 = _interopRequireDefault(_docNoterefRole);
-
-var _docNoticeRole = require('./dpub/docNoticeRole');
-
-var _docNoticeRole2 = _interopRequireDefault(_docNoticeRole);
-
-var _docPagebreakRole = require('./dpub/docPagebreakRole');
-
-var _docPagebreakRole2 = _interopRequireDefault(_docPagebreakRole);
-
-var _docPagelistRole = require('./dpub/docPagelistRole');
-
-var _docPagelistRole2 = _interopRequireDefault(_docPagelistRole);
-
-var _docPartRole = require('./dpub/docPartRole');
-
-var _docPartRole2 = _interopRequireDefault(_docPartRole);
-
-var _docPrefaceRole = require('./dpub/docPrefaceRole');
-
-var _docPrefaceRole2 = _interopRequireDefault(_docPrefaceRole);
-
-var _docPrologueRole = require('./dpub/docPrologueRole');
-
-var _docPrologueRole2 = _interopRequireDefault(_docPrologueRole);
-
-var _docPullquoteRole = require('./dpub/docPullquoteRole');
-
-var _docPullquoteRole2 = _interopRequireDefault(_docPullquoteRole);
-
-var _docQnaRole = require('./dpub/docQnaRole');
-
-var _docQnaRole2 = _interopRequireDefault(_docQnaRole);
-
-var _docSubtitleRole = require('./dpub/docSubtitleRole');
-
-var _docSubtitleRole2 = _interopRequireDefault(_docSubtitleRole);
-
-var _docTipRole = require('./dpub/docTipRole');
-
-var _docTipRole2 = _interopRequireDefault(_docTipRole);
-
-var _docTocRole = require('./dpub/docTocRole');
-
-var _docTocRole2 = _interopRequireDefault(_docTocRole);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var ariaDpubRoles = new Map([['doc-abstract', _docAbstractRole2.default], ['doc-acknowledgments', _docAcknowledgmentsRole2.default], ['doc-afterword', _docAfterwordRole2.default], ['doc-appendix', _docAppendixRole2.default], ['doc-backlink', _docBacklinkRole2.default], ['doc-biblioentry', _docBiblioentryRole2.default], ['doc-bibliography', _docBibliographyRole2.default], ['doc-biblioref', _docBibliorefRole2.default], ['doc-chapter', _docChapterRole2.default], ['doc-colophon', _docColophonRole2.default], ['doc-conclusion', _docConclusionRole2.default], ['doc-cover', _docCoverRole2.default], ['doc-credit', _docCreditRole2.default], ['doc-credits', _docCreditsRole2.default], ['doc-dedication', _docDedicationRole2.default], ['doc-endnote', _docEndnoteRole2.default], ['doc-endnotes', _docEndnotesRole2.default], ['doc-epigraph', _docEpigraphRole2.default], ['doc-epilogue', _docEpilogueRole2.default], ['doc-errata', _docErrataRole2.default], ['doc-example', _docExampleRole2.default], ['doc-footnote', _docFootnoteRole2.default], ['doc-foreword', _docForewordRole2.default], ['doc-glossary', _docGlossaryRole2.default], ['doc-glossref', _docGlossrefRole2.default], ['doc-index', _docIndexRole2.default], ['doc-introduction', _docIntroductionRole2.default], ['doc-noteref', _docNoterefRole2.default], ['doc-notice', _docNoticeRole2.default], ['doc-pagebreak', _docPagebreakRole2.default], ['doc-pagelist', _docPagelistRole2.default], ['doc-part', _docPartRole2.default], ['doc-preface', _docPrefaceRole2.default], ['doc-prologue', _docPrologueRole2.default], ['doc-pullquote', _docPullquoteRole2.default], ['doc-qna', _docQnaRole2.default], ['doc-subtitle', _docSubtitleRole2.default], ['doc-tip', _docTipRole2.default], ['doc-toc', _docTocRole2.default]]);
-exports.default = ariaDpubRoles;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/ariaLiteralRoles.js b/node_modules/aria-query/lib/etc/roles/ariaLiteralRoles.js
deleted file mode 100644
index 2c0725a..0000000
--- a/node_modules/aria-query/lib/etc/roles/ariaLiteralRoles.js
+++ /dev/null
@@ -1,286 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _alertRole = require('./literal/alertRole');
-
-var _alertRole2 = _interopRequireDefault(_alertRole);
-
-var _alertdialogRole = require('./literal/alertdialogRole');
-
-var _alertdialogRole2 = _interopRequireDefault(_alertdialogRole);
-
-var _applicationRole = require('./literal/applicationRole');
-
-var _applicationRole2 = _interopRequireDefault(_applicationRole);
-
-var _articleRole = require('./literal/articleRole');
-
-var _articleRole2 = _interopRequireDefault(_articleRole);
-
-var _bannerRole = require('./literal/bannerRole');
-
-var _bannerRole2 = _interopRequireDefault(_bannerRole);
-
-var _buttonRole = require('./literal/buttonRole');
-
-var _buttonRole2 = _interopRequireDefault(_buttonRole);
-
-var _cellRole = require('./literal/cellRole');
-
-var _cellRole2 = _interopRequireDefault(_cellRole);
-
-var _checkboxRole = require('./literal/checkboxRole');
-
-var _checkboxRole2 = _interopRequireDefault(_checkboxRole);
-
-var _columnheaderRole = require('./literal/columnheaderRole');
-
-var _columnheaderRole2 = _interopRequireDefault(_columnheaderRole);
-
-var _comboboxRole = require('./literal/comboboxRole');
-
-var _comboboxRole2 = _interopRequireDefault(_comboboxRole);
-
-var _complementaryRole = require('./literal/complementaryRole');
-
-var _complementaryRole2 = _interopRequireDefault(_complementaryRole);
-
-var _contentinfoRole = require('./literal/contentinfoRole');
-
-var _contentinfoRole2 = _interopRequireDefault(_contentinfoRole);
-
-var _definitionRole = require('./literal/definitionRole');
-
-var _definitionRole2 = _interopRequireDefault(_definitionRole);
-
-var _dialogRole = require('./literal/dialogRole');
-
-var _dialogRole2 = _interopRequireDefault(_dialogRole);
-
-var _directoryRole = require('./literal/directoryRole');
-
-var _directoryRole2 = _interopRequireDefault(_directoryRole);
-
-var _documentRole = require('./literal/documentRole');
-
-var _documentRole2 = _interopRequireDefault(_documentRole);
-
-var _feedRole = require('./literal/feedRole');
-
-var _feedRole2 = _interopRequireDefault(_feedRole);
-
-var _figureRole = require('./literal/figureRole');
-
-var _figureRole2 = _interopRequireDefault(_figureRole);
-
-var _formRole = require('./literal/formRole');
-
-var _formRole2 = _interopRequireDefault(_formRole);
-
-var _gridRole = require('./literal/gridRole');
-
-var _gridRole2 = _interopRequireDefault(_gridRole);
-
-var _gridcellRole = require('./literal/gridcellRole');
-
-var _gridcellRole2 = _interopRequireDefault(_gridcellRole);
-
-var _groupRole = require('./literal/groupRole');
-
-var _groupRole2 = _interopRequireDefault(_groupRole);
-
-var _headingRole = require('./literal/headingRole');
-
-var _headingRole2 = _interopRequireDefault(_headingRole);
-
-var _imgRole = require('./literal/imgRole');
-
-var _imgRole2 = _interopRequireDefault(_imgRole);
-
-var _linkRole = require('./literal/linkRole');
-
-var _linkRole2 = _interopRequireDefault(_linkRole);
-
-var _listRole = require('./literal/listRole');
-
-var _listRole2 = _interopRequireDefault(_listRole);
-
-var _listboxRole = require('./literal/listboxRole');
-
-var _listboxRole2 = _interopRequireDefault(_listboxRole);
-
-var _listitemRole = require('./literal/listitemRole');
-
-var _listitemRole2 = _interopRequireDefault(_listitemRole);
-
-var _logRole = require('./literal/logRole');
-
-var _logRole2 = _interopRequireDefault(_logRole);
-
-var _mainRole = require('./literal/mainRole');
-
-var _mainRole2 = _interopRequireDefault(_mainRole);
-
-var _marqueeRole = require('./literal/marqueeRole');
-
-var _marqueeRole2 = _interopRequireDefault(_marqueeRole);
-
-var _mathRole = require('./literal/mathRole');
-
-var _mathRole2 = _interopRequireDefault(_mathRole);
-
-var _menuRole = require('./literal/menuRole');
-
-var _menuRole2 = _interopRequireDefault(_menuRole);
-
-var _menubarRole = require('./literal/menubarRole');
-
-var _menubarRole2 = _interopRequireDefault(_menubarRole);
-
-var _menuitemRole = require('./literal/menuitemRole');
-
-var _menuitemRole2 = _interopRequireDefault(_menuitemRole);
-
-var _menuitemcheckboxRole = require('./literal/menuitemcheckboxRole');
-
-var _menuitemcheckboxRole2 = _interopRequireDefault(_menuitemcheckboxRole);
-
-var _menuitemradioRole = require('./literal/menuitemradioRole');
-
-var _menuitemradioRole2 = _interopRequireDefault(_menuitemradioRole);
-
-var _navigationRole = require('./literal/navigationRole');
-
-var _navigationRole2 = _interopRequireDefault(_navigationRole);
-
-var _noneRole = require('./literal/noneRole');
-
-var _noneRole2 = _interopRequireDefault(_noneRole);
-
-var _noteRole = require('./literal/noteRole');
-
-var _noteRole2 = _interopRequireDefault(_noteRole);
-
-var _optionRole = require('./literal/optionRole');
-
-var _optionRole2 = _interopRequireDefault(_optionRole);
-
-var _presentationRole = require('./literal/presentationRole');
-
-var _presentationRole2 = _interopRequireDefault(_presentationRole);
-
-var _progressbarRole = require('./literal/progressbarRole');
-
-var _progressbarRole2 = _interopRequireDefault(_progressbarRole);
-
-var _radioRole = require('./literal/radioRole');
-
-var _radioRole2 = _interopRequireDefault(_radioRole);
-
-var _radiogroupRole = require('./literal/radiogroupRole');
-
-var _radiogroupRole2 = _interopRequireDefault(_radiogroupRole);
-
-var _regionRole = require('./literal/regionRole');
-
-var _regionRole2 = _interopRequireDefault(_regionRole);
-
-var _rowRole = require('./literal/rowRole');
-
-var _rowRole2 = _interopRequireDefault(_rowRole);
-
-var _rowgroupRole = require('./literal/rowgroupRole');
-
-var _rowgroupRole2 = _interopRequireDefault(_rowgroupRole);
-
-var _rowheaderRole = require('./literal/rowheaderRole');
-
-var _rowheaderRole2 = _interopRequireDefault(_rowheaderRole);
-
-var _scrollbarRole = require('./literal/scrollbarRole');
-
-var _scrollbarRole2 = _interopRequireDefault(_scrollbarRole);
-
-var _searchRole = require('./literal/searchRole');
-
-var _searchRole2 = _interopRequireDefault(_searchRole);
-
-var _searchboxRole = require('./literal/searchboxRole');
-
-var _searchboxRole2 = _interopRequireDefault(_searchboxRole);
-
-var _separatorRole = require('./literal/separatorRole');
-
-var _separatorRole2 = _interopRequireDefault(_separatorRole);
-
-var _sliderRole = require('./literal/sliderRole');
-
-var _sliderRole2 = _interopRequireDefault(_sliderRole);
-
-var _spinbuttonRole = require('./literal/spinbuttonRole');
-
-var _spinbuttonRole2 = _interopRequireDefault(_spinbuttonRole);
-
-var _statusRole = require('./literal/statusRole');
-
-var _statusRole2 = _interopRequireDefault(_statusRole);
-
-var _switchRole = require('./literal/switchRole');
-
-var _switchRole2 = _interopRequireDefault(_switchRole);
-
-var _tabRole = require('./literal/tabRole');
-
-var _tabRole2 = _interopRequireDefault(_tabRole);
-
-var _tableRole = require('./literal/tableRole');
-
-var _tableRole2 = _interopRequireDefault(_tableRole);
-
-var _tablistRole = require('./literal/tablistRole');
-
-var _tablistRole2 = _interopRequireDefault(_tablistRole);
-
-var _tabpanelRole = require('./literal/tabpanelRole');
-
-var _tabpanelRole2 = _interopRequireDefault(_tabpanelRole);
-
-var _termRole = require('./literal/termRole');
-
-var _termRole2 = _interopRequireDefault(_termRole);
-
-var _textboxRole = require('./literal/textboxRole');
-
-var _textboxRole2 = _interopRequireDefault(_textboxRole);
-
-var _timerRole = require('./literal/timerRole');
-
-var _timerRole2 = _interopRequireDefault(_timerRole);
-
-var _toolbarRole = require('./literal/toolbarRole');
-
-var _toolbarRole2 = _interopRequireDefault(_toolbarRole);
-
-var _tooltipRole = require('./literal/tooltipRole');
-
-var _tooltipRole2 = _interopRequireDefault(_tooltipRole);
-
-var _treeRole = require('./literal/treeRole');
-
-var _treeRole2 = _interopRequireDefault(_treeRole);
-
-var _treegridRole = require('./literal/treegridRole');
-
-var _treegridRole2 = _interopRequireDefault(_treegridRole);
-
-var _treeitemRole = require('./literal/treeitemRole');
-
-var _treeitemRole2 = _interopRequireDefault(_treeitemRole);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var ariaLiteralRoles = new Map([['alert', _alertRole2.default], ['alertdialog', _alertdialogRole2.default], ['application', _applicationRole2.default], ['article', _articleRole2.default], ['banner', _bannerRole2.default], ['button', _buttonRole2.default], ['cell', _cellRole2.default], ['checkbox', _checkboxRole2.default], ['columnheader', _columnheaderRole2.default], ['combobox', _comboboxRole2.default], ['complementary', _complementaryRole2.default], ['contentinfo', _contentinfoRole2.default], ['definition', _definitionRole2.default], ['dialog', _dialogRole2.default], ['directory', _directoryRole2.default], ['document', _documentRole2.default], ['feed', _feedRole2.default], ['figure', _figureRole2.default], ['form', _formRole2.default], ['grid', _gridRole2.default], ['gridcell', _gridcellRole2.default], ['group', _groupRole2.default], ['heading', _headingRole2.default], ['img', _imgRole2.default], ['link', _linkRole2.default], ['list', _listRole2.default], ['listbox', _listboxRole2.default], ['listitem', _listitemRole2.default], ['log', _logRole2.default], ['main', _mainRole2.default], ['marquee', _marqueeRole2.default], ['math', _mathRole2.default], ['menu', _menuRole2.default], ['menubar', _menubarRole2.default], ['menuitem', _menuitemRole2.default], ['menuitemcheckbox', _menuitemcheckboxRole2.default], ['menuitemradio', _menuitemradioRole2.default], ['navigation', _navigationRole2.default], ['none', _noneRole2.default], ['note', _noteRole2.default], ['option', _optionRole2.default], ['presentation', _presentationRole2.default], ['progressbar', _progressbarRole2.default], ['radio', _radioRole2.default], ['radiogroup', _radiogroupRole2.default], ['region', _regionRole2.default], ['row', _rowRole2.default], ['rowgroup', _rowgroupRole2.default], ['rowheader', _rowheaderRole2.default], ['scrollbar', _scrollbarRole2.default], ['search', _searchRole2.default], ['searchbox', _searchboxRole2.default], ['separator', _separatorRole2.default], ['slider', _sliderRole2.default], ['spinbutton', _spinbuttonRole2.default], ['status', _statusRole2.default], ['switch', _switchRole2.default], ['tab', _tabRole2.default], ['table', _tableRole2.default], ['tablist', _tablistRole2.default], ['tabpanel', _tabpanelRole2.default], ['term', _termRole2.default], ['textbox', _textboxRole2.default], ['timer', _timerRole2.default], ['toolbar', _toolbarRole2.default], ['tooltip', _tooltipRole2.default], ['tree', _treeRole2.default], ['treegrid', _treegridRole2.default], ['treeitem', _treeitemRole2.default]]);
-exports.default = ariaLiteralRoles;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docAbstractRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docAbstractRole.js
deleted file mode 100644
index 3b982f7..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docAbstractRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docAbstractRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'abstract [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = docAbstractRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docAcknowledgmentsRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docAcknowledgmentsRole.js
deleted file mode 100644
index 481962c..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docAcknowledgmentsRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docAcknowledgmentsRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'acknowledgments [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docAcknowledgmentsRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docAfterwordRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docAfterwordRole.js
deleted file mode 100644
index f84ce5b..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docAfterwordRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docAfterwordRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'afterword [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docAfterwordRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docAppendixRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docAppendixRole.js
deleted file mode 100644
index 45e4cd6..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docAppendixRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docAppendixRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'appendix [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docAppendixRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docBacklinkRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docBacklinkRole.js
deleted file mode 100644
index 29ff715..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docBacklinkRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docBacklinkRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author', 'content'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'referrer [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'command', 'link']]
-};
-
-exports.default = docBacklinkRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docBiblioentryRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docBiblioentryRole.js
deleted file mode 100644
index 9494be3..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docBiblioentryRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docBiblioentryRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'EPUB biblioentry [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: ['doc-bibliography'],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'listitem']]
-};
-
-exports.default = docBiblioentryRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docBibliographyRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docBibliographyRole.js
deleted file mode 100644
index 359d7ee..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docBibliographyRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docBibliographyRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'bibliography [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [['doc-biblioentry']],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docBibliographyRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docBibliorefRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docBibliorefRole.js
deleted file mode 100644
index ae9c56d..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docBibliorefRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docBibliorefRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'biblioref [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'command', 'link']]
-};
-
-exports.default = docBibliorefRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docChapterRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docChapterRole.js
deleted file mode 100644
index 1a3bf92..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docChapterRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docChapterRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'chapter [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docChapterRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docColophonRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docColophonRole.js
deleted file mode 100644
index 46953c8..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docColophonRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docColophonRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'colophon [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = docColophonRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docConclusionRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docConclusionRole.js
deleted file mode 100644
index 6f97f54..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docConclusionRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docConclusionRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'conclusion [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docConclusionRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docCoverRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docCoverRole.js
deleted file mode 100644
index 7a1932f..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docCoverRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docCoverRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'cover [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'img']]
-};
-
-exports.default = docCoverRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docCreditRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docCreditRole.js
deleted file mode 100644
index 719e7d8..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docCreditRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docCreditRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'credit [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = docCreditRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docCreditsRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docCreditsRole.js
deleted file mode 100644
index 600095d..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docCreditsRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docCreditsRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'credits [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docCreditsRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docDedicationRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docDedicationRole.js
deleted file mode 100644
index 62f1ec4..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docDedicationRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docDedicationRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'dedication [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = docDedicationRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docEndnoteRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docEndnoteRole.js
deleted file mode 100644
index 091f25c..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docEndnoteRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docEndnoteRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'rearnote [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: ['doc-endnotes'],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'listitem']]
-};
-
-exports.default = docEndnoteRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docEndnotesRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docEndnotesRole.js
deleted file mode 100644
index 6762d0f..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docEndnotesRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docEndnotesRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'rearnotes [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [['doc-endnote']],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docEndnotesRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docEpigraphRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docEpigraphRole.js
deleted file mode 100644
index 25a249b..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docEpigraphRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docEpigraphRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'epigraph [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = docEpigraphRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docEpilogueRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docEpilogueRole.js
deleted file mode 100644
index 93cd59a..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docEpilogueRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docEpilogueRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'epilogue [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docEpilogueRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docErrataRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docErrataRole.js
deleted file mode 100644
index 1e6292b..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docErrataRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docErrataRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'errata [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docErrataRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docExampleRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docExampleRole.js
deleted file mode 100644
index 9303b45..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docExampleRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docExampleRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = docExampleRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docFootnoteRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docFootnoteRole.js
deleted file mode 100644
index 0f0c703..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docFootnoteRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docFootnoteRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'footnote [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = docFootnoteRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docForewordRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docForewordRole.js
deleted file mode 100644
index ef8d547..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docForewordRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docForewordRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'foreword [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docForewordRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docGlossaryRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docGlossaryRole.js
deleted file mode 100644
index 7e1a3c1..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docGlossaryRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docGlossaryRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'glossary [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [['term'], ['definition']],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docGlossaryRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docGlossrefRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docGlossrefRole.js
deleted file mode 100644
index 8ff014a..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docGlossrefRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docGlossrefRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'glossref [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'command', 'link']]
-};
-
-exports.default = docGlossrefRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docIndexRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docIndexRole.js
deleted file mode 100644
index 14a90c6..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docIndexRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docIndexRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'index [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark', 'navigation']]
-};
-
-exports.default = docIndexRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docIntroductionRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docIntroductionRole.js
deleted file mode 100644
index b0ac484..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docIntroductionRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docIntroductionRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'introduction [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docIntroductionRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docNoterefRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docNoterefRole.js
deleted file mode 100644
index e5d9717..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docNoterefRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docNoterefRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'noteref [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'command', 'link']]
-};
-
-exports.default = docNoterefRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docNoticeRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docNoticeRole.js
deleted file mode 100644
index 4d18713..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docNoticeRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docNoticeRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'notice [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'note']]
-};
-
-exports.default = docNoticeRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docPagebreakRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docPagebreakRole.js
deleted file mode 100644
index ef6d9d8..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docPagebreakRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docPagebreakRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'pagebreak [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'separator']]
-};
-
-exports.default = docPagebreakRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docPagelistRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docPagelistRole.js
deleted file mode 100644
index 47d909c..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docPagelistRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docPagelistRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'page-list [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark', 'navigation']]
-};
-
-exports.default = docPagelistRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docPartRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docPartRole.js
deleted file mode 100644
index b71e71f..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docPartRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docPartRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'part [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docPartRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docPrefaceRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docPrefaceRole.js
deleted file mode 100644
index 550286e..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docPrefaceRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docPrefaceRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'preface [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docPrefaceRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docPrologueRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docPrologueRole.js
deleted file mode 100644
index 3e6b491..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docPrologueRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docPrologueRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'prologue [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = docPrologueRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docPullquoteRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docPullquoteRole.js
deleted file mode 100644
index c17add8..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docPullquoteRole.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docPullquoteRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'pullquote [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['none']]
-};
-
-exports.default = docPullquoteRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docQnaRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docQnaRole.js
deleted file mode 100644
index 349ae5a..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docQnaRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docQnaRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'qna [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = docQnaRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docSubtitleRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docSubtitleRole.js
deleted file mode 100644
index 53edeae..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docSubtitleRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docSubtitleRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'subtitle [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'sectionhead']]
-};
-
-exports.default = docSubtitleRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docTipRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docTipRole.js
deleted file mode 100644
index f6a2b59..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docTipRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docTipRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'help [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'note']]
-};
-
-exports.default = docTipRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/dpub/docTocRole.js b/node_modules/aria-query/lib/etc/roles/dpub/docTocRole.js
deleted file mode 100644
index a9587ed..0000000
--- a/node_modules/aria-query/lib/etc/roles/dpub/docTocRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var docTocRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-describedat': null
-  },
-  relatedConcepts: [{
-    module: 'EPUB',
-    concept: {
-      name: 'toc [EPUB-SSV]'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark', 'navigation']]
-};
-
-exports.default = docTocRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/alertRole.js b/node_modules/aria-query/lib/etc/roles/literal/alertRole.js
deleted file mode 100644
index ca8fca6..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/alertRole.js
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var alertRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-atomic': 'true',
-    'aria-live': 'assertive'
-  },
-  relatedConcepts: [{
-    module: 'XForms',
-    concept: {
-      name: 'alert'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = alertRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/alertdialogRole.js b/node_modules/aria-query/lib/etc/roles/literal/alertdialogRole.js
deleted file mode 100644
index a7ef1f9..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/alertdialogRole.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var alertdialogRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'XForms',
-    concept: {
-      name: 'alert'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'alert'], ['roletype', 'window', 'dialog']]
-};
-
-exports.default = alertdialogRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/applicationRole.js b/node_modules/aria-query/lib/etc/roles/literal/applicationRole.js
deleted file mode 100644
index d6d60b9..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/applicationRole.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var applicationRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [{
-    concept: {
-      name: 'Device Independence Delivery Unit'
-    }
-  }],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-activedescendant': null
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure']]
-};
-
-exports.default = applicationRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/articleRole.js b/node_modules/aria-query/lib/etc/roles/literal/articleRole.js
deleted file mode 100644
index a8a0ab9..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/articleRole.js
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var articleRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-posinset': null,
-    'aria-setsize': null
-  },
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'article'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'document']]
-};
-
-exports.default = articleRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/bannerRole.js b/node_modules/aria-query/lib/etc/roles/literal/bannerRole.js
deleted file mode 100644
index 835e2c9..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/bannerRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var bannerRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = bannerRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/buttonRole.js b/node_modules/aria-query/lib/etc/roles/literal/buttonRole.js
deleted file mode 100644
index f776f2e..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/buttonRole.js
+++ /dev/null
@@ -1,38 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var buttonRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'button'
-    }
-  }],
-  childrenPresentational: true,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-expanded': null,
-    'aria-pressed': null
-  },
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'link'
-    }
-  }, {
-    module: 'XForms',
-    concept: {
-      name: 'trigger'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'command']]
-};
-
-exports.default = buttonRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/cellRole.js b/node_modules/aria-query/lib/etc/roles/literal/cellRole.js
deleted file mode 100644
index 63bdce1..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/cellRole.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var cellRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'td'
-    }
-  }],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-colindex': null,
-    'aria-colspan': null,
-    'aria-rowindex': null,
-    'aria-rowspan': null
-  },
-  relatedConcepts: [],
-  requireContextRole: ['row'],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = cellRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/checkboxRole.js b/node_modules/aria-query/lib/etc/roles/literal/checkboxRole.js
deleted file mode 100644
index f3c0e71..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/checkboxRole.js
+++ /dev/null
@@ -1,39 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var checkboxRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-checked': 'false',
-    'aria-readonly': null
-  },
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'option'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'checkbox'
-      }]
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {
-    'aria-checked': null
-  },
-  superClass: [['roletype', 'widget', 'input']]
-};
-
-exports.default = checkboxRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/columnheaderRole.js b/node_modules/aria-query/lib/etc/roles/literal/columnheaderRole.js
deleted file mode 100644
index 80386a5..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/columnheaderRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var columnheaderRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'th'
-    }
-  }],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-sort': null
-  },
-  relatedConcepts: [],
-  requireContextRole: ['row'],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'cell'], ['roletype', 'structure', 'section', 'cell', 'gridcell'], ['roletype', 'widget', 'gridcell'], ['roletype', 'structure', 'sectionhead']]
-};
-
-exports.default = columnheaderRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/comboboxRole.js b/node_modules/aria-query/lib/etc/roles/literal/comboboxRole.js
deleted file mode 100644
index 18c7b66..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/comboboxRole.js
+++ /dev/null
@@ -1,39 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var comboboxRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-expanded': 'false',
-    'aria-autocomplete': null,
-    'aria-required': null,
-    'aria-haspopup': 'listbox',
-    'aria-readonly': null
-  },
-  relatedConcepts: [{
-    module: 'XForms',
-    concept: {
-      name: 'select'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'select'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [['textbox'], ['listbox'], ['tree'], ['grid'], ['dialog']],
-  requiredProps: {
-    'aria-controls': null,
-    'aria-expanded': 'false'
-  },
-  superClass: [['roletype', 'widget', 'composite', 'select'], ['roletype', 'structure', 'section', 'group', 'select']]
-};
-
-exports.default = comboboxRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/complementaryRole.js b/node_modules/aria-query/lib/etc/roles/literal/complementaryRole.js
deleted file mode 100644
index 349cc77..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/complementaryRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var complementaryRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = complementaryRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/contentinfoRole.js b/node_modules/aria-query/lib/etc/roles/literal/contentinfoRole.js
deleted file mode 100644
index fb34dcd..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/contentinfoRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var contentinfoRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = contentinfoRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/definitionRole.js b/node_modules/aria-query/lib/etc/roles/literal/definitionRole.js
deleted file mode 100644
index d28c238..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/definitionRole.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var definitionRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'dd'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'dfn'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = definitionRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/dialogRole.js b/node_modules/aria-query/lib/etc/roles/literal/dialogRole.js
deleted file mode 100644
index fed41d0..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/dialogRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var dialogRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'window']]
-};
-
-exports.default = dialogRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/directoryRole.js b/node_modules/aria-query/lib/etc/roles/literal/directoryRole.js
deleted file mode 100644
index 605a37a..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/directoryRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var directoryRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'DAISY Guide'
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'list']]
-};
-
-exports.default = directoryRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/documentRole.js b/node_modules/aria-query/lib/etc/roles/literal/documentRole.js
deleted file mode 100644
index 36740f0..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/documentRole.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var documentRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-expanded': null
-  },
-  relatedConcepts: [{
-    concept: {
-      name: 'Device Independence Delivery Unit'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure']]
-};
-
-exports.default = documentRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/feedRole.js b/node_modules/aria-query/lib/etc/roles/literal/feedRole.js
deleted file mode 100644
index e3b9e55..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/feedRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var feedRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [['article']],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'list']]
-};
-
-exports.default = feedRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/figureRole.js b/node_modules/aria-query/lib/etc/roles/literal/figureRole.js
deleted file mode 100644
index 4ecbe3d..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/figureRole.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var figureRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'figure'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = figureRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/formRole.js b/node_modules/aria-query/lib/etc/roles/literal/formRole.js
deleted file mode 100644
index 65b0ad2..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/formRole.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var formRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'form'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = formRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/gridRole.js b/node_modules/aria-query/lib/etc/roles/literal/gridRole.js
deleted file mode 100644
index df0883c..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/gridRole.js
+++ /dev/null
@@ -1,33 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var gridRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'table',
-      attributes: [{
-        name: 'role',
-        value: 'grid'
-      }]
-    }
-  }],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-level': null,
-    'aria-multiselectable': null,
-    'aria-readonly': null
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [['rowgroup', 'row'], ['row']],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'composite'], ['roletype', 'structure', 'section', 'table']]
-};
-
-exports.default = gridRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/gridcellRole.js b/node_modules/aria-query/lib/etc/roles/literal/gridcellRole.js
deleted file mode 100644
index e82c740..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/gridcellRole.js
+++ /dev/null
@@ -1,33 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var gridcellRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'td',
-      attributes: [{
-        name: 'role',
-        value: 'gridcell'
-      }]
-    }
-  }],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-readonly': null,
-    'aria-required': null,
-    'aria-selected': null
-  },
-  relatedConcepts: [],
-  requireContextRole: ['row'],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'cell'], ['roletype', 'widget']]
-};
-
-exports.default = gridcellRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/groupRole.js b/node_modules/aria-query/lib/etc/roles/literal/groupRole.js
deleted file mode 100644
index 8f5f8c6..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/groupRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var groupRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-activedescendant': null
-  },
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'fieldset'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = groupRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/headingRole.js b/node_modules/aria-query/lib/etc/roles/literal/headingRole.js
deleted file mode 100644
index d6ba588..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/headingRole.js
+++ /dev/null
@@ -1,52 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var headingRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-level': '2'
-  },
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'h1'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'h2'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'h3'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'h4'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'h5'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'h6'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'sectionhead']]
-};
-
-exports.default = headingRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/imgRole.js b/node_modules/aria-query/lib/etc/roles/literal/imgRole.js
deleted file mode 100644
index ef8f91e..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/imgRole.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var imgRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'img'
-    }
-  }, {
-    module: 'DTB',
-    concept: {
-      name: 'imggroup'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = imgRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/linkRole.js b/node_modules/aria-query/lib/etc/roles/literal/linkRole.js
deleted file mode 100644
index 3e38a25..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/linkRole.js
+++ /dev/null
@@ -1,43 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var linkRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-expanded': null
-  },
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'a',
-      attributes: [{
-        name: 'href'
-      }]
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'area',
-      attributes: [{
-        name: 'href'
-      }]
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'link'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'command']]
-};
-
-exports.default = linkRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/listRole.js b/node_modules/aria-query/lib/etc/roles/literal/listRole.js
deleted file mode 100644
index 985e6aa..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/listRole.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var listRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'ol'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'ul'
-    }
-  }],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [['group', 'listitem'], ['listitem']],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = listRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/listboxRole.js b/node_modules/aria-query/lib/etc/roles/literal/listboxRole.js
deleted file mode 100644
index 237989e..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/listboxRole.js
+++ /dev/null
@@ -1,40 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var listboxRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-multiselectable': null,
-    'aria-readonly': null,
-    'aria-required': null,
-    'aria-orientation': 'vertical'
-  },
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'list'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'select'
-    }
-  }, {
-    module: 'XForms',
-    concept: {
-      name: 'select'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [['option']],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'composite', 'select'], ['roletype', 'structure', 'section', 'group', 'select']]
-};
-
-exports.default = listboxRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/listitemRole.js b/node_modules/aria-query/lib/etc/roles/literal/listitemRole.js
deleted file mode 100644
index 10d4896..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/listitemRole.js
+++ /dev/null
@@ -1,34 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var listitemRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'li'
-    }
-  }],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-level': null,
-    'aria-posinset': null,
-    'aria-setsize': null
-  },
-  relatedConcepts: [{
-    module: 'XForms',
-    concept: {
-      name: 'item'
-    }
-  }],
-  requireContextRole: ['group', 'list'],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = listitemRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/logRole.js b/node_modules/aria-query/lib/etc/roles/literal/logRole.js
deleted file mode 100644
index 967c73c..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/logRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var logRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-live': 'polite'
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = logRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/mainRole.js b/node_modules/aria-query/lib/etc/roles/literal/mainRole.js
deleted file mode 100644
index 9841c28..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/mainRole.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var mainRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'main'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = mainRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/marqueeRole.js b/node_modules/aria-query/lib/etc/roles/literal/marqueeRole.js
deleted file mode 100644
index ea2ab78..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/marqueeRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var marqueeRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = marqueeRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/mathRole.js b/node_modules/aria-query/lib/etc/roles/literal/mathRole.js
deleted file mode 100644
index c099bda..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/mathRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var mathRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = mathRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/menuRole.js b/node_modules/aria-query/lib/etc/roles/literal/menuRole.js
deleted file mode 100644
index 86865c6..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/menuRole.js
+++ /dev/null
@@ -1,42 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var menuRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-orientation': 'vertical'
-  },
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'list'
-    }
-  }, {
-    module: 'DTB',
-    concept: {
-      name: 'sidebar'
-    }
-  }, {
-    module: 'XForms',
-    concept: {
-      name: 'select'
-    }
-  }, {
-    module: 'JAPI',
-    concept: {
-      name: 'MENU'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [['group', 'menuitemradio'], ['menuitem'], ['menuitemcheckbox'], ['menuitemradio']],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'composite', 'select'], ['roletype', 'structure', 'section', 'group', 'select']]
-};
-
-exports.default = menuRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/menubarRole.js b/node_modules/aria-query/lib/etc/roles/literal/menubarRole.js
deleted file mode 100644
index 0f48587..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/menubarRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var menubarRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-orientation': 'vertical'
-  },
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'toolbar'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [['group', 'menuitemradio'], ['menuitem'], ['menuitemcheckbox'], ['menuitemradio']],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'composite', 'select', 'menu'], ['roletype', 'structure', 'section', 'group', 'select', 'menu']]
-};
-
-exports.default = menubarRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/menuitemRole.js b/node_modules/aria-query/lib/etc/roles/literal/menuitemRole.js
deleted file mode 100644
index 2ff41cd..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/menuitemRole.js
+++ /dev/null
@@ -1,43 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var menuitemRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-posinset': null,
-    'aria-setsize': null
-  },
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'option'
-    }
-  }, {
-    module: 'ARIA',
-    concept: {
-      name: 'listitem'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'menuitem'
-    }
-  }, {
-    module: 'JAPI',
-    concept: {
-      name: 'MENU_ITEM'
-    }
-  }],
-  requireContextRole: ['group', 'menu', 'menubar'],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'command']]
-};
-
-exports.default = menuitemRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/menuitemcheckboxRole.js b/node_modules/aria-query/lib/etc/roles/literal/menuitemcheckboxRole.js
deleted file mode 100644
index c47211d..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/menuitemcheckboxRole.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var menuitemcheckboxRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-checked': 'false'
-  },
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'menuitem'
-    }
-  }],
-  requireContextRole: ['menu', 'menubar'],
-  requiredOwnedElements: [],
-  requiredProps: {
-    'aria-checked': null
-  },
-  superClass: [['roletype', 'widget', 'command', 'menuitem'], ['roletype', 'widget', 'input', 'checkbox']]
-};
-
-exports.default = menuitemcheckboxRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/menuitemradioRole.js b/node_modules/aria-query/lib/etc/roles/literal/menuitemradioRole.js
deleted file mode 100644
index 845a33e..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/menuitemradioRole.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var menuitemradioRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-checked': 'false'
-  },
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'menuitem'
-    }
-  }],
-  requireContextRole: ['group', 'menu', 'menubar'],
-  requiredOwnedElements: [],
-  requiredProps: {
-    'aria-checked': null
-  },
-  superClass: [['roletype', 'widget', 'command', 'menuitem', 'menuitemcheckbox'], ['roletype', 'widget', 'input', 'checkbox', 'menuitemcheckbox'], ['roletype', 'widget', 'input', 'radio']]
-};
-
-exports.default = menuitemradioRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/navigationRole.js b/node_modules/aria-query/lib/etc/roles/literal/navigationRole.js
deleted file mode 100644
index 9bb2dcc..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/navigationRole.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var navigationRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'nav'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = navigationRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/noneRole.js b/node_modules/aria-query/lib/etc/roles/literal/noneRole.js
deleted file mode 100644
index f426bb2..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/noneRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var noneRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: [],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: []
-};
-
-exports.default = noneRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/noteRole.js b/node_modules/aria-query/lib/etc/roles/literal/noteRole.js
deleted file mode 100644
index 8e5866b..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/noteRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var noteRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = noteRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/optionRole.js b/node_modules/aria-query/lib/etc/roles/literal/optionRole.js
deleted file mode 100644
index 4996428..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/optionRole.js
+++ /dev/null
@@ -1,42 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var optionRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'option'
-    }
-  }],
-  childrenPresentational: true,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-checked': null,
-    'aria-posinset': null,
-    'aria-selected': 'false',
-    'aria-setsize': null
-  },
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'listitem'
-    }
-  }, {
-    module: 'XForms',
-    concept: {
-      name: 'item'
-    }
-  }],
-  requireContextRole: ['listbox'],
-  requiredOwnedElements: [],
-  requiredProps: {
-    'aria-selected': 'false'
-  },
-  superClass: [['roletype', 'widget', 'input']]
-};
-
-exports.default = optionRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/presentationRole.js b/node_modules/aria-query/lib/etc/roles/literal/presentationRole.js
deleted file mode 100644
index 7ca3b0a..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/presentationRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var presentationRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure']]
-};
-
-exports.default = presentationRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/progressbarRole.js b/node_modules/aria-query/lib/etc/roles/literal/progressbarRole.js
deleted file mode 100644
index 1c6e689..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/progressbarRole.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var progressbarRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'status'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'range']]
-};
-
-exports.default = progressbarRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/radioRole.js b/node_modules/aria-query/lib/etc/roles/literal/radioRole.js
deleted file mode 100644
index a3a14be..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/radioRole.js
+++ /dev/null
@@ -1,36 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var radioRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-checked': 'false',
-    'aria-posinset': null,
-    'aria-selected': null,
-    'aria-setsize': null
-  },
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'radio'
-      }]
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {
-    'aria-checked': 'false'
-  },
-  superClass: [['roletype', 'widget', 'input']]
-};
-
-exports.default = radioRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/radiogroupRole.js b/node_modules/aria-query/lib/etc/roles/literal/radiogroupRole.js
deleted file mode 100644
index 60b243d..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/radiogroupRole.js
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var radiogroupRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-readonly': null,
-    'aria-required': null
-  },
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'list'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [['radio']],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'composite', 'select'], ['roletype', 'structure', 'section', 'group', 'select']]
-};
-
-exports.default = radiogroupRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/regionRole.js b/node_modules/aria-query/lib/etc/roles/literal/regionRole.js
deleted file mode 100644
index 0d467e7..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/regionRole.js
+++ /dev/null
@@ -1,41 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var regionRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [
-  // frame tag on html5 is deprecated
-  {
-    module: 'HTML',
-    concept: {
-      name: 'frame'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'section'
-    }
-  }, {
-    concept: {
-      name: 'Device Independence Glossart perceivable unit'
-    }
-  }, {
-    module: 'ARIA',
-    concept: {
-      name: 'section'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = regionRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/rowRole.js b/node_modules/aria-query/lib/etc/roles/literal/rowRole.js
deleted file mode 100644
index d7ff890..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/rowRole.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var rowRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'tr'
-    }
-  }],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-colindex': null,
-    'aria-level': null,
-    'aria-rowindex': null,
-    'aria-selected': null
-  },
-  relatedConcepts: [],
-  requireContextRole: ['grid', 'rowgroup', 'table', 'treegrid'],
-  requiredOwnedElements: [['cell'], ['columnheader'], ['gridcell'], ['rowheader']],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'group'], ['roletype', 'widget']]
-};
-
-exports.default = rowRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/rowgroupRole.js b/node_modules/aria-query/lib/etc/roles/literal/rowgroupRole.js
deleted file mode 100644
index 0727eb8..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/rowgroupRole.js
+++ /dev/null
@@ -1,38 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var rowgroupRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'tbody'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'tfoot'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'thead'
-    }
-  }],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-activedescendant': null,
-    'aria-expanded': null
-  },
-  relatedConcepts: [],
-  requireContextRole: ['grid', 'table', 'treegrid'],
-  requiredOwnedElements: [['row']],
-  requiredProps: {},
-  superClass: [['roletype', 'structure']]
-};
-
-exports.default = rowgroupRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/rowheaderRole.js b/node_modules/aria-query/lib/etc/roles/literal/rowheaderRole.js
deleted file mode 100644
index 070456b..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/rowheaderRole.js
+++ /dev/null
@@ -1,31 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var rowheaderRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'th',
-      attributes: [{
-        name: 'scope',
-        value: 'row'
-      }]
-    }
-  }],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-sort': null
-  },
-  relatedConcepts: [],
-  requireContextRole: ['row'],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'cell'], ['roletype', 'structure', 'section', 'cell', 'gridcell'], ['roletype', 'widget', 'gridcell'], ['roletype', 'structure', 'sectionhead']]
-};
-
-exports.default = rowheaderRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/scrollbarRole.js b/node_modules/aria-query/lib/etc/roles/literal/scrollbarRole.js
deleted file mode 100644
index 5096426..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/scrollbarRole.js
+++ /dev/null
@@ -1,48 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var scrollbarRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author'],
-  props: {
-    'aria-controls': null,
-    'aria-orientation': null,
-    'aria-valuemax': null,
-    'aria-valuemin': null,
-    'aria-valuenow': null,
-    'aria-atomic': null,
-    'aria-busy': null,
-    'aria-describedby': null,
-    'aria-disabled': null,
-    'aria-dropeffect': null,
-    'aria-flowto': null,
-    'aria-grabbed': null,
-    'aria-haspopup': null,
-    'aria-hidden': null,
-    'aria-invalid': null,
-    'aria-label': null,
-    'aria-labelledby': null,
-    'aria-live': null,
-    'aria-owns': null,
-    'aria-relevant': null,
-    'aria-valuetext': null
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {
-    'aria-controls': null,
-    'aria-orientation': null,
-    'aria-valuemax': null,
-    'aria-valuemin': null,
-    'aria-valuenow': null
-  },
-  superClass: []
-};
-
-exports.default = scrollbarRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/searchRole.js b/node_modules/aria-query/lib/etc/roles/literal/searchRole.js
deleted file mode 100644
index 61d55e3..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/searchRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var searchRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'landmark']]
-};
-
-exports.default = searchRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/searchboxRole.js b/node_modules/aria-query/lib/etc/roles/literal/searchboxRole.js
deleted file mode 100644
index eb43a1a..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/searchboxRole.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var searchboxRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'search'
-      }]
-    }
-  }],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'input', 'textbox']]
-};
-
-exports.default = searchboxRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/separatorRole.js b/node_modules/aria-query/lib/etc/roles/literal/separatorRole.js
deleted file mode 100644
index f24a931..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/separatorRole.js
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var separatorRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author'],
-  props: {
-    'aria-expanded': null,
-    'aria-orientation': 'horizontal'
-  },
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'hr'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure']]
-};
-
-exports.default = separatorRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/sliderRole.js b/node_modules/aria-query/lib/etc/roles/literal/sliderRole.js
deleted file mode 100644
index 4d7fdb4..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/sliderRole.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var sliderRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author'],
-  props: {
-    'aria-orientation': 'horizontal',
-    'aria-readonly': null,
-    'aria-valuemax': '100',
-    'aria-valuemin': '0',
-    'aria-valuenow': '50'
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {
-    'aria-valuemax': '100',
-    'aria-valuemin': '0',
-    'aria-valuenow': '50'
-  },
-  superClass: [['roletype', 'widget', 'input'], ['roletype', 'widget', 'range']]
-};
-
-exports.default = sliderRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/spinbuttonRole.js b/node_modules/aria-query/lib/etc/roles/literal/spinbuttonRole.js
deleted file mode 100644
index 5b94404..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/spinbuttonRole.js
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var spinbuttonRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-valuenow': '0',
-    'aria-required': null,
-    'aria-readonly': null
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {
-    'aria-valuemax': null,
-    'aria-valuemin': null,
-    'aria-valuenow': '0'
-  },
-  superClass: [['roletype', 'widget', 'composite'], ['roletype', 'widget', 'input'], ['roletype', 'widget', 'range']]
-};
-
-exports.default = spinbuttonRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/statusRole.js b/node_modules/aria-query/lib/etc/roles/literal/statusRole.js
deleted file mode 100644
index 860322e..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/statusRole.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var statusRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-atomic': 'true',
-    'aria-live': 'polite'
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = statusRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/switchRole.js b/node_modules/aria-query/lib/etc/roles/literal/switchRole.js
deleted file mode 100644
index 7bbf3bd..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/switchRole.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var switchRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-checked': 'false'
-  },
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'button'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {
-    'aria-checked': 'false'
-  },
-  superClass: [['roletype', 'widget', 'input', 'checkbox']]
-};
-
-exports.default = switchRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/tabRole.js b/node_modules/aria-query/lib/etc/roles/literal/tabRole.js
deleted file mode 100644
index ef0c547..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/tabRole.js
+++ /dev/null
@@ -1,24 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var tabRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: true,
-  nameFrom: ['author', 'contents'],
-  props: {
-    'aria-posinset': null,
-    'aria-selected': 'false',
-    'aria-setsize': null
-  },
-  relatedConcepts: [],
-  requireContextRole: ['tablist'],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'sectionhead'], ['roletype', 'widget']]
-};
-
-exports.default = tabRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/tableRole.js b/node_modules/aria-query/lib/etc/roles/literal/tableRole.js
deleted file mode 100644
index 11087db..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/tableRole.js
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var tableRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'table'
-    }
-  }],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-colcount': null,
-    'aria-rowcount': null
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [['row'], ['rowgroup', 'row']],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = tableRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/tablistRole.js b/node_modules/aria-query/lib/etc/roles/literal/tablistRole.js
deleted file mode 100644
index 09a88c6..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/tablistRole.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var tablistRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-level': null,
-    'aria-multiselectable': null,
-    'aria-orientation': 'horizontal',
-    'aria-expanded': null
-  },
-  relatedConcepts: [{
-    module: 'DAISY',
-    concept: {
-      name: 'guide'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [['tab']],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'composite']]
-};
-
-exports.default = tablistRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/tabpanelRole.js b/node_modules/aria-query/lib/etc/roles/literal/tabpanelRole.js
deleted file mode 100644
index 82d145f..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/tabpanelRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var tabpanelRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = tabpanelRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/termRole.js b/node_modules/aria-query/lib/etc/roles/literal/termRole.js
deleted file mode 100644
index 913a02f..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/termRole.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var termRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'dt'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = termRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/textboxRole.js b/node_modules/aria-query/lib/etc/roles/literal/textboxRole.js
deleted file mode 100644
index d70d9c8..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/textboxRole.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var textboxRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-activedescendant': null,
-    'aria-autocomplete': null,
-    'aria-multiline': null,
-    'aria-placeholder': null,
-    'aria-readonly': null,
-    'aria-required': null
-  },
-  relatedConcepts: [{
-    module: 'XForms',
-    concept: {
-      name: 'input'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'textarea'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'input'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'text'
-      }]
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'input']]
-};
-
-exports.default = textboxRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/timerRole.js b/node_modules/aria-query/lib/etc/roles/literal/timerRole.js
deleted file mode 100644
index 406471c..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/timerRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var timerRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'status']]
-};
-
-exports.default = timerRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/toolbarRole.js b/node_modules/aria-query/lib/etc/roles/literal/toolbarRole.js
deleted file mode 100644
index 3b51df1..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/toolbarRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var toolbarRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-orientation': 'horizontal'
-  },
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'menubar'
-    }
-  }],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'group']]
-};
-
-exports.default = toolbarRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/tooltipRole.js b/node_modules/aria-query/lib/etc/roles/literal/tooltipRole.js
deleted file mode 100644
index 7c1f317..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/tooltipRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var tooltipRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section']]
-};
-
-exports.default = tooltipRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/treeRole.js b/node_modules/aria-query/lib/etc/roles/literal/treeRole.js
deleted file mode 100644
index ed73b30..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/treeRole.js
+++ /dev/null
@@ -1,24 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var treeRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {
-    'aria-multiselectable': null,
-    'aria-required': null,
-    'aria-orientation': 'vertical'
-  },
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [['group', 'treeitem'], ['treeitem']],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'composite', 'select'], ['roletype', 'structure', 'section', 'group', 'select']]
-};
-
-exports.default = treeRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/treegridRole.js b/node_modules/aria-query/lib/etc/roles/literal/treegridRole.js
deleted file mode 100644
index 11f64ff..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/treegridRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var treegridRole = {
-  abstract: false,
-  accessibleNameRequired: false,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: [],
-  requiredOwnedElements: [['rowgroup', 'row'], ['row']],
-  requiredProps: {},
-  superClass: [['roletype', 'widget', 'composite', 'grid'], ['roletype', 'structure', 'section', 'table', 'grid'], ['roletype', 'widget', 'composite', 'select', 'tree'], ['roletype', 'structure', 'section', 'group', 'select', 'tree']]
-};
-
-exports.default = treegridRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/etc/roles/literal/treeitemRole.js b/node_modules/aria-query/lib/etc/roles/literal/treeitemRole.js
deleted file mode 100644
index 3a2d653..0000000
--- a/node_modules/aria-query/lib/etc/roles/literal/treeitemRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var treeitemRole = {
-  abstract: false,
-  accessibleNameRequired: true,
-  baseConcepts: [],
-  childrenPresentational: false,
-  nameFrom: ['author', 'contents'],
-  props: {},
-  relatedConcepts: [],
-  requireContextRole: ['group', 'tree'],
-  requiredOwnedElements: [],
-  requiredProps: {},
-  superClass: [['roletype', 'structure', 'section', 'listitem'], ['roletype', 'widget', 'input', 'option']]
-};
-
-exports.default = treeitemRole;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/index.js b/node_modules/aria-query/lib/index.js
deleted file mode 100644
index 7aaae85..0000000
--- a/node_modules/aria-query/lib/index.js
+++ /dev/null
@@ -1,35 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.roleElements = exports.elementRoles = exports.roles = exports.dom = exports.aria = undefined;
-
-var _ariaPropsMap = require('./ariaPropsMap');
-
-var _ariaPropsMap2 = _interopRequireDefault(_ariaPropsMap);
-
-var _domMap = require('./domMap');
-
-var _domMap2 = _interopRequireDefault(_domMap);
-
-var _rolesMap = require('./rolesMap');
-
-var _rolesMap2 = _interopRequireDefault(_rolesMap);
-
-var _elementRoleMap = require('./elementRoleMap');
-
-var _elementRoleMap2 = _interopRequireDefault(_elementRoleMap);
-
-var _roleElementMap = require('./roleElementMap');
-
-var _roleElementMap2 = _interopRequireDefault(_roleElementMap);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var aria = exports.aria = _ariaPropsMap2.default;
-
-var dom = exports.dom = _domMap2.default;
-var roles = exports.roles = _rolesMap2.default;
-var elementRoles = exports.elementRoles = _elementRoleMap2.default;
-var roleElements = exports.roleElements = _roleElementMap2.default;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/roleElementMap.js b/node_modules/aria-query/lib/roleElementMap.js
deleted file mode 100644
index 3e2877f..0000000
--- a/node_modules/aria-query/lib/roleElementMap.js
+++ /dev/null
@@ -1,33 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _rolesMap = require('./rolesMap');
-
-var _rolesMap2 = _interopRequireDefault(_rolesMap);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
-
-var roleElementMap = new Map([]);
-
-[].concat(_toConsumableArray(_rolesMap2.default.keys())).forEach(function (key) {
-  var role = _rolesMap2.default.get(key);
-  if (role) {
-    [].concat(_toConsumableArray(role.baseConcepts), _toConsumableArray(role.relatedConcepts)).forEach(function (relation) {
-      if (relation.module === 'HTML') {
-        var concept = relation.concept;
-        if (concept) {
-          var relationConcepts = roleElementMap.get(key) || new Set([]);
-          relationConcepts.add(concept);
-          roleElementMap.set(key, relationConcepts);
-        }
-      }
-    });
-  }
-});
-
-exports.default = roleElementMap;
\ No newline at end of file
diff --git a/node_modules/aria-query/lib/rolesMap.js b/node_modules/aria-query/lib/rolesMap.js
deleted file mode 100644
index d6c6f3b..0000000
--- a/node_modules/aria-query/lib/rolesMap.js
+++ /dev/null
@@ -1,108 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _ariaAbstractRoles = require('./etc/roles/ariaAbstractRoles');
-
-var _ariaAbstractRoles2 = _interopRequireDefault(_ariaAbstractRoles);
-
-var _ariaLiteralRoles = require('./etc/roles/ariaLiteralRoles');
-
-var _ariaLiteralRoles2 = _interopRequireDefault(_ariaLiteralRoles);
-
-var _ariaDpubRoles = require('./etc/roles/ariaDpubRoles');
-
-var _ariaDpubRoles2 = _interopRequireDefault(_ariaDpubRoles);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var rolesMap = new Map([]);
-[_ariaAbstractRoles2.default, _ariaLiteralRoles2.default, _ariaDpubRoles2.default].forEach(function (roleSet) {
-  roleSet.forEach(function (roleDefinition, name) {
-    return rolesMap.set(name, roleDefinition);
-  });
-});
-
-rolesMap.forEach(function (roleDefinition, name) {
-  // Conglomerate the properties
-  var _iteratorNormalCompletion = true;
-  var _didIteratorError = false;
-  var _iteratorError = undefined;
-
-  try {
-    for (var _iterator = roleDefinition.superClass[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-      var superClassIter = _step.value;
-      var _iteratorNormalCompletion2 = true;
-      var _didIteratorError2 = false;
-      var _iteratorError2 = undefined;
-
-      try {
-        for (var _iterator2 = superClassIter[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
-          var superClassName = _step2.value;
-
-          var superClassDefinition = rolesMap.get(superClassName);
-          if (superClassDefinition) {
-            var _iteratorNormalCompletion3 = true;
-            var _didIteratorError3 = false;
-            var _iteratorError3 = undefined;
-
-            try {
-              for (var _iterator3 = Object.keys(superClassDefinition.props)[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
-                var prop = _step3.value;
-
-                if (!Object.prototype.hasOwnProperty.call(roleDefinition.props, prop)) {
-                  Object.assign(roleDefinition.props, _defineProperty({}, prop, superClassDefinition.props[prop]));
-                }
-              }
-            } catch (err) {
-              _didIteratorError3 = true;
-              _iteratorError3 = err;
-            } finally {
-              try {
-                if (!_iteratorNormalCompletion3 && _iterator3.return) {
-                  _iterator3.return();
-                }
-              } finally {
-                if (_didIteratorError3) {
-                  throw _iteratorError3;
-                }
-              }
-            }
-          }
-        }
-      } catch (err) {
-        _didIteratorError2 = true;
-        _iteratorError2 = err;
-      } finally {
-        try {
-          if (!_iteratorNormalCompletion2 && _iterator2.return) {
-            _iterator2.return();
-          }
-        } finally {
-          if (_didIteratorError2) {
-            throw _iteratorError2;
-          }
-        }
-      }
-    }
-  } catch (err) {
-    _didIteratorError = true;
-    _iteratorError = err;
-  } finally {
-    try {
-      if (!_iteratorNormalCompletion && _iterator.return) {
-        _iterator.return();
-      }
-    } finally {
-      if (_didIteratorError) {
-        throw _iteratorError;
-      }
-    }
-  }
-});
-
-exports.default = rolesMap;
\ No newline at end of file
diff --git a/node_modules/aria-query/package.json b/node_modules/aria-query/package.json
deleted file mode 100644
index 1432a36..0000000
--- a/node_modules/aria-query/package.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
-  "name": "aria-query",
-  "version": "3.0.0",
-  "description": "Programmatic access to the ARIA specification",
-  "main": "lib/index.js",
-  "files": [
-    "lib"
-  ],
-  "scripts": {
-    "build": "rimraf lib && babel src --out-dir lib",
-    "prepublish": "npm run lint && npm run flow && npm run test && npm run build",
-    "coveralls": "cat ./reports/lcov.info | coveralls",
-    "flow": "flow; test $? -eq 0 -o $? -eq 2",
-    "lint": "eslint  --config .eslintrc src __tests__",
-    "lint:fix": "npm run lint -- --fix",
-    "pretest": "npm run lint:fix && npm run flow",
-    "test": "jest --coverage",
-    "output_as_hack": "babel-node ./scripts/output_as_hack.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/A11yance/aria-query.git"
-  },
-  "keywords": [
-    "accessibility",
-    "ARIA"
-  ],
-  "author": "Jesse Beach <splendidnoise@gmail.com>",
-  "license": "Apache-2.0",
-  "bugs": {
-    "url": "https://github.com/A11yance/aria-query/issues"
-  },
-  "homepage": "https://github.com/A11yance/aria-query#readme",
-  "devDependencies": {
-    "babel-cli": "^6.18.0",
-    "babel-core": "^6.21.0",
-    "babel-eslint": "^7.1.1",
-    "babel-jest": "^18.0.0",
-    "babel-plugin-transform-flow-strip-types": "^6.21.0",
-    "babel-plugin-transform-object-rest-spread": "^6.20.2",
-    "babel-polyfill": "^6.20.0",
-    "babel-preset-es2015": "^6.18.0",
-    "coveralls": "^2.11.15",
-    "eslint": "^3.13.1",
-    "eslint-plugin-flowtype": "^2.30.0",
-    "eslint-plugin-import": "^2.2.0",
-    "expect": "^1.20.2",
-    "flow-bin": "^0.40.0",
-    "jest": "^18.1.0",
-    "minimist": "^1.2.0",
-    "rimraf": "^2.5.4"
-  },
-  "dependencies": {
-    "ast-types-flow": "0.0.7",
-    "commander": "^2.11.0"
-  },
-  "jest": {
-    "coverageReporters": [
-      "lcov"
-    ],
-    "coverageDirectory": "reports",
-    "testPathDirs": [
-      "<rootDir>/__tests__"
-    ]
-  }
-}
diff --git a/node_modules/ast-types-flow/README.md b/node_modules/ast-types-flow/README.md
deleted file mode 100644
index 61daf69..0000000
--- a/node_modules/ast-types-flow/README.md
+++ /dev/null
@@ -1,99 +0,0 @@
-# ast-types-flow
-
-Flow types for the Javascript AST. Based off of [benjamn/ast-types](https://github.com/benjamn/ast-types).
-
-## Usage
-
-First install `ast-types-flow` via npm, then you can import any of the types
-that are exported.
-
-```javascript
-/* @flow */
-
-import type {Node} from 'ast-types-flow';
-
-function getName(node: Node): string {
-  switch (node.type) {
-    case 'Identifier':
-      return node.name;
-
-    case 'ClassDeclaration':
-      return node.id.name; // Error, id could be null.
-
-    case 'FunctionDeclaration':
-      return node.id.name; // Fine if it's always there.
-
-    case 'FunctionExpression':
-      if (node.id) {
-        return node.id.name; // Can refine id to make sure it exists.
-      } else {
-        return 'Unknown';
-      }
-
-    case 'Literal':
-      return node.name; // Error, Literals don't have names, don't be silly.
-  }
-  return 'Unknown';
-}
-```
-
-## How it works
-
-A notion of "extends" is added to the Flow syntax via comments. A transform is
-included that will compile the source code into useful disjoint union types
-based on how the different types extend each other. For example:
-
-```javascript
-type Node = {
-  common: string,
-};
-
-type Foo = {
-  // extends Node
-  foo: string,
-};
-
-type Bar = {
-  // extends Node
-  bar: number,
-};
-```
-
-Will be transformed into:
-
-```javascript
-type Node = {
-  type: 'Foo',
-  _Foo: void,
-  common: string,
-  foo: string,
-} | {
-  type: 'Bar',
-  _Bar: void,
-  common: string,
-  bar: number,
-};
-
-type Foo = {
-  type: 'Foo',
-  _Foo: void,
-  common: string,
-  foo: string,
-};
-
-type Bar = {
-  type: 'Bar',
-  _Foo: void,
-  common: string,
-  bar: number,
-};
-```
-
-A few things to note:
-
-1. The type `Node` would more ideally be compiled into `Foo | Bar` but then the
-disjoint union cannot be properly refined. For now we have to duplicate the
-complete definitions.
-2. Each entry in a disjoint union has to be structurally unique or Flow will
-have an error on the definition. That is why the private `_Foo: void` fields
-appear in the types.
diff --git a/node_modules/ast-types-flow/lib/types.js b/node_modules/ast-types-flow/lib/types.js
deleted file mode 100644
index 4f7e499..0000000
--- a/node_modules/ast-types-flow/lib/types.js
+++ /dev/null
@@ -1,5045 +0,0 @@
-/**
- * @flow
- */
-
-'use strict';
-
-/*
- * Flow types for the Babylon AST.
- */
-
-// Abstract types. Something must extend these.
-
-export type Comment = {
-  type: 'CommentLine';
-  _CommentLine: void;
-  value: string;
-  end: number;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-} | {
-  type: 'CommentBlock';
-  _CommentBlock: void;
-  value: string;
-  end: number;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-};
-
-export type Declaration = {
-  type: 'ClassBody';
-  _ClassBody: void;
-  body: Array<Node>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ClassDeclaration';
-  _ClassDeclaration: void;
-  body: ClassBody;
-  id: ?Identifier;
-  superClass: ?Expression;
-  decorators: any;
-  superTypeParameters: any;
-  typeParameters: any;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'FunctionDeclaration';
-  _FunctionDeclaration: void;
-  body: BlockStatement;
-  id: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-  async: boolean;
-  defaults: Array<?Expression>;
-  expression: boolean;
-  generator: boolean;
-  params: Array<Pattern>;
-  rest: ?Identifier;
-  returnType: ?TypeAnnotation;
-  typeParameters: ?TypeParameterDeclaration;
-} | {
-  type: 'MethodDefinition';
-  _MethodDefinition: void;
-  computed: boolean;
-  key: Node;
-  kind: 'constructor' | 'method' | 'get' | 'set';
-  static: boolean;
-  value: FunctionExpression;
-  decorators: ?Array<Decorator>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'VariableDeclaration';
-  _VariableDeclaration: void;
-  declarations: Array<VariableDeclarator>;
-  kind: 'var' | 'let' | 'const';
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ClassProperty';
-  _ClassProperty: void;
-  computed: boolean;
-  key: Node;
-  static: boolean;
-  typeAnnotation: ?TypeAnnotation;
-  value: ?Expression;
-  decorators: Array<Decorator>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type Expression = {
-  type: 'ArrayExpression';
-  _ArrayExpression: void;
-  elements: Array<?Node>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'AssignmentExpression';
-  _AssignmentExpression: void;
-  left: Pattern;
-  operator: AssignmentOperator;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'AwaitExpression';
-  _AwaitExpression: void;
-  all: boolean;
-  argument: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'BinaryExpression';
-  _BinaryExpression: void;
-  left: Expression;
-  operator: BinaryOperator;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'BindExpression';
-  _BindExpression: void;
-  callee: Node;
-  object: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'CallExpression';
-  _CallExpression: void;
-  arguments: Array<Node>;
-  callee: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ClassExpression';
-  _ClassExpression: void;
-  body: ClassBody;
-  id: ?Identifier;
-  superClass: ?Expression;
-  decorators: any;
-  superTypeParameters: any;
-  typeParameters: any;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ComprehensionExpression';
-  _ComprehensionExpression: void;
-  body: Expression;
-  blocks: Array<ComprehensionBlock>;
-  filter: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ConditionalExpression';
-  _ConditionalExpression: void;
-  alternate: Expression;
-  consequent: Expression;
-  test: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DoExpression';
-  _DoExpression: void;
-  body: Statement;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'FunctionExpression';
-  _FunctionExpression: void;
-  body: BlockStatement;
-  id: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-  async: boolean;
-  defaults: Array<?Expression>;
-  expression: boolean;
-  generator: boolean;
-  params: Array<Pattern>;
-  rest: ?Identifier;
-  returnType: ?TypeAnnotation;
-  typeParameters: ?TypeParameterDeclaration;
-} | {
-  type: 'Identifier';
-  _Identifier: void;
-  name: string;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'Literal';
-  _Literal: void;
-  raw: string;
-  regex: ?{pattern: string, flags: string};
-  value: ?(string | boolean | number | RegExp);
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'LogicalExpression';
-  _LogicalExpression: void;
-  left: Expression;
-  operator: LogicalOperator;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'MemberExpression';
-  _MemberExpression: void;
-  computed: boolean;
-  object: Expression;
-  property: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'NewExpression';
-  _NewExpression: void;
-  arguments: Array<Node>;
-  callee: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ObjectExpression';
-  _ObjectExpression: void;
-  properties: Array<Node>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'SequenceExpression';
-  _SequenceExpression: void;
-  expression: Array<Expression>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TaggedTemplateExpression';
-  _TaggedTemplateExpression: void;
-  quasi: TemplateLiteral;
-  tag: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TemplateLiteral';
-  _TemplateLiteral: void;
-  expressions: Array<Expression>;
-  quasis: Array<TemplateElement>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ThisExpression';
-  _ThisExpression: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'UnaryExpression';
-  _UnaryExpression: void;
-  argument: Expression;
-  operator: UnaryOperator;
-  prefix: true;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'UpdateExpression';
-  _UpdateExpression: void;
-  argument: Expression;
-  operator: UpdateOperator;
-  prefix: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'YieldExpression';
-  _YieldExpression: void;
-  argument: ?Expression;
-  delegate: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TypeCastExpression';
-  _TypeCastExpression: void;
-  expression: Expression;
-  typeAnnotation: TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXElement';
-  _JSXElement: void;
-  children: Array<Node>;
-  closingElement: ?JSXClosingElement;
-  openingElement: JSXOpeningElement;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXEmptyExpression';
-  _JSXEmptyExpression: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXExpressionContainer';
-  _JSXExpressionContainer: void;
-  expression: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXMemberExpression';
-  _JSXMemberExpression: void;
-  computed: boolean;
-  object: Node;
-  property: JSXIdentifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type Function = {
-  type: 'ArrowFunctionExpression';
-  _ArrowFunctionExpression: void;
-  body: Node;
-  id: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-  async: boolean;
-  defaults: Array<?Expression>;
-  expression: boolean;
-  generator: boolean;
-  params: Array<Pattern>;
-  rest: ?Identifier;
-  returnType: ?TypeAnnotation;
-  typeParameters: ?TypeParameterDeclaration;
-} | {
-  type: 'FunctionDeclaration';
-  _FunctionDeclaration: void;
-  body: BlockStatement;
-  id: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-  async: boolean;
-  defaults: Array<?Expression>;
-  expression: boolean;
-  generator: boolean;
-  params: Array<Pattern>;
-  rest: ?Identifier;
-  returnType: ?TypeAnnotation;
-  typeParameters: ?TypeParameterDeclaration;
-} | {
-  type: 'FunctionExpression';
-  _FunctionExpression: void;
-  body: BlockStatement;
-  id: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-  async: boolean;
-  defaults: Array<?Expression>;
-  expression: boolean;
-  generator: boolean;
-  params: Array<Pattern>;
-  rest: ?Identifier;
-  returnType: ?TypeAnnotation;
-  typeParameters: ?TypeParameterDeclaration;
-};
-
-export type Node = {
-  type: 'ArrayExpression';
-  _ArrayExpression: void;
-  elements: Array<?Node>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ArrayPattern';
-  _ArrayPattern: void;
-  elements: Array<?Node>;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ArrowFunctionExpression';
-  _ArrowFunctionExpression: void;
-  body: Node;
-  id: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-  async: boolean;
-  defaults: Array<?Expression>;
-  expression: boolean;
-  generator: boolean;
-  params: Array<Pattern>;
-  rest: ?Identifier;
-  returnType: ?TypeAnnotation;
-  typeParameters: ?TypeParameterDeclaration;
-} | {
-  type: 'AssignmentExpression';
-  _AssignmentExpression: void;
-  left: Pattern;
-  operator: AssignmentOperator;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'AssignmentPattern';
-  _AssignmentPattern: void;
-  left: Pattern;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'AwaitExpression';
-  _AwaitExpression: void;
-  all: boolean;
-  argument: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'BinaryExpression';
-  _BinaryExpression: void;
-  left: Expression;
-  operator: BinaryOperator;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'BindExpression';
-  _BindExpression: void;
-  callee: Node;
-  object: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'BlockStatement';
-  _BlockStatement: void;
-  body: Array<Statement>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'BreakStatement';
-  _BreakStatement: void;
-  label: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'CallExpression';
-  _CallExpression: void;
-  arguments: Array<Node>;
-  callee: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'CatchClause';
-  _CatchClause: void;
-  body: BlockStatement;
-  param: Pattern;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ClassBody';
-  _ClassBody: void;
-  body: Array<Node>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ClassDeclaration';
-  _ClassDeclaration: void;
-  body: ClassBody;
-  id: ?Identifier;
-  superClass: ?Expression;
-  decorators: any;
-  superTypeParameters: any;
-  typeParameters: any;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ClassExpression';
-  _ClassExpression: void;
-  body: ClassBody;
-  id: ?Identifier;
-  superClass: ?Expression;
-  decorators: any;
-  superTypeParameters: any;
-  typeParameters: any;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ComprehensionBlock';
-  _ComprehensionBlock: void;
-  each: boolean;
-  left: Pattern;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ComprehensionExpression';
-  _ComprehensionExpression: void;
-  body: Expression;
-  blocks: Array<ComprehensionBlock>;
-  filter: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ConditionalExpression';
-  _ConditionalExpression: void;
-  alternate: Expression;
-  consequent: Expression;
-  test: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ContinueStatement';
-  _ContinueStatement: void;
-  label: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'Decorator';
-  _Decorator: void;
-  expression: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DebuggerStatement';
-  _DebuggerStatement: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DoWhileStatement';
-  _DoWhileStatement: void;
-  body: Statement;
-  test: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DoExpression';
-  _DoExpression: void;
-  body: Statement;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'EmptyStatement';
-  _EmptyStatement: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ExpressionStatement';
-  _ExpressionStatement: void;
-  expression: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'File';
-  _File: void;
-  program: Program;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ForInStatement';
-  _ForInStatement: void;
-  body: Statement;
-  left: Node;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ForOfStatement';
-  _ForOfStatement: void;
-  body: Statement;
-  left: Node;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ForStatement';
-  _ForStatement: void;
-  init: ?Node;
-  test: ?Expression;
-  update: ?Expression;
-  body: Statement;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'FunctionDeclaration';
-  _FunctionDeclaration: void;
-  body: BlockStatement;
-  id: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-  async: boolean;
-  defaults: Array<?Expression>;
-  expression: boolean;
-  generator: boolean;
-  params: Array<Pattern>;
-  rest: ?Identifier;
-  returnType: ?TypeAnnotation;
-  typeParameters: ?TypeParameterDeclaration;
-} | {
-  type: 'FunctionExpression';
-  _FunctionExpression: void;
-  body: BlockStatement;
-  id: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-  async: boolean;
-  defaults: Array<?Expression>;
-  expression: boolean;
-  generator: boolean;
-  params: Array<Pattern>;
-  rest: ?Identifier;
-  returnType: ?TypeAnnotation;
-  typeParameters: ?TypeParameterDeclaration;
-} | {
-  type: 'Identifier';
-  _Identifier: void;
-  name: string;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'IfStatement';
-  _IfStatement: void;
-  alternate: ?Statement;
-  consequent: Statement;
-  test: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ImportDefaultSpecifier';
-  _ImportDefaultSpecifier: void;
-  local: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ImportNamespaceSpecifier';
-  _ImportNamespaceSpecifier: void;
-  local: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ImportDeclaration';
-  _ImportDeclaration: void;
-  specifiers: Array<Node>;
-  source: Literal;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ImportSpecifier';
-  _ImportSpecifier: void;
-  imported: Node;
-  local: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'LabeledStatement';
-  _LabeledStatement: void;
-  body: Statement;
-  label: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'Literal';
-  _Literal: void;
-  raw: string;
-  regex: ?{pattern: string, flags: string};
-  value: ?(string | boolean | number | RegExp);
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'LogicalExpression';
-  _LogicalExpression: void;
-  left: Expression;
-  operator: LogicalOperator;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'MemberExpression';
-  _MemberExpression: void;
-  computed: boolean;
-  object: Expression;
-  property: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'MetaProperty';
-  _MetaProperty: void;
-  meta: Node;
-  property: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'MethodDefinition';
-  _MethodDefinition: void;
-  computed: boolean;
-  key: Node;
-  kind: 'constructor' | 'method' | 'get' | 'set';
-  static: boolean;
-  value: FunctionExpression;
-  decorators: ?Array<Decorator>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'NewExpression';
-  _NewExpression: void;
-  arguments: Array<Node>;
-  callee: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'Noop';
-  _Noop: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ObjectExpression';
-  _ObjectExpression: void;
-  properties: Array<Node>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ObjectPattern';
-  _ObjectPattern: void;
-  properties: Array<Node>;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'Program';
-  _Program: void;
-  body: Array<Statement>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'Property';
-  _Property: void;
-  computed: boolean;
-  key: Node;
-  kind: 'init' | 'get' | 'set';
-  method: boolean;
-  shorthand: boolean;
-  value: Node;
-  decorators: ?Array<Decorator>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'RestElement';
-  _RestElement: void;
-  argument: Pattern;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ReturnStatement';
-  _ReturnStatement: void;
-  argument: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'SequenceExpression';
-  _SequenceExpression: void;
-  expression: Array<Expression>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'SpreadElement';
-  _SpreadElement: void;
-  argument: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'SpreadProperty';
-  _SpreadProperty: void;
-  argument: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'Super';
-  _Super: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'SwitchCase';
-  _SwitchCase: void;
-  consequent: Array<Statement>;
-  test: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'SwitchStatement';
-  _SwitchStatement: void;
-  cases: Array<SwitchCase>;
-  discriminant: Expression;
-  lexical: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TaggedTemplateExpression';
-  _TaggedTemplateExpression: void;
-  quasi: TemplateLiteral;
-  tag: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TemplateElement';
-  _TemplateElement: void;
-  tail: boolean;
-  value: {cooked: string, raw: string};
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TemplateLiteral';
-  _TemplateLiteral: void;
-  expressions: Array<Expression>;
-  quasis: Array<TemplateElement>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ThisExpression';
-  _ThisExpression: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ThrowStatement';
-  _ThrowStatement: void;
-  argument: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TryStatement';
-  _TryStatement: void;
-  block: BlockStatement;
-  finalizer: ?BlockStatement;
-  guardedHandlers: Array<CatchClause>;
-  handler: ?CatchClause;
-  handlers: ?Array<CatchClause>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'UnaryExpression';
-  _UnaryExpression: void;
-  argument: Expression;
-  operator: UnaryOperator;
-  prefix: true;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'UpdateExpression';
-  _UpdateExpression: void;
-  argument: Expression;
-  operator: UpdateOperator;
-  prefix: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'VariableDeclaration';
-  _VariableDeclaration: void;
-  declarations: Array<VariableDeclarator>;
-  kind: 'var' | 'let' | 'const';
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'VariableDeclarator';
-  _VariableDeclarator: void;
-  id: Pattern;
-  init: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'WhileStatement';
-  _WhileStatement: void;
-  body: Statement;
-  test: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'WithStatement';
-  _WithStatement: void;
-  body: Statement;
-  object: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'YieldExpression';
-  _YieldExpression: void;
-  argument: ?Expression;
-  delegate: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ExportAllDeclaration';
-  _ExportAllDeclaration: void;
-  exported: Node;
-  source: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ExportDefaultDeclaration';
-  _ExportDefaultDeclaration: void;
-  declaration: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ExportNamedDeclaration';
-  _ExportNamedDeclaration: void;
-  declaration: Node;
-  source: Literal;
-  specifiers: Array<Node>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ExportDefaultSpecifier';
-  _ExportDefaultSpecifier: void;
-  exported: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ExportNamespaceSpecifier';
-  _ExportNamespaceSpecifier: void;
-  exported: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ExportSpecifier';
-  _ExportSpecifier: void;
-  local: Node;
-  exported: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'AnyTypeAnnotation';
-  _AnyTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ArrayTypeAnnotation';
-  _ArrayTypeAnnotation: void;
-  elementType: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'BooleanLiteralTypeAnnotation';
-  _BooleanLiteralTypeAnnotation: void;
-  raw: string;
-  value: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'BooleanTypeAnnotation';
-  _BooleanTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ClassImplements';
-  _ClassImplements: void;
-  id: Identifier;
-  typeParameters: ?TypeParameterInstantiation;
-  superClass: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ClassProperty';
-  _ClassProperty: void;
-  computed: boolean;
-  key: Node;
-  static: boolean;
-  typeAnnotation: ?TypeAnnotation;
-  value: ?Expression;
-  decorators: Array<Decorator>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DeclareClass';
-  _DeclareClass: void;
-  body: ObjectTypeAnnotation;
-  extends: Array<InterfaceExtends>;
-  id: Identifier;
-  typeParameters: ?TypeParameterDeclaration;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DeclareFunction';
-  _DeclareFunction: void;
-  id: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DeclareModule';
-  _DeclareModule: void;
-  body: BlockStatement;
-  id: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DeclareVariable';
-  _DeclareVariable: void;
-  id: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'FunctionTypeAnnotation';
-  _FunctionTypeAnnotation: void;
-  params: Array<FunctionTypeParam>;
-  rest: ?FunctionTypeParam;
-  returnType: Type;
-  typeParameters: ?TypeParameterDeclaration;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'FunctionTypeParam';
-  _FunctionTypeParam: void;
-  name: Identifier;
-  optional: boolean;
-  typeAnnotation: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'GenericTypeAnnotation';
-  _GenericTypeAnnotation: void;
-  id: Node;
-  typeParameters: ?TypeParameterInstantiation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'InterfaceExtends';
-  _InterfaceExtends: void;
-  id: Identifier;
-  typeParameters: ?TypeParameterInstantiation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'InterfaceDeclaration';
-  _InterfaceDeclaration: void;
-  body: ObjectTypeAnnotation;
-  extends: Array<InterfaceExtends>;
-  id: Identifier;
-  typeParameters: ?TypeParameterDeclaration;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'IntersectionTypeAnnotation';
-  _IntersectionTypeAnnotation: void;
-  types: Array<Type>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'MixedTypeAnnotation';
-  _MixedTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'NullableTypeAnnotation';
-  _NullableTypeAnnotation: void;
-  typeAnnotation: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'NumberLiteralTypeAnnotation';
-  _NumberLiteralTypeAnnotation: void;
-  raw: string;
-  value: number;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'NumberTypeAnnotation';
-  _NumberTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'StringLiteralTypeAnnotation';
-  _StringLiteralTypeAnnotation: void;
-  raw: string;
-  value: string;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'StringTypeAnnotation';
-  _StringTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TupleTypeAnnotation';
-  _TupleTypeAnnotation: void;
-  types: Array<Type>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TypeofTypeAnnotation';
-  _TypeofTypeAnnotation: void;
-  argument: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TypeAlias';
-  _TypeAlias: void;
-  id: Identifier;
-  right: Type;
-  typeParameters: ?TypeParameterDeclaration;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TypeAnnotation';
-  _TypeAnnotation: void;
-  typeAnnotation: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TypeCastExpression';
-  _TypeCastExpression: void;
-  expression: Expression;
-  typeAnnotation: TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TypeParameterDeclaration';
-  _TypeParameterDeclaration: void;
-  params: Array<Identifier>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TypeParameterInstantiation';
-  _TypeParameterInstantiation: void;
-  params: Array<Type>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ObjectTypeAnnotation';
-  _ObjectTypeAnnotation: void;
-  callProperties: Array<ObjectTypeCallProperty>;
-  indexers: Array<ObjectTypeIndexer>;
-  properties: Array<ObjectTypeProperty>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ObjectTypeCallProperty';
-  _ObjectTypeCallProperty: void;
-  static: boolean;
-  value: FunctionTypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ObjectTypeIndexer';
-  _ObjectTypeIndexer: void;
-  id: Identifier;
-  key: Type;
-  value: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ObjectTypeProperty';
-  _ObjectTypeProperty: void;
-  key: Node;
-  optional: boolean;
-  value: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'QualifiedTypeIdentifier';
-  _QualifiedTypeIdentifier: void;
-  id: Identifier;
-  qualification: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'UnionTypeAnnotation';
-  _UnionTypeAnnotation: void;
-  types: Array<Type>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'VoidTypeAnnotation';
-  _VoidTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXAttribute';
-  _JSXAttribute: void;
-  name: Node;
-  value: ?Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXClosingElement';
-  _JSXClosingElement: void;
-  name: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXElement';
-  _JSXElement: void;
-  children: Array<Node>;
-  closingElement: ?JSXClosingElement;
-  openingElement: JSXOpeningElement;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXEmptyExpression';
-  _JSXEmptyExpression: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXExpressionContainer';
-  _JSXExpressionContainer: void;
-  expression: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXIdentifier';
-  _JSXIdentifier: void;
-  name: string;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXMemberExpression';
-  _JSXMemberExpression: void;
-  computed: boolean;
-  object: Node;
-  property: JSXIdentifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXNamespacedName';
-  _JSXNamespacedName: void;
-  name: JSXIdentifier;
-  namespace: JSXIdentifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXOpeningElement';
-  _JSXOpeningElement: void;
-  attributes: Array<Node>;
-  name: Array<Node>;
-  selfClosing: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'JSXSpreadAttribute';
-  _JSXSpreadAttribute: void;
-  argument: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type Pattern = {
-  type: 'ArrayPattern';
-  _ArrayPattern: void;
-  elements: Array<?Node>;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'AssignmentPattern';
-  _AssignmentPattern: void;
-  left: Pattern;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'Identifier';
-  _Identifier: void;
-  name: string;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ObjectPattern';
-  _ObjectPattern: void;
-  properties: Array<Node>;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'RestElement';
-  _RestElement: void;
-  argument: Pattern;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type Statement = {
-  type: 'BlockStatement';
-  _BlockStatement: void;
-  body: Array<Statement>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'BreakStatement';
-  _BreakStatement: void;
-  label: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ContinueStatement';
-  _ContinueStatement: void;
-  label: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DoWhileStatement';
-  _DoWhileStatement: void;
-  body: Statement;
-  test: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'EmptyStatement';
-  _EmptyStatement: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ExpressionStatement';
-  _ExpressionStatement: void;
-  expression: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ForInStatement';
-  _ForInStatement: void;
-  body: Statement;
-  left: Node;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ForOfStatement';
-  _ForOfStatement: void;
-  body: Statement;
-  left: Node;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ForStatement';
-  _ForStatement: void;
-  init: ?Node;
-  test: ?Expression;
-  update: ?Expression;
-  body: Statement;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'IfStatement';
-  _IfStatement: void;
-  alternate: ?Statement;
-  consequent: Statement;
-  test: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'LabeledStatement';
-  _LabeledStatement: void;
-  body: Statement;
-  label: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ReturnStatement';
-  _ReturnStatement: void;
-  argument: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'SwitchStatement';
-  _SwitchStatement: void;
-  cases: Array<SwitchCase>;
-  discriminant: Expression;
-  lexical: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ThrowStatement';
-  _ThrowStatement: void;
-  argument: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TryStatement';
-  _TryStatement: void;
-  block: BlockStatement;
-  finalizer: ?BlockStatement;
-  guardedHandlers: Array<CatchClause>;
-  handler: ?CatchClause;
-  handlers: ?Array<CatchClause>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'WhileStatement';
-  _WhileStatement: void;
-  body: Statement;
-  test: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'WithStatement';
-  _WithStatement: void;
-  body: Statement;
-  object: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DeclareClass';
-  _DeclareClass: void;
-  body: ObjectTypeAnnotation;
-  extends: Array<InterfaceExtends>;
-  id: Identifier;
-  typeParameters: ?TypeParameterDeclaration;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DeclareFunction';
-  _DeclareFunction: void;
-  id: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DeclareModule';
-  _DeclareModule: void;
-  body: BlockStatement;
-  id: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'DeclareVariable';
-  _DeclareVariable: void;
-  id: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'InterfaceDeclaration';
-  _InterfaceDeclaration: void;
-  body: ObjectTypeAnnotation;
-  extends: Array<InterfaceExtends>;
-  id: Identifier;
-  typeParameters: ?TypeParameterDeclaration;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TypeAlias';
-  _TypeAlias: void;
-  id: Identifier;
-  right: Type;
-  typeParameters: ?TypeParameterDeclaration;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type Type = {
-  type: 'AnyTypeAnnotation';
-  _AnyTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ArrayTypeAnnotation';
-  _ArrayTypeAnnotation: void;
-  elementType: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'BooleanLiteralTypeAnnotation';
-  _BooleanLiteralTypeAnnotation: void;
-  raw: string;
-  value: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'BooleanTypeAnnotation';
-  _BooleanTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'FunctionTypeAnnotation';
-  _FunctionTypeAnnotation: void;
-  params: Array<FunctionTypeParam>;
-  rest: ?FunctionTypeParam;
-  returnType: Type;
-  typeParameters: ?TypeParameterDeclaration;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'GenericTypeAnnotation';
-  _GenericTypeAnnotation: void;
-  id: Node;
-  typeParameters: ?TypeParameterInstantiation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'IntersectionTypeAnnotation';
-  _IntersectionTypeAnnotation: void;
-  types: Array<Type>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'MixedTypeAnnotation';
-  _MixedTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'NullableTypeAnnotation';
-  _NullableTypeAnnotation: void;
-  typeAnnotation: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'NumberLiteralTypeAnnotation';
-  _NumberLiteralTypeAnnotation: void;
-  raw: string;
-  value: number;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'NumberTypeAnnotation';
-  _NumberTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'StringLiteralTypeAnnotation';
-  _StringLiteralTypeAnnotation: void;
-  raw: string;
-  value: string;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'StringTypeAnnotation';
-  _StringTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'TupleTypeAnnotation';
-  _TupleTypeAnnotation: void;
-  types: Array<Type>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'ObjectTypeAnnotation';
-  _ObjectTypeAnnotation: void;
-  callProperties: Array<ObjectTypeCallProperty>;
-  indexers: Array<ObjectTypeIndexer>;
-  properties: Array<ObjectTypeProperty>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'UnionTypeAnnotation';
-  _UnionTypeAnnotation: void;
-  types: Array<Type>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-} | {
-  type: 'VoidTypeAnnotation';
-  _VoidTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// Concrete Types. Nothing can extend these.
-
-export type CommentLine = {
-  type: 'CommentLine';
-  _CommentLine: void;
-  value: string;
-  end: number;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-};
-
-export type CommentBlock = {
-  type: 'CommentBlock';
-  _CommentBlock: void;
-  value: string;
-  end: number;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-};
-
-// Babel concrete types.
-
-export type ArrayExpression = {
-  type: 'ArrayExpression';
-  _ArrayExpression: void;
-  elements: Array<?Node>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ArrayPattern = {
-  type: 'ArrayPattern';
-  _ArrayPattern: void;
-  elements: Array<?Node>;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ArrowFunctionExpression = {
-  type: 'ArrowFunctionExpression';
-  _ArrowFunctionExpression: void;
-  body: Node;
-  id: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-  async: boolean;
-  defaults: Array<?Expression>;
-  expression: boolean;
-  generator: boolean;
-  params: Array<Pattern>;
-  rest: ?Identifier;
-  returnType: ?TypeAnnotation;
-  typeParameters: ?TypeParameterDeclaration;
-};
-
-type AssignmentOperator =
-  '=' |
-  '+=' |
-  '-=' |
-  '*=' |
-  '/=' |
-  '%=' |
-  '<<=' |
-  '>>=' |
-  '>>>=' |
-  '|=' |
-  '^=' |
-  '&=';
-
-export type AssignmentExpression = {
-  type: 'AssignmentExpression';
-  _AssignmentExpression: void;
-  left: Pattern;
-  operator: AssignmentOperator;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type AssignmentPattern = {
-  type: 'AssignmentPattern';
-  _AssignmentPattern: void;
-  left: Pattern;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type AwaitExpression = {
-  type: 'AwaitExpression';
-  _AwaitExpression: void;
-  all: boolean;
-  argument: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-type BinaryOperator =
-  '==' |
-  '!=' |
-  '===' |
-  '!==' |
-  '<' |
-  '<=' |
-  '>' |
-  '>=' |
-  '<<' |
-  '>>' |
-  '>>>' |
-  '+' |
-  '-' |
-  '*' |
-  '/' |
-  '%' |
-  '&' |
-  '|' |
-  '^' |
-  'in' |
-  'instanceof' |
-  '..';
-
-export type BinaryExpression = {
-  type: 'BinaryExpression';
-  _BinaryExpression: void;
-  left: Expression;
-  operator: BinaryOperator;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: What is this?
-export type BindExpression = {
-  type: 'BindExpression';
-  _BindExpression: void;
-  callee: Node;
-  object: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type BlockStatement = {
-  type: 'BlockStatement';
-  _BlockStatement: void;
-  body: Array<Statement>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type BreakStatement = {
-  type: 'BreakStatement';
-  _BreakStatement: void;
-  label: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type CallExpression = {
-  type: 'CallExpression';
-  _CallExpression: void;
-  arguments: Array<Node>;
-  callee: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type CatchClause = {
-  type: 'CatchClause';
-  _CatchClause: void;
-  body: BlockStatement;
-  param: Pattern;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ClassBody = {
-  type: 'ClassBody';
-  _ClassBody: void;
-  body: Array<Node>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ClassDeclaration = {
-  type: 'ClassDeclaration';
-  _ClassDeclaration: void;
-  body: ClassBody;
-  id: ?Identifier;
-  superClass: ?Expression;
-  decorators: any;
-  superTypeParameters: any;
-  typeParameters: any;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ClassExpression = {
-  type: 'ClassExpression';
-  _ClassExpression: void;
-  body: ClassBody;
-  id: ?Identifier;
-  superClass: ?Expression;
-  decorators: any;
-  superTypeParameters: any;
-  typeParameters: any;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ComprehensionBlock = {
-  type: 'ComprehensionBlock';
-  _ComprehensionBlock: void;
-  each: boolean;
-  left: Pattern;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ComprehensionExpression = {
-  type: 'ComprehensionExpression';
-  _ComprehensionExpression: void;
-  body: Expression;
-  blocks: Array<ComprehensionBlock>;
-  filter: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ConditionalExpression = {
-  type: 'ConditionalExpression';
-  _ConditionalExpression: void;
-  alternate: Expression;
-  consequent: Expression;
-  test: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ContinueStatement = {
-  type: 'ContinueStatement';
-  _ContinueStatement: void;
-  label: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type Decorator = {
-  type: 'Decorator';
-  _Decorator: void;
-  expression: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type DebuggerStatement = {
-  type: 'DebuggerStatement';
-  _DebuggerStatement: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type DoWhileStatement = {
-  type: 'DoWhileStatement';
-  _DoWhileStatement: void;
-  body: Statement;
-  test: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type DoExpression = {
-  type: 'DoExpression';
-  _DoExpression: void;
-  body: Statement;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type EmptyStatement = {
-  type: 'EmptyStatement';
-  _EmptyStatement: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ExpressionStatement = {
-  type: 'ExpressionStatement';
-  _ExpressionStatement: void;
-  expression: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type File = {
-  type: 'File';
-  _File: void;
-  program: Program;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ForInStatement = {
-  type: 'ForInStatement';
-  _ForInStatement: void;
-  body: Statement;
-  left: Node;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type ForOfStatement = {
-  type: 'ForOfStatement';
-  _ForOfStatement: void;
-  body: Statement;
-  left: Node;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ForStatement = {
-  type: 'ForStatement';
-  _ForStatement: void;
-  init: ?Node;
-  test: ?Expression;
-  update: ?Expression;
-  body: Statement;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type FunctionDeclaration = {
-  type: 'FunctionDeclaration';
-  _FunctionDeclaration: void;
-  body: BlockStatement;
-  id: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-  async: boolean;
-  defaults: Array<?Expression>;
-  expression: boolean;
-  generator: boolean;
-  params: Array<Pattern>;
-  rest: ?Identifier;
-  returnType: ?TypeAnnotation;
-  typeParameters: ?TypeParameterDeclaration;
-};
-
-export type FunctionExpression = {
-  type: 'FunctionExpression';
-  _FunctionExpression: void;
-  body: BlockStatement;
-  id: ?Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-  async: boolean;
-  defaults: Array<?Expression>;
-  expression: boolean;
-  generator: boolean;
-  params: Array<Pattern>;
-  rest: ?Identifier;
-  returnType: ?TypeAnnotation;
-  typeParameters: ?TypeParameterDeclaration;
-};
-
-export type Identifier = {
-  type: 'Identifier';
-  _Identifier: void;
-  name: string;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type IfStatement = {
-  type: 'IfStatement';
-  _IfStatement: void;
-  alternate: ?Statement;
-  consequent: Statement;
-  test: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type ImportDefaultSpecifier = {
-  type: 'ImportDefaultSpecifier';
-  _ImportDefaultSpecifier: void;
-  local: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type ImportNamespaceSpecifier = {
-  type: 'ImportNamespaceSpecifier';
-  _ImportNamespaceSpecifier: void;
-  local: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type ImportDeclaration = {
-  type: 'ImportDeclaration';
-  _ImportDeclaration: void;
-  specifiers: Array<Node>;
-  source: Literal;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type ImportSpecifier = {
-  type: 'ImportSpecifier';
-  _ImportSpecifier: void;
-  imported: Node;
-  local: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type LabeledStatement = {
-  type: 'LabeledStatement';
-  _LabeledStatement: void;
-  body: Statement;
-  label: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type Literal = {
-  type: 'Literal';
-  _Literal: void;
-  raw: string;
-  regex: ?{pattern: string, flags: string};
-  value: ?(string | boolean | number | RegExp);
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-type LogicalOperator = '||' | '&&';
-
-export type LogicalExpression = {
-  type: 'LogicalExpression';
-  _LogicalExpression: void;
-  left: Expression;
-  operator: LogicalOperator;
-  right: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type MemberExpression = {
-  type: 'MemberExpression';
-  _MemberExpression: void;
-  computed: boolean;
-  object: Expression;
-  property: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type MetaProperty = {
-  type: 'MetaProperty';
-  _MetaProperty: void;
-  meta: Node;
-  property: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type MethodDefinition = {
-  type: 'MethodDefinition';
-  _MethodDefinition: void;
-  computed: boolean;
-  key: Node;
-  kind: 'constructor' | 'method' | 'get' | 'set';
-  static: boolean;
-  value: FunctionExpression;
-  decorators: ?Array<Decorator>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type NewExpression = {
-  type: 'NewExpression';
-  _NewExpression: void;
-  arguments: Array<Node>;
-  callee: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type Noop = {
-  type: 'Noop';
-  _Noop: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ObjectExpression = {
-  type: 'ObjectExpression';
-  _ObjectExpression: void;
-  properties: Array<Node>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ObjectPattern = {
-  type: 'ObjectPattern';
-  _ObjectPattern: void;
-  properties: Array<Node>;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type Program = {
-  type: 'Program';
-  _Program: void;
-  body: Array<Statement>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type Property = {
-  type: 'Property';
-  _Property: void;
-  computed: boolean;
-  key: Node;
-  kind: 'init' | 'get' | 'set';
-  method: boolean;
-  shorthand: boolean;
-  value: Node;
-  decorators: ?Array<Decorator>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type RestElement = {
-  type: 'RestElement';
-  _RestElement: void;
-  argument: Pattern;
-  typeAnnotation: ?TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ReturnStatement = {
-  type: 'ReturnStatement';
-  _ReturnStatement: void;
-  argument: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type SequenceExpression = {
-  type: 'SequenceExpression';
-  _SequenceExpression: void;
-  expression: Array<Expression>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type SpreadElement = {
-  type: 'SpreadElement';
-  _SpreadElement: void;
-  argument: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type SpreadProperty = {
-  type: 'SpreadProperty';
-  _SpreadProperty: void;
-  argument: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type Super = {
-  type: 'Super';
-  _Super: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type SwitchCase = {
-  type: 'SwitchCase';
-  _SwitchCase: void;
-  consequent: Array<Statement>;
-  test: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type SwitchStatement = {
-  type: 'SwitchStatement';
-  _SwitchStatement: void;
-  cases: Array<SwitchCase>;
-  discriminant: Expression;
-  lexical: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type TaggedTemplateExpression = {
-  type: 'TaggedTemplateExpression';
-  _TaggedTemplateExpression: void;
-  quasi: TemplateLiteral;
-  tag: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type TemplateElement = {
-  type: 'TemplateElement';
-  _TemplateElement: void;
-  tail: boolean;
-  value: {cooked: string, raw: string};
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type TemplateLiteral = {
-  type: 'TemplateLiteral';
-  _TemplateLiteral: void;
-  expressions: Array<Expression>;
-  quasis: Array<TemplateElement>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ThisExpression = {
-  type: 'ThisExpression';
-  _ThisExpression: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ThrowStatement = {
-  type: 'ThrowStatement';
-  _ThrowStatement: void;
-  argument: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type TryStatement = {
-  type: 'TryStatement';
-  _TryStatement: void;
-  block: BlockStatement;
-  finalizer: ?BlockStatement;
-  guardedHandlers: Array<CatchClause>;
-  handler: ?CatchClause;
-  handlers: ?Array<CatchClause>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-type UnaryOperator = '-' | '+' | '!' | '~' | 'typeof' | 'void' | 'delete';
-
-export type UnaryExpression = {
-  type: 'UnaryExpression';
-  _UnaryExpression: void;
-  argument: Expression;
-  operator: UnaryOperator;
-  prefix: true;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-type UpdateOperator = '++' | '--';
-
-export type UpdateExpression = {
-  type: 'UpdateExpression';
-  _UpdateExpression: void;
-  argument: Expression;
-  operator: UpdateOperator;
-  prefix: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type VariableDeclaration = {
-  type: 'VariableDeclaration';
-  _VariableDeclaration: void;
-  declarations: Array<VariableDeclarator>;
-  kind: 'var' | 'let' | 'const';
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type VariableDeclarator = {
-  type: 'VariableDeclarator';
-  _VariableDeclarator: void;
-  id: Pattern;
-  init: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type WhileStatement = {
-  type: 'WhileStatement';
-  _WhileStatement: void;
-  body: Statement;
-  test: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type WithStatement = {
-  type: 'WithStatement';
-  _WithStatement: void;
-  body: Statement;
-  object: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type YieldExpression = {
-  type: 'YieldExpression';
-  _YieldExpression: void;
-  argument: ?Expression;
-  delegate: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type ExportAllDeclaration = {
-  type: 'ExportAllDeclaration';
-  _ExportAllDeclaration: void;
-  exported: Node;
-  source: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type ExportDefaultDeclaration = {
-  type: 'ExportDefaultDeclaration';
-  _ExportDefaultDeclaration: void;
-  declaration: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type ExportNamedDeclaration = {
-  type: 'ExportNamedDeclaration';
-  _ExportNamedDeclaration: void;
-  declaration: Node;
-  source: Literal;
-  specifiers: Array<Node>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type ExportDefaultSpecifier = {
-  type: 'ExportDefaultSpecifier';
-  _ExportDefaultSpecifier: void;
-  exported: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type ExportNamespaceSpecifier = {
-  type: 'ExportNamespaceSpecifier';
-  _ExportNamespaceSpecifier: void;
-  exported: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type ExportSpecifier = {
-  type: 'ExportSpecifier';
-  _ExportSpecifier: void;
-  local: Node;
-  exported: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type AnyTypeAnnotation = {
-  type: 'AnyTypeAnnotation';
-  _AnyTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ArrayTypeAnnotation = {
-  type: 'ArrayTypeAnnotation';
-  _ArrayTypeAnnotation: void;
-  elementType: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type BooleanLiteralTypeAnnotation = {
-  type: 'BooleanLiteralTypeAnnotation';
-  _BooleanLiteralTypeAnnotation: void;
-  raw: string;
-  value: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type BooleanTypeAnnotation = {
-  type: 'BooleanTypeAnnotation';
-  _BooleanTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ClassImplements = {
-  type: 'ClassImplements';
-  _ClassImplements: void;
-  id: Identifier;
-  typeParameters: ?TypeParameterInstantiation;
-  superClass: ?Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ClassProperty = {
-  type: 'ClassProperty';
-  _ClassProperty: void;
-  computed: boolean;
-  key: Node;
-  static: boolean;
-  typeAnnotation: ?TypeAnnotation;
-  value: ?Expression;
-  decorators: Array<Decorator>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type DeclareClass = {
-  type: 'DeclareClass';
-  _DeclareClass: void;
-  body: ObjectTypeAnnotation;
-  extends: Array<InterfaceExtends>;
-  id: Identifier;
-  typeParameters: ?TypeParameterDeclaration;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type DeclareFunction = {
-  type: 'DeclareFunction';
-  _DeclareFunction: void;
-  id: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type DeclareModule = {
-  type: 'DeclareModule';
-  _DeclareModule: void;
-  body: BlockStatement;
-  id: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-// TODO: Make this correct.
-export type DeclareVariable = {
-  type: 'DeclareVariable';
-  _DeclareVariable: void;
-  id: Identifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type FunctionTypeAnnotation = {
-  type: 'FunctionTypeAnnotation';
-  _FunctionTypeAnnotation: void;
-  params: Array<FunctionTypeParam>;
-  rest: ?FunctionTypeParam;
-  returnType: Type;
-  typeParameters: ?TypeParameterDeclaration;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type FunctionTypeParam = {
-  type: 'FunctionTypeParam';
-  _FunctionTypeParam: void;
-  name: Identifier;
-  optional: boolean;
-  typeAnnotation: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type GenericTypeAnnotation = {
-  type: 'GenericTypeAnnotation';
-  _GenericTypeAnnotation: void;
-  id: Node;
-  typeParameters: ?TypeParameterInstantiation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type InterfaceExtends = {
-  type: 'InterfaceExtends';
-  _InterfaceExtends: void;
-  id: Identifier;
-  typeParameters: ?TypeParameterInstantiation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type InterfaceDeclaration = {
-  type: 'InterfaceDeclaration';
-  _InterfaceDeclaration: void;
-  body: ObjectTypeAnnotation;
-  extends: Array<InterfaceExtends>;
-  id: Identifier;
-  typeParameters: ?TypeParameterDeclaration;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type IntersectionTypeAnnotation = {
-  type: 'IntersectionTypeAnnotation';
-  _IntersectionTypeAnnotation: void;
-  types: Array<Type>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type MixedTypeAnnotation = {
-  type: 'MixedTypeAnnotation';
-  _MixedTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type NullableTypeAnnotation = {
-  type: 'NullableTypeAnnotation';
-  _NullableTypeAnnotation: void;
-  typeAnnotation: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type NumberLiteralTypeAnnotation = {
-  type: 'NumberLiteralTypeAnnotation';
-  _NumberLiteralTypeAnnotation: void;
-  raw: string;
-  value: number;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type NumberTypeAnnotation = {
-  type: 'NumberTypeAnnotation';
-  _NumberTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type StringLiteralTypeAnnotation = {
-  type: 'StringLiteralTypeAnnotation';
-  _StringLiteralTypeAnnotation: void;
-  raw: string;
-  value: string;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type StringTypeAnnotation = {
-  type: 'StringTypeAnnotation';
-  _StringTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type TupleTypeAnnotation = {
-  type: 'TupleTypeAnnotation';
-  _TupleTypeAnnotation: void;
-  types: Array<Type>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type TypeofTypeAnnotation = {
-  type: 'TypeofTypeAnnotation';
-  _TypeofTypeAnnotation: void;
-  argument: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type TypeAlias = {
-  type: 'TypeAlias';
-  _TypeAlias: void;
-  id: Identifier;
-  right: Type;
-  typeParameters: ?TypeParameterDeclaration;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type TypeAnnotation = {
-  type: 'TypeAnnotation';
-  _TypeAnnotation: void;
-  typeAnnotation: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type TypeCastExpression = {
-  type: 'TypeCastExpression';
-  _TypeCastExpression: void;
-  expression: Expression;
-  typeAnnotation: TypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type TypeParameterDeclaration = {
-  type: 'TypeParameterDeclaration';
-  _TypeParameterDeclaration: void;
-  params: Array<Identifier>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type TypeParameterInstantiation = {
-  type: 'TypeParameterInstantiation';
-  _TypeParameterInstantiation: void;
-  params: Array<Type>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ObjectTypeAnnotation = {
-  type: 'ObjectTypeAnnotation';
-  _ObjectTypeAnnotation: void;
-  callProperties: Array<ObjectTypeCallProperty>;
-  indexers: Array<ObjectTypeIndexer>;
-  properties: Array<ObjectTypeProperty>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ObjectTypeCallProperty = {
-  type: 'ObjectTypeCallProperty';
-  _ObjectTypeCallProperty: void;
-  static: boolean;
-  value: FunctionTypeAnnotation;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ObjectTypeIndexer = {
-  type: 'ObjectTypeIndexer';
-  _ObjectTypeIndexer: void;
-  id: Identifier;
-  key: Type;
-  value: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type ObjectTypeProperty = {
-  type: 'ObjectTypeProperty';
-  _ObjectTypeProperty: void;
-  key: Node;
-  optional: boolean;
-  value: Type;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type QualifiedTypeIdentifier = {
-  type: 'QualifiedTypeIdentifier';
-  _QualifiedTypeIdentifier: void;
-  id: Identifier;
-  qualification: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type UnionTypeAnnotation = {
-  type: 'UnionTypeAnnotation';
-  _UnionTypeAnnotation: void;
-  types: Array<Type>;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type VoidTypeAnnotation = {
-  type: 'VoidTypeAnnotation';
-  _VoidTypeAnnotation: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type JSXAttribute = {
-  type: 'JSXAttribute';
-  _JSXAttribute: void;
-  name: Node;
-  value: ?Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type JSXClosingElement = {
-  type: 'JSXClosingElement';
-  _JSXClosingElement: void;
-  name: Node;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type JSXElement = {
-  type: 'JSXElement';
-  _JSXElement: void;
-  children: Array<Node>;
-  closingElement: ?JSXClosingElement;
-  openingElement: JSXOpeningElement;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type JSXEmptyExpression = {
-  type: 'JSXEmptyExpression';
-  _JSXEmptyExpression: void;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type JSXExpressionContainer = {
-  type: 'JSXExpressionContainer';
-  _JSXExpressionContainer: void;
-  expression: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type JSXIdentifier = {
-  type: 'JSXIdentifier';
-  _JSXIdentifier: void;
-  name: string;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type JSXMemberExpression = {
-  type: 'JSXMemberExpression';
-  _JSXMemberExpression: void;
-  computed: boolean;
-  object: Node;
-  property: JSXIdentifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type JSXNamespacedName = {
-  type: 'JSXNamespacedName';
-  _JSXNamespacedName: void;
-  name: JSXIdentifier;
-  namespace: JSXIdentifier;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type JSXOpeningElement = {
-  type: 'JSXOpeningElement';
-  _JSXOpeningElement: void;
-  attributes: Array<Node>;
-  name: Array<Node>;
-  selfClosing: boolean;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
-
-export type JSXSpreadAttribute = {
-  type: 'JSXSpreadAttribute';
-  _JSXSpreadAttribute: void;
-  argument: Expression;
-  end: number;
-  innerComments: ?Array<Comment>;
-  leadingComments: ?Array<Comment>;
-  loc: {
-    end: {column: number, line: number},
-    start: {column: number, line: number},
-  };
-  start: number;
-  trailingComments: ?Array<Comment>;
-};
diff --git a/node_modules/ast-types-flow/package.json b/node_modules/ast-types-flow/package.json
deleted file mode 100644
index 4179ffb..0000000
--- a/node_modules/ast-types-flow/package.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "ast-types-flow",
-  "version": "0.0.7",
-  "description": "Flow types for the Javascript AST",
-  "main": "lib/types.js",
-  "files": [
-    "lib"
-  ],
-  "scripts": {
-    "build": "gulp build",
-    "test": "flow"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/kyldvs/ast-types-flow.git"
-  },
-  "keywords": [
-    "flow",
-    "ast",
-    "javascript"
-  ],
-  "author": "kyldvs",
-  "license": "ISC",
-  "bugs": {
-    "url": "https://github.com/kyldvs/ast-types-flow/issues"
-  },
-  "homepage": "https://github.com/kyldvs/ast-types-flow#readme",
-  "devDependencies": {
-    "gulp": "^3.9.0",
-    "gulp-util": "^3.0.6",
-    "jscodeshift": "^0.3.7",
-    "nuclide-node-transpiler": "0.0.30",
-    "through2": "^2.0.0"
-  }
-}
diff --git a/node_modules/axobject-query/CHANGELOG.md b/node_modules/axobject-query/CHANGELOG.md
deleted file mode 100755
index cd10d07..0000000
--- a/node_modules/axobject-query/CHANGELOG.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# axobject-query Change Log
-
-## 1.0.1
-
-- Changed label from structure to widget
-- Added the CHANGELOG file
-
-## 2.0.1
-
-- Add NPM and Watchman configs
-
-## 2.1.0
-
-- b436e56 (origin/update-dependencies, update-dependencies) Update dependencies; ESLint to 6
-- c157720 Fixes for select and datalist
-
-## 2.1.1
-
-- Bumping the version to see if Travis will run green on the master branch
-
-## 2.1.2
-
-- a1c5ef9 Updated the Copyright to 2020 for A11yance
-- 5c5e04d Remove Peer Dependency to ESLint
-- ec1b53b Remove dependencies on @babel/runtime and @babel/runtime-corejs3
-
diff --git a/node_modules/axobject-query/LICENSE b/node_modules/axobject-query/LICENSE
deleted file mode 100755
index 3a8ae7c..0000000
--- a/node_modules/axobject-query/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-Apache License
-Version 2.0, January 2004
-http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction,
-and distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by
-the copyright owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all
-other entities that control, are controlled by, or are under common
-control with that entity. For the purposes of this definition,
-"control" means (i) the power, direct or indirect, to cause the
-direction or management of such entity, whether by contract or
-otherwise, or (ii) ownership of fifty percent (50%) or more of the
-outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity
-exercising permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications,
-including but not limited to software source code, documentation
-source, and configuration files.
-
-"Object" form shall mean any form resulting from mechanical
-transformation or translation of a Source form, including but
-not limited to compiled object code, generated documentation,
-and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or
-Object form, made available under the License, as indicated by a
-copyright notice that is included in or attached to the work
-(an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object
-form, that is based on (or derived from) the Work and for which the
-editorial revisions, annotations, elaborations, or other modifications
-represent, as a whole, an original work of authorship. For the purposes
-of this License, Derivative Works shall not include works that remain
-separable from, or merely link (or bind by name) to the interfaces of,
-the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including
-the original version of the Work and any modifications or additions
-to that Work or Derivative Works thereof, that is intentionally
-submitted to Licensor for inclusion in the Work by the copyright owner
-or by an individual or Legal Entity authorized to submit on behalf of
-the copyright owner. For the purposes of this definition, "submitted"
-means any form of electronic, verbal, or written communication sent
-to the Licensor or its representatives, including but not limited to
-communication on electronic mailing lists, source code control systems,
-and issue tracking systems that are managed by, or on behalf of, the
-Licensor for the purpose of discussing and improving the Work, but
-excluding communication that is conspicuously marked or otherwise
-designated in writing by the copyright owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity
-on behalf of whom a Contribution has been received by Licensor and
-subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-this License, each Contributor hereby grants to You a perpetual,
-worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-copyright license to reproduce, prepare Derivative Works of,
-publicly display, publicly perform, sublicense, and distribute the
-Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-this License, each Contributor hereby grants to You a perpetual,
-worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-(except as stated in this section) patent license to make, have made,
-use, offer to sell, sell, import, and otherwise transfer the Work,
-where such license applies only to those patent claims licensable
-by such Contributor that are necessarily infringed by their
-Contribution(s) alone or by combination of their Contribution(s)
-with the Work to which such Contribution(s) was submitted. If You
-institute patent litigation against any entity (including a
-cross-claim or counterclaim in a lawsuit) alleging that the Work
-or a Contribution incorporated within the Work constitutes direct
-or contributory patent infringement, then any patent licenses
-granted to You under this License for that Work shall terminate
-as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-Work or Derivative Works thereof in any medium, with or without
-modifications, and in Source or Object form, provided that You
-meet the following conditions:
-
-(a) You must give any other recipients of the Work or
-Derivative Works a copy of this License; and
-
-(b) You must cause any modified files to carry prominent notices
-stating that You changed the files; and
-
-(c) You must retain, in the Source form of any Derivative Works
-that You distribute, all copyright, patent, trademark, and
-attribution notices from the Source form of the Work,
-excluding those notices that do not pertain to any part of
-the Derivative Works; and
-
-(d) If the Work includes a "NOTICE" text file as part of its
-distribution, then any Derivative Works that You distribute must
-include a readable copy of the attribution notices contained
-within such NOTICE file, excluding those notices that do not
-pertain to any part of the Derivative Works, in at least one
-of the following places: within a NOTICE text file distributed
-as part of the Derivative Works; within the Source form or
-documentation, if provided along with the Derivative Works; or,
-within a display generated by the Derivative Works, if and
-wherever such third-party notices normally appear. The contents
-of the NOTICE file are for informational purposes only and
-do not modify the License. You may add Your own attribution
-notices within Derivative Works that You distribute, alongside
-or as an addendum to the NOTICE text from the Work, provided
-that such additional attribution notices cannot be construed
-as modifying the License.
-
-You may add Your own copyright statement to Your modifications and
-may provide additional or different license terms and conditions
-for use, reproduction, or distribution of Your modifications, or
-for any such Derivative Works as a whole, provided Your use,
-reproduction, and distribution of the Work otherwise complies with
-the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-any Contribution intentionally submitted for inclusion in the Work
-by You to the Licensor shall be under the terms and conditions of
-this License, without any additional terms or conditions.
-Notwithstanding the above, nothing herein shall supersede or modify
-the terms of any separate license agreement you may have executed
-with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-names, trademarks, service marks, or product names of the Licensor,
-except as required for reasonable and customary use in describing the
-origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-agreed to in writing, Licensor provides the Work (and each
-Contributor provides its Contributions) on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-implied, including, without limitation, any warranties or conditions
-of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-PARTICULAR PURPOSE. You are solely responsible for determining the
-appropriateness of using or redistributing the Work and assume any
-risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-whether in tort (including negligence), contract, or otherwise,
-unless required by applicable law (such as deliberate and grossly
-negligent acts) or agreed to in writing, shall any Contributor be
-liable to You for damages, including any direct, indirect, special,
-incidental, or consequential damages of any character arising as a
-result of this License or out of the use or inability to use the
-Work (including but not limited to damages for loss of goodwill,
-work stoppage, computer failure or malfunction, or any and all
-other commercial damages or losses), even if such Contributor
-has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-the Work or Derivative Works thereof, You may choose to offer,
-and charge a fee for, acceptance of support, warranty, indemnity,
-or other liability obligations and/or rights consistent with this
-License. However, in accepting such obligations, You may act only
-on Your own behalf and on Your sole responsibility, not on behalf
-of any other Contributor, and only if You agree to indemnify,
-defend, and hold each Contributor harmless for any liability
-incurred by, or claims asserted against, such Contributor by reason
-of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-To apply the Apache License to your work, attach the following
-boilerplate notice, with the fields enclosed by brackets "{}"
-replaced with your own identifying information. (Don't include
-the brackets!)  The text should be enclosed in the appropriate
-comment syntax for the file format. We also recommend that a
-file or class name and description of purpose be included on the
-same "printed page" as the copyright notice for easier
-identification within third-party archives.
-
-Copyright 2020 A11yance
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
diff --git a/node_modules/axobject-query/README.md b/node_modules/axobject-query/README.md
deleted file mode 100755
index 1dbf635..0000000
--- a/node_modules/axobject-query/README.md
+++ /dev/null
@@ -1,384 +0,0 @@
-[![Build Status](https://travis-ci.org/A11yance/axobject-query.svg?branch=master)](https://travis-ci.org/A11yance/axobject-query)
-
-**NOTICE: The API for AXObject Query is very much under development until a major version release. Please be aware that data structures might change in minor version releases before 1.0.0 is released.**
-
-# AXObject Query
-
-Approximate model of the [Chrome AXObject](https://cs.chromium.org/chromium/src/third_party/WebKit/Source/modules/accessibility/AXObject.h).
-
-The project attempts to map the AXObject concepts to the [WAI-ARIA 1.1 Roles Model](https://www.w3.org/TR/wai-aria-1.1/#roles) so that a complete representation of the semantic HTML layer, as it is exposed assistive technology, can be obtained.
-
-## Utilities
-
-### AXObjects
-
-```javascript
-import { AXObjects } from 'axobject-query';
-```
-
-AXObjects are mapped to their HTML and ARIA concepts in the `relatedConcepts` field.
-
-The `type` field is a loose association of an AXObject to the `window`, `structure` and `widget` abstract roles in ARIA. The `generic` value is given to `DivRole`; it does not exist in ARIA. Divs are special in HTML in the way that they are used as generic containers. Span might have also been associated with a generic type except that there is no `SpanRole` AXObject.
-
-```
-Map {
-  'AbbrRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'AlertDialogRole' => { relatedConcepts: [ [Object] ], type: 'window' },
-  'AlertRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'AnnotationRole' => { relatedConcepts: [], type: 'structure' },
-  'ApplicationRole' => { relatedConcepts: [ [Object] ], type: 'window' },
-  'ArticleRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'AudioRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'BannerRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'BlockquoteRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'BusyIndicatorRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'ButtonRole' => { relatedConcepts: [ [Object], [Object] ], type: 'widget' },
-  'CanvasRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'CaptionRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'CellRole' => { relatedConcepts: [ [Object], [Object], [Object] ], type: 'widget' },
-  'CheckBoxRole' => { relatedConcepts: [ [Object], [Object] ], type: 'widget' },
-  'ColorWellRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'ColumnHeaderRole' => { relatedConcepts: [ [Object], [Object] ], type: 'widget' },
-  'ColumnRole' => { relatedConcepts: [], type: 'structure' },
-  'ComboBoxRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'ComplementaryRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'ContentInfoRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'DateRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'DateTimeRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'DefinitionRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'DescriptionListDetailRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'DescriptionListRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'DescriptionListTermRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'DetailsRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'DialogRole' => { relatedConcepts: [ [Object], [Object] ], type: 'window' },
-  'DirectoryRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'DisclosureTriangleRole' => { relatedConcepts: [], type: 'widget' },
-  'DivRole' => { relatedConcepts: [ [Object] ], type: 'generic' },
-  'DocumentRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'EmbeddedObjectRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'FeedRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'FigcaptionRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'FigureRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'FooterRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'FormRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'GridRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'GroupRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'HeadingRole' => { relatedConcepts: [ [Object], [Object], [Object], [Object], [Object], [Object], [Object] ], type: 'structure' },
-  'IframePresentationalRole' => { relatedConcepts: [], type: 'window' },
-  'IframeRole' => { relatedConcepts: [ [Object] ], type: 'window' },
-  'IgnoredRole' => { relatedConcepts: [], type: 'structure' },
-  'ImageMapLinkRole' => { relatedConcepts: [], type: 'widget' },
-  'ImageMapRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'ImageRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'InlineTextBoxRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'InputTimeRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'LabelRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'LegendRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'LineBreakRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'LinkRole' => { relatedConcepts: [ [Object], [Object] ], type: 'widget' },
-  'ListBoxOptionRole' => { relatedConcepts: [ [Object], [Object] ], type: 'widget' },
-  'ListBoxRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'ListItemRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'ListMarkerRole' => { relatedConcepts: [], type: 'structure' },
-  'ListRole' => { relatedConcepts: [ [Object], [Object], [Object] ], type: 'structure' },
-  'LogRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'MainRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'MarkRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'MarqueeRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'MathRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'MenuBarRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'MenuButtonRole' => { relatedConcepts: [], type: 'widget' },
-  'MenuItemRole' => { relatedConcepts: [ [Object], [Object] ], type: 'widget' },
-  'MenuItemCheckBoxRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'MenuItemRadioRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'MenuListOptionRole' => { relatedConcepts: [], type: 'widget' },
-  'MenuListPopupRole' => { relatedConcepts: [], type: 'widget' },
-  'MenuRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'MeterRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'NavigationRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'NoneRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'NoteRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'OutlineRole' => { relatedConcepts: [], type: 'structure' },
-  'ParagraphRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'PopUpButtonRole' => { relatedConcepts: [], type: 'widget' },
-  'PreRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'PresentationalRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'ProgressIndicatorRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'RadioButtonRole' => { relatedConcepts: [ [Object], [Object] ], type: 'widget' },
-  'RadioGroupRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'RegionRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'RootWebAreaRole' => { relatedConcepts: [], type: 'structure' },
-  'RowHeaderRole' => { relatedConcepts: [ [Object], [Object] ], type: 'widget' },
-  'RowRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'RubyRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'RulerRole' => { relatedConcepts: [], type: 'structure' },
-  'ScrollAreaRole' => { relatedConcepts: [], type: 'structure' },
-  'ScrollBarRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'SeamlessWebAreaRole' => { relatedConcepts: [], type: 'structure' },
-  'SearchRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'SearchBoxRole' => { relatedConcepts: [ [Object], [Object] ], type: 'widget' },
-  'SliderRole' => { relatedConcepts: [ [Object], [Object] ], type: 'widget' },
-  'SliderThumbRole' => { relatedConcepts: [], type: 'structure' },
-  'SpinButtonRole' => { relatedConcepts: [ [Object], [Object] ], type: 'widget' },
-  'SpinButtonPartRole' => { relatedConcepts: [], type: 'structure' },
-  'SplitterRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'StaticTextRole' => { relatedConcepts: [], type: 'structure' },
-  'StatusRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'SVGRootRole' => { relatedConcepts: [], type: 'structure' },
-  'SwitchRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'TabGroupRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'TabRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'TableHeaderContainerRole' => { relatedConcepts: [], type: 'structure' },
-  'TableRole' => { relatedConcepts: [ [Object], [Object] ], type: 'structure' },
-  'TabListRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'TabPanelRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'TermRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'TextFieldRole' => { relatedConcepts: [ [Object], [Object], [Object] ], type: 'widget' },
-  'TimeRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'TimerRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'ToggleButtonRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'ToolbarRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'TreeRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'TreeGridRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'TreeItemRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'UserInterfaceTooltipRole' => { relatedConcepts: [ [Object] ], type: 'structure' },
-  'VideoRole' => { relatedConcepts: [ [Object] ], type: 'widget' },
-  'WebAreaRole' => { relatedConcepts: [], type: 'structure' },
-  'WindowRole' => { relatedConcepts: [], type: 'window' }
-}
-```
-
-### AXObject to Element
-
-```javascript
-import { AXObjectElements } from 'axobject-query';
-```
-
-AXObjects are mapped to their related HTML concepts, which may require attributes (in the case of inputs) to obtain the correct association.
-
-```
-Map {
-  'AbbrRole' => Set { { name: 'abbr' } },
-  'ArticleRole' => Set { { name: 'article' } },
-  'AudioRole' => Set { { name: 'audio' } },
-  'BlockquoteRole' => Set { { name: 'blockquote' } },
-  'ButtonRole' => Set { { name: 'button' } },
-  'CanvasRole' => Set { { name: 'canvas' } },
-  'CaptionRole' => Set { { name: 'caption' } },
-  'CellRole' => Set { { name: 'td' } },
-  'CheckBoxRole' => Set { { name: 'input', attributes: [Object] } },
-  'ColorWellRole' => Set { { name: 'input', attributes: [Object] } },
-  'ColumnHeaderRole' => Set { { name: 'th' } },
-  'DateRole' => Set { { name: 'input', attributes: [Object] } },
-  'DateTimeRole' => Set { { name: 'input', attributes: [Object] } },
-  'DefinitionRole' => Set { { name: 'dfn' } },
-  'DescriptionListDetailRole' => Set { { name: 'dd' } },
-  'DescriptionListRole' => Set { { name: 'dl' } },
-  'DescriptionListTermRole' => Set { { name: 'dt' } },
-  'DetailsRole' => Set { { name: 'details' } },
-  'DialogRole' => Set { { name: 'dialog' } },
-  'DirectoryRole' => Set { { name: 'dir' } },
-  'DivRole' => Set { { name: 'div' } },
-  'EmbeddedObjectRole' => Set { { name: 'embed' } },
-  'FigcaptionRole' => Set { { name: 'figcaption' } },
-  'FigureRole' => Set { { name: 'figure' } },
-  'FooterRole' => Set { { name: 'footer' } },
-  'FormRole' => Set { { name: 'form' } },
-  'HeadingRole' => Set { { name: 'h1' }, { name: 'h2' }, { name: 'h3' }, { name: 'h4' }, { name: 'h5' }, { name: 'h6' } },
-  'IframeRole' => Set { { name: 'iframe' } },
-  'ImageMapRole' => Set { { name: 'img', attributes: [Object] } },
-  'ImageRole' => Set { { name: 'img' } },
-  'InlineTextBoxRole' => Set { { name: 'input' } },
-  'InputTimeRole' => Set { { name: 'input', attributes: [Object] } },
-  'LabelRole' => Set { { name: 'label' } },
-  'LegendRole' => Set { { name: 'legend' } },
-  'LineBreakRole' => Set { { name: 'br' } },
-  'LinkRole' => Set { { name: 'a', attributes: [Object] } },
-  'ListBoxOptionRole' => Set { { name: 'option' } },
-  'ListItemRole' => Set { { name: 'li' } },
-  'ListRole' => Set { { name: 'ul' }, { name: 'ol' } },
-  'MainRole' => Set { { name: 'main' } },
-  'MarkRole' => Set { { name: 'mark' } },
-  'MarqueeRole' => Set { { name: 'marquee' } },
-  'MenuItemRole' => Set { { name: 'menuitem' } },
-  'MenuRole' => Set { { name: 'menu' } },
-  'MeterRole' => Set { { name: 'meter' } },
-  'NavigationRole' => Set { { name: 'nav' } },
-  'ParagraphRole' => Set { { name: 'p' } },
-  'PreRole' => Set { { name: 'pre' } },
-  'ProgressIndicatorRole' => Set { { name: 'progress' } },
-  'RadioButtonRole' => Set { { name: 'input', attributes: [Object] } },
-  'RowHeaderRole' => Set { { name: 'th', attributes: [Object] } },
-  'RowRole' => Set { { name: 'tr' } },
-  'RubyRole' => Set { { name: 'ruby' } },
-  'SearchBoxRole' => Set { { name: 'input', attributes: [Object] } },
-  'SliderRole' => Set { { name: 'input', attributes: [Object] } },
-  'SpinButtonRole' => Set { { name: 'input', attributes: [Object] } },
-  'TableRole' => Set { { name: 'table' } },
-  'TextFieldRole' => Set { { name: 'input' }, { name: 'input', attributes: [Object] } },
-  'TimeRole' => Set { { name: 'time' } },
-  'VideoRole' => Set { { name: 'video' }
-}
-```
-
-### AXObject to Role
-
-```javascript
-import { AXObjectRoles } from 'axobject-query';
-```
-
-AXObjects are mapped to their related ARIA concepts..
-
-```
-Map {
-  'AlertDialogRole' => Set { { name: 'alertdialog' } },
-  'AlertRole' => Set { { name: 'alert' } },
-  'ApplicationRole' => Set { { name: 'application' } },
-  'ArticleRole' => Set { { name: 'article' } },
-  'BannerRole' => Set { { name: 'banner' } },
-  'BusyIndicatorRole' => Set { { attributes: [Object] } },
-  'ButtonRole' => Set { { name: 'button' } },
-  'CellRole' => Set { { name: 'cell' }, { name: 'gridcell' } },
-  'CheckBoxRole' => Set { { name: 'checkbox' } },
-  'ColumnHeaderRole' => Set { { name: 'columnheader' } },
-  'ComboBoxRole' => Set { { name: 'combobox' } },
-  'ComplementaryRole' => Set { { name: 'complementary' } },
-  'ContentInfoRole' => Set { { name: 'structureinfo' } },
-  'DialogRole' => Set { { name: 'dialog' } },
-  'DirectoryRole' => Set { { name: 'directory' } },
-  'DocumentRole' => Set { { name: 'document' } },
-  'FeedRole' => Set { { name: 'feed' } },
-  'FigureRole' => Set { { name: 'figure' } },
-  'FormRole' => Set { { name: 'form' } },
-  'GridRole' => Set { { name: 'grid' } },
-  'GroupRole' => Set { { name: 'group' } },
-  'HeadingRole' => Set { { name: 'heading' } },
-  'ImageRole' => Set { { name: 'img' } },
-  'LinkRole' => Set { { name: 'link' } },
-  'ListBoxOptionRole' => Set { { name: 'option' } },
-  'ListBoxRole' => Set { { name: 'listbox' } },
-  'ListItemRole' => Set { { name: 'listitem' } },
-  'ListRole' => Set { { name: 'list' } },
-  'LogRole' => Set { { name: 'log' } },
-  'MainRole' => Set { { name: 'main' } },
-  'MarqueeRole' => Set { { name: 'marquee' } },
-  'MathRole' => Set { { name: 'math' } },
-  'MenuBarRole' => Set { { name: 'menubar' } },
-  'MenuItemRole' => Set { { name: 'menuitem' } },
-  'MenuItemCheckBoxRole' => Set { { name: 'menuitemcheckbox' } },
-  'MenuItemRadioRole' => Set { { name: 'menuitemradio' } },
-  'MenuRole' => Set { { name: 'menu' } },
-  'NavigationRole' => Set { { name: 'navigation' } },
-  'NoneRole' => Set { { name: 'none' } },
-  'NoteRole' => Set { { name: 'note' } },
-  'PresentationalRole' => Set { { name: 'presentation' } },
-  'ProgressIndicatorRole' => Set { { name: 'progressbar' } },
-  'RadioButtonRole' => Set { { name: 'radio' } },
-  'RadioGroupRole' => Set { { name: 'radiogroup' } },
-  'RegionRole' => Set { { name: 'region' } },
-  'RowHeaderRole' => Set { { name: 'rowheader' } },
-  'RowRole' => Set { { name: 'row' } },
-  'ScrollBarRole' => Set { { name: 'scrollbar' } },
-  'SearchRole' => Set { { name: 'search' } },
-  'SearchBoxRole' => Set { { name: 'searchbox' } },
-  'SliderRole' => Set { { name: 'slider' } },
-  'SpinButtonRole' => Set { { name: 'spinbutton' } },
-  'SplitterRole' => Set { { name: 'separator' } },
-  'StatusRole' => Set { { name: 'status' } },
-  'SwitchRole' => Set { { name: 'switch' } },
-  'TabGroupRole' => Set { { name: 'tablist' } },
-  'TabRole' => Set { { name: 'tab' } },
-  'TableRole' => Set { { name: 'table' } },
-  'TabListRole' => Set { { name: 'tablist' } },
-  'TabPanelRole' => Set { { name: 'tabpanel' } },
-  'TermRole' => Set { { name: 'term' } },
-  'TextFieldRole' => Set { { name: 'textbox' } },
-  'TimerRole' => Set { { name: 'timer' } },
-  'ToggleButtonRole' => Set { { attributes: [Object] } },
-  'ToolbarRole' => Set { { name: 'toolbar' } },
-  'TreeRole' => Set { { name: 'tree' } },
-  'TreeGridRole' => Set { { name: 'treegrid' } },
-  'TreeItemRole' => Set { { name: 'treeitem' } },
-  'UserInterfaceTooltipRole' => Set { { name: 'tooltip' } }
-}
-```
-
-### Element to AXObject
-
-```javascript
-import { elementAXObjects } from 'axobject-query';
-```
-
-HTML elements are mapped to their related AXConcepts concepts.
-
-```
-Map {
-  { name: 'abbr' } => Set { 'AbbrRole' },
-  { name: 'article' } => Set { 'ArticleRole' },
-  { name: 'audio' } => Set { 'AudioRole' },
-  { name: 'blockquote' } => Set { 'BlockquoteRole' },
-  { name: 'button' } => Set { 'ButtonRole' },
-  { name: 'canvas' } => Set { 'CanvasRole' },
-  { name: 'caption' } => Set { 'CaptionRole' },
-  { name: 'td' } => Set { 'CellRole' },
-  { name: 'input', attributes: [ [Object] ] } => Set { 'CheckBoxRole' },
-  { name: 'input', attributes: [ [Object] ] } => Set { 'ColorWellRole' },
-  { name: 'th' } => Set { 'ColumnHeaderRole' },
-  { name: 'input', attributes: [ [Object] ] } => Set { 'DateRole' },
-  { name: 'input', attributes: [ [Object] ] } => Set { 'DateTimeRole' },
-  { name: 'dfn' } => Set { 'DefinitionRole' },
-  { name: 'dd' } => Set { 'DescriptionListDetailRole' },
-  { name: 'dl' } => Set { 'DescriptionListRole' },
-  { name: 'dt' } => Set { 'DescriptionListTermRole' },
-  { name: 'details' } => Set { 'DetailsRole' },
-  { name: 'dialog' } => Set { 'DialogRole' },
-  { name: 'dir' } => Set { 'DirectoryRole' },
-  { name: 'div' } => Set { 'DivRole' },
-  { name: 'embed' } => Set { 'EmbeddedObjectRole' },
-  { name: 'figcaption' } => Set { 'FigcaptionRole' },
-  { name: 'figure' } => Set { 'FigureRole' },
-  { name: 'footer' } => Set { 'FooterRole' },
-  { name: 'form' } => Set { 'FormRole' },
-  { name: 'h1' } => Set { 'HeadingRole' },
-  { name: 'h2' } => Set { 'HeadingRole' },
-  { name: 'h3' } => Set { 'HeadingRole' },
-  { name: 'h4' } => Set { 'HeadingRole' },
-  { name: 'h5' } => Set { 'HeadingRole' },
-  { name: 'h6' } => Set { 'HeadingRole' },
-  { name: 'iframe' } => Set { 'IframeRole' },
-  { name: 'img', attributes: [ [Object] ] } => Set { 'ImageMapRole' },
-  { name: 'img' } => Set { 'ImageRole' },
-  { name: 'input' } => Set { 'InlineTextBoxRole', 'TextFieldRole' },
-  { name: 'input', attributes: [ [Object] ] } => Set { 'InputTimeRole' },
-  { name: 'label' } => Set { 'LabelRole' },
-  { name: 'legend' } => Set { 'LegendRole' },
-  { name: 'br' } => Set { 'LineBreakRole' },
-  { name: 'a', attributes: [ [Object] ] } => Set { 'LinkRole' },
-  { name: 'option' } => Set { 'ListBoxOptionRole' },
-  { name: 'li' } => Set { 'ListItemRole' },
-  { name: 'ul' } => Set { 'ListRole' },
-  { name: 'ol' } => Set { 'ListRole' },
-  { name: 'main' } => Set { 'MainRole' },
-  { name: 'mark' } => Set { 'MarkRole' },
-  { name: 'marquee' } => Set { 'MarqueeRole' },
-  { name: 'menuitem' } => Set { 'MenuItemRole' },
-  { name: 'menu' } => Set { 'MenuRole' },
-  { name: 'meter' } => Set { 'MeterRole' },
-  { name: 'nav' } => Set { 'NavigationRole' },
-  { name: 'p' } => Set { 'ParagraphRole' },
-  { name: 'pre' } => Set { 'PreRole' },
-  { name: 'progress' } => Set { 'ProgressIndicatorRole' },
-  { name: 'input', attributes: [ [Object] ] } => Set { 'RadioButtonRole' },
-  { name: 'th', attributes: [ [Object] ] } => Set { 'RowHeaderRole' },
-  { name: 'tr' } => Set { 'RowRole' },
-  { name: 'ruby' } => Set { 'RubyRole' },
-  { name: 'input', attributes: [ [Object] ] } => Set { 'SearchBoxRole' },
-  { name: 'input', attributes: [ [Object] ] } => Set { 'SliderRole' },
-  { name: 'input', attributes: [ [Object] ] } => Set { 'SpinButtonRole' },
-  { name: 'table' } => Set { 'TableRole' },
-  { name: 'input' } => Set { 'InlineTextBoxRole', 'TextFieldRole' },
-  { name: 'input', attributes: [ [Object] ] } => Set { 'TextFieldRole' },
-  { name: 'time' } => Set { 'TimeRole' },
-  { name: 'video' } => Set { 'VideoRole' }
-}
-```
diff --git a/node_modules/axobject-query/lib/AXObjectElementMap.js b/node_modules/axobject-query/lib/AXObjectElementMap.js
deleted file mode 100755
index ab0703d..0000000
--- a/node_modules/axobject-query/lib/AXObjectElementMap.js
+++ /dev/null
@@ -1,67 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _AXObjectsMap = _interopRequireDefault(require("./AXObjectsMap"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
-
-function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-var AXObjectElementMap = new Map([]);
-var _iteratorNormalCompletion = true;
-var _didIteratorError = false;
-var _iteratorError = undefined;
-
-try {
-  var _loop = function _loop() {
-    var _step$value = _slicedToArray(_step.value, 2),
-        name = _step$value[0],
-        def = _step$value[1];
-
-    var relatedConcepts = def.relatedConcepts;
-
-    if (Array.isArray(relatedConcepts)) {
-      relatedConcepts.forEach(function (relation) {
-        if (relation.module === 'HTML') {
-          var concept = relation.concept;
-
-          if (concept) {
-            var relationConcepts = AXObjectElementMap.get(name) || new Set([]);
-            relationConcepts.add(concept);
-            AXObjectElementMap.set(name, relationConcepts);
-          }
-        }
-      });
-    }
-  };
-
-  for (var _iterator = _AXObjectsMap["default"][Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-    _loop();
-  }
-} catch (err) {
-  _didIteratorError = true;
-  _iteratorError = err;
-} finally {
-  try {
-    if (!_iteratorNormalCompletion && _iterator["return"] != null) {
-      _iterator["return"]();
-    }
-  } finally {
-    if (_didIteratorError) {
-      throw _iteratorError;
-    }
-  }
-}
-
-var _default = AXObjectElementMap;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/AXObjectRoleMap.js b/node_modules/axobject-query/lib/AXObjectRoleMap.js
deleted file mode 100755
index 1743fd0..0000000
--- a/node_modules/axobject-query/lib/AXObjectRoleMap.js
+++ /dev/null
@@ -1,67 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _AXObjectsMap = _interopRequireDefault(require("./AXObjectsMap"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
-
-function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-var AXObjectRoleMap = new Map([]);
-var _iteratorNormalCompletion = true;
-var _didIteratorError = false;
-var _iteratorError = undefined;
-
-try {
-  var _loop = function _loop() {
-    var _step$value = _slicedToArray(_step.value, 2),
-        name = _step$value[0],
-        def = _step$value[1];
-
-    var relatedConcepts = def.relatedConcepts;
-
-    if (Array.isArray(relatedConcepts)) {
-      relatedConcepts.forEach(function (relation) {
-        if (relation.module === 'ARIA') {
-          var concept = relation.concept;
-
-          if (concept) {
-            var relationConcepts = AXObjectRoleMap.get(name) || new Set([]);
-            relationConcepts.add(concept);
-            AXObjectRoleMap.set(name, relationConcepts);
-          }
-        }
-      });
-    }
-  };
-
-  for (var _iterator = _AXObjectsMap["default"][Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-    _loop();
-  }
-} catch (err) {
-  _didIteratorError = true;
-  _iteratorError = err;
-} finally {
-  try {
-    if (!_iteratorNormalCompletion && _iterator["return"] != null) {
-      _iterator["return"]();
-    }
-  } finally {
-    if (_didIteratorError) {
-      throw _iteratorError;
-    }
-  }
-}
-
-var _default = AXObjectRoleMap;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/AXObjectsMap.js b/node_modules/axobject-query/lib/AXObjectsMap.js
deleted file mode 100755
index f838ec6..0000000
--- a/node_modules/axobject-query/lib/AXObjectsMap.js
+++ /dev/null
@@ -1,258 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _AbbrRole = _interopRequireDefault(require("./etc/objects/AbbrRole"));
-
-var _AlertDialogRole = _interopRequireDefault(require("./etc/objects/AlertDialogRole"));
-
-var _AlertRole = _interopRequireDefault(require("./etc/objects/AlertRole"));
-
-var _AnnotationRole = _interopRequireDefault(require("./etc/objects/AnnotationRole"));
-
-var _ApplicationRole = _interopRequireDefault(require("./etc/objects/ApplicationRole"));
-
-var _ArticleRole = _interopRequireDefault(require("./etc/objects/ArticleRole"));
-
-var _AudioRole = _interopRequireDefault(require("./etc/objects/AudioRole"));
-
-var _BannerRole = _interopRequireDefault(require("./etc/objects/BannerRole"));
-
-var _BlockquoteRole = _interopRequireDefault(require("./etc/objects/BlockquoteRole"));
-
-var _BusyIndicatorRole = _interopRequireDefault(require("./etc/objects/BusyIndicatorRole"));
-
-var _ButtonRole = _interopRequireDefault(require("./etc/objects/ButtonRole"));
-
-var _CanvasRole = _interopRequireDefault(require("./etc/objects/CanvasRole"));
-
-var _CaptionRole = _interopRequireDefault(require("./etc/objects/CaptionRole"));
-
-var _CellRole = _interopRequireDefault(require("./etc/objects/CellRole"));
-
-var _CheckBoxRole = _interopRequireDefault(require("./etc/objects/CheckBoxRole"));
-
-var _ColorWellRole = _interopRequireDefault(require("./etc/objects/ColorWellRole"));
-
-var _ColumnHeaderRole = _interopRequireDefault(require("./etc/objects/ColumnHeaderRole"));
-
-var _ColumnRole = _interopRequireDefault(require("./etc/objects/ColumnRole"));
-
-var _ComboBoxRole = _interopRequireDefault(require("./etc/objects/ComboBoxRole"));
-
-var _ComplementaryRole = _interopRequireDefault(require("./etc/objects/ComplementaryRole"));
-
-var _ContentInfoRole = _interopRequireDefault(require("./etc/objects/ContentInfoRole"));
-
-var _DateRole = _interopRequireDefault(require("./etc/objects/DateRole"));
-
-var _DateTimeRole = _interopRequireDefault(require("./etc/objects/DateTimeRole"));
-
-var _DefinitionRole = _interopRequireDefault(require("./etc/objects/DefinitionRole"));
-
-var _DescriptionListDetailRole = _interopRequireDefault(require("./etc/objects/DescriptionListDetailRole"));
-
-var _DescriptionListRole = _interopRequireDefault(require("./etc/objects/DescriptionListRole"));
-
-var _DescriptionListTermRole = _interopRequireDefault(require("./etc/objects/DescriptionListTermRole"));
-
-var _DetailsRole = _interopRequireDefault(require("./etc/objects/DetailsRole"));
-
-var _DialogRole = _interopRequireDefault(require("./etc/objects/DialogRole"));
-
-var _DirectoryRole = _interopRequireDefault(require("./etc/objects/DirectoryRole"));
-
-var _DisclosureTriangleRole = _interopRequireDefault(require("./etc/objects/DisclosureTriangleRole"));
-
-var _DivRole = _interopRequireDefault(require("./etc/objects/DivRole"));
-
-var _DocumentRole = _interopRequireDefault(require("./etc/objects/DocumentRole"));
-
-var _EmbeddedObjectRole = _interopRequireDefault(require("./etc/objects/EmbeddedObjectRole"));
-
-var _FeedRole = _interopRequireDefault(require("./etc/objects/FeedRole"));
-
-var _FigcaptionRole = _interopRequireDefault(require("./etc/objects/FigcaptionRole"));
-
-var _FigureRole = _interopRequireDefault(require("./etc/objects/FigureRole"));
-
-var _FooterRole = _interopRequireDefault(require("./etc/objects/FooterRole"));
-
-var _FormRole = _interopRequireDefault(require("./etc/objects/FormRole"));
-
-var _GridRole = _interopRequireDefault(require("./etc/objects/GridRole"));
-
-var _GroupRole = _interopRequireDefault(require("./etc/objects/GroupRole"));
-
-var _HeadingRole = _interopRequireDefault(require("./etc/objects/HeadingRole"));
-
-var _IframePresentationalRole = _interopRequireDefault(require("./etc/objects/IframePresentationalRole"));
-
-var _IframeRole = _interopRequireDefault(require("./etc/objects/IframeRole"));
-
-var _IgnoredRole = _interopRequireDefault(require("./etc/objects/IgnoredRole"));
-
-var _ImageMapLinkRole = _interopRequireDefault(require("./etc/objects/ImageMapLinkRole"));
-
-var _ImageMapRole = _interopRequireDefault(require("./etc/objects/ImageMapRole"));
-
-var _ImageRole = _interopRequireDefault(require("./etc/objects/ImageRole"));
-
-var _InlineTextBoxRole = _interopRequireDefault(require("./etc/objects/InlineTextBoxRole"));
-
-var _InputTimeRole = _interopRequireDefault(require("./etc/objects/InputTimeRole"));
-
-var _LabelRole = _interopRequireDefault(require("./etc/objects/LabelRole"));
-
-var _LegendRole = _interopRequireDefault(require("./etc/objects/LegendRole"));
-
-var _LineBreakRole = _interopRequireDefault(require("./etc/objects/LineBreakRole"));
-
-var _LinkRole = _interopRequireDefault(require("./etc/objects/LinkRole"));
-
-var _ListBoxOptionRole = _interopRequireDefault(require("./etc/objects/ListBoxOptionRole"));
-
-var _ListBoxRole = _interopRequireDefault(require("./etc/objects/ListBoxRole"));
-
-var _ListItemRole = _interopRequireDefault(require("./etc/objects/ListItemRole"));
-
-var _ListMarkerRole = _interopRequireDefault(require("./etc/objects/ListMarkerRole"));
-
-var _ListRole = _interopRequireDefault(require("./etc/objects/ListRole"));
-
-var _LogRole = _interopRequireDefault(require("./etc/objects/LogRole"));
-
-var _MainRole = _interopRequireDefault(require("./etc/objects/MainRole"));
-
-var _MarkRole = _interopRequireDefault(require("./etc/objects/MarkRole"));
-
-var _MarqueeRole = _interopRequireDefault(require("./etc/objects/MarqueeRole"));
-
-var _MathRole = _interopRequireDefault(require("./etc/objects/MathRole"));
-
-var _MenuBarRole = _interopRequireDefault(require("./etc/objects/MenuBarRole"));
-
-var _MenuButtonRole = _interopRequireDefault(require("./etc/objects/MenuButtonRole"));
-
-var _MenuItemRole = _interopRequireDefault(require("./etc/objects/MenuItemRole"));
-
-var _MenuItemCheckBoxRole = _interopRequireDefault(require("./etc/objects/MenuItemCheckBoxRole"));
-
-var _MenuItemRadioRole = _interopRequireDefault(require("./etc/objects/MenuItemRadioRole"));
-
-var _MenuListOptionRole = _interopRequireDefault(require("./etc/objects/MenuListOptionRole"));
-
-var _MenuListPopupRole = _interopRequireDefault(require("./etc/objects/MenuListPopupRole"));
-
-var _MenuRole = _interopRequireDefault(require("./etc/objects/MenuRole"));
-
-var _MeterRole = _interopRequireDefault(require("./etc/objects/MeterRole"));
-
-var _NavigationRole = _interopRequireDefault(require("./etc/objects/NavigationRole"));
-
-var _NoneRole = _interopRequireDefault(require("./etc/objects/NoneRole"));
-
-var _NoteRole = _interopRequireDefault(require("./etc/objects/NoteRole"));
-
-var _OutlineRole = _interopRequireDefault(require("./etc/objects/OutlineRole"));
-
-var _ParagraphRole = _interopRequireDefault(require("./etc/objects/ParagraphRole"));
-
-var _PopUpButtonRole = _interopRequireDefault(require("./etc/objects/PopUpButtonRole"));
-
-var _PreRole = _interopRequireDefault(require("./etc/objects/PreRole"));
-
-var _PresentationalRole = _interopRequireDefault(require("./etc/objects/PresentationalRole"));
-
-var _ProgressIndicatorRole = _interopRequireDefault(require("./etc/objects/ProgressIndicatorRole"));
-
-var _RadioButtonRole = _interopRequireDefault(require("./etc/objects/RadioButtonRole"));
-
-var _RadioGroupRole = _interopRequireDefault(require("./etc/objects/RadioGroupRole"));
-
-var _RegionRole = _interopRequireDefault(require("./etc/objects/RegionRole"));
-
-var _RootWebAreaRole = _interopRequireDefault(require("./etc/objects/RootWebAreaRole"));
-
-var _RowHeaderRole = _interopRequireDefault(require("./etc/objects/RowHeaderRole"));
-
-var _RowRole = _interopRequireDefault(require("./etc/objects/RowRole"));
-
-var _RubyRole = _interopRequireDefault(require("./etc/objects/RubyRole"));
-
-var _RulerRole = _interopRequireDefault(require("./etc/objects/RulerRole"));
-
-var _ScrollAreaRole = _interopRequireDefault(require("./etc/objects/ScrollAreaRole"));
-
-var _ScrollBarRole = _interopRequireDefault(require("./etc/objects/ScrollBarRole"));
-
-var _SeamlessWebAreaRole = _interopRequireDefault(require("./etc/objects/SeamlessWebAreaRole"));
-
-var _SearchRole = _interopRequireDefault(require("./etc/objects/SearchRole"));
-
-var _SearchBoxRole = _interopRequireDefault(require("./etc/objects/SearchBoxRole"));
-
-var _SliderRole = _interopRequireDefault(require("./etc/objects/SliderRole"));
-
-var _SliderThumbRole = _interopRequireDefault(require("./etc/objects/SliderThumbRole"));
-
-var _SpinButtonRole = _interopRequireDefault(require("./etc/objects/SpinButtonRole"));
-
-var _SpinButtonPartRole = _interopRequireDefault(require("./etc/objects/SpinButtonPartRole"));
-
-var _SplitterRole = _interopRequireDefault(require("./etc/objects/SplitterRole"));
-
-var _StaticTextRole = _interopRequireDefault(require("./etc/objects/StaticTextRole"));
-
-var _StatusRole = _interopRequireDefault(require("./etc/objects/StatusRole"));
-
-var _SVGRootRole = _interopRequireDefault(require("./etc/objects/SVGRootRole"));
-
-var _SwitchRole = _interopRequireDefault(require("./etc/objects/SwitchRole"));
-
-var _TabGroupRole = _interopRequireDefault(require("./etc/objects/TabGroupRole"));
-
-var _TabRole = _interopRequireDefault(require("./etc/objects/TabRole"));
-
-var _TableHeaderContainerRole = _interopRequireDefault(require("./etc/objects/TableHeaderContainerRole"));
-
-var _TableRole = _interopRequireDefault(require("./etc/objects/TableRole"));
-
-var _TabListRole = _interopRequireDefault(require("./etc/objects/TabListRole"));
-
-var _TabPanelRole = _interopRequireDefault(require("./etc/objects/TabPanelRole"));
-
-var _TermRole = _interopRequireDefault(require("./etc/objects/TermRole"));
-
-var _TextFieldRole = _interopRequireDefault(require("./etc/objects/TextFieldRole"));
-
-var _TimeRole = _interopRequireDefault(require("./etc/objects/TimeRole"));
-
-var _TimerRole = _interopRequireDefault(require("./etc/objects/TimerRole"));
-
-var _ToggleButtonRole = _interopRequireDefault(require("./etc/objects/ToggleButtonRole"));
-
-var _ToolbarRole = _interopRequireDefault(require("./etc/objects/ToolbarRole"));
-
-var _TreeRole = _interopRequireDefault(require("./etc/objects/TreeRole"));
-
-var _TreeGridRole = _interopRequireDefault(require("./etc/objects/TreeGridRole"));
-
-var _TreeItemRole = _interopRequireDefault(require("./etc/objects/TreeItemRole"));
-
-var _UserInterfaceTooltipRole = _interopRequireDefault(require("./etc/objects/UserInterfaceTooltipRole"));
-
-var _VideoRole = _interopRequireDefault(require("./etc/objects/VideoRole"));
-
-var _WebAreaRole = _interopRequireDefault(require("./etc/objects/WebAreaRole"));
-
-var _WindowRole = _interopRequireDefault(require("./etc/objects/WindowRole"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-var AXObjectsMap = new Map([['AbbrRole', _AbbrRole["default"]], ['AlertDialogRole', _AlertDialogRole["default"]], ['AlertRole', _AlertRole["default"]], ['AnnotationRole', _AnnotationRole["default"]], ['ApplicationRole', _ApplicationRole["default"]], ['ArticleRole', _ArticleRole["default"]], ['AudioRole', _AudioRole["default"]], ['BannerRole', _BannerRole["default"]], ['BlockquoteRole', _BlockquoteRole["default"]], ['BusyIndicatorRole', _BusyIndicatorRole["default"]], ['ButtonRole', _ButtonRole["default"]], ['CanvasRole', _CanvasRole["default"]], ['CaptionRole', _CaptionRole["default"]], ['CellRole', _CellRole["default"]], ['CheckBoxRole', _CheckBoxRole["default"]], ['ColorWellRole', _ColorWellRole["default"]], ['ColumnHeaderRole', _ColumnHeaderRole["default"]], ['ColumnRole', _ColumnRole["default"]], ['ComboBoxRole', _ComboBoxRole["default"]], ['ComplementaryRole', _ComplementaryRole["default"]], ['ContentInfoRole', _ContentInfoRole["default"]], ['DateRole', _DateRole["default"]], ['DateTimeRole', _DateTimeRole["default"]], ['DefinitionRole', _DefinitionRole["default"]], ['DescriptionListDetailRole', _DescriptionListDetailRole["default"]], ['DescriptionListRole', _DescriptionListRole["default"]], ['DescriptionListTermRole', _DescriptionListTermRole["default"]], ['DetailsRole', _DetailsRole["default"]], ['DialogRole', _DialogRole["default"]], ['DirectoryRole', _DirectoryRole["default"]], ['DisclosureTriangleRole', _DisclosureTriangleRole["default"]], ['DivRole', _DivRole["default"]], ['DocumentRole', _DocumentRole["default"]], ['EmbeddedObjectRole', _EmbeddedObjectRole["default"]], ['FeedRole', _FeedRole["default"]], ['FigcaptionRole', _FigcaptionRole["default"]], ['FigureRole', _FigureRole["default"]], ['FooterRole', _FooterRole["default"]], ['FormRole', _FormRole["default"]], ['GridRole', _GridRole["default"]], ['GroupRole', _GroupRole["default"]], ['HeadingRole', _HeadingRole["default"]], ['IframePresentationalRole', _IframePresentationalRole["default"]], ['IframeRole', _IframeRole["default"]], ['IgnoredRole', _IgnoredRole["default"]], ['ImageMapLinkRole', _ImageMapLinkRole["default"]], ['ImageMapRole', _ImageMapRole["default"]], ['ImageRole', _ImageRole["default"]], ['InlineTextBoxRole', _InlineTextBoxRole["default"]], ['InputTimeRole', _InputTimeRole["default"]], ['LabelRole', _LabelRole["default"]], ['LegendRole', _LegendRole["default"]], ['LineBreakRole', _LineBreakRole["default"]], ['LinkRole', _LinkRole["default"]], ['ListBoxOptionRole', _ListBoxOptionRole["default"]], ['ListBoxRole', _ListBoxRole["default"]], ['ListItemRole', _ListItemRole["default"]], ['ListMarkerRole', _ListMarkerRole["default"]], ['ListRole', _ListRole["default"]], ['LogRole', _LogRole["default"]], ['MainRole', _MainRole["default"]], ['MarkRole', _MarkRole["default"]], ['MarqueeRole', _MarqueeRole["default"]], ['MathRole', _MathRole["default"]], ['MenuBarRole', _MenuBarRole["default"]], ['MenuButtonRole', _MenuButtonRole["default"]], ['MenuItemRole', _MenuItemRole["default"]], ['MenuItemCheckBoxRole', _MenuItemCheckBoxRole["default"]], ['MenuItemRadioRole', _MenuItemRadioRole["default"]], ['MenuListOptionRole', _MenuListOptionRole["default"]], ['MenuListPopupRole', _MenuListPopupRole["default"]], ['MenuRole', _MenuRole["default"]], ['MeterRole', _MeterRole["default"]], ['NavigationRole', _NavigationRole["default"]], ['NoneRole', _NoneRole["default"]], ['NoteRole', _NoteRole["default"]], ['OutlineRole', _OutlineRole["default"]], ['ParagraphRole', _ParagraphRole["default"]], ['PopUpButtonRole', _PopUpButtonRole["default"]], ['PreRole', _PreRole["default"]], ['PresentationalRole', _PresentationalRole["default"]], ['ProgressIndicatorRole', _ProgressIndicatorRole["default"]], ['RadioButtonRole', _RadioButtonRole["default"]], ['RadioGroupRole', _RadioGroupRole["default"]], ['RegionRole', _RegionRole["default"]], ['RootWebAreaRole', _RootWebAreaRole["default"]], ['RowHeaderRole', _RowHeaderRole["default"]], ['RowRole', _RowRole["default"]], ['RubyRole', _RubyRole["default"]], ['RulerRole', _RulerRole["default"]], ['ScrollAreaRole', _ScrollAreaRole["default"]], ['ScrollBarRole', _ScrollBarRole["default"]], ['SeamlessWebAreaRole', _SeamlessWebAreaRole["default"]], ['SearchRole', _SearchRole["default"]], ['SearchBoxRole', _SearchBoxRole["default"]], ['SliderRole', _SliderRole["default"]], ['SliderThumbRole', _SliderThumbRole["default"]], ['SpinButtonRole', _SpinButtonRole["default"]], ['SpinButtonPartRole', _SpinButtonPartRole["default"]], ['SplitterRole', _SplitterRole["default"]], ['StaticTextRole', _StaticTextRole["default"]], ['StatusRole', _StatusRole["default"]], ['SVGRootRole', _SVGRootRole["default"]], ['SwitchRole', _SwitchRole["default"]], ['TabGroupRole', _TabGroupRole["default"]], ['TabRole', _TabRole["default"]], ['TableHeaderContainerRole', _TableHeaderContainerRole["default"]], ['TableRole', _TableRole["default"]], ['TabListRole', _TabListRole["default"]], ['TabPanelRole', _TabPanelRole["default"]], ['TermRole', _TermRole["default"]], ['TextFieldRole', _TextFieldRole["default"]], ['TimeRole', _TimeRole["default"]], ['TimerRole', _TimerRole["default"]], ['ToggleButtonRole', _ToggleButtonRole["default"]], ['ToolbarRole', _ToolbarRole["default"]], ['TreeRole', _TreeRole["default"]], ['TreeGridRole', _TreeGridRole["default"]], ['TreeItemRole', _TreeItemRole["default"]], ['UserInterfaceTooltipRole', _UserInterfaceTooltipRole["default"]], ['VideoRole', _VideoRole["default"]], ['WebAreaRole', _WebAreaRole["default"]], ['WindowRole', _WindowRole["default"]]]);
-var _default = AXObjectsMap;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/elementAXObjectMap.js b/node_modules/axobject-query/lib/elementAXObjectMap.js
deleted file mode 100755
index de59262..0000000
--- a/node_modules/axobject-query/lib/elementAXObjectMap.js
+++ /dev/null
@@ -1,89 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _AXObjectsMap = _interopRequireDefault(require("./AXObjectsMap"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
-
-function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
-
-function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
-
-function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
-
-function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
-
-var axObjectNames = _toConsumableArray(_AXObjectsMap["default"].keys());
-
-var elementAXObjectMap = new Map([]);
-var _iteratorNormalCompletion = true;
-var _didIteratorError = false;
-var _iteratorError = undefined;
-
-try {
-  var _loop = function _loop() {
-    var _step$value = _slicedToArray(_step.value, 2),
-        name = _step$value[0],
-        def = _step$value[1];
-
-    var relatedConcepts = def.relatedConcepts;
-
-    if (Array.isArray(relatedConcepts)) {
-      relatedConcepts.forEach(function (relation) {
-        if (relation.module === 'HTML') {
-          var concept = relation.concept;
-
-          if (concept) {
-            var conceptStr = JSON.stringify(concept);
-            var axObjects = (_toConsumableArray(elementAXObjectMap.entries()).find(function (_ref) {
-              var _ref2 = _slicedToArray(_ref, 2),
-                  key = _ref2[0],
-                  value = _ref2[1];
-
-              return JSON.stringify(key) === conceptStr;
-            }) || [])[1];
-
-            if (!axObjects) {
-              axObjects = new Set([]);
-            }
-
-            axObjects.add(name);
-            elementAXObjectMap.set(concept, axObjects);
-          }
-        }
-      });
-    }
-  };
-
-  for (var _iterator = _AXObjectsMap["default"][Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-    _loop();
-  }
-} catch (err) {
-  _didIteratorError = true;
-  _iteratorError = err;
-} finally {
-  try {
-    if (!_iteratorNormalCompletion && _iterator["return"] != null) {
-      _iterator["return"]();
-    }
-  } finally {
-    if (_didIteratorError) {
-      throw _iteratorError;
-    }
-  }
-}
-
-var _default = elementAXObjectMap;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/AbbrRole.js b/node_modules/axobject-query/lib/etc/objects/AbbrRole.js
deleted file mode 100755
index bf0b95c..0000000
--- a/node_modules/axobject-query/lib/etc/objects/AbbrRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var AbbrRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'abbr'
-    }
-  }],
-  type: 'structure'
-};
-var _default = AbbrRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/AlertDialogRole.js b/node_modules/axobject-query/lib/etc/objects/AlertDialogRole.js
deleted file mode 100755
index 18bfa43..0000000
--- a/node_modules/axobject-query/lib/etc/objects/AlertDialogRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var AlertDialogRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'alertdialog'
-    }
-  }],
-  type: 'window'
-};
-var _default = AlertDialogRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/AlertRole.js b/node_modules/axobject-query/lib/etc/objects/AlertRole.js
deleted file mode 100755
index 81f17b7..0000000
--- a/node_modules/axobject-query/lib/etc/objects/AlertRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var AlertRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'alert'
-    }
-  }],
-  type: 'structure'
-};
-var _default = AlertRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/AnnotationRole.js b/node_modules/axobject-query/lib/etc/objects/AnnotationRole.js
deleted file mode 100755
index 70c6e57..0000000
--- a/node_modules/axobject-query/lib/etc/objects/AnnotationRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var AnnotationRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = AnnotationRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ApplicationRole.js b/node_modules/axobject-query/lib/etc/objects/ApplicationRole.js
deleted file mode 100755
index 65bee64..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ApplicationRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ApplicationRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'application'
-    }
-  }],
-  type: 'window'
-};
-var _default = ApplicationRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ArticleRole.js b/node_modules/axobject-query/lib/etc/objects/ArticleRole.js
deleted file mode 100755
index 853648d..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ArticleRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ArticleRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'article'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'article'
-    }
-  }],
-  type: 'structure'
-};
-var _default = ArticleRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/AudioRole.js b/node_modules/axobject-query/lib/etc/objects/AudioRole.js
deleted file mode 100755
index ea1053c..0000000
--- a/node_modules/axobject-query/lib/etc/objects/AudioRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var AudioRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'audio'
-    }
-  }],
-  type: 'widget'
-};
-var _default = AudioRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/BannerRole.js b/node_modules/axobject-query/lib/etc/objects/BannerRole.js
deleted file mode 100755
index bcd2d74..0000000
--- a/node_modules/axobject-query/lib/etc/objects/BannerRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var BannerRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'banner'
-    }
-  }],
-  type: 'structure'
-};
-var _default = BannerRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/BlockquoteRole.js b/node_modules/axobject-query/lib/etc/objects/BlockquoteRole.js
deleted file mode 100755
index 3327853..0000000
--- a/node_modules/axobject-query/lib/etc/objects/BlockquoteRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var BlockquoteRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'blockquote'
-    }
-  }],
-  type: 'structure'
-};
-var _default = BlockquoteRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/BusyIndicatorRole.js b/node_modules/axobject-query/lib/etc/objects/BusyIndicatorRole.js
deleted file mode 100755
index 46c5e81..0000000
--- a/node_modules/axobject-query/lib/etc/objects/BusyIndicatorRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var BusyIndicatorRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      attributes: [{
-        name: 'aria-busy',
-        value: 'true'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = BusyIndicatorRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ButtonRole.js b/node_modules/axobject-query/lib/etc/objects/ButtonRole.js
deleted file mode 100755
index 3e9b7fd..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ButtonRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ButtonRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'button'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'button'
-    }
-  }],
-  type: 'widget'
-};
-var _default = ButtonRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/CanvasRole.js b/node_modules/axobject-query/lib/etc/objects/CanvasRole.js
deleted file mode 100755
index 9a77c15..0000000
--- a/node_modules/axobject-query/lib/etc/objects/CanvasRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var CanvasRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'canvas'
-    }
-  }],
-  type: 'widget'
-};
-var _default = CanvasRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/CaptionRole.js b/node_modules/axobject-query/lib/etc/objects/CaptionRole.js
deleted file mode 100755
index d48a00c..0000000
--- a/node_modules/axobject-query/lib/etc/objects/CaptionRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var CaptionRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'caption'
-    }
-  }],
-  type: 'structure'
-};
-var _default = CaptionRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/CellRole.js b/node_modules/axobject-query/lib/etc/objects/CellRole.js
deleted file mode 100755
index cae480a..0000000
--- a/node_modules/axobject-query/lib/etc/objects/CellRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var CellRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'cell'
-    }
-  }, {
-    module: 'ARIA',
-    concept: {
-      name: 'gridcell'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'td'
-    }
-  }],
-  type: 'widget'
-};
-var _default = CellRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/CheckBoxRole.js b/node_modules/axobject-query/lib/etc/objects/CheckBoxRole.js
deleted file mode 100755
index b2da29d..0000000
--- a/node_modules/axobject-query/lib/etc/objects/CheckBoxRole.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var CheckBoxRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'checkbox'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'checkbox'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = CheckBoxRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ColorWellRole.js b/node_modules/axobject-query/lib/etc/objects/ColorWellRole.js
deleted file mode 100755
index 9a4d1e2..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ColorWellRole.js
+++ /dev/null
@@ -1,21 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ColorWellRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'color'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = ColorWellRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ColumnHeaderRole.js b/node_modules/axobject-query/lib/etc/objects/ColumnHeaderRole.js
deleted file mode 100755
index 16e4a5b..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ColumnHeaderRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ColumnHeaderRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'columnheader'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'th'
-    }
-  }],
-  type: 'widget'
-};
-var _default = ColumnHeaderRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ColumnRole.js b/node_modules/axobject-query/lib/etc/objects/ColumnRole.js
deleted file mode 100755
index 8aecdfc..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ColumnRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ColumnRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = ColumnRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ComboBoxRole.js b/node_modules/axobject-query/lib/etc/objects/ComboBoxRole.js
deleted file mode 100755
index 10b2683..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ComboBoxRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ComboBoxRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'combobox'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'select'
-    }
-  }],
-  type: 'widget'
-};
-var _default = ComboBoxRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ComplementaryRole.js b/node_modules/axobject-query/lib/etc/objects/ComplementaryRole.js
deleted file mode 100755
index d76c3a5..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ComplementaryRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ComplementaryRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'complementary'
-    }
-  }],
-  type: 'structure'
-};
-var _default = ComplementaryRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ContentInfoRole.js b/node_modules/axobject-query/lib/etc/objects/ContentInfoRole.js
deleted file mode 100755
index 5f75d63..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ContentInfoRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ContentInfoRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'structureinfo'
-    }
-  }],
-  type: 'structure'
-};
-var _default = ContentInfoRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/DateRole.js b/node_modules/axobject-query/lib/etc/objects/DateRole.js
deleted file mode 100755
index 1419840..0000000
--- a/node_modules/axobject-query/lib/etc/objects/DateRole.js
+++ /dev/null
@@ -1,21 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var DateRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'date'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = DateRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/DateTimeRole.js b/node_modules/axobject-query/lib/etc/objects/DateTimeRole.js
deleted file mode 100755
index f186d12..0000000
--- a/node_modules/axobject-query/lib/etc/objects/DateTimeRole.js
+++ /dev/null
@@ -1,21 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var DateTimeRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'datetime'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = DateTimeRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/DefinitionRole.js b/node_modules/axobject-query/lib/etc/objects/DefinitionRole.js
deleted file mode 100755
index 8ea20cc..0000000
--- a/node_modules/axobject-query/lib/etc/objects/DefinitionRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var DefinitionRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'dfn'
-    }
-  }],
-  type: 'structure'
-};
-var _default = DefinitionRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/DescriptionListDetailRole.js b/node_modules/axobject-query/lib/etc/objects/DescriptionListDetailRole.js
deleted file mode 100755
index df9b3c6..0000000
--- a/node_modules/axobject-query/lib/etc/objects/DescriptionListDetailRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var DescriptionListDetailRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'dd'
-    }
-  }],
-  type: 'structure'
-};
-var _default = DescriptionListDetailRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/DescriptionListRole.js b/node_modules/axobject-query/lib/etc/objects/DescriptionListRole.js
deleted file mode 100755
index 1acef36..0000000
--- a/node_modules/axobject-query/lib/etc/objects/DescriptionListRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var DescriptionListRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'dl'
-    }
-  }],
-  type: 'structure'
-};
-var _default = DescriptionListRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/DescriptionListTermRole.js b/node_modules/axobject-query/lib/etc/objects/DescriptionListTermRole.js
deleted file mode 100755
index 9a4662c..0000000
--- a/node_modules/axobject-query/lib/etc/objects/DescriptionListTermRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var DescriptionListTermRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'dt'
-    }
-  }],
-  type: 'structure'
-};
-var _default = DescriptionListTermRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/DetailsRole.js b/node_modules/axobject-query/lib/etc/objects/DetailsRole.js
deleted file mode 100755
index 4fce94a..0000000
--- a/node_modules/axobject-query/lib/etc/objects/DetailsRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var DetailsRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'details'
-    }
-  }],
-  type: 'structure'
-};
-var _default = DetailsRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/DialogRole.js b/node_modules/axobject-query/lib/etc/objects/DialogRole.js
deleted file mode 100755
index c4cb6b5..0000000
--- a/node_modules/axobject-query/lib/etc/objects/DialogRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var DialogRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'dialog'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'dialog'
-    }
-  }],
-  type: 'window'
-};
-var _default = DialogRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/DirectoryRole.js b/node_modules/axobject-query/lib/etc/objects/DirectoryRole.js
deleted file mode 100755
index d4fa15c..0000000
--- a/node_modules/axobject-query/lib/etc/objects/DirectoryRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var DirectoryRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'directory'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'dir'
-    }
-  }],
-  type: 'structure'
-};
-var _default = DirectoryRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/DisclosureTriangleRole.js b/node_modules/axobject-query/lib/etc/objects/DisclosureTriangleRole.js
deleted file mode 100755
index 9330a64..0000000
--- a/node_modules/axobject-query/lib/etc/objects/DisclosureTriangleRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var DisclosureTriangleRole = {
-  relatedConcepts: [],
-  type: 'widget'
-};
-var _default = DisclosureTriangleRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/DivRole.js b/node_modules/axobject-query/lib/etc/objects/DivRole.js
deleted file mode 100755
index e28f056..0000000
--- a/node_modules/axobject-query/lib/etc/objects/DivRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var DivRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'div'
-    }
-  }],
-  type: 'generic'
-};
-var _default = DivRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/DocumentRole.js b/node_modules/axobject-query/lib/etc/objects/DocumentRole.js
deleted file mode 100755
index 0582dd7..0000000
--- a/node_modules/axobject-query/lib/etc/objects/DocumentRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var DocumentRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'document'
-    }
-  }],
-  type: 'structure'
-};
-var _default = DocumentRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/EmbeddedObjectRole.js b/node_modules/axobject-query/lib/etc/objects/EmbeddedObjectRole.js
deleted file mode 100755
index 80307dc..0000000
--- a/node_modules/axobject-query/lib/etc/objects/EmbeddedObjectRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var EmbeddedObjectRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'embed'
-    }
-  }],
-  type: 'widget'
-};
-var _default = EmbeddedObjectRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/FeedRole.js b/node_modules/axobject-query/lib/etc/objects/FeedRole.js
deleted file mode 100755
index 4a5bafc..0000000
--- a/node_modules/axobject-query/lib/etc/objects/FeedRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var FeedRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'feed'
-    }
-  }],
-  type: 'structure'
-};
-var _default = FeedRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/FigcaptionRole.js b/node_modules/axobject-query/lib/etc/objects/FigcaptionRole.js
deleted file mode 100755
index 6b31f2d..0000000
--- a/node_modules/axobject-query/lib/etc/objects/FigcaptionRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var FigcaptionRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'figcaption'
-    }
-  }],
-  type: 'structure'
-};
-var _default = FigcaptionRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/FigureRole.js b/node_modules/axobject-query/lib/etc/objects/FigureRole.js
deleted file mode 100755
index 9547b79..0000000
--- a/node_modules/axobject-query/lib/etc/objects/FigureRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var FigureRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'figure'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'figure'
-    }
-  }],
-  type: 'structure'
-};
-var _default = FigureRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/FooterRole.js b/node_modules/axobject-query/lib/etc/objects/FooterRole.js
deleted file mode 100755
index 346302e..0000000
--- a/node_modules/axobject-query/lib/etc/objects/FooterRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var FooterRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'footer'
-    }
-  }],
-  type: 'structure'
-};
-var _default = FooterRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/FormRole.js b/node_modules/axobject-query/lib/etc/objects/FormRole.js
deleted file mode 100755
index 882e46f..0000000
--- a/node_modules/axobject-query/lib/etc/objects/FormRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var FormRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'form'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'form'
-    }
-  }],
-  type: 'structure'
-};
-var _default = FormRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/GridRole.js b/node_modules/axobject-query/lib/etc/objects/GridRole.js
deleted file mode 100755
index e6d2290..0000000
--- a/node_modules/axobject-query/lib/etc/objects/GridRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var GridRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'grid'
-    }
-  }],
-  type: 'widget'
-};
-var _default = GridRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/GroupRole.js b/node_modules/axobject-query/lib/etc/objects/GroupRole.js
deleted file mode 100755
index 835da2d..0000000
--- a/node_modules/axobject-query/lib/etc/objects/GroupRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var GroupRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'group'
-    }
-  }],
-  type: 'structure'
-};
-var _default = GroupRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/HeadingRole.js b/node_modules/axobject-query/lib/etc/objects/HeadingRole.js
deleted file mode 100755
index ea304b8..0000000
--- a/node_modules/axobject-query/lib/etc/objects/HeadingRole.js
+++ /dev/null
@@ -1,47 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var HeadingRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'heading'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'h1'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'h2'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'h3'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'h4'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'h5'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'h6'
-    }
-  }],
-  type: 'structure'
-};
-var _default = HeadingRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/IframePresentationalRole.js b/node_modules/axobject-query/lib/etc/objects/IframePresentationalRole.js
deleted file mode 100755
index d1fcda1..0000000
--- a/node_modules/axobject-query/lib/etc/objects/IframePresentationalRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var IframePresentationalRole = {
-  relatedConcepts: [],
-  type: 'window'
-};
-var _default = IframePresentationalRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/IframeRole.js b/node_modules/axobject-query/lib/etc/objects/IframeRole.js
deleted file mode 100755
index ff123b0..0000000
--- a/node_modules/axobject-query/lib/etc/objects/IframeRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var IframeRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'iframe'
-    }
-  }],
-  type: 'window'
-};
-var _default = IframeRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/IgnoredRole.js b/node_modules/axobject-query/lib/etc/objects/IgnoredRole.js
deleted file mode 100755
index d708b05..0000000
--- a/node_modules/axobject-query/lib/etc/objects/IgnoredRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var IgnoredRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = IgnoredRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ImageMapLinkRole.js b/node_modules/axobject-query/lib/etc/objects/ImageMapLinkRole.js
deleted file mode 100755
index 8fcdf3b..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ImageMapLinkRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ImageMapLinkRole = {
-  relatedConcepts: [],
-  type: 'widget'
-};
-var _default = ImageMapLinkRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ImageMapRole.js b/node_modules/axobject-query/lib/etc/objects/ImageMapRole.js
deleted file mode 100755
index 1931c26..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ImageMapRole.js
+++ /dev/null
@@ -1,20 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ImageMapRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'img',
-      attributes: [{
-        name: 'usemap'
-      }]
-    }
-  }],
-  type: 'structure'
-};
-var _default = ImageMapRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ImageRole.js b/node_modules/axobject-query/lib/etc/objects/ImageRole.js
deleted file mode 100755
index 9c65f03..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ImageRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ImageRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'img'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'img'
-    }
-  }],
-  type: 'structure'
-};
-var _default = ImageRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/InlineTextBoxRole.js b/node_modules/axobject-query/lib/etc/objects/InlineTextBoxRole.js
deleted file mode 100755
index 2e1e1c2..0000000
--- a/node_modules/axobject-query/lib/etc/objects/InlineTextBoxRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var InlineTextBoxRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'input'
-    }
-  }],
-  type: 'widget'
-};
-var _default = InlineTextBoxRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/InputTimeRole.js b/node_modules/axobject-query/lib/etc/objects/InputTimeRole.js
deleted file mode 100755
index c37a8cd..0000000
--- a/node_modules/axobject-query/lib/etc/objects/InputTimeRole.js
+++ /dev/null
@@ -1,21 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var InputTimeRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'time'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = InputTimeRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/LabelRole.js b/node_modules/axobject-query/lib/etc/objects/LabelRole.js
deleted file mode 100755
index 606222a..0000000
--- a/node_modules/axobject-query/lib/etc/objects/LabelRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var LabelRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'label'
-    }
-  }],
-  type: 'structure'
-};
-var _default = LabelRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/LegendRole.js b/node_modules/axobject-query/lib/etc/objects/LegendRole.js
deleted file mode 100755
index 0418d5a..0000000
--- a/node_modules/axobject-query/lib/etc/objects/LegendRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var LegendRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'legend'
-    }
-  }],
-  type: 'structure'
-};
-var _default = LegendRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/LineBreakRole.js b/node_modules/axobject-query/lib/etc/objects/LineBreakRole.js
deleted file mode 100755
index c3e1e90..0000000
--- a/node_modules/axobject-query/lib/etc/objects/LineBreakRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var LineBreakRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'br'
-    }
-  }],
-  type: 'structure'
-};
-var _default = LineBreakRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/LinkRole.js b/node_modules/axobject-query/lib/etc/objects/LinkRole.js
deleted file mode 100755
index d6d0854..0000000
--- a/node_modules/axobject-query/lib/etc/objects/LinkRole.js
+++ /dev/null
@@ -1,25 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var LinkRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'link'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'a',
-      attributes: [{
-        name: 'href'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = LinkRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ListBoxOptionRole.js b/node_modules/axobject-query/lib/etc/objects/ListBoxOptionRole.js
deleted file mode 100755
index 6ae363f..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ListBoxOptionRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ListBoxOptionRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'option'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'option'
-    }
-  }],
-  type: 'widget'
-};
-var _default = ListBoxOptionRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ListBoxRole.js b/node_modules/axobject-query/lib/etc/objects/ListBoxRole.js
deleted file mode 100755
index eb20039..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ListBoxRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ListBoxRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'listbox'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'datalist'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'select'
-    }
-  }],
-  type: 'widget'
-};
-var _default = ListBoxRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ListItemRole.js b/node_modules/axobject-query/lib/etc/objects/ListItemRole.js
deleted file mode 100755
index 099092a..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ListItemRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ListItemRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'listitem'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'li'
-    }
-  }],
-  type: 'structure'
-};
-var _default = ListItemRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ListMarkerRole.js b/node_modules/axobject-query/lib/etc/objects/ListMarkerRole.js
deleted file mode 100755
index 28c9e43..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ListMarkerRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ListMarkerRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = ListMarkerRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ListRole.js b/node_modules/axobject-query/lib/etc/objects/ListRole.js
deleted file mode 100755
index 9eea300..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ListRole.js
+++ /dev/null
@@ -1,27 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ListRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'list'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'ul'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'ol'
-    }
-  }],
-  type: 'structure'
-};
-var _default = ListRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/LogRole.js b/node_modules/axobject-query/lib/etc/objects/LogRole.js
deleted file mode 100755
index e193e4f..0000000
--- a/node_modules/axobject-query/lib/etc/objects/LogRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var LogRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'log'
-    }
-  }],
-  type: 'structure'
-};
-var _default = LogRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MainRole.js b/node_modules/axobject-query/lib/etc/objects/MainRole.js
deleted file mode 100755
index 2de7bfd..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MainRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MainRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'main'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'main'
-    }
-  }],
-  type: 'structure'
-};
-var _default = MainRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MarkRole.js b/node_modules/axobject-query/lib/etc/objects/MarkRole.js
deleted file mode 100755
index 86b2871..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MarkRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MarkRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'mark'
-    }
-  }],
-  type: 'structure'
-};
-var _default = MarkRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MarqueeRole.js b/node_modules/axobject-query/lib/etc/objects/MarqueeRole.js
deleted file mode 100755
index 6c820f5..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MarqueeRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MarqueeRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'marquee'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'marquee'
-    }
-  }],
-  type: 'structure'
-};
-var _default = MarqueeRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MathRole.js b/node_modules/axobject-query/lib/etc/objects/MathRole.js
deleted file mode 100755
index 7438d63..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MathRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MathRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'math'
-    }
-  }],
-  type: 'structure'
-};
-var _default = MathRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MenuBarRole.js b/node_modules/axobject-query/lib/etc/objects/MenuBarRole.js
deleted file mode 100755
index d3e630f..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MenuBarRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MenuBarRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'menubar'
-    }
-  }],
-  type: 'structure'
-};
-var _default = MenuBarRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MenuButtonRole.js b/node_modules/axobject-query/lib/etc/objects/MenuButtonRole.js
deleted file mode 100755
index c05ebff..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MenuButtonRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MenuButtonRole = {
-  relatedConcepts: [],
-  type: 'widget'
-};
-var _default = MenuButtonRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MenuItemCheckBoxRole.js b/node_modules/axobject-query/lib/etc/objects/MenuItemCheckBoxRole.js
deleted file mode 100755
index 4cead35..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MenuItemCheckBoxRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MenuItemCheckBoxRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'menuitemcheckbox'
-    }
-  }],
-  type: 'widget'
-};
-var _default = MenuItemCheckBoxRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MenuItemRadioRole.js b/node_modules/axobject-query/lib/etc/objects/MenuItemRadioRole.js
deleted file mode 100755
index b096abb..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MenuItemRadioRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MenuItemRadioRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'menuitemradio'
-    }
-  }],
-  type: 'widget'
-};
-var _default = MenuItemRadioRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MenuItemRole.js b/node_modules/axobject-query/lib/etc/objects/MenuItemRole.js
deleted file mode 100755
index 9df46cd..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MenuItemRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MenuItemRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'menuitem'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'menuitem'
-    }
-  }],
-  type: 'widget'
-};
-var _default = MenuItemRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MenuListOptionRole.js b/node_modules/axobject-query/lib/etc/objects/MenuListOptionRole.js
deleted file mode 100755
index 56d2822..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MenuListOptionRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MenuListOptionRole = {
-  relatedConcepts: [],
-  type: 'widget'
-};
-var _default = MenuListOptionRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MenuListPopupRole.js b/node_modules/axobject-query/lib/etc/objects/MenuListPopupRole.js
deleted file mode 100755
index 5dca3d5..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MenuListPopupRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MenuListPopupRole = {
-  relatedConcepts: [],
-  type: 'widget'
-};
-var _default = MenuListPopupRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MenuRole.js b/node_modules/axobject-query/lib/etc/objects/MenuRole.js
deleted file mode 100755
index 375afc9..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MenuRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MenuRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'menu'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'menu'
-    }
-  }],
-  type: 'structure'
-};
-var _default = MenuRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/MeterRole.js b/node_modules/axobject-query/lib/etc/objects/MeterRole.js
deleted file mode 100755
index a35c309..0000000
--- a/node_modules/axobject-query/lib/etc/objects/MeterRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var MeterRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'meter'
-    }
-  }],
-  type: 'structure'
-};
-var _default = MeterRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/NavigationRole.js b/node_modules/axobject-query/lib/etc/objects/NavigationRole.js
deleted file mode 100755
index 38fb0fa..0000000
--- a/node_modules/axobject-query/lib/etc/objects/NavigationRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var NavigationRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'navigation'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'nav'
-    }
-  }],
-  type: 'structure'
-};
-var _default = NavigationRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/NoneRole.js b/node_modules/axobject-query/lib/etc/objects/NoneRole.js
deleted file mode 100755
index 5ed1fbe..0000000
--- a/node_modules/axobject-query/lib/etc/objects/NoneRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var NoneRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'none'
-    }
-  }],
-  type: 'structure'
-};
-var _default = NoneRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/NoteRole.js b/node_modules/axobject-query/lib/etc/objects/NoteRole.js
deleted file mode 100755
index 2fca958..0000000
--- a/node_modules/axobject-query/lib/etc/objects/NoteRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var NoteRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'note'
-    }
-  }],
-  type: 'structure'
-};
-var _default = NoteRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/OutlineRole.js b/node_modules/axobject-query/lib/etc/objects/OutlineRole.js
deleted file mode 100755
index babaec0..0000000
--- a/node_modules/axobject-query/lib/etc/objects/OutlineRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var OutlineRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = OutlineRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ParagraphRole.js b/node_modules/axobject-query/lib/etc/objects/ParagraphRole.js
deleted file mode 100755
index a95f310..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ParagraphRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ParagraphRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'p'
-    }
-  }],
-  type: 'structure'
-};
-var _default = ParagraphRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/PopUpButtonRole.js b/node_modules/axobject-query/lib/etc/objects/PopUpButtonRole.js
deleted file mode 100755
index 37671fb..0000000
--- a/node_modules/axobject-query/lib/etc/objects/PopUpButtonRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var PopUpButtonRole = {
-  relatedConcepts: [],
-  type: 'widget'
-};
-var _default = PopUpButtonRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/PreRole.js b/node_modules/axobject-query/lib/etc/objects/PreRole.js
deleted file mode 100755
index 5a357e1..0000000
--- a/node_modules/axobject-query/lib/etc/objects/PreRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var PreRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'pre'
-    }
-  }],
-  type: 'structure'
-};
-var _default = PreRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/PresentationalRole.js b/node_modules/axobject-query/lib/etc/objects/PresentationalRole.js
deleted file mode 100755
index 8dff20a..0000000
--- a/node_modules/axobject-query/lib/etc/objects/PresentationalRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var PresentationalRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'presentation'
-    }
-  }],
-  type: 'structure'
-};
-var _default = PresentationalRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ProgressIndicatorRole.js b/node_modules/axobject-query/lib/etc/objects/ProgressIndicatorRole.js
deleted file mode 100755
index 0456f0d..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ProgressIndicatorRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ProgressIndicatorRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'progressbar'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'progress'
-    }
-  }],
-  type: 'structure'
-};
-var _default = ProgressIndicatorRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/RadioButtonRole.js b/node_modules/axobject-query/lib/etc/objects/RadioButtonRole.js
deleted file mode 100755
index b87fc95..0000000
--- a/node_modules/axobject-query/lib/etc/objects/RadioButtonRole.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var RadioButtonRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'radio'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'radio'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = RadioButtonRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/RadioGroupRole.js b/node_modules/axobject-query/lib/etc/objects/RadioGroupRole.js
deleted file mode 100755
index 3906013..0000000
--- a/node_modules/axobject-query/lib/etc/objects/RadioGroupRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var RadioGroupRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'radiogroup'
-    }
-  }],
-  type: 'structure'
-};
-var _default = RadioGroupRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/RegionRole.js b/node_modules/axobject-query/lib/etc/objects/RegionRole.js
deleted file mode 100755
index 320bae7..0000000
--- a/node_modules/axobject-query/lib/etc/objects/RegionRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var RegionRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'region'
-    }
-  }],
-  type: 'structure'
-};
-var _default = RegionRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/RootWebAreaRole.js b/node_modules/axobject-query/lib/etc/objects/RootWebAreaRole.js
deleted file mode 100755
index d64a8a0..0000000
--- a/node_modules/axobject-query/lib/etc/objects/RootWebAreaRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var RootWebAreaRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = RootWebAreaRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/RowHeaderRole.js b/node_modules/axobject-query/lib/etc/objects/RowHeaderRole.js
deleted file mode 100755
index 347cf14..0000000
--- a/node_modules/axobject-query/lib/etc/objects/RowHeaderRole.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var RowHeaderRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'rowheader'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'th',
-      attributes: [{
-        name: 'scope',
-        value: 'row'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = RowHeaderRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/RowRole.js b/node_modules/axobject-query/lib/etc/objects/RowRole.js
deleted file mode 100755
index d3a3e38..0000000
--- a/node_modules/axobject-query/lib/etc/objects/RowRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var RowRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'row'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'tr'
-    }
-  }],
-  type: 'structure'
-};
-var _default = RowRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/RubyRole.js b/node_modules/axobject-query/lib/etc/objects/RubyRole.js
deleted file mode 100755
index e37140e..0000000
--- a/node_modules/axobject-query/lib/etc/objects/RubyRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var RubyRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'ruby'
-    }
-  }],
-  type: 'structure'
-};
-var _default = RubyRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/RulerRole.js b/node_modules/axobject-query/lib/etc/objects/RulerRole.js
deleted file mode 100755
index d194003..0000000
--- a/node_modules/axobject-query/lib/etc/objects/RulerRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var RulerRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = RulerRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/SVGRootRole.js b/node_modules/axobject-query/lib/etc/objects/SVGRootRole.js
deleted file mode 100755
index b948df9..0000000
--- a/node_modules/axobject-query/lib/etc/objects/SVGRootRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var SVGRootRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = SVGRootRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ScrollAreaRole.js b/node_modules/axobject-query/lib/etc/objects/ScrollAreaRole.js
deleted file mode 100755
index 4cc0b19..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ScrollAreaRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ScrollAreaRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = ScrollAreaRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ScrollBarRole.js b/node_modules/axobject-query/lib/etc/objects/ScrollBarRole.js
deleted file mode 100755
index 6858bbe..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ScrollBarRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ScrollBarRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'scrollbar'
-    }
-  }],
-  type: 'widget'
-};
-var _default = ScrollBarRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/SeamlessWebAreaRole.js b/node_modules/axobject-query/lib/etc/objects/SeamlessWebAreaRole.js
deleted file mode 100755
index 371df8f..0000000
--- a/node_modules/axobject-query/lib/etc/objects/SeamlessWebAreaRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var SeamlessWebAreaRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = SeamlessWebAreaRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/SearchBoxRole.js b/node_modules/axobject-query/lib/etc/objects/SearchBoxRole.js
deleted file mode 100755
index 8c3e0fb..0000000
--- a/node_modules/axobject-query/lib/etc/objects/SearchBoxRole.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var SearchBoxRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'searchbox'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'search'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = SearchBoxRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/SearchRole.js b/node_modules/axobject-query/lib/etc/objects/SearchRole.js
deleted file mode 100755
index 1e8588c..0000000
--- a/node_modules/axobject-query/lib/etc/objects/SearchRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var SearchRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'search'
-    }
-  }],
-  type: 'structure'
-};
-var _default = SearchRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/SliderRole.js b/node_modules/axobject-query/lib/etc/objects/SliderRole.js
deleted file mode 100755
index c2be522..0000000
--- a/node_modules/axobject-query/lib/etc/objects/SliderRole.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var SliderRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'slider'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'range'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = SliderRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/SliderThumbRole.js b/node_modules/axobject-query/lib/etc/objects/SliderThumbRole.js
deleted file mode 100755
index a123280..0000000
--- a/node_modules/axobject-query/lib/etc/objects/SliderThumbRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var SliderThumbRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = SliderThumbRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/SpinButtonPartRole.js b/node_modules/axobject-query/lib/etc/objects/SpinButtonPartRole.js
deleted file mode 100755
index 845d3b5..0000000
--- a/node_modules/axobject-query/lib/etc/objects/SpinButtonPartRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var SpinButtonPartRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = SpinButtonPartRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/SpinButtonRole.js b/node_modules/axobject-query/lib/etc/objects/SpinButtonRole.js
deleted file mode 100755
index 377d4ea..0000000
--- a/node_modules/axobject-query/lib/etc/objects/SpinButtonRole.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var SpinButtonRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'spinbutton'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'number'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = SpinButtonRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/SplitterRole.js b/node_modules/axobject-query/lib/etc/objects/SplitterRole.js
deleted file mode 100755
index c61764a..0000000
--- a/node_modules/axobject-query/lib/etc/objects/SplitterRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var SplitterRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'separator'
-    }
-  }],
-  type: 'widget'
-};
-var _default = SplitterRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/StaticTextRole.js b/node_modules/axobject-query/lib/etc/objects/StaticTextRole.js
deleted file mode 100755
index 1444d6f..0000000
--- a/node_modules/axobject-query/lib/etc/objects/StaticTextRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var StaticTextRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = StaticTextRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/StatusRole.js b/node_modules/axobject-query/lib/etc/objects/StatusRole.js
deleted file mode 100755
index 2d097b2..0000000
--- a/node_modules/axobject-query/lib/etc/objects/StatusRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var StatusRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'status'
-    }
-  }],
-  type: 'structure'
-};
-var _default = StatusRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/SwitchRole.js b/node_modules/axobject-query/lib/etc/objects/SwitchRole.js
deleted file mode 100755
index 6a30a36..0000000
--- a/node_modules/axobject-query/lib/etc/objects/SwitchRole.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var SwitchRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'switch'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'checkbox'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = SwitchRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TabGroupRole.js b/node_modules/axobject-query/lib/etc/objects/TabGroupRole.js
deleted file mode 100755
index fe5c1d7..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TabGroupRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TabGroupRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'tablist'
-    }
-  }],
-  type: 'structure'
-};
-var _default = TabGroupRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TabListRole.js b/node_modules/axobject-query/lib/etc/objects/TabListRole.js
deleted file mode 100755
index 9328335..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TabListRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TabListRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'tablist'
-    }
-  }],
-  type: 'structure'
-};
-var _default = TabListRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TabPanelRole.js b/node_modules/axobject-query/lib/etc/objects/TabPanelRole.js
deleted file mode 100755
index 94dffbe..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TabPanelRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TabPanelRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'tabpanel'
-    }
-  }],
-  type: 'structure'
-};
-var _default = TabPanelRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TabRole.js b/node_modules/axobject-query/lib/etc/objects/TabRole.js
deleted file mode 100755
index 5ed110c..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TabRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TabRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'tab'
-    }
-  }],
-  type: 'widget'
-};
-var _default = TabRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TableHeaderContainerRole.js b/node_modules/axobject-query/lib/etc/objects/TableHeaderContainerRole.js
deleted file mode 100755
index 9f07fb0..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TableHeaderContainerRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TableHeaderContainerRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = TableHeaderContainerRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TableRole.js b/node_modules/axobject-query/lib/etc/objects/TableRole.js
deleted file mode 100755
index e2f45f0..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TableRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TableRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'table'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'table'
-    }
-  }],
-  type: 'structure'
-};
-var _default = TableRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TermRole.js b/node_modules/axobject-query/lib/etc/objects/TermRole.js
deleted file mode 100755
index 71c23c1..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TermRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TermRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'term'
-    }
-  }],
-  type: 'structure'
-};
-var _default = TermRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TextFieldRole.js b/node_modules/axobject-query/lib/etc/objects/TextFieldRole.js
deleted file mode 100755
index d61c3fa..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TextFieldRole.js
+++ /dev/null
@@ -1,31 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TextFieldRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'textbox'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'input'
-    }
-  }, {
-    module: 'HTML',
-    concept: {
-      name: 'input',
-      attributes: [{
-        name: 'type',
-        value: 'text'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = TextFieldRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TimeRole.js b/node_modules/axobject-query/lib/etc/objects/TimeRole.js
deleted file mode 100755
index 03ffecb..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TimeRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TimeRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'time'
-    }
-  }],
-  type: 'structure'
-};
-var _default = TimeRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TimerRole.js b/node_modules/axobject-query/lib/etc/objects/TimerRole.js
deleted file mode 100755
index 70eb2e6..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TimerRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TimerRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'timer'
-    }
-  }],
-  type: 'structure'
-};
-var _default = TimerRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ToggleButtonRole.js b/node_modules/axobject-query/lib/etc/objects/ToggleButtonRole.js
deleted file mode 100755
index 53233e8..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ToggleButtonRole.js
+++ /dev/null
@@ -1,19 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ToggleButtonRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      attributes: [{
-        name: 'aria-pressed'
-      }]
-    }
-  }],
-  type: 'widget'
-};
-var _default = ToggleButtonRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/ToolbarRole.js b/node_modules/axobject-query/lib/etc/objects/ToolbarRole.js
deleted file mode 100755
index f2efea5..0000000
--- a/node_modules/axobject-query/lib/etc/objects/ToolbarRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var ToolbarRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'toolbar'
-    }
-  }],
-  type: 'structure'
-};
-var _default = ToolbarRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TreeGridRole.js b/node_modules/axobject-query/lib/etc/objects/TreeGridRole.js
deleted file mode 100755
index f2813d2..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TreeGridRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TreeGridRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'treegrid'
-    }
-  }],
-  type: 'widget'
-};
-var _default = TreeGridRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TreeItemRole.js b/node_modules/axobject-query/lib/etc/objects/TreeItemRole.js
deleted file mode 100755
index 78d8c3c..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TreeItemRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TreeItemRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'treeitem'
-    }
-  }],
-  type: 'widget'
-};
-var _default = TreeItemRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/TreeRole.js b/node_modules/axobject-query/lib/etc/objects/TreeRole.js
deleted file mode 100755
index f016d25..0000000
--- a/node_modules/axobject-query/lib/etc/objects/TreeRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var TreeRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'tree'
-    }
-  }],
-  type: 'widget'
-};
-var _default = TreeRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/UserInterfaceTooltipRole.js b/node_modules/axobject-query/lib/etc/objects/UserInterfaceTooltipRole.js
deleted file mode 100755
index 5bf9cad..0000000
--- a/node_modules/axobject-query/lib/etc/objects/UserInterfaceTooltipRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var UserInterfaceTooltipRole = {
-  relatedConcepts: [{
-    module: 'ARIA',
-    concept: {
-      name: 'tooltip'
-    }
-  }],
-  type: 'structure'
-};
-var _default = UserInterfaceTooltipRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/VideoRole.js b/node_modules/axobject-query/lib/etc/objects/VideoRole.js
deleted file mode 100755
index 56630e0..0000000
--- a/node_modules/axobject-query/lib/etc/objects/VideoRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var VideoRole = {
-  relatedConcepts: [{
-    module: 'HTML',
-    concept: {
-      name: 'video'
-    }
-  }],
-  type: 'widget'
-};
-var _default = VideoRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/WebAreaRole.js b/node_modules/axobject-query/lib/etc/objects/WebAreaRole.js
deleted file mode 100755
index fd1059f..0000000
--- a/node_modules/axobject-query/lib/etc/objects/WebAreaRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var WebAreaRole = {
-  relatedConcepts: [],
-  type: 'structure'
-};
-var _default = WebAreaRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/etc/objects/WindowRole.js b/node_modules/axobject-query/lib/etc/objects/WindowRole.js
deleted file mode 100755
index e30d1de..0000000
--- a/node_modules/axobject-query/lib/etc/objects/WindowRole.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-var WindowRole = {
-  relatedConcepts: [],
-  type: 'window'
-};
-var _default = WindowRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/axobject-query/lib/index.js b/node_modules/axobject-query/lib/index.js
deleted file mode 100755
index 14318e5..0000000
--- a/node_modules/axobject-query/lib/index.js
+++ /dev/null
@@ -1,25 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.elementAXObjects = exports.AXObjects = exports.AXObjectRoles = exports.AXObjectElements = void 0;
-
-var _AXObjectElementMap = _interopRequireDefault(require("./AXObjectElementMap"));
-
-var _AXObjectRoleMap = _interopRequireDefault(require("./AXObjectRoleMap"));
-
-var _AXObjectsMap = _interopRequireDefault(require("./AXObjectsMap"));
-
-var _elementAXObjectMap = _interopRequireDefault(require("./elementAXObjectMap"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-var AXObjectElements = _AXObjectElementMap["default"];
-exports.AXObjectElements = AXObjectElements;
-var AXObjectRoles = _AXObjectRoleMap["default"];
-exports.AXObjectRoles = AXObjectRoles;
-var AXObjects = _AXObjectsMap["default"];
-exports.AXObjects = AXObjects;
-var elementAXObjects = _elementAXObjectMap["default"];
-exports.elementAXObjects = elementAXObjects;
\ No newline at end of file
diff --git a/node_modules/axobject-query/package.json b/node_modules/axobject-query/package.json
deleted file mode 100755
index 2e0200d..0000000
--- a/node_modules/axobject-query/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "name": "axobject-query",
-  "version": "2.1.2",
-  "description": "Programmatic access to information about the AXObject Model",
-  "main": "lib/index.js",
-  "files": [
-    "lib"
-  ],
-  "scripts": {
-    "build": "rimraf lib && babel src --out-dir lib",
-    "prepare": "npm run lint && npm run flow && npm run test && npm run build",
-    "coveralls": "cat ./reports/lcov.info | coveralls",
-    "flow": "flow; test $? -eq 0 -o $? -eq 2",
-    "lint": "eslint  --config .eslintrc src __tests__",
-    "lint:fix": "npm run lint -- --fix",
-    "pretest": "npm run lint:fix && npm run flow",
-    "test": "npm run jest",
-    "test:ci": "npm run jest -- --ci --runInBand",
-    "jest": "jest --coverage __tests__/**/*"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/A11yance/axobject-query.git"
-  },
-  "keywords": [
-    "accessibility"
-  ],
-  "author": "Jesse Beach <splendidnoise@gmail.com>",
-  "license": "Apache-2.0",
-  "bugs": {
-    "url": "https://github.com/A11yance/axobject-query/issues"
-  },
-  "homepage": "https://github.com/A11yance/axobject-query#readme",
-  "devDependencies": {
-    "@babel/cli": "^7.6.4",
-    "@babel/core": "^7.6.4",
-    "@babel/preset-env": "^7.6.3",
-    "@babel/preset-flow": "^7.7.4",
-    "babel-eslint": "^10.0.1",
-    "babel-jest": "^24.0.0",
-    "coveralls": "^2.12.0",
-    "eslint": "^5 || ^6",
-    "eslint-config-airbnb-base": "^13.0.0",
-    "eslint-plugin-flowtype": "^3.5.0",
-    "eslint-plugin-import": "^2.18.0",
-    "expect": "^1.20.2",
-    "flow-bin": "^0.112.0",
-    "jest": "^24.9.0",
-    "rimraf": "^2.6.3"
-  },
-  "dependencies": {},
-  "jest": {
-    "coverageReporters": [
-      "lcov"
-    ],
-    "coverageDirectory": "reports",
-    "roots": [
-      "<rootDir>/__tests__"
-    ]
-  }
-}
diff --git a/node_modules/babel-eslint/LICENSE b/node_modules/babel-eslint/LICENSE
deleted file mode 100644
index 80194a8..0000000
--- a/node_modules/babel-eslint/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2014-2016 Sebastian McKenzie <sebmck@gmail.com>
-
-MIT License
-
-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/node_modules/babel-eslint/README.md b/node_modules/babel-eslint/README.md
deleted file mode 100644
index 6a4f908..0000000
--- a/node_modules/babel-eslint/README.md
+++ /dev/null
@@ -1,103 +0,0 @@
-# babel-eslint [![npm](https://img.shields.io/npm/v/babel-eslint.svg)](https://www.npmjs.com/package/babel-eslint) [![travis](https://img.shields.io/travis/babel/babel-eslint/master.svg)](https://travis-ci.org/babel/babel-eslint) [![npm-downloads](https://img.shields.io/npm/dm/babel-eslint.svg)](https://www.npmjs.com/package/babel-eslint)
-
-**babel-eslint** allows you to lint **ALL** valid Babel code with the fantastic
-[ESLint](https://github.com/eslint/eslint).
-
-### Why Use babel-eslint
-
-You only need to use babel-eslint if you are using types (Flow) or experimental features not supported in ESLint itself yet. Otherwise try the default parser (you don't have to use it just because you are using Babel).
-
----
-
-> If there is an issue, first check if it can be reproduced with the regular parser or with the latest versions of `eslint` and `babel-eslint`!
-
-For questions and support please visit the [`#discussion`](https://babeljs.slack.com/messages/discussion/) babel slack channel (sign up [here](https://github.com/babel/notes/issues/38)) or eslint [gitter](https://gitter.im/eslint/eslint)!
-
-> Note that the `ecmaFeatures` config property may still be required for ESLint to work properly with features not in ECMAScript 5 by default. Examples are `globalReturn` and `modules`).
-
-## Known Issues
-
-Flow:
-> Check out [eslint-plugin-flowtype](https://github.com/gajus/eslint-plugin-flowtype): An `eslint` plugin that makes flow type annotations global variables and marks declarations as used. Solves the problem of false positives with `no-undef` and `no-unused-vars`.
-- `no-undef` for global flow types: `ReactElement`, `ReactClass` [#130](https://github.com/babel/babel-eslint/issues/130#issuecomment-111215076)
-  - Workaround: define types as globals in `.eslintrc` or define types and import them `import type ReactElement from './types'`
-- `no-unused-vars/no-undef` with Flow declarations (`declare module A {}`) [#132](https://github.com/babel/babel-eslint/issues/132#issuecomment-112815926)
-
-Modules/strict mode
-- `no-unused-vars: [2, {vars: local}]` [#136](https://github.com/babel/babel-eslint/issues/136)
-
-Please check out [eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react) for React/JSX issues
-- `no-unused-vars` with jsx
-
-Please check out [eslint-plugin-babel](https://github.com/babel/eslint-plugin-babel) for other issues
-
-## How does it work?
-
-ESLint allows custom parsers. This is great but some of the syntax nodes that Babel supports
-aren't supported by ESLint. When using this plugin, ESLint is monkeypatched and your code is
-transformed into code that ESLint can understand. All location info such as line numbers,
-columns is also retained so you can track down errors with ease.
-
-Basically `babel-eslint` exports an [`index.js`](/index.js) that a linter can use.
-It just needs to export a `parse` method that takes in a string of code and outputs an AST.
-
-## Usage
-
-### Supported ESLint versions
-
-ESLint | babel-eslint
------------- | -------------
-4.x | >= 6.x
-3.x | >= 6.x
-2.x | >= 6.x
-1.x | >= 5.x
-
-### Install
-
-Ensure that you have substituted the correct version lock for `eslint` and `babel-eslint` into this command:
-
-```sh
-$ npm install eslint@4.x babel-eslint@8 --save-dev
-# or
-$ yarn add eslint@4.x babel-eslint@8 -D
-```
-
-### Setup
-
-**.eslintrc**
-
-```json
-{
-  "parser": "babel-eslint",
-  "rules": {
-    "strict": 0
-  }
-}
-```
-
-Check out the [ESLint docs](http://eslint.org/docs/rules/) for all possible rules.
-
-### Configuration
-
-- `sourceType` can be set to `'module'`(default) or `'script'` if your code isn't using ECMAScript modules.
-- `allowImportExportEverywhere` (default `false`) can be set to `true` to allow import and export declarations to appear anywhere a statement is allowed if your build environment supports that. Otherwise import and export declarations can only appear at a program's top level.
-- `codeFrame` (default `true`) can be set to `false` to disable the code frame in the reporter. This is useful since some eslint formatters don't play well with it.
-
-**.eslintrc**
-
-```json
-{
-  "parser": "babel-eslint",
-  "parserOptions": {
-    "sourceType": "module",
-    "allowImportExportEverywhere": false,
-    "codeFrame": true
-  }
-}
-```
-
-### Run
-
-```sh
-$ eslint your-files-here
-```
diff --git a/node_modules/babel-eslint/lib/analyze-scope.js b/node_modules/babel-eslint/lib/analyze-scope.js
deleted file mode 100644
index 80bdff0..0000000
--- a/node_modules/babel-eslint/lib/analyze-scope.js
+++ /dev/null
@@ -1,346 +0,0 @@
-"use strict";
-
-const t = require("@babel/types");
-const requireFromESLint = require("./require-from-eslint");
-
-const escope = requireFromESLint("eslint-scope");
-const Definition = requireFromESLint("eslint-scope/lib/definition").Definition;
-const OriginalPatternVisitor = requireFromESLint(
-  "eslint-scope/lib/pattern-visitor"
-);
-const OriginalReferencer = requireFromESLint("eslint-scope/lib/referencer");
-const fallback = require("eslint-visitor-keys").getKeys;
-const childVisitorKeys = require("./visitor-keys");
-
-const flowFlippedAliasKeys = t.FLIPPED_ALIAS_KEYS.Flow.concat([
-  "ArrayPattern",
-  "ClassDeclaration",
-  "ClassExpression",
-  "FunctionDeclaration",
-  "FunctionExpression",
-  "Identifier",
-  "ObjectPattern",
-  "RestElement",
-]);
-const visitorKeysMap = Object.keys(t.VISITOR_KEYS).reduce(function(acc, key) {
-  const value = t.VISITOR_KEYS[key];
-  if (flowFlippedAliasKeys.indexOf(value) === -1) {
-    acc[key] = value;
-  }
-  return acc;
-}, {});
-
-const propertyTypes = {
-  // loops
-  callProperties: { type: "loop", values: ["value"] },
-  indexers: { type: "loop", values: ["key", "value"] },
-  properties: { type: "loop", values: ["argument", "value"] },
-  types: { type: "loop" },
-  params: { type: "loop" },
-  // single property
-  argument: { type: "single" },
-  elementType: { type: "single" },
-  qualification: { type: "single" },
-  rest: { type: "single" },
-  returnType: { type: "single" },
-  // others
-  typeAnnotation: { type: "typeAnnotation" },
-  typeParameters: { type: "typeParameters" },
-  id: { type: "id" },
-};
-
-class PatternVisitor extends OriginalPatternVisitor {
-  ArrayPattern(node) {
-    node.elements.forEach(this.visit, this);
-  }
-
-  ObjectPattern(node) {
-    node.properties.forEach(this.visit, this);
-  }
-}
-
-class Referencer extends OriginalReferencer {
-  // inherits.
-  visitPattern(node, options, callback) {
-    if (!node) {
-      return;
-    }
-
-    // Visit type annotations.
-    this._checkIdentifierOrVisit(node.typeAnnotation);
-    if (t.isAssignmentPattern(node)) {
-      this._checkIdentifierOrVisit(node.left.typeAnnotation);
-    }
-
-    // Overwrite `super.visitPattern(node, options, callback)` in order to not visit `ArrayPattern#typeAnnotation` and `ObjectPattern#typeAnnotation`.
-    if (typeof options === "function") {
-      callback = options;
-      options = { processRightHandNodes: false };
-    }
-
-    const visitor = new PatternVisitor(this.options, node, callback);
-    visitor.visit(node);
-
-    // Process the right hand nodes recursively.
-    if (options.processRightHandNodes) {
-      visitor.rightHandNodes.forEach(this.visit, this);
-    }
-  }
-
-  // inherits.
-  visitClass(node) {
-    // Decorators.
-    this._visitArray(node.decorators);
-
-    // Flow type parameters.
-    const typeParamScope = this._nestTypeParamScope(node);
-
-    // Flow super types.
-    this._visitTypeAnnotation(node.implements);
-    this._visitTypeAnnotation(
-      node.superTypeParameters && node.superTypeParameters.params
-    );
-
-    // Basic.
-    super.visitClass(node);
-
-    // Close the type parameter scope.
-    if (typeParamScope) {
-      this.close(node);
-    }
-  }
-
-  // inherits.
-  visitFunction(node) {
-    const typeParamScope = this._nestTypeParamScope(node);
-
-    // Flow return types.
-    this._checkIdentifierOrVisit(node.returnType);
-
-    // Basic.
-    super.visitFunction(node);
-
-    // Close the type parameter scope.
-    if (typeParamScope) {
-      this.close(node);
-    }
-  }
-
-  // inherits.
-  visitProperty(node) {
-    if (node.value && node.value.type === "TypeCastExpression") {
-      this._visitTypeAnnotation(node.value);
-    }
-    this._visitArray(node.decorators);
-    super.visitProperty(node);
-  }
-
-  InterfaceDeclaration(node) {
-    this._createScopeVariable(node, node.id);
-
-    const typeParamScope = this._nestTypeParamScope(node);
-
-    // TODO: Handle mixins
-    this._visitArray(node.extends);
-    this.visit(node.body);
-
-    if (typeParamScope) {
-      this.close(node);
-    }
-  }
-
-  EnumDeclaration(node) {
-    this._createScopeVariable(node, node.id);
-  }
-
-  TypeAlias(node) {
-    this._createScopeVariable(node, node.id);
-
-    const typeParamScope = this._nestTypeParamScope(node);
-
-    this.visit(node.right);
-
-    if (typeParamScope) {
-      this.close(node);
-    }
-  }
-
-  ClassProperty(node) {
-    this._visitClassProperty(node);
-  }
-
-  ClassPrivateProperty(node) {
-    this._visitClassProperty(node);
-  }
-
-  DeclareModule(node) {
-    this._visitDeclareX(node);
-  }
-
-  DeclareFunction(node) {
-    this._visitDeclareX(node);
-  }
-
-  DeclareVariable(node) {
-    this._visitDeclareX(node);
-  }
-
-  DeclareClass(node) {
-    this._visitDeclareX(node);
-  }
-
-  // visit OptionalMemberExpression as a MemberExpression.
-  OptionalMemberExpression(node) {
-    super.MemberExpression(node);
-  }
-
-  _visitClassProperty(node) {
-    this._visitTypeAnnotation(node.typeAnnotation);
-    this.visitProperty(node);
-  }
-
-  _visitDeclareX(node) {
-    if (node.id) {
-      this._createScopeVariable(node, node.id);
-    }
-
-    const typeParamScope = this._nestTypeParamScope(node);
-    if (typeParamScope) {
-      this.close(node);
-    }
-  }
-
-  _createScopeVariable(node, name) {
-    this.currentScope().variableScope.__define(
-      name,
-      new Definition("Variable", name, node, null, null, null)
-    );
-  }
-
-  _nestTypeParamScope(node) {
-    if (!node.typeParameters) {
-      return null;
-    }
-
-    const parentScope = this.scopeManager.__currentScope;
-    const scope = new escope.Scope(
-      this.scopeManager,
-      "type-parameters",
-      parentScope,
-      node,
-      false
-    );
-
-    this.scopeManager.__nestScope(scope);
-    for (let j = 0; j < node.typeParameters.params.length; j++) {
-      const name = node.typeParameters.params[j];
-      scope.__define(name, new Definition("TypeParameter", name, name));
-      if (name.typeAnnotation) {
-        this._checkIdentifierOrVisit(name);
-      }
-    }
-    scope.__define = function() {
-      return parentScope.__define.apply(parentScope, arguments);
-    };
-
-    return scope;
-  }
-
-  _visitTypeAnnotation(node) {
-    if (!node) {
-      return;
-    }
-    if (Array.isArray(node)) {
-      node.forEach(this._visitTypeAnnotation, this);
-      return;
-    }
-
-    // get property to check (params, id, etc...)
-    const visitorValues = visitorKeysMap[node.type];
-    if (!visitorValues) {
-      return;
-    }
-
-    // can have multiple properties
-    for (let i = 0; i < visitorValues.length; i++) {
-      const visitorValue = visitorValues[i];
-      const propertyType = propertyTypes[visitorValue];
-      const nodeProperty = node[visitorValue];
-      // check if property or type is defined
-      if (propertyType == null || nodeProperty == null) {
-        continue;
-      }
-      if (propertyType.type === "loop") {
-        for (let j = 0; j < nodeProperty.length; j++) {
-          if (Array.isArray(propertyType.values)) {
-            for (let k = 0; k < propertyType.values.length; k++) {
-              const loopPropertyNode = nodeProperty[j][propertyType.values[k]];
-              if (loopPropertyNode) {
-                this._checkIdentifierOrVisit(loopPropertyNode);
-              }
-            }
-          } else {
-            this._checkIdentifierOrVisit(nodeProperty[j]);
-          }
-        }
-      } else if (propertyType.type === "single") {
-        this._checkIdentifierOrVisit(nodeProperty);
-      } else if (propertyType.type === "typeAnnotation") {
-        this._visitTypeAnnotation(node.typeAnnotation);
-      } else if (propertyType.type === "typeParameters") {
-        for (let l = 0; l < node.typeParameters.params.length; l++) {
-          this._checkIdentifierOrVisit(node.typeParameters.params[l]);
-        }
-      } else if (propertyType.type === "id") {
-        if (node.id.type === "Identifier") {
-          this._checkIdentifierOrVisit(node.id);
-        } else {
-          this._visitTypeAnnotation(node.id);
-        }
-      }
-    }
-  }
-
-  _checkIdentifierOrVisit(node) {
-    if (node && node.typeAnnotation) {
-      this._visitTypeAnnotation(node.typeAnnotation);
-    } else if (node && node.type === "Identifier") {
-      this.visit(node);
-    } else {
-      this._visitTypeAnnotation(node);
-    }
-  }
-
-  _visitArray(nodeList) {
-    if (nodeList) {
-      for (const node of nodeList) {
-        this.visit(node);
-      }
-    }
-  }
-}
-
-module.exports = function(ast, parserOptions) {
-  const options = {
-    ignoreEval: true,
-    optimistic: false,
-    directive: false,
-    nodejsScope:
-      ast.sourceType === "script" &&
-      (parserOptions.ecmaFeatures &&
-        parserOptions.ecmaFeatures.globalReturn) === true,
-    impliedStrict: false,
-    sourceType: ast.sourceType,
-    ecmaVersion: parserOptions.ecmaVersion || 2018,
-    fallback,
-  };
-
-  options.childVisitorKeys = childVisitorKeys;
-
-  const scopeManager = new escope.ScopeManager(options);
-  const referencer = new Referencer(options, scopeManager);
-
-  referencer.visit(ast);
-
-  return scopeManager;
-};
diff --git a/node_modules/babel-eslint/lib/babylon-to-espree/attachComments.js b/node_modules/babel-eslint/lib/babylon-to-espree/attachComments.js
deleted file mode 100644
index 8c608a4..0000000
--- a/node_modules/babel-eslint/lib/babylon-to-espree/attachComments.js
+++ /dev/null
@@ -1,59 +0,0 @@
-"use strict";
-
-// comment fixes
-module.exports = function(ast, comments, tokens) {
-  if (comments.length) {
-    var firstComment = comments[0];
-    var lastComment = comments[comments.length - 1];
-    // fixup program start
-    if (!tokens.length) {
-      // if no tokens, the program starts at the end of the last comment
-      ast.start = lastComment.end;
-      ast.loc.start.line = lastComment.loc.end.line;
-      ast.loc.start.column = lastComment.loc.end.column;
-
-      if (ast.leadingComments === null && ast.innerComments.length) {
-        ast.leadingComments = ast.innerComments;
-      }
-    } else if (firstComment.start < tokens[0].start) {
-      // if there are comments before the first token, the program starts at the first token
-      var token = tokens[0];
-      // ast.start = token.start;
-      // ast.loc.start.line = token.loc.start.line;
-      // ast.loc.start.column = token.loc.start.column;
-
-      // estraverse do not put leading comments on first node when the comment
-      // appear before the first token
-      if (ast.body.length) {
-        var node = ast.body[0];
-        node.leadingComments = [];
-        var firstTokenStart = token.start;
-        var len = comments.length;
-        for (var i = 0; i < len && comments[i].start < firstTokenStart; i++) {
-          node.leadingComments.push(comments[i]);
-        }
-      }
-    }
-    // fixup program end
-    if (tokens.length) {
-      var lastToken = tokens[tokens.length - 1];
-      if (lastComment.end > lastToken.end) {
-        // If there is a comment after the last token, the program ends at the
-        // last token and not the comment
-        // ast.end = lastToken.end;
-        ast.range[1] = lastToken.end;
-        ast.loc.end.line = lastToken.loc.end.line;
-        ast.loc.end.column = lastToken.loc.end.column;
-      }
-    }
-  } else {
-    if (!tokens.length) {
-      ast.loc.start.line = 1;
-      ast.loc.end.line = 1;
-    }
-  }
-  if (ast.body && ast.body.length > 0) {
-    ast.loc.start.line = ast.body[0].loc.start.line;
-    ast.range[0] = ast.body[0].start;
-  }
-};
diff --git a/node_modules/babel-eslint/lib/babylon-to-espree/convertComments.js b/node_modules/babel-eslint/lib/babylon-to-espree/convertComments.js
deleted file mode 100644
index 17d7117..0000000
--- a/node_modules/babel-eslint/lib/babylon-to-espree/convertComments.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-module.exports = function(comments) {
-  for (var i = 0; i < comments.length; i++) {
-    var comment = comments[i];
-    if (comment.type === "CommentBlock") {
-      comment.type = "Block";
-    } else if (comment.type === "CommentLine") {
-      comment.type = "Line";
-    }
-    // sometimes comments don't get ranges computed,
-    // even with options.ranges === true
-    if (!comment.range) {
-      comment.range = [comment.start, comment.end];
-    }
-  }
-};
diff --git a/node_modules/babel-eslint/lib/babylon-to-espree/convertTemplateType.js b/node_modules/babel-eslint/lib/babylon-to-espree/convertTemplateType.js
deleted file mode 100644
index accde61..0000000
--- a/node_modules/babel-eslint/lib/babylon-to-espree/convertTemplateType.js
+++ /dev/null
@@ -1,92 +0,0 @@
-"use strict";
-
-module.exports = function(tokens, tt) {
-  let curlyBrace = null;
-  let templateTokens = [];
-  const result = [];
-
-  function addTemplateType() {
-    const start = templateTokens[0];
-    const end = templateTokens[templateTokens.length - 1];
-
-    const value = templateTokens.reduce((result, token) => {
-      if (token.value) {
-        result += token.value;
-      } else if (token.type !== tt.template) {
-        result += token.type.label;
-      }
-
-      return result;
-    }, "");
-
-    result.push({
-      type: "Template",
-      value: value,
-      start: start.start,
-      end: end.end,
-      loc: {
-        start: start.loc.start,
-        end: end.loc.end,
-      },
-    });
-
-    templateTokens = [];
-  }
-
-  tokens.forEach(token => {
-    switch (token.type) {
-      case tt.backQuote:
-        if (curlyBrace) {
-          result.push(curlyBrace);
-          curlyBrace = null;
-        }
-
-        templateTokens.push(token);
-
-        if (templateTokens.length > 1) {
-          addTemplateType();
-        }
-
-        break;
-
-      case tt.dollarBraceL:
-        templateTokens.push(token);
-        addTemplateType();
-        break;
-
-      case tt.braceR:
-        if (curlyBrace) {
-          result.push(curlyBrace);
-        }
-
-        curlyBrace = token;
-        break;
-
-      case tt.template:
-        if (curlyBrace) {
-          templateTokens.push(curlyBrace);
-          curlyBrace = null;
-        }
-
-        templateTokens.push(token);
-        break;
-
-      case tt.eof:
-        if (curlyBrace) {
-          result.push(curlyBrace);
-        }
-
-        break;
-
-      default:
-        if (curlyBrace) {
-          result.push(curlyBrace);
-          curlyBrace = null;
-        }
-
-        result.push(token);
-    }
-  });
-
-  return result;
-};
diff --git a/node_modules/babel-eslint/lib/babylon-to-espree/index.js b/node_modules/babel-eslint/lib/babylon-to-espree/index.js
deleted file mode 100644
index 6d6e12b..0000000
--- a/node_modules/babel-eslint/lib/babylon-to-espree/index.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict";
-
-var attachComments = require("./attachComments");
-var convertComments = require("./convertComments");
-var toTokens = require("./toTokens");
-var toAST = require("./toAST");
-
-module.exports = function(ast, traverse, tt, code) {
-  // convert tokens
-  ast.tokens = toTokens(ast.tokens, tt, code);
-
-  // add comments
-  convertComments(ast.comments);
-
-  // transform esprima and acorn divergent nodes
-  toAST(ast, traverse, code);
-
-  // ast.program.tokens = ast.tokens;
-  // ast.program.comments = ast.comments;
-  // ast = ast.program;
-
-  // remove File
-  ast.type = "Program";
-  ast.sourceType = ast.program.sourceType;
-  ast.directives = ast.program.directives;
-  ast.body = ast.program.body;
-  delete ast.program;
-
-  attachComments(ast, ast.comments, ast.tokens);
-};
diff --git a/node_modules/babel-eslint/lib/babylon-to-espree/toAST.js b/node_modules/babel-eslint/lib/babylon-to-espree/toAST.js
deleted file mode 100644
index b3da41f..0000000
--- a/node_modules/babel-eslint/lib/babylon-to-espree/toAST.js
+++ /dev/null
@@ -1,118 +0,0 @@
-"use strict";
-
-var t = require("@babel/types");
-var convertComments = require("./convertComments");
-
-module.exports = function(ast, traverse, code) {
-  var state = { source: code };
-
-  // Monkey patch visitor keys in order to be able to traverse the estree nodes
-  t.VISITOR_KEYS.Property = t.VISITOR_KEYS.ObjectProperty;
-  t.VISITOR_KEYS.MethodDefinition = [
-    "key",
-    "value",
-    "decorators",
-    "returnType",
-    "typeParameters",
-  ];
-
-  traverse(ast, astTransformVisitor, null, state);
-
-  delete t.VISITOR_KEYS.Property;
-  delete t.VISITOR_KEYS.MethodDefinition;
-};
-
-var astTransformVisitor = {
-  noScope: true,
-  enter(path) {
-    var node = path.node;
-
-    // private var to track original node type
-    node._babelType = node.type;
-
-    if (node.innerComments) {
-      node.trailingComments = node.innerComments;
-      delete node.innerComments;
-    }
-
-    if (node.trailingComments) {
-      convertComments(node.trailingComments);
-    }
-
-    if (node.leadingComments) {
-      convertComments(node.leadingComments);
-    }
-  },
-  exit(path) {
-    var node = path.node;
-
-    if (path.isJSXText()) {
-      node.type = "Literal";
-    }
-
-    if (
-      path.isRestElement() &&
-      path.parent &&
-      path.parent.type === "ObjectPattern"
-    ) {
-      node.type = "ExperimentalRestProperty";
-    }
-
-    if (
-      path.isSpreadElement() &&
-      path.parent &&
-      path.parent.type === "ObjectExpression"
-    ) {
-      node.type = "ExperimentalSpreadProperty";
-    }
-
-    if (path.isTypeParameter()) {
-      node.type = "Identifier";
-      node.typeAnnotation = node.bound;
-      delete node.bound;
-    }
-
-    // flow: prevent "no-undef"
-    // for "Component" in: "let x: React.Component"
-    if (path.isQualifiedTypeIdentifier()) {
-      delete node.id;
-    }
-    // for "b" in: "var a: { b: Foo }"
-    if (path.isObjectTypeProperty()) {
-      delete node.key;
-    }
-    // for "indexer" in: "var a: {[indexer: string]: number}"
-    if (path.isObjectTypeIndexer()) {
-      delete node.id;
-    }
-    // for "param" in: "var a: { func(param: Foo): Bar };"
-    if (path.isFunctionTypeParam()) {
-      delete node.name;
-    }
-
-    // modules
-
-    if (path.isImportDeclaration()) {
-      delete node.isType;
-    }
-
-    // template string range fixes
-    if (path.isTemplateLiteral()) {
-      for (var j = 0; j < node.quasis.length; j++) {
-        var q = node.quasis[j];
-        q.range[0] -= 1;
-        if (q.tail) {
-          q.range[1] += 1;
-        } else {
-          q.range[1] += 2;
-        }
-        q.loc.start.column -= 1;
-        if (q.tail) {
-          q.loc.end.column += 1;
-        } else {
-          q.loc.end.column += 2;
-        }
-      }
-    }
-  },
-};
diff --git a/node_modules/babel-eslint/lib/babylon-to-espree/toToken.js b/node_modules/babel-eslint/lib/babylon-to-espree/toToken.js
deleted file mode 100644
index 44c7352..0000000
--- a/node_modules/babel-eslint/lib/babylon-to-espree/toToken.js
+++ /dev/null
@@ -1,84 +0,0 @@
-"use strict";
-
-module.exports = function(token, tt, source) {
-  var type = token.type;
-  token.range = [token.start, token.end];
-
-  if (type === tt.name) {
-    token.type = "Identifier";
-  } else if (
-    type === tt.semi ||
-    type === tt.comma ||
-    type === tt.parenL ||
-    type === tt.parenR ||
-    type === tt.braceL ||
-    type === tt.braceR ||
-    type === tt.slash ||
-    type === tt.dot ||
-    type === tt.bracketL ||
-    type === tt.bracketR ||
-    type === tt.ellipsis ||
-    type === tt.arrow ||
-    type === tt.pipeline ||
-    type === tt.star ||
-    type === tt.incDec ||
-    type === tt.colon ||
-    type === tt.question ||
-    type === tt.questionDot ||
-    type === tt.template ||
-    type === tt.backQuote ||
-    type === tt.dollarBraceL ||
-    type === tt.at ||
-    type === tt.logicalOR ||
-    type === tt.logicalAND ||
-    type === tt.nullishCoalescing ||
-    type === tt.bitwiseOR ||
-    type === tt.bitwiseXOR ||
-    type === tt.bitwiseAND ||
-    type === tt.equality ||
-    type === tt.relational ||
-    type === tt.bitShift ||
-    type === tt.plusMin ||
-    type === tt.modulo ||
-    type === tt.exponent ||
-    type === tt.bang ||
-    type === tt.tilde ||
-    type === tt.doubleColon ||
-    type.isAssign
-  ) {
-    token.type = "Punctuator";
-    if (!token.value) token.value = type.label;
-  } else if (type === tt.jsxTagStart) {
-    token.type = "Punctuator";
-    token.value = "<";
-  } else if (type === tt.jsxTagEnd) {
-    token.type = "Punctuator";
-    token.value = ">";
-  } else if (type === tt.jsxName) {
-    token.type = "JSXIdentifier";
-  } else if (type === tt.jsxText) {
-    token.type = "JSXText";
-  } else if (type.keyword === "null") {
-    token.type = "Null";
-  } else if (type.keyword === "false" || type.keyword === "true") {
-    token.type = "Boolean";
-  } else if (type.keyword) {
-    token.type = "Keyword";
-  } else if (type === tt.num) {
-    token.type = "Numeric";
-    token.value = source.slice(token.start, token.end);
-  } else if (type === tt.string) {
-    token.type = "String";
-    token.value = source.slice(token.start, token.end);
-  } else if (type === tt.regexp) {
-    token.type = "RegularExpression";
-    var value = token.value;
-    token.regex = {
-      pattern: value.pattern,
-      flags: value.flags,
-    };
-    token.value = `/${value.pattern}/${value.flags}`;
-  }
-
-  return token;
-};
diff --git a/node_modules/babel-eslint/lib/babylon-to-espree/toTokens.js b/node_modules/babel-eslint/lib/babylon-to-espree/toTokens.js
deleted file mode 100644
index bb30819..0000000
--- a/node_modules/babel-eslint/lib/babylon-to-espree/toTokens.js
+++ /dev/null
@@ -1,10 +0,0 @@
-"use strict";
-
-var convertTemplateType = require("./convertTemplateType");
-var toToken = require("./toToken");
-
-module.exports = function(tokens, tt, code) {
-  return convertTemplateType(tokens, tt)
-    .filter(t => t.type !== "CommentLine" && t.type !== "CommentBlock")
-    .map(t => toToken(t, tt, code));
-};
diff --git a/node_modules/babel-eslint/lib/index.js b/node_modules/babel-eslint/lib/index.js
deleted file mode 100644
index 9e527d2..0000000
--- a/node_modules/babel-eslint/lib/index.js
+++ /dev/null
@@ -1,19 +0,0 @@
-"use strict";
-
-exports.parse = function(code, options) {
-  return exports.parseForESLint(code, options).ast;
-};
-
-exports.parseForESLint = function(code, options) {
-  options = options || {};
-  options.ecmaVersion = options.ecmaVersion || 2018;
-  options.sourceType = options.sourceType || "module";
-  options.allowImportExportEverywhere =
-    options.allowImportExportEverywhere || false;
-
-  return require("./parse-with-scope")(code, options);
-};
-
-exports.parseNoPatch = function(code, options) {
-  return require("./parse")(code, options);
-};
diff --git a/node_modules/babel-eslint/lib/parse-with-scope.js b/node_modules/babel-eslint/lib/parse-with-scope.js
deleted file mode 100644
index 36e3fce..0000000
--- a/node_modules/babel-eslint/lib/parse-with-scope.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-const visitorKeys = require("./visitor-keys");
-const analyzeScope = require("./analyze-scope");
-const parse = require("./parse");
-
-module.exports = function(code, options) {
-  const ast = parse(code, options);
-  const scopeManager = analyzeScope(ast, options);
-
-  return { ast, scopeManager, visitorKeys };
-};
diff --git a/node_modules/babel-eslint/lib/parse.js b/node_modules/babel-eslint/lib/parse.js
deleted file mode 100644
index d0fe8e5..0000000
--- a/node_modules/babel-eslint/lib/parse.js
+++ /dev/null
@@ -1,93 +0,0 @@
-"use strict";
-
-var babylonToEspree = require("./babylon-to-espree");
-var parse = require("@babel/parser").parse;
-var tt = require("@babel/parser").tokTypes;
-var traverse = require("@babel/traverse").default;
-var codeFrameColumns = require("@babel/code-frame").codeFrameColumns;
-
-module.exports = function(code, options) {
-  const legacyDecorators =
-    options.ecmaFeatures && options.ecmaFeatures.legacyDecorators;
-
-  var opts = {
-    codeFrame: options.hasOwnProperty("codeFrame") ? options.codeFrame : true,
-    sourceType: options.sourceType,
-    allowImportExportEverywhere: options.allowImportExportEverywhere, // consistent with espree
-    allowReturnOutsideFunction: true,
-    allowSuperOutsideMethod: true,
-    ranges: true,
-    tokens: true,
-    plugins: [
-      ["flow", { all: true, enums: true }],
-      "jsx",
-      "estree",
-      "asyncFunctions",
-      "asyncGenerators",
-      "classConstructorCall",
-      "classProperties",
-      legacyDecorators
-        ? "decorators-legacy"
-        : ["decorators", { decoratorsBeforeExport: false }],
-      "doExpressions",
-      "exponentiationOperator",
-      "exportDefaultFrom",
-      "exportNamespaceFrom",
-      "functionBind",
-      "functionSent",
-      "objectRestSpread",
-      "trailingFunctionCommas",
-      "dynamicImport",
-      "numericSeparator",
-      "optionalChaining",
-      "importMeta",
-      "classPrivateProperties",
-      "bigInt",
-      "optionalCatchBinding",
-      "throwExpressions",
-      ["pipelineOperator", { proposal: "minimal" }],
-      "nullishCoalescingOperator",
-      "logicalAssignment",
-    ],
-  };
-
-  var ast;
-  try {
-    ast = parse(code, opts);
-  } catch (err) {
-    if (err instanceof SyntaxError) {
-      err.lineNumber = err.loc.line;
-      err.column = err.loc.column;
-
-      if (opts.codeFrame) {
-        err.lineNumber = err.loc.line;
-        err.column = err.loc.column + 1;
-
-        // remove trailing "(LINE:COLUMN)" acorn message and add in esprima syntax error message start
-        err.message =
-          "Line " +
-          err.lineNumber +
-          ": " +
-          err.message.replace(/ \((\d+):(\d+)\)$/, "") +
-          // add codeframe
-          "\n\n" +
-          codeFrameColumns(
-            code,
-            {
-              start: {
-                line: err.lineNumber,
-                column: err.column,
-              },
-            },
-            { highlightCode: true }
-          );
-      }
-    }
-
-    throw err;
-  }
-
-  babylonToEspree(ast, traverse, tt, code);
-
-  return ast;
-};
diff --git a/node_modules/babel-eslint/lib/require-from-eslint.js b/node_modules/babel-eslint/lib/require-from-eslint.js
deleted file mode 100644
index 3834689..0000000
--- a/node_modules/babel-eslint/lib/require-from-eslint.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-
-const resolve = require("resolve");
-const eslintBase = require.resolve("eslint");
-
-module.exports = function requireFromESLint(id) {
-  const path = resolve.sync(id, { basedir: eslintBase });
-  return require(path);
-};
diff --git a/node_modules/babel-eslint/lib/visitor-keys.js b/node_modules/babel-eslint/lib/visitor-keys.js
deleted file mode 100644
index 921a0bb..0000000
--- a/node_modules/babel-eslint/lib/visitor-keys.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-
-const BABEL_VISITOR_KEYS = require("@babel/types").VISITOR_KEYS;
-const ESLINT_VISITOR_KEYS = require("eslint-visitor-keys").KEYS;
-
-module.exports = Object.assign(
-  {
-    Literal: ESLINT_VISITOR_KEYS.Literal,
-    MethodDefinition: ["decorators"].concat(
-      ESLINT_VISITOR_KEYS.MethodDefinition
-    ),
-    Property: ["decorators"].concat(ESLINT_VISITOR_KEYS.Property),
-  },
-  BABEL_VISITOR_KEYS
-);
diff --git a/node_modules/babel-eslint/node_modules/.bin/eslint b/node_modules/babel-eslint/node_modules/.bin/eslint
deleted file mode 120000
index fad93f5..0000000
--- a/node_modules/babel-eslint/node_modules/.bin/eslint
+++ /dev/null
@@ -1 +0,0 @@
-../../../eslint/bin/eslint.js
\ No newline at end of file
diff --git a/node_modules/babel-eslint/node_modules/.bin/parser b/node_modules/babel-eslint/node_modules/.bin/parser
deleted file mode 120000
index ea2e504..0000000
--- a/node_modules/babel-eslint/node_modules/.bin/parser
+++ /dev/null
@@ -1 +0,0 @@
-../../../@babel/parser/bin/babel-parser.js
\ No newline at end of file
diff --git a/node_modules/babel-eslint/package.json b/node_modules/babel-eslint/package.json
deleted file mode 100644
index 9abee15..0000000
--- a/node_modules/babel-eslint/package.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
-  "name": "babel-eslint",
-  "version": "10.1.0",
-  "description": "Custom parser for ESLint",
-  "main": "lib/index.js",
-  "files": [
-    "lib"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/babel/babel-eslint.git"
-  },
-  "dependencies": {
-    "@babel/code-frame": "^7.0.0",
-    "@babel/parser": "^7.7.0",
-    "@babel/traverse": "^7.7.0",
-    "@babel/types": "^7.7.0",
-    "eslint-visitor-keys": "^1.0.0",
-    "resolve": "^1.12.0"
-  },
-  "scripts": {
-    "test": "npm run lint && npm run test-only",
-    "test-only": "mocha && mocha --require test/fixtures/preprocess-to-patch.js",
-    "lint": "eslint lib test",
-    "fix": "eslint lib test --fix",
-    "precommit": "lint-staged",
-    "preversion": "npm test",
-    "changelog": "git log `git describe --tags --abbrev=0`..HEAD --pretty=format:' * %s (%an)' | grep -v 'Merge pull request'"
-  },
-  "author": "Sebastian McKenzie <sebmck@gmail.com>",
-  "license": "MIT",
-  "engines": {
-    "node": ">=6"
-  },
-  "bugs": {
-    "url": "https://github.com/babel/babel-eslint/issues"
-  },
-  "homepage": "https://github.com/babel/babel-eslint",
-  "peerDependencies": {
-    "eslint": ">= 4.12.1"
-  },
-  "devDependencies": {
-    "babel-eslint": "^8.2.6",
-    "dedent": "^0.7.0",
-    "eslint": "^5.6.0",
-    "eslint-config-babel": "^7.0.1",
-    "eslint-plugin-flowtype": "^2.30.3",
-    "eslint-plugin-import": "^2.14.0",
-    "eslint-plugin-prettier": "^2.1.2",
-    "espree": "^3.5.2",
-    "husky": "^1.0.0-rc.13",
-    "lint-staged": "^7.2.2",
-    "mocha": "^5.0.1",
-    "prettier": "^1.4.4"
-  },
-  "lint-staged": {
-    "*.js": [
-      "eslint --format=codeframe --fix",
-      "git add"
-    ]
-  }
-}
diff --git a/node_modules/babel-plugin-jest-hoist/node_modules/@babel/template/node_modules/.bin/parser b/node_modules/babel-plugin-jest-hoist/node_modules/@babel/template/node_modules/.bin/parser
index 97a06c3..ef1b372 120000
--- a/node_modules/babel-plugin-jest-hoist/node_modules/@babel/template/node_modules/.bin/parser
+++ b/node_modules/babel-plugin-jest-hoist/node_modules/@babel/template/node_modules/.bin/parser
@@ -1 +1 @@
-../../../parser/bin/babel-parser.js
\ No newline at end of file
+../../../../../../jest-circus/node_modules/@babel/template/node_modules/@babel/parser/bin/babel-parser.js
\ No newline at end of file
diff --git a/node_modules/chardet/.travis.yml b/node_modules/chardet/.travis.yml
deleted file mode 100644
index ceafed9..0000000
--- a/node_modules/chardet/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-node_js:
-  - "6"
-  - "8"
-  - "10"
diff --git a/node_modules/chardet/LICENSE b/node_modules/chardet/LICENSE
deleted file mode 100644
index fcdc879..0000000
--- a/node_modules/chardet/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2018 Dmitry Shirokov
-
-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/node_modules/chardet/README.md b/node_modules/chardet/README.md
deleted file mode 100644
index 9e317d7..0000000
--- a/node_modules/chardet/README.md
+++ /dev/null
@@ -1,81 +0,0 @@
-
-chardet [![Build Status](https://travis-ci.org/runk/node-chardet.png)](https://travis-ci.org/runk/node-chardet)
-=====
-
-Chardet is a character detection module for NodeJS written in pure Javascript.
-Module is based on ICU project http://site.icu-project.org/, which uses character
-occurency analysis to determine the most probable encoding.
-
-## Installation
-
-```
-npm i chardet
-```
-
-## Usage
-
-To return the encoding with the highest confidence:
-```javascript
-var chardet = require('chardet');
-chardet.detect(Buffer.alloc('hello there!'));
-// or
-chardet.detectFile('/path/to/file', function(err, encoding) {});
-// or
-chardet.detectFileSync('/path/to/file');
-```
-
-
-To return the full list of possible encodings:
-```javascript
-var chardet = require('chardet');
-chardet.detectAll(Buffer.alloc('hello there!'));
-// or
-chardet.detectFileAll('/path/to/file', function(err, encoding) {});
-// or
-chardet.detectFileAllSync('/path/to/file');
-
-//Returned value is an array of objects sorted by confidence value in decending order
-//e.g. [{ confidence: 90, name: 'UTF-8'}, {confidence: 20, name: 'windows-1252', lang: 'fr'}]
-```
-
-## Working with large data sets
-
-Sometimes, when data set is huge and you want to optimize performace (in tradeoff of less accuracy),
-you can sample only first N bytes of the buffer:
-
-```javascript
-chardet.detectFile('/path/to/file', { sampleSize: 32 }, function(err, encoding) {});
-```
-
-## Supported Encodings:
-
-* UTF-8
-* UTF-16 LE
-* UTF-16 BE
-* UTF-32 LE
-* UTF-32 BE
-* ISO-2022-JP
-* ISO-2022-KR
-* ISO-2022-CN
-* Shift-JIS
-* Big5
-* EUC-JP
-* EUC-KR
-* GB18030
-* ISO-8859-1
-* ISO-8859-2
-* ISO-8859-5
-* ISO-8859-6
-* ISO-8859-7
-* ISO-8859-8
-* ISO-8859-9
-* windows-1250
-* windows-1251
-* windows-1252
-* windows-1253
-* windows-1254
-* windows-1255
-* windows-1256
-* KOI8-R
-
-Currently only these encodings are supported, more will be added soon.
diff --git a/node_modules/chardet/encoding/iso2022.js b/node_modules/chardet/encoding/iso2022.js
deleted file mode 100644
index afff88a..0000000
--- a/node_modules/chardet/encoding/iso2022.js
+++ /dev/null
@@ -1,141 +0,0 @@
-var util = require('util'),
-  Match = require ('../match');
-
-
-/**
- * This is a superclass for the individual detectors for
- * each of the detectable members of the ISO 2022 family
- * of encodings.
- */
-
-function ISO_2022() {}
-
-ISO_2022.prototype.match = function(det) {
-
-  /**
-   * Matching function shared among the 2022 detectors JP, CN and KR
-   * Counts up the number of legal an unrecognized escape sequences in
-   * the sample of text, and computes a score based on the total number &
-   * the proportion that fit the encoding.
-   *
-   *
-   * @param text the byte buffer containing text to analyse
-   * @param textLen  the size of the text in the byte.
-   * @param escapeSequences the byte escape sequences to test for.
-   * @return match quality, in the range of 0-100.
-   */
-
-  var i, j;
-  var escN;
-  var hits   = 0;
-  var misses = 0;
-  var shifts = 0;
-  var quality;
-
-  // TODO: refactor me
-  var text = det.fInputBytes;
-  var textLen = det.fInputLen;
-
-  scanInput:
-    for (i = 0; i < textLen; i++) {
-      if (text[i] == 0x1b) {
-        checkEscapes:
-          for (escN = 0; escN < this.escapeSequences.length; escN++) {
-            var seq = this.escapeSequences[escN];
-
-            if ((textLen - i) < seq.length)
-              continue checkEscapes;
-
-            for (j = 1; j < seq.length; j++)
-              if (seq[j] != text[i + j])
-                continue checkEscapes;
-
-
-            hits++;
-            i += seq.length - 1;
-            continue scanInput;
-          }
-
-          misses++;
-      }
-
-      // Shift in/out
-      if (text[i] == 0x0e || text[i] == 0x0f)
-        shifts++;
-
-    }
-
-  if (hits == 0)
-    return null;
-
-  //
-  // Initial quality is based on relative proportion of recongized vs.
-  //   unrecognized escape sequences.
-  //   All good:  quality = 100;
-  //   half or less good: quality = 0;
-  //   linear inbetween.
-  quality = (100 * hits - 100 * misses) / (hits + misses);
-
-  // Back off quality if there were too few escape sequences seen.
-  //   Include shifts in this computation, so that KR does not get penalized
-  //   for having only a single Escape sequence, but many shifts.
-  if (hits + shifts < 5)
-    quality -= (5 - (hits + shifts)) * 10;
-
-  return quality <= 0 ? null : new Match(det, this, quality);
-};
-
-module.exports.ISO_2022_JP = function() {
-  this.name = function() {
-    return 'ISO-2022-JP';
-  };
-  this.escapeSequences = [
-    [ 0x1b, 0x24, 0x28, 0x43 ],   // KS X 1001:1992
-    [ 0x1b, 0x24, 0x28, 0x44 ],   // JIS X 212-1990
-    [ 0x1b, 0x24, 0x40 ],         // JIS C 6226-1978
-    [ 0x1b, 0x24, 0x41 ],         // GB 2312-80
-    [ 0x1b, 0x24, 0x42 ],         // JIS X 208-1983
-    [ 0x1b, 0x26, 0x40 ],         // JIS X 208 1990, 1997
-    [ 0x1b, 0x28, 0x42 ],         // ASCII
-    [ 0x1b, 0x28, 0x48 ],         // JIS-Roman
-    [ 0x1b, 0x28, 0x49 ],         // Half-width katakana
-    [ 0x1b, 0x28, 0x4a ],         // JIS-Roman
-    [ 0x1b, 0x2e, 0x41 ],         // ISO 8859-1
-    [ 0x1b, 0x2e, 0x46 ]          // ISO 8859-7
-  ];
-};
-util.inherits(module.exports.ISO_2022_JP, ISO_2022);
-
-
-
-module.exports.ISO_2022_KR = function() {
-  this.name = function() {
-    return 'ISO-2022-KR';
-  };
-  this.escapeSequences = [
-    [ 0x1b, 0x24, 0x29, 0x43 ]
-  ];
-};
-util.inherits(module.exports.ISO_2022_KR, ISO_2022);
-
-
-
-module.exports.ISO_2022_CN = function() {
-  this.name = function() {
-    return 'ISO-2022-CN';
-  };
-  this.escapeSequences = [
-    [ 0x1b, 0x24, 0x29, 0x41 ],   // GB 2312-80
-    [ 0x1b, 0x24, 0x29, 0x47 ],   // CNS 11643-1992 Plane 1
-    [ 0x1b, 0x24, 0x2A, 0x48 ],   // CNS 11643-1992 Plane 2
-    [ 0x1b, 0x24, 0x29, 0x45 ],   // ISO-IR-165
-    [ 0x1b, 0x24, 0x2B, 0x49 ],   // CNS 11643-1992 Plane 3
-    [ 0x1b, 0x24, 0x2B, 0x4A ],   // CNS 11643-1992 Plane 4
-    [ 0x1b, 0x24, 0x2B, 0x4B ],   // CNS 11643-1992 Plane 5
-    [ 0x1b, 0x24, 0x2B, 0x4C ],   // CNS 11643-1992 Plane 6
-    [ 0x1b, 0x24, 0x2B, 0x4D ],   // CNS 11643-1992 Plane 7
-    [ 0x1b, 0x4e ],               // SS2
-    [ 0x1b, 0x4f ]                // SS3
-  ];
-};
-util.inherits(module.exports.ISO_2022_CN, ISO_2022);
diff --git a/node_modules/chardet/encoding/mbcs.js b/node_modules/chardet/encoding/mbcs.js
deleted file mode 100644
index 5aa1557..0000000
--- a/node_modules/chardet/encoding/mbcs.js
+++ /dev/null
@@ -1,502 +0,0 @@
-var util = require('util'),
-  Match = require ('../match');
-
-/**
- * Binary search implementation (recursive)
- */
-function binarySearch(arr, searchValue) {
-  function find(arr, searchValue, left, right) {
-    if (right < left)
-      return -1;
-
-    /*
-    int mid = mid = (left + right) / 2;
-    There is a bug in the above line;
-    Joshua Bloch suggests the following replacement:
-    */
-    var mid = Math.floor((left + right) >>> 1);
-    if (searchValue > arr[mid])
-      return find(arr, searchValue, mid + 1, right);
-
-    if (searchValue < arr[mid])
-      return find(arr, searchValue, left, mid - 1);
-
-    return mid;
-  };
-
-  return find(arr, searchValue, 0, arr.length - 1);
-};
-
-// 'Character'  iterated character class.
-//    Recognizers for specific mbcs encodings make their 'characters' available
-//    by providing a nextChar() function that fills in an instance of iteratedChar
-//    with the next char from the input.
-//    The returned characters are not converted to Unicode, but remain as the raw
-//    bytes (concatenated into an int) from the codepage data.
-//
-//  For Asian charsets, use the raw input rather than the input that has been
-//   stripped of markup.  Detection only considers multi-byte chars, effectively
-//   stripping markup anyway, and double byte chars do occur in markup too.
-//
-function IteratedChar() {
-
-  this.charValue = 0; // 1-4 bytes from the raw input data
-  this.index     = 0;
-  this.nextIndex = 0;
-  this.error     = false;
-  this.done      = false;
-
-  this.reset = function() {
-    this.charValue = 0;
-    this.index     = -1;
-    this.nextIndex = 0;
-    this.error     = false;
-    this.done      = false;
-  };
-
-  this.nextByte = function(det) {
-    if (this.nextIndex >= det.fRawLength) {
-      this.done = true;
-      return -1;
-    }
-    var byteValue = det.fRawInput[this.nextIndex++] & 0x00ff;
-    return byteValue;
-  };
-};
-
-
-
-/**
- * Asian double or multi-byte - charsets.
- * Match is determined mostly by the input data adhering to the
- * encoding scheme for the charset, and, optionally,
- * frequency-of-occurence of characters.
- */
-
-function mbcs() {};
-
-/**
- * Test the match of this charset with the input text data
- *      which is obtained via the CharsetDetector object.
- *
- * @param det  The CharsetDetector, which contains the input text
- *             to be checked for being in this charset.
- * @return     Two values packed into one int  (Damn java, anyhow)
- *             bits 0-7:  the match confidence, ranging from 0-100
- *             bits 8-15: The match reason, an enum-like value.
- */
-mbcs.prototype.match = function(det) {
-
-  var singleByteCharCount = 0,  //TODO Do we really need this?
-    doubleByteCharCount = 0,
-    commonCharCount     = 0,
-    badCharCount        = 0,
-    totalCharCount      = 0,
-    confidence          = 0;
-
-  var iter = new IteratedChar();
-
-  detectBlock: {
-    for (iter.reset(); this.nextChar(iter, det);) {
-      totalCharCount++;
-      if (iter.error) {
-        badCharCount++;
-      } else {
-        var cv = iter.charValue & 0xFFFFFFFF;
-
-        if (cv <= 0xff) {
-          singleByteCharCount++;
-        } else {
-          doubleByteCharCount++;
-          if (this.commonChars != null) {
-            // NOTE: This assumes that there are no 4-byte common chars.
-            if (binarySearch(this.commonChars, cv) >= 0) {
-              commonCharCount++;
-            }
-          }
-        }
-      }
-      if (badCharCount >= 2 && badCharCount * 5 >= doubleByteCharCount) {
-        // console.log('its here!')
-        // Bail out early if the byte data is not matching the encoding scheme.
-        break detectBlock;
-      }
-    }
-
-    if (doubleByteCharCount <= 10 && badCharCount== 0) {
-      // Not many multi-byte chars.
-      if (doubleByteCharCount == 0 && totalCharCount < 10) {
-        // There weren't any multibyte sequences, and there was a low density of non-ASCII single bytes.
-        // We don't have enough data to have any confidence.
-        // Statistical analysis of single byte non-ASCII charcters would probably help here.
-        confidence = 0;
-      }
-      else {
-        //   ASCII or ISO file?  It's probably not our encoding,
-        //   but is not incompatible with our encoding, so don't give it a zero.
-        confidence = 10;
-      }
-      break detectBlock;
-    }
-
-    //
-    //  No match if there are too many characters that don't fit the encoding scheme.
-    //    (should we have zero tolerance for these?)
-    //
-    if (doubleByteCharCount < 20 * badCharCount) {
-      confidence = 0;
-      break detectBlock;
-    }
-
-    if (this.commonChars == null) {
-      // We have no statistics on frequently occuring characters.
-      //  Assess confidence purely on having a reasonable number of
-      //  multi-byte characters (the more the better
-      confidence = 30 + doubleByteCharCount - 20 * badCharCount;
-      if (confidence > 100) {
-        confidence = 100;
-      }
-    } else {
-      //
-      // Frequency of occurence statistics exist.
-      //
-      var maxVal = Math.log(parseFloat(doubleByteCharCount) / 4);
-      var scaleFactor = 90.0 / maxVal;
-      confidence = Math.floor(Math.log(commonCharCount + 1) * scaleFactor + 10);
-      confidence = Math.min(confidence, 100);
-    }
-  }   // end of detectBlock:
-
-  return confidence == 0 ? null : new Match(det, this, confidence);
-};
-
-/**
- * Get the next character (however many bytes it is) from the input data
- *    Subclasses for specific charset encodings must implement this function
- *    to get characters according to the rules of their encoding scheme.
- *
- *  This function is not a method of class iteratedChar only because
- *   that would require a lot of extra derived classes, which is awkward.
- * @param it  The iteratedChar 'struct' into which the returned char is placed.
- * @param det The charset detector, which is needed to get at the input byte data
- *            being iterated over.
- * @return    True if a character was returned, false at end of input.
- */
-
-mbcs.prototype.nextChar = function(iter, det) {};
-
-
-
-/**
- * Shift-JIS charset recognizer.
- */
-module.exports.sjis = function() {
-  this.name = function() {
-    return 'Shift-JIS';
-  };
-  this.language = function() {
-    return 'ja';
-  };
-
-  // TODO:  This set of data comes from the character frequency-
-  //        of-occurence analysis tool.  The data needs to be moved
-  //        into a resource and loaded from there.
-  this.commonChars = [
-    0x8140, 0x8141, 0x8142, 0x8145, 0x815b, 0x8169, 0x816a, 0x8175, 0x8176, 0x82a0,
-    0x82a2, 0x82a4, 0x82a9, 0x82aa, 0x82ab, 0x82ad, 0x82af, 0x82b1, 0x82b3, 0x82b5,
-    0x82b7, 0x82bd, 0x82be, 0x82c1, 0x82c4, 0x82c5, 0x82c6, 0x82c8, 0x82c9, 0x82cc,
-    0x82cd, 0x82dc, 0x82e0, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82f0, 0x82f1, 0x8341,
-    0x8343, 0x834e, 0x834f, 0x8358, 0x835e, 0x8362, 0x8367, 0x8375, 0x8376, 0x8389,
-    0x838a, 0x838b, 0x838d, 0x8393, 0x8e96, 0x93fa, 0x95aa
-  ];
-
-  this.nextChar = function(iter, det) {
-    iter.index = iter.nextIndex;
-    iter.error = false;
-
-    var firstByte;
-    firstByte = iter.charValue = iter.nextByte(det);
-    if (firstByte < 0)
-      return false;
-
-    if (firstByte <= 0x7f || (firstByte > 0xa0 && firstByte <= 0xdf))
-      return true;
-
-    var secondByte = iter.nextByte(det);
-    if (secondByte < 0)
-      return false;
-
-    iter.charValue = (firstByte << 8) | secondByte;
-    if (! ((secondByte >= 0x40 && secondByte <= 0x7f) || (secondByte >= 0x80 && secondByte <= 0xff))) {
-      // Illegal second byte value.
-      iter.error = true;
-    }
-    return true;
-  };
-};
-util.inherits(module.exports.sjis, mbcs);
-
-
-
-/**
- *   Big5 charset recognizer.
- */
-module.exports.big5 = function() {
-  this.name = function() {
-    return 'Big5';
-  };
-  this.language = function() {
-    return 'zh';
-  };
-  // TODO:  This set of data comes from the character frequency-
-  //        of-occurence analysis tool.  The data needs to be moved
-  //        into a resource and loaded from there.
-  this.commonChars = [
-    0xa140, 0xa141, 0xa142, 0xa143, 0xa147, 0xa149, 0xa175, 0xa176, 0xa440, 0xa446,
-    0xa447, 0xa448, 0xa451, 0xa454, 0xa457, 0xa464, 0xa46a, 0xa46c, 0xa477, 0xa4a3,
-    0xa4a4, 0xa4a7, 0xa4c1, 0xa4ce, 0xa4d1, 0xa4df, 0xa4e8, 0xa4fd, 0xa540, 0xa548,
-    0xa558, 0xa569, 0xa5cd, 0xa5e7, 0xa657, 0xa661, 0xa662, 0xa668, 0xa670, 0xa6a8,
-    0xa6b3, 0xa6b9, 0xa6d3, 0xa6db, 0xa6e6, 0xa6f2, 0xa740, 0xa751, 0xa759, 0xa7da,
-    0xa8a3, 0xa8a5, 0xa8ad, 0xa8d1, 0xa8d3, 0xa8e4, 0xa8fc, 0xa9c0, 0xa9d2, 0xa9f3,
-    0xaa6b, 0xaaba, 0xaabe, 0xaacc, 0xaafc, 0xac47, 0xac4f, 0xacb0, 0xacd2, 0xad59,
-    0xaec9, 0xafe0, 0xb0ea, 0xb16f, 0xb2b3, 0xb2c4, 0xb36f, 0xb44c, 0xb44e, 0xb54c,
-    0xb5a5, 0xb5bd, 0xb5d0, 0xb5d8, 0xb671, 0xb7ed, 0xb867, 0xb944, 0xbad8, 0xbb44,
-    0xbba1, 0xbdd1, 0xc2c4, 0xc3b9, 0xc440, 0xc45f
-  ];
-  this.nextChar = function(iter, det) {
-    iter.index = iter.nextIndex;
-    iter.error = false;
-
-    var firstByte = iter.charValue = iter.nextByte(det);
-
-    if (firstByte < 0)
-      return false;
-
-    // single byte character.
-    if (firstByte <= 0x7f || firstByte == 0xff)
-      return true;
-
-    var secondByte = iter.nextByte(det);
-
-    if (secondByte < 0)
-      return false;
-
-    iter.charValue = (iter.charValue << 8) | secondByte;
-
-    if (secondByte < 0x40 || secondByte == 0x7f || secondByte == 0xff)
-      iter.error = true;
-
-    return true;
-  };
-};
-util.inherits(module.exports.big5, mbcs);
-
-
-
-/**
- *  EUC charset recognizers.  One abstract class that provides the common function
- *  for getting the next character according to the EUC encoding scheme,
- *  and nested derived classes for EUC_KR, EUC_JP, EUC_CN.
- *
- *  Get the next character value for EUC based encodings.
- *  Character 'value' is simply the raw bytes that make up the character
- *     packed into an int.
- */
-function eucNextChar(iter, det) {
-  iter.index = iter.nextIndex;
-  iter.error = false;
-  var firstByte  = 0;
-  var secondByte = 0;
-  var thirdByte  = 0;
-  //int fourthByte = 0;
-  buildChar: {
-    firstByte = iter.charValue = iter.nextByte(det);
-    if (firstByte < 0) {
-      // Ran off the end of the input data
-      iter.done = true;
-      break buildChar;
-    }
-    if (firstByte <= 0x8d) {
-      // single byte char
-      break buildChar;
-    }
-    secondByte = iter.nextByte(det);
-    iter.charValue = (iter.charValue << 8) | secondByte;
-    if (firstByte >= 0xA1 && firstByte <= 0xfe) {
-      // Two byte Char
-      if (secondByte < 0xa1) {
-        iter.error = true;
-      }
-      break buildChar;
-    }
-    if (firstByte == 0x8e) {
-      // Code Set 2.
-      //   In EUC-JP, total char size is 2 bytes, only one byte of actual char value.
-      //   In EUC-TW, total char size is 4 bytes, three bytes contribute to char value.
-      // We don't know which we've got.
-      // Treat it like EUC-JP.  If the data really was EUC-TW, the following two
-      //   bytes will look like a well formed 2 byte char.
-      if (secondByte < 0xa1) {
-        iter.error = true;
-      }
-      break buildChar;
-    }
-    if (firstByte == 0x8f) {
-      // Code set 3.
-      // Three byte total char size, two bytes of actual char value.
-      thirdByte = iter.nextByte(det);
-      iter.charValue = (iter.charValue << 8) | thirdByte;
-      if (thirdByte < 0xa1) {
-        iter.error = true;
-      }
-    }
-  }
-  return iter.done == false;
-};
-
-
-
-/**
- * The charset recognize for EUC-JP.  A singleton instance of this class
- *    is created and kept by the public CharsetDetector class
- */
-module.exports.euc_jp = function() {
-  this.name = function() {
-    return 'EUC-JP';
-  };
-  this.language = function() {
-    return 'ja';
-  };
-
-  // TODO:  This set of data comes from the character frequency-
-  //        of-occurence analysis tool.  The data needs to be moved
-  //        into a resource and loaded from there.
-  this.commonChars = [
-    0xa1a1, 0xa1a2, 0xa1a3, 0xa1a6, 0xa1bc, 0xa1ca, 0xa1cb, 0xa1d6, 0xa1d7, 0xa4a2,
-    0xa4a4, 0xa4a6, 0xa4a8, 0xa4aa, 0xa4ab, 0xa4ac, 0xa4ad, 0xa4af, 0xa4b1, 0xa4b3,
-    0xa4b5, 0xa4b7, 0xa4b9, 0xa4bb, 0xa4bd, 0xa4bf, 0xa4c0, 0xa4c1, 0xa4c3, 0xa4c4,
-    0xa4c6, 0xa4c7, 0xa4c8, 0xa4c9, 0xa4ca, 0xa4cb, 0xa4ce, 0xa4cf, 0xa4d0, 0xa4de,
-    0xa4df, 0xa4e1, 0xa4e2, 0xa4e4, 0xa4e8, 0xa4e9, 0xa4ea, 0xa4eb, 0xa4ec, 0xa4ef,
-    0xa4f2, 0xa4f3, 0xa5a2, 0xa5a3, 0xa5a4, 0xa5a6, 0xa5a7, 0xa5aa, 0xa5ad, 0xa5af,
-    0xa5b0, 0xa5b3, 0xa5b5, 0xa5b7, 0xa5b8, 0xa5b9, 0xa5bf, 0xa5c3, 0xa5c6, 0xa5c7,
-    0xa5c8, 0xa5c9, 0xa5cb, 0xa5d0, 0xa5d5, 0xa5d6, 0xa5d7, 0xa5de, 0xa5e0, 0xa5e1,
-    0xa5e5, 0xa5e9, 0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5f3, 0xb8a9, 0xb9d4, 0xbaee,
-    0xbbc8, 0xbef0, 0xbfb7, 0xc4ea, 0xc6fc, 0xc7bd, 0xcab8, 0xcaf3, 0xcbdc, 0xcdd1
-  ];
-
-  this.nextChar = eucNextChar;
-};
-util.inherits(module.exports.euc_jp, mbcs);
-
-
-
-/**
- * The charset recognize for EUC-KR.  A singleton instance of this class
- *    is created and kept by the public CharsetDetector class
- */
-module.exports.euc_kr = function() {
-  this.name = function() {
-    return 'EUC-KR';
-  };
-  this.language = function() {
-    return 'ko';
-  };
-
-  // TODO:  This set of data comes from the character frequency-
-  //        of-occurence analysis tool.  The data needs to be moved
-  //        into a resource and loaded from there.
-  this.commonChars = [
-    0xb0a1, 0xb0b3, 0xb0c5, 0xb0cd, 0xb0d4, 0xb0e6, 0xb0ed, 0xb0f8, 0xb0fa, 0xb0fc,
-    0xb1b8, 0xb1b9, 0xb1c7, 0xb1d7, 0xb1e2, 0xb3aa, 0xb3bb, 0xb4c2, 0xb4cf, 0xb4d9,
-    0xb4eb, 0xb5a5, 0xb5b5, 0xb5bf, 0xb5c7, 0xb5e9, 0xb6f3, 0xb7af, 0xb7c2, 0xb7ce,
-    0xb8a6, 0xb8ae, 0xb8b6, 0xb8b8, 0xb8bb, 0xb8e9, 0xb9ab, 0xb9ae, 0xb9cc, 0xb9ce,
-    0xb9fd, 0xbab8, 0xbace, 0xbad0, 0xbaf1, 0xbbe7, 0xbbf3, 0xbbfd, 0xbcad, 0xbcba,
-    0xbcd2, 0xbcf6, 0xbdba, 0xbdc0, 0xbdc3, 0xbdc5, 0xbec6, 0xbec8, 0xbedf, 0xbeee,
-    0xbef8, 0xbefa, 0xbfa1, 0xbfa9, 0xbfc0, 0xbfe4, 0xbfeb, 0xbfec, 0xbff8, 0xc0a7,
-    0xc0af, 0xc0b8, 0xc0ba, 0xc0bb, 0xc0bd, 0xc0c7, 0xc0cc, 0xc0ce, 0xc0cf, 0xc0d6,
-    0xc0da, 0xc0e5, 0xc0fb, 0xc0fc, 0xc1a4, 0xc1a6, 0xc1b6, 0xc1d6, 0xc1df, 0xc1f6,
-    0xc1f8, 0xc4a1, 0xc5cd, 0xc6ae, 0xc7cf, 0xc7d1, 0xc7d2, 0xc7d8, 0xc7e5, 0xc8ad
-  ];
-
-  this.nextChar = eucNextChar;
-};
-util.inherits(module.exports.euc_kr, mbcs);
-
-
-
-/**
- *   GB-18030 recognizer. Uses simplified Chinese statistics.
- */
-module.exports.gb_18030 = function() {
-  this.name = function() {
-    return 'GB18030';
-  };
-  this.language = function() {
-    return 'zh';
-  };
-
-  /*
-   *  Get the next character value for EUC based encodings.
-   *  Character 'value' is simply the raw bytes that make up the character
-   *     packed into an int.
-   */
-  this.nextChar = function(iter, det) {
-    iter.index = iter.nextIndex;
-    iter.error = false;
-    var firstByte  = 0;
-    var secondByte = 0;
-    var thirdByte  = 0;
-    var fourthByte = 0;
-    buildChar: {
-      firstByte = iter.charValue = iter.nextByte(det);
-      if (firstByte < 0) {
-        // Ran off the end of the input data
-        iter.done = true;
-        break buildChar;
-      }
-      if (firstByte <= 0x80) {
-        // single byte char
-        break buildChar;
-      }
-      secondByte = iter.nextByte(det);
-      iter.charValue = (iter.charValue << 8) | secondByte;
-      if (firstByte >= 0x81 && firstByte <= 0xFE) {
-        // Two byte Char
-        if ((secondByte >= 0x40 && secondByte <= 0x7E) || (secondByte >=80 && secondByte <= 0xFE)) {
-          break buildChar;
-        }
-        // Four byte char
-        if (secondByte >= 0x30 && secondByte <= 0x39) {
-          thirdByte = iter.nextByte(det);
-          if (thirdByte >= 0x81 && thirdByte <= 0xFE) {
-            fourthByte = iter.nextByte(det);
-            if (fourthByte >= 0x30 && fourthByte <= 0x39) {
-              iter.charValue = (iter.charValue << 16) | (thirdByte << 8) | fourthByte;
-              break buildChar;
-            }
-          }
-        }
-        iter.error = true;
-        break buildChar;
-      }
-    }
-    return iter.done == false;
-  };
-
-  // TODO:  This set of data comes from the character frequency-
-  //        of-occurence analysis tool.  The data needs to be moved
-  //        into a resource and loaded from there.
-  this.commonChars = [
-    0xa1a1, 0xa1a2, 0xa1a3, 0xa1a4, 0xa1b0, 0xa1b1, 0xa1f1, 0xa1f3, 0xa3a1, 0xa3ac,
-    0xa3ba, 0xb1a8, 0xb1b8, 0xb1be, 0xb2bb, 0xb3c9, 0xb3f6, 0xb4f3, 0xb5bd, 0xb5c4,
-    0xb5e3, 0xb6af, 0xb6d4, 0xb6e0, 0xb7a2, 0xb7a8, 0xb7bd, 0xb7d6, 0xb7dd, 0xb8b4,
-    0xb8df, 0xb8f6, 0xb9ab, 0xb9c9, 0xb9d8, 0xb9fa, 0xb9fd, 0xbacd, 0xbba7, 0xbbd6,
-    0xbbe1, 0xbbfa, 0xbcbc, 0xbcdb, 0xbcfe, 0xbdcc, 0xbecd, 0xbedd, 0xbfb4, 0xbfc6,
-    0xbfc9, 0xc0b4, 0xc0ed, 0xc1cb, 0xc2db, 0xc3c7, 0xc4dc, 0xc4ea, 0xc5cc, 0xc6f7,
-    0xc7f8, 0xc8ab, 0xc8cb, 0xc8d5, 0xc8e7, 0xc9cf, 0xc9fa, 0xcab1, 0xcab5, 0xcac7,
-    0xcad0, 0xcad6, 0xcaf5, 0xcafd, 0xccec, 0xcdf8, 0xceaa, 0xcec4, 0xced2, 0xcee5,
-    0xcfb5, 0xcfc2, 0xcfd6, 0xd0c2, 0xd0c5, 0xd0d0, 0xd0d4, 0xd1a7, 0xd2aa, 0xd2b2,
-    0xd2b5, 0xd2bb, 0xd2d4, 0xd3c3, 0xd3d0, 0xd3fd, 0xd4c2, 0xd4da, 0xd5e2, 0xd6d0
-  ];
-};
-util.inherits(module.exports.gb_18030, mbcs);
diff --git a/node_modules/chardet/encoding/sbcs.js b/node_modules/chardet/encoding/sbcs.js
deleted file mode 100644
index 80d525e..0000000
--- a/node_modules/chardet/encoding/sbcs.js
+++ /dev/null
@@ -1,907 +0,0 @@
-var util = require('util'),
-  Match = require ('../match');
-
-/**
- * This class recognizes single-byte encodings. Because the encoding scheme is so
- * simple, language statistics are used to do the matching.
- */
-
-function NGramParser(theNgramList, theByteMap) {
-  var N_GRAM_MASK = 0xFFFFFF;
-
-  this.byteIndex = 0;
-  this.ngram = 0;
-
-  this.ngramList = theNgramList;
-  this.byteMap = theByteMap;
-
-  this.ngramCount = 0;
-  this.hitCount = 0;
-
-  this.spaceChar;
-
-  /*
-   * Binary search for value in table, which must have exactly 64 entries.
-   */
-  this.search = function(table, value) {
-    var index = 0;
-
-    if (table[index + 32] <= value) index += 32;
-    if (table[index + 16] <= value) index += 16;
-    if (table[index + 8]  <= value) index += 8;
-    if (table[index + 4]  <= value) index += 4;
-    if (table[index + 2]  <= value) index += 2;
-    if (table[index + 1]  <= value) index += 1;
-    if (table[index]      > value)  index -= 1;
-
-    if (index < 0 || table[index] != value)
-      return -1;
-
-    return index;
-  };
-
-  this.lookup = function(thisNgram) {
-    this.ngramCount += 1;
-    if (this.search(this.ngramList, thisNgram) >= 0) {
-      this.hitCount += 1;
-    }
-  };
-
-  this.addByte = function(b) {
-    this.ngram = ((this.ngram << 8) + (b & 0xFF)) & N_GRAM_MASK;
-    this.lookup(this.ngram);
-  }
-
-  this.nextByte = function(det) {
-    if (this.byteIndex >= det.fInputLen)
-      return -1;
-
-    return det.fInputBytes[this.byteIndex++] & 0xFF;
-  }
-
-  this.parse = function(det, spaceCh) {
-    var b, ignoreSpace = false;
-    this.spaceChar = spaceCh;
-
-    while ((b = this.nextByte(det)) >= 0) {
-      var mb = this.byteMap[b];
-
-      // TODO: 0x20 might not be a space in all character sets...
-      if (mb != 0) {
-        if (!(mb == this.spaceChar && ignoreSpace)) {
-          this.addByte(mb);
-        }
-
-        ignoreSpace = (mb == this.spaceChar);
-      }
-    }
-
-    // TODO: Is this OK? The buffer could have ended in the middle of a word...
-    this.addByte(this.spaceChar);
-
-    var rawPercent = this.hitCount / this.ngramCount;
-
-    // TODO - This is a bit of a hack to take care of a case
-    // were we were getting a confidence of 135...
-    if (rawPercent > 0.33)
-      return 98;
-
-    return Math.floor(rawPercent * 300.0);
-  };
-};
-
-function NGramsPlusLang(la, ng) {
-  this.fLang = la;
-  this.fNGrams = ng;
-};
-
-function sbcs() {};
-sbcs.prototype.spaceChar = 0x20;
-sbcs.prototype.ngrams = function() {};
-sbcs.prototype.byteMap = function() {};
-sbcs.prototype.match = function(det) {
-
-  var ngrams = this.ngrams();
-  var multiple = (Array.isArray(ngrams) && ngrams[0] instanceof NGramsPlusLang);
-
-  if (!multiple) {
-    var parser = new NGramParser(ngrams, this.byteMap());
-    var confidence = parser.parse(det, this.spaceChar);
-    return confidence <= 0 ? null : new Match(det, this, confidence);
-  }
-
-  var bestConfidenceSoFar = -1;
-  var lang = null;
-
-  for (var i = ngrams.length - 1; i >= 0; i--) {
-    var ngl = ngrams[i];
-
-    var parser = new NGramParser(ngl.fNGrams, this.byteMap());
-    var confidence = parser.parse(det, this.spaceChar);
-    if (confidence > bestConfidenceSoFar) {
-      bestConfidenceSoFar = confidence;
-      lang = ngl.fLang;
-    }
-  }
-
-  var name = this.name(det);
-  return bestConfidenceSoFar <= 0 ? null : new Match(det, this, bestConfidenceSoFar, name, lang);
-};
-
-
-module.exports.ISO_8859_1 = function() {
-  this.byteMap = function() {
-    return [
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0xAA, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0xB5, 0x20, 0x20,
-      0x20, 0x20, 0xBA, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0x20,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xDF,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0x20,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
-    ];
-  };
-
-  this.ngrams = function() {
-    return [
-      new NGramsPlusLang('da', [
-        0x206166, 0x206174, 0x206465, 0x20656E, 0x206572, 0x20666F, 0x206861, 0x206920,
-        0x206D65, 0x206F67, 0x2070E5, 0x207369, 0x207374, 0x207469, 0x207669, 0x616620,
-        0x616E20, 0x616E64, 0x617220, 0x617420, 0x646520, 0x64656E, 0x646572, 0x646574,
-        0x652073, 0x656420, 0x656465, 0x656E20, 0x656E64, 0x657220, 0x657265, 0x657320,
-        0x657420, 0x666F72, 0x676520, 0x67656E, 0x676572, 0x696765, 0x696C20, 0x696E67,
-        0x6B6520, 0x6B6B65, 0x6C6572, 0x6C6967, 0x6C6C65, 0x6D6564, 0x6E6465, 0x6E6520,
-        0x6E6720, 0x6E6765, 0x6F6720, 0x6F6D20, 0x6F7220, 0x70E520, 0x722064, 0x722065,
-        0x722073, 0x726520, 0x737465, 0x742073, 0x746520, 0x746572, 0x74696C, 0x766572
-      ]),
-      new NGramsPlusLang('de', [
-        0x20616E, 0x206175, 0x206265, 0x206461, 0x206465, 0x206469, 0x206569, 0x206765,
-        0x206861, 0x20696E, 0x206D69, 0x207363, 0x207365, 0x20756E, 0x207665, 0x20766F,
-        0x207765, 0x207A75, 0x626572, 0x636820, 0x636865, 0x636874, 0x646173, 0x64656E,
-        0x646572, 0x646965, 0x652064, 0x652073, 0x65696E, 0x656974, 0x656E20, 0x657220,
-        0x657320, 0x67656E, 0x68656E, 0x687420, 0x696368, 0x696520, 0x696E20, 0x696E65,
-        0x697420, 0x6C6963, 0x6C6C65, 0x6E2061, 0x6E2064, 0x6E2073, 0x6E6420, 0x6E6465,
-        0x6E6520, 0x6E6720, 0x6E6765, 0x6E7465, 0x722064, 0x726465, 0x726569, 0x736368,
-        0x737465, 0x742064, 0x746520, 0x74656E, 0x746572, 0x756E64, 0x756E67, 0x766572
-      ]),
-      new NGramsPlusLang('en', [
-        0x206120, 0x20616E, 0x206265, 0x20636F, 0x20666F, 0x206861, 0x206865, 0x20696E,
-        0x206D61, 0x206F66, 0x207072, 0x207265, 0x207361, 0x207374, 0x207468, 0x20746F,
-        0x207768, 0x616964, 0x616C20, 0x616E20, 0x616E64, 0x617320, 0x617420, 0x617465,
-        0x617469, 0x642061, 0x642074, 0x652061, 0x652073, 0x652074, 0x656420, 0x656E74,
-        0x657220, 0x657320, 0x666F72, 0x686174, 0x686520, 0x686572, 0x696420, 0x696E20,
-        0x696E67, 0x696F6E, 0x697320, 0x6E2061, 0x6E2074, 0x6E6420, 0x6E6720, 0x6E7420,
-        0x6F6620, 0x6F6E20, 0x6F7220, 0x726520, 0x727320, 0x732061, 0x732074, 0x736169,
-        0x737420, 0x742074, 0x746572, 0x746861, 0x746865, 0x74696F, 0x746F20, 0x747320
-      ]),
-      new NGramsPlusLang('es', [
-        0x206120, 0x206361, 0x20636F, 0x206465, 0x20656C, 0x20656E, 0x206573, 0x20696E,
-        0x206C61, 0x206C6F, 0x207061, 0x20706F, 0x207072, 0x207175, 0x207265, 0x207365,
-        0x20756E, 0x207920, 0x612063, 0x612064, 0x612065, 0x61206C, 0x612070, 0x616369,
-        0x61646F, 0x616C20, 0x617220, 0x617320, 0x6369F3, 0x636F6E, 0x646520, 0x64656C,
-        0x646F20, 0x652064, 0x652065, 0x65206C, 0x656C20, 0x656E20, 0x656E74, 0x657320,
-        0x657374, 0x69656E, 0x69F36E, 0x6C6120, 0x6C6F73, 0x6E2065, 0x6E7465, 0x6F2064,
-        0x6F2065, 0x6F6E20, 0x6F7220, 0x6F7320, 0x706172, 0x717565, 0x726120, 0x726573,
-        0x732064, 0x732065, 0x732070, 0x736520, 0x746520, 0x746F20, 0x756520, 0xF36E20
-      ]),
-      new NGramsPlusLang('fr', [
-        0x206175, 0x20636F, 0x206461, 0x206465, 0x206475, 0x20656E, 0x206574, 0x206C61,
-        0x206C65, 0x207061, 0x20706F, 0x207072, 0x207175, 0x207365, 0x20736F, 0x20756E,
-        0x20E020, 0x616E74, 0x617469, 0x636520, 0x636F6E, 0x646520, 0x646573, 0x647520,
-        0x652061, 0x652063, 0x652064, 0x652065, 0x65206C, 0x652070, 0x652073, 0x656E20,
-        0x656E74, 0x657220, 0x657320, 0x657420, 0x657572, 0x696F6E, 0x697320, 0x697420,
-        0x6C6120, 0x6C6520, 0x6C6573, 0x6D656E, 0x6E2064, 0x6E6520, 0x6E7320, 0x6E7420,
-        0x6F6E20, 0x6F6E74, 0x6F7572, 0x717565, 0x72206C, 0x726520, 0x732061, 0x732064,
-        0x732065, 0x73206C, 0x732070, 0x742064, 0x746520, 0x74696F, 0x756520, 0x757220
-      ]),
-      new NGramsPlusLang('it', [
-        0x20616C, 0x206368, 0x20636F, 0x206465, 0x206469, 0x206520, 0x20696C, 0x20696E,
-        0x206C61, 0x207065, 0x207072, 0x20756E, 0x612063, 0x612064, 0x612070, 0x612073,
-        0x61746F, 0x636865, 0x636F6E, 0x64656C, 0x646920, 0x652061, 0x652063, 0x652064,
-        0x652069, 0x65206C, 0x652070, 0x652073, 0x656C20, 0x656C6C, 0x656E74, 0x657220,
-        0x686520, 0x692061, 0x692063, 0x692064, 0x692073, 0x696120, 0x696C20, 0x696E20,
-        0x696F6E, 0x6C6120, 0x6C6520, 0x6C6920, 0x6C6C61, 0x6E6520, 0x6E6920, 0x6E6F20,
-        0x6E7465, 0x6F2061, 0x6F2064, 0x6F2069, 0x6F2073, 0x6F6E20, 0x6F6E65, 0x706572,
-        0x726120, 0x726520, 0x736920, 0x746120, 0x746520, 0x746920, 0x746F20, 0x7A696F
-      ]),
-      new NGramsPlusLang('nl', [
-        0x20616C, 0x206265, 0x206461, 0x206465, 0x206469, 0x206565, 0x20656E, 0x206765,
-        0x206865, 0x20696E, 0x206D61, 0x206D65, 0x206F70, 0x207465, 0x207661, 0x207665,
-        0x20766F, 0x207765, 0x207A69, 0x61616E, 0x616172, 0x616E20, 0x616E64, 0x617220,
-        0x617420, 0x636874, 0x646520, 0x64656E, 0x646572, 0x652062, 0x652076, 0x65656E,
-        0x656572, 0x656E20, 0x657220, 0x657273, 0x657420, 0x67656E, 0x686574, 0x696520,
-        0x696E20, 0x696E67, 0x697320, 0x6E2062, 0x6E2064, 0x6E2065, 0x6E2068, 0x6E206F,
-        0x6E2076, 0x6E6465, 0x6E6720, 0x6F6E64, 0x6F6F72, 0x6F7020, 0x6F7220, 0x736368,
-        0x737465, 0x742064, 0x746520, 0x74656E, 0x746572, 0x76616E, 0x766572, 0x766F6F
-      ]),
-      new NGramsPlusLang('no', [
-        0x206174, 0x206176, 0x206465, 0x20656E, 0x206572, 0x20666F, 0x206861, 0x206920,
-        0x206D65, 0x206F67, 0x2070E5, 0x207365, 0x20736B, 0x20736F, 0x207374, 0x207469,
-        0x207669, 0x20E520, 0x616E64, 0x617220, 0x617420, 0x646520, 0x64656E, 0x646574,
-        0x652073, 0x656420, 0x656E20, 0x656E65, 0x657220, 0x657265, 0x657420, 0x657474,
-        0x666F72, 0x67656E, 0x696B6B, 0x696C20, 0x696E67, 0x6B6520, 0x6B6B65, 0x6C6520,
-        0x6C6C65, 0x6D6564, 0x6D656E, 0x6E2073, 0x6E6520, 0x6E6720, 0x6E6765, 0x6E6E65,
-        0x6F6720, 0x6F6D20, 0x6F7220, 0x70E520, 0x722073, 0x726520, 0x736F6D, 0x737465,
-        0x742073, 0x746520, 0x74656E, 0x746572, 0x74696C, 0x747420, 0x747465, 0x766572
-      ]),
-      new NGramsPlusLang('pt', [
-        0x206120, 0x20636F, 0x206461, 0x206465, 0x20646F, 0x206520, 0x206573, 0x206D61,
-        0x206E6F, 0x206F20, 0x207061, 0x20706F, 0x207072, 0x207175, 0x207265, 0x207365,
-        0x20756D, 0x612061, 0x612063, 0x612064, 0x612070, 0x616465, 0x61646F, 0x616C20,
-        0x617220, 0x617261, 0x617320, 0x636F6D, 0x636F6E, 0x646120, 0x646520, 0x646F20,
-        0x646F73, 0x652061, 0x652064, 0x656D20, 0x656E74, 0x657320, 0x657374, 0x696120,
-        0x696361, 0x6D656E, 0x6E7465, 0x6E746F, 0x6F2061, 0x6F2063, 0x6F2064, 0x6F2065,
-        0x6F2070, 0x6F7320, 0x706172, 0x717565, 0x726120, 0x726573, 0x732061, 0x732064,
-        0x732065, 0x732070, 0x737461, 0x746520, 0x746F20, 0x756520, 0xE36F20, 0xE7E36F
-      ]),
-      new NGramsPlusLang('sv', [
-        0x206174, 0x206176, 0x206465, 0x20656E, 0x2066F6, 0x206861, 0x206920, 0x20696E,
-        0x206B6F, 0x206D65, 0x206F63, 0x2070E5, 0x20736B, 0x20736F, 0x207374, 0x207469,
-        0x207661, 0x207669, 0x20E472, 0x616465, 0x616E20, 0x616E64, 0x617220, 0x617474,
-        0x636820, 0x646520, 0x64656E, 0x646572, 0x646574, 0x656420, 0x656E20, 0x657220,
-        0x657420, 0x66F672, 0x67656E, 0x696C6C, 0x696E67, 0x6B6120, 0x6C6C20, 0x6D6564,
-        0x6E2073, 0x6E6120, 0x6E6465, 0x6E6720, 0x6E6765, 0x6E696E, 0x6F6368, 0x6F6D20,
-        0x6F6E20, 0x70E520, 0x722061, 0x722073, 0x726120, 0x736B61, 0x736F6D, 0x742073,
-        0x746120, 0x746520, 0x746572, 0x74696C, 0x747420, 0x766172, 0xE47220, 0xF67220,
-      ])
-    ];
-  };
-
-  this.name = function(det) {
-    return (det && det.fC1Bytes) ? 'windows-1252' : 'ISO-8859-1';
-  };
-};
-util.inherits(module.exports.ISO_8859_1, sbcs);
-
-
-module.exports.ISO_8859_2 = function() {
-  this.byteMap = function() {
-    return [
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0xB1, 0x20, 0xB3, 0x20, 0xB5, 0xB6, 0x20,
-      0x20, 0xB9, 0xBA, 0xBB, 0xBC, 0x20, 0xBE, 0xBF,
-      0x20, 0xB1, 0x20, 0xB3, 0x20, 0xB5, 0xB6, 0xB7,
-      0x20, 0xB9, 0xBA, 0xBB, 0xBC, 0x20, 0xBE, 0xBF,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0x20,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xDF,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0x20,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x20
-    ];
-  }
-
-  this.ngrams = function() {
-    return [
-      new NGramsPlusLang('cs', [
-        0x206120, 0x206279, 0x20646F, 0x206A65, 0x206E61, 0x206E65, 0x206F20, 0x206F64,
-        0x20706F, 0x207072, 0x2070F8, 0x20726F, 0x207365, 0x20736F, 0x207374, 0x20746F,
-        0x207620, 0x207679, 0x207A61, 0x612070, 0x636520, 0x636820, 0x652070, 0x652073,
-        0x652076, 0x656D20, 0x656EED, 0x686F20, 0x686F64, 0x697374, 0x6A6520, 0x6B7465,
-        0x6C6520, 0x6C6920, 0x6E6120, 0x6EE920, 0x6EEC20, 0x6EED20, 0x6F2070, 0x6F646E,
-        0x6F6A69, 0x6F7374, 0x6F7520, 0x6F7661, 0x706F64, 0x706F6A, 0x70726F, 0x70F865,
-        0x736520, 0x736F75, 0x737461, 0x737469, 0x73746E, 0x746572, 0x746EED, 0x746F20,
-        0x752070, 0xBE6520, 0xE16EED, 0xE9686F, 0xED2070, 0xED2073, 0xED6D20, 0xF86564,
-      ]),
-      new NGramsPlusLang('hu', [
-        0x206120, 0x20617A, 0x206265, 0x206567, 0x20656C, 0x206665, 0x206861, 0x20686F,
-        0x206973, 0x206B65, 0x206B69, 0x206BF6, 0x206C65, 0x206D61, 0x206D65, 0x206D69,
-        0x206E65, 0x20737A, 0x207465, 0x20E973, 0x612061, 0x61206B, 0x61206D, 0x612073,
-        0x616B20, 0x616E20, 0x617A20, 0x62616E, 0x62656E, 0x656779, 0x656B20, 0x656C20,
-        0x656C65, 0x656D20, 0x656E20, 0x657265, 0x657420, 0x657465, 0x657474, 0x677920,
-        0x686F67, 0x696E74, 0x697320, 0x6B2061, 0x6BF67A, 0x6D6567, 0x6D696E, 0x6E2061,
-        0x6E616B, 0x6E656B, 0x6E656D, 0x6E7420, 0x6F6779, 0x732061, 0x737A65, 0x737A74,
-        0x737AE1, 0x73E967, 0x742061, 0x747420, 0x74E173, 0x7A6572, 0xE16E20, 0xE97320,
-      ]),
-      new NGramsPlusLang('pl', [
-        0x20637A, 0x20646F, 0x206920, 0x206A65, 0x206B6F, 0x206D61, 0x206D69, 0x206E61,
-        0x206E69, 0x206F64, 0x20706F, 0x207072, 0x207369, 0x207720, 0x207769, 0x207779,
-        0x207A20, 0x207A61, 0x612070, 0x612077, 0x616E69, 0x636820, 0x637A65, 0x637A79,
-        0x646F20, 0x647A69, 0x652070, 0x652073, 0x652077, 0x65207A, 0x65676F, 0x656A20,
-        0x656D20, 0x656E69, 0x676F20, 0x696120, 0x696520, 0x69656A, 0x6B6120, 0x6B6920,
-        0x6B6965, 0x6D6965, 0x6E6120, 0x6E6961, 0x6E6965, 0x6F2070, 0x6F7761, 0x6F7769,
-        0x706F6C, 0x707261, 0x70726F, 0x70727A, 0x727A65, 0x727A79, 0x7369EA, 0x736B69,
-        0x737461, 0x776965, 0x796368, 0x796D20, 0x7A6520, 0x7A6965, 0x7A7920, 0xF37720,
-      ]),
-      new NGramsPlusLang('ro', [
-        0x206120, 0x206163, 0x206361, 0x206365, 0x20636F, 0x206375, 0x206465, 0x206469,
-        0x206C61, 0x206D61, 0x207065, 0x207072, 0x207365, 0x2073E3, 0x20756E, 0x20BA69,
-        0x20EE6E, 0x612063, 0x612064, 0x617265, 0x617420, 0x617465, 0x617520, 0x636172,
-        0x636F6E, 0x637520, 0x63E320, 0x646520, 0x652061, 0x652063, 0x652064, 0x652070,
-        0x652073, 0x656120, 0x656920, 0x656C65, 0x656E74, 0x657374, 0x692061, 0x692063,
-        0x692064, 0x692070, 0x696520, 0x696920, 0x696E20, 0x6C6120, 0x6C6520, 0x6C6F72,
-        0x6C7569, 0x6E6520, 0x6E7472, 0x6F7220, 0x70656E, 0x726520, 0x726561, 0x727520,
-        0x73E320, 0x746520, 0x747275, 0x74E320, 0x756920, 0x756C20, 0xBA6920, 0xEE6E20,
-      ])
-    ];
-  };
-
-  this.name = function(det) {
-    return (det && det.fC1Bytes) ? 'windows-1250' : 'ISO-8859-2';
-  };
-};
-util.inherits(module.exports.ISO_8859_2, sbcs);
-
-
-module.exports.ISO_8859_5 = function() {
-  this.byteMap = function() {
-    return [
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0x20, 0xFE, 0xFF,
-      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
-      0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
-      0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0x20, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0x20, 0xFE, 0xFF
-    ];
-  };
-
-  this.ngrams = function() {
-    return [
-      0x20D220, 0x20D2DE, 0x20D4DE, 0x20D7D0, 0x20D820, 0x20DAD0, 0x20DADE, 0x20DDD0,
-      0x20DDD5, 0x20DED1, 0x20DFDE, 0x20DFE0, 0x20E0D0, 0x20E1DE, 0x20E1E2, 0x20E2DE,
-      0x20E7E2, 0x20EDE2, 0xD0DDD8, 0xD0E2EC, 0xD3DE20, 0xD5DBEC, 0xD5DDD8, 0xD5E1E2,
-      0xD5E220, 0xD820DF, 0xD8D520, 0xD8D820, 0xD8EF20, 0xDBD5DD, 0xDBD820, 0xDBECDD,
-      0xDDD020, 0xDDD520, 0xDDD8D5, 0xDDD8EF, 0xDDDE20, 0xDDDED2, 0xDE20D2, 0xDE20DF,
-      0xDE20E1, 0xDED220, 0xDED2D0, 0xDED3DE, 0xDED920, 0xDEDBEC, 0xDEDC20, 0xDEE1E2,
-      0xDFDEDB, 0xDFE0D5, 0xDFE0D8, 0xDFE0DE, 0xE0D0D2, 0xE0D5D4, 0xE1E2D0, 0xE1E2D2,
-      0xE1E2D8, 0xE1EF20, 0xE2D5DB, 0xE2DE20, 0xE2DEE0, 0xE2EC20, 0xE7E2DE, 0xEBE520
-    ];
-  };
-
-  this.name = function(det) {
-    return 'ISO-8859-5';
-  };
-
-  this.language = function() {
-    return 'ru';
-  };
-};
-util.inherits(module.exports.ISO_8859_5, sbcs);
-
-
-module.exports.ISO_8859_6 = function() {
-  this.byteMap = function() {
-    return [
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
-      0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
-      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
-      0xD8, 0xD9, 0xDA, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20
-    ];
-  };
-
-  this.ngrams = function() {
-    return [
-      0x20C7E4, 0x20C7E6, 0x20C8C7, 0x20D9E4, 0x20E1EA, 0x20E4E4, 0x20E5E6, 0x20E8C7,
-      0xC720C7, 0xC7C120, 0xC7CA20, 0xC7D120, 0xC7E420, 0xC7E4C3, 0xC7E4C7, 0xC7E4C8,
-      0xC7E4CA, 0xC7E4CC, 0xC7E4CD, 0xC7E4CF, 0xC7E4D3, 0xC7E4D9, 0xC7E4E2, 0xC7E4E5,
-      0xC7E4E8, 0xC7E4EA, 0xC7E520, 0xC7E620, 0xC7E6CA, 0xC820C7, 0xC920C7, 0xC920E1,
-      0xC920E4, 0xC920E5, 0xC920E8, 0xCA20C7, 0xCF20C7, 0xCFC920, 0xD120C7, 0xD1C920,
-      0xD320C7, 0xD920C7, 0xD9E4E9, 0xE1EA20, 0xE420C7, 0xE4C920, 0xE4E920, 0xE4EA20,
-      0xE520C7, 0xE5C720, 0xE5C920, 0xE5E620, 0xE620C7, 0xE720C7, 0xE7C720, 0xE8C7E4,
-      0xE8E620, 0xE920C7, 0xEA20C7, 0xEA20E5, 0xEA20E8, 0xEAC920, 0xEAD120, 0xEAE620
-    ];
-  };
-
-  this.name = function(det) {
-    return 'ISO-8859-6';
-  };
-
-  this.language = function() {
-    return 'ar';
-  };
-};
-util.inherits(module.exports.ISO_8859_6, sbcs);
-
-
-module.exports.ISO_8859_7 = function() {
-  this.byteMap = function() {
-    return [
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0xA1, 0xA2, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xDC, 0x20,
-      0xDD, 0xDE, 0xDF, 0x20, 0xFC, 0x20, 0xFD, 0xFE,
-      0xC0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xF0, 0xF1, 0x20, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xDC, 0xDD, 0xDE, 0xDF,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x20
-    ];
-  };
-
-  this.ngrams = function() {
-    return [
-      0x20E1ED, 0x20E1F0, 0x20E3E9, 0x20E4E9, 0x20E5F0, 0x20E720, 0x20EAE1, 0x20ECE5,
-      0x20EDE1, 0x20EF20, 0x20F0E1, 0x20F0EF, 0x20F0F1, 0x20F3F4, 0x20F3F5, 0x20F4E7,
-      0x20F4EF, 0xDFE120, 0xE120E1, 0xE120F4, 0xE1E920, 0xE1ED20, 0xE1F0FC, 0xE1F220,
-      0xE3E9E1, 0xE5E920, 0xE5F220, 0xE720F4, 0xE7ED20, 0xE7F220, 0xE920F4, 0xE9E120,
-      0xE9EADE, 0xE9F220, 0xEAE1E9, 0xEAE1F4, 0xECE520, 0xED20E1, 0xED20E5, 0xED20F0,
-      0xEDE120, 0xEFF220, 0xEFF520, 0xF0EFF5, 0xF0F1EF, 0xF0FC20, 0xF220E1, 0xF220E5,
-      0xF220EA, 0xF220F0, 0xF220F4, 0xF3E520, 0xF3E720, 0xF3F4EF, 0xF4E120, 0xF4E1E9,
-      0xF4E7ED, 0xF4E7F2, 0xF4E9EA, 0xF4EF20, 0xF4EFF5, 0xF4F9ED, 0xF9ED20, 0xFEED20
-    ];
-  };
-
-  this.name = function(det) {
-    return (det && det.fC1Bytes) ? 'windows-1253' : 'ISO-8859-7';
-  };
-
-  this.language = function() {
-    return 'el';
-  };
-};
-util.inherits(module.exports.ISO_8859_7, sbcs);
-
-module.exports.ISO_8859_8 = function() {
-
-  this.byteMap = function() {
-    return [
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0xB5, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
-      0xF8, 0xF9, 0xFA, 0x20, 0x20, 0x20, 0x20, 0x20
-    ];
-  };
-
-  this.ngrams = function() {
-    return [
-      new NGramsPlusLang('he', [
-        0x20E0E5, 0x20E0E7, 0x20E0E9, 0x20E0FA, 0x20E1E9, 0x20E1EE, 0x20E4E0, 0x20E4E5,
-        0x20E4E9, 0x20E4EE, 0x20E4F2, 0x20E4F9, 0x20E4FA, 0x20ECE0, 0x20ECE4, 0x20EEE0,
-        0x20F2EC, 0x20F9EC, 0xE0FA20, 0xE420E0, 0xE420E1, 0xE420E4, 0xE420EC, 0xE420EE,
-        0xE420F9, 0xE4E5E0, 0xE5E020, 0xE5ED20, 0xE5EF20, 0xE5F820, 0xE5FA20, 0xE920E4,
-        0xE9E420, 0xE9E5FA, 0xE9E9ED, 0xE9ED20, 0xE9EF20, 0xE9F820, 0xE9FA20, 0xEC20E0,
-        0xEC20E4, 0xECE020, 0xECE420, 0xED20E0, 0xED20E1, 0xED20E4, 0xED20EC, 0xED20EE,
-        0xED20F9, 0xEEE420, 0xEF20E4, 0xF0E420, 0xF0E920, 0xF0E9ED, 0xF2EC20, 0xF820E4,
-        0xF8E9ED, 0xF9EC20, 0xFA20E0, 0xFA20E1, 0xFA20E4, 0xFA20EC, 0xFA20EE, 0xFA20F9,
-      ]),
-      new NGramsPlusLang('he', [
-        0x20E0E5, 0x20E0EC, 0x20E4E9, 0x20E4EC, 0x20E4EE, 0x20E4F0, 0x20E9F0, 0x20ECF2,
-        0x20ECF9, 0x20EDE5, 0x20EDE9, 0x20EFE5, 0x20EFE9, 0x20F8E5, 0x20F8E9, 0x20FAE0,
-        0x20FAE5, 0x20FAE9, 0xE020E4, 0xE020EC, 0xE020ED, 0xE020FA, 0xE0E420, 0xE0E5E4,
-        0xE0EC20, 0xE0EE20, 0xE120E4, 0xE120ED, 0xE120FA, 0xE420E4, 0xE420E9, 0xE420EC,
-        0xE420ED, 0xE420EF, 0xE420F8, 0xE420FA, 0xE4EC20, 0xE5E020, 0xE5E420, 0xE7E020,
-        0xE9E020, 0xE9E120, 0xE9E420, 0xEC20E4, 0xEC20ED, 0xEC20FA, 0xECF220, 0xECF920,
-        0xEDE9E9, 0xEDE9F0, 0xEDE9F8, 0xEE20E4, 0xEE20ED, 0xEE20FA, 0xEEE120, 0xEEE420,
-        0xF2E420, 0xF920E4, 0xF920ED, 0xF920FA, 0xF9E420, 0xFAE020, 0xFAE420, 0xFAE5E9,
-      ])
-    ];
-  };
-
-  this.name = function(det) {
-    return (det && det.fC1Bytes) ? 'windows-1255' : 'ISO-8859-8';
-  };
-
-  this.language = function() {
-    return 'he';
-  };
-
-};
-util.inherits(module.exports.ISO_8859_8, sbcs);
-
-
-module.exports.ISO_8859_9 = function() {
-  this.byteMap = function() {
-    return [
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0xAA, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0xB5, 0x20, 0x20,
-      0x20, 0x20, 0xBA, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0x20,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0x69, 0xFE, 0xDF,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0x20,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
-    ];
-  };
-
-  this.ngrams = function() {
-    return [
-      0x206261, 0x206269, 0x206275, 0x206461, 0x206465, 0x206765, 0x206861, 0x20696C,
-      0x206B61, 0x206B6F, 0x206D61, 0x206F6C, 0x207361, 0x207461, 0x207665, 0x207961,
-      0x612062, 0x616B20, 0x616C61, 0x616D61, 0x616E20, 0x616EFD, 0x617220, 0x617261,
-      0x6172FD, 0x6173FD, 0x617961, 0x626972, 0x646120, 0x646520, 0x646920, 0x652062,
-      0x65206B, 0x656469, 0x656E20, 0x657220, 0x657269, 0x657369, 0x696C65, 0x696E20,
-      0x696E69, 0x697220, 0x6C616E, 0x6C6172, 0x6C6520, 0x6C6572, 0x6E2061, 0x6E2062,
-      0x6E206B, 0x6E6461, 0x6E6465, 0x6E6520, 0x6E6920, 0x6E696E, 0x6EFD20, 0x72696E,
-      0x72FD6E, 0x766520, 0x796120, 0x796F72, 0xFD6E20, 0xFD6E64, 0xFD6EFD, 0xFDF0FD
-    ];
-  };
-
-  this.name = function(det) {
-    return (det && det.fC1Bytes) ? 'windows-1254' : 'ISO-8859-9';
-  };
-
-  this.language = function() {
-    return 'tr';
-  };
-};
-util.inherits(module.exports.ISO_8859_9, sbcs);
-
-
-module.exports.windows_1251 = function() {
-  this.byteMap = function() {
-    return [
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x90, 0x83, 0x20, 0x83, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x9A, 0x20, 0x9C, 0x9D, 0x9E, 0x9F,
-      0x90, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x9A, 0x20, 0x9C, 0x9D, 0x9E, 0x9F,
-      0x20, 0xA2, 0xA2, 0xBC, 0x20, 0xB4, 0x20, 0x20,
-      0xB8, 0x20, 0xBA, 0x20, 0x20, 0x20, 0x20, 0xBF,
-      0x20, 0x20, 0xB3, 0xB3, 0xB4, 0xB5, 0x20, 0x20,
-      0xB8, 0x20, 0xBA, 0x20, 0xBC, 0xBE, 0xBE, 0xBF,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
-      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
-    ];
-  };
-
-  this.ngrams = function() {
-    return [
-      0x20E220, 0x20E2EE, 0x20E4EE, 0x20E7E0, 0x20E820, 0x20EAE0, 0x20EAEE, 0x20EDE0,
-      0x20EDE5, 0x20EEE1, 0x20EFEE, 0x20EFF0, 0x20F0E0, 0x20F1EE, 0x20F1F2, 0x20F2EE,
-      0x20F7F2, 0x20FDF2, 0xE0EDE8, 0xE0F2FC, 0xE3EE20, 0xE5EBFC, 0xE5EDE8, 0xE5F1F2,
-      0xE5F220, 0xE820EF, 0xE8E520, 0xE8E820, 0xE8FF20, 0xEBE5ED, 0xEBE820, 0xEBFCED,
-      0xEDE020, 0xEDE520, 0xEDE8E5, 0xEDE8FF, 0xEDEE20, 0xEDEEE2, 0xEE20E2, 0xEE20EF,
-      0xEE20F1, 0xEEE220, 0xEEE2E0, 0xEEE3EE, 0xEEE920, 0xEEEBFC, 0xEEEC20, 0xEEF1F2,
-      0xEFEEEB, 0xEFF0E5, 0xEFF0E8, 0xEFF0EE, 0xF0E0E2, 0xF0E5E4, 0xF1F2E0, 0xF1F2E2,
-      0xF1F2E8, 0xF1FF20, 0xF2E5EB, 0xF2EE20, 0xF2EEF0, 0xF2FC20, 0xF7F2EE, 0xFBF520
-    ];
-  };
-
-  this.name = function(det) {
-    return 'windows-1251';
-  };
-
-  this.language = function() {
-    return 'ru';
-  };
-};
-util.inherits(module.exports.windows_1251, sbcs);
-
-
-module.exports.windows_1256 = function() {
-  this.byteMap = function() {
-    return [
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x81, 0x20, 0x83, 0x20, 0x20, 0x20, 0x20,
-      0x88, 0x20, 0x8A, 0x20, 0x9C, 0x8D, 0x8E, 0x8F,
-      0x90, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x98, 0x20, 0x9A, 0x20, 0x9C, 0x20, 0x20, 0x9F,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0xAA, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0xB5, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
-      0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
-      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0x20,
-      0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
-      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-      0x20, 0x20, 0x20, 0x20, 0xF4, 0x20, 0x20, 0x20,
-      0x20, 0xF9, 0x20, 0xFB, 0xFC, 0x20, 0x20, 0xFF
-    ];
-  };
-
-  this.ngrams = function() {
-    return [
-      0x20C7E1, 0x20C7E4, 0x20C8C7, 0x20DAE1, 0x20DDED, 0x20E1E1, 0x20E3E4, 0x20E6C7,
-      0xC720C7, 0xC7C120, 0xC7CA20, 0xC7D120, 0xC7E120, 0xC7E1C3, 0xC7E1C7, 0xC7E1C8,
-      0xC7E1CA, 0xC7E1CC, 0xC7E1CD, 0xC7E1CF, 0xC7E1D3, 0xC7E1DA, 0xC7E1DE, 0xC7E1E3,
-      0xC7E1E6, 0xC7E1ED, 0xC7E320, 0xC7E420, 0xC7E4CA, 0xC820C7, 0xC920C7, 0xC920DD,
-      0xC920E1, 0xC920E3, 0xC920E6, 0xCA20C7, 0xCF20C7, 0xCFC920, 0xD120C7, 0xD1C920,
-      0xD320C7, 0xDA20C7, 0xDAE1EC, 0xDDED20, 0xE120C7, 0xE1C920, 0xE1EC20, 0xE1ED20,
-      0xE320C7, 0xE3C720, 0xE3C920, 0xE3E420, 0xE420C7, 0xE520C7, 0xE5C720, 0xE6C7E1,
-      0xE6E420, 0xEC20C7, 0xED20C7, 0xED20E3, 0xED20E6, 0xEDC920, 0xEDD120, 0xEDE420
-    ];
-  };
-
-  this.name = function(det) {
-    return 'windows-1256';
-  };
-
-  this.language = function() {
-    return 'ar';
-  };
-};
-util.inherits(module.exports.windows_1256, sbcs);
-
-
-module.exports.KOI8_R = function() {
-  this.byteMap = function() {
-    return [
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0xA3, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0xA3, 0x20, 0x20, 0x20, 0x20,
-      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-      0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
-      0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
-      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
-      0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
-      0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
-      0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
-      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
-      0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF
-    ];
-  };
-
-  this.ngrams = function() {
-    return [
-      0x20C4CF, 0x20C920, 0x20CBC1, 0x20CBCF, 0x20CEC1, 0x20CEC5, 0x20CFC2, 0x20D0CF,
-      0x20D0D2, 0x20D2C1, 0x20D3CF, 0x20D3D4, 0x20D4CF, 0x20D720, 0x20D7CF, 0x20DAC1,
-      0x20DCD4, 0x20DED4, 0xC1CEC9, 0xC1D4D8, 0xC5CCD8, 0xC5CEC9, 0xC5D3D4, 0xC5D420,
-      0xC7CF20, 0xC920D0, 0xC9C520, 0xC9C920, 0xC9D120, 0xCCC5CE, 0xCCC920, 0xCCD8CE,
-      0xCEC120, 0xCEC520, 0xCEC9C5, 0xCEC9D1, 0xCECF20, 0xCECFD7, 0xCF20D0, 0xCF20D3,
-      0xCF20D7, 0xCFC7CF, 0xCFCA20, 0xCFCCD8, 0xCFCD20, 0xCFD3D4, 0xCFD720, 0xCFD7C1,
-      0xD0CFCC, 0xD0D2C5, 0xD0D2C9, 0xD0D2CF, 0xD2C1D7, 0xD2C5C4, 0xD3D120, 0xD3D4C1,
-      0xD3D4C9, 0xD3D4D7, 0xD4C5CC, 0xD4CF20, 0xD4CFD2, 0xD4D820, 0xD9C820, 0xDED4CF
-    ];
-  };
-
-  this.name = function(det) {
-    return 'KOI8-R';
-  };
-
-  this.language = function() {
-    return 'ru';
-  };
-};
-util.inherits(module.exports.KOI8_R, sbcs);
-
-
-/*
-module.exports.ISO_8859_7 = function() {
-  this.byteMap = function() {
-    return [
-
-    ];
-  };
-
-  this.ngrams = function() {
-    return [
-
-    ];
-  };
-
-  this.name = function(det) {
-    if (typeof det == 'undefined')
-      return 'ISO-8859-7';
-    return det.fC1Bytes ? 'windows-1253' : 'ISO-8859-7';
-  };
-
-  this.language = function() {
-    return 'el';
-  };
-};
-util.inherits(module.exports.ISO_8859_7, sbcs);
-*/
-
diff --git a/node_modules/chardet/encoding/unicode.js b/node_modules/chardet/encoding/unicode.js
deleted file mode 100644
index 6458d79..0000000
--- a/node_modules/chardet/encoding/unicode.js
+++ /dev/null
@@ -1,112 +0,0 @@
-'use strict';
-var util = require('util'),
-  Match = require ('../match');
-
-/**
- * This class matches UTF-16 and UTF-32, both big- and little-endian. The
- * BOM will be used if it is present.
- */
-module.exports.UTF_16BE = function() {
-  this.name = function() {
-    return 'UTF-16BE';
-  };
-  this.match = function(det) {
-    var input = det.fRawInput;
-
-    if (input.length >= 2 && ((input[0] & 0xff) == 0xfe && (input[1] & 0xff) == 0xff)) {
-      return new Match(det, this, 100); // confidence = 100
-    }
-
-    // TODO: Do some statistics to check for unsigned UTF-16BE
-    return null;
-  };
-};
-
-module.exports.UTF_16LE = function() {
-  this.name = function() {
-    return 'UTF-16LE';
-  };
-  this.match = function(det) {
-    var input = det.fRawInput;
-
-    if (input.length >= 2 && ((input[0] & 0xff) == 0xff && (input[1] & 0xff) == 0xfe)) {
-      // LE BOM is present.
-      if (input.length >= 4 && input[2] == 0x00 && input[3] == 0x00) {
-        // It is probably UTF-32 LE, not UTF-16
-        return null;
-      }
-      return new Match(det, this, 100); // confidence = 100
-    }
-
-    // TODO: Do some statistics to check for unsigned UTF-16LE
-    return null;
-  }
-};
-
-function UTF_32() {};
-UTF_32.prototype.match = function(det) {
-  var input      = det.fRawInput,
-    limit      = (det.fRawLength / 4) * 4,
-    numValid   = 0,
-    numInvalid = 0,
-    hasBOM     = false,
-    confidence = 0;
-
-  if (limit == 0) {
-    return null;
-  }
-
-  if (this.getChar(input, 0) == 0x0000FEFF) {
-    hasBOM = true;
-  }
-
-  for (var i = 0; i < limit; i += 4) {
-    var ch = this.getChar(input, i);
-
-    if (ch < 0 || ch >= 0x10FFFF || (ch >= 0xD800 && ch <= 0xDFFF)) {
-      numInvalid += 1;
-    } else {
-      numValid += 1;
-    }
-  }
-
-  // Cook up some sort of confidence score, based on presence of a BOM
-  //    and the existence of valid and/or invalid multi-byte sequences.
-  if (hasBOM && numInvalid == 0) {
-    confidence = 100;
-  } else if (hasBOM && numValid > numInvalid * 10) {
-    confidence = 80;
-  } else if (numValid > 3 && numInvalid == 0) {
-    confidence = 100;
-  } else if (numValid > 0 && numInvalid == 0) {
-    confidence = 80;
-  } else if (numValid > numInvalid * 10) {
-    // Probably corrupt UTF-32BE data.  Valid sequences aren't likely by chance.
-    confidence = 25;
-  }
-
-  // return confidence == 0 ? null : new CharsetMatch(det, this, confidence);
-  return confidence == 0 ? null : new Match(det, this, confidence);
-};
-
-module.exports.UTF_32BE = function() {
-  this.name = function() {
-    return 'UTF-32BE';
-  };
-  this.getChar = function(input, index) {
-    return (input[index + 0] & 0xff) << 24 | (input[index + 1] & 0xff) << 16 |
-         (input[index + 2] & 0xff) <<  8 | (input[index + 3] & 0xff);
-  };
-};
-util.inherits(module.exports.UTF_32BE, UTF_32);
-
-module.exports.UTF_32LE = function() {
-  this.name = function() {
-    return 'UTF-32LE';
-  };
-  this.getChar = function(input, index) {
-    return (input[index + 3] & 0xff) << 24 | (input[index + 2] & 0xff) << 16 |
-         (input[index + 1] & 0xff) <<  8 | (input[index + 0] & 0xff);
-  };
-};
-util.inherits(module.exports.UTF_32LE, UTF_32);
diff --git a/node_modules/chardet/encoding/utf8.js b/node_modules/chardet/encoding/utf8.js
deleted file mode 100644
index c996ce2..0000000
--- a/node_modules/chardet/encoding/utf8.js
+++ /dev/null
@@ -1,84 +0,0 @@
-
-var Match = require ('../match');
-
-/**
- * Charset recognizer for UTF-8
- */
-module.exports = function() {
-  this.name = function() {
-    return 'UTF-8';
-  };
-  this.match = function(det) {
-
-    var hasBOM = false,
-      numValid = 0,
-      numInvalid = 0,
-      input = det.fRawInput,
-      trailBytes = 0,
-      confidence;
-
-    if (det.fRawLength >= 3 &&
-      (input[0] & 0xff) == 0xef && (input[1] & 0xff) == 0xbb && (input[2] & 0xff) == 0xbf) {
-      hasBOM = true;
-    }
-
-    // Scan for multi-byte sequences
-    for (var i = 0; i < det.fRawLength; i++) {
-      var b = input[i];
-      if ((b & 0x80) == 0)
-        continue; // ASCII
-
-      // Hi bit on char found.  Figure out how long the sequence should be
-      if ((b & 0x0e0) == 0x0c0) {
-        trailBytes = 1;
-      } else if ((b & 0x0f0) == 0x0e0) {
-        trailBytes = 2;
-      } else if ((b & 0x0f8) == 0xf0) {
-        trailBytes = 3;
-      } else {
-        numInvalid++;
-        if (numInvalid > 5)
-          break;
-        trailBytes = 0;
-      }
-
-      // Verify that we've got the right number of trail bytes in the sequence
-      for (;;) {
-        i++;
-        if (i >= det.fRawLength)
-          break;
-
-        if ((input[i] & 0xc0) != 0x080) {
-          numInvalid++;
-          break;
-        }
-        if (--trailBytes == 0) {
-          numValid++;
-          break;
-        }
-      }
-    }
-
-    // Cook up some sort of confidence score, based on presense of a BOM
-    //    and the existence of valid and/or invalid multi-byte sequences.
-    confidence = 0;
-    if (hasBOM && numInvalid == 0)
-      confidence = 100;
-    else if (hasBOM && numValid > numInvalid * 10)
-      confidence = 80;
-    else if (numValid > 3 && numInvalid == 0)
-      confidence = 100;
-    else if (numValid > 0 && numInvalid == 0)
-      confidence = 80;
-    else if (numValid == 0 && numInvalid == 0)
-      // Plain ASCII.
-      confidence = 10;
-    else if (numValid > numInvalid * 10)
-      // Probably corruput utf-8 data.  Valid sequences aren't likely by chance.
-      confidence = 25;
-    else
-      return null
-
-    return new Match(det, this, confidence);
-  };
-};
diff --git a/node_modules/chardet/index.js b/node_modules/chardet/index.js
deleted file mode 100644
index 91b2bec..0000000
--- a/node_modules/chardet/index.js
+++ /dev/null
@@ -1,151 +0,0 @@
-
-var fs = require('fs');
-
-var utf8  = require('./encoding/utf8'),
-  unicode = require('./encoding/unicode'),
-  mbcs    = require('./encoding/mbcs'),
-  sbcs    = require('./encoding/sbcs'),
-  iso2022 = require('./encoding/iso2022');
-
-var self = this;
-
-var recognisers = [
-  new utf8,
-  new unicode.UTF_16BE,
-  new unicode.UTF_16LE,
-  new unicode.UTF_32BE,
-  new unicode.UTF_32LE,
-  new mbcs.sjis,
-  new mbcs.big5,
-  new mbcs.euc_jp,
-  new mbcs.euc_kr,
-  new mbcs.gb_18030,
-  new iso2022.ISO_2022_JP,
-  new iso2022.ISO_2022_KR,
-  new iso2022.ISO_2022_CN,
-  new sbcs.ISO_8859_1,
-  new sbcs.ISO_8859_2,
-  new sbcs.ISO_8859_5,
-  new sbcs.ISO_8859_6,
-  new sbcs.ISO_8859_7,
-  new sbcs.ISO_8859_8,
-  new sbcs.ISO_8859_9,
-  new sbcs.windows_1251,
-  new sbcs.windows_1256,
-  new sbcs.KOI8_R
-];
-
-module.exports.detect = function(buffer, opts) {
-
-  // Tally up the byte occurence statistics.
-  var fByteStats = [];
-  for (var i = 0; i < 256; i++)
-    fByteStats[i] = 0;
-
-  for (var i = buffer.length - 1; i >= 0; i--)
-    fByteStats[buffer[i] & 0x00ff]++;
-
-  var fC1Bytes = false;
-  for (var i = 0x80; i <= 0x9F; i += 1) {
-    if (fByteStats[i] != 0) {
-      fC1Bytes = true;
-      break;
-    }
-  }
-
-  var context = {
-    fByteStats:  fByteStats,
-    fC1Bytes:    fC1Bytes,
-    fRawInput:   buffer,
-    fRawLength:  buffer.length,
-    fInputBytes: buffer,
-    fInputLen:   buffer.length
-  };
-
-  var matches = recognisers.map(function(rec) {
-    return rec.match(context);
-  }).filter(function(match) {
-    return !!match;
-  }).sort(function(a, b) {
-    return b.confidence - a.confidence;
-  });
-
-  if (opts && opts.returnAllMatches === true) {
-    return matches;
-  }
-  else {
-    return matches.length > 0 ? matches[0].name : null;
-  }
-};
-
-module.exports.detectFile = function(filepath, opts, cb) {
-  if (typeof opts === 'function') {
-    cb = opts;
-    opts = undefined;
-  }
-
-  var fd;
-
-  var handler = function(err, buffer) {
-    if (fd) {
-      fs.closeSync(fd);
-    }
-
-    if (err) return cb(err, null);
-    cb(null, self.detect(buffer, opts));
-  };
-
-  if (opts && opts.sampleSize) {
-    fd = fs.openSync(filepath, 'r'),
-      sample = Buffer.allocUnsafe(opts.sampleSize);
-
-    fs.read(fd, sample, 0, opts.sampleSize, null, function(err) {
-      handler(err, sample);
-    });
-    return;
-  }
-
-  fs.readFile(filepath, handler);
-};
-
-module.exports.detectFileSync = function(filepath, opts) {
-  if (opts && opts.sampleSize) {
-    var fd = fs.openSync(filepath, 'r'),
-      sample = Buffer.allocUnsafe(opts.sampleSize);
-
-    fs.readSync(fd, sample, 0, opts.sampleSize);
-    fs.closeSync(fd);
-    return self.detect(sample, opts);
-  }
-
-  return self.detect(fs.readFileSync(filepath), opts);
-};
-
-// Wrappers for the previous functions to return all encodings
-module.exports.detectAll = function(buffer, opts) {
-  if (typeof opts !== 'object') {
-    opts = {};
-  }
-  opts.returnAllMatches = true;
-  return self.detect(buffer, opts);
-}
-
-module.exports.detectFileAll = function(filepath, opts, cb) {
-  if (typeof opts === 'function') {
-    cb = opts;
-    opts = undefined;
-  }
-  if (typeof opts !== 'object') {
-    opts = {};
-  }
-  opts.returnAllMatches = true;
-  self.detectFile(filepath, opts, cb);
-}
-
-module.exports.detectFileAllSync = function(filepath, opts) {
-  if (typeof opts !== 'object') {
-    opts = {};
-  }
-  opts.returnAllMatches = true;
-  return self.detectFileSync(filepath, opts);
-}
diff --git a/node_modules/chardet/match.js b/node_modules/chardet/match.js
deleted file mode 100644
index d52faa2..0000000
--- a/node_modules/chardet/match.js
+++ /dev/null
@@ -1,6 +0,0 @@
-
-module.exports = function(det, rec, confidence, name, lang) {
-  this.confidence = confidence;
-  this.name = name || rec.name(det);
-  this.lang = lang;
-};
diff --git a/node_modules/chardet/package.json b/node_modules/chardet/package.json
deleted file mode 100644
index af046ba..0000000
--- a/node_modules/chardet/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "name": "chardet",
-  "version": "0.7.0",
-  "homepage": "https://github.com/runk/node-chardet",
-  "description": "Character detector",
-  "keywords": [
-    "encoding",
-    "character",
-    "utf8",
-    "detector",
-    "chardet",
-    "icu"
-  ],
-  "author": "Dmitry Shirokov <deadrunk@gmail.com>",
-  "contributors": [
-    "@spikying",
-    "@wtgtybhertgeghgtwtg",
-    "@suisho",
-    "@seangarner",
-    "@zevanty"
-  ],
-  "devDependencies": {
-    "github-publish-release": "^5.0.0",
-    "mocha": "^5.2.0"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:runk/node-chardet.git"
-  },
-  "bugs": {
-    "mail": "deadrunk@gmail.com",
-    "url": "http://github.com/runk/node-chardet/issues"
-  },
-  "scripts": {
-    "test": "mocha -R spec --recursive --bail",
-    "release": "scripts/release"
-  },
-  "main": "index.js",
-  "engine": {
-    "node": ">=4"
-  },
-  "readmeFilename": "README.md",
-  "directories": {
-    "test": "test"
-  },
-  "license": "MIT"
-}
diff --git a/node_modules/cli-cursor/index.d.ts b/node_modules/cli-cursor/index.d.ts
deleted file mode 100644
index 2b252d0..0000000
--- a/node_modules/cli-cursor/index.d.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-/// <reference types="node"/>
-
-/**
-Show cursor.
-
-@param stream - Default: `process.stderr`.
-
-@example
-```
-import * as cliCursor from 'cli-cursor';
-
-cliCursor.show();
-```
-*/
-export function show(stream?: NodeJS.WritableStream): void;
-
-/**
-Hide cursor.
-
-@param stream - Default: `process.stderr`.
-
-@example
-```
-import * as cliCursor from 'cli-cursor';
-
-cliCursor.hide();
-```
-*/
-export function hide(stream?: NodeJS.WritableStream): void;
-
-/**
-Toggle cursor visibility.
-
-@param force - Is useful to show or hide the cursor based on a boolean.
-@param stream - Default: `process.stderr`.
-
-@example
-```
-import * as cliCursor from 'cli-cursor';
-
-const unicornsAreAwesome = true;
-cliCursor.toggle(unicornsAreAwesome);
-```
-*/
-export function toggle(force?: boolean, stream?: NodeJS.WritableStream): void;
diff --git a/node_modules/cli-cursor/index.js b/node_modules/cli-cursor/index.js
deleted file mode 100644
index 710c405..0000000
--- a/node_modules/cli-cursor/index.js
+++ /dev/null
@@ -1,35 +0,0 @@
-'use strict';
-const restoreCursor = require('restore-cursor');
-
-let isHidden = false;
-
-exports.show = (writableStream = process.stderr) => {
-	if (!writableStream.isTTY) {
-		return;
-	}
-
-	isHidden = false;
-	writableStream.write('\u001B[?25h');
-};
-
-exports.hide = (writableStream = process.stderr) => {
-	if (!writableStream.isTTY) {
-		return;
-	}
-
-	restoreCursor();
-	isHidden = true;
-	writableStream.write('\u001B[?25l');
-};
-
-exports.toggle = (force, writableStream) => {
-	if (force !== undefined) {
-		isHidden = force;
-	}
-
-	if (isHidden) {
-		exports.show(writableStream);
-	} else {
-		exports.hide(writableStream);
-	}
-};
diff --git a/node_modules/cli-cursor/package.json b/node_modules/cli-cursor/package.json
deleted file mode 100644
index 5ce1e65..0000000
--- a/node_modules/cli-cursor/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-	"name": "cli-cursor",
-	"version": "3.1.0",
-	"description": "Toggle the CLI cursor",
-	"license": "MIT",
-	"repository": "sindresorhus/cli-cursor",
-	"author": {
-		"name": "Sindre Sorhus",
-		"email": "sindresorhus@gmail.com",
-		"url": "sindresorhus.com"
-	},
-	"engines": {
-		"node": ">=8"
-	},
-	"scripts": {
-		"test": "xo && ava && tsd"
-	},
-	"files": [
-		"index.js",
-		"index.d.ts"
-	],
-	"keywords": [
-		"cli",
-		"cursor",
-		"ansi",
-		"toggle",
-		"display",
-		"show",
-		"hide",
-		"term",
-		"terminal",
-		"console",
-		"tty",
-		"shell",
-		"command-line"
-	],
-	"dependencies": {
-		"restore-cursor": "^3.1.0"
-	},
-	"devDependencies": {
-		"@types/node": "^12.0.7",
-		"ava": "^2.1.0",
-		"tsd": "^0.7.2",
-		"xo": "^0.24.0"
-	}
-}
diff --git a/node_modules/cli-cursor/readme.md b/node_modules/cli-cursor/readme.md
deleted file mode 100644
index 3478ac8..0000000
--- a/node_modules/cli-cursor/readme.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# cli-cursor [![Build Status](https://travis-ci.org/sindresorhus/cli-cursor.svg?branch=master)](https://travis-ci.org/sindresorhus/cli-cursor)
-
-> Toggle the CLI cursor
-
-The cursor is [gracefully restored](https://github.com/sindresorhus/restore-cursor) if the process exits.
-
-
-## Install
-
-```
-$ npm install cli-cursor
-```
-
-
-## Usage
-
-```js
-const cliCursor = require('cli-cursor');
-
-cliCursor.hide();
-
-const unicornsAreAwesome = true;
-cliCursor.toggle(unicornsAreAwesome);
-```
-
-
-## API
-
-### .show(stream?)
-
-### .hide(stream?)
-
-### .toggle(force?, stream?)
-
-#### force
-
-Useful for showing or hiding the cursor based on a boolean.
-
-#### stream
-
-Type: `stream.Writable`<br>
-Default: `process.stderr`
-
-
----
-
-<div align="center">
-	<b>
-		<a href="https://tidelift.com/subscription/pkg/npm-cli-cursor?utm_source=npm-cli-cursor&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
-	</b>
-	<br>
-	<sub>
-		Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
-	</sub>
-</div>
diff --git a/node_modules/cli-width/.npmignore b/node_modules/cli-width/.npmignore
deleted file mode 100644
index 2db169c..0000000
--- a/node_modules/cli-width/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-test
-coverage
-CHANGELOG.md
diff --git a/node_modules/cli-width/.travis.yml b/node_modules/cli-width/.travis.yml
deleted file mode 100644
index 7a188cb..0000000
--- a/node_modules/cli-width/.travis.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-language: node_js
-node_js:
-  - '0.10'
-  - '0.11'
-  - '0.12'
-  - 'iojs-1'
-  - 'iojs-2'
-  - 'iojs-3'
-  - '4.0'
-after_script:
-  - npm run coveralls
diff --git a/node_modules/cli-width/CHANGELOG.md b/node_modules/cli-width/CHANGELOG.md
deleted file mode 100644
index c46429b..0000000
--- a/node_modules/cli-width/CHANGELOG.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
-
-<a name="2.2.0"></a>
-# [2.2.0](https://github.com/knownasilya/cli-width/compare/v2.1.1...v2.2.0) (2017-08-22)
-
-
-### Features
-
-* return default if env is 0 ([1833baf](https://github.com/knownasilya/cli-width/commit/1833baf)), closes [#9](https://github.com/knownasilya/cli-width/issues/9)
-
-
-
-<a name="2.1.1"></a>
-## [2.1.1](https://github.com/knownasilya/cli-width/compare/v2.1.0...v2.1.1) (2017-08-22)
diff --git a/node_modules/cli-width/LICENSE b/node_modules/cli-width/LICENSE
deleted file mode 100644
index 173ed31..0000000
--- a/node_modules/cli-width/LICENSE
+++ /dev/null
@@ -1,13 +0,0 @@
-Copyright (c) 2015, Ilya Radchenko <ilya@burstcreations.com>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/cli-width/README.md b/node_modules/cli-width/README.md
deleted file mode 100644
index b7157ea..0000000
--- a/node_modules/cli-width/README.md
+++ /dev/null
@@ -1,72 +0,0 @@
-cli-width
-=========
-
-Get stdout window width, with four fallbacks, `tty`, `output.columns`, a custom environment variable and then a default.
-
-[![npm version](https://badge.fury.io/js/cli-width.svg)](http://badge.fury.io/js/cli-width)
-[![Build Status](https://travis-ci.org/knownasilya/cli-width.svg)](https://travis-ci.org/knownasilya/cli-width)
-[![Coverage Status](https://coveralls.io/repos/knownasilya/cli-width/badge.svg?branch=master&service=github)](https://coveralls.io/github/knownasilya/cli-width?branch=master)
-
-## Usage
-
-```
-npm install --save cli-width
-```
-
-```js
-'use strict';
-
-var cliWidth = require('cli-width');
-
-cliWidth(); // maybe 204 :)
-```
-
-You can also set the `CLI_WIDTH` environment variable.
-
-If none of the methods are supported, and the environment variable isn't set,
-the default width value is going to be `0`, that can be changed using the configurable `options`.
-
-## API
-
-### cliWidth([options])
-
-`cliWidth` can be configured using an `options` parameter, the possible properties are:
-
-- **defaultWidth**\<number\> Defines a default value to be used if none of the methods are available, defaults to `0`
-- **output**\<object\> A stream to be used to read width values from, defaults to `process.stdout`
-- **tty**\<object\> TTY module to try to read width from as a fallback, defaults to `require('tty')`
-
-
-### Examples
-
-Defining both a default width value and a stream output to try to read from:
-
-```js
-var cliWidth = require('cli-width');
-var ttys = require('ttys');
-
-cliWidth({
-  defaultWidth: 80,
-  output: ttys.output
-});
-```
-
-Defines a different tty module to read width from:
-
-```js
-var cliWidth = require('cli-width');
-var ttys = require('ttys');
-
-cliWidth({
-  tty: ttys
-});
-```
-
-## Tests
-
-```bash
-npm install
-npm test
-```
-
-Coverage can be generated with `npm run coverage`.
diff --git a/node_modules/cli-width/index.js b/node_modules/cli-width/index.js
deleted file mode 100644
index de939f3..0000000
--- a/node_modules/cli-width/index.js
+++ /dev/null
@@ -1,49 +0,0 @@
-'use strict';
-
-exports = module.exports = cliWidth;
-
-function normalizeOpts(options) {
-  var defaultOpts = {
-    defaultWidth: 0,
-    output: process.stdout,
-    tty: require('tty')
-  };
-
-  if (!options) {
-    return defaultOpts;
-  } else {
-    Object.keys(defaultOpts).forEach(function (key) {
-      if (!options[key]) {
-        options[key] = defaultOpts[key];
-      }
-    });
-
-    return options;
-  }
-}
-
-function cliWidth(options) {
-  var opts = normalizeOpts(options);
-
-  if (opts.output.getWindowSize) {
-    return opts.output.getWindowSize()[0] || opts.defaultWidth;
-  } else {
-    if (opts.tty.getWindowSize) {
-      return opts.tty.getWindowSize()[1] || opts.defaultWidth;
-    } else {
-      if (opts.output.columns) {
-        return opts.output.columns;
-      } else {
-        if (process.env.CLI_WIDTH) {
-          var width = parseInt(process.env.CLI_WIDTH, 10);
-
-          if (!isNaN(width) && width !== 0) {
-            return width;
-          }
-        }
-      }
-
-      return opts.defaultWidth;
-    }
-  }
-};
diff --git a/node_modules/cli-width/package.json b/node_modules/cli-width/package.json
deleted file mode 100644
index 765800d..0000000
--- a/node_modules/cli-width/package.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "name": "cli-width",
-  "version": "2.2.0",
-  "description": "Get stdout window width, with two fallbacks, tty and then a default.",
-  "main": "index.js",
-  "scripts": {
-    "test": "node test | tspec",
-    "coverage": "isparta cover test/*.js | tspec",
-    "coveralls": "npm run coverage -s && coveralls < coverage/lcov.info",
-    "postcoveralls": "rimraf ./coverage",
-    "release": "standard-version"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:knownasilya/cli-width.git"
-  },
-  "author": "Ilya Radchenko <ilya@burstcreations.com>",
-  "license": "ISC",
-  "bugs": {
-    "url": "https://github.com/knownasilya/cli-width/issues"
-  },
-  "homepage": "https://github.com/knownasilya/cli-width",
-  "devDependencies": {
-    "coveralls": "^2.11.4",
-    "isparta": "^3.0.4",
-    "rimraf": "^2.4.3",
-    "standard-version": "^4.2.0",
-    "tap-spec": "^4.1.0",
-    "tape": "^3.4.0"
-  }
-}
diff --git a/node_modules/commander/CHANGELOG.md b/node_modules/commander/CHANGELOG.md
deleted file mode 100644
index 7dce779..0000000
--- a/node_modules/commander/CHANGELOG.md
+++ /dev/null
@@ -1,419 +0,0 @@
-2.20.3 / 2019-10-11
-==================
-
-  * Support Node.js 0.10 (Revert #1059)
-  * Ran "npm unpublish commander@2.20.2". There is no 2.20.2.
-
-2.20.1 / 2019-09-29
-==================
-
-  * Improve executable subcommand tracking
-  * Update dev dependencies
-
-2.20.0 / 2019-04-02
-==================
-
-  * fix: resolve symbolic links completely when hunting for subcommands (#935)
-  * Update index.d.ts (#930)
-  * Update Readme.md (#924)
-  * Remove --save option as it isn't required anymore (#918)
-  * Add link to the license file (#900)
-  * Added example of receiving args from options (#858)
-  * Added missing semicolon (#882)
-  * Add extension to .eslintrc (#876)
-
-2.19.0 / 2018-10-02
-==================
-
-  * Removed newline after Options and Commands headers (#864)
-  * Bugfix - Error output (#862)
-  * Fix to change default value to string (#856)
-
-2.18.0 / 2018-09-07
-==================
-
-  * Standardize help output (#853)
-  * chmod 644 travis.yml (#851)
-  * add support for execute typescript subcommand via ts-node (#849)
-
-2.17.1 / 2018-08-07
-==================
-
-  * Fix bug in command emit (#844)
-
-2.17.0 / 2018-08-03
-==================
-
-  * fixed newline output after help information (#833)
-  * Fix to emit the action even without command (#778)
-  * npm update (#823)
-
-2.16.0 / 2018-06-29
-==================
-
-  * Remove Makefile and `test/run` (#821)
-  * Make 'npm test' run on Windows (#820)
-  * Add badge to display install size (#807)
-  * chore: cache node_modules (#814)
-  * chore: remove Node.js 4 (EOL), add Node.js 10 (#813)
-  * fixed typo in readme (#812)
-  * Fix types (#804)
-  * Update eslint to resolve vulnerabilities in lodash (#799)
-  * updated readme with custom event listeners. (#791)
-  * fix tests (#794)
-
-2.15.0 / 2018-03-07
-==================
-
-  * Update downloads badge to point to graph of downloads over time instead of duplicating link to npm
-  * Arguments description
-
-2.14.1 / 2018-02-07
-==================
-
-  * Fix typing of help function
-
-2.14.0 / 2018-02-05
-==================
-
-  * only register the option:version event once
-  * Fixes issue #727: Passing empty string for option on command is set to undefined
-  * enable eqeqeq rule
-  * resolves #754 add linter configuration to project
-  * resolves #560 respect custom name for version option
-  * document how to override the version flag
-  * document using options per command
-
-2.13.0 / 2018-01-09
-==================
-
-  * Do not print default for --no-
-  * remove trailing spaces in command help
-  * Update CI's Node.js to LTS and latest version
-  * typedefs: Command and Option types added to commander namespace
-
-2.12.2 / 2017-11-28
-==================
-
-  * fix: typings are not shipped
-
-2.12.1 / 2017-11-23
-==================
-
-  * Move @types/node to dev dependency
-
-2.12.0 / 2017-11-22
-==================
-
-  * add attributeName() method to Option objects
-  * Documentation updated for options with --no prefix
-  * typings: `outputHelp` takes a string as the first parameter
-  * typings: use overloads
-  * feat(typings): update to match js api
-  * Print default value in option help
-  * Fix translation error
-  * Fail when using same command and alias (#491)
-  * feat(typings): add help callback
-  * fix bug when description is add after command with options (#662)
-  * Format js code
-  * Rename History.md to CHANGELOG.md (#668)
-  * feat(typings): add typings to support TypeScript (#646)
-  * use current node
-
-2.11.0 / 2017-07-03
-==================
-
-  * Fix help section order and padding (#652)
-  * feature: support for signals to subcommands (#632)
-  * Fixed #37, --help should not display first (#447)
-  * Fix translation errors. (#570)
-  * Add package-lock.json
-  * Remove engines
-  * Upgrade package version
-  * Prefix events to prevent conflicts between commands and options (#494)
-  * Removing dependency on graceful-readlink
-  * Support setting name in #name function and make it chainable
-  * Add .vscode directory to .gitignore (Visual Studio Code metadata)
-  * Updated link to ruby commander in readme files
-
-2.10.0 / 2017-06-19
-==================
-
-  * Update .travis.yml. drop support for older node.js versions.
-  * Fix require arguments in README.md
-  * On SemVer you do not start from 0.0.1
-  * Add missing semi colon in readme
-  * Add save param to npm install
-  * node v6 travis test
-  * Update Readme_zh-CN.md
-  * Allow literal '--' to be passed-through as an argument
-  * Test subcommand alias help
-  * link build badge to master branch
-  * Support the alias of Git style sub-command
-  * added keyword commander for better search result on npm
-  * Fix Sub-Subcommands
-  * test node.js stable
-  * Fixes TypeError when a command has an option called `--description`
-  * Update README.md to make it beginner friendly and elaborate on the difference between angled and square brackets.
-  * Add chinese Readme file
-
-2.9.0 / 2015-10-13
-==================
-
-  * Add option `isDefault` to set default subcommand #415 @Qix-
-  * Add callback to allow filtering or post-processing of help text #434 @djulien
-  * Fix `undefined` text in help information close #414 #416 @zhiyelee
-
-2.8.1 / 2015-04-22
-==================
-
- * Back out `support multiline description` Close #396 #397
-
-2.8.0 / 2015-04-07
-==================
-
-  * Add `process.execArg` support, execution args like `--harmony` will be passed to sub-commands #387 @DigitalIO @zhiyelee
-  * Fix bug in Git-style sub-commands #372 @zhiyelee
-  * Allow commands to be hidden from help #383 @tonylukasavage
-  * When git-style sub-commands are in use, yet none are called, display help #382 @claylo
-  * Add ability to specify arguments syntax for top-level command #258 @rrthomas
-  * Support multiline descriptions #208 @zxqfox
-
-2.7.1 / 2015-03-11
-==================
-
- * Revert #347 (fix collisions when option and first arg have same name) which causes a bug in #367.
-
-2.7.0 / 2015-03-09
-==================
-
- * Fix git-style bug when installed globally. Close #335 #349 @zhiyelee
- * Fix collisions when option and first arg have same name. Close #346 #347 @tonylukasavage
- * Add support for camelCase on `opts()`. Close #353  @nkzawa
- * Add node.js 0.12 and io.js to travis.yml
- * Allow RegEx options. #337 @palanik
- * Fixes exit code when sub-command failing.  Close #260 #332 @pirelenito
- * git-style `bin` files in $PATH make sense. Close #196 #327  @zhiyelee
-
-2.6.0 / 2014-12-30
-==================
-
-  * added `Command#allowUnknownOption` method. Close #138 #318 @doozr @zhiyelee
-  * Add application description to the help msg. Close #112 @dalssoft
-
-2.5.1 / 2014-12-15
-==================
-
-  * fixed two bugs incurred by variadic arguments. Close #291 @Quentin01 #302 @zhiyelee
-
-2.5.0 / 2014-10-24
-==================
-
- * add support for variadic arguments. Closes #277 @whitlockjc
-
-2.4.0 / 2014-10-17
-==================
-
- * fixed a bug on executing the coercion function of subcommands option. Closes #270
- * added `Command.prototype.name` to retrieve command name. Closes #264 #266 @tonylukasavage
- * added `Command.prototype.opts` to retrieve all the options as a simple object of key-value pairs. Closes #262 @tonylukasavage
- * fixed a bug on subcommand name. Closes #248 @jonathandelgado
- * fixed function normalize doesn’t honor option terminator. Closes #216 @abbr
-
-2.3.0 / 2014-07-16
-==================
-
- * add command alias'. Closes PR #210
- * fix: Typos. Closes #99
- * fix: Unused fs module. Closes #217
-
-2.2.0 / 2014-03-29
-==================
-
- * add passing of previous option value
- * fix: support subcommands on windows. Closes #142
- * Now the defaultValue passed as the second argument of the coercion function.
-
-2.1.0 / 2013-11-21
-==================
-
- * add: allow cflag style option params, unit test, fixes #174
-
-2.0.0 / 2013-07-18
-==================
-
- * remove input methods (.prompt, .confirm, etc)
-
-1.3.2 / 2013-07-18
-==================
-
- * add support for sub-commands to co-exist with the original command
-
-1.3.1 / 2013-07-18
-==================
-
- * add quick .runningCommand hack so you can opt-out of other logic when running a sub command
-
-1.3.0 / 2013-07-09
-==================
-
- * add EACCES error handling
- * fix sub-command --help
-
-1.2.0 / 2013-06-13
-==================
-
- * allow "-" hyphen as an option argument
- * support for RegExp coercion
-
-1.1.1 / 2012-11-20
-==================
-
-  * add more sub-command padding
-  * fix .usage() when args are present. Closes #106
-
-1.1.0 / 2012-11-16
-==================
-
-  * add git-style executable subcommand support. Closes #94
-
-1.0.5 / 2012-10-09
-==================
-
-  * fix `--name` clobbering. Closes #92
-  * fix examples/help. Closes #89
-
-1.0.4 / 2012-09-03
-==================
-
-  * add `outputHelp()` method.
-
-1.0.3 / 2012-08-30
-==================
-
-  * remove invalid .version() defaulting
-
-1.0.2 / 2012-08-24
-==================
-
-  * add `--foo=bar` support [arv]
-  * fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus]
-
-1.0.1 / 2012-08-03
-==================
-
-  * fix issue #56
-  * fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode())
-
-1.0.0 / 2012-07-05
-==================
-
-  * add support for optional option descriptions
-  * add defaulting of `.version()` to package.json's version
-
-0.6.1 / 2012-06-01
-==================
-
-  * Added: append (yes or no) on confirmation
-  * Added: allow node.js v0.7.x
-
-0.6.0 / 2012-04-10
-==================
-
-  * Added `.prompt(obj, callback)` support. Closes #49
-  * Added default support to .choose(). Closes #41
-  * Fixed the choice example
-
-0.5.1 / 2011-12-20
-==================
-
-  * Fixed `password()` for recent nodes. Closes #36
-
-0.5.0 / 2011-12-04
-==================
-
-  * Added sub-command option support [itay]
-
-0.4.3 / 2011-12-04
-==================
-
-  * Fixed custom help ordering. Closes #32
-
-0.4.2 / 2011-11-24
-==================
-
-  * Added travis support
-  * Fixed: line-buffered input automatically trimmed. Closes #31
-
-0.4.1 / 2011-11-18
-==================
-
-  * Removed listening for "close" on --help
-
-0.4.0 / 2011-11-15
-==================
-
-  * Added support for `--`. Closes #24
-
-0.3.3 / 2011-11-14
-==================
-
-  * Fixed: wait for close event when writing help info [Jerry Hamlet]
-
-0.3.2 / 2011-11-01
-==================
-
-  * Fixed long flag definitions with values [felixge]
-
-0.3.1 / 2011-10-31
-==================
-
-  * Changed `--version` short flag to `-V` from `-v`
-  * Changed `.version()` so it's configurable [felixge]
-
-0.3.0 / 2011-10-31
-==================
-
-  * Added support for long flags only. Closes #18
-
-0.2.1 / 2011-10-24
-==================
-
-  * "node": ">= 0.4.x < 0.7.0". Closes #20
-
-0.2.0 / 2011-09-26
-==================
-
-  * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs]
-
-0.1.0 / 2011-08-24
-==================
-
-  * Added support for custom `--help` output
-
-0.0.5 / 2011-08-18
-==================
-
-  * Changed: when the user enters nothing prompt for password again
-  * Fixed issue with passwords beginning with numbers [NuckChorris]
-
-0.0.4 / 2011-08-15
-==================
-
-  * Fixed `Commander#args`
-
-0.0.3 / 2011-08-15
-==================
-
-  * Added default option value support
-
-0.0.2 / 2011-08-15
-==================
-
-  * Added mask support to `Command#password(str[, mask], fn)`
-  * Added `Command#password(str, fn)`
-
-0.0.1 / 2010-01-03
-==================
-
-  * Initial release
diff --git a/node_modules/commander/LICENSE b/node_modules/commander/LICENSE
deleted file mode 100644
index 10f997a..0000000
--- a/node_modules/commander/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
-
-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/node_modules/commander/Readme.md b/node_modules/commander/Readme.md
deleted file mode 100644
index c846e7a..0000000
--- a/node_modules/commander/Readme.md
+++ /dev/null
@@ -1,428 +0,0 @@
-# Commander.js
-
-
-[![Build Status](https://api.travis-ci.org/tj/commander.js.svg?branch=master)](http://travis-ci.org/tj/commander.js)
-[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander)
-[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://npmcharts.com/compare/commander?minimal=true)
-[![Install Size](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander)
-[![Join the chat at https://gitter.im/tj/commander.js](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/tj/commander.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-  The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/commander-rb/commander).  
-  [API documentation](http://tj.github.com/commander.js/)
-
-
-## Installation
-
-    $ npm install commander
-
-## Option parsing
-
-Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
-  .version('0.1.0')
-  .option('-p, --peppers', 'Add peppers')
-  .option('-P, --pineapple', 'Add pineapple')
-  .option('-b, --bbq-sauce', 'Add bbq sauce')
-  .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
-  .parse(process.argv);
-
-console.log('you ordered a pizza with:');
-if (program.peppers) console.log('  - peppers');
-if (program.pineapple) console.log('  - pineapple');
-if (program.bbqSauce) console.log('  - bbq');
-console.log('  - %s cheese', program.cheese);
-```
-
-Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.
-
-Note that multi-word options starting with `--no` prefix negate the boolean value of the following word. For example, `--no-sauce` sets the value of `program.sauce` to false.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
-  .option('--no-sauce', 'Remove sauce')
-  .parse(process.argv);
-
-console.log('you ordered a pizza');
-if (program.sauce) console.log('  with sauce');
-else console.log(' without sauce');
-```
-
-To get string arguments from options you will need to use angle brackets <> for required inputs or square brackets [] for optional inputs. 
-
-e.g. ```.option('-m --myarg [myVar]', 'my super cool description')```
-
-Then to access the input if it was passed in.
-
-e.g. ```var myInput = program.myarg```
-
-**NOTE**: If you pass a argument without using brackets the example above will return true and not the value passed in.
-
-
-## Version option
-
-Calling the `version` implicitly adds the `-V` and `--version` options to the command.
-When either of these options is present, the command prints the version number and exits.
-
-    $ ./examples/pizza -V
-    0.0.1
-
-If you want your program to respond to the `-v` option instead of the `-V` option, simply pass custom flags to the `version` method using the same syntax as the `option` method.
-
-```js
-program
-  .version('0.0.1', '-v, --version')
-```
-
-The version flags can be named anything, but the long option is required.
-
-## Command-specific options
-
-You can attach options to a command.
-
-```js
-#!/usr/bin/env node
-
-var program = require('commander');
-
-program
-  .command('rm <dir>')
-  .option('-r, --recursive', 'Remove recursively')
-  .action(function (dir, cmd) {
-    console.log('remove ' + dir + (cmd.recursive ? ' recursively' : ''))
-  })
-
-program.parse(process.argv)
-```
-
-A command's options are validated when the command is used. Any unknown options will be reported as an error. However, if an action-based command does not define an action, then the options are not validated.
-
-## Coercion
-
-```js
-function range(val) {
-  return val.split('..').map(Number);
-}
-
-function list(val) {
-  return val.split(',');
-}
-
-function collect(val, memo) {
-  memo.push(val);
-  return memo;
-}
-
-function increaseVerbosity(v, total) {
-  return total + 1;
-}
-
-program
-  .version('0.1.0')
-  .usage('[options] <file ...>')
-  .option('-i, --integer <n>', 'An integer argument', parseInt)
-  .option('-f, --float <n>', 'A float argument', parseFloat)
-  .option('-r, --range <a>..<b>', 'A range', range)
-  .option('-l, --list <items>', 'A list', list)
-  .option('-o, --optional [value]', 'An optional value')
-  .option('-c, --collect [value]', 'A repeatable value', collect, [])
-  .option('-v, --verbose', 'A value that can be increased', increaseVerbosity, 0)
-  .parse(process.argv);
-
-console.log(' int: %j', program.integer);
-console.log(' float: %j', program.float);
-console.log(' optional: %j', program.optional);
-program.range = program.range || [];
-console.log(' range: %j..%j', program.range[0], program.range[1]);
-console.log(' list: %j', program.list);
-console.log(' collect: %j', program.collect);
-console.log(' verbosity: %j', program.verbose);
-console.log(' args: %j', program.args);
-```
-
-## Regular Expression
-```js
-program
-  .version('0.1.0')
-  .option('-s --size <size>', 'Pizza size', /^(large|medium|small)$/i, 'medium')
-  .option('-d --drink [drink]', 'Drink', /^(coke|pepsi|izze)$/i)
-  .parse(process.argv);
-
-console.log(' size: %j', program.size);
-console.log(' drink: %j', program.drink);
-```
-
-## Variadic arguments
-
- The last argument of a command can be variadic, and only the last argument.  To make an argument variadic you have to
- append `...` to the argument name.  Here is an example:
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
-  .version('0.1.0')
-  .command('rmdir <dir> [otherDirs...]')
-  .action(function (dir, otherDirs) {
-    console.log('rmdir %s', dir);
-    if (otherDirs) {
-      otherDirs.forEach(function (oDir) {
-        console.log('rmdir %s', oDir);
-      });
-    }
-  });
-
-program.parse(process.argv);
-```
-
- An `Array` is used for the value of a variadic argument.  This applies to `program.args` as well as the argument passed
- to your action as demonstrated above.
-
-## Specify the argument syntax
-
-```js
-#!/usr/bin/env node
-
-var program = require('commander');
-
-program
-  .version('0.1.0')
-  .arguments('<cmd> [env]')
-  .action(function (cmd, env) {
-     cmdValue = cmd;
-     envValue = env;
-  });
-
-program.parse(process.argv);
-
-if (typeof cmdValue === 'undefined') {
-   console.error('no command given!');
-   process.exit(1);
-}
-console.log('command:', cmdValue);
-console.log('environment:', envValue || "no environment given");
-```
-Angled brackets (e.g. `<cmd>`) indicate required input. Square brackets (e.g. `[env]`) indicate optional input.
-
-## Git-style sub-commands
-
-```js
-// file: ./examples/pm
-var program = require('commander');
-
-program
-  .version('0.1.0')
-  .command('install [name]', 'install one or more packages')
-  .command('search [query]', 'search with optional query')
-  .command('list', 'list packages installed', {isDefault: true})
-  .parse(process.argv);
-```
-
-When `.command()` is invoked with a description argument, no `.action(callback)` should be called to handle sub-commands, otherwise there will be an error. This tells commander that you're going to use separate executables for sub-commands, much like `git(1)` and other popular tools.  
-The commander will try to search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-command`, like `pm-install`, `pm-search`.
-
-Options can be passed with the call to `.command()`. Specifying `true` for `opts.noHelp` will remove the subcommand from the generated help output. Specifying `true` for `opts.isDefault` will run the subcommand if no other subcommand is specified.
-
-If the program is designed to be installed globally, make sure the executables have proper modes, like `755`.
-
-### `--harmony`
-
-You can enable `--harmony` option in two ways:
-* Use `#! /usr/bin/env node --harmony` in the sub-commands scripts. Note some os version don’t support this pattern.
-* Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning sub-command process.
-
-## Automated --help
-
- The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:
-
-```  
-$ ./examples/pizza --help
-Usage: pizza [options]
-
-An application for pizzas ordering
-
-Options:
-  -h, --help           output usage information
-  -V, --version        output the version number
-  -p, --peppers        Add peppers
-  -P, --pineapple      Add pineapple
-  -b, --bbq            Add bbq sauce
-  -c, --cheese <type>  Add the specified type of cheese [marble]
-  -C, --no-cheese      You do not want any cheese
-```
-
-## Custom help
-
- You can display arbitrary `-h, --help` information
- by listening for "--help". Commander will automatically
- exit once you are done so that the remainder of your program
- does not execute causing undesired behaviors, for example
- in the following executable "stuff" will not output when
- `--help` is used.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
-  .version('0.1.0')
-  .option('-f, --foo', 'enable some foo')
-  .option('-b, --bar', 'enable some bar')
-  .option('-B, --baz', 'enable some baz');
-
-// must be before .parse() since
-// node's emit() is immediate
-
-program.on('--help', function(){
-  console.log('')
-  console.log('Examples:');
-  console.log('  $ custom-help --help');
-  console.log('  $ custom-help -h');
-});
-
-program.parse(process.argv);
-
-console.log('stuff');
-```
-
-Yields the following help output when `node script-name.js -h` or `node script-name.js --help` are run:
-
-```
-Usage: custom-help [options]
-
-Options:
-  -h, --help     output usage information
-  -V, --version  output the version number
-  -f, --foo      enable some foo
-  -b, --bar      enable some bar
-  -B, --baz      enable some baz
-
-Examples:
-  $ custom-help --help
-  $ custom-help -h
-```
-
-## .outputHelp(cb)
-
-Output help information without exiting.
-Optional callback cb allows post-processing of help text before it is displayed.
-
-If you want to display help by default (e.g. if no command was provided), you can use something like:
-
-```js
-var program = require('commander');
-var colors = require('colors');
-
-program
-  .version('0.1.0')
-  .command('getstream [url]', 'get stream URL')
-  .parse(process.argv);
-
-if (!process.argv.slice(2).length) {
-  program.outputHelp(make_red);
-}
-
-function make_red(txt) {
-  return colors.red(txt); //display the help text in red on the console
-}
-```
-
-## .help(cb)
-
-  Output help information and exit immediately.
-  Optional callback cb allows post-processing of help text before it is displayed.
-
-
-## Custom event listeners
- You can execute custom actions by listening to command and option events.
-
-```js
-program.on('option:verbose', function () {
-  process.env.VERBOSE = this.verbose;
-});
-
-// error on unknown commands
-program.on('command:*', function () {
-  console.error('Invalid command: %s\nSee --help for a list of available commands.', program.args.join(' '));
-  process.exit(1);
-});
-```
-
-## Examples
-
-```js
-var program = require('commander');
-
-program
-  .version('0.1.0')
-  .option('-C, --chdir <path>', 'change the working directory')
-  .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
-  .option('-T, --no-tests', 'ignore test hook');
-
-program
-  .command('setup [env]')
-  .description('run setup commands for all envs')
-  .option("-s, --setup_mode [mode]", "Which setup mode to use")
-  .action(function(env, options){
-    var mode = options.setup_mode || "normal";
-    env = env || 'all';
-    console.log('setup for %s env(s) with %s mode', env, mode);
-  });
-
-program
-  .command('exec <cmd>')
-  .alias('ex')
-  .description('execute the given remote cmd')
-  .option("-e, --exec_mode <mode>", "Which exec mode to use")
-  .action(function(cmd, options){
-    console.log('exec "%s" using %s mode', cmd, options.exec_mode);
-  }).on('--help', function() {
-    console.log('');
-    console.log('Examples:');
-    console.log('');
-    console.log('  $ deploy exec sequential');
-    console.log('  $ deploy exec async');
-  });
-
-program
-  .command('*')
-  .action(function(env){
-    console.log('deploying "%s"', env);
-  });
-
-program.parse(process.argv);
-```
-
-More Demos can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory.
-
-## License
-
-[MIT](https://github.com/tj/commander.js/blob/master/LICENSE)
diff --git a/node_modules/commander/index.js b/node_modules/commander/index.js
deleted file mode 100644
index ec1d61d..0000000
--- a/node_modules/commander/index.js
+++ /dev/null
@@ -1,1224 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter;
-var spawn = require('child_process').spawn;
-var path = require('path');
-var dirname = path.dirname;
-var basename = path.basename;
-var fs = require('fs');
-
-/**
- * Inherit `Command` from `EventEmitter.prototype`.
- */
-
-require('util').inherits(Command, EventEmitter);
-
-/**
- * Expose the root command.
- */
-
-exports = module.exports = new Command();
-
-/**
- * Expose `Command`.
- */
-
-exports.Command = Command;
-
-/**
- * Expose `Option`.
- */
-
-exports.Option = Option;
-
-/**
- * Initialize a new `Option` with the given `flags` and `description`.
- *
- * @param {String} flags
- * @param {String} description
- * @api public
- */
-
-function Option(flags, description) {
-  this.flags = flags;
-  this.required = flags.indexOf('<') >= 0;
-  this.optional = flags.indexOf('[') >= 0;
-  this.bool = flags.indexOf('-no-') === -1;
-  flags = flags.split(/[ ,|]+/);
-  if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
-  this.long = flags.shift();
-  this.description = description || '';
-}
-
-/**
- * Return option name.
- *
- * @return {String}
- * @api private
- */
-
-Option.prototype.name = function() {
-  return this.long
-    .replace('--', '')
-    .replace('no-', '');
-};
-
-/**
- * Return option name, in a camelcase format that can be used
- * as a object attribute key.
- *
- * @return {String}
- * @api private
- */
-
-Option.prototype.attributeName = function() {
-  return camelcase(this.name());
-};
-
-/**
- * Check if `arg` matches the short or long flag.
- *
- * @param {String} arg
- * @return {Boolean}
- * @api private
- */
-
-Option.prototype.is = function(arg) {
-  return this.short === arg || this.long === arg;
-};
-
-/**
- * Initialize a new `Command`.
- *
- * @param {String} name
- * @api public
- */
-
-function Command(name) {
-  this.commands = [];
-  this.options = [];
-  this._execs = {};
-  this._allowUnknownOption = false;
-  this._args = [];
-  this._name = name || '';
-}
-
-/**
- * Add command `name`.
- *
- * The `.action()` callback is invoked when the
- * command `name` is specified via __ARGV__,
- * and the remaining arguments are applied to the
- * function for access.
- *
- * When the `name` is "*" an un-matched command
- * will be passed as the first arg, followed by
- * the rest of __ARGV__ remaining.
- *
- * Examples:
- *
- *      program
- *        .version('0.0.1')
- *        .option('-C, --chdir <path>', 'change the working directory')
- *        .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
- *        .option('-T, --no-tests', 'ignore test hook')
- *
- *      program
- *        .command('setup')
- *        .description('run remote setup commands')
- *        .action(function() {
- *          console.log('setup');
- *        });
- *
- *      program
- *        .command('exec <cmd>')
- *        .description('run the given remote command')
- *        .action(function(cmd) {
- *          console.log('exec "%s"', cmd);
- *        });
- *
- *      program
- *        .command('teardown <dir> [otherDirs...]')
- *        .description('run teardown commands')
- *        .action(function(dir, otherDirs) {
- *          console.log('dir "%s"', dir);
- *          if (otherDirs) {
- *            otherDirs.forEach(function (oDir) {
- *              console.log('dir "%s"', oDir);
- *            });
- *          }
- *        });
- *
- *      program
- *        .command('*')
- *        .description('deploy the given env')
- *        .action(function(env) {
- *          console.log('deploying "%s"', env);
- *        });
- *
- *      program.parse(process.argv);
-  *
- * @param {String} name
- * @param {String} [desc] for git-style sub-commands
- * @return {Command} the new command
- * @api public
- */
-
-Command.prototype.command = function(name, desc, opts) {
-  if (typeof desc === 'object' && desc !== null) {
-    opts = desc;
-    desc = null;
-  }
-  opts = opts || {};
-  var args = name.split(/ +/);
-  var cmd = new Command(args.shift());
-
-  if (desc) {
-    cmd.description(desc);
-    this.executables = true;
-    this._execs[cmd._name] = true;
-    if (opts.isDefault) this.defaultExecutable = cmd._name;
-  }
-  cmd._noHelp = !!opts.noHelp;
-  this.commands.push(cmd);
-  cmd.parseExpectedArgs(args);
-  cmd.parent = this;
-
-  if (desc) return this;
-  return cmd;
-};
-
-/**
- * Define argument syntax for the top-level command.
- *
- * @api public
- */
-
-Command.prototype.arguments = function(desc) {
-  return this.parseExpectedArgs(desc.split(/ +/));
-};
-
-/**
- * Add an implicit `help [cmd]` subcommand
- * which invokes `--help` for the given command.
- *
- * @api private
- */
-
-Command.prototype.addImplicitHelpCommand = function() {
-  this.command('help [cmd]', 'display help for [cmd]');
-};
-
-/**
- * Parse expected `args`.
- *
- * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parseExpectedArgs = function(args) {
-  if (!args.length) return;
-  var self = this;
-  args.forEach(function(arg) {
-    var argDetails = {
-      required: false,
-      name: '',
-      variadic: false
-    };
-
-    switch (arg[0]) {
-      case '<':
-        argDetails.required = true;
-        argDetails.name = arg.slice(1, -1);
-        break;
-      case '[':
-        argDetails.name = arg.slice(1, -1);
-        break;
-    }
-
-    if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') {
-      argDetails.variadic = true;
-      argDetails.name = argDetails.name.slice(0, -3);
-    }
-    if (argDetails.name) {
-      self._args.push(argDetails);
-    }
-  });
-  return this;
-};
-
-/**
- * Register callback `fn` for the command.
- *
- * Examples:
- *
- *      program
- *        .command('help')
- *        .description('display verbose help')
- *        .action(function() {
- *           // output help here
- *        });
- *
- * @param {Function} fn
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.action = function(fn) {
-  var self = this;
-  var listener = function(args, unknown) {
-    // Parse any so-far unknown options
-    args = args || [];
-    unknown = unknown || [];
-
-    var parsed = self.parseOptions(unknown);
-
-    // Output help if necessary
-    outputHelpIfNecessary(self, parsed.unknown);
-
-    // If there are still any unknown options, then we simply
-    // die, unless someone asked for help, in which case we give it
-    // to them, and then we die.
-    if (parsed.unknown.length > 0) {
-      self.unknownOption(parsed.unknown[0]);
-    }
-
-    // Leftover arguments need to be pushed back. Fixes issue #56
-    if (parsed.args.length) args = parsed.args.concat(args);
-
-    self._args.forEach(function(arg, i) {
-      if (arg.required && args[i] == null) {
-        self.missingArgument(arg.name);
-      } else if (arg.variadic) {
-        if (i !== self._args.length - 1) {
-          self.variadicArgNotLast(arg.name);
-        }
-
-        args[i] = args.splice(i);
-      }
-    });
-
-    // Always append ourselves to the end of the arguments,
-    // to make sure we match the number of arguments the user
-    // expects
-    if (self._args.length) {
-      args[self._args.length] = self;
-    } else {
-      args.push(self);
-    }
-
-    fn.apply(self, args);
-  };
-  var parent = this.parent || this;
-  var name = parent === this ? '*' : this._name;
-  parent.on('command:' + name, listener);
-  if (this._alias) parent.on('command:' + this._alias, listener);
-  return this;
-};
-
-/**
- * Define option with `flags`, `description` and optional
- * coercion `fn`.
- *
- * The `flags` string should contain both the short and long flags,
- * separated by comma, a pipe or space. The following are all valid
- * all will output this way when `--help` is used.
- *
- *    "-p, --pepper"
- *    "-p|--pepper"
- *    "-p --pepper"
- *
- * Examples:
- *
- *     // simple boolean defaulting to false
- *     program.option('-p, --pepper', 'add pepper');
- *
- *     --pepper
- *     program.pepper
- *     // => Boolean
- *
- *     // simple boolean defaulting to true
- *     program.option('-C, --no-cheese', 'remove cheese');
- *
- *     program.cheese
- *     // => true
- *
- *     --no-cheese
- *     program.cheese
- *     // => false
- *
- *     // required argument
- *     program.option('-C, --chdir <path>', 'change the working directory');
- *
- *     --chdir /tmp
- *     program.chdir
- *     // => "/tmp"
- *
- *     // optional argument
- *     program.option('-c, --cheese [type]', 'add cheese [marble]');
- *
- * @param {String} flags
- * @param {String} description
- * @param {Function|*} [fn] or default
- * @param {*} [defaultValue]
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.option = function(flags, description, fn, defaultValue) {
-  var self = this,
-    option = new Option(flags, description),
-    oname = option.name(),
-    name = option.attributeName();
-
-  // default as 3rd arg
-  if (typeof fn !== 'function') {
-    if (fn instanceof RegExp) {
-      var regex = fn;
-      fn = function(val, def) {
-        var m = regex.exec(val);
-        return m ? m[0] : def;
-      };
-    } else {
-      defaultValue = fn;
-      fn = null;
-    }
-  }
-
-  // preassign default value only for --no-*, [optional], or <required>
-  if (!option.bool || option.optional || option.required) {
-    // when --no-* we make sure default is true
-    if (!option.bool) defaultValue = true;
-    // preassign only if we have a default
-    if (defaultValue !== undefined) {
-      self[name] = defaultValue;
-      option.defaultValue = defaultValue;
-    }
-  }
-
-  // register the option
-  this.options.push(option);
-
-  // when it's passed assign the value
-  // and conditionally invoke the callback
-  this.on('option:' + oname, function(val) {
-    // coercion
-    if (val !== null && fn) {
-      val = fn(val, self[name] === undefined ? defaultValue : self[name]);
-    }
-
-    // unassigned or bool
-    if (typeof self[name] === 'boolean' || typeof self[name] === 'undefined') {
-      // if no value, bool true, and we have a default, then use it!
-      if (val == null) {
-        self[name] = option.bool
-          ? defaultValue || true
-          : false;
-      } else {
-        self[name] = val;
-      }
-    } else if (val !== null) {
-      // reassign
-      self[name] = val;
-    }
-  });
-
-  return this;
-};
-
-/**
- * Allow unknown options on the command line.
- *
- * @param {Boolean} arg if `true` or omitted, no error will be thrown
- * for unknown options.
- * @api public
- */
-Command.prototype.allowUnknownOption = function(arg) {
-  this._allowUnknownOption = arguments.length === 0 || arg;
-  return this;
-};
-
-/**
- * Parse `argv`, settings options and invoking commands when defined.
- *
- * @param {Array} argv
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parse = function(argv) {
-  // implicit help
-  if (this.executables) this.addImplicitHelpCommand();
-
-  // store raw args
-  this.rawArgs = argv;
-
-  // guess name
-  this._name = this._name || basename(argv[1], '.js');
-
-  // github-style sub-commands with no sub-command
-  if (this.executables && argv.length < 3 && !this.defaultExecutable) {
-    // this user needs help
-    argv.push('--help');
-  }
-
-  // process argv
-  var parsed = this.parseOptions(this.normalize(argv.slice(2)));
-  var args = this.args = parsed.args;
-
-  var result = this.parseArgs(this.args, parsed.unknown);
-
-  // executable sub-commands
-  var name = result.args[0];
-
-  var aliasCommand = null;
-  // check alias of sub commands
-  if (name) {
-    aliasCommand = this.commands.filter(function(command) {
-      return command.alias() === name;
-    })[0];
-  }
-
-  if (this._execs[name] === true) {
-    return this.executeSubCommand(argv, args, parsed.unknown);
-  } else if (aliasCommand) {
-    // is alias of a subCommand
-    args[0] = aliasCommand._name;
-    return this.executeSubCommand(argv, args, parsed.unknown);
-  } else if (this.defaultExecutable) {
-    // use the default subcommand
-    args.unshift(this.defaultExecutable);
-    return this.executeSubCommand(argv, args, parsed.unknown);
-  }
-
-  return result;
-};
-
-/**
- * Execute a sub-command executable.
- *
- * @param {Array} argv
- * @param {Array} args
- * @param {Array} unknown
- * @api private
- */
-
-Command.prototype.executeSubCommand = function(argv, args, unknown) {
-  args = args.concat(unknown);
-
-  if (!args.length) this.help();
-  if (args[0] === 'help' && args.length === 1) this.help();
-
-  // <cmd> --help
-  if (args[0] === 'help') {
-    args[0] = args[1];
-    args[1] = '--help';
-  }
-
-  // executable
-  var f = argv[1];
-  // name of the subcommand, link `pm-install`
-  var bin = basename(f, path.extname(f)) + '-' + args[0];
-
-  // In case of globally installed, get the base dir where executable
-  //  subcommand file should be located at
-  var baseDir;
-
-  var resolvedLink = fs.realpathSync(f);
-
-  baseDir = dirname(resolvedLink);
-
-  // prefer local `./<bin>` to bin in the $PATH
-  var localBin = path.join(baseDir, bin);
-
-  // whether bin file is a js script with explicit `.js` or `.ts` extension
-  var isExplicitJS = false;
-  if (exists(localBin + '.js')) {
-    bin = localBin + '.js';
-    isExplicitJS = true;
-  } else if (exists(localBin + '.ts')) {
-    bin = localBin + '.ts';
-    isExplicitJS = true;
-  } else if (exists(localBin)) {
-    bin = localBin;
-  }
-
-  args = args.slice(1);
-
-  var proc;
-  if (process.platform !== 'win32') {
-    if (isExplicitJS) {
-      args.unshift(bin);
-      // add executable arguments to spawn
-      args = (process.execArgv || []).concat(args);
-
-      proc = spawn(process.argv[0], args, { stdio: 'inherit', customFds: [0, 1, 2] });
-    } else {
-      proc = spawn(bin, args, { stdio: 'inherit', customFds: [0, 1, 2] });
-    }
-  } else {
-    args.unshift(bin);
-    proc = spawn(process.execPath, args, { stdio: 'inherit' });
-  }
-
-  var signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];
-  signals.forEach(function(signal) {
-    process.on(signal, function() {
-      if (proc.killed === false && proc.exitCode === null) {
-        proc.kill(signal);
-      }
-    });
-  });
-  proc.on('close', process.exit.bind(process));
-  proc.on('error', function(err) {
-    if (err.code === 'ENOENT') {
-      console.error('error: %s(1) does not exist, try --help', bin);
-    } else if (err.code === 'EACCES') {
-      console.error('error: %s(1) not executable. try chmod or run with root', bin);
-    }
-    process.exit(1);
-  });
-
-  // Store the reference to the child process
-  this.runningCommand = proc;
-};
-
-/**
- * Normalize `args`, splitting joined short flags. For example
- * the arg "-abc" is equivalent to "-a -b -c".
- * This also normalizes equal sign and splits "--abc=def" into "--abc def".
- *
- * @param {Array} args
- * @return {Array}
- * @api private
- */
-
-Command.prototype.normalize = function(args) {
-  var ret = [],
-    arg,
-    lastOpt,
-    index;
-
-  for (var i = 0, len = args.length; i < len; ++i) {
-    arg = args[i];
-    if (i > 0) {
-      lastOpt = this.optionFor(args[i - 1]);
-    }
-
-    if (arg === '--') {
-      // Honor option terminator
-      ret = ret.concat(args.slice(i));
-      break;
-    } else if (lastOpt && lastOpt.required) {
-      ret.push(arg);
-    } else if (arg.length > 1 && arg[0] === '-' && arg[1] !== '-') {
-      arg.slice(1).split('').forEach(function(c) {
-        ret.push('-' + c);
-      });
-    } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) {
-      ret.push(arg.slice(0, index), arg.slice(index + 1));
-    } else {
-      ret.push(arg);
-    }
-  }
-
-  return ret;
-};
-
-/**
- * Parse command `args`.
- *
- * When listener(s) are available those
- * callbacks are invoked, otherwise the "*"
- * event is emitted and those actions are invoked.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api private
- */
-
-Command.prototype.parseArgs = function(args, unknown) {
-  var name;
-
-  if (args.length) {
-    name = args[0];
-    if (this.listeners('command:' + name).length) {
-      this.emit('command:' + args.shift(), args, unknown);
-    } else {
-      this.emit('command:*', args);
-    }
-  } else {
-    outputHelpIfNecessary(this, unknown);
-
-    // If there were no args and we have unknown options,
-    // then they are extraneous and we need to error.
-    if (unknown.length > 0) {
-      this.unknownOption(unknown[0]);
-    }
-    if (this.commands.length === 0 &&
-        this._args.filter(function(a) { return a.required; }).length === 0) {
-      this.emit('command:*');
-    }
-  }
-
-  return this;
-};
-
-/**
- * Return an option matching `arg` if any.
- *
- * @param {String} arg
- * @return {Option}
- * @api private
- */
-
-Command.prototype.optionFor = function(arg) {
-  for (var i = 0, len = this.options.length; i < len; ++i) {
-    if (this.options[i].is(arg)) {
-      return this.options[i];
-    }
-  }
-};
-
-/**
- * Parse options from `argv` returning `argv`
- * void of these options.
- *
- * @param {Array} argv
- * @return {Array}
- * @api public
- */
-
-Command.prototype.parseOptions = function(argv) {
-  var args = [],
-    len = argv.length,
-    literal,
-    option,
-    arg;
-
-  var unknownOptions = [];
-
-  // parse options
-  for (var i = 0; i < len; ++i) {
-    arg = argv[i];
-
-    // literal args after --
-    if (literal) {
-      args.push(arg);
-      continue;
-    }
-
-    if (arg === '--') {
-      literal = true;
-      continue;
-    }
-
-    // find matching Option
-    option = this.optionFor(arg);
-
-    // option is defined
-    if (option) {
-      // requires arg
-      if (option.required) {
-        arg = argv[++i];
-        if (arg == null) return this.optionMissingArgument(option);
-        this.emit('option:' + option.name(), arg);
-      // optional arg
-      } else if (option.optional) {
-        arg = argv[i + 1];
-        if (arg == null || (arg[0] === '-' && arg !== '-')) {
-          arg = null;
-        } else {
-          ++i;
-        }
-        this.emit('option:' + option.name(), arg);
-      // bool
-      } else {
-        this.emit('option:' + option.name());
-      }
-      continue;
-    }
-
-    // looks like an option
-    if (arg.length > 1 && arg[0] === '-') {
-      unknownOptions.push(arg);
-
-      // If the next argument looks like it might be
-      // an argument for this option, we pass it on.
-      // If it isn't, then it'll simply be ignored
-      if ((i + 1) < argv.length && argv[i + 1][0] !== '-') {
-        unknownOptions.push(argv[++i]);
-      }
-      continue;
-    }
-
-    // arg
-    args.push(arg);
-  }
-
-  return { args: args, unknown: unknownOptions };
-};
-
-/**
- * Return an object containing options as key-value pairs
- *
- * @return {Object}
- * @api public
- */
-Command.prototype.opts = function() {
-  var result = {},
-    len = this.options.length;
-
-  for (var i = 0; i < len; i++) {
-    var key = this.options[i].attributeName();
-    result[key] = key === this._versionOptionName ? this._version : this[key];
-  }
-  return result;
-};
-
-/**
- * Argument `name` is missing.
- *
- * @param {String} name
- * @api private
- */
-
-Command.prototype.missingArgument = function(name) {
-  console.error("error: missing required argument `%s'", name);
-  process.exit(1);
-};
-
-/**
- * `Option` is missing an argument, but received `flag` or nothing.
- *
- * @param {String} option
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.optionMissingArgument = function(option, flag) {
-  if (flag) {
-    console.error("error: option `%s' argument missing, got `%s'", option.flags, flag);
-  } else {
-    console.error("error: option `%s' argument missing", option.flags);
-  }
-  process.exit(1);
-};
-
-/**
- * Unknown option `flag`.
- *
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.unknownOption = function(flag) {
-  if (this._allowUnknownOption) return;
-  console.error("error: unknown option `%s'", flag);
-  process.exit(1);
-};
-
-/**
- * Variadic argument with `name` is not the last argument as required.
- *
- * @param {String} name
- * @api private
- */
-
-Command.prototype.variadicArgNotLast = function(name) {
-  console.error("error: variadic arguments must be last `%s'", name);
-  process.exit(1);
-};
-
-/**
- * Set the program version to `str`.
- *
- * This method auto-registers the "-V, --version" flag
- * which will print the version number when passed.
- *
- * @param {String} str
- * @param {String} [flags]
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.version = function(str, flags) {
-  if (arguments.length === 0) return this._version;
-  this._version = str;
-  flags = flags || '-V, --version';
-  var versionOption = new Option(flags, 'output the version number');
-  this._versionOptionName = versionOption.long.substr(2) || 'version';
-  this.options.push(versionOption);
-  this.on('option:' + this._versionOptionName, function() {
-    process.stdout.write(str + '\n');
-    process.exit(0);
-  });
-  return this;
-};
-
-/**
- * Set the description to `str`.
- *
- * @param {String} str
- * @param {Object} argsDescription
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.description = function(str, argsDescription) {
-  if (arguments.length === 0) return this._description;
-  this._description = str;
-  this._argsDescription = argsDescription;
-  return this;
-};
-
-/**
- * Set an alias for the command
- *
- * @param {String} alias
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.alias = function(alias) {
-  var command = this;
-  if (this.commands.length !== 0) {
-    command = this.commands[this.commands.length - 1];
-  }
-
-  if (arguments.length === 0) return command._alias;
-
-  if (alias === command._name) throw new Error('Command alias can\'t be the same as its name');
-
-  command._alias = alias;
-  return this;
-};
-
-/**
- * Set / get the command usage `str`.
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.usage = function(str) {
-  var args = this._args.map(function(arg) {
-    return humanReadableArgName(arg);
-  });
-
-  var usage = '[options]' +
-    (this.commands.length ? ' [command]' : '') +
-    (this._args.length ? ' ' + args.join(' ') : '');
-
-  if (arguments.length === 0) return this._usage || usage;
-  this._usage = str;
-
-  return this;
-};
-
-/**
- * Get or set the name of the command
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.name = function(str) {
-  if (arguments.length === 0) return this._name;
-  this._name = str;
-  return this;
-};
-
-/**
- * Return prepared commands.
- *
- * @return {Array}
- * @api private
- */
-
-Command.prototype.prepareCommands = function() {
-  return this.commands.filter(function(cmd) {
-    return !cmd._noHelp;
-  }).map(function(cmd) {
-    var args = cmd._args.map(function(arg) {
-      return humanReadableArgName(arg);
-    }).join(' ');
-
-    return [
-      cmd._name +
-        (cmd._alias ? '|' + cmd._alias : '') +
-        (cmd.options.length ? ' [options]' : '') +
-        (args ? ' ' + args : ''),
-      cmd._description
-    ];
-  });
-};
-
-/**
- * Return the largest command length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestCommandLength = function() {
-  var commands = this.prepareCommands();
-  return commands.reduce(function(max, command) {
-    return Math.max(max, command[0].length);
-  }, 0);
-};
-
-/**
- * Return the largest option length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestOptionLength = function() {
-  var options = [].slice.call(this.options);
-  options.push({
-    flags: '-h, --help'
-  });
-  return options.reduce(function(max, option) {
-    return Math.max(max, option.flags.length);
-  }, 0);
-};
-
-/**
- * Return the largest arg length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestArgLength = function() {
-  return this._args.reduce(function(max, arg) {
-    return Math.max(max, arg.name.length);
-  }, 0);
-};
-
-/**
- * Return the pad width.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.padWidth = function() {
-  var width = this.largestOptionLength();
-  if (this._argsDescription && this._args.length) {
-    if (this.largestArgLength() > width) {
-      width = this.largestArgLength();
-    }
-  }
-
-  if (this.commands && this.commands.length) {
-    if (this.largestCommandLength() > width) {
-      width = this.largestCommandLength();
-    }
-  }
-
-  return width;
-};
-
-/**
- * Return help for options.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.optionHelp = function() {
-  var width = this.padWidth();
-
-  // Append the help information
-  return this.options.map(function(option) {
-    return pad(option.flags, width) + '  ' + option.description +
-      ((option.bool && option.defaultValue !== undefined) ? ' (default: ' + JSON.stringify(option.defaultValue) + ')' : '');
-  }).concat([pad('-h, --help', width) + '  ' + 'output usage information'])
-    .join('\n');
-};
-
-/**
- * Return command help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.commandHelp = function() {
-  if (!this.commands.length) return '';
-
-  var commands = this.prepareCommands();
-  var width = this.padWidth();
-
-  return [
-    'Commands:',
-    commands.map(function(cmd) {
-      var desc = cmd[1] ? '  ' + cmd[1] : '';
-      return (desc ? pad(cmd[0], width) : cmd[0]) + desc;
-    }).join('\n').replace(/^/gm, '  '),
-    ''
-  ].join('\n');
-};
-
-/**
- * Return program help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.helpInformation = function() {
-  var desc = [];
-  if (this._description) {
-    desc = [
-      this._description,
-      ''
-    ];
-
-    var argsDescription = this._argsDescription;
-    if (argsDescription && this._args.length) {
-      var width = this.padWidth();
-      desc.push('Arguments:');
-      desc.push('');
-      this._args.forEach(function(arg) {
-        desc.push('  ' + pad(arg.name, width) + '  ' + argsDescription[arg.name]);
-      });
-      desc.push('');
-    }
-  }
-
-  var cmdName = this._name;
-  if (this._alias) {
-    cmdName = cmdName + '|' + this._alias;
-  }
-  var usage = [
-    'Usage: ' + cmdName + ' ' + this.usage(),
-    ''
-  ];
-
-  var cmds = [];
-  var commandHelp = this.commandHelp();
-  if (commandHelp) cmds = [commandHelp];
-
-  var options = [
-    'Options:',
-    '' + this.optionHelp().replace(/^/gm, '  '),
-    ''
-  ];
-
-  return usage
-    .concat(desc)
-    .concat(options)
-    .concat(cmds)
-    .join('\n');
-};
-
-/**
- * Output help information for this command
- *
- * @api public
- */
-
-Command.prototype.outputHelp = function(cb) {
-  if (!cb) {
-    cb = function(passthru) {
-      return passthru;
-    };
-  }
-  process.stdout.write(cb(this.helpInformation()));
-  this.emit('--help');
-};
-
-/**
- * Output help information and exit.
- *
- * @api public
- */
-
-Command.prototype.help = function(cb) {
-  this.outputHelp(cb);
-  process.exit();
-};
-
-/**
- * Camel-case the given `flag`
- *
- * @param {String} flag
- * @return {String}
- * @api private
- */
-
-function camelcase(flag) {
-  return flag.split('-').reduce(function(str, word) {
-    return str + word[0].toUpperCase() + word.slice(1);
-  });
-}
-
-/**
- * Pad `str` to `width`.
- *
- * @param {String} str
- * @param {Number} width
- * @return {String}
- * @api private
- */
-
-function pad(str, width) {
-  var len = Math.max(0, width - str.length);
-  return str + Array(len + 1).join(' ');
-}
-
-/**
- * Output help information if necessary
- *
- * @param {Command} command to output help for
- * @param {Array} array of options to search for -h or --help
- * @api private
- */
-
-function outputHelpIfNecessary(cmd, options) {
-  options = options || [];
-  for (var i = 0; i < options.length; i++) {
-    if (options[i] === '--help' || options[i] === '-h') {
-      cmd.outputHelp();
-      process.exit(0);
-    }
-  }
-}
-
-/**
- * Takes an argument an returns its human readable equivalent for help usage.
- *
- * @param {Object} arg
- * @return {String}
- * @api private
- */
-
-function humanReadableArgName(arg) {
-  var nameOutput = arg.name + (arg.variadic === true ? '...' : '');
-
-  return arg.required
-    ? '<' + nameOutput + '>'
-    : '[' + nameOutput + ']';
-}
-
-// for versions before node v0.8 when there weren't `fs.existsSync`
-function exists(file) {
-  try {
-    if (fs.statSync(file).isFile()) {
-      return true;
-    }
-  } catch (e) {
-    return false;
-  }
-}
diff --git a/node_modules/commander/package.json b/node_modules/commander/package.json
deleted file mode 100644
index 0023c5c..0000000
--- a/node_modules/commander/package.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "commander",
-  "version": "2.20.3",
-  "description": "the complete solution for node.js command-line programs",
-  "keywords": [
-    "commander",
-    "command",
-    "option",
-    "parser"
-  ],
-  "author": "TJ Holowaychuk <tj@vision-media.ca>",
-  "license": "MIT",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/tj/commander.js.git"
-  },
-  "scripts": {
-    "lint": "eslint index.js",
-    "test": "node test/run.js && npm run test-typings",
-    "test-typings": "tsc -p tsconfig.json"
-  },
-  "main": "index",
-  "files": [
-    "index.js",
-    "typings/index.d.ts"
-  ],
-  "dependencies": {},
-  "devDependencies": {
-    "@types/node": "^12.7.8",
-    "eslint": "^6.4.0",
-    "should": "^13.2.3",
-    "sinon": "^7.5.0",
-    "standard": "^14.3.1",
-    "ts-node": "^8.4.1",
-    "typescript": "^3.6.3"
-  },
-  "typings": "typings/index.d.ts"
-}
diff --git a/node_modules/commander/typings/index.d.ts b/node_modules/commander/typings/index.d.ts
deleted file mode 100644
index bcda277..0000000
--- a/node_modules/commander/typings/index.d.ts
+++ /dev/null
@@ -1,310 +0,0 @@
-// Type definitions for commander 2.11
-// Project: https://github.com/visionmedia/commander.js
-// Definitions by: Alan Agius <https://github.com/alan-agius4>, Marcelo Dezem <https://github.com/mdezem>, vvakame <https://github.com/vvakame>, Jules Randolph <https://github.com/sveinburne>
-// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
-
-declare namespace local {
-
-  class Option {
-    flags: string;
-    required: boolean;
-    optional: boolean;
-    bool: boolean;
-    short?: string;
-    long: string;
-    description: string;
-
-    /**
-     * Initialize a new `Option` with the given `flags` and `description`.
-     *
-     * @param {string} flags
-     * @param {string} [description]
-     */
-    constructor(flags: string, description?: string);
-  }
-
-  class Command extends NodeJS.EventEmitter {
-    [key: string]: any;
-
-    args: string[];
-
-    /**
-     * Initialize a new `Command`.
-     *
-     * @param {string} [name]
-     */
-    constructor(name?: string);
-
-    /**
-     * Set the program version to `str`.
-     *
-     * This method auto-registers the "-V, --version" flag
-     * which will print the version number when passed.
-     *
-     * @param {string} str
-     * @param {string} [flags]
-     * @returns {Command} for chaining
-     */
-    version(str: string, flags?: string): Command;
-
-    /**
-     * Add command `name`.
-     *
-     * The `.action()` callback is invoked when the
-     * command `name` is specified via __ARGV__,
-     * and the remaining arguments are applied to the
-     * function for access.
-     *
-     * When the `name` is "*" an un-matched command
-     * will be passed as the first arg, followed by
-     * the rest of __ARGV__ remaining.
-     *
-     * @example
-     *      program
-     *        .version('0.0.1')
-     *        .option('-C, --chdir <path>', 'change the working directory')
-     *        .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
-     *        .option('-T, --no-tests', 'ignore test hook')
-     *
-     *      program
-     *        .command('setup')
-     *        .description('run remote setup commands')
-     *        .action(function() {
-     *          console.log('setup');
-     *        });
-     *
-     *      program
-     *        .command('exec <cmd>')
-     *        .description('run the given remote command')
-     *        .action(function(cmd) {
-     *          console.log('exec "%s"', cmd);
-     *        });
-     *
-     *      program
-     *        .command('teardown <dir> [otherDirs...]')
-     *        .description('run teardown commands')
-     *        .action(function(dir, otherDirs) {
-     *          console.log('dir "%s"', dir);
-     *          if (otherDirs) {
-     *            otherDirs.forEach(function (oDir) {
-     *              console.log('dir "%s"', oDir);
-     *            });
-     *          }
-     *        });
-     *
-     *      program
-     *        .command('*')
-     *        .description('deploy the given env')
-     *        .action(function(env) {
-     *          console.log('deploying "%s"', env);
-     *        });
-     *
-     *      program.parse(process.argv);
-     *
-     * @param {string} name
-     * @param {string} [desc] for git-style sub-commands
-     * @param {CommandOptions} [opts] command options
-     * @returns {Command} the new command
-     */
-    command(name: string, desc?: string, opts?: commander.CommandOptions): Command;
-
-    /**
-     * Define argument syntax for the top-level command.
-     *
-     * @param {string} desc
-     * @returns {Command} for chaining
-     */
-    arguments(desc: string): Command;
-
-    /**
-     * Parse expected `args`.
-     *
-     * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
-     *
-     * @param {string[]} args
-     * @returns {Command} for chaining
-     */
-    parseExpectedArgs(args: string[]): Command;
-
-    /**
-     * Register callback `fn` for the command.
-     *
-     * @example
-     *      program
-     *        .command('help')
-     *        .description('display verbose help')
-     *        .action(function() {
-     *           // output help here
-     *        });
-     *
-     * @param {(...args: any[]) => void} fn
-     * @returns {Command} for chaining
-     */
-    action(fn: (...args: any[]) => void): Command;
-
-    /**
-     * Define option with `flags`, `description` and optional
-     * coercion `fn`.
-     *
-     * The `flags` string should contain both the short and long flags,
-     * separated by comma, a pipe or space. The following are all valid
-     * all will output this way when `--help` is used.
-     *
-     *    "-p, --pepper"
-     *    "-p|--pepper"
-     *    "-p --pepper"
-     *
-     * @example
-     *     // simple boolean defaulting to false
-     *     program.option('-p, --pepper', 'add pepper');
-     *
-     *     --pepper
-     *     program.pepper
-     *     // => Boolean
-     *
-     *     // simple boolean defaulting to true
-     *     program.option('-C, --no-cheese', 'remove cheese');
-     *
-     *     program.cheese
-     *     // => true
-     *
-     *     --no-cheese
-     *     program.cheese
-     *     // => false
-     *
-     *     // required argument
-     *     program.option('-C, --chdir <path>', 'change the working directory');
-     *
-     *     --chdir /tmp
-     *     program.chdir
-     *     // => "/tmp"
-     *
-     *     // optional argument
-     *     program.option('-c, --cheese [type]', 'add cheese [marble]');
-     *
-     * @param {string} flags
-     * @param {string} [description]
-     * @param {((arg1: any, arg2: any) => void) | RegExp} [fn] function or default
-     * @param {*} [defaultValue]
-     * @returns {Command} for chaining
-     */
-    option(flags: string, description?: string, fn?: ((arg1: any, arg2: any) => void) | RegExp, defaultValue?: any): Command;
-    option(flags: string, description?: string, defaultValue?: any): Command;
-
-    /**
-     * Allow unknown options on the command line.
-     *
-     * @param {boolean} [arg] if `true` or omitted, no error will be thrown for unknown options.
-     * @returns {Command} for chaining
-     */
-    allowUnknownOption(arg?: boolean): Command;
-
-    /**
-     * Parse `argv`, settings options and invoking commands when defined.
-     *
-     * @param {string[]} argv
-     * @returns {Command} for chaining
-     */
-    parse(argv: string[]): Command;
-
-    /**
-     * Parse options from `argv` returning `argv` void of these options.
-     *
-     * @param {string[]} argv
-     * @returns {ParseOptionsResult}
-     */
-    parseOptions(argv: string[]): commander.ParseOptionsResult;
-
-    /**
-     * Return an object containing options as key-value pairs
-     *
-     * @returns {{[key: string]: any}}
-     */
-    opts(): { [key: string]: any };
-
-    /**
-     * Set the description to `str`.
-     *
-     * @param {string} str
-     * @param {{[argName: string]: string}} argsDescription
-     * @return {(Command | string)}
-     */
-    description(str: string, argsDescription?: {[argName: string]: string}): Command;
-    description(): string;
-
-    /**
-     * Set an alias for the command.
-     *
-     * @param {string} alias
-     * @return {(Command | string)}
-     */
-    alias(alias: string): Command;
-    alias(): string;
-
-    /**
-     * Set or get the command usage.
-     *
-     * @param {string} str
-     * @return {(Command | string)}
-     */
-    usage(str: string): Command;
-    usage(): string;
-
-    /**
-     * Set the name of the command.
-     *
-     * @param {string} str
-     * @return {Command}
-     */
-    name(str: string): Command;
-
-    /**
-     * Get the name of the command.
-     *
-     * @return {string}
-     */
-    name(): string;
-
-    /**
-     * Output help information for this command.
-     *
-     * @param {(str: string) => string} [cb]
-     */
-    outputHelp(cb?: (str: string) => string): void;
-
-    /** Output help information and exit.
-     *
-     * @param {(str: string) => string} [cb]
-     */
-    help(cb?: (str: string) => string): never;
-  }
-
-}
-
-declare namespace commander {
-
-    type Command = local.Command
-
-    type Option = local.Option
-
-    interface CommandOptions {
-        noHelp?: boolean;
-        isDefault?: boolean;
-    }
-
-    interface ParseOptionsResult {
-        args: string[];
-        unknown: string[];
-    }
-
-    interface CommanderStatic extends Command {
-        Command: typeof local.Command;
-        Option: typeof local.Option;
-        CommandOptions: CommandOptions;
-        ParseOptionsResult: ParseOptionsResult;
-    }
-
-}
-
-declare const commander: commander.CommanderStatic;
-export = commander;
diff --git a/node_modules/comment-parser/.eslintignore b/node_modules/comment-parser/.eslintignore
deleted file mode 100644
index 8d87b1d..0000000
--- a/node_modules/comment-parser/.eslintignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/*
diff --git a/node_modules/comment-parser/.eslintrc.json b/node_modules/comment-parser/.eslintrc.json
deleted file mode 100644
index dc82bd7..0000000
--- a/node_modules/comment-parser/.eslintrc.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "extends": "standard",
-  "env": {
-    "browser": true,
-    "node": true,
-    "mocha": true
-  },
-  "rules": {
-    "camelcase": "off"
-  }
-}
diff --git a/node_modules/comment-parser/CHANGELOG.md b/node_modules/comment-parser/CHANGELOG.md
deleted file mode 100644
index a406a22..0000000
--- a/node_modules/comment-parser/CHANGELOG.md
+++ /dev/null
@@ -1,91 +0,0 @@
-# v0.7.2
-- make stringify to start each line with * in multiline comments
-
-# v0.7.1
-- ensure non-space characters after asterisk are included in source
-
-# v0.7.0
-- allow fenced blocks in tag description, see opts.fence
-
-# v0.6.2
-- document TypeScript definitions
-
-# v0.6.1
-- adjust strigifier indentation
-
-# v0.6.0
-- soft-drop node@6 support
-- migrate to ES6 syntax
-- allow to generate comments out of parsed data
-
-# v0.5.5
-- allow loose tag names, e.g. @.tag, @-tag
-
-# v0.5.4
-- allow quoted literal names, e.g. `@tag "My Var" description`
-
-# v0.5.3
-- corrected TypeScript definitions
-
-# v0.5.2
-- added TypeScript definitions
-- removed `readable-stream` dependency
-
-# v0.5.1
-- Support for tab as separator between tag components.
-- Docs: Indicate when `optional` is `true`; `default` property
-
-# v0.5.0
-- line wrapping control with `opts.join`
-
-# v0.4.2
-- tolerate inconsistent lines alignment within block
-
-# v0.4.1
-- refactored parsing, allow to not start lines with "* " inside block
-
-# v0.3.2
-- fix RegExp for `description` extraction to allow $ char
-
-# v0.3.1
-- use `readable-stream` fro Node 0.8 comatibility
-- allow to pass optional parameters to `parse.file(path [,opts], done)`  
-- allow `parse.stream` to work with Buffers in addition to strings
-
-# v0.3.0
-- `feature` allow to use custom parsers
-- `feature` always include source, no `raw_value` option needed
-- `bugfix` always provide `optional` tag property
-- `refactor` clean up tests
-
-# v0.2.3
-
-- `bugfix` Accept `/** one line */` comments
-- `refactor` Get rid of `lodash` to avoid unnecessary extra size when bundled
-
-# v0.2.2
-
-- `feature` allow spaces in default values `@my-tag {my.type} [name=John Doe]`
-
-# v0.2.1
-
-- `refactor` make line pasing mechanism more tolerable
-
-# v0.2.0
-
-- `feature` include source line numbers in parsed data
-- `feature` optionally prevent dotten names expanding
-
-# v0.1.2
-
-- `bugfix` Allow to build nested tags from `name.subname` even if `name` wasn't d
-- `bugfix` Preserve indentation when extracting comments
-
-# v0.1.1
-
-- `improvement` `parse(source)` returns array of all blocks found in source or an empty array
-- `bugfix` fixed indented blocks parsing
-
-# v0.1.0
-
-Initial implementation
diff --git a/node_modules/comment-parser/LICENSE b/node_modules/comment-parser/LICENSE
deleted file mode 100644
index c91d3e7..0000000
--- a/node_modules/comment-parser/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Sergii Iavorskyi
-
-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.
\ No newline at end of file
diff --git a/node_modules/comment-parser/README.md b/node_modules/comment-parser/README.md
deleted file mode 100644
index bd857fd..0000000
--- a/node_modules/comment-parser/README.md
+++ /dev/null
@@ -1,221 +0,0 @@
-# comment-parser
-
-Generic JSDoc-like comment parser. This library is not intended to be documentation generator, but rather composite unit for it.
-
-`npm install comment-parser`
-
-Module provides `parse(s: string[, opts: object]): object[]` function which takes `/** ... */` comment string and returns array  of objects with parsed data.
-
-It is not trying to detect relations between tags or somehow recognize their meaning. Any tag can be used, as long as it satisfies the format.
-
-```javascript
-/**
- * Singleline or multiline description text. Line breaks are preserved.
- *
- * @some-tag {Type} name Singleline or multiline description text
- * @some-tag {Type} name.subname Singleline or multiline description text
- * @some-tag {Type} name.subname.subsubname Singleline or
- * multiline description text
- * @some-tag {Type} [optionalName=someDefault]
- * @another-tag
- */
-```
-
-this would be parsed into following
-
-```json
-[{
-  "tags": [{
-    "tag": "some-tag",
-    "type": "Type",
-    "name": "name",
-    "optional": false,
-    "description": "Singleline or multiline description text",
-    "line": 3,
-    "source": "@some-tag {Type} name Singleline or multiline description text"
-  }, {
-    "tag": "some-tag",
-    "type": "Type",
-    "name": "name.subname",
-    "optional": false,
-    "description": "Singleline or multiline description text",
-    "line": 4,
-    "source": "@some-tag {Type} name.subname Singleline or multiline description text"
-  }, {
-    "tag": "some-tag",
-    "type": "Type",
-    "name": "name.subname.subsubname",
-    "optional": false,
-    "description": "Singleline or\nmultiline description text",
-    "line": 5,
-    "source": "@some-tag {Type} name.subname.subsubname Singleline or\nmultiline description text"
-  }, {
-    "tag": "some-tag",
-    "type": "Type",
-    "name": "optionalName",
-    "optional": true,
-    "description": "",
-    "line": 7,
-    "default": "someDefault",
-    "source": "@some-tag {Type} [optionalName=someDefault]"
-  }, {
-    "tag": "another-tag",
-    "name": "",
-    "optional": false,
-    "type": "",
-    "description": "",
-    "line": 8,
-    "source": "@another-tag"
-  }],
-  "line": 0,
-  "description": "Singleline or multiline description text. Line breaks are preserved.",
-  "source": "Singleline or multiline description text. Line breaks are preserved.\n\n@some-tag {Type} name Singleline or multiline description text\n@some-tag {Type} name.subname Singleline or multiline description text\n@some-tag {Type} name.subname.subsubname Singleline or\nmultiline description text\n@another-tag"
-}]
-```
-
-Below are examples of acceptable comment formats
-
-```javascript
-/** online comment */
-
-/** first line
- * second line */
-
-/**
-   No *s on middle lines is acceptable too
-   which might be convenient for writing big
-   chunks of text.
-
- * keeping *s on some lines
- * would work either
-
-   left bound is determined by opening marker position
-   and white space will be trimmed as there was '* '
- */
-
-```
-
-Comments starting with `/***` and `/*` are ignored.
-
-Also you can parse entire file with `parse.file('path/to/file', callback)` or acquire an instance of [Transform](http://nodejs.org/api/stream.html#stream_class_stream_transform) stream with `parse.stream()`.
-
-## Options
-
-### `dotted_names: boolean`
-
-By default dotted names like `name.subname.subsubname` will be expanded into
-nested sections, this can be prevented by passing `opts.dotted_names = false`.
-
-### `trim: boolean`
-
-Set this to `false` to avoid the default of trimming whitespace at the start and
-end of each line.
-
-### `join: string | number | boolean`
-
-If the following lines of a multiline comment do not start with a star, `join` will have the following effect on *tag* `source` (and `description`) when joining the lines together:
-
-1. If a string, use that string in place of the leading whitespace (and avoid newlines).
-2. If a non-zero number (e.g., `1`), do no trimming and avoid newlines.
-3. If `undefined`, `false`, or `0`, use the default behavior of not trimming
-    but adding a newline.
-4. Otherwise (e.g., if `join` is `true`), replace any leading whitespace with a single space and avoid newlines.
-
-Note that if a multi-line comment has lines that start with a star, these will
-be appended with initial whitespace as is and with newlines regardless of the
-`join` setting.
-
-Note also that the *comment* `source` will not be changed by this setting.
-
-### `fence: string | RegExp | ((source: string) => boolean)`
-
-Set to a string or regular expression to toggle state upon finding an
-odd number of matches within a line. Defaults to \`\`\`.
-
-If set to a function, it should return `true` to toggle fenced state;
-upon returning `true` the first time, this will prevent subsequent lines
-from being interpreted as starting a new jsdoc tag until such time as the
-function returns `true` again to indicate that the state has toggled
-back.
-
-### `parsers: Parser[]` (Custom parsers)
-
-In case you need to parse tags in different way you can pass `opts.parsers = [parser1, ..., parserN]`, where each parser is `function name(str:String, data:Object):{source:String, data:Object}`.
-
-Each parser function takes string left after previous parsers applied and data produced by them. And returns `null` or `{source: '', data:{}}` where `source` is consumed substring and `data` is a payload with tag node fields.
-
-Tag node data is build by merging result bits from all parsers. Here is some example that is not doing actual parsing but is demonstrating the flow:
-
-```javascript
-/**
- * Source to be parsed below
- * @tag {type} name Description
- */
-parse(source, {parsers: [
-	// takes entire string
-	function parse_tag(str, data) {
-		return {source: ' @tag', data: {tag: 'tag'}};
-	},
-	// parser throwing exception
-	function check_tag(str, data) {
-		if (allowed_tags.indexOf(data.tag) === -1) {
-			throw new Error('Unrecognized tag "' + data.tag + '"');
-		}			
-	},
-	// takes the rest of the string after ' @tag''
-	function parse_name1(str, data) {
-		return {source: ' name', data: {name: 'name1'}};
-	},
-	// alternative name parser
-	function parse_name2(str, data) {
-		return {source: ' name', data: {name: 'name2'}};
-	}
-]});
-```
-
-This would produce following:
-
-```json
-[{
-  "tags": [{
-    "tag": "tag",
-    "errors": [
-      "check_tag: Unrecognized tag \"tag\""
-    ],
-    "name": "name2",
-    "optional": false,
-    "type": "",
-    "description": "",
-    "line": 2,
-    "source": "@tag {type} name Description"
-  }],
-  "line": 0,
-  "description": "Source to be parsed below",
-  "source": "Source to be parsed below\n@tag {type} name Description"
-}]
-```
-
-## Stringifying
-
-One may also convert `comment-parser` JSON structures back into strings using
-the `stringify` method (`stringify(o: (object|Array) [, opts: object]): string`).
-
-This method accepts the JSON as its first argument and an optional options
-object with an `indent` property set to either a string or a number that
-will be used to determine the number of spaces of indent. The indent of the
-start of the doc block will be one space less than the indent of each line of
-asterisks for the sake of alignment as per usual practice.
-
-The `stringify` export delegates to the specialized methods `stringifyBlocks`,
-`stringifyBlock`, and `stringifyTag`, which are available on the `stringify`
-function object.
-
-## Packaging
-
-`comment-parser` is CommonJS module and was primarely designed to be used with Node. Module `index.js` includes stream and file functionality. Use prser-only module in browser `comment-parser/parse.js`
-
-## Contributors
-
-```
-> npm info --registry https://registry.npmjs.org comment-parser contributors
-```
diff --git a/node_modules/comment-parser/index.d.ts b/node_modules/comment-parser/index.d.ts
deleted file mode 100644
index 03772d9..0000000
--- a/node_modules/comment-parser/index.d.ts
+++ /dev/null
@@ -1,192 +0,0 @@
-// Type definitions for comment-parser
-// Project: comment-parser
-// Definitions by: Javier "Ciberman" Mora <https://github.com/jhm-ciberman/>
-
-declare namespace parse {
-
-  /**
-   * In case you need to parse tags in a different way you can specify custom parsers here.
-   * Each parser function takes string left after previous parsers were applied and the data produced by them.
-   * It should return either `undefined` or the new object, where `source` is the consumed substring.
-   */
-  export type Parser = (str: string, data: any) => { source: string, data: any };
-
-  /**
-   * Represents a parsed doc comment.
-   */
-  export interface Comment {
-    /**
-     * A list of tags that are present in this doc comment.
-     */
-    tags: Tag[];
-    /**
-     * The starting line in the source code of this doc comment.
-     */
-    line: number;
-    /**
-     * The description of this doc comment. Empty string if no description was specified.
-     */
-    description: string;
-    /**
-     * The source of this doc comment, exactly as it appeared in the doc comment before parsing.
-     */
-    source: string;
-  }
-
-  /**
-   * Represents a parsed tag. A tag has the following format:
-   * >  &#64;tag {type} [name=default] description
-   */
-  export interface Tag {
-    /**
-     * The tag's kind, eg `param` or `return`.
-     */
-    tag: string;
-    /**
-     * The name of this tag, ie the first word after the tag. Empty string if no name was specified.
-     */
-    name: string;
-    /**
-     * `true` if the tag is optional (tag name enclosed in brackets), `false` otherwise.
-     */
-    optional: boolean;
-    /**
-     * The type declaration of this tag that is enclosed in curly braces. Empty string if no type was specified.
-     */
-    type: string;
-    /**
-     * The description of this tag that comes after the name. Empty string if no description was specified.
-     */
-    description: string;
-    /**
-     * The line number where this tag starts
-     */
-    line: number;
-    /**
-     * The source of this tag, exactly as it appeared in the doc comment before parsing.
-     */
-    source: string;
-    /**
-     * The default value for this tag. `undefined` in case no default value was specified.
-     */
-    default?: string;
-    /**
-     * A list of errors that occurred during the parsing of this tag. `undefined` if not error occurred.
-     */
-    errors? : string[];
-    /**
-     * If `dotted_names` was set to `true`, a list of sub tags. `undefined` if `dotted_names` was set to `false` or if
-     * no sub tags exist.
-     */
-    tags?: Tag[];
-  }
-
-  /**
-   * Options for parsing doc comments.
-   */
-  export interface Options {
-    /**
-     * In case you need to parse tags in a different way you can specify custom parsers here.
-     * Each parser function takes string left after previous parsers were applied and the data produced by them.
-     * It should return either `undefined` or the new object, where `source` is the consumed substring.
-     *
-     * If you specify custom parsers, the default parsers are overwritten, but you can access them via the constant
-     * `PARSERS`.
-     */
-    parsers: Parser[];
-    /**
-     * By default dotted names like `name.subname.subsubname` will be expanded into nested sections, this can be
-     * prevented by passing `opts.dotted_names = false`.
-     */
-    dotted_names: boolean;
-    /**
-     * Impacts behavior of joining non-asterisked multiline comments. Strings,
-     * non-zero numbers, or `true` will collapse newlines. Strings will
-     * additionally replace leading whitespace and `true` will replace with
-     * a single space.
-     */
-    join: string | number | boolean;
-    /**
-     * `true` to trim whitespace at the start and end of each line, `false` otherwise.
-     */
-    trim: boolean;
-    /**
-     * Return `true` to toggle fenced state; upon returning `true` the
-     * first time, will prevent subsequent lines from being interpreted as
-     * starting a new jsdoc tag until such time as the function returns
-     * `true` again to indicate that the state has toggled back; can also
-     * be simply set to a string or regular expression which will toggle
-     * state upon finding an odd number of matches within a line.
-     */
-    fence: string | RegExp | ((source: string) => boolean);
-  }
-
-    /**
-   * Options for turning a parsed doc comment back into a string.
-   */
-  export interface StringifyOptions {
-    /**
-     * Indentation for each line. If a string is passed, that string is used verbatim to indent each line. If a number
-     * is passed, indents each line with that many whitespaces.
-     */
-    indent: string | number;
-  }
-
-  export interface Stringify {
-    /**
-     * One may also convert comment-parser JSON structures back into strings using this stringify method.
-     *
-     * This method accepts the JSON as its first argument and an optional options object with an indent property set to
-     * either a string or a number that will be used to determine the number of spaces of indent. The indent of the start
-     * of the doc block will be one space less than the indent of each line of asterisks for the sake of alignment as per
-     * usual practice.
-     *
-     * The stringify export delegates to the specialized methods `stringifyBlocks`, `stringifyBlock`, and
-     * `stringifyTag`, which are available on the stringify function object.
-     * @param comment A tag, comment or a list of comments to stringify.
-     * @param options Options to control how the comment or comments are stringified.
-     * @return The stringified doc comment(s).
-     */
-    (comment: Tag | Comment | Comment[], options?: Partial<StringifyOptions>): string;
-    /**
-     * Similar to `stringify`, but only accepts a list of doc comments.
-     * @param comments A list of comments to stringify.
-     * @param options Options to control how the comments are stringified.
-     * @return The stringified doc comment(s).
-     */
-    stringifyBlocks(comments: Comment[], options?: Partial<StringifyOptions>): string;
-    /**
-     * Similar to `stringify`, but only accepts a single doc comment.
-     * @param comment A comment to stringify.
-     * @param options Options to control how the comment is stringified.
-     * @return The stringified doc comment(s).
-     */
-    stringifyBlock(comment: Comment, options?: Partial<StringifyOptions>): string;
-    /**
-     * Similar to `stringify`, but only accepts a single tag.
-     * @param tag A tag to stringify.
-     * @param options Options to control how the tag is stringified.
-     * @return The stringified doc comment(s).
-     */
-    stringifyTag(tag: Tag, options?: Partial<StringifyOptions>): string;
-  }
-
-  export const stringify: parse.Stringify;
-
-  /**
-   * The default list of parsers that is used to parse comments.
-   */
-  export const PARSERS: Record<"parse_tag" | "parse_type" | "parse_description" | "parse_name", Parser>
-}
-
-/**
- * The main method of this module which takes comment string and returns an array of objects with parsed data.
- * It is not trying to detect relations between tags or somehow recognize their meaning. Any tag can be used, as long
- * as it satisfies the format.
- * @param str A string with doc comments and source code to parse.
- * @param opts Options to control how the source string is parsed.
- * @return The parsed list of doc comments.
- */
-declare function parse(str: string, opts?: Partial<parse.Options>): parse.Comment[];
-
-export = parse;
diff --git a/node_modules/comment-parser/index.js b/node_modules/comment-parser/index.js
deleted file mode 100644
index c673db3..0000000
--- a/node_modules/comment-parser/index.js
+++ /dev/null
@@ -1,64 +0,0 @@
-
-'use strict'
-
-const fs = require('fs')
-const stream = require('stream')
-
-const parse = require('./parser')
-
-const stringify = require('./stringifier')
-
-module.exports = parse
-
-module.exports.stringify = stringify
-
-/* ------- Transform stream ------- */
-
-class Parser extends stream.Transform {
-  constructor (opts) {
-    opts = opts || {}
-    super({ objectMode: true })
-    this._extract = parse.mkextract(opts)
-  }
-
-  _transform (data, encoding, done) {
-    let block
-    const lines = data.toString().split(/\n/)
-
-    while (lines.length) {
-      block = this._extract(lines.shift())
-      if (block) {
-        this.push(block)
-      }
-    }
-
-    done()
-  }
-}
-
-module.exports.stream = function stream (opts) {
-  return new Parser(opts)
-}
-
-/* ------- File parser ------- */
-
-module.exports.file = function file (file_path, done) {
-  let opts = {}
-  const collected = []
-
-  if (arguments.length === 3) {
-    opts = done
-    done = arguments[2]
-  }
-
-  return fs.createReadStream(file_path, { encoding: 'utf8' })
-    .on('error', done)
-    .pipe(new Parser(opts))
-    .on('error', done)
-    .on('data', function (data) {
-      collected.push(data)
-    })
-    .on('finish', function () {
-      done(null, collected)
-    })
-}
diff --git a/node_modules/comment-parser/package.json b/node_modules/comment-parser/package.json
deleted file mode 100644
index 02756be..0000000
--- a/node_modules/comment-parser/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "name": "comment-parser",
-  "version": "0.7.2",
-  "description": "Generic JSDoc-like comment parser. ",
-  "main": "index.js",
-  "types": "index.d.ts",
-  "directories": {
-    "test": "tests"
-  },
-  "dependencies": {},
-  "devDependencies": {
-    "chai": "^4.2.0",
-    "eslint": "^6.6.0",
-    "eslint-config-standard": "^14.1.0",
-    "eslint-plugin-import": "^2.18.2",
-    "eslint-plugin-node": "^10.0.0",
-    "eslint-plugin-promise": "^4.2.1",
-    "eslint-plugin-standard": "^4.0.1",
-    "mocha": "^6.2.2",
-    "nodemon": "^1.19.4",
-    "nyc": "^14.1.1",
-    "typescript": "^3.6.4"
-  },
-  "engines": {
-    "node": ">= 6.0.0"
-  },
-  "scripts": {
-    "typescript": "tsc index.d.ts",
-    "lint:fix": "eslint --fix .",
-    "test:lint": "eslint .",
-    "test:typescript": "tsc index.d.ts",
-    "test:unit": "nyc mocha tests",
-    "test": "npm run test:typescript && npm run test:lint && npm run test:unit",
-    "watch": "nodemon -q -i node_modules -x npm test"
-  },
-  "nyc": {
-    "branches": 85,
-    "lines": 85,
-    "functions": 85,
-    "statements": 85,
-    "exclude": [
-      "tests"
-    ]
-  },
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:yavorskiy/comment-parser.git"
-  },
-  "keywords": [
-    "jsdoc",
-    "comments",
-    "parser"
-  ],
-  "author": "Sergii Iavorskyi <yavorskiy.s@gmail.com> (https://github.com/yavorskiy)",
-  "contributors": [
-    "Alexej Yaroshevich (https://github.com/zxqfox)",
-    "Andre Wachsmuth (https://github.com/blutorange)",
-    "Brett Zamir (https://github.com/brettz9)",
-    "Dieter Oberkofler (https://github.com/doberkofler)",
-    "Evgeny Reznichenko (https://github.com/zxcabs)",
-    "Javier \"Ciberma\" Mora (https://github.com/jhm-ciberman)",
-    "Jordan Harband (https://github.com/ljharb)",
-    "tengattack (https://github.com/tengattack)"
-  ],
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/yavorskiy/comment-parser/issues"
-  },
-  "homepage": "https://github.com/yavorskiy/comment-parser"
-}
diff --git a/node_modules/comment-parser/parser.js b/node_modules/comment-parser/parser.js
deleted file mode 100644
index c827b72..0000000
--- a/node_modules/comment-parser/parser.js
+++ /dev/null
@@ -1,286 +0,0 @@
-
-'use strict'
-
-const PARSERS = require('./parsers')
-
-const MARKER_START = '/**'
-const MARKER_START_SKIP = '/***'
-const MARKER_END = '*/'
-
-/* ------- util functions ------- */
-
-function find (list, filter) {
-  let i = list.length
-  let matchs = true
-
-  while (i--) {
-    for (const k in filter) {
-      if ({}.hasOwnProperty.call(filter, k)) {
-        matchs = (filter[k] === list[i][k]) && matchs
-      }
-    }
-    if (matchs) { return list[i] }
-  }
-  return null
-}
-
-/* ------- parsing ------- */
-
-/**
- * Parses "@tag {type} name description"
- * @param {string} str Raw doc string
- * @param {Array<function>} parsers Array of parsers to be applied to the source
- * @returns {object} parsed tag node
- */
-function parse_tag (str, parsers) {
-  if (typeof str !== 'string' || !(/\s*@/).test(str)) { return null }
-
-  const data = parsers.reduce(function (state, parser) {
-    let result
-
-    try {
-      result = parser(state.source, Object.assign({}, state.data))
-    } catch (err) {
-      state.data.errors = (state.data.errors || [])
-        .concat(parser.name + ': ' + err.message)
-    }
-
-    if (result) {
-      state.source = state.source.slice(result.source.length)
-      state.data = Object.assign(state.data, result.data)
-    }
-
-    return state
-  }, {
-    source: str,
-    data: {}
-  }).data
-
-  data.optional = !!data.optional
-  data.type = data.type === undefined ? '' : data.type
-  data.name = data.name === undefined ? '' : data.name
-  data.description = data.description === undefined ? '' : data.description
-
-  return data
-}
-
-/**
- * Parses comment block (array of String lines)
- */
-function parse_block (source, opts) {
-  const trim = opts.trim
-    ? s => s.trim()
-    : s => s
-
-  const toggleFence = (typeof opts.fence === 'function')
-    ? opts.fence
-    : line => line.split(opts.fence).length % 2 === 0
-
-  let source_str = source
-    .map((line) => { return trim(line.source) })
-    .join('\n')
-
-  source_str = trim(source_str)
-
-  const start = source[0].number
-
-  // merge source lines into tags
-  // we assume tag starts with "@"
-  source = source
-    .reduce(function (state, line) {
-      line.source = trim(line.source)
-
-      // start of a new tag detected
-      if (line.source.match(/^\s*@(\S+)/) && !state.isFenced) {
-        state.tags.push({
-          source: [line.source],
-          line: line.number
-        })
-      // keep appending source to the current tag
-      } else {
-        const tag = state.tags[state.tags.length - 1]
-        if (opts.join !== undefined && opts.join !== false && opts.join !== 0 &&
-            !line.startWithStar && tag.source.length > 0) {
-          let source
-          if (typeof opts.join === 'string') {
-            source = opts.join + line.source.replace(/^\s+/, '')
-          } else if (typeof opts.join === 'number') {
-            source = line.source
-          } else {
-            source = ' ' + line.source.replace(/^\s+/, '')
-          }
-          tag.source[tag.source.length - 1] += source
-        } else {
-          tag.source.push(line.source)
-        }
-      }
-
-      if (toggleFence(line.source)) {
-        state.isFenced = !state.isFenced
-      }
-      return state
-    }, {
-      tags: [{ source: [] }],
-      isFenced: false
-    })
-    .tags
-    .map((tag) => {
-      tag.source = trim(tag.source.join('\n'))
-      return tag
-    })
-
-  // Block description
-  const description = source.shift()
-
-  // skip if no descriptions and no tags
-  if (description.source === '' && source.length === 0) {
-    return null
-  }
-
-  const tags = source.reduce(function (tags, tag) {
-    const tag_node = parse_tag(tag.source, opts.parsers)
-    if (!tag_node) { return tags }
-
-    tag_node.line = tag.line
-    tag_node.source = tag.source
-
-    if (opts.dotted_names && tag_node.name.includes('.')) {
-      let parent_name
-      let parent_tag
-      let parent_tags = tags
-      const parts = tag_node.name.split('.')
-
-      while (parts.length > 1) {
-        parent_name = parts.shift()
-        parent_tag = find(parent_tags, {
-          tag: tag_node.tag,
-          name: parent_name
-        })
-
-        if (!parent_tag) {
-          parent_tag = {
-            tag: tag_node.tag,
-            line: Number(tag_node.line),
-            name: parent_name,
-            type: '',
-            description: ''
-          }
-          parent_tags.push(parent_tag)
-        }
-
-        parent_tag.tags = parent_tag.tags || []
-        parent_tags = parent_tag.tags
-      }
-
-      tag_node.name = parts[0]
-      parent_tags.push(tag_node)
-      return tags
-    }
-
-    return tags.concat(tag_node)
-  }, [])
-
-  return {
-    tags,
-    line: start,
-    description: description.source,
-    source: source_str
-  }
-}
-
-/**
- * Produces `extract` function with internal state initialized
- */
-function mkextract (opts) {
-  let chunk = null
-  let indent = 0
-  let number = 0
-
-  opts = Object.assign({}, {
-    trim: true,
-    dotted_names: false,
-    fence: '```',
-    parsers: [
-      PARSERS.parse_tag,
-      PARSERS.parse_type,
-      PARSERS.parse_name,
-      PARSERS.parse_description
-    ]
-  }, opts || {})
-
-  /**
-   * Read lines until they make a block
-   * Return parsed block once fullfilled or null otherwise
-   */
-  return function extract (line) {
-    let result = null
-    const startPos = line.indexOf(MARKER_START)
-    const endPos = line.indexOf(MARKER_END)
-
-    // if open marker detected and it's not, skip one
-    if (startPos !== -1 && line.indexOf(MARKER_START_SKIP) !== startPos) {
-      chunk = []
-      indent = startPos + MARKER_START.length
-    }
-
-    // if we are on middle of comment block
-    if (chunk) {
-      let lineStart = indent
-      let startWithStar = false
-
-      // figure out if we slice from opening marker pos
-      // or line start is shifted to the left
-      const nonSpaceChar = line.match(/\S/)
-
-      // skip for the first line starting with /** (fresh chunk)
-      // it always has the right indentation
-      if (chunk.length > 0 && nonSpaceChar) {
-        if (nonSpaceChar[0] === '*') {
-          const afterNonSpaceCharIdx = nonSpaceChar.index + 1
-          const extraCharIsSpace = line.charAt(afterNonSpaceCharIdx) === ' '
-          lineStart = afterNonSpaceCharIdx + (extraCharIsSpace ? 1 : 0)
-          startWithStar = true
-        } else if (nonSpaceChar.index < indent) {
-          lineStart = nonSpaceChar.index
-        }
-      }
-
-      // slice the line until end or until closing marker start
-      chunk.push({
-        number,
-        startWithStar,
-        source: line.slice(lineStart, endPos === -1 ? line.length : endPos)
-      })
-
-      // finalize block if end marker detected
-      if (endPos !== -1) {
-        result = parse_block(chunk, opts)
-        chunk = null
-        indent = 0
-      }
-    }
-
-    number += 1
-    return result
-  }
-}
-
-/* ------- Public API ------- */
-
-module.exports = function parse (source, opts) {
-  const blocks = []
-  const extract = mkextract(opts)
-  const lines = source.split(/\n/)
-
-  lines.forEach((line) => {
-    const block = extract(line)
-    if (block) {
-      blocks.push(block)
-    }
-  })
-
-  return blocks
-}
-
-module.exports.PARSERS = PARSERS
-module.exports.mkextract = mkextract
diff --git a/node_modules/comment-parser/parsers.js b/node_modules/comment-parser/parsers.js
deleted file mode 100644
index dcf3e6b..0000000
--- a/node_modules/comment-parser/parsers.js
+++ /dev/null
@@ -1,110 +0,0 @@
-'use strict'
-
-function skipws (str) {
-  let i = 0
-  do {
-    if (str[i] !== ' ' && str[i] !== '\t') { return i }
-  } while (++i < str.length)
-  return i
-}
-
-/* ------- default parsers ------- */
-
-const PARSERS = {}
-
-PARSERS.parse_tag = function parse_tag (str) {
-  const result = str.match(/^\s*@(\S+)/)
-  if (!result) { throw new Error('Invalid `@tag`, missing @ symbol') }
-
-  return {
-    source: result[0],
-    data: { tag: result[1] }
-  }
-}
-
-PARSERS.parse_type = function parse_type (str, data) {
-  if (data.errors && data.errors.length) { return null }
-
-  let pos = skipws(str)
-  let res = ''
-  let curlies = 0
-
-  if (str[pos] !== '{') { return null }
-
-  while (pos < str.length) {
-    curlies += (str[pos] === '{' ? 1 : (str[pos] === '}' ? -1 : 0))
-    res += str[pos]
-    pos++
-    if (curlies === 0) { break }
-  }
-
-  if (curlies !== 0) { throw new Error('Invalid `{type}`, unpaired curlies') }
-
-  return {
-    source: str.slice(0, pos),
-    data: { type: res.slice(1, -1) }
-  }
-}
-
-PARSERS.parse_name = function parse_name (str, data) {
-  if (data.errors && data.errors.length) { return null }
-
-  let pos = skipws(str)
-  let name = ''
-  let brackets = 0
-  let res = { optional: false }
-
-  // if it starts with quoted group assume it is a literal
-  const quotedGroups = str.slice(pos).split('"')
-  if (quotedGroups.length > 1 && quotedGroups[0] === '' && quotedGroups.length % 2 === 1) {
-    name = quotedGroups[1]
-    pos += name.length + 2
-  // assume name is non-space string or anything wrapped into brackets
-  } else {
-    while (pos < str.length) {
-      brackets += (str[pos] === '[' ? 1 : (str[pos] === ']' ? -1 : 0))
-      name += str[pos]
-      pos++
-      if (brackets === 0 && /\s/.test(str[pos])) { break }
-    }
-
-    if (brackets !== 0) { throw new Error('Invalid `name`, unpaired brackets') }
-
-    res = { name: name, optional: false }
-
-    if (name[0] === '[' && name[name.length - 1] === ']') {
-      res.optional = true
-      name = name.slice(1, -1)
-
-      if (name.indexOf('=') !== -1) {
-        const parts = name.split('=')
-        name = parts[0]
-        res.default = parts[1].replace(/^(["'])(.+)(\1)$/, '$2')
-      }
-    }
-  }
-
-  res.name = name
-
-  return {
-    source: str.slice(0, pos),
-    data: res
-  }
-}
-
-PARSERS.parse_description = function parse_description (str, data) {
-  if (data.errors && data.errors.length) { return null }
-
-  const result = str.match(/^\s+((.|\s)+)?/)
-
-  if (result) {
-    return {
-      source: result[0],
-      data: { description: result[1] === undefined ? '' : result[1] }
-    }
-  }
-
-  return null
-}
-
-module.exports = PARSERS
diff --git a/node_modules/comment-parser/stringifier.js b/node_modules/comment-parser/stringifier.js
deleted file mode 100644
index 78cd510..0000000
--- a/node_modules/comment-parser/stringifier.js
+++ /dev/null
@@ -1,57 +0,0 @@
-'use strict'
-
-const getIndent = (indent) => {
-  return typeof indent === 'number' ? ' '.repeat(indent) : indent
-}
-
-module.exports = exports = function stringify (arg, opts) {
-  if (Array.isArray(arg)) {
-    return stringifyBlocks(arg, opts)
-  }
-  if (arg && typeof arg === 'object') {
-    if ('tag' in arg) {
-      return stringifyTag(arg, opts)
-    }
-    if ('tags' in arg) {
-      return stringifyBlock(arg, opts)
-    }
-  }
-  throw new TypeError('Unexpected argument passed to `stringify`.')
-}
-
-const stringifyBlocks = exports.stringifyBlocks = function stringifyBlocks (
-  blocks, { indent = '' } = {}
-) {
-  const indnt = getIndent(indent)
-  return blocks.reduce((s, block) => {
-    return s + stringifyBlock(block, { indent })
-  }, (indnt ? indnt.slice(0, -1) : '') + '/**\n') + indnt + '*/'
-}
-
-const stringifyBlock = exports.stringifyBlock = function stringifyBlock (
-  block, { indent = '' } = {}
-) {
-  // block.line
-  const indnt = getIndent(indent)
-  return (block.description ? `${indnt}${block.description.replace(/^/gm, '* ')}\n${indnt}*\n` : '') +
-    block.tags.reduce((s, tag) => {
-      return s + stringifyTag(tag, { indent })
-    }, '')
-}
-
-const stringifyTag = exports.stringifyTag = function stringifyTag (
-  tag, { indent = '' } = {}
-) {
-  const indnt = getIndent(indent)
-  const {
-    type, name, optional, description, tag: tagName, default: deflt //, line , source
-  } = tag
-  return indnt + `* @${tagName}` +
-    (type ? ` {${type}}` : '') +
-    (name ? ` ${
-      optional ? '[' : ''
-    }${name}${deflt ? `=${deflt}` : ''}${
-      optional ? ']' : ''
-    }` : '') +
-    (description ? ` ${description.replace(/\n/g, '\n' + indnt + '* ')}` : '') + '\n'
-}
diff --git a/node_modules/core-js-pure/LICENSE b/node_modules/core-js-pure/LICENSE
deleted file mode 100644
index 9c4e4e1..0000000
--- a/node_modules/core-js-pure/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2014-2020 Denis Pushkarev
-
-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/node_modules/core-js-pure/README.md b/node_modules/core-js-pure/README.md
deleted file mode 100644
index 478f493..0000000
--- a/node_modules/core-js-pure/README.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# core-js-pure
-
-[![Sponsors on Open Collective](https://opencollective.com/core-js/sponsors/badge.svg)](#sponsors) [![Backers on Open Collective](https://opencollective.com/core-js/backers/badge.svg)](#backers) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/zloirock/core-js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![version](https://img.shields.io/npm/v/core-js-pure.svg)](https://www.npmjs.com/package/core-js-pure) [![npm downloads](https://img.shields.io/npm/dm/core-js-pure.svg)](http://npm-stat.com/charts.html?package=core-js-pure&author=&from=2019-03-18) [![Build Status](https://travis-ci.org/zloirock/core-js.svg)](https://travis-ci.org/zloirock/core-js) [![devDependency status](https://david-dm.org/zloirock/core-js/dev-status.svg)](https://david-dm.org/zloirock/core-js?type=dev)
-
-> Modular standard library for JavaScript. Includes polyfills for [ECMAScript up to 2019](https://github.com/zloirock/core-js#ecmascript): [promises](https://github.com/zloirock/core-js#ecmascript-promise), [symbols](https://github.com/zloirock/core-js#ecmascript-symbol), [collections](https://github.com/zloirock/core-js#ecmascript-collections), iterators, [typed arrays](https://github.com/zloirock/core-js#ecmascript-typed-arrays), many other features, [ECMAScript proposals](https://github.com/zloirock/core-js#ecmascript-proposals), [some cross-platform WHATWG / W3C features and proposals](#web-standards) like [`URL`](https://github.com/zloirock/core-js#url-and-urlsearchparams). You can load only required features or use it without global namespace pollution.
-
-## As advertising: the author is looking for a good job -)
-
-## [core-js@3, babel and a look into the future](https://github.com/zloirock/core-js/tree/master/docs/2019-03-19-core-js-3-babel-and-a-look-into-the-future.md)
-
-## Raising funds
-
-`core-js` isn't backed by a company, so the future of this project depends on you. Become a sponsor or a backer [**on Open Collective**](https://opencollective.com/core-js) or [**on Patreon**](https://www.patreon.com/zloirock) if you are interested in `core-js`.
-
----
-
-<a href="https://opencollective.com/core-js/sponsor/0/website" target="_blank"><img src="https://opencollective.com/core-js/sponsor/0/avatar.svg"></a><a href="https://opencollective.com/core-js/sponsor/1/website" target="_blank"><img src="https://opencollective.com/core-js/sponsor/1/avatar.svg"></a><a href="https://opencollective.com/core-js/sponsor/2/website" target="_blank"><img src="https://opencollective.com/core-js/sponsor/2/avatar.svg"></a><a href="https://opencollective.com/core-js/sponsor/3/website" target="_blank"><img src="https://opencollective.com/core-js/sponsor/3/avatar.svg"></a><a href="https://opencollective.com/core-js/sponsor/4/website" target="_blank"><img src="https://opencollective.com/core-js/sponsor/4/avatar.svg"></a><a href="https://opencollective.com/core-js/sponsor/5/website" target="_blank"><img src="https://opencollective.com/core-js/sponsor/5/avatar.svg"></a><a href="https://opencollective.com/core-js/sponsor/6/website" target="_blank"><img src="https://opencollective.com/core-js/sponsor/6/avatar.svg"></a><a href="https://opencollective.com/core-js/sponsor/7/website" target="_blank"><img src="https://opencollective.com/core-js/sponsor/7/avatar.svg"></a><a href="https://opencollective.com/core-js/sponsor/8/website" target="_blank"><img src="https://opencollective.com/core-js/sponsor/8/avatar.svg"></a><a href="https://opencollective.com/core-js/sponsor/9/website" target="_blank"><img src="https://opencollective.com/core-js/sponsor/9/avatar.svg"></a><a href="https://opencollective.com/core-js/sponsor/10/website" target="_blank"><img src="https://opencollective.com/core-js/sponsor/10/avatar.svg"></a><a href="https://opencollective.com/core-js/sponsor/11/website" target="_blank"><img src="https://opencollective.com/core-js/sponsor/11/avatar.svg"></a>
-
----
-
-<a href="https://opencollective.com/core-js#backers" target="_blank"><img src="https://opencollective.com/core-js/backers.svg?width=890"></a>
-
----
-
-[*Example*](http://goo.gl/a2xexl):
-```js
-import 'core-js'; // <- at the top of your entry point
-
-Array.from(new Set([1, 2, 3, 2, 1]));          // => [1, 2, 3]
-[1, [2, 3], [4, [5]]].flat(2);                 // => [1, 2, 3, 4, 5]
-Promise.resolve(32).then(x => console.log(x)); // => 32
-```
-
-*You can load only required features*:
-```js
-import 'core-js/features/array/from'; // <- at the top of your entry point
-import 'core-js/features/array/flat'; // <- at the top of your entry point
-import 'core-js/features/set';        // <- at the top of your entry point
-import 'core-js/features/promise';    // <- at the top of your entry point
-
-Array.from(new Set([1, 2, 3, 2, 1]));          // => [1, 2, 3]
-[1, [2, 3], [4, [5]]].flat(2);                 // => [1, 2, 3, 4, 5]
-Promise.resolve(32).then(x => console.log(x)); // => 32
-```
-
-*Or use it without global namespace pollution*:
-```js
-import from from 'core-js-pure/features/array/from';
-import flat from 'core-js-pure/features/array/flat';
-import Set from 'core-js-pure/features/set';
-import Promise from 'core-js-pure/features/promise';
-
-from(new Set([1, 2, 3, 2, 1]));                // => [1, 2, 3]
-flat([1, [2, 3], [4, [5]]], 2);                // => [1, 2, 3, 4, 5]
-Promise.resolve(32).then(x => console.log(x)); // => 32
-```
-
-**It's a version without global namespace pollution (the third example), for more info see [`core-js` documentation](https://github.com/zloirock/core-js/blob/master/README.md)**.
diff --git a/node_modules/core-js-pure/configurator.js b/node_modules/core-js-pure/configurator.js
deleted file mode 100644
index 0a5288e..0000000
--- a/node_modules/core-js-pure/configurator.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var has = require('./internals/has');
-var isArray = require('./internals/is-array');
-var isForced = require('./internals/is-forced');
-var shared = require('./internals/shared-store');
-
-var data = isForced.data;
-var normalize = isForced.normalize;
-var USE_FUNCTION_CONSTRUCTOR = 'USE_FUNCTION_CONSTRUCTOR';
-var ASYNC_ITERATOR_PROTOTYPE = 'AsyncIteratorPrototype';
-
-var setAggressivenessLevel = function (object, constant) {
-  if (isArray(object)) for (var i = 0; i < object.length; i++) data[normalize(object[i])] = constant;
-};
-
-module.exports = function (options) {
-  if (typeof options == 'object') {
-    setAggressivenessLevel(options.useNative, isForced.NATIVE);
-    setAggressivenessLevel(options.usePolyfill, isForced.POLYFILL);
-    setAggressivenessLevel(options.useFeatureDetection, null);
-    if (has(options, USE_FUNCTION_CONSTRUCTOR)) shared[USE_FUNCTION_CONSTRUCTOR] = !!options[USE_FUNCTION_CONSTRUCTOR];
-    if (has(options, ASYNC_ITERATOR_PROTOTYPE)) shared[USE_FUNCTION_CONSTRUCTOR] = options[ASYNC_ITERATOR_PROTOTYPE];
-  }
-};
diff --git a/node_modules/core-js-pure/es/README.md b/node_modules/core-js-pure/es/README.md
deleted file mode 100644
index 872a356..0000000
--- a/node_modules/core-js-pure/es/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This folder contains entry points for [stable ECMAScript features](https://github.com/zloirock/core-js/tree/v3#ecmascript) with dependencies.
diff --git a/node_modules/core-js-pure/es/array-buffer/constructor.js b/node_modules/core-js-pure/es/array-buffer/constructor.js
deleted file mode 100644
index b7a76ed..0000000
--- a/node_modules/core-js-pure/es/array-buffer/constructor.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.array-buffer.constructor');
-require('../../modules/es.object.to-string');
-var path = require('../../internals/path');
-
-module.exports = path.ArrayBuffer;
diff --git a/node_modules/core-js-pure/es/array-buffer/index.js b/node_modules/core-js-pure/es/array-buffer/index.js
deleted file mode 100644
index 8697373..0000000
--- a/node_modules/core-js-pure/es/array-buffer/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-require('../../modules/es.array-buffer.constructor');
-require('../../modules/es.array-buffer.is-view');
-require('../../modules/es.array-buffer.slice');
-require('../../modules/es.object.to-string');
-var path = require('../../internals/path');
-
-module.exports = path.ArrayBuffer;
diff --git a/node_modules/core-js-pure/es/array-buffer/is-view.js b/node_modules/core-js-pure/es/array-buffer/is-view.js
deleted file mode 100644
index c86c3b7..0000000
--- a/node_modules/core-js-pure/es/array-buffer/is-view.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array-buffer.is-view');
-var path = require('../../internals/path');
-
-module.exports = path.ArrayBuffer.isView;
diff --git a/node_modules/core-js-pure/es/array-buffer/slice.js b/node_modules/core-js-pure/es/array-buffer/slice.js
deleted file mode 100644
index 931f8bc..0000000
--- a/node_modules/core-js-pure/es/array-buffer/slice.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.array-buffer.slice');
diff --git a/node_modules/core-js-pure/es/array/concat.js b/node_modules/core-js-pure/es/array/concat.js
deleted file mode 100644
index 9a13ce6..0000000
--- a/node_modules/core-js-pure/es/array/concat.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.concat');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'concat');
diff --git a/node_modules/core-js-pure/es/array/copy-within.js b/node_modules/core-js-pure/es/array/copy-within.js
deleted file mode 100644
index de8032f..0000000
--- a/node_modules/core-js-pure/es/array/copy-within.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.copy-within');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'copyWithin');
diff --git a/node_modules/core-js-pure/es/array/entries.js b/node_modules/core-js-pure/es/array/entries.js
deleted file mode 100644
index efd91b0..0000000
--- a/node_modules/core-js-pure/es/array/entries.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.iterator');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'entries');
diff --git a/node_modules/core-js-pure/es/array/every.js b/node_modules/core-js-pure/es/array/every.js
deleted file mode 100644
index b95c87f..0000000
--- a/node_modules/core-js-pure/es/array/every.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.every');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'every');
diff --git a/node_modules/core-js-pure/es/array/fill.js b/node_modules/core-js-pure/es/array/fill.js
deleted file mode 100644
index c52d60a..0000000
--- a/node_modules/core-js-pure/es/array/fill.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.fill');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'fill');
diff --git a/node_modules/core-js-pure/es/array/filter.js b/node_modules/core-js-pure/es/array/filter.js
deleted file mode 100644
index f1d0e16..0000000
--- a/node_modules/core-js-pure/es/array/filter.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.filter');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'filter');
diff --git a/node_modules/core-js-pure/es/array/find-index.js b/node_modules/core-js-pure/es/array/find-index.js
deleted file mode 100644
index 9ccbdda..0000000
--- a/node_modules/core-js-pure/es/array/find-index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.find-index');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'findIndex');
diff --git a/node_modules/core-js-pure/es/array/find.js b/node_modules/core-js-pure/es/array/find.js
deleted file mode 100644
index 7b3cc38..0000000
--- a/node_modules/core-js-pure/es/array/find.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.find');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'find');
diff --git a/node_modules/core-js-pure/es/array/flat-map.js b/node_modules/core-js-pure/es/array/flat-map.js
deleted file mode 100644
index f201cbb..0000000
--- a/node_modules/core-js-pure/es/array/flat-map.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.array.flat-map');
-require('../../modules/es.array.unscopables.flat-map');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'flatMap');
diff --git a/node_modules/core-js-pure/es/array/flat.js b/node_modules/core-js-pure/es/array/flat.js
deleted file mode 100644
index c671760..0000000
--- a/node_modules/core-js-pure/es/array/flat.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.array.flat');
-require('../../modules/es.array.unscopables.flat');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'flat');
diff --git a/node_modules/core-js-pure/es/array/for-each.js b/node_modules/core-js-pure/es/array/for-each.js
deleted file mode 100644
index 2851813..0000000
--- a/node_modules/core-js-pure/es/array/for-each.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.for-each');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'forEach');
diff --git a/node_modules/core-js-pure/es/array/from.js b/node_modules/core-js-pure/es/array/from.js
deleted file mode 100644
index f54806d..0000000
--- a/node_modules/core-js-pure/es/array/from.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.string.iterator');
-require('../../modules/es.array.from');
-var path = require('../../internals/path');
-
-module.exports = path.Array.from;
diff --git a/node_modules/core-js-pure/es/array/includes.js b/node_modules/core-js-pure/es/array/includes.js
deleted file mode 100644
index 06f837c..0000000
--- a/node_modules/core-js-pure/es/array/includes.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.includes');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'includes');
diff --git a/node_modules/core-js-pure/es/array/index-of.js b/node_modules/core-js-pure/es/array/index-of.js
deleted file mode 100644
index 83e91e7..0000000
--- a/node_modules/core-js-pure/es/array/index-of.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.index-of');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'indexOf');
diff --git a/node_modules/core-js-pure/es/array/index.js b/node_modules/core-js-pure/es/array/index.js
deleted file mode 100644
index 8c18680..0000000
--- a/node_modules/core-js-pure/es/array/index.js
+++ /dev/null
@@ -1,33 +0,0 @@
-require('../../modules/es.string.iterator');
-require('../../modules/es.array.from');
-require('../../modules/es.array.is-array');
-require('../../modules/es.array.of');
-require('../../modules/es.array.concat');
-require('../../modules/es.array.copy-within');
-require('../../modules/es.array.every');
-require('../../modules/es.array.fill');
-require('../../modules/es.array.filter');
-require('../../modules/es.array.find');
-require('../../modules/es.array.find-index');
-require('../../modules/es.array.flat');
-require('../../modules/es.array.flat-map');
-require('../../modules/es.array.for-each');
-require('../../modules/es.array.includes');
-require('../../modules/es.array.index-of');
-require('../../modules/es.array.iterator');
-require('../../modules/es.array.join');
-require('../../modules/es.array.last-index-of');
-require('../../modules/es.array.map');
-require('../../modules/es.array.reduce');
-require('../../modules/es.array.reduce-right');
-require('../../modules/es.array.reverse');
-require('../../modules/es.array.slice');
-require('../../modules/es.array.some');
-require('../../modules/es.array.sort');
-require('../../modules/es.array.species');
-require('../../modules/es.array.splice');
-require('../../modules/es.array.unscopables.flat');
-require('../../modules/es.array.unscopables.flat-map');
-var path = require('../../internals/path');
-
-module.exports = path.Array;
diff --git a/node_modules/core-js-pure/es/array/is-array.js b/node_modules/core-js-pure/es/array/is-array.js
deleted file mode 100644
index d000180..0000000
--- a/node_modules/core-js-pure/es/array/is-array.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.is-array');
-var path = require('../../internals/path');
-
-module.exports = path.Array.isArray;
diff --git a/node_modules/core-js-pure/es/array/iterator.js b/node_modules/core-js-pure/es/array/iterator.js
deleted file mode 100644
index 726484e..0000000
--- a/node_modules/core-js-pure/es/array/iterator.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.iterator');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'values');
diff --git a/node_modules/core-js-pure/es/array/join.js b/node_modules/core-js-pure/es/array/join.js
deleted file mode 100644
index 523edbf..0000000
--- a/node_modules/core-js-pure/es/array/join.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.join');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'join');
diff --git a/node_modules/core-js-pure/es/array/keys.js b/node_modules/core-js-pure/es/array/keys.js
deleted file mode 100644
index 679d525..0000000
--- a/node_modules/core-js-pure/es/array/keys.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.iterator');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'keys');
diff --git a/node_modules/core-js-pure/es/array/last-index-of.js b/node_modules/core-js-pure/es/array/last-index-of.js
deleted file mode 100644
index 616897f..0000000
--- a/node_modules/core-js-pure/es/array/last-index-of.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.last-index-of');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'lastIndexOf');
diff --git a/node_modules/core-js-pure/es/array/map.js b/node_modules/core-js-pure/es/array/map.js
deleted file mode 100644
index 6b641fe..0000000
--- a/node_modules/core-js-pure/es/array/map.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.map');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'map');
diff --git a/node_modules/core-js-pure/es/array/of.js b/node_modules/core-js-pure/es/array/of.js
deleted file mode 100644
index 5153029..0000000
--- a/node_modules/core-js-pure/es/array/of.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.of');
-var path = require('../../internals/path');
-
-module.exports = path.Array.of;
diff --git a/node_modules/core-js-pure/es/array/reduce-right.js b/node_modules/core-js-pure/es/array/reduce-right.js
deleted file mode 100644
index 43cb972..0000000
--- a/node_modules/core-js-pure/es/array/reduce-right.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.reduce-right');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'reduceRight');
diff --git a/node_modules/core-js-pure/es/array/reduce.js b/node_modules/core-js-pure/es/array/reduce.js
deleted file mode 100644
index db06a3f..0000000
--- a/node_modules/core-js-pure/es/array/reduce.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.reduce');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'reduce');
diff --git a/node_modules/core-js-pure/es/array/reverse.js b/node_modules/core-js-pure/es/array/reverse.js
deleted file mode 100644
index d5cc94e..0000000
--- a/node_modules/core-js-pure/es/array/reverse.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.reverse');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'reverse');
diff --git a/node_modules/core-js-pure/es/array/slice.js b/node_modules/core-js-pure/es/array/slice.js
deleted file mode 100644
index 0c9eb94..0000000
--- a/node_modules/core-js-pure/es/array/slice.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.slice');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'slice');
diff --git a/node_modules/core-js-pure/es/array/some.js b/node_modules/core-js-pure/es/array/some.js
deleted file mode 100644
index 407d556..0000000
--- a/node_modules/core-js-pure/es/array/some.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.some');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'some');
diff --git a/node_modules/core-js-pure/es/array/sort.js b/node_modules/core-js-pure/es/array/sort.js
deleted file mode 100644
index 0336090..0000000
--- a/node_modules/core-js-pure/es/array/sort.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.sort');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'sort');
diff --git a/node_modules/core-js-pure/es/array/splice.js b/node_modules/core-js-pure/es/array/splice.js
deleted file mode 100644
index 95b51f0..0000000
--- a/node_modules/core-js-pure/es/array/splice.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.splice');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'splice');
diff --git a/node_modules/core-js-pure/es/array/values.js b/node_modules/core-js-pure/es/array/values.js
deleted file mode 100644
index 726484e..0000000
--- a/node_modules/core-js-pure/es/array/values.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.array.iterator');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'values');
diff --git a/node_modules/core-js-pure/es/array/virtual/concat.js b/node_modules/core-js-pure/es/array/virtual/concat.js
deleted file mode 100644
index fc9eb03..0000000
--- a/node_modules/core-js-pure/es/array/virtual/concat.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.concat');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').concat;
diff --git a/node_modules/core-js-pure/es/array/virtual/copy-within.js b/node_modules/core-js-pure/es/array/virtual/copy-within.js
deleted file mode 100644
index 71cc9bd..0000000
--- a/node_modules/core-js-pure/es/array/virtual/copy-within.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.copy-within');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').copyWithin;
diff --git a/node_modules/core-js-pure/es/array/virtual/entries.js b/node_modules/core-js-pure/es/array/virtual/entries.js
deleted file mode 100644
index 1ce2e78..0000000
--- a/node_modules/core-js-pure/es/array/virtual/entries.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.iterator');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').entries;
diff --git a/node_modules/core-js-pure/es/array/virtual/every.js b/node_modules/core-js-pure/es/array/virtual/every.js
deleted file mode 100644
index cc45acc..0000000
--- a/node_modules/core-js-pure/es/array/virtual/every.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.every');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').every;
diff --git a/node_modules/core-js-pure/es/array/virtual/fill.js b/node_modules/core-js-pure/es/array/virtual/fill.js
deleted file mode 100644
index 75b5c8b..0000000
--- a/node_modules/core-js-pure/es/array/virtual/fill.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.fill');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').fill;
diff --git a/node_modules/core-js-pure/es/array/virtual/filter.js b/node_modules/core-js-pure/es/array/virtual/filter.js
deleted file mode 100644
index 90cb323..0000000
--- a/node_modules/core-js-pure/es/array/virtual/filter.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.filter');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').filter;
diff --git a/node_modules/core-js-pure/es/array/virtual/find-index.js b/node_modules/core-js-pure/es/array/virtual/find-index.js
deleted file mode 100644
index ff1a621..0000000
--- a/node_modules/core-js-pure/es/array/virtual/find-index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.find-index');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').findIndex;
diff --git a/node_modules/core-js-pure/es/array/virtual/find.js b/node_modules/core-js-pure/es/array/virtual/find.js
deleted file mode 100644
index a4372bd..0000000
--- a/node_modules/core-js-pure/es/array/virtual/find.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.find');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').find;
diff --git a/node_modules/core-js-pure/es/array/virtual/flat-map.js b/node_modules/core-js-pure/es/array/virtual/flat-map.js
deleted file mode 100644
index 9e379f4..0000000
--- a/node_modules/core-js-pure/es/array/virtual/flat-map.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../../modules/es.array.flat-map');
-require('../../../modules/es.array.unscopables.flat-map');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').flatMap;
diff --git a/node_modules/core-js-pure/es/array/virtual/flat.js b/node_modules/core-js-pure/es/array/virtual/flat.js
deleted file mode 100644
index 60b772e..0000000
--- a/node_modules/core-js-pure/es/array/virtual/flat.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../../modules/es.array.flat');
-require('../../../modules/es.array.unscopables.flat');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').flat;
diff --git a/node_modules/core-js-pure/es/array/virtual/for-each.js b/node_modules/core-js-pure/es/array/virtual/for-each.js
deleted file mode 100644
index c65b26c..0000000
--- a/node_modules/core-js-pure/es/array/virtual/for-each.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.for-each');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').forEach;
diff --git a/node_modules/core-js-pure/es/array/virtual/includes.js b/node_modules/core-js-pure/es/array/virtual/includes.js
deleted file mode 100644
index 732d58b..0000000
--- a/node_modules/core-js-pure/es/array/virtual/includes.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.includes');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').includes;
diff --git a/node_modules/core-js-pure/es/array/virtual/index-of.js b/node_modules/core-js-pure/es/array/virtual/index-of.js
deleted file mode 100644
index 074e191..0000000
--- a/node_modules/core-js-pure/es/array/virtual/index-of.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.index-of');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').indexOf;
diff --git a/node_modules/core-js-pure/es/array/virtual/index.js b/node_modules/core-js-pure/es/array/virtual/index.js
deleted file mode 100644
index f1455e1..0000000
--- a/node_modules/core-js-pure/es/array/virtual/index.js
+++ /dev/null
@@ -1,29 +0,0 @@
-require('../../../modules/es.array.concat');
-require('../../../modules/es.array.copy-within');
-require('../../../modules/es.array.every');
-require('../../../modules/es.array.fill');
-require('../../../modules/es.array.filter');
-require('../../../modules/es.array.find');
-require('../../../modules/es.array.find-index');
-require('../../../modules/es.array.flat');
-require('../../../modules/es.array.flat-map');
-require('../../../modules/es.array.for-each');
-require('../../../modules/es.array.includes');
-require('../../../modules/es.array.index-of');
-require('../../../modules/es.array.iterator');
-require('../../../modules/es.array.join');
-require('../../../modules/es.array.last-index-of');
-require('../../../modules/es.array.map');
-require('../../../modules/es.array.reduce');
-require('../../../modules/es.array.reduce-right');
-require('../../../modules/es.array.reverse');
-require('../../../modules/es.array.slice');
-require('../../../modules/es.array.some');
-require('../../../modules/es.array.sort');
-require('../../../modules/es.array.species');
-require('../../../modules/es.array.splice');
-require('../../../modules/es.array.unscopables.flat');
-require('../../../modules/es.array.unscopables.flat-map');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array');
diff --git a/node_modules/core-js-pure/es/array/virtual/iterator.js b/node_modules/core-js-pure/es/array/virtual/iterator.js
deleted file mode 100644
index cd9f502..0000000
--- a/node_modules/core-js-pure/es/array/virtual/iterator.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.iterator');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').values;
diff --git a/node_modules/core-js-pure/es/array/virtual/join.js b/node_modules/core-js-pure/es/array/virtual/join.js
deleted file mode 100644
index 8cb329e..0000000
--- a/node_modules/core-js-pure/es/array/virtual/join.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.join');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').join;
diff --git a/node_modules/core-js-pure/es/array/virtual/keys.js b/node_modules/core-js-pure/es/array/virtual/keys.js
deleted file mode 100644
index 2882990..0000000
--- a/node_modules/core-js-pure/es/array/virtual/keys.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.iterator');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').keys;
diff --git a/node_modules/core-js-pure/es/array/virtual/last-index-of.js b/node_modules/core-js-pure/es/array/virtual/last-index-of.js
deleted file mode 100644
index ca1ae9b..0000000
--- a/node_modules/core-js-pure/es/array/virtual/last-index-of.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.last-index-of');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').lastIndexOf;
diff --git a/node_modules/core-js-pure/es/array/virtual/map.js b/node_modules/core-js-pure/es/array/virtual/map.js
deleted file mode 100644
index 7205f96..0000000
--- a/node_modules/core-js-pure/es/array/virtual/map.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.map');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').map;
diff --git a/node_modules/core-js-pure/es/array/virtual/reduce-right.js b/node_modules/core-js-pure/es/array/virtual/reduce-right.js
deleted file mode 100644
index 0ad5926..0000000
--- a/node_modules/core-js-pure/es/array/virtual/reduce-right.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.reduce-right');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').reduceRight;
diff --git a/node_modules/core-js-pure/es/array/virtual/reduce.js b/node_modules/core-js-pure/es/array/virtual/reduce.js
deleted file mode 100644
index d9b01c4..0000000
--- a/node_modules/core-js-pure/es/array/virtual/reduce.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.reduce');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').reduce;
diff --git a/node_modules/core-js-pure/es/array/virtual/reverse.js b/node_modules/core-js-pure/es/array/virtual/reverse.js
deleted file mode 100644
index 31ca6d8..0000000
--- a/node_modules/core-js-pure/es/array/virtual/reverse.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.reverse');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').reverse;
diff --git a/node_modules/core-js-pure/es/array/virtual/slice.js b/node_modules/core-js-pure/es/array/virtual/slice.js
deleted file mode 100644
index f60f5d5..0000000
--- a/node_modules/core-js-pure/es/array/virtual/slice.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.slice');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').slice;
diff --git a/node_modules/core-js-pure/es/array/virtual/some.js b/node_modules/core-js-pure/es/array/virtual/some.js
deleted file mode 100644
index a7ae18f..0000000
--- a/node_modules/core-js-pure/es/array/virtual/some.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.some');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').some;
diff --git a/node_modules/core-js-pure/es/array/virtual/sort.js b/node_modules/core-js-pure/es/array/virtual/sort.js
deleted file mode 100644
index b7e0a46..0000000
--- a/node_modules/core-js-pure/es/array/virtual/sort.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.sort');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').sort;
diff --git a/node_modules/core-js-pure/es/array/virtual/splice.js b/node_modules/core-js-pure/es/array/virtual/splice.js
deleted file mode 100644
index 2533cec..0000000
--- a/node_modules/core-js-pure/es/array/virtual/splice.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.splice');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').splice;
diff --git a/node_modules/core-js-pure/es/array/virtual/values.js b/node_modules/core-js-pure/es/array/virtual/values.js
deleted file mode 100644
index cd9f502..0000000
--- a/node_modules/core-js-pure/es/array/virtual/values.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.array.iterator');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').values;
diff --git a/node_modules/core-js-pure/es/data-view/index.js b/node_modules/core-js-pure/es/data-view/index.js
deleted file mode 100644
index da3582d..0000000
--- a/node_modules/core-js-pure/es/data-view/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.data-view');
-require('../../modules/es.object.to-string');
-var path = require('../../internals/path');
-
-module.exports = path.DataView;
diff --git a/node_modules/core-js-pure/es/date/index.js b/node_modules/core-js-pure/es/date/index.js
deleted file mode 100644
index 88e7a58..0000000
--- a/node_modules/core-js-pure/es/date/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-require('../../modules/es.date.now');
-require('../../modules/es.date.to-json');
-require('../../modules/es.date.to-iso-string');
-require('../../modules/es.date.to-string');
-require('../../modules/es.date.to-primitive');
-var path = require('../../internals/path');
-
-module.exports = path.Date;
diff --git a/node_modules/core-js-pure/es/date/now.js b/node_modules/core-js-pure/es/date/now.js
deleted file mode 100644
index ed6843e..0000000
--- a/node_modules/core-js-pure/es/date/now.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.date.now');
-var path = require('../../internals/path');
-
-module.exports = path.Date.now;
diff --git a/node_modules/core-js-pure/es/date/to-iso-string.js b/node_modules/core-js-pure/es/date/to-iso-string.js
deleted file mode 100644
index ee06767..0000000
--- a/node_modules/core-js-pure/es/date/to-iso-string.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.date.to-iso-string');
-require('../../modules/es.date.to-json');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Date', 'toISOString');
diff --git a/node_modules/core-js-pure/es/date/to-json.js b/node_modules/core-js-pure/es/date/to-json.js
deleted file mode 100644
index 1fa104a..0000000
--- a/node_modules/core-js-pure/es/date/to-json.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.date.to-json');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Date', 'toJSON');
diff --git a/node_modules/core-js-pure/es/date/to-primitive.js b/node_modules/core-js-pure/es/date/to-primitive.js
deleted file mode 100644
index 07bdd33..0000000
--- a/node_modules/core-js-pure/es/date/to-primitive.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('../../modules/es.date.to-primitive');
-var toPrimitive = require('../../internals/date-to-primitive');
-
-module.exports = function (it, hint) {
-  return toPrimitive.call(it, hint);
-};
diff --git a/node_modules/core-js-pure/es/date/to-string.js b/node_modules/core-js-pure/es/date/to-string.js
deleted file mode 100644
index 18b7135..0000000
--- a/node_modules/core-js-pure/es/date/to-string.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('../../modules/es.date.to-string');
-var dateToString = Date.prototype.toString;
-
-module.exports = function toString(it) {
-  return dateToString.call(it);
-};
diff --git a/node_modules/core-js-pure/es/function/bind.js b/node_modules/core-js-pure/es/function/bind.js
deleted file mode 100644
index a3e3575..0000000
--- a/node_modules/core-js-pure/es/function/bind.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.function.bind');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Function', 'bind');
diff --git a/node_modules/core-js-pure/es/function/has-instance.js b/node_modules/core-js-pure/es/function/has-instance.js
deleted file mode 100644
index 33722b0..0000000
--- a/node_modules/core-js-pure/es/function/has-instance.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.function.has-instance');
-var wellKnownSymbol = require('../../internals/well-known-symbol');
-
-module.exports = Function[wellKnownSymbol('hasInstance')];
diff --git a/node_modules/core-js-pure/es/function/index.js b/node_modules/core-js-pure/es/function/index.js
deleted file mode 100644
index 9caa29d..0000000
--- a/node_modules/core-js-pure/es/function/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('../../modules/es.function.bind');
-require('../../modules/es.function.name');
-require('../../modules/es.function.has-instance');
-var path = require('../../internals/path');
-
-module.exports = path.Function;
diff --git a/node_modules/core-js-pure/es/function/name.js b/node_modules/core-js-pure/es/function/name.js
deleted file mode 100644
index 43344db..0000000
--- a/node_modules/core-js-pure/es/function/name.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.function.name');
diff --git a/node_modules/core-js-pure/es/function/virtual/bind.js b/node_modules/core-js-pure/es/function/virtual/bind.js
deleted file mode 100644
index 7ec110d..0000000
--- a/node_modules/core-js-pure/es/function/virtual/bind.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.function.bind');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Function').bind;
diff --git a/node_modules/core-js-pure/es/function/virtual/index.js b/node_modules/core-js-pure/es/function/virtual/index.js
deleted file mode 100644
index 0a01135..0000000
--- a/node_modules/core-js-pure/es/function/virtual/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.function.bind');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Function');
diff --git a/node_modules/core-js-pure/es/global-this.js b/node_modules/core-js-pure/es/global-this.js
deleted file mode 100644
index 5ffa1dd..0000000
--- a/node_modules/core-js-pure/es/global-this.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../modules/es.global-this');
-
-module.exports = require('../internals/global');
diff --git a/node_modules/core-js-pure/es/index.js b/node_modules/core-js-pure/es/index.js
deleted file mode 100644
index 9436a37..0000000
--- a/node_modules/core-js-pure/es/index.js
+++ /dev/null
@@ -1,210 +0,0 @@
-require('../modules/es.symbol');
-require('../modules/es.symbol.async-iterator');
-require('../modules/es.symbol.description');
-require('../modules/es.symbol.has-instance');
-require('../modules/es.symbol.is-concat-spreadable');
-require('../modules/es.symbol.iterator');
-require('../modules/es.symbol.match');
-require('../modules/es.symbol.match-all');
-require('../modules/es.symbol.replace');
-require('../modules/es.symbol.search');
-require('../modules/es.symbol.species');
-require('../modules/es.symbol.split');
-require('../modules/es.symbol.to-primitive');
-require('../modules/es.symbol.to-string-tag');
-require('../modules/es.symbol.unscopables');
-require('../modules/es.object.assign');
-require('../modules/es.object.create');
-require('../modules/es.object.define-property');
-require('../modules/es.object.define-properties');
-require('../modules/es.object.entries');
-require('../modules/es.object.freeze');
-require('../modules/es.object.from-entries');
-require('../modules/es.object.get-own-property-descriptor');
-require('../modules/es.object.get-own-property-descriptors');
-require('../modules/es.object.get-own-property-names');
-require('../modules/es.object.get-prototype-of');
-require('../modules/es.object.is');
-require('../modules/es.object.is-extensible');
-require('../modules/es.object.is-frozen');
-require('../modules/es.object.is-sealed');
-require('../modules/es.object.keys');
-require('../modules/es.object.prevent-extensions');
-require('../modules/es.object.seal');
-require('../modules/es.object.set-prototype-of');
-require('../modules/es.object.values');
-require('../modules/es.object.to-string');
-require('../modules/es.object.define-getter');
-require('../modules/es.object.define-setter');
-require('../modules/es.object.lookup-getter');
-require('../modules/es.object.lookup-setter');
-require('../modules/es.function.bind');
-require('../modules/es.function.name');
-require('../modules/es.function.has-instance');
-require('../modules/es.global-this');
-require('../modules/es.array.from');
-require('../modules/es.array.is-array');
-require('../modules/es.array.of');
-require('../modules/es.array.concat');
-require('../modules/es.array.copy-within');
-require('../modules/es.array.every');
-require('../modules/es.array.fill');
-require('../modules/es.array.filter');
-require('../modules/es.array.find');
-require('../modules/es.array.find-index');
-require('../modules/es.array.flat');
-require('../modules/es.array.flat-map');
-require('../modules/es.array.for-each');
-require('../modules/es.array.includes');
-require('../modules/es.array.index-of');
-require('../modules/es.array.join');
-require('../modules/es.array.last-index-of');
-require('../modules/es.array.map');
-require('../modules/es.array.reduce');
-require('../modules/es.array.reduce-right');
-require('../modules/es.array.reverse');
-require('../modules/es.array.slice');
-require('../modules/es.array.some');
-require('../modules/es.array.sort');
-require('../modules/es.array.splice');
-require('../modules/es.array.species');
-require('../modules/es.array.unscopables.flat');
-require('../modules/es.array.unscopables.flat-map');
-require('../modules/es.array.iterator');
-require('../modules/es.string.from-code-point');
-require('../modules/es.string.raw');
-require('../modules/es.string.code-point-at');
-require('../modules/es.string.ends-with');
-require('../modules/es.string.includes');
-require('../modules/es.string.match');
-require('../modules/es.string.match-all');
-require('../modules/es.string.pad-end');
-require('../modules/es.string.pad-start');
-require('../modules/es.string.repeat');
-require('../modules/es.string.replace');
-require('../modules/es.string.search');
-require('../modules/es.string.split');
-require('../modules/es.string.starts-with');
-require('../modules/es.string.trim');
-require('../modules/es.string.trim-start');
-require('../modules/es.string.trim-end');
-require('../modules/es.string.iterator');
-require('../modules/es.string.anchor');
-require('../modules/es.string.big');
-require('../modules/es.string.blink');
-require('../modules/es.string.bold');
-require('../modules/es.string.fixed');
-require('../modules/es.string.fontcolor');
-require('../modules/es.string.fontsize');
-require('../modules/es.string.italics');
-require('../modules/es.string.link');
-require('../modules/es.string.small');
-require('../modules/es.string.strike');
-require('../modules/es.string.sub');
-require('../modules/es.string.sup');
-require('../modules/es.regexp.constructor');
-require('../modules/es.regexp.exec');
-require('../modules/es.regexp.flags');
-require('../modules/es.regexp.sticky');
-require('../modules/es.regexp.test');
-require('../modules/es.regexp.to-string');
-require('../modules/es.parse-int');
-require('../modules/es.parse-float');
-require('../modules/es.number.constructor');
-require('../modules/es.number.epsilon');
-require('../modules/es.number.is-finite');
-require('../modules/es.number.is-integer');
-require('../modules/es.number.is-nan');
-require('../modules/es.number.is-safe-integer');
-require('../modules/es.number.max-safe-integer');
-require('../modules/es.number.min-safe-integer');
-require('../modules/es.number.parse-float');
-require('../modules/es.number.parse-int');
-require('../modules/es.number.to-fixed');
-require('../modules/es.number.to-precision');
-require('../modules/es.math.acosh');
-require('../modules/es.math.asinh');
-require('../modules/es.math.atanh');
-require('../modules/es.math.cbrt');
-require('../modules/es.math.clz32');
-require('../modules/es.math.cosh');
-require('../modules/es.math.expm1');
-require('../modules/es.math.fround');
-require('../modules/es.math.hypot');
-require('../modules/es.math.imul');
-require('../modules/es.math.log10');
-require('../modules/es.math.log1p');
-require('../modules/es.math.log2');
-require('../modules/es.math.sign');
-require('../modules/es.math.sinh');
-require('../modules/es.math.tanh');
-require('../modules/es.math.to-string-tag');
-require('../modules/es.math.trunc');
-require('../modules/es.date.now');
-require('../modules/es.date.to-json');
-require('../modules/es.date.to-iso-string');
-require('../modules/es.date.to-string');
-require('../modules/es.date.to-primitive');
-require('../modules/es.json.stringify');
-require('../modules/es.json.to-string-tag');
-require('../modules/es.promise');
-require('../modules/es.promise.all-settled');
-require('../modules/es.promise.finally');
-require('../modules/es.map');
-require('../modules/es.set');
-require('../modules/es.weak-map');
-require('../modules/es.weak-set');
-require('../modules/es.array-buffer.constructor');
-require('../modules/es.array-buffer.is-view');
-require('../modules/es.array-buffer.slice');
-require('../modules/es.data-view');
-require('../modules/es.typed-array.int8-array');
-require('../modules/es.typed-array.uint8-array');
-require('../modules/es.typed-array.uint8-clamped-array');
-require('../modules/es.typed-array.int16-array');
-require('../modules/es.typed-array.uint16-array');
-require('../modules/es.typed-array.int32-array');
-require('../modules/es.typed-array.uint32-array');
-require('../modules/es.typed-array.float32-array');
-require('../modules/es.typed-array.float64-array');
-require('../modules/es.typed-array.from');
-require('../modules/es.typed-array.of');
-require('../modules/es.typed-array.copy-within');
-require('../modules/es.typed-array.every');
-require('../modules/es.typed-array.fill');
-require('../modules/es.typed-array.filter');
-require('../modules/es.typed-array.find');
-require('../modules/es.typed-array.find-index');
-require('../modules/es.typed-array.for-each');
-require('../modules/es.typed-array.includes');
-require('../modules/es.typed-array.index-of');
-require('../modules/es.typed-array.iterator');
-require('../modules/es.typed-array.join');
-require('../modules/es.typed-array.last-index-of');
-require('../modules/es.typed-array.map');
-require('../modules/es.typed-array.reduce');
-require('../modules/es.typed-array.reduce-right');
-require('../modules/es.typed-array.reverse');
-require('../modules/es.typed-array.set');
-require('../modules/es.typed-array.slice');
-require('../modules/es.typed-array.some');
-require('../modules/es.typed-array.sort');
-require('../modules/es.typed-array.subarray');
-require('../modules/es.typed-array.to-locale-string');
-require('../modules/es.typed-array.to-string');
-require('../modules/es.reflect.apply');
-require('../modules/es.reflect.construct');
-require('../modules/es.reflect.define-property');
-require('../modules/es.reflect.delete-property');
-require('../modules/es.reflect.get');
-require('../modules/es.reflect.get-own-property-descriptor');
-require('../modules/es.reflect.get-prototype-of');
-require('../modules/es.reflect.has');
-require('../modules/es.reflect.is-extensible');
-require('../modules/es.reflect.own-keys');
-require('../modules/es.reflect.prevent-extensions');
-require('../modules/es.reflect.set');
-require('../modules/es.reflect.set-prototype-of');
-var path = require('../internals/path');
-
-module.exports = path;
diff --git a/node_modules/core-js-pure/es/instance/bind.js b/node_modules/core-js-pure/es/instance/bind.js
deleted file mode 100644
index 11f932a..0000000
--- a/node_modules/core-js-pure/es/instance/bind.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var bind = require('../function/virtual/bind');
-
-var FunctionPrototype = Function.prototype;
-
-module.exports = function (it) {
-  var own = it.bind;
-  return it === FunctionPrototype || (it instanceof Function && own === FunctionPrototype.bind) ? bind : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/code-point-at.js b/node_modules/core-js-pure/es/instance/code-point-at.js
deleted file mode 100644
index c4eaa42..0000000
--- a/node_modules/core-js-pure/es/instance/code-point-at.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var codePointAt = require('../string/virtual/code-point-at');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.codePointAt;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.codePointAt) ? codePointAt : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/concat.js b/node_modules/core-js-pure/es/instance/concat.js
deleted file mode 100644
index 87b7413..0000000
--- a/node_modules/core-js-pure/es/instance/concat.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var concat = require('../array/virtual/concat');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.concat;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.concat) ? concat : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/copy-within.js b/node_modules/core-js-pure/es/instance/copy-within.js
deleted file mode 100644
index c59f52d..0000000
--- a/node_modules/core-js-pure/es/instance/copy-within.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var copyWithin = require('../array/virtual/copy-within');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.copyWithin;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.copyWithin) ? copyWithin : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/ends-with.js b/node_modules/core-js-pure/es/instance/ends-with.js
deleted file mode 100644
index 532d6f7..0000000
--- a/node_modules/core-js-pure/es/instance/ends-with.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var endsWith = require('../string/virtual/ends-with');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.endsWith;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.endsWith) ? endsWith : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/entries.js b/node_modules/core-js-pure/es/instance/entries.js
deleted file mode 100644
index 8aedc41..0000000
--- a/node_modules/core-js-pure/es/instance/entries.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var entries = require('../array/virtual/entries');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.entries;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.entries) ? entries : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/every.js b/node_modules/core-js-pure/es/instance/every.js
deleted file mode 100644
index 1faaccb..0000000
--- a/node_modules/core-js-pure/es/instance/every.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var every = require('../array/virtual/every');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.every;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.every) ? every : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/fill.js b/node_modules/core-js-pure/es/instance/fill.js
deleted file mode 100644
index 5d0f22b..0000000
--- a/node_modules/core-js-pure/es/instance/fill.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var fill = require('../array/virtual/fill');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.fill;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.fill) ? fill : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/filter.js b/node_modules/core-js-pure/es/instance/filter.js
deleted file mode 100644
index 8ba32b6..0000000
--- a/node_modules/core-js-pure/es/instance/filter.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var filter = require('../array/virtual/filter');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.filter;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.filter) ? filter : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/find-index.js b/node_modules/core-js-pure/es/instance/find-index.js
deleted file mode 100644
index 27a0583..0000000
--- a/node_modules/core-js-pure/es/instance/find-index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var findIndex = require('../array/virtual/find-index');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.findIndex;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.findIndex) ? findIndex : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/find.js b/node_modules/core-js-pure/es/instance/find.js
deleted file mode 100644
index 70443c7..0000000
--- a/node_modules/core-js-pure/es/instance/find.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var find = require('../array/virtual/find');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.find;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.find) ? find : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/flags.js b/node_modules/core-js-pure/es/instance/flags.js
deleted file mode 100644
index f0b9114..0000000
--- a/node_modules/core-js-pure/es/instance/flags.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var flags = require('../regexp/flags');
-
-var RegExpPrototype = RegExp.prototype;
-
-module.exports = function (it) {
-  return (it === RegExpPrototype || it instanceof RegExp) && !('flags' in it) ? flags(it) : it.flags;
-};
diff --git a/node_modules/core-js-pure/es/instance/flat-map.js b/node_modules/core-js-pure/es/instance/flat-map.js
deleted file mode 100644
index eca5a41..0000000
--- a/node_modules/core-js-pure/es/instance/flat-map.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var flatMap = require('../array/virtual/flat-map');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.flatMap;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.flatMap) ? flatMap : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/flat.js b/node_modules/core-js-pure/es/instance/flat.js
deleted file mode 100644
index 186a729..0000000
--- a/node_modules/core-js-pure/es/instance/flat.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var flat = require('../array/virtual/flat');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.flat;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.flat) ? flat : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/for-each.js b/node_modules/core-js-pure/es/instance/for-each.js
deleted file mode 100644
index 3a2e6a9..0000000
--- a/node_modules/core-js-pure/es/instance/for-each.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var forEach = require('../array/virtual/for-each');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.forEach;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.forEach) ? forEach : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/includes.js b/node_modules/core-js-pure/es/instance/includes.js
deleted file mode 100644
index d282373..0000000
--- a/node_modules/core-js-pure/es/instance/includes.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var arrayIncludes = require('../array/virtual/includes');
-var stringIncludes = require('../string/virtual/includes');
-
-var ArrayPrototype = Array.prototype;
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.includes;
-  if (it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.includes)) return arrayIncludes;
-  if (typeof it === 'string' || it === StringPrototype || (it instanceof String && own === StringPrototype.includes)) {
-    return stringIncludes;
-  } return own;
-};
diff --git a/node_modules/core-js-pure/es/instance/index-of.js b/node_modules/core-js-pure/es/instance/index-of.js
deleted file mode 100644
index a5fa42a..0000000
--- a/node_modules/core-js-pure/es/instance/index-of.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var indexOf = require('../array/virtual/index-of');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.indexOf;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.indexOf) ? indexOf : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/keys.js b/node_modules/core-js-pure/es/instance/keys.js
deleted file mode 100644
index 0e2dca2..0000000
--- a/node_modules/core-js-pure/es/instance/keys.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var keys = require('../array/virtual/keys');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.keys;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.keys) ? keys : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/last-index-of.js b/node_modules/core-js-pure/es/instance/last-index-of.js
deleted file mode 100644
index 729bc65..0000000
--- a/node_modules/core-js-pure/es/instance/last-index-of.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var lastIndexOf = require('../array/virtual/last-index-of');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.lastIndexOf;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.lastIndexOf) ? lastIndexOf : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/map.js b/node_modules/core-js-pure/es/instance/map.js
deleted file mode 100644
index 4d2d17f..0000000
--- a/node_modules/core-js-pure/es/instance/map.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var map = require('../array/virtual/map');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.map;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.map) ? map : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/match-all.js b/node_modules/core-js-pure/es/instance/match-all.js
deleted file mode 100644
index 2ab56b1..0000000
--- a/node_modules/core-js-pure/es/instance/match-all.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var matchAll = require('../string/virtual/match-all');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.matchAll;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.matchAll) ? matchAll : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/pad-end.js b/node_modules/core-js-pure/es/instance/pad-end.js
deleted file mode 100644
index 40ea603..0000000
--- a/node_modules/core-js-pure/es/instance/pad-end.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var padEnd = require('../string/virtual/pad-end');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.padEnd;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.padEnd) ? padEnd : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/pad-start.js b/node_modules/core-js-pure/es/instance/pad-start.js
deleted file mode 100644
index 1e3220c..0000000
--- a/node_modules/core-js-pure/es/instance/pad-start.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var padStart = require('../string/virtual/pad-start');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.padStart;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.padStart) ? padStart : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/reduce-right.js b/node_modules/core-js-pure/es/instance/reduce-right.js
deleted file mode 100644
index 6a8802f..0000000
--- a/node_modules/core-js-pure/es/instance/reduce-right.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var reduceRight = require('../array/virtual/reduce-right');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.reduceRight;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.reduceRight) ? reduceRight : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/reduce.js b/node_modules/core-js-pure/es/instance/reduce.js
deleted file mode 100644
index efa46a9..0000000
--- a/node_modules/core-js-pure/es/instance/reduce.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var reduce = require('../array/virtual/reduce');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.reduce;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.reduce) ? reduce : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/repeat.js b/node_modules/core-js-pure/es/instance/repeat.js
deleted file mode 100644
index d4c05ad..0000000
--- a/node_modules/core-js-pure/es/instance/repeat.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var repeat = require('../string/virtual/repeat');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.repeat;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.repeat) ? repeat : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/reverse.js b/node_modules/core-js-pure/es/instance/reverse.js
deleted file mode 100644
index ca4bfea..0000000
--- a/node_modules/core-js-pure/es/instance/reverse.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var reverse = require('../array/virtual/reverse');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.reverse;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.reverse) ? reverse : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/slice.js b/node_modules/core-js-pure/es/instance/slice.js
deleted file mode 100644
index 03ef7a7..0000000
--- a/node_modules/core-js-pure/es/instance/slice.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var slice = require('../array/virtual/slice');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.slice;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.slice) ? slice : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/some.js b/node_modules/core-js-pure/es/instance/some.js
deleted file mode 100644
index 562c11e..0000000
--- a/node_modules/core-js-pure/es/instance/some.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var some = require('../array/virtual/some');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.some;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.some) ? some : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/sort.js b/node_modules/core-js-pure/es/instance/sort.js
deleted file mode 100644
index 96edb80..0000000
--- a/node_modules/core-js-pure/es/instance/sort.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var sort = require('../array/virtual/sort');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.sort;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.sort) ? sort : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/splice.js b/node_modules/core-js-pure/es/instance/splice.js
deleted file mode 100644
index 5b907f4..0000000
--- a/node_modules/core-js-pure/es/instance/splice.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var splice = require('../array/virtual/splice');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.splice;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.splice) ? splice : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/starts-with.js b/node_modules/core-js-pure/es/instance/starts-with.js
deleted file mode 100644
index 99a01a7..0000000
--- a/node_modules/core-js-pure/es/instance/starts-with.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var startsWith = require('../string/virtual/starts-with');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.startsWith;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.startsWith) ? startsWith : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/trim-end.js b/node_modules/core-js-pure/es/instance/trim-end.js
deleted file mode 100644
index c004cba..0000000
--- a/node_modules/core-js-pure/es/instance/trim-end.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var trimEnd = require('../string/virtual/trim-end');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.trimEnd;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.trimEnd) ? trimEnd : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/trim-left.js b/node_modules/core-js-pure/es/instance/trim-left.js
deleted file mode 100644
index fc5c309..0000000
--- a/node_modules/core-js-pure/es/instance/trim-left.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var trimLeft = require('../string/virtual/trim-left');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.trimLeft;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.trimLeft) ? trimLeft : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/trim-right.js b/node_modules/core-js-pure/es/instance/trim-right.js
deleted file mode 100644
index ef38eff..0000000
--- a/node_modules/core-js-pure/es/instance/trim-right.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var trimRight = require('../string/virtual/trim-right');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.trimRight;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.trimRight) ? trimRight : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/trim-start.js b/node_modules/core-js-pure/es/instance/trim-start.js
deleted file mode 100644
index 74a89bd..0000000
--- a/node_modules/core-js-pure/es/instance/trim-start.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var trimStart = require('../string/virtual/trim-start');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.trimStart;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.trimStart) ? trimStart : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/trim.js b/node_modules/core-js-pure/es/instance/trim.js
deleted file mode 100644
index cdd3ed9..0000000
--- a/node_modules/core-js-pure/es/instance/trim.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var trim = require('../string/virtual/trim');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.trim;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.trim) ? trim : own;
-};
diff --git a/node_modules/core-js-pure/es/instance/values.js b/node_modules/core-js-pure/es/instance/values.js
deleted file mode 100644
index 52c76df..0000000
--- a/node_modules/core-js-pure/es/instance/values.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var values = require('../array/virtual/values');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.values;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.values) ? values : own;
-};
diff --git a/node_modules/core-js-pure/es/json/index.js b/node_modules/core-js-pure/es/json/index.js
deleted file mode 100644
index c16528a..0000000
--- a/node_modules/core-js-pure/es/json/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.json.stringify');
-require('../../modules/es.json.to-string-tag');
-var path = require('../../internals/path');
-
-module.exports = path.JSON || (path.JSON = { stringify: JSON.stringify });
diff --git a/node_modules/core-js-pure/es/json/stringify.js b/node_modules/core-js-pure/es/json/stringify.js
deleted file mode 100644
index 5bbebc9..0000000
--- a/node_modules/core-js-pure/es/json/stringify.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.json.stringify');
-var core = require('../../internals/path');
-
-if (!core.JSON) core.JSON = { stringify: JSON.stringify };
-
-// eslint-disable-next-line no-unused-vars
-module.exports = function stringify(it, replacer, space) {
-  return core.JSON.stringify.apply(null, arguments);
-};
diff --git a/node_modules/core-js-pure/es/json/to-string-tag.js b/node_modules/core-js-pure/es/json/to-string-tag.js
deleted file mode 100644
index 7ed4618..0000000
--- a/node_modules/core-js-pure/es/json/to-string-tag.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../../modules/es.json.to-string-tag');
-
-module.exports = 'JSON';
diff --git a/node_modules/core-js-pure/es/map/index.js b/node_modules/core-js-pure/es/map/index.js
deleted file mode 100644
index ab554cf..0000000
--- a/node_modules/core-js-pure/es/map/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-module.exports = path.Map;
diff --git a/node_modules/core-js-pure/es/math/acosh.js b/node_modules/core-js-pure/es/math/acosh.js
deleted file mode 100644
index 0ef459b..0000000
--- a/node_modules/core-js-pure/es/math/acosh.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.acosh');
-var path = require('../../internals/path');
-
-module.exports = path.Math.acosh;
diff --git a/node_modules/core-js-pure/es/math/asinh.js b/node_modules/core-js-pure/es/math/asinh.js
deleted file mode 100644
index f300ec4..0000000
--- a/node_modules/core-js-pure/es/math/asinh.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.asinh');
-var path = require('../../internals/path');
-
-module.exports = path.Math.asinh;
diff --git a/node_modules/core-js-pure/es/math/atanh.js b/node_modules/core-js-pure/es/math/atanh.js
deleted file mode 100644
index 6ca6111..0000000
--- a/node_modules/core-js-pure/es/math/atanh.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.atanh');
-var path = require('../../internals/path');
-
-module.exports = path.Math.atanh;
diff --git a/node_modules/core-js-pure/es/math/cbrt.js b/node_modules/core-js-pure/es/math/cbrt.js
deleted file mode 100644
index c8297a7..0000000
--- a/node_modules/core-js-pure/es/math/cbrt.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.cbrt');
-var path = require('../../internals/path');
-
-module.exports = path.Math.cbrt;
diff --git a/node_modules/core-js-pure/es/math/clz32.js b/node_modules/core-js-pure/es/math/clz32.js
deleted file mode 100644
index a2ea307..0000000
--- a/node_modules/core-js-pure/es/math/clz32.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.clz32');
-var path = require('../../internals/path');
-
-module.exports = path.Math.clz32;
diff --git a/node_modules/core-js-pure/es/math/cosh.js b/node_modules/core-js-pure/es/math/cosh.js
deleted file mode 100644
index 09dc191..0000000
--- a/node_modules/core-js-pure/es/math/cosh.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.cosh');
-var path = require('../../internals/path');
-
-module.exports = path.Math.cosh;
diff --git a/node_modules/core-js-pure/es/math/expm1.js b/node_modules/core-js-pure/es/math/expm1.js
deleted file mode 100644
index 9657376..0000000
--- a/node_modules/core-js-pure/es/math/expm1.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.expm1');
-var path = require('../../internals/path');
-
-module.exports = path.Math.expm1;
diff --git a/node_modules/core-js-pure/es/math/fround.js b/node_modules/core-js-pure/es/math/fround.js
deleted file mode 100644
index 41c7292..0000000
--- a/node_modules/core-js-pure/es/math/fround.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.fround');
-var path = require('../../internals/path');
-
-module.exports = path.Math.fround;
diff --git a/node_modules/core-js-pure/es/math/hypot.js b/node_modules/core-js-pure/es/math/hypot.js
deleted file mode 100644
index 34d5175..0000000
--- a/node_modules/core-js-pure/es/math/hypot.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.hypot');
-var path = require('../../internals/path');
-
-module.exports = path.Math.hypot;
diff --git a/node_modules/core-js-pure/es/math/imul.js b/node_modules/core-js-pure/es/math/imul.js
deleted file mode 100644
index 2f17f93..0000000
--- a/node_modules/core-js-pure/es/math/imul.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.imul');
-var path = require('../../internals/path');
-
-module.exports = path.Math.imul;
diff --git a/node_modules/core-js-pure/es/math/index.js b/node_modules/core-js-pure/es/math/index.js
deleted file mode 100644
index 8986227..0000000
--- a/node_modules/core-js-pure/es/math/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-require('../../modules/es.math.acosh');
-require('../../modules/es.math.asinh');
-require('../../modules/es.math.atanh');
-require('../../modules/es.math.cbrt');
-require('../../modules/es.math.clz32');
-require('../../modules/es.math.cosh');
-require('../../modules/es.math.expm1');
-require('../../modules/es.math.fround');
-require('../../modules/es.math.hypot');
-require('../../modules/es.math.imul');
-require('../../modules/es.math.log10');
-require('../../modules/es.math.log1p');
-require('../../modules/es.math.log2');
-require('../../modules/es.math.sign');
-require('../../modules/es.math.sinh');
-require('../../modules/es.math.tanh');
-require('../../modules/es.math.to-string-tag');
-require('../../modules/es.math.trunc');
-var path = require('../../internals/path');
-
-module.exports = path.Math;
diff --git a/node_modules/core-js-pure/es/math/log10.js b/node_modules/core-js-pure/es/math/log10.js
deleted file mode 100644
index b91166f..0000000
--- a/node_modules/core-js-pure/es/math/log10.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.log10');
-var path = require('../../internals/path');
-
-module.exports = path.Math.log10;
diff --git a/node_modules/core-js-pure/es/math/log1p.js b/node_modules/core-js-pure/es/math/log1p.js
deleted file mode 100644
index a1d4db1..0000000
--- a/node_modules/core-js-pure/es/math/log1p.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.log1p');
-var path = require('../../internals/path');
-
-module.exports = path.Math.log1p;
diff --git a/node_modules/core-js-pure/es/math/log2.js b/node_modules/core-js-pure/es/math/log2.js
deleted file mode 100644
index 99c0594..0000000
--- a/node_modules/core-js-pure/es/math/log2.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.log2');
-var path = require('../../internals/path');
-
-module.exports = path.Math.log2;
diff --git a/node_modules/core-js-pure/es/math/sign.js b/node_modules/core-js-pure/es/math/sign.js
deleted file mode 100644
index 9f6eb95..0000000
--- a/node_modules/core-js-pure/es/math/sign.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.sign');
-var path = require('../../internals/path');
-
-module.exports = path.Math.sign;
diff --git a/node_modules/core-js-pure/es/math/sinh.js b/node_modules/core-js-pure/es/math/sinh.js
deleted file mode 100644
index cf8d51a..0000000
--- a/node_modules/core-js-pure/es/math/sinh.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.sinh');
-var path = require('../../internals/path');
-
-module.exports = path.Math.sinh;
diff --git a/node_modules/core-js-pure/es/math/tanh.js b/node_modules/core-js-pure/es/math/tanh.js
deleted file mode 100644
index 030c175..0000000
--- a/node_modules/core-js-pure/es/math/tanh.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.tanh');
-var path = require('../../internals/path');
-
-module.exports = path.Math.tanh;
diff --git a/node_modules/core-js-pure/es/math/to-string-tag.js b/node_modules/core-js-pure/es/math/to-string-tag.js
deleted file mode 100644
index c8714c2..0000000
--- a/node_modules/core-js-pure/es/math/to-string-tag.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../../modules/es.math.to-string-tag');
-
-module.exports = 'Math';
diff --git a/node_modules/core-js-pure/es/math/trunc.js b/node_modules/core-js-pure/es/math/trunc.js
deleted file mode 100644
index 510337b..0000000
--- a/node_modules/core-js-pure/es/math/trunc.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.math.trunc');
-var path = require('../../internals/path');
-
-module.exports = path.Math.trunc;
diff --git a/node_modules/core-js-pure/es/number/constructor.js b/node_modules/core-js-pure/es/number/constructor.js
deleted file mode 100644
index a77a1aa..0000000
--- a/node_modules/core-js-pure/es/number/constructor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../../modules/es.number.constructor');
-
-module.exports = Number;
diff --git a/node_modules/core-js-pure/es/number/epsilon.js b/node_modules/core-js-pure/es/number/epsilon.js
deleted file mode 100644
index 627b077..0000000
--- a/node_modules/core-js-pure/es/number/epsilon.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../../modules/es.number.epsilon');
-
-module.exports = Math.pow(2, -52);
diff --git a/node_modules/core-js-pure/es/number/index.js b/node_modules/core-js-pure/es/number/index.js
deleted file mode 100644
index 1341b56..0000000
--- a/node_modules/core-js-pure/es/number/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-require('../../modules/es.number.constructor');
-require('../../modules/es.number.epsilon');
-require('../../modules/es.number.is-finite');
-require('../../modules/es.number.is-integer');
-require('../../modules/es.number.is-nan');
-require('../../modules/es.number.is-safe-integer');
-require('../../modules/es.number.max-safe-integer');
-require('../../modules/es.number.min-safe-integer');
-require('../../modules/es.number.parse-float');
-require('../../modules/es.number.parse-int');
-require('../../modules/es.number.to-fixed');
-require('../../modules/es.number.to-precision');
-var path = require('../../internals/path');
-
-module.exports = path.Number;
diff --git a/node_modules/core-js-pure/es/number/is-finite.js b/node_modules/core-js-pure/es/number/is-finite.js
deleted file mode 100644
index dd16f9d..0000000
--- a/node_modules/core-js-pure/es/number/is-finite.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.number.is-finite');
-var path = require('../../internals/path');
-
-module.exports = path.Number.isFinite;
diff --git a/node_modules/core-js-pure/es/number/is-integer.js b/node_modules/core-js-pure/es/number/is-integer.js
deleted file mode 100644
index c6734a9..0000000
--- a/node_modules/core-js-pure/es/number/is-integer.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.number.is-integer');
-var path = require('../../internals/path');
-
-module.exports = path.Number.isInteger;
diff --git a/node_modules/core-js-pure/es/number/is-nan.js b/node_modules/core-js-pure/es/number/is-nan.js
deleted file mode 100644
index 9af93bb..0000000
--- a/node_modules/core-js-pure/es/number/is-nan.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.number.is-nan');
-var path = require('../../internals/path');
-
-module.exports = path.Number.isNaN;
diff --git a/node_modules/core-js-pure/es/number/is-safe-integer.js b/node_modules/core-js-pure/es/number/is-safe-integer.js
deleted file mode 100644
index ec34c62..0000000
--- a/node_modules/core-js-pure/es/number/is-safe-integer.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.number.is-safe-integer');
-var path = require('../../internals/path');
-
-module.exports = path.Number.isSafeInteger;
diff --git a/node_modules/core-js-pure/es/number/max-safe-integer.js b/node_modules/core-js-pure/es/number/max-safe-integer.js
deleted file mode 100644
index b901200..0000000
--- a/node_modules/core-js-pure/es/number/max-safe-integer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../../modules/es.number.max-safe-integer');
-
-module.exports = 0x1FFFFFFFFFFFFF;
diff --git a/node_modules/core-js-pure/es/number/min-safe-integer.js b/node_modules/core-js-pure/es/number/min-safe-integer.js
deleted file mode 100644
index 3678895..0000000
--- a/node_modules/core-js-pure/es/number/min-safe-integer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../../modules/es.number.min-safe-integer');
-
-module.exports = -0x1FFFFFFFFFFFFF;
diff --git a/node_modules/core-js-pure/es/number/parse-float.js b/node_modules/core-js-pure/es/number/parse-float.js
deleted file mode 100644
index 5d71e39..0000000
--- a/node_modules/core-js-pure/es/number/parse-float.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.number.parse-float');
-var path = require('../../internals/path');
-
-module.exports = path.Number.parseFloat;
diff --git a/node_modules/core-js-pure/es/number/parse-int.js b/node_modules/core-js-pure/es/number/parse-int.js
deleted file mode 100644
index c833b0a..0000000
--- a/node_modules/core-js-pure/es/number/parse-int.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.number.parse-int');
-var path = require('../../internals/path');
-
-module.exports = path.Number.parseInt;
diff --git a/node_modules/core-js-pure/es/number/to-fixed.js b/node_modules/core-js-pure/es/number/to-fixed.js
deleted file mode 100644
index e127124..0000000
--- a/node_modules/core-js-pure/es/number/to-fixed.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.number.to-fixed');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Number', 'toFixed');
diff --git a/node_modules/core-js-pure/es/number/to-precision.js b/node_modules/core-js-pure/es/number/to-precision.js
deleted file mode 100644
index fd5b83b..0000000
--- a/node_modules/core-js-pure/es/number/to-precision.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.number.to-precision');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Number', 'toPrecision');
diff --git a/node_modules/core-js-pure/es/number/virtual/index.js b/node_modules/core-js-pure/es/number/virtual/index.js
deleted file mode 100644
index 693aca9..0000000
--- a/node_modules/core-js-pure/es/number/virtual/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../../modules/es.number.to-fixed');
-require('../../../modules/es.number.to-precision');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Number');
diff --git a/node_modules/core-js-pure/es/number/virtual/to-fixed.js b/node_modules/core-js-pure/es/number/virtual/to-fixed.js
deleted file mode 100644
index be7265d..0000000
--- a/node_modules/core-js-pure/es/number/virtual/to-fixed.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.number.to-fixed');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Number').toFixed;
diff --git a/node_modules/core-js-pure/es/number/virtual/to-precision.js b/node_modules/core-js-pure/es/number/virtual/to-precision.js
deleted file mode 100644
index 701c5aa..0000000
--- a/node_modules/core-js-pure/es/number/virtual/to-precision.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.number.to-precision');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Number').toPrecision;
diff --git a/node_modules/core-js-pure/es/object/assign.js b/node_modules/core-js-pure/es/object/assign.js
deleted file mode 100644
index b747e5b..0000000
--- a/node_modules/core-js-pure/es/object/assign.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.assign');
-var path = require('../../internals/path');
-
-module.exports = path.Object.assign;
diff --git a/node_modules/core-js-pure/es/object/create.js b/node_modules/core-js-pure/es/object/create.js
deleted file mode 100644
index 6f060c9..0000000
--- a/node_modules/core-js-pure/es/object/create.js
+++ /dev/null
@@ -1,8 +0,0 @@
-require('../../modules/es.object.create');
-var path = require('../../internals/path');
-
-var Object = path.Object;
-
-module.exports = function create(P, D) {
-  return Object.create(P, D);
-};
diff --git a/node_modules/core-js-pure/es/object/define-getter.js b/node_modules/core-js-pure/es/object/define-getter.js
deleted file mode 100644
index 98b77a0..0000000
--- a/node_modules/core-js-pure/es/object/define-getter.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.define-getter');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Object', '__defineGetter__');
diff --git a/node_modules/core-js-pure/es/object/define-properties.js b/node_modules/core-js-pure/es/object/define-properties.js
deleted file mode 100644
index 30c21aa..0000000
--- a/node_modules/core-js-pure/es/object/define-properties.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.define-properties');
-var path = require('../../internals/path');
-
-var Object = path.Object;
-
-var defineProperties = module.exports = function defineProperties(T, D) {
-  return Object.defineProperties(T, D);
-};
-
-if (Object.defineProperties.sham) defineProperties.sham = true;
diff --git a/node_modules/core-js-pure/es/object/define-property.js b/node_modules/core-js-pure/es/object/define-property.js
deleted file mode 100644
index eb51b5f..0000000
--- a/node_modules/core-js-pure/es/object/define-property.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.define-property');
-var path = require('../../internals/path');
-
-var Object = path.Object;
-
-var defineProperty = module.exports = function defineProperty(it, key, desc) {
-  return Object.defineProperty(it, key, desc);
-};
-
-if (Object.defineProperty.sham) defineProperty.sham = true;
diff --git a/node_modules/core-js-pure/es/object/define-setter.js b/node_modules/core-js-pure/es/object/define-setter.js
deleted file mode 100644
index ccae06a..0000000
--- a/node_modules/core-js-pure/es/object/define-setter.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.define-setter');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Object', '__defineSetter__');
diff --git a/node_modules/core-js-pure/es/object/entries.js b/node_modules/core-js-pure/es/object/entries.js
deleted file mode 100644
index 4715ad1..0000000
--- a/node_modules/core-js-pure/es/object/entries.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.entries');
-var path = require('../../internals/path');
-
-module.exports = path.Object.entries;
diff --git a/node_modules/core-js-pure/es/object/freeze.js b/node_modules/core-js-pure/es/object/freeze.js
deleted file mode 100644
index e50b82b..0000000
--- a/node_modules/core-js-pure/es/object/freeze.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.freeze');
-var path = require('../../internals/path');
-
-module.exports = path.Object.freeze;
diff --git a/node_modules/core-js-pure/es/object/from-entries.js b/node_modules/core-js-pure/es/object/from-entries.js
deleted file mode 100644
index 530f16d..0000000
--- a/node_modules/core-js-pure/es/object/from-entries.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.array.iterator');
-require('../../modules/es.object.from-entries');
-var path = require('../../internals/path');
-
-module.exports = path.Object.fromEntries;
diff --git a/node_modules/core-js-pure/es/object/get-own-property-descriptor.js b/node_modules/core-js-pure/es/object/get-own-property-descriptor.js
deleted file mode 100644
index 002c7ed..0000000
--- a/node_modules/core-js-pure/es/object/get-own-property-descriptor.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.get-own-property-descriptor');
-var path = require('../../internals/path');
-
-var Object = path.Object;
-
-var getOwnPropertyDescriptor = module.exports = function getOwnPropertyDescriptor(it, key) {
-  return Object.getOwnPropertyDescriptor(it, key);
-};
-
-if (Object.getOwnPropertyDescriptor.sham) getOwnPropertyDescriptor.sham = true;
diff --git a/node_modules/core-js-pure/es/object/get-own-property-descriptors.js b/node_modules/core-js-pure/es/object/get-own-property-descriptors.js
deleted file mode 100644
index e94ed62..0000000
--- a/node_modules/core-js-pure/es/object/get-own-property-descriptors.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.get-own-property-descriptors');
-var path = require('../../internals/path');
-
-module.exports = path.Object.getOwnPropertyDescriptors;
diff --git a/node_modules/core-js-pure/es/object/get-own-property-names.js b/node_modules/core-js-pure/es/object/get-own-property-names.js
deleted file mode 100644
index 4b353d3..0000000
--- a/node_modules/core-js-pure/es/object/get-own-property-names.js
+++ /dev/null
@@ -1,8 +0,0 @@
-require('../../modules/es.object.get-own-property-names');
-var path = require('../../internals/path');
-
-var Object = path.Object;
-
-module.exports = function getOwnPropertyNames(it) {
-  return Object.getOwnPropertyNames(it);
-};
diff --git a/node_modules/core-js-pure/es/object/get-own-property-symbols.js b/node_modules/core-js-pure/es/object/get-own-property-symbols.js
deleted file mode 100644
index b5c4b5b..0000000
--- a/node_modules/core-js-pure/es/object/get-own-property-symbols.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.symbol');
-var path = require('../../internals/path');
-
-module.exports = path.Object.getOwnPropertySymbols;
diff --git a/node_modules/core-js-pure/es/object/get-prototype-of.js b/node_modules/core-js-pure/es/object/get-prototype-of.js
deleted file mode 100644
index 6c7c96d..0000000
--- a/node_modules/core-js-pure/es/object/get-prototype-of.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.get-prototype-of');
-var path = require('../../internals/path');
-
-module.exports = path.Object.getPrototypeOf;
diff --git a/node_modules/core-js-pure/es/object/index.js b/node_modules/core-js-pure/es/object/index.js
deleted file mode 100644
index 0664dfc..0000000
--- a/node_modules/core-js-pure/es/object/index.js
+++ /dev/null
@@ -1,31 +0,0 @@
-require('../../modules/es.symbol');
-require('../../modules/es.object.assign');
-require('../../modules/es.object.create');
-require('../../modules/es.object.define-property');
-require('../../modules/es.object.define-properties');
-require('../../modules/es.object.entries');
-require('../../modules/es.object.freeze');
-require('../../modules/es.object.from-entries');
-require('../../modules/es.object.get-own-property-descriptor');
-require('../../modules/es.object.get-own-property-descriptors');
-require('../../modules/es.object.get-own-property-names');
-require('../../modules/es.object.get-prototype-of');
-require('../../modules/es.object.is');
-require('../../modules/es.object.is-extensible');
-require('../../modules/es.object.is-frozen');
-require('../../modules/es.object.is-sealed');
-require('../../modules/es.object.keys');
-require('../../modules/es.object.prevent-extensions');
-require('../../modules/es.object.seal');
-require('../../modules/es.object.set-prototype-of');
-require('../../modules/es.object.values');
-require('../../modules/es.object.to-string');
-require('../../modules/es.object.define-getter');
-require('../../modules/es.object.define-setter');
-require('../../modules/es.object.lookup-getter');
-require('../../modules/es.object.lookup-setter');
-require('../../modules/es.math.to-string-tag');
-require('../../modules/es.json.to-string-tag');
-var path = require('../../internals/path');
-
-module.exports = path.Object;
diff --git a/node_modules/core-js-pure/es/object/is-extensible.js b/node_modules/core-js-pure/es/object/is-extensible.js
deleted file mode 100644
index c38f291..0000000
--- a/node_modules/core-js-pure/es/object/is-extensible.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.is-extensible');
-var path = require('../../internals/path');
-
-module.exports = path.Object.isExtensible;
diff --git a/node_modules/core-js-pure/es/object/is-frozen.js b/node_modules/core-js-pure/es/object/is-frozen.js
deleted file mode 100644
index 39ee8d2..0000000
--- a/node_modules/core-js-pure/es/object/is-frozen.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.is-frozen');
-var path = require('../../internals/path');
-
-module.exports = path.Object.isFrozen;
diff --git a/node_modules/core-js-pure/es/object/is-sealed.js b/node_modules/core-js-pure/es/object/is-sealed.js
deleted file mode 100644
index 113a488..0000000
--- a/node_modules/core-js-pure/es/object/is-sealed.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.is-sealed');
-var path = require('../../internals/path');
-
-module.exports = path.Object.isSealed;
diff --git a/node_modules/core-js-pure/es/object/is.js b/node_modules/core-js-pure/es/object/is.js
deleted file mode 100644
index 5691bf9..0000000
--- a/node_modules/core-js-pure/es/object/is.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.is');
-var path = require('../../internals/path');
-
-module.exports = path.Object.is;
diff --git a/node_modules/core-js-pure/es/object/keys.js b/node_modules/core-js-pure/es/object/keys.js
deleted file mode 100644
index c42f42e..0000000
--- a/node_modules/core-js-pure/es/object/keys.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.keys');
-var path = require('../../internals/path');
-
-module.exports = path.Object.keys;
diff --git a/node_modules/core-js-pure/es/object/lookup-getter.js b/node_modules/core-js-pure/es/object/lookup-getter.js
deleted file mode 100644
index db2d70a..0000000
--- a/node_modules/core-js-pure/es/object/lookup-getter.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.lookup-setter');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Object', '__lookupGetter__');
diff --git a/node_modules/core-js-pure/es/object/lookup-setter.js b/node_modules/core-js-pure/es/object/lookup-setter.js
deleted file mode 100644
index fb48fbf..0000000
--- a/node_modules/core-js-pure/es/object/lookup-setter.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.lookup-setter');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Object', '__lookupSetter__');
diff --git a/node_modules/core-js-pure/es/object/prevent-extensions.js b/node_modules/core-js-pure/es/object/prevent-extensions.js
deleted file mode 100644
index 5a4a5f6..0000000
--- a/node_modules/core-js-pure/es/object/prevent-extensions.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.prevent-extensions');
-var path = require('../../internals/path');
-
-module.exports = path.Object.preventExtensions;
diff --git a/node_modules/core-js-pure/es/object/seal.js b/node_modules/core-js-pure/es/object/seal.js
deleted file mode 100644
index 0db0262..0000000
--- a/node_modules/core-js-pure/es/object/seal.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.seal');
-var path = require('../../internals/path');
-
-module.exports = path.Object.seal;
diff --git a/node_modules/core-js-pure/es/object/set-prototype-of.js b/node_modules/core-js-pure/es/object/set-prototype-of.js
deleted file mode 100644
index bab296a..0000000
--- a/node_modules/core-js-pure/es/object/set-prototype-of.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.set-prototype-of');
-var path = require('../../internals/path');
-
-module.exports = path.Object.setPrototypeOf;
diff --git a/node_modules/core-js-pure/es/object/to-string.js b/node_modules/core-js-pure/es/object/to-string.js
deleted file mode 100644
index 491a4ef..0000000
--- a/node_modules/core-js-pure/es/object/to-string.js
+++ /dev/null
@@ -1,8 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.math.to-string-tag');
-require('../../modules/es.json.to-string-tag');
-var classof = require('../../internals/classof');
-
-module.exports = function (it) {
-  return '[object ' + classof(it) + ']';
-};
diff --git a/node_modules/core-js-pure/es/object/values.js b/node_modules/core-js-pure/es/object/values.js
deleted file mode 100644
index 84539f4..0000000
--- a/node_modules/core-js-pure/es/object/values.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.object.values');
-var path = require('../../internals/path');
-
-module.exports = path.Object.values;
diff --git a/node_modules/core-js-pure/es/parse-float.js b/node_modules/core-js-pure/es/parse-float.js
deleted file mode 100644
index 3528d63..0000000
--- a/node_modules/core-js-pure/es/parse-float.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/es.parse-float');
-var path = require('../internals/path');
-
-module.exports = path.parseFloat;
diff --git a/node_modules/core-js-pure/es/parse-int.js b/node_modules/core-js-pure/es/parse-int.js
deleted file mode 100644
index 75cf127..0000000
--- a/node_modules/core-js-pure/es/parse-int.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/es.parse-int');
-var path = require('../internals/path');
-
-module.exports = path.parseInt;
diff --git a/node_modules/core-js-pure/es/promise/all-settled.js b/node_modules/core-js-pure/es/promise/all-settled.js
deleted file mode 100644
index b05ac7e..0000000
--- a/node_modules/core-js-pure/es/promise/all-settled.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-require('../../modules/es.promise');
-require('../../modules/es.promise.all-settled');
-var path = require('../../internals/path');
-
-var Promise = path.Promise;
-var $allSettled = Promise.allSettled;
-
-module.exports = function allSettled(iterable) {
-  return $allSettled.call(typeof this === 'function' ? this : Promise, iterable);
-};
diff --git a/node_modules/core-js-pure/es/promise/finally.js b/node_modules/core-js-pure/es/promise/finally.js
deleted file mode 100644
index 01d4282..0000000
--- a/node_modules/core-js-pure/es/promise/finally.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.promise');
-require('../../modules/es.promise.finally');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Promise', 'finally');
diff --git a/node_modules/core-js-pure/es/promise/index.js b/node_modules/core-js-pure/es/promise/index.js
deleted file mode 100644
index 2b41b45..0000000
--- a/node_modules/core-js-pure/es/promise/index.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/web.dom-collections.iterator');
-require('../../modules/es.promise');
-require('../../modules/es.promise.all-settled');
-require('../../modules/es.promise.finally');
-var path = require('../../internals/path');
-
-module.exports = path.Promise;
diff --git a/node_modules/core-js-pure/es/reflect/apply.js b/node_modules/core-js-pure/es/reflect/apply.js
deleted file mode 100644
index 0dbe128..0000000
--- a/node_modules/core-js-pure/es/reflect/apply.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.apply');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.apply;
diff --git a/node_modules/core-js-pure/es/reflect/construct.js b/node_modules/core-js-pure/es/reflect/construct.js
deleted file mode 100644
index df90026..0000000
--- a/node_modules/core-js-pure/es/reflect/construct.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.construct');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.construct;
diff --git a/node_modules/core-js-pure/es/reflect/define-property.js b/node_modules/core-js-pure/es/reflect/define-property.js
deleted file mode 100644
index 7b33dca..0000000
--- a/node_modules/core-js-pure/es/reflect/define-property.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.define-property');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.defineProperty;
diff --git a/node_modules/core-js-pure/es/reflect/delete-property.js b/node_modules/core-js-pure/es/reflect/delete-property.js
deleted file mode 100644
index 0e023df..0000000
--- a/node_modules/core-js-pure/es/reflect/delete-property.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.delete-property');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.deleteProperty;
diff --git a/node_modules/core-js-pure/es/reflect/get-own-property-descriptor.js b/node_modules/core-js-pure/es/reflect/get-own-property-descriptor.js
deleted file mode 100644
index 8c135a3..0000000
--- a/node_modules/core-js-pure/es/reflect/get-own-property-descriptor.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.get-own-property-descriptor');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.getOwnPropertyDescriptor;
diff --git a/node_modules/core-js-pure/es/reflect/get-prototype-of.js b/node_modules/core-js-pure/es/reflect/get-prototype-of.js
deleted file mode 100644
index aca74f8..0000000
--- a/node_modules/core-js-pure/es/reflect/get-prototype-of.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.get-prototype-of');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.getPrototypeOf;
diff --git a/node_modules/core-js-pure/es/reflect/get.js b/node_modules/core-js-pure/es/reflect/get.js
deleted file mode 100644
index 239e931..0000000
--- a/node_modules/core-js-pure/es/reflect/get.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.get');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.get;
diff --git a/node_modules/core-js-pure/es/reflect/has.js b/node_modules/core-js-pure/es/reflect/has.js
deleted file mode 100644
index 0dbf29f..0000000
--- a/node_modules/core-js-pure/es/reflect/has.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.has');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.has;
diff --git a/node_modules/core-js-pure/es/reflect/index.js b/node_modules/core-js-pure/es/reflect/index.js
deleted file mode 100644
index 6a82213..0000000
--- a/node_modules/core-js-pure/es/reflect/index.js
+++ /dev/null
@@ -1,16 +0,0 @@
-require('../../modules/es.reflect.apply');
-require('../../modules/es.reflect.construct');
-require('../../modules/es.reflect.define-property');
-require('../../modules/es.reflect.delete-property');
-require('../../modules/es.reflect.get');
-require('../../modules/es.reflect.get-own-property-descriptor');
-require('../../modules/es.reflect.get-prototype-of');
-require('../../modules/es.reflect.has');
-require('../../modules/es.reflect.is-extensible');
-require('../../modules/es.reflect.own-keys');
-require('../../modules/es.reflect.prevent-extensions');
-require('../../modules/es.reflect.set');
-require('../../modules/es.reflect.set-prototype-of');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect;
diff --git a/node_modules/core-js-pure/es/reflect/is-extensible.js b/node_modules/core-js-pure/es/reflect/is-extensible.js
deleted file mode 100644
index c0943d2..0000000
--- a/node_modules/core-js-pure/es/reflect/is-extensible.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.is-extensible');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.isExtensible;
diff --git a/node_modules/core-js-pure/es/reflect/own-keys.js b/node_modules/core-js-pure/es/reflect/own-keys.js
deleted file mode 100644
index 364fc81..0000000
--- a/node_modules/core-js-pure/es/reflect/own-keys.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.own-keys');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.ownKeys;
diff --git a/node_modules/core-js-pure/es/reflect/prevent-extensions.js b/node_modules/core-js-pure/es/reflect/prevent-extensions.js
deleted file mode 100644
index 8687c1b..0000000
--- a/node_modules/core-js-pure/es/reflect/prevent-extensions.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.prevent-extensions');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.preventExtensions;
diff --git a/node_modules/core-js-pure/es/reflect/set-prototype-of.js b/node_modules/core-js-pure/es/reflect/set-prototype-of.js
deleted file mode 100644
index 819148a..0000000
--- a/node_modules/core-js-pure/es/reflect/set-prototype-of.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.set-prototype-of');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.setPrototypeOf;
diff --git a/node_modules/core-js-pure/es/reflect/set.js b/node_modules/core-js-pure/es/reflect/set.js
deleted file mode 100644
index 25ed86c..0000000
--- a/node_modules/core-js-pure/es/reflect/set.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.reflect.set');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.set;
diff --git a/node_modules/core-js-pure/es/regexp/constructor.js b/node_modules/core-js-pure/es/regexp/constructor.js
deleted file mode 100644
index 195da54..0000000
--- a/node_modules/core-js-pure/es/regexp/constructor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../../modules/es.regexp.constructor');
-
-module.exports = RegExp;
diff --git a/node_modules/core-js-pure/es/regexp/flags.js b/node_modules/core-js-pure/es/regexp/flags.js
deleted file mode 100644
index d3eed6d..0000000
--- a/node_modules/core-js-pure/es/regexp/flags.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('../../modules/es.regexp.flags');
-var flags = require('../../internals/regexp-flags');
-
-module.exports = function (it) {
-  return flags.call(it);
-};
diff --git a/node_modules/core-js-pure/es/regexp/index.js b/node_modules/core-js-pure/es/regexp/index.js
deleted file mode 100644
index 92c170a..0000000
--- a/node_modules/core-js-pure/es/regexp/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.regexp.constructor');
-require('../../modules/es.regexp.to-string');
-require('../../modules/es.regexp.exec');
-require('../../modules/es.regexp.flags');
-require('../../modules/es.regexp.sticky');
-require('../../modules/es.regexp.test');
-require('../../modules/es.string.match');
-require('../../modules/es.string.replace');
-require('../../modules/es.string.search');
-require('../../modules/es.string.split');
diff --git a/node_modules/core-js-pure/es/regexp/match.js b/node_modules/core-js-pure/es/regexp/match.js
deleted file mode 100644
index af0e2fa..0000000
--- a/node_modules/core-js-pure/es/regexp/match.js
+++ /dev/null
@@ -1,8 +0,0 @@
-require('../../modules/es.string.match');
-var wellKnownSymbol = require('../../internals/well-known-symbol');
-
-var MATCH = wellKnownSymbol('match');
-
-module.exports = function (it, str) {
-  return RegExp.prototype[MATCH].call(it, str);
-};
diff --git a/node_modules/core-js-pure/es/regexp/replace.js b/node_modules/core-js-pure/es/regexp/replace.js
deleted file mode 100644
index 1311b2a..0000000
--- a/node_modules/core-js-pure/es/regexp/replace.js
+++ /dev/null
@@ -1,8 +0,0 @@
-require('../../modules/es.string.replace');
-var wellKnownSymbol = require('../../internals/well-known-symbol');
-
-var REPLACE = wellKnownSymbol('replace');
-
-module.exports = function (it, str, replacer) {
-  return RegExp.prototype[REPLACE].call(it, str, replacer);
-};
diff --git a/node_modules/core-js-pure/es/regexp/search.js b/node_modules/core-js-pure/es/regexp/search.js
deleted file mode 100644
index 4adc913..0000000
--- a/node_modules/core-js-pure/es/regexp/search.js
+++ /dev/null
@@ -1,8 +0,0 @@
-require('../../modules/es.string.search');
-var wellKnownSymbol = require('../../internals/well-known-symbol');
-
-var SEARCH = wellKnownSymbol('search');
-
-module.exports = function (it, str) {
-  return RegExp.prototype[SEARCH].call(it, str);
-};
diff --git a/node_modules/core-js-pure/es/regexp/split.js b/node_modules/core-js-pure/es/regexp/split.js
deleted file mode 100644
index 49ae5f2..0000000
--- a/node_modules/core-js-pure/es/regexp/split.js
+++ /dev/null
@@ -1,8 +0,0 @@
-require('../../modules/es.string.split');
-var wellKnownSymbol = require('../../internals/well-known-symbol');
-
-var SPLIT = wellKnownSymbol('split');
-
-module.exports = function (it, str, limit) {
-  return RegExp.prototype[SPLIT].call(it, str, limit);
-};
diff --git a/node_modules/core-js-pure/es/regexp/sticky.js b/node_modules/core-js-pure/es/regexp/sticky.js
deleted file mode 100644
index eb33fb1..0000000
--- a/node_modules/core-js-pure/es/regexp/sticky.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.regexp.sticky');
-
-module.exports = function (it) {
-  return it.sticky;
-};
diff --git a/node_modules/core-js-pure/es/regexp/test.js b/node_modules/core-js-pure/es/regexp/test.js
deleted file mode 100644
index b71d4a0..0000000
--- a/node_modules/core-js-pure/es/regexp/test.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('../../modules/es.regexp.exec');
-require('../../modules/es.regexp.test');
-
-module.exports = function (re, string) {
-  return RegExp.prototype.test.call(re, string);
-};
diff --git a/node_modules/core-js-pure/es/regexp/to-string.js b/node_modules/core-js-pure/es/regexp/to-string.js
deleted file mode 100644
index 3072e63..0000000
--- a/node_modules/core-js-pure/es/regexp/to-string.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.regexp.to-string');
-
-module.exports = function toString(it) {
-  return RegExp.prototype.toString.call(it);
-};
diff --git a/node_modules/core-js-pure/es/set/index.js b/node_modules/core-js-pure/es/set/index.js
deleted file mode 100644
index 52322b6..0000000
--- a/node_modules/core-js-pure/es/set/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-module.exports = path.Set;
diff --git a/node_modules/core-js-pure/es/string/anchor.js b/node_modules/core-js-pure/es/string/anchor.js
deleted file mode 100644
index 254317e..0000000
--- a/node_modules/core-js-pure/es/string/anchor.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.anchor');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'anchor');
diff --git a/node_modules/core-js-pure/es/string/big.js b/node_modules/core-js-pure/es/string/big.js
deleted file mode 100644
index d0878eb..0000000
--- a/node_modules/core-js-pure/es/string/big.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.big');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'big');
diff --git a/node_modules/core-js-pure/es/string/blink.js b/node_modules/core-js-pure/es/string/blink.js
deleted file mode 100644
index fc96d57..0000000
--- a/node_modules/core-js-pure/es/string/blink.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.blink');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'blink');
diff --git a/node_modules/core-js-pure/es/string/bold.js b/node_modules/core-js-pure/es/string/bold.js
deleted file mode 100644
index f098a7a..0000000
--- a/node_modules/core-js-pure/es/string/bold.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.bold');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'bold');
diff --git a/node_modules/core-js-pure/es/string/code-point-at.js b/node_modules/core-js-pure/es/string/code-point-at.js
deleted file mode 100644
index cbaaae3..0000000
--- a/node_modules/core-js-pure/es/string/code-point-at.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.code-point-at');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'codePointAt');
diff --git a/node_modules/core-js-pure/es/string/ends-with.js b/node_modules/core-js-pure/es/string/ends-with.js
deleted file mode 100644
index 26d7ffe..0000000
--- a/node_modules/core-js-pure/es/string/ends-with.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.ends-with');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'endsWith');
diff --git a/node_modules/core-js-pure/es/string/fixed.js b/node_modules/core-js-pure/es/string/fixed.js
deleted file mode 100644
index 099ada4..0000000
--- a/node_modules/core-js-pure/es/string/fixed.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.fixed');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'fixed');
diff --git a/node_modules/core-js-pure/es/string/fontcolor.js b/node_modules/core-js-pure/es/string/fontcolor.js
deleted file mode 100644
index f3606f6..0000000
--- a/node_modules/core-js-pure/es/string/fontcolor.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.fontcolor');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'fontcolor');
diff --git a/node_modules/core-js-pure/es/string/fontsize.js b/node_modules/core-js-pure/es/string/fontsize.js
deleted file mode 100644
index 499bfa5..0000000
--- a/node_modules/core-js-pure/es/string/fontsize.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.fontsize');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'fontsize');
diff --git a/node_modules/core-js-pure/es/string/from-code-point.js b/node_modules/core-js-pure/es/string/from-code-point.js
deleted file mode 100644
index 1eff764..0000000
--- a/node_modules/core-js-pure/es/string/from-code-point.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.from-code-point');
-var path = require('../../internals/path');
-
-module.exports = path.String.fromCodePoint;
diff --git a/node_modules/core-js-pure/es/string/includes.js b/node_modules/core-js-pure/es/string/includes.js
deleted file mode 100644
index 26d2ad9..0000000
--- a/node_modules/core-js-pure/es/string/includes.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.includes');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'includes');
diff --git a/node_modules/core-js-pure/es/string/index.js b/node_modules/core-js-pure/es/string/index.js
deleted file mode 100644
index f036fe4..0000000
--- a/node_modules/core-js-pure/es/string/index.js
+++ /dev/null
@@ -1,35 +0,0 @@
-require('../../modules/es.regexp.exec');
-require('../../modules/es.string.from-code-point');
-require('../../modules/es.string.raw');
-require('../../modules/es.string.code-point-at');
-require('../../modules/es.string.ends-with');
-require('../../modules/es.string.includes');
-require('../../modules/es.string.match');
-require('../../modules/es.string.match-all');
-require('../../modules/es.string.pad-end');
-require('../../modules/es.string.pad-start');
-require('../../modules/es.string.repeat');
-require('../../modules/es.string.replace');
-require('../../modules/es.string.search');
-require('../../modules/es.string.split');
-require('../../modules/es.string.starts-with');
-require('../../modules/es.string.trim');
-require('../../modules/es.string.trim-start');
-require('../../modules/es.string.trim-end');
-require('../../modules/es.string.iterator');
-require('../../modules/es.string.anchor');
-require('../../modules/es.string.big');
-require('../../modules/es.string.blink');
-require('../../modules/es.string.bold');
-require('../../modules/es.string.fixed');
-require('../../modules/es.string.fontcolor');
-require('../../modules/es.string.fontsize');
-require('../../modules/es.string.italics');
-require('../../modules/es.string.link');
-require('../../modules/es.string.small');
-require('../../modules/es.string.strike');
-require('../../modules/es.string.sub');
-require('../../modules/es.string.sup');
-var path = require('../../internals/path');
-
-module.exports = path.String;
diff --git a/node_modules/core-js-pure/es/string/italics.js b/node_modules/core-js-pure/es/string/italics.js
deleted file mode 100644
index 6057f4f..0000000
--- a/node_modules/core-js-pure/es/string/italics.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.italics');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'italics');
diff --git a/node_modules/core-js-pure/es/string/iterator.js b/node_modules/core-js-pure/es/string/iterator.js
deleted file mode 100644
index b6d9a1a..0000000
--- a/node_modules/core-js-pure/es/string/iterator.js
+++ /dev/null
@@ -1,8 +0,0 @@
-require('../../modules/es.string.iterator');
-var Iterators = require('../../internals/iterators');
-
-var getStringIterator = Iterators.String;
-
-module.exports = function (it) {
-  return getStringIterator.call(it);
-};
diff --git a/node_modules/core-js-pure/es/string/link.js b/node_modules/core-js-pure/es/string/link.js
deleted file mode 100644
index c195d61..0000000
--- a/node_modules/core-js-pure/es/string/link.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.link');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'link');
diff --git a/node_modules/core-js-pure/es/string/match-all.js b/node_modules/core-js-pure/es/string/match-all.js
deleted file mode 100644
index e951f4e..0000000
--- a/node_modules/core-js-pure/es/string/match-all.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.match-all');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'matchAll');
diff --git a/node_modules/core-js-pure/es/string/match.js b/node_modules/core-js-pure/es/string/match.js
deleted file mode 100644
index b484de0..0000000
--- a/node_modules/core-js-pure/es/string/match.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.regexp.exec');
-require('../../modules/es.string.match');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'match');
diff --git a/node_modules/core-js-pure/es/string/pad-end.js b/node_modules/core-js-pure/es/string/pad-end.js
deleted file mode 100644
index 237b96d..0000000
--- a/node_modules/core-js-pure/es/string/pad-end.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.pad-end');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'padEnd');
diff --git a/node_modules/core-js-pure/es/string/pad-start.js b/node_modules/core-js-pure/es/string/pad-start.js
deleted file mode 100644
index 250496f..0000000
--- a/node_modules/core-js-pure/es/string/pad-start.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.pad-start');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'padStart');
diff --git a/node_modules/core-js-pure/es/string/raw.js b/node_modules/core-js-pure/es/string/raw.js
deleted file mode 100644
index e75c54c..0000000
--- a/node_modules/core-js-pure/es/string/raw.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.raw');
-var path = require('../../internals/path');
-
-module.exports = path.String.raw;
diff --git a/node_modules/core-js-pure/es/string/repeat.js b/node_modules/core-js-pure/es/string/repeat.js
deleted file mode 100644
index bd6992b..0000000
--- a/node_modules/core-js-pure/es/string/repeat.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.repeat');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'repeat');
diff --git a/node_modules/core-js-pure/es/string/replace.js b/node_modules/core-js-pure/es/string/replace.js
deleted file mode 100644
index 28b62e3..0000000
--- a/node_modules/core-js-pure/es/string/replace.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.regexp.exec');
-require('../../modules/es.string.replace');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'replace');
diff --git a/node_modules/core-js-pure/es/string/search.js b/node_modules/core-js-pure/es/string/search.js
deleted file mode 100644
index bfb5ab0..0000000
--- a/node_modules/core-js-pure/es/string/search.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.regexp.exec');
-require('../../modules/es.string.search');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'search');
diff --git a/node_modules/core-js-pure/es/string/small.js b/node_modules/core-js-pure/es/string/small.js
deleted file mode 100644
index 4e8780f..0000000
--- a/node_modules/core-js-pure/es/string/small.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.small');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'small');
diff --git a/node_modules/core-js-pure/es/string/split.js b/node_modules/core-js-pure/es/string/split.js
deleted file mode 100644
index a890153..0000000
--- a/node_modules/core-js-pure/es/string/split.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.regexp.exec');
-require('../../modules/es.string.split');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'split');
diff --git a/node_modules/core-js-pure/es/string/starts-with.js b/node_modules/core-js-pure/es/string/starts-with.js
deleted file mode 100644
index 2b22eba..0000000
--- a/node_modules/core-js-pure/es/string/starts-with.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.starts-with');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'startsWith');
diff --git a/node_modules/core-js-pure/es/string/strike.js b/node_modules/core-js-pure/es/string/strike.js
deleted file mode 100644
index f986f9e..0000000
--- a/node_modules/core-js-pure/es/string/strike.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.strike');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'strike');
diff --git a/node_modules/core-js-pure/es/string/sub.js b/node_modules/core-js-pure/es/string/sub.js
deleted file mode 100644
index 19c6c38..0000000
--- a/node_modules/core-js-pure/es/string/sub.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.sub');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'sub');
diff --git a/node_modules/core-js-pure/es/string/sup.js b/node_modules/core-js-pure/es/string/sup.js
deleted file mode 100644
index 419785d..0000000
--- a/node_modules/core-js-pure/es/string/sup.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.sup');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'sup');
diff --git a/node_modules/core-js-pure/es/string/trim-end.js b/node_modules/core-js-pure/es/string/trim-end.js
deleted file mode 100644
index 4304298..0000000
--- a/node_modules/core-js-pure/es/string/trim-end.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.trim-end');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'trimRight');
diff --git a/node_modules/core-js-pure/es/string/trim-left.js b/node_modules/core-js-pure/es/string/trim-left.js
deleted file mode 100644
index a24dcde..0000000
--- a/node_modules/core-js-pure/es/string/trim-left.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.trim-start');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'trimLeft');
diff --git a/node_modules/core-js-pure/es/string/trim-right.js b/node_modules/core-js-pure/es/string/trim-right.js
deleted file mode 100644
index 4304298..0000000
--- a/node_modules/core-js-pure/es/string/trim-right.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.trim-end');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'trimRight');
diff --git a/node_modules/core-js-pure/es/string/trim-start.js b/node_modules/core-js-pure/es/string/trim-start.js
deleted file mode 100644
index a24dcde..0000000
--- a/node_modules/core-js-pure/es/string/trim-start.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.trim-start');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'trimLeft');
diff --git a/node_modules/core-js-pure/es/string/trim.js b/node_modules/core-js-pure/es/string/trim.js
deleted file mode 100644
index 0fca933..0000000
--- a/node_modules/core-js-pure/es/string/trim.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.string.trim');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'trim');
diff --git a/node_modules/core-js-pure/es/string/virtual/anchor.js b/node_modules/core-js-pure/es/string/virtual/anchor.js
deleted file mode 100644
index 3b5cf6b..0000000
--- a/node_modules/core-js-pure/es/string/virtual/anchor.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.anchor');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').anchor;
diff --git a/node_modules/core-js-pure/es/string/virtual/big.js b/node_modules/core-js-pure/es/string/virtual/big.js
deleted file mode 100644
index a63bd0f..0000000
--- a/node_modules/core-js-pure/es/string/virtual/big.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.big');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').big;
diff --git a/node_modules/core-js-pure/es/string/virtual/blink.js b/node_modules/core-js-pure/es/string/virtual/blink.js
deleted file mode 100644
index 8619c25..0000000
--- a/node_modules/core-js-pure/es/string/virtual/blink.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.blink');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').blink;
diff --git a/node_modules/core-js-pure/es/string/virtual/bold.js b/node_modules/core-js-pure/es/string/virtual/bold.js
deleted file mode 100644
index 1f5419a..0000000
--- a/node_modules/core-js-pure/es/string/virtual/bold.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.bold');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').bold;
diff --git a/node_modules/core-js-pure/es/string/virtual/code-point-at.js b/node_modules/core-js-pure/es/string/virtual/code-point-at.js
deleted file mode 100644
index c12691d..0000000
--- a/node_modules/core-js-pure/es/string/virtual/code-point-at.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.code-point-at');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').codePointAt;
diff --git a/node_modules/core-js-pure/es/string/virtual/ends-with.js b/node_modules/core-js-pure/es/string/virtual/ends-with.js
deleted file mode 100644
index 81a1322..0000000
--- a/node_modules/core-js-pure/es/string/virtual/ends-with.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.ends-with');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').endsWith;
diff --git a/node_modules/core-js-pure/es/string/virtual/fixed.js b/node_modules/core-js-pure/es/string/virtual/fixed.js
deleted file mode 100644
index b3b775f..0000000
--- a/node_modules/core-js-pure/es/string/virtual/fixed.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.fixed');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').fixed;
diff --git a/node_modules/core-js-pure/es/string/virtual/fontcolor.js b/node_modules/core-js-pure/es/string/virtual/fontcolor.js
deleted file mode 100644
index 5b89a22..0000000
--- a/node_modules/core-js-pure/es/string/virtual/fontcolor.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.fontcolor');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').fontcolor;
diff --git a/node_modules/core-js-pure/es/string/virtual/fontsize.js b/node_modules/core-js-pure/es/string/virtual/fontsize.js
deleted file mode 100644
index 28491b0..0000000
--- a/node_modules/core-js-pure/es/string/virtual/fontsize.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.fontsize');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').fontsize;
diff --git a/node_modules/core-js-pure/es/string/virtual/includes.js b/node_modules/core-js-pure/es/string/virtual/includes.js
deleted file mode 100644
index e6d9fab..0000000
--- a/node_modules/core-js-pure/es/string/virtual/includes.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.includes');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').includes;
diff --git a/node_modules/core-js-pure/es/string/virtual/index.js b/node_modules/core-js-pure/es/string/virtual/index.js
deleted file mode 100644
index 1151b79..0000000
--- a/node_modules/core-js-pure/es/string/virtual/index.js
+++ /dev/null
@@ -1,32 +0,0 @@
-require('../../../modules/es.string.code-point-at');
-require('../../../modules/es.string.ends-with');
-require('../../../modules/es.string.includes');
-require('../../../modules/es.string.match');
-require('../../../modules/es.string.match-all');
-require('../../../modules/es.string.pad-end');
-require('../../../modules/es.string.pad-start');
-require('../../../modules/es.string.repeat');
-require('../../../modules/es.string.replace');
-require('../../../modules/es.string.search');
-require('../../../modules/es.string.split');
-require('../../../modules/es.string.starts-with');
-require('../../../modules/es.string.trim');
-require('../../../modules/es.string.trim-start');
-require('../../../modules/es.string.trim-end');
-require('../../../modules/es.string.iterator');
-require('../../../modules/es.string.anchor');
-require('../../../modules/es.string.big');
-require('../../../modules/es.string.blink');
-require('../../../modules/es.string.bold');
-require('../../../modules/es.string.fixed');
-require('../../../modules/es.string.fontcolor');
-require('../../../modules/es.string.fontsize');
-require('../../../modules/es.string.italics');
-require('../../../modules/es.string.link');
-require('../../../modules/es.string.small');
-require('../../../modules/es.string.strike');
-require('../../../modules/es.string.sub');
-require('../../../modules/es.string.sup');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String');
diff --git a/node_modules/core-js-pure/es/string/virtual/italics.js b/node_modules/core-js-pure/es/string/virtual/italics.js
deleted file mode 100644
index c6cf80b..0000000
--- a/node_modules/core-js-pure/es/string/virtual/italics.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.italics');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').italics;
diff --git a/node_modules/core-js-pure/es/string/virtual/iterator.js b/node_modules/core-js-pure/es/string/virtual/iterator.js
deleted file mode 100644
index df1e2aa..0000000
--- a/node_modules/core-js-pure/es/string/virtual/iterator.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.iterator');
-var Iterators = require('../../../internals/iterators');
-
-module.exports = Iterators.String;
diff --git a/node_modules/core-js-pure/es/string/virtual/link.js b/node_modules/core-js-pure/es/string/virtual/link.js
deleted file mode 100644
index d387e16..0000000
--- a/node_modules/core-js-pure/es/string/virtual/link.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.link');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').link;
diff --git a/node_modules/core-js-pure/es/string/virtual/match-all.js b/node_modules/core-js-pure/es/string/virtual/match-all.js
deleted file mode 100644
index 6bad2f8..0000000
--- a/node_modules/core-js-pure/es/string/virtual/match-all.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.match-all');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').matchAll;
diff --git a/node_modules/core-js-pure/es/string/virtual/pad-end.js b/node_modules/core-js-pure/es/string/virtual/pad-end.js
deleted file mode 100644
index a7d54de..0000000
--- a/node_modules/core-js-pure/es/string/virtual/pad-end.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.pad-end');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').padEnd;
diff --git a/node_modules/core-js-pure/es/string/virtual/pad-start.js b/node_modules/core-js-pure/es/string/virtual/pad-start.js
deleted file mode 100644
index 7695cb2..0000000
--- a/node_modules/core-js-pure/es/string/virtual/pad-start.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.pad-start');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').padStart;
diff --git a/node_modules/core-js-pure/es/string/virtual/repeat.js b/node_modules/core-js-pure/es/string/virtual/repeat.js
deleted file mode 100644
index dab88b5..0000000
--- a/node_modules/core-js-pure/es/string/virtual/repeat.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.repeat');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').repeat;
diff --git a/node_modules/core-js-pure/es/string/virtual/small.js b/node_modules/core-js-pure/es/string/virtual/small.js
deleted file mode 100644
index e9352a8..0000000
--- a/node_modules/core-js-pure/es/string/virtual/small.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.small');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').small;
diff --git a/node_modules/core-js-pure/es/string/virtual/starts-with.js b/node_modules/core-js-pure/es/string/virtual/starts-with.js
deleted file mode 100644
index 917071b..0000000
--- a/node_modules/core-js-pure/es/string/virtual/starts-with.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.starts-with');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').startsWith;
diff --git a/node_modules/core-js-pure/es/string/virtual/strike.js b/node_modules/core-js-pure/es/string/virtual/strike.js
deleted file mode 100644
index 971a129..0000000
--- a/node_modules/core-js-pure/es/string/virtual/strike.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.strike');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').strike;
diff --git a/node_modules/core-js-pure/es/string/virtual/sub.js b/node_modules/core-js-pure/es/string/virtual/sub.js
deleted file mode 100644
index 0514fb8..0000000
--- a/node_modules/core-js-pure/es/string/virtual/sub.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.sub');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').sub;
diff --git a/node_modules/core-js-pure/es/string/virtual/sup.js b/node_modules/core-js-pure/es/string/virtual/sup.js
deleted file mode 100644
index 61debf3..0000000
--- a/node_modules/core-js-pure/es/string/virtual/sup.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.sup');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').sup;
diff --git a/node_modules/core-js-pure/es/string/virtual/trim-end.js b/node_modules/core-js-pure/es/string/virtual/trim-end.js
deleted file mode 100644
index 9c1d0c0..0000000
--- a/node_modules/core-js-pure/es/string/virtual/trim-end.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.trim-end');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').trimRight;
diff --git a/node_modules/core-js-pure/es/string/virtual/trim-left.js b/node_modules/core-js-pure/es/string/virtual/trim-left.js
deleted file mode 100644
index 17cfc12..0000000
--- a/node_modules/core-js-pure/es/string/virtual/trim-left.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.trim-start');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').trimLeft;
diff --git a/node_modules/core-js-pure/es/string/virtual/trim-right.js b/node_modules/core-js-pure/es/string/virtual/trim-right.js
deleted file mode 100644
index 9c1d0c0..0000000
--- a/node_modules/core-js-pure/es/string/virtual/trim-right.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.trim-end');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').trimRight;
diff --git a/node_modules/core-js-pure/es/string/virtual/trim-start.js b/node_modules/core-js-pure/es/string/virtual/trim-start.js
deleted file mode 100644
index 17cfc12..0000000
--- a/node_modules/core-js-pure/es/string/virtual/trim-start.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.trim-start');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').trimLeft;
diff --git a/node_modules/core-js-pure/es/string/virtual/trim.js b/node_modules/core-js-pure/es/string/virtual/trim.js
deleted file mode 100644
index 6d7b41d..0000000
--- a/node_modules/core-js-pure/es/string/virtual/trim.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/es.string.trim');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').trim;
diff --git a/node_modules/core-js-pure/es/symbol/async-iterator.js b/node_modules/core-js-pure/es/symbol/async-iterator.js
deleted file mode 100644
index 672167f..0000000
--- a/node_modules/core-js-pure/es/symbol/async-iterator.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.symbol.async-iterator');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('asyncIterator');
diff --git a/node_modules/core-js-pure/es/symbol/description.js b/node_modules/core-js-pure/es/symbol/description.js
deleted file mode 100644
index 7bb4b2b..0000000
--- a/node_modules/core-js-pure/es/symbol/description.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.symbol.description');
diff --git a/node_modules/core-js-pure/es/symbol/for.js b/node_modules/core-js-pure/es/symbol/for.js
deleted file mode 100644
index 9406c70..0000000
--- a/node_modules/core-js-pure/es/symbol/for.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.symbol');
-var path = require('../../internals/path');
-
-module.exports = path.Symbol['for'];
diff --git a/node_modules/core-js-pure/es/symbol/has-instance.js b/node_modules/core-js-pure/es/symbol/has-instance.js
deleted file mode 100644
index 80cfe23..0000000
--- a/node_modules/core-js-pure/es/symbol/has-instance.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.symbol.has-instance');
-require('../../modules/es.function.has-instance');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('hasInstance');
diff --git a/node_modules/core-js-pure/es/symbol/index.js b/node_modules/core-js-pure/es/symbol/index.js
deleted file mode 100644
index 4d6acf4..0000000
--- a/node_modules/core-js-pure/es/symbol/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-require('../../modules/es.array.concat');
-require('../../modules/es.object.to-string');
-require('../../modules/es.symbol');
-require('../../modules/es.symbol.async-iterator');
-require('../../modules/es.symbol.description');
-require('../../modules/es.symbol.has-instance');
-require('../../modules/es.symbol.is-concat-spreadable');
-require('../../modules/es.symbol.iterator');
-require('../../modules/es.symbol.match');
-require('../../modules/es.symbol.match-all');
-require('../../modules/es.symbol.replace');
-require('../../modules/es.symbol.search');
-require('../../modules/es.symbol.species');
-require('../../modules/es.symbol.split');
-require('../../modules/es.symbol.to-primitive');
-require('../../modules/es.symbol.to-string-tag');
-require('../../modules/es.symbol.unscopables');
-require('../../modules/es.math.to-string-tag');
-require('../../modules/es.json.to-string-tag');
-var path = require('../../internals/path');
-
-module.exports = path.Symbol;
diff --git a/node_modules/core-js-pure/es/symbol/is-concat-spreadable.js b/node_modules/core-js-pure/es/symbol/is-concat-spreadable.js
deleted file mode 100644
index 2671171..0000000
--- a/node_modules/core-js-pure/es/symbol/is-concat-spreadable.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.symbol.is-concat-spreadable');
-require('../../modules/es.array.concat');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('isConcatSpreadable');
diff --git a/node_modules/core-js-pure/es/symbol/iterator.js b/node_modules/core-js-pure/es/symbol/iterator.js
deleted file mode 100644
index 73fa41d..0000000
--- a/node_modules/core-js-pure/es/symbol/iterator.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('../../modules/es.symbol.iterator');
-require('../../modules/es.string.iterator');
-require('../../modules/web.dom-collections.iterator');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('iterator');
diff --git a/node_modules/core-js-pure/es/symbol/key-for.js b/node_modules/core-js-pure/es/symbol/key-for.js
deleted file mode 100644
index 6c832b9..0000000
--- a/node_modules/core-js-pure/es/symbol/key-for.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.symbol');
-var path = require('../../internals/path');
-
-module.exports = path.Symbol.keyFor;
diff --git a/node_modules/core-js-pure/es/symbol/match-all.js b/node_modules/core-js-pure/es/symbol/match-all.js
deleted file mode 100644
index b0b2f23..0000000
--- a/node_modules/core-js-pure/es/symbol/match-all.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.symbol.match-all');
-require('../../modules/es.string.match-all');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('matchAll');
diff --git a/node_modules/core-js-pure/es/symbol/match.js b/node_modules/core-js-pure/es/symbol/match.js
deleted file mode 100644
index df77b4f..0000000
--- a/node_modules/core-js-pure/es/symbol/match.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.symbol.match');
-require('../../modules/es.string.match');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('match');
diff --git a/node_modules/core-js-pure/es/symbol/replace.js b/node_modules/core-js-pure/es/symbol/replace.js
deleted file mode 100644
index 02b0f99..0000000
--- a/node_modules/core-js-pure/es/symbol/replace.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.symbol.replace');
-require('../../modules/es.string.replace');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('replace');
diff --git a/node_modules/core-js-pure/es/symbol/search.js b/node_modules/core-js-pure/es/symbol/search.js
deleted file mode 100644
index 5122ca1..0000000
--- a/node_modules/core-js-pure/es/symbol/search.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.symbol.search');
-require('../../modules/es.string.search');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('search');
diff --git a/node_modules/core-js-pure/es/symbol/species.js b/node_modules/core-js-pure/es/symbol/species.js
deleted file mode 100644
index 28d3895..0000000
--- a/node_modules/core-js-pure/es/symbol/species.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.symbol.species');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('species');
diff --git a/node_modules/core-js-pure/es/symbol/split.js b/node_modules/core-js-pure/es/symbol/split.js
deleted file mode 100644
index 2575794..0000000
--- a/node_modules/core-js-pure/es/symbol/split.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.symbol.split');
-require('../../modules/es.string.split');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('split');
diff --git a/node_modules/core-js-pure/es/symbol/to-primitive.js b/node_modules/core-js-pure/es/symbol/to-primitive.js
deleted file mode 100644
index 390c1ee..0000000
--- a/node_modules/core-js-pure/es/symbol/to-primitive.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.symbol.to-primitive');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('toPrimitive');
diff --git a/node_modules/core-js-pure/es/symbol/to-string-tag.js b/node_modules/core-js-pure/es/symbol/to-string-tag.js
deleted file mode 100644
index 6af1551..0000000
--- a/node_modules/core-js-pure/es/symbol/to-string-tag.js
+++ /dev/null
@@ -1,7 +0,0 @@
-require('../../modules/es.symbol.to-string-tag');
-require('../../modules/es.object.to-string');
-require('../../modules/es.math.to-string-tag');
-require('../../modules/es.json.to-string-tag');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('toStringTag');
diff --git a/node_modules/core-js-pure/es/symbol/unscopables.js b/node_modules/core-js-pure/es/symbol/unscopables.js
deleted file mode 100644
index 6a2d972..0000000
--- a/node_modules/core-js-pure/es/symbol/unscopables.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/es.symbol.unscopables');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('unscopables');
diff --git a/node_modules/core-js-pure/es/typed-array/copy-within.js b/node_modules/core-js-pure/es/typed-array/copy-within.js
deleted file mode 100644
index 1352cec..0000000
--- a/node_modules/core-js-pure/es/typed-array/copy-within.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.copy-within');
diff --git a/node_modules/core-js-pure/es/typed-array/entries.js b/node_modules/core-js-pure/es/typed-array/entries.js
deleted file mode 100644
index 66cc6dc..0000000
--- a/node_modules/core-js-pure/es/typed-array/entries.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.iterator');
diff --git a/node_modules/core-js-pure/es/typed-array/every.js b/node_modules/core-js-pure/es/typed-array/every.js
deleted file mode 100644
index 681164b..0000000
--- a/node_modules/core-js-pure/es/typed-array/every.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.every');
diff --git a/node_modules/core-js-pure/es/typed-array/fill.js b/node_modules/core-js-pure/es/typed-array/fill.js
deleted file mode 100644
index 4d92ac6..0000000
--- a/node_modules/core-js-pure/es/typed-array/fill.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.fill');
diff --git a/node_modules/core-js-pure/es/typed-array/filter.js b/node_modules/core-js-pure/es/typed-array/filter.js
deleted file mode 100644
index 7d0a630..0000000
--- a/node_modules/core-js-pure/es/typed-array/filter.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.filter');
diff --git a/node_modules/core-js-pure/es/typed-array/find-index.js b/node_modules/core-js-pure/es/typed-array/find-index.js
deleted file mode 100644
index 039cd5e..0000000
--- a/node_modules/core-js-pure/es/typed-array/find-index.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.find-index');
diff --git a/node_modules/core-js-pure/es/typed-array/find.js b/node_modules/core-js-pure/es/typed-array/find.js
deleted file mode 100644
index b3251b9..0000000
--- a/node_modules/core-js-pure/es/typed-array/find.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.find');
diff --git a/node_modules/core-js-pure/es/typed-array/float32-array.js b/node_modules/core-js-pure/es/typed-array/float32-array.js
deleted file mode 100644
index 70d1f81..0000000
--- a/node_modules/core-js-pure/es/typed-array/float32-array.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.typed-array.float32-array');
-require('./methods');
-var global = require('../../internals/global');
-
-module.exports = global.Float32Array;
diff --git a/node_modules/core-js-pure/es/typed-array/float64-array.js b/node_modules/core-js-pure/es/typed-array/float64-array.js
deleted file mode 100644
index b84eae0..0000000
--- a/node_modules/core-js-pure/es/typed-array/float64-array.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.typed-array.float64-array');
-require('./methods');
-var global = require('../../internals/global');
-
-module.exports = global.Float64Array;
diff --git a/node_modules/core-js-pure/es/typed-array/for-each.js b/node_modules/core-js-pure/es/typed-array/for-each.js
deleted file mode 100644
index defe03a..0000000
--- a/node_modules/core-js-pure/es/typed-array/for-each.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.for-each');
diff --git a/node_modules/core-js-pure/es/typed-array/from.js b/node_modules/core-js-pure/es/typed-array/from.js
deleted file mode 100644
index e0f3444..0000000
--- a/node_modules/core-js-pure/es/typed-array/from.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.from');
diff --git a/node_modules/core-js-pure/es/typed-array/includes.js b/node_modules/core-js-pure/es/typed-array/includes.js
deleted file mode 100644
index 5ff65f9..0000000
--- a/node_modules/core-js-pure/es/typed-array/includes.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.includes');
diff --git a/node_modules/core-js-pure/es/typed-array/index-of.js b/node_modules/core-js-pure/es/typed-array/index-of.js
deleted file mode 100644
index 87081c0..0000000
--- a/node_modules/core-js-pure/es/typed-array/index-of.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.index-of');
diff --git a/node_modules/core-js-pure/es/typed-array/index.js b/node_modules/core-js-pure/es/typed-array/index.js
deleted file mode 100644
index 4605b35..0000000
--- a/node_modules/core-js-pure/es/typed-array/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-require('../../modules/es.typed-array.int8-array');
-require('../../modules/es.typed-array.uint8-array');
-require('../../modules/es.typed-array.uint8-clamped-array');
-require('../../modules/es.typed-array.int16-array');
-require('../../modules/es.typed-array.uint16-array');
-require('../../modules/es.typed-array.int32-array');
-require('../../modules/es.typed-array.uint32-array');
-require('../../modules/es.typed-array.float32-array');
-require('../../modules/es.typed-array.float64-array');
-require('./methods');
-
-module.exports = require('../../internals/global');
diff --git a/node_modules/core-js-pure/es/typed-array/int16-array.js b/node_modules/core-js-pure/es/typed-array/int16-array.js
deleted file mode 100644
index 81f5a8e..0000000
--- a/node_modules/core-js-pure/es/typed-array/int16-array.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.typed-array.int16-array');
-require('./methods');
-var global = require('../../internals/global');
-
-module.exports = global.Int16Array;
diff --git a/node_modules/core-js-pure/es/typed-array/int32-array.js b/node_modules/core-js-pure/es/typed-array/int32-array.js
deleted file mode 100644
index 48176bf..0000000
--- a/node_modules/core-js-pure/es/typed-array/int32-array.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.typed-array.int32-array');
-require('./methods');
-var global = require('../../internals/global');
-
-module.exports = global.Int32Array;
diff --git a/node_modules/core-js-pure/es/typed-array/int8-array.js b/node_modules/core-js-pure/es/typed-array/int8-array.js
deleted file mode 100644
index 7d53845..0000000
--- a/node_modules/core-js-pure/es/typed-array/int8-array.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.typed-array.int8-array');
-require('./methods');
-var global = require('../../internals/global');
-
-module.exports = global.Int8Array;
diff --git a/node_modules/core-js-pure/es/typed-array/iterator.js b/node_modules/core-js-pure/es/typed-array/iterator.js
deleted file mode 100644
index 66cc6dc..0000000
--- a/node_modules/core-js-pure/es/typed-array/iterator.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.iterator');
diff --git a/node_modules/core-js-pure/es/typed-array/join.js b/node_modules/core-js-pure/es/typed-array/join.js
deleted file mode 100644
index 431129c..0000000
--- a/node_modules/core-js-pure/es/typed-array/join.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.join');
diff --git a/node_modules/core-js-pure/es/typed-array/keys.js b/node_modules/core-js-pure/es/typed-array/keys.js
deleted file mode 100644
index 66cc6dc..0000000
--- a/node_modules/core-js-pure/es/typed-array/keys.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.iterator');
diff --git a/node_modules/core-js-pure/es/typed-array/last-index-of.js b/node_modules/core-js-pure/es/typed-array/last-index-of.js
deleted file mode 100644
index 5682bf4..0000000
--- a/node_modules/core-js-pure/es/typed-array/last-index-of.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.last-index-of');
diff --git a/node_modules/core-js-pure/es/typed-array/map.js b/node_modules/core-js-pure/es/typed-array/map.js
deleted file mode 100644
index db08fed..0000000
--- a/node_modules/core-js-pure/es/typed-array/map.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.map');
diff --git a/node_modules/core-js-pure/es/typed-array/methods.js b/node_modules/core-js-pure/es/typed-array/methods.js
deleted file mode 100644
index 4c6ee88..0000000
--- a/node_modules/core-js-pure/es/typed-array/methods.js
+++ /dev/null
@@ -1,26 +0,0 @@
-require('../../modules/es.typed-array.from');
-require('../../modules/es.typed-array.of');
-require('../../modules/es.typed-array.copy-within');
-require('../../modules/es.typed-array.every');
-require('../../modules/es.typed-array.fill');
-require('../../modules/es.typed-array.filter');
-require('../../modules/es.typed-array.find');
-require('../../modules/es.typed-array.find-index');
-require('../../modules/es.typed-array.for-each');
-require('../../modules/es.typed-array.includes');
-require('../../modules/es.typed-array.index-of');
-require('../../modules/es.typed-array.join');
-require('../../modules/es.typed-array.last-index-of');
-require('../../modules/es.typed-array.map');
-require('../../modules/es.typed-array.reduce');
-require('../../modules/es.typed-array.reduce-right');
-require('../../modules/es.typed-array.reverse');
-require('../../modules/es.typed-array.set');
-require('../../modules/es.typed-array.slice');
-require('../../modules/es.typed-array.some');
-require('../../modules/es.typed-array.sort');
-require('../../modules/es.typed-array.subarray');
-require('../../modules/es.typed-array.to-locale-string');
-require('../../modules/es.typed-array.to-string');
-require('../../modules/es.typed-array.iterator');
-require('../../modules/es.object.to-string');
diff --git a/node_modules/core-js-pure/es/typed-array/of.js b/node_modules/core-js-pure/es/typed-array/of.js
deleted file mode 100644
index 121bf5e..0000000
--- a/node_modules/core-js-pure/es/typed-array/of.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.of');
diff --git a/node_modules/core-js-pure/es/typed-array/reduce-right.js b/node_modules/core-js-pure/es/typed-array/reduce-right.js
deleted file mode 100644
index cbd321f..0000000
--- a/node_modules/core-js-pure/es/typed-array/reduce-right.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.reduce-right');
diff --git a/node_modules/core-js-pure/es/typed-array/reduce.js b/node_modules/core-js-pure/es/typed-array/reduce.js
deleted file mode 100644
index e2a6f28..0000000
--- a/node_modules/core-js-pure/es/typed-array/reduce.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.reduce');
diff --git a/node_modules/core-js-pure/es/typed-array/reverse.js b/node_modules/core-js-pure/es/typed-array/reverse.js
deleted file mode 100644
index 14995f4..0000000
--- a/node_modules/core-js-pure/es/typed-array/reverse.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.reverse');
diff --git a/node_modules/core-js-pure/es/typed-array/set.js b/node_modules/core-js-pure/es/typed-array/set.js
deleted file mode 100644
index 5330e22..0000000
--- a/node_modules/core-js-pure/es/typed-array/set.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.set');
diff --git a/node_modules/core-js-pure/es/typed-array/slice.js b/node_modules/core-js-pure/es/typed-array/slice.js
deleted file mode 100644
index 37fb8c1..0000000
--- a/node_modules/core-js-pure/es/typed-array/slice.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.slice');
diff --git a/node_modules/core-js-pure/es/typed-array/some.js b/node_modules/core-js-pure/es/typed-array/some.js
deleted file mode 100644
index 495c322..0000000
--- a/node_modules/core-js-pure/es/typed-array/some.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.some');
diff --git a/node_modules/core-js-pure/es/typed-array/sort.js b/node_modules/core-js-pure/es/typed-array/sort.js
deleted file mode 100644
index d6c7e30..0000000
--- a/node_modules/core-js-pure/es/typed-array/sort.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.sort');
diff --git a/node_modules/core-js-pure/es/typed-array/subarray.js b/node_modules/core-js-pure/es/typed-array/subarray.js
deleted file mode 100644
index dbad4ca..0000000
--- a/node_modules/core-js-pure/es/typed-array/subarray.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.subarray');
diff --git a/node_modules/core-js-pure/es/typed-array/to-locale-string.js b/node_modules/core-js-pure/es/typed-array/to-locale-string.js
deleted file mode 100644
index 12c809e..0000000
--- a/node_modules/core-js-pure/es/typed-array/to-locale-string.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.to-locale-string');
diff --git a/node_modules/core-js-pure/es/typed-array/to-string.js b/node_modules/core-js-pure/es/typed-array/to-string.js
deleted file mode 100644
index bf94160..0000000
--- a/node_modules/core-js-pure/es/typed-array/to-string.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.to-string');
diff --git a/node_modules/core-js-pure/es/typed-array/uint16-array.js b/node_modules/core-js-pure/es/typed-array/uint16-array.js
deleted file mode 100644
index 9fe6065..0000000
--- a/node_modules/core-js-pure/es/typed-array/uint16-array.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.typed-array.uint16-array');
-require('./methods');
-var global = require('../../internals/global');
-
-module.exports = global.Uint16Array;
diff --git a/node_modules/core-js-pure/es/typed-array/uint32-array.js b/node_modules/core-js-pure/es/typed-array/uint32-array.js
deleted file mode 100644
index 26bdb10..0000000
--- a/node_modules/core-js-pure/es/typed-array/uint32-array.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.typed-array.uint32-array');
-require('./methods');
-var global = require('../../internals/global');
-
-module.exports = global.Uint32Array;
diff --git a/node_modules/core-js-pure/es/typed-array/uint8-array.js b/node_modules/core-js-pure/es/typed-array/uint8-array.js
deleted file mode 100644
index 96a5bf1..0000000
--- a/node_modules/core-js-pure/es/typed-array/uint8-array.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.typed-array.uint8-array');
-require('./methods');
-var global = require('../../internals/global');
-
-module.exports = global.Uint8Array;
diff --git a/node_modules/core-js-pure/es/typed-array/uint8-clamped-array.js b/node_modules/core-js-pure/es/typed-array/uint8-clamped-array.js
deleted file mode 100644
index 7e2d3ce..0000000
--- a/node_modules/core-js-pure/es/typed-array/uint8-clamped-array.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.typed-array.uint8-clamped-array');
-require('./methods');
-var global = require('../../internals/global');
-
-module.exports = global.Uint8ClampedArray;
diff --git a/node_modules/core-js-pure/es/typed-array/values.js b/node_modules/core-js-pure/es/typed-array/values.js
deleted file mode 100644
index 66cc6dc..0000000
--- a/node_modules/core-js-pure/es/typed-array/values.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.iterator');
diff --git a/node_modules/core-js-pure/es/weak-map/index.js b/node_modules/core-js-pure/es/weak-map/index.js
deleted file mode 100644
index 11c79a7..0000000
--- a/node_modules/core-js-pure/es/weak-map/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.weak-map');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-module.exports = path.WeakMap;
diff --git a/node_modules/core-js-pure/es/weak-set/index.js b/node_modules/core-js-pure/es/weak-set/index.js
deleted file mode 100644
index ca5f257..0000000
--- a/node_modules/core-js-pure/es/weak-set/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.weak-set');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-module.exports = path.WeakSet;
diff --git a/node_modules/core-js-pure/features/README.md b/node_modules/core-js-pure/features/README.md
deleted file mode 100644
index 62c88a0..0000000
--- a/node_modules/core-js-pure/features/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This folder contains entry points for all `core-js` features with dependencies. It's the recommended way for usage only required features.
diff --git a/node_modules/core-js-pure/features/aggregate-error.js b/node_modules/core-js-pure/features/aggregate-error.js
deleted file mode 100644
index 65d8afd..0000000
--- a/node_modules/core-js-pure/features/aggregate-error.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('../modules/web.dom-collections.iterator');
-require('../modules/es.string.iterator');
-require('../modules/esnext.aggregate-error');
-var path = require('../internals/path');
-
-module.exports = path.AggregateError;
diff --git a/node_modules/core-js-pure/features/array-buffer/constructor.js b/node_modules/core-js-pure/features/array-buffer/constructor.js
deleted file mode 100644
index 14f239d..0000000
--- a/node_modules/core-js-pure/features/array-buffer/constructor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array-buffer/constructor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array-buffer/index.js b/node_modules/core-js-pure/features/array-buffer/index.js
deleted file mode 100644
index cb81bbc..0000000
--- a/node_modules/core-js-pure/features/array-buffer/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array-buffer');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array-buffer/is-view.js b/node_modules/core-js-pure/features/array-buffer/is-view.js
deleted file mode 100644
index 02091ec..0000000
--- a/node_modules/core-js-pure/features/array-buffer/is-view.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array-buffer/is-view');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array-buffer/slice.js b/node_modules/core-js-pure/features/array-buffer/slice.js
deleted file mode 100644
index 1259ebf..0000000
--- a/node_modules/core-js-pure/features/array-buffer/slice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array-buffer/slice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/concat.js b/node_modules/core-js-pure/features/array/concat.js
deleted file mode 100644
index 56c0625..0000000
--- a/node_modules/core-js-pure/features/array/concat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/concat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/copy-within.js b/node_modules/core-js-pure/features/array/copy-within.js
deleted file mode 100644
index 3db5361..0000000
--- a/node_modules/core-js-pure/features/array/copy-within.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/copy-within');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/entries.js b/node_modules/core-js-pure/features/array/entries.js
deleted file mode 100644
index 735b607..0000000
--- a/node_modules/core-js-pure/features/array/entries.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/entries');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/every.js b/node_modules/core-js-pure/features/array/every.js
deleted file mode 100644
index 8831dbc..0000000
--- a/node_modules/core-js-pure/features/array/every.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/every');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/fill.js b/node_modules/core-js-pure/features/array/fill.js
deleted file mode 100644
index b640ccd..0000000
--- a/node_modules/core-js-pure/features/array/fill.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/fill');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/filter.js b/node_modules/core-js-pure/features/array/filter.js
deleted file mode 100644
index c6fe56a..0000000
--- a/node_modules/core-js-pure/features/array/filter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/filter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/find-index.js b/node_modules/core-js-pure/features/array/find-index.js
deleted file mode 100644
index 312a7df..0000000
--- a/node_modules/core-js-pure/features/array/find-index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/find-index');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/find.js b/node_modules/core-js-pure/features/array/find.js
deleted file mode 100644
index 2fc46a5..0000000
--- a/node_modules/core-js-pure/features/array/find.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/find');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/flat-map.js b/node_modules/core-js-pure/features/array/flat-map.js
deleted file mode 100644
index 8e3e81a..0000000
--- a/node_modules/core-js-pure/features/array/flat-map.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/flat-map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/flat.js b/node_modules/core-js-pure/features/array/flat.js
deleted file mode 100644
index f74816e..0000000
--- a/node_modules/core-js-pure/features/array/flat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/flat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/for-each.js b/node_modules/core-js-pure/features/array/for-each.js
deleted file mode 100644
index a99f12c..0000000
--- a/node_modules/core-js-pure/features/array/for-each.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/for-each');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/from.js b/node_modules/core-js-pure/features/array/from.js
deleted file mode 100644
index 9142d6e..0000000
--- a/node_modules/core-js-pure/features/array/from.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/from');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/includes.js b/node_modules/core-js-pure/features/array/includes.js
deleted file mode 100644
index 52f040d..0000000
--- a/node_modules/core-js-pure/features/array/includes.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/includes');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/index-of.js b/node_modules/core-js-pure/features/array/index-of.js
deleted file mode 100644
index 13b63f1..0000000
--- a/node_modules/core-js-pure/features/array/index-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/index-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/index.js b/node_modules/core-js-pure/features/array/index.js
deleted file mode 100644
index 213822e..0000000
--- a/node_modules/core-js-pure/features/array/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var parent = require('../../es/array');
-require('../../modules/esnext.array.is-template-object');
-require('../../modules/esnext.array.last-item');
-require('../../modules/esnext.array.last-index');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/is-array.js b/node_modules/core-js-pure/features/array/is-array.js
deleted file mode 100644
index 89080ec..0000000
--- a/node_modules/core-js-pure/features/array/is-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/is-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/is-template-object.js b/node_modules/core-js-pure/features/array/is-template-object.js
deleted file mode 100644
index f5eaf81..0000000
--- a/node_modules/core-js-pure/features/array/is-template-object.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.array.is-template-object');
-var path = require('../../internals/path');
-
-module.exports = path.Array.isTemplateObject;
diff --git a/node_modules/core-js-pure/features/array/iterator.js b/node_modules/core-js-pure/features/array/iterator.js
deleted file mode 100644
index bfa833f..0000000
--- a/node_modules/core-js-pure/features/array/iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/join.js b/node_modules/core-js-pure/features/array/join.js
deleted file mode 100644
index 74fbfc6..0000000
--- a/node_modules/core-js-pure/features/array/join.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/join');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/keys.js b/node_modules/core-js-pure/features/array/keys.js
deleted file mode 100644
index 40b2e75..0000000
--- a/node_modules/core-js-pure/features/array/keys.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/keys');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/last-index-of.js b/node_modules/core-js-pure/features/array/last-index-of.js
deleted file mode 100644
index bdcd762..0000000
--- a/node_modules/core-js-pure/features/array/last-index-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/last-index-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/last-index.js b/node_modules/core-js-pure/features/array/last-index.js
deleted file mode 100644
index 230cea0..0000000
--- a/node_modules/core-js-pure/features/array/last-index.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/esnext.array.last-index');
diff --git a/node_modules/core-js-pure/features/array/last-item.js b/node_modules/core-js-pure/features/array/last-item.js
deleted file mode 100644
index 5a4b25b..0000000
--- a/node_modules/core-js-pure/features/array/last-item.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/esnext.array.last-item');
diff --git a/node_modules/core-js-pure/features/array/map.js b/node_modules/core-js-pure/features/array/map.js
deleted file mode 100644
index 3768704..0000000
--- a/node_modules/core-js-pure/features/array/map.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/of.js b/node_modules/core-js-pure/features/array/of.js
deleted file mode 100644
index d5b74f1..0000000
--- a/node_modules/core-js-pure/features/array/of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/reduce-right.js b/node_modules/core-js-pure/features/array/reduce-right.js
deleted file mode 100644
index f93b6de..0000000
--- a/node_modules/core-js-pure/features/array/reduce-right.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/reduce-right');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/reduce.js b/node_modules/core-js-pure/features/array/reduce.js
deleted file mode 100644
index a3ae7b1..0000000
--- a/node_modules/core-js-pure/features/array/reduce.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/reduce');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/reverse.js b/node_modules/core-js-pure/features/array/reverse.js
deleted file mode 100644
index fc9faf1..0000000
--- a/node_modules/core-js-pure/features/array/reverse.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/reverse');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/slice.js b/node_modules/core-js-pure/features/array/slice.js
deleted file mode 100644
index 2c098bd..0000000
--- a/node_modules/core-js-pure/features/array/slice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/slice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/some.js b/node_modules/core-js-pure/features/array/some.js
deleted file mode 100644
index a198c0e..0000000
--- a/node_modules/core-js-pure/features/array/some.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/some');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/sort.js b/node_modules/core-js-pure/features/array/sort.js
deleted file mode 100644
index 5741a92..0000000
--- a/node_modules/core-js-pure/features/array/sort.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/sort');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/splice.js b/node_modules/core-js-pure/features/array/splice.js
deleted file mode 100644
index e5aeb46..0000000
--- a/node_modules/core-js-pure/features/array/splice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/splice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/values.js b/node_modules/core-js-pure/features/array/values.js
deleted file mode 100644
index 146bce3..0000000
--- a/node_modules/core-js-pure/features/array/values.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/values');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/concat.js b/node_modules/core-js-pure/features/array/virtual/concat.js
deleted file mode 100644
index 9c9481b..0000000
--- a/node_modules/core-js-pure/features/array/virtual/concat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/concat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/copy-within.js b/node_modules/core-js-pure/features/array/virtual/copy-within.js
deleted file mode 100644
index 7d43d5c..0000000
--- a/node_modules/core-js-pure/features/array/virtual/copy-within.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/copy-within');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/entries.js b/node_modules/core-js-pure/features/array/virtual/entries.js
deleted file mode 100644
index 008e164..0000000
--- a/node_modules/core-js-pure/features/array/virtual/entries.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/entries');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/every.js b/node_modules/core-js-pure/features/array/virtual/every.js
deleted file mode 100644
index 3c661eb..0000000
--- a/node_modules/core-js-pure/features/array/virtual/every.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/every');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/fill.js b/node_modules/core-js-pure/features/array/virtual/fill.js
deleted file mode 100644
index b0a3b0e..0000000
--- a/node_modules/core-js-pure/features/array/virtual/fill.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/fill');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/filter.js b/node_modules/core-js-pure/features/array/virtual/filter.js
deleted file mode 100644
index b78f806..0000000
--- a/node_modules/core-js-pure/features/array/virtual/filter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/filter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/find-index.js b/node_modules/core-js-pure/features/array/virtual/find-index.js
deleted file mode 100644
index 0be7653..0000000
--- a/node_modules/core-js-pure/features/array/virtual/find-index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/find-index');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/find.js b/node_modules/core-js-pure/features/array/virtual/find.js
deleted file mode 100644
index 0f28d7c..0000000
--- a/node_modules/core-js-pure/features/array/virtual/find.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/find');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/flat-map.js b/node_modules/core-js-pure/features/array/virtual/flat-map.js
deleted file mode 100644
index 5adc39b..0000000
--- a/node_modules/core-js-pure/features/array/virtual/flat-map.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/flat-map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/flat.js b/node_modules/core-js-pure/features/array/virtual/flat.js
deleted file mode 100644
index cfafee6..0000000
--- a/node_modules/core-js-pure/features/array/virtual/flat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/flat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/for-each.js b/node_modules/core-js-pure/features/array/virtual/for-each.js
deleted file mode 100644
index ca081fb..0000000
--- a/node_modules/core-js-pure/features/array/virtual/for-each.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/for-each');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/includes.js b/node_modules/core-js-pure/features/array/virtual/includes.js
deleted file mode 100644
index fc9bb00..0000000
--- a/node_modules/core-js-pure/features/array/virtual/includes.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/includes');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/index-of.js b/node_modules/core-js-pure/features/array/virtual/index-of.js
deleted file mode 100644
index aedd505..0000000
--- a/node_modules/core-js-pure/features/array/virtual/index-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/index-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/index.js b/node_modules/core-js-pure/features/array/virtual/index.js
deleted file mode 100644
index 98d4718..0000000
--- a/node_modules/core-js-pure/features/array/virtual/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/iterator.js b/node_modules/core-js-pure/features/array/virtual/iterator.js
deleted file mode 100644
index 81ca2a2..0000000
--- a/node_modules/core-js-pure/features/array/virtual/iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/join.js b/node_modules/core-js-pure/features/array/virtual/join.js
deleted file mode 100644
index fe784ef..0000000
--- a/node_modules/core-js-pure/features/array/virtual/join.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/join');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/keys.js b/node_modules/core-js-pure/features/array/virtual/keys.js
deleted file mode 100644
index 6ed98ec..0000000
--- a/node_modules/core-js-pure/features/array/virtual/keys.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/keys');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/last-index-of.js b/node_modules/core-js-pure/features/array/virtual/last-index-of.js
deleted file mode 100644
index 697d588..0000000
--- a/node_modules/core-js-pure/features/array/virtual/last-index-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/last-index-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/map.js b/node_modules/core-js-pure/features/array/virtual/map.js
deleted file mode 100644
index 9475976..0000000
--- a/node_modules/core-js-pure/features/array/virtual/map.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/reduce-right.js b/node_modules/core-js-pure/features/array/virtual/reduce-right.js
deleted file mode 100644
index cf39fca..0000000
--- a/node_modules/core-js-pure/features/array/virtual/reduce-right.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/reduce-right');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/reduce.js b/node_modules/core-js-pure/features/array/virtual/reduce.js
deleted file mode 100644
index 5a08269..0000000
--- a/node_modules/core-js-pure/features/array/virtual/reduce.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/reduce');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/reverse.js b/node_modules/core-js-pure/features/array/virtual/reverse.js
deleted file mode 100644
index 099d13e..0000000
--- a/node_modules/core-js-pure/features/array/virtual/reverse.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/reverse');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/slice.js b/node_modules/core-js-pure/features/array/virtual/slice.js
deleted file mode 100644
index f308e00..0000000
--- a/node_modules/core-js-pure/features/array/virtual/slice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/slice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/some.js b/node_modules/core-js-pure/features/array/virtual/some.js
deleted file mode 100644
index d41a8e7..0000000
--- a/node_modules/core-js-pure/features/array/virtual/some.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/some');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/sort.js b/node_modules/core-js-pure/features/array/virtual/sort.js
deleted file mode 100644
index 5da0daa..0000000
--- a/node_modules/core-js-pure/features/array/virtual/sort.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/sort');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/splice.js b/node_modules/core-js-pure/features/array/virtual/splice.js
deleted file mode 100644
index 4cbb494..0000000
--- a/node_modules/core-js-pure/features/array/virtual/splice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/splice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/array/virtual/values.js b/node_modules/core-js-pure/features/array/virtual/values.js
deleted file mode 100644
index ebb6375..0000000
--- a/node_modules/core-js-pure/features/array/virtual/values.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/values');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/async-iterator/as-indexed-pairs.js b/node_modules/core-js-pure/features/async-iterator/as-indexed-pairs.js
deleted file mode 100644
index 8fd352b..0000000
--- a/node_modules/core-js-pure/features/async-iterator/as-indexed-pairs.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.as-indexed-pairs');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('AsyncIterator', 'asIndexedPairs');
diff --git a/node_modules/core-js-pure/features/async-iterator/drop.js b/node_modules/core-js-pure/features/async-iterator/drop.js
deleted file mode 100644
index ca33f5b..0000000
--- a/node_modules/core-js-pure/features/async-iterator/drop.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.drop');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('AsyncIterator', 'drop');
diff --git a/node_modules/core-js-pure/features/async-iterator/every.js b/node_modules/core-js-pure/features/async-iterator/every.js
deleted file mode 100644
index b090f1d..0000000
--- a/node_modules/core-js-pure/features/async-iterator/every.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.every');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('AsyncIterator', 'every');
diff --git a/node_modules/core-js-pure/features/async-iterator/filter.js b/node_modules/core-js-pure/features/async-iterator/filter.js
deleted file mode 100644
index 4a37bd0..0000000
--- a/node_modules/core-js-pure/features/async-iterator/filter.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.filter');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('AsyncIterator', 'filter');
diff --git a/node_modules/core-js-pure/features/async-iterator/find.js b/node_modules/core-js-pure/features/async-iterator/find.js
deleted file mode 100644
index 6824ee9..0000000
--- a/node_modules/core-js-pure/features/async-iterator/find.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.find');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('AsyncIterator', 'find');
diff --git a/node_modules/core-js-pure/features/async-iterator/flat-map.js b/node_modules/core-js-pure/features/async-iterator/flat-map.js
deleted file mode 100644
index ef26e56..0000000
--- a/node_modules/core-js-pure/features/async-iterator/flat-map.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.flat-map');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('AsyncIterator', 'flatMap');
diff --git a/node_modules/core-js-pure/features/async-iterator/for-each.js b/node_modules/core-js-pure/features/async-iterator/for-each.js
deleted file mode 100644
index ff0a34a..0000000
--- a/node_modules/core-js-pure/features/async-iterator/for-each.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.for-each');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('AsyncIterator', 'forEach');
diff --git a/node_modules/core-js-pure/features/async-iterator/from.js b/node_modules/core-js-pure/features/async-iterator/from.js
deleted file mode 100644
index 97275d9..0000000
--- a/node_modules/core-js-pure/features/async-iterator/from.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.from');
-require('../../modules/web.dom-collections.iterator');
-
-var path = require('../../internals/path');
-
-module.exports = path.AsyncIterator.from;
diff --git a/node_modules/core-js-pure/features/async-iterator/index.js b/node_modules/core-js-pure/features/async-iterator/index.js
deleted file mode 100644
index 2f188c6..0000000
--- a/node_modules/core-js-pure/features/async-iterator/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.as-indexed-pairs');
-require('../../modules/esnext.async-iterator.drop');
-require('../../modules/esnext.async-iterator.every');
-require('../../modules/esnext.async-iterator.filter');
-require('../../modules/esnext.async-iterator.find');
-require('../../modules/esnext.async-iterator.flat-map');
-require('../../modules/esnext.async-iterator.for-each');
-require('../../modules/esnext.async-iterator.from');
-require('../../modules/esnext.async-iterator.map');
-require('../../modules/esnext.async-iterator.reduce');
-require('../../modules/esnext.async-iterator.some');
-require('../../modules/esnext.async-iterator.take');
-require('../../modules/esnext.async-iterator.to-array');
-require('../../modules/web.dom-collections.iterator');
-
-var path = require('../../internals/path');
-
-module.exports = path.AsyncIterator;
diff --git a/node_modules/core-js-pure/features/async-iterator/map.js b/node_modules/core-js-pure/features/async-iterator/map.js
deleted file mode 100644
index a07254f..0000000
--- a/node_modules/core-js-pure/features/async-iterator/map.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.map');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('AsyncIterator', 'map');
diff --git a/node_modules/core-js-pure/features/async-iterator/reduce.js b/node_modules/core-js-pure/features/async-iterator/reduce.js
deleted file mode 100644
index b05022d..0000000
--- a/node_modules/core-js-pure/features/async-iterator/reduce.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.reduce');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('AsyncIterator', 'reduce');
diff --git a/node_modules/core-js-pure/features/async-iterator/some.js b/node_modules/core-js-pure/features/async-iterator/some.js
deleted file mode 100644
index 1d08566..0000000
--- a/node_modules/core-js-pure/features/async-iterator/some.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.some');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('AsyncIterator', 'some');
diff --git a/node_modules/core-js-pure/features/async-iterator/take.js b/node_modules/core-js-pure/features/async-iterator/take.js
deleted file mode 100644
index c67587a..0000000
--- a/node_modules/core-js-pure/features/async-iterator/take.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.take');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('AsyncIterator', 'take');
diff --git a/node_modules/core-js-pure/features/async-iterator/to-array.js b/node_modules/core-js-pure/features/async-iterator/to-array.js
deleted file mode 100644
index 30f80b8..0000000
--- a/node_modules/core-js-pure/features/async-iterator/to-array.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.promise');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.async-iterator.constructor');
-require('../../modules/esnext.async-iterator.to-array');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('AsyncIterator', 'toArray');
diff --git a/node_modules/core-js-pure/features/clear-immediate.js b/node_modules/core-js-pure/features/clear-immediate.js
deleted file mode 100644
index 15aa13b..0000000
--- a/node_modules/core-js-pure/features/clear-immediate.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../stable/clear-immediate');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/composite-key.js b/node_modules/core-js-pure/features/composite-key.js
deleted file mode 100644
index 9fd507b..0000000
--- a/node_modules/core-js-pure/features/composite-key.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/esnext.composite-key');
-var path = require('../internals/path');
-
-module.exports = path.compositeKey;
diff --git a/node_modules/core-js-pure/features/composite-symbol.js b/node_modules/core-js-pure/features/composite-symbol.js
deleted file mode 100644
index fce9600..0000000
--- a/node_modules/core-js-pure/features/composite-symbol.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../modules/es.symbol');
-require('../modules/esnext.composite-symbol');
-var path = require('../internals/path');
-
-module.exports = path.compositeSymbol;
diff --git a/node_modules/core-js-pure/features/data-view/index.js b/node_modules/core-js-pure/features/data-view/index.js
deleted file mode 100644
index 0387295..0000000
--- a/node_modules/core-js-pure/features/data-view/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/data-view');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/date/index.js b/node_modules/core-js-pure/features/date/index.js
deleted file mode 100644
index e9bde08..0000000
--- a/node_modules/core-js-pure/features/date/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/date');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/date/now.js b/node_modules/core-js-pure/features/date/now.js
deleted file mode 100644
index a4d8485..0000000
--- a/node_modules/core-js-pure/features/date/now.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/date/now');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/date/to-iso-string.js b/node_modules/core-js-pure/features/date/to-iso-string.js
deleted file mode 100644
index a6e6a7f..0000000
--- a/node_modules/core-js-pure/features/date/to-iso-string.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/date/to-iso-string');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/date/to-json.js b/node_modules/core-js-pure/features/date/to-json.js
deleted file mode 100644
index 23e8b0c..0000000
--- a/node_modules/core-js-pure/features/date/to-json.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/date/to-json');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/date/to-primitive.js b/node_modules/core-js-pure/features/date/to-primitive.js
deleted file mode 100644
index 193421d..0000000
--- a/node_modules/core-js-pure/features/date/to-primitive.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/date/to-primitive');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/date/to-string.js b/node_modules/core-js-pure/features/date/to-string.js
deleted file mode 100644
index f5c9592..0000000
--- a/node_modules/core-js-pure/features/date/to-string.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/date/to-string');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/dom-collections/for-each.js b/node_modules/core-js-pure/features/dom-collections/for-each.js
deleted file mode 100644
index dd2ac64..0000000
--- a/node_modules/core-js-pure/features/dom-collections/for-each.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../stable/dom-collections/for-each');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/dom-collections/index.js b/node_modules/core-js-pure/features/dom-collections/index.js
deleted file mode 100644
index 1ae0660..0000000
--- a/node_modules/core-js-pure/features/dom-collections/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../stable/dom-collections');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/dom-collections/iterator.js b/node_modules/core-js-pure/features/dom-collections/iterator.js
deleted file mode 100644
index d63ca43..0000000
--- a/node_modules/core-js-pure/features/dom-collections/iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../stable/dom-collections/iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/function/bind.js b/node_modules/core-js-pure/features/function/bind.js
deleted file mode 100644
index b916d67..0000000
--- a/node_modules/core-js-pure/features/function/bind.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/function/bind');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/function/has-instance.js b/node_modules/core-js-pure/features/function/has-instance.js
deleted file mode 100644
index 9538a80..0000000
--- a/node_modules/core-js-pure/features/function/has-instance.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/function/has-instance');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/function/index.js b/node_modules/core-js-pure/features/function/index.js
deleted file mode 100644
index f906e2e..0000000
--- a/node_modules/core-js-pure/features/function/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/function');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/function/name.js b/node_modules/core-js-pure/features/function/name.js
deleted file mode 100644
index a7729f5..0000000
--- a/node_modules/core-js-pure/features/function/name.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/function/name');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/function/virtual/bind.js b/node_modules/core-js-pure/features/function/virtual/bind.js
deleted file mode 100644
index e7b9a3b..0000000
--- a/node_modules/core-js-pure/features/function/virtual/bind.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/function/virtual/bind');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/function/virtual/index.js b/node_modules/core-js-pure/features/function/virtual/index.js
deleted file mode 100644
index 2282ff4..0000000
--- a/node_modules/core-js-pure/features/function/virtual/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/function/virtual');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/get-iterator-method.js b/node_modules/core-js-pure/features/get-iterator-method.js
deleted file mode 100644
index 6dd77cb..0000000
--- a/node_modules/core-js-pure/features/get-iterator-method.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../modules/web.dom-collections.iterator');
-require('../modules/es.string.iterator');
-var getIteratorMethod = require('../internals/get-iterator-method');
-
-module.exports = getIteratorMethod;
diff --git a/node_modules/core-js-pure/features/get-iterator.js b/node_modules/core-js-pure/features/get-iterator.js
deleted file mode 100644
index 3e52b2c..0000000
--- a/node_modules/core-js-pure/features/get-iterator.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../modules/web.dom-collections.iterator');
-require('../modules/es.string.iterator');
-var getIterator = require('../internals/get-iterator');
-
-module.exports = getIterator;
diff --git a/node_modules/core-js-pure/features/global-this.js b/node_modules/core-js-pure/features/global-this.js
deleted file mode 100644
index 81d7455..0000000
--- a/node_modules/core-js-pure/features/global-this.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// TODO: remove from `core-js@4`
-require('../modules/esnext.global-this');
-
-var parent = require('../es/global-this');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/index.js b/node_modules/core-js-pure/features/index.js
deleted file mode 100644
index 9a8b0cb..0000000
--- a/node_modules/core-js-pure/features/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('..');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/at.js b/node_modules/core-js-pure/features/instance/at.js
deleted file mode 100644
index f9b4f79..0000000
--- a/node_modules/core-js-pure/features/instance/at.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var at = require('../string/virtual/at');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.at;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.at) ? at : own;
-};
diff --git a/node_modules/core-js-pure/features/instance/bind.js b/node_modules/core-js-pure/features/instance/bind.js
deleted file mode 100644
index acb6bbe..0000000
--- a/node_modules/core-js-pure/features/instance/bind.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/bind');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/code-point-at.js b/node_modules/core-js-pure/features/instance/code-point-at.js
deleted file mode 100644
index 1d4435e..0000000
--- a/node_modules/core-js-pure/features/instance/code-point-at.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/code-point-at');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/code-points.js b/node_modules/core-js-pure/features/instance/code-points.js
deleted file mode 100644
index 6437299..0000000
--- a/node_modules/core-js-pure/features/instance/code-points.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var codePoints = require('../string/virtual/code-points');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.codePoints;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.codePoints) ? codePoints : own;
-};
diff --git a/node_modules/core-js-pure/features/instance/concat.js b/node_modules/core-js-pure/features/instance/concat.js
deleted file mode 100644
index 874d87d..0000000
--- a/node_modules/core-js-pure/features/instance/concat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/concat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/copy-within.js b/node_modules/core-js-pure/features/instance/copy-within.js
deleted file mode 100644
index 9d472b0..0000000
--- a/node_modules/core-js-pure/features/instance/copy-within.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/copy-within');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/ends-with.js b/node_modules/core-js-pure/features/instance/ends-with.js
deleted file mode 100644
index aaf2c16..0000000
--- a/node_modules/core-js-pure/features/instance/ends-with.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/ends-with');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/entries.js b/node_modules/core-js-pure/features/instance/entries.js
deleted file mode 100644
index ef42a0e..0000000
--- a/node_modules/core-js-pure/features/instance/entries.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../stable/instance/entries');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/every.js b/node_modules/core-js-pure/features/instance/every.js
deleted file mode 100644
index 3dc4296..0000000
--- a/node_modules/core-js-pure/features/instance/every.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/every');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/fill.js b/node_modules/core-js-pure/features/instance/fill.js
deleted file mode 100644
index 4e38c42..0000000
--- a/node_modules/core-js-pure/features/instance/fill.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/fill');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/filter.js b/node_modules/core-js-pure/features/instance/filter.js
deleted file mode 100644
index 5219c64..0000000
--- a/node_modules/core-js-pure/features/instance/filter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/filter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/find-index.js b/node_modules/core-js-pure/features/instance/find-index.js
deleted file mode 100644
index b207364..0000000
--- a/node_modules/core-js-pure/features/instance/find-index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/find-index');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/find.js b/node_modules/core-js-pure/features/instance/find.js
deleted file mode 100644
index 024fc81..0000000
--- a/node_modules/core-js-pure/features/instance/find.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/find');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/flags.js b/node_modules/core-js-pure/features/instance/flags.js
deleted file mode 100644
index 064c9ec..0000000
--- a/node_modules/core-js-pure/features/instance/flags.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/flags');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/flat-map.js b/node_modules/core-js-pure/features/instance/flat-map.js
deleted file mode 100644
index bea3d82..0000000
--- a/node_modules/core-js-pure/features/instance/flat-map.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/flat-map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/flat.js b/node_modules/core-js-pure/features/instance/flat.js
deleted file mode 100644
index d61b6ab..0000000
--- a/node_modules/core-js-pure/features/instance/flat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/flat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/for-each.js b/node_modules/core-js-pure/features/instance/for-each.js
deleted file mode 100644
index 59d1d80..0000000
--- a/node_modules/core-js-pure/features/instance/for-each.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../stable/instance/for-each');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/includes.js b/node_modules/core-js-pure/features/instance/includes.js
deleted file mode 100644
index 1bccfac..0000000
--- a/node_modules/core-js-pure/features/instance/includes.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/includes');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/index-of.js b/node_modules/core-js-pure/features/instance/index-of.js
deleted file mode 100644
index 8ddbaba..0000000
--- a/node_modules/core-js-pure/features/instance/index-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/index-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/keys.js b/node_modules/core-js-pure/features/instance/keys.js
deleted file mode 100644
index 6320846..0000000
--- a/node_modules/core-js-pure/features/instance/keys.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../stable/instance/keys');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/last-index-of.js b/node_modules/core-js-pure/features/instance/last-index-of.js
deleted file mode 100644
index c860188..0000000
--- a/node_modules/core-js-pure/features/instance/last-index-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/last-index-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/map.js b/node_modules/core-js-pure/features/instance/map.js
deleted file mode 100644
index 1f18a09..0000000
--- a/node_modules/core-js-pure/features/instance/map.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/match-all.js b/node_modules/core-js-pure/features/instance/match-all.js
deleted file mode 100644
index f0ed173..0000000
--- a/node_modules/core-js-pure/features/instance/match-all.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// TODO: remove from `core-js@4`
-require('../../modules/esnext.string.match-all');
-
-var parent = require('../../es/instance/match-all');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/pad-end.js b/node_modules/core-js-pure/features/instance/pad-end.js
deleted file mode 100644
index afe92b0..0000000
--- a/node_modules/core-js-pure/features/instance/pad-end.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/pad-end');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/pad-start.js b/node_modules/core-js-pure/features/instance/pad-start.js
deleted file mode 100644
index 6a7db7d..0000000
--- a/node_modules/core-js-pure/features/instance/pad-start.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/pad-start');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/reduce-right.js b/node_modules/core-js-pure/features/instance/reduce-right.js
deleted file mode 100644
index 6a1bb34..0000000
--- a/node_modules/core-js-pure/features/instance/reduce-right.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/reduce-right');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/reduce.js b/node_modules/core-js-pure/features/instance/reduce.js
deleted file mode 100644
index 908e12e..0000000
--- a/node_modules/core-js-pure/features/instance/reduce.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/reduce');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/repeat.js b/node_modules/core-js-pure/features/instance/repeat.js
deleted file mode 100644
index 76f2f4c..0000000
--- a/node_modules/core-js-pure/features/instance/repeat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/repeat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/replace-all.js b/node_modules/core-js-pure/features/instance/replace-all.js
deleted file mode 100644
index d920a60..0000000
--- a/node_modules/core-js-pure/features/instance/replace-all.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var replaceAll = require('../string/virtual/replace-all');
-
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.replaceAll;
-  return typeof it === 'string' || it === StringPrototype
-    || (it instanceof String && own === StringPrototype.replaceAll) ? replaceAll : own;
-};
diff --git a/node_modules/core-js-pure/features/instance/reverse.js b/node_modules/core-js-pure/features/instance/reverse.js
deleted file mode 100644
index ca634dc..0000000
--- a/node_modules/core-js-pure/features/instance/reverse.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/reverse');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/slice.js b/node_modules/core-js-pure/features/instance/slice.js
deleted file mode 100644
index 2722605..0000000
--- a/node_modules/core-js-pure/features/instance/slice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/slice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/some.js b/node_modules/core-js-pure/features/instance/some.js
deleted file mode 100644
index 3cd6a8b..0000000
--- a/node_modules/core-js-pure/features/instance/some.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/some');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/sort.js b/node_modules/core-js-pure/features/instance/sort.js
deleted file mode 100644
index d06c4bb..0000000
--- a/node_modules/core-js-pure/features/instance/sort.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/sort');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/splice.js b/node_modules/core-js-pure/features/instance/splice.js
deleted file mode 100644
index 46da42c..0000000
--- a/node_modules/core-js-pure/features/instance/splice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/splice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/starts-with.js b/node_modules/core-js-pure/features/instance/starts-with.js
deleted file mode 100644
index f2e3a08..0000000
--- a/node_modules/core-js-pure/features/instance/starts-with.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/starts-with');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/trim-end.js b/node_modules/core-js-pure/features/instance/trim-end.js
deleted file mode 100644
index 787e52e..0000000
--- a/node_modules/core-js-pure/features/instance/trim-end.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/trim-end');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/trim-left.js b/node_modules/core-js-pure/features/instance/trim-left.js
deleted file mode 100644
index 7127d67..0000000
--- a/node_modules/core-js-pure/features/instance/trim-left.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/trim-left');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/trim-right.js b/node_modules/core-js-pure/features/instance/trim-right.js
deleted file mode 100644
index 760567e..0000000
--- a/node_modules/core-js-pure/features/instance/trim-right.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/trim-right');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/trim-start.js b/node_modules/core-js-pure/features/instance/trim-start.js
deleted file mode 100644
index 3c59472..0000000
--- a/node_modules/core-js-pure/features/instance/trim-start.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/trim-start');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/trim.js b/node_modules/core-js-pure/features/instance/trim.js
deleted file mode 100644
index 4d99499..0000000
--- a/node_modules/core-js-pure/features/instance/trim.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/trim');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/instance/values.js b/node_modules/core-js-pure/features/instance/values.js
deleted file mode 100644
index 71d1733..0000000
--- a/node_modules/core-js-pure/features/instance/values.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../stable/instance/values');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/is-iterable.js b/node_modules/core-js-pure/features/is-iterable.js
deleted file mode 100644
index 308da78..0000000
--- a/node_modules/core-js-pure/features/is-iterable.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../modules/web.dom-collections.iterator');
-require('../modules/es.string.iterator');
-var isIterable = require('../internals/is-iterable');
-
-module.exports = isIterable;
diff --git a/node_modules/core-js-pure/features/iterator/as-indexed-pairs.js b/node_modules/core-js-pure/features/iterator/as-indexed-pairs.js
deleted file mode 100644
index fdf2d31..0000000
--- a/node_modules/core-js-pure/features/iterator/as-indexed-pairs.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.as-indexed-pairs');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Iterator', 'asIndexedPairs');
-
diff --git a/node_modules/core-js-pure/features/iterator/drop.js b/node_modules/core-js-pure/features/iterator/drop.js
deleted file mode 100644
index 52b4245..0000000
--- a/node_modules/core-js-pure/features/iterator/drop.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.drop');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Iterator', 'drop');
diff --git a/node_modules/core-js-pure/features/iterator/every.js b/node_modules/core-js-pure/features/iterator/every.js
deleted file mode 100644
index cc3fbed..0000000
--- a/node_modules/core-js-pure/features/iterator/every.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.every');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Iterator', 'every');
diff --git a/node_modules/core-js-pure/features/iterator/filter.js b/node_modules/core-js-pure/features/iterator/filter.js
deleted file mode 100644
index f744150..0000000
--- a/node_modules/core-js-pure/features/iterator/filter.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.filter');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Iterator', 'filter');
diff --git a/node_modules/core-js-pure/features/iterator/find.js b/node_modules/core-js-pure/features/iterator/find.js
deleted file mode 100644
index dfed16c..0000000
--- a/node_modules/core-js-pure/features/iterator/find.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.find');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Iterator', 'find');
diff --git a/node_modules/core-js-pure/features/iterator/flat-map.js b/node_modules/core-js-pure/features/iterator/flat-map.js
deleted file mode 100644
index 81e3098..0000000
--- a/node_modules/core-js-pure/features/iterator/flat-map.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.flat-map');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Iterator', 'flatMap');
diff --git a/node_modules/core-js-pure/features/iterator/for-each.js b/node_modules/core-js-pure/features/iterator/for-each.js
deleted file mode 100644
index e711034..0000000
--- a/node_modules/core-js-pure/features/iterator/for-each.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.for-each');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Iterator', 'forEach');
diff --git a/node_modules/core-js-pure/features/iterator/from.js b/node_modules/core-js-pure/features/iterator/from.js
deleted file mode 100644
index e79d1a1..0000000
--- a/node_modules/core-js-pure/features/iterator/from.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.from');
-require('../../modules/web.dom-collections.iterator');
-
-var path = require('../../internals/path');
-
-module.exports = path.Iterator.from;
diff --git a/node_modules/core-js-pure/features/iterator/index.js b/node_modules/core-js-pure/features/iterator/index.js
deleted file mode 100644
index 6e86af7..0000000
--- a/node_modules/core-js-pure/features/iterator/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.as-indexed-pairs');
-require('../../modules/esnext.iterator.drop');
-require('../../modules/esnext.iterator.every');
-require('../../modules/esnext.iterator.filter');
-require('../../modules/esnext.iterator.find');
-require('../../modules/esnext.iterator.flat-map');
-require('../../modules/esnext.iterator.for-each');
-require('../../modules/esnext.iterator.from');
-require('../../modules/esnext.iterator.map');
-require('../../modules/esnext.iterator.reduce');
-require('../../modules/esnext.iterator.some');
-require('../../modules/esnext.iterator.take');
-require('../../modules/esnext.iterator.to-array');
-require('../../modules/web.dom-collections.iterator');
-
-var path = require('../../internals/path');
-
-module.exports = path.Iterator;
diff --git a/node_modules/core-js-pure/features/iterator/map.js b/node_modules/core-js-pure/features/iterator/map.js
deleted file mode 100644
index 060d0f5..0000000
--- a/node_modules/core-js-pure/features/iterator/map.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.map');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Iterator', 'map');
diff --git a/node_modules/core-js-pure/features/iterator/reduce.js b/node_modules/core-js-pure/features/iterator/reduce.js
deleted file mode 100644
index 7049b47..0000000
--- a/node_modules/core-js-pure/features/iterator/reduce.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.reduce');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Iterator', 'reduce');
diff --git a/node_modules/core-js-pure/features/iterator/some.js b/node_modules/core-js-pure/features/iterator/some.js
deleted file mode 100644
index 0a0a20c..0000000
--- a/node_modules/core-js-pure/features/iterator/some.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.some');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Iterator', 'some');
diff --git a/node_modules/core-js-pure/features/iterator/take.js b/node_modules/core-js-pure/features/iterator/take.js
deleted file mode 100644
index 962c4ad..0000000
--- a/node_modules/core-js-pure/features/iterator/take.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.take');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Iterator', 'take');
diff --git a/node_modules/core-js-pure/features/iterator/to-array.js b/node_modules/core-js-pure/features/iterator/to-array.js
deleted file mode 100644
index 42f490b..0000000
--- a/node_modules/core-js-pure/features/iterator/to-array.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.iterator.constructor');
-require('../../modules/esnext.iterator.to-array');
-require('../../modules/web.dom-collections.iterator');
-
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Iterator', 'toArray');
diff --git a/node_modules/core-js-pure/features/json/index.js b/node_modules/core-js-pure/features/json/index.js
deleted file mode 100644
index c53da9f..0000000
--- a/node_modules/core-js-pure/features/json/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/json');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/json/stringify.js b/node_modules/core-js-pure/features/json/stringify.js
deleted file mode 100644
index d6d8c52..0000000
--- a/node_modules/core-js-pure/features/json/stringify.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/json/stringify');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/json/to-string-tag.js b/node_modules/core-js-pure/features/json/to-string-tag.js
deleted file mode 100644
index 5355956..0000000
--- a/node_modules/core-js-pure/features/json/to-string-tag.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/json/to-string-tag');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/map/delete-all.js b/node_modules/core-js-pure/features/map/delete-all.js
deleted file mode 100644
index ecb2113..0000000
--- a/node_modules/core-js-pure/features/map/delete-all.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.delete-all');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'deleteAll');
diff --git a/node_modules/core-js-pure/features/map/every.js b/node_modules/core-js-pure/features/map/every.js
deleted file mode 100644
index a86e393..0000000
--- a/node_modules/core-js-pure/features/map/every.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.every');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'every');
diff --git a/node_modules/core-js-pure/features/map/filter.js b/node_modules/core-js-pure/features/map/filter.js
deleted file mode 100644
index 2326526..0000000
--- a/node_modules/core-js-pure/features/map/filter.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.filter');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'filter');
diff --git a/node_modules/core-js-pure/features/map/find-key.js b/node_modules/core-js-pure/features/map/find-key.js
deleted file mode 100644
index 662c423..0000000
--- a/node_modules/core-js-pure/features/map/find-key.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.find-key');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'findKey');
diff --git a/node_modules/core-js-pure/features/map/find.js b/node_modules/core-js-pure/features/map/find.js
deleted file mode 100644
index 993b226..0000000
--- a/node_modules/core-js-pure/features/map/find.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.find');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'find');
diff --git a/node_modules/core-js-pure/features/map/from.js b/node_modules/core-js-pure/features/map/from.js
deleted file mode 100644
index b7d75f9..0000000
--- a/node_modules/core-js-pure/features/map/from.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-require('../../modules/es.map');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.map.from');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-var Map = path.Map;
-var mapFrom = Map.from;
-
-module.exports = function from(source, mapFn, thisArg) {
-  return mapFrom.call(typeof this === 'function' ? this : Map, source, mapFn, thisArg);
-};
diff --git a/node_modules/core-js-pure/features/map/group-by.js b/node_modules/core-js-pure/features/map/group-by.js
deleted file mode 100644
index c4dfdca..0000000
--- a/node_modules/core-js-pure/features/map/group-by.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-require('../../modules/es.map');
-require('../../modules/esnext.map.group-by');
-var path = require('../../internals/path');
-
-var Map = path.Map;
-var mapGroupBy = Map.groupBy;
-
-module.exports = function groupBy(source, iterable, keyDerivative) {
-  return mapGroupBy.call(typeof this === 'function' ? this : Map, source, iterable, keyDerivative);
-};
diff --git a/node_modules/core-js-pure/features/map/includes.js b/node_modules/core-js-pure/features/map/includes.js
deleted file mode 100644
index 3ba5acd..0000000
--- a/node_modules/core-js-pure/features/map/includes.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.includes');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'includes');
diff --git a/node_modules/core-js-pure/features/map/index.js b/node_modules/core-js-pure/features/map/index.js
deleted file mode 100644
index 73ae0cf..0000000
--- a/node_modules/core-js-pure/features/map/index.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var parent = require('../../es/map');
-require('../../modules/esnext.map.from');
-require('../../modules/esnext.map.of');
-require('../../modules/esnext.map.delete-all');
-require('../../modules/esnext.map.every');
-require('../../modules/esnext.map.filter');
-require('../../modules/esnext.map.find');
-require('../../modules/esnext.map.find-key');
-require('../../modules/esnext.map.group-by');
-require('../../modules/esnext.map.includes');
-require('../../modules/esnext.map.key-by');
-require('../../modules/esnext.map.key-of');
-require('../../modules/esnext.map.map-keys');
-require('../../modules/esnext.map.map-values');
-require('../../modules/esnext.map.merge');
-require('../../modules/esnext.map.reduce');
-require('../../modules/esnext.map.some');
-require('../../modules/esnext.map.update');
-require('../../modules/esnext.map.upsert');
-// TODO: remove from `core-js@4`
-require('../../modules/esnext.map.update-or-insert');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/map/key-by.js b/node_modules/core-js-pure/features/map/key-by.js
deleted file mode 100644
index b156f02..0000000
--- a/node_modules/core-js-pure/features/map/key-by.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-require('../../modules/es.map');
-require('../../modules/esnext.map.key-by');
-var path = require('../../internals/path');
-
-var Map = path.Map;
-var mapKeyBy = Map.keyBy;
-
-module.exports = function keyBy(source, iterable, keyDerivative) {
-  return mapKeyBy.call(typeof this === 'function' ? this : Map, source, iterable, keyDerivative);
-};
diff --git a/node_modules/core-js-pure/features/map/key-of.js b/node_modules/core-js-pure/features/map/key-of.js
deleted file mode 100644
index 0d0789a..0000000
--- a/node_modules/core-js-pure/features/map/key-of.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.key-of');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'keyOf');
diff --git a/node_modules/core-js-pure/features/map/map-keys.js b/node_modules/core-js-pure/features/map/map-keys.js
deleted file mode 100644
index 07a49a3..0000000
--- a/node_modules/core-js-pure/features/map/map-keys.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.map-keys');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'mapKeys');
diff --git a/node_modules/core-js-pure/features/map/map-values.js b/node_modules/core-js-pure/features/map/map-values.js
deleted file mode 100644
index 40bf6ca..0000000
--- a/node_modules/core-js-pure/features/map/map-values.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.map-values');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'mapValues');
diff --git a/node_modules/core-js-pure/features/map/merge.js b/node_modules/core-js-pure/features/map/merge.js
deleted file mode 100644
index 839620d..0000000
--- a/node_modules/core-js-pure/features/map/merge.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.merge');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'merge');
diff --git a/node_modules/core-js-pure/features/map/of.js b/node_modules/core-js-pure/features/map/of.js
deleted file mode 100644
index 57f2a76..0000000
--- a/node_modules/core-js-pure/features/map/of.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-require('../../modules/es.map');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.map.of');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-var Map = path.Map;
-var mapOf = Map.of;
-
-module.exports = function of() {
-  return mapOf.apply(typeof this === 'function' ? this : Map, arguments);
-};
diff --git a/node_modules/core-js-pure/features/map/reduce.js b/node_modules/core-js-pure/features/map/reduce.js
deleted file mode 100644
index 272b6f8..0000000
--- a/node_modules/core-js-pure/features/map/reduce.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.reduce');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'reduce');
diff --git a/node_modules/core-js-pure/features/map/some.js b/node_modules/core-js-pure/features/map/some.js
deleted file mode 100644
index 48192fe..0000000
--- a/node_modules/core-js-pure/features/map/some.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.some');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'some');
diff --git a/node_modules/core-js-pure/features/map/update-or-insert.js b/node_modules/core-js-pure/features/map/update-or-insert.js
deleted file mode 100644
index f195f57..0000000
--- a/node_modules/core-js-pure/features/map/update-or-insert.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// TODO: remove from `core-js@4`
-require('../../modules/es.map');
-require('../../modules/esnext.map.update-or-insert');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'updateOrInsert');
diff --git a/node_modules/core-js-pure/features/map/update.js b/node_modules/core-js-pure/features/map/update.js
deleted file mode 100644
index 3352690..0000000
--- a/node_modules/core-js-pure/features/map/update.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.update');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'update');
diff --git a/node_modules/core-js-pure/features/map/upsert.js b/node_modules/core-js-pure/features/map/upsert.js
deleted file mode 100644
index e658a40..0000000
--- a/node_modules/core-js-pure/features/map/upsert.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.map');
-require('../../modules/esnext.map.upsert');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Map', 'upsert');
diff --git a/node_modules/core-js-pure/features/math/acosh.js b/node_modules/core-js-pure/features/math/acosh.js
deleted file mode 100644
index f039937..0000000
--- a/node_modules/core-js-pure/features/math/acosh.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/acosh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/asinh.js b/node_modules/core-js-pure/features/math/asinh.js
deleted file mode 100644
index 95a302a..0000000
--- a/node_modules/core-js-pure/features/math/asinh.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/asinh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/atanh.js b/node_modules/core-js-pure/features/math/atanh.js
deleted file mode 100644
index f1ebad7..0000000
--- a/node_modules/core-js-pure/features/math/atanh.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/atanh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/cbrt.js b/node_modules/core-js-pure/features/math/cbrt.js
deleted file mode 100644
index 2c1f825..0000000
--- a/node_modules/core-js-pure/features/math/cbrt.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/cbrt');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/clamp.js b/node_modules/core-js-pure/features/math/clamp.js
deleted file mode 100644
index 7b81611..0000000
--- a/node_modules/core-js-pure/features/math/clamp.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.math.clamp');
-var path = require('../../internals/path');
-
-module.exports = path.Math.clamp;
diff --git a/node_modules/core-js-pure/features/math/clz32.js b/node_modules/core-js-pure/features/math/clz32.js
deleted file mode 100644
index a0ecd15..0000000
--- a/node_modules/core-js-pure/features/math/clz32.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/clz32');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/cosh.js b/node_modules/core-js-pure/features/math/cosh.js
deleted file mode 100644
index bc8a11f..0000000
--- a/node_modules/core-js-pure/features/math/cosh.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/cosh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/deg-per-rad.js b/node_modules/core-js-pure/features/math/deg-per-rad.js
deleted file mode 100644
index c945112..0000000
--- a/node_modules/core-js-pure/features/math/deg-per-rad.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../../modules/esnext.math.deg-per-rad');
-
-module.exports = Math.PI / 180;
diff --git a/node_modules/core-js-pure/features/math/degrees.js b/node_modules/core-js-pure/features/math/degrees.js
deleted file mode 100644
index 119c327..0000000
--- a/node_modules/core-js-pure/features/math/degrees.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.math.degrees');
-var path = require('../../internals/path');
-
-module.exports = path.Math.degrees;
diff --git a/node_modules/core-js-pure/features/math/expm1.js b/node_modules/core-js-pure/features/math/expm1.js
deleted file mode 100644
index 0527f81..0000000
--- a/node_modules/core-js-pure/features/math/expm1.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/expm1');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/fround.js b/node_modules/core-js-pure/features/math/fround.js
deleted file mode 100644
index 5caff7d..0000000
--- a/node_modules/core-js-pure/features/math/fround.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/fround');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/fscale.js b/node_modules/core-js-pure/features/math/fscale.js
deleted file mode 100644
index 2a3cdd8..0000000
--- a/node_modules/core-js-pure/features/math/fscale.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.math.fscale');
-var path = require('../../internals/path');
-
-module.exports = path.Math.fscale;
diff --git a/node_modules/core-js-pure/features/math/hypot.js b/node_modules/core-js-pure/features/math/hypot.js
deleted file mode 100644
index 3db8d78..0000000
--- a/node_modules/core-js-pure/features/math/hypot.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/hypot');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/iaddh.js b/node_modules/core-js-pure/features/math/iaddh.js
deleted file mode 100644
index abfcd8a..0000000
--- a/node_modules/core-js-pure/features/math/iaddh.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.math.iaddh');
-var path = require('../../internals/path');
-
-module.exports = path.Math.iaddh;
diff --git a/node_modules/core-js-pure/features/math/imul.js b/node_modules/core-js-pure/features/math/imul.js
deleted file mode 100644
index 4d31d24..0000000
--- a/node_modules/core-js-pure/features/math/imul.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/imul');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/imulh.js b/node_modules/core-js-pure/features/math/imulh.js
deleted file mode 100644
index b81cf34..0000000
--- a/node_modules/core-js-pure/features/math/imulh.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.math.imulh');
-var path = require('../../internals/path');
-
-module.exports = path.Math.imulh;
diff --git a/node_modules/core-js-pure/features/math/index.js b/node_modules/core-js-pure/features/math/index.js
deleted file mode 100644
index 5207e07..0000000
--- a/node_modules/core-js-pure/features/math/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var parent = require('../../es/math');
-require('../../modules/esnext.math.clamp');
-require('../../modules/esnext.math.deg-per-rad');
-require('../../modules/esnext.math.degrees');
-require('../../modules/esnext.math.fscale');
-require('../../modules/esnext.math.rad-per-deg');
-require('../../modules/esnext.math.radians');
-require('../../modules/esnext.math.scale');
-require('../../modules/esnext.math.seeded-prng');
-require('../../modules/esnext.math.signbit');
-// TODO: Remove from `core-js@4`
-require('../../modules/esnext.math.iaddh');
-require('../../modules/esnext.math.isubh');
-require('../../modules/esnext.math.imulh');
-require('../../modules/esnext.math.umulh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/isubh.js b/node_modules/core-js-pure/features/math/isubh.js
deleted file mode 100644
index a14e102..0000000
--- a/node_modules/core-js-pure/features/math/isubh.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.math.isubh');
-var path = require('../../internals/path');
-
-module.exports = path.Math.isubh;
diff --git a/node_modules/core-js-pure/features/math/log10.js b/node_modules/core-js-pure/features/math/log10.js
deleted file mode 100644
index 07b9704..0000000
--- a/node_modules/core-js-pure/features/math/log10.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/log10');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/log1p.js b/node_modules/core-js-pure/features/math/log1p.js
deleted file mode 100644
index b31d730..0000000
--- a/node_modules/core-js-pure/features/math/log1p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/log1p');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/log2.js b/node_modules/core-js-pure/features/math/log2.js
deleted file mode 100644
index 00db8a5..0000000
--- a/node_modules/core-js-pure/features/math/log2.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/log2');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/rad-per-deg.js b/node_modules/core-js-pure/features/math/rad-per-deg.js
deleted file mode 100644
index 3eee674..0000000
--- a/node_modules/core-js-pure/features/math/rad-per-deg.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../../modules/esnext.math.rad-per-deg');
-
-module.exports = 180 / Math.PI;
diff --git a/node_modules/core-js-pure/features/math/radians.js b/node_modules/core-js-pure/features/math/radians.js
deleted file mode 100644
index 1f02607..0000000
--- a/node_modules/core-js-pure/features/math/radians.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.math.radians');
-var path = require('../../internals/path');
-
-module.exports = path.Math.radians;
diff --git a/node_modules/core-js-pure/features/math/scale.js b/node_modules/core-js-pure/features/math/scale.js
deleted file mode 100644
index c44428d..0000000
--- a/node_modules/core-js-pure/features/math/scale.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.math.scale');
-var path = require('../../internals/path');
-
-module.exports = path.Math.scale;
diff --git a/node_modules/core-js-pure/features/math/seeded-prng.js b/node_modules/core-js-pure/features/math/seeded-prng.js
deleted file mode 100644
index 80491b9..0000000
--- a/node_modules/core-js-pure/features/math/seeded-prng.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.math.seeded-prng');
-var path = require('../../internals/path');
-
-module.exports = path.Math.seededPRNG;
diff --git a/node_modules/core-js-pure/features/math/sign.js b/node_modules/core-js-pure/features/math/sign.js
deleted file mode 100644
index c7bef22..0000000
--- a/node_modules/core-js-pure/features/math/sign.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/sign');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/signbit.js b/node_modules/core-js-pure/features/math/signbit.js
deleted file mode 100644
index ac2862a..0000000
--- a/node_modules/core-js-pure/features/math/signbit.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.math.signbit');
-var path = require('../../internals/path');
-
-module.exports = path.Math.signbit;
diff --git a/node_modules/core-js-pure/features/math/sinh.js b/node_modules/core-js-pure/features/math/sinh.js
deleted file mode 100644
index 96f8f8e..0000000
--- a/node_modules/core-js-pure/features/math/sinh.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/sinh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/tanh.js b/node_modules/core-js-pure/features/math/tanh.js
deleted file mode 100644
index c9e8bb8..0000000
--- a/node_modules/core-js-pure/features/math/tanh.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/tanh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/to-string-tag.js b/node_modules/core-js-pure/features/math/to-string-tag.js
deleted file mode 100644
index 02faadf..0000000
--- a/node_modules/core-js-pure/features/math/to-string-tag.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/to-string-tag');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/trunc.js b/node_modules/core-js-pure/features/math/trunc.js
deleted file mode 100644
index 7635c17..0000000
--- a/node_modules/core-js-pure/features/math/trunc.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/trunc');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/math/umulh.js b/node_modules/core-js-pure/features/math/umulh.js
deleted file mode 100644
index 447bf71..0000000
--- a/node_modules/core-js-pure/features/math/umulh.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.math.umulh');
-var path = require('../../internals/path');
-
-module.exports = path.Math.umulh;
diff --git a/node_modules/core-js-pure/features/number/constructor.js b/node_modules/core-js-pure/features/number/constructor.js
deleted file mode 100644
index 6b5836e..0000000
--- a/node_modules/core-js-pure/features/number/constructor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/constructor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/epsilon.js b/node_modules/core-js-pure/features/number/epsilon.js
deleted file mode 100644
index fe2ccd7..0000000
--- a/node_modules/core-js-pure/features/number/epsilon.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/epsilon');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/from-string.js b/node_modules/core-js-pure/features/number/from-string.js
deleted file mode 100644
index 65654be..0000000
--- a/node_modules/core-js-pure/features/number/from-string.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.number.from-string');
-var path = require('../../internals/path');
-
-module.exports = path.Number.fromString;
diff --git a/node_modules/core-js-pure/features/number/index.js b/node_modules/core-js-pure/features/number/index.js
deleted file mode 100644
index e26bfec..0000000
--- a/node_modules/core-js-pure/features/number/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var parent = require('../../es/number');
-
-module.exports = parent;
-
-require('../../modules/esnext.number.from-string');
diff --git a/node_modules/core-js-pure/features/number/is-finite.js b/node_modules/core-js-pure/features/number/is-finite.js
deleted file mode 100644
index 24b9773..0000000
--- a/node_modules/core-js-pure/features/number/is-finite.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/is-finite');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/is-integer.js b/node_modules/core-js-pure/features/number/is-integer.js
deleted file mode 100644
index b1592d0..0000000
--- a/node_modules/core-js-pure/features/number/is-integer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/is-integer');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/is-nan.js b/node_modules/core-js-pure/features/number/is-nan.js
deleted file mode 100644
index fcbec50..0000000
--- a/node_modules/core-js-pure/features/number/is-nan.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/is-nan');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/is-safe-integer.js b/node_modules/core-js-pure/features/number/is-safe-integer.js
deleted file mode 100644
index b25eb1c..0000000
--- a/node_modules/core-js-pure/features/number/is-safe-integer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/is-safe-integer');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/max-safe-integer.js b/node_modules/core-js-pure/features/number/max-safe-integer.js
deleted file mode 100644
index e6689b0..0000000
--- a/node_modules/core-js-pure/features/number/max-safe-integer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/max-safe-integer');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/min-safe-integer.js b/node_modules/core-js-pure/features/number/min-safe-integer.js
deleted file mode 100644
index 1159a47..0000000
--- a/node_modules/core-js-pure/features/number/min-safe-integer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/min-safe-integer');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/parse-float.js b/node_modules/core-js-pure/features/number/parse-float.js
deleted file mode 100644
index 3b49c6a..0000000
--- a/node_modules/core-js-pure/features/number/parse-float.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/parse-float');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/parse-int.js b/node_modules/core-js-pure/features/number/parse-int.js
deleted file mode 100644
index 9e44651..0000000
--- a/node_modules/core-js-pure/features/number/parse-int.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/parse-int');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/to-fixed.js b/node_modules/core-js-pure/features/number/to-fixed.js
deleted file mode 100644
index b103de9..0000000
--- a/node_modules/core-js-pure/features/number/to-fixed.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/to-fixed');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/to-precision.js b/node_modules/core-js-pure/features/number/to-precision.js
deleted file mode 100644
index 5183347..0000000
--- a/node_modules/core-js-pure/features/number/to-precision.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/to-precision');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/virtual/index.js b/node_modules/core-js-pure/features/number/virtual/index.js
deleted file mode 100644
index 88eef4b..0000000
--- a/node_modules/core-js-pure/features/number/virtual/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/number/virtual');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/virtual/to-fixed.js b/node_modules/core-js-pure/features/number/virtual/to-fixed.js
deleted file mode 100644
index a9f83cc..0000000
--- a/node_modules/core-js-pure/features/number/virtual/to-fixed.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/number/virtual/to-fixed');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/number/virtual/to-precision.js b/node_modules/core-js-pure/features/number/virtual/to-precision.js
deleted file mode 100644
index adffb86..0000000
--- a/node_modules/core-js-pure/features/number/virtual/to-precision.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/number/virtual/to-precision');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/assign.js b/node_modules/core-js-pure/features/object/assign.js
deleted file mode 100644
index ed6863e..0000000
--- a/node_modules/core-js-pure/features/object/assign.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/assign');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/create.js b/node_modules/core-js-pure/features/object/create.js
deleted file mode 100644
index 1e4d353..0000000
--- a/node_modules/core-js-pure/features/object/create.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/create');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/define-getter.js b/node_modules/core-js-pure/features/object/define-getter.js
deleted file mode 100644
index 9b734ab..0000000
--- a/node_modules/core-js-pure/features/object/define-getter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/define-getter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/define-properties.js b/node_modules/core-js-pure/features/object/define-properties.js
deleted file mode 100644
index e0d074c..0000000
--- a/node_modules/core-js-pure/features/object/define-properties.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/define-properties');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/define-property.js b/node_modules/core-js-pure/features/object/define-property.js
deleted file mode 100644
index 67a978c..0000000
--- a/node_modules/core-js-pure/features/object/define-property.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/define-property');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/define-setter.js b/node_modules/core-js-pure/features/object/define-setter.js
deleted file mode 100644
index 9076fd5..0000000
--- a/node_modules/core-js-pure/features/object/define-setter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/define-setter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/entries.js b/node_modules/core-js-pure/features/object/entries.js
deleted file mode 100644
index c7a831a..0000000
--- a/node_modules/core-js-pure/features/object/entries.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/entries');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/freeze.js b/node_modules/core-js-pure/features/object/freeze.js
deleted file mode 100644
index 0ee7459..0000000
--- a/node_modules/core-js-pure/features/object/freeze.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/freeze');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/from-entries.js b/node_modules/core-js-pure/features/object/from-entries.js
deleted file mode 100644
index aec2c7a..0000000
--- a/node_modules/core-js-pure/features/object/from-entries.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/from-entries');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/get-own-property-descriptor.js b/node_modules/core-js-pure/features/object/get-own-property-descriptor.js
deleted file mode 100644
index 9b69cdd..0000000
--- a/node_modules/core-js-pure/features/object/get-own-property-descriptor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/get-own-property-descriptor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/get-own-property-descriptors.js b/node_modules/core-js-pure/features/object/get-own-property-descriptors.js
deleted file mode 100644
index 43a193e..0000000
--- a/node_modules/core-js-pure/features/object/get-own-property-descriptors.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/get-own-property-descriptors');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/get-own-property-names.js b/node_modules/core-js-pure/features/object/get-own-property-names.js
deleted file mode 100644
index 42c21d7..0000000
--- a/node_modules/core-js-pure/features/object/get-own-property-names.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/get-own-property-names');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/get-own-property-symbols.js b/node_modules/core-js-pure/features/object/get-own-property-symbols.js
deleted file mode 100644
index 0bc8c26..0000000
--- a/node_modules/core-js-pure/features/object/get-own-property-symbols.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/get-own-property-symbols');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/get-prototype-of.js b/node_modules/core-js-pure/features/object/get-prototype-of.js
deleted file mode 100644
index b7cf588..0000000
--- a/node_modules/core-js-pure/features/object/get-prototype-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/get-prototype-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/index.js b/node_modules/core-js-pure/features/object/index.js
deleted file mode 100644
index e7ea4bf..0000000
--- a/node_modules/core-js-pure/features/object/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var parent = require('../../es/object');
-require('../../modules/esnext.object.iterate-entries');
-require('../../modules/esnext.object.iterate-keys');
-require('../../modules/esnext.object.iterate-values');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/is-extensible.js b/node_modules/core-js-pure/features/object/is-extensible.js
deleted file mode 100644
index 694b9a4..0000000
--- a/node_modules/core-js-pure/features/object/is-extensible.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/is-extensible');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/is-frozen.js b/node_modules/core-js-pure/features/object/is-frozen.js
deleted file mode 100644
index 68fe107..0000000
--- a/node_modules/core-js-pure/features/object/is-frozen.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/is-frozen');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/is-sealed.js b/node_modules/core-js-pure/features/object/is-sealed.js
deleted file mode 100644
index bbf6472..0000000
--- a/node_modules/core-js-pure/features/object/is-sealed.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/is-sealed');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/is.js b/node_modules/core-js-pure/features/object/is.js
deleted file mode 100644
index 3ddd76f..0000000
--- a/node_modules/core-js-pure/features/object/is.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/is');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/iterate-entries.js b/node_modules/core-js-pure/features/object/iterate-entries.js
deleted file mode 100644
index ca9cd28..0000000
--- a/node_modules/core-js-pure/features/object/iterate-entries.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.object.iterate-entries');
-var path = require('../../internals/path');
-
-module.exports = path.Object.iterateEntries;
diff --git a/node_modules/core-js-pure/features/object/iterate-keys.js b/node_modules/core-js-pure/features/object/iterate-keys.js
deleted file mode 100644
index 8e8fad4..0000000
--- a/node_modules/core-js-pure/features/object/iterate-keys.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.object.iterate-keys');
-var path = require('../../internals/path');
-
-module.exports = path.Object.iterateKeys;
diff --git a/node_modules/core-js-pure/features/object/iterate-values.js b/node_modules/core-js-pure/features/object/iterate-values.js
deleted file mode 100644
index a77108f..0000000
--- a/node_modules/core-js-pure/features/object/iterate-values.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.object.iterate-values');
-var path = require('../../internals/path');
-
-module.exports = path.Object.iterateValues;
diff --git a/node_modules/core-js-pure/features/object/keys.js b/node_modules/core-js-pure/features/object/keys.js
deleted file mode 100644
index 2cff0ab..0000000
--- a/node_modules/core-js-pure/features/object/keys.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/keys');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/lookup-getter.js b/node_modules/core-js-pure/features/object/lookup-getter.js
deleted file mode 100644
index 9f10f6b..0000000
--- a/node_modules/core-js-pure/features/object/lookup-getter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/lookup-getter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/lookup-setter.js b/node_modules/core-js-pure/features/object/lookup-setter.js
deleted file mode 100644
index 97389bf..0000000
--- a/node_modules/core-js-pure/features/object/lookup-setter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/lookup-setter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/prevent-extensions.js b/node_modules/core-js-pure/features/object/prevent-extensions.js
deleted file mode 100644
index 7171f2a..0000000
--- a/node_modules/core-js-pure/features/object/prevent-extensions.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/prevent-extensions');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/seal.js b/node_modules/core-js-pure/features/object/seal.js
deleted file mode 100644
index fa50038..0000000
--- a/node_modules/core-js-pure/features/object/seal.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/seal');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/set-prototype-of.js b/node_modules/core-js-pure/features/object/set-prototype-of.js
deleted file mode 100644
index 4885ad3..0000000
--- a/node_modules/core-js-pure/features/object/set-prototype-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/set-prototype-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/to-string.js b/node_modules/core-js-pure/features/object/to-string.js
deleted file mode 100644
index 589ffcb..0000000
--- a/node_modules/core-js-pure/features/object/to-string.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/to-string');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/object/values.js b/node_modules/core-js-pure/features/object/values.js
deleted file mode 100644
index 9e457fc..0000000
--- a/node_modules/core-js-pure/features/object/values.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/values');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/observable/index.js b/node_modules/core-js-pure/features/observable/index.js
deleted file mode 100644
index 9f694bc..0000000
--- a/node_modules/core-js-pure/features/observable/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-require('../../modules/esnext.observable');
-require('../../modules/esnext.symbol.observable');
-require('../../modules/es.object.to-string');
-require('../../modules/es.string.iterator');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-module.exports = path.Observable;
diff --git a/node_modules/core-js-pure/features/parse-float.js b/node_modules/core-js-pure/features/parse-float.js
deleted file mode 100644
index 1bc853c..0000000
--- a/node_modules/core-js-pure/features/parse-float.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../es/parse-float');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/parse-int.js b/node_modules/core-js-pure/features/parse-int.js
deleted file mode 100644
index af7cffd..0000000
--- a/node_modules/core-js-pure/features/parse-int.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../es/parse-int');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/promise/all-settled.js b/node_modules/core-js-pure/features/promise/all-settled.js
deleted file mode 100644
index c5e8892..0000000
--- a/node_modules/core-js-pure/features/promise/all-settled.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// TODO: Remove from `core-js@4`
-require('../../modules/esnext.promise.all-settled');
-
-var parent = require('../../es/promise/all-settled');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/promise/any.js b/node_modules/core-js-pure/features/promise/any.js
deleted file mode 100644
index 7246403..0000000
--- a/node_modules/core-js-pure/features/promise/any.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-require('../../modules/es.promise');
-require('../../modules/esnext.aggregate-error');
-require('../../modules/esnext.promise.any');
-var path = require('../../internals/path');
-
-var Promise = path.Promise;
-var $any = Promise.any;
-
-module.exports = function any(iterable) {
-  return $any.call(typeof this === 'function' ? this : Promise, iterable);
-};
diff --git a/node_modules/core-js-pure/features/promise/finally.js b/node_modules/core-js-pure/features/promise/finally.js
deleted file mode 100644
index 835c6c9..0000000
--- a/node_modules/core-js-pure/features/promise/finally.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/promise/finally');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/promise/index.js b/node_modules/core-js-pure/features/promise/index.js
deleted file mode 100644
index 13393b5..0000000
--- a/node_modules/core-js-pure/features/promise/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var parent = require('../../es/promise');
-require('../../modules/esnext.aggregate-error');
-// TODO: Remove from `core-js@4`
-require('../../modules/esnext.promise.all-settled');
-require('../../modules/esnext.promise.try');
-require('../../modules/esnext.promise.any');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/promise/try.js b/node_modules/core-js-pure/features/promise/try.js
deleted file mode 100644
index b7a6e3b..0000000
--- a/node_modules/core-js-pure/features/promise/try.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-require('../../modules/es.promise');
-require('../../modules/esnext.promise.try');
-var path = require('../../internals/path');
-
-var Promise = path.Promise;
-var promiseTry = Promise['try'];
-
-module.exports = { 'try': function (callbackfn) {
-  return promiseTry.call(typeof this === 'function' ? this : Promise, callbackfn);
-} }['try'];
diff --git a/node_modules/core-js-pure/features/queue-microtask.js b/node_modules/core-js-pure/features/queue-microtask.js
deleted file mode 100644
index 66c39d6..0000000
--- a/node_modules/core-js-pure/features/queue-microtask.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../stable/queue-microtask');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/apply.js b/node_modules/core-js-pure/features/reflect/apply.js
deleted file mode 100644
index 75bf21e..0000000
--- a/node_modules/core-js-pure/features/reflect/apply.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/apply');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/construct.js b/node_modules/core-js-pure/features/reflect/construct.js
deleted file mode 100644
index 86ba56e..0000000
--- a/node_modules/core-js-pure/features/reflect/construct.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/construct');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/define-metadata.js b/node_modules/core-js-pure/features/reflect/define-metadata.js
deleted file mode 100644
index 156cc95..0000000
--- a/node_modules/core-js-pure/features/reflect/define-metadata.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.reflect.define-metadata');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.defineMetadata;
diff --git a/node_modules/core-js-pure/features/reflect/define-property.js b/node_modules/core-js-pure/features/reflect/define-property.js
deleted file mode 100644
index 5b66a14..0000000
--- a/node_modules/core-js-pure/features/reflect/define-property.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/define-property');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/delete-metadata.js b/node_modules/core-js-pure/features/reflect/delete-metadata.js
deleted file mode 100644
index bbb8c48..0000000
--- a/node_modules/core-js-pure/features/reflect/delete-metadata.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.reflect.delete-metadata');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.deleteMetadata;
diff --git a/node_modules/core-js-pure/features/reflect/delete-property.js b/node_modules/core-js-pure/features/reflect/delete-property.js
deleted file mode 100644
index 381d7a7..0000000
--- a/node_modules/core-js-pure/features/reflect/delete-property.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/delete-property');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/get-metadata-keys.js b/node_modules/core-js-pure/features/reflect/get-metadata-keys.js
deleted file mode 100644
index 8137178..0000000
--- a/node_modules/core-js-pure/features/reflect/get-metadata-keys.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.reflect.get-metadata-keys');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.getMetadataKeys;
diff --git a/node_modules/core-js-pure/features/reflect/get-metadata.js b/node_modules/core-js-pure/features/reflect/get-metadata.js
deleted file mode 100644
index 3d00b4e..0000000
--- a/node_modules/core-js-pure/features/reflect/get-metadata.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.reflect.get-metadata');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.getMetadata;
diff --git a/node_modules/core-js-pure/features/reflect/get-own-metadata-keys.js b/node_modules/core-js-pure/features/reflect/get-own-metadata-keys.js
deleted file mode 100644
index 020828f..0000000
--- a/node_modules/core-js-pure/features/reflect/get-own-metadata-keys.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.reflect.get-own-metadata-keys');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.getOwnMetadataKeys;
diff --git a/node_modules/core-js-pure/features/reflect/get-own-metadata.js b/node_modules/core-js-pure/features/reflect/get-own-metadata.js
deleted file mode 100644
index 90f626c..0000000
--- a/node_modules/core-js-pure/features/reflect/get-own-metadata.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.reflect.get-own-metadata');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.getOwnMetadata;
diff --git a/node_modules/core-js-pure/features/reflect/get-own-property-descriptor.js b/node_modules/core-js-pure/features/reflect/get-own-property-descriptor.js
deleted file mode 100644
index 0f9c132..0000000
--- a/node_modules/core-js-pure/features/reflect/get-own-property-descriptor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/get-own-property-descriptor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/get-prototype-of.js b/node_modules/core-js-pure/features/reflect/get-prototype-of.js
deleted file mode 100644
index fdc1ccb..0000000
--- a/node_modules/core-js-pure/features/reflect/get-prototype-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/get-prototype-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/get.js b/node_modules/core-js-pure/features/reflect/get.js
deleted file mode 100644
index 2914c12..0000000
--- a/node_modules/core-js-pure/features/reflect/get.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/get');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/has-metadata.js b/node_modules/core-js-pure/features/reflect/has-metadata.js
deleted file mode 100644
index 3072c51..0000000
--- a/node_modules/core-js-pure/features/reflect/has-metadata.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.reflect.has-metadata');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.hasMetadata;
diff --git a/node_modules/core-js-pure/features/reflect/has-own-metadata.js b/node_modules/core-js-pure/features/reflect/has-own-metadata.js
deleted file mode 100644
index 09eb765..0000000
--- a/node_modules/core-js-pure/features/reflect/has-own-metadata.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.reflect.has-own-metadata');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.hasOwnMetadata;
diff --git a/node_modules/core-js-pure/features/reflect/has.js b/node_modules/core-js-pure/features/reflect/has.js
deleted file mode 100644
index 26b5f7c..0000000
--- a/node_modules/core-js-pure/features/reflect/has.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/has');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/index.js b/node_modules/core-js-pure/features/reflect/index.js
deleted file mode 100644
index 6460a70..0000000
--- a/node_modules/core-js-pure/features/reflect/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var parent = require('../../es/reflect');
-require('../../modules/esnext.reflect.define-metadata');
-require('../../modules/esnext.reflect.delete-metadata');
-require('../../modules/esnext.reflect.get-metadata');
-require('../../modules/esnext.reflect.get-metadata-keys');
-require('../../modules/esnext.reflect.get-own-metadata');
-require('../../modules/esnext.reflect.get-own-metadata-keys');
-require('../../modules/esnext.reflect.has-metadata');
-require('../../modules/esnext.reflect.has-own-metadata');
-require('../../modules/esnext.reflect.metadata');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/is-extensible.js b/node_modules/core-js-pure/features/reflect/is-extensible.js
deleted file mode 100644
index b04239e..0000000
--- a/node_modules/core-js-pure/features/reflect/is-extensible.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/is-extensible');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/metadata.js b/node_modules/core-js-pure/features/reflect/metadata.js
deleted file mode 100644
index d1faf13..0000000
--- a/node_modules/core-js-pure/features/reflect/metadata.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.reflect.metadata');
-var path = require('../../internals/path');
-
-module.exports = path.Reflect.metadata;
diff --git a/node_modules/core-js-pure/features/reflect/own-keys.js b/node_modules/core-js-pure/features/reflect/own-keys.js
deleted file mode 100644
index 6d56289..0000000
--- a/node_modules/core-js-pure/features/reflect/own-keys.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/own-keys');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/prevent-extensions.js b/node_modules/core-js-pure/features/reflect/prevent-extensions.js
deleted file mode 100644
index 40a8bbc..0000000
--- a/node_modules/core-js-pure/features/reflect/prevent-extensions.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/prevent-extensions');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/set-prototype-of.js b/node_modules/core-js-pure/features/reflect/set-prototype-of.js
deleted file mode 100644
index 20fd6f3..0000000
--- a/node_modules/core-js-pure/features/reflect/set-prototype-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/set-prototype-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/reflect/set.js b/node_modules/core-js-pure/features/reflect/set.js
deleted file mode 100644
index a4cf5f0..0000000
--- a/node_modules/core-js-pure/features/reflect/set.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/set');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/regexp/constructor.js b/node_modules/core-js-pure/features/regexp/constructor.js
deleted file mode 100644
index 2cd0149..0000000
--- a/node_modules/core-js-pure/features/regexp/constructor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/constructor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/regexp/flags.js b/node_modules/core-js-pure/features/regexp/flags.js
deleted file mode 100644
index bdf1c8a..0000000
--- a/node_modules/core-js-pure/features/regexp/flags.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/flags');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/regexp/index.js b/node_modules/core-js-pure/features/regexp/index.js
deleted file mode 100644
index df41f17..0000000
--- a/node_modules/core-js-pure/features/regexp/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/regexp/match.js b/node_modules/core-js-pure/features/regexp/match.js
deleted file mode 100644
index c995bbb..0000000
--- a/node_modules/core-js-pure/features/regexp/match.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/match');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/regexp/replace.js b/node_modules/core-js-pure/features/regexp/replace.js
deleted file mode 100644
index b1a9e65..0000000
--- a/node_modules/core-js-pure/features/regexp/replace.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/replace');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/regexp/search.js b/node_modules/core-js-pure/features/regexp/search.js
deleted file mode 100644
index af17062..0000000
--- a/node_modules/core-js-pure/features/regexp/search.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/search');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/regexp/split.js b/node_modules/core-js-pure/features/regexp/split.js
deleted file mode 100644
index fb0471a..0000000
--- a/node_modules/core-js-pure/features/regexp/split.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/split');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/regexp/sticky.js b/node_modules/core-js-pure/features/regexp/sticky.js
deleted file mode 100644
index c1307ad..0000000
--- a/node_modules/core-js-pure/features/regexp/sticky.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/sticky');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/regexp/test.js b/node_modules/core-js-pure/features/regexp/test.js
deleted file mode 100644
index 53f9166..0000000
--- a/node_modules/core-js-pure/features/regexp/test.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/test');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/regexp/to-string.js b/node_modules/core-js-pure/features/regexp/to-string.js
deleted file mode 100644
index e2a4442..0000000
--- a/node_modules/core-js-pure/features/regexp/to-string.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/to-string');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/set-immediate.js b/node_modules/core-js-pure/features/set-immediate.js
deleted file mode 100644
index 01530a2..0000000
--- a/node_modules/core-js-pure/features/set-immediate.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../stable/set-immediate');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/set-interval.js b/node_modules/core-js-pure/features/set-interval.js
deleted file mode 100644
index 122b8ba..0000000
--- a/node_modules/core-js-pure/features/set-interval.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../stable/set-interval');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/set-timeout.js b/node_modules/core-js-pure/features/set-timeout.js
deleted file mode 100644
index 310fcd3..0000000
--- a/node_modules/core-js-pure/features/set-timeout.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../stable/set-timeout');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/set/add-all.js b/node_modules/core-js-pure/features/set/add-all.js
deleted file mode 100644
index d045d5e..0000000
--- a/node_modules/core-js-pure/features/set/add-all.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/esnext.set.add-all');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'addAll');
diff --git a/node_modules/core-js-pure/features/set/delete-all.js b/node_modules/core-js-pure/features/set/delete-all.js
deleted file mode 100644
index aa75974..0000000
--- a/node_modules/core-js-pure/features/set/delete-all.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/esnext.set.delete-all');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'deleteAll');
diff --git a/node_modules/core-js-pure/features/set/difference.js b/node_modules/core-js-pure/features/set/difference.js
deleted file mode 100644
index 24a7194..0000000
--- a/node_modules/core-js-pure/features/set/difference.js
+++ /dev/null
@@ -1,7 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.set.difference');
-require('../../modules/web.dom-collections.iterator');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'difference');
diff --git a/node_modules/core-js-pure/features/set/every.js b/node_modules/core-js-pure/features/set/every.js
deleted file mode 100644
index f22294a..0000000
--- a/node_modules/core-js-pure/features/set/every.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/esnext.set.every');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'every');
diff --git a/node_modules/core-js-pure/features/set/filter.js b/node_modules/core-js-pure/features/set/filter.js
deleted file mode 100644
index ffb4a02..0000000
--- a/node_modules/core-js-pure/features/set/filter.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/esnext.set.filter');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'filter');
diff --git a/node_modules/core-js-pure/features/set/find.js b/node_modules/core-js-pure/features/set/find.js
deleted file mode 100644
index 8627805..0000000
--- a/node_modules/core-js-pure/features/set/find.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/esnext.set.find');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'find');
diff --git a/node_modules/core-js-pure/features/set/from.js b/node_modules/core-js-pure/features/set/from.js
deleted file mode 100644
index f18623b..0000000
--- a/node_modules/core-js-pure/features/set/from.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-require('../../modules/es.set');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.set.from');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-var Set = path.Set;
-var setFrom = Set.from;
-
-module.exports = function from(source, mapFn, thisArg) {
-  return setFrom.call(typeof this === 'function' ? this : Set, source, mapFn, thisArg);
-};
diff --git a/node_modules/core-js-pure/features/set/index.js b/node_modules/core-js-pure/features/set/index.js
deleted file mode 100644
index 66896f4..0000000
--- a/node_modules/core-js-pure/features/set/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var parent = require('../../es/set');
-require('../../modules/esnext.set.from');
-require('../../modules/esnext.set.of');
-require('../../modules/esnext.set.add-all');
-require('../../modules/esnext.set.delete-all');
-require('../../modules/esnext.set.every');
-require('../../modules/esnext.set.difference');
-require('../../modules/esnext.set.filter');
-require('../../modules/esnext.set.find');
-require('../../modules/esnext.set.intersection');
-require('../../modules/esnext.set.is-disjoint-from');
-require('../../modules/esnext.set.is-subset-of');
-require('../../modules/esnext.set.is-superset-of');
-require('../../modules/esnext.set.join');
-require('../../modules/esnext.set.map');
-require('../../modules/esnext.set.reduce');
-require('../../modules/esnext.set.some');
-require('../../modules/esnext.set.symmetric-difference');
-require('../../modules/esnext.set.union');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/set/intersection.js b/node_modules/core-js-pure/features/set/intersection.js
deleted file mode 100644
index 203edfe..0000000
--- a/node_modules/core-js-pure/features/set/intersection.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/esnext.set.intersection');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'intersection');
diff --git a/node_modules/core-js-pure/features/set/is-disjoint-from.js b/node_modules/core-js-pure/features/set/is-disjoint-from.js
deleted file mode 100644
index 88ca08b..0000000
--- a/node_modules/core-js-pure/features/set/is-disjoint-from.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/esnext.set.is-disjoint-from');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'isDisjointFrom');
diff --git a/node_modules/core-js-pure/features/set/is-subset-of.js b/node_modules/core-js-pure/features/set/is-subset-of.js
deleted file mode 100644
index 21ab3d4..0000000
--- a/node_modules/core-js-pure/features/set/is-subset-of.js
+++ /dev/null
@@ -1,7 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.set.is-subset-of');
-require('../../modules/web.dom-collections.iterator');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'isSubsetOf');
diff --git a/node_modules/core-js-pure/features/set/is-superset-of.js b/node_modules/core-js-pure/features/set/is-superset-of.js
deleted file mode 100644
index 4da6ba1..0000000
--- a/node_modules/core-js-pure/features/set/is-superset-of.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/esnext.set.is-superset-of');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'isSupersetOf');
diff --git a/node_modules/core-js-pure/features/set/join.js b/node_modules/core-js-pure/features/set/join.js
deleted file mode 100644
index b3ae27d..0000000
--- a/node_modules/core-js-pure/features/set/join.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/esnext.set.join');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'join');
diff --git a/node_modules/core-js-pure/features/set/map.js b/node_modules/core-js-pure/features/set/map.js
deleted file mode 100644
index 3957002..0000000
--- a/node_modules/core-js-pure/features/set/map.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/esnext.set.map');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'map');
diff --git a/node_modules/core-js-pure/features/set/of.js b/node_modules/core-js-pure/features/set/of.js
deleted file mode 100644
index 114558a..0000000
--- a/node_modules/core-js-pure/features/set/of.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-require('../../modules/es.set');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.set.of');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-var Set = path.Set;
-var setOf = Set.of;
-
-module.exports = function of() {
-  return setOf.apply(typeof this === 'function' ? this : Set, arguments);
-};
diff --git a/node_modules/core-js-pure/features/set/reduce.js b/node_modules/core-js-pure/features/set/reduce.js
deleted file mode 100644
index 11ab6a4..0000000
--- a/node_modules/core-js-pure/features/set/reduce.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/esnext.set.reduce');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'reduce');
diff --git a/node_modules/core-js-pure/features/set/some.js b/node_modules/core-js-pure/features/set/some.js
deleted file mode 100644
index 0b4227a..0000000
--- a/node_modules/core-js-pure/features/set/some.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/esnext.set.some');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'some');
diff --git a/node_modules/core-js-pure/features/set/symmetric-difference.js b/node_modules/core-js-pure/features/set/symmetric-difference.js
deleted file mode 100644
index fb04d63..0000000
--- a/node_modules/core-js-pure/features/set/symmetric-difference.js
+++ /dev/null
@@ -1,7 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.set.symmetric-difference');
-require('../../modules/web.dom-collections.iterator');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'symmetricDifference');
diff --git a/node_modules/core-js-pure/features/set/union.js b/node_modules/core-js-pure/features/set/union.js
deleted file mode 100644
index d180f8b..0000000
--- a/node_modules/core-js-pure/features/set/union.js
+++ /dev/null
@@ -1,7 +0,0 @@
-require('../../modules/es.set');
-require('../../modules/es.string.iterator');
-require('../../modules/esnext.set.union');
-require('../../modules/web.dom-collections.iterator');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Set', 'union');
diff --git a/node_modules/core-js-pure/features/string/anchor.js b/node_modules/core-js-pure/features/string/anchor.js
deleted file mode 100644
index b9b7905..0000000
--- a/node_modules/core-js-pure/features/string/anchor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/anchor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/at.js b/node_modules/core-js-pure/features/string/at.js
deleted file mode 100644
index d8bcca8..0000000
--- a/node_modules/core-js-pure/features/string/at.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.string.at');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'at');
diff --git a/node_modules/core-js-pure/features/string/big.js b/node_modules/core-js-pure/features/string/big.js
deleted file mode 100644
index 9c118e5..0000000
--- a/node_modules/core-js-pure/features/string/big.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/big');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/blink.js b/node_modules/core-js-pure/features/string/blink.js
deleted file mode 100644
index 23ca24f..0000000
--- a/node_modules/core-js-pure/features/string/blink.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/blink');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/bold.js b/node_modules/core-js-pure/features/string/bold.js
deleted file mode 100644
index 322db3e..0000000
--- a/node_modules/core-js-pure/features/string/bold.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/bold');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/code-point-at.js b/node_modules/core-js-pure/features/string/code-point-at.js
deleted file mode 100644
index 033b94c..0000000
--- a/node_modules/core-js-pure/features/string/code-point-at.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/code-point-at');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/code-points.js b/node_modules/core-js-pure/features/string/code-points.js
deleted file mode 100644
index 8a783f3..0000000
--- a/node_modules/core-js-pure/features/string/code-points.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../../modules/esnext.string.code-points');
-
-module.exports = require('../../internals/entry-unbind')('String', 'codePoints');
diff --git a/node_modules/core-js-pure/features/string/ends-with.js b/node_modules/core-js-pure/features/string/ends-with.js
deleted file mode 100644
index 2ea5594..0000000
--- a/node_modules/core-js-pure/features/string/ends-with.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/ends-with');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/fixed.js b/node_modules/core-js-pure/features/string/fixed.js
deleted file mode 100644
index c18b823..0000000
--- a/node_modules/core-js-pure/features/string/fixed.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/fixed');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/fontcolor.js b/node_modules/core-js-pure/features/string/fontcolor.js
deleted file mode 100644
index bb30ae6..0000000
--- a/node_modules/core-js-pure/features/string/fontcolor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/fontcolor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/fontsize.js b/node_modules/core-js-pure/features/string/fontsize.js
deleted file mode 100644
index 49060de..0000000
--- a/node_modules/core-js-pure/features/string/fontsize.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/fontsize');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/from-code-point.js b/node_modules/core-js-pure/features/string/from-code-point.js
deleted file mode 100644
index c56ee7c..0000000
--- a/node_modules/core-js-pure/features/string/from-code-point.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/from-code-point');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/includes.js b/node_modules/core-js-pure/features/string/includes.js
deleted file mode 100644
index cf7eea4..0000000
--- a/node_modules/core-js-pure/features/string/includes.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/includes');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/index.js b/node_modules/core-js-pure/features/string/index.js
deleted file mode 100644
index 7c7f167..0000000
--- a/node_modules/core-js-pure/features/string/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var parent = require('../../es/string');
-require('../../modules/esnext.string.at');
-require('../../modules/esnext.string.code-points');
-// TODO: remove from `core-js@4`
-require('../../modules/esnext.string.match-all');
-require('../../modules/esnext.string.replace-all');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/italics.js b/node_modules/core-js-pure/features/string/italics.js
deleted file mode 100644
index 8bee439..0000000
--- a/node_modules/core-js-pure/features/string/italics.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/italics');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/iterator.js b/node_modules/core-js-pure/features/string/iterator.js
deleted file mode 100644
index 64110cc..0000000
--- a/node_modules/core-js-pure/features/string/iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/link.js b/node_modules/core-js-pure/features/string/link.js
deleted file mode 100644
index d507726..0000000
--- a/node_modules/core-js-pure/features/string/link.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/link');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/match-all.js b/node_modules/core-js-pure/features/string/match-all.js
deleted file mode 100644
index 5188e29..0000000
--- a/node_modules/core-js-pure/features/string/match-all.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// TODO: remove from `core-js@4`
-require('../../modules/esnext.string.match-all');
-
-var parent = require('../../es/string/match-all');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/match.js b/node_modules/core-js-pure/features/string/match.js
deleted file mode 100644
index 5b728da..0000000
--- a/node_modules/core-js-pure/features/string/match.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/match');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/pad-end.js b/node_modules/core-js-pure/features/string/pad-end.js
deleted file mode 100644
index 032903c..0000000
--- a/node_modules/core-js-pure/features/string/pad-end.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/pad-end');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/pad-start.js b/node_modules/core-js-pure/features/string/pad-start.js
deleted file mode 100644
index 440785b..0000000
--- a/node_modules/core-js-pure/features/string/pad-start.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/pad-start');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/raw.js b/node_modules/core-js-pure/features/string/raw.js
deleted file mode 100644
index 2ac2b74..0000000
--- a/node_modules/core-js-pure/features/string/raw.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/raw');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/repeat.js b/node_modules/core-js-pure/features/string/repeat.js
deleted file mode 100644
index 6d6848b..0000000
--- a/node_modules/core-js-pure/features/string/repeat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/repeat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/replace-all.js b/node_modules/core-js-pure/features/string/replace-all.js
deleted file mode 100644
index 6de7f51..0000000
--- a/node_modules/core-js-pure/features/string/replace-all.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.string.replace-all');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('String', 'replaceAll');
diff --git a/node_modules/core-js-pure/features/string/replace.js b/node_modules/core-js-pure/features/string/replace.js
deleted file mode 100644
index 48389e6..0000000
--- a/node_modules/core-js-pure/features/string/replace.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/replace');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/search.js b/node_modules/core-js-pure/features/string/search.js
deleted file mode 100644
index aaf356f..0000000
--- a/node_modules/core-js-pure/features/string/search.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/search');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/small.js b/node_modules/core-js-pure/features/string/small.js
deleted file mode 100644
index 47b79e0..0000000
--- a/node_modules/core-js-pure/features/string/small.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/small');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/split.js b/node_modules/core-js-pure/features/string/split.js
deleted file mode 100644
index 5ffbab7..0000000
--- a/node_modules/core-js-pure/features/string/split.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/split');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/starts-with.js b/node_modules/core-js-pure/features/string/starts-with.js
deleted file mode 100644
index f718778..0000000
--- a/node_modules/core-js-pure/features/string/starts-with.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/starts-with');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/strike.js b/node_modules/core-js-pure/features/string/strike.js
deleted file mode 100644
index 6c625c8..0000000
--- a/node_modules/core-js-pure/features/string/strike.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/strike');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/sub.js b/node_modules/core-js-pure/features/string/sub.js
deleted file mode 100644
index a4a66a0..0000000
--- a/node_modules/core-js-pure/features/string/sub.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/sub');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/sup.js b/node_modules/core-js-pure/features/string/sup.js
deleted file mode 100644
index abb1f6a..0000000
--- a/node_modules/core-js-pure/features/string/sup.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/sup');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/trim-end.js b/node_modules/core-js-pure/features/string/trim-end.js
deleted file mode 100644
index 37e8d3f..0000000
--- a/node_modules/core-js-pure/features/string/trim-end.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/trim-end');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/trim-left.js b/node_modules/core-js-pure/features/string/trim-left.js
deleted file mode 100644
index e11e7b7..0000000
--- a/node_modules/core-js-pure/features/string/trim-left.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/trim-left');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/trim-right.js b/node_modules/core-js-pure/features/string/trim-right.js
deleted file mode 100644
index 290f4fd..0000000
--- a/node_modules/core-js-pure/features/string/trim-right.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/trim-right');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/trim-start.js b/node_modules/core-js-pure/features/string/trim-start.js
deleted file mode 100644
index 9698852..0000000
--- a/node_modules/core-js-pure/features/string/trim-start.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/trim-start');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/trim.js b/node_modules/core-js-pure/features/string/trim.js
deleted file mode 100644
index 7a3a3b2..0000000
--- a/node_modules/core-js-pure/features/string/trim.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/trim');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/anchor.js b/node_modules/core-js-pure/features/string/virtual/anchor.js
deleted file mode 100644
index 52f270c..0000000
--- a/node_modules/core-js-pure/features/string/virtual/anchor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/anchor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/at.js b/node_modules/core-js-pure/features/string/virtual/at.js
deleted file mode 100644
index c78ec2c..0000000
--- a/node_modules/core-js-pure/features/string/virtual/at.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/esnext.string.at');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').at;
diff --git a/node_modules/core-js-pure/features/string/virtual/big.js b/node_modules/core-js-pure/features/string/virtual/big.js
deleted file mode 100644
index e2c481b..0000000
--- a/node_modules/core-js-pure/features/string/virtual/big.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/big');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/blink.js b/node_modules/core-js-pure/features/string/virtual/blink.js
deleted file mode 100644
index b804fd6..0000000
--- a/node_modules/core-js-pure/features/string/virtual/blink.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/blink');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/bold.js b/node_modules/core-js-pure/features/string/virtual/bold.js
deleted file mode 100644
index fbe2f42..0000000
--- a/node_modules/core-js-pure/features/string/virtual/bold.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/bold');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/code-point-at.js b/node_modules/core-js-pure/features/string/virtual/code-point-at.js
deleted file mode 100644
index 1a7e0f6..0000000
--- a/node_modules/core-js-pure/features/string/virtual/code-point-at.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/code-point-at');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/code-points.js b/node_modules/core-js-pure/features/string/virtual/code-points.js
deleted file mode 100644
index e990516..0000000
--- a/node_modules/core-js-pure/features/string/virtual/code-points.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../../../modules/esnext.string.code-points');
-
-module.exports = require('../../../internals/entry-virtual')('String').codePoints;
diff --git a/node_modules/core-js-pure/features/string/virtual/ends-with.js b/node_modules/core-js-pure/features/string/virtual/ends-with.js
deleted file mode 100644
index e35b5d0..0000000
--- a/node_modules/core-js-pure/features/string/virtual/ends-with.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/ends-with');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/fixed.js b/node_modules/core-js-pure/features/string/virtual/fixed.js
deleted file mode 100644
index 8c16126..0000000
--- a/node_modules/core-js-pure/features/string/virtual/fixed.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/fixed');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/fontcolor.js b/node_modules/core-js-pure/features/string/virtual/fontcolor.js
deleted file mode 100644
index 5434150..0000000
--- a/node_modules/core-js-pure/features/string/virtual/fontcolor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/fontcolor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/fontsize.js b/node_modules/core-js-pure/features/string/virtual/fontsize.js
deleted file mode 100644
index f4b7144..0000000
--- a/node_modules/core-js-pure/features/string/virtual/fontsize.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/fontsize');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/includes.js b/node_modules/core-js-pure/features/string/virtual/includes.js
deleted file mode 100644
index a6aee44..0000000
--- a/node_modules/core-js-pure/features/string/virtual/includes.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/includes');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/index.js b/node_modules/core-js-pure/features/string/virtual/index.js
deleted file mode 100644
index 5004477..0000000
--- a/node_modules/core-js-pure/features/string/virtual/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var parent = require('../../../es/string/virtual');
-require('../../../modules/esnext.string.at');
-require('../../../modules/esnext.string.code-points');
-// TODO: remove from `core-js@4`
-require('../../../modules/esnext.string.match-all');
-require('../../../modules/esnext.string.replace-all');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/italics.js b/node_modules/core-js-pure/features/string/virtual/italics.js
deleted file mode 100644
index d35da33..0000000
--- a/node_modules/core-js-pure/features/string/virtual/italics.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/italics');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/iterator.js b/node_modules/core-js-pure/features/string/virtual/iterator.js
deleted file mode 100644
index ffdb591..0000000
--- a/node_modules/core-js-pure/features/string/virtual/iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/link.js b/node_modules/core-js-pure/features/string/virtual/link.js
deleted file mode 100644
index 4c0c0cf..0000000
--- a/node_modules/core-js-pure/features/string/virtual/link.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/link');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/match-all.js b/node_modules/core-js-pure/features/string/virtual/match-all.js
deleted file mode 100644
index fb39080..0000000
--- a/node_modules/core-js-pure/features/string/virtual/match-all.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// TODO: remove from `core-js@4`
-require('../../../modules/esnext.string.match-all');
-
-var parent = require('../../../es/string/virtual/match-all');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/pad-end.js b/node_modules/core-js-pure/features/string/virtual/pad-end.js
deleted file mode 100644
index f1dcdf3..0000000
--- a/node_modules/core-js-pure/features/string/virtual/pad-end.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/pad-end');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/pad-start.js b/node_modules/core-js-pure/features/string/virtual/pad-start.js
deleted file mode 100644
index 1e2afbc..0000000
--- a/node_modules/core-js-pure/features/string/virtual/pad-start.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/pad-start');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/repeat.js b/node_modules/core-js-pure/features/string/virtual/repeat.js
deleted file mode 100644
index b8db5fc..0000000
--- a/node_modules/core-js-pure/features/string/virtual/repeat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/repeat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/replace-all.js b/node_modules/core-js-pure/features/string/virtual/replace-all.js
deleted file mode 100644
index 781f261..0000000
--- a/node_modules/core-js-pure/features/string/virtual/replace-all.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../../modules/esnext.string.replace-all');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').replaceAll;
diff --git a/node_modules/core-js-pure/features/string/virtual/small.js b/node_modules/core-js-pure/features/string/virtual/small.js
deleted file mode 100644
index 1dd357b..0000000
--- a/node_modules/core-js-pure/features/string/virtual/small.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/small');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/starts-with.js b/node_modules/core-js-pure/features/string/virtual/starts-with.js
deleted file mode 100644
index 9a9145d..0000000
--- a/node_modules/core-js-pure/features/string/virtual/starts-with.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/starts-with');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/strike.js b/node_modules/core-js-pure/features/string/virtual/strike.js
deleted file mode 100644
index 4aa28cc..0000000
--- a/node_modules/core-js-pure/features/string/virtual/strike.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/strike');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/sub.js b/node_modules/core-js-pure/features/string/virtual/sub.js
deleted file mode 100644
index a1b2c3a..0000000
--- a/node_modules/core-js-pure/features/string/virtual/sub.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/sub');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/sup.js b/node_modules/core-js-pure/features/string/virtual/sup.js
deleted file mode 100644
index dc604fe..0000000
--- a/node_modules/core-js-pure/features/string/virtual/sup.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/sup');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/trim-end.js b/node_modules/core-js-pure/features/string/virtual/trim-end.js
deleted file mode 100644
index 04e5ad9..0000000
--- a/node_modules/core-js-pure/features/string/virtual/trim-end.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/trim-end');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/trim-left.js b/node_modules/core-js-pure/features/string/virtual/trim-left.js
deleted file mode 100644
index 571fb01..0000000
--- a/node_modules/core-js-pure/features/string/virtual/trim-left.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/trim-left');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/trim-right.js b/node_modules/core-js-pure/features/string/virtual/trim-right.js
deleted file mode 100644
index aab8b09..0000000
--- a/node_modules/core-js-pure/features/string/virtual/trim-right.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/trim-right');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/trim-start.js b/node_modules/core-js-pure/features/string/virtual/trim-start.js
deleted file mode 100644
index c7fd1b2..0000000
--- a/node_modules/core-js-pure/features/string/virtual/trim-start.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/trim-start');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/string/virtual/trim.js b/node_modules/core-js-pure/features/string/virtual/trim.js
deleted file mode 100644
index d95c2e1..0000000
--- a/node_modules/core-js-pure/features/string/virtual/trim.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/trim');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/async-dispose.js b/node_modules/core-js-pure/features/symbol/async-dispose.js
deleted file mode 100644
index 195abe1..0000000
--- a/node_modules/core-js-pure/features/symbol/async-dispose.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.symbol.async-dispose');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('asyncDispose');
diff --git a/node_modules/core-js-pure/features/symbol/async-iterator.js b/node_modules/core-js-pure/features/symbol/async-iterator.js
deleted file mode 100644
index a624329..0000000
--- a/node_modules/core-js-pure/features/symbol/async-iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/async-iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/description.js b/node_modules/core-js-pure/features/symbol/description.js
deleted file mode 100644
index 7bb4b2b..0000000
--- a/node_modules/core-js-pure/features/symbol/description.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.symbol.description');
diff --git a/node_modules/core-js-pure/features/symbol/dispose.js b/node_modules/core-js-pure/features/symbol/dispose.js
deleted file mode 100644
index 71a4d50..0000000
--- a/node_modules/core-js-pure/features/symbol/dispose.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.symbol.dispose');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('dispose');
diff --git a/node_modules/core-js-pure/features/symbol/for.js b/node_modules/core-js-pure/features/symbol/for.js
deleted file mode 100644
index 28b29ae..0000000
--- a/node_modules/core-js-pure/features/symbol/for.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/for');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/has-instance.js b/node_modules/core-js-pure/features/symbol/has-instance.js
deleted file mode 100644
index 0334558..0000000
--- a/node_modules/core-js-pure/features/symbol/has-instance.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/has-instance');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/index.js b/node_modules/core-js-pure/features/symbol/index.js
deleted file mode 100644
index 36b052a..0000000
--- a/node_modules/core-js-pure/features/symbol/index.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var parent = require('../../es/symbol');
-require('../../modules/esnext.symbol.async-dispose');
-require('../../modules/esnext.symbol.dispose');
-require('../../modules/esnext.symbol.observable');
-require('../../modules/esnext.symbol.pattern-match');
-// TODO: Remove from `core-js@4`
-require('../../modules/esnext.symbol.replace-all');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/is-concat-spreadable.js b/node_modules/core-js-pure/features/symbol/is-concat-spreadable.js
deleted file mode 100644
index 7dc1d26..0000000
--- a/node_modules/core-js-pure/features/symbol/is-concat-spreadable.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/is-concat-spreadable');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/iterator.js b/node_modules/core-js-pure/features/symbol/iterator.js
deleted file mode 100644
index 78f0139..0000000
--- a/node_modules/core-js-pure/features/symbol/iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/key-for.js b/node_modules/core-js-pure/features/symbol/key-for.js
deleted file mode 100644
index 4f76f82..0000000
--- a/node_modules/core-js-pure/features/symbol/key-for.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/key-for');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/match-all.js b/node_modules/core-js-pure/features/symbol/match-all.js
deleted file mode 100644
index 6be4444..0000000
--- a/node_modules/core-js-pure/features/symbol/match-all.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/match-all');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/match.js b/node_modules/core-js-pure/features/symbol/match.js
deleted file mode 100644
index 2a502e4..0000000
--- a/node_modules/core-js-pure/features/symbol/match.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/match');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/observable.js b/node_modules/core-js-pure/features/symbol/observable.js
deleted file mode 100644
index f1fa6cb..0000000
--- a/node_modules/core-js-pure/features/symbol/observable.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.symbol.observable');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('observable');
diff --git a/node_modules/core-js-pure/features/symbol/pattern-match.js b/node_modules/core-js-pure/features/symbol/pattern-match.js
deleted file mode 100644
index 98ffbb0..0000000
--- a/node_modules/core-js-pure/features/symbol/pattern-match.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/esnext.symbol.pattern-match');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('patternMatch');
diff --git a/node_modules/core-js-pure/features/symbol/replace-all.js b/node_modules/core-js-pure/features/symbol/replace-all.js
deleted file mode 100644
index 011b117..0000000
--- a/node_modules/core-js-pure/features/symbol/replace-all.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// TODO: Remove from `core-js@4`
-require('../../modules/esnext.symbol.replace-all');
-var WrappedWellKnownSymbolModule = require('../../internals/well-known-symbol-wrapped');
-
-module.exports = WrappedWellKnownSymbolModule.f('replaceAll');
diff --git a/node_modules/core-js-pure/features/symbol/replace.js b/node_modules/core-js-pure/features/symbol/replace.js
deleted file mode 100644
index 225f7fe..0000000
--- a/node_modules/core-js-pure/features/symbol/replace.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/replace');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/search.js b/node_modules/core-js-pure/features/symbol/search.js
deleted file mode 100644
index dd25b55..0000000
--- a/node_modules/core-js-pure/features/symbol/search.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/search');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/species.js b/node_modules/core-js-pure/features/symbol/species.js
deleted file mode 100644
index 6d3c418..0000000
--- a/node_modules/core-js-pure/features/symbol/species.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/species');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/split.js b/node_modules/core-js-pure/features/symbol/split.js
deleted file mode 100644
index 209b212..0000000
--- a/node_modules/core-js-pure/features/symbol/split.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/split');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/to-primitive.js b/node_modules/core-js-pure/features/symbol/to-primitive.js
deleted file mode 100644
index cd15ff5..0000000
--- a/node_modules/core-js-pure/features/symbol/to-primitive.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/to-primitive');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/to-string-tag.js b/node_modules/core-js-pure/features/symbol/to-string-tag.js
deleted file mode 100644
index 6948350..0000000
--- a/node_modules/core-js-pure/features/symbol/to-string-tag.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/to-string-tag');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/symbol/unscopables.js b/node_modules/core-js-pure/features/symbol/unscopables.js
deleted file mode 100644
index a9d7820..0000000
--- a/node_modules/core-js-pure/features/symbol/unscopables.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/unscopables');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/typed-array/copy-within.js b/node_modules/core-js-pure/features/typed-array/copy-within.js
deleted file mode 100644
index 1352cec..0000000
--- a/node_modules/core-js-pure/features/typed-array/copy-within.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.copy-within');
diff --git a/node_modules/core-js-pure/features/typed-array/entries.js b/node_modules/core-js-pure/features/typed-array/entries.js
deleted file mode 100644
index 66cc6dc..0000000
--- a/node_modules/core-js-pure/features/typed-array/entries.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.iterator');
diff --git a/node_modules/core-js-pure/features/typed-array/every.js b/node_modules/core-js-pure/features/typed-array/every.js
deleted file mode 100644
index 681164b..0000000
--- a/node_modules/core-js-pure/features/typed-array/every.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.every');
diff --git a/node_modules/core-js-pure/features/typed-array/fill.js b/node_modules/core-js-pure/features/typed-array/fill.js
deleted file mode 100644
index 4d92ac6..0000000
--- a/node_modules/core-js-pure/features/typed-array/fill.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.fill');
diff --git a/node_modules/core-js-pure/features/typed-array/filter.js b/node_modules/core-js-pure/features/typed-array/filter.js
deleted file mode 100644
index 7d0a630..0000000
--- a/node_modules/core-js-pure/features/typed-array/filter.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.filter');
diff --git a/node_modules/core-js-pure/features/typed-array/find-index.js b/node_modules/core-js-pure/features/typed-array/find-index.js
deleted file mode 100644
index 039cd5e..0000000
--- a/node_modules/core-js-pure/features/typed-array/find-index.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.find-index');
diff --git a/node_modules/core-js-pure/features/typed-array/find.js b/node_modules/core-js-pure/features/typed-array/find.js
deleted file mode 100644
index b3251b9..0000000
--- a/node_modules/core-js-pure/features/typed-array/find.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.find');
diff --git a/node_modules/core-js-pure/features/typed-array/float32-array.js b/node_modules/core-js-pure/features/typed-array/float32-array.js
deleted file mode 100644
index c16ee63..0000000
--- a/node_modules/core-js-pure/features/typed-array/float32-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/float32-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/typed-array/float64-array.js b/node_modules/core-js-pure/features/typed-array/float64-array.js
deleted file mode 100644
index 445dc3d..0000000
--- a/node_modules/core-js-pure/features/typed-array/float64-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/float64-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/typed-array/for-each.js b/node_modules/core-js-pure/features/typed-array/for-each.js
deleted file mode 100644
index defe03a..0000000
--- a/node_modules/core-js-pure/features/typed-array/for-each.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.for-each');
diff --git a/node_modules/core-js-pure/features/typed-array/from.js b/node_modules/core-js-pure/features/typed-array/from.js
deleted file mode 100644
index e0f3444..0000000
--- a/node_modules/core-js-pure/features/typed-array/from.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.from');
diff --git a/node_modules/core-js-pure/features/typed-array/includes.js b/node_modules/core-js-pure/features/typed-array/includes.js
deleted file mode 100644
index 5ff65f9..0000000
--- a/node_modules/core-js-pure/features/typed-array/includes.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.includes');
diff --git a/node_modules/core-js-pure/features/typed-array/index-of.js b/node_modules/core-js-pure/features/typed-array/index-of.js
deleted file mode 100644
index 87081c0..0000000
--- a/node_modules/core-js-pure/features/typed-array/index-of.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.index-of');
diff --git a/node_modules/core-js-pure/features/typed-array/index.js b/node_modules/core-js-pure/features/typed-array/index.js
deleted file mode 100644
index 20a271d..0000000
--- a/node_modules/core-js-pure/features/typed-array/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/typed-array/int16-array.js b/node_modules/core-js-pure/features/typed-array/int16-array.js
deleted file mode 100644
index 7ffdbae..0000000
--- a/node_modules/core-js-pure/features/typed-array/int16-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/int16-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/typed-array/int32-array.js b/node_modules/core-js-pure/features/typed-array/int32-array.js
deleted file mode 100644
index bd2e75a..0000000
--- a/node_modules/core-js-pure/features/typed-array/int32-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/int32-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/typed-array/int8-array.js b/node_modules/core-js-pure/features/typed-array/int8-array.js
deleted file mode 100644
index 8f1a54b..0000000
--- a/node_modules/core-js-pure/features/typed-array/int8-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/int8-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/typed-array/iterator.js b/node_modules/core-js-pure/features/typed-array/iterator.js
deleted file mode 100644
index 66cc6dc..0000000
--- a/node_modules/core-js-pure/features/typed-array/iterator.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.iterator');
diff --git a/node_modules/core-js-pure/features/typed-array/join.js b/node_modules/core-js-pure/features/typed-array/join.js
deleted file mode 100644
index 431129c..0000000
--- a/node_modules/core-js-pure/features/typed-array/join.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.join');
diff --git a/node_modules/core-js-pure/features/typed-array/keys.js b/node_modules/core-js-pure/features/typed-array/keys.js
deleted file mode 100644
index 66cc6dc..0000000
--- a/node_modules/core-js-pure/features/typed-array/keys.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.iterator');
diff --git a/node_modules/core-js-pure/features/typed-array/last-index-of.js b/node_modules/core-js-pure/features/typed-array/last-index-of.js
deleted file mode 100644
index 5682bf4..0000000
--- a/node_modules/core-js-pure/features/typed-array/last-index-of.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.last-index-of');
diff --git a/node_modules/core-js-pure/features/typed-array/map.js b/node_modules/core-js-pure/features/typed-array/map.js
deleted file mode 100644
index db08fed..0000000
--- a/node_modules/core-js-pure/features/typed-array/map.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.map');
diff --git a/node_modules/core-js-pure/features/typed-array/of.js b/node_modules/core-js-pure/features/typed-array/of.js
deleted file mode 100644
index 121bf5e..0000000
--- a/node_modules/core-js-pure/features/typed-array/of.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.of');
diff --git a/node_modules/core-js-pure/features/typed-array/reduce-right.js b/node_modules/core-js-pure/features/typed-array/reduce-right.js
deleted file mode 100644
index cbd321f..0000000
--- a/node_modules/core-js-pure/features/typed-array/reduce-right.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.reduce-right');
diff --git a/node_modules/core-js-pure/features/typed-array/reduce.js b/node_modules/core-js-pure/features/typed-array/reduce.js
deleted file mode 100644
index e2a6f28..0000000
--- a/node_modules/core-js-pure/features/typed-array/reduce.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.reduce');
diff --git a/node_modules/core-js-pure/features/typed-array/reverse.js b/node_modules/core-js-pure/features/typed-array/reverse.js
deleted file mode 100644
index 14995f4..0000000
--- a/node_modules/core-js-pure/features/typed-array/reverse.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.reverse');
diff --git a/node_modules/core-js-pure/features/typed-array/set.js b/node_modules/core-js-pure/features/typed-array/set.js
deleted file mode 100644
index 5330e22..0000000
--- a/node_modules/core-js-pure/features/typed-array/set.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.set');
diff --git a/node_modules/core-js-pure/features/typed-array/slice.js b/node_modules/core-js-pure/features/typed-array/slice.js
deleted file mode 100644
index 37fb8c1..0000000
--- a/node_modules/core-js-pure/features/typed-array/slice.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.slice');
diff --git a/node_modules/core-js-pure/features/typed-array/some.js b/node_modules/core-js-pure/features/typed-array/some.js
deleted file mode 100644
index 495c322..0000000
--- a/node_modules/core-js-pure/features/typed-array/some.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.some');
diff --git a/node_modules/core-js-pure/features/typed-array/sort.js b/node_modules/core-js-pure/features/typed-array/sort.js
deleted file mode 100644
index d6c7e30..0000000
--- a/node_modules/core-js-pure/features/typed-array/sort.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.sort');
diff --git a/node_modules/core-js-pure/features/typed-array/subarray.js b/node_modules/core-js-pure/features/typed-array/subarray.js
deleted file mode 100644
index dbad4ca..0000000
--- a/node_modules/core-js-pure/features/typed-array/subarray.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.subarray');
diff --git a/node_modules/core-js-pure/features/typed-array/to-locale-string.js b/node_modules/core-js-pure/features/typed-array/to-locale-string.js
deleted file mode 100644
index 12c809e..0000000
--- a/node_modules/core-js-pure/features/typed-array/to-locale-string.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.to-locale-string');
diff --git a/node_modules/core-js-pure/features/typed-array/to-string.js b/node_modules/core-js-pure/features/typed-array/to-string.js
deleted file mode 100644
index bf94160..0000000
--- a/node_modules/core-js-pure/features/typed-array/to-string.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.to-string');
diff --git a/node_modules/core-js-pure/features/typed-array/uint16-array.js b/node_modules/core-js-pure/features/typed-array/uint16-array.js
deleted file mode 100644
index f35dc05..0000000
--- a/node_modules/core-js-pure/features/typed-array/uint16-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/uint16-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/typed-array/uint32-array.js b/node_modules/core-js-pure/features/typed-array/uint32-array.js
deleted file mode 100644
index 197c8de..0000000
--- a/node_modules/core-js-pure/features/typed-array/uint32-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/uint32-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/typed-array/uint8-array.js b/node_modules/core-js-pure/features/typed-array/uint8-array.js
deleted file mode 100644
index 7d853e4..0000000
--- a/node_modules/core-js-pure/features/typed-array/uint8-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/uint8-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/typed-array/uint8-clamped-array.js b/node_modules/core-js-pure/features/typed-array/uint8-clamped-array.js
deleted file mode 100644
index a1e131c..0000000
--- a/node_modules/core-js-pure/features/typed-array/uint8-clamped-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/uint8-clamped-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/typed-array/values.js b/node_modules/core-js-pure/features/typed-array/values.js
deleted file mode 100644
index 66cc6dc..0000000
--- a/node_modules/core-js-pure/features/typed-array/values.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.iterator');
diff --git a/node_modules/core-js-pure/features/url-search-params/index.js b/node_modules/core-js-pure/features/url-search-params/index.js
deleted file mode 100644
index 46c415b..0000000
--- a/node_modules/core-js-pure/features/url-search-params/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../stable/url-search-params');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/url/index.js b/node_modules/core-js-pure/features/url/index.js
deleted file mode 100644
index fa902af..0000000
--- a/node_modules/core-js-pure/features/url/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../stable/url');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/url/to-json.js b/node_modules/core-js-pure/features/url/to-json.js
deleted file mode 100644
index e7cafe8..0000000
--- a/node_modules/core-js-pure/features/url/to-json.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../stable/url/to-json');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/weak-map/delete-all.js b/node_modules/core-js-pure/features/weak-map/delete-all.js
deleted file mode 100644
index 00163f2..0000000
--- a/node_modules/core-js-pure/features/weak-map/delete-all.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.weak-map');
-require('../../modules/esnext.weak-map.delete-all');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('WeakMap', 'deleteAll');
diff --git a/node_modules/core-js-pure/features/weak-map/from.js b/node_modules/core-js-pure/features/weak-map/from.js
deleted file mode 100644
index 159aecd..0000000
--- a/node_modules/core-js-pure/features/weak-map/from.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-require('../../modules/es.string.iterator');
-require('../../modules/es.weak-map');
-require('../../modules/esnext.weak-map.from');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-var WeakMap = path.WeakMap;
-var weakMapFrom = WeakMap.from;
-
-module.exports = function from(source, mapFn, thisArg) {
-  return weakMapFrom.call(typeof this === 'function' ? this : WeakMap, source, mapFn, thisArg);
-};
diff --git a/node_modules/core-js-pure/features/weak-map/index.js b/node_modules/core-js-pure/features/weak-map/index.js
deleted file mode 100644
index ce5f384..0000000
--- a/node_modules/core-js-pure/features/weak-map/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var parent = require('../../es/weak-map');
-require('../../modules/esnext.weak-map.from');
-require('../../modules/esnext.weak-map.of');
-require('../../modules/esnext.weak-map.delete-all');
-require('../../modules/esnext.weak-map.upsert');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/weak-map/of.js b/node_modules/core-js-pure/features/weak-map/of.js
deleted file mode 100644
index 5bdf627..0000000
--- a/node_modules/core-js-pure/features/weak-map/of.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-require('../../modules/es.string.iterator');
-require('../../modules/es.weak-map');
-require('../../modules/esnext.weak-map.of');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-var WeakMap = path.WeakMap;
-var weakMapOf = WeakMap.of;
-
-module.exports = function of() {
-  return weakMapOf.apply(typeof this === 'function' ? this : WeakMap, arguments);
-};
diff --git a/node_modules/core-js-pure/features/weak-map/upsert.js b/node_modules/core-js-pure/features/weak-map/upsert.js
deleted file mode 100644
index 509f9ed..0000000
--- a/node_modules/core-js-pure/features/weak-map/upsert.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.weak-map');
-require('../../modules/esnext.weak-map.upsert');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('WeakMap', 'upsert');
diff --git a/node_modules/core-js-pure/features/weak-set/add-all.js b/node_modules/core-js-pure/features/weak-set/add-all.js
deleted file mode 100644
index cf76242..0000000
--- a/node_modules/core-js-pure/features/weak-set/add-all.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.weak-set');
-require('../../modules/esnext.weak-set.add-all');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('WeakSet', 'addAll');
diff --git a/node_modules/core-js-pure/features/weak-set/delete-all.js b/node_modules/core-js-pure/features/weak-set/delete-all.js
deleted file mode 100644
index 21e7b43..0000000
--- a/node_modules/core-js-pure/features/weak-set/delete-all.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/es.weak-set');
-require('../../modules/esnext.weak-set.delete-all');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('WeakSet', 'deleteAll');
diff --git a/node_modules/core-js-pure/features/weak-set/from.js b/node_modules/core-js-pure/features/weak-set/from.js
deleted file mode 100644
index cd8716a..0000000
--- a/node_modules/core-js-pure/features/weak-set/from.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-require('../../modules/es.string.iterator');
-require('../../modules/es.weak-set');
-require('../../modules/esnext.weak-set.from');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-var WeakSet = path.WeakSet;
-var weakSetfrom = WeakSet.from;
-
-module.exports = function from(source, mapFn, thisArg) {
-  return weakSetfrom.call(typeof this === 'function' ? this : WeakSet, source, mapFn, thisArg);
-};
diff --git a/node_modules/core-js-pure/features/weak-set/index.js b/node_modules/core-js-pure/features/weak-set/index.js
deleted file mode 100644
index 00ab5e0..0000000
--- a/node_modules/core-js-pure/features/weak-set/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var parent = require('../../es/weak-set');
-require('../../modules/esnext.weak-set.add-all');
-require('../../modules/esnext.weak-set.delete-all');
-require('../../modules/esnext.weak-set.from');
-require('../../modules/esnext.weak-set.of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/features/weak-set/of.js b/node_modules/core-js-pure/features/weak-set/of.js
deleted file mode 100644
index 4937c39..0000000
--- a/node_modules/core-js-pure/features/weak-set/of.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-require('../../modules/es.string.iterator');
-require('../../modules/es.weak-set');
-require('../../modules/esnext.weak-set.of');
-require('../../modules/web.dom-collections.iterator');
-var path = require('../../internals/path');
-
-var WeakSet = path.WeakSet;
-var weakSetOf = WeakSet.of;
-
-module.exports = function of() {
-  return weakSetOf.apply(typeof this === 'function' ? this : WeakSet, arguments);
-};
diff --git a/node_modules/core-js-pure/index.js b/node_modules/core-js-pure/index.js
deleted file mode 100644
index 10f0e3f..0000000
--- a/node_modules/core-js-pure/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('./es');
-require('./proposals');
-require('./web');
-var path = require('./internals/path');
-
-module.exports = path;
diff --git a/node_modules/core-js-pure/internals/README.md b/node_modules/core-js-pure/internals/README.md
deleted file mode 100644
index f5cca30..0000000
--- a/node_modules/core-js-pure/internals/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This folder contains internal parts of `core-js` like helpers.
diff --git a/node_modules/core-js-pure/internals/a-function.js b/node_modules/core-js-pure/internals/a-function.js
deleted file mode 100644
index b597471..0000000
--- a/node_modules/core-js-pure/internals/a-function.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = function (it) {
-  if (typeof it != 'function') {
-    throw TypeError(String(it) + ' is not a function');
-  } return it;
-};
diff --git a/node_modules/core-js-pure/internals/a-possible-prototype.js b/node_modules/core-js-pure/internals/a-possible-prototype.js
deleted file mode 100644
index 7736376..0000000
--- a/node_modules/core-js-pure/internals/a-possible-prototype.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var isObject = require('../internals/is-object');
-
-module.exports = function (it) {
-  if (!isObject(it) && it !== null) {
-    throw TypeError("Can't set " + String(it) + ' as a prototype');
-  } return it;
-};
diff --git a/node_modules/core-js-pure/internals/add-to-unscopables.js b/node_modules/core-js-pure/internals/add-to-unscopables.js
deleted file mode 100644
index 02ef44b..0000000
--- a/node_modules/core-js-pure/internals/add-to-unscopables.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = function () { /* empty */ };
diff --git a/node_modules/core-js-pure/internals/advance-string-index.js b/node_modules/core-js-pure/internals/advance-string-index.js
deleted file mode 100644
index 700fbf0..0000000
--- a/node_modules/core-js-pure/internals/advance-string-index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-'use strict';
-var charAt = require('../internals/string-multibyte').charAt;
-
-// `AdvanceStringIndex` abstract operation
-// https://tc39.github.io/ecma262/#sec-advancestringindex
-module.exports = function (S, index, unicode) {
-  return index + (unicode ? charAt(S, index).length : 1);
-};
diff --git a/node_modules/core-js-pure/internals/an-instance.js b/node_modules/core-js-pure/internals/an-instance.js
deleted file mode 100644
index 6f471cc..0000000
--- a/node_modules/core-js-pure/internals/an-instance.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = function (it, Constructor, name) {
-  if (!(it instanceof Constructor)) {
-    throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');
-  } return it;
-};
diff --git a/node_modules/core-js-pure/internals/an-object.js b/node_modules/core-js-pure/internals/an-object.js
deleted file mode 100644
index 4055796..0000000
--- a/node_modules/core-js-pure/internals/an-object.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var isObject = require('../internals/is-object');
-
-module.exports = function (it) {
-  if (!isObject(it)) {
-    throw TypeError(String(it) + ' is not an object');
-  } return it;
-};
diff --git a/node_modules/core-js-pure/internals/array-buffer-native.js b/node_modules/core-js-pure/internals/array-buffer-native.js
deleted file mode 100644
index 36da2d7..0000000
--- a/node_modules/core-js-pure/internals/array-buffer-native.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';
diff --git a/node_modules/core-js-pure/internals/array-buffer-view-core.js b/node_modules/core-js-pure/internals/array-buffer-view-core.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/internals/array-buffer-view-core.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/internals/array-buffer.js b/node_modules/core-js-pure/internals/array-buffer.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/internals/array-buffer.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/internals/array-copy-within.js b/node_modules/core-js-pure/internals/array-copy-within.js
deleted file mode 100644
index 70c8edb..0000000
--- a/node_modules/core-js-pure/internals/array-copy-within.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-var toObject = require('../internals/to-object');
-var toAbsoluteIndex = require('../internals/to-absolute-index');
-var toLength = require('../internals/to-length');
-
-var min = Math.min;
-
-// `Array.prototype.copyWithin` method implementation
-// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin
-module.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {
-  var O = toObject(this);
-  var len = toLength(O.length);
-  var to = toAbsoluteIndex(target, len);
-  var from = toAbsoluteIndex(start, len);
-  var end = arguments.length > 2 ? arguments[2] : undefined;
-  var count = min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);
-  var inc = 1;
-  if (from < to && to < from + count) {
-    inc = -1;
-    from += count - 1;
-    to += count - 1;
-  }
-  while (count-- > 0) {
-    if (from in O) O[to] = O[from];
-    else delete O[to];
-    to += inc;
-    from += inc;
-  } return O;
-};
diff --git a/node_modules/core-js-pure/internals/array-fill.js b/node_modules/core-js-pure/internals/array-fill.js
deleted file mode 100644
index 7c15a04..0000000
--- a/node_modules/core-js-pure/internals/array-fill.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-var toObject = require('../internals/to-object');
-var toAbsoluteIndex = require('../internals/to-absolute-index');
-var toLength = require('../internals/to-length');
-
-// `Array.prototype.fill` method implementation
-// https://tc39.github.io/ecma262/#sec-array.prototype.fill
-module.exports = function fill(value /* , start = 0, end = @length */) {
-  var O = toObject(this);
-  var length = toLength(O.length);
-  var argumentsLength = arguments.length;
-  var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);
-  var end = argumentsLength > 2 ? arguments[2] : undefined;
-  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);
-  while (endPos > index) O[index++] = value;
-  return O;
-};
diff --git a/node_modules/core-js-pure/internals/array-for-each.js b/node_modules/core-js-pure/internals/array-for-each.js
deleted file mode 100644
index d8872db..0000000
--- a/node_modules/core-js-pure/internals/array-for-each.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-var $forEach = require('../internals/array-iteration').forEach;
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var STRICT_METHOD = arrayMethodIsStrict('forEach');
-var USES_TO_LENGTH = arrayMethodUsesToLength('forEach');
-
-// `Array.prototype.forEach` method implementation
-// https://tc39.github.io/ecma262/#sec-array.prototype.foreach
-module.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {
-  return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
-} : [].forEach;
diff --git a/node_modules/core-js-pure/internals/array-from.js b/node_modules/core-js-pure/internals/array-from.js
deleted file mode 100644
index 490a3c2..0000000
--- a/node_modules/core-js-pure/internals/array-from.js
+++ /dev/null
@@ -1,41 +0,0 @@
-'use strict';
-var bind = require('../internals/function-bind-context');
-var toObject = require('../internals/to-object');
-var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');
-var isArrayIteratorMethod = require('../internals/is-array-iterator-method');
-var toLength = require('../internals/to-length');
-var createProperty = require('../internals/create-property');
-var getIteratorMethod = require('../internals/get-iterator-method');
-
-// `Array.from` method implementation
-// https://tc39.github.io/ecma262/#sec-array.from
-module.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
-  var O = toObject(arrayLike);
-  var C = typeof this == 'function' ? this : Array;
-  var argumentsLength = arguments.length;
-  var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
-  var mapping = mapfn !== undefined;
-  var iteratorMethod = getIteratorMethod(O);
-  var index = 0;
-  var length, result, step, iterator, next, value;
-  if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);
-  // if the target is not iterable or it's an array with the default iterator - use a simple case
-  if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {
-    iterator = iteratorMethod.call(O);
-    next = iterator.next;
-    result = new C();
-    for (;!(step = next.call(iterator)).done; index++) {
-      value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;
-      createProperty(result, index, value);
-    }
-  } else {
-    length = toLength(O.length);
-    result = new C(length);
-    for (;length > index; index++) {
-      value = mapping ? mapfn(O[index], index) : O[index];
-      createProperty(result, index, value);
-    }
-  }
-  result.length = index;
-  return result;
-};
diff --git a/node_modules/core-js-pure/internals/array-includes.js b/node_modules/core-js-pure/internals/array-includes.js
deleted file mode 100644
index a416120..0000000
--- a/node_modules/core-js-pure/internals/array-includes.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var toIndexedObject = require('../internals/to-indexed-object');
-var toLength = require('../internals/to-length');
-var toAbsoluteIndex = require('../internals/to-absolute-index');
-
-// `Array.prototype.{ indexOf, includes }` methods implementation
-var createMethod = function (IS_INCLUDES) {
-  return function ($this, el, fromIndex) {
-    var O = toIndexedObject($this);
-    var length = toLength(O.length);
-    var index = toAbsoluteIndex(fromIndex, length);
-    var value;
-    // Array#includes uses SameValueZero equality algorithm
-    // eslint-disable-next-line no-self-compare
-    if (IS_INCLUDES && el != el) while (length > index) {
-      value = O[index++];
-      // eslint-disable-next-line no-self-compare
-      if (value != value) return true;
-    // Array#indexOf ignores holes, Array#includes - not
-    } else for (;length > index; index++) {
-      if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;
-    } return !IS_INCLUDES && -1;
-  };
-};
-
-module.exports = {
-  // `Array.prototype.includes` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.includes
-  includes: createMethod(true),
-  // `Array.prototype.indexOf` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.indexof
-  indexOf: createMethod(false)
-};
diff --git a/node_modules/core-js-pure/internals/array-iteration.js b/node_modules/core-js-pure/internals/array-iteration.js
deleted file mode 100644
index 8014dac..0000000
--- a/node_modules/core-js-pure/internals/array-iteration.js
+++ /dev/null
@@ -1,65 +0,0 @@
-var bind = require('../internals/function-bind-context');
-var IndexedObject = require('../internals/indexed-object');
-var toObject = require('../internals/to-object');
-var toLength = require('../internals/to-length');
-var arraySpeciesCreate = require('../internals/array-species-create');
-
-var push = [].push;
-
-// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation
-var createMethod = function (TYPE) {
-  var IS_MAP = TYPE == 1;
-  var IS_FILTER = TYPE == 2;
-  var IS_SOME = TYPE == 3;
-  var IS_EVERY = TYPE == 4;
-  var IS_FIND_INDEX = TYPE == 6;
-  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
-  return function ($this, callbackfn, that, specificCreate) {
-    var O = toObject($this);
-    var self = IndexedObject(O);
-    var boundFunction = bind(callbackfn, that, 3);
-    var length = toLength(self.length);
-    var index = 0;
-    var create = specificCreate || arraySpeciesCreate;
-    var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
-    var value, result;
-    for (;length > index; index++) if (NO_HOLES || index in self) {
-      value = self[index];
-      result = boundFunction(value, index, O);
-      if (TYPE) {
-        if (IS_MAP) target[index] = result; // map
-        else if (result) switch (TYPE) {
-          case 3: return true;              // some
-          case 5: return value;             // find
-          case 6: return index;             // findIndex
-          case 2: push.call(target, value); // filter
-        } else if (IS_EVERY) return false;  // every
-      }
-    }
-    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;
-  };
-};
-
-module.exports = {
-  // `Array.prototype.forEach` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.foreach
-  forEach: createMethod(0),
-  // `Array.prototype.map` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.map
-  map: createMethod(1),
-  // `Array.prototype.filter` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.filter
-  filter: createMethod(2),
-  // `Array.prototype.some` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.some
-  some: createMethod(3),
-  // `Array.prototype.every` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.every
-  every: createMethod(4),
-  // `Array.prototype.find` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.find
-  find: createMethod(5),
-  // `Array.prototype.findIndex` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex
-  findIndex: createMethod(6)
-};
diff --git a/node_modules/core-js-pure/internals/array-last-index-of.js b/node_modules/core-js-pure/internals/array-last-index-of.js
deleted file mode 100644
index 8d1c93c..0000000
--- a/node_modules/core-js-pure/internals/array-last-index-of.js
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict';
-var toIndexedObject = require('../internals/to-indexed-object');
-var toInteger = require('../internals/to-integer');
-var toLength = require('../internals/to-length');
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var min = Math.min;
-var nativeLastIndexOf = [].lastIndexOf;
-var NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;
-var STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');
-// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method
-var USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });
-var FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH;
-
-// `Array.prototype.lastIndexOf` method implementation
-// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof
-module.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {
-  // convert -0 to +0
-  if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;
-  var O = toIndexedObject(this);
-  var length = toLength(O.length);
-  var index = length - 1;
-  if (arguments.length > 1) index = min(index, toInteger(arguments[1]));
-  if (index < 0) index = length + index;
-  for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;
-  return -1;
-} : nativeLastIndexOf;
diff --git a/node_modules/core-js-pure/internals/array-method-has-species-support.js b/node_modules/core-js-pure/internals/array-method-has-species-support.js
deleted file mode 100644
index 0d5d380..0000000
--- a/node_modules/core-js-pure/internals/array-method-has-species-support.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var fails = require('../internals/fails');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var V8_VERSION = require('../internals/engine-v8-version');
-
-var SPECIES = wellKnownSymbol('species');
-
-module.exports = function (METHOD_NAME) {
-  // We can't use this feature detection in V8 since it causes
-  // deoptimization and serious performance degradation
-  // https://github.com/zloirock/core-js/issues/677
-  return V8_VERSION >= 51 || !fails(function () {
-    var array = [];
-    var constructor = array.constructor = {};
-    constructor[SPECIES] = function () {
-      return { foo: 1 };
-    };
-    return array[METHOD_NAME](Boolean).foo !== 1;
-  });
-};
diff --git a/node_modules/core-js-pure/internals/array-method-is-strict.js b/node_modules/core-js-pure/internals/array-method-is-strict.js
deleted file mode 100644
index 8ea8df0..0000000
--- a/node_modules/core-js-pure/internals/array-method-is-strict.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-var fails = require('../internals/fails');
-
-module.exports = function (METHOD_NAME, argument) {
-  var method = [][METHOD_NAME];
-  return !!method && fails(function () {
-    // eslint-disable-next-line no-useless-call,no-throw-literal
-    method.call(null, argument || function () { throw 1; }, 1);
-  });
-};
diff --git a/node_modules/core-js-pure/internals/array-method-uses-to-length.js b/node_modules/core-js-pure/internals/array-method-uses-to-length.js
deleted file mode 100644
index 9863b6f..0000000
--- a/node_modules/core-js-pure/internals/array-method-uses-to-length.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var DESCRIPTORS = require('../internals/descriptors');
-var fails = require('../internals/fails');
-var has = require('../internals/has');
-
-var defineProperty = Object.defineProperty;
-var cache = {};
-
-var thrower = function (it) { throw it; };
-
-module.exports = function (METHOD_NAME, options) {
-  if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];
-  if (!options) options = {};
-  var method = [][METHOD_NAME];
-  var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;
-  var argument0 = has(options, 0) ? options[0] : thrower;
-  var argument1 = has(options, 1) ? options[1] : undefined;
-
-  return cache[METHOD_NAME] = !!method && !fails(function () {
-    if (ACCESSORS && !DESCRIPTORS) return true;
-    var O = { length: -1 };
-
-    if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });
-    else O[1] = 1;
-
-    method.call(O, argument0, argument1);
-  });
-};
diff --git a/node_modules/core-js-pure/internals/array-reduce.js b/node_modules/core-js-pure/internals/array-reduce.js
deleted file mode 100644
index 3f17037..0000000
--- a/node_modules/core-js-pure/internals/array-reduce.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var aFunction = require('../internals/a-function');
-var toObject = require('../internals/to-object');
-var IndexedObject = require('../internals/indexed-object');
-var toLength = require('../internals/to-length');
-
-// `Array.prototype.{ reduce, reduceRight }` methods implementation
-var createMethod = function (IS_RIGHT) {
-  return function (that, callbackfn, argumentsLength, memo) {
-    aFunction(callbackfn);
-    var O = toObject(that);
-    var self = IndexedObject(O);
-    var length = toLength(O.length);
-    var index = IS_RIGHT ? length - 1 : 0;
-    var i = IS_RIGHT ? -1 : 1;
-    if (argumentsLength < 2) while (true) {
-      if (index in self) {
-        memo = self[index];
-        index += i;
-        break;
-      }
-      index += i;
-      if (IS_RIGHT ? index < 0 : length <= index) {
-        throw TypeError('Reduce of empty array with no initial value');
-      }
-    }
-    for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {
-      memo = callbackfn(memo, self[index], index, O);
-    }
-    return memo;
-  };
-};
-
-module.exports = {
-  // `Array.prototype.reduce` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.reduce
-  left: createMethod(false),
-  // `Array.prototype.reduceRight` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright
-  right: createMethod(true)
-};
diff --git a/node_modules/core-js-pure/internals/array-species-create.js b/node_modules/core-js-pure/internals/array-species-create.js
deleted file mode 100644
index 5c6eaab..0000000
--- a/node_modules/core-js-pure/internals/array-species-create.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var isObject = require('../internals/is-object');
-var isArray = require('../internals/is-array');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var SPECIES = wellKnownSymbol('species');
-
-// `ArraySpeciesCreate` abstract operation
-// https://tc39.github.io/ecma262/#sec-arrayspeciescreate
-module.exports = function (originalArray, length) {
-  var C;
-  if (isArray(originalArray)) {
-    C = originalArray.constructor;
-    // cross-realm fallback
-    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;
-    else if (isObject(C)) {
-      C = C[SPECIES];
-      if (C === null) C = undefined;
-    }
-  } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);
-};
diff --git a/node_modules/core-js-pure/internals/async-iterator-create-proxy.js b/node_modules/core-js-pure/internals/async-iterator-create-proxy.js
deleted file mode 100644
index 9e8c5df..0000000
--- a/node_modules/core-js-pure/internals/async-iterator-create-proxy.js
+++ /dev/null
@@ -1,61 +0,0 @@
-'use strict';
-var path = require('../internals/path');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var create = require('../internals/object-create');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var redefineAll = require('../internals/redefine-all');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var InternalStateModule = require('../internals/internal-state');
-var getBuiltIn = require('../internals/get-built-in');
-
-var Promise = getBuiltIn('Promise');
-
-var setInternalState = InternalStateModule.set;
-var getInternalState = InternalStateModule.get;
-
-var TO_STRING_TAG = wellKnownSymbol('toStringTag');
-
-var $return = function (value) {
-  var iterator = getInternalState(this).iterator;
-  var $$return = iterator['return'];
-  return $$return === undefined
-    ? Promise.resolve({ done: true, value: value })
-    : anObject($$return.call(iterator, value));
-};
-
-var $throw = function (value) {
-  var iterator = getInternalState(this).iterator;
-  var $$throw = iterator['throw'];
-  return $$throw === undefined
-    ? Promise.reject(value)
-    : $$throw.call(iterator, value);
-};
-
-module.exports = function (nextHandler, IS_ITERATOR) {
-  var AsyncIteratorProxy = function AsyncIterator(state) {
-    state.next = aFunction(state.iterator.next);
-    state.done = false;
-    setInternalState(this, state);
-  };
-
-  AsyncIteratorProxy.prototype = redefineAll(create(path.AsyncIterator.prototype), {
-    next: function next(arg) {
-      var state = getInternalState(this);
-      if (state.done) return Promise.resolve({ done: true, value: undefined });
-      try {
-        return Promise.resolve(anObject(nextHandler.call(state, arg, Promise)));
-      } catch (error) {
-        return Promise.reject(error);
-      }
-    },
-    'return': $return,
-    'throw': $throw
-  });
-
-  if (!IS_ITERATOR) {
-    createNonEnumerableProperty(AsyncIteratorProxy.prototype, TO_STRING_TAG, 'Generator');
-  }
-
-  return AsyncIteratorProxy;
-};
diff --git a/node_modules/core-js-pure/internals/async-iterator-iteration.js b/node_modules/core-js-pure/internals/async-iterator-iteration.js
deleted file mode 100644
index 94d2560..0000000
--- a/node_modules/core-js-pure/internals/async-iterator-iteration.js
+++ /dev/null
@@ -1,61 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var getBuiltIn = require('../internals/get-built-in');
-
-var Promise = getBuiltIn('Promise');
-var push = [].push;
-
-var createMethod = function (TYPE) {
-  var IS_TO_ARRAY = TYPE == 0;
-  var IS_FOR_EACH = TYPE == 1;
-  var IS_EVERY = TYPE == 2;
-  var IS_SOME = TYPE == 3;
-  return function (iterator, fn) {
-    anObject(iterator);
-    var next = aFunction(iterator.next);
-    var array = IS_TO_ARRAY ? [] : undefined;
-    if (!IS_TO_ARRAY) aFunction(fn);
-
-    return new Promise(function (resolve, reject) {
-      var loop = function () {
-        try {
-          Promise.resolve(anObject(next.call(iterator))).then(function (step) {
-            try {
-              if (anObject(step).done) {
-                resolve(IS_TO_ARRAY ? array : IS_SOME ? false : IS_EVERY || undefined);
-              } else {
-                var value = step.value;
-                if (IS_TO_ARRAY) {
-                  push.call(array, value);
-                  loop();
-                } else {
-                  Promise.resolve(fn(value)).then(function (result) {
-                    if (IS_FOR_EACH) {
-                      loop();
-                    } else if (IS_EVERY) {
-                      result ? loop() : resolve(false);
-                    } else {
-                      result ? resolve(IS_SOME || value) : loop();
-                    }
-                  }, reject);
-                }
-              }
-            } catch (err) { reject(err); }
-          }, reject);
-        } catch (error) { reject(error); }
-      };
-
-      loop();
-    });
-  };
-};
-
-module.exports = {
-  toArray: createMethod(0),
-  forEach: createMethod(1),
-  every: createMethod(2),
-  some: createMethod(3),
-  find: createMethod(4)
-};
diff --git a/node_modules/core-js-pure/internals/async-iterator-prototype.js b/node_modules/core-js-pure/internals/async-iterator-prototype.js
deleted file mode 100644
index cb509f0..0000000
--- a/node_modules/core-js-pure/internals/async-iterator-prototype.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var global = require('../internals/global');
-var shared = require('../internals/shared-store');
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-var has = require('../internals/has');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var IS_PURE = require('../internals/is-pure');
-
-var USE_FUNCTION_CONSTRUCTOR = 'USE_FUNCTION_CONSTRUCTOR';
-var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator');
-var AsyncIterator = global.AsyncIterator;
-var PassedAsyncIteratorPrototype = shared.AsyncIteratorPrototype;
-var AsyncIteratorPrototype, prototype;
-
-if (!IS_PURE) {
-  if (PassedAsyncIteratorPrototype) {
-    AsyncIteratorPrototype = PassedAsyncIteratorPrototype;
-  } else if (typeof AsyncIterator == 'function') {
-    AsyncIteratorPrototype = AsyncIterator.prototype;
-  } else if (shared[USE_FUNCTION_CONSTRUCTOR] || global[USE_FUNCTION_CONSTRUCTOR]) {
-    try {
-      // eslint-disable-next-line no-new-func
-      prototype = getPrototypeOf(getPrototypeOf(getPrototypeOf(Function('return async function*(){}()')())));
-      if (getPrototypeOf(prototype) === Object.prototype) AsyncIteratorPrototype = prototype;
-    } catch (error) { /* empty */ }
-  }
-}
-
-if (!AsyncIteratorPrototype) AsyncIteratorPrototype = {};
-
-if (!has(AsyncIteratorPrototype, ASYNC_ITERATOR)) {
-  createNonEnumerableProperty(AsyncIteratorPrototype, ASYNC_ITERATOR, function () {
-    return this;
-  });
-}
-
-module.exports = AsyncIteratorPrototype;
diff --git a/node_modules/core-js-pure/internals/call-with-safe-iteration-closing.js b/node_modules/core-js-pure/internals/call-with-safe-iteration-closing.js
deleted file mode 100644
index 7503656..0000000
--- a/node_modules/core-js-pure/internals/call-with-safe-iteration-closing.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var anObject = require('../internals/an-object');
-
-// call something on iterator step with safe closing on error
-module.exports = function (iterator, fn, value, ENTRIES) {
-  try {
-    return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);
-  // 7.4.6 IteratorClose(iterator, completion)
-  } catch (error) {
-    var returnMethod = iterator['return'];
-    if (returnMethod !== undefined) anObject(returnMethod.call(iterator));
-    throw error;
-  }
-};
diff --git a/node_modules/core-js-pure/internals/check-correctness-of-iteration.js b/node_modules/core-js-pure/internals/check-correctness-of-iteration.js
deleted file mode 100644
index b33ec63..0000000
--- a/node_modules/core-js-pure/internals/check-correctness-of-iteration.js
+++ /dev/null
@@ -1,38 +0,0 @@
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var ITERATOR = wellKnownSymbol('iterator');
-var SAFE_CLOSING = false;
-
-try {
-  var called = 0;
-  var iteratorWithReturn = {
-    next: function () {
-      return { done: !!called++ };
-    },
-    'return': function () {
-      SAFE_CLOSING = true;
-    }
-  };
-  iteratorWithReturn[ITERATOR] = function () {
-    return this;
-  };
-  // eslint-disable-next-line no-throw-literal
-  Array.from(iteratorWithReturn, function () { throw 2; });
-} catch (error) { /* empty */ }
-
-module.exports = function (exec, SKIP_CLOSING) {
-  if (!SKIP_CLOSING && !SAFE_CLOSING) return false;
-  var ITERATION_SUPPORT = false;
-  try {
-    var object = {};
-    object[ITERATOR] = function () {
-      return {
-        next: function () {
-          return { done: ITERATION_SUPPORT = true };
-        }
-      };
-    };
-    exec(object);
-  } catch (error) { /* empty */ }
-  return ITERATION_SUPPORT;
-};
diff --git a/node_modules/core-js-pure/internals/classof-raw.js b/node_modules/core-js-pure/internals/classof-raw.js
deleted file mode 100644
index 332c0bc..0000000
--- a/node_modules/core-js-pure/internals/classof-raw.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var toString = {}.toString;
-
-module.exports = function (it) {
-  return toString.call(it).slice(8, -1);
-};
diff --git a/node_modules/core-js-pure/internals/classof.js b/node_modules/core-js-pure/internals/classof.js
deleted file mode 100644
index 0fd0844..0000000
--- a/node_modules/core-js-pure/internals/classof.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');
-var classofRaw = require('../internals/classof-raw');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var TO_STRING_TAG = wellKnownSymbol('toStringTag');
-// ES3 wrong here
-var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';
-
-// fallback for IE11 Script Access Denied error
-var tryGet = function (it, key) {
-  try {
-    return it[key];
-  } catch (error) { /* empty */ }
-};
-
-// getting tag from ES6+ `Object.prototype.toString`
-module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {
-  var O, tag, result;
-  return it === undefined ? 'Undefined' : it === null ? 'Null'
-    // @@toStringTag case
-    : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag
-    // builtinTag case
-    : CORRECT_ARGUMENTS ? classofRaw(O)
-    // ES3 arguments fallback
-    : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;
-};
diff --git a/node_modules/core-js-pure/internals/collection-add-all.js b/node_modules/core-js-pure/internals/collection-add-all.js
deleted file mode 100644
index 86d1a78..0000000
--- a/node_modules/core-js-pure/internals/collection-add-all.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-
-// https://github.com/tc39/collection-methods
-module.exports = function (/* ...elements */) {
-  var set = anObject(this);
-  var adder = aFunction(set.add);
-  for (var k = 0, len = arguments.length; k < len; k++) {
-    adder.call(set, arguments[k]);
-  }
-  return set;
-};
diff --git a/node_modules/core-js-pure/internals/collection-delete-all.js b/node_modules/core-js-pure/internals/collection-delete-all.js
deleted file mode 100644
index 37b4d48..0000000
--- a/node_modules/core-js-pure/internals/collection-delete-all.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-
-// https://github.com/tc39/collection-methods
-module.exports = function (/* ...elements */) {
-  var collection = anObject(this);
-  var remover = aFunction(collection['delete']);
-  var allDeleted = true;
-  var wasDeleted;
-  for (var k = 0, len = arguments.length; k < len; k++) {
-    wasDeleted = remover.call(collection, arguments[k]);
-    allDeleted = allDeleted && wasDeleted;
-  }
-  return !!allDeleted;
-};
diff --git a/node_modules/core-js-pure/internals/collection-from.js b/node_modules/core-js-pure/internals/collection-from.js
deleted file mode 100644
index 7a4136d..0000000
--- a/node_modules/core-js-pure/internals/collection-from.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-// https://tc39.github.io/proposal-setmap-offrom/
-var aFunction = require('../internals/a-function');
-var bind = require('../internals/function-bind-context');
-var iterate = require('../internals/iterate');
-
-module.exports = function from(source /* , mapFn, thisArg */) {
-  var length = arguments.length;
-  var mapFn = length > 1 ? arguments[1] : undefined;
-  var mapping, A, n, boundFunction;
-  aFunction(this);
-  mapping = mapFn !== undefined;
-  if (mapping) aFunction(mapFn);
-  if (source == undefined) return new this();
-  A = [];
-  if (mapping) {
-    n = 0;
-    boundFunction = bind(mapFn, length > 2 ? arguments[2] : undefined, 2);
-    iterate(source, function (nextItem) {
-      A.push(boundFunction(nextItem, n++));
-    });
-  } else {
-    iterate(source, A.push, A);
-  }
-  return new this(A);
-};
diff --git a/node_modules/core-js-pure/internals/collection-of.js b/node_modules/core-js-pure/internals/collection-of.js
deleted file mode 100644
index e68a107..0000000
--- a/node_modules/core-js-pure/internals/collection-of.js
+++ /dev/null
@@ -1,8 +0,0 @@
-'use strict';
-// https://tc39.github.io/proposal-setmap-offrom/
-module.exports = function of() {
-  var length = arguments.length;
-  var A = new Array(length);
-  while (length--) A[length] = arguments[length];
-  return new this(A);
-};
diff --git a/node_modules/core-js-pure/internals/collection-strong.js b/node_modules/core-js-pure/internals/collection-strong.js
deleted file mode 100644
index 2a67798..0000000
--- a/node_modules/core-js-pure/internals/collection-strong.js
+++ /dev/null
@@ -1,186 +0,0 @@
-'use strict';
-var defineProperty = require('../internals/object-define-property').f;
-var create = require('../internals/object-create');
-var redefineAll = require('../internals/redefine-all');
-var bind = require('../internals/function-bind-context');
-var anInstance = require('../internals/an-instance');
-var iterate = require('../internals/iterate');
-var defineIterator = require('../internals/define-iterator');
-var setSpecies = require('../internals/set-species');
-var DESCRIPTORS = require('../internals/descriptors');
-var fastKey = require('../internals/internal-metadata').fastKey;
-var InternalStateModule = require('../internals/internal-state');
-
-var setInternalState = InternalStateModule.set;
-var internalStateGetterFor = InternalStateModule.getterFor;
-
-module.exports = {
-  getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
-    var C = wrapper(function (that, iterable) {
-      anInstance(that, C, CONSTRUCTOR_NAME);
-      setInternalState(that, {
-        type: CONSTRUCTOR_NAME,
-        index: create(null),
-        first: undefined,
-        last: undefined,
-        size: 0
-      });
-      if (!DESCRIPTORS) that.size = 0;
-      if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP);
-    });
-
-    var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);
-
-    var define = function (that, key, value) {
-      var state = getInternalState(that);
-      var entry = getEntry(that, key);
-      var previous, index;
-      // change existing entry
-      if (entry) {
-        entry.value = value;
-      // create new entry
-      } else {
-        state.last = entry = {
-          index: index = fastKey(key, true),
-          key: key,
-          value: value,
-          previous: previous = state.last,
-          next: undefined,
-          removed: false
-        };
-        if (!state.first) state.first = entry;
-        if (previous) previous.next = entry;
-        if (DESCRIPTORS) state.size++;
-        else that.size++;
-        // add to index
-        if (index !== 'F') state.index[index] = entry;
-      } return that;
-    };
-
-    var getEntry = function (that, key) {
-      var state = getInternalState(that);
-      // fast case
-      var index = fastKey(key);
-      var entry;
-      if (index !== 'F') return state.index[index];
-      // frozen object case
-      for (entry = state.first; entry; entry = entry.next) {
-        if (entry.key == key) return entry;
-      }
-    };
-
-    redefineAll(C.prototype, {
-      // 23.1.3.1 Map.prototype.clear()
-      // 23.2.3.2 Set.prototype.clear()
-      clear: function clear() {
-        var that = this;
-        var state = getInternalState(that);
-        var data = state.index;
-        var entry = state.first;
-        while (entry) {
-          entry.removed = true;
-          if (entry.previous) entry.previous = entry.previous.next = undefined;
-          delete data[entry.index];
-          entry = entry.next;
-        }
-        state.first = state.last = undefined;
-        if (DESCRIPTORS) state.size = 0;
-        else that.size = 0;
-      },
-      // 23.1.3.3 Map.prototype.delete(key)
-      // 23.2.3.4 Set.prototype.delete(value)
-      'delete': function (key) {
-        var that = this;
-        var state = getInternalState(that);
-        var entry = getEntry(that, key);
-        if (entry) {
-          var next = entry.next;
-          var prev = entry.previous;
-          delete state.index[entry.index];
-          entry.removed = true;
-          if (prev) prev.next = next;
-          if (next) next.previous = prev;
-          if (state.first == entry) state.first = next;
-          if (state.last == entry) state.last = prev;
-          if (DESCRIPTORS) state.size--;
-          else that.size--;
-        } return !!entry;
-      },
-      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
-      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
-      forEach: function forEach(callbackfn /* , that = undefined */) {
-        var state = getInternalState(this);
-        var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-        var entry;
-        while (entry = entry ? entry.next : state.first) {
-          boundFunction(entry.value, entry.key, this);
-          // revert to the last existing entry
-          while (entry && entry.removed) entry = entry.previous;
-        }
-      },
-      // 23.1.3.7 Map.prototype.has(key)
-      // 23.2.3.7 Set.prototype.has(value)
-      has: function has(key) {
-        return !!getEntry(this, key);
-      }
-    });
-
-    redefineAll(C.prototype, IS_MAP ? {
-      // 23.1.3.6 Map.prototype.get(key)
-      get: function get(key) {
-        var entry = getEntry(this, key);
-        return entry && entry.value;
-      },
-      // 23.1.3.9 Map.prototype.set(key, value)
-      set: function set(key, value) {
-        return define(this, key === 0 ? 0 : key, value);
-      }
-    } : {
-      // 23.2.3.1 Set.prototype.add(value)
-      add: function add(value) {
-        return define(this, value = value === 0 ? 0 : value, value);
-      }
-    });
-    if (DESCRIPTORS) defineProperty(C.prototype, 'size', {
-      get: function () {
-        return getInternalState(this).size;
-      }
-    });
-    return C;
-  },
-  setStrong: function (C, CONSTRUCTOR_NAME, IS_MAP) {
-    var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';
-    var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);
-    var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);
-    // add .keys, .values, .entries, [@@iterator]
-    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
-    defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) {
-      setInternalState(this, {
-        type: ITERATOR_NAME,
-        target: iterated,
-        state: getInternalCollectionState(iterated),
-        kind: kind,
-        last: undefined
-      });
-    }, function () {
-      var state = getInternalIteratorState(this);
-      var kind = state.kind;
-      var entry = state.last;
-      // revert to the last existing entry
-      while (entry && entry.removed) entry = entry.previous;
-      // get next entry
-      if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {
-        // or finish the iteration
-        state.target = undefined;
-        return { value: undefined, done: true };
-      }
-      // return step by kind
-      if (kind == 'keys') return { value: entry.key, done: false };
-      if (kind == 'values') return { value: entry.value, done: false };
-      return { value: [entry.key, entry.value], done: false };
-    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
-
-    // add [@@species], 23.1.2.2, 23.2.2.2
-    setSpecies(CONSTRUCTOR_NAME);
-  }
-};
diff --git a/node_modules/core-js-pure/internals/collection-weak.js b/node_modules/core-js-pure/internals/collection-weak.js
deleted file mode 100644
index ac8a413..0000000
--- a/node_modules/core-js-pure/internals/collection-weak.js
+++ /dev/null
@@ -1,121 +0,0 @@
-'use strict';
-var redefineAll = require('../internals/redefine-all');
-var getWeakData = require('../internals/internal-metadata').getWeakData;
-var anObject = require('../internals/an-object');
-var isObject = require('../internals/is-object');
-var anInstance = require('../internals/an-instance');
-var iterate = require('../internals/iterate');
-var ArrayIterationModule = require('../internals/array-iteration');
-var $has = require('../internals/has');
-var InternalStateModule = require('../internals/internal-state');
-
-var setInternalState = InternalStateModule.set;
-var internalStateGetterFor = InternalStateModule.getterFor;
-var find = ArrayIterationModule.find;
-var findIndex = ArrayIterationModule.findIndex;
-var id = 0;
-
-// fallback for uncaught frozen keys
-var uncaughtFrozenStore = function (store) {
-  return store.frozen || (store.frozen = new UncaughtFrozenStore());
-};
-
-var UncaughtFrozenStore = function () {
-  this.entries = [];
-};
-
-var findUncaughtFrozen = function (store, key) {
-  return find(store.entries, function (it) {
-    return it[0] === key;
-  });
-};
-
-UncaughtFrozenStore.prototype = {
-  get: function (key) {
-    var entry = findUncaughtFrozen(this, key);
-    if (entry) return entry[1];
-  },
-  has: function (key) {
-    return !!findUncaughtFrozen(this, key);
-  },
-  set: function (key, value) {
-    var entry = findUncaughtFrozen(this, key);
-    if (entry) entry[1] = value;
-    else this.entries.push([key, value]);
-  },
-  'delete': function (key) {
-    var index = findIndex(this.entries, function (it) {
-      return it[0] === key;
-    });
-    if (~index) this.entries.splice(index, 1);
-    return !!~index;
-  }
-};
-
-module.exports = {
-  getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
-    var C = wrapper(function (that, iterable) {
-      anInstance(that, C, CONSTRUCTOR_NAME);
-      setInternalState(that, {
-        type: CONSTRUCTOR_NAME,
-        id: id++,
-        frozen: undefined
-      });
-      if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP);
-    });
-
-    var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);
-
-    var define = function (that, key, value) {
-      var state = getInternalState(that);
-      var data = getWeakData(anObject(key), true);
-      if (data === true) uncaughtFrozenStore(state).set(key, value);
-      else data[state.id] = value;
-      return that;
-    };
-
-    redefineAll(C.prototype, {
-      // 23.3.3.2 WeakMap.prototype.delete(key)
-      // 23.4.3.3 WeakSet.prototype.delete(value)
-      'delete': function (key) {
-        var state = getInternalState(this);
-        if (!isObject(key)) return false;
-        var data = getWeakData(key);
-        if (data === true) return uncaughtFrozenStore(state)['delete'](key);
-        return data && $has(data, state.id) && delete data[state.id];
-      },
-      // 23.3.3.4 WeakMap.prototype.has(key)
-      // 23.4.3.4 WeakSet.prototype.has(value)
-      has: function has(key) {
-        var state = getInternalState(this);
-        if (!isObject(key)) return false;
-        var data = getWeakData(key);
-        if (data === true) return uncaughtFrozenStore(state).has(key);
-        return data && $has(data, state.id);
-      }
-    });
-
-    redefineAll(C.prototype, IS_MAP ? {
-      // 23.3.3.3 WeakMap.prototype.get(key)
-      get: function get(key) {
-        var state = getInternalState(this);
-        if (isObject(key)) {
-          var data = getWeakData(key);
-          if (data === true) return uncaughtFrozenStore(state).get(key);
-          return data ? data[state.id] : undefined;
-        }
-      },
-      // 23.3.3.5 WeakMap.prototype.set(key, value)
-      set: function set(key, value) {
-        return define(this, key, value);
-      }
-    } : {
-      // 23.4.3.1 WeakSet.prototype.add(value)
-      add: function add(value) {
-        return define(this, value, true);
-      }
-    });
-
-    return C;
-  }
-};
diff --git a/node_modules/core-js-pure/internals/collection.js b/node_modules/core-js-pure/internals/collection.js
deleted file mode 100644
index a50e892..0000000
--- a/node_modules/core-js-pure/internals/collection.js
+++ /dev/null
@@ -1,73 +0,0 @@
-'use strict';
-var $ = require('./export');
-var global = require('../internals/global');
-var InternalMetadataModule = require('../internals/internal-metadata');
-var fails = require('../internals/fails');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var iterate = require('../internals/iterate');
-var anInstance = require('../internals/an-instance');
-var isObject = require('../internals/is-object');
-var setToStringTag = require('../internals/set-to-string-tag');
-var defineProperty = require('../internals/object-define-property').f;
-var forEach = require('../internals/array-iteration').forEach;
-var DESCRIPTORS = require('../internals/descriptors');
-var InternalStateModule = require('../internals/internal-state');
-
-var setInternalState = InternalStateModule.set;
-var internalStateGetterFor = InternalStateModule.getterFor;
-
-module.exports = function (CONSTRUCTOR_NAME, wrapper, common) {
-  var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;
-  var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;
-  var ADDER = IS_MAP ? 'set' : 'add';
-  var NativeConstructor = global[CONSTRUCTOR_NAME];
-  var NativePrototype = NativeConstructor && NativeConstructor.prototype;
-  var exported = {};
-  var Constructor;
-
-  if (!DESCRIPTORS || typeof NativeConstructor != 'function'
-    || !(IS_WEAK || NativePrototype.forEach && !fails(function () { new NativeConstructor().entries().next(); }))
-  ) {
-    // create collection constructor
-    Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);
-    InternalMetadataModule.REQUIRED = true;
-  } else {
-    Constructor = wrapper(function (target, iterable) {
-      setInternalState(anInstance(target, Constructor, CONSTRUCTOR_NAME), {
-        type: CONSTRUCTOR_NAME,
-        collection: new NativeConstructor()
-      });
-      if (iterable != undefined) iterate(iterable, target[ADDER], target, IS_MAP);
-    });
-
-    var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);
-
-    forEach(['add', 'clear', 'delete', 'forEach', 'get', 'has', 'set', 'keys', 'values', 'entries'], function (KEY) {
-      var IS_ADDER = KEY == 'add' || KEY == 'set';
-      if (KEY in NativePrototype && !(IS_WEAK && KEY == 'clear')) {
-        createNonEnumerableProperty(Constructor.prototype, KEY, function (a, b) {
-          var collection = getInternalState(this).collection;
-          if (!IS_ADDER && IS_WEAK && !isObject(a)) return KEY == 'get' ? undefined : false;
-          var result = collection[KEY](a === 0 ? 0 : a, b);
-          return IS_ADDER ? this : result;
-        });
-      }
-    });
-
-    IS_WEAK || defineProperty(Constructor.prototype, 'size', {
-      configurable: true,
-      get: function () {
-        return getInternalState(this).collection.size;
-      }
-    });
-  }
-
-  setToStringTag(Constructor, CONSTRUCTOR_NAME, false, true);
-
-  exported[CONSTRUCTOR_NAME] = Constructor;
-  $({ global: true, forced: true }, exported);
-
-  if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);
-
-  return Constructor;
-};
diff --git a/node_modules/core-js-pure/internals/composite-key.js b/node_modules/core-js-pure/internals/composite-key.js
deleted file mode 100644
index 68a38c9..0000000
--- a/node_modules/core-js-pure/internals/composite-key.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
-var Map = require('../modules/es.map');
-var WeakMap = require('../modules/es.weak-map');
-var create = require('../internals/object-create');
-var isObject = require('../internals/is-object');
-
-var Node = function () {
-  // keys
-  this.object = null;
-  this.symbol = null;
-  // child nodes
-  this.primitives = null;
-  this.objectsByIndex = create(null);
-};
-
-Node.prototype.get = function (key, initializer) {
-  return this[key] || (this[key] = initializer());
-};
-
-Node.prototype.next = function (i, it, IS_OBJECT) {
-  var store = IS_OBJECT
-    ? this.objectsByIndex[i] || (this.objectsByIndex[i] = new WeakMap())
-    : this.primitives || (this.primitives = new Map());
-  var entry = store.get(it);
-  if (!entry) store.set(it, entry = new Node());
-  return entry;
-};
-
-var root = new Node();
-
-module.exports = function () {
-  var active = root;
-  var length = arguments.length;
-  var i, it;
-  // for prevent leaking, start from objects
-  for (i = 0; i < length; i++) {
-    if (isObject(it = arguments[i])) active = active.next(i, it, true);
-  }
-  if (this === Object && active === root) throw TypeError('Composite keys must contain a non-primitive component');
-  for (i = 0; i < length; i++) {
-    if (!isObject(it = arguments[i])) active = active.next(i, it, false);
-  } return active;
-};
diff --git a/node_modules/core-js-pure/internals/copy-constructor-properties.js b/node_modules/core-js-pure/internals/copy-constructor-properties.js
deleted file mode 100644
index 214a819..0000000
--- a/node_modules/core-js-pure/internals/copy-constructor-properties.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var has = require('../internals/has');
-var ownKeys = require('../internals/own-keys');
-var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');
-var definePropertyModule = require('../internals/object-define-property');
-
-module.exports = function (target, source) {
-  var keys = ownKeys(source);
-  var defineProperty = definePropertyModule.f;
-  var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
-  for (var i = 0; i < keys.length; i++) {
-    var key = keys[i];
-    if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));
-  }
-};
diff --git a/node_modules/core-js-pure/internals/correct-is-regexp-logic.js b/node_modules/core-js-pure/internals/correct-is-regexp-logic.js
deleted file mode 100644
index f0d753f..0000000
--- a/node_modules/core-js-pure/internals/correct-is-regexp-logic.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var MATCH = wellKnownSymbol('match');
-
-module.exports = function (METHOD_NAME) {
-  var regexp = /./;
-  try {
-    '/./'[METHOD_NAME](regexp);
-  } catch (e) {
-    try {
-      regexp[MATCH] = false;
-      return '/./'[METHOD_NAME](regexp);
-    } catch (f) { /* empty */ }
-  } return false;
-};
diff --git a/node_modules/core-js-pure/internals/correct-prototype-getter.js b/node_modules/core-js-pure/internals/correct-prototype-getter.js
deleted file mode 100644
index 6cd8f40..0000000
--- a/node_modules/core-js-pure/internals/correct-prototype-getter.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var fails = require('../internals/fails');
-
-module.exports = !fails(function () {
-  function F() { /* empty */ }
-  F.prototype.constructor = null;
-  return Object.getPrototypeOf(new F()) !== F.prototype;
-});
diff --git a/node_modules/core-js-pure/internals/create-html.js b/node_modules/core-js-pure/internals/create-html.js
deleted file mode 100644
index 57e560c..0000000
--- a/node_modules/core-js-pure/internals/create-html.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var requireObjectCoercible = require('../internals/require-object-coercible');
-
-var quot = /"/g;
-
-// B.2.3.2.1 CreateHTML(string, tag, attribute, value)
-// https://tc39.github.io/ecma262/#sec-createhtml
-module.exports = function (string, tag, attribute, value) {
-  var S = String(requireObjectCoercible(string));
-  var p1 = '<' + tag;
-  if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '&quot;') + '"';
-  return p1 + '>' + S + '</' + tag + '>';
-};
diff --git a/node_modules/core-js-pure/internals/create-iterator-constructor.js b/node_modules/core-js-pure/internals/create-iterator-constructor.js
deleted file mode 100644
index f9dbdb7..0000000
--- a/node_modules/core-js-pure/internals/create-iterator-constructor.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;
-var create = require('../internals/object-create');
-var createPropertyDescriptor = require('../internals/create-property-descriptor');
-var setToStringTag = require('../internals/set-to-string-tag');
-var Iterators = require('../internals/iterators');
-
-var returnThis = function () { return this; };
-
-module.exports = function (IteratorConstructor, NAME, next) {
-  var TO_STRING_TAG = NAME + ' Iterator';
-  IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });
-  setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);
-  Iterators[TO_STRING_TAG] = returnThis;
-  return IteratorConstructor;
-};
diff --git a/node_modules/core-js-pure/internals/create-non-enumerable-property.js b/node_modules/core-js-pure/internals/create-non-enumerable-property.js
deleted file mode 100644
index bdaad25..0000000
--- a/node_modules/core-js-pure/internals/create-non-enumerable-property.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var DESCRIPTORS = require('../internals/descriptors');
-var definePropertyModule = require('../internals/object-define-property');
-var createPropertyDescriptor = require('../internals/create-property-descriptor');
-
-module.exports = DESCRIPTORS ? function (object, key, value) {
-  return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));
-} : function (object, key, value) {
-  object[key] = value;
-  return object;
-};
diff --git a/node_modules/core-js-pure/internals/create-property-descriptor.js b/node_modules/core-js-pure/internals/create-property-descriptor.js
deleted file mode 100644
index 0905934..0000000
--- a/node_modules/core-js-pure/internals/create-property-descriptor.js
+++ /dev/null
@@ -1,8 +0,0 @@
-module.exports = function (bitmap, value) {
-  return {
-    enumerable: !(bitmap & 1),
-    configurable: !(bitmap & 2),
-    writable: !(bitmap & 4),
-    value: value
-  };
-};
diff --git a/node_modules/core-js-pure/internals/create-property.js b/node_modules/core-js-pure/internals/create-property.js
deleted file mode 100644
index c27151a..0000000
--- a/node_modules/core-js-pure/internals/create-property.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-var toPrimitive = require('../internals/to-primitive');
-var definePropertyModule = require('../internals/object-define-property');
-var createPropertyDescriptor = require('../internals/create-property-descriptor');
-
-module.exports = function (object, key, value) {
-  var propertyKey = toPrimitive(key);
-  if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));
-  else object[propertyKey] = value;
-};
diff --git a/node_modules/core-js-pure/internals/date-to-iso-string.js b/node_modules/core-js-pure/internals/date-to-iso-string.js
deleted file mode 100644
index f22503a..0000000
--- a/node_modules/core-js-pure/internals/date-to-iso-string.js
+++ /dev/null
@@ -1,31 +0,0 @@
-'use strict';
-var fails = require('../internals/fails');
-var padStart = require('../internals/string-pad').start;
-
-var abs = Math.abs;
-var DatePrototype = Date.prototype;
-var getTime = DatePrototype.getTime;
-var nativeDateToISOString = DatePrototype.toISOString;
-
-// `Date.prototype.toISOString` method implementation
-// https://tc39.github.io/ecma262/#sec-date.prototype.toisostring
-// PhantomJS / old WebKit fails here:
-module.exports = (fails(function () {
-  return nativeDateToISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';
-}) || !fails(function () {
-  nativeDateToISOString.call(new Date(NaN));
-})) ? function toISOString() {
-  if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');
-  var date = this;
-  var year = date.getUTCFullYear();
-  var milliseconds = date.getUTCMilliseconds();
-  var sign = year < 0 ? '-' : year > 9999 ? '+' : '';
-  return sign + padStart(abs(year), sign ? 6 : 4, 0) +
-    '-' + padStart(date.getUTCMonth() + 1, 2, 0) +
-    '-' + padStart(date.getUTCDate(), 2, 0) +
-    'T' + padStart(date.getUTCHours(), 2, 0) +
-    ':' + padStart(date.getUTCMinutes(), 2, 0) +
-    ':' + padStart(date.getUTCSeconds(), 2, 0) +
-    '.' + padStart(milliseconds, 3, 0) +
-    'Z';
-} : nativeDateToISOString;
diff --git a/node_modules/core-js-pure/internals/date-to-primitive.js b/node_modules/core-js-pure/internals/date-to-primitive.js
deleted file mode 100644
index fc334f1..0000000
--- a/node_modules/core-js-pure/internals/date-to-primitive.js
+++ /dev/null
@@ -1,9 +0,0 @@
-'use strict';
-var anObject = require('../internals/an-object');
-var toPrimitive = require('../internals/to-primitive');
-
-module.exports = function (hint) {
-  if (hint !== 'string' && hint !== 'number' && hint !== 'default') {
-    throw TypeError('Incorrect hint');
-  } return toPrimitive(anObject(this), hint !== 'number');
-};
diff --git a/node_modules/core-js-pure/internals/define-iterator.js b/node_modules/core-js-pure/internals/define-iterator.js
deleted file mode 100644
index 7f829bf..0000000
--- a/node_modules/core-js-pure/internals/define-iterator.js
+++ /dev/null
@@ -1,90 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createIteratorConstructor = require('../internals/create-iterator-constructor');
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-var setPrototypeOf = require('../internals/object-set-prototype-of');
-var setToStringTag = require('../internals/set-to-string-tag');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var redefine = require('../internals/redefine');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var IS_PURE = require('../internals/is-pure');
-var Iterators = require('../internals/iterators');
-var IteratorsCore = require('../internals/iterators-core');
-
-var IteratorPrototype = IteratorsCore.IteratorPrototype;
-var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;
-var ITERATOR = wellKnownSymbol('iterator');
-var KEYS = 'keys';
-var VALUES = 'values';
-var ENTRIES = 'entries';
-
-var returnThis = function () { return this; };
-
-module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {
-  createIteratorConstructor(IteratorConstructor, NAME, next);
-
-  var getIterationMethod = function (KIND) {
-    if (KIND === DEFAULT && defaultIterator) return defaultIterator;
-    if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];
-    switch (KIND) {
-      case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };
-      case VALUES: return function values() { return new IteratorConstructor(this, KIND); };
-      case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };
-    } return function () { return new IteratorConstructor(this); };
-  };
-
-  var TO_STRING_TAG = NAME + ' Iterator';
-  var INCORRECT_VALUES_NAME = false;
-  var IterablePrototype = Iterable.prototype;
-  var nativeIterator = IterablePrototype[ITERATOR]
-    || IterablePrototype['@@iterator']
-    || DEFAULT && IterablePrototype[DEFAULT];
-  var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);
-  var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;
-  var CurrentIteratorPrototype, methods, KEY;
-
-  // fix native
-  if (anyNativeIterator) {
-    CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));
-    if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {
-      if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {
-        if (setPrototypeOf) {
-          setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);
-        } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {
-          createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);
-        }
-      }
-      // Set @@toStringTag to native iterators
-      setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);
-      if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;
-    }
-  }
-
-  // fix Array#{values, @@iterator}.name in V8 / FF
-  if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {
-    INCORRECT_VALUES_NAME = true;
-    defaultIterator = function values() { return nativeIterator.call(this); };
-  }
-
-  // define iterator
-  if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {
-    createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);
-  }
-  Iterators[NAME] = defaultIterator;
-
-  // export additional methods
-  if (DEFAULT) {
-    methods = {
-      values: getIterationMethod(VALUES),
-      keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),
-      entries: getIterationMethod(ENTRIES)
-    };
-    if (FORCED) for (KEY in methods) {
-      if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
-        redefine(IterablePrototype, KEY, methods[KEY]);
-      }
-    } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
-  }
-
-  return methods;
-};
diff --git a/node_modules/core-js-pure/internals/define-well-known-symbol.js b/node_modules/core-js-pure/internals/define-well-known-symbol.js
deleted file mode 100644
index e547945..0000000
--- a/node_modules/core-js-pure/internals/define-well-known-symbol.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var path = require('../internals/path');
-var has = require('../internals/has');
-var wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');
-var defineProperty = require('../internals/object-define-property').f;
-
-module.exports = function (NAME) {
-  var Symbol = path.Symbol || (path.Symbol = {});
-  if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {
-    value: wrappedWellKnownSymbolModule.f(NAME)
-  });
-};
diff --git a/node_modules/core-js-pure/internals/descriptors.js b/node_modules/core-js-pure/internals/descriptors.js
deleted file mode 100644
index 2673a79..0000000
--- a/node_modules/core-js-pure/internals/descriptors.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var fails = require('../internals/fails');
-
-// Thank's IE8 for his funny defineProperty
-module.exports = !fails(function () {
-  return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;
-});
diff --git a/node_modules/core-js-pure/internals/document-create-element.js b/node_modules/core-js-pure/internals/document-create-element.js
deleted file mode 100644
index cc6abae..0000000
--- a/node_modules/core-js-pure/internals/document-create-element.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var global = require('../internals/global');
-var isObject = require('../internals/is-object');
-
-var document = global.document;
-// typeof document.createElement is 'object' in old IE
-var EXISTS = isObject(document) && isObject(document.createElement);
-
-module.exports = function (it) {
-  return EXISTS ? document.createElement(it) : {};
-};
diff --git a/node_modules/core-js-pure/internals/dom-iterables.js b/node_modules/core-js-pure/internals/dom-iterables.js
deleted file mode 100644
index b04e872..0000000
--- a/node_modules/core-js-pure/internals/dom-iterables.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// iterable DOM collections
-// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods
-module.exports = {
-  CSSRuleList: 0,
-  CSSStyleDeclaration: 0,
-  CSSValueList: 0,
-  ClientRectList: 0,
-  DOMRectList: 0,
-  DOMStringList: 0,
-  DOMTokenList: 1,
-  DataTransferItemList: 0,
-  FileList: 0,
-  HTMLAllCollection: 0,
-  HTMLCollection: 0,
-  HTMLFormElement: 0,
-  HTMLSelectElement: 0,
-  MediaList: 0,
-  MimeTypeArray: 0,
-  NamedNodeMap: 0,
-  NodeList: 1,
-  PaintRequestList: 0,
-  Plugin: 0,
-  PluginArray: 0,
-  SVGLengthList: 0,
-  SVGNumberList: 0,
-  SVGPathSegList: 0,
-  SVGPointList: 0,
-  SVGStringList: 0,
-  SVGTransformList: 0,
-  SourceBufferList: 0,
-  StyleSheetList: 0,
-  TextTrackCueList: 0,
-  TextTrackList: 0,
-  TouchList: 0
-};
diff --git a/node_modules/core-js-pure/internals/engine-is-ios.js b/node_modules/core-js-pure/internals/engine-is-ios.js
deleted file mode 100644
index 6d68296..0000000
--- a/node_modules/core-js-pure/internals/engine-is-ios.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var userAgent = require('../internals/engine-user-agent');
-
-module.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);
diff --git a/node_modules/core-js-pure/internals/engine-user-agent.js b/node_modules/core-js-pure/internals/engine-user-agent.js
deleted file mode 100644
index 30dfa9d..0000000
--- a/node_modules/core-js-pure/internals/engine-user-agent.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var getBuiltIn = require('../internals/get-built-in');
-
-module.exports = getBuiltIn('navigator', 'userAgent') || '';
diff --git a/node_modules/core-js-pure/internals/engine-v8-version.js b/node_modules/core-js-pure/internals/engine-v8-version.js
deleted file mode 100644
index 1ff22c3..0000000
--- a/node_modules/core-js-pure/internals/engine-v8-version.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var global = require('../internals/global');
-var userAgent = require('../internals/engine-user-agent');
-
-var process = global.process;
-var versions = process && process.versions;
-var v8 = versions && versions.v8;
-var match, version;
-
-if (v8) {
-  match = v8.split('.');
-  version = match[0] + match[1];
-} else if (userAgent) {
-  match = userAgent.match(/Edge\/(\d+)/);
-  if (!match || match[1] >= 74) {
-    match = userAgent.match(/Chrome\/(\d+)/);
-    if (match) version = match[1];
-  }
-}
-
-module.exports = version && +version;
diff --git a/node_modules/core-js-pure/internals/entry-unbind.js b/node_modules/core-js-pure/internals/entry-unbind.js
deleted file mode 100644
index f59163a..0000000
--- a/node_modules/core-js-pure/internals/entry-unbind.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var getBuiltIn = require('../internals/get-built-in');
-
-module.exports = getBuiltIn;
diff --git a/node_modules/core-js-pure/internals/entry-virtual.js b/node_modules/core-js-pure/internals/entry-virtual.js
deleted file mode 100644
index 3ef2ebf..0000000
--- a/node_modules/core-js-pure/internals/entry-virtual.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var path = require('../internals/path');
-
-module.exports = function (CONSTRUCTOR) {
-  return path[CONSTRUCTOR + 'Prototype'];
-};
diff --git a/node_modules/core-js-pure/internals/enum-bug-keys.js b/node_modules/core-js-pure/internals/enum-bug-keys.js
deleted file mode 100644
index 2ca413b..0000000
--- a/node_modules/core-js-pure/internals/enum-bug-keys.js
+++ /dev/null
@@ -1,10 +0,0 @@
-// IE8- don't enum bug keys
-module.exports = [
-  'constructor',
-  'hasOwnProperty',
-  'isPrototypeOf',
-  'propertyIsEnumerable',
-  'toLocaleString',
-  'toString',
-  'valueOf'
-];
diff --git a/node_modules/core-js-pure/internals/export.js b/node_modules/core-js-pure/internals/export.js
deleted file mode 100644
index 3369fea..0000000
--- a/node_modules/core-js-pure/internals/export.js
+++ /dev/null
@@ -1,98 +0,0 @@
-'use strict';
-var global = require('../internals/global');
-var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
-var isForced = require('../internals/is-forced');
-var path = require('../internals/path');
-var bind = require('../internals/function-bind-context');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var has = require('../internals/has');
-
-var wrapConstructor = function (NativeConstructor) {
-  var Wrapper = function (a, b, c) {
-    if (this instanceof NativeConstructor) {
-      switch (arguments.length) {
-        case 0: return new NativeConstructor();
-        case 1: return new NativeConstructor(a);
-        case 2: return new NativeConstructor(a, b);
-      } return new NativeConstructor(a, b, c);
-    } return NativeConstructor.apply(this, arguments);
-  };
-  Wrapper.prototype = NativeConstructor.prototype;
-  return Wrapper;
-};
-
-/*
-  options.target      - name of the target object
-  options.global      - target is the global object
-  options.stat        - export as static methods of target
-  options.proto       - export as prototype methods of target
-  options.real        - real prototype method for the `pure` version
-  options.forced      - export even if the native feature is available
-  options.bind        - bind methods to the target, required for the `pure` version
-  options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version
-  options.unsafe      - use the simple assignment of property instead of delete + defineProperty
-  options.sham        - add a flag to not completely full polyfills
-  options.enumerable  - export as enumerable property
-  options.noTargetGet - prevent calling a getter on target
-*/
-module.exports = function (options, source) {
-  var TARGET = options.target;
-  var GLOBAL = options.global;
-  var STATIC = options.stat;
-  var PROTO = options.proto;
-
-  var nativeSource = GLOBAL ? global : STATIC ? global[TARGET] : (global[TARGET] || {}).prototype;
-
-  var target = GLOBAL ? path : path[TARGET] || (path[TARGET] = {});
-  var targetPrototype = target.prototype;
-
-  var FORCED, USE_NATIVE, VIRTUAL_PROTOTYPE;
-  var key, sourceProperty, targetProperty, nativeProperty, resultProperty, descriptor;
-
-  for (key in source) {
-    FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
-    // contains in native
-    USE_NATIVE = !FORCED && nativeSource && has(nativeSource, key);
-
-    targetProperty = target[key];
-
-    if (USE_NATIVE) if (options.noTargetGet) {
-      descriptor = getOwnPropertyDescriptor(nativeSource, key);
-      nativeProperty = descriptor && descriptor.value;
-    } else nativeProperty = nativeSource[key];
-
-    // export native or implementation
-    sourceProperty = (USE_NATIVE && nativeProperty) ? nativeProperty : source[key];
-
-    if (USE_NATIVE && typeof targetProperty === typeof sourceProperty) continue;
-
-    // bind timers to global for call from export context
-    if (options.bind && USE_NATIVE) resultProperty = bind(sourceProperty, global);
-    // wrap global constructors for prevent changs in this version
-    else if (options.wrap && USE_NATIVE) resultProperty = wrapConstructor(sourceProperty);
-    // make static versions for prototype methods
-    else if (PROTO && typeof sourceProperty == 'function') resultProperty = bind(Function.call, sourceProperty);
-    // default case
-    else resultProperty = sourceProperty;
-
-    // add a flag to not completely full polyfills
-    if (options.sham || (sourceProperty && sourceProperty.sham) || (targetProperty && targetProperty.sham)) {
-      createNonEnumerableProperty(resultProperty, 'sham', true);
-    }
-
-    target[key] = resultProperty;
-
-    if (PROTO) {
-      VIRTUAL_PROTOTYPE = TARGET + 'Prototype';
-      if (!has(path, VIRTUAL_PROTOTYPE)) {
-        createNonEnumerableProperty(path, VIRTUAL_PROTOTYPE, {});
-      }
-      // export virtual prototype methods
-      path[VIRTUAL_PROTOTYPE][key] = sourceProperty;
-      // export real prototype methods
-      if (options.real && targetPrototype && !targetPrototype[key]) {
-        createNonEnumerableProperty(targetPrototype, key, sourceProperty);
-      }
-    }
-  }
-};
diff --git a/node_modules/core-js-pure/internals/fails.js b/node_modules/core-js-pure/internals/fails.js
deleted file mode 100644
index f398e2d..0000000
--- a/node_modules/core-js-pure/internals/fails.js
+++ /dev/null
@@ -1,7 +0,0 @@
-module.exports = function (exec) {
-  try {
-    return !!exec();
-  } catch (error) {
-    return true;
-  }
-};
diff --git a/node_modules/core-js-pure/internals/fix-regexp-well-known-symbol-logic.js b/node_modules/core-js-pure/internals/fix-regexp-well-known-symbol-logic.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/internals/fix-regexp-well-known-symbol-logic.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/internals/flatten-into-array.js b/node_modules/core-js-pure/internals/flatten-into-array.js
deleted file mode 100644
index df29916..0000000
--- a/node_modules/core-js-pure/internals/flatten-into-array.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict';
-var isArray = require('../internals/is-array');
-var toLength = require('../internals/to-length');
-var bind = require('../internals/function-bind-context');
-
-// `FlattenIntoArray` abstract operation
-// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray
-var flattenIntoArray = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {
-  var targetIndex = start;
-  var sourceIndex = 0;
-  var mapFn = mapper ? bind(mapper, thisArg, 3) : false;
-  var element;
-
-  while (sourceIndex < sourceLen) {
-    if (sourceIndex in source) {
-      element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];
-
-      if (depth > 0 && isArray(element)) {
-        targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;
-      } else {
-        if (targetIndex >= 0x1FFFFFFFFFFFFF) throw TypeError('Exceed the acceptable array length');
-        target[targetIndex] = element;
-      }
-
-      targetIndex++;
-    }
-    sourceIndex++;
-  }
-  return targetIndex;
-};
-
-module.exports = flattenIntoArray;
diff --git a/node_modules/core-js-pure/internals/freezing.js b/node_modules/core-js-pure/internals/freezing.js
deleted file mode 100644
index 0ac9fbf..0000000
--- a/node_modules/core-js-pure/internals/freezing.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var fails = require('../internals/fails');
-
-module.exports = !fails(function () {
-  return Object.isExtensible(Object.preventExtensions({}));
-});
diff --git a/node_modules/core-js-pure/internals/function-bind-context.js b/node_modules/core-js-pure/internals/function-bind-context.js
deleted file mode 100644
index 96a7f49..0000000
--- a/node_modules/core-js-pure/internals/function-bind-context.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var aFunction = require('../internals/a-function');
-
-// optional / simple context binding
-module.exports = function (fn, that, length) {
-  aFunction(fn);
-  if (that === undefined) return fn;
-  switch (length) {
-    case 0: return function () {
-      return fn.call(that);
-    };
-    case 1: return function (a) {
-      return fn.call(that, a);
-    };
-    case 2: return function (a, b) {
-      return fn.call(that, a, b);
-    };
-    case 3: return function (a, b, c) {
-      return fn.call(that, a, b, c);
-    };
-  }
-  return function (/* ...args */) {
-    return fn.apply(that, arguments);
-  };
-};
diff --git a/node_modules/core-js-pure/internals/function-bind.js b/node_modules/core-js-pure/internals/function-bind.js
deleted file mode 100644
index 6e1e81d..0000000
--- a/node_modules/core-js-pure/internals/function-bind.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-var aFunction = require('../internals/a-function');
-var isObject = require('../internals/is-object');
-
-var slice = [].slice;
-var factories = {};
-
-var construct = function (C, argsLength, args) {
-  if (!(argsLength in factories)) {
-    for (var list = [], i = 0; i < argsLength; i++) list[i] = 'a[' + i + ']';
-    // eslint-disable-next-line no-new-func
-    factories[argsLength] = Function('C,a', 'return new C(' + list.join(',') + ')');
-  } return factories[argsLength](C, args);
-};
-
-// `Function.prototype.bind` method implementation
-// https://tc39.github.io/ecma262/#sec-function.prototype.bind
-module.exports = Function.bind || function bind(that /* , ...args */) {
-  var fn = aFunction(this);
-  var partArgs = slice.call(arguments, 1);
-  var boundFunction = function bound(/* args... */) {
-    var args = partArgs.concat(slice.call(arguments));
-    return this instanceof boundFunction ? construct(fn, args.length, args) : fn.apply(that, args);
-  };
-  if (isObject(fn.prototype)) boundFunction.prototype = fn.prototype;
-  return boundFunction;
-};
diff --git a/node_modules/core-js-pure/internals/get-async-iterator-method.js b/node_modules/core-js-pure/internals/get-async-iterator-method.js
deleted file mode 100644
index 0821b08..0000000
--- a/node_modules/core-js-pure/internals/get-async-iterator-method.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var getIteratorMethod = require('../internals/get-iterator-method');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator');
-
-module.exports = function (it) {
-  var method = it[ASYNC_ITERATOR];
-  return method === undefined ? getIteratorMethod(it) : method;
-};
diff --git a/node_modules/core-js-pure/internals/get-built-in.js b/node_modules/core-js-pure/internals/get-built-in.js
deleted file mode 100644
index 8fcff26..0000000
--- a/node_modules/core-js-pure/internals/get-built-in.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var path = require('../internals/path');
-var global = require('../internals/global');
-
-var aFunction = function (variable) {
-  return typeof variable == 'function' ? variable : undefined;
-};
-
-module.exports = function (namespace, method) {
-  return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])
-    : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];
-};
diff --git a/node_modules/core-js-pure/internals/get-iterator-method.js b/node_modules/core-js-pure/internals/get-iterator-method.js
deleted file mode 100644
index cfac310..0000000
--- a/node_modules/core-js-pure/internals/get-iterator-method.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var classof = require('../internals/classof');
-var Iterators = require('../internals/iterators');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var ITERATOR = wellKnownSymbol('iterator');
-
-module.exports = function (it) {
-  if (it != undefined) return it[ITERATOR]
-    || it['@@iterator']
-    || Iterators[classof(it)];
-};
diff --git a/node_modules/core-js-pure/internals/get-iterator.js b/node_modules/core-js-pure/internals/get-iterator.js
deleted file mode 100644
index f7f7f8e..0000000
--- a/node_modules/core-js-pure/internals/get-iterator.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var anObject = require('../internals/an-object');
-var getIteratorMethod = require('../internals/get-iterator-method');
-
-module.exports = function (it) {
-  var iteratorMethod = getIteratorMethod(it);
-  if (typeof iteratorMethod != 'function') {
-    throw TypeError(String(it) + ' is not iterable');
-  } return anObject(iteratorMethod.call(it));
-};
diff --git a/node_modules/core-js-pure/internals/get-map-iterator.js b/node_modules/core-js-pure/internals/get-map-iterator.js
deleted file mode 100644
index 1c608f3..0000000
--- a/node_modules/core-js-pure/internals/get-map-iterator.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var IS_PURE = require('../internals/is-pure');
-var getIterator = require('../internals/get-iterator');
-
-module.exports = IS_PURE ? getIterator : function (it) {
-  // eslint-disable-next-line no-undef
-  return Map.prototype.entries.call(it);
-};
diff --git a/node_modules/core-js-pure/internals/get-set-iterator.js b/node_modules/core-js-pure/internals/get-set-iterator.js
deleted file mode 100644
index 4560c2e..0000000
--- a/node_modules/core-js-pure/internals/get-set-iterator.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var IS_PURE = require('../internals/is-pure');
-var getIterator = require('../internals/get-iterator');
-
-module.exports = IS_PURE ? getIterator : function (it) {
-  // eslint-disable-next-line no-undef
-  return Set.prototype.values.call(it);
-};
diff --git a/node_modules/core-js-pure/internals/global.js b/node_modules/core-js-pure/internals/global.js
deleted file mode 100644
index cf00638..0000000
--- a/node_modules/core-js-pure/internals/global.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var check = function (it) {
-  return it && it.Math == Math && it;
-};
-
-// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
-module.exports =
-  // eslint-disable-next-line no-undef
-  check(typeof globalThis == 'object' && globalThis) ||
-  check(typeof window == 'object' && window) ||
-  check(typeof self == 'object' && self) ||
-  check(typeof global == 'object' && global) ||
-  // eslint-disable-next-line no-new-func
-  Function('return this')();
diff --git a/node_modules/core-js-pure/internals/has.js b/node_modules/core-js-pure/internals/has.js
deleted file mode 100644
index 0925c41..0000000
--- a/node_modules/core-js-pure/internals/has.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var hasOwnProperty = {}.hasOwnProperty;
-
-module.exports = function (it, key) {
-  return hasOwnProperty.call(it, key);
-};
diff --git a/node_modules/core-js-pure/internals/hidden-keys.js b/node_modules/core-js-pure/internals/hidden-keys.js
deleted file mode 100644
index f053ebf..0000000
--- a/node_modules/core-js-pure/internals/hidden-keys.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = {};
diff --git a/node_modules/core-js-pure/internals/host-report-errors.js b/node_modules/core-js-pure/internals/host-report-errors.js
deleted file mode 100644
index dc84a6c..0000000
--- a/node_modules/core-js-pure/internals/host-report-errors.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var global = require('../internals/global');
-
-module.exports = function (a, b) {
-  var console = global.console;
-  if (console && console.error) {
-    arguments.length === 1 ? console.error(a) : console.error(a, b);
-  }
-};
diff --git a/node_modules/core-js-pure/internals/html.js b/node_modules/core-js-pure/internals/html.js
deleted file mode 100644
index 23defa6..0000000
--- a/node_modules/core-js-pure/internals/html.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var getBuiltIn = require('../internals/get-built-in');
-
-module.exports = getBuiltIn('document', 'documentElement');
diff --git a/node_modules/core-js-pure/internals/ie8-dom-define.js b/node_modules/core-js-pure/internals/ie8-dom-define.js
deleted file mode 100644
index 6696ff9..0000000
--- a/node_modules/core-js-pure/internals/ie8-dom-define.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var DESCRIPTORS = require('../internals/descriptors');
-var fails = require('../internals/fails');
-var createElement = require('../internals/document-create-element');
-
-// Thank's IE8 for his funny defineProperty
-module.exports = !DESCRIPTORS && !fails(function () {
-  return Object.defineProperty(createElement('div'), 'a', {
-    get: function () { return 7; }
-  }).a != 7;
-});
diff --git a/node_modules/core-js-pure/internals/ieee754.js b/node_modules/core-js-pure/internals/ieee754.js
deleted file mode 100644
index 3470d57..0000000
--- a/node_modules/core-js-pure/internals/ieee754.js
+++ /dev/null
@@ -1,88 +0,0 @@
-// IEEE754 conversions based on https://github.com/feross/ieee754
-// eslint-disable-next-line no-shadow-restricted-names
-var Infinity = 1 / 0;
-var abs = Math.abs;
-var pow = Math.pow;
-var floor = Math.floor;
-var log = Math.log;
-var LN2 = Math.LN2;
-
-var pack = function (number, mantissaLength, bytes) {
-  var buffer = new Array(bytes);
-  var exponentLength = bytes * 8 - mantissaLength - 1;
-  var eMax = (1 << exponentLength) - 1;
-  var eBias = eMax >> 1;
-  var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0;
-  var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;
-  var index = 0;
-  var exponent, mantissa, c;
-  number = abs(number);
-  // eslint-disable-next-line no-self-compare
-  if (number != number || number === Infinity) {
-    // eslint-disable-next-line no-self-compare
-    mantissa = number != number ? 1 : 0;
-    exponent = eMax;
-  } else {
-    exponent = floor(log(number) / LN2);
-    if (number * (c = pow(2, -exponent)) < 1) {
-      exponent--;
-      c *= 2;
-    }
-    if (exponent + eBias >= 1) {
-      number += rt / c;
-    } else {
-      number += rt * pow(2, 1 - eBias);
-    }
-    if (number * c >= 2) {
-      exponent++;
-      c /= 2;
-    }
-    if (exponent + eBias >= eMax) {
-      mantissa = 0;
-      exponent = eMax;
-    } else if (exponent + eBias >= 1) {
-      mantissa = (number * c - 1) * pow(2, mantissaLength);
-      exponent = exponent + eBias;
-    } else {
-      mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength);
-      exponent = 0;
-    }
-  }
-  for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);
-  exponent = exponent << mantissaLength | mantissa;
-  exponentLength += mantissaLength;
-  for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);
-  buffer[--index] |= sign * 128;
-  return buffer;
-};
-
-var unpack = function (buffer, mantissaLength) {
-  var bytes = buffer.length;
-  var exponentLength = bytes * 8 - mantissaLength - 1;
-  var eMax = (1 << exponentLength) - 1;
-  var eBias = eMax >> 1;
-  var nBits = exponentLength - 7;
-  var index = bytes - 1;
-  var sign = buffer[index--];
-  var exponent = sign & 127;
-  var mantissa;
-  sign >>= 7;
-  for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);
-  mantissa = exponent & (1 << -nBits) - 1;
-  exponent >>= -nBits;
-  nBits += mantissaLength;
-  for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);
-  if (exponent === 0) {
-    exponent = 1 - eBias;
-  } else if (exponent === eMax) {
-    return mantissa ? NaN : sign ? -Infinity : Infinity;
-  } else {
-    mantissa = mantissa + pow(2, mantissaLength);
-    exponent = exponent - eBias;
-  } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength);
-};
-
-module.exports = {
-  pack: pack,
-  unpack: unpack
-};
diff --git a/node_modules/core-js-pure/internals/indexed-object.js b/node_modules/core-js-pure/internals/indexed-object.js
deleted file mode 100644
index 2aa25b5..0000000
--- a/node_modules/core-js-pure/internals/indexed-object.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var fails = require('../internals/fails');
-var classof = require('../internals/classof-raw');
-
-var split = ''.split;
-
-// fallback for non-array-like ES3 and non-enumerable old V8 strings
-module.exports = fails(function () {
-  // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
-  // eslint-disable-next-line no-prototype-builtins
-  return !Object('z').propertyIsEnumerable(0);
-}) ? function (it) {
-  return classof(it) == 'String' ? split.call(it, '') : Object(it);
-} : Object;
diff --git a/node_modules/core-js-pure/internals/inherit-if-required.js b/node_modules/core-js-pure/internals/inherit-if-required.js
deleted file mode 100644
index a033b0c..0000000
--- a/node_modules/core-js-pure/internals/inherit-if-required.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var isObject = require('../internals/is-object');
-var setPrototypeOf = require('../internals/object-set-prototype-of');
-
-// makes subclassing work correct for wrapped built-ins
-module.exports = function ($this, dummy, Wrapper) {
-  var NewTarget, NewTargetPrototype;
-  if (
-    // it can work only with native `setPrototypeOf`
-    setPrototypeOf &&
-    // we haven't completely correct pre-ES6 way for getting `new.target`, so use this
-    typeof (NewTarget = dummy.constructor) == 'function' &&
-    NewTarget !== Wrapper &&
-    isObject(NewTargetPrototype = NewTarget.prototype) &&
-    NewTargetPrototype !== Wrapper.prototype
-  ) setPrototypeOf($this, NewTargetPrototype);
-  return $this;
-};
diff --git a/node_modules/core-js-pure/internals/inspect-source.js b/node_modules/core-js-pure/internals/inspect-source.js
deleted file mode 100644
index 9577809..0000000
--- a/node_modules/core-js-pure/internals/inspect-source.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var store = require('../internals/shared-store');
-
-var functionToString = Function.toString;
-
-// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper
-if (typeof store.inspectSource != 'function') {
-  store.inspectSource = function (it) {
-    return functionToString.call(it);
-  };
-}
-
-module.exports = store.inspectSource;
diff --git a/node_modules/core-js-pure/internals/internal-metadata.js b/node_modules/core-js-pure/internals/internal-metadata.js
deleted file mode 100644
index d70c48c..0000000
--- a/node_modules/core-js-pure/internals/internal-metadata.js
+++ /dev/null
@@ -1,61 +0,0 @@
-var hiddenKeys = require('../internals/hidden-keys');
-var isObject = require('../internals/is-object');
-var has = require('../internals/has');
-var defineProperty = require('../internals/object-define-property').f;
-var uid = require('../internals/uid');
-var FREEZING = require('../internals/freezing');
-
-var METADATA = uid('meta');
-var id = 0;
-
-var isExtensible = Object.isExtensible || function () {
-  return true;
-};
-
-var setMetadata = function (it) {
-  defineProperty(it, METADATA, { value: {
-    objectID: 'O' + ++id, // object ID
-    weakData: {}          // weak collections IDs
-  } });
-};
-
-var fastKey = function (it, create) {
-  // return a primitive with prefix
-  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
-  if (!has(it, METADATA)) {
-    // can't set metadata to uncaught frozen object
-    if (!isExtensible(it)) return 'F';
-    // not necessary to add metadata
-    if (!create) return 'E';
-    // add missing metadata
-    setMetadata(it);
-  // return object ID
-  } return it[METADATA].objectID;
-};
-
-var getWeakData = function (it, create) {
-  if (!has(it, METADATA)) {
-    // can't set metadata to uncaught frozen object
-    if (!isExtensible(it)) return true;
-    // not necessary to add metadata
-    if (!create) return false;
-    // add missing metadata
-    setMetadata(it);
-  // return the store of weak collections IDs
-  } return it[METADATA].weakData;
-};
-
-// add metadata on freeze-family methods calling
-var onFreeze = function (it) {
-  if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);
-  return it;
-};
-
-var meta = module.exports = {
-  REQUIRED: false,
-  fastKey: fastKey,
-  getWeakData: getWeakData,
-  onFreeze: onFreeze
-};
-
-hiddenKeys[METADATA] = true;
diff --git a/node_modules/core-js-pure/internals/internal-state.js b/node_modules/core-js-pure/internals/internal-state.js
deleted file mode 100644
index 18c402d..0000000
--- a/node_modules/core-js-pure/internals/internal-state.js
+++ /dev/null
@@ -1,61 +0,0 @@
-var NATIVE_WEAK_MAP = require('../internals/native-weak-map');
-var global = require('../internals/global');
-var isObject = require('../internals/is-object');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var objectHas = require('../internals/has');
-var sharedKey = require('../internals/shared-key');
-var hiddenKeys = require('../internals/hidden-keys');
-
-var WeakMap = global.WeakMap;
-var set, get, has;
-
-var enforce = function (it) {
-  return has(it) ? get(it) : set(it, {});
-};
-
-var getterFor = function (TYPE) {
-  return function (it) {
-    var state;
-    if (!isObject(it) || (state = get(it)).type !== TYPE) {
-      throw TypeError('Incompatible receiver, ' + TYPE + ' required');
-    } return state;
-  };
-};
-
-if (NATIVE_WEAK_MAP) {
-  var store = new WeakMap();
-  var wmget = store.get;
-  var wmhas = store.has;
-  var wmset = store.set;
-  set = function (it, metadata) {
-    wmset.call(store, it, metadata);
-    return metadata;
-  };
-  get = function (it) {
-    return wmget.call(store, it) || {};
-  };
-  has = function (it) {
-    return wmhas.call(store, it);
-  };
-} else {
-  var STATE = sharedKey('state');
-  hiddenKeys[STATE] = true;
-  set = function (it, metadata) {
-    createNonEnumerableProperty(it, STATE, metadata);
-    return metadata;
-  };
-  get = function (it) {
-    return objectHas(it, STATE) ? it[STATE] : {};
-  };
-  has = function (it) {
-    return objectHas(it, STATE);
-  };
-}
-
-module.exports = {
-  set: set,
-  get: get,
-  has: has,
-  enforce: enforce,
-  getterFor: getterFor
-};
diff --git a/node_modules/core-js-pure/internals/is-array-iterator-method.js b/node_modules/core-js-pure/internals/is-array-iterator-method.js
deleted file mode 100644
index ab0ebe1..0000000
--- a/node_modules/core-js-pure/internals/is-array-iterator-method.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var Iterators = require('../internals/iterators');
-
-var ITERATOR = wellKnownSymbol('iterator');
-var ArrayPrototype = Array.prototype;
-
-// check on default Array iterator
-module.exports = function (it) {
-  return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);
-};
diff --git a/node_modules/core-js-pure/internals/is-array.js b/node_modules/core-js-pure/internals/is-array.js
deleted file mode 100644
index 757515d..0000000
--- a/node_modules/core-js-pure/internals/is-array.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var classof = require('../internals/classof-raw');
-
-// `IsArray` abstract operation
-// https://tc39.github.io/ecma262/#sec-isarray
-module.exports = Array.isArray || function isArray(arg) {
-  return classof(arg) == 'Array';
-};
diff --git a/node_modules/core-js-pure/internals/is-forced.js b/node_modules/core-js-pure/internals/is-forced.js
deleted file mode 100644
index cae014f..0000000
--- a/node_modules/core-js-pure/internals/is-forced.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var fails = require('../internals/fails');
-
-var replacement = /#|\.prototype\./;
-
-var isForced = function (feature, detection) {
-  var value = data[normalize(feature)];
-  return value == POLYFILL ? true
-    : value == NATIVE ? false
-    : typeof detection == 'function' ? fails(detection)
-    : !!detection;
-};
-
-var normalize = isForced.normalize = function (string) {
-  return String(string).replace(replacement, '.').toLowerCase();
-};
-
-var data = isForced.data = {};
-var NATIVE = isForced.NATIVE = 'N';
-var POLYFILL = isForced.POLYFILL = 'P';
-
-module.exports = isForced;
diff --git a/node_modules/core-js-pure/internals/is-integer.js b/node_modules/core-js-pure/internals/is-integer.js
deleted file mode 100644
index df16086..0000000
--- a/node_modules/core-js-pure/internals/is-integer.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var isObject = require('../internals/is-object');
-
-var floor = Math.floor;
-
-// `Number.isInteger` method implementation
-// https://tc39.github.io/ecma262/#sec-number.isinteger
-module.exports = function isInteger(it) {
-  return !isObject(it) && isFinite(it) && floor(it) === it;
-};
diff --git a/node_modules/core-js-pure/internals/is-iterable.js b/node_modules/core-js-pure/internals/is-iterable.js
deleted file mode 100644
index f33bb2d..0000000
--- a/node_modules/core-js-pure/internals/is-iterable.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var classof = require('../internals/classof');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var Iterators = require('../internals/iterators');
-
-var ITERATOR = wellKnownSymbol('iterator');
-
-module.exports = function (it) {
-  var O = Object(it);
-  return O[ITERATOR] !== undefined
-    || '@@iterator' in O
-    // eslint-disable-next-line no-prototype-builtins
-    || Iterators.hasOwnProperty(classof(O));
-};
diff --git a/node_modules/core-js-pure/internals/is-object.js b/node_modules/core-js-pure/internals/is-object.js
deleted file mode 100644
index dda6e04..0000000
--- a/node_modules/core-js-pure/internals/is-object.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = function (it) {
-  return typeof it === 'object' ? it !== null : typeof it === 'function';
-};
diff --git a/node_modules/core-js-pure/internals/is-pure.js b/node_modules/core-js-pure/internals/is-pure.js
deleted file mode 100644
index ec01c2c..0000000
--- a/node_modules/core-js-pure/internals/is-pure.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = true;
diff --git a/node_modules/core-js-pure/internals/is-regexp.js b/node_modules/core-js-pure/internals/is-regexp.js
deleted file mode 100644
index e2c7247..0000000
--- a/node_modules/core-js-pure/internals/is-regexp.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var isObject = require('../internals/is-object');
-var classof = require('../internals/classof-raw');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var MATCH = wellKnownSymbol('match');
-
-// `IsRegExp` abstract operation
-// https://tc39.github.io/ecma262/#sec-isregexp
-module.exports = function (it) {
-  var isRegExp;
-  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');
-};
diff --git a/node_modules/core-js-pure/internals/iterate.js b/node_modules/core-js-pure/internals/iterate.js
deleted file mode 100644
index a68c416..0000000
--- a/node_modules/core-js-pure/internals/iterate.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var anObject = require('../internals/an-object');
-var isArrayIteratorMethod = require('../internals/is-array-iterator-method');
-var toLength = require('../internals/to-length');
-var bind = require('../internals/function-bind-context');
-var getIteratorMethod = require('../internals/get-iterator-method');
-var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');
-
-var Result = function (stopped, result) {
-  this.stopped = stopped;
-  this.result = result;
-};
-
-var iterate = module.exports = function (iterable, fn, that, AS_ENTRIES, IS_ITERATOR) {
-  var boundFunction = bind(fn, that, AS_ENTRIES ? 2 : 1);
-  var iterator, iterFn, index, length, result, next, step;
-
-  if (IS_ITERATOR) {
-    iterator = iterable;
-  } else {
-    iterFn = getIteratorMethod(iterable);
-    if (typeof iterFn != 'function') throw TypeError('Target is not iterable');
-    // optimisation for array iterators
-    if (isArrayIteratorMethod(iterFn)) {
-      for (index = 0, length = toLength(iterable.length); length > index; index++) {
-        result = AS_ENTRIES
-          ? boundFunction(anObject(step = iterable[index])[0], step[1])
-          : boundFunction(iterable[index]);
-        if (result && result instanceof Result) return result;
-      } return new Result(false);
-    }
-    iterator = iterFn.call(iterable);
-  }
-
-  next = iterator.next;
-  while (!(step = next.call(iterator)).done) {
-    result = callWithSafeIterationClosing(iterator, boundFunction, step.value, AS_ENTRIES);
-    if (typeof result == 'object' && result && result instanceof Result) return result;
-  } return new Result(false);
-};
-
-iterate.stop = function (result) {
-  return new Result(true, result);
-};
diff --git a/node_modules/core-js-pure/internals/iterator-create-proxy.js b/node_modules/core-js-pure/internals/iterator-create-proxy.js
deleted file mode 100644
index 951db73..0000000
--- a/node_modules/core-js-pure/internals/iterator-create-proxy.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict';
-var path = require('../internals/path');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var create = require('../internals/object-create');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var redefineAll = require('../internals/redefine-all');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var InternalStateModule = require('../internals/internal-state');
-
-var setInternalState = InternalStateModule.set;
-var getInternalState = InternalStateModule.get;
-
-var TO_STRING_TAG = wellKnownSymbol('toStringTag');
-
-var $return = function (value) {
-  var iterator = getInternalState(this).iterator;
-  var $$return = iterator['return'];
-  return $$return === undefined ? { done: true, value: value } : anObject($$return.call(iterator, value));
-};
-
-var $throw = function (value) {
-  var iterator = getInternalState(this).iterator;
-  var $$throw = iterator['throw'];
-  if ($$throw === undefined) throw value;
-  return $$throw.call(iterator, value);
-};
-
-module.exports = function (nextHandler, IS_ITERATOR) {
-  var IteratorProxy = function Iterator(state) {
-    state.next = aFunction(state.iterator.next);
-    state.done = false;
-    setInternalState(this, state);
-  };
-
-  IteratorProxy.prototype = redefineAll(create(path.Iterator.prototype), {
-    next: function next() {
-      var state = getInternalState(this);
-      var result = state.done ? undefined : nextHandler.apply(state, arguments);
-      return { done: state.done, value: result };
-    },
-    'return': $return,
-    'throw': $throw
-  });
-
-  if (!IS_ITERATOR) {
-    createNonEnumerableProperty(IteratorProxy.prototype, TO_STRING_TAG, 'Generator');
-  }
-
-  return IteratorProxy;
-};
diff --git a/node_modules/core-js-pure/internals/iterators-core.js b/node_modules/core-js-pure/internals/iterators-core.js
deleted file mode 100644
index fccca93..0000000
--- a/node_modules/core-js-pure/internals/iterators-core.js
+++ /dev/null
@@ -1,37 +0,0 @@
-'use strict';
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var has = require('../internals/has');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var IS_PURE = require('../internals/is-pure');
-
-var ITERATOR = wellKnownSymbol('iterator');
-var BUGGY_SAFARI_ITERATORS = false;
-
-var returnThis = function () { return this; };
-
-// `%IteratorPrototype%` object
-// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object
-var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;
-
-if ([].keys) {
-  arrayIterator = [].keys();
-  // Safari 8 has buggy iterators w/o `next`
-  if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;
-  else {
-    PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));
-    if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;
-  }
-}
-
-if (IteratorPrototype == undefined) IteratorPrototype = {};
-
-// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
-if (!IS_PURE && !has(IteratorPrototype, ITERATOR)) {
-  createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);
-}
-
-module.exports = {
-  IteratorPrototype: IteratorPrototype,
-  BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS
-};
diff --git a/node_modules/core-js-pure/internals/iterators.js b/node_modules/core-js-pure/internals/iterators.js
deleted file mode 100644
index f053ebf..0000000
--- a/node_modules/core-js-pure/internals/iterators.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = {};
diff --git a/node_modules/core-js-pure/internals/map-upsert.js b/node_modules/core-js-pure/internals/map-upsert.js
deleted file mode 100644
index 2c51e78..0000000
--- a/node_modules/core-js-pure/internals/map-upsert.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-var anObject = require('../internals/an-object');
-
-// `Map.prototype.upsert` method
-// https://github.com/thumbsupep/proposal-upsert
-module.exports = function upsert(key, updateFn /* , insertFn */) {
-  var map = anObject(this);
-  var insertFn = arguments.length > 2 ? arguments[2] : undefined;
-  var value;
-  if (typeof updateFn != 'function' && typeof insertFn != 'function') {
-    throw TypeError('At least one callback required');
-  }
-  if (map.has(key)) {
-    value = map.get(key);
-    if (typeof updateFn == 'function') {
-      value = updateFn(value);
-      map.set(key, value);
-    }
-  } else if (typeof insertFn == 'function') {
-    value = insertFn();
-    map.set(key, value);
-  } return value;
-};
diff --git a/node_modules/core-js-pure/internals/math-expm1.js b/node_modules/core-js-pure/internals/math-expm1.js
deleted file mode 100644
index 3a14c07..0000000
--- a/node_modules/core-js-pure/internals/math-expm1.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var nativeExpm1 = Math.expm1;
-var exp = Math.exp;
-
-// `Math.expm1` method implementation
-// https://tc39.github.io/ecma262/#sec-math.expm1
-module.exports = (!nativeExpm1
-  // Old FF bug
-  || nativeExpm1(10) > 22025.465794806719 || nativeExpm1(10) < 22025.4657948067165168
-  // Tor Browser bug
-  || nativeExpm1(-2e-17) != -2e-17
-) ? function expm1(x) {
-  return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : exp(x) - 1;
-} : nativeExpm1;
diff --git a/node_modules/core-js-pure/internals/math-fround.js b/node_modules/core-js-pure/internals/math-fround.js
deleted file mode 100644
index 0642e31..0000000
--- a/node_modules/core-js-pure/internals/math-fround.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var sign = require('../internals/math-sign');
-
-var abs = Math.abs;
-var pow = Math.pow;
-var EPSILON = pow(2, -52);
-var EPSILON32 = pow(2, -23);
-var MAX32 = pow(2, 127) * (2 - EPSILON32);
-var MIN32 = pow(2, -126);
-
-var roundTiesToEven = function (n) {
-  return n + 1 / EPSILON - 1 / EPSILON;
-};
-
-// `Math.fround` method implementation
-// https://tc39.github.io/ecma262/#sec-math.fround
-module.exports = Math.fround || function fround(x) {
-  var $abs = abs(x);
-  var $sign = sign(x);
-  var a, result;
-  if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
-  a = (1 + EPSILON32 / EPSILON) * $abs;
-  result = a - (a - $abs);
-  // eslint-disable-next-line no-self-compare
-  if (result > MAX32 || result != result) return $sign * Infinity;
-  return $sign * result;
-};
diff --git a/node_modules/core-js-pure/internals/math-log1p.js b/node_modules/core-js-pure/internals/math-log1p.js
deleted file mode 100644
index 3d2545c..0000000
--- a/node_modules/core-js-pure/internals/math-log1p.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var log = Math.log;
-
-// `Math.log1p` method implementation
-// https://tc39.github.io/ecma262/#sec-math.log1p
-module.exports = Math.log1p || function log1p(x) {
-  return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : log(1 + x);
-};
diff --git a/node_modules/core-js-pure/internals/math-scale.js b/node_modules/core-js-pure/internals/math-scale.js
deleted file mode 100644
index 5928862..0000000
--- a/node_modules/core-js-pure/internals/math-scale.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// `Math.scale` method implementation
-// https://rwaldron.github.io/proposal-math-extensions/
-module.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) {
-  if (
-    arguments.length === 0
-      /* eslint-disable no-self-compare */
-      || x != x
-      || inLow != inLow
-      || inHigh != inHigh
-      || outLow != outLow
-      || outHigh != outHigh
-      /* eslint-enable no-self-compare */
-  ) return NaN;
-  if (x === Infinity || x === -Infinity) return x;
-  return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow;
-};
diff --git a/node_modules/core-js-pure/internals/math-sign.js b/node_modules/core-js-pure/internals/math-sign.js
deleted file mode 100644
index 9260696..0000000
--- a/node_modules/core-js-pure/internals/math-sign.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// `Math.sign` method implementation
-// https://tc39.github.io/ecma262/#sec-math.sign
-module.exports = Math.sign || function sign(x) {
-  // eslint-disable-next-line no-self-compare
-  return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
-};
diff --git a/node_modules/core-js-pure/internals/microtask.js b/node_modules/core-js-pure/internals/microtask.js
deleted file mode 100644
index 6df180c..0000000
--- a/node_modules/core-js-pure/internals/microtask.js
+++ /dev/null
@@ -1,78 +0,0 @@
-var global = require('../internals/global');
-var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
-var classof = require('../internals/classof-raw');
-var macrotask = require('../internals/task').set;
-var IS_IOS = require('../internals/engine-is-ios');
-
-var MutationObserver = global.MutationObserver || global.WebKitMutationObserver;
-var process = global.process;
-var Promise = global.Promise;
-var IS_NODE = classof(process) == 'process';
-// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`
-var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');
-var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;
-
-var flush, head, last, notify, toggle, node, promise, then;
-
-// modern engines have queueMicrotask method
-if (!queueMicrotask) {
-  flush = function () {
-    var parent, fn;
-    if (IS_NODE && (parent = process.domain)) parent.exit();
-    while (head) {
-      fn = head.fn;
-      head = head.next;
-      try {
-        fn();
-      } catch (error) {
-        if (head) notify();
-        else last = undefined;
-        throw error;
-      }
-    } last = undefined;
-    if (parent) parent.enter();
-  };
-
-  // Node.js
-  if (IS_NODE) {
-    notify = function () {
-      process.nextTick(flush);
-    };
-  // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339
-  } else if (MutationObserver && !IS_IOS) {
-    toggle = true;
-    node = document.createTextNode('');
-    new MutationObserver(flush).observe(node, { characterData: true });
-    notify = function () {
-      node.data = toggle = !toggle;
-    };
-  // environments with maybe non-completely correct, but existent Promise
-  } else if (Promise && Promise.resolve) {
-    // Promise.resolve without an argument throws an error in LG WebOS 2
-    promise = Promise.resolve(undefined);
-    then = promise.then;
-    notify = function () {
-      then.call(promise, flush);
-    };
-  // for other environments - macrotask based on:
-  // - setImmediate
-  // - MessageChannel
-  // - window.postMessag
-  // - onreadystatechange
-  // - setTimeout
-  } else {
-    notify = function () {
-      // strange IE + webpack dev server bug - use .call(global)
-      macrotask.call(global, flush);
-    };
-  }
-}
-
-module.exports = queueMicrotask || function (fn) {
-  var task = { fn: fn, next: undefined };
-  if (last) last.next = task;
-  if (!head) {
-    head = task;
-    notify();
-  } last = task;
-};
diff --git a/node_modules/core-js-pure/internals/native-promise-constructor.js b/node_modules/core-js-pure/internals/native-promise-constructor.js
deleted file mode 100644
index dae3822..0000000
--- a/node_modules/core-js-pure/internals/native-promise-constructor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var global = require('../internals/global');
-
-module.exports = global.Promise;
diff --git a/node_modules/core-js-pure/internals/native-symbol.js b/node_modules/core-js-pure/internals/native-symbol.js
deleted file mode 100644
index bb22d6c..0000000
--- a/node_modules/core-js-pure/internals/native-symbol.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var fails = require('../internals/fails');
-
-module.exports = !!Object.getOwnPropertySymbols && !fails(function () {
-  // Chrome 38 Symbol has incorrect toString conversion
-  // eslint-disable-next-line no-undef
-  return !String(Symbol());
-});
diff --git a/node_modules/core-js-pure/internals/native-url.js b/node_modules/core-js-pure/internals/native-url.js
deleted file mode 100644
index b9ac587..0000000
--- a/node_modules/core-js-pure/internals/native-url.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var fails = require('../internals/fails');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var IS_PURE = require('../internals/is-pure');
-
-var ITERATOR = wellKnownSymbol('iterator');
-
-module.exports = !fails(function () {
-  var url = new URL('b?a=1&b=2&c=3', 'http://a');
-  var searchParams = url.searchParams;
-  var result = '';
-  url.pathname = 'c%20d';
-  searchParams.forEach(function (value, key) {
-    searchParams['delete']('b');
-    result += key + value;
-  });
-  return (IS_PURE && !url.toJSON)
-    || !searchParams.sort
-    || url.href !== 'http://a/c%20d?a=1&c=3'
-    || searchParams.get('c') !== '3'
-    || String(new URLSearchParams('?a=1')) !== 'a=1'
-    || !searchParams[ITERATOR]
-    // throws in Edge
-    || new URL('https://a@b').username !== 'a'
-    || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'
-    // not punycoded in Edge
-    || new URL('http://тест').host !== 'xn--e1aybc'
-    // not escaped in Chrome 62-
-    || new URL('http://a#б').hash !== '#%D0%B1'
-    // fails in Chrome 66-
-    || result !== 'a1c3'
-    // throws in Safari
-    || new URL('http://x', undefined).host !== 'x';
-});
diff --git a/node_modules/core-js-pure/internals/native-weak-map.js b/node_modules/core-js-pure/internals/native-weak-map.js
deleted file mode 100644
index e241821..0000000
--- a/node_modules/core-js-pure/internals/native-weak-map.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var global = require('../internals/global');
-var inspectSource = require('../internals/inspect-source');
-
-var WeakMap = global.WeakMap;
-
-module.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));
diff --git a/node_modules/core-js-pure/internals/new-promise-capability.js b/node_modules/core-js-pure/internals/new-promise-capability.js
deleted file mode 100644
index 394edc9..0000000
--- a/node_modules/core-js-pure/internals/new-promise-capability.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-var aFunction = require('../internals/a-function');
-
-var PromiseCapability = function (C) {
-  var resolve, reject;
-  this.promise = new C(function ($$resolve, $$reject) {
-    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
-    resolve = $$resolve;
-    reject = $$reject;
-  });
-  this.resolve = aFunction(resolve);
-  this.reject = aFunction(reject);
-};
-
-// 25.4.1.5 NewPromiseCapability(C)
-module.exports.f = function (C) {
-  return new PromiseCapability(C);
-};
diff --git a/node_modules/core-js-pure/internals/not-a-regexp.js b/node_modules/core-js-pure/internals/not-a-regexp.js
deleted file mode 100644
index 7bb4e9c..0000000
--- a/node_modules/core-js-pure/internals/not-a-regexp.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var isRegExp = require('../internals/is-regexp');
-
-module.exports = function (it) {
-  if (isRegExp(it)) {
-    throw TypeError("The method doesn't accept regular expressions");
-  } return it;
-};
diff --git a/node_modules/core-js-pure/internals/number-is-finite.js b/node_modules/core-js-pure/internals/number-is-finite.js
deleted file mode 100644
index 4b26c4a..0000000
--- a/node_modules/core-js-pure/internals/number-is-finite.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var global = require('../internals/global');
-
-var globalIsFinite = global.isFinite;
-
-// `Number.isFinite` method
-// https://tc39.github.io/ecma262/#sec-number.isfinite
-module.exports = Number.isFinite || function isFinite(it) {
-  return typeof it == 'number' && globalIsFinite(it);
-};
diff --git a/node_modules/core-js-pure/internals/number-parse-float.js b/node_modules/core-js-pure/internals/number-parse-float.js
deleted file mode 100644
index 0ff341d..0000000
--- a/node_modules/core-js-pure/internals/number-parse-float.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var global = require('../internals/global');
-var trim = require('../internals/string-trim').trim;
-var whitespaces = require('../internals/whitespaces');
-
-var $parseFloat = global.parseFloat;
-var FORCED = 1 / $parseFloat(whitespaces + '-0') !== -Infinity;
-
-// `parseFloat` method
-// https://tc39.github.io/ecma262/#sec-parsefloat-string
-module.exports = FORCED ? function parseFloat(string) {
-  var trimmedString = trim(String(string));
-  var result = $parseFloat(trimmedString);
-  return result === 0 && trimmedString.charAt(0) == '-' ? -0 : result;
-} : $parseFloat;
diff --git a/node_modules/core-js-pure/internals/number-parse-int.js b/node_modules/core-js-pure/internals/number-parse-int.js
deleted file mode 100644
index 11b8232..0000000
--- a/node_modules/core-js-pure/internals/number-parse-int.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var global = require('../internals/global');
-var trim = require('../internals/string-trim').trim;
-var whitespaces = require('../internals/whitespaces');
-
-var $parseInt = global.parseInt;
-var hex = /^[+-]?0[Xx]/;
-var FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22;
-
-// `parseInt` method
-// https://tc39.github.io/ecma262/#sec-parseint-string-radix
-module.exports = FORCED ? function parseInt(string, radix) {
-  var S = trim(String(string));
-  return $parseInt(S, (radix >>> 0) || (hex.test(S) ? 16 : 10));
-} : $parseInt;
diff --git a/node_modules/core-js-pure/internals/object-assign.js b/node_modules/core-js-pure/internals/object-assign.js
deleted file mode 100644
index f15d000..0000000
--- a/node_modules/core-js-pure/internals/object-assign.js
+++ /dev/null
@@ -1,52 +0,0 @@
-'use strict';
-var DESCRIPTORS = require('../internals/descriptors');
-var fails = require('../internals/fails');
-var objectKeys = require('../internals/object-keys');
-var getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');
-var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');
-var toObject = require('../internals/to-object');
-var IndexedObject = require('../internals/indexed-object');
-
-var nativeAssign = Object.assign;
-var defineProperty = Object.defineProperty;
-
-// `Object.assign` method
-// https://tc39.github.io/ecma262/#sec-object.assign
-module.exports = !nativeAssign || fails(function () {
-  // should have correct order of operations (Edge bug)
-  if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {
-    enumerable: true,
-    get: function () {
-      defineProperty(this, 'b', {
-        value: 3,
-        enumerable: false
-      });
-    }
-  }), { b: 2 })).b !== 1) return true;
-  // should work with symbols and should have deterministic property order (V8 bug)
-  var A = {};
-  var B = {};
-  // eslint-disable-next-line no-undef
-  var symbol = Symbol();
-  var alphabet = 'abcdefghijklmnopqrst';
-  A[symbol] = 7;
-  alphabet.split('').forEach(function (chr) { B[chr] = chr; });
-  return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;
-}) ? function assign(target, source) { // eslint-disable-line no-unused-vars
-  var T = toObject(target);
-  var argumentsLength = arguments.length;
-  var index = 1;
-  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
-  var propertyIsEnumerable = propertyIsEnumerableModule.f;
-  while (argumentsLength > index) {
-    var S = IndexedObject(arguments[index++]);
-    var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);
-    var length = keys.length;
-    var j = 0;
-    var key;
-    while (length > j) {
-      key = keys[j++];
-      if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];
-    }
-  } return T;
-} : nativeAssign;
diff --git a/node_modules/core-js-pure/internals/object-create.js b/node_modules/core-js-pure/internals/object-create.js
deleted file mode 100644
index 346d108..0000000
--- a/node_modules/core-js-pure/internals/object-create.js
+++ /dev/null
@@ -1,78 +0,0 @@
-var anObject = require('../internals/an-object');
-var defineProperties = require('../internals/object-define-properties');
-var enumBugKeys = require('../internals/enum-bug-keys');
-var hiddenKeys = require('../internals/hidden-keys');
-var html = require('../internals/html');
-var documentCreateElement = require('../internals/document-create-element');
-var sharedKey = require('../internals/shared-key');
-
-var GT = '>';
-var LT = '<';
-var PROTOTYPE = 'prototype';
-var SCRIPT = 'script';
-var IE_PROTO = sharedKey('IE_PROTO');
-
-var EmptyConstructor = function () { /* empty */ };
-
-var scriptTag = function (content) {
-  return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;
-};
-
-// Create object with fake `null` prototype: use ActiveX Object with cleared prototype
-var NullProtoObjectViaActiveX = function (activeXDocument) {
-  activeXDocument.write(scriptTag(''));
-  activeXDocument.close();
-  var temp = activeXDocument.parentWindow.Object;
-  activeXDocument = null; // avoid memory leak
-  return temp;
-};
-
-// Create object with fake `null` prototype: use iframe Object with cleared prototype
-var NullProtoObjectViaIFrame = function () {
-  // Thrash, waste and sodomy: IE GC bug
-  var iframe = documentCreateElement('iframe');
-  var JS = 'java' + SCRIPT + ':';
-  var iframeDocument;
-  iframe.style.display = 'none';
-  html.appendChild(iframe);
-  // https://github.com/zloirock/core-js/issues/475
-  iframe.src = String(JS);
-  iframeDocument = iframe.contentWindow.document;
-  iframeDocument.open();
-  iframeDocument.write(scriptTag('document.F=Object'));
-  iframeDocument.close();
-  return iframeDocument.F;
-};
-
-// Check for document.domain and active x support
-// No need to use active x approach when document.domain is not set
-// see https://github.com/es-shims/es5-shim/issues/150
-// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346
-// avoid IE GC bug
-var activeXDocument;
-var NullProtoObject = function () {
-  try {
-    /* global ActiveXObject */
-    activeXDocument = document.domain && new ActiveXObject('htmlfile');
-  } catch (error) { /* ignore */ }
-  NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();
-  var length = enumBugKeys.length;
-  while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];
-  return NullProtoObject();
-};
-
-hiddenKeys[IE_PROTO] = true;
-
-// `Object.create` method
-// https://tc39.github.io/ecma262/#sec-object.create
-module.exports = Object.create || function create(O, Properties) {
-  var result;
-  if (O !== null) {
-    EmptyConstructor[PROTOTYPE] = anObject(O);
-    result = new EmptyConstructor();
-    EmptyConstructor[PROTOTYPE] = null;
-    // add "__proto__" for Object.getPrototypeOf polyfill
-    result[IE_PROTO] = O;
-  } else result = NullProtoObject();
-  return Properties === undefined ? result : defineProperties(result, Properties);
-};
diff --git a/node_modules/core-js-pure/internals/object-define-properties.js b/node_modules/core-js-pure/internals/object-define-properties.js
deleted file mode 100644
index c2b5339..0000000
--- a/node_modules/core-js-pure/internals/object-define-properties.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var DESCRIPTORS = require('../internals/descriptors');
-var definePropertyModule = require('../internals/object-define-property');
-var anObject = require('../internals/an-object');
-var objectKeys = require('../internals/object-keys');
-
-// `Object.defineProperties` method
-// https://tc39.github.io/ecma262/#sec-object.defineproperties
-module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {
-  anObject(O);
-  var keys = objectKeys(Properties);
-  var length = keys.length;
-  var index = 0;
-  var key;
-  while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);
-  return O;
-};
diff --git a/node_modules/core-js-pure/internals/object-define-property.js b/node_modules/core-js-pure/internals/object-define-property.js
deleted file mode 100644
index 375f20f..0000000
--- a/node_modules/core-js-pure/internals/object-define-property.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var DESCRIPTORS = require('../internals/descriptors');
-var IE8_DOM_DEFINE = require('../internals/ie8-dom-define');
-var anObject = require('../internals/an-object');
-var toPrimitive = require('../internals/to-primitive');
-
-var nativeDefineProperty = Object.defineProperty;
-
-// `Object.defineProperty` method
-// https://tc39.github.io/ecma262/#sec-object.defineproperty
-exports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {
-  anObject(O);
-  P = toPrimitive(P, true);
-  anObject(Attributes);
-  if (IE8_DOM_DEFINE) try {
-    return nativeDefineProperty(O, P, Attributes);
-  } catch (error) { /* empty */ }
-  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');
-  if ('value' in Attributes) O[P] = Attributes.value;
-  return O;
-};
diff --git a/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js b/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js
deleted file mode 100644
index acdae01..0000000
--- a/node_modules/core-js-pure/internals/object-get-own-property-descriptor.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var DESCRIPTORS = require('../internals/descriptors');
-var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');
-var createPropertyDescriptor = require('../internals/create-property-descriptor');
-var toIndexedObject = require('../internals/to-indexed-object');
-var toPrimitive = require('../internals/to-primitive');
-var has = require('../internals/has');
-var IE8_DOM_DEFINE = require('../internals/ie8-dom-define');
-
-var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
-
-// `Object.getOwnPropertyDescriptor` method
-// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor
-exports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {
-  O = toIndexedObject(O);
-  P = toPrimitive(P, true);
-  if (IE8_DOM_DEFINE) try {
-    return nativeGetOwnPropertyDescriptor(O, P);
-  } catch (error) { /* empty */ }
-  if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);
-};
diff --git a/node_modules/core-js-pure/internals/object-get-own-property-names-external.js b/node_modules/core-js-pure/internals/object-get-own-property-names-external.js
deleted file mode 100644
index dfd94f1..0000000
--- a/node_modules/core-js-pure/internals/object-get-own-property-names-external.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var toIndexedObject = require('../internals/to-indexed-object');
-var nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;
-
-var toString = {}.toString;
-
-var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
-  ? Object.getOwnPropertyNames(window) : [];
-
-var getWindowNames = function (it) {
-  try {
-    return nativeGetOwnPropertyNames(it);
-  } catch (error) {
-    return windowNames.slice();
-  }
-};
-
-// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
-module.exports.f = function getOwnPropertyNames(it) {
-  return windowNames && toString.call(it) == '[object Window]'
-    ? getWindowNames(it)
-    : nativeGetOwnPropertyNames(toIndexedObject(it));
-};
diff --git a/node_modules/core-js-pure/internals/object-get-own-property-names.js b/node_modules/core-js-pure/internals/object-get-own-property-names.js
deleted file mode 100644
index f1b1be6..0000000
--- a/node_modules/core-js-pure/internals/object-get-own-property-names.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var internalObjectKeys = require('../internals/object-keys-internal');
-var enumBugKeys = require('../internals/enum-bug-keys');
-
-var hiddenKeys = enumBugKeys.concat('length', 'prototype');
-
-// `Object.getOwnPropertyNames` method
-// https://tc39.github.io/ecma262/#sec-object.getownpropertynames
-exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
-  return internalObjectKeys(O, hiddenKeys);
-};
diff --git a/node_modules/core-js-pure/internals/object-get-own-property-symbols.js b/node_modules/core-js-pure/internals/object-get-own-property-symbols.js
deleted file mode 100644
index bc06729..0000000
--- a/node_modules/core-js-pure/internals/object-get-own-property-symbols.js
+++ /dev/null
@@ -1 +0,0 @@
-exports.f = Object.getOwnPropertySymbols;
diff --git a/node_modules/core-js-pure/internals/object-get-prototype-of.js b/node_modules/core-js-pure/internals/object-get-prototype-of.js
deleted file mode 100644
index c0bb726..0000000
--- a/node_modules/core-js-pure/internals/object-get-prototype-of.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var has = require('../internals/has');
-var toObject = require('../internals/to-object');
-var sharedKey = require('../internals/shared-key');
-var CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');
-
-var IE_PROTO = sharedKey('IE_PROTO');
-var ObjectPrototype = Object.prototype;
-
-// `Object.getPrototypeOf` method
-// https://tc39.github.io/ecma262/#sec-object.getprototypeof
-module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {
-  O = toObject(O);
-  if (has(O, IE_PROTO)) return O[IE_PROTO];
-  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
-    return O.constructor.prototype;
-  } return O instanceof Object ? ObjectPrototype : null;
-};
diff --git a/node_modules/core-js-pure/internals/object-iterator.js b/node_modules/core-js-pure/internals/object-iterator.js
deleted file mode 100644
index 415824f..0000000
--- a/node_modules/core-js-pure/internals/object-iterator.js
+++ /dev/null
@@ -1,37 +0,0 @@
-'use strict';
-var InternalStateModule = require('../internals/internal-state');
-var createIteratorConstructor = require('../internals/create-iterator-constructor');
-var has = require('../internals/has');
-var objectKeys = require('../internals/object-keys');
-var toObject = require('../internals/to-object');
-
-var OBJECT_ITERATOR = 'Object Iterator';
-var setInternalState = InternalStateModule.set;
-var getInternalState = InternalStateModule.getterFor(OBJECT_ITERATOR);
-
-module.exports = createIteratorConstructor(function ObjectIterator(source, mode) {
-  var object = toObject(source);
-  setInternalState(this, {
-    type: OBJECT_ITERATOR,
-    mode: mode,
-    object: object,
-    keys: objectKeys(object),
-    index: 0
-  });
-}, 'Object', function next() {
-  var state = getInternalState(this);
-  var keys = state.keys;
-  while (true) {
-    if (keys === null || state.index >= keys.length) {
-      state.object = state.keys = null;
-      return { value: undefined, done: true };
-    }
-    var key = keys[state.index++];
-    var object = state.object;
-    if (!has(object, key)) continue;
-    switch (state.mode) {
-      case 'keys': return { value: key, done: false };
-      case 'values': return { value: object[key], done: false };
-    } /* entries */ return { value: [key, object[key]], done: false };
-  }
-});
diff --git a/node_modules/core-js-pure/internals/object-keys-internal.js b/node_modules/core-js-pure/internals/object-keys-internal.js
deleted file mode 100644
index 40b4c98..0000000
--- a/node_modules/core-js-pure/internals/object-keys-internal.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var has = require('../internals/has');
-var toIndexedObject = require('../internals/to-indexed-object');
-var indexOf = require('../internals/array-includes').indexOf;
-var hiddenKeys = require('../internals/hidden-keys');
-
-module.exports = function (object, names) {
-  var O = toIndexedObject(object);
-  var i = 0;
-  var result = [];
-  var key;
-  for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);
-  // Don't enum bug & hidden keys
-  while (names.length > i) if (has(O, key = names[i++])) {
-    ~indexOf(result, key) || result.push(key);
-  }
-  return result;
-};
diff --git a/node_modules/core-js-pure/internals/object-keys.js b/node_modules/core-js-pure/internals/object-keys.js
deleted file mode 100644
index 7188505..0000000
--- a/node_modules/core-js-pure/internals/object-keys.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var internalObjectKeys = require('../internals/object-keys-internal');
-var enumBugKeys = require('../internals/enum-bug-keys');
-
-// `Object.keys` method
-// https://tc39.github.io/ecma262/#sec-object.keys
-module.exports = Object.keys || function keys(O) {
-  return internalObjectKeys(O, enumBugKeys);
-};
diff --git a/node_modules/core-js-pure/internals/object-property-is-enumerable.js b/node_modules/core-js-pure/internals/object-property-is-enumerable.js
deleted file mode 100644
index 9ff2209..0000000
--- a/node_modules/core-js-pure/internals/object-property-is-enumerable.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-var nativePropertyIsEnumerable = {}.propertyIsEnumerable;
-var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
-
-// Nashorn ~ JDK8 bug
-var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);
-
-// `Object.prototype.propertyIsEnumerable` method implementation
-// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable
-exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {
-  var descriptor = getOwnPropertyDescriptor(this, V);
-  return !!descriptor && descriptor.enumerable;
-} : nativePropertyIsEnumerable;
diff --git a/node_modules/core-js-pure/internals/object-prototype-accessors-forced.js b/node_modules/core-js-pure/internals/object-prototype-accessors-forced.js
deleted file mode 100644
index 98cb8ba..0000000
--- a/node_modules/core-js-pure/internals/object-prototype-accessors-forced.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-var IS_PURE = require('../internals/is-pure');
-var global = require('../internals/global');
-var fails = require('../internals/fails');
-
-// Forced replacement object prototype accessors methods
-module.exports = IS_PURE || !fails(function () {
-  var key = Math.random();
-  // In FF throws only define methods
-  // eslint-disable-next-line no-undef, no-useless-call
-  __defineSetter__.call(null, key, function () { /* empty */ });
-  delete global[key];
-});
diff --git a/node_modules/core-js-pure/internals/object-set-prototype-of.js b/node_modules/core-js-pure/internals/object-set-prototype-of.js
deleted file mode 100644
index ce7e97c..0000000
--- a/node_modules/core-js-pure/internals/object-set-prototype-of.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var anObject = require('../internals/an-object');
-var aPossiblePrototype = require('../internals/a-possible-prototype');
-
-// `Object.setPrototypeOf` method
-// https://tc39.github.io/ecma262/#sec-object.setprototypeof
-// Works with __proto__ only. Old v8 can't work with null proto objects.
-/* eslint-disable no-proto */
-module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {
-  var CORRECT_SETTER = false;
-  var test = {};
-  var setter;
-  try {
-    setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;
-    setter.call(test, []);
-    CORRECT_SETTER = test instanceof Array;
-  } catch (error) { /* empty */ }
-  return function setPrototypeOf(O, proto) {
-    anObject(O);
-    aPossiblePrototype(proto);
-    if (CORRECT_SETTER) setter.call(O, proto);
-    else O.__proto__ = proto;
-    return O;
-  };
-}() : undefined);
diff --git a/node_modules/core-js-pure/internals/object-to-array.js b/node_modules/core-js-pure/internals/object-to-array.js
deleted file mode 100644
index 8e2409d..0000000
--- a/node_modules/core-js-pure/internals/object-to-array.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var DESCRIPTORS = require('../internals/descriptors');
-var objectKeys = require('../internals/object-keys');
-var toIndexedObject = require('../internals/to-indexed-object');
-var propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;
-
-// `Object.{ entries, values }` methods implementation
-var createMethod = function (TO_ENTRIES) {
-  return function (it) {
-    var O = toIndexedObject(it);
-    var keys = objectKeys(O);
-    var length = keys.length;
-    var i = 0;
-    var result = [];
-    var key;
-    while (length > i) {
-      key = keys[i++];
-      if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {
-        result.push(TO_ENTRIES ? [key, O[key]] : O[key]);
-      }
-    }
-    return result;
-  };
-};
-
-module.exports = {
-  // `Object.entries` method
-  // https://tc39.github.io/ecma262/#sec-object.entries
-  entries: createMethod(true),
-  // `Object.values` method
-  // https://tc39.github.io/ecma262/#sec-object.values
-  values: createMethod(false)
-};
diff --git a/node_modules/core-js-pure/internals/object-to-string.js b/node_modules/core-js-pure/internals/object-to-string.js
deleted file mode 100644
index 68fbea7..0000000
--- a/node_modules/core-js-pure/internals/object-to-string.js
+++ /dev/null
@@ -1,9 +0,0 @@
-'use strict';
-var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');
-var classof = require('../internals/classof');
-
-// `Object.prototype.toString` method implementation
-// https://tc39.github.io/ecma262/#sec-object.prototype.tostring
-module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {
-  return '[object ' + classof(this) + ']';
-};
diff --git a/node_modules/core-js-pure/internals/own-keys.js b/node_modules/core-js-pure/internals/own-keys.js
deleted file mode 100644
index 4c3d8b5..0000000
--- a/node_modules/core-js-pure/internals/own-keys.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var getBuiltIn = require('../internals/get-built-in');
-var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');
-var getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');
-var anObject = require('../internals/an-object');
-
-// all object keys, includes non-enumerable and symbols
-module.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {
-  var keys = getOwnPropertyNamesModule.f(anObject(it));
-  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;
-  return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;
-};
diff --git a/node_modules/core-js-pure/internals/path.js b/node_modules/core-js-pure/internals/path.js
deleted file mode 100644
index f053ebf..0000000
--- a/node_modules/core-js-pure/internals/path.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = {};
diff --git a/node_modules/core-js-pure/internals/perform.js b/node_modules/core-js-pure/internals/perform.js
deleted file mode 100644
index 3cd8eef..0000000
--- a/node_modules/core-js-pure/internals/perform.js
+++ /dev/null
@@ -1,7 +0,0 @@
-module.exports = function (exec) {
-  try {
-    return { error: false, value: exec() };
-  } catch (error) {
-    return { error: true, value: error };
-  }
-};
diff --git a/node_modules/core-js-pure/internals/promise-resolve.js b/node_modules/core-js-pure/internals/promise-resolve.js
deleted file mode 100644
index 18e73e1..0000000
--- a/node_modules/core-js-pure/internals/promise-resolve.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var anObject = require('../internals/an-object');
-var isObject = require('../internals/is-object');
-var newPromiseCapability = require('../internals/new-promise-capability');
-
-module.exports = function (C, x) {
-  anObject(C);
-  if (isObject(x) && x.constructor === C) return x;
-  var promiseCapability = newPromiseCapability.f(C);
-  var resolve = promiseCapability.resolve;
-  resolve(x);
-  return promiseCapability.promise;
-};
diff --git a/node_modules/core-js-pure/internals/redefine-all.js b/node_modules/core-js-pure/internals/redefine-all.js
deleted file mode 100644
index b6f71ef..0000000
--- a/node_modules/core-js-pure/internals/redefine-all.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var redefine = require('../internals/redefine');
-
-module.exports = function (target, src, options) {
-  for (var key in src) {
-    if (options && options.unsafe && target[key]) target[key] = src[key];
-    else redefine(target, key, src[key], options);
-  } return target;
-};
diff --git a/node_modules/core-js-pure/internals/redefine.js b/node_modules/core-js-pure/internals/redefine.js
deleted file mode 100644
index 016ddf7..0000000
--- a/node_modules/core-js-pure/internals/redefine.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-
-module.exports = function (target, key, value, options) {
-  if (options && options.enumerable) target[key] = value;
-  else createNonEnumerableProperty(target, key, value);
-};
diff --git a/node_modules/core-js-pure/internals/reflect-metadata.js b/node_modules/core-js-pure/internals/reflect-metadata.js
deleted file mode 100644
index a8cd82f..0000000
--- a/node_modules/core-js-pure/internals/reflect-metadata.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
-var Map = require('../modules/es.map');
-var WeakMap = require('../modules/es.weak-map');
-var shared = require('../internals/shared');
-
-var metadata = shared('metadata');
-var store = metadata.store || (metadata.store = new WeakMap());
-
-var getOrCreateMetadataMap = function (target, targetKey, create) {
-  var targetMetadata = store.get(target);
-  if (!targetMetadata) {
-    if (!create) return;
-    store.set(target, targetMetadata = new Map());
-  }
-  var keyMetadata = targetMetadata.get(targetKey);
-  if (!keyMetadata) {
-    if (!create) return;
-    targetMetadata.set(targetKey, keyMetadata = new Map());
-  } return keyMetadata;
-};
-
-var ordinaryHasOwnMetadata = function (MetadataKey, O, P) {
-  var metadataMap = getOrCreateMetadataMap(O, P, false);
-  return metadataMap === undefined ? false : metadataMap.has(MetadataKey);
-};
-
-var ordinaryGetOwnMetadata = function (MetadataKey, O, P) {
-  var metadataMap = getOrCreateMetadataMap(O, P, false);
-  return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);
-};
-
-var ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) {
-  getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);
-};
-
-var ordinaryOwnMetadataKeys = function (target, targetKey) {
-  var metadataMap = getOrCreateMetadataMap(target, targetKey, false);
-  var keys = [];
-  if (metadataMap) metadataMap.forEach(function (_, key) { keys.push(key); });
-  return keys;
-};
-
-var toMetadataKey = function (it) {
-  return it === undefined || typeof it == 'symbol' ? it : String(it);
-};
-
-module.exports = {
-  store: store,
-  getMap: getOrCreateMetadataMap,
-  has: ordinaryHasOwnMetadata,
-  get: ordinaryGetOwnMetadata,
-  set: ordinaryDefineOwnMetadata,
-  keys: ordinaryOwnMetadataKeys,
-  toKey: toMetadataKey
-};
diff --git a/node_modules/core-js-pure/internals/regexp-exec-abstract.js b/node_modules/core-js-pure/internals/regexp-exec-abstract.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/internals/regexp-exec-abstract.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/internals/regexp-exec.js b/node_modules/core-js-pure/internals/regexp-exec.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/internals/regexp-exec.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/internals/regexp-flags.js b/node_modules/core-js-pure/internals/regexp-flags.js
deleted file mode 100644
index c77927b..0000000
--- a/node_modules/core-js-pure/internals/regexp-flags.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-var anObject = require('../internals/an-object');
-
-// `RegExp.prototype.flags` getter implementation
-// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags
-module.exports = function () {
-  var that = anObject(this);
-  var result = '';
-  if (that.global) result += 'g';
-  if (that.ignoreCase) result += 'i';
-  if (that.multiline) result += 'm';
-  if (that.dotAll) result += 's';
-  if (that.unicode) result += 'u';
-  if (that.sticky) result += 'y';
-  return result;
-};
diff --git a/node_modules/core-js-pure/internals/regexp-sticky-helpers.js b/node_modules/core-js-pure/internals/regexp-sticky-helpers.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/internals/regexp-sticky-helpers.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/internals/require-object-coercible.js b/node_modules/core-js-pure/internals/require-object-coercible.js
deleted file mode 100644
index f7b2662..0000000
--- a/node_modules/core-js-pure/internals/require-object-coercible.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// `RequireObjectCoercible` abstract operation
-// https://tc39.github.io/ecma262/#sec-requireobjectcoercible
-module.exports = function (it) {
-  if (it == undefined) throw TypeError("Can't call method on " + it);
-  return it;
-};
diff --git a/node_modules/core-js-pure/internals/same-value-zero.js b/node_modules/core-js-pure/internals/same-value-zero.js
deleted file mode 100644
index 452f230..0000000
--- a/node_modules/core-js-pure/internals/same-value-zero.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// `SameValueZero` abstract operation
-// https://tc39.github.io/ecma262/#sec-samevaluezero
-module.exports = function (x, y) {
-  // eslint-disable-next-line no-self-compare
-  return x === y || x != x && y != y;
-};
diff --git a/node_modules/core-js-pure/internals/same-value.js b/node_modules/core-js-pure/internals/same-value.js
deleted file mode 100644
index 4661f85..0000000
--- a/node_modules/core-js-pure/internals/same-value.js
+++ /dev/null
@@ -1,6 +0,0 @@
-// `SameValue` abstract operation
-// https://tc39.github.io/ecma262/#sec-samevalue
-module.exports = Object.is || function is(x, y) {
-  // eslint-disable-next-line no-self-compare
-  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
-};
diff --git a/node_modules/core-js-pure/internals/set-global.js b/node_modules/core-js-pure/internals/set-global.js
deleted file mode 100644
index 8ac9601..0000000
--- a/node_modules/core-js-pure/internals/set-global.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var global = require('../internals/global');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-
-module.exports = function (key, value) {
-  try {
-    createNonEnumerableProperty(global, key, value);
-  } catch (error) {
-    global[key] = value;
-  } return value;
-};
diff --git a/node_modules/core-js-pure/internals/set-species.js b/node_modules/core-js-pure/internals/set-species.js
deleted file mode 100644
index 6be87f7..0000000
--- a/node_modules/core-js-pure/internals/set-species.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-var getBuiltIn = require('../internals/get-built-in');
-var definePropertyModule = require('../internals/object-define-property');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var DESCRIPTORS = require('../internals/descriptors');
-
-var SPECIES = wellKnownSymbol('species');
-
-module.exports = function (CONSTRUCTOR_NAME) {
-  var Constructor = getBuiltIn(CONSTRUCTOR_NAME);
-  var defineProperty = definePropertyModule.f;
-
-  if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {
-    defineProperty(Constructor, SPECIES, {
-      configurable: true,
-      get: function () { return this; }
-    });
-  }
-};
diff --git a/node_modules/core-js-pure/internals/set-to-string-tag.js b/node_modules/core-js-pure/internals/set-to-string-tag.js
deleted file mode 100644
index 7043d71..0000000
--- a/node_modules/core-js-pure/internals/set-to-string-tag.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');
-var defineProperty = require('../internals/object-define-property').f;
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var has = require('../internals/has');
-var toString = require('../internals/object-to-string');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var TO_STRING_TAG = wellKnownSymbol('toStringTag');
-
-module.exports = function (it, TAG, STATIC, SET_METHOD) {
-  if (it) {
-    var target = STATIC ? it : it.prototype;
-    if (!has(target, TO_STRING_TAG)) {
-      defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });
-    }
-    if (SET_METHOD && !TO_STRING_TAG_SUPPORT) {
-      createNonEnumerableProperty(target, 'toString', toString);
-    }
-  }
-};
diff --git a/node_modules/core-js-pure/internals/shared-key.js b/node_modules/core-js-pure/internals/shared-key.js
deleted file mode 100644
index 35bc403..0000000
--- a/node_modules/core-js-pure/internals/shared-key.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var shared = require('../internals/shared');
-var uid = require('../internals/uid');
-
-var keys = shared('keys');
-
-module.exports = function (key) {
-  return keys[key] || (keys[key] = uid(key));
-};
diff --git a/node_modules/core-js-pure/internals/shared-store.js b/node_modules/core-js-pure/internals/shared-store.js
deleted file mode 100644
index c54550a..0000000
--- a/node_modules/core-js-pure/internals/shared-store.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var global = require('../internals/global');
-var setGlobal = require('../internals/set-global');
-
-var SHARED = '__core-js_shared__';
-var store = global[SHARED] || setGlobal(SHARED, {});
-
-module.exports = store;
diff --git a/node_modules/core-js-pure/internals/shared.js b/node_modules/core-js-pure/internals/shared.js
deleted file mode 100644
index 0688ce1..0000000
--- a/node_modules/core-js-pure/internals/shared.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var IS_PURE = require('../internals/is-pure');
-var store = require('../internals/shared-store');
-
-(module.exports = function (key, value) {
-  return store[key] || (store[key] = value !== undefined ? value : {});
-})('versions', []).push({
-  version: '3.6.4',
-  mode: IS_PURE ? 'pure' : 'global',
-  copyright: '© 2020 Denis Pushkarev (zloirock.ru)'
-});
diff --git a/node_modules/core-js-pure/internals/species-constructor.js b/node_modules/core-js-pure/internals/species-constructor.js
deleted file mode 100644
index 4d8f565..0000000
--- a/node_modules/core-js-pure/internals/species-constructor.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var SPECIES = wellKnownSymbol('species');
-
-// `SpeciesConstructor` abstract operation
-// https://tc39.github.io/ecma262/#sec-speciesconstructor
-module.exports = function (O, defaultConstructor) {
-  var C = anObject(O).constructor;
-  var S;
-  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);
-};
diff --git a/node_modules/core-js-pure/internals/string-html-forced.js b/node_modules/core-js-pure/internals/string-html-forced.js
deleted file mode 100644
index d3c884f..0000000
--- a/node_modules/core-js-pure/internals/string-html-forced.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var fails = require('../internals/fails');
-
-// check the existence of a method, lowercase
-// of a tag and escaping quotes in arguments
-module.exports = function (METHOD_NAME) {
-  return fails(function () {
-    var test = ''[METHOD_NAME]('"');
-    return test !== test.toLowerCase() || test.split('"').length > 3;
-  });
-};
diff --git a/node_modules/core-js-pure/internals/string-multibyte.js b/node_modules/core-js-pure/internals/string-multibyte.js
deleted file mode 100644
index c0cf086..0000000
--- a/node_modules/core-js-pure/internals/string-multibyte.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var toInteger = require('../internals/to-integer');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-
-// `String.prototype.{ codePointAt, at }` methods implementation
-var createMethod = function (CONVERT_TO_STRING) {
-  return function ($this, pos) {
-    var S = String(requireObjectCoercible($this));
-    var position = toInteger(pos);
-    var size = S.length;
-    var first, second;
-    if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
-    first = S.charCodeAt(position);
-    return first < 0xD800 || first > 0xDBFF || position + 1 === size
-      || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF
-        ? CONVERT_TO_STRING ? S.charAt(position) : first
-        : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
-  };
-};
-
-module.exports = {
-  // `String.prototype.codePointAt` method
-  // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat
-  codeAt: createMethod(false),
-  // `String.prototype.at` method
-  // https://github.com/mathiasbynens/String.prototype.at
-  charAt: createMethod(true)
-};
diff --git a/node_modules/core-js-pure/internals/string-pad-webkit-bug.js b/node_modules/core-js-pure/internals/string-pad-webkit-bug.js
deleted file mode 100644
index 9f94d3a..0000000
--- a/node_modules/core-js-pure/internals/string-pad-webkit-bug.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// https://github.com/zloirock/core-js/issues/280
-var userAgent = require('../internals/engine-user-agent');
-
-// eslint-disable-next-line unicorn/no-unsafe-regex
-module.exports = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent);
diff --git a/node_modules/core-js-pure/internals/string-pad.js b/node_modules/core-js-pure/internals/string-pad.js
deleted file mode 100644
index c03090e..0000000
--- a/node_modules/core-js-pure/internals/string-pad.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// https://github.com/tc39/proposal-string-pad-start-end
-var toLength = require('../internals/to-length');
-var repeat = require('../internals/string-repeat');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-
-var ceil = Math.ceil;
-
-// `String.prototype.{ padStart, padEnd }` methods implementation
-var createMethod = function (IS_END) {
-  return function ($this, maxLength, fillString) {
-    var S = String(requireObjectCoercible($this));
-    var stringLength = S.length;
-    var fillStr = fillString === undefined ? ' ' : String(fillString);
-    var intMaxLength = toLength(maxLength);
-    var fillLen, stringFiller;
-    if (intMaxLength <= stringLength || fillStr == '') return S;
-    fillLen = intMaxLength - stringLength;
-    stringFiller = repeat.call(fillStr, ceil(fillLen / fillStr.length));
-    if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
-    return IS_END ? S + stringFiller : stringFiller + S;
-  };
-};
-
-module.exports = {
-  // `String.prototype.padStart` method
-  // https://tc39.github.io/ecma262/#sec-string.prototype.padstart
-  start: createMethod(false),
-  // `String.prototype.padEnd` method
-  // https://tc39.github.io/ecma262/#sec-string.prototype.padend
-  end: createMethod(true)
-};
diff --git a/node_modules/core-js-pure/internals/string-punycode-to-ascii.js b/node_modules/core-js-pure/internals/string-punycode-to-ascii.js
deleted file mode 100644
index 436d39f..0000000
--- a/node_modules/core-js-pure/internals/string-punycode-to-ascii.js
+++ /dev/null
@@ -1,168 +0,0 @@
-'use strict';
-// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js
-var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1
-var base = 36;
-var tMin = 1;
-var tMax = 26;
-var skew = 38;
-var damp = 700;
-var initialBias = 72;
-var initialN = 128; // 0x80
-var delimiter = '-'; // '\x2D'
-var regexNonASCII = /[^\0-\u007E]/; // non-ASCII chars
-var regexSeparators = /[.\u3002\uFF0E\uFF61]/g; // RFC 3490 separators
-var OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';
-var baseMinusTMin = base - tMin;
-var floor = Math.floor;
-var stringFromCharCode = String.fromCharCode;
-
-/**
- * Creates an array containing the numeric code points of each Unicode
- * character in the string. While JavaScript uses UCS-2 internally,
- * this function will convert a pair of surrogate halves (each of which
- * UCS-2 exposes as separate characters) into a single code point,
- * matching UTF-16.
- */
-var ucs2decode = function (string) {
-  var output = [];
-  var counter = 0;
-  var length = string.length;
-  while (counter < length) {
-    var value = string.charCodeAt(counter++);
-    if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
-      // It's a high surrogate, and there is a next character.
-      var extra = string.charCodeAt(counter++);
-      if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.
-        output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
-      } else {
-        // It's an unmatched surrogate; only append this code unit, in case the
-        // next code unit is the high surrogate of a surrogate pair.
-        output.push(value);
-        counter--;
-      }
-    } else {
-      output.push(value);
-    }
-  }
-  return output;
-};
-
-/**
- * Converts a digit/integer into a basic code point.
- */
-var digitToBasic = function (digit) {
-  //  0..25 map to ASCII a..z or A..Z
-  // 26..35 map to ASCII 0..9
-  return digit + 22 + 75 * (digit < 26);
-};
-
-/**
- * Bias adaptation function as per section 3.4 of RFC 3492.
- * https://tools.ietf.org/html/rfc3492#section-3.4
- */
-var adapt = function (delta, numPoints, firstTime) {
-  var k = 0;
-  delta = firstTime ? floor(delta / damp) : delta >> 1;
-  delta += floor(delta / numPoints);
-  for (; delta > baseMinusTMin * tMax >> 1; k += base) {
-    delta = floor(delta / baseMinusTMin);
-  }
-  return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
-};
-
-/**
- * Converts a string of Unicode symbols (e.g. a domain name label) to a
- * Punycode string of ASCII-only symbols.
- */
-// eslint-disable-next-line  max-statements
-var encode = function (input) {
-  var output = [];
-
-  // Convert the input in UCS-2 to an array of Unicode code points.
-  input = ucs2decode(input);
-
-  // Cache the length.
-  var inputLength = input.length;
-
-  // Initialize the state.
-  var n = initialN;
-  var delta = 0;
-  var bias = initialBias;
-  var i, currentValue;
-
-  // Handle the basic code points.
-  for (i = 0; i < input.length; i++) {
-    currentValue = input[i];
-    if (currentValue < 0x80) {
-      output.push(stringFromCharCode(currentValue));
-    }
-  }
-
-  var basicLength = output.length; // number of basic code points.
-  var handledCPCount = basicLength; // number of code points that have been handled;
-
-  // Finish the basic string with a delimiter unless it's empty.
-  if (basicLength) {
-    output.push(delimiter);
-  }
-
-  // Main encoding loop:
-  while (handledCPCount < inputLength) {
-    // All non-basic code points < n have been handled already. Find the next larger one:
-    var m = maxInt;
-    for (i = 0; i < input.length; i++) {
-      currentValue = input[i];
-      if (currentValue >= n && currentValue < m) {
-        m = currentValue;
-      }
-    }
-
-    // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.
-    var handledCPCountPlusOne = handledCPCount + 1;
-    if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
-      throw RangeError(OVERFLOW_ERROR);
-    }
-
-    delta += (m - n) * handledCPCountPlusOne;
-    n = m;
-
-    for (i = 0; i < input.length; i++) {
-      currentValue = input[i];
-      if (currentValue < n && ++delta > maxInt) {
-        throw RangeError(OVERFLOW_ERROR);
-      }
-      if (currentValue == n) {
-        // Represent delta as a generalized variable-length integer.
-        var q = delta;
-        for (var k = base; /* no condition */; k += base) {
-          var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
-          if (q < t) break;
-          var qMinusT = q - t;
-          var baseMinusT = base - t;
-          output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));
-          q = floor(qMinusT / baseMinusT);
-        }
-
-        output.push(stringFromCharCode(digitToBasic(q)));
-        bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
-        delta = 0;
-        ++handledCPCount;
-      }
-    }
-
-    ++delta;
-    ++n;
-  }
-  return output.join('');
-};
-
-module.exports = function (input) {
-  var encoded = [];
-  var labels = input.toLowerCase().replace(regexSeparators, '\u002E').split('.');
-  var i, label;
-  for (i = 0; i < labels.length; i++) {
-    label = labels[i];
-    encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);
-  }
-  return encoded.join('.');
-};
diff --git a/node_modules/core-js-pure/internals/string-repeat.js b/node_modules/core-js-pure/internals/string-repeat.js
deleted file mode 100644
index ab872b2..0000000
--- a/node_modules/core-js-pure/internals/string-repeat.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-var toInteger = require('../internals/to-integer');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-
-// `String.prototype.repeat` method implementation
-// https://tc39.github.io/ecma262/#sec-string.prototype.repeat
-module.exports = ''.repeat || function repeat(count) {
-  var str = String(requireObjectCoercible(this));
-  var result = '';
-  var n = toInteger(count);
-  if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');
-  for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;
-  return result;
-};
diff --git a/node_modules/core-js-pure/internals/string-trim-forced.js b/node_modules/core-js-pure/internals/string-trim-forced.js
deleted file mode 100644
index 1b169ad..0000000
--- a/node_modules/core-js-pure/internals/string-trim-forced.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var fails = require('../internals/fails');
-var whitespaces = require('../internals/whitespaces');
-
-var non = '\u200B\u0085\u180E';
-
-// check that a method works with the correct list
-// of whitespaces and has a correct name
-module.exports = function (METHOD_NAME) {
-  return fails(function () {
-    return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;
-  });
-};
diff --git a/node_modules/core-js-pure/internals/string-trim.js b/node_modules/core-js-pure/internals/string-trim.js
deleted file mode 100644
index 294a32c..0000000
--- a/node_modules/core-js-pure/internals/string-trim.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var requireObjectCoercible = require('../internals/require-object-coercible');
-var whitespaces = require('../internals/whitespaces');
-
-var whitespace = '[' + whitespaces + ']';
-var ltrim = RegExp('^' + whitespace + whitespace + '*');
-var rtrim = RegExp(whitespace + whitespace + '*$');
-
-// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation
-var createMethod = function (TYPE) {
-  return function ($this) {
-    var string = String(requireObjectCoercible($this));
-    if (TYPE & 1) string = string.replace(ltrim, '');
-    if (TYPE & 2) string = string.replace(rtrim, '');
-    return string;
-  };
-};
-
-module.exports = {
-  // `String.prototype.{ trimLeft, trimStart }` methods
-  // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart
-  start: createMethod(1),
-  // `String.prototype.{ trimRight, trimEnd }` methods
-  // https://tc39.github.io/ecma262/#sec-string.prototype.trimend
-  end: createMethod(2),
-  // `String.prototype.trim` method
-  // https://tc39.github.io/ecma262/#sec-string.prototype.trim
-  trim: createMethod(3)
-};
diff --git a/node_modules/core-js-pure/internals/task.js b/node_modules/core-js-pure/internals/task.js
deleted file mode 100644
index 834585f..0000000
--- a/node_modules/core-js-pure/internals/task.js
+++ /dev/null
@@ -1,101 +0,0 @@
-var global = require('../internals/global');
-var fails = require('../internals/fails');
-var classof = require('../internals/classof-raw');
-var bind = require('../internals/function-bind-context');
-var html = require('../internals/html');
-var createElement = require('../internals/document-create-element');
-var IS_IOS = require('../internals/engine-is-ios');
-
-var location = global.location;
-var set = global.setImmediate;
-var clear = global.clearImmediate;
-var process = global.process;
-var MessageChannel = global.MessageChannel;
-var Dispatch = global.Dispatch;
-var counter = 0;
-var queue = {};
-var ONREADYSTATECHANGE = 'onreadystatechange';
-var defer, channel, port;
-
-var run = function (id) {
-  // eslint-disable-next-line no-prototype-builtins
-  if (queue.hasOwnProperty(id)) {
-    var fn = queue[id];
-    delete queue[id];
-    fn();
-  }
-};
-
-var runner = function (id) {
-  return function () {
-    run(id);
-  };
-};
-
-var listener = function (event) {
-  run(event.data);
-};
-
-var post = function (id) {
-  // old engines have not location.origin
-  global.postMessage(id + '', location.protocol + '//' + location.host);
-};
-
-// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
-if (!set || !clear) {
-  set = function setImmediate(fn) {
-    var args = [];
-    var i = 1;
-    while (arguments.length > i) args.push(arguments[i++]);
-    queue[++counter] = function () {
-      // eslint-disable-next-line no-new-func
-      (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);
-    };
-    defer(counter);
-    return counter;
-  };
-  clear = function clearImmediate(id) {
-    delete queue[id];
-  };
-  // Node.js 0.8-
-  if (classof(process) == 'process') {
-    defer = function (id) {
-      process.nextTick(runner(id));
-    };
-  // Sphere (JS game engine) Dispatch API
-  } else if (Dispatch && Dispatch.now) {
-    defer = function (id) {
-      Dispatch.now(runner(id));
-    };
-  // Browsers with MessageChannel, includes WebWorkers
-  // except iOS - https://github.com/zloirock/core-js/issues/624
-  } else if (MessageChannel && !IS_IOS) {
-    channel = new MessageChannel();
-    port = channel.port2;
-    channel.port1.onmessage = listener;
-    defer = bind(port.postMessage, port, 1);
-  // Browsers with postMessage, skip WebWorkers
-  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
-  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts && !fails(post)) {
-    defer = post;
-    global.addEventListener('message', listener, false);
-  // IE8-
-  } else if (ONREADYSTATECHANGE in createElement('script')) {
-    defer = function (id) {
-      html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {
-        html.removeChild(this);
-        run(id);
-      };
-    };
-  // Rest old browsers
-  } else {
-    defer = function (id) {
-      setTimeout(runner(id), 0);
-    };
-  }
-}
-
-module.exports = {
-  set: set,
-  clear: clear
-};
diff --git a/node_modules/core-js-pure/internals/this-number-value.js b/node_modules/core-js-pure/internals/this-number-value.js
deleted file mode 100644
index 7734b32..0000000
--- a/node_modules/core-js-pure/internals/this-number-value.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var classof = require('../internals/classof-raw');
-
-// `thisNumberValue` abstract operation
-// https://tc39.github.io/ecma262/#sec-thisnumbervalue
-module.exports = function (value) {
-  if (typeof value != 'number' && classof(value) != 'Number') {
-    throw TypeError('Incorrect invocation');
-  }
-  return +value;
-};
diff --git a/node_modules/core-js-pure/internals/to-absolute-index.js b/node_modules/core-js-pure/internals/to-absolute-index.js
deleted file mode 100644
index 35cfd59..0000000
--- a/node_modules/core-js-pure/internals/to-absolute-index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var toInteger = require('../internals/to-integer');
-
-var max = Math.max;
-var min = Math.min;
-
-// Helper for a popular repeating case of the spec:
-// Let integer be ? ToInteger(index).
-// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).
-module.exports = function (index, length) {
-  var integer = toInteger(index);
-  return integer < 0 ? max(integer + length, 0) : min(integer, length);
-};
diff --git a/node_modules/core-js-pure/internals/to-index.js b/node_modules/core-js-pure/internals/to-index.js
deleted file mode 100644
index 004a3a2..0000000
--- a/node_modules/core-js-pure/internals/to-index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var toInteger = require('../internals/to-integer');
-var toLength = require('../internals/to-length');
-
-// `ToIndex` abstract operation
-// https://tc39.github.io/ecma262/#sec-toindex
-module.exports = function (it) {
-  if (it === undefined) return 0;
-  var number = toInteger(it);
-  var length = toLength(number);
-  if (number !== length) throw RangeError('Wrong length or index');
-  return length;
-};
diff --git a/node_modules/core-js-pure/internals/to-indexed-object.js b/node_modules/core-js-pure/internals/to-indexed-object.js
deleted file mode 100644
index 98f0799..0000000
--- a/node_modules/core-js-pure/internals/to-indexed-object.js
+++ /dev/null
@@ -1,7 +0,0 @@
-// toObject with fallback for non-array-like ES3 strings
-var IndexedObject = require('../internals/indexed-object');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-
-module.exports = function (it) {
-  return IndexedObject(requireObjectCoercible(it));
-};
diff --git a/node_modules/core-js-pure/internals/to-integer.js b/node_modules/core-js-pure/internals/to-integer.js
deleted file mode 100644
index f7c6390..0000000
--- a/node_modules/core-js-pure/internals/to-integer.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var ceil = Math.ceil;
-var floor = Math.floor;
-
-// `ToInteger` abstract operation
-// https://tc39.github.io/ecma262/#sec-tointeger
-module.exports = function (argument) {
-  return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);
-};
diff --git a/node_modules/core-js-pure/internals/to-length.js b/node_modules/core-js-pure/internals/to-length.js
deleted file mode 100644
index fbc2a49..0000000
--- a/node_modules/core-js-pure/internals/to-length.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var toInteger = require('../internals/to-integer');
-
-var min = Math.min;
-
-// `ToLength` abstract operation
-// https://tc39.github.io/ecma262/#sec-tolength
-module.exports = function (argument) {
-  return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
-};
diff --git a/node_modules/core-js-pure/internals/to-object.js b/node_modules/core-js-pure/internals/to-object.js
deleted file mode 100644
index fd635e2..0000000
--- a/node_modules/core-js-pure/internals/to-object.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var requireObjectCoercible = require('../internals/require-object-coercible');
-
-// `ToObject` abstract operation
-// https://tc39.github.io/ecma262/#sec-toobject
-module.exports = function (argument) {
-  return Object(requireObjectCoercible(argument));
-};
diff --git a/node_modules/core-js-pure/internals/to-offset.js b/node_modules/core-js-pure/internals/to-offset.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/internals/to-offset.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/internals/to-positive-integer.js b/node_modules/core-js-pure/internals/to-positive-integer.js
deleted file mode 100644
index c92aca5..0000000
--- a/node_modules/core-js-pure/internals/to-positive-integer.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var toInteger = require('../internals/to-integer');
-
-module.exports = function (it) {
-  var result = toInteger(it);
-  if (result < 0) throw RangeError("The argument can't be less than 0");
-  return result;
-};
diff --git a/node_modules/core-js-pure/internals/to-primitive.js b/node_modules/core-js-pure/internals/to-primitive.js
deleted file mode 100644
index 00a4031..0000000
--- a/node_modules/core-js-pure/internals/to-primitive.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var isObject = require('../internals/is-object');
-
-// `ToPrimitive` abstract operation
-// https://tc39.github.io/ecma262/#sec-toprimitive
-// instead of the ES6 spec version, we didn't implement @@toPrimitive case
-// and the second argument - flag - preferred type is a string
-module.exports = function (input, PREFERRED_STRING) {
-  if (!isObject(input)) return input;
-  var fn, val;
-  if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;
-  if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;
-  if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;
-  throw TypeError("Can't convert object to primitive value");
-};
diff --git a/node_modules/core-js-pure/internals/to-string-tag-support.js b/node_modules/core-js-pure/internals/to-string-tag-support.js
deleted file mode 100644
index 9e3ebfb..0000000
--- a/node_modules/core-js-pure/internals/to-string-tag-support.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var TO_STRING_TAG = wellKnownSymbol('toStringTag');
-var test = {};
-
-test[TO_STRING_TAG] = 'z';
-
-module.exports = String(test) === '[object z]';
diff --git a/node_modules/core-js-pure/internals/typed-array-constructor.js b/node_modules/core-js-pure/internals/typed-array-constructor.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/internals/typed-array-constructor.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/internals/typed-array-constructors-require-wrappers.js b/node_modules/core-js-pure/internals/typed-array-constructors-require-wrappers.js
deleted file mode 100644
index 952f30a..0000000
--- a/node_modules/core-js-pure/internals/typed-array-constructors-require-wrappers.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/* eslint-disable no-new */
-var global = require('../internals/global');
-var fails = require('../internals/fails');
-var checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');
-var NATIVE_ARRAY_BUFFER_VIEWS = require('../internals/array-buffer-view-core').NATIVE_ARRAY_BUFFER_VIEWS;
-
-var ArrayBuffer = global.ArrayBuffer;
-var Int8Array = global.Int8Array;
-
-module.exports = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () {
-  Int8Array(1);
-}) || !fails(function () {
-  new Int8Array(-1);
-}) || !checkCorrectnessOfIteration(function (iterable) {
-  new Int8Array();
-  new Int8Array(null);
-  new Int8Array(1.5);
-  new Int8Array(iterable);
-}, true) || fails(function () {
-  // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill
-  return new Int8Array(new ArrayBuffer(2), 1, undefined).length !== 1;
-});
diff --git a/node_modules/core-js-pure/internals/typed-array-from.js b/node_modules/core-js-pure/internals/typed-array-from.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/internals/typed-array-from.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/internals/uid.js b/node_modules/core-js-pure/internals/uid.js
deleted file mode 100644
index 384c124..0000000
--- a/node_modules/core-js-pure/internals/uid.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var id = 0;
-var postfix = Math.random();
-
-module.exports = function (key) {
-  return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);
-};
diff --git a/node_modules/core-js-pure/internals/use-symbol-as-uid.js b/node_modules/core-js-pure/internals/use-symbol-as-uid.js
deleted file mode 100644
index 5654bf6..0000000
--- a/node_modules/core-js-pure/internals/use-symbol-as-uid.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var NATIVE_SYMBOL = require('../internals/native-symbol');
-
-module.exports = NATIVE_SYMBOL
-  // eslint-disable-next-line no-undef
-  && !Symbol.sham
-  // eslint-disable-next-line no-undef
-  && typeof Symbol.iterator == 'symbol';
diff --git a/node_modules/core-js-pure/internals/well-known-symbol-wrapped.js b/node_modules/core-js-pure/internals/well-known-symbol-wrapped.js
deleted file mode 100644
index 714b329..0000000
--- a/node_modules/core-js-pure/internals/well-known-symbol-wrapped.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-exports.f = wellKnownSymbol;
diff --git a/node_modules/core-js-pure/internals/well-known-symbol.js b/node_modules/core-js-pure/internals/well-known-symbol.js
deleted file mode 100644
index 3fcc8c3..0000000
--- a/node_modules/core-js-pure/internals/well-known-symbol.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var global = require('../internals/global');
-var shared = require('../internals/shared');
-var has = require('../internals/has');
-var uid = require('../internals/uid');
-var NATIVE_SYMBOL = require('../internals/native-symbol');
-var USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');
-
-var WellKnownSymbolsStore = shared('wks');
-var Symbol = global.Symbol;
-var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;
-
-module.exports = function (name) {
-  if (!has(WellKnownSymbolsStore, name)) {
-    if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];
-    else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);
-  } return WellKnownSymbolsStore[name];
-};
diff --git a/node_modules/core-js-pure/internals/whitespaces.js b/node_modules/core-js-pure/internals/whitespaces.js
deleted file mode 100644
index 0924bab..0000000
--- a/node_modules/core-js-pure/internals/whitespaces.js
+++ /dev/null
@@ -1,3 +0,0 @@
-// a string of all valid unicode whitespaces
-// eslint-disable-next-line max-len
-module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';
diff --git a/node_modules/core-js-pure/modules/README.md b/node_modules/core-js-pure/modules/README.md
deleted file mode 100644
index 0d6b3cb..0000000
--- a/node_modules/core-js-pure/modules/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This folder contains implementations of polyfills. It's not recommended to include in your projects directly if you don't completely understand what are you doing.
diff --git a/node_modules/core-js-pure/modules/es.array-buffer.constructor.js b/node_modules/core-js-pure/modules/es.array-buffer.constructor.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.array-buffer.constructor.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.array-buffer.is-view.js b/node_modules/core-js-pure/modules/es.array-buffer.is-view.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.array-buffer.is-view.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.array-buffer.slice.js b/node_modules/core-js-pure/modules/es.array-buffer.slice.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.array-buffer.slice.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.array.concat.js b/node_modules/core-js-pure/modules/es.array.concat.js
deleted file mode 100644
index 1c22499..0000000
--- a/node_modules/core-js-pure/modules/es.array.concat.js
+++ /dev/null
@@ -1,60 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var fails = require('../internals/fails');
-var isArray = require('../internals/is-array');
-var isObject = require('../internals/is-object');
-var toObject = require('../internals/to-object');
-var toLength = require('../internals/to-length');
-var createProperty = require('../internals/create-property');
-var arraySpeciesCreate = require('../internals/array-species-create');
-var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var V8_VERSION = require('../internals/engine-v8-version');
-
-var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');
-var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
-var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';
-
-// We can't use this feature detection in V8 since it causes
-// deoptimization and serious performance degradation
-// https://github.com/zloirock/core-js/issues/679
-var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {
-  var array = [];
-  array[IS_CONCAT_SPREADABLE] = false;
-  return array.concat()[0] !== array;
-});
-
-var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');
-
-var isConcatSpreadable = function (O) {
-  if (!isObject(O)) return false;
-  var spreadable = O[IS_CONCAT_SPREADABLE];
-  return spreadable !== undefined ? !!spreadable : isArray(O);
-};
-
-var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;
-
-// `Array.prototype.concat` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.concat
-// with adding support of @@isConcatSpreadable and @@species
-$({ target: 'Array', proto: true, forced: FORCED }, {
-  concat: function concat(arg) { // eslint-disable-line no-unused-vars
-    var O = toObject(this);
-    var A = arraySpeciesCreate(O, 0);
-    var n = 0;
-    var i, k, length, len, E;
-    for (i = -1, length = arguments.length; i < length; i++) {
-      E = i === -1 ? O : arguments[i];
-      if (isConcatSpreadable(E)) {
-        len = toLength(E.length);
-        if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
-        for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);
-      } else {
-        if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
-        createProperty(A, n++, E);
-      }
-    }
-    A.length = n;
-    return A;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.copy-within.js b/node_modules/core-js-pure/modules/es.array.copy-within.js
deleted file mode 100644
index 1fb0dda..0000000
--- a/node_modules/core-js-pure/modules/es.array.copy-within.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var $ = require('../internals/export');
-var copyWithin = require('../internals/array-copy-within');
-var addToUnscopables = require('../internals/add-to-unscopables');
-
-// `Array.prototype.copyWithin` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin
-$({ target: 'Array', proto: true }, {
-  copyWithin: copyWithin
-});
-
-// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
-addToUnscopables('copyWithin');
diff --git a/node_modules/core-js-pure/modules/es.array.every.js b/node_modules/core-js-pure/modules/es.array.every.js
deleted file mode 100644
index 231c5c2..0000000
--- a/node_modules/core-js-pure/modules/es.array.every.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $every = require('../internals/array-iteration').every;
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var STRICT_METHOD = arrayMethodIsStrict('every');
-var USES_TO_LENGTH = arrayMethodUsesToLength('every');
-
-// `Array.prototype.every` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.every
-$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {
-  every: function every(callbackfn /* , thisArg */) {
-    return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.fill.js b/node_modules/core-js-pure/modules/es.array.fill.js
deleted file mode 100644
index ba9f4b4..0000000
--- a/node_modules/core-js-pure/modules/es.array.fill.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var $ = require('../internals/export');
-var fill = require('../internals/array-fill');
-var addToUnscopables = require('../internals/add-to-unscopables');
-
-// `Array.prototype.fill` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.fill
-$({ target: 'Array', proto: true }, {
-  fill: fill
-});
-
-// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
-addToUnscopables('fill');
diff --git a/node_modules/core-js-pure/modules/es.array.filter.js b/node_modules/core-js-pure/modules/es.array.filter.js
deleted file mode 100644
index df2509b..0000000
--- a/node_modules/core-js-pure/modules/es.array.filter.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $filter = require('../internals/array-iteration').filter;
-var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');
-// Edge 14- issue
-var USES_TO_LENGTH = arrayMethodUsesToLength('filter');
-
-// `Array.prototype.filter` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.filter
-// with adding support of @@species
-$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
-  filter: function filter(callbackfn /* , thisArg */) {
-    return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.find-index.js b/node_modules/core-js-pure/modules/es.array.find-index.js
deleted file mode 100644
index 56c0b68..0000000
--- a/node_modules/core-js-pure/modules/es.array.find-index.js
+++ /dev/null
@@ -1,24 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $findIndex = require('../internals/array-iteration').findIndex;
-var addToUnscopables = require('../internals/add-to-unscopables');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var FIND_INDEX = 'findIndex';
-var SKIPS_HOLES = true;
-
-var USES_TO_LENGTH = arrayMethodUsesToLength(FIND_INDEX);
-
-// Shouldn't skip holes
-if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });
-
-// `Array.prototype.findIndex` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.findindex
-$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {
-  findIndex: function findIndex(callbackfn /* , that = undefined */) {
-    return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
-
-// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
-addToUnscopables(FIND_INDEX);
diff --git a/node_modules/core-js-pure/modules/es.array.find.js b/node_modules/core-js-pure/modules/es.array.find.js
deleted file mode 100644
index ad37cc7..0000000
--- a/node_modules/core-js-pure/modules/es.array.find.js
+++ /dev/null
@@ -1,24 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $find = require('../internals/array-iteration').find;
-var addToUnscopables = require('../internals/add-to-unscopables');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var FIND = 'find';
-var SKIPS_HOLES = true;
-
-var USES_TO_LENGTH = arrayMethodUsesToLength(FIND);
-
-// Shouldn't skip holes
-if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });
-
-// `Array.prototype.find` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.find
-$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {
-  find: function find(callbackfn /* , that = undefined */) {
-    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
-
-// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
-addToUnscopables(FIND);
diff --git a/node_modules/core-js-pure/modules/es.array.flat-map.js b/node_modules/core-js-pure/modules/es.array.flat-map.js
deleted file mode 100644
index 5469bee..0000000
--- a/node_modules/core-js-pure/modules/es.array.flat-map.js
+++ /dev/null
@@ -1,21 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var flattenIntoArray = require('../internals/flatten-into-array');
-var toObject = require('../internals/to-object');
-var toLength = require('../internals/to-length');
-var aFunction = require('../internals/a-function');
-var arraySpeciesCreate = require('../internals/array-species-create');
-
-// `Array.prototype.flatMap` method
-// https://github.com/tc39/proposal-flatMap
-$({ target: 'Array', proto: true }, {
-  flatMap: function flatMap(callbackfn /* , thisArg */) {
-    var O = toObject(this);
-    var sourceLen = toLength(O.length);
-    var A;
-    aFunction(callbackfn);
-    A = arraySpeciesCreate(O, 0);
-    A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
-    return A;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.flat.js b/node_modules/core-js-pure/modules/es.array.flat.js
deleted file mode 100644
index cb2c9d7..0000000
--- a/node_modules/core-js-pure/modules/es.array.flat.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var flattenIntoArray = require('../internals/flatten-into-array');
-var toObject = require('../internals/to-object');
-var toLength = require('../internals/to-length');
-var toInteger = require('../internals/to-integer');
-var arraySpeciesCreate = require('../internals/array-species-create');
-
-// `Array.prototype.flat` method
-// https://github.com/tc39/proposal-flatMap
-$({ target: 'Array', proto: true }, {
-  flat: function flat(/* depthArg = 1 */) {
-    var depthArg = arguments.length ? arguments[0] : undefined;
-    var O = toObject(this);
-    var sourceLen = toLength(O.length);
-    var A = arraySpeciesCreate(O, 0);
-    A.length = flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));
-    return A;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.for-each.js b/node_modules/core-js-pure/modules/es.array.for-each.js
deleted file mode 100644
index 4fb29d0..0000000
--- a/node_modules/core-js-pure/modules/es.array.for-each.js
+++ /dev/null
@@ -1,9 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var forEach = require('../internals/array-for-each');
-
-// `Array.prototype.forEach` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.foreach
-$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {
-  forEach: forEach
-});
diff --git a/node_modules/core-js-pure/modules/es.array.from.js b/node_modules/core-js-pure/modules/es.array.from.js
deleted file mode 100644
index 5c21cbc..0000000
--- a/node_modules/core-js-pure/modules/es.array.from.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var $ = require('../internals/export');
-var from = require('../internals/array-from');
-var checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');
-
-var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {
-  Array.from(iterable);
-});
-
-// `Array.from` method
-// https://tc39.github.io/ecma262/#sec-array.from
-$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {
-  from: from
-});
diff --git a/node_modules/core-js-pure/modules/es.array.includes.js b/node_modules/core-js-pure/modules/es.array.includes.js
deleted file mode 100644
index 0036556..0000000
--- a/node_modules/core-js-pure/modules/es.array.includes.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $includes = require('../internals/array-includes').includes;
-var addToUnscopables = require('../internals/add-to-unscopables');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });
-
-// `Array.prototype.includes` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.includes
-$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {
-  includes: function includes(el /* , fromIndex = 0 */) {
-    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
-
-// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
-addToUnscopables('includes');
diff --git a/node_modules/core-js-pure/modules/es.array.index-of.js b/node_modules/core-js-pure/modules/es.array.index-of.js
deleted file mode 100644
index 5a1442b..0000000
--- a/node_modules/core-js-pure/modules/es.array.index-of.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $indexOf = require('../internals/array-includes').indexOf;
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var nativeIndexOf = [].indexOf;
-
-var NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;
-var STRICT_METHOD = arrayMethodIsStrict('indexOf');
-var USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });
-
-// `Array.prototype.indexOf` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.indexof
-$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {
-  indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {
-    return NEGATIVE_ZERO
-      // convert -0 to +0
-      ? nativeIndexOf.apply(this, arguments) || 0
-      : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.is-array.js b/node_modules/core-js-pure/modules/es.array.is-array.js
deleted file mode 100644
index b77fad6..0000000
--- a/node_modules/core-js-pure/modules/es.array.is-array.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var isArray = require('../internals/is-array');
-
-// `Array.isArray` method
-// https://tc39.github.io/ecma262/#sec-array.isarray
-$({ target: 'Array', stat: true }, {
-  isArray: isArray
-});
diff --git a/node_modules/core-js-pure/modules/es.array.iterator.js b/node_modules/core-js-pure/modules/es.array.iterator.js
deleted file mode 100644
index 5e64422..0000000
--- a/node_modules/core-js-pure/modules/es.array.iterator.js
+++ /dev/null
@@ -1,53 +0,0 @@
-'use strict';
-var toIndexedObject = require('../internals/to-indexed-object');
-var addToUnscopables = require('../internals/add-to-unscopables');
-var Iterators = require('../internals/iterators');
-var InternalStateModule = require('../internals/internal-state');
-var defineIterator = require('../internals/define-iterator');
-
-var ARRAY_ITERATOR = 'Array Iterator';
-var setInternalState = InternalStateModule.set;
-var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);
-
-// `Array.prototype.entries` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.entries
-// `Array.prototype.keys` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.keys
-// `Array.prototype.values` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.values
-// `Array.prototype[@@iterator]` method
-// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator
-// `CreateArrayIterator` internal method
-// https://tc39.github.io/ecma262/#sec-createarrayiterator
-module.exports = defineIterator(Array, 'Array', function (iterated, kind) {
-  setInternalState(this, {
-    type: ARRAY_ITERATOR,
-    target: toIndexedObject(iterated), // target
-    index: 0,                          // next index
-    kind: kind                         // kind
-  });
-// `%ArrayIteratorPrototype%.next` method
-// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next
-}, function () {
-  var state = getInternalState(this);
-  var target = state.target;
-  var kind = state.kind;
-  var index = state.index++;
-  if (!target || index >= target.length) {
-    state.target = undefined;
-    return { value: undefined, done: true };
-  }
-  if (kind == 'keys') return { value: index, done: false };
-  if (kind == 'values') return { value: target[index], done: false };
-  return { value: [index, target[index]], done: false };
-}, 'values');
-
-// argumentsList[@@iterator] is %ArrayProto_values%
-// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject
-// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject
-Iterators.Arguments = Iterators.Array;
-
-// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
-addToUnscopables('keys');
-addToUnscopables('values');
-addToUnscopables('entries');
diff --git a/node_modules/core-js-pure/modules/es.array.join.js b/node_modules/core-js-pure/modules/es.array.join.js
deleted file mode 100644
index 79ad8d2..0000000
--- a/node_modules/core-js-pure/modules/es.array.join.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IndexedObject = require('../internals/indexed-object');
-var toIndexedObject = require('../internals/to-indexed-object');
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-
-var nativeJoin = [].join;
-
-var ES3_STRINGS = IndexedObject != Object;
-var STRICT_METHOD = arrayMethodIsStrict('join', ',');
-
-// `Array.prototype.join` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.join
-$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {
-  join: function join(separator) {
-    return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.last-index-of.js b/node_modules/core-js-pure/modules/es.array.last-index-of.js
deleted file mode 100644
index d209055..0000000
--- a/node_modules/core-js-pure/modules/es.array.last-index-of.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var lastIndexOf = require('../internals/array-last-index-of');
-
-// `Array.prototype.lastIndexOf` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof
-$({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {
-  lastIndexOf: lastIndexOf
-});
diff --git a/node_modules/core-js-pure/modules/es.array.map.js b/node_modules/core-js-pure/modules/es.array.map.js
deleted file mode 100644
index f9a8cdf..0000000
--- a/node_modules/core-js-pure/modules/es.array.map.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $map = require('../internals/array-iteration').map;
-var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');
-// FF49- issue
-var USES_TO_LENGTH = arrayMethodUsesToLength('map');
-
-// `Array.prototype.map` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.map
-// with adding support of @@species
-$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
-  map: function map(callbackfn /* , thisArg */) {
-    return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.of.js b/node_modules/core-js-pure/modules/es.array.of.js
deleted file mode 100644
index 2788091..0000000
--- a/node_modules/core-js-pure/modules/es.array.of.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var fails = require('../internals/fails');
-var createProperty = require('../internals/create-property');
-
-var ISNT_GENERIC = fails(function () {
-  function F() { /* empty */ }
-  return !(Array.of.call(F) instanceof F);
-});
-
-// `Array.of` method
-// https://tc39.github.io/ecma262/#sec-array.of
-// WebKit Array.of isn't generic
-$({ target: 'Array', stat: true, forced: ISNT_GENERIC }, {
-  of: function of(/* ...args */) {
-    var index = 0;
-    var argumentsLength = arguments.length;
-    var result = new (typeof this == 'function' ? this : Array)(argumentsLength);
-    while (argumentsLength > index) createProperty(result, index, arguments[index++]);
-    result.length = argumentsLength;
-    return result;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.reduce-right.js b/node_modules/core-js-pure/modules/es.array.reduce-right.js
deleted file mode 100644
index 37aeb2d..0000000
--- a/node_modules/core-js-pure/modules/es.array.reduce-right.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $reduceRight = require('../internals/array-reduce').right;
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var STRICT_METHOD = arrayMethodIsStrict('reduceRight');
-// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method
-var USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });
-
-// `Array.prototype.reduceRight` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.reduceright
-$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {
-  reduceRight: function reduceRight(callbackfn /* , initialValue */) {
-    return $reduceRight(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.reduce.js b/node_modules/core-js-pure/modules/es.array.reduce.js
deleted file mode 100644
index 40e0458..0000000
--- a/node_modules/core-js-pure/modules/es.array.reduce.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $reduce = require('../internals/array-reduce').left;
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var STRICT_METHOD = arrayMethodIsStrict('reduce');
-var USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });
-
-// `Array.prototype.reduce` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.reduce
-$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {
-  reduce: function reduce(callbackfn /* , initialValue */) {
-    return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.reverse.js b/node_modules/core-js-pure/modules/es.array.reverse.js
deleted file mode 100644
index bfe96d5..0000000
--- a/node_modules/core-js-pure/modules/es.array.reverse.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var isArray = require('../internals/is-array');
-
-var nativeReverse = [].reverse;
-var test = [1, 2];
-
-// `Array.prototype.reverse` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.reverse
-// fix for Safari 12.0 bug
-// https://bugs.webkit.org/show_bug.cgi?id=188794
-$({ target: 'Array', proto: true, forced: String(test) === String(test.reverse()) }, {
-  reverse: function reverse() {
-    // eslint-disable-next-line no-self-assign
-    if (isArray(this)) this.length = this.length;
-    return nativeReverse.call(this);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.slice.js b/node_modules/core-js-pure/modules/es.array.slice.js
deleted file mode 100644
index 27609f5..0000000
--- a/node_modules/core-js-pure/modules/es.array.slice.js
+++ /dev/null
@@ -1,49 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var isObject = require('../internals/is-object');
-var isArray = require('../internals/is-array');
-var toAbsoluteIndex = require('../internals/to-absolute-index');
-var toLength = require('../internals/to-length');
-var toIndexedObject = require('../internals/to-indexed-object');
-var createProperty = require('../internals/create-property');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');
-var USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });
-
-var SPECIES = wellKnownSymbol('species');
-var nativeSlice = [].slice;
-var max = Math.max;
-
-// `Array.prototype.slice` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.slice
-// fallback for not array-like ES3 strings and DOM objects
-$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
-  slice: function slice(start, end) {
-    var O = toIndexedObject(this);
-    var length = toLength(O.length);
-    var k = toAbsoluteIndex(start, length);
-    var fin = toAbsoluteIndex(end === undefined ? length : end, length);
-    // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible
-    var Constructor, result, n;
-    if (isArray(O)) {
-      Constructor = O.constructor;
-      // cross-realm fallback
-      if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {
-        Constructor = undefined;
-      } else if (isObject(Constructor)) {
-        Constructor = Constructor[SPECIES];
-        if (Constructor === null) Constructor = undefined;
-      }
-      if (Constructor === Array || Constructor === undefined) {
-        return nativeSlice.call(O, k, fin);
-      }
-    }
-    result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));
-    for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);
-    result.length = n;
-    return result;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.some.js b/node_modules/core-js-pure/modules/es.array.some.js
deleted file mode 100644
index e143d07..0000000
--- a/node_modules/core-js-pure/modules/es.array.some.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $some = require('../internals/array-iteration').some;
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var STRICT_METHOD = arrayMethodIsStrict('some');
-var USES_TO_LENGTH = arrayMethodUsesToLength('some');
-
-// `Array.prototype.some` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.some
-$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {
-  some: function some(callbackfn /* , thisArg */) {
-    return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.sort.js b/node_modules/core-js-pure/modules/es.array.sort.js
deleted file mode 100644
index 1b46f51..0000000
--- a/node_modules/core-js-pure/modules/es.array.sort.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var aFunction = require('../internals/a-function');
-var toObject = require('../internals/to-object');
-var fails = require('../internals/fails');
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-
-var test = [];
-var nativeSort = test.sort;
-
-// IE8-
-var FAILS_ON_UNDEFINED = fails(function () {
-  test.sort(undefined);
-});
-// V8 bug
-var FAILS_ON_NULL = fails(function () {
-  test.sort(null);
-});
-// Old WebKit
-var STRICT_METHOD = arrayMethodIsStrict('sort');
-
-var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD;
-
-// `Array.prototype.sort` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.sort
-$({ target: 'Array', proto: true, forced: FORCED }, {
-  sort: function sort(comparefn) {
-    return comparefn === undefined
-      ? nativeSort.call(toObject(this))
-      : nativeSort.call(toObject(this), aFunction(comparefn));
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.species.js b/node_modules/core-js-pure/modules/es.array.species.js
deleted file mode 100644
index a0e7829..0000000
--- a/node_modules/core-js-pure/modules/es.array.species.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var setSpecies = require('../internals/set-species');
-
-// `Array[@@species]` getter
-// https://tc39.github.io/ecma262/#sec-get-array-@@species
-setSpecies('Array');
diff --git a/node_modules/core-js-pure/modules/es.array.splice.js b/node_modules/core-js-pure/modules/es.array.splice.js
deleted file mode 100644
index 31debca..0000000
--- a/node_modules/core-js-pure/modules/es.array.splice.js
+++ /dev/null
@@ -1,70 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var toAbsoluteIndex = require('../internals/to-absolute-index');
-var toInteger = require('../internals/to-integer');
-var toLength = require('../internals/to-length');
-var toObject = require('../internals/to-object');
-var arraySpeciesCreate = require('../internals/array-species-create');
-var createProperty = require('../internals/create-property');
-var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');
-var USES_TO_LENGTH = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });
-
-var max = Math.max;
-var min = Math.min;
-var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
-var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';
-
-// `Array.prototype.splice` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.splice
-// with adding support of @@species
-$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
-  splice: function splice(start, deleteCount /* , ...items */) {
-    var O = toObject(this);
-    var len = toLength(O.length);
-    var actualStart = toAbsoluteIndex(start, len);
-    var argumentsLength = arguments.length;
-    var insertCount, actualDeleteCount, A, k, from, to;
-    if (argumentsLength === 0) {
-      insertCount = actualDeleteCount = 0;
-    } else if (argumentsLength === 1) {
-      insertCount = 0;
-      actualDeleteCount = len - actualStart;
-    } else {
-      insertCount = argumentsLength - 2;
-      actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);
-    }
-    if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {
-      throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);
-    }
-    A = arraySpeciesCreate(O, actualDeleteCount);
-    for (k = 0; k < actualDeleteCount; k++) {
-      from = actualStart + k;
-      if (from in O) createProperty(A, k, O[from]);
-    }
-    A.length = actualDeleteCount;
-    if (insertCount < actualDeleteCount) {
-      for (k = actualStart; k < len - actualDeleteCount; k++) {
-        from = k + actualDeleteCount;
-        to = k + insertCount;
-        if (from in O) O[to] = O[from];
-        else delete O[to];
-      }
-      for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];
-    } else if (insertCount > actualDeleteCount) {
-      for (k = len - actualDeleteCount; k > actualStart; k--) {
-        from = k + actualDeleteCount - 1;
-        to = k + insertCount - 1;
-        if (from in O) O[to] = O[from];
-        else delete O[to];
-      }
-    }
-    for (k = 0; k < insertCount; k++) {
-      O[k + actualStart] = arguments[k + 2];
-    }
-    O.length = len - actualDeleteCount + insertCount;
-    return A;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.array.unscopables.flat-map.js b/node_modules/core-js-pure/modules/es.array.unscopables.flat-map.js
deleted file mode 100644
index 593cf05..0000000
--- a/node_modules/core-js-pure/modules/es.array.unscopables.flat-map.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// this method was added to unscopables after implementation
-// in popular engines, so it's moved to a separate module
-var addToUnscopables = require('../internals/add-to-unscopables');
-
-addToUnscopables('flatMap');
diff --git a/node_modules/core-js-pure/modules/es.array.unscopables.flat.js b/node_modules/core-js-pure/modules/es.array.unscopables.flat.js
deleted file mode 100644
index ce6656c..0000000
--- a/node_modules/core-js-pure/modules/es.array.unscopables.flat.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// this method was added to unscopables after implementation
-// in popular engines, so it's moved to a separate module
-var addToUnscopables = require('../internals/add-to-unscopables');
-
-addToUnscopables('flat');
diff --git a/node_modules/core-js-pure/modules/es.data-view.js b/node_modules/core-js-pure/modules/es.data-view.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.data-view.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.date.now.js b/node_modules/core-js-pure/modules/es.date.now.js
deleted file mode 100644
index c4dc75b..0000000
--- a/node_modules/core-js-pure/modules/es.date.now.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var $ = require('../internals/export');
-
-// `Date.now` method
-// https://tc39.github.io/ecma262/#sec-date.now
-$({ target: 'Date', stat: true }, {
-  now: function now() {
-    return new Date().getTime();
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.date.to-iso-string.js b/node_modules/core-js-pure/modules/es.date.to-iso-string.js
deleted file mode 100644
index 14f8ae0..0000000
--- a/node_modules/core-js-pure/modules/es.date.to-iso-string.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var $ = require('../internals/export');
-var toISOString = require('../internals/date-to-iso-string');
-
-// `Date.prototype.toISOString` method
-// https://tc39.github.io/ecma262/#sec-date.prototype.toisostring
-// PhantomJS / old WebKit has a broken implementations
-$({ target: 'Date', proto: true, forced: Date.prototype.toISOString !== toISOString }, {
-  toISOString: toISOString
-});
diff --git a/node_modules/core-js-pure/modules/es.date.to-json.js b/node_modules/core-js-pure/modules/es.date.to-json.js
deleted file mode 100644
index 592f9e8..0000000
--- a/node_modules/core-js-pure/modules/es.date.to-json.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var toObject = require('../internals/to-object');
-var toPrimitive = require('../internals/to-primitive');
-var toISOString = require('../internals/date-to-iso-string');
-var classof = require('../internals/classof-raw');
-var fails = require('../internals/fails');
-
-var FORCED = fails(function () {
-  return new Date(NaN).toJSON() !== null
-    || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;
-});
-
-$({ target: 'Date', proto: true, forced: FORCED }, {
-  // eslint-disable-next-line no-unused-vars
-  toJSON: function toJSON(key) {
-    var O = toObject(this);
-    var pv = toPrimitive(O);
-    return typeof pv == 'number' && !isFinite(pv) ? null :
-      (!('toISOString' in O) && classof(O) == 'Date') ? toISOString.call(O) : O.toISOString();
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.date.to-primitive.js b/node_modules/core-js-pure/modules/es.date.to-primitive.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.date.to-primitive.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.date.to-string.js b/node_modules/core-js-pure/modules/es.date.to-string.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.date.to-string.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.function.bind.js b/node_modules/core-js-pure/modules/es.function.bind.js
deleted file mode 100644
index fb33e96..0000000
--- a/node_modules/core-js-pure/modules/es.function.bind.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var bind = require('../internals/function-bind');
-
-// `Function.prototype.bind` method
-// https://tc39.github.io/ecma262/#sec-function.prototype.bind
-$({ target: 'Function', proto: true }, {
-  bind: bind
-});
diff --git a/node_modules/core-js-pure/modules/es.function.has-instance.js b/node_modules/core-js-pure/modules/es.function.has-instance.js
deleted file mode 100644
index 01383bd..0000000
--- a/node_modules/core-js-pure/modules/es.function.has-instance.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-var isObject = require('../internals/is-object');
-var definePropertyModule = require('../internals/object-define-property');
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var HAS_INSTANCE = wellKnownSymbol('hasInstance');
-var FunctionPrototype = Function.prototype;
-
-// `Function.prototype[@@hasInstance]` method
-// https://tc39.github.io/ecma262/#sec-function.prototype-@@hasinstance
-if (!(HAS_INSTANCE in FunctionPrototype)) {
-  definePropertyModule.f(FunctionPrototype, HAS_INSTANCE, { value: function (O) {
-    if (typeof this != 'function' || !isObject(O)) return false;
-    if (!isObject(this.prototype)) return O instanceof this;
-    // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:
-    while (O = getPrototypeOf(O)) if (this.prototype === O) return true;
-    return false;
-  } });
-}
diff --git a/node_modules/core-js-pure/modules/es.function.name.js b/node_modules/core-js-pure/modules/es.function.name.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.function.name.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.global-this.js b/node_modules/core-js-pure/modules/es.global-this.js
deleted file mode 100644
index 7e925c8..0000000
--- a/node_modules/core-js-pure/modules/es.global-this.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var global = require('../internals/global');
-
-// `globalThis` object
-// https://github.com/tc39/proposal-global
-$({ global: true }, {
-  globalThis: global
-});
diff --git a/node_modules/core-js-pure/modules/es.json.stringify.js b/node_modules/core-js-pure/modules/es.json.stringify.js
deleted file mode 100644
index 56ba89f..0000000
--- a/node_modules/core-js-pure/modules/es.json.stringify.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var $ = require('../internals/export');
-var getBuiltIn = require('../internals/get-built-in');
-var fails = require('../internals/fails');
-
-var $stringify = getBuiltIn('JSON', 'stringify');
-var re = /[\uD800-\uDFFF]/g;
-var low = /^[\uD800-\uDBFF]$/;
-var hi = /^[\uDC00-\uDFFF]$/;
-
-var fix = function (match, offset, string) {
-  var prev = string.charAt(offset - 1);
-  var next = string.charAt(offset + 1);
-  if ((low.test(match) && !hi.test(next)) || (hi.test(match) && !low.test(prev))) {
-    return '\\u' + match.charCodeAt(0).toString(16);
-  } return match;
-};
-
-var FORCED = fails(function () {
-  return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"'
-    || $stringify('\uDEAD') !== '"\\udead"';
-});
-
-if ($stringify) {
-  // https://github.com/tc39/proposal-well-formed-stringify
-  $({ target: 'JSON', stat: true, forced: FORCED }, {
-    // eslint-disable-next-line no-unused-vars
-    stringify: function stringify(it, replacer, space) {
-      var result = $stringify.apply(null, arguments);
-      return typeof result == 'string' ? result.replace(re, fix) : result;
-    }
-  });
-}
diff --git a/node_modules/core-js-pure/modules/es.json.to-string-tag.js b/node_modules/core-js-pure/modules/es.json.to-string-tag.js
deleted file mode 100644
index bdfa0cd..0000000
--- a/node_modules/core-js-pure/modules/es.json.to-string-tag.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var global = require('../internals/global');
-var setToStringTag = require('../internals/set-to-string-tag');
-
-// JSON[@@toStringTag] property
-// https://tc39.github.io/ecma262/#sec-json-@@tostringtag
-setToStringTag(global.JSON, 'JSON', true);
diff --git a/node_modules/core-js-pure/modules/es.map.js b/node_modules/core-js-pure/modules/es.map.js
deleted file mode 100644
index fa8ecce..0000000
--- a/node_modules/core-js-pure/modules/es.map.js
+++ /dev/null
@@ -1,9 +0,0 @@
-'use strict';
-var collection = require('../internals/collection');
-var collectionStrong = require('../internals/collection-strong');
-
-// `Map` constructor
-// https://tc39.github.io/ecma262/#sec-map-objects
-module.exports = collection('Map', function (init) {
-  return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };
-}, collectionStrong);
diff --git a/node_modules/core-js-pure/modules/es.math.acosh.js b/node_modules/core-js-pure/modules/es.math.acosh.js
deleted file mode 100644
index 62c85a4..0000000
--- a/node_modules/core-js-pure/modules/es.math.acosh.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var $ = require('../internals/export');
-var log1p = require('../internals/math-log1p');
-
-var nativeAcosh = Math.acosh;
-var log = Math.log;
-var sqrt = Math.sqrt;
-var LN2 = Math.LN2;
-
-var FORCED = !nativeAcosh
-  // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509
-  || Math.floor(nativeAcosh(Number.MAX_VALUE)) != 710
-  // Tor Browser bug: Math.acosh(Infinity) -> NaN
-  || nativeAcosh(Infinity) != Infinity;
-
-// `Math.acosh` method
-// https://tc39.github.io/ecma262/#sec-math.acosh
-$({ target: 'Math', stat: true, forced: FORCED }, {
-  acosh: function acosh(x) {
-    return (x = +x) < 1 ? NaN : x > 94906265.62425156
-      ? log(x) + LN2
-      : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.math.asinh.js b/node_modules/core-js-pure/modules/es.math.asinh.js
deleted file mode 100644
index 9308e21..0000000
--- a/node_modules/core-js-pure/modules/es.math.asinh.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var $ = require('../internals/export');
-
-var nativeAsinh = Math.asinh;
-var log = Math.log;
-var sqrt = Math.sqrt;
-
-function asinh(x) {
-  return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : log(x + sqrt(x * x + 1));
-}
-
-// `Math.asinh` method
-// https://tc39.github.io/ecma262/#sec-math.asinh
-// Tor Browser bug: Math.asinh(0) -> -0
-$({ target: 'Math', stat: true, forced: !(nativeAsinh && 1 / nativeAsinh(0) > 0) }, {
-  asinh: asinh
-});
diff --git a/node_modules/core-js-pure/modules/es.math.atanh.js b/node_modules/core-js-pure/modules/es.math.atanh.js
deleted file mode 100644
index 9116f8e..0000000
--- a/node_modules/core-js-pure/modules/es.math.atanh.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var $ = require('../internals/export');
-
-var nativeAtanh = Math.atanh;
-var log = Math.log;
-
-// `Math.atanh` method
-// https://tc39.github.io/ecma262/#sec-math.atanh
-// Tor Browser bug: Math.atanh(-0) -> 0
-$({ target: 'Math', stat: true, forced: !(nativeAtanh && 1 / nativeAtanh(-0) < 0) }, {
-  atanh: function atanh(x) {
-    return (x = +x) == 0 ? x : log((1 + x) / (1 - x)) / 2;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.math.cbrt.js b/node_modules/core-js-pure/modules/es.math.cbrt.js
deleted file mode 100644
index b93416f..0000000
--- a/node_modules/core-js-pure/modules/es.math.cbrt.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var $ = require('../internals/export');
-var sign = require('../internals/math-sign');
-
-var abs = Math.abs;
-var pow = Math.pow;
-
-// `Math.cbrt` method
-// https://tc39.github.io/ecma262/#sec-math.cbrt
-$({ target: 'Math', stat: true }, {
-  cbrt: function cbrt(x) {
-    return sign(x = +x) * pow(abs(x), 1 / 3);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.math.clz32.js b/node_modules/core-js-pure/modules/es.math.clz32.js
deleted file mode 100644
index 7a18e64..0000000
--- a/node_modules/core-js-pure/modules/es.math.clz32.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var $ = require('../internals/export');
-
-var floor = Math.floor;
-var log = Math.log;
-var LOG2E = Math.LOG2E;
-
-// `Math.clz32` method
-// https://tc39.github.io/ecma262/#sec-math.clz32
-$({ target: 'Math', stat: true }, {
-  clz32: function clz32(x) {
-    return (x >>>= 0) ? 31 - floor(log(x + 0.5) * LOG2E) : 32;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.math.cosh.js b/node_modules/core-js-pure/modules/es.math.cosh.js
deleted file mode 100644
index 0c7322a..0000000
--- a/node_modules/core-js-pure/modules/es.math.cosh.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var $ = require('../internals/export');
-var expm1 = require('../internals/math-expm1');
-
-var nativeCosh = Math.cosh;
-var abs = Math.abs;
-var E = Math.E;
-
-// `Math.cosh` method
-// https://tc39.github.io/ecma262/#sec-math.cosh
-$({ target: 'Math', stat: true, forced: !nativeCosh || nativeCosh(710) === Infinity }, {
-  cosh: function cosh(x) {
-    var t = expm1(abs(x) - 1) + 1;
-    return (t + 1 / (t * E * E)) * (E / 2);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.math.expm1.js b/node_modules/core-js-pure/modules/es.math.expm1.js
deleted file mode 100644
index 956eb6f..0000000
--- a/node_modules/core-js-pure/modules/es.math.expm1.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var $ = require('../internals/export');
-var expm1 = require('../internals/math-expm1');
-
-// `Math.expm1` method
-// https://tc39.github.io/ecma262/#sec-math.expm1
-$({ target: 'Math', stat: true, forced: expm1 != Math.expm1 }, { expm1: expm1 });
diff --git a/node_modules/core-js-pure/modules/es.math.fround.js b/node_modules/core-js-pure/modules/es.math.fround.js
deleted file mode 100644
index 5df62db..0000000
--- a/node_modules/core-js-pure/modules/es.math.fround.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var $ = require('../internals/export');
-var fround = require('../internals/math-fround');
-
-// `Math.fround` method
-// https://tc39.github.io/ecma262/#sec-math.fround
-$({ target: 'Math', stat: true }, { fround: fround });
diff --git a/node_modules/core-js-pure/modules/es.math.hypot.js b/node_modules/core-js-pure/modules/es.math.hypot.js
deleted file mode 100644
index 0e8d17b..0000000
--- a/node_modules/core-js-pure/modules/es.math.hypot.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var $ = require('../internals/export');
-
-var $hypot = Math.hypot;
-var abs = Math.abs;
-var sqrt = Math.sqrt;
-
-// Chrome 77 bug
-// https://bugs.chromium.org/p/v8/issues/detail?id=9546
-var BUGGY = !!$hypot && $hypot(Infinity, NaN) !== Infinity;
-
-// `Math.hypot` method
-// https://tc39.github.io/ecma262/#sec-math.hypot
-$({ target: 'Math', stat: true, forced: BUGGY }, {
-  hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars
-    var sum = 0;
-    var i = 0;
-    var aLen = arguments.length;
-    var larg = 0;
-    var arg, div;
-    while (i < aLen) {
-      arg = abs(arguments[i++]);
-      if (larg < arg) {
-        div = larg / arg;
-        sum = sum * div * div + 1;
-        larg = arg;
-      } else if (arg > 0) {
-        div = arg / larg;
-        sum += div * div;
-      } else sum += arg;
-    }
-    return larg === Infinity ? Infinity : larg * sqrt(sum);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.math.imul.js b/node_modules/core-js-pure/modules/es.math.imul.js
deleted file mode 100644
index 3882a3e..0000000
--- a/node_modules/core-js-pure/modules/es.math.imul.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var $ = require('../internals/export');
-var fails = require('../internals/fails');
-
-var nativeImul = Math.imul;
-
-var FORCED = fails(function () {
-  return nativeImul(0xFFFFFFFF, 5) != -5 || nativeImul.length != 2;
-});
-
-// `Math.imul` method
-// https://tc39.github.io/ecma262/#sec-math.imul
-// some WebKit versions fails with big numbers, some has wrong arity
-$({ target: 'Math', stat: true, forced: FORCED }, {
-  imul: function imul(x, y) {
-    var UINT16 = 0xFFFF;
-    var xn = +x;
-    var yn = +y;
-    var xl = UINT16 & xn;
-    var yl = UINT16 & yn;
-    return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.math.log10.js b/node_modules/core-js-pure/modules/es.math.log10.js
deleted file mode 100644
index 86ba3db..0000000
--- a/node_modules/core-js-pure/modules/es.math.log10.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var $ = require('../internals/export');
-
-var log = Math.log;
-var LOG10E = Math.LOG10E;
-
-// `Math.log10` method
-// https://tc39.github.io/ecma262/#sec-math.log10
-$({ target: 'Math', stat: true }, {
-  log10: function log10(x) {
-    return log(x) * LOG10E;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.math.log1p.js b/node_modules/core-js-pure/modules/es.math.log1p.js
deleted file mode 100644
index 0327661..0000000
--- a/node_modules/core-js-pure/modules/es.math.log1p.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var $ = require('../internals/export');
-var log1p = require('../internals/math-log1p');
-
-// `Math.log1p` method
-// https://tc39.github.io/ecma262/#sec-math.log1p
-$({ target: 'Math', stat: true }, { log1p: log1p });
diff --git a/node_modules/core-js-pure/modules/es.math.log2.js b/node_modules/core-js-pure/modules/es.math.log2.js
deleted file mode 100644
index 22fcedf..0000000
--- a/node_modules/core-js-pure/modules/es.math.log2.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var $ = require('../internals/export');
-
-var log = Math.log;
-var LN2 = Math.LN2;
-
-// `Math.log2` method
-// https://tc39.github.io/ecma262/#sec-math.log2
-$({ target: 'Math', stat: true }, {
-  log2: function log2(x) {
-    return log(x) / LN2;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.math.sign.js b/node_modules/core-js-pure/modules/es.math.sign.js
deleted file mode 100644
index 19e3a78..0000000
--- a/node_modules/core-js-pure/modules/es.math.sign.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var sign = require('../internals/math-sign');
-
-// `Math.sign` method
-// https://tc39.github.io/ecma262/#sec-math.sign
-$({ target: 'Math', stat: true }, {
-  sign: sign
-});
diff --git a/node_modules/core-js-pure/modules/es.math.sinh.js b/node_modules/core-js-pure/modules/es.math.sinh.js
deleted file mode 100644
index 11ba610..0000000
--- a/node_modules/core-js-pure/modules/es.math.sinh.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var $ = require('../internals/export');
-var fails = require('../internals/fails');
-var expm1 = require('../internals/math-expm1');
-
-var abs = Math.abs;
-var exp = Math.exp;
-var E = Math.E;
-
-var FORCED = fails(function () {
-  return Math.sinh(-2e-17) != -2e-17;
-});
-
-// `Math.sinh` method
-// https://tc39.github.io/ecma262/#sec-math.sinh
-// V8 near Chromium 38 has a problem with very small numbers
-$({ target: 'Math', stat: true, forced: FORCED }, {
-  sinh: function sinh(x) {
-    return abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (E / 2);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.math.tanh.js b/node_modules/core-js-pure/modules/es.math.tanh.js
deleted file mode 100644
index 3b57402..0000000
--- a/node_modules/core-js-pure/modules/es.math.tanh.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var $ = require('../internals/export');
-var expm1 = require('../internals/math-expm1');
-
-var exp = Math.exp;
-
-// `Math.tanh` method
-// https://tc39.github.io/ecma262/#sec-math.tanh
-$({ target: 'Math', stat: true }, {
-  tanh: function tanh(x) {
-    var a = expm1(x = +x);
-    var b = expm1(-x);
-    return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.math.to-string-tag.js b/node_modules/core-js-pure/modules/es.math.to-string-tag.js
deleted file mode 100644
index 4ab0811..0000000
--- a/node_modules/core-js-pure/modules/es.math.to-string-tag.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var setToStringTag = require('../internals/set-to-string-tag');
-
-// Math[@@toStringTag] property
-// https://tc39.github.io/ecma262/#sec-math-@@tostringtag
-setToStringTag(Math, 'Math', true);
diff --git a/node_modules/core-js-pure/modules/es.math.trunc.js b/node_modules/core-js-pure/modules/es.math.trunc.js
deleted file mode 100644
index 0e8351d..0000000
--- a/node_modules/core-js-pure/modules/es.math.trunc.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var $ = require('../internals/export');
-
-var ceil = Math.ceil;
-var floor = Math.floor;
-
-// `Math.trunc` method
-// https://tc39.github.io/ecma262/#sec-math.trunc
-$({ target: 'Math', stat: true }, {
-  trunc: function trunc(it) {
-    return (it > 0 ? floor : ceil)(it);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.number.constructor.js b/node_modules/core-js-pure/modules/es.number.constructor.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.number.constructor.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.number.epsilon.js b/node_modules/core-js-pure/modules/es.number.epsilon.js
deleted file mode 100644
index b602724..0000000
--- a/node_modules/core-js-pure/modules/es.number.epsilon.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var $ = require('../internals/export');
-
-// `Number.EPSILON` constant
-// https://tc39.github.io/ecma262/#sec-number.epsilon
-$({ target: 'Number', stat: true }, {
-  EPSILON: Math.pow(2, -52)
-});
diff --git a/node_modules/core-js-pure/modules/es.number.is-finite.js b/node_modules/core-js-pure/modules/es.number.is-finite.js
deleted file mode 100644
index 6308eb4..0000000
--- a/node_modules/core-js-pure/modules/es.number.is-finite.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var $ = require('../internals/export');
-var numberIsFinite = require('../internals/number-is-finite');
-
-// `Number.isFinite` method
-// https://tc39.github.io/ecma262/#sec-number.isfinite
-$({ target: 'Number', stat: true }, { isFinite: numberIsFinite });
diff --git a/node_modules/core-js-pure/modules/es.number.is-integer.js b/node_modules/core-js-pure/modules/es.number.is-integer.js
deleted file mode 100644
index b15b739..0000000
--- a/node_modules/core-js-pure/modules/es.number.is-integer.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var isInteger = require('../internals/is-integer');
-
-// `Number.isInteger` method
-// https://tc39.github.io/ecma262/#sec-number.isinteger
-$({ target: 'Number', stat: true }, {
-  isInteger: isInteger
-});
diff --git a/node_modules/core-js-pure/modules/es.number.is-nan.js b/node_modules/core-js-pure/modules/es.number.is-nan.js
deleted file mode 100644
index f384acc..0000000
--- a/node_modules/core-js-pure/modules/es.number.is-nan.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var $ = require('../internals/export');
-
-// `Number.isNaN` method
-// https://tc39.github.io/ecma262/#sec-number.isnan
-$({ target: 'Number', stat: true }, {
-  isNaN: function isNaN(number) {
-    // eslint-disable-next-line no-self-compare
-    return number != number;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.number.is-safe-integer.js b/node_modules/core-js-pure/modules/es.number.is-safe-integer.js
deleted file mode 100644
index cea6704..0000000
--- a/node_modules/core-js-pure/modules/es.number.is-safe-integer.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var $ = require('../internals/export');
-var isInteger = require('../internals/is-integer');
-
-var abs = Math.abs;
-
-// `Number.isSafeInteger` method
-// https://tc39.github.io/ecma262/#sec-number.issafeinteger
-$({ target: 'Number', stat: true }, {
-  isSafeInteger: function isSafeInteger(number) {
-    return isInteger(number) && abs(number) <= 0x1FFFFFFFFFFFFF;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.number.max-safe-integer.js b/node_modules/core-js-pure/modules/es.number.max-safe-integer.js
deleted file mode 100644
index 7fc5890..0000000
--- a/node_modules/core-js-pure/modules/es.number.max-safe-integer.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var $ = require('../internals/export');
-
-// `Number.MAX_SAFE_INTEGER` constant
-// https://tc39.github.io/ecma262/#sec-number.max_safe_integer
-$({ target: 'Number', stat: true }, {
-  MAX_SAFE_INTEGER: 0x1FFFFFFFFFFFFF
-});
diff --git a/node_modules/core-js-pure/modules/es.number.min-safe-integer.js b/node_modules/core-js-pure/modules/es.number.min-safe-integer.js
deleted file mode 100644
index 500a8f6..0000000
--- a/node_modules/core-js-pure/modules/es.number.min-safe-integer.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var $ = require('../internals/export');
-
-// `Number.MIN_SAFE_INTEGER` constant
-// https://tc39.github.io/ecma262/#sec-number.min_safe_integer
-$({ target: 'Number', stat: true }, {
-  MIN_SAFE_INTEGER: -0x1FFFFFFFFFFFFF
-});
diff --git a/node_modules/core-js-pure/modules/es.number.parse-float.js b/node_modules/core-js-pure/modules/es.number.parse-float.js
deleted file mode 100644
index 5310ec1..0000000
--- a/node_modules/core-js-pure/modules/es.number.parse-float.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var parseFloat = require('../internals/number-parse-float');
-
-// `Number.parseFloat` method
-// https://tc39.github.io/ecma262/#sec-number.parseFloat
-$({ target: 'Number', stat: true, forced: Number.parseFloat != parseFloat }, {
-  parseFloat: parseFloat
-});
diff --git a/node_modules/core-js-pure/modules/es.number.parse-int.js b/node_modules/core-js-pure/modules/es.number.parse-int.js
deleted file mode 100644
index 7f31df1..0000000
--- a/node_modules/core-js-pure/modules/es.number.parse-int.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var parseInt = require('../internals/number-parse-int');
-
-// `Number.parseInt` method
-// https://tc39.github.io/ecma262/#sec-number.parseint
-$({ target: 'Number', stat: true, forced: Number.parseInt != parseInt }, {
-  parseInt: parseInt
-});
diff --git a/node_modules/core-js-pure/modules/es.number.to-fixed.js b/node_modules/core-js-pure/modules/es.number.to-fixed.js
deleted file mode 100644
index fa4d3e2..0000000
--- a/node_modules/core-js-pure/modules/es.number.to-fixed.js
+++ /dev/null
@@ -1,126 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var toInteger = require('../internals/to-integer');
-var thisNumberValue = require('../internals/this-number-value');
-var repeat = require('../internals/string-repeat');
-var fails = require('../internals/fails');
-
-var nativeToFixed = 1.0.toFixed;
-var floor = Math.floor;
-
-var pow = function (x, n, acc) {
-  return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);
-};
-
-var log = function (x) {
-  var n = 0;
-  var x2 = x;
-  while (x2 >= 4096) {
-    n += 12;
-    x2 /= 4096;
-  }
-  while (x2 >= 2) {
-    n += 1;
-    x2 /= 2;
-  } return n;
-};
-
-var FORCED = nativeToFixed && (
-  0.00008.toFixed(3) !== '0.000' ||
-  0.9.toFixed(0) !== '1' ||
-  1.255.toFixed(2) !== '1.25' ||
-  1000000000000000128.0.toFixed(0) !== '1000000000000000128'
-) || !fails(function () {
-  // V8 ~ Android 4.3-
-  nativeToFixed.call({});
-});
-
-// `Number.prototype.toFixed` method
-// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed
-$({ target: 'Number', proto: true, forced: FORCED }, {
-  // eslint-disable-next-line max-statements
-  toFixed: function toFixed(fractionDigits) {
-    var number = thisNumberValue(this);
-    var fractDigits = toInteger(fractionDigits);
-    var data = [0, 0, 0, 0, 0, 0];
-    var sign = '';
-    var result = '0';
-    var e, z, j, k;
-
-    var multiply = function (n, c) {
-      var index = -1;
-      var c2 = c;
-      while (++index < 6) {
-        c2 += n * data[index];
-        data[index] = c2 % 1e7;
-        c2 = floor(c2 / 1e7);
-      }
-    };
-
-    var divide = function (n) {
-      var index = 6;
-      var c = 0;
-      while (--index >= 0) {
-        c += data[index];
-        data[index] = floor(c / n);
-        c = (c % n) * 1e7;
-      }
-    };
-
-    var dataToString = function () {
-      var index = 6;
-      var s = '';
-      while (--index >= 0) {
-        if (s !== '' || index === 0 || data[index] !== 0) {
-          var t = String(data[index]);
-          s = s === '' ? t : s + repeat.call('0', 7 - t.length) + t;
-        }
-      } return s;
-    };
-
-    if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');
-    // eslint-disable-next-line no-self-compare
-    if (number != number) return 'NaN';
-    if (number <= -1e21 || number >= 1e21) return String(number);
-    if (number < 0) {
-      sign = '-';
-      number = -number;
-    }
-    if (number > 1e-21) {
-      e = log(number * pow(2, 69, 1)) - 69;
-      z = e < 0 ? number * pow(2, -e, 1) : number / pow(2, e, 1);
-      z *= 0x10000000000000;
-      e = 52 - e;
-      if (e > 0) {
-        multiply(0, z);
-        j = fractDigits;
-        while (j >= 7) {
-          multiply(1e7, 0);
-          j -= 7;
-        }
-        multiply(pow(10, j, 1), 0);
-        j = e - 1;
-        while (j >= 23) {
-          divide(1 << 23);
-          j -= 23;
-        }
-        divide(1 << j);
-        multiply(1, 1);
-        divide(2);
-        result = dataToString();
-      } else {
-        multiply(0, z);
-        multiply(1 << -e, 0);
-        result = dataToString() + repeat.call('0', fractDigits);
-      }
-    }
-    if (fractDigits > 0) {
-      k = result.length;
-      result = sign + (k <= fractDigits
-        ? '0.' + repeat.call('0', fractDigits - k) + result
-        : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));
-    } else {
-      result = sign + result;
-    } return result;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.number.to-precision.js b/node_modules/core-js-pure/modules/es.number.to-precision.js
deleted file mode 100644
index 7108296..0000000
--- a/node_modules/core-js-pure/modules/es.number.to-precision.js
+++ /dev/null
@@ -1,24 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var fails = require('../internals/fails');
-var thisNumberValue = require('../internals/this-number-value');
-
-var nativeToPrecision = 1.0.toPrecision;
-
-var FORCED = fails(function () {
-  // IE7-
-  return nativeToPrecision.call(1, undefined) !== '1';
-}) || !fails(function () {
-  // V8 ~ Android 4.3-
-  nativeToPrecision.call({});
-});
-
-// `Number.prototype.toPrecision` method
-// https://tc39.github.io/ecma262/#sec-number.prototype.toprecision
-$({ target: 'Number', proto: true, forced: FORCED }, {
-  toPrecision: function toPrecision(precision) {
-    return precision === undefined
-      ? nativeToPrecision.call(thisNumberValue(this))
-      : nativeToPrecision.call(thisNumberValue(this), precision);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.object.assign.js b/node_modules/core-js-pure/modules/es.object.assign.js
deleted file mode 100644
index 5b00e6a..0000000
--- a/node_modules/core-js-pure/modules/es.object.assign.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var assign = require('../internals/object-assign');
-
-// `Object.assign` method
-// https://tc39.github.io/ecma262/#sec-object.assign
-$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {
-  assign: assign
-});
diff --git a/node_modules/core-js-pure/modules/es.object.create.js b/node_modules/core-js-pure/modules/es.object.create.js
deleted file mode 100644
index 3c27869..0000000
--- a/node_modules/core-js-pure/modules/es.object.create.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var create = require('../internals/object-create');
-
-// `Object.create` method
-// https://tc39.github.io/ecma262/#sec-object.create
-$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {
-  create: create
-});
diff --git a/node_modules/core-js-pure/modules/es.object.define-getter.js b/node_modules/core-js-pure/modules/es.object.define-getter.js
deleted file mode 100644
index 0a44e45..0000000
--- a/node_modules/core-js-pure/modules/es.object.define-getter.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var FORCED = require('../internals/object-prototype-accessors-forced');
-var toObject = require('../internals/to-object');
-var aFunction = require('../internals/a-function');
-var definePropertyModule = require('../internals/object-define-property');
-
-// `Object.prototype.__defineGetter__` method
-// https://tc39.github.io/ecma262/#sec-object.prototype.__defineGetter__
-if (DESCRIPTORS) {
-  $({ target: 'Object', proto: true, forced: FORCED }, {
-    __defineGetter__: function __defineGetter__(P, getter) {
-      definePropertyModule.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true });
-    }
-  });
-}
diff --git a/node_modules/core-js-pure/modules/es.object.define-properties.js b/node_modules/core-js-pure/modules/es.object.define-properties.js
deleted file mode 100644
index 9400799..0000000
--- a/node_modules/core-js-pure/modules/es.object.define-properties.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var defineProperties = require('../internals/object-define-properties');
-
-// `Object.defineProperties` method
-// https://tc39.github.io/ecma262/#sec-object.defineproperties
-$({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, {
-  defineProperties: defineProperties
-});
diff --git a/node_modules/core-js-pure/modules/es.object.define-property.js b/node_modules/core-js-pure/modules/es.object.define-property.js
deleted file mode 100644
index 19fcf5b..0000000
--- a/node_modules/core-js-pure/modules/es.object.define-property.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var objectDefinePropertyModile = require('../internals/object-define-property');
-
-// `Object.defineProperty` method
-// https://tc39.github.io/ecma262/#sec-object.defineproperty
-$({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, {
-  defineProperty: objectDefinePropertyModile.f
-});
diff --git a/node_modules/core-js-pure/modules/es.object.define-setter.js b/node_modules/core-js-pure/modules/es.object.define-setter.js
deleted file mode 100644
index 4250177..0000000
--- a/node_modules/core-js-pure/modules/es.object.define-setter.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var FORCED = require('../internals/object-prototype-accessors-forced');
-var toObject = require('../internals/to-object');
-var aFunction = require('../internals/a-function');
-var definePropertyModule = require('../internals/object-define-property');
-
-// `Object.prototype.__defineSetter__` method
-// https://tc39.github.io/ecma262/#sec-object.prototype.__defineSetter__
-if (DESCRIPTORS) {
-  $({ target: 'Object', proto: true, forced: FORCED }, {
-    __defineSetter__: function __defineSetter__(P, setter) {
-      definePropertyModule.f(toObject(this), P, { set: aFunction(setter), enumerable: true, configurable: true });
-    }
-  });
-}
diff --git a/node_modules/core-js-pure/modules/es.object.entries.js b/node_modules/core-js-pure/modules/es.object.entries.js
deleted file mode 100644
index a22e693..0000000
--- a/node_modules/core-js-pure/modules/es.object.entries.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var $ = require('../internals/export');
-var $entries = require('../internals/object-to-array').entries;
-
-// `Object.entries` method
-// https://tc39.github.io/ecma262/#sec-object.entries
-$({ target: 'Object', stat: true }, {
-  entries: function entries(O) {
-    return $entries(O);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.object.freeze.js b/node_modules/core-js-pure/modules/es.object.freeze.js
deleted file mode 100644
index 0a623bd..0000000
--- a/node_modules/core-js-pure/modules/es.object.freeze.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var $ = require('../internals/export');
-var FREEZING = require('../internals/freezing');
-var fails = require('../internals/fails');
-var isObject = require('../internals/is-object');
-var onFreeze = require('../internals/internal-metadata').onFreeze;
-
-var nativeFreeze = Object.freeze;
-var FAILS_ON_PRIMITIVES = fails(function () { nativeFreeze(1); });
-
-// `Object.freeze` method
-// https://tc39.github.io/ecma262/#sec-object.freeze
-$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {
-  freeze: function freeze(it) {
-    return nativeFreeze && isObject(it) ? nativeFreeze(onFreeze(it)) : it;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.object.from-entries.js b/node_modules/core-js-pure/modules/es.object.from-entries.js
deleted file mode 100644
index 2886e81..0000000
--- a/node_modules/core-js-pure/modules/es.object.from-entries.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var $ = require('../internals/export');
-var iterate = require('../internals/iterate');
-var createProperty = require('../internals/create-property');
-
-// `Object.fromEntries` method
-// https://github.com/tc39/proposal-object-from-entries
-$({ target: 'Object', stat: true }, {
-  fromEntries: function fromEntries(iterable) {
-    var obj = {};
-    iterate(iterable, function (k, v) {
-      createProperty(obj, k, v);
-    }, undefined, true);
-    return obj;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.object.get-own-property-descriptor.js b/node_modules/core-js-pure/modules/es.object.get-own-property-descriptor.js
deleted file mode 100644
index bfeeb88..0000000
--- a/node_modules/core-js-pure/modules/es.object.get-own-property-descriptor.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var $ = require('../internals/export');
-var fails = require('../internals/fails');
-var toIndexedObject = require('../internals/to-indexed-object');
-var nativeGetOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
-var DESCRIPTORS = require('../internals/descriptors');
-
-var FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });
-var FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;
-
-// `Object.getOwnPropertyDescriptor` method
-// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor
-$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {
-  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {
-    return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.object.get-own-property-descriptors.js b/node_modules/core-js-pure/modules/es.object.get-own-property-descriptors.js
deleted file mode 100644
index e29c917..0000000
--- a/node_modules/core-js-pure/modules/es.object.get-own-property-descriptors.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var ownKeys = require('../internals/own-keys');
-var toIndexedObject = require('../internals/to-indexed-object');
-var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');
-var createProperty = require('../internals/create-property');
-
-// `Object.getOwnPropertyDescriptors` method
-// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors
-$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {
-  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
-    var O = toIndexedObject(object);
-    var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
-    var keys = ownKeys(O);
-    var result = {};
-    var index = 0;
-    var key, descriptor;
-    while (keys.length > index) {
-      descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);
-      if (descriptor !== undefined) createProperty(result, key, descriptor);
-    }
-    return result;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.object.get-own-property-names.js b/node_modules/core-js-pure/modules/es.object.get-own-property-names.js
deleted file mode 100644
index 6a52f45..0000000
--- a/node_modules/core-js-pure/modules/es.object.get-own-property-names.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var $ = require('../internals/export');
-var fails = require('../internals/fails');
-var nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names-external').f;
-
-var FAILS_ON_PRIMITIVES = fails(function () { return !Object.getOwnPropertyNames(1); });
-
-// `Object.getOwnPropertyNames` method
-// https://tc39.github.io/ecma262/#sec-object.getownpropertynames
-$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
-  getOwnPropertyNames: nativeGetOwnPropertyNames
-});
diff --git a/node_modules/core-js-pure/modules/es.object.get-prototype-of.js b/node_modules/core-js-pure/modules/es.object.get-prototype-of.js
deleted file mode 100644
index 7cbb548..0000000
--- a/node_modules/core-js-pure/modules/es.object.get-prototype-of.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var $ = require('../internals/export');
-var fails = require('../internals/fails');
-var toObject = require('../internals/to-object');
-var nativeGetPrototypeOf = require('../internals/object-get-prototype-of');
-var CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');
-
-var FAILS_ON_PRIMITIVES = fails(function () { nativeGetPrototypeOf(1); });
-
-// `Object.getPrototypeOf` method
-// https://tc39.github.io/ecma262/#sec-object.getprototypeof
-$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !CORRECT_PROTOTYPE_GETTER }, {
-  getPrototypeOf: function getPrototypeOf(it) {
-    return nativeGetPrototypeOf(toObject(it));
-  }
-});
-
diff --git a/node_modules/core-js-pure/modules/es.object.is-extensible.js b/node_modules/core-js-pure/modules/es.object.is-extensible.js
deleted file mode 100644
index 556405b..0000000
--- a/node_modules/core-js-pure/modules/es.object.is-extensible.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var $ = require('../internals/export');
-var fails = require('../internals/fails');
-var isObject = require('../internals/is-object');
-
-var nativeIsExtensible = Object.isExtensible;
-var FAILS_ON_PRIMITIVES = fails(function () { nativeIsExtensible(1); });
-
-// `Object.isExtensible` method
-// https://tc39.github.io/ecma262/#sec-object.isextensible
-$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
-  isExtensible: function isExtensible(it) {
-    return isObject(it) ? nativeIsExtensible ? nativeIsExtensible(it) : true : false;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.object.is-frozen.js b/node_modules/core-js-pure/modules/es.object.is-frozen.js
deleted file mode 100644
index 060314d..0000000
--- a/node_modules/core-js-pure/modules/es.object.is-frozen.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var $ = require('../internals/export');
-var fails = require('../internals/fails');
-var isObject = require('../internals/is-object');
-
-var nativeIsFrozen = Object.isFrozen;
-var FAILS_ON_PRIMITIVES = fails(function () { nativeIsFrozen(1); });
-
-// `Object.isFrozen` method
-// https://tc39.github.io/ecma262/#sec-object.isfrozen
-$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
-  isFrozen: function isFrozen(it) {
-    return isObject(it) ? nativeIsFrozen ? nativeIsFrozen(it) : false : true;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.object.is-sealed.js b/node_modules/core-js-pure/modules/es.object.is-sealed.js
deleted file mode 100644
index 0f8b95f..0000000
--- a/node_modules/core-js-pure/modules/es.object.is-sealed.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var $ = require('../internals/export');
-var fails = require('../internals/fails');
-var isObject = require('../internals/is-object');
-
-var nativeIsSealed = Object.isSealed;
-var FAILS_ON_PRIMITIVES = fails(function () { nativeIsSealed(1); });
-
-// `Object.isSealed` method
-// https://tc39.github.io/ecma262/#sec-object.issealed
-$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
-  isSealed: function isSealed(it) {
-    return isObject(it) ? nativeIsSealed ? nativeIsSealed(it) : false : true;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.object.is.js b/node_modules/core-js-pure/modules/es.object.is.js
deleted file mode 100644
index 9ef6f0a..0000000
--- a/node_modules/core-js-pure/modules/es.object.is.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var is = require('../internals/same-value');
-
-// `Object.is` method
-// https://tc39.github.io/ecma262/#sec-object.is
-$({ target: 'Object', stat: true }, {
-  is: is
-});
diff --git a/node_modules/core-js-pure/modules/es.object.keys.js b/node_modules/core-js-pure/modules/es.object.keys.js
deleted file mode 100644
index dc24884..0000000
--- a/node_modules/core-js-pure/modules/es.object.keys.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var $ = require('../internals/export');
-var toObject = require('../internals/to-object');
-var nativeKeys = require('../internals/object-keys');
-var fails = require('../internals/fails');
-
-var FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });
-
-// `Object.keys` method
-// https://tc39.github.io/ecma262/#sec-object.keys
-$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
-  keys: function keys(it) {
-    return nativeKeys(toObject(it));
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.object.lookup-getter.js b/node_modules/core-js-pure/modules/es.object.lookup-getter.js
deleted file mode 100644
index 46e3fd0..0000000
--- a/node_modules/core-js-pure/modules/es.object.lookup-getter.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var FORCED = require('../internals/object-prototype-accessors-forced');
-var toObject = require('../internals/to-object');
-var toPrimitive = require('../internals/to-primitive');
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
-
-// `Object.prototype.__lookupGetter__` method
-// https://tc39.github.io/ecma262/#sec-object.prototype.__lookupGetter__
-if (DESCRIPTORS) {
-  $({ target: 'Object', proto: true, forced: FORCED }, {
-    __lookupGetter__: function __lookupGetter__(P) {
-      var O = toObject(this);
-      var key = toPrimitive(P, true);
-      var desc;
-      do {
-        if (desc = getOwnPropertyDescriptor(O, key)) return desc.get;
-      } while (O = getPrototypeOf(O));
-    }
-  });
-}
diff --git a/node_modules/core-js-pure/modules/es.object.lookup-setter.js b/node_modules/core-js-pure/modules/es.object.lookup-setter.js
deleted file mode 100644
index 57d49fa..0000000
--- a/node_modules/core-js-pure/modules/es.object.lookup-setter.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var FORCED = require('../internals/object-prototype-accessors-forced');
-var toObject = require('../internals/to-object');
-var toPrimitive = require('../internals/to-primitive');
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
-
-// `Object.prototype.__lookupSetter__` method
-// https://tc39.github.io/ecma262/#sec-object.prototype.__lookupSetter__
-if (DESCRIPTORS) {
-  $({ target: 'Object', proto: true, forced: FORCED }, {
-    __lookupSetter__: function __lookupSetter__(P) {
-      var O = toObject(this);
-      var key = toPrimitive(P, true);
-      var desc;
-      do {
-        if (desc = getOwnPropertyDescriptor(O, key)) return desc.set;
-      } while (O = getPrototypeOf(O));
-    }
-  });
-}
diff --git a/node_modules/core-js-pure/modules/es.object.prevent-extensions.js b/node_modules/core-js-pure/modules/es.object.prevent-extensions.js
deleted file mode 100644
index bb7b268..0000000
--- a/node_modules/core-js-pure/modules/es.object.prevent-extensions.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var $ = require('../internals/export');
-var isObject = require('../internals/is-object');
-var onFreeze = require('../internals/internal-metadata').onFreeze;
-var FREEZING = require('../internals/freezing');
-var fails = require('../internals/fails');
-
-var nativePreventExtensions = Object.preventExtensions;
-var FAILS_ON_PRIMITIVES = fails(function () { nativePreventExtensions(1); });
-
-// `Object.preventExtensions` method
-// https://tc39.github.io/ecma262/#sec-object.preventextensions
-$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {
-  preventExtensions: function preventExtensions(it) {
-    return nativePreventExtensions && isObject(it) ? nativePreventExtensions(onFreeze(it)) : it;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.object.seal.js b/node_modules/core-js-pure/modules/es.object.seal.js
deleted file mode 100644
index 35fae0c..0000000
--- a/node_modules/core-js-pure/modules/es.object.seal.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var $ = require('../internals/export');
-var isObject = require('../internals/is-object');
-var onFreeze = require('../internals/internal-metadata').onFreeze;
-var FREEZING = require('../internals/freezing');
-var fails = require('../internals/fails');
-
-var nativeSeal = Object.seal;
-var FAILS_ON_PRIMITIVES = fails(function () { nativeSeal(1); });
-
-// `Object.seal` method
-// https://tc39.github.io/ecma262/#sec-object.seal
-$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {
-  seal: function seal(it) {
-    return nativeSeal && isObject(it) ? nativeSeal(onFreeze(it)) : it;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.object.set-prototype-of.js b/node_modules/core-js-pure/modules/es.object.set-prototype-of.js
deleted file mode 100644
index cbe0578..0000000
--- a/node_modules/core-js-pure/modules/es.object.set-prototype-of.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var setPrototypeOf = require('../internals/object-set-prototype-of');
-
-// `Object.setPrototypeOf` method
-// https://tc39.github.io/ecma262/#sec-object.setprototypeof
-$({ target: 'Object', stat: true }, {
-  setPrototypeOf: setPrototypeOf
-});
diff --git a/node_modules/core-js-pure/modules/es.object.to-string.js b/node_modules/core-js-pure/modules/es.object.to-string.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.object.to-string.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.object.values.js b/node_modules/core-js-pure/modules/es.object.values.js
deleted file mode 100644
index a3074cf..0000000
--- a/node_modules/core-js-pure/modules/es.object.values.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var $ = require('../internals/export');
-var $values = require('../internals/object-to-array').values;
-
-// `Object.values` method
-// https://tc39.github.io/ecma262/#sec-object.values
-$({ target: 'Object', stat: true }, {
-  values: function values(O) {
-    return $values(O);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.parse-float.js b/node_modules/core-js-pure/modules/es.parse-float.js
deleted file mode 100644
index 1245deb..0000000
--- a/node_modules/core-js-pure/modules/es.parse-float.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var parseFloatImplementation = require('../internals/number-parse-float');
-
-// `parseFloat` method
-// https://tc39.github.io/ecma262/#sec-parsefloat-string
-$({ global: true, forced: parseFloat != parseFloatImplementation }, {
-  parseFloat: parseFloatImplementation
-});
diff --git a/node_modules/core-js-pure/modules/es.parse-int.js b/node_modules/core-js-pure/modules/es.parse-int.js
deleted file mode 100644
index b462541..0000000
--- a/node_modules/core-js-pure/modules/es.parse-int.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var parseIntImplementation = require('../internals/number-parse-int');
-
-// `parseInt` method
-// https://tc39.github.io/ecma262/#sec-parseint-string-radix
-$({ global: true, forced: parseInt != parseIntImplementation }, {
-  parseInt: parseIntImplementation
-});
diff --git a/node_modules/core-js-pure/modules/es.promise.all-settled.js b/node_modules/core-js-pure/modules/es.promise.all-settled.js
deleted file mode 100644
index 887f3a6..0000000
--- a/node_modules/core-js-pure/modules/es.promise.all-settled.js
+++ /dev/null
@@ -1,43 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var aFunction = require('../internals/a-function');
-var newPromiseCapabilityModule = require('../internals/new-promise-capability');
-var perform = require('../internals/perform');
-var iterate = require('../internals/iterate');
-
-// `Promise.allSettled` method
-// https://github.com/tc39/proposal-promise-allSettled
-$({ target: 'Promise', stat: true }, {
-  allSettled: function allSettled(iterable) {
-    var C = this;
-    var capability = newPromiseCapabilityModule.f(C);
-    var resolve = capability.resolve;
-    var reject = capability.reject;
-    var result = perform(function () {
-      var promiseResolve = aFunction(C.resolve);
-      var values = [];
-      var counter = 0;
-      var remaining = 1;
-      iterate(iterable, function (promise) {
-        var index = counter++;
-        var alreadyCalled = false;
-        values.push(undefined);
-        remaining++;
-        promiseResolve.call(C, promise).then(function (value) {
-          if (alreadyCalled) return;
-          alreadyCalled = true;
-          values[index] = { status: 'fulfilled', value: value };
-          --remaining || resolve(values);
-        }, function (e) {
-          if (alreadyCalled) return;
-          alreadyCalled = true;
-          values[index] = { status: 'rejected', reason: e };
-          --remaining || resolve(values);
-        });
-      });
-      --remaining || resolve(values);
-    });
-    if (result.error) reject(result.value);
-    return capability.promise;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.promise.finally.js b/node_modules/core-js-pure/modules/es.promise.finally.js
deleted file mode 100644
index 7efe3e5..0000000
--- a/node_modules/core-js-pure/modules/es.promise.finally.js
+++ /dev/null
@@ -1,36 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var NativePromise = require('../internals/native-promise-constructor');
-var fails = require('../internals/fails');
-var getBuiltIn = require('../internals/get-built-in');
-var speciesConstructor = require('../internals/species-constructor');
-var promiseResolve = require('../internals/promise-resolve');
-var redefine = require('../internals/redefine');
-
-// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829
-var NON_GENERIC = !!NativePromise && fails(function () {
-  NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });
-});
-
-// `Promise.prototype.finally` method
-// https://tc39.github.io/ecma262/#sec-promise.prototype.finally
-$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {
-  'finally': function (onFinally) {
-    var C = speciesConstructor(this, getBuiltIn('Promise'));
-    var isFunction = typeof onFinally == 'function';
-    return this.then(
-      isFunction ? function (x) {
-        return promiseResolve(C, onFinally()).then(function () { return x; });
-      } : onFinally,
-      isFunction ? function (e) {
-        return promiseResolve(C, onFinally()).then(function () { throw e; });
-      } : onFinally
-    );
-  }
-});
-
-// patch native Promise.prototype for native async functions
-if (!IS_PURE && typeof NativePromise == 'function' && !NativePromise.prototype['finally']) {
-  redefine(NativePromise.prototype, 'finally', getBuiltIn('Promise').prototype['finally']);
-}
diff --git a/node_modules/core-js-pure/modules/es.promise.js b/node_modules/core-js-pure/modules/es.promise.js
deleted file mode 100644
index b79d2bc..0000000
--- a/node_modules/core-js-pure/modules/es.promise.js
+++ /dev/null
@@ -1,379 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var global = require('../internals/global');
-var getBuiltIn = require('../internals/get-built-in');
-var NativePromise = require('../internals/native-promise-constructor');
-var redefine = require('../internals/redefine');
-var redefineAll = require('../internals/redefine-all');
-var setToStringTag = require('../internals/set-to-string-tag');
-var setSpecies = require('../internals/set-species');
-var isObject = require('../internals/is-object');
-var aFunction = require('../internals/a-function');
-var anInstance = require('../internals/an-instance');
-var classof = require('../internals/classof-raw');
-var inspectSource = require('../internals/inspect-source');
-var iterate = require('../internals/iterate');
-var checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');
-var speciesConstructor = require('../internals/species-constructor');
-var task = require('../internals/task').set;
-var microtask = require('../internals/microtask');
-var promiseResolve = require('../internals/promise-resolve');
-var hostReportErrors = require('../internals/host-report-errors');
-var newPromiseCapabilityModule = require('../internals/new-promise-capability');
-var perform = require('../internals/perform');
-var InternalStateModule = require('../internals/internal-state');
-var isForced = require('../internals/is-forced');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var V8_VERSION = require('../internals/engine-v8-version');
-
-var SPECIES = wellKnownSymbol('species');
-var PROMISE = 'Promise';
-var getInternalState = InternalStateModule.get;
-var setInternalState = InternalStateModule.set;
-var getInternalPromiseState = InternalStateModule.getterFor(PROMISE);
-var PromiseConstructor = NativePromise;
-var TypeError = global.TypeError;
-var document = global.document;
-var process = global.process;
-var $fetch = getBuiltIn('fetch');
-var newPromiseCapability = newPromiseCapabilityModule.f;
-var newGenericPromiseCapability = newPromiseCapability;
-var IS_NODE = classof(process) == 'process';
-var DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);
-var UNHANDLED_REJECTION = 'unhandledrejection';
-var REJECTION_HANDLED = 'rejectionhandled';
-var PENDING = 0;
-var FULFILLED = 1;
-var REJECTED = 2;
-var HANDLED = 1;
-var UNHANDLED = 2;
-var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;
-
-var FORCED = isForced(PROMISE, function () {
-  var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);
-  if (!GLOBAL_CORE_JS_PROMISE) {
-    // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
-    // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
-    // We can't detect it synchronously, so just check versions
-    if (V8_VERSION === 66) return true;
-    // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test
-    if (!IS_NODE && typeof PromiseRejectionEvent != 'function') return true;
-  }
-  // We need Promise#finally in the pure version for preventing prototype pollution
-  if (IS_PURE && !PromiseConstructor.prototype['finally']) return true;
-  // We can't use @@species feature detection in V8 since it causes
-  // deoptimization and performance degradation
-  // https://github.com/zloirock/core-js/issues/679
-  if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false;
-  // Detect correctness of subclassing with @@species support
-  var promise = PromiseConstructor.resolve(1);
-  var FakePromise = function (exec) {
-    exec(function () { /* empty */ }, function () { /* empty */ });
-  };
-  var constructor = promise.constructor = {};
-  constructor[SPECIES] = FakePromise;
-  return !(promise.then(function () { /* empty */ }) instanceof FakePromise);
-});
-
-var INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {
-  PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });
-});
-
-// helpers
-var isThenable = function (it) {
-  var then;
-  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
-};
-
-var notify = function (promise, state, isReject) {
-  if (state.notified) return;
-  state.notified = true;
-  var chain = state.reactions;
-  microtask(function () {
-    var value = state.value;
-    var ok = state.state == FULFILLED;
-    var index = 0;
-    // variable length - can't use forEach
-    while (chain.length > index) {
-      var reaction = chain[index++];
-      var handler = ok ? reaction.ok : reaction.fail;
-      var resolve = reaction.resolve;
-      var reject = reaction.reject;
-      var domain = reaction.domain;
-      var result, then, exited;
-      try {
-        if (handler) {
-          if (!ok) {
-            if (state.rejection === UNHANDLED) onHandleUnhandled(promise, state);
-            state.rejection = HANDLED;
-          }
-          if (handler === true) result = value;
-          else {
-            if (domain) domain.enter();
-            result = handler(value); // can throw
-            if (domain) {
-              domain.exit();
-              exited = true;
-            }
-          }
-          if (result === reaction.promise) {
-            reject(TypeError('Promise-chain cycle'));
-          } else if (then = isThenable(result)) {
-            then.call(result, resolve, reject);
-          } else resolve(result);
-        } else reject(value);
-      } catch (error) {
-        if (domain && !exited) domain.exit();
-        reject(error);
-      }
-    }
-    state.reactions = [];
-    state.notified = false;
-    if (isReject && !state.rejection) onUnhandled(promise, state);
-  });
-};
-
-var dispatchEvent = function (name, promise, reason) {
-  var event, handler;
-  if (DISPATCH_EVENT) {
-    event = document.createEvent('Event');
-    event.promise = promise;
-    event.reason = reason;
-    event.initEvent(name, false, true);
-    global.dispatchEvent(event);
-  } else event = { promise: promise, reason: reason };
-  if (handler = global['on' + name]) handler(event);
-  else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);
-};
-
-var onUnhandled = function (promise, state) {
-  task.call(global, function () {
-    var value = state.value;
-    var IS_UNHANDLED = isUnhandled(state);
-    var result;
-    if (IS_UNHANDLED) {
-      result = perform(function () {
-        if (IS_NODE) {
-          process.emit('unhandledRejection', value, promise);
-        } else dispatchEvent(UNHANDLED_REJECTION, promise, value);
-      });
-      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
-      state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;
-      if (result.error) throw result.value;
-    }
-  });
-};
-
-var isUnhandled = function (state) {
-  return state.rejection !== HANDLED && !state.parent;
-};
-
-var onHandleUnhandled = function (promise, state) {
-  task.call(global, function () {
-    if (IS_NODE) {
-      process.emit('rejectionHandled', promise);
-    } else dispatchEvent(REJECTION_HANDLED, promise, state.value);
-  });
-};
-
-var bind = function (fn, promise, state, unwrap) {
-  return function (value) {
-    fn(promise, state, value, unwrap);
-  };
-};
-
-var internalReject = function (promise, state, value, unwrap) {
-  if (state.done) return;
-  state.done = true;
-  if (unwrap) state = unwrap;
-  state.value = value;
-  state.state = REJECTED;
-  notify(promise, state, true);
-};
-
-var internalResolve = function (promise, state, value, unwrap) {
-  if (state.done) return;
-  state.done = true;
-  if (unwrap) state = unwrap;
-  try {
-    if (promise === value) throw TypeError("Promise can't be resolved itself");
-    var then = isThenable(value);
-    if (then) {
-      microtask(function () {
-        var wrapper = { done: false };
-        try {
-          then.call(value,
-            bind(internalResolve, promise, wrapper, state),
-            bind(internalReject, promise, wrapper, state)
-          );
-        } catch (error) {
-          internalReject(promise, wrapper, error, state);
-        }
-      });
-    } else {
-      state.value = value;
-      state.state = FULFILLED;
-      notify(promise, state, false);
-    }
-  } catch (error) {
-    internalReject(promise, { done: false }, error, state);
-  }
-};
-
-// constructor polyfill
-if (FORCED) {
-  // 25.4.3.1 Promise(executor)
-  PromiseConstructor = function Promise(executor) {
-    anInstance(this, PromiseConstructor, PROMISE);
-    aFunction(executor);
-    Internal.call(this);
-    var state = getInternalState(this);
-    try {
-      executor(bind(internalResolve, this, state), bind(internalReject, this, state));
-    } catch (error) {
-      internalReject(this, state, error);
-    }
-  };
-  // eslint-disable-next-line no-unused-vars
-  Internal = function Promise(executor) {
-    setInternalState(this, {
-      type: PROMISE,
-      done: false,
-      notified: false,
-      parent: false,
-      reactions: [],
-      rejection: false,
-      state: PENDING,
-      value: undefined
-    });
-  };
-  Internal.prototype = redefineAll(PromiseConstructor.prototype, {
-    // `Promise.prototype.then` method
-    // https://tc39.github.io/ecma262/#sec-promise.prototype.then
-    then: function then(onFulfilled, onRejected) {
-      var state = getInternalPromiseState(this);
-      var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));
-      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
-      reaction.fail = typeof onRejected == 'function' && onRejected;
-      reaction.domain = IS_NODE ? process.domain : undefined;
-      state.parent = true;
-      state.reactions.push(reaction);
-      if (state.state != PENDING) notify(this, state, false);
-      return reaction.promise;
-    },
-    // `Promise.prototype.catch` method
-    // https://tc39.github.io/ecma262/#sec-promise.prototype.catch
-    'catch': function (onRejected) {
-      return this.then(undefined, onRejected);
-    }
-  });
-  OwnPromiseCapability = function () {
-    var promise = new Internal();
-    var state = getInternalState(promise);
-    this.promise = promise;
-    this.resolve = bind(internalResolve, promise, state);
-    this.reject = bind(internalReject, promise, state);
-  };
-  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {
-    return C === PromiseConstructor || C === PromiseWrapper
-      ? new OwnPromiseCapability(C)
-      : newGenericPromiseCapability(C);
-  };
-
-  if (!IS_PURE && typeof NativePromise == 'function') {
-    nativeThen = NativePromise.prototype.then;
-
-    // wrap native Promise#then for native async functions
-    redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) {
-      var that = this;
-      return new PromiseConstructor(function (resolve, reject) {
-        nativeThen.call(that, resolve, reject);
-      }).then(onFulfilled, onRejected);
-    // https://github.com/zloirock/core-js/issues/640
-    }, { unsafe: true });
-
-    // wrap fetch result
-    if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {
-      // eslint-disable-next-line no-unused-vars
-      fetch: function fetch(input /* , init */) {
-        return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));
-      }
-    });
-  }
-}
-
-$({ global: true, wrap: true, forced: FORCED }, {
-  Promise: PromiseConstructor
-});
-
-setToStringTag(PromiseConstructor, PROMISE, false, true);
-setSpecies(PROMISE);
-
-PromiseWrapper = getBuiltIn(PROMISE);
-
-// statics
-$({ target: PROMISE, stat: true, forced: FORCED }, {
-  // `Promise.reject` method
-  // https://tc39.github.io/ecma262/#sec-promise.reject
-  reject: function reject(r) {
-    var capability = newPromiseCapability(this);
-    capability.reject.call(undefined, r);
-    return capability.promise;
-  }
-});
-
-$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {
-  // `Promise.resolve` method
-  // https://tc39.github.io/ecma262/#sec-promise.resolve
-  resolve: function resolve(x) {
-    return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);
-  }
-});
-
-$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {
-  // `Promise.all` method
-  // https://tc39.github.io/ecma262/#sec-promise.all
-  all: function all(iterable) {
-    var C = this;
-    var capability = newPromiseCapability(C);
-    var resolve = capability.resolve;
-    var reject = capability.reject;
-    var result = perform(function () {
-      var $promiseResolve = aFunction(C.resolve);
-      var values = [];
-      var counter = 0;
-      var remaining = 1;
-      iterate(iterable, function (promise) {
-        var index = counter++;
-        var alreadyCalled = false;
-        values.push(undefined);
-        remaining++;
-        $promiseResolve.call(C, promise).then(function (value) {
-          if (alreadyCalled) return;
-          alreadyCalled = true;
-          values[index] = value;
-          --remaining || resolve(values);
-        }, reject);
-      });
-      --remaining || resolve(values);
-    });
-    if (result.error) reject(result.value);
-    return capability.promise;
-  },
-  // `Promise.race` method
-  // https://tc39.github.io/ecma262/#sec-promise.race
-  race: function race(iterable) {
-    var C = this;
-    var capability = newPromiseCapability(C);
-    var reject = capability.reject;
-    var result = perform(function () {
-      var $promiseResolve = aFunction(C.resolve);
-      iterate(iterable, function (promise) {
-        $promiseResolve.call(C, promise).then(capability.resolve, reject);
-      });
-    });
-    if (result.error) reject(result.value);
-    return capability.promise;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.apply.js b/node_modules/core-js-pure/modules/es.reflect.apply.js
deleted file mode 100644
index 634222b..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.apply.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var $ = require('../internals/export');
-var getBuiltIn = require('../internals/get-built-in');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var fails = require('../internals/fails');
-
-var nativeApply = getBuiltIn('Reflect', 'apply');
-var functionApply = Function.apply;
-
-// MS Edge argumentsList argument is optional
-var OPTIONAL_ARGUMENTS_LIST = !fails(function () {
-  nativeApply(function () { /* empty */ });
-});
-
-// `Reflect.apply` method
-// https://tc39.github.io/ecma262/#sec-reflect.apply
-$({ target: 'Reflect', stat: true, forced: OPTIONAL_ARGUMENTS_LIST }, {
-  apply: function apply(target, thisArgument, argumentsList) {
-    aFunction(target);
-    anObject(argumentsList);
-    return nativeApply
-      ? nativeApply(target, thisArgument, argumentsList)
-      : functionApply.call(target, thisArgument, argumentsList);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.construct.js b/node_modules/core-js-pure/modules/es.reflect.construct.js
deleted file mode 100644
index 9e678dd..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.construct.js
+++ /dev/null
@@ -1,51 +0,0 @@
-var $ = require('../internals/export');
-var getBuiltIn = require('../internals/get-built-in');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var isObject = require('../internals/is-object');
-var create = require('../internals/object-create');
-var bind = require('../internals/function-bind');
-var fails = require('../internals/fails');
-
-var nativeConstruct = getBuiltIn('Reflect', 'construct');
-
-// `Reflect.construct` method
-// https://tc39.github.io/ecma262/#sec-reflect.construct
-// MS Edge supports only 2 arguments and argumentsList argument is optional
-// FF Nightly sets third argument as `new.target`, but does not create `this` from it
-var NEW_TARGET_BUG = fails(function () {
-  function F() { /* empty */ }
-  return !(nativeConstruct(function () { /* empty */ }, [], F) instanceof F);
-});
-var ARGS_BUG = !fails(function () {
-  nativeConstruct(function () { /* empty */ });
-});
-var FORCED = NEW_TARGET_BUG || ARGS_BUG;
-
-$({ target: 'Reflect', stat: true, forced: FORCED, sham: FORCED }, {
-  construct: function construct(Target, args /* , newTarget */) {
-    aFunction(Target);
-    anObject(args);
-    var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);
-    if (ARGS_BUG && !NEW_TARGET_BUG) return nativeConstruct(Target, args, newTarget);
-    if (Target == newTarget) {
-      // w/o altered newTarget, optimization for 0-4 arguments
-      switch (args.length) {
-        case 0: return new Target();
-        case 1: return new Target(args[0]);
-        case 2: return new Target(args[0], args[1]);
-        case 3: return new Target(args[0], args[1], args[2]);
-        case 4: return new Target(args[0], args[1], args[2], args[3]);
-      }
-      // w/o altered newTarget, lot of arguments case
-      var $args = [null];
-      $args.push.apply($args, args);
-      return new (bind.apply(Target, $args))();
-    }
-    // with altered newTarget, not support built-in constructors
-    var proto = newTarget.prototype;
-    var instance = create(isObject(proto) ? proto : Object.prototype);
-    var result = Function.apply.call(Target, instance, args);
-    return isObject(result) ? result : instance;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.define-property.js b/node_modules/core-js-pure/modules/es.reflect.define-property.js
deleted file mode 100644
index 44343f7..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.define-property.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var anObject = require('../internals/an-object');
-var toPrimitive = require('../internals/to-primitive');
-var definePropertyModule = require('../internals/object-define-property');
-var fails = require('../internals/fails');
-
-// MS Edge has broken Reflect.defineProperty - throwing instead of returning false
-var ERROR_INSTEAD_OF_FALSE = fails(function () {
-  // eslint-disable-next-line no-undef
-  Reflect.defineProperty(definePropertyModule.f({}, 1, { value: 1 }), 1, { value: 2 });
-});
-
-// `Reflect.defineProperty` method
-// https://tc39.github.io/ecma262/#sec-reflect.defineproperty
-$({ target: 'Reflect', stat: true, forced: ERROR_INSTEAD_OF_FALSE, sham: !DESCRIPTORS }, {
-  defineProperty: function defineProperty(target, propertyKey, attributes) {
-    anObject(target);
-    var key = toPrimitive(propertyKey, true);
-    anObject(attributes);
-    try {
-      definePropertyModule.f(target, key, attributes);
-      return true;
-    } catch (error) {
-      return false;
-    }
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.delete-property.js b/node_modules/core-js-pure/modules/es.reflect.delete-property.js
deleted file mode 100644
index 8cfb32d..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.delete-property.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var $ = require('../internals/export');
-var anObject = require('../internals/an-object');
-var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
-
-// `Reflect.deleteProperty` method
-// https://tc39.github.io/ecma262/#sec-reflect.deleteproperty
-$({ target: 'Reflect', stat: true }, {
-  deleteProperty: function deleteProperty(target, propertyKey) {
-    var descriptor = getOwnPropertyDescriptor(anObject(target), propertyKey);
-    return descriptor && !descriptor.configurable ? false : delete target[propertyKey];
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.get-own-property-descriptor.js b/node_modules/core-js-pure/modules/es.reflect.get-own-property-descriptor.js
deleted file mode 100644
index 335aac4..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.get-own-property-descriptor.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var anObject = require('../internals/an-object');
-var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');
-
-// `Reflect.getOwnPropertyDescriptor` method
-// https://tc39.github.io/ecma262/#sec-reflect.getownpropertydescriptor
-$({ target: 'Reflect', stat: true, sham: !DESCRIPTORS }, {
-  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {
-    return getOwnPropertyDescriptorModule.f(anObject(target), propertyKey);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.get-prototype-of.js b/node_modules/core-js-pure/modules/es.reflect.get-prototype-of.js
deleted file mode 100644
index 9785949..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.get-prototype-of.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var $ = require('../internals/export');
-var anObject = require('../internals/an-object');
-var objectGetPrototypeOf = require('../internals/object-get-prototype-of');
-var CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');
-
-// `Reflect.getPrototypeOf` method
-// https://tc39.github.io/ecma262/#sec-reflect.getprototypeof
-$({ target: 'Reflect', stat: true, sham: !CORRECT_PROTOTYPE_GETTER }, {
-  getPrototypeOf: function getPrototypeOf(target) {
-    return objectGetPrototypeOf(anObject(target));
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.get.js b/node_modules/core-js-pure/modules/es.reflect.get.js
deleted file mode 100644
index 10e7962..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.get.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var $ = require('../internals/export');
-var isObject = require('../internals/is-object');
-var anObject = require('../internals/an-object');
-var has = require('../internals/has');
-var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-
-// `Reflect.get` method
-// https://tc39.github.io/ecma262/#sec-reflect.get
-function get(target, propertyKey /* , receiver */) {
-  var receiver = arguments.length < 3 ? target : arguments[2];
-  var descriptor, prototype;
-  if (anObject(target) === receiver) return target[propertyKey];
-  if (descriptor = getOwnPropertyDescriptorModule.f(target, propertyKey)) return has(descriptor, 'value')
-    ? descriptor.value
-    : descriptor.get === undefined
-      ? undefined
-      : descriptor.get.call(receiver);
-  if (isObject(prototype = getPrototypeOf(target))) return get(prototype, propertyKey, receiver);
-}
-
-$({ target: 'Reflect', stat: true }, {
-  get: get
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.has.js b/node_modules/core-js-pure/modules/es.reflect.has.js
deleted file mode 100644
index c6a8ced..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.has.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var $ = require('../internals/export');
-
-// `Reflect.has` method
-// https://tc39.github.io/ecma262/#sec-reflect.has
-$({ target: 'Reflect', stat: true }, {
-  has: function has(target, propertyKey) {
-    return propertyKey in target;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.is-extensible.js b/node_modules/core-js-pure/modules/es.reflect.is-extensible.js
deleted file mode 100644
index 876eae3..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.is-extensible.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var $ = require('../internals/export');
-var anObject = require('../internals/an-object');
-
-var objectIsExtensible = Object.isExtensible;
-
-// `Reflect.isExtensible` method
-// https://tc39.github.io/ecma262/#sec-reflect.isextensible
-$({ target: 'Reflect', stat: true }, {
-  isExtensible: function isExtensible(target) {
-    anObject(target);
-    return objectIsExtensible ? objectIsExtensible(target) : true;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.own-keys.js b/node_modules/core-js-pure/modules/es.reflect.own-keys.js
deleted file mode 100644
index 7a8f3f0..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.own-keys.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var ownKeys = require('../internals/own-keys');
-
-// `Reflect.ownKeys` method
-// https://tc39.github.io/ecma262/#sec-reflect.ownkeys
-$({ target: 'Reflect', stat: true }, {
-  ownKeys: ownKeys
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.prevent-extensions.js b/node_modules/core-js-pure/modules/es.reflect.prevent-extensions.js
deleted file mode 100644
index 92d0475..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.prevent-extensions.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var $ = require('../internals/export');
-var getBuiltIn = require('../internals/get-built-in');
-var anObject = require('../internals/an-object');
-var FREEZING = require('../internals/freezing');
-
-// `Reflect.preventExtensions` method
-// https://tc39.github.io/ecma262/#sec-reflect.preventextensions
-$({ target: 'Reflect', stat: true, sham: !FREEZING }, {
-  preventExtensions: function preventExtensions(target) {
-    anObject(target);
-    try {
-      var objectPreventExtensions = getBuiltIn('Object', 'preventExtensions');
-      if (objectPreventExtensions) objectPreventExtensions(target);
-      return true;
-    } catch (error) {
-      return false;
-    }
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.set-prototype-of.js b/node_modules/core-js-pure/modules/es.reflect.set-prototype-of.js
deleted file mode 100644
index 7900440..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.set-prototype-of.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var $ = require('../internals/export');
-var anObject = require('../internals/an-object');
-var aPossiblePrototype = require('../internals/a-possible-prototype');
-var objectSetPrototypeOf = require('../internals/object-set-prototype-of');
-
-// `Reflect.setPrototypeOf` method
-// https://tc39.github.io/ecma262/#sec-reflect.setprototypeof
-if (objectSetPrototypeOf) $({ target: 'Reflect', stat: true }, {
-  setPrototypeOf: function setPrototypeOf(target, proto) {
-    anObject(target);
-    aPossiblePrototype(proto);
-    try {
-      objectSetPrototypeOf(target, proto);
-      return true;
-    } catch (error) {
-      return false;
-    }
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.reflect.set.js b/node_modules/core-js-pure/modules/es.reflect.set.js
deleted file mode 100644
index a16b762..0000000
--- a/node_modules/core-js-pure/modules/es.reflect.set.js
+++ /dev/null
@@ -1,45 +0,0 @@
-var $ = require('../internals/export');
-var anObject = require('../internals/an-object');
-var isObject = require('../internals/is-object');
-var has = require('../internals/has');
-var fails = require('../internals/fails');
-var definePropertyModule = require('../internals/object-define-property');
-var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-var createPropertyDescriptor = require('../internals/create-property-descriptor');
-
-// `Reflect.set` method
-// https://tc39.github.io/ecma262/#sec-reflect.set
-function set(target, propertyKey, V /* , receiver */) {
-  var receiver = arguments.length < 4 ? target : arguments[3];
-  var ownDescriptor = getOwnPropertyDescriptorModule.f(anObject(target), propertyKey);
-  var existingDescriptor, prototype;
-  if (!ownDescriptor) {
-    if (isObject(prototype = getPrototypeOf(target))) {
-      return set(prototype, propertyKey, V, receiver);
-    }
-    ownDescriptor = createPropertyDescriptor(0);
-  }
-  if (has(ownDescriptor, 'value')) {
-    if (ownDescriptor.writable === false || !isObject(receiver)) return false;
-    if (existingDescriptor = getOwnPropertyDescriptorModule.f(receiver, propertyKey)) {
-      if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;
-      existingDescriptor.value = V;
-      definePropertyModule.f(receiver, propertyKey, existingDescriptor);
-    } else definePropertyModule.f(receiver, propertyKey, createPropertyDescriptor(0, V));
-    return true;
-  }
-  return ownDescriptor.set === undefined ? false : (ownDescriptor.set.call(receiver, V), true);
-}
-
-// MS Edge 17-18 Reflect.set allows setting the property to object
-// with non-writable property on the prototype
-var MS_EDGE_BUG = fails(function () {
-  var object = definePropertyModule.f({}, 'a', { configurable: true });
-  // eslint-disable-next-line no-undef
-  return Reflect.set(getPrototypeOf(object), 'a', 1, object) !== false;
-});
-
-$({ target: 'Reflect', stat: true, forced: MS_EDGE_BUG }, {
-  set: set
-});
diff --git a/node_modules/core-js-pure/modules/es.regexp.constructor.js b/node_modules/core-js-pure/modules/es.regexp.constructor.js
deleted file mode 100644
index 3f99a69..0000000
--- a/node_modules/core-js-pure/modules/es.regexp.constructor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var setSpecies = require('../internals/set-species');
-
-setSpecies('RegExp');
diff --git a/node_modules/core-js-pure/modules/es.regexp.exec.js b/node_modules/core-js-pure/modules/es.regexp.exec.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.regexp.exec.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.regexp.flags.js b/node_modules/core-js-pure/modules/es.regexp.flags.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.regexp.flags.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.regexp.sticky.js b/node_modules/core-js-pure/modules/es.regexp.sticky.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.regexp.sticky.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.regexp.test.js b/node_modules/core-js-pure/modules/es.regexp.test.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.regexp.test.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.regexp.to-string.js b/node_modules/core-js-pure/modules/es.regexp.to-string.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.regexp.to-string.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.set.js b/node_modules/core-js-pure/modules/es.set.js
deleted file mode 100644
index ac90041..0000000
--- a/node_modules/core-js-pure/modules/es.set.js
+++ /dev/null
@@ -1,9 +0,0 @@
-'use strict';
-var collection = require('../internals/collection');
-var collectionStrong = require('../internals/collection-strong');
-
-// `Set` constructor
-// https://tc39.github.io/ecma262/#sec-set-objects
-module.exports = collection('Set', function (init) {
-  return function Set() { return init(this, arguments.length ? arguments[0] : undefined); };
-}, collectionStrong);
diff --git a/node_modules/core-js-pure/modules/es.string.anchor.js b/node_modules/core-js-pure/modules/es.string.anchor.js
deleted file mode 100644
index 004cc0a..0000000
--- a/node_modules/core-js-pure/modules/es.string.anchor.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.anchor` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.anchor
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('anchor') }, {
-  anchor: function anchor(name) {
-    return createHTML(this, 'a', 'name', name);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.big.js b/node_modules/core-js-pure/modules/es.string.big.js
deleted file mode 100644
index 3273d00..0000000
--- a/node_modules/core-js-pure/modules/es.string.big.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.big` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.big
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('big') }, {
-  big: function big() {
-    return createHTML(this, 'big', '', '');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.blink.js b/node_modules/core-js-pure/modules/es.string.blink.js
deleted file mode 100644
index 9373820..0000000
--- a/node_modules/core-js-pure/modules/es.string.blink.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.blink` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.blink
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('blink') }, {
-  blink: function blink() {
-    return createHTML(this, 'blink', '', '');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.bold.js b/node_modules/core-js-pure/modules/es.string.bold.js
deleted file mode 100644
index ea8c48c..0000000
--- a/node_modules/core-js-pure/modules/es.string.bold.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.bold` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.bold
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('bold') }, {
-  bold: function bold() {
-    return createHTML(this, 'b', '', '');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.code-point-at.js b/node_modules/core-js-pure/modules/es.string.code-point-at.js
deleted file mode 100644
index 26a2da2..0000000
--- a/node_modules/core-js-pure/modules/es.string.code-point-at.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var codeAt = require('../internals/string-multibyte').codeAt;
-
-// `String.prototype.codePointAt` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.codepointat
-$({ target: 'String', proto: true }, {
-  codePointAt: function codePointAt(pos) {
-    return codeAt(this, pos);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.ends-with.js b/node_modules/core-js-pure/modules/es.string.ends-with.js
deleted file mode 100644
index e19b0f6..0000000
--- a/node_modules/core-js-pure/modules/es.string.ends-with.js
+++ /dev/null
@@ -1,34 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
-var toLength = require('../internals/to-length');
-var notARegExp = require('../internals/not-a-regexp');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-var correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');
-var IS_PURE = require('../internals/is-pure');
-
-var nativeEndsWith = ''.endsWith;
-var min = Math.min;
-
-var CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('endsWith');
-// https://github.com/zloirock/core-js/pull/702
-var MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {
-  var descriptor = getOwnPropertyDescriptor(String.prototype, 'endsWith');
-  return descriptor && !descriptor.writable;
-}();
-
-// `String.prototype.endsWith` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.endswith
-$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {
-  endsWith: function endsWith(searchString /* , endPosition = @length */) {
-    var that = String(requireObjectCoercible(this));
-    notARegExp(searchString);
-    var endPosition = arguments.length > 1 ? arguments[1] : undefined;
-    var len = toLength(that.length);
-    var end = endPosition === undefined ? len : min(toLength(endPosition), len);
-    var search = String(searchString);
-    return nativeEndsWith
-      ? nativeEndsWith.call(that, search, end)
-      : that.slice(end - search.length, end) === search;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.fixed.js b/node_modules/core-js-pure/modules/es.string.fixed.js
deleted file mode 100644
index 13f8a04..0000000
--- a/node_modules/core-js-pure/modules/es.string.fixed.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.fixed` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.fixed
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fixed') }, {
-  fixed: function fixed() {
-    return createHTML(this, 'tt', '', '');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.fontcolor.js b/node_modules/core-js-pure/modules/es.string.fontcolor.js
deleted file mode 100644
index 88636c2..0000000
--- a/node_modules/core-js-pure/modules/es.string.fontcolor.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.fontcolor` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.fontcolor
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fontcolor') }, {
-  fontcolor: function fontcolor(color) {
-    return createHTML(this, 'font', 'color', color);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.fontsize.js b/node_modules/core-js-pure/modules/es.string.fontsize.js
deleted file mode 100644
index 09c0715..0000000
--- a/node_modules/core-js-pure/modules/es.string.fontsize.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.fontsize` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.fontsize
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('fontsize') }, {
-  fontsize: function fontsize(size) {
-    return createHTML(this, 'font', 'size', size);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.from-code-point.js b/node_modules/core-js-pure/modules/es.string.from-code-point.js
deleted file mode 100644
index 139ed89..0000000
--- a/node_modules/core-js-pure/modules/es.string.from-code-point.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var $ = require('../internals/export');
-var toAbsoluteIndex = require('../internals/to-absolute-index');
-
-var fromCharCode = String.fromCharCode;
-var nativeFromCodePoint = String.fromCodePoint;
-
-// length should be 1, old FF problem
-var INCORRECT_LENGTH = !!nativeFromCodePoint && nativeFromCodePoint.length != 1;
-
-// `String.fromCodePoint` method
-// https://tc39.github.io/ecma262/#sec-string.fromcodepoint
-$({ target: 'String', stat: true, forced: INCORRECT_LENGTH }, {
-  fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars
-    var elements = [];
-    var length = arguments.length;
-    var i = 0;
-    var code;
-    while (length > i) {
-      code = +arguments[i++];
-      if (toAbsoluteIndex(code, 0x10FFFF) !== code) throw RangeError(code + ' is not a valid code point');
-      elements.push(code < 0x10000
-        ? fromCharCode(code)
-        : fromCharCode(((code -= 0x10000) >> 10) + 0xD800, code % 0x400 + 0xDC00)
-      );
-    } return elements.join('');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.includes.js b/node_modules/core-js-pure/modules/es.string.includes.js
deleted file mode 100644
index 25dbcd8..0000000
--- a/node_modules/core-js-pure/modules/es.string.includes.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var notARegExp = require('../internals/not-a-regexp');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-var correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');
-
-// `String.prototype.includes` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.includes
-$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {
-  includes: function includes(searchString /* , position = 0 */) {
-    return !!~String(requireObjectCoercible(this))
-      .indexOf(notARegExp(searchString), arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.italics.js b/node_modules/core-js-pure/modules/es.string.italics.js
deleted file mode 100644
index 76bf3e4..0000000
--- a/node_modules/core-js-pure/modules/es.string.italics.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.italics` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.italics
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('italics') }, {
-  italics: function italics() {
-    return createHTML(this, 'i', '', '');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.iterator.js b/node_modules/core-js-pure/modules/es.string.iterator.js
deleted file mode 100644
index 8a268e0..0000000
--- a/node_modules/core-js-pure/modules/es.string.iterator.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-var charAt = require('../internals/string-multibyte').charAt;
-var InternalStateModule = require('../internals/internal-state');
-var defineIterator = require('../internals/define-iterator');
-
-var STRING_ITERATOR = 'String Iterator';
-var setInternalState = InternalStateModule.set;
-var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);
-
-// `String.prototype[@@iterator]` method
-// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator
-defineIterator(String, 'String', function (iterated) {
-  setInternalState(this, {
-    type: STRING_ITERATOR,
-    string: String(iterated),
-    index: 0
-  });
-// `%StringIteratorPrototype%.next` method
-// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next
-}, function next() {
-  var state = getInternalState(this);
-  var string = state.string;
-  var index = state.index;
-  var point;
-  if (index >= string.length) return { value: undefined, done: true };
-  point = charAt(string, index);
-  state.index += point.length;
-  return { value: point, done: false };
-});
diff --git a/node_modules/core-js-pure/modules/es.string.link.js b/node_modules/core-js-pure/modules/es.string.link.js
deleted file mode 100644
index 65f8232..0000000
--- a/node_modules/core-js-pure/modules/es.string.link.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.link` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.link
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('link') }, {
-  link: function link(url) {
-    return createHTML(this, 'a', 'href', url);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.match-all.js b/node_modules/core-js-pure/modules/es.string.match-all.js
deleted file mode 100644
index 3fc36eb..0000000
--- a/node_modules/core-js-pure/modules/es.string.match-all.js
+++ /dev/null
@@ -1,109 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createIteratorConstructor = require('../internals/create-iterator-constructor');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-var toLength = require('../internals/to-length');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var classof = require('../internals/classof-raw');
-var isRegExp = require('../internals/is-regexp');
-var getRegExpFlags = require('../internals/regexp-flags');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var fails = require('../internals/fails');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var speciesConstructor = require('../internals/species-constructor');
-var advanceStringIndex = require('../internals/advance-string-index');
-var InternalStateModule = require('../internals/internal-state');
-var IS_PURE = require('../internals/is-pure');
-
-var MATCH_ALL = wellKnownSymbol('matchAll');
-var REGEXP_STRING = 'RegExp String';
-var REGEXP_STRING_ITERATOR = REGEXP_STRING + ' Iterator';
-var setInternalState = InternalStateModule.set;
-var getInternalState = InternalStateModule.getterFor(REGEXP_STRING_ITERATOR);
-var RegExpPrototype = RegExp.prototype;
-var regExpBuiltinExec = RegExpPrototype.exec;
-var nativeMatchAll = ''.matchAll;
-
-var WORKS_WITH_NON_GLOBAL_REGEX = !!nativeMatchAll && !fails(function () {
-  'a'.matchAll(/./);
-});
-
-var regExpExec = function (R, S) {
-  var exec = R.exec;
-  var result;
-  if (typeof exec == 'function') {
-    result = exec.call(R, S);
-    if (typeof result != 'object') throw TypeError('Incorrect exec result');
-    return result;
-  } return regExpBuiltinExec.call(R, S);
-};
-
-// eslint-disable-next-line max-len
-var $RegExpStringIterator = createIteratorConstructor(function RegExpStringIterator(regexp, string, global, fullUnicode) {
-  setInternalState(this, {
-    type: REGEXP_STRING_ITERATOR,
-    regexp: regexp,
-    string: string,
-    global: global,
-    unicode: fullUnicode,
-    done: false
-  });
-}, REGEXP_STRING, function next() {
-  var state = getInternalState(this);
-  if (state.done) return { value: undefined, done: true };
-  var R = state.regexp;
-  var S = state.string;
-  var match = regExpExec(R, S);
-  if (match === null) return { value: undefined, done: state.done = true };
-  if (state.global) {
-    if (String(match[0]) == '') R.lastIndex = advanceStringIndex(S, toLength(R.lastIndex), state.unicode);
-    return { value: match, done: false };
-  }
-  state.done = true;
-  return { value: match, done: false };
-});
-
-var $matchAll = function (string) {
-  var R = anObject(this);
-  var S = String(string);
-  var C, flagsValue, flags, matcher, global, fullUnicode;
-  C = speciesConstructor(R, RegExp);
-  flagsValue = R.flags;
-  if (flagsValue === undefined && R instanceof RegExp && !('flags' in RegExpPrototype)) {
-    flagsValue = getRegExpFlags.call(R);
-  }
-  flags = flagsValue === undefined ? '' : String(flagsValue);
-  matcher = new C(C === RegExp ? R.source : R, flags);
-  global = !!~flags.indexOf('g');
-  fullUnicode = !!~flags.indexOf('u');
-  matcher.lastIndex = toLength(R.lastIndex);
-  return new $RegExpStringIterator(matcher, S, global, fullUnicode);
-};
-
-// `String.prototype.matchAll` method
-// https://github.com/tc39/proposal-string-matchall
-$({ target: 'String', proto: true, forced: WORKS_WITH_NON_GLOBAL_REGEX }, {
-  matchAll: function matchAll(regexp) {
-    var O = requireObjectCoercible(this);
-    var flags, S, matcher, rx;
-    if (regexp != null) {
-      if (isRegExp(regexp)) {
-        flags = String(requireObjectCoercible('flags' in RegExpPrototype
-          ? regexp.flags
-          : getRegExpFlags.call(regexp)
-        ));
-        if (!~flags.indexOf('g')) throw TypeError('`.matchAll` does not allow non-global regexes');
-      }
-      if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll.apply(O, arguments);
-      matcher = regexp[MATCH_ALL];
-      if (matcher === undefined && IS_PURE && classof(regexp) == 'RegExp') matcher = $matchAll;
-      if (matcher != null) return aFunction(matcher).call(regexp, O);
-    } else if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll.apply(O, arguments);
-    S = String(O);
-    rx = new RegExp(regexp, 'g');
-    return IS_PURE ? $matchAll.call(rx, S) : rx[MATCH_ALL](S);
-  }
-});
-
-IS_PURE || MATCH_ALL in RegExpPrototype || createNonEnumerableProperty(RegExpPrototype, MATCH_ALL, $matchAll);
diff --git a/node_modules/core-js-pure/modules/es.string.match.js b/node_modules/core-js-pure/modules/es.string.match.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.string.match.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.string.pad-end.js b/node_modules/core-js-pure/modules/es.string.pad-end.js
deleted file mode 100644
index 9108024..0000000
--- a/node_modules/core-js-pure/modules/es.string.pad-end.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $padEnd = require('../internals/string-pad').end;
-var WEBKIT_BUG = require('../internals/string-pad-webkit-bug');
-
-// `String.prototype.padEnd` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.padend
-$({ target: 'String', proto: true, forced: WEBKIT_BUG }, {
-  padEnd: function padEnd(maxLength /* , fillString = ' ' */) {
-    return $padEnd(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.pad-start.js b/node_modules/core-js-pure/modules/es.string.pad-start.js
deleted file mode 100644
index 69b788f..0000000
--- a/node_modules/core-js-pure/modules/es.string.pad-start.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $padStart = require('../internals/string-pad').start;
-var WEBKIT_BUG = require('../internals/string-pad-webkit-bug');
-
-// `String.prototype.padStart` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.padstart
-$({ target: 'String', proto: true, forced: WEBKIT_BUG }, {
-  padStart: function padStart(maxLength /* , fillString = ' ' */) {
-    return $padStart(this, maxLength, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.raw.js b/node_modules/core-js-pure/modules/es.string.raw.js
deleted file mode 100644
index beb0783..0000000
--- a/node_modules/core-js-pure/modules/es.string.raw.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var $ = require('../internals/export');
-var toIndexedObject = require('../internals/to-indexed-object');
-var toLength = require('../internals/to-length');
-
-// `String.raw` method
-// https://tc39.github.io/ecma262/#sec-string.raw
-$({ target: 'String', stat: true }, {
-  raw: function raw(template) {
-    var rawTemplate = toIndexedObject(template.raw);
-    var literalSegments = toLength(rawTemplate.length);
-    var argumentsLength = arguments.length;
-    var elements = [];
-    var i = 0;
-    while (literalSegments > i) {
-      elements.push(String(rawTemplate[i++]));
-      if (i < argumentsLength) elements.push(String(arguments[i]));
-    } return elements.join('');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.repeat.js b/node_modules/core-js-pure/modules/es.string.repeat.js
deleted file mode 100644
index 43890aa..0000000
--- a/node_modules/core-js-pure/modules/es.string.repeat.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var repeat = require('../internals/string-repeat');
-
-// `String.prototype.repeat` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.repeat
-$({ target: 'String', proto: true }, {
-  repeat: repeat
-});
diff --git a/node_modules/core-js-pure/modules/es.string.replace.js b/node_modules/core-js-pure/modules/es.string.replace.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.string.replace.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.string.search.js b/node_modules/core-js-pure/modules/es.string.search.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.string.search.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.string.small.js b/node_modules/core-js-pure/modules/es.string.small.js
deleted file mode 100644
index c8587d6..0000000
--- a/node_modules/core-js-pure/modules/es.string.small.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.small` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.small
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('small') }, {
-  small: function small() {
-    return createHTML(this, 'small', '', '');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.split.js b/node_modules/core-js-pure/modules/es.string.split.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.string.split.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.string.starts-with.js b/node_modules/core-js-pure/modules/es.string.starts-with.js
deleted file mode 100644
index e4fe655..0000000
--- a/node_modules/core-js-pure/modules/es.string.starts-with.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
-var toLength = require('../internals/to-length');
-var notARegExp = require('../internals/not-a-regexp');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-var correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');
-var IS_PURE = require('../internals/is-pure');
-
-var nativeStartsWith = ''.startsWith;
-var min = Math.min;
-
-var CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');
-// https://github.com/zloirock/core-js/pull/702
-var MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {
-  var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');
-  return descriptor && !descriptor.writable;
-}();
-
-// `String.prototype.startsWith` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.startswith
-$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {
-  startsWith: function startsWith(searchString /* , position = 0 */) {
-    var that = String(requireObjectCoercible(this));
-    notARegExp(searchString);
-    var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));
-    var search = String(searchString);
-    return nativeStartsWith
-      ? nativeStartsWith.call(that, search, index)
-      : that.slice(index, index + search.length) === search;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.strike.js b/node_modules/core-js-pure/modules/es.string.strike.js
deleted file mode 100644
index 4f0fa2e..0000000
--- a/node_modules/core-js-pure/modules/es.string.strike.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.strike` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.strike
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('strike') }, {
-  strike: function strike() {
-    return createHTML(this, 'strike', '', '');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.sub.js b/node_modules/core-js-pure/modules/es.string.sub.js
deleted file mode 100644
index 4b901d2..0000000
--- a/node_modules/core-js-pure/modules/es.string.sub.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.sub` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.sub
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('sub') }, {
-  sub: function sub() {
-    return createHTML(this, 'sub', '', '');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.sup.js b/node_modules/core-js-pure/modules/es.string.sup.js
deleted file mode 100644
index 3fc0b18..0000000
--- a/node_modules/core-js-pure/modules/es.string.sup.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createHTML = require('../internals/create-html');
-var forcedStringHTMLMethod = require('../internals/string-html-forced');
-
-// `String.prototype.sup` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.sup
-$({ target: 'String', proto: true, forced: forcedStringHTMLMethod('sup') }, {
-  sup: function sup() {
-    return createHTML(this, 'sup', '', '');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.string.trim-end.js b/node_modules/core-js-pure/modules/es.string.trim-end.js
deleted file mode 100644
index 4db829a..0000000
--- a/node_modules/core-js-pure/modules/es.string.trim-end.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $trimEnd = require('../internals/string-trim').end;
-var forcedStringTrimMethod = require('../internals/string-trim-forced');
-
-var FORCED = forcedStringTrimMethod('trimEnd');
-
-var trimEnd = FORCED ? function trimEnd() {
-  return $trimEnd(this);
-} : ''.trimEnd;
-
-// `String.prototype.{ trimEnd, trimRight }` methods
-// https://github.com/tc39/ecmascript-string-left-right-trim
-$({ target: 'String', proto: true, forced: FORCED }, {
-  trimEnd: trimEnd,
-  trimRight: trimEnd
-});
diff --git a/node_modules/core-js-pure/modules/es.string.trim-start.js b/node_modules/core-js-pure/modules/es.string.trim-start.js
deleted file mode 100644
index b4f6e43..0000000
--- a/node_modules/core-js-pure/modules/es.string.trim-start.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $trimStart = require('../internals/string-trim').start;
-var forcedStringTrimMethod = require('../internals/string-trim-forced');
-
-var FORCED = forcedStringTrimMethod('trimStart');
-
-var trimStart = FORCED ? function trimStart() {
-  return $trimStart(this);
-} : ''.trimStart;
-
-// `String.prototype.{ trimStart, trimLeft }` methods
-// https://github.com/tc39/ecmascript-string-left-right-trim
-$({ target: 'String', proto: true, forced: FORCED }, {
-  trimStart: trimStart,
-  trimLeft: trimStart
-});
diff --git a/node_modules/core-js-pure/modules/es.string.trim.js b/node_modules/core-js-pure/modules/es.string.trim.js
deleted file mode 100644
index 124768f..0000000
--- a/node_modules/core-js-pure/modules/es.string.trim.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var $trim = require('../internals/string-trim').trim;
-var forcedStringTrimMethod = require('../internals/string-trim-forced');
-
-// `String.prototype.trim` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.trim
-$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {
-  trim: function trim() {
-    return $trim(this);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/es.symbol.async-iterator.js b/node_modules/core-js-pure/modules/es.symbol.async-iterator.js
deleted file mode 100644
index ecf7281..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.async-iterator.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.asyncIterator` well-known symbol
-// https://tc39.github.io/ecma262/#sec-symbol.asynciterator
-defineWellKnownSymbol('asyncIterator');
diff --git a/node_modules/core-js-pure/modules/es.symbol.description.js b/node_modules/core-js-pure/modules/es.symbol.description.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.description.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.symbol.has-instance.js b/node_modules/core-js-pure/modules/es.symbol.has-instance.js
deleted file mode 100644
index 2226ddb..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.has-instance.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.hasInstance` well-known symbol
-// https://tc39.github.io/ecma262/#sec-symbol.hasinstance
-defineWellKnownSymbol('hasInstance');
diff --git a/node_modules/core-js-pure/modules/es.symbol.is-concat-spreadable.js b/node_modules/core-js-pure/modules/es.symbol.is-concat-spreadable.js
deleted file mode 100644
index d53771b..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.is-concat-spreadable.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.isConcatSpreadable` well-known symbol
-// https://tc39.github.io/ecma262/#sec-symbol.isconcatspreadable
-defineWellKnownSymbol('isConcatSpreadable');
diff --git a/node_modules/core-js-pure/modules/es.symbol.iterator.js b/node_modules/core-js-pure/modules/es.symbol.iterator.js
deleted file mode 100644
index e43878d..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.iterator.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.iterator` well-known symbol
-// https://tc39.github.io/ecma262/#sec-symbol.iterator
-defineWellKnownSymbol('iterator');
diff --git a/node_modules/core-js-pure/modules/es.symbol.js b/node_modules/core-js-pure/modules/es.symbol.js
deleted file mode 100644
index 07f1ee9..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.js
+++ /dev/null
@@ -1,311 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var global = require('../internals/global');
-var getBuiltIn = require('../internals/get-built-in');
-var IS_PURE = require('../internals/is-pure');
-var DESCRIPTORS = require('../internals/descriptors');
-var NATIVE_SYMBOL = require('../internals/native-symbol');
-var USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');
-var fails = require('../internals/fails');
-var has = require('../internals/has');
-var isArray = require('../internals/is-array');
-var isObject = require('../internals/is-object');
-var anObject = require('../internals/an-object');
-var toObject = require('../internals/to-object');
-var toIndexedObject = require('../internals/to-indexed-object');
-var toPrimitive = require('../internals/to-primitive');
-var createPropertyDescriptor = require('../internals/create-property-descriptor');
-var nativeObjectCreate = require('../internals/object-create');
-var objectKeys = require('../internals/object-keys');
-var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');
-var getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');
-var getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');
-var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');
-var definePropertyModule = require('../internals/object-define-property');
-var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var redefine = require('../internals/redefine');
-var shared = require('../internals/shared');
-var sharedKey = require('../internals/shared-key');
-var hiddenKeys = require('../internals/hidden-keys');
-var uid = require('../internals/uid');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-var setToStringTag = require('../internals/set-to-string-tag');
-var InternalStateModule = require('../internals/internal-state');
-var $forEach = require('../internals/array-iteration').forEach;
-
-var HIDDEN = sharedKey('hidden');
-var SYMBOL = 'Symbol';
-var PROTOTYPE = 'prototype';
-var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');
-var setInternalState = InternalStateModule.set;
-var getInternalState = InternalStateModule.getterFor(SYMBOL);
-var ObjectPrototype = Object[PROTOTYPE];
-var $Symbol = global.Symbol;
-var $stringify = getBuiltIn('JSON', 'stringify');
-var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
-var nativeDefineProperty = definePropertyModule.f;
-var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;
-var nativePropertyIsEnumerable = propertyIsEnumerableModule.f;
-var AllSymbols = shared('symbols');
-var ObjectPrototypeSymbols = shared('op-symbols');
-var StringToSymbolRegistry = shared('string-to-symbol-registry');
-var SymbolToStringRegistry = shared('symbol-to-string-registry');
-var WellKnownSymbolsStore = shared('wks');
-var QObject = global.QObject;
-// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
-var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
-
-// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
-var setSymbolDescriptor = DESCRIPTORS && fails(function () {
-  return nativeObjectCreate(nativeDefineProperty({}, 'a', {
-    get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }
-  })).a != 7;
-}) ? function (O, P, Attributes) {
-  var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);
-  if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];
-  nativeDefineProperty(O, P, Attributes);
-  if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {
-    nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);
-  }
-} : nativeDefineProperty;
-
-var wrap = function (tag, description) {
-  var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);
-  setInternalState(symbol, {
-    type: SYMBOL,
-    tag: tag,
-    description: description
-  });
-  if (!DESCRIPTORS) symbol.description = description;
-  return symbol;
-};
-
-var isSymbol = USE_SYMBOL_AS_UID ? function (it) {
-  return typeof it == 'symbol';
-} : function (it) {
-  return Object(it) instanceof $Symbol;
-};
-
-var $defineProperty = function defineProperty(O, P, Attributes) {
-  if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);
-  anObject(O);
-  var key = toPrimitive(P, true);
-  anObject(Attributes);
-  if (has(AllSymbols, key)) {
-    if (!Attributes.enumerable) {
-      if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));
-      O[HIDDEN][key] = true;
-    } else {
-      if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;
-      Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });
-    } return setSymbolDescriptor(O, key, Attributes);
-  } return nativeDefineProperty(O, key, Attributes);
-};
-
-var $defineProperties = function defineProperties(O, Properties) {
-  anObject(O);
-  var properties = toIndexedObject(Properties);
-  var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));
-  $forEach(keys, function (key) {
-    if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);
-  });
-  return O;
-};
-
-var $create = function create(O, Properties) {
-  return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);
-};
-
-var $propertyIsEnumerable = function propertyIsEnumerable(V) {
-  var P = toPrimitive(V, true);
-  var enumerable = nativePropertyIsEnumerable.call(this, P);
-  if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;
-  return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;
-};
-
-var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {
-  var it = toIndexedObject(O);
-  var key = toPrimitive(P, true);
-  if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;
-  var descriptor = nativeGetOwnPropertyDescriptor(it, key);
-  if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {
-    descriptor.enumerable = true;
-  }
-  return descriptor;
-};
-
-var $getOwnPropertyNames = function getOwnPropertyNames(O) {
-  var names = nativeGetOwnPropertyNames(toIndexedObject(O));
-  var result = [];
-  $forEach(names, function (key) {
-    if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);
-  });
-  return result;
-};
-
-var $getOwnPropertySymbols = function getOwnPropertySymbols(O) {
-  var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;
-  var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));
-  var result = [];
-  $forEach(names, function (key) {
-    if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {
-      result.push(AllSymbols[key]);
-    }
-  });
-  return result;
-};
-
-// `Symbol` constructor
-// https://tc39.github.io/ecma262/#sec-symbol-constructor
-if (!NATIVE_SYMBOL) {
-  $Symbol = function Symbol() {
-    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');
-    var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);
-    var tag = uid(description);
-    var setter = function (value) {
-      if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);
-      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
-      setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));
-    };
-    if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });
-    return wrap(tag, description);
-  };
-
-  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
-    return getInternalState(this).tag;
-  });
-
-  redefine($Symbol, 'withoutSetter', function (description) {
-    return wrap(uid(description), description);
-  });
-
-  propertyIsEnumerableModule.f = $propertyIsEnumerable;
-  definePropertyModule.f = $defineProperty;
-  getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;
-  getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;
-  getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;
-
-  wrappedWellKnownSymbolModule.f = function (name) {
-    return wrap(wellKnownSymbol(name), name);
-  };
-
-  if (DESCRIPTORS) {
-    // https://github.com/tc39/proposal-Symbol-description
-    nativeDefineProperty($Symbol[PROTOTYPE], 'description', {
-      configurable: true,
-      get: function description() {
-        return getInternalState(this).description;
-      }
-    });
-    if (!IS_PURE) {
-      redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });
-    }
-  }
-}
-
-$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {
-  Symbol: $Symbol
-});
-
-$forEach(objectKeys(WellKnownSymbolsStore), function (name) {
-  defineWellKnownSymbol(name);
-});
-
-$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {
-  // `Symbol.for` method
-  // https://tc39.github.io/ecma262/#sec-symbol.for
-  'for': function (key) {
-    var string = String(key);
-    if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];
-    var symbol = $Symbol(string);
-    StringToSymbolRegistry[string] = symbol;
-    SymbolToStringRegistry[symbol] = string;
-    return symbol;
-  },
-  // `Symbol.keyFor` method
-  // https://tc39.github.io/ecma262/#sec-symbol.keyfor
-  keyFor: function keyFor(sym) {
-    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');
-    if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];
-  },
-  useSetter: function () { USE_SETTER = true; },
-  useSimple: function () { USE_SETTER = false; }
-});
-
-$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {
-  // `Object.create` method
-  // https://tc39.github.io/ecma262/#sec-object.create
-  create: $create,
-  // `Object.defineProperty` method
-  // https://tc39.github.io/ecma262/#sec-object.defineproperty
-  defineProperty: $defineProperty,
-  // `Object.defineProperties` method
-  // https://tc39.github.io/ecma262/#sec-object.defineproperties
-  defineProperties: $defineProperties,
-  // `Object.getOwnPropertyDescriptor` method
-  // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors
-  getOwnPropertyDescriptor: $getOwnPropertyDescriptor
-});
-
-$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {
-  // `Object.getOwnPropertyNames` method
-  // https://tc39.github.io/ecma262/#sec-object.getownpropertynames
-  getOwnPropertyNames: $getOwnPropertyNames,
-  // `Object.getOwnPropertySymbols` method
-  // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols
-  getOwnPropertySymbols: $getOwnPropertySymbols
-});
-
-// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
-// https://bugs.chromium.org/p/v8/issues/detail?id=3443
-$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {
-  getOwnPropertySymbols: function getOwnPropertySymbols(it) {
-    return getOwnPropertySymbolsModule.f(toObject(it));
-  }
-});
-
-// `JSON.stringify` method behavior with symbols
-// https://tc39.github.io/ecma262/#sec-json.stringify
-if ($stringify) {
-  var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {
-    var symbol = $Symbol();
-    // MS Edge converts symbol values to JSON as {}
-    return $stringify([symbol]) != '[null]'
-      // WebKit converts symbol values to JSON as null
-      || $stringify({ a: symbol }) != '{}'
-      // V8 throws on boxed symbols
-      || $stringify(Object(symbol)) != '{}';
-  });
-
-  $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {
-    // eslint-disable-next-line no-unused-vars
-    stringify: function stringify(it, replacer, space) {
-      var args = [it];
-      var index = 1;
-      var $replacer;
-      while (arguments.length > index) args.push(arguments[index++]);
-      $replacer = replacer;
-      if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
-      if (!isArray(replacer)) replacer = function (key, value) {
-        if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
-        if (!isSymbol(value)) return value;
-      };
-      args[1] = replacer;
-      return $stringify.apply(null, args);
-    }
-  });
-}
-
-// `Symbol.prototype[@@toPrimitive]` method
-// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive
-if (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {
-  createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
-}
-// `Symbol.prototype[@@toStringTag]` property
-// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag
-setToStringTag($Symbol, SYMBOL);
-
-hiddenKeys[HIDDEN] = true;
diff --git a/node_modules/core-js-pure/modules/es.symbol.match-all.js b/node_modules/core-js-pure/modules/es.symbol.match-all.js
deleted file mode 100644
index b16c8be..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.match-all.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.matchAll` well-known symbol
-defineWellKnownSymbol('matchAll');
diff --git a/node_modules/core-js-pure/modules/es.symbol.match.js b/node_modules/core-js-pure/modules/es.symbol.match.js
deleted file mode 100644
index ec2fbdb..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.match.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.match` well-known symbol
-// https://tc39.github.io/ecma262/#sec-symbol.match
-defineWellKnownSymbol('match');
diff --git a/node_modules/core-js-pure/modules/es.symbol.replace.js b/node_modules/core-js-pure/modules/es.symbol.replace.js
deleted file mode 100644
index d252d8d..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.replace.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.replace` well-known symbol
-// https://tc39.github.io/ecma262/#sec-symbol.replace
-defineWellKnownSymbol('replace');
diff --git a/node_modules/core-js-pure/modules/es.symbol.search.js b/node_modules/core-js-pure/modules/es.symbol.search.js
deleted file mode 100644
index 0c28e62..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.search.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.search` well-known symbol
-// https://tc39.github.io/ecma262/#sec-symbol.search
-defineWellKnownSymbol('search');
diff --git a/node_modules/core-js-pure/modules/es.symbol.species.js b/node_modules/core-js-pure/modules/es.symbol.species.js
deleted file mode 100644
index 8391f22..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.species.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.species` well-known symbol
-// https://tc39.github.io/ecma262/#sec-symbol.species
-defineWellKnownSymbol('species');
diff --git a/node_modules/core-js-pure/modules/es.symbol.split.js b/node_modules/core-js-pure/modules/es.symbol.split.js
deleted file mode 100644
index 5f76df4..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.split.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.split` well-known symbol
-// https://tc39.github.io/ecma262/#sec-symbol.split
-defineWellKnownSymbol('split');
diff --git a/node_modules/core-js-pure/modules/es.symbol.to-primitive.js b/node_modules/core-js-pure/modules/es.symbol.to-primitive.js
deleted file mode 100644
index c297826..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.to-primitive.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.toPrimitive` well-known symbol
-// https://tc39.github.io/ecma262/#sec-symbol.toprimitive
-defineWellKnownSymbol('toPrimitive');
diff --git a/node_modules/core-js-pure/modules/es.symbol.to-string-tag.js b/node_modules/core-js-pure/modules/es.symbol.to-string-tag.js
deleted file mode 100644
index 8ddbfad..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.to-string-tag.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.toStringTag` well-known symbol
-// https://tc39.github.io/ecma262/#sec-symbol.tostringtag
-defineWellKnownSymbol('toStringTag');
diff --git a/node_modules/core-js-pure/modules/es.symbol.unscopables.js b/node_modules/core-js-pure/modules/es.symbol.unscopables.js
deleted file mode 100644
index a9daa60..0000000
--- a/node_modules/core-js-pure/modules/es.symbol.unscopables.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.unscopables` well-known symbol
-// https://tc39.github.io/ecma262/#sec-symbol.unscopables
-defineWellKnownSymbol('unscopables');
diff --git a/node_modules/core-js-pure/modules/es.typed-array.copy-within.js b/node_modules/core-js-pure/modules/es.typed-array.copy-within.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.copy-within.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.every.js b/node_modules/core-js-pure/modules/es.typed-array.every.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.every.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.fill.js b/node_modules/core-js-pure/modules/es.typed-array.fill.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.fill.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.filter.js b/node_modules/core-js-pure/modules/es.typed-array.filter.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.filter.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.find-index.js b/node_modules/core-js-pure/modules/es.typed-array.find-index.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.find-index.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.find.js b/node_modules/core-js-pure/modules/es.typed-array.find.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.find.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.float32-array.js b/node_modules/core-js-pure/modules/es.typed-array.float32-array.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.float32-array.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.float64-array.js b/node_modules/core-js-pure/modules/es.typed-array.float64-array.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.float64-array.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.for-each.js b/node_modules/core-js-pure/modules/es.typed-array.for-each.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.for-each.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.from.js b/node_modules/core-js-pure/modules/es.typed-array.from.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.from.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.includes.js b/node_modules/core-js-pure/modules/es.typed-array.includes.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.includes.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.index-of.js b/node_modules/core-js-pure/modules/es.typed-array.index-of.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.index-of.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.int16-array.js b/node_modules/core-js-pure/modules/es.typed-array.int16-array.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.int16-array.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.int32-array.js b/node_modules/core-js-pure/modules/es.typed-array.int32-array.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.int32-array.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.int8-array.js b/node_modules/core-js-pure/modules/es.typed-array.int8-array.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.int8-array.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.iterator.js b/node_modules/core-js-pure/modules/es.typed-array.iterator.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.iterator.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.join.js b/node_modules/core-js-pure/modules/es.typed-array.join.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.join.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.last-index-of.js b/node_modules/core-js-pure/modules/es.typed-array.last-index-of.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.last-index-of.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.map.js b/node_modules/core-js-pure/modules/es.typed-array.map.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.map.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.of.js b/node_modules/core-js-pure/modules/es.typed-array.of.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.of.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.reduce-right.js b/node_modules/core-js-pure/modules/es.typed-array.reduce-right.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.reduce-right.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.reduce.js b/node_modules/core-js-pure/modules/es.typed-array.reduce.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.reduce.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.reverse.js b/node_modules/core-js-pure/modules/es.typed-array.reverse.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.reverse.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.set.js b/node_modules/core-js-pure/modules/es.typed-array.set.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.set.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.slice.js b/node_modules/core-js-pure/modules/es.typed-array.slice.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.slice.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.some.js b/node_modules/core-js-pure/modules/es.typed-array.some.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.some.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.sort.js b/node_modules/core-js-pure/modules/es.typed-array.sort.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.sort.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.subarray.js b/node_modules/core-js-pure/modules/es.typed-array.subarray.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.subarray.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.to-locale-string.js b/node_modules/core-js-pure/modules/es.typed-array.to-locale-string.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.to-locale-string.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.to-string.js b/node_modules/core-js-pure/modules/es.typed-array.to-string.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.to-string.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.uint16-array.js b/node_modules/core-js-pure/modules/es.typed-array.uint16-array.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.uint16-array.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.uint32-array.js b/node_modules/core-js-pure/modules/es.typed-array.uint32-array.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.uint32-array.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.uint8-array.js b/node_modules/core-js-pure/modules/es.typed-array.uint8-array.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.uint8-array.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.typed-array.uint8-clamped-array.js b/node_modules/core-js-pure/modules/es.typed-array.uint8-clamped-array.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/es.typed-array.uint8-clamped-array.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/es.weak-map.js b/node_modules/core-js-pure/modules/es.weak-map.js
deleted file mode 100644
index 38f2f72..0000000
--- a/node_modules/core-js-pure/modules/es.weak-map.js
+++ /dev/null
@@ -1,67 +0,0 @@
-'use strict';
-var global = require('../internals/global');
-var redefineAll = require('../internals/redefine-all');
-var InternalMetadataModule = require('../internals/internal-metadata');
-var collection = require('../internals/collection');
-var collectionWeak = require('../internals/collection-weak');
-var isObject = require('../internals/is-object');
-var enforceIternalState = require('../internals/internal-state').enforce;
-var NATIVE_WEAK_MAP = require('../internals/native-weak-map');
-
-var IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;
-var isExtensible = Object.isExtensible;
-var InternalWeakMap;
-
-var wrapper = function (init) {
-  return function WeakMap() {
-    return init(this, arguments.length ? arguments[0] : undefined);
-  };
-};
-
-// `WeakMap` constructor
-// https://tc39.github.io/ecma262/#sec-weakmap-constructor
-var $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);
-
-// IE11 WeakMap frozen keys fix
-// We can't use feature detection because it crash some old IE builds
-// https://github.com/zloirock/core-js/issues/485
-if (NATIVE_WEAK_MAP && IS_IE11) {
-  InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);
-  InternalMetadataModule.REQUIRED = true;
-  var WeakMapPrototype = $WeakMap.prototype;
-  var nativeDelete = WeakMapPrototype['delete'];
-  var nativeHas = WeakMapPrototype.has;
-  var nativeGet = WeakMapPrototype.get;
-  var nativeSet = WeakMapPrototype.set;
-  redefineAll(WeakMapPrototype, {
-    'delete': function (key) {
-      if (isObject(key) && !isExtensible(key)) {
-        var state = enforceIternalState(this);
-        if (!state.frozen) state.frozen = new InternalWeakMap();
-        return nativeDelete.call(this, key) || state.frozen['delete'](key);
-      } return nativeDelete.call(this, key);
-    },
-    has: function has(key) {
-      if (isObject(key) && !isExtensible(key)) {
-        var state = enforceIternalState(this);
-        if (!state.frozen) state.frozen = new InternalWeakMap();
-        return nativeHas.call(this, key) || state.frozen.has(key);
-      } return nativeHas.call(this, key);
-    },
-    get: function get(key) {
-      if (isObject(key) && !isExtensible(key)) {
-        var state = enforceIternalState(this);
-        if (!state.frozen) state.frozen = new InternalWeakMap();
-        return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);
-      } return nativeGet.call(this, key);
-    },
-    set: function set(key, value) {
-      if (isObject(key) && !isExtensible(key)) {
-        var state = enforceIternalState(this);
-        if (!state.frozen) state.frozen = new InternalWeakMap();
-        nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);
-      } else nativeSet.call(this, key, value);
-      return this;
-    }
-  });
-}
diff --git a/node_modules/core-js-pure/modules/es.weak-set.js b/node_modules/core-js-pure/modules/es.weak-set.js
deleted file mode 100644
index ef6b1bc..0000000
--- a/node_modules/core-js-pure/modules/es.weak-set.js
+++ /dev/null
@@ -1,9 +0,0 @@
-'use strict';
-var collection = require('../internals/collection');
-var collectionWeak = require('../internals/collection-weak');
-
-// `WeakSet` constructor
-// https://tc39.github.io/ecma262/#sec-weakset-constructor
-collection('WeakSet', function (init) {
-  return function WeakSet() { return init(this, arguments.length ? arguments[0] : undefined); };
-}, collectionWeak);
diff --git a/node_modules/core-js-pure/modules/esnext.aggregate-error.js b/node_modules/core-js-pure/modules/esnext.aggregate-error.js
deleted file mode 100644
index 20578b6..0000000
--- a/node_modules/core-js-pure/modules/esnext.aggregate-error.js
+++ /dev/null
@@ -1,45 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-var setPrototypeOf = require('../internals/object-set-prototype-of');
-var create = require('../internals/object-create');
-var defineProperty = require('../internals/object-define-property');
-var createPropertyDescriptor = require('../internals/create-property-descriptor');
-var iterate = require('../internals/iterate');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var InternalStateModule = require('../internals/internal-state');
-
-var setInternalState = InternalStateModule.set;
-var getInternalAggregateErrorState = InternalStateModule.getterFor('AggregateError');
-
-var $AggregateError = function AggregateError(errors, message) {
-  var that = this;
-  if (!(that instanceof $AggregateError)) return new $AggregateError(errors, message);
-  if (setPrototypeOf) {
-    that = setPrototypeOf(new Error(message), getPrototypeOf(that));
-  }
-  var errorsArray = [];
-  iterate(errors, errorsArray.push, errorsArray);
-  if (DESCRIPTORS) setInternalState(that, { errors: errorsArray, type: 'AggregateError' });
-  else that.errors = errorsArray;
-  if (message !== undefined) createNonEnumerableProperty(that, 'message', String(message));
-  return that;
-};
-
-$AggregateError.prototype = create(Error.prototype, {
-  constructor: createPropertyDescriptor(5, $AggregateError),
-  message: createPropertyDescriptor(5, ''),
-  name: createPropertyDescriptor(5, 'AggregateError')
-});
-
-if (DESCRIPTORS) defineProperty.f($AggregateError.prototype, 'errors', {
-  get: function () {
-    return getInternalAggregateErrorState(this).errors;
-  },
-  configurable: true
-});
-
-$({ global: true }, {
-  AggregateError: $AggregateError
-});
diff --git a/node_modules/core-js-pure/modules/esnext.array.is-template-object.js b/node_modules/core-js-pure/modules/esnext.array.is-template-object.js
deleted file mode 100644
index a1d8428..0000000
--- a/node_modules/core-js-pure/modules/esnext.array.is-template-object.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var $ = require('../internals/export');
-var isArray = require('../internals/is-array');
-
-var isFrozen = Object.isFrozen;
-
-var isFrozenStringArray = function (array, allowUndefined) {
-  if (!isFrozen || !isArray(array) || !isFrozen(array)) return false;
-  var index = 0;
-  var length = array.length;
-  var element;
-  while (index < length) {
-    element = array[index++];
-    if (!(typeof element === 'string' || (allowUndefined && typeof element === 'undefined'))) {
-      return false;
-    }
-  } return length !== 0;
-};
-
-// `Array.isTemplateObject` method
-// https://github.com/tc39/proposal-array-is-template-object
-$({ target: 'Array', stat: true }, {
-  isTemplateObject: function isTemplateObject(value) {
-    if (!isFrozenStringArray(value, true)) return false;
-    var raw = value.raw;
-    if (raw.length !== value.length || !isFrozenStringArray(raw, false)) return false;
-    return true;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.array.last-index.js b/node_modules/core-js-pure/modules/esnext.array.last-index.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/esnext.array.last-index.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/esnext.array.last-item.js b/node_modules/core-js-pure/modules/esnext.array.last-item.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/esnext.array.last-item.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.as-indexed-pairs.js b/node_modules/core-js-pure/modules/esnext.async-iterator.as-indexed-pairs.js
deleted file mode 100644
index 446deee..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.as-indexed-pairs.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var anObject = require('../internals/an-object');
-var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
-
-var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) {
-  var state = this;
-  var iterator = state.iterator;
-
-  return Promise.resolve(anObject(state.next.call(iterator, arg))).then(function (step) {
-    if (anObject(step).done) {
-      state.done = true;
-      return { done: true, value: undefined };
-    }
-    return { done: false, value: [state.index++, step.value] };
-  });
-});
-
-$({ target: 'AsyncIterator', proto: true, real: true }, {
-  asIndexedPairs: function asIndexedPairs() {
-    return new AsyncIteratorProxy({
-      iterator: anObject(this),
-      index: 0
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.constructor.js b/node_modules/core-js-pure/modules/esnext.async-iterator.constructor.js
deleted file mode 100644
index 5a1d4ad..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.constructor.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var anInstance = require('../internals/an-instance');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var has = require('../internals/has');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var AsyncIteratorPrototype = require('../internals/async-iterator-prototype');
-var IS_PURE = require('../internals/is-pure');
-
-var TO_STRING_TAG = wellKnownSymbol('toStringTag');
-
-var AsyncIteratorConstructor = function AsyncIterator() {
-  anInstance(this, AsyncIteratorConstructor);
-};
-
-AsyncIteratorConstructor.prototype = AsyncIteratorPrototype;
-
-if (!has(AsyncIteratorPrototype, TO_STRING_TAG)) {
-  createNonEnumerableProperty(AsyncIteratorPrototype, TO_STRING_TAG, 'AsyncIterator');
-}
-
-if (!has(AsyncIteratorPrototype, 'constructor') || AsyncIteratorPrototype.constructor === Object) {
-  createNonEnumerableProperty(AsyncIteratorPrototype, 'constructor', AsyncIteratorConstructor);
-}
-
-$({ global: true, forced: IS_PURE }, {
-  AsyncIterator: AsyncIteratorConstructor
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.drop.js b/node_modules/core-js-pure/modules/esnext.async-iterator.drop.js
deleted file mode 100644
index fd2878b..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.drop.js
+++ /dev/null
@@ -1,41 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var anObject = require('../internals/an-object');
-var toPositiveInteger = require('../internals/to-positive-integer');
-var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
-
-var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) {
-  var state = this;
-
-  return new Promise(function (resolve, reject) {
-    var loop = function () {
-      try {
-        Promise.resolve(
-          anObject(state.next.call(state.iterator, state.remaining ? undefined : arg))
-        ).then(function (step) {
-          try {
-            if (anObject(step).done) {
-              state.done = true;
-              resolve({ done: true, value: undefined });
-            } else if (state.remaining) {
-              state.remaining--;
-              loop();
-            } else resolve({ done: false, value: step.value });
-          } catch (err) { reject(err); }
-        }, reject);
-      } catch (error) { reject(error); }
-    };
-
-    loop();
-  });
-});
-
-$({ target: 'AsyncIterator', proto: true, real: true }, {
-  drop: function drop(limit) {
-    return new AsyncIteratorProxy({
-      iterator: anObject(this),
-      remaining: toPositiveInteger(limit)
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.every.js b/node_modules/core-js-pure/modules/esnext.async-iterator.every.js
deleted file mode 100644
index 70c945d..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.every.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var $every = require('../internals/async-iterator-iteration').every;
-
-$({ target: 'AsyncIterator', proto: true, real: true }, {
-  every: function every(fn) {
-    return $every(this, fn);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.filter.js b/node_modules/core-js-pure/modules/esnext.async-iterator.filter.js
deleted file mode 100644
index 2ddbaba..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.filter.js
+++ /dev/null
@@ -1,42 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
-
-var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) {
-  var state = this;
-  var filterer = state.filterer;
-
-  return new Promise(function (resolve, reject) {
-    var loop = function () {
-      try {
-        Promise.resolve(anObject(state.next.call(state.iterator, arg))).then(function (step) {
-          try {
-            if (anObject(step).done) {
-              state.done = true;
-              resolve({ done: true, value: undefined });
-            } else {
-              var value = step.value;
-              Promise.resolve(filterer(value)).then(function (selected) {
-                selected ? resolve({ done: false, value: value }) : loop();
-              }, reject);
-            }
-          } catch (err) { reject(err); }
-        }, reject);
-      } catch (error) { reject(error); }
-    };
-
-    loop();
-  });
-});
-
-$({ target: 'AsyncIterator', proto: true, real: true }, {
-  filter: function filter(filterer) {
-    return new AsyncIteratorProxy({
-      iterator: anObject(this),
-      filterer: aFunction(filterer)
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.find.js b/node_modules/core-js-pure/modules/esnext.async-iterator.find.js
deleted file mode 100644
index 0211e51..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.find.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var $find = require('../internals/async-iterator-iteration').find;
-
-$({ target: 'AsyncIterator', proto: true, real: true }, {
-  find: function find(fn) {
-    return $find(this, fn);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.flat-map.js b/node_modules/core-js-pure/modules/esnext.async-iterator.flat-map.js
deleted file mode 100644
index 0613368..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.flat-map.js
+++ /dev/null
@@ -1,67 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
-var getAsyncIteratorMethod = require('../internals/get-async-iterator-method');
-
-var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) {
-  var state = this;
-  var mapper = state.mapper;
-  var innerIterator, iteratorMethod;
-
-  return new Promise(function (resolve, reject) {
-    var outerLoop = function () {
-      try {
-        Promise.resolve(anObject(state.next.call(state.iterator, arg))).then(function (step) {
-          try {
-            if (anObject(step).done) {
-              state.done = true;
-              resolve({ done: true, value: undefined });
-            } else {
-              Promise.resolve(mapper(step.value)).then(function (mapped) {
-                try {
-                  iteratorMethod = getAsyncIteratorMethod(mapped);
-                  if (iteratorMethod !== undefined) {
-                    state.innerIterator = innerIterator = anObject(iteratorMethod.call(mapped));
-                    state.innerNext = aFunction(innerIterator.next);
-                    return innerLoop();
-                  } reject(TypeError('.flatMap callback should return an iterable object'));
-                } catch (error2) { reject(error2); }
-              }, reject);
-            }
-          } catch (error1) { reject(error1); }
-        }, reject);
-      } catch (error) { reject(error); }
-    };
-
-    var innerLoop = function () {
-      if (innerIterator = state.innerIterator) {
-        try {
-          Promise.resolve(anObject(state.innerNext.call(innerIterator))).then(function (result) {
-            try {
-              if (anObject(result).done) {
-                state.innerIterator = state.innerNext = null;
-                outerLoop();
-              } else resolve({ done: false, value: result.value });
-            } catch (error1) { reject(error1); }
-          }, reject);
-        } catch (error) { reject(error); }
-      } else outerLoop();
-    };
-
-    innerLoop();
-  });
-});
-
-$({ target: 'AsyncIterator', proto: true, real: true }, {
-  flatMap: function flatMap(mapper) {
-    return new AsyncIteratorProxy({
-      iterator: anObject(this),
-      mapper: aFunction(mapper),
-      innerIterator: null,
-      innerNext: null
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.for-each.js b/node_modules/core-js-pure/modules/esnext.async-iterator.for-each.js
deleted file mode 100644
index 8dfbced..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.for-each.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var $forEach = require('../internals/async-iterator-iteration').forEach;
-
-$({ target: 'AsyncIterator', proto: true, real: true }, {
-  forEach: function forEach(fn) {
-    return $forEach(this, fn);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.from.js b/node_modules/core-js-pure/modules/esnext.async-iterator.from.js
deleted file mode 100644
index e986a73..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.from.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var path = require('../internals/path');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var toObject = require('../internals/to-object');
-var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
-var getAsyncIteratorMethod = require('../internals/get-async-iterator-method');
-
-var AsyncIterator = path.AsyncIterator;
-
-var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg) {
-  return anObject(this.next.call(this.iterator, arg));
-}, true);
-
-$({ target: 'AsyncIterator', stat: true }, {
-  from: function from(O) {
-    var object = toObject(O);
-    var usingIterator = getAsyncIteratorMethod(object);
-    var iterator;
-    if (usingIterator != null) {
-      iterator = aFunction(usingIterator).call(object);
-      if (iterator instanceof AsyncIterator) return iterator;
-    } else {
-      iterator = object;
-    } return new AsyncIteratorProxy({
-      iterator: iterator
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.map.js b/node_modules/core-js-pure/modules/esnext.async-iterator.map.js
deleted file mode 100644
index a5c2a8a..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.map.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
-
-var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) {
-  var state = this;
-  var mapper = state.mapper;
-
-  return Promise.resolve(anObject(state.next.call(state.iterator, arg))).then(function (step) {
-    if (anObject(step).done) {
-      state.done = true;
-      return { done: true, value: undefined };
-    }
-    return Promise.resolve(mapper(step.value)).then(function (value) {
-      return { done: false, value: value };
-    });
-  });
-});
-
-$({ target: 'AsyncIterator', proto: true, real: true }, {
-  map: function map(mapper) {
-    return new AsyncIteratorProxy({
-      iterator: anObject(this),
-      mapper: aFunction(mapper)
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.reduce.js b/node_modules/core-js-pure/modules/esnext.async-iterator.reduce.js
deleted file mode 100644
index e5f7f9a..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.reduce.js
+++ /dev/null
@@ -1,46 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var getBuiltIn = require('../internals/get-built-in');
-
-var Promise = getBuiltIn('Promise');
-
-$({ target: 'AsyncIterator', proto: true, real: true }, {
-  reduce: function reduce(reducer /* , initialValue */) {
-    var iterator = anObject(this);
-    var next = aFunction(iterator.next);
-    var noInitial = arguments.length < 2;
-    var accumulator = noInitial ? undefined : arguments[1];
-    aFunction(reducer);
-
-    return new Promise(function (resolve, reject) {
-      var loop = function () {
-        try {
-          Promise.resolve(anObject(next.call(iterator))).then(function (step) {
-            try {
-              if (anObject(step).done) {
-                noInitial ? reject(TypeError('Reduce of empty iterator with no initial value')) : resolve(accumulator);
-              } else {
-                var value = step.value;
-                if (noInitial) {
-                  noInitial = false;
-                  accumulator = value;
-                  loop();
-                } else {
-                  Promise.resolve(reducer(accumulator, value)).then(function (result) {
-                    accumulator = result;
-                    loop();
-                  }, reject);
-                }
-              }
-            } catch (err) { reject(err); }
-          }, reject);
-        } catch (error) { reject(error); }
-      };
-
-      loop();
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.some.js b/node_modules/core-js-pure/modules/esnext.async-iterator.some.js
deleted file mode 100644
index 13fc1ee..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.some.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var $some = require('../internals/async-iterator-iteration').some;
-
-$({ target: 'AsyncIterator', proto: true, real: true }, {
-  some: function some(fn) {
-    return $some(this, fn);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.take.js b/node_modules/core-js-pure/modules/esnext.async-iterator.take.js
deleted file mode 100644
index fc59d88..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.take.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var anObject = require('../internals/an-object');
-var toPositiveInteger = require('../internals/to-positive-integer');
-var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
-
-var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg) {
-  if (!this.remaining--) {
-    this.done = true;
-    return { done: true, value: undefined };
-  } return this.next.call(this.iterator, arg);
-});
-
-$({ target: 'AsyncIterator', proto: true, real: true }, {
-  take: function take(limit) {
-    return new AsyncIteratorProxy({
-      iterator: anObject(this),
-      remaining: toPositiveInteger(limit)
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.async-iterator.to-array.js b/node_modules/core-js-pure/modules/esnext.async-iterator.to-array.js
deleted file mode 100644
index 04e3e7f..0000000
--- a/node_modules/core-js-pure/modules/esnext.async-iterator.to-array.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var $toArray = require('../internals/async-iterator-iteration').toArray;
-
-$({ target: 'AsyncIterator', proto: true, real: true }, {
-  toArray: function toArray() {
-    return $toArray(this);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.composite-key.js b/node_modules/core-js-pure/modules/esnext.composite-key.js
deleted file mode 100644
index 43bedae..0000000
--- a/node_modules/core-js-pure/modules/esnext.composite-key.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var $ = require('../internals/export');
-var getCompositeKeyNode = require('../internals/composite-key');
-var getBuiltIn = require('../internals/get-built-in');
-var create = require('../internals/object-create');
-
-var initializer = function () {
-  var freeze = getBuiltIn('Object', 'freeze');
-  return freeze ? freeze(create(null)) : create(null);
-};
-
-// https://github.com/tc39/proposal-richer-keys/tree/master/compositeKey
-$({ global: true }, {
-  compositeKey: function compositeKey() {
-    return getCompositeKeyNode.apply(Object, arguments).get('object', initializer);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.composite-symbol.js b/node_modules/core-js-pure/modules/esnext.composite-symbol.js
deleted file mode 100644
index 06d1b22..0000000
--- a/node_modules/core-js-pure/modules/esnext.composite-symbol.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var $ = require('../internals/export');
-var getCompositeKeyNode = require('../internals/composite-key');
-var getBuiltIn = require('../internals/get-built-in');
-
-// https://github.com/tc39/proposal-richer-keys/tree/master/compositeKey
-$({ global: true }, {
-  compositeSymbol: function compositeSymbol() {
-    if (arguments.length === 1 && typeof arguments[0] === 'string') return getBuiltIn('Symbol')['for'](arguments[0]);
-    return getCompositeKeyNode.apply(null, arguments).get('symbol', getBuiltIn('Symbol'));
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.global-this.js b/node_modules/core-js-pure/modules/esnext.global-this.js
deleted file mode 100644
index c62786d..0000000
--- a/node_modules/core-js-pure/modules/esnext.global-this.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// TODO: Remove from `core-js@4`
-require('./es.global-this');
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.as-indexed-pairs.js b/node_modules/core-js-pure/modules/esnext.iterator.as-indexed-pairs.js
deleted file mode 100644
index fb3bf85..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.as-indexed-pairs.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var anObject = require('../internals/an-object');
-var createIteratorProxy = require('../internals/iterator-create-proxy');
-
-var IteratorProxy = createIteratorProxy(function (arg) {
-  var result = anObject(this.next.call(this.iterator, arg));
-  var done = this.done = !!result.done;
-  if (!done) return [this.index++, result.value];
-});
-
-$({ target: 'Iterator', proto: true, real: true }, {
-  asIndexedPairs: function asIndexedPairs() {
-    return new IteratorProxy({
-      iterator: anObject(this),
-      index: 0
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.constructor.js b/node_modules/core-js-pure/modules/esnext.iterator.constructor.js
deleted file mode 100644
index a481dff..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.constructor.js
+++ /dev/null
@@ -1,48 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var global = require('../internals/global');
-var anInstance = require('../internals/an-instance');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var fails = require('../internals/fails');
-var has = require('../internals/has');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;
-var IS_PURE = require('../internals/is-pure');
-
-var ITERATOR = wellKnownSymbol('iterator');
-var TO_STRING_TAG = wellKnownSymbol('toStringTag');
-
-var NativeIterator = global.Iterator;
-
-// FF56- have non-standard global helper `Iterator`
-var FORCED = IS_PURE
-  || typeof NativeIterator != 'function'
-  || NativeIterator.prototype !== IteratorPrototype
-  // FF44- non-standard `Iterator` passes previous tests
-  || !fails(function () { NativeIterator({}); });
-
-var IteratorConstructor = function Iterator() {
-  anInstance(this, IteratorConstructor);
-};
-
-if (IS_PURE) {
-  IteratorPrototype = {};
-  createNonEnumerableProperty(IteratorPrototype, ITERATOR, function () {
-    return this;
-  });
-}
-
-if (!has(IteratorPrototype, TO_STRING_TAG)) {
-  createNonEnumerableProperty(IteratorPrototype, TO_STRING_TAG, 'Iterator');
-}
-
-if (FORCED || !has(IteratorPrototype, 'constructor') || IteratorPrototype.constructor === Object) {
-  createNonEnumerableProperty(IteratorPrototype, 'constructor', IteratorConstructor);
-}
-
-IteratorConstructor.prototype = IteratorPrototype;
-
-$({ global: true, forced: FORCED }, {
-  Iterator: IteratorConstructor
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.drop.js b/node_modules/core-js-pure/modules/esnext.iterator.drop.js
deleted file mode 100644
index 62cc89d..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.drop.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var anObject = require('../internals/an-object');
-var toPositiveInteger = require('../internals/to-positive-integer');
-var createIteratorProxy = require('../internals/iterator-create-proxy');
-
-var IteratorProxy = createIteratorProxy(function (arg) {
-  var iterator = this.iterator;
-  var next = this.next;
-  var result, done;
-  while (this.remaining) {
-    this.remaining--;
-    result = anObject(next.call(iterator));
-    done = this.done = !!result.done;
-    if (done) return;
-  }
-  result = anObject(next.call(iterator, arg));
-  done = this.done = !!result.done;
-  if (!done) return result.value;
-});
-
-$({ target: 'Iterator', proto: true, real: true }, {
-  drop: function drop(limit) {
-    return new IteratorProxy({
-      iterator: anObject(this),
-      remaining: toPositiveInteger(limit)
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.every.js b/node_modules/core-js-pure/modules/esnext.iterator.every.js
deleted file mode 100644
index faa04fe..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.every.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var iterate = require('../internals/iterate');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-
-$({ target: 'Iterator', proto: true, real: true }, {
-  every: function every(fn) {
-    anObject(this);
-    aFunction(fn);
-    return !iterate(this, function (value) {
-      if (!fn(value)) return iterate.stop();
-    }, undefined, false, true).stopped;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.filter.js b/node_modules/core-js-pure/modules/esnext.iterator.filter.js
deleted file mode 100644
index db45c9b..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.filter.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var createIteratorProxy = require('../internals/iterator-create-proxy');
-var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');
-
-var IteratorProxy = createIteratorProxy(function (arg) {
-  var iterator = this.iterator;
-  var filterer = this.filterer;
-  var next = this.next;
-  var result, done, value;
-  while (true) {
-    result = anObject(next.call(iterator, arg));
-    done = this.done = !!result.done;
-    if (done) return;
-    value = result.value;
-    if (callWithSafeIterationClosing(iterator, filterer, value)) return value;
-  }
-});
-
-$({ target: 'Iterator', proto: true, real: true }, {
-  filter: function filter(filterer) {
-    return new IteratorProxy({
-      iterator: anObject(this),
-      filterer: aFunction(filterer)
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.find.js b/node_modules/core-js-pure/modules/esnext.iterator.find.js
deleted file mode 100644
index 42db9ea..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.find.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var iterate = require('../internals/iterate');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-
-$({ target: 'Iterator', proto: true, real: true }, {
-  find: function find(fn) {
-    anObject(this);
-    aFunction(fn);
-    return iterate(this, function (value) {
-      if (fn(value)) return iterate.stop(value);
-    }, undefined, false, true).result;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.flat-map.js b/node_modules/core-js-pure/modules/esnext.iterator.flat-map.js
deleted file mode 100644
index 0841996..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.flat-map.js
+++ /dev/null
@@ -1,46 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var getIteratorMethod = require('../internals/get-iterator-method');
-var createIteratorProxy = require('../internals/iterator-create-proxy');
-var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');
-
-var IteratorProxy = createIteratorProxy(function (arg) {
-  var iterator = this.iterator;
-  var result, mapped, iteratorMethod, innerIterator;
-
-  while (true) {
-    if (innerIterator = this.innerIterator) {
-      result = anObject(this.innerNext.call(innerIterator));
-      if (!result.done) return result.value;
-      this.innerIterator = this.innerNext = null;
-    }
-
-    result = anObject(this.next.call(iterator, arg));
-
-    if (this.done = !!result.done) return;
-
-    mapped = callWithSafeIterationClosing(iterator, this.mapper, result.value);
-    iteratorMethod = getIteratorMethod(mapped);
-
-    if (iteratorMethod === undefined) {
-      throw TypeError('.flatMap callback should return an iterable object');
-    }
-
-    this.innerIterator = innerIterator = anObject(iteratorMethod.call(mapped));
-    this.innerNext = aFunction(innerIterator.next);
-  }
-});
-
-$({ target: 'Iterator', proto: true, real: true }, {
-  flatMap: function flatMap(mapper) {
-    return new IteratorProxy({
-      iterator: anObject(this),
-      mapper: aFunction(mapper),
-      innerIterator: null,
-      innerNext: null
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.for-each.js b/node_modules/core-js-pure/modules/esnext.iterator.for-each.js
deleted file mode 100644
index c242770..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.for-each.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var iterate = require('../internals/iterate');
-var anObject = require('../internals/an-object');
-
-$({ target: 'Iterator', proto: true, real: true }, {
-  forEach: function forEach(fn) {
-    iterate(anObject(this), fn, undefined, false, true);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.from.js b/node_modules/core-js-pure/modules/esnext.iterator.from.js
deleted file mode 100644
index 10fa7f2..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.from.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var path = require('../internals/path');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var toObject = require('../internals/to-object');
-var createIteratorProxy = require('../internals/iterator-create-proxy');
-var getIteratorMethod = require('../internals/get-iterator-method');
-
-var Iterator = path.Iterator;
-
-var IteratorProxy = createIteratorProxy(function (arg) {
-  var result = anObject(this.next.call(this.iterator, arg));
-  var done = this.done = !!result.done;
-  if (!done) return result.value;
-}, true);
-
-$({ target: 'Iterator', stat: true }, {
-  from: function from(O) {
-    var object = toObject(O);
-    var usingIterator = getIteratorMethod(object);
-    var iterator;
-    if (usingIterator != null) {
-      iterator = aFunction(usingIterator).call(object);
-      if (iterator instanceof Iterator) return iterator;
-    } else {
-      iterator = object;
-    } return new IteratorProxy({
-      iterator: iterator
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.map.js b/node_modules/core-js-pure/modules/esnext.iterator.map.js
deleted file mode 100644
index 054a7d1..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.map.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var createIteratorProxy = require('../internals/iterator-create-proxy');
-var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');
-
-var IteratorProxy = createIteratorProxy(function (arg) {
-  var iterator = this.iterator;
-  var result = anObject(this.next.call(iterator, arg));
-  var done = this.done = !!result.done;
-  if (!done) return callWithSafeIterationClosing(iterator, this.mapper, result.value);
-});
-
-$({ target: 'Iterator', proto: true, real: true }, {
-  map: function map(mapper) {
-    return new IteratorProxy({
-      iterator: anObject(this),
-      mapper: aFunction(mapper)
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.reduce.js b/node_modules/core-js-pure/modules/esnext.iterator.reduce.js
deleted file mode 100644
index 029269d..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.reduce.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var iterate = require('../internals/iterate');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-
-$({ target: 'Iterator', proto: true, real: true }, {
-  reduce: function reduce(reducer /* , initialValue */) {
-    anObject(this);
-    aFunction(reducer);
-    var noInitial = arguments.length < 2;
-    var accumulator = noInitial ? undefined : arguments[1];
-    iterate(this, function (value) {
-      if (noInitial) {
-        noInitial = false;
-        accumulator = value;
-      } else {
-        accumulator = reducer(accumulator, value);
-      }
-    }, undefined, false, true);
-    if (noInitial) throw TypeError('Reduce of empty iterator with no initial value');
-    return accumulator;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.some.js b/node_modules/core-js-pure/modules/esnext.iterator.some.js
deleted file mode 100644
index e32ce13..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.some.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var iterate = require('../internals/iterate');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-
-$({ target: 'Iterator', proto: true, real: true }, {
-  some: function some(fn) {
-    anObject(this);
-    aFunction(fn);
-    return iterate(this, function (value) {
-      if (fn(value)) return iterate.stop();
-    }, undefined, false, true).stopped;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.take.js b/node_modules/core-js-pure/modules/esnext.iterator.take.js
deleted file mode 100644
index 5ed1cd3..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.take.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var anObject = require('../internals/an-object');
-var toPositiveInteger = require('../internals/to-positive-integer');
-var createIteratorProxy = require('../internals/iterator-create-proxy');
-
-var IteratorProxy = createIteratorProxy(function (arg) {
-  if (!this.remaining--) {
-    this.done = true;
-    return;
-  }
-  var result = anObject(this.next.call(this.iterator, arg));
-  var done = this.done = !!result.done;
-  if (!done) return result.value;
-});
-
-$({ target: 'Iterator', proto: true, real: true }, {
-  take: function take(limit) {
-    return new IteratorProxy({
-      iterator: anObject(this),
-      remaining: toPositiveInteger(limit)
-    });
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.iterator.to-array.js b/node_modules/core-js-pure/modules/esnext.iterator.to-array.js
deleted file mode 100644
index 90d32b8..0000000
--- a/node_modules/core-js-pure/modules/esnext.iterator.to-array.js
+++ /dev/null
@@ -1,15 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-iterator-helpers
-var $ = require('../internals/export');
-var iterate = require('../internals/iterate');
-var anObject = require('../internals/an-object');
-
-var push = [].push;
-
-$({ target: 'Iterator', proto: true, real: true }, {
-  toArray: function toArray() {
-    var result = [];
-    iterate(anObject(this), push, result, false, true);
-    return result;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.delete-all.js b/node_modules/core-js-pure/modules/esnext.map.delete-all.js
deleted file mode 100644
index 4554b47..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.delete-all.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var collectionDeleteAll = require('../internals/collection-delete-all');
-
-// `Map.prototype.deleteAll` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  deleteAll: function deleteAll(/* ...elements */) {
-    return collectionDeleteAll.apply(this, arguments);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.every.js b/node_modules/core-js-pure/modules/esnext.map.every.js
deleted file mode 100644
index 6272c71..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.every.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var bind = require('../internals/function-bind-context');
-var getMapIterator = require('../internals/get-map-iterator');
-var iterate = require('../internals/iterate');
-
-// `Map.prototype.every` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  every: function every(callbackfn /* , thisArg */) {
-    var map = anObject(this);
-    var iterator = getMapIterator(map);
-    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-    return !iterate(iterator, function (key, value) {
-      if (!boundFunction(value, key, map)) return iterate.stop();
-    }, undefined, true, true).stopped;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.filter.js b/node_modules/core-js-pure/modules/esnext.map.filter.js
deleted file mode 100644
index a140cc0..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.filter.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var getBuiltIn = require('../internals/get-built-in');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var bind = require('../internals/function-bind-context');
-var speciesConstructor = require('../internals/species-constructor');
-var getMapIterator = require('../internals/get-map-iterator');
-var iterate = require('../internals/iterate');
-
-// `Map.prototype.filter` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  filter: function filter(callbackfn /* , thisArg */) {
-    var map = anObject(this);
-    var iterator = getMapIterator(map);
-    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-    var newMap = new (speciesConstructor(map, getBuiltIn('Map')))();
-    var setter = aFunction(newMap.set);
-    iterate(iterator, function (key, value) {
-      if (boundFunction(value, key, map)) setter.call(newMap, key, value);
-    }, undefined, true, true);
-    return newMap;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.find-key.js b/node_modules/core-js-pure/modules/esnext.map.find-key.js
deleted file mode 100644
index 67489ec..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.find-key.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var bind = require('../internals/function-bind-context');
-var getMapIterator = require('../internals/get-map-iterator');
-var iterate = require('../internals/iterate');
-
-// `Map.prototype.findKey` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  findKey: function findKey(callbackfn /* , thisArg */) {
-    var map = anObject(this);
-    var iterator = getMapIterator(map);
-    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-    return iterate(iterator, function (key, value) {
-      if (boundFunction(value, key, map)) return iterate.stop(key);
-    }, undefined, true, true).result;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.find.js b/node_modules/core-js-pure/modules/esnext.map.find.js
deleted file mode 100644
index c0a9fed..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.find.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var bind = require('../internals/function-bind-context');
-var getMapIterator = require('../internals/get-map-iterator');
-var iterate = require('../internals/iterate');
-
-// `Map.prototype.find` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  find: function find(callbackfn /* , thisArg */) {
-    var map = anObject(this);
-    var iterator = getMapIterator(map);
-    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-    return iterate(iterator, function (key, value) {
-      if (boundFunction(value, key, map)) return iterate.stop(value);
-    }, undefined, true, true).result;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.from.js b/node_modules/core-js-pure/modules/esnext.map.from.js
deleted file mode 100644
index 9aa6aac..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.from.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var from = require('../internals/collection-from');
-
-// `Map.from` method
-// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from
-$({ target: 'Map', stat: true }, {
-  from: from
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.group-by.js b/node_modules/core-js-pure/modules/esnext.map.group-by.js
deleted file mode 100644
index a34c6a0..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.group-by.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var iterate = require('../internals/iterate');
-var aFunction = require('../internals/a-function');
-
-// `Map.groupBy` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', stat: true }, {
-  groupBy: function groupBy(iterable, keyDerivative) {
-    var newMap = new this();
-    aFunction(keyDerivative);
-    var has = aFunction(newMap.has);
-    var get = aFunction(newMap.get);
-    var set = aFunction(newMap.set);
-    iterate(iterable, function (element) {
-      var derivedKey = keyDerivative(element);
-      if (!has.call(newMap, derivedKey)) set.call(newMap, derivedKey, [element]);
-      else get.call(newMap, derivedKey).push(element);
-    });
-    return newMap;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.includes.js b/node_modules/core-js-pure/modules/esnext.map.includes.js
deleted file mode 100644
index 5f9aff0..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.includes.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var getMapIterator = require('../internals/get-map-iterator');
-var sameValueZero = require('../internals/same-value-zero');
-var iterate = require('../internals/iterate');
-
-// `Map.prototype.includes` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  includes: function includes(searchElement) {
-    return iterate(getMapIterator(anObject(this)), function (key, value) {
-      if (sameValueZero(value, searchElement)) return iterate.stop();
-    }, undefined, true, true).stopped;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.key-by.js b/node_modules/core-js-pure/modules/esnext.map.key-by.js
deleted file mode 100644
index 0204bf2..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.key-by.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var iterate = require('../internals/iterate');
-var aFunction = require('../internals/a-function');
-
-// `Map.keyBy` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', stat: true }, {
-  keyBy: function keyBy(iterable, keyDerivative) {
-    var newMap = new this();
-    aFunction(keyDerivative);
-    var setter = aFunction(newMap.set);
-    iterate(iterable, function (element) {
-      setter.call(newMap, keyDerivative(element), element);
-    });
-    return newMap;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.key-of.js b/node_modules/core-js-pure/modules/esnext.map.key-of.js
deleted file mode 100644
index 1d100de..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.key-of.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var getMapIterator = require('../internals/get-map-iterator');
-var iterate = require('../internals/iterate');
-
-// `Map.prototype.includes` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  keyOf: function keyOf(searchElement) {
-    return iterate(getMapIterator(anObject(this)), function (key, value) {
-      if (value === searchElement) return iterate.stop(key);
-    }, undefined, true, true).result;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.map-keys.js b/node_modules/core-js-pure/modules/esnext.map.map-keys.js
deleted file mode 100644
index 0d9fdcb..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.map-keys.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var getBuiltIn = require('../internals/get-built-in');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var bind = require('../internals/function-bind-context');
-var speciesConstructor = require('../internals/species-constructor');
-var getMapIterator = require('../internals/get-map-iterator');
-var iterate = require('../internals/iterate');
-
-// `Map.prototype.mapKeys` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  mapKeys: function mapKeys(callbackfn /* , thisArg */) {
-    var map = anObject(this);
-    var iterator = getMapIterator(map);
-    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-    var newMap = new (speciesConstructor(map, getBuiltIn('Map')))();
-    var setter = aFunction(newMap.set);
-    iterate(iterator, function (key, value) {
-      setter.call(newMap, boundFunction(value, key, map), value);
-    }, undefined, true, true);
-    return newMap;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.map-values.js b/node_modules/core-js-pure/modules/esnext.map.map-values.js
deleted file mode 100644
index 8bd5076..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.map-values.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var getBuiltIn = require('../internals/get-built-in');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var bind = require('../internals/function-bind-context');
-var speciesConstructor = require('../internals/species-constructor');
-var getMapIterator = require('../internals/get-map-iterator');
-var iterate = require('../internals/iterate');
-
-// `Map.prototype.mapValues` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  mapValues: function mapValues(callbackfn /* , thisArg */) {
-    var map = anObject(this);
-    var iterator = getMapIterator(map);
-    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-    var newMap = new (speciesConstructor(map, getBuiltIn('Map')))();
-    var setter = aFunction(newMap.set);
-    iterate(iterator, function (key, value) {
-      setter.call(newMap, key, boundFunction(value, key, map));
-    }, undefined, true, true);
-    return newMap;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.merge.js b/node_modules/core-js-pure/modules/esnext.map.merge.js
deleted file mode 100644
index fd2c79c..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.merge.js
+++ /dev/null
@@ -1,21 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var iterate = require('../internals/iterate');
-
-// `Map.prototype.merge` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  // eslint-disable-next-line no-unused-vars
-  merge: function merge(iterable /* ...iterbles */) {
-    var map = anObject(this);
-    var setter = aFunction(map.set);
-    var i = 0;
-    while (i < arguments.length) {
-      iterate(arguments[i++], setter, map, true);
-    }
-    return map;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.of.js b/node_modules/core-js-pure/modules/esnext.map.of.js
deleted file mode 100644
index 4f84d89..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.of.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var of = require('../internals/collection-of');
-
-// `Map.of` method
-// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of
-$({ target: 'Map', stat: true }, {
-  of: of
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.reduce.js b/node_modules/core-js-pure/modules/esnext.map.reduce.js
deleted file mode 100644
index 43153f8..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.reduce.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var getMapIterator = require('../internals/get-map-iterator');
-var iterate = require('../internals/iterate');
-
-// `Map.prototype.reduce` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  reduce: function reduce(callbackfn /* , initialValue */) {
-    var map = anObject(this);
-    var iterator = getMapIterator(map);
-    var noInitial = arguments.length < 2;
-    var accumulator = noInitial ? undefined : arguments[1];
-    aFunction(callbackfn);
-    iterate(iterator, function (key, value) {
-      if (noInitial) {
-        noInitial = false;
-        accumulator = value;
-      } else {
-        accumulator = callbackfn(accumulator, value, key, map);
-      }
-    }, undefined, true, true);
-    if (noInitial) throw TypeError('Reduce of empty map with no initial value');
-    return accumulator;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.some.js b/node_modules/core-js-pure/modules/esnext.map.some.js
deleted file mode 100644
index 56cc03a..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.some.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var bind = require('../internals/function-bind-context');
-var getMapIterator = require('../internals/get-map-iterator');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.some` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  some: function some(callbackfn /* , thisArg */) {
-    var map = anObject(this);
-    var iterator = getMapIterator(map);
-    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-    return iterate(iterator, function (key, value) {
-      if (boundFunction(value, key, map)) return iterate.stop();
-    }, undefined, true, true).stopped;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.update-or-insert.js b/node_modules/core-js-pure/modules/esnext.map.update-or-insert.js
deleted file mode 100644
index f429b21..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.update-or-insert.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-// TODO: remove from `core-js@4`
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var $upsert = require('../internals/map-upsert');
-
-// `Map.prototype.updateOrInsert` method (replaced by `Map.prototype.upsert`)
-// https://github.com/thumbsupep/proposal-upsert
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  updateOrInsert: $upsert
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.update.js b/node_modules/core-js-pure/modules/esnext.map.update.js
deleted file mode 100644
index 97358e8..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.update.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-
-// `Set.prototype.update` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  update: function update(key, callback /* , thunk */) {
-    var map = anObject(this);
-    var length = arguments.length;
-    aFunction(callback);
-    var isPresentInMap = map.has(key);
-    if (!isPresentInMap && length < 3) {
-      throw TypeError('Updating absent value');
-    }
-    var value = isPresentInMap ? map.get(key) : aFunction(length > 2 ? arguments[2] : undefined)(key, map);
-    map.set(key, callback(value, key, map));
-    return map;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.map.upsert.js b/node_modules/core-js-pure/modules/esnext.map.upsert.js
deleted file mode 100644
index a30e835..0000000
--- a/node_modules/core-js-pure/modules/esnext.map.upsert.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var $upsert = require('../internals/map-upsert');
-
-// `Map.prototype.upsert` method
-// https://github.com/thumbsupep/proposal-upsert
-$({ target: 'Map', proto: true, real: true, forced: IS_PURE }, {
-  upsert: $upsert
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.clamp.js b/node_modules/core-js-pure/modules/esnext.math.clamp.js
deleted file mode 100644
index c69b122..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.clamp.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var $ = require('../internals/export');
-
-var min = Math.min;
-var max = Math.max;
-
-// `Math.clamp` method
-// https://rwaldron.github.io/proposal-math-extensions/
-$({ target: 'Math', stat: true }, {
-  clamp: function clamp(x, lower, upper) {
-    return min(upper, max(lower, x));
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.deg-per-rad.js b/node_modules/core-js-pure/modules/esnext.math.deg-per-rad.js
deleted file mode 100644
index b1c09b8..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.deg-per-rad.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var $ = require('../internals/export');
-
-// `Math.DEG_PER_RAD` constant
-// https://rwaldron.github.io/proposal-math-extensions/
-$({ target: 'Math', stat: true }, {
-  DEG_PER_RAD: Math.PI / 180
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.degrees.js b/node_modules/core-js-pure/modules/esnext.math.degrees.js
deleted file mode 100644
index e91de91..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.degrees.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var $ = require('../internals/export');
-
-var RAD_PER_DEG = 180 / Math.PI;
-
-// `Math.degrees` method
-// https://rwaldron.github.io/proposal-math-extensions/
-$({ target: 'Math', stat: true }, {
-  degrees: function degrees(radians) {
-    return radians * RAD_PER_DEG;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.fscale.js b/node_modules/core-js-pure/modules/esnext.math.fscale.js
deleted file mode 100644
index 3db68ef..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.fscale.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var $ = require('../internals/export');
-
-var scale = require('../internals/math-scale');
-var fround = require('../internals/math-fround');
-
-// `Math.fscale` method
-// https://rwaldron.github.io/proposal-math-extensions/
-$({ target: 'Math', stat: true }, {
-  fscale: function fscale(x, inLow, inHigh, outLow, outHigh) {
-    return fround(scale(x, inLow, inHigh, outLow, outHigh));
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.iaddh.js b/node_modules/core-js-pure/modules/esnext.math.iaddh.js
deleted file mode 100644
index 2323031..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.iaddh.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var $ = require('../internals/export');
-
-// `Math.iaddh` method
-// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
-// TODO: Remove from `core-js@4`
-$({ target: 'Math', stat: true }, {
-  iaddh: function iaddh(x0, x1, y0, y1) {
-    var $x0 = x0 >>> 0;
-    var $x1 = x1 >>> 0;
-    var $y0 = y0 >>> 0;
-    return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.imulh.js b/node_modules/core-js-pure/modules/esnext.math.imulh.js
deleted file mode 100644
index f7a558e..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.imulh.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var $ = require('../internals/export');
-
-// `Math.imulh` method
-// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
-// TODO: Remove from `core-js@4`
-$({ target: 'Math', stat: true }, {
-  imulh: function imulh(u, v) {
-    var UINT16 = 0xFFFF;
-    var $u = +u;
-    var $v = +v;
-    var u0 = $u & UINT16;
-    var v0 = $v & UINT16;
-    var u1 = $u >> 16;
-    var v1 = $v >> 16;
-    var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);
-    return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.isubh.js b/node_modules/core-js-pure/modules/esnext.math.isubh.js
deleted file mode 100644
index cbe0b4e..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.isubh.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var $ = require('../internals/export');
-
-// `Math.isubh` method
-// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
-// TODO: Remove from `core-js@4`
-$({ target: 'Math', stat: true }, {
-  isubh: function isubh(x0, x1, y0, y1) {
-    var $x0 = x0 >>> 0;
-    var $x1 = x1 >>> 0;
-    var $y0 = y0 >>> 0;
-    return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.rad-per-deg.js b/node_modules/core-js-pure/modules/esnext.math.rad-per-deg.js
deleted file mode 100644
index 6515cbe..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.rad-per-deg.js
+++ /dev/null
@@ -1,7 +0,0 @@
-var $ = require('../internals/export');
-
-// `Math.RAD_PER_DEG` constant
-// https://rwaldron.github.io/proposal-math-extensions/
-$({ target: 'Math', stat: true }, {
-  RAD_PER_DEG: 180 / Math.PI
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.radians.js b/node_modules/core-js-pure/modules/esnext.math.radians.js
deleted file mode 100644
index 0b25512..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.radians.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var $ = require('../internals/export');
-
-var DEG_PER_RAD = Math.PI / 180;
-
-// `Math.radians` method
-// https://rwaldron.github.io/proposal-math-extensions/
-$({ target: 'Math', stat: true }, {
-  radians: function radians(degrees) {
-    return degrees * DEG_PER_RAD;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.scale.js b/node_modules/core-js-pure/modules/esnext.math.scale.js
deleted file mode 100644
index 400a9ed..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.scale.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var scale = require('../internals/math-scale');
-
-// `Math.scale` method
-// https://rwaldron.github.io/proposal-math-extensions/
-$({ target: 'Math', stat: true }, {
-  scale: scale
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.seeded-prng.js b/node_modules/core-js-pure/modules/esnext.math.seeded-prng.js
deleted file mode 100644
index 6e39688..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.seeded-prng.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var $ = require('../internals/export');
-var anObject = require('../internals/an-object');
-var numberIsFinite = require('../internals/number-is-finite');
-var createIteratorConstructor = require('../internals/create-iterator-constructor');
-var InternalStateModule = require('../internals/internal-state');
-
-var SEEDED_RANDOM = 'Seeded Random';
-var SEEDED_RANDOM_GENERATOR = SEEDED_RANDOM + ' Generator';
-var setInternalState = InternalStateModule.set;
-var getInternalState = InternalStateModule.getterFor(SEEDED_RANDOM_GENERATOR);
-var SEED_TYPE_ERROR = 'Math.seededPRNG() argument should have a "seed" field with a finite value.';
-
-var $SeededRandomGenerator = createIteratorConstructor(function SeededRandomGenerator(seed) {
-  setInternalState(this, {
-    type: SEEDED_RANDOM_GENERATOR,
-    seed: seed % 2147483647
-  });
-}, SEEDED_RANDOM, function next() {
-  var state = getInternalState(this);
-  var seed = state.seed = (state.seed * 1103515245 + 12345) % 2147483647;
-  return { value: (seed & 1073741823) / 1073741823, done: false };
-});
-
-// `Math.seededPRNG` method
-// https://github.com/tc39/proposal-seeded-random
-// based on https://github.com/tc39/proposal-seeded-random/blob/78b8258835b57fc2100d076151ab506bc3202ae6/demo.html
-$({ target: 'Math', stat: true, forced: true }, {
-  seededPRNG: function seededPRNG(it) {
-    var seed = anObject(it).seed;
-    if (!numberIsFinite(seed)) throw TypeError(SEED_TYPE_ERROR);
-    return new $SeededRandomGenerator(seed);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.signbit.js b/node_modules/core-js-pure/modules/esnext.math.signbit.js
deleted file mode 100644
index 3ece8ea..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.signbit.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var $ = require('../internals/export');
-
-// `Math.signbit` method
-// https://github.com/tc39/proposal-Math.signbit
-$({ target: 'Math', stat: true }, {
-  signbit: function signbit(x) {
-    return (x = +x) == x && x == 0 ? 1 / x == -Infinity : x < 0;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.math.umulh.js b/node_modules/core-js-pure/modules/esnext.math.umulh.js
deleted file mode 100644
index 5f0e70f..0000000
--- a/node_modules/core-js-pure/modules/esnext.math.umulh.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var $ = require('../internals/export');
-
-// `Math.umulh` method
-// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
-// TODO: Remove from `core-js@4`
-$({ target: 'Math', stat: true }, {
-  umulh: function umulh(u, v) {
-    var UINT16 = 0xFFFF;
-    var $u = +u;
-    var $v = +v;
-    var u0 = $u & UINT16;
-    var v0 = $v & UINT16;
-    var u1 = $u >>> 16;
-    var v1 = $v >>> 16;
-    var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);
-    return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.number.from-string.js b/node_modules/core-js-pure/modules/esnext.number.from-string.js
deleted file mode 100644
index 85f1498..0000000
--- a/node_modules/core-js-pure/modules/esnext.number.from-string.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var toInteger = require('../internals/to-integer');
-var parseInt = require('../internals/number-parse-int');
-
-var INVALID_NUMBER_REPRESENTATION = 'Invalid number representation';
-var INVALID_RADIX = 'Invalid radix';
-var valid = /^[\da-z]+$/;
-
-// `Number.fromString` method
-// https://github.com/tc39/proposal-number-fromstring
-$({ target: 'Number', stat: true }, {
-  fromString: function fromString(string, radix) {
-    var sign = 1;
-    var R, mathNum;
-    if (typeof string != 'string') throw TypeError(INVALID_NUMBER_REPRESENTATION);
-    if (!string.length) throw SyntaxError(INVALID_NUMBER_REPRESENTATION);
-    if (string.charAt(0) == '-') {
-      sign = -1;
-      string = string.slice(1);
-      if (!string.length) throw SyntaxError(INVALID_NUMBER_REPRESENTATION);
-    }
-    R = radix === undefined ? 10 : toInteger(radix);
-    if (R < 2 || R > 36) throw RangeError(INVALID_RADIX);
-    if (!valid.test(string) || (mathNum = parseInt(string, R)).toString(R) !== string) {
-      throw SyntaxError(INVALID_NUMBER_REPRESENTATION);
-    }
-    return sign * mathNum;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.object.iterate-entries.js b/node_modules/core-js-pure/modules/esnext.object.iterate-entries.js
deleted file mode 100644
index b882ca3..0000000
--- a/node_modules/core-js-pure/modules/esnext.object.iterate-entries.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var ObjectIterator = require('../internals/object-iterator');
-
-// `Object.iterateEntries` method
-// https://github.com/tc39/proposal-object-iteration
-$({ target: 'Object', stat: true }, {
-  iterateEntries: function iterateEntries(object) {
-    return new ObjectIterator(object, 'entries');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.object.iterate-keys.js b/node_modules/core-js-pure/modules/esnext.object.iterate-keys.js
deleted file mode 100644
index e74dc37..0000000
--- a/node_modules/core-js-pure/modules/esnext.object.iterate-keys.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var ObjectIterator = require('../internals/object-iterator');
-
-// `Object.iterateKeys` method
-// https://github.com/tc39/proposal-object-iteration
-$({ target: 'Object', stat: true }, {
-  iterateKeys: function iterateKeys(object) {
-    return new ObjectIterator(object, 'keys');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.object.iterate-values.js b/node_modules/core-js-pure/modules/esnext.object.iterate-values.js
deleted file mode 100644
index 1d18fe0..0000000
--- a/node_modules/core-js-pure/modules/esnext.object.iterate-values.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var ObjectIterator = require('../internals/object-iterator');
-
-// `Object.iterateValues` method
-// https://github.com/tc39/proposal-object-iteration
-$({ target: 'Object', stat: true }, {
-  iterateValues: function iterateValues(object) {
-    return new ObjectIterator(object, 'values');
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.observable.js b/node_modules/core-js-pure/modules/esnext.observable.js
deleted file mode 100644
index 4eaab23..0000000
--- a/node_modules/core-js-pure/modules/esnext.observable.js
+++ /dev/null
@@ -1,207 +0,0 @@
-'use strict';
-// https://github.com/tc39/proposal-observable
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var setSpecies = require('../internals/set-species');
-var aFunction = require('../internals/a-function');
-var anObject = require('../internals/an-object');
-var isObject = require('../internals/is-object');
-var anInstance = require('../internals/an-instance');
-var defineProperty = require('../internals/object-define-property').f;
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var redefineAll = require('../internals/redefine-all');
-var getIterator = require('../internals/get-iterator');
-var iterate = require('../internals/iterate');
-var hostReportErrors = require('../internals/host-report-errors');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var InternalStateModule = require('../internals/internal-state');
-
-var OBSERVABLE = wellKnownSymbol('observable');
-var getInternalState = InternalStateModule.get;
-var setInternalState = InternalStateModule.set;
-
-var getMethod = function (fn) {
-  return fn == null ? undefined : aFunction(fn);
-};
-
-var cleanupSubscription = function (subscriptionState) {
-  var cleanup = subscriptionState.cleanup;
-  if (cleanup) {
-    subscriptionState.cleanup = undefined;
-    try {
-      cleanup();
-    } catch (error) {
-      hostReportErrors(error);
-    }
-  }
-};
-
-var subscriptionClosed = function (subscriptionState) {
-  return subscriptionState.observer === undefined;
-};
-
-var close = function (subscription, subscriptionState) {
-  if (!DESCRIPTORS) {
-    subscription.closed = true;
-    var subscriptionObserver = subscriptionState.subscriptionObserver;
-    if (subscriptionObserver) subscriptionObserver.closed = true;
-  } subscriptionState.observer = undefined;
-};
-
-var Subscription = function (observer, subscriber) {
-  var subscriptionState = setInternalState(this, {
-    cleanup: undefined,
-    observer: anObject(observer),
-    subscriptionObserver: undefined
-  });
-  var start;
-  if (!DESCRIPTORS) this.closed = false;
-  try {
-    if (start = getMethod(observer.start)) start.call(observer, this);
-  } catch (error) {
-    hostReportErrors(error);
-  }
-  if (subscriptionClosed(subscriptionState)) return;
-  var subscriptionObserver = subscriptionState.subscriptionObserver = new SubscriptionObserver(this);
-  try {
-    var cleanup = subscriber(subscriptionObserver);
-    var subscription = cleanup;
-    if (cleanup != null) subscriptionState.cleanup = typeof cleanup.unsubscribe === 'function'
-      ? function () { subscription.unsubscribe(); }
-      : aFunction(cleanup);
-  } catch (error) {
-    subscriptionObserver.error(error);
-    return;
-  } if (subscriptionClosed(subscriptionState)) cleanupSubscription(subscriptionState);
-};
-
-Subscription.prototype = redefineAll({}, {
-  unsubscribe: function unsubscribe() {
-    var subscriptionState = getInternalState(this);
-    if (!subscriptionClosed(subscriptionState)) {
-      close(this, subscriptionState);
-      cleanupSubscription(subscriptionState);
-    }
-  }
-});
-
-if (DESCRIPTORS) defineProperty(Subscription.prototype, 'closed', {
-  configurable: true,
-  get: function () {
-    return subscriptionClosed(getInternalState(this));
-  }
-});
-
-var SubscriptionObserver = function (subscription) {
-  setInternalState(this, { subscription: subscription });
-  if (!DESCRIPTORS) this.closed = false;
-};
-
-SubscriptionObserver.prototype = redefineAll({}, {
-  next: function next(value) {
-    var subscriptionState = getInternalState(getInternalState(this).subscription);
-    if (!subscriptionClosed(subscriptionState)) {
-      var observer = subscriptionState.observer;
-      try {
-        var nextMethod = getMethod(observer.next);
-        if (nextMethod) nextMethod.call(observer, value);
-      } catch (error) {
-        hostReportErrors(error);
-      }
-    }
-  },
-  error: function error(value) {
-    var subscription = getInternalState(this).subscription;
-    var subscriptionState = getInternalState(subscription);
-    if (!subscriptionClosed(subscriptionState)) {
-      var observer = subscriptionState.observer;
-      close(subscription, subscriptionState);
-      try {
-        var errorMethod = getMethod(observer.error);
-        if (errorMethod) errorMethod.call(observer, value);
-        else hostReportErrors(value);
-      } catch (err) {
-        hostReportErrors(err);
-      } cleanupSubscription(subscriptionState);
-    }
-  },
-  complete: function complete() {
-    var subscription = getInternalState(this).subscription;
-    var subscriptionState = getInternalState(subscription);
-    if (!subscriptionClosed(subscriptionState)) {
-      var observer = subscriptionState.observer;
-      close(subscription, subscriptionState);
-      try {
-        var completeMethod = getMethod(observer.complete);
-        if (completeMethod) completeMethod.call(observer);
-      } catch (error) {
-        hostReportErrors(error);
-      } cleanupSubscription(subscriptionState);
-    }
-  }
-});
-
-if (DESCRIPTORS) defineProperty(SubscriptionObserver.prototype, 'closed', {
-  configurable: true,
-  get: function () {
-    return subscriptionClosed(getInternalState(getInternalState(this).subscription));
-  }
-});
-
-var $Observable = function Observable(subscriber) {
-  anInstance(this, $Observable, 'Observable');
-  setInternalState(this, { subscriber: aFunction(subscriber) });
-};
-
-redefineAll($Observable.prototype, {
-  subscribe: function subscribe(observer) {
-    var length = arguments.length;
-    return new Subscription(typeof observer === 'function' ? {
-      next: observer,
-      error: length > 1 ? arguments[1] : undefined,
-      complete: length > 2 ? arguments[2] : undefined
-    } : isObject(observer) ? observer : {}, getInternalState(this).subscriber);
-  }
-});
-
-redefineAll($Observable, {
-  from: function from(x) {
-    var C = typeof this === 'function' ? this : $Observable;
-    var observableMethod = getMethod(anObject(x)[OBSERVABLE]);
-    if (observableMethod) {
-      var observable = anObject(observableMethod.call(x));
-      return observable.constructor === C ? observable : new C(function (observer) {
-        return observable.subscribe(observer);
-      });
-    }
-    var iterator = getIterator(x);
-    return new C(function (observer) {
-      iterate(iterator, function (it) {
-        observer.next(it);
-        if (observer.closed) return iterate.stop();
-      }, undefined, false, true);
-      observer.complete();
-    });
-  },
-  of: function of() {
-    var C = typeof this === 'function' ? this : $Observable;
-    var length = arguments.length;
-    var items = new Array(length);
-    var index = 0;
-    while (index < length) items[index] = arguments[index++];
-    return new C(function (observer) {
-      for (var i = 0; i < length; i++) {
-        observer.next(items[i]);
-        if (observer.closed) return;
-      } observer.complete();
-    });
-  }
-});
-
-createNonEnumerableProperty($Observable.prototype, OBSERVABLE, function () { return this; });
-
-$({ global: true }, {
-  Observable: $Observable
-});
-
-setSpecies('Observable');
diff --git a/node_modules/core-js-pure/modules/esnext.promise.all-settled.js b/node_modules/core-js-pure/modules/esnext.promise.all-settled.js
deleted file mode 100644
index 0b9d7ee..0000000
--- a/node_modules/core-js-pure/modules/esnext.promise.all-settled.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// TODO: Remove from `core-js@4`
-require('./es.promise.all-settled.js');
diff --git a/node_modules/core-js-pure/modules/esnext.promise.any.js b/node_modules/core-js-pure/modules/esnext.promise.any.js
deleted file mode 100644
index e26d1b3..0000000
--- a/node_modules/core-js-pure/modules/esnext.promise.any.js
+++ /dev/null
@@ -1,46 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var aFunction = require('../internals/a-function');
-var getBuiltIn = require('../internals/get-built-in');
-var newPromiseCapabilityModule = require('../internals/new-promise-capability');
-var perform = require('../internals/perform');
-var iterate = require('../internals/iterate');
-
-var PROMISE_ANY_ERROR = 'No one promise resolved';
-
-// `Promise.any` method
-// https://github.com/tc39/proposal-promise-any
-$({ target: 'Promise', stat: true }, {
-  any: function any(iterable) {
-    var C = this;
-    var capability = newPromiseCapabilityModule.f(C);
-    var resolve = capability.resolve;
-    var reject = capability.reject;
-    var result = perform(function () {
-      var promiseResolve = aFunction(C.resolve);
-      var errors = [];
-      var counter = 0;
-      var remaining = 1;
-      var alreadyResolved = false;
-      iterate(iterable, function (promise) {
-        var index = counter++;
-        var alreadyRejected = false;
-        errors.push(undefined);
-        remaining++;
-        promiseResolve.call(C, promise).then(function (value) {
-          if (alreadyRejected || alreadyResolved) return;
-          alreadyResolved = true;
-          resolve(value);
-        }, function (e) {
-          if (alreadyRejected || alreadyResolved) return;
-          alreadyRejected = true;
-          errors[index] = e;
-          --remaining || reject(new (getBuiltIn('AggregateError'))(errors, PROMISE_ANY_ERROR));
-        });
-      });
-      --remaining || reject(new (getBuiltIn('AggregateError'))(errors, PROMISE_ANY_ERROR));
-    });
-    if (result.error) reject(result.value);
-    return capability.promise;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.promise.try.js b/node_modules/core-js-pure/modules/esnext.promise.try.js
deleted file mode 100644
index 7a7b93b..0000000
--- a/node_modules/core-js-pure/modules/esnext.promise.try.js
+++ /dev/null
@@ -1,15 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var newPromiseCapabilityModule = require('../internals/new-promise-capability');
-var perform = require('../internals/perform');
-
-// `Promise.try` method
-// https://github.com/tc39/proposal-promise-try
-$({ target: 'Promise', stat: true }, {
-  'try': function (callbackfn) {
-    var promiseCapability = newPromiseCapabilityModule.f(this);
-    var result = perform(callbackfn);
-    (result.error ? promiseCapability.reject : promiseCapability.resolve)(result.value);
-    return promiseCapability.promise;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.reflect.define-metadata.js b/node_modules/core-js-pure/modules/esnext.reflect.define-metadata.js
deleted file mode 100644
index 2596439..0000000
--- a/node_modules/core-js-pure/modules/esnext.reflect.define-metadata.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var $ = require('../internals/export');
-var ReflectMetadataModule = require('../internals/reflect-metadata');
-var anObject = require('../internals/an-object');
-
-var toMetadataKey = ReflectMetadataModule.toKey;
-var ordinaryDefineOwnMetadata = ReflectMetadataModule.set;
-
-// `Reflect.defineMetadata` method
-// https://github.com/rbuckton/reflect-metadata
-$({ target: 'Reflect', stat: true }, {
-  defineMetadata: function defineMetadata(metadataKey, metadataValue, target /* , targetKey */) {
-    var targetKey = arguments.length < 4 ? undefined : toMetadataKey(arguments[3]);
-    ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), targetKey);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.reflect.delete-metadata.js b/node_modules/core-js-pure/modules/esnext.reflect.delete-metadata.js
deleted file mode 100644
index ec510d3..0000000
--- a/node_modules/core-js-pure/modules/esnext.reflect.delete-metadata.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var $ = require('../internals/export');
-var ReflectMetadataModule = require('../internals/reflect-metadata');
-var anObject = require('../internals/an-object');
-
-var toMetadataKey = ReflectMetadataModule.toKey;
-var getOrCreateMetadataMap = ReflectMetadataModule.getMap;
-var store = ReflectMetadataModule.store;
-
-// `Reflect.deleteMetadata` method
-// https://github.com/rbuckton/reflect-metadata
-$({ target: 'Reflect', stat: true }, {
-  deleteMetadata: function deleteMetadata(metadataKey, target /* , targetKey */) {
-    var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);
-    var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);
-    if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;
-    if (metadataMap.size) return true;
-    var targetMetadata = store.get(target);
-    targetMetadata['delete'](targetKey);
-    return !!targetMetadata.size || store['delete'](target);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.reflect.get-metadata-keys.js b/node_modules/core-js-pure/modules/esnext.reflect.get-metadata-keys.js
deleted file mode 100644
index 795f63d..0000000
--- a/node_modules/core-js-pure/modules/esnext.reflect.get-metadata-keys.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var $ = require('../internals/export');
-// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
-var Set = require('../modules/es.set');
-var ReflectMetadataModule = require('../internals/reflect-metadata');
-var anObject = require('../internals/an-object');
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-var iterate = require('../internals/iterate');
-
-var ordinaryOwnMetadataKeys = ReflectMetadataModule.keys;
-var toMetadataKey = ReflectMetadataModule.toKey;
-
-var from = function (iter) {
-  var result = [];
-  iterate(iter, result.push, result);
-  return result;
-};
-
-var ordinaryMetadataKeys = function (O, P) {
-  var oKeys = ordinaryOwnMetadataKeys(O, P);
-  var parent = getPrototypeOf(O);
-  if (parent === null) return oKeys;
-  var pKeys = ordinaryMetadataKeys(parent, P);
-  return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys;
-};
-
-// `Reflect.getMetadataKeys` method
-// https://github.com/rbuckton/reflect-metadata
-$({ target: 'Reflect', stat: true }, {
-  getMetadataKeys: function getMetadataKeys(target /* , targetKey */) {
-    var targetKey = arguments.length < 2 ? undefined : toMetadataKey(arguments[1]);
-    return ordinaryMetadataKeys(anObject(target), targetKey);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.reflect.get-metadata.js b/node_modules/core-js-pure/modules/esnext.reflect.get-metadata.js
deleted file mode 100644
index fd344e8..0000000
--- a/node_modules/core-js-pure/modules/esnext.reflect.get-metadata.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var $ = require('../internals/export');
-var ReflectMetadataModule = require('../internals/reflect-metadata');
-var anObject = require('../internals/an-object');
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-
-var ordinaryHasOwnMetadata = ReflectMetadataModule.has;
-var ordinaryGetOwnMetadata = ReflectMetadataModule.get;
-var toMetadataKey = ReflectMetadataModule.toKey;
-
-var ordinaryGetMetadata = function (MetadataKey, O, P) {
-  var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);
-  if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P);
-  var parent = getPrototypeOf(O);
-  return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;
-};
-
-// `Reflect.getMetadata` method
-// https://github.com/rbuckton/reflect-metadata
-$({ target: 'Reflect', stat: true }, {
-  getMetadata: function getMetadata(metadataKey, target /* , targetKey */) {
-    var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);
-    return ordinaryGetMetadata(metadataKey, anObject(target), targetKey);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.reflect.get-own-metadata-keys.js b/node_modules/core-js-pure/modules/esnext.reflect.get-own-metadata-keys.js
deleted file mode 100644
index 090bb8d..0000000
--- a/node_modules/core-js-pure/modules/esnext.reflect.get-own-metadata-keys.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var $ = require('../internals/export');
-var ReflectMetadataModule = require('../internals/reflect-metadata');
-var anObject = require('../internals/an-object');
-
-var ordinaryOwnMetadataKeys = ReflectMetadataModule.keys;
-var toMetadataKey = ReflectMetadataModule.toKey;
-
-// `Reflect.getOwnMetadataKeys` method
-// https://github.com/rbuckton/reflect-metadata
-$({ target: 'Reflect', stat: true }, {
-  getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targetKey */) {
-    var targetKey = arguments.length < 2 ? undefined : toMetadataKey(arguments[1]);
-    return ordinaryOwnMetadataKeys(anObject(target), targetKey);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.reflect.get-own-metadata.js b/node_modules/core-js-pure/modules/esnext.reflect.get-own-metadata.js
deleted file mode 100644
index 81c40d0..0000000
--- a/node_modules/core-js-pure/modules/esnext.reflect.get-own-metadata.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var $ = require('../internals/export');
-var ReflectMetadataModule = require('../internals/reflect-metadata');
-var anObject = require('../internals/an-object');
-
-var ordinaryGetOwnMetadata = ReflectMetadataModule.get;
-var toMetadataKey = ReflectMetadataModule.toKey;
-
-// `Reflect.getOwnMetadata` method
-// https://github.com/rbuckton/reflect-metadata
-$({ target: 'Reflect', stat: true }, {
-  getOwnMetadata: function getOwnMetadata(metadataKey, target /* , targetKey */) {
-    var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);
-    return ordinaryGetOwnMetadata(metadataKey, anObject(target), targetKey);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.reflect.has-metadata.js b/node_modules/core-js-pure/modules/esnext.reflect.has-metadata.js
deleted file mode 100644
index 4b81771..0000000
--- a/node_modules/core-js-pure/modules/esnext.reflect.has-metadata.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var $ = require('../internals/export');
-var ReflectMetadataModule = require('../internals/reflect-metadata');
-var anObject = require('../internals/an-object');
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-
-var ordinaryHasOwnMetadata = ReflectMetadataModule.has;
-var toMetadataKey = ReflectMetadataModule.toKey;
-
-var ordinaryHasMetadata = function (MetadataKey, O, P) {
-  var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);
-  if (hasOwn) return true;
-  var parent = getPrototypeOf(O);
-  return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;
-};
-
-// `Reflect.hasMetadata` method
-// https://github.com/rbuckton/reflect-metadata
-$({ target: 'Reflect', stat: true }, {
-  hasMetadata: function hasMetadata(metadataKey, target /* , targetKey */) {
-    var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);
-    return ordinaryHasMetadata(metadataKey, anObject(target), targetKey);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.reflect.has-own-metadata.js b/node_modules/core-js-pure/modules/esnext.reflect.has-own-metadata.js
deleted file mode 100644
index 87774b1..0000000
--- a/node_modules/core-js-pure/modules/esnext.reflect.has-own-metadata.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var $ = require('../internals/export');
-var ReflectMetadataModule = require('../internals/reflect-metadata');
-var anObject = require('../internals/an-object');
-
-var ordinaryHasOwnMetadata = ReflectMetadataModule.has;
-var toMetadataKey = ReflectMetadataModule.toKey;
-
-// `Reflect.hasOwnMetadata` method
-// https://github.com/rbuckton/reflect-metadata
-$({ target: 'Reflect', stat: true }, {
-  hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , targetKey */) {
-    var targetKey = arguments.length < 3 ? undefined : toMetadataKey(arguments[2]);
-    return ordinaryHasOwnMetadata(metadataKey, anObject(target), targetKey);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.reflect.metadata.js b/node_modules/core-js-pure/modules/esnext.reflect.metadata.js
deleted file mode 100644
index 7e1caa6..0000000
--- a/node_modules/core-js-pure/modules/esnext.reflect.metadata.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var $ = require('../internals/export');
-var ReflectMetadataModule = require('../internals/reflect-metadata');
-var anObject = require('../internals/an-object');
-
-var toMetadataKey = ReflectMetadataModule.toKey;
-var ordinaryDefineOwnMetadata = ReflectMetadataModule.set;
-
-// `Reflect.metadata` method
-// https://github.com/rbuckton/reflect-metadata
-$({ target: 'Reflect', stat: true }, {
-  metadata: function metadata(metadataKey, metadataValue) {
-    return function decorator(target, key) {
-      ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetadataKey(key));
-    };
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.add-all.js b/node_modules/core-js-pure/modules/esnext.set.add-all.js
deleted file mode 100644
index 5de5089..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.add-all.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var collectionAddAll = require('../internals/collection-add-all');
-
-// `Set.prototype.addAll` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  addAll: function addAll(/* ...elements */) {
-    return collectionAddAll.apply(this, arguments);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.delete-all.js b/node_modules/core-js-pure/modules/esnext.set.delete-all.js
deleted file mode 100644
index 43e4195..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.delete-all.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var collectionDeleteAll = require('../internals/collection-delete-all');
-
-// `Set.prototype.deleteAll` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  deleteAll: function deleteAll(/* ...elements */) {
-    return collectionDeleteAll.apply(this, arguments);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.difference.js b/node_modules/core-js-pure/modules/esnext.set.difference.js
deleted file mode 100644
index 0bb6562..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.difference.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var getBuiltIn = require('../internals/get-built-in');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var speciesConstructor = require('../internals/species-constructor');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.difference` method
-// https://github.com/tc39/proposal-set-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  difference: function difference(iterable) {
-    var set = anObject(this);
-    var newSet = new (speciesConstructor(set, getBuiltIn('Set')))(set);
-    var remover = aFunction(newSet['delete']);
-    iterate(iterable, function (value) {
-      remover.call(newSet, value);
-    });
-    return newSet;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.every.js b/node_modules/core-js-pure/modules/esnext.set.every.js
deleted file mode 100644
index 03813f9..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.every.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var bind = require('../internals/function-bind-context');
-var getSetIterator = require('../internals/get-set-iterator');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.every` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  every: function every(callbackfn /* , thisArg */) {
-    var set = anObject(this);
-    var iterator = getSetIterator(set);
-    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-    return !iterate(iterator, function (value) {
-      if (!boundFunction(value, value, set)) return iterate.stop();
-    }, undefined, false, true).stopped;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.filter.js b/node_modules/core-js-pure/modules/esnext.set.filter.js
deleted file mode 100644
index a408273..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.filter.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var getBuiltIn = require('../internals/get-built-in');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var bind = require('../internals/function-bind-context');
-var speciesConstructor = require('../internals/species-constructor');
-var getSetIterator = require('../internals/get-set-iterator');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.filter` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  filter: function filter(callbackfn /* , thisArg */) {
-    var set = anObject(this);
-    var iterator = getSetIterator(set);
-    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-    var newSet = new (speciesConstructor(set, getBuiltIn('Set')))();
-    var adder = aFunction(newSet.add);
-    iterate(iterator, function (value) {
-      if (boundFunction(value, value, set)) adder.call(newSet, value);
-    }, undefined, false, true);
-    return newSet;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.find.js b/node_modules/core-js-pure/modules/esnext.set.find.js
deleted file mode 100644
index fcfef51..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.find.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var bind = require('../internals/function-bind-context');
-var getSetIterator = require('../internals/get-set-iterator');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.find` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  find: function find(callbackfn /* , thisArg */) {
-    var set = anObject(this);
-    var iterator = getSetIterator(set);
-    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-    return iterate(iterator, function (value) {
-      if (boundFunction(value, value, set)) return iterate.stop(value);
-    }, undefined, false, true).result;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.from.js b/node_modules/core-js-pure/modules/esnext.set.from.js
deleted file mode 100644
index 3ca34f4..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.from.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var from = require('../internals/collection-from');
-
-// `Set.from` method
-// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from
-$({ target: 'Set', stat: true }, {
-  from: from
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.intersection.js b/node_modules/core-js-pure/modules/esnext.set.intersection.js
deleted file mode 100644
index 2d59f0d..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.intersection.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var getBuiltIn = require('../internals/get-built-in');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var speciesConstructor = require('../internals/species-constructor');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.intersection` method
-// https://github.com/tc39/proposal-set-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  intersection: function intersection(iterable) {
-    var set = anObject(this);
-    var newSet = new (speciesConstructor(set, getBuiltIn('Set')))();
-    var hasCheck = aFunction(set.has);
-    var adder = aFunction(newSet.add);
-    iterate(iterable, function (value) {
-      if (hasCheck.call(set, value)) adder.call(newSet, value);
-    });
-    return newSet;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.is-disjoint-from.js b/node_modules/core-js-pure/modules/esnext.set.is-disjoint-from.js
deleted file mode 100644
index 3166ed9..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.is-disjoint-from.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.isDisjointFrom` method
-// https://tc39.github.io/proposal-set-methods/#Set.prototype.isDisjointFrom
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  isDisjointFrom: function isDisjointFrom(iterable) {
-    var set = anObject(this);
-    var hasCheck = aFunction(set.has);
-    return !iterate(iterable, function (value) {
-      if (hasCheck.call(set, value) === true) return iterate.stop();
-    }).stopped;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.is-subset-of.js b/node_modules/core-js-pure/modules/esnext.set.is-subset-of.js
deleted file mode 100644
index b3dde5e..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.is-subset-of.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var getBuiltIn = require('../internals/get-built-in');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var getIterator = require('../internals/get-iterator');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.isSubsetOf` method
-// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSubsetOf
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  isSubsetOf: function isSubsetOf(iterable) {
-    var iterator = getIterator(this);
-    var otherSet = anObject(iterable);
-    var hasCheck = otherSet.has;
-    if (typeof hasCheck != 'function') {
-      otherSet = new (getBuiltIn('Set'))(iterable);
-      hasCheck = aFunction(otherSet.has);
-    }
-    return !iterate(iterator, function (value) {
-      if (hasCheck.call(otherSet, value) === false) return iterate.stop();
-    }, undefined, false, true).stopped;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.is-superset-of.js b/node_modules/core-js-pure/modules/esnext.set.is-superset-of.js
deleted file mode 100644
index 303667a..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.is-superset-of.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.isSupersetOf` method
-// https://tc39.github.io/proposal-set-methods/#Set.prototype.isSupersetOf
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  isSupersetOf: function isSupersetOf(iterable) {
-    var set = anObject(this);
-    var hasCheck = aFunction(set.has);
-    return !iterate(iterable, function (value) {
-      if (hasCheck.call(set, value) === false) return iterate.stop();
-    }).stopped;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.join.js b/node_modules/core-js-pure/modules/esnext.set.join.js
deleted file mode 100644
index 4b78472..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.join.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var getSetIterator = require('../internals/get-set-iterator');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.join` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  join: function join(separator) {
-    var set = anObject(this);
-    var iterator = getSetIterator(set);
-    var sep = separator === undefined ? ',' : String(separator);
-    var result = [];
-    iterate(iterator, result.push, result, false, true);
-    return result.join(sep);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.map.js b/node_modules/core-js-pure/modules/esnext.set.map.js
deleted file mode 100644
index e9c6c14..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.map.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var getBuiltIn = require('../internals/get-built-in');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var bind = require('../internals/function-bind-context');
-var speciesConstructor = require('../internals/species-constructor');
-var getSetIterator = require('../internals/get-set-iterator');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.map` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  map: function map(callbackfn /* , thisArg */) {
-    var set = anObject(this);
-    var iterator = getSetIterator(set);
-    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-    var newSet = new (speciesConstructor(set, getBuiltIn('Set')))();
-    var adder = aFunction(newSet.add);
-    iterate(iterator, function (value) {
-      adder.call(newSet, boundFunction(value, value, set));
-    }, undefined, false, true);
-    return newSet;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.of.js b/node_modules/core-js-pure/modules/esnext.set.of.js
deleted file mode 100644
index 744698e..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.of.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var of = require('../internals/collection-of');
-
-// `Set.of` method
-// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of
-$({ target: 'Set', stat: true }, {
-  of: of
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.reduce.js b/node_modules/core-js-pure/modules/esnext.set.reduce.js
deleted file mode 100644
index 00e30de..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.reduce.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var getSetIterator = require('../internals/get-set-iterator');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.reduce` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  reduce: function reduce(callbackfn /* , initialValue */) {
-    var set = anObject(this);
-    var iterator = getSetIterator(set);
-    var noInitial = arguments.length < 2;
-    var accumulator = noInitial ? undefined : arguments[1];
-    aFunction(callbackfn);
-    iterate(iterator, function (value) {
-      if (noInitial) {
-        noInitial = false;
-        accumulator = value;
-      } else {
-        accumulator = callbackfn(accumulator, value, value, set);
-      }
-    }, undefined, false, true);
-    if (noInitial) throw TypeError('Reduce of empty set with no initial value');
-    return accumulator;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.some.js b/node_modules/core-js-pure/modules/esnext.set.some.js
deleted file mode 100644
index df8dda8..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.some.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var anObject = require('../internals/an-object');
-var bind = require('../internals/function-bind-context');
-var getSetIterator = require('../internals/get-set-iterator');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.some` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  some: function some(callbackfn /* , thisArg */) {
-    var set = anObject(this);
-    var iterator = getSetIterator(set);
-    var boundFunction = bind(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
-    return iterate(iterator, function (value) {
-      if (boundFunction(value, value, set)) return iterate.stop();
-    }, undefined, false, true).stopped;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.symmetric-difference.js b/node_modules/core-js-pure/modules/esnext.set.symmetric-difference.js
deleted file mode 100644
index ccd326f..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.symmetric-difference.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var getBuiltIn = require('../internals/get-built-in');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var speciesConstructor = require('../internals/species-constructor');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.symmetricDifference` method
-// https://github.com/tc39/proposal-set-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  symmetricDifference: function symmetricDifference(iterable) {
-    var set = anObject(this);
-    var newSet = new (speciesConstructor(set, getBuiltIn('Set')))(set);
-    var remover = aFunction(newSet['delete']);
-    var adder = aFunction(newSet.add);
-    iterate(iterable, function (value) {
-      remover.call(newSet, value) || adder.call(newSet, value);
-    });
-    return newSet;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.set.union.js b/node_modules/core-js-pure/modules/esnext.set.union.js
deleted file mode 100644
index fc153d4..0000000
--- a/node_modules/core-js-pure/modules/esnext.set.union.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var getBuiltIn = require('../internals/get-built-in');
-var anObject = require('../internals/an-object');
-var aFunction = require('../internals/a-function');
-var speciesConstructor = require('../internals/species-constructor');
-var iterate = require('../internals/iterate');
-
-// `Set.prototype.union` method
-// https://github.com/tc39/proposal-set-methods
-$({ target: 'Set', proto: true, real: true, forced: IS_PURE }, {
-  union: function union(iterable) {
-    var set = anObject(this);
-    var newSet = new (speciesConstructor(set, getBuiltIn('Set')))(set);
-    iterate(iterable, aFunction(newSet.add), newSet);
-    return newSet;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.string.at.js b/node_modules/core-js-pure/modules/esnext.string.at.js
deleted file mode 100644
index fc3c44a..0000000
--- a/node_modules/core-js-pure/modules/esnext.string.at.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var charAt = require('../internals/string-multibyte').charAt;
-
-// `String.prototype.at` method
-// https://github.com/mathiasbynens/String.prototype.at
-$({ target: 'String', proto: true }, {
-  at: function at(pos) {
-    return charAt(this, pos);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.string.code-points.js b/node_modules/core-js-pure/modules/esnext.string.code-points.js
deleted file mode 100644
index fcf15d6..0000000
--- a/node_modules/core-js-pure/modules/esnext.string.code-points.js
+++ /dev/null
@@ -1,38 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var createIteratorConstructor = require('../internals/create-iterator-constructor');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-var InternalStateModule = require('../internals/internal-state');
-var StringMultibyteModule = require('../internals/string-multibyte');
-
-var codeAt = StringMultibyteModule.codeAt;
-var charAt = StringMultibyteModule.charAt;
-var STRING_ITERATOR = 'String Iterator';
-var setInternalState = InternalStateModule.set;
-var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);
-
-// TODO: unify with String#@@iterator
-var $StringIterator = createIteratorConstructor(function StringIterator(string) {
-  setInternalState(this, {
-    type: STRING_ITERATOR,
-    string: string,
-    index: 0
-  });
-}, 'String', function next() {
-  var state = getInternalState(this);
-  var string = state.string;
-  var index = state.index;
-  var point;
-  if (index >= string.length) return { value: undefined, done: true };
-  point = charAt(string, index);
-  state.index += point.length;
-  return { value: { codePoint: codeAt(point, 0), position: index }, done: false };
-});
-
-// `String.prototype.codePoints` method
-// https://github.com/tc39/proposal-string-prototype-codepoints
-$({ target: 'String', proto: true }, {
-  codePoints: function codePoints() {
-    return new $StringIterator(String(requireObjectCoercible(this)));
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.string.match-all.js b/node_modules/core-js-pure/modules/esnext.string.match-all.js
deleted file mode 100644
index b01996d..0000000
--- a/node_modules/core-js-pure/modules/esnext.string.match-all.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// TODO: Remove from `core-js@4`
-require('./es.string.match-all');
diff --git a/node_modules/core-js-pure/modules/esnext.string.replace-all.js b/node_modules/core-js-pure/modules/esnext.string.replace-all.js
deleted file mode 100644
index 22220ee..0000000
--- a/node_modules/core-js-pure/modules/esnext.string.replace-all.js
+++ /dev/null
@@ -1,50 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-var isRegExp = require('../internals/is-regexp');
-var getRegExpFlags = require('../internals/regexp-flags');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var IS_PURE = require('../internals/is-pure');
-
-var REPLACE = wellKnownSymbol('replace');
-var RegExpPrototype = RegExp.prototype;
-
-// `String.prototype.replaceAll` method
-// https://github.com/tc39/proposal-string-replace-all
-$({ target: 'String', proto: true }, {
-  replaceAll: function replaceAll(searchValue, replaceValue) {
-    var O = requireObjectCoercible(this);
-    var IS_REG_EXP, flags, replacer, string, searchString, template, result, position, index;
-    if (searchValue != null) {
-      IS_REG_EXP = isRegExp(searchValue);
-      if (IS_REG_EXP) {
-        flags = String(requireObjectCoercible('flags' in RegExpPrototype
-          ? searchValue.flags
-          : getRegExpFlags.call(searchValue)
-        ));
-        if (!~flags.indexOf('g')) throw TypeError('`.replaceAll` does not allow non-global regexes');
-      }
-      replacer = searchValue[REPLACE];
-      if (replacer !== undefined) {
-        return replacer.call(searchValue, O, replaceValue);
-      } else if (IS_PURE && IS_REG_EXP) {
-        return String(O).replace(searchValue, replaceValue);
-      }
-    }
-    string = String(O);
-    searchString = String(searchValue);
-    if (searchString === '') return replaceAll.call(string, /(?:)/g, replaceValue);
-    template = string.split(searchString);
-    if (typeof replaceValue !== 'function') {
-      return template.join(String(replaceValue));
-    }
-    result = template[0];
-    position = result.length;
-    for (index = 1; index < template.length; index++) {
-      result += String(replaceValue(searchString, position, string));
-      position += searchString.length + template[index].length;
-      result += template[index];
-    }
-    return result;
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.symbol.async-dispose.js b/node_modules/core-js-pure/modules/esnext.symbol.async-dispose.js
deleted file mode 100644
index 776608e..0000000
--- a/node_modules/core-js-pure/modules/esnext.symbol.async-dispose.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.asyncDispose` well-known symbol
-// https://github.com/tc39/proposal-using-statement
-defineWellKnownSymbol('asyncDispose');
diff --git a/node_modules/core-js-pure/modules/esnext.symbol.dispose.js b/node_modules/core-js-pure/modules/esnext.symbol.dispose.js
deleted file mode 100644
index ac7691d..0000000
--- a/node_modules/core-js-pure/modules/esnext.symbol.dispose.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.dispose` well-known symbol
-// https://github.com/tc39/proposal-using-statement
-defineWellKnownSymbol('dispose');
diff --git a/node_modules/core-js-pure/modules/esnext.symbol.observable.js b/node_modules/core-js-pure/modules/esnext.symbol.observable.js
deleted file mode 100644
index dc4a4f5..0000000
--- a/node_modules/core-js-pure/modules/esnext.symbol.observable.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.observable` well-known symbol
-// https://github.com/tc39/proposal-observable
-defineWellKnownSymbol('observable');
diff --git a/node_modules/core-js-pure/modules/esnext.symbol.pattern-match.js b/node_modules/core-js-pure/modules/esnext.symbol.pattern-match.js
deleted file mode 100644
index 0120063..0000000
--- a/node_modules/core-js-pure/modules/esnext.symbol.pattern-match.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-// `Symbol.patternMatch` well-known symbol
-// https://github.com/tc39/proposal-pattern-matching
-defineWellKnownSymbol('patternMatch');
diff --git a/node_modules/core-js-pure/modules/esnext.symbol.replace-all.js b/node_modules/core-js-pure/modules/esnext.symbol.replace-all.js
deleted file mode 100644
index 82cbd29..0000000
--- a/node_modules/core-js-pure/modules/esnext.symbol.replace-all.js
+++ /dev/null
@@ -1,4 +0,0 @@
-// TODO: remove from `core-js@4`
-var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
-
-defineWellKnownSymbol('replaceAll');
diff --git a/node_modules/core-js-pure/modules/esnext.weak-map.delete-all.js b/node_modules/core-js-pure/modules/esnext.weak-map.delete-all.js
deleted file mode 100644
index ef56f99..0000000
--- a/node_modules/core-js-pure/modules/esnext.weak-map.delete-all.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var collectionDeleteAll = require('../internals/collection-delete-all');
-
-// `WeakMap.prototype.deleteAll` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'WeakMap', proto: true, real: true, forced: IS_PURE }, {
-  deleteAll: function deleteAll(/* ...elements */) {
-    return collectionDeleteAll.apply(this, arguments);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.weak-map.from.js b/node_modules/core-js-pure/modules/esnext.weak-map.from.js
deleted file mode 100644
index 8dc7b01..0000000
--- a/node_modules/core-js-pure/modules/esnext.weak-map.from.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var from = require('../internals/collection-from');
-
-// `WeakMap.from` method
-// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from
-$({ target: 'WeakMap', stat: true }, {
-  from: from
-});
diff --git a/node_modules/core-js-pure/modules/esnext.weak-map.of.js b/node_modules/core-js-pure/modules/esnext.weak-map.of.js
deleted file mode 100644
index efea513..0000000
--- a/node_modules/core-js-pure/modules/esnext.weak-map.of.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var of = require('../internals/collection-of');
-
-// `WeakMap.of` method
-// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of
-$({ target: 'WeakMap', stat: true }, {
-  of: of
-});
diff --git a/node_modules/core-js-pure/modules/esnext.weak-map.upsert.js b/node_modules/core-js-pure/modules/esnext.weak-map.upsert.js
deleted file mode 100644
index 1e0d60c..0000000
--- a/node_modules/core-js-pure/modules/esnext.weak-map.upsert.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var $upsert = require('../internals/map-upsert');
-
-// `WeakMap.prototype.upsert` method
-// https://github.com/thumbsupep/proposal-upsert
-$({ target: 'WeakMap', proto: true, real: true, forced: IS_PURE }, {
-  upsert: $upsert
-});
diff --git a/node_modules/core-js-pure/modules/esnext.weak-set.add-all.js b/node_modules/core-js-pure/modules/esnext.weak-set.add-all.js
deleted file mode 100644
index e8bb4c9..0000000
--- a/node_modules/core-js-pure/modules/esnext.weak-set.add-all.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var collectionAddAll = require('../internals/collection-add-all');
-
-// `WeakSet.prototype.addAll` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'WeakSet', proto: true, real: true, forced: IS_PURE }, {
-  addAll: function addAll(/* ...elements */) {
-    return collectionAddAll.apply(this, arguments);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.weak-set.delete-all.js b/node_modules/core-js-pure/modules/esnext.weak-set.delete-all.js
deleted file mode 100644
index b262821..0000000
--- a/node_modules/core-js-pure/modules/esnext.weak-set.delete-all.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-var $ = require('../internals/export');
-var IS_PURE = require('../internals/is-pure');
-var collectionDeleteAll = require('../internals/collection-delete-all');
-
-// `WeakSet.prototype.deleteAll` method
-// https://github.com/tc39/proposal-collection-methods
-$({ target: 'WeakSet', proto: true, real: true, forced: IS_PURE }, {
-  deleteAll: function deleteAll(/* ...elements */) {
-    return collectionDeleteAll.apply(this, arguments);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/esnext.weak-set.from.js b/node_modules/core-js-pure/modules/esnext.weak-set.from.js
deleted file mode 100644
index e13acec..0000000
--- a/node_modules/core-js-pure/modules/esnext.weak-set.from.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var from = require('../internals/collection-from');
-
-// `WeakSet.from` method
-// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from
-$({ target: 'WeakSet', stat: true }, {
-  from: from
-});
diff --git a/node_modules/core-js-pure/modules/esnext.weak-set.of.js b/node_modules/core-js-pure/modules/esnext.weak-set.of.js
deleted file mode 100644
index aee9920..0000000
--- a/node_modules/core-js-pure/modules/esnext.weak-set.of.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var $ = require('../internals/export');
-var of = require('../internals/collection-of');
-
-// `WeakSet.of` method
-// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of
-$({ target: 'WeakSet', stat: true }, {
-  of: of
-});
diff --git a/node_modules/core-js-pure/modules/web.dom-collections.for-each.js b/node_modules/core-js-pure/modules/web.dom-collections.for-each.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/web.dom-collections.for-each.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/modules/web.dom-collections.iterator.js b/node_modules/core-js-pure/modules/web.dom-collections.iterator.js
deleted file mode 100644
index 0bba3b8..0000000
--- a/node_modules/core-js-pure/modules/web.dom-collections.iterator.js
+++ /dev/null
@@ -1,18 +0,0 @@
-require('./es.array.iterator');
-var DOMIterables = require('../internals/dom-iterables');
-var global = require('../internals/global');
-var classof = require('../internals/classof');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var Iterators = require('../internals/iterators');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var TO_STRING_TAG = wellKnownSymbol('toStringTag');
-
-for (var COLLECTION_NAME in DOMIterables) {
-  var Collection = global[COLLECTION_NAME];
-  var CollectionPrototype = Collection && Collection.prototype;
-  if (CollectionPrototype && classof(CollectionPrototype) !== TO_STRING_TAG) {
-    createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);
-  }
-  Iterators[COLLECTION_NAME] = Iterators.Array;
-}
diff --git a/node_modules/core-js-pure/modules/web.immediate.js b/node_modules/core-js-pure/modules/web.immediate.js
deleted file mode 100644
index 0a0f1ef..0000000
--- a/node_modules/core-js-pure/modules/web.immediate.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var $ = require('../internals/export');
-var global = require('../internals/global');
-var task = require('../internals/task');
-
-var FORCED = !global.setImmediate || !global.clearImmediate;
-
-// http://w3c.github.io/setImmediate/
-$({ global: true, bind: true, enumerable: true, forced: FORCED }, {
-  // `setImmediate` method
-  // http://w3c.github.io/setImmediate/#si-setImmediate
-  setImmediate: task.set,
-  // `clearImmediate` method
-  // http://w3c.github.io/setImmediate/#si-clearImmediate
-  clearImmediate: task.clear
-});
diff --git a/node_modules/core-js-pure/modules/web.queue-microtask.js b/node_modules/core-js-pure/modules/web.queue-microtask.js
deleted file mode 100644
index ac5530c..0000000
--- a/node_modules/core-js-pure/modules/web.queue-microtask.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var $ = require('../internals/export');
-var global = require('../internals/global');
-var microtask = require('../internals/microtask');
-var classof = require('../internals/classof-raw');
-
-var process = global.process;
-var isNode = classof(process) == 'process';
-
-// `queueMicrotask` method
-// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-queuemicrotask
-$({ global: true, enumerable: true, noTargetGet: true }, {
-  queueMicrotask: function queueMicrotask(fn) {
-    var domain = isNode && process.domain;
-    microtask(domain ? domain.bind(fn) : fn);
-  }
-});
diff --git a/node_modules/core-js-pure/modules/web.timers.js b/node_modules/core-js-pure/modules/web.timers.js
deleted file mode 100644
index 0a4a7fc..0000000
--- a/node_modules/core-js-pure/modules/web.timers.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var $ = require('../internals/export');
-var global = require('../internals/global');
-var userAgent = require('../internals/engine-user-agent');
-
-var slice = [].slice;
-var MSIE = /MSIE .\./.test(userAgent); // <- dirty ie9- check
-
-var wrap = function (scheduler) {
-  return function (handler, timeout /* , ...arguments */) {
-    var boundArgs = arguments.length > 2;
-    var args = boundArgs ? slice.call(arguments, 2) : undefined;
-    return scheduler(boundArgs ? function () {
-      // eslint-disable-next-line no-new-func
-      (typeof handler == 'function' ? handler : Function(handler)).apply(this, args);
-    } : handler, timeout);
-  };
-};
-
-// ie9- setTimeout & setInterval additional parameters fix
-// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers
-$({ global: true, bind: true, forced: MSIE }, {
-  // `setTimeout` method
-  // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout
-  setTimeout: wrap(global.setTimeout),
-  // `setInterval` method
-  // https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval
-  setInterval: wrap(global.setInterval)
-});
diff --git a/node_modules/core-js-pure/modules/web.url-search-params.js b/node_modules/core-js-pure/modules/web.url-search-params.js
deleted file mode 100644
index e2b54c7..0000000
--- a/node_modules/core-js-pure/modules/web.url-search-params.js
+++ /dev/null
@@ -1,347 +0,0 @@
-'use strict';
-// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
-require('../modules/es.array.iterator');
-var $ = require('../internals/export');
-var getBuiltIn = require('../internals/get-built-in');
-var USE_NATIVE_URL = require('../internals/native-url');
-var redefine = require('../internals/redefine');
-var redefineAll = require('../internals/redefine-all');
-var setToStringTag = require('../internals/set-to-string-tag');
-var createIteratorConstructor = require('../internals/create-iterator-constructor');
-var InternalStateModule = require('../internals/internal-state');
-var anInstance = require('../internals/an-instance');
-var hasOwn = require('../internals/has');
-var bind = require('../internals/function-bind-context');
-var classof = require('../internals/classof');
-var anObject = require('../internals/an-object');
-var isObject = require('../internals/is-object');
-var create = require('../internals/object-create');
-var createPropertyDescriptor = require('../internals/create-property-descriptor');
-var getIterator = require('../internals/get-iterator');
-var getIteratorMethod = require('../internals/get-iterator-method');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var $fetch = getBuiltIn('fetch');
-var Headers = getBuiltIn('Headers');
-var ITERATOR = wellKnownSymbol('iterator');
-var URL_SEARCH_PARAMS = 'URLSearchParams';
-var URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';
-var setInternalState = InternalStateModule.set;
-var getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);
-var getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);
-
-var plus = /\+/g;
-var sequences = Array(4);
-
-var percentSequence = function (bytes) {
-  return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\da-f]{2}){' + bytes + '})', 'gi'));
-};
-
-var percentDecode = function (sequence) {
-  try {
-    return decodeURIComponent(sequence);
-  } catch (error) {
-    return sequence;
-  }
-};
-
-var deserialize = function (it) {
-  var result = it.replace(plus, ' ');
-  var bytes = 4;
-  try {
-    return decodeURIComponent(result);
-  } catch (error) {
-    while (bytes) {
-      result = result.replace(percentSequence(bytes--), percentDecode);
-    }
-    return result;
-  }
-};
-
-var find = /[!'()~]|%20/g;
-
-var replace = {
-  '!': '%21',
-  "'": '%27',
-  '(': '%28',
-  ')': '%29',
-  '~': '%7E',
-  '%20': '+'
-};
-
-var replacer = function (match) {
-  return replace[match];
-};
-
-var serialize = function (it) {
-  return encodeURIComponent(it).replace(find, replacer);
-};
-
-var parseSearchParams = function (result, query) {
-  if (query) {
-    var attributes = query.split('&');
-    var index = 0;
-    var attribute, entry;
-    while (index < attributes.length) {
-      attribute = attributes[index++];
-      if (attribute.length) {
-        entry = attribute.split('=');
-        result.push({
-          key: deserialize(entry.shift()),
-          value: deserialize(entry.join('='))
-        });
-      }
-    }
-  }
-};
-
-var updateSearchParams = function (query) {
-  this.entries.length = 0;
-  parseSearchParams(this.entries, query);
-};
-
-var validateArgumentsLength = function (passed, required) {
-  if (passed < required) throw TypeError('Not enough arguments');
-};
-
-var URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {
-  setInternalState(this, {
-    type: URL_SEARCH_PARAMS_ITERATOR,
-    iterator: getIterator(getInternalParamsState(params).entries),
-    kind: kind
-  });
-}, 'Iterator', function next() {
-  var state = getInternalIteratorState(this);
-  var kind = state.kind;
-  var step = state.iterator.next();
-  var entry = step.value;
-  if (!step.done) {
-    step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];
-  } return step;
-});
-
-// `URLSearchParams` constructor
-// https://url.spec.whatwg.org/#interface-urlsearchparams
-var URLSearchParamsConstructor = function URLSearchParams(/* init */) {
-  anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);
-  var init = arguments.length > 0 ? arguments[0] : undefined;
-  var that = this;
-  var entries = [];
-  var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;
-
-  setInternalState(that, {
-    type: URL_SEARCH_PARAMS,
-    entries: entries,
-    updateURL: function () { /* empty */ },
-    updateSearchParams: updateSearchParams
-  });
-
-  if (init !== undefined) {
-    if (isObject(init)) {
-      iteratorMethod = getIteratorMethod(init);
-      if (typeof iteratorMethod === 'function') {
-        iterator = iteratorMethod.call(init);
-        next = iterator.next;
-        while (!(step = next.call(iterator)).done) {
-          entryIterator = getIterator(anObject(step.value));
-          entryNext = entryIterator.next;
-          if (
-            (first = entryNext.call(entryIterator)).done ||
-            (second = entryNext.call(entryIterator)).done ||
-            !entryNext.call(entryIterator).done
-          ) throw TypeError('Expected sequence with length 2');
-          entries.push({ key: first.value + '', value: second.value + '' });
-        }
-      } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });
-    } else {
-      parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');
-    }
-  }
-};
-
-var URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;
-
-redefineAll(URLSearchParamsPrototype, {
-  // `URLSearchParams.prototype.appent` method
-  // https://url.spec.whatwg.org/#dom-urlsearchparams-append
-  append: function append(name, value) {
-    validateArgumentsLength(arguments.length, 2);
-    var state = getInternalParamsState(this);
-    state.entries.push({ key: name + '', value: value + '' });
-    state.updateURL();
-  },
-  // `URLSearchParams.prototype.delete` method
-  // https://url.spec.whatwg.org/#dom-urlsearchparams-delete
-  'delete': function (name) {
-    validateArgumentsLength(arguments.length, 1);
-    var state = getInternalParamsState(this);
-    var entries = state.entries;
-    var key = name + '';
-    var index = 0;
-    while (index < entries.length) {
-      if (entries[index].key === key) entries.splice(index, 1);
-      else index++;
-    }
-    state.updateURL();
-  },
-  // `URLSearchParams.prototype.get` method
-  // https://url.spec.whatwg.org/#dom-urlsearchparams-get
-  get: function get(name) {
-    validateArgumentsLength(arguments.length, 1);
-    var entries = getInternalParamsState(this).entries;
-    var key = name + '';
-    var index = 0;
-    for (; index < entries.length; index++) {
-      if (entries[index].key === key) return entries[index].value;
-    }
-    return null;
-  },
-  // `URLSearchParams.prototype.getAll` method
-  // https://url.spec.whatwg.org/#dom-urlsearchparams-getall
-  getAll: function getAll(name) {
-    validateArgumentsLength(arguments.length, 1);
-    var entries = getInternalParamsState(this).entries;
-    var key = name + '';
-    var result = [];
-    var index = 0;
-    for (; index < entries.length; index++) {
-      if (entries[index].key === key) result.push(entries[index].value);
-    }
-    return result;
-  },
-  // `URLSearchParams.prototype.has` method
-  // https://url.spec.whatwg.org/#dom-urlsearchparams-has
-  has: function has(name) {
-    validateArgumentsLength(arguments.length, 1);
-    var entries = getInternalParamsState(this).entries;
-    var key = name + '';
-    var index = 0;
-    while (index < entries.length) {
-      if (entries[index++].key === key) return true;
-    }
-    return false;
-  },
-  // `URLSearchParams.prototype.set` method
-  // https://url.spec.whatwg.org/#dom-urlsearchparams-set
-  set: function set(name, value) {
-    validateArgumentsLength(arguments.length, 1);
-    var state = getInternalParamsState(this);
-    var entries = state.entries;
-    var found = false;
-    var key = name + '';
-    var val = value + '';
-    var index = 0;
-    var entry;
-    for (; index < entries.length; index++) {
-      entry = entries[index];
-      if (entry.key === key) {
-        if (found) entries.splice(index--, 1);
-        else {
-          found = true;
-          entry.value = val;
-        }
-      }
-    }
-    if (!found) entries.push({ key: key, value: val });
-    state.updateURL();
-  },
-  // `URLSearchParams.prototype.sort` method
-  // https://url.spec.whatwg.org/#dom-urlsearchparams-sort
-  sort: function sort() {
-    var state = getInternalParamsState(this);
-    var entries = state.entries;
-    // Array#sort is not stable in some engines
-    var slice = entries.slice();
-    var entry, entriesIndex, sliceIndex;
-    entries.length = 0;
-    for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {
-      entry = slice[sliceIndex];
-      for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {
-        if (entries[entriesIndex].key > entry.key) {
-          entries.splice(entriesIndex, 0, entry);
-          break;
-        }
-      }
-      if (entriesIndex === sliceIndex) entries.push(entry);
-    }
-    state.updateURL();
-  },
-  // `URLSearchParams.prototype.forEach` method
-  forEach: function forEach(callback /* , thisArg */) {
-    var entries = getInternalParamsState(this).entries;
-    var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);
-    var index = 0;
-    var entry;
-    while (index < entries.length) {
-      entry = entries[index++];
-      boundFunction(entry.value, entry.key, this);
-    }
-  },
-  // `URLSearchParams.prototype.keys` method
-  keys: function keys() {
-    return new URLSearchParamsIterator(this, 'keys');
-  },
-  // `URLSearchParams.prototype.values` method
-  values: function values() {
-    return new URLSearchParamsIterator(this, 'values');
-  },
-  // `URLSearchParams.prototype.entries` method
-  entries: function entries() {
-    return new URLSearchParamsIterator(this, 'entries');
-  }
-}, { enumerable: true });
-
-// `URLSearchParams.prototype[@@iterator]` method
-redefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);
-
-// `URLSearchParams.prototype.toString` method
-// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior
-redefine(URLSearchParamsPrototype, 'toString', function toString() {
-  var entries = getInternalParamsState(this).entries;
-  var result = [];
-  var index = 0;
-  var entry;
-  while (index < entries.length) {
-    entry = entries[index++];
-    result.push(serialize(entry.key) + '=' + serialize(entry.value));
-  } return result.join('&');
-}, { enumerable: true });
-
-setToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);
-
-$({ global: true, forced: !USE_NATIVE_URL }, {
-  URLSearchParams: URLSearchParamsConstructor
-});
-
-// Wrap `fetch` for correct work with polyfilled `URLSearchParams`
-// https://github.com/zloirock/core-js/issues/674
-if (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {
-  $({ global: true, enumerable: true, forced: true }, {
-    fetch: function fetch(input /* , init */) {
-      var args = [input];
-      var init, body, headers;
-      if (arguments.length > 1) {
-        init = arguments[1];
-        if (isObject(init)) {
-          body = init.body;
-          if (classof(body) === URL_SEARCH_PARAMS) {
-            headers = init.headers ? new Headers(init.headers) : new Headers();
-            if (!headers.has('content-type')) {
-              headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
-            }
-            init = create(init, {
-              body: createPropertyDescriptor(0, String(body)),
-              headers: createPropertyDescriptor(0, headers)
-            });
-          }
-        }
-        args.push(init);
-      } return $fetch.apply(this, args);
-    }
-  });
-}
-
-module.exports = {
-  URLSearchParams: URLSearchParamsConstructor,
-  getState: getInternalParamsState
-};
diff --git a/node_modules/core-js-pure/modules/web.url.js b/node_modules/core-js-pure/modules/web.url.js
deleted file mode 100644
index 4e4df4b..0000000
--- a/node_modules/core-js-pure/modules/web.url.js
+++ /dev/null
@@ -1,1007 +0,0 @@
-'use strict';
-// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
-require('../modules/es.string.iterator');
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var USE_NATIVE_URL = require('../internals/native-url');
-var global = require('../internals/global');
-var defineProperties = require('../internals/object-define-properties');
-var redefine = require('../internals/redefine');
-var anInstance = require('../internals/an-instance');
-var has = require('../internals/has');
-var assign = require('../internals/object-assign');
-var arrayFrom = require('../internals/array-from');
-var codeAt = require('../internals/string-multibyte').codeAt;
-var toASCII = require('../internals/string-punycode-to-ascii');
-var setToStringTag = require('../internals/set-to-string-tag');
-var URLSearchParamsModule = require('../modules/web.url-search-params');
-var InternalStateModule = require('../internals/internal-state');
-
-var NativeURL = global.URL;
-var URLSearchParams = URLSearchParamsModule.URLSearchParams;
-var getInternalSearchParamsState = URLSearchParamsModule.getState;
-var setInternalState = InternalStateModule.set;
-var getInternalURLState = InternalStateModule.getterFor('URL');
-var floor = Math.floor;
-var pow = Math.pow;
-
-var INVALID_AUTHORITY = 'Invalid authority';
-var INVALID_SCHEME = 'Invalid scheme';
-var INVALID_HOST = 'Invalid host';
-var INVALID_PORT = 'Invalid port';
-
-var ALPHA = /[A-Za-z]/;
-var ALPHANUMERIC = /[\d+\-.A-Za-z]/;
-var DIGIT = /\d/;
-var HEX_START = /^(0x|0X)/;
-var OCT = /^[0-7]+$/;
-var DEC = /^\d+$/;
-var HEX = /^[\dA-Fa-f]+$/;
-// eslint-disable-next-line no-control-regex
-var FORBIDDEN_HOST_CODE_POINT = /[\u0000\u0009\u000A\u000D #%/:?@[\\]]/;
-// eslint-disable-next-line no-control-regex
-var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\u0000\u0009\u000A\u000D #/:?@[\\]]/;
-// eslint-disable-next-line no-control-regex
-var LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g;
-// eslint-disable-next-line no-control-regex
-var TAB_AND_NEW_LINE = /[\u0009\u000A\u000D]/g;
-var EOF;
-
-var parseHost = function (url, input) {
-  var result, codePoints, index;
-  if (input.charAt(0) == '[') {
-    if (input.charAt(input.length - 1) != ']') return INVALID_HOST;
-    result = parseIPv6(input.slice(1, -1));
-    if (!result) return INVALID_HOST;
-    url.host = result;
-  // opaque host
-  } else if (!isSpecial(url)) {
-    if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;
-    result = '';
-    codePoints = arrayFrom(input);
-    for (index = 0; index < codePoints.length; index++) {
-      result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);
-    }
-    url.host = result;
-  } else {
-    input = toASCII(input);
-    if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;
-    result = parseIPv4(input);
-    if (result === null) return INVALID_HOST;
-    url.host = result;
-  }
-};
-
-var parseIPv4 = function (input) {
-  var parts = input.split('.');
-  var partsLength, numbers, index, part, radix, number, ipv4;
-  if (parts.length && parts[parts.length - 1] == '') {
-    parts.pop();
-  }
-  partsLength = parts.length;
-  if (partsLength > 4) return input;
-  numbers = [];
-  for (index = 0; index < partsLength; index++) {
-    part = parts[index];
-    if (part == '') return input;
-    radix = 10;
-    if (part.length > 1 && part.charAt(0) == '0') {
-      radix = HEX_START.test(part) ? 16 : 8;
-      part = part.slice(radix == 8 ? 1 : 2);
-    }
-    if (part === '') {
-      number = 0;
-    } else {
-      if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;
-      number = parseInt(part, radix);
-    }
-    numbers.push(number);
-  }
-  for (index = 0; index < partsLength; index++) {
-    number = numbers[index];
-    if (index == partsLength - 1) {
-      if (number >= pow(256, 5 - partsLength)) return null;
-    } else if (number > 255) return null;
-  }
-  ipv4 = numbers.pop();
-  for (index = 0; index < numbers.length; index++) {
-    ipv4 += numbers[index] * pow(256, 3 - index);
-  }
-  return ipv4;
-};
-
-// eslint-disable-next-line max-statements
-var parseIPv6 = function (input) {
-  var address = [0, 0, 0, 0, 0, 0, 0, 0];
-  var pieceIndex = 0;
-  var compress = null;
-  var pointer = 0;
-  var value, length, numbersSeen, ipv4Piece, number, swaps, swap;
-
-  var char = function () {
-    return input.charAt(pointer);
-  };
-
-  if (char() == ':') {
-    if (input.charAt(1) != ':') return;
-    pointer += 2;
-    pieceIndex++;
-    compress = pieceIndex;
-  }
-  while (char()) {
-    if (pieceIndex == 8) return;
-    if (char() == ':') {
-      if (compress !== null) return;
-      pointer++;
-      pieceIndex++;
-      compress = pieceIndex;
-      continue;
-    }
-    value = length = 0;
-    while (length < 4 && HEX.test(char())) {
-      value = value * 16 + parseInt(char(), 16);
-      pointer++;
-      length++;
-    }
-    if (char() == '.') {
-      if (length == 0) return;
-      pointer -= length;
-      if (pieceIndex > 6) return;
-      numbersSeen = 0;
-      while (char()) {
-        ipv4Piece = null;
-        if (numbersSeen > 0) {
-          if (char() == '.' && numbersSeen < 4) pointer++;
-          else return;
-        }
-        if (!DIGIT.test(char())) return;
-        while (DIGIT.test(char())) {
-          number = parseInt(char(), 10);
-          if (ipv4Piece === null) ipv4Piece = number;
-          else if (ipv4Piece == 0) return;
-          else ipv4Piece = ipv4Piece * 10 + number;
-          if (ipv4Piece > 255) return;
-          pointer++;
-        }
-        address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;
-        numbersSeen++;
-        if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;
-      }
-      if (numbersSeen != 4) return;
-      break;
-    } else if (char() == ':') {
-      pointer++;
-      if (!char()) return;
-    } else if (char()) return;
-    address[pieceIndex++] = value;
-  }
-  if (compress !== null) {
-    swaps = pieceIndex - compress;
-    pieceIndex = 7;
-    while (pieceIndex != 0 && swaps > 0) {
-      swap = address[pieceIndex];
-      address[pieceIndex--] = address[compress + swaps - 1];
-      address[compress + --swaps] = swap;
-    }
-  } else if (pieceIndex != 8) return;
-  return address;
-};
-
-var findLongestZeroSequence = function (ipv6) {
-  var maxIndex = null;
-  var maxLength = 1;
-  var currStart = null;
-  var currLength = 0;
-  var index = 0;
-  for (; index < 8; index++) {
-    if (ipv6[index] !== 0) {
-      if (currLength > maxLength) {
-        maxIndex = currStart;
-        maxLength = currLength;
-      }
-      currStart = null;
-      currLength = 0;
-    } else {
-      if (currStart === null) currStart = index;
-      ++currLength;
-    }
-  }
-  if (currLength > maxLength) {
-    maxIndex = currStart;
-    maxLength = currLength;
-  }
-  return maxIndex;
-};
-
-var serializeHost = function (host) {
-  var result, index, compress, ignore0;
-  // ipv4
-  if (typeof host == 'number') {
-    result = [];
-    for (index = 0; index < 4; index++) {
-      result.unshift(host % 256);
-      host = floor(host / 256);
-    } return result.join('.');
-  // ipv6
-  } else if (typeof host == 'object') {
-    result = '';
-    compress = findLongestZeroSequence(host);
-    for (index = 0; index < 8; index++) {
-      if (ignore0 && host[index] === 0) continue;
-      if (ignore0) ignore0 = false;
-      if (compress === index) {
-        result += index ? ':' : '::';
-        ignore0 = true;
-      } else {
-        result += host[index].toString(16);
-        if (index < 7) result += ':';
-      }
-    }
-    return '[' + result + ']';
-  } return host;
-};
-
-var C0ControlPercentEncodeSet = {};
-var fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {
-  ' ': 1, '"': 1, '<': 1, '>': 1, '`': 1
-});
-var pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {
-  '#': 1, '?': 1, '{': 1, '}': 1
-});
-var userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {
-  '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\': 1, ']': 1, '^': 1, '|': 1
-});
-
-var percentEncode = function (char, set) {
-  var code = codeAt(char, 0);
-  return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);
-};
-
-var specialSchemes = {
-  ftp: 21,
-  file: null,
-  http: 80,
-  https: 443,
-  ws: 80,
-  wss: 443
-};
-
-var isSpecial = function (url) {
-  return has(specialSchemes, url.scheme);
-};
-
-var includesCredentials = function (url) {
-  return url.username != '' || url.password != '';
-};
-
-var cannotHaveUsernamePasswordPort = function (url) {
-  return !url.host || url.cannotBeABaseURL || url.scheme == 'file';
-};
-
-var isWindowsDriveLetter = function (string, normalized) {
-  var second;
-  return string.length == 2 && ALPHA.test(string.charAt(0))
-    && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));
-};
-
-var startsWithWindowsDriveLetter = function (string) {
-  var third;
-  return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (
-    string.length == 2 ||
-    ((third = string.charAt(2)) === '/' || third === '\\' || third === '?' || third === '#')
-  );
-};
-
-var shortenURLsPath = function (url) {
-  var path = url.path;
-  var pathSize = path.length;
-  if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {
-    path.pop();
-  }
-};
-
-var isSingleDot = function (segment) {
-  return segment === '.' || segment.toLowerCase() === '%2e';
-};
-
-var isDoubleDot = function (segment) {
-  segment = segment.toLowerCase();
-  return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';
-};
-
-// States:
-var SCHEME_START = {};
-var SCHEME = {};
-var NO_SCHEME = {};
-var SPECIAL_RELATIVE_OR_AUTHORITY = {};
-var PATH_OR_AUTHORITY = {};
-var RELATIVE = {};
-var RELATIVE_SLASH = {};
-var SPECIAL_AUTHORITY_SLASHES = {};
-var SPECIAL_AUTHORITY_IGNORE_SLASHES = {};
-var AUTHORITY = {};
-var HOST = {};
-var HOSTNAME = {};
-var PORT = {};
-var FILE = {};
-var FILE_SLASH = {};
-var FILE_HOST = {};
-var PATH_START = {};
-var PATH = {};
-var CANNOT_BE_A_BASE_URL_PATH = {};
-var QUERY = {};
-var FRAGMENT = {};
-
-// eslint-disable-next-line max-statements
-var parseURL = function (url, input, stateOverride, base) {
-  var state = stateOverride || SCHEME_START;
-  var pointer = 0;
-  var buffer = '';
-  var seenAt = false;
-  var seenBracket = false;
-  var seenPasswordToken = false;
-  var codePoints, char, bufferCodePoints, failure;
-
-  if (!stateOverride) {
-    url.scheme = '';
-    url.username = '';
-    url.password = '';
-    url.host = null;
-    url.port = null;
-    url.path = [];
-    url.query = null;
-    url.fragment = null;
-    url.cannotBeABaseURL = false;
-    input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');
-  }
-
-  input = input.replace(TAB_AND_NEW_LINE, '');
-
-  codePoints = arrayFrom(input);
-
-  while (pointer <= codePoints.length) {
-    char = codePoints[pointer];
-    switch (state) {
-      case SCHEME_START:
-        if (char && ALPHA.test(char)) {
-          buffer += char.toLowerCase();
-          state = SCHEME;
-        } else if (!stateOverride) {
-          state = NO_SCHEME;
-          continue;
-        } else return INVALID_SCHEME;
-        break;
-
-      case SCHEME:
-        if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {
-          buffer += char.toLowerCase();
-        } else if (char == ':') {
-          if (stateOverride && (
-            (isSpecial(url) != has(specialSchemes, buffer)) ||
-            (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||
-            (url.scheme == 'file' && !url.host)
-          )) return;
-          url.scheme = buffer;
-          if (stateOverride) {
-            if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;
-            return;
-          }
-          buffer = '';
-          if (url.scheme == 'file') {
-            state = FILE;
-          } else if (isSpecial(url) && base && base.scheme == url.scheme) {
-            state = SPECIAL_RELATIVE_OR_AUTHORITY;
-          } else if (isSpecial(url)) {
-            state = SPECIAL_AUTHORITY_SLASHES;
-          } else if (codePoints[pointer + 1] == '/') {
-            state = PATH_OR_AUTHORITY;
-            pointer++;
-          } else {
-            url.cannotBeABaseURL = true;
-            url.path.push('');
-            state = CANNOT_BE_A_BASE_URL_PATH;
-          }
-        } else if (!stateOverride) {
-          buffer = '';
-          state = NO_SCHEME;
-          pointer = 0;
-          continue;
-        } else return INVALID_SCHEME;
-        break;
-
-      case NO_SCHEME:
-        if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;
-        if (base.cannotBeABaseURL && char == '#') {
-          url.scheme = base.scheme;
-          url.path = base.path.slice();
-          url.query = base.query;
-          url.fragment = '';
-          url.cannotBeABaseURL = true;
-          state = FRAGMENT;
-          break;
-        }
-        state = base.scheme == 'file' ? FILE : RELATIVE;
-        continue;
-
-      case SPECIAL_RELATIVE_OR_AUTHORITY:
-        if (char == '/' && codePoints[pointer + 1] == '/') {
-          state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
-          pointer++;
-        } else {
-          state = RELATIVE;
-          continue;
-        } break;
-
-      case PATH_OR_AUTHORITY:
-        if (char == '/') {
-          state = AUTHORITY;
-          break;
-        } else {
-          state = PATH;
-          continue;
-        }
-
-      case RELATIVE:
-        url.scheme = base.scheme;
-        if (char == EOF) {
-          url.username = base.username;
-          url.password = base.password;
-          url.host = base.host;
-          url.port = base.port;
-          url.path = base.path.slice();
-          url.query = base.query;
-        } else if (char == '/' || (char == '\\' && isSpecial(url))) {
-          state = RELATIVE_SLASH;
-        } else if (char == '?') {
-          url.username = base.username;
-          url.password = base.password;
-          url.host = base.host;
-          url.port = base.port;
-          url.path = base.path.slice();
-          url.query = '';
-          state = QUERY;
-        } else if (char == '#') {
-          url.username = base.username;
-          url.password = base.password;
-          url.host = base.host;
-          url.port = base.port;
-          url.path = base.path.slice();
-          url.query = base.query;
-          url.fragment = '';
-          state = FRAGMENT;
-        } else {
-          url.username = base.username;
-          url.password = base.password;
-          url.host = base.host;
-          url.port = base.port;
-          url.path = base.path.slice();
-          url.path.pop();
-          state = PATH;
-          continue;
-        } break;
-
-      case RELATIVE_SLASH:
-        if (isSpecial(url) && (char == '/' || char == '\\')) {
-          state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
-        } else if (char == '/') {
-          state = AUTHORITY;
-        } else {
-          url.username = base.username;
-          url.password = base.password;
-          url.host = base.host;
-          url.port = base.port;
-          state = PATH;
-          continue;
-        } break;
-
-      case SPECIAL_AUTHORITY_SLASHES:
-        state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
-        if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;
-        pointer++;
-        break;
-
-      case SPECIAL_AUTHORITY_IGNORE_SLASHES:
-        if (char != '/' && char != '\\') {
-          state = AUTHORITY;
-          continue;
-        } break;
-
-      case AUTHORITY:
-        if (char == '@') {
-          if (seenAt) buffer = '%40' + buffer;
-          seenAt = true;
-          bufferCodePoints = arrayFrom(buffer);
-          for (var i = 0; i < bufferCodePoints.length; i++) {
-            var codePoint = bufferCodePoints[i];
-            if (codePoint == ':' && !seenPasswordToken) {
-              seenPasswordToken = true;
-              continue;
-            }
-            var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);
-            if (seenPasswordToken) url.password += encodedCodePoints;
-            else url.username += encodedCodePoints;
-          }
-          buffer = '';
-        } else if (
-          char == EOF || char == '/' || char == '?' || char == '#' ||
-          (char == '\\' && isSpecial(url))
-        ) {
-          if (seenAt && buffer == '') return INVALID_AUTHORITY;
-          pointer -= arrayFrom(buffer).length + 1;
-          buffer = '';
-          state = HOST;
-        } else buffer += char;
-        break;
-
-      case HOST:
-      case HOSTNAME:
-        if (stateOverride && url.scheme == 'file') {
-          state = FILE_HOST;
-          continue;
-        } else if (char == ':' && !seenBracket) {
-          if (buffer == '') return INVALID_HOST;
-          failure = parseHost(url, buffer);
-          if (failure) return failure;
-          buffer = '';
-          state = PORT;
-          if (stateOverride == HOSTNAME) return;
-        } else if (
-          char == EOF || char == '/' || char == '?' || char == '#' ||
-          (char == '\\' && isSpecial(url))
-        ) {
-          if (isSpecial(url) && buffer == '') return INVALID_HOST;
-          if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;
-          failure = parseHost(url, buffer);
-          if (failure) return failure;
-          buffer = '';
-          state = PATH_START;
-          if (stateOverride) return;
-          continue;
-        } else {
-          if (char == '[') seenBracket = true;
-          else if (char == ']') seenBracket = false;
-          buffer += char;
-        } break;
-
-      case PORT:
-        if (DIGIT.test(char)) {
-          buffer += char;
-        } else if (
-          char == EOF || char == '/' || char == '?' || char == '#' ||
-          (char == '\\' && isSpecial(url)) ||
-          stateOverride
-        ) {
-          if (buffer != '') {
-            var port = parseInt(buffer, 10);
-            if (port > 0xFFFF) return INVALID_PORT;
-            url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;
-            buffer = '';
-          }
-          if (stateOverride) return;
-          state = PATH_START;
-          continue;
-        } else return INVALID_PORT;
-        break;
-
-      case FILE:
-        url.scheme = 'file';
-        if (char == '/' || char == '\\') state = FILE_SLASH;
-        else if (base && base.scheme == 'file') {
-          if (char == EOF) {
-            url.host = base.host;
-            url.path = base.path.slice();
-            url.query = base.query;
-          } else if (char == '?') {
-            url.host = base.host;
-            url.path = base.path.slice();
-            url.query = '';
-            state = QUERY;
-          } else if (char == '#') {
-            url.host = base.host;
-            url.path = base.path.slice();
-            url.query = base.query;
-            url.fragment = '';
-            state = FRAGMENT;
-          } else {
-            if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {
-              url.host = base.host;
-              url.path = base.path.slice();
-              shortenURLsPath(url);
-            }
-            state = PATH;
-            continue;
-          }
-        } else {
-          state = PATH;
-          continue;
-        } break;
-
-      case FILE_SLASH:
-        if (char == '/' || char == '\\') {
-          state = FILE_HOST;
-          break;
-        }
-        if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {
-          if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);
-          else url.host = base.host;
-        }
-        state = PATH;
-        continue;
-
-      case FILE_HOST:
-        if (char == EOF || char == '/' || char == '\\' || char == '?' || char == '#') {
-          if (!stateOverride && isWindowsDriveLetter(buffer)) {
-            state = PATH;
-          } else if (buffer == '') {
-            url.host = '';
-            if (stateOverride) return;
-            state = PATH_START;
-          } else {
-            failure = parseHost(url, buffer);
-            if (failure) return failure;
-            if (url.host == 'localhost') url.host = '';
-            if (stateOverride) return;
-            buffer = '';
-            state = PATH_START;
-          } continue;
-        } else buffer += char;
-        break;
-
-      case PATH_START:
-        if (isSpecial(url)) {
-          state = PATH;
-          if (char != '/' && char != '\\') continue;
-        } else if (!stateOverride && char == '?') {
-          url.query = '';
-          state = QUERY;
-        } else if (!stateOverride && char == '#') {
-          url.fragment = '';
-          state = FRAGMENT;
-        } else if (char != EOF) {
-          state = PATH;
-          if (char != '/') continue;
-        } break;
-
-      case PATH:
-        if (
-          char == EOF || char == '/' ||
-          (char == '\\' && isSpecial(url)) ||
-          (!stateOverride && (char == '?' || char == '#'))
-        ) {
-          if (isDoubleDot(buffer)) {
-            shortenURLsPath(url);
-            if (char != '/' && !(char == '\\' && isSpecial(url))) {
-              url.path.push('');
-            }
-          } else if (isSingleDot(buffer)) {
-            if (char != '/' && !(char == '\\' && isSpecial(url))) {
-              url.path.push('');
-            }
-          } else {
-            if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {
-              if (url.host) url.host = '';
-              buffer = buffer.charAt(0) + ':'; // normalize windows drive letter
-            }
-            url.path.push(buffer);
-          }
-          buffer = '';
-          if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {
-            while (url.path.length > 1 && url.path[0] === '') {
-              url.path.shift();
-            }
-          }
-          if (char == '?') {
-            url.query = '';
-            state = QUERY;
-          } else if (char == '#') {
-            url.fragment = '';
-            state = FRAGMENT;
-          }
-        } else {
-          buffer += percentEncode(char, pathPercentEncodeSet);
-        } break;
-
-      case CANNOT_BE_A_BASE_URL_PATH:
-        if (char == '?') {
-          url.query = '';
-          state = QUERY;
-        } else if (char == '#') {
-          url.fragment = '';
-          state = FRAGMENT;
-        } else if (char != EOF) {
-          url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);
-        } break;
-
-      case QUERY:
-        if (!stateOverride && char == '#') {
-          url.fragment = '';
-          state = FRAGMENT;
-        } else if (char != EOF) {
-          if (char == "'" && isSpecial(url)) url.query += '%27';
-          else if (char == '#') url.query += '%23';
-          else url.query += percentEncode(char, C0ControlPercentEncodeSet);
-        } break;
-
-      case FRAGMENT:
-        if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);
-        break;
-    }
-
-    pointer++;
-  }
-};
-
-// `URL` constructor
-// https://url.spec.whatwg.org/#url-class
-var URLConstructor = function URL(url /* , base */) {
-  var that = anInstance(this, URLConstructor, 'URL');
-  var base = arguments.length > 1 ? arguments[1] : undefined;
-  var urlString = String(url);
-  var state = setInternalState(that, { type: 'URL' });
-  var baseState, failure;
-  if (base !== undefined) {
-    if (base instanceof URLConstructor) baseState = getInternalURLState(base);
-    else {
-      failure = parseURL(baseState = {}, String(base));
-      if (failure) throw TypeError(failure);
-    }
-  }
-  failure = parseURL(state, urlString, null, baseState);
-  if (failure) throw TypeError(failure);
-  var searchParams = state.searchParams = new URLSearchParams();
-  var searchParamsState = getInternalSearchParamsState(searchParams);
-  searchParamsState.updateSearchParams(state.query);
-  searchParamsState.updateURL = function () {
-    state.query = String(searchParams) || null;
-  };
-  if (!DESCRIPTORS) {
-    that.href = serializeURL.call(that);
-    that.origin = getOrigin.call(that);
-    that.protocol = getProtocol.call(that);
-    that.username = getUsername.call(that);
-    that.password = getPassword.call(that);
-    that.host = getHost.call(that);
-    that.hostname = getHostname.call(that);
-    that.port = getPort.call(that);
-    that.pathname = getPathname.call(that);
-    that.search = getSearch.call(that);
-    that.searchParams = getSearchParams.call(that);
-    that.hash = getHash.call(that);
-  }
-};
-
-var URLPrototype = URLConstructor.prototype;
-
-var serializeURL = function () {
-  var url = getInternalURLState(this);
-  var scheme = url.scheme;
-  var username = url.username;
-  var password = url.password;
-  var host = url.host;
-  var port = url.port;
-  var path = url.path;
-  var query = url.query;
-  var fragment = url.fragment;
-  var output = scheme + ':';
-  if (host !== null) {
-    output += '//';
-    if (includesCredentials(url)) {
-      output += username + (password ? ':' + password : '') + '@';
-    }
-    output += serializeHost(host);
-    if (port !== null) output += ':' + port;
-  } else if (scheme == 'file') output += '//';
-  output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';
-  if (query !== null) output += '?' + query;
-  if (fragment !== null) output += '#' + fragment;
-  return output;
-};
-
-var getOrigin = function () {
-  var url = getInternalURLState(this);
-  var scheme = url.scheme;
-  var port = url.port;
-  if (scheme == 'blob') try {
-    return new URL(scheme.path[0]).origin;
-  } catch (error) {
-    return 'null';
-  }
-  if (scheme == 'file' || !isSpecial(url)) return 'null';
-  return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');
-};
-
-var getProtocol = function () {
-  return getInternalURLState(this).scheme + ':';
-};
-
-var getUsername = function () {
-  return getInternalURLState(this).username;
-};
-
-var getPassword = function () {
-  return getInternalURLState(this).password;
-};
-
-var getHost = function () {
-  var url = getInternalURLState(this);
-  var host = url.host;
-  var port = url.port;
-  return host === null ? ''
-    : port === null ? serializeHost(host)
-    : serializeHost(host) + ':' + port;
-};
-
-var getHostname = function () {
-  var host = getInternalURLState(this).host;
-  return host === null ? '' : serializeHost(host);
-};
-
-var getPort = function () {
-  var port = getInternalURLState(this).port;
-  return port === null ? '' : String(port);
-};
-
-var getPathname = function () {
-  var url = getInternalURLState(this);
-  var path = url.path;
-  return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';
-};
-
-var getSearch = function () {
-  var query = getInternalURLState(this).query;
-  return query ? '?' + query : '';
-};
-
-var getSearchParams = function () {
-  return getInternalURLState(this).searchParams;
-};
-
-var getHash = function () {
-  var fragment = getInternalURLState(this).fragment;
-  return fragment ? '#' + fragment : '';
-};
-
-var accessorDescriptor = function (getter, setter) {
-  return { get: getter, set: setter, configurable: true, enumerable: true };
-};
-
-if (DESCRIPTORS) {
-  defineProperties(URLPrototype, {
-    // `URL.prototype.href` accessors pair
-    // https://url.spec.whatwg.org/#dom-url-href
-    href: accessorDescriptor(serializeURL, function (href) {
-      var url = getInternalURLState(this);
-      var urlString = String(href);
-      var failure = parseURL(url, urlString);
-      if (failure) throw TypeError(failure);
-      getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);
-    }),
-    // `URL.prototype.origin` getter
-    // https://url.spec.whatwg.org/#dom-url-origin
-    origin: accessorDescriptor(getOrigin),
-    // `URL.prototype.protocol` accessors pair
-    // https://url.spec.whatwg.org/#dom-url-protocol
-    protocol: accessorDescriptor(getProtocol, function (protocol) {
-      var url = getInternalURLState(this);
-      parseURL(url, String(protocol) + ':', SCHEME_START);
-    }),
-    // `URL.prototype.username` accessors pair
-    // https://url.spec.whatwg.org/#dom-url-username
-    username: accessorDescriptor(getUsername, function (username) {
-      var url = getInternalURLState(this);
-      var codePoints = arrayFrom(String(username));
-      if (cannotHaveUsernamePasswordPort(url)) return;
-      url.username = '';
-      for (var i = 0; i < codePoints.length; i++) {
-        url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);
-      }
-    }),
-    // `URL.prototype.password` accessors pair
-    // https://url.spec.whatwg.org/#dom-url-password
-    password: accessorDescriptor(getPassword, function (password) {
-      var url = getInternalURLState(this);
-      var codePoints = arrayFrom(String(password));
-      if (cannotHaveUsernamePasswordPort(url)) return;
-      url.password = '';
-      for (var i = 0; i < codePoints.length; i++) {
-        url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);
-      }
-    }),
-    // `URL.prototype.host` accessors pair
-    // https://url.spec.whatwg.org/#dom-url-host
-    host: accessorDescriptor(getHost, function (host) {
-      var url = getInternalURLState(this);
-      if (url.cannotBeABaseURL) return;
-      parseURL(url, String(host), HOST);
-    }),
-    // `URL.prototype.hostname` accessors pair
-    // https://url.spec.whatwg.org/#dom-url-hostname
-    hostname: accessorDescriptor(getHostname, function (hostname) {
-      var url = getInternalURLState(this);
-      if (url.cannotBeABaseURL) return;
-      parseURL(url, String(hostname), HOSTNAME);
-    }),
-    // `URL.prototype.port` accessors pair
-    // https://url.spec.whatwg.org/#dom-url-port
-    port: accessorDescriptor(getPort, function (port) {
-      var url = getInternalURLState(this);
-      if (cannotHaveUsernamePasswordPort(url)) return;
-      port = String(port);
-      if (port == '') url.port = null;
-      else parseURL(url, port, PORT);
-    }),
-    // `URL.prototype.pathname` accessors pair
-    // https://url.spec.whatwg.org/#dom-url-pathname
-    pathname: accessorDescriptor(getPathname, function (pathname) {
-      var url = getInternalURLState(this);
-      if (url.cannotBeABaseURL) return;
-      url.path = [];
-      parseURL(url, pathname + '', PATH_START);
-    }),
-    // `URL.prototype.search` accessors pair
-    // https://url.spec.whatwg.org/#dom-url-search
-    search: accessorDescriptor(getSearch, function (search) {
-      var url = getInternalURLState(this);
-      search = String(search);
-      if (search == '') {
-        url.query = null;
-      } else {
-        if ('?' == search.charAt(0)) search = search.slice(1);
-        url.query = '';
-        parseURL(url, search, QUERY);
-      }
-      getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);
-    }),
-    // `URL.prototype.searchParams` getter
-    // https://url.spec.whatwg.org/#dom-url-searchparams
-    searchParams: accessorDescriptor(getSearchParams),
-    // `URL.prototype.hash` accessors pair
-    // https://url.spec.whatwg.org/#dom-url-hash
-    hash: accessorDescriptor(getHash, function (hash) {
-      var url = getInternalURLState(this);
-      hash = String(hash);
-      if (hash == '') {
-        url.fragment = null;
-        return;
-      }
-      if ('#' == hash.charAt(0)) hash = hash.slice(1);
-      url.fragment = '';
-      parseURL(url, hash, FRAGMENT);
-    })
-  });
-}
-
-// `URL.prototype.toJSON` method
-// https://url.spec.whatwg.org/#dom-url-tojson
-redefine(URLPrototype, 'toJSON', function toJSON() {
-  return serializeURL.call(this);
-}, { enumerable: true });
-
-// `URL.prototype.toString` method
-// https://url.spec.whatwg.org/#URL-stringification-behavior
-redefine(URLPrototype, 'toString', function toString() {
-  return serializeURL.call(this);
-}, { enumerable: true });
-
-if (NativeURL) {
-  var nativeCreateObjectURL = NativeURL.createObjectURL;
-  var nativeRevokeObjectURL = NativeURL.revokeObjectURL;
-  // `URL.createObjectURL` method
-  // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
-  // eslint-disable-next-line no-unused-vars
-  if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {
-    return nativeCreateObjectURL.apply(NativeURL, arguments);
-  });
-  // `URL.revokeObjectURL` method
-  // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL
-  // eslint-disable-next-line no-unused-vars
-  if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {
-    return nativeRevokeObjectURL.apply(NativeURL, arguments);
-  });
-}
-
-setToStringTag(URLConstructor, 'URL');
-
-$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {
-  URL: URLConstructor
-});
diff --git a/node_modules/core-js-pure/modules/web.url.to-json.js b/node_modules/core-js-pure/modules/web.url.to-json.js
deleted file mode 100644
index 8b1a393..0000000
--- a/node_modules/core-js-pure/modules/web.url.to-json.js
+++ /dev/null
@@ -1 +0,0 @@
-// empty
diff --git a/node_modules/core-js-pure/package.json b/node_modules/core-js-pure/package.json
deleted file mode 100644
index b93d00a..0000000
--- a/node_modules/core-js-pure/package.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
-  "name": "core-js-pure",
-  "description": "Standard library",
-  "version": "3.6.4",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/zloirock/core-js.git"
-  },
-  "main": "index.js",
-  "funding": {
-    "type": "opencollective",
-    "url": "https://opencollective.com/core-js"
-  },
-  "license": "MIT",
-  "keywords": [
-    "ES3",
-    "ES5",
-    "ES6",
-    "ES7",
-    "ES2015",
-    "ES2016",
-    "ES2017",
-    "ES2018",
-    "ES2019",
-    "ES2020",
-    "ECMAScript 3",
-    "ECMAScript 5",
-    "ECMAScript 6",
-    "ECMAScript 7",
-    "ECMAScript 2015",
-    "ECMAScript 2016",
-    "ECMAScript 2017",
-    "ECMAScript 2018",
-    "ECMAScript 2019",
-    "ECMAScript 2020",
-    "Harmony",
-    "Strawman",
-    "Map",
-    "Set",
-    "WeakMap",
-    "WeakSet",
-    "Promise",
-    "Observable",
-    "Symbol",
-    "TypedArray",
-    "URL",
-    "URLSearchParams",
-    "queueMicrotask",
-    "setImmediate",
-    "polyfill",
-    "ponyfill",
-    "shim"
-  ],
-  "scripts": {
-    "postinstall": "node -e \"try{require('./postinstall')}catch(e){}\""
-  }
-}
diff --git a/node_modules/core-js-pure/postinstall.js b/node_modules/core-js-pure/postinstall.js
deleted file mode 100644
index fcb8d3c..0000000
--- a/node_modules/core-js-pure/postinstall.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/* eslint-disable max-len */
-var fs = require('fs');
-var os = require('os');
-var path = require('path');
-var env = process.env;
-
-var ADBLOCK = is(env.ADBLOCK);
-var COLOR = is(env.npm_config_color);
-var DISABLE_OPENCOLLECTIVE = is(env.DISABLE_OPENCOLLECTIVE);
-var SILENT = ['silent', 'error', 'warn'].indexOf(env.npm_config_loglevel) !== -1;
-var MINUTE = 60 * 1000;
-
-// you could add a PR with an env variable for your CI detection
-var CI = [
-  'BUILD_NUMBER',
-  'CI',
-  'CONTINUOUS_INTEGRATION',
-  'RUN_ID'
-].some(function (it) { return is(env[it]); });
-
-var BANNER = '\u001B[96mThank you for using core-js (\u001B[94m https://github.com/zloirock/core-js \u001B[96m) for polyfilling JavaScript standard library!\u001B[0m\n\n' +
-             '\u001B[96mThe project needs your help! Please consider supporting of core-js on Open Collective or Patreon: \u001B[0m\n' +
-             '\u001B[96m>\u001B[94m https://opencollective.com/core-js \u001B[0m\n' +
-             '\u001B[96m>\u001B[94m https://www.patreon.com/zloirock \u001B[0m\n\n' +
-             '\u001B[96mAlso, the author of core-js (\u001B[94m https://github.com/zloirock \u001B[96m) is looking for a good job -)\u001B[0m\n';
-
-function is(it) {
-  return !!it && it !== '0' && it !== 'false';
-}
-
-function isBannerRequired() {
-  if (ADBLOCK || CI || DISABLE_OPENCOLLECTIVE || SILENT) return false;
-  var file = path.join(os.tmpdir(), 'core-js-banners');
-  var banners = [];
-  try {
-    var DELTA = Date.now() - fs.statSync(file).mtime;
-    if (DELTA >= 0 && DELTA < MINUTE * 3) {
-      banners = JSON.parse(fs.readFileSync(file, 'utf8'));
-      if (banners.indexOf(BANNER) !== -1) return false;
-    }
-  } catch (error) {
-    banners = [];
-  }
-  try {
-    banners.push(BANNER);
-    fs.writeFileSync(file, JSON.stringify(banners), 'utf8');
-  } catch (error) { /* empty */ }
-  return true;
-}
-
-function showBanner() {
-  // eslint-disable-next-line no-console,no-control-regex
-  console.log(COLOR ? BANNER : BANNER.replace(/\u001B\[\d+m/g, ''));
-}
-
-if (isBannerRequired()) showBanner();
diff --git a/node_modules/core-js-pure/proposals/array-is-template-object.js b/node_modules/core-js-pure/proposals/array-is-template-object.js
deleted file mode 100644
index 37388c4..0000000
--- a/node_modules/core-js-pure/proposals/array-is-template-object.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../modules/esnext.array.is-template-object');
diff --git a/node_modules/core-js-pure/proposals/array-last.js b/node_modules/core-js-pure/proposals/array-last.js
deleted file mode 100644
index c671031..0000000
--- a/node_modules/core-js-pure/proposals/array-last.js
+++ /dev/null
@@ -1,2 +0,0 @@
-require('../modules/esnext.array.last-index');
-require('../modules/esnext.array.last-item');
diff --git a/node_modules/core-js-pure/proposals/collection-methods.js b/node_modules/core-js-pure/proposals/collection-methods.js
deleted file mode 100644
index 3acb8c0..0000000
--- a/node_modules/core-js-pure/proposals/collection-methods.js
+++ /dev/null
@@ -1,27 +0,0 @@
-require('../modules/esnext.map.group-by');
-require('../modules/esnext.map.key-by');
-require('../modules/esnext.map.delete-all');
-require('../modules/esnext.map.every');
-require('../modules/esnext.map.filter');
-require('../modules/esnext.map.find');
-require('../modules/esnext.map.find-key');
-require('../modules/esnext.map.includes');
-require('../modules/esnext.map.key-of');
-require('../modules/esnext.map.map-keys');
-require('../modules/esnext.map.map-values');
-require('../modules/esnext.map.merge');
-require('../modules/esnext.map.reduce');
-require('../modules/esnext.map.some');
-require('../modules/esnext.map.update');
-require('../modules/esnext.set.add-all');
-require('../modules/esnext.set.delete-all');
-require('../modules/esnext.set.every');
-require('../modules/esnext.set.filter');
-require('../modules/esnext.set.find');
-require('../modules/esnext.set.join');
-require('../modules/esnext.set.map');
-require('../modules/esnext.set.reduce');
-require('../modules/esnext.set.some');
-require('../modules/esnext.weak-map.delete-all');
-require('../modules/esnext.weak-set.add-all');
-require('../modules/esnext.weak-set.delete-all');
diff --git a/node_modules/core-js-pure/proposals/collection-of-from.js b/node_modules/core-js-pure/proposals/collection-of-from.js
deleted file mode 100644
index ade3000..0000000
--- a/node_modules/core-js-pure/proposals/collection-of-from.js
+++ /dev/null
@@ -1,8 +0,0 @@
-require('../modules/esnext.map.from');
-require('../modules/esnext.map.of');
-require('../modules/esnext.set.from');
-require('../modules/esnext.set.of');
-require('../modules/esnext.weak-map.from');
-require('../modules/esnext.weak-map.of');
-require('../modules/esnext.weak-set.from');
-require('../modules/esnext.weak-set.of');
diff --git a/node_modules/core-js-pure/proposals/efficient-64-bit-arithmetic.js b/node_modules/core-js-pure/proposals/efficient-64-bit-arithmetic.js
deleted file mode 100644
index 71d40dc..0000000
--- a/node_modules/core-js-pure/proposals/efficient-64-bit-arithmetic.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/esnext.math.iaddh');
-require('../modules/esnext.math.isubh');
-require('../modules/esnext.math.imulh');
-require('../modules/esnext.math.umulh');
diff --git a/node_modules/core-js-pure/proposals/global-this.js b/node_modules/core-js-pure/proposals/global-this.js
deleted file mode 100644
index 4cb0f5c..0000000
--- a/node_modules/core-js-pure/proposals/global-this.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/esnext.global-this');
-var global = require('../internals/global');
-
-module.exports = global;
diff --git a/node_modules/core-js-pure/proposals/index.js b/node_modules/core-js-pure/proposals/index.js
deleted file mode 100644
index b87a749..0000000
--- a/node_modules/core-js-pure/proposals/index.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../stage');
diff --git a/node_modules/core-js-pure/proposals/iterator-helpers.js b/node_modules/core-js-pure/proposals/iterator-helpers.js
deleted file mode 100644
index 001a169..0000000
--- a/node_modules/core-js-pure/proposals/iterator-helpers.js
+++ /dev/null
@@ -1,28 +0,0 @@
-require('../modules/esnext.async-iterator.constructor');
-require('../modules/esnext.async-iterator.as-indexed-pairs');
-require('../modules/esnext.async-iterator.drop');
-require('../modules/esnext.async-iterator.every');
-require('../modules/esnext.async-iterator.filter');
-require('../modules/esnext.async-iterator.find');
-require('../modules/esnext.async-iterator.flat-map');
-require('../modules/esnext.async-iterator.for-each');
-require('../modules/esnext.async-iterator.from');
-require('../modules/esnext.async-iterator.map');
-require('../modules/esnext.async-iterator.reduce');
-require('../modules/esnext.async-iterator.some');
-require('../modules/esnext.async-iterator.take');
-require('../modules/esnext.async-iterator.to-array');
-require('../modules/esnext.iterator.constructor');
-require('../modules/esnext.iterator.as-indexed-pairs');
-require('../modules/esnext.iterator.drop');
-require('../modules/esnext.iterator.every');
-require('../modules/esnext.iterator.filter');
-require('../modules/esnext.iterator.find');
-require('../modules/esnext.iterator.flat-map');
-require('../modules/esnext.iterator.for-each');
-require('../modules/esnext.iterator.from');
-require('../modules/esnext.iterator.map');
-require('../modules/esnext.iterator.reduce');
-require('../modules/esnext.iterator.some');
-require('../modules/esnext.iterator.take');
-require('../modules/esnext.iterator.to-array');
diff --git a/node_modules/core-js-pure/proposals/keys-composition.js b/node_modules/core-js-pure/proposals/keys-composition.js
deleted file mode 100644
index 47f5e2e..0000000
--- a/node_modules/core-js-pure/proposals/keys-composition.js
+++ /dev/null
@@ -1,2 +0,0 @@
-require('../modules/esnext.composite-key');
-require('../modules/esnext.composite-symbol');
diff --git a/node_modules/core-js-pure/proposals/map-update-or-insert.js b/node_modules/core-js-pure/proposals/map-update-or-insert.js
deleted file mode 100644
index 2860301..0000000
--- a/node_modules/core-js-pure/proposals/map-update-or-insert.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// TODO: remove from `core-js@4`
-require('./map-upsert');
diff --git a/node_modules/core-js-pure/proposals/map-upsert.js b/node_modules/core-js-pure/proposals/map-upsert.js
deleted file mode 100644
index ee94275..0000000
--- a/node_modules/core-js-pure/proposals/map-upsert.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// https://github.com/thumbsupep/proposal-upsert
-// TODO: remove from `core-js@4`
-require('../modules/esnext.map.update-or-insert');
-require('../modules/esnext.map.upsert');
-require('../modules/esnext.weak-map.upsert');
diff --git a/node_modules/core-js-pure/proposals/math-extensions.js b/node_modules/core-js-pure/proposals/math-extensions.js
deleted file mode 100644
index 80d86af..0000000
--- a/node_modules/core-js-pure/proposals/math-extensions.js
+++ /dev/null
@@ -1,7 +0,0 @@
-require('../modules/esnext.math.clamp');
-require('../modules/esnext.math.deg-per-rad');
-require('../modules/esnext.math.degrees');
-require('../modules/esnext.math.fscale');
-require('../modules/esnext.math.rad-per-deg');
-require('../modules/esnext.math.radians');
-require('../modules/esnext.math.scale');
diff --git a/node_modules/core-js-pure/proposals/math-signbit.js b/node_modules/core-js-pure/proposals/math-signbit.js
deleted file mode 100644
index e0a51d1..0000000
--- a/node_modules/core-js-pure/proposals/math-signbit.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../modules/esnext.math.signbit');
diff --git a/node_modules/core-js-pure/proposals/number-from-string.js b/node_modules/core-js-pure/proposals/number-from-string.js
deleted file mode 100644
index 094d084..0000000
--- a/node_modules/core-js-pure/proposals/number-from-string.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../modules/esnext.number.from-string');
diff --git a/node_modules/core-js-pure/proposals/object-iteration.js b/node_modules/core-js-pure/proposals/object-iteration.js
deleted file mode 100644
index 0361515..0000000
--- a/node_modules/core-js-pure/proposals/object-iteration.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../modules/esnext.object.iterate-entries');
-require('../modules/esnext.object.iterate-keys');
-require('../modules/esnext.object.iterate-values');
diff --git a/node_modules/core-js-pure/proposals/observable.js b/node_modules/core-js-pure/proposals/observable.js
deleted file mode 100644
index cf59156..0000000
--- a/node_modules/core-js-pure/proposals/observable.js
+++ /dev/null
@@ -1,2 +0,0 @@
-require('../modules/esnext.observable');
-require('../modules/esnext.symbol.observable');
diff --git a/node_modules/core-js-pure/proposals/pattern-matching.js b/node_modules/core-js-pure/proposals/pattern-matching.js
deleted file mode 100644
index d5fce70..0000000
--- a/node_modules/core-js-pure/proposals/pattern-matching.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../modules/esnext.symbol.pattern-match');
diff --git a/node_modules/core-js-pure/proposals/promise-all-settled.js b/node_modules/core-js-pure/proposals/promise-all-settled.js
deleted file mode 100644
index ae35910..0000000
--- a/node_modules/core-js-pure/proposals/promise-all-settled.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// TODO: Remove from `core-js@4`
-require('../modules/esnext.promise.all-settled');
diff --git a/node_modules/core-js-pure/proposals/promise-any.js b/node_modules/core-js-pure/proposals/promise-any.js
deleted file mode 100644
index 9e14736..0000000
--- a/node_modules/core-js-pure/proposals/promise-any.js
+++ /dev/null
@@ -1,2 +0,0 @@
-require('../modules/esnext.aggregate-error');
-require('../modules/esnext.promise.any');
diff --git a/node_modules/core-js-pure/proposals/promise-try.js b/node_modules/core-js-pure/proposals/promise-try.js
deleted file mode 100644
index ce5aca5..0000000
--- a/node_modules/core-js-pure/proposals/promise-try.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../modules/esnext.promise.try');
diff --git a/node_modules/core-js-pure/proposals/reflect-metadata.js b/node_modules/core-js-pure/proposals/reflect-metadata.js
deleted file mode 100644
index 512b1f2..0000000
--- a/node_modules/core-js-pure/proposals/reflect-metadata.js
+++ /dev/null
@@ -1,9 +0,0 @@
-require('../modules/esnext.reflect.define-metadata');
-require('../modules/esnext.reflect.delete-metadata');
-require('../modules/esnext.reflect.get-metadata');
-require('../modules/esnext.reflect.get-metadata-keys');
-require('../modules/esnext.reflect.get-own-metadata');
-require('../modules/esnext.reflect.get-own-metadata-keys');
-require('../modules/esnext.reflect.has-metadata');
-require('../modules/esnext.reflect.has-own-metadata');
-require('../modules/esnext.reflect.metadata');
diff --git a/node_modules/core-js-pure/proposals/seeded-random.js b/node_modules/core-js-pure/proposals/seeded-random.js
deleted file mode 100644
index 5bbd904..0000000
--- a/node_modules/core-js-pure/proposals/seeded-random.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../modules/esnext.math.seeded-prng');
diff --git a/node_modules/core-js-pure/proposals/set-methods.js b/node_modules/core-js-pure/proposals/set-methods.js
deleted file mode 100644
index 8105460..0000000
--- a/node_modules/core-js-pure/proposals/set-methods.js
+++ /dev/null
@@ -1,7 +0,0 @@
-require('../modules/esnext.set.difference');
-require('../modules/esnext.set.intersection');
-require('../modules/esnext.set.is-disjoint-from');
-require('../modules/esnext.set.is-subset-of');
-require('../modules/esnext.set.is-superset-of');
-require('../modules/esnext.set.union');
-require('../modules/esnext.set.symmetric-difference');
diff --git a/node_modules/core-js-pure/proposals/string-at.js b/node_modules/core-js-pure/proposals/string-at.js
deleted file mode 100644
index e992e58..0000000
--- a/node_modules/core-js-pure/proposals/string-at.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../modules/esnext.string.at');
diff --git a/node_modules/core-js-pure/proposals/string-code-points.js b/node_modules/core-js-pure/proposals/string-code-points.js
deleted file mode 100644
index 3717523..0000000
--- a/node_modules/core-js-pure/proposals/string-code-points.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../modules/esnext.string.code-points');
diff --git a/node_modules/core-js-pure/proposals/string-match-all.js b/node_modules/core-js-pure/proposals/string-match-all.js
deleted file mode 100644
index be5ba60..0000000
--- a/node_modules/core-js-pure/proposals/string-match-all.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// TODO: Remove from `core-js@4`
-require('../modules/esnext.string.match-all');
diff --git a/node_modules/core-js-pure/proposals/string-replace-all.js b/node_modules/core-js-pure/proposals/string-replace-all.js
deleted file mode 100644
index c36697d..0000000
--- a/node_modules/core-js-pure/proposals/string-replace-all.js
+++ /dev/null
@@ -1,2 +0,0 @@
-require('../modules/esnext.string.replace-all');
-require('../modules/esnext.symbol.replace-all');
diff --git a/node_modules/core-js-pure/proposals/url.js b/node_modules/core-js-pure/proposals/url.js
deleted file mode 100644
index 151dfab..0000000
--- a/node_modules/core-js-pure/proposals/url.js
+++ /dev/null
@@ -1,3 +0,0 @@
-require('../modules/web.url');
-require('../modules/web.url.to-json');
-require('../modules/web.url-search-params');
diff --git a/node_modules/core-js-pure/proposals/using-statement.js b/node_modules/core-js-pure/proposals/using-statement.js
deleted file mode 100644
index 2ac3df7..0000000
--- a/node_modules/core-js-pure/proposals/using-statement.js
+++ /dev/null
@@ -1,3 +0,0 @@
-// https://github.com/tc39/proposal-using-statement
-require('../modules/esnext.symbol.async-dispose');
-require('../modules/esnext.symbol.dispose');
diff --git a/node_modules/core-js-pure/stable/README.md b/node_modules/core-js-pure/stable/README.md
deleted file mode 100644
index 903150c..0000000
--- a/node_modules/core-js-pure/stable/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This folder contains entry points for all stable `core-js` features with dependencies. It's the recommended way for usage only required features.
diff --git a/node_modules/core-js-pure/stable/array-buffer/constructor.js b/node_modules/core-js-pure/stable/array-buffer/constructor.js
deleted file mode 100644
index 14f239d..0000000
--- a/node_modules/core-js-pure/stable/array-buffer/constructor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array-buffer/constructor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array-buffer/index.js b/node_modules/core-js-pure/stable/array-buffer/index.js
deleted file mode 100644
index cb81bbc..0000000
--- a/node_modules/core-js-pure/stable/array-buffer/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array-buffer');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array-buffer/is-view.js b/node_modules/core-js-pure/stable/array-buffer/is-view.js
deleted file mode 100644
index 02091ec..0000000
--- a/node_modules/core-js-pure/stable/array-buffer/is-view.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array-buffer/is-view');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array-buffer/slice.js b/node_modules/core-js-pure/stable/array-buffer/slice.js
deleted file mode 100644
index 1259ebf..0000000
--- a/node_modules/core-js-pure/stable/array-buffer/slice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array-buffer/slice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/concat.js b/node_modules/core-js-pure/stable/array/concat.js
deleted file mode 100644
index 56c0625..0000000
--- a/node_modules/core-js-pure/stable/array/concat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/concat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/copy-within.js b/node_modules/core-js-pure/stable/array/copy-within.js
deleted file mode 100644
index 3db5361..0000000
--- a/node_modules/core-js-pure/stable/array/copy-within.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/copy-within');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/entries.js b/node_modules/core-js-pure/stable/array/entries.js
deleted file mode 100644
index 735b607..0000000
--- a/node_modules/core-js-pure/stable/array/entries.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/entries');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/every.js b/node_modules/core-js-pure/stable/array/every.js
deleted file mode 100644
index 8831dbc..0000000
--- a/node_modules/core-js-pure/stable/array/every.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/every');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/fill.js b/node_modules/core-js-pure/stable/array/fill.js
deleted file mode 100644
index b640ccd..0000000
--- a/node_modules/core-js-pure/stable/array/fill.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/fill');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/filter.js b/node_modules/core-js-pure/stable/array/filter.js
deleted file mode 100644
index c6fe56a..0000000
--- a/node_modules/core-js-pure/stable/array/filter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/filter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/find-index.js b/node_modules/core-js-pure/stable/array/find-index.js
deleted file mode 100644
index 312a7df..0000000
--- a/node_modules/core-js-pure/stable/array/find-index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/find-index');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/find.js b/node_modules/core-js-pure/stable/array/find.js
deleted file mode 100644
index 2fc46a5..0000000
--- a/node_modules/core-js-pure/stable/array/find.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/find');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/flat-map.js b/node_modules/core-js-pure/stable/array/flat-map.js
deleted file mode 100644
index 8e3e81a..0000000
--- a/node_modules/core-js-pure/stable/array/flat-map.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/flat-map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/flat.js b/node_modules/core-js-pure/stable/array/flat.js
deleted file mode 100644
index f74816e..0000000
--- a/node_modules/core-js-pure/stable/array/flat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/flat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/for-each.js b/node_modules/core-js-pure/stable/array/for-each.js
deleted file mode 100644
index a99f12c..0000000
--- a/node_modules/core-js-pure/stable/array/for-each.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/for-each');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/from.js b/node_modules/core-js-pure/stable/array/from.js
deleted file mode 100644
index 9142d6e..0000000
--- a/node_modules/core-js-pure/stable/array/from.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/from');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/includes.js b/node_modules/core-js-pure/stable/array/includes.js
deleted file mode 100644
index 52f040d..0000000
--- a/node_modules/core-js-pure/stable/array/includes.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/includes');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/index-of.js b/node_modules/core-js-pure/stable/array/index-of.js
deleted file mode 100644
index 13b63f1..0000000
--- a/node_modules/core-js-pure/stable/array/index-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/index-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/index.js b/node_modules/core-js-pure/stable/array/index.js
deleted file mode 100644
index 570f987..0000000
--- a/node_modules/core-js-pure/stable/array/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/is-array.js b/node_modules/core-js-pure/stable/array/is-array.js
deleted file mode 100644
index 89080ec..0000000
--- a/node_modules/core-js-pure/stable/array/is-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/is-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/iterator.js b/node_modules/core-js-pure/stable/array/iterator.js
deleted file mode 100644
index bfa833f..0000000
--- a/node_modules/core-js-pure/stable/array/iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/join.js b/node_modules/core-js-pure/stable/array/join.js
deleted file mode 100644
index 74fbfc6..0000000
--- a/node_modules/core-js-pure/stable/array/join.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/join');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/keys.js b/node_modules/core-js-pure/stable/array/keys.js
deleted file mode 100644
index 40b2e75..0000000
--- a/node_modules/core-js-pure/stable/array/keys.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/keys');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/last-index-of.js b/node_modules/core-js-pure/stable/array/last-index-of.js
deleted file mode 100644
index bdcd762..0000000
--- a/node_modules/core-js-pure/stable/array/last-index-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/last-index-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/map.js b/node_modules/core-js-pure/stable/array/map.js
deleted file mode 100644
index 3768704..0000000
--- a/node_modules/core-js-pure/stable/array/map.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/of.js b/node_modules/core-js-pure/stable/array/of.js
deleted file mode 100644
index d5b74f1..0000000
--- a/node_modules/core-js-pure/stable/array/of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/reduce-right.js b/node_modules/core-js-pure/stable/array/reduce-right.js
deleted file mode 100644
index f93b6de..0000000
--- a/node_modules/core-js-pure/stable/array/reduce-right.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/reduce-right');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/reduce.js b/node_modules/core-js-pure/stable/array/reduce.js
deleted file mode 100644
index a3ae7b1..0000000
--- a/node_modules/core-js-pure/stable/array/reduce.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/reduce');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/reverse.js b/node_modules/core-js-pure/stable/array/reverse.js
deleted file mode 100644
index fc9faf1..0000000
--- a/node_modules/core-js-pure/stable/array/reverse.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/reverse');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/slice.js b/node_modules/core-js-pure/stable/array/slice.js
deleted file mode 100644
index 2c098bd..0000000
--- a/node_modules/core-js-pure/stable/array/slice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/slice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/some.js b/node_modules/core-js-pure/stable/array/some.js
deleted file mode 100644
index a198c0e..0000000
--- a/node_modules/core-js-pure/stable/array/some.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/some');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/sort.js b/node_modules/core-js-pure/stable/array/sort.js
deleted file mode 100644
index 5741a92..0000000
--- a/node_modules/core-js-pure/stable/array/sort.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/sort');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/splice.js b/node_modules/core-js-pure/stable/array/splice.js
deleted file mode 100644
index e5aeb46..0000000
--- a/node_modules/core-js-pure/stable/array/splice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/splice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/values.js b/node_modules/core-js-pure/stable/array/values.js
deleted file mode 100644
index 146bce3..0000000
--- a/node_modules/core-js-pure/stable/array/values.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/array/values');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/concat.js b/node_modules/core-js-pure/stable/array/virtual/concat.js
deleted file mode 100644
index 9c9481b..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/concat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/concat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/copy-within.js b/node_modules/core-js-pure/stable/array/virtual/copy-within.js
deleted file mode 100644
index 7d43d5c..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/copy-within.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/copy-within');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/entries.js b/node_modules/core-js-pure/stable/array/virtual/entries.js
deleted file mode 100644
index 008e164..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/entries.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/entries');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/every.js b/node_modules/core-js-pure/stable/array/virtual/every.js
deleted file mode 100644
index 3c661eb..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/every.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/every');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/fill.js b/node_modules/core-js-pure/stable/array/virtual/fill.js
deleted file mode 100644
index b0a3b0e..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/fill.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/fill');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/filter.js b/node_modules/core-js-pure/stable/array/virtual/filter.js
deleted file mode 100644
index b78f806..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/filter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/filter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/find-index.js b/node_modules/core-js-pure/stable/array/virtual/find-index.js
deleted file mode 100644
index 0be7653..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/find-index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/find-index');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/find.js b/node_modules/core-js-pure/stable/array/virtual/find.js
deleted file mode 100644
index 0f28d7c..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/find.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/find');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/flat-map.js b/node_modules/core-js-pure/stable/array/virtual/flat-map.js
deleted file mode 100644
index 5adc39b..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/flat-map.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/flat-map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/flat.js b/node_modules/core-js-pure/stable/array/virtual/flat.js
deleted file mode 100644
index cfafee6..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/flat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/flat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/for-each.js b/node_modules/core-js-pure/stable/array/virtual/for-each.js
deleted file mode 100644
index ca081fb..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/for-each.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/for-each');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/includes.js b/node_modules/core-js-pure/stable/array/virtual/includes.js
deleted file mode 100644
index fc9bb00..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/includes.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/includes');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/index-of.js b/node_modules/core-js-pure/stable/array/virtual/index-of.js
deleted file mode 100644
index aedd505..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/index-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/index-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/index.js b/node_modules/core-js-pure/stable/array/virtual/index.js
deleted file mode 100644
index 98d4718..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/iterator.js b/node_modules/core-js-pure/stable/array/virtual/iterator.js
deleted file mode 100644
index 81ca2a2..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/join.js b/node_modules/core-js-pure/stable/array/virtual/join.js
deleted file mode 100644
index fe784ef..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/join.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/join');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/keys.js b/node_modules/core-js-pure/stable/array/virtual/keys.js
deleted file mode 100644
index 6ed98ec..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/keys.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/keys');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/last-index-of.js b/node_modules/core-js-pure/stable/array/virtual/last-index-of.js
deleted file mode 100644
index 697d588..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/last-index-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/last-index-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/map.js b/node_modules/core-js-pure/stable/array/virtual/map.js
deleted file mode 100644
index 9475976..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/map.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/reduce-right.js b/node_modules/core-js-pure/stable/array/virtual/reduce-right.js
deleted file mode 100644
index cf39fca..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/reduce-right.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/reduce-right');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/reduce.js b/node_modules/core-js-pure/stable/array/virtual/reduce.js
deleted file mode 100644
index 5a08269..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/reduce.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/reduce');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/reverse.js b/node_modules/core-js-pure/stable/array/virtual/reverse.js
deleted file mode 100644
index 099d13e..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/reverse.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/reverse');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/slice.js b/node_modules/core-js-pure/stable/array/virtual/slice.js
deleted file mode 100644
index f308e00..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/slice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/slice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/some.js b/node_modules/core-js-pure/stable/array/virtual/some.js
deleted file mode 100644
index d41a8e7..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/some.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/some');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/sort.js b/node_modules/core-js-pure/stable/array/virtual/sort.js
deleted file mode 100644
index 5da0daa..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/sort.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/sort');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/splice.js b/node_modules/core-js-pure/stable/array/virtual/splice.js
deleted file mode 100644
index 4cbb494..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/splice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/splice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/array/virtual/values.js b/node_modules/core-js-pure/stable/array/virtual/values.js
deleted file mode 100644
index ebb6375..0000000
--- a/node_modules/core-js-pure/stable/array/virtual/values.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/array/virtual/values');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/clear-immediate.js b/node_modules/core-js-pure/stable/clear-immediate.js
deleted file mode 100644
index 8fbfd12..0000000
--- a/node_modules/core-js-pure/stable/clear-immediate.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/web.immediate');
-var path = require('../internals/path');
-
-module.exports = path.clearImmediate;
diff --git a/node_modules/core-js-pure/stable/data-view/index.js b/node_modules/core-js-pure/stable/data-view/index.js
deleted file mode 100644
index 0387295..0000000
--- a/node_modules/core-js-pure/stable/data-view/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/data-view');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/date/index.js b/node_modules/core-js-pure/stable/date/index.js
deleted file mode 100644
index e9bde08..0000000
--- a/node_modules/core-js-pure/stable/date/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/date');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/date/now.js b/node_modules/core-js-pure/stable/date/now.js
deleted file mode 100644
index a4d8485..0000000
--- a/node_modules/core-js-pure/stable/date/now.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/date/now');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/date/to-iso-string.js b/node_modules/core-js-pure/stable/date/to-iso-string.js
deleted file mode 100644
index a6e6a7f..0000000
--- a/node_modules/core-js-pure/stable/date/to-iso-string.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/date/to-iso-string');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/date/to-json.js b/node_modules/core-js-pure/stable/date/to-json.js
deleted file mode 100644
index 23e8b0c..0000000
--- a/node_modules/core-js-pure/stable/date/to-json.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/date/to-json');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/date/to-primitive.js b/node_modules/core-js-pure/stable/date/to-primitive.js
deleted file mode 100644
index 193421d..0000000
--- a/node_modules/core-js-pure/stable/date/to-primitive.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/date/to-primitive');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/date/to-string.js b/node_modules/core-js-pure/stable/date/to-string.js
deleted file mode 100644
index f5c9592..0000000
--- a/node_modules/core-js-pure/stable/date/to-string.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/date/to-string');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/dom-collections/for-each.js b/node_modules/core-js-pure/stable/dom-collections/for-each.js
deleted file mode 100644
index 3414fd7..0000000
--- a/node_modules/core-js-pure/stable/dom-collections/for-each.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../../modules/web.dom-collections.for-each');
-
-var parent = require('../../internals/array-for-each');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/dom-collections/index.js b/node_modules/core-js-pure/stable/dom-collections/index.js
deleted file mode 100644
index 7d262cb..0000000
--- a/node_modules/core-js-pure/stable/dom-collections/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-require('../../modules/web.dom-collections.for-each');
-require('../../modules/web.dom-collections.iterator');
-var ArrayIterators = require('../../modules/es.array.iterator');
-var forEach = require('../../internals/array-for-each');
-
-module.exports = {
-  keys: ArrayIterators.keys,
-  values: ArrayIterators.values,
-  entries: ArrayIterators.entries,
-  iterator: ArrayIterators.values,
-  forEach: forEach
-};
diff --git a/node_modules/core-js-pure/stable/dom-collections/iterator.js b/node_modules/core-js-pure/stable/dom-collections/iterator.js
deleted file mode 100644
index 3bc1e90..0000000
--- a/node_modules/core-js-pure/stable/dom-collections/iterator.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../../modules/web.dom-collections.iterator');
-var entryUnbind = require('../../internals/entry-unbind');
-
-module.exports = entryUnbind('Array', 'values');
diff --git a/node_modules/core-js-pure/stable/function/bind.js b/node_modules/core-js-pure/stable/function/bind.js
deleted file mode 100644
index b916d67..0000000
--- a/node_modules/core-js-pure/stable/function/bind.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/function/bind');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/function/has-instance.js b/node_modules/core-js-pure/stable/function/has-instance.js
deleted file mode 100644
index 9538a80..0000000
--- a/node_modules/core-js-pure/stable/function/has-instance.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/function/has-instance');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/function/index.js b/node_modules/core-js-pure/stable/function/index.js
deleted file mode 100644
index f906e2e..0000000
--- a/node_modules/core-js-pure/stable/function/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/function');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/function/name.js b/node_modules/core-js-pure/stable/function/name.js
deleted file mode 100644
index a7729f5..0000000
--- a/node_modules/core-js-pure/stable/function/name.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/function/name');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/function/virtual/bind.js b/node_modules/core-js-pure/stable/function/virtual/bind.js
deleted file mode 100644
index e7b9a3b..0000000
--- a/node_modules/core-js-pure/stable/function/virtual/bind.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/function/virtual/bind');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/function/virtual/index.js b/node_modules/core-js-pure/stable/function/virtual/index.js
deleted file mode 100644
index 2282ff4..0000000
--- a/node_modules/core-js-pure/stable/function/virtual/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/function/virtual');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/global-this.js b/node_modules/core-js-pure/stable/global-this.js
deleted file mode 100644
index b225b09..0000000
--- a/node_modules/core-js-pure/stable/global-this.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../es/global-this');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/index.js b/node_modules/core-js-pure/stable/index.js
deleted file mode 100644
index f0dc470..0000000
--- a/node_modules/core-js-pure/stable/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../es');
-require('../web');
-var path = require('../internals/path');
-
-module.exports = path;
diff --git a/node_modules/core-js-pure/stable/instance/bind.js b/node_modules/core-js-pure/stable/instance/bind.js
deleted file mode 100644
index acb6bbe..0000000
--- a/node_modules/core-js-pure/stable/instance/bind.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/bind');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/code-point-at.js b/node_modules/core-js-pure/stable/instance/code-point-at.js
deleted file mode 100644
index 1d4435e..0000000
--- a/node_modules/core-js-pure/stable/instance/code-point-at.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/code-point-at');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/concat.js b/node_modules/core-js-pure/stable/instance/concat.js
deleted file mode 100644
index 874d87d..0000000
--- a/node_modules/core-js-pure/stable/instance/concat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/concat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/copy-within.js b/node_modules/core-js-pure/stable/instance/copy-within.js
deleted file mode 100644
index 9d472b0..0000000
--- a/node_modules/core-js-pure/stable/instance/copy-within.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/copy-within');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/ends-with.js b/node_modules/core-js-pure/stable/instance/ends-with.js
deleted file mode 100644
index aaf2c16..0000000
--- a/node_modules/core-js-pure/stable/instance/ends-with.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/ends-with');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/entries.js b/node_modules/core-js-pure/stable/instance/entries.js
deleted file mode 100644
index 080b814..0000000
--- a/node_modules/core-js-pure/stable/instance/entries.js
+++ /dev/null
@@ -1,16 +0,0 @@
-require('../../modules/web.dom-collections.iterator');
-var entries = require('../array/virtual/entries');
-var classof = require('../../internals/classof');
-var ArrayPrototype = Array.prototype;
-
-var DOMIterables = {
-  DOMTokenList: true,
-  NodeList: true
-};
-
-module.exports = function (it) {
-  var own = it.entries;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.entries)
-    // eslint-disable-next-line no-prototype-builtins
-    || DOMIterables.hasOwnProperty(classof(it)) ? entries : own;
-};
diff --git a/node_modules/core-js-pure/stable/instance/every.js b/node_modules/core-js-pure/stable/instance/every.js
deleted file mode 100644
index 3dc4296..0000000
--- a/node_modules/core-js-pure/stable/instance/every.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/every');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/fill.js b/node_modules/core-js-pure/stable/instance/fill.js
deleted file mode 100644
index 4e38c42..0000000
--- a/node_modules/core-js-pure/stable/instance/fill.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/fill');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/filter.js b/node_modules/core-js-pure/stable/instance/filter.js
deleted file mode 100644
index 5219c64..0000000
--- a/node_modules/core-js-pure/stable/instance/filter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/filter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/find-index.js b/node_modules/core-js-pure/stable/instance/find-index.js
deleted file mode 100644
index b207364..0000000
--- a/node_modules/core-js-pure/stable/instance/find-index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/find-index');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/find.js b/node_modules/core-js-pure/stable/instance/find.js
deleted file mode 100644
index 024fc81..0000000
--- a/node_modules/core-js-pure/stable/instance/find.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/find');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/flags.js b/node_modules/core-js-pure/stable/instance/flags.js
deleted file mode 100644
index 064c9ec..0000000
--- a/node_modules/core-js-pure/stable/instance/flags.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/flags');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/flat-map.js b/node_modules/core-js-pure/stable/instance/flat-map.js
deleted file mode 100644
index bea3d82..0000000
--- a/node_modules/core-js-pure/stable/instance/flat-map.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/flat-map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/flat.js b/node_modules/core-js-pure/stable/instance/flat.js
deleted file mode 100644
index d61b6ab..0000000
--- a/node_modules/core-js-pure/stable/instance/flat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/flat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/for-each.js b/node_modules/core-js-pure/stable/instance/for-each.js
deleted file mode 100644
index 1254e9f..0000000
--- a/node_modules/core-js-pure/stable/instance/for-each.js
+++ /dev/null
@@ -1,16 +0,0 @@
-require('../../modules/web.dom-collections.iterator');
-var forEach = require('../array/virtual/for-each');
-var classof = require('../../internals/classof');
-var ArrayPrototype = Array.prototype;
-
-var DOMIterables = {
-  DOMTokenList: true,
-  NodeList: true
-};
-
-module.exports = function (it) {
-  var own = it.forEach;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.forEach)
-    // eslint-disable-next-line no-prototype-builtins
-    || DOMIterables.hasOwnProperty(classof(it)) ? forEach : own;
-};
diff --git a/node_modules/core-js-pure/stable/instance/includes.js b/node_modules/core-js-pure/stable/instance/includes.js
deleted file mode 100644
index 1bccfac..0000000
--- a/node_modules/core-js-pure/stable/instance/includes.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/includes');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/index-of.js b/node_modules/core-js-pure/stable/instance/index-of.js
deleted file mode 100644
index 8ddbaba..0000000
--- a/node_modules/core-js-pure/stable/instance/index-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/index-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/keys.js b/node_modules/core-js-pure/stable/instance/keys.js
deleted file mode 100644
index b83acb7..0000000
--- a/node_modules/core-js-pure/stable/instance/keys.js
+++ /dev/null
@@ -1,16 +0,0 @@
-require('../../modules/web.dom-collections.iterator');
-var keys = require('../array/virtual/keys');
-var classof = require('../../internals/classof');
-var ArrayPrototype = Array.prototype;
-
-var DOMIterables = {
-  DOMTokenList: true,
-  NodeList: true
-};
-
-module.exports = function (it) {
-  var own = it.keys;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.keys)
-    // eslint-disable-next-line no-prototype-builtins
-    || DOMIterables.hasOwnProperty(classof(it)) ? keys : own;
-};
diff --git a/node_modules/core-js-pure/stable/instance/last-index-of.js b/node_modules/core-js-pure/stable/instance/last-index-of.js
deleted file mode 100644
index c860188..0000000
--- a/node_modules/core-js-pure/stable/instance/last-index-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/last-index-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/map.js b/node_modules/core-js-pure/stable/instance/map.js
deleted file mode 100644
index 1f18a09..0000000
--- a/node_modules/core-js-pure/stable/instance/map.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/match-all.js b/node_modules/core-js-pure/stable/instance/match-all.js
deleted file mode 100644
index 54cc6bb..0000000
--- a/node_modules/core-js-pure/stable/instance/match-all.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/match-all');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/pad-end.js b/node_modules/core-js-pure/stable/instance/pad-end.js
deleted file mode 100644
index afe92b0..0000000
--- a/node_modules/core-js-pure/stable/instance/pad-end.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/pad-end');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/pad-start.js b/node_modules/core-js-pure/stable/instance/pad-start.js
deleted file mode 100644
index 6a7db7d..0000000
--- a/node_modules/core-js-pure/stable/instance/pad-start.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/pad-start');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/reduce-right.js b/node_modules/core-js-pure/stable/instance/reduce-right.js
deleted file mode 100644
index 6a1bb34..0000000
--- a/node_modules/core-js-pure/stable/instance/reduce-right.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/reduce-right');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/reduce.js b/node_modules/core-js-pure/stable/instance/reduce.js
deleted file mode 100644
index 908e12e..0000000
--- a/node_modules/core-js-pure/stable/instance/reduce.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/reduce');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/repeat.js b/node_modules/core-js-pure/stable/instance/repeat.js
deleted file mode 100644
index 76f2f4c..0000000
--- a/node_modules/core-js-pure/stable/instance/repeat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/repeat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/reverse.js b/node_modules/core-js-pure/stable/instance/reverse.js
deleted file mode 100644
index ca634dc..0000000
--- a/node_modules/core-js-pure/stable/instance/reverse.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/reverse');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/slice.js b/node_modules/core-js-pure/stable/instance/slice.js
deleted file mode 100644
index 2722605..0000000
--- a/node_modules/core-js-pure/stable/instance/slice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/slice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/some.js b/node_modules/core-js-pure/stable/instance/some.js
deleted file mode 100644
index 3cd6a8b..0000000
--- a/node_modules/core-js-pure/stable/instance/some.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/some');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/sort.js b/node_modules/core-js-pure/stable/instance/sort.js
deleted file mode 100644
index d06c4bb..0000000
--- a/node_modules/core-js-pure/stable/instance/sort.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/sort');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/splice.js b/node_modules/core-js-pure/stable/instance/splice.js
deleted file mode 100644
index 46da42c..0000000
--- a/node_modules/core-js-pure/stable/instance/splice.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/splice');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/starts-with.js b/node_modules/core-js-pure/stable/instance/starts-with.js
deleted file mode 100644
index f2e3a08..0000000
--- a/node_modules/core-js-pure/stable/instance/starts-with.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/starts-with');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/trim-end.js b/node_modules/core-js-pure/stable/instance/trim-end.js
deleted file mode 100644
index 787e52e..0000000
--- a/node_modules/core-js-pure/stable/instance/trim-end.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/trim-end');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/trim-left.js b/node_modules/core-js-pure/stable/instance/trim-left.js
deleted file mode 100644
index 7127d67..0000000
--- a/node_modules/core-js-pure/stable/instance/trim-left.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/trim-left');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/trim-right.js b/node_modules/core-js-pure/stable/instance/trim-right.js
deleted file mode 100644
index 760567e..0000000
--- a/node_modules/core-js-pure/stable/instance/trim-right.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/trim-right');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/trim-start.js b/node_modules/core-js-pure/stable/instance/trim-start.js
deleted file mode 100644
index 3c59472..0000000
--- a/node_modules/core-js-pure/stable/instance/trim-start.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/trim-start');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/trim.js b/node_modules/core-js-pure/stable/instance/trim.js
deleted file mode 100644
index 4d99499..0000000
--- a/node_modules/core-js-pure/stable/instance/trim.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/instance/trim');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/instance/values.js b/node_modules/core-js-pure/stable/instance/values.js
deleted file mode 100644
index febcba3..0000000
--- a/node_modules/core-js-pure/stable/instance/values.js
+++ /dev/null
@@ -1,16 +0,0 @@
-require('../../modules/web.dom-collections.iterator');
-var values = require('../array/virtual/values');
-var classof = require('../../internals/classof');
-var ArrayPrototype = Array.prototype;
-
-var DOMIterables = {
-  DOMTokenList: true,
-  NodeList: true
-};
-
-module.exports = function (it) {
-  var own = it.values;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.values)
-    // eslint-disable-next-line no-prototype-builtins
-    || DOMIterables.hasOwnProperty(classof(it)) ? values : own;
-};
diff --git a/node_modules/core-js-pure/stable/json/index.js b/node_modules/core-js-pure/stable/json/index.js
deleted file mode 100644
index c53da9f..0000000
--- a/node_modules/core-js-pure/stable/json/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/json');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/json/stringify.js b/node_modules/core-js-pure/stable/json/stringify.js
deleted file mode 100644
index d6d8c52..0000000
--- a/node_modules/core-js-pure/stable/json/stringify.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/json/stringify');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/json/to-string-tag.js b/node_modules/core-js-pure/stable/json/to-string-tag.js
deleted file mode 100644
index 5355956..0000000
--- a/node_modules/core-js-pure/stable/json/to-string-tag.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/json/to-string-tag');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/map/index.js b/node_modules/core-js-pure/stable/map/index.js
deleted file mode 100644
index 6ec56e8..0000000
--- a/node_modules/core-js-pure/stable/map/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/acosh.js b/node_modules/core-js-pure/stable/math/acosh.js
deleted file mode 100644
index f039937..0000000
--- a/node_modules/core-js-pure/stable/math/acosh.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/acosh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/asinh.js b/node_modules/core-js-pure/stable/math/asinh.js
deleted file mode 100644
index 95a302a..0000000
--- a/node_modules/core-js-pure/stable/math/asinh.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/asinh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/atanh.js b/node_modules/core-js-pure/stable/math/atanh.js
deleted file mode 100644
index f1ebad7..0000000
--- a/node_modules/core-js-pure/stable/math/atanh.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/atanh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/cbrt.js b/node_modules/core-js-pure/stable/math/cbrt.js
deleted file mode 100644
index 2c1f825..0000000
--- a/node_modules/core-js-pure/stable/math/cbrt.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/cbrt');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/clz32.js b/node_modules/core-js-pure/stable/math/clz32.js
deleted file mode 100644
index a0ecd15..0000000
--- a/node_modules/core-js-pure/stable/math/clz32.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/clz32');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/cosh.js b/node_modules/core-js-pure/stable/math/cosh.js
deleted file mode 100644
index bc8a11f..0000000
--- a/node_modules/core-js-pure/stable/math/cosh.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/cosh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/expm1.js b/node_modules/core-js-pure/stable/math/expm1.js
deleted file mode 100644
index 0527f81..0000000
--- a/node_modules/core-js-pure/stable/math/expm1.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/expm1');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/fround.js b/node_modules/core-js-pure/stable/math/fround.js
deleted file mode 100644
index 5caff7d..0000000
--- a/node_modules/core-js-pure/stable/math/fround.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/fround');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/hypot.js b/node_modules/core-js-pure/stable/math/hypot.js
deleted file mode 100644
index 3db8d78..0000000
--- a/node_modules/core-js-pure/stable/math/hypot.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/hypot');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/imul.js b/node_modules/core-js-pure/stable/math/imul.js
deleted file mode 100644
index 4d31d24..0000000
--- a/node_modules/core-js-pure/stable/math/imul.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/imul');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/index.js b/node_modules/core-js-pure/stable/math/index.js
deleted file mode 100644
index f563253..0000000
--- a/node_modules/core-js-pure/stable/math/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/log10.js b/node_modules/core-js-pure/stable/math/log10.js
deleted file mode 100644
index 07b9704..0000000
--- a/node_modules/core-js-pure/stable/math/log10.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/log10');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/log1p.js b/node_modules/core-js-pure/stable/math/log1p.js
deleted file mode 100644
index b31d730..0000000
--- a/node_modules/core-js-pure/stable/math/log1p.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/log1p');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/log2.js b/node_modules/core-js-pure/stable/math/log2.js
deleted file mode 100644
index 00db8a5..0000000
--- a/node_modules/core-js-pure/stable/math/log2.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/log2');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/sign.js b/node_modules/core-js-pure/stable/math/sign.js
deleted file mode 100644
index c7bef22..0000000
--- a/node_modules/core-js-pure/stable/math/sign.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/sign');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/sinh.js b/node_modules/core-js-pure/stable/math/sinh.js
deleted file mode 100644
index 96f8f8e..0000000
--- a/node_modules/core-js-pure/stable/math/sinh.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/sinh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/tanh.js b/node_modules/core-js-pure/stable/math/tanh.js
deleted file mode 100644
index c9e8bb8..0000000
--- a/node_modules/core-js-pure/stable/math/tanh.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/tanh');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/to-string-tag.js b/node_modules/core-js-pure/stable/math/to-string-tag.js
deleted file mode 100644
index 02faadf..0000000
--- a/node_modules/core-js-pure/stable/math/to-string-tag.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/to-string-tag');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/math/trunc.js b/node_modules/core-js-pure/stable/math/trunc.js
deleted file mode 100644
index 7635c17..0000000
--- a/node_modules/core-js-pure/stable/math/trunc.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/math/trunc');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/constructor.js b/node_modules/core-js-pure/stable/number/constructor.js
deleted file mode 100644
index 6b5836e..0000000
--- a/node_modules/core-js-pure/stable/number/constructor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/constructor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/epsilon.js b/node_modules/core-js-pure/stable/number/epsilon.js
deleted file mode 100644
index fe2ccd7..0000000
--- a/node_modules/core-js-pure/stable/number/epsilon.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/epsilon');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/index.js b/node_modules/core-js-pure/stable/number/index.js
deleted file mode 100644
index 81181a1..0000000
--- a/node_modules/core-js-pure/stable/number/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/is-finite.js b/node_modules/core-js-pure/stable/number/is-finite.js
deleted file mode 100644
index 24b9773..0000000
--- a/node_modules/core-js-pure/stable/number/is-finite.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/is-finite');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/is-integer.js b/node_modules/core-js-pure/stable/number/is-integer.js
deleted file mode 100644
index b1592d0..0000000
--- a/node_modules/core-js-pure/stable/number/is-integer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/is-integer');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/is-nan.js b/node_modules/core-js-pure/stable/number/is-nan.js
deleted file mode 100644
index fcbec50..0000000
--- a/node_modules/core-js-pure/stable/number/is-nan.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/is-nan');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/is-safe-integer.js b/node_modules/core-js-pure/stable/number/is-safe-integer.js
deleted file mode 100644
index b25eb1c..0000000
--- a/node_modules/core-js-pure/stable/number/is-safe-integer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/is-safe-integer');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/max-safe-integer.js b/node_modules/core-js-pure/stable/number/max-safe-integer.js
deleted file mode 100644
index e6689b0..0000000
--- a/node_modules/core-js-pure/stable/number/max-safe-integer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/max-safe-integer');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/min-safe-integer.js b/node_modules/core-js-pure/stable/number/min-safe-integer.js
deleted file mode 100644
index 1159a47..0000000
--- a/node_modules/core-js-pure/stable/number/min-safe-integer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/min-safe-integer');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/parse-float.js b/node_modules/core-js-pure/stable/number/parse-float.js
deleted file mode 100644
index 3b49c6a..0000000
--- a/node_modules/core-js-pure/stable/number/parse-float.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/parse-float');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/parse-int.js b/node_modules/core-js-pure/stable/number/parse-int.js
deleted file mode 100644
index 9e44651..0000000
--- a/node_modules/core-js-pure/stable/number/parse-int.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/parse-int');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/to-fixed.js b/node_modules/core-js-pure/stable/number/to-fixed.js
deleted file mode 100644
index b103de9..0000000
--- a/node_modules/core-js-pure/stable/number/to-fixed.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/to-fixed');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/to-precision.js b/node_modules/core-js-pure/stable/number/to-precision.js
deleted file mode 100644
index 5183347..0000000
--- a/node_modules/core-js-pure/stable/number/to-precision.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/number/to-precision');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/virtual/index.js b/node_modules/core-js-pure/stable/number/virtual/index.js
deleted file mode 100644
index 88eef4b..0000000
--- a/node_modules/core-js-pure/stable/number/virtual/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/number/virtual');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/virtual/to-fixed.js b/node_modules/core-js-pure/stable/number/virtual/to-fixed.js
deleted file mode 100644
index a9f83cc..0000000
--- a/node_modules/core-js-pure/stable/number/virtual/to-fixed.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/number/virtual/to-fixed');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/number/virtual/to-precision.js b/node_modules/core-js-pure/stable/number/virtual/to-precision.js
deleted file mode 100644
index adffb86..0000000
--- a/node_modules/core-js-pure/stable/number/virtual/to-precision.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/number/virtual/to-precision');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/assign.js b/node_modules/core-js-pure/stable/object/assign.js
deleted file mode 100644
index ed6863e..0000000
--- a/node_modules/core-js-pure/stable/object/assign.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/assign');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/create.js b/node_modules/core-js-pure/stable/object/create.js
deleted file mode 100644
index 1e4d353..0000000
--- a/node_modules/core-js-pure/stable/object/create.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/create');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/define-getter.js b/node_modules/core-js-pure/stable/object/define-getter.js
deleted file mode 100644
index 9b734ab..0000000
--- a/node_modules/core-js-pure/stable/object/define-getter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/define-getter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/define-properties.js b/node_modules/core-js-pure/stable/object/define-properties.js
deleted file mode 100644
index e0d074c..0000000
--- a/node_modules/core-js-pure/stable/object/define-properties.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/define-properties');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/define-property.js b/node_modules/core-js-pure/stable/object/define-property.js
deleted file mode 100644
index 67a978c..0000000
--- a/node_modules/core-js-pure/stable/object/define-property.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/define-property');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/define-setter.js b/node_modules/core-js-pure/stable/object/define-setter.js
deleted file mode 100644
index 9076fd5..0000000
--- a/node_modules/core-js-pure/stable/object/define-setter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/define-setter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/entries.js b/node_modules/core-js-pure/stable/object/entries.js
deleted file mode 100644
index c7a831a..0000000
--- a/node_modules/core-js-pure/stable/object/entries.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/entries');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/freeze.js b/node_modules/core-js-pure/stable/object/freeze.js
deleted file mode 100644
index 0ee7459..0000000
--- a/node_modules/core-js-pure/stable/object/freeze.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/freeze');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/from-entries.js b/node_modules/core-js-pure/stable/object/from-entries.js
deleted file mode 100644
index aec2c7a..0000000
--- a/node_modules/core-js-pure/stable/object/from-entries.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/from-entries');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/get-own-property-descriptor.js b/node_modules/core-js-pure/stable/object/get-own-property-descriptor.js
deleted file mode 100644
index 9b69cdd..0000000
--- a/node_modules/core-js-pure/stable/object/get-own-property-descriptor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/get-own-property-descriptor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/get-own-property-descriptors.js b/node_modules/core-js-pure/stable/object/get-own-property-descriptors.js
deleted file mode 100644
index 43a193e..0000000
--- a/node_modules/core-js-pure/stable/object/get-own-property-descriptors.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/get-own-property-descriptors');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/get-own-property-names.js b/node_modules/core-js-pure/stable/object/get-own-property-names.js
deleted file mode 100644
index 42c21d7..0000000
--- a/node_modules/core-js-pure/stable/object/get-own-property-names.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/get-own-property-names');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/get-own-property-symbols.js b/node_modules/core-js-pure/stable/object/get-own-property-symbols.js
deleted file mode 100644
index 0bc8c26..0000000
--- a/node_modules/core-js-pure/stable/object/get-own-property-symbols.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/get-own-property-symbols');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/get-prototype-of.js b/node_modules/core-js-pure/stable/object/get-prototype-of.js
deleted file mode 100644
index b7cf588..0000000
--- a/node_modules/core-js-pure/stable/object/get-prototype-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/get-prototype-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/index.js b/node_modules/core-js-pure/stable/object/index.js
deleted file mode 100644
index d2d658c..0000000
--- a/node_modules/core-js-pure/stable/object/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/is-extensible.js b/node_modules/core-js-pure/stable/object/is-extensible.js
deleted file mode 100644
index 694b9a4..0000000
--- a/node_modules/core-js-pure/stable/object/is-extensible.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/is-extensible');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/is-frozen.js b/node_modules/core-js-pure/stable/object/is-frozen.js
deleted file mode 100644
index 68fe107..0000000
--- a/node_modules/core-js-pure/stable/object/is-frozen.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/is-frozen');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/is-sealed.js b/node_modules/core-js-pure/stable/object/is-sealed.js
deleted file mode 100644
index bbf6472..0000000
--- a/node_modules/core-js-pure/stable/object/is-sealed.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/is-sealed');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/is.js b/node_modules/core-js-pure/stable/object/is.js
deleted file mode 100644
index 3ddd76f..0000000
--- a/node_modules/core-js-pure/stable/object/is.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/is');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/keys.js b/node_modules/core-js-pure/stable/object/keys.js
deleted file mode 100644
index 2cff0ab..0000000
--- a/node_modules/core-js-pure/stable/object/keys.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/keys');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/lookup-getter.js b/node_modules/core-js-pure/stable/object/lookup-getter.js
deleted file mode 100644
index 9f10f6b..0000000
--- a/node_modules/core-js-pure/stable/object/lookup-getter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/lookup-getter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/lookup-setter.js b/node_modules/core-js-pure/stable/object/lookup-setter.js
deleted file mode 100644
index 97389bf..0000000
--- a/node_modules/core-js-pure/stable/object/lookup-setter.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/lookup-setter');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/prevent-extensions.js b/node_modules/core-js-pure/stable/object/prevent-extensions.js
deleted file mode 100644
index 7171f2a..0000000
--- a/node_modules/core-js-pure/stable/object/prevent-extensions.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/prevent-extensions');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/seal.js b/node_modules/core-js-pure/stable/object/seal.js
deleted file mode 100644
index fa50038..0000000
--- a/node_modules/core-js-pure/stable/object/seal.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/seal');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/set-prototype-of.js b/node_modules/core-js-pure/stable/object/set-prototype-of.js
deleted file mode 100644
index 4885ad3..0000000
--- a/node_modules/core-js-pure/stable/object/set-prototype-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/set-prototype-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/to-string.js b/node_modules/core-js-pure/stable/object/to-string.js
deleted file mode 100644
index 589ffcb..0000000
--- a/node_modules/core-js-pure/stable/object/to-string.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/to-string');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/object/values.js b/node_modules/core-js-pure/stable/object/values.js
deleted file mode 100644
index 9e457fc..0000000
--- a/node_modules/core-js-pure/stable/object/values.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/object/values');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/parse-float.js b/node_modules/core-js-pure/stable/parse-float.js
deleted file mode 100644
index 1bc853c..0000000
--- a/node_modules/core-js-pure/stable/parse-float.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../es/parse-float');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/parse-int.js b/node_modules/core-js-pure/stable/parse-int.js
deleted file mode 100644
index af7cffd..0000000
--- a/node_modules/core-js-pure/stable/parse-int.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../es/parse-int');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/promise/all-settled.js b/node_modules/core-js-pure/stable/promise/all-settled.js
deleted file mode 100644
index 5b99bed..0000000
--- a/node_modules/core-js-pure/stable/promise/all-settled.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/promise/all-settled');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/promise/finally.js b/node_modules/core-js-pure/stable/promise/finally.js
deleted file mode 100644
index 835c6c9..0000000
--- a/node_modules/core-js-pure/stable/promise/finally.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/promise/finally');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/promise/index.js b/node_modules/core-js-pure/stable/promise/index.js
deleted file mode 100644
index 6f19db9..0000000
--- a/node_modules/core-js-pure/stable/promise/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/promise');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/queue-microtask.js b/node_modules/core-js-pure/stable/queue-microtask.js
deleted file mode 100644
index 8afd9c7..0000000
--- a/node_modules/core-js-pure/stable/queue-microtask.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../web/queue-microtask');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/apply.js b/node_modules/core-js-pure/stable/reflect/apply.js
deleted file mode 100644
index 75bf21e..0000000
--- a/node_modules/core-js-pure/stable/reflect/apply.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/apply');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/construct.js b/node_modules/core-js-pure/stable/reflect/construct.js
deleted file mode 100644
index 86ba56e..0000000
--- a/node_modules/core-js-pure/stable/reflect/construct.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/construct');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/define-property.js b/node_modules/core-js-pure/stable/reflect/define-property.js
deleted file mode 100644
index 5b66a14..0000000
--- a/node_modules/core-js-pure/stable/reflect/define-property.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/define-property');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/delete-property.js b/node_modules/core-js-pure/stable/reflect/delete-property.js
deleted file mode 100644
index 381d7a7..0000000
--- a/node_modules/core-js-pure/stable/reflect/delete-property.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/delete-property');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/get-own-property-descriptor.js b/node_modules/core-js-pure/stable/reflect/get-own-property-descriptor.js
deleted file mode 100644
index 0f9c132..0000000
--- a/node_modules/core-js-pure/stable/reflect/get-own-property-descriptor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/get-own-property-descriptor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/get-prototype-of.js b/node_modules/core-js-pure/stable/reflect/get-prototype-of.js
deleted file mode 100644
index fdc1ccb..0000000
--- a/node_modules/core-js-pure/stable/reflect/get-prototype-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/get-prototype-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/get.js b/node_modules/core-js-pure/stable/reflect/get.js
deleted file mode 100644
index 2914c12..0000000
--- a/node_modules/core-js-pure/stable/reflect/get.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/get');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/has.js b/node_modules/core-js-pure/stable/reflect/has.js
deleted file mode 100644
index 26b5f7c..0000000
--- a/node_modules/core-js-pure/stable/reflect/has.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/has');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/index.js b/node_modules/core-js-pure/stable/reflect/index.js
deleted file mode 100644
index c0a7563..0000000
--- a/node_modules/core-js-pure/stable/reflect/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/is-extensible.js b/node_modules/core-js-pure/stable/reflect/is-extensible.js
deleted file mode 100644
index b04239e..0000000
--- a/node_modules/core-js-pure/stable/reflect/is-extensible.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/is-extensible');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/own-keys.js b/node_modules/core-js-pure/stable/reflect/own-keys.js
deleted file mode 100644
index 6d56289..0000000
--- a/node_modules/core-js-pure/stable/reflect/own-keys.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/own-keys');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/prevent-extensions.js b/node_modules/core-js-pure/stable/reflect/prevent-extensions.js
deleted file mode 100644
index 40a8bbc..0000000
--- a/node_modules/core-js-pure/stable/reflect/prevent-extensions.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/prevent-extensions');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/set-prototype-of.js b/node_modules/core-js-pure/stable/reflect/set-prototype-of.js
deleted file mode 100644
index 20fd6f3..0000000
--- a/node_modules/core-js-pure/stable/reflect/set-prototype-of.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/set-prototype-of');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/reflect/set.js b/node_modules/core-js-pure/stable/reflect/set.js
deleted file mode 100644
index a4cf5f0..0000000
--- a/node_modules/core-js-pure/stable/reflect/set.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/reflect/set');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/regexp/constructor.js b/node_modules/core-js-pure/stable/regexp/constructor.js
deleted file mode 100644
index 2cd0149..0000000
--- a/node_modules/core-js-pure/stable/regexp/constructor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/constructor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/regexp/flags.js b/node_modules/core-js-pure/stable/regexp/flags.js
deleted file mode 100644
index bdf1c8a..0000000
--- a/node_modules/core-js-pure/stable/regexp/flags.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/flags');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/regexp/index.js b/node_modules/core-js-pure/stable/regexp/index.js
deleted file mode 100644
index df41f17..0000000
--- a/node_modules/core-js-pure/stable/regexp/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/regexp/match.js b/node_modules/core-js-pure/stable/regexp/match.js
deleted file mode 100644
index c995bbb..0000000
--- a/node_modules/core-js-pure/stable/regexp/match.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/match');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/regexp/replace.js b/node_modules/core-js-pure/stable/regexp/replace.js
deleted file mode 100644
index b1a9e65..0000000
--- a/node_modules/core-js-pure/stable/regexp/replace.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/replace');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/regexp/search.js b/node_modules/core-js-pure/stable/regexp/search.js
deleted file mode 100644
index af17062..0000000
--- a/node_modules/core-js-pure/stable/regexp/search.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/search');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/regexp/split.js b/node_modules/core-js-pure/stable/regexp/split.js
deleted file mode 100644
index fb0471a..0000000
--- a/node_modules/core-js-pure/stable/regexp/split.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/split');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/regexp/sticky.js b/node_modules/core-js-pure/stable/regexp/sticky.js
deleted file mode 100644
index c1307ad..0000000
--- a/node_modules/core-js-pure/stable/regexp/sticky.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/sticky');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/regexp/test.js b/node_modules/core-js-pure/stable/regexp/test.js
deleted file mode 100644
index 53f9166..0000000
--- a/node_modules/core-js-pure/stable/regexp/test.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/test');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/regexp/to-string.js b/node_modules/core-js-pure/stable/regexp/to-string.js
deleted file mode 100644
index e2a4442..0000000
--- a/node_modules/core-js-pure/stable/regexp/to-string.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/regexp/to-string');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/set-immediate.js b/node_modules/core-js-pure/stable/set-immediate.js
deleted file mode 100644
index 0878b64..0000000
--- a/node_modules/core-js-pure/stable/set-immediate.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/web.immediate');
-var path = require('../internals/path');
-
-module.exports = path.setImmediate;
diff --git a/node_modules/core-js-pure/stable/set-interval.js b/node_modules/core-js-pure/stable/set-interval.js
deleted file mode 100644
index cd6eddb..0000000
--- a/node_modules/core-js-pure/stable/set-interval.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/web.timers');
-var path = require('../internals/path');
-
-module.exports = path.setInterval;
diff --git a/node_modules/core-js-pure/stable/set-timeout.js b/node_modules/core-js-pure/stable/set-timeout.js
deleted file mode 100644
index b497a6a..0000000
--- a/node_modules/core-js-pure/stable/set-timeout.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/web.timers');
-var path = require('../internals/path');
-
-module.exports = path.setTimeout;
diff --git a/node_modules/core-js-pure/stable/set/index.js b/node_modules/core-js-pure/stable/set/index.js
deleted file mode 100644
index fe554d6..0000000
--- a/node_modules/core-js-pure/stable/set/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/set');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/anchor.js b/node_modules/core-js-pure/stable/string/anchor.js
deleted file mode 100644
index b9b7905..0000000
--- a/node_modules/core-js-pure/stable/string/anchor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/anchor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/big.js b/node_modules/core-js-pure/stable/string/big.js
deleted file mode 100644
index 9c118e5..0000000
--- a/node_modules/core-js-pure/stable/string/big.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/big');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/blink.js b/node_modules/core-js-pure/stable/string/blink.js
deleted file mode 100644
index 23ca24f..0000000
--- a/node_modules/core-js-pure/stable/string/blink.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/blink');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/bold.js b/node_modules/core-js-pure/stable/string/bold.js
deleted file mode 100644
index 322db3e..0000000
--- a/node_modules/core-js-pure/stable/string/bold.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/bold');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/code-point-at.js b/node_modules/core-js-pure/stable/string/code-point-at.js
deleted file mode 100644
index 033b94c..0000000
--- a/node_modules/core-js-pure/stable/string/code-point-at.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/code-point-at');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/ends-with.js b/node_modules/core-js-pure/stable/string/ends-with.js
deleted file mode 100644
index 2ea5594..0000000
--- a/node_modules/core-js-pure/stable/string/ends-with.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/ends-with');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/fixed.js b/node_modules/core-js-pure/stable/string/fixed.js
deleted file mode 100644
index c18b823..0000000
--- a/node_modules/core-js-pure/stable/string/fixed.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/fixed');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/fontcolor.js b/node_modules/core-js-pure/stable/string/fontcolor.js
deleted file mode 100644
index bb30ae6..0000000
--- a/node_modules/core-js-pure/stable/string/fontcolor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/fontcolor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/fontsize.js b/node_modules/core-js-pure/stable/string/fontsize.js
deleted file mode 100644
index 49060de..0000000
--- a/node_modules/core-js-pure/stable/string/fontsize.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/fontsize');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/from-code-point.js b/node_modules/core-js-pure/stable/string/from-code-point.js
deleted file mode 100644
index c56ee7c..0000000
--- a/node_modules/core-js-pure/stable/string/from-code-point.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/from-code-point');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/includes.js b/node_modules/core-js-pure/stable/string/includes.js
deleted file mode 100644
index cf7eea4..0000000
--- a/node_modules/core-js-pure/stable/string/includes.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/includes');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/index.js b/node_modules/core-js-pure/stable/string/index.js
deleted file mode 100644
index 9eda7c0..0000000
--- a/node_modules/core-js-pure/stable/string/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/italics.js b/node_modules/core-js-pure/stable/string/italics.js
deleted file mode 100644
index 8bee439..0000000
--- a/node_modules/core-js-pure/stable/string/italics.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/italics');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/iterator.js b/node_modules/core-js-pure/stable/string/iterator.js
deleted file mode 100644
index 64110cc..0000000
--- a/node_modules/core-js-pure/stable/string/iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/link.js b/node_modules/core-js-pure/stable/string/link.js
deleted file mode 100644
index d507726..0000000
--- a/node_modules/core-js-pure/stable/string/link.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/link');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/match-all.js b/node_modules/core-js-pure/stable/string/match-all.js
deleted file mode 100644
index 09cd361..0000000
--- a/node_modules/core-js-pure/stable/string/match-all.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/match-all');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/match.js b/node_modules/core-js-pure/stable/string/match.js
deleted file mode 100644
index 5b728da..0000000
--- a/node_modules/core-js-pure/stable/string/match.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/match');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/pad-end.js b/node_modules/core-js-pure/stable/string/pad-end.js
deleted file mode 100644
index 032903c..0000000
--- a/node_modules/core-js-pure/stable/string/pad-end.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/pad-end');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/pad-start.js b/node_modules/core-js-pure/stable/string/pad-start.js
deleted file mode 100644
index 440785b..0000000
--- a/node_modules/core-js-pure/stable/string/pad-start.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/pad-start');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/raw.js b/node_modules/core-js-pure/stable/string/raw.js
deleted file mode 100644
index 2ac2b74..0000000
--- a/node_modules/core-js-pure/stable/string/raw.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/raw');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/repeat.js b/node_modules/core-js-pure/stable/string/repeat.js
deleted file mode 100644
index 6d6848b..0000000
--- a/node_modules/core-js-pure/stable/string/repeat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/repeat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/replace.js b/node_modules/core-js-pure/stable/string/replace.js
deleted file mode 100644
index 48389e6..0000000
--- a/node_modules/core-js-pure/stable/string/replace.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/replace');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/search.js b/node_modules/core-js-pure/stable/string/search.js
deleted file mode 100644
index aaf356f..0000000
--- a/node_modules/core-js-pure/stable/string/search.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/search');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/small.js b/node_modules/core-js-pure/stable/string/small.js
deleted file mode 100644
index 47b79e0..0000000
--- a/node_modules/core-js-pure/stable/string/small.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/small');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/split.js b/node_modules/core-js-pure/stable/string/split.js
deleted file mode 100644
index 5ffbab7..0000000
--- a/node_modules/core-js-pure/stable/string/split.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/split');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/starts-with.js b/node_modules/core-js-pure/stable/string/starts-with.js
deleted file mode 100644
index f718778..0000000
--- a/node_modules/core-js-pure/stable/string/starts-with.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/starts-with');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/strike.js b/node_modules/core-js-pure/stable/string/strike.js
deleted file mode 100644
index 6c625c8..0000000
--- a/node_modules/core-js-pure/stable/string/strike.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/strike');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/sub.js b/node_modules/core-js-pure/stable/string/sub.js
deleted file mode 100644
index a4a66a0..0000000
--- a/node_modules/core-js-pure/stable/string/sub.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/sub');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/sup.js b/node_modules/core-js-pure/stable/string/sup.js
deleted file mode 100644
index abb1f6a..0000000
--- a/node_modules/core-js-pure/stable/string/sup.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/sup');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/trim-end.js b/node_modules/core-js-pure/stable/string/trim-end.js
deleted file mode 100644
index 37e8d3f..0000000
--- a/node_modules/core-js-pure/stable/string/trim-end.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/trim-end');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/trim-left.js b/node_modules/core-js-pure/stable/string/trim-left.js
deleted file mode 100644
index e11e7b7..0000000
--- a/node_modules/core-js-pure/stable/string/trim-left.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/trim-left');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/trim-right.js b/node_modules/core-js-pure/stable/string/trim-right.js
deleted file mode 100644
index 290f4fd..0000000
--- a/node_modules/core-js-pure/stable/string/trim-right.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/trim-right');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/trim-start.js b/node_modules/core-js-pure/stable/string/trim-start.js
deleted file mode 100644
index 9698852..0000000
--- a/node_modules/core-js-pure/stable/string/trim-start.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/trim-start');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/trim.js b/node_modules/core-js-pure/stable/string/trim.js
deleted file mode 100644
index 7a3a3b2..0000000
--- a/node_modules/core-js-pure/stable/string/trim.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/string/trim');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/anchor.js b/node_modules/core-js-pure/stable/string/virtual/anchor.js
deleted file mode 100644
index 52f270c..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/anchor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/anchor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/big.js b/node_modules/core-js-pure/stable/string/virtual/big.js
deleted file mode 100644
index e2c481b..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/big.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/big');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/blink.js b/node_modules/core-js-pure/stable/string/virtual/blink.js
deleted file mode 100644
index b804fd6..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/blink.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/blink');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/bold.js b/node_modules/core-js-pure/stable/string/virtual/bold.js
deleted file mode 100644
index fbe2f42..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/bold.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/bold');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/code-point-at.js b/node_modules/core-js-pure/stable/string/virtual/code-point-at.js
deleted file mode 100644
index 1a7e0f6..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/code-point-at.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/code-point-at');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/ends-with.js b/node_modules/core-js-pure/stable/string/virtual/ends-with.js
deleted file mode 100644
index e35b5d0..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/ends-with.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/ends-with');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/fixed.js b/node_modules/core-js-pure/stable/string/virtual/fixed.js
deleted file mode 100644
index 8c16126..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/fixed.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/fixed');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/fontcolor.js b/node_modules/core-js-pure/stable/string/virtual/fontcolor.js
deleted file mode 100644
index 5434150..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/fontcolor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/fontcolor');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/fontsize.js b/node_modules/core-js-pure/stable/string/virtual/fontsize.js
deleted file mode 100644
index f4b7144..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/fontsize.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/fontsize');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/includes.js b/node_modules/core-js-pure/stable/string/virtual/includes.js
deleted file mode 100644
index a6aee44..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/includes.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/includes');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/index.js b/node_modules/core-js-pure/stable/string/virtual/index.js
deleted file mode 100644
index 48250fb..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/italics.js b/node_modules/core-js-pure/stable/string/virtual/italics.js
deleted file mode 100644
index d35da33..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/italics.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/italics');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/iterator.js b/node_modules/core-js-pure/stable/string/virtual/iterator.js
deleted file mode 100644
index ffdb591..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/link.js b/node_modules/core-js-pure/stable/string/virtual/link.js
deleted file mode 100644
index 4c0c0cf..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/link.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/link');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/match-all.js b/node_modules/core-js-pure/stable/string/virtual/match-all.js
deleted file mode 100644
index 1fbccd4..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/match-all.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/match-all');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/pad-end.js b/node_modules/core-js-pure/stable/string/virtual/pad-end.js
deleted file mode 100644
index f1dcdf3..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/pad-end.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/pad-end');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/pad-start.js b/node_modules/core-js-pure/stable/string/virtual/pad-start.js
deleted file mode 100644
index 1e2afbc..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/pad-start.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/pad-start');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/repeat.js b/node_modules/core-js-pure/stable/string/virtual/repeat.js
deleted file mode 100644
index b8db5fc..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/repeat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/repeat');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/small.js b/node_modules/core-js-pure/stable/string/virtual/small.js
deleted file mode 100644
index 1dd357b..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/small.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/small');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/starts-with.js b/node_modules/core-js-pure/stable/string/virtual/starts-with.js
deleted file mode 100644
index 9a9145d..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/starts-with.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/starts-with');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/strike.js b/node_modules/core-js-pure/stable/string/virtual/strike.js
deleted file mode 100644
index 4aa28cc..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/strike.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/strike');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/sub.js b/node_modules/core-js-pure/stable/string/virtual/sub.js
deleted file mode 100644
index a1b2c3a..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/sub.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/sub');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/sup.js b/node_modules/core-js-pure/stable/string/virtual/sup.js
deleted file mode 100644
index dc604fe..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/sup.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/sup');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/trim-end.js b/node_modules/core-js-pure/stable/string/virtual/trim-end.js
deleted file mode 100644
index 04e5ad9..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/trim-end.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/trim-end');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/trim-left.js b/node_modules/core-js-pure/stable/string/virtual/trim-left.js
deleted file mode 100644
index 571fb01..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/trim-left.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/trim-left');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/trim-right.js b/node_modules/core-js-pure/stable/string/virtual/trim-right.js
deleted file mode 100644
index aab8b09..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/trim-right.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/trim-right');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/trim-start.js b/node_modules/core-js-pure/stable/string/virtual/trim-start.js
deleted file mode 100644
index c7fd1b2..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/trim-start.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/trim-start');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/string/virtual/trim.js b/node_modules/core-js-pure/stable/string/virtual/trim.js
deleted file mode 100644
index d95c2e1..0000000
--- a/node_modules/core-js-pure/stable/string/virtual/trim.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../../es/string/virtual/trim');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/async-iterator.js b/node_modules/core-js-pure/stable/symbol/async-iterator.js
deleted file mode 100644
index a624329..0000000
--- a/node_modules/core-js-pure/stable/symbol/async-iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/async-iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/description.js b/node_modules/core-js-pure/stable/symbol/description.js
deleted file mode 100644
index 7bb4b2b..0000000
--- a/node_modules/core-js-pure/stable/symbol/description.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.symbol.description');
diff --git a/node_modules/core-js-pure/stable/symbol/for.js b/node_modules/core-js-pure/stable/symbol/for.js
deleted file mode 100644
index 28b29ae..0000000
--- a/node_modules/core-js-pure/stable/symbol/for.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/for');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/has-instance.js b/node_modules/core-js-pure/stable/symbol/has-instance.js
deleted file mode 100644
index 0334558..0000000
--- a/node_modules/core-js-pure/stable/symbol/has-instance.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/has-instance');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/index.js b/node_modules/core-js-pure/stable/symbol/index.js
deleted file mode 100644
index 2fb7ba5..0000000
--- a/node_modules/core-js-pure/stable/symbol/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/is-concat-spreadable.js b/node_modules/core-js-pure/stable/symbol/is-concat-spreadable.js
deleted file mode 100644
index 7dc1d26..0000000
--- a/node_modules/core-js-pure/stable/symbol/is-concat-spreadable.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/is-concat-spreadable');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/iterator.js b/node_modules/core-js-pure/stable/symbol/iterator.js
deleted file mode 100644
index 78f0139..0000000
--- a/node_modules/core-js-pure/stable/symbol/iterator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/iterator');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/key-for.js b/node_modules/core-js-pure/stable/symbol/key-for.js
deleted file mode 100644
index 4f76f82..0000000
--- a/node_modules/core-js-pure/stable/symbol/key-for.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/key-for');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/match-all.js b/node_modules/core-js-pure/stable/symbol/match-all.js
deleted file mode 100644
index 6be4444..0000000
--- a/node_modules/core-js-pure/stable/symbol/match-all.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/match-all');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/match.js b/node_modules/core-js-pure/stable/symbol/match.js
deleted file mode 100644
index 2a502e4..0000000
--- a/node_modules/core-js-pure/stable/symbol/match.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/match');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/replace.js b/node_modules/core-js-pure/stable/symbol/replace.js
deleted file mode 100644
index 225f7fe..0000000
--- a/node_modules/core-js-pure/stable/symbol/replace.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/replace');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/search.js b/node_modules/core-js-pure/stable/symbol/search.js
deleted file mode 100644
index dd25b55..0000000
--- a/node_modules/core-js-pure/stable/symbol/search.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/search');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/species.js b/node_modules/core-js-pure/stable/symbol/species.js
deleted file mode 100644
index 6d3c418..0000000
--- a/node_modules/core-js-pure/stable/symbol/species.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/species');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/split.js b/node_modules/core-js-pure/stable/symbol/split.js
deleted file mode 100644
index 209b212..0000000
--- a/node_modules/core-js-pure/stable/symbol/split.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/split');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/to-primitive.js b/node_modules/core-js-pure/stable/symbol/to-primitive.js
deleted file mode 100644
index cd15ff5..0000000
--- a/node_modules/core-js-pure/stable/symbol/to-primitive.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/to-primitive');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/to-string-tag.js b/node_modules/core-js-pure/stable/symbol/to-string-tag.js
deleted file mode 100644
index 6948350..0000000
--- a/node_modules/core-js-pure/stable/symbol/to-string-tag.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/to-string-tag');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/symbol/unscopables.js b/node_modules/core-js-pure/stable/symbol/unscopables.js
deleted file mode 100644
index a9d7820..0000000
--- a/node_modules/core-js-pure/stable/symbol/unscopables.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/symbol/unscopables');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/typed-array/copy-within.js b/node_modules/core-js-pure/stable/typed-array/copy-within.js
deleted file mode 100644
index 1352cec..0000000
--- a/node_modules/core-js-pure/stable/typed-array/copy-within.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.copy-within');
diff --git a/node_modules/core-js-pure/stable/typed-array/entries.js b/node_modules/core-js-pure/stable/typed-array/entries.js
deleted file mode 100644
index 66cc6dc..0000000
--- a/node_modules/core-js-pure/stable/typed-array/entries.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.iterator');
diff --git a/node_modules/core-js-pure/stable/typed-array/every.js b/node_modules/core-js-pure/stable/typed-array/every.js
deleted file mode 100644
index 681164b..0000000
--- a/node_modules/core-js-pure/stable/typed-array/every.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.every');
diff --git a/node_modules/core-js-pure/stable/typed-array/fill.js b/node_modules/core-js-pure/stable/typed-array/fill.js
deleted file mode 100644
index 4d92ac6..0000000
--- a/node_modules/core-js-pure/stable/typed-array/fill.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.fill');
diff --git a/node_modules/core-js-pure/stable/typed-array/filter.js b/node_modules/core-js-pure/stable/typed-array/filter.js
deleted file mode 100644
index 7d0a630..0000000
--- a/node_modules/core-js-pure/stable/typed-array/filter.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.filter');
diff --git a/node_modules/core-js-pure/stable/typed-array/find-index.js b/node_modules/core-js-pure/stable/typed-array/find-index.js
deleted file mode 100644
index 039cd5e..0000000
--- a/node_modules/core-js-pure/stable/typed-array/find-index.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.find-index');
diff --git a/node_modules/core-js-pure/stable/typed-array/find.js b/node_modules/core-js-pure/stable/typed-array/find.js
deleted file mode 100644
index b3251b9..0000000
--- a/node_modules/core-js-pure/stable/typed-array/find.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.find');
diff --git a/node_modules/core-js-pure/stable/typed-array/float32-array.js b/node_modules/core-js-pure/stable/typed-array/float32-array.js
deleted file mode 100644
index c16ee63..0000000
--- a/node_modules/core-js-pure/stable/typed-array/float32-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/float32-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/typed-array/float64-array.js b/node_modules/core-js-pure/stable/typed-array/float64-array.js
deleted file mode 100644
index 445dc3d..0000000
--- a/node_modules/core-js-pure/stable/typed-array/float64-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/float64-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/typed-array/for-each.js b/node_modules/core-js-pure/stable/typed-array/for-each.js
deleted file mode 100644
index defe03a..0000000
--- a/node_modules/core-js-pure/stable/typed-array/for-each.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.for-each');
diff --git a/node_modules/core-js-pure/stable/typed-array/from.js b/node_modules/core-js-pure/stable/typed-array/from.js
deleted file mode 100644
index e0f3444..0000000
--- a/node_modules/core-js-pure/stable/typed-array/from.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.from');
diff --git a/node_modules/core-js-pure/stable/typed-array/includes.js b/node_modules/core-js-pure/stable/typed-array/includes.js
deleted file mode 100644
index 5ff65f9..0000000
--- a/node_modules/core-js-pure/stable/typed-array/includes.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.includes');
diff --git a/node_modules/core-js-pure/stable/typed-array/index-of.js b/node_modules/core-js-pure/stable/typed-array/index-of.js
deleted file mode 100644
index 87081c0..0000000
--- a/node_modules/core-js-pure/stable/typed-array/index-of.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.index-of');
diff --git a/node_modules/core-js-pure/stable/typed-array/index.js b/node_modules/core-js-pure/stable/typed-array/index.js
deleted file mode 100644
index 20a271d..0000000
--- a/node_modules/core-js-pure/stable/typed-array/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/typed-array/int16-array.js b/node_modules/core-js-pure/stable/typed-array/int16-array.js
deleted file mode 100644
index 7ffdbae..0000000
--- a/node_modules/core-js-pure/stable/typed-array/int16-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/int16-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/typed-array/int32-array.js b/node_modules/core-js-pure/stable/typed-array/int32-array.js
deleted file mode 100644
index bd2e75a..0000000
--- a/node_modules/core-js-pure/stable/typed-array/int32-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/int32-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/typed-array/int8-array.js b/node_modules/core-js-pure/stable/typed-array/int8-array.js
deleted file mode 100644
index 8f1a54b..0000000
--- a/node_modules/core-js-pure/stable/typed-array/int8-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/int8-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/typed-array/iterator.js b/node_modules/core-js-pure/stable/typed-array/iterator.js
deleted file mode 100644
index 66cc6dc..0000000
--- a/node_modules/core-js-pure/stable/typed-array/iterator.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.iterator');
diff --git a/node_modules/core-js-pure/stable/typed-array/join.js b/node_modules/core-js-pure/stable/typed-array/join.js
deleted file mode 100644
index 431129c..0000000
--- a/node_modules/core-js-pure/stable/typed-array/join.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.join');
diff --git a/node_modules/core-js-pure/stable/typed-array/keys.js b/node_modules/core-js-pure/stable/typed-array/keys.js
deleted file mode 100644
index 66cc6dc..0000000
--- a/node_modules/core-js-pure/stable/typed-array/keys.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.iterator');
diff --git a/node_modules/core-js-pure/stable/typed-array/last-index-of.js b/node_modules/core-js-pure/stable/typed-array/last-index-of.js
deleted file mode 100644
index 5682bf4..0000000
--- a/node_modules/core-js-pure/stable/typed-array/last-index-of.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.last-index-of');
diff --git a/node_modules/core-js-pure/stable/typed-array/map.js b/node_modules/core-js-pure/stable/typed-array/map.js
deleted file mode 100644
index db08fed..0000000
--- a/node_modules/core-js-pure/stable/typed-array/map.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.map');
diff --git a/node_modules/core-js-pure/stable/typed-array/of.js b/node_modules/core-js-pure/stable/typed-array/of.js
deleted file mode 100644
index 121bf5e..0000000
--- a/node_modules/core-js-pure/stable/typed-array/of.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.of');
diff --git a/node_modules/core-js-pure/stable/typed-array/reduce-right.js b/node_modules/core-js-pure/stable/typed-array/reduce-right.js
deleted file mode 100644
index cbd321f..0000000
--- a/node_modules/core-js-pure/stable/typed-array/reduce-right.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.reduce-right');
diff --git a/node_modules/core-js-pure/stable/typed-array/reduce.js b/node_modules/core-js-pure/stable/typed-array/reduce.js
deleted file mode 100644
index e2a6f28..0000000
--- a/node_modules/core-js-pure/stable/typed-array/reduce.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.reduce');
diff --git a/node_modules/core-js-pure/stable/typed-array/reverse.js b/node_modules/core-js-pure/stable/typed-array/reverse.js
deleted file mode 100644
index 14995f4..0000000
--- a/node_modules/core-js-pure/stable/typed-array/reverse.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.reverse');
diff --git a/node_modules/core-js-pure/stable/typed-array/set.js b/node_modules/core-js-pure/stable/typed-array/set.js
deleted file mode 100644
index 5330e22..0000000
--- a/node_modules/core-js-pure/stable/typed-array/set.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.set');
diff --git a/node_modules/core-js-pure/stable/typed-array/slice.js b/node_modules/core-js-pure/stable/typed-array/slice.js
deleted file mode 100644
index 37fb8c1..0000000
--- a/node_modules/core-js-pure/stable/typed-array/slice.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.slice');
diff --git a/node_modules/core-js-pure/stable/typed-array/some.js b/node_modules/core-js-pure/stable/typed-array/some.js
deleted file mode 100644
index 495c322..0000000
--- a/node_modules/core-js-pure/stable/typed-array/some.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.some');
diff --git a/node_modules/core-js-pure/stable/typed-array/sort.js b/node_modules/core-js-pure/stable/typed-array/sort.js
deleted file mode 100644
index d6c7e30..0000000
--- a/node_modules/core-js-pure/stable/typed-array/sort.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.sort');
diff --git a/node_modules/core-js-pure/stable/typed-array/subarray.js b/node_modules/core-js-pure/stable/typed-array/subarray.js
deleted file mode 100644
index dbad4ca..0000000
--- a/node_modules/core-js-pure/stable/typed-array/subarray.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.subarray');
diff --git a/node_modules/core-js-pure/stable/typed-array/to-locale-string.js b/node_modules/core-js-pure/stable/typed-array/to-locale-string.js
deleted file mode 100644
index 12c809e..0000000
--- a/node_modules/core-js-pure/stable/typed-array/to-locale-string.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.to-locale-string');
diff --git a/node_modules/core-js-pure/stable/typed-array/to-string.js b/node_modules/core-js-pure/stable/typed-array/to-string.js
deleted file mode 100644
index bf94160..0000000
--- a/node_modules/core-js-pure/stable/typed-array/to-string.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.to-string');
diff --git a/node_modules/core-js-pure/stable/typed-array/uint16-array.js b/node_modules/core-js-pure/stable/typed-array/uint16-array.js
deleted file mode 100644
index f35dc05..0000000
--- a/node_modules/core-js-pure/stable/typed-array/uint16-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/uint16-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/typed-array/uint32-array.js b/node_modules/core-js-pure/stable/typed-array/uint32-array.js
deleted file mode 100644
index 197c8de..0000000
--- a/node_modules/core-js-pure/stable/typed-array/uint32-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/uint32-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/typed-array/uint8-array.js b/node_modules/core-js-pure/stable/typed-array/uint8-array.js
deleted file mode 100644
index 7d853e4..0000000
--- a/node_modules/core-js-pure/stable/typed-array/uint8-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/uint8-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/typed-array/uint8-clamped-array.js b/node_modules/core-js-pure/stable/typed-array/uint8-clamped-array.js
deleted file mode 100644
index a1e131c..0000000
--- a/node_modules/core-js-pure/stable/typed-array/uint8-clamped-array.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/typed-array/uint8-clamped-array');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/typed-array/values.js b/node_modules/core-js-pure/stable/typed-array/values.js
deleted file mode 100644
index 66cc6dc..0000000
--- a/node_modules/core-js-pure/stable/typed-array/values.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/es.typed-array.iterator');
diff --git a/node_modules/core-js-pure/stable/url-search-params/index.js b/node_modules/core-js-pure/stable/url-search-params/index.js
deleted file mode 100644
index bf9b50d..0000000
--- a/node_modules/core-js-pure/stable/url-search-params/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../web/url-search-params');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/url/index.js b/node_modules/core-js-pure/stable/url/index.js
deleted file mode 100644
index 750f27f..0000000
--- a/node_modules/core-js-pure/stable/url/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../web/url');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/url/to-json.js b/node_modules/core-js-pure/stable/url/to-json.js
deleted file mode 100644
index 0d841b6..0000000
--- a/node_modules/core-js-pure/stable/url/to-json.js
+++ /dev/null
@@ -1 +0,0 @@
-require('../../modules/web.url.to-json');
diff --git a/node_modules/core-js-pure/stable/weak-map/index.js b/node_modules/core-js-pure/stable/weak-map/index.js
deleted file mode 100644
index 0722356..0000000
--- a/node_modules/core-js-pure/stable/weak-map/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/weak-map');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stable/weak-set/index.js b/node_modules/core-js-pure/stable/weak-set/index.js
deleted file mode 100644
index 0dd555c..0000000
--- a/node_modules/core-js-pure/stable/weak-set/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var parent = require('../../es/weak-set');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stage/0.js b/node_modules/core-js-pure/stage/0.js
deleted file mode 100644
index bdcf27a..0000000
--- a/node_modules/core-js-pure/stage/0.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('../proposals/efficient-64-bit-arithmetic');
-require('../proposals/string-at');
-require('../proposals/url');
-var parent = require('./1');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stage/1.js b/node_modules/core-js-pure/stage/1.js
deleted file mode 100644
index bff9b62..0000000
--- a/node_modules/core-js-pure/stage/1.js
+++ /dev/null
@@ -1,16 +0,0 @@
-require('../proposals/array-last');
-require('../proposals/collection-methods');
-require('../proposals/collection-of-from');
-require('../proposals/keys-composition');
-require('../proposals/math-extensions');
-require('../proposals/math-signbit');
-require('../proposals/number-from-string');
-require('../proposals/object-iteration');
-require('../proposals/observable');
-require('../proposals/pattern-matching');
-require('../proposals/promise-try');
-require('../proposals/seeded-random');
-require('../proposals/string-code-points');
-var parent = require('./2');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stage/2.js b/node_modules/core-js-pure/stage/2.js
deleted file mode 100644
index ce3af1a..0000000
--- a/node_modules/core-js-pure/stage/2.js
+++ /dev/null
@@ -1,8 +0,0 @@
-require('../proposals/array-is-template-object');
-require('../proposals/iterator-helpers');
-require('../proposals/map-upsert');
-require('../proposals/set-methods');
-require('../proposals/using-statement');
-var parent = require('./3');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stage/3.js b/node_modules/core-js-pure/stage/3.js
deleted file mode 100644
index 4d694c9..0000000
--- a/node_modules/core-js-pure/stage/3.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../proposals/promise-any');
-require('../proposals/string-replace-all');
-var parent = require('./4');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/stage/4.js b/node_modules/core-js-pure/stage/4.js
deleted file mode 100644
index b9b4497..0000000
--- a/node_modules/core-js-pure/stage/4.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('../proposals/global-this');
-require('../proposals/promise-all-settled');
-require('../proposals/string-match-all');
-var path = require('../internals/path');
-
-module.exports = path;
diff --git a/node_modules/core-js-pure/stage/README.md b/node_modules/core-js-pure/stage/README.md
deleted file mode 100644
index 0da7eae..0000000
--- a/node_modules/core-js-pure/stage/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This folder contains entry points for [ECMAScript proposals](https://github.com/zloirock/core-js/tree/v3#ecmascript-proposals) with dependencies.
diff --git a/node_modules/core-js-pure/stage/index.js b/node_modules/core-js-pure/stage/index.js
deleted file mode 100644
index 942545c..0000000
--- a/node_modules/core-js-pure/stage/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var proposals = require('./pre');
-
-module.exports = proposals;
diff --git a/node_modules/core-js-pure/stage/pre.js b/node_modules/core-js-pure/stage/pre.js
deleted file mode 100644
index e37249e..0000000
--- a/node_modules/core-js-pure/stage/pre.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../proposals/reflect-metadata');
-var parent = require('./0');
-
-module.exports = parent;
diff --git a/node_modules/core-js-pure/web/README.md b/node_modules/core-js-pure/web/README.md
deleted file mode 100644
index 40ff72a..0000000
--- a/node_modules/core-js-pure/web/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This folder contains entry points for features from [WHATWG / W3C](https://github.com/zloirock/core-js/tree/v3#web-standards) with dependencies.
diff --git a/node_modules/core-js-pure/web/dom-collections.js b/node_modules/core-js-pure/web/dom-collections.js
deleted file mode 100644
index 0a5fe03..0000000
--- a/node_modules/core-js-pure/web/dom-collections.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('../modules/web.dom-collections.for-each');
-require('../modules/web.dom-collections.iterator');
-var path = require('../internals/path');
-
-module.exports = path;
diff --git a/node_modules/core-js-pure/web/immediate.js b/node_modules/core-js-pure/web/immediate.js
deleted file mode 100644
index 2f0c025..0000000
--- a/node_modules/core-js-pure/web/immediate.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/web.immediate');
-var path = require('../internals/path');
-
-module.exports = path;
diff --git a/node_modules/core-js-pure/web/index.js b/node_modules/core-js-pure/web/index.js
deleted file mode 100644
index 9f13832..0000000
--- a/node_modules/core-js-pure/web/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-require('../modules/web.dom-collections.for-each');
-require('../modules/web.dom-collections.iterator');
-require('../modules/web.immediate');
-require('../modules/web.queue-microtask');
-require('../modules/web.timers');
-require('../modules/web.url');
-require('../modules/web.url.to-json');
-require('../modules/web.url-search-params');
-var path = require('../internals/path');
-
-module.exports = path;
diff --git a/node_modules/core-js-pure/web/queue-microtask.js b/node_modules/core-js-pure/web/queue-microtask.js
deleted file mode 100644
index 10f9f30..0000000
--- a/node_modules/core-js-pure/web/queue-microtask.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/web.queue-microtask');
-var path = require('../internals/path');
-
-module.exports = path.queueMicrotask;
diff --git a/node_modules/core-js-pure/web/timers.js b/node_modules/core-js-pure/web/timers.js
deleted file mode 100644
index 9c4106f..0000000
--- a/node_modules/core-js-pure/web/timers.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/web.timers');
-var path = require('../internals/path');
-
-module.exports = path;
diff --git a/node_modules/core-js-pure/web/url-search-params.js b/node_modules/core-js-pure/web/url-search-params.js
deleted file mode 100644
index 9434608..0000000
--- a/node_modules/core-js-pure/web/url-search-params.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require('../modules/web.url-search-params');
-var path = require('../internals/path');
-
-module.exports = path.URLSearchParams;
diff --git a/node_modules/core-js-pure/web/url.js b/node_modules/core-js-pure/web/url.js
deleted file mode 100644
index 2faed2e..0000000
--- a/node_modules/core-js-pure/web/url.js
+++ /dev/null
@@ -1,6 +0,0 @@
-require('../modules/web.url');
-require('../modules/web.url.to-json');
-require('../modules/web.url-search-params');
-var path = require('../internals/path');
-
-module.exports = path.URL;
diff --git a/node_modules/cross-fetch/LICENSE b/node_modules/cross-fetch/LICENSE
deleted file mode 100644
index 9198b86..0000000
--- a/node_modules/cross-fetch/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2017 Leonardo Quixadá
-
-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/node_modules/cross-fetch/README.md b/node_modules/cross-fetch/README.md
deleted file mode 100644
index 63571e2..0000000
--- a/node_modules/cross-fetch/README.md
+++ /dev/null
@@ -1,190 +0,0 @@
-cross-fetch<br>
-[![Build Status](https://travis-ci.org/lquixada/cross-fetch.svg?branch=master)](https://travis-ci.org/lquixada/cross-fetch)
-[![Build Status](https://saucelabs.com/buildstatus/cross-fetch)](https://saucelabs.com/u/cross-fetch)
-[![codecov](https://codecov.io/gh/lquixada/cross-fetch/branch/master/graph/badge.svg)](https://codecov.io/gh/lquixada/cross-fetch)
-[![dependencies Status](https://david-dm.org/lquixada/cross-fetch/status.svg)](https://david-dm.org/lquixada/cross-fetch)
-[![NPM Version](https://img.shields.io/npm/v/cross-fetch.svg?branch=master)](https://www.npmjs.com/package/cross-fetch)
-[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
-================
-
-Universal WHATWG Fetch API for Node, Browsers and React Native. The scenario that cross-fetch really shines is when the same javascript codebase needs to run on different platforms.
-
-- **Platform agnostic**: browsers, node or react native
-- **Optional polyfill**: it's up to you if something is going to be added to the global object or not
-- **Simple interface**: no instantiation, no configuration and no extra dependency
-- **WHATWG compliant**: it works the same way wherever your code runs
-- **Updated**: lastest version of whatwg-fetch and node-fetch used
-
-
-* * *
-
-## Table of Contents
-
--   [Install](#install)
--   [Usage](#usage)
--   [Demo & API](#demo--api)
--   [FAQ](#faq)
--   [Supported environments](#supported-environments)
--   [Thanks](#thanks)
--   [License](#license)
--   [Author](#author)
--   [Sponsors](#sponsors)
-
-* * *
-
-## Install
-
-```sh
-npm install --save cross-fetch
-```
-
-As a [ponyfill](https://github.com/sindresorhus/ponyfill):
-
-```javascript
-// Using ES6 modules with Babel or TypeScript
-import fetch from 'cross-fetch';
-
-// Using CommonJS modules
-const fetch = require('cross-fetch');
-```
-
-As a polyfill:
-
-```javascript
-// Using ES6 modules
-import 'cross-fetch/polyfill';
-
-// Using CommonJS modules
-require('cross-fetch/polyfill');
-```
-
-
-The CDN build is also available on unpkg:
-
-```html
-<script src="//unpkg.com/cross-fetch/dist/cross-fetch.js"></script>
-```
-
-This adds the fetch function to the window object. Note that this is not UMD compatible.
-
-
-* * *
-
-## Usage
-
-With [promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise):
-
-```javascript
-import fetch from 'cross-fetch';
-// Or just: import 'cross-fetch/polyfill';
-
-fetch('//api.github.com/users/lquixada')
-  .then(res => {
-    if (res.status >= 400) {
-      throw new Error("Bad response from server");
-    }
-    return res.json();
-  })
-  .then(user => {
-    console.log(user);
-  })
-  .catch(err => {
-    console.error(err);
-  });
-```
-
-With [async/await](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function):
-
-```javascript
-import fetch from 'cross-fetch';
-// Or just: import 'cross-fetch/polyfill';
-
-(async () => {
-  try {
-    const res = await fetch('//api.github.com/users/lquixada');
-    
-    if (res.status >= 400) {
-      throw new Error("Bad response from server");
-    }
-    
-    const user = await res.json();
-  
-    console.log(user);
-  } catch (err) {
-    console.error(err);
-  }
-})();
-```
-
-> ⚠️ **Warning**: If you're in an environment that doesn't support Promises such as Internet Explorer, you must install an ES6 Promise compatible polyfill. [es6-promise](https://github.com/jakearchibald/es6-promise) is suggested.
-
-
-## Demo & API
-
-You can find a comprehensive doc at [Github's fetch](https://github.github.io/fetch/) page. If you want to play with cross-fetch, these resources can be useful:
-
-* [**JSFiddle playground**](https://jsfiddle.net/lquixada/3ypqgacp/) ➡️
-* [**Public test suite**](https://lquixada.github.io/cross-fetch/test/saucelabs/) ➡️
-
-> **Tip**: Run theses resources on various browsers and with different settings (for instance: cross-domain requests, wrong urls or text requests). Don't forget to open the console in the test suite page and play around.
-
-
-## FAQ
-
-#### Yet another fetch library?
-
-I did a lot of research in order to find a fetch library that could be simple, cross-platorm and provide polyfill as an option. There's a plethora of libs out there but none could match those requirements.
-
-
-#### Why not isomorphic-fetch?
-
-My preferred library used to be [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch) but it has this [bug](https://github.com/matthew-andrews/isomorphic-fetch/issues/125) that prevents it from running in a react native environment. It seems it will never be fixed since the author hasn't been commiting for more than a year. That means dependencies are outdated as well. 
-
-
-#### Why polyfill might not be a good idea?
-
-In a word? Risk. If the spec changes in the future, it might be problematic to debug. Read more about it on [sindresorhus's ponyfill](https://github.com/sindresorhus/ponyfill#how-are-ponyfills-better-than-polyfills) page. It's up to you if you're fine with it or not.
-
-
-#### How does cross-fetch work?
-
-Just like isomorphic-fetch, it is just a proxy. If you're in node, it delivers you the [node-fetch](https://www.npmjs.com/package/node-fetch) library, if you're in a browser or React Native, it delivers you the github's [whatwg-fetch](https://github.com/github/fetch/). The same strategy applies whether you're using polyfill or ponyfill.
-
-
-## Who's Using It?
-
-* [VulcanJS](http://vulcanjs.org)
-* [graphql-request](https://github.com/graphcool/graphql-request)
-* [Swagger](https://swagger.io/)
-
-
-## Supported environments
-
-* Node 6+
-* React-Native
-
-[![Build Status](https://saucelabs.com/browser-matrix/cross-fetch.svg)](https://saucelabs.com/u/cross-fetch)
-
-
-## Thanks
-
-Heavily inspired by the works of [matthew-andrews](https://github.com/matthew-andrews). Kudos to him!
-
-
-## License
-
-cross-fetch is licensed under the [MIT license](https://github.com/lquixada/cross-fetch/blob/master/LICENSE) © [Leonardo Quixadá](https://twitter.com/lquixada/)
-
-
-## Author
-
-|[![@lquixada](https://avatars0.githubusercontent.com/u/195494?v=4&s=96)](https://github.com/lquixada)|
-|:---:|
-|[@lquixada](http://www.github.com/lquixada)|
-
-
-## Sponsors
-
-Manual cross-browser testing is provided by the following sponsor:
-
-[![BrowserStack](./assets/browserstack-logo.png)](https://www.browserstack.com/)
diff --git a/node_modules/cross-fetch/dist/browser-polyfill.js b/node_modules/cross-fetch/dist/browser-polyfill.js
deleted file mode 100644
index 202b8ba..0000000
--- a/node_modules/cross-fetch/dist/browser-polyfill.js
+++ /dev/null
@@ -1,465 +0,0 @@
-(function(self) {
-
-  if (self.fetch) {
-    return
-  }
-
-  var support = {
-    searchParams: 'URLSearchParams' in self,
-    iterable: 'Symbol' in self && 'iterator' in Symbol,
-    blob: 'FileReader' in self && 'Blob' in self && (function() {
-      try {
-        new Blob();
-        return true
-      } catch(e) {
-        return false
-      }
-    })(),
-    formData: 'FormData' in self,
-    arrayBuffer: 'ArrayBuffer' in self
-  };
-
-  if (support.arrayBuffer) {
-    var viewClasses = [
-      '[object Int8Array]',
-      '[object Uint8Array]',
-      '[object Uint8ClampedArray]',
-      '[object Int16Array]',
-      '[object Uint16Array]',
-      '[object Int32Array]',
-      '[object Uint32Array]',
-      '[object Float32Array]',
-      '[object Float64Array]'
-    ];
-
-    var isDataView = function(obj) {
-      return obj && DataView.prototype.isPrototypeOf(obj)
-    };
-
-    var isArrayBufferView = ArrayBuffer.isView || function(obj) {
-      return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
-    };
-  }
-
-  function normalizeName(name) {
-    if (typeof name !== 'string') {
-      name = String(name);
-    }
-    if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
-      throw new TypeError('Invalid character in header field name')
-    }
-    return name.toLowerCase()
-  }
-
-  function normalizeValue(value) {
-    if (typeof value !== 'string') {
-      value = String(value);
-    }
-    return value
-  }
-
-  // Build a destructive iterator for the value list
-  function iteratorFor(items) {
-    var iterator = {
-      next: function() {
-        var value = items.shift();
-        return {done: value === undefined, value: value}
-      }
-    };
-
-    if (support.iterable) {
-      iterator[Symbol.iterator] = function() {
-        return iterator
-      };
-    }
-
-    return iterator
-  }
-
-  function Headers(headers) {
-    this.map = {};
-
-    if (headers instanceof Headers) {
-      headers.forEach(function(value, name) {
-        this.append(name, value);
-      }, this);
-    } else if (Array.isArray(headers)) {
-      headers.forEach(function(header) {
-        this.append(header[0], header[1]);
-      }, this);
-    } else if (headers) {
-      Object.getOwnPropertyNames(headers).forEach(function(name) {
-        this.append(name, headers[name]);
-      }, this);
-    }
-  }
-
-  Headers.prototype.append = function(name, value) {
-    name = normalizeName(name);
-    value = normalizeValue(value);
-    var oldValue = this.map[name];
-    this.map[name] = oldValue ? oldValue+','+value : value;
-  };
-
-  Headers.prototype['delete'] = function(name) {
-    delete this.map[normalizeName(name)];
-  };
-
-  Headers.prototype.get = function(name) {
-    name = normalizeName(name);
-    return this.has(name) ? this.map[name] : null
-  };
-
-  Headers.prototype.has = function(name) {
-    return this.map.hasOwnProperty(normalizeName(name))
-  };
-
-  Headers.prototype.set = function(name, value) {
-    this.map[normalizeName(name)] = normalizeValue(value);
-  };
-
-  Headers.prototype.forEach = function(callback, thisArg) {
-    for (var name in this.map) {
-      if (this.map.hasOwnProperty(name)) {
-        callback.call(thisArg, this.map[name], name, this);
-      }
-    }
-  };
-
-  Headers.prototype.keys = function() {
-    var items = [];
-    this.forEach(function(value, name) { items.push(name); });
-    return iteratorFor(items)
-  };
-
-  Headers.prototype.values = function() {
-    var items = [];
-    this.forEach(function(value) { items.push(value); });
-    return iteratorFor(items)
-  };
-
-  Headers.prototype.entries = function() {
-    var items = [];
-    this.forEach(function(value, name) { items.push([name, value]); });
-    return iteratorFor(items)
-  };
-
-  if (support.iterable) {
-    Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
-  }
-
-  function consumed(body) {
-    if (body.bodyUsed) {
-      return Promise.reject(new TypeError('Already read'))
-    }
-    body.bodyUsed = true;
-  }
-
-  function fileReaderReady(reader) {
-    return new Promise(function(resolve, reject) {
-      reader.onload = function() {
-        resolve(reader.result);
-      };
-      reader.onerror = function() {
-        reject(reader.error);
-      };
-    })
-  }
-
-  function readBlobAsArrayBuffer(blob) {
-    var reader = new FileReader();
-    var promise = fileReaderReady(reader);
-    reader.readAsArrayBuffer(blob);
-    return promise
-  }
-
-  function readBlobAsText(blob) {
-    var reader = new FileReader();
-    var promise = fileReaderReady(reader);
-    reader.readAsText(blob);
-    return promise
-  }
-
-  function readArrayBufferAsText(buf) {
-    var view = new Uint8Array(buf);
-    var chars = new Array(view.length);
-
-    for (var i = 0; i < view.length; i++) {
-      chars[i] = String.fromCharCode(view[i]);
-    }
-    return chars.join('')
-  }
-
-  function bufferClone(buf) {
-    if (buf.slice) {
-      return buf.slice(0)
-    } else {
-      var view = new Uint8Array(buf.byteLength);
-      view.set(new Uint8Array(buf));
-      return view.buffer
-    }
-  }
-
-  function Body() {
-    this.bodyUsed = false;
-
-    this._initBody = function(body) {
-      this._bodyInit = body;
-      if (!body) {
-        this._bodyText = '';
-      } else if (typeof body === 'string') {
-        this._bodyText = body;
-      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
-        this._bodyBlob = body;
-      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
-        this._bodyFormData = body;
-      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
-        this._bodyText = body.toString();
-      } else if (support.arrayBuffer && support.blob && isDataView(body)) {
-        this._bodyArrayBuffer = bufferClone(body.buffer);
-        // IE 10-11 can't handle a DataView body.
-        this._bodyInit = new Blob([this._bodyArrayBuffer]);
-      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
-        this._bodyArrayBuffer = bufferClone(body);
-      } else {
-        throw new Error('unsupported BodyInit type')
-      }
-
-      if (!this.headers.get('content-type')) {
-        if (typeof body === 'string') {
-          this.headers.set('content-type', 'text/plain;charset=UTF-8');
-        } else if (this._bodyBlob && this._bodyBlob.type) {
-          this.headers.set('content-type', this._bodyBlob.type);
-        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
-          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
-        }
-      }
-    };
-
-    if (support.blob) {
-      this.blob = function() {
-        var rejected = consumed(this);
-        if (rejected) {
-          return rejected
-        }
-
-        if (this._bodyBlob) {
-          return Promise.resolve(this._bodyBlob)
-        } else if (this._bodyArrayBuffer) {
-          return Promise.resolve(new Blob([this._bodyArrayBuffer]))
-        } else if (this._bodyFormData) {
-          throw new Error('could not read FormData body as blob')
-        } else {
-          return Promise.resolve(new Blob([this._bodyText]))
-        }
-      };
-
-      this.arrayBuffer = function() {
-        if (this._bodyArrayBuffer) {
-          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
-        } else {
-          return this.blob().then(readBlobAsArrayBuffer)
-        }
-      };
-    }
-
-    this.text = function() {
-      var rejected = consumed(this);
-      if (rejected) {
-        return rejected
-      }
-
-      if (this._bodyBlob) {
-        return readBlobAsText(this._bodyBlob)
-      } else if (this._bodyArrayBuffer) {
-        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
-      } else if (this._bodyFormData) {
-        throw new Error('could not read FormData body as text')
-      } else {
-        return Promise.resolve(this._bodyText)
-      }
-    };
-
-    if (support.formData) {
-      this.formData = function() {
-        return this.text().then(decode)
-      };
-    }
-
-    this.json = function() {
-      return this.text().then(JSON.parse)
-    };
-
-    return this
-  }
-
-  // HTTP methods whose capitalization should be normalized
-  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
-
-  function normalizeMethod(method) {
-    var upcased = method.toUpperCase();
-    return (methods.indexOf(upcased) > -1) ? upcased : method
-  }
-
-  function Request(input, options) {
-    options = options || {};
-    var body = options.body;
-
-    if (input instanceof Request) {
-      if (input.bodyUsed) {
-        throw new TypeError('Already read')
-      }
-      this.url = input.url;
-      this.credentials = input.credentials;
-      if (!options.headers) {
-        this.headers = new Headers(input.headers);
-      }
-      this.method = input.method;
-      this.mode = input.mode;
-      if (!body && input._bodyInit != null) {
-        body = input._bodyInit;
-        input.bodyUsed = true;
-      }
-    } else {
-      this.url = String(input);
-    }
-
-    this.credentials = options.credentials || this.credentials || 'omit';
-    if (options.headers || !this.headers) {
-      this.headers = new Headers(options.headers);
-    }
-    this.method = normalizeMethod(options.method || this.method || 'GET');
-    this.mode = options.mode || this.mode || null;
-    this.referrer = null;
-
-    if ((this.method === 'GET' || this.method === 'HEAD') && body) {
-      throw new TypeError('Body not allowed for GET or HEAD requests')
-    }
-    this._initBody(body);
-  }
-
-  Request.prototype.clone = function() {
-    return new Request(this, { body: this._bodyInit })
-  };
-
-  function decode(body) {
-    var form = new FormData();
-    body.trim().split('&').forEach(function(bytes) {
-      if (bytes) {
-        var split = bytes.split('=');
-        var name = split.shift().replace(/\+/g, ' ');
-        var value = split.join('=').replace(/\+/g, ' ');
-        form.append(decodeURIComponent(name), decodeURIComponent(value));
-      }
-    });
-    return form
-  }
-
-  function parseHeaders(rawHeaders) {
-    var headers = new Headers();
-    // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
-    // https://tools.ietf.org/html/rfc7230#section-3.2
-    var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ');
-    preProcessedHeaders.split(/\r?\n/).forEach(function(line) {
-      var parts = line.split(':');
-      var key = parts.shift().trim();
-      if (key) {
-        var value = parts.join(':').trim();
-        headers.append(key, value);
-      }
-    });
-    return headers
-  }
-
-  Body.call(Request.prototype);
-
-  function Response(bodyInit, options) {
-    if (!options) {
-      options = {};
-    }
-
-    this.type = 'default';
-    this.status = options.status === undefined ? 200 : options.status;
-    this.ok = this.status >= 200 && this.status < 300;
-    this.statusText = 'statusText' in options ? options.statusText : 'OK';
-    this.headers = new Headers(options.headers);
-    this.url = options.url || '';
-    this._initBody(bodyInit);
-  }
-
-  Body.call(Response.prototype);
-
-  Response.prototype.clone = function() {
-    return new Response(this._bodyInit, {
-      status: this.status,
-      statusText: this.statusText,
-      headers: new Headers(this.headers),
-      url: this.url
-    })
-  };
-
-  Response.error = function() {
-    var response = new Response(null, {status: 0, statusText: ''});
-    response.type = 'error';
-    return response
-  };
-
-  var redirectStatuses = [301, 302, 303, 307, 308];
-
-  Response.redirect = function(url, status) {
-    if (redirectStatuses.indexOf(status) === -1) {
-      throw new RangeError('Invalid status code')
-    }
-
-    return new Response(null, {status: status, headers: {location: url}})
-  };
-
-  self.Headers = Headers;
-  self.Request = Request;
-  self.Response = Response;
-
-  self.fetch = function(input, init) {
-    return new Promise(function(resolve, reject) {
-      var request = new Request(input, init);
-      var xhr = new XMLHttpRequest();
-
-      xhr.onload = function() {
-        var options = {
-          status: xhr.status,
-          statusText: xhr.statusText,
-          headers: parseHeaders(xhr.getAllResponseHeaders() || '')
-        };
-        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');
-        var body = 'response' in xhr ? xhr.response : xhr.responseText;
-        resolve(new Response(body, options));
-      };
-
-      xhr.onerror = function() {
-        reject(new TypeError('Network request failed'));
-      };
-
-      xhr.ontimeout = function() {
-        reject(new TypeError('Network request failed'));
-      };
-
-      xhr.open(request.method, request.url, true);
-
-      if (request.credentials === 'include') {
-        xhr.withCredentials = true;
-      } else if (request.credentials === 'omit') {
-        xhr.withCredentials = false;
-      }
-
-      if ('responseType' in xhr && support.blob) {
-        xhr.responseType = 'blob';
-      }
-
-      request.headers.forEach(function(value, name) {
-        xhr.setRequestHeader(name, value);
-      });
-
-      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);
-    })
-  };
-  self.fetch.polyfill = true;
-})(typeof self !== 'undefined' ? self : this);
diff --git a/node_modules/cross-fetch/dist/browser-ponyfill.js b/node_modules/cross-fetch/dist/browser-ponyfill.js
deleted file mode 100644
index b73508f..0000000
--- a/node_modules/cross-fetch/dist/browser-ponyfill.js
+++ /dev/null
@@ -1,480 +0,0 @@
-var __root__ = (function (root) {
-function F() { this.fetch = false; }
-F.prototype = root;
-return new F();
-})(typeof self !== 'undefined' ? self : this);
-(function(self) {
-
-(function(self) {
-
-  if (self.fetch) {
-    return
-  }
-
-  var support = {
-    searchParams: 'URLSearchParams' in self,
-    iterable: 'Symbol' in self && 'iterator' in Symbol,
-    blob: 'FileReader' in self && 'Blob' in self && (function() {
-      try {
-        new Blob();
-        return true
-      } catch(e) {
-        return false
-      }
-    })(),
-    formData: 'FormData' in self,
-    arrayBuffer: 'ArrayBuffer' in self
-  };
-
-  if (support.arrayBuffer) {
-    var viewClasses = [
-      '[object Int8Array]',
-      '[object Uint8Array]',
-      '[object Uint8ClampedArray]',
-      '[object Int16Array]',
-      '[object Uint16Array]',
-      '[object Int32Array]',
-      '[object Uint32Array]',
-      '[object Float32Array]',
-      '[object Float64Array]'
-    ];
-
-    var isDataView = function(obj) {
-      return obj && DataView.prototype.isPrototypeOf(obj)
-    };
-
-    var isArrayBufferView = ArrayBuffer.isView || function(obj) {
-      return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
-    };
-  }
-
-  function normalizeName(name) {
-    if (typeof name !== 'string') {
-      name = String(name);
-    }
-    if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
-      throw new TypeError('Invalid character in header field name')
-    }
-    return name.toLowerCase()
-  }
-
-  function normalizeValue(value) {
-    if (typeof value !== 'string') {
-      value = String(value);
-    }
-    return value
-  }
-
-  // Build a destructive iterator for the value list
-  function iteratorFor(items) {
-    var iterator = {
-      next: function() {
-        var value = items.shift();
-        return {done: value === undefined, value: value}
-      }
-    };
-
-    if (support.iterable) {
-      iterator[Symbol.iterator] = function() {
-        return iterator
-      };
-    }
-
-    return iterator
-  }
-
-  function Headers(headers) {
-    this.map = {};
-
-    if (headers instanceof Headers) {
-      headers.forEach(function(value, name) {
-        this.append(name, value);
-      }, this);
-    } else if (Array.isArray(headers)) {
-      headers.forEach(function(header) {
-        this.append(header[0], header[1]);
-      }, this);
-    } else if (headers) {
-      Object.getOwnPropertyNames(headers).forEach(function(name) {
-        this.append(name, headers[name]);
-      }, this);
-    }
-  }
-
-  Headers.prototype.append = function(name, value) {
-    name = normalizeName(name);
-    value = normalizeValue(value);
-    var oldValue = this.map[name];
-    this.map[name] = oldValue ? oldValue+','+value : value;
-  };
-
-  Headers.prototype['delete'] = function(name) {
-    delete this.map[normalizeName(name)];
-  };
-
-  Headers.prototype.get = function(name) {
-    name = normalizeName(name);
-    return this.has(name) ? this.map[name] : null
-  };
-
-  Headers.prototype.has = function(name) {
-    return this.map.hasOwnProperty(normalizeName(name))
-  };
-
-  Headers.prototype.set = function(name, value) {
-    this.map[normalizeName(name)] = normalizeValue(value);
-  };
-
-  Headers.prototype.forEach = function(callback, thisArg) {
-    for (var name in this.map) {
-      if (this.map.hasOwnProperty(name)) {
-        callback.call(thisArg, this.map[name], name, this);
-      }
-    }
-  };
-
-  Headers.prototype.keys = function() {
-    var items = [];
-    this.forEach(function(value, name) { items.push(name); });
-    return iteratorFor(items)
-  };
-
-  Headers.prototype.values = function() {
-    var items = [];
-    this.forEach(function(value) { items.push(value); });
-    return iteratorFor(items)
-  };
-
-  Headers.prototype.entries = function() {
-    var items = [];
-    this.forEach(function(value, name) { items.push([name, value]); });
-    return iteratorFor(items)
-  };
-
-  if (support.iterable) {
-    Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
-  }
-
-  function consumed(body) {
-    if (body.bodyUsed) {
-      return Promise.reject(new TypeError('Already read'))
-    }
-    body.bodyUsed = true;
-  }
-
-  function fileReaderReady(reader) {
-    return new Promise(function(resolve, reject) {
-      reader.onload = function() {
-        resolve(reader.result);
-      };
-      reader.onerror = function() {
-        reject(reader.error);
-      };
-    })
-  }
-
-  function readBlobAsArrayBuffer(blob) {
-    var reader = new FileReader();
-    var promise = fileReaderReady(reader);
-    reader.readAsArrayBuffer(blob);
-    return promise
-  }
-
-  function readBlobAsText(blob) {
-    var reader = new FileReader();
-    var promise = fileReaderReady(reader);
-    reader.readAsText(blob);
-    return promise
-  }
-
-  function readArrayBufferAsText(buf) {
-    var view = new Uint8Array(buf);
-    var chars = new Array(view.length);
-
-    for (var i = 0; i < view.length; i++) {
-      chars[i] = String.fromCharCode(view[i]);
-    }
-    return chars.join('')
-  }
-
-  function bufferClone(buf) {
-    if (buf.slice) {
-      return buf.slice(0)
-    } else {
-      var view = new Uint8Array(buf.byteLength);
-      view.set(new Uint8Array(buf));
-      return view.buffer
-    }
-  }
-
-  function Body() {
-    this.bodyUsed = false;
-
-    this._initBody = function(body) {
-      this._bodyInit = body;
-      if (!body) {
-        this._bodyText = '';
-      } else if (typeof body === 'string') {
-        this._bodyText = body;
-      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
-        this._bodyBlob = body;
-      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
-        this._bodyFormData = body;
-      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
-        this._bodyText = body.toString();
-      } else if (support.arrayBuffer && support.blob && isDataView(body)) {
-        this._bodyArrayBuffer = bufferClone(body.buffer);
-        // IE 10-11 can't handle a DataView body.
-        this._bodyInit = new Blob([this._bodyArrayBuffer]);
-      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
-        this._bodyArrayBuffer = bufferClone(body);
-      } else {
-        throw new Error('unsupported BodyInit type')
-      }
-
-      if (!this.headers.get('content-type')) {
-        if (typeof body === 'string') {
-          this.headers.set('content-type', 'text/plain;charset=UTF-8');
-        } else if (this._bodyBlob && this._bodyBlob.type) {
-          this.headers.set('content-type', this._bodyBlob.type);
-        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
-          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
-        }
-      }
-    };
-
-    if (support.blob) {
-      this.blob = function() {
-        var rejected = consumed(this);
-        if (rejected) {
-          return rejected
-        }
-
-        if (this._bodyBlob) {
-          return Promise.resolve(this._bodyBlob)
-        } else if (this._bodyArrayBuffer) {
-          return Promise.resolve(new Blob([this._bodyArrayBuffer]))
-        } else if (this._bodyFormData) {
-          throw new Error('could not read FormData body as blob')
-        } else {
-          return Promise.resolve(new Blob([this._bodyText]))
-        }
-      };
-
-      this.arrayBuffer = function() {
-        if (this._bodyArrayBuffer) {
-          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
-        } else {
-          return this.blob().then(readBlobAsArrayBuffer)
-        }
-      };
-    }
-
-    this.text = function() {
-      var rejected = consumed(this);
-      if (rejected) {
-        return rejected
-      }
-
-      if (this._bodyBlob) {
-        return readBlobAsText(this._bodyBlob)
-      } else if (this._bodyArrayBuffer) {
-        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
-      } else if (this._bodyFormData) {
-        throw new Error('could not read FormData body as text')
-      } else {
-        return Promise.resolve(this._bodyText)
-      }
-    };
-
-    if (support.formData) {
-      this.formData = function() {
-        return this.text().then(decode)
-      };
-    }
-
-    this.json = function() {
-      return this.text().then(JSON.parse)
-    };
-
-    return this
-  }
-
-  // HTTP methods whose capitalization should be normalized
-  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
-
-  function normalizeMethod(method) {
-    var upcased = method.toUpperCase();
-    return (methods.indexOf(upcased) > -1) ? upcased : method
-  }
-
-  function Request(input, options) {
-    options = options || {};
-    var body = options.body;
-
-    if (input instanceof Request) {
-      if (input.bodyUsed) {
-        throw new TypeError('Already read')
-      }
-      this.url = input.url;
-      this.credentials = input.credentials;
-      if (!options.headers) {
-        this.headers = new Headers(input.headers);
-      }
-      this.method = input.method;
-      this.mode = input.mode;
-      if (!body && input._bodyInit != null) {
-        body = input._bodyInit;
-        input.bodyUsed = true;
-      }
-    } else {
-      this.url = String(input);
-    }
-
-    this.credentials = options.credentials || this.credentials || 'omit';
-    if (options.headers || !this.headers) {
-      this.headers = new Headers(options.headers);
-    }
-    this.method = normalizeMethod(options.method || this.method || 'GET');
-    this.mode = options.mode || this.mode || null;
-    this.referrer = null;
-
-    if ((this.method === 'GET' || this.method === 'HEAD') && body) {
-      throw new TypeError('Body not allowed for GET or HEAD requests')
-    }
-    this._initBody(body);
-  }
-
-  Request.prototype.clone = function() {
-    return new Request(this, { body: this._bodyInit })
-  };
-
-  function decode(body) {
-    var form = new FormData();
-    body.trim().split('&').forEach(function(bytes) {
-      if (bytes) {
-        var split = bytes.split('=');
-        var name = split.shift().replace(/\+/g, ' ');
-        var value = split.join('=').replace(/\+/g, ' ');
-        form.append(decodeURIComponent(name), decodeURIComponent(value));
-      }
-    });
-    return form
-  }
-
-  function parseHeaders(rawHeaders) {
-    var headers = new Headers();
-    // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
-    // https://tools.ietf.org/html/rfc7230#section-3.2
-    var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ');
-    preProcessedHeaders.split(/\r?\n/).forEach(function(line) {
-      var parts = line.split(':');
-      var key = parts.shift().trim();
-      if (key) {
-        var value = parts.join(':').trim();
-        headers.append(key, value);
-      }
-    });
-    return headers
-  }
-
-  Body.call(Request.prototype);
-
-  function Response(bodyInit, options) {
-    if (!options) {
-      options = {};
-    }
-
-    this.type = 'default';
-    this.status = options.status === undefined ? 200 : options.status;
-    this.ok = this.status >= 200 && this.status < 300;
-    this.statusText = 'statusText' in options ? options.statusText : 'OK';
-    this.headers = new Headers(options.headers);
-    this.url = options.url || '';
-    this._initBody(bodyInit);
-  }
-
-  Body.call(Response.prototype);
-
-  Response.prototype.clone = function() {
-    return new Response(this._bodyInit, {
-      status: this.status,
-      statusText: this.statusText,
-      headers: new Headers(this.headers),
-      url: this.url
-    })
-  };
-
-  Response.error = function() {
-    var response = new Response(null, {status: 0, statusText: ''});
-    response.type = 'error';
-    return response
-  };
-
-  var redirectStatuses = [301, 302, 303, 307, 308];
-
-  Response.redirect = function(url, status) {
-    if (redirectStatuses.indexOf(status) === -1) {
-      throw new RangeError('Invalid status code')
-    }
-
-    return new Response(null, {status: status, headers: {location: url}})
-  };
-
-  self.Headers = Headers;
-  self.Request = Request;
-  self.Response = Response;
-
-  self.fetch = function(input, init) {
-    return new Promise(function(resolve, reject) {
-      var request = new Request(input, init);
-      var xhr = new XMLHttpRequest();
-
-      xhr.onload = function() {
-        var options = {
-          status: xhr.status,
-          statusText: xhr.statusText,
-          headers: parseHeaders(xhr.getAllResponseHeaders() || '')
-        };
-        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');
-        var body = 'response' in xhr ? xhr.response : xhr.responseText;
-        resolve(new Response(body, options));
-      };
-
-      xhr.onerror = function() {
-        reject(new TypeError('Network request failed'));
-      };
-
-      xhr.ontimeout = function() {
-        reject(new TypeError('Network request failed'));
-      };
-
-      xhr.open(request.method, request.url, true);
-
-      if (request.credentials === 'include') {
-        xhr.withCredentials = true;
-      } else if (request.credentials === 'omit') {
-        xhr.withCredentials = false;
-      }
-
-      if ('responseType' in xhr && support.blob) {
-        xhr.responseType = 'blob';
-      }
-
-      request.headers.forEach(function(value, name) {
-        xhr.setRequestHeader(name, value);
-      });
-
-      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);
-    })
-  };
-  self.fetch.polyfill = true;
-})(typeof self !== 'undefined' ? self : this);
-}).call(__root__, void(0));
-var fetch = __root__.fetch;
-var Response = fetch.Response = __root__.Response;
-var Request = fetch.Request = __root__.Request;
-var Headers = fetch.Headers = __root__.Headers;
-if (typeof module === 'object' && module.exports) {
-module.exports = fetch;
-}
diff --git a/node_modules/cross-fetch/dist/cross-fetch.js b/node_modules/cross-fetch/dist/cross-fetch.js
deleted file mode 100644
index 3670429..0000000
--- a/node_modules/cross-fetch/dist/cross-fetch.js
+++ /dev/null
@@ -1,2 +0,0 @@
-!function(t){if(!t.fetch){var e="URLSearchParams"in t,r="Symbol"in t&&"iterator"in Symbol,s="FileReader"in t&&"Blob"in t&&function(){try{return new Blob,!0}catch(t){return!1}}(),o="FormData"in t,n="ArrayBuffer"in t;if(n)var i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],a=function(t){return t&&DataView.prototype.isPrototypeOf(t)},h=ArrayBuffer.isView||function(t){return t&&-1<i.indexOf(Object.prototype.toString.call(t))};l.prototype.append=function(t,e){t=d(t),e=y(e);var r=this.map[t];this.map[t]=r?r+","+e:e},l.prototype.delete=function(t){delete this.map[d(t)]},l.prototype.get=function(t){return t=d(t),this.has(t)?this.map[t]:null},l.prototype.has=function(t){return this.map.hasOwnProperty(d(t))},l.prototype.set=function(t,e){this.map[d(t)]=y(e)},l.prototype.forEach=function(t,e){for(var r in this.map)this.map.hasOwnProperty(r)&&t.call(e,this.map[r],r,this)},l.prototype.keys=function(){var r=[];return this.forEach(function(t,e){r.push(e)}),p(r)},l.prototype.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),p(e)},l.prototype.entries=function(){var r=[];return this.forEach(function(t,e){r.push([e,t])}),p(r)},r&&(l.prototype[Symbol.iterator]=l.prototype.entries);var u=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];_.prototype.clone=function(){return new _(this,{body:this._bodyInit})},v.call(_.prototype),v.call(B.prototype),B.prototype.clone=function(){return new B(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new l(this.headers),url:this.url})},B.error=function(){var t=new B(null,{status:0,statusText:""});return t.type="error",t};var f=[301,302,303,307,308];B.redirect=function(t,e){if(-1===f.indexOf(e))throw new RangeError("Invalid status code");return new B(null,{status:e,headers:{location:t}})},t.Headers=l,t.Request=_,t.Response=B,t.fetch=function(r,n){return new Promise(function(o,t){var e=new _(r,n),i=new XMLHttpRequest;i.onload=function(){var t,n,e={status:i.status,statusText:i.statusText,headers:(t=i.getAllResponseHeaders()||"",n=new l,t.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach(function(t){var e=t.split(":"),r=e.shift().trim();if(r){var o=e.join(":").trim();n.append(r,o)}}),n)};e.url="responseURL"in i?i.responseURL:e.headers.get("X-Request-URL");var r="response"in i?i.response:i.responseText;o(new B(r,e))},i.onerror=function(){t(new TypeError("Network request failed"))},i.ontimeout=function(){t(new TypeError("Network request failed"))},i.open(e.method,e.url,!0),"include"===e.credentials?i.withCredentials=!0:"omit"===e.credentials&&(i.withCredentials=!1),"responseType"in i&&s&&(i.responseType="blob"),e.headers.forEach(function(t,e){i.setRequestHeader(e,t)}),i.send(void 0===e._bodyInit?null:e._bodyInit)})},t.fetch.polyfill=!0}function d(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function y(t){return"string"!=typeof t&&(t=String(t)),t}function p(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return r&&(t[Symbol.iterator]=function(){return t}),t}function l(e){this.map={},e instanceof l?e.forEach(function(t,e){this.append(e,t)},this):Array.isArray(e)?e.forEach(function(t){this.append(t[0],t[1])},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function c(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function b(r){return new Promise(function(t,e){r.onload=function(){t(r.result)},r.onerror=function(){e(r.error)}})}function m(t){var e=new FileReader,r=b(e);return e.readAsArrayBuffer(t),r}function w(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function v(){return this.bodyUsed=!1,this._initBody=function(t){if(this._bodyInit=t)if("string"==typeof t)this._bodyText=t;else if(s&&Blob.prototype.isPrototypeOf(t))this._bodyBlob=t;else if(o&&FormData.prototype.isPrototypeOf(t))this._bodyFormData=t;else if(e&&URLSearchParams.prototype.isPrototypeOf(t))this._bodyText=t.toString();else if(n&&s&&a(t))this._bodyArrayBuffer=w(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer]);else{if(!n||!ArrayBuffer.prototype.isPrototypeOf(t)&&!h(t))throw new Error("unsupported BodyInit type");this._bodyArrayBuffer=w(t)}else this._bodyText="";this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):e&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},s&&(this.blob=function(){var t=c(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?c(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(m)}),this.text=function(){var t,e,r,o=c(this);if(o)return o;if(this._bodyBlob)return t=this._bodyBlob,e=new FileReader,r=b(e),e.readAsText(t),r;if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),o=0;o<e.length;o++)r[o]=String.fromCharCode(e[o]);return r.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},o&&(this.formData=function(){return this.text().then(A)}),this.json=function(){return this.text().then(JSON.parse)},this}function _(t,e){var r,o,n=(e=e||{}).body;if(t instanceof _){if(t.bodyUsed)throw new TypeError("Already read");this.url=t.url,this.credentials=t.credentials,e.headers||(this.headers=new l(t.headers)),this.method=t.method,this.mode=t.mode,n||null==t._bodyInit||(n=t._bodyInit,t.bodyUsed=!0)}else this.url=String(t);if(this.credentials=e.credentials||this.credentials||"omit",!e.headers&&this.headers||(this.headers=new l(e.headers)),this.method=(r=e.method||this.method||"GET",o=r.toUpperCase(),-1<u.indexOf(o)?o:r),this.mode=e.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n)}function A(t){var n=new FormData;return t.trim().split("&").forEach(function(t){if(t){var e=t.split("="),r=e.shift().replace(/\+/g," "),o=e.join("=").replace(/\+/g," ");n.append(decodeURIComponent(r),decodeURIComponent(o))}}),n}function B(t,e){e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=200<=this.status&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new l(e.headers),this.url=e.url||"",this._initBody(t)}}("undefined"!=typeof self?self:this);
-//# sourceMappingURL=cross-fetch.js.map
diff --git a/node_modules/cross-fetch/dist/cross-fetch.js.map b/node_modules/cross-fetch/dist/cross-fetch.js.map
deleted file mode 100644
index fb1ba76..0000000
--- a/node_modules/cross-fetch/dist/cross-fetch.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"cross-fetch.js","sources":["../node_modules/whatwg-fetch/fetch.js"],"sourcesContent":["(function(self) {\n  'use strict';\n\n  if (self.fetch) {\n    return\n  }\n\n  var support = {\n    searchParams: 'URLSearchParams' in self,\n    iterable: 'Symbol' in self && 'iterator' in Symbol,\n    blob: 'FileReader' in self && 'Blob' in self && (function() {\n      try {\n        new Blob()\n        return true\n      } catch(e) {\n        return false\n      }\n    })(),\n    formData: 'FormData' in self,\n    arrayBuffer: 'ArrayBuffer' in self\n  }\n\n  if (support.arrayBuffer) {\n    var viewClasses = [\n      '[object Int8Array]',\n      '[object Uint8Array]',\n      '[object Uint8ClampedArray]',\n      '[object Int16Array]',\n      '[object Uint16Array]',\n      '[object Int32Array]',\n      '[object Uint32Array]',\n      '[object Float32Array]',\n      '[object Float64Array]'\n    ]\n\n    var isDataView = function(obj) {\n      return obj && DataView.prototype.isPrototypeOf(obj)\n    }\n\n    var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n      return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n    }\n  }\n\n  function normalizeName(name) {\n    if (typeof name !== 'string') {\n      name = String(name)\n    }\n    if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n      throw new TypeError('Invalid character in header field name')\n    }\n    return name.toLowerCase()\n  }\n\n  function normalizeValue(value) {\n    if (typeof value !== 'string') {\n      value = String(value)\n    }\n    return value\n  }\n\n  // Build a destructive iterator for the value list\n  function iteratorFor(items) {\n    var iterator = {\n      next: function() {\n        var value = items.shift()\n        return {done: value === undefined, value: value}\n      }\n    }\n\n    if (support.iterable) {\n      iterator[Symbol.iterator] = function() {\n        return iterator\n      }\n    }\n\n    return iterator\n  }\n\n  function Headers(headers) {\n    this.map = {}\n\n    if (headers instanceof Headers) {\n      headers.forEach(function(value, name) {\n        this.append(name, value)\n      }, this)\n    } else if (Array.isArray(headers)) {\n      headers.forEach(function(header) {\n        this.append(header[0], header[1])\n      }, this)\n    } else if (headers) {\n      Object.getOwnPropertyNames(headers).forEach(function(name) {\n        this.append(name, headers[name])\n      }, this)\n    }\n  }\n\n  Headers.prototype.append = function(name, value) {\n    name = normalizeName(name)\n    value = normalizeValue(value)\n    var oldValue = this.map[name]\n    this.map[name] = oldValue ? oldValue+','+value : value\n  }\n\n  Headers.prototype['delete'] = function(name) {\n    delete this.map[normalizeName(name)]\n  }\n\n  Headers.prototype.get = function(name) {\n    name = normalizeName(name)\n    return this.has(name) ? this.map[name] : null\n  }\n\n  Headers.prototype.has = function(name) {\n    return this.map.hasOwnProperty(normalizeName(name))\n  }\n\n  Headers.prototype.set = function(name, value) {\n    this.map[normalizeName(name)] = normalizeValue(value)\n  }\n\n  Headers.prototype.forEach = function(callback, thisArg) {\n    for (var name in this.map) {\n      if (this.map.hasOwnProperty(name)) {\n        callback.call(thisArg, this.map[name], name, this)\n      }\n    }\n  }\n\n  Headers.prototype.keys = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push(name) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.values = function() {\n    var items = []\n    this.forEach(function(value) { items.push(value) })\n    return iteratorFor(items)\n  }\n\n  Headers.prototype.entries = function() {\n    var items = []\n    this.forEach(function(value, name) { items.push([name, value]) })\n    return iteratorFor(items)\n  }\n\n  if (support.iterable) {\n    Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n  }\n\n  function consumed(body) {\n    if (body.bodyUsed) {\n      return Promise.reject(new TypeError('Already read'))\n    }\n    body.bodyUsed = true\n  }\n\n  function fileReaderReady(reader) {\n    return new Promise(function(resolve, reject) {\n      reader.onload = function() {\n        resolve(reader.result)\n      }\n      reader.onerror = function() {\n        reject(reader.error)\n      }\n    })\n  }\n\n  function readBlobAsArrayBuffer(blob) {\n    var reader = new FileReader()\n    var promise = fileReaderReady(reader)\n    reader.readAsArrayBuffer(blob)\n    return promise\n  }\n\n  function readBlobAsText(blob) {\n    var reader = new FileReader()\n    var promise = fileReaderReady(reader)\n    reader.readAsText(blob)\n    return promise\n  }\n\n  function readArrayBufferAsText(buf) {\n    var view = new Uint8Array(buf)\n    var chars = new Array(view.length)\n\n    for (var i = 0; i < view.length; i++) {\n      chars[i] = String.fromCharCode(view[i])\n    }\n    return chars.join('')\n  }\n\n  function bufferClone(buf) {\n    if (buf.slice) {\n      return buf.slice(0)\n    } else {\n      var view = new Uint8Array(buf.byteLength)\n      view.set(new Uint8Array(buf))\n      return view.buffer\n    }\n  }\n\n  function Body() {\n    this.bodyUsed = false\n\n    this._initBody = function(body) {\n      this._bodyInit = body\n      if (!body) {\n        this._bodyText = ''\n      } else if (typeof body === 'string') {\n        this._bodyText = body\n      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n        this._bodyBlob = body\n      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n        this._bodyFormData = body\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n        this._bodyText = body.toString()\n      } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n        this._bodyArrayBuffer = bufferClone(body.buffer)\n        // IE 10-11 can't handle a DataView body.\n        this._bodyInit = new Blob([this._bodyArrayBuffer])\n      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n        this._bodyArrayBuffer = bufferClone(body)\n      } else {\n        throw new Error('unsupported BodyInit type')\n      }\n\n      if (!this.headers.get('content-type')) {\n        if (typeof body === 'string') {\n          this.headers.set('content-type', 'text/plain;charset=UTF-8')\n        } else if (this._bodyBlob && this._bodyBlob.type) {\n          this.headers.set('content-type', this._bodyBlob.type)\n        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n        }\n      }\n    }\n\n    if (support.blob) {\n      this.blob = function() {\n        var rejected = consumed(this)\n        if (rejected) {\n          return rejected\n        }\n\n        if (this._bodyBlob) {\n          return Promise.resolve(this._bodyBlob)\n        } else if (this._bodyArrayBuffer) {\n          return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n        } else if (this._bodyFormData) {\n          throw new Error('could not read FormData body as blob')\n        } else {\n          return Promise.resolve(new Blob([this._bodyText]))\n        }\n      }\n\n      this.arrayBuffer = function() {\n        if (this._bodyArrayBuffer) {\n          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n        } else {\n          return this.blob().then(readBlobAsArrayBuffer)\n        }\n      }\n    }\n\n    this.text = function() {\n      var rejected = consumed(this)\n      if (rejected) {\n        return rejected\n      }\n\n      if (this._bodyBlob) {\n        return readBlobAsText(this._bodyBlob)\n      } else if (this._bodyArrayBuffer) {\n        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n      } else if (this._bodyFormData) {\n        throw new Error('could not read FormData body as text')\n      } else {\n        return Promise.resolve(this._bodyText)\n      }\n    }\n\n    if (support.formData) {\n      this.formData = function() {\n        return this.text().then(decode)\n      }\n    }\n\n    this.json = function() {\n      return this.text().then(JSON.parse)\n    }\n\n    return this\n  }\n\n  // HTTP methods whose capitalization should be normalized\n  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n  function normalizeMethod(method) {\n    var upcased = method.toUpperCase()\n    return (methods.indexOf(upcased) > -1) ? upcased : method\n  }\n\n  function Request(input, options) {\n    options = options || {}\n    var body = options.body\n\n    if (input instanceof Request) {\n      if (input.bodyUsed) {\n        throw new TypeError('Already read')\n      }\n      this.url = input.url\n      this.credentials = input.credentials\n      if (!options.headers) {\n        this.headers = new Headers(input.headers)\n      }\n      this.method = input.method\n      this.mode = input.mode\n      if (!body && input._bodyInit != null) {\n        body = input._bodyInit\n        input.bodyUsed = true\n      }\n    } else {\n      this.url = String(input)\n    }\n\n    this.credentials = options.credentials || this.credentials || 'omit'\n    if (options.headers || !this.headers) {\n      this.headers = new Headers(options.headers)\n    }\n    this.method = normalizeMethod(options.method || this.method || 'GET')\n    this.mode = options.mode || this.mode || null\n    this.referrer = null\n\n    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n      throw new TypeError('Body not allowed for GET or HEAD requests')\n    }\n    this._initBody(body)\n  }\n\n  Request.prototype.clone = function() {\n    return new Request(this, { body: this._bodyInit })\n  }\n\n  function decode(body) {\n    var form = new FormData()\n    body.trim().split('&').forEach(function(bytes) {\n      if (bytes) {\n        var split = bytes.split('=')\n        var name = split.shift().replace(/\\+/g, ' ')\n        var value = split.join('=').replace(/\\+/g, ' ')\n        form.append(decodeURIComponent(name), decodeURIComponent(value))\n      }\n    })\n    return form\n  }\n\n  function parseHeaders(rawHeaders) {\n    var headers = new Headers()\n    // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n    // https://tools.ietf.org/html/rfc7230#section-3.2\n    var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n    preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n      var parts = line.split(':')\n      var key = parts.shift().trim()\n      if (key) {\n        var value = parts.join(':').trim()\n        headers.append(key, value)\n      }\n    })\n    return headers\n  }\n\n  Body.call(Request.prototype)\n\n  function Response(bodyInit, options) {\n    if (!options) {\n      options = {}\n    }\n\n    this.type = 'default'\n    this.status = options.status === undefined ? 200 : options.status\n    this.ok = this.status >= 200 && this.status < 300\n    this.statusText = 'statusText' in options ? options.statusText : 'OK'\n    this.headers = new Headers(options.headers)\n    this.url = options.url || ''\n    this._initBody(bodyInit)\n  }\n\n  Body.call(Response.prototype)\n\n  Response.prototype.clone = function() {\n    return new Response(this._bodyInit, {\n      status: this.status,\n      statusText: this.statusText,\n      headers: new Headers(this.headers),\n      url: this.url\n    })\n  }\n\n  Response.error = function() {\n    var response = new Response(null, {status: 0, statusText: ''})\n    response.type = 'error'\n    return response\n  }\n\n  var redirectStatuses = [301, 302, 303, 307, 308]\n\n  Response.redirect = function(url, status) {\n    if (redirectStatuses.indexOf(status) === -1) {\n      throw new RangeError('Invalid status code')\n    }\n\n    return new Response(null, {status: status, headers: {location: url}})\n  }\n\n  self.Headers = Headers\n  self.Request = Request\n  self.Response = Response\n\n  self.fetch = function(input, init) {\n    return new Promise(function(resolve, reject) {\n      var request = new Request(input, init)\n      var xhr = new XMLHttpRequest()\n\n      xhr.onload = function() {\n        var options = {\n          status: xhr.status,\n          statusText: xhr.statusText,\n          headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n        }\n        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n        var body = 'response' in xhr ? xhr.response : xhr.responseText\n        resolve(new Response(body, options))\n      }\n\n      xhr.onerror = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.ontimeout = function() {\n        reject(new TypeError('Network request failed'))\n      }\n\n      xhr.open(request.method, request.url, true)\n\n      if (request.credentials === 'include') {\n        xhr.withCredentials = true\n      } else if (request.credentials === 'omit') {\n        xhr.withCredentials = false\n      }\n\n      if ('responseType' in xhr && support.blob) {\n        xhr.responseType = 'blob'\n      }\n\n      request.headers.forEach(function(value, name) {\n        xhr.setRequestHeader(name, value)\n      })\n\n      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n    })\n  }\n  self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n"],"names":["self","fetch","support","Symbol","Blob","e","viewClasses","isDataView","obj","DataView","prototype","isPrototypeOf","isArrayBufferView","ArrayBuffer","isView","indexOf","Object","toString","call","Headers","append","name","value","normalizeName","normalizeValue","oldValue","this","map","get","has","hasOwnProperty","set","forEach","callback","thisArg","keys","items","push","iteratorFor","values","entries","iterator","methods","Request","clone","body","_bodyInit","Body","Response","status","statusText","headers","url","error","response","type","redirectStatuses","redirect","RangeError","location","input","init","Promise","resolve","reject","request","xhr","XMLHttpRequest","onload","rawHeaders","options","getAllResponseHeaders","replace","split","line","parts","key","shift","trim","join","responseURL","responseText","onerror","TypeError","ontimeout","open","method","credentials","withCredentials","responseType","setRequestHeader","send","polyfill","String","test","toLowerCase","next","done","undefined","Array","isArray","header","getOwnPropertyNames","consumed","bodyUsed","fileReaderReady","reader","result","readBlobAsArrayBuffer","blob","FileReader","promise","readAsArrayBuffer","bufferClone","buf","slice","view","Uint8Array","byteLength","buffer","_initBody","_bodyText","_bodyBlob","FormData","_bodyFormData","URLSearchParams","_bodyArrayBuffer","Error","rejected","arrayBuffer","then","text","readAsText","chars","length","i","fromCharCode","readArrayBufferAsText","formData","decode","json","JSON","parse","upcased","mode","toUpperCase","referrer","form","bytes","decodeURIComponent","bodyInit","ok"],"mappings":"CAAA,SAAUA,GAGR,IAAIA,EAAKC,MAAT,CAIA,IAAIC,EACY,oBAAqBF,EADjCE,EAEQ,WAAYF,GAAQ,aAAcG,OAF1CD,EAGI,eAAgBF,GAAQ,SAAUA,GAAQ,WAC9C,IAEE,OADA,IAAII,MACG,EACP,MAAMC,GACN,OAAO,GALqC,GAH9CH,EAWQ,aAAcF,EAXtBE,EAYW,gBAAiBF,EAGhC,GAAIE,EACF,IAAII,EAAc,CAChB,qBACA,sBACA,6BACA,sBACA,uBACA,sBACA,uBACA,wBACA,yBAGEC,EAAa,SAASC,GACxB,OAAOA,GAAOC,SAASC,UAAUC,cAAcH,IAG7CI,EAAoBC,YAAYC,QAAU,SAASN,GACrD,OAAOA,IAAmE,EAA5DF,EAAYS,QAAQC,OAAON,UAAUO,SAASC,KAAKV,KAyDrEW,EAAQT,UAAUU,OAAS,SAASC,EAAMC,GACxCD,EAAOE,EAAcF,GACrBC,EAAQE,EAAeF,GACvB,IAAIG,EAAWC,KAAKC,IAAIN,GACxBK,KAAKC,IAAIN,GAAQI,EAAWA,EAAS,IAAIH,EAAQA,GAGnDH,EAAQT,UAAkB,OAAI,SAASW,UAC9BK,KAAKC,IAAIJ,EAAcF,KAGhCF,EAAQT,UAAUkB,IAAM,SAASP,GAE/B,OADAA,EAAOE,EAAcF,GACdK,KAAKG,IAAIR,GAAQK,KAAKC,IAAIN,GAAQ,MAG3CF,EAAQT,UAAUmB,IAAM,SAASR,GAC/B,OAAOK,KAAKC,IAAIG,eAAeP,EAAcF,KAG/CF,EAAQT,UAAUqB,IAAM,SAASV,EAAMC,GACrCI,KAAKC,IAAIJ,EAAcF,IAASG,EAAeF,IAGjDH,EAAQT,UAAUsB,QAAU,SAASC,EAAUC,GAC7C,IAAK,IAAIb,KAAQK,KAAKC,IAChBD,KAAKC,IAAIG,eAAeT,IAC1BY,EAASf,KAAKgB,EAASR,KAAKC,IAAIN,GAAOA,EAAMK,OAKnDP,EAAQT,UAAUyB,KAAO,WACvB,IAAIC,EAAQ,GAEZ,OADAV,KAAKM,QAAQ,SAASV,EAAOD,GAAQe,EAAMC,KAAKhB,KACzCiB,EAAYF,IAGrBjB,EAAQT,UAAU6B,OAAS,WACzB,IAAIH,EAAQ,GAEZ,OADAV,KAAKM,QAAQ,SAASV,GAASc,EAAMC,KAAKf,KACnCgB,EAAYF,IAGrBjB,EAAQT,UAAU8B,QAAU,WAC1B,IAAIJ,EAAQ,GAEZ,OADAV,KAAKM,QAAQ,SAASV,EAAOD,GAAQe,EAAMC,KAAK,CAAChB,EAAMC,MAChDgB,EAAYF,IAGjBlC,IACFiB,EAAQT,UAAUP,OAAOsC,UAAYtB,EAAQT,UAAU8B,SAqJzD,IAAIE,EAAU,CAAC,SAAU,MAAO,OAAQ,UAAW,OAAQ,OA4C3DC,EAAQjC,UAAUkC,MAAQ,WACxB,OAAO,IAAID,EAAQjB,KAAM,CAAEmB,KAAMnB,KAAKoB,aAgCxCC,EAAK7B,KAAKyB,EAAQjC,WAgBlBqC,EAAK7B,KAAK8B,EAAStC,WAEnBsC,EAAStC,UAAUkC,MAAQ,WACzB,OAAO,IAAII,EAAStB,KAAKoB,UAAW,CAClCG,OAAQvB,KAAKuB,OACbC,WAAYxB,KAAKwB,WACjBC,QAAS,IAAIhC,EAAQO,KAAKyB,SAC1BC,IAAK1B,KAAK0B,OAIdJ,EAASK,MAAQ,WACf,IAAIC,EAAW,IAAIN,EAAS,KAAM,CAACC,OAAQ,EAAGC,WAAY,KAE1D,OADAI,EAASC,KAAO,QACTD,GAGT,IAAIE,EAAmB,CAAC,IAAK,IAAK,IAAK,IAAK,KAE5CR,EAASS,SAAW,SAASL,EAAKH,GAChC,IAA0C,IAAtCO,EAAiBzC,QAAQkC,GAC3B,MAAM,IAAIS,WAAW,uBAGvB,OAAO,IAAIV,EAAS,KAAM,CAACC,OAAQA,EAAQE,QAAS,CAACQ,SAAUP,MAGjEpD,EAAKmB,QAAUA,EACfnB,EAAK2C,QAAUA,EACf3C,EAAKgD,SAAWA,EAEhBhD,EAAKC,MAAQ,SAAS2D,EAAOC,GAC3B,OAAO,IAAIC,QAAQ,SAASC,EAASC,GACnC,IAAIC,EAAU,IAAItB,EAAQiB,EAAOC,GAC7BK,EAAM,IAAIC,eAEdD,EAAIE,OAAS,WACX,IArEgBC,EAChBlB,EAoEImB,EAAU,CACZrB,OAAQiB,EAAIjB,OACZC,WAAYgB,EAAIhB,WAChBC,SAxEckB,EAwEQH,EAAIK,yBAA2B,GAvEvDpB,EAAU,IAAIhC,EAGQkD,EAAWG,QAAQ,eAAgB,KACzCC,MAAM,SAASzC,QAAQ,SAAS0C,GAClD,IAAIC,EAAQD,EAAKD,MAAM,KACnBG,EAAMD,EAAME,QAAQC,OACxB,GAAIF,EAAK,CACP,IAAItD,EAAQqD,EAAMI,KAAK,KAAKD,OAC5B3B,EAAQ/B,OAAOwD,EAAKtD,MAGjB6B,IA6DHmB,EAAQlB,IAAM,gBAAiBc,EAAMA,EAAIc,YAAcV,EAAQnB,QAAQvB,IAAI,iBAC3E,IAAIiB,EAAO,aAAcqB,EAAMA,EAAIZ,SAAWY,EAAIe,aAClDlB,EAAQ,IAAIf,EAASH,EAAMyB,KAG7BJ,EAAIgB,QAAU,WACZlB,EAAO,IAAImB,UAAU,4BAGvBjB,EAAIkB,UAAY,WACdpB,EAAO,IAAImB,UAAU,4BAGvBjB,EAAImB,KAAKpB,EAAQqB,OAAQrB,EAAQb,KAAK,GAEV,YAAxBa,EAAQsB,YACVrB,EAAIsB,iBAAkB,EACW,SAAxBvB,EAAQsB,cACjBrB,EAAIsB,iBAAkB,GAGpB,iBAAkBtB,GAAOhE,IAC3BgE,EAAIuB,aAAe,QAGrBxB,EAAQd,QAAQnB,QAAQ,SAASV,EAAOD,GACtC6C,EAAIwB,iBAAiBrE,EAAMC,KAG7B4C,EAAIyB,UAAkC,IAAtB1B,EAAQnB,UAA4B,KAAOmB,EAAQnB,cAGvE9C,EAAKC,MAAM2F,UAAW,EApatB,SAASrE,EAAcF,GAIrB,GAHoB,iBAATA,IACTA,EAAOwE,OAAOxE,IAEZ,6BAA6ByE,KAAKzE,GACpC,MAAM,IAAI8D,UAAU,0CAEtB,OAAO9D,EAAK0E,cAGd,SAASvE,EAAeF,GAItB,MAHqB,iBAAVA,IACTA,EAAQuE,OAAOvE,IAEVA,EAIT,SAASgB,EAAYF,GACnB,IAAIK,EAAW,CACbuD,KAAM,WACJ,IAAI1E,EAAQc,EAAMyC,QAClB,MAAO,CAACoB,UAAgBC,IAAV5E,EAAqBA,MAAOA,KAU9C,OANIpB,IACFuC,EAAStC,OAAOsC,UAAY,WAC1B,OAAOA,IAIJA,EAGT,SAAStB,EAAQgC,GACfzB,KAAKC,IAAM,GAEPwB,aAAmBhC,EACrBgC,EAAQnB,QAAQ,SAASV,EAAOD,GAC9BK,KAAKN,OAAOC,EAAMC,IACjBI,MACMyE,MAAMC,QAAQjD,GACvBA,EAAQnB,QAAQ,SAASqE,GACvB3E,KAAKN,OAAOiF,EAAO,GAAIA,EAAO,KAC7B3E,MACMyB,GACTnC,OAAOsF,oBAAoBnD,GAASnB,QAAQ,SAASX,GACnDK,KAAKN,OAAOC,EAAM8B,EAAQ9B,KACzBK,MA0DP,SAAS6E,EAAS1D,GAChB,GAAIA,EAAK2D,SACP,OAAO1C,QAAQE,OAAO,IAAImB,UAAU,iBAEtCtC,EAAK2D,UAAW,EAGlB,SAASC,EAAgBC,GACvB,OAAO,IAAI5C,QAAQ,SAASC,EAASC,GACnC0C,EAAOtC,OAAS,WACdL,EAAQ2C,EAAOC,SAEjBD,EAAOxB,QAAU,WACflB,EAAO0C,EAAOrD,UAKpB,SAASuD,EAAsBC,GAC7B,IAAIH,EAAS,IAAII,WACbC,EAAUN,EAAgBC,GAE9B,OADAA,EAAOM,kBAAkBH,GAClBE,EAoBT,SAASE,EAAYC,GACnB,GAAIA,EAAIC,MACN,OAAOD,EAAIC,MAAM,GAEjB,IAAIC,EAAO,IAAIC,WAAWH,EAAII,YAE9B,OADAF,EAAKrF,IAAI,IAAIsF,WAAWH,IACjBE,EAAKG,OAIhB,SAASxE,IA0FP,OAzFArB,KAAK8E,UAAW,EAEhB9E,KAAK8F,UAAY,SAAS3E,GAExB,GADAnB,KAAKoB,UAAYD,EAGV,GAAoB,iBAATA,EAChBnB,KAAK+F,UAAY5E,OACZ,GAAI3C,GAAgBE,KAAKM,UAAUC,cAAckC,GACtDnB,KAAKgG,UAAY7E,OACZ,GAAI3C,GAAoByH,SAASjH,UAAUC,cAAckC,GAC9DnB,KAAKkG,cAAgB/E,OAChB,GAAI3C,GAAwB2H,gBAAgBnH,UAAUC,cAAckC,GACzEnB,KAAK+F,UAAY5E,EAAK5B,gBACjB,GAAIf,GAAuBA,GAAgBK,EAAWsC,GAC3DnB,KAAKoG,iBAAmBb,EAAYpE,EAAK0E,QAEzC7F,KAAKoB,UAAY,IAAI1C,KAAK,CAACsB,KAAKoG,uBAC3B,CAAA,IAAI5H,IAAwBW,YAAYH,UAAUC,cAAckC,KAASjC,EAAkBiC,GAGhG,MAAM,IAAIkF,MAAM,6BAFhBrG,KAAKoG,iBAAmBb,EAAYpE,QAdpCnB,KAAK+F,UAAY,GAmBd/F,KAAKyB,QAAQvB,IAAI,kBACA,iBAATiB,EACTnB,KAAKyB,QAAQpB,IAAI,eAAgB,4BACxBL,KAAKgG,WAAahG,KAAKgG,UAAUnE,KAC1C7B,KAAKyB,QAAQpB,IAAI,eAAgBL,KAAKgG,UAAUnE,MACvCrD,GAAwB2H,gBAAgBnH,UAAUC,cAAckC,IACzEnB,KAAKyB,QAAQpB,IAAI,eAAgB,qDAKnC7B,IACFwB,KAAKmF,KAAO,WACV,IAAImB,EAAWzB,EAAS7E,MACxB,GAAIsG,EACF,OAAOA,EAGT,GAAItG,KAAKgG,UACP,OAAO5D,QAAQC,QAAQrC,KAAKgG,WACvB,GAAIhG,KAAKoG,iBACd,OAAOhE,QAAQC,QAAQ,IAAI3D,KAAK,CAACsB,KAAKoG,oBACjC,GAAIpG,KAAKkG,cACd,MAAM,IAAIG,MAAM,wCAEhB,OAAOjE,QAAQC,QAAQ,IAAI3D,KAAK,CAACsB,KAAK+F,cAI1C/F,KAAKuG,YAAc,WACjB,OAAIvG,KAAKoG,iBACAvB,EAAS7E,OAASoC,QAAQC,QAAQrC,KAAKoG,kBAEvCpG,KAAKmF,OAAOqB,KAAKtB,KAK9BlF,KAAKyG,KAAO,WACV,IA3FoBtB,EAClBH,EACAK,EAyFEiB,EAAWzB,EAAS7E,MACxB,GAAIsG,EACF,OAAOA,EAGT,GAAItG,KAAKgG,UACP,OAjGkBb,EAiGInF,KAAKgG,UAhG3BhB,EAAS,IAAII,WACbC,EAAUN,EAAgBC,GAC9BA,EAAO0B,WAAWvB,GACXE,EA8FE,GAAIrF,KAAKoG,iBACd,OAAOhE,QAAQC,QA5FrB,SAA+BmD,GAI7B,IAHA,IAAIE,EAAO,IAAIC,WAAWH,GACtBmB,EAAQ,IAAIlC,MAAMiB,EAAKkB,QAElBC,EAAI,EAAGA,EAAInB,EAAKkB,OAAQC,IAC/BF,EAAME,GAAK1C,OAAO2C,aAAapB,EAAKmB,IAEtC,OAAOF,EAAMtD,KAAK,IAqFS0D,CAAsB/G,KAAKoG,mBAC7C,GAAIpG,KAAKkG,cACd,MAAM,IAAIG,MAAM,wCAEhB,OAAOjE,QAAQC,QAAQrC,KAAK+F,YAI5BvH,IACFwB,KAAKgH,SAAW,WACd,OAAOhH,KAAKyG,OAAOD,KAAKS,KAI5BjH,KAAKkH,KAAO,WACV,OAAOlH,KAAKyG,OAAOD,KAAKW,KAAKC,QAGxBpH,KAWT,SAASiB,EAAQiB,EAAOU,GAEtB,IAPuBgB,EACnByD,EAMAlG,GADJyB,EAAUA,GAAW,IACFzB,KAEnB,GAAIe,aAAiBjB,EAAS,CAC5B,GAAIiB,EAAM4C,SACR,MAAM,IAAIrB,UAAU,gBAEtBzD,KAAK0B,IAAMQ,EAAMR,IACjB1B,KAAK6D,YAAc3B,EAAM2B,YACpBjB,EAAQnB,UACXzB,KAAKyB,QAAU,IAAIhC,EAAQyC,EAAMT,UAEnCzB,KAAK4D,OAAS1B,EAAM0B,OACpB5D,KAAKsH,KAAOpF,EAAMoF,KACbnG,GAA2B,MAAnBe,EAAMd,YACjBD,EAAOe,EAAMd,UACbc,EAAM4C,UAAW,QAGnB9E,KAAK0B,IAAMyC,OAAOjC,GAWpB,GARAlC,KAAK6D,YAAcjB,EAAQiB,aAAe7D,KAAK6D,aAAe,QAC1DjB,EAAQnB,SAAYzB,KAAKyB,UAC3BzB,KAAKyB,QAAU,IAAIhC,EAAQmD,EAAQnB,UAErCzB,KAAK4D,QAhCkBA,EAgCOhB,EAAQgB,QAAU5D,KAAK4D,QAAU,MA/B3DyD,EAAUzD,EAAO2D,eACe,EAA5BvG,EAAQ3B,QAAQgI,GAAiBA,EAAUzD,GA+BnD5D,KAAKsH,KAAO1E,EAAQ0E,MAAQtH,KAAKsH,MAAQ,KACzCtH,KAAKwH,SAAW,MAEK,QAAhBxH,KAAK4D,QAAoC,SAAhB5D,KAAK4D,SAAsBzC,EACvD,MAAM,IAAIsC,UAAU,6CAEtBzD,KAAK8F,UAAU3E,GAOjB,SAAS8F,EAAO9F,GACd,IAAIsG,EAAO,IAAIxB,SASf,OARA9E,EAAKiC,OAAOL,MAAM,KAAKzC,QAAQ,SAASoH,GACtC,GAAIA,EAAO,CACT,IAAI3E,EAAQ2E,EAAM3E,MAAM,KACpBpD,EAAOoD,EAAMI,QAAQL,QAAQ,MAAO,KACpClD,EAAQmD,EAAMM,KAAK,KAAKP,QAAQ,MAAO,KAC3C2E,EAAK/H,OAAOiI,mBAAmBhI,GAAOgI,mBAAmB/H,OAGtD6H,EAqBT,SAASnG,EAASsG,EAAUhF,GACrBA,IACHA,EAAU,IAGZ5C,KAAK6B,KAAO,UACZ7B,KAAKuB,YAA4BiD,IAAnB5B,EAAQrB,OAAuB,IAAMqB,EAAQrB,OAC3DvB,KAAK6H,GAAoB,KAAf7H,KAAKuB,QAAiBvB,KAAKuB,OAAS,IAC9CvB,KAAKwB,WAAa,eAAgBoB,EAAUA,EAAQpB,WAAa,KACjExB,KAAKyB,QAAU,IAAIhC,EAAQmD,EAAQnB,SACnCzB,KAAK0B,IAAMkB,EAAQlB,KAAO,GAC1B1B,KAAK8F,UAAU8B,IAnYnB,CAidmB,oBAATtJ,KAAuBA,KAAO0B"}
\ No newline at end of file
diff --git a/node_modules/cross-fetch/dist/node-polyfill.js b/node_modules/cross-fetch/dist/node-polyfill.js
deleted file mode 100644
index 8bf4e4e..0000000
--- a/node_modules/cross-fetch/dist/node-polyfill.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var fetchNode = require('./node-ponyfill');
-var fetch = fetchNode.fetch.bind({});
-
-fetch.polyfill = true;
-
-if (!global.fetch) {
-  global.fetch = fetch;
-  global.Response = fetchNode.Response;
-  global.Headers = fetchNode.Headers;
-  global.Request = fetchNode.Request;
-}
-
diff --git a/node_modules/cross-fetch/dist/node-ponyfill.js b/node_modules/cross-fetch/dist/node-ponyfill.js
deleted file mode 100644
index 281b0be..0000000
--- a/node_modules/cross-fetch/dist/node-ponyfill.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var nodeFetch = require('node-fetch');
-var realFetch = nodeFetch.default || nodeFetch;
-
-var fetch = function (url, options) {
-  // Support schemaless URIs on the server for parity with the browser.
-  // Ex: //github.com/ -> https://github.com/
-  if (/^\/\//.test(url)) {
-    url = 'https:' + url;
-  }
-  return realFetch.call(this, url, options);
-};
-
-fetch.polyfill = false;
-
-module.exports = exports = fetch;
-exports.fetch = fetch;
-exports.Headers = nodeFetch.Headers;
-exports.Request = nodeFetch.Request;
-exports.Response = nodeFetch.Response;
-
-// Needed for TypeScript.
-exports.default = fetch;
diff --git a/node_modules/cross-fetch/index.d.ts b/node_modules/cross-fetch/index.d.ts
deleted file mode 100644
index ec1a72b..0000000
--- a/node_modules/cross-fetch/index.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-declare const fet: typeof fetch;
-declare const req: typeof Request;
-declare const res: typeof Response;
-declare const headers: typeof Headers;
-
-declare module "cross-fetch" {
-  export const fetch: typeof fet;
-  export const Request: typeof req;
-  export const Response: typeof res;
-  export const Headers: typeof headers;
-  export default fetch;
-}
diff --git a/node_modules/cross-fetch/node_modules/node-fetch/CHANGELOG.md b/node_modules/cross-fetch/node_modules/node-fetch/CHANGELOG.md
deleted file mode 100644
index 6bc6196..0000000
--- a/node_modules/cross-fetch/node_modules/node-fetch/CHANGELOG.md
+++ /dev/null
@@ -1,219 +0,0 @@
-
-Changelog
-=========
-
-
-# 2.x release
-
-## v2.1.2
-
-- Fix: allow `Body` methods to work on ArrayBuffer`-backed `Body` objects
-- Fix: reject promise returned by `Body` methods when the accumulated `Buffer` exceeds the maximum size
-- Fix: support custom `Host` headers with any casing
-- Fix: support importing `fetch()` from TypeScript in `browser.js`
-- Fix: handle the redirect response body properly
-
-## v2.1.1
-
-Fix packaging errors in v2.1.0.
-
-## v2.1.0
-
-- Enhance: allow using ArrayBuffer as the `body` of a `fetch()` or `Request`
-- Fix: store HTTP headers of a `Headers` object internally with the given case, for compatibility with older servers that incorrectly treated header names in a case-sensitive manner
-- Fix: silently ignore invalid HTTP headers
-- Fix: handle HTTP redirect responses without a `Location` header just like non-redirect responses
-- Fix: include bodies when following a redirection when appropriate
-
-## v2.0.0
-
-This is a major release. Check [our upgrade guide](https://github.com/bitinn/node-fetch/blob/master/UPGRADE-GUIDE.md) for an overview on some key differences between v1 and v2.
-
-### General changes
-
-- Major: Node.js 0.10.x and 0.12.x support is dropped
-- Major: `require('node-fetch/lib/response')` etc. is now unsupported; use `require('node-fetch').Response` or ES6 module imports
-- Enhance: start testing on Node.js v4.x, v6.x, v8.x LTS, as well as v9.x stable
-- Enhance: use Rollup to produce a distributed bundle (less memory overhead and faster startup)
-- Enhance: make `Object.prototype.toString()` on Headers, Requests, and Responses return correct class strings
-- Other: rewrite in ES2015 using Babel
-- Other: use Codecov for code coverage tracking
-- Other: update package.json script for npm 5
-- Other: `encoding` module is now optional (alpha.7)
-- Other: expose browser.js through package.json, avoid bundling mishaps (alpha.9)
-- Other: allow TypeScript to `import` node-fetch by exposing default (alpha.9)
-
-### HTTP requests
-
-- Major: overwrite user's `Content-Length` if we can be sure our information is correct (per spec)
-- Fix: errors in a response are caught before the body is accessed
-- Fix: support WHATWG URL objects, created by `whatwg-url` package or `require('url').URL` in Node.js 7+
-
-### Response and Request classes
-
-- Major: `response.text()` no longer attempts to detect encoding, instead always opting for UTF-8 (per spec); use `response.textConverted()` for the v1 behavior
-- Major: make `response.json()` throw error instead of returning an empty object on 204 no-content respose (per spec; reverts behavior changed in v1.6.2)
-- Major: internal methods are no longer exposed
-- Major: throw error when a `GET` or `HEAD` Request is constructed with a non-null body (per spec)
-- Enhance: add `response.arrayBuffer()` (also applies to Requests)
-- Enhance: add experimental `response.blob()` (also applies to Requests)
-- Enhance: `URLSearchParams` is now accepted as a body
-- Enhance: wrap `response.json()` json parsing error as `FetchError`
-- Fix: fix Request and Response with `null` body
-
-### Headers class
-
-- Major: remove `headers.getAll()`; make `get()` return all headers delimited by commas (per spec)
-- Enhance: make Headers iterable
-- Enhance: make Headers constructor accept an array of tuples
-- Enhance: make sure header names and values are valid in HTTP
-- Fix: coerce Headers prototype function parameters to strings, where applicable
-
-### Documentation
-
-- Enhance: more comprehensive API docs
-- Enhance: add a list of default headers in README
-
-
-# 1.x release
-
-## backport releases (v1.7.0 and beyond)
-
-See [changelog on 1.x branch](https://github.com/bitinn/node-fetch/blob/1.x/CHANGELOG.md) for details.
-
-## v1.6.3
-
-- Enhance: error handling document to explain `FetchError` design
-- Fix: support `form-data` 2.x releases (requires `form-data` >= 2.1.0)
-
-## v1.6.2
-
-- Enhance: minor document update
-- Fix: response.json() returns empty object on 204 no-content response instead of throwing a syntax error
-
-## v1.6.1
-
-- Fix: if `res.body` is a non-stream non-formdata object, we will call `body.toString` and send it as a string
-- Fix: `counter` value is incorrectly set to `follow` value when wrapping Request instance
-- Fix: documentation update
-
-## v1.6.0
-
-- Enhance: added `res.buffer()` api for convenience, it returns body as a Node.js buffer
-- Enhance: better old server support by handling raw deflate response
-- Enhance: skip encoding detection for non-HTML/XML response
-- Enhance: minor document update
-- Fix: HEAD request doesn't need decompression, as body is empty
-- Fix: `req.body` now accepts a Node.js buffer
-
-## v1.5.3
-
-- Fix: handle 204 and 304 responses when body is empty but content-encoding is gzip/deflate
-- Fix: allow resolving response and cloned response in any order
-- Fix: avoid setting `content-length` when `form-data` body use streams
-- Fix: send DELETE request with content-length when body is present
-- Fix: allow any url when calling new Request, but still reject non-http(s) url in fetch
-
-## v1.5.2
-
-- Fix: allow node.js core to handle keep-alive connection pool when passing a custom agent
-
-## v1.5.1
-
-- Fix: redirect mode `manual` should work even when there is no redirection or broken redirection
-
-## v1.5.0
-
-- Enhance: rejected promise now use custom `Error` (thx to @pekeler)
-- Enhance: `FetchError` contains `err.type` and `err.code`, allows for better error handling (thx to @pekeler)
-- Enhance: basic support for redirect mode `manual` and `error`, allows for location header extraction (thx to @jimmywarting for the initial PR)
-
-## v1.4.1
-
-- Fix: wrapping Request instance with FormData body again should preserve the body as-is
-
-## v1.4.0
-
-- Enhance: Request and Response now have `clone` method (thx to @kirill-konshin for the initial PR)
-- Enhance: Request and Response now have proper string and buffer body support (thx to @kirill-konshin)
-- Enhance: Body constructor has been refactored out (thx to @kirill-konshin)
-- Enhance: Headers now has `forEach` method (thx to @tricoder42)
-- Enhance: back to 100% code coverage
-- Fix: better form-data support (thx to @item4)
-- Fix: better character encoding detection under chunked encoding (thx to @dsuket for the initial PR)
-
-## v1.3.3
-
-- Fix: make sure `Content-Length` header is set when body is string for POST/PUT/PATCH requests
-- Fix: handle body stream error, for cases such as incorrect `Content-Encoding` header
-- Fix: when following certain redirects, use `GET` on subsequent request per Fetch Spec
-- Fix: `Request` and `Response` constructors now parse headers input using `Headers`
-
-## v1.3.2
-
-- Enhance: allow auto detect of form-data input (no `FormData` spec on node.js, this is form-data specific feature)
-
-## v1.3.1
-
-- Enhance: allow custom host header to be set (server-side only feature, as it's a forbidden header on client-side)
-
-## v1.3.0
-
-- Enhance: now `fetch.Request` is exposed as well
-
-## v1.2.1
-
-- Enhance: `Headers` now normalized `Number` value to `String`, prevent common mistakes
-
-## v1.2.0
-
-- Enhance: now fetch.Headers and fetch.Response are exposed, making testing easier
-
-## v1.1.2
-
-- Fix: `Headers` should only support `String` and `Array` properties, and ignore others
-
-## v1.1.1
-
-- Enhance: now req.headers accept both plain object and `Headers` instance
-
-## v1.1.0
-
-- Enhance: timeout now also applies to response body (in case of slow response)
-- Fix: timeout is now cleared properly when fetch is done/has failed
-
-## v1.0.6
-
-- Fix: less greedy content-type charset matching
-
-## v1.0.5
-
-- Fix: when `follow = 0`, fetch should not follow redirect
-- Enhance: update tests for better coverage
-- Enhance: code formatting
-- Enhance: clean up doc
-
-## v1.0.4
-
-- Enhance: test iojs support
-- Enhance: timeout attached to socket event only fire once per redirect
-
-## v1.0.3
-
-- Fix: response size limit should reject large chunk
-- Enhance: added character encoding detection for xml, such as rss/atom feed (encoding in DTD)
-
-## v1.0.2
-
-- Fix: added res.ok per spec change
-
-## v1.0.0
-
-- Enhance: better test coverage and doc
-
-
-# 0.x release
-
-## v0.1
-
-- Major: initial public release
diff --git a/node_modules/cross-fetch/node_modules/node-fetch/LICENSE.md b/node_modules/cross-fetch/node_modules/node-fetch/LICENSE.md
deleted file mode 100644
index 660ffec..0000000
--- a/node_modules/cross-fetch/node_modules/node-fetch/LICENSE.md
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 David Frank
-
-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/node_modules/cross-fetch/node_modules/node-fetch/README.md b/node_modules/cross-fetch/node_modules/node-fetch/README.md
deleted file mode 100644
index 5f9a091..0000000
--- a/node_modules/cross-fetch/node_modules/node-fetch/README.md
+++ /dev/null
@@ -1,409 +0,0 @@
-
-node-fetch
-==========
-
-[![npm stable version][npm-image]][npm-url]
-[![npm next version][npm-next-image]][npm-url]
-[![build status][travis-image]][travis-url]
-[![coverage status][codecov-image]][codecov-url]
-
-A light-weight module that brings `window.fetch` to Node.js
-
-
-## Motivation
-
-Instead of implementing `XMLHttpRequest` in Node.js to run browser-specific [Fetch polyfill](https://github.com/github/fetch), why not go from native `http` to `fetch` API directly? Hence `node-fetch`, minimal code for a `window.fetch` compatible API on Node.js runtime.
-
-See Matt Andrews' [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch) or Leonardo Quixada's [cross-fetch](https://github.com/lquixada/cross-fetch) for isomorphic usage (exports `node-fetch` for server-side, `whatwg-fetch` for client-side).
-
-
-## Features
-
-- Stay consistent with `window.fetch` API.
-- Make conscious trade-off when following [whatwg fetch spec][whatwg-fetch] and [stream spec](https://streams.spec.whatwg.org/) implementation details, document known difference.
-- Use native promise, but allow substituting it with [insert your favorite promise library].
-- Use native stream for body, on both request and response.
-- Decode content encoding (gzip/deflate) properly, convert `res.text()` output to UTF-8 optionally.
-- Useful extensions such as timeout, redirect limit, response size limit, [explicit errors][ERROR-HANDLING.md] for troubleshooting.
-
-
-## Difference from client-side fetch
-
-- See [Known Differences][LIMITS.md] for details.
-- If you happen to use a missing feature that `window.fetch` offers, feel free to open an issue.
-- Pull requests are welcomed too!
-
-
-## Install
-
-Stable release (`2.x`)
-
-```sh
-$ npm install node-fetch --save
-```
-
-## Usage
-
-Note that documentation below is up-to-date with `2.x` releases, [see `1.x` readme](https://github.com/bitinn/node-fetch/blob/1.x/README.md), [changelog](https://github.com/bitinn/node-fetch/blob/1.x/CHANGELOG.md) and [2.x upgrade guide][UPGRADE-GUIDE.md] if you want to find out the difference.
-
-```javascript
-import fetch from 'node-fetch';
-// or
-// const fetch = require('node-fetch');
-
-// if you are using your own Promise library, set it through fetch.Promise. Eg.
-
-// import Bluebird from 'bluebird';
-// fetch.Promise = Bluebird;
-
-// plain text or html
-
-fetch('https://github.com/')
-	.then(res => res.text())
-	.then(body => console.log(body));
-
-// json
-
-fetch('https://api.github.com/users/github')
-	.then(res => res.json())
-	.then(json => console.log(json));
-
-// catching network error
-// 3xx-5xx responses are NOT network errors, and should be handled in then()
-// you only need one catch() at the end of your promise chain
-
-fetch('http://domain.invalid/')
-	.catch(err => console.error(err));
-
-// stream
-// the node.js way is to use stream when possible
-
-fetch('https://assets-cdn.github.com/images/modules/logos_page/Octocat.png')
-	.then(res => {
-		const dest = fs.createWriteStream('./octocat.png');
-		res.body.pipe(dest);
-	});
-
-// buffer
-// if you prefer to cache binary data in full, use buffer()
-// note that buffer() is a node-fetch only API
-
-import fileType from 'file-type';
-
-fetch('https://assets-cdn.github.com/images/modules/logos_page/Octocat.png')
-	.then(res => res.buffer())
-	.then(buffer => fileType(buffer))
-	.then(type => { /* ... */ });
-
-// meta
-
-fetch('https://github.com/')
-	.then(res => {
-		console.log(res.ok);
-		console.log(res.status);
-		console.log(res.statusText);
-		console.log(res.headers.raw());
-		console.log(res.headers.get('content-type'));
-	});
-
-// post
-
-fetch('http://httpbin.org/post', { method: 'POST', body: 'a=1' })
-	.then(res => res.json())
-	.then(json => console.log(json));
-
-// post with stream from file
-
-import { createReadStream } from 'fs';
-
-const stream = createReadStream('input.txt');
-fetch('http://httpbin.org/post', { method: 'POST', body: stream })
-	.then(res => res.json())
-	.then(json => console.log(json));
-
-// post with JSON
-
-var body = { a: 1 };
-fetch('http://httpbin.org/post', { 
-	method: 'POST',
-	body:    JSON.stringify(body),
-	headers: { 'Content-Type': 'application/json' },
-})
-	.then(res => res.json())
-	.then(json => console.log(json));
-
-// post form parameters (x-www-form-urlencoded)
-
-import { URLSearchParams } from 'url';
-
-const params = new URLSearchParams();
-params.append('a', 1);
-fetch('http://httpbin.org/post', { method: 'POST', body: params })
-	.then(res => res.json())
-	.then(json => console.log(json));
-
-// post with form-data (detect multipart)
-
-import FormData from 'form-data';
-
-const form = new FormData();
-form.append('a', 1);
-fetch('http://httpbin.org/post', { method: 'POST', body: form })
-	.then(res => res.json())
-	.then(json => console.log(json));
-
-// post with form-data (custom headers)
-// note that getHeaders() is non-standard API
-
-import FormData from 'form-data';
-
-const form = new FormData();
-form.append('a', 1);
-fetch('http://httpbin.org/post', { method: 'POST', body: form, headers: form.getHeaders() })
-	.then(res => res.json())
-	.then(json => console.log(json));
-
-// node 7+ with async function
-
-(async function () {
-	const res = await fetch('https://api.github.com/users/github');
-	const json = await res.json();
-	console.log(json);
-})();
-```
-
-See [test cases](https://github.com/bitinn/node-fetch/blob/master/test/test.js) for more examples.
-
-
-## API
-
-### fetch(url[, options])
-
-- `url` A string representing the URL for fetching
-- `options` [Options](#fetch-options) for the HTTP(S) request
-- Returns: <code>Promise&lt;[Response](#class-response)&gt;</code>
-
-Perform an HTTP(S) fetch.
-
-`url` should be an absolute url, such as `http://example.com/`. A path-relative URL (`/file/under/root`) or protocol-relative URL (`//can-be-http-or-https.com/`) will result in a rejected promise.
-
-<a id="fetch-options"></a>
-#### Options
-
-The default values are shown after each option key.
-
-```js
-{
-	// These properties are part of the Fetch Standard
-	method: 'GET',
-	headers: {},        // request headers. format is the identical to that accepted by the Headers constructor (see below)
-	body: null,         // request body. can be null, a string, a Buffer, a Blob, or a Node.js Readable stream
-	redirect: 'follow', // set to `manual` to extract redirect headers, `error` to reject redirect
-
-	// The following properties are node-fetch extensions
-	follow: 20,         // maximum redirect count. 0 to not follow redirect
-	timeout: 0,         // req/res timeout in ms, it resets on redirect. 0 to disable (OS limit applies)
-	compress: true,     // support gzip/deflate content encoding. false to disable
-	size: 0,            // maximum response body size in bytes. 0 to disable
-	agent: null         // http(s).Agent instance, allows custom proxy, certificate etc.
-}
-```
-
-##### Default Headers
-
-If no values are set, the following request headers will be sent automatically:
-
-Header            | Value
------------------ | --------------------------------------------------------
-`Accept-Encoding` | `gzip,deflate` _(when `options.compress === true`)_
-`Accept`          | `*/*`
-`Connection`      | `close` _(when no `options.agent` is present)_
-`Content-Length`  | _(automatically calculated, if possible)_
-`User-Agent`      | `node-fetch/1.0 (+https://github.com/bitinn/node-fetch)`
-
-<a id="class-request"></a>
-### Class: Request
-
-An HTTP(S) request containing information about URL, method, headers, and the body. This class implements the [Body](#iface-body) interface.
-
-Due to the nature of Node.js, the following properties are not implemented at this moment:
-
-- `type`
-- `destination`
-- `referrer`
-- `referrerPolicy`
-- `mode`
-- `credentials`
-- `cache`
-- `integrity`
-- `keepalive`
-
-The following node-fetch extension properties are provided:
-
-- `follow`
-- `compress`
-- `counter`
-- `agent`
-
-See [options](#fetch-options) for exact meaning of these extensions.
-
-#### new Request(input[, options])
-
-<small>*(spec-compliant)*</small>
-
-- `input` A string representing a URL, or another `Request` (which will be cloned)
-- `options` [Options][#fetch-options] for the HTTP(S) request
-
-Constructs a new `Request` object. The constructor is identical to that in the [browser](https://developer.mozilla.org/en-US/docs/Web/API/Request/Request).
-
-In most cases, directly `fetch(url, options)` is simpler than creating a `Request` object.
-
-<a id="class-response"></a>
-### Class: Response
-
-An HTTP(S) response. This class implements the [Body](#iface-body) interface.
-
-The following properties are not implemented in node-fetch at this moment:
-
-- `Response.error()`
-- `Response.redirect()`
-- `type`
-- `redirected`
-- `trailer`
-
-#### new Response([body[, options]])
-
-<small>*(spec-compliant)*</small>
-
-- `body` A string or [Readable stream][node-readable]
-- `options` A [`ResponseInit`][response-init] options dictionary
-
-Constructs a new `Response` object. The constructor is identical to that in the [browser](https://developer.mozilla.org/en-US/docs/Web/API/Response/Response).
-
-Because Node.js does not implement service workers (for which this class was designed), one rarely has to construct a `Response` directly.
-
-#### response.ok
-
-Convenience property representing if the request ended normally. Will evaluate to true if the response status was greater than or equal to 200 but smaller than 300.
-
-<a id="class-headers"></a>
-### Class: Headers
-
-This class allows manipulating and iterating over a set of HTTP headers. All methods specified in the [Fetch Standard][whatwg-fetch] are implemented.
-
-#### new Headers([init])
-
-<small>*(spec-compliant)*</small>
-
-- `init` Optional argument to pre-fill the `Headers` object
-
-Construct a new `Headers` object. `init` can be either `null`, a `Headers` object, an key-value map object, or any iterable object.
-
-```js
-// Example adapted from https://fetch.spec.whatwg.org/#example-headers-class
-
-const meta = {
-  'Content-Type': 'text/xml',
-  'Breaking-Bad': '<3'
-};
-const headers = new Headers(meta);
-
-// The above is equivalent to
-const meta = [
-  [ 'Content-Type', 'text/xml' ],
-  [ 'Breaking-Bad', '<3' ]
-];
-const headers = new Headers(meta);
-
-// You can in fact use any iterable objects, like a Map or even another Headers
-const meta = new Map();
-meta.set('Content-Type', 'text/xml');
-meta.set('Breaking-Bad', '<3');
-const headers = new Headers(meta);
-const copyOfHeaders = new Headers(headers);
-```
-
-<a id="iface-body"></a>
-### Interface: Body
-
-`Body` is an abstract interface with methods that are applicable to both `Request` and `Response` classes.
-
-The following methods are not yet implemented in node-fetch at this moment:
-
-- `formData()`
-
-#### body.body
-
-<small>*(deviation from spec)*</small>
-
-* Node.js [`Readable` stream][node-readable]
-
-The data encapsulated in the `Body` object. Note that while the [Fetch Standard][whatwg-fetch] requires the property to always be a WHATWG `ReadableStream`, in node-fetch it is a Node.js [`Readable` stream][node-readable].
-
-#### body.bodyUsed
-
-<small>*(spec-compliant)*</small>
-
-* `Boolean`
-
-A boolean property for if this body has been consumed. Per spec, a consumed body cannot be used again.
-
-#### body.arrayBuffer()
-#### body.blob()
-#### body.json()
-#### body.text()
-
-<small>*(spec-compliant)*</small>
-
-* Returns: <code>Promise</code>
-
-Consume the body and return a promise that will resolve to one of these formats.
-
-#### body.buffer()
-
-<small>*(node-fetch extension)*</small>
-
-* Returns: <code>Promise&lt;Buffer&gt;</code>
-
-Consume the body and return a promise that will resolve to a Buffer.
-
-#### body.textConverted()
-
-<small>*(node-fetch extension)*</small>
-
-* Returns: <code>Promise&lt;String&gt;</code>
-
-Identical to `body.text()`, except instead of always converting to UTF-8, encoding sniffing will be performed and text converted to UTF-8, if possible.
-
-<a id="class-fetcherror"></a>
-### Class: FetchError
-
-<small>*(node-fetch extension)*</small>
-
-An operational error in the fetching process. See [ERROR-HANDLING.md][] for more info.
-
-## License
-
-MIT
-
-
-## Acknowledgement
-
-Thanks to [github/fetch](https://github.com/github/fetch) for providing a solid implementation reference.
-
-
-[npm-image]: https://img.shields.io/npm/v/node-fetch.svg?style=flat-square
-[npm-next-image]: https://img.shields.io/npm/v/node-fetch/next.svg?style=flat-square
-[npm-url]: https://www.npmjs.com/package/node-fetch
-[travis-image]: https://img.shields.io/travis/bitinn/node-fetch.svg?style=flat-square
-[travis-url]: https://travis-ci.org/bitinn/node-fetch
-[codecov-image]: https://img.shields.io/codecov/c/github/bitinn/node-fetch.svg?style=flat-square
-[codecov-url]: https://codecov.io/gh/bitinn/node-fetch
-
-[ERROR-HANDLING.md]: https://github.com/bitinn/node-fetch/blob/master/ERROR-HANDLING.md
-[LIMITS.md]: https://github.com/bitinn/node-fetch/blob/master/LIMITS.md
-[UPGRADE-GUIDE.md]: https://github.com/bitinn/node-fetch/blob/master/UPGRADE-GUIDE.md
-
-[whatwg-fetch]: https://fetch.spec.whatwg.org/
-[response-init]: https://fetch.spec.whatwg.org/#responseinit
-[node-readable]: https://nodejs.org/api/stream.html#stream_readable_streams
diff --git a/node_modules/cross-fetch/node_modules/node-fetch/browser.js b/node_modules/cross-fetch/node_modules/node-fetch/browser.js
deleted file mode 100644
index ee023e0..0000000
--- a/node_modules/cross-fetch/node_modules/node-fetch/browser.js
+++ /dev/null
@@ -1,8 +0,0 @@
-module.exports = exports = window.fetch;
-
-// Needed for TypeScript and Webpack.
-exports.default = window.fetch.bind(window);
-
-exports.Headers = window.Headers;
-exports.Request = window.Request;
-exports.Response = window.Response;
diff --git a/node_modules/cross-fetch/node_modules/node-fetch/lib/index.es.js b/node_modules/cross-fetch/node_modules/node-fetch/lib/index.es.js
deleted file mode 100644
index 9caec44..0000000
--- a/node_modules/cross-fetch/node_modules/node-fetch/lib/index.es.js
+++ /dev/null
@@ -1,1550 +0,0 @@
-// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js
-// (MIT licensed)
-
-const BUFFER = Symbol('buffer');
-const TYPE = Symbol('type');
-
-class Blob {
-	constructor() {
-		this[TYPE] = '';
-
-		const blobParts = arguments[0];
-		const options = arguments[1];
-
-		const buffers = [];
-
-		if (blobParts) {
-			const a = blobParts;
-			const length = Number(a.length);
-			for (let i = 0; i < length; i++) {
-				const element = a[i];
-				let buffer;
-				if (element instanceof Buffer) {
-					buffer = element;
-				} else if (ArrayBuffer.isView(element)) {
-					buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);
-				} else if (element instanceof ArrayBuffer) {
-					buffer = Buffer.from(element);
-				} else if (element instanceof Blob) {
-					buffer = element[BUFFER];
-				} else {
-					buffer = Buffer.from(typeof element === 'string' ? element : String(element));
-				}
-				buffers.push(buffer);
-			}
-		}
-
-		this[BUFFER] = Buffer.concat(buffers);
-
-		let type = options && options.type !== undefined && String(options.type).toLowerCase();
-		if (type && !/[^\u0020-\u007E]/.test(type)) {
-			this[TYPE] = type;
-		}
-	}
-	get size() {
-		return this[BUFFER].length;
-	}
-	get type() {
-		return this[TYPE];
-	}
-	slice() {
-		const size = this.size;
-
-		const start = arguments[0];
-		const end = arguments[1];
-		let relativeStart, relativeEnd;
-		if (start === undefined) {
-			relativeStart = 0;
-		} else if (start < 0) {
-			relativeStart = Math.max(size + start, 0);
-		} else {
-			relativeStart = Math.min(start, size);
-		}
-		if (end === undefined) {
-			relativeEnd = size;
-		} else if (end < 0) {
-			relativeEnd = Math.max(size + end, 0);
-		} else {
-			relativeEnd = Math.min(end, size);
-		}
-		const span = Math.max(relativeEnd - relativeStart, 0);
-
-		const buffer = this[BUFFER];
-		const slicedBuffer = buffer.slice(relativeStart, relativeStart + span);
-		const blob = new Blob([], { type: arguments[2] });
-		blob[BUFFER] = slicedBuffer;
-		return blob;
-	}
-}
-
-Object.defineProperties(Blob.prototype, {
-	size: { enumerable: true },
-	type: { enumerable: true },
-	slice: { enumerable: true }
-});
-
-Object.defineProperty(Blob.prototype, Symbol.toStringTag, {
-	value: 'Blob',
-	writable: false,
-	enumerable: false,
-	configurable: true
-});
-
-/**
- * fetch-error.js
- *
- * FetchError interface for operational errors
- */
-
-/**
- * Create FetchError instance
- *
- * @param   String      message      Error message for human
- * @param   String      type         Error type for machine
- * @param   String      systemError  For Node.js system error
- * @return  FetchError
- */
-function FetchError(message, type, systemError) {
-  Error.call(this, message);
-
-  this.message = message;
-  this.type = type;
-
-  // when err.type is `system`, err.code contains system error code
-  if (systemError) {
-    this.code = this.errno = systemError.code;
-  }
-
-  // hide custom error implementation details from end-users
-  Error.captureStackTrace(this, this.constructor);
-}
-
-FetchError.prototype = Object.create(Error.prototype);
-FetchError.prototype.constructor = FetchError;
-FetchError.prototype.name = 'FetchError';
-
-/**
- * body.js
- *
- * Body interface provides common methods for Request and Response
- */
-
-const Stream = require('stream');
-
-var _require = require('stream');
-
-const PassThrough = _require.PassThrough;
-
-
-let convert;
-try {
-	convert = require('encoding').convert;
-} catch (e) {}
-
-const INTERNALS = Symbol('Body internals');
-
-/**
- * Body mixin
- *
- * Ref: https://fetch.spec.whatwg.org/#body
- *
- * @param   Stream  body  Readable stream
- * @param   Object  opts  Response options
- * @return  Void
- */
-function Body(body) {
-	var _this = this;
-
-	var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
-	    _ref$size = _ref.size;
-
-	let size = _ref$size === undefined ? 0 : _ref$size;
-	var _ref$timeout = _ref.timeout;
-	let timeout = _ref$timeout === undefined ? 0 : _ref$timeout;
-
-	if (body == null) {
-		// body is undefined or null
-		body = null;
-	} else if (typeof body === 'string') {
-		// body is string
-	} else if (isURLSearchParams(body)) {
-		// body is a URLSearchParams
-	} else if (body instanceof Blob) {
-		// body is blob
-	} else if (Buffer.isBuffer(body)) {
-		// body is buffer
-	} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
-		// body is array buffer
-	} else if (body instanceof Stream) {
-		// body is stream
-	} else {
-		// none of the above
-		// coerce to string
-		body = String(body);
-	}
-	this[INTERNALS] = {
-		body,
-		disturbed: false,
-		error: null
-	};
-	this.size = size;
-	this.timeout = timeout;
-
-	if (body instanceof Stream) {
-		body.on('error', function (err) {
-			_this[INTERNALS].error = new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);
-		});
-	}
-}
-
-Body.prototype = {
-	get body() {
-		return this[INTERNALS].body;
-	},
-
-	get bodyUsed() {
-		return this[INTERNALS].disturbed;
-	},
-
-	/**
-  * Decode response as ArrayBuffer
-  *
-  * @return  Promise
-  */
-	arrayBuffer() {
-		return consumeBody.call(this).then(function (buf) {
-			return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
-		});
-	},
-
-	/**
-  * Return raw response as Blob
-  *
-  * @return Promise
-  */
-	blob() {
-		let ct = this.headers && this.headers.get('content-type') || '';
-		return consumeBody.call(this).then(function (buf) {
-			return Object.assign(
-			// Prevent copying
-			new Blob([], {
-				type: ct.toLowerCase()
-			}), {
-				[BUFFER]: buf
-			});
-		});
-	},
-
-	/**
-  * Decode response as json
-  *
-  * @return  Promise
-  */
-	json() {
-		var _this2 = this;
-
-		return consumeBody.call(this).then(function (buffer) {
-			try {
-				return JSON.parse(buffer.toString());
-			} catch (err) {
-				return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));
-			}
-		});
-	},
-
-	/**
-  * Decode response as text
-  *
-  * @return  Promise
-  */
-	text() {
-		return consumeBody.call(this).then(function (buffer) {
-			return buffer.toString();
-		});
-	},
-
-	/**
-  * Decode response as buffer (non-spec api)
-  *
-  * @return  Promise
-  */
-	buffer() {
-		return consumeBody.call(this);
-	},
-
-	/**
-  * Decode response as text, while automatically detecting the encoding and
-  * trying to decode to UTF-8 (non-spec api)
-  *
-  * @return  Promise
-  */
-	textConverted() {
-		var _this3 = this;
-
-		return consumeBody.call(this).then(function (buffer) {
-			return convertBody(buffer, _this3.headers);
-		});
-	}
-
-};
-
-// In browsers, all properties are enumerable.
-Object.defineProperties(Body.prototype, {
-	body: { enumerable: true },
-	bodyUsed: { enumerable: true },
-	arrayBuffer: { enumerable: true },
-	blob: { enumerable: true },
-	json: { enumerable: true },
-	text: { enumerable: true }
-});
-
-Body.mixIn = function (proto) {
-	for (const name of Object.getOwnPropertyNames(Body.prototype)) {
-		// istanbul ignore else: future proof
-		if (!(name in proto)) {
-			const desc = Object.getOwnPropertyDescriptor(Body.prototype, name);
-			Object.defineProperty(proto, name, desc);
-		}
-	}
-};
-
-/**
- * Consume and convert an entire Body to a Buffer.
- *
- * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body
- *
- * @return  Promise
- */
-function consumeBody() {
-	var _this4 = this;
-
-	if (this[INTERNALS].disturbed) {
-		return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));
-	}
-
-	this[INTERNALS].disturbed = true;
-
-	if (this[INTERNALS].error) {
-		return Body.Promise.reject(this[INTERNALS].error);
-	}
-
-	// body is null
-	if (this.body === null) {
-		return Body.Promise.resolve(Buffer.alloc(0));
-	}
-
-	// body is string
-	if (typeof this.body === 'string') {
-		return Body.Promise.resolve(Buffer.from(this.body));
-	}
-
-	// body is blob
-	if (this.body instanceof Blob) {
-		return Body.Promise.resolve(this.body[BUFFER]);
-	}
-
-	// body is buffer
-	if (Buffer.isBuffer(this.body)) {
-		return Body.Promise.resolve(this.body);
-	}
-
-	// body is buffer
-	if (Object.prototype.toString.call(this.body) === '[object ArrayBuffer]') {
-		return Body.Promise.resolve(Buffer.from(this.body));
-	}
-
-	// istanbul ignore if: should never happen
-	if (!(this.body instanceof Stream)) {
-		return Body.Promise.resolve(Buffer.alloc(0));
-	}
-
-	// body is stream
-	// get ready to actually consume the body
-	let accum = [];
-	let accumBytes = 0;
-	let abort = false;
-
-	return new Body.Promise(function (resolve, reject) {
-		let resTimeout;
-
-		// allow timeout on slow response body
-		if (_this4.timeout) {
-			resTimeout = setTimeout(function () {
-				abort = true;
-				reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));
-			}, _this4.timeout);
-		}
-
-		// handle stream error, such as incorrect content-encoding
-		_this4.body.on('error', function (err) {
-			reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));
-		});
-
-		_this4.body.on('data', function (chunk) {
-			if (abort || chunk === null) {
-				return;
-			}
-
-			if (_this4.size && accumBytes + chunk.length > _this4.size) {
-				abort = true;
-				reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));
-				return;
-			}
-
-			accumBytes += chunk.length;
-			accum.push(chunk);
-		});
-
-		_this4.body.on('end', function () {
-			if (abort) {
-				return;
-			}
-
-			clearTimeout(resTimeout);
-
-			try {
-				resolve(Buffer.concat(accum));
-			} catch (err) {
-				// handle streams that have accumulated too much data (issue #414)
-				reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));
-			}
-		});
-	});
-}
-
-/**
- * Detect buffer encoding and convert to target encoding
- * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding
- *
- * @param   Buffer  buffer    Incoming buffer
- * @param   String  encoding  Target encoding
- * @return  String
- */
-function convertBody(buffer, headers) {
-	if (typeof convert !== 'function') {
-		throw new Error('The package `encoding` must be installed to use the textConverted() function');
-	}
-
-	const ct = headers.get('content-type');
-	let charset = 'utf-8';
-	let res, str;
-
-	// header
-	if (ct) {
-		res = /charset=([^;]*)/i.exec(ct);
-	}
-
-	// no charset in content type, peek at response body for at most 1024 bytes
-	str = buffer.slice(0, 1024).toString();
-
-	// html5
-	if (!res && str) {
-		res = /<meta.+?charset=(['"])(.+?)\1/i.exec(str);
-	}
-
-	// html4
-	if (!res && str) {
-		res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str);
-
-		if (res) {
-			res = /charset=(.*)/i.exec(res.pop());
-		}
-	}
-
-	// xml
-	if (!res && str) {
-		res = /<\?xml.+?encoding=(['"])(.+?)\1/i.exec(str);
-	}
-
-	// found charset
-	if (res) {
-		charset = res.pop();
-
-		// prevent decode issues when sites use incorrect encoding
-		// ref: https://hsivonen.fi/encoding-menu/
-		if (charset === 'gb2312' || charset === 'gbk') {
-			charset = 'gb18030';
-		}
-	}
-
-	// turn raw buffers into a single utf-8 buffer
-	return convert(buffer, 'UTF-8', charset).toString();
-}
-
-/**
- * Detect a URLSearchParams object
- * ref: https://github.com/bitinn/node-fetch/issues/296#issuecomment-307598143
- *
- * @param   Object  obj     Object to detect by type or brand
- * @return  String
- */
-function isURLSearchParams(obj) {
-	// Duck-typing as a necessary condition.
-	if (typeof obj !== 'object' || typeof obj.append !== 'function' || typeof obj.delete !== 'function' || typeof obj.get !== 'function' || typeof obj.getAll !== 'function' || typeof obj.has !== 'function' || typeof obj.set !== 'function') {
-		return false;
-	}
-
-	// Brand-checking and more duck-typing as optional condition.
-	return obj.constructor.name === 'URLSearchParams' || Object.prototype.toString.call(obj) === '[object URLSearchParams]' || typeof obj.sort === 'function';
-}
-
-/**
- * Clone body given Res/Req instance
- *
- * @param   Mixed  instance  Response or Request instance
- * @return  Mixed
- */
-function clone(instance) {
-	let p1, p2;
-	let body = instance.body;
-
-	// don't allow cloning a used body
-	if (instance.bodyUsed) {
-		throw new Error('cannot clone body after it is used');
-	}
-
-	// check that body is a stream and not form-data object
-	// note: we can't clone the form-data object without having it as a dependency
-	if (body instanceof Stream && typeof body.getBoundary !== 'function') {
-		// tee instance body
-		p1 = new PassThrough();
-		p2 = new PassThrough();
-		body.pipe(p1);
-		body.pipe(p2);
-		// set instance body to teed body and return the other teed body
-		instance[INTERNALS].body = p1;
-		body = p2;
-	}
-
-	return body;
-}
-
-/**
- * Performs the operation "extract a `Content-Type` value from |object|" as
- * specified in the specification:
- * https://fetch.spec.whatwg.org/#concept-bodyinit-extract
- *
- * This function assumes that instance.body is present.
- *
- * @param   Mixed  instance  Response or Request instance
- */
-function extractContentType(instance) {
-	const body = instance.body;
-
-	// istanbul ignore if: Currently, because of a guard in Request, body
-	// can never be null. Included here for completeness.
-
-	if (body === null) {
-		// body is null
-		return null;
-	} else if (typeof body === 'string') {
-		// body is string
-		return 'text/plain;charset=UTF-8';
-	} else if (isURLSearchParams(body)) {
-		// body is a URLSearchParams
-		return 'application/x-www-form-urlencoded;charset=UTF-8';
-	} else if (body instanceof Blob) {
-		// body is blob
-		return body.type || null;
-	} else if (Buffer.isBuffer(body)) {
-		// body is buffer
-		return null;
-	} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
-		// body is array buffer
-		return null;
-	} else if (typeof body.getBoundary === 'function') {
-		// detect form data input from form-data module
-		return `multipart/form-data;boundary=${body.getBoundary()}`;
-	} else {
-		// body is stream
-		// can't really do much about this
-		return null;
-	}
-}
-
-/**
- * The Fetch Standard treats this as if "total bytes" is a property on the body.
- * For us, we have to explicitly get it with a function.
- *
- * ref: https://fetch.spec.whatwg.org/#concept-body-total-bytes
- *
- * @param   Body    instance   Instance of Body
- * @return  Number?            Number of bytes, or null if not possible
- */
-function getTotalBytes(instance) {
-	const body = instance.body;
-
-	// istanbul ignore if: included for completion
-
-	if (body === null) {
-		// body is null
-		return 0;
-	} else if (typeof body === 'string') {
-		// body is string
-		return Buffer.byteLength(body);
-	} else if (isURLSearchParams(body)) {
-		// body is URLSearchParams
-		return Buffer.byteLength(String(body));
-	} else if (body instanceof Blob) {
-		// body is blob
-		return body.size;
-	} else if (Buffer.isBuffer(body)) {
-		// body is buffer
-		return body.length;
-	} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
-		// body is array buffer
-		return body.byteLength;
-	} else if (body && typeof body.getLengthSync === 'function') {
-		// detect form data input from form-data module
-		if (body._lengthRetrievers && body._lengthRetrievers.length == 0 || // 1.x
-		body.hasKnownLength && body.hasKnownLength()) {
-			// 2.x
-			return body.getLengthSync();
-		}
-		return null;
-	} else {
-		// body is stream
-		// can't really do much about this
-		return null;
-	}
-}
-
-/**
- * Write a Body to a Node.js WritableStream (e.g. http.Request) object.
- *
- * @param   Body    instance   Instance of Body
- * @return  Void
- */
-function writeToStream(dest, instance) {
-	const body = instance.body;
-
-
-	if (body === null) {
-		// body is null
-		dest.end();
-	} else if (typeof body === 'string') {
-		// body is string
-		dest.write(body);
-		dest.end();
-	} else if (isURLSearchParams(body)) {
-		// body is URLSearchParams
-		dest.write(Buffer.from(String(body)));
-		dest.end();
-	} else if (body instanceof Blob) {
-		// body is blob
-		dest.write(body[BUFFER]);
-		dest.end();
-	} else if (Buffer.isBuffer(body)) {
-		// body is buffer
-		dest.write(body);
-		dest.end();
-	} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
-		// body is array buffer
-		dest.write(Buffer.from(body));
-		dest.end();
-	} else {
-		// body is stream
-		body.pipe(dest);
-	}
-}
-
-// expose Promise
-Body.Promise = global.Promise;
-
-/**
- * headers.js
- *
- * Headers class offers convenient helpers
- */
-
-const invalidTokenRegex = /[^\^_`a-zA-Z\-0-9!#$%&'*+.|~]/;
-const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/;
-
-function validateName(name) {
-	name = `${name}`;
-	if (invalidTokenRegex.test(name)) {
-		throw new TypeError(`${name} is not a legal HTTP header name`);
-	}
-}
-
-function validateValue(value) {
-	value = `${value}`;
-	if (invalidHeaderCharRegex.test(value)) {
-		throw new TypeError(`${value} is not a legal HTTP header value`);
-	}
-}
-
-/**
- * Find the key in the map object given a header name.
- *
- * Returns undefined if not found.
- *
- * @param   String  name  Header name
- * @return  String|Undefined
- */
-function find(map, name) {
-	name = name.toLowerCase();
-	for (const key in map) {
-		if (key.toLowerCase() === name) {
-			return key;
-		}
-	}
-	return undefined;
-}
-
-const MAP = Symbol('map');
-class Headers {
-	/**
-  * Headers class
-  *
-  * @param   Object  headers  Response headers
-  * @return  Void
-  */
-	constructor() {
-		let init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
-
-		this[MAP] = Object.create(null);
-
-		if (init instanceof Headers) {
-			const rawHeaders = init.raw();
-			const headerNames = Object.keys(rawHeaders);
-
-			for (const headerName of headerNames) {
-				for (const value of rawHeaders[headerName]) {
-					this.append(headerName, value);
-				}
-			}
-
-			return;
-		}
-
-		// We don't worry about converting prop to ByteString here as append()
-		// will handle it.
-		if (init == null) {
-			// no op
-		} else if (typeof init === 'object') {
-			const method = init[Symbol.iterator];
-			if (method != null) {
-				if (typeof method !== 'function') {
-					throw new TypeError('Header pairs must be iterable');
-				}
-
-				// sequence<sequence<ByteString>>
-				// Note: per spec we have to first exhaust the lists then process them
-				const pairs = [];
-				for (const pair of init) {
-					if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {
-						throw new TypeError('Each header pair must be iterable');
-					}
-					pairs.push(Array.from(pair));
-				}
-
-				for (const pair of pairs) {
-					if (pair.length !== 2) {
-						throw new TypeError('Each header pair must be a name/value tuple');
-					}
-					this.append(pair[0], pair[1]);
-				}
-			} else {
-				// record<ByteString, ByteString>
-				for (const key of Object.keys(init)) {
-					const value = init[key];
-					this.append(key, value);
-				}
-			}
-		} else {
-			throw new TypeError('Provided initializer must be an object');
-		}
-	}
-
-	/**
-  * Return combined header value given name
-  *
-  * @param   String  name  Header name
-  * @return  Mixed
-  */
-	get(name) {
-		name = `${name}`;
-		validateName(name);
-		const key = find(this[MAP], name);
-		if (key === undefined) {
-			return null;
-		}
-
-		return this[MAP][key].join(', ');
-	}
-
-	/**
-  * Iterate over all headers
-  *
-  * @param   Function  callback  Executed for each item with parameters (value, name, thisArg)
-  * @param   Boolean   thisArg   `this` context for callback function
-  * @return  Void
-  */
-	forEach(callback) {
-		let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-
-		let pairs = getHeaders(this);
-		let i = 0;
-		while (i < pairs.length) {
-			var _pairs$i = pairs[i];
-			const name = _pairs$i[0],
-			      value = _pairs$i[1];
-
-			callback.call(thisArg, value, name, this);
-			pairs = getHeaders(this);
-			i++;
-		}
-	}
-
-	/**
-  * Overwrite header values given name
-  *
-  * @param   String  name   Header name
-  * @param   String  value  Header value
-  * @return  Void
-  */
-	set(name, value) {
-		name = `${name}`;
-		value = `${value}`;
-		validateName(name);
-		validateValue(value);
-		const key = find(this[MAP], name);
-		this[MAP][key !== undefined ? key : name] = [value];
-	}
-
-	/**
-  * Append a value onto existing header
-  *
-  * @param   String  name   Header name
-  * @param   String  value  Header value
-  * @return  Void
-  */
-	append(name, value) {
-		name = `${name}`;
-		value = `${value}`;
-		validateName(name);
-		validateValue(value);
-		const key = find(this[MAP], name);
-		if (key !== undefined) {
-			this[MAP][key].push(value);
-		} else {
-			this[MAP][name] = [value];
-		}
-	}
-
-	/**
-  * Check for header name existence
-  *
-  * @param   String   name  Header name
-  * @return  Boolean
-  */
-	has(name) {
-		name = `${name}`;
-		validateName(name);
-		return find(this[MAP], name) !== undefined;
-	}
-
-	/**
-  * Delete all header values given name
-  *
-  * @param   String  name  Header name
-  * @return  Void
-  */
-	delete(name) {
-		name = `${name}`;
-		validateName(name);
-		const key = find(this[MAP], name);
-		if (key !== undefined) {
-			delete this[MAP][key];
-		}
-	}
-
-	/**
-  * Return raw headers (non-spec api)
-  *
-  * @return  Object
-  */
-	raw() {
-		return this[MAP];
-	}
-
-	/**
-  * Get an iterator on keys.
-  *
-  * @return  Iterator
-  */
-	keys() {
-		return createHeadersIterator(this, 'key');
-	}
-
-	/**
-  * Get an iterator on values.
-  *
-  * @return  Iterator
-  */
-	values() {
-		return createHeadersIterator(this, 'value');
-	}
-
-	/**
-  * Get an iterator on entries.
-  *
-  * This is the default iterator of the Headers object.
-  *
-  * @return  Iterator
-  */
-	[Symbol.iterator]() {
-		return createHeadersIterator(this, 'key+value');
-	}
-}
-Headers.prototype.entries = Headers.prototype[Symbol.iterator];
-
-Object.defineProperty(Headers.prototype, Symbol.toStringTag, {
-	value: 'Headers',
-	writable: false,
-	enumerable: false,
-	configurable: true
-});
-
-Object.defineProperties(Headers.prototype, {
-	get: { enumerable: true },
-	forEach: { enumerable: true },
-	set: { enumerable: true },
-	append: { enumerable: true },
-	has: { enumerable: true },
-	delete: { enumerable: true },
-	keys: { enumerable: true },
-	values: { enumerable: true },
-	entries: { enumerable: true }
-});
-
-function getHeaders(headers) {
-	let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';
-
-	const keys = Object.keys(headers[MAP]).sort();
-	return keys.map(kind === 'key' ? function (k) {
-		return k.toLowerCase();
-	} : kind === 'value' ? function (k) {
-		return headers[MAP][k].join(', ');
-	} : function (k) {
-		return [k.toLowerCase(), headers[MAP][k].join(', ')];
-	});
-}
-
-const INTERNAL = Symbol('internal');
-
-function createHeadersIterator(target, kind) {
-	const iterator = Object.create(HeadersIteratorPrototype);
-	iterator[INTERNAL] = {
-		target,
-		kind,
-		index: 0
-	};
-	return iterator;
-}
-
-const HeadersIteratorPrototype = Object.setPrototypeOf({
-	next() {
-		// istanbul ignore if
-		if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {
-			throw new TypeError('Value of `this` is not a HeadersIterator');
-		}
-
-		var _INTERNAL = this[INTERNAL];
-		const target = _INTERNAL.target,
-		      kind = _INTERNAL.kind,
-		      index = _INTERNAL.index;
-
-		const values = getHeaders(target, kind);
-		const len = values.length;
-		if (index >= len) {
-			return {
-				value: undefined,
-				done: true
-			};
-		}
-
-		this[INTERNAL].index = index + 1;
-
-		return {
-			value: values[index],
-			done: false
-		};
-	}
-}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));
-
-Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {
-	value: 'HeadersIterator',
-	writable: false,
-	enumerable: false,
-	configurable: true
-});
-
-/**
- * Export the Headers object in a form that Node.js can consume.
- *
- * @param   Headers  headers
- * @return  Object
- */
-function exportNodeCompatibleHeaders(headers) {
-	const obj = Object.assign({ __proto__: null }, headers[MAP]);
-
-	// http.request() only supports string as Host header. This hack makes
-	// specifying custom Host header possible.
-	const hostHeaderKey = find(headers[MAP], 'Host');
-	if (hostHeaderKey !== undefined) {
-		obj[hostHeaderKey] = obj[hostHeaderKey][0];
-	}
-
-	return obj;
-}
-
-/**
- * Create a Headers object from an object of headers, ignoring those that do
- * not conform to HTTP grammar productions.
- *
- * @param   Object  obj  Object of headers
- * @return  Headers
- */
-function createHeadersLenient(obj) {
-	const headers = new Headers();
-	for (const name of Object.keys(obj)) {
-		if (invalidTokenRegex.test(name)) {
-			continue;
-		}
-		if (Array.isArray(obj[name])) {
-			for (const val of obj[name]) {
-				if (invalidHeaderCharRegex.test(val)) {
-					continue;
-				}
-				if (headers[MAP][name] === undefined) {
-					headers[MAP][name] = [val];
-				} else {
-					headers[MAP][name].push(val);
-				}
-			}
-		} else if (!invalidHeaderCharRegex.test(obj[name])) {
-			headers[MAP][name] = [obj[name]];
-		}
-	}
-	return headers;
-}
-
-/**
- * response.js
- *
- * Response class provides content decoding
- */
-
-var _require$1 = require('http');
-
-const STATUS_CODES = _require$1.STATUS_CODES;
-
-
-const INTERNALS$1 = Symbol('Response internals');
-
-/**
- * Response class
- *
- * @param   Stream  body  Readable stream
- * @param   Object  opts  Response options
- * @return  Void
- */
-class Response {
-	constructor() {
-		let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
-		let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
-
-		Body.call(this, body, opts);
-
-		const status = opts.status || 200;
-
-		this[INTERNALS$1] = {
-			url: opts.url,
-			status,
-			statusText: opts.statusText || STATUS_CODES[status],
-			headers: new Headers(opts.headers)
-		};
-	}
-
-	get url() {
-		return this[INTERNALS$1].url;
-	}
-
-	get status() {
-		return this[INTERNALS$1].status;
-	}
-
-	/**
-  * Convenience property representing if the request ended normally
-  */
-	get ok() {
-		return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;
-	}
-
-	get statusText() {
-		return this[INTERNALS$1].statusText;
-	}
-
-	get headers() {
-		return this[INTERNALS$1].headers;
-	}
-
-	/**
-  * Clone this response
-  *
-  * @return  Response
-  */
-	clone() {
-		return new Response(clone(this), {
-			url: this.url,
-			status: this.status,
-			statusText: this.statusText,
-			headers: this.headers,
-			ok: this.ok
-		});
-	}
-}
-
-Body.mixIn(Response.prototype);
-
-Object.defineProperties(Response.prototype, {
-	url: { enumerable: true },
-	status: { enumerable: true },
-	ok: { enumerable: true },
-	statusText: { enumerable: true },
-	headers: { enumerable: true },
-	clone: { enumerable: true }
-});
-
-Object.defineProperty(Response.prototype, Symbol.toStringTag, {
-	value: 'Response',
-	writable: false,
-	enumerable: false,
-	configurable: true
-});
-
-/**
- * request.js
- *
- * Request class contains server only options
- *
- * All spec algorithm step numbers are based on https://fetch.spec.whatwg.org/commit-snapshots/ae716822cb3a61843226cd090eefc6589446c1d2/.
- */
-
-var _require$2 = require('url');
-
-const format_url = _require$2.format;
-const parse_url = _require$2.parse;
-
-
-const INTERNALS$2 = Symbol('Request internals');
-
-/**
- * Check if a value is an instance of Request.
- *
- * @param   Mixed   input
- * @return  Boolean
- */
-function isRequest(input) {
-	return typeof input === 'object' && typeof input[INTERNALS$2] === 'object';
-}
-
-/**
- * Request class
- *
- * @param   Mixed   input  Url or Request instance
- * @param   Object  init   Custom options
- * @return  Void
- */
-class Request {
-	constructor(input) {
-		let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
-
-		let parsedURL;
-
-		// normalize input
-		if (!isRequest(input)) {
-			if (input && input.href) {
-				// in order to support Node.js' Url objects; though WHATWG's URL objects
-				// will fall into this branch also (since their `toString()` will return
-				// `href` property anyway)
-				parsedURL = parse_url(input.href);
-			} else {
-				// coerce input to a string before attempting to parse
-				parsedURL = parse_url(`${input}`);
-			}
-			input = {};
-		} else {
-			parsedURL = parse_url(input.url);
-		}
-
-		let method = init.method || input.method || 'GET';
-		method = method.toUpperCase();
-
-		if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {
-			throw new TypeError('Request with GET/HEAD method cannot have body');
-		}
-
-		let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;
-
-		Body.call(this, inputBody, {
-			timeout: init.timeout || input.timeout || 0,
-			size: init.size || input.size || 0
-		});
-
-		const headers = new Headers(init.headers || input.headers || {});
-
-		if (init.body != null) {
-			const contentType = extractContentType(this);
-			if (contentType !== null && !headers.has('Content-Type')) {
-				headers.append('Content-Type', contentType);
-			}
-		}
-
-		this[INTERNALS$2] = {
-			method,
-			redirect: init.redirect || input.redirect || 'follow',
-			headers,
-			parsedURL
-		};
-
-		// node-fetch-only options
-		this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;
-		this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;
-		this.counter = init.counter || input.counter || 0;
-		this.agent = init.agent || input.agent;
-	}
-
-	get method() {
-		return this[INTERNALS$2].method;
-	}
-
-	get url() {
-		return format_url(this[INTERNALS$2].parsedURL);
-	}
-
-	get headers() {
-		return this[INTERNALS$2].headers;
-	}
-
-	get redirect() {
-		return this[INTERNALS$2].redirect;
-	}
-
-	/**
-  * Clone this request
-  *
-  * @return  Request
-  */
-	clone() {
-		return new Request(this);
-	}
-}
-
-Body.mixIn(Request.prototype);
-
-Object.defineProperty(Request.prototype, Symbol.toStringTag, {
-	value: 'Request',
-	writable: false,
-	enumerable: false,
-	configurable: true
-});
-
-Object.defineProperties(Request.prototype, {
-	method: { enumerable: true },
-	url: { enumerable: true },
-	headers: { enumerable: true },
-	redirect: { enumerable: true },
-	clone: { enumerable: true }
-});
-
-/**
- * Convert a Request to Node.js http request options.
- *
- * @param   Request  A Request instance
- * @return  Object   The options object to be passed to http.request
- */
-function getNodeRequestOptions(request) {
-	const parsedURL = request[INTERNALS$2].parsedURL;
-	const headers = new Headers(request[INTERNALS$2].headers);
-
-	// fetch step 1.3
-	if (!headers.has('Accept')) {
-		headers.set('Accept', '*/*');
-	}
-
-	// Basic fetch
-	if (!parsedURL.protocol || !parsedURL.hostname) {
-		throw new TypeError('Only absolute URLs are supported');
-	}
-
-	if (!/^https?:$/.test(parsedURL.protocol)) {
-		throw new TypeError('Only HTTP(S) protocols are supported');
-	}
-
-	// HTTP-network-or-cache fetch steps 2.4-2.7
-	let contentLengthValue = null;
-	if (request.body == null && /^(POST|PUT)$/i.test(request.method)) {
-		contentLengthValue = '0';
-	}
-	if (request.body != null) {
-		const totalBytes = getTotalBytes(request);
-		if (typeof totalBytes === 'number') {
-			contentLengthValue = String(totalBytes);
-		}
-	}
-	if (contentLengthValue) {
-		headers.set('Content-Length', contentLengthValue);
-	}
-
-	// HTTP-network-or-cache fetch step 2.11
-	if (!headers.has('User-Agent')) {
-		headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');
-	}
-
-	// HTTP-network-or-cache fetch step 2.15
-	if (request.compress) {
-		headers.set('Accept-Encoding', 'gzip,deflate');
-	}
-	if (!headers.has('Connection') && !request.agent) {
-		headers.set('Connection', 'close');
-	}
-
-	// HTTP-network fetch step 4.2
-	// chunked encoding is handled by Node.js
-
-	return Object.assign({}, parsedURL, {
-		method: request.method,
-		headers: exportNodeCompatibleHeaders(headers),
-		agent: request.agent
-	});
-}
-
-/**
- * index.js
- *
- * a request API compatible with window.fetch
- *
- * All spec algorithm step numbers are based on https://fetch.spec.whatwg.org/commit-snapshots/ae716822cb3a61843226cd090eefc6589446c1d2/.
- */
-
-const http = require('http');
-const https = require('https');
-
-var _require$3 = require('stream');
-
-const PassThrough$1 = _require$3.PassThrough;
-
-var _require2 = require('url');
-
-const resolve_url = _require2.resolve;
-
-const zlib = require('zlib');
-
-/**
- * Fetch function
- *
- * @param   Mixed    url   Absolute url or Request instance
- * @param   Object   opts  Fetch options
- * @return  Promise
- */
-function fetch(url, opts) {
-
-	// allow custom promise
-	if (!fetch.Promise) {
-		throw new Error('native promise missing, set fetch.Promise to your favorite alternative');
-	}
-
-	Body.Promise = fetch.Promise;
-
-	// wrap http.request into fetch
-	return new fetch.Promise(function (resolve, reject) {
-		// build request object
-		const request = new Request(url, opts);
-		const options = getNodeRequestOptions(request);
-
-		const send = (options.protocol === 'https:' ? https : http).request;
-
-		// send request
-		const req = send(options);
-		let reqTimeout;
-
-		function finalize() {
-			req.abort();
-			clearTimeout(reqTimeout);
-		}
-
-		if (request.timeout) {
-			req.once('socket', function (socket) {
-				reqTimeout = setTimeout(function () {
-					reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));
-					finalize();
-				}, request.timeout);
-			});
-		}
-
-		req.on('error', function (err) {
-			reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
-			finalize();
-		});
-
-		req.on('response', function (res) {
-			clearTimeout(reqTimeout);
-
-			const headers = createHeadersLenient(res.headers);
-
-			// HTTP fetch step 5
-			if (fetch.isRedirect(res.statusCode)) {
-				// HTTP fetch step 5.2
-				const location = headers.get('Location');
-
-				// HTTP fetch step 5.3
-				const locationURL = location === null ? null : resolve_url(request.url, location);
-
-				// HTTP fetch step 5.5
-				switch (request.redirect) {
-					case 'error':
-						reject(new FetchError(`redirect mode is set to error: ${request.url}`, 'no-redirect'));
-						finalize();
-						return;
-					case 'manual':
-						// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.
-						if (locationURL !== null) {
-							headers.set('Location', locationURL);
-						}
-						break;
-					case 'follow':
-						// HTTP-redirect fetch step 2
-						if (locationURL === null) {
-							break;
-						}
-
-						// HTTP-redirect fetch step 5
-						if (request.counter >= request.follow) {
-							reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));
-							finalize();
-							return;
-						}
-
-						// HTTP-redirect fetch step 6 (counter increment)
-						// Create a new Request object.
-						const requestOpts = {
-							headers: new Headers(request.headers),
-							follow: request.follow,
-							counter: request.counter + 1,
-							agent: request.agent,
-							compress: request.compress,
-							method: request.method,
-							body: request.body
-						};
-
-						// HTTP-redirect fetch step 9
-						if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {
-							reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));
-							finalize();
-							return;
-						}
-
-						// HTTP-redirect fetch step 11
-						if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {
-							requestOpts.method = 'GET';
-							requestOpts.body = undefined;
-							requestOpts.headers.delete('content-length');
-						}
-
-						// HTTP-redirect fetch step 15
-						resolve(fetch(new Request(locationURL, requestOpts)));
-						finalize();
-						return;
-				}
-			}
-
-			// prepare response
-			let body = res.pipe(new PassThrough$1());
-			const response_options = {
-				url: request.url,
-				status: res.statusCode,
-				statusText: res.statusMessage,
-				headers: headers,
-				size: request.size,
-				timeout: request.timeout
-			};
-
-			// HTTP-network fetch step 12.1.1.3
-			const codings = headers.get('Content-Encoding');
-
-			// HTTP-network fetch step 12.1.1.4: handle content codings
-
-			// in following scenarios we ignore compression support
-			// 1. compression support is disabled
-			// 2. HEAD request
-			// 3. no Content-Encoding header
-			// 4. no content response (204)
-			// 5. content not modified response (304)
-			if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {
-				resolve(new Response(body, response_options));
-				return;
-			}
-
-			// For Node v6+
-			// Be less strict when decoding compressed responses, since sometimes
-			// servers send slightly invalid responses that are still accepted
-			// by common browsers.
-			// Always using Z_SYNC_FLUSH is what cURL does.
-			const zlibOptions = {
-				flush: zlib.Z_SYNC_FLUSH,
-				finishFlush: zlib.Z_SYNC_FLUSH
-			};
-
-			// for gzip
-			if (codings == 'gzip' || codings == 'x-gzip') {
-				body = body.pipe(zlib.createGunzip(zlibOptions));
-				resolve(new Response(body, response_options));
-				return;
-			}
-
-			// for deflate
-			if (codings == 'deflate' || codings == 'x-deflate') {
-				// handle the infamous raw deflate response from old servers
-				// a hack for old IIS and Apache servers
-				const raw = res.pipe(new PassThrough$1());
-				raw.once('data', function (chunk) {
-					// see http://stackoverflow.com/questions/37519828
-					if ((chunk[0] & 0x0F) === 0x08) {
-						body = body.pipe(zlib.createInflate());
-					} else {
-						body = body.pipe(zlib.createInflateRaw());
-					}
-					resolve(new Response(body, response_options));
-				});
-				return;
-			}
-
-			// otherwise, use response as-is
-			resolve(new Response(body, response_options));
-		});
-
-		writeToStream(req, request);
-	});
-}
-
-/**
- * Redirect code matching
- *
- * @param   Number   code  Status code
- * @return  Boolean
- */
-fetch.isRedirect = function (code) {
-	return code === 301 || code === 302 || code === 303 || code === 307 || code === 308;
-};
-
-// Needed for TypeScript.
-fetch.default = fetch;
-
-// expose Promise
-fetch.Promise = global.Promise;
-
-export default fetch;
-export { Headers, Request, Response, FetchError };
diff --git a/node_modules/cross-fetch/node_modules/node-fetch/lib/index.js b/node_modules/cross-fetch/node_modules/node-fetch/lib/index.js
deleted file mode 100644
index f08ceb5..0000000
--- a/node_modules/cross-fetch/node_modules/node-fetch/lib/index.js
+++ /dev/null
@@ -1,1557 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, '__esModule', { value: true });
-
-// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js
-// (MIT licensed)
-
-const BUFFER = Symbol('buffer');
-const TYPE = Symbol('type');
-
-class Blob {
-	constructor() {
-		this[TYPE] = '';
-
-		const blobParts = arguments[0];
-		const options = arguments[1];
-
-		const buffers = [];
-
-		if (blobParts) {
-			const a = blobParts;
-			const length = Number(a.length);
-			for (let i = 0; i < length; i++) {
-				const element = a[i];
-				let buffer;
-				if (element instanceof Buffer) {
-					buffer = element;
-				} else if (ArrayBuffer.isView(element)) {
-					buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);
-				} else if (element instanceof ArrayBuffer) {
-					buffer = Buffer.from(element);
-				} else if (element instanceof Blob) {
-					buffer = element[BUFFER];
-				} else {
-					buffer = Buffer.from(typeof element === 'string' ? element : String(element));
-				}
-				buffers.push(buffer);
-			}
-		}
-
-		this[BUFFER] = Buffer.concat(buffers);
-
-		let type = options && options.type !== undefined && String(options.type).toLowerCase();
-		if (type && !/[^\u0020-\u007E]/.test(type)) {
-			this[TYPE] = type;
-		}
-	}
-	get size() {
-		return this[BUFFER].length;
-	}
-	get type() {
-		return this[TYPE];
-	}
-	slice() {
-		const size = this.size;
-
-		const start = arguments[0];
-		const end = arguments[1];
-		let relativeStart, relativeEnd;
-		if (start === undefined) {
-			relativeStart = 0;
-		} else if (start < 0) {
-			relativeStart = Math.max(size + start, 0);
-		} else {
-			relativeStart = Math.min(start, size);
-		}
-		if (end === undefined) {
-			relativeEnd = size;
-		} else if (end < 0) {
-			relativeEnd = Math.max(size + end, 0);
-		} else {
-			relativeEnd = Math.min(end, size);
-		}
-		const span = Math.max(relativeEnd - relativeStart, 0);
-
-		const buffer = this[BUFFER];
-		const slicedBuffer = buffer.slice(relativeStart, relativeStart + span);
-		const blob = new Blob([], { type: arguments[2] });
-		blob[BUFFER] = slicedBuffer;
-		return blob;
-	}
-}
-
-Object.defineProperties(Blob.prototype, {
-	size: { enumerable: true },
-	type: { enumerable: true },
-	slice: { enumerable: true }
-});
-
-Object.defineProperty(Blob.prototype, Symbol.toStringTag, {
-	value: 'Blob',
-	writable: false,
-	enumerable: false,
-	configurable: true
-});
-
-/**
- * fetch-error.js
- *
- * FetchError interface for operational errors
- */
-
-/**
- * Create FetchError instance
- *
- * @param   String      message      Error message for human
- * @param   String      type         Error type for machine
- * @param   String      systemError  For Node.js system error
- * @return  FetchError
- */
-function FetchError(message, type, systemError) {
-  Error.call(this, message);
-
-  this.message = message;
-  this.type = type;
-
-  // when err.type is `system`, err.code contains system error code
-  if (systemError) {
-    this.code = this.errno = systemError.code;
-  }
-
-  // hide custom error implementation details from end-users
-  Error.captureStackTrace(this, this.constructor);
-}
-
-FetchError.prototype = Object.create(Error.prototype);
-FetchError.prototype.constructor = FetchError;
-FetchError.prototype.name = 'FetchError';
-
-/**
- * body.js
- *
- * Body interface provides common methods for Request and Response
- */
-
-const Stream = require('stream');
-
-var _require = require('stream');
-
-const PassThrough = _require.PassThrough;
-
-
-let convert;
-try {
-	convert = require('encoding').convert;
-} catch (e) {}
-
-const INTERNALS = Symbol('Body internals');
-
-/**
- * Body mixin
- *
- * Ref: https://fetch.spec.whatwg.org/#body
- *
- * @param   Stream  body  Readable stream
- * @param   Object  opts  Response options
- * @return  Void
- */
-function Body(body) {
-	var _this = this;
-
-	var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
-	    _ref$size = _ref.size;
-
-	let size = _ref$size === undefined ? 0 : _ref$size;
-	var _ref$timeout = _ref.timeout;
-	let timeout = _ref$timeout === undefined ? 0 : _ref$timeout;
-
-	if (body == null) {
-		// body is undefined or null
-		body = null;
-	} else if (typeof body === 'string') {
-		// body is string
-	} else if (isURLSearchParams(body)) {
-		// body is a URLSearchParams
-	} else if (body instanceof Blob) {
-		// body is blob
-	} else if (Buffer.isBuffer(body)) {
-		// body is buffer
-	} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
-		// body is array buffer
-	} else if (body instanceof Stream) {
-		// body is stream
-	} else {
-		// none of the above
-		// coerce to string
-		body = String(body);
-	}
-	this[INTERNALS] = {
-		body,
-		disturbed: false,
-		error: null
-	};
-	this.size = size;
-	this.timeout = timeout;
-
-	if (body instanceof Stream) {
-		body.on('error', function (err) {
-			_this[INTERNALS].error = new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);
-		});
-	}
-}
-
-Body.prototype = {
-	get body() {
-		return this[INTERNALS].body;
-	},
-
-	get bodyUsed() {
-		return this[INTERNALS].disturbed;
-	},
-
-	/**
-  * Decode response as ArrayBuffer
-  *
-  * @return  Promise
-  */
-	arrayBuffer() {
-		return consumeBody.call(this).then(function (buf) {
-			return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
-		});
-	},
-
-	/**
-  * Return raw response as Blob
-  *
-  * @return Promise
-  */
-	blob() {
-		let ct = this.headers && this.headers.get('content-type') || '';
-		return consumeBody.call(this).then(function (buf) {
-			return Object.assign(
-			// Prevent copying
-			new Blob([], {
-				type: ct.toLowerCase()
-			}), {
-				[BUFFER]: buf
-			});
-		});
-	},
-
-	/**
-  * Decode response as json
-  *
-  * @return  Promise
-  */
-	json() {
-		var _this2 = this;
-
-		return consumeBody.call(this).then(function (buffer) {
-			try {
-				return JSON.parse(buffer.toString());
-			} catch (err) {
-				return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));
-			}
-		});
-	},
-
-	/**
-  * Decode response as text
-  *
-  * @return  Promise
-  */
-	text() {
-		return consumeBody.call(this).then(function (buffer) {
-			return buffer.toString();
-		});
-	},
-
-	/**
-  * Decode response as buffer (non-spec api)
-  *
-  * @return  Promise
-  */
-	buffer() {
-		return consumeBody.call(this);
-	},
-
-	/**
-  * Decode response as text, while automatically detecting the encoding and
-  * trying to decode to UTF-8 (non-spec api)
-  *
-  * @return  Promise
-  */
-	textConverted() {
-		var _this3 = this;
-
-		return consumeBody.call(this).then(function (buffer) {
-			return convertBody(buffer, _this3.headers);
-		});
-	}
-
-};
-
-// In browsers, all properties are enumerable.
-Object.defineProperties(Body.prototype, {
-	body: { enumerable: true },
-	bodyUsed: { enumerable: true },
-	arrayBuffer: { enumerable: true },
-	blob: { enumerable: true },
-	json: { enumerable: true },
-	text: { enumerable: true }
-});
-
-Body.mixIn = function (proto) {
-	for (const name of Object.getOwnPropertyNames(Body.prototype)) {
-		// istanbul ignore else: future proof
-		if (!(name in proto)) {
-			const desc = Object.getOwnPropertyDescriptor(Body.prototype, name);
-			Object.defineProperty(proto, name, desc);
-		}
-	}
-};
-
-/**
- * Consume and convert an entire Body to a Buffer.
- *
- * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body
- *
- * @return  Promise
- */
-function consumeBody() {
-	var _this4 = this;
-
-	if (this[INTERNALS].disturbed) {
-		return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));
-	}
-
-	this[INTERNALS].disturbed = true;
-
-	if (this[INTERNALS].error) {
-		return Body.Promise.reject(this[INTERNALS].error);
-	}
-
-	// body is null
-	if (this.body === null) {
-		return Body.Promise.resolve(Buffer.alloc(0));
-	}
-
-	// body is string
-	if (typeof this.body === 'string') {
-		return Body.Promise.resolve(Buffer.from(this.body));
-	}
-
-	// body is blob
-	if (this.body instanceof Blob) {
-		return Body.Promise.resolve(this.body[BUFFER]);
-	}
-
-	// body is buffer
-	if (Buffer.isBuffer(this.body)) {
-		return Body.Promise.resolve(this.body);
-	}
-
-	// body is buffer
-	if (Object.prototype.toString.call(this.body) === '[object ArrayBuffer]') {
-		return Body.Promise.resolve(Buffer.from(this.body));
-	}
-
-	// istanbul ignore if: should never happen
-	if (!(this.body instanceof Stream)) {
-		return Body.Promise.resolve(Buffer.alloc(0));
-	}
-
-	// body is stream
-	// get ready to actually consume the body
-	let accum = [];
-	let accumBytes = 0;
-	let abort = false;
-
-	return new Body.Promise(function (resolve, reject) {
-		let resTimeout;
-
-		// allow timeout on slow response body
-		if (_this4.timeout) {
-			resTimeout = setTimeout(function () {
-				abort = true;
-				reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));
-			}, _this4.timeout);
-		}
-
-		// handle stream error, such as incorrect content-encoding
-		_this4.body.on('error', function (err) {
-			reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));
-		});
-
-		_this4.body.on('data', function (chunk) {
-			if (abort || chunk === null) {
-				return;
-			}
-
-			if (_this4.size && accumBytes + chunk.length > _this4.size) {
-				abort = true;
-				reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));
-				return;
-			}
-
-			accumBytes += chunk.length;
-			accum.push(chunk);
-		});
-
-		_this4.body.on('end', function () {
-			if (abort) {
-				return;
-			}
-
-			clearTimeout(resTimeout);
-
-			try {
-				resolve(Buffer.concat(accum));
-			} catch (err) {
-				// handle streams that have accumulated too much data (issue #414)
-				reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));
-			}
-		});
-	});
-}
-
-/**
- * Detect buffer encoding and convert to target encoding
- * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding
- *
- * @param   Buffer  buffer    Incoming buffer
- * @param   String  encoding  Target encoding
- * @return  String
- */
-function convertBody(buffer, headers) {
-	if (typeof convert !== 'function') {
-		throw new Error('The package `encoding` must be installed to use the textConverted() function');
-	}
-
-	const ct = headers.get('content-type');
-	let charset = 'utf-8';
-	let res, str;
-
-	// header
-	if (ct) {
-		res = /charset=([^;]*)/i.exec(ct);
-	}
-
-	// no charset in content type, peek at response body for at most 1024 bytes
-	str = buffer.slice(0, 1024).toString();
-
-	// html5
-	if (!res && str) {
-		res = /<meta.+?charset=(['"])(.+?)\1/i.exec(str);
-	}
-
-	// html4
-	if (!res && str) {
-		res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str);
-
-		if (res) {
-			res = /charset=(.*)/i.exec(res.pop());
-		}
-	}
-
-	// xml
-	if (!res && str) {
-		res = /<\?xml.+?encoding=(['"])(.+?)\1/i.exec(str);
-	}
-
-	// found charset
-	if (res) {
-		charset = res.pop();
-
-		// prevent decode issues when sites use incorrect encoding
-		// ref: https://hsivonen.fi/encoding-menu/
-		if (charset === 'gb2312' || charset === 'gbk') {
-			charset = 'gb18030';
-		}
-	}
-
-	// turn raw buffers into a single utf-8 buffer
-	return convert(buffer, 'UTF-8', charset).toString();
-}
-
-/**
- * Detect a URLSearchParams object
- * ref: https://github.com/bitinn/node-fetch/issues/296#issuecomment-307598143
- *
- * @param   Object  obj     Object to detect by type or brand
- * @return  String
- */
-function isURLSearchParams(obj) {
-	// Duck-typing as a necessary condition.
-	if (typeof obj !== 'object' || typeof obj.append !== 'function' || typeof obj.delete !== 'function' || typeof obj.get !== 'function' || typeof obj.getAll !== 'function' || typeof obj.has !== 'function' || typeof obj.set !== 'function') {
-		return false;
-	}
-
-	// Brand-checking and more duck-typing as optional condition.
-	return obj.constructor.name === 'URLSearchParams' || Object.prototype.toString.call(obj) === '[object URLSearchParams]' || typeof obj.sort === 'function';
-}
-
-/**
- * Clone body given Res/Req instance
- *
- * @param   Mixed  instance  Response or Request instance
- * @return  Mixed
- */
-function clone(instance) {
-	let p1, p2;
-	let body = instance.body;
-
-	// don't allow cloning a used body
-	if (instance.bodyUsed) {
-		throw new Error('cannot clone body after it is used');
-	}
-
-	// check that body is a stream and not form-data object
-	// note: we can't clone the form-data object without having it as a dependency
-	if (body instanceof Stream && typeof body.getBoundary !== 'function') {
-		// tee instance body
-		p1 = new PassThrough();
-		p2 = new PassThrough();
-		body.pipe(p1);
-		body.pipe(p2);
-		// set instance body to teed body and return the other teed body
-		instance[INTERNALS].body = p1;
-		body = p2;
-	}
-
-	return body;
-}
-
-/**
- * Performs the operation "extract a `Content-Type` value from |object|" as
- * specified in the specification:
- * https://fetch.spec.whatwg.org/#concept-bodyinit-extract
- *
- * This function assumes that instance.body is present.
- *
- * @param   Mixed  instance  Response or Request instance
- */
-function extractContentType(instance) {
-	const body = instance.body;
-
-	// istanbul ignore if: Currently, because of a guard in Request, body
-	// can never be null. Included here for completeness.
-
-	if (body === null) {
-		// body is null
-		return null;
-	} else if (typeof body === 'string') {
-		// body is string
-		return 'text/plain;charset=UTF-8';
-	} else if (isURLSearchParams(body)) {
-		// body is a URLSearchParams
-		return 'application/x-www-form-urlencoded;charset=UTF-8';
-	} else if (body instanceof Blob) {
-		// body is blob
-		return body.type || null;
-	} else if (Buffer.isBuffer(body)) {
-		// body is buffer
-		return null;
-	} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
-		// body is array buffer
-		return null;
-	} else if (typeof body.getBoundary === 'function') {
-		// detect form data input from form-data module
-		return `multipart/form-data;boundary=${body.getBoundary()}`;
-	} else {
-		// body is stream
-		// can't really do much about this
-		return null;
-	}
-}
-
-/**
- * The Fetch Standard treats this as if "total bytes" is a property on the body.
- * For us, we have to explicitly get it with a function.
- *
- * ref: https://fetch.spec.whatwg.org/#concept-body-total-bytes
- *
- * @param   Body    instance   Instance of Body
- * @return  Number?            Number of bytes, or null if not possible
- */
-function getTotalBytes(instance) {
-	const body = instance.body;
-
-	// istanbul ignore if: included for completion
-
-	if (body === null) {
-		// body is null
-		return 0;
-	} else if (typeof body === 'string') {
-		// body is string
-		return Buffer.byteLength(body);
-	} else if (isURLSearchParams(body)) {
-		// body is URLSearchParams
-		return Buffer.byteLength(String(body));
-	} else if (body instanceof Blob) {
-		// body is blob
-		return body.size;
-	} else if (Buffer.isBuffer(body)) {
-		// body is buffer
-		return body.length;
-	} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
-		// body is array buffer
-		return body.byteLength;
-	} else if (body && typeof body.getLengthSync === 'function') {
-		// detect form data input from form-data module
-		if (body._lengthRetrievers && body._lengthRetrievers.length == 0 || // 1.x
-		body.hasKnownLength && body.hasKnownLength()) {
-			// 2.x
-			return body.getLengthSync();
-		}
-		return null;
-	} else {
-		// body is stream
-		// can't really do much about this
-		return null;
-	}
-}
-
-/**
- * Write a Body to a Node.js WritableStream (e.g. http.Request) object.
- *
- * @param   Body    instance   Instance of Body
- * @return  Void
- */
-function writeToStream(dest, instance) {
-	const body = instance.body;
-
-
-	if (body === null) {
-		// body is null
-		dest.end();
-	} else if (typeof body === 'string') {
-		// body is string
-		dest.write(body);
-		dest.end();
-	} else if (isURLSearchParams(body)) {
-		// body is URLSearchParams
-		dest.write(Buffer.from(String(body)));
-		dest.end();
-	} else if (body instanceof Blob) {
-		// body is blob
-		dest.write(body[BUFFER]);
-		dest.end();
-	} else if (Buffer.isBuffer(body)) {
-		// body is buffer
-		dest.write(body);
-		dest.end();
-	} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
-		// body is array buffer
-		dest.write(Buffer.from(body));
-		dest.end();
-	} else {
-		// body is stream
-		body.pipe(dest);
-	}
-}
-
-// expose Promise
-Body.Promise = global.Promise;
-
-/**
- * headers.js
- *
- * Headers class offers convenient helpers
- */
-
-const invalidTokenRegex = /[^\^_`a-zA-Z\-0-9!#$%&'*+.|~]/;
-const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/;
-
-function validateName(name) {
-	name = `${name}`;
-	if (invalidTokenRegex.test(name)) {
-		throw new TypeError(`${name} is not a legal HTTP header name`);
-	}
-}
-
-function validateValue(value) {
-	value = `${value}`;
-	if (invalidHeaderCharRegex.test(value)) {
-		throw new TypeError(`${value} is not a legal HTTP header value`);
-	}
-}
-
-/**
- * Find the key in the map object given a header name.
- *
- * Returns undefined if not found.
- *
- * @param   String  name  Header name
- * @return  String|Undefined
- */
-function find(map, name) {
-	name = name.toLowerCase();
-	for (const key in map) {
-		if (key.toLowerCase() === name) {
-			return key;
-		}
-	}
-	return undefined;
-}
-
-const MAP = Symbol('map');
-class Headers {
-	/**
-  * Headers class
-  *
-  * @param   Object  headers  Response headers
-  * @return  Void
-  */
-	constructor() {
-		let init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
-
-		this[MAP] = Object.create(null);
-
-		if (init instanceof Headers) {
-			const rawHeaders = init.raw();
-			const headerNames = Object.keys(rawHeaders);
-
-			for (const headerName of headerNames) {
-				for (const value of rawHeaders[headerName]) {
-					this.append(headerName, value);
-				}
-			}
-
-			return;
-		}
-
-		// We don't worry about converting prop to ByteString here as append()
-		// will handle it.
-		if (init == null) {
-			// no op
-		} else if (typeof init === 'object') {
-			const method = init[Symbol.iterator];
-			if (method != null) {
-				if (typeof method !== 'function') {
-					throw new TypeError('Header pairs must be iterable');
-				}
-
-				// sequence<sequence<ByteString>>
-				// Note: per spec we have to first exhaust the lists then process them
-				const pairs = [];
-				for (const pair of init) {
-					if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {
-						throw new TypeError('Each header pair must be iterable');
-					}
-					pairs.push(Array.from(pair));
-				}
-
-				for (const pair of pairs) {
-					if (pair.length !== 2) {
-						throw new TypeError('Each header pair must be a name/value tuple');
-					}
-					this.append(pair[0], pair[1]);
-				}
-			} else {
-				// record<ByteString, ByteString>
-				for (const key of Object.keys(init)) {
-					const value = init[key];
-					this.append(key, value);
-				}
-			}
-		} else {
-			throw new TypeError('Provided initializer must be an object');
-		}
-	}
-
-	/**
-  * Return combined header value given name
-  *
-  * @param   String  name  Header name
-  * @return  Mixed
-  */
-	get(name) {
-		name = `${name}`;
-		validateName(name);
-		const key = find(this[MAP], name);
-		if (key === undefined) {
-			return null;
-		}
-
-		return this[MAP][key].join(', ');
-	}
-
-	/**
-  * Iterate over all headers
-  *
-  * @param   Function  callback  Executed for each item with parameters (value, name, thisArg)
-  * @param   Boolean   thisArg   `this` context for callback function
-  * @return  Void
-  */
-	forEach(callback) {
-		let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-
-		let pairs = getHeaders(this);
-		let i = 0;
-		while (i < pairs.length) {
-			var _pairs$i = pairs[i];
-			const name = _pairs$i[0],
-			      value = _pairs$i[1];
-
-			callback.call(thisArg, value, name, this);
-			pairs = getHeaders(this);
-			i++;
-		}
-	}
-
-	/**
-  * Overwrite header values given name
-  *
-  * @param   String  name   Header name
-  * @param   String  value  Header value
-  * @return  Void
-  */
-	set(name, value) {
-		name = `${name}`;
-		value = `${value}`;
-		validateName(name);
-		validateValue(value);
-		const key = find(this[MAP], name);
-		this[MAP][key !== undefined ? key : name] = [value];
-	}
-
-	/**
-  * Append a value onto existing header
-  *
-  * @param   String  name   Header name
-  * @param   String  value  Header value
-  * @return  Void
-  */
-	append(name, value) {
-		name = `${name}`;
-		value = `${value}`;
-		validateName(name);
-		validateValue(value);
-		const key = find(this[MAP], name);
-		if (key !== undefined) {
-			this[MAP][key].push(value);
-		} else {
-			this[MAP][name] = [value];
-		}
-	}
-
-	/**
-  * Check for header name existence
-  *
-  * @param   String   name  Header name
-  * @return  Boolean
-  */
-	has(name) {
-		name = `${name}`;
-		validateName(name);
-		return find(this[MAP], name) !== undefined;
-	}
-
-	/**
-  * Delete all header values given name
-  *
-  * @param   String  name  Header name
-  * @return  Void
-  */
-	delete(name) {
-		name = `${name}`;
-		validateName(name);
-		const key = find(this[MAP], name);
-		if (key !== undefined) {
-			delete this[MAP][key];
-		}
-	}
-
-	/**
-  * Return raw headers (non-spec api)
-  *
-  * @return  Object
-  */
-	raw() {
-		return this[MAP];
-	}
-
-	/**
-  * Get an iterator on keys.
-  *
-  * @return  Iterator
-  */
-	keys() {
-		return createHeadersIterator(this, 'key');
-	}
-
-	/**
-  * Get an iterator on values.
-  *
-  * @return  Iterator
-  */
-	values() {
-		return createHeadersIterator(this, 'value');
-	}
-
-	/**
-  * Get an iterator on entries.
-  *
-  * This is the default iterator of the Headers object.
-  *
-  * @return  Iterator
-  */
-	[Symbol.iterator]() {
-		return createHeadersIterator(this, 'key+value');
-	}
-}
-Headers.prototype.entries = Headers.prototype[Symbol.iterator];
-
-Object.defineProperty(Headers.prototype, Symbol.toStringTag, {
-	value: 'Headers',
-	writable: false,
-	enumerable: false,
-	configurable: true
-});
-
-Object.defineProperties(Headers.prototype, {
-	get: { enumerable: true },
-	forEach: { enumerable: true },
-	set: { enumerable: true },
-	append: { enumerable: true },
-	has: { enumerable: true },
-	delete: { enumerable: true },
-	keys: { enumerable: true },
-	values: { enumerable: true },
-	entries: { enumerable: true }
-});
-
-function getHeaders(headers) {
-	let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';
-
-	const keys = Object.keys(headers[MAP]).sort();
-	return keys.map(kind === 'key' ? function (k) {
-		return k.toLowerCase();
-	} : kind === 'value' ? function (k) {
-		return headers[MAP][k].join(', ');
-	} : function (k) {
-		return [k.toLowerCase(), headers[MAP][k].join(', ')];
-	});
-}
-
-const INTERNAL = Symbol('internal');
-
-function createHeadersIterator(target, kind) {
-	const iterator = Object.create(HeadersIteratorPrototype);
-	iterator[INTERNAL] = {
-		target,
-		kind,
-		index: 0
-	};
-	return iterator;
-}
-
-const HeadersIteratorPrototype = Object.setPrototypeOf({
-	next() {
-		// istanbul ignore if
-		if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {
-			throw new TypeError('Value of `this` is not a HeadersIterator');
-		}
-
-		var _INTERNAL = this[INTERNAL];
-		const target = _INTERNAL.target,
-		      kind = _INTERNAL.kind,
-		      index = _INTERNAL.index;
-
-		const values = getHeaders(target, kind);
-		const len = values.length;
-		if (index >= len) {
-			return {
-				value: undefined,
-				done: true
-			};
-		}
-
-		this[INTERNAL].index = index + 1;
-
-		return {
-			value: values[index],
-			done: false
-		};
-	}
-}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));
-
-Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {
-	value: 'HeadersIterator',
-	writable: false,
-	enumerable: false,
-	configurable: true
-});
-
-/**
- * Export the Headers object in a form that Node.js can consume.
- *
- * @param   Headers  headers
- * @return  Object
- */
-function exportNodeCompatibleHeaders(headers) {
-	const obj = Object.assign({ __proto__: null }, headers[MAP]);
-
-	// http.request() only supports string as Host header. This hack makes
-	// specifying custom Host header possible.
-	const hostHeaderKey = find(headers[MAP], 'Host');
-	if (hostHeaderKey !== undefined) {
-		obj[hostHeaderKey] = obj[hostHeaderKey][0];
-	}
-
-	return obj;
-}
-
-/**
- * Create a Headers object from an object of headers, ignoring those that do
- * not conform to HTTP grammar productions.
- *
- * @param   Object  obj  Object of headers
- * @return  Headers
- */
-function createHeadersLenient(obj) {
-	const headers = new Headers();
-	for (const name of Object.keys(obj)) {
-		if (invalidTokenRegex.test(name)) {
-			continue;
-		}
-		if (Array.isArray(obj[name])) {
-			for (const val of obj[name]) {
-				if (invalidHeaderCharRegex.test(val)) {
-					continue;
-				}
-				if (headers[MAP][name] === undefined) {
-					headers[MAP][name] = [val];
-				} else {
-					headers[MAP][name].push(val);
-				}
-			}
-		} else if (!invalidHeaderCharRegex.test(obj[name])) {
-			headers[MAP][name] = [obj[name]];
-		}
-	}
-	return headers;
-}
-
-/**
- * response.js
- *
- * Response class provides content decoding
- */
-
-var _require$1 = require('http');
-
-const STATUS_CODES = _require$1.STATUS_CODES;
-
-
-const INTERNALS$1 = Symbol('Response internals');
-
-/**
- * Response class
- *
- * @param   Stream  body  Readable stream
- * @param   Object  opts  Response options
- * @return  Void
- */
-class Response {
-	constructor() {
-		let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
-		let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
-
-		Body.call(this, body, opts);
-
-		const status = opts.status || 200;
-
-		this[INTERNALS$1] = {
-			url: opts.url,
-			status,
-			statusText: opts.statusText || STATUS_CODES[status],
-			headers: new Headers(opts.headers)
-		};
-	}
-
-	get url() {
-		return this[INTERNALS$1].url;
-	}
-
-	get status() {
-		return this[INTERNALS$1].status;
-	}
-
-	/**
-  * Convenience property representing if the request ended normally
-  */
-	get ok() {
-		return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;
-	}
-
-	get statusText() {
-		return this[INTERNALS$1].statusText;
-	}
-
-	get headers() {
-		return this[INTERNALS$1].headers;
-	}
-
-	/**
-  * Clone this response
-  *
-  * @return  Response
-  */
-	clone() {
-		return new Response(clone(this), {
-			url: this.url,
-			status: this.status,
-			statusText: this.statusText,
-			headers: this.headers,
-			ok: this.ok
-		});
-	}
-}
-
-Body.mixIn(Response.prototype);
-
-Object.defineProperties(Response.prototype, {
-	url: { enumerable: true },
-	status: { enumerable: true },
-	ok: { enumerable: true },
-	statusText: { enumerable: true },
-	headers: { enumerable: true },
-	clone: { enumerable: true }
-});
-
-Object.defineProperty(Response.prototype, Symbol.toStringTag, {
-	value: 'Response',
-	writable: false,
-	enumerable: false,
-	configurable: true
-});
-
-/**
- * request.js
- *
- * Request class contains server only options
- *
- * All spec algorithm step numbers are based on https://fetch.spec.whatwg.org/commit-snapshots/ae716822cb3a61843226cd090eefc6589446c1d2/.
- */
-
-var _require$2 = require('url');
-
-const format_url = _require$2.format;
-const parse_url = _require$2.parse;
-
-
-const INTERNALS$2 = Symbol('Request internals');
-
-/**
- * Check if a value is an instance of Request.
- *
- * @param   Mixed   input
- * @return  Boolean
- */
-function isRequest(input) {
-	return typeof input === 'object' && typeof input[INTERNALS$2] === 'object';
-}
-
-/**
- * Request class
- *
- * @param   Mixed   input  Url or Request instance
- * @param   Object  init   Custom options
- * @return  Void
- */
-class Request {
-	constructor(input) {
-		let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
-
-		let parsedURL;
-
-		// normalize input
-		if (!isRequest(input)) {
-			if (input && input.href) {
-				// in order to support Node.js' Url objects; though WHATWG's URL objects
-				// will fall into this branch also (since their `toString()` will return
-				// `href` property anyway)
-				parsedURL = parse_url(input.href);
-			} else {
-				// coerce input to a string before attempting to parse
-				parsedURL = parse_url(`${input}`);
-			}
-			input = {};
-		} else {
-			parsedURL = parse_url(input.url);
-		}
-
-		let method = init.method || input.method || 'GET';
-		method = method.toUpperCase();
-
-		if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {
-			throw new TypeError('Request with GET/HEAD method cannot have body');
-		}
-
-		let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;
-
-		Body.call(this, inputBody, {
-			timeout: init.timeout || input.timeout || 0,
-			size: init.size || input.size || 0
-		});
-
-		const headers = new Headers(init.headers || input.headers || {});
-
-		if (init.body != null) {
-			const contentType = extractContentType(this);
-			if (contentType !== null && !headers.has('Content-Type')) {
-				headers.append('Content-Type', contentType);
-			}
-		}
-
-		this[INTERNALS$2] = {
-			method,
-			redirect: init.redirect || input.redirect || 'follow',
-			headers,
-			parsedURL
-		};
-
-		// node-fetch-only options
-		this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;
-		this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;
-		this.counter = init.counter || input.counter || 0;
-		this.agent = init.agent || input.agent;
-	}
-
-	get method() {
-		return this[INTERNALS$2].method;
-	}
-
-	get url() {
-		return format_url(this[INTERNALS$2].parsedURL);
-	}
-
-	get headers() {
-		return this[INTERNALS$2].headers;
-	}
-
-	get redirect() {
-		return this[INTERNALS$2].redirect;
-	}
-
-	/**
-  * Clone this request
-  *
-  * @return  Request
-  */
-	clone() {
-		return new Request(this);
-	}
-}
-
-Body.mixIn(Request.prototype);
-
-Object.defineProperty(Request.prototype, Symbol.toStringTag, {
-	value: 'Request',
-	writable: false,
-	enumerable: false,
-	configurable: true
-});
-
-Object.defineProperties(Request.prototype, {
-	method: { enumerable: true },
-	url: { enumerable: true },
-	headers: { enumerable: true },
-	redirect: { enumerable: true },
-	clone: { enumerable: true }
-});
-
-/**
- * Convert a Request to Node.js http request options.
- *
- * @param   Request  A Request instance
- * @return  Object   The options object to be passed to http.request
- */
-function getNodeRequestOptions(request) {
-	const parsedURL = request[INTERNALS$2].parsedURL;
-	const headers = new Headers(request[INTERNALS$2].headers);
-
-	// fetch step 1.3
-	if (!headers.has('Accept')) {
-		headers.set('Accept', '*/*');
-	}
-
-	// Basic fetch
-	if (!parsedURL.protocol || !parsedURL.hostname) {
-		throw new TypeError('Only absolute URLs are supported');
-	}
-
-	if (!/^https?:$/.test(parsedURL.protocol)) {
-		throw new TypeError('Only HTTP(S) protocols are supported');
-	}
-
-	// HTTP-network-or-cache fetch steps 2.4-2.7
-	let contentLengthValue = null;
-	if (request.body == null && /^(POST|PUT)$/i.test(request.method)) {
-		contentLengthValue = '0';
-	}
-	if (request.body != null) {
-		const totalBytes = getTotalBytes(request);
-		if (typeof totalBytes === 'number') {
-			contentLengthValue = String(totalBytes);
-		}
-	}
-	if (contentLengthValue) {
-		headers.set('Content-Length', contentLengthValue);
-	}
-
-	// HTTP-network-or-cache fetch step 2.11
-	if (!headers.has('User-Agent')) {
-		headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');
-	}
-
-	// HTTP-network-or-cache fetch step 2.15
-	if (request.compress) {
-		headers.set('Accept-Encoding', 'gzip,deflate');
-	}
-	if (!headers.has('Connection') && !request.agent) {
-		headers.set('Connection', 'close');
-	}
-
-	// HTTP-network fetch step 4.2
-	// chunked encoding is handled by Node.js
-
-	return Object.assign({}, parsedURL, {
-		method: request.method,
-		headers: exportNodeCompatibleHeaders(headers),
-		agent: request.agent
-	});
-}
-
-/**
- * index.js
- *
- * a request API compatible with window.fetch
- *
- * All spec algorithm step numbers are based on https://fetch.spec.whatwg.org/commit-snapshots/ae716822cb3a61843226cd090eefc6589446c1d2/.
- */
-
-const http = require('http');
-const https = require('https');
-
-var _require$3 = require('stream');
-
-const PassThrough$1 = _require$3.PassThrough;
-
-var _require2 = require('url');
-
-const resolve_url = _require2.resolve;
-
-const zlib = require('zlib');
-
-/**
- * Fetch function
- *
- * @param   Mixed    url   Absolute url or Request instance
- * @param   Object   opts  Fetch options
- * @return  Promise
- */
-function fetch(url, opts) {
-
-	// allow custom promise
-	if (!fetch.Promise) {
-		throw new Error('native promise missing, set fetch.Promise to your favorite alternative');
-	}
-
-	Body.Promise = fetch.Promise;
-
-	// wrap http.request into fetch
-	return new fetch.Promise(function (resolve, reject) {
-		// build request object
-		const request = new Request(url, opts);
-		const options = getNodeRequestOptions(request);
-
-		const send = (options.protocol === 'https:' ? https : http).request;
-
-		// send request
-		const req = send(options);
-		let reqTimeout;
-
-		function finalize() {
-			req.abort();
-			clearTimeout(reqTimeout);
-		}
-
-		if (request.timeout) {
-			req.once('socket', function (socket) {
-				reqTimeout = setTimeout(function () {
-					reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));
-					finalize();
-				}, request.timeout);
-			});
-		}
-
-		req.on('error', function (err) {
-			reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
-			finalize();
-		});
-
-		req.on('response', function (res) {
-			clearTimeout(reqTimeout);
-
-			const headers = createHeadersLenient(res.headers);
-
-			// HTTP fetch step 5
-			if (fetch.isRedirect(res.statusCode)) {
-				// HTTP fetch step 5.2
-				const location = headers.get('Location');
-
-				// HTTP fetch step 5.3
-				const locationURL = location === null ? null : resolve_url(request.url, location);
-
-				// HTTP fetch step 5.5
-				switch (request.redirect) {
-					case 'error':
-						reject(new FetchError(`redirect mode is set to error: ${request.url}`, 'no-redirect'));
-						finalize();
-						return;
-					case 'manual':
-						// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.
-						if (locationURL !== null) {
-							headers.set('Location', locationURL);
-						}
-						break;
-					case 'follow':
-						// HTTP-redirect fetch step 2
-						if (locationURL === null) {
-							break;
-						}
-
-						// HTTP-redirect fetch step 5
-						if (request.counter >= request.follow) {
-							reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));
-							finalize();
-							return;
-						}
-
-						// HTTP-redirect fetch step 6 (counter increment)
-						// Create a new Request object.
-						const requestOpts = {
-							headers: new Headers(request.headers),
-							follow: request.follow,
-							counter: request.counter + 1,
-							agent: request.agent,
-							compress: request.compress,
-							method: request.method,
-							body: request.body
-						};
-
-						// HTTP-redirect fetch step 9
-						if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {
-							reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));
-							finalize();
-							return;
-						}
-
-						// HTTP-redirect fetch step 11
-						if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {
-							requestOpts.method = 'GET';
-							requestOpts.body = undefined;
-							requestOpts.headers.delete('content-length');
-						}
-
-						// HTTP-redirect fetch step 15
-						resolve(fetch(new Request(locationURL, requestOpts)));
-						finalize();
-						return;
-				}
-			}
-
-			// prepare response
-			let body = res.pipe(new PassThrough$1());
-			const response_options = {
-				url: request.url,
-				status: res.statusCode,
-				statusText: res.statusMessage,
-				headers: headers,
-				size: request.size,
-				timeout: request.timeout
-			};
-
-			// HTTP-network fetch step 12.1.1.3
-			const codings = headers.get('Content-Encoding');
-
-			// HTTP-network fetch step 12.1.1.4: handle content codings
-
-			// in following scenarios we ignore compression support
-			// 1. compression support is disabled
-			// 2. HEAD request
-			// 3. no Content-Encoding header
-			// 4. no content response (204)
-			// 5. content not modified response (304)
-			if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {
-				resolve(new Response(body, response_options));
-				return;
-			}
-
-			// For Node v6+
-			// Be less strict when decoding compressed responses, since sometimes
-			// servers send slightly invalid responses that are still accepted
-			// by common browsers.
-			// Always using Z_SYNC_FLUSH is what cURL does.
-			const zlibOptions = {
-				flush: zlib.Z_SYNC_FLUSH,
-				finishFlush: zlib.Z_SYNC_FLUSH
-			};
-
-			// for gzip
-			if (codings == 'gzip' || codings == 'x-gzip') {
-				body = body.pipe(zlib.createGunzip(zlibOptions));
-				resolve(new Response(body, response_options));
-				return;
-			}
-
-			// for deflate
-			if (codings == 'deflate' || codings == 'x-deflate') {
-				// handle the infamous raw deflate response from old servers
-				// a hack for old IIS and Apache servers
-				const raw = res.pipe(new PassThrough$1());
-				raw.once('data', function (chunk) {
-					// see http://stackoverflow.com/questions/37519828
-					if ((chunk[0] & 0x0F) === 0x08) {
-						body = body.pipe(zlib.createInflate());
-					} else {
-						body = body.pipe(zlib.createInflateRaw());
-					}
-					resolve(new Response(body, response_options));
-				});
-				return;
-			}
-
-			// otherwise, use response as-is
-			resolve(new Response(body, response_options));
-		});
-
-		writeToStream(req, request);
-	});
-}
-
-/**
- * Redirect code matching
- *
- * @param   Number   code  Status code
- * @return  Boolean
- */
-fetch.isRedirect = function (code) {
-	return code === 301 || code === 302 || code === 303 || code === 307 || code === 308;
-};
-
-// Needed for TypeScript.
-fetch.default = fetch;
-
-// expose Promise
-fetch.Promise = global.Promise;
-
-module.exports = exports = fetch;
-exports.Headers = Headers;
-exports.Request = Request;
-exports.Response = Response;
-exports.FetchError = FetchError;
diff --git a/node_modules/cross-fetch/node_modules/node-fetch/package.json b/node_modules/cross-fetch/node_modules/node-fetch/package.json
deleted file mode 100644
index b95e54e..0000000
--- a/node_modules/cross-fetch/node_modules/node-fetch/package.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
-  "name": "node-fetch",
-  "version": "2.1.2",
-  "description": "A light-weight module that brings window.fetch to node.js",
-  "main": "lib/index.js",
-  "browser": "./browser.js",
-  "module": "lib/index.es.js",
-  "files": [
-    "lib/index.js",
-    "lib/index.es.js",
-    "browser.js"
-  ],
-  "engines": {
-    "node": "4.x || >=6.0.0"
-  },
-  "scripts": {
-    "build": "cross-env BABEL_ENV=rollup rollup -c",
-    "prepare": "npm run build",
-    "test": "cross-env BABEL_ENV=test mocha --compilers js:babel-register test/test.js",
-    "report": "cross-env BABEL_ENV=coverage nyc --reporter lcov --reporter text mocha -R spec test/test.js",
-    "coverage": "cross-env BABEL_ENV=coverage nyc --reporter json --reporter text mocha -R spec test/test.js && codecov -f coverage/coverage-final.json"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/bitinn/node-fetch.git"
-  },
-  "keywords": [
-    "fetch",
-    "http",
-    "promise"
-  ],
-  "author": "David Frank",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/bitinn/node-fetch/issues"
-  },
-  "homepage": "https://github.com/bitinn/node-fetch",
-  "devDependencies": {
-    "babel-core": "^6.26.0",
-    "babel-plugin-istanbul": "^4.1.5",
-    "babel-preset-env": "^1.6.1",
-    "babel-register": "^6.16.3",
-    "chai": "^3.5.0",
-    "chai-as-promised": "^7.1.1",
-    "chai-iterator": "^1.1.1",
-    "chai-string": "^1.3.0",
-    "codecov": "^3.0.0",
-    "cross-env": "^5.1.3",
-    "form-data": "^2.3.1",
-    "mocha": "^5.0.0",
-    "nyc": "^11.4.1",
-    "parted": "^0.1.1",
-    "promise": "^8.0.1",
-    "resumer": "0.0.0",
-    "rollup": "^0.55.1",
-    "rollup-plugin-babel": "^3.0.3",
-    "string-to-arraybuffer": "^1.0.0",
-    "url-search-params": "^0.10.0",
-    "whatwg-url": "^5.0.0"
-  },
-  "dependencies": {}
-}
diff --git a/node_modules/cross-fetch/package.json b/node_modules/cross-fetch/package.json
deleted file mode 100644
index 913a0d0..0000000
--- a/node_modules/cross-fetch/package.json
+++ /dev/null
@@ -1,83 +0,0 @@
-{
-  "name": "cross-fetch",
-  "version": "2.2.2",
-  "description": "Universal WHATWG Fetch API for Node, Browsers and React Native",
-  "homepage": "https://github.com/lquixada/cross-fetch",
-  "main": "dist/node-ponyfill.js",
-  "browser": "dist/browser-ponyfill.js",
-  "typings": "index.d.ts",
-  "scripts": {
-    "pretest:node:bundle": "webpack-cli --config test/webpack-node/webpack.config.js",
-    "precommit": "npm run -s build && lint-staged",
-    "build": "rollup -c",
-    "codecov": "nyc report --reporter=text-lcov > coverage.lcov && codecov",
-    "deploy:major": "npm version major && git push --follow-tags",
-    "deploy:minor": "npm version minor && git push --follow-tags",
-    "deploy:patch": "npm version patch && git push --follow-tags",
-    "lint": "eslint .",
-    "sauce": "./tasks/sauce",
-    "security": "snyk test",
-    "test": "npm run -s test:headless && npm run -s test:node && npm run -s test:node:bundle && npm run -s lint",
-    "test:browser": "opn test/browser/index.html",
-    "test:headless": "mocha-headless-chrome -f test/browser/index.html -a no-sandbox -a disable-setuid-sandbox",
-    "test:node:bundle": "nyc mocha test/webpack-node/bundle.js",
-    "test:node": "nyc mocha test/node/index.js"
-  },
-  "lint-staged": {
-    "*.js": [
-      "eslint --fix",
-      "git add"
-    ]
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/lquixada/cross-fetch.git"
-  },
-  "author": "Leonardo Quixada <lquixada@gmail.com>",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/lquixada/cross-fetch/issues"
-  },
-  "dependencies": {
-    "node-fetch": "2.1.2",
-    "whatwg-fetch": "2.0.4"
-  },
-  "devDependencies": {
-    "chai": "4.1.2",
-    "codecov": "3.0.2",
-    "eslint": "4.19.1",
-    "husky": "0.14.3",
-    "lint-staged": "7.2.0",
-    "mocha": "5.2.0",
-    "mocha-headless-chrome": "2.0.0",
-    "nock": "9.3.3",
-    "nyc": "12.0.2",
-    "opn-cli": "3.1.0",
-    "ora": "2.1.0",
-    "rollup": "0.60.7",
-    "rollup-plugin-copy": "0.2.3",
-    "rollup-plugin-uglify": "4.0.0",
-    "sinon": "6.0.0",
-    "snyk": "1.83.0",
-    "webpack": "4.12.0",
-    "webpack-cli": "3.0.7"
-  },
-  "files": [
-    "dist",
-    "polyfill",
-    "index.d.ts"
-  ],
-  "keywords": [
-    "fetch",
-    "isomorphic",
-    "universal",
-    "node",
-    "react",
-    "native",
-    "browser",
-    "ponyfill",
-    "whatwg",
-    "xhr",
-    "ajax"
-  ]
-}
diff --git a/node_modules/cross-fetch/polyfill/package.json b/node_modules/cross-fetch/polyfill/package.json
deleted file mode 100644
index 68a6007..0000000
--- a/node_modules/cross-fetch/polyfill/package.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "name": "cross-fetch-polyfill",
-  "version": "0.0.0",
-  "main": "../dist/node-polyfill.js",
-  "browser": "../dist/browser-polyfill.js"
-}
diff --git a/node_modules/cross-spawn/node_modules/.bin/node-which b/node_modules/cross-spawn/node_modules/.bin/node-which
index 6f8415e..d29008e 120000
--- a/node_modules/cross-spawn/node_modules/.bin/node-which
+++ b/node_modules/cross-spawn/node_modules/.bin/node-which
@@ -1 +1 @@
-../which/bin/node-which
\ No newline at end of file
+../../../jest-haste-map/node_modules/which/bin/node-which
\ No newline at end of file
diff --git a/node_modules/damerau-levenshtein/CHANGELOG.md b/node_modules/damerau-levenshtein/CHANGELOG.md
deleted file mode 100644
index eb6af35..0000000
--- a/node_modules/damerau-levenshtein/CHANGELOG.md
+++ /dev/null
@@ -1,67 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/). This project adheres to [Semantic Versioning](http://semver.org/).
-
-## [Unreleased]
-
-
-## [1.0.6] - 2020-01-27
-
-Changed:
-- Upgrade lodash to version 4.17.15 #16
-
-## [1.0.5] - 2019-05-09
-
-Changed:
-- Upgrade Mocha to version 6.1.4 #12 by @whyboris 
-- Example use in README.md by @whyboris
-
-## [1.0.4] - 2017-03-24
-
-Fixed:
-- Fails in strict mode #7 by @gilly3
-
-## [1.0.3] - 2016-09-26
-
-Fixed:
-- A title of this document :P
-
-Added:
-- List of contributors
-- Bugs URL
-- Git repository URL
-
-## [1.0.2] - 2016-09-26
-
-Fixed:
-- Similarity 0 returned for equal strings #4 by @tad-lispy
-
-## [1.0.1] - 2016-09-12
-
-Fixed:
-- Wrong results for transposition #2 by @g-adolph
-
-Added:
-- First unit test by @g-adolph
-- A Change Log :) by @tad-lispy
-
-## [1.0.0] - 2016-02-23
-
-Fixed:
-- Update README to match the actual output by @gilly3
-
-## [0.1.3] - 2013-09-02
-
-Fixed:
-- Clear matrix on each call @tad-lispy
-- Always return an object @tad-lispy
-
-## [0.1.2] - 2013-08-29
-
-Added:
-- ReadMe
-
-## [0.1.1] - 2013-08-28
-
-Added:
-- Initial working release @tad-lispy
diff --git a/node_modules/damerau-levenshtein/LICENSE b/node_modules/damerau-levenshtein/LICENSE
deleted file mode 100644
index 3332001..0000000
--- a/node_modules/damerau-levenshtein/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-BSD 2-Clause License
-
-Copyright (c) 2018, Tadeusz Łazurski
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
-  list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/damerau-levenshtein/README.md b/node_modules/damerau-levenshtein/README.md
deleted file mode 100644
index 519436e..0000000
--- a/node_modules/damerau-levenshtein/README.md
+++ /dev/null
@@ -1,47 +0,0 @@
-[![NPM](https://nodei.co/npm/damerau-levenshtein.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/damerau-levenshtein/)
-
-It provides a function that takes two string arguments and returns a hash like this:
-
-``` javascript
-{
-  steps: 5,       // Levenstein demerau distance
-  relative: 0.7,  // steps / length of the longer string
-  similarity: 0.3 // 1 - relative
-}
-```
-
-## Install
-
-```sh
-npm install damerau-levenshtein
-```
-
-## Use with ES6 modules
-
-```js
-import * as levenshtien from 'damerau-levenshtein';
-
-const lev = levenshtien('hello world', 'Hello World!');
-// { steps: 4, relative: 0.3076923076923077, similarity: 0.6923076923076923 }
-```
-
-Please see [tests](./test/test.js) for more insights.
-
-## Use with TypeScript
-
-```ts
-import * as levenshtien from 'damerau-levenshtein';
-
-interface LevenshteinResponse {
-  steps: number;
-  relative: number;
-  similarity: number;
-}
-
-const lev: LevenshteinResponse = levenshtien('hello world', 'Hello World!');
-
-console.log(lev.steps);
-// 2
-console.log(lev.foo);
-// TypeScript Error: Property 'foo' does not exist on type 'LevenshteinResponse'.
-```
diff --git a/node_modules/damerau-levenshtein/index.js b/node_modules/damerau-levenshtein/index.js
deleted file mode 100644
index 17f3fcd..0000000
--- a/node_modules/damerau-levenshtein/index.js
+++ /dev/null
@@ -1,72 +0,0 @@
-// TheSpanishInquisition
-
-// Cache the matrix. Note that if you not pass a limit this implementation will use a dynamically calculate one.
-
-module.exports = function(__this, that, limit) {
-
-  var thisLength = __this.length,
-      thatLength = that.length,
-      matrix = [];
-
-  // If the limit is not defined it will be calculate from this and that args.
-  limit = (limit || ((thatLength > thisLength ? thatLength : thisLength)))+1;
-
-  for (var i = 0; i < limit; i++) {
-    matrix[i] = [i];
-    matrix[i].length = limit;
-  }
-  for (i = 0; i < limit; i++) {
-    matrix[0][i] = i;
-  }
-
-  if (Math.abs(thisLength - thatLength) > (limit || 100)){
-    return prepare (limit || 100);
-  }
-  if (thisLength === 0){
-    return prepare (thatLength);
-  }
-  if (thatLength === 0){
-    return prepare (thisLength);
-  }
-
-  // Calculate matrix.
-  var j, this_i, that_j, cost, min, t;
-  for (i = 1; i <= thisLength; ++i) {
-    this_i = __this[i-1];
-
-    // Step 4
-    for (j = 1; j <= thatLength; ++j) {
-      // Check the jagged ld total so far
-      if (i === j && matrix[i][j] > 4) return prepare (thisLength);
-
-      that_j = that[j-1];
-      cost = (this_i === that_j) ? 0 : 1; // Step 5
-      // Calculate the minimum (much faster than Math.min(...)).
-      min    = matrix[i - 1][j    ] + 1; // Deletion.
-      if ((t = matrix[i    ][j - 1] + 1   ) < min) min = t;   // Insertion.
-      if ((t = matrix[i - 1][j - 1] + cost) < min) min = t;   // Substitution.
-
-      // Update matrix.
-      matrix[i][j] = (i > 1 && j > 1 && this_i === that[j-2] && __this[i-2] === that_j && (t = matrix[i-2][j-2]+cost) < min) ? t : min; // Transposition.
-    }
-  }
-
-  return prepare (matrix[thisLength][thatLength]);
-
-/**
- *
- */
-  function prepare(steps) {
-    var length = Math.max(thisLength, thatLength)
-    var relative = length === 0
-      ? 0
-      : (steps / length);
-    var similarity = 1 - relative
-    return {
-      steps: steps,
-      relative: relative,
-      similarity: similarity
-    };
-  }
-
-};
diff --git a/node_modules/damerau-levenshtein/package.json b/node_modules/damerau-levenshtein/package.json
deleted file mode 100644
index 2dba69b..0000000
--- a/node_modules/damerau-levenshtein/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "name": "damerau-levenshtein",
-  "version": "1.0.6",
-  "description": "Damerau - Levenshtein distance by The Spanish Inquisition + relative distance",
-  "main": "index.js",
-  "scripts": {
-    "test": "mocha --use_strict",
-    "version": "scripts/update-changelog.sh"
-  },
-  "keywords": [
-    "Damerau-Levenshtein",
-    "Damerau",
-    "Levenshtein",
-    "distance",
-    "compare",
-    "relative"
-  ],
-  "author": "The Spanish Inquisition",
-  "contributors": [
-    "Tadeusz Łazurski (https://tad-lispy.com/)",
-    "Gustavo Marques Adolph",
-    "Ivan Gilchrist <github@jumpingfishes.com> (http://jumpingfishes.com)",
-    "Boris Yakubchik (http://dev.yboris.com/)"
-  ],
-  "license": "BSD-2-Clause",
-  "devDependencies": {
-    "mocha": "^6.1.4"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/tad-lispy/node-damerau-levenshtein.git"
-  },
-  "bugs": {
-    "url": "https://github.com/tad-lispy/node-damerau-levenshtein/issues"
-  }
-}
diff --git a/node_modules/damerau-levenshtein/scripts/update-changelog.sh b/node_modules/damerau-levenshtein/scripts/update-changelog.sh
deleted file mode 100755
index fd5312b..0000000
--- a/node_modules/damerau-levenshtein/scripts/update-changelog.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#! /usr/bin/env bash
-
-set -euo pipefail
-
-# To make it work on OSX (provided gnu-sed in installed)
-if type gsed
-then
-  sed=gsed
-fi
-
-
-version=$(jq --raw-output ' .version ' "package.json")
-date=$(date +%Y-%m-%d)
-
-$sed \
-  --regexp-extended \
-  --in-place="" \
-  "s$^## \[Unreleased\]$\## [Unreleased\]\n\n\n## [${version}] - ${date}$" \
-  CHANGELOG.md
-
-git add CHANGELOG.md
diff --git a/node_modules/damerau-levenshtein/test/test.js b/node_modules/damerau-levenshtein/test/test.js
deleted file mode 100644
index 0939f09..0000000
--- a/node_modules/damerau-levenshtein/test/test.js
+++ /dev/null
@@ -1,168 +0,0 @@
-var levenshtien = require("./../index");
-
-var assert = require("assert");
-
-describe("Damerau - Levenshtein", function() {
-  describe("Equality", function() {
-    it("returns 0 steps for equal strings", function() {
-      assert.deepEqual(levenshtien("test", "test"), {
-        steps: 0,
-        relative: 0,
-        similarity: 1
-      });
-    });
-  });
-
-  describe("Additions", function() {
-    it("returns 1 step when appending one char", function() {
-      assert.deepEqual(levenshtien("test", "tests"), {
-        steps: 1,
-        relative: 1 / 5,
-        similarity: 1 - 1 / 5
-      });
-    });
-
-    it("returns 1 step when prepending one char", function() {
-      assert.deepEqual(levenshtien("test", "stest"), {
-        steps: 1,
-        relative: 1 / 5,
-        similarity: 1 - 1 / 5
-      });
-    });
-
-    it("returns 2 steps when appending two char", function() {
-      assert.deepEqual(levenshtien("test", "mytest"), {
-        steps: 2,
-        relative: 2 / 6,
-        similarity: 1 - 2 / 6
-      });
-    });
-
-    it("returns 7 steps when appending seven char", function() {
-      assert.deepEqual(levenshtien("test", "mycrazytest"), {
-        steps: 7,
-        relative: 7 / 11,
-        similarity: 1 - 7 / 11
-      });
-    });
-
-    it("returns 9 steps when prepend two chars and append seven chars", function() {
-      assert.deepEqual(levenshtien("test", "mytestiscrazy"), {
-        steps: 9,
-        relative: 9 / 13,
-        similarity: 1 - 9 / 13
-      });
-    });
-  });
-
-
-  describe("Addition of repeated chars", function() {
-    it("returns 1 step when repeating a character", function() {
-      assert.deepEqual(levenshtien("test", "teest"), {
-        steps: 1,
-        relative: 1 / 5,
-        similarity: 1 - 1 / 5
-      });
-    });
-
-    it("returns 2 step when repeating a character twice", function() {
-      assert.deepEqual(levenshtien("test", "teeest"), {
-        steps: 2,
-        relative: 2 / 6,
-        similarity: 1 - 2 / 6
-      });
-    });
-  });
-
-
-  describe("#Deletion", function() {
-    it("returns 1 step when removing one char", function() {
-      assert.deepEqual(levenshtien("test", "tst"), {
-        steps: 1,
-        relative: 1 / 4,
-        similarity: 1 - 1 / 4
-      });
-    });
-  });
-
-
-  describe("Transposition", function() {
-    it("returns 1 step when transposing one char", function() {
-      assert.deepEqual(levenshtien("test", "tset"), {
-        steps: 1,
-        relative: 1 / 4,
-        similarity: 1 - 1 / 4
-      });
-    });
-  });
-
-
-  describe("Addition with transposition", function() {
-    it("returns 2 step when transposing one char and append another", function() {
-      assert.deepEqual(levenshtien("test", "tsets"), {
-        steps: 2,
-        relative: 2 / 5,
-        similarity: 1 - 2 / 5
-      });
-    });
-    it("returns 2 step when transposing a char and repeating it", function() {
-      assert.deepEqual(levenshtien("test", "tsset"), {
-        steps: 2,
-        relative: 2 / 5,
-        similarity: 1 - 2 / 5
-      });
-    });
-  });
-
-  describe("Transposition of multiple chars", function() {
-    it("returns 1 step when transposing two neighbouring characters", function() {
-      assert.deepEqual(levenshtien("banana", "banaan"), {
-        steps: 1,
-        relative: 1 / 6,
-        similarity: 1 - 1 / 6
-      });
-    });
-
-    it("returns 2 step when transposing two neighbouring characters by two places", function() {
-      assert.deepEqual(levenshtien("banana", "nabana"), {
-        steps: 2,
-        relative: 2 / 6,
-        similarity: 1 - 2 / 6
-      });
-    });
-
-    it("returns 2 step when transposing two pairs of characters", function() {
-      assert.deepEqual(levenshtien("banana", "abnaan"), {
-        steps: 2,
-        relative: 2 / 6,
-        similarity: 1 - 2 / 6
-      });
-    });
-  });
-
-  describe("Empty strings", function() {
-    it("returns 0 step and 0 relative when both are empty", function() {
-      assert.deepEqual(levenshtien("", ""), {
-        steps: 0,
-        relative: 0,
-        similarity: 1
-      });
-    });
-
-    it("returns steps equal to first string lenght when second string is empty", function() {
-      assert.deepEqual(levenshtien("test", ""), {
-        steps: 4,
-        relative: 4 / 4,
-        similarity: 0
-      });
-    });
-
-    it("returns steps equal to second string lenght when first string is empty", function() {
-      assert.deepEqual(levenshtien("", "test"), {
-        steps: 4,
-        relative: 1,
-        similarity: 0
-      });
-    });
-  });
-});
diff --git a/node_modules/emoji-regex/README.md b/node_modules/emoji-regex/README.md
index 37cf14e..f10e173 100644
--- a/node_modules/emoji-regex/README.md
+++ b/node_modules/emoji-regex/README.md
@@ -2,7 +2,7 @@
 
 _emoji-regex_ offers a regular expression to match all emoji symbols (including textual representations of emoji) as per the Unicode Standard.
 
-This repository contains a script that generates this regular expression based on [the data from Unicode Technical Report #51](https://github.com/mathiasbynens/unicode-tr51). Because of this, the regular expression can easily be updated whenever new emoji are added to the Unicode standard.
+This repository contains a script that generates this regular expression based on [the data from Unicode v12](https://github.com/mathiasbynens/unicode-12.0.0). Because of this, the regular expression can easily be updated whenever new emoji are added to the Unicode standard.
 
 ## Installation
 
diff --git a/node_modules/emoji-regex/es2015/index.js b/node_modules/emoji-regex/es2015/index.js
index 0216db9..b4cf3dc 100644
--- a/node_modules/emoji-regex/es2015/index.js
+++ b/node_modules/emoji-regex/es2015/index.js
@@ -2,5 +2,5 @@
 
 module.exports = () => {
   // https://mths.be/emoji
-  return /\u{1F3F4}(?:\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074})\u{E007F}|\u200D\u2620\uFE0F)|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F468}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u{1F468}(?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F469}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F468}(?:\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|[\u{1F3FB}-\u{1F3FF}])|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u{1F469}\u200D\u{1F466}|\u{1F1F6}\u{1F1E6}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9D1}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]\uFE0F|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F469}\u{1F46E}\u{1F470}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9D1}-\u{1F9DD}]/gu;
+  return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0073}\u{E0063}\u{E0074}|\u{E0077}\u{E006C}\u{E0073})\u{E007F}|\u{1F468}(?:\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}\u{1F3FB}|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|[\u{1F3FB}-\u{1F3FF}])|(?:\u{1F9D1}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F469})\u{1F3FB}|\u{1F9D1}(?:\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u200D\u{1F91D}\u200D\u{1F9D1})|(?:\u{1F9D1}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}\u{1F3FC}]|\u{1F469}(?:\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FB}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|(?:\u{1F9D1}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}-\u{1F3FD}]|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F3F4}\u200D\u2620)\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F415}\u200D\u{1F9BA}|\u{1F469}\u200D\u{1F466}|\u{1F469}\u200D\u{1F467}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F1F6}\u{1F1E6}|[#\*0-9]\uFE0F\u20E3|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6D5}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6D5}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]\uFE0F|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93C}-\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9BB}\u{1F9CD}-\u{1F9CF}\u{1F9D1}-\u{1F9DD}]/gu;
 };
diff --git a/node_modules/emoji-regex/es2015/text.js b/node_modules/emoji-regex/es2015/text.js
index d0a771d..780309d 100644
--- a/node_modules/emoji-regex/es2015/text.js
+++ b/node_modules/emoji-regex/es2015/text.js
@@ -2,5 +2,5 @@
 
 module.exports = () => {
   // https://mths.be/emoji
-  return /\u{1F3F4}(?:\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074})\u{E007F}|\u200D\u2620\uFE0F)|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F468}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u{1F468}(?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F469}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F468}(?:\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|[\u{1F3FB}-\u{1F3FF}])|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u{1F469}\u200D\u{1F466}|\u{1F1F6}\u{1F1E6}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9D1}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]\uFE0F?|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F469}\u{1F46E}\u{1F470}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9D1}-\u{1F9DD}]/gu;
+  return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0073}\u{E0063}\u{E0074}|\u{E0077}\u{E006C}\u{E0073})\u{E007F}|\u{1F468}(?:\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}\u{1F3FB}|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|[\u{1F3FB}-\u{1F3FF}])|(?:\u{1F9D1}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F469})\u{1F3FB}|\u{1F9D1}(?:\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u200D\u{1F91D}\u200D\u{1F9D1})|(?:\u{1F9D1}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}\u{1F3FC}]|\u{1F469}(?:\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FB}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|(?:\u{1F9D1}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}-\u{1F3FD}]|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F3F4}\u200D\u2620)\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F415}\u200D\u{1F9BA}|\u{1F469}\u200D\u{1F466}|\u{1F469}\u200D\u{1F467}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F1F6}\u{1F1E6}|[#\*0-9]\uFE0F\u20E3|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6D5}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6D5}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]\uFE0F?|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93C}-\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9BB}\u{1F9CD}-\u{1F9CF}\u{1F9D1}-\u{1F9DD}]/gu;
 };
diff --git a/node_modules/emoji-regex/index.d.ts b/node_modules/emoji-regex/index.d.ts
index 2c317cd..1955b47 100644
--- a/node_modules/emoji-regex/index.d.ts
+++ b/node_modules/emoji-regex/index.d.ts
@@ -3,3 +3,21 @@
 
     export default emojiRegex;
 }
+
+declare module 'emoji-regex/text' {
+    function emojiRegex(): RegExp;
+
+    export default emojiRegex;
+}
+
+declare module 'emoji-regex/es2015' {
+    function emojiRegex(): RegExp;
+
+    export default emojiRegex;
+}
+
+declare module 'emoji-regex/es2015/text' {
+    function emojiRegex(): RegExp;
+
+    export default emojiRegex;
+}
diff --git a/node_modules/emoji-regex/index.js b/node_modules/emoji-regex/index.js
index e2237a4..d993a3a 100644
--- a/node_modules/emoji-regex/index.js
+++ b/node_modules/emoji-regex/index.js
@@ -2,5 +2,5 @@
 
 module.exports = function () {
   // https://mths.be/emoji
-  return /\uD83C\uDFF4(?:\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74)\uDB40\uDC7F|\u200D\u2620\uFE0F)|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC68(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3]))|\uD83D\uDC69\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\uD83D\uDC68(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83D\uDC69\u200D[\u2695\u2696\u2708])\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC68(?:\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDD1-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC69\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD26\uDD30-\uDD39\uDD3D\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDD1-\uDDDD])/g;
+  return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
 };
diff --git a/node_modules/emoji-regex/package.json b/node_modules/emoji-regex/package.json
index ed68e52..6d32352 100644
--- a/node_modules/emoji-regex/package.json
+++ b/node_modules/emoji-regex/package.json
@@ -1,6 +1,6 @@
 {
   "name": "emoji-regex",
-  "version": "7.0.3",
+  "version": "8.0.0",
   "description": "A regular expression to match all Emoji-only symbols as per the Unicode Standard.",
   "homepage": "https://mths.be/emoji-regex",
   "main": "index.js",
@@ -39,13 +39,12 @@
     "test:watch": "npm run test -- --watch"
   },
   "devDependencies": {
-    "@babel/cli": "^7.0.0",
-    "@babel/core": "^7.0.0",
-    "@babel/plugin-proposal-unicode-property-regex": "^7.0.0",
-    "@babel/preset-env": "^7.0.0",
-    "mocha": "^5.2.0",
+    "@babel/cli": "^7.2.3",
+    "@babel/core": "^7.3.4",
+    "@babel/plugin-proposal-unicode-property-regex": "^7.2.0",
+    "@babel/preset-env": "^7.3.4",
+    "mocha": "^6.0.2",
     "regexgen": "^1.3.0",
-    "unicode-11.0.0": "^0.7.7",
-    "unicode-tr51": "^9.0.1"
+    "unicode-12.0.0": "^0.7.9"
   }
 }
diff --git a/node_modules/emoji-regex/text.js b/node_modules/emoji-regex/text.js
index 199ae3b..0a55ce2 100644
--- a/node_modules/emoji-regex/text.js
+++ b/node_modules/emoji-regex/text.js
@@ -2,5 +2,5 @@
 
 module.exports = function () {
   // https://mths.be/emoji
-  return /\uD83C\uDFF4(?:\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74)\uDB40\uDC7F|\u200D\u2620\uFE0F)|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC68(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3]))|\uD83D\uDC69\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\uD83D\uDC68(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83D\uDC69\u200D[\u2695\u2696\u2708])\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC68(?:\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDD1-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])\uFE0F?|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC69\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD26\uDD30-\uDD39\uDD3D\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDD1-\uDDDD])/g;
+  return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F?|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
 };
diff --git a/node_modules/eslint-config-prettier/@typescript-eslint.js b/node_modules/eslint-config-prettier/@typescript-eslint.js
index 50c9c68..f1fee0f 100644
--- a/node_modules/eslint-config-prettier/@typescript-eslint.js
+++ b/node_modules/eslint-config-prettier/@typescript-eslint.js
@@ -5,14 +5,16 @@
     "@typescript-eslint/quotes": 0,
 
     "@typescript-eslint/brace-style": "off",
+    "@typescript-eslint/comma-dangle": "off",
     "@typescript-eslint/comma-spacing": "off",
     "@typescript-eslint/func-call-spacing": "off",
     "@typescript-eslint/indent": "off",
+    "@typescript-eslint/keyword-spacing": "off",
     "@typescript-eslint/member-delimiter-style": "off",
     "@typescript-eslint/no-extra-parens": "off",
     "@typescript-eslint/no-extra-semi": "off",
     "@typescript-eslint/semi": "off",
     "@typescript-eslint/space-before-function-paren": "off",
-    "@typescript-eslint/type-annotation-spacing": "off"
-  }
+    "@typescript-eslint/type-annotation-spacing": "off",
+  },
 };
diff --git a/node_modules/eslint-config-prettier/CHANGELOG.md b/node_modules/eslint-config-prettier/CHANGELOG.md
index f91fd3b..7bd7a96 100644
--- a/node_modules/eslint-config-prettier/CHANGELOG.md
+++ b/node_modules/eslint-config-prettier/CHANGELOG.md
@@ -1,7 +1,19 @@
+### Version 6.12.0 (2020-09-25)
+
+- Added: [@typescript-eslint/comma-dangle]. Thanks to Masafumi Koba (@ybiquitous)!!
+
+### Version 6.11.0 (2020-04-21)
+
+- Added: [@typescript-eslint/keyword-spacing]. Thanks to Hans Bergren (@hbergren)!
+
+### Version 6.10.1 (2020-03-22)
+
+- Improved: Recommend using `npx` when running the CLI helper tool.
+- Updated: Mention that eslint-config-prettier has been tested with Prettier 2.0 and the latest versions of plugins.
+
 ### Version 6.10.0 (2020-01-28)
 
-- Added: [@typescript-eslint/comma-spacing]. Thanks to Thanks to Masafumi
-  Koba (@ybiquitous)!!
+- Added: [@typescript-eslint/comma-spacing]. Thanks to Masafumi Koba (@ybiquitous)!!
 
 ### Version 6.9.0 (2019-12-27)
 
@@ -13,48 +25,37 @@
 
 ### Version 6.7.0 (2019-11-19)
 
-- Added: [@typescript-eslint/space-before-function-paren]. Thanks to Masafumi
-  Koba (@ybiquitous)!
+- Added: [@typescript-eslint/space-before-function-paren]. Thanks to Masafumi Koba (@ybiquitous)!
 
 ### Version 6.6.0 (2019-11-17)
 
-- Added: New [eslint-plugin-vue] rules: [vue/dot-location] and
-  [vue/keyword-spacing]. Thanks to @xcatliu!
+- Added: New [eslint-plugin-vue] rules: [vue/dot-location] and [vue/keyword-spacing]. Thanks to @xcatliu!
 
 ### Version 6.5.0 (2019-10-26)
 
-- Added: Support for [excluding deprecated rules]. Thanks to Alex Ilyaev
-  (@alexilyaev)!
+- Added: Support for [excluding deprecated rules]. Thanks to Alex Ilyaev (@alexilyaev)!
 
 ### Version 6.4.0 (2019-10-05)
 
-- Added: [unicorn/no-nested-ternary]. Thanks to Yang Mingshan
-  (@yangmingshan)!
+- Added: [unicorn/no-nested-ternary]. Thanks to Yang Mingshan (@yangmingshan)!
 
 ### Version 6.3.0 (2019-09-10)
 
-- Added: [@typescript-eslint/brace-style]. Thanks to Masafumi Koba
-  (@ybiquitous)!
+- Added: [@typescript-eslint/brace-style]. Thanks to Masafumi Koba (@ybiquitous)!
 
 ### Version 6.2.0 (2019-09-03)
 
-- Added: [@typescript-eslint/quotes] (as a [special
-  rule][@typescript-eslint/quotes-special]). Thanks to Masafumi Koba
-  (@ybiquitous)!
+- Added: [@typescript-eslint/quotes] (as a [special rule][@typescript-eslint/quotes-special]). Thanks to Masafumi Koba (@ybiquitous)!
 
 ### Version 6.1.0 (2019-08-19)
 
-- Added: [function-call-argument-newline] \(new in ESLint 6.2.0). Thanks to
-  Masafumi Koba (@ybiquitous)!
+- Added: [function-call-argument-newline] \(new in ESLint 6.2.0). Thanks to Masafumi Koba (@ybiquitous)!
 
 ### Version 6.0.0 (2019-06-25)
 
-- Changed: The CLI helper tool now considers [no-confusing-arrow] to conflict
-  if you use the default value of its `allowParens` option. The default was
-  changed to `true` in ESLint 6, which conflicts with Prettier.
+- Changed: The CLI helper tool now considers [no-confusing-arrow] to conflict if you use the default value of its `allowParens` option. The default was changed to `true` in ESLint 6, which conflicts with Prettier.
 
-  If the CLI helper tool gives you errors about this after upgrading, the
-  solution is to change this:
+  If the CLI helper tool gives you errors about this after upgrading, the solution is to change this:
 
   ```json
   {
@@ -76,10 +77,7 @@
 
   The latter works in both ESLint 6 as well as in ESLint 5 and older.
 
-- Improved: `eslint --print-config` usage instructions. The CLI tool help
-  text as well as the documentation has been updated to suggest commands that
-  work in ESLint 6.0 as well as in ESLint 5 and older. (Instead of `eslint
-  --print-config .`, use `eslint --print-config path/to/main.js`.)
+- Improved: `eslint --print-config` usage instructions. The CLI tool help text as well as the documentation has been updated to suggest commands that work in ESLint 6.0 as well as in ESLint 5 and older. (Instead of `eslint --print-config .`, use `eslint --print-config path/to/main.js`.)
 
 ### Version 5.1.0 (2019-06-25)
 
@@ -87,38 +85,25 @@
 
 ### Version 5.0.0 (2019-06-15)
 
-- Removed: [react/self-closing-comp]. This rule was added in v4.1.0 not
-  because it _conflicted_ with Prettier but because it was _unnecessary_ when
-  using Prettier. However, in v1.18.0 [Prettier stopped converting empty
-  elements to self-closing elements][prettier-self-closing]. So the rule is
-  not unnecessary anymore.
+- Removed: [react/self-closing-comp]. This rule was added in v4.1.0 not because it _conflicted_ with Prettier but because it was _unnecessary_ when using Prettier. However, in v1.18.0 [Prettier stopped converting empty elements to self-closing elements][prettier-self-closing]. So the rule is not unnecessary anymore.
 
-  If you use Prettier v1.17.1 or older you should be able to upgrade
-  eslint-config-prettier to v5.0.0 without having to do anything else.
+  If you use Prettier v1.17.1 or older you should be able to upgrade eslint-config-prettier to v5.0.0 without having to do anything else.
 
-  If you use Prettier v1.18.0 or newer, you might get lint errors about for
-  example changing `<div></div>` into `<div />`. You have two options:
+  If you use Prettier v1.18.0 or newer, you might get lint errors about for example changing `<div></div>` into `<div />`. You have two options:
 
-  - Run `eslint --fix` if you prefer to enforce self-closing elements where
-    possible. This should fix all the errors.
-  - Add `"react/self-closing-comp": "off"` to your ESLint config if you use
-    autofix from your editor and you face the same [issue as Prettier
-    did][prettier-self-closing].
+  - Run `eslint --fix` if you prefer to enforce self-closing elements where possible. This should fix all the errors.
+  - Add `"react/self-closing-comp": "off"` to your ESLint config if you use autofix from your editor and you face the same [issue as Prettier did][prettier-self-closing].
 
-- Changed: Node.js 6 is no longer officially supported, but v5.0.0 should
-  still work with it.
+- Changed: Node.js 6 is no longer officially supported, but v5.0.0 should still work with it.
 
 ### Version 4.3.0 (2019-05-16)
 
-- Added: New [eslint-plugin-vue] rules: [vue/arrow-spacing],
-  [vue/block-spacing], [vue/brace-style] and [vue/comma-dangle].
-- Added: New [@typescript-eslint/eslint-plugin] rules:
-  [@typescript-eslint/func-call-spacing] and [@typescript-eslint/semi].
+- Added: New [eslint-plugin-vue] rules: [vue/arrow-spacing], [vue/block-spacing], [vue/brace-style] and [vue/comma-dangle].
+- Added: New [@typescript-eslint/eslint-plugin] rules: [@typescript-eslint/func-call-spacing] and [@typescript-eslint/semi].
 
 ### Version 4.2.0 (2019-04-25)
 
-- Added: [@typescript-eslint/no-extra-parens]. Thanks to Keiichiro Amemiya
-  (@Hoishin) and Jen Gorfine (@jgorfine)!
+- Added: [@typescript-eslint/no-extra-parens]. Thanks to Keiichiro Amemiya (@Hoishin) and Jen Gorfine (@jgorfine)!
 
 ### Version 4.1.0 (2019-02-26)
 
@@ -127,59 +112,37 @@
 
 ### Version 4.0.0 (2019-01-26)
 
-- Breaking change: Support for [eslint-plugin-typescript] has been removed and
-  replaced with support for its successor [@typescript-eslint/eslint-plugin].
-  Thanks to TANIGUCHI Masaya (@ta2gch) and everyone else who helped with this!
-- Changed: [arrow-body-style] and [prefer-arrow-callback] are now marked as
-  [special rules][arrow-special], since they might cause problems if using
-  [eslint-plugin-prettier] and `--fix`. They are turned off by default, and the
-  CLI helper tool will _warn_ about them (but not error if you do enable them).
-  This won’t break your linting checks, but do note that these rules will be
-  disabled unless you explicitly enable them again, and that you might see new
-  warnings when running the CLI helper tool.
+- Breaking change: Support for [eslint-plugin-typescript] has been removed and replaced with support for its successor [@typescript-eslint/eslint-plugin]. Thanks to TANIGUCHI Masaya (@ta2gch) and everyone else who helped with this!
+- Changed: [arrow-body-style] and [prefer-arrow-callback] are now marked as [special rules][arrow-special], since they might cause problems if using [eslint-plugin-prettier] and `--fix`. They are turned off by default, and the CLI helper tool will _warn_ about them (but not error if you do enable them). This won’t break your linting checks, but do note that these rules will be disabled unless you explicitly enable them again, and that you might see new warnings when running the CLI helper tool.
 
 ### Version 3.6.0 (2019-01-19)
 
-- Added: Support for [eslint-plugin-babel]. Thanks to Matija Marohnić
-  (@silvenon)!
+- Added: Support for [eslint-plugin-babel]. Thanks to Matija Marohnić (@silvenon)!
 
 ### Version 3.5.0 (2019-01-16)
 
-- Fixed: The eslint-plugin-vue change from 3.4.0 has been reverted. That change
-  requires eslint-plugin-vue@5, while many use eslint-plugin-vue@4. In other
-  words, it was an accidental breaking change. Also, after thinking about it
-  some more, it makes sense to have a Prettier-specific list of rules, rather
-  than using the `vue/no-layout-rules` list, since there can be layout rules
-  that don’t conflict with but rather complement Prettier.
+- Fixed: The eslint-plugin-vue change from 3.4.0 has been reverted. That change requires eslint-plugin-vue@5, while many use eslint-plugin-vue@4. In other words, it was an accidental breaking change. Also, after thinking about it some more, it makes sense to have a Prettier-specific list of rules, rather than using the `vue/no-layout-rules` list, since there can be layout rules that don’t conflict with but rather complement Prettier.
 - Added: New eslint-plugin-vue rules coming in the next version after 5.1.0.
 
 ### Version 3.4.0 (2019-01-13)
 
 - Added: Support for [eslint-plugin-typescript]. Thanks to Jed Fox (@j-f1)!
-- Improved: The eslint-plugin-vue integration is now using the
-  `vue/no-layout-rules` config behind the scenes, so it should automatically
-  stay up-to-date when new eslint-plugin-vue versions are released. Thanks to
-  Michał Sajnóg (@michalsnik)!
+- Improved: The eslint-plugin-vue integration is now using the `vue/no-layout-rules` config behind the scenes, so it should automatically stay up-to-date when new eslint-plugin-vue versions are released. Thanks to Michał Sajnóg (@michalsnik)!
 
 ### Version 3.3.0 (2018-11-11)
 
-- Added: The [vue/html-self-closing] rule (as a [special
-  rule][vue/html-self-closing-special]). Thanks to Yamagishi Kazutoshi (@ykzts)!
+- Added: The [vue/html-self-closing] rule (as a [special rule][vue/html-self-closing-special]). Thanks to Yamagishi Kazutoshi (@ykzts)!
 
 ### Version 3.2.0 (2018-11-10)
 
 - Added: Support for [eslint-plugin-vue].
-- Fixed: The CLI helper tool should now work in Node.js 6 with npm 3 again.
-  Thanks to Grant Snodgrass (@meeber)!
+- Fixed: The CLI helper tool should now work in Node.js 6 with npm 3 again. Thanks to Grant Snodgrass (@meeber)!
 - Improved: Updated documentation.
 
 ### Version 3.1.0 (2018-09-22)
 
 - Added: Support for [eslint-plugin-unicorn]. Thanks to John Mars (@j0hnm4r5)!
-- Changed: The [quotes] rule is now allowed to be used to forbid unnecessary
-  backticks. This means that the CLI helper tool no longer can automatically
-  validate it, so you’ll need to refer the [quotes special rule
-  documentation][quotes-special]. Thanks to Nick Petruzzelli (@npetruzzelli)!
+- Changed: The [quotes] rule is now allowed to be used to forbid unnecessary backticks. This means that the CLI helper tool no longer can automatically validate it, so you’ll need to refer the [quotes special rule documentation][quotes-special]. Thanks to Nick Petruzzelli (@npetruzzelli)!
 
 ### Version 3.0.1 (2018-08-13)
 
@@ -205,12 +168,8 @@
 
 ### Version 2.7.0 (2017-11-01)
 
-- Added: The [lines-around-comment] rule (as a [special
-  rule][lines-around-comment-special]). Thanks to Maurice de Beijer
-  (@mauricedb)!
-- Added: The [no-unexpected-multiline] rule (as a [special
-  rule][no-unexpected-multiline-special]). Thanks to Suhas Karanth
-  (@sudo-suhas)!
+- Added: The [lines-around-comment] rule (as a [special rule][lines-around-comment-special]). Thanks to Maurice de Beijer (@mauricedb)!
+- Added: The [no-unexpected-multiline] rule (as a [special rule][no-unexpected-multiline-special]). Thanks to Suhas Karanth (@sudo-suhas)!
 
 ### Version 2.6.0 (2017-09-23)
 
@@ -218,18 +177,15 @@
 
 ### Version 2.5.0 (2017-09-16)
 
-- Added: Support for [eslint-plugin-standard]. Thanks to Christian Pekeler
-  (@pekeler)!
+- Added: Support for [eslint-plugin-standard]. Thanks to Christian Pekeler (@pekeler)!
 
 ### Version 2.4.0 (2017-09-02)
 
-- Added: The [function-paren-newline] rule (new in [ESLint 4.6.0]). Thanks to
-  Pierre Vanduynslager (@vanduynslagerp)!
+- Added: The [function-paren-newline] rule (new in [ESLint 4.6.0]). Thanks to Pierre Vanduynslager (@vanduynslagerp)!
 
 ### Version 2.3.0 (2017-06-30)
 
-- Added: The (deprecated) [indent-legacy] rule. Thanks to M. Ian Graham
-  (@miangraham)!
+- Added: The (deprecated) [indent-legacy] rule. Thanks to M. Ian Graham (@miangraham)!
 
 ### Version 2.2.0 (2017-06-17)
 
@@ -246,33 +202,23 @@
 
 ### Version 2.1.0 (2017-05-13)
 
-- Added: The [no-tabs] rule (as a [special rule][no-tabs-special]). Thanks to
-  Alex Meah (@AlexMeah)!
+- Added: The [no-tabs] rule (as a [special rule][no-tabs-special]). Thanks to Alex Meah (@AlexMeah)!
 
 ### Version 2.0.0 (2017-05-07)
 
 - Changed/Improved: The CLI helper tool is now more helpful.
 
-  - The options of special rules are now validated if possible. If a special
-    rule is enabled with non-conflicting options, the CLI no longer warns about
-    it.
-  - If only special rules that cannot be automatically checked are found, the
-    CLI no longer exists with a non-zero exit code. Instead, it only warns about
-    the rules.
+  - The options of special rules are now validated if possible. If a special rule is enabled with non-conflicting options, the CLI no longer warns about it.
+  - If only special rules that cannot be automatically checked are found, the CLI no longer exists with a non-zero exit code. Instead, it only warns about the rules.
 
-- Changed: The [no-confusing-arrow] is now a special rule again, since it might
-  conflict with recent Prettier versions.
+- Changed: The [no-confusing-arrow] is now a special rule again, since it might conflict with recent Prettier versions.
 
-- Removed: The `react/wrap-multilines` rule (which has been deprecated for a
-  while), since it was removed in eslint-plugin-react@7.
+- Removed: The `react/wrap-multilines` rule (which has been deprecated for a while), since it was removed in eslint-plugin-react@7.
 
 ### Version 1.7.0 (2017-04-19)
 
-- Changed: The [no-confusing-arrow] is no longer a special rule, but simply
-  turned off, since recent Prettier versions make it redundant.
-- Improved: The CLI helper tool now has a more helpful message for special
-  rules, and exits with a different status code if only special rules were
-  found. The exit codes are now documented as well.
+- Changed: The [no-confusing-arrow] is no longer a special rule, but simply turned off, since recent Prettier versions make it redundant.
+- Improved: The CLI helper tool now has a more helpful message for special rules, and exits with a different status code if only special rules were found. The exit codes are now documented as well.
 
 ### Version 1.6.0 (2017-04-05)
 
@@ -284,26 +230,20 @@
 
 ### Version 1.4.1 (2017-02-28)
 
-- Improved: eslint-config-prettier is now part of the [prettier] organization!
-  This version updates all URLs to point to the new home of the project.
+- Improved: eslint-config-prettier is now part of the [prettier] organization! This version updates all URLs to point to the new home of the project.
 
 ### Version 1.4.0 (2017-02-26)
 
-- Added: The [no-confusing-arrow] rule (as a
-  [special rule][no-confusing-arrow-special]). Thanks to Dominik Ferber
-  (@dferber90)!
-- Added: Deprecated or removed rules that might conflict with prettier. Thanks
-  to Dominik Ferber (@dferber90)!
+- Added: The [no-confusing-arrow] rule (as a [special rule][no-confusing-arrow-special]). Thanks to Dominik Ferber (@dferber90)!
+- Added: Deprecated or removed rules that might conflict with prettier. Thanks to Dominik Ferber (@dferber90)!
 
 ### Version 1.3.0 (2017-02-21)
 
-- Added: The [template-tag-spacing] rule. Thanks to Thibault Derousseaux
-  (@tibdex)!
+- Added: The [template-tag-spacing] rule. Thanks to Thibault Derousseaux (@tibdex)!
 
 ### Version 1.2.0 (2017-02-14)
 
-- Added: The [one-var-declaration-per-line] rule. Thanks to Ruben Oostinga
-  (@0xR)!
+- Added: The [one-var-declaration-per-line] rule. Thanks to Ruben Oostinga (@0xR)!
 
 ### Version 1.1.1 (2017-02-12)
 
@@ -312,8 +252,7 @@
 ### Version 1.1.0 (2017-02-10)
 
 - Fixed: The [eslint-plugin-react] exclusion rules now actually work.
-- Fixed: The CLI helper tool now works in Node.js 4. Thanks to Nathan Friedly
-  (@nfriedly)!
+- Fixed: The CLI helper tool now works in Node.js 4. Thanks to Nathan Friedly (@nfriedly)!
 - Added: Support for [eslint-plugin-flowtype].
 - Improved: Minor things for the CLI helper tool.
 - Improved: There are now tests for everything.
@@ -335,9 +274,11 @@
 - Initial release.
 
 [@typescript-eslint/brace-style]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/brace-style.md
+[@typescript-eslint/comma-dangle]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/comma-dangle.md
 [@typescript-eslint/comma-spacing]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/comma-spacing.md
 [@typescript-eslint/eslint-plugin]: https://github.com/typescript-eslint/typescript-eslint
 [@typescript-eslint/func-call-spacing]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/func-call-spacing.md
+[@typescript-eslint/keyword-spacing]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/keyword-spacing.md
 [@typescript-eslint/no-extra-parens]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-extra-parens.md
 [@typescript-eslint/no-extra-semi]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-extra-semi.md
 [@typescript-eslint/quotes-special]: https://github.com/prettier/eslint-config-prettier/blob/857257179fe69715362dfa9300762d6e534c0603/README.md#quotes
@@ -350,8 +291,8 @@
 [arrow-special]: https://github.com/prettier/eslint-config-prettier/blob/2c842675e55b91aecaef6f997d234ebf2d220ffb/README.md#arrow-body-style-and-prefer-arrow-callback
 [curly]: https://eslint.org/docs/rules/curly
 [end-of-line]: https://prettier.io/docs/en/options.html#end-of-line
-[ESLint 4.0.0]: https://eslint.org/blog/2017/06/eslint-v4.0.0-released
-[ESLint 4.6.0]: https://eslint.org/blog/2017/09/eslint-v4.6.0-released
+[eslint 4.0.0]: https://eslint.org/blog/2017/06/eslint-v4.0.0-released
+[eslint 4.6.0]: https://eslint.org/blog/2017/09/eslint-v4.6.0-released
 [eslint-plugin-babel]: https://github.com/babel/eslint-plugin-babel
 [eslint-plugin-flowtype]: https://github.com/gajus/eslint-plugin-flowtype
 [eslint-plugin-prettier]: https://github.com/prettier/eslint-plugin-prettier
diff --git a/node_modules/eslint-config-prettier/README.md b/node_modules/eslint-config-prettier/README.md
index b4d983e..d81cbdf 100644
--- a/node_modules/eslint-config-prettier/README.md
+++ b/node_modules/eslint-config-prettier/README.md
@@ -1,19 +1,16 @@
-# eslint-config-prettier [![Build Status][travis-badge]][travis]
+# eslint-config-prettier
 
 Turns off all rules that are unnecessary or might conflict with [Prettier].
 
-This lets you use your favorite shareable config without letting its stylistic
-choices get in the way when using Prettier.
+This lets you use your favorite shareable config without letting its stylistic choices get in the way when using Prettier.
 
-Note that this config _only_ turns rules _off,_ so it only makes sense using
-it together with some other config.
+Note that this config _only_ turns rules _off,_ so it only makes sense using it together with some other config.
 
 ## Contents
 
 <!-- START doctoc generated TOC please keep comment here to allow auto update -->
 <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
 
-
 - [Installation](#installation)
   - [Excluding deprecated rules](#excluding-deprecated-rules)
 - [CLI helper tool](#cli-helper-tool)
@@ -42,19 +39,15 @@
 
 ## Installation
 
-Tip: First, you might be interested in installing [eslint-plugin-prettier].
-Follow the instructions over there. This is optional, though.
-
 Install eslint-config-prettier:
 
 ```
 npm install --save-dev eslint-config-prettier
 ```
 
-Then, add eslint-config-prettier to the "extends" array in your `.eslintrc.*`
-file. Make sure to put it **last,** so it gets the chance to override other
-configs.
+Then, add eslint-config-prettier to the "extends" array in your `.eslintrc.*` file. Make sure to put it **last,** so it gets the chance to override other configs.
 
+<!-- prettier-ignore -->
 ```json
 {
   "extends": [
@@ -76,6 +69,7 @@
 
 Add extra exclusions for the plugins you use like so:
 
+<!-- prettier-ignore -->
 ```json
 {
   "extends": [
@@ -92,10 +86,9 @@
 }
 ```
 
-If you extend a config which uses a plugin, it is recommended to add
-`"prettier/that-plugin"` (if available). For example, [eslint-config-airbnb]
-enables [eslint-plugin-react] rules, so `"prettier/react"` is needed:
+If you extend a config which uses a plugin, it is recommended to add `"prettier/that-plugin"` (if available). For example, [eslint-config-airbnb] enables [eslint-plugin-react] rules, so `"prettier/react"` is needed:
 
+<!-- prettier-ignore -->
 ```json
 {
   "extends": [
@@ -106,16 +99,11 @@
 }
 ```
 
-If you’re unsure which plugins are used, you can usually find them in your
-`package.json`.
+If you’re unsure which plugins are used, you can usually find them in your `package.json`.
 
 ### Excluding deprecated rules
 
-Some of the rules that eslint-config-prettier turns off may be deprecated.
-**This is perfectly fine,** but if you really need to omit the
-deprecated rules, you can do so by setting the
-`ESLINT_CONFIG_PRETTIER_NO_DEPRECATED` environment variable to a non-empty
-value. For example:
+Some of the rules that eslint-config-prettier turns off may be deprecated. **This is perfectly fine,** but if you really need to omit the deprecated rules, you can do so by setting the `ESLINT_CONFIG_PRETTIER_NO_DEPRECATED` environment variable to a non-empty value. For example:
 
 ```
 env ESLINT_CONFIG_PRETTIER_NO_DEPRECATED=true npx eslint-find-rules --deprecated index.js
@@ -123,36 +111,22 @@
 
 ## CLI helper tool
 
-eslint-config-prettier also ships with a little CLI tool to help you check if
-your configuration contains any rules that are unnecessary or conflict with
-Prettier.
+eslint-config-prettier also ships with a little CLI tool to help you check if your configuration contains any rules that are unnecessary or conflict with Prettier.
 
-First, add a script for it to package.json:
-
-```json
-{
-  "scripts": {
-    "eslint-check": "eslint --print-config path/to/main.js | eslint-config-prettier-check"
-  }
-}
-```
-
-Then run `npm run eslint-check`. (Change `path/to/main.js` to a file that
-exists in your project.)
-
-In theory you need to run `eslint --print-config file.js |
-eslint-config-prettier-check` for every single file in your project to be
-100% sure that there are no conflicting rules, because ESLint supports having
-different rules for different files. But usually you’ll have about the same
-rules for all files, so it is enough to run the command on one file (pick one
-that you won’t be moving). If you use [multiple configuration files] or
-[overrides], you can (but you probably don’t need to!) run the above script
-several times with different `--print-config` arguments, such as:
+You can run it using `npx`:
 
 ```
-eslint --print-config index.js | eslint-config-prettier-check
-eslint --print-config test/index.js | eslint-config-prettier-check
-eslint --print-config legacy/main.js | eslint-config-prettier-check
+npx eslint --print-config path/to/main.js | npx eslint-config-prettier-check
+```
+
+(Change `path/to/main.js` to a file that exists in your project.)
+
+In theory you need to run `npx eslint --print-config file.js | npx eslint-config-prettier-check` for every single file in your project to be 100% sure that there are no conflicting rules, because ESLint supports having different rules for different files. But usually you’ll have about the same rules for all files, so it is enough to run the command on one file (pick one that you won’t be moving). If you use [multiple configuration files] or [overrides], you can (but you probably don’t need to!) run the above script several times with different `--print-config` arguments, such as:
+
+```
+npx eslint --print-config index.js | npx eslint-config-prettier-check
+npx eslint --print-config test/index.js | npx eslint-config-prettier-check
+npx eslint --print-config legacy/main.js | npx eslint-config-prettier-check
 ```
 
 Exit codes:
@@ -163,6 +137,7 @@
 
 ## Example configuration
 
+<!-- prettier-ignore -->
 ```json
 {
   "extends": [
@@ -185,7 +160,6 @@
     "@typescript-eslint",
     "babel",
     "flowtype",
-    "prettier",
     "react",
     "standard",
     "unicorn",
@@ -200,50 +174,34 @@
   "env": {
     "es6": true,
     "node": true
-  },
-  "rules": {
-    "prettier/prettier": "error"
   }
 }
 ```
 
 ## Special rules
 
-There a few rules that eslint-config-prettier disables that actually can be
-enabled in some cases.
+There a few rules that eslint-config-prettier disables that actually can be enabled in some cases.
 
 - Some require certain options. The CLI helper tool validates this.
-- Some require special attention when writing code. The CLI helper tool warns
-  you if any of those rules are enabled, but can’t tell if anything is
-  problematic.
+- Some require special attention when writing code. The CLI helper tool warns you if any of those rules are enabled, but can’t tell if anything is problematic.
 - Some can cause problems if using [eslint-plugin-prettier] and `--fix`.
 
-For maximum ease of use, the special rules are disabled by default. If you want
-them, you need to explicitly specify them in your ESLint config.
+For maximum ease of use, the special rules are disabled by default. If you want them, you need to explicitly specify them in your ESLint config.
 
 ### [arrow-body-style] and [prefer-arrow-callback]
 
 **These rules might cause problems if using [eslint-plugin-prettier] and `--fix`.**
 
-If you use any of these rules together with the `prettier/prettier` rule from
-[eslint-plugin-prettier], you can in some cases end up with invalid code due to
-a bug in ESLint’s autofix.
+If you use any of these rules together with the `prettier/prettier` rule from [eslint-plugin-prettier], you can in some cases end up with invalid code due to a bug in ESLint’s autofix.
 
 These rules are safe to use if:
 
-- You don’t use [eslint-plugin-prettier]. In other words, you run `eslint --fix`
-  and `prettier --write` as separate steps.
-- You _do_ use [eslint-plugin-prettier], but don’t use `--fix`. (But then,
-  what’s the point?)
+- You don’t use [eslint-plugin-prettier]. In other words, you run `eslint --fix` and `prettier --write` as separate steps.
+- You _do_ use [eslint-plugin-prettier], but don’t use `--fix`. (But then, what’s the point?)
 
-You _can_ still use these rules together with [eslint-plugin-prettier] if you
-want, because the bug does not occur _all the time._ But if you do, you need to
-keep in mind that you might end up with invalid code, where you manually have to
-insert a missing closing parenthesis to get going again.
+You _can_ still use these rules together with [eslint-plugin-prettier] if you want, because the bug does not occur _all the time._ But if you do, you need to keep in mind that you might end up with invalid code, where you manually have to insert a missing closing parenthesis to get going again.
 
-If you’re fixing large of amounts of previously unformatted code, consider
-temporarily disabling the `prettier/prettier` rule and running `eslint --fix`
-and `prettier --write` separately.
+If you’re fixing large of amounts of previously unformatted code, consider temporarily disabling the `prettier/prettier` rule and running `eslint --fix` and `prettier --write` separately.
 
 See these issues for more information:
 
@@ -251,39 +209,36 @@
 - [eslint-config-prettier#71]
 - [eslint-plugin-prettier#65]
 
-When the autofix bug in ESLint has been fixed, the special case for these rules
-can be removed.
+When the autofix bug in ESLint has been fixed, the special case for these rules can be removed.
 
 ### [curly]
 
 **This rule requires certain options.**
 
-If a block (for example after `if`, `else`, `for` or `while`) contains only one
-statement, JavaScript allows omitting the curly braces around that statement.
-This rule enforces if or when those optional curly braces should be omitted.
+If a block (for example after `if`, `else`, `for` or `while`) contains only one statement, JavaScript allows omitting the curly braces around that statement. This rule enforces if or when those optional curly braces should be omitted.
 
-If you use the `"multi-line"` or `"multi-or-nest"` option, the rule can conflict
-with Prettier.
+If you use the `"multi-line"` or `"multi-or-nest"` option, the rule can conflict with Prettier.
 
 For example, the `"multi-line"` option allows this line:
 
+<!-- prettier-ignore -->
 ```js
 if (cart.items && cart.items[0] && cart.items[0].quantity === 0) updateCart(cart);
 ```
 
-However, Prettier might consider the line too long and turn it into the
-following, which the `"multi-line"` option does _not_ allow:
+However, Prettier might consider the line too long and turn it into the following, which the `"multi-line"` option does _not_ allow:
 
+<!-- prettier-ignore -->
 ```js
 if (cart.items && cart.items[0] && cart.items[0].quantity === 0)
   updateCart(cart);
 ```
 
-If you like this rule, it can be used just fine with Prettier as long as you
-don’t use the `"multi-line"` or `"multi-or-nest"` option.
+If you like this rule, it can be used just fine with Prettier as long as you don’t use the `"multi-line"` or `"multi-or-nest"` option.
 
 Example ESLint configuration:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -296,16 +251,14 @@
 
 **This rule can be used with certain options.**
 
-This rule requires empty lines before and/or after comments. Prettier preserves
-blank lines, with two exceptions:
+This rule requires empty lines before and/or after comments. Prettier preserves blank lines, with two exceptions:
 
-- Several blank lines in a row are collapsed into a single blank line. This is
-  fine.
-- Blank lines at the beginning and end of blocks, objects and arrays are always
-  removed. This may lead to conflicts.
+- Several blank lines in a row are collapsed into a single blank line. This is fine.
+- Blank lines at the beginning and end of blocks, objects and arrays are always removed. This may lead to conflicts.
 
 By default, ESLint requires a blank line above the comment is this case:
 
+<!-- prettier-ignore -->
 ```js
 if (result) {
 
@@ -316,6 +269,7 @@
 
 However, Prettier removes the blank line:
 
+<!-- prettier-ignore -->
 ```js
 if (result) {
   /* comment */
@@ -323,12 +277,11 @@
 }
 ```
 
-If you like this rule, it can be used just fine with Prettier as long as you add
-some extra configuration to allow comments at the start and end of blocks,
-objects and arrays.
+If you like this rule, it can be used just fine with Prettier as long as you add some extra configuration to allow comments at the start and end of blocks, objects and arrays.
 
 Example ESLint configuration:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -357,19 +310,15 @@
 
 **This rule requires special attention when writing code.**
 
-Usually, Prettier takes care of following a maximum line length automatically.
-However, there are cases where Prettier can’t do anything, such as for long
-strings, regular expressions and comments. Those need to be split up by a human.
+Usually, Prettier takes care of following a maximum line length automatically. However, there are cases where Prettier can’t do anything, such as for long strings, regular expressions and comments. Those need to be split up by a human.
 
-If you’d like to enforce an even stricter maximum line length policy than
-Prettier can provide automatically, you can enable this rule. Just remember to
-keep `max-len`’s options and Prettier’s `printWidth` option in sync.
+If you’d like to enforce an even stricter maximum line length policy than Prettier can provide automatically, you can enable this rule. Just remember to keep `max-len`’s options and Prettier’s `printWidth` option in sync.
 
-Keep in mind that you might have to refactor code slightly if Prettier formats
-lines in a way that the `max-len` rule does not approve of.
+Keep in mind that you might have to refactor code slightly if Prettier formats lines in a way that the `max-len` rule does not approve of.
 
 Example ESLint configuration:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -384,39 +333,40 @@
 
 For example, the rule could warn about this line:
 
+<!-- prettier-ignore -->
 ```js
 var x = a => 1 ? 2 : 3;
 ```
 
-With `{allowParens: true}` (the default since ESLint 6.0.0), adding
-parentheses is considered a valid way to avoid the arrow confusion:
+With `{allowParens: true}` (the default since ESLint 6.0.0), adding parentheses is considered a valid way to avoid the arrow confusion:
 
+<!-- prettier-ignore -->
 ```js
 var x = a => (1 ? 2 : 3);
 ```
 
-While Prettier keeps those parentheses, it removes them if the line is long
-enough to introduce a line break:
+While Prettier keeps those parentheses, it removes them if the line is long enough to introduce a line break:
 
+<!-- prettier-ignore -->
 ```js
 EnterpriseCalculator.prototype.calculateImportantNumbers = inputNumber =>
   1 ? 2 : 3;
 ```
 
-With `{allowParens: false}`, ESLint instead suggests switching to an explicit
-return:
+With `{allowParens: false}`, ESLint instead suggests switching to an explicit return:
 
+<!-- prettier-ignore -->
 ```js
 var x = a => { return 1 ? 2 : 3; };
 ```
 
 That causes no problems with Prettier.
 
-If you like this rule, it can be used just fine with Prettier as long as the
-`allowParens` option is off.
+If you like this rule, it can be used just fine with Prettier as long as the `allowParens` option is off.
 
 Example ESLint configuration:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -425,12 +375,7 @@
 }
 ```
 
-(Note: The CLI helper tool considers `{allowParens: true}` to be the default,
-which is the case since ESLint 6.0.0. The tool will produce a warning if you
-use the default even if you use an older version of ESLint. It doesn’t hurt
-to explicitly set `{allowParens: false}` even though it is technically
-redundant. This way you are prepared for a future ESLint upgrade and the CLI
-tool can be kept simple.)
+(Note: The CLI helper tool considers `{allowParens: true}` to be the default, which is the case since ESLint 6.0.0. The tool will produce a warning if you use the default even if you use an older version of ESLint. It doesn’t hurt to explicitly set `{allowParens: false}` even though it is technically redundant. This way you are prepared for a future ESLint upgrade and the CLI tool can be kept simple.)
 
 ### [no-mixed-operators]
 
@@ -440,25 +385,28 @@
 
 For example, the rule could warn about this line:
 
+<!-- prettier-ignore -->
 ```js
 var foo = a + b * c;
 ```
 
 The rule suggests adding parentheses, like this:
 
+<!-- prettier-ignore -->
 ```js
 var foo = a + (b * c);
 ```
 
 However, Prettier removes many “unnecessary” parentheses, turning it back to:
 
+<!-- prettier-ignore -->
 ```js
 var foo = a + b * c;
 ```
 
-If you want to use this rule with Prettier, you need to split the expression
-into another variable:
+If you want to use this rule with Prettier, you need to split the expression into another variable:
 
+<!-- prettier-ignore -->
 ```js
 var bar = b * c;
 var foo = a + bar;
@@ -466,12 +414,14 @@
 
 Keep in mind that Prettier prints _some_ “unnecessary” parentheses, though:
 
+<!-- prettier-ignore -->
 ```js
 var foo = (a && b) || c;
 ```
 
 Example ESLint configuration:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -484,11 +434,11 @@
 
 **This rule requires certain Prettier options.**
 
-This rule disallows the use of tab characters at all. It can be used just fine
-with Prettier as long as you don’t configure Prettier to indent using tabs.
+This rule disallows the use of tab characters at all. It can be used just fine with Prettier as long as you don’t configure Prettier to indent using tabs.
 
 Example ESLint configuration:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -497,18 +447,18 @@
 }
 ```
 
-Example Prettier configuration (this is the default, so adding this is not
-required):
+Example Prettier configuration (this is the default, so adding this is not required):
 
+<!-- prettier-ignore -->
 ```json
 {
   "useTabs": false
 }
 ```
 
-**Note:** Since [ESlint 5.7.0] this rule can be configured to work regardless of
-your Prettier configuration:
+**Note:** Since [ESlint 5.7.0] this rule can be configured to work regardless of your Prettier configuration:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -523,32 +473,33 @@
 
 **This rule requires special attention when writing code.**
 
-This rule disallows confusing multiline expressions where a newline looks like
-it is ending a statement, but is not.
+This rule disallows confusing multiline expressions where a newline looks like it is ending a statement, but is not.
 
 For example, the rule could warn about this:
 
+<!-- prettier-ignore -->
 ```js
 var hello = "world"
 [1, 2, 3].forEach(addNumber)
 ```
 
-Prettier usually formats this in a way that makes it obvious that a semicolon
-was missing:
+Prettier usually formats this in a way that makes it obvious that a semicolon was missing:
 
+<!-- prettier-ignore -->
 ```js
 var hello = "world"[(1, 2, 3)].forEach(addNumber);
 ```
 
-However, there are cases where Prettier breaks things into several lines such
-that the `no-unexpected-multiline` conflicts.
+However, there are cases where Prettier breaks things into several lines such that the `no-unexpected-multiline` conflicts.
 
+<!-- prettier-ignore -->
 ```js
 const value = text.trim().split("\n")[position].toLowerCase();
 ```
 
 Prettier breaks it up into several lines, though, causing a conflict:
 
+<!-- prettier-ignore -->
 ```js
 const value = text
   .trim()
@@ -556,10 +507,9 @@
   [position].toLowerCase();
 ```
 
-If you like this rule, it can usually be used with Prettier without problems,
-but occasionally you might need to either temporarily disable the rule or
-refactor your code.
+If you like this rule, it can usually be used with Prettier without problems, but occasionally you might need to either temporarily disable the rule or refactor your code.
 
+<!-- prettier-ignore -->
 ```js
 const value = text
   .trim()
@@ -573,13 +523,11 @@
 const value = lines[position].toLowerCase();
 ```
 
-**Note:** If you _do_ enable this rule, you have to run ESLint and Prettier as
-two separate steps (and ESLint first) in order to get any value out of it.
-Otherwise Prettier might reformat your code in such a way that ESLint never gets
-a chance to report anything (as seen in the first example).
+**Note:** If you _do_ enable this rule, you have to run ESLint and Prettier as two separate steps (and ESLint first) in order to get any value out of it. Otherwise Prettier might reformat your code in such a way that ESLint never gets a chance to report anything (as seen in the first example).
 
 Example configuration:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -594,20 +542,18 @@
 
 **This rule requires certain options and certain Prettier options.**
 
-Usually, you don’t need this rule at all. But there are two cases where it could
-be useful:
+Usually, you don’t need this rule at all. But there are two cases where it could be useful:
 
-- To enforce the use of backticks rather than single or double quotes for
-  strings.
+- To enforce the use of backticks rather than single or double quotes for strings.
 - To forbid backticks where regular strings could have been used.
 
 #### Enforce backticks
 
-If you’d like all strings to use backticks (never quotes), enable the
-`"backtick"` option.
+If you’d like all strings to use backticks (never quotes), enable the `"backtick"` option.
 
 Example ESLint configuration:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -618,9 +564,9 @@
 
 #### Forbid unnecessary backticks
 
-In the following example, the first array item could have been written with
-quotes instead of backticks.
+In the following example, the first array item could have been written with quotes instead of backticks.
 
+<!-- prettier-ignore -->
 ```js
 const strings = [
   `could have been a regular string`,
@@ -633,12 +579,9 @@
 ];
 ```
 
-If you’d like ESLint to enforce `` `could have been a regular string` `` being
-written as either `"could have been a regular string"` or `'could have been a
-regular string'`, you need to use some specific configuration. The `quotes` rule has two options, a string option and an object option.
+If you’d like ESLint to enforce `` `could have been a regular string` `` being written as either `"could have been a regular string"` or `'could have been a regular string'`, you need to use some specific configuration. The `quotes` rule has two options, a string option and an object option.
 
-- The first (string) option needs to be set to `"single"` or `"double"` and be
-  kept in sync with Prettier’s [singleQuote] option.
+- The first (string) option needs to be set to `"single"` or `"double"` and be kept in sync with Prettier’s [singleQuote] option.
 - The second (object) option needs the following properties:
   - `"avoidEscape": true` to follow Prettier’s [string formatting rules].
   - `"allowTemplateLiterals": false` to disallow unnecessary backticks.
@@ -647,6 +590,7 @@
 
 ESLint:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -661,6 +605,7 @@
 
 Prettier (this is the default, so adding this is not required):
 
+<!-- prettier-ignore -->
 ```json
 {
   "singleQuote": false
@@ -671,6 +616,7 @@
 
 ESLint:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -685,6 +631,7 @@
 
 Prettier:
 
+<!-- prettier-ignore -->
 ```json
 {
   "singleQuote": true
@@ -699,6 +646,7 @@
 
 Prettier generally preserves the way you wrote your elements:
 
+<!-- prettier-ignore -->
 ```vue
 <div />
 <div></div>
@@ -708,14 +656,13 @@
 <svg><path d=""></path></svg>
 ```
 
-But for known _void_ HTML elements, Prettier always uses the self-closing style.
-For example, `<img>` is turned into `<img />`.
+But for known _void_ HTML elements, Prettier always uses the self-closing style. For example, `<img>` is turned into `<img />`.
 
-If you like this rule, it can be used just fine with Prettier as long as you
-set `html.void` to `"any"`.
+If you like this rule, it can be used just fine with Prettier as long as you set `html.void` to `"any"`.
 
 Example ESLint configuration:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -733,35 +680,29 @@
 
 ## Other rules worth mentioning
 
-These rules don’t conflict with Prettier, but have some gotchas when used with
-Prettier.
+These rules don’t conflict with Prettier, but have some gotchas when used with Prettier.
 
 ### [no-sequences]
 
-This rule forbids using JavaScript’s confusing comma operator (sequence
-expressions). This piece of code is not doing what it looks like:
+This rule forbids using JavaScript’s confusing comma operator (sequence expressions). This piece of code is not doing what it looks like:
 
+<!-- prettier-ignore -->
 ```js
 matrix[4, 7];
 ```
 
-Prettier adds parentheses to the above to make it clear that a sequence
-expression is used:
+Prettier adds parentheses to the above to make it clear that a sequence expression is used:
 
+<!-- prettier-ignore -->
 ```js
 matrix[(4, 7)];
 ```
 
-However, the `no-sequences` rule allows comma operators if the expression
-sequence is explicitly wrapped in parentheses. Since Prettier automatically
-wraps them in parentheses, you might never see any warnings from ESLint about
-comma operators.
+However, the `no-sequences` rule allows comma operators if the expression sequence is explicitly wrapped in parentheses. Since Prettier automatically wraps them in parentheses, you might never see any warnings from ESLint about comma operators.
 
-Ending up with an accidental sequence expression can easily happen while
-refactoring. If you want ESLint to catch such mistakes, it is recommended to
-forbid sequence expressions entirely using [no-restricted-syntax] \([as
-mentioned in the `no-sequences` documentation][no-sequences-full]):
+Ending up with an accidental sequence expression can easily happen while refactoring. If you want ESLint to catch such mistakes, it is recommended to forbid sequence expressions entirely using [no-restricted-syntax] \([as mentioned in the `no-sequences` documentation][no-sequences-full]):
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -770,13 +711,11 @@
 }
 ```
 
-If you still need to use the comma operator for some edge case, you can place an
-`// eslint-disable-next-line no-restricted-syntax` comment on the line above the
-expression. `no-sequences` can safely be disabled if you use the
-`no-restricted-syntax` approach.
+If you still need to use the comma operator for some edge case, you can place an `// eslint-disable-next-line no-restricted-syntax` comment on the line above the expression. `no-sequences` can safely be disabled if you use the `no-restricted-syntax` approach.
 
 You can also supply a custom message if you want:
 
+<!-- prettier-ignore -->
 ```json
 {
   "rules": {
@@ -795,28 +734,27 @@
 
 eslint-config-prettier has been tested with:
 
-- ESLint 6.8.0
+- ESLint 7.9.0
+  - eslint-config-prettier 6.11.0 and older were tested with ESLint 6.x
   - eslint-config-prettier 5.1.0 and older were tested with ESLint 5.x
   - eslint-config-prettier 2.10.0 and older were tested with ESLint 4.x
   - eslint-config-prettier 2.1.1 and older were tested with ESLint 3.x
-- prettier 1.19.1
-- @typescript-eslint/eslint-plugin 2.18.0
-- eslint-plugin-babel 5.3.0
-- eslint-plugin-flowtype 4.6.0
-- eslint-plugin-react 7.18.0
+- prettier 2.1.2
+- @typescript-eslint/eslint-plugin 4.2.0
+- eslint-plugin-babel 5.3.1
+- eslint-plugin-flowtype 5.2.0
+- eslint-plugin-react 7.21.2
 - eslint-plugin-standard 4.0.1
-- eslint-plugin-unicorn 15.0.1
-- eslint-plugin-vue 6.1.2
+- eslint-plugin-unicorn 22.0.0
+- eslint-plugin-vue 6.2.2
 
-Have new rules been added since those versions? Have we missed any rules? Is
-there a plugin you would like to see exclusions for? Open an issue or a pull
-request!
+Have new rules been added since those versions? Have we missed any rules? Is there a plugin you would like to see exclusions for? Open an issue or a pull request!
 
-If you’d like to add support for eslint-plugin-foobar, this is how you’d go
-about it:
+If you’d like to add support for eslint-plugin-foobar, this is how you’d go about it:
 
 First, create `foobar.js`:
 
+<!-- prettier-ignore -->
 ```js
 "use strict";
 
@@ -829,6 +767,7 @@
 
 Then, create `test-lint/foobar.js`:
 
+<!-- prettier-ignore -->
 ```js
 /* eslint-disable quotes */
 "use strict";
@@ -838,35 +777,25 @@
 console.log();
 ```
 
-`test-lint/foobar.js` must fail when used with eslint-plugin-foobar and
-eslint-plugin-prettier at the same time – until `"prettier/foobar"` is added to
-the "extends" property of an ESLint config. The file should be formatted
-according to Prettier, and that formatting should disagree with the plugin.
+`test-lint/foobar.js` must fail when used with eslint-plugin-foobar and eslint-plugin-prettier at the same time – until `"prettier/foobar"` is added to the "extends" property of an ESLint config. The file should be formatted according to Prettier, and that formatting should disagree with the plugin.
 
 Finally, you need to mention the plugin in several places:
 
 - Add `"foobar.js"` to the "files" field in `package.json`.
 - Add eslint-plugin-foobar to the "devDependencies" field in `package.json`.
-- Make sure that at least one rule from eslint-plugin-foobar gets used in
-  `.eslintrc.base.js`.
-- Add it to the list of supported plugins, to the example config and to
-  Contributing section in `README.md`.
+- Make sure that at least one rule from eslint-plugin-foobar gets used in `.eslintrc.base.js`.
+- Add it to the list of supported plugins, to the example config and to Contributing section in `README.md`.
 
-When you’re done, run `npm test` to verify that you got it all right. It runs
-several other npm scripts:
+When you’re done, run `npm test` to verify that you got it all right. It runs several other npm scripts:
 
-- `"test:lint"` makes sure that the files in `test-lint/` pass ESLint when
-  the exclusions from eslint-config-prettier are used. It also lints the code of
-  eslint-config-prettier itself.
+- `"test:lint"` makes sure that the files in `test-lint/` pass ESLint when the exclusions from eslint-config-prettier are used. It also lints the code of eslint-config-prettier itself, and checks that Prettier has been run on all files.
 - `"test:lint-verify-fail"` is run by a test in `test/lint-verify-fail.test.js`.
 - `"test:lint-rules"` is run by a test in `test/rules.test.js`.
 - `"test:jest"` runs unit tests that check a number of things:
   - That eslint-plugin-foobar is mentioned in all the places shown above.
-  - That no unknown rules are turned off. This helps catching typos, for
-    example.
+  - That no unknown rules are turned off. This helps catching typos, for example.
   - That the CLI works.
-- `"test:cli-sanity"` and `"test:cli-sanity-warning"` are sanity checks for the
-  CLI.
+- `"test:cli-sanity"` and `"test:cli-sanity-warning"` are sanity checks for the CLI.
 
 ## License
 
@@ -874,8 +803,8 @@
 
 [@typescript-eslint/eslint-plugin]: https://github.com/typescript-eslint/typescript-eslint
 [@typescript-eslint/quotes]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/quotes.md
-[ESlint 5.7.0]: https://eslint.org/blog/2018/10/eslint-v5.7.0-released
-[Prettier]: https://github.com/prettier/prettier
+[eslint 5.7.0]: https://eslint.org/blog/2018/10/eslint-v5.7.0-released
+[prettier]: https://github.com/prettier/prettier
 [arrow-body-style]: https://eslint.org/docs/rules/arrow-body-style
 [babel/quotes]: https://github.com/babel/eslint-plugin-babel#rules
 [curly]: https://eslint.org/docs/rules/curly
@@ -903,9 +832,7 @@
 [overrides]: https://eslint.org/docs/user-guide/configuring#configuration-based-on-glob-patterns
 [prefer-arrow-callback]: https://eslint.org/docs/rules/prefer-arrow-callback
 [quotes]: https://eslint.org/docs/rules/quotes
-[singleQuote]: https://prettier.io/docs/en/options.html#quotes
+[singlequote]: https://prettier.io/docs/en/options.html#quotes
 [string formatting rules]: https://prettier.io/docs/en/rationale.html#strings
-[travis-badge]: https://travis-ci.org/prettier/eslint-config-prettier.svg?branch=master
-[travis]: https://travis-ci.org/prettier/eslint-config-prettier
 [vue/html-self-closing]: https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/html-self-closing.md
 [vue/max-len]: https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/max-len.md
diff --git a/node_modules/eslint-config-prettier/babel.js b/node_modules/eslint-config-prettier/babel.js
index a93d5a4..47d0365 100644
--- a/node_modules/eslint-config-prettier/babel.js
+++ b/node_modules/eslint-config-prettier/babel.js
@@ -5,6 +5,6 @@
     "babel/quotes": 0,
 
     "babel/object-curly-spacing": "off",
-    "babel/semi": "off"
-  }
+    "babel/semi": "off",
+  },
 };
diff --git a/node_modules/eslint-config-prettier/bin/cli.js b/node_modules/eslint-config-prettier/bin/cli.js
index 47311c3..208b143 100755
--- a/node_modules/eslint-config-prettier/bin/cli.js
+++ b/node_modules/eslint-config-prettier/bin/cli.js
@@ -17,8 +17,8 @@
         "This tool checks whether an ESLint configuration contains rules that are",
         "unnecessary or conflict with Prettier. It’s supposed to be run like this:",
         "",
-        "  eslint --print-config path/to/main.js | eslint-config-prettier-check",
-        "  eslint --print-config test/index.js | eslint-config-prettier-check",
+        "  npx eslint --print-config path/to/main.js | npx eslint-config-prettier-check",
+        "  npx eslint --print-config test/index.js | npx eslint-config-prettier-check",
         "",
         "Exit codes:",
         "",
@@ -27,14 +27,14 @@
         "2: Conflicting rules found.",
         "",
         "For more information, see:",
-        "https://github.com/prettier/eslint-config-prettier#cli-helper-tool"
+        "https://github.com/prettier/eslint-config-prettier#cli-helper-tool",
       ].join("\n")
     );
     process.exit(1);
   }
 
   getStdin()
-    .then(string => {
+    .then((string) => {
       const result = processString(string);
       if (result.stderr) {
         console.error(result.stderr);
@@ -44,7 +44,7 @@
       }
       process.exit(result.code);
     })
-    .catch(error => {
+    .catch((error) => {
       console.error("Unexpected error", error);
       process.exit(1);
     });
@@ -57,7 +57,7 @@
   } catch (error) {
     return {
       stderr: `Failed to parse JSON:\n${error.message}`,
-      code: 1
+      code: 1,
     };
   }
 
@@ -69,7 +69,7 @@
   ) {
     return {
       stderr: `Expected a \`{"rules: {...}"}\` JSON object, but got:\n${string}`,
-      code: 1
+      code: 1,
     };
   }
 
@@ -80,8 +80,8 @@
     Object.create(null),
     ...fs
       .readdirSync(path.join(__dirname, ".."))
-      .filter(name => !name.startsWith(".") && name.endsWith(".js"))
-      .map(ruleFileName => require(`../${ruleFileName}`).rules)
+      .filter((name) => !name.startsWith(".") && name.endsWith(".js"))
+      .map((ruleFileName) => require(`../${ruleFileName}`).rules)
   );
 
   const regularRules = filterRules(
@@ -98,7 +98,7 @@
   );
 
   const flaggedRules = Object.keys(config.rules)
-    .map(ruleName => {
+    .map((ruleName) => {
       const value = config.rules[ruleName];
       const arrayValue = Array.isArray(value) ? value : [value];
       const level = arrayValue[0];
@@ -110,7 +110,7 @@
 
   const regularFlaggedRuleNames = filterRuleNames(
     flaggedRules,
-    ruleName => ruleName in regularRules
+    (ruleName) => ruleName in regularRules
   );
   const optionsFlaggedRuleNames = filterRuleNames(
     flaggedRules,
@@ -119,7 +119,7 @@
   );
   const specialFlaggedRuleNames = filterRuleNames(
     flaggedRules,
-    ruleName => ruleName in specialRules
+    (ruleName) => ruleName in specialRules
   );
 
   if (
@@ -138,52 +138,52 @@
             "However, the following rules are enabled but cannot be automatically checked. See:",
             SPECIAL_RULES_URL,
             "",
-            printRuleNames(specialFlaggedRuleNames)
+            printRuleNames(specialFlaggedRuleNames),
           ].join("\n");
 
     return {
       stdout: message,
-      code: 0
+      code: 0,
     };
   }
 
   const regularMessage = [
     "The following rules are unnecessary or might conflict with Prettier:",
     "",
-    printRuleNames(regularFlaggedRuleNames)
+    printRuleNames(regularFlaggedRuleNames),
   ].join("\n");
 
   const optionsMessage = [
     "The following rules are enabled with options that might conflict with Prettier. See:",
     SPECIAL_RULES_URL,
     "",
-    printRuleNames(optionsFlaggedRuleNames)
+    printRuleNames(optionsFlaggedRuleNames),
   ].join("\n");
 
   const specialMessage = [
     "The following rules are enabled but cannot be automatically checked. See:",
     SPECIAL_RULES_URL,
     "",
-    printRuleNames(specialFlaggedRuleNames)
+    printRuleNames(specialFlaggedRuleNames),
   ].join("\n");
 
   const message = [
     regularFlaggedRuleNames.length === 0 ? null : regularMessage,
     optionsFlaggedRuleNames.length === 0 ? null : optionsMessage,
-    specialFlaggedRuleNames.length === 0 ? null : specialMessage
+    specialFlaggedRuleNames.length === 0 ? null : specialMessage,
   ]
     .filter(Boolean)
     .join("\n\n");
 
   return {
     stdout: message,
-    code: 2
+    code: 2,
   };
 }
 
 function filterRules(rules, fn) {
   return Object.keys(rules)
-    .filter(ruleName => fn(ruleName, rules[ruleName]))
+    .filter((ruleName) => fn(ruleName, rules[ruleName]))
     .reduce((obj, ruleName) => {
       obj[ruleName] = true;
       return obj;
@@ -192,15 +192,15 @@
 
 function filterRuleNames(rules, fn) {
   return rules
-    .filter(rule => fn(rule.ruleName, rule.options))
-    .map(rule => rule.ruleName);
+    .filter((rule) => fn(rule.ruleName, rule.options))
+    .map((rule) => rule.ruleName);
 }
 
 function printRuleNames(ruleNames) {
   return ruleNames
     .slice()
     .sort()
-    .map(ruleName => `- ${ruleName}`)
+    .map((ruleName) => `- ${ruleName}`)
     .join("\n");
 }
 
diff --git a/node_modules/eslint-config-prettier/bin/validators.js b/node_modules/eslint-config-prettier/bin/validators.js
index c8c4ae9..a6a9b8a 100644
--- a/node_modules/eslint-config-prettier/bin/validators.js
+++ b/node_modules/eslint-config-prettier/bin/validators.js
@@ -50,5 +50,5 @@
       // Enable when Prettier supports SVG: https://github.com/prettier/prettier/issues/5322
       // && firstOption.svg === "any"
     );
-  }
+  },
 };
diff --git a/node_modules/eslint-config-prettier/flowtype.js b/node_modules/eslint-config-prettier/flowtype.js
index 09529ae..34b8943 100644
--- a/node_modules/eslint-config-prettier/flowtype.js
+++ b/node_modules/eslint-config-prettier/flowtype.js
@@ -10,6 +10,6 @@
     "flowtype/space-after-type-colon": "off",
     "flowtype/space-before-generic-bracket": "off",
     "flowtype/space-before-type-colon": "off",
-    "flowtype/union-intersection-spacing": "off"
-  }
+    "flowtype/union-intersection-spacing": "off",
+  },
 };
diff --git a/node_modules/eslint-config-prettier/index.js b/node_modules/eslint-config-prettier/index.js
index fa29d3f..1cbfd47 100644
--- a/node_modules/eslint-config-prettier/index.js
+++ b/node_modules/eslint-config-prettier/index.js
@@ -89,7 +89,7 @@
       "unicode-bom": "off",
       "wrap-iife": "off",
       "wrap-regex": "off",
-      "yield-star-spacing": "off"
+      "yield-star-spacing": "off",
     },
     includeDeprecated && {
       // Deprecated since version 4.0.0.
@@ -97,7 +97,7 @@
       "indent-legacy": "off",
       // Deprecated since version 3.3.0.
       // https://eslint.org/docs/rules/no-spaced-func
-      "no-spaced-func": "off"
+      "no-spaced-func": "off",
     }
-  )
+  ),
 };
diff --git a/node_modules/eslint-config-prettier/package.json b/node_modules/eslint-config-prettier/package.json
index 515ca8e..616625f 100644
--- a/node_modules/eslint-config-prettier/package.json
+++ b/node_modules/eslint-config-prettier/package.json
@@ -1,6 +1,6 @@
 {
   "name": "eslint-config-prettier",
-  "version": "6.10.0",
+  "version": "6.12.0",
   "license": "MIT",
   "author": "Simon Lydell",
   "description": "Turns off all rules that are unnecessary or might conflict with Prettier.",
@@ -26,7 +26,8 @@
   ],
   "scripts": {
     "doctoc": "doctoc README.md && replace \"\\[\\[([\\w/-]+)\\](?:([^\\[\\]]+)\\[([\\w/-]+)\\])?\\]\" \"[\\$1\\$2\\$3]\" README.md",
-    "test:lint": "eslint .",
+    "prettier": "prettier --write .",
+    "test:lint": "eslint . && prettier --check .",
     "test:lint-verify-fail": "eslint \"test-lint/*.{js,ts,vue}\" --config .eslintrc.base.js --format json",
     "test:lint-rules": "eslint index.js --config test-config/.eslintrc.js --format json",
     "test:deprecated": "eslint-find-rules --deprecated index.js",
@@ -39,26 +40,26 @@
     "get-stdin": "^6.0.0"
   },
   "devDependencies": {
-    "@typescript-eslint/eslint-plugin": "2.18.0",
-    "@typescript-eslint/parser": "2.18.0",
-    "babel-eslint": "10.0.3",
-    "cross-spawn": "6.0.5",
+    "@typescript-eslint/eslint-plugin": "4.2.0",
+    "@typescript-eslint/parser": "4.2.0",
+    "babel-eslint": "10.1.0",
+    "cross-spawn": "7.0.3",
     "doctoc": "1.4.0",
-    "eslint": "6.8.0",
+    "eslint": "7.9.0",
     "eslint-config-google": "0.14.0",
-    "eslint-find-rules": "3.4.0",
-    "eslint-plugin-babel": "5.3.0",
-    "eslint-plugin-flowtype": "4.6.0",
-    "eslint-plugin-prettier": "3.1.2",
-    "eslint-plugin-react": "7.18.0",
+    "eslint-find-rules": "3.6.1",
+    "eslint-plugin-babel": "5.3.1",
+    "eslint-plugin-flowtype": "5.2.0",
+    "eslint-plugin-prettier": "3.1.4",
+    "eslint-plugin-react": "7.21.2",
     "eslint-plugin-standard": "4.0.1",
-    "eslint-plugin-unicorn": "15.0.1",
-    "eslint-plugin-vue": "6.1.2",
-    "jest": "25.1.0",
-    "prettier": "1.19.1",
-    "replace": "1.1.5",
-    "rimraf": "3.0.1",
-    "typescript": "3.7.5"
+    "eslint-plugin-unicorn": "22.0.0",
+    "eslint-plugin-vue": "6.2.2",
+    "jest": "26.4.2",
+    "prettier": "2.1.2",
+    "replace": "1.2.0",
+    "rimraf": "3.0.2",
+    "typescript": "4.0.3"
   },
   "peerDependencies": {
     "eslint": ">=3.14.1"
diff --git a/node_modules/eslint-config-prettier/react.js b/node_modules/eslint-config-prettier/react.js
index 264737f..3f48553 100644
--- a/node_modules/eslint-config-prettier/react.js
+++ b/node_modules/eslint-config-prettier/react.js
@@ -18,12 +18,12 @@
       "react/jsx-one-expression-per-line": "off",
       "react/jsx-props-no-multi-spaces": "off",
       "react/jsx-tag-spacing": "off",
-      "react/jsx-wrap-multilines": "off"
+      "react/jsx-wrap-multilines": "off",
     },
     includeDeprecated && {
       // Deprecated since version 7.0.0.
       // https://github.com/yannickcr/eslint-plugin-react/blob/master/CHANGELOG.md#700---2017-05-06
-      "react/jsx-space-before-closing": "off"
+      "react/jsx-space-before-closing": "off",
     }
-  )
+  ),
 };
diff --git a/node_modules/eslint-config-prettier/standard.js b/node_modules/eslint-config-prettier/standard.js
index 036ecd4..faacadd 100644
--- a/node_modules/eslint-config-prettier/standard.js
+++ b/node_modules/eslint-config-prettier/standard.js
@@ -4,6 +4,6 @@
   rules: {
     "standard/array-bracket-even-spacing": "off",
     "standard/computed-property-even-spacing": "off",
-    "standard/object-curly-even-spacing": "off"
-  }
+    "standard/object-curly-even-spacing": "off",
+  },
 };
diff --git a/node_modules/eslint-config-prettier/unicorn.js b/node_modules/eslint-config-prettier/unicorn.js
index 34e5187..eb7103e 100644
--- a/node_modules/eslint-config-prettier/unicorn.js
+++ b/node_modules/eslint-config-prettier/unicorn.js
@@ -3,6 +3,6 @@
 module.exports = {
   rules: {
     "unicorn/no-nested-ternary": "off",
-    "unicorn/number-literal-case": "off"
-  }
+    "unicorn/number-literal-case": "off",
+  },
 };
diff --git a/node_modules/eslint-config-prettier/vue.js b/node_modules/eslint-config-prettier/vue.js
index 2c7c6c6..d60c2de 100644
--- a/node_modules/eslint-config-prettier/vue.js
+++ b/node_modules/eslint-config-prettier/vue.js
@@ -27,6 +27,6 @@
     "vue/script-indent": "off",
     "vue/singleline-html-element-content-newline": "off",
     "vue/space-infix-ops": "off",
-    "vue/space-unary-ops": "off"
-  }
+    "vue/space-unary-ops": "off",
+  },
 };
diff --git a/node_modules/eslint-import-resolver-node/CHANGELOG.md b/node_modules/eslint-import-resolver-node/CHANGELOG.md
index f0d2358..8fa31be 100644
--- a/node_modules/eslint-import-resolver-node/CHANGELOG.md
+++ b/node_modules/eslint-import-resolver-node/CHANGELOG.md
@@ -5,9 +5,17 @@
 
 ## Unreleased
 
+## v0.3.4 - 2020-06-16
+### Added
+- add `.node` extension ([#1663])
+
+## v0.3.3 - 2020-01-10
+### Changed
+- [meta] copy LICENSE file to all npm packages on prepublish ([#1595], thanks [@opichals])
+
 ## v0.3.2 - 2018-01-05
 ### Added
-- `.mjs` extension detected by default to support `experimental-modules` (#939)
+- `.mjs` extension detected by default to support `experimental-modules` ([#939])
 
 ### Deps
 - update `debug`, `resolve`
@@ -42,6 +50,8 @@
 
 [#438]: https://github.com/benmosher/eslint-plugin-import/pull/438
 
+[#1663]: https://github.com/benmosher/eslint-plugin-import/issues/1663
+[#1595]: https://github.com/benmosher/eslint-plugin-import/pull/1595
 [#939]: https://github.com/benmosher/eslint-plugin-import/issues/939
 [#531]: https://github.com/benmosher/eslint-plugin-import/issues/531
 [#437]: https://github.com/benmosher/eslint-plugin-import/issues/437
@@ -50,3 +60,4 @@
 [@lukeapage]: https://github.com/lukeapage
 [@SkeLLLa]: https://github.com/SkeLLLa
 [@ljharb]: https://github.com/ljharb
+[@opichals]: https://github.com/opichals
diff --git a/node_modules/eslint-import-resolver-node/index.js b/node_modules/eslint-import-resolver-node/index.js
index b5a1537..bf2aab3 100644
--- a/node_modules/eslint-import-resolver-node/index.js
+++ b/node_modules/eslint-import-resolver-node/index.js
@@ -28,7 +28,7 @@
   return Object.assign({
       // more closely matches Node (#333)
       // plus 'mjs' for native modules! (#939)
-      extensions: ['.mjs', '.js', '.json'],
+      extensions: ['.mjs', '.js', '.json', '.node'],
     },
     config,
     {
diff --git a/node_modules/eslint-import-resolver-node/package.json b/node_modules/eslint-import-resolver-node/package.json
index f197bab..27daa90 100644
--- a/node_modules/eslint-import-resolver-node/package.json
+++ b/node_modules/eslint-import-resolver-node/package.json
@@ -1,6 +1,6 @@
 {
   "name": "eslint-import-resolver-node",
-  "version": "0.3.3",
+  "version": "0.3.4",
   "description": "Node default behavior import resolution plugin for eslint-plugin-import.",
   "main": "index.js",
   "files": [
@@ -8,7 +8,8 @@
   ],
   "scripts": {
     "prepublishOnly": "cp ../../{LICENSE,.npmrc} ./",
-    "test": "nyc mocha",
+    "tests-only": "nyc mocha",
+    "test": "npm run tests-only",
     "coveralls": "nyc report --reporter lcovonly && cd ../.. && coveralls < ./resolvers/node/coverage/lcov.info"
   },
   "repository": {
diff --git a/node_modules/eslint-module-utils/CHANGELOG.md b/node_modules/eslint-module-utils/CHANGELOG.md
index 61671ba..f337d38 100644
--- a/node_modules/eslint-module-utils/CHANGELOG.md
+++ b/node_modules/eslint-module-utils/CHANGELOG.md
@@ -5,6 +5,11 @@
 
 ## Unreleased
 
+## v2.6.0 - 2020-03-28
+
+### Added
+[New] Print more helpful info if parsing fails ([#1671], thanks [@kaiyoma])
+
 ## v2.5.2 - 2020-01-12
 
 ### Fixed
@@ -70,6 +75,7 @@
 ### Fixed
 - `unambiguous.test()` regex is now properly in multiline mode
 
+[#1671]: https://github.com/benmosher/eslint-plugin-import/pull/1671
 [#1606]: https://github.com/benmosher/eslint-plugin-import/pull/1606
 [#1602]: https://github.com/benmosher/eslint-plugin-import/pull/1602
 [#1591]: https://github.com/benmosher/eslint-plugin-import/pull/1591
@@ -94,3 +100,4 @@
 [@arcanis]: https://github.com/arcanis
 [@sompylasar]: https://github.com/sompylasar
 [@iamnapo]: https://github.com/iamnapo
+[@kaiyoma]: https://github.com/kaiyoma
diff --git a/node_modules/eslint-module-utils/ModuleCache.js b/node_modules/eslint-module-utils/ModuleCache.js
index ab0266f..b910a58 100644
--- a/node_modules/eslint-module-utils/ModuleCache.js
+++ b/node_modules/eslint-module-utils/ModuleCache.js
@@ -22,7 +22,7 @@
   get(cacheKey, settings) {
     if (this.map.has(cacheKey)) {
       const f = this.map.get(cacheKey)
-      // check fresness
+      // check freshness
       if (process.hrtime(f.lastSeen)[0] < settings.lifetime) return f.result
     } else log('cache miss for', cacheKey)
     // cache miss
diff --git a/node_modules/eslint-module-utils/package.json b/node_modules/eslint-module-utils/package.json
index b8d4033..6e8ebdd 100644
--- a/node_modules/eslint-module-utils/package.json
+++ b/node_modules/eslint-module-utils/package.json
@@ -1,6 +1,6 @@
 {
   "name": "eslint-module-utils",
-  "version": "2.5.2",
+  "version": "2.6.0",
   "description": "Core utilities to support eslint-plugin-import and other module-related plugins.",
   "engines": {
     "node": ">=4"
diff --git a/node_modules/eslint-module-utils/parse.js b/node_modules/eslint-module-utils/parse.js
index fa2ff14..b3a4692 100644
--- a/node_modules/eslint-module-utils/parse.js
+++ b/node_modules/eslint-module-utils/parse.js
@@ -47,7 +47,9 @@
     try {
       ast = parser.parseForESLint(content, parserOptions).ast
     } catch (e) {
-      //
+      console.warn()
+      console.warn('Error while parsing ' + parserOptions.filePath)
+      console.warn('Line ' + e.lineNumber + ', column ' + e.column + ': ' + e.message)
     }
     if (!ast || typeof ast !== 'object') {
       console.warn(
diff --git a/node_modules/eslint-plugin-flowtype/CONTRIBUTING.md b/node_modules/eslint-plugin-flowtype/CONTRIBUTING.md
deleted file mode 100644
index 455849d..0000000
--- a/node_modules/eslint-plugin-flowtype/CONTRIBUTING.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# Contributing
-
-**`README.md` is a generated file. Do not edit it directly.** Edit the files inside `.README` instead.
-
-## Pre-Commit Hook
-
-When making a commit, the following Pre-Commit hooks run:
-
-* test and documentation checks
-* tests
-* lint
-* commit message validation (see "Commit Messages" below)
-
-## Commit Messages
-
-All commit messages must begin with one of the following prefixes:
-
-* `fix: `
-* `feat: `
-* `refactor: `
-* `docs: `
-* `chore: `
-
-The prefix is used to bump the correct segment of the version number during the automatic release.
-
-## Tests
-
-Run them with `npm test`.
-
-## Lint
-
-Run with `npm run lint`.
-
-## Submitting a PR
-
-Just before submitting a PR, run `npm run create-readme` to generate the new README.md
-
-## Adding a Rule
-
-### Source & Tests
-
-1. Create a file in `tests/rules/assertions` named the `camelCase` version of your rule name with the following template:
-  * `export default { invalid: [], valid: [] }`
-2. Add your test file to `tests/rules/index.js`
-3. Create a file in `src/rules` named the `camelCase` version  of your rule name
-4. Add your rule file to `src/index.js`
-
-### Adding Documentation
-
-1. Create new file in `./.README/rules/[rule-name].md`.
-  * Use [./.README/rules/require-valid-file-annotation.md](./.README/rules/require-valid-file-annotation.md) as a template.
-  * Ensure that rule documentation document includes `<!-- assertions spaceAfterTypeColon -->` declaration.
-1. Update [./.README/README.md](/.README/README.md) to include the new rule.
-
-A CI service will build and publish the new documentation.
-
-Note: Sections "The following patterns are considered problems:" and "The following patterns are not considered problems:" are **generated automatically** using the test cases.
diff --git a/node_modules/eslint-plugin-flowtype/LICENSE b/node_modules/eslint-plugin-flowtype/LICENSE
deleted file mode 100644
index 183e8d8..0000000
--- a/node_modules/eslint-plugin-flowtype/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-Copyright (c) 2015, Gajus Kuizinas (http://gajus.com/)
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of the Gajus Kuizinas (http://gajus.com/) nor the
-      names of its contributors may be used to endorse or promote products
-      derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL ANUARY BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/eslint-plugin-flowtype/README.md b/node_modules/eslint-plugin-flowtype/README.md
deleted file mode 100644
index 3ce8660..0000000
--- a/node_modules/eslint-plugin-flowtype/README.md
+++ /dev/null
@@ -1,5943 +0,0 @@
-<a name="eslint-plugin-flowtype"></a>
-# eslint-plugin-flowtype
-
-[![GitSpo Mentions](https://gitspo.com/badges/mentions/gajus/eslint-plugin-flowtype?style=flat-square)](https://gitspo.com/mentions/gajus/eslint-plugin-flowtype)
-[![NPM version](http://img.shields.io/npm/v/eslint-plugin-flowtype.svg?style=flat-square)](https://www.npmjs.org/package/eslint-plugin-flowtype)
-[![Travis build status](http://img.shields.io/travis/gajus/eslint-plugin-flowtype/master.svg?style=flat-square)](https://travis-ci.org/gajus/eslint-plugin-flowtype)
-[![js-canonical-style](https://img.shields.io/badge/code%20style-canonical-blue.svg?style=flat-square)](https://github.com/gajus/canonical)
-
-[Flow type](http://flowtype.org/) linting rules for ESLint.
-
-* [eslint-plugin-flowtype](#eslint-plugin-flowtype)
-    * [Installation](#eslint-plugin-flowtype-installation)
-    * [Configuration](#eslint-plugin-flowtype-configuration)
-        * [Shareable configurations](#eslint-plugin-flowtype-configuration-shareable-configurations)
-        * [Community maintained configurations](#eslint-plugin-flowtype-configuration-community-maintained-configurations)
-    * [Settings](#eslint-plugin-flowtype-settings)
-        * [`onlyFilesWithFlowAnnotation`](#eslint-plugin-flowtype-settings-onlyfileswithflowannotation)
-    * [Rules](#eslint-plugin-flowtype-rules)
-        * [`array-style-complex-type`](#eslint-plugin-flowtype-rules-array-style-complex-type)
-        * [`array-style-simple-type`](#eslint-plugin-flowtype-rules-array-style-simple-type)
-        * [`arrow-parens`](#eslint-plugin-flowtype-rules-arrow-parens)
-        * [`boolean-style`](#eslint-plugin-flowtype-rules-boolean-style)
-        * [`define-flow-type`](#eslint-plugin-flowtype-rules-define-flow-type)
-        * [`delimiter-dangle`](#eslint-plugin-flowtype-rules-delimiter-dangle)
-        * [`generic-spacing`](#eslint-plugin-flowtype-rules-generic-spacing)
-        * [`newline-after-flow-annotation`](#eslint-plugin-flowtype-rules-newline-after-flow-annotation)
-        * [`no-dupe-keys`](#eslint-plugin-flowtype-rules-no-dupe-keys)
-        * [`no-existential-type`](#eslint-plugin-flowtype-rules-no-existential-type)
-        * [`no-flow-fix-me-comments`](#eslint-plugin-flowtype-rules-no-flow-fix-me-comments)
-        * [`no-mixed`](#eslint-plugin-flowtype-rules-no-mixed)
-        * [`no-mutable-array`](#eslint-plugin-flowtype-rules-no-mutable-array)
-        * [`no-primitive-constructor-types`](#eslint-plugin-flowtype-rules-no-primitive-constructor-types)
-        * [`no-types-missing-file-annotation`](#eslint-plugin-flowtype-rules-no-types-missing-file-annotation)
-        * [`no-unused-expressions`](#eslint-plugin-flowtype-rules-no-unused-expressions)
-        * [`no-weak-types`](#eslint-plugin-flowtype-rules-no-weak-types)
-        * [`object-type-delimiter`](#eslint-plugin-flowtype-rules-object-type-delimiter)
-        * [`require-compound-type-alias`](#eslint-plugin-flowtype-rules-require-compound-type-alias)
-        * [`require-exact-type`](#eslint-plugin-flowtype-rules-require-exact-type)
-        * [`require-indexer-name`](#eslint-plugin-flowtype-rules-require-indexer-name)
-        * [`require-inexact-type`](#eslint-plugin-flowtype-rules-require-inexact-type)
-        * [`require-parameter-type`](#eslint-plugin-flowtype-rules-require-parameter-type)
-        * [`require-readonly-react-props`](#eslint-plugin-flowtype-rules-require-readonly-react-props)
-        * [`require-return-type`](#eslint-plugin-flowtype-rules-require-return-type)
-        * [`require-types-at-top`](#eslint-plugin-flowtype-rules-require-types-at-top)
-        * [`require-valid-file-annotation`](#eslint-plugin-flowtype-rules-require-valid-file-annotation)
-        * [`require-variable-type`](#eslint-plugin-flowtype-rules-require-variable-type)
-        * [`semi`](#eslint-plugin-flowtype-rules-semi)
-        * [`sort-keys`](#eslint-plugin-flowtype-rules-sort-keys)
-        * [`space-after-type-colon`](#eslint-plugin-flowtype-rules-space-after-type-colon)
-        * [`space-before-generic-bracket`](#eslint-plugin-flowtype-rules-space-before-generic-bracket)
-        * [`space-before-type-colon`](#eslint-plugin-flowtype-rules-space-before-type-colon)
-        * [`spread-exact-type`](#eslint-plugin-flowtype-rules-spread-exact-type)
-        * [`type-id-match`](#eslint-plugin-flowtype-rules-type-id-match)
-        * [`type-import-style`](#eslint-plugin-flowtype-rules-type-import-style)
-        * [`union-intersection-spacing`](#eslint-plugin-flowtype-rules-union-intersection-spacing)
-        * [`use-flow-type`](#eslint-plugin-flowtype-rules-use-flow-type)
-        * [`valid-syntax`](#eslint-plugin-flowtype-rules-valid-syntax)
-
-
-<a name="eslint-plugin-flowtype-installation"></a>
-## Installation
-
-1. Install [ESLint](https://www.github.com/eslint/eslint).
-1. Install [`babel-eslint`](https://github.com/babel/babel-eslint) parser (ESLint parser [does not support type annotations](https://github.com/eslint/eslint/issues/2157)).
-1. Install [`eslint-plugin-flowtype`](https://github.com/gajus/eslint-plugin-flowtype) plugin.
-
-<!-- -->
-
-```sh
-npm install eslint --save-dev
-npm install babel-eslint --save-dev
-npm install eslint-plugin-flowtype --save-dev
-
-# Or all at once:
-npm install eslint babel-eslint eslint-plugin-flowtype --save-dev
-```
-
-<a name="eslint-plugin-flowtype-configuration"></a>
-## Configuration
-
-1. Set `parser` property to `babel-eslint`.
-1. Add `plugins` section and specify `eslint-plugin-flowtype` as a plugin.
-1. Enable rules.
-
-<!-- -->
-
-```json
-{
-  "parser": "babel-eslint",
-  "plugins": [
-    "flowtype"
-  ],
-  "rules": {
-    "flowtype/boolean-style": [
-      2,
-      "boolean"
-    ],
-    "flowtype/define-flow-type": 1,
-    "flowtype/delimiter-dangle": [
-      2,
-      "never"
-    ],
-    "flowtype/generic-spacing": [
-      2,
-      "never"
-    ],
-    "flowtype/no-mixed": 2,
-    "flowtype/no-primitive-constructor-types": 2,
-    "flowtype/no-types-missing-file-annotation": 2,
-    "flowtype/no-weak-types": 2,
-    "flowtype/object-type-delimiter": [
-      2,
-      "comma"
-    ],
-    "flowtype/require-parameter-type": 2,
-    "flowtype/require-readonly-react-props": 0,
-    "flowtype/require-return-type": [
-      2,
-      "always",
-      {
-        "annotateUndefined": "never"
-      }
-    ],
-    "flowtype/require-valid-file-annotation": 2,
-    "flowtype/semi": [
-      2,
-      "always"
-    ],
-    "flowtype/space-after-type-colon": [
-      2,
-      "always"
-    ],
-    "flowtype/space-before-generic-bracket": [
-      2,
-      "never"
-    ],
-    "flowtype/space-before-type-colon": [
-      2,
-      "never"
-    ],
-    "flowtype/type-id-match": [
-      2,
-      "^([A-Z][a-z0-9]+)+Type$"
-    ],
-    "flowtype/union-intersection-spacing": [
-      2,
-      "always"
-    ],
-    "flowtype/use-flow-type": 1,
-    "flowtype/valid-syntax": 1
-  },
-  "settings": {
-    "flowtype": {
-      "onlyFilesWithFlowAnnotation": false
-    }
-  }
-}
-```
-
-<a name="eslint-plugin-flowtype-configuration-shareable-configurations"></a>
-### Shareable configurations
-
-<a name="eslint-plugin-flowtype-configuration-shareable-configurations-recommended"></a>
-#### Recommended
-
-This plugin exports a [recommended configuration](./src/configs/recommended.json) that enforces Flow type good practices.
-
-To enable this configuration use the extends property in your `.eslintrc` config file:
-
-```json
-{
-  "extends": [
-    "plugin:flowtype/recommended"
-  ],
-  "plugins": [
-    "flowtype"
-  ]
-}
-```
-
-See [ESLint documentation](http://eslint.org/docs/user-guide/configuring#extending-configuration-files) for more information about extending configuration files.
-
-<a name="eslint-plugin-flowtype-configuration-community-maintained-configurations"></a>
-### Community maintained configurations
-
-The following are third-party submitted/ maintained configurations of `eslint-plugin-flowtype`:
-
-* https://github.com/wemake-services/eslint-config-flowtype-essential
-
-<a name="eslint-plugin-flowtype-settings"></a>
-## Settings
-
-<a name="eslint-plugin-flowtype-settings-onlyfileswithflowannotation"></a>
-### <code>onlyFilesWithFlowAnnotation</code>
-
-When `true`, only checks files with a [`@flow` annotation](http://flowtype.org/docs/about-flow.html#gradual) in the first comment.
-
-```js
-{
-  "settings": {
-    "flowtype": {
-      "onlyFilesWithFlowAnnotation": true
-    }
-  }
-}
-```
-
-<a name="eslint-plugin-flowtype-rules"></a>
-## Rules
-
-<!-- Rules are sorted alphabetically. -->
-
-<a name="eslint-plugin-flowtype-rules-array-style-complex-type"></a>
-### <code>array-style-complex-type</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces a particular annotation style of complex types.
-
-Type is considered complex in these cases:
-
-* [Maybe type](https://flow.org/en/docs/types/maybe/)
-* [Function type](https://flow.org/en/docs/types/functions/)
-* [Object type](https://flow.org/en/docs/types/objects/)
-* [Tuple type](https://flow.org/en/docs/types/tuples/)
-* [Union type](https://flow.org/en/docs/types/unions/)
-* [Intersection type](https://flow.org/en/docs/types/intersections/)
-
-This rule takes one argument.
-
-If it is `'verbose'` then a problem is raised when using `Type[]` instead of `Array<Type>`.
-
-If it is `'shorthand'` then a problem is raised when using `Array<Type>` instead of `Type[]`.
-
-The default value is `'verbose'`.
-
-The following patterns are considered problems:
-
-```js
-type X = (?string)[]
-// Message: Use "Array<?string>", not "(?string)[]"
-
-// Options: ["verbose"]
-type X = (?string)[]
-// Message: Use "Array<?string>", not "(?string)[]"
-
-// Options: ["shorthand"]
-type X = Array<?string>
-// Message: Use "(?string)[]", not "Array<?string>"
-
-// Options: ["shorthand"]
-type X = Array<{foo: string}>
-// Message: Use "{foo: string}[]", not "Array<{foo: string}>"
-
-type X = (string | number)[]
-// Message: Use "Array<string | number>", not "(string | number)[]"
-
-type X = (string & number)[]
-// Message: Use "Array<string & number>", not "(string & number)[]"
-
-type X = [string, number][]
-// Message: Use "Array<[string, number]>", not "[string, number][]"
-
-type X = {foo: string}[]
-// Message: Use "Array<{foo: string}>", not "{foo: string}[]"
-
-type X = (string => number)[]
-// Message: Use "Array<string => number>", not "(string => number)[]"
-
-type X = {
-    foo: string,
-    bar: number
-}[]
-// Message: Use "Array<{ foo: string, bar: number }>", not "{ foo: string, bar: number }[]"
-
-type X = {
-    foo: string,
-    bar: number,
-    quo: boolean,
-    hey: Date
-}[]
-// Message: Use "Array<Type>", not "Type[]"
-```
-
-The following patterns are not considered problems:
-
-```js
-type X = Array<?string>
-
-// Options: ["verbose"]
-type X = Array<?string>
-
-// Options: ["shorthand"]
-type X = (?string)[]
-
-// Options: ["shorthand"]
-type X = Array<string>
-
-// Options: ["shorthand"]
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-type X = Array<?string>
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-array-style-simple-type"></a>
-### <code>array-style-simple-type</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces a particular array type annotation style of simple types.
-
-Type is considered simple in these cases:
-
-* [Primitive types](https://flow.org/en/docs/types/primitives/)
-* [Literal types](https://flow.org/en/docs/types/literals/)
-* [Mixed type](https://flow.org/en/docs/types/mixed/)
-* [Any type](https://flow.org/en/docs/types/any/)
-* [Class type](https://flow.org/en/docs/types/classes/)
-* [Generic type](https://flow.org/en/docs/types/generics/)
-* Array type [shorthand notation](https://flow.org/en/docs/types/arrays/#toc-array-type-shorthand-syntax)
-
-This rule takes one argument.
-
-If it is `'verbose'` then a problem is raised when using `Type[]` instead of `Array<Type>`.
-
-If it is `'shorthand'` then a problem is raised when using `Array<Type>` instead of `Type[]`.
-
-The default value is `'verbose'`.
-
-The following patterns are considered problems:
-
-```js
-type X = string[]
-// Message: Use "Array<string>", not "string[]"
-
-// Options: ["verbose"]
-type X = string[]
-// Message: Use "Array<string>", not "string[]"
-
-// Options: ["shorthand"]
-type X = Array<string>
-// Message: Use "string[]", not "Array<string>"
-
-type X = Date[]
-// Message: Use "Array<Date>", not "Date[]"
-
-type X = Promise<string>[]
-// Message: Use "Array<Promise<string>>", not "Promise<string>[]"
-
-type X = $Keys<{foo: string}>[]
-// Message: Use "Array<$Keys<{foo: string}>>", not "$Keys<{foo: string}>[]"
-
-type X = any[]
-// Message: Use "Array<any>", not "any[]"
-
-type X = mixed[]
-// Message: Use "Array<mixed>", not "mixed[]"
-
-type X = void[]
-// Message: Use "Array<void>", not "void[]"
-
-type X = null[]
-// Message: Use "Array<null>", not "null[]"
-
-type X = string[][]
-// Message: Use "Array<string[]>", not "string[][]"
-// Message: Use "Array<string>", not "string[]"
-
-type X = Promise<{
-    foo: string,
-    bar: number
-}>[]
-// Message: Use "Array<Promise<{ foo: string, bar: number }>>", not "Promise<{ foo: string, bar: number }>[]"
-
-type X = Promise<{
-    foo: string,
-    bar: number,
-    quo: boolean
-}>[]
-// Message: Use "Array<Type>", not "Type[]"
-```
-
-The following patterns are not considered problems:
-
-```js
-type X = Array<string>
-
-// Options: ["verbose"]
-type X = Array<string>
-
-// Options: ["shorthand"]
-type X = string[]
-
-type X = Array<Array<string>>
-
-// Options: ["verbose"]
-type X = (?string)[]
-
-// Options: ["verbose"]
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-type X = string[]
-
-type X = Array
-
-type X = typeof Array
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-arrow-parens"></a>
-### <code>arrow-parens</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces the consistent use of parentheses in arrow functions.
-
-This rule has a string option and an object one.
-
-String options are:
-
-- `"always"` (default) requires parens around arguments in all cases.
-- `"as-needed"` enforces no braces where they can be omitted.
-
-Object properties for variants of the `"as-needed"` option:
-
-- `"requireForBlockBody": true` modifies the as-needed rule in order to require parens if the function body is in an instructions block (surrounded by braces).
-
-The following patterns are considered problems:
-
-```js
-a => {}
-// Message: undefined
-
-a => a
-// Message: undefined
-
-a => {
-}
-// Message: undefined
-
-a.then(foo => {});
-// Message: undefined
-
-a.then(foo => a);
-// Message: undefined
-
-a(foo => { if (true) {}; });
-// Message: undefined
-
-a(async foo => { if (true) {}; });
-// Message: undefined
-
-// Options: ["as-needed"]
-(a) => a
-// Message: undefined
-
-// Options: ["as-needed"]
-(a,) => a
-// Message: undefined
-
-// Options: ["as-needed"]
-async (a) => a
-// Message: undefined
-
-// Options: ["as-needed"]
-async(a) => a
-// Message: undefined
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-a => {}
-// Message: undefined
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-(a) => a
-// Message: undefined
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-async a => {}
-// Message: undefined
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-async (a) => a
-// Message: undefined
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-async(a) => a
-// Message: undefined
-```
-
-The following patterns are not considered problems:
-
-```js
-() => {}
-
-(a) => {}
-
-(a) => a
-
-(a) => {
-}
-
-a.then((foo) => {});
-
-a.then((foo) => { if (true) {}; });
-
-a.then(async (foo) => { if (true) {}; });
-
-// Options: ["always"]
-() => {}
-
-// Options: ["always"]
-(a) => {}
-
-// Options: ["always"]
-(a) => a
-
-// Options: ["always"]
-(a) => {
-}
-
-// Options: ["always"]
-a.then((foo) => {});
-
-// Options: ["always"]
-a.then((foo) => { if (true) {}; });
-
-// Options: ["always"]
-a.then(async (foo) => { if (true) {}; });
-
-// Options: ["as-needed"]
-() => {}
-
-// Options: ["as-needed"]
-a => {}
-
-// Options: ["as-needed"]
-a => a
-
-// Options: ["as-needed"]
-([a, b]) => {}
-
-// Options: ["as-needed"]
-({ a, b }) => {}
-
-// Options: ["as-needed"]
-(a = 10) => {}
-
-// Options: ["as-needed"]
-(...a) => a[0]
-
-// Options: ["as-needed"]
-(a, b) => {}
-
-// Options: ["as-needed"]
-async ([a, b]) => {}
-
-// Options: ["as-needed"]
-async (a, b) => {}
-
-// Options: ["as-needed"]
-(a: T) => a
-
-// Options: ["as-needed"]
-(a): T => a
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-() => {}
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-a => a
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-([a, b]) => {}
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-([a, b]) => a
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-({ a, b }) => {}
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-({ a, b }) => a + b
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-(a = 10) => {}
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-(...a) => a[0]
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-(a, b) => {}
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-a => ({})
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-async a => ({})
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-async a => a
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-(a: T) => a
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-(a): T => a
-
-// Options: ["always",{"requireForBlockBody":true}]
-<T>(a: T) => a
-
-// Options: ["as-needed",{"requireForBlockBody":false}]
-<T>(a: T) => { return a; }
-
-// Options: ["always",{"requireForBlockBody":true}]
-<T>(a: T) => { return a; }
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-<T>(a: T) => { return a; }
-
-// Options: ["as-needed",{"requireForBlockBody":true}]
-(a): %checks => typeof a === "number"
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-boolean-style"></a>
-### <code>boolean-style</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces a particular style for boolean type annotations. This rule takes one argument.
-
-If it is `'boolean'` then a problem is raised when using `bool` instead of `boolean`.
-
-If it is `'bool'` then a problem is raised when using `boolean` instead of `bool`.
-
-The default value is `'boolean'`.
-
-The following patterns are considered problems:
-
-```js
-type X = bool
-// Message: Use "boolean", not "bool"
-
-// Options: ["boolean"]
-type X = bool
-// Message: Use "boolean", not "bool"
-
-// Options: ["bool"]
-type X = boolean
-// Message: Use "bool", not "boolean"
-```
-
-The following patterns are not considered problems:
-
-```js
-type X = boolean
-
-// Options: ["boolean"]
-type X = boolean
-
-// Options: ["bool"]
-type X = bool
-
-// Options: ["boolean"]
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-type X = bool
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-define-flow-type"></a>
-### <code>define-flow-type</code>
-
-Marks Flow type identifiers as defined.
-
-Used to suppress [`no-undef`](http://eslint.org/docs/rules/no-undef) reporting of type identifiers.
-
-The following patterns are not considered problems:
-
-```js
-var a: AType
-// Additional rules: {"no-undef":2}
-
-var a: AType; var b: AType
-// Additional rules: {"no-undef":2}
-
-var a; (a: AType)
-// Additional rules: {"no-undef":2}
-
-var a: AType<BType>
-// Additional rules: {"no-undef":2}
-
-type A = AType
-// Additional rules: {"no-undef":2}
-
-declare type A = number
-// Additional rules: {"no-undef":2}
-
-opaque type A = AType
-// Additional rules: {"no-undef":2}
-
-function f(a: AType) {}
-// Additional rules: {"no-undef":2}
-
-function f(a: AType.a) {}
-// Additional rules: {"no-undef":2}
-
-function f(a: AType.a.b) {}
-// Additional rules: {"no-undef":2}
-
-function f(a): AType {}; var a: AType
-// Additional rules: {"no-undef":2}
-
-function f(a): AType {}
-// Additional rules: {"no-undef":2}
-
-class C { a: AType }
-// Additional rules: {"no-undef":2}
-
-class C { a: AType.a }
-// Additional rules: {"no-undef":2}
-
-class C { a: AType.a.b }
-// Additional rules: {"no-undef":2}
-
-class C implements AType {}
-// Additional rules: {"no-undef":2}
-
-declare interface A {}
-// Additional rules: {"no-undef":2}
-
-({ a: ({b() {}}: AType) })
-// Additional rules: {"no-undef":2}
-
-type X = {Y<AType>(): BType}
-// Additional rules: {"no-undef":2}
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-
-/**
-* Copyright 2019 no corp
-* @flow
-*/
-type Foo = $ReadOnly<{}>
-// Additional rules: {"no-undef":2}
-
-var a: AType
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-var a: AType; var b: AType
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-var a; (a: AType)
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-var a: AType<BType>
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-type A = AType
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-declare type A = number
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-opaque type A = AType
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-function f(a: AType) {}
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-function f(a: AType.a) {}
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-function f(a: AType.a.b) {}
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-function f(a): AType {}; var a: AType
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-function f(a): AType {}
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-class C { a: AType }
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-class C { a: AType.a }
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-class C { a: AType.a.b }
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-class C implements AType {}
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-declare interface A {}
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-({ a: ({b() {}}: AType) })
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-type X = {Y<AType>(): BType}
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-
-/**
-* Copyright 2019 no corp
-* @flow
-*/
-type Foo = $ReadOnly<{}>
-// Additional rules: {"no-undef":2,"no-use-before-define":[2,"nofunc"]}
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-delimiter-dangle"></a>
-### <code>delimiter-dangle</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces consistent use of trailing commas in Object and Tuple annotations.
-
-This rule takes three arguments where the possible values are the same as ESLint's default `comma-dangle` rule:
-
-1. The first argument is for Object and Tuple annotations. The default value is `'never'`.
-2. The second argument is used for Interface annotations. This defaults to the value of the first argument.
-3. The third argument is used for inexact object notation (trailing `...`). The default value is `'never'`.
-
-If it is `'never'` then a problem is raised when there is a trailing comma.
-
-If it is `'always'` then a problem is raised when there is no trailing comma.
-
-If it is `'always-multiline'` then a problem is raised when there is no trailing comma on a multi-line definition, or there _is_ a trailing comma on a single-line definition.
-
-If it is `'only-multiline'` then a problem is raised when there is a trailing comma on a single-line definition. It allows, but does not enforce, trailing commas on multi-line definitions.
-
-The following patterns are considered problems:
-
-```js
-type X = { foo: string, }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never"]
-type X = { foo: string, }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never"]
-type X = { foo: string; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never"]
-type X = {
-foo: string,
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["always"]
-type X = { foo: string }
-// Message: Missing trailing delimiter
-
-// Options: ["always"]
-type X = {
-foo: string
-}
-// Message: Missing trailing delimiter
-
-// Options: ["always-multiline"]
-type X = { foo: string, }
-// Message: Unexpected trailing delimiter
-
-// Options: ["always-multiline"]
-type X = {
-foo: string
-}
-// Message: Missing trailing delimiter
-
-// Options: ["only-multiline"]
-type X = { foo: string; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["always","never"]
-interface X { foo: string; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never"]
-type X = { [key: string]: number, }
-// Message: Unexpected trailing delimiter
-
-// Options: ["always"]
-type X = { [key: string]: number }
-// Message: Missing trailing delimiter
-
-// Options: ["always-multiline"]
-type X = { [key: string]: number, }
-// Message: Unexpected trailing delimiter
-
-// Options: ["always-multiline"]
-type X = {
-[key: string]: number
-}
-// Message: Missing trailing delimiter
-
-// Options: ["only-multiline"]
-type X = { [key: string]: number; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never"]
-type X = { [key: string]: number, foo: string, }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never"]
-type X = {
-[key: string]: number,
-foo: string,
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["never"]
-type X = {
-[key: string]: number,
-aReallyLongPropertyNameHere: string,
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["always"]
-type X = { [key: string]: number, foo: string }
-// Message: Missing trailing delimiter
-
-// Options: ["always"]
-type X = {
-[key: string]: number;
-foo: string
-}
-// Message: Missing trailing delimiter
-
-// Options: ["always-multiline"]
-type X = { [key: string]: number, foo: string, }
-// Message: Unexpected trailing delimiter
-
-// Options: ["always-multiline"]
-type X = {
-[key: string]: number,
-foo: string
-}
-// Message: Missing trailing delimiter
-
-// Options: ["only-multiline"]
-type X = { [key: string]: number, foo: string, }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never"]
-type X = { foo: string, [key: string]: number, }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never"]
-type X = {
-foo: string,
-[key: string]: number,
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["never"]
-type X = {
-aReallyLongPropertyNameHere: string,
-[key: string]: number,
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["always"]
-type X = { foo: string, [key: string]: number }
-// Message: Missing trailing delimiter
-
-// Options: ["always"]
-type X = { foo: string; [key: string]: number }
-// Message: Missing trailing delimiter
-
-// Options: ["always-multiline"]
-type X = { foo: string, [key: string]: number; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["always-multiline"]
-type X = {
-foo: string,
-[key: string]: number
-}
-// Message: Missing trailing delimiter
-
-// Options: ["only-multiline"]
-type X = { foo: string, [key: string]: number; }
-// Message: Unexpected trailing delimiter
-
-type X = { ..., }
-// Message: Unexpected trailing delimiter
-
-type X = { ...; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","never"]
-type X = { ..., }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","never"]
-type X = { ...; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","always"]
-type X = { ... }
-// Message: Missing trailing delimiter
-
-// Options: ["never","never","always-multiline"]
-type X = { ..., }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","always-multiline"]
-type X = { ...; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","only-multiline"]
-type X = { ..., }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","only-multiline"]
-type X = { ...; }
-// Message: Unexpected trailing delimiter
-
-type X = {
-...,
-}
-// Message: Unexpected trailing delimiter
-
-type X = {
-...;
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","never"]
-type X = {
-...,
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","never"]
-type X = {
-...;
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","always"]
-type X = {
-...
-}
-// Message: Missing trailing delimiter
-
-// Options: ["never","never","always-multiline"]
-type X = {
-...
-}
-// Message: Missing trailing delimiter
-
-type X = { foo: string, ..., }
-// Message: Unexpected trailing delimiter
-
-type X = { foo: string; ...; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","never"]
-type X = { foo: string, ..., }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","never"]
-type X = { foo: string; ...; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","always"]
-type X = { foo: string, ... }
-// Message: Missing trailing delimiter
-
-// Options: ["never","never","always-multiline"]
-type X = { foo: string, ..., }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","always-multiline"]
-type X = { foo: string; ...; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","only-multiline"]
-type X = { foo: string, ..., }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","only-multiline"]
-type X = { foo: string; ...; }
-// Message: Unexpected trailing delimiter
-
-type X = {
-foo: string,
-...,
-}
-// Message: Unexpected trailing delimiter
-
-type X = {
-foo: string;
-...;
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","never"]
-type X = {
-foo: string,
-...,
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","never"]
-type X = {
-foo: string;
-...;
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","always"]
-type X = {
-foo: string,
-...
-}
-// Message: Missing trailing delimiter
-
-// Options: ["never","never","always-multiline"]
-type X = {
-foo: string,
-...
-}
-// Message: Missing trailing delimiter
-
-type X = { [key: string]: number, ..., }
-// Message: Unexpected trailing delimiter
-
-type X = { [key: string]: number; ...; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","never"]
-type X = { [key: string]: number, ..., }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","never"]
-type X = { [key: string]: number; ...; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","always"]
-type X = { [key: string]: number, ... }
-// Message: Missing trailing delimiter
-
-// Options: ["never","never","always-multiline"]
-type X = { [key: string]: number, ..., }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","always-multiline"]
-type X = { [key: string]: number; ...; }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","only-multiline"]
-type X = { [key: string]: number, ..., }
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","only-multiline"]
-type X = { [key: string]: number; ...; }
-// Message: Unexpected trailing delimiter
-
-type X = {
-[key: string]: number,
-...,
-}
-// Message: Unexpected trailing delimiter
-
-type X = {
-[key: string]: number;
-...;
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","never"]
-type X = {
-[key: string]: number,
-...,
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","never"]
-type X = {
-[key: string]: number;
-...;
-}
-// Message: Unexpected trailing delimiter
-
-// Options: ["never","never","always"]
-type X = {
-[key: string]: number,
-...
-}
-// Message: Missing trailing delimiter
-
-// Options: ["never","never","always-multiline"]
-type X = {
-[key: string]: number,
-...
-}
-// Message: Missing trailing delimiter
-
-type X = [string, number,]
-// Message: Unexpected trailing delimiter
-
-// Options: ["never"]
-type X = [string, number,]
-// Message: Unexpected trailing delimiter
-
-// Options: ["never"]
-type X = [
-string,
-number,
-]
-// Message: Unexpected trailing delimiter
-
-// Options: ["always"]
-type X = [string, number]
-// Message: Missing trailing delimiter
-
-// Options: ["always"]
-type X = [
-string,
-number
-]
-// Message: Missing trailing delimiter
-
-// Options: ["always-multiline"]
-type X = [string, number,]
-// Message: Unexpected trailing delimiter
-
-// Options: ["always-multiline"]
-type X = [
-foo, string
-]
-// Message: Missing trailing delimiter
-
-// Options: ["only-multiline"]
-type X = [ number, string, ]
-// Message: Unexpected trailing delimiter
-```
-
-The following patterns are not considered problems:
-
-```js
-type X = { foo: string }
-
-// Options: ["never"]
-type X = { foo: string }
-
-// Options: ["always"]
-type X = { foo: string, }
-
-// Options: ["always"]
-type X = { foo: string; }
-
-// Options: ["never"]
-type X = {
-foo: string
-}
-
-// Options: ["always"]
-type X = {
-foo: string,
-}
-
-// Options: ["always-multiline"]
-type X = { foo: string }
-
-// Options: ["always-multiline"]
-type X = {
-foo: string,
-}
-
-// Options: ["always-multiline"]
-type X = {
-foo: string;
-}
-
-// Options: ["only-multiline"]
-type X = { foo: string }
-
-// Options: ["only-multiline"]
-type X = {
-foo: string
-}
-
-// Options: ["only-multiline"]
-type X = {
-foo: string,
-}
-
-// Options: ["only-multiline"]
-type X = {
-foo: string;
-}
-
-// Options: ["never","always"]
-interface X { foo: string; }
-
-// Options: ["never"]
-type X = {}
-
-// Options: ["always"]
-type X = {}
-
-// Options: ["always-multiline"]
-type X = {}
-
-// Options: ["only-multiline"]
-type X = {}
-
-// Options: ["never"]
-type X = { [key: string]: number }
-
-// Options: ["always"]
-type X = { [key: string]: number, }
-
-// Options: ["always"]
-type X = { [key: string]: number; }
-
-// Options: ["always-multiline"]
-type X = { [key: string]: number }
-
-// Options: ["always-multiline"]
-type X = {
-[key: string]: number,
-}
-
-// Options: ["only-multiline"]
-type X = {
-[key: string]: number,
-}
-
-// Options: ["only-multiline"]
-type X = {
-[key: string]: number
-}
-
-// Options: ["only-multiline"]
-type X = { [key: string]: number }
-
-// Options: ["never"]
-type X = { [key: string]: number, foo: string }
-
-// Options: ["always"]
-type X = { [key: string]: number, foo: string, }
-
-// Options: ["always"]
-type X = { [key: string]: number; foo: string; }
-
-// Options: ["always-multiline"]
-type X = { [key: string]: number, foo: string }
-
-// Options: ["always-multiline"]
-type X = {
-[key: string]: number,
-foo: string,
-}
-
-// Options: ["only-multiline"]
-type X = {
-[key: string]: number,
-foo: string,
-}
-
-// Options: ["only-multiline"]
-type X = {
-[key: string]: number;
-foo: string
-}
-
-// Options: ["only-multiline"]
-type X = { [key: string]: number, foo: string }
-
-// Options: ["never"]
-type X = { foo: string, [key: string]: number }
-
-// Options: ["always"]
-type X = { foo: string, [key: string]: number, }
-
-// Options: ["always"]
-type X = { foo: string; [key: string]: number; }
-
-// Options: ["always-multiline"]
-type X = { foo: string, [key: string]: number }
-
-// Options: ["always-multiline"]
-type X = {
-foo: string,
-[key: string]: number,
-}
-
-// Options: ["only-multiline"]
-type X = {
-foo: string,
-[key: string]: number,
-}
-
-// Options: ["only-multiline"]
-type X = {
-foo: string;
-[key: string]: number
-}
-
-// Options: ["only-multiline"]
-type X = { foo: string, [key: string]: number }
-
-type X = { ... }
-
-// Options: ["never","never","never"]
-type X = { ... }
-
-// Options: ["never","never","always"]
-type X = { ..., }
-
-// Options: ["never","never","always-multiline"]
-type X = { ... }
-
-// Options: ["never","never","only-multiline"]
-type X = { ... }
-
-type X = {
-...
-}
-
-// Options: ["never","never","never"]
-type X = {
-...
-}
-
-// Options: ["never","never","always"]
-type X = {
-...,
- }
-
-// Options: ["never","never","always"]
-type X = {
-...;
- }
-
-// Options: ["never","never","always-multiline"]
-type X = {
-...,
-}
-
-// Options: ["never","never","always-multiline"]
-type X = {
-...;
-}
-
-// Options: ["never","never","only-multiline"]
-type X = {
-...
-}
-
-// Options: ["never","never","only-multiline"]
-type X = {
-...,
-}
-
-// Options: ["never","never","only-multiline"]
-type X = {
-...;
-}
-
-type X = { foo: string, ... }
-
-// Options: ["never","never","never"]
-type X = { foo: string, ... }
-
-// Options: ["never","never","always"]
-type X = { foo: string, ..., }
-
-// Options: ["never","never","always"]
-type X = { foo: string; ...; }
-
-// Options: ["never","never","always-multiline"]
-type X = { foo: string, ... }
-
-// Options: ["never","never","only-multiline"]
-type X = { foo: string, ... }
-
-type X = {
-foo: string,
-...
-}
-
-// Options: ["never","never","never"]
-type X = {
-foo: string,
-...
-}
-
-// Options: ["never","never","always"]
-type X = {
-foo: string,
-...,
-}
-
-// Options: ["never","never","always"]
-type X = {
-foo: string;
-...;
-}
-
-// Options: ["never","never","always-multiline"]
-type X = {
-foo: string,
-...,
-}
-
-// Options: ["never","never","always-multiline"]
-type X = {
-foo: string;
-...;
-}
-
-// Options: ["never","never","only-multiline"]
-type X = {
-foo: string,
-...
-}
-
-// Options: ["never","never","only-multiline"]
-type X = {
-foo: string,
-...,
-}
-
-// Options: ["never","never","only-multiline"]
-type X = {
-foo: string,
-...;
-}
-
-// Options: ["never","never","never"]
-type X = { [key: string]: number, ... }
-
-// Options: ["never","never","always"]
-type X = { [key: string]: number, ..., }
-
-// Options: ["never","never","always"]
-type X = { [key: string]: number; ...; }
-
-// Options: ["never","never","always-multiline"]
-type X = { [key: string]: number, ... }
-
-// Options: ["never","never","only-multiline"]
-type X = { [key: string]: number, ... }
-
-// Options: ["never","never","never"]
-type X = {
-[key: string]: number,
-...
-}
-
-// Options: ["never","never","always"]
-type X = {
-[key: string]: number,
-...,
-}
-
-// Options: ["never","never","always"]
-type X = {
-[key: string]: number;
-...;
-}
-
-// Options: ["never","never","always-multiline"]
-type X = {
-[key: string]: number,
-...,
-}
-
-// Options: ["never","never","always-multiline"]
-type X = {
-[key: string]: number;
-...;
-}
-
-// Options: ["never","never","only-multiline"]
-type X = {
-[key: string]: number,
-...
-}
-
-// Options: ["never","never","only-multiline"]
-type X = {
-[key: string]: number,
-...,
-}
-
-// Options: ["never","never","only-multiline"]
-type X = {
-[key: string]: number;
-...;
-}
-
-type X = [string, number]
-
-// Options: ["never"]
-type X = [string, number]
-
-// Options: ["never"]
-type X = [
-string,
-number
-]
-
-// Options: ["always"]
-type X = [string, number,]
-
-// Options: ["always"]
-type X = [
-string,
-number,
-]
-
-// Options: ["always-multiline"]
-type X = [ foo, string ]
-
-// Options: ["always-multiline"]
-type X = [
-foo, string,
-]
-
-// Options: ["only-multiline"]
-type X = [ number, string ]
-
-// Options: ["only-multiline"]
-type X = [
-number,
-string
-]
-
-// Options: ["only-multiline"]
-type X = [
-number,
-string,
-]
-
-// Options: ["never"]
-type X = []
-
-// Options: ["always"]
-type X = []
-
-// Options: ["always-multiline"]
-type X = []
-
-// Options: ["only-multiline"]
-type X = []
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-generic-spacing"></a>
-### <code>generic-spacing</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces consistent spacing within generic type annotation parameters.
-
-This rule takes one argument. If it is `'never'` then a problem is raised when there is a space surrounding the generic type parameters. If it is `'always'` then a problem is raised when there is no space surrounding the generic type parameters.
-
-The default value is `'never'`.
-
-The following patterns are considered problems:
-
-```js
-type X = Promise< string>
-// Message: There must be no space at start of "Promise" generic type annotation
-
-// Options: ["never"]
-type X = Promise<  string>
-// Message: There must be no space at start of "Promise" generic type annotation
-
-type X = FooBar<string >
-// Message: There must be no space at end of "FooBar" generic type annotation
-
-type X = Promise< string >
-// Message: There must be no space at start of "Promise" generic type annotation
-// Message: There must be no space at end of "Promise" generic type annotation
-
-type X = Promise< (foo), bar, (((baz))) >
-// Message: There must be no space at start of "Promise" generic type annotation
-// Message: There must be no space at end of "Promise" generic type annotation
-
-// Options: ["always"]
-type X = Promise<string >
-// Message: There must be a space at start of "Promise" generic type annotation
-
-// Options: ["always"]
-type X = FooBar< string>
-// Message: There must be a space at end of "FooBar" generic type annotation
-
-// Options: ["always"]
-type X = Promise<string>
-// Message: There must be a space at start of "Promise" generic type annotation
-// Message: There must be a space at end of "Promise" generic type annotation
-
-// Options: ["always"]
-type X = Promise<(foo), bar, (((baz)))>
-// Message: There must be a space at start of "Promise" generic type annotation
-// Message: There must be a space at end of "Promise" generic type annotation
-
-// Options: ["always"]
-type X = FooBar<  string >
-// Message: There must be one space at start of "FooBar" generic type annotation
-
-// Options: ["always"]
-type X = FooBar< string  >
-// Message: There must be one space at end of "FooBar" generic type annotation
-
-// Options: ["always"]
-type X = Promise<  (foo), bar, (((baz)))  >
-// Message: There must be one space at start of "Promise" generic type annotation
-// Message: There must be one space at end of "Promise" generic type annotation
-```
-
-The following patterns are not considered problems:
-
-```js
-type X = Promise<string>
-
-type X = Promise<(string)>
-
-type X = Promise<(foo), bar, (((baz)))>
-
-type X = Promise<
-  (foo),
-  bar,
-  (((baz))),
->
-
-// Options: ["always"]
-type X = Promise< string >
-
-// Options: ["always"]
-type X = Promise< (string) >
-
-// Options: ["always"]
-type X = Promise< (foo), bar, (((baz))) >
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-newline-after-flow-annotation"></a>
-### <code>newline-after-flow-annotation</code>
-
-This rule requires an empty line after the Flow annotation.
-
-<a name="eslint-plugin-flowtype-rules-newline-after-flow-annotation-options"></a>
-#### Options
-
-The rule has a string option:
-
-* `"always"` (default): Enforces that `@flow` annotations be followed by an empty line, separated by newline (LF)
-* `"always-windows"`: Identical to "always", but will use a CRLF when autofixing
-* `"never"`: Enforces that `@flow` annotations are not followed by empty lines
-
-```js
-{
-  "rules": {
-    "flowtype/newline-after-flow-annotation": [
-      2,
-      "always"
-    ]
-  }
-}
-```
-
-
-The following patterns are considered problems:
-
-```js
-// @flow
-import Foo from './foo';
-// Message: Expected newline after flow annotation
-
-// Options: ["always"]
-// @flow
-import Foo from './foo';
-// Message: Expected newline after flow annotation
-
-// Options: ["always-windows"]
-// @flow
-import Foo from './foo';
-// Message: Expected newline after flow annotation
-
-// Options: ["never"]
-// @flow
-
-
-// Message: Expected no newline after flow annotation
-```
-
-The following patterns are not considered problems:
-
-```js
-// Options: ["always"]
-// @flow
-
-import Foo from './foo';
-
-// Options: ["always-windows"]
-// @flow
-
-import Foo from './foo';
-
-// Options: ["never"]
-// @flow
-import Foo from './foo';
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-no-dupe-keys"></a>
-### <code>no-dupe-keys</code>
-
-Checks for duplicate properties in Object annotations.
-
-This rule mirrors ESLint's [no-dupe-keys](http://eslint.org/docs/rules/no-dupe-keys) rule.
-
-```js
-{
-    "rules": {
-        "flowtype/no-dupe-keys": 2
-    }
-}
-```
-
-The following patterns are considered problems:
-
-```js
-type f = { a: number, b: string, a: number }
-// Message: Duplicate property.
-
-type f = { a: number, b: string, a: string }
-// Message: Duplicate property.
-
-type f = { get(key: "a"): string, get(key: "a"): string }
-// Message: Duplicate property.
-
-type f = { get(key: 1): string, get(key: 1): string }
-// Message: Duplicate property.
-
-type f = { get(key: 1.1): string, get(key: 1.1): string }
-// Message: Duplicate property.
-
-type f = { get(key: true): string, get(key: true): string }
-// Message: Duplicate property.
-
-type f = { get(key: {a: 1}): string, get(key: {a: 1}):string }
-// Message: Duplicate property.
-
-var a = "a"; type f = { get(key: a): string, get(key: a): string }
-// Message: Duplicate property.
-
-var b = 1; type f = { get(key: b): string, get(key: b): string }
-// Message: Duplicate property.
-
-var c = true; type f = { get(key: c): string, get(key: c): string }
-// Message: Duplicate property.
-
-var d = {}; type f = { get(key: d): string, get(key: d): string }
-// Message: Duplicate property.
-
-var e = []; type f = { get(key: e): string, get(key: e): string }
-// Message: Duplicate property.
-
-var e = [1, "a"]; type f = { get(key: e): string, get(key: e): string }
-// Message: Duplicate property.
-
-function fn() {}; type f = { get(key: fn): string, get(key: fn): string }
-// Message: Duplicate property.
-```
-
-The following patterns are not considered problems:
-
-```js
-type FooType = { a: number, b: string, c: number }
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-type FooType = { a: number, b: string, a: number }
-
-type f = { get(key: "a"): string, get(key: "b"): string }
-
-type f = { get(key: 1): string, get(key: 2): string }
-
-type f = { get(key: 1.1): string, get(key: 1.2): string }
-
-type f = { get(key: true): string, get(key: false): string }
-
-type f = { get(key: ["a", 1]): string, get(key: ["a", 2]): string }
-
-type f = { get(key: ["a", ["b", 1]]): string, get(key: ["a", ["b", 2]]): string }
-
-type f = { a: number, b: string, c: number }
-
-type f = { get(key: "a"): string, get(key: "b"): string }
-
-type f = { get(key: "a"): string, get(key: "a", key2: "b"): string }
-
-type f = { get(key: "a"): string, get(key: 1): string }
-
-type f = { get(key: { a: 1 }): string, get(key: { a: 2 }): string}
-
-var a = {}; var b = {}; type f = { get(key: a): string, get(key: b): string }
-
-var a = 1; var b = 1; type f = { get(key: a): string, get(key: b): string }
-
-type a = { b: <C>(config: { ...C, key: string}) => C }
-
-export interface Foo { get foo(): boolean; get bar(): string; }
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-no-existential-type"></a>
-### <code>no-existential-type</code>
-
-Disallows use of the existential type (*). [See more](https://flow.org/en/docs/types/utilities/#toc-existential-type)
-
-```js
-{
-  "rules": {
-    "flowtype/no-existential-type": 2
-  }
-}
-```
-
-
-The following patterns are considered problems:
-
-```js
-type T = *;
-// Message: Unexpected use of existential type (*).
-
-type T = U<*, *>;
-// Message: Unexpected use of existential type (*).
-// Message: Unexpected use of existential type (*).
-
-const f: (*) => null = () => null;
-// Message: Unexpected use of existential type (*).
-```
-
-The following patterns are not considered problems:
-
-```js
-type T = string | null
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-no-flow-fix-me-comments"></a>
-### <code>no-flow-fix-me-comments</code>
-
-Disallows `$FlowFixMe` comment suppressions.
-
-This is especially useful as a warning to ensure instances of `$FlowFixMe` in your codebase get fixed over time.
-
-<a name="eslint-plugin-flowtype-rules-no-flow-fix-me-comments-options-1"></a>
-#### Options
-
-This rule takes an optional RegExp that comments a text RegExp that makes the supression valid.
-
-```js
-{
-    "rules": {
-        "flowtype/no-flow-fix-me-comments": [
-            1,
-            "TODO\s+[0-9]+"
-        ]
-    }
-}
-```
-
-The following patterns are considered problems:
-
-```js
-// $FlowFixMe I am doing something evil here
-const text = 'HELLO';
-// Message: $FlowFixMe is treated as `any` and should be fixed.
-
-// Options: ["TODO [0-9]+"]
-// $FlowFixMe I am doing something evil here
-const text = 'HELLO';
-// Message: $FlowFixMe is treated as `any` and should be fixed. Fix it or match `/TODO [0-9]+/`.
-
-// Options: ["TODO [0-9]+"]
-// $FlowFixMe TODO abc 47 I am doing something evil here
-const text = 'HELLO';
-// Message: $FlowFixMe is treated as `any` and should be fixed. Fix it or match `/TODO [0-9]+/`.
-
-// $$FlowFixMeProps I am doing something evil here
-const text = 'HELLO';
-// Message: $FlowFixMe is treated as `any` and should be fixed.
-
-// Options: ["TODO [0-9]+"]
-// $FlowFixMeProps I am doing something evil here
-const text = 'HELLO';
-// Message: $FlowFixMe is treated as `any` and should be fixed. Fix it or match `/TODO [0-9]+/`.
-```
-
-The following patterns are not considered problems:
-
-```js
-const text = 'HELLO';
-
-// Options: ["TODO [0-9]+"]
-// $FlowFixMe TODO 48
-const text = 'HELLO';
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-no-mixed"></a>
-### <code>no-mixed</code>
-
-Warns against "mixed" type annotations.
-These types are not strict enough and could often be made more specific.
-
-The following patterns are considered problems:
-
-The following patterns are considered problems:
-
-```js
-function foo(thing): mixed {}
-// Message: Unexpected use of mixed type
-
-function foo(thing): Promise<mixed> {}
-// Message: Unexpected use of mixed type
-
-function foo(thing): Promise<Promise<mixed>> {}
-// Message: Unexpected use of mixed type
-```
-
-The following patterns are not considered problems:
-
-```js
-function foo(thing): string {}
-
-function foo(thing): Promise<string> {}
-
-function foo(thing): Promise<Promise<string>> {}
-
-(foo?: string) => {}
-
-(foo: ?string) => {}
-
-(foo: { a: string }) => {}
-
-(foo: { a: ?string }) => {}
-
-(foo: string[]) => {}
-
-type Foo = string
-
-type Foo = { a: string }
-
-type Foo = { (a: string): string }
-
-function foo(thing: string) {}
-
-var foo: string
-
-class Foo { props: string }
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-no-mutable-array"></a>
-### <code>no-mutable-array</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Requires use of [`$ReadOnlyArray`](https://github.com/facebook/flow/blob/v0.46.0/lib/core.js#L185) instead of just `Array` or array [shorthand notation](https://flow.org/en/docs/types/arrays/#toc-array-type-shorthand-syntax). `$ReadOnlyArray` is immutable array collection type and the superclass of Array and tuple types in Flow. Use of `$ReadOnlyArray` instead of `Array` can solve some "problems" in typing with Flow (e.g., [1](https://github.com/facebook/flow/issues/3425), [2](https://github.com/facebook/flow/issues/4251)).
-
-General reasons for using immutable data structures:
-
-* They are simpler to construct, test, and use
-* They help to avoid temporal coupling
-* Their usage is side-effect free (no defensive copies)
-* Identity mutability problem is avoided
-* They always have failure atomicity
-* They are much easier to cache
-
-Note that initialization of a variable with an empty array is considered valid (e.g., `const values: Array<string> = [];`). This behavior resembles the behavior of Flow's [unsealed objects](https://flow.org/en/docs/types/objects/#toc-unsealed-objects), as it is assumed that empty array is intended to be mutated.
-
-The following patterns are considered problems:
-
-```js
-type X = Array<string>
-// Message: Use "$ReadOnlyArray" instead of "Array"
-
-type X = string[]
-// Message: Use "$ReadOnlyArray" instead of array shorthand notation
-
-const values: Array<Array<string>> = [];
-// Message: Use "$ReadOnlyArray" instead of "Array"
-
-let values: Array<Array<string>>;
-// Message: Use "$ReadOnlyArray" instead of "Array"
-// Message: Use "$ReadOnlyArray" instead of "Array"
-```
-
-The following patterns are not considered problems:
-
-```js
-type X = $ReadOnlyArray<string>
-
-const values: Array<$ReadOnlyArray<string>> = [];
-
-const values: $ReadOnlyArray<string>[] = [];
-
-const values: Array<$ReadOnlyArray<string>> = new Array();
-
-const values: Array<$ReadOnlyArray<string>> = Array();
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-no-primitive-constructor-types"></a>
-### <code>no-primitive-constructor-types</code>
-
-Disallows use of primitive constructors as types, such as `Boolean`, `Number` and `String`. [See more](https://flowtype.org/docs/builtins.html).
-
-```js
-{
-    "rules": {
-        "flowtype/no-primitive-constructor-types": 2
-    }
-}
-```
-
-The following patterns are considered problems:
-
-```js
-type x = Number
-// Message: Unexpected use of Number constructor type.
-
-type x = String
-// Message: Unexpected use of String constructor type.
-
-type x = Boolean
-// Message: Unexpected use of Boolean constructor type.
-
-type x = { a: Number }
-// Message: Unexpected use of Number constructor type.
-
-type x = { a: String }
-// Message: Unexpected use of String constructor type.
-
-type x = { a: Boolean }
-// Message: Unexpected use of Boolean constructor type.
-
-(x: Number) => {}
-// Message: Unexpected use of Number constructor type.
-
-(x: String) => {}
-// Message: Unexpected use of String constructor type.
-
-(x: Boolean) => {}
-// Message: Unexpected use of Boolean constructor type.
-```
-
-The following patterns are not considered problems:
-
-```js
-type x = number
-
-type x = string
-
-type x = boolean
-
-type x = { a: number }
-
-type x = { a: string }
-
-type x = { a: boolean }
-
-(x: number) => {}
-
-(x: string) => {}
-
-(x: boolean) => {}
-
-type x = MyNumber
-
-type x = MyString
-
-type x = MyBoolean
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-no-types-missing-file-annotation"></a>
-### <code>no-types-missing-file-annotation</code>
-
-Disallows Flow type imports, aliases, and annotations in files missing a valid Flow file declaration (or a @noflow annotation).
-
-```js
-{
-    "rules": {
-        "flowtype/no-types-missing-file-annotation": 2
-    }
-}
-```
-
-The following patterns are considered problems:
-
-```js
-const x: number = 42;
-// Message: Type annotations require valid Flow declaration.
-
-type FooType = number;
-// Message: Type aliases require valid Flow declaration.
-
-import type A from "a"
-// Message: Type imports require valid Flow declaration.
-
-import type {A} from "a"
-// Message: Type imports require valid Flow declaration.
-
-import {type A} from "a"
-// Message: Type imports require valid Flow declaration.
-
-export type {A} from "a"
-// Message: Type exports require valid Flow declaration.
-
-function t<T>(): T{}
-// Message: Type annotations require valid Flow declaration.
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-const x: number = 42;
-// Message: Type annotations require valid Flow declaration.
-```
-
-The following patterns are not considered problems:
-
-```js
-// @flow
-const x: number = 42;
-
-/* @flow weak */
-type FooType = number;
-
-/* @noflow */
-type FooType = number;
-
-/* @noflow */
-import type A from "a"
-
-/* @noflow */
-import {type A} from "a"
-
-/* @noflow */
-export type {A} from "a"
-
-// an unrelated comment
-// @flow
-export type {A} from "a"
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-no-unused-expressions"></a>
-### <code>no-unused-expressions</code>
-
-An extension of [ESLint's `no-unused-expressions`](https://eslint.org/docs/rules/no-unused-expressions).
-This rule ignores type cast expressions, but otherwise behaves the same as ESLint's
-`no-unused-expressions`.
-
-Bare type casts are useful, for example to assert the exhaustiveness of a `switch`:
-
-```js
-type Action
-  = { type: 'FOO', doFoo: (_: number) => void }
-  | { type: 'BAR', doBar: (_: string) => void };
-
-type State = { foo: number, bar: string };
-
-function runFooBar(action: Action, state: State): void {
-  switch (action.type) {
-    case 'FOO':
-      doFoo(state.foo);
-      break;
-    case 'BAR':
-      doBar(state.bar);
-      break;
-    default:
-      (action: empty);  // type error when `Action` is extended with new types
-      console.error(`Impossible action: ${action.toString()}`);
-  }
-}
-```
-
-This rule takes the same arguments as ESLint's `no-unused-expressions`. See
-[that rule's documentation](https://eslint.org/docs/rules/no-unused-expressions) for details.
-
-The following patterns are considered problems:
-
-```js
-foo + 1
-// Message: Expected an assignment or function call and instead saw an expression.
-```
-
-The following patterns are not considered problems:
-
-```js
-(foo: number)
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-no-weak-types"></a>
-### <code>no-weak-types</code>
-
-Warns against weak type annotations *any*, *Object* and *Function*.
-These types can cause flow to silently skip over portions of your code,
-which would have otherwise caused type errors.
-
-This rule optionally takes one argument, an object to configure which type warnings to enable. By default, all of the
-warnings are enabled. e.g. to disable the `any` warning (allowing it to exist in your code), while continuing to warn
-about `Object` and `Function`:
-
-```js
-{
-    "rules": {
-        "flowtype/no-weak-types": [2, {
-            "any": false,
-            "Object": true,
-            "Function": true
-        }]
-    }
-}
-
-// or, the following is equivalent as default is true:
-
-{
-    "rules": {
-        "flowtype/no-weak-types": [2, {
-            "any": false
-        }]
-    }
-}
-```
-
-The following patterns are considered problems:
-
-```js
-function foo(thing): any {}
-// Message: Unexpected use of weak type "any"
-
-function foo(thing): Promise<any> {}
-// Message: Unexpected use of weak type "any"
-
-function foo(thing): Promise<Promise<any>> {}
-// Message: Unexpected use of weak type "any"
-
-function foo(thing): Object {}
-// Message: Unexpected use of weak type "Object"
-
-function foo(thing): Promise<Object> {}
-// Message: Unexpected use of weak type "Object"
-
-function foo(thing): Promise<Promise<Object>> {}
-// Message: Unexpected use of weak type "Object"
-
-function foo(thing): Function {}
-// Message: Unexpected use of weak type "Function"
-
-function foo(thing): Promise<Function> {}
-// Message: Unexpected use of weak type "Function"
-
-function foo(thing): Promise<Promise<Function>> {}
-// Message: Unexpected use of weak type "Function"
-
-(foo: any) => {}
-// Message: Unexpected use of weak type "any"
-
-(foo: Function) => {}
-// Message: Unexpected use of weak type "Function"
-
-(foo?: any) => {}
-// Message: Unexpected use of weak type "any"
-
-(foo?: Function) => {}
-// Message: Unexpected use of weak type "Function"
-
-(foo: { a: any }) => {}
-// Message: Unexpected use of weak type "any"
-
-(foo: { a: Object }) => {}
-// Message: Unexpected use of weak type "Object"
-
-(foo: any[]) => {}
-// Message: Unexpected use of weak type "any"
-
-type Foo = any
-// Message: Unexpected use of weak type "any"
-
-type Foo = Function
-// Message: Unexpected use of weak type "Function"
-
-type Foo = { a: any }
-// Message: Unexpected use of weak type "any"
-
-type Foo = { a: Object }
-// Message: Unexpected use of weak type "Object"
-
-type Foo = { (a: Object): string }
-// Message: Unexpected use of weak type "Object"
-
-type Foo = { (a: string): Function }
-// Message: Unexpected use of weak type "Function"
-
-function foo(thing: any) {}
-// Message: Unexpected use of weak type "any"
-
-function foo(thing: Object) {}
-// Message: Unexpected use of weak type "Object"
-
-var foo: Function
-// Message: Unexpected use of weak type "Function"
-
-var foo: Object
-// Message: Unexpected use of weak type "Object"
-
-class Foo { props: any }
-// Message: Unexpected use of weak type "any"
-
-class Foo { props: Object }
-// Message: Unexpected use of weak type "Object"
-
-var foo: any
-// Message: Unexpected use of weak type "any"
-
-// Options: [{"Function":false}]
-type X = any; type Y = Function; type Z = Object
-// Message: Unexpected use of weak type "any"
-// Message: Unexpected use of weak type "Object"
-
-// Options: [{"any":false,"Object":false}]
-type X = any; type Y = Function; type Z = Object
-// Message: Unexpected use of weak type "Function"
-```
-
-The following patterns are not considered problems:
-
-```js
-function foo(thing): string {}
-
-function foo(thing): Promise<string> {}
-
-function foo(thing): Promise<Promise<string>> {}
-
-(foo?: string) => {}
-
-(foo: ?string) => {}
-
-(foo: { a: string }) => {}
-
-(foo: { a: ?string }) => {}
-
-(foo: string[]) => {}
-
-type Foo = string
-
-type Foo = { a: string }
-
-type Foo = { (a: string): string }
-
-function foo(thing: string) {}
-
-var foo: string
-
-class Foo { props: string }
-
-// Options: [{"any":false,"Object":false}]
-type X = any; type Y = Object
-
-// Options: [{"Function":false}]
-type X = Function
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-function foo(thing): Function {}
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-object-type-delimiter"></a>
-### <code>object-type-delimiter</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces consistent separators between properties in Flow object types.
-
-This rule takes one argument.
-
-If it is `'comma'` then a problem is raised when using `;` as a separator.
-
-If it is `'semicolon'` then a problem is raised when using `,` as a separator.
-
-The default value is `'comma'`.
-
-_This rule is ported from `babel/flow-object-type`, however the default option was changed._
-
-The following patterns are considered problems:
-
-```js
-// Options: ["semicolon"]
-type Foo = { a: Foo, b: Bar }
-// Message: Prefer semicolons to commas in object and class types
-
-// Options: ["comma"]
-type Foo = { a: Foo; b: Bar }
-// Message: Prefer commas to semicolons in object and class types
-
-// Options: ["semicolon"]
-type Foo = { [a: string]: Foo, [b: string]: Bar }
-// Message: Prefer semicolons to commas in object and class types
-
-// Options: ["comma"]
-type Foo = { [a: string]: Foo; [b: string]: Bar }
-// Message: Prefer commas to semicolons in object and class types
-
-// Options: ["semicolon"]
-type Foo = { (): Foo, (): Bar }
-// Message: Prefer semicolons to commas in object and class types
-
-// Options: ["comma"]
-type Foo = { (): Foo; (): Bar }
-// Message: Prefer commas to semicolons in object and class types
-
-// Options: ["semicolon"]
-declare class Foo { a: Foo, }
-// Message: Prefer semicolons to commas in object and class types
-
-// Options: ["comma"]
-declare class Foo { a: Foo; }
-// Message: Prefer commas to semicolons in object and class types
-
-// Options: ["semicolon"]
-declare class Foo { [a: string]: Foo, }
-// Message: Prefer semicolons to commas in object and class types
-
-// Options: ["comma"]
-declare class Foo { a: Foo; }
-// Message: Prefer commas to semicolons in object and class types
-
-// Options: ["semicolon"]
-declare class Foo { (): Foo, }
-// Message: Prefer semicolons to commas in object and class types
-
-// Options: ["comma"]
-declare class Foo { (): Foo; }
-// Message: Prefer commas to semicolons in object and class types
-
-// Options: ["semicolon"]
-declare class Foo { static (): Foo, }
-// Message: Prefer semicolons to commas in object and class types
-
-// Options: ["comma"]
-declare class Foo { static (): Foo; }
-// Message: Prefer commas to semicolons in object and class types
-```
-
-The following patterns are not considered problems:
-
-```js
-// Options: ["semicolon"]
-type Foo = { a: Foo; b: Bar }
-
-// Options: ["comma"]
-type Foo = { a: Foo, b: Bar }
-
-// Options: ["semicolon"]
-type Foo = { [a: string]: Foo; [b: string]: Bar }
-
-// Options: ["comma"]
-type Foo = { [a: string]: Foo, [b: string]: Bar }
-
-// Options: ["semicolon"]
-type Foo = { (): Foo; (): Bar }
-
-// Options: ["comma"]
-type Foo = { (): Foo, (): Bar }
-
-type Foo = { a: Foo, b: Bar }
-
-type Foo = { [a: string]: Foo, [b: string]: Bar }
-
-type Foo = { (): Foo, (): Bar }
-
-// Options: ["semicolon"]
-declare class Foo { a: Foo; }
-
-// Options: ["comma"]
-declare class Foo { a: Foo, }
-
-// Options: ["semicolon"]
-declare class Foo { [a: string]: Foo; }
-
-// Options: ["comma"]
-declare class Foo { [a: string]: Foo, }
-
-// Options: ["semicolon"]
-declare class Foo { (): Foo; }
-
-// Options: ["comma"]
-declare class Foo { (): Foo, }
-
-// Options: ["semicolon"]
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-type Foo = { a: Foo, b: Bar }
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-require-compound-type-alias"></a>
-### <code>require-compound-type-alias</code>
-
-Requires to make a type alias for all [union](https://flow.org/en/docs/types/unions/) and [intersection](https://flow.org/en/docs/types/intersections/) types. If these are used in "raw" forms it might be tempting to just copy&paste them around the code. However, this brings sort of a source code pollution and unnecessary changes on several parts when these compound types need to be changed.
-
-<a name="eslint-plugin-flowtype-rules-require-compound-type-alias-options-2"></a>
-#### Options
-
-The rule has a string option:
-
-* `"never"`
-* `"always"`
-
-The default value is `"always"`.
-
-The following patterns are considered problems:
-
-```js
-function foo(bar: "A" | "B") {}
-// Message: All union types must be declared with named type alias.
-
-const foo: "A" | "B" = "A";
-// Message: All union types must be declared with named type alias.
-
-type Foo = { bar: "A" | "B" };
-// Message: All union types must be declared with named type alias.
-
-function foo(bar: { n: number } | { s: string }) {}
-// Message: All union types must be declared with named type alias.
-
-function foo(bar: { n: number } & { s: string }) {}
-// Message: All intersection types must be declared with named type alias.
-
-const foo: { n: number } & { s: string } = { n: 0, s: "" };
-// Message: All intersection types must be declared with named type alias.
-
-type Foo = { bar: { n: number } & { s: string } };
-// Message: All intersection types must be declared with named type alias.
-
-function foo(bar: { n: number } & { s: string }) {}
-// Message: All intersection types must be declared with named type alias.
-```
-
-The following patterns are not considered problems:
-
-```js
-type Foo = "A" | "B";
-
-type Bar = "A" | "B"; function foo(bar: Bar) {}
-
-type Foo = { disjoint: "A", n: number } | { disjoint: "B", s: string };
-
-type Foo = { n: number } & { s: string };
-
-type Bar = { n: number } & { s: string }; function foo(bar: Bar) {}
-
-// Options: ["never"]
-function foo(bar: "A" | "B") {}
-
-// Options: ["never"]
-function foo(bar: { n: number } & { s: string }) {}
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-require-exact-type"></a>
-### <code>require-exact-type</code>
-
-This rule enforces [exact object types](https://flow.org/en/docs/types/objects/#toc-exact-object-types).
-
-<a name="eslint-plugin-flowtype-rules-require-exact-type-options-3"></a>
-#### Options
-
-The rule has one string option:
-
-* `"always"` (default): Report all object type definitions that aren't exact.
-* `"never"`: Report all object type definitions that are exact.
-
-```js
-{
-  "rules": {
-    "flowtype/require-exact-type": [
-      2,
-      "always"
-    ]
-  }
-}
-
-{
-  "rules": {
-    "flowtype/require-exact-type": [
-      2,
-      "never"
-    ]
-  }
-}
-```
-
-The following patterns are considered problems:
-
-```js
-type foo = {};
-// Message: Type identifier 'foo' must be exact.
-
-type foo = { bar: string };
-// Message: Type identifier 'foo' must be exact.
-
-// Options: ["always"]
-type foo = {};
-// Message: Type identifier 'foo' must be exact.
-
-// Options: ["always"]
-type foo = { bar: string };
-// Message: Type identifier 'foo' must be exact.
-
-// Options: ["never"]
-type foo = {| |};
-// Message: Type identifier 'foo' must not be exact.
-
-// Options: ["never"]
-type foo = {| bar: string |};
-// Message: Type identifier 'foo' must not be exact.
-```
-
-The following patterns are not considered problems:
-
-```js
-type foo = {| |};
-
-type foo = {| bar: string |};
-
-type foo = { [key: string]: string };
-
-type foo = number;
-
-// Options: ["always"]
-type foo = {| |};
-
-// Options: ["always"]
-type foo = {| bar: string |};
-
-// Options: ["always"]
-type foo = number;
-
-// Options: ["never"]
-type foo = { };
-
-// Options: ["never"]
-type foo = { bar: string };
-
-// Options: ["never"]
-type foo = number;
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-require-indexer-name"></a>
-### <code>require-indexer-name</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-This rule validates Flow object indexer name.
-
-<a name="eslint-plugin-flowtype-rules-require-indexer-name-options-4"></a>
-#### Options
-
-The rule has a string option:
-
-* `"never"` (default): Never report files that are missing an indexer key name.
-* `"always"`: Always report files that are missing an indexer key name.
-
-```js
-{
-  "rules": {
-    "flowtype/require-indexer-name": [
-      2,
-      "always"
-    ]
-  }
-}
-```
-
-The following patterns are considered problems:
-
-```js
-type foo = { [string]: number };
-// Message: All indexers must be declared with key name.
-```
-
-The following patterns are not considered problems:
-
-```js
-type foo = { [key: string]: number };
-
-// Options: ["never"]
-type foo = { [key: string]: number };
-
-// Options: ["never"]
-type foo = { [string]: number };
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-require-inexact-type"></a>
-### <code>require-inexact-type</code>
-
-This rule enforces explicit inexact object types.
-
-<a name="eslint-plugin-flowtype-rules-require-inexact-type-options-5"></a>
-#### Options
-
-The rule has one string option:
-
-- `"always"` (default): Report all object type definitions that aren't explicit inexact, but ignore exact objects.
-- `"never"`: Report all object type definitions that are explicit inexact.
-
-```js
-{
-  "rules": {
-    "flowtype/require-inexact-type": [
-      2,
-      "always"
-    ]
-  }
-}
-
-{
-  "rules": {
-    "flowtype/require-inexact-type": [
-      2,
-      "never"
-    ]
-  }
-}
-```
-
-The following patterns are considered problems:
-
-```js
-type foo = {};
-// Message: Type must be explicit inexact.
-
-type foo = { bar: string };
-// Message: Type must be explicit inexact.
-
-// Options: ["always"]
-type foo = {};
-// Message: Type must be explicit inexact.
-
-// Options: ["always"]
-type foo = { bar: string };
-// Message: Type must be explicit inexact.
-
-// Options: ["never"]
-type foo = {...};
-// Message: Type must not be explicit inexact.
-
-// Options: ["never"]
-type foo = { bar: string, ... };
-// Message: Type must not be explicit inexact.
-```
-
-The following patterns are not considered problems:
-
-```js
-type foo = { foo: string, ... };
-
-interface Foo { foo: string }
-
-declare class Foo { foo: string }
-
-type foo = {| |};
-
-type foo = {| bar: string |};
-
-type foo = { [key: string]: string, ... };
-
-type foo = number;
-
-// Options: ["always"]
-type foo = {| |};
-
-// Options: ["always"]
-type foo = {...};
-
-// Options: ["always"]
-type foo = { bar: string, ... };
-
-// Options: ["always"]
-type foo = {| bar: string |};
-
-// Options: ["always"]
-type foo = number;
-
-// Options: ["never"]
-type foo = { };
-
-// Options: ["never"]
-type foo = {| |};
-
-// Options: ["never"]
-type foo = { bar: string };
-
-// Options: ["never"]
-type foo = {| bar: string |};
-
-// Options: ["never"]
-type foo = number;
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-require-parameter-type"></a>
-### <code>require-parameter-type</code>
-
-Requires that all function parameters have type annotations.
-
-<a name="eslint-plugin-flowtype-rules-require-parameter-type-options-6"></a>
-#### Options
-
-You can skip all arrow functions by providing the `excludeArrowFunctions` option with `true`.
-
-Alternatively, you can want to exclude only concise arrow functions (e.g. `x => x * 2`). Provide `excludeArrowFunctions` with `expressionsOnly` for this.
-
-```js
-{
-    "rules": {
-        "flowtype/require-parameter-type": [
-            2,
-            {
-              "excludeArrowFunctions": true
-            }
-        ]
-    }
-}
-
-{
-    "rules": {
-        "flowtype/require-parameter-type": [
-            2,
-            {
-              "excludeArrowFunctions": "expressionsOnly"
-            }
-        ]
-    }
-}
-```
-
-You can exclude parameters that match a certain regex by using `excludeParameterMatch`.
-
-```js
-{
-    "rules": {
-        "flowtype/require-parameter-type": [
-            2,
-            {
-              "excludeParameterMatch": "^_"
-            }
-        ]
-    }
-}
-```
-
-This excludes all parameters that start with an underscore (`_`).
-The default pattern is `a^`, which doesn't match anything, i.e., all parameters are checked.
-
-The following patterns are considered problems:
-
-```js
-(foo) => {}
-// Message: Missing "foo" parameter type annotation.
-
-function x(foo) {}
-// Message: Missing "foo" parameter type annotation.
-
-// Options: [{"excludeArrowFunctions":true}]
-function x(foo) {}
-// Message: Missing "foo" parameter type annotation.
-
-(foo = 'FOO') => {}
-// Message: Missing "foo" parameter type annotation.
-
-(...foo) => {}
-// Message: Missing "foo" parameter type annotation.
-
-({foo}) => {}
-// Message: Missing "{foo}" parameter type annotation.
-
-([foo]) => {}
-// Message: Missing "[foo]" parameter type annotation.
-
-({foo = 1} = {}) => {}
-// Message: Missing "{foo = 1}" parameter type annotation.
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-// @flow
-(foo) => {}
-// Message: Missing "foo" parameter type annotation.
-
-// Options: [{"excludeArrowFunctions":"expressionsOnly"}]
-(foo) => {}
-// Message: Missing "foo" parameter type annotation.
-
-// Options: [{"excludeArrowFunctions":"expressionsOnly"}]
-function x(foo) {}
-// Message: Missing "foo" parameter type annotation.
-
-// Options: [{"excludeParameterMatch":"^_"}]
-(_foo: number, bar) => {}
-// Message: Missing "bar" parameter type annotation.
-
-// Options: [{"excludeParameterMatch":"^_"}]
-(_foo, bar) => {}
-// Message: Missing "bar" parameter type annotation.
-```
-
-The following patterns are not considered problems:
-
-```js
-(foo: string) => {}
-
-(foo: string = 'FOO') => {}
-
-(...foo: string) => {}
-
-const f: Foo = (a, b) => 42;
-
-({foo}: {foo: string}) => {}
-
-([foo]: Array) => {}
-
-type fn = (a: string, b: number) => number;
-const f: fn = (a, b) => {}
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-(foo) => {}
-
-// Options: [{"excludeArrowFunctions":true}]
-(foo) => {}
-
-// Options: [{"excludeArrowFunctions":"expressionsOnly"}]
-(foo) => 3
-
-// Options: [{"excludeParameterMatch":"^_"}]
-(_foo, bar: string) => {}
-
-// Options: [{"excludeParameterMatch":"^_"}]
-(_foo: number, bar: string) => {}
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-(foo) => {}
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-require-readonly-react-props"></a>
-### <code>require-readonly-react-props</code>
-
-This rule validates that React props are marked as $ReadOnly. React props are immutable and modifying them could lead to unexpected results. Marking prop shapes as $ReadOnly avoids these issues.
-
-The rule tries its best to work with both class and functional components. For class components, it does a fuzzy check for one of "Component", "PureComponent", "React.Component" and "React.PureComponent". It doesn't actually infer that those identifiers resolve to a proper `React.Component` object.
-
-For example, this will NOT be checked:
-
-```js
-import MyReact from 'react';
-class Foo extends MyReact.Component { }
-```
-
-As a result, you can safely use other classes without getting warnings from this rule:
-
-```js
-class MyClass extends MySuperClass { }
-```
-
-React's functional components are hard to detect statically. The way it's done here is by searching for JSX within a function. When present, a function is considered a React component:
-
-```js
-// this gets checked
-type Props = { };
-function MyComponent(props: Props) {
-    return <p />;
-}
-
-// this doesn't get checked since no JSX is present in a function
-type Options = { };
-function SomeHelper(options: Options) {
-    // ...
-}
-
-// this doesn't get checked since no JSX is present directly in a function
-function helper() { return <p /> }
-function MyComponent(props: Props) {
-    return helper();
-}
-```
-
-The rule only works for locally defined props that are marked with a `$ReadOnly` or using covariant notation. It doesn't work with imported props:
-
-```js
-// the rule has no way of knowing whether ImportedProps are read-only
-import { type ImportedProps } from './somewhere';
-class Foo extends React.Component<ImportedProps> { }
-
-
-// the rule also checks for covariant properties
-type Props = {|
-    +foo: string
-|};
-class Bar extends React.Component<Props> { }
-
-// this fails because the object is not fully read-only
-type Props = {|
-    +foo: string,
-    bar: number,
-|};
-class Bar extends React.Component<Props> { }
-
-// this fails because spreading makes object mutable (as of Flow 0.98)
-// https://github.com/gajus/eslint-plugin-flowtype/pull/400#issuecomment-489813899
-type Props = {|
-    +foo: string,
-    ...bar,
-|};
-class Bar extends React.Component<Props> { }
-```
-
-
-```js
-{
-    "rules": {
-        "flowtype/require-readonly-react-props": 2
-    }
-}
-```
-
-
-The following patterns are considered problems:
-
-```js
-type Props = { }; class Foo extends React.Component<Props> { }
-// Message: Props must be $ReadOnly
-
-type OtherProps = { foo: string }; class Foo extends React.Component<OtherProps> { }
-// Message: OtherProps must be $ReadOnly
-
-class Foo extends React.Component<{}> { }
-// Message: Foo class props must be $ReadOnly
-
-type Props = { bar: {} }; class Foo extends React.Component<Props, State> { }
-// Message: Props must be $ReadOnly
-
-type Props = { }; class Foo extends Component<Props> { }
-// Message: Props must be $ReadOnly
-
-type Props = { }; class Foo extends PureComponent<Props> { }
-// Message: Props must be $ReadOnly
-
-export type Props = {}; class Foo extends Component<Props> { }
-// Message: Props must be $ReadOnly
-
-type Props = {| foo: string |}; class Foo extends Component<Props> { }
-// Message: Props must be $ReadOnly
-
-type Props = {| +foo: string, ...bar |}; class Foo extends Component<Props> { }
-// Message: Props must be $ReadOnly
-
-type Props = {| +foo: string, -bar: number |}; class Foo extends Component<Props> { }
-// Message: Props must be $ReadOnly
-
-type Props = { }; function Foo(props: Props) { return <p /> }
-// Message: Props must be $ReadOnly
-
-type Props = { }; function Foo(props: Props) { return foo ? <p /> : <span /> }
-// Message: Props must be $ReadOnly
-
-function Foo(props: {}) { return <p /> }
-// Message: Foo component props must be $ReadOnly
-
-export type Props = {}; function Foo(props: Props) { return <p /> }
-// Message: Props must be $ReadOnly
-```
-
-The following patterns are not considered problems:
-
-```js
-class Foo extends React.Component<$ReadOnly<{}>> { }
-
-type Props = $ReadOnly<{}>; class Foo extends React.Component<Props> { }
-
-type Props = $ReadOnly<{}>; class Foo extends React.PureComponent<Props> { }
-
-class Foo extends React.Component<$ReadOnly<{}, State>> { }
-
-type Props = $ReadOnly<{}>; class Foo extends React.Component<Props, State> { }
-
-type Props = $ReadOnly<{}>; class Foo extends Component<Props> { }
-
-type Props = $ReadOnly<{}>; class Foo extends PureComponent<Props> { }
-
-type FooType = {}; class Foo extends Bar<FooType> { }
-
-class Foo { }
-
-export type Props = $ReadOnly<{}>; class Foo extends Component<Props, State> { }
-
-export type Props = $ReadOnly<{}>; export class Foo extends Component<Props> { }
-
-type Props = {| +foo: string |}; class Foo extends Component<Props> { }
-
-type Props = {| +foo: string, +bar: number |}; class Foo extends Component<Props> { }
-
-type Props = $FlowFixMe; class Foo extends Component<Props> { }
-
-type Props = {||}; class Foo extends Component<Props> { }
-
-class Foo extends Component<{||}> { }
-
-class Foo extends React.Component<UnknownProps> { }
-
-import { type Props } from "file"; class Foo extends React.Component<Props> { }
-
-type Props = {}; function Foo() { }
-
-type Props = $ReadOnly<{}>; function Foo(props: Props) { }
-
-type Props = {}; function Foo(props: OtherProps) { }
-
-function Foo() { return <p /> }
-
-function Foo(props: $FlowFixMe) { return <p /> }
-
-function Foo(props: {||}) { return <p /> }
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-require-return-type"></a>
-### <code>require-return-type</code>
-
-Requires that functions have return type annotation.
-
-<a name="eslint-plugin-flowtype-rules-require-return-type-options-7"></a>
-#### Options
-
-You can skip all arrow functions by providing the `excludeArrowFunctions` option with `true`.
-
-Alternatively, you can exclude a concise arrow function (e.g. `() => 2`). Provide `excludeArrowFunctions` with `expressionsOnly` for this.
-
-```js
-{
-    "rules": {
-        "flowtype/require-return-type": [
-            2,
-            "always",
-            {
-              "excludeArrowFunctions": true
-            }
-        ]
-    }
-}
-
-{
-    "rules": {
-        "flowtype/require-return-type": [
-            2,
-            "always",
-            {
-              "excludeArrowFunctions": "expressionsOnly"
-            }
-        ]
-    }
-}
-```
-
-You can exclude or include specific tests with the `includeOnlyMatching` and `excludeMatching` rules.
-
-```js
-{
-    "rules": {
-        "flowtype/require-return-type": [
-            2,
-            "always",
-            {
-              "includeOnlyMatching": [
-                  "^F.*",
-                  "Ba(r|z)"
-              ]
-            }
-        ]
-    }
-}
-
-{
-    "rules": {
-        "flowtype/require-return-type": [
-            2,
-            "always",
-            {
-              "excludeMatching": [
-                  "^F.*",
-                  "Ba(r|z)"
-              ]
-            }
-        ]
-    }
-}
-
-```
-
-Both rules take an array that can contain either strings or valid RegExp statements.
-
-The following patterns are considered problems:
-
-```js
-(foo) => { return "foo"; }
-// Message: Missing return type annotation.
-
-// Options: ["always"]
-(foo) => { return "foo"; }
-// Message: Missing return type annotation.
-
-// Options: ["always"]
-(foo) => "foo"
-// Message: Missing return type annotation.
-
-(foo) => ({})
-// Message: Missing return type annotation.
-
-(foo): undefined => { return; }
-// Message: Must not annotate undefined return type.
-
-(foo): void => { return; }
-// Message: Must not annotate undefined return type.
-
-(foo): undefined => { return undefined; }
-// Message: Must not annotate undefined return type.
-
-(foo): void => { return void 0; }
-// Message: Must not annotate undefined return type.
-
-// Options: ["always",{"annotateUndefined":"never"}]
-(foo): undefined => { return; }
-// Message: Must not annotate undefined return type.
-
-// Options: ["always",{"annotateUndefined":"never"}]
-(foo): void => { return; }
-// Message: Must not annotate undefined return type.
-
-// Options: ["always",{"annotateUndefined":"always"}]
-(foo) => { return; }
-// Message: Must annotate undefined return type.
-
-// Options: ["always",{"annotateUndefined":"never"}]
-(foo): undefined => { return undefined; }
-// Message: Must not annotate undefined return type.
-
-// Options: ["always",{"annotateUndefined":"always"}]
-(foo) => { return undefined; }
-// Message: Must annotate undefined return type.
-
-// Options: ["always",{"annotateUndefined":"always"}]
-(foo) => { return void 0; }
-// Message: Must annotate undefined return type.
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-// @flow
-(foo) => { return 1; }
-// Message: Missing return type annotation.
-
-// Options: ["always",{"annotateUndefined":"always"}]
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-// @flow
- (foo) => { return undefined; }
-// Message: Must annotate undefined return type.
-
-// Options: ["always"]
-async () => { return 2; }
-// Message: Missing return type annotation.
-
-// Options: ["always",{"annotateUndefined":"always"}]
-async () => {}
-// Message: Must annotate undefined return type.
-
-// Options: ["always",{"annotateUndefined":"always"}]
-async function x() {}
-// Message: Must annotate undefined return type.
-
-// Options: ["always",{"annotateUndefined":"never"}]
-async (): Promise<void> => { return; }
-// Message: Must not annotate undefined return type.
-
-// Options: ["always",{"annotateUndefined":"never"}]
-async (): Promise<undefined> => { return; }
-// Message: Must not annotate undefined return type.
-
-// Options: ["always",{"annotateUndefined":"always"}]
-class Test { constructor() { } }
-// Message: Must annotate undefined return type.
-
-class Test { foo() { return 42; } }
-// Message: Missing return type annotation.
-
-class Test { foo = () => { return 42; } }
-// Message: Missing return type annotation.
-
-class Test { foo = () => 42; }
-// Message: Missing return type annotation.
-
-// Options: ["always"]
-function* x() {}
-// Message: Missing return type annotation.
-
-// Options: ["always",{"excludeArrowFunctions":"expressionsOnly"}]
-() => { return 3; }
-// Message: Missing return type annotation.
-
-// Options: ["always",{"excludeArrowFunctions":"expressionsOnly"}]
-async () => { return 4; }
-// Message: Missing return type annotation.
-
-// Options: ["always",{"includeOnlyMatching":["bar"]}]
-function foo() { return 42; }
-function bar() { return 42; }
-// Message: Missing return type annotation.
-
-// Options: ["always",{"includeOnlyMatching":["bar"]}]
-const foo = () => { return 42; };
-const bar = () => { return 42; }
-// Message: Missing return type annotation.
-
-// Options: ["always",{"includeOnlyMatching":["bar"]}]
-const foo = { bar() { return 42; }, foobar: function() { return 42; } }
-// Message: Missing return type annotation.
-// Message: Missing return type annotation.
-
-// Options: ["always",{"excludeMatching":["bar"]}]
-const foo = { bar() { return 42; }, baz() { return 42; } }
-// Message: Missing return type annotation.
-
-// Options: ["always",{"annotateUndefined":"always"}]
-function * foo() { yield 2; }
-// Message: Missing return type annotation.
-
-// Options: ["always",{"annotateUndefined":"always"}]
-async function * foo() { yield 2; }
-// Message: Missing return type annotation.
-```
-
-The following patterns are not considered problems:
-
-```js
-return;
-
-(foo): string => {}
-
-const f: Foo = (a, b) => 42;
-
-// Options: ["always"]
-(foo): string => {}
-
-type fn = (a: string, b: number) => number;
-const f: fn = (a, b) => { return 42; }
-
-(foo) => { return; }
-
-(foo): Object => ( {} )
-
-(foo) => { return undefined; }
-
-(foo) => { return void 0; }
-
-// Options: ["always",{"annotateUndefined":"always"}]
-(foo): undefined => { return; }
-
-// Options: ["always",{"annotateUndefined":"always"}]
-(foo): void => { return; }
-
-// Options: ["always",{"annotateUndefined":"never"}]
-(foo) => { return; }
-
-// Options: ["always",{"annotateUndefined":"never"}]
-(foo) => { return undefined; }
-
-// Options: ["always",{"annotateUndefined":"never"}]
-(foo) => { return void 0; }
-
-// Options: ["always",{"annotateUndefined":"always"}]
-(foo): undefined => { return undefined; }
-
-// Options: ["always",{"annotateUndefined":"always"}]
-(foo): void => { return void 0; }
-
-// Options: ["always"]
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-(foo) => { return 1; }
-
-// Options: ["always",{"annotateUndefined":"always"}]
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-(foo) => { return undefined; }
-
-// Options: ["always",{"annotateUndefined":"always"}]
-async function doThing(): Promise<void> {}
-
-// Options: ["always",{"annotateUndefined":"ignore"}]
-async function doThing(): Promise<void> {}
-
-// Options: ["always",{"annotateUndefined":"ignore"}]
-async function doThing() {}
-
-// Options: ["always",{"annotateUndefined":"always"}]
-function* doThing(): Generator<number, void, void> { yield 2; }
-
-// Options: ["always",{"annotateUndefined":"always","excludeMatching":["constructor"]}]
-class Test { constructor() { } }
-
-class Test { constructor() { } }
-
-// Options: ["always",{"excludeMatching":["foo"]}]
-class Test { foo() { return 42; } }
-
-// Options: ["always",{"excludeMatching":["foo"]}]
-class Test { foo = () => { return 42; } }
-
-// Options: ["always",{"excludeMatching":["foo"]}]
-class Test { foo = () => 42; }
-
-class Test { foo = (): number => { return 42; } }
-
-class Test { foo = (): number => 42; }
-
-async (foo): Promise<number> => { return 3; }
-
-// Options: ["always",{"excludeArrowFunctions":true}]
-() => 3
-
-// Options: ["always",{"excludeArrowFunctions":true}]
-() => { return 4; }
-
-// Options: ["always",{"excludeArrowFunctions":true}]
-() => undefined
-
-// Options: ["always",{"annotateUndefined":"always","excludeArrowFunctions":true}]
-() => undefined
-
-// Options: ["always",{"annotateUndefined":"always","excludeArrowFunctions":true}]
-() => { return undefined; }
-
-// Options: ["always",{"excludeArrowFunctions":"expressionsOnly"}]
-() => 3
-
-// Options: ["always",{"excludeArrowFunctions":"expressionsOnly"}]
-async () => 3
-
-// Options: ["always",{"excludeMatching":["foo"]}]
-function foo() { return 42; }
-
-// Options: ["always",{"includeOnlyMatching":["bar"]}]
-function foo() { return 42; }
-
-// Options: ["always",{"excludeMatching":["bar"]}]
-function foo(): number { return 42; }
-function bar() { return 42; }
-
-// Options: ["always",{"includeOnlyMatching":["foo","baz"]}]
-function foo(): number { return 42; }
-function bar() { return 42; }
-
-// Options: ["always",{"excludeMatching":["^b.*","qux"]}]
-function foo(): number { return 42; }
-function bar() { return 42; }
-
-// Options: ["always",{"includeOnlyMatching":["^f.*"]}]
-function foo(): number { return 42; }
-function bar() { return 42; }
-
-// Options: ["always",{"includeOnlyMatching":["bar"]}]
-const foo = { baz() { return 42; } }
-
-// Options: ["always",{"excludeMatching":["bar"]}]
-const foo = { bar() { return 42; } }
-
-// Options: ["always",{"annotateUndefined":"always"}]
-function * foo(): Iterable<number> { yield 2; }
-
-// Options: ["always",{"annotateUndefined":"always"}]
-async function * foo(): AsyncIterable<number> { yield 2; }
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-require-types-at-top"></a>
-### <code>require-types-at-top</code>
-
-Requires all type declarations to be at the top of the file, after any import declarations.
-
-<a name="eslint-plugin-flowtype-rules-require-types-at-top-options-8"></a>
-#### Options
-
-The rule has a string option:
-
-* `"never"`
-* `"always"`
-
-The default value is `"always"`.
-
-The following patterns are considered problems:
-
-```js
-const foo = 3;
-type Foo = number;
-// Message: All type declaration should be at the top of the file, after any import declarations.
-
-const foo = 3;
-opaque type Foo = number;
-// Message: All type declaration should be at the top of the file, after any import declarations.
-
-const foo = 3;
-export type Foo = number;
-// Message: All type declaration should be at the top of the file, after any import declarations.
-
-const foo = 3;
-export opaque type Foo = number;
-// Message: All type declaration should be at the top of the file, after any import declarations.
-
-const foo = 3;
-type Foo = number | string;
-// Message: All type declaration should be at the top of the file, after any import declarations.
-
-import bar from "./bar";
-const foo = 3;
-type Foo = number;
-// Message: All type declaration should be at the top of the file, after any import declarations.
-```
-
-The following patterns are not considered problems:
-
-```js
-type Foo = number;
-const foo = 3;
-
-opaque type Foo = number;
-const foo = 3;
-
-export type Foo = number;
-const foo = 3;
-
-export opaque type Foo = number;
-const foo = 3;
-
-type Foo = number;
-const foo = 3;
-
-import bar from "./bar";
-type Foo = number;
-
-type Foo = number;
-import bar from "./bar";
-
-// Options: ["never"]
-const foo = 3;
-type Foo = number;
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-require-valid-file-annotation"></a>
-### <code>require-valid-file-annotation</code>
-
-This rule validates Flow file annotations.
-
-This rule can optionally report missing or missed placed annotations, common typos (e.g. `// @floww`), and enforce a consistant annotation style.
-
-<a name="eslint-plugin-flowtype-rules-require-valid-file-annotation-options-9"></a>
-#### Options
-
-The rule has a string option:
-
-* `"never"` (default): Never report files that are missing an `@flow` annotation.
-* `"always"`: Always report files that are missing an `@flow` annotation
-
-This rule has an object option:
-
-* `"annotationStyle"` - Enforce a consistant file annotation style.
-    * `"none"` (default): Either annotation style is accepted.
-    * `"line"`: Require single line annotations (i.e. `// @flow`).
-    * `"block"`: Require block annotations (i.e. `/* @flow */`).
-
-* `"strict"` - Enforce a strict flow file annotation.
-    * `false` (default): strict flow annotation is not required.
-    * `true`: Require strict flow annotation (i.e. `// @flow strict`).
-
-```js
-{
-  "rules": {
-    "flowtype/require-valid-file-annotation": [
-      2,
-      "always"
-    ]
-  }
-}
-
-{
-  "rules": {
-    "flowtype/require-valid-file-annotation": [
-      2,
-      "always", {
-        "annotationStyle": "block",
-        "strict": true,
-      }
-    ]
-  }
-}
-```
-
-The following patterns are considered problems:
-
-```js
-;// @flow
-// Message: Flow file annotation not at the top of the file.
-
-;
-// @flow
-// Message: Flow file annotation not at the top of the file.
-
-// @Flow
-// Message: Malformed Flow file annotation.
-
-// @NoFlow
-// Message: Malformed Flow file annotation.
-
-// @Noflow
-// Message: Malformed Flow file annotation.
-
-// @floweeeeeee
-// Message: Misspelled or malformed Flow file annotation.
-
-// @nofloweeeeeee
-// Message: Misspelled or malformed Flow file annotation.
-
-// Options: ["always"]
-a;
-// Message: Flow file annotation is missing.
-
-// Options: ["always",{"annotationStyle":"line"}]
-/* @flow */
-// Message: Flow file annotation style must be `// @flow`
-
-// Options: ["always",{"annotationStyle":"block"}]
-// @flow
-// Message: Flow file annotation style must be `/* @flow */`
-
-// Options: ["always",{"annotationStyle":"block"}]
-// @flow
-// Message: Flow file annotation style must be `/* @flow */`
-
-// Options: ["always",{"annotationStyle":"line","strict":true}]
-// @flow
-// Message: Strict Flow file annotation is required, should be `// @flow strict`
-
-// Options: ["always",{"annotationStyle":"line"}]
-/* @noflow */
-// Message: Flow file annotation style must be `// @noflow`
-
-// Options: ["always",{"annotationStyle":"block"}]
-// @noflow
-// Message: Flow file annotation style must be `/* @noflow */`
-
-// Options: ["always"]
-a;
-// Message: Flow file annotation is missing.
-
-// Options: ["always",{"annotationStyle":"block"}]
-a;
-// Message: Flow file annotation is missing.
-
-// Options: ["always",{"annotationStyle":"line","strict":true}]
-a;
-// Message: Flow file annotation is missing.
-
-// Options: ["always",{"annotationStyle":"line","strict":true}]
-// @flow
-a;
-b;
-// Message: Strict Flow file annotation is required, should be `// @flow strict`
-```
-
-The following patterns are not considered problems:
-
-```js
-a;
-
-// @flow
-a;
-
-//@flow
-a;
-
-//**@flow
-a;
-
-/* foo @flow bar */
-a;
-
-
-
-// @flow
-a;
-
-// @flow
-// @FLow
-
-// @noflow
-a;
-
-// Options: ["always"]
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-a;
-
-// Options: ["always",{"annotationStyle":"line"}]
-// @flow
-
-// Options: ["always",{"annotationStyle":"line","strict":true}]
-// @noflow
-
-// Options: ["always",{"annotationStyle":"line","strict":true}]
-// @flow strict
-
-// Options: ["never",{"annotationStyle":"none"}]
-// @function
-
-// Options: ["never"]
-// @fixable
-
-// Options: ["always",{"annotationStyle":"block"}]
-/* @flow */
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-require-variable-type"></a>
-### <code>require-variable-type</code>
-
-Requires that all variable declarators have type annotations.
-
-<a name="eslint-plugin-flowtype-rules-require-variable-type-options-10"></a>
-#### Options
-
-You can exclude variables that match a certain regex by using `excludeVariableMatch`.
-
-This excludes all parameters that start with an underscore (`_`).
-The default pattern is `a^`, which doesn't match anything, i.e., all parameters are checked.
-
-```js
-{
-    "rules": {
-        "flowtype/require-variable-type": [
-            2,
-            {
-              "excludeVariableMatch": "^_"
-            }
-        ]
-    }
-}
-```
-
-
-You can choose specific variable types (`var`, `let`, and `const`) to ignore using `excludeVariableTypes`.
-
-This excludes `var` and `let` declarations from needing type annotations, but forces `const` declarations to have it.
-By default, all declarations are checked.
-
-```js
-{
-    "rules": {
-        "flowtype/require-variable-type": [
-            2,
-            {
-              "excludeVariableTypes": {
-                "var": true,
-                "let": true,
-                "const": false,
-              }
-            }
-        ]
-    }
-}
-```
-
-
-
-The following patterns are considered problems:
-
-```js
-var foo = "bar"
-// Message: Missing "foo" variable type annotation.
-
-var foo : string = "bar", bar = 1
-// Message: Missing "bar" variable type annotation.
-
-// Options: [{"excludeVariableMatch":"^_"}]
-var _foo = "bar", bar = 1
-// Message: Missing "bar" variable type annotation.
-
-// Options: [{"excludeVariableTypes":{"let":false,"var":true}}]
-var foo = "bar", bar = 1; const oob : string = "oob"; let hey = "yah"
-// Message: Missing "hey" variable type annotation.
-```
-
-The following patterns are not considered problems:
-
-```js
-var foo : string = "bar"
-
-var foo : string = "bar", bar : number = 1
-
-// Options: [{"excludeVariableMatch":"^_"}]
-var _foo = "bar", bar : number = 1
-
-// Options: [{"excludeVariableTypes":{"var":true}}]
-var foo = "bar", bar = 1
-
-// Options: [{"excludeVariableTypes":{"let":true,"var":true}}]
-var foo = "bar", bar = 1; const oob : string = "oob"; let hey = "yah"
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-semi"></a>
-### <code>semi</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces consistent use of semicolons after type aliases.
-
-This rule takes one argument. If it is `'never'` then a problem is raised when there is a semicolon after a type alias. If it is `'always'` then a problem is raised when there is no semicolon after a type alias.
-
-The default value is `'always'`.
-
-The following patterns are considered problems:
-
-```js
-// Options: []
-type FooType = {}
-// Message: Missing semicolon.
-
-// Options: ["always"]
-type FooType = {}
-// Message: Missing semicolon.
-
-// Options: ["never"]
-type FooType = {};
-// Message: Extra semicolon.
-
-// Options: []
-opaque type FooType = {}
-// Message: Missing semicolon.
-```
-
-The following patterns are not considered problems:
-
-```js
-type FooType = {};
-
-// Options: ["always"]
-type FooType = {};
-
-// Options: ["always"]
-type FooType = { a: number;
- b: string;
- };
-
-// Options: ["never"]
-type FooType = { a: number;
- b: string;
- }
-
-// Options: ["never"]
-type FooType = {}
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-type FooType = {}
-
-opaque type FooType = {};
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-sort-keys"></a>
-### <code>sort-keys</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces sorting of Object annotations.
-
-This rule mirrors ESlint's [sort-keys](http://eslint.org/docs/rules/sort-keys) rule.
-
-<a name="eslint-plugin-flowtype-rules-sort-keys-options-11"></a>
-#### Options
-
-The first option specifies sort order.
-
-* `"asc"` (default) - enforce ascending sort order.
-* `"desc"` - enforce descending sort order.
-
-The second option takes an object with two possible properties.
-
-* `caseSensitive` - if `true`, enforce case-sensitive sort order. Default is `true`.
-* `natural` - if `true`, enforce [natural sort order](https://en.wikipedia.org/wiki/Natural_sort_order). Default is `false`.
-
-```js
-{
-  "rules": {
-    "flowtype/sort-keys": [
-      2,
-      "asc", {
-        "caseSensitive": true,
-        "natural": false
-      }
-    ]
-  }
-}
-```
-
-The following patterns are considered problems:
-
-```js
-type FooType = { a: number, c: number, b: string }
-// Message: Expected type annotations to be in ascending order. "b" should be before "c".
-
-type FooType = { a: number, b: number, C: number }
-// Message: Expected type annotations to be in ascending order. "C" should be before "b".
-
-type FooType = { 1: number, 2: number, 10: number }
-// Message: Expected type annotations to be in ascending order. "10" should be before "2".
-
-// Options: ["desc"]
-type FooType = { a: number, b: number }
-// Message: Expected type annotations to be in descending order. "b" should be before "a".
-
-// Options: ["desc"]
-type FooType = { C: number, b: number, a: string }
-// Message: Expected type annotations to be in descending order. "b" should be before "C".
-
-// Options: ["desc"]
-type FooType = { 10: number, 2: number, 1: number }
-// Message: Expected type annotations to be in descending order. "2" should be before "10".
-
-// Options: ["asc",{"caseSensitive":false}]
-type FooType = { a: number, c: number, C: number, b: string }
-// Message: Expected type annotations to be in insensitive ascending order. "b" should be before "C".
-
-// Options: ["asc",{"caseSensitive":false}]
-type FooType = { a: number, C: number, c: number, b: string }
-// Message: Expected type annotations to be in insensitive ascending order. "b" should be before "c".
-
-// Options: ["asc",{"natural":true}]
-type FooType = { 1: number, 10: number, 2: boolean }
-// Message: Expected type annotations to be in natural ascending order. "2" should be before "10".
-
-type FooType = { a: number, c: number, b: string }
-// Message: Expected type annotations to be in ascending order. "b" should be before "c".
-
-
-        type FooType = {
-          a: number,
-          c: number,
-          b: string,
-        }
-      
-// Message: Expected type annotations to be in ascending order. "b" should be before "c".
-
-
-        type FooType = {
-          +a: number,
-          c: number,
-          b: string,
-        }
-      
-// Message: Expected type annotations to be in ascending order. "b" should be before "c".
-
-
-        type FooType = {
-          -a: number,
-          c: number,
-          b: string,
-        }
-      
-// Message: Expected type annotations to be in ascending order. "b" should be before "c".
-
-
-        type FooType = {
-          a?: number,
-          c: ?number,
-          b: string,
-        }
-      
-// Message: Expected type annotations to be in ascending order. "b" should be before "c".
-
-
-        type FooType = {
-          a: (number) => void,
-          c: number,
-          b: (param: string) => number,
-        }
-      
-// Message: Expected type annotations to be in ascending order. "b" should be before "c".
-
-
-        type FooType = {
-          a: number | string | boolean,
-          c: number,
-          b: (param: string) => number,
-        }
-      
-// Message: Expected type annotations to be in ascending order. "b" should be before "c".
-
-
-        type FooType = {
-          c: number,
-          a: number | string | boolean,
-          b: (param: string) => number,
-        }
-      
-// Message: Expected type annotations to be in ascending order. "a" should be before "c".
-
-
-        type FooType = {
-          c: {
-            z: number,
-            x: string,
-            y: boolean,
-          },
-          a: number | string | boolean,
-          b: (param: string) => number,
-        }
-      
-// Message: Expected type annotations to be in ascending order. "x" should be before "z".
-// Message: Expected type annotations to be in ascending order. "a" should be before "c".
-
-
-        type FooType = {
-          c: {
-            z: {
-              j: string,
-              l: number,
-              k: boolean,
-            },
-            x: string,
-            y: boolean,
-          },
-          a: number | string | boolean,
-          b: (param: string) => number,
-        }
-      
-// Message: Expected type annotations to be in ascending order. "k" should be before "l".
-// Message: Expected type annotations to be in ascending order. "x" should be before "z".
-// Message: Expected type annotations to be in ascending order. "a" should be before "c".
-
-
-        type FooType = {
-          +c: number,
-          -b: number,
-          a: number,
-        }
-      
-// Message: Expected type annotations to be in ascending order. "b" should be before "c".
-// Message: Expected type annotations to be in ascending order. "a" should be before "b".
-
-
-        type FooType = {|
-          +c: number,
-          -b: number,
-          a: number,
-        |}
-      
-// Message: Expected type annotations to be in ascending order. "b" should be before "c".
-// Message: Expected type annotations to be in ascending order. "a" should be before "b".
-```
-
-The following patterns are not considered problems:
-
-```js
-type FooType = { a: number }
-
-type FooType = { a: number, b: number, c: (boolean | number) }
-
-type FooType = { C: number, a: string, b: foo }
-
-type FooType = { 1: number, 10: number, 2: boolean }
-
-// Options: ["desc"]
-type FooType = { c: number, b: number, a: number }
-
-// Options: ["desc"]
-type FooType = { b: string, a: {}, C: number }
-
-// Options: ["desc"]
-type FooType = { 2: number, 10: number, 1: boolean }
-
-// Options: ["asc",{"caseSensitive":false}]
-type FooType = { a: number, b: number, c: number, C: number }
-
-// Options: ["asc",{"caseSensitive":false}]
-type FooType = { a: number, b: number, C: number, c: number }
-
-// Options: ["asc",{"natural":true}]
-type FooType = { 1:number, 2: number, 10: number }
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-type FooType = { b: number, a: number }
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-space-after-type-colon"></a>
-### <code>space-after-type-colon</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces consistent spacing after the type annotation colon.
-
-<a name="eslint-plugin-flowtype-rules-space-after-type-colon-options-12"></a>
-#### Options
-
-This rule has a string argument.
-
-* `"always"` (default): Require a space after the type annotation colon (e.g. foo: BarType).
-* `"never"`: Require no spaces after the type annotation colon (e.g. foo:BarType).
-
-This rule has an option object.
-
-* `"allowLineBreak"` - Allow a line break to count as a space following the annotation colon.
-    * `"true"`: Enable
-    * `"false"`: Disable
-
-{
-  "rules": {
-    "flowtype/space-after-type-colon": [
-      2,
-      "always", {
-        "allowLineBreak": false
-      }
-    ]
-  }
-}
-
-The following patterns are considered problems:
-
-```js
-// Options: ["never"]
-(foo: string) => {}
-// Message: There must be no space after "foo" parameter type annotation colon.
-
-// Options: ["always"]
-(foo:  string) => {}
-// Message: There must be 1 space after "foo" parameter type annotation colon.
-
-// Options: ["always"]
-(foo:(() => void)) => {}
-// Message: There must be a space after "foo" parameter type annotation colon.
-
-// Options: ["never"]
-(foo: (() => void)) => {}
-// Message: There must be no space after "foo" parameter type annotation colon.
-
-// Options: ["always"]
-(foo:  (() => void)) => {}
-// Message: There must be 1 space after "foo" parameter type annotation colon.
-
-({ lorem, ipsum, dolor } :   SomeType) => {}
-// Message: There must be 1 space after "{ lorem, ipsum, dolor }" parameter type annotation colon.
-
-(foo:{ a: string, b: number }) => {}
-// Message: There must be a space after "foo" parameter type annotation colon.
-
-({ a, b } :{ a: string, b: number }) => {}
-// Message: There must be a space after "{ a, b }" parameter type annotation colon.
-
-([ a, b ] :string[]) => {}
-// Message: There must be a space after "[ a, b ]" parameter type annotation colon.
-
-(i?:number) => {}
-// Message: There must be a space after "i" parameter type annotation colon.
-
-(i?:  number) => {}
-// Message: There must be 1 space after "i" parameter type annotation colon.
-
-// Options: ["never"]
-(i?: number) => {}
-// Message: There must be no space after "i" parameter type annotation colon.
-
-(foo:
-  { a: string, b: number }) => {}
-// Message: There must not be a line break after "foo" parameter type annotation colon.
-
-(foo:
-{ a: string, b: number }) => {}
-// Message: There must not be a line break after "foo" parameter type annotation colon.
-
-(foo: 
-{ a: string, b: number }) => {}
-// Message: There must not be a line break after "foo" parameter type annotation colon.
-
-// Options: ["always"]
-():Object => {}
-// Message: There must be a space after return type colon.
-
-// Options: ["never"]
-(): Object => {}
-// Message: There must be no space after return type colon.
-
-// Options: ["always"]
-():  Object => {}
-// Message: There must be 1 space after return type colon.
-
-// Options: ["always"]
-():(() => void) => {}
-// Message: There must be a space after return type colon.
-
-// Options: ["never"]
-(): (() => void) => {}
-// Message: There must be no space after return type colon.
-
-// Options: ["always"]
-():  (() => void) => {}
-// Message: There must be 1 space after return type colon.
-
-// Options: ["never"]
-export default function (foo: string) {}
-// Message: There must be no space after "foo" parameter type annotation colon.
-
-// Options: ["never"]
-function foo (foo: string) {}
-// Message: There must be no space after "foo" parameter type annotation colon.
-
-// Options: ["always"]
-(foo:string) => {}
-// Message: There must be a space after "foo" parameter type annotation colon.
-
-function foo (foo:string) {}
-// Message: There must be a space after "foo" parameter type annotation colon.
-
-async function foo({ lorem, ipsum, dolor }:SomeType) {}
-// Message: There must be a space after "{ lorem, ipsum, dolor }" parameter type annotation colon.
-
-function x(i?:number) {}
-// Message: There must be a space after "i" parameter type annotation colon.
-
-function x(i?:  number) {}
-// Message: There must be 1 space after "i" parameter type annotation colon.
-
-// Options: ["never"]
-function x(i?: number) {}
-// Message: There must be no space after "i" parameter type annotation colon.
-
-function a():x {}
-// Message: There must be a space after return type colon.
-
-// Options: ["always"]
-function a():  x {}
-// Message: There must be 1 space after return type colon.
-
-// Options: ["never"]
-function a(): x {}
-// Message: There must be no space after return type colon.
-
-type X = (foo:number) => string
-// Message: There must be a space after "foo" parameter type annotation colon.
-
-// Options: ["never"]
-type X = (foo: number) => string
-// Message: There must be no space after "foo" parameter type annotation colon.
-
-type X = (foo:  number) => string
-// Message: There must be 1 space after "foo" parameter type annotation colon.
-
-type X = (foo:?number) => string
-// Message: There must be a space after "foo" parameter type annotation colon.
-
-type X = (foo:(number)) => string
-// Message: There must be a space after "foo" parameter type annotation colon.
-
-type X = (foo:((number))) => string
-// Message: There must be a space after "foo" parameter type annotation colon.
-
-type X = (foo:  ((number))) => string
-// Message: There must be 1 space after "foo" parameter type annotation colon.
-
-// Options: ["never"]
-type X = (foo: ((number))) => string
-// Message: There must be no space after "foo" parameter type annotation colon.
-
-type X = (foo:?(number)) => string
-// Message: There must be a space after "foo" parameter type annotation colon.
-
-type TArrayPredicate = (el: T, i?:number) => boolean
-// Message: There must be a space after "i" parameter type annotation colon.
-
-type TArrayPredicate = (el: T, i?:  number) => boolean
-// Message: There must be 1 space after "i" parameter type annotation colon.
-
-// Options: ["never"]
-type TArrayPredicate = (el:T, i?: number) => boolean
-// Message: There must be no space after "i" parameter type annotation colon.
-
-class X { foo:string }
-// Message: There must be a space after "foo" class property type annotation colon.
-
-// Options: ["never"]
-class X { foo: string }
-// Message: There must be no space after "foo" class property type annotation colon.
-
-class X { foo:?string }
-// Message: There must be a space after "foo" class property type annotation colon.
-
-// Options: ["never"]
-class X { foo: ?string }
-// Message: There must be no space after "foo" class property type annotation colon.
-
-class X { static foo:number }
-// Message: There must be a space after "foo" class property type annotation colon.
-
-// Options: ["never"]
-class X { static foo: number }
-// Message: There must be no space after "foo" class property type annotation colon.
-
-class X { static foo :number }
-// Message: There must be a space after "foo" class property type annotation colon.
-
-// Options: ["never"]
-class X { static foo : number }
-// Message: There must be no space after "foo" class property type annotation colon.
-
-declare class X { static foo:number }
-// Message: There must be a space after "foo" type annotation colon.
-
-// Options: ["never"]
-declare class X { static foo: number }
-// Message: There must be no space after "foo" type annotation colon.
-
-declare class X { static foo :number }
-// Message: There must be a space after "foo" type annotation colon.
-
-// Options: ["never"]
-declare class X { static foo : number }
-// Message: There must be no space after "foo" type annotation colon.
-
-class X { +foo:string }
-// Message: There must be a space after "foo" class property type annotation colon.
-
-class X { +foo:  string }
-// Message: There must be 1 space after "foo" class property type annotation colon.
-
-// Options: ["never"]
-class X { +foo: string }
-// Message: There must be no space after "foo" class property type annotation colon.
-
-class X { static +foo:string }
-// Message: There must be a space after "foo" class property type annotation colon.
-
-class X { static +foo:  string }
-// Message: There must be 1 space after "foo" class property type annotation colon.
-
-// Options: ["never"]
-class X { static +foo: string }
-// Message: There must be no space after "foo" class property type annotation colon.
-
-type X = { foo:string }
-// Message: There must be a space after "foo" type annotation colon.
-
-// Options: ["always"]
-type X = { foo:string }
-// Message: There must be a space after "foo" type annotation colon.
-
-// Options: ["never"]
-type X = { foo: string }
-// Message: There must be no space after "foo" type annotation colon.
-
-type X = { foo:  string }
-// Message: There must be 1 space after "foo" type annotation colon.
-
-type X = { foo?:string }
-// Message: There must be a space after "foo" type annotation colon.
-
-// Options: ["never"]
-type X = { foo?: string }
-// Message: There must be no space after "foo" type annotation colon.
-
-type X = { foo?:?string }
-// Message: There must be a space after "foo" type annotation colon.
-
-type X = { foo?:  ?string }
-// Message: There must be 1 space after "foo" type annotation colon.
-
-type Foo = { barType:(string | () => void) }
-// Message: There must be a space after "barType" type annotation colon.
-
-type Foo = { barType:(((string | () => void))) }
-// Message: There must be a space after "barType" type annotation colon.
-
-// Options: ["never"]
-type Foo = { barType: (string | () => void) }
-// Message: There must be no space after "barType" type annotation colon.
-
-type Foo = { barType:  (string | () => void) }
-// Message: There must be 1 space after "barType" type annotation colon.
-
-type Foo = { barType:  ((string | () => void)) }
-// Message: There must be 1 space after "barType" type annotation colon.
-
-type X = { get:() => A; }
-// Message: There must be a space after "get" type annotation colon.
-
-type X = { get:<X>() => A; }
-// Message: There must be a space after "get" type annotation colon.
-
-// Options: ["never"]
-type X = { get: () => A; }
-// Message: There must be no space after "get" type annotation colon.
-
-// Options: ["never"]
-type X = { get: <X>() => A; }
-// Message: There must be no space after "get" type annotation colon.
-
-type X = { get:  () => A; }
-// Message: There must be 1 space after "get" type annotation colon.
-
-type X = { get:  <X>() => A; }
-// Message: There must be 1 space after "get" type annotation colon.
-
-type X = { +foo:string }
-// Message: There must be a space after "foo" type annotation colon.
-
-type X = { +foo:  string }
-// Message: There must be 1 space after "foo" type annotation colon.
-
-// Options: ["never"]
-type X = { +foo: string }
-// Message: There must be no space after "foo" type annotation colon.
-
-type X = { +foo?:string }
-// Message: There must be a space after "foo" type annotation colon.
-
-type X = { +foo?:  string }
-// Message: There must be 1 space after "foo" type annotation colon.
-
-// Options: ["never"]
-type X = { +foo?: string }
-// Message: There must be no space after "foo" type annotation colon.
-
-// Options: ["always"]
-type X = { [a:b]: c }
-// Message: There must be a space after type annotation colon.
-
-// Options: ["never"]
-type X = { [a: b]:c }
-// Message: There must be no space after type annotation colon.
-
-// Options: ["always"]
-type X = { [a:    b]: c }
-// Message: There must be 1 space after type annotation colon.
-
-// Options: ["always"]
-type X = { +[a:b]: c }
-// Message: There must be a space after type annotation colon.
-
-// Options: ["never"]
-type X = { +[a: b]:c }
-// Message: There must be no space after type annotation colon.
-
-// Options: ["always"]
-type X = { +[a:    b]: c }
-// Message: There must be 1 space after type annotation colon.
-
-// Options: ["always"]
-type X = { [a: b]:c }
-// Message: There must be a space after type annotation colon.
-
-// Options: ["never"]
-type X = { [a:b]: c }
-// Message: There must be no space after type annotation colon.
-
-// Options: ["always"]
-type X = { [a: b]:    c }
-// Message: There must be 1 space after type annotation colon.
-
-// Options: ["always"]
-type X = { [a:b]:c }
-// Message: There must be a space after type annotation colon.
-// Message: There must be a space after type annotation colon.
-
-// Options: ["never"]
-type X = { [a: b]: c }
-// Message: There must be no space after type annotation colon.
-// Message: There must be no space after type annotation colon.
-
-// Options: ["always"]
-type X = { [a:  b]:  c }
-// Message: There must be 1 space after type annotation colon.
-// Message: There must be 1 space after type annotation colon.
-
-// Options: ["always"]
-type X = { [a:(b)]:(c) }
-// Message: There must be a space after type annotation colon.
-// Message: There must be a space after type annotation colon.
-
-// Options: ["never"]
-type X = { [a: (b)]: (c) }
-// Message: There must be no space after type annotation colon.
-// Message: There must be no space after type annotation colon.
-
-// Options: ["never"]
-const x = ({}: {})
-// Message: There must be no space after type cast colon.
-
-// Options: ["always"]
-const x = ({}:{})
-// Message: There must be a space after type cast colon.
-
-// Options: ["always"]
-const x = ({}:  {})
-// Message: There must be 1 space after type cast colon.
-
-// Options: ["never"]
-((x): (string))
-// Message: There must be no space after type cast colon.
-
-// Options: ["always"]
-((x):(string))
-// Message: There must be a space after type cast colon.
-
-// Options: ["always"]
-((x):  (string))
-// Message: There must be 1 space after type cast colon.
-
-// Options: ["always"]
-const x:number = 7;
-// Message: There must be a space after const type annotation colon.
-
-// Options: ["always"]
-let x:number = 42;
-// Message: There must be a space after let type annotation colon.
-
-// Options: ["always"]
-var x:number = 42;
-// Message: There must be a space after var type annotation colon.
-```
-
-The following patterns are not considered problems:
-
-```js
-(foo) => {}
-
-(foo: string) => {}
-
-(foo: (string|number)) => {}
-
-// Options: ["never"]
-(foo:string) => {}
-
-// Options: ["always"]
-(foo: string) => {}
-
-// Options: ["never"]
-(foo:(() => void)) => {}
-
-// Options: ["always"]
-(foo: (() => void)) => {}
-
-({ lorem, ipsum, dolor }: SomeType) => {}
-
-(foo: { a: string, b: number }) => {}
-
-({ a, b }: ?{ a: string, b: number }) => {}
-
-([ a, b ]: string[]) => {}
-
-(i?: number) => {}
-
-// Options: ["never"]
-(i?:number) => {}
-
-// Options: ["always",{"allowLineBreak":true}]
-(foo:
-  { a: string, b: number }) => {}
-
-// Options: ["always",{"allowLineBreak":true}]
-(foo:
-  { a: string, b: number }) => {}
-
-// Options: ["never"]
-():Object => {}
-
-// Options: ["always"]
-(): Object => {}
-
-// Options: ["never"]
-():(number | string) => {}
-
-// Options: ["always"]
-(): (number | string) => {}
-
-// Options: ["never"]
-():number|string => {}
-
-// Options: ["always"]
-(): number|string => {}
-
-// Options: ["never"]
-():(() => void) => {}
-
-// Options: ["always"]
-(): (() => void) => {}
-
-// Options: ["never"]
-():( () => void ) => {}
-
-// Options: ["always"]
-(): ( () => void ) => {}
-
-(): { a: number, b: string } => {}
-
-// Options: ["never"]
-() :{ a:number, b:string } => {}
-
-function x(foo: string) {}
-
-class Foo { constructor(foo: string) {} }
-
-// Options: ["never"]
-function x(foo:string) {}
-
-// Options: ["never"]
-class Foo { constructor(foo:string) {} }
-
-async function foo({ lorem, ipsum, dolor }: SomeType) {}
-
-function x({ a, b }: { a: string, b: number }) {}
-
-function x(i?: number) {}
-
-// Options: ["never"]
-function x(i?:number) {}
-
-function a(): x {}
-
-// Options: ["never"]
-function a():x {}
-
-function a(): (number | string) {}
-
-// Options: ["never"]
-function a() :(number | string) {}
-
-type X = (foo: number) => string;
-
-type X = (foo : number) => string;
-
-type X = (foo: ?number) => string;
-
-type X = (foo? : ?number) => string;
-
-type X = (foo: ?{ x: number }) => string;
-
-// Options: ["never"]
-type X = (foo:number) => string;
-
-// Options: ["never"]
-type X = (foo:?{ x:number }) => string;
-
-type X = (foo: (number)) => string
-
-type X = (foo: ((number))) => string
-
-// Options: ["never"]
-type X = (foo:((number))) => string
-
-type X = ?(foo: ((number))) => string
-
-// Options: ["never"]
-type X = ?(foo:((number))) => string
-
-type TArrayPredicate = (el: T, i?: number) => boolean
-
-// Options: ["never"]
-type TArrayPredicate = (el:T, i?:number) => boolean
-
-type X = (number) => string;
-
-type X = (?number) => string;
-
-type X = number => string;
-
-type X = ?number => string;
-
-type X = ({ foo: bar }) => string;
-
-// Options: ["always"]
-type X = (number) => string;
-
-// Options: ["always"]
-type X = (?number) => string;
-
-// Options: ["always"]
-type X = number => string;
-
-// Options: ["always"]
-type X = ?number => string;
-
-// Options: ["always"]
-type X = ({ foo: bar }) => string;
-
-class Foo { bar }
-
-class Foo { bar = 3 }
-
-class Foo { bar: string }
-
-class Foo { bar: ?string }
-
-// Options: ["never"]
-class Foo { bar:string }
-
-// Options: ["never"]
-class Foo { bar:?string }
-
-class X { static foo : number }
-
-// Options: ["never"]
-class X { static foo :number }
-
-declare class X { static foo : number }
-
-// Options: ["never"]
-declare class X { static foo :number }
-
-class X { +foo: string }
-
-class X { static +foo: string }
-
-// Options: ["never"]
-class X { +foo:string }
-
-// Options: ["never"]
-class X { static +foo:string }
-
-type X = { foo: string }
-
-// Options: ["never"]
-type X = { foo:string }
-
-type X = { foo?: string }
-
-type X = { foo?: ?string }
-
-// Options: ["never"]
-type X = { foo?:?string }
-
-type Foo = { barType: (string | () => void) }
-
-type Foo = { barType: ((string | () => void)) }
-
-// Options: ["never"]
-type Foo = { barType:(string | () => void) }
-
-// Options: ["never"]
-type Foo = { barType:((string | () => void)) }
-
-type X = { get(): A; }
-
-type X = { get<X>(): A; }
-
-// Options: ["never"]
-type X = { get(): A; }
-
-// Options: ["never"]
-type X = { get<X>(): A; }
-
-type X = { get: () => A; }
-
-type X = { get: <X>() => A; }
-
-// Options: ["never"]
-type X = { get:() => A; }
-
-// Options: ["never"]
-type X = { get:<X>() => A; }
-
-type X = { +foo: string }
-
-type X = { +foo?: string }
-
-// Options: ["never"]
-type X = { +foo:string }
-
-// Options: ["never"]
-type X = { +foo?:string }
-
-// Options: ["always"]
-type X = { [a: b]: c }
-
-// Options: ["never"]
-type X = { [a:b]:c }
-
-// Options: ["always"]
-type X = { +[a: b]: c }
-
-// Options: ["never"]
-type X = { +[a:b]:c }
-
-// Options: ["always"]
-type X = { [string]: c }
-
-// Options: ["never"]
-type X = { [string]:c }
-
-// Options: ["never"]
-const x = ({}:{})
-
-// Options: ["always"]
-const x = ({}: {})
-
-// Options: ["never"]
-((x):(string))
-
-// Options: ["always"]
-((x): (string))
-
-// Options: ["always"]
-const x: number = 7;
-
-// Options: ["always"]
-let x: number = 42;
-
-// Options: ["always"]
-var x: number = 42;
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-space-before-generic-bracket"></a>
-### <code>space-before-generic-bracket</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces consistent spacing before the opening `<` of generic type annotation parameters.
-
-This rule takes one argument. If it is `'never'` then a problem is raised when there is a space before the `<`. If it is `'always'` then a problem is raised when there is no space before the `<`.
-
-The default value is `'never'`.
-
-The following patterns are considered problems:
-
-```js
-type X = Promise <string>
-// Message: There must be no space before "Promise" generic type annotation bracket
-
-// Options: ["never"]
-type X = Promise <string>
-// Message: There must be no space before "Promise" generic type annotation bracket
-
-type X = Promise  <string>
-// Message: There must be no space before "Promise" generic type annotation bracket
-
-// Options: ["always"]
-type X = Promise<string>
-// Message: There must be a space before "Promise" generic type annotation bracket
-
-// Options: ["always"]
-type X = Promise  <string>
-// Message: There must be one space before "Promise" generic type annotation bracket
-```
-
-The following patterns are not considered problems:
-
-```js
-type X = Promise<string>
-
-// Options: ["always"]
-type X = Promise <string>
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-space-before-type-colon"></a>
-### <code>space-before-type-colon</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces consistent spacing before the type annotation colon.
-
-This rule takes one argument. If it is `'always'` then a problem is raised when there is no space before the type annotation colon. If it is `'never'` then a problem is raised when there is a space before the type annotation colon. The default value is `'never'`.
-
-The following patterns are considered problems:
-
-```js
-// Options: ["never"]
-(foo : string) => {}
-// Message: There must be no space before "foo" parameter type annotation colon.
-
-// Options: ["never"]
-(foo ? : string) => {}
-// Message: There must be no space before "foo" parameter type annotation colon.
-
-// Options: ["always"]
-(foo: string) => {}
-// Message: There must be a space before "foo" parameter type annotation colon.
-
-// Options: ["always"]
-(foo  : string) => {}
-// Message: There must be 1 space before "foo" parameter type annotation colon.
-
-// Options: ["always"]
-(foo?: string) => {}
-// Message: There must be a space before "foo" parameter type annotation colon.
-
-// Options: ["always"]
-(foo ?  : string) => {}
-// Message: There must be 1 space before "foo" parameter type annotation colon.
-
-// Options: ["always"]
-(foo  ?: string) => {}
-// Message: There must be a space before "foo" parameter type annotation colon.
-
-({ lorem, ipsum, dolor } : SomeType) => {}
-// Message: There must be no space before "{ lorem, ipsum, dolor }" parameter type annotation colon.
-
-(foo : { a: string, b: number }) => {}
-// Message: There must be no space before "foo" parameter type annotation colon.
-
-({ a, b } : { a: string, b: number }) => {}
-// Message: There must be no space before "{ a, b }" parameter type annotation colon.
-
-([ a, b ] : string[]) => {}
-// Message: There must be no space before "[ a, b ]" parameter type annotation colon.
-
-() : x => {}
-// Message: There must be no space before return type colon.
-
-// Options: ["always"]
-(): x => {}
-// Message: There must be a space before return type colon.
-
-// Options: ["always"]
-()  : x => {}
-// Message: There must be 1 space before return type colon.
-
-function x(foo : string) {}
-// Message: There must be no space before "foo" parameter type annotation colon.
-
-// Options: ["always"]
-function x(foo: string) {}
-// Message: There must be a space before "foo" parameter type annotation colon.
-
-var x = function (foo : string) {}
-// Message: There must be no space before "foo" parameter type annotation colon.
-
-// Options: ["always"]
-var x = function (foo: string) {}
-// Message: There must be a space before "foo" parameter type annotation colon.
-
-class Foo { constructor(foo : string ) {} }
-// Message: There must be no space before "foo" parameter type annotation colon.
-
-// Options: ["always"]
-class Foo { constructor(foo: string ) {} }
-// Message: There must be a space before "foo" parameter type annotation colon.
-
-async function foo({ lorem, ipsum, dolor } : SomeType) {}
-// Message: There must be no space before "{ lorem, ipsum, dolor }" parameter type annotation colon.
-
-function a() : x {}
-// Message: There must be no space before return type colon.
-
-// Options: ["always"]
-function a(): x {}
-// Message: There must be a space before return type colon.
-
-// Options: ["always"]
-function a()  : x {}
-// Message: There must be 1 space before return type colon.
-
-type X = (foo :string) => string;
-// Message: There must be no space before "foo" parameter type annotation colon.
-
-// Options: ["always"]
-type X = (foo:string) => string;
-// Message: There must be a space before "foo" parameter type annotation colon.
-
-// Options: ["always"]
-type X = (foo  :string) => string;
-// Message: There must be 1 space before "foo" parameter type annotation colon.
-
-type X = (foo? :string) => string;
-// Message: There must be no space before "foo" parameter type annotation colon.
-
-type X = (foo?     :string) => string;
-// Message: There must be no space before "foo" parameter type annotation colon.
-
-// Options: ["always"]
-type X = (foo?:string) => string;
-// Message: There must be a space before "foo" parameter type annotation colon.
-
-type X = (foo? :?string) => string;
-// Message: There must be no space before "foo" parameter type annotation colon.
-
-class X { foo :string }
-// Message: There must be no space before "foo" class property type annotation colon.
-
-// Options: ["always"]
-class X { foo: string }
-// Message: There must be a space before "foo" class property type annotation colon.
-
-class X { foo :?string }
-// Message: There must be no space before "foo" class property type annotation colon.
-
-// Options: ["always"]
-class X { foo: ?string }
-// Message: There must be a space before "foo" class property type annotation colon.
-
-class X { static foo : number }
-// Message: There must be no space before "foo" class property type annotation colon.
-
-class X { static foo :number }
-// Message: There must be no space before "foo" class property type annotation colon.
-
-// Options: ["always"]
-class X { static foo: number }
-// Message: There must be a space before "foo" class property type annotation colon.
-
-// Options: ["always"]
-class X { static foo:number }
-// Message: There must be a space before "foo" class property type annotation colon.
-
-declare class Foo { static bar :number; }
-// Message: There must be no space before "bar" type annotation colon.
-
-declare class Foo { static bar : number; }
-// Message: There must be no space before "bar" type annotation colon.
-
-// Options: ["always"]
-declare class Foo { static bar:number; }
-// Message: There must be a space before "bar" type annotation colon.
-
-// Options: ["always"]
-declare class Foo { static bar: number; }
-// Message: There must be a space before "bar" type annotation colon.
-
-// Options: ["always"]
-class X { +foo: string }
-// Message: There must be a space before "foo" class property type annotation colon.
-
-// Options: ["always"]
-class X { +foo  : string }
-// Message: There must be 1 space before "foo" class property type annotation colon.
-
-// Options: ["never"]
-class X { +foo : string }
-// Message: There must be no space before "foo" class property type annotation colon.
-
-// Options: ["always"]
-class X { static +foo: string }
-// Message: There must be a space before "foo" class property type annotation colon.
-
-// Options: ["always"]
-class X { static +foo  : string }
-// Message: There must be 1 space before "foo" class property type annotation colon.
-
-// Options: ["never"]
-class X { static +foo : string }
-// Message: There must be no space before "foo" class property type annotation colon.
-
-type X = { foo : string }
-// Message: There must be no space before "foo" type annotation colon.
-
-// Options: ["never"]
-type X = { foo : string }
-// Message: There must be no space before "foo" type annotation colon.
-
-// Options: ["always"]
-type X = { foo: string }
-// Message: There must be a space before "foo" type annotation colon.
-
-// Options: ["always"]
-type X = { foo  : string }
-// Message: There must be 1 space before "foo" type annotation colon.
-
-type X = { foo? : string }
-// Message: There must be no space before "foo" type annotation colon.
-
-// Options: ["always"]
-type X = { foo?: string }
-// Message: There must be a space before "foo" type annotation colon.
-
-// Options: ["always"]
-type X = { foo?  : string }
-// Message: There must be 1 space before "foo" type annotation colon.
-
-// Options: ["always"]
-type X = { foo   ?: string }
-// Message: There must be a space before "foo" type annotation colon.
-
-// Options: ["always"]
-type X = { +foo: string }
-// Message: There must be a space before "foo" type annotation colon.
-
-// Options: ["always"]
-type X = { +foo  : string }
-// Message: There must be 1 space before "foo" type annotation colon.
-
-// Options: ["never"]
-type X = { +foo : string }
-// Message: There must be no space before "foo" type annotation colon.
-
-// Options: ["always"]
-type X = { +foo?: string }
-// Message: There must be a space before "foo" type annotation colon.
-
-// Options: ["always"]
-type X = { +foo?  : string }
-// Message: There must be 1 space before "foo" type annotation colon.
-
-// Options: ["never"]
-type X = { +foo? : string }
-// Message: There must be no space before "foo" type annotation colon.
-
-// Options: ["always"]
-type X = { [a: b] : c }
-// Message: There must be a space before type annotation colon.
-
-// Options: ["never"]
-type X = { [a : b]: c }
-// Message: There must be no space before type annotation colon.
-
-// Options: ["always"]
-type X = { [a  : b] : c }
-// Message: There must be 1 space before type annotation colon.
-
-// Options: ["always"]
-type X = { +[a:b] : c }
-// Message: There must be a space before type annotation colon.
-
-// Options: ["never"]
-type X = { +[a : b]: c }
-// Message: There must be no space before type annotation colon.
-
-// Options: ["always"]
-type X = { +[a  : b] : c }
-// Message: There must be 1 space before type annotation colon.
-
-// Options: ["always"]
-type X = { [a : b]: c }
-// Message: There must be a space before type annotation colon.
-
-// Options: ["never"]
-type X = { [a: b] : c }
-// Message: There must be no space before type annotation colon.
-
-// Options: ["always"]
-type X = { [a : b]  : c }
-// Message: There must be 1 space before type annotation colon.
-
-// Options: ["always"]
-type X = { [a:b]:c }
-// Message: There must be a space before type annotation colon.
-// Message: There must be a space before type annotation colon.
-
-// Options: ["never"]
-type X = { [a : b] : c }
-// Message: There must be no space before type annotation colon.
-// Message: There must be no space before type annotation colon.
-
-// Options: ["always"]
-type X = { [a  : b]  : c }
-// Message: There must be 1 space before type annotation colon.
-// Message: There must be 1 space before type annotation colon.
-
-// Options: ["always"]
-type X = { [a:(b)]:(c) }
-// Message: There must be a space before type annotation colon.
-// Message: There must be a space before type annotation colon.
-
-// Options: ["never"]
-type X = { [a : (b)] : (c) }
-// Message: There must be no space before type annotation colon.
-// Message: There must be no space before type annotation colon.
-
-// Options: ["never"]
-const x = ({} :{})
-// Message: There must be no space before type cast colon.
-
-// Options: ["always"]
-const x = ({}:{})
-// Message: There must be a space before type cast colon.
-
-// Options: ["always"]
-const x = ({}  :{})
-// Message: There must be 1 space before type cast colon.
-
-// Options: ["never"]
-((x) : string)
-// Message: There must be no space before type cast colon.
-
-// Options: ["always"]
-((x): string)
-// Message: There must be a space before type cast colon.
-
-// Options: ["always"]
-((x)  : string)
-// Message: There must be 1 space before type cast colon.
-
-// Options: ["always"]
-const x:number = 7;
-// Message: There must be a space before const type annotation colon.
-
-// Options: ["always"]
-let x:number = 42;
-// Message: There must be a space before let type annotation colon.
-
-// Options: ["always"]
-var x:number = 42;
-// Message: There must be a space before var type annotation colon.
-```
-
-The following patterns are not considered problems:
-
-```js
-(foo) => {}
-
-(foo: string) => {}
-
-(foo?: string) => {}
-
-(foo ?: string) => {}
-
-// Options: ["never"]
-(foo: string) => {}
-
-// Options: ["always"]
-(foo : string) => {}
-
-// Options: ["always"]
-(foo? : string) => {}
-
-// Options: ["always"]
-(foo ? : string) => {}
-
-// Options: ["always"]
-(foo  ? : string) => {}
-
-({ lorem, ipsum, dolor }: SomeType) => {}
-
-(foo: { a: string, b: number }) => {}
-
-({ a, b }: ?{ a: string, b: number }) => {}
-
-(): { a: number, b: string } => {}
-
-// Options: ["always"]
-() : { a : number, b : string } => {}
-
-([ a, b ]: string[]) => {}
-
-(): x => {}
-
-// Options: ["always"]
-() : x => {}
-
-(): (number | string) => {}
-
-// Options: ["always"]
-() : (number | string) => {}
-
-function x(foo: string) {}
-
-// Options: ["always"]
-function x(foo : string) {}
-
-var x = function (foo: string) {}
-
-// Options: ["always"]
-var x = function (foo : string) {}
-
-class X { foo({ bar }: Props = this.props) {} }
-
-class Foo { constructor(foo: string ) {} }
-
-// Options: ["always"]
-class Foo { constructor(foo : string ) {} }
-
-async function foo({ lorem, ipsum, dolor }: SomeType) {}
-
-function x({ a, b }: { a: string, b: number }) {}
-
-function a(): x {}
-
-// Options: ["always"]
-function a() : x {}
-
-function a(): (number | string) {}
-
-// Options: ["always"]
-function a() : (number | string) {}
-
-type X = (foo:string) => number;
-
-type X = (foo: string) => number;
-
-type X = (foo: ?string) => number;
-
-type X = (foo?: string) => number;
-
-type X = (foo?: ?string) => number;
-
-type X = (foo   ?: string) => number;
-
-// Options: ["always"]
-type X = (foo? : string) => number
-
-// Options: ["always"]
-type X = (foo? : ?string) => number
-
-type X = (number) => string;
-
-type X = (?number) => string;
-
-type X = number => string;
-
-type X = ?number => string;
-
-type X = ({ foo: bar }) => string;
-
-// Options: ["always"]
-type X = (number) => string;
-
-// Options: ["always"]
-type X = (?number) => string;
-
-// Options: ["always"]
-type X = number => string;
-
-// Options: ["always"]
-type X = ?number => string;
-
-// Options: ["always"]
-type X = ({ foo : bar }) => string;
-
-class Foo { bar }
-
-class Foo { bar = 3 }
-
-class Foo { bar: string }
-
-class Foo { bar: ?string }
-
-class Foo { bar:?string }
-
-// Options: ["always"]
-class Foo { bar : string }
-
-class X { static foo:number }
-
-class X { static foo: number }
-
-// Options: ["always"]
-class X { static foo :number }
-
-// Options: ["always"]
-class X { static foo : number }
-
-declare class Foo { static bar:number; }
-
-// Options: ["always"]
-declare class Foo { static bar :number; }
-
-declare class Foo { static bar: number; }
-
-// Options: ["always"]
-declare class Foo { static bar : number; }
-
-class X { +foo: string }
-
-class X { static +foo: string }
-
-// Options: ["always"]
-class X { +foo : string }
-
-// Options: ["always"]
-class X { static +foo : string }
-
-type X = { foo: string }
-
-// Options: ["always"]
-type X = { foo : string }
-
-type X = { foo?: string }
-
-type X = { foo   ?: string }
-
-// Options: ["always"]
-type X = { foo? : string }
-
-type X = { +foo: string }
-
-type X = { +foo?: string }
-
-// Options: ["always"]
-type X = { +foo : string }
-
-// Options: ["always"]
-type X = { +foo? : string }
-
-// Options: ["always"]
-type X = { [a : b] : c }
-
-// Options: ["never"]
-type X = { [a:b]:c }
-
-// Options: ["always"]
-type X = { [string] : c }
-
-// Options: ["never"]
-type X = { [string]:c }
-
-// Options: ["always"]
-type X = { +[a : b] : c }
-
-// Options: ["never"]
-type X = { +[a:b]:c }
-
-// Options: ["always"]
-type X = { [a : (b)] : (c) }
-
-// Options: ["never"]
-type X = { [a:(b)]:(c) }
-
-// Options: ["never"]
-const x = ({}:{})
-
-// Options: ["always"]
-const x = ({} :{})
-
-// Options: ["never"]
-((x): string)
-
-// Options: ["always"]
-((x) : string)
-
-// Options: ["always"]
-const x :number = 7;
-
-// Options: ["always"]
-let x :number = 42;
-
-// Options: ["always"]
-var x :number = 42;
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-spread-exact-type"></a>
-### <code>spread-exact-type</code>
-
-Enforce object types, that are spread to be exact type explicitly.
-
-The following patterns are considered problems:
-
-```js
-type bar = {...{test: string}}
-// Message: Use $Exact to make type spreading safe.
-
-type foo = {test: number}; type bar = {...foo}
-// Message: Use $Exact to make type spreading safe.
-```
-
-The following patterns are not considered problems:
-
-```js
-type bar = {...$Exact<{test: string}>}
-
-type foo = {test: number}; type bar = {...$Exact<foo>}
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-type-id-match"></a>
-### <code>type-id-match</code>
-
-Enforces a consistent naming pattern for type aliases.
-
-<a name="eslint-plugin-flowtype-rules-type-id-match-options-13"></a>
-#### Options
-
-This rule needs a text RegExp to operate with Its signature is as follows:
-
-```js
-{
-    "rules": {
-        "flowtype/type-id-match": [
-            2,
-            "^([A-Z][a-z0-9]*)+Type$"
-        ]
-    }
-}
-```
-
-`'^([A-Z][a-z0-9]*)+Type$$'` is the default pattern.
-
-The following patterns are considered problems:
-
-```js
-type foo = {};
-// Message: Type identifier 'foo' does not match pattern '/^([A-Z][a-z0-9]*)+Type$/'.
-
-// Options: ["^foo$"]
-type FooType = {};
-// Message: Type identifier 'FooType' does not match pattern '/^foo$/'.
-```
-
-The following patterns are not considered problems:
-
-```js
-type FooType = {};
-
-// Options: ["^foo$"]
-type foo = {};
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-type foo = {};
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-type-import-style"></a>
-### <code>type-import-style</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces a particular style for type imports:
-
-```
-// 'identifier' style
-import {type T, type U, type V} from '...';
-
-// 'declaration' style
-import type {T, U, V} from '...';
-```
-
-<a name="eslint-plugin-flowtype-rules-type-import-style-options-14"></a>
-#### Options
-
-The rule has a string option:
-
-* `"identifier"` (default): Enforces that type imports are all in the
-  'identifier' style.
-* `"declaration"`: Enforces that type imports are all in the 'declaration'
-  style.
-
-This rule has an object option:
-
-* `ignoreTypeDefault` - if `true`, when in "identifier" mode, default type imports will be ignored. Default is `false`.
-
-The following patterns are considered problems:
-
-```js
-import type {A, B} from 'a';
-// Message: Unexpected "import type"
-
-// Options: ["identifier"]
-import type {A, B} from 'a';
-// Message: Unexpected "import type"
-
-// Options: ["identifier"]
-import type {A, B as C} from 'a';
-// Message: Unexpected "import type"
-
-// Options: ["identifier"]
-import type A from 'a';
-// Message: Unexpected "import type"
-
-// Options: ["declaration"]
-import {type A, type B} from 'a';
-// Message: Unexpected type import
-// Message: Unexpected type import
-```
-
-The following patterns are not considered problems:
-
-```js
-import {type A, type B} from 'a';
-
-// Options: ["identifier"]
-import {type A, type B} from 'a';
-
-// Options: ["declaration"]
-import type {A, B} from 'a';
-
-// Options: ["identifier"]
-import typeof * as A from 'a';
-
-// Options: ["identifier",{"ignoreTypeDefault":true}]
-import type A from 'a';
-
-// Options: ["identifier"]
-declare module "m" { import type A from 'a'; }
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-union-intersection-spacing"></a>
-### <code>union-intersection-spacing</code>
-
-_The `--fix` option on the command line automatically fixes problems reported by this rule._
-
-Enforces consistent spacing around union and intersection type separators (`|` and `&`).
-
-This rule takes one argument. If it is `'always'` then a problem is raised when there is no space around the separator. If it is `'never'` then a problem is raised when there is a space around the separator.
-
-The default value is `'always'`.
-
-The following patterns are considered problems:
-
-```js
-type X = string| number;
-// Message: There must be a space before union type annotation separator
-
-// Options: ["always"]
-type X = string| number;
-// Message: There must be a space before union type annotation separator
-
-type X = string |number;
-// Message: There must be a space after union type annotation separator
-
-type X = string|number;
-// Message: There must be a space before union type annotation separator
-// Message: There must be a space after union type annotation separator
-
-type X = {x: string}|{y: number};
-// Message: There must be a space before union type annotation separator
-// Message: There must be a space after union type annotation separator
-
-type X = string | number |boolean;
-// Message: There must be a space after union type annotation separator
-
-type X = string|number|boolean;
-// Message: There must be a space before union type annotation separator
-// Message: There must be a space after union type annotation separator
-// Message: There must be a space before union type annotation separator
-// Message: There must be a space after union type annotation separator
-
-type X = (string)| number;
-// Message: There must be a space before union type annotation separator
-
-type X = ((string))|(number | foo);
-// Message: There must be a space before union type annotation separator
-// Message: There must be a space after union type annotation separator
-
-// Options: ["never"]
-type X = string |number;
-// Message: There must be no space before union type annotation separator
-
-// Options: ["never"]
-type X = string| number;
-// Message: There must be no space after union type annotation separator
-
-type X = string& number;
-// Message: There must be a space before intersection type annotation separator
-
-// Options: ["always"]
-type X = string& number;
-// Message: There must be a space before intersection type annotation separator
-
-type X = string &number;
-// Message: There must be a space after intersection type annotation separator
-
-type X = {x: string}&{y: number};
-// Message: There must be a space before intersection type annotation separator
-// Message: There must be a space after intersection type annotation separator
-
-type X = string&number;
-// Message: There must be a space before intersection type annotation separator
-// Message: There must be a space after intersection type annotation separator
-
-type X = string & number &boolean;
-// Message: There must be a space after intersection type annotation separator
-
-type X = string&number&boolean;
-// Message: There must be a space before intersection type annotation separator
-// Message: There must be a space after intersection type annotation separator
-// Message: There must be a space before intersection type annotation separator
-// Message: There must be a space after intersection type annotation separator
-
-type X = (string)& number;
-// Message: There must be a space before intersection type annotation separator
-
-type X = ((string))&(number & foo);
-// Message: There must be a space before intersection type annotation separator
-// Message: There must be a space after intersection type annotation separator
-
-// Options: ["never"]
-type X = string &number;
-// Message: There must be no space before intersection type annotation separator
-
-// Options: ["never"]
-type X = string& number;
-// Message: There must be no space after intersection type annotation separator
-```
-
-The following patterns are not considered problems:
-
-```js
-type X = string | number;
-
-type X = string | number | boolean;
-
-type X = (string) | number;
-
-type X = ((string)) | (number | foo);
-
-// Options: ["never"]
-type X = string|number
-
-type X =
-| string
-| number
-
-function x() {
-type X =
-| string
-| number
-}
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-type X = string| number;
-
-type X = string & number;
-
-type X = string & number & boolean;
-
-type X = (string) & number;
-
-type X = ((string)) & (number & foo);
-
-// Options: ["never"]
-type X = string&number
-
-type X =
-& string
-& number
-
-function x() {
-type X =
-& string
-& number
-}
-
-// Settings: {"flowtype":{"onlyFilesWithFlowAnnotation":true}}
-type X = string& number;
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-use-flow-type"></a>
-### <code>use-flow-type</code>
-
-Marks Flow [type alias](https://flowtype.org/docs/type-aliases.html) declarations as used.
-
-Used to suppress [`no-unused-vars`](http://eslint.org/docs/rules/no-unused-vars) errors that are triggered by type aliases.
-
-The following patterns are not considered problems:
-
-```js
-declare class A {}
-// Additional rules: {"no-unused-vars":1}
-
-declare function A(): Y
-// Additional rules: {"no-unused-vars":1}
-
-declare module A {}
-// Additional rules: {"no-unused-vars":1}
-
-declare module A { declare var a: Y }
-// Additional rules: {"no-unused-vars":1}
-
-declare var A: Y
-// Additional rules: {"no-unused-vars":1}
-
-import type A from "a"; type X<B = ComponentType<A>> = { b: B }; let x: X; console.log(x);
-// Additional rules: {"no-unused-vars":1}
-
-import type A from "a"; type X<B = A<string>> = { b: B }; let x: X; console.log(x);
-// Additional rules: {"no-unused-vars":1}
-```
-
-
-
-<a name="eslint-plugin-flowtype-rules-valid-syntax"></a>
-### <code>valid-syntax</code>
-
-**Deprecated** Babylon (the Babel parser) v6.10.0 fixes parsing of the invalid syntax this plugin warned against.
-
-Checks for simple Flow syntax errors.
-
-The following patterns are not considered problems:
-
-```js
-function x(foo: string = "1") {}
-
-function x(foo: Type = bar()) {}
-```
-
-
-
diff --git a/node_modules/eslint-plugin-flowtype/dist/bin/addAssertions.js b/node_modules/eslint-plugin-flowtype/dist/bin/addAssertions.js
deleted file mode 100644
index 64de451..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/bin/addAssertions.js
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/usr/bin/env node
-'use strict';
-
-var _path = require('path');
-
-var _path2 = _interopRequireDefault(_path);
-
-var _fs = require('fs');
-
-var _fs2 = _interopRequireDefault(_fs);
-
-var _glob = require('glob');
-
-var _glob2 = _interopRequireDefault(_glob);
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * @file This script is used to inline assertions into the README.md documents.
- */
-
-var formatCodeSnippet = function formatCodeSnippet(setup) {
-  var paragraphs = [];
-
-  if (setup.options) {
-    paragraphs.push('// Options: ' + JSON.stringify(setup.options));
-  }
-
-  if (setup.settings) {
-    paragraphs.push('// Settings: ' + JSON.stringify(setup.settings));
-  }
-
-  paragraphs.push(setup.code);
-
-  if (setup.errors) {
-    setup.errors.forEach(function (message) {
-      paragraphs.push('// Message: ' + message.message);
-    });
-  }
-
-  if (setup.rules) {
-    paragraphs.push('// Additional rules: ' + JSON.stringify(setup.rules));
-  }
-
-  return paragraphs.join('\n');
-};
-
-var getAssertions = function getAssertions() {
-  var assertionFiles = _glob2.default.sync(_path2.default.resolve(__dirname, '../../tests/rules/assertions/*.js'));
-
-  var assertionNames = _lodash2.default.map(assertionFiles, function (filePath) {
-    return _path2.default.basename(filePath, '.js');
-  });
-
-  var assertionCodes = _lodash2.default.map(assertionFiles, function (filePath) {
-    // eslint-disable-next-line global-require, import/no-dynamic-require
-    var codes = require(filePath);
-
-    return {
-      invalid: _lodash2.default.map(codes.invalid, formatCodeSnippet),
-      valid: _lodash2.default.map(codes.valid, formatCodeSnippet)
-    };
-  });
-
-  return _lodash2.default.zipObject(assertionNames, assertionCodes);
-};
-
-var updateDocuments = function updateDocuments(assertions) {
-  var readmeDocumentPath = _path2.default.join(__dirname, '../../README.md');
-  var documentBody = void 0;
-
-  documentBody = _fs2.default.readFileSync(readmeDocumentPath, 'utf8');
-
-  documentBody = documentBody.replace(/<!-- assertions ([a-z]+?) -->/ig, function (assertionsBlock) {
-    var exampleBody = void 0;
-
-    var ruleName = assertionsBlock.match(/assertions ([a-z]+)/i)[1];
-
-    var ruleAssertions = assertions[ruleName];
-
-    if (!ruleAssertions) {
-      throw new Error('No assertions available for rule "' + ruleName + '".');
-    }
-
-    exampleBody = '';
-
-    if (ruleAssertions.invalid.length) {
-      exampleBody += 'The following patterns are considered problems:\n\n```js\n' + ruleAssertions.invalid.join('\n\n') + '\n```\n\n';
-    }
-
-    if (ruleAssertions.valid.length) {
-      exampleBody += 'The following patterns are not considered problems:\n\n```js\n' + ruleAssertions.valid.join('\n\n') + '\n```\n\n';
-    }
-
-    return exampleBody;
-  });
-
-  _fs2.default.writeFileSync(readmeDocumentPath, documentBody);
-};
-
-updateDocuments(getAssertions());
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/bin/checkDocs.js b/node_modules/eslint-plugin-flowtype/dist/bin/checkDocs.js
deleted file mode 100644
index 5278dea..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/bin/checkDocs.js
+++ /dev/null
@@ -1,98 +0,0 @@
-#!/usr/bin/env node
-'use strict';
-
-var _fs = require('fs');
-
-var _fs2 = _interopRequireDefault(_fs);
-
-var _path = require('path');
-
-var _path2 = _interopRequireDefault(_path);
-
-var _utilities = require('./utilities');
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var windows = function windows(array, size) {
-  var output = [];
-
-  for (var ii = 0; ii < array.length - size + 1; ii++) {
-    output.push(array.slice(ii, ii + size));
-  }
-
-  return output;
-};
-
-// @flow
-
-var getDocIndexRules = function getDocIndexRules() {
-  var content = _fs2.default.readFileSync(_path2.default.resolve(__dirname, '../../.README/README.md'), 'utf-8');
-
-  var rules = content.split('\n').map(function (line) {
-    var match = /^{"gitdown": "include", "file": "([^"]+)"}$/.exec(line);
-
-    if (match === null) {
-      return null;
-    } else {
-      return match[1].replace('./rules/', '').replace('.md', '');
-    }
-  }).filter(function (rule) {
-    return rule !== null;
-  });
-
-  if (rules.length === 0) {
-    throw new Error('Docs checker is broken - it could not extract rules from docs index file.');
-  }
-
-  return rules;
-};
-
-var hasCorrectAssertions = function hasCorrectAssertions(docPath, name) {
-  var content = _fs2.default.readFileSync(docPath, 'utf-8');
-
-  var match = /<!-- assertions ([a-zA-Z]+) -->/.exec(content);
-
-  if (match === null) {
-    return false;
-  } else {
-    return match[1] === name;
-  }
-};
-
-/**
- * Performed checks:
- *  - file `/.README/rules/<rule>.md` exists
- *  - file `/.README/rules/<rule>.md` contains correct assertions placeholder (`<!-- assertions ... -->`)
- *  - rule is included in gitdown directive in `/.README/README.md`
- *  - rules in `/.README/README.md` are alphabetically sorted
- */
-var checkDocs = function checkDocs(rulesNames) {
-  var docIndexRules = getDocIndexRules();
-
-  var sorted = windows(docIndexRules, 2).every(function (chunk) {
-    return chunk[0] < chunk[1];
-  });
-
-  if (!sorted) {
-    throw new Error('Rules are not alphabetically sorted in `.README/README.md` file.');
-  }
-
-  var invalid = rulesNames.filter(function (names) {
-    var docPath = _path2.default.resolve(__dirname, '../../.README/rules', names[1] + '.md');
-    var docExists = (0, _utilities.isFile)(docPath);
-    var inIndex = docIndexRules.includes(names[1]);
-    var hasAssertions = docExists ? hasCorrectAssertions(docPath, names[0]) : false;
-
-    return !(docExists && inIndex && hasAssertions);
-  });
-
-  if (invalid.length > 0) {
-    var invalidList = invalid.map(function (names) {
-      return names[0];
-    }).join(', ');
-
-    throw new Error('Docs checker encountered an error in: ' + invalidList + '. ' + 'Make sure that for every rule you created documentation file with assertions placeholder in camelCase ' + 'and included the file path in `.README/README.md` file.');
-  }
-};
-
-checkDocs((0, _utilities.getRules)());
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/bin/checkTests.js b/node_modules/eslint-plugin-flowtype/dist/bin/checkTests.js
deleted file mode 100644
index f9631ce..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/bin/checkTests.js
+++ /dev/null
@@ -1,70 +0,0 @@
-'use strict';
-
-var _fs = require('fs');
-
-var _fs2 = _interopRequireDefault(_fs);
-
-var _path = require('path');
-
-var _path2 = _interopRequireDefault(_path);
-
-var _utilities = require('./utilities');
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var getTestIndexRules = function getTestIndexRules() {
-  var content = _fs2.default.readFileSync(_path2.default.resolve(__dirname, '../../tests/rules/index.js'), 'utf-8');
-
-  var result = content.split('\n').reduce(function (acc, line) {
-    if (acc.inRulesArray) {
-      if (line === '];') {
-        acc.inRulesArray = false;
-      } else {
-        acc.rules.push(line.replace(/^\s*'([^']+)',?$/, '$1'));
-      }
-    } else if (line === 'const reportingRules = [') {
-      acc.inRulesArray = true;
-    }
-
-    return acc;
-  }, {
-    inRulesArray: false,
-    rules: []
-  });
-
-  var rules = result.rules;
-
-  if (rules.length === 0) {
-    throw new Error('Tests checker is broken - it could not extract rules from test index file.');
-  }
-
-  return rules;
-};
-
-/**
- * Performed checks:
- *  - file `/tests/rules/assertions/<rule>.js` exists
- *  - rule is included in `reportingRules` variable in `/tests/rules/index.js`
- */
-// @flow
-
-var checkTests = function checkTests(rulesNames) {
-  var testIndexRules = getTestIndexRules();
-
-  var invalid = rulesNames.filter(function (names) {
-    var testExists = (0, _utilities.isFile)(_path2.default.resolve(__dirname, '../../tests/rules/assertions', names[0] + '.js'));
-    var inIndex = testIndexRules.includes(names[1]);
-
-    return !(testExists && inIndex);
-  });
-
-  if (invalid.length > 0) {
-    var invalidList = invalid.map(function (names) {
-      return names[0];
-    }).join(', ');
-
-    throw new Error('Tests checker encountered an error in: ' + invalidList + '. ' + 'Make sure that for every rule you created test suite and included the rule name in `tests/rules/index.js` file.');
-  }
-};
-
-checkTests((0, _utilities.getRules)());
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/bin/utilities.js b/node_modules/eslint-plugin-flowtype/dist/bin/utilities.js
deleted file mode 100644
index 6639bdb..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/bin/utilities.js
+++ /dev/null
@@ -1,46 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.isFile = exports.getRules = undefined;
-
-var _fs = require('fs');
-
-var _fs2 = _interopRequireDefault(_fs);
-
-var _path = require('path');
-
-var _path2 = _interopRequireDefault(_path);
-
-var _glob = require('glob');
-
-var _glob2 = _interopRequireDefault(_glob);
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-// @flow
-
-var getRules = exports.getRules = function getRules() {
-  var rulesFiles = _glob2.default.sync(_path2.default.resolve(__dirname, '../rules/*.js'));
-
-  var rulesNames = rulesFiles.map(function (file) {
-    return _path2.default.basename(file, '.js');
-  }).map(function (name) {
-    return [name, _lodash2.default.kebabCase(name)];
-  });
-
-  return rulesNames;
-};
-
-var isFile = exports.isFile = function isFile(filepath) {
-  try {
-    return _fs2.default.statSync(filepath).isFile();
-  } catch (error) {
-    return false;
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/configs/recommended.json b/node_modules/eslint-plugin-flowtype/dist/configs/recommended.json
deleted file mode 100644
index 13cc76e..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/configs/recommended.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
-  "parser": "babel-eslint",
-  "plugins": [
-    "flowtype"
-  ],
-  "rules": {
-    "flowtype/boolean-style": [
-      2,
-      "boolean"
-    ],
-    "flowtype/define-flow-type": 1,
-    "flowtype/delimiter-dangle": 0,
-    "flowtype/generic-spacing": [
-      2,
-      "never"
-    ],
-    "flowtype/no-mixed": 0,
-    "flowtype/no-types-missing-file-annotation": 2,
-    "flowtype/no-weak-types": 0,
-    "flowtype/require-parameter-type": 0,
-    "flowtype/require-readonly-react-props": 0,
-    "flowtype/require-return-type": 0,
-    "flowtype/require-valid-file-annotation": 0,
-    "flowtype/semi": 0,
-    "flowtype/space-after-type-colon": [
-      2,
-      "always"
-    ],
-    "flowtype/space-before-generic-bracket": [
-      2,
-      "never"
-    ],
-    "flowtype/space-before-type-colon": [
-      2,
-      "never"
-    ],
-    "flowtype/type-id-match": 0,
-    "flowtype/union-intersection-spacing": [
-      2,
-      "always"
-    ],
-    "flowtype/use-flow-type": 1
-  },
-  "settings": {
-    "flowtype": {
-      "onlyFilesWithFlowAnnotation": false
-    }
-  }
-}
diff --git a/node_modules/eslint-plugin-flowtype/dist/index.js b/node_modules/eslint-plugin-flowtype/dist/index.js
deleted file mode 100644
index 17ca4b7..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/index.js
+++ /dev/null
@@ -1,263 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-var _recommended = require('./configs/recommended.json');
-
-var _recommended2 = _interopRequireDefault(_recommended);
-
-var _arrayStyleComplexType = require('./rules/arrayStyleComplexType');
-
-var _arrayStyleComplexType2 = _interopRequireDefault(_arrayStyleComplexType);
-
-var _arrayStyleSimpleType = require('./rules/arrayStyleSimpleType');
-
-var _arrayStyleSimpleType2 = _interopRequireDefault(_arrayStyleSimpleType);
-
-var _booleanStyle = require('./rules/booleanStyle');
-
-var _booleanStyle2 = _interopRequireDefault(_booleanStyle);
-
-var _defineFlowType = require('./rules/defineFlowType');
-
-var _defineFlowType2 = _interopRequireDefault(_defineFlowType);
-
-var _delimiterDangle = require('./rules/delimiterDangle');
-
-var _delimiterDangle2 = _interopRequireDefault(_delimiterDangle);
-
-var _genericSpacing = require('./rules/genericSpacing');
-
-var _genericSpacing2 = _interopRequireDefault(_genericSpacing);
-
-var _newlineAfterFlowAnnotation = require('./rules/newlineAfterFlowAnnotation');
-
-var _newlineAfterFlowAnnotation2 = _interopRequireDefault(_newlineAfterFlowAnnotation);
-
-var _noDupeKeys = require('./rules/noDupeKeys');
-
-var _noDupeKeys2 = _interopRequireDefault(_noDupeKeys);
-
-var _noExistentialType = require('./rules/noExistentialType');
-
-var _noExistentialType2 = _interopRequireDefault(_noExistentialType);
-
-var _noFlowFixMeComments = require('./rules/noFlowFixMeComments');
-
-var _noFlowFixMeComments2 = _interopRequireDefault(_noFlowFixMeComments);
-
-var _noMutableArray = require('./rules/noMutableArray');
-
-var _noMutableArray2 = _interopRequireDefault(_noMutableArray);
-
-var _noPrimitiveConstructorTypes = require('./rules/noPrimitiveConstructorTypes');
-
-var _noPrimitiveConstructorTypes2 = _interopRequireDefault(_noPrimitiveConstructorTypes);
-
-var _noTypesMissingFileAnnotation = require('./rules/noTypesMissingFileAnnotation');
-
-var _noTypesMissingFileAnnotation2 = _interopRequireDefault(_noTypesMissingFileAnnotation);
-
-var _noUnusedExpressions = require('./rules/noUnusedExpressions');
-
-var _noUnusedExpressions2 = _interopRequireDefault(_noUnusedExpressions);
-
-var _noWeakTypes = require('./rules/noWeakTypes');
-
-var _noWeakTypes2 = _interopRequireDefault(_noWeakTypes);
-
-var _noMixed = require('./rules/noMixed');
-
-var _noMixed2 = _interopRequireDefault(_noMixed);
-
-var _objectTypeDelimiter = require('./rules/objectTypeDelimiter');
-
-var _objectTypeDelimiter2 = _interopRequireDefault(_objectTypeDelimiter);
-
-var _requireIndexerName = require('./rules/requireIndexerName');
-
-var _requireIndexerName2 = _interopRequireDefault(_requireIndexerName);
-
-var _requireCompoundTypeAlias = require('./rules/requireCompoundTypeAlias');
-
-var _requireCompoundTypeAlias2 = _interopRequireDefault(_requireCompoundTypeAlias);
-
-var _requireInexactType = require('./rules/requireInexactType');
-
-var _requireInexactType2 = _interopRequireDefault(_requireInexactType);
-
-var _requireExactType = require('./rules/requireExactType');
-
-var _requireExactType2 = _interopRequireDefault(_requireExactType);
-
-var _requireParameterType = require('./rules/requireParameterType');
-
-var _requireParameterType2 = _interopRequireDefault(_requireParameterType);
-
-var _requireReadonlyReactProps = require('./rules/requireReadonlyReactProps');
-
-var _requireReadonlyReactProps2 = _interopRequireDefault(_requireReadonlyReactProps);
-
-var _requireReturnType = require('./rules/requireReturnType');
-
-var _requireReturnType2 = _interopRequireDefault(_requireReturnType);
-
-var _requireTypesAtTop = require('./rules/requireTypesAtTop');
-
-var _requireTypesAtTop2 = _interopRequireDefault(_requireTypesAtTop);
-
-var _requireValidFileAnnotation = require('./rules/requireValidFileAnnotation');
-
-var _requireValidFileAnnotation2 = _interopRequireDefault(_requireValidFileAnnotation);
-
-var _requireVariableType = require('./rules/requireVariableType');
-
-var _requireVariableType2 = _interopRequireDefault(_requireVariableType);
-
-var _semi = require('./rules/semi');
-
-var _semi2 = _interopRequireDefault(_semi);
-
-var _sortKeys = require('./rules/sortKeys');
-
-var _sortKeys2 = _interopRequireDefault(_sortKeys);
-
-var _spaceAfterTypeColon = require('./rules/spaceAfterTypeColon');
-
-var _spaceAfterTypeColon2 = _interopRequireDefault(_spaceAfterTypeColon);
-
-var _spaceBeforeGenericBracket = require('./rules/spaceBeforeGenericBracket');
-
-var _spaceBeforeGenericBracket2 = _interopRequireDefault(_spaceBeforeGenericBracket);
-
-var _spaceBeforeTypeColon = require('./rules/spaceBeforeTypeColon');
-
-var _spaceBeforeTypeColon2 = _interopRequireDefault(_spaceBeforeTypeColon);
-
-var _typeIdMatch = require('./rules/typeIdMatch');
-
-var _typeIdMatch2 = _interopRequireDefault(_typeIdMatch);
-
-var _typeImportStyle = require('./rules/typeImportStyle');
-
-var _typeImportStyle2 = _interopRequireDefault(_typeImportStyle);
-
-var _unionIntersectionSpacing = require('./rules/unionIntersectionSpacing');
-
-var _unionIntersectionSpacing2 = _interopRequireDefault(_unionIntersectionSpacing);
-
-var _useFlowType = require('./rules/useFlowType');
-
-var _useFlowType2 = _interopRequireDefault(_useFlowType);
-
-var _validSyntax = require('./rules/validSyntax');
-
-var _validSyntax2 = _interopRequireDefault(_validSyntax);
-
-var _spreadExactType = require('./rules/spreadExactType');
-
-var _spreadExactType2 = _interopRequireDefault(_spreadExactType);
-
-var _arrowParens = require('./rules/arrowParens');
-
-var _arrowParens2 = _interopRequireDefault(_arrowParens);
-
-var _utilities = require('./utilities');
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var rules = {
-  'array-style-complex-type': _arrayStyleComplexType2.default,
-  'array-style-simple-type': _arrayStyleSimpleType2.default,
-  'arrow-parens': _arrowParens2.default,
-  'boolean-style': _booleanStyle2.default,
-  'define-flow-type': _defineFlowType2.default,
-  'delimiter-dangle': _delimiterDangle2.default,
-  'generic-spacing': _genericSpacing2.default,
-  'newline-after-flow-annotation': _newlineAfterFlowAnnotation2.default,
-  'no-dupe-keys': _noDupeKeys2.default,
-  'no-existential-type': _noExistentialType2.default,
-  'no-flow-fix-me-comments': _noFlowFixMeComments2.default,
-  'no-mixed': _noMixed2.default,
-  'no-mutable-array': _noMutableArray2.default,
-  'no-primitive-constructor-types': _noPrimitiveConstructorTypes2.default,
-  'no-types-missing-file-annotation': _noTypesMissingFileAnnotation2.default,
-  'no-unused-expressions': _noUnusedExpressions2.default,
-  'no-weak-types': _noWeakTypes2.default,
-  'object-type-delimiter': _objectTypeDelimiter2.default,
-  'require-compound-type-alias': _requireCompoundTypeAlias2.default,
-  'require-exact-type': _requireExactType2.default,
-  'require-indexer-name': _requireIndexerName2.default,
-  'require-inexact-type': _requireInexactType2.default,
-  'require-parameter-type': _requireParameterType2.default,
-  'require-readonly-react-props': _requireReadonlyReactProps2.default,
-  'require-return-type': _requireReturnType2.default,
-  'require-types-at-top': _requireTypesAtTop2.default,
-  'require-valid-file-annotation': _requireValidFileAnnotation2.default,
-  'require-variable-type': _requireVariableType2.default,
-  semi: _semi2.default,
-  'sort-keys': _sortKeys2.default,
-  'space-after-type-colon': _spaceAfterTypeColon2.default,
-  'space-before-generic-bracket': _spaceBeforeGenericBracket2.default,
-  'space-before-type-colon': _spaceBeforeTypeColon2.default,
-  'spread-exact-type': _spreadExactType2.default,
-  'type-id-match': _typeIdMatch2.default,
-  'type-import-style': _typeImportStyle2.default,
-  'union-intersection-spacing': _unionIntersectionSpacing2.default,
-  'use-flow-type': _useFlowType2.default,
-  'valid-syntax': _validSyntax2.default
-};
-
-exports.default = {
-  configs: {
-    recommended: _recommended2.default
-  },
-  rules: _lodash2.default.mapValues(rules, function (rule, key) {
-    if (key === 'no-types-missing-file-annotation') {
-      return rule;
-    }
-
-    return _extends({}, rule, {
-      create: _lodash2.default.partial(_utilities.checkFlowFileAnnotation, rule.create)
-    });
-  }),
-  rulesConfig: {
-    'boolean-style': 0,
-    'define-flow-type': 0,
-    'delimiter-dangle': 0,
-    'generic-spacing': 0,
-    'newline-after-flow-annotation': 0,
-    'no-dupe-keys': 0,
-    'no-flow-fix-me-comments': 0,
-    'no-mixed': 0,
-    'no-mutable-array': 0,
-    'no-weak-types': 0,
-    'object-type-delimiter': 0,
-    'require-compound-type-alias': 0,
-    'require-exact-type': 0,
-    'require-parameter-type': 0,
-    'require-readonly-react-props': 0,
-    'require-return-type': 0,
-    'require-variable-type': 0,
-    semi: 0,
-    'sort-keys': 0,
-    'space-after-type-colon': 0,
-    'space-before-generic-bracket': 0,
-    'space-before-type-colon': 0,
-    'spread-exact-type': 0,
-    'type-id-match': 0,
-    'type-import-style': 0,
-    'union-intersection-spacing': 0,
-    'use-flow-type': 0,
-    'valid-syntax': 0
-  }
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyle/index.js b/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyle/index.js
deleted file mode 100644
index a7dc4e5..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyle/index.js
+++ /dev/null
@@ -1,98 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _isSimpleType = require('./isSimpleType');
-
-var _isSimpleType2 = _interopRequireDefault(_isSimpleType);
-
-var _needWrap = require('./needWrap');
-
-var _needWrap2 = _interopRequireDefault(_needWrap);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [{
-  enum: ['verbose', 'shorthand'],
-  type: 'string'
-}];
-
-var inlineType = function inlineType(type) {
-  var inlined = type.replace(/\s+/g, ' ');
-
-  if (inlined.length <= 50) {
-    return inlined;
-  } else {
-    return 'Type';
-  }
-};
-
-exports.default = function (defaultConfig, simpleType) {
-  var create = function create(context) {
-    var verbose = (context.options[0] || defaultConfig) === 'verbose';
-
-    return {
-      // shorthand
-      ArrayTypeAnnotation(node) {
-        var rawElementType = context.getSourceCode().getText(node.elementType);
-        var inlinedType = inlineType(rawElementType);
-        var wrappedInlinedType = (0, _needWrap2.default)(node.elementType) ? '(' + inlinedType + ')' : inlinedType;
-
-        if ((0, _isSimpleType2.default)(node.elementType) === simpleType && verbose) {
-          context.report({
-            data: {
-              type: inlinedType,
-              wrappedType: wrappedInlinedType
-            },
-            fix(fixer) {
-              return fixer.replaceText(node, 'Array<' + rawElementType + '>');
-            },
-            message: 'Use "Array<{{ type }}>", not "{{ wrappedType }}[]"',
-            node
-          });
-        }
-      },
-
-      // verbose
-      GenericTypeAnnotation(node) {
-        if (node.id.name === 'Array') {
-          // Don't report on un-parameterized Array annotations. There are valid cases for this,
-          // but regardless, we should not crash when encountering them.
-          if (node.typeParameters && node.typeParameters.params.length === 1) {
-            var elementTypeNode = node.typeParameters.params[0];
-            var rawElementType = context.getSourceCode().getText(elementTypeNode);
-            var inlinedType = inlineType(rawElementType);
-            var wrappedInlinedType = (0, _needWrap2.default)(elementTypeNode) ? '(' + inlinedType + ')' : inlinedType;
-
-            if ((0, _isSimpleType2.default)(elementTypeNode) === simpleType && !verbose) {
-              context.report({
-                data: {
-                  type: inlinedType,
-                  wrappedType: wrappedInlinedType
-                },
-                fix(fixer) {
-                  if ((0, _needWrap2.default)(elementTypeNode)) {
-                    return fixer.replaceText(node, '(' + rawElementType + ')[]');
-                  } else {
-                    return fixer.replaceText(node, rawElementType + '[]');
-                  }
-                },
-                message: 'Use "{{ wrappedType }}[]", not "Array<{{ type }}>"',
-                node
-              });
-            }
-          }
-        }
-      }
-    };
-  };
-
-  return {
-    create,
-    schema
-  };
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyle/isSimpleType.js b/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyle/isSimpleType.js
deleted file mode 100644
index 43217fe..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyle/isSimpleType.js
+++ /dev/null
@@ -1,34 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-/**
- * Types considered simple:
- *
- *  - primitive types
- *  - literal types
- *  - mixed and any types
- *  - generic types (such as Date, Promise<string>, $Keys<T>, etc.)
- *  - array type written in shorthand notation
- *
- * Types not considered simple:
- *
- *  - maybe type
- *  - function type
- *  - object type
- *  - tuple type
- *  - union and intersection types
- *
- * Reminder: if you change these semantics, don't forget to modify documentation of `array-style-...` rules
- */
-
-var simpleTypePatterns = [/^(?:Any|Array|Boolean|Generic|Mixed|Number|String|Void)TypeAnnotation$/, /.+LiteralTypeAnnotation$/];
-
-exports.default = function (node) {
-  return simpleTypePatterns.some(function (pattern) {
-    return pattern.test(node.type);
-  });
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyle/needWrap.js b/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyle/needWrap.js
deleted file mode 100644
index 829b6bc..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyle/needWrap.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _isSimpleType = require('./isSimpleType');
-
-var _isSimpleType2 = _interopRequireDefault(_isSimpleType);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var complexTypesWithoutWrap = ['TupleTypeAnnotation', 'ObjectTypeAnnotation'];
-
-exports.default = function (node) {
-  return !(0, _isSimpleType2.default)(node) && !complexTypesWithoutWrap.includes(node.type);
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyleComplexType.js b/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyleComplexType.js
deleted file mode 100644
index 3c14f12..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyleComplexType.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _arrayStyle = require('./arrayStyle');
-
-var _arrayStyle2 = _interopRequireDefault(_arrayStyle);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = (0, _arrayStyle2.default)('verbose', false);
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyleSimpleType.js b/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyleSimpleType.js
deleted file mode 100644
index a2b256b..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/arrayStyleSimpleType.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _arrayStyle = require('./arrayStyle');
-
-var _arrayStyle2 = _interopRequireDefault(_arrayStyle);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = (0, _arrayStyle2.default)('verbose', true);
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/arrowParens.js b/node_modules/eslint-plugin-flowtype/dist/rules/arrowParens.js
deleted file mode 100644
index da22627..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/arrowParens.js
+++ /dev/null
@@ -1,160 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var getLocation = function getLocation(node) {
-  return {
-    end: node.params[node.params.length - 1].loc.end,
-    start: node.params[0].loc.start
-  };
-};
-
-var isOpeningParenToken = function isOpeningParenToken(token) {
-  return token.value === '(' && token.type === 'Punctuator';
-};
-
-var isClosingParenToken = function isClosingParenToken(token) {
-  return token.value === ')' && token.type === 'Punctuator';
-};
-
-exports.default = {
-  create(context) {
-    var asNeeded = context.options[0] === 'as-needed';
-    var requireForBlockBody = asNeeded && context.options[1] && context.options[1].requireForBlockBody === true;
-
-    var sourceCode = context.getSourceCode();
-
-    // Determines whether a arrow function argument end with `)`
-    // eslint-disable-next-line complexity
-    var parens = function parens(node) {
-      var isAsync = node.async;
-      var firstTokenOfParam = sourceCode.getFirstToken(node, isAsync ? 1 : 0);
-
-      // Remove the parenthesis around a parameter
-      var fixParamsWithParenthesis = function fixParamsWithParenthesis(fixer) {
-        var paramToken = sourceCode.getTokenAfter(firstTokenOfParam);
-
-        /*
-        * ES8 allows Trailing commas in function parameter lists and calls
-        * https://github.com/eslint/eslint/issues/8834
-        */
-        var closingParenToken = sourceCode.getTokenAfter(paramToken, isClosingParenToken);
-        var asyncToken = isAsync ? sourceCode.getTokenBefore(firstTokenOfParam) : null;
-        var shouldAddSpaceForAsync = asyncToken && asyncToken.range[1] === firstTokenOfParam.range[0];
-
-        return fixer.replaceTextRange([firstTokenOfParam.range[0], closingParenToken.range[1]], `${shouldAddSpaceForAsync ? ' ' : ''}${paramToken.value}`);
-      };
-
-      // Type parameters without an opening paren is always a parse error, and
-      // can therefore be safely ignored.
-      if (node.typeParameters) {
-        return;
-      }
-
-      // Similarly, a predicate always requires parens just like a return type
-      // does, and therefore this case can also be safely ignored.
-      if (node.predicate) {
-        return;
-      }
-
-      // "as-needed", { "requireForBlockBody": true }: x => x
-      if (requireForBlockBody && node.params.length === 1 && node.params[0].type === 'Identifier' && !node.params[0].typeAnnotation && node.body.type !== 'BlockStatement' && !node.returnType) {
-        if (isOpeningParenToken(firstTokenOfParam)) {
-          context.report({
-            fix: fixParamsWithParenthesis,
-            loc: getLocation(node),
-            messageId: 'unexpectedParensInline',
-            node
-          });
-        }
-
-        return;
-      }
-
-      if (requireForBlockBody && node.body.type === 'BlockStatement') {
-        if (!isOpeningParenToken(firstTokenOfParam)) {
-          context.report({
-            fix(fixer) {
-              return fixer.replaceText(firstTokenOfParam, `(${firstTokenOfParam.value})`);
-            },
-            loc: getLocation(node),
-            messageId: 'expectedParensBlock',
-            node
-          });
-        }
-
-        return;
-      }
-
-      // "as-needed": x => x
-      if (asNeeded && node.params.length === 1 && node.params[0].type === 'Identifier' && !node.params[0].typeAnnotation && !node.returnType) {
-        if (isOpeningParenToken(firstTokenOfParam)) {
-          context.report({
-            fix: fixParamsWithParenthesis,
-            loc: getLocation(node),
-            messageId: 'unexpectedParens',
-            node
-          });
-        }
-
-        return;
-      }
-
-      if (firstTokenOfParam.type === 'Identifier') {
-        var after = sourceCode.getTokenAfter(firstTokenOfParam);
-
-        // (x) => x
-        if (after.value !== ')') {
-          context.report({
-            fix(fixer) {
-              return fixer.replaceText(firstTokenOfParam, `(${firstTokenOfParam.value})`);
-            },
-            loc: getLocation(node),
-            messageId: 'expectedParens',
-            node
-          });
-        }
-      }
-    };
-
-    return {
-      ArrowFunctionExpression: parens
-    };
-  },
-
-  meta: {
-    docs: {
-      category: 'ECMAScript 6',
-      description: 'require parentheses around arrow function arguments',
-      recommended: false,
-      url: 'https://eslint.org/docs/rules/arrow-parens'
-    },
-
-    fixable: 'code',
-
-    messages: {
-      expectedParens: 'Expected parentheses around arrow function argument.',
-      expectedParensBlock: 'Expected parentheses around arrow function argument having a body with curly braces.',
-
-      unexpectedParens: 'Unexpected parentheses around single function argument.',
-      unexpectedParensInline: 'Unexpected parentheses around single function argument having a body with no curly braces.'
-    },
-
-    type: 'layout'
-  },
-
-  schema: [{
-    enum: ['always', 'as-needed']
-  }, {
-    additionalProperties: false,
-    properties: {
-      requireForBlockBody: {
-        default: false,
-        type: 'boolean'
-      }
-    },
-    type: 'object'
-  }]
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/booleanStyle.js b/node_modules/eslint-plugin-flowtype/dist/rules/booleanStyle.js
deleted file mode 100644
index 1383fc2..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/booleanStyle.js
+++ /dev/null
@@ -1,45 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [{
-  enum: ['bool', 'boolean'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var longForm = (context.options[0] || 'boolean') === 'boolean';
-
-  return {
-    BooleanTypeAnnotation(node) {
-      var diff = node.end - node.start;
-
-      if (longForm && diff === 4) {
-        context.report({
-          fix(fixer) {
-            return fixer.replaceText(node, 'boolean');
-          },
-          message: 'Use "boolean", not "bool"',
-          node
-        });
-      }
-
-      if (!longForm && diff !== 4) {
-        context.report({
-          fix(fixer) {
-            return fixer.replaceText(node, 'bool');
-          },
-          message: 'Use "bool", not "boolean"',
-          node
-        });
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/defineFlowType.js b/node_modules/eslint-plugin-flowtype/dist/rules/defineFlowType.js
deleted file mode 100644
index fe343fe..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/defineFlowType.js
+++ /dev/null
@@ -1,83 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [];
-
-var create = function create(context) {
-  var globalScope = void 0;
-
-  // do nearly the same thing that eslint does for config globals
-  // https://github.com/eslint/eslint/blob/v2.0.0/lib/eslint.js#L118-L194
-  var makeDefined = function makeDefined(ident) {
-    var ii = void 0;
-
-    // start from the right since we're going to remove items from the array
-    for (ii = globalScope.through.length - 1; ii >= 0; ii--) {
-      var ref = globalScope.through[ii];
-
-      if (ref.identifier.name === ident.name) {
-        // use "__defineGeneric" since we don't have a reference to "escope.Variable"
-        // eslint-disable-next-line no-underscore-dangle
-        globalScope.__defineGeneric(ident.name, globalScope.set, globalScope.variables);
-        var variable = globalScope.set.get(ident.name);
-
-        variable.writeable = false;
-
-        // "through" contains all references whose definition cannot be found
-        // so we need to update references and remove the ones that were added
-        globalScope.through.splice(ii, 1);
-        ref.resolved = variable;
-        variable.references.push(ref);
-      }
-    }
-  };
-
-  return {
-    ClassImplements(node) {
-      makeDefined(node.id);
-    },
-    DeclareInterface(node) {
-      makeDefined(node.id);
-    },
-    DeclareTypeAlias(node) {
-      makeDefined(node.id);
-    },
-    GenericTypeAnnotation(node) {
-      if (node.id.type === 'Identifier') {
-        makeDefined(node.id);
-      } else if (node.id.type === 'QualifiedTypeIdentifier') {
-        var qid = void 0;
-
-        qid = node.id;
-        do {
-          qid = qid.qualification;
-        } while (qid.qualification);
-
-        makeDefined(qid);
-      }
-    },
-
-    // Can be removed once https://github.com/babel/babel-eslint/pull/696 is published
-    OpaqueType(node) {
-      if (node.id.type === 'Identifier') {
-        makeDefined(node.id);
-      }
-    },
-    Program() {
-      globalScope = context.getScope();
-    },
-    TypeParameterDeclaration(node) {
-      node.params.forEach(function (param) {
-        makeDefined(param);
-      });
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/delimiterDangle.js b/node_modules/eslint-plugin-flowtype/dist/rules/delimiterDangle.js
deleted file mode 100644
index 7740f66..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/delimiterDangle.js
+++ /dev/null
@@ -1,151 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [{
-  enum: ['always', 'always-multiline', 'only-multiline', 'never'],
-  type: 'string'
-}, {
-  enum: ['always', 'always-multiline', 'only-multiline', 'never'],
-  type: 'string'
-}, {
-  enum: ['always', 'always-multiline', 'only-multiline', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var option = context.options[0] || 'never';
-  var interfaceOption = context.options[1] || option;
-  var inexactNotationOption = context.options[2] || 'never';
-  var sourceCode = context.getSourceCode();
-
-  var getNodeOption = function getNodeOption(node) {
-    if (node.parent.type === 'InterfaceDeclaration') {
-      return interfaceOption;
-    }
-
-    if (node.inexact) {
-      return inexactNotationOption;
-    }
-
-    return option;
-  };
-
-  var reporter = function reporter(node, message, fix) {
-    return function () {
-      context.report({
-        fix,
-        message,
-        node
-      });
-    };
-  };
-
-  var makeReporters = function makeReporters(node, tokenToFix) {
-    return {
-      dangle: reporter(node, 'Unexpected trailing delimiter', function (fixer) {
-        return fixer.replaceText(tokenToFix, '');
-      }),
-      noDangle: reporter(node, 'Missing trailing delimiter', function (fixer) {
-        return fixer.insertTextAfter(tokenToFix, ',');
-      })
-    };
-  };
-
-  var evaluate = function evaluate(node, lastChildNode) {
-    if (!lastChildNode && !node.inexact) {
-      return;
-    }
-
-    var _sourceCode$getLastTo = sourceCode.getLastTokens(node, 2),
-        _sourceCode$getLastTo2 = _slicedToArray(_sourceCode$getLastTo, 2),
-        penultimateToken = _sourceCode$getLastTo2[0],
-        lastToken = _sourceCode$getLastTo2[1];
-
-    var isDangling = [';', ','].includes(penultimateToken.value);
-    var isMultiLine = penultimateToken.loc.start.line !== lastToken.loc.start.line;
-
-    // Use the object node if it's inexact since there's no child node for the inexact notation
-    var report = makeReporters(node.inexact ? node : lastChildNode, penultimateToken);
-    var nodeOption = getNodeOption(node);
-
-    if (nodeOption === 'always' && !isDangling) {
-      report.noDangle();
-
-      return;
-    }
-
-    if (nodeOption === 'never' && isDangling) {
-      report.dangle();
-
-      return;
-    }
-
-    if (nodeOption === 'always-multiline' && !isDangling && isMultiLine) {
-      report.noDangle();
-
-      return;
-    }
-
-    if (nodeOption === 'always-multiline' && isDangling && !isMultiLine) {
-      report.dangle();
-
-      return;
-    }
-
-    if (nodeOption === 'only-multiline' && isDangling && !isMultiLine) {
-      report.dangle();
-    }
-  };
-
-  // required for reporting the correct position
-  var getLast = function getLast(property, indexer) {
-    if (!property) {
-      return indexer;
-    }
-
-    if (!indexer) {
-      return property;
-    }
-
-    if (property.loc.end.line > indexer.loc.end.line) {
-      return property;
-    }
-
-    if (indexer.loc.end.line > property.loc.end.line) {
-      return indexer;
-    }
-
-    if (property.loc.end.column > indexer.loc.end.column) {
-      return property;
-    }
-
-    return indexer;
-  };
-
-  return {
-    ObjectTypeAnnotation(node) {
-      evaluate(node, getLast(_lodash2.default.last(node.properties), _lodash2.default.last(node.indexers)));
-    },
-
-    TupleTypeAnnotation(node) {
-      evaluate(node, _lodash2.default.last(node.types));
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/genericSpacing.js b/node_modules/eslint-plugin-flowtype/dist/rules/genericSpacing.js
deleted file mode 100644
index 5850b4a..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/genericSpacing.js
+++ /dev/null
@@ -1,108 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
-var _utilities = require('../utilities');
-
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var sourceCode = context.getSourceCode();
-
-  var never = (context.options[0] || 'never') === 'never';
-
-  return {
-    GenericTypeAnnotation(node) {
-      var types = node.typeParameters;
-
-      // Promise<foo>
-      // ^^^^^^^^^^^^ GenericTypeAnnotation (with typeParameters)
-      //         ^^^  GenericTypeAnnotation (without typeParameters)
-      if (!types) {
-        return;
-      }
-
-      var _sourceCode$getFirstT = sourceCode.getFirstTokens(types, 2),
-          _sourceCode$getFirstT2 = _slicedToArray(_sourceCode$getFirstT, 2),
-          opener = _sourceCode$getFirstT2[0],
-          firstInnerToken = _sourceCode$getFirstT2[1];
-
-      var _sourceCode$getLastTo = sourceCode.getLastTokens(types, 2),
-          _sourceCode$getLastTo2 = _slicedToArray(_sourceCode$getLastTo, 2),
-          lastInnerToken = _sourceCode$getLastTo2[0],
-          closer = _sourceCode$getLastTo2[1];
-
-      var spacesBefore = firstInnerToken.start - opener.end;
-      var spacesAfter = closer.start - lastInnerToken.end;
-
-      if (never) {
-        if (spacesBefore) {
-          if (sourceCode.text[opener.end] !== '\n') {
-            context.report({
-              data: { name: node.id.name },
-              fix: _utilities.spacingFixers.stripSpacesAfter(opener, spacesBefore),
-              message: 'There must be no space at start of "{{name}}" generic type annotation',
-              node: types
-            });
-          }
-        }
-
-        if (spacesAfter) {
-          if (sourceCode.text[closer.start - 1] !== '\n') {
-            context.report({
-              data: { name: node.id.name },
-              fix: _utilities.spacingFixers.stripSpacesAfter(lastInnerToken, spacesAfter),
-              message: 'There must be no space at end of "{{name}}" generic type annotation',
-              node: types
-            });
-          }
-        }
-      } else {
-        if (spacesBefore > 1) {
-          context.report({
-            data: { name: node.id.name },
-            fix: _utilities.spacingFixers.stripSpacesAfter(opener, spacesBefore - 1),
-            message: 'There must be one space at start of "{{name}}" generic type annotation',
-            node: types
-          });
-        } else if (spacesBefore === 0) {
-          context.report({
-            data: { name: node.id.name },
-            fix: _utilities.spacingFixers.addSpaceAfter(opener),
-            message: 'There must be a space at start of "{{name}}" generic type annotation',
-            node: types
-          });
-        }
-
-        if (spacesAfter > 1) {
-          context.report({
-            data: { name: node.id.name },
-            fix: _utilities.spacingFixers.stripSpacesAfter(lastInnerToken, spacesAfter - 1),
-            message: 'There must be one space at end of "{{name}}" generic type annotation',
-            node: types
-          });
-        } else if (spacesAfter === 0) {
-          context.report({
-            data: { name: node.id.name },
-            fix: _utilities.spacingFixers.addSpaceAfter(lastInnerToken),
-            message: 'There must be a space at end of "{{name}}" generic type annotation',
-            node: types
-          });
-        }
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/newlineAfterFlowAnnotation.js b/node_modules/eslint-plugin-flowtype/dist/rules/newlineAfterFlowAnnotation.js
deleted file mode 100644
index 98c23eb..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/newlineAfterFlowAnnotation.js
+++ /dev/null
@@ -1,71 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var looksLikeFlowFileAnnotation = function looksLikeFlowFileAnnotation(comment) {
-  return (/@(?:no)?flo/i.test(comment)
-  );
-};
-
-var schema = [{
-  enum: ['always', 'always-windows', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var mode = context.options[0];
-  var never = mode === 'never';
-
-  var newline = mode === 'always-windows' ? '\r\n' : '\n';
-
-  return {
-    Program(node) {
-      var sourceCode = context.getSourceCode();
-
-      var potentialFlowFileAnnotation = _lodash2.default.find(context.getAllComments(), function (comment) {
-        return looksLikeFlowFileAnnotation(comment.value);
-      });
-
-      if (potentialFlowFileAnnotation) {
-        var line = potentialFlowFileAnnotation.loc.end.line;
-        var nextLineIsEmpty = sourceCode.lines[line] === '';
-
-        if (!never && !nextLineIsEmpty) {
-          context.report({
-            fix: function fix(fixer) {
-              return fixer.insertTextAfter(potentialFlowFileAnnotation, newline);
-            },
-            message: 'Expected newline after flow annotation',
-            node
-          });
-        }
-
-        if (never && nextLineIsEmpty) {
-          context.report({
-            fix: function fix(fixer) {
-              var lineBreak = sourceCode.text[potentialFlowFileAnnotation.end];
-
-              return fixer.replaceTextRange([potentialFlowFileAnnotation.end, potentialFlowFileAnnotation.end + (lineBreak === '\r' ? 2 : 1)], '');
-            },
-            message: 'Expected no newline after flow annotation',
-            node
-          });
-        }
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/noDupeKeys.js b/node_modules/eslint-plugin-flowtype/dist/rules/noDupeKeys.js
deleted file mode 100644
index 122d13f..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/noDupeKeys.js
+++ /dev/null
@@ -1,108 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _lodash = require('lodash/');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-var _utilities = require('../utilities');
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [];
-
-var create = function create(context) {
-  var report = function report(node) {
-    context.report({
-      loc: node.loc,
-      message: 'Duplicate property.',
-      node
-    });
-  };
-
-  var analizeElement = function analizeElement(element) {
-    var type = element.type;
-
-    var value = void 0;
-
-    switch (type) {
-      case 'GenericTypeAnnotation':
-        value = element.id.name;
-        break;
-      case 'ObjectTypeAnnotation':
-        // eslint-disable-next-line no-use-before-define
-        value = builObjectStructure(element.properties);
-        break;
-      case 'TupleTypeAnnotation':
-        // eslint-disable-next-line no-use-before-define
-        value = buildArrayStructure(element.types);
-        break;
-      default:
-        value = element.value;
-        break;
-    }
-
-    return {
-      type,
-      value
-    };
-  };
-
-  var buildArrayStructure = function buildArrayStructure(elements) {
-    return _lodash2.default.map(elements, function (element) {
-      return analizeElement(element);
-    });
-  };
-
-  var builObjectStructure = function builObjectStructure(properties) {
-    return _lodash2.default.map(properties, function (property) {
-      var element = analizeElement(property.type === 'ObjectTypeSpreadProperty' ? property.argument : property.value);
-
-      return _extends({}, element, {
-        name: (0, _utilities.getParameterName)(property, context)
-      });
-    });
-  };
-
-  var checkForDuplicates = function checkForDuplicates(node) {
-    var haystack = [];
-
-    // filter out complex object types, like ObjectTypeSpreadProperty
-    var identifierNodes = _lodash2.default.filter(node.properties, { type: 'ObjectTypeProperty' });
-
-    _lodash2.default.forEach(identifierNodes, function (identifierNode) {
-      var needle = { name: (0, _utilities.getParameterName)(identifierNode, context) };
-
-      if (identifierNode.value.type === 'FunctionTypeAnnotation') {
-        needle.args = _lodash2.default.map(identifierNode.value.params, function (param) {
-          return analizeElement(param.typeAnnotation);
-        });
-      }
-
-      var match = _lodash2.default.some(haystack, function (existingNeedle) {
-        return _lodash2.default.isEqual(existingNeedle, needle);
-      });
-
-      if (match) {
-        report(identifierNode);
-      } else {
-        haystack.push(needle);
-      }
-    });
-  };
-
-  return {
-    ObjectTypeAnnotation: checkForDuplicates
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/noExistentialType.js b/node_modules/eslint-plugin-flowtype/dist/rules/noExistentialType.js
deleted file mode 100644
index 6116a3d..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/noExistentialType.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-// Support both node types for existential type
-// https://github.com/babel/babylon/issues/319
-var reporter = function reporter(context) {
-  return function (node) {
-    context.report({
-      message: 'Unexpected use of existential type (*).',
-      node
-    });
-  };
-};
-
-var create = function create(context) {
-  return {
-    ExistentialTypeParam: reporter(context),
-    ExistsTypeAnnotation: reporter(context)
-  };
-};
-
-exports.default = {
-  create
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/noFlowFixMeComments.js b/node_modules/eslint-plugin-flowtype/dist/rules/noFlowFixMeComments.js
deleted file mode 100644
index dc6552a..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/noFlowFixMeComments.js
+++ /dev/null
@@ -1,58 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [{
-  type: 'string'
-}];
-
-var message = '$FlowFixMe is treated as `any` and should be fixed.';
-
-var isIdentifier = function isIdentifier(node, name) {
-  return node && node.type === 'Identifier' && node.name.match(name);
-};
-
-var create = function create(context) {
-  var allowedPattern = context.options[0] ? new RegExp(context.options[0]) : null;
-  var extraMessage = allowedPattern ? ' Fix it or match `' + allowedPattern.toString() + '`.' : '';
-
-  var passesExtraRegex = function passesExtraRegex(value) {
-    if (!allowedPattern) {
-      return false;
-    }
-
-    return value.match(allowedPattern);
-  };
-
-  var handleComment = function handleComment(comment) {
-    var value = comment.value.trim();
-
-    if (value.match(/\$FlowFixMe/) && !passesExtraRegex(value)) {
-      context.report(comment, message + extraMessage);
-    }
-  };
-
-  return {
-    GenericTypeAnnotation(node) {
-      if (isIdentifier(node.id, /\$FlowFixMe/)) {
-        context.report({
-          message,
-          node: node.id
-        });
-      }
-    },
-
-    Program() {
-      context.getSourceCode().getAllComments().filter(function (comment) {
-        return comment.type === 'Block' || comment.type === 'Line';
-      }).forEach(handleComment);
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/noMixed.js b/node_modules/eslint-plugin-flowtype/dist/rules/noMixed.js
deleted file mode 100644
index 9e0aa80..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/noMixed.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [];
-
-var create = function create(context) {
-  return {
-    MixedTypeAnnotation(node) {
-      context.report({
-        message: 'Unexpected use of mixed type',
-        node
-      });
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/noMutableArray.js b/node_modules/eslint-plugin-flowtype/dist/rules/noMutableArray.js
deleted file mode 100644
index 1f7ffc8..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/noMutableArray.js
+++ /dev/null
@@ -1,73 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [];
-
-// const x = [];
-var isEmptyArrayLiteral = function isEmptyArrayLiteral(node) {
-  return _lodash2.default.get(node, 'init.type') === 'ArrayExpression' && _lodash2.default.get(node, 'init.elements.length') === 0;
-};
-
-// const x = new Array(); const y = Array();
-var isEmptyArrayInstance = function isEmptyArrayInstance(node) {
-  if (_lodash2.default.get(node, 'init.type') === 'NewExpression' || _lodash2.default.get(node, 'init.type') === 'CallExpression') {
-    return _lodash2.default.get(node, 'init.callee.name') === 'Array' && _lodash2.default.get(node, 'init.arguments.length') === 0;
-  } else {
-    return false;
-  }
-};
-
-var isAnnotationOfEmptyArrayInit = function isAnnotationOfEmptyArrayInit(node) {
-  if (_lodash2.default.has(node, 'parent.parent.parent')) {
-    var parent = _lodash2.default.get(node, 'parent.parent.parent');
-    var isVariableDeclaration = _lodash2.default.get(parent, 'type') === 'VariableDeclarator';
-
-    return isVariableDeclaration && (isEmptyArrayLiteral(parent) || isEmptyArrayInstance(parent));
-  } else {
-    return false;
-  }
-};
-
-var create = function create(context) {
-  return {
-    ArrayTypeAnnotation(node) {
-      if (!isAnnotationOfEmptyArrayInit(node)) {
-        context.report({
-          fix(fixer) {
-            var rawElementType = context.getSourceCode().getText(node.elementType);
-
-            return fixer.replaceText(node, '$ReadOnlyArray<' + rawElementType + '>');
-          },
-          message: 'Use "$ReadOnlyArray" instead of array shorthand notation',
-          node
-        });
-      }
-    },
-    GenericTypeAnnotation(node) {
-      if (node.id.name === 'Array' && !isAnnotationOfEmptyArrayInit(node)) {
-        context.report({
-          fix(fixer) {
-            return fixer.replaceText(node.id, '$ReadOnlyArray');
-          },
-          message: 'Use "$ReadOnlyArray" instead of "Array"',
-          node
-        });
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/noPrimitiveConstructorTypes.js b/node_modules/eslint-plugin-flowtype/dist/rules/noPrimitiveConstructorTypes.js
deleted file mode 100644
index 535498a..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/noPrimitiveConstructorTypes.js
+++ /dev/null
@@ -1,40 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [];
-
-var create = function create(context) {
-  var regex = /^(Boolean|Number|String)$/;
-
-  return {
-    GenericTypeAnnotation: function GenericTypeAnnotation(node) {
-      var name = _lodash2.default.get(node, 'id.name');
-
-      if (regex.test(name)) {
-        context.report({
-          data: {
-            name
-          },
-          loc: node.loc,
-          message: 'Unexpected use of {{name}} constructor type.',
-          node
-        });
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/noTypesMissingFileAnnotation.js b/node_modules/eslint-plugin-flowtype/dist/rules/noTypesMissingFileAnnotation.js
deleted file mode 100644
index f5eb116..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/noTypesMissingFileAnnotation.js
+++ /dev/null
@@ -1,59 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _utilities = require('../utilities');
-
-/**
- * Disallows the use for flow types without a valid file annotation.
- * Only checks files without a valid flow annotation.
- */
-
-var schema = [];
-
-var create = function create(context) {
-  // Skip flow files
-  if ((0, _utilities.isFlowFile)(context, false)) {
-    return {};
-  }
-
-  var reporter = function reporter(node, type) {
-    context.report({
-      data: { type },
-      message: 'Type {{type}} require valid Flow declaration.',
-      node
-    });
-  };
-
-  return {
-    ExportNamedDeclaration(node) {
-      if (node.exportKind === 'type') {
-        reporter(node, 'exports');
-      }
-    },
-    ImportDeclaration(node) {
-      if (node.importKind === 'type') {
-        reporter(node, 'imports');
-      }
-      if (node.importKind === 'value' && node.specifiers.some(function (specifier) {
-        return specifier.importKind === 'type';
-      })) {
-        reporter(node, 'imports');
-      }
-    },
-    TypeAlias(node) {
-      reporter(node, 'aliases');
-    },
-    TypeAnnotation(node) {
-      reporter(node, 'annotations');
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/noUnusedExpressions.js b/node_modules/eslint-plugin-flowtype/dist/rules/noUnusedExpressions.js
deleted file mode 100644
index 8566ce4..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/noUnusedExpressions.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _noUnusedExpressions = require('eslint/lib/rules/no-unused-expressions');
-
-var _noUnusedExpressions2 = _interopRequireDefault(_noUnusedExpressions);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var meta = _noUnusedExpressions2.default.meta; // A wrapper around ESLint's core rule no-unused-expressions, additionally ignores type cast
-// expressions.
-
-var create = function create(context) {
-  var coreChecks = _noUnusedExpressions2.default.create(context);
-
-  return {
-    ExpressionStatement(node) {
-      if (node.expression.type !== 'TypeCastExpression') {
-        coreChecks.ExpressionStatement(node);
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  meta
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/noWeakTypes.js b/node_modules/eslint-plugin-flowtype/dist/rules/noWeakTypes.js
deleted file mode 100644
index efd6dc1..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/noWeakTypes.js
+++ /dev/null
@@ -1,77 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [{
-  additionalProperties: false,
-  properties: {
-    any: {
-      type: 'boolean'
-    },
-    Function: {
-      type: 'boolean'
-    },
-    Object: {
-      type: 'boolean'
-    }
-  },
-  type: 'object'
-}];
-
-var reportWeakType = function reportWeakType(context, weakType) {
-  return function (node) {
-    context.report({
-      data: { weakType },
-      message: 'Unexpected use of weak type "{{weakType}}"',
-      node
-    });
-  };
-};
-
-var genericTypeEvaluator = function genericTypeEvaluator(context, _ref) {
-  var checkFunction = _ref.checkFunction,
-      checkObject = _ref.checkObject;
-
-  return function (node) {
-    var name = _lodash2.default.get(node, 'id.name');
-
-    if (checkFunction && name === 'Function' || checkObject && name === 'Object') {
-      reportWeakType(context, name)(node);
-    }
-  };
-};
-
-var create = function create(context) {
-  var checkAny = _lodash2.default.get(context, 'options[0].any', true) === true;
-  var checkFunction = _lodash2.default.get(context, 'options[0].Function', true) === true;
-  var checkObject = _lodash2.default.get(context, 'options[0].Object', true) === true;
-
-  var checks = {};
-
-  if (checkAny) {
-    checks.AnyTypeAnnotation = reportWeakType(context, 'any');
-  }
-
-  if (checkFunction || checkObject) {
-    checks.GenericTypeAnnotation = genericTypeEvaluator(context, {
-      checkFunction,
-      checkObject
-    });
-  }
-
-  return checks;
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/objectTypeDelimiter.js b/node_modules/eslint-plugin-flowtype/dist/rules/objectTypeDelimiter.js
deleted file mode 100644
index 4adad66..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/objectTypeDelimiter.js
+++ /dev/null
@@ -1,72 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-// ported from babel/flow-object-type; original author: Nat Mote
-// https://github.com/babel/eslint-plugin-babel/blob/c0a49d25a97feb12c1d07073a0b37317359a5fe5/rules/flow-object-type.js
-
-var SEMICOLON = {
-  char: ';',
-  name: 'semicolon'
-};
-
-var COMMA = {
-  char: ',',
-  name: 'comma'
-};
-
-var create = function create(context) {
-  var GOOD = void 0;
-  var BAD = void 0;
-
-  if (!context.options[0] || context.options[0] === COMMA.name) {
-    GOOD = COMMA;
-    BAD = SEMICOLON;
-  } else {
-    GOOD = SEMICOLON;
-    BAD = COMMA;
-  }
-
-  var requireProperPunctuation = function requireProperPunctuation(node) {
-    var sourceCode = context.getSourceCode();
-    var tokens = sourceCode.getTokens(node);
-    var lastToken = void 0;
-
-    lastToken = tokens[tokens.length - 1];
-    if (lastToken.type !== 'Punctuator' || !(lastToken.value === SEMICOLON.char || lastToken.value === COMMA.char)) {
-      var parentTokens = sourceCode.getTokens(node.parent);
-
-      lastToken = parentTokens[parentTokens.indexOf(lastToken) + 1];
-    }
-
-    if (lastToken.type === 'Punctuator') {
-      if (lastToken.value === BAD.char) {
-        context.report({
-          fix(fixer) {
-            return fixer.replaceText(lastToken, GOOD.char);
-          },
-          message: 'Prefer ' + GOOD.name + 's to ' + BAD.name + 's in object and class types',
-          node: lastToken
-        });
-      }
-    }
-  };
-
-  return {
-    ObjectTypeCallProperty: requireProperPunctuation,
-    ObjectTypeIndexer: requireProperPunctuation,
-    ObjectTypeProperty: requireProperPunctuation
-  };
-};
-
-var schema = [{
-  enum: ['semicolon', 'comma'],
-  type: 'string'
-}];
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/requireCompoundTypeAlias.js b/node_modules/eslint-plugin-flowtype/dist/rules/requireCompoundTypeAlias.js
deleted file mode 100644
index 8cecb50..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/requireCompoundTypeAlias.js
+++ /dev/null
@@ -1,42 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var always = (context.options[0] || 'always') === 'always';
-
-  if (always) {
-    return {
-      IntersectionTypeAnnotation(node) {
-        if (node.parent.type !== 'TypeAlias') {
-          context.report({
-            message: 'All intersection types must be declared with named type alias.',
-            node
-          });
-        }
-      },
-      UnionTypeAnnotation(node) {
-        if (node.parent.type !== 'TypeAlias') {
-          context.report({
-            message: 'All union types must be declared with named type alias.',
-            node
-          });
-        }
-      }
-    };
-  } else {
-    return {};
-  }
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/requireExactType.js b/node_modules/eslint-plugin-flowtype/dist/rules/requireExactType.js
deleted file mode 100644
index 1736229..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/requireExactType.js
+++ /dev/null
@@ -1,48 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var always = (context.options[0] || 'always') === 'always';
-
-  return {
-    TypeAlias(node) {
-      var name = node.id.name,
-          _node$right = node.right,
-          type = _node$right.type,
-          exact = _node$right.exact,
-          indexers = _node$right.indexers;
-
-
-      if (type === 'ObjectTypeAnnotation') {
-        if (always && !exact && indexers.length === 0) {
-          context.report({
-            data: { name },
-            message: 'Type identifier \'{{name}}\' must be exact.',
-            node
-          });
-        }
-
-        if (!always && exact) {
-          context.report({
-            data: { name },
-            message: 'Type identifier \'{{name}}\' must not be exact.',
-            node
-          });
-        }
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/requireIndexerName.js b/node_modules/eslint-plugin-flowtype/dist/rules/requireIndexerName.js
deleted file mode 100644
index 0bb1165..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/requireIndexerName.js
+++ /dev/null
@@ -1,42 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _utilities = require('../utilities');
-
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var always = (context.options[0] || 'always') === 'always';
-
-  if (always) {
-    return {
-      ObjectTypeIndexer(node) {
-        var id = (0, _utilities.getParameterName)(node, context);
-        var rawKeyType = context.getSourceCode().getText(node.key);
-        if (id === null) {
-          context.report({
-            fix(fixer) {
-              return fixer.replaceText(node.key, 'key: ' + rawKeyType);
-            },
-            message: 'All indexers must be declared with key name.',
-            node
-          });
-        }
-      }
-    };
-  } else {
-    return {};
-  }
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/requireInexactType.js b/node_modules/eslint-plugin-flowtype/dist/rules/requireInexactType.js
deleted file mode 100644
index d09575b..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/requireInexactType.js
+++ /dev/null
@@ -1,45 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var always = (context.options[0] || 'always') === 'always';
-
-  return {
-    ObjectTypeAnnotation(node) {
-      var inexact = node.inexact,
-          exact = node.exact;
-
-
-      if (!node.hasOwnProperty('inexact')) {
-        return;
-      }
-
-      if (always && !inexact && !exact) {
-        context.report({
-          message: 'Type must be explicit inexact.',
-          node
-        });
-      }
-
-      if (!always && inexact) {
-        context.report({
-          message: 'Type must not be explicit inexact.',
-          node
-        });
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/requireParameterType.js b/node_modules/eslint-plugin-flowtype/dist/rules/requireParameterType.js
deleted file mode 100644
index 54d8bd7..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/requireParameterType.js
+++ /dev/null
@@ -1,78 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-var _utilities = require('../utilities');
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [{
-  additionalProperties: false,
-  properties: {
-    excludeArrowFunctions: {
-      enum: [false, true, 'expressionsOnly']
-    },
-    excludeParameterMatch: {
-      type: 'string'
-    }
-  },
-  type: 'object'
-}];
-
-var create = (0, _utilities.iterateFunctionNodes)(function (context) {
-  var skipArrows = _lodash2.default.get(context, 'options[0].excludeArrowFunctions');
-  var excludeParameterMatch = new RegExp(_lodash2.default.get(context, 'options[0].excludeParameterMatch', 'a^'));
-
-  return function (functionNode) {
-    // It is save to ignore FunctionTypeAnnotation nodes in this rule.
-    if (functionNode.type === 'FunctionTypeAnnotation') {
-      return;
-    }
-
-    var isArrow = functionNode.type === 'ArrowFunctionExpression';
-    var isArrowFunctionExpression = functionNode.expression;
-    var functionAnnotation = isArrow && _lodash2.default.get(functionNode, 'parent.id.typeAnnotation');
-
-    if (skipArrows === 'expressionsOnly' && isArrowFunctionExpression || skipArrows === true && isArrow) {
-      return;
-    }
-
-    _lodash2.default.forEach(functionNode.params, function (identifierNode) {
-      var parameterName = (0, _utilities.getParameterName)(identifierNode, context);
-
-      if (excludeParameterMatch.test(parameterName)) {
-        return;
-      }
-
-      var typeAnnotation = void 0;
-
-      typeAnnotation = _lodash2.default.get(identifierNode, 'typeAnnotation') || _lodash2.default.get(identifierNode, 'left.typeAnnotation');
-
-      if (isArrow && functionAnnotation) {
-        typeAnnotation = true;
-      }
-
-      if (!typeAnnotation) {
-        context.report({
-          data: {
-            name: (0, _utilities.quoteName)(parameterName)
-          },
-          message: 'Missing {{name}}parameter type annotation.',
-          node: identifierNode
-        });
-      }
-    });
-  };
-});
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/requireReadonlyReactProps.js b/node_modules/eslint-plugin-flowtype/dist/rules/requireReadonlyReactProps.js
deleted file mode 100644
index 141edc7..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/requireReadonlyReactProps.js
+++ /dev/null
@@ -1,166 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [];
-
-var reComponentName = /^(Pure)?Component$/;
-var reReadOnly = /^\$(ReadOnly|FlowFixMe)$/;
-
-var isReactComponent = function isReactComponent(node) {
-  if (!node.superClass) {
-    return false;
-  }
-
-  return (
-
-    // class Foo extends Component { }
-    // class Foo extends PureComponent { }
-    node.superClass.type === 'Identifier' && reComponentName.test(node.superClass.name) ||
-
-    // class Foo extends React.Component { }
-    // class Foo extends React.PureComponent { }
-    node.superClass.type === 'MemberExpression' && node.superClass.object.name === 'React' && reComponentName.test(node.superClass.property.name)
-  );
-};
-
-var create = function create(context) {
-  var readOnlyTypes = [];
-  var foundTypes = [];
-  var reportedFunctionalComponents = [];
-
-  var isReadOnlyClassProp = function isReadOnlyClassProp(node) {
-    var id = node.superTypeParameters && node.superTypeParameters.params[0].id;
-
-    return id && !reReadOnly.test(id.name) && !readOnlyTypes.includes(id.name) && foundTypes.includes(id.name);
-  };
-
-  var isReadOnlyObjectType = function isReadOnlyObjectType(node) {
-    if (!node || node.type !== 'ObjectTypeAnnotation') {
-      return false;
-    }
-
-    // we consider `{||}` to be ReadOnly since it's exact AND has no props
-    if (node.exact && node.properties.length === 0) {
-      return true;
-    }
-
-    // { +foo: ..., +bar: ..., ... }
-    return node.properties.length > 0 && node.properties.every(function (prop) {
-      return prop.variance && prop.variance.kind === 'plus';
-    });
-  };
-
-  var isReadOnlyType = function isReadOnlyType(node) {
-    return node.right.id && reReadOnly.test(node.right.id.name) || isReadOnlyObjectType(node.right);
-  };
-
-  var _iteratorNormalCompletion = true;
-  var _didIteratorError = false;
-  var _iteratorError = undefined;
-
-  try {
-    for (var _iterator = context.getSourceCode().ast.body[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-      var node = _step.value;
-
-      var idName = void 0;
-      var typeNode = void 0;
-
-      // type Props = $ReadOnly<{}>
-      if (node.type === 'TypeAlias') {
-        idName = node.id.name;
-        typeNode = node;
-
-        // export type Props = $ReadOnly<{}>
-      } else if (node.type === 'ExportNamedDeclaration' && node.declaration && node.declaration.type === 'TypeAlias') {
-        idName = node.declaration.id.name;
-        typeNode = node.declaration;
-      }
-
-      if (idName) {
-        foundTypes.push(idName);
-        if (isReadOnlyType(typeNode)) {
-          readOnlyTypes.push(idName);
-        }
-      }
-    }
-  } catch (err) {
-    _didIteratorError = true;
-    _iteratorError = err;
-  } finally {
-    try {
-      if (!_iteratorNormalCompletion && _iterator.return) {
-        _iterator.return();
-      }
-    } finally {
-      if (_didIteratorError) {
-        throw _iteratorError;
-      }
-    }
-  }
-
-  return {
-
-    // class components
-    ClassDeclaration(node) {
-      if (isReactComponent(node) && isReadOnlyClassProp(node)) {
-        context.report({
-          message: node.superTypeParameters.params[0].id.name + ' must be $ReadOnly',
-          node
-        });
-      } else if (node.superTypeParameters && node.superTypeParameters.params[0].type === 'ObjectTypeAnnotation' && !isReadOnlyObjectType(node.superTypeParameters.params[0])) {
-        context.report({
-          message: node.id.name + ' class props must be $ReadOnly',
-          node
-        });
-      }
-    },
-
-    // functional components
-    JSXElement(node) {
-      var currentNode = node;
-      var identifier = void 0;
-      var typeAnnotation = void 0;
-
-      while (currentNode && currentNode.type !== 'FunctionDeclaration') {
-        currentNode = currentNode.parent;
-      }
-
-      // functional components can only have 1 param
-      if (!currentNode || currentNode.params.length !== 1) {
-        return;
-      }
-
-      if (currentNode.params[0].type === 'Identifier' && (typeAnnotation = currentNode.params[0].typeAnnotation)) {
-        if ((identifier = typeAnnotation.typeAnnotation.id) && foundTypes.includes(identifier.name) && !readOnlyTypes.includes(identifier.name) && !reReadOnly.test(identifier.name)) {
-          if (reportedFunctionalComponents.includes(identifier)) {
-            return;
-          }
-
-          context.report({
-            message: identifier.name + ' must be $ReadOnly',
-            node
-          });
-
-          reportedFunctionalComponents.push(identifier);
-
-          return;
-        }
-
-        if (typeAnnotation.typeAnnotation.type === 'ObjectTypeAnnotation' && !isReadOnlyObjectType(typeAnnotation.typeAnnotation)) {
-          context.report({
-            message: currentNode.id.name + ' component props must be $ReadOnly',
-            node
-          });
-        }
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/requireReturnType.js b/node_modules/eslint-plugin-flowtype/dist/rules/requireReturnType.js
deleted file mode 100644
index b4bb8b9..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/requireReturnType.js
+++ /dev/null
@@ -1,160 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [{
-  enum: ['always'],
-  type: 'string'
-}, {
-  additionalProperties: false,
-  properties: {
-    annotateUndefined: {
-      enum: ['always', 'never', 'ignore', 'always-enforce'],
-      type: 'string'
-    },
-    excludeArrowFunctions: {
-      enum: [false, true, 'expressionsOnly']
-    },
-    excludeMatching: {
-      items: {
-        type: 'string'
-      },
-      type: 'array'
-    },
-    includeOnlyMatching: {
-      items: {
-        type: 'string'
-      },
-      type: 'array'
-    }
-  },
-  type: 'object'
-}];
-
-var create = function create(context) {
-  var annotateReturn = (_lodash2.default.get(context, 'options[0]') || 'always') === 'always';
-  var annotateUndefined = _lodash2.default.get(context, 'options[1].annotateUndefined') || 'never';
-  var skipArrows = _lodash2.default.get(context, 'options[1].excludeArrowFunctions') || false;
-
-  var makeRegExp = function makeRegExp(str) {
-    return new RegExp(str);
-  };
-
-  var excludeMatching = _lodash2.default.get(context, 'options[1].excludeMatching', []).map(makeRegExp);
-  var includeOnlyMatching = _lodash2.default.get(context, 'options[1].includeOnlyMatching', []).map(makeRegExp);
-
-  var targetNodes = [];
-
-  var registerFunction = function registerFunction(functionNode) {
-    targetNodes.push({
-      functionNode
-    });
-  };
-
-  var isUndefinedReturnType = function isUndefinedReturnType(returnNode) {
-    return returnNode.argument === null || returnNode.argument.name === 'undefined' || returnNode.argument.operator === 'void';
-  };
-
-  var getIsReturnTypeAnnotationUndefined = function getIsReturnTypeAnnotationUndefined(targetNode) {
-    var isReturnTypeAnnotationLiteralUndefined = _lodash2.default.get(targetNode, 'functionNode.returnType.typeAnnotation.id.name') === 'undefined' && _lodash2.default.get(targetNode, 'functionNode.returnType.typeAnnotation.type') === 'GenericTypeAnnotation';
-    var isReturnTypeAnnotationVoid = _lodash2.default.get(targetNode, 'functionNode.returnType.typeAnnotation.type') === 'VoidTypeAnnotation';
-    var isAsyncReturnTypeAnnotationVoid = _lodash2.default.get(targetNode, 'functionNode.async') && _lodash2.default.get(targetNode, 'functionNode.returnType.typeAnnotation.id.name') === 'Promise' && (_lodash2.default.get(targetNode, 'functionNode.returnType.typeAnnotation.typeParameters.params[0].type') === 'VoidTypeAnnotation' || _lodash2.default.get(targetNode, 'functionNode.returnType.typeAnnotation.typeParameters.params[0].id.name') === 'undefined' && _lodash2.default.get(targetNode, 'functionNode.returnType.typeAnnotation.typeParameters.params[0].type') === 'GenericTypeAnnotation');
-
-    return isReturnTypeAnnotationLiteralUndefined || isReturnTypeAnnotationVoid || isAsyncReturnTypeAnnotationVoid;
-  };
-
-  var shouldFilterNode = function shouldFilterNode(functionNode) {
-    var isArrow = functionNode.type === 'ArrowFunctionExpression';
-    var isMethod = functionNode.parent && functionNode.parent.type === 'MethodDefinition';
-    var propertyNodes = ['Property', 'ClassProperty'];
-    var isProperty = functionNode.parent && propertyNodes.includes(functionNode.parent.type);
-    var selector = void 0;
-
-    if (isMethod || isProperty) {
-      selector = 'parent.key.name';
-    } else if (isArrow) {
-      selector = 'parent.id.name';
-    } else {
-      selector = 'id.name';
-    }
-    var identifierName = _lodash2.default.get(functionNode, selector);
-
-    var checkRegExp = function checkRegExp(regex) {
-      return regex.test(identifierName);
-    };
-
-    if (excludeMatching.length && _lodash2.default.some(excludeMatching, checkRegExp)) {
-      return true;
-    }
-
-    if (includeOnlyMatching.length && !_lodash2.default.some(includeOnlyMatching, checkRegExp)) {
-      return true;
-    }
-
-    return false;
-  };
-
-  // eslint-disable-next-line complexity
-  var evaluateFunction = function evaluateFunction(functionNode) {
-    var targetNode = targetNodes.pop();
-
-    if (functionNode !== targetNode.functionNode) {
-      throw new Error('Mismatch.');
-    }
-
-    var isArrow = functionNode.type === 'ArrowFunctionExpression';
-    var isArrowFunctionExpression = functionNode.expression;
-    var isFunctionReturnUndefined = !isArrowFunctionExpression && !functionNode.generator && (!targetNode.returnStatementNode || isUndefinedReturnType(targetNode.returnStatementNode));
-    var isReturnTypeAnnotationUndefined = getIsReturnTypeAnnotationUndefined(targetNode);
-
-    if (skipArrows === 'expressionsOnly' && isArrowFunctionExpression || skipArrows === true && isArrow || shouldFilterNode(functionNode)) {
-      return;
-    }
-
-    var returnType = functionNode.returnType || isArrow && _lodash2.default.get(functionNode, 'parent.id.typeAnnotation');
-
-    if (isFunctionReturnUndefined && isReturnTypeAnnotationUndefined && annotateUndefined === 'never') {
-      context.report(functionNode, 'Must not annotate undefined return type.');
-    } else if (isFunctionReturnUndefined && !isReturnTypeAnnotationUndefined && annotateUndefined === 'always') {
-      context.report(functionNode, 'Must annotate undefined return type.');
-    } else if ((annotateUndefined === 'always-enforce' || !isFunctionReturnUndefined && !isReturnTypeAnnotationUndefined) && annotateReturn && !returnType && !shouldFilterNode(functionNode)) {
-      context.report(functionNode, 'Missing return type annotation.');
-    }
-  };
-
-  var evaluateNoise = function evaluateNoise() {
-    targetNodes.pop();
-  };
-
-  return {
-    ArrowFunctionExpression: registerFunction,
-    'ArrowFunctionExpression:exit': evaluateFunction,
-    ClassDeclaration: registerFunction,
-    'ClassDeclaration:exit': evaluateNoise,
-    ClassExpression: registerFunction,
-    'ClassExpression:exit': evaluateNoise,
-    FunctionDeclaration: registerFunction,
-    'FunctionDeclaration:exit': evaluateFunction,
-    FunctionExpression: registerFunction,
-    'FunctionExpression:exit': evaluateFunction,
-    ReturnStatement: function ReturnStatement(node) {
-      if (targetNodes.length) {
-        targetNodes[targetNodes.length - 1].returnStatementNode = node;
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/requireTypesAtTop.js b/node_modules/eslint-plugin-flowtype/dist/rules/requireTypesAtTop.js
deleted file mode 100644
index acf204a..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/requireTypesAtTop.js
+++ /dev/null
@@ -1,134 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var always = (context.options[0] || 'always') === 'always';
-
-  if (always) {
-    var sourceCode = context.getSourceCode();
-
-    // nodes representing type and import declarations
-    var ignoredNodes = [
-    // import ...
-    function (node) {
-      return node.type === 'ImportDeclaration';
-    },
-
-    // export type Foo = ...
-    // export opaque type Foo = ...
-    // export type Foo from ...
-    // export opaque type Foo from ...
-    function (node) {
-      return node.type === 'ExportNamedDeclaration' && node.exportKind === 'type';
-    },
-
-    // type Foo = ...
-    function (node) {
-      return node.type === 'TypeAlias';
-    },
-
-    // opaque type Foo = ...
-    function (node) {
-      return node.type === 'OpaqueType';
-    }];
-
-    var isIgnoredNode = function isIgnoredNode(node) {
-      var _iteratorNormalCompletion = true;
-      var _didIteratorError = false;
-      var _iteratorError = undefined;
-
-      try {
-        for (var _iterator = ignoredNodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-          var predicate = _step.value;
-
-          if (predicate(node)) {
-            return true;
-          }
-        }
-      } catch (err) {
-        _didIteratorError = true;
-        _iteratorError = err;
-      } finally {
-        try {
-          if (!_iteratorNormalCompletion && _iterator.return) {
-            _iterator.return();
-          }
-        } finally {
-          if (_didIteratorError) {
-            throw _iteratorError;
-          }
-        }
-      }
-
-      return false;
-    };
-
-    var regularCodeStartRange = void 0;
-
-    var _iteratorNormalCompletion2 = true;
-    var _didIteratorError2 = false;
-    var _iteratorError2 = undefined;
-
-    try {
-      for (var _iterator2 = sourceCode.ast.body[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
-        var node = _step2.value;
-
-        if (!isIgnoredNode(node)) {
-          regularCodeStartRange = node.range;
-          break;
-        }
-      }
-    } catch (err) {
-      _didIteratorError2 = true;
-      _iteratorError2 = err;
-    } finally {
-      try {
-        if (!_iteratorNormalCompletion2 && _iterator2.return) {
-          _iterator2.return();
-        }
-      } finally {
-        if (_didIteratorError2) {
-          throw _iteratorError2;
-        }
-      }
-    }
-
-    if (!_lodash2.default.isArray(regularCodeStartRange)) {
-      // a source with only ignored nodes
-      return {};
-    }
-
-    return {
-      'TypeAlias, OpaqueType'(node) {
-        if (node.range[0] > regularCodeStartRange[0]) {
-          context.report({
-            message: 'All type declaration should be at the top of the file, after any import declarations.',
-            node
-          });
-        }
-      }
-    };
-  } else {
-    return {};
-  }
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/requireValidFileAnnotation.js b/node_modules/eslint-plugin-flowtype/dist/rules/requireValidFileAnnotation.js
deleted file mode 100644
index 014cb28..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/requireValidFileAnnotation.js
+++ /dev/null
@@ -1,146 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-var _utilities = require('../utilities');
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var defaults = {
-  annotationStyle: 'none',
-  strict: false
-};
-
-var looksLikeFlowFileAnnotation = function looksLikeFlowFileAnnotation(comment) {
-  return (/@(?:no)?flo/i.test(comment)
-  );
-};
-
-var isValidAnnotationStyle = function isValidAnnotationStyle(node, style) {
-  if (style === 'none') {
-    return true;
-  }
-
-  return style === node.type.toLowerCase();
-};
-
-var checkAnnotationSpelling = function checkAnnotationSpelling(comment) {
-  return (/@[a-z]+\b/.test(comment) && (0, _utilities.fuzzyStringMatch)(comment.replace(/no/i, ''), '@flow', 0.2)
-  );
-};
-
-var isFlowStrict = function isFlowStrict(comment) {
-  return (/^@flow\sstrict\b/.test(comment)
-  );
-};
-
-var noFlowAnnotation = function noFlowAnnotation(comment) {
-  return (/^@noflow\b/.test(comment)
-  );
-};
-
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}, {
-  additionalProperties: false,
-  properties: {
-    annotationStyle: {
-      enum: ['none', 'line', 'block'],
-      type: 'string'
-    },
-    strict: {
-      enum: [true, false],
-      type: 'boolean'
-    }
-  },
-  type: 'object'
-}];
-
-var create = function create(context) {
-  var always = context.options[0] === 'always';
-  var style = _lodash2.default.get(context, 'options[1].annotationStyle', defaults.annotationStyle);
-  var flowStrict = _lodash2.default.get(context, 'options[1].strict', defaults.strict);
-
-  return {
-    Program(node) {
-      var firstToken = node.tokens[0];
-      var addAnnotation = function addAnnotation() {
-        return function (fixer) {
-          var annotation = void 0;
-          if (flowStrict) {
-            annotation = ['line', 'none'].includes(style) ? '// @flow strict\n' : '/* @flow strict */\n';
-          } else {
-            annotation = ['line', 'none'].includes(style) ? '// @flow\n' : '/* @flow */\n';
-          }
-
-          return fixer.replaceTextRange([node.start, node.start], annotation);
-        };
-      };
-
-      var addStrictAnnotation = function addStrictAnnotation() {
-        return function (fixer) {
-          var annotation = ['line', 'none'].includes(style) ? '// @flow strict\n' : '/* @flow strict */\n';
-
-          return fixer.replaceTextRange([node.start, node.range[0]], annotation);
-        };
-      };
-
-      var potentialFlowFileAnnotation = _lodash2.default.find(context.getAllComments(), function (comment) {
-        return looksLikeFlowFileAnnotation(comment.value);
-      });
-
-      if (potentialFlowFileAnnotation) {
-        if (firstToken && firstToken.start < potentialFlowFileAnnotation.start) {
-          context.report(potentialFlowFileAnnotation, 'Flow file annotation not at the top of the file.');
-        }
-        var annotationValue = potentialFlowFileAnnotation.value.trim();
-        if ((0, _utilities.isFlowFileAnnotation)(annotationValue)) {
-          if (!isValidAnnotationStyle(potentialFlowFileAnnotation, style)) {
-            var annotation = style === 'line' ? '// ' + annotationValue : '/* ' + annotationValue + ' */';
-
-            context.report({
-              fix: function fix(fixer) {
-                return fixer.replaceTextRange([potentialFlowFileAnnotation.start, potentialFlowFileAnnotation.end], annotation);
-              },
-              message: 'Flow file annotation style must be `' + annotation + '`',
-              node: potentialFlowFileAnnotation
-            });
-          }
-          if (!noFlowAnnotation(annotationValue) && flowStrict) {
-            if (!isFlowStrict(annotationValue)) {
-              var str = style === 'line' ? '`// @flow strict`' : '`/* @flow strict */`';
-              context.report({
-                fix: addStrictAnnotation(),
-                message: 'Strict Flow file annotation is required, should be ' + str,
-                node
-              });
-            }
-          }
-        } else if (checkAnnotationSpelling(annotationValue)) {
-          context.report(potentialFlowFileAnnotation, 'Misspelled or malformed Flow file annotation.');
-        } else {
-          context.report(potentialFlowFileAnnotation, 'Malformed Flow file annotation.');
-        }
-      } else if (always) {
-        context.report({
-          fix: addAnnotation(),
-          message: 'Flow file annotation is missing.',
-          node
-        });
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/requireVariableType.js b/node_modules/eslint-plugin-flowtype/dist/rules/requireVariableType.js
deleted file mode 100644
index 726cf85..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/requireVariableType.js
+++ /dev/null
@@ -1,86 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-var _utilities = require('../utilities');
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [{
-  additionalProperties: false,
-  properties: {
-    excludeVariableMatch: {
-      type: 'string'
-    },
-    excludeVariableTypes: {
-      additionalProperties: false,
-      properties: {
-        const: {
-          type: 'boolean'
-        },
-        let: {
-          type: 'boolean'
-        },
-        var: {
-          type: 'boolean'
-        }
-      },
-      type: 'object'
-    }
-  },
-  type: 'object'
-}];
-
-var create = function create(context) {
-  var checkThisFile = !_lodash2.default.get(context, 'settings.flowtype.onlyFilesWithFlowAnnotation') || (0, _utilities.isFlowFile)(context);
-
-  if (!checkThisFile) {
-    return function () {};
-  }
-
-  var excludeVariableMatch = new RegExp(_lodash2.default.get(context, 'options[0].excludeVariableMatch', 'a^'));
-  var excludeVariableTypes = _lodash2.default.get(context, 'options[0].excludeVariableTypes', {});
-
-  return {
-    VariableDeclaration: function VariableDeclaration(variableDeclaration) {
-      var variableType = _lodash2.default.get(variableDeclaration, 'kind');
-
-      if (_lodash2.default.get(excludeVariableTypes, variableType)) {
-        return;
-      }
-
-      _lodash2.default.forEach(variableDeclaration.declarations, function (variableDeclarator) {
-        var identifierNode = _lodash2.default.get(variableDeclarator, 'id');
-        var identifierName = _lodash2.default.get(identifierNode, 'name');
-
-        if (excludeVariableMatch.test(identifierName)) {
-          return;
-        }
-
-        var typeAnnotation = _lodash2.default.get(identifierNode, 'typeAnnotation');
-
-        if (!typeAnnotation) {
-          context.report({
-            data: {
-              name: (0, _utilities.quoteName)(identifierName)
-            },
-            message: 'Missing {{name}}variable type annotation.',
-            node: identifierNode
-          });
-        }
-      });
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/semi.js b/node_modules/eslint-plugin-flowtype/dist/rules/semi.js
deleted file mode 100644
index bed1f3e..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/semi.js
+++ /dev/null
@@ -1,71 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var never = (context.options[0] || 'always') === 'never';
-  var sourceCode = context.getSourceCode();
-
-  var report = function report(node, missing) {
-    var lastToken = sourceCode.getLastToken(node);
-    var fix = void 0;
-    var message = void 0;
-    var loc = lastToken.loc;
-
-
-    if (missing) {
-      message = 'Missing semicolon.';
-      loc = loc.end;
-      fix = function fix(fixer) {
-        return fixer.insertTextAfter(lastToken, ';');
-      };
-    } else {
-      message = 'Extra semicolon.';
-      loc = loc.start;
-      fix = function fix(fixer) {
-        return fixer.remove(lastToken);
-      };
-    }
-
-    context.report({
-      fix,
-      loc,
-      message,
-      node
-    });
-  };
-
-  var isSemicolon = function isSemicolon(token) {
-    return token.type === 'Punctuator' && token.value === ';';
-  };
-
-  var checkForSemicolon = function checkForSemicolon(node) {
-    var lastToken = sourceCode.getLastToken(node);
-    var isLastTokenSemicolon = isSemicolon(lastToken);
-
-    if (never && isLastTokenSemicolon) {
-      report(node, false);
-    }
-
-    if (!never && !isLastTokenSemicolon) {
-      report(node, true);
-    }
-  };
-
-  return {
-    OpaqueType: checkForSemicolon,
-    TypeAlias: checkForSemicolon
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/sortKeys.js b/node_modules/eslint-plugin-flowtype/dist/rules/sortKeys.js
deleted file mode 100644
index 3efd5cf..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/sortKeys.js
+++ /dev/null
@@ -1,259 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-var _utilities = require('../utilities');
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
-
-var defaults = {
-  caseSensitive: true,
-  natural: false
-};
-
-var schema = [{
-  enum: ['asc', 'desc'],
-  type: 'string'
-}, {
-  additionalProperties: false,
-  properties: {
-    caseSensitive: {
-      type: 'boolean'
-    },
-    natural: {
-      type: 'boolean'
-    }
-  },
-  type: 'object'
-}];
-
-/**
- * Functions to compare the order of two strings
- *
- * Based on a similar function from eslint's sort-keys rule.
- * https://github.com/eslint/eslint/blob/master/lib/rules/sort-keys.js
- *
- * @private
- */
-var isValidOrders = {
-  asc(str1, str2) {
-    return str1 <= str2;
-  },
-  ascI(str1, str2) {
-    return str1.toLowerCase() <= str2.toLowerCase();
-  },
-  ascIN(str1, str2) {
-    return isValidOrders.naturalCompare(str1.toLowerCase(), str2.toLowerCase()) <= 0;
-  },
-  ascN(str1, str2) {
-    return isValidOrders.naturalCompare(str1, str2) <= 0;
-  },
-  desc(str1, str2) {
-    return isValidOrders.asc(str2, str1);
-  },
-  descI(str1, str2) {
-    return isValidOrders.ascI(str2, str1);
-  },
-  descIN(str1, str2) {
-    return isValidOrders.ascIN(str2, str1);
-  },
-  descN(str1, str2) {
-    return isValidOrders.ascN(str2, str1);
-  },
-  naturalCompare(str1, str2) {
-    return str1.localeCompare(str2, 'en-US', { numeric: true });
-  }
-};
-
-var generateOrderedList = function generateOrderedList(context, sort, properties) {
-  var source = context.getSourceCode();
-
-  var items = properties.map(function (property) {
-    var name = (0, _utilities.getParameterName)(property, context);
-
-    var commentsBefore = source.getCommentsBefore(property);
-    var startIndex = commentsBefore.length > 0 ? commentsBefore[0].start : property.start;
-
-    if (property.type === 'ObjectTypeSpreadProperty' || !property.value) {
-      // NOTE: It could but currently does not fix recursive generic type arguments in GenericTypeAnnotation within ObjectTypeSpreadProperty.
-
-      // Maintain everything between the start of property including leading comments and the nextPunctuator `,` or `}`:
-      var nextPunctuator = source.getTokenAfter(property, {
-        filter: function filter(token) {
-          return token.type === 'Punctuator';
-        }
-      });
-      var beforePunctuator = source.getTokenBefore(nextPunctuator, {
-        includeComments: true
-      });
-      var text = source.getText().substring(startIndex, beforePunctuator.end);
-
-      return [property, text];
-    }
-
-    var colonToken = source.getTokenBefore(property.value, {
-      filter: function filter(token) {
-        return token.value === ':';
-      }
-    });
-
-    // Preserve all code until the colon verbatim:
-    var key = source.getText().substring(startIndex, colonToken.start);
-    var value = void 0;
-
-    if (property.value.type === 'ObjectTypeAnnotation') {
-      // eslint-disable-next-line no-use-before-define
-      value = ' ' + generateFix(property.value, context, sort);
-    } else {
-      // NOTE: It could but currently does not fix recursive generic type arguments in GenericTypeAnnotation.
-
-      // Maintain everything between the `:` and the next Punctuator `,` or `}`:
-      var _nextPunctuator = source.getTokenAfter(property, {
-        filter: function filter(token) {
-          return token.type === 'Punctuator';
-        }
-      });
-      var _beforePunctuator = source.getTokenBefore(_nextPunctuator, {
-        includeComments: true
-      });
-      var _text = source.getText().substring(colonToken.end, _beforePunctuator.end);
-
-      value = _text;
-    }
-
-    return [property, name, key, value];
-  });
-
-  var itemGroups = [[]];
-  var itemGroupIndex = 0;
-  items.forEach(function (item) {
-    if (item[0].type === 'ObjectTypeSpreadProperty') {
-      ++itemGroupIndex;
-      itemGroups[itemGroupIndex] = [item];
-      ++itemGroupIndex;
-      itemGroups[itemGroupIndex] = [];
-    } else {
-      itemGroups[itemGroupIndex].push(item);
-    }
-  });
-
-  var orderedList = [];
-  itemGroups.forEach(function (itemGroup) {
-    if (itemGroup[0] && itemGroup[0].type !== 'ObjectTypeSpreadProperty') {
-      itemGroup.sort(function (first, second) {
-        return sort(first[1], second[1]) ? -1 : 1;
-      });
-    }
-    orderedList.push.apply(orderedList, _toConsumableArray(itemGroup.map(function (item) {
-      if (item.length === 2) {
-        return item[1];
-      }
-
-      return item[2] + ':' + item[3];
-    })));
-  });
-
-  return orderedList;
-};
-
-var generateFix = function generateFix(node, context, sort) {
-  // this could be done much more cleanly in ESLint >=4
-  // as we can apply multiple fixes. That also means we can
-  // maintain code style in a much nicer way
-  var nodeText = void 0;
-  var newTypes = generateOrderedList(context, sort, node.properties);
-  var source = context.getSourceCode(node);
-
-  var originalSubstring = source.getText(node);
-
-  nodeText = originalSubstring;
-
-  node.properties.forEach(function (property, index) {
-    var nextPunctuator = source.getTokenAfter(property, {
-      filter: function filter(token) {
-        return token.type === 'Punctuator';
-      }
-    });
-    var beforePunctuator = source.getTokenBefore(nextPunctuator, {
-      includeComments: true
-    });
-    var commentsBefore = source.getCommentsBefore(property);
-    var startIndex = commentsBefore.length > 0 ? commentsBefore[0].start : property.start;
-    var subString = source.getText().substring(startIndex, beforePunctuator.end);
-
-    nodeText = nodeText.replace(subString, '$' + index);
-  });
-
-  newTypes.forEach(function (item, index) {
-    nodeText = nodeText.replace('$' + index, item);
-  });
-
-  return nodeText;
-};
-
-var create = function create(context) {
-  var order = _lodash2.default.get(context, ['options', 0], 'asc');
-
-  var _$get = _lodash2.default.get(context, ['options', 1], defaults),
-      natural = _$get.natural,
-      caseSensitive = _$get.caseSensitive;
-
-  var insensitive = caseSensitive === false;
-
-  var prev = void 0;
-  var checkKeyOrder = function checkKeyOrder(node) {
-    prev = null;
-
-    _lodash2.default.forEach(node.properties, function (identifierNode) {
-      var current = (0, _utilities.getParameterName)(identifierNode, context);
-      var last = prev;
-
-      // keep track of the last token
-      prev = current || last;
-
-      if (!last || !current) {
-        return;
-      }
-
-      var isValidOrder = isValidOrders[order + (insensitive ? 'I' : '') + (natural ? 'N' : '')];
-
-      if (isValidOrder(last, current) === false) {
-        context.report({
-          data: {
-            current,
-            insensitive: insensitive ? 'insensitive ' : '',
-            last,
-            natural: natural ? 'natural ' : '',
-            order
-          },
-          fix(fixer) {
-            var nodeText = generateFix(node, context, isValidOrder);
-
-            return fixer.replaceText(node, nodeText);
-          },
-          loc: identifierNode.loc,
-          message: 'Expected type annotations to be in {{natural}}{{insensitive}}{{order}}ending order. "{{current}}" should be before "{{last}}".',
-          node: identifierNode
-        });
-      }
-    });
-  };
-
-  return {
-    ObjectTypeAnnotation: checkKeyOrder
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/spaceAfterTypeColon.js b/node_modules/eslint-plugin-flowtype/dist/rules/spaceAfterTypeColon.js
deleted file mode 100644
index 0c8f8b9..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/spaceAfterTypeColon.js
+++ /dev/null
@@ -1,41 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-var _typeColonSpacing = require('./typeColonSpacing');
-
-var _typeColonSpacing2 = _interopRequireDefault(_typeColonSpacing);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}, {
-  additionalProperties: false,
-  properties: {
-    allowLineBreak: {
-      type: 'boolean'
-    }
-  },
-  type: 'object'
-}];
-
-var create = function create(context) {
-  return (0, _typeColonSpacing2.default)('after', context, {
-    allowLineBreak: _lodash2.default.get(context, ['options', '1', 'allowLineBreak'], false),
-    always: _lodash2.default.get(context, ['options', '0'], 'always') === 'always'
-  });
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/spaceBeforeGenericBracket.js b/node_modules/eslint-plugin-flowtype/dist/rules/spaceBeforeGenericBracket.js
deleted file mode 100644
index 3a741f5..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/spaceBeforeGenericBracket.js
+++ /dev/null
@@ -1,64 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _utilities = require('../utilities');
-
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var never = (context.options[0] || 'never') === 'never';
-
-  return {
-    GenericTypeAnnotation(node) {
-      var types = node.typeParameters;
-
-      // Promise<foo>
-      // ^^^^^^^^^^^^ GenericTypeAnnotation (with typeParameters)
-      //         ^^^  GenericTypeAnnotation (without typeParameters)
-      if (!types) {
-        return;
-      }
-
-      var spaceBefore = types.start - node.id.end;
-
-      if (never && spaceBefore) {
-        context.report({
-          data: { name: node.id.name },
-          fix: _utilities.spacingFixers.stripSpacesAfter(node.id, spaceBefore),
-          message: 'There must be no space before "{{name}}" generic type annotation bracket',
-          node
-        });
-      }
-
-      if (!never && !spaceBefore) {
-        context.report({
-          data: { name: node.id.name },
-          fix: _utilities.spacingFixers.addSpaceAfter(node.id),
-          message: 'There must be a space before "{{name}}" generic type annotation bracket',
-          node
-        });
-      }
-
-      if (!never && spaceBefore > 1) {
-        context.report({
-          data: { name: node.id.name },
-          fix: _utilities.spacingFixers.stripSpacesAfter(node.id, spaceBefore - 1),
-          message: 'There must be one space before "{{name}}" generic type annotation bracket',
-          node
-        });
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/spaceBeforeTypeColon.js b/node_modules/eslint-plugin-flowtype/dist/rules/spaceBeforeTypeColon.js
deleted file mode 100644
index d23e1f4..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/spaceBeforeTypeColon.js
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _typeColonSpacing = require('./typeColonSpacing');
-
-var _typeColonSpacing2 = _interopRequireDefault(_typeColonSpacing);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  return (0, _typeColonSpacing2.default)('before', context, {
-    always: context.options[0] === 'always'
-  });
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/spreadExactType.js b/node_modules/eslint-plugin-flowtype/dist/rules/spreadExactType.js
deleted file mode 100644
index 8bc9ee5..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/spreadExactType.js
+++ /dev/null
@@ -1,41 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  return {
-    ObjectTypeAnnotation(node) {
-      var properties = node.properties;
-
-
-      properties.forEach(function (property) {
-        var type = property.type;
-
-        if (type === 'ObjectTypeSpreadProperty') {
-          var _property$argument = property.argument,
-              argumentType = _property$argument.type,
-              argumentId = _property$argument.id;
-
-          if (argumentType !== 'GenericTypeAnnotation' || argumentId.name !== '$Exact') {
-            context.report({
-              message: 'Use $Exact to make type spreading safe.',
-              node
-            });
-          }
-        }
-      });
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateFunctions.js b/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateFunctions.js
deleted file mode 100644
index 346130c..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateFunctions.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-var _utilities = require('../../utilities');
-
-var _evaluateTypical = require('./evaluateTypical');
-
-var _evaluateTypical2 = _interopRequireDefault(_evaluateTypical);
-
-var _evaluateReturnType = require('./evaluateReturnType');
-
-var _evaluateReturnType2 = _interopRequireDefault(_evaluateReturnType);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = (0, _utilities.iterateFunctionNodes)(function (context, report) {
-  var checkParam = (0, _evaluateTypical2.default)(context, report, 'parameter');
-  var checkReturnType = (0, _evaluateReturnType2.default)(context, report);
-
-  return function (functionNode) {
-    _lodash2.default.forEach(functionNode.params, checkParam);
-    checkReturnType(functionNode);
-  };
-});
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeIndexer.js b/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeIndexer.js
deleted file mode 100644
index 4c6a490..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeIndexer.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _utilities = require('../../utilities');
-
-exports.default = function (context, report) {
-  var sourceCode = context.getSourceCode();
-
-  return function (objectTypeIndexer) {
-    // type X = { [a: b]: c }
-    //              ^
-    report({
-      colon: (0, _utilities.getTokenBeforeParens)(sourceCode, objectTypeIndexer.key),
-      node: objectTypeIndexer
-    });
-
-    // type X = { [a: b]: c }
-    //                  ^
-    report({
-      colon: sourceCode.getTokenAfter((0, _utilities.getTokenAfterParens)(sourceCode, objectTypeIndexer.key)),
-      node: objectTypeIndexer
-    });
-  };
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeProperty.js b/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeProperty.js
deleted file mode 100644
index 949439e..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeProperty.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _utilities = require('../../utilities');
-
-var getColon = function getColon(context, objectTypeProperty) {
-  // eslint-disable-next-line init-declarations
-  var tokenIndex = 1;
-
-  if (objectTypeProperty.optional) {
-    tokenIndex++;
-  }
-
-  if (objectTypeProperty.static) {
-    tokenIndex++;
-  }
-
-  if (objectTypeProperty.variance) {
-    tokenIndex++;
-  }
-
-  return context.getSourceCode().getFirstToken(objectTypeProperty, tokenIndex);
-};
-
-// 1) type X = { foo(): A; }
-// 2) type X = { foo: () => A; }
-// the above have identical ASTs (save for their ranges)
-// case 1 doesn't have a type annotation colon and should be ignored
-var isShortPropertyFunction = function isShortPropertyFunction(objectTypeProperty) {
-  return objectTypeProperty.value.type === 'FunctionTypeAnnotation' && objectTypeProperty.start === objectTypeProperty.value.start;
-};
-
-exports.default = function (context, report) {
-  return function (objectTypeProperty) {
-    if (isShortPropertyFunction(objectTypeProperty)) {
-      // potential difference: not checked in before
-      return;
-    }
-
-    report({
-      colon: getColon(context, objectTypeProperty),
-      name: (0, _utilities.quoteName)((0, _utilities.getParameterName)(objectTypeProperty, context)),
-      node: objectTypeProperty
-    });
-  };
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateReturnType.js b/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateReturnType.js
deleted file mode 100644
index d6ddd08..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateReturnType.js
+++ /dev/null
@@ -1,24 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = function (context, report) {
-  var sourceCode = context.getSourceCode();
-
-  return function (functionNode) {
-    // skip FunctionTypeAnnotation, possibly another rule as it's an arrow, not a colon?
-    // (foo: number) => string
-    //              ^^^^
-    if (functionNode.returnType && functionNode.type !== 'FunctionTypeAnnotation') {
-      report({
-        colon: sourceCode.getFirstToken(functionNode.returnType),
-        node: functionNode,
-        type: 'return type'
-      });
-    }
-  };
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypeCastExpression.js b/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypeCastExpression.js
deleted file mode 100644
index e05223e..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypeCastExpression.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = function (context, report) {
-  var sourceCode = context.getSourceCode();
-
-  return function (typeCastExpression) {
-    report({
-      colon: sourceCode.getFirstToken(typeCastExpression.typeAnnotation),
-      node: typeCastExpression,
-      type: 'type cast'
-    });
-  };
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypical.js b/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypical.js
deleted file mode 100644
index 5cbb3db..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypical.js
+++ /dev/null
@@ -1,40 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-var _utilities = require('../../utilities');
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = function (context, report, typeForMessage) {
-  var sourceCode = context.getSourceCode();
-
-  var getColon = function getColon(node, typeAnnotation) {
-    if (node.type === 'FunctionTypeParam') {
-      return sourceCode.getFirstToken(node, node.optional ? 2 : 1);
-    } else {
-      return sourceCode.getFirstToken(typeAnnotation);
-    }
-  };
-
-  return function (node) {
-    var typeAnnotation = _lodash2.default.get(node, 'typeAnnotation') || _lodash2.default.get(node, 'left.typeAnnotation');
-
-    if (typeAnnotation) {
-      report({
-        colon: getColon(node, typeAnnotation),
-        name: (0, _utilities.quoteName)((0, _utilities.getParameterName)(node, context)),
-        node,
-        type: typeForMessage + ' type annotation'
-      });
-    }
-  };
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateVariables.js b/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateVariables.js
deleted file mode 100644
index 2a7b74a..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateVariables.js
+++ /dev/null
@@ -1,36 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-var _utilities = require('../../utilities');
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = function (context, report) {
-  var sourceCode = context.getSourceCode();
-
-  return function (node) {
-    var declarations = _lodash2.default.get(node, 'declarations', []);
-
-    _lodash2.default.forEach(declarations, function (leaf) {
-      var typeAnnotation = _lodash2.default.get(leaf, 'id.typeAnnotation');
-
-      if (typeAnnotation) {
-        report({
-          colon: sourceCode.getFirstToken(typeAnnotation),
-          name: (0, _utilities.quoteName)((0, _utilities.getParameterName)(leaf, context)),
-          node: leaf,
-          type: node.kind + ' type annotation'
-        });
-      }
-    });
-  };
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/index.js b/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/index.js
deleted file mode 100644
index 91e2874..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/index.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _reporter = require('./reporter');
-
-var _reporter2 = _interopRequireDefault(_reporter);
-
-var _evaluateObjectTypeIndexer = require('./evaluateObjectTypeIndexer');
-
-var _evaluateObjectTypeIndexer2 = _interopRequireDefault(_evaluateObjectTypeIndexer);
-
-var _evaluateObjectTypeProperty = require('./evaluateObjectTypeProperty');
-
-var _evaluateObjectTypeProperty2 = _interopRequireDefault(_evaluateObjectTypeProperty);
-
-var _evaluateTypeCastExpression = require('./evaluateTypeCastExpression');
-
-var _evaluateTypeCastExpression2 = _interopRequireDefault(_evaluateTypeCastExpression);
-
-var _evaluateTypical = require('./evaluateTypical');
-
-var _evaluateTypical2 = _interopRequireDefault(_evaluateTypical);
-
-var _evaluateFunctions = require('./evaluateFunctions');
-
-var _evaluateFunctions2 = _interopRequireDefault(_evaluateFunctions);
-
-var _evaluateVariables = require('./evaluateVariables');
-
-var _evaluateVariables2 = _interopRequireDefault(_evaluateVariables);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = function (direction, context, options) {
-  var report = (0, _reporter2.default)(direction, context, options);
-
-  return _extends({}, (0, _evaluateFunctions2.default)(context, report), {
-    ClassProperty: (0, _evaluateTypical2.default)(context, report, 'class property'),
-    ObjectTypeIndexer: (0, _evaluateObjectTypeIndexer2.default)(context, report),
-    ObjectTypeProperty: (0, _evaluateObjectTypeProperty2.default)(context, report),
-    TypeCastExpression: (0, _evaluateTypeCastExpression2.default)(context, report),
-    VariableDeclaration: (0, _evaluateVariables2.default)(context, report)
-  });
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/reporter.js b/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/reporter.js
deleted file mode 100644
index ae3f0aa..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/typeColonSpacing/reporter.js
+++ /dev/null
@@ -1,100 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _utilities = require('../../utilities');
-
-var hasLineBreak = function hasLineBreak(direction, colon, context) {
-  var sourceCode = context.getSourceCode();
-
-  if (direction === 'before') {
-    return colon.loc.start.line !== sourceCode.getTokenBefore(colon).loc.end.line;
-  } else {
-    return sourceCode.getTokenAfter(colon).loc.start.line !== colon.loc.end.line;
-  }
-};
-
-var getSpaces = function getSpaces(direction, colon, context) {
-  var sourceCode = context.getSourceCode();
-
-  if (direction === 'before') {
-    return colon.start - sourceCode.getTokenBefore(colon).end;
-  } else {
-    return sourceCode.getTokenAfter(colon).start - colon.end;
-  }
-};
-
-exports.default = function (direction, context, _ref) {
-  var always = _ref.always,
-      allowLineBreak = _ref.allowLineBreak;
-
-  return function (_ref2) {
-    var colon = _ref2.colon,
-        node = _ref2.node,
-        _ref2$name = _ref2.name,
-        name = _ref2$name === undefined ? '' : _ref2$name,
-        _ref2$type = _ref2.type,
-        type = _ref2$type === undefined ? 'type annotation' : _ref2$type;
-
-    var lineBreak = void 0;
-    var spaces = void 0;
-
-    // Support optional names
-    // type X = { [string]: a }
-    // type X = string => string
-    if (!colon || colon.value !== ':') {
-      return;
-    }
-
-    var data = {
-      direction,
-      name,
-      type
-    };
-
-    if (hasLineBreak(direction, colon, context)) {
-      if (allowLineBreak) {
-        spaces = 1;
-      } else {
-        lineBreak = true;
-        spaces = getSpaces(direction, colon, context);
-      }
-    } else {
-      spaces = getSpaces(direction, colon, context);
-    }
-
-    if (always && lineBreak) {
-      context.report({
-        data,
-        fix: _utilities.spacingFixers.replaceWithSpace(direction, colon, spaces),
-        message: 'There must not be a line break {{direction}} {{name}}{{type}} colon.',
-        node
-      });
-    } else if (always && spaces > 1) {
-      context.report({
-        data,
-        fix: _utilities.spacingFixers.stripSpaces(direction, colon, spaces - 1),
-        message: 'There must be 1 space {{direction}} {{name}}{{type}} colon.',
-        node
-      });
-    } else if (always && spaces === 0) {
-      context.report({
-        data,
-        fix: _utilities.spacingFixers.addSpace(direction, colon),
-        message: 'There must be a space {{direction}} {{name}}{{type}} colon.',
-        node
-      });
-    } else if (!always && spaces > 0) {
-      context.report({
-        data,
-        fix: _utilities.spacingFixers.stripSpaces(direction, colon, spaces),
-        message: 'There must be no space {{direction}} {{name}}{{type}} colon.',
-        node
-      });
-    }
-  };
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/typeIdMatch.js b/node_modules/eslint-plugin-flowtype/dist/rules/typeIdMatch.js
deleted file mode 100644
index adc447d..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/typeIdMatch.js
+++ /dev/null
@@ -1,31 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [{
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var pattern = new RegExp(context.options[0] || '^([A-Z][a-z0-9]*)+Type$');
-
-  return {
-    TypeAlias(typeAliasNode) {
-      var typeIdentifierName = typeAliasNode.id.name;
-
-      if (!pattern.test(typeIdentifierName)) {
-        context.report(typeAliasNode, 'Type identifier \'{{name}}\' does not match pattern \'{{pattern}}\'.', {
-          name: typeIdentifierName,
-          pattern: pattern.toString()
-        });
-      }
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/typeImportStyle.js b/node_modules/eslint-plugin-flowtype/dist/rules/typeImportStyle.js
deleted file mode 100644
index 4016469..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/typeImportStyle.js
+++ /dev/null
@@ -1,89 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [{
-  enum: ['declaration', 'identifier'],
-  type: 'string'
-}, {
-  additionalProperties: false,
-  properties: {
-    ignoreTypeDefault: {
-      type: 'boolean'
-    }
-  },
-  type: 'object'
-}];
-
-var create = function create(context) {
-  if (context.options[0] === 'declaration') {
-    return {
-      ImportDeclaration(node) {
-        if (node.importKind !== 'type') {
-          node.specifiers.forEach(function (specifier) {
-            if (specifier.importKind === 'type') {
-              context.report({
-                message: 'Unexpected type import',
-                node
-              });
-            }
-          });
-        }
-      }
-    };
-  } else {
-    // Default to 'identifier'
-    var ignoreTypeDefault = context.options[1] && context.options[1].ignoreTypeDefault;
-    var isInsideDeclareModule = false;
-
-    return {
-      DeclareModule() {
-        isInsideDeclareModule = true;
-      },
-      'DeclareModule:exit'() {
-        isInsideDeclareModule = false;
-      },
-      ImportDeclaration(node) {
-        if (node.importKind !== 'type') {
-          return;
-        }
-
-        // type specifiers are not allowed inside module declarations:
-        // https://github.com/facebook/flow/issues/7609
-        if (isInsideDeclareModule) {
-          return;
-        }
-
-        if (ignoreTypeDefault && node.specifiers[0] && node.specifiers[0].type === 'ImportDefaultSpecifier') {
-          return;
-        }
-
-        context.report({
-          fix(fixer) {
-            var imports = node.specifiers.map(function (specifier) {
-              if (specifier.type === 'ImportDefaultSpecifier') {
-                return 'type default as ' + specifier.local.name;
-              } else if (specifier.imported.name === specifier.local.name) {
-                return 'type ' + specifier.local.name;
-              } else {
-                return 'type ' + specifier.imported.name + ' as ' + specifier.local.name;
-              }
-            });
-            var source = node.source.value;
-
-            return fixer.replaceText(node, 'import {' + imports.join(', ') + '} from \'' + source + '\';');
-          },
-          message: 'Unexpected "import type"',
-          node
-        });
-      }
-    };
-  }
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/unionIntersectionSpacing.js b/node_modules/eslint-plugin-flowtype/dist/rules/unionIntersectionSpacing.js
deleted file mode 100644
index 0a76d0e..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/unionIntersectionSpacing.js
+++ /dev/null
@@ -1,84 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _utilities = require('../utilities');
-
-var schema = [{
-  enum: ['always', 'never'],
-  type: 'string'
-}];
-
-var create = function create(context) {
-  var sourceCode = context.getSourceCode();
-
-  var always = (context.options[0] || 'always') === 'always';
-
-  var check = function check(node) {
-    node.types.forEach(function (type, index) {
-      if (index + 1 === node.types.length) {
-        return;
-      }
-
-      var separator = (0, _utilities.getTokenAfterParens)(sourceCode, type);
-      var endOfType = sourceCode.getTokenBefore(separator);
-      var nextType = sourceCode.getTokenAfter(separator);
-
-      var spaceBefore = separator.start - endOfType.end;
-      var spaceAfter = nextType.start - separator.end;
-
-      var data = { type: node.type === 'UnionTypeAnnotation' ? 'union' : 'intersection' };
-
-      if (always) {
-        if (!spaceBefore) {
-          context.report({
-            data,
-            fix: _utilities.spacingFixers.addSpaceAfter(endOfType),
-            message: 'There must be a space before {{type}} type annotation separator',
-            node
-          });
-        }
-
-        if (!spaceAfter) {
-          context.report({
-            data,
-            fix: _utilities.spacingFixers.addSpaceAfter(separator),
-            message: 'There must be a space after {{type}} type annotation separator',
-            node
-          });
-        }
-      } else {
-        if (spaceBefore) {
-          context.report({
-            data,
-            fix: _utilities.spacingFixers.stripSpacesAfter(endOfType, spaceBefore),
-            message: 'There must be no space before {{type}} type annotation separator',
-            node
-          });
-        }
-
-        if (spaceAfter) {
-          context.report({
-            data,
-            fix: _utilities.spacingFixers.stripSpacesAfter(separator, spaceAfter),
-            message: 'There must be no space after {{type}} type annotation separator',
-            node
-          });
-        }
-      }
-    });
-  };
-
-  return {
-    IntersectionTypeAnnotation: check,
-    UnionTypeAnnotation: check
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/useFlowType.js b/node_modules/eslint-plugin-flowtype/dist/rules/useFlowType.js
deleted file mode 100644
index 3327e01..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/useFlowType.js
+++ /dev/null
@@ -1,63 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var schema = [];
-
-var create = function create(context) {
-  var markTypeAsUsed = function markTypeAsUsed(node) {
-    context.markVariableAsUsed(node.id.name);
-  };
-  var markTypeAsUsedWithGenericType = function markTypeAsUsedWithGenericType(node) {
-    var typeId = void 0;
-    var scope = void 0;
-    var variable = void 0;
-
-    if (node.id.type === 'Identifier') {
-      typeId = node.id;
-    } else if (node.id.type === 'QualifiedTypeIdentifier') {
-      typeId = node.id;
-      do {
-        typeId = typeId.qualification;
-      } while (typeId.qualification);
-    }
-
-    for (scope = context.getScope(); scope; scope = scope.upper) {
-      variable = scope.set.get(typeId.name);
-      if (variable && variable.defs.length) {
-        context.markVariableAsUsed(typeId.name);
-        break;
-      }
-    }
-  };
-
-  return {
-    DeclareClass: markTypeAsUsed,
-    DeclareFunction: markTypeAsUsed,
-    DeclareModule: markTypeAsUsed,
-    DeclareVariable: markTypeAsUsed,
-    GenericTypeAnnotation: markTypeAsUsedWithGenericType,
-    TypeParameterDeclaration(node) {
-      node.params.forEach(function (param) {
-        if (param.default && param.default.typeParameters) {
-          if (param.default.type === 'GenericTypeAnnotation') {
-            markTypeAsUsedWithGenericType(param.default);
-          }
-
-          param.default.typeParameters.params.forEach(function (typeParameterNode) {
-            if (typeParameterNode.type === 'GenericTypeAnnotation') {
-              markTypeAsUsedWithGenericType(typeParameterNode);
-            }
-          });
-        }
-      });
-    }
-  };
-};
-
-exports.default = {
-  create,
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/rules/validSyntax.js b/node_modules/eslint-plugin-flowtype/dist/rules/validSyntax.js
deleted file mode 100644
index 9614b7d..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/rules/validSyntax.js
+++ /dev/null
@@ -1,45 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-var _utilities = require('../utilities');
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var schema = [];
-
-var create = (0, _utilities.iterateFunctionNodes)(function (context) {
-  return function (functionNode) {
-    _lodash2.default.forEach(functionNode.params, function (identifierNode) {
-      var nodeType = _lodash2.default.get(identifierNode, 'type');
-      var isAssignmentPattern = nodeType === 'AssignmentPattern';
-      var hasTypeAnnotation = Boolean(_lodash2.default.get(identifierNode, 'typeAnnotation'));
-      var leftAnnotated = Boolean(_lodash2.default.get(identifierNode, 'left.typeAnnotation'));
-
-      if (isAssignmentPattern && hasTypeAnnotation && !leftAnnotated) {
-        context.report({
-          data: {
-            name: (0, _utilities.quoteName)((0, _utilities.getParameterName)(identifierNode, context))
-          },
-          message: '{{name}}parameter type annotation must be placed on left-hand side of assignment.',
-          node: identifierNode
-        });
-      }
-    });
-  };
-});
-
-exports.default = {
-  create,
-  meta: {
-    deprecated: true
-  },
-  schema
-};
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/utilities/checkFlowFileAnnotation.js b/node_modules/eslint-plugin-flowtype/dist/utilities/checkFlowFileAnnotation.js
deleted file mode 100644
index 184869e..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/utilities/checkFlowFileAnnotation.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-var _isFlowFile = require('./isFlowFile');
-
-var _isFlowFile2 = _interopRequireDefault(_isFlowFile);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = function (cb, context) {
-  var checkThisFile = !_lodash2.default.get(context, 'settings.flowtype.onlyFilesWithFlowAnnotation') || (0, _isFlowFile2.default)(context);
-
-  if (!checkThisFile) {
-    return function () {};
-  }
-
-  return cb(context);
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/utilities/fuzzyStringMatch.js b/node_modules/eslint-plugin-flowtype/dist/utilities/fuzzyStringMatch.js
deleted file mode 100644
index 35b6778..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/utilities/fuzzyStringMatch.js
+++ /dev/null
@@ -1,62 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-// Creates an array of letter pairs from a given array
-// origin: https://github.com/d3/d3-array/blob/master/src/pairs.js
-var arrayPairs = function arrayPairs(array) {
-  var ii = 0;
-  var length = array.length - 1;
-  var letter = array[0];
-  var pairs = new Array(length < 0 ? 0 : length);
-
-  while (ii < length) {
-    pairs[ii] = [letter, letter = array[++ii]];
-  }
-
-  return pairs;
-};
-/* eslint-enable */
-
-exports.default = function (needle, haystack) {
-  var weight = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.5;
-
-  // Based on http://stackoverflow.com/a/23305385
-
-  var stringSimilarity = function stringSimilarity(str1, str2) {
-    if (str1.length > 0 && str2.length > 0) {
-      var pairs1 = arrayPairs(str1);
-      var pairs2 = arrayPairs(str2);
-      var unionLen = pairs1.length + pairs2.length;
-      var hitCount = void 0;
-
-      hitCount = 0;
-
-      _lodash2.default.forIn(pairs1, function (val1) {
-        _lodash2.default.forIn(pairs2, function (val2) {
-          if (_lodash2.default.isEqual(val1, val2)) {
-            hitCount++;
-          }
-        });
-      });
-
-      if (hitCount > 0) {
-        return 2 * hitCount / unionLen;
-      }
-    }
-
-    return 0;
-  };
-
-  return stringSimilarity(needle, haystack) >= Number(weight);
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/utilities/getParameterName.js b/node_modules/eslint-plugin-flowtype/dist/utilities/getParameterName.js
deleted file mode 100644
index 0d82485..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/utilities/getParameterName.js
+++ /dev/null
@@ -1,94 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.default = function (identifierNode, context) {
-  if (_lodash2.default.has(identifierNode, 'name')) {
-    return identifierNode.name;
-  }
-
-  if (_lodash2.default.has(identifierNode, 'left.name')) {
-    return identifierNode.left.name;
-  }
-
-  if (_lodash2.default.has(identifierNode, 'key.name')) {
-    return identifierNode.key.name;
-  }
-
-  if (identifierNode.type === 'RestElement') {
-    return identifierNode.argument.name;
-  }
-
-  if (identifierNode.type === 'ObjectTypeProperty') {
-    var tokenIndex = void 0;
-
-    tokenIndex = 0;
-
-    if (identifierNode.static) {
-      tokenIndex++;
-    }
-
-    if (identifierNode.variance) {
-      tokenIndex++;
-    }
-
-    if (identifierNode.kind === 'set' || identifierNode.kind === 'get') {
-      tokenIndex++;
-    }
-
-    return context.getSourceCode().getFirstToken(identifierNode, tokenIndex).value;
-  }
-
-  if (identifierNode.type === 'ObjectTypeIndexer') {
-    var _tokenIndex = void 0;
-
-    _tokenIndex = 0;
-
-    if (identifierNode.static) {
-      _tokenIndex++;
-    }
-
-    if (identifierNode.variance) {
-      _tokenIndex++;
-    }
-
-    _tokenIndex++;
-
-    var id = context.getSourceCode().getFirstToken(identifierNode, _tokenIndex);
-    var colonOrBrace = context.getSourceCode().getTokenAfter(id);
-    if (colonOrBrace.value === ':') {
-      return id.value;
-    } else {
-      return null;
-    }
-  }
-
-  if (identifierNode.type === 'FunctionTypeParam') {
-    return context.getSourceCode().getFirstToken(identifierNode).value;
-  }
-
-  if (identifierNode.type === 'ObjectPattern' || identifierNode.type === 'ArrayPattern') {
-    var text = context.getSourceCode().getText(identifierNode);
-
-    if (identifierNode.typeAnnotation) {
-      return text.replace(context.getSourceCode().getText(identifierNode.typeAnnotation), '').trim();
-    } else {
-      return text;
-    }
-  }
-  if (_lodash2.default.get(identifierNode, 'left.type') === 'ObjectPattern') {
-    return context.getSourceCode().getText(identifierNode.left);
-  }
-
-  return null;
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/utilities/getTokenAfterParens.js b/node_modules/eslint-plugin-flowtype/dist/utilities/getTokenAfterParens.js
deleted file mode 100644
index 75b95e6..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/utilities/getTokenAfterParens.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var getTokenAfterParens = function getTokenAfterParens(sourceCode, node) {
-  var token = void 0;
-
-  token = sourceCode.getTokenAfter(node);
-
-  while (token.type === 'Punctuator' && token.value === ')') {
-    token = sourceCode.getTokenAfter(token);
-  }
-
-  return token;
-};
-
-exports.default = getTokenAfterParens;
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/utilities/getTokenBeforeParens.js b/node_modules/eslint-plugin-flowtype/dist/utilities/getTokenBeforeParens.js
deleted file mode 100644
index 6b67a5e..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/utilities/getTokenBeforeParens.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var getTokenBeforeParens = function getTokenBeforeParens(sourceCode, node) {
-  var token = void 0;
-
-  token = sourceCode.getTokenBefore(node);
-
-  while (token.type === 'Punctuator' && token.value === '(') {
-    token = sourceCode.getTokenBefore(token);
-  }
-
-  return token;
-};
-
-exports.default = getTokenBeforeParens;
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/utilities/index.js b/node_modules/eslint-plugin-flowtype/dist/utilities/index.js
deleted file mode 100644
index 98fde28..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/utilities/index.js
+++ /dev/null
@@ -1,97 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.spacingFixers = exports.quoteName = exports.iterateFunctionNodes = exports.isFlowFileAnnotation = exports.isFlowFile = exports.getTokenBeforeParens = exports.getTokenAfterParens = exports.getParameterName = exports.fuzzyStringMatch = exports.checkFlowFileAnnotation = undefined;
-
-var _checkFlowFileAnnotation = require('./checkFlowFileAnnotation');
-
-Object.defineProperty(exports, 'checkFlowFileAnnotation', {
-  enumerable: true,
-  get: function get() {
-    return _interopRequireDefault(_checkFlowFileAnnotation).default;
-  }
-});
-
-var _fuzzyStringMatch = require('./fuzzyStringMatch');
-
-Object.defineProperty(exports, 'fuzzyStringMatch', {
-  enumerable: true,
-  get: function get() {
-    return _interopRequireDefault(_fuzzyStringMatch).default;
-  }
-});
-
-var _getParameterName = require('./getParameterName');
-
-Object.defineProperty(exports, 'getParameterName', {
-  enumerable: true,
-  get: function get() {
-    return _interopRequireDefault(_getParameterName).default;
-  }
-});
-
-var _getTokenAfterParens = require('./getTokenAfterParens');
-
-Object.defineProperty(exports, 'getTokenAfterParens', {
-  enumerable: true,
-  get: function get() {
-    return _interopRequireDefault(_getTokenAfterParens).default;
-  }
-});
-
-var _getTokenBeforeParens = require('./getTokenBeforeParens');
-
-Object.defineProperty(exports, 'getTokenBeforeParens', {
-  enumerable: true,
-  get: function get() {
-    return _interopRequireDefault(_getTokenBeforeParens).default;
-  }
-});
-
-var _isFlowFile = require('./isFlowFile');
-
-Object.defineProperty(exports, 'isFlowFile', {
-  enumerable: true,
-  get: function get() {
-    return _interopRequireDefault(_isFlowFile).default;
-  }
-});
-
-var _isFlowFileAnnotation = require('./isFlowFileAnnotation');
-
-Object.defineProperty(exports, 'isFlowFileAnnotation', {
-  enumerable: true,
-  get: function get() {
-    return _interopRequireDefault(_isFlowFileAnnotation).default;
-  }
-});
-
-var _iterateFunctionNodes = require('./iterateFunctionNodes');
-
-Object.defineProperty(exports, 'iterateFunctionNodes', {
-  enumerable: true,
-  get: function get() {
-    return _interopRequireDefault(_iterateFunctionNodes).default;
-  }
-});
-
-var _quoteName = require('./quoteName');
-
-Object.defineProperty(exports, 'quoteName', {
-  enumerable: true,
-  get: function get() {
-    return _interopRequireDefault(_quoteName).default;
-  }
-});
-
-var _spacingFixers = require('./spacingFixers');
-
-var spacingFixers = _interopRequireWildcard(_spacingFixers);
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-exports.spacingFixers = spacingFixers;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/utilities/isFlowFile.js b/node_modules/eslint-plugin-flowtype/dist/utilities/isFlowFile.js
deleted file mode 100644
index 4c9554a..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/utilities/isFlowFile.js
+++ /dev/null
@@ -1,36 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _isFlowFileAnnotation = require('./isFlowFileAnnotation');
-
-var _isFlowFileAnnotation2 = _interopRequireDefault(_isFlowFileAnnotation);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/* eslint-disable flowtype/require-valid-file-annotation */
-/**
- * Checks whether a file has an @flow or @noflow annotation.
- *
- * @param context
- * @param [strict] - By default, the function returns true if the file starts with @flow but not if it
- * starts by @noflow. When the strict flag is set to false, the function returns true if the flag has @noflow also.
- */
-/* eslint-enable flowtype/require-valid-file-annotation */
-exports.default = function (context) {
-  var strict = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
-
-  var comments = context.getAllComments();
-
-  if (!comments.length) {
-    return false;
-  }
-
-  return comments.some(function (comment) {
-    return (0, _isFlowFileAnnotation2.default)(comment.value, strict);
-  });
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/utilities/isFlowFileAnnotation.js b/node_modules/eslint-plugin-flowtype/dist/utilities/isFlowFileAnnotation.js
deleted file mode 100644
index f378fc2..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/utilities/isFlowFileAnnotation.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var FLOW_MATCHER = /^@(?:no)?flow$/;
-
-exports.default = function (comment, strict) {
-  // eslint-disable-next-line flowtype/require-valid-file-annotation
-  // The flow parser splits comments with the following regex to look for the @flow flag.
-  // See https://github.com/facebook/flow/blob/a96249b93541f2f7bfebd8d62085bf7a75de02f2/src/parsing/docblock.ml#L39
-  return _lodash2.default.some(comment.split(/[ \t\r\n\\*/]+/), function (commentPart) {
-    var match = commentPart.match(FLOW_MATCHER);
-
-    if (match === null) {
-      return false;
-    }
-
-    return !strict || match[0] === '@flow';
-  });
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/utilities/iterateFunctionNodes.js b/node_modules/eslint-plugin-flowtype/dist/utilities/iterateFunctionNodes.js
deleted file mode 100644
index bbe1c14..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/utilities/iterateFunctionNodes.js
+++ /dev/null
@@ -1,24 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = function (iterator) {
-  return function (context) {
-    for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
-      rest[_key - 1] = arguments[_key];
-    }
-
-    var nodeIterator = iterator.apply(undefined, [context].concat(rest));
-
-    return {
-      ArrowFunctionExpression: nodeIterator,
-      FunctionDeclaration: nodeIterator,
-      FunctionExpression: nodeIterator,
-      FunctionTypeAnnotation: nodeIterator
-    };
-  };
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/utilities/quoteName.js b/node_modules/eslint-plugin-flowtype/dist/utilities/quoteName.js
deleted file mode 100644
index 62917ce..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/utilities/quoteName.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = function (name) {
-  return name ? '"' + name + '" ' : '';
-};
-
-module.exports = exports.default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/dist/utilities/spacingFixers.js b/node_modules/eslint-plugin-flowtype/dist/utilities/spacingFixers.js
deleted file mode 100644
index b07d692..0000000
--- a/node_modules/eslint-plugin-flowtype/dist/utilities/spacingFixers.js
+++ /dev/null
@@ -1,64 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var stripSpacesBefore = exports.stripSpacesBefore = function stripSpacesBefore(node, spaces) {
-  return function (fixer) {
-    return fixer.removeRange([node.start - spaces, node.start]);
-  };
-};
-
-var stripSpacesAfter = exports.stripSpacesAfter = function stripSpacesAfter(node, spaces) {
-  return function (fixer) {
-    return fixer.removeRange([node.end, node.end + spaces]);
-  };
-};
-
-var addSpaceBefore = exports.addSpaceBefore = function addSpaceBefore(node) {
-  return function (fixer) {
-    return fixer.insertTextBefore(node, ' ');
-  };
-};
-
-var addSpaceAfter = exports.addSpaceAfter = function addSpaceAfter(node) {
-  return function (fixer) {
-    return fixer.insertTextAfter(node, ' ');
-  };
-};
-
-var replaceWithSpaceBefore = exports.replaceWithSpaceBefore = function replaceWithSpaceBefore(node, spaces) {
-  return function (fixer) {
-    return fixer.replaceTextRange([node.start - spaces, node.start], ' ');
-  };
-};
-
-var replaceWithSpaceAfter = exports.replaceWithSpaceAfter = function replaceWithSpaceAfter(node, spaces) {
-  return function (fixer) {
-    return fixer.replaceTextRange([node.end, node.end + spaces], ' ');
-  };
-};
-
-var stripSpaces = exports.stripSpaces = function stripSpaces(direction, node, spaces) {
-  if (direction === 'before') {
-    return stripSpacesBefore(node, spaces);
-  } else {
-    return stripSpacesAfter(node, spaces);
-  }
-};
-
-var addSpace = exports.addSpace = function addSpace(direction, node) {
-  if (direction === 'before') {
-    return addSpaceBefore(node);
-  } else {
-    return addSpaceAfter(node);
-  }
-};
-
-var replaceWithSpace = exports.replaceWithSpace = function replaceWithSpace(direction, node, spaces) {
-  if (direction === 'before') {
-    return replaceWithSpaceBefore(node, spaces);
-  } else {
-    return replaceWithSpaceAfter(node, spaces);
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/package.json b/node_modules/eslint-plugin-flowtype/package.json
deleted file mode 100644
index d7cfa2c..0000000
--- a/node_modules/eslint-plugin-flowtype/package.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
-  "author": {
-    "email": "gajus@gajus.com",
-    "name": "Gajus Kuizinas",
-    "url": "http://gajus.com"
-  },
-  "dependencies": {
-    "lodash": "^4.17.15"
-  },
-  "description": "Flowtype linting rules for ESLint.",
-  "devDependencies": {
-    "ajv": "^6.10.2",
-    "babel-cli": "^6.26.0",
-    "babel-eslint": "^10.0.2",
-    "babel-plugin-add-module-exports": "^1.0.2",
-    "babel-plugin-transform-object-rest-spread": "^6.26.0",
-    "babel-preset-env": "^1.7.0",
-    "babel-register": "^6.26.0",
-    "chai": "^4.2.0",
-    "eclint": "^2.8.1",
-    "eslint": "^5.13.0",
-    "eslint-config-canonical": "^17.3.4",
-    "gitdown": "^3.1.1",
-    "glob": "^7.1.4",
-    "husky": "^3.0.3",
-    "jsonlint": "^1.6.3",
-    "mocha": "^6.2.0",
-    "rimraf": "^3.0.0",
-    "semantic-release": "^15.13.19"
-  },
-  "engines": {
-    "node": ">=4"
-  },
-  "husky": {
-    "hooks": {
-      "pre-commit": "npm run check-docs && npm run check-tests && npm run lint && npm run test && npm run build && npm run format-json && eclint fix ./src/**/* ./tests/**/*"
-    }
-  },
-  "keywords": [
-    "eslint",
-    "plugin",
-    "flowtype"
-  ],
-  "license": "BSD-3-Clause",
-  "main": "./dist/index.js",
-  "name": "eslint-plugin-flowtype",
-  "peerDependencies": {
-    "eslint": ">=6.1.0"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/gajus/eslint-plugin-flowtype"
-  },
-  "scripts": {
-    "build": "rimraf ./dist && babel ./src --out-dir ./dist --copy-files",
-    "check-docs": "babel-node ./src/bin/checkDocs",
-    "check-tests": "babel-node ./src/bin/checkTests",
-    "create-readme": "gitdown ./.README/README.md --output-file ./README.md && npm run documentation-add-assertions",
-    "documentation-add-assertions": "babel-node ./src/bin/addAssertions",
-    "format-json": "jsonlint --sort-keys --in-place --indent \"  \" ./src/configs/recommended.json",
-    "lint": "eslint ./src ./tests",
-    "test": "mocha --require babel-core/register ./tests/rules/index.js"
-  },
-  "version": "4.6.0"
-}
diff --git a/node_modules/eslint-plugin-github/README.md b/node_modules/eslint-plugin-github/README.md
index 6b602ec..db14ae0 100644
--- a/node_modules/eslint-plugin-github/README.md
+++ b/node_modules/eslint-plugin-github/README.md
@@ -3,25 +3,36 @@
 ## Installation
 
 ```sh
-$ npm install --save-dev eslint
-$ npm install --save-dev eslint-plugin-github
+$ npm install --save-dev eslint eslint-plugin-github
 ```
 
-Run initialization wizard.
+## Setup
 
-```sh
-$ node_modules/.bin/eslint-github-init
-```
+Add `github` to your list of plugins in your ESLint config.
 
-Set up `npm run lint` script.
-
+JSON ESLint config example:
 ```json
 {
-  "private": true,
-  "scripts": {
-    "lint": "github-lint"
-  }
+  "plugins": ["github"]
 }
 ```
 
-The `github-lint` command will run `eslint`, `flow` and flow coverage checking depending on your project configuration.
+Extend the configs you wish to use.
+
+JSON ESLint config example:
+```json
+{
+  "extends": ["plugin:github/recommended"]
+}
+```
+
+The available configs are:
+
+- `app`
+  - Rules useful for github applications.
+- `browser`
+  - Useful rules when shipping your app to the browser.
+- `recommended`
+  - Recommended rules for every application.
+- `typescript`
+  - Useful rules when writing TypeScript.
diff --git a/node_modules/eslint-plugin-github/bin/eslint-github-init.js b/node_modules/eslint-plugin-github/bin/eslint-github-init.js
deleted file mode 100755
index 9ed4b48..0000000
--- a/node_modules/eslint-plugin-github/bin/eslint-github-init.js
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/env node
-
-const inquirer = require('inquirer')
-const fs = require('fs')
-const path = require('path')
-
-const defaults = {
-  project: 'lib',
-  env: 'browser',
-  typeSystem: 'none',
-  react: true,
-  relay: true
-}
-
-const packagePath = path.resolve(process.cwd(), 'package.json')
-if (fs.existsSync(packagePath)) {
-  const packageJSON = JSON.parse(fs.readFileSync(packagePath, 'utf8'))
-  defaults.project = packageJSON.private ? 'app' : 'lib'
-
-  const dependencies = Object.keys(packageJSON.dependencies || {})
-  const devDependencies = Object.keys(packageJSON.devDependencies || {})
-
-  defaults.react = dependencies.includes('react') || devDependencies.includes('react')
-  defaults.relay = dependencies.includes('relay') || devDependencies.includes('relay')
-
-  if (dependencies.includes('flow-bin') || devDependencies.includes('flow-bin')) {
-    defaults.typeSystem = 'flow'
-  }
-  if (dependencies.includes('typescript') || devDependencies.includes('typescript')) {
-    defaults.typeSystem = 'typescript'
-  }
-}
-
-const questions = [
-  {
-    type: 'list',
-    name: 'project',
-    message: 'Is this project a web app or reuseable library?',
-    choices: ['app', 'lib'],
-    default: defaults.project
-  },
-  {
-    type: 'list',
-    name: 'env',
-    message: 'Which environment does this library target?',
-    choices: ['browser', 'node'],
-    default: defaults.env
-  },
-  {
-    type: 'list',
-    name: 'typeSystem',
-    message: 'What type system are you using?',
-    choices: ['flow', 'typescript', 'none'],
-    default: defaults.typeSystem
-  },
-  {
-    type: 'confirm',
-    name: 'relay',
-    message: 'Are you using Relay?',
-    default: defaults.relay
-  },
-  {
-    type: 'confirm',
-    name: 'react',
-    message: 'Are you using React?',
-    default: defaults.react,
-    when: answers => answers.env === 'browser'
-  }
-]
-
-inquirer.prompt(questions).then(answers => {
-  const eslintrc = {extends: ['plugin:github/es6']}
-
-  if (answers.env === 'node') {
-    eslintrc.extends.push('plugin:github/node')
-  } else if (answers.project === 'app') {
-    eslintrc.extends.push('plugin:github/app')
-  } else if (answers.env === 'browser') {
-    eslintrc.extends.push('plugin:github/browser')
-  }
-
-  if (answers.typeSystem === 'flow') eslintrc.extends.push('plugin:github/flow')
-  if (answers.typeSystem === 'typescript') {
-    eslintrc.extends.push('plugin:github/typescript')
-    eslintrc.parser = '@typescript-eslint/parser'
-
-    // Create a `tsconfig.json`.
-    const tsconfigPath = path.resolve(process.cwd(), 'tsconfig.json')
-    if (!fs.existsSync(tsconfigPath)) {
-      const tsconfigDefaults = {
-        compilerOptions: {
-          target: 'es2015',
-          module: 'esnext',
-          lib: ['esnext', 'dom'],
-          allowSyntheticDefaultImports: true,
-          moduleResolution: 'node'
-        }
-      }
-      if (answers.react) {
-        tsconfigDefaults.compilerOptions.jsx = 'react'
-      }
-      fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfigDefaults, null, '  '), 'utf8')
-    }
-  }
-
-  if (answers.react) eslintrc.extends.push('plugin:github/react')
-  if (answers.relay) eslintrc.extends.push('plugin:github/relay')
-
-  fs.writeFileSync(path.resolve(process.cwd(), '.eslintrc.json'), JSON.stringify(eslintrc, null, '  '), 'utf8')
-
-  const prettierConfig = []
-  if (answers.typeSystem === 'flow') prettierConfig.push('/* @flow */')
-
-  prettierConfig.push("module.exports = require('eslint-plugin-github/prettier.config')")
-  prettierConfig.push('')
-
-  fs.writeFileSync(path.resolve(process.cwd(), 'prettier.config.js'), prettierConfig.join('\n'), 'utf8')
-})
diff --git a/node_modules/eslint-plugin-github/bin/eslint-ignore-errors.js b/node_modules/eslint-plugin-github/bin/eslint-ignore-errors.js
index 3d71b83..643d3f7 100755
--- a/node_modules/eslint-plugin-github/bin/eslint-ignore-errors.js
+++ b/node_modules/eslint-plugin-github/bin/eslint-ignore-errors.js
@@ -11,22 +11,22 @@
 const execFile = require('child_process').execFile
 
 execFile('eslint', ['--format', 'json', process.argv[2]], (error, stdout) => {
-  JSON.parse(stdout).forEach(result => {
+  for (const result of JSON.parse(stdout)) {
     const filename = result.filePath
     const jsLines = fs.readFileSync(filename, 'utf8').split('\n')
     const offensesByLine = {}
     let addedLines = 0
 
     // Produces {47: ['github/no-d-none', 'github/no-blur'], 83: ['github/no-blur']}
-    result.messages.forEach(message => {
+    for (const message of result.messages) {
       if (offensesByLine[message.line]) {
         offensesByLine[message.line].push(message.ruleId)
       } else {
         offensesByLine[message.line] = [message.ruleId]
       }
-    })
+    }
 
-    Object.keys(offensesByLine).forEach(line => {
+    for (const line of Object.keys(offensesByLine)) {
       const lineIndex = line - 1 + addedLines
       const previousLine = jsLines[lineIndex - 1]
       const ruleIds = offensesByLine[line].join(', ')
@@ -37,12 +37,12 @@
         jsLines.splice(lineIndex, 0, `${leftPad}/* eslint-disable-next-line ${ruleIds} */`)
       }
       addedLines += 1
-    })
+    }
 
     if (result.messages.length !== 0) {
       fs.writeFileSync(filename, jsLines.join('\n'), 'utf8')
     }
-  })
+  }
 })
 
 function isDisableComment(line) {
diff --git a/node_modules/eslint-plugin-github/bin/eslint-unused-modules.js b/node_modules/eslint-plugin-github/bin/eslint-unused-modules.js
deleted file mode 100755
index 9dc8ea3..0000000
--- a/node_modules/eslint-plugin-github/bin/eslint-unused-modules.js
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env node
-
-const {CLIEngine} = require('eslint')
-
-// TODO: Figure out how to deactive other rules.
-let cli = new CLIEngine({
-  rules: {
-    'github/dependency-graph': 1
-  }
-})
-cli.executeOnFiles(process.argv.slice(2))
-
-// TODO: Figure out how to deactive other rules.
-cli = new CLIEngine({
-  rules: {
-    'github/unused-export': 2,
-    'github/unused-module': 2
-  }
-})
-
-const report = cli.executeOnFiles(process.argv.slice(2))
-const formatter = cli.getFormatter()
-
-process.stdout.write(formatter(report.results))
-
-if (report.errorCount > 0) {
-  process.exit(1)
-}
diff --git a/node_modules/eslint-plugin-github/bin/flow-coverage.js b/node_modules/eslint-plugin-github/bin/flow-coverage.js
deleted file mode 100755
index 65c92bc..0000000
--- a/node_modules/eslint-plugin-github/bin/flow-coverage.js
+++ /dev/null
@@ -1,119 +0,0 @@
-#!/usr/bin/env node
-// usage: flow-coverage
-//
-// Run flow coverage on project.
-
-const childProcess = require('child_process')
-const flow = require('flow-bin')
-const fs = require('fs')
-const {join} = require('path')
-
-const execFile = (file, args) =>
-  new Promise((resolve, reject) => {
-    childProcess.execFile(
-      file,
-      args,
-      {
-        maxBuffer: Infinity
-      },
-      (error, stdout, stderr) => {
-        if (error) {
-          reject(error)
-        } else {
-          resolve({stdout, stderr})
-        }
-      }
-    )
-  })
-
-async function execFileJSON(file, args) {
-  args.push('--json')
-  const {stdout, stderr} = await execFile(file, args)
-  if (stderr) {
-    return JSON.parse(stderr)
-  } else {
-    return JSON.parse(stdout)
-  }
-}
-
-function computeCoverage(covered, uncovered) {
-  const total = covered + uncovered
-  if (total) {
-    return 100 * (covered / total)
-  } else {
-    return 100
-  }
-}
-
-async function getCoverage(path) {
-  const json = await execFileJSON(flow, ['coverage', path])
-  if (json && json.expressions) {
-    const uncoveredCount = json.expressions['uncovered_count']
-    const coveredCount = json.expressions['covered_count']
-    const covered = computeCoverage(coveredCount, uncoveredCount)
-    return {path, uncoveredCount, coveredCount, covered}
-  } else {
-    return {path, uncoveredCount: 0, coveredCount: 0, covered: 0}
-  }
-}
-
-async function startFlow() {
-  try {
-    await execFile(flow, ['start', '--wait'])
-  } catch (error) {
-    if (error.code === 11) {
-      /* already running */
-    } else {
-      throw error
-    }
-  }
-}
-
-// const ignore = [/\.flowconfig$/, /\.json$/, /\.test\.js$/, /\/__generated__\//, /\/flow-typed\//, /\/node_modules\//]
-//
-// async function flowList() {
-//   execFile('git', ['grep', '--name-only', '--', '@flow'])
-//
-//   const paths = await execFileJSON(flow, ['ls'])
-//   return paths.filter(path => !ignore.some(re => re.test(path)))
-// }
-
-async function grepFlowFiles() {
-  const {stdout} = await execFile('git', ['grep', '--null', '--name-only', '--', '@flow'])
-  return stdout.split('\0').filter(path => path)
-}
-
-;(async function() {
-  let threshold = 0
-
-  const packageJsonPath = join(process.cwd(), 'package.json')
-  if (fs.existsSync(packageJsonPath)) {
-    const packageJson = require(packageJsonPath)
-    threshold = (packageJson.flow && packageJson.flow.coverageThreshold) || 0
-  }
-
-  await startFlow()
-
-  const files = await grepFlowFiles()
-
-  let totalCoveredCount = 0
-  let totalUncoveredCount = 0
-
-  for (const file of files) {
-    const {path, covered, coveredCount, uncoveredCount} = await getCoverage(file)
-    process.stdout.write(`${covered.toFixed()}\t${path}\n`)
-    totalCoveredCount += coveredCount
-    totalUncoveredCount += uncoveredCount
-  }
-
-  const totalCoverage = computeCoverage(totalCoveredCount, totalUncoveredCount)
-
-  process.stdout.write(`${totalCoverage.toFixed()}\t(total)\n`)
-  if (totalCoverage < threshold) {
-    process.stderr.write(`expected at least ${threshold}% coverage, but was ${totalCoverage.toFixed()}%\n`)
-    process.exit(1)
-  }
-})().catch(error => {
-  process.stderr.write(`${error}\n`)
-  process.exit(2)
-})
diff --git a/node_modules/eslint-plugin-github/bin/github-lint.js b/node_modules/eslint-plugin-github/bin/github-lint.js
deleted file mode 100755
index e9998be..0000000
--- a/node_modules/eslint-plugin-github/bin/github-lint.js
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/env node
-// usage: github-lint
-//
-// Run ESLint and Flow on project.
-
-const childProcess = require('child_process')
-const fs = require('fs')
-const path = require('path')
-const supportsColors = require('supports-color')
-
-const hasBasicColorSupport = supportsColors.stdout.hasBasic && supportsColors.stderr.hasBasic
-
-function execFile(command, args) {
-  return new Promise(resolve => {
-    childProcess.execFile(command, args, {maxBuffer: 1024 ** 2}, (error, stdout, stderr) => {
-      resolve({code: error ? error.code : 0, stdout, stderr})
-    })
-  })
-}
-
-;(async function() {
-  let runs = 0
-  const codes = []
-  const commands = []
-
-  const packageJson = fs.existsSync('package.json') ? require(path.join(process.cwd(), 'package.json')) : {}
-
-  let eslintOptions = ['--report-unused-disable-directives', '.']
-
-  if (hasBasicColorSupport) {
-    eslintOptions = eslintOptions.concat(['--color'])
-  }
-
-  const isTypeScriptProject = fs.existsSync('tsconfig.json')
-
-  if (isTypeScriptProject) {
-    eslintOptions = eslintOptions.concat(['--ext', '.js,.ts,.tsx'])
-  }
-
-  commands.push(['eslint', eslintOptions])
-
-  if (isTypeScriptProject) {
-    commands.push(['tsc', ['--noEmit']])
-  }
-
-  if (fs.existsSync('.flowconfig')) {
-    commands.push(['flow', ['check']])
-  }
-
-  if (packageJson && packageJson.flow && packageJson.flow.coverageThreshold) {
-    commands.push(['flow-coverage', []])
-  }
-
-  for (const [command, args] of commands) {
-    if (runs > 0) process.stderr.write('\n')
-    process.stderr.write(`> ${command} ${args.join(' ')}\n`)
-
-    const {code, stdout, stderr} = await execFile(command, args)
-    codes.push(code)
-    if (stderr) process.stderr.write(stderr)
-    if (stdout) process.stdout.write(stdout)
-
-    runs++
-  }
-
-  const nonzero = codes.find(code => code !== 0)
-  if (nonzero) {
-    process.stderr.write(`\nCommand failed: ${nonzero}\n`)
-    process.exit(nonzero)
-  }
-})().catch(error => {
-  setTimeout(() => {
-    throw error
-  })
-})
diff --git a/node_modules/eslint-plugin-github/bin/npm-check-github-package-requirements.js b/node_modules/eslint-plugin-github/bin/npm-check-github-package-requirements.js
deleted file mode 100755
index c55b0d8..0000000
--- a/node_modules/eslint-plugin-github/bin/npm-check-github-package-requirements.js
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env node
-
-const fs = require('fs')
-const path = require('path')
-
-const checks = []
-function check(name, callback) {
-  checks.push([checks.length + 1, name, callback])
-}
-
-function run() {
-  process.stdout.write(`1..${checks.length}\n`)
-  checks.forEach(([count, name, callback]) => {
-    Promise.resolve()
-      .then(callback)
-      .then(() => {
-        process.stdout.write(`ok ${count} - ${name}\n`)
-      })
-      .catch(error => {
-        process.stdout.write(`not ok ${count} - ${name}\n  ${error}\n`)
-      })
-  })
-}
-
-const packageRoot = process.argv[2]
-
-check('package.json exists', () => {
-  const packageJsonPath = path.join(packageRoot, 'package.json')
-
-  if (!fs.existsSync(packageJsonPath)) {
-    throw new Error('package.json does not exist')
-  }
-})
-
-check('package.json license is set', () => {
-  const packageJsonPath = path.join(packageRoot, 'package.json')
-  const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
-
-  if (!pkg.license) {
-    throw new Error('license not set')
-  }
-})
-
-run()
diff --git a/node_modules/eslint-plugin-github/lib/configs/app.js b/node_modules/eslint-plugin-github/lib/configs/app.js
deleted file mode 100644
index fa41d90..0000000
--- a/node_modules/eslint-plugin-github/lib/configs/app.js
+++ /dev/null
@@ -1,11 +0,0 @@
-module.exports = {
-  plugins: ['github'],
-  rules: {
-    'github/authenticity-token': 'error',
-    'github/js-class-name': 'error',
-    'github/no-d-none': 'error',
-    'github/no-dataset': 'error',
-    'github/no-then': 'error'
-  },
-  extends: [require.resolve('./recommended'), require.resolve('./es6'), require.resolve('./browser')]
-}
diff --git a/node_modules/eslint-plugin-github/lib/configs/browser.js b/node_modules/eslint-plugin-github/lib/configs/browser.js
index aceab84..c2e5c44 100644
--- a/node_modules/eslint-plugin-github/lib/configs/browser.js
+++ b/node_modules/eslint-plugin-github/lib/configs/browser.js
@@ -8,8 +8,11 @@
     'github/async-preventdefault': 'error',
     'github/get-attribute': 'error',
     'github/no-blur': 'error',
+    'github/no-dataset': 'error',
     'github/no-innerText': 'error',
-    'github/unescaped-html-literal': 'error'
-  },
-  extends: [require.resolve('./recommended')]
+    'github/unescaped-html-literal': 'error',
+    'github/no-useless-passive': 'error',
+    'github/require-passive-events': 'error',
+    'github/prefer-observers': 'error'
+  }
 }
diff --git a/node_modules/eslint-plugin-github/lib/configs/es6.js b/node_modules/eslint-plugin-github/lib/configs/es6.js
deleted file mode 100644
index a2ec3eb..0000000
--- a/node_modules/eslint-plugin-github/lib/configs/es6.js
+++ /dev/null
@@ -1,51 +0,0 @@
-module.exports = {
-  parserOptions: {
-    ecmaFeatures: {
-      ecmaVersion: 6
-    },
-    sourceType: 'module'
-  },
-  env: {
-    es6: true
-  },
-  plugins: ['github', 'import'],
-  rules: {
-    'github/array-foreach': 'error',
-    'import/default': 'error',
-    'import/export': 'error',
-    'import/first': 'error',
-    'import/named': 'error',
-    'import/namespace': 'error',
-    'import/no-absolute-path': 'error',
-    'import/no-anonymous-default-export': [
-      'error',
-      {
-        allowAnonymousClass: false,
-        allowAnonymousFunction: false,
-        allowArray: true,
-        allowArrowFunction: false,
-        allowLiteral: true,
-        allowObject: true
-      }
-    ],
-    'import/no-deprecated': 'error',
-    'import/no-duplicates': 'error',
-    'import/no-mutable-exports': 'error',
-    'import/no-named-as-default-member': 'error',
-    'import/no-named-as-default': 'error',
-    'import/no-namespace': 'error',
-    'no-var': 'error',
-    'prefer-const': 'error',
-    'prefer-rest-params': 'error',
-    'prefer-spread': 'error',
-    'prefer-template': 'error'
-  },
-  settings: {
-    'import/resolver': {
-      node: {
-        extensions: ['.js', '.ts']
-      }
-    }
-  },
-  extends: [require.resolve('./recommended')]
-}
diff --git a/node_modules/eslint-plugin-github/lib/configs/flow.js b/node_modules/eslint-plugin-github/lib/configs/flow.js
deleted file mode 100644
index 84050a4..0000000
--- a/node_modules/eslint-plugin-github/lib/configs/flow.js
+++ /dev/null
@@ -1,14 +0,0 @@
-module.exports = {
-  parser: 'babel-eslint',
-  plugins: ['flowtype', 'github'],
-  rules: {
-    'flowtype/define-flow-type': 'error',
-    'flowtype/require-valid-file-annotation': ['error', 'always', {annotationStyle: 'block'}],
-    'flowtype/use-flow-type': 'error',
-    'flowtype/no-flow-fix-me-comments': 'error',
-    'flowtype/no-primitive-constructor-types': 'error',
-    'flowtype/no-weak-types': 'error',
-    'github/no-flow-weak': 'error',
-    'github/no-noflow': 'error'
-  }
-}
diff --git a/node_modules/eslint-plugin-github/lib/configs/internal.js b/node_modules/eslint-plugin-github/lib/configs/internal.js
new file mode 100644
index 0000000..8de1086
--- /dev/null
+++ b/node_modules/eslint-plugin-github/lib/configs/internal.js
@@ -0,0 +1,8 @@
+module.exports = {
+  plugins: ['github'],
+  rules: {
+    'github/authenticity-token': 'error',
+    'github/js-class-name': 'error',
+    'github/no-d-none': 'error'
+  }
+}
diff --git a/node_modules/eslint-plugin-github/lib/configs/node.js b/node_modules/eslint-plugin-github/lib/configs/node.js
deleted file mode 100644
index 637faa7..0000000
--- a/node_modules/eslint-plugin-github/lib/configs/node.js
+++ /dev/null
@@ -1,11 +0,0 @@
-module.exports = {
-  parser: 'babel-eslint',
-  env: {
-    node: true
-  },
-  plugins: ['github'],
-  rules: {
-    'no-console': 'off'
-  },
-  extends: [require.resolve('./recommended')]
-}
diff --git a/node_modules/eslint-plugin-github/lib/configs/react.js b/node_modules/eslint-plugin-github/lib/configs/react.js
deleted file mode 100644
index afd311d..0000000
--- a/node_modules/eslint-plugin-github/lib/configs/react.js
+++ /dev/null
@@ -1,136 +0,0 @@
-module.exports = {
-  parser: 'babel-eslint',
-  parserOptions: {
-    ecmaFeatures: {
-      jsx: true
-    }
-  },
-  settings: {
-    react: {
-      version: 'detect'
-    }
-  },
-  env: {
-    jest: true,
-    node: true
-  },
-  plugins: ['jest', 'jsx-a11y', 'react', 'relay'],
-  rules: {
-    'jest/no-disabled-tests': 'warn',
-    'jest/no-focused-tests': 'error',
-    'jest/no-identical-title': 'error',
-    'jest/valid-expect': 'error',
-    'jsx-a11y/accessible-emoji': 'error',
-    'jsx-a11y/alt-text': 'error',
-    'jsx-a11y/anchor-has-content': 'error',
-    'jsx-a11y/anchor-is-valid': 'error',
-    'jsx-a11y/aria-activedescendant-has-tabindex': 'error',
-    'jsx-a11y/aria-props': 'error',
-    'jsx-a11y/aria-proptypes': 'error',
-    'jsx-a11y/aria-role': 'error',
-    'jsx-a11y/aria-unsupported-elements': 'error',
-    'jsx-a11y/click-events-have-key-events': 'error',
-    'jsx-a11y/heading-has-content': 'error',
-    'jsx-a11y/html-has-lang': 'error',
-    'jsx-a11y/iframe-has-title': 'error',
-    'jsx-a11y/img-redundant-alt': 'error',
-    'jsx-a11y/interactive-supports-focus': [
-      'error',
-      {
-        tabbable: ['button', 'checkbox', 'link', 'searchbox', 'spinbutton', 'switch', 'textbox']
-      }
-    ],
-    'jsx-a11y/label-has-for': [
-      2,
-      {
-        components: ['Label'],
-        required: {
-          some: ['nesting', 'id']
-        },
-        allowChildren: false
-      }
-    ],
-    'jsx-a11y/media-has-caption': 'error',
-    'jsx-a11y/mouse-events-have-key-events': 'error',
-    'jsx-a11y/no-access-key': 'error',
-    'jsx-a11y/no-autofocus': 'error',
-    'jsx-a11y/no-distracting-elements': 'error',
-
-    'jsx-a11y/no-interactive-element-to-noninteractive-role': [
-      'error',
-      {
-        tr: ['none', 'presentation']
-      }
-    ],
-    'jsx-a11y/no-noninteractive-element-interactions': [
-      'error',
-      {
-        handlers: ['onClick', 'onMouseDown', 'onMouseUp', 'onKeyPress', 'onKeyDown', 'onKeyUp']
-      }
-    ],
-    'jsx-a11y/no-noninteractive-element-to-interactive-role': [
-      'error',
-      {
-        ul: ['listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'],
-        ol: ['listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'],
-        li: ['menuitem', 'option', 'row', 'tab', 'treeitem'],
-        table: ['grid'],
-        td: ['gridcell']
-      }
-    ],
-    'jsx-a11y/no-noninteractive-tabindex': [
-      'error',
-      {
-        tags: [],
-        roles: ['tabpanel']
-      }
-    ],
-    'jsx-a11y/no-onchange': 'error',
-    'jsx-a11y/no-redundant-roles': 'error',
-    'jsx-a11y/no-static-element-interactions': [
-      'error',
-      {
-        handlers: ['onClick', 'onMouseDown', 'onMouseUp', 'onKeyPress', 'onKeyDown', 'onKeyUp']
-      }
-    ],
-    'jsx-a11y/role-has-required-aria-props': 'error',
-    'jsx-a11y/role-supports-aria-props': 'error',
-    'jsx-a11y/scope': 'error',
-    'jsx-a11y/tabindex-no-positive': 'error',
-    'react/jsx-boolean-value': 'error',
-    'react/jsx-handler-names': 'error',
-    'react/jsx-key': 'error',
-    'react/jsx-no-duplicate-props': 'error',
-    'react/jsx-no-undef': 'error',
-    'react/jsx-pascal-case': 'error',
-    'react/jsx-uses-react': 'error',
-    'react/jsx-uses-vars': 'error',
-    'react/no-array-index-key': 'error',
-    'react/no-children-prop': 'error',
-    'react/no-danger-with-children': 'error',
-    'react/no-danger': 'error',
-    'react/no-deprecated': 'error',
-    'react/no-did-mount-set-state': 'error',
-    'react/no-did-update-set-state': 'error',
-    'react/no-direct-mutation-state': 'error',
-    'react/no-find-dom-node': 'error',
-    'react/no-is-mounted': 'error',
-    'react/no-multi-comp': ['error', {ignoreStateless: true}],
-    'react/no-render-return-value': 'error',
-    'react/no-string-refs': 'error',
-    'react/no-unknown-property': 'error',
-    'react/no-unused-prop-types': 'error',
-    'react/prefer-es6-class': 'error',
-    'react/prefer-stateless-function': 'error',
-    'react/react-in-jsx-scope': 'error',
-    'react/require-render-return': 'error',
-    'react/self-closing-comp': 'error',
-    'react/sort-comp': 'error',
-    'react/sort-prop-types': 'error',
-    'react/style-prop-object': 'error',
-    'react/void-dom-elements-no-children': 'error',
-    'relay/graphql-naming': 'error',
-    'relay/graphql-syntax': 'error'
-  },
-  extends: [require.resolve('./browser')]
-}
diff --git a/node_modules/eslint-plugin-github/lib/configs/recommended.js b/node_modules/eslint-plugin-github/lib/configs/recommended.js
index 45f5170..c164a39 100644
--- a/node_modules/eslint-plugin-github/lib/configs/recommended.js
+++ b/node_modules/eslint-plugin-github/lib/configs/recommended.js
@@ -1,8 +1,14 @@
 module.exports = {
-  plugins: ['github', 'prettier', 'eslint-comments', 'jsdoc'],
-  env: {
-    commonjs: true
+  parserOptions: {
+    ecmaFeatures: {
+      ecmaVersion: 6
+    },
+    sourceType: 'module'
   },
+  env: {
+    es6: true
+  },
+  plugins: ['github', 'prettier', 'eslint-comments', 'import'],
   rules: {
     'constructor-super': 'error',
     'eslint-comments/disable-enable-pair': 'off',
@@ -13,28 +19,32 @@
     'eslint-comments/no-unused-enable': 'error',
     'eslint-comments/no-use': ['error', {allow: ['eslint', 'eslint-disable-next-line', 'eslint-env', 'globals']}],
     'func-style': ['error', 'declaration', {allowArrowFunctions: true}],
+    'github/array-foreach': 'error',
     'github/no-implicit-buggy-globals': 'error',
-    'jsdoc/check-alignment': 'error',
-    'jsdoc/check-examples': ['error', {rejectExampleCodeRegex: '<.*>'}],
-    'jsdoc/check-param-names': 'error',
-    'jsdoc/check-syntax': 'error',
-    'jsdoc/check-tag-names': 'error',
-    'jsdoc/check-types': 'error',
-    'jsdoc/implements-on-classes': 'error',
-    'jsdoc/match-description': 'error',
-    'jsdoc/newline-after-description': 'error',
-    'jsdoc/require-description': 'error',
-    'jsdoc/require-description-complete-sentence': 'error',
-    'jsdoc/require-hyphen-before-param-description': 'error',
-    'jsdoc/require-param': 'error',
-    'jsdoc/require-param-description': 'error',
-    'jsdoc/require-param-name': 'error',
-    'jsdoc/require-param-type': 'error',
-    'jsdoc/require-returns': 'error',
-    'jsdoc/require-returns-check': 'error',
-    'jsdoc/require-returns-description': 'error',
-    'jsdoc/require-returns-type': 'error',
-    'jsdoc/valid-types': 'error',
+    'github/no-then': 'error',
+    'import/default': 'error',
+    'import/export': 'error',
+    'import/first': 'error',
+    'import/named': 'error',
+    'import/namespace': 'error',
+    'import/no-absolute-path': 'error',
+    'import/no-anonymous-default-export': [
+      'error',
+      {
+        allowAnonymousClass: false,
+        allowAnonymousFunction: false,
+        allowArray: true,
+        allowArrowFunction: false,
+        allowLiteral: true,
+        allowObject: true
+      }
+    ],
+    'import/no-deprecated': 'error',
+    'import/no-duplicates': 'error',
+    'import/no-mutable-exports': 'error',
+    'import/no-named-as-default': 'error',
+    'import/no-named-as-default-member': 'error',
+    'import/no-namespace': 'error',
     'no-case-declarations': 'error',
     'no-class-assign': 'error',
     'no-compare-neg-zero': 'error',
@@ -82,13 +92,25 @@
     'no-unused-vars': 'error',
     'no-useless-concat': 'error',
     'no-useless-escape': 'error',
+    'no-var': 'error',
     'object-shorthand': ['error', 'always', {avoidQuotes: true}],
+    'prefer-const': 'error',
     'prefer-promise-reject-errors': 'error',
+    'prefer-rest-params': 'error',
+    'prefer-spread': 'error',
+    'prefer-template': 'error',
     'prettier/prettier': 'error',
     'require-yield': 'error',
     'use-isnan': 'error',
     'valid-typeof': 'error',
     camelcase: ['error', {properties: 'always'}],
     eqeqeq: ['error', 'smart']
+  },
+  settings: {
+    'import/resolver': {
+      node: {
+        extensions: ['.js', '.ts']
+      }
+    }
   }
 }
diff --git a/node_modules/eslint-plugin-github/lib/configs/relay.js b/node_modules/eslint-plugin-github/lib/configs/relay.js
deleted file mode 100644
index 45b9b3e..0000000
--- a/node_modules/eslint-plugin-github/lib/configs/relay.js
+++ /dev/null
@@ -1,13 +0,0 @@
-module.exports = {
-  parser: 'babel-eslint',
-  plugins: ['graphql'],
-  rules: {
-    'graphql/no-deprecated-fields': [
-      'error',
-      {
-        env: 'relay',
-        tagName: 'graphql'
-      }
-    ]
-  }
-}
diff --git a/node_modules/eslint-plugin-github/lib/configs/typescript.js b/node_modules/eslint-plugin-github/lib/configs/typescript.js
index 3ae2440..ff480be 100644
--- a/node_modules/eslint-plugin-github/lib/configs/typescript.js
+++ b/node_modules/eslint-plugin-github/lib/configs/typescript.js
@@ -1,13 +1,15 @@
 module.exports = {
   extends: ['plugin:@typescript-eslint/recommended', 'prettier', 'prettier/@typescript-eslint'],
-  parserOptions: {
-    project: './tsconfig.json'
-  },
+  parser: '@typescript-eslint/parser',
   plugins: ['@typescript-eslint', 'github'],
   rules: {
+    camelcase: 'off',
+    'no-unused-vars': 'off',
+    '@typescript-eslint/interface-name-prefix': 'off',
     '@typescript-eslint/array-type': ['error', {default: 'array-simple'}],
     '@typescript-eslint/no-use-before-define': 'off',
     '@typescript-eslint/explicit-member-accessibility': 'off',
-    '@typescript-eslint/explicit-function-return-type': 'off'
+    '@typescript-eslint/explicit-function-return-type': 'off',
+    '@typescript-eslint/no-non-null-assertion': 'off'
   }
 }
diff --git a/node_modules/eslint-plugin-github/lib/dependency-graph.js b/node_modules/eslint-plugin-github/lib/dependency-graph.js
deleted file mode 100644
index d92a38e..0000000
--- a/node_modules/eslint-plugin-github/lib/dependency-graph.js
+++ /dev/null
@@ -1,67 +0,0 @@
-const readPkgUp = require('read-pkg-up')
-const path = require('path')
-
-const dependencyGraph = new Map()
-exports.dependencyGraph = dependencyGraph
-
-exports.entries = new Set()
-
-const entryWhitelist = [/\/tests?\//, /\.test\.js$/, /\.config\.js$/]
-
-exports.checkEntriesWhitelist = filename => {
-  for (const re of entryWhitelist) {
-    if (re.test(filename)) {
-      exports.entries.add(filename)
-    }
-  }
-}
-
-const packageFile = readPkgUp.sync()
-
-function recordPackageEntry(entry) {
-  exports.entries.add(path.resolve(packageFile.path, '..', entry))
-}
-
-if (packageFile) {
-  for (const key in packageFile.packageJson) {
-    if (key === 'main') {
-      recordPackageEntry(packageFile.packageJson.main)
-    } else if (key === 'entries') {
-      packageFile.packageJson.entries.forEach(recordPackageEntry)
-    } else if (/-bundles$/.test(key)) {
-      // github-asset-pipeline internal manifest format
-      Object.keys(packageFile.packageJson[key]).forEach(recordPackageEntry)
-    }
-  }
-}
-
-function gatherImported() {
-  const filenames = new Set()
-  const identifiers = new Set()
-
-  for (const {imports} of dependencyGraph.values()) {
-    for (const [importedFilename, importedIdentifiers] of imports) {
-      // require.resolve will expand any symlinks to their fully qualified
-      // directories. We can use this (with the absolute path given in
-      // importedFilename to quickly expand symlinks, which allows us to have
-      // symlinks (aka workspaces) in node_modules, and not fail the lint.
-      const fullyQualifiedImportedFilename = require.resolve(importedFilename)
-      filenames.add(fullyQualifiedImportedFilename)
-
-      for (const importedIdentifier of importedIdentifiers) {
-        identifiers.add(`${fullyQualifiedImportedFilename}#${importedIdentifier}`)
-      }
-    }
-  }
-
-  return {filenames, identifiers}
-}
-
-let importedCache = null
-
-exports.imported = function() {
-  if (!importedCache) {
-    importedCache = gatherImported()
-  }
-  return importedCache
-}
diff --git a/node_modules/eslint-plugin-github/lib/index.js b/node_modules/eslint-plugin-github/lib/index.js
index 748c326..63f9847 100644
--- a/node_modules/eslint-plugin-github/lib/index.js
+++ b/node_modules/eslint-plugin-github/lib/index.js
@@ -4,31 +4,23 @@
     'async-currenttarget': require('./rules/async-currenttarget'),
     'async-preventdefault': require('./rules/async-preventdefault'),
     'authenticity-token': require('./rules/authenticity-token'),
-    'dependency-graph': require('./rules/dependency-graph'),
-    'flow-to-typescript': require('./rules/flow-to-typescript'),
     'get-attribute': require('./rules/get-attribute'),
     'js-class-name': require('./rules/js-class-name'),
     'no-blur': require('./rules/no-blur'),
     'no-d-none': require('./rules/no-d-none'),
     'no-dataset': require('./rules/no-dataset'),
-    'no-flow-weak': require('./rules/no-flow-weak'),
     'no-implicit-buggy-globals': require('./rules/no-implicit-buggy-globals'),
     'no-innerText': require('./rules/no-innerText'),
-    'no-noflow': require('./rules/no-noflow'),
     'no-then': require('./rules/no-then'),
     'unescaped-html-literal': require('./rules/unescaped-html-literal'),
-    'unused-export': require('./rules/unused-export'),
-    'unused-module': require('./rules/unused-module')
+    'no-useless-passive': require('./rules/no-useless-passive'),
+    'prefer-observers': require('./rules/prefer-observers'),
+    'require-passive-events': require('./rules/require-passive-events')
   },
   configs: {
-    app: require('./configs/app'),
+    internal: require('./configs/internal'),
     browser: require('./configs/browser'),
-    es6: require('./configs/es6'),
-    flow: require('./configs/flow'),
-    node: require('./configs/node'),
-    react: require('./configs/react'),
     recommended: require('./configs/recommended'),
-    relay: require('./configs/relay'),
     typescript: require('./configs/typescript')
   }
 }
diff --git a/node_modules/eslint-plugin-github/lib/rules/dependency-graph.js b/node_modules/eslint-plugin-github/lib/rules/dependency-graph.js
deleted file mode 100644
index e830477..0000000
--- a/node_modules/eslint-plugin-github/lib/rules/dependency-graph.js
+++ /dev/null
@@ -1,110 +0,0 @@
-const resolve = require('eslint-module-utils/resolve').default
-
-const {dependencyGraph, checkEntriesWhitelist, entries} = require('../dependency-graph')
-
-const STAR = '*'
-const DEFAULT = 'default'
-
-module.exports = {
-  meta: {
-    docs: {}
-  },
-
-  create(context) {
-    const filename = context.getFilename()
-    const sourceCode = context.getSourceCode()
-
-    const imports = new Map()
-    const exports = new Set()
-
-    checkEntriesWhitelist(filename)
-
-    function recordImport(importPath, symbol) {
-      let symbols = imports.get(importPath)
-      if (!symbols) {
-        symbols = new Set()
-        imports.set(importPath, symbols)
-      }
-
-      if (symbol) {
-        symbols.add(symbol)
-      }
-    }
-
-    function recordExport(symbol) {
-      if (symbol) {
-        exports.add(symbol)
-      }
-    }
-
-    return {
-      ImportDeclaration(node) {
-        const resolvedPath = resolve(node.source.value, context)
-        if (!resolvedPath) {
-          return
-        }
-
-        recordImport(resolvedPath)
-
-        node.specifiers.forEach(specifier => {
-          if (specifier.type === 'ImportDefaultSpecifier') {
-            recordImport(resolvedPath, DEFAULT)
-          } else if (specifier.type === 'ImportSpecifier') {
-            recordImport(resolvedPath, specifier.imported.name)
-          }
-        })
-      },
-      ExportDefaultDeclaration() {
-        recordExport(DEFAULT)
-      },
-      ExportNamedDeclaration(node) {
-        if (node.declaration == null) return
-
-        if (node.declaration.id != null) {
-          recordExport(node.declaration.id.name)
-        }
-
-        if (node.declaration.declarations != null) {
-          for (const declaration of node.declaration.declarations) {
-            recordExport(declaration.id.name)
-          }
-        }
-      },
-      CallExpression(node) {
-        if (node.callee.type === 'Identifier' && node.callee.name === 'require' && node.arguments.length === 1) {
-          const pathNode = node.arguments[0]
-          if (pathNode.type === 'Literal' && typeof pathNode.value === 'string') {
-            const resolvedPath =
-              pathNode.type === 'Literal' && typeof pathNode.value === 'string' && resolve(pathNode.value, context)
-
-            if (resolvedPath) {
-              recordImport(resolvedPath, STAR)
-            }
-          }
-        }
-      },
-      MemberExpression(node) {
-        if (context.getScope().type !== 'module') {
-          return
-        }
-
-        if (node.object.name === 'module' && node.property.name === 'exports') {
-          recordExport(DEFAULT)
-        }
-
-        if (node.object.name === 'exports') {
-          recordExport(node.property.name)
-        }
-      },
-      Program() {
-        const comments = sourceCode.getAllComments()
-        if (comments.some(token => token.type === 'Shebang')) {
-          entries.add(filename)
-        }
-      },
-      'Program:exit': function() {
-        dependencyGraph.set(filename, {imports, exports})
-      }
-    }
-  }
-}
diff --git a/node_modules/eslint-plugin-github/lib/rules/flow-to-typescript.js b/node_modules/eslint-plugin-github/lib/rules/flow-to-typescript.js
deleted file mode 100644
index b681d93..0000000
--- a/node_modules/eslint-plugin-github/lib/rules/flow-to-typescript.js
+++ /dev/null
@@ -1,18 +0,0 @@
-module.exports = {
-  meta: {
-    docs: {},
-    schema: []
-  },
-
-  create(context) {
-    return {
-      Program(node) {
-        const comments = context.getSourceCode().getAllComments()
-        const enabledTypeChecker = comments.some(comment => comment.value.trim().match(/@ts-check|@flow/))
-        if (!enabledTypeChecker) {
-          context.report(node, 'File must be type checked by TypeScript or Flow.')
-        }
-      }
-    }
-  }
-}
diff --git a/node_modules/eslint-plugin-github/lib/rules/js-class-name.js b/node_modules/eslint-plugin-github/lib/rules/js-class-name.js
index 14f27a1..e2f2a6c 100644
--- a/node_modules/eslint-plugin-github/lib/rules/js-class-name.js
+++ b/node_modules/eslint-plugin-github/lib/rules/js-class-name.js
@@ -5,17 +5,17 @@
   },
 
   create(context) {
-    var allJsClassNameRegexp = /\bjs-[_a-zA-Z0-9-]*/g
-    var validJsClassNameRegexp = /^js(-[a-z0-9]+)+$/g
-    var endWithJsClassNameRegexp = /\bjs-[_a-zA-Z0-9-]*$/g
+    const allJsClassNameRegexp = /\bjs-[_a-zA-Z0-9-]*/g
+    const validJsClassNameRegexp = /^js(-[a-z0-9]+)+$/g
+    const endWithJsClassNameRegexp = /\bjs-[_a-zA-Z0-9-]*$/g
 
     function checkStringFormat(node, str) {
-      var matches = str.match(allJsClassNameRegexp) || []
-      matches.forEach(function(match) {
+      const matches = str.match(allJsClassNameRegexp) || []
+      for (const match of matches) {
         if (!match.match(validJsClassNameRegexp)) {
           context.report(node, 'js- class names should be lowercase and only contain dashes.')
         }
-      })
+      }
     }
 
     function checkStringEndsWithJSClassName(node, str) {
@@ -40,13 +40,13 @@
         }
       },
       TemplateLiteral(node) {
-        node.quasis.forEach(function(quasi) {
+        for (const quasi of node.quasis) {
           checkStringFormat(quasi, quasi.value.raw)
 
           if (quasi.tail === false) {
             checkStringEndsWithJSClassName(quasi, quasi.value.raw)
           }
-        })
+        }
       }
     }
   }
diff --git a/node_modules/eslint-plugin-github/lib/rules/no-flow-weak.js b/node_modules/eslint-plugin-github/lib/rules/no-flow-weak.js
deleted file mode 100644
index bcd9c96..0000000
--- a/node_modules/eslint-plugin-github/lib/rules/no-flow-weak.js
+++ /dev/null
@@ -1,24 +0,0 @@
-module.exports = {
-  meta: {
-    docs: {},
-    schema: []
-  },
-
-  create(context) {
-    function handleComment(comment) {
-      var value = comment.value.trim()
-      if (value.match(/@flow weak/)) {
-        context.report(comment, "Do not use Flow 'weak' mode checking, use @flow instead.")
-      }
-    }
-
-    return {
-      LineComment: handleComment,
-      BlockComment: handleComment,
-      Program() {
-        const comments = context.getSourceCode().getAllComments()
-        comments.forEach(handleComment)
-      }
-    }
-  }
-}
diff --git a/node_modules/eslint-plugin-github/lib/rules/no-implicit-buggy-globals.js b/node_modules/eslint-plugin-github/lib/rules/no-implicit-buggy-globals.js
index ef48b02..6634881 100644
--- a/node_modules/eslint-plugin-github/lib/rules/no-implicit-buggy-globals.js
+++ b/node_modules/eslint-plugin-github/lib/rules/no-implicit-buggy-globals.js
@@ -7,14 +7,14 @@
   create(context) {
     return {
       Program() {
-        var scope = context.getScope()
+        const scope = context.getScope()
 
-        scope.variables.forEach(function(variable) {
+        for (const variable of scope.variables) {
           if (variable.writeable) {
             return
           }
 
-          variable.defs.forEach(function(def) {
+          for (const def of variable.defs) {
             if (
               def.type === 'FunctionName' ||
               def.type === 'ClassName' ||
@@ -23,8 +23,8 @@
             ) {
               context.report(def.node, 'Implicit global variable, assign as global property instead.')
             }
-          })
-        })
+          }
+        }
       }
     }
   }
diff --git a/node_modules/eslint-plugin-github/lib/rules/no-noflow.js b/node_modules/eslint-plugin-github/lib/rules/no-noflow.js
deleted file mode 100644
index 4d8d35a..0000000
--- a/node_modules/eslint-plugin-github/lib/rules/no-noflow.js
+++ /dev/null
@@ -1,24 +0,0 @@
-module.exports = {
-  meta: {
-    docs: {},
-    schema: []
-  },
-
-  create(context) {
-    function handleComment(comment) {
-      var value = comment.value.trim()
-      if (value.match(/@noflow/)) {
-        context.report(comment, 'Do not disable Flow type checker, use @flow instead.')
-      }
-    }
-
-    return {
-      LineComment: handleComment,
-      BlockComment: handleComment,
-      Program() {
-        const comments = context.getSourceCode().getAllComments()
-        comments.forEach(handleComment)
-      }
-    }
-  }
-}
diff --git a/node_modules/eslint-plugin-github/lib/rules/no-useless-passive.js b/node_modules/eslint-plugin-github/lib/rules/no-useless-passive.js
new file mode 100644
index 0000000..f9eef57
--- /dev/null
+++ b/node_modules/eslint-plugin-github/lib/rules/no-useless-passive.js
@@ -0,0 +1,46 @@
+const passiveEventListenerNames = new Set(['touchstart', 'touchmove', 'wheel', 'mousewheel'])
+
+const propIsPassiveTrue = prop => prop.key && prop.key.name === 'passive' && prop.value && prop.value.value === true
+
+module.exports = {
+  meta: {
+    docs: {},
+    fixable: 'code'
+  },
+
+  create(context) {
+    return {
+      ['CallExpression[callee.property.name="addEventListener"]']: function(node) {
+        const [name, listener, options] = node.arguments
+        if (name.type !== 'Literal') return
+        if (passiveEventListenerNames.has(name.value)) return
+        if (options && options.type === 'ObjectExpression') {
+          const i = options.properties.findIndex(propIsPassiveTrue)
+          if (i === -1) return
+          const passiveProp = options.properties[i]
+          const l = options.properties.length
+          const source = context.getSourceCode()
+          context.report({
+            node: passiveProp,
+            message: `"${name.value}" event listener is not cancellable and so \`passive: true\` does nothing.`,
+            fix(fixer) {
+              const removals = []
+              if (l === 1) {
+                removals.push(options)
+                removals.push(...source.getTokensBetween(listener, options))
+              } else {
+                removals.push(passiveProp)
+                if (i > 0) {
+                  removals.push(...source.getTokensBetween(options.properties[i - 1], passiveProp))
+                } else {
+                  removals.push(...source.getTokensBetween(passiveProp, options.properties[i + 1]))
+                }
+              }
+              return removals.map(t => fixer.remove(t))
+            }
+          })
+        }
+      }
+    }
+  }
+}
diff --git a/node_modules/eslint-plugin-github/lib/rules/prefer-observers.js b/node_modules/eslint-plugin-github/lib/rules/prefer-observers.js
new file mode 100644
index 0000000..0e9824a
--- /dev/null
+++ b/node_modules/eslint-plugin-github/lib/rules/prefer-observers.js
@@ -0,0 +1,24 @@
+const observerMap = {
+  scroll: 'IntersectionObserver',
+  resize: 'ResizeObserver'
+}
+module.exports = {
+  meta: {
+    docs: {},
+    fixable: 'code'
+  },
+
+  create(context) {
+    return {
+      ['CallExpression[callee.property.name="addEventListener"]']: function(node) {
+        const [name] = node.arguments
+        if (name.type !== 'Literal') return
+        if (!(name.value in observerMap)) return
+        context.report({
+          node,
+          message: `Avoid using "${name.value}" event listener. Consider using ${observerMap[name.value]} instead`
+        })
+      }
+    }
+  }
+}
diff --git a/node_modules/eslint-plugin-github/lib/rules/require-passive-events.js b/node_modules/eslint-plugin-github/lib/rules/require-passive-events.js
new file mode 100644
index 0000000..72b8a68
--- /dev/null
+++ b/node_modules/eslint-plugin-github/lib/rules/require-passive-events.js
@@ -0,0 +1,22 @@
+const passiveEventListenerNames = new Set(['touchstart', 'touchmove', 'wheel', 'mousewheel'])
+
+const propIsPassiveTrue = prop => prop.key && prop.key.name === 'passive' && prop.value && prop.value.value === true
+
+module.exports = {
+  meta: {
+    docs: {}
+  },
+
+  create(context) {
+    return {
+      ['CallExpression[callee.property.name="addEventListener"]']: function(node) {
+        const [name, listener, options] = node.arguments
+        if (!listener) return
+        if (name.type !== 'Literal') return
+        if (!passiveEventListenerNames.has(name.value)) return
+        if (options && options.type === 'ObjectExpression' && options.properties.some(propIsPassiveTrue)) return
+        context.report(node, `High Frequency Events like "${name.value}" should be \`passive: true\``)
+      }
+    }
+  }
+}
diff --git a/node_modules/eslint-plugin-github/lib/rules/unused-export.js b/node_modules/eslint-plugin-github/lib/rules/unused-export.js
deleted file mode 100644
index 7a37a90..0000000
--- a/node_modules/eslint-plugin-github/lib/rules/unused-export.js
+++ /dev/null
@@ -1,56 +0,0 @@
-const depGraph = require('../dependency-graph')
-
-module.exports = {
-  meta: {
-    docs: {}
-  },
-
-  create(context) {
-    const filename = context.getFilename()
-    const {identifiers} = depGraph.imported()
-
-    if (depGraph.entries.has(filename)) {
-      return {}
-    }
-
-    if (identifiers.has(`${filename}#*`)) {
-      return {}
-    }
-
-    return {
-      ExportDefaultDeclaration(node) {
-        if (!identifiers.has(`${filename}#default`)) {
-          context.report(node, 'Export was not imported by any modules.')
-        }
-      },
-      ExportNamedDeclaration(node) {
-        if (node.declaration == null) return
-
-        if (node.declaration.id != null) {
-          if (!identifiers.has(`${filename}#${node.declaration.id.name}`)) {
-            context.report(node, 'Export was not imported by any modules.')
-          }
-        }
-
-        if (node.declaration.declarations != null) {
-          for (const declaration of node.declaration.declarations) {
-            if (!identifiers.has(`${filename}#${declaration.id.name}`)) {
-              context.report(node, 'Export was not imported by any modules.')
-            }
-          }
-        }
-      },
-      MemberExpression(node) {
-        if (context.getScope().type !== 'module') {
-          return
-        }
-
-        if (node.object.name === 'exports') {
-          if (!identifiers.has(`${filename}#${node.property.name}`)) {
-            context.report(node.parent, 'Export was not imported by any modules.')
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/node_modules/eslint-plugin-github/lib/rules/unused-module.js b/node_modules/eslint-plugin-github/lib/rules/unused-module.js
deleted file mode 100644
index 7426479..0000000
--- a/node_modules/eslint-plugin-github/lib/rules/unused-module.js
+++ /dev/null
@@ -1,24 +0,0 @@
-const depGraph = require('../dependency-graph')
-
-module.exports = {
-  meta: {
-    docs: {}
-  },
-
-  create(context) {
-    const filename = context.getFilename()
-
-    if (depGraph.entries.has(filename)) {
-      return {}
-    }
-
-    return {
-      Program(node) {
-        const {filenames} = depGraph.imported()
-        if (!filenames.has(filename)) {
-          context.report(node, 'Module was not imported by any files.')
-        }
-      }
-    }
-  }
-}
diff --git a/node_modules/eslint-plugin-github/package.json b/node_modules/eslint-plugin-github/package.json
index c82d89b..d700da4 100644
--- a/node_modules/eslint-plugin-github/package.json
+++ b/node_modules/eslint-plugin-github/package.json
@@ -1,23 +1,18 @@
 {
   "name": "eslint-plugin-github",
-  "version": "3.4.1",
+  "version": "4.1.1",
   "description": "An opinionated collection of ESLint shared configs and rules used by GitHub.",
   "main": "lib/index.js",
   "entries": [
     "lib/formatters/stylish-fixes.js"
   ],
   "bin": {
-    "eslint-github-init": "bin/eslint-github-init.js",
-    "eslint-ignore-errors": "bin/eslint-ignore-errors.js",
-    "eslint-unused-modules": "bin/eslint-unused-modules.js",
-    "flow-coverage": "bin/flow-coverage.js",
-    "github-lint": "bin/github-lint.js",
-    "npm-check-github-package-requirements": "bin/npm-check-github-package-requirements.js"
+    "eslint-ignore-errors": "bin/eslint-ignore-errors.js"
   },
   "scripts": {
     "pretest": "mkdir -p node_modules/ && ln -fs $(pwd) node_modules/",
     "eslint-check": "eslint --print-config .eslintrc.js | eslint-config-prettier-check",
-    "test": "npm run eslint-check && bin/github-lint.js && mocha tests/"
+    "test": "npm run eslint-check && eslint . && mocha tests/"
   },
   "repository": {
     "type": "git",
@@ -29,45 +24,28 @@
     "url": "https://github.com/github/eslint-plugin-github/issues"
   },
   "homepage": "https://github.com/github/eslint-plugin-github#readme",
-  "engines": {
-    "node": ">=8.11.1"
-  },
   "dependencies": {
-    "@typescript-eslint/eslint-plugin": ">=2.5.0",
-    "@typescript-eslint/parser": ">=2.5.0",
-    "babel-eslint": ">=10.0.3",
-    "eslint-config-prettier": ">=6.4.0",
+    "@typescript-eslint/eslint-plugin": ">=2.25.0",
+    "@typescript-eslint/parser": ">=2.25.0",
+    "eslint-config-prettier": ">=6.10.1",
     "eslint-plugin-eslint-comments": ">=3.0.1",
-    "eslint-plugin-flowtype": ">=4.3.0",
-    "eslint-plugin-graphql": ">=3.0.1",
-    "eslint-plugin-import": ">=2.18.2",
-    "eslint-plugin-jsdoc": ">=15.5.2",
-    "eslint-plugin-jsx-a11y": ">=6.0.0",
-    "eslint-plugin-prettier": ">=2.6.0",
-    "eslint-plugin-react": ">=7.7.0",
-    "eslint-plugin-relay": ">=1.0.0",
+    "eslint-plugin-import": ">=2.20.1",
+    "eslint-plugin-prettier": ">=3.1.2",
     "eslint-rule-documentation": ">=1.0.0",
-    "inquirer": ">=6.0.0",
     "prettier": ">=1.12.0",
-    "read-pkg-up": ">=6.0.0",
-    "supports-color": "^7.1.0",
-    "svg-element-attributes": ">=1.2.1"
+    "svg-element-attributes": ">=1.3.1"
   },
+  "prettier": "@github/prettier-config",
   "peerDependencies": {
-    "eslint": ">=4.19.0",
-    "flow-bin": ">=0.70.0",
-    "graphql": ">=14.0.0"
+    "eslint": ">=4.19.0"
   },
   "files": [
     "bin/*",
-    "lib/*",
-    "prettier.config.js"
+    "lib/*"
   ],
   "devDependencies": {
-    "eslint": ">=6.5.1",
-    "flow-bin": ">=0.110.1",
-    "graphql": ">=14.5.8",
-    "mocha": ">=6.2.2",
-    "rimraf": "^3.0.0"
+    "@github/prettier-config": "0.0.4",
+    "eslint": ">=7.0.0",
+    "mocha": ">=7.1.1"
   }
 }
diff --git a/node_modules/eslint-plugin-github/prettier.config.js b/node_modules/eslint-plugin-github/prettier.config.js
deleted file mode 100644
index 9ef9978..0000000
--- a/node_modules/eslint-plugin-github/prettier.config.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
-  printWidth: 120,
-  semi: false,
-  singleQuote: true,
-  bracketSpacing: false
-}
diff --git a/node_modules/eslint-plugin-graphql/.eslintrc.js b/node_modules/eslint-plugin-graphql/.eslintrc.js
deleted file mode 100644
index 772bbd0..0000000
--- a/node_modules/eslint-plugin-graphql/.eslintrc.js
+++ /dev/null
@@ -1,12 +0,0 @@
-module.exports = {
-  extends: "eslint:recommended",
-  parserOptions: {
-    ecmaVersion: 2018,
-    sourceType: "module"
-  },
-  env: {
-    mocha: true,
-    node: true,
-    es6: true,
-  }
-};
diff --git a/node_modules/eslint-plugin-graphql/.github/PULL_REQUEST_TEMPLATE.md b/node_modules/eslint-plugin-graphql/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index 585f4ee..0000000
--- a/node_modules/eslint-plugin-graphql/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1,15 +0,0 @@
-<!--
-  Thanks for filing a pull request on eslint-plugin-graphql!
-
-  Please look at the following checklist to ensure that your PR
-  can be accepted quickly:
--->
-
-TODO:
-
-- [ ] Make sure all of the significant new logic is covered by tests
-- [ ] Rebase your changes on master so that they can be merged easily
-- [ ] Make sure all tests pass
-- [ ] Update CHANGELOG.md with your change
-- [ ] If this was a change that affects the external API, update the README
-
diff --git a/node_modules/eslint-plugin-graphql/.github/workflows/nodejs.yml b/node_modules/eslint-plugin-graphql/.github/workflows/nodejs.yml
deleted file mode 100644
index 086e8e7..0000000
--- a/node_modules/eslint-plugin-graphql/.github/workflows/nodejs.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-name: Node CI
-
-on: 
-  push:
-    branches:
-      - !master
-
-jobs:
-  build:
-
-    runs-on: ubuntu-latest
-
-    strategy:
-      matrix:
-        node-version: [8.x, 10.x, 12.x]
-
-    steps:
-    - uses: actions/checkout@v1
-    - name: Use Node.js ${{ matrix.node-version }}
-      uses: actions/setup-node@v1
-      with:
-        node-version: ${{ matrix.node-version }}
-    - name: npm install, build, and test
-      run: |
-        npm install
-        npm run build --if-present
-        npm test
diff --git a/node_modules/eslint-plugin-graphql/.tav.yml b/node_modules/eslint-plugin-graphql/.tav.yml
deleted file mode 100644
index 925bd5e..0000000
--- a/node_modules/eslint-plugin-graphql/.tav.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-graphql:
-  versions: ^0.12.0  || ^0.13.0 || ^14.0.0
-  commands: mocha test/index.js
diff --git a/node_modules/eslint-plugin-graphql/.travis.yml b/node_modules/eslint-plugin-graphql/.travis.yml
deleted file mode 100644
index f8ae0b6..0000000
--- a/node_modules/eslint-plugin-graphql/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-language: node_js
-node_js:
-  - "8"
-  - "10"
-install:
-  - npm install
-
-script:
-  - npm run lint && npm test
-
-# Allow Travis tests to run in containers.
-sudo: false
diff --git a/node_modules/eslint-plugin-graphql/CHANGELOG.md b/node_modules/eslint-plugin-graphql/CHANGELOG.md
deleted file mode 100644
index d192150..0000000
--- a/node_modules/eslint-plugin-graphql/CHANGELOG.md
+++ /dev/null
@@ -1,146 +0,0 @@
-# Change log
-
-### vNEXT
-
-### v3.1.1
-
-- Update the `required-fields` rule to handle inline fragments without field ancestors. [PR #240](https://github.com/apollographql/eslint-plugin-graphql/pull/240) by [Henry Q. Dineen](https://github.com/henryqdineen)
-
-### v3.1.0
-
-- Fix an issue that caused `graphql/required-fields` to throw on non-existent field references. [PR #231](https://github.com/apollographql/eslint-plugin-graphql/pull/231) by [Vitor Balocco](https://github.com/vitorbal)
-- chore: Update dependency `graphql-tools` to `v4.0.5`. [PR #239](https://github.com/apollographql/eslint-plugin-graphql/pull/239)
-- chore: Update dependency `eslint` to `v5.16.0`. [PR #218](https://github.com/apollographql/eslint-plugin-graphql/pull/218)
-- chore: Update dependency `graphql` to `v14.4.2`. [PR #220](https://github.com/apollographql/eslint-plugin-graphql/pull/220)
-- chore: Update dependency `test-all-versions` to `v4.1.1`. [PR #230](https://github.com/apollographql/eslint-plugin-graphql/pull/230)
-- chore: Update dependency `lodash` to `v4.17.13`. [PR #234](https://github.com/apollographql/eslint-plugin-graphql/pull/234)
-- chore: Update dependency `mocha` to `v6`. [PR #213](https://github.com/apollographql/eslint-plugin-graphql/pull/213)
-- chore: Running `prettier` on all files [PR #237](https://github.com/apollographql/eslint-plugin-graphql/pull/237)
-
-### v3.0.3
-
-- chore: Update dependency `graphql-tools` to `v4.0.4`. [PR #210](https://github.com/apollographql/eslint-plugin-graphql/pull/210)
-- chore: Update dependency `eslint` to `v5.12.1`. [PR #206](https://github.com/apollographql/eslint-plugin-graphql/pull/206)
-- chore: Update dependency `graphql` to `v14.1.1`. [PR #208](https://github.com/apollographql/eslint-plugin-graphql/pull/208)
-
-### v3.0.2
-
-- Fix regression which caused `graphql/required-fields` to throw on non-existent field references. [PR #203](https://github.com/apollographql/eslint-plugin-graphql/pull/203) by [Matt Bretl](https://github.com/mattbretl)
-
-### v3.0.1
-
-- Fix support for multi-schema workspaces [PR #179](https://github.com/apollographql/eslint-plugin-graphql/pull/179) by [Pat Sissons](https://github.com/patsissons)
-
-### v3.0.0
-
-- BREAKING: The `required-fields` rule has been significantly changed to make it a completely reliable method of ensuring an `id` field (or any other field name) is always requested when available. [PR #199](https://github.com/apollographql/eslint-plugin-graphql/pull/199) Here is the behavior, let's say we are requiring field `id`:
-  - On any field whose return type defines a field called `id`, the selection set must directly contain `id`.
-  - In any named fragment declaration whose type defines a field called `id`, the selection set must directly contain `id`.
-  - An inline fragment whose type defines a field called `id` must contain `id` in its selection set unless its parent is also an inline fragment that contains the field `id`.
-  - Here's a specific case which is _no longer valid_:
-    - `query { greetings { hello ... on Greetings { id } } }`
-    - This must now be written as `query { greetings { id hello ... on Greetings { id } } }`
-  - This is a more conservative approach than before, driven by the fact that it's quite hard to ensure that a combination of inline fragments actually covers all of the possible types of a selection set.
-- Fix breaking change in `graphql@^14.0.0` that renamed `ProvidedNonNullArguments` to `ProvidedRequiredArguments` [#192](https://github.com/apollographql/eslint-plugin-graphql/pull/192)
-- Update dependencies to graphql-tools 4 and eslint 5.9 [#193](https://github.com/apollographql/eslint-plugin-graphql/pull/193)
-
-### v2.1.1
-
-- Fix support for InlineFragments with the `required-fields` rule in [#140](https://github.com/apollographql/eslint-plugin-graphql/pull/140/files) by [Steve Hollaar](https://github.com/stevehollaar)
-- Fix error location information for literal .graphql files and strings with leading newlines in [#122](https://github.com/apollographql/eslint-plugin-graphql/pull/122) by [Dan Freeman](https://github.com/dfreeman)
-- Add [`fraql`](https://github.com/smooth-code/fraql) environment
-
-### v2.1.0
-
-- Retrieves `.graphqlconfig` relative to the file being linted, which re-enables support for `vscode-eslint` using `.graphqlconfig` in [#108](https://github.com/apollographql/eslint-plugin-graphql/pull/108) by [Jon Wong][https://github.com/jnwng/]
-- Cache schema reading/parsing results each time a rule is created in [#137](https://github.com/apollographql/eslint-plugin-graphql/pull/137) by [Kristján Oddsson](https://github.com/koddsson)
-
-### v2.0.0
-
-- Add support for `graphql-js@^0.12.0` and `graphql-js@^0.13.0` in [Jon Wong](https://github.com/jnwng/)[#119](https://github.com/apollographql/eslint-plugin-graphql/pull/93)
-- Update list of available validators in [#121]((https://github.com/apollographql/eslint-plugin-graphql/pull/121) by [Pleun Vanderbauwhede](https://github.com/pleunv)
-- Update supported Node `engines` to >= 6.0 in [#133](https://github.com/apollographql/eslint-plugin-graphql/pull/133) by [Jon Wong](https://github.com/jnwng/)
-
-### v1.5.0
-
-- Add new rule `no-deprecated-fields` in [Kristján Oddsson](https://github.com/koddsson/)[#92](https://github.com/apollographql/eslint-plugin-graphql/pull/93)
-- Add support for deprecated fields on enums in [#100](https://github.com/apollographql/eslint-plugin-graphql/pull/100) by [Daniel Rinehart](https://github.com/NeoPhi)
-- Bumped `babel-eslint` and pinned `graphql-config` in [#101](https://github.com/apollographql/eslint-plugin-graphql/pull/101) by [Jon Wong](https://github.com/jnwng)
-
-### v1.4.1
-
-Skipped v1.4.0 because of incorrect version tag in `package.json`
-
-- Move `graphql-js` to `peerDependencies`, support `graphql@^0.11.0` in [Jon Wong](https://github.com/jnwng/)[#91](https://github.com/apollographql/eslint-plugin-graphql/pull/91)
-- Fix escaping of literal .graphql files [Simon Lydell](https://github.com/lydell/) in [#88](https://github.com/apollographql/eslint-plugin-graphql/pull/88)
-- Fix ESLint config validation [Simon Lydell](https://github.com/lydell/) in [#86](https://github.com/apollographql/eslint-plugin-graphql/pull/86)
-
-### v1.3.0
-
-- add support for [.graphqlconfig](https://github.com/graphcool/graphql-config) [Roman Hotsiy](https://github.com/RomanGotsiy) in [#80](https://github.com/apollographql/eslint-plugin-graphql/pull/80)
-- add `graphql/capitalized-type-name` rule to warn on uncapitalized type names [DianaSuvorova](https://github.com/DianaSuvorova) in [#81](https://github.com/apollographql/eslint-plugin-graphql/pull/81)
-
-### v1.2.0
-
-- Add env config option for required-fields rule [Justin Schulz](https://github.com/PepperTeasdale) in [#75](https://github.com/apollographql/eslint-plugin-graphql/pull/75)
-
-### v1.1.0
-
-- Add option to pass schema as string [Christopher Cliff](https://github.com/christophercliff) in [#78](https://github.com/apollographql/eslint-plugin-graphql/pull/78)
-
-### v1.0.0
-
-- Fix template env for older runtimes (eg. node 5 and earlier) [Justin Schulz](https://github.com/PepperTeasdale) in [#73](https://github.com/apollographql/eslint-plugin-graphql/pull/73)
-- Updated `graphql-js` to `v0.10.1` in [#67](https://github.com/apollographql/eslint-plugin-graphql/pull/67) [Sashko Stubailo](https://github.com/stubailo)
-
-### v0.8.2
-
-- Remove `KnownFragmentNames` and `UnusedFragment` from default rules in `literal` env. [Justin Schulz](https://github.com/PepperTeasdale) in [#70](https://github.com/apollographql/eslint-plugin-graphql/pull/70)
-
-### v0.8.1
-
-- Fix `graphql/required-fields` throwing on non-existent field reference [Benjie](https://github.com/benjie) in [#65](https://github.com/apollographql/eslint-plugin-graphql/pull/65)
-
-### v0.8.0
-
-- Updated `graphql` dependency to resolve test failures ([wording change](https://github.com/graphql/graphql-js/commit/ba401e154461bca5323ca9121c6dacaee10ebe88), no API change) [jnwng](https://github.com/jnwng)
-- Add lint rule to enforce that required fields are specified. [rgoldfinger](https://github.com/rgoldfinger) in [#47](https://github.com/apollographql/eslint-plugin-graphql/pull/50)
-
-### v0.7.0
-
-- Add lint rule to enforce that operations have names [gauravmk](https://github.com/gauravmk) in [#47](https://github.com/apollographql/eslint-plugin-graphql/pull/47)
-
-### v0.6.1
-
-- Remove `babel-polyfill` from runtime dependencies, since it was only being used in test code. [joelgriffith](https://github.com/joelgriffith) in [#44](https://github.com/apollographql/eslint-plugin-graphql/pull/44)
-
-### v0.6.0
-
-- Update graphql-js dependency to 0.9.0 [jonbretman](https://github.com/jonbretman) in [#41](https://github.com/apollostack/eslint-plugin-graphql/pull/41)
-
-### v0.5.0
-
-- Take into account Apollo fragment interpolation rules [jnwng](https://github.com/jnwng) in [#33](https://github.com/apollostack/eslint-plugin-graphql/pull/33)
-- Update graphql-js dependency to 0.8.2 [jonbretman](https://github.com/jonbretman) in [#40](https://github.com/apollostack/eslint-plugin-graphql/pull/40)
-
-### v0.4.3
-
-- Add `'literal'` option to options schema, so that it can actually be used. [stefanorg](https://github.com/stefanorg) in [#39](https://github.com/apollostack/eslint-plugin-graphql/pull/39)
-
-### v0.4.2
-
-- Added `'literal'` option to `env` for when working with `.graphql` and `.gql` files, by [jtmthf in #36](https://github.com/apollostack/eslint-plugin-graphql/pull/36)
-
-### v0.4.1
-
-- Support for selecting validation rules one by one, by [erydo in
-  #34](https://github.com/apollostack/eslint-plugin-graphql/pull/34)
-
-### v0.4.0
-
-- Support for multiple schemas, by [erydo in
-  #31](https://github.com/apollostack/eslint-plugin-graphql/pull/31)
-
-### v0.3.1
-
-- We didn't keep track of changes before this version. Consult the commit log.
diff --git a/node_modules/eslint-plugin-graphql/CONTRIBUTING.md b/node_modules/eslint-plugin-graphql/CONTRIBUTING.md
deleted file mode 100644
index 651c071..0000000
--- a/node_modules/eslint-plugin-graphql/CONTRIBUTING.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# Apollo Contributor Guide
-
-Excited about Apollo and want to make it better? We’re excited too!
-
-Apollo is a community of developers just like you, striving to create the best tools and libraries around GraphQL. We welcome anyone who wants to contribute or provide constructive feedback, no matter the age or level of experience. If you want to help but don't know where to start, let us know, and we'll find something for you.
-
-Oh, and if you haven't already, sign up for the [Apollo Slack](http://www.apollodata.com/#slack).
-
-Here are some ways to contribute to the project, from easiest to most difficult:
-
-* [Reporting bugs](#reporting-bugs)
-* [Improving the documentation](#improving-the-documentation)
-* [Responding to issues](#responding-to-issues)
-* [Small bug fixes](#small-bug-fixes)
-* [Suggesting features](#suggesting-features)
-* [Big pull requests](#big-prs)
-
-## Issues
-
-### Reporting bugs
-
-If you encounter a bug, please file an issue on GitHub via the repository of the sub-project you think contains the bug. If an issue you have is already reported, please add additional information or add a 👍 reaction to indicate your agreement.
-
-While we will try to be as helpful as we can on any issue reported, please include the following to maximize the chances of a quick fix:
-
-1. **Intended outcome:** What you were trying to accomplish when the bug occurred, and as much code as possible related to the source of the problem.
-2. **Actual outcome:** A description of what actually happened, including a screenshot or copy-paste of any related error messages, logs, or other output that might be related. Places to look for information include your browser console, server console, and network logs. Please avoid non-specific phrases like “didn’t work” or “broke”.
-3. **How to reproduce the issue:** Instructions for how the issue can be reproduced by a maintainer or contributor. Be as specific as possible, and only mention what is necessary to reproduce the bug. If possible, try to isolate the exact circumstances in which the bug occurs and avoid speculation over what the cause might be.
-
-Creating a good reproduction really helps contributors investigate and resolve your issue quickly. In many cases, the act of creating a minimal reproduction illuminates that the source of the bug was somewhere outside the library in question, saving time and effort for everyone.
-
-### Improving the documentation
-
-Improving the documentation, examples, and other open source content can be the easiest way to contribute to the library. If you see a piece of content that can be better, open a PR with an improvement, no matter how small! If you would like to suggest a big change or major rewrite, we’d love to hear your ideas but please open an issue for discussion before writing the PR.
-
-### Responding to issues
-
-In addition to reporting issues, a great way to contribute to Apollo is to respond to other peoples' issues and try to identify the problem or help them work around it. If you’re interested in taking a more active role in this process, please go ahead and respond to issues. And don't forget to say "Hi" on Apollo Slack!
-
-### Small bug fixes
-
-For a small bug fix change (less than 20 lines of code changed), feel free to open a pull request. We’ll try to merge it as fast as possible and ideally publish a new release on the same day. The only requirement is, make sure you also add a test that verifies the bug you are trying to fix.
-
-### Suggesting features
-
-Most of the features in Apollo came from suggestions by you, the community! We welcome any ideas about how to make Apollo  better for your use case. Unless there is overwhelming demand for a feature, it might not get implemented immediately, but please include as much information as possible that will help people have a discussion about your proposal:
-
-1. **Use case:** What are you trying to accomplish, in specific terms? Often, there might already be a good way to do what you need and a new feature is unnecessary, but it’s hard to know without information about the specific use case.
-2. **Could this be a plugin?** In many cases, a feature might be too niche to be included in the core of a library, and is better implemented as a companion package. If there isn’t a way to extend the library to do what you want, could we add additional plugin APIs? It’s important to make the case for why a feature should be part of the core functionality of the library.
-3. **Is there a workaround?** Is this a more convenient way to do something that is already possible, or is there some blocker that makes a workaround unfeasible?
-
-Feature requests will be labeled as such, and we encourage using GitHub issues as a place to discuss new features and possible implementation designs. Please refrain from submitting a pull request to implement a proposed feature until there is consensus that it should be included. This way, you can avoid putting in work that can’t be merged in.
-
-Once there is a consensus on the need for a new feature, proceed as listed below under “Big PRs”.
-
-## Big PRs
-
-This includes:
-
-- Big bug fixes
-- New features
-
-For significant changes to a repository, it’s important to settle on a design before starting on the implementation. This way, we can make sure that major improvements get the care and attention they deserve. Since big changes can be risky and might not always get merged, it’s good to reduce the amount of possible wasted effort by agreeing on an implementation design/plan first.
-
-1. **Open an issue.** Open an issue about your bug or feature, as described above.
-2. **Reach consensus.** Some contributors and community members should reach an agreement that this feature or bug is important, and that someone should work on implementing or fixing it.
-3. **Agree on intended behavior.** On the issue, reach an agreement about the desired behavior. In the case of a bug fix, it should be clear what it means for the bug to be fixed, and in the case of a feature, it should be clear what it will be like for developers to use the new feature.
-4. **Agree on implementation plan.** Write a plan for how this feature or bug fix should be implemented. What modules need to be added or rewritten? Should this be one pull request or multiple incremental improvements? Who is going to do each part?
-5. **Submit PR.** In the case where multiple dependent patches need to be made to implement the change, only submit one at a time. Otherwise, the others might get stale while the first is reviewed and merged. Make sure to avoid “while we’re here” type changes - if something isn’t relevant to the improvement at hand, it should be in a separate PR; this especially includes code style changes of unrelated code.
-6. **Review.** At least one core contributor should sign off on the change before it’s merged. Look at the “code review” section below to learn about factors are important in the code review. If you want to expedite the code being merged, try to review your own code first!
-7. **Merge and release!**
-
-### Code review guidelines
-
-It’s important that every piece of code in Apollo packages is reviewed by at least one core contributor familiar with that codebase. Here are some things we look for:
-
-1. **Required CI checks pass.** This is a prerequisite for the review, and it is the PR author's responsibility. As long as the tests don’t pass, the PR won't get reviewed.
-2. **Simplicity.** Is this the simplest way to achieve the intended goal? If there are too many files, redundant functions, or complex lines of code, suggest a simpler way to do the same thing. In particular, avoid implementing an overly general solution when a simple, small, and pragmatic fix will do.
-3. **Testing.** Do the tests ensure this code won’t break when other stuff changes around it? When it does break, will the tests added help us identify which part of the library has the problem? Did we cover an appropriate set of edge cases? Look at the test coverage report if there is one. Are all significant code paths in the new code exercised at least once?
-4. **No unnecessary or unrelated changes.** PRs shouldn’t come with random formatting changes, especially in unrelated parts of the code. If there is some refactoring that needs to be done, it should be in a separate PR from a bug fix or feature, if possible.
-5. **Code has appropriate comments.** Code should be commented, or written in a clear “self-documenting” way.
-6. **Idiomatic use of the language.** In TypeScript, make sure the typings are specific and correct. In ES2015, make sure to use imports rather than require and const instead of var, etc. Ideally a linter enforces a lot of this, but use your common sense and follow the style of the surrounding code.
diff --git a/node_modules/eslint-plugin-graphql/README.md b/node_modules/eslint-plugin-graphql/README.md
deleted file mode 100644
index 19b2a41..0000000
--- a/node_modules/eslint-plugin-graphql/README.md
+++ /dev/null
@@ -1,583 +0,0 @@
-# eslint-plugin-graphql
-[![npm version](https://badge.fury.io/js/eslint-plugin-graphql.svg)](https://badge.fury.io/js/eslint-plugin-graphql)
-[![Build Status](https://travis-ci.org/apollographql/eslint-plugin-graphql.svg?branch=master)](https://travis-ci.org/apollographql/eslint-plugin-graphql)
-[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](http://www.apollostack.com/#slack)
-
-An ESLint plugin that checks tagged query strings inside JavaScript, or queries inside `.graphql` files, against a GraphQL schema.
-
-```
-npm install eslint-plugin-graphql
-```
-
-![Screenshot from Atom](https://github.com/apollostack/eslint-plugin-graphql/raw/master/screenshot.png)
-
-`eslint-plugin-graphql` has built-in settings for four GraphQL clients out of the box:
-
-1. [Apollo client](http://docs.apollostack.com/apollo-client/index.html)
-2. [Relay](https://facebook.github.io/relay/)
-3. [Lokka](https://github.com/kadirahq/lokka)
-4. [FraQL](https://github.com/smooth-code/fraql)
-
-If you want to lint your GraphQL schema, rather than queries, check out [cjoudrey/graphql-schema-linter](https://github.com/cjoudrey/graphql-schema-linter).
-
-### Importing schema JSON
-
-You'll need to import your [introspection query result](https://github.com/graphql/graphql-js/blob/master/src/utilities/introspectionQuery.js) or the schema as a string in the Schema Language format. This can be done if you define your ESLint config in a JS file.
-
-### Retrieving a remote GraphQL schema
-
-[graphql-cli](https://github.com/graphcool/graphql-cli) provides a `get-schema` command (in conjunction with a `.graphqlconfig` file) that makes retrieving remote schemas very simple.
-
-[apollo-codegen](https://github.com/apollographql/apollo-codegen) also provides an [introspect-schema](https://github.com/apollographql/apollo-codegen#introspect-schema) command that can get your remote schemas as well
-
-### Common options
-
-All of the rules provided by this plugin have a few options in common. There are examples of how to use these with Apollo, Relay, Lokka, FraQL and literal files further down.
-
-- `env`: Import default settings for your GraphQL client. Supported values: `'apollo'`, `'relay'`, `'lokka'`, `'fraql'` `'literal'`. Defaults to `'apollo'`. This is used for the slight parsing differences in the GraphQL syntax between Apollo, Relay, Lokka and FraQL as well as giving nice defaults to some other options.
-
-- `tagName`: The name of the template literal tag that this plugin should look for when searching for GraphQL queries. It has different defaults depending on the `env` option:
-
-  - `'relay'`: `'Relay.QL'`
-  - `'internal'`: Special automatic value
-  - others: `'gql'`, `'graphql'`
-
-You also have to specify a schema. You can either do it using _one_ of these options:
-
-- `schemaJson`: Your schema as JSON.
-- `schemaJsonFilepath`: The absolute path to your schema as a .json file. (Warning: this variant is incompatible with `eslint --cache`.)
-- `schemaString`: Your schema in the Schema Language format as a string.
-
-Alternatively, you can use a [.graphqlconfig](https://github.com/graphcool/graphql-config) file instead of the above three options. If you do there's one more option to know about:
-
-- `projectName`: In case you specify multiple schemas in your `.graphqlconfig` file, choose which one to use by providing the project name here as a string.
-
-There's an example on how to use a `.graphqlconfig` file further down.
-
-### Identity template literal tag
-
-This plugin relies on GraphQL queries being prefixed with a special tag. In Relay and Apollo, this is always done, but other clients often take query strings without a tag. In this case, you can define an identity tag that doesn't do anything except for tell the linter this is a GraphQL query:
-
-```js
-global.gql = (literals, ...substitutions) => {
-    let result = "";
-
-    // run the loop only for the substitution count
-    for (let i = 0; i < substitutions.length; i++) {
-        result += literals[i];
-        result += substitutions[i];
-    }
-
-    // add the last literal
-    result += literals[literals.length - 1];
-
-    return result;
-}
-```
-
-Code snippet taken from:  <https://leanpub.com/understandinges6/read#leanpub-auto-multiline-strings>
-
-Note: The linter rule could be extended to identify calls to various specific APIs to eliminate the need for a template literal tag, but this might just make the implementation a lot more complex for little benefit.
-
-### GraphQL literal files
-
-This plugin also lints GraphQL literal files ending on `.gql` or `.graphql`.
-In order to do so set `env` to `'literal'` in your `.eslintrc.js` and tell eslint to check these files as well.
-
-```bash
-eslint . --ext .js --ext .gql --ext .graphql
-```
-
-### Example config for Apollo
-
-```js
-// In a file called .eslintrc.js
-module.exports = {
-  parser: "babel-eslint",
-  rules: {
-    "graphql/template-strings": ['error', {
-      // Import default settings for your GraphQL client. Supported values:
-      // 'apollo', 'relay', 'lokka', 'fraql', 'literal'
-      env: 'apollo',
-
-      // Import your schema JSON here
-      schemaJson: require('./schema.json'),
-
-      // OR provide absolute path to your schema JSON (but not if using `eslint --cache`!)
-      // schemaJsonFilepath: path.resolve(__dirname, './schema.json'),
-
-      // OR provide the schema in the Schema Language format
-      // schemaString: printSchema(schema),
-
-      // tagName is gql by default
-    }]
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
-
-### Example config for Relay
-
-```js
-// In a file called .eslintrc.js
-module.exports = {
-  parser: "babel-eslint",
-  rules: {
-    "graphql/template-strings": ['error', {
-      // Import default settings for your GraphQL client. Supported values:
-      // 'apollo', 'relay', 'lokka', 'fraql', 'literal'
-      env: 'relay',
-
-      // Import your schema JSON here
-      schemaJson: require('./schema.json'),
-
-      // OR provide absolute path to your schema JSON (but not if using `eslint --cache`!)
-      // schemaJsonFilepath: path.resolve(__dirname, './schema.json'),
-
-      // OR provide the schema in the Schema Language format
-      // schemaString: printSchema(schema),
-
-      // tagName is set for you to Relay.QL
-    }]
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
-
-### Example config for Lokka
-
-```js
-// In a file called .eslintrc.js
-module.exports = {
-  parser: "babel-eslint",
-  rules: {
-    "graphql/template-strings": ['error', {
-      // Import default settings for your GraphQL client. Supported values:
-      // 'apollo', 'relay', 'lokka', 'fraql', 'literal'
-      env: 'lokka',
-
-      // Import your schema JSON here
-      schemaJson: require('./schema.json'),
-
-      // OR provide absolute path to your schema JSON (but not if using `eslint --cache`!)
-      // schemaJsonFilepath: path.resolve(__dirname, './schema.json'),
-
-      // OR provide the schema in the Schema Language format
-      // schemaString: printSchema(schema),
-
-      // Optional, the name of the template tag, defaults to 'gql'
-      tagName: 'gql'
-    }]
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
-
-### Example config for FraQL
-
-```js
-// In a file called .eslintrc.js
-module.exports = {
-  parser: "babel-eslint",
-  rules: {
-    "graphql/template-strings": ['error', {
-      // Import default settings for your GraphQL client. Supported values:
-      // 'apollo', 'relay', 'lokka', 'fraql', 'literal'
-      env: 'fraql',
-
-      // Import your schema JSON here
-      schemaJson: require('./schema.json'),
-
-      // OR provide absolute path to your schema JSON
-      // schemaJsonFilepath: path.resolve(__dirname, './schema.json'),
-
-      // OR provide the schema in the Schema Language format
-      // schemaString: printSchema(schema),
-
-      // Optional, the name of the template tag, defaults to 'gql'
-      tagName: 'gql'
-    }]
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
-
-### Example config for literal graphql files
-
-```js
-// In a file called .eslintrc.js
-module.exports = {
-  parser: "babel-eslint",
-  rules: {
-    "graphql/template-strings": ['error', {
-      // Import default settings for your GraphQL client. Supported values:
-      // 'apollo', 'relay', 'lokka', 'fraql', 'literal'
-      env: 'literal',
-
-      // Import your schema JSON here
-      schemaJson: require('./schema.json'),
-
-      // OR provide absolute path to your schema JSON (but not if using `eslint --cache`!)
-      // schemaJsonFilepath: path.resolve(__dirname, './schema.json'),
-
-      // OR provide the schema in the Schema Language format
-      // schemaString: printSchema(schema),
-
-      // tagName is set automatically
-    }]
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
-
-### Additional Schemas or Tags
-
-This plugin can be used to validate against multiple schemas by identifying them with different tags. This is useful for applications interacting with multiple GraphQL systems. Additional schemas can simply be appended to the options list:
-
-```js
-module.exports = {
-  parser: "babel-eslint",
-  rules: {
-    "graphql/template-strings": ['error', {
-      env: 'apollo',
-      tagName: 'FirstGQL',
-      schemaJson: require('./schema-first.json')
-    }, {
-      env: 'relay',
-      tagName: 'SecondGQL',
-      schemaJson: require('./schema-second.json')
-    }]
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
-
-### Example config when using [.graphqlconfig](https://github.com/graphcool/graphql-config)
-
-If you have `.graphqlconfig` file in the root of your repo you can omit schema-related
-properties (`schemaJson`, `schemaJsonFilepath` and `schemaString`) from rule config.
-
-```js
-// In a file called .eslintrc.js
-module.exports = {
-  parser: "babel-eslint",
-  rules: {
-    "graphql/template-strings": ['error', {
-      // Import default settings for your GraphQL client. Supported values:
-      // 'apollo', 'relay', 'lokka', 'fraql', 'literal'
-      env: 'literal'
-      // no need to specify schema here, it will be automatically determined using .graphqlconfig
-    }]
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
-
-In case you use additional schemas, specify `projectName` from `.graphqlconfig` for each `tagName`:
-```js
-module.exports = {
-  parser: "babel-eslint",
-  rules: {
-    "graphql/template-strings": ['error', {
-      env: 'apollo',
-      tagName: 'FirstGQL',
-      projectName: 'FirstGQLProject'
-    }, {
-      env: 'relay',
-      tagName: 'SecondGQL',
-      projectName: 'SecondGQLProject'
-    }]
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
-
-### Selecting Validation Rules
-
-GraphQL validation rules can be configured in the eslint rule configuration using the `validators` option. The default selection depends on the `env` setting. If no `env` is specified, all rules are enabled by default.
-
-The `validators` setting can be set either to a list of specific validator names or to the special value `"all"`.
-
-```js
-module.exports = {
-  parser: "babel-eslint",
-  rules: {
-    "graphql/template-strings": ['error', {
-      env: 'apollo',
-      validators: 'all',
-      tagName: 'FirstGQL',
-      schemaJson: require('./schema-first.json')
-    }, {
-      validators: ['FieldsOnCorrectType'],
-      tagName: 'SecondGQL',
-      schemaJson: require('./schema-second.json')
-    }]
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
-
-The full list of available validators is:
-  - `ExecutableDefinitions`
-  - `FieldsOnCorrectType`
-  - `FragmentsOnCompositeTypes`
-  - `KnownArgumentNames`
-  - `KnownDirectives` (*disabled by default in `relay`*)
-  - `KnownFragmentNames` (*disabled by default in all envs*)
-  - `KnownTypeNames`
-  - `LoneAnonymousOperation`
-  - `NoFragmentCycles`
-  - `NoUndefinedVariables` (*disabled by default in `relay`*)
-  - `NoUnusedFragments` (*disabled by default in all envs*)
-  - `NoUnusedVariables`
-  - `OverlappingFieldsCanBeMerged`
-  - `PossibleFragmentSpreads`
-  - `ProvidedRequiredArguments` (*disabled by default in `relay`*)
-  - `ScalarLeafs` (*disabled by default in `relay`*)
-  - `SingleFieldSubscriptions`
-  - `UniqueArgumentNames`
-  - `UniqueDirectivesPerLocation`
-  - `UniqueFragmentNames`
-  - `UniqueInputFieldNames`
-  - `UniqueOperationNames`
-  - `UniqueVariableNames`
-  - `ValuesOfCorrectType`
-  - `VariablesAreInputTypes`
-  - `VariablesDefaultValueAllowed`
-  - `VariablesInAllowedPosition`
-
-### Named Operations Validation Rule
-
-The Named Operation rule validates that all operations are named. Naming operations is valuable for including in server-side logs and debugging.
-
-**Pass**
-```
-query FetchUsername {
-  viewer {
-    name
-  }
-}
-```
-
-**Fail**
-```
-query {
-  viewer {
-    name
-  }
-}
-```
-
-The rule is defined as `graphql/named-operations`.
-
-```js
-// In a file called .eslintrc.js
-module.exports = {
-  parser: "babel-eslint",
-  rules: {
-    "graphql/template-strings": ['error', {
-      env: 'apollo',
-      schemaJson: require('./schema.json'),
-    }],
-    "graphql/named-operations": ['warn', {
-      schemaJson: require('./schema.json'),
-    }],
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
-### Required Fields Validation Rule
-
-The Required Fields rule validates that any specified required field is part of the query, but only if that field is available in schema. This is useful to ensure that query results are cached properly in the client.
-
-**Pass**
-```
-// 'uuid' required and present in the schema
-
-schema {
-  query {
-    viewer {
-      name
-      uuid
-    }
-  }
-}
-
-query ViewerName {
-  viewer {
-    name
-    uuid
-  }
-}
-```
-
-**Pass**
-```
-// 'uuid' usually required but not present in the schema here
-
-schema {
-  query {
-    viewer {
-      name
-    }
-  }
-}
-
-query ViewerName {
-  viewer {
-    name
-  }
-}
-```
-
-**Fail**
-```
-// 'uuid' required and present in the schema
-
-schema {
-  query {
-    viewer {
-      uuid
-      name
-    }
-  }
-}
-
-query ViewerName {
-  viewer {
-    name
-  }
-}
-```
-
-The rule is defined as `graphql/required-fields` and requires the `requiredFields` option.
-
-```js
-// In a file called .eslintrc.js
-module.exports = {
-  rules: {
-    'graphql/required-fields': [
-      'error',
-      {
-        env: 'apollo',
-        schemaJsonFilepath: path.resolve(__dirname, './schema.json'),
-        requiredFields: ['uuid'],
-      },
-    ],
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
-
-### Capitalization of a first letter of a Type name
-
-This rule enforces that first letter of types is capitalized
-
-**Pass**
-```
-query {
-  someUnion {
-    ... on SomeType {
-      someField
-    }
-  }
-}
-```
-
-**Fail**
-```
-query {
-  someUnion {
-    ... on someType {
-      someField
-    }
-  }
-}
-```
-
-The rule is defined as `graphql/capitalized-type-name`.
-
-```js
-// In a file called .eslintrc.js
-module.exports = {
-  parser: "babel-eslint",
-  rules: {
-    "graphql/template-strings": ['error', {
-      env: 'apollo',
-      schemaJson: require('./schema.json'),
-    }],
-    "graphql/capitalized-type-name": ['warn', {
-      schemaJson: require('./schema.json'),
-    }],
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
-
-### No Deprecated Fields Validation Rule
-
-The No Deprecated Fields rule validates that no deprecated fields are part of the query. This is useful to discover fields that have been marked as deprecated and shouldn't be used.
-
-**Fail**
-```
-// 'id' requested and marked as deprecated in the schema
-
-schema {
-  query {
-    viewer {
-      id: Int @deprecated(reason: "Use the 'uuid' field instead")
-      uuid: String
-    }
-  }
-}
-
-query ViewerName {
-  viewer {
-    id
-  }
-}
-```
-
-The rule is defined as `graphql/no-deprecated-fields`.
-
-```js
-// In a file called .eslintrc.js
-module.exports = {
-  rules: {
-    'graphql/no-deprecated-fields': [
-      'error',
-      {
-        env: 'relay',
-        schemaJson: require('./schema.json')
-      },
-    ],
-  },
-  plugins: [
-    'graphql'
-  ]
-}
-```
diff --git a/node_modules/eslint-plugin-graphql/lib/constants.js b/node_modules/eslint-plugin-graphql/lib/constants.js
deleted file mode 100644
index 6adc6b3..0000000
--- a/node_modules/eslint-plugin-graphql/lib/constants.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-var internalTag = exports.internalTag = "ESLintPluginGraphQLFile";
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-graphql/lib/createRule.js b/node_modules/eslint-plugin-graphql/lib/createRule.js
deleted file mode 100644
index db50698..0000000
--- a/node_modules/eslint-plugin-graphql/lib/createRule.js
+++ /dev/null
@@ -1,245 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.createRule = createRule;
-
-var _graphql = require("graphql");
-
-var _constants = require("./constants");
-
-function strWithLen(len) {
-  // from http://stackoverflow.com/questions/14343844/create-a-string-of-variable-length-filled-with-a-repeated-character
-  return new Array(len + 1).join("x");
-}
-
-function replaceExpressions(node, context, env) {
-  var chunks = [];
-
-  node.quasis.forEach(function (element, i) {
-    var chunk = element.value.cooked;
-    var value = node.expressions[i];
-
-    chunks.push(chunk);
-
-    if (!env || env === "apollo") {
-      // In Apollo, interpolation is only valid outside top-level structures like `query` or `mutation`.
-      // We'll check to make sure there's an equivalent set of opening and closing brackets, otherwise
-      // we're attempting to do an invalid interpolation.
-      if (chunk.split("{").length - 1 !== chunk.split("}").length - 1) {
-        context.report({
-          node: value,
-          message: "Invalid interpolation - fragment interpolation must occur outside of the brackets."
-        });
-        throw new Error("Invalid interpolation");
-      }
-    }
-
-    if (!element.tail) {
-      // Preserve location of errors by replacing with exactly the same length
-      var nameLength = value.end - value.start;
-
-      if (env === "relay" && /:\s*$/.test(chunk)) {
-        // The chunk before this one had a colon at the end, so this
-        // is a variable
-
-        // Add 2 for brackets in the interpolation
-        var placeholder = strWithLen(nameLength + 2);
-        chunks.push("$" + placeholder);
-      } else if (env === "lokka" && /\.\.\.\s*$/.test(chunk)) {
-        // This is Lokka-style fragment interpolation where you actually type the '...' yourself
-        var _placeholder = strWithLen(nameLength + 3);
-        chunks.push(_placeholder);
-      } else if (env === "relay") {
-        // This is Relay-style fragment interpolation where you don't type '...'
-        // Ellipsis cancels out extra characters
-        var _placeholder2 = strWithLen(nameLength);
-        chunks.push("..." + _placeholder2);
-      } else if (!env || env === "apollo") {
-        // In Apollo, fragment interpolation is only valid outside of brackets
-        // Since we don't know what we'd interpolate here (that occurs at runtime),
-        // we're not going to do anything with this interpolation.
-      } else if (env === "fraql") {
-        if (chunk.lastIndexOf("{") > chunk.lastIndexOf("}")) {
-          chunks.push("__typename");
-        }
-      } else {
-        // Invalid interpolation
-        context.report({
-          node: value,
-          message: "Invalid interpolation - not a valid fragment or variable."
-        });
-        throw new Error("Invalid interpolation");
-      }
-    }
-  });
-
-  return chunks.join("");
-}
-
-function locFrom(node, error) {
-  if (!error.locations || !error.locations.length) {
-    return;
-  }
-  var location = error.locations[0];
-
-  var line = void 0;
-  var column = void 0;
-  if (location.line === 1 && node.tag.name !== _constants.internalTag) {
-    line = node.loc.start.line;
-    column = node.tag.loc.end.column + location.column;
-  } else {
-    line = node.loc.start.line + location.line - 1;
-    column = location.column - 1;
-  }
-
-  return {
-    line: line,
-    column: column
-  };
-}
-
-function handleTemplateTag(node, context, schema, env, validators) {
-  var text = void 0;
-  try {
-    text = replaceExpressions(node.quasi, context, env);
-  } catch (e) {
-    if (e.message !== "Invalid interpolation") {
-      console.log(e); // eslint-disable-line no-console
-    }
-    return;
-  }
-
-  // Re-implement syntax sugar for fragment names, which is technically not valid
-  // graphql
-  if ((env === "lokka" || env === "relay" || env === "fraql") && /fragment\s+on/.test(text)) {
-    text = text.replace("fragment", "fragment _");
-  }
-
-  var ast = void 0;
-
-  try {
-    ast = (0, _graphql.parse)(text);
-  } catch (error) {
-    context.report({
-      node: node,
-      message: error.message.split("\n")[0],
-      loc: locFrom(node, error)
-    });
-    return;
-  }
-
-  var validationErrors = schema ? (0, _graphql.validate)(schema, ast, validators) : [];
-  if (validationErrors && validationErrors.length > 0) {
-    context.report({
-      node: node,
-      message: validationErrors[0].message,
-      loc: locFrom(node, validationErrors[0])
-    });
-    return;
-  }
-}
-
-function templateExpressionMatchesTag(tagName, node) {
-  var tagNameSegments = tagName.split(".").length;
-  if (tagNameSegments === 1) {
-    // Check for single identifier, like 'gql'
-    if (node.tag.type !== "Identifier" || node.tag.name !== tagName) {
-      return false;
-    }
-  } else if (tagNameSegments === 2) {
-    // Check for dotted identifier, like 'Relay.QL'
-    if (node.tag.type !== "MemberExpression" || node.tag.object.name + "." + node.tag.property.name !== tagName) {
-      return false;
-    }
-  } else {
-    // We don't currently support 3 segments so ignore
-    return false;
-  }
-  return true;
-}
-
-function createRule(context, optionParser) {
-  var tagNames = new Set();
-  var tagRules = [];
-  var options = context.options.length === 0 ? [{}] : context.options;
-  var _iteratorNormalCompletion = true;
-  var _didIteratorError = false;
-  var _iteratorError = undefined;
-
-  try {
-    var _loop = function _loop() {
-      var optionGroup = _step.value;
-
-      var _optionParser = optionParser(optionGroup),
-          schema = _optionParser.schema,
-          env = _optionParser.env,
-          tagName = _optionParser.tagName,
-          validators = _optionParser.validators;
-
-      var boundValidators = validators.map(function (v) {
-        return function (ctx) {
-          return v(ctx, optionGroup);
-        };
-      });
-      if (tagNames.has(tagName)) {
-        throw new Error("Multiple options for GraphQL tag " + tagName);
-      }
-      tagNames.add(tagName);
-      tagRules.push({ schema: schema, env: env, tagName: tagName, validators: boundValidators });
-    };
-
-    for (var _iterator = options[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-      _loop();
-    }
-  } catch (err) {
-    _didIteratorError = true;
-    _iteratorError = err;
-  } finally {
-    try {
-      if (!_iteratorNormalCompletion && _iterator.return) {
-        _iterator.return();
-      }
-    } finally {
-      if (_didIteratorError) {
-        throw _iteratorError;
-      }
-    }
-  }
-
-  return {
-    TaggedTemplateExpression: function TaggedTemplateExpression(node) {
-      var _iteratorNormalCompletion2 = true;
-      var _didIteratorError2 = false;
-      var _iteratorError2 = undefined;
-
-      try {
-        for (var _iterator2 = tagRules[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
-          var _ref2 = _step2.value;
-          var schema = _ref2.schema,
-              env = _ref2.env,
-              tagName = _ref2.tagName,
-              validators = _ref2.validators;
-
-          if (templateExpressionMatchesTag(tagName, node)) {
-            return handleTemplateTag(node, context, schema, env, validators);
-          }
-        }
-      } catch (err) {
-        _didIteratorError2 = true;
-        _iteratorError2 = err;
-      } finally {
-        try {
-          if (!_iteratorNormalCompletion2 && _iterator2.return) {
-            _iterator2.return();
-          }
-        } finally {
-          if (_didIteratorError2) {
-            throw _iteratorError2;
-          }
-        }
-      }
-    }
-  };
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-graphql/lib/customGraphQLValidationRules.js b/node_modules/eslint-plugin-graphql/lib/customGraphQLValidationRules.js
deleted file mode 100644
index d7dc88b..0000000
--- a/node_modules/eslint-plugin-graphql/lib/customGraphQLValidationRules.js
+++ /dev/null
@@ -1,162 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.OperationsMustHaveNames = OperationsMustHaveNames;
-exports.RequiredFields = RequiredFields;
-exports.typeNamesShouldBeCapitalized = typeNamesShouldBeCapitalized;
-exports.noDeprecatedFields = noDeprecatedFields;
-
-var _graphql = require("graphql");
-
-function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
-
-function OperationsMustHaveNames(context) {
-  return {
-    OperationDefinition: function OperationDefinition(node) {
-      if (!node.name) {
-        context.reportError(new _graphql.GraphQLError("All operations must be named", [node]));
-      }
-    }
-  };
-}
-
-function getFieldWasRequestedOnNode(node, field) {
-  return node.selectionSet.selections.some(function (n) {
-    return n.kind === "Field" && n.name.value === field;
-  });
-}
-
-function fieldAvailableOnType(type, field) {
-  if (!type) {
-    return false;
-  }
-
-  return type._fields && type._fields[field] || type.ofType && fieldAvailableOnType(type.ofType, field);
-}
-
-function RequiredFields(context, options) {
-  var requiredFields = options.requiredFields;
-
-
-  return {
-    FragmentDefinition: function FragmentDefinition(node) {
-      requiredFields.forEach(function (field) {
-        var type = context.getType();
-
-        if (fieldAvailableOnType(type, field)) {
-          var fieldWasRequested = getFieldWasRequestedOnNode(node, field);
-          if (!fieldWasRequested) {
-            context.reportError(new _graphql.GraphQLError("'" + field + "' field required on 'fragment " + node.name.value + " on " + node.typeCondition.name.value + "'", [node]));
-          }
-        }
-      });
-    },
-
-
-    // Every inline fragment must have the required field specified inside
-    // itself or in some parent selection set.
-    InlineFragment: function InlineFragment(node, key, parent, path, ancestors) {
-      requiredFields.forEach(function (field) {
-        var type = context.getType();
-
-        if (fieldAvailableOnType(type, field)) {
-          // First, check the selection set on this inline fragment
-          if (node.selectionSet && getFieldWasRequestedOnNode(node, field)) {
-            return true;
-          }
-
-          var ancestorClone = [].concat(_toConsumableArray(ancestors));
-
-          var nearestFieldOrExecutableDefinition = void 0;
-          var nextAncestor = void 0;
-
-          // Now, walk up the ancestors, until you see a field or executable definition.
-          while (!nearestFieldOrExecutableDefinition) {
-            nextAncestor = ancestorClone.pop();
-
-            if (nextAncestor.selectionSet && getFieldWasRequestedOnNode(nextAncestor, field)) {
-              return true;
-            }
-
-            if (nextAncestor.kind === "Field" || nextAncestor.kind === "FragmentDefinition" || nextAncestor.kind === "OperationDefiniton") {
-              nearestFieldOrExecutableDefinition = nextAncestor;
-            }
-          }
-
-          // If we never found a field or executable definition, the query is malformed
-          if (!nearestFieldOrExecutableDefinition) {
-            throw new Error("Inline fragment found inside document without a parent field, fragment definition, or operation definition.");
-          }
-
-          // We found a field or executable definition, but we never saw the field we were looking for in
-          // the intermediate selection sets.
-          context.reportError(new _graphql.GraphQLError("'" + field + "' field required on '... on " + node.typeCondition.name.value + "'", [node]));
-        }
-      });
-    },
-
-
-    // Every field that can have the field directly on it, should. It's not
-    // enough to have some child fragment to include the field, since we don't
-    // know if that fragment covers all of the possible type options.
-    Field: function Field(node) {
-      var def = context.getFieldDef();
-      if (!def) {
-        return;
-      }
-
-      requiredFields.forEach(function (field) {
-        if (fieldAvailableOnType(def.type, field)) {
-          var fieldWasRequested = getFieldWasRequestedOnNode(node, field);
-          if (!fieldWasRequested) {
-            context.reportError(new _graphql.GraphQLError("'" + field + "' field required on '" + node.name.value + "'", [node]));
-          }
-        }
-      });
-    }
-  };
-}
-
-function typeNamesShouldBeCapitalized(context) {
-  return {
-    NamedType: function NamedType(node) {
-      var typeName = node.name.value;
-      if (typeName[0] == typeName[0].toLowerCase()) {
-        context.reportError(new _graphql.GraphQLError("All type names should start with a capital letter", [node]));
-      }
-    }
-  };
-}
-
-// Mostly taken from https://github.com/graphql/graphql-js/blob/063148de039b02670a760b8d3dfaf2a04a467169/src/utilities/findDeprecatedUsages.js
-// See explanation in [#93](https://github.com/apollographql/eslint-plugin-graphql/pull/93)
-function noDeprecatedFields(context) {
-  return {
-    Field: function Field(node) {
-      var fieldDef = context.getFieldDef();
-      if (fieldDef && fieldDef.isDeprecated) {
-        var parentType = context.getParentType();
-        if (parentType) {
-          var reason = fieldDef.deprecationReason;
-          context.reportError(new _graphql.GraphQLError("The field " + parentType.name + "." + fieldDef.name + " is deprecated." + (reason ? " " + reason : ""), [node]));
-        }
-      }
-    },
-    EnumValue: function EnumValue(node) {
-      // context is of type ValidationContext which doesn't export getEnumValue.
-      // Bypass the public API to grab that information directly from _typeInfo.
-      var enumVal = context._typeInfo.getEnumValue();
-      if (enumVal && enumVal.isDeprecated) {
-        var type = (0, _graphql.getNamedType)(context.getInputType());
-        if (!type) {
-          return;
-        }
-
-        var reason = enumVal.deprecationReason;
-        context.reportError(new _graphql.GraphQLError("The enum value " + type.name + "." + enumVal.name + " is deprecated." + (reason ? " " + reason : ""), [node]));
-      }
-    }
-  };
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-graphql/lib/index.js b/node_modules/eslint-plugin-graphql/lib/index.js
deleted file mode 100644
index 16e9e0c..0000000
--- a/node_modules/eslint-plugin-graphql/lib/index.js
+++ /dev/null
@@ -1,356 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.processors = exports.rules = undefined;
-
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _fs = require("fs");
-
-var _fs2 = _interopRequireDefault(_fs);
-
-var _path = require("path");
-
-var _path2 = _interopRequireDefault(_path);
-
-var _graphql = require("graphql");
-
-var _lodash = require("lodash");
-
-var _graphqlConfig = require("graphql-config");
-
-var _customGraphQLValidationRules = require("./customGraphQLValidationRules");
-
-var customRules = _interopRequireWildcard(_customGraphQLValidationRules);
-
-var _constants = require("./constants");
-
-var _createRule = require("./createRule");
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var allGraphQLValidatorNames = _graphql.specifiedRules.map(function (rule) {
-  return rule.name;
-});
-
-// Map of env name to list of rule names.
-var envGraphQLValidatorNames = {
-  apollo: (0, _lodash.without)(allGraphQLValidatorNames, "KnownFragmentNames", "NoUnusedFragments"),
-  lokka: (0, _lodash.without)(allGraphQLValidatorNames, "KnownFragmentNames", "NoUnusedFragments"),
-  fraql: (0, _lodash.without)(allGraphQLValidatorNames, "KnownFragmentNames", "NoUnusedFragments"),
-  relay: (0, _lodash.without)(allGraphQLValidatorNames, "KnownDirectives", "KnownFragmentNames", "NoUndefinedVariables", "NoUnusedFragments",
-  // `graphql` < 14
-  "ProvidedNonNullArguments",
-  // `graphql`@14
-  "ProvidedRequiredArguments", "ScalarLeafs"),
-  literal: (0, _lodash.without)(allGraphQLValidatorNames, "KnownFragmentNames", "NoUnusedFragments")
-};
-
-var gqlFiles = ["gql", "graphql"];
-
-var defaultRuleProperties = {
-  env: {
-    enum: ["lokka", "fraql", "relay", "apollo", "literal"]
-  },
-  schemaJson: {
-    type: "object"
-  },
-  schemaJsonFilepath: {
-    type: "string"
-  },
-  schemaString: {
-    type: "string"
-  },
-  tagName: {
-    type: "string",
-    pattern: "^[$_a-zA-Z$_][a-zA-Z0-9$_]+(\\.[a-zA-Z0-9$_]+)?$"
-  },
-  projectName: {
-    type: "string"
-  }
-};
-
-// schemaJson, schemaJsonFilepath, schemaString and projectName are mutually exclusive:
-var schemaPropsExclusiveness = {
-  oneOf: [{
-    required: ["schemaJson"],
-    not: { required: ["schemaString", "schemaJsonFilepath", "projectName"] }
-  }, {
-    required: ["schemaJsonFilepath"],
-    not: { required: ["schemaJson", "schemaString", "projectName"] }
-  }, {
-    required: ["schemaString"],
-    not: { required: ["schemaJson", "schemaJsonFilepath", "projectName"] }
-  }, {
-    not: {
-      anyOf: [{ required: ["schemaString"] }, { required: ["schemaJson"] }, { required: ["schemaJsonFilepath"] }]
-    }
-  }]
-};
-
-var rules = exports.rules = {
-  "template-strings": {
-    meta: {
-      schema: {
-        type: "array",
-        items: _extends({
-          additionalProperties: false,
-          properties: _extends({}, defaultRuleProperties, {
-            validators: {
-              oneOf: [{
-                type: "array",
-                uniqueItems: true,
-                items: {
-                  enum: allGraphQLValidatorNames
-                }
-              }, {
-                enum: ["all"]
-              }]
-            }
-          })
-        }, schemaPropsExclusiveness)
-      }
-    },
-    create: function create(context) {
-      return (0, _createRule.createRule)(context, function (optionGroup) {
-        return parseOptions(optionGroup, context);
-      });
-    }
-  },
-  "named-operations": {
-    meta: {
-      schema: {
-        type: "array",
-        items: _extends({
-          additionalProperties: false,
-          properties: _extends({}, defaultRuleProperties)
-        }, schemaPropsExclusiveness)
-      }
-    },
-    create: function create(context) {
-      return (0, _createRule.createRule)(context, function (optionGroup) {
-        return parseOptions(_extends({
-          validators: ["OperationsMustHaveNames"]
-        }, optionGroup), context);
-      });
-    }
-  },
-  "required-fields": {
-    meta: {
-      schema: {
-        type: "array",
-        minItems: 1,
-        items: _extends({
-          additionalProperties: false,
-          properties: _extends({}, defaultRuleProperties, {
-            requiredFields: {
-              type: "array",
-              items: {
-                type: "string"
-              }
-            }
-          }),
-          required: ["requiredFields"]
-        }, schemaPropsExclusiveness)
-      }
-    },
-    create: function create(context) {
-      return (0, _createRule.createRule)(context, function (optionGroup) {
-        return parseOptions(_extends({
-          validators: ["RequiredFields"],
-          options: { requiredFields: optionGroup.requiredFields }
-        }, optionGroup), context);
-      });
-    }
-  },
-  "capitalized-type-name": {
-    meta: {
-      schema: {
-        type: "array",
-        items: _extends({
-          additionalProperties: false,
-          properties: _extends({}, defaultRuleProperties)
-        }, schemaPropsExclusiveness)
-      }
-    },
-    create: function create(context) {
-      return (0, _createRule.createRule)(context, function (optionGroup) {
-        return parseOptions(_extends({
-          validators: ["typeNamesShouldBeCapitalized"]
-        }, optionGroup), context);
-      });
-    }
-  },
-  "no-deprecated-fields": {
-    meta: {
-      schema: {
-        type: "array",
-        items: _extends({
-          additionalProperties: false,
-          properties: _extends({}, defaultRuleProperties)
-        }, schemaPropsExclusiveness)
-      }
-    },
-    create: function create(context) {
-      return (0, _createRule.createRule)(context, function (optionGroup) {
-        return parseOptions(_extends({
-          validators: ["noDeprecatedFields"]
-        }, optionGroup), context);
-      });
-    }
-  }
-};
-
-var schemaCache = {};
-var projectCache = {};
-
-function parseOptions(optionGroup, context) {
-  var schemaJson = optionGroup.schemaJson,
-      schemaJsonFilepath = optionGroup.schemaJsonFilepath,
-      schemaString = optionGroup.schemaString,
-      env = optionGroup.env,
-      projectName = optionGroup.projectName,
-      tagNameOption = optionGroup.tagName,
-      validatorNamesOption = optionGroup.validators;
-
-
-  var cacheHit = schemaCache[JSON.stringify(optionGroup)];
-  if (cacheHit && env !== "literal") {
-    return cacheHit;
-  }
-
-  // Validate and unpack schema
-  var schema = void 0;
-  if (schemaJson) {
-    schema = initSchema(schemaJson);
-  } else if (schemaJsonFilepath) {
-    schema = initSchemaFromFile(schemaJsonFilepath);
-  } else if (schemaString) {
-    schema = initSchemaFromString(schemaString);
-  } else {
-    try {
-      var config = (0, _graphqlConfig.getGraphQLConfig)(_path2.default.dirname(context.getFilename()));
-      var projectConfig = void 0;
-      if (projectName) {
-        projectConfig = config.getProjects()[projectName];
-        if (!projectConfig) {
-          throw new Error("Project with name \"" + projectName + "\" not found in " + config.configPath + ".");
-        }
-      } else {
-        projectConfig = config.getConfigForFile(context.getFilename());
-      }
-      if (projectConfig) {
-        var key = config.configPath + "[" + projectConfig.projectName + "]";
-        schema = projectCache[key];
-        if (!schema) {
-          schema = projectConfig.getSchema();
-          projectCache[key] = schema;
-        }
-      }
-      if (cacheHit) {
-        return _extends({}, cacheHit, { schema: schema });
-      }
-    } catch (e) {
-      if (e instanceof _graphqlConfig.ConfigNotFoundError) {
-        throw new Error("Must provide .graphqlconfig file or pass in `schemaJson` option " + "with schema object or `schemaJsonFilepath` with absolute path to the json file.");
-      }
-      throw e;
-    }
-  }
-
-  // Validate env
-  if (env && env !== "lokka" && env !== "fraql" && env !== "relay" && env !== "apollo" && env !== "literal") {
-    throw new Error("Invalid option for env, only `apollo`, `lokka`, `fraql`, `relay`, and `literal` supported.");
-  }
-
-  // Validate tagName and set default
-  var tagName = void 0;
-  if (tagNameOption) {
-    tagName = tagNameOption;
-  } else if (env === "relay") {
-    tagName = "Relay.QL";
-  } else if (env === "literal") {
-    tagName = _constants.internalTag;
-  } else {
-    tagName = "gql";
-  }
-
-  // The validator list may be:
-  //    The string 'all' to use all rules.
-  //    An array of rule names.
-  //    null/undefined to use the default rule set of the environment, or all rules.
-  var validatorNames = void 0;
-  if (validatorNamesOption === "all") {
-    validatorNames = allGraphQLValidatorNames;
-  } else if (validatorNamesOption) {
-    validatorNames = validatorNamesOption;
-  } else {
-    validatorNames = envGraphQLValidatorNames[env] || allGraphQLValidatorNames;
-  }
-
-  var validators = validatorNames.map(function (name) {
-    if (name in customRules) {
-      return customRules[name];
-    } else {
-      return require("graphql/validation/rules/" + name)[name];
-    }
-  });
-  var results = { schema: schema, env: env, tagName: tagName, validators: validators };
-  schemaCache[JSON.stringify(optionGroup)] = results;
-  return results;
-}
-
-function initSchema(json) {
-  var unpackedSchemaJson = json.data ? json.data : json;
-  if (!unpackedSchemaJson.__schema) {
-    throw new Error("Please pass a valid GraphQL introspection query result.");
-  }
-  return (0, _graphql.buildClientSchema)(unpackedSchemaJson);
-}
-
-function initSchemaFromFile(jsonFile) {
-  return initSchema(JSON.parse(_fs2.default.readFileSync(jsonFile, "utf8")));
-}
-
-function initSchemaFromString(source) {
-  return (0, _graphql.buildSchema)(source);
-}
-
-var gqlProcessor = {
-  preprocess: function preprocess(text) {
-    // Wrap the text in backticks and prepend the internal tag. First the text
-    // must be escaped, because of the three sequences that have special
-    // meaning in JavaScript template literals, and could change the meaning of
-    // the text or cause syntax errors.
-    // https://tc39.github.io/ecma262/#prod-TemplateCharacter
-    //
-    // - "`" would end the template literal.
-    // - "\" would start an escape sequence.
-    // - "${" would start an interpolation.
-    var escaped = text.replace(/[`\\]|\$\{/g, "\\$&");
-    return [_constants.internalTag + "`" + escaped + "`"];
-  },
-  postprocess: function postprocess(messages) {
-    // only report graphql-errors
-    return (0, _lodash.flatten)(messages).filter(function (message) {
-      return (0, _lodash.includes)((0, _lodash.keys)(rules).map(function (key) {
-        return "graphql/" + key;
-      }), message.ruleId);
-    });
-  }
-};
-
-var processors = exports.processors = (0, _lodash.reduce)(gqlFiles, function (result, value) {
-  return _extends({}, result, _defineProperty({}, "." + value, gqlProcessor));
-}, {});
-
-exports.default = {
-  rules: rules,
-  processors: processors
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-graphql/package.json b/node_modules/eslint-plugin-graphql/package.json
deleted file mode 100644
index 761585f..0000000
--- a/node_modules/eslint-plugin-graphql/package.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-  "name": "eslint-plugin-graphql",
-  "version": "3.1.1",
-  "description": "GraphQL ESLint plugin.",
-  "author": "Sashko Stubailo",
-  "main": "lib/index.js",
-  "scripts": {
-    "test": "tav --ci && mocha test/index.js",
-    "prepublish": "babel ./src --ignore test --out-dir ./lib",
-    "pretest": "node test/updateSchemaJson.js",
-    "tav": "tav",
-    "lint": "eslint 'src/**/*.js' 'test/**/*.js'"
-  },
-  "homepage": "https://github.com/apollostack/eslint-plugin-graphql",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/apollostack/eslint-plugin-graphql.git"
-  },
-  "devDependencies": {
-    "babel-cli": "6.26.0",
-    "babel-core": "6.26.3",
-    "babel-eslint": "10.0.1",
-    "babel-plugin-transform-runtime": "6.23.0",
-    "babel-preset-es2015": "6.24.1",
-    "babel-preset-stage-0": "6.24.1",
-    "eslint": "5.16.0",
-    "graphql": "14.4.2",
-    "graphql-tools": "4.0.5",
-    "mocha": "6.2.0",
-    "pretty-quick": "1.11.1",
-    "test-all-versions": "4.1.1"
-  },
-  "babel": {
-    "presets": [
-      "es2015",
-      "stage-0"
-    ]
-  },
-  "husky": {
-    "hooks": {
-      "pre-commit": "pretty-quick --staged"
-    }
-  },
-  "engines": {
-    "node": ">=6.0"
-  },
-  "license": "MIT",
-  "dependencies": {
-    "graphql-config": "^2.0.1",
-    "lodash": "^4.11.1"
-  },
-  "peerDependencies": {
-    "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0"
-  }
-}
diff --git a/node_modules/eslint-plugin-graphql/renovate.json b/node_modules/eslint-plugin-graphql/renovate.json
deleted file mode 100644
index f45d8f1..0000000
--- a/node_modules/eslint-plugin-graphql/renovate.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "extends": [
-    "config:base"
-  ]
-}
diff --git a/node_modules/eslint-plugin-graphql/screenshot.png b/node_modules/eslint-plugin-graphql/screenshot.png
deleted file mode 100644
index 82ce807..0000000
--- a/node_modules/eslint-plugin-graphql/screenshot.png
+++ /dev/null
Binary files differ
diff --git a/node_modules/eslint-plugin-import/CHANGELOG.md b/node_modules/eslint-plugin-import/CHANGELOG.md
index 80912e5..5ba0cb6 100644
--- a/node_modules/eslint-plugin-import/CHANGELOG.md
+++ b/node_modules/eslint-plugin-import/CHANGELOG.md
@@ -6,13 +6,92 @@
 
 ## [Unreleased]
 
+## [2.22.1] - 2020-09-27
+### Fixed
+- [`default`]/TypeScript: avoid crash on `export =` with a MemberExpression ([#1841], thanks [@ljharb])
+- [`extensions`]/importType: Fix @/abc being treated as scoped module ([#1854], thanks [@3nuc])
+- allow using rest operator in named export ([#1878], thanks [@foray1010])
+- [`dynamic-import-chunkname`]: allow single quotes to match Webpack support ([#1848], thanks [@straub])
+
+### Changed
+- [`export`]: add tests for a name collision with `export * from` ([#1704], thanks @tomprats)
+
+## [2.22.0] - 2020-06-26
+### Added
+- [`no-unused-modules`]: consider exported TypeScript interfaces, types and enums ([#1819], thanks [@nicolashenry])
+- [`no-cycle`]: allow `maxDepth` option to be `"∞"` (thanks [@ljharb])
+
+### Fixed
+- [`order`]/TypeScript: properly support `import = object` expressions ([#1823], thanks [@manuth])
+- [`no-extraneous-dependencies`]/TypeScript: do not error when importing type from dev dependencies ([#1820], thanks [@fernandopasik])
+- [`default`]: avoid crash with `export =` ([#1822], thanks [@AndrewLeedham])
+- [`order`]/[`newline-after-import`]: ignore TypeScript's "export import object" ([#1830], thanks [@be5invis])
+- [`dynamic-import-chunkname`]/TypeScript: supports `@typescript-eslint/parser` ([#1833], thanks [@noelebrun])
+- [`order`]/TypeScript: ignore ordering of object imports ([#1831], thanks [@manuth])
+- [`namespace`]: do not report on shadowed import names ([#518], thanks [@ljharb])
+- [`export`]: avoid warning on `export * as` non-conflicts ([#1834], thanks [@ljharb])
+
+### Changed
+- [`no-extraneous-dependencies`]: add tests for importing types ([#1824], thanks [@taye])
+- [docs] [`no-default-export`]: Fix docs url ([#1836], thanks [@beatrizrezener])
+- [docs] [`imports-first`]: deprecation info and link to `first` docs ([#1835], thanks [@beatrizrezener])
+
+## [2.21.2] - 2020-06-09
+### Fixed
+- [`order`]: avoid a crash on TypeScript’s `export import` syntax ([#1808], thanks [@ljharb])
+- [`newline-after-import`]: consider TypeScript `import =` syntax' ([#1811], thanks [@ljharb])
+- [`no-internal-modules`]: avoid a crash on a named export declaration ([#1814], thanks [@ljharb])
+
+## [2.21.1] - 2020-06-07
+### Fixed
+- TypeScript: [`import/named`]: avoid requiring `typescript` when not using TS ([#1805], thanks [@ljharb])
+
+## [2.21.0] - 2020-06-07
+### Added
+- [`import/default`]: support default export in TSExportAssignment ([#1528], thanks [@joaovieira])
+- [`no-cycle`]: add `ignoreExternal` option ([#1681], thanks [@sveyret])
+- [`order`]: Add support for TypeScript's "import equals"-expressions ([#1785], thanks [@manuth])
+- [`import/default`]: support default export in TSExportAssignment ([#1689], thanks [@Maxim-Mazurok])
+- [`no-restricted-paths`]: add custom message support ([#1802], thanks [@malykhinvi])
+
+### Fixed
+- [`group-exports`]: Flow type export awareness ([#1702], thanks [@ernestostifano])
+- [`order`]: Recognize pathGroup config for first group ([#1719], [#1724], thanks [@forivall], [@xpl])
+- [`no-unused-modules`]: Fix re-export not counting as usage when used in combination with import ([#1722], thanks [@Ephem])
+- [`no-duplicates`]: Handle TS import type ([#1676], thanks [@kmui2])
+- [`newline-after-import`]: recognize decorators ([#1139], thanks [@atos1990])
+- [`no-unused-modules`]: Revert "[flow] `no-unused-modules`: add flow type support" ([#1770], thanks [@Hypnosphi])
+- TypeScript: Add nested namespace handling ([#1763], thanks [@julien1619])
+- [`namespace`]/`ExportMap`: Fix interface declarations for TypeScript ([#1764], thanks [@julien1619])
+- [`no-unused-modules`]: avoid order-dependence ([#1744], thanks [@darkartur])
+- [`no-internal-modules`]: also check `export from` syntax ([#1691], thanks [@adjerbetian])
+- TypeScript: [`export`]: avoid a crash with `export =` ([#1801], thanks [@ljharb])
+
+### Changed
+- [Refactor] `no-extraneous-dependencies`: use moduleVisitor ([#1735], thanks [@adamborowski])
+- TypeScript config: Disable [`named`][] ([#1726], thanks [@astorije])
+- [readme] Remove duplicate no-unused-modules from docs ([#1690], thanks [@arvigeus])
+- [Docs] `order`: fix bad inline config ([#1788], thanks [@nickofthyme])
+- [Tests] Add fix for Windows Subsystem for Linux ([#1786], thanks [@manuth])
+- [Docs] `no-unused-rules`: Fix docs for unused exports ([#1776], thanks [@barbogast])
+- [eslint] bump minimum v7 version to v7.2.0
+
+## [2.20.2] - 2020-03-28
+### Fixed
+- [`order`]: fix `isExternalModule` detect on windows ([#1651], thanks [@fisker])
+- [`order`]: recognize ".." as a "parent" path ([#1658], thanks [@golopot])
+- [`no-duplicates`]: fix fixer on cases with default import ([#1666], thanks [@golopot])
+- [`no-unused-modules`]: Handle `export { default } from` syntax ([#1631], thanks [@richardxia])
+- [`first`]: Add a way to disable `absolute-first` explicitly ([#1664], thanks [@TheCrueltySage])
+- [Docs] `no-webpack-loader-syntax`: Updates webpack URLs ([#1751], thanks [@MikeyBeLike])
+
 ## [2.20.1] - 2020-02-01
 ### Fixed
 - [`export`]: Handle function overloading in `*.d.ts` ([#1619], thanks [@IvanGoncharov])
 - [`no-absolute-path`]: fix a crash with invalid import syntax ([#1616], thanks [@ljharb])
 - [`import/external-module-folders` setting] now correctly works with directories containing modules symlinked from `node_modules` ([#1605], thanks [@skozin])
 - [`extensions`]: for invalid code where `name` does not exist, do not crash ([#1613], thanks [@ljharb])
-- [`extentions`]: Fix scope regex ([#1611], thanks [@yordis])
+- [`extensions`]: Fix scope regex ([#1611], thanks [@yordis])
 - [`no-duplicates`]: allow duplicate imports if one is a namespace and the other not ([#1612], thanks [@sveyret])
 - Add some missing rule meta schemas and types ([#1620], thanks [@bmish])
 - [`named`]: for importing from a module which re-exports named exports from a `node_modules` module ([#1569], [#1447], thanks [@redbugz], [@kentcdodds])
@@ -21,6 +100,7 @@
 ### Changed
 - [`import/external-module-folders` setting] behavior is more strict now: it will only match complete path segments ([#1605], thanks [@skozin])
 - [meta] fix "files" field to include/exclude the proper files ([#1635], thanks [@ljharb])
+- [Tests] `order`: Add TS import type tests ([#1736], thanks [@kmui2])
 
 ## [2.20.0] - 2020-01-10
 ### Added
@@ -652,7 +732,51 @@
 
 [`memo-parser`]: ./memo-parser/README.md
 
+[#1878]: https://github.com/benmosher/eslint-plugin-import/pull/1878
+[#1854]: https://github.com/benmosher/eslint-plugin-import/issues/1854
+[#1848]: https://github.com/benmosher/eslint-plugin-import/pull/1848
+[#1841]: https://github.com/benmosher/eslint-plugin-import/issues/1841
+[#1836]: https://github.com/benmosher/eslint-plugin-import/pull/1836
+[#1835]: https://github.com/benmosher/eslint-plugin-import/pull/1835
+[#1834]: https://github.com/benmosher/eslint-plugin-import/issues/1834
+[#1833]: https://github.com/benmosher/eslint-plugin-import/pull/1833
+[#1831]: https://github.com/benmosher/eslint-plugin-import/pull/1831
+[#1830]: https://github.com/benmosher/eslint-plugin-import/pull/1830
+[#1824]: https://github.com/benmosher/eslint-plugin-import/pull/1824
+[#1823]: https://github.com/benmosher/eslint-plugin-import/pull/1823
+[#1822]: https://github.com/benmosher/eslint-plugin-import/pull/1822
+[#1820]: https://github.com/benmosher/eslint-plugin-import/pull/1820
+[#1819]: https://github.com/benmosher/eslint-plugin-import/pull/1819
+[#1802]: https://github.com/benmosher/eslint-plugin-import/pull/1802
+[#1801]: https://github.com/benmosher/eslint-plugin-import/issues/1801
+[#1788]: https://github.com/benmosher/eslint-plugin-import/pull/1788
+[#1786]: https://github.com/benmosher/eslint-plugin-import/pull/1786
+[#1785]: https://github.com/benmosher/eslint-plugin-import/pull/1785
+[#1776]: https://github.com/benmosher/eslint-plugin-import/pull/1776
+[#1770]: https://github.com/benmosher/eslint-plugin-import/pull/1770
+[#1764]: https://github.com/benmosher/eslint-plugin-import/pull/1764
+[#1763]: https://github.com/benmosher/eslint-plugin-import/pull/1763
+[#1751]: https://github.com/benmosher/eslint-plugin-import/pull/1751
+[#1744]: https://github.com/benmosher/eslint-plugin-import/pull/1744
+[#1736]: https://github.com/benmosher/eslint-plugin-import/pull/1736
+[#1735]: https://github.com/benmosher/eslint-plugin-import/pull/1735
+[#1726]: https://github.com/benmosher/eslint-plugin-import/pull/1726
+[#1724]: https://github.com/benmosher/eslint-plugin-import/pull/1724
+[#1722]: https://github.com/benmosher/eslint-plugin-import/issues/1722
+[#1719]: https://github.com/benmosher/eslint-plugin-import/pull/1719
+[#1704]: https://github.com/benmosher/eslint-plugin-import/issues/1704
+[#1702]: https://github.com/benmosher/eslint-plugin-import/issues/1702
+[#1691]: https://github.com/benmosher/eslint-plugin-import/pull/1691
+[#1690]: https://github.com/benmosher/eslint-plugin-import/pull/1690
+[#1689]: https://github.com/benmosher/eslint-plugin-import/pull/1689
+[#1681]: https://github.com/benmosher/eslint-plugin-import/pull/1681
+[#1676]: https://github.com/benmosher/eslint-plugin-import/pull/1676
+[#1666]: https://github.com/benmosher/eslint-plugin-import/pull/1666
+[#1664]: https://github.com/benmosher/eslint-plugin-import/pull/1664
+[#1658]: https://github.com/benmosher/eslint-plugin-import/pull/1658
+[#1651]: https://github.com/benmosher/eslint-plugin-import/pull/1651
 [#1635]: https://github.com/benmosher/eslint-plugin-import/issues/1635
+[#1631]: https://github.com/benmosher/eslint-plugin-import/issues/1631
 [#1625]: https://github.com/benmosher/eslint-plugin-import/pull/1625
 [#1620]: https://github.com/benmosher/eslint-plugin-import/pull/1620
 [#1619]: https://github.com/benmosher/eslint-plugin-import/pull/1619
@@ -669,6 +793,7 @@
 [#1560]: https://github.com/benmosher/eslint-plugin-import/pull/1560
 [#1551]: https://github.com/benmosher/eslint-plugin-import/pull/1551
 [#1542]: https://github.com/benmosher/eslint-plugin-import/pull/1542
+[#1528]: https://github.com/benmosher/eslint-plugin-import/pull/1528
 [#1526]: https://github.com/benmosher/eslint-plugin-import/pull/1526
 [#1521]: https://github.com/benmosher/eslint-plugin-import/pull/1521
 [#1519]: https://github.com/benmosher/eslint-plugin-import/pull/1519
@@ -734,6 +859,7 @@
 [#1157]: https://github.com/benmosher/eslint-plugin-import/pull/1157
 [#1151]: https://github.com/benmosher/eslint-plugin-import/pull/1151
 [#1142]: https://github.com/benmosher/eslint-plugin-import/pull/1142
+[#1139]: https://github.com/benmosher/eslint-plugin-import/pull/1139
 [#1137]: https://github.com/benmosher/eslint-plugin-import/pull/1137
 [#1135]: https://github.com/benmosher/eslint-plugin-import/pull/1135
 [#1128]: https://github.com/benmosher/eslint-plugin-import/pull/1128
@@ -781,6 +907,7 @@
 [#555]: https://github.com/benmosher/eslint-plugin-import/pull/555
 [#538]: https://github.com/benmosher/eslint-plugin-import/pull/538
 [#527]: https://github.com/benmosher/eslint-plugin-import/pull/527
+[#518]: https://github.com/benmosher/eslint-plugin-import/pull/518
 [#509]: https://github.com/benmosher/eslint-plugin-import/pull/509
 [#508]: https://github.com/benmosher/eslint-plugin-import/pull/508
 [#503]: https://github.com/benmosher/eslint-plugin-import/pull/503
@@ -823,6 +950,10 @@
 [#211]: https://github.com/benmosher/eslint-plugin-import/pull/211
 [#164]: https://github.com/benmosher/eslint-plugin-import/pull/164
 [#157]: https://github.com/benmosher/eslint-plugin-import/pull/157
+[#1814]: https://github.com/benmosher/eslint-plugin-import/issues/1814
+[#1811]: https://github.com/benmosher/eslint-plugin-import/issues/1811
+[#1808]: https://github.com/benmosher/eslint-plugin-import/issues/1808
+[#1805]: https://github.com/benmosher/eslint-plugin-import/issues/1805
 [#1565]: https://github.com/benmosher/eslint-plugin-import/issues/1565
 [#1366]: https://github.com/benmosher/eslint-plugin-import/issues/1366
 [#1334]: https://github.com/benmosher/eslint-plugin-import/issues/1334
@@ -908,7 +1039,13 @@
 [#119]: https://github.com/benmosher/eslint-plugin-import/issues/119
 [#89]: https://github.com/benmosher/eslint-plugin-import/issues/89
 
-[Unreleased]: https://github.com/benmosher/eslint-plugin-import/compare/v2.20.1...HEAD
+[Unreleased]: https://github.com/benmosher/eslint-plugin-import/compare/v2.22.1...HEAD
+[2.22.1]: https://github.com/benmosher/eslint-plugin-import/compare/v2.22.0...v2.22.1
+[2.22.0]: https://github.com/benmosher/eslint-plugin-import/compare/v2.21.1...v2.22.0
+[2.21.2]: https://github.com/benmosher/eslint-plugin-import/compare/v2.21.1...v2.21.2
+[2.21.1]: https://github.com/benmosher/eslint-plugin-import/compare/v2.21.0...v2.21.1
+[2.21.0]: https://github.com/benmosher/eslint-plugin-import/compare/v2.20.2...v2.21.0
+[2.20.1]: https://github.com/benmosher/eslint-plugin-import/compare/v2.20.1...v2.20.2
 [2.20.0]: https://github.com/benmosher/eslint-plugin-import/compare/v2.20.0...v2.20.1
 [2.19.1]: https://github.com/benmosher/eslint-plugin-import/compare/v2.19.1...v2.20.0
 [2.19.1]: https://github.com/benmosher/eslint-plugin-import/compare/v2.19.0...v2.19.1
@@ -974,6 +1111,7 @@
 [0.12.1]: https://github.com/benmosher/eslint-plugin-import/compare/v0.12.0...v0.12.1
 [0.12.0]: https://github.com/benmosher/eslint-plugin-import/compare/v0.11.0...v0.12.0
 [0.11.0]: https://github.com/benmosher/eslint-plugin-import/compare/v0.10.1...v0.11.0
+
 [@mathieudutour]: https://github.com/mathieudutour
 [@gausie]: https://github.com/gausie
 [@singles]: https://github.com/singles
@@ -1105,3 +1243,36 @@
 [@kentcdodds]: https://github.com/kentcdodds
 [@IvanGoncharov]: https://github.com/IvanGoncharov
 [@wschurman]: https://github.com/wschurman
+[@fisker]: https://github.com/fisker
+[@richardxia]: https://github.com/richardxia
+[@TheCrueltySage]: https://github.com/TheCrueltySage
+[@ernestostifano]: https://github.com/ernestostifano
+[@forivall]: https://github.com/forivall
+[@xpl]: https://github.com/xpl
+[@astorije]: https://github.com/astorije
+[@Ephem]: https://github.com/Ephem
+[@kmui2]: https://github.com/kmui2
+[@arvigeus]: https://github.com/arvigeus
+[@atos1990]: https://github.com/atos1990
+[@Hypnosphi]: https://github.com/Hypnosphi
+[@nickofthyme]: https://github.com/nickofthyme
+[@manuth]: https://github.com/manuth
+[@julien1619]: https://github.com/julien1619
+[@darkartur]: https://github.com/darkartur
+[@MikeyBeLike]: https://github.com/MikeyBeLike
+[@barbogast]: https://github.com/barbogast
+[@adamborowski]: https://github.com/adamborowski
+[@adjerbetian]: https://github.com/adjerbetian
+[@Maxim-Mazurok]: https://github.com/Maxim-Mazurok
+[@malykhinvi]: https://github.com/malykhinvi
+[@nicolashenry]: https://github.com/nicolashenry
+[@fernandopasik]: https://github.com/fernandopasik
+[@taye]: https://github.com/taye
+[@AndrewLeedham]: https://github.com/AndrewLeedham
+[@be5invis]: https://github.com/be5invis
+[@noelebrun]: https://github.com/noelebrun
+[@beatrizrezener]: https://github.com/beatrizrezener
+[@3nuc]: https://github.com/3nuc
+[@foray1010]: https://github.com/foray1010
+[@tomprats]: https://github.com/tomprats
+[@straub]: https://github.com/straub
diff --git a/node_modules/eslint-plugin-import/README.md b/node_modules/eslint-plugin-import/README.md
index cc9d1d7..e08e72f 100644
--- a/node_modules/eslint-plugin-import/README.md
+++ b/node_modules/eslint-plugin-import/README.md
@@ -27,7 +27,6 @@
 * Forbid a module from importing a module with a dependency path back to itself ([`no-cycle`])
 * Prevent unnecessary path segments in import and require statements ([`no-useless-path-segments`])
 * Forbid importing modules from parent directories ([`no-relative-parent-imports`])
-* Forbid modules without any export, and exports not imported by any modules. ([`no-unused-modules`])
 
 [`no-unresolved`]: ./docs/rules/no-unresolved.md
 [`named`]: ./docs/rules/named.md
@@ -42,7 +41,6 @@
 [`no-cycle`]: ./docs/rules/no-cycle.md
 [`no-useless-path-segments`]: ./docs/rules/no-useless-path-segments.md
 [`no-relative-parent-imports`]: ./docs/rules/no-relative-parent-imports.md
-[`no-unused-modules`]: ./docs/rules/no-unused-modules.md
 
 ### Helpful warnings
 
diff --git a/node_modules/eslint-plugin-import/config/typescript.js b/node_modules/eslint-plugin-import/config/typescript.js
index 262e3c7..705faaf 100644
--- a/node_modules/eslint-plugin-import/config/typescript.js
+++ b/node_modules/eslint-plugin-import/config/typescript.js
@@ -19,4 +19,10 @@
     },
   },
 
+  rules: {
+    // analysis/correctness
+
+    // TypeScript compilation already ensures that named imports exist in the referenced module
+    'import/named': 'off',
+  },
 }
diff --git a/node_modules/eslint-plugin-import/docs/rules/dynamic-import-chunkname.md b/node_modules/eslint-plugin-import/docs/rules/dynamic-import-chunkname.md
index 4bcc5a9..d29c06b 100644
--- a/node_modules/eslint-plugin-import/docs/rules/dynamic-import-chunkname.md
+++ b/node_modules/eslint-plugin-import/docs/rules/dynamic-import-chunkname.md
@@ -39,12 +39,6 @@
   'someModule',
 );
 
-// using single quotes instead of double quotes
-import(
-  /* webpackChunkName: 'someModule' */
-  'someModule',
-);
-
 // invalid syntax for webpack comment
 import(
   /* totally not webpackChunkName: "someModule" */
@@ -78,6 +72,12 @@
     /* webpackChunkName: "someModule", webpackPrefetch: true */
     'someModule',
   );
+
+  // using single quotes instead of double quotes
+  import(
+    /* webpackChunkName: 'someModule' */
+    'someModule',
+  );
 ```
 
 ## When Not To Use It
diff --git a/node_modules/eslint-plugin-import/docs/rules/group-exports.md b/node_modules/eslint-plugin-import/docs/rules/group-exports.md
index f61ff53..e6b9887 100644
--- a/node_modules/eslint-plugin-import/docs/rules/group-exports.md
+++ b/node_modules/eslint-plugin-import/docs/rules/group-exports.md
@@ -60,6 +60,15 @@
 module.exports = test
 ```
 
+```flow js
+const first = true;
+type firstType = boolean
+
+// A single named export declaration (type exports handled separately) -> ok
+export {first}
+export type {firstType}
+```
+
 
 ### Invalid
 
@@ -94,6 +103,15 @@
 module.exports.second = true
 ```
 
+```flow js
+type firstType = boolean
+type secondType = any
+
+// Multiple named type export statements -> not ok!
+export type {firstType}
+export type {secondType}
+```
+
 ## When Not To Use It
 
 If you do not mind having your exports spread across the file, you can safely turn this rule off.
diff --git a/node_modules/eslint-plugin-import/docs/rules/imports-first.md b/node_modules/eslint-plugin-import/docs/rules/imports-first.md
new file mode 100644
index 0000000..b7f2075
--- /dev/null
+++ b/node_modules/eslint-plugin-import/docs/rules/imports-first.md
@@ -0,0 +1,3 @@
+# imports-first
+
+This rule was **deprecated** in eslint-plugin-import v2.0.0. Please use the corresponding rule [`first`](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/first.md).
diff --git a/node_modules/eslint-plugin-import/docs/rules/no-cycle.md b/node_modules/eslint-plugin-import/docs/rules/no-cycle.md
index 8819d67..7d54e81 100644
--- a/node_modules/eslint-plugin-import/docs/rules/no-cycle.md
+++ b/node_modules/eslint-plugin-import/docs/rules/no-cycle.md
@@ -2,7 +2,7 @@
 
 Ensures that there is no resolvable path back to this module via its dependencies.
 
-This includes cycles of depth 1 (imported module imports me) to `Infinity`, if the
+This includes cycles of depth 1 (imported module imports me) to `"∞"` (or `Infinity`), if the
 [`maxDepth`](#maxdepth) option is not set.
 
 ```js
@@ -55,6 +55,26 @@
 This is not necessarily recommended, but available as a cost/benefit tradeoff mechanism
 for reducing total project lint time, if needed.
 
+#### `ignoreExternal`
+
+An `ignoreExternal` option is available to prevent the cycle detection to expand to external modules:
+
+```js
+/*eslint import/no-cycle: [2, { ignoreExternal: true }]*/
+
+// dep-a.js
+import 'module-b/dep-b.js'
+
+export function a() { /* ... */ }
+```
+
+```js
+// node_modules/module-b/dep-b.js
+import { a } from './dep-a.js' // not reported as this module is external
+```
+
+Its value is `false` by default, but can be set to `true` for reducing total project lint time, if needed.
+
 ## When Not To Use It
 
 This rule is comparatively computationally expensive. If you are pressed for lint
@@ -65,5 +85,8 @@
 
 - [Original inspiring issue](https://github.com/benmosher/eslint-plugin-import/issues/941)
 - Rule to detect that module imports itself: [`no-self-import`]
+- [`import/external-module-folders`] setting
 
 [`no-self-import`]: ./no-self-import.md
+
+[`import/external-module-folders`]: ../../README.md#importexternal-module-folders
diff --git a/node_modules/eslint-plugin-import/docs/rules/no-internal-modules.md b/node_modules/eslint-plugin-import/docs/rules/no-internal-modules.md
index 8d99c35..7bbb2ed 100644
--- a/node_modules/eslint-plugin-import/docs/rules/no-internal-modules.md
+++ b/node_modules/eslint-plugin-import/docs/rules/no-internal-modules.md
@@ -49,6 +49,9 @@
 import { settings } from './app/index'; // Reaching to "./app/index" is not allowed
 import userReducer from './reducer/user'; // Reaching to "./reducer/user" is not allowed
 import configureStore from './redux/configureStore'; // Reaching to "./redux/configureStore" is not allowed
+
+export { settings } from './app/index'; // Reaching to "./app/index" is not allowed
+export * from './reducer/user'; // Reaching to "./reducer/user" is not allowed
 ```
 
 The following patterns are NOT considered problems:
@@ -61,4 +64,7 @@
 import 'source-map-support/register';
 import { settings } from '../app';
 import getUser from '../actions/getUser';
+
+export * from 'source-map-support/register';
+export { settings } from '../app';
 ```
diff --git a/node_modules/eslint-plugin-import/docs/rules/no-restricted-paths.md b/node_modules/eslint-plugin-import/docs/rules/no-restricted-paths.md
index 3776699..bfcb9af 100644
--- a/node_modules/eslint-plugin-import/docs/rules/no-restricted-paths.md
+++ b/node_modules/eslint-plugin-import/docs/rules/no-restricted-paths.md
@@ -10,6 +10,7 @@
 This rule has one option. The option is an object containing the definition of all restricted `zones` and the optional `basePath` which is used to resolve relative paths within.
 The default value for `basePath` is the current working directory.
 Each zone consists of the `target` path and a `from` path. The `target` is the path where the restricted imports should be applied. The `from` path defines the folder that is not allowed to be used in an import. An optional `except` may be defined for a zone, allowing exception paths that would otherwise violate the related `from`. Note that `except` is relative to `from` and cannot backtrack to a parent directory.
+You may also specify an optional `message` for a zone, which will be displayed in case of the rule violation.
 
 ### Examples
 
diff --git a/node_modules/eslint-plugin-import/docs/rules/no-unused-modules.md b/node_modules/eslint-plugin-import/docs/rules/no-unused-modules.md
index 4302bc8..8c23420 100644
--- a/node_modules/eslint-plugin-import/docs/rules/no-unused-modules.md
+++ b/node_modules/eslint-plugin-import/docs/rules/no-unused-modules.md
@@ -58,28 +58,22 @@
 ```js
 import { e } from 'file-a'
 import { f } from 'file-b'
-import * from  'file-c'
-export * from 'file-d'
-export { default, i0 } from 'file-e' // both will be reported
+import * as fileC from  'file-c'
+export { default, i0 } from 'file-d' // both will be reported
 
 export const j = 99 // will be reported 
 ```
-and file-e:
+and file-d:
 ```js
 export const i0 = 9 // will not be reported
 export const i1 = 9 // will be reported
 export default () => {} // will not be reported
 ```
-and file-d:
+and file-c:
 ```js
 export const h = 8 // will not be reported
 export default () => {} // will be reported, as export * only considers named exports and ignores default exports
 ```
-and file-c:
-```js
-export const g = 7 // will not be reported
-export default () => {} // will not be reported
-```
 and file-b:
 ```js
 import two, { b, c, doAnything } from 'file-a'
diff --git a/node_modules/eslint-plugin-import/docs/rules/no-webpack-loader-syntax.md b/node_modules/eslint-plugin-import/docs/rules/no-webpack-loader-syntax.md
index 37b39a4..271c76c 100644
--- a/node_modules/eslint-plugin-import/docs/rules/no-webpack-loader-syntax.md
+++ b/node_modules/eslint-plugin-import/docs/rules/no-webpack-loader-syntax.md
@@ -2,12 +2,12 @@
 
 Forbid Webpack loader syntax in imports.
 
-[Webpack](http://webpack.github.io) allows specifying the [loaders](http://webpack.github.io/docs/loaders.html) to use in the import source string using a special syntax like this:
+[Webpack](https://webpack.js.org) allows specifying the [loaders](https://webpack.js.org/concepts/loaders/) to use in the import source string using a special syntax like this:
 ```js
 var moduleWithOneLoader = require("my-loader!./my-awesome-module");
 ```
 
-This syntax is non-standard, so it couples the code to Webpack. The recommended way to specify Webpack loader configuration is in a [Webpack configuration file](http://webpack.github.io/docs/loaders.html#loaders-by-config).
+This syntax is non-standard, so it couples the code to Webpack. The recommended way to specify Webpack loader configuration is in a [Webpack configuration file](https://webpack.js.org/concepts/loaders/#configuration).
 
 ## Rule Details
 
diff --git a/node_modules/eslint-plugin-import/docs/rules/order.md b/node_modules/eslint-plugin-import/docs/rules/order.md
index 667b633..7d91efd 100644
--- a/node_modules/eslint-plugin-import/docs/rules/order.md
+++ b/node_modules/eslint-plugin-import/docs/rules/order.md
@@ -22,6 +22,8 @@
 import baz from './bar/baz';
 // 6. "index" of the current directory
 import main from './';
+// 7. "object"-imports (only available in TypeScript)
+import log = console.log;
 ```
 
 Unassigned imports are ignored, as the order they are imported in may be important.
@@ -77,12 +79,15 @@
 
 ### `groups: [array]`:
 
-How groups are defined, and the order to respect. `groups` must be an array of `string` or [`string`]. The only allowed `string`s are: `"builtin"`, `"external"`, `"internal"`, `"unknown"`, `"parent"`, `"sibling"`, `"index"`. The enforced order is the same as the order of each element in a group. Omitted types are implicitly grouped together as the last element. Example:
+How groups are defined, and the order to respect. `groups` must be an array of `string` or [`string`]. The only allowed `string`s are:
+`"builtin"`, `"external"`, `"internal"`, `"unknown"`, `"parent"`, `"sibling"`, `"index"`, `"object"`.
+The enforced order is the same as the order of each element in a group. Omitted types are implicitly grouped together as the last element. Example:
 ```js
 [
   'builtin', // Built-in types are first
   ['sibling', 'parent'], // Then sibling and parent types. They can be mingled together
   'index', // Then the index file
+  'object',
   // Then the rest: internal and external type
 ]
 ```
@@ -91,7 +96,7 @@
 You can set the options like this:
 
 ```js
-"import/order": ["error", {"groups": ["index", "sibling", "parent", "internal", "external", "builtin"]}]
+"import/order": ["error", {"groups": ["index", "sibling", "parent", "internal", "external", "builtin", "object"]}]
 ```
 
 ### `pathGroups: [array of objects]`:
@@ -229,7 +234,7 @@
 This will fail the rule check:
 
 ```js
-/* eslint import/order: ["error", {"alphabetize": true}] */
+/* eslint import/order: ["error", {"alphabetize": {"order": "asc", "caseInsensitive": true}}] */
 import React, { PureComponent } from 'react';
 import aTypes from 'prop-types';
 import { compose, apply } from 'xcompose';
@@ -240,7 +245,7 @@
 While this will pass:
 
 ```js
-/* eslint import/order: ["error", {"alphabetize": true}] */
+/* eslint import/order: ["error", {"alphabetize": {"order": "asc", "caseInsensitive": true}}] */
 import blist from 'BList';
 import * as classnames from 'classnames';
 import aTypes from 'prop-types';
diff --git a/node_modules/eslint-plugin-import/lib/ExportMap.js b/node_modules/eslint-plugin-import/lib/ExportMap.js
index 8b3aae7..b32b6b3 100644
--- a/node_modules/eslint-plugin-import/lib/ExportMap.js
+++ b/node_modules/eslint-plugin-import/lib/ExportMap.js
@@ -1,653 +1,735 @@
-'use strict';
+'use strict';Object.defineProperty(exports, "__esModule", { value: true });exports.
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.recursivePatternCapture = recursivePatternCapture;
 
-var _fs = require('fs');
 
-var _fs2 = _interopRequireDefault(_fs);
 
-var _doctrine = require('doctrine');
 
-var _doctrine2 = _interopRequireDefault(_doctrine);
 
-var _debug = require('debug');
 
-var _debug2 = _interopRequireDefault(_debug);
 
-var _eslint = require('eslint');
 
-var _parse = require('eslint-module-utils/parse');
 
-var _parse2 = _interopRequireDefault(_parse);
 
-var _resolve = require('eslint-module-utils/resolve');
 
-var _resolve2 = _interopRequireDefault(_resolve);
 
-var _ignore = require('eslint-module-utils/ignore');
 
-var _ignore2 = _interopRequireDefault(_ignore);
 
-var _hash = require('eslint-module-utils/hash');
 
-var _unambiguous = require('eslint-module-utils/unambiguous');
 
-var unambiguous = _interopRequireWildcard(_unambiguous);
 
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-const log = (0, _debug2.default)('eslint-plugin-import:ExportMap');
 
-const exportCache = new Map();
 
-class ExportMap {
-  constructor(path) {
-    this.path = path;
-    this.namespace = new Map();
-    // todo: restructure to key on path, value is resolver + map of names
-    this.reexports = new Map();
-    /**
-     * star-exports
-     * @type {Set} of () => ExportMap
-     */
-    this.dependencies = new Set();
-    /**
-     * dependencies of this module that are not explicitly re-exported
-     * @type {Map} from path = () => ExportMap
-     */
-    this.imports = new Map();
-    this.errors = [];
-  }
 
-  get hasDefault() {
-    return this.get('default') != null;
-  } // stronger than this.has
 
-  get size() {
-    let size = this.namespace.size + this.reexports.size;
-    this.dependencies.forEach(dep => {
-      const d = dep();
-      // CJS / ignored dependencies won't exist (#717)
-      if (d == null) return;
-      size += d.size;
-    });
-    return size;
-  }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 
-  /**
-   * Note that this does not check explicitly re-exported names for existence
-   * in the base namespace, but it will expand all `export * from '...'` exports
-   * if not found in the explicit namespace.
-   * @param  {string}  name
-   * @return {Boolean} true if `name` is exported by this module.
-   */
-  has(name) {
-    if (this.namespace.has(name)) return true;
-    if (this.reexports.has(name)) return true;
 
-    // default exports must be explicitly re-exported (#328)
-    if (name !== 'default') {
-      for (let dep of this.dependencies) {
-        let innerMap = dep();
 
-        // todo: report as unresolved?
-        if (!innerMap) continue;
 
-        if (innerMap.has(name)) return true;
-      }
-    }
 
-    return false;
-  }
 
-  /**
-   * ensure that imported name fully resolves.
-   * @param  {[type]}  name [description]
-   * @return {Boolean}      [description]
-   */
-  hasDeep(name) {
-    if (this.namespace.has(name)) return { found: true, path: [this] };
 
-    if (this.reexports.has(name)) {
-      const reexports = this.reexports.get(name),
-            imported = reexports.getImport();
 
-      // if import is ignored, return explicit 'null'
-      if (imported == null) return { found: true, path: [this]
 
-        // safeguard against cycles, only if name matches
-      };if (imported.path === this.path && reexports.local === name) {
-        return { found: false, path: [this] };
-      }
 
-      const deep = imported.hasDeep(reexports.local);
-      deep.path.unshift(this);
 
-      return deep;
-    }
 
-    // default exports must be explicitly re-exported (#328)
-    if (name !== 'default') {
-      for (let dep of this.dependencies) {
-        let innerMap = dep();
-        if (innerMap == null) return { found: true, path: [this]
-          // todo: report as unresolved?
-        };if (!innerMap) continue;
 
-        // safeguard against cycles
-        if (innerMap.path === this.path) continue;
 
-        let innerValue = innerMap.hasDeep(name);
-        if (innerValue.found) {
-          innerValue.path.unshift(this);
-          return innerValue;
-        }
-      }
-    }
 
-    return { found: false, path: [this] };
-  }
 
-  get(name) {
-    if (this.namespace.has(name)) return this.namespace.get(name);
 
-    if (this.reexports.has(name)) {
-      const reexports = this.reexports.get(name),
-            imported = reexports.getImport();
 
-      // if import is ignored, return explicit 'null'
-      if (imported == null) return null;
 
-      // safeguard against cycles, only if name matches
-      if (imported.path === this.path && reexports.local === name) return undefined;
 
-      return imported.get(reexports.local);
-    }
 
-    // default exports must be explicitly re-exported (#328)
-    if (name !== 'default') {
-      for (let dep of this.dependencies) {
-        let innerMap = dep();
-        // todo: report as unresolved?
-        if (!innerMap) continue;
 
-        // safeguard against cycles
-        if (innerMap.path === this.path) continue;
 
-        let innerValue = innerMap.get(name);
-        if (innerValue !== undefined) return innerValue;
-      }
-    }
 
-    return undefined;
-  }
 
-  forEach(callback, thisArg) {
-    this.namespace.forEach((v, n) => callback.call(thisArg, v, n, this));
 
-    this.reexports.forEach((reexports, name) => {
-      const reexported = reexports.getImport();
-      // can't look up meta for ignored re-exports (#348)
-      callback.call(thisArg, reexported && reexported.get(reexports.local), name, this);
-    });
 
-    this.dependencies.forEach(dep => {
-      const d = dep();
-      // CJS / ignored dependencies won't exist (#717)
-      if (d == null) return;
 
-      d.forEach((v, n) => n !== 'default' && callback.call(thisArg, v, n, this));
-    });
-  }
 
-  // todo: keys, values, entries?
 
-  reportErrors(context, declaration) {
-    context.report({
-      node: declaration.source,
-      message: `Parse errors in imported module '${declaration.source.value}': ` + `${this.errors.map(e => `${e.message} (${e.lineNumber}:${e.column})`).join(', ')}`
-    });
-  }
-}
 
-exports.default = ExportMap; /**
-                              * parse docs from the first node that has leading comments
-                              */
 
-function captureDoc(source, docStyleParsers) {
-  const metadata = {};
 
-  // 'some' short-circuits on first 'true'
 
-  for (var _len = arguments.length, nodes = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
-    nodes[_key - 2] = arguments[_key];
-  }
 
-  nodes.some(n => {
-    try {
 
-      let leadingComments;
 
-      // n.leadingComments is legacy `attachComments` behavior
-      if ('leadingComments' in n) {
-        leadingComments = n.leadingComments;
-      } else if (n.range) {
-        leadingComments = source.getCommentsBefore(n);
-      }
 
-      if (!leadingComments || leadingComments.length === 0) return false;
 
-      for (let name in docStyleParsers) {
-        const doc = docStyleParsers[name](leadingComments);
-        if (doc) {
-          metadata.doc = doc;
-        }
-      }
 
-      return true;
-    } catch (err) {
-      return false;
-    }
-  });
 
-  return metadata;
-}
 
-const availableDocStyleParsers = {
-  jsdoc: captureJsDoc,
-  tomdoc: captureTomDoc
 
-  /**
-   * parse JSDoc from leading comments
-   * @param  {...[type]} comments [description]
-   * @return {{doc: object}}
-   */
-};function captureJsDoc(comments) {
-  let doc;
 
-  // capture XSDoc
-  comments.forEach(comment => {
-    // skip non-block comments
-    if (comment.type !== 'Block') return;
-    try {
-      doc = _doctrine2.default.parse(comment.value, { unwrap: true });
-    } catch (err) {
-      /* don't care, for now? maybe add to `errors?` */
-    }
-  });
 
-  return doc;
-}
 
-/**
-  * parse TomDoc section from comments
-  */
-function captureTomDoc(comments) {
-  // collect lines up to first paragraph break
-  const lines = [];
-  for (let i = 0; i < comments.length; i++) {
-    const comment = comments[i];
-    if (comment.value.match(/^\s*$/)) break;
-    lines.push(comment.value.trim());
-  }
 
-  // return doctrine-like object
-  const statusMatch = lines.join(' ').match(/^(Public|Internal|Deprecated):\s*(.+)/);
-  if (statusMatch) {
-    return {
-      description: statusMatch[2],
-      tags: [{
-        title: statusMatch[1].toLowerCase(),
-        description: statusMatch[2]
-      }]
-    };
-  }
-}
 
-ExportMap.get = function (source, context) {
-  const path = (0, _resolve2.default)(source, context);
-  if (path == null) return null;
 
-  return ExportMap.for(childContext(path, context));
-};
 
-ExportMap.for = function (context) {
-  const path = context.path;
 
 
-  const cacheKey = (0, _hash.hashObject)(context).digest('hex');
-  let exportMap = exportCache.get(cacheKey);
 
-  // return cached ignore
-  if (exportMap === null) return null;
 
-  const stats = _fs2.default.statSync(path);
-  if (exportMap != null) {
-    // date equality check
-    if (exportMap.mtime - stats.mtime === 0) {
-      return exportMap;
-    }
-    // future: check content equality?
-  }
 
-  // check valid extensions first
-  if (!(0, _ignore.hasValidExtension)(path, context)) {
-    exportCache.set(cacheKey, null);
-    return null;
-  }
 
-  // check for and cache ignore
-  if ((0, _ignore2.default)(path, context)) {
-    log('ignored path due to ignore settings:', path);
-    exportCache.set(cacheKey, null);
-    return null;
-  }
 
-  const content = _fs2.default.readFileSync(path, { encoding: 'utf8' });
 
-  // check for and cache unambiguous modules
-  if (!unambiguous.test(content)) {
-    log('ignored path due to unambiguous regex:', path);
-    exportCache.set(cacheKey, null);
-    return null;
-  }
 
-  log('cache miss', cacheKey, 'for path', path);
-  exportMap = ExportMap.parse(path, content, context);
 
-  // ambiguous modules return null
-  if (exportMap == null) return null;
 
-  exportMap.mtime = stats.mtime;
 
-  exportCache.set(cacheKey, exportMap);
-  return exportMap;
-};
 
-ExportMap.parse = function (path, content, context) {
-  var m = new ExportMap(path);
 
-  try {
-    var ast = (0, _parse2.default)(path, content, context);
-  } catch (err) {
-    log('parse error:', path, err);
-    m.errors.push(err);
-    return m; // can't continue
-  }
 
-  if (!unambiguous.isModule(ast)) return null;
 
-  const docstyle = context.settings && context.settings['import/docstyle'] || ['jsdoc'];
-  const docStyleParsers = {};
-  docstyle.forEach(style => {
-    docStyleParsers[style] = availableDocStyleParsers[style];
-  });
 
-  // attempt to collect module doc
-  if (ast.comments) {
-    ast.comments.some(c => {
-      if (c.type !== 'Block') return false;
-      try {
-        const doc = _doctrine2.default.parse(c.value, { unwrap: true });
-        if (doc.tags.some(t => t.title === 'module')) {
-          m.doc = doc;
-          return true;
-        }
-      } catch (err) {/* ignore */}
-      return false;
-    });
-  }
 
-  const namespaces = new Map();
 
-  function remotePath(value) {
-    return _resolve2.default.relative(value, path, context.settings);
-  }
 
-  function resolveImport(value) {
-    const rp = remotePath(value);
-    if (rp == null) return null;
-    return ExportMap.for(childContext(rp, context));
-  }
 
-  function getNamespace(identifier) {
-    if (!namespaces.has(identifier.name)) return;
 
-    return function () {
-      return resolveImport(namespaces.get(identifier.name));
-    };
-  }
 
-  function addNamespace(object, identifier) {
-    const nsfn = getNamespace(identifier);
-    if (nsfn) {
-      Object.defineProperty(object, 'namespace', { get: nsfn });
-    }
 
-    return object;
-  }
 
-  function captureDependency(declaration) {
-    if (declaration.source == null) return null;
-    if (declaration.importKind === 'type') return null; // skip Flow type imports
-    const importedSpecifiers = new Set();
-    const supportedTypes = new Set(['ImportDefaultSpecifier', 'ImportNamespaceSpecifier']);
-    let hasImportedType = false;
-    if (declaration.specifiers) {
-      declaration.specifiers.forEach(specifier => {
-        const isType = specifier.importKind === 'type';
-        hasImportedType = hasImportedType || isType;
 
-        if (supportedTypes.has(specifier.type) && !isType) {
-          importedSpecifiers.add(specifier.type);
-        }
-        if (specifier.type === 'ImportSpecifier' && !isType) {
-          importedSpecifiers.add(specifier.imported.name);
-        }
-      });
-    }
 
-    // only Flow types were imported
-    if (hasImportedType && importedSpecifiers.size === 0) return null;
 
-    const p = remotePath(declaration.source.value);
-    if (p == null) return null;
-    const existing = m.imports.get(p);
-    if (existing != null) return existing.getter;
 
-    const getter = thunkFor(p, context);
-    m.imports.set(p, {
-      getter,
-      source: { // capturing actual node reference holds full AST in memory!
-        value: declaration.source.value,
-        loc: declaration.source.loc
-      },
-      importedSpecifiers
-    });
-    return getter;
-  }
 
-  const source = makeSourceCode(content, ast);
 
-  ast.body.forEach(function (n) {
 
-    if (n.type === 'ExportDefaultDeclaration') {
-      const exportMeta = captureDoc(source, docStyleParsers, n);
-      if (n.declaration.type === 'Identifier') {
-        addNamespace(exportMeta, n.declaration);
-      }
-      m.namespace.set('default', exportMeta);
-      return;
-    }
 
-    if (n.type === 'ExportAllDeclaration') {
-      const getter = captureDependency(n);
-      if (getter) m.dependencies.add(getter);
-      return;
-    }
 
-    // capture namespaces in case of later export
-    if (n.type === 'ImportDeclaration') {
-      captureDependency(n);
-      let ns;
-      if (n.specifiers.some(s => s.type === 'ImportNamespaceSpecifier' && (ns = s))) {
-        namespaces.set(ns.local.name, n.source.value);
-      }
-      return;
-    }
 
-    if (n.type === 'ExportNamedDeclaration') {
-      // capture declaration
-      if (n.declaration != null) {
-        switch (n.declaration.type) {
-          case 'FunctionDeclaration':
-          case 'ClassDeclaration':
-          case 'TypeAlias': // flowtype with babel-eslint parser
-          case 'InterfaceDeclaration':
-          case 'DeclareFunction':
-          case 'TSDeclareFunction':
-          case 'TSEnumDeclaration':
-          case 'TSTypeAliasDeclaration':
-          case 'TSInterfaceDeclaration':
-          case 'TSAbstractClassDeclaration':
-          case 'TSModuleDeclaration':
-            m.namespace.set(n.declaration.id.name, captureDoc(source, docStyleParsers, n));
-            break;
-          case 'VariableDeclaration':
-            n.declaration.declarations.forEach(d => recursivePatternCapture(d.id, id => m.namespace.set(id.name, captureDoc(source, docStyleParsers, d, n))));
-            break;
-        }
-      }
 
-      const nsource = n.source && n.source.value;
-      n.specifiers.forEach(s => {
-        const exportMeta = {};
-        let local;
 
-        switch (s.type) {
-          case 'ExportDefaultSpecifier':
-            if (!n.source) return;
-            local = 'default';
-            break;
-          case 'ExportNamespaceSpecifier':
-            m.namespace.set(s.exported.name, Object.defineProperty(exportMeta, 'namespace', {
-              get() {
-                return resolveImport(nsource);
-              }
-            }));
-            return;
-          case 'ExportSpecifier':
-            if (!n.source) {
-              m.namespace.set(s.exported.name, addNamespace(exportMeta, s.local));
-              return;
-            }
-          // else falls through
-          default:
-            local = s.local.name;
-            break;
-        }
 
-        // todo: JSDoc
-        m.reexports.set(s.exported.name, { local, getImport: () => resolveImport(nsource) });
-      });
-    }
 
-    // This doesn't declare anything, but changes what's being exported.
-    if (n.type === 'TSExportAssignment') {
-      const moduleDecls = ast.body.filter(bodyNode => bodyNode.type === 'TSModuleDeclaration' && bodyNode.id.name === n.expression.name);
-      moduleDecls.forEach(moduleDecl => {
-        if (moduleDecl && moduleDecl.body && moduleDecl.body.body) {
-          moduleDecl.body.body.forEach(moduleBlockNode => {
-            // Export-assignment exports all members in the namespace, explicitly exported or not.
-            const exportedDecl = moduleBlockNode.type === 'ExportNamedDeclaration' ? moduleBlockNode.declaration : moduleBlockNode;
 
-            if (exportedDecl.type === 'VariableDeclaration') {
-              exportedDecl.declarations.forEach(decl => recursivePatternCapture(decl.id, id => m.namespace.set(id.name, captureDoc(source, docStyleParsers, decl, exportedDecl, moduleBlockNode))));
-            } else {
-              m.namespace.set(exportedDecl.id.name, captureDoc(source, docStyleParsers, moduleBlockNode));
-            }
-          });
-        }
-      });
-    }
-  });
 
-  return m;
-};
 
-/**
- * The creation of this closure is isolated from other scopes
- * to avoid over-retention of unrelated variables, which has
- * caused memory leaks. See #1266.
- */
-function thunkFor(p, context) {
-  return () => ExportMap.for(childContext(p, context));
-}
 
-/**
- * Traverse a pattern/identifier node, calling 'callback'
- * for each leaf identifier.
- * @param  {node}   pattern
- * @param  {Function} callback
- * @return {void}
- */
-function recursivePatternCapture(pattern, callback) {
-  switch (pattern.type) {
-    case 'Identifier':
-      // base case
-      callback(pattern);
-      break;
 
-    case 'ObjectPattern':
-      pattern.properties.forEach(p => {
-        recursivePatternCapture(p.value, callback);
-      });
-      break;
 
-    case 'ArrayPattern':
-      pattern.elements.forEach(element => {
-        if (element == null) return;
-        recursivePatternCapture(element, callback);
-      });
-      break;
 
-    case 'AssignmentPattern':
-      callback(pattern.left);
-      break;
-  }
-}
 
-/**
- * don't hold full context object in memory, just grab what we need.
- */
-function childContext(path, context) {
-  const settings = context.settings,
-        parserOptions = context.parserOptions,
-        parserPath = context.parserPath;
 
-  return {
-    settings,
-    parserOptions,
-    parserPath,
-    path
-  };
-}
 
-/**
- * sometimes legacy support isn't _that_ hard... right?
- */
-function makeSourceCode(text, ast) {
-  if (_eslint.SourceCode.length > 1) {
-    // ESLint 3
-    return new _eslint.SourceCode(text, ast);
-  } else {
-    // ESLint 4, 5
-    return new _eslint.SourceCode({ text, ast });
-  }
-}
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9FeHBvcnRNYXAuanMiXSwibmFtZXMiOlsicmVjdXJzaXZlUGF0dGVybkNhcHR1cmUiLCJ1bmFtYmlndW91cyIsImxvZyIsImV4cG9ydENhY2hlIiwiTWFwIiwiRXhwb3J0TWFwIiwiY29uc3RydWN0b3IiLCJwYXRoIiwibmFtZXNwYWNlIiwicmVleHBvcnRzIiwiZGVwZW5kZW5jaWVzIiwiU2V0IiwiaW1wb3J0cyIsImVycm9ycyIsImhhc0RlZmF1bHQiLCJnZXQiLCJzaXplIiwiZm9yRWFjaCIsImRlcCIsImQiLCJoYXMiLCJuYW1lIiwiaW5uZXJNYXAiLCJoYXNEZWVwIiwiZm91bmQiLCJpbXBvcnRlZCIsImdldEltcG9ydCIsImxvY2FsIiwiZGVlcCIsInVuc2hpZnQiLCJpbm5lclZhbHVlIiwidW5kZWZpbmVkIiwiY2FsbGJhY2siLCJ0aGlzQXJnIiwidiIsIm4iLCJjYWxsIiwicmVleHBvcnRlZCIsInJlcG9ydEVycm9ycyIsImNvbnRleHQiLCJkZWNsYXJhdGlvbiIsInJlcG9ydCIsIm5vZGUiLCJzb3VyY2UiLCJtZXNzYWdlIiwidmFsdWUiLCJtYXAiLCJlIiwibGluZU51bWJlciIsImNvbHVtbiIsImpvaW4iLCJjYXB0dXJlRG9jIiwiZG9jU3R5bGVQYXJzZXJzIiwibWV0YWRhdGEiLCJub2RlcyIsInNvbWUiLCJsZWFkaW5nQ29tbWVudHMiLCJyYW5nZSIsImdldENvbW1lbnRzQmVmb3JlIiwibGVuZ3RoIiwiZG9jIiwiZXJyIiwiYXZhaWxhYmxlRG9jU3R5bGVQYXJzZXJzIiwianNkb2MiLCJjYXB0dXJlSnNEb2MiLCJ0b21kb2MiLCJjYXB0dXJlVG9tRG9jIiwiY29tbWVudHMiLCJjb21tZW50IiwidHlwZSIsImRvY3RyaW5lIiwicGFyc2UiLCJ1bndyYXAiLCJsaW5lcyIsImkiLCJtYXRjaCIsInB1c2giLCJ0cmltIiwic3RhdHVzTWF0Y2giLCJkZXNjcmlwdGlvbiIsInRhZ3MiLCJ0aXRsZSIsInRvTG93ZXJDYXNlIiwiZm9yIiwiY2hpbGRDb250ZXh0IiwiY2FjaGVLZXkiLCJkaWdlc3QiLCJleHBvcnRNYXAiLCJzdGF0cyIsImZzIiwic3RhdFN5bmMiLCJtdGltZSIsInNldCIsImNvbnRlbnQiLCJyZWFkRmlsZVN5bmMiLCJlbmNvZGluZyIsInRlc3QiLCJtIiwiYXN0IiwiaXNNb2R1bGUiLCJkb2NzdHlsZSIsInNldHRpbmdzIiwic3R5bGUiLCJjIiwidCIsIm5hbWVzcGFjZXMiLCJyZW1vdGVQYXRoIiwicmVzb2x2ZSIsInJlbGF0aXZlIiwicmVzb2x2ZUltcG9ydCIsInJwIiwiZ2V0TmFtZXNwYWNlIiwiaWRlbnRpZmllciIsImFkZE5hbWVzcGFjZSIsIm9iamVjdCIsIm5zZm4iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNhcHR1cmVEZXBlbmRlbmN5IiwiaW1wb3J0S2luZCIsImltcG9ydGVkU3BlY2lmaWVycyIsInN1cHBvcnRlZFR5cGVzIiwiaGFzSW1wb3J0ZWRUeXBlIiwic3BlY2lmaWVycyIsInNwZWNpZmllciIsImlzVHlwZSIsImFkZCIsInAiLCJleGlzdGluZyIsImdldHRlciIsInRodW5rRm9yIiwibG9jIiwibWFrZVNvdXJjZUNvZGUiLCJib2R5IiwiZXhwb3J0TWV0YSIsIm5zIiwicyIsImlkIiwiZGVjbGFyYXRpb25zIiwibnNvdXJjZSIsImV4cG9ydGVkIiwibW9kdWxlRGVjbHMiLCJmaWx0ZXIiLCJib2R5Tm9kZSIsImV4cHJlc3Npb24iLCJtb2R1bGVEZWNsIiwibW9kdWxlQmxvY2tOb2RlIiwiZXhwb3J0ZWREZWNsIiwiZGVjbCIsInBhdHRlcm4iLCJwcm9wZXJ0aWVzIiwiZWxlbWVudHMiLCJlbGVtZW50IiwibGVmdCIsInBhcnNlck9wdGlvbnMiLCJwYXJzZXJQYXRoIiwidGV4dCIsIlNvdXJjZUNvZGUiXSwibWFwcGluZ3MiOiI7Ozs7O1FBcWtCZ0JBLHVCLEdBQUFBLHVCOztBQXJrQmhCOzs7O0FBRUE7Ozs7QUFFQTs7OztBQUVBOztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVB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O0FBQ0VBLGNBQVFDLFVBQVIsQ0FBbUJySSxPQUFuQixDQUEyQjhHLEtBQUs7QUFDOUIvSCxnQ0FBd0IrSCxFQUFFbEYsS0FBMUIsRUFBaUNiLFFBQWpDO0FBQ0QsT0FGRDtBQUdBOztBQUVGLFNBQUssY0FBTDtBQUNFcUgsY0FBUUUsUUFBUixDQUFpQnRJLE9BQWpCLENBQTBCdUksT0FBRCxJQUFhO0FBQ3BDLFlBQUlBLFdBQVcsSUFBZixFQUFxQjtBQUNyQnhKLGdDQUF3QndKLE9BQXhCLEVBQWlDeEgsUUFBakM7QUFDRCxPQUhEO0FBSUE7O0FBRUYsU0FBSyxtQkFBTDtBQUNFQSxlQUFTcUgsUUFBUUksSUFBakI7QUFDQTtBQXBCSjtBQXNCRDs7QUFFRDs7O0FBR0EsU0FBU3JFLFlBQVQsQ0FBc0I3RSxJQUF0QixFQUE0QmdDLE9BQTVCLEVBQXFDO0FBQUEsUUFDM0I4RCxRQUQyQixHQUNhOUQsT0FEYixDQUMzQjhELFFBRDJCO0FBQUEsUUFDakJxRCxhQURpQixHQUNhbkgsT0FEYixDQUNqQm1ILGFBRGlCO0FBQUEsUUFDRkMsVUFERSxHQUNhcEgsT0FEYixDQUNGb0gsVUFERTs7QUFFbkMsU0FBTztBQUNMdEQsWUFESztBQUVMcUQsaUJBRks7QUFHTEMsY0FISztBQUlMcEo7QUFKSyxHQUFQO0FBTUQ7O0FBR0Q7OztBQUdBLFNBQVM2SCxjQUFULENBQXdCd0IsSUFBeEIsRUFBOEIxRCxHQUE5QixFQUFtQztBQUNqQyxNQUFJMkQsbUJBQVdsRyxNQUFYLEdBQW9CLENBQXhCLEVBQTJCO0FBQ3pCO0FBQ0EsV0FBTyxJQUFJa0csa0JBQUosQ0FBZUQsSUFBZixFQUFxQjFELEdBQXJCLENBQVA7QUFDRCxHQUhELE1BR087QUFDTDtBQUNBLFdBQU8sSUFBSTJELGtCQUFKLENBQWUsRUFBRUQsSUFBRixFQUFRMUQsR0FBUixFQUFmLENBQVA7QUFDRDtBQUNGIiwiZmlsZSI6IkV4cG9ydE1hcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcydcblxuaW1wb3J0IGRvY3RyaW5lIGZyb20gJ2RvY3RyaW5lJ1xuXG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnXG5cbmltcG9ydCB7IFNvdXJjZUNvZGUgfSBmcm9tICdlc2xpbnQnXG5cbmltcG9ydCBwYXJzZSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL3BhcnNlJ1xuaW1wb3J0IHJlc29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJ1xuaW1wb3J0IGlzSWdub3JlZCwgeyBoYXNWYWxpZEV4dGVuc2lvbiB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvaWdub3JlJ1xuXG5pbXBvcnQgeyBoYXNoT2JqZWN0IH0gZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9oYXNoJ1xuaW1wb3J0ICogYXMgdW5hbWJpZ3VvdXMgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy91bmFtYmlndW91cydcblxuY29uc3QgbG9nID0gZGVidWcoJ2VzbGludC1wbHVnaW4taW1wb3J0OkV4cG9ydE1hcCcpXG5cbmNvbnN0IGV4cG9ydENhY2hlID0gbmV3IE1hcCgpXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4cG9ydE1hcCB7XG4gIGNvbnN0cnVjdG9yKHBhdGgpIHtcbiAgICB0aGlzLnBhdGggPSBwYXRoXG4gICAgdGhpcy5uYW1lc3BhY2UgPSBuZXcgTWFwKClcbiAgICAvLyB0b2RvOiByZXN0cnVjdHVyZSB0byBrZXkgb24gcGF0aCwgdmFsdWUgaXMgcmVzb2x2ZXIgKyBtYXAgb2YgbmFtZXNcbiAgICB0aGlzLnJlZXhwb3J0cyA9IG5ldyBNYXAoKVxuICAgIC8qKlxuICAgICAqIHN0YXItZXhwb3J0c1xuICAgICAqIEB0eXBlIHtTZXR9IG9mICgpID0+IEV4cG9ydE1hcFxuICAgICAqL1xuICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gbmV3IFNldCgpXG4gICAgLyoqXG4gICAgICogZGVwZW5kZW5jaWVzIG9mIHRoaXMgbW9kdWxlIHRoYXQgYXJlIG5vdCBleHBsaWNpdGx5IHJlLWV4cG9ydGVkXG4gICAgICogQHR5cGUge01hcH0gZnJvbSBwYXRoID0gKCkgPT4gRXhwb3J0TWFwXG4gICAgICovXG4gICAgdGhpcy5pbXBvcnRzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5lcnJvcnMgPSBbXVxuICB9XG5cbiAgZ2V0IGhhc0RlZmF1bHQoKSB7IHJldHVybiB0aGlzLmdldCgnZGVmYXVsdCcpICE9IG51bGwgfSAvLyBzdHJvbmdlciB0aGFuIHRoaXMuaGFzXG5cbiAgZ2V0IHNpemUoKSB7XG4gICAgbGV0IHNpemUgPSB0aGlzLm5hbWVzcGFjZS5zaXplICsgdGhpcy5yZWV4cG9ydHMuc2l6ZVxuICAgIHRoaXMuZGVwZW5kZW5jaWVzLmZvckVhY2goZGVwID0+IHtcbiAgICAgIGNvbnN0IGQgPSBkZXAoKVxuICAgICAgLy8gQ0pTIC8gaWdub3JlZCBkZXBlbmRlbmNpZXMgd29uJ3QgZXhpc3QgKCM3MTcpXG4gICAgICBpZiAoZCA9PSBudWxsKSByZXR1cm5cbiAgICAgIHNpemUgKz0gZC5zaXplXG4gICAgfSlcbiAgICByZXR1cm4gc2l6ZVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGNoZWNrIGV4cGxpY2l0bHkgcmUtZXhwb3J0ZWQgbmFtZXMgZm9yIGV4aXN0ZW5jZVxuICAgKiBpbiB0aGUgYmFzZSBuYW1lc3BhY2UsIGJ1dCBpdCB3aWxsIGV4cGFuZCBhbGwgYGV4cG9ydCAqIGZyb20gJy4uLidgIGV4cG9ydHNcbiAgICogaWYgbm90IGZvdW5kIGluIHRoZSBleHBsaWNpdCBuYW1lc3BhY2UuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWVcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBgbmFtZWAgaXMgZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuXG4gICAqL1xuICBoYXMobmFtZSkge1xuICAgIGlmICh0aGlzLm5hbWVzcGFjZS5oYXMobmFtZSkpIHJldHVybiB0cnVlXG4gICAgaWYgKHRoaXMucmVleHBvcnRzLmhhcyhuYW1lKSkgcmV0dXJuIHRydWVcblxuICAgIC8vIGRlZmF1bHQgZXhwb3J0cyBtdXN0IGJlIGV4cGxpY2l0bHkgcmUtZXhwb3J0ZWQgKCMzMjgpXG4gICAgaWYgKG5hbWUgIT09ICdkZWZhdWx0Jykge1xuICAgICAgZm9yIChsZXQgZGVwIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGxldCBpbm5lck1hcCA9IGRlcCgpXG5cbiAgICAgICAgLy8gdG9kbzogcmVwb3J0IGFzIHVucmVzb2x2ZWQ/XG4gICAgICAgIGlmICghaW5uZXJNYXApIGNvbnRpbnVlXG5cbiAgICAgICAgaWYgKGlubmVyTWFwLmhhcyhuYW1lKSkgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBlbnN1cmUgdGhhdCBpbXBvcnRlZCBuYW1lIGZ1bGx5IHJlc29sdmVzLlxuICAgKiBAcGFyYW0gIHtbdHlwZV19ICBuYW1lIFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7Qm9vbGVhbn0gICAgICBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBoYXNEZWVwKG5hbWUpIHtcbiAgICBpZiAodGhpcy5uYW1lc3BhY2UuaGFzKG5hbWUpKSByZXR1cm4geyBmb3VuZDogdHJ1ZSwgcGF0aDogW3RoaXNdIH1cblxuICAgIGlmICh0aGlzLnJlZXhwb3J0cy5oYXMobmFtZSkpIHtcbiAgICAgIGNvbnN0IHJlZXhwb3J0cyA9IHRoaXMucmVleHBvcnRzLmdldChuYW1lKVxuICAgICAgICAgICwgaW1wb3J0ZWQgPSByZWV4cG9ydHMuZ2V0SW1wb3J0KClcblxuICAgICAgLy8gaWYgaW1wb3J0IGlzIGlnbm9yZWQsIHJldHVybiBleHBsaWNpdCAnbnVsbCdcbiAgICAgIGlmIChpbXBvcnRlZCA9PSBudWxsKSByZXR1cm4geyBmb3VuZDogdHJ1ZSwgcGF0aDogW3RoaXNdIH1cblxuICAgICAgLy8gc2FmZWd1YXJkIGFnYWluc3QgY3ljbGVzLCBvbmx5IGlmIG5hbWUgbWF0Y2hlc1xuICAgICAgaWYgKGltcG9ydGVkLnBhdGggPT09IHRoaXMucGF0aCAmJiByZWV4cG9ydHMubG9jYWwgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHsgZm91bmQ6IGZhbHNlLCBwYXRoOiBbdGhpc10gfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWVwID0gaW1wb3J0ZWQuaGFzRGVlcChyZWV4cG9ydHMubG9jYWwpXG4gICAgICBkZWVwLnBhdGgudW5zaGlmdCh0aGlzKVxuXG4gICAgICByZXR1cm4gZGVlcFxuICAgIH1cblxuXG4gICAgLy8gZGVmYXVsdCBleHBvcnRzIG11c3QgYmUgZXhwbGljaXRseSByZS1leHBvcnRlZCAoIzMyOClcbiAgICBpZiAobmFtZSAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICBmb3IgKGxldCBkZXAgb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgbGV0IGlubmVyTWFwID0gZGVwKClcbiAgICAgICAgaWYgKGlubmVyTWFwID09IG51bGwpIHJldHVybiB7IGZvdW5kOiB0cnVlLCBwYXRoOiBbdGhpc10gfVxuICAgICAgICAvLyB0b2RvOiByZXBvcnQgYXMgdW5yZXNvbHZlZD9cbiAgICAgICAgaWYgKCFpbm5lck1hcCkgY29udGludWVcblxuICAgICAgICAvLyBzYWZlZ3VhcmQgYWdhaW5zdCBjeWNsZXNcbiAgICAgICAgaWYgKGlubmVyTWFwLnBhdGggPT09IHRoaXMucGF0aCkgY29udGludWVcblxuICAgICAgICBsZXQgaW5uZXJWYWx1ZSA9IGlubmVyTWFwLmhhc0RlZXAobmFtZSlcbiAgICAgICAgaWYgKGlubmVyVmFsdWUuZm91bmQpIHtcbiAgICAgICAgICBpbm5lclZhbHVlLnBhdGgudW5zaGlmdCh0aGlzKVxuICAgICAgICAgIHJldHVybiBpbm5lclZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBmb3VuZDogZmFsc2UsIHBhdGg6IFt0aGlzXSB9XG4gIH1cblxuICBnZXQobmFtZSkge1xuICAgIGlmICh0aGlzLm5hbWVzcGFjZS5oYXMobmFtZSkpIHJldHVybiB0aGlzLm5hbWVzcGFjZS5nZXQobmFtZSlcblxuICAgIGlmICh0aGlzLnJlZXhwb3J0cy5oYXMobmFtZSkpIHtcbiAgICAgIGNvbnN0IHJlZXhwb3J0cyA9IHRoaXMucmVleHBvcnRzLmdldChuYW1lKVxuICAgICAgICAgICwgaW1wb3J0ZWQgPSByZWV4cG9ydHMuZ2V0SW1wb3J0KClcblxuICAgICAgLy8gaWYgaW1wb3J0IGlzIGlnbm9yZWQsIHJldHVybiBleHBsaWNpdCAnbnVsbCdcbiAgICAgIGlmIChpbXBvcnRlZCA9PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgICAvLyBzYWZlZ3VhcmQgYWdhaW5zdCBjeWNsZXMsIG9ubHkgaWYgbmFtZSBtYXRjaGVzXG4gICAgICBpZiAoaW1wb3J0ZWQucGF0aCA9PT0gdGhpcy5wYXRoICYmIHJlZXhwb3J0cy5sb2NhbCA9PT0gbmFtZSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICByZXR1cm4gaW1wb3J0ZWQuZ2V0KHJlZXhwb3J0cy5sb2NhbClcbiAgICB9XG5cbiAgICAvLyBkZWZhdWx0IGV4cG9ydHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlLWV4cG9ydGVkICgjMzI4KVxuICAgIGlmIChuYW1lICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgIGZvciAobGV0IGRlcCBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgICBsZXQgaW5uZXJNYXAgPSBkZXAoKVxuICAgICAgICAvLyB0b2RvOiByZXBvcnQgYXMgdW5yZXNvbHZlZD9cbiAgICAgICAgaWYgKCFpbm5lck1hcCkgY29udGludWVcblxuICAgICAgICAvLyBzYWZlZ3VhcmQgYWdhaW5zdCBjeWNsZXNcbiAgICAgICAgaWYgKGlubmVyTWFwLnBhdGggPT09IHRoaXMucGF0aCkgY29udGludWVcblxuICAgICAgICBsZXQgaW5uZXJWYWx1ZSA9IGlubmVyTWFwLmdldChuYW1lKVxuICAgICAgICBpZiAoaW5uZXJWYWx1ZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gaW5uZXJWYWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICB0aGlzLm5hbWVzcGFjZS5mb3JFYWNoKCh2LCBuKSA9PlxuICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB2LCBuLCB0aGlzKSlcblxuICAgIHRoaXMucmVleHBvcnRzLmZvckVhY2goKHJlZXhwb3J0cywgbmFtZSkgPT4ge1xuICAgICAgY29uc3QgcmVleHBvcnRlZCA9IHJlZXhwb3J0cy5nZXRJbXBvcnQoKVxuICAgICAgLy8gY2FuJ3QgbG9vayB1cCBtZXRhIGZvciBpZ25vcmVkIHJlLWV4cG9ydHMgKCMzNDgpXG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHJlZXhwb3J0ZWQgJiYgcmVleHBvcnRlZC5nZXQocmVleHBvcnRzLmxvY2FsKSwgbmFtZSwgdGhpcylcbiAgICB9KVxuXG4gICAgdGhpcy5kZXBlbmRlbmNpZXMuZm9yRWFjaChkZXAgPT4ge1xuICAgICAgY29uc3QgZCA9IGRlcCgpXG4gICAgICAvLyBDSlMgLyBpZ25vcmVkIGRlcGVuZGVuY2llcyB3b24ndCBleGlzdCAoIzcxNylcbiAgICAgIGlmIChkID09IG51bGwpIHJldHVyblxuXG4gICAgICBkLmZvckVhY2goKHYsIG4pID0+XG4gICAgICAgIG4gIT09ICdkZWZhdWx0JyAmJiBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHYsIG4sIHRoaXMpKVxuICAgIH0pXG4gIH1cblxuICAvLyB0b2RvOiBrZXlzLCB2YWx1ZXMsIGVudHJpZXM/XG5cbiAgcmVwb3J0RXJyb3JzKGNvbnRleHQsIGRlY2xhcmF0aW9uKSB7XG4gICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgbm9kZTogZGVjbGFyYXRpb24uc291cmNlLFxuICAgICAgbWVzc2FnZTogYFBhcnNlIGVycm9ycyBpbiBpbXBvcnRlZCBtb2R1bGUgJyR7ZGVjbGFyYXRpb24uc291cmNlLnZhbHVlfSc6IGAgK1xuICAgICAgICAgICAgICAgICAgYCR7dGhpcy5lcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZSA9PiBgJHtlLm1lc3NhZ2V9ICgke2UubGluZU51bWJlcn06JHtlLmNvbHVtbn0pYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIHBhcnNlIGRvY3MgZnJvbSB0aGUgZmlyc3Qgbm9kZSB0aGF0IGhhcyBsZWFkaW5nIGNvbW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVEb2Moc291cmNlLCBkb2NTdHlsZVBhcnNlcnMsIC4uLm5vZGVzKSB7XG4gIGNvbnN0IG1ldGFkYXRhID0ge31cblxuICAvLyAnc29tZScgc2hvcnQtY2lyY3VpdHMgb24gZmlyc3QgJ3RydWUnXG4gIG5vZGVzLnNvbWUobiA9PiB7XG4gICAgdHJ5IHtcblxuICAgICAgbGV0IGxlYWRpbmdDb21tZW50c1xuXG4gICAgICAvLyBuLmxlYWRpbmdDb21tZW50cyBpcyBsZWdhY3kgYGF0dGFjaENvbW1lbnRzYCBiZWhhdmlvclxuICAgICAgaWYgKCdsZWFkaW5nQ29tbWVudHMnIGluIG4pIHtcbiAgICAgICAgbGVhZGluZ0NvbW1lbnRzID0gbi5sZWFkaW5nQ29tbWVudHNcbiAgICAgIH0gZWxzZSBpZiAobi5yYW5nZSkge1xuICAgICAgICBsZWFkaW5nQ29tbWVudHMgPSBzb3VyY2UuZ2V0Q29tbWVudHNCZWZvcmUobilcbiAgICAgIH1cblxuICAgICAgaWYgKCFsZWFkaW5nQ29tbWVudHMgfHwgbGVhZGluZ0NvbW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGZvciAobGV0IG5hbWUgaW4gZG9jU3R5bGVQYXJzZXJzKSB7XG4gICAgICAgIGNvbnN0IGRvYyA9IGRvY1N0eWxlUGFyc2Vyc1tuYW1lXShsZWFkaW5nQ29tbWVudHMpXG4gICAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgICBtZXRhZGF0YS5kb2MgPSBkb2NcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBtZXRhZGF0YVxufVxuXG5jb25zdCBhdmFpbGFibGVEb2NTdHlsZVBhcnNlcnMgPSB7XG4gIGpzZG9jOiBjYXB0dXJlSnNEb2MsXG4gIHRvbWRvYzogY2FwdHVyZVRvbURvYyxcbn1cblxuLyoqXG4gKiBwYXJzZSBKU0RvYyBmcm9tIGxlYWRpbmcgY29tbWVudHNcbiAqIEBwYXJhbSAgey4uLlt0eXBlXX0gY29tbWVudHMgW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7e2RvYzogb2JqZWN0fX1cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZUpzRG9jKGNvbW1lbnRzKSB7XG4gIGxldCBkb2NcblxuICAvLyBjYXB0dXJlIFhTRG9jXG4gIGNvbW1lbnRzLmZvckVhY2goY29tbWVudCA9PiB7XG4gICAgLy8gc2tpcCBub24tYmxvY2sgY29tbWVudHNcbiAgICBpZiAoY29tbWVudC50eXBlICE9PSAnQmxvY2snKSByZXR1cm5cbiAgICB0cnkge1xuICAgICAgZG9jID0gZG9jdHJpbmUucGFyc2UoY29tbWVudC52YWx1ZSwgeyB1bndyYXA6IHRydWUgfSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qIGRvbid0IGNhcmUsIGZvciBub3c/IG1heWJlIGFkZCB0byBgZXJyb3JzP2AgKi9cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGRvY1xufVxuXG4vKipcbiAgKiBwYXJzZSBUb21Eb2Mgc2VjdGlvbiBmcm9tIGNvbW1lbnRzXG4gICovXG5mdW5jdGlvbiBjYXB0dXJlVG9tRG9jKGNvbW1lbnRzKSB7XG4gIC8vIGNvbGxlY3QgbGluZXMgdXAgdG8gZmlyc3QgcGFyYWdyYXBoIGJyZWFrXG4gIGNvbnN0IGxpbmVzID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50c1tpXVxuICAgIGlmIChjb21tZW50LnZhbHVlLm1hdGNoKC9eXFxzKiQvKSkgYnJlYWtcbiAgICBsaW5lcy5wdXNoKGNvbW1lbnQudmFsdWUudHJpbSgpKVxuICB9XG5cbiAgLy8gcmV0dXJuIGRvY3RyaW5lLWxpa2Ugb2JqZWN0XG4gIGNvbnN0IHN0YXR1c01hdGNoID0gbGluZXMuam9pbignICcpLm1hdGNoKC9eKFB1YmxpY3xJbnRlcm5hbHxEZXByZWNhdGVkKTpcXHMqKC4rKS8pXG4gIGlmIChzdGF0dXNNYXRjaCkge1xuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdGlvbjogc3RhdHVzTWF0Y2hbMl0sXG4gICAgICB0YWdzOiBbe1xuICAgICAgICB0aXRsZTogc3RhdHVzTWF0Y2hbMV0udG9Mb3dlckNhc2UoKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHN0YXR1c01hdGNoWzJdLFxuICAgICAgfV0sXG4gICAgfVxuICB9XG59XG5cbkV4cG9ydE1hcC5nZXQgPSBmdW5jdGlvbiAoc291cmNlLCBjb250ZXh0KSB7XG4gIGNvbnN0IHBhdGggPSByZXNvbHZlKHNvdXJjZSwgY29udGV4dClcbiAgaWYgKHBhdGggPT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICByZXR1cm4gRXhwb3J0TWFwLmZvcihjaGlsZENvbnRleHQocGF0aCwgY29udGV4dCkpXG59XG5cbkV4cG9ydE1hcC5mb3IgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICBjb25zdCB7IHBhdGggfSA9IGNvbnRleHRcblxuICBjb25zdCBjYWNoZUtleSA9IGhhc2hPYmplY3QoY29udGV4dCkuZGlnZXN0KCdoZXgnKVxuICBsZXQgZXhwb3J0TWFwID0gZXhwb3J0Q2FjaGUuZ2V0KGNhY2hlS2V5KVxuXG4gIC8vIHJldHVybiBjYWNoZWQgaWdub3JlXG4gIGlmIChleHBvcnRNYXAgPT09IG51bGwpIHJldHVybiBudWxsXG5cbiAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhwYXRoKVxuICBpZiAoZXhwb3J0TWFwICE9IG51bGwpIHtcbiAgICAvLyBkYXRlIGVxdWFsaXR5IGNoZWNrXG4gICAgaWYgKGV4cG9ydE1hcC5tdGltZSAtIHN0YXRzLm10aW1lID09PSAwKSB7XG4gICAgICByZXR1cm4gZXhwb3J0TWFwXG4gICAgfVxuICAgIC8vIGZ1dHVyZTogY2hlY2sgY29udGVudCBlcXVhbGl0eT9cbiAgfVxuXG4gIC8vIGNoZWNrIHZhbGlkIGV4dGVuc2lvbnMgZmlyc3RcbiAgaWYgKCFoYXNWYWxpZEV4dGVuc2lvbihwYXRoLCBjb250ZXh0KSkge1xuICAgIGV4cG9ydENhY2hlLnNldChjYWNoZUtleSwgbnVsbClcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gY2hlY2sgZm9yIGFuZCBjYWNoZSBpZ25vcmVcbiAgaWYgKGlzSWdub3JlZChwYXRoLCBjb250ZXh0KSkge1xuICAgIGxvZygnaWdub3JlZCBwYXRoIGR1ZSB0byBpZ25vcmUgc2V0dGluZ3M6JywgcGF0aClcbiAgICBleHBvcnRDYWNoZS5zZXQoY2FjaGVLZXksIG51bGwpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pXG5cbiAgLy8gY2hlY2sgZm9yIGFuZCBjYWNoZSB1bmFtYmlndW91cyBtb2R1bGVzXG4gIGlmICghdW5hbWJpZ3VvdXMudGVzdChjb250ZW50KSkge1xuICAgIGxvZygnaWdub3JlZCBwYXRoIGR1ZSB0byB1bmFtYmlndW91cyByZWdleDonLCBwYXRoKVxuICAgIGV4cG9ydENhY2hlLnNldChjYWNoZUtleSwgbnVsbClcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgbG9nKCdjYWNoZSBtaXNzJywgY2FjaGVLZXksICdmb3IgcGF0aCcsIHBhdGgpXG4gIGV4cG9ydE1hcCA9IEV4cG9ydE1hcC5wYXJzZShwYXRoLCBjb250ZW50LCBjb250ZXh0KVxuXG4gIC8vIGFtYmlndW91cyBtb2R1bGVzIHJldHVybiBudWxsXG4gIGlmIChleHBvcnRNYXAgPT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICBleHBvcnRNYXAubXRpbWUgPSBzdGF0cy5tdGltZVxuXG4gIGV4cG9ydENhY2hlLnNldChjYWNoZUtleSwgZXhwb3J0TWFwKVxuICByZXR1cm4gZXhwb3J0TWFwXG59XG5cblxuRXhwb3J0TWFwLnBhcnNlID0gZnVuY3Rpb24gKHBhdGgsIGNvbnRlbnQsIGNvbnRleHQpIHtcbiAgdmFyIG0gPSBuZXcgRXhwb3J0TWFwKHBhdGgpXG5cbiAgdHJ5IHtcbiAgICB2YXIgYXN0ID0gcGFyc2UocGF0aCwgY29udGVudCwgY29udGV4dClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nKCdwYXJzZSBlcnJvcjonLCBwYXRoLCBlcnIpXG4gICAgbS5lcnJvcnMucHVzaChlcnIpXG4gICAgcmV0dXJuIG0gLy8gY2FuJ3QgY29udGludWVcbiAgfVxuXG4gIGlmICghdW5hbWJpZ3VvdXMuaXNNb2R1bGUoYXN0KSkgcmV0dXJuIG51bGxcblxuICBjb25zdCBkb2NzdHlsZSA9IChjb250ZXh0LnNldHRpbmdzICYmIGNvbnRleHQuc2V0dGluZ3NbJ2ltcG9ydC9kb2NzdHlsZSddKSB8fCBbJ2pzZG9jJ11cbiAgY29uc3QgZG9jU3R5bGVQYXJzZXJzID0ge31cbiAgZG9jc3R5bGUuZm9yRWFjaChzdHlsZSA9PiB7XG4gICAgZG9jU3R5bGVQYXJzZXJzW3N0eWxlXSA9IGF2YWlsYWJsZURvY1N0eWxlUGFyc2Vyc1tzdHlsZV1cbiAgfSlcblxuICAvLyBhdHRlbXB0IHRvIGNvbGxlY3QgbW9kdWxlIGRvY1xuICBpZiAoYXN0LmNvbW1lbnRzKSB7XG4gICAgYXN0LmNvbW1lbnRzLnNvbWUoYyA9PiB7XG4gICAgICBpZiAoYy50eXBlICE9PSAnQmxvY2snKSByZXR1cm4gZmFsc2VcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRvYyA9IGRvY3RyaW5lLnBhcnNlKGMudmFsdWUsIHsgdW53cmFwOiB0cnVlIH0pXG4gICAgICAgIGlmIChkb2MudGFncy5zb21lKHQgPT4gdC50aXRsZSA9PT0gJ21vZHVsZScpKSB7XG4gICAgICAgICAgbS5kb2MgPSBkb2NcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHsgLyogaWdub3JlICovIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0pXG4gIH1cblxuICBjb25zdCBuYW1lc3BhY2VzID0gbmV3IE1hcCgpXG5cbiAgZnVuY3Rpb24gcmVtb3RlUGF0aCh2YWx1ZSkge1xuICAgIHJldHVybiByZXNvbHZlLnJlbGF0aXZlKHZhbHVlLCBwYXRoLCBjb250ZXh0LnNldHRpbmdzKVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZUltcG9ydCh2YWx1ZSkge1xuICAgIGNvbnN0IHJwID0gcmVtb3RlUGF0aCh2YWx1ZSlcbiAgICBpZiAocnAgPT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gRXhwb3J0TWFwLmZvcihjaGlsZENvbnRleHQocnAsIGNvbnRleHQpKVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlKGlkZW50aWZpZXIpIHtcbiAgICBpZiAoIW5hbWVzcGFjZXMuaGFzKGlkZW50aWZpZXIubmFtZSkpIHJldHVyblxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlSW1wb3J0KG5hbWVzcGFjZXMuZ2V0KGlkZW50aWZpZXIubmFtZSkpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYWRkTmFtZXNwYWNlKG9iamVjdCwgaWRlbnRpZmllcikge1xuICAgIGNvbnN0IG5zZm4gPSBnZXROYW1lc3BhY2UoaWRlbnRpZmllcilcbiAgICBpZiAobnNmbikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgJ25hbWVzcGFjZScsIHsgZ2V0OiBuc2ZuIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdFxuICB9XG5cbiAgZnVuY3Rpb24gY2FwdHVyZURlcGVuZGVuY3koZGVjbGFyYXRpb24pIHtcbiAgICBpZiAoZGVjbGFyYXRpb24uc291cmNlID09IG51bGwpIHJldHVybiBudWxsXG4gICAgaWYgKGRlY2xhcmF0aW9uLmltcG9ydEtpbmQgPT09ICd0eXBlJykgcmV0dXJuIG51bGwgLy8gc2tpcCBGbG93IHR5cGUgaW1wb3J0c1xuICAgIGNvbnN0IGltcG9ydGVkU3BlY2lmaWVycyA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHN1cHBvcnRlZFR5cGVzID0gbmV3IFNldChbJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInLCAnSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyJ10pXG4gICAgbGV0IGhhc0ltcG9ydGVkVHlwZSA9IGZhbHNlXG4gICAgaWYgKGRlY2xhcmF0aW9uLnNwZWNpZmllcnMpIHtcbiAgICAgIGRlY2xhcmF0aW9uLnNwZWNpZmllcnMuZm9yRWFjaChzcGVjaWZpZXIgPT4ge1xuICAgICAgICBjb25zdCBpc1R5cGUgPSBzcGVjaWZpZXIuaW1wb3J0S2luZCA9PT0gJ3R5cGUnXG4gICAgICAgIGhhc0ltcG9ydGVkVHlwZSA9IGhhc0ltcG9ydGVkVHlwZSB8fCBpc1R5cGVcblxuICAgICAgICBpZiAoc3VwcG9ydGVkVHlwZXMuaGFzKHNwZWNpZmllci50eXBlKSAmJiAhaXNUeXBlKSB7XG4gICAgICAgICAgaW1wb3J0ZWRTcGVjaWZpZXJzLmFkZChzcGVjaWZpZXIudHlwZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY2lmaWVyLnR5cGUgPT09ICdJbXBvcnRTcGVjaWZpZXInICYmICFpc1R5cGUpIHtcbiAgICAgICAgICBpbXBvcnRlZFNwZWNpZmllcnMuYWRkKHNwZWNpZmllci5pbXBvcnRlZC5uYW1lKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIG9ubHkgRmxvdyB0eXBlcyB3ZXJlIGltcG9ydGVkXG4gICAgaWYgKGhhc0ltcG9ydGVkVHlwZSAmJiBpbXBvcnRlZFNwZWNpZmllcnMuc2l6ZSA9PT0gMCkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHAgPSByZW1vdGVQYXRoKGRlY2xhcmF0aW9uLnNvdXJjZS52YWx1ZSlcbiAgICBpZiAocCA9PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IGV4aXN0aW5nID0gbS5pbXBvcnRzLmdldChwKVxuICAgIGlmIChleGlzdGluZyAhPSBudWxsKSByZXR1cm4gZXhpc3RpbmcuZ2V0dGVyXG5cbiAgICBjb25zdCBnZXR0ZXIgPSB0aHVua0ZvcihwLCBjb250ZXh0KVxuICAgIG0uaW1wb3J0cy5zZXQocCwge1xuICAgICAgZ2V0dGVyLFxuICAgICAgc291cmNlOiB7ICAvLyBjYXB0dXJpbmcgYWN0dWFsIG5vZGUgcmVmZXJlbmNlIGhvbGRzIGZ1bGwgQVNUIGluIG1lbW9yeSFcbiAgICAgICAgdmFsdWU6IGRlY2xhcmF0aW9uLnNvdXJjZS52YWx1ZSxcbiAgICAgICAgbG9jOiBkZWNsYXJhdGlvbi5zb3VyY2UubG9jLFxuICAgICAgfSxcbiAgICAgIGltcG9ydGVkU3BlY2lmaWVycyxcbiAgICB9KVxuICAgIHJldHVybiBnZXR0ZXJcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZSA9IG1ha2VTb3VyY2VDb2RlKGNvbnRlbnQsIGFzdClcblxuICBhc3QuYm9keS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG5cbiAgICBpZiAobi50eXBlID09PSAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJykge1xuICAgICAgY29uc3QgZXhwb3J0TWV0YSA9IGNhcHR1cmVEb2Moc291cmNlLCBkb2NTdHlsZVBhcnNlcnMsIG4pXG4gICAgICBpZiAobi5kZWNsYXJhdGlvbi50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICAgICAgYWRkTmFtZXNwYWNlKGV4cG9ydE1ldGEsIG4uZGVjbGFyYXRpb24pXG4gICAgICB9XG4gICAgICBtLm5hbWVzcGFjZS5zZXQoJ2RlZmF1bHQnLCBleHBvcnRNZXRhKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKG4udHlwZSA9PT0gJ0V4cG9ydEFsbERlY2xhcmF0aW9uJykge1xuICAgICAgY29uc3QgZ2V0dGVyID0gY2FwdHVyZURlcGVuZGVuY3kobilcbiAgICAgIGlmIChnZXR0ZXIpIG0uZGVwZW5kZW5jaWVzLmFkZChnZXR0ZXIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBjYXB0dXJlIG5hbWVzcGFjZXMgaW4gY2FzZSBvZiBsYXRlciBleHBvcnRcbiAgICBpZiAobi50eXBlID09PSAnSW1wb3J0RGVjbGFyYXRpb24nKSB7XG4gICAgICBjYXB0dXJlRGVwZW5kZW5jeShuKVxuICAgICAgbGV0IG5zXG4gICAgICBpZiAobi5zcGVjaWZpZXJzLnNvbWUocyA9PiBzLnR5cGUgPT09ICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInICYmIChucyA9IHMpKSkge1xuICAgICAgICBuYW1lc3BhY2VzLnNldChucy5sb2NhbC5uYW1lLCBuLnNvdXJjZS52YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChuLnR5cGUgPT09ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJykge1xuICAgICAgLy8gY2FwdHVyZSBkZWNsYXJhdGlvblxuICAgICAgaWYgKG4uZGVjbGFyYXRpb24gIT0gbnVsbCkge1xuICAgICAgICBzd2l0Y2ggKG4uZGVjbGFyYXRpb24udHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0Z1bmN0aW9uRGVjbGFyYXRpb24nOlxuICAgICAgICAgIGNhc2UgJ0NsYXNzRGVjbGFyYXRpb24nOlxuICAgICAgICAgIGNhc2UgJ1R5cGVBbGlhcyc6IC8vIGZsb3d0eXBlIHdpdGggYmFiZWwtZXNsaW50IHBhcnNlclxuICAgICAgICAgIGNhc2UgJ0ludGVyZmFjZURlY2xhcmF0aW9uJzpcbiAgICAgICAgICBjYXNlICdEZWNsYXJlRnVuY3Rpb24nOlxuICAgICAgICAgIGNhc2UgJ1RTRGVjbGFyZUZ1bmN0aW9uJzpcbiAgICAgICAgICBjYXNlICdUU0VudW1EZWNsYXJhdGlvbic6XG4gICAgICAgICAgY2FzZSAnVFNUeXBlQWxpYXNEZWNsYXJhdGlvbic6XG4gICAgICAgICAgY2FzZSAnVFNJbnRlcmZhY2VEZWNsYXJhdGlvbic6XG4gICAgICAgICAgY2FzZSAnVFNBYnN0cmFjdENsYXNzRGVjbGFyYXRpb24nOlxuICAgICAgICAgIGNhc2UgJ1RTTW9kdWxlRGVjbGFyYXRpb24nOlxuICAgICAgICAgICAgbS5uYW1lc3BhY2Uuc2V0KG4uZGVjbGFyYXRpb24uaWQubmFtZSwgY2FwdHVyZURvYyhzb3VyY2UsIGRvY1N0eWxlUGFyc2VycywgbikpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ1ZhcmlhYmxlRGVjbGFyYXRpb24nOlxuICAgICAgICAgICAgbi5kZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnMuZm9yRWFjaCgoZCkgPT5cbiAgICAgICAgICAgICAgcmVjdXJzaXZlUGF0dGVybkNhcHR1cmUoZC5pZCxcbiAgICAgICAgICAgICAgICBpZCA9PiBtLm5hbWVzcGFjZS5zZXQoaWQubmFtZSwgY2FwdHVyZURvYyhzb3VyY2UsIGRvY1N0eWxlUGFyc2VycywgZCwgbikpKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbnNvdXJjZSA9IG4uc291cmNlICYmIG4uc291cmNlLnZhbHVlXG4gICAgICBuLnNwZWNpZmllcnMuZm9yRWFjaCgocykgPT4ge1xuICAgICAgICBjb25zdCBleHBvcnRNZXRhID0ge31cbiAgICAgICAgbGV0IGxvY2FsXG5cbiAgICAgICAgc3dpdGNoIChzLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdFeHBvcnREZWZhdWx0U3BlY2lmaWVyJzpcbiAgICAgICAgICAgIGlmICghbi5zb3VyY2UpIHJldHVyblxuICAgICAgICAgICAgbG9jYWwgPSAnZGVmYXVsdCdcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyJzpcbiAgICAgICAgICAgIG0ubmFtZXNwYWNlLnNldChzLmV4cG9ydGVkLm5hbWUsIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRNZXRhLCAnbmFtZXNwYWNlJywge1xuICAgICAgICAgICAgICBnZXQoKSB7IHJldHVybiByZXNvbHZlSW1wb3J0KG5zb3VyY2UpIH0sXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIGNhc2UgJ0V4cG9ydFNwZWNpZmllcic6XG4gICAgICAgICAgICBpZiAoIW4uc291cmNlKSB7XG4gICAgICAgICAgICAgIG0ubmFtZXNwYWNlLnNldChzLmV4cG9ydGVkLm5hbWUsIGFkZE5hbWVzcGFjZShleHBvcnRNZXRhLCBzLmxvY2FsKSlcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlbHNlIGZhbGxzIHRocm91Z2hcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbG9jYWwgPSBzLmxvY2FsLm5hbWVcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cblxuICAgICAgICAvLyB0b2RvOiBKU0RvY1xuICAgICAgICBtLnJlZXhwb3J0cy5zZXQocy5leHBvcnRlZC5uYW1lLCB7IGxvY2FsLCBnZXRJbXBvcnQ6ICgpID0+IHJlc29sdmVJbXBvcnQobnNvdXJjZSkgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gVGhpcyBkb2Vzbid0IGRlY2xhcmUgYW55dGhpbmcsIGJ1dCBjaGFuZ2VzIHdoYXQncyBiZWluZyBleHBvcnRlZC5cbiAgICBpZiAobi50eXBlID09PSAnVFNFeHBvcnRBc3NpZ25tZW50Jykge1xuICAgICAgY29uc3QgbW9kdWxlRGVjbHMgPSBhc3QuYm9keS5maWx0ZXIoKGJvZHlOb2RlKSA9PlxuICAgICAgICBib2R5Tm9kZS50eXBlID09PSAnVFNNb2R1bGVEZWNsYXJhdGlvbicgJiYgYm9keU5vZGUuaWQubmFtZSA9PT0gbi5leHByZXNzaW9uLm5hbWVcbiAgICAgIClcbiAgICAgIG1vZHVsZURlY2xzLmZvckVhY2goKG1vZHVsZURlY2wpID0+IHtcbiAgICAgICAgaWYgKG1vZHVsZURlY2wgJiYgbW9kdWxlRGVjbC5ib2R5ICYmIG1vZHVsZURlY2wuYm9keS5ib2R5KSB7XG4gICAgICAgICAgbW9kdWxlRGVjbC5ib2R5LmJvZHkuZm9yRWFjaCgobW9kdWxlQmxvY2tOb2RlKSA9PiB7XG4gICAgICAgICAgICAvLyBFeHBvcnQtYXNzaWdubWVudCBleHBvcnRzIGFsbCBtZW1iZXJzIGluIHRoZSBuYW1lc3BhY2UsIGV4cGxpY2l0bHkgZXhwb3J0ZWQgb3Igbm90LlxuICAgICAgICAgICAgY29uc3QgZXhwb3J0ZWREZWNsID0gbW9kdWxlQmxvY2tOb2RlLnR5cGUgPT09ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJyA/XG4gICAgICAgICAgICAgIG1vZHVsZUJsb2NrTm9kZS5kZWNsYXJhdGlvbiA6XG4gICAgICAgICAgICAgIG1vZHVsZUJsb2NrTm9kZVxuXG4gICAgICAgICAgICBpZiAoZXhwb3J0ZWREZWNsLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJykge1xuICAgICAgICAgICAgICBleHBvcnRlZERlY2wuZGVjbGFyYXRpb25zLmZvckVhY2goKGRlY2wpID0+XG4gICAgICAgICAgICAgICAgcmVjdXJzaXZlUGF0dGVybkNhcHR1cmUoZGVjbC5pZCwoaWQpID0+IG0ubmFtZXNwYWNlLnNldChcbiAgICAgICAgICAgICAgICAgIGlkLm5hbWUsXG4gICAgICAgICAgICAgICAgICBjYXB0dXJlRG9jKHNvdXJjZSwgZG9jU3R5bGVQYXJzZXJzLCBkZWNsLCBleHBvcnRlZERlY2wsIG1vZHVsZUJsb2NrTm9kZSkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtLm5hbWVzcGFjZS5zZXQoXG4gICAgICAgICAgICAgICAgZXhwb3J0ZWREZWNsLmlkLm5hbWUsXG4gICAgICAgICAgICAgICAgY2FwdHVyZURvYyhzb3VyY2UsIGRvY1N0eWxlUGFyc2VycywgbW9kdWxlQmxvY2tOb2RlKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gbVxufVxuXG4vKipcbiAqIFRoZSBjcmVhdGlvbiBvZiB0aGlzIGNsb3N1cmUgaXMgaXNvbGF0ZWQgZnJvbSBvdGhlciBzY29wZXNcbiAqIHRvIGF2b2lkIG92ZXItcmV0ZW50aW9uIG9mIHVucmVsYXRlZCB2YXJpYWJsZXMsIHdoaWNoIGhhc1xuICogY2F1c2VkIG1lbW9yeSBsZWFrcy4gU2VlICMxMjY2LlxuICovXG5mdW5jdGlvbiB0aHVua0ZvcihwLCBjb250ZXh0KSB7XG4gIHJldHVybiAoKSA9PiBFeHBvcnRNYXAuZm9yKGNoaWxkQ29udGV4dChwLCBjb250ZXh0KSlcbn1cblxuXG4vKipcbiAqIFRyYXZlcnNlIGEgcGF0dGVybi9pZGVudGlmaWVyIG5vZGUsIGNhbGxpbmcgJ2NhbGxiYWNrJ1xuICogZm9yIGVhY2ggbGVhZiBpZGVudGlmaWVyLlxuICogQHBhcmFtICB7bm9kZX0gICBwYXR0ZXJuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWN1cnNpdmVQYXR0ZXJuQ2FwdHVyZShwYXR0ZXJuLCBjYWxsYmFjaykge1xuICBzd2l0Y2ggKHBhdHRlcm4udHlwZSkge1xuICAgIGNhc2UgJ0lkZW50aWZpZXInOiAvLyBiYXNlIGNhc2VcbiAgICAgIGNhbGxiYWNrKHBhdHRlcm4pXG4gICAgICBicmVha1xuXG4gICAgY2FzZSAnT2JqZWN0UGF0dGVybic6XG4gICAgICBwYXR0ZXJuLnByb3BlcnRpZXMuZm9yRWFjaChwID0+IHtcbiAgICAgICAgcmVjdXJzaXZlUGF0dGVybkNhcHR1cmUocC52YWx1ZSwgY2FsbGJhY2spXG4gICAgICB9KVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgJ0FycmF5UGF0dGVybic6XG4gICAgICBwYXR0ZXJuLmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIHJlY3Vyc2l2ZVBhdHRlcm5DYXB0dXJlKGVsZW1lbnQsIGNhbGxiYWNrKVxuICAgICAgfSlcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlICdBc3NpZ25tZW50UGF0dGVybic6XG4gICAgICBjYWxsYmFjayhwYXR0ZXJuLmxlZnQpXG4gICAgICBicmVha1xuICB9XG59XG5cbi8qKlxuICogZG9uJ3QgaG9sZCBmdWxsIGNvbnRleHQgb2JqZWN0IGluIG1lbW9yeSwganVzdCBncmFiIHdoYXQgd2UgbmVlZC5cbiAqL1xuZnVuY3Rpb24gY2hpbGRDb250ZXh0KHBhdGgsIGNvbnRleHQpIHtcbiAgY29uc3QgeyBzZXR0aW5ncywgcGFyc2VyT3B0aW9ucywgcGFyc2VyUGF0aCB9ID0gY29udGV4dFxuICByZXR1cm4ge1xuICAgIHNldHRpbmdzLFxuICAgIHBhcnNlck9wdGlvbnMsXG4gICAgcGFyc2VyUGF0aCxcbiAgICBwYXRoLFxuICB9XG59XG5cblxuLyoqXG4gKiBzb21ldGltZXMgbGVnYWN5IHN1cHBvcnQgaXNuJ3QgX3RoYXRfIGhhcmQuLi4gcmlnaHQ/XG4gKi9cbmZ1bmN0aW9uIG1ha2VTb3VyY2VDb2RlKHRleHQsIGFzdCkge1xuICBpZiAoU291cmNlQ29kZS5sZW5ndGggPiAxKSB7XG4gICAgLy8gRVNMaW50IDNcbiAgICByZXR1cm4gbmV3IFNvdXJjZUNvZGUodGV4dCwgYXN0KVxuICB9IGVsc2Uge1xuICAgIC8vIEVTTGludCA0LCA1XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VDb2RlKHsgdGV4dCwgYXN0IH0pXG4gIH1cbn1cbiJdfQ==
\ No newline at end of file
+recursivePatternCapture = recursivePatternCapture;var _fs = require('fs');var _fs2 = _interopRequireDefault(_fs);var _doctrine = require('doctrine');var _doctrine2 = _interopRequireDefault(_doctrine);var _debug = require('debug');var _debug2 = _interopRequireDefault(_debug);var _eslint = require('eslint');var _parse = require('eslint-module-utils/parse');var _parse2 = _interopRequireDefault(_parse);var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);var _ignore = require('eslint-module-utils/ignore');var _ignore2 = _interopRequireDefault(_ignore);var _hash = require('eslint-module-utils/hash');var _unambiguous = require('eslint-module-utils/unambiguous');var unambiguous = _interopRequireWildcard(_unambiguous);var _tsconfigLoader = require('tsconfig-paths/lib/tsconfig-loader');var _arrayIncludes = require('array-includes');var _arrayIncludes2 = _interopRequireDefault(_arrayIncludes);function _interopRequireWildcard(obj) {if (obj && obj.__esModule) {return obj;} else {var newObj = {};if (obj != null) {for (var key in obj) {if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];}}newObj.default = obj;return newObj;}}function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}let parseConfigFileTextToJson;const log = (0, _debug2.default)('eslint-plugin-import:ExportMap');const exportCache = new Map();class ExportMap {constructor(path) {this.path = path;this.namespace = new Map(); // todo: restructure to key on path, value is resolver + map of names
+    this.reexports = new Map(); /**
+                                 * star-exports
+                                 * @type {Set} of () => ExportMap
+                                 */this.dependencies = new Set(); /**
+                                                                   * dependencies of this module that are not explicitly re-exported
+                                                                   * @type {Map} from path = () => ExportMap
+                                                                   */this.imports = new Map();this.errors = [];}get hasDefault() {return this.get('default') != null;} // stronger than this.has
+  get size() {let size = this.namespace.size + this.reexports.size;this.dependencies.forEach(dep => {const d = dep(); // CJS / ignored dependencies won't exist (#717)
+      if (d == null) return;size += d.size;});return size;} /**
+                                                             * Note that this does not check explicitly re-exported names for existence
+                                                             * in the base namespace, but it will expand all `export * from '...'` exports
+                                                             * if not found in the explicit namespace.
+                                                             * @param  {string}  name
+                                                             * @return {Boolean} true if `name` is exported by this module.
+                                                             */has(name) {if (this.namespace.has(name)) return true;if (this.reexports.has(name)) return true; // default exports must be explicitly re-exported (#328)
+    if (name !== 'default') {for (let dep of this.dependencies) {let innerMap = dep(); // todo: report as unresolved?
+        if (!innerMap) continue;if (innerMap.has(name)) return true;}}return false;} /**
+                                                                                      * ensure that imported name fully resolves.
+                                                                                      * @param  {[type]}  name [description]
+                                                                                      * @return {Boolean}      [description]
+                                                                                      */hasDeep(name) {if (this.namespace.has(name)) return { found: true, path: [this] };if (this.reexports.has(name)) {const reexports = this.reexports.get(name),imported = reexports.getImport(); // if import is ignored, return explicit 'null'
+      if (imported == null) return { found: true, path: [this] // safeguard against cycles, only if name matches
+      };if (imported.path === this.path && reexports.local === name) {return { found: false, path: [this] };}const deep = imported.hasDeep(reexports.local);deep.path.unshift(this);return deep;} // default exports must be explicitly re-exported (#328)
+    if (name !== 'default') {for (let dep of this.dependencies) {let innerMap = dep();if (innerMap == null) return { found: true, path: [this] // todo: report as unresolved?
+        };if (!innerMap) continue; // safeguard against cycles
+        if (innerMap.path === this.path) continue;let innerValue = innerMap.hasDeep(name);if (innerValue.found) {innerValue.path.unshift(this);return innerValue;}}}return { found: false, path: [this] };}get(name) {if (this.namespace.has(name)) return this.namespace.get(name);if (this.reexports.has(name)) {const reexports = this.reexports.get(name),imported = reexports.getImport(); // if import is ignored, return explicit 'null'
+      if (imported == null) return null; // safeguard against cycles, only if name matches
+      if (imported.path === this.path && reexports.local === name) return undefined;return imported.get(reexports.local);} // default exports must be explicitly re-exported (#328)
+    if (name !== 'default') {for (let dep of this.dependencies) {let innerMap = dep(); // todo: report as unresolved?
+        if (!innerMap) continue; // safeguard against cycles
+        if (innerMap.path === this.path) continue;let innerValue = innerMap.get(name);if (innerValue !== undefined) return innerValue;}}return undefined;}forEach(callback, thisArg) {this.namespace.forEach((v, n) => callback.call(thisArg, v, n, this));this.reexports.forEach((reexports, name) => {const reexported = reexports.getImport(); // can't look up meta for ignored re-exports (#348)
+      callback.call(thisArg, reexported && reexported.get(reexports.local), name, this);});this.dependencies.forEach(dep => {const d = dep(); // CJS / ignored dependencies won't exist (#717)
+      if (d == null) return;d.forEach((v, n) => n !== 'default' && callback.call(thisArg, v, n, this));});} // todo: keys, values, entries?
+  reportErrors(context, declaration) {context.report({ node: declaration.source, message: `Parse errors in imported module '${declaration.source.value}': ` + `${this.errors.map(e => `${e.message} (${e.lineNumber}:${e.column})`).join(', ')}` });}}exports.default = ExportMap; /**
+                                                                                                                                                                                                                                                                                    * parse docs from the first node that has leading comments
+                                                                                                                                                                                                                                                                                    */function captureDoc(source, docStyleParsers) {const metadata = {}; // 'some' short-circuits on first 'true'
+  for (var _len = arguments.length, nodes = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {nodes[_key - 2] = arguments[_key];}nodes.some(n => {try {let leadingComments; // n.leadingComments is legacy `attachComments` behavior
+      if ('leadingComments' in n) {leadingComments = n.leadingComments;} else if (n.range) {leadingComments = source.getCommentsBefore(n);}if (!leadingComments || leadingComments.length === 0) return false;for (let name in docStyleParsers) {const doc = docStyleParsers[name](leadingComments);if (doc) {metadata.doc = doc;}}return true;} catch (err) {return false;}});return metadata;}const availableDocStyleParsers = { jsdoc: captureJsDoc, tomdoc: captureTomDoc /**
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                               * parse JSDoc from leading comments
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                               * @param  {...[type]} comments [description]
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                               * @return {{doc: object}}
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                               */ };function captureJsDoc(comments) {let doc; // capture XSDoc
+  comments.forEach(comment => {// skip non-block comments
+    if (comment.type !== 'Block') return;try {doc = _doctrine2.default.parse(comment.value, { unwrap: true });} catch (err) {/* don't care, for now? maybe add to `errors?` */}});return doc;} /**
+                                                                                                                                                                                                 * parse TomDoc section from comments
+                                                                                                                                                                                                 */function captureTomDoc(comments) {// collect lines up to first paragraph break
+  const lines = [];for (let i = 0; i < comments.length; i++) {const comment = comments[i];if (comment.value.match(/^\s*$/)) break;lines.push(comment.value.trim());} // return doctrine-like object
+  const statusMatch = lines.join(' ').match(/^(Public|Internal|Deprecated):\s*(.+)/);if (statusMatch) {return { description: statusMatch[2], tags: [{ title: statusMatch[1].toLowerCase(), description: statusMatch[2] }] };}}ExportMap.get = function (source, context) {const path = (0, _resolve2.default)(source, context);if (path == null) return null;return ExportMap.for(childContext(path, context));};ExportMap.for = function (context) {const path = context.path;const cacheKey = (0, _hash.hashObject)(context).digest('hex');let exportMap = exportCache.get(cacheKey); // return cached ignore
+  if (exportMap === null) return null;const stats = _fs2.default.statSync(path);if (exportMap != null) {// date equality check
+    if (exportMap.mtime - stats.mtime === 0) {return exportMap;} // future: check content equality?
+  } // check valid extensions first
+  if (!(0, _ignore.hasValidExtension)(path, context)) {exportCache.set(cacheKey, null);return null;} // check for and cache ignore
+  if ((0, _ignore2.default)(path, context)) {log('ignored path due to ignore settings:', path);exportCache.set(cacheKey, null);return null;}const content = _fs2.default.readFileSync(path, { encoding: 'utf8' }); // check for and cache unambiguous modules
+  if (!unambiguous.test(content)) {log('ignored path due to unambiguous regex:', path);exportCache.set(cacheKey, null);return null;}log('cache miss', cacheKey, 'for path', path);exportMap = ExportMap.parse(path, content, context); // ambiguous modules return null
+  if (exportMap == null) return null;exportMap.mtime = stats.mtime;exportCache.set(cacheKey, exportMap);return exportMap;};ExportMap.parse = function (path, content, context) {var m = new ExportMap(path);try {var ast = (0, _parse2.default)(path, content, context);} catch (err) {log('parse error:', path, err);m.errors.push(err);return m; // can't continue
+  }if (!unambiguous.isModule(ast)) return null;const docstyle = context.settings && context.settings['import/docstyle'] || ['jsdoc'];const docStyleParsers = {};docstyle.forEach(style => {docStyleParsers[style] = availableDocStyleParsers[style];}); // attempt to collect module doc
+  if (ast.comments) {ast.comments.some(c => {if (c.type !== 'Block') return false;try {const doc = _doctrine2.default.parse(c.value, { unwrap: true });if (doc.tags.some(t => t.title === 'module')) {m.doc = doc;return true;}} catch (err) {/* ignore */}return false;});}const namespaces = new Map();function remotePath(value) {return _resolve2.default.relative(value, path, context.settings);}function resolveImport(value) {const rp = remotePath(value);if (rp == null) return null;return ExportMap.for(childContext(rp, context));}function getNamespace(identifier) {if (!namespaces.has(identifier.name)) return;return function () {return resolveImport(namespaces.get(identifier.name));};}function addNamespace(object, identifier) {const nsfn = getNamespace(identifier);if (nsfn) {Object.defineProperty(object, 'namespace', { get: nsfn });}return object;}function captureDependency(declaration) {if (declaration.source == null) return null;if (declaration.importKind === 'type') return null; // skip Flow type imports
+    const importedSpecifiers = new Set();const supportedTypes = new Set(['ImportDefaultSpecifier', 'ImportNamespaceSpecifier']);let hasImportedType = false;if (declaration.specifiers) {declaration.specifiers.forEach(specifier => {const isType = specifier.importKind === 'type';hasImportedType = hasImportedType || isType;if (supportedTypes.has(specifier.type) && !isType) {importedSpecifiers.add(specifier.type);}if (specifier.type === 'ImportSpecifier' && !isType) {importedSpecifiers.add(specifier.imported.name);}});} // only Flow types were imported
+    if (hasImportedType && importedSpecifiers.size === 0) return null;const p = remotePath(declaration.source.value);if (p == null) return null;const existing = m.imports.get(p);if (existing != null) return existing.getter;const getter = thunkFor(p, context);m.imports.set(p, { getter, source: { // capturing actual node reference holds full AST in memory!
+        value: declaration.source.value, loc: declaration.source.loc }, importedSpecifiers });return getter;}const source = makeSourceCode(content, ast);function isEsModuleInterop() {const tsConfigInfo = (0, _tsconfigLoader.tsConfigLoader)({ cwd: context.parserOptions && context.parserOptions.tsconfigRootDir || process.cwd(), getEnv: key => process.env[key] });try {if (tsConfigInfo.tsConfigPath !== undefined) {const jsonText = _fs2.default.readFileSync(tsConfigInfo.tsConfigPath).toString();if (!parseConfigFileTextToJson) {var _require = require('typescript'); // this is because projects not using TypeScript won't have typescript installed
+          parseConfigFileTextToJson = _require.parseConfigFileTextToJson;}const tsConfig = parseConfigFileTextToJson(tsConfigInfo.tsConfigPath, jsonText).config;return tsConfig.compilerOptions.esModuleInterop;}} catch (e) {return false;}}ast.body.forEach(function (n) {if (n.type === 'ExportDefaultDeclaration') {const exportMeta = captureDoc(source, docStyleParsers, n);if (n.declaration.type === 'Identifier') {addNamespace(exportMeta, n.declaration);}m.namespace.set('default', exportMeta);return;}if (n.type === 'ExportAllDeclaration') {const getter = captureDependency(n);if (getter) m.dependencies.add(getter);return;} // capture namespaces in case of later export
+    if (n.type === 'ImportDeclaration') {captureDependency(n);let ns;if (n.specifiers.some(s => s.type === 'ImportNamespaceSpecifier' && (ns = s))) {namespaces.set(ns.local.name, n.source.value);}return;}if (n.type === 'ExportNamedDeclaration') {// capture declaration
+      if (n.declaration != null) {switch (n.declaration.type) {case 'FunctionDeclaration':case 'ClassDeclaration':case 'TypeAlias': // flowtype with babel-eslint parser
+          case 'InterfaceDeclaration':case 'DeclareFunction':case 'TSDeclareFunction':case 'TSEnumDeclaration':case 'TSTypeAliasDeclaration':case 'TSInterfaceDeclaration':case 'TSAbstractClassDeclaration':case 'TSModuleDeclaration':m.namespace.set(n.declaration.id.name, captureDoc(source, docStyleParsers, n));break;case 'VariableDeclaration':n.declaration.declarations.forEach(d => recursivePatternCapture(d.id, id => m.namespace.set(id.name, captureDoc(source, docStyleParsers, d, n))));break;}}const nsource = n.source && n.source.value;n.specifiers.forEach(s => {const exportMeta = {};let local;switch (s.type) {case 'ExportDefaultSpecifier':if (!n.source) return;local = 'default';break;case 'ExportNamespaceSpecifier':m.namespace.set(s.exported.name, Object.defineProperty(exportMeta, 'namespace', { get() {return resolveImport(nsource);} }));return;case 'ExportSpecifier':if (!n.source) {m.namespace.set(s.exported.name, addNamespace(exportMeta, s.local));return;} // else falls through
+          default:local = s.local.name;break;} // todo: JSDoc
+        m.reexports.set(s.exported.name, { local, getImport: () => resolveImport(nsource) });});}const isEsModuleInteropTrue = isEsModuleInterop();const exports = ['TSExportAssignment'];if (isEsModuleInteropTrue) {exports.push('TSNamespaceExportDeclaration');} // This doesn't declare anything, but changes what's being exported.
+    if ((0, _arrayIncludes2.default)(exports, n.type)) {const exportedName = n.type === 'TSNamespaceExportDeclaration' ? n.id.name : n.expression && n.expression.name || n.expression.id && n.expression.id.name || null;const declTypes = ['VariableDeclaration', 'ClassDeclaration', 'TSDeclareFunction', 'TSEnumDeclaration', 'TSTypeAliasDeclaration', 'TSInterfaceDeclaration', 'TSAbstractClassDeclaration', 'TSModuleDeclaration'];const exportedDecls = ast.body.filter((_ref) => {let type = _ref.type,id = _ref.id,declarations = _ref.declarations;return (0, _arrayIncludes2.default)(declTypes, type) && (id && id.name === exportedName || declarations && declarations.find(d => d.id.name === exportedName));});if (exportedDecls.length === 0) {// Export is not referencing any local declaration, must be re-exporting
+        m.namespace.set('default', captureDoc(source, docStyleParsers, n));return;}if (isEsModuleInteropTrue) {m.namespace.set('default', {});}exportedDecls.forEach(decl => {if (decl.type === 'TSModuleDeclaration') {if (decl.body && decl.body.type === 'TSModuleDeclaration') {m.namespace.set(decl.body.id.name, captureDoc(source, docStyleParsers, decl.body));} else if (decl.body && decl.body.body) {decl.body.body.forEach(moduleBlockNode => {// Export-assignment exports all members in the namespace,
+              // explicitly exported or not.
+              const namespaceDecl = moduleBlockNode.type === 'ExportNamedDeclaration' ? moduleBlockNode.declaration : moduleBlockNode;if (!namespaceDecl) {// TypeScript can check this for us; we needn't
+              } else if (namespaceDecl.type === 'VariableDeclaration') {namespaceDecl.declarations.forEach(d => recursivePatternCapture(d.id, id => m.namespace.set(id.name, captureDoc(source, docStyleParsers, decl, namespaceDecl, moduleBlockNode))));} else {m.namespace.set(namespaceDecl.id.name, captureDoc(source, docStyleParsers, moduleBlockNode));}});}} else {// Export as default
+          m.namespace.set('default', captureDoc(source, docStyleParsers, decl));}});}});return m;}; /**
+                                                                                                     * The creation of this closure is isolated from other scopes
+                                                                                                     * to avoid over-retention of unrelated variables, which has
+                                                                                                     * caused memory leaks. See #1266.
+                                                                                                     */function thunkFor(p, context) {return () => ExportMap.for(childContext(p, context));} /**
+                                                                                                                                                                                              * Traverse a pattern/identifier node, calling 'callback'
+                                                                                                                                                                                              * for each leaf identifier.
+                                                                                                                                                                                              * @param  {node}   pattern
+                                                                                                                                                                                              * @param  {Function} callback
+                                                                                                                                                                                              * @return {void}
+                                                                                                                                                                                              */function recursivePatternCapture(pattern, callback) {switch (pattern.type) {case 'Identifier': // base case
+      callback(pattern);break;case 'ObjectPattern':pattern.properties.forEach(p => {if (p.type === 'ExperimentalRestProperty' || p.type === 'RestElement') {callback(p.argument);return;}recursivePatternCapture(p.value, callback);});break;case 'ArrayPattern':pattern.elements.forEach(element => {if (element == null) return;if (element.type === 'ExperimentalRestProperty' || element.type === 'RestElement') {callback(element.argument);return;}recursivePatternCapture(element, callback);});break;case 'AssignmentPattern':callback(pattern.left);break;}} /**
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       * don't hold full context object in memory, just grab what we need.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       */function childContext(path, context) {const settings = context.settings,parserOptions = context.parserOptions,parserPath = context.parserPath;return { settings, parserOptions, parserPath, path };} /**
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               * sometimes legacy support isn't _that_ hard... right?
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               */function makeSourceCode(text, ast) {if (_eslint.SourceCode.length > 1) {// ESLint 3
+    return new _eslint.SourceCode(text, ast);} else {// ESLint 4, 5
+    return new _eslint.SourceCode({ text, ast });}}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9FeHBvcnRNYXAuanMiXSwibmFtZXMiOlsicmVjdXJzaXZlUGF0dGVybkNhcHR1cmUiLCJ1bmFtYmlndW91cyIsInBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb24iLCJsb2ciLCJleHBvcnRDYWNoZSIsIk1hcCIsIkV4cG9ydE1hcCIsImNvbnN0cnVjdG9yIiwicGF0aCIsIm5hbWVzcGFjZSIsInJlZXhwb3J0cyIsImRlcGVuZGVuY2llcyIsIlNldCIsImltcG9ydHMiLCJlcnJvcnMiLCJoYXNEZWZhdWx0IiwiZ2V0Iiwic2l6ZSIsImZvckVhY2giLCJkZXAiLCJkIiwiaGFzIiwibmFtZSIsImlubmVyTWFwIiwiaGFzRGVlcCIsImZvdW5kIiwiaW1wb3J0ZWQiLCJnZXRJbXBvcnQiLCJsb2NhbCIsImRlZXAiLCJ1bnNoaWZ0IiwiaW5uZXJWYWx1ZSIsInVuZGVmaW5lZCIsImNhbGxiYWNrIiwidGhpc0FyZyIsInYiLCJuIiwiY2FsbCIsInJlZXhwb3J0ZWQiLCJyZXBvcnRFcnJvcnMiLCJjb250ZXh0IiwiZGVjbGFyYXRpb24iLCJyZXBvcnQiLCJub2RlIiwic291cmNlIiwibWVzc2FnZSIsInZhbHVlIiwibWFwIiwiZSIsImxpbmVOdW1iZXIiLCJjb2x1bW4iLCJqb2luIiwiY2FwdHVyZURvYyIsImRvY1N0eWxlUGFyc2VycyIsIm1ldGFkYXRhIiwibm9kZXMiLCJzb21lIiwibGVhZGluZ0NvbW1lbnRzIiwicmFuZ2UiLCJnZXRDb21tZW50c0JlZm9yZSIsImxlbmd0aCIsImRvYyIsImVyciIsImF2YWlsYWJsZURvY1N0eWxlUGFyc2VycyIsImpzZG9jIiwiY2FwdHVyZUpzRG9jIiwidG9tZG9jIiwiY2FwdHVyZVRvbURvYyIsImNvbW1lbnRzIiwiY29tbWVudCIsInR5cGUiLCJkb2N0cmluZSIsInBhcnNlIiwidW53cmFwIiwibGluZXMiLCJpIiwibWF0Y2giLCJwdXNoIiwidHJpbSIsInN0YXR1c01hdGNoIiwiZGVzY3JpcHRpb24iLCJ0YWdzIiwidGl0bGUiLCJ0b0xvd2VyQ2FzZSIsImZvciIsImNoaWxkQ29udGV4dCIsImNhY2hlS2V5IiwiZGlnZXN0IiwiZXhwb3J0TWFwIiwic3RhdHMiLCJmcyIsInN0YXRTeW5jIiwibXRpbWUiLCJzZXQiLCJjb250ZW50IiwicmVhZEZpbGVTeW5jIiwiZW5jb2RpbmciLCJ0ZXN0IiwibSIsImFzdCIsImlzTW9kdWxlIiwiZG9jc3R5bGUiLCJzZXR0aW5ncyIsInN0eWxlIiwiYyIsInQiLCJuYW1lc3BhY2VzIiwicmVtb3RlUGF0aCIsInJlc29sdmUiLCJyZWxhdGl2ZSIsInJlc29sdmVJbXBvcnQiLCJycCIsImdldE5hbWVzcGFjZSIsImlkZW50aWZpZXIiLCJhZGROYW1lc3BhY2UiLCJvYmplY3QiLCJuc2ZuIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjYXB0dXJlRGVwZW5kZW5jeSIsImltcG9ydEtpbmQiLCJpbXBvcnRlZFNwZWNpZmllcnMiLCJzdXBwb3J0ZWRUeXBlcyIsImhhc0ltcG9ydGVkVHlwZSIsInNwZWNpZmllcnMiLCJzcGVjaWZpZXIiLCJpc1R5cGUiLCJhZGQiLCJwIiwiZXhpc3RpbmciLCJnZXR0ZXIiLCJ0aHVua0ZvciIsImxvYyIsIm1ha2VTb3VyY2VDb2RlIiwiaXNFc01vZHVsZUludGVyb3AiLCJ0c0NvbmZpZ0luZm8iLCJjd2QiLCJwYXJzZXJPcHRpb25zIiwidHNjb25maWdSb290RGlyIiwicHJvY2VzcyIsImdldEVudiIsImtleSIsImVudiIsInRzQ29uZmlnUGF0aCIsImpzb25UZXh0IiwidG9TdHJpbmciLCJyZXF1aXJlIiwidHNDb25maWciLCJjb25maWciLCJjb21waWxlck9wdGlvbnMiLCJlc01vZHVsZUludGVyb3AiLCJib2R5IiwiZXhwb3J0TWV0YSIsIm5zIiwicyIsImlkIiwiZGVjbGFyYXRpb25zIiwibnNvdXJjZSIsImV4cG9ydGVkIiwiaXNFc01vZHVsZUludGVyb3BUcnVlIiwiZXhwb3J0cyIsImV4cG9ydGVkTmFtZSIsImV4cHJlc3Npb24iLCJkZWNsVHlwZXMiLCJleHBvcnRlZERlY2xzIiwiZmlsdGVyIiwiZmluZCIsImRlY2wiLCJtb2R1bGVCbG9ja05vZGUiLCJuYW1lc3BhY2VEZWNsIiwicGF0dGVybiIsInByb3BlcnRpZXMiLCJhcmd1bWVudCIsImVsZW1lbnRzIiwiZWxlbWVudCIsImxlZnQiLCJwYXJzZXJQYXRoIiwidGV4dCIsIlNvdXJjZUNvZGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb29CZ0JBLHVCLEdBQUFBLHVCLENBcG9CaEIsd0IsdUNBRUEsb0MsbURBRUEsOEIsNkNBRUEsZ0NBRUEsa0Qs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LGFBRGlCLENBQ0Z1QyxVQURFLEdBQ2F4SSxPQURiLENBQ0Z3SSxVQURFLENBRW5DLE9BQU8sRUFDTDFFLFFBREssRUFFTG1DLGFBRkssRUFHTHVDLFVBSEssRUFJTHhLLElBSkssRUFBUCxDQU1ELEMsQ0FHRDs7aXZCQUdBLFNBQVM2SCxjQUFULENBQXdCNEMsSUFBeEIsRUFBOEI5RSxHQUE5QixFQUFtQyxDQUNqQyxJQUFJK0UsbUJBQVd0SCxNQUFYLEdBQW9CLENBQXhCLEVBQTJCLENBQ3pCO0FBQ0EsV0FBTyxJQUFJc0gsa0JBQUosQ0FBZUQsSUFBZixFQUFxQjlFLEdBQXJCLENBQVAsQ0FDRCxDQUhELE1BR08sQ0FDTDtBQUNBLFdBQU8sSUFBSStFLGtCQUFKLENBQWUsRUFBRUQsSUFBRixFQUFROUUsR0FBUixFQUFmLENBQVAsQ0FDRCxDQUNGIiwiZmlsZSI6IkV4cG9ydE1hcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcydcblxuaW1wb3J0IGRvY3RyaW5lIGZyb20gJ2RvY3RyaW5lJ1xuXG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnXG5cbmltcG9ydCB7IFNvdXJjZUNvZGUgfSBmcm9tICdlc2xpbnQnXG5cbmltcG9ydCBwYXJzZSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL3BhcnNlJ1xuaW1wb3J0IHJlc29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJ1xuaW1wb3J0IGlzSWdub3JlZCwgeyBoYXNWYWxpZEV4dGVuc2lvbiB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvaWdub3JlJ1xuXG5pbXBvcnQgeyBoYXNoT2JqZWN0IH0gZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9oYXNoJ1xuaW1wb3J0ICogYXMgdW5hbWJpZ3VvdXMgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy91bmFtYmlndW91cydcblxuaW1wb3J0IHsgdHNDb25maWdMb2FkZXIgfSBmcm9tICd0c2NvbmZpZy1wYXRocy9saWIvdHNjb25maWctbG9hZGVyJ1xuXG5pbXBvcnQgaW5jbHVkZXMgZnJvbSAnYXJyYXktaW5jbHVkZXMnXG5cbmxldCBwYXJzZUNvbmZpZ0ZpbGVUZXh0VG9Kc29uXG5cbmNvbnN0IGxvZyA9IGRlYnVnKCdlc2xpbnQtcGx1Z2luLWltcG9ydDpFeHBvcnRNYXAnKVxuXG5jb25zdCBleHBvcnRDYWNoZSA9IG5ldyBNYXAoKVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeHBvcnRNYXAge1xuICBjb25zdHJ1Y3RvcihwYXRoKSB7XG4gICAgdGhpcy5wYXRoID0gcGF0aFxuICAgIHRoaXMubmFtZXNwYWNlID0gbmV3IE1hcCgpXG4gICAgLy8gdG9kbzogcmVzdHJ1Y3R1cmUgdG8ga2V5IG9uIHBhdGgsIHZhbHVlIGlzIHJlc29sdmVyICsgbWFwIG9mIG5hbWVzXG4gICAgdGhpcy5yZWV4cG9ydHMgPSBuZXcgTWFwKClcbiAgICAvKipcbiAgICAgKiBzdGFyLWV4cG9ydHNcbiAgICAgKiBAdHlwZSB7U2V0fSBvZiAoKSA9PiBFeHBvcnRNYXBcbiAgICAgKi9cbiAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG5ldyBTZXQoKVxuICAgIC8qKlxuICAgICAqIGRlcGVuZGVuY2llcyBvZiB0aGlzIG1vZHVsZSB0aGF0IGFyZSBub3QgZXhwbGljaXRseSByZS1leHBvcnRlZFxuICAgICAqIEB0eXBlIHtNYXB9IGZyb20gcGF0aCA9ICgpID0+IEV4cG9ydE1hcFxuICAgICAqL1xuICAgIHRoaXMuaW1wb3J0cyA9IG5ldyBNYXAoKVxuICAgIHRoaXMuZXJyb3JzID0gW11cbiAgfVxuXG4gIGdldCBoYXNEZWZhdWx0KCkgeyByZXR1cm4gdGhpcy5nZXQoJ2RlZmF1bHQnKSAhPSBudWxsIH0gLy8gc3Ryb25nZXIgdGhhbiB0aGlzLmhhc1xuXG4gIGdldCBzaXplKCkge1xuICAgIGxldCBzaXplID0gdGhpcy5uYW1lc3BhY2Uuc2l6ZSArIHRoaXMucmVleHBvcnRzLnNpemVcbiAgICB0aGlzLmRlcGVuZGVuY2llcy5mb3JFYWNoKGRlcCA9PiB7XG4gICAgICBjb25zdCBkID0gZGVwKClcbiAgICAgIC8vIENKUyAvIGlnbm9yZWQgZGVwZW5kZW5jaWVzIHdvbid0IGV4aXN0ICgjNzE3KVxuICAgICAgaWYgKGQgPT0gbnVsbCkgcmV0dXJuXG4gICAgICBzaXplICs9IGQuc2l6ZVxuICAgIH0pXG4gICAgcmV0dXJuIHNpemVcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBjaGVjayBleHBsaWNpdGx5IHJlLWV4cG9ydGVkIG5hbWVzIGZvciBleGlzdGVuY2VcbiAgICogaW4gdGhlIGJhc2UgbmFtZXNwYWNlLCBidXQgaXQgd2lsbCBleHBhbmQgYWxsIGBleHBvcnQgKiBmcm9tICcuLi4nYCBleHBvcnRzXG4gICAqIGlmIG5vdCBmb3VuZCBpbiB0aGUgZXhwbGljaXQgbmFtZXNwYWNlLlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBuYW1lXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgYG5hbWVgIGlzIGV4cG9ydGVkIGJ5IHRoaXMgbW9kdWxlLlxuICAgKi9cbiAgaGFzKG5hbWUpIHtcbiAgICBpZiAodGhpcy5uYW1lc3BhY2UuaGFzKG5hbWUpKSByZXR1cm4gdHJ1ZVxuICAgIGlmICh0aGlzLnJlZXhwb3J0cy5oYXMobmFtZSkpIHJldHVybiB0cnVlXG5cbiAgICAvLyBkZWZhdWx0IGV4cG9ydHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlLWV4cG9ydGVkICgjMzI4KVxuICAgIGlmIChuYW1lICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgIGZvciAobGV0IGRlcCBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgICBsZXQgaW5uZXJNYXAgPSBkZXAoKVxuXG4gICAgICAgIC8vIHRvZG86IHJlcG9ydCBhcyB1bnJlc29sdmVkP1xuICAgICAgICBpZiAoIWlubmVyTWFwKSBjb250aW51ZVxuXG4gICAgICAgIGlmIChpbm5lck1hcC5oYXMobmFtZSkpIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogZW5zdXJlIHRoYXQgaW1wb3J0ZWQgbmFtZSBmdWxseSByZXNvbHZlcy5cbiAgICogQHBhcmFtICB7W3R5cGVdfSAgbmFtZSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgW2Rlc2NyaXB0aW9uXVxuICAgKi9cbiAgaGFzRGVlcChuYW1lKSB7XG4gICAgaWYgKHRoaXMubmFtZXNwYWNlLmhhcyhuYW1lKSkgcmV0dXJuIHsgZm91bmQ6IHRydWUsIHBhdGg6IFt0aGlzXSB9XG5cbiAgICBpZiAodGhpcy5yZWV4cG9ydHMuaGFzKG5hbWUpKSB7XG4gICAgICBjb25zdCByZWV4cG9ydHMgPSB0aGlzLnJlZXhwb3J0cy5nZXQobmFtZSlcbiAgICAgICAgICAsIGltcG9ydGVkID0gcmVleHBvcnRzLmdldEltcG9ydCgpXG5cbiAgICAgIC8vIGlmIGltcG9ydCBpcyBpZ25vcmVkLCByZXR1cm4gZXhwbGljaXQgJ251bGwnXG4gICAgICBpZiAoaW1wb3J0ZWQgPT0gbnVsbCkgcmV0dXJuIHsgZm91bmQ6IHRydWUsIHBhdGg6IFt0aGlzXSB9XG5cbiAgICAgIC8vIHNhZmVndWFyZCBhZ2FpbnN0IGN5Y2xlcywgb25seSBpZiBuYW1lIG1hdGNoZXNcbiAgICAgIGlmIChpbXBvcnRlZC5wYXRoID09PSB0aGlzLnBhdGggJiYgcmVleHBvcnRzLmxvY2FsID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiB7IGZvdW5kOiBmYWxzZSwgcGF0aDogW3RoaXNdIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVlcCA9IGltcG9ydGVkLmhhc0RlZXAocmVleHBvcnRzLmxvY2FsKVxuICAgICAgZGVlcC5wYXRoLnVuc2hpZnQodGhpcylcblxuICAgICAgcmV0dXJuIGRlZXBcbiAgICB9XG5cblxuICAgIC8vIGRlZmF1bHQgZXhwb3J0cyBtdXN0IGJlIGV4cGxpY2l0bHkgcmUtZXhwb3J0ZWQgKCMzMjgpXG4gICAgaWYgKG5hbWUgIT09ICdkZWZhdWx0Jykge1xuICAgICAgZm9yIChsZXQgZGVwIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGxldCBpbm5lck1hcCA9IGRlcCgpXG4gICAgICAgIGlmIChpbm5lck1hcCA9PSBudWxsKSByZXR1cm4geyBmb3VuZDogdHJ1ZSwgcGF0aDogW3RoaXNdIH1cbiAgICAgICAgLy8gdG9kbzogcmVwb3J0IGFzIHVucmVzb2x2ZWQ/XG4gICAgICAgIGlmICghaW5uZXJNYXApIGNvbnRpbnVlXG5cbiAgICAgICAgLy8gc2FmZWd1YXJkIGFnYWluc3QgY3ljbGVzXG4gICAgICAgIGlmIChpbm5lck1hcC5wYXRoID09PSB0aGlzLnBhdGgpIGNvbnRpbnVlXG5cbiAgICAgICAgbGV0IGlubmVyVmFsdWUgPSBpbm5lck1hcC5oYXNEZWVwKG5hbWUpXG4gICAgICAgIGlmIChpbm5lclZhbHVlLmZvdW5kKSB7XG4gICAgICAgICAgaW5uZXJWYWx1ZS5wYXRoLnVuc2hpZnQodGhpcylcbiAgICAgICAgICByZXR1cm4gaW5uZXJWYWx1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZm91bmQ6IGZhbHNlLCBwYXRoOiBbdGhpc10gfVxuICB9XG5cbiAgZ2V0KG5hbWUpIHtcbiAgICBpZiAodGhpcy5uYW1lc3BhY2UuaGFzKG5hbWUpKSByZXR1cm4gdGhpcy5uYW1lc3BhY2UuZ2V0KG5hbWUpXG5cbiAgICBpZiAodGhpcy5yZWV4cG9ydHMuaGFzKG5hbWUpKSB7XG4gICAgICBjb25zdCByZWV4cG9ydHMgPSB0aGlzLnJlZXhwb3J0cy5nZXQobmFtZSlcbiAgICAgICAgICAsIGltcG9ydGVkID0gcmVleHBvcnRzLmdldEltcG9ydCgpXG5cbiAgICAgIC8vIGlmIGltcG9ydCBpcyBpZ25vcmVkLCByZXR1cm4gZXhwbGljaXQgJ251bGwnXG4gICAgICBpZiAoaW1wb3J0ZWQgPT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgICAgLy8gc2FmZWd1YXJkIGFnYWluc3QgY3ljbGVzLCBvbmx5IGlmIG5hbWUgbWF0Y2hlc1xuICAgICAgaWYgKGltcG9ydGVkLnBhdGggPT09IHRoaXMucGF0aCAmJiByZWV4cG9ydHMubG9jYWwgPT09IG5hbWUpIHJldHVybiB1bmRlZmluZWRcblxuICAgICAgcmV0dXJuIGltcG9ydGVkLmdldChyZWV4cG9ydHMubG9jYWwpXG4gICAgfVxuXG4gICAgLy8gZGVmYXVsdCBleHBvcnRzIG11c3QgYmUgZXhwbGljaXRseSByZS1leHBvcnRlZCAoIzMyOClcbiAgICBpZiAobmFtZSAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICBmb3IgKGxldCBkZXAgb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgbGV0IGlubmVyTWFwID0gZGVwKClcbiAgICAgICAgLy8gdG9kbzogcmVwb3J0IGFzIHVucmVzb2x2ZWQ/XG4gICAgICAgIGlmICghaW5uZXJNYXApIGNvbnRpbnVlXG5cbiAgICAgICAgLy8gc2FmZWd1YXJkIGFnYWluc3QgY3ljbGVzXG4gICAgICAgIGlmIChpbm5lck1hcC5wYXRoID09PSB0aGlzLnBhdGgpIGNvbnRpbnVlXG5cbiAgICAgICAgbGV0IGlubmVyVmFsdWUgPSBpbm5lck1hcC5nZXQobmFtZSlcbiAgICAgICAgaWYgKGlubmVyVmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGlubmVyVmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBmb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgdGhpcy5uYW1lc3BhY2UuZm9yRWFjaCgodiwgbikgPT5cbiAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdiwgbiwgdGhpcykpXG5cbiAgICB0aGlzLnJlZXhwb3J0cy5mb3JFYWNoKChyZWV4cG9ydHMsIG5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHJlZXhwb3J0ZWQgPSByZWV4cG9ydHMuZ2V0SW1wb3J0KClcbiAgICAgIC8vIGNhbid0IGxvb2sgdXAgbWV0YSBmb3IgaWdub3JlZCByZS1leHBvcnRzICgjMzQ4KVxuICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCByZWV4cG9ydGVkICYmIHJlZXhwb3J0ZWQuZ2V0KHJlZXhwb3J0cy5sb2NhbCksIG5hbWUsIHRoaXMpXG4gICAgfSlcblxuICAgIHRoaXMuZGVwZW5kZW5jaWVzLmZvckVhY2goZGVwID0+IHtcbiAgICAgIGNvbnN0IGQgPSBkZXAoKVxuICAgICAgLy8gQ0pTIC8gaWdub3JlZCBkZXBlbmRlbmNpZXMgd29uJ3QgZXhpc3QgKCM3MTcpXG4gICAgICBpZiAoZCA9PSBudWxsKSByZXR1cm5cblxuICAgICAgZC5mb3JFYWNoKCh2LCBuKSA9PlxuICAgICAgICBuICE9PSAnZGVmYXVsdCcgJiYgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB2LCBuLCB0aGlzKSlcbiAgICB9KVxuICB9XG5cbiAgLy8gdG9kbzoga2V5cywgdmFsdWVzLCBlbnRyaWVzP1xuXG4gIHJlcG9ydEVycm9ycyhjb250ZXh0LCBkZWNsYXJhdGlvbikge1xuICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgIG5vZGU6IGRlY2xhcmF0aW9uLnNvdXJjZSxcbiAgICAgIG1lc3NhZ2U6IGBQYXJzZSBlcnJvcnMgaW4gaW1wb3J0ZWQgbW9kdWxlICcke2RlY2xhcmF0aW9uLnNvdXJjZS52YWx1ZX0nOiBgICtcbiAgICAgICAgICAgICAgICAgIGAke3RoaXMuZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGUgPT4gYCR7ZS5tZXNzYWdlfSAoJHtlLmxpbmVOdW1iZXJ9OiR7ZS5jb2x1bW59KWApXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKX1gLFxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBwYXJzZSBkb2NzIGZyb20gdGhlIGZpcnN0IG5vZGUgdGhhdCBoYXMgbGVhZGluZyBjb21tZW50c1xuICovXG5mdW5jdGlvbiBjYXB0dXJlRG9jKHNvdXJjZSwgZG9jU3R5bGVQYXJzZXJzLCAuLi5ub2Rlcykge1xuICBjb25zdCBtZXRhZGF0YSA9IHt9XG5cbiAgLy8gJ3NvbWUnIHNob3J0LWNpcmN1aXRzIG9uIGZpcnN0ICd0cnVlJ1xuICBub2Rlcy5zb21lKG4gPT4ge1xuICAgIHRyeSB7XG5cbiAgICAgIGxldCBsZWFkaW5nQ29tbWVudHNcblxuICAgICAgLy8gbi5sZWFkaW5nQ29tbWVudHMgaXMgbGVnYWN5IGBhdHRhY2hDb21tZW50c2AgYmVoYXZpb3JcbiAgICAgIGlmICgnbGVhZGluZ0NvbW1lbnRzJyBpbiBuKSB7XG4gICAgICAgIGxlYWRpbmdDb21tZW50cyA9IG4ubGVhZGluZ0NvbW1lbnRzXG4gICAgICB9IGVsc2UgaWYgKG4ucmFuZ2UpIHtcbiAgICAgICAgbGVhZGluZ0NvbW1lbnRzID0gc291cmNlLmdldENvbW1lbnRzQmVmb3JlKG4pXG4gICAgICB9XG5cbiAgICAgIGlmICghbGVhZGluZ0NvbW1lbnRzIHx8IGxlYWRpbmdDb21tZW50cy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZVxuXG4gICAgICBmb3IgKGxldCBuYW1lIGluIGRvY1N0eWxlUGFyc2Vycykge1xuICAgICAgICBjb25zdCBkb2MgPSBkb2NTdHlsZVBhcnNlcnNbbmFtZV0obGVhZGluZ0NvbW1lbnRzKVxuICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgbWV0YWRhdGEuZG9jID0gZG9jXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gbWV0YWRhdGFcbn1cblxuY29uc3QgYXZhaWxhYmxlRG9jU3R5bGVQYXJzZXJzID0ge1xuICBqc2RvYzogY2FwdHVyZUpzRG9jLFxuICB0b21kb2M6IGNhcHR1cmVUb21Eb2MsXG59XG5cbi8qKlxuICogcGFyc2UgSlNEb2MgZnJvbSBsZWFkaW5nIGNvbW1lbnRzXG4gKiBAcGFyYW0gIHsuLi5bdHlwZV19IGNvbW1lbnRzIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge3tkb2M6IG9iamVjdH19XG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVKc0RvYyhjb21tZW50cykge1xuICBsZXQgZG9jXG5cbiAgLy8gY2FwdHVyZSBYU0RvY1xuICBjb21tZW50cy5mb3JFYWNoKGNvbW1lbnQgPT4ge1xuICAgIC8vIHNraXAgbm9uLWJsb2NrIGNvbW1lbnRzXG4gICAgaWYgKGNvbW1lbnQudHlwZSAhPT0gJ0Jsb2NrJykgcmV0dXJuXG4gICAgdHJ5IHtcbiAgICAgIGRvYyA9IGRvY3RyaW5lLnBhcnNlKGNvbW1lbnQudmFsdWUsIHsgdW53cmFwOiB0cnVlIH0pXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvKiBkb24ndCBjYXJlLCBmb3Igbm93PyBtYXliZSBhZGQgdG8gYGVycm9ycz9gICovXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBkb2Ncbn1cblxuLyoqXG4gICogcGFyc2UgVG9tRG9jIHNlY3Rpb24gZnJvbSBjb21tZW50c1xuICAqL1xuZnVuY3Rpb24gY2FwdHVyZVRvbURvYyhjb21tZW50cykge1xuICAvLyBjb2xsZWN0IGxpbmVzIHVwIHRvIGZpcnN0IHBhcmFncmFwaCBicmVha1xuICBjb25zdCBsaW5lcyA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb21tZW50ID0gY29tbWVudHNbaV1cbiAgICBpZiAoY29tbWVudC52YWx1ZS5tYXRjaCgvXlxccyokLykpIGJyZWFrXG4gICAgbGluZXMucHVzaChjb21tZW50LnZhbHVlLnRyaW0oKSlcbiAgfVxuXG4gIC8vIHJldHVybiBkb2N0cmluZS1saWtlIG9iamVjdFxuICBjb25zdCBzdGF0dXNNYXRjaCA9IGxpbmVzLmpvaW4oJyAnKS5tYXRjaCgvXihQdWJsaWN8SW50ZXJuYWx8RGVwcmVjYXRlZCk6XFxzKiguKykvKVxuICBpZiAoc3RhdHVzTWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRpb246IHN0YXR1c01hdGNoWzJdLFxuICAgICAgdGFnczogW3tcbiAgICAgICAgdGl0bGU6IHN0YXR1c01hdGNoWzFdLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdGF0dXNNYXRjaFsyXSxcbiAgICAgIH1dLFxuICAgIH1cbiAgfVxufVxuXG5FeHBvcnRNYXAuZ2V0ID0gZnVuY3Rpb24gKHNvdXJjZSwgY29udGV4dCkge1xuICBjb25zdCBwYXRoID0gcmVzb2x2ZShzb3VyY2UsIGNvbnRleHQpXG4gIGlmIChwYXRoID09IG51bGwpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIEV4cG9ydE1hcC5mb3IoY2hpbGRDb250ZXh0KHBhdGgsIGNvbnRleHQpKVxufVxuXG5FeHBvcnRNYXAuZm9yID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgY29uc3QgeyBwYXRoIH0gPSBjb250ZXh0XG5cbiAgY29uc3QgY2FjaGVLZXkgPSBoYXNoT2JqZWN0KGNvbnRleHQpLmRpZ2VzdCgnaGV4JylcbiAgbGV0IGV4cG9ydE1hcCA9IGV4cG9ydENhY2hlLmdldChjYWNoZUtleSlcblxuICAvLyByZXR1cm4gY2FjaGVkIGlnbm9yZVxuICBpZiAoZXhwb3J0TWFwID09PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMocGF0aClcbiAgaWYgKGV4cG9ydE1hcCAhPSBudWxsKSB7XG4gICAgLy8gZGF0ZSBlcXVhbGl0eSBjaGVja1xuICAgIGlmIChleHBvcnRNYXAubXRpbWUgLSBzdGF0cy5tdGltZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGV4cG9ydE1hcFxuICAgIH1cbiAgICAvLyBmdXR1cmU6IGNoZWNrIGNvbnRlbnQgZXF1YWxpdHk/XG4gIH1cblxuICAvLyBjaGVjayB2YWxpZCBleHRlbnNpb25zIGZpcnN0XG4gIGlmICghaGFzVmFsaWRFeHRlbnNpb24ocGF0aCwgY29udGV4dCkpIHtcbiAgICBleHBvcnRDYWNoZS5zZXQoY2FjaGVLZXksIG51bGwpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIGNoZWNrIGZvciBhbmQgY2FjaGUgaWdub3JlXG4gIGlmIChpc0lnbm9yZWQocGF0aCwgY29udGV4dCkpIHtcbiAgICBsb2coJ2lnbm9yZWQgcGF0aCBkdWUgdG8gaWdub3JlIHNldHRpbmdzOicsIHBhdGgpXG4gICAgZXhwb3J0Q2FjaGUuc2V0KGNhY2hlS2V5LCBudWxsKVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGgsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KVxuXG4gIC8vIGNoZWNrIGZvciBhbmQgY2FjaGUgdW5hbWJpZ3VvdXMgbW9kdWxlc1xuICBpZiAoIXVuYW1iaWd1b3VzLnRlc3QoY29udGVudCkpIHtcbiAgICBsb2coJ2lnbm9yZWQgcGF0aCBkdWUgdG8gdW5hbWJpZ3VvdXMgcmVnZXg6JywgcGF0aClcbiAgICBleHBvcnRDYWNoZS5zZXQoY2FjaGVLZXksIG51bGwpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGxvZygnY2FjaGUgbWlzcycsIGNhY2hlS2V5LCAnZm9yIHBhdGgnLCBwYXRoKVxuICBleHBvcnRNYXAgPSBFeHBvcnRNYXAucGFyc2UocGF0aCwgY29udGVudCwgY29udGV4dClcblxuICAvLyBhbWJpZ3VvdXMgbW9kdWxlcyByZXR1cm4gbnVsbFxuICBpZiAoZXhwb3J0TWFwID09IG51bGwpIHJldHVybiBudWxsXG5cbiAgZXhwb3J0TWFwLm10aW1lID0gc3RhdHMubXRpbWVcblxuICBleHBvcnRDYWNoZS5zZXQoY2FjaGVLZXksIGV4cG9ydE1hcClcbiAgcmV0dXJuIGV4cG9ydE1hcFxufVxuXG5cbkV4cG9ydE1hcC5wYXJzZSA9IGZ1bmN0aW9uIChwYXRoLCBjb250ZW50LCBjb250ZXh0KSB7XG4gIHZhciBtID0gbmV3IEV4cG9ydE1hcChwYXRoKVxuXG4gIHRyeSB7XG4gICAgdmFyIGFzdCA9IHBhcnNlKHBhdGgsIGNvbnRlbnQsIGNvbnRleHQpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZygncGFyc2UgZXJyb3I6JywgcGF0aCwgZXJyKVxuICAgIG0uZXJyb3JzLnB1c2goZXJyKVxuICAgIHJldHVybiBtIC8vIGNhbid0IGNvbnRpbnVlXG4gIH1cblxuICBpZiAoIXVuYW1iaWd1b3VzLmlzTW9kdWxlKGFzdCkpIHJldHVybiBudWxsXG5cbiAgY29uc3QgZG9jc3R5bGUgPSAoY29udGV4dC5zZXR0aW5ncyAmJiBjb250ZXh0LnNldHRpbmdzWydpbXBvcnQvZG9jc3R5bGUnXSkgfHwgWydqc2RvYyddXG4gIGNvbnN0IGRvY1N0eWxlUGFyc2VycyA9IHt9XG4gIGRvY3N0eWxlLmZvckVhY2goc3R5bGUgPT4ge1xuICAgIGRvY1N0eWxlUGFyc2Vyc1tzdHlsZV0gPSBhdmFpbGFibGVEb2NTdHlsZVBhcnNlcnNbc3R5bGVdXG4gIH0pXG5cbiAgLy8gYXR0ZW1wdCB0byBjb2xsZWN0IG1vZHVsZSBkb2NcbiAgaWYgKGFzdC5jb21tZW50cykge1xuICAgIGFzdC5jb21tZW50cy5zb21lKGMgPT4ge1xuICAgICAgaWYgKGMudHlwZSAhPT0gJ0Jsb2NrJykgcmV0dXJuIGZhbHNlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkb2MgPSBkb2N0cmluZS5wYXJzZShjLnZhbHVlLCB7IHVud3JhcDogdHJ1ZSB9KVxuICAgICAgICBpZiAoZG9jLnRhZ3Muc29tZSh0ID0+IHQudGl0bGUgPT09ICdtb2R1bGUnKSkge1xuICAgICAgICAgIG0uZG9jID0gZG9jXG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgbmFtZXNwYWNlcyA9IG5ldyBNYXAoKVxuXG4gIGZ1bmN0aW9uIHJlbW90ZVBhdGgodmFsdWUpIHtcbiAgICByZXR1cm4gcmVzb2x2ZS5yZWxhdGl2ZSh2YWx1ZSwgcGF0aCwgY29udGV4dC5zZXR0aW5ncylcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVJbXBvcnQodmFsdWUpIHtcbiAgICBjb25zdCBycCA9IHJlbW90ZVBhdGgodmFsdWUpXG4gICAgaWYgKHJwID09IG51bGwpIHJldHVybiBudWxsXG4gICAgcmV0dXJuIEV4cG9ydE1hcC5mb3IoY2hpbGRDb250ZXh0KHJwLCBjb250ZXh0KSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE5hbWVzcGFjZShpZGVudGlmaWVyKSB7XG4gICAgaWYgKCFuYW1lc3BhY2VzLmhhcyhpZGVudGlmaWVyLm5hbWUpKSByZXR1cm5cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZUltcG9ydChuYW1lc3BhY2VzLmdldChpZGVudGlmaWVyLm5hbWUpKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZE5hbWVzcGFjZShvYmplY3QsIGlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBuc2ZuID0gZ2V0TmFtZXNwYWNlKGlkZW50aWZpZXIpXG4gICAgaWYgKG5zZm4pIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsICduYW1lc3BhY2UnLCB7IGdldDogbnNmbiB9KVxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3RcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhcHR1cmVEZXBlbmRlbmN5KGRlY2xhcmF0aW9uKSB7XG4gICAgaWYgKGRlY2xhcmF0aW9uLnNvdXJjZSA9PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIGlmIChkZWNsYXJhdGlvbi5pbXBvcnRLaW5kID09PSAndHlwZScpIHJldHVybiBudWxsIC8vIHNraXAgRmxvdyB0eXBlIGltcG9ydHNcbiAgICBjb25zdCBpbXBvcnRlZFNwZWNpZmllcnMgPSBuZXcgU2V0KClcbiAgICBjb25zdCBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBTZXQoWydJbXBvcnREZWZhdWx0U3BlY2lmaWVyJywgJ0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllciddKVxuICAgIGxldCBoYXNJbXBvcnRlZFR5cGUgPSBmYWxzZVxuICAgIGlmIChkZWNsYXJhdGlvbi5zcGVjaWZpZXJzKSB7XG4gICAgICBkZWNsYXJhdGlvbi5zcGVjaWZpZXJzLmZvckVhY2goc3BlY2lmaWVyID0+IHtcbiAgICAgICAgY29uc3QgaXNUeXBlID0gc3BlY2lmaWVyLmltcG9ydEtpbmQgPT09ICd0eXBlJ1xuICAgICAgICBoYXNJbXBvcnRlZFR5cGUgPSBoYXNJbXBvcnRlZFR5cGUgfHwgaXNUeXBlXG5cbiAgICAgICAgaWYgKHN1cHBvcnRlZFR5cGVzLmhhcyhzcGVjaWZpZXIudHlwZSkgJiYgIWlzVHlwZSkge1xuICAgICAgICAgIGltcG9ydGVkU3BlY2lmaWVycy5hZGQoc3BlY2lmaWVyLnR5cGUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWNpZmllci50eXBlID09PSAnSW1wb3J0U3BlY2lmaWVyJyAmJiAhaXNUeXBlKSB7XG4gICAgICAgICAgaW1wb3J0ZWRTcGVjaWZpZXJzLmFkZChzcGVjaWZpZXIuaW1wb3J0ZWQubmFtZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBvbmx5IEZsb3cgdHlwZXMgd2VyZSBpbXBvcnRlZFxuICAgIGlmIChoYXNJbXBvcnRlZFR5cGUgJiYgaW1wb3J0ZWRTcGVjaWZpZXJzLnNpemUgPT09IDApIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBwID0gcmVtb3RlUGF0aChkZWNsYXJhdGlvbi5zb3VyY2UudmFsdWUpXG4gICAgaWYgKHAgPT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgICBjb25zdCBleGlzdGluZyA9IG0uaW1wb3J0cy5nZXQocClcbiAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgcmV0dXJuIGV4aXN0aW5nLmdldHRlclxuXG4gICAgY29uc3QgZ2V0dGVyID0gdGh1bmtGb3IocCwgY29udGV4dClcbiAgICBtLmltcG9ydHMuc2V0KHAsIHtcbiAgICAgIGdldHRlcixcbiAgICAgIHNvdXJjZTogeyAgLy8gY2FwdHVyaW5nIGFjdHVhbCBub2RlIHJlZmVyZW5jZSBob2xkcyBmdWxsIEFTVCBpbiBtZW1vcnkhXG4gICAgICAgIHZhbHVlOiBkZWNsYXJhdGlvbi5zb3VyY2UudmFsdWUsXG4gICAgICAgIGxvYzogZGVjbGFyYXRpb24uc291cmNlLmxvYyxcbiAgICAgIH0sXG4gICAgICBpbXBvcnRlZFNwZWNpZmllcnMsXG4gICAgfSlcbiAgICByZXR1cm4gZ2V0dGVyXG4gIH1cblxuICBjb25zdCBzb3VyY2UgPSBtYWtlU291cmNlQ29kZShjb250ZW50LCBhc3QpXG5cbiAgZnVuY3Rpb24gaXNFc01vZHVsZUludGVyb3AoKSB7XG4gICAgY29uc3QgdHNDb25maWdJbmZvID0gdHNDb25maWdMb2FkZXIoe1xuICAgICAgY3dkOiBjb250ZXh0LnBhcnNlck9wdGlvbnMgJiYgY29udGV4dC5wYXJzZXJPcHRpb25zLnRzY29uZmlnUm9vdERpciB8fCBwcm9jZXNzLmN3ZCgpLFxuICAgICAgZ2V0RW52OiAoa2V5KSA9PiBwcm9jZXNzLmVudltrZXldLFxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0c0NvbmZpZ0luZm8udHNDb25maWdQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QganNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmModHNDb25maWdJbmZvLnRzQ29uZmlnUGF0aCkudG9TdHJpbmcoKVxuICAgICAgICBpZiAoIXBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb24pIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIGJlY2F1c2UgcHJvamVjdHMgbm90IHVzaW5nIFR5cGVTY3JpcHQgd29uJ3QgaGF2ZSB0eXBlc2NyaXB0IGluc3RhbGxlZFxuICAgICAgICAgICh7cGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbn0gPSByZXF1aXJlKCd0eXBlc2NyaXB0JykpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHNDb25maWcgPSBwYXJzZUNvbmZpZ0ZpbGVUZXh0VG9Kc29uKHRzQ29uZmlnSW5mby50c0NvbmZpZ1BhdGgsIGpzb25UZXh0KS5jb25maWdcbiAgICAgICAgcmV0dXJuIHRzQ29uZmlnLmNvbXBpbGVyT3B0aW9ucy5lc01vZHVsZUludGVyb3BcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBhc3QuYm9keS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgaWYgKG4udHlwZSA9PT0gJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbicpIHtcbiAgICAgIGNvbnN0IGV4cG9ydE1ldGEgPSBjYXB0dXJlRG9jKHNvdXJjZSwgZG9jU3R5bGVQYXJzZXJzLCBuKVxuICAgICAgaWYgKG4uZGVjbGFyYXRpb24udHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICAgIGFkZE5hbWVzcGFjZShleHBvcnRNZXRhLCBuLmRlY2xhcmF0aW9uKVxuICAgICAgfVxuICAgICAgbS5uYW1lc3BhY2Uuc2V0KCdkZWZhdWx0JywgZXhwb3J0TWV0YSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChuLnR5cGUgPT09ICdFeHBvcnRBbGxEZWNsYXJhdGlvbicpIHtcbiAgICAgIGNvbnN0IGdldHRlciA9IGNhcHR1cmVEZXBlbmRlbmN5KG4pXG4gICAgICBpZiAoZ2V0dGVyKSBtLmRlcGVuZGVuY2llcy5hZGQoZ2V0dGVyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gY2FwdHVyZSBuYW1lc3BhY2VzIGluIGNhc2Ugb2YgbGF0ZXIgZXhwb3J0XG4gICAgaWYgKG4udHlwZSA9PT0gJ0ltcG9ydERlY2xhcmF0aW9uJykge1xuICAgICAgY2FwdHVyZURlcGVuZGVuY3kobilcbiAgICAgIGxldCBuc1xuICAgICAgaWYgKG4uc3BlY2lmaWVycy5zb21lKHMgPT4gcy50eXBlID09PSAnSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyJyAmJiAobnMgPSBzKSkpIHtcbiAgICAgICAgbmFtZXNwYWNlcy5zZXQobnMubG9jYWwubmFtZSwgbi5zb3VyY2UudmFsdWUpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAobi50eXBlID09PSAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicpIHtcbiAgICAgIC8vIGNhcHR1cmUgZGVjbGFyYXRpb25cbiAgICAgIGlmIChuLmRlY2xhcmF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgc3dpdGNoIChuLmRlY2xhcmF0aW9uLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdGdW5jdGlvbkRlY2xhcmF0aW9uJzpcbiAgICAgICAgICBjYXNlICdDbGFzc0RlY2xhcmF0aW9uJzpcbiAgICAgICAgICBjYXNlICdUeXBlQWxpYXMnOiAvLyBmbG93dHlwZSB3aXRoIGJhYmVsLWVzbGludCBwYXJzZXJcbiAgICAgICAgICBjYXNlICdJbnRlcmZhY2VEZWNsYXJhdGlvbic6XG4gICAgICAgICAgY2FzZSAnRGVjbGFyZUZ1bmN0aW9uJzpcbiAgICAgICAgICBjYXNlICdUU0RlY2xhcmVGdW5jdGlvbic6XG4gICAgICAgICAgY2FzZSAnVFNFbnVtRGVjbGFyYXRpb24nOlxuICAgICAgICAgIGNhc2UgJ1RTVHlwZUFsaWFzRGVjbGFyYXRpb24nOlxuICAgICAgICAgIGNhc2UgJ1RTSW50ZXJmYWNlRGVjbGFyYXRpb24nOlxuICAgICAgICAgIGNhc2UgJ1RTQWJzdHJhY3RDbGFzc0RlY2xhcmF0aW9uJzpcbiAgICAgICAgICBjYXNlICdUU01vZHVsZURlY2xhcmF0aW9uJzpcbiAgICAgICAgICAgIG0ubmFtZXNwYWNlLnNldChuLmRlY2xhcmF0aW9uLmlkLm5hbWUsIGNhcHR1cmVEb2Moc291cmNlLCBkb2NTdHlsZVBhcnNlcnMsIG4pKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdWYXJpYWJsZURlY2xhcmF0aW9uJzpcbiAgICAgICAgICAgIG4uZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zLmZvckVhY2goKGQpID0+XG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZVBhdHRlcm5DYXB0dXJlKGQuaWQsXG4gICAgICAgICAgICAgICAgaWQgPT4gbS5uYW1lc3BhY2Uuc2V0KGlkLm5hbWUsIGNhcHR1cmVEb2Moc291cmNlLCBkb2NTdHlsZVBhcnNlcnMsIGQsIG4pKSkpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5zb3VyY2UgPSBuLnNvdXJjZSAmJiBuLnNvdXJjZS52YWx1ZVxuICAgICAgbi5zcGVjaWZpZXJzLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgY29uc3QgZXhwb3J0TWV0YSA9IHt9XG4gICAgICAgIGxldCBsb2NhbFxuXG4gICAgICAgIHN3aXRjaCAocy50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnRXhwb3J0RGVmYXVsdFNwZWNpZmllcic6XG4gICAgICAgICAgICBpZiAoIW4uc291cmNlKSByZXR1cm5cbiAgICAgICAgICAgIGxvY2FsID0gJ2RlZmF1bHQnXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ0V4cG9ydE5hbWVzcGFjZVNwZWNpZmllcic6XG4gICAgICAgICAgICBtLm5hbWVzcGFjZS5zZXQocy5leHBvcnRlZC5uYW1lLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0TWV0YSwgJ25hbWVzcGFjZScsIHtcbiAgICAgICAgICAgICAgZ2V0KCkgeyByZXR1cm4gcmVzb2x2ZUltcG9ydChuc291cmNlKSB9LFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICBjYXNlICdFeHBvcnRTcGVjaWZpZXInOlxuICAgICAgICAgICAgaWYgKCFuLnNvdXJjZSkge1xuICAgICAgICAgICAgICBtLm5hbWVzcGFjZS5zZXQocy5leHBvcnRlZC5uYW1lLCBhZGROYW1lc3BhY2UoZXhwb3J0TWV0YSwgcy5sb2NhbCkpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZSBmYWxscyB0aHJvdWdoXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGxvY2FsID0gcy5sb2NhbC5uYW1lXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG9kbzogSlNEb2NcbiAgICAgICAgbS5yZWV4cG9ydHMuc2V0KHMuZXhwb3J0ZWQubmFtZSwgeyBsb2NhbCwgZ2V0SW1wb3J0OiAoKSA9PiByZXNvbHZlSW1wb3J0KG5zb3VyY2UpIH0pXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGlzRXNNb2R1bGVJbnRlcm9wVHJ1ZSA9IGlzRXNNb2R1bGVJbnRlcm9wKClcblxuICAgIGNvbnN0IGV4cG9ydHMgPSBbJ1RTRXhwb3J0QXNzaWdubWVudCddXG4gICAgaWYgKGlzRXNNb2R1bGVJbnRlcm9wVHJ1ZSkge1xuICAgICAgZXhwb3J0cy5wdXNoKCdUU05hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uJylcbiAgICB9XG5cbiAgICAvLyBUaGlzIGRvZXNuJ3QgZGVjbGFyZSBhbnl0aGluZywgYnV0IGNoYW5nZXMgd2hhdCdzIGJlaW5nIGV4cG9ydGVkLlxuICAgIGlmIChpbmNsdWRlcyhleHBvcnRzLCBuLnR5cGUpKSB7XG4gICAgICBjb25zdCBleHBvcnRlZE5hbWUgPSBuLnR5cGUgPT09ICdUU05hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uJ1xuICAgICAgICA/IG4uaWQubmFtZVxuICAgICAgICA6IChuLmV4cHJlc3Npb24gJiYgbi5leHByZXNzaW9uLm5hbWUgfHwgKG4uZXhwcmVzc2lvbi5pZCAmJiBuLmV4cHJlc3Npb24uaWQubmFtZSkgfHwgbnVsbClcbiAgICAgIGNvbnN0IGRlY2xUeXBlcyA9IFtcbiAgICAgICAgJ1ZhcmlhYmxlRGVjbGFyYXRpb24nLFxuICAgICAgICAnQ2xhc3NEZWNsYXJhdGlvbicsXG4gICAgICAgICdUU0RlY2xhcmVGdW5jdGlvbicsXG4gICAgICAgICdUU0VudW1EZWNsYXJhdGlvbicsXG4gICAgICAgICdUU1R5cGVBbGlhc0RlY2xhcmF0aW9uJyxcbiAgICAgICAgJ1RTSW50ZXJmYWNlRGVjbGFyYXRpb24nLFxuICAgICAgICAnVFNBYnN0cmFjdENsYXNzRGVjbGFyYXRpb24nLFxuICAgICAgICAnVFNNb2R1bGVEZWNsYXJhdGlvbicsXG4gICAgICBdXG4gICAgICBjb25zdCBleHBvcnRlZERlY2xzID0gYXN0LmJvZHkuZmlsdGVyKCh7IHR5cGUsIGlkLCBkZWNsYXJhdGlvbnMgfSkgPT4gaW5jbHVkZXMoZGVjbFR5cGVzLCB0eXBlKSAmJiAoXG4gICAgICAgIChpZCAmJiBpZC5uYW1lID09PSBleHBvcnRlZE5hbWUpIHx8IChkZWNsYXJhdGlvbnMgJiYgZGVjbGFyYXRpb25zLmZpbmQoKGQpID0+IGQuaWQubmFtZSA9PT0gZXhwb3J0ZWROYW1lKSlcbiAgICAgICkpXG4gICAgICBpZiAoZXhwb3J0ZWREZWNscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gRXhwb3J0IGlzIG5vdCByZWZlcmVuY2luZyBhbnkgbG9jYWwgZGVjbGFyYXRpb24sIG11c3QgYmUgcmUtZXhwb3J0aW5nXG4gICAgICAgIG0ubmFtZXNwYWNlLnNldCgnZGVmYXVsdCcsIGNhcHR1cmVEb2Moc291cmNlLCBkb2NTdHlsZVBhcnNlcnMsIG4pKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChpc0VzTW9kdWxlSW50ZXJvcFRydWUpIHtcbiAgICAgICAgbS5uYW1lc3BhY2Uuc2V0KCdkZWZhdWx0Jywge30pXG4gICAgICB9XG4gICAgICBleHBvcnRlZERlY2xzLmZvckVhY2goKGRlY2wpID0+IHtcbiAgICAgICAgaWYgKGRlY2wudHlwZSA9PT0gJ1RTTW9kdWxlRGVjbGFyYXRpb24nKSB7XG4gICAgICAgICAgaWYgKGRlY2wuYm9keSAmJiBkZWNsLmJvZHkudHlwZSA9PT0gJ1RTTW9kdWxlRGVjbGFyYXRpb24nKSB7XG4gICAgICAgICAgICBtLm5hbWVzcGFjZS5zZXQoZGVjbC5ib2R5LmlkLm5hbWUsIGNhcHR1cmVEb2Moc291cmNlLCBkb2NTdHlsZVBhcnNlcnMsIGRlY2wuYm9keSkpXG4gICAgICAgICAgfSBlbHNlIGlmIChkZWNsLmJvZHkgJiYgZGVjbC5ib2R5LmJvZHkpIHtcbiAgICAgICAgICAgIGRlY2wuYm9keS5ib2R5LmZvckVhY2goKG1vZHVsZUJsb2NrTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAvLyBFeHBvcnQtYXNzaWdubWVudCBleHBvcnRzIGFsbCBtZW1iZXJzIGluIHRoZSBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgZXhwb3J0ZWQgb3Igbm90LlxuICAgICAgICAgICAgICBjb25zdCBuYW1lc3BhY2VEZWNsID0gbW9kdWxlQmxvY2tOb2RlLnR5cGUgPT09ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJyA/XG4gICAgICAgICAgICAgICAgbW9kdWxlQmxvY2tOb2RlLmRlY2xhcmF0aW9uIDpcbiAgICAgICAgICAgICAgICBtb2R1bGVCbG9ja05vZGVcblxuICAgICAgICAgICAgICBpZiAoIW5hbWVzcGFjZURlY2wpIHtcbiAgICAgICAgICAgICAgICAvLyBUeXBlU2NyaXB0IGNhbiBjaGVjayB0aGlzIGZvciB1czsgd2UgbmVlZG4ndFxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZURlY2wudHlwZSA9PT0gJ1ZhcmlhYmxlRGVjbGFyYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlRGVjbC5kZWNsYXJhdGlvbnMuZm9yRWFjaCgoZCkgPT5cbiAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZVBhdHRlcm5DYXB0dXJlKGQuaWQsIChpZCkgPT4gbS5uYW1lc3BhY2Uuc2V0KFxuICAgICAgICAgICAgICAgICAgICBpZC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBjYXB0dXJlRG9jKHNvdXJjZSwgZG9jU3R5bGVQYXJzZXJzLCBkZWNsLCBuYW1lc3BhY2VEZWNsLCBtb2R1bGVCbG9ja05vZGUpXG4gICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtLm5hbWVzcGFjZS5zZXQoXG4gICAgICAgICAgICAgICAgICBuYW1lc3BhY2VEZWNsLmlkLm5hbWUsXG4gICAgICAgICAgICAgICAgICBjYXB0dXJlRG9jKHNvdXJjZSwgZG9jU3R5bGVQYXJzZXJzLCBtb2R1bGVCbG9ja05vZGUpKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBFeHBvcnQgYXMgZGVmYXVsdFxuICAgICAgICAgIG0ubmFtZXNwYWNlLnNldCgnZGVmYXVsdCcsIGNhcHR1cmVEb2Moc291cmNlLCBkb2NTdHlsZVBhcnNlcnMsIGRlY2wpKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gbVxufVxuXG4vKipcbiAqIFRoZSBjcmVhdGlvbiBvZiB0aGlzIGNsb3N1cmUgaXMgaXNvbGF0ZWQgZnJvbSBvdGhlciBzY29wZXNcbiAqIHRvIGF2b2lkIG92ZXItcmV0ZW50aW9uIG9mIHVucmVsYXRlZCB2YXJpYWJsZXMsIHdoaWNoIGhhc1xuICogY2F1c2VkIG1lbW9yeSBsZWFrcy4gU2VlICMxMjY2LlxuICovXG5mdW5jdGlvbiB0aHVua0ZvcihwLCBjb250ZXh0KSB7XG4gIHJldHVybiAoKSA9PiBFeHBvcnRNYXAuZm9yKGNoaWxkQ29udGV4dChwLCBjb250ZXh0KSlcbn1cblxuXG4vKipcbiAqIFRyYXZlcnNlIGEgcGF0dGVybi9pZGVudGlmaWVyIG5vZGUsIGNhbGxpbmcgJ2NhbGxiYWNrJ1xuICogZm9yIGVhY2ggbGVhZiBpZGVudGlmaWVyLlxuICogQHBhcmFtICB7bm9kZX0gICBwYXR0ZXJuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWN1cnNpdmVQYXR0ZXJuQ2FwdHVyZShwYXR0ZXJuLCBjYWxsYmFjaykge1xuICBzd2l0Y2ggKHBhdHRlcm4udHlwZSkge1xuICAgIGNhc2UgJ0lkZW50aWZpZXInOiAvLyBiYXNlIGNhc2VcbiAgICAgIGNhbGxiYWNrKHBhdHRlcm4pXG4gICAgICBicmVha1xuXG4gICAgY2FzZSAnT2JqZWN0UGF0dGVybic6XG4gICAgICBwYXR0ZXJuLnByb3BlcnRpZXMuZm9yRWFjaChwID0+IHtcbiAgICAgICAgaWYgKHAudHlwZSA9PT0gJ0V4cGVyaW1lbnRhbFJlc3RQcm9wZXJ0eScgfHwgcC50eXBlID09PSAnUmVzdEVsZW1lbnQnKSB7XG4gICAgICAgICAgY2FsbGJhY2socC5hcmd1bWVudClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICByZWN1cnNpdmVQYXR0ZXJuQ2FwdHVyZShwLnZhbHVlLCBjYWxsYmFjaylcbiAgICAgIH0pXG4gICAgICBicmVha1xuXG4gICAgY2FzZSAnQXJyYXlQYXR0ZXJuJzpcbiAgICAgIHBhdHRlcm4uZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSByZXR1cm5cbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ0V4cGVyaW1lbnRhbFJlc3RQcm9wZXJ0eScgfHwgZWxlbWVudC50eXBlID09PSAnUmVzdEVsZW1lbnQnKSB7XG4gICAgICAgICAgY2FsbGJhY2soZWxlbWVudC5hcmd1bWVudClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICByZWN1cnNpdmVQYXR0ZXJuQ2FwdHVyZShlbGVtZW50LCBjYWxsYmFjaylcbiAgICAgIH0pXG4gICAgICBicmVha1xuXG4gICAgY2FzZSAnQXNzaWdubWVudFBhdHRlcm4nOlxuICAgICAgY2FsbGJhY2socGF0dGVybi5sZWZ0KVxuICAgICAgYnJlYWtcbiAgfVxufVxuXG4vKipcbiAqIGRvbid0IGhvbGQgZnVsbCBjb250ZXh0IG9iamVjdCBpbiBtZW1vcnksIGp1c3QgZ3JhYiB3aGF0IHdlIG5lZWQuXG4gKi9cbmZ1bmN0aW9uIGNoaWxkQ29udGV4dChwYXRoLCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgc2V0dGluZ3MsIHBhcnNlck9wdGlvbnMsIHBhcnNlclBhdGggfSA9IGNvbnRleHRcbiAgcmV0dXJuIHtcbiAgICBzZXR0aW5ncyxcbiAgICBwYXJzZXJPcHRpb25zLFxuICAgIHBhcnNlclBhdGgsXG4gICAgcGF0aCxcbiAgfVxufVxuXG5cbi8qKlxuICogc29tZXRpbWVzIGxlZ2FjeSBzdXBwb3J0IGlzbid0IF90aGF0XyBoYXJkLi4uIHJpZ2h0P1xuICovXG5mdW5jdGlvbiBtYWtlU291cmNlQ29kZSh0ZXh0LCBhc3QpIHtcbiAgaWYgKFNvdXJjZUNvZGUubGVuZ3RoID4gMSkge1xuICAgIC8vIEVTTGludCAzXG4gICAgcmV0dXJuIG5ldyBTb3VyY2VDb2RlKHRleHQsIGFzdClcbiAgfSBlbHNlIHtcbiAgICAvLyBFU0xpbnQgNCwgNVxuICAgIHJldHVybiBuZXcgU291cmNlQ29kZSh7IHRleHQsIGFzdCB9KVxuICB9XG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/core/importType.js b/node_modules/eslint-plugin-import/lib/core/importType.js
index 8321c5a..38d5200 100644
--- a/node_modules/eslint-plugin-import/lib/core/importType.js
+++ b/node_modules/eslint-plugin-import/lib/core/importType.js
@@ -1,150 +1,102 @@
-'use strict';
+'use strict';Object.defineProperty(exports, "__esModule", { value: true });var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();exports.
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
 
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
 
-exports.isAbsolute = isAbsolute;
-exports.isBuiltIn = isBuiltIn;
-exports.isExternalModule = isExternalModule;
-exports.isExternalModuleMain = isExternalModuleMain;
-exports.isScoped = isScoped;
-exports.isScopedMain = isScopedMain;
-exports.isScopedModule = isScopedModule;
-exports.default = resolveImportType;
 
-var _core = require('resolve/lib/core');
 
-var _core2 = _interopRequireDefault(_core);
 
-var _resolve = require('eslint-module-utils/resolve');
 
-var _resolve2 = _interopRequireDefault(_resolve);
 
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-function baseModule(name) {
-  if (isScoped(name)) {
-    var _name$split = name.split('/'),
-        _name$split2 = _slicedToArray(_name$split, 2);
 
-    const scope = _name$split2[0],
-          pkg = _name$split2[1];
 
-    return `${scope}/${pkg}`;
-  }
 
-  var _name$split3 = name.split('/'),
-      _name$split4 = _slicedToArray(_name$split3, 1);
+isAbsolute = isAbsolute;exports.
 
-  const pkg = _name$split4[0];
 
-  return pkg;
+
+
+isBuiltIn = isBuiltIn;exports.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+isExternalModule = isExternalModule;exports.
+
+
+
+
+isExternalModuleMain = isExternalModuleMain;exports.
+
+
+
+
+isScoped = isScoped;exports.
+
+
+
+
+isScopedMain = isScopedMain;exports.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+isScopedModule = isScopedModule;exports.default =
+
+
+
+resolveImportType;var _core = require('resolve/lib/core');var _core2 = _interopRequireDefault(_core);var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function baseModule(name) {if (isScoped(name)) {var _name$split = name.split('/'),_name$split2 = _slicedToArray(_name$split, 2);const scope = _name$split2[0],pkg = _name$split2[1];return `${scope}/${pkg}`;}var _name$split3 = name.split('/'),_name$split4 = _slicedToArray(_name$split3, 1);const pkg = _name$split4[0];return pkg;}function isAbsolute(name) {return name && name.startsWith('/');} // path is defined only when a resolver resolves to a non-standard path
+function isBuiltIn(name, settings, path) {if (path || !name) return false;const base = baseModule(name);const extras = settings && settings['import/core-modules'] || [];return _core2.default[base] || extras.indexOf(base) > -1;}function isExternalPath(path, name, settings) {const folders = settings && settings['import/external-module-folders'] || ['node_modules'];return !path || folders.some(folder => isSubpath(folder, path));}function isSubpath(subpath, path) {const normPath = path.replace(/\\/g, '/');const normSubpath = subpath.replace(/\\/g, '/').replace(/\/$/, '');if (normSubpath.length === 0) {return false;}const left = normPath.indexOf(normSubpath);const right = left + normSubpath.length;return left !== -1 && (left === 0 || normSubpath[0] !== '/' && normPath[left - 1] === '/') && (right >= normPath.length || normPath[right] === '/');}const externalModuleRegExp = /^\w/;function isExternalModule(name, settings, path) {return externalModuleRegExp.test(name) && isExternalPath(path, name, settings);}const externalModuleMainRegExp = /^[\w]((?!\/).)*$/;function isExternalModuleMain(name, settings, path) {return externalModuleMainRegExp.test(name) && isExternalPath(path, name, settings);}const scopedRegExp = /^@[^/]*\/?[^/]+/;function isScoped(name) {return name && scopedRegExp.test(name);}const scopedMainRegExp = /^@[^/]+\/?[^/]+$/;function isScopedMain(name) {return name && scopedMainRegExp.test(name);}function isInternalModule(name, settings, path) {const internalScope = settings && settings['import/internal-regex'];const matchesScopedOrExternalRegExp = scopedRegExp.test(name) || externalModuleRegExp.test(name);return matchesScopedOrExternalRegExp && (internalScope && new RegExp(internalScope).test(name) || !isExternalPath(path, name, settings));}function isRelativeToParent(name) {return (/^\.\.$|^\.\.[\\/]/.test(name));}const indexFiles = ['.', './', './index', './index.js'];function isIndex(name) {return indexFiles.indexOf(name) !== -1;}function isRelativeToSibling(name) {return (/^\.[\\/]/.test(name));}function typeTest(name, settings, path) {if (isAbsolute(name, settings, path)) {return 'absolute';}if (isBuiltIn(name, settings, path)) {return 'builtin';}if (isInternalModule(name, settings, path)) {return 'internal';}if (isExternalModule(name, settings, path)) {return 'external';}if (isScoped(name, settings, path)) {return 'external';}if (isRelativeToParent(name, settings, path)) {return 'parent';}if (isIndex(name, settings, path)) {return 'index';}if (isRelativeToSibling(name, settings, path)) {return 'sibling';}return 'unknown';}function isScopedModule(name) {return name.indexOf('@') === 0 && !name.startsWith('@/');}function resolveImportType(name, context) {return typeTest(name, context.settings, (0, _resolve2.default)(name, context));
 }
-
-function isAbsolute(name) {
-  return name.indexOf('/') === 0;
-}
-
-// path is defined only when a resolver resolves to a non-standard path
-function isBuiltIn(name, settings, path) {
-  if (path || !name) return false;
-  const base = baseModule(name);
-  const extras = settings && settings['import/core-modules'] || [];
-  return _core2.default[base] || extras.indexOf(base) > -1;
-}
-
-function isExternalPath(path, name, settings) {
-  const folders = settings && settings['import/external-module-folders'] || ['node_modules'];
-  return !path || folders.some(folder => isSubpath(folder, path));
-}
-
-function isSubpath(subpath, path) {
-  const normSubpath = subpath.replace(/[/]$/, '');
-  if (normSubpath.length === 0) {
-    return false;
-  }
-  const left = path.indexOf(normSubpath);
-  const right = left + normSubpath.length;
-  return left !== -1 && (left === 0 || normSubpath[0] !== '/' && path[left - 1] === '/') && (right >= path.length || path[right] === '/');
-}
-
-const externalModuleRegExp = /^\w/;
-function isExternalModule(name, settings, path) {
-  return externalModuleRegExp.test(name) && isExternalPath(path, name, settings);
-}
-
-const externalModuleMainRegExp = /^[\w]((?!\/).)*$/;
-function isExternalModuleMain(name, settings, path) {
-  return externalModuleMainRegExp.test(name) && isExternalPath(path, name, settings);
-}
-
-const scopedRegExp = /^@[^/]*\/?[^/]+/;
-function isScoped(name) {
-  return name && scopedRegExp.test(name);
-}
-
-const scopedMainRegExp = /^@[^/]+\/?[^/]+$/;
-function isScopedMain(name) {
-  return name && scopedMainRegExp.test(name);
-}
-
-function isInternalModule(name, settings, path) {
-  const internalScope = settings && settings['import/internal-regex'];
-  const matchesScopedOrExternalRegExp = scopedRegExp.test(name) || externalModuleRegExp.test(name);
-  return matchesScopedOrExternalRegExp && (internalScope && new RegExp(internalScope).test(name) || !isExternalPath(path, name, settings));
-}
-
-function isRelativeToParent(name) {
-  return (/^\.\.[\\/]/.test(name)
-  );
-}
-
-const indexFiles = ['.', './', './index', './index.js'];
-function isIndex(name) {
-  return indexFiles.indexOf(name) !== -1;
-}
-
-function isRelativeToSibling(name) {
-  return (/^\.[\\/]/.test(name)
-  );
-}
-
-function typeTest(name, settings, path) {
-  if (isAbsolute(name, settings, path)) {
-    return 'absolute';
-  }
-  if (isBuiltIn(name, settings, path)) {
-    return 'builtin';
-  }
-  if (isInternalModule(name, settings, path)) {
-    return 'internal';
-  }
-  if (isExternalModule(name, settings, path)) {
-    return 'external';
-  }
-  if (isScoped(name, settings, path)) {
-    return 'external';
-  }
-  if (isRelativeToParent(name, settings, path)) {
-    return 'parent';
-  }
-  if (isIndex(name, settings, path)) {
-    return 'index';
-  }
-  if (isRelativeToSibling(name, settings, path)) {
-    return 'sibling';
-  }
-  return 'unknown';
-}
-
-function isScopedModule(name) {
-  return name.indexOf('@') === 0;
-}
-
-function resolveImportType(name, context) {
-  return typeTest(name, context.settings, (0, _resolve2.default)(name, context));
-}
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL2ltcG9ydFR5cGUuanMiXSwibmFtZXMiOlsiaXNBYnNvbHV0ZSIsImlzQnVpbHRJbiIsImlzRXh0ZXJuYWxNb2R1bGUiLCJpc0V4dGVybmFsTW9kdWxlTWFpbiIsImlzU2NvcGVkIiwiaXNTY29wZWRNYWluIiwiaXNTY29wZWRNb2R1bGUiLCJyZXNvbHZlSW1wb3J0VHlwZSIsImJhc2VNb2R1bGUiLCJuYW1lIiwic3BsaXQiLCJzY29wZSIsInBrZyIsImluZGV4T2YiLCJzZXR0aW5ncyIsInBhdGgiLCJiYXNlIiwiZXh0cmFzIiwiY29yZU1vZHVsZXMiLCJpc0V4dGVybmFsUGF0aCIsImZvbGRlcnMiLCJzb21lIiwiZm9sZGVyIiwiaXNTdWJwYXRoIiwic3VicGF0aCIsIm5vcm1TdWJwYXRoIiwicmVwbGFjZSIsImxlbmd0aCIsImxlZnQiLCJyaWdodCIsImV4dGVybmFsTW9kdWxlUmVnRXhwIiwidGVzdCIsImV4dGVybmFsTW9kdWxlTWFpblJlZ0V4cCIsInNjb3BlZFJlZ0V4cCIsInNjb3BlZE1haW5SZWdFeHAiLCJpc0ludGVybmFsTW9kdWxlIiwiaW50ZXJuYWxTY29wZSIsIm1hdGNoZXNTY29wZWRPckV4dGVybmFsUmVnRXhwIiwiUmVnRXhwIiwiaXNSZWxhdGl2ZVRvUGFyZW50IiwiaW5kZXhGaWxlcyIsImlzSW5kZXgiLCJpc1JlbGF0aXZlVG9TaWJsaW5nIiwidHlwZVRlc3QiLCJjb250ZXh0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7OztRQWFnQkEsVSxHQUFBQSxVO1FBS0FDLFMsR0FBQUEsUztRQXlCQUMsZ0IsR0FBQUEsZ0I7UUFLQUMsb0IsR0FBQUEsb0I7UUFLQUMsUSxHQUFBQSxRO1FBS0FDLFksR0FBQUEsWTtRQW1DQUMsYyxHQUFBQSxjO2tCQUlRQyxpQjs7QUFqR3hCOzs7O0FBRUE7Ozs7OztBQUVBLFNBQVNDLFVBQVQsQ0FBb0JDLElBQXBCLEVBQTBCO0FBQ3hCLE1BQUlMLFNBQVNLLElBQVQsQ0FBSixFQUFv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QWtCO0FBQ3pELE1BQUlvQixpQkFBaUIxQixJQUFqQixFQUF1QkssUUFBdkIsRUFBaUNDLElBQWpDLENBQUosRUFBNEM7QUFBRSxXQUFPLFVBQVA7QUFBbUI7QUFDakUsTUFBSWIsaUJBQWlCTyxJQUFqQixFQUF1QkssUUFBdkIsRUFBaUNDLElBQWpDLENBQUosRUFBNEM7QUFBRSxXQUFPLFVBQVA7QUFBbUI7QUFDakUsTUFBSVgsU0FBU0ssSUFBVCxFQUFlSyxRQUFmLEVBQXlCQyxJQUF6QixDQUFKLEVBQW9DO0FBQUUsV0FBTyxVQUFQO0FBQW1CO0FBQ3pELE1BQUl3QixtQkFBbUI5QixJQUFuQixFQUF5QkssUUFBekIsRUFBbUNDLElBQW5DLENBQUosRUFBOEM7QUFBRSxXQUFPLFFBQVA7QUFBaUI7QUFDakUsTUFBSTBCLFFBQVFoQyxJQUFSLEVBQWNLLFFBQWQsRUFBd0JDLElBQXhCLENBQUosRUFBbUM7QUFBRSxXQUFPLE9BQVA7QUFBZ0I7QUFDckQsTUFBSTJCLG9CQUFvQmpDLElBQXBCLEVBQTBCSyxRQUExQixFQUFvQ0MsSUFBcEMsQ0FBSixFQUErQztBQUFFLFdBQU8sU0FBUDtBQUFrQjtBQUNuRSxTQUFPLFNBQVA7QUFDRDs7QUFFTSxTQUFTVCxjQUFULENBQXdCRyxJQUF4QixFQUE4QjtBQUNuQyxTQUFPQSxLQUFLSSxPQUFMLENBQWEsR0FBYixNQUFzQixDQUE3QjtBQUNEOztBQUVjLFNBQVNOLGlCQUFULENBQTJCRSxJQUEzQixFQUFpQ21DLE9BQWpDLEVBQTBDO0FBQ3ZELFNBQU9ELFNBQVNsQyxJQUFULEVBQWVtQyxRQUFROUIsUUFBdkIsRUFBaUMsdUJBQVFMLElBQVIsRUFBY21DLE9BQWQsQ0FBakMsQ0FBUDtBQUNEIiwiZmlsZSI6ImltcG9ydFR5cGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29yZU1vZHVsZXMgZnJvbSAncmVzb2x2ZS9saWIvY29yZSdcblxuaW1wb3J0IHJlc29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJ1xuXG5mdW5jdGlvbiBiYXNlTW9kdWxlKG5hbWUpIHtcbiAgaWYgKGlzU2NvcGVkKG5hbWUpKSB7XG4gICAgY29uc3QgW3Njb3BlLCBwa2ddID0gbmFtZS5zcGxpdCgnLycpXG4gICAgcmV0dXJuIGAke3Njb3BlfS8ke3BrZ31gXG4gIH1cbiAgY29uc3QgW3BrZ10gPSBuYW1lLnNwbGl0KCcvJylcbiAgcmV0dXJuIHBrZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBYnNvbHV0ZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLmluZGV4T2YoJy8nKSA9PT0gMFxufVxuXG4vLyBwYXRoIGlzIGRlZmluZWQgb25seSB3aGVuIGEgcmVzb2x2ZXIgcmVzb2x2ZXMgdG8gYSBub24tc3RhbmRhcmQgcGF0aFxuZXhwb3J0IGZ1bmN0aW9uIGlzQnVpbHRJbihuYW1lLCBzZXR0aW5ncywgcGF0aCkge1xuICBpZiAocGF0aCB8fCAhbmFtZSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IGJhc2UgPSBiYXNlTW9kdWxlKG5hbWUpXG4gIGNvbnN0IGV4dHJhcyA9IChzZXR0aW5ncyAmJiBzZXR0aW5nc1snaW1wb3J0L2NvcmUtbW9kdWxlcyddKSB8fCBbXVxuICByZXR1cm4gY29yZU1vZHVsZXNbYmFzZV0gfHwgZXh0cmFzLmluZGV4T2YoYmFzZSkgPiAtMVxufVxuXG5mdW5jdGlvbiBpc0V4dGVybmFsUGF0aChwYXRoLCBuYW1lLCBzZXR0aW5ncykge1xuICBjb25zdCBmb2xkZXJzID0gKHNldHRpbmdzICYmIHNldHRpbmdzWydpbXBvcnQvZXh0ZXJuYWwtbW9kdWxlLWZvbGRlcnMnXSkgfHwgWydub2RlX21vZHVsZXMnXVxuICByZXR1cm4gIXBhdGggfHwgZm9sZGVycy5zb21lKGZvbGRlciA9PiBpc1N1YnBhdGgoZm9sZGVyLCBwYXRoKSlcbn1cblxuZnVuY3Rpb24gaXNTdWJwYXRoKHN1YnBhdGgsIHBhdGgpIHtcbiAgY29uc3Qgbm9ybVN1YnBhdGggPSBzdWJwYXRoLnJlcGxhY2UoL1svXSQvLCAnJylcbiAgaWYgKG5vcm1TdWJwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGNvbnN0IGxlZnQgPSBwYXRoLmluZGV4T2Yobm9ybVN1YnBhdGgpXG4gIGNvbnN0IHJpZ2h0ID0gbGVmdCArIG5vcm1TdWJwYXRoLmxlbmd0aFxuICByZXR1cm4gbGVmdCAhPT0gLTEgJiZcbiAgICAgICAgKGxlZnQgPT09IDAgfHwgbm9ybVN1YnBhdGhbMF0gIT09ICcvJyAmJiBwYXRoW2xlZnQgLSAxXSA9PT0gJy8nKSAmJlxuICAgICAgICAocmlnaHQgPj0gcGF0aC5sZW5ndGggfHwgcGF0aFtyaWdodF0gPT09ICcvJylcbn1cblxuY29uc3QgZXh0ZXJuYWxNb2R1bGVSZWdFeHAgPSAvXlxcdy9cbmV4cG9ydCBmdW5jdGlvbiBpc0V4dGVybmFsTW9kdWxlKG5hbWUsIHNldHRpbmdzLCBwYXRoKSB7XG4gIHJldHVybiBleHRlcm5hbE1vZHVsZVJlZ0V4cC50ZXN0KG5hbWUpICYmIGlzRXh0ZXJuYWxQYXRoKHBhdGgsIG5hbWUsIHNldHRpbmdzKVxufVxuXG5jb25zdCBleHRlcm5hbE1vZHVsZU1haW5SZWdFeHAgPSAvXltcXHddKCg/IVxcLykuKSokL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXh0ZXJuYWxNb2R1bGVNYWluKG5hbWUsIHNldHRpbmdzLCBwYXRoKSB7XG4gIHJldHVybiBleHRlcm5hbE1vZHVsZU1haW5SZWdFeHAudGVzdChuYW1lKSAmJiBpc0V4dGVybmFsUGF0aChwYXRoLCBuYW1lLCBzZXR0aW5ncylcbn1cblxuY29uc3Qgc2NvcGVkUmVnRXhwID0gL15AW14vXSpcXC8/W14vXSsvXG5leHBvcnQgZnVuY3Rpb24gaXNTY29wZWQobmFtZSkge1xuICByZXR1cm4gbmFtZSAmJiBzY29wZWRSZWdFeHAudGVzdChuYW1lKVxufVxuXG5jb25zdCBzY29wZWRNYWluUmVnRXhwID0gL15AW14vXStcXC8/W14vXSskL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2NvcGVkTWFpbihuYW1lKSB7XG4gIHJldHVybiBuYW1lICYmIHNjb3BlZE1haW5SZWdFeHAudGVzdChuYW1lKVxufVxuXG5mdW5jdGlvbiBpc0ludGVybmFsTW9kdWxlKG5hbWUsIHNldHRpbmdzLCBwYXRoKSB7XG4gIGNvbnN0IGludGVybmFsU2NvcGUgPSAoc2V0dGluZ3MgJiYgc2V0dGluZ3NbJ2ltcG9ydC9pbnRlcm5hbC1yZWdleCddKVxuICBjb25zdCBtYXRjaGVzU2NvcGVkT3JFeHRlcm5hbFJlZ0V4cCA9IHNjb3BlZFJlZ0V4cC50ZXN0KG5hbWUpIHx8IGV4dGVybmFsTW9kdWxlUmVnRXhwLnRlc3QobmFtZSlcbiAgcmV0dXJuIChtYXRjaGVzU2NvcGVkT3JFeHRlcm5hbFJlZ0V4cCAmJiAoaW50ZXJuYWxTY29wZSAmJiBuZXcgUmVnRXhwKGludGVybmFsU2NvcGUpLnRlc3QobmFtZSkgfHwgIWlzRXh0ZXJuYWxQYXRoKHBhdGgsIG5hbWUsIHNldHRpbmdzKSkpXG59XG5cbmZ1bmN0aW9uIGlzUmVsYXRpdmVUb1BhcmVudChuYW1lKSB7XG4gIHJldHVybiAvXlxcLlxcLltcXFxcL10vLnRlc3QobmFtZSlcbn1cblxuY29uc3QgaW5kZXhGaWxlcyA9IFsnLicsICcuLycsICcuL2luZGV4JywgJy4vaW5kZXguanMnXVxuZnVuY3Rpb24gaXNJbmRleChuYW1lKSB7XG4gIHJldHVybiBpbmRleEZpbGVzLmluZGV4T2YobmFtZSkgIT09IC0xXG59XG5cbmZ1bmN0aW9uIGlzUmVsYXRpdmVUb1NpYmxpbmcobmFtZSkge1xuICByZXR1cm4gL15cXC5bXFxcXC9dLy50ZXN0KG5hbWUpXG59XG5cbmZ1bmN0aW9uIHR5cGVUZXN0KG5hbWUsIHNldHRpbmdzLCBwYXRoKSB7XG4gIGlmIChpc0Fic29sdXRlKG5hbWUsIHNldHRpbmdzLCBwYXRoKSkgeyByZXR1cm4gJ2Fic29sdXRlJyB9XG4gIGlmIChpc0J1aWx0SW4obmFtZSwgc2V0dGluZ3MsIHBhdGgpKSB7IHJldHVybiAnYnVpbHRpbicgfVxuICBpZiAoaXNJbnRlcm5hbE1vZHVsZShuYW1lLCBzZXR0aW5ncywgcGF0aCkpIHsgcmV0dXJuICdpbnRlcm5hbCcgfVxuICBpZiAoaXNFeHRlcm5hbE1vZHVsZShuYW1lLCBzZXR0aW5ncywgcGF0aCkpIHsgcmV0dXJuICdleHRlcm5hbCcgfVxuICBpZiAoaXNTY29wZWQobmFtZSwgc2V0dGluZ3MsIHBhdGgpKSB7IHJldHVybiAnZXh0ZXJuYWwnIH1cbiAgaWYgKGlzUmVsYXRpdmVUb1BhcmVudChuYW1lLCBzZXR0aW5ncywgcGF0aCkpIHsgcmV0dXJuICdwYXJlbnQnIH1cbiAgaWYgKGlzSW5kZXgobmFtZSwgc2V0dGluZ3MsIHBhdGgpKSB7IHJldHVybiAnaW5kZXgnIH1cbiAgaWYgKGlzUmVsYXRpdmVUb1NpYmxpbmcobmFtZSwgc2V0dGluZ3MsIHBhdGgpKSB7IHJldHVybiAnc2libGluZycgfVxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Njb3BlZE1vZHVsZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLmluZGV4T2YoJ0AnKSA9PT0gMFxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXNvbHZlSW1wb3J0VHlwZShuYW1lLCBjb250ZXh0KSB7XG4gIHJldHVybiB0eXBlVGVzdChuYW1lLCBjb250ZXh0LnNldHRpbmdzLCByZXNvbHZlKG5hbWUsIGNvbnRleHQpKVxufVxuIl19
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL2ltcG9ydFR5cGUuanMiXSwibmFtZXMiOlsiaXNBYnNvbHV0ZSIsImlzQnVpbHRJbiIsImlzRXh0ZXJuYWxNb2R1bGUiLCJpc0V4dGVybmFsTW9kdWxlTWFpbiIsImlzU2NvcGVkIiwiaXNTY29wZWRNYWluIiwiaXNTY29wZWRNb2R1bGUiLCJyZXNvbHZlSW1wb3J0VHlwZSIsImJhc2VNb2R1bGUiLCJuYW1lIiwic3BsaXQiLCJzY29wZSIsInBrZyIsInN0YXJ0c1dpdGgiLCJzZXR0aW5ncyIsInBhdGgiLCJiYXNlIiwiZXh0cmFzIiwiY29yZU1vZHVsZXMiLCJpbmRleE9mIiwiaXNFeHRlcm5hbFBhdGgiLCJmb2xkZXJzIiwic29tZSIsImZvbGRlciIsImlzU3VicGF0aCIsInN1YnBhdGgiLCJub3JtUGF0aCIsInJlcGxhY2UiLCJub3JtU3VicGF0aCIsImxlbmd0aCIsImxlZnQiLCJyaWdodCIsImV4dGVybmFsTW9kdWxlUmVnRXhwIiwidGVzdCIsImV4dGVybmFsTW9kdWxlTWFpblJlZ0V4cCIsInNjb3BlZFJlZ0V4cCIsInNjb3BlZE1haW5SZWdFeHAiLCJpc0ludGVybmFsTW9kdWxlIiwiaW50ZXJuYWxTY29wZSIsIm1hdGNoZXNTY29wZWRPckV4dGVybmFsUmVnRXhwIiwiUmVnRXhwIiwiaXNSZWxhdGl2ZVRvUGFyZW50IiwiaW5kZXhGaWxlcyIsImlzSW5kZXgiLCJpc1JlbGF0aXZlVG9TaWJsaW5nIiwidHlwZVRlc3QiLCJjb250ZXh0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBYWdCQSxVLEdBQUFBLFU7Ozs7O0FBS0FDLFMsR0FBQUEsUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQkFDLGdCLEdBQUFBLGdCOzs7OztBQUtBQyxvQixHQUFBQSxvQjs7Ozs7QUFLQUMsUSxHQUFBQSxROzs7OztBQUtBQyxZLEdBQUFBLFk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUNBQyxjLEdB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UUFBUWhDLFFBQXZCLEVBQWlDLHVCQUFRTCxJQUFSLEVBQWNxQyxPQUFkLENBQWpDLENBQVA7QUFDRCIsImZpbGUiOiJpbXBvcnRUeXBlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvcmVNb2R1bGVzIGZyb20gJ3Jlc29sdmUvbGliL2NvcmUnXG5cbmltcG9ydCByZXNvbHZlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVzb2x2ZSdcblxuZnVuY3Rpb24gYmFzZU1vZHVsZShuYW1lKSB7XG4gIGlmIChpc1Njb3BlZChuYW1lKSkge1xuICAgIGNvbnN0IFtzY29wZSwgcGtnXSA9IG5hbWUuc3BsaXQoJy8nKVxuICAgIHJldHVybiBgJHtzY29wZX0vJHtwa2d9YFxuICB9XG4gIGNvbnN0IFtwa2ddID0gbmFtZS5zcGxpdCgnLycpXG4gIHJldHVybiBwa2dcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQWJzb2x1dGUobmFtZSkge1xuICByZXR1cm4gbmFtZSAmJiBuYW1lLnN0YXJ0c1dpdGgoJy8nKVxufVxuXG4vLyBwYXRoIGlzIGRlZmluZWQgb25seSB3aGVuIGEgcmVzb2x2ZXIgcmVzb2x2ZXMgdG8gYSBub24tc3RhbmRhcmQgcGF0aFxuZXhwb3J0IGZ1bmN0aW9uIGlzQnVpbHRJbihuYW1lLCBzZXR0aW5ncywgcGF0aCkge1xuICBpZiAocGF0aCB8fCAhbmFtZSkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IGJhc2UgPSBiYXNlTW9kdWxlKG5hbWUpXG4gIGNvbnN0IGV4dHJhcyA9IChzZXR0aW5ncyAmJiBzZXR0aW5nc1snaW1wb3J0L2NvcmUtbW9kdWxlcyddKSB8fCBbXVxuICByZXR1cm4gY29yZU1vZHVsZXNbYmFzZV0gfHwgZXh0cmFzLmluZGV4T2YoYmFzZSkgPiAtMVxufVxuXG5mdW5jdGlvbiBpc0V4dGVybmFsUGF0aChwYXRoLCBuYW1lLCBzZXR0aW5ncykge1xuICBjb25zdCBmb2xkZXJzID0gKHNldHRpbmdzICYmIHNldHRpbmdzWydpbXBvcnQvZXh0ZXJuYWwtbW9kdWxlLWZvbGRlcnMnXSkgfHwgWydub2RlX21vZHVsZXMnXVxuICByZXR1cm4gIXBhdGggfHwgZm9sZGVycy5zb21lKGZvbGRlciA9PiBpc1N1YnBhdGgoZm9sZGVyLCBwYXRoKSlcbn1cblxuZnVuY3Rpb24gaXNTdWJwYXRoKHN1YnBhdGgsIHBhdGgpIHtcbiAgY29uc3Qgbm9ybVBhdGggPSBwYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKVxuICBjb25zdCBub3JtU3VicGF0aCA9IHN1YnBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpLnJlcGxhY2UoL1xcLyQvLCAnJylcbiAgaWYgKG5vcm1TdWJwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGNvbnN0IGxlZnQgPSBub3JtUGF0aC5pbmRleE9mKG5vcm1TdWJwYXRoKVxuICBjb25zdCByaWdodCA9IGxlZnQgKyBub3JtU3VicGF0aC5sZW5ndGhcbiAgcmV0dXJuIGxlZnQgIT09IC0xICYmXG4gICAgICAgIChsZWZ0ID09PSAwIHx8IG5vcm1TdWJwYXRoWzBdICE9PSAnLycgJiYgbm9ybVBhdGhbbGVmdCAtIDFdID09PSAnLycpICYmXG4gICAgICAgIChyaWdodCA+PSBub3JtUGF0aC5sZW5ndGggfHwgbm9ybVBhdGhbcmlnaHRdID09PSAnLycpXG59XG5cbmNvbnN0IGV4dGVybmFsTW9kdWxlUmVnRXhwID0gL15cXHcvXG5leHBvcnQgZnVuY3Rpb24gaXNFeHRlcm5hbE1vZHVsZShuYW1lLCBzZXR0aW5ncywgcGF0aCkge1xuICByZXR1cm4gZXh0ZXJuYWxNb2R1bGVSZWdFeHAudGVzdChuYW1lKSAmJiBpc0V4dGVybmFsUGF0aChwYXRoLCBuYW1lLCBzZXR0aW5ncylcbn1cblxuY29uc3QgZXh0ZXJuYWxNb2R1bGVNYWluUmVnRXhwID0gL15bXFx3XSgoPyFcXC8pLikqJC9cbmV4cG9ydCBmdW5jdGlvbiBpc0V4dGVybmFsTW9kdWxlTWFpbihuYW1lLCBzZXR0aW5ncywgcGF0aCkge1xuICByZXR1cm4gZXh0ZXJuYWxNb2R1bGVNYWluUmVnRXhwLnRlc3QobmFtZSkgJiYgaXNFeHRlcm5hbFBhdGgocGF0aCwgbmFtZSwgc2V0dGluZ3MpXG59XG5cbmNvbnN0IHNjb3BlZFJlZ0V4cCA9IC9eQFteL10qXFwvP1teL10rL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2NvcGVkKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUgJiYgc2NvcGVkUmVnRXhwLnRlc3QobmFtZSlcbn1cblxuY29uc3Qgc2NvcGVkTWFpblJlZ0V4cCA9IC9eQFteL10rXFwvP1teL10rJC9cbmV4cG9ydCBmdW5jdGlvbiBpc1Njb3BlZE1haW4obmFtZSkge1xuICByZXR1cm4gbmFtZSAmJiBzY29wZWRNYWluUmVnRXhwLnRlc3QobmFtZSlcbn1cblxuZnVuY3Rpb24gaXNJbnRlcm5hbE1vZHVsZShuYW1lLCBzZXR0aW5ncywgcGF0aCkge1xuICBjb25zdCBpbnRlcm5hbFNjb3BlID0gKHNldHRpbmdzICYmIHNldHRpbmdzWydpbXBvcnQvaW50ZXJuYWwtcmVnZXgnXSlcbiAgY29uc3QgbWF0Y2hlc1Njb3BlZE9yRXh0ZXJuYWxSZWdFeHAgPSBzY29wZWRSZWdFeHAudGVzdChuYW1lKSB8fCBleHRlcm5hbE1vZHVsZVJlZ0V4cC50ZXN0KG5hbWUpXG4gIHJldHVybiAobWF0Y2hlc1Njb3BlZE9yRXh0ZXJuYWxSZWdFeHAgJiYgKGludGVybmFsU2NvcGUgJiYgbmV3IFJlZ0V4cChpbnRlcm5hbFNjb3BlKS50ZXN0KG5hbWUpIHx8ICFpc0V4dGVybmFsUGF0aChwYXRoLCBuYW1lLCBzZXR0aW5ncykpKVxufVxuXG5mdW5jdGlvbiBpc1JlbGF0aXZlVG9QYXJlbnQobmFtZSkge1xuICByZXR1cm4vXlxcLlxcLiR8XlxcLlxcLltcXFxcL10vLnRlc3QobmFtZSlcbn1cblxuY29uc3QgaW5kZXhGaWxlcyA9IFsnLicsICcuLycsICcuL2luZGV4JywgJy4vaW5kZXguanMnXVxuZnVuY3Rpb24gaXNJbmRleChuYW1lKSB7XG4gIHJldHVybiBpbmRleEZpbGVzLmluZGV4T2YobmFtZSkgIT09IC0xXG59XG5cbmZ1bmN0aW9uIGlzUmVsYXRpdmVUb1NpYmxpbmcobmFtZSkge1xuICByZXR1cm4gL15cXC5bXFxcXC9dLy50ZXN0KG5hbWUpXG59XG5cbmZ1bmN0aW9uIHR5cGVUZXN0KG5hbWUsIHNldHRpbmdzLCBwYXRoKSB7XG4gIGlmIChpc0Fic29sdXRlKG5hbWUsIHNldHRpbmdzLCBwYXRoKSkgeyByZXR1cm4gJ2Fic29sdXRlJyB9XG4gIGlmIChpc0J1aWx0SW4obmFtZSwgc2V0dGluZ3MsIHBhdGgpKSB7IHJldHVybiAnYnVpbHRpbicgfVxuICBpZiAoaXNJbnRlcm5hbE1vZHVsZShuYW1lLCBzZXR0aW5ncywgcGF0aCkpIHsgcmV0dXJuICdpbnRlcm5hbCcgfVxuICBpZiAoaXNFeHRlcm5hbE1vZHVsZShuYW1lLCBzZXR0aW5ncywgcGF0aCkpIHsgcmV0dXJuICdleHRlcm5hbCcgfVxuICBpZiAoaXNTY29wZWQobmFtZSwgc2V0dGluZ3MsIHBhdGgpKSB7IHJldHVybiAnZXh0ZXJuYWwnIH1cbiAgaWYgKGlzUmVsYXRpdmVUb1BhcmVudChuYW1lLCBzZXR0aW5ncywgcGF0aCkpIHsgcmV0dXJuICdwYXJlbnQnIH1cbiAgaWYgKGlzSW5kZXgobmFtZSwgc2V0dGluZ3MsIHBhdGgpKSB7IHJldHVybiAnaW5kZXgnIH1cbiAgaWYgKGlzUmVsYXRpdmVUb1NpYmxpbmcobmFtZSwgc2V0dGluZ3MsIHBhdGgpKSB7IHJldHVybiAnc2libGluZycgfVxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Njb3BlZE1vZHVsZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLmluZGV4T2YoJ0AnKSA9PT0gMCAmJiAhbmFtZS5zdGFydHNXaXRoKCdALycpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlc29sdmVJbXBvcnRUeXBlKG5hbWUsIGNvbnRleHQpIHtcbiAgcmV0dXJuIHR5cGVUZXN0KG5hbWUsIGNvbnRleHQuc2V0dGluZ3MsIHJlc29sdmUobmFtZSwgY29udGV4dCkpXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/core/staticRequire.js b/node_modules/eslint-plugin-import/lib/core/staticRequire.js
index 496fe7b..507dce5 100644
--- a/node_modules/eslint-plugin-import/lib/core/staticRequire.js
+++ b/node_modules/eslint-plugin-import/lib/core/staticRequire.js
@@ -1,11 +1,11 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = isStaticRequire;
-// todo: merge with module visitor
-function isStaticRequire(node) {
-  return node && node.callee && node.callee.type === 'Identifier' && node.callee.name === 'require' && node.arguments.length === 1 && node.arguments[0].type === 'Literal' && typeof node.arguments[0].value === 'string';
+'use strict';Object.defineProperty(exports, "__esModule", { value: true });exports.default =
+isStaticRequire; // todo: merge with module visitor
+function isStaticRequire(node) {return node &&
+  node.callee &&
+  node.callee.type === 'Identifier' &&
+  node.callee.name === 'require' &&
+  node.arguments.length === 1 &&
+  node.arguments[0].type === 'Literal' &&
+  typeof node.arguments[0].value === 'string';
 }
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3N0YXRpY1JlcXVpcmUuanMiXSwibmFtZXMiOlsiaXNTdGF0aWNSZXF1aXJlIiwibm9kZSIsImNhbGxlZSIsInR5cGUiLCJuYW1lIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidmFsdWUiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUN3QkEsZTtBQUR4QjtBQUNlLFNBQVNBLGVBQVQsQ0FBeUJDLElBQXpCLEVBQStCO0FBQzVDLFNBQU9BLFFBQ0xBLEtBQUtDLE1BREEsSUFFTEQsS0FBS0MsTUFBTCxDQUFZQyxJQUFaLEtBQXFCLFlBRmhCLElBR0xGLEtBQUtDLE1BQUwsQ0FBWUUsSUFBWixLQUFxQixTQUhoQixJQUlMSCxLQUFLSSxTQUFMLENBQWVDLE1BQWYsS0FBMEIsQ0FKckIsSUFLTEwsS0FBS0ksU0FBTCxDQUFlLENBQWYsRUFBa0JGLElBQWxCLEtBQTJCLFNBTHRCLElBTUwsT0FBT0YsS0FBS0ksU0FBTCxDQUFlLENBQWYsRUFBa0JFLEtBQXpCLEtBQW1DLFFBTnJDO0FBT0QiLCJmaWxlIjoic3RhdGljUmVxdWlyZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRvZG86IG1lcmdlIHdpdGggbW9kdWxlIHZpc2l0b3JcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU3RhdGljUmVxdWlyZShub2RlKSB7XG4gIHJldHVybiBub2RlICYmXG4gICAgbm9kZS5jYWxsZWUgJiZcbiAgICBub2RlLmNhbGxlZS50eXBlID09PSAnSWRlbnRpZmllcicgJiZcbiAgICBub2RlLmNhbGxlZS5uYW1lID09PSAncmVxdWlyZScgJiZcbiAgICBub2RlLmFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICBub2RlLmFyZ3VtZW50c1swXS50eXBlID09PSAnTGl0ZXJhbCcgJiZcbiAgICB0eXBlb2Ygbm9kZS5hcmd1bWVudHNbMF0udmFsdWUgPT09ICdzdHJpbmcnXG59XG4iXX0=
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3N0YXRpY1JlcXVpcmUuanMiXSwibmFtZXMiOlsiaXNTdGF0aWNSZXF1aXJlIiwibm9kZSIsImNhbGxlZSIsInR5cGUiLCJuYW1lIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidmFsdWUiXSwibWFwcGluZ3MiOiI7QUFDd0JBLGUsRUFEeEI7QUFDZSxTQUFTQSxlQUFULENBQXlCQyxJQUF6QixFQUErQixDQUM1QyxPQUFPQTtBQUNMQSxPQUFLQyxNQURBO0FBRUxELE9BQUtDLE1BQUwsQ0FBWUMsSUFBWixLQUFxQixZQUZoQjtBQUdMRixPQUFLQyxNQUFMLENBQVlFLElBQVosS0FBcUIsU0FIaEI7QUFJTEgsT0FBS0ksU0FBTCxDQUFlQyxNQUFmLEtBQTBCLENBSnJCO0FBS0xMLE9BQUtJLFNBQUwsQ0FBZSxDQUFmLEVBQWtCRixJQUFsQixLQUEyQixTQUx0QjtBQU1MLFNBQU9GLEtBQUtJLFNBQUwsQ0FBZSxDQUFmLEVBQWtCRSxLQUF6QixLQUFtQyxRQU5yQztBQU9EIiwiZmlsZSI6InN0YXRpY1JlcXVpcmUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0b2RvOiBtZXJnZSB3aXRoIG1vZHVsZSB2aXNpdG9yXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1N0YXRpY1JlcXVpcmUobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJlxuICAgIG5vZGUuY2FsbGVlICYmXG4gICAgbm9kZS5jYWxsZWUudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmXG4gICAgbm9kZS5jYWxsZWUubmFtZSA9PT0gJ3JlcXVpcmUnICYmXG4gICAgbm9kZS5hcmd1bWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgbm9kZS5hcmd1bWVudHNbMF0udHlwZSA9PT0gJ0xpdGVyYWwnICYmXG4gICAgdHlwZW9mIG5vZGUuYXJndW1lbnRzWzBdLnZhbHVlID09PSAnc3RyaW5nJ1xufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/docsUrl.js b/node_modules/eslint-plugin-import/lib/docsUrl.js
index 8a94e8c..d8aae5f 100644
--- a/node_modules/eslint-plugin-import/lib/docsUrl.js
+++ b/node_modules/eslint-plugin-import/lib/docsUrl.js
@@ -1,21 +1,8 @@
-'use strict';
+'use strict';Object.defineProperty(exports, "__esModule", { value: true });exports.default =
 
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = docsUrl;
 
-var _package = require('../package.json');
 
-var _package2 = _interopRequireDefault(_package);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const repoUrl = 'https://github.com/benmosher/eslint-plugin-import';
-
-function docsUrl(ruleName) {
-  let commitish = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : `v${_package2.default.version}`;
-
+docsUrl;var _package = require('../package.json');var _package2 = _interopRequireDefault(_package);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}const repoUrl = 'https://github.com/benmosher/eslint-plugin-import';function docsUrl(ruleName) {let commitish = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : `v${_package2.default.version}`;
   return `${repoUrl}/blob/${commitish}/docs/rules/${ruleName}.md`;
 }
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kb2NzVXJsLmpzIl0sIm5hbWVzIjpbImRvY3NVcmwiLCJyZXBvVXJsIiwicnVsZU5hbWUiLCJjb21taXRpc2giLCJwa2ciLCJ2ZXJzaW9uIl0sIm1hcHBpbmdzIjoiOzs7OztrQkFJd0JBLE87O0FBSnhCOzs7Ozs7QUFFQSxNQUFNQyxVQUFVLG1EQUFoQjs7QUFFZSxTQUFTRCxPQUFULENBQWlCRSxRQUFqQixFQUEwRDtBQUFBLE1BQS9CQyxTQUErQix1RUFBbEIsSUFBR0Msa0JBQUlDLE9BQVEsRUFBRzs7QUFDdkUsU0FBUSxHQUFFSixPQUFRLFNBQVFFLFNBQVUsZUFBY0QsUUFBUyxLQUEzRDtBQUNEIiwiZmlsZSI6ImRvY3NVcmwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbidcblxuY29uc3QgcmVwb1VybCA9ICdodHRwczovL2dpdGh1Yi5jb20vYmVubW9zaGVyL2VzbGludC1wbHVnaW4taW1wb3J0J1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkb2NzVXJsKHJ1bGVOYW1lLCBjb21taXRpc2ggPSBgdiR7cGtnLnZlcnNpb259YCkge1xuICByZXR1cm4gYCR7cmVwb1VybH0vYmxvYi8ke2NvbW1pdGlzaH0vZG9jcy9ydWxlcy8ke3J1bGVOYW1lfS5tZGBcbn1cbiJdfQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kb2NzVXJsLmpzIl0sIm5hbWVzIjpbImRvY3NVcmwiLCJyZXBvVXJsIiwicnVsZU5hbWUiLCJjb21taXRpc2giLCJwa2ciLCJ2ZXJzaW9uIl0sIm1hcHBpbmdzIjoiOzs7O0FBSXdCQSxPLENBSnhCLDBDLDhJQUVBLE1BQU1DLFVBQVUsbURBQWhCLENBRWUsU0FBU0QsT0FBVCxDQUFpQkUsUUFBakIsRUFBMEQsS0FBL0JDLFNBQStCLHVFQUFsQixJQUFHQyxrQkFBSUMsT0FBUSxFQUFHO0FBQ3ZFLFNBQVEsR0FBRUosT0FBUSxTQUFRRSxTQUFVLGVBQWNELFFBQVMsS0FBM0Q7QUFDRCIsImZpbGUiOiJkb2NzVXJsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nXG5cbmNvbnN0IHJlcG9VcmwgPSAnaHR0cHM6Ly9naXRodWIuY29tL2Jlbm1vc2hlci9lc2xpbnQtcGx1Z2luLWltcG9ydCdcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZG9jc1VybChydWxlTmFtZSwgY29tbWl0aXNoID0gYHYke3BrZy52ZXJzaW9ufWApIHtcbiAgcmV0dXJuIGAke3JlcG9Vcmx9L2Jsb2IvJHtjb21taXRpc2h9L2RvY3MvcnVsZXMvJHtydWxlTmFtZX0ubWRgXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/importDeclaration.js b/node_modules/eslint-plugin-import/lib/importDeclaration.js
index 8c64ac3..eefe50c 100644
--- a/node_modules/eslint-plugin-import/lib/importDeclaration.js
+++ b/node_modules/eslint-plugin-import/lib/importDeclaration.js
@@ -1,11 +1,5 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = importDeclaration;
-function importDeclaration(context) {
+"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.default = importDeclaration;function importDeclaration(context) {
   var ancestors = context.getAncestors();
   return ancestors[ancestors.length - 1];
 }
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbXBvcnREZWNsYXJhdGlvbi5qcyJdLCJuYW1lcyI6WyJpbXBvcnREZWNsYXJhdGlvbiIsImNvbnRleHQiLCJhbmNlc3RvcnMiLCJnZXRBbmNlc3RvcnMiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUF3QkEsaUI7QUFBVCxTQUFTQSxpQkFBVCxDQUEyQkMsT0FBM0IsRUFBb0M7QUFDakQsTUFBSUMsWUFBWUQsUUFBUUUsWUFBUixFQUFoQjtBQUNBLFNBQU9ELFVBQVVBLFVBQVVFLE1BQVYsR0FBbUIsQ0FBN0IsQ0FBUDtBQUNEIiwiZmlsZSI6ImltcG9ydERlY2xhcmF0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW1wb3J0RGVjbGFyYXRpb24oY29udGV4dCkge1xuICB2YXIgYW5jZXN0b3JzID0gY29udGV4dC5nZXRBbmNlc3RvcnMoKVxuICByZXR1cm4gYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAxXVxufVxuIl19
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbXBvcnREZWNsYXJhdGlvbi5qcyJdLCJuYW1lcyI6WyJpbXBvcnREZWNsYXJhdGlvbiIsImNvbnRleHQiLCJhbmNlc3RvcnMiLCJnZXRBbmNlc3RvcnMiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiI2RkFBd0JBLGlCLENBQVQsU0FBU0EsaUJBQVQsQ0FBMkJDLE9BQTNCLEVBQW9DO0FBQ2pELE1BQUlDLFlBQVlELFFBQVFFLFlBQVIsRUFBaEI7QUFDQSxTQUFPRCxVQUFVQSxVQUFVRSxNQUFWLEdBQW1CLENBQTdCLENBQVA7QUFDRCIsImZpbGUiOiJpbXBvcnREZWNsYXJhdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGltcG9ydERlY2xhcmF0aW9uKGNvbnRleHQpIHtcbiAgdmFyIGFuY2VzdG9ycyA9IGNvbnRleHQuZ2V0QW5jZXN0b3JzKClcbiAgcmV0dXJuIGFuY2VzdG9yc1thbmNlc3RvcnMubGVuZ3RoIC0gMV1cbn1cbiJdfQ==
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/index.js b/node_modules/eslint-plugin-import/lib/index.js
index 4981497..6497f69 100644
--- a/node_modules/eslint-plugin-import/lib/index.js
+++ b/node_modules/eslint-plugin-import/lib/index.js
@@ -1,9 +1,4 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-const rules = exports.rules = {
+'use strict';Object.defineProperty(exports, "__esModule", { value: true });const rules = exports.rules = {
   'no-unresolved': require('./rules/no-unresolved'),
   'named': require('./rules/named'),
   'default': require('./rules/default'),
@@ -52,8 +47,8 @@
   'no-deprecated': require('./rules/no-deprecated'),
 
   // deprecated aliases to rules
-  'imports-first': require('./rules/imports-first')
-};
+  'imports-first': require('./rules/imports-first') };
+
 
 const configs = exports.configs = {
   'recommended': require('../config/recommended'),
@@ -68,6 +63,5 @@
   'react': require('../config/react'),
   'react-native': require('../config/react-native'),
   'electron': require('../config/electron'),
-  'typescript': require('../config/typescript')
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJydWxlcyIsInJlcXVpcmUiLCJjb25maWdzIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFPLE1BQU1BLHdCQUFRO0FBQ25CLG1CQUFpQkMsUUFBUSx1QkFBUixDQURFO0FBRW5CLFdBQVNBLFFBQVEsZUFBUixDQUZVO0FBR25CLGFBQVdBLFFBQVEsaUJBQVIsQ0FIUTtBQUluQixlQUFhQSxRQUFRLG1CQUFSLENBSk07QUFLbkIsa0JBQWdCQSxRQUFRLHNCQUFSLENBTEc7QUFNbkIsWUFBVUEsUUFBUSxnQkFBUixDQU5TO0FBT25CLHdCQUFzQkEsUUFBUSw0QkFBUixDQVBIO0FBUW5CLGdCQUFjQSxRQUFRLG9CQUFSLENBUks7QUFTbkIseUJBQXVCQSxRQUFRLDZCQUFSLENBVEo7QUFVbkIseUJBQXVCQSxRQUFRLDZCQUFSLENBVko7QUFXbkIsbUJBQWlCQSxRQUFRLHVCQUFSLENBWEU7QUFZbkIsZ0NBQThCQSxRQUFRLG9DQUFSLENBWlg7O0FBY25CLG9CQUFrQkEsUUFBUSx3QkFBUixDQWRDO0FBZW5CLGNBQVlBLFFBQVEsa0JBQVIsQ0FmTztBQWdCbkIsc0JBQW9CQSxRQUFRLDBCQUFSLENBaEJEO0FBaUJuQix5QkFBdUJBLFFBQVEsNkJBQVIsQ0FqQko7QUFrQm5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQWxCWDtBQW1CbkIsaUNBQStCQSxRQUFRLHFDQUFSLENBbkJaO0FBb0JuQix1QkFBcUJBLFFBQVEsMkJBQVIsQ0FwQkY7O0FBc0JuQixpQkFBZUEsUUFBUSxxQkFBUixDQXRCSTtBQXVCbkIsWUFBVUEsUUFBUSxnQkFBUixDQXZCUztBQXdCbkIsbUJBQWlCQSxRQUFRLHVCQUFSLENBeEJFO0FBeUJuQixXQUFTQSxRQUFRLGVBQVIsQ0F6QlU7QUEwQm5CLHNCQUFvQkEsUUFBUSwwQkFBUixDQTFCRDtBQTJCbkIsZ0NBQThCQSxRQUFRLG9DQUFSLENBM0JYO0FBNEJuQixzQkFBb0JBLFFBQVEsMEJBQVIsQ0E1QkQ7QUE2Qm5CLHVCQUFxQkEsUUFBUSwyQkFBUixDQTdCRjtBQThCbkIsOEJBQTRCQSxRQUFRLGtDQUFSLENBOUJUO0FBK0JuQixXQUFTQSxRQUFRLGVBQVIsQ0EvQlU7QUFnQ25CLDBCQUF3QkEsUUFBUSw4QkFBUixDQWhDTDtBQWlDbkIsMkJBQXlCQSxRQUFRLCtCQUFSLENBakNOO0FBa0NuQix1QkFBcUJBLFFBQVEsMkJBQVIsQ0FsQ0Y7QUFtQ25CLHFCQUFtQkEsUUFBUSx5QkFBUixDQW5DQTtBQW9DbkIsd0JBQXNCQSxRQUFRLDRCQUFSLENBcENIO0FBcUNuQixpQkFBZUEsUUFBUSxxQkFBUixDQXJDSTtBQXNDbkIsMEJBQXdCQSxRQUFRLDhCQUFSLENBdENMO0FBdUNuQiw4QkFBNEJBLFFBQVEsa0NBQVIsQ0F2Q1Q7QUF3Q25CLDhCQUE0QkEsUUFBUSxrQ0FBUixDQXhDVDs7QUEwQ25CO0FBQ0Esa0JBQWdCQSxRQUFRLHNCQUFSLENBM0NHOztBQTZDbkI7QUFDQSxtQkFBaUJBLFFBQVEsdUJBQVIsQ0E5Q0U7O0FBZ0RuQjtBQUNBLG1CQUFpQkEsUUFBUSx1QkFBUjtBQWpERSxDQUFkOztBQW9EQSxNQUFNQyw0QkFBVTtBQUNyQixpQkFBZUQsUUFBUSx1QkFBUixDQURNOztBQUdyQixZQUFVQSxRQUFRLGtCQUFSLENBSFc7QUFJckIsY0FBWUEsUUFBUSxvQkFBUixDQUpTOztBQU1yQjtBQUNBLGFBQVdBLFFBQVEsbUJBQVIsQ0FQVTs7QUFTckI7QUFDQSxXQUFTQSxRQUFRLGlCQUFSLENBVlk7QUFXckIsa0JBQWdCQSxRQUFRLHdCQUFSLENBWEs7QUFZckIsY0FBWUEsUUFBUSxvQkFBUixDQVpTO0FBYXJCLGdCQUFjQSxRQUFRLHNCQUFSO0FBYk8sQ0FBaEIiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgcnVsZXMgPSB7XG4gICduby11bnJlc29sdmVkJzogcmVxdWlyZSgnLi9ydWxlcy9uby11bnJlc29sdmVkJyksXG4gICduYW1lZCc6IHJlcXVpcmUoJy4vcnVsZXMvbmFtZWQnKSxcbiAgJ2RlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL2RlZmF1bHQnKSxcbiAgJ25hbWVzcGFjZSc6IHJlcXVpcmUoJy4vcnVsZXMvbmFtZXNwYWNlJyksXG4gICduby1uYW1lc3BhY2UnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVzcGFjZScpLFxuICAnZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9leHBvcnQnKSxcbiAgJ25vLW11dGFibGUtZXhwb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbXV0YWJsZS1leHBvcnRzJyksXG4gICdleHRlbnNpb25zJzogcmVxdWlyZSgnLi9ydWxlcy9leHRlbnNpb25zJyksXG4gICduby1yZXN0cmljdGVkLXBhdGhzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1yZXN0cmljdGVkLXBhdGhzJyksXG4gICduby1pbnRlcm5hbC1tb2R1bGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1pbnRlcm5hbC1tb2R1bGVzJyksXG4gICdncm91cC1leHBvcnRzJzogcmVxdWlyZSgnLi9ydWxlcy9ncm91cC1leHBvcnRzJyksXG4gICduby1yZWxhdGl2ZS1wYXJlbnQtaW1wb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tcmVsYXRpdmUtcGFyZW50LWltcG9ydHMnKSxcblxuICAnbm8tc2VsZi1pbXBvcnQnOiByZXF1aXJlKCcuL3J1bGVzL25vLXNlbGYtaW1wb3J0JyksXG4gICduby1jeWNsZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY3ljbGUnKSxcbiAgJ25vLW5hbWVkLWRlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVkLWRlZmF1bHQnKSxcbiAgJ25vLW5hbWVkLWFzLWRlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVkLWFzLWRlZmF1bHQnKSxcbiAgJ25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyJzogcmVxdWlyZSgnLi9ydWxlcy9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlcicpLFxuICAnbm8tYW5vbnltb3VzLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1hbm9ueW1vdXMtZGVmYXVsdC1leHBvcnQnKSxcbiAgJ25vLXVudXNlZC1tb2R1bGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby11bnVzZWQtbW9kdWxlcycpLFxuXG4gICduby1jb21tb25qcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY29tbW9uanMnKSxcbiAgJ25vLWFtZCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tYW1kJyksXG4gICduby1kdXBsaWNhdGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1kdXBsaWNhdGVzJyksXG4gICdmaXJzdCc6IHJlcXVpcmUoJy4vcnVsZXMvZmlyc3QnKSxcbiAgJ21heC1kZXBlbmRlbmNpZXMnOiByZXF1aXJlKCcuL3J1bGVzL21heC1kZXBlbmRlbmNpZXMnKSxcbiAgJ25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcycpLFxuICAnbm8tYWJzb2x1dGUtcGF0aCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tYWJzb2x1dGUtcGF0aCcpLFxuICAnbm8tbm9kZWpzLW1vZHVsZXMnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5vZGVqcy1tb2R1bGVzJyksXG4gICduby13ZWJwYWNrLWxvYWRlci1zeW50YXgnOiByZXF1aXJlKCcuL3J1bGVzL25vLXdlYnBhY2stbG9hZGVyLXN5bnRheCcpLFxuICAnb3JkZXInOiByZXF1aXJlKCcuL3J1bGVzL29yZGVyJyksXG4gICduZXdsaW5lLWFmdGVyLWltcG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvbmV3bGluZS1hZnRlci1pbXBvcnQnKSxcbiAgJ3ByZWZlci1kZWZhdWx0LWV4cG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvcHJlZmVyLWRlZmF1bHQtZXhwb3J0JyksXG4gICduby1kZWZhdWx0LWV4cG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZGVmYXVsdC1leHBvcnQnKSxcbiAgJ25vLW5hbWVkLWV4cG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbmFtZWQtZXhwb3J0JyksXG4gICduby1keW5hbWljLXJlcXVpcmUnOiByZXF1aXJlKCcuL3J1bGVzL25vLWR5bmFtaWMtcmVxdWlyZScpLFxuICAndW5hbWJpZ3VvdXMnOiByZXF1aXJlKCcuL3J1bGVzL3VuYW1iaWd1b3VzJyksXG4gICduby11bmFzc2lnbmVkLWltcG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tdW5hc3NpZ25lZC1pbXBvcnQnKSxcbiAgJ25vLXVzZWxlc3MtcGF0aC1zZWdtZW50cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tdXNlbGVzcy1wYXRoLXNlZ21lbnRzJyksXG4gICdkeW5hbWljLWltcG9ydC1jaHVua25hbWUnOiByZXF1aXJlKCcuL3J1bGVzL2R5bmFtaWMtaW1wb3J0LWNodW5rbmFtZScpLFxuXG4gIC8vIGV4cG9ydFxuICAnZXhwb3J0cy1sYXN0JzogcmVxdWlyZSgnLi9ydWxlcy9leHBvcnRzLWxhc3QnKSxcblxuICAvLyBtZXRhZGF0YS1iYXNlZFxuICAnbm8tZGVwcmVjYXRlZCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZGVwcmVjYXRlZCcpLFxuXG4gIC8vIGRlcHJlY2F0ZWQgYWxpYXNlcyB0byBydWxlc1xuICAnaW1wb3J0cy1maXJzdCc6IHJlcXVpcmUoJy4vcnVsZXMvaW1wb3J0cy1maXJzdCcpLFxufVxuXG5leHBvcnQgY29uc3QgY29uZmlncyA9IHtcbiAgJ3JlY29tbWVuZGVkJzogcmVxdWlyZSgnLi4vY29uZmlnL3JlY29tbWVuZGVkJyksXG5cbiAgJ2Vycm9ycyc6IHJlcXVpcmUoJy4uL2NvbmZpZy9lcnJvcnMnKSxcbiAgJ3dhcm5pbmdzJzogcmVxdWlyZSgnLi4vY29uZmlnL3dhcm5pbmdzJyksXG5cbiAgLy8gc2hoaGguLi4gd29yayBpbiBwcm9ncmVzcyBcInNlY3JldFwiIHJ1bGVzXG4gICdzdGFnZS0wJzogcmVxdWlyZSgnLi4vY29uZmlnL3N0YWdlLTAnKSxcblxuICAvLyB1c2VmdWwgc3R1ZmYgZm9yIGZvbGtzIHVzaW5nIHZhcmlvdXMgZW52aXJvbm1lbnRzXG4gICdyZWFjdCc6IHJlcXVpcmUoJy4uL2NvbmZpZy9yZWFjdCcpLFxuICAncmVhY3QtbmF0aXZlJzogcmVxdWlyZSgnLi4vY29uZmlnL3JlYWN0LW5hdGl2ZScpLFxuICAnZWxlY3Ryb24nOiByZXF1aXJlKCcuLi9jb25maWcvZWxlY3Ryb24nKSxcbiAgJ3R5cGVzY3JpcHQnOiByZXF1aXJlKCcuLi9jb25maWcvdHlwZXNjcmlwdCcpLFxufVxuIl19
\ No newline at end of file
+  'typescript': require('../config/typescript') };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJydWxlcyIsInJlcXVpcmUiLCJjb25maWdzIl0sIm1hcHBpbmdzIjoiMkVBQU8sTUFBTUEsd0JBQVE7QUFDbkIsbUJBQWlCQyxRQUFRLHVCQUFSLENBREU7QUFFbkIsV0FBU0EsUUFBUSxlQUFSLENBRlU7QUFHbkIsYUFBV0EsUUFBUSxpQkFBUixDQUhRO0FBSW5CLGVBQWFBLFFBQVEsbUJBQVIsQ0FKTTtBQUtuQixrQkFBZ0JBLFFBQVEsc0JBQVIsQ0FMRztBQU1uQixZQUFVQSxRQUFRLGdCQUFSLENBTlM7QUFPbkIsd0JBQXNCQSxRQUFRLDRCQUFSLENBUEg7QUFRbkIsZ0JBQWNBLFFBQVEsb0JBQVIsQ0FSSztBQVNuQix5QkFBdUJBLFFBQVEsNkJBQVIsQ0FUSjtBQVVuQix5QkFBdUJBLFFBQVEsNkJBQVIsQ0FWSjtBQVduQixtQkFBaUJBLFFBQVEsdUJBQVIsQ0FYRTtBQVluQixnQ0FBOEJBLFFBQVEsb0NBQVIsQ0FaWDs7QUFjbkIsb0JBQWtCQSxRQUFRLHdCQUFSLENBZEM7QUFlbkIsY0FBWUEsUUFBUSxrQkFBUixDQWZPO0FBZ0JuQixzQkFBb0JBLFFBQVEsMEJBQVIsQ0FoQkQ7QUFpQm5CLHlCQUF1QkEsUUFBUSw2QkFBUixDQWpCSjtBQWtCbkIsZ0NBQThCQSxRQUFRLG9DQUFSLENBbEJYO0FBbUJuQixpQ0FBK0JBLFFBQVEscUNBQVIsQ0FuQlo7QUFvQm5CLHVCQUFxQkEsUUFBUSwyQkFBUixDQXBCRjs7QUFzQm5CLGlCQUFlQSxRQUFRLHFCQUFSLENBdEJJO0FBdUJuQixZQUFVQSxRQUFRLGdCQUFSLENBdkJTO0FBd0JuQixtQkFBaUJBLFFBQVEsdUJBQVIsQ0F4QkU7QUF5Qm5CLFdBQVNBLFFBQVEsZUFBUixDQXpCVTtBQTBCbkIsc0JBQW9CQSxRQUFRLDBCQUFSLENBMUJEO0FBMkJuQixnQ0FBOEJBLFFBQVEsb0NBQVIsQ0EzQlg7QUE0Qm5CLHNCQUFvQkEsUUFBUSwwQkFBUixDQTVCRDtBQTZCbkIsdUJBQXFCQSxRQUFRLDJCQUFSLENBN0JGO0FBOEJuQiw4QkFBNEJBLFFBQVEsa0NBQVIsQ0E5QlQ7QUErQm5CLFdBQVNBLFFBQVEsZUFBUixDQS9CVTtBQWdDbkIsMEJBQXdCQSxRQUFRLDhCQUFSLENBaENMO0FBaUNuQiwyQkFBeUJBLFFBQVEsK0JBQVIsQ0FqQ047QUFrQ25CLHVCQUFxQkEsUUFBUSwyQkFBUixDQWxDRjtBQW1DbkIscUJBQW1CQSxRQUFRLHlCQUFSLENBbkNBO0FBb0NuQix3QkFBc0JBLFFBQVEsNEJBQVIsQ0FwQ0g7QUFxQ25CLGlCQUFlQSxRQUFRLHFCQUFSLENBckNJO0FBc0NuQiwwQkFBd0JBLFFBQVEsOEJBQVIsQ0F0Q0w7QUF1Q25CLDhCQUE0QkEsUUFBUSxrQ0FBUixDQXZDVDtBQXdDbkIsOEJBQTRCQSxRQUFRLGtDQUFSLENBeENUOztBQTBDbkI7QUFDQSxrQkFBZ0JBLFFBQVEsc0JBQVIsQ0EzQ0c7O0FBNkNuQjtBQUNBLG1CQUFpQkEsUUFBUSx1QkFBUixDQTlDRTs7QUFnRG5CO0FBQ0EsbUJBQWlCQSxRQUFRLHVCQUFSLENBakRFLEVBQWQ7OztBQW9EQSxNQUFNQyw0QkFBVTtBQUNyQixpQkFBZUQsUUFBUSx1QkFBUixDQURNOztBQUdyQixZQUFVQSxRQUFRLGtCQUFSLENBSFc7QUFJckIsY0FBWUEsUUFBUSxvQkFBUixDQUpTOztBQU1yQjtBQUNBLGFBQVdBLFFBQVEsbUJBQVIsQ0FQVTs7QUFTckI7QUFDQSxXQUFTQSxRQUFRLGlCQUFSLENBVlk7QUFXckIsa0JBQWdCQSxRQUFRLHdCQUFSLENBWEs7QUFZckIsY0FBWUEsUUFBUSxvQkFBUixDQVpTO0FBYXJCLGdCQUFjQSxRQUFRLHNCQUFSLENBYk8sRUFBaEIiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgcnVsZXMgPSB7XG4gICduby11bnJlc29sdmVkJzogcmVxdWlyZSgnLi9ydWxlcy9uby11bnJlc29sdmVkJyksXG4gICduYW1lZCc6IHJlcXVpcmUoJy4vcnVsZXMvbmFtZWQnKSxcbiAgJ2RlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL2RlZmF1bHQnKSxcbiAgJ25hbWVzcGFjZSc6IHJlcXVpcmUoJy4vcnVsZXMvbmFtZXNwYWNlJyksXG4gICduby1uYW1lc3BhY2UnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVzcGFjZScpLFxuICAnZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9leHBvcnQnKSxcbiAgJ25vLW11dGFibGUtZXhwb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbXV0YWJsZS1leHBvcnRzJyksXG4gICdleHRlbnNpb25zJzogcmVxdWlyZSgnLi9ydWxlcy9leHRlbnNpb25zJyksXG4gICduby1yZXN0cmljdGVkLXBhdGhzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1yZXN0cmljdGVkLXBhdGhzJyksXG4gICduby1pbnRlcm5hbC1tb2R1bGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1pbnRlcm5hbC1tb2R1bGVzJyksXG4gICdncm91cC1leHBvcnRzJzogcmVxdWlyZSgnLi9ydWxlcy9ncm91cC1leHBvcnRzJyksXG4gICduby1yZWxhdGl2ZS1wYXJlbnQtaW1wb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tcmVsYXRpdmUtcGFyZW50LWltcG9ydHMnKSxcblxuICAnbm8tc2VsZi1pbXBvcnQnOiByZXF1aXJlKCcuL3J1bGVzL25vLXNlbGYtaW1wb3J0JyksXG4gICduby1jeWNsZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY3ljbGUnKSxcbiAgJ25vLW5hbWVkLWRlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVkLWRlZmF1bHQnKSxcbiAgJ25vLW5hbWVkLWFzLWRlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVkLWFzLWRlZmF1bHQnKSxcbiAgJ25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyJzogcmVxdWlyZSgnLi9ydWxlcy9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlcicpLFxuICAnbm8tYW5vbnltb3VzLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1hbm9ueW1vdXMtZGVmYXVsdC1leHBvcnQnKSxcbiAgJ25vLXVudXNlZC1tb2R1bGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby11bnVzZWQtbW9kdWxlcycpLFxuXG4gICduby1jb21tb25qcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY29tbW9uanMnKSxcbiAgJ25vLWFtZCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tYW1kJyksXG4gICduby1kdXBsaWNhdGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1kdXBsaWNhdGVzJyksXG4gICdmaXJzdCc6IHJlcXVpcmUoJy4vcnVsZXMvZmlyc3QnKSxcbiAgJ21heC1kZXBlbmRlbmNpZXMnOiByZXF1aXJlKCcuL3J1bGVzL21heC1kZXBlbmRlbmNpZXMnKSxcbiAgJ25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcycpLFxuICAnbm8tYWJzb2x1dGUtcGF0aCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tYWJzb2x1dGUtcGF0aCcpLFxuICAnbm8tbm9kZWpzLW1vZHVsZXMnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5vZGVqcy1tb2R1bGVzJyksXG4gICduby13ZWJwYWNrLWxvYWRlci1zeW50YXgnOiByZXF1aXJlKCcuL3J1bGVzL25vLXdlYnBhY2stbG9hZGVyLXN5bnRheCcpLFxuICAnb3JkZXInOiByZXF1aXJlKCcuL3J1bGVzL29yZGVyJyksXG4gICduZXdsaW5lLWFmdGVyLWltcG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvbmV3bGluZS1hZnRlci1pbXBvcnQnKSxcbiAgJ3ByZWZlci1kZWZhdWx0LWV4cG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvcHJlZmVyLWRlZmF1bHQtZXhwb3J0JyksXG4gICduby1kZWZhdWx0LWV4cG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZGVmYXVsdC1leHBvcnQnKSxcbiAgJ25vLW5hbWVkLWV4cG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbmFtZWQtZXhwb3J0JyksXG4gICduby1keW5hbWljLXJlcXVpcmUnOiByZXF1aXJlKCcuL3J1bGVzL25vLWR5bmFtaWMtcmVxdWlyZScpLFxuICAndW5hbWJpZ3VvdXMnOiByZXF1aXJlKCcuL3J1bGVzL3VuYW1iaWd1b3VzJyksXG4gICduby11bmFzc2lnbmVkLWltcG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tdW5hc3NpZ25lZC1pbXBvcnQnKSxcbiAgJ25vLXVzZWxlc3MtcGF0aC1zZWdtZW50cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tdXNlbGVzcy1wYXRoLXNlZ21lbnRzJyksXG4gICdkeW5hbWljLWltcG9ydC1jaHVua25hbWUnOiByZXF1aXJlKCcuL3J1bGVzL2R5bmFtaWMtaW1wb3J0LWNodW5rbmFtZScpLFxuXG4gIC8vIGV4cG9ydFxuICAnZXhwb3J0cy1sYXN0JzogcmVxdWlyZSgnLi9ydWxlcy9leHBvcnRzLWxhc3QnKSxcblxuICAvLyBtZXRhZGF0YS1iYXNlZFxuICAnbm8tZGVwcmVjYXRlZCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZGVwcmVjYXRlZCcpLFxuXG4gIC8vIGRlcHJlY2F0ZWQgYWxpYXNlcyB0byBydWxlc1xuICAnaW1wb3J0cy1maXJzdCc6IHJlcXVpcmUoJy4vcnVsZXMvaW1wb3J0cy1maXJzdCcpLFxufVxuXG5leHBvcnQgY29uc3QgY29uZmlncyA9IHtcbiAgJ3JlY29tbWVuZGVkJzogcmVxdWlyZSgnLi4vY29uZmlnL3JlY29tbWVuZGVkJyksXG5cbiAgJ2Vycm9ycyc6IHJlcXVpcmUoJy4uL2NvbmZpZy9lcnJvcnMnKSxcbiAgJ3dhcm5pbmdzJzogcmVxdWlyZSgnLi4vY29uZmlnL3dhcm5pbmdzJyksXG5cbiAgLy8gc2hoaGguLi4gd29yayBpbiBwcm9ncmVzcyBcInNlY3JldFwiIHJ1bGVzXG4gICdzdGFnZS0wJzogcmVxdWlyZSgnLi4vY29uZmlnL3N0YWdlLTAnKSxcblxuICAvLyB1c2VmdWwgc3R1ZmYgZm9yIGZvbGtzIHVzaW5nIHZhcmlvdXMgZW52aXJvbm1lbnRzXG4gICdyZWFjdCc6IHJlcXVpcmUoJy4uL2NvbmZpZy9yZWFjdCcpLFxuICAncmVhY3QtbmF0aXZlJzogcmVxdWlyZSgnLi4vY29uZmlnL3JlYWN0LW5hdGl2ZScpLFxuICAnZWxlY3Ryb24nOiByZXF1aXJlKCcuLi9jb25maWcvZWxlY3Ryb24nKSxcbiAgJ3R5cGVzY3JpcHQnOiByZXF1aXJlKCcuLi9jb25maWcvdHlwZXNjcmlwdCcpLFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/default.js b/node_modules/eslint-plugin-import/lib/rules/default.js
index 2e69fce..933538a 100644
--- a/node_modules/eslint-plugin-import/lib/rules/default.js
+++ b/node_modules/eslint-plugin-import/lib/rules/default.js
@@ -1,29 +1,22 @@
-'use strict';
-
-var _ExportMap = require('../ExportMap');
-
-var _ExportMap2 = _interopRequireDefault(_ExportMap);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _ExportMap = require('../ExportMap');var _ExportMap2 = _interopRequireDefault(_ExportMap);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'problem',
     docs: {
-      url: (0, _docsUrl2.default)('default')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('default') },
+
+    schema: [] },
+
 
   create: function (context) {
 
     function checkDefault(specifierType, node) {
 
-      const defaultSpecifier = node.specifiers.find(specifier => specifier.type === specifierType);
+      const defaultSpecifier = node.specifiers.find(
+      specifier => specifier.type === specifierType);
+
 
       if (!defaultSpecifier) return;
       var imports = _ExportMap2.default.get(node.source.value, context);
@@ -34,15 +27,14 @@
       } else if (imports.get('default') === undefined) {
         context.report({
           node: defaultSpecifier,
-          message: `No default export found in imported module "${node.source.value}".`
-        });
+          message: `No default export found in imported module "${node.source.value}".` });
+
       }
     }
 
     return {
       'ImportDeclaration': checkDefault.bind(null, 'ImportDefaultSpecifier'),
-      'ExportNamedDeclaration': checkDefault.bind(null, 'ExportDefaultSpecifier')
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9kZWZhdWx0LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0IiwiY2hlY2tEZWZhdWx0Iiwic3BlY2lmaWVyVHlwZSIsIm5vZGUiLCJkZWZhdWx0U3BlY2lmaWVyIiwic3BlY2lmaWVycyIsImZpbmQiLCJzcGVjaWZpZXIiLCJpbXBvcnRzIiwiRXhwb3J0cyIsImdldCIsInNvdXJjZSIsInZhbHVlIiwiZXJyb3JzIiwibGVuZ3RoIiwicmVwb3J0RXJyb3JzIiwidW5kZWZpbmVkIiwicmVwb3J0IiwibWVzc2FnZSIsImJpbmQiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFDQTs7Ozs7O0FBRUFBLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFNBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLFNBQVI7QUFERCxLQUZGO0FBS0pDLFlBQVE7QUFMSixHQURTOztBQVNmQyxVQUFRLFVBQVVDLE9BQVYsRUFBbUI7O0FBRXpCLGFBQVNDLFlBQVQsQ0FBc0JDLGFBQXRCLEVBQXFDQyxJQUFyQyxFQUEyQzs7QUFFekMsWUFBTUMsbUJBQW1CRCxLQUFLRSxVQUFMLENBQWdCQyxJQUFoQixDQUN2QkMsYUFBYUEsVUFBVVosSUFBVixLQUFtQk8sYUFEVCxDQUF6Qjs7QUFJQSxVQUFJLENBQUNFLGdCQUFMLEVBQXVCO0FBQ3ZCLFVBQUlJLFVBQVVDLG9CQUFRQyxHQUFSLENBQVlQLEtBQUtRLE1BQUwsQ0FBWUMsS0FBeEIsRUFBK0JaLE9BQS9CLENBQWQ7QUFDQSxVQUFJUSxXQUFXLElBQWYsRUFBcUI7O0FBRXJCLFVBQUlBLFFBQVFLLE1BQVIsQ0FBZUMsTUFBbkIsRUFBMkI7QUFDekJOLGdCQUFRTyxZQUFSLENBQXFCZixPQUFyQixFQUE4QkcsSUFBOUI7QUFDRCxPQUZELE1BRU8sSUFBSUssUUFBUUUsR0FBUixDQUFZLFNBQVosTUFBMkJNLFNBQS9CLEVBQTBDO0FBQy9DaEIsZ0JBQVFpQixNQUFSLENBQWU7QUFDYmQsZ0JBQU1DLGdCQURPO0FBRWJjLG1CQUFVLCtDQUE4Q2YsS0FBS1EsTUFBTCxDQUFZQyxLQUFNO0FBRjdELFNBQWY7QUFJRDtBQUNGOztBQUVELFdBQU87QUFDTCwyQkFBcUJYLGFBQWFrQixJQUFiLENBQWtCLElBQWxCLEVBQXdCLHdCQUF4QixDQURoQjtBQUVMLGdDQUEwQmxCLGFBQWFrQixJQUFiLENBQWtCLElBQWxCLEVBQXdCLHdCQUF4QjtBQUZyQixLQUFQO0FBSUQ7QUFuQ2MsQ0FBakIiLCJmaWxlIjoiZGVmYXVsdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFeHBvcnRzIGZyb20gJy4uL0V4cG9ydE1hcCdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3Byb2JsZW0nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnZGVmYXVsdCcpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cbiAgICBmdW5jdGlvbiBjaGVja0RlZmF1bHQoc3BlY2lmaWVyVHlwZSwgbm9kZSkge1xuXG4gICAgICBjb25zdCBkZWZhdWx0U3BlY2lmaWVyID0gbm9kZS5zcGVjaWZpZXJzLmZpbmQoXG4gICAgICAgIHNwZWNpZmllciA9PiBzcGVjaWZpZXIudHlwZSA9PT0gc3BlY2lmaWVyVHlwZVxuICAgICAgKVxuXG4gICAgICBpZiAoIWRlZmF1bHRTcGVjaWZpZXIpIHJldHVyblxuICAgICAgdmFyIGltcG9ydHMgPSBFeHBvcnRzLmdldChub2RlLnNvdXJjZS52YWx1ZSwgY29udGV4dClcbiAgICAgIGlmIChpbXBvcnRzID09IG51bGwpIHJldHVyblxuXG4gICAgICBpZiAoaW1wb3J0cy5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGltcG9ydHMucmVwb3J0RXJyb3JzKGNvbnRleHQsIG5vZGUpXG4gICAgICB9IGVsc2UgaWYgKGltcG9ydHMuZ2V0KCdkZWZhdWx0JykgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZTogZGVmYXVsdFNwZWNpZmllcixcbiAgICAgICAgICBtZXNzYWdlOiBgTm8gZGVmYXVsdCBleHBvcnQgZm91bmQgaW4gaW1wb3J0ZWQgbW9kdWxlIFwiJHtub2RlLnNvdXJjZS52YWx1ZX1cIi5gLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAnSW1wb3J0RGVjbGFyYXRpb24nOiBjaGVja0RlZmF1bHQuYmluZChudWxsLCAnSW1wb3J0RGVmYXVsdFNwZWNpZmllcicpLFxuICAgICAgJ0V4cG9ydE5hbWVkRGVjbGFyYXRpb24nOiBjaGVja0RlZmF1bHQuYmluZChudWxsLCAnRXhwb3J0RGVmYXVsdFNwZWNpZmllcicpLFxuICAgIH1cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
+      'ExportNamedDeclaration': checkDefault.bind(null, 'ExportDefaultSpecifier') };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9kZWZhdWx0LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0IiwiY2hlY2tEZWZhdWx0Iiwic3BlY2lmaWVyVHlwZSIsIm5vZGUiLCJkZWZhdWx0U3BlY2lmaWVyIiwic3BlY2lmaWVycyIsImZpbmQiLCJzcGVjaWZpZXIiLCJpbXBvcnRzIiwiRXhwb3J0cyIsImdldCIsInNvdXJjZSIsInZhbHVlIiwiZXJyb3JzIiwibGVuZ3RoIiwicmVwb3J0RXJyb3JzIiwidW5kZWZpbmVkIiwicmVwb3J0IiwibWVzc2FnZSIsImJpbmQiXSwibWFwcGluZ3MiOiJhQUFBLHlDO0FBQ0EscUM7O0FBRUFBLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFNBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLFNBQVIsQ0FERCxFQUZGOztBQUtKQyxZQUFRLEVBTEosRUFEUzs7O0FBU2ZDLFVBQVEsVUFBVUMsT0FBVixFQUFtQjs7QUFFekIsYUFBU0MsWUFBVCxDQUFzQkMsYUFBdEIsRUFBcUNDLElBQXJDLEVBQTJDOztBQUV6QyxZQUFNQyxtQkFBbUJELEtBQUtFLFVBQUwsQ0FBZ0JDLElBQWhCO0FBQ3ZCQyxtQkFBYUEsVUFBVVosSUFBVixLQUFtQk8sYUFEVCxDQUF6Qjs7O0FBSUEsVUFBSSxDQUFDRSxnQkFBTCxFQUF1QjtBQUN2QixVQUFJSSxVQUFVQyxvQkFBUUMsR0FBUixDQUFZUCxLQUFLUSxNQUFMLENBQVlDLEtBQXhCLEVBQStCWixPQUEvQixDQUFkO0FBQ0EsVUFBSVEsV0FBVyxJQUFmLEVBQXFCOztBQUVyQixVQUFJQSxRQUFRSyxNQUFSLENBQWVDLE1BQW5CLEVBQTJCO0FBQ3pCTixnQkFBUU8sWUFBUixDQUFxQmYsT0FBckIsRUFBOEJHLElBQTlCO0FBQ0QsT0FGRCxNQUVPLElBQUlLLFFBQVFFLEdBQVIsQ0FBWSxTQUFaLE1BQTJCTSxTQUEvQixFQUEwQztBQUMvQ2hCLGdCQUFRaUIsTUFBUixDQUFlO0FBQ2JkLGdCQUFNQyxnQkFETztBQUViYyxtQkFBVSwrQ0FBOENmLEtBQUtRLE1BQUwsQ0FBWUMsS0FBTSxJQUY3RCxFQUFmOztBQUlEO0FBQ0Y7O0FBRUQsV0FBTztBQUNMLDJCQUFxQlgsYUFBYWtCLElBQWIsQ0FBa0IsSUFBbEIsRUFBd0Isd0JBQXhCLENBRGhCO0FBRUwsZ0NBQTBCbEIsYUFBYWtCLElBQWIsQ0FBa0IsSUFBbEIsRUFBd0Isd0JBQXhCLENBRnJCLEVBQVA7O0FBSUQsR0FuQ2MsRUFBakIiLCJmaWxlIjoiZGVmYXVsdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFeHBvcnRzIGZyb20gJy4uL0V4cG9ydE1hcCdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3Byb2JsZW0nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnZGVmYXVsdCcpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cbiAgICBmdW5jdGlvbiBjaGVja0RlZmF1bHQoc3BlY2lmaWVyVHlwZSwgbm9kZSkge1xuXG4gICAgICBjb25zdCBkZWZhdWx0U3BlY2lmaWVyID0gbm9kZS5zcGVjaWZpZXJzLmZpbmQoXG4gICAgICAgIHNwZWNpZmllciA9PiBzcGVjaWZpZXIudHlwZSA9PT0gc3BlY2lmaWVyVHlwZVxuICAgICAgKVxuXG4gICAgICBpZiAoIWRlZmF1bHRTcGVjaWZpZXIpIHJldHVyblxuICAgICAgdmFyIGltcG9ydHMgPSBFeHBvcnRzLmdldChub2RlLnNvdXJjZS52YWx1ZSwgY29udGV4dClcbiAgICAgIGlmIChpbXBvcnRzID09IG51bGwpIHJldHVyblxuXG4gICAgICBpZiAoaW1wb3J0cy5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGltcG9ydHMucmVwb3J0RXJyb3JzKGNvbnRleHQsIG5vZGUpXG4gICAgICB9IGVsc2UgaWYgKGltcG9ydHMuZ2V0KCdkZWZhdWx0JykgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZTogZGVmYXVsdFNwZWNpZmllcixcbiAgICAgICAgICBtZXNzYWdlOiBgTm8gZGVmYXVsdCBleHBvcnQgZm91bmQgaW4gaW1wb3J0ZWQgbW9kdWxlIFwiJHtub2RlLnNvdXJjZS52YWx1ZX1cIi5gLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAnSW1wb3J0RGVjbGFyYXRpb24nOiBjaGVja0RlZmF1bHQuYmluZChudWxsLCAnSW1wb3J0RGVmYXVsdFNwZWNpZmllcicpLFxuICAgICAgJ0V4cG9ydE5hbWVkRGVjbGFyYXRpb24nOiBjaGVja0RlZmF1bHQuYmluZChudWxsLCAnRXhwb3J0RGVmYXVsdFNwZWNpZmllcicpLFxuICAgIH1cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/dynamic-import-chunkname.js b/node_modules/eslint-plugin-import/lib/rules/dynamic-import-chunkname.js
index 605eb79..d3023ad 100644
--- a/node_modules/eslint-plugin-import/lib/rules/dynamic-import-chunkname.js
+++ b/node_modules/eslint-plugin-import/lib/rules/dynamic-import-chunkname.js
@@ -1,21 +1,12 @@
-'use strict';
-
-var _vm = require('vm');
-
-var _vm2 = _interopRequireDefault(_vm);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _vm = require('vm');var _vm2 = _interopRequireDefault(_vm);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('dynamic-import-chunkname')
-    },
+      url: (0, _docsUrl2.default)('dynamic-import-chunkname') },
+
     schema: [{
       type: 'object',
       properties: {
@@ -23,104 +14,106 @@
           type: 'array',
           uniqueItems: true,
           items: {
-            type: 'string'
-          }
-        },
+            type: 'string' } },
+
+
         webpackChunknameFormat: {
-          type: 'string'
-        }
-      }
-    }]
-  },
+          type: 'string' } } }] },
+
+
+
+
 
   create: function (context) {
-    const config = context.options[0];
-
-    var _ref = config || {},
-        _ref$importFunctions = _ref.importFunctions;
-
-    const importFunctions = _ref$importFunctions === undefined ? [] : _ref$importFunctions;
-
-    var _ref2 = config || {},
-        _ref2$webpackChunknam = _ref2.webpackChunknameFormat;
-
-    const webpackChunknameFormat = _ref2$webpackChunknam === undefined ? '[0-9a-zA-Z-_/.]+' : _ref2$webpackChunknam;
-
+    const config = context.options[0];var _ref =
+    config || {},_ref$importFunctions = _ref.importFunctions;const importFunctions = _ref$importFunctions === undefined ? [] : _ref$importFunctions;var _ref2 =
+    config || {},_ref2$webpackChunknam = _ref2.webpackChunknameFormat;const webpackChunknameFormat = _ref2$webpackChunknam === undefined ? '[0-9a-zA-Z-_/.]+' : _ref2$webpackChunknam;
 
     const paddedCommentRegex = /^ (\S[\s\S]+\S) $/;
-    const commentStyleRegex = /^( \w+: ("[^"]*"|\d+|false|true),?)+ $/;
-    const chunkSubstrFormat = ` webpackChunkName: "${webpackChunknameFormat}",? `;
+    const commentStyleRegex = /^( \w+: (["'][^"']*["']|\d+|false|true),?)+ $/;
+    const chunkSubstrFormat = ` webpackChunkName: ["']${webpackChunknameFormat}["'],? `;
     const chunkSubstrRegex = new RegExp(chunkSubstrFormat);
 
+    function run(node, arg) {
+      const sourceCode = context.getSourceCode();
+      const leadingComments = sourceCode.getCommentsBefore ?
+      sourceCode.getCommentsBefore(arg) // This method is available in ESLint >= 4.
+      : sourceCode.getComments(arg).leading; // This method is deprecated in ESLint 7.
+
+      if (!leadingComments || leadingComments.length === 0) {
+        context.report({
+          node,
+          message: 'dynamic imports require a leading comment with the webpack chunkname' });
+
+        return;
+      }
+
+      let isChunknamePresent = false;
+
+      for (const comment of leadingComments) {
+        if (comment.type !== 'Block') {
+          context.report({
+            node,
+            message: 'dynamic imports require a /* foo */ style comment, not a // foo comment' });
+
+          return;
+        }
+
+        if (!paddedCommentRegex.test(comment.value)) {
+          context.report({
+            node,
+            message: `dynamic imports require a block comment padded with spaces - /* foo */` });
+
+          return;
+        }
+
+        try {
+          // just like webpack itself does
+          _vm2.default.runInNewContext(`(function(){return {${comment.value}}})()`);
+        }
+        catch (error) {
+          context.report({
+            node,
+            message: `dynamic imports require a "webpack" comment with valid syntax` });
+
+          return;
+        }
+
+        if (!commentStyleRegex.test(comment.value)) {
+          context.report({
+            node,
+            message:
+            `dynamic imports require a leading comment in the form /*${chunkSubstrFormat}*/` });
+
+          return;
+        }
+
+        if (chunkSubstrRegex.test(comment.value)) {
+          isChunknamePresent = true;
+        }
+      }
+
+      if (!isChunknamePresent) {
+        context.report({
+          node,
+          message:
+          `dynamic imports require a leading comment in the form /*${chunkSubstrFormat}*/` });
+
+      }
+    }
+
     return {
+      ImportExpression(node) {
+        run(node, node.source);
+      },
+
       CallExpression(node) {
         if (node.callee.type !== 'Import' && importFunctions.indexOf(node.callee.name) < 0) {
           return;
         }
 
-        const sourceCode = context.getSourceCode();
-        const arg = node.arguments[0];
-        const leadingComments = sourceCode.getComments(arg).leading;
+        run(node, node.arguments[0]);
+      } };
 
-        if (!leadingComments || leadingComments.length === 0) {
-          context.report({
-            node,
-            message: 'dynamic imports require a leading comment with the webpack chunkname'
-          });
-          return;
-        }
-
-        let isChunknamePresent = false;
-
-        for (const comment of leadingComments) {
-          if (comment.type !== 'Block') {
-            context.report({
-              node,
-              message: 'dynamic imports require a /* foo */ style comment, not a // foo comment'
-            });
-            return;
-          }
-
-          if (!paddedCommentRegex.test(comment.value)) {
-            context.report({
-              node,
-              message: `dynamic imports require a block comment padded with spaces - /* foo */`
-            });
-            return;
-          }
-
-          try {
-            // just like webpack itself does
-            _vm2.default.runInNewContext(`(function(){return {${comment.value}}})()`);
-          } catch (error) {
-            context.report({
-              node,
-              message: `dynamic imports require a "webpack" comment with valid syntax`
-            });
-            return;
-          }
-
-          if (!commentStyleRegex.test(comment.value)) {
-            context.report({
-              node,
-              message: `dynamic imports require a leading comment in the form /*${chunkSubstrFormat}*/`
-            });
-            return;
-          }
-
-          if (chunkSubstrRegex.test(comment.value)) {
-            isChunknamePresent = true;
-          }
-        }
-
-        if (!isChunknamePresent) {
-          context.report({
-            node,
-            message: `dynamic imports require a leading comment in the form /*${chunkSubstrFormat}*/`
-          });
-        }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9keW5hbWljLWltcG9ydC1jaHVua25hbWUuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsInByb3BlcnRpZXMiLCJpbXBvcnRGdW5jdGlvbnMiLCJ1bmlxdWVJdGVtcyIsIml0ZW1zIiwid2VicGFja0NodW5rbmFtZUZvcm1hdCIsImNyZWF0ZSIsImNvbnRleHQiLCJjb25maWciLCJvcHRpb25zIiwicGFkZGVkQ29tbWVudFJlZ2V4IiwiY29tbWVudFN0eWxlUmVnZXgiLCJjaHVua1N1YnN0ckZvcm1hdCIsImNodW5rU3Vic3RyUmVnZXgiLCJSZWdFeHAiLCJDYWxsRXhwcmVzc2lvbiIsIm5vZGUiLCJjYWxsZWUiLCJpbmRleE9mIiwibmFtZSIsInNvdXJjZUNvZGUiLCJnZXRTb3VyY2VDb2RlIiwiYXJnIiwiYXJndW1lbnRzIiwibGVhZGluZ0NvbW1lbnRzIiwiZ2V0Q29tbWVudHMiLCJsZWFkaW5nIiwibGVuZ3RoIiwicmVwb3J0IiwibWVzc2FnZSIsImlzQ2h1bmtuYW1lUHJlc2VudCIsImNvbW1lbnQiLCJ0ZXN0IiwidmFsdWUiLCJ2bSIsInJ1bkluTmV3Q29udGV4dCIsImVycm9yIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7O0FBQ0E7Ozs7OztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxZQURGO0FBRUpDLFVBQU07QUFDSkMsV0FBSyx1QkFBUSwwQkFBUjtBQURELEtBRkY7QUFLSkMsWUFBUSxDQUFDO0FBQ1BILFlBQU0sUUFEQztBQUVQSSxrQkFBWTtBQUNWQyx5QkFBaUI7QUFDZkwsZ0JBQU0sT0FEUztBQUVmTSx1QkFBYSxJQUZFO0FBR2ZDLGlCQUFPO0FBQ0xQLGtCQUFNO0FBREQ7QUFIUSxTQURQO0FBUVZRLGdDQUF3QjtBQUN0QlIsZ0JBQU07QUFEZ0I7QUFSZDtBQUZMLEtBQUQ7QUFMSixHQURTOztBQXVCZlMsVUFBUSxVQUFVQyxPQUFWLEVBQW1CO0FBQ3pCLFVBQU1DLFNBQVNELFFBQVFFLE9BQVIsQ0FBZ0IsQ0FBaEIsQ0FBZjs7QUFEeUIsZUFFUUQsVUFBVSxFQUZsQjtBQUFBLG9DQUVqQk4sZUFGaUI7O0FBQUEsVUFFakJBLGVBRmlCLHdDQUVDLEVBRkQ7O0FBQUEsZ0JBRytCTSxVQUFVLEVBSHpDO0FBQUEsc0NBR2pCSCxzQkFIaUI7O0FBQUEsVUFHakJBLHNCQUhpQix5Q0FHUSxrQkFIUjs7O0FBS3pCLFVBQU1LLHFCQUFxQixtQkFBM0I7QUFDQSxVQUFNQyxvQkFBb0Isd0NBQTFCO0FBQ0EsVUFBTUMsb0JBQXFCLHVCQUFzQlAsc0JBQXVCLE1BQXhFO0FBQ0EsVUFBTVEsbUJBQW1CLElBQUlDLE1BQUosQ0FBV0YsaUJBQVgsQ0FBekI7O0FBRUEsV0FBTztBQUNMRyxxQkFBZUMsSUFBZixFQUFxQjtBQUNuQixZQUFJQSxLQUFLQyxNQUFMLENBQVlwQixJQUFaLEtBQXFCLFFBQXJCLElBQWlDSyxnQkFBZ0JnQixPQUFoQixDQUF3QkYsS0FBS0MsTUFBTCxDQUFZRSxJQUFwQyxJQUE0QyxDQUFqRixFQUFvRjtBQUNsRjtBQUNEOztBQUVELGNBQU1DLGFBQWFiLFFBQVFjLGFBQVIsRUFBbkI7QUFDQSxjQUFNQyxNQUFNTixLQUFLTyxTQUFMLENBQWUsQ0FBZixDQUFaO0FBQ0EsY0FBTUMsa0JBQWtCSixXQUFXSyxXQUFYLENBQXVCSCxHQUF2QixFQUE0QkksT0FBcEQ7O0FBRUEsWUFBSSxDQUFDRixlQUFELElBQW9CQSxnQkFBZ0JHLE1BQWhCLEtBQTJCLENBQW5ELEVBQXNEO0FBQ3BEcEIsa0JBQVFxQixNQUFSLENBQWU7QUFDYlosZ0JBRGE7QUFFYmEscUJBQVM7QUFGSSxXQUFmO0FBSUE7QUFDRDs7QUFFRCxZQUFJQyxxQkFBcUIsS0FBekI7O0FBRUEsYUFBSyxNQUFNQyxPQUFYLElBQXNCUCxlQUF0QixFQUF1QztBQUNyQyxjQUFJTyxRQUFRbEMsSUFBUixLQUFpQixPQUFyQixFQUE4QjtBQUM1QlUsb0JBQVFxQixNQUFSLENBQWU7QUFDYlosa0JBRGE7QUFFYmEsdUJBQVM7QUFGSSxhQUFmO0FBSUE7QUFDRDs7QUFFRCxjQUFJLENBQUNuQixtQkFBbUJzQixJQUFuQixDQUF3QkQsUUFBUUUsS0FBaEMsQ0FBTCxFQUE2QztBQUMzQzFCLG9CQUFRcUIsTUFBUixDQUFlO0FBQ2JaLGtCQURhO0FBRWJhLHVCQUFVO0FBRkcsYUFBZjtBQUlBO0FBQ0Q7O0FBRUQsY0FBSTtBQUNGO0FBQ0FLLHlCQUFHQyxlQUFILENBQW9CLHVCQUFzQkosUUFBUUUsS0FBTSxPQUF4RDtBQUNELFdBSEQsQ0FJQSxPQUFPRyxLQUFQLEVBQWM7QUFDWjdCLG9CQUFRcUIsTUFBUixDQUFlO0FBQ2JaLGtCQURhO0FBRWJhLHVCQUFVO0FBRkcsYUFBZjtBQUlBO0FBQ0Q7O0FBRUQsY0FBSSxDQUFDbEIsa0JBQWtCcUIsSUFBbEIsQ0FBdUJELFFBQVFFLEtBQS9CLENBQUwsRUFBNEM7QUFDMUMxQixvQkFBUXFCLE1BQVIsQ0FBZTtBQUNiWixrQkFEYTtBQUViYSx1QkFDRywyREFBMERqQixpQkFBa0I7QUFIbEUsYUFBZjtBQUtBO0FBQ0Q7O0FBRUQsY0FBSUMsaUJBQWlCbUIsSUFBakIsQ0FBc0JELFFBQVFFLEtBQTlCLENBQUosRUFBMEM7QUFDeENILGlDQUFxQixJQUFyQjtBQUNEO0FBQ0Y7O0FBRUQsWUFBSSxDQUFDQSxrQkFBTCxFQUF5QjtBQUN2QnZCLGtCQUFRcUIsTUFBUixDQUFlO0FBQ2JaLGdCQURhO0FBRWJhLHFCQUNHLDJEQUEwRGpCLGlCQUFrQjtBQUhsRSxXQUFmO0FBS0Q7QUFDRjtBQXRFSSxLQUFQO0FBd0VEO0FBekdjLENBQWpCIiwiZmlsZSI6ImR5bmFtaWMtaW1wb3J0LWNodW5rbmFtZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB2bSBmcm9tICd2bSdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnZHluYW1pYy1pbXBvcnQtY2h1bmtuYW1lJyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFt7XG4gICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgaW1wb3J0RnVuY3Rpb25zOiB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICB1bmlxdWVJdGVtczogdHJ1ZSxcbiAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd2VicGFja0NodW5rbmFtZUZvcm1hdDoge1xuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgY29uc3QgY29uZmlnID0gY29udGV4dC5vcHRpb25zWzBdXG4gICAgY29uc3QgeyBpbXBvcnRGdW5jdGlvbnMgPSBbXSB9ID0gY29uZmlnIHx8IHt9XG4gICAgY29uc3QgeyB3ZWJwYWNrQ2h1bmtuYW1lRm9ybWF0ID0gJ1swLTlhLXpBLVotXy8uXSsnIH0gPSBjb25maWcgfHwge31cblxuICAgIGNvbnN0IHBhZGRlZENvbW1lbnRSZWdleCA9IC9eIChcXFNbXFxzXFxTXStcXFMpICQvXG4gICAgY29uc3QgY29tbWVudFN0eWxlUmVnZXggPSAvXiggXFx3KzogKFwiW15cIl0qXCJ8XFxkK3xmYWxzZXx0cnVlKSw/KSsgJC9cbiAgICBjb25zdCBjaHVua1N1YnN0ckZvcm1hdCA9IGAgd2VicGFja0NodW5rTmFtZTogXCIke3dlYnBhY2tDaHVua25hbWVGb3JtYXR9XCIsPyBgXG4gICAgY29uc3QgY2h1bmtTdWJzdHJSZWdleCA9IG5ldyBSZWdFeHAoY2h1bmtTdWJzdHJGb3JtYXQpXG5cbiAgICByZXR1cm4ge1xuICAgICAgQ2FsbEV4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS5jYWxsZWUudHlwZSAhPT0gJ0ltcG9ydCcgJiYgaW1wb3J0RnVuY3Rpb25zLmluZGV4T2Yobm9kZS5jYWxsZWUubmFtZSkgPCAwKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VDb2RlID0gY29udGV4dC5nZXRTb3VyY2VDb2RlKClcbiAgICAgICAgY29uc3QgYXJnID0gbm9kZS5hcmd1bWVudHNbMF1cbiAgICAgICAgY29uc3QgbGVhZGluZ0NvbW1lbnRzID0gc291cmNlQ29kZS5nZXRDb21tZW50cyhhcmcpLmxlYWRpbmdcblxuICAgICAgICBpZiAoIWxlYWRpbmdDb21tZW50cyB8fCBsZWFkaW5nQ29tbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdkeW5hbWljIGltcG9ydHMgcmVxdWlyZSBhIGxlYWRpbmcgY29tbWVudCB3aXRoIHRoZSB3ZWJwYWNrIGNodW5rbmFtZScsXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc0NodW5rbmFtZVByZXNlbnQgPSBmYWxzZVxuXG4gICAgICAgIGZvciAoY29uc3QgY29tbWVudCBvZiBsZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICBpZiAoY29tbWVudC50eXBlICE9PSAnQmxvY2snKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdkeW5hbWljIGltcG9ydHMgcmVxdWlyZSBhIC8qIGZvbyAqLyBzdHlsZSBjb21tZW50LCBub3QgYSAvLyBmb28gY29tbWVudCcsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFwYWRkZWRDb21tZW50UmVnZXgudGVzdChjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgZHluYW1pYyBpbXBvcnRzIHJlcXVpcmUgYSBibG9jayBjb21tZW50IHBhZGRlZCB3aXRoIHNwYWNlcyAtIC8qIGZvbyAqL2AsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGp1c3QgbGlrZSB3ZWJwYWNrIGl0c2VsZiBkb2VzXG4gICAgICAgICAgICB2bS5ydW5Jbk5ld0NvbnRleHQoYChmdW5jdGlvbigpe3JldHVybiB7JHtjb21tZW50LnZhbHVlfX19KSgpYClcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBkeW5hbWljIGltcG9ydHMgcmVxdWlyZSBhIFwid2VicGFja1wiIGNvbW1lbnQgd2l0aCB2YWxpZCBzeW50YXhgLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghY29tbWVudFN0eWxlUmVnZXgudGVzdChjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgIGBkeW5hbWljIGltcG9ydHMgcmVxdWlyZSBhIGxlYWRpbmcgY29tbWVudCBpbiB0aGUgZm9ybSAvKiR7Y2h1bmtTdWJzdHJGb3JtYXR9Ki9gLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjaHVua1N1YnN0clJlZ2V4LnRlc3QoY29tbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIGlzQ2h1bmtuYW1lUHJlc2VudCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQ2h1bmtuYW1lUHJlc2VudCkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICBgZHluYW1pYyBpbXBvcnRzIHJlcXVpcmUgYSBsZWFkaW5nIGNvbW1lbnQgaW4gdGhlIGZvcm0gLyoke2NodW5rU3Vic3RyRm9ybWF0fSovYCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9keW5hbWljLWltcG9ydC1jaHVua25hbWUuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsInByb3BlcnRpZXMiLCJpbXBvcnRGdW5jdGlvbnMiLCJ1bmlxdWVJdGVtcyIsIml0ZW1zIiwid2VicGFja0NodW5rbmFtZUZvcm1hdCIsImNyZWF0ZSIsImNvbnRleHQiLCJjb25maWciLCJvcHRpb25zIiwicGFkZGVkQ29tbWVudFJlZ2V4IiwiY29tbWVudFN0eWxlUmVnZXgiLCJjaHVua1N1YnN0ckZvcm1hdCIsImNodW5rU3Vic3RyUmVnZXgiLCJSZWdFeHAiLCJydW4iLCJub2RlIiwiYXJnIiwic291cmNlQ29kZSIsImdldFNvdXJjZUNvZGUiLCJsZWFkaW5nQ29tbWVudHMiLCJnZXRDb21tZW50c0JlZm9yZSIsImdldENvbW1lbnRzIiwibGVhZGluZyIsImxlbmd0aCIsInJlcG9ydCIsIm1lc3NhZ2UiLCJpc0NodW5rbmFtZVByZXNlbnQiLCJjb21tZW50IiwidGVzdCIsInZhbHVlIiwidm0iLCJydW5Jbk5ld0NvbnRleHQiLCJlcnJvciIsIkltcG9ydEV4cHJlc3Npb24iLCJzb3VyY2UiLCJDYWxsRXhwcmVzc2lvbiIsImNhbGxlZSIsImluZGV4T2YiLCJuYW1lIiwiYXJndW1lbnRzIl0sIm1hcHBpbmdzIjoiYUFBQSx3QjtBQUNBLHFDOztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxZQURGO0FBRUpDLFVBQU07QUFDSkMsV0FBSyx1QkFBUSwwQkFBUixDQURELEVBRkY7O0FBS0pDLFlBQVEsQ0FBQztBQUNQSCxZQUFNLFFBREM7QUFFUEksa0JBQVk7QUFDVkMseUJBQWlCO0FBQ2ZMLGdCQUFNLE9BRFM7QUFFZk0sdUJBQWEsSUFGRTtBQUdmQyxpQkFBTztBQUNMUCxrQkFBTSxRQURELEVBSFEsRUFEUDs7O0FBUVZR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bEY7QUFDRDs7QUFFRHhCLFlBQUlDLElBQUosRUFBVUEsS0FBS3dCLFNBQUwsQ0FBZSxDQUFmLENBQVY7QUFDRCxPQVhJLEVBQVA7O0FBYUQsR0FsSGMsRUFBakIiLCJmaWxlIjoiZHluYW1pYy1pbXBvcnQtY2h1bmtuYW1lLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHZtIGZyb20gJ3ZtJ1xuaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCdkeW5hbWljLWltcG9ydC1jaHVua25hbWUnKSxcbiAgICB9LFxuICAgIHNjaGVtYTogW3tcbiAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBpbXBvcnRGdW5jdGlvbnM6IHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB3ZWJwYWNrQ2h1bmtuYW1lRm9ybWF0OiB7XG4gICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1dLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBjb25zdCBjb25maWcgPSBjb250ZXh0Lm9wdGlvbnNbMF1cbiAgICBjb25zdCB7IGltcG9ydEZ1bmN0aW9ucyA9IFtdIH0gPSBjb25maWcgfHwge31cbiAgICBjb25zdCB7IHdlYnBhY2tDaHVua25hbWVGb3JtYXQgPSAnWzAtOWEtekEtWi1fLy5dKycgfSA9IGNvbmZpZyB8fCB7fVxuXG4gICAgY29uc3QgcGFkZGVkQ29tbWVudFJlZ2V4ID0gL14gKFxcU1tcXHNcXFNdK1xcUykgJC9cbiAgICBjb25zdCBjb21tZW50U3R5bGVSZWdleCA9IC9eKCBcXHcrOiAoW1wiJ11bXlwiJ10qW1wiJ118XFxkK3xmYWxzZXx0cnVlKSw/KSsgJC9cbiAgICBjb25zdCBjaHVua1N1YnN0ckZvcm1hdCA9IGAgd2VicGFja0NodW5rTmFtZTogW1wiJ10ke3dlYnBhY2tDaHVua25hbWVGb3JtYXR9W1wiJ10sPyBgXG4gICAgY29uc3QgY2h1bmtTdWJzdHJSZWdleCA9IG5ldyBSZWdFeHAoY2h1bmtTdWJzdHJGb3JtYXQpXG5cbiAgICBmdW5jdGlvbiBydW4obm9kZSwgYXJnKSB7XG4gICAgICBjb25zdCBzb3VyY2VDb2RlID0gY29udGV4dC5nZXRTb3VyY2VDb2RlKClcbiAgICAgIGNvbnN0IGxlYWRpbmdDb21tZW50cyA9IHNvdXJjZUNvZGUuZ2V0Q29tbWVudHNCZWZvcmVcbiAgICAgICAgPyBzb3VyY2VDb2RlLmdldENvbW1lbnRzQmVmb3JlKGFyZykgLy8gVGhpcyBtZXRob2QgaXMgYXZhaWxhYmxlIGluIEVTTGludCA+PSA0LlxuICAgICAgICA6IHNvdXJjZUNvZGUuZ2V0Q29tbWVudHMoYXJnKS5sZWFkaW5nIC8vIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgaW4gRVNMaW50IDcuXG5cbiAgICAgIGlmICghbGVhZGluZ0NvbW1lbnRzIHx8IGxlYWRpbmdDb21tZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgbWVzc2FnZTogJ2R5bmFtaWMgaW1wb3J0cyByZXF1aXJlIGEgbGVhZGluZyBjb21tZW50IHdpdGggdGhlIHdlYnBhY2sgY2h1bmtuYW1lJyxcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxldCBpc0NodW5rbmFtZVByZXNlbnQgPSBmYWxzZVxuXG4gICAgICBmb3IgKGNvbnN0IGNvbW1lbnQgb2YgbGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgIGlmIChjb21tZW50LnR5cGUgIT09ICdCbG9jaycpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ2R5bmFtaWMgaW1wb3J0cyByZXF1aXJlIGEgLyogZm9vICovIHN0eWxlIGNvbW1lbnQsIG5vdCBhIC8vIGZvbyBjb21tZW50JyxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYWRkZWRDb21tZW50UmVnZXgudGVzdChjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlOiBgZHluYW1pYyBpbXBvcnRzIHJlcXVpcmUgYSBibG9jayBjb21tZW50IHBhZGRlZCB3aXRoIHNwYWNlcyAtIC8qIGZvbyAqL2AsXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8ganVzdCBsaWtlIHdlYnBhY2sgaXRzZWxmIGRvZXNcbiAgICAgICAgICB2bS5ydW5Jbk5ld0NvbnRleHQoYChmdW5jdGlvbigpe3JldHVybiB7JHtjb21tZW50LnZhbHVlfX19KSgpYClcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogYGR5bmFtaWMgaW1wb3J0cyByZXF1aXJlIGEgXCJ3ZWJwYWNrXCIgY29tbWVudCB3aXRoIHZhbGlkIHN5bnRheGAsXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29tbWVudFN0eWxlUmVnZXgudGVzdChjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICBgZHluYW1pYyBpbXBvcnRzIHJlcXVpcmUgYSBsZWFkaW5nIGNvbW1lbnQgaW4gdGhlIGZvcm0gLyoke2NodW5rU3Vic3RyRm9ybWF0fSovYCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNodW5rU3Vic3RyUmVnZXgudGVzdChjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgIGlzQ2h1bmtuYW1lUHJlc2VudCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWlzQ2h1bmtuYW1lUHJlc2VudCkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgYGR5bmFtaWMgaW1wb3J0cyByZXF1aXJlIGEgbGVhZGluZyBjb21tZW50IGluIHRoZSBmb3JtIC8qJHtjaHVua1N1YnN0ckZvcm1hdH0qL2AsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIEltcG9ydEV4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBydW4obm9kZSwgbm9kZS5zb3VyY2UpXG4gICAgICB9LFxuXG4gICAgICBDYWxsRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmNhbGxlZS50eXBlICE9PSAnSW1wb3J0JyAmJiBpbXBvcnRGdW5jdGlvbnMuaW5kZXhPZihub2RlLmNhbGxlZS5uYW1lKSA8IDApIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bihub2RlLCBub2RlLmFyZ3VtZW50c1swXSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/export.js b/node_modules/eslint-plugin-import/lib/rules/export.js
index 8241a82..c7d1aad 100644
--- a/node_modules/eslint-plugin-import/lib/rules/export.js
+++ b/node_modules/eslint-plugin-import/lib/rules/export.js
@@ -1,66 +1,58 @@
-'use strict';
-
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
-var _ExportMap = require('../ExportMap');
-
-var _ExportMap2 = _interopRequireDefault(_ExportMap);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-var _arrayIncludes = require('array-includes');
-
-var _arrayIncludes2 = _interopRequireDefault(_arrayIncludes);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();var _ExportMap = require('../ExportMap');var _ExportMap2 = _interopRequireDefault(_ExportMap);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);
+var _arrayIncludes = require('array-includes');var _arrayIncludes2 = _interopRequireDefault(_arrayIncludes);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 /*
-Notes on TypeScript namespaces aka TSModuleDeclaration:
-
-There are two forms:
-- active namespaces: namespace Foo {} / module Foo {}
-- ambient modules; declare module "eslint-plugin-import" {}
-
-active namespaces:
-- cannot contain a default export
-- cannot contain an export all
-- cannot contain a multi name export (export { a, b })
-- can have active namespaces nested within them
-
-ambient namespaces:
-- can only be defined in .d.ts files
-- cannot be nested within active namespaces
-- have no other restrictions
-*/
+                                                                                                                                                                                                          Notes on TypeScript namespaces aka TSModuleDeclaration:
+                                                                                                                                                                                                          
+                                                                                                                                                                                                          There are two forms:
+                                                                                                                                                                                                          - active namespaces: namespace Foo {} / module Foo {}
+                                                                                                                                                                                                          - ambient modules; declare module "eslint-plugin-import" {}
+                                                                                                                                                                                                          
+                                                                                                                                                                                                          active namespaces:
+                                                                                                                                                                                                          - cannot contain a default export
+                                                                                                                                                                                                          - cannot contain an export all
+                                                                                                                                                                                                          - cannot contain a multi name export (export { a, b })
+                                                                                                                                                                                                          - can have active namespaces nested within them
+                                                                                                                                                                                                          
+                                                                                                                                                                                                          ambient namespaces:
+                                                                                                                                                                                                          - can only be defined in .d.ts files
+                                                                                                                                                                                                          - cannot be nested within active namespaces
+                                                                                                                                                                                                          - have no other restrictions
+                                                                                                                                                                                                          */
 
 const rootProgram = 'root';
 const tsTypePrefix = 'type:';
 
 /**
- * Detect function overloads like:
- * ```ts
- * export function foo(a: number);
- * export function foo(a: string);
- * export function foo(a: number|string) { return a; }
- * ```
- * @param {Set<Object>} nodes
- * @returns {boolean}
- */
+                               * Detect function overloads like:
+                               * ```ts
+                               * export function foo(a: number);
+                               * export function foo(a: string);
+                               * export function foo(a: number|string) { return a; }
+                               * ```
+                               * @param {Set<Object>} nodes
+                               * @returns {boolean}
+                               */
 function isTypescriptFunctionOverloads(nodes) {
   const types = new Set(Array.from(nodes, node => node.parent.type));
-  return types.has('TSDeclareFunction') && (types.size === 1 || types.size === 2 && types.has('FunctionDeclaration'));
+  return (
+    types.has('TSDeclareFunction') && (
+
+    types.size === 1 ||
+    types.size === 2 && types.has('FunctionDeclaration')));
+
+
 }
 
 module.exports = {
   meta: {
     type: 'problem',
     docs: {
-      url: (0, _docsUrl2.default)('export')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('export') },
+
+    schema: [] },
+
 
   create: function (context) {
     const namespace = new Map([[rootProgram, new Map()]]);
@@ -105,7 +97,10 @@
         const isTypeVariableDecl = node.declaration.kind === 'type';
 
         if (node.declaration.id != null) {
-          if ((0, _arrayIncludes2.default)(['TSTypeAliasDeclaration', 'TSInterfaceDeclaration'], node.declaration.type)) {
+          if ((0, _arrayIncludes2.default)([
+          'TSTypeAliasDeclaration',
+          'TSInterfaceDeclaration'],
+          node.declaration.type)) {
             addNamed(node.declaration.id.name, node.declaration.id, parent, true);
           } else {
             addNamed(node.declaration.id.name, node.declaration.id, parent, isTypeVariableDecl);
@@ -114,7 +109,8 @@
 
         if (node.declaration.declarations != null) {
           for (let declaration of node.declaration.declarations) {
-            (0, _ExportMap.recursivePatternCapture)(declaration.id, v => addNamed(v.name, v, parent, isTypeVariableDecl));
+            (0, _ExportMap.recursivePatternCapture)(declaration.id, v =>
+            addNamed(v.name, v, parent, isTypeVariableDecl));
           }
         }
       },
@@ -122,6 +118,9 @@
       'ExportAllDeclaration': function (node) {
         if (node.source == null) return; // not sure if this is ever true
 
+        // `export * as X from 'path'` does not conflict
+        if (node.exported && node.exported.name) return;
+
         const remoteExports = _ExportMap2.default.get(node.source.value, context);
         if (remoteExports == null) return;
 
@@ -133,26 +132,22 @@
         const parent = getParent(node);
 
         let any = false;
-        remoteExports.forEach((v, name) => name !== 'default' && (any = true) && // poor man's filter
+        remoteExports.forEach((v, name) =>
+        name !== 'default' && (
+        any = true) && // poor man's filter
         addNamed(name, node, parent));
 
         if (!any) {
-          context.report(node.source, `No named exports found in module '${node.source.value}'.`);
+          context.report(
+          node.source,
+          `No named exports found in module '${node.source.value}'.`);
+
         }
       },
 
       'Program:exit': function () {
-        for (let _ref of namespace) {
-          var _ref2 = _slicedToArray(_ref, 2);
-
-          let named = _ref2[1];
-
-          for (let _ref3 of named) {
-            var _ref4 = _slicedToArray(_ref3, 2);
-
-            let name = _ref4[0];
-            let nodes = _ref4[1];
-
+        for (let _ref of namespace) {var _ref2 = _slicedToArray(_ref, 2);let named = _ref2[1];
+          for (let _ref3 of named) {var _ref4 = _slicedToArray(_ref3, 2);let name = _ref4[0];let nodes = _ref4[1];
             if (nodes.size <= 1) continue;
 
             if (isTypescriptFunctionOverloads(nodes)) continue;
@@ -161,13 +156,15 @@
               if (name === 'default') {
                 context.report(node, 'Multiple default exports.');
               } else {
-                context.report(node, `Multiple exports of name '${name.replace(tsTypePrefix, '')}'.`);
+                context.report(
+                node,
+                `Multiple exports of name '${name.replace(tsTypePrefix, '')}'.`);
+
               }
             }
           }
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9leHBvcnQuanMiXSwibmFtZXMiOlsicm9vdFByb2dyYW0iLCJ0c1R5cGVQcmVmaXgiLCJpc1R5cGVzY3JpcHRGdW5jdGlvbk92ZXJsb2FkcyIsIm5vZGVzIiwidHlwZXMiLCJTZXQiLCJBcnJheSIsImZyb20iLCJub2RlIiwicGFyZW50IiwidHlwZSIsImhhcyIsInNpemUiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0IiwibmFtZXNwYWNlIiwiTWFwIiwiYWRkTmFtZWQiLCJuYW1lIiwiaXNUeXBlIiwic2V0IiwibmFtZWQiLCJnZXQiLCJrZXkiLCJhZGQiLCJnZXRQYXJlbnQiLCJleHBvcnRlZCIsImRlY2xhcmF0aW9uIiwiaXNUeXBlVmFyaWFibGVEZWNsIiwia2luZCIsImlkIiwiZGVjbGFyYXRpb25zIiwidiIsInNvdXJjZSIsInJlbW90ZUV4cG9ydHMiLCJFeHBvcnRNYXAiLCJ2YWx1ZSIsImVycm9ycyIsImxlbmd0aCIsInJlcG9ydEVycm9ycyIsImFueSIsImZvckVhY2giLCJyZXBvcnQiLCJyZXBsYWNlIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSxNQUFNQSxjQUFjLE1BQXBCO0FBQ0EsTUFBTUMsZUFBZSxPQUFyQjs7QUFFQTs7Ozs7Ozs7OztBQVVBLFNBQVNDLDZCQUFULENBQXVDQyxLQUF2QyxFQUE4QztBQUM1QyxRQUFNQyxRQUFRLElBQUlDLEdBQUosQ0FBUUMsTUFBTUMsSUFBTixDQUFXSixLQUFYLEVBQWtCSyxRQUFRQSxLQUFLQyxNQUFMLENBQVlDLElBQXRDLENBQVIsQ0FBZDtBQUNBLFNBQ0VOLE1BQU1PLEdBQU4sQ0FBVSxtQkFBVixNQUVFUCxNQUFNUSxJQUFOLEtBQWUsQ0FBZixJQUNDUixNQUFNUSxJQUFOLEtBQWUsQ0FBZixJQUFvQlIsTUFBTU8sR0FBTixDQUFVLHFCQUFWLENBSHZCLENBREY7QUFPRDs7QUFFREUsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pMLFVBQU0sU0FERjtBQUVKTSxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsUUFBUjtBQURELEtBRkY7QUFLSkMsWUFBUTtBQUxKLEdBRFM7O0FBU2ZDLFVBQVEsVUFBVUMsT0FBVixFQUFtQjtBQUN6QixVQUFNQyxZQUFZLElBQUlDLEdBQUosQ0FBUSxDQUFDLENBQUN0QixXQUFELEVBQWMsSUFBSXNCLEdBQUosRUFBZCxDQUFELENBQVIsQ0FBbEI7O0FBRUEsYUFBU0MsUUFBVCxDQUFrQkMsSUFBbEIsRUFBd0JoQixJQUF4QixFQUE4QkMsTUFBOUIsRUFBc0NnQixNQUF0QyxFQUE4QztBQUM1QyxVQUFJLENBQUNKLFVBQVVWLEdBQVYsQ0FBY0YsTUFBZCxDQUFMLEVBQTRCO0FBQzFCWSxrQkFBVUssR0FBVixDQUFjakIsTUFBZCxFQUFzQixJQUFJYSxHQUFKLEVBQXRCO0FBQ0Q7QUFDRCxZQUFNSyxRQUFRTixVQUFVTyxHQUFWLENBQWNuQixNQUFkLENBQWQ7O0FBRUEsWUFBTW9CLE1BQU1KLFNBQVUsR0FBRXhCLFlBQWEsR0FBRXVCLElBQUssRUFBaEMsR0FBb0NBLElBQWhEO0FBQ0EsVUFBSXJCLFFBQVF3QixNQUFNQyxHQUFOLENBQVVDLEdBQVYsQ0FBWjs7QUFFQSxVQUFJMUIsU0FBUyxJQUFiLEVBQW1CO0FBQ2pCQSxnQkFBUSxJQUFJRSxHQUFKLEVBQVI7QUFDQXNCLGNBQU1ELEdBQU4sQ0FBVUcsR0FBVixFQUFlMUIsS0FBZjtBQUNEOztBQUVEQSxZQUFNMkIsR0FBTixDQUFVdEIsSUFBVjtBQUNEOztBQUVELGFBQVN1QixTQUFULENBQW1CdkIsSUFBbkIsRUFBeUI7QUFDdkIsVUFBSUEsS0FBS0MsTUFBTCxJQUFlRCxLQUFLQyxNQUFMLENBQVlDLElBQVosS0FBcUIsZUFBeEMsRUFBeUQ7QUFDdkQsZUFBT0YsS0FBS0MsTUFBTCxDQUFZQSxNQUFuQjtBQUNEOztBQUVEO0FBQ0E7QUFDQSxhQUFPVCxXQUFQO0FBQ0Q7O0FBRUQsV0FBTztBQUNMLGtDQUE2QlEsSUFBRCxJQUFVZSxTQUFTLFNBQVQsRUFBb0JmLElBQXBCLEVBQTBCdUIsVUFBVXZCLElBQVYsQ0FBMUIsQ0FEakM7O0FBR0wseUJBQW9CQSxJQUFELElBQVVlLFNBQVNmLEtBQUt3QixRQUFMLENBQWNSLElBQXZCLEVBQTZCaEIsS0FBS3dCLFFBQWxDLEVBQTRDRCxVQUFVdkIsSUFBVixDQUE1QyxDQUh4Qjs7QUFLTCxnQ0FBMEIsVUFBVUEsSUFBVixFQUFnQjtBQUN4QyxZQUFJQSxLQUFLeUIsV0FBTCxJQUFvQixJQUF4QixFQUE4Qjs7QUFFOUIsY0FBTXhCLFNBQVNzQixVQUFVdkIsSUFBVixDQUFmO0FBQ0E7QUFDQSxjQUFNMEIscUJBQXFCMUIsS0FBS3lCLFdBQUwsQ0FBaUJFLElBQWpCLEtBQTBCLE1BQXJEOztBQUVBLFlBQUkzQixLQUFLeUIsV0FBTCxDQUFpQkcsRUFBakIsSUFBdUIsSUFBM0IsRUFBaUM7QUFDL0IsY0FBSSw2QkFBUyxDQUNYLHdCQURXLEVBRVgsd0JBRlcsQ0FBVCxFQUdENUIsS0FBS3lCLFdBQUwsQ0FBaUJ2QixJQUhoQixDQUFKLEVBRzJCO0FBQ3pCYSxxQkFBU2YsS0FBS3lCLFdBQUwsQ0FBaUJHLEVBQWpCLENBQW9CWixJQUE3QixFQUFtQ2hCLEtBQUt5QixXQUFMLENBQWlCRyxFQUFwRCxFQUF3RDNCLE1BQXhELEVBQWdFLElBQWhFO0FBQ0QsV0FMRCxNQUtPO0FBQ0xjLHFCQUFTZixLQUFLeUIsV0FBTCxDQUFpQkcsRUFBakIsQ0FBb0JaLElBQTdCLEVBQW1DaEIsS0FBS3lCLFdBQUwsQ0FBaUJHLEVBQXBELEVBQXdEM0IsTUFBeEQsRUFBZ0V5QixrQkFBaEU7QUFDRDtBQUNGOztBQUVELFlBQUkxQixLQUFLeUIsV0FBTCxDQUFpQkksWUFBakIsSUFBaUMsSUFBckMsRUFBMkM7QUFDekMsZUFBSyxJQUFJSixXQUFULElBQXdCekIsS0FBS3lCLFdBQUwsQ0FBaUJJLFlBQXpDLEVBQXVEO0FBQ3JELG9EQUF3QkosWUFBWUcsRUFBcEMsRUFBd0NFLEtBQ3RDZixTQUFTZSxFQUFFZCxJQUFYLEVBQWlCYyxDQUFqQixFQUFvQjdCLE1BQXBCLEVBQTRCeUIsa0JBQTVCLENBREY7QUFFRDtBQUNGO0FBQ0YsT0E3Qkk7O0FBK0JMLDhCQUF3QixVQUFVMUIsSUFBVixFQUFnQjtBQUN0QyxZQUFJQSxLQUFLK0IsTUFBTCxJQUFlLElBQW5CLEVBQXlCLE9BRGEsQ0FDTjs7QUFFaEMsY0FBTUMsZ0JBQWdCQyxvQkFBVWIsR0FBVixDQUFjcEIsS0FBSytCLE1BQUwsQ0FBWUcsS0FBMUIsRUFBaUN0QixPQUFqQyxDQUF0QjtBQUNBLFlBQUlvQixpQkFBaUIsSUFBckIsRUFBMkI7O0FBRTNCLFlBQUlBLGNBQWNHLE1BQWQsQ0FBcUJDLE1BQXpCLEVBQWlDO0FBQy9CSix3QkFBY0ssWUFBZCxDQUEyQnpCLE9BQTNCLEVBQW9DWixJQUFwQztBQUNBO0FBQ0Q7O0FBRUQsY0FBTUMsU0FBU3NCLFVBQVV2QixJQUFWLENBQWY7O0FBRUEsWUFBSXNDLE1BQU0sS0FBVjtBQUNBTixzQkFBY08sT0FBZCxDQUFzQixDQUFDVCxDQUFELEVBQUlkLElBQUosS0FDcEJBLFNBQVMsU0FBVCxLQUNDc0IsTUFBTSxJQURQLEtBQ2dCO0FBQ2hCdkIsaUJBQVNDLElBQVQsRUFBZWhCLElBQWYsRUFBcUJDLE1BQXJCLENBSEY7O0FBS0EsWUFBSSxDQUFDcUMsR0FBTCxFQUFVO0FBQ1IxQixrQkFBUTRCLE1BQVIsQ0FBZXhDLEtBQUsrQixNQUFwQixFQUNHLHFDQUFvQy9CLEtBQUsrQixNQUFMLENBQVlHLEtBQU0sSUFEekQ7QUFFRDtBQUNGLE9BdERJOztBQXdETCxzQkFBZ0IsWUFBWTtBQUMxQix5QkFBc0JyQixTQUF0QixFQUFpQztBQUFBOztBQUFBLGNBQXJCTSxLQUFxQjs7QUFDL0IsNEJBQTBCQSxLQUExQixFQUFpQztBQUFBOztBQUFBLGdCQUF2QkgsSUFBdUI7QUFBQSxnQkFBakJyQixLQUFpQjs7QUFDL0IsZ0JBQUlBLE1BQU1TLElBQU4sSUFBYyxDQUFsQixFQUFxQjs7QUFFckIsZ0JBQUlWLDhCQUE4QkMsS0FBOUIsQ0FBSixFQUEwQzs7QUFFMUMsaUJBQUssSUFBSUssSUFBVCxJQUFpQkwsS0FBakIsRUFBd0I7QUFDdEIsa0JBQUlxQixTQUFTLFNBQWIsRUFBd0I7QUFDdEJKLHdCQUFRNEIsTUFBUixDQUFleEMsSUFBZixFQUFxQiwyQkFBckI7QUFDRCxlQUZELE1BRU87QUFDTFksd0JBQVE0QixNQUFSLENBQ0V4QyxJQURGLEVBRUcsNkJBQTRCZ0IsS0FBS3lCLE9BQUwsQ0FBYWhELFlBQWIsRUFBMkIsRUFBM0IsQ0FBK0IsSUFGOUQ7QUFJRDtBQUNGO0FBQ0Y7QUFDRjtBQUNGO0FBM0VJLEtBQVA7QUE2RUQ7QUFwSGMsQ0FBakIiLCJmaWxlIjoiZXhwb3J0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV4cG9ydE1hcCwgeyByZWN1cnNpdmVQYXR0ZXJuQ2FwdHVyZSB9IGZyb20gJy4uL0V4cG9ydE1hcCdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5pbXBvcnQgaW5jbHVkZXMgZnJvbSAnYXJyYXktaW5jbHVkZXMnXG5cbi8qXG5Ob3RlcyBvbiBUeXBlU2NyaXB0IG5hbWVzcGFjZXMgYWthIFRTTW9kdWxlRGVjbGFyYXRpb246XG5cblRoZXJlIGFyZSB0d28gZm9ybXM6XG4tIGFjdGl2ZSBuYW1lc3BhY2VzOiBuYW1lc3BhY2UgRm9vIHt9IC8gbW9kdWxlIEZvbyB7fVxuLSBhbWJpZW50IG1vZHVsZXM7IGRlY2xhcmUgbW9kdWxlIFwiZXNsaW50LXBsdWdpbi1pbXBvcnRcIiB7fVxuXG5hY3RpdmUgbmFtZXNwYWNlczpcbi0gY2Fubm90IGNvbnRhaW4gYSBkZWZhdWx0IGV4cG9ydFxuLSBjYW5ub3QgY29udGFpbiBhbiBleHBvcnQgYWxsXG4tIGNhbm5vdCBjb250YWluIGEgbXVsdGkgbmFtZSBleHBvcnQgKGV4cG9ydCB7IGEsIGIgfSlcbi0gY2FuIGhhdmUgYWN0aXZlIG5hbWVzcGFjZXMgbmVzdGVkIHdpdGhpbiB0aGVtXG5cbmFtYmllbnQgbmFtZXNwYWNlczpcbi0gY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiAuZC50cyBmaWxlc1xuLSBjYW5ub3QgYmUgbmVzdGVkIHdpdGhpbiBhY3RpdmUgbmFtZXNwYWNlc1xuLSBoYXZlIG5vIG90aGVyIHJlc3RyaWN0aW9uc1xuKi9cblxuY29uc3Qgcm9vdFByb2dyYW0gPSAncm9vdCdcbmNvbnN0IHRzVHlwZVByZWZpeCA9ICd0eXBlOidcblxuLyoqXG4gKiBEZXRlY3QgZnVuY3Rpb24gb3ZlcmxvYWRzIGxpa2U6XG4gKiBgYGB0c1xuICogZXhwb3J0IGZ1bmN0aW9uIGZvbyhhOiBudW1iZXIpO1xuICogZXhwb3J0IGZ1bmN0aW9uIGZvbyhhOiBzdHJpbmcpO1xuICogZXhwb3J0IGZ1bmN0aW9uIGZvbyhhOiBudW1iZXJ8c3RyaW5nKSB7IHJldHVybiBhOyB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7U2V0PE9iamVjdD59IG5vZGVzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNUeXBlc2NyaXB0RnVuY3Rpb25PdmVybG9hZHMobm9kZXMpIHtcbiAgY29uc3QgdHlwZXMgPSBuZXcgU2V0KEFycmF5LmZyb20obm9kZXMsIG5vZGUgPT4gbm9kZS5wYXJlbnQudHlwZSkpXG4gIHJldHVybiAoXG4gICAgdHlwZXMuaGFzKCdUU0RlY2xhcmVGdW5jdGlvbicpICYmXG4gICAgKFxuICAgICAgdHlwZXMuc2l6ZSA9PT0gMSB8fFxuICAgICAgKHR5cGVzLnNpemUgPT09IDIgJiYgdHlwZXMuaGFzKCdGdW5jdGlvbkRlY2xhcmF0aW9uJykpXG4gICAgKVxuICApXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3Byb2JsZW0nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnZXhwb3J0JyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBuZXcgTWFwKFtbcm9vdFByb2dyYW0sIG5ldyBNYXAoKV1dKVxuXG4gICAgZnVuY3Rpb24gYWRkTmFtZWQobmFtZSwgbm9kZSwgcGFyZW50LCBpc1R5cGUpIHtcbiAgICAgIGlmICghbmFtZXNwYWNlLmhhcyhwYXJlbnQpKSB7XG4gICAgICAgIG5hbWVzcGFjZS5zZXQocGFyZW50LCBuZXcgTWFwKCkpXG4gICAgICB9XG4gICAgICBjb25zdCBuYW1lZCA9IG5hbWVzcGFjZS5nZXQocGFyZW50KVxuXG4gICAgICBjb25zdCBrZXkgPSBpc1R5cGUgPyBgJHt0c1R5cGVQcmVmaXh9JHtuYW1lfWAgOiBuYW1lXG4gICAgICBsZXQgbm9kZXMgPSBuYW1lZC5nZXQoa2V5KVxuXG4gICAgICBpZiAobm9kZXMgPT0gbnVsbCkge1xuICAgICAgICBub2RlcyA9IG5ldyBTZXQoKVxuICAgICAgICBuYW1lZC5zZXQoa2V5LCBub2RlcylcbiAgICAgIH1cblxuICAgICAgbm9kZXMuYWRkKG5vZGUpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyZW50KG5vZGUpIHtcbiAgICAgIGlmIChub2RlLnBhcmVudCAmJiBub2RlLnBhcmVudC50eXBlID09PSAnVFNNb2R1bGVCbG9jaycpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50LnBhcmVudFxuICAgICAgfVxuXG4gICAgICAvLyBqdXN0IGluIGNhc2Ugc29tZWhvdyBhIG5vbi10cyBuYW1lc3BhY2UgZXhwb3J0IGRlY2xhcmF0aW9uIGlzbid0IGRpcmVjdGx5XG4gICAgICAvLyBwYXJlbnRlZCB0byB0aGUgcm9vdCBQcm9ncmFtIG5vZGVcbiAgICAgIHJldHVybiByb290UHJvZ3JhbVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJzogKG5vZGUpID0+IGFkZE5hbWVkKCdkZWZhdWx0Jywgbm9kZSwgZ2V0UGFyZW50KG5vZGUpKSxcblxuICAgICAgJ0V4cG9ydFNwZWNpZmllcic6IChub2RlKSA9PiBhZGROYW1lZChub2RlLmV4cG9ydGVkLm5hbWUsIG5vZGUuZXhwb3J0ZWQsIGdldFBhcmVudChub2RlKSksXG5cbiAgICAgICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJzogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb24gPT0gbnVsbCkgcmV0dXJuXG5cbiAgICAgICAgY29uc3QgcGFyZW50ID0gZ2V0UGFyZW50KG5vZGUpXG4gICAgICAgIC8vIHN1cHBvcnQgZm9yIG9sZCBUeXBlU2NyaXB0IHZlcnNpb25zXG4gICAgICAgIGNvbnN0IGlzVHlwZVZhcmlhYmxlRGVjbCA9IG5vZGUuZGVjbGFyYXRpb24ua2luZCA9PT0gJ3R5cGUnXG5cbiAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb24uaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChpbmNsdWRlcyhbXG4gICAgICAgICAgICAnVFNUeXBlQWxpYXNEZWNsYXJhdGlvbicsXG4gICAgICAgICAgICAnVFNJbnRlcmZhY2VEZWNsYXJhdGlvbicsXG4gICAgICAgICAgXSwgbm9kZS5kZWNsYXJhdGlvbi50eXBlKSkge1xuICAgICAgICAgICAgYWRkTmFtZWQobm9kZS5kZWNsYXJhdGlvbi5pZC5uYW1lLCBub2RlLmRlY2xhcmF0aW9uLmlkLCBwYXJlbnQsIHRydWUpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFkZE5hbWVkKG5vZGUuZGVjbGFyYXRpb24uaWQubmFtZSwgbm9kZS5kZWNsYXJhdGlvbi5pZCwgcGFyZW50LCBpc1R5cGVWYXJpYWJsZURlY2wpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zICE9IG51bGwpIHtcbiAgICAgICAgICBmb3IgKGxldCBkZWNsYXJhdGlvbiBvZiBub2RlLmRlY2xhcmF0aW9uLmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgcmVjdXJzaXZlUGF0dGVybkNhcHR1cmUoZGVjbGFyYXRpb24uaWQsIHYgPT5cbiAgICAgICAgICAgICAgYWRkTmFtZWQodi5uYW1lLCB2LCBwYXJlbnQsIGlzVHlwZVZhcmlhYmxlRGVjbCkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAnRXhwb3J0QWxsRGVjbGFyYXRpb24nOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5zb3VyY2UgPT0gbnVsbCkgcmV0dXJuIC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgZXZlciB0cnVlXG5cbiAgICAgICAgY29uc3QgcmVtb3RlRXhwb3J0cyA9IEV4cG9ydE1hcC5nZXQobm9kZS5zb3VyY2UudmFsdWUsIGNvbnRleHQpXG4gICAgICAgIGlmIChyZW1vdGVFeHBvcnRzID09IG51bGwpIHJldHVyblxuXG4gICAgICAgIGlmIChyZW1vdGVFeHBvcnRzLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICByZW1vdGVFeHBvcnRzLnJlcG9ydEVycm9ycyhjb250ZXh0LCBub2RlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50ID0gZ2V0UGFyZW50KG5vZGUpXG5cbiAgICAgICAgbGV0IGFueSA9IGZhbHNlXG4gICAgICAgIHJlbW90ZUV4cG9ydHMuZm9yRWFjaCgodiwgbmFtZSkgPT5cbiAgICAgICAgICBuYW1lICE9PSAnZGVmYXVsdCcgJiZcbiAgICAgICAgICAoYW55ID0gdHJ1ZSkgJiYgLy8gcG9vciBtYW4ncyBmaWx0ZXJcbiAgICAgICAgICBhZGROYW1lZChuYW1lLCBub2RlLCBwYXJlbnQpKVxuXG4gICAgICAgIGlmICghYW55KSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQobm9kZS5zb3VyY2UsXG4gICAgICAgICAgICBgTm8gbmFtZWQgZXhwb3J0cyBmb3VuZCBpbiBtb2R1bGUgJyR7bm9kZS5zb3VyY2UudmFsdWV9Jy5gKVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAnUHJvZ3JhbTpleGl0JzogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKGxldCBbLCBuYW1lZF0gb2YgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgZm9yIChsZXQgW25hbWUsIG5vZGVzXSBvZiBuYW1lZCkge1xuICAgICAgICAgICAgaWYgKG5vZGVzLnNpemUgPD0gMSkgY29udGludWVcblxuICAgICAgICAgICAgaWYgKGlzVHlwZXNjcmlwdEZ1bmN0aW9uT3ZlcmxvYWRzKG5vZGVzKSkgY29udGludWVcblxuICAgICAgICAgICAgZm9yIChsZXQgbm9kZSBvZiBub2Rlcykge1xuICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5yZXBvcnQobm9kZSwgJ011bHRpcGxlIGRlZmF1bHQgZXhwb3J0cy4nKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KFxuICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgIGBNdWx0aXBsZSBleHBvcnRzIG9mIG5hbWUgJyR7bmFtZS5yZXBsYWNlKHRzVHlwZVByZWZpeCwgJycpfScuYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9leHBvcnQuanMiXSwibmFtZXMiOlsicm9vdFByb2dyYW0iLCJ0c1R5cGVQcmVmaXgiLCJpc1R5cGVzY3JpcHRGdW5jdGlvbk92ZXJsb2FkcyIsIm5vZGVzIiwidHlwZXMiLCJTZXQiLCJBcnJheSIsImZyb20iLCJub2RlIiwicGFyZW50IiwidHlwZSIsImhhcyIsInNpemUiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0IiwibmFtZXNwYWNlIiwiTWFwIiwiYWRkTmFtZWQiLCJuYW1lIiwiaXNUeXBlIiwic2V0IiwibmFtZWQiLCJnZXQiLCJrZXkiLCJhZGQiLCJnZXRQYXJlbnQiLCJleHBvcnRlZCIsImRlY2xhcmF0aW9uIiwiaXNUeXBlVmFyaWFibGVEZWNsIiwia2luZCIsImlkIiwiZGVjbGFyYXRpb25zIiwidiIsInNvdXJjZSIsInJlbW90ZUV4cG9ydHMiLCJFeHBvcnRNYXAiLCJ2YWx1ZSIsImVycm9ycyIsImxlbmd0aCIsInJlcG9ydEVycm9ycyIsImFueSIsImZvckVhY2giLCJyZXBvcnQiLCJyZXBsYWNlIl0sIm1hcHBpbmdzIjoicW9CQUFBLHlDO0FBQ0EscUM7QUFDQSwrQzs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSxNQUFNQSxjQUFjLE1BQXBCO0FBQ0EsTUFBTUMsZUFBZSxPQUFyQjs7QUFFQTs7Ozs7Ozs7OztBQVVBLFNBQVNDLDZCQUFULENBQXVDQyxLQUF2QyxFQUE4QztBQUM1QyxRQUFNQyxRQUFRLElBQUlDLEdBQUosQ0FBUUMsTUFBTUMsSUFBTixDQUFXSixLQUFYLEVBQWtCSyxRQUFRQSxLQUFLQyxNQUFMLENBQVlDLElBQXRDLENBQVIsQ0FBZDtBQUNBO0FBQ0VOLFVBQU1PLEdBQU4sQ0FBVSxtQkFBVjs7QUFFRVAsVUFBTVEsSUFBTixLQUFlLENBQWY7QUFDQ1IsVUFBTVEsSUFBTixLQUFlLENBQWYsSUFBb0JSLE1B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QTBCQSxLQUExQixFQUFpQywwQ0FBdkJILElBQXVCLGdCQUFqQnJCLEtBQWlCO0FBQy9CLGdCQUFJQSxNQUFNUyxJQUFOLElBQWMsQ0FBbEIsRUFBcUI7O0FBRXJCLGdCQUFJViw4QkFBOEJDLEtBQTlCLENBQUosRUFBMEM7O0FBRTFDLGlCQUFLLElBQUlLLElBQVQsSUFBaUJMLEtBQWpCLEVBQXdCO0FBQ3RCLGtCQUFJcUIsU0FBUyxTQUFiLEVBQXdCO0FBQ3RCSix3QkFBUTRCLE1BQVIsQ0FBZXhDLElBQWYsRUFBcUIsMkJBQXJCO0FBQ0QsZUFGRCxNQUVPO0FBQ0xZLHdCQUFRNEIsTUFBUjtBQUNFeEMsb0JBREY7QUFFRyw2Q0FBNEJnQixLQUFLeUIsT0FBTCxDQUFhaEQsWUFBYixFQUEyQixFQUEzQixDQUErQixJQUY5RDs7QUFJRDtBQUNGO0FBQ0Y7QUFDRjtBQUNGLE9BaEZJLEVBQVA7O0FBa0ZELEdBekhjLEVBQWpCIiwiZmlsZSI6ImV4cG9ydC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFeHBvcnRNYXAsIHsgcmVjdXJzaXZlUGF0dGVybkNhcHR1cmUgfSBmcm9tICcuLi9FeHBvcnRNYXAnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuaW1wb3J0IGluY2x1ZGVzIGZyb20gJ2FycmF5LWluY2x1ZGVzJ1xuXG4vKlxuTm90ZXMgb24gVHlwZVNjcmlwdCBuYW1lc3BhY2VzIGFrYSBUU01vZHVsZURlY2xhcmF0aW9uOlxuXG5UaGVyZSBhcmUgdHdvIGZvcm1zOlxuLSBhY3RpdmUgbmFtZXNwYWNlczogbmFtZXNwYWNlIEZvbyB7fSAvIG1vZHVsZSBGb28ge31cbi0gYW1iaWVudCBtb2R1bGVzOyBkZWNsYXJlIG1vZHVsZSBcImVzbGludC1wbHVnaW4taW1wb3J0XCIge31cblxuYWN0aXZlIG5hbWVzcGFjZXM6XG4tIGNhbm5vdCBjb250YWluIGEgZGVmYXVsdCBleHBvcnRcbi0gY2Fubm90IGNvbnRhaW4gYW4gZXhwb3J0IGFsbFxuLSBjYW5ub3QgY29udGFpbiBhIG11bHRpIG5hbWUgZXhwb3J0IChleHBvcnQgeyBhLCBiIH0pXG4tIGNhbiBoYXZlIGFjdGl2ZSBuYW1lc3BhY2VzIG5lc3RlZCB3aXRoaW4gdGhlbVxuXG5hbWJpZW50IG5hbWVzcGFjZXM6XG4tIGNhbiBvbmx5IGJlIGRlZmluZWQgaW4gLmQudHMgZmlsZXNcbi0gY2Fubm90IGJlIG5lc3RlZCB3aXRoaW4gYWN0aXZlIG5hbWVzcGFjZXNcbi0gaGF2ZSBubyBvdGhlciByZXN0cmljdGlvbnNcbiovXG5cbmNvbnN0IHJvb3RQcm9ncmFtID0gJ3Jvb3QnXG5jb25zdCB0c1R5cGVQcmVmaXggPSAndHlwZTonXG5cbi8qKlxuICogRGV0ZWN0IGZ1bmN0aW9uIG92ZXJsb2FkcyBsaWtlOlxuICogYGBgdHNcbiAqIGV4cG9ydCBmdW5jdGlvbiBmb28oYTogbnVtYmVyKTtcbiAqIGV4cG9ydCBmdW5jdGlvbiBmb28oYTogc3RyaW5nKTtcbiAqIGV4cG9ydCBmdW5jdGlvbiBmb28oYTogbnVtYmVyfHN0cmluZykgeyByZXR1cm4gYTsgfVxuICogYGBgXG4gKiBAcGFyYW0ge1NldDxPYmplY3Q+fSBub2Rlc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVHlwZXNjcmlwdEZ1bmN0aW9uT3ZlcmxvYWRzKG5vZGVzKSB7XG4gIGNvbnN0IHR5cGVzID0gbmV3IFNldChBcnJheS5mcm9tKG5vZGVzLCBub2RlID0+IG5vZGUucGFyZW50LnR5cGUpKVxuICByZXR1cm4gKFxuICAgIHR5cGVzLmhhcygnVFNEZWNsYXJlRnVuY3Rpb24nKSAmJlxuICAgIChcbiAgICAgIHR5cGVzLnNpemUgPT09IDEgfHxcbiAgICAgICh0eXBlcy5zaXplID09PSAyICYmIHR5cGVzLmhhcygnRnVuY3Rpb25EZWNsYXJhdGlvbicpKVxuICAgIClcbiAgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ2V4cG9ydCcpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gbmV3IE1hcChbW3Jvb3RQcm9ncmFtLCBuZXcgTWFwKCldXSlcblxuICAgIGZ1bmN0aW9uIGFkZE5hbWVkKG5hbWUsIG5vZGUsIHBhcmVudCwgaXNUeXBlKSB7XG4gICAgICBpZiAoIW5hbWVzcGFjZS5oYXMocGFyZW50KSkge1xuICAgICAgICBuYW1lc3BhY2Uuc2V0KHBhcmVudCwgbmV3IE1hcCgpKVxuICAgICAgfVxuICAgICAgY29uc3QgbmFtZWQgPSBuYW1lc3BhY2UuZ2V0KHBhcmVudClcblxuICAgICAgY29uc3Qga2V5ID0gaXNUeXBlID8gYCR7dHNUeXBlUHJlZml4fSR7bmFtZX1gIDogbmFtZVxuICAgICAgbGV0IG5vZGVzID0gbmFtZWQuZ2V0KGtleSlcblxuICAgICAgaWYgKG5vZGVzID09IG51bGwpIHtcbiAgICAgICAgbm9kZXMgPSBuZXcgU2V0KClcbiAgICAgICAgbmFtZWQuc2V0KGtleSwgbm9kZXMpXG4gICAgICB9XG5cbiAgICAgIG5vZGVzLmFkZChub2RlKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBhcmVudChub2RlKSB7XG4gICAgICBpZiAobm9kZS5wYXJlbnQgJiYgbm9kZS5wYXJlbnQudHlwZSA9PT0gJ1RTTW9kdWxlQmxvY2snKSB7XG4gICAgICAgIHJldHVybiBub2RlLnBhcmVudC5wYXJlbnRcbiAgICAgIH1cblxuICAgICAgLy8ganVzdCBpbiBjYXNlIHNvbWVob3cgYSBub24tdHMgbmFtZXNwYWNlIGV4cG9ydCBkZWNsYXJhdGlvbiBpc24ndCBkaXJlY3RseVxuICAgICAgLy8gcGFyZW50ZWQgdG8gdGhlIHJvb3QgUHJvZ3JhbSBub2RlXG4gICAgICByZXR1cm4gcm9vdFByb2dyYW1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbic6IChub2RlKSA9PiBhZGROYW1lZCgnZGVmYXVsdCcsIG5vZGUsIGdldFBhcmVudChub2RlKSksXG5cbiAgICAgICdFeHBvcnRTcGVjaWZpZXInOiAobm9kZSkgPT4gYWRkTmFtZWQobm9kZS5leHBvcnRlZC5uYW1lLCBub2RlLmV4cG9ydGVkLCBnZXRQYXJlbnQobm9kZSkpLFxuXG4gICAgICAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbic6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uID09IG51bGwpIHJldHVyblxuXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGdldFBhcmVudChub2RlKVxuICAgICAgICAvLyBzdXBwb3J0IGZvciBvbGQgVHlwZVNjcmlwdCB2ZXJzaW9uc1xuICAgICAgICBjb25zdCBpc1R5cGVWYXJpYWJsZURlY2wgPSBub2RlLmRlY2xhcmF0aW9uLmtpbmQgPT09ICd0eXBlJ1xuXG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uLmlkICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoaW5jbHVkZXMoW1xuICAgICAgICAgICAgJ1RTVHlwZUFsaWFzRGVjbGFyYXRpb24nLFxuICAgICAgICAgICAgJ1RTSW50ZXJmYWNlRGVjbGFyYXRpb24nLFxuICAgICAgICAgIF0sIG5vZGUuZGVjbGFyYXRpb24udHlwZSkpIHtcbiAgICAgICAgICAgIGFkZE5hbWVkKG5vZGUuZGVjbGFyYXRpb24uaWQubmFtZSwgbm9kZS5kZWNsYXJhdGlvbi5pZCwgcGFyZW50LCB0cnVlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGROYW1lZChub2RlLmRlY2xhcmF0aW9uLmlkLm5hbWUsIG5vZGUuZGVjbGFyYXRpb24uaWQsIHBhcmVudCwgaXNUeXBlVmFyaWFibGVEZWNsKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uLmRlY2xhcmF0aW9ucyAhPSBudWxsKSB7XG4gICAgICAgICAgZm9yIChsZXQgZGVjbGFyYXRpb24gb2Ygbm9kZS5kZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZVBhdHRlcm5DYXB0dXJlKGRlY2xhcmF0aW9uLmlkLCB2ID0+XG4gICAgICAgICAgICAgIGFkZE5hbWVkKHYubmFtZSwgdiwgcGFyZW50LCBpc1R5cGVWYXJpYWJsZURlY2wpKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgJ0V4cG9ydEFsbERlY2xhcmF0aW9uJzogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuc291cmNlID09IG51bGwpIHJldHVybiAvLyBub3Qgc3VyZSBpZiB0aGlzIGlzIGV2ZXIgdHJ1ZVxuXG4gICAgICAgIC8vIGBleHBvcnQgKiBhcyBYIGZyb20gJ3BhdGgnYCBkb2VzIG5vdCBjb25mbGljdFxuICAgICAgICBpZiAobm9kZS5leHBvcnRlZCAmJiBub2RlLmV4cG9ydGVkLm5hbWUpIHJldHVyblxuXG4gICAgICAgIGNvbnN0IHJlbW90ZUV4cG9ydHMgPSBFeHBvcnRNYXAuZ2V0KG5vZGUuc291cmNlLnZhbHVlLCBjb250ZXh0KVxuICAgICAgICBpZiAocmVtb3RlRXhwb3J0cyA9PSBudWxsKSByZXR1cm5cblxuICAgICAgICBpZiAocmVtb3RlRXhwb3J0cy5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgcmVtb3RlRXhwb3J0cy5yZXBvcnRFcnJvcnMoY29udGV4dCwgbm9kZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGdldFBhcmVudChub2RlKVxuXG4gICAgICAgIGxldCBhbnkgPSBmYWxzZVxuICAgICAgICByZW1vdGVFeHBvcnRzLmZvckVhY2goKHYsIG5hbWUpID0+XG4gICAgICAgICAgbmFtZSAhPT0gJ2RlZmF1bHQnICYmXG4gICAgICAgICAgKGFueSA9IHRydWUpICYmIC8vIHBvb3IgbWFuJ3MgZmlsdGVyXG4gICAgICAgICAgYWRkTmFtZWQobmFtZSwgbm9kZSwgcGFyZW50KSlcblxuICAgICAgICBpZiAoIWFueSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KFxuICAgICAgICAgICAgbm9kZS5zb3VyY2UsXG4gICAgICAgICAgICBgTm8gbmFtZWQgZXhwb3J0cyBmb3VuZCBpbiBtb2R1bGUgJyR7bm9kZS5zb3VyY2UudmFsdWV9Jy5gXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAnUHJvZ3JhbTpleGl0JzogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKGxldCBbLCBuYW1lZF0gb2YgbmFtZXNwYWNlKSB7XG4gICAgICAgICAgZm9yIChsZXQgW25hbWUsIG5vZGVzXSBvZiBuYW1lZCkge1xuICAgICAgICAgICAgaWYgKG5vZGVzLnNpemUgPD0gMSkgY29udGludWVcblxuICAgICAgICAgICAgaWYgKGlzVHlwZXNjcmlwdEZ1bmN0aW9uT3ZlcmxvYWRzKG5vZGVzKSkgY29udGludWVcblxuICAgICAgICAgICAgZm9yIChsZXQgbm9kZSBvZiBub2Rlcykge1xuICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5yZXBvcnQobm9kZSwgJ011bHRpcGxlIGRlZmF1bHQgZXhwb3J0cy4nKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KFxuICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgIGBNdWx0aXBsZSBleHBvcnRzIG9mIG5hbWUgJyR7bmFtZS5yZXBsYWNlKHRzVHlwZVByZWZpeCwgJycpfScuYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/exports-last.js b/node_modules/eslint-plugin-import/lib/rules/exports-last.js
index a8ff6a7..54412a6 100644
--- a/node_modules/eslint-plugin-import/lib/rules/exports-last.js
+++ b/node_modules/eslint-plugin-import/lib/rules/exports-last.js
@@ -1,31 +1,23 @@
-'use strict';
+'use strict';var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function isNonExportStatement(_ref) {
-  let type = _ref.type;
-
-  return type !== 'ExportDefaultDeclaration' && type !== 'ExportNamedDeclaration' && type !== 'ExportAllDeclaration';
+function isNonExportStatement(_ref) {let type = _ref.type;
+  return type !== 'ExportDefaultDeclaration' &&
+  type !== 'ExportNamedDeclaration' &&
+  type !== 'ExportAllDeclaration';
 }
 
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('exports-last')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('exports-last') },
+
+    schema: [] },
+
 
   create: function (context) {
     return {
-      Program: function (_ref2) {
-        let body = _ref2.body;
-
+      Program: function (_ref2) {let body = _ref2.body;
         const lastNonExportStatementIndex = body.reduce(function findLastIndex(acc, item, index) {
           if (isNonExportStatement(item)) {
             return index;
@@ -38,13 +30,12 @@
             if (!isNonExportStatement(node)) {
               context.report({
                 node,
-                message: 'Export statements should appear at the end of the file'
-              });
+                message: 'Export statements should appear at the end of the file' });
+
             }
           });
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9leHBvcnRzLWxhc3QuanMiXSwibmFtZXMiOlsiaXNOb25FeHBvcnRTdGF0ZW1lbnQiLCJ0eXBlIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwiY29udGV4dCIsIlByb2dyYW0iLCJib2R5IiwibGFzdE5vbkV4cG9ydFN0YXRlbWVudEluZGV4IiwicmVkdWNlIiwiZmluZExhc3RJbmRleCIsImFjYyIsIml0ZW0iLCJpbmRleCIsInNsaWNlIiwiZm9yRWFjaCIsImNoZWNrTm9uRXhwb3J0Iiwibm9kZSIsInJlcG9ydCIsIm1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7OztBQUVBLFNBQVNBLG9CQUFULE9BQXdDO0FBQUEsTUFBUkMsSUFBUSxRQUFSQSxJQUFROztBQUN0QyxTQUFPQSxTQUFTLDBCQUFULElBQ0xBLFNBQVMsd0JBREosSUFFTEEsU0FBUyxzQkFGWDtBQUdEOztBQUVEQyxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkgsVUFBTSxZQURGO0FBRUpJLFVBQU07QUFDSkMsV0FBSyx1QkFBUSxjQUFSO0FBREQsS0FGRjtBQUtKQyxZQUFRO0FBTEosR0FEUzs7QUFTZkMsVUFBUSxVQUFVQyxPQUFWLEVBQW1CO0FBQ3pCLFdBQU87QUFDTEMsZUFBUyxpQkFBb0I7QUFBQSxZQUFSQyxJQUFRLFNBQVJBLElBQVE7O0FBQzNCLGNBQU1DLDhCQUE4QkQsS0FBS0UsTUFBTCxDQUFZLFNBQVNDLGFBQVQsQ0FBdUJDLEdBQXZCLEVBQTRCQyxJQUE1QixFQUFrQ0MsS0FBbEMsRUFBeUM7QUFDdkYsY0FBSWpCLHFCQUFxQmdCLElBQXJCLENBQUosRUFBZ0M7QUFDOUIsbUJBQU9DLEtBQVA7QUFDRDtBQUNELGlCQUFPRixHQUFQO0FBQ0QsU0FMbUMsRUFLakMsQ0FBQyxDQUxnQyxDQUFwQzs7QUFPQSxZQUFJSCxnQ0FBZ0MsQ0FBQyxDQUFyQyxFQUF3QztBQUN0Q0QsZUFBS08sS0FBTCxDQUFXLENBQVgsRUFBY04sMkJBQWQsRUFBMkNPLE9BQTNDLENBQW1ELFNBQVNDLGNBQVQsQ0FBd0JDLElBQXhCLEVBQThCO0FBQy9FLGdCQUFJLENBQUNyQixxQkFBcUJxQixJQUFyQixDQUFMLEVBQWlDO0FBQy9CWixzQkFBUWEsTUFBUixDQUFlO0FBQ2JELG9CQURhO0FBRWJFLHlCQUFTO0FBRkksZUFBZjtBQUlEO0FBQ0YsV0FQRDtBQVFEO0FBQ0Y7QUFuQkksS0FBUDtBQXFCRDtBQS9CYyxDQUFqQiIsImZpbGUiOiJleHBvcnRzLWxhc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5mdW5jdGlvbiBpc05vbkV4cG9ydFN0YXRlbWVudCh7IHR5cGUgfSkge1xuICByZXR1cm4gdHlwZSAhPT0gJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbicgJiZcbiAgICB0eXBlICE9PSAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicgJiZcbiAgICB0eXBlICE9PSAnRXhwb3J0QWxsRGVjbGFyYXRpb24nXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnZXhwb3J0cy1sYXN0JyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgUHJvZ3JhbTogZnVuY3Rpb24gKHsgYm9keSB9KSB7XG4gICAgICAgIGNvbnN0IGxhc3ROb25FeHBvcnRTdGF0ZW1lbnRJbmRleCA9IGJvZHkucmVkdWNlKGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYWNjLCBpdGVtLCBpbmRleCkge1xuICAgICAgICAgIGlmIChpc05vbkV4cG9ydFN0YXRlbWVudChpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGluZGV4XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgfSwgLTEpXG5cbiAgICAgICAgaWYgKGxhc3ROb25FeHBvcnRTdGF0ZW1lbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBib2R5LnNsaWNlKDAsIGxhc3ROb25FeHBvcnRTdGF0ZW1lbnRJbmRleCkuZm9yRWFjaChmdW5jdGlvbiBjaGVja05vbkV4cG9ydChub2RlKSB7XG4gICAgICAgICAgICBpZiAoIWlzTm9uRXhwb3J0U3RhdGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdFeHBvcnQgc3RhdGVtZW50cyBzaG91bGQgYXBwZWFyIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUnLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9leHBvcnRzLWxhc3QuanMiXSwibmFtZXMiOlsiaXNOb25FeHBvcnRTdGF0ZW1lbnQiLCJ0eXBlIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwiY29udGV4dCIsIlByb2dyYW0iLCJib2R5IiwibGFzdE5vbkV4cG9ydFN0YXRlbWVudEluZGV4IiwicmVkdWNlIiwiZmluZExhc3RJbmRleCIsImFjYyIsIml0ZW0iLCJpbmRleCIsInNsaWNlIiwiZm9yRWFjaCIsImNoZWNrTm9uRXhwb3J0Iiwibm9kZSIsInJlcG9ydCIsIm1lc3NhZ2UiXSwibWFwcGluZ3MiOiJhQUFBLHFDOztBQUVBLFNBQVNBLG9CQUFULE9BQXdDLEtBQVJDLElBQVEsUUFBUkEsSUFBUTtBQUN0QyxTQUFPQSxTQUFTLDBCQUFUO0FBQ0xBLFdBQVMsd0JBREo7QUFFTEEsV0FBUyxzQkFGWDtBQUdEOztBQUVEQyxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkgsVUFBTSxZQURGO0FBRUpJLFVBQU07QUFDSkMsV0FBSyx1QkFBUSxjQUFSLENBREQsRUFGRjs7QUFLSkMsWUFBUSxFQUxKLEVBRFM7OztBQVNmQyxVQUFRLFVBQVVDLE9BQVYsRUFBbUI7QUFDekIsV0FBTztBQUNMQyxlQUFTLGlCQUFvQixLQUFSQyxJQUFRLFNBQVJBLElBQVE7QUFDM0IsY0FBTUMsOEJBQThCRCxLQUFLRSxNQUFMLENBQVksU0FBU0MsYUFBVCxDQUF1QkMsR0FBdkIsRUFBNEJDLElBQTVCLEVBQWtDQyxLQUFsQyxFQUF5QztBQUN2RixjQUFJakIscUJBQXFCZ0IsSUFBckIsQ0FBSixFQUFnQztBQUM5QixtQkFBT0MsS0FBUDtBQUNEO0FBQ0QsaUJBQU9GLEdBQVA7QUFDRCxTQUxtQyxFQUtqQyxDQUFDLENBTGdDLENBQXBDOztBQU9BLFlBQUlILGdDQUFnQyxDQUFDLENBQXJDLEVBQXdDO0FBQ3RDRCxlQUFLTyxLQUFMLENBQVcsQ0FBWCxFQUFjTiwyQkFBZCxFQUEyQ08sT0FBM0MsQ0FBbUQsU0FBU0MsY0FBVCxDQUF3QkMsSUFBeEIsRUFBOEI7QUFDL0UsZ0JBQUksQ0FBQ3JCLHFCQUFxQnFCLElBQXJCLENBQUwsRUFBaUM7QUFDL0JaLHNCQUFRYSxNQUFSLENBQWU7QUFDYkQsb0JBRGE7QUFFYkUseUJBQVMsd0RBRkksRUFBZjs7QUFJRDtBQUNGLFdBUEQ7QUFRRDtBQUNGLE9BbkJJLEVBQVA7O0FBcUJELEdBL0JjLEVBQWpCIiwiZmlsZSI6ImV4cG9ydHMtbGFzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbmZ1bmN0aW9uIGlzTm9uRXhwb3J0U3RhdGVtZW50KHsgdHlwZSB9KSB7XG4gIHJldHVybiB0eXBlICE9PSAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJyAmJlxuICAgIHR5cGUgIT09ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJyAmJlxuICAgIHR5cGUgIT09ICdFeHBvcnRBbGxEZWNsYXJhdGlvbidcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCdleHBvcnRzLWxhc3QnKSxcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHJldHVybiB7XG4gICAgICBQcm9ncmFtOiBmdW5jdGlvbiAoeyBib2R5IH0pIHtcbiAgICAgICAgY29uc3QgbGFzdE5vbkV4cG9ydFN0YXRlbWVudEluZGV4ID0gYm9keS5yZWR1Y2UoZnVuY3Rpb24gZmluZExhc3RJbmRleChhY2MsIGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgaWYgKGlzTm9uRXhwb3J0U3RhdGVtZW50KGl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICB9LCAtMSlcblxuICAgICAgICBpZiAobGFzdE5vbkV4cG9ydFN0YXRlbWVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGJvZHkuc2xpY2UoMCwgbGFzdE5vbkV4cG9ydFN0YXRlbWVudEluZGV4KS5mb3JFYWNoKGZ1bmN0aW9uIGNoZWNrTm9uRXhwb3J0KG5vZGUpIHtcbiAgICAgICAgICAgIGlmICghaXNOb25FeHBvcnRTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0V4cG9ydCBzdGF0ZW1lbnRzIHNob3VsZCBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZScsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/extensions.js b/node_modules/eslint-plugin-import/lib/rules/extensions.js
index 29b5a8a..603be86 100644
--- a/node_modules/eslint-plugin-import/lib/rules/extensions.js
+++ b/node_modules/eslint-plugin-import/lib/rules/extensions.js
@@ -1,41 +1,29 @@
-'use strict';
+'use strict';var _path = require('path');var _path2 = _interopRequireDefault(_path);
 
-var _path = require('path');
-
-var _path2 = _interopRequireDefault(_path);
-
-var _resolve = require('eslint-module-utils/resolve');
-
-var _resolve2 = _interopRequireDefault(_resolve);
-
+var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);
 var _importType = require('../core/importType');
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 const enumValues = { enum: ['always', 'ignorePackages', 'never'] };
 const patternProperties = {
   type: 'object',
-  patternProperties: { '.*': enumValues }
-};
+  patternProperties: { '.*': enumValues } };
+
 const properties = {
   type: 'object',
   properties: {
     'pattern': patternProperties,
-    'ignorePackages': { type: 'boolean' }
-  }
-};
+    'ignorePackages': { type: 'boolean' } } };
+
+
 
 function buildProperties(context) {
 
   const result = {
     defaultConfig: 'never',
     pattern: {},
-    ignorePackages: false
-  };
+    ignorePackages: false };
+
 
   context.options.forEach(obj => {
 
@@ -74,33 +62,45 @@
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('extensions')
-    },
+      url: (0, _docsUrl2.default)('extensions') },
+
 
     schema: {
-      anyOf: [{
+      anyOf: [
+      {
         type: 'array',
         items: [enumValues],
-        additionalItems: false
-      }, {
+        additionalItems: false },
+
+      {
         type: 'array',
-        items: [enumValues, properties],
-        additionalItems: false
-      }, {
+        items: [
+        enumValues,
+        properties],
+
+        additionalItems: false },
+
+      {
         type: 'array',
         items: [properties],
-        additionalItems: false
-      }, {
+        additionalItems: false },
+
+      {
         type: 'array',
         items: [patternProperties],
-        additionalItems: false
-      }, {
+        additionalItems: false },
+
+      {
         type: 'array',
-        items: [enumValues, patternProperties],
-        additionalItems: false
-      }]
-    }
-  },
+        items: [
+        enumValues,
+        patternProperties],
+
+        additionalItems: false }] } },
+
+
+
+
 
   create: function (context) {
 
@@ -134,11 +134,10 @@
       return false;
     }
 
-    function checkFileExtension(node) {
-      const source = node.source;
+    function checkFileExtension(node) {const
+      source = node.source;
 
       // bail if the declaration doesn't have a source, e.g. "export { foo };"
-
       if (!source) return;
 
       const importPathWithQueryString = source.value;
@@ -159,7 +158,8 @@
       const extension = _path2.default.extname(resolvedPath || importPath).substring(1);
 
       // determine if this is a module
-      const isPackage = (0, _importType.isExternalModule)(importPath, context.settings) || (0, _importType.isScoped)(importPath);
+      const isPackage = (0, _importType.isExternalModule)(importPath, context.settings) ||
+      (0, _importType.isScoped)(importPath);
 
       if (!extension || !importPath.endsWith(`.${extension}`)) {
         const extensionRequired = isUseOfExtensionRequired(extension, isPackage);
@@ -167,23 +167,23 @@
         if (extensionRequired && !extensionForbidden) {
           context.report({
             node: source,
-            message: `Missing file extension ${extension ? `"${extension}" ` : ''}for "${importPathWithQueryString}"`
-          });
+            message:
+            `Missing file extension ${extension ? `"${extension}" ` : ''}for "${importPathWithQueryString}"` });
+
         }
       } else if (extension) {
         if (isUseOfExtensionForbidden(extension) && isResolvableWithoutExtension(importPath)) {
           context.report({
             node: source,
-            message: `Unexpected use of file extension "${extension}" for "${importPathWithQueryString}"`
-          });
+            message: `Unexpected use of file extension "${extension}" for "${importPathWithQueryString}"` });
+
         }
       }
     }
 
     return {
       ImportDeclaration: checkFileExtension,
-      ExportNamedDeclaration: checkFileExtension
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9leHRlbnNpb25zLmpzIl0sIm5hbWVzIjpbImVudW1WYWx1ZXMiLCJlbnVtIiwicGF0dGVyblByb3BlcnRpZXMiLCJ0eXBlIiwicHJvcGVydGllcyIsImJ1aWxkUHJvcGVydGllcyIsImNvbnRleHQiLCJyZXN1bHQiLCJkZWZhdWx0Q29uZmlnIiwicGF0dGVybiIsImlnbm9yZVBhY2thZ2VzIiwib3B0aW9ucyIsImZvckVhY2giLCJvYmoiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJhc3NpZ24iLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJhbnlPZiIsIml0ZW1zIiwiYWRkaXRpb25hbEl0ZW1zIiwiY3JlYXRlIiwicHJvcHMiLCJnZXRNb2RpZmllciIsImV4dGVuc2lvbiIsImlzVXNlT2ZFeHRlbnNpb25SZXF1aXJlZCIsImlzUGFja2FnZSIsImlzVXNlT2ZFeHRlbnNpb25Gb3JiaWRkZW4iLCJpc1Jlc29sdmFibGVXaXRob3V0RXh0ZW5zaW9uIiwiZmlsZSIsInBhdGgiLCJleHRuYW1lIiwiZmlsZVdpdGhvdXRFeHRlbnNpb24iLCJzbGljZSIsImxlbmd0aCIsInJlc29sdmVkRmlsZVdpdGhvdXRFeHRlbnNpb24iLCJpc0V4dGVybmFsUm9vdE1vZHVsZSIsInNsYXNoQ291bnQiLCJzcGxpdCIsImNoZWNrRmlsZUV4dGVuc2lvbiIsIm5vZGUiLCJzb3VyY2UiLCJpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nIiwidmFsdWUiLCJzZXR0aW5ncyIsImltcG9ydFBhdGgiLCJyZXBsYWNlIiwicmVzb2x2ZWRQYXRoIiwic3Vic3RyaW5nIiwiZW5kc1dpdGgiLCJleHRlbnNpb25SZXF1aXJlZCIsImV4dGVuc2lvbkZvcmJpZGRlbiIsInJlcG9ydCIsIm1lc3NhZ2UiLCJJbXBvcnREZWNsYXJhdGlvbiIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFF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LEtBQVA7QUFJRDtBQS9IYyxDQUFqQiIsImZpbGUiOiJleHRlbnNpb25zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcblxuaW1wb3J0IHJlc29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJ1xuaW1wb3J0IHsgaXNCdWlsdEluLCBpc0V4dGVybmFsTW9kdWxlLCBpc1Njb3BlZCwgaXNTY29wZWRNb2R1bGUgfSBmcm9tICcuLi9jb3JlL2ltcG9ydFR5cGUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5jb25zdCBlbnVtVmFsdWVzID0geyBlbnVtOiBbICdhbHdheXMnLCAnaWdub3JlUGFja2FnZXMnLCAnbmV2ZXInIF0gfVxuY29uc3QgcGF0dGVyblByb3BlcnRpZXMgPSB7XG4gIHR5cGU6ICdvYmplY3QnLFxuICBwYXR0ZXJuUHJvcGVydGllczogeyAnLionOiBlbnVtVmFsdWVzIH0sXG59XG5jb25zdCBwcm9wZXJ0aWVzID0ge1xuICB0eXBlOiAnb2JqZWN0JyxcbiAgcHJvcGVydGllczoge1xuICAgICdwYXR0ZXJuJzogcGF0dGVyblByb3BlcnRpZXMsXG4gICAgJ2lnbm9yZVBhY2thZ2VzJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgfSxcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm9wZXJ0aWVzKGNvbnRleHQpIHtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIGRlZmF1bHRDb25maWc6ICduZXZlcicsXG4gICAgICBwYXR0ZXJuOiB7fSxcbiAgICAgIGlnbm9yZVBhY2thZ2VzOiBmYWxzZSxcbiAgICB9XG5cbiAgICBjb250ZXh0Lm9wdGlvbnMuZm9yRWFjaChvYmogPT4ge1xuXG4gICAgICAvLyBJZiB0aGlzIGlzIGEgc3RyaW5nLCBzZXQgZGVmYXVsdENvbmZpZyB0byBpdHMgdmFsdWVcbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXN1bHQuZGVmYXVsdENvbmZpZyA9IG9ialxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIG5ldyBzdHJ1Y3R1cmUsIHRyYW5zZmVyIGFsbCBwcm9wcyB0byByZXN1bHQucGF0dGVyblxuICAgICAgaWYgKG9iai5wYXR0ZXJuID09PSB1bmRlZmluZWQgJiYgb2JqLmlnbm9yZVBhY2thZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQucGF0dGVybiwgb2JqKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSWYgcGF0dGVybiBpcyBwcm92aWRlZCwgdHJhbnNmZXIgYWxsIHByb3BzXG4gICAgICBpZiAob2JqLnBhdHRlcm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHJlc3VsdC5wYXR0ZXJuLCBvYmoucGF0dGVybilcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaWdub3JlUGFja2FnZXMgaXMgcHJvdmlkZWQsIHRyYW5zZmVyIGl0IHRvIHJlc3VsdFxuICAgICAgaWYgKG9iai5pZ25vcmVQYWNrYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdC5pZ25vcmVQYWNrYWdlcyA9IG9iai5pZ25vcmVQYWNrYWdlc1xuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAocmVzdWx0LmRlZmF1bHRDb25maWcgPT09ICdpZ25vcmVQYWNrYWdlcycpIHtcbiAgICAgIHJlc3VsdC5kZWZhdWx0Q29uZmlnID0gJ2Fsd2F5cydcbiAgICAgIHJlc3VsdC5pZ25vcmVQYWNrYWdlcyA9IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnZXh0ZW5zaW9ucycpLFxuICAgIH0sXG5cbiAgICBzY2hlbWE6IHtcbiAgICAgIGFueU9mOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiBbZW51bVZhbHVlc10sXG4gICAgICAgICAgYWRkaXRpb25hbEl0ZW1zOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgIGVudW1WYWx1ZXMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYWRkaXRpb25hbEl0ZW1zOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgaXRlbXM6IFtwcm9wZXJ0aWVzXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW3BhdHRlcm5Qcm9wZXJ0aWVzXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgZW51bVZhbHVlcyxcbiAgICAgICAgICAgIHBhdHRlcm5Qcm9wZXJ0aWVzLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYWRkaXRpb25hbEl0ZW1zOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cbiAgICBjb25zdCBwcm9wcyA9IGJ1aWxkUHJvcGVydGllcyhjb250ZXh0KVxuXG4gICAgZnVuY3Rpb24gZ2V0TW9kaWZpZXIoZXh0ZW5zaW9uKSB7XG4gICAgICByZXR1cm4gcHJvcHMucGF0dGVybltleHRlbnNpb25dIHx8IHByb3BzLmRlZmF1bHRDb25maWdcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1VzZU9mRXh0ZW5zaW9uUmVxdWlyZWQoZXh0ZW5zaW9uLCBpc1BhY2thZ2UpIHtcbiAgICAgIHJldHVybiBnZXRNb2RpZmllcihleHRlbnNpb24pID09PSAnYWx3YXlzJyAmJiAoIXByb3BzLmlnbm9yZVBhY2thZ2VzIHx8ICFpc1BhY2thZ2UpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVc2VPZkV4dGVuc2lvbkZvcmJpZGRlbihleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBnZXRNb2RpZmllcihleHRlbnNpb24pID09PSAnbmV2ZXInXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNSZXNvbHZhYmxlV2l0aG91dEV4dGVuc2lvbihmaWxlKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZSlcbiAgICAgIGNvbnN0IGZpbGVXaXRob3V0RXh0ZW5zaW9uID0gZmlsZS5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aClcbiAgICAgIGNvbnN0IHJlc29sdmVkRmlsZVdpdGhvdXRFeHRlbnNpb24gPSByZXNvbHZlKGZpbGVXaXRob3V0RXh0ZW5zaW9uLCBjb250ZXh0KVxuXG4gICAgICByZXR1cm4gcmVzb2x2ZWRGaWxlV2l0aG91dEV4dGVuc2lvbiA9PT0gcmVzb2x2ZShmaWxlLCBjb250ZXh0KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRXh0ZXJuYWxSb290TW9kdWxlKGZpbGUpIHtcbiAgICAgIGNvbnN0IHNsYXNoQ291bnQgPSBmaWxlLnNwbGl0KCcvJykubGVuZ3RoIC0gMVxuXG4gICAgICBpZiAoaXNTY29wZWRNb2R1bGUoZmlsZSkgJiYgc2xhc2hDb3VudCA8PSAxKSByZXR1cm4gdHJ1ZVxuICAgICAgaWYgKGlzRXh0ZXJuYWxNb2R1bGUoZmlsZSwgY29udGV4dCwgcmVzb2x2ZShmaWxlLCBjb250ZXh0KSkgJiYgIXNsYXNoQ291bnQpIHJldHVybiB0cnVlXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0ZpbGVFeHRlbnNpb24obm9kZSkge1xuICAgICAgY29uc3QgeyBzb3VyY2UgfSA9IG5vZGVcblxuICAgICAgLy8gYmFpbCBpZiB0aGUgZGVjbGFyYXRpb24gZG9lc24ndCBoYXZlIGEgc291cmNlLCBlLmcuIFwiZXhwb3J0IHsgZm9vIH07XCJcbiAgICAgIGlmICghc291cmNlKSByZXR1cm5cblxuICAgICAgY29uc3QgaW1wb3J0UGF0aFdpdGhRdWVyeVN0cmluZyA9IHNvdXJjZS52YWx1ZVxuXG4gICAgICAvLyBkb24ndCBlbmZvcmNlIGFueXRoaW5nIG9uIGJ1aWx0aW5zXG4gICAgICBpZiAoaXNCdWlsdEluKGltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmcsIGNvbnRleHQuc2V0dGluZ3MpKSByZXR1cm5cblxuICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IGltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmcucmVwbGFjZSgvXFw/KC4qKSQvLCAnJylcblxuICAgICAgLy8gZG9uJ3QgZW5mb3JjZSBpbiByb290IGV4dGVybmFsIHBhY2thZ2VzIGFzIHRoZXkgbWF5IGhhdmUgbmFtZXMgd2l0aCBgLmpzYC5cbiAgICAgIC8vIExpa2UgYGltcG9ydCBEZWNpbWFsIGZyb20gZGVjaW1hbC5qc2ApXG4gICAgICBpZiAoaXNFeHRlcm5hbFJvb3RNb2R1bGUoaW1wb3J0UGF0aCkpIHJldHVyblxuXG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlKGltcG9ydFBhdGgsIGNvbnRleHQpXG5cbiAgICAgIC8vIGdldCBleHRlbnNpb24gZnJvbSByZXNvbHZlZCBwYXRoLCBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGZvciB1bnJlc29sdmVkLCB1c2Ugc291cmNlIHZhbHVlLlxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKHJlc29sdmVkUGF0aCB8fCBpbXBvcnRQYXRoKS5zdWJzdHJpbmcoMSlcblxuICAgICAgLy8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBtb2R1bGVcbiAgICAgIGNvbnN0IGlzUGFja2FnZSA9IGlzRXh0ZXJuYWxNb2R1bGUoaW1wb3J0UGF0aCwgY29udGV4dC5zZXR0aW5ncylcbiAgICAgICAgfHwgaXNTY29wZWQoaW1wb3J0UGF0aClcblxuICAgICAgaWYgKCFleHRlbnNpb24gfHwgIWltcG9ydFBhdGguZW5kc1dpdGgoYC4ke2V4dGVuc2lvbn1gKSkge1xuICAgICAgICBjb25zdCBleHRlbnNpb25SZXF1aXJlZCA9IGlzVXNlT2ZFeHRlbnNpb25SZXF1aXJlZChleHRlbnNpb24sIGlzUGFja2FnZSlcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uRm9yYmlkZGVuID0gaXNVc2VPZkV4dGVuc2lvbkZvcmJpZGRlbihleHRlbnNpb24pXG4gICAgICAgIGlmIChleHRlbnNpb25SZXF1aXJlZCAmJiAhZXh0ZW5zaW9uRm9yYmlkZGVuKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZTogc291cmNlLFxuICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgYE1pc3NpbmcgZmlsZSBleHRlbnNpb24gJHtleHRlbnNpb24gPyBgXCIke2V4dGVuc2lvbn1cIiBgIDogJyd9Zm9yIFwiJHtpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nfVwiYCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaXNVc2VPZkV4dGVuc2lvbkZvcmJpZGRlbihleHRlbnNpb24pICYmIGlzUmVzb2x2YWJsZVdpdGhvdXRFeHRlbnNpb24oaW1wb3J0UGF0aCkpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBzb3VyY2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgVW5leHBlY3RlZCB1c2Ugb2YgZmlsZSBleHRlbnNpb24gXCIke2V4dGVuc2lvbn1cIiBmb3IgXCIke2ltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmd9XCJgLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgSW1wb3J0RGVjbGFyYXRpb246IGNoZWNrRmlsZUV4dGVuc2lvbixcbiAgICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb246IGNoZWNrRmlsZUV4dGVuc2lvbixcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
+      ExportNamedDeclaration: checkFileExtension };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9leHRlbnNpb25zLmpzIl0sIm5hbWVzIjpbImVudW1WYWx1ZXMiLCJlbnVtIiwicGF0dGVyblByb3BlcnRpZXMiLCJ0eXBlIiwicHJvcGVydGllcyIsImJ1aWxkUHJvcGVydGllcyIsImNvbnRleHQiLCJyZXN1bHQiLCJkZWZhdWx0Q29uZmlnIiwicGF0dGVybiIsImlnbm9yZVBhY2thZ2VzIiwib3B0aW9ucyIsImZvckVhY2giLCJvYmoiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJhc3NpZ24iLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJhbnlPZiIsIml0ZW1zIiwiYWRkaXRpb25hbEl0ZW1zIiwiY3JlYXRlIiwicHJvcHMiLCJnZXRNb2RpZmllciIsImV4dGVuc2lvbiIsImlzVXNlT2ZFeHRlbnNpb25SZXF1aXJlZCIsImlzUGFja2FnZSIsImlzVXNlT2ZFeHRlbnNpb25Gb3JiaWRkZW4iLCJpc1Jlc29sdmFibGVXaXRob3V0RXh0ZW5zaW9uIiwiZmlsZSIsInBhdGgiLCJleHRuYW1lIiwiZmlsZVdpdGhvdXRFeHRlbnNpb24iLCJzbGljZSIsImxlbmd0aCIsInJlc29sdmVkRmlsZVdpdGhvdXRFeHRlbnNpb24iLCJpc0V4dGVybmFsUm9vdE1vZHVsZSIsInNsYXNoQ291bnQiLCJzcGxpdCIsImNoZWNrRmlsZUV4dGVuc2lvbiIsIm5vZGUiLCJzb3VyY2UiLCJpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nIiwidmFsdWUiLCJzZXR0aW5ncyIsImltcG9ydFBhdGgiLCJyZXBsYWNlIiwicmVzb2x2ZWRQYXRoIiwic3Vic3RyaW5nIiwiZW5kc1dpdGgiLCJleHRlbnNpb25SZXF1aXJlZCIsImV4dGVuc2lvbkZvcmJpZGRlbiIsInJlcG9ydCIsIm1lc3NhZ2UiLCJJbXBvcnREZWNsYXJhdGlvbiIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iXSwibWFwcGluZ3MiOiJhQUFBLDRCOztBQUVB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d0JoQixrQkFGbkIsRUFBUDs7QUFJRCxHQS9IYyxFQUFqQiIsImZpbGUiOiJleHRlbnNpb25zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcblxuaW1wb3J0IHJlc29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJ1xuaW1wb3J0IHsgaXNCdWlsdEluLCBpc0V4dGVybmFsTW9kdWxlLCBpc1Njb3BlZCwgaXNTY29wZWRNb2R1bGUgfSBmcm9tICcuLi9jb3JlL2ltcG9ydFR5cGUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5jb25zdCBlbnVtVmFsdWVzID0geyBlbnVtOiBbICdhbHdheXMnLCAnaWdub3JlUGFja2FnZXMnLCAnbmV2ZXInIF0gfVxuY29uc3QgcGF0dGVyblByb3BlcnRpZXMgPSB7XG4gIHR5cGU6ICdvYmplY3QnLFxuICBwYXR0ZXJuUHJvcGVydGllczogeyAnLionOiBlbnVtVmFsdWVzIH0sXG59XG5jb25zdCBwcm9wZXJ0aWVzID0ge1xuICB0eXBlOiAnb2JqZWN0JyxcbiAgcHJvcGVydGllczoge1xuICAgICdwYXR0ZXJuJzogcGF0dGVyblByb3BlcnRpZXMsXG4gICAgJ2lnbm9yZVBhY2thZ2VzJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgfSxcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm9wZXJ0aWVzKGNvbnRleHQpIHtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIGRlZmF1bHRDb25maWc6ICduZXZlcicsXG4gICAgICBwYXR0ZXJuOiB7fSxcbiAgICAgIGlnbm9yZVBhY2thZ2VzOiBmYWxzZSxcbiAgICB9XG5cbiAgICBjb250ZXh0Lm9wdGlvbnMuZm9yRWFjaChvYmogPT4ge1xuXG4gICAgICAvLyBJZiB0aGlzIGlzIGEgc3RyaW5nLCBzZXQgZGVmYXVsdENvbmZpZyB0byBpdHMgdmFsdWVcbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXN1bHQuZGVmYXVsdENvbmZpZyA9IG9ialxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIG5ldyBzdHJ1Y3R1cmUsIHRyYW5zZmVyIGFsbCBwcm9wcyB0byByZXN1bHQucGF0dGVyblxuICAgICAgaWYgKG9iai5wYXR0ZXJuID09PSB1bmRlZmluZWQgJiYgb2JqLmlnbm9yZVBhY2thZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQucGF0dGVybiwgb2JqKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSWYgcGF0dGVybiBpcyBwcm92aWRlZCwgdHJhbnNmZXIgYWxsIHByb3BzXG4gICAgICBpZiAob2JqLnBhdHRlcm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHJlc3VsdC5wYXR0ZXJuLCBvYmoucGF0dGVybilcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaWdub3JlUGFja2FnZXMgaXMgcHJvdmlkZWQsIHRyYW5zZmVyIGl0IHRvIHJlc3VsdFxuICAgICAgaWYgKG9iai5pZ25vcmVQYWNrYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdC5pZ25vcmVQYWNrYWdlcyA9IG9iai5pZ25vcmVQYWNrYWdlc1xuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAocmVzdWx0LmRlZmF1bHRDb25maWcgPT09ICdpZ25vcmVQYWNrYWdlcycpIHtcbiAgICAgIHJlc3VsdC5kZWZhdWx0Q29uZmlnID0gJ2Fsd2F5cydcbiAgICAgIHJlc3VsdC5pZ25vcmVQYWNrYWdlcyA9IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnZXh0ZW5zaW9ucycpLFxuICAgIH0sXG5cbiAgICBzY2hlbWE6IHtcbiAgICAgIGFueU9mOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiBbZW51bVZhbHVlc10sXG4gICAgICAgICAgYWRkaXRpb25hbEl0ZW1zOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgIGVudW1WYWx1ZXMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYWRkaXRpb25hbEl0ZW1zOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgaXRlbXM6IFtwcm9wZXJ0aWVzXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW3BhdHRlcm5Qcm9wZXJ0aWVzXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgZW51bVZhbHVlcyxcbiAgICAgICAgICAgIHBhdHRlcm5Qcm9wZXJ0aWVzLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYWRkaXRpb25hbEl0ZW1zOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cbiAgICBjb25zdCBwcm9wcyA9IGJ1aWxkUHJvcGVydGllcyhjb250ZXh0KVxuXG4gICAgZnVuY3Rpb24gZ2V0TW9kaWZpZXIoZXh0ZW5zaW9uKSB7XG4gICAgICByZXR1cm4gcHJvcHMucGF0dGVybltleHRlbnNpb25dIHx8IHByb3BzLmRlZmF1bHRDb25maWdcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1VzZU9mRXh0ZW5zaW9uUmVxdWlyZWQoZXh0ZW5zaW9uLCBpc1BhY2thZ2UpIHtcbiAgICAgIHJldHVybiBnZXRNb2RpZmllcihleHRlbnNpb24pID09PSAnYWx3YXlzJyAmJiAoIXByb3BzLmlnbm9yZVBhY2thZ2VzIHx8ICFpc1BhY2thZ2UpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVc2VPZkV4dGVuc2lvbkZvcmJpZGRlbihleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBnZXRNb2RpZmllcihleHRlbnNpb24pID09PSAnbmV2ZXInXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNSZXNvbHZhYmxlV2l0aG91dEV4dGVuc2lvbihmaWxlKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmV4dG5hbWUoZmlsZSlcbiAgICAgIGNvbnN0IGZpbGVXaXRob3V0RXh0ZW5zaW9uID0gZmlsZS5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aClcbiAgICAgIGNvbnN0IHJlc29sdmVkRmlsZVdpdGhvdXRFeHRlbnNpb24gPSByZXNvbHZlKGZpbGVXaXRob3V0RXh0ZW5zaW9uLCBjb250ZXh0KVxuXG4gICAgICByZXR1cm4gcmVzb2x2ZWRGaWxlV2l0aG91dEV4dGVuc2lvbiA9PT0gcmVzb2x2ZShmaWxlLCBjb250ZXh0KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRXh0ZXJuYWxSb290TW9kdWxlKGZpbGUpIHtcbiAgICAgIGNvbnN0IHNsYXNoQ291bnQgPSBmaWxlLnNwbGl0KCcvJykubGVuZ3RoIC0gMVxuXG4gICAgICBpZiAoaXNTY29wZWRNb2R1bGUoZmlsZSkgJiYgc2xhc2hDb3VudCA8PSAxKSByZXR1cm4gdHJ1ZVxuICAgICAgaWYgKGlzRXh0ZXJuYWxNb2R1bGUoZmlsZSwgY29udGV4dCwgcmVzb2x2ZShmaWxlLCBjb250ZXh0KSkgJiYgIXNsYXNoQ291bnQpIHJldHVybiB0cnVlXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0ZpbGVFeHRlbnNpb24obm9kZSkge1xuICAgICAgY29uc3QgeyBzb3VyY2UgfSA9IG5vZGVcblxuICAgICAgLy8gYmFpbCBpZiB0aGUgZGVjbGFyYXRpb24gZG9lc24ndCBoYXZlIGEgc291cmNlLCBlLmcuIFwiZXhwb3J0IHsgZm9vIH07XCJcbiAgICAgIGlmICghc291cmNlKSByZXR1cm5cblxuICAgICAgY29uc3QgaW1wb3J0UGF0aFdpdGhRdWVyeVN0cmluZyA9IHNvdXJjZS52YWx1ZVxuXG4gICAgICAvLyBkb24ndCBlbmZvcmNlIGFueXRoaW5nIG9uIGJ1aWx0aW5zXG4gICAgICBpZiAoaXNCdWlsdEluKGltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmcsIGNvbnRleHQuc2V0dGluZ3MpKSByZXR1cm5cblxuICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IGltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmcucmVwbGFjZSgvXFw/KC4qKSQvLCAnJylcblxuICAgICAgLy8gZG9uJ3QgZW5mb3JjZSBpbiByb290IGV4dGVybmFsIHBhY2thZ2VzIGFzIHRoZXkgbWF5IGhhdmUgbmFtZXMgd2l0aCBgLmpzYC5cbiAgICAgIC8vIExpa2UgYGltcG9ydCBEZWNpbWFsIGZyb20gZGVjaW1hbC5qc2ApXG4gICAgICBpZiAoaXNFeHRlcm5hbFJvb3RNb2R1bGUoaW1wb3J0UGF0aCkpIHJldHVyblxuXG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlKGltcG9ydFBhdGgsIGNvbnRleHQpXG5cbiAgICAgIC8vIGdldCBleHRlbnNpb24gZnJvbSByZXNvbHZlZCBwYXRoLCBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGZvciB1bnJlc29sdmVkLCB1c2Ugc291cmNlIHZhbHVlLlxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKHJlc29sdmVkUGF0aCB8fCBpbXBvcnRQYXRoKS5zdWJzdHJpbmcoMSlcblxuICAgICAgLy8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBtb2R1bGVcbiAgICAgIGNvbnN0IGlzUGFja2FnZSA9IGlzRXh0ZXJuYWxNb2R1bGUoaW1wb3J0UGF0aCwgY29udGV4dC5zZXR0aW5ncylcbiAgICAgICAgfHwgaXNTY29wZWQoaW1wb3J0UGF0aClcblxuICAgICAgaWYgKCFleHRlbnNpb24gfHwgIWltcG9ydFBhdGguZW5kc1dpdGgoYC4ke2V4dGVuc2lvbn1gKSkge1xuICAgICAgICBjb25zdCBleHRlbnNpb25SZXF1aXJlZCA9IGlzVXNlT2ZFeHRlbnNpb25SZXF1aXJlZChleHRlbnNpb24sIGlzUGFja2FnZSlcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uRm9yYmlkZGVuID0gaXNVc2VPZkV4dGVuc2lvbkZvcmJpZGRlbihleHRlbnNpb24pXG4gICAgICAgIGlmIChleHRlbnNpb25SZXF1aXJlZCAmJiAhZXh0ZW5zaW9uRm9yYmlkZGVuKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZTogc291cmNlLFxuICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgYE1pc3NpbmcgZmlsZSBleHRlbnNpb24gJHtleHRlbnNpb24gPyBgXCIke2V4dGVuc2lvbn1cIiBgIDogJyd9Zm9yIFwiJHtpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nfVwiYCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaXNVc2VPZkV4dGVuc2lvbkZvcmJpZGRlbihleHRlbnNpb24pICYmIGlzUmVzb2x2YWJsZVdpdGhvdXRFeHRlbnNpb24oaW1wb3J0UGF0aCkpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBzb3VyY2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgVW5leHBlY3RlZCB1c2Ugb2YgZmlsZSBleHRlbnNpb24gXCIke2V4dGVuc2lvbn1cIiBmb3IgXCIke2ltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmd9XCJgLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgSW1wb3J0RGVjbGFyYXRpb246IGNoZWNrRmlsZUV4dGVuc2lvbixcbiAgICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb246IGNoZWNrRmlsZUV4dGVuc2lvbixcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/first.js b/node_modules/eslint-plugin-import/lib/rules/first.js
index cf24346..02d8229 100644
--- a/node_modules/eslint-plugin-import/lib/rules/first.js
+++ b/node_modules/eslint-plugin-import/lib/rules/first.js
@@ -1,43 +1,41 @@
-'use strict';
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('first')
-    },
+      url: (0, _docsUrl2.default)('first') },
+
     fixable: 'code',
-    schema: [{
+    schema: [
+    {
       type: 'string',
-      enum: ['absolute-first']
-    }]
-  },
+      enum: ['absolute-first', 'disable-absolute-first'] }] },
+
+
+
 
   create: function (context) {
     function isPossibleDirective(node) {
-      return node.type === 'ExpressionStatement' && node.expression.type === 'Literal' && typeof node.expression.value === 'string';
+      return node.type === 'ExpressionStatement' &&
+      node.expression.type === 'Literal' &&
+      typeof node.expression.value === 'string';
     }
 
     return {
       'Program': function (n) {
         const body = n.body,
-              absoluteFirst = context.options[0] === 'absolute-first',
-              message = 'Import in body of module; reorder to top.',
-              sourceCode = context.getSourceCode(),
-              originSourceCode = sourceCode.getText();
+        absoluteFirst = context.options[0] === 'absolute-first',
+        message = 'Import in body of module; reorder to top.',
+        sourceCode = context.getSourceCode(),
+        originSourceCode = sourceCode.getText();
         let nonImportCount = 0,
-            anyExpressions = false,
-            anyRelative = false,
-            lastLegalImp = null,
-            errorInfos = [],
-            shouldSort = true,
-            lastSortNodesIndex = 0;
+        anyExpressions = false,
+        anyRelative = false,
+        lastLegalImp = null,
+        errorInfos = [],
+        shouldSort = true,
+        lastSortNodesIndex = 0;
         body.forEach(function (node, index) {
           if (!anyExpressions && isPossibleDirective(node)) {
             return;
@@ -52,8 +50,8 @@
               } else if (anyRelative) {
                 context.report({
                   node: node.source,
-                  message: 'Absolute imports should come before relative imports.'
-                });
+                  message: 'Absolute imports should come before relative imports.' });
+
               }
             }
             if (nonImportCount > 0) {
@@ -72,8 +70,8 @@
               shouldSort && (lastSortNodesIndex = errorInfos.length);
               errorInfos.push({
                 node,
-                range: [body[index - 1].range[1], node.range[1]]
-              });
+                range: [body[index - 1].range[1], node.range[1]] });
+
             } else {
               lastLegalImp = node;
             }
@@ -84,10 +82,10 @@
         if (!errorInfos.length) return;
         errorInfos.forEach(function (errorInfo, index) {
           const node = errorInfo.node,
-                infos = {
+          infos = {
             node,
-            message
-          };
+            message };
+
           if (index < lastSortNodesIndex) {
             infos.fix = function (fixer) {
               return fixer.insertTextAfter(node, '');
@@ -98,31 +96,37 @@
               const removeFixers = sortNodes.map(function (_errorInfo) {
                 return fixer.removeRange(_errorInfo.range);
               }),
-                    range = [0, removeFixers[removeFixers.length - 1].range[1]];
+              range = [0, removeFixers[removeFixers.length - 1].range[1]];
               let insertSourceCode = sortNodes.map(function (_errorInfo) {
-                const nodeSourceCode = String.prototype.slice.apply(originSourceCode, _errorInfo.range);
+                const nodeSourceCode = String.prototype.slice.apply(
+                originSourceCode, _errorInfo.range);
+
                 if (/\S/.test(nodeSourceCode[0])) {
                   return '\n' + nodeSourceCode;
                 }
                 return nodeSourceCode;
               }).join(''),
-                  insertFixer = null,
-                  replaceSourceCode = '';
+              insertFixer = null,
+              replaceSourceCode = '';
               if (!lastLegalImp) {
-                insertSourceCode = insertSourceCode.trim() + insertSourceCode.match(/^(\s+)/)[0];
+                insertSourceCode =
+                insertSourceCode.trim() + insertSourceCode.match(/^(\s+)/)[0];
               }
-              insertFixer = lastLegalImp ? fixer.insertTextAfter(lastLegalImp, insertSourceCode) : fixer.insertTextBefore(body[0], insertSourceCode);
+              insertFixer = lastLegalImp ?
+              fixer.insertTextAfter(lastLegalImp, insertSourceCode) :
+              fixer.insertTextBefore(body[0], insertSourceCode);
               const fixers = [insertFixer].concat(removeFixers);
               fixers.forEach(function (computedFixer, i) {
-                replaceSourceCode += originSourceCode.slice(fixers[i - 1] ? fixers[i - 1].range[1] : 0, computedFixer.range[0]) + computedFixer.text;
+                replaceSourceCode += originSourceCode.slice(
+                fixers[i - 1] ? fixers[i - 1].range[1] : 0, computedFixer.range[0]) +
+                computedFixer.text;
               });
               return fixer.replaceTextRange(range, replaceSourceCode);
             };
           }
           context.report(infos);
         });
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9maXJzdC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwiZml4YWJsZSIsInNjaGVtYSIsImVudW0iLCJjcmVhdGUiLCJjb250ZXh0IiwiaXNQb3NzaWJsZURpcmVjdGl2ZSIsIm5vZGUiLCJleHByZXNzaW9uIiwidmFsdWUiLCJuIiwiYm9keSIsImFic29sdXRlRmlyc3QiLCJvcHRpb25zIiwibWVzc2FnZSIsInNvdXJjZUNvZGUiLCJnZXRTb3VyY2VDb2RlIiwib3JpZ2luU291cmNlQ29kZSIsImdldFRleHQiLCJub25JbXBvcnRDb3VudCIsImFueUV4cHJlc3Npb25zIiwiYW55UmVsYXRpdmUiLCJsYXN0TGVnYWxJbXAiLCJlcnJvckluZm9zIiwic2hvdWxkU29ydCIsImxhc3RTb3J0Tm9kZXNJbmRleCIsImZvckVhY2giLCJpbmRleCIsInRlc3QiLCJzb3VyY2UiLCJyZXBvcnQiLCJ2YXJpYWJsZSIsImdldERlY2xhcmVkVmFyaWFibGVzIiwicmVmZXJlbmNlcyIsImxlbmd0aCIsInJlZmVyZW5jZSIsImlkZW50aWZpZXIiLCJyYW5nZSIsInB1c2giLCJlcnJvckluZm8iLCJpbmZvcyIsImZpeCIsImZpeGVyIiwiaW5zZXJ0VGV4dEFmdGVyIiwic29ydE5vZGVzIiwic2xpY2UiLCJyZW1vdmVGaXhlcnMiLCJtYXAiLCJfZXJyb3JJbmZvIiwicmVtb3ZlUmFuZ2UiLCJpbnNlcnRTb3VyY2VDb2RlIiwibm9kZVNvdXJjZUNvZGUiLCJTdHJpbmciLCJwcm90b3R5cGUiLCJhcHBseSIsImpvaW4iLCJpbnNlcnRGaXhlciIsInJlcGxhY2VTb3VyY2VDb2RlIiwidHJpbSIsIm1hdGNoIiwiaW5zZXJ0VGV4dEJlZm9yZSIsImZpeGVycyIsImNvbmNhdCIsImNvbXB1dGVkRml4ZXIiLCJpIiwidGV4dCIsInJlcGxhY2VUZXh0UmFuZ2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7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QUNELHVCQUFPQSxjQUFQO0FBQ0QsZUFSa0IsRUFRaEJJLElBUmdCLENBUVgsRUFSVyxDQUF2QjtBQUFBLGtCQVNJQyxjQUFjLElBVGxCO0FBQUEsa0JBVUlDLG9CQUFvQixFQVZ4QjtBQVdBLGtCQUFJLENBQUNuQyxZQUFMLEVBQW1CO0FBQ2Y0QixtQ0FDRUEsaUJBQWlCUSxJQUFqQixLQUEwQlIsaUJBQWlCUyxLQUFqQixDQUF1QixRQUF2QixFQUFpQyxDQUFqQyxDQUQ1QjtBQUVIO0FBQ0RILDRCQUFjbEMsZUFDQW9CLE1BQU1DLGVBQU4sQ0FBc0JyQixZQUF0QixFQUFvQzRCLGdCQUFwQyxDQURBLEdBRUFSLE1BQU1rQixnQkFBTixDQUF1QmpELEtBQUssQ0FBTCxDQUF2QixFQUFnQ3VDLGdCQUFoQyxDQUZkO0FBR0Esb0JBQU1XLFNBQVMsQ0FBQ0wsV0FBRCxFQUFjTSxNQUFkLENBQXFCaEIsWUFBckIsQ0FBZjtBQUNBZSxxQkFBT25DLE9BQVAsQ0FBZSxVQUFVcUMsYUFBVixFQUF5QkMsQ0FBekIsRUFBNEI7QUFDekNQLHFDQUFzQnhDLGlCQUFpQjRCLEtBQWpCLENBQ3BCZ0IsT0FBT0csSUFBSSxDQUFYLElBQWdCSCxPQUFPRyxJQUFJLENBQVgsRUFBYzNCLEtBQWQsQ0FBb0IsQ0FBcEIsQ0FBaEIsR0FBeUMsQ0FEckIsRUFDd0IwQixjQUFjMUIsS0FBZCxDQUFvQixDQUFwQixDQUR4QixJQUVsQjBCLGNBQWNFLElBRmxCO0FBR0QsZUFKRDtBQUtBLHFCQUFPdkIsTUFBTXdCLGdCQUFOLENBQXVCN0IsS0FBdkIsRUFBOEJvQixpQkFBOUIsQ0FBUDtBQUNELGFBOUJEO0FBK0JEO0FBQ0RwRCxrQkFBUXlCLE1BQVIsQ0FBZVUsS0FBZjtBQUNELFNBN0NEO0FBOENEO0FBeEdJLEtBQVA7QUEwR0Q7QUFoSWMsQ0FBakIiLCJmaWxlIjoiZmlyc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ2ZpcnN0JyksXG4gICAgfSxcbiAgICBmaXhhYmxlOiAnY29kZScsXG4gICAgc2NoZW1hOiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBlbnVtOiBbJ2Fic29sdXRlLWZpcnN0J10sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIGZ1bmN0aW9uIGlzUG9zc2libGVEaXJlY3RpdmUgKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyAmJlxuICAgICAgICBub2RlLmV4cHJlc3Npb24udHlwZSA9PT0gJ0xpdGVyYWwnICYmXG4gICAgICAgIHR5cGVvZiBub2RlLmV4cHJlc3Npb24udmFsdWUgPT09ICdzdHJpbmcnXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICdQcm9ncmFtJzogZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgY29uc3QgYm9keSA9IG4uYm9keVxuICAgICAgICAgICAgLCBhYnNvbHV0ZUZpcnN0ID0gY29udGV4dC5vcHRpb25zWzBdID09PSAnYWJzb2x1dGUtZmlyc3QnXG4gICAgICAgICAgICAsIG1lc3NhZ2UgPSAnSW1wb3J0IGluIGJvZHkgb2YgbW9kdWxlOyByZW9yZGVyIHRvIHRvcC4nXG4gICAgICAgICAgICAsIHNvdXJjZUNvZGUgPSBjb250ZXh0LmdldFNvdXJjZUNvZGUoKVxuICAgICAgICAgICAgLCBvcmlnaW5Tb3VyY2VDb2RlID0gc291cmNlQ29kZS5nZXRUZXh0KClcbiAgICAgICAgbGV0IG5vbkltcG9ydENvdW50ID0gMFxuICAgICAgICAgICwgYW55RXhwcmVzc2lvbnMgPSBmYWxzZVxuICAgICAgICAgICwgYW55UmVsYXRpdmUgPSBmYWxzZVxuICAgICAgICAgICwgbGFzdExlZ2FsSW1wID0gbnVsbFxuICAgICAgICAgICwgZXJyb3JJbmZvcyA9IFtdXG4gICAgICAgICAgLCBzaG91bGRTb3J0ID0gdHJ1ZVxuICAgICAgICAgICwgbGFzdFNvcnROb2Rlc0luZGV4ID0gMFxuICAgICAgICBib2R5LmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGluZGV4KXtcbiAgICAgICAgICBpZiAoIWFueUV4cHJlc3Npb25zICYmIGlzUG9zc2libGVEaXJlY3RpdmUobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFueUV4cHJlc3Npb25zID0gdHJ1ZVxuXG4gICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0ltcG9ydERlY2xhcmF0aW9uJykge1xuICAgICAgICAgICAgaWYgKGFic29sdXRlRmlyc3QpIHtcbiAgICAgICAgICAgICAgaWYgKC9eXFwuLy50ZXN0KG5vZGUuc291cmNlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGFueVJlbGF0aXZlID0gdHJ1ZVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFueVJlbGF0aXZlKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgICAgICAgbm9kZTogbm9kZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWJzb2x1dGUgaW1wb3J0cyBzaG91bGQgY29tZSBiZWZvcmUgcmVsYXRpdmUgaW1wb3J0cy4nLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub25JbXBvcnRDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgdmFyaWFibGUgb2YgY29udGV4dC5nZXREZWNsYXJlZFZhcmlhYmxlcyhub2RlKSkge1xuICAgICAgICAgICAgICAgIGlmICghc2hvdWxkU29ydCkgYnJlYWtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZlcmVuY2VzID0gdmFyaWFibGUucmVmZXJlbmNlc1xuICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZS5pZGVudGlmaWVyLnJhbmdlWzBdIDwgbm9kZS5yYW5nZVsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFNvcnQgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2hvdWxkU29ydCAmJiAobGFzdFNvcnROb2Rlc0luZGV4ID0gZXJyb3JJbmZvcy5sZW5ndGgpXG4gICAgICAgICAgICAgIGVycm9ySW5mb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICByYW5nZTogW2JvZHlbaW5kZXggLSAxXS5yYW5nZVsxXSwgbm9kZS5yYW5nZVsxXV0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsYXN0TGVnYWxJbXAgPSBub2RlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vbkltcG9ydENvdW50KytcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGlmICghZXJyb3JJbmZvcy5sZW5ndGgpIHJldHVyblxuICAgICAgICBlcnJvckluZm9zLmZvckVhY2goZnVuY3Rpb24gKGVycm9ySW5mbywgaW5kZXgpIHtcbiAgICAgICAgICBjb25zdCBub2RlID0gZXJyb3JJbmZvLm5vZGVcbiAgICAgICAgICAgICAgLCBpbmZvcyA9IHtcbiAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaW5kZXggPCBsYXN0U29ydE5vZGVzSW5kZXgpIHtcbiAgICAgICAgICAgIGluZm9zLmZpeCA9IGZ1bmN0aW9uIChmaXhlcikge1xuICAgICAgICAgICAgICByZXR1cm4gZml4ZXIuaW5zZXJ0VGV4dEFmdGVyKG5vZGUsICcnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IGxhc3RTb3J0Tm9kZXNJbmRleCkge1xuICAgICAgICAgICAgY29uc3Qgc29ydE5vZGVzID0gZXJyb3JJbmZvcy5zbGljZSgwLCBsYXN0U29ydE5vZGVzSW5kZXggKyAxKVxuICAgICAgICAgICAgaW5mb3MuZml4ID0gZnVuY3Rpb24gKGZpeGVyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUZpeGVycyA9IHNvcnROb2Rlcy5tYXAoZnVuY3Rpb24gKF9lcnJvckluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpeGVyLnJlbW92ZVJhbmdlKF9lcnJvckluZm8ucmFuZ2UpXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgLCByYW5nZSA9IFswLCByZW1vdmVGaXhlcnNbcmVtb3ZlRml4ZXJzLmxlbmd0aCAtIDFdLnJhbmdlWzFdXVxuICAgICAgICAgICAgICBsZXQgaW5zZXJ0U291cmNlQ29kZSA9IHNvcnROb2Rlcy5tYXAoZnVuY3Rpb24gKF9lcnJvckluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZVNvdXJjZUNvZGUgPSBTdHJpbmcucHJvdG90eXBlLnNsaWNlLmFwcGx5KFxuICAgICAgICAgICAgICAgICAgICAgIG9yaWdpblNvdXJjZUNvZGUsIF9lcnJvckluZm8ucmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBpZiAoL1xcUy8udGVzdChub2RlU291cmNlQ29kZVswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1xcbicgKyBub2RlU291cmNlQ29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlU291cmNlQ29kZVxuICAgICAgICAgICAgICAgICAgfSkuam9pbignJylcbiAgICAgICAgICAgICAgICAsIGluc2VydEZpeGVyID0gbnVsbFxuICAgICAgICAgICAgICAgICwgcmVwbGFjZVNvdXJjZUNvZGUgPSAnJ1xuICAgICAgICAgICAgICBpZiAoIWxhc3RMZWdhbEltcCkge1xuICAgICAgICAgICAgICAgICAgaW5zZXJ0U291cmNlQ29kZSA9XG4gICAgICAgICAgICAgICAgICAgIGluc2VydFNvdXJjZUNvZGUudHJpbSgpICsgaW5zZXJ0U291cmNlQ29kZS5tYXRjaCgvXihcXHMrKS8pWzBdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaW5zZXJ0Rml4ZXIgPSBsYXN0TGVnYWxJbXAgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVyLmluc2VydFRleHRBZnRlcihsYXN0TGVnYWxJbXAsIGluc2VydFNvdXJjZUNvZGUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlci5pbnNlcnRUZXh0QmVmb3JlKGJvZHlbMF0sIGluc2VydFNvdXJjZUNvZGUpXG4gICAgICAgICAgICAgIGNvbnN0IGZpeGVycyA9IFtpbnNlcnRGaXhlcl0uY29uY2F0KHJlbW92ZUZpeGVycylcbiAgICAgICAgICAgICAgZml4ZXJzLmZvckVhY2goZnVuY3Rpb24gKGNvbXB1dGVkRml4ZXIsIGkpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlU291cmNlQ29kZSArPSAob3JpZ2luU291cmNlQ29kZS5zbGljZShcbiAgICAgICAgICAgICAgICAgIGZpeGVyc1tpIC0gMV0gPyBmaXhlcnNbaSAtIDFdLnJhbmdlWzFdIDogMCwgY29tcHV0ZWRGaXhlci5yYW5nZVswXVxuICAgICAgICAgICAgICAgICkgKyBjb21wdXRlZEZpeGVyLnRleHQpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJldHVybiBmaXhlci5yZXBsYWNlVGV4dFJhbmdlKHJhbmdlLCByZXBsYWNlU291cmNlQ29kZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoaW5mb3MpXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgIH1cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9maXJzdC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwiZml4YWJsZSIsInNjaGVtYSIsImVudW0iLCJjcmVhdGUiLCJjb250ZXh0IiwiaXNQb3NzaWJsZURpcmVjdGl2ZSIsIm5vZGUiLCJleHByZXNzaW9uIiwidmFsdWUiLCJuIiwiYm9keSIsImFic29sdXRlRmlyc3QiLCJvcHRpb25zIiwibWVzc2FnZSIsInNvdXJjZUNvZGUiLCJnZXRTb3VyY2VDb2RlIiwib3JpZ2luU291cmNlQ29kZSIsImdldFRleHQiLCJub25JbXBvcnRDb3VudCIsImFueUV4cHJlc3Npb25zIiwiYW55UmVsYXRpdmUiLCJsYXN0TGVnYWxJbXAiLCJlcnJvckluZm9zIiwic2hvdWxkU29ydCIsImxhc3RTb3J0Tm9kZXNJbmRleCIsImZvckVhY2giLCJpbmRleCIsInRlc3QiLCJzb3VyY2UiLCJyZXBvcnQiLCJ2YXJpYWJsZSIsImdldERlY2xhcmVkVmFyaWFibGVzIiwicmVmZXJlbmNlcyIsImxlbmd0aCIsInJlZmVyZW5jZSIsImlkZW50aWZpZXIiLCJyYW5nZSIsInB1c2giLCJlcnJvckluZm8iLCJpbmZvcyIsImZpeCIsImZpeGVyIiwiaW5zZXJ0VGV4dEFmdGVyIiwic29ydE5vZGVzIiwic2xpY2UiLCJyZW1vdmVGaXhlcnMiLCJtYXAiLCJfZXJyb3JJbmZvIiwicmVtb3ZlUmFuZ2UiLCJpbnNlcnRTb3VyY2VDb2RlIiwibm9kZVNvdXJjZUNvZGUiLCJTdHJpbmciLCJwcm90b3R5cGUiLCJhcHBseSIsImpvaW4iLCJpbnNlcnRGaXhlciIsInJlcGxhY2VTb3VyY2VDb2RlIiwidHJpbSIsIm1hdGNoIiwiaW5zZXJ0VGV4dEJlZm9yZSIsImZpeGVycyIsImNvbmNhdCIsImNvbXB1dGVkRml4ZXIiLCJpIiwidGV4dCIsInJlcGxhY2VUZXh0UmFuZ2UiXSwibWFwcGluZ3MiOiJhQUFBLHFD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QVJnQixDQVFYLEVBUlcsQ0FBdkI7QUFTSUMsNEJBQWMsSUFUbEI7QUFVSUMsa0NBQW9CLEVBVnhCO0FBV0Esa0JBQUksQ0FBQ25DLFlBQUwsRUFBbUI7QUFDZjRCO0FBQ0VBLGlDQUFpQlEsSUFBakIsS0FBMEJSLGlCQUFpQlMsS0FBakIsQ0FBdUIsUUFBdkIsRUFBaUMsQ0FBakMsQ0FENUI7QUFFSDtBQUNESCw0QkFBY2xDO0FBQ0FvQixvQkFBTUMsZUFBTixDQUFzQnJCLFlBQXRCLEVBQW9DNEIsZ0JBQXBDLENBREE7QUFFQVIsb0JBQU1rQixnQkFBTixDQUF1QmpELEtBQUssQ0FBTCxDQUF2QixFQUFnQ3VDLGdCQUFoQyxDQUZkO0FBR0Esb0JBQU1XLFNBQVMsQ0FBQ0wsV0FBRCxFQUFjTSxNQUFkLENBQXFCaEIsWUFBckIsQ0FBZjtBQUNBZSxxQkFBT25DLE9BQVAsQ0FBZSxVQUFVcUMsYUFBVixFQUF5QkMsQ0FBekIsRUFBNEI7QUFDekNQLHFDQUFzQnhDLGlCQUFpQjRCLEtBQWpCO0FBQ3BCZ0IsdUJBQU9HLElBQUksQ0FBWCxJQUFnQkgsT0FBT0csSUFBSSxDQUFYLEVBQWMzQixLQUFkLENBQW9CLENBQXBCLENBQWhCLEdBQXlDLENBRHJCLEVBQ3dCMEIsY0FBYzFCLEtBQWQsQ0FBb0IsQ0FBcEIsQ0FEeEI7QUFFbEIwQiw4QkFBY0UsSUFGbEI7QUFHRCxlQUpEO0FBS0EscUJBQU92QixNQUFNd0IsZ0JBQU4sQ0FBdUI3QixLQUF2QixFQUE4Qm9CLGlCQUE5QixDQUFQO0FBQ0QsYUE5QkQ7QUErQkQ7QUFDRHBELGtCQUFReUIsTUFBUixDQUFlVSxLQUFmO0FBQ0QsU0E3Q0Q7QUE4Q0QsT0F4R0ksRUFBUDs7QUEwR0QsR0FoSWMsRUFBakIiLCJmaWxlIjoiZmlyc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ2ZpcnN0JyksXG4gICAgfSxcbiAgICBmaXhhYmxlOiAnY29kZScsXG4gICAgc2NoZW1hOiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBlbnVtOiBbJ2Fic29sdXRlLWZpcnN0JywgJ2Rpc2FibGUtYWJzb2x1dGUtZmlyc3QnXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgZnVuY3Rpb24gaXNQb3NzaWJsZURpcmVjdGl2ZSAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnICYmXG4gICAgICAgIG5vZGUuZXhwcmVzc2lvbi50eXBlID09PSAnTGl0ZXJhbCcgJiZcbiAgICAgICAgdHlwZW9mIG5vZGUuZXhwcmVzc2lvbi52YWx1ZSA9PT0gJ3N0cmluZydcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ1Byb2dyYW0nOiBmdW5jdGlvbiAobikge1xuICAgICAgICBjb25zdCBib2R5ID0gbi5ib2R5XG4gICAgICAgICAgICAsIGFic29sdXRlRmlyc3QgPSBjb250ZXh0Lm9wdGlvbnNbMF0gPT09ICdhYnNvbHV0ZS1maXJzdCdcbiAgICAgICAgICAgICwgbWVzc2FnZSA9ICdJbXBvcnQgaW4gYm9keSBvZiBtb2R1bGU7IHJlb3JkZXIgdG8gdG9wLidcbiAgICAgICAgICAgICwgc291cmNlQ29kZSA9IGNvbnRleHQuZ2V0U291cmNlQ29kZSgpXG4gICAgICAgICAgICAsIG9yaWdpblNvdXJjZUNvZGUgPSBzb3VyY2VDb2RlLmdldFRleHQoKVxuICAgICAgICBsZXQgbm9uSW1wb3J0Q291bnQgPSAwXG4gICAgICAgICAgLCBhbnlFeHByZXNzaW9ucyA9IGZhbHNlXG4gICAgICAgICAgLCBhbnlSZWxhdGl2ZSA9IGZhbHNlXG4gICAgICAgICAgLCBsYXN0TGVnYWxJbXAgPSBudWxsXG4gICAgICAgICAgLCBlcnJvckluZm9zID0gW11cbiAgICAgICAgICAsIHNob3VsZFNvcnQgPSB0cnVlXG4gICAgICAgICAgLCBsYXN0U29ydE5vZGVzSW5kZXggPSAwXG4gICAgICAgIGJvZHkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSwgaW5kZXgpe1xuICAgICAgICAgIGlmICghYW55RXhwcmVzc2lvbnMgJiYgaXNQb3NzaWJsZURpcmVjdGl2ZShub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYW55RXhwcmVzc2lvbnMgPSB0cnVlXG5cbiAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnSW1wb3J0RGVjbGFyYXRpb24nKSB7XG4gICAgICAgICAgICBpZiAoYWJzb2x1dGVGaXJzdCkge1xuICAgICAgICAgICAgICBpZiAoL15cXC4vLnRlc3Qobm9kZS5zb3VyY2UudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgYW55UmVsYXRpdmUgPSB0cnVlXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW55UmVsYXRpdmUpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgICAgICBub2RlOiBub2RlLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdBYnNvbHV0ZSBpbXBvcnRzIHNob3VsZCBjb21lIGJlZm9yZSByZWxhdGl2ZSBpbXBvcnRzLicsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vbkltcG9ydENvdW50ID4gMCkge1xuICAgICAgICAgICAgICBmb3IgKGxldCB2YXJpYWJsZSBvZiBjb250ZXh0LmdldERlY2xhcmVkVmFyaWFibGVzKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzaG91bGRTb3J0KSBicmVha1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZXMgPSB2YXJpYWJsZS5yZWZlcmVuY2VzXG4gICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlLmlkZW50aWZpZXIucmFuZ2VbMF0gPCBub2RlLnJhbmdlWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2hvdWxkU29ydCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzaG91bGRTb3J0ICYmIChsYXN0U29ydE5vZGVzSW5kZXggPSBlcnJvckluZm9zLmxlbmd0aClcbiAgICAgICAgICAgICAgZXJyb3JJbmZvcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBbYm9keVtpbmRleCAtIDFdLnJhbmdlWzFdLCBub2RlLnJhbmdlWzFdXSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxhc3RMZWdhbEltcCA9IG5vZGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9uSW1wb3J0Q291bnQrK1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgaWYgKCFlcnJvckluZm9zLmxlbmd0aCkgcmV0dXJuXG4gICAgICAgIGVycm9ySW5mb3MuZm9yRWFjaChmdW5jdGlvbiAoZXJyb3JJbmZvLCBpbmRleCkge1xuICAgICAgICAgIGNvbnN0IG5vZGUgPSBlcnJvckluZm8ubm9kZVxuICAgICAgICAgICAgICAsIGluZm9zID0ge1xuICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbmRleCA8IGxhc3RTb3J0Tm9kZXNJbmRleCkge1xuICAgICAgICAgICAgaW5mb3MuZml4ID0gZnVuY3Rpb24gKGZpeGVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmaXhlci5pbnNlcnRUZXh0QWZ0ZXIobm9kZSwgJycpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PT0gbGFzdFNvcnROb2Rlc0luZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBzb3J0Tm9kZXMgPSBlcnJvckluZm9zLnNsaWNlKDAsIGxhc3RTb3J0Tm9kZXNJbmRleCArIDEpXG4gICAgICAgICAgICBpbmZvcy5maXggPSBmdW5jdGlvbiAoZml4ZXIpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlRml4ZXJzID0gc29ydE5vZGVzLm1hcChmdW5jdGlvbiAoX2Vycm9ySW5mbykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZml4ZXIucmVtb3ZlUmFuZ2UoX2Vycm9ySW5mby5yYW5nZSlcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAsIHJhbmdlID0gWzAsIHJlbW92ZUZpeGVyc1tyZW1vdmVGaXhlcnMubGVuZ3RoIC0gMV0ucmFuZ2VbMV1dXG4gICAgICAgICAgICAgIGxldCBpbnNlcnRTb3VyY2VDb2RlID0gc29ydE5vZGVzLm1hcChmdW5jdGlvbiAoX2Vycm9ySW5mbykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlU291cmNlQ29kZSA9IFN0cmluZy5wcm90b3R5cGUuc2xpY2UuYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgICAgb3JpZ2luU291cmNlQ29kZSwgX2Vycm9ySW5mby5yYW5nZVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIGlmICgvXFxTLy50ZXN0KG5vZGVTb3VyY2VDb2RlWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnXFxuJyArIG5vZGVTb3VyY2VDb2RlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVTb3VyY2VDb2RlXG4gICAgICAgICAgICAgICAgICB9KS5qb2luKCcnKVxuICAgICAgICAgICAgICAgICwgaW5zZXJ0Rml4ZXIgPSBudWxsXG4gICAgICAgICAgICAgICAgLCByZXBsYWNlU291cmNlQ29kZSA9ICcnXG4gICAgICAgICAgICAgIGlmICghbGFzdExlZ2FsSW1wKSB7XG4gICAgICAgICAgICAgICAgICBpbnNlcnRTb3VyY2VDb2RlID1cbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0U291cmNlQ29kZS50cmltKCkgKyBpbnNlcnRTb3VyY2VDb2RlLm1hdGNoKC9eKFxccyspLylbMF1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnNlcnRGaXhlciA9IGxhc3RMZWdhbEltcCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZXIuaW5zZXJ0VGV4dEFmdGVyKGxhc3RMZWdhbEltcCwgaW5zZXJ0U291cmNlQ29kZSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVyLmluc2VydFRleHRCZWZvcmUoYm9keVswXSwgaW5zZXJ0U291cmNlQ29kZSlcbiAgICAgICAgICAgICAgY29uc3QgZml4ZXJzID0gW2luc2VydEZpeGVyXS5jb25jYXQocmVtb3ZlRml4ZXJzKVxuICAgICAgICAgICAgICBmaXhlcnMuZm9yRWFjaChmdW5jdGlvbiAoY29tcHV0ZWRGaXhlciwgaSkge1xuICAgICAgICAgICAgICAgIHJlcGxhY2VTb3VyY2VDb2RlICs9IChvcmlnaW5Tb3VyY2VDb2RlLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgZml4ZXJzW2kgLSAxXSA/IGZpeGVyc1tpIC0gMV0ucmFuZ2VbMV0gOiAwLCBjb21wdXRlZEZpeGVyLnJhbmdlWzBdXG4gICAgICAgICAgICAgICAgKSArIGNvbXB1dGVkRml4ZXIudGV4dClcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIGZpeGVyLnJlcGxhY2VUZXh0UmFuZ2UocmFuZ2UsIHJlcGxhY2VTb3VyY2VDb2RlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZXh0LnJlcG9ydChpbmZvcylcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/group-exports.js b/node_modules/eslint-plugin-import/lib/rules/group-exports.js
index fb2cf71..42f6b49 100644
--- a/node_modules/eslint-plugin-import/lib/rules/group-exports.js
+++ b/node_modules/eslint-plugin-import/lib/rules/group-exports.js
@@ -1,43 +1,33 @@
-'use strict';
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-var _object = require('object.values');
-
-var _object2 = _interopRequireDefault(_object);
-
-var _arrayPrototype = require('array.prototype.flat');
-
-var _arrayPrototype2 = _interopRequireDefault(_arrayPrototype);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);
+var _object = require('object.values');var _object2 = _interopRequireDefault(_object);
+var _arrayPrototype = require('array.prototype.flat');var _arrayPrototype2 = _interopRequireDefault(_arrayPrototype);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 const meta = {
   type: 'suggestion',
   docs: {
-    url: (0, _docsUrl2.default)('group-exports')
-  }
-  /* eslint-disable max-len */
-};const errors = {
+    url: (0, _docsUrl2.default)('group-exports') }
+
+
+  /* eslint-disable max-len */ };
+const errors = {
   ExportNamedDeclaration: 'Multiple named export declarations; consolidate all named exports into a single export declaration',
   AssignmentExpression: 'Multiple CommonJS exports; consolidate all exports into a single assignment to `module.exports`'
+
   /* eslint-enable max-len */
 
   /**
-   * Returns an array with names of the properties in the accessor chain for MemberExpression nodes
-   *
-   * Example:
-   *
-   * `module.exports = {}` => ['module', 'exports']
-   * `module.exports.property = true` => ['module', 'exports', 'property']
-   *
-   * @param     {Node}    node    AST Node (MemberExpression)
-   * @return    {Array}           Array with the property names in the chain
-   * @private
-   */
-};function accessorChain(node) {
+                               * Returns an array with names of the properties in the accessor chain for MemberExpression nodes
+                               *
+                               * Example:
+                               *
+                               * `module.exports = {}` => ['module', 'exports']
+                               * `module.exports.property = true` => ['module', 'exports', 'property']
+                               *
+                               * @param     {Node}    node    AST Node (MemberExpression)
+                               * @return    {Array}           Array with the property names in the chain
+                               * @private
+                               */ };
+function accessorChain(node) {
   const chain = [];
 
   do {
@@ -56,19 +46,28 @@
 
 function create(context) {
   const nodes = {
-    modules: new Set(),
-    commonjs: new Set(),
-    sources: {}
-  };
+    modules: {
+      set: new Set(),
+      sources: {} },
+
+    types: {
+      set: new Set(),
+      sources: {} },
+
+    commonjs: {
+      set: new Set() } };
+
+
 
   return {
     ExportNamedDeclaration(node) {
+      let target = node.exportKind === 'type' ? nodes.types : nodes.modules;
       if (!node.source) {
-        nodes.modules.add(node);
-      } else if (Array.isArray(nodes.sources[node.source.value])) {
-        nodes.sources[node.source.value].push(node);
+        target.set.add(node);
+      } else if (Array.isArray(target.sources[node.source.value])) {
+        target.sources[node.source.value].push(node);
       } else {
-        nodes.sources[node.source.value] = [node];
+        target.sources[node.source.value] = [node];
       }
     },
 
@@ -83,51 +82,72 @@
       // Deeper assignments are ignored since they just modify what's already being exported
       // (ie. module.exports.exported.prop = true is ignored)
       if (chain[0] === 'module' && chain[1] === 'exports' && chain.length <= 3) {
-        nodes.commonjs.add(node);
+        nodes.commonjs.set.add(node);
         return;
       }
 
       // Assignments to exports (exports.* = *)
       if (chain[0] === 'exports' && chain.length === 2) {
-        nodes.commonjs.add(node);
+        nodes.commonjs.set.add(node);
         return;
       }
     },
 
     'Program:exit': function onExit() {
       // Report multiple `export` declarations (ES2015 modules)
-      if (nodes.modules.size > 1) {
-        nodes.modules.forEach(node => {
+      if (nodes.modules.set.size > 1) {
+        nodes.modules.set.forEach(node => {
           context.report({
             node,
-            message: errors[node.type]
-          });
+            message: errors[node.type] });
+
         });
       }
 
       // Report multiple `aggregated exports` from the same module (ES2015 modules)
-      (0, _arrayPrototype2.default)((0, _object2.default)(nodes.sources).filter(nodesWithSource => Array.isArray(nodesWithSource) && nodesWithSource.length > 1)).forEach(node => {
+      (0, _arrayPrototype2.default)((0, _object2.default)(nodes.modules.sources).
+      filter(nodesWithSource => Array.isArray(nodesWithSource) && nodesWithSource.length > 1)).
+      forEach(node => {
         context.report({
           node,
-          message: errors[node.type]
+          message: errors[node.type] });
+
+      });
+
+      // Report multiple `export type` declarations (FLOW ES2015 modules)
+      if (nodes.types.set.size > 1) {
+        nodes.types.set.forEach(node => {
+          context.report({
+            node,
+            message: errors[node.type] });
+
         });
+      }
+
+      // Report multiple `aggregated type exports` from the same module (FLOW ES2015 modules)
+      (0, _arrayPrototype2.default)((0, _object2.default)(nodes.types.sources).
+      filter(nodesWithSource => Array.isArray(nodesWithSource) && nodesWithSource.length > 1)).
+      forEach(node => {
+        context.report({
+          node,
+          message: errors[node.type] });
+
       });
 
       // Report multiple `module.exports` assignments (CommonJS)
-      if (nodes.commonjs.size > 1) {
-        nodes.commonjs.forEach(node => {
+      if (nodes.commonjs.set.size > 1) {
+        nodes.commonjs.set.forEach(node => {
           context.report({
             node,
-            message: errors[node.type]
-          });
+            message: errors[node.type] });
+
         });
       }
-    }
-  };
+    } };
+
 }
 
 module.exports = {
   meta,
-  create
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9ncm91cC1leHBvcnRzLmpzIl0sIm5hbWVzIjpbIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsImVycm9ycyIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iLCJBc3NpZ25tZW50RXhwcmVzc2lvbiIsImFjY2Vzc29yQ2hhaW4iLCJub2RlIiwiY2hhaW4iLCJ1bnNoaWZ0IiwicHJvcGVydHkiLCJuYW1lIiwib2JqZWN0IiwiY3JlYXRlIiwiY29udGV4dCIsIm5vZGVzIiwibW9kdWxlcyIsIlNldCIsImNvbW1vbmpzIiwic291cmNlcyIsInNvdXJjZSIsImFkZCIsIkFycmF5IiwiaXNBcnJheSIsInZhbHVlIiwicHVzaCIsImxlZnQiLCJsZW5ndGgiLCJvbkV4aXQiLCJzaXplIiwiZm9yRWFjaCIsInJlcG9ydCIsIm1lc3NhZ2UiLCJmaWx0ZXIiLCJub2Rlc1dpdGhTb3VyY2UiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsTUFBTUEsT0FBTztBQUNYQyxRQUFNLFlBREs7QUFFWEMsUUFBTTtBQUNKQyxTQUFLLHVCQUFRLGVBQVI7QUFERDtBQUlSO0FBTmEsQ0FBYixDQU9BLE1BQU1DLFNBQVM7QUFDYkMsMEJBQXdCLG9HQURYO0FBRWJDLHdCQUFzQjtBQUV4Qjs7QUFFQTs7Ozs7Ozs7Ozs7O0FBTmUsQ0FBZixDQWtCQSxTQUFTQyxhQUFULENBQXVCQyxJQUF2QixFQUE2QjtBQUMzQixRQUFNQyxRQUFRLEVBQWQ7O0FBRUEsS0FBRztBQUNEQSxVQUFNQyxPQUFOLENBQWNGLEtBQUtHLFFBQUwsQ0FBY0MsSUFBNUI7O0FBRUEsUUFBSUosS0FBS0ssTUFBTCxDQUFZWixJQUFaLEtBQXFCLFlBQXpCLEVBQXVDO0FBQ3JDUSxZQUFNQyxPQUFOLENBQWNGLEtBQUtLLE1BQUwsQ0FBWUQsSUFBMUI7QUFDQTtBQUNEOztBQUVESixXQUFPQSxLQUFLSyxNQUFaO0FBQ0QsR0FURCxRQVNTTCxLQUFLUCxJQUFMLEtBQWMsa0JBVHZCOztBQVdBLFNBQU9RLEtBQVA7QUFDRDs7QUFFRCxTQUFTSyxNQUFULENBQWdCQyxPQUFoQixFQUF5QjtBQUN2QixRQUFNQyxRQUFRO0FBQ1pDLGFBQVMsSUFBSUMsR0FBSixFQURHO0FBRVpDLGNBQVUsSUFBSUQsR0FBSixFQUZFO0FBR1pFLGFBQVM7QUFIRyxHQUFkOztBQU1BLFNBQU87QUFDTGYsMkJBQXVCRyxJQUF2QixFQUE2QjtBQUMzQixVQUFJLENBQUNBLEtBQUthLE1BQVYsRUFBa0I7QUFDaEJMLGNBQU1DLE9BQU4sQ0FBY0ssR0FBZCxDQUFrQmQsSUFBbEI7QUFDRCxPQUZELE1BRU8sSUFBSWUsTUFBTUMsT0FBTixDQUFjUixNQUFNSSxPQUFOLENBQWNaLEtBQUthLE1BQUwsQ0FBWUksS0FBMUIsQ0FBZCxDQUFKLEVBQXFEO0FBQzFEVCxjQUFNSSxPQUFOLENBQWNaLEtBQUthLE1BQUwsQ0FBWUksS0FBMUIsRUFBaUNDLElBQWpDLENBQXNDbEIsSUFBdEM7QUFDRCxPQUZNLE1BRUE7QUFDTFEsY0FBTUksT0FBTixDQUFjWixLQUFLYSxNQUFMLENBQVlJLEtBQTFCLElBQW1DLENBQUNqQixJQUFELENBQW5DO0FBQ0Q7QUFDRixLQVRJOztBQVdMRix5QkFBcUJFLElBQXJCLEVBQTJCO0FBQ3pCLFVBQUlBLEtBQUttQixJQUFMLENBQVUxQixJQUFWLEtBQW1CLGtCQUF2QixFQUEyQztBQUN6QztBQUNEOztBQUVELFlBQU1RLFFBQVFGLGNBQWNDLEtBQUttQixJQUFuQixDQUFkOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQUlsQixNQUFNLENBQU4sTUFBYSxRQUFiLElBQXlCQSxNQUFNLENBQU4sTUFBYSxTQUF0QyxJQUFtREEsTUFBTW1CLE1BQU4sSUFBZ0IsQ0FBdkUsRUFBMEU7QUFDeEVaLGNBQU1HLFFBQU4sQ0FBZUcsR0FBZixDQUFtQmQsSUFBbkI7QUFDQTtBQUNEOztBQUVEO0FBQ0EsVUFBSUMsTUFBTSxDQUFOLE1BQWEsU0FBYixJQUEwQkEsTUFBTW1CLE1BQU4sS0FBaUIsQ0FBL0MsRUFBa0Q7QUFDaERaLGNBQU1HLFFBQU4sQ0FBZUcsR0FBZixDQUFtQmQsSUFBbkI7QUFDQTtBQUNEO0FBQ0YsS0EvQkk7O0FBaUNMLG9CQUFnQixTQUFTcUIsTUFBVCxHQUFrQjtBQUNoQztBQUNBLFVBQUliLE1BQU1DLE9BQU4sQ0FBY2EsSUFBZCxHQUFxQixDQUF6QixFQUE0QjtBQUMxQmQsY0FBTUMsT0FBTixDQUFjYyxPQUFkLENBQXNCdkIsUUFBUTtBQUM1Qk8sa0JBQVFpQixNQUFSLENBQWU7QUFDYnhCLGdCQURhO0FBRWJ5QixxQkFBUzdCLE9BQU9JLEtBQUtQLElBQVo7QUFGSSxXQUFmO0FBSUQsU0FMRDtBQU1EOztBQUVEO0FBQ0Esb0NBQUssc0JBQU9lLE1BQU1JLE9BQWIsRUFDRmMsTUFERSxDQUNLQyxtQkFBbUJaLE1BQU1DLE9BQU4sQ0FBY1csZUFBZCxLQUFrQ0EsZ0JBQWdCUCxNQUFoQixHQUF5QixDQURuRixDQUFMLEVBRUdHLE9BRkgsQ0FFWXZCLElBQUQsSUFBVTtBQUNqQk8sZ0JBQVFpQixNQUFSLENBQWU7QUFDYnhCLGNBRGE7QUFFYnlCLG1CQUFTN0IsT0FBT0ksS0FBS1AsSUFBWjtBQUZJLFNBQWY7QUFJRCxPQVBIOztBQVNBO0FBQ0EsVUFBSWUsTUFBTUcsUUFBTixDQUFlVyxJQUFmLEdBQXNCLENBQTFCLEVBQTZCO0FBQzNCZCxjQUFNRyxRQUFOLENBQWVZLE9BQWYsQ0FBdUJ2QixRQUFRO0FBQzdCTyxrQkFBUWlCLE1BQVIsQ0FBZTtBQUNieEIsZ0JBRGE7QUFFYnlCLHFCQUFTN0IsT0FBT0ksS0FBS1AsSUFBWjtBQUZJLFdBQWY7QUFJRCxTQUxEO0FBTUQ7QUFDRjtBQS9ESSxHQUFQO0FBaUVEOztBQUVEbUMsT0FBT0MsT0FBUCxHQUFpQjtBQUNmckMsTUFEZTtBQUVmYztBQUZlLENBQWpCIiwiZmlsZSI6Imdyb3VwLWV4cG9ydHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuaW1wb3J0IHZhbHVlcyBmcm9tICdvYmplY3QudmFsdWVzJ1xuaW1wb3J0IGZsYXQgZnJvbSAnYXJyYXkucHJvdG90eXBlLmZsYXQnXG5cbmNvbnN0IG1ldGEgPSB7XG4gIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgZG9jczoge1xuICAgIHVybDogZG9jc1VybCgnZ3JvdXAtZXhwb3J0cycpLFxuICB9LFxufVxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuY29uc3QgZXJyb3JzID0ge1xuICBFeHBvcnROYW1lZERlY2xhcmF0aW9uOiAnTXVsdGlwbGUgbmFtZWQgZXhwb3J0IGRlY2xhcmF0aW9uczsgY29uc29saWRhdGUgYWxsIG5hbWVkIGV4cG9ydHMgaW50byBhIHNpbmdsZSBleHBvcnQgZGVjbGFyYXRpb24nLFxuICBBc3NpZ25tZW50RXhwcmVzc2lvbjogJ011bHRpcGxlIENvbW1vbkpTIGV4cG9ydHM7IGNvbnNvbGlkYXRlIGFsbCBleHBvcnRzIGludG8gYSBzaW5nbGUgYXNzaWdubWVudCB0byBgbW9kdWxlLmV4cG9ydHNgJyxcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgd2l0aCBuYW1lcyBvZiB0aGUgcHJvcGVydGllcyBpbiB0aGUgYWNjZXNzb3IgY2hhaW4gZm9yIE1lbWJlckV4cHJlc3Npb24gbm9kZXNcbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBtb2R1bGUuZXhwb3J0cyA9IHt9YCA9PiBbJ21vZHVsZScsICdleHBvcnRzJ11cbiAqIGBtb2R1bGUuZXhwb3J0cy5wcm9wZXJ0eSA9IHRydWVgID0+IFsnbW9kdWxlJywgJ2V4cG9ydHMnLCAncHJvcGVydHknXVxuICpcbiAqIEBwYXJhbSAgICAge05vZGV9ICAgIG5vZGUgICAgQVNUIE5vZGUgKE1lbWJlckV4cHJlc3Npb24pXG4gKiBAcmV0dXJuICAgIHtBcnJheX0gICAgICAgICAgIEFycmF5IHdpdGggdGhlIHByb3BlcnR5IG5hbWVzIGluIHRoZSBjaGFpblxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWNjZXNzb3JDaGFpbihub2RlKSB7XG4gIGNvbnN0IGNoYWluID0gW11cblxuICBkbyB7XG4gICAgY2hhaW4udW5zaGlmdChub2RlLnByb3BlcnR5Lm5hbWUpXG5cbiAgICBpZiAobm9kZS5vYmplY3QudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICBjaGFpbi51bnNoaWZ0KG5vZGUub2JqZWN0Lm5hbWUpXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLm9iamVjdFxuICB9IHdoaWxlIChub2RlLnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJylcblxuICByZXR1cm4gY2hhaW5cbn1cblxuZnVuY3Rpb24gY3JlYXRlKGNvbnRleHQpIHtcbiAgY29uc3Qgbm9kZXMgPSB7XG4gICAgbW9kdWxlczogbmV3IFNldCgpLFxuICAgIGNvbW1vbmpzOiBuZXcgU2V0KCksXG4gICAgc291cmNlczoge30sXG4gIH1cblxuICByZXR1cm4ge1xuICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgaWYgKCFub2RlLnNvdXJjZSkge1xuICAgICAgICBub2Rlcy5tb2R1bGVzLmFkZChub2RlKVxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG5vZGVzLnNvdXJjZXNbbm9kZS5zb3VyY2UudmFsdWVdKSkge1xuICAgICAgICBub2Rlcy5zb3VyY2VzW25vZGUuc291cmNlLnZhbHVlXS5wdXNoKG5vZGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2Rlcy5zb3VyY2VzW25vZGUuc291cmNlLnZhbHVlXSA9IFtub2RlXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBBc3NpZ25tZW50RXhwcmVzc2lvbihub2RlKSB7XG4gICAgICBpZiAobm9kZS5sZWZ0LnR5cGUgIT09ICdNZW1iZXJFeHByZXNzaW9uJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhaW4gPSBhY2Nlc3NvckNoYWluKG5vZGUubGVmdClcblxuICAgICAgLy8gQXNzaWdubWVudHMgdG8gbW9kdWxlLmV4cG9ydHNcbiAgICAgIC8vIERlZXBlciBhc3NpZ25tZW50cyBhcmUgaWdub3JlZCBzaW5jZSB0aGV5IGp1c3QgbW9kaWZ5IHdoYXQncyBhbHJlYWR5IGJlaW5nIGV4cG9ydGVkXG4gICAgICAvLyAoaWUuIG1vZHVsZS5leHBvcnRzLmV4cG9ydGVkLnByb3AgPSB0cnVlIGlzIGlnbm9yZWQpXG4gICAgICBpZiAoY2hhaW5bMF0gPT09ICdtb2R1bGUnICYmIGNoYWluWzFdID09PSAnZXhwb3J0cycgJiYgY2hhaW4ubGVuZ3RoIDw9IDMpIHtcbiAgICAgICAgbm9kZXMuY29tbW9uanMuYWRkKG5vZGUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ25tZW50cyB0byBleHBvcnRzIChleHBvcnRzLiogPSAqKVxuICAgICAgaWYgKGNoYWluWzBdID09PSAnZXhwb3J0cycgJiYgY2hhaW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIG5vZGVzLmNvbW1vbmpzLmFkZChub2RlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgJ1Byb2dyYW06ZXhpdCc6IGZ1bmN0aW9uIG9uRXhpdCgpIHtcbiAgICAgIC8vIFJlcG9ydCBtdWx0aXBsZSBgZXhwb3J0YCBkZWNsYXJhdGlvbnMgKEVTMjAxNSBtb2R1bGVzKVxuICAgICAgaWYgKG5vZGVzLm1vZHVsZXMuc2l6ZSA+IDEpIHtcbiAgICAgICAgbm9kZXMubW9kdWxlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvcnNbbm9kZS50eXBlXSxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBSZXBvcnQgbXVsdGlwbGUgYGFnZ3JlZ2F0ZWQgZXhwb3J0c2AgZnJvbSB0aGUgc2FtZSBtb2R1bGUgKEVTMjAxNSBtb2R1bGVzKVxuICAgICAgZmxhdCh2YWx1ZXMobm9kZXMuc291cmNlcylcbiAgICAgICAgLmZpbHRlcihub2Rlc1dpdGhTb3VyY2UgPT4gQXJyYXkuaXNBcnJheShub2Rlc1dpdGhTb3VyY2UpICYmIG5vZGVzV2l0aFNvdXJjZS5sZW5ndGggPiAxKSlcbiAgICAgICAgLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JzW25vZGUudHlwZV0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgLy8gUmVwb3J0IG11bHRpcGxlIGBtb2R1bGUuZXhwb3J0c2AgYXNzaWdubWVudHMgKENvbW1vbkpTKVxuICAgICAgaWYgKG5vZGVzLmNvbW1vbmpzLnNpemUgPiAxKSB7XG4gICAgICAgIG5vZGVzLmNvbW1vbmpzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yc1tub2RlLnR5cGVdLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YSxcbiAgY3JlYXRlLFxufVxuIl19
\ No newline at end of file
+  create };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9ncm91cC1leHBvcnRzLmpzIl0sIm5hbWVzIjpbIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsImVycm9ycyIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iLCJBc3NpZ25tZW50RXhwcmVzc2lvbiIsImFjY2Vzc29yQ2hhaW4iLCJub2RlIiwiY2hhaW4iLCJ1bnNoaWZ0IiwicHJvcGVydHkiLCJuYW1lIiwib2JqZWN0IiwiY3JlYXRlIiwiY29udGV4dCIsIm5vZGVzIiwibW9kdWxlcyIsInNldCIsIlNldCIsInNvdXJjZXMiLCJ0eXBlcyIsImNvbW1vbmpzIiwidGFyZ2V0IiwiZXhwb3J0S2luZCIsInNvdXJjZSIsImFkZCIsIkFycmF5IiwiaXNBcnJheSIsInZhbHVlIiwicHVzaCIsImxlZnQiLCJsZW5ndGgiLCJvbkV4aXQiLCJzaXplIiwiZm9yRWFjaCIsInJlcG9ydCIsIm1lc3NhZ2UiLCJmaWx0ZXIiLCJub2Rlc1dpdGhTb3VyY2UiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiYUFBQSxxQztBQUNBLHVDO0FBQ0Esc0Q7O0FBRUEsTUFBTUEsT0FBTztBQUNYQyxRQUFNLFlBREs7QUFFWEMsUUFBTTtBQUNKQyxTQUFLLHVCQUFRLGVBQVIsQ0FERDs7O0FBSVIsOEJBTmEsRUFBYjtBQU9BLE1BQU1DLFNBQVM7QUFDYkMsMEJBQXdCLG9HQURYO0FBRWJDLHdCQUFzQjs7QUFFeEI7O0FBRUE7Ozs7Ozs7Ozs7O2lDQU5lLEVBQWY7QUFrQkEsU0FBU0MsYUFBVCxDQUF1QkMsSUFBdkIsRUFBNkI7QUFDM0IsUUFBTUMsUUFBUSxFQUFkOztBQUVBLEtBQUc7QUFDREEsVUFBTUMsT0FBTixDQUFjRixLQUFLRyxRQUFMLENBQWNDLElBQTVCOztBQUVBLFFBQUlKLEtBQUtLLE1BQUwsQ0FBWVosSUFBWixLQUFxQixZQUF6QixFQUF1QztBQUNyQ1EsWUFBTUMsT0FBTixDQUFjRixLQUFLSyxNQUFMLENBQVlELElBQTFCO0FB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QixJQUFoQixHQUF1QixDQUEzQixFQUE4QjtBQUM1QmxCLGNBQU1LLEtBQU4sQ0FBWUgsR0FBWixDQUFnQmlCLE9BQWhCLENBQXdCM0IsUUFBUTtBQUM5Qk8sa0JBQVFxQixNQUFSLENBQWU7QUFDYjVCLGdCQURhO0FBRWI2QixxQkFBU2pDLE9BQU9JLEtBQUtQLElBQVosQ0FGSSxFQUFmOztBQUlELFNBTEQ7QUFNRDs7QUFFRDtBQUNBLG9DQUFLLHNCQUFPZSxNQUFNSyxLQUFOLENBQVlELE9BQW5CO0FBQ0ZrQixZQURFLENBQ0tDLG1CQUFtQlosTUFBTUMsT0FBTixDQUFjVyxlQUFkLEtBQWtDQSxnQkFBZ0JQLE1BQWhCLEdBQXlCLENBRG5GLENBQUw7QUFFR0csYUFGSCxDQUVZM0IsSUFBRCxJQUFVO0FBQ2pCTyxnQkFBUXFCLE1BQVIsQ0FBZTtBQUNiNUIsY0FEYTtBQUViNkIsbUJBQVNqQyxPQUFPSSxLQUFLUCxJQUFaLENBRkksRUFBZjs7QUFJRCxPQVBIOztBQVNBO0FBQ0EsVUFBSWUsTUFBTU0sUUFBTixDQUFlSixHQUFmLENBQW1CZ0IsSUFBbkIsR0FBMEIsQ0FBOUIsRUFBaUM7QUFDL0JsQixjQUFNTSxRQUFOLENBQWVKLEdBQWYsQ0FBbUJpQixPQUFuQixDQUEyQjNCLFFBQVE7QUFDakNPLGtCQUFRcUIsTUFBUixDQUFlO0FBQ2I1QixnQkFEYTtBQUViNkIscUJBQVNqQyxPQUFPSSxLQUFLUCxJQUFaLENBRkksRUFBZjs7QUFJRCxTQUxEO0FBTUQ7QUFDRixLQXBGSSxFQUFQOztBQXNGRDs7QUFFRHVDLE9BQU9DLE9BQVAsR0FBaUI7QUFDZnpDLE1BRGU7QUFFZmMsUUFGZSxFQUFqQiIsImZpbGUiOiJncm91cC1leHBvcnRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcbmltcG9ydCB2YWx1ZXMgZnJvbSAnb2JqZWN0LnZhbHVlcydcbmltcG9ydCBmbGF0IGZyb20gJ2FycmF5LnByb3RvdHlwZS5mbGF0J1xuXG5jb25zdCBtZXRhID0ge1xuICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gIGRvY3M6IHtcbiAgICB1cmw6IGRvY3NVcmwoJ2dyb3VwLWV4cG9ydHMnKSxcbiAgfSxcbn1cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmNvbnN0IGVycm9ycyA9IHtcbiAgRXhwb3J0TmFtZWREZWNsYXJhdGlvbjogJ011bHRpcGxlIG5hbWVkIGV4cG9ydCBkZWNsYXJhdGlvbnM7IGNvbnNvbGlkYXRlIGFsbCBuYW1lZCBleHBvcnRzIGludG8gYSBzaW5nbGUgZXhwb3J0IGRlY2xhcmF0aW9uJyxcbiAgQXNzaWdubWVudEV4cHJlc3Npb246ICdNdWx0aXBsZSBDb21tb25KUyBleHBvcnRzOyBjb25zb2xpZGF0ZSBhbGwgZXhwb3J0cyBpbnRvIGEgc2luZ2xlIGFzc2lnbm1lbnQgdG8gYG1vZHVsZS5leHBvcnRzYCcsXG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggbmFtZXMgb2YgdGhlIHByb3BlcnRpZXMgaW4gdGhlIGFjY2Vzc29yIGNoYWluIGZvciBNZW1iZXJFeHByZXNzaW9uIG5vZGVzXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgbW9kdWxlLmV4cG9ydHMgPSB7fWAgPT4gWydtb2R1bGUnLCAnZXhwb3J0cyddXG4gKiBgbW9kdWxlLmV4cG9ydHMucHJvcGVydHkgPSB0cnVlYCA9PiBbJ21vZHVsZScsICdleHBvcnRzJywgJ3Byb3BlcnR5J11cbiAqXG4gKiBAcGFyYW0gICAgIHtOb2RlfSAgICBub2RlICAgIEFTVCBOb2RlIChNZW1iZXJFeHByZXNzaW9uKVxuICogQHJldHVybiAgICB7QXJyYXl9ICAgICAgICAgICBBcnJheSB3aXRoIHRoZSBwcm9wZXJ0eSBuYW1lcyBpbiB0aGUgY2hhaW5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFjY2Vzc29yQ2hhaW4obm9kZSkge1xuICBjb25zdCBjaGFpbiA9IFtdXG5cbiAgZG8ge1xuICAgIGNoYWluLnVuc2hpZnQobm9kZS5wcm9wZXJ0eS5uYW1lKVxuXG4gICAgaWYgKG5vZGUub2JqZWN0LnR5cGUgPT09ICdJZGVudGlmaWVyJykge1xuICAgICAgY2hhaW4udW5zaGlmdChub2RlLm9iamVjdC5uYW1lKVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5vYmplY3RcbiAgfSB3aGlsZSAobm9kZS50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicpXG5cbiAgcmV0dXJuIGNoYWluXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZShjb250ZXh0KSB7XG4gIGNvbnN0IG5vZGVzID0ge1xuICAgIG1vZHVsZXM6IHtcbiAgICAgIHNldDogbmV3IFNldCgpLFxuICAgICAgc291cmNlczoge30sXG4gICAgfSxcbiAgICB0eXBlczoge1xuICAgICAgc2V0OiBuZXcgU2V0KCksXG4gICAgICBzb3VyY2VzOiB7fSxcbiAgICB9LFxuICAgIGNvbW1vbmpzOiB7XG4gICAgICBzZXQ6IG5ldyBTZXQoKSxcbiAgICB9LFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgIGxldCB0YXJnZXQgPSBub2RlLmV4cG9ydEtpbmQgPT09ICd0eXBlJyA/IG5vZGVzLnR5cGVzIDogbm9kZXMubW9kdWxlc1xuICAgICAgaWYgKCFub2RlLnNvdXJjZSkge1xuICAgICAgICB0YXJnZXQuc2V0LmFkZChub2RlKVxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRhcmdldC5zb3VyY2VzW25vZGUuc291cmNlLnZhbHVlXSkpIHtcbiAgICAgICAgdGFyZ2V0LnNvdXJjZXNbbm9kZS5zb3VyY2UudmFsdWVdLnB1c2gobm9kZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldC5zb3VyY2VzW25vZGUuc291cmNlLnZhbHVlXSA9IFtub2RlXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBBc3NpZ25tZW50RXhwcmVzc2lvbihub2RlKSB7XG4gICAgICBpZiAobm9kZS5sZWZ0LnR5cGUgIT09ICdNZW1iZXJFeHByZXNzaW9uJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhaW4gPSBhY2Nlc3NvckNoYWluKG5vZGUubGVmdClcblxuICAgICAgLy8gQXNzaWdubWVudHMgdG8gbW9kdWxlLmV4cG9ydHNcbiAgICAgIC8vIERlZXBlciBhc3NpZ25tZW50cyBhcmUgaWdub3JlZCBzaW5jZSB0aGV5IGp1c3QgbW9kaWZ5IHdoYXQncyBhbHJlYWR5IGJlaW5nIGV4cG9ydGVkXG4gICAgICAvLyAoaWUuIG1vZHVsZS5leHBvcnRzLmV4cG9ydGVkLnByb3AgPSB0cnVlIGlzIGlnbm9yZWQpXG4gICAgICBpZiAoY2hhaW5bMF0gPT09ICdtb2R1bGUnICYmIGNoYWluWzFdID09PSAnZXhwb3J0cycgJiYgY2hhaW4ubGVuZ3RoIDw9IDMpIHtcbiAgICAgICAgbm9kZXMuY29tbW9uanMuc2V0LmFkZChub2RlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gQXNzaWdubWVudHMgdG8gZXhwb3J0cyAoZXhwb3J0cy4qID0gKilcbiAgICAgIGlmIChjaGFpblswXSA9PT0gJ2V4cG9ydHMnICYmIGNoYWluLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBub2Rlcy5jb21tb25qcy5zZXQuYWRkKG5vZGUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH0sXG5cbiAgICAnUHJvZ3JhbTpleGl0JzogZnVuY3Rpb24gb25FeGl0KCkge1xuICAgICAgLy8gUmVwb3J0IG11bHRpcGxlIGBleHBvcnRgIGRlY2xhcmF0aW9ucyAoRVMyMDE1IG1vZHVsZXMpXG4gICAgICBpZiAobm9kZXMubW9kdWxlcy5zZXQuc2l6ZSA+IDEpIHtcbiAgICAgICAgbm9kZXMubW9kdWxlcy5zZXQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JzW25vZGUudHlwZV0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gUmVwb3J0IG11bHRpcGxlIGBhZ2dyZWdhdGVkIGV4cG9ydHNgIGZyb20gdGhlIHNhbWUgbW9kdWxlIChFUzIwMTUgbW9kdWxlcylcbiAgICAgIGZsYXQodmFsdWVzKG5vZGVzLm1vZHVsZXMuc291cmNlcylcbiAgICAgICAgLmZpbHRlcihub2Rlc1dpdGhTb3VyY2UgPT4gQXJyYXkuaXNBcnJheShub2Rlc1dpdGhTb3VyY2UpICYmIG5vZGVzV2l0aFNvdXJjZS5sZW5ndGggPiAxKSlcbiAgICAgICAgLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JzW25vZGUudHlwZV0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgLy8gUmVwb3J0IG11bHRpcGxlIGBleHBvcnQgdHlwZWAgZGVjbGFyYXRpb25zIChGTE9XIEVTMjAxNSBtb2R1bGVzKVxuICAgICAgaWYgKG5vZGVzLnR5cGVzLnNldC5zaXplID4gMSkge1xuICAgICAgICBub2Rlcy50eXBlcy5zZXQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JzW25vZGUudHlwZV0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gUmVwb3J0IG11bHRpcGxlIGBhZ2dyZWdhdGVkIHR5cGUgZXhwb3J0c2AgZnJvbSB0aGUgc2FtZSBtb2R1bGUgKEZMT1cgRVMyMDE1IG1vZHVsZXMpXG4gICAgICBmbGF0KHZhbHVlcyhub2Rlcy50eXBlcy5zb3VyY2VzKVxuICAgICAgICAuZmlsdGVyKG5vZGVzV2l0aFNvdXJjZSA9PiBBcnJheS5pc0FycmF5KG5vZGVzV2l0aFNvdXJjZSkgJiYgbm9kZXNXaXRoU291cmNlLmxlbmd0aCA+IDEpKVxuICAgICAgICAuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvcnNbbm9kZS50eXBlXSxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAvLyBSZXBvcnQgbXVsdGlwbGUgYG1vZHVsZS5leHBvcnRzYCBhc3NpZ25tZW50cyAoQ29tbW9uSlMpXG4gICAgICBpZiAobm9kZXMuY29tbW9uanMuc2V0LnNpemUgPiAxKSB7XG4gICAgICAgIG5vZGVzLmNvbW1vbmpzLnNldC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvcnNbbm9kZS50eXBlXSxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGEsXG4gIGNyZWF0ZSxcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/imports-first.js b/node_modules/eslint-plugin-import/lib/rules/imports-first.js
index 77fd18d..7f6d199 100644
--- a/node_modules/eslint-plugin-import/lib/rules/imports-first.js
+++ b/node_modules/eslint-plugin-import/lib/rules/imports-first.js
@@ -1,19 +1,13 @@
-'use strict';
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 const first = require('./first');
 
 const newMeta = Object.assign({}, first.meta, {
   deprecated: true,
   docs: {
-    url: (0, _docsUrl2.default)('imports-first', '7b25c1cb95ee18acc1531002fd343e1e6031f9ed')
-  }
-});
+    url: (0, _docsUrl2.default)('imports-first', '7b25c1cb95ee18acc1531002fd343e1e6031f9ed') } });
+
+
 
 module.exports = Object.assign({}, first, { meta: newMeta });
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9pbXBvcnRzLWZpcnN0LmpzIl0sIm5hbWVzIjpbImZpcnN0IiwicmVxdWlyZSIsIm5ld01ldGEiLCJPYmplY3QiLCJhc3NpZ24iLCJtZXRhIiwiZGVwcmVjYXRlZCIsImRvY3MiLCJ1cmwiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7Ozs7QUFFQSxNQUFNQSxRQUFRQyxRQUFRLFNBQVIsQ0FBZDs7QUFFQSxNQUFNQyxVQUFVQyxPQUFPQyxNQUFQLENBQWMsRUFBZCxFQUFrQkosTUFBTUssSUFBeEIsRUFBOEI7QUFDNUNDLGNBQVksSUFEZ0M7QUFFNUNDLFFBQU07QUFDSkMsU0FBSyx1QkFBUSxlQUFSLEVBQXlCLDBDQUF6QjtBQUREO0FBRnNDLENBQTlCLENBQWhCOztBQU9BQyxPQUFPQyxPQUFQLEdBQWlCUCxPQUFPQyxNQUFQLENBQWMsRUFBZCxFQUFrQkosS0FBbEIsRUFBeUIsRUFBRUssTUFBTUgsT0FBUixFQUF6QixDQUFqQiIsImZpbGUiOiJpbXBvcnRzLWZpcnN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcblxuY29uc3QgZmlyc3QgPSByZXF1aXJlKCcuL2ZpcnN0JylcblxuY29uc3QgbmV3TWV0YSA9IE9iamVjdC5hc3NpZ24oe30sIGZpcnN0Lm1ldGEsIHtcbiAgZGVwcmVjYXRlZDogdHJ1ZSxcbiAgZG9jczoge1xuICAgIHVybDogZG9jc1VybCgnaW1wb3J0cy1maXJzdCcsICc3YjI1YzFjYjk1ZWUxOGFjYzE1MzEwMDJmZDM0M2UxZTYwMzFmOWVkJyksXG4gIH0sXG59KVxuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5hc3NpZ24oe30sIGZpcnN0LCB7IG1ldGE6IG5ld01ldGEgfSlcbiJdfQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9pbXBvcnRzLWZpcnN0LmpzIl0sIm5hbWVzIjpbImZpcnN0IiwicmVxdWlyZSIsIm5ld01ldGEiLCJPYmplY3QiLCJhc3NpZ24iLCJtZXRhIiwiZGVwcmVjYXRlZCIsImRvY3MiLCJ1cmwiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiYUFBQSxxQzs7QUFFQSxNQUFNQSxRQUFRQyxRQUFRLFNBQVIsQ0FBZDs7QUFFQSxNQUFNQyxVQUFVQyxPQUFPQyxNQUFQLENBQWMsRUFBZCxFQUFrQkosTUFBTUssSUFBeEIsRUFBOEI7QUFDNUNDLGNBQVksSUFEZ0M7QUFFNUNDLFFBQU07QUFDSkMsU0FBSyx1QkFBUSxlQUFSLEVBQXlCLDBDQUF6QixDQURELEVBRnNDLEVBQTlCLENBQWhCOzs7O0FBT0FDLE9BQU9DLE9BQVAsR0FBaUJQLE9BQU9DLE1BQVAsQ0FBYyxFQUFkLEVBQWtCSixLQUFsQixFQUF5QixFQUFFSyxNQUFNSCxPQUFSLEVBQXpCLENBQWpCIiwiZmlsZSI6ImltcG9ydHMtZmlyc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5jb25zdCBmaXJzdCA9IHJlcXVpcmUoJy4vZmlyc3QnKVxuXG5jb25zdCBuZXdNZXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZmlyc3QubWV0YSwge1xuICBkZXByZWNhdGVkOiB0cnVlLFxuICBkb2NzOiB7XG4gICAgdXJsOiBkb2NzVXJsKCdpbXBvcnRzLWZpcnN0JywgJzdiMjVjMWNiOTVlZTE4YWNjMTUzMTAwMmZkMzQzZTFlNjAzMWY5ZWQnKSxcbiAgfSxcbn0pXG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmFzc2lnbih7fSwgZmlyc3QsIHsgbWV0YTogbmV3TWV0YSB9KVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/max-dependencies.js b/node_modules/eslint-plugin-import/lib/rules/max-dependencies.js
index d7f2f49..83aaeea 100644
--- a/node_modules/eslint-plugin-import/lib/rules/max-dependencies.js
+++ b/node_modules/eslint-plugin-import/lib/rules/max-dependencies.js
@@ -1,27 +1,16 @@
-'use strict';
-
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
-var _staticRequire = require('../core/staticRequire');
-
-var _staticRequire2 = _interopRequireDefault(_staticRequire);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();var _staticRequire = require('../core/staticRequire');var _staticRequire2 = _interopRequireDefault(_staticRequire);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 const DEFAULT_MAX = 10;
 
-const countDependencies = (dependencies, lastNode, context) => {
-  var _ref = context.options[0] || { max: DEFAULT_MAX };
-
-  const max = _ref.max;
-
+const countDependencies = (dependencies, lastNode, context) => {var _ref =
+  context.options[0] || { max: DEFAULT_MAX };const max = _ref.max;
 
   if (dependencies.size > max) {
-    context.report(lastNode, `Maximum number of dependencies (${max}) exceeded.`);
+    context.report(
+    lastNode,
+    `Maximum number of dependencies (${max}) exceeded.`);
+
   }
 };
 
@@ -29,17 +18,19 @@
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('max-dependencies')
-    },
+      url: (0, _docsUrl2.default)('max-dependencies') },
 
-    schema: [{
+
+    schema: [
+    {
       'type': 'object',
       'properties': {
-        'max': { 'type': 'number' }
-      },
-      'additionalProperties': false
-    }]
-  },
+        'max': { 'type': 'number' } },
+
+      'additionalProperties': false }] },
+
+
+
 
   create: context => {
     const dependencies = new Set(); // keep track of dependencies
@@ -52,11 +43,8 @@
       },
 
       CallExpression(node) {
-        if ((0, _staticRequire2.default)(node)) {
-          var _node$arguments = _slicedToArray(node.arguments, 1);
-
-          const requirePath = _node$arguments[0];
-
+        if ((0, _staticRequire2.default)(node)) {var _node$arguments = _slicedToArray(
+          node.arguments, 1);const requirePath = _node$arguments[0];
           dependencies.add(requirePath.value);
           lastNode = node;
         }
@@ -64,8 +52,7 @@
 
       'Program:exit': function () {
         countDependencies(dependencies, lastNode, context);
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9tYXgtZGVwZW5kZW5jaWVzLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfTUFYIiwiY291bnREZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmNpZXMiLCJsYXN0Tm9kZSIsImNvbnRleHQiLCJvcHRpb25zIiwibWF4Iiwic2l6ZSIsInJlcG9ydCIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJTZXQiLCJJbXBvcnREZWNsYXJhdGlvbiIsIm5vZGUiLCJhZGQiLCJzb3VyY2UiLCJ2YWx1ZSIsIkNhbGxFeHByZXNzaW9uIiwiYXJndW1lbnRzIiwicmVxdWlyZVBhdGgiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7OztBQUNBOzs7Ozs7QUFFQSxNQUFNQSxjQUFjLEVBQXBCOztBQUVBLE1BQU1DLG9CQUFvQixDQUFDQyxZQUFELEVBQWVDLFFBQWYsRUFBeUJDLE9BQXpCLEtBQXFDO0FBQUEsYUFDL0NBLFFBQVFDLE9BQVIsQ0FBZ0IsQ0FBaEIsS0FBc0IsRUFBRUMsS0FBS04sV0FBUCxFQUR5Qjs7QUFBQSxRQUN0RE0sR0FEc0QsUUFDdERBLEdBRHNEOzs7QUFHN0QsTUFBSUosYUFBYUssSUFBYixHQUFvQkQsR0FBeEIsRUFBNkI7QUFDM0JGLFlBQVFJLE1BQVIsQ0FDRUwsUUFERixFQUVHLG1DQUFrQ0csR0FBSSxhQUZ6QztBQUlEO0FBQ0YsQ0FURDs7QUFXQUcsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsa0JBQVI7QUFERCxLQUZGOztBQU1KQyxZQUFRLENBQ047QUFDRSxjQUFRLFFBRFY7QUFFRSxvQkFBYztBQUNaLGVBQU8sRUFBRSxRQUFRLFFBQVY7QUFESyxPQUZoQjtBQUtFLDhCQUF3QjtBQUwxQixLQURNO0FBTkosR0FEUzs7QUFrQmZDLFVBQVFaLFdBQVc7QUFDakIsVUFBTUYsZUFBZSxJQUFJZSxHQUFKLEVBQXJCLENBRGlCLENBQ2M7QUFDL0IsUUFBSWQsUUFBSixDQUZpQixDQUVKOztBQUViLFdBQU87QUFDTGUsd0JBQWtCQyxJQUFsQixFQUF3QjtBQUN0QmpCLHFCQUFha0IsR0FBYixDQUFpQkQsS0FBS0UsTUFBTCxDQUFZQyxLQUE3QjtBQUNBbkIsbUJBQVdnQixLQUFLRSxNQUFoQjtBQUNELE9BSkk7O0FBTUxFLHFCQUFlSixJQUFmLEVBQXFCO0FBQ25CLFlBQUksNkJBQWdCQSxJQUFoQixDQUFKLEVBQTJCO0FBQUEsK0NBQ0RBLEtBQUtLLFNBREo7O0FBQUEsZ0JBQ2pCQyxXQURpQjs7QUFFekJ2Qix1QkFBYWtCLEdBQWIsQ0FBaUJLLFlBQVlILEtBQTdCO0FBQ0FuQixxQkFBV2dCLElBQVg7QUFDRDtBQUNGLE9BWkk7O0FBY0wsc0JBQWdCLFlBQVk7QUFDMUJsQiwwQkFBa0JDLFlBQWxCLEVBQWdDQyxRQUFoQyxFQUEwQ0MsT0FBMUM7QUFDRDtBQWhCSSxLQUFQO0FBa0JEO0FBeENjLENBQWpCIiwiZmlsZSI6Im1heC1kZXBlbmRlbmNpZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaXNTdGF0aWNSZXF1aXJlIGZyb20gJy4uL2NvcmUvc3RhdGljUmVxdWlyZSdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbmNvbnN0IERFRkFVTFRfTUFYID0gMTBcblxuY29uc3QgY291bnREZXBlbmRlbmNpZXMgPSAoZGVwZW5kZW5jaWVzLCBsYXN0Tm9kZSwgY29udGV4dCkgPT4ge1xuICBjb25zdCB7bWF4fSA9IGNvbnRleHQub3B0aW9uc1swXSB8fCB7IG1heDogREVGQVVMVF9NQVggfVxuXG4gIGlmIChkZXBlbmRlbmNpZXMuc2l6ZSA+IG1heCkge1xuICAgIGNvbnRleHQucmVwb3J0KFxuICAgICAgbGFzdE5vZGUsXG4gICAgICBgTWF4aW11bSBudW1iZXIgb2YgZGVwZW5kZW5jaWVzICgke21heH0pIGV4Y2VlZGVkLmBcbiAgICApXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCdtYXgtZGVwZW5kZW5jaWVzJyksXG4gICAgfSxcblxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICAndHlwZSc6ICdvYmplY3QnLFxuICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAnbWF4JzogeyAndHlwZSc6ICdudW1iZXInIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdhZGRpdGlvbmFsUHJvcGVydGllcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuXG4gIGNyZWF0ZTogY29udGV4dCA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gbmV3IFNldCgpIC8vIGtlZXAgdHJhY2sgb2YgZGVwZW5kZW5jaWVzXG4gICAgbGV0IGxhc3ROb2RlIC8vIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3Qgbm9kZSB0byByZXBvcnQgb25cblxuICAgIHJldHVybiB7XG4gICAgICBJbXBvcnREZWNsYXJhdGlvbihub2RlKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5hZGQobm9kZS5zb3VyY2UudmFsdWUpXG4gICAgICAgIGxhc3ROb2RlID0gbm9kZS5zb3VyY2VcbiAgICAgIH0sXG5cbiAgICAgIENhbGxFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKGlzU3RhdGljUmVxdWlyZShub2RlKSkge1xuICAgICAgICAgIGNvbnN0IFsgcmVxdWlyZVBhdGggXSA9IG5vZGUuYXJndW1lbnRzXG4gICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChyZXF1aXJlUGF0aC52YWx1ZSlcbiAgICAgICAgICBsYXN0Tm9kZSA9IG5vZGVcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgJ1Byb2dyYW06ZXhpdCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY291bnREZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzLCBsYXN0Tm9kZSwgY29udGV4dClcbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9tYXgtZGVwZW5kZW5jaWVzLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfTUFYIiwiY291bnREZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmNpZXMiLCJsYXN0Tm9kZSIsImNvbnRleHQiLCJvcHRpb25zIiwibWF4Iiwic2l6ZSIsInJlcG9ydCIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJTZXQiLCJJbXBvcnREZWNsYXJhdGlvbiIsIm5vZGUiLCJhZGQiLCJzb3VyY2UiLCJ2YWx1ZSIsIkNhbGxFeHByZXNzaW9uIiwiYXJndW1lbnRzIiwicmVxdWlyZVBhdGgiXSwibWFwcGluZ3MiOiJxb0JBQUEsc0Q7QUFDQSxxQzs7QUFFQSxNQUFNQSxjQUFjLEVBQXBCOztBQUVBLE1BQU1DLG9CQUFvQixDQUFDQyxZQUFELEVBQWVDLFFBQWYsRUFBeUJDLE9BQXpCLEtBQXFDO0FBQy9DQSxVQUFRQyxPQUFSLENBQWdCLENBQWhCLEtBQXNCLEVBQUVDLEtBQUtOLFdBQVAsRUFEeUIsT0FDdERNLEdBRHNELFFBQ3REQSxHQURzRDs7QUFHN0QsTUFBSUosYUFBYUssSUFBYixHQUFvQkQsR0FBeEIsRUFBNkI7QUFDM0JGLFlBQVFJLE1BQVI7QUFDRUwsWUFERjtBQUVHLHVDQUFrQ0csR0FBSSxhQUZ6Qzs7QUFJRDtBQUNGLENBVEQ7O0FBV0FHLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFlBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLGtCQUFSLENBREQsRUFGRjs7O0FBTUpDLFlBQVE7QUFDTjtBQUNFLGNBQVEsUUFEVjtBQUVFLG9CQUFjO0FBQ1osZUFBTyxFQUFFLFFBQVEsUUFBVixFQURLLEVBRmhCOztBQUtFLDhCQUF3QixLQUwxQixFQURNLENBTkosRUFEUzs7Ozs7QUFrQmZDLFVBQVFaLFdBQVc7QUFDakIsVUFBTUYsZUFBZSxJQUFJZSxHQUFKLEVBQXJCLENBRGlCLENBQ2M7QUFDL0IsUUFBSWQsUUFBSixDQUZpQixDQUVKOztBQUViLFdBQU87QUFDTGUsd0JBQWtCQyxJQUFsQixFQUF3QjtBQUN0QmpCLHFCQUFha0IsR0FBYixDQUFpQkQsS0FBS0UsTUFBTCxDQUFZQyxLQUE3QjtBQUNBbkIsbUJBQVdnQixLQUFLRSxNQUFoQjtBQUNELE9BSkk7O0FBTUxFLHFCQUFlSixJQUFmLEVBQXFCO0FBQ25CLFlBQUksNkJBQWdCQSxJQUFoQixDQUFKLEVBQTJCO0FBQ0RBLGVBQUtLLFNBREosV0FDakJDLFdBRGlCO0FBRXpCdkIsdUJBQWFrQixHQUFiLENBQWlCSyxZQUFZSCxLQUE3QjtBQUNBbkIscUJBQVdnQixJQUFYO0FBQ0Q7QUFDRixPQVpJOztBQWNMLHNCQUFnQixZQUFZO0FBQzFCbEIsMEJBQWtCQyxZQUFsQixFQUFnQ0MsUUFBaEMsRUFBMENDLE9BQTFDO0FBQ0QsT0FoQkksRUFBUDs7QUFrQkQsR0F4Q2MsRUFBakIiLCJmaWxlIjoibWF4LWRlcGVuZGVuY2llcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpc1N0YXRpY1JlcXVpcmUgZnJvbSAnLi4vY29yZS9zdGF0aWNSZXF1aXJlJ1xuaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcblxuY29uc3QgREVGQVVMVF9NQVggPSAxMFxuXG5jb25zdCBjb3VudERlcGVuZGVuY2llcyA9IChkZXBlbmRlbmNpZXMsIGxhc3ROb2RlLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHttYXh9ID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHsgbWF4OiBERUZBVUxUX01BWCB9XG5cbiAgaWYgKGRlcGVuZGVuY2llcy5zaXplID4gbWF4KSB7XG4gICAgY29udGV4dC5yZXBvcnQoXG4gICAgICBsYXN0Tm9kZSxcbiAgICAgIGBNYXhpbXVtIG51bWJlciBvZiBkZXBlbmRlbmNpZXMgKCR7bWF4fSkgZXhjZWVkZWQuYFxuICAgIClcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ21heC1kZXBlbmRlbmNpZXMnKSxcbiAgICB9LFxuXG4gICAgc2NoZW1hOiBbXG4gICAgICB7XG4gICAgICAgICd0eXBlJzogJ29iamVjdCcsXG4gICAgICAgICdwcm9wZXJ0aWVzJzoge1xuICAgICAgICAgICdtYXgnOiB7ICd0eXBlJzogJ251bWJlcicgfSxcbiAgICAgICAgfSxcbiAgICAgICAgJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5cbiAgY3JlYXRlOiBjb250ZXh0ID0+IHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBuZXcgU2V0KCkgLy8ga2VlcCB0cmFjayBvZiBkZXBlbmRlbmNpZXNcbiAgICBsZXQgbGFzdE5vZGUgLy8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBub2RlIHRvIHJlcG9ydCBvblxuXG4gICAgcmV0dXJuIHtcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChub2RlLnNvdXJjZS52YWx1ZSlcbiAgICAgICAgbGFzdE5vZGUgPSBub2RlLnNvdXJjZVxuICAgICAgfSxcblxuICAgICAgQ2FsbEV4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBpZiAoaXNTdGF0aWNSZXF1aXJlKG5vZGUpKSB7XG4gICAgICAgICAgY29uc3QgWyByZXF1aXJlUGF0aCBdID0gbm9kZS5hcmd1bWVudHNcbiAgICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKHJlcXVpcmVQYXRoLnZhbHVlKVxuICAgICAgICAgIGxhc3ROb2RlID0gbm9kZVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAnUHJvZ3JhbTpleGl0JzogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb3VudERlcGVuZGVuY2llcyhkZXBlbmRlbmNpZXMsIGxhc3ROb2RlLCBjb250ZXh0KVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/named.js b/node_modules/eslint-plugin-import/lib/rules/named.js
index 62dcb64..f2b5166 100644
--- a/node_modules/eslint-plugin-import/lib/rules/named.js
+++ b/node_modules/eslint-plugin-import/lib/rules/named.js
@@ -1,40 +1,26 @@
-'use strict';
-
-var _path = require('path');
-
-var path = _interopRequireWildcard(_path);
-
-var _ExportMap = require('../ExportMap');
-
-var _ExportMap2 = _interopRequireDefault(_ExportMap);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+'use strict';var _path = require('path');var path = _interopRequireWildcard(_path);
+var _ExportMap = require('../ExportMap');var _ExportMap2 = _interopRequireDefault(_ExportMap);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _interopRequireWildcard(obj) {if (obj && obj.__esModule) {return obj;} else {var newObj = {};if (obj != null) {for (var key in obj) {if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];}}newObj.default = obj;return newObj;}}
 
 module.exports = {
   meta: {
     type: 'problem',
     docs: {
-      url: (0, _docsUrl2.default)('named')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('named') },
+
+    schema: [] },
+
 
   create: function (context) {
     function checkSpecifiers(key, type, node) {
       // ignore local exports and type imports/exports
-      if (node.source == null || node.importKind === 'type' || node.importKind === 'typeof' || node.exportKind === 'type') {
+      if (node.source == null || node.importKind === 'type' ||
+      node.importKind === 'typeof' || node.exportKind === 'type') {
         return;
       }
 
-      if (!node.specifiers.some(function (im) {
-        return im.type === type;
-      })) {
+      if (!node.specifiers.
+      some(function (im) {return im.type === type;})) {
         return; // no named imports/exports
       }
 
@@ -56,21 +42,31 @@
 
         if (!deepLookup.found) {
           if (deepLookup.path.length > 1) {
-            const deepPath = deepLookup.path.map(i => path.relative(path.dirname(context.getFilename()), i.path)).join(' -> ');
+            const deepPath = deepLookup.path.
+            map(i => path.relative(path.dirname(context.getFilename()), i.path)).
+            join(' -> ');
 
-            context.report(im[key], `${im[key].name} not found via ${deepPath}`);
+            context.report(im[key],
+            `${im[key].name} not found via ${deepPath}`);
           } else {
-            context.report(im[key], im[key].name + ' not found in \'' + node.source.value + '\'');
+            context.report(im[key],
+            im[key].name + ' not found in \'' + node.source.value + '\'');
           }
         }
       });
     }
 
     return {
-      'ImportDeclaration': checkSpecifiers.bind(null, 'imported', 'ImportSpecifier'),
+      'ImportDeclaration': checkSpecifiers.bind(null,
+      'imported',
+      'ImportSpecifier'),
 
-      'ExportNamedDeclaration': checkSpecifiers.bind(null, 'local', 'ExportSpecifier')
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uYW1lZC5qcyJdLCJuYW1lcyI6WyJwYXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJjaGVja1NwZWNpZmllcnMiLCJrZXkiLCJub2RlIiwic291cmNlIiwiaW1wb3J0S2luZCIsImV4cG9ydEtpbmQiLCJzcGVjaWZpZXJzIiwic29tZSIsImltIiwiaW1wb3J0cyIsIkV4cG9ydHMiLCJnZXQiLCJ2YWx1ZSIsImVycm9ycyIsImxlbmd0aCIsInJlcG9ydEVycm9ycyIsImZvckVhY2giLCJkZWVwTG9va3VwIiwiaGFzRGVlcCIsIm5hbWUiLCJmb3VuZCIsImRlZXBQYXRoIiwibWFwIiwiaSIsInJlbGF0aXZlIiwiZGlybmFtZSIsImdldEZpbGVuYW1lIiwiam9pbiIsInJlcG9ydCIsImJpbmQiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0lBQVlBLEk7O0FBQ1o7Ozs7QUFDQTs7Ozs7Ozs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sU0FERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsT0FBUjtBQURELEtBRkY7QUFLSkMsWUFBUTtBQUxKLEdBRFM7O0FBU2ZDLFVBQVEsVUFBVUMsT0FBVixFQUFtQjtBQUN6QixhQUFTQyxlQUFULENBQXlCQyxHQUF6QixFQUE4QlAsSUFBOUIsRUFBb0NRLElBQXBDLEVBQTBDO0FBQ3hDO0FBQ0EsVUFBSUEsS0FBS0MsTUFBTCxJQUFlLElBQWYsSUFBdUJELEtBQUtFLFVBQUwsS0FBb0IsTUFBM0MsSUFDQUYsS0FBS0UsVUFBTCxLQUFvQixRQURwQixJQUNpQ0YsS0FBS0csVUFBTCxLQUFvQixNQUR6RCxFQUNpRTtBQUMvRDtBQUNEOztBQUVELFVBQUksQ0FBQ0gsS0FBS0ksVUFBTCxDQUNFQyxJQURGLENBQ08sVUFBVUMsRUFBVixFQUFjO0FBQUUsZUFBT0EsR0FBR2QsSUFBSCxLQUFZQSxJQUFuQjtBQUF5QixPQURoRCxDQUFMLEVBQ3dEO0FBQ3RELGVBRHNELENBQy9DO0FBQ1I7O0FBRUQsWUFBTWUsVUFBVUMsb0JBQVFDLEdBQVIsQ0FBWVQsS0FBS0MsTUFBTCxDQUFZUyxLQUF4QixFQUErQmIsT0FBL0IsQ0FBaEI7QUFDQSxVQUFJVSxXQUFXLElBQWYsRUFBcUI7O0FBRXJCLFVBQUlBLFFBQVFJLE1BQVIsQ0FBZUMsTUFBbkIsRUFBMkI7QUFDekJMLGdCQUFRTSxZQUFSLENBQXFCaEIsT0FBckIsRUFBOEJHLElBQTlCO0FBQ0E7QUFDRDs7QUFFREEsV0FBS0ksVUFBTCxDQUFnQlUsT0FBaEIsQ0FBd0IsVUFBVVIsRUFBVixFQUFjO0FBQ3BDLFlBQUlBLEdBQUdkLElBQUgsS0FBWUEsSUFBaEIsRUFBc0I7O0FBRXRCO0FBQ0EsWUFBSWMsR0FBR0osVUFBSCxLQUFrQixNQUFsQixJQUE0QkksR0FBR0osVUFBSCxLQUFrQixRQUFsRCxFQUE0RDs7QUFFNUQsY0FBTWEsYUFBYVIsUUFBUVMsT0FBUixDQUFnQlYsR0FBR1AsR0FBSCxFQUFRa0IsSUFBeEIsQ0FBbkI7O0FBRUEsWUFBSSxDQUFDRixXQUFXRyxLQUFoQixFQUF1QjtBQUNyQixjQUFJSCxXQUFXM0IsSUFBWCxDQUFnQndCLE1BQWhCLEdBQXlCLENBQTdCLEVBQWdDO0FBQzlCLGtCQUFNTyxXQUFXSixXQUFXM0IsSUFBWCxDQUNkZ0MsR0FEYyxDQUNWQyxLQUFLakMsS0FBS2tDLFFBQUwsQ0FBY2xDLEtBQUttQyxPQUFMLENBQWExQixRQUFRMkIsV0FBUixFQUFiLENBQWQsRUFBbURILEVBQUVqQyxJQUFyRCxDQURLLEVBRWRxQyxJQUZjLENBRVQsTUFGUyxDQUFqQjs7QUFJQTVCLG9CQUFRNkIsTUFBUixDQUFlcEIsR0FBR1AsR0FBSCxDQUFmLEVBQ0csR0FBRU8sR0FBR1AsR0FBSCxFQUFRa0IsSUFBSyxrQkFBaUJFLFFBQVMsRUFENUM7QUFFRCxXQVBELE1BT087QUFDTHRCLG9CQUFRNkIsTUFBUixDQUFlcEIsR0FBR1AsR0FBSCxDQUFmLEVBQ0VPLEdBQUdQLEdBQUgsRUFBUWtCLElBQVIsR0FBZSxrQkFBZixHQUFvQ2pCLEtBQUtDLE1BQUwsQ0FBWVMsS0FBaEQsR0FBd0QsSUFEMUQ7QUFFRDtBQUNGO0FBQ0YsT0FyQkQ7QUFzQkQ7O0FBRUQsV0FBTztBQUNMLDJCQUFxQlosZ0JBQWdCNkIsSUFBaEIsQ0FBc0IsSUFBdEIsRUFDc0IsVUFEdEIsRUFFc0IsaUJBRnRCLENBRGhCOztBQU1MLGdDQUEwQjdCLGdCQUFnQjZCLElBQWhCLENBQXNCLElBQXRCLEVBQ3NCLE9BRHRCLEVBRXNCLGlCQUZ0QjtBQU5yQixLQUFQO0FBWUQ7QUFsRWMsQ0FBakIiLCJmaWxlIjoibmFtZWQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgRXhwb3J0cyBmcm9tICcuLi9FeHBvcnRNYXAnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25hbWVkJyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBmdW5jdGlvbiBjaGVja1NwZWNpZmllcnMoa2V5LCB0eXBlLCBub2RlKSB7XG4gICAgICAvLyBpZ25vcmUgbG9jYWwgZXhwb3J0cyBhbmQgdHlwZSBpbXBvcnRzL2V4cG9ydHNcbiAgICAgIGlmIChub2RlLnNvdXJjZSA9PSBudWxsIHx8IG5vZGUuaW1wb3J0S2luZCA9PT0gJ3R5cGUnIHx8XG4gICAgICAgICAgbm9kZS5pbXBvcnRLaW5kID09PSAndHlwZW9mJyAgfHwgbm9kZS5leHBvcnRLaW5kID09PSAndHlwZScpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICghbm9kZS5zcGVjaWZpZXJzXG4gICAgICAgICAgICAuc29tZShmdW5jdGlvbiAoaW0pIHsgcmV0dXJuIGltLnR5cGUgPT09IHR5cGUgfSkpIHtcbiAgICAgICAgcmV0dXJuIC8vIG5vIG5hbWVkIGltcG9ydHMvZXhwb3J0c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbXBvcnRzID0gRXhwb3J0cy5nZXQobm9kZS5zb3VyY2UudmFsdWUsIGNvbnRleHQpXG4gICAgICBpZiAoaW1wb3J0cyA9PSBudWxsKSByZXR1cm5cblxuICAgICAgaWYgKGltcG9ydHMuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICBpbXBvcnRzLnJlcG9ydEVycm9ycyhjb250ZXh0LCBub2RlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbm9kZS5zcGVjaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKGltKSB7XG4gICAgICAgIGlmIChpbS50eXBlICE9PSB0eXBlKSByZXR1cm5cblxuICAgICAgICAvLyBpZ25vcmUgdHlwZSBpbXBvcnRzXG4gICAgICAgIGlmIChpbS5pbXBvcnRLaW5kID09PSAndHlwZScgfHwgaW0uaW1wb3J0S2luZCA9PT0gJ3R5cGVvZicpIHJldHVyblxuXG4gICAgICAgIGNvbnN0IGRlZXBMb29rdXAgPSBpbXBvcnRzLmhhc0RlZXAoaW1ba2V5XS5uYW1lKVxuXG4gICAgICAgIGlmICghZGVlcExvb2t1cC5mb3VuZCkge1xuICAgICAgICAgIGlmIChkZWVwTG9va3VwLnBhdGgubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgZGVlcFBhdGggPSBkZWVwTG9va3VwLnBhdGhcbiAgICAgICAgICAgICAgLm1hcChpID0+IHBhdGgucmVsYXRpdmUocGF0aC5kaXJuYW1lKGNvbnRleHQuZ2V0RmlsZW5hbWUoKSksIGkucGF0aCkpXG4gICAgICAgICAgICAgIC5qb2luKCcgLT4gJylcblxuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoaW1ba2V5XSxcbiAgICAgICAgICAgICAgYCR7aW1ba2V5XS5uYW1lfSBub3QgZm91bmQgdmlhICR7ZGVlcFBhdGh9YClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoaW1ba2V5XSxcbiAgICAgICAgICAgICAgaW1ba2V5XS5uYW1lICsgJyBub3QgZm91bmQgaW4gXFwnJyArIG5vZGUuc291cmNlLnZhbHVlICsgJ1xcJycpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAnSW1wb3J0RGVjbGFyYXRpb24nOiBjaGVja1NwZWNpZmllcnMuYmluZCggbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdpbXBvcnRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnSW1wb3J0U3BlY2lmaWVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuXG4gICAgICAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbic6IGNoZWNrU3BlY2lmaWVycy5iaW5kKCBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnbG9jYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnRXhwb3J0U3BlY2lmaWVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgfVxuXG4gIH0sXG59XG4iXX0=
\ No newline at end of file
+
+      'ExportNamedDeclaration': checkSpecifiers.bind(null,
+      'local',
+      'ExportSpecifier') };
+
+
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uYW1lZC5qcyJdLCJuYW1lcyI6WyJwYXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJjaGVja1NwZWNpZmllcnMiLCJrZXkiLCJub2RlIiwic291cmNlIiwiaW1wb3J0S2luZCIsImV4cG9ydEtpbmQiLCJzcGVjaWZpZXJzIiwic29tZSIsImltIiwiaW1wb3J0cyIsIkV4cG9ydHMiLCJnZXQiLCJ2YWx1ZSIsImVycm9ycyIsImxlbmd0aCIsInJlcG9ydEVycm9ycyIsImZvckVhY2giLCJkZWVwTG9va3VwIiwiaGFzRGVlcCIsIm5hbWUiLCJmb3VuZCIsImRlZXBQYXRoIiwibWFwIiwiaSIsInJlbGF0aXZlIiwiZGlybmFtZSIsImdldEZpbGVuYW1lIiwiam9pbiIsInJlcG9ydCIsImJpbmQiXSwibWFwcGluZ3MiOiJhQUFBLDRCLElBQVlBLEk7QUFDWix5QztBQUNBLHFDOztBQUVBQyxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxTQURGO0FBRUpDLFVBQU07QUFDSkMsV0FBSyx1QkFBUSxPQUFSLENBREQsRUFGRjs7QUFLSkMsWUFBUSxFQUxKLEVBRFM7OztBQVNmQyxVQUFRLFVBQVVDLE9BQVYsRUFBbUI7QUFDekIsYUFBU0MsZUFBVCxDQUF5QkMsR0FBekIsRUFBOEJQLElBQTlCLEVBQW9DUSxJQUFwQyxFQUEwQztBQUN4QztBQUNBLFVBQUlBLEtBQUtDLE1BQUwsSUFBZSxJQUFmLElBQXVCRCxLQUFLRSxVQUFMLEtBQW9CLE1BQTNDO0FBQ0FGLFdBQUtFLFVBQUwsS0FBb0IsUUFEcEIsSUFDaUNGLEtBQUtHLFVBQUwsS0FBb0IsTUFEekQsRUFDaUU7QUFDL0Q7QUFDRDs7QUFFRCxVQUFJLENBQUNILEtBQUtJLFVBQUw7QUFDRUMsVUFERixDQUNPLFVBQVVDLEVBQVYsRUFBYyxDQUFFLE9BQU9BLEdBQUdkLElBQUgsS0FBWUEsSUFBbkIsQ0FBeUIsQ0FEaEQsQ0FBTCxFQUN3RDtBQUN0RCxlQURzRCxDQUMvQztBQUNSOztBQUVELFlBQU1lLFVBQVVDLG9CQUFRQyxHQUFSLENBQVlULEtBQUtDLE1BQUwsQ0FBWVMsS0FBeEIsRUFBK0JiLE9BQS9CLENBQWhCO0FBQ0EsVUFBSVUsV0FBVyxJQUFmLEVBQXFCOztBQUVyQixVQUFJQSxRQUFRSSxNQUFSLENBQWVDLE1BQW5CLEVBQTJCO0FBQ3pCTCxnQkFBUU0sWUFBUixDQUFxQmhCLE9BQXJCLEVBQThCRyxJQUE5QjtBQUNBO0FBQ0Q7O0FBRURBLFdBQUtJLFVBQUwsQ0FBZ0JVLE9BQWhCLENBQXdCLFVBQVVSLEVBQVYsRUFBYztBQUNwQyxZQUFJQSxHQUFHZCxJQUFILEtBQVlBLElBQWhCLEVBQXNCOztBQUV0QjtBQUNBLFlBQUljLEdBQUdKLFVBQUgsS0FBa0IsTUFBbEIsSUFBNEJJLEdBQUdKLFVBQUgsS0FBa0IsUUFBbEQsRUFBNEQ7O0FBRTVELGNBQU1hLGFBQWFSLFFBQVFTLE9BQVIsQ0FBZ0JWLEdBQUdQLEdBQUgsRUFBUWtCLElBQXhCLENBQW5COztBQUVBLFlBQUksQ0FBQ0YsV0FBV0csS0FBaEIsRUFBdUI7QUFDckIsY0FBSUgsV0FBVzNCLElBQVgsQ0FBZ0J3QixNQUFoQixHQUF5QixDQUE3QixFQUFnQztBQUM5QixrQkFBTU8sV0FBV0osV0FBVzNCLElBQVg7QUFDZGdDLGVBRGMsQ0FDVkMsS0FBS2pDLEtBQUtrQyxRQUFMLENBQWNsQyxLQUFLbUMsT0FBTCxDQUFhMUIsUUFBUTJCLFdBQVIsRUFBYixDQUFkLEVBQW1ESCxFQUFFakMsSUFBckQsQ0FESztBQUVkcUMsZ0JBRmMsQ0FFVCxNQUZTLENBQWpCOztBQUlBNUIsb0JBQVE2QixNQUFSLENBQWVwQixHQUFHUCxHQUFILENBQWY7QUFDRyxlQUFFTyxHQUFHUCxHQUFILEVBQVFrQixJQUFLLGtCQUFpQkUsUUFBUyxFQUQ1QztBQUVELFdBUEQsTUFPTztBQUNMdEIsb0JBQVE2QixNQUFSLENBQWVwQixHQUFHUCxHQUFILENBQWY7QUFDRU8sZUFBR1AsR0FBSCxFQUFRa0IsSUFBUixHQUFlLGtCQUFmLEdBQW9DakIsS0FBS0MsTUFBTCxDQUFZUyxLQUFoRCxHQUF3RCxJQUQxRDtBQUVEO0FBQ0Y7QUFDRixPQXJCRDtBQXNCRDs7QUFFRCxXQUFPO0FBQ0wsMkJBQXFCWixnQkFBZ0I2QixJQUFoQixDQUFzQixJQUF0QjtBQUNzQixnQkFEdEI7QUFFc0IsdUJBRnRCLENBRGhCOzs7QUFNTCxnQ0FBMEI3QixnQkFBZ0I2QixJQUFoQixDQUFzQixJQUF0QjtBQUNzQixhQUR0QjtBQUVzQix1QkFGdEIsQ0FOckIsRUFBUDs7OztBQVlELEdBbEVjLEVBQWpCIiwiZmlsZSI6Im5hbWVkLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IEV4cG9ydHMgZnJvbSAnLi4vRXhwb3J0TWFwJ1xuaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAncHJvYmxlbScsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduYW1lZCcpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgZnVuY3Rpb24gY2hlY2tTcGVjaWZpZXJzKGtleSwgdHlwZSwgbm9kZSkge1xuICAgICAgLy8gaWdub3JlIGxvY2FsIGV4cG9ydHMgYW5kIHR5cGUgaW1wb3J0cy9leHBvcnRzXG4gICAgICBpZiAobm9kZS5zb3VyY2UgPT0gbnVsbCB8fCBub2RlLmltcG9ydEtpbmQgPT09ICd0eXBlJyB8fFxuICAgICAgICAgIG5vZGUuaW1wb3J0S2luZCA9PT0gJ3R5cGVvZicgIHx8IG5vZGUuZXhwb3J0S2luZCA9PT0gJ3R5cGUnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoIW5vZGUuc3BlY2lmaWVyc1xuICAgICAgICAgICAgLnNvbWUoZnVuY3Rpb24gKGltKSB7IHJldHVybiBpbS50eXBlID09PSB0eXBlIH0pKSB7XG4gICAgICAgIHJldHVybiAvLyBubyBuYW1lZCBpbXBvcnRzL2V4cG9ydHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW1wb3J0cyA9IEV4cG9ydHMuZ2V0KG5vZGUuc291cmNlLnZhbHVlLCBjb250ZXh0KVxuICAgICAgaWYgKGltcG9ydHMgPT0gbnVsbCkgcmV0dXJuXG5cbiAgICAgIGlmIChpbXBvcnRzLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgaW1wb3J0cy5yZXBvcnRFcnJvcnMoY29udGV4dCwgbm9kZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIG5vZGUuc3BlY2lmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChpbSkge1xuICAgICAgICBpZiAoaW0udHlwZSAhPT0gdHlwZSkgcmV0dXJuXG5cbiAgICAgICAgLy8gaWdub3JlIHR5cGUgaW1wb3J0c1xuICAgICAgICBpZiAoaW0uaW1wb3J0S2luZCA9PT0gJ3R5cGUnIHx8IGltLmltcG9ydEtpbmQgPT09ICd0eXBlb2YnKSByZXR1cm5cblxuICAgICAgICBjb25zdCBkZWVwTG9va3VwID0gaW1wb3J0cy5oYXNEZWVwKGltW2tleV0ubmFtZSlcblxuICAgICAgICBpZiAoIWRlZXBMb29rdXAuZm91bmQpIHtcbiAgICAgICAgICBpZiAoZGVlcExvb2t1cC5wYXRoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZXBQYXRoID0gZGVlcExvb2t1cC5wYXRoXG4gICAgICAgICAgICAgIC5tYXAoaSA9PiBwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShjb250ZXh0LmdldEZpbGVuYW1lKCkpLCBpLnBhdGgpKVxuICAgICAgICAgICAgICAuam9pbignIC0+ICcpXG5cbiAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KGltW2tleV0sXG4gICAgICAgICAgICAgIGAke2ltW2tleV0ubmFtZX0gbm90IGZvdW5kIHZpYSAke2RlZXBQYXRofWApXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KGltW2tleV0sXG4gICAgICAgICAgICAgIGltW2tleV0ubmFtZSArICcgbm90IGZvdW5kIGluIFxcJycgKyBub2RlLnNvdXJjZS52YWx1ZSArICdcXCcnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ0ltcG9ydERlY2xhcmF0aW9uJzogY2hlY2tTcGVjaWZpZXJzLmJpbmQoIG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnaW1wb3J0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ0ltcG9ydFNwZWNpZmllcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcblxuICAgICAgJ0V4cG9ydE5hbWVkRGVjbGFyYXRpb24nOiBjaGVja1NwZWNpZmllcnMuYmluZCggbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ2xvY2FsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ0V4cG9ydFNwZWNpZmllcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgIH1cblxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/namespace.js b/node_modules/eslint-plugin-import/lib/rules/namespace.js
index 0554188..0b9abf8 100644
--- a/node_modules/eslint-plugin-import/lib/rules/namespace.js
+++ b/node_modules/eslint-plugin-import/lib/rules/namespace.js
@@ -1,64 +1,46 @@
-'use strict';
-
-var _declaredScope = require('eslint-module-utils/declaredScope');
-
-var _declaredScope2 = _interopRequireDefault(_declaredScope);
-
-var _ExportMap = require('../ExportMap');
-
-var _ExportMap2 = _interopRequireDefault(_ExportMap);
-
-var _importDeclaration = require('../importDeclaration');
-
-var _importDeclaration2 = _interopRequireDefault(_importDeclaration);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _declaredScope = require('eslint-module-utils/declaredScope');var _declaredScope2 = _interopRequireDefault(_declaredScope);
+var _ExportMap = require('../ExportMap');var _ExportMap2 = _interopRequireDefault(_ExportMap);
+var _importDeclaration = require('../importDeclaration');var _importDeclaration2 = _interopRequireDefault(_importDeclaration);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'problem',
     docs: {
-      url: (0, _docsUrl2.default)('namespace')
-    },
+      url: (0, _docsUrl2.default)('namespace') },
 
-    schema: [{
-      'type': 'object',
-      'properties': {
-        'allowComputed': {
-          'description': 'If `false`, will report computed (and thus, un-lintable) references ' + 'to namespace members.',
-          'type': 'boolean',
-          'default': false
-        }
-      },
-      'additionalProperties': false
-    }]
-  },
+
+    schema: [
+    {
+      type: 'object',
+      properties: {
+        allowComputed: {
+          description: 'If `false`, will report computed (and thus, un-lintable) references to namespace members.',
+          type: 'boolean',
+          default: false } },
+
+
+      additionalProperties: false }] },
+
+
+
 
   create: function namespaceRule(context) {
 
     // read options
-    var _ref = context.options[0] || {},
-        _ref$allowComputed = _ref.allowComputed;
+    var _ref =
 
-    const allowComputed = _ref$allowComputed === undefined ? false : _ref$allowComputed;
-
+    context.options[0] || {},_ref$allowComputed = _ref.allowComputed;const allowComputed = _ref$allowComputed === undefined ? false : _ref$allowComputed;
 
     const namespaces = new Map();
 
     function makeMessage(last, namepath) {
-      return `'${last.name}' not found in` + (namepath.length > 1 ? ' deeply ' : ' ') + `imported namespace '${namepath.join('.')}'.`;
+      return `'${last.name}' not found in ${namepath.length > 1 ? 'deeply ' : ''}imported namespace '${namepath.join('.')}'.`;
     }
 
     return {
-
       // pick up all imports at body entry time, to properly respect hoisting
-      Program: function (_ref2) {
-        let body = _ref2.body;
-
+      Program(_ref2) {let body = _ref2.body;
         function processBodyStatement(declaration) {
           if (declaration.type !== 'ImportDeclaration') return;
 
@@ -76,28 +58,31 @@
             switch (specifier.type) {
               case 'ImportNamespaceSpecifier':
                 if (!imports.size) {
-                  context.report(specifier, `No exported names found in module '${declaration.source.value}'.`);
+                  context.report(
+                  specifier,
+                  `No exported names found in module '${declaration.source.value}'.`);
+
                 }
                 namespaces.set(specifier.local.name, imports);
                 break;
               case 'ImportDefaultSpecifier':
-              case 'ImportSpecifier':
-                {
+              case 'ImportSpecifier':{
                   const meta = imports.get(
                   // default to 'default' for default http://i.imgur.com/nj6qAWy.jpg
                   specifier.imported ? specifier.imported.name : 'default');
-                  if (!meta || !meta.namespace) break;
+
+                  if (!meta || !meta.namespace) {break;}
                   namespaces.set(specifier.local.name, meta.namespace);
                   break;
-                }
-            }
+                }}
+
           }
         }
         body.forEach(processBodyStatement);
       },
 
       // same as above, but does not add names to local map
-      ExportNamespaceSpecifier: function (namespace) {
+      ExportNamespaceSpecifier(namespace) {
         var declaration = (0, _importDeclaration2.default)(context);
 
         var imports = _ExportMap2.default.get(declaration.source.value, context);
@@ -109,18 +94,25 @@
         }
 
         if (!imports.size) {
-          context.report(namespace, `No exported names found in module '${declaration.source.value}'.`);
+          context.report(
+          namespace,
+          `No exported names found in module '${declaration.source.value}'.`);
+
         }
       },
 
       // todo: check for possible redefinition
 
-      MemberExpression: function (dereference) {
+      MemberExpression(dereference) {
         if (dereference.object.type !== 'Identifier') return;
         if (!namespaces.has(dereference.object.name)) return;
+        if ((0, _declaredScope2.default)(context, dereference.object.name) !== 'module') return;
 
         if (dereference.parent.type === 'AssignmentExpression' && dereference.parent.left === dereference) {
-          context.report(dereference.parent, `Assignment to member of namespace '${dereference.object.name}'.`);
+          context.report(
+          dereference.parent,
+          `Assignment to member of namespace '${dereference.object.name}'.`);
+
         }
 
         // go deep
@@ -131,13 +123,19 @@
 
           if (dereference.computed) {
             if (!allowComputed) {
-              context.report(dereference.property, 'Unable to validate computed reference to imported namespace \'' + dereference.object.name + '\'.');
+              context.report(
+              dereference.property,
+              `Unable to validate computed reference to imported namespace '${dereference.object.name}'.`);
+
             }
             return;
           }
 
           if (!namespace.has(dereference.property.name)) {
-            context.report(dereference.property, makeMessage(dereference.property, namepath));
+            context.report(
+            dereference.property,
+            makeMessage(dereference.property, namepath));
+
             break;
           }
 
@@ -149,12 +147,10 @@
           namespace = exported.namespace;
           dereference = dereference.parent;
         }
+
       },
 
-      VariableDeclarator: function (_ref3) {
-        let id = _ref3.id,
-            init = _ref3.init;
-
+      VariableDeclarator(_ref3) {let id = _ref3.id,init = _ref3.init;
         if (init == null) return;
         if (init.type !== 'Identifier') return;
         if (!namespaces.has(init.name)) return;
@@ -163,31 +159,33 @@
         if ((0, _declaredScope2.default)(context, init.name) !== 'module') return;
 
         // DFS traverse child namespaces
-        function testKey(pattern, namespace) {
-          let path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [init.name];
-
+        function testKey(pattern, namespace) {let path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [init.name];
           if (!(namespace instanceof _ExportMap2.default)) return;
 
           if (pattern.type !== 'ObjectPattern') return;
 
           for (const property of pattern.properties) {
-            if (property.type === 'ExperimentalRestProperty' || property.type === 'RestElement' || !property.key) {
+            if (
+            property.type === 'ExperimentalRestProperty' ||
+            property.type === 'RestElement' ||
+            !property.key)
+            {
               continue;
             }
 
             if (property.key.type !== 'Identifier') {
               context.report({
                 node: property,
-                message: 'Only destructure top-level names.'
-              });
+                message: 'Only destructure top-level names.' });
+
               continue;
             }
 
             if (!namespace.has(property.key.name)) {
               context.report({
                 node: property,
-                message: makeMessage(property.key, path)
-              });
+                message: makeMessage(property.key, path) });
+
               continue;
             }
 
@@ -204,20 +202,16 @@
         testKey(id, namespaces.get(init.name));
       },
 
-      JSXMemberExpression: function (_ref4) {
-        let object = _ref4.object,
-            property = _ref4.property;
-
+      JSXMemberExpression(_ref4) {let object = _ref4.object,property = _ref4.property;
         if (!namespaces.has(object.name)) return;
         var namespace = namespaces.get(object.name);
         if (!namespace.has(property.name)) {
           context.report({
             node: property,
-            message: makeMessage(property, [object.name])
-          });
+            message: makeMessage(property, [object.name]) });
+
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uYW1lc3BhY2UuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsIm5hbWVzcGFjZVJ1bGUiLCJjb250ZXh0Iiwib3B0aW9ucyIsImFsbG93Q29tcHV0ZWQiLCJuYW1lc3BhY2VzIiwiTWFwIiwibWFrZU1lc3NhZ2UiLCJsYXN0IiwibmFtZXBhdGgiLCJuYW1lIiwibGVuZ3RoIiwiam9pbiIsIlByb2dyYW0iLCJib2R5IiwicHJvY2Vzc0JvZHlTdGF0ZW1lbnQiLCJkZWNsYXJhdGlvbiIsInNwZWNpZmllcnMiLCJpbXBvcnRzIiwiRXhwb3J0cyIsImdldCIsInNvdXJjZSIsInZhbHVlIiwiZXJyb3JzIiwicmVwb3J0RXJyb3JzIiwic3BlY2lmaWVyIiwic2l6ZSIsInJlcG9ydCIsInNldCIsImxvY2FsIiwiaW1wb3J0ZWQiLCJuYW1lc3BhY2UiLCJmb3JFYWNoIiwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyIiwiTWVtYmVyRXhwcmVzc2lvbiIsImRlcmVmZXJlbmNlIiwib2JqZWN0IiwiaGFzIiwicGFyZW50IiwibGVmdCIsImNvbXB1dGVkIiwicHJvcGVydHkiLCJleHBvcnRlZCIsInB1c2giLCJWYXJpYWJsZURlY2xhcmF0b3IiLCJpZCIsImluaXQiLCJ0ZXN0S2V5IiwicGF0dGVybiIsInBhdGgiLCJwcm9wZXJ0aWVzIiwia2V5Iiwibm9kZSIsIm1lc3NhZ2UiLCJkZXBlbmRlbmN5RXhwb3J0TWFwIiwicG9wIiwiSlNYTWVtYmVyRXhwcmVzc2lvbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUFBLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFNBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLFdBQVI7QUFERCxLQUZGOztBQU1KQyxZQUFRLENBQ047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QUF0QixDQUFoQjtBQUNBLFlBQUksQ0FBQ3FCLFVBQVVNLEdBQVYsQ0FBY0ksU0FBUy9CLElBQXZCLENBQUwsRUFBbUM7QUFDakNSLGtCQUFReUIsTUFBUixDQUFlO0FBQ2J5QixrQkFBTVgsUUFETztBQUViWSxxQkFBUzlDLFlBQVlrQyxRQUFaLEVBQXNCLENBQUNMLE9BQU8xQixJQUFSLENBQXRCO0FBRkksV0FBZjtBQUlEO0FBQ0g7QUF0S0ksS0FBUDtBQXdLRDtBQS9NYyxDQUFqQiIsImZpbGUiOiJuYW1lc3BhY2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZGVjbGFyZWRTY29wZSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL2RlY2xhcmVkU2NvcGUnXG5pbXBvcnQgRXhwb3J0cyBmcm9tICcuLi9FeHBvcnRNYXAnXG5pbXBvcnQgaW1wb3J0RGVjbGFyYXRpb24gZnJvbSAnLi4vaW1wb3J0RGVjbGFyYXRpb24nXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25hbWVzcGFjZScpLFxuICAgIH0sXG5cbiAgICBzY2hlbWE6IFtcbiAgICAgIHtcbiAgICAgICAgJ3R5cGUnOiAnb2JqZWN0JyxcbiAgICAgICAgJ3Byb3BlcnRpZXMnOiB7XG4gICAgICAgICAgJ2FsbG93Q29tcHV0ZWQnOiB7XG4gICAgICAgICAgICAnZGVzY3JpcHRpb24nOlxuICAgICAgICAgICAgICAnSWYgYGZhbHNlYCwgd2lsbCByZXBvcnQgY29tcHV0ZWQgKGFuZCB0aHVzLCB1bi1saW50YWJsZSkgcmVmZXJlbmNlcyAnICtcbiAgICAgICAgICAgICAgJ3RvIG5hbWVzcGFjZSBtZW1iZXJzLicsXG4gICAgICAgICAgICAndHlwZSc6ICdib29sZWFuJyxcbiAgICAgICAgICAgICdkZWZhdWx0JzogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiBuYW1lc3BhY2VSdWxlKGNvbnRleHQpIHtcblxuICAgIC8vIHJlYWQgb3B0aW9uc1xuICAgIGNvbnN0IHtcbiAgICAgIGFsbG93Q29tcHV0ZWQgPSBmYWxzZSxcbiAgICB9ID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHt9XG5cbiAgICBjb25zdCBuYW1lc3BhY2VzID0gbmV3IE1hcCgpXG5cbiAgICBmdW5jdGlvbiBtYWtlTWVzc2FnZShsYXN0LCBuYW1lcGF0aCkge1xuICAgICAgIHJldHVybiBgJyR7bGFzdC5uYW1lfScgbm90IGZvdW5kIGluYCArXG4gICAgICAgICAgICAgIChuYW1lcGF0aC5sZW5ndGggPiAxID8gJyBkZWVwbHkgJyA6ICcgJykgK1xuICAgICAgICAgICAgICBgaW1wb3J0ZWQgbmFtZXNwYWNlICcke25hbWVwYXRoLmpvaW4oJy4nKX0nLmBcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuXG4gICAgICAvLyBwaWNrIHVwIGFsbCBpbXBvcnRzIGF0IGJvZHkgZW50cnkgdGltZSwgdG8gcHJvcGVybHkgcmVzcGVjdCBob2lzdGluZ1xuICAgICAgUHJvZ3JhbTogZnVuY3Rpb24gKHsgYm9keSB9KSB7XG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NCb2R5U3RhdGVtZW50KGRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgIT09ICdJbXBvcnREZWNsYXJhdGlvbicpIHJldHVyblxuXG4gICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLnNwZWNpZmllcnMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgICAgICAgIGNvbnN0IGltcG9ydHMgPSBFeHBvcnRzLmdldChkZWNsYXJhdGlvbi5zb3VyY2UudmFsdWUsIGNvbnRleHQpXG4gICAgICAgICAgaWYgKGltcG9ydHMgPT0gbnVsbCkgcmV0dXJuIG51bGxcblxuICAgICAgICAgIGlmIChpbXBvcnRzLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGltcG9ydHMucmVwb3J0RXJyb3JzKGNvbnRleHQsIGRlY2xhcmF0aW9uKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCBzcGVjaWZpZXIgb2YgZGVjbGFyYXRpb24uc3BlY2lmaWVycykge1xuICAgICAgICAgICAgc3dpdGNoIChzcGVjaWZpZXIudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInOlxuICAgICAgICAgICAgICAgIGlmICghaW1wb3J0cy5zaXplKSB7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydChzcGVjaWZpZXIsXG4gICAgICAgICAgICAgICAgICAgIGBObyBleHBvcnRlZCBuYW1lcyBmb3VuZCBpbiBtb2R1bGUgJyR7ZGVjbGFyYXRpb24uc291cmNlLnZhbHVlfScuYClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5zZXQoc3BlY2lmaWVyLmxvY2FsLm5hbWUsIGltcG9ydHMpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSAnSW1wb3J0RGVmYXVsdFNwZWNpZmllcic6XG4gICAgICAgICAgICAgIGNhc2UgJ0ltcG9ydFNwZWNpZmllcic6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gaW1wb3J0cy5nZXQoXG4gICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvICdkZWZhdWx0JyBmb3IgZGVmYXVsdCBodHRwOi8vaS5pbWd1ci5jb20vbmo2cUFXeS5qcGdcbiAgICAgICAgICAgICAgICAgIHNwZWNpZmllci5pbXBvcnRlZCA/IHNwZWNpZmllci5pbXBvcnRlZC5uYW1lIDogJ2RlZmF1bHQnKVxuICAgICAgICAgICAgICAgIGlmICghbWV0YSB8fCAhbWV0YS5uYW1lc3BhY2UpIGJyZWFrXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5zZXQoc3BlY2lmaWVyLmxvY2FsLm5hbWUsIG1ldGEubmFtZXNwYWNlKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYm9keS5mb3JFYWNoKHByb2Nlc3NCb2R5U3RhdGVtZW50KVxuICAgICAgfSxcblxuICAgICAgLy8gc2FtZSBhcyBhYm92ZSwgYnV0IGRvZXMgbm90IGFkZCBuYW1lcyB0byBsb2NhbCBtYXBcbiAgICAgIEV4cG9ydE5hbWVzcGFjZVNwZWNpZmllcjogZnVuY3Rpb24gKG5hbWVzcGFjZSkge1xuICAgICAgICB2YXIgZGVjbGFyYXRpb24gPSBpbXBvcnREZWNsYXJhdGlvbihjb250ZXh0KVxuXG4gICAgICAgIHZhciBpbXBvcnRzID0gRXhwb3J0cy5nZXQoZGVjbGFyYXRpb24uc291cmNlLnZhbHVlLCBjb250ZXh0KVxuICAgICAgICBpZiAoaW1wb3J0cyA9PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgICAgIGlmIChpbXBvcnRzLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICBpbXBvcnRzLnJlcG9ydEVycm9ycyhjb250ZXh0LCBkZWNsYXJhdGlvbilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaW1wb3J0cy5zaXplKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQobmFtZXNwYWNlLFxuICAgICAgICAgICAgYE5vIGV4cG9ydGVkIG5hbWVzIGZvdW5kIGluIG1vZHVsZSAnJHtkZWNsYXJhdGlvbi5zb3VyY2UudmFsdWV9Jy5gKVxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvLyB0b2RvOiBjaGVjayBmb3IgcG9zc2libGUgcmVkZWZpbml0aW9uXG5cbiAgICAgIE1lbWJlckV4cHJlc3Npb246IGZ1bmN0aW9uIChkZXJlZmVyZW5jZSkge1xuICAgICAgICBpZiAoZGVyZWZlcmVuY2Uub2JqZWN0LnR5cGUgIT09ICdJZGVudGlmaWVyJykgcmV0dXJuXG4gICAgICAgIGlmICghbmFtZXNwYWNlcy5oYXMoZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWUpKSByZXR1cm5cblxuICAgICAgICBpZiAoZGVyZWZlcmVuY2UucGFyZW50LnR5cGUgPT09ICdBc3NpZ25tZW50RXhwcmVzc2lvbicgJiZcbiAgICAgICAgICAgIGRlcmVmZXJlbmNlLnBhcmVudC5sZWZ0ID09PSBkZXJlZmVyZW5jZSkge1xuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoZGVyZWZlcmVuY2UucGFyZW50LFxuICAgICAgICAgICAgICAgIGBBc3NpZ25tZW50IHRvIG1lbWJlciBvZiBuYW1lc3BhY2UgJyR7ZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWV9Jy5gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ28gZGVlcFxuICAgICAgICB2YXIgbmFtZXNwYWNlID0gbmFtZXNwYWNlcy5nZXQoZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWUpXG4gICAgICAgIHZhciBuYW1lcGF0aCA9IFtkZXJlZmVyZW5jZS5vYmplY3QubmFtZV1cbiAgICAgICAgLy8gd2hpbGUgcHJvcGVydHkgaXMgbmFtZXNwYWNlIGFuZCBwYXJlbnQgaXMgbWVtYmVyIGV4cHJlc3Npb24sIGtlZXAgdmFsaWRhdGluZ1xuICAgICAgICB3aGlsZSAobmFtZXNwYWNlIGluc3RhbmNlb2YgRXhwb3J0cyAmJlxuICAgICAgICAgICAgICAgZGVyZWZlcmVuY2UudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG5cbiAgICAgICAgICBpZiAoZGVyZWZlcmVuY2UuY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGlmICghYWxsb3dDb21wdXRlZCkge1xuICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydChkZXJlZmVyZW5jZS5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHZhbGlkYXRlIGNvbXB1dGVkIHJlZmVyZW5jZSB0byBpbXBvcnRlZCBuYW1lc3BhY2UgXFwnJyArXG4gICAgICAgICAgICAgICAgZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWUgKyAnXFwnLicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIW5hbWVzcGFjZS5oYXMoZGVyZWZlcmVuY2UucHJvcGVydHkubmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KFxuICAgICAgICAgICAgICBkZXJlZmVyZW5jZS5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgbWFrZU1lc3NhZ2UoZGVyZWZlcmVuY2UucHJvcGVydHksIG5hbWVwYXRoKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZXhwb3J0ZWQgPSBuYW1lc3BhY2UuZ2V0KGRlcmVmZXJlbmNlLnByb3BlcnR5Lm5hbWUpXG4gICAgICAgICAgaWYgKGV4cG9ydGVkID09IG51bGwpIHJldHVyblxuXG4gICAgICAgICAgLy8gc3Rhc2ggYW5kIHBvcFxuICAgICAgICAgIG5hbWVwYXRoLnB1c2goZGVyZWZlcmVuY2UucHJvcGVydHkubmFtZSlcbiAgICAgICAgICBuYW1lc3BhY2UgPSBleHBvcnRlZC5uYW1lc3BhY2VcbiAgICAgICAgICBkZXJlZmVyZW5jZSA9IGRlcmVmZXJlbmNlLnBhcmVudFxuICAgICAgICB9XG5cbiAgICAgIH0sXG5cbiAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcjogZnVuY3Rpb24gKHsgaWQsIGluaXQgfSkge1xuICAgICAgICBpZiAoaW5pdCA9PSBudWxsKSByZXR1cm5cbiAgICAgICAgaWYgKGluaXQudHlwZSAhPT0gJ0lkZW50aWZpZXInKSByZXR1cm5cbiAgICAgICAgaWYgKCFuYW1lc3BhY2VzLmhhcyhpbml0Lm5hbWUpKSByZXR1cm5cblxuICAgICAgICAvLyBjaGVjayBmb3IgcmVkZWZpbml0aW9uIGluIGludGVybWVkaWF0ZSBzY29wZXNcbiAgICAgICAgaWYgKGRlY2xhcmVkU2NvcGUoY29udGV4dCwgaW5pdC5uYW1lKSAhPT0gJ21vZHVsZScpIHJldHVyblxuXG4gICAgICAgIC8vIERGUyB0cmF2ZXJzZSBjaGlsZCBuYW1lc3BhY2VzXG4gICAgICAgIGZ1bmN0aW9uIHRlc3RLZXkocGF0dGVybiwgbmFtZXNwYWNlLCBwYXRoID0gW2luaXQubmFtZV0pIHtcbiAgICAgICAgICBpZiAoIShuYW1lc3BhY2UgaW5zdGFuY2VvZiBFeHBvcnRzKSkgcmV0dXJuXG5cbiAgICAgICAgICBpZiAocGF0dGVybi50eXBlICE9PSAnT2JqZWN0UGF0dGVybicpIHJldHVyblxuXG4gICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwYXR0ZXJuLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcHJvcGVydHkudHlwZSA9PT0gJ0V4cGVyaW1lbnRhbFJlc3RQcm9wZXJ0eSdcbiAgICAgICAgICAgICAgfHwgcHJvcGVydHkudHlwZSA9PT0gJ1Jlc3RFbGVtZW50J1xuICAgICAgICAgICAgICB8fCAhcHJvcGVydHkua2V5XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BlcnR5LmtleS50eXBlICE9PSAnSWRlbnRpZmllcicpIHtcbiAgICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgICAgIG5vZGU6IHByb3BlcnR5LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdPbmx5IGRlc3RydWN0dXJlIHRvcC1sZXZlbCBuYW1lcy4nLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW5hbWVzcGFjZS5oYXMocHJvcGVydHkua2V5Lm5hbWUpKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICAgICBub2RlOiBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBtYWtlTWVzc2FnZShwcm9wZXJ0eS5rZXksIHBhdGgpLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXRoLnB1c2gocHJvcGVydHkua2V5Lm5hbWUpXG4gICAgICAgICAgICBjb25zdCBkZXBlbmRlbmN5RXhwb3J0TWFwID0gbmFtZXNwYWNlLmdldChwcm9wZXJ0eS5rZXkubmFtZSlcbiAgICAgICAgICAgIC8vIGNvdWxkIGJlIG51bGwgd2hlbiBpZ25vcmVkIG9yIGFtYmlndW91c1xuICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lFeHBvcnRNYXAgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGVzdEtleShwcm9wZXJ0eS52YWx1ZSwgZGVwZW5kZW5jeUV4cG9ydE1hcC5uYW1lc3BhY2UsIHBhdGgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXRoLnBvcCgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGVzdEtleShpZCwgbmFtZXNwYWNlcy5nZXQoaW5pdC5uYW1lKSlcbiAgICAgIH0sXG5cbiAgICAgIEpTWE1lbWJlckV4cHJlc3Npb246IGZ1bmN0aW9uKHtvYmplY3QsIHByb3BlcnR5fSkge1xuICAgICAgICAgaWYgKCFuYW1lc3BhY2VzLmhhcyhvYmplY3QubmFtZSkpIHJldHVyblxuICAgICAgICAgdmFyIG5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuZ2V0KG9iamVjdC5uYW1lKVxuICAgICAgICAgaWYgKCFuYW1lc3BhY2UuaGFzKHByb3BlcnR5Lm5hbWUpKSB7XG4gICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICBub2RlOiBwcm9wZXJ0eSxcbiAgICAgICAgICAgICBtZXNzYWdlOiBtYWtlTWVzc2FnZShwcm9wZXJ0eSwgW29iamVjdC5uYW1lXSksXG4gICAgICAgICAgIH0pXG4gICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uYW1lc3BhY2UuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsInByb3BlcnRpZXMiLCJhbGxvd0NvbXB1dGVkIiwiZGVzY3JpcHRpb24iLCJkZWZhdWx0IiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjcmVhdGUiLCJuYW1lc3BhY2VSdWxlIiwiY29udGV4dCIsIm9wdGlvbnMiLCJuYW1lc3BhY2VzIiwiTWFwIiwibWFrZU1lc3NhZ2UiLCJsYXN0IiwibmFtZXBhdGgiLCJuYW1lIiwibGVuZ3RoIiwiam9pbiIsIlByb2dyYW0iLCJib2R5IiwicHJvY2Vzc0JvZHlTdGF0ZW1lbnQiLCJkZWNsYXJhdGlvbiIsInNwZWNpZmllcnMiLCJpbXBvcnRzIiwiRXhwb3J0cyIsImdldCIsInNvdXJjZSIsInZhbHVlIiwiZXJyb3JzIiwicmVwb3J0RXJyb3JzIiwic3BlY2lmaWVyIiwic2l6ZSIsInJlcG9ydCIsInNldCIsImxvY2FsIiwiaW1wb3J0ZWQiLCJuYW1lc3BhY2UiLCJmb3JFYWNoIiwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyIiwiTWVtYmVyRXhwcmVzc2lvbiIsImRlcmVmZXJlbmNlIiwib2JqZWN0IiwiaGFzIiwicGFyZW50IiwibGVmdCIsImNvbXB1dGVkIiwicHJvcGVydHkiLCJleHBvcnRlZCIsInB1c2giLCJWYXJpYWJsZURlY2xhcmF0b3IiLCJpZCIsImluaXQiLCJ0ZXN0S2V5IiwicGF0dGVybiIsInBhdGgiLCJrZXkiLCJub2RlIiwibWVzc2FnZSIsImRlcGVuZGVuY3lFeHBvcnRNYXAiLCJwb3AiLCJKU1hNZW1iZXJFeHByZXNzaW9uIl0sIm1hcHBpbmdzIjoiYUFBQSxrRTtBQUNBLHlDO0FBQ0EseUQ7QUFDQSxxQzs7QUFFQUEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sU0FERjtBQUVKQyxVQUFNO0FBQ0pD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LElBQXRCLENBQUwsRUFBa0M7QUFDbEMsWUFBSXFCLFlBQVkxQixXQUFXZSxHQUFYLENBQWVnQixPQUFPMUIsSUFBdEIsQ0FBaEI7QUFDQSxZQUFJLENBQUNxQixVQUFVTSxHQUFWLENBQWNJLFNBQVMvQixJQUF2QixDQUFMLEVBQW1DO0FBQ2pDUCxrQkFBUXdCLE1BQVIsQ0FBZTtBQUNid0Isa0JBQU1WLFFBRE87QUFFYlcscUJBQVM3QyxZQUFZa0MsUUFBWixFQUFzQixDQUFDTCxPQUFPMUIsSUFBUixDQUF0QixDQUZJLEVBQWY7O0FBSUQ7QUFDSCxPQTdLSSxFQUFQOztBQStLRCxHQWxOYyxFQUFqQiIsImZpbGUiOiJuYW1lc3BhY2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZGVjbGFyZWRTY29wZSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL2RlY2xhcmVkU2NvcGUnXG5pbXBvcnQgRXhwb3J0cyBmcm9tICcuLi9FeHBvcnRNYXAnXG5pbXBvcnQgaW1wb3J0RGVjbGFyYXRpb24gZnJvbSAnLi4vaW1wb3J0RGVjbGFyYXRpb24nXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25hbWVzcGFjZScpLFxuICAgIH0sXG5cbiAgICBzY2hlbWE6IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBhbGxvd0NvbXB1dGVkOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0lmIGBmYWxzZWAsIHdpbGwgcmVwb3J0IGNvbXB1dGVkIChhbmQgdGh1cywgdW4tbGludGFibGUpIHJlZmVyZW5jZXMgdG8gbmFtZXNwYWNlIG1lbWJlcnMuJyxcbiAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIG5hbWVzcGFjZVJ1bGUoY29udGV4dCkge1xuXG4gICAgLy8gcmVhZCBvcHRpb25zXG4gICAgY29uc3Qge1xuICAgICAgYWxsb3dDb21wdXRlZCA9IGZhbHNlLFxuICAgIH0gPSBjb250ZXh0Lm9wdGlvbnNbMF0gfHwge31cblxuICAgIGNvbnN0IG5hbWVzcGFjZXMgPSBuZXcgTWFwKClcblxuICAgIGZ1bmN0aW9uIG1ha2VNZXNzYWdlKGxhc3QsIG5hbWVwYXRoKSB7XG4gICAgICByZXR1cm4gYCcke2xhc3QubmFtZX0nIG5vdCBmb3VuZCBpbiAke25hbWVwYXRoLmxlbmd0aCA+IDEgPyAnZGVlcGx5ICcgOiAnJ31pbXBvcnRlZCBuYW1lc3BhY2UgJyR7bmFtZXBhdGguam9pbignLicpfScuYFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAvLyBwaWNrIHVwIGFsbCBpbXBvcnRzIGF0IGJvZHkgZW50cnkgdGltZSwgdG8gcHJvcGVybHkgcmVzcGVjdCBob2lzdGluZ1xuICAgICAgUHJvZ3JhbSh7IGJvZHkgfSkge1xuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzQm9keVN0YXRlbWVudChkZWNsYXJhdGlvbikge1xuICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi50eXBlICE9PSAnSW1wb3J0RGVjbGFyYXRpb24nKSByZXR1cm5cblxuICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi5zcGVjaWZpZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICAgICAgICBjb25zdCBpbXBvcnRzID0gRXhwb3J0cy5nZXQoZGVjbGFyYXRpb24uc291cmNlLnZhbHVlLCBjb250ZXh0KVxuICAgICAgICAgIGlmIChpbXBvcnRzID09IG51bGwpIHJldHVybiBudWxsXG5cbiAgICAgICAgICBpZiAoaW1wb3J0cy5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpbXBvcnRzLnJlcG9ydEVycm9ycyhjb250ZXh0LCBkZWNsYXJhdGlvbilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIGRlY2xhcmF0aW9uLnNwZWNpZmllcnMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoc3BlY2lmaWVyLnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyJzpcbiAgICAgICAgICAgICAgICBpZiAoIWltcG9ydHMuc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoXG4gICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcixcbiAgICAgICAgICAgICAgICAgICAgYE5vIGV4cG9ydGVkIG5hbWVzIGZvdW5kIGluIG1vZHVsZSAnJHtkZWNsYXJhdGlvbi5zb3VyY2UudmFsdWV9Jy5gXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMuc2V0KHNwZWNpZmllci5sb2NhbC5uYW1lLCBpbXBvcnRzKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInOlxuICAgICAgICAgICAgICBjYXNlICdJbXBvcnRTcGVjaWZpZXInOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IGltcG9ydHMuZ2V0KFxuICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byAnZGVmYXVsdCcgZm9yIGRlZmF1bHQgaHR0cDovL2kuaW1ndXIuY29tL25qNnFBV3kuanBnXG4gICAgICAgICAgICAgICAgICBzcGVjaWZpZXIuaW1wb3J0ZWQgPyBzcGVjaWZpZXIuaW1wb3J0ZWQubmFtZSA6ICdkZWZhdWx0J1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGEgfHwgIW1ldGEubmFtZXNwYWNlKSB7IGJyZWFrIH1cbiAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLnNldChzcGVjaWZpZXIubG9jYWwubmFtZSwgbWV0YS5uYW1lc3BhY2UpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBib2R5LmZvckVhY2gocHJvY2Vzc0JvZHlTdGF0ZW1lbnQpXG4gICAgICB9LFxuXG4gICAgICAvLyBzYW1lIGFzIGFib3ZlLCBidXQgZG9lcyBub3QgYWRkIG5hbWVzIHRvIGxvY2FsIG1hcFxuICAgICAgRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyKG5hbWVzcGFjZSkge1xuICAgICAgICB2YXIgZGVjbGFyYXRpb24gPSBpbXBvcnREZWNsYXJhdGlvbihjb250ZXh0KVxuXG4gICAgICAgIHZhciBpbXBvcnRzID0gRXhwb3J0cy5nZXQoZGVjbGFyYXRpb24uc291cmNlLnZhbHVlLCBjb250ZXh0KVxuICAgICAgICBpZiAoaW1wb3J0cyA9PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgICAgIGlmIChpbXBvcnRzLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICBpbXBvcnRzLnJlcG9ydEVycm9ycyhjb250ZXh0LCBkZWNsYXJhdGlvbilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaW1wb3J0cy5zaXplKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBgTm8gZXhwb3J0ZWQgbmFtZXMgZm91bmQgaW4gbW9kdWxlICcke2RlY2xhcmF0aW9uLnNvdXJjZS52YWx1ZX0nLmBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIHRvZG86IGNoZWNrIGZvciBwb3NzaWJsZSByZWRlZmluaXRpb25cblxuICAgICAgTWVtYmVyRXhwcmVzc2lvbihkZXJlZmVyZW5jZSkge1xuICAgICAgICBpZiAoZGVyZWZlcmVuY2Uub2JqZWN0LnR5cGUgIT09ICdJZGVudGlmaWVyJykgcmV0dXJuXG4gICAgICAgIGlmICghbmFtZXNwYWNlcy5oYXMoZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWUpKSByZXR1cm5cbiAgICAgICAgaWYgKGRlY2xhcmVkU2NvcGUoY29udGV4dCwgZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWUpICE9PSAnbW9kdWxlJykgcmV0dXJuXG5cbiAgICAgICAgaWYgKGRlcmVmZXJlbmNlLnBhcmVudC50eXBlID09PSAnQXNzaWdubWVudEV4cHJlc3Npb24nICYmIGRlcmVmZXJlbmNlLnBhcmVudC5sZWZ0ID09PSBkZXJlZmVyZW5jZSkge1xuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoXG4gICAgICAgICAgICAgIGRlcmVmZXJlbmNlLnBhcmVudCxcbiAgICAgICAgICAgICAgYEFzc2lnbm1lbnQgdG8gbWVtYmVyIG9mIG5hbWVzcGFjZSAnJHtkZXJlZmVyZW5jZS5vYmplY3QubmFtZX0nLmBcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdvIGRlZXBcbiAgICAgICAgdmFyIG5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuZ2V0KGRlcmVmZXJlbmNlLm9iamVjdC5uYW1lKVxuICAgICAgICB2YXIgbmFtZXBhdGggPSBbZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWVdXG4gICAgICAgIC8vIHdoaWxlIHByb3BlcnR5IGlzIG5hbWVzcGFjZSBhbmQgcGFyZW50IGlzIG1lbWJlciBleHByZXNzaW9uLCBrZWVwIHZhbGlkYXRpbmdcbiAgICAgICAgd2hpbGUgKG5hbWVzcGFjZSBpbnN0YW5jZW9mIEV4cG9ydHMgJiYgZGVyZWZlcmVuY2UudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG5cbiAgICAgICAgICBpZiAoZGVyZWZlcmVuY2UuY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIGlmICghYWxsb3dDb21wdXRlZCkge1xuICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydChcbiAgICAgICAgICAgICAgICBkZXJlZmVyZW5jZS5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHZhbGlkYXRlIGNvbXB1dGVkIHJlZmVyZW5jZSB0byBpbXBvcnRlZCBuYW1lc3BhY2UgJyR7ZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWV9Jy5gXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghbmFtZXNwYWNlLmhhcyhkZXJlZmVyZW5jZS5wcm9wZXJ0eS5uYW1lKSkge1xuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoXG4gICAgICAgICAgICAgIGRlcmVmZXJlbmNlLnByb3BlcnR5LFxuICAgICAgICAgICAgICBtYWtlTWVzc2FnZShkZXJlZmVyZW5jZS5wcm9wZXJ0eSwgbmFtZXBhdGgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGV4cG9ydGVkID0gbmFtZXNwYWNlLmdldChkZXJlZmVyZW5jZS5wcm9wZXJ0eS5uYW1lKVxuICAgICAgICAgIGlmIChleHBvcnRlZCA9PSBudWxsKSByZXR1cm5cblxuICAgICAgICAgIC8vIHN0YXNoIGFuZCBwb3BcbiAgICAgICAgICBuYW1lcGF0aC5wdXNoKGRlcmVmZXJlbmNlLnByb3BlcnR5Lm5hbWUpXG4gICAgICAgICAgbmFtZXNwYWNlID0gZXhwb3J0ZWQubmFtZXNwYWNlXG4gICAgICAgICAgZGVyZWZlcmVuY2UgPSBkZXJlZmVyZW5jZS5wYXJlbnRcbiAgICAgICAgfVxuXG4gICAgICB9LFxuXG4gICAgICBWYXJpYWJsZURlY2xhcmF0b3IoeyBpZCwgaW5pdCB9KSB7XG4gICAgICAgIGlmIChpbml0ID09IG51bGwpIHJldHVyblxuICAgICAgICBpZiAoaW5pdC50eXBlICE9PSAnSWRlbnRpZmllcicpIHJldHVyblxuICAgICAgICBpZiAoIW5hbWVzcGFjZXMuaGFzKGluaXQubmFtZSkpIHJldHVyblxuXG4gICAgICAgIC8vIGNoZWNrIGZvciByZWRlZmluaXRpb24gaW4gaW50ZXJtZWRpYXRlIHNjb3Blc1xuICAgICAgICBpZiAoZGVjbGFyZWRTY29wZShjb250ZXh0LCBpbml0Lm5hbWUpICE9PSAnbW9kdWxlJykgcmV0dXJuXG5cbiAgICAgICAgLy8gREZTIHRyYXZlcnNlIGNoaWxkIG5hbWVzcGFjZXNcbiAgICAgICAgZnVuY3Rpb24gdGVzdEtleShwYXR0ZXJuLCBuYW1lc3BhY2UsIHBhdGggPSBbaW5pdC5uYW1lXSkge1xuICAgICAgICAgIGlmICghKG5hbWVzcGFjZSBpbnN0YW5jZW9mIEV4cG9ydHMpKSByZXR1cm5cblxuICAgICAgICAgIGlmIChwYXR0ZXJuLnR5cGUgIT09ICdPYmplY3RQYXR0ZXJuJykgcmV0dXJuXG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHBhdHRlcm4ucHJvcGVydGllcykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwcm9wZXJ0eS50eXBlID09PSAnRXhwZXJpbWVudGFsUmVzdFByb3BlcnR5J1xuICAgICAgICAgICAgICB8fCBwcm9wZXJ0eS50eXBlID09PSAnUmVzdEVsZW1lbnQnXG4gICAgICAgICAgICAgIHx8ICFwcm9wZXJ0eS5rZXlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcGVydHkua2V5LnR5cGUgIT09ICdJZGVudGlmaWVyJykge1xuICAgICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgICAgbm9kZTogcHJvcGVydHksXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ09ubHkgZGVzdHJ1Y3R1cmUgdG9wLWxldmVsIG5hbWVzLicsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghbmFtZXNwYWNlLmhhcyhwcm9wZXJ0eS5rZXkubmFtZSkpIHtcbiAgICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgICAgIG5vZGU6IHByb3BlcnR5LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG1ha2VNZXNzYWdlKHByb3BlcnR5LmtleSwgcGF0aCksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhdGgucHVzaChwcm9wZXJ0eS5rZXkubmFtZSlcbiAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY3lFeHBvcnRNYXAgPSBuYW1lc3BhY2UuZ2V0KHByb3BlcnR5LmtleS5uYW1lKVxuICAgICAgICAgICAgLy8gY291bGQgYmUgbnVsbCB3aGVuIGlnbm9yZWQgb3IgYW1iaWd1b3VzXG4gICAgICAgICAgICBpZiAoZGVwZW5kZW5jeUV4cG9ydE1hcCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB0ZXN0S2V5KHByb3BlcnR5LnZhbHVlLCBkZXBlbmRlbmN5RXhwb3J0TWFwLm5hbWVzcGFjZSwgcGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdGgucG9wKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0ZXN0S2V5KGlkLCBuYW1lc3BhY2VzLmdldChpbml0Lm5hbWUpKVxuICAgICAgfSxcblxuICAgICAgSlNYTWVtYmVyRXhwcmVzc2lvbih7b2JqZWN0LCBwcm9wZXJ0eX0pIHtcbiAgICAgICAgIGlmICghbmFtZXNwYWNlcy5oYXMob2JqZWN0Lm5hbWUpKSByZXR1cm5cbiAgICAgICAgIHZhciBuYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmdldChvYmplY3QubmFtZSlcbiAgICAgICAgIGlmICghbmFtZXNwYWNlLmhhcyhwcm9wZXJ0eS5uYW1lKSkge1xuICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgbm9kZTogcHJvcGVydHksXG4gICAgICAgICAgICAgbWVzc2FnZTogbWFrZU1lc3NhZ2UocHJvcGVydHksIFtvYmplY3QubmFtZV0pLFxuICAgICAgICAgICB9KVxuICAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/newline-after-import.js b/node_modules/eslint-plugin-import/lib/rules/newline-after-import.js
index 7505299..d047a91 100644
--- a/node_modules/eslint-plugin-import/lib/rules/newline-after-import.js
+++ b/node_modules/eslint-plugin-import/lib/rules/newline-after-import.js
@@ -1,42 +1,29 @@
 'use strict';
 
-var _staticRequire = require('../core/staticRequire');
 
-var _staticRequire2 = _interopRequireDefault(_staticRequire);
 
-var _docsUrl = require('../docsUrl');
 
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
+var _staticRequire = require('../core/staticRequire');var _staticRequire2 = _interopRequireDefault(_staticRequire);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);
 
-var _debug = require('debug');
-
-var _debug2 = _interopRequireDefault(_debug);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
+var _debug = require('debug');var _debug2 = _interopRequireDefault(_debug);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 const log = (0, _debug2.default)('eslint-plugin-import:rules:newline-after-import');
 
 //------------------------------------------------------------------------------
 // Rule Definition
 //------------------------------------------------------------------------------
-
 /**
  * @fileoverview Rule to enforce new line after import not followed by another import.
  * @author Radek Benkel
- */
-
-function containsNodeOrEqual(outerNode, innerNode) {
-  return outerNode.range[0] <= innerNode.range[0] && outerNode.range[1] >= innerNode.range[1];
-}
+ */function containsNodeOrEqual(outerNode, innerNode) {return outerNode.range[0] <= innerNode.range[0] && outerNode.range[1] >= innerNode.range[1];}
 
 function getScopeBody(scope) {
   if (scope.block.type === 'SwitchStatement') {
     log('SwitchStatement scopes not supported');
     return null;
-  }
+  }const
 
-  const body = scope.block.body;
-
+  body = scope.block.body;
   if (body && body.type === 'BlockStatement') {
     return body.body;
   }
@@ -56,30 +43,42 @@
   return node.type === 'ClassDeclaration' && node.decorators && node.decorators.length;
 }
 
+function isExportDefaultClass(node) {
+  return node.type === 'ExportDefaultDeclaration' && node.declaration.type === 'ClassDeclaration';
+}
+
 module.exports = {
   meta: {
     type: 'layout',
     docs: {
-      url: (0, _docsUrl2.default)('newline-after-import')
-    },
+      url: (0, _docsUrl2.default)('newline-after-import') },
+
     fixable: 'whitespace',
-    schema: [{
+    schema: [
+    {
       'type': 'object',
       'properties': {
         'count': {
           'type': 'integer',
-          'minimum': 1
-        }
-      },
-      'additionalProperties': false
-    }]
-  },
+          'minimum': 1 } },
+
+
+      'additionalProperties': false }] },
+
+
+
   create: function (context) {
     let level = 0;
     const requireCalls = [];
 
     function checkForNewLine(node, nextNode, type) {
-      if (isClassWithDecorator(nextNode)) {
+      if (isExportDefaultClass(nextNode)) {
+        let classNode = nextNode.declaration;
+
+        if (isClassWithDecorator(classNode)) {
+          nextNode = classNode.decorators[0];
+        }
+      } else if (isClassWithDecorator(nextNode)) {
         nextNode = nextNode.decorators[0];
       }
 
@@ -97,12 +96,15 @@
         context.report({
           loc: {
             line: node.loc.end.line,
-            column
-          },
+            column },
+
           message: `Expected ${options.count} empty line${options.count > 1 ? 's' : ''} \
 after ${type} statement not followed by another ${type}.`,
-          fix: fixer => fixer.insertTextAfter(node, '\n'.repeat(EXPECTED_LINE_DIFFERENCE - lineDifference))
-        });
+          fix: fixer => fixer.insertTextAfter(
+          node,
+          '\n'.repeat(EXPECTED_LINE_DIFFERENCE - lineDifference)) });
+
+
       }
     }
 
@@ -113,17 +115,24 @@
       level--;
     }
 
+    function checkImport(node) {const
+      parent = node.parent;
+      const nodePosition = parent.body.indexOf(node);
+      const nextNode = parent.body[nodePosition + 1];
+
+      // skip "export import"s
+      if (node.type === 'TSImportEqualsDeclaration' && node.isExport) {
+        return;
+      }
+
+      if (nextNode && nextNode.type !== 'ImportDeclaration' && (nextNode.type !== 'TSImportEqualsDeclaration' || nextNode.isExport)) {
+        checkForNewLine(node, nextNode, 'import');
+      }
+    }
+
     return {
-      ImportDeclaration: function (node) {
-        const parent = node.parent;
-
-        const nodePosition = parent.body.indexOf(node);
-        const nextNode = parent.body[nodePosition + 1];
-
-        if (nextNode && nextNode.type !== 'ImportDeclaration') {
-          checkForNewLine(node, nextNode, 'import');
-        }
-      },
+      ImportDeclaration: checkImport,
+      TSImportEqualsDeclaration: checkImport,
       CallExpression: function (node) {
         if ((0, _staticRequire2.default)(node) && level === 0) {
           requireCalls.push(node);
@@ -146,7 +155,8 @@
             return;
           }
 
-          if (nextStatement && (!nextRequireCall || !containsNodeOrEqual(nextStatement, nextRequireCall))) {
+          if (nextStatement && (
+          !nextRequireCall || !containsNodeOrEqual(nextStatement, nextRequireCall))) {
 
             checkForNewLine(statementWithRequireCall, nextStatement, 'require');
           }
@@ -163,8 +173,7 @@
       'ArrowFunctionExpression:exit': decrementLevel,
       'BlockStatement:exit': decrementLevel,
       'ObjectExpression:exit': decrementLevel,
-      'Decorator:exit': decrementLevel
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uZXdsaW5lLWFmdGVyLWltcG9ydC5qcyJdLCJuYW1lcyI6WyJsb2ciLCJjb250YWluc05vZGVPckVxdWFsIiwib3V0ZXJOb2RlIiwiaW5uZXJOb2RlIiwicmFuZ2UiLCJnZXRTY29wZUJvZHkiLCJzY29wZSIsImJsb2NrIiwidHlwZSIsImJvZHkiLCJmaW5kTm9kZUluZGV4SW5TY29wZUJvZHkiLCJub2RlVG9GaW5kIiwiZmluZEluZGV4Iiwibm9kZSIsImdldExpbmVEaWZmZXJlbmNlIiwibmV4dE5vZGUiLCJsb2MiLCJzdGFydCIsImxpbmUiLCJlbmQiLCJpc0NsYXNzV2l0aERlY29yYXRvciIsImRlY29yYXRvcnMiLCJsZW5ndGgiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJmaXhhYmxlIiwic2NoZW1hIiwiY3JlYXRlIiwiY29udGV4dCIsImxldmVsIiwicmVxdWlyZUNhbGxzIiwiY2hlY2tGb3JOZXdMaW5lIiwib3B0aW9ucyIsImNvdW50IiwibGluZURpZmZlcmVuY2UiLCJFWFBFQ1RFRF9MSU5FX0RJRkZFUkVOQ0UiLCJjb2x1bW4iLCJyZXBvcnQiLCJtZXNzYWdlIiwiZml4IiwiZml4ZXIiLCJpbnNlcnRUZXh0QWZ0ZXIiLCJyZXBlYXQiLCJpbmNyZW1lbnRMZXZlbCIsImRlY3JlbWVudExldmVsIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJwYXJlbnQiLCJub2RlUG9zaXRpb24iLCJpbmRleE9mIiwiQ2FsbEV4cHJlc3Npb24iLCJwdXNoIiwiZ2V0RmlsZW5hbWUiLCJzY29wZUJvZHkiLCJnZXRTY29wZSIsImZvckVhY2giLCJpbmRleCIsInN0YXRlbWVudFdpdGhSZXF1aXJlQ2FsbCIsIm5leHRTdGF0ZW1lbnQiLCJuZXh0UmVxdWlyZUNhbGwiLCJGdW5jdGlvbkRlY2xhcmF0aW9uIiwiRnVuY3Rpb25FeHByZXNzaW9uIiwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iLCJCbG9ja1N0YXRl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QUFqQiIsImZpbGUiOiJuZXdsaW5lLWFmdGVyLWltcG9ydC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVvdmVydmlldyBSdWxlIHRvIGVuZm9yY2UgbmV3IGxpbmUgYWZ0ZXIgaW1wb3J0IG5vdCBmb2xsb3dlZCBieSBhbm90aGVyIGltcG9ydC5cbiAqIEBhdXRob3IgUmFkZWsgQmVua2VsXG4gKi9cblxuaW1wb3J0IGlzU3RhdGljUmVxdWlyZSBmcm9tICcuLi9jb3JlL3N0YXRpY1JlcXVpcmUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnXG5jb25zdCBsb2cgPSBkZWJ1ZygnZXNsaW50LXBsdWdpbi1pbXBvcnQ6cnVsZXM6bmV3bGluZS1hZnRlci1pbXBvcnQnKVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUnVsZSBEZWZpbml0aW9uXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBjb250YWluc05vZGVPckVxdWFsKG91dGVyTm9kZSwgaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5yYW5nZVswXSA8PSBpbm5lck5vZGUucmFuZ2VbMF0gJiYgb3V0ZXJOb2RlLnJhbmdlWzFdID49IGlubmVyTm9kZS5yYW5nZVsxXVxufVxuXG5mdW5jdGlvbiBnZXRTY29wZUJvZHkoc2NvcGUpIHtcbiAgICBpZiAoc2NvcGUuYmxvY2sudHlwZSA9PT0gJ1N3aXRjaFN0YXRlbWVudCcpIHtcbiAgICAgIGxvZygnU3dpdGNoU3RhdGVtZW50IHNjb3BlcyBub3Qgc3VwcG9ydGVkJylcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgeyBib2R5IH0gPSBzY29wZS5ibG9ja1xuICAgIGlmIChib2R5ICYmIGJvZHkudHlwZSA9PT0gJ0Jsb2NrU3RhdGVtZW50Jykge1xuICAgICAgICByZXR1cm4gYm9keS5ib2R5XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvZHlcbn1cblxuZnVuY3Rpb24gZmluZE5vZGVJbmRleEluU2NvcGVCb2R5KGJvZHksIG5vZGVUb0ZpbmQpIHtcbiAgICByZXR1cm4gYm9keS5maW5kSW5kZXgoKG5vZGUpID0+IGNvbnRhaW5zTm9kZU9yRXF1YWwobm9kZSwgbm9kZVRvRmluZCkpXG59XG5cbmZ1bmN0aW9uIGdldExpbmVEaWZmZXJlbmNlKG5vZGUsIG5leHROb2RlKSB7XG4gIHJldHVybiBuZXh0Tm9kZS5sb2Muc3RhcnQubGluZSAtIG5vZGUubG9jLmVuZC5saW5lXG59XG5cbmZ1bmN0aW9uIGlzQ2xhc3NXaXRoRGVjb3JhdG9yKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0NsYXNzRGVjbGFyYXRpb24nICYmIG5vZGUuZGVjb3JhdG9ycyAmJiBub2RlLmRlY29yYXRvcnMubGVuZ3RoXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ2xheW91dCcsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduZXdsaW5lLWFmdGVyLWltcG9ydCcpLFxuICAgIH0sXG4gICAgZml4YWJsZTogJ3doaXRlc3BhY2UnLFxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICAndHlwZSc6ICdvYmplY3QnLFxuICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAnY291bnQnOiB7XG4gICAgICAgICAgICAndHlwZSc6ICdpbnRlZ2VyJyxcbiAgICAgICAgICAgICdtaW5pbXVtJzogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAnYWRkaXRpb25hbFByb3BlcnRpZXMnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIGxldCBsZXZlbCA9IDBcbiAgICBjb25zdCByZXF1aXJlQ2FsbHMgPSBbXVxuXG4gICAgZnVuY3Rpb24gY2hlY2tGb3JOZXdMaW5lKG5vZGUsIG5leHROb2RlLCB0eXBlKSB7XG4gICAgICBpZiAoaXNDbGFzc1dpdGhEZWNvcmF0b3IobmV4dE5vZGUpKSB7XG4gICAgICAgIG5leHROb2RlID0gbmV4dE5vZGUuZGVjb3JhdG9yc1swXVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHsgY291bnQ6IDEgfVxuICAgICAgY29uc3QgbGluZURpZmZlcmVuY2UgPSBnZXRMaW5lRGlmZmVyZW5jZShub2RlLCBuZXh0Tm9kZSlcbiAgICAgIGNvbnN0IEVYUEVDVEVEX0xJTkVfRElGRkVSRU5DRSA9IG9wdGlvbnMuY291bnQgKyAxXG5cbiAgICAgIGlmIChsaW5lRGlmZmVyZW5jZSA8IEVYUEVDVEVEX0xJTkVfRElGRkVSRU5DRSkge1xuICAgICAgICBsZXQgY29sdW1uID0gbm9kZS5sb2Muc3RhcnQuY29sdW1uXG5cbiAgICAgICAgaWYgKG5vZGUubG9jLnN0YXJ0LmxpbmUgIT09IG5vZGUubG9jLmVuZC5saW5lKSB7XG4gICAgICAgICAgY29sdW1uID0gMFxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgIGxvYzoge1xuICAgICAgICAgICAgbGluZTogbm9kZS5sb2MuZW5kLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtvcHRpb25zLmNvdW50fSBlbXB0eSBsaW5lJHtvcHRpb25zLmNvdW50ID4gMSA/ICdzJyA6ICcnfSBcXFxuYWZ0ZXIgJHt0eXBlfSBzdGF0ZW1lbnQgbm90IGZvbGxvd2VkIGJ5IGFub3RoZXIgJHt0eXBlfS5gLFxuICAgICAgICAgIGZpeDogZml4ZXIgPT4gZml4ZXIuaW5zZXJ0VGV4dEFmdGVyKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICdcXG4nLnJlcGVhdChFWFBFQ1RFRF9MSU5FX0RJRkZFUkVOQ0UgLSBsaW5lRGlmZmVyZW5jZSlcbiAgICAgICAgICApLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluY3JlbWVudExldmVsKCkge1xuICAgICAgbGV2ZWwrK1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWNyZW1lbnRMZXZlbCgpIHtcbiAgICAgIGxldmVsLS1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgSW1wb3J0RGVjbGFyYXRpb246IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGNvbnN0IHsgcGFyZW50IH0gPSBub2RlXG4gICAgICAgIGNvbnN0IG5vZGVQb3NpdGlvbiA9IHBhcmVudC5ib2R5LmluZGV4T2Yobm9kZSlcbiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBwYXJlbnQuYm9keVtub2RlUG9zaXRpb24gKyAxXVxuXG4gICAgICAgIGlmIChuZXh0Tm9kZSAmJiBuZXh0Tm9kZS50eXBlICE9PSAnSW1wb3J0RGVjbGFyYXRpb24nKSB7XG4gICAgICAgICAgY2hlY2tGb3JOZXdMaW5lKG5vZGUsIG5leHROb2RlLCAnaW1wb3J0JylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIENhbGxFeHByZXNzaW9uOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIGlmIChpc1N0YXRpY1JlcXVpcmUobm9kZSkgJiYgbGV2ZWwgPT09IDApIHtcbiAgICAgICAgICByZXF1aXJlQ2FsbHMucHVzaChub2RlKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJ1Byb2dyYW06ZXhpdCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbG9nKCdleGl0IHByb2Nlc3NpbmcgZm9yJywgY29udGV4dC5nZXRGaWxlbmFtZSgpKVxuICAgICAgICBjb25zdCBzY29wZUJvZHkgPSBnZXRTY29wZUJvZHkoY29udGV4dC5nZXRTY29wZSgpKVxuICAgICAgICBsb2coJ2dvdCBzY29wZTonLCBzY29wZUJvZHkpXG5cbiAgICAgICAgcmVxdWlyZUNhbGxzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGluZGV4KSB7XG4gICAgICAgICAgY29uc3Qgbm9kZVBvc2l0aW9uID0gZmluZE5vZGVJbmRleEluU2NvcGVCb2R5KHNjb3BlQm9keSwgbm9kZSlcbiAgICAgICAgICBsb2coJ25vZGUgcG9zaXRpb24gaW4gc2NvcGU6Jywgbm9kZVBvc2l0aW9uKVxuXG4gICAgICAgICAgY29uc3Qgc3RhdGVtZW50V2l0aFJlcXVpcmVDYWxsID0gc2NvcGVCb2R5W25vZGVQb3NpdGlvbl1cbiAgICAgICAgICBjb25zdCBuZXh0U3RhdGVtZW50ID0gc2NvcGVCb2R5W25vZGVQb3NpdGlvbiArIDFdXG4gICAgICAgICAgY29uc3QgbmV4dFJlcXVpcmVDYWxsID0gcmVxdWlyZUNhbGxzW2luZGV4ICsgMV1cblxuICAgICAgICAgIGlmIChuZXh0UmVxdWlyZUNhbGwgJiYgY29udGFpbnNOb2RlT3JFcXVhbChzdGF0ZW1lbnRXaXRoUmVxdWlyZUNhbGwsIG5leHRSZXF1aXJlQ2FsbCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZXh0U3RhdGVtZW50ICYmXG4gICAgICAgICAgICAgKCFuZXh0UmVxdWlyZUNhbGwgfHwgIWNvbnRhaW5zTm9kZU9yRXF1YWwobmV4dFN0YXRlbWVudCwgbmV4dFJlcXVpcmVDYWxsKSkpIHtcblxuICAgICAgICAgICAgY2hlY2tGb3JOZXdMaW5lKHN0YXRlbWVudFdpdGhSZXF1aXJlQ2FsbCwgbmV4dFN0YXRlbWVudCwgJ3JlcXVpcmUnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiBpbmNyZW1lbnRMZXZlbCxcbiAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogaW5jcmVtZW50TGV2ZWwsXG4gICAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogaW5jcmVtZW50TGV2ZWwsXG4gICAgICBCbG9ja1N0YXRlbWVudDogaW5jcmVtZW50TGV2ZWwsXG4gICAgICBPYmplY3RFeHByZXNzaW9uOiBpbmNyZW1lbnRMZXZlbCxcbiAgICAgIERlY29yYXRvcjogaW5jcmVtZW50TGV2ZWwsXG4gICAgICAnRnVuY3Rpb25EZWNsYXJhdGlvbjpleGl0JzogZGVjcmVtZW50TGV2ZWwsXG4gICAgICAnRnVuY3Rpb25FeHByZXNzaW9uOmV4aXQnOiBkZWNyZW1lbnRMZXZlbCxcbiAgICAgICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjpleGl0JzogZGVjcmVtZW50TGV2ZWwsXG4gICAgICAnQmxvY2tTdGF0ZW1lbnQ6ZXhpdCc6IGRlY3JlbWVudExldmVsLFxuICAgICAgJ09iamVjdEV4cHJlc3Npb246ZXhpdCc6IGRlY3JlbWVudExldmVsLFxuICAgICAgJ0RlY29yYXRvcjpleGl0JzogZGVjcmVtZW50TGV2ZWwsXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+      'Decorator:exit': decrementLevel };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uZXdsaW5lLWFmdGVyLWltcG9ydC5qcyJdLCJuYW1lcyI6WyJsb2ciLCJjb250YWluc05vZGVPckVxdWFsIiwib3V0ZXJOb2RlIiwiaW5uZXJOb2RlIiwicmFuZ2UiLCJnZXRTY29wZUJvZHkiLCJzY29wZSIsImJsb2NrIiwidHlwZSIsImJvZHkiLCJmaW5kTm9kZUluZGV4SW5TY29wZUJvZHkiLCJub2RlVG9GaW5kIiwiZmluZEluZGV4Iiwibm9kZSIsImdldExpbmVEaWZmZXJlbmNlIiwibmV4dE5vZGUiLCJsb2MiLCJzdGFydCIsImxpbmUiLCJlbmQiLCJpc0NsYXNzV2l0aERlY29yYXRvciIsImRlY29yYXRvcnMiLCJsZW5ndGgiLCJpc0V4cG9ydERlZmF1bHRDbGFzcyIsImRlY2xhcmF0aW9uIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJkb2NzIiwidXJsIiwiZml4YWJsZSIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJsZXZlbCIsInJlcXVpcmVDYWxscyIsImNoZWNrRm9yTmV3TGluZSIsImNsYXNzTm9kZSIsIm9wdGlvbnMiLCJjb3VudCIsImxpbmVEaWZmZXJlbmNlIiwiRVhQRUNURURfTElORV9ESUZGRVJFTkNFIiwiY29sdW1uIiwicmVwb3J0IiwibWVzc2FnZSIsImZpeCIsImZpeGVyIiwiaW5zZXJ0VGV4dEFmdGVyIiwicmVwZWF0IiwiaW5jcmVtZW50TGV2ZWwiLCJkZWNyZW1lbnRMZXZlbCIsImNoZWNrSW1wb3J0IiwicGFyZW50Iiwibm9kZVBvc2l0aW9uIiwiaW5kZXhPZiIsImlzRXhwb3J0IiwiSW1wb3J0RGVjbGFyYXRpb24iLCJUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uIiwiQ2FsbEV4cHJlc3Npb24iLCJwdXNoIiwiZ2V0RmlsZW5hbWUiLCJzY29wZUJvZHkiLCJnZXRTY29wZSIsImZvckVhY2giLCJpbmRleCIsInN0YXRlbWVudFdpdGhSZXF1aXJlQ2FsbCIsIm5leHRTdGF0ZW1lbnQiLCJuZXh0UmVxdWlyZUNhbGwiLCJGdW5jdGlvbkRlY2xhcmF0aW9uIiwiRnVuY3Rpb25FeHByZXNzaW9uIiwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iLCJCbG9ja1N0YXRlbWVudCIsIk9iamVjdEV4cHJlc3Npb24iLCJEZWNvcmF0b3IiXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0Esc0Q7QUFDQSxxQzs7QUFFQSw4QjtBQUNBLE1BQU1BLE1BQU0scUJBQU0saURBQU4sQ0FBWjs7QUFFQTtBQUNBO0FBQ0E7QUFiQTs7O0dBZUEsU0FBU0MsbUJBQVQsQ0FBNkJDLFNBQTdCLEVBQXdDQyxTQUF4QyxFQUFtRCxDQUMvQyxPQUFPRCxVQUFVRSxLQUFWLENBQWdCLENBQWhCLEtBQXNCRCxVQUFVQyxLQUFWLENBQWdCLENBQWhCLENBQXRCLElBQTRDRixVQUFVRSxLQUFWLENBQWdCLENBQWhCLEtBQXNCRCxVQUFVQyxLQUFWLENBQWdCLENBQWhCLENBQXpFLENBQ0g7O0FBRUQsU0FBU0MsWUFBVCxDQUFzQkMsS0FBdEIsRUFBNkI7QUFDekIsTUFBSUEsTUFBTUMsS0FBTixDQUFZQyxJQUFaLEtBQXFCLGlCQUF6QixFQUE0QztBQUMxQ1IsUUFBSSxzQ0FBSjtBQUNBLFdBQU8sSUFBUDtBQUNELEdBSndCOztBQU1qQlMsTUFOaUIsR0FNUkgsTUFBTUMsS0FORSxDQU1qQkUsSUFOaUI7QUFPekIsTUFBSUEsUUFBUUEsS0FBS0QsSUFBTCxLQUFjLGdCQUExQixFQUE0QztBQUN4QyxXQUFPQyxLQUFLQSxJQUFaO0FBQ0g7O0FBRUQsU0FBT0EsSUFBUDtBQUNIOztBQUVELFNBQVNDLHdCQUFULENBQWtDRCxJQUFsQyxFQUF3Q0UsVUFBeEMsRUFBb0Q7QUFDaEQsU0FBT0YsS0FBS0csU0FBTCxDQUFnQkMsSUFBRCxJQUFVWixvQkFBb0JZLElBQXBCLEVBQTBCRixVQUExQixDQUF6QixDQUFQO0FBQ0g7O0FBRUQsU0FBU0csaUJBQVQsQ0FBMkJELElBQTNCLEVBQWlDRSxRQUFqQyxFQUEyQztBQUN6QyxTQUFPQSxT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QUFDQSxnQkFBTWMsa0JBQWtCaEMsYUFBYTZCLFFBQVEsQ0FBckIsQ0FBeEI7O0FBRUEsY0FBSUcsbUJBQW1CbEUsb0JBQW9CZ0Usd0JBQXBCLEVBQThDRSxlQUE5QyxDQUF2QixFQUF1RjtBQUNyRjtBQUNEOztBQUVELGNBQUlEO0FBQ0EsV0FBQ0MsZUFBRCxJQUFvQixDQUFDbEUsb0JBQW9CaUUsYUFBcEIsRUFBbUNDLGVBQW5DLENBRHJCLENBQUosRUFDK0U7O0FBRTdFL0IsNEJBQWdCNkIsd0JBQWhCLEVBQTBDQyxhQUExQyxFQUF5RCxTQUF6RDtBQUNEO0FBQ0YsU0FqQkQ7QUFrQkQsT0EvQkk7QUFnQ0xFLDJCQUFxQm5CLGNBaENoQjtBQWlDTG9CLDBCQUFvQnBCLGNBakNmO0FBa0NMcUIsK0JBQXlCckIsY0FsQ3BCO0FBbUNMc0Isc0JBQWdCdEIsY0FuQ1g7QUFvQ0x1Qix3QkFBa0J2QixjQXBDYjtBQXFDTHdCLGlCQUFXeEIsY0FyQ047QUFzQ0wsa0NBQTRCQyxjQXRDdkI7QUF1Q0wsaUNBQTJCQSxjQXZDdEI7QUF3Q0wsc0NBQWdDQSxjQXhDM0I7QUF5Q0wsNkJBQXVCQSxjQXpDbEI7QUEwQ0wsK0JBQXlCQSxjQTFDcEI7QUEyQ0wsd0JBQWtCQSxjQTNDYixFQUFQOztBQTZDRCxHQWhJYyxFQUFqQiIsImZpbGUiOiJuZXdsaW5lLWFmdGVyLWltcG9ydC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVvdmVydmlldyBSdWxlIHRvIGVuZm9yY2UgbmV3IGxpbmUgYWZ0ZXIgaW1wb3J0IG5vdCBmb2xsb3dlZCBieSBhbm90aGVyIGltcG9ydC5cbiAqIEBhdXRob3IgUmFkZWsgQmVua2VsXG4gKi9cblxuaW1wb3J0IGlzU3RhdGljUmVxdWlyZSBmcm9tICcuLi9jb3JlL3N0YXRpY1JlcXVpcmUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnXG5jb25zdCBsb2cgPSBkZWJ1ZygnZXNsaW50LXBsdWdpbi1pbXBvcnQ6cnVsZXM6bmV3bGluZS1hZnRlci1pbXBvcnQnKVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUnVsZSBEZWZpbml0aW9uXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBjb250YWluc05vZGVPckVxdWFsKG91dGVyTm9kZSwgaW5uZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5yYW5nZVswXSA8PSBpbm5lck5vZGUucmFuZ2VbMF0gJiYgb3V0ZXJOb2RlLnJhbmdlWzFdID49IGlubmVyTm9kZS5yYW5nZVsxXVxufVxuXG5mdW5jdGlvbiBnZXRTY29wZUJvZHkoc2NvcGUpIHtcbiAgICBpZiAoc2NvcGUuYmxvY2sudHlwZSA9PT0gJ1N3aXRjaFN0YXRlbWVudCcpIHtcbiAgICAgIGxvZygnU3dpdGNoU3RhdGVtZW50IHNjb3BlcyBub3Qgc3VwcG9ydGVkJylcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgeyBib2R5IH0gPSBzY29wZS5ibG9ja1xuICAgIGlmIChib2R5ICYmIGJvZHkudHlwZSA9PT0gJ0Jsb2NrU3RhdGVtZW50Jykge1xuICAgICAgICByZXR1cm4gYm9keS5ib2R5XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvZHlcbn1cblxuZnVuY3Rpb24gZmluZE5vZGVJbmRleEluU2NvcGVCb2R5KGJvZHksIG5vZGVUb0ZpbmQpIHtcbiAgICByZXR1cm4gYm9keS5maW5kSW5kZXgoKG5vZGUpID0+IGNvbnRhaW5zTm9kZU9yRXF1YWwobm9kZSwgbm9kZVRvRmluZCkpXG59XG5cbmZ1bmN0aW9uIGdldExpbmVEaWZmZXJlbmNlKG5vZGUsIG5leHROb2RlKSB7XG4gIHJldHVybiBuZXh0Tm9kZS5sb2Muc3RhcnQubGluZSAtIG5vZGUubG9jLmVuZC5saW5lXG59XG5cbmZ1bmN0aW9uIGlzQ2xhc3NXaXRoRGVjb3JhdG9yKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0NsYXNzRGVjbGFyYXRpb24nICYmIG5vZGUuZGVjb3JhdG9ycyAmJiBub2RlLmRlY29yYXRvcnMubGVuZ3RoXG59XG5cbmZ1bmN0aW9uIGlzRXhwb3J0RGVmYXVsdENsYXNzKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbicgJiYgbm9kZS5kZWNsYXJhdGlvbi50eXBlID09PSAnQ2xhc3NEZWNsYXJhdGlvbidcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnbGF5b3V0JyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25ld2xpbmUtYWZ0ZXItaW1wb3J0JyksXG4gICAgfSxcbiAgICBmaXhhYmxlOiAnd2hpdGVzcGFjZScsXG4gICAgc2NoZW1hOiBbXG4gICAgICB7XG4gICAgICAgICd0eXBlJzogJ29iamVjdCcsXG4gICAgICAgICdwcm9wZXJ0aWVzJzoge1xuICAgICAgICAgICdjb3VudCc6IHtcbiAgICAgICAgICAgICd0eXBlJzogJ2ludGVnZXInLFxuICAgICAgICAgICAgJ21pbmltdW0nOiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdhZGRpdGlvbmFsUHJvcGVydGllcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgbGV0IGxldmVsID0gMFxuICAgIGNvbnN0IHJlcXVpcmVDYWxscyA9IFtdXG5cbiAgICBmdW5jdGlvbiBjaGVja0Zvck5ld0xpbmUobm9kZSwgbmV4dE5vZGUsIHR5cGUpIHtcbiAgICAgIGlmIChpc0V4cG9ydERlZmF1bHRDbGFzcyhuZXh0Tm9kZSkpIHtcbiAgICAgICAgbGV0IGNsYXNzTm9kZSA9IG5leHROb2RlLmRlY2xhcmF0aW9uXG5cbiAgICAgICAgaWYgKGlzQ2xhc3NXaXRoRGVjb3JhdG9yKGNsYXNzTm9kZSkpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IGNsYXNzTm9kZS5kZWNvcmF0b3JzWzBdXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDbGFzc1dpdGhEZWNvcmF0b3IobmV4dE5vZGUpKSB7XG4gICAgICAgIG5leHROb2RlID0gbmV4dE5vZGUuZGVjb3JhdG9yc1swXVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHsgY291bnQ6IDEgfVxuICAgICAgY29uc3QgbGluZURpZmZlcmVuY2UgPSBnZXRMaW5lRGlmZmVyZW5jZShub2RlLCBuZXh0Tm9kZSlcbiAgICAgIGNvbnN0IEVYUEVDVEVEX0xJTkVfRElGRkVSRU5DRSA9IG9wdGlvbnMuY291bnQgKyAxXG5cbiAgICAgIGlmIChsaW5lRGlmZmVyZW5jZSA8IEVYUEVDVEVEX0xJTkVfRElGRkVSRU5DRSkge1xuICAgICAgICBsZXQgY29sdW1uID0gbm9kZS5sb2Muc3RhcnQuY29sdW1uXG5cbiAgICAgICAgaWYgKG5vZGUubG9jLnN0YXJ0LmxpbmUgIT09IG5vZGUubG9jLmVuZC5saW5lKSB7XG4gICAgICAgICAgY29sdW1uID0gMFxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgIGxvYzoge1xuICAgICAgICAgICAgbGluZTogbm9kZS5sb2MuZW5kLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtvcHRpb25zLmNvdW50fSBlbXB0eSBsaW5lJHtvcHRpb25zLmNvdW50ID4gMSA/ICdzJyA6ICcnfSBcXFxuYWZ0ZXIgJHt0eXBlfSBzdGF0ZW1lbnQgbm90IGZvbGxvd2VkIGJ5IGFub3RoZXIgJHt0eXBlfS5gLFxuICAgICAgICAgIGZpeDogZml4ZXIgPT4gZml4ZXIuaW5zZXJ0VGV4dEFmdGVyKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICdcXG4nLnJlcGVhdChFWFBFQ1RFRF9MSU5FX0RJRkZFUkVOQ0UgLSBsaW5lRGlmZmVyZW5jZSlcbiAgICAgICAgICApLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluY3JlbWVudExldmVsKCkge1xuICAgICAgbGV2ZWwrK1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWNyZW1lbnRMZXZlbCgpIHtcbiAgICAgIGxldmVsLS1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0ltcG9ydChub2RlKSB7XG4gICAgICAgIGNvbnN0IHsgcGFyZW50IH0gPSBub2RlXG4gICAgICAgIGNvbnN0IG5vZGVQb3NpdGlvbiA9IHBhcmVudC5ib2R5LmluZGV4T2Yobm9kZSlcbiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBwYXJlbnQuYm9keVtub2RlUG9zaXRpb24gKyAxXVxuICAgICAgICBcbiAgICAgICAgLy8gc2tpcCBcImV4cG9ydCBpbXBvcnRcInNcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ1RTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24nICYmIG5vZGUuaXNFeHBvcnQpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0Tm9kZSAmJiBuZXh0Tm9kZS50eXBlICE9PSAnSW1wb3J0RGVjbGFyYXRpb24nICYmIChuZXh0Tm9kZS50eXBlICE9PSAnVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbicgfHwgbmV4dE5vZGUuaXNFeHBvcnQpKSB7XG4gICAgICAgICAgY2hlY2tGb3JOZXdMaW5lKG5vZGUsIG5leHROb2RlLCAnaW1wb3J0JylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBJbXBvcnREZWNsYXJhdGlvbjogY2hlY2tJbXBvcnQsXG4gICAgICBUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uOiBjaGVja0ltcG9ydCxcbiAgICAgIENhbGxFeHByZXNzaW9uOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIGlmIChpc1N0YXRpY1JlcXVpcmUobm9kZSkgJiYgbGV2ZWwgPT09IDApIHtcbiAgICAgICAgICByZXF1aXJlQ2FsbHMucHVzaChub2RlKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJ1Byb2dyYW06ZXhpdCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbG9nKCdleGl0IHByb2Nlc3NpbmcgZm9yJywgY29udGV4dC5nZXRGaWxlbmFtZSgpKVxuICAgICAgICBjb25zdCBzY29wZUJvZHkgPSBnZXRTY29wZUJvZHkoY29udGV4dC5nZXRTY29wZSgpKVxuICAgICAgICBsb2coJ2dvdCBzY29wZTonLCBzY29wZUJvZHkpXG5cbiAgICAgICAgcmVxdWlyZUNhbGxzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGluZGV4KSB7XG4gICAgICAgICAgY29uc3Qgbm9kZVBvc2l0aW9uID0gZmluZE5vZGVJbmRleEluU2NvcGVCb2R5KHNjb3BlQm9keSwgbm9kZSlcbiAgICAgICAgICBsb2coJ25vZGUgcG9zaXRpb24gaW4gc2NvcGU6Jywgbm9kZVBvc2l0aW9uKVxuXG4gICAgICAgICAgY29uc3Qgc3RhdGVtZW50V2l0aFJlcXVpcmVDYWxsID0gc2NvcGVCb2R5W25vZGVQb3NpdGlvbl1cbiAgICAgICAgICBjb25zdCBuZXh0U3RhdGVtZW50ID0gc2NvcGVCb2R5W25vZGVQb3NpdGlvbiArIDFdXG4gICAgICAgICAgY29uc3QgbmV4dFJlcXVpcmVDYWxsID0gcmVxdWlyZUNhbGxzW2luZGV4ICsgMV1cblxuICAgICAgICAgIGlmIChuZXh0UmVxdWlyZUNhbGwgJiYgY29udGFpbnNOb2RlT3JFcXVhbChzdGF0ZW1lbnRXaXRoUmVxdWlyZUNhbGwsIG5leHRSZXF1aXJlQ2FsbCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZXh0U3RhdGVtZW50ICYmXG4gICAgICAgICAgICAgKCFuZXh0UmVxdWlyZUNhbGwgfHwgIWNvbnRhaW5zTm9kZU9yRXF1YWwobmV4dFN0YXRlbWVudCwgbmV4dFJlcXVpcmVDYWxsKSkpIHtcblxuICAgICAgICAgICAgY2hlY2tGb3JOZXdMaW5lKHN0YXRlbWVudFdpdGhSZXF1aXJlQ2FsbCwgbmV4dFN0YXRlbWVudCwgJ3JlcXVpcmUnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiBpbmNyZW1lbnRMZXZlbCxcbiAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogaW5jcmVtZW50TGV2ZWwsXG4gICAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogaW5jcmVtZW50TGV2ZWwsXG4gICAgICBCbG9ja1N0YXRlbWVudDogaW5jcmVtZW50TGV2ZWwsXG4gICAgICBPYmplY3RFeHByZXNzaW9uOiBpbmNyZW1lbnRMZXZlbCxcbiAgICAgIERlY29yYXRvcjogaW5jcmVtZW50TGV2ZWwsXG4gICAgICAnRnVuY3Rpb25EZWNsYXJhdGlvbjpleGl0JzogZGVjcmVtZW50TGV2ZWwsXG4gICAgICAnRnVuY3Rpb25FeHByZXNzaW9uOmV4aXQnOiBkZWNyZW1lbnRMZXZlbCxcbiAgICAgICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjpleGl0JzogZGVjcmVtZW50TGV2ZWwsXG4gICAgICAnQmxvY2tTdGF0ZW1lbnQ6ZXhpdCc6IGRlY3JlbWVudExldmVsLFxuICAgICAgJ09iamVjdEV4cHJlc3Npb246ZXhpdCc6IGRlY3JlbWVudExldmVsLFxuICAgICAgJ0RlY29yYXRvcjpleGl0JzogZGVjcmVtZW50TGV2ZWwsXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-absolute-path.js b/node_modules/eslint-plugin-import/lib/rules/no-absolute-path.js
index 3a920cd..ff1cb22 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-absolute-path.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-absolute-path.js
@@ -1,25 +1,15 @@
-'use strict';
-
-var _moduleVisitor = require('eslint-module-utils/moduleVisitor');
-
-var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
-
+'use strict';var _moduleVisitor = require('eslint-module-utils/moduleVisitor');var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
 var _importType = require('../core/importType');
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-absolute-path')
-    },
-    schema: [(0, _moduleVisitor.makeOptionsSchema)()]
-  },
+      url: (0, _docsUrl2.default)('no-absolute-path') },
+
+    schema: [(0, _moduleVisitor.makeOptionsSchema)()] },
+
 
   create: function (context) {
     function reportIfAbsolute(source) {
@@ -30,6 +20,5 @@
 
     const options = Object.assign({ esmodule: true, commonjs: true }, context.options[0]);
     return (0, _moduleVisitor2.default)(reportIfAbsolute, options);
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1hYnNvbHV0ZS1wYXRoLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0IiwicmVwb3J0SWZBYnNvbHV0ZSIsInNvdXJjZSIsInZhbHVlIiwicmVwb3J0Iiwib3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsImVzbW9kdWxlIiwiY29tbW9uanMiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFDQTs7QUFDQTs7Ozs7O0FBRUFBLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFlBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLGtCQUFSO0FBREQsS0FGRjtBQUtKQyxZQUFRLENBQUUsdUNBQUY7QUFMSixHQURTOztBQVNmQyxVQUFRLFVBQVVDLE9BQVYsRUFBbUI7QUFDekIsYUFBU0MsZ0JBQVQsQ0FBMEJDLE1BQTFCLEVBQWtDO0FBQ2hDLFVBQUksT0FBT0EsT0FBT0MsS0FBZCxLQUF3QixRQUF4QixJQUFvQyw0QkFBV0QsT0FBT0MsS0FBbEIsQ0FBeEMsRUFBa0U7QUFDaEVILGdCQUFRSSxNQUFSLENBQWVGLE1BQWYsRUFBdUIsOENBQXZCO0FBQ0Q7QUFDRjs7QUFFRCxVQUFNRyxVQUFVQyxPQUFPQyxNQUFQLENBQWMsRUFBRUMsVUFBVSxJQUFaLEVBQWtCQyxVQUFVLElBQTVCLEVBQWQsRUFBa0RULFFBQVFLLE9BQVIsQ0FBZ0IsQ0FBaEIsQ0FBbEQsQ0FBaEI7QUFDQSxXQUFPLDZCQUFjSixnQkFBZCxFQUFnQ0ksT0FBaEMsQ0FBUDtBQUNEO0FBbEJjLENBQWpCIiwiZmlsZSI6Im5vLWFic29sdXRlLXBhdGguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9kdWxlVmlzaXRvciwgeyBtYWtlT3B0aW9uc1NjaGVtYSB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvbW9kdWxlVmlzaXRvcidcbmltcG9ydCB7IGlzQWJzb2x1dGUgfSBmcm9tICcuLi9jb3JlL2ltcG9ydFR5cGUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLWFic29sdXRlLXBhdGgnKSxcbiAgICB9LFxuICAgIHNjaGVtYTogWyBtYWtlT3B0aW9uc1NjaGVtYSgpIF0sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIGZ1bmN0aW9uIHJlcG9ydElmQWJzb2x1dGUoc291cmNlKSB7XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZS52YWx1ZSA9PT0gJ3N0cmluZycgJiYgaXNBYnNvbHV0ZShzb3VyY2UudmFsdWUpKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHNvdXJjZSwgJ0RvIG5vdCBpbXBvcnQgbW9kdWxlcyB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IGVzbW9kdWxlOiB0cnVlLCBjb21tb25qczogdHJ1ZSB9LCBjb250ZXh0Lm9wdGlvbnNbMF0pXG4gICAgcmV0dXJuIG1vZHVsZVZpc2l0b3IocmVwb3J0SWZBYnNvbHV0ZSwgb3B0aW9ucylcbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1hYnNvbHV0ZS1wYXRoLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0IiwicmVwb3J0SWZBYnNvbHV0ZSIsInNvdXJjZSIsInZhbHVlIiwicmVwb3J0Iiwib3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsImVzbW9kdWxlIiwiY29tbW9uanMiXSwibWFwcGluZ3MiOiJhQUFBLGtFO0FBQ0E7QUFDQSxxQzs7QUFFQUEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsa0JBQVIsQ0FERCxFQUZGOztBQUtKQyxZQUFRLENBQUUsdUNBQUYsQ0FMSixFQURTOzs7QUFTZkMsVUFBUSxVQUFVQyxPQUFWLEVBQW1CO0FBQ3pCLGFBQVNDLGdCQUFULENBQTBCQyxNQUExQixFQUFrQztBQUNoQyxVQUFJLE9BQU9BLE9BQU9DLEtBQWQsS0FBd0IsUUFBeEIsSUFBb0MsNEJBQVdELE9BQU9DLEtBQWxCLENBQXhDLEVBQWtFO0FBQ2hFSCxnQkFBUUksTUFBUixDQUFlRixNQUFmLEVBQXVCLDhDQUF2QjtBQUNEO0FBQ0Y7O0FBRUQsVUFBTUcsVUFBVUMsT0FBT0MsTUFBUCxDQUFjLEVBQUVDLFVBQVUsSUFBWixFQUFrQkMsVUFBVSxJQUE1QixFQUFkLEVBQWtEVCxRQUFRSyxPQUFSLENBQWdCLENBQWhCLENBQWxELENBQWhCO0FBQ0EsV0FBTyw2QkFBY0osZ0JBQWQsRUFBZ0NJLE9BQWhDLENBQVA7QUFDRCxHQWxCYyxFQUFqQiIsImZpbGUiOiJuby1hYnNvbHV0ZS1wYXRoLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vZHVsZVZpc2l0b3IsIHsgbWFrZU9wdGlvbnNTY2hlbWEgfSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL21vZHVsZVZpc2l0b3InXG5pbXBvcnQgeyBpc0Fic29sdXRlIH0gZnJvbSAnLi4vY29yZS9pbXBvcnRUeXBlJ1xuaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1hYnNvbHV0ZS1wYXRoJyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFsgbWFrZU9wdGlvbnNTY2hlbWEoKSBdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBmdW5jdGlvbiByZXBvcnRJZkFic29sdXRlKHNvdXJjZSkge1xuICAgICAgaWYgKHR5cGVvZiBzb3VyY2UudmFsdWUgPT09ICdzdHJpbmcnICYmIGlzQWJzb2x1dGUoc291cmNlLnZhbHVlKSkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydChzb3VyY2UsICdEbyBub3QgaW1wb3J0IG1vZHVsZXMgdXNpbmcgYW4gYWJzb2x1dGUgcGF0aCcpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oeyBlc21vZHVsZTogdHJ1ZSwgY29tbW9uanM6IHRydWUgfSwgY29udGV4dC5vcHRpb25zWzBdKVxuICAgIHJldHVybiBtb2R1bGVWaXNpdG9yKHJlcG9ydElmQWJzb2x1dGUsIG9wdGlvbnMpXG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-amd.js b/node_modules/eslint-plugin-import/lib/rules/no-amd.js
index 90897f1..4eca3f4 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-amd.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-amd.js
@@ -1,10 +1,9 @@
 'use strict';
 
-var _docsUrl = require('../docsUrl');
 
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
 
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 //------------------------------------------------------------------------------
 // Rule Definition
@@ -14,10 +13,10 @@
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-amd')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('no-amd') },
+
+    schema: [] },
+
 
   create: function (context) {
     return {
@@ -25,7 +24,8 @@
         if (context.getScope().type !== 'module') return;
 
         if (node.callee.type !== 'Identifier') return;
-        if (node.callee.name !== 'require' && node.callee.name !== 'define') return;
+        if (node.callee.name !== 'require' &&
+        node.callee.name !== 'define') return;
 
         // todo: capture define((require, module, exports) => {}) form?
         if (node.arguments.length !== 2) return;
@@ -36,11 +36,11 @@
         // todo: check second arg type? (identifier or callback)
 
         context.report(node, `Expected imports instead of AMD ${node.callee.name}().`);
-      }
-    };
-  }
-}; /**
-    * @fileoverview Rule to prefer imports to AMD
-    * @author Jamund Ferguson
-    */
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1hbWQuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJub2RlIiwiZ2V0U2NvcGUiLCJjYWxsZWUiLCJuYW1lIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwibW9kdWxlcyIsInJlcG9ydCJdLCJtYXBwaW5ncyI6Ijs7QUFLQTs7Ozs7O0FBRUE7QUFDQTtBQUNBOztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxZQURGO0FBRUpDLFVBQU07QUFDSkMsV0FBSyx1QkFBUSxRQUFSO0FBREQsS0FGRjtBQUtKQyxZQUFRO0FBTEosR0FEUzs7QUFTZkMsVUFBUSxVQUFVQyxPQUFWLEVBQW1CO0FBQ3pCLFdBQU87QUFDTCx3QkFBa0IsVUFBVUMsSUFBVixFQUFnQjtBQUNoQyxZQUFJRCxRQUFRRSxRQUFSLEdBQW1CUCxJQUFuQixLQUE0QixRQUFoQyxFQUEwQzs7QUFFMUMsWUFBSU0sS0FBS0UsTUFBTCxDQUFZUixJQUFaLEtBQXFCLFlBQXpCLEVBQXVDO0FBQ3ZDLFlBQUlNLEtBQUtFLE1BQUwsQ0FBWUMsSUFBWixLQUFxQixTQUFyQixJQUNBSCxLQUFLRSxNQUFMLENBQVlDLElBQVosS0FBcUIsUUFEekIsRUFDbUM7O0FBRW5DO0FBQ0EsWUFBSUgsS0FBS0ksU0FBTCxDQUFlQyxNQUFmLEtBQTBCLENBQTlCLEVBQWlDOztBQUVqQyxjQUFNQyxVQUFVTixLQUFLSSxTQUFMLENBQWUsQ0FBZixDQUFoQjtBQUNBLFlBQUlFLFFBQVFaLElBQVIsS0FBaUIsaUJBQXJCLEVBQXdDOztBQUV4Qzs7QUFFQUssZ0JBQVFRLE1BQVIsQ0FBZVAsSUFBZixFQUFzQixtQ0FBa0NBLEtBQUtFLE1BQUwsQ0FBWUMsSUFBSyxLQUF6RTtBQUNEO0FBakJJLEtBQVA7QUFvQkQ7QUE5QmMsQ0FBakIsQyxDQVhBIiwiZmlsZSI6Im5vLWFtZC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVvdmVydmlldyBSdWxlIHRvIHByZWZlciBpbXBvcnRzIHRvIEFNRFxuICogQGF1dGhvciBKYW11bmQgRmVyZ3Vzb25cbiAqL1xuXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUnVsZSBEZWZpbml0aW9uXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLWFtZCcpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdDYWxsRXhwcmVzc2lvbic6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChjb250ZXh0LmdldFNjb3BlKCkudHlwZSAhPT0gJ21vZHVsZScpIHJldHVyblxuXG4gICAgICAgIGlmIChub2RlLmNhbGxlZS50eXBlICE9PSAnSWRlbnRpZmllcicpIHJldHVyblxuICAgICAgICBpZiAobm9kZS5jYWxsZWUubmFtZSAhPT0gJ3JlcXVpcmUnICYmXG4gICAgICAgICAgICBub2RlLmNhbGxlZS5uYW1lICE9PSAnZGVmaW5lJykgcmV0dXJuXG5cbiAgICAgICAgLy8gdG9kbzogY2FwdHVyZSBkZWZpbmUoKHJlcXVpcmUsIG1vZHVsZSwgZXhwb3J0cykgPT4ge30pIGZvcm0/XG4gICAgICAgIGlmIChub2RlLmFyZ3VtZW50cy5sZW5ndGggIT09IDIpIHJldHVyblxuXG4gICAgICAgIGNvbnN0IG1vZHVsZXMgPSBub2RlLmFyZ3VtZW50c1swXVxuICAgICAgICBpZiAobW9kdWxlcy50eXBlICE9PSAnQXJyYXlFeHByZXNzaW9uJykgcmV0dXJuXG5cbiAgICAgICAgLy8gdG9kbzogY2hlY2sgc2Vjb25kIGFyZyB0eXBlPyAoaWRlbnRpZmllciBvciBjYWxsYmFjaylcblxuICAgICAgICBjb250ZXh0LnJlcG9ydChub2RlLCBgRXhwZWN0ZWQgaW1wb3J0cyBpbnN0ZWFkIG9mIEFNRCAke25vZGUuY2FsbGVlLm5hbWV9KCkuYClcbiAgICAgIH0sXG4gICAgfVxuXG4gIH0sXG59XG4iXX0=
\ No newline at end of file
+      } };
+
+
+  } }; /**
+        * @fileoverview Rule to prefer imports to AMD
+        * @author Jamund Ferguson
+        */
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1hbWQuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJub2RlIiwiZ2V0U2NvcGUiLCJjYWxsZWUiLCJuYW1lIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwibW9kdWxlcyIsInJlcG9ydCJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSxxQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUFBLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFlBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLFFBQVIsQ0FERCxFQUZGOztBQUtKQyxZQUFRLEVBTEosRUFEUzs7O0FBU2ZDLFVBQVEsVUFBVUMsT0FBVixFQUFtQjtBQUN6QixXQUFPO0FBQ0wsd0JBQWtCLFVBQVVDLElBQVYsRUFBZ0I7QUFDaEMsWUFBSUQsUUFBUUUsUUFBUixHQUFtQlAsSUFBbkIsS0FBNEIsUUFBaEMsRUFBMEM7O0FBRTFDLFlBQUlNLEtBQUtFLE1BQUwsQ0FBWVIsSUFBWixLQUFxQixZQUF6QixFQUF1QztBQUN2QyxZQUFJTSxLQUFLRSxNQUFMLENBQVlDLElBQVosS0FBcUIsU0FBckI7QUFDQUgsYUFBS0UsTUFBTCxDQUFZQyxJQUFaLEtBQXFCLFFBRHpCLEVBQ21DOztBQUVuQztBQUNBLFlBQUlILEtBQUtJLFNBQUwsQ0FBZUMsTUFBZixLQUEwQixDQUE5QixFQUFpQzs7QUFFakMsY0FBTUMsVUFBVU4sS0FBS0ksU0FBTCxDQUFlLENBQWYsQ0FBaEI7QUFDQSxZQUFJRSxRQUFRWixJQUFSLEtBQWlCLGlCQUFyQixFQUF3Qzs7QUFFeEM7O0FBRUFLLGdCQUFRUSxNQUFSLENBQWVQLElBQWYsRUFBc0IsbUNBQWtDQSxLQUFLRSxNQUFMLENBQVlDLElBQUssS0FBekU7QUFDRCxPQWpCSSxFQUFQOzs7QUFvQkQsR0E5QmMsRUFBakIsQyxDQVhBIiwiZmlsZSI6Im5vLWFtZC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVvdmVydmlldyBSdWxlIHRvIHByZWZlciBpbXBvcnRzIHRvIEFNRFxuICogQGF1dGhvciBKYW11bmQgRmVyZ3Vzb25cbiAqL1xuXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUnVsZSBEZWZpbml0aW9uXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLWFtZCcpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdDYWxsRXhwcmVzc2lvbic6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChjb250ZXh0LmdldFNjb3BlKCkudHlwZSAhPT0gJ21vZHVsZScpIHJldHVyblxuXG4gICAgICAgIGlmIChub2RlLmNhbGxlZS50eXBlICE9PSAnSWRlbnRpZmllcicpIHJldHVyblxuICAgICAgICBpZiAobm9kZS5jYWxsZWUubmFtZSAhPT0gJ3JlcXVpcmUnICYmXG4gICAgICAgICAgICBub2RlLmNhbGxlZS5uYW1lICE9PSAnZGVmaW5lJykgcmV0dXJuXG5cbiAgICAgICAgLy8gdG9kbzogY2FwdHVyZSBkZWZpbmUoKHJlcXVpcmUsIG1vZHVsZSwgZXhwb3J0cykgPT4ge30pIGZvcm0/XG4gICAgICAgIGlmIChub2RlLmFyZ3VtZW50cy5sZW5ndGggIT09IDIpIHJldHVyblxuXG4gICAgICAgIGNvbnN0IG1vZHVsZXMgPSBub2RlLmFyZ3VtZW50c1swXVxuICAgICAgICBpZiAobW9kdWxlcy50eXBlICE9PSAnQXJyYXlFeHByZXNzaW9uJykgcmV0dXJuXG5cbiAgICAgICAgLy8gdG9kbzogY2hlY2sgc2Vjb25kIGFyZyB0eXBlPyAoaWRlbnRpZmllciBvciBjYWxsYmFjaylcblxuICAgICAgICBjb250ZXh0LnJlcG9ydChub2RlLCBgRXhwZWN0ZWQgaW1wb3J0cyBpbnN0ZWFkIG9mIEFNRCAke25vZGUuY2FsbGVlLm5hbWV9KCkuYClcbiAgICAgIH0sXG4gICAgfVxuXG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-anonymous-default-export.js b/node_modules/eslint-plugin-import/lib/rules/no-anonymous-default-export.js
index f9ac0d0..0c2b7da 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-anonymous-default-export.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-anonymous-default-export.js
@@ -1,76 +1,71 @@
 'use strict';
 
-var _docsUrl = require('../docsUrl');
 
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
 
-var _has = require('has');
 
-var _has2 = _interopRequireDefault(_has);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * @fileoverview Rule to disallow anonymous default exports.
- * @author Duncan Beevers
- */
-
-const defs = {
-  ArrayExpression: {
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);
+var _has = require('has');var _has2 = _interopRequireDefault(_has);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /**
+                                                                                                                                                                  * @fileoverview Rule to disallow anonymous default exports.
+                                                                                                                                                                  * @author Duncan Beevers
+                                                                                                                                                                  */const defs = { ArrayExpression: {
     option: 'allowArray',
     description: 'If `false`, will report default export of an array',
-    message: 'Assign array to a variable before exporting as module default'
-  },
+    message: 'Assign array to a variable before exporting as module default' },
+
   ArrowFunctionExpression: {
     option: 'allowArrowFunction',
     description: 'If `false`, will report default export of an arrow function',
-    message: 'Assign arrow function to a variable before exporting as module default'
-  },
+    message: 'Assign arrow function to a variable before exporting as module default' },
+
   CallExpression: {
     option: 'allowCallExpression',
     description: 'If `false`, will report default export of a function call',
     message: 'Assign call result to a variable before exporting as module default',
-    default: true
-  },
+    default: true },
+
   ClassDeclaration: {
     option: 'allowAnonymousClass',
     description: 'If `false`, will report default export of an anonymous class',
     message: 'Unexpected default export of anonymous class',
-    forbid: node => !node.declaration.id
-  },
+    forbid: node => !node.declaration.id },
+
   FunctionDeclaration: {
     option: 'allowAnonymousFunction',
     description: 'If `false`, will report default export of an anonymous function',
     message: 'Unexpected default export of anonymous function',
-    forbid: node => !node.declaration.id
-  },
+    forbid: node => !node.declaration.id },
+
   Literal: {
     option: 'allowLiteral',
     description: 'If `false`, will report default export of a literal',
-    message: 'Assign literal to a variable before exporting as module default'
-  },
+    message: 'Assign literal to a variable before exporting as module default' },
+
   ObjectExpression: {
     option: 'allowObject',
     description: 'If `false`, will report default export of an object expression',
-    message: 'Assign object to a variable before exporting as module default'
-  },
+    message: 'Assign object to a variable before exporting as module default' },
+
   TemplateLiteral: {
     option: 'allowLiteral',
     description: 'If `false`, will report default export of a literal',
-    message: 'Assign literal to a variable before exporting as module default'
-  }
-};
+    message: 'Assign literal to a variable before exporting as module default' } };
 
-const schemaProperties = Object.keys(defs).map(key => defs[key]).reduce((acc, def) => {
+
+
+const schemaProperties = Object.keys(defs).
+map(key => defs[key]).
+reduce((acc, def) => {
   acc[def.option] = {
     description: def.description,
-    type: 'boolean'
-  };
+    type: 'boolean' };
+
 
   return acc;
 }, {});
 
-const defaults = Object.keys(defs).map(key => defs[key]).reduce((acc, def) => {
+const defaults = Object.keys(defs).
+map(key => defs[key]).
+reduce((acc, def) => {
   acc[def.option] = (0, _has2.default)(def, 'default') ? def.default : false;
   return acc;
 }, {});
@@ -79,15 +74,17 @@
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-anonymous-default-export')
-    },
+      url: (0, _docsUrl2.default)('no-anonymous-default-export') },
 
-    schema: [{
+
+    schema: [
+    {
       type: 'object',
       properties: schemaProperties,
-      'additionalProperties': false
-    }]
-  },
+      'additionalProperties': false }] },
+
+
+
 
   create: function (context) {
     const options = Object.assign({}, defaults, context.options[0]);
@@ -101,8 +98,7 @@
         if (def && !options[def.option] && (!def.forbid || def.forbid(node))) {
           context.report({ node, message: def.message });
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1hbm9ueW1vdXMtZGVmYXVsdC1leHBvcnQuanMiXSwibmFtZXMiOlsiZGVmcyIsIkFycmF5RXhwcmVzc2lvbiIsIm9wdGlvbiIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsIkFycm93RnVuY3Rpb25FeHByZXNzaW9uIiwiQ2FsbEV4cHJlc3Npb24iLCJkZWZhdWx0IiwiQ2xhc3NEZWNsYXJhdGlvbiIsImZvcmJpZCIsIm5vZGUiLCJkZWNsYXJhdGlvbiIsImlkIiwiRnVuY3Rpb25EZWNsYXJhdGlvbiIsIkxpdGVyYWwiLCJPYmplY3RFeHByZXNzaW9uIiwiVGVtcGxhdGVMaXRlcmFsIiwic2NoZW1hUHJvcGVydGllcyIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJrZXkiLCJyZWR1Y2UiLCJhY2MiLCJkZWYiLCJ0eXBlIiwiZGVmYXVsdHMiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiY3JlYXRlIiwiY29udGV4dCIsIm9wdGlvbnMiLCJhc3NpZ24iLCJyZXBvcnQiXSwibWFwcGluZ3MiOiI7O0FBS0E7Ozs7QUFDQTs7Ozs7O0FBTkE7Ozs7O0FBUUEsTUFBTUEsT0FBTztBQUNYQyxtQkFBaUI7QUFDZkMsWUFBUSxZQURPO0FBRWZDLGlCQUFhLG9EQUZFO0FBR2ZDLGFBQVM7QUFITSxHQUROO0FBTVhDLDJCQUF5QjtBQUN2QkgsWUFBUSxvQkFEZTtBQUV2QkMsaUJBQWEsNkRBRlU7QUFHdkJDLGFBQVM7QUFIYyxHQU5kO0FBV1hFLGtCQUFnQjtBQUNkSixZQUFRLHFCQURNO0FBRWRDLGlCQUFhLDJEQUZDO0FBR2RDLGFBQVMscUVBSEs7QUFJZEcsYUFBUztBQUpLLEdBWEw7QUFpQlhDLG9CQUFrQjtBQUNoQk4sWUFBUSxxQkFEUTtBQUVoQkMsaUJBQWEsOERBRkc7QUFHaEJDLGFBQVMsOENBSE87QUFJaEJLLFlBQVNDLElBQUQsSUFBVSxDQUFDQSxLQUFLQyxXQUFMLENBQWlCQztBQUpwQixHQWpCUDtBQXVCWEMsdUJBQXFCO0FBQ25CWCxZQUFRLHdCQURXO0FBRW5CQyxpQkFBYSxpRUFGTTtBQUduQkMsYUFBUyxpREFIVTtBQUluQkssWUFBU0MsSUFBRCxJQUFVLENBQUNBLEtBQUtDLFdBQUwsQ0FBaUJDO0FBSmpCLEdBdkJWO0FBNkJYRSxXQUFTO0FBQ1BaLFlBQVEsY0FERDtBQUVQQyxpQkFBYSxxREFGTjtBQUdQQyxhQUFTO0FBSEYsR0E3QkU7QUFrQ1hXLG9CQUFrQjtBQUNoQmIsWUFBUSxhQURRO0FBRWhCQyxpQkFBYSxnRUFGRztBQUdoQkMsYUFBUztBQUhPLEdBbENQO0FBdUNYWSxtQkFBaUI7QUFDZmQsWUFBUSxjQURPO0FBRWZDLGlCQUFhLHFEQUZFO0FBR2ZDLGFBQVM7QUFITTtBQXZDTixDQUFiOztBQThDQSxNQUFNYSxtQkFBbUJDLE9BQU9DLElBQVAsQ0FBWW5CLElBQVosRUFDdEJvQixHQURzQixDQUNqQkMsR0FBRCxJQUFTckIsS0FBS3FCLEdBQUwsQ0FEUyxFQUV0QkMsTUFGc0IsQ0FFZixDQUFDQyxHQUFELEVBQU1DLEdBQU4sS0FBYztBQUNwQkQsTUFBSUMsSUFBSXRCLE1BQVIsSUFBa0I7QUFDaEJDLGlCQUFhcUIsSUFBSXJCLFdBREQ7QUFFaEJzQixVQUFNO0FBRlUsR0FBbEI7O0FBS0EsU0FBT0YsR0FBUDtBQUNELENBVHNCLEVBU3BCLEVBVG9CLENBQXpCOztBQVdBLE1BQU1HLFdBQVdSLE9BQU9DLElBQVAsQ0FBWW5CLElBQVosRUFDZG9CLEdBRGMsQ0FDVEMsR0FBRCxJQUFTckIsS0FBS3FCLEdBQUwsQ0FEQyxFQUVkQyxNQUZjLENBRVAsQ0FBQ0MsR0FBRCxFQUFNQyxHQUFOLEtBQWM7QUFDcEJELE1BQUlDLElBQUl0QixNQUFSLElBQWtCLG1CQUFJc0IsR0FBSixFQUFTLFNBQVQsSUFBc0JBLElBQUlqQixPQUExQixHQUFvQyxLQUF0RDtBQUNBLFNBQU9nQixHQUFQO0FBQ0QsQ0FMYyxFQUtaLEVBTFksQ0FBakI7O0FBT0FJLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKSixVQUFNLFlBREY7QUFFSkssVUFBTTtBQUNKQyxXQUFLLHVCQUFRLDZCQUFSO0FBREQsS0FGRjs7QUFNSkMsWUFBUSxDQUNOO0FBQ0VQLFlBQU0sUUFEUjtBQUVFUSxrQkFBWWhCLGdCQUZkO0FBR0UsOEJBQXdCO0FBSDFCLEtBRE07QUFOSixHQURTOztBQWdCZmlCLFVBQVEsVUFBVUMsT0FBVixFQUFtQjtBQUN6QixVQUFNQyxVQUFVbEIsT0FBT21CLE1BQVAsQ0FBYyxFQUFkLEVBQWtCWCxRQUFsQixFQUE0QlMsUUFBUUMsT0FBUixDQUFnQixDQUFoQixDQUE1QixDQUFoQjs7QUFFQSxXQUFPO0FBQ0wsa0NBQTZCMUIsSUFBRCxJQUFVO0FBQ3BDLGNBQU1jLE1BQU14QixLQUFLVSxLQUFLQyxXQUFMLENBQWlCYyxJQUF0QixDQUFaOztBQUVBO0FBQ0E7QUFDQSxZQUFJRCxPQUFPLENBQUNZLFFBQVFaLElBQUl0QixNQUFaLENBQVIsS0FBZ0MsQ0FBQ3NCLElBQUlmLE1BQUwsSUFBZWUsSUFBSWYsTUFBSixDQUFXQyxJQUFYLENBQS9DLENBQUosRUFBc0U7QUFDcEV5QixrQkFBUUcsTUFBUixDQUFlLEVBQUU1QixJQUFGLEVBQVFOLFNBQVNvQixJQUFJcEIsT0FBckIsRUFBZjtBQUNEO0FBQ0Y7QUFUSSxLQUFQO0FBV0Q7QUE5QmMsQ0FBakIiLCJmaWxlIjoibm8tYW5vbnltb3VzLWRlZmF1bHQtZXhwb3J0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFJ1bGUgdG8gZGlzYWxsb3cgYW5vbnltb3VzIGRlZmF1bHQgZXhwb3J0cy5cbiAqIEBhdXRob3IgRHVuY2FuIEJlZXZlcnNcbiAqL1xuXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuaW1wb3J0IGhhcyBmcm9tICdoYXMnXG5cbmNvbnN0IGRlZnMgPSB7XG4gIEFycmF5RXhwcmVzc2lvbjoge1xuICAgIG9wdGlvbjogJ2FsbG93QXJyYXknLFxuICAgIGRlc2NyaXB0aW9uOiAnSWYgYGZhbHNlYCwgd2lsbCByZXBvcnQgZGVmYXVsdCBleHBvcnQgb2YgYW4gYXJyYXknLFxuICAgIG1lc3NhZ2U6ICdBc3NpZ24gYXJyYXkgdG8gYSB2YXJpYWJsZSBiZWZvcmUgZXhwb3J0aW5nIGFzIG1vZHVsZSBkZWZhdWx0JyxcbiAgfSxcbiAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IHtcbiAgICBvcHRpb246ICdhbGxvd0Fycm93RnVuY3Rpb24nLFxuICAgIGRlc2NyaXB0aW9uOiAnSWYgYGZhbHNlYCwgd2lsbCByZXBvcnQgZGVmYXVsdCBleHBvcnQgb2YgYW4gYXJyb3cgZnVuY3Rpb24nLFxuICAgIG1lc3NhZ2U6ICdBc3NpZ24gYXJyb3cgZnVuY3Rpb24gdG8gYSB2YXJpYWJsZSBiZWZvcmUgZXhwb3J0aW5nIGFzIG1vZHVsZSBkZWZhdWx0JyxcbiAgfSxcbiAgQ2FsbEV4cHJlc3Npb246IHtcbiAgICBvcHRpb246ICdhbGxvd0NhbGxFeHByZXNzaW9uJyxcbiAgICBkZXNjcmlwdGlvbjogJ0lmIGBmYWxzZWAsIHdpbGwgcmVwb3J0IGRlZmF1bHQgZXhwb3J0IG9mIGEgZnVuY3Rpb24gY2FsbCcsXG4gICAgbWVzc2FnZTogJ0Fzc2lnbiBjYWxsIHJlc3VsdCB0byBhIHZhcmlhYmxlIGJlZm9yZSBleHBvcnRpbmcgYXMgbW9kdWxlIGRlZmF1bHQnLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIENsYXNzRGVjbGFyYXRpb246IHtcbiAgICBvcHRpb246ICdhbGxvd0Fub255bW91c0NsYXNzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0lmIGBmYWxzZWAsIHdpbGwgcmVwb3J0IGRlZmF1bHQgZXhwb3J0IG9mIGFuIGFub255bW91cyBjbGFzcycsXG4gICAgbWVzc2FnZTogJ1VuZXhwZWN0ZWQgZGVmYXVsdCBleHBvcnQgb2YgYW5vbnltb3VzIGNsYXNzJyxcbiAgICBmb3JiaWQ6IChub2RlKSA9PiAhbm9kZS5kZWNsYXJhdGlvbi5pZCxcbiAgfSxcbiAgRnVuY3Rpb25EZWNsYXJhdGlvbjoge1xuICAgIG9wdGlvbjogJ2FsbG93QW5vbnltb3VzRnVuY3Rpb24nLFxuICAgIGRlc2NyaXB0aW9uOiAnSWYgYGZhbHNlYCwgd2lsbCByZXBvcnQgZGVmYXVsdCBleHBvcnQgb2YgYW4gYW5vbnltb3VzIGZ1bmN0aW9uJyxcbiAgICBtZXNzYWdlOiAnVW5leHBlY3RlZCBkZWZhdWx0IGV4cG9ydCBvZiBhbm9ueW1vdXMgZnVuY3Rpb24nLFxuICAgIGZvcmJpZDogKG5vZGUpID0+ICFub2RlLmRlY2xhcmF0aW9uLmlkLFxuICB9LFxuICBMaXRlcmFsOiB7XG4gICAgb3B0aW9uOiAnYWxsb3dMaXRlcmFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ0lmIGBmYWxzZWAsIHdpbGwgcmVwb3J0IGRlZmF1bHQgZXhwb3J0IG9mIGEgbGl0ZXJhbCcsXG4gICAgbWVzc2FnZTogJ0Fzc2lnbiBsaXRlcmFsIHRvIGEgdmFyaWFibGUgYmVmb3JlIGV4cG9ydGluZyBhcyBtb2R1bGUgZGVmYXVsdCcsXG4gIH0sXG4gIE9iamVjdEV4cHJlc3Npb246IHtcbiAgICBvcHRpb246ICdhbGxvd09iamVjdCcsXG4gICAgZGVzY3JpcHRpb246ICdJZiBgZmFsc2VgLCB3aWxsIHJlcG9ydCBkZWZhdWx0IGV4cG9ydCBvZiBhbiBvYmplY3QgZXhwcmVzc2lvbicsXG4gICAgbWVzc2FnZTogJ0Fzc2lnbiBvYmplY3QgdG8gYSB2YXJpYWJsZSBiZWZvcmUgZXhwb3J0aW5nIGFzIG1vZHVsZSBkZWZhdWx0JyxcbiAgfSxcbiAgVGVtcGxhdGVMaXRlcmFsOiB7XG4gICAgb3B0aW9uOiAnYWxsb3dMaXRlcmFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ0lmIGBmYWxzZWAsIHdpbGwgcmVwb3J0IGRlZmF1bHQgZXhwb3J0IG9mIGEgbGl0ZXJhbCcsXG4gICAgbWVzc2FnZTogJ0Fzc2lnbiBsaXRlcmFsIHRvIGEgdmFyaWFibGUgYmVmb3JlIGV4cG9ydGluZyBhcyBtb2R1bGUgZGVmYXVsdCcsXG4gIH0sXG59XG5cbmNvbnN0IHNjaGVtYVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhkZWZzKVxuICAubWFwKChrZXkpID0+IGRlZnNba2V5XSlcbiAgLnJlZHVjZSgoYWNjLCBkZWYpID0+IHtcbiAgICBhY2NbZGVmLm9wdGlvbl0gPSB7XG4gICAgICBkZXNjcmlwdGlvbjogZGVmLmRlc2NyaXB0aW9uLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIH1cblxuICAgIHJldHVybiBhY2NcbiAgfSwge30pXG5cbmNvbnN0IGRlZmF1bHRzID0gT2JqZWN0LmtleXMoZGVmcylcbiAgLm1hcCgoa2V5KSA9PiBkZWZzW2tleV0pXG4gIC5yZWR1Y2UoKGFjYywgZGVmKSA9PiB7XG4gICAgYWNjW2RlZi5vcHRpb25dID0gaGFzKGRlZiwgJ2RlZmF1bHQnKSA/IGRlZi5kZWZhdWx0IDogZmFsc2VcbiAgICByZXR1cm4gYWNjXG4gIH0sIHt9KVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLWFub255bW91cy1kZWZhdWx0LWV4cG9ydCcpLFxuICAgIH0sXG5cbiAgICBzY2hlbWE6IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIHByb3BlcnRpZXM6IHNjaGVtYVByb3BlcnRpZXMsXG4gICAgICAgICdhZGRpdGlvbmFsUHJvcGVydGllcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIGNvbnRleHQub3B0aW9uc1swXSlcblxuICAgIHJldHVybiB7XG4gICAgICAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJzogKG5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgZGVmID0gZGVmc1tub2RlLmRlY2xhcmF0aW9uLnR5cGVdXG5cbiAgICAgICAgLy8gUmVjb2duaXplZCBub2RlIHR5cGUgYW5kIGFsbG93ZWQgYnkgY29uZmlndXJhdGlvbixcbiAgICAgICAgLy8gICBhbmQgaGFzIG5vIGZvcmJpZCBjaGVjaywgb3IgZm9yYmlkIGNoZWNrIHJldHVybiB2YWx1ZSBpcyB0cnV0aHlcbiAgICAgICAgaWYgKGRlZiAmJiAhb3B0aW9uc1tkZWYub3B0aW9uXSAmJiAoIWRlZi5mb3JiaWQgfHwgZGVmLmZvcmJpZChub2RlKSkpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7IG5vZGUsIG1lc3NhZ2U6IGRlZi5tZXNzYWdlIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1hbm9ueW1vdXMtZGVmYXVsdC1leHBvcnQuanMiXSwibmFtZXMiOlsiZGVmcyIsIkFycmF5RXhwcmVzc2lvbiIsIm9wdGlvbiIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsIkFycm93RnVuY3Rpb25FeHByZXNzaW9uIiwiQ2FsbEV4cHJlc3Npb24iLCJkZWZhdWx0IiwiQ2xhc3NEZWNsYXJhdGlvbiIsImZvcmJpZCIsIm5vZGUiLCJkZWNsYXJhdGlvbiIsImlkIiwiRnVuY3Rpb25EZWNsYXJhdGlvbiIsIkxpdGVyYWwiLCJPYmplY3RFeHByZXNzaW9uIiwiVGVtcGxhdGVMaXRlcmFsIiwic2NoZW1hUHJvcGVydGllcyIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJrZXkiLCJyZWR1Y2UiLCJhY2MiLCJkZWYiLCJ0eXBlIiwiZGVmYXVsdHMiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiY3JlYXRlIiwiY29udGV4dCIsIm9wdGlvbnMiLCJhc3NpZ24iLCJyZXBvcnQiXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0EscUM7QUFDQSwwQix1SUFOQTs7O29LQVFBLE1BQU1BLE9BQU8sRUFDWEMsaUJBQWlCO0FBQ2ZDLFlBQVEsWUFETztBQUVmQyxpQkFBYSxvREFGRTtBQUdmQyxhQUFTLCtEQUhNLEVBRE47O0FBTVhDLDJCQUF5QjtBQUN2QkgsWUFBUSxvQkFEZTtBQUV2QkMsaUJBQWEsNkRBRlU7QUFHdkJDLGFBQVMsd0VBSGMsRUFOZDs7QUFXWEUsa0JBQWdCO0FBQ2RKLFlBQVEscUJBRE07QUFFZEMsaUJBQWEsMkRBRkM7QUFHZEMsYUFBUyxxRUFISztBQUlkRyxhQUFTLElBSkssRUFYTDs7QUFpQlhDLG9CQUFrQjtBQUNoQk4sWUFBUSxxQkFEUTtBQUVoQkMsaUJBQWEsOERBRkc7QUFHaEJDLGFBQVMsOENBSE87QUFJaEJLLFlBQVNDLElBQUQsSUFBVSxDQUFDQSxLQUFLQyxXQUFMLENBQWlCQyxFQUpwQixFQWpCUDs7QUF1QlhDLHVCQUFxQjtBQUNuQlgsWUFBUSx3QkFEVztBQUVuQkMsaUJBQWEsaUVBRk07QUFHbkJDLGFBQVMsaURBSFU7QUFJbkJLLFlBQVNDLElBQUQsSUFBVSxDQUFDQSxLQUFLQyxXQUFMLENBQWlCQyxFQUpqQixFQXZCVjs7QUE2QlhFLFdBQVM7QUFDUFosWUFBUSxjQUREO0FBRVBDLGlCQUFhLHFEQUZOO0FBR1BDLGFBQVMsaUVBSEYsRUE3QkU7O0FBa0NYVyxvQkFBa0I7QUFDaEJiLFlBQVEsYUFEUTtBQUVoQkMsaUJBQWEsZ0VBRkc7QUFHaEJDLGFBQVMsZ0VBSE8sRUFsQ1A7O0FBdUNYWSxtQkFBaUI7QUFDZmQsWUFBUSxjQURPO0FBRWZDLGlCQUFhLHFEQUZFO0FBR2ZDLGFBQVMsaUVBSE0sRUF2Q04sRUFBYjs7OztBQThDQSxNQUFNYSxtQkFBbUJDLE9BQU9DLElBQVAsQ0FBWW5CLElBQVo7QUFDdEJvQixHQURzQixDQUNqQkMsR0FBRCxJQUFTckIsS0FBS3FCLEdBQUwsQ0FEUztBQUV0QkMsTUFGc0IsQ0FFZixDQUFDQyxHQUFELEVBQU1DLEdBQU4sS0FBYztBQUNwQkQsTUFBSUMsSUFBSXRCLE1BQVIsSUFBa0I7QUFDaEJDLGlCQUFhcUIsSUFBSXJCLFdBREQ7QUFFaEJzQixVQUFNLFNBRlUsRUFBbEI7OztBQUtBLFNBQU9GLEdBQVA7QUFDRCxDQVRzQixFQVNwQixFQVRvQixDQUF6Qjs7QUFXQSxNQUFNRyxXQUFXUixPQUFPQyxJQUFQLENBQVluQixJQUFaO0FBQ2RvQixHQURjLENBQ1RDLEdBQUQsSUFBU3JCLEtBQUtxQixHQUFMLENBREM7QUFFZEMsTUFGYyxDQUVQLENBQUNDLEdBQUQsRUFBTUMsR0FBTixLQUFjO0FBQ3BCRCxNQUFJQyxJQUFJdEIsTUFBUixJQUFrQixtQkFBSXNCLEdBQUosRUFBUyxTQUFULElBQXNCQSxJQUFJakIsT0FBMUIsR0FBb0MsS0FBdEQ7QUFDQSxTQUFPZ0IsR0FBUDtBQUNELENBTGMsRUFLWixFQUxZLENBQWpCOztBQU9BSSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkosVUFBTSxZQURGO0FBRUpLLFVBQU07QUFDSkMsV0FBSyx1QkFBUSw2QkFBUixDQURELEVBRkY7OztBQU1KQyxZQUFRO0FBQ047QUFDRVAsWUFBTSxRQURSO0FBRUVRLGtCQUFZaEIsZ0JBRmQ7QUFHRSw4QkFBd0IsS0FIMUIsRUFETSxDQU5KLEVBRFM7Ozs7O0FBZ0JmaUIsVUFBUSxVQUFVQyxPQUFWLEVBQW1CO0FBQ3pCLFVBQU1DLFVBQVVsQixPQUFPbUIsTUFBUCxDQUFjLEVBQWQsRUFBa0JYLFFBQWxCLEVBQTRCUyxRQUFRQyxPQUFSLENBQWdCLENBQWhCLENBQTVCLENBQWhCOztBQUVBLFdBQU87QUFDTCxrQ0FBNkIxQixJQUFELElBQVU7QUFDcEMsY0FBTWMsTUFBTXhCLEtBQUtVLEtBQUtDLFdBQUwsQ0FBaUJjLElBQXRCLENBQVo7O0FBRUE7QUFDQTtBQUNBLFlBQUlELE9BQU8sQ0FBQ1ksUUFBUVosSUFBSXRCLE1BQVosQ0FBUixLQUFnQyxDQUFDc0IsSUFBSWYsTUFBTCxJQUFlZSxJQUFJZixNQUFKLENBQVdDLElBQVgsQ0FBL0MsQ0FBSixFQUFzRTtBQUNwRXlCLGtCQUFRRyxNQUFSLENBQWUsRUFBRTVCLElBQUYsRUFBUU4sU0FBU29CLElBQUlwQixPQUFyQixFQUFmO0FBQ0Q7QUFDRixPQVRJLEVBQVA7O0FBV0QsR0E5QmMsRUFBakIiLCJmaWxlIjoibm8tYW5vbnltb3VzLWRlZmF1bHQtZXhwb3J0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFJ1bGUgdG8gZGlzYWxsb3cgYW5vbnltb3VzIGRlZmF1bHQgZXhwb3J0cy5cbiAqIEBhdXRob3IgRHVuY2FuIEJlZXZlcnNcbiAqL1xuXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuaW1wb3J0IGhhcyBmcm9tICdoYXMnXG5cbmNvbnN0IGRlZnMgPSB7XG4gIEFycmF5RXhwcmVzc2lvbjoge1xuICAgIG9wdGlvbjogJ2FsbG93QXJyYXknLFxuICAgIGRlc2NyaXB0aW9uOiAnSWYgYGZhbHNlYCwgd2lsbCByZXBvcnQgZGVmYXVsdCBleHBvcnQgb2YgYW4gYXJyYXknLFxuICAgIG1lc3NhZ2U6ICdBc3NpZ24gYXJyYXkgdG8gYSB2YXJpYWJsZSBiZWZvcmUgZXhwb3J0aW5nIGFzIG1vZHVsZSBkZWZhdWx0JyxcbiAgfSxcbiAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IHtcbiAgICBvcHRpb246ICdhbGxvd0Fycm93RnVuY3Rpb24nLFxuICAgIGRlc2NyaXB0aW9uOiAnSWYgYGZhbHNlYCwgd2lsbCByZXBvcnQgZGVmYXVsdCBleHBvcnQgb2YgYW4gYXJyb3cgZnVuY3Rpb24nLFxuICAgIG1lc3NhZ2U6ICdBc3NpZ24gYXJyb3cgZnVuY3Rpb24gdG8gYSB2YXJpYWJsZSBiZWZvcmUgZXhwb3J0aW5nIGFzIG1vZHVsZSBkZWZhdWx0JyxcbiAgfSxcbiAgQ2FsbEV4cHJlc3Npb246IHtcbiAgICBvcHRpb246ICdhbGxvd0NhbGxFeHByZXNzaW9uJyxcbiAgICBkZXNjcmlwdGlvbjogJ0lmIGBmYWxzZWAsIHdpbGwgcmVwb3J0IGRlZmF1bHQgZXhwb3J0IG9mIGEgZnVuY3Rpb24gY2FsbCcsXG4gICAgbWVzc2FnZTogJ0Fzc2lnbiBjYWxsIHJlc3VsdCB0byBhIHZhcmlhYmxlIGJlZm9yZSBleHBvcnRpbmcgYXMgbW9kdWxlIGRlZmF1bHQnLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIENsYXNzRGVjbGFyYXRpb246IHtcbiAgICBvcHRpb246ICdhbGxvd0Fub255bW91c0NsYXNzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0lmIGBmYWxzZWAsIHdpbGwgcmVwb3J0IGRlZmF1bHQgZXhwb3J0IG9mIGFuIGFub255bW91cyBjbGFzcycsXG4gICAgbWVzc2FnZTogJ1VuZXhwZWN0ZWQgZGVmYXVsdCBleHBvcnQgb2YgYW5vbnltb3VzIGNsYXNzJyxcbiAgICBmb3JiaWQ6IChub2RlKSA9PiAhbm9kZS5kZWNsYXJhdGlvbi5pZCxcbiAgfSxcbiAgRnVuY3Rpb25EZWNsYXJhdGlvbjoge1xuICAgIG9wdGlvbjogJ2FsbG93QW5vbnltb3VzRnVuY3Rpb24nLFxuICAgIGRlc2NyaXB0aW9uOiAnSWYgYGZhbHNlYCwgd2lsbCByZXBvcnQgZGVmYXVsdCBleHBvcnQgb2YgYW4gYW5vbnltb3VzIGZ1bmN0aW9uJyxcbiAgICBtZXNzYWdlOiAnVW5leHBlY3RlZCBkZWZhdWx0IGV4cG9ydCBvZiBhbm9ueW1vdXMgZnVuY3Rpb24nLFxuICAgIGZvcmJpZDogKG5vZGUpID0+ICFub2RlLmRlY2xhcmF0aW9uLmlkLFxuICB9LFxuICBMaXRlcmFsOiB7XG4gICAgb3B0aW9uOiAnYWxsb3dMaXRlcmFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ0lmIGBmYWxzZWAsIHdpbGwgcmVwb3J0IGRlZmF1bHQgZXhwb3J0IG9mIGEgbGl0ZXJhbCcsXG4gICAgbWVzc2FnZTogJ0Fzc2lnbiBsaXRlcmFsIHRvIGEgdmFyaWFibGUgYmVmb3JlIGV4cG9ydGluZyBhcyBtb2R1bGUgZGVmYXVsdCcsXG4gIH0sXG4gIE9iamVjdEV4cHJlc3Npb246IHtcbiAgICBvcHRpb246ICdhbGxvd09iamVjdCcsXG4gICAgZGVzY3JpcHRpb246ICdJZiBgZmFsc2VgLCB3aWxsIHJlcG9ydCBkZWZhdWx0IGV4cG9ydCBvZiBhbiBvYmplY3QgZXhwcmVzc2lvbicsXG4gICAgbWVzc2FnZTogJ0Fzc2lnbiBvYmplY3QgdG8gYSB2YXJpYWJsZSBiZWZvcmUgZXhwb3J0aW5nIGFzIG1vZHVsZSBkZWZhdWx0JyxcbiAgfSxcbiAgVGVtcGxhdGVMaXRlcmFsOiB7XG4gICAgb3B0aW9uOiAnYWxsb3dMaXRlcmFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ0lmIGBmYWxzZWAsIHdpbGwgcmVwb3J0IGRlZmF1bHQgZXhwb3J0IG9mIGEgbGl0ZXJhbCcsXG4gICAgbWVzc2FnZTogJ0Fzc2lnbiBsaXRlcmFsIHRvIGEgdmFyaWFibGUgYmVmb3JlIGV4cG9ydGluZyBhcyBtb2R1bGUgZGVmYXVsdCcsXG4gIH0sXG59XG5cbmNvbnN0IHNjaGVtYVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhkZWZzKVxuICAubWFwKChrZXkpID0+IGRlZnNba2V5XSlcbiAgLnJlZHVjZSgoYWNjLCBkZWYpID0+IHtcbiAgICBhY2NbZGVmLm9wdGlvbl0gPSB7XG4gICAgICBkZXNjcmlwdGlvbjogZGVmLmRlc2NyaXB0aW9uLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIH1cblxuICAgIHJldHVybiBhY2NcbiAgfSwge30pXG5cbmNvbnN0IGRlZmF1bHRzID0gT2JqZWN0LmtleXMoZGVmcylcbiAgLm1hcCgoa2V5KSA9PiBkZWZzW2tleV0pXG4gIC5yZWR1Y2UoKGFjYywgZGVmKSA9PiB7XG4gICAgYWNjW2RlZi5vcHRpb25dID0gaGFzKGRlZiwgJ2RlZmF1bHQnKSA/IGRlZi5kZWZhdWx0IDogZmFsc2VcbiAgICByZXR1cm4gYWNjXG4gIH0sIHt9KVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLWFub255bW91cy1kZWZhdWx0LWV4cG9ydCcpLFxuICAgIH0sXG5cbiAgICBzY2hlbWE6IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIHByb3BlcnRpZXM6IHNjaGVtYVByb3BlcnRpZXMsXG4gICAgICAgICdhZGRpdGlvbmFsUHJvcGVydGllcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIGNvbnRleHQub3B0aW9uc1swXSlcblxuICAgIHJldHVybiB7XG4gICAgICAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJzogKG5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgZGVmID0gZGVmc1tub2RlLmRlY2xhcmF0aW9uLnR5cGVdXG5cbiAgICAgICAgLy8gUmVjb2duaXplZCBub2RlIHR5cGUgYW5kIGFsbG93ZWQgYnkgY29uZmlndXJhdGlvbixcbiAgICAgICAgLy8gICBhbmQgaGFzIG5vIGZvcmJpZCBjaGVjaywgb3IgZm9yYmlkIGNoZWNrIHJldHVybiB2YWx1ZSBpcyB0cnV0aHlcbiAgICAgICAgaWYgKGRlZiAmJiAhb3B0aW9uc1tkZWYub3B0aW9uXSAmJiAoIWRlZi5mb3JiaWQgfHwgZGVmLmZvcmJpZChub2RlKSkpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7IG5vZGUsIG1lc3NhZ2U6IGRlZi5tZXNzYWdlIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-commonjs.js b/node_modules/eslint-plugin-import/lib/rules/no-commonjs.js
index 848b797..5fb5608 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-commonjs.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-commonjs.js
@@ -1,19 +1,15 @@
 'use strict';
 
-var _docsUrl = require('../docsUrl');
 
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
 
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 const EXPORT_MESSAGE = 'Expected "export" or "export default"',
-      IMPORT_MESSAGE = 'Expected "import" instead of "require()"'; /**
-                                                                    * @fileoverview Rule to prefer ES6 to CJS
-                                                                    * @author Jamund Ferguson
-                                                                    */
-
-function normalizeLegacyOptions(options) {
-  if (options.indexOf('allow-primitive-modules') >= 0) {
+IMPORT_MESSAGE = 'Expected "import" instead of "require()"'; /**
+                                                              * @fileoverview Rule to prefer ES6 to CJS
+                                                              * @author Jamund Ferguson
+                                                              */function normalizeLegacyOptions(options) {if (options.indexOf('allow-primitive-modules') >= 0) {
     return { allowPrimitiveModules: true };
   }
   return options[0] || {};
@@ -39,7 +35,12 @@
 
 // https://github.com/estree/estree/blob/master/es5.md
 function isConditional(node) {
-  if (node.type === 'IfStatement' || node.type === 'TryStatement' || node.type === 'LogicalExpression' || node.type === 'ConditionalExpression') return true;
+  if (
+  node.type === 'IfStatement' ||
+  node.type === 'TryStatement' ||
+  node.type === 'LogicalExpression' ||
+  node.type === 'ConditionalExpression')
+  return true;
   if (node.parent) return isConditional(node.parent);
   return false;
 }
@@ -54,30 +55,33 @@
   properties: {
     allowPrimitiveModules: { 'type': 'boolean' },
     allowRequire: { 'type': 'boolean' },
-    allowConditionalRequire: { 'type': 'boolean' }
-  },
-  additionalProperties: false
-};
+    allowConditionalRequire: { 'type': 'boolean' } },
+
+  additionalProperties: false };
+
 
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-commonjs')
-    },
+      url: (0, _docsUrl2.default)('no-commonjs') },
+
 
     schema: {
-      anyOf: [{
+      anyOf: [
+      {
         type: 'array',
         items: [schemaString],
-        additionalItems: false
-      }, {
+        additionalItems: false },
+
+      {
         type: 'array',
         items: [schemaObject],
-        additionalItems: false
-      }]
-    }
-  },
+        additionalItems: false }] } },
+
+
+
+
 
   create: function (context) {
     const options = normalizeLegacyOptions(context.options);
@@ -94,11 +98,14 @@
 
         // exports.
         if (node.object.name === 'exports') {
-          const isInScope = context.getScope().variables.some(variable => variable.name === 'exports');
+          const isInScope = context.getScope().
+          variables.
+          some(variable => variable.name === 'exports');
           if (!isInScope) {
             context.report({ node, message: EXPORT_MESSAGE });
           }
         }
+
       },
       'CallExpression': function (call) {
         if (!validateScope(context.getScope())) return;
@@ -119,10 +126,10 @@
         // keeping it simple: all 1-string-arg `require` calls are reported
         context.report({
           node: call.callee,
-          message: IMPORT_MESSAGE
-        });
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1jb21tb25qcy5qcyJdLCJuYW1lcyI6WyJFWFBPUlRfTUVTU0FHRSIsIklNUE9SVF9NRVNTQUdFIiwibm9ybWFsaXplTGVnYWN5T3B0aW9ucyIsIm9wdGlvbnMiLCJpbmRleE9mIiwiYWxsb3dQcmltaXRpdmVNb2R1bGVzIiwiYWxsb3dQcmltaXRpdmUiLCJub2RlIiwicGFyZW50IiwidHlwZSIsInJpZ2h0IiwiYWxsb3dSZXF1aXJlIiwiYWxsb3dDb25kaXRpb25hbFJlcXVpcmUiLCJ2YWxpZGF0ZVNjb3BlIiwic2NvcGUiLCJ2YXJpYWJsZVNjb3BlIiwiaXNDb25kaXRpb25hbCIsInNjaGVtYVN0cmluZyIsImVudW0iLCJzY2hlbWFPYmplY3QiLCJwcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJhbnlPZiIsIml0ZW1zIiwiYWRkaXRpb25hbEl0ZW1zIiwiY3JlYXRlIiwiY29udGV4dCIsIm9iamVjdCIsIm5hbWUiLCJwcm9wZXJ0eSIsInJlcG9ydCIsIm1lc3NhZ2UiLCJpc0luU2NvcGUiLCJnZXRTY29wZSIsInZhcmlhYmxlcyIsInNvbWUiLCJ2YXJpYWJsZSIsImNhbGwiLCJjYWxsZWUiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ2YWx1ZSJdLCJtYXBwaW5ncyI6Ijs7QUFLQTs7Ozs7O0FBRUEsTUFBTUEsaUJBQWlCLHVDQUF2QjtBQUFBLE1BQ01DLGlCQUFpQiwwQ0FEdkIsQyxDQVBBOzs7OztBQVVBLFNBQVNDLHNCQUFULENBQWdDQyxPQUFoQyxFQUF5QztBQUN2QyxNQUFJQSxRQUFRQyxPQUFSLENBQWdCLHlCQUFoQixLQUE4QyxDQUFsRCxFQUFxRDtBQUNuRCxXQUFPLEVBQUVDLHVCQUF1QixJQUF6QixFQUFQO0FBQ0Q7QUFDRCxTQUFPRixRQUFRLENBQVIsS0FBYyxFQUFyQjtBQUNEOztBQUVELFNBQVNHLGNB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Y0FBakIsRUFBZjtBQUNEO0FBQ0Y7QUFFRixPQXBCSTtBQXFCTCx3QkFBa0IsVUFBVTJDLElBQVYsRUFBZ0I7QUFDaEMsWUFBSSxDQUFDOUIsY0FBY21CLFFBQVFPLFFBQVIsRUFBZCxDQUFMLEVBQXdDOztBQUV4QyxZQUFJSSxLQUFLQyxNQUFMLENBQVluQyxJQUFaLEtBQXFCLFlBQXpCLEVBQXVDO0FBQ3ZDLFlBQUlrQyxLQUFLQyxNQUFMLENBQVlWLElBQVosS0FBcUIsU0FBekIsRUFBb0M7O0FBRXBDLFlBQUlTLEtBQUtFLFNBQUwsQ0FBZUMsTUFBZixLQUEwQixDQUE5QixFQUFpQztBQUNqQyxZQUFJeEIsU0FBU3FCLEtBQUtFLFNBQUwsQ0FBZSxDQUFmLENBQWI7O0FBRUEsWUFBSXZCLE9BQU9iLElBQVAsS0FBZ0IsU0FBcEIsRUFBK0I7QUFDL0IsWUFBSSxPQUFPYSxPQUFPeUIsS0FBZCxLQUF3QixRQUE1QixFQUFzQzs7QUFFdEMsWUFBSXBDLGFBQWFnQyxJQUFiLEVBQW1CeEMsT0FBbkIsQ0FBSixFQUFpQzs7QUFFakMsWUFBSVMsd0JBQXdCK0IsSUFBeEIsRUFBOEJ4QyxPQUE5QixLQUEwQ2EsY0FBYzJCLEtBQUtuQyxNQUFuQixDQUE5QyxFQUEwRTs7QUFFMUU7QUFDQXdCLGdCQUFRSSxNQUFSLENBQWU7QUFDYjdCLGdCQUFNb0MsS0FBS0MsTUFERTtBQUViUCxtQkFBU3BDO0FBRkksU0FBZjtBQUlEO0FBMUNJLEtBQVA7QUE2Q0Q7QUF2RWMsQ0FBakIiLCJmaWxlIjoibm8tY29tbW9uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgUnVsZSB0byBwcmVmZXIgRVM2IHRvIENKU1xuICogQGF1dGhvciBKYW11bmQgRmVyZ3Vzb25cbiAqL1xuXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5jb25zdCBFWFBPUlRfTUVTU0FHRSA9ICdFeHBlY3RlZCBcImV4cG9ydFwiIG9yIFwiZXhwb3J0IGRlZmF1bHRcIidcbiAgICAsIElNUE9SVF9NRVNTQUdFID0gJ0V4cGVjdGVkIFwiaW1wb3J0XCIgaW5zdGVhZCBvZiBcInJlcXVpcmUoKVwiJ1xuXG5mdW5jdGlvbiBub3JtYWxpemVMZWdhY3lPcHRpb25zKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuaW5kZXhPZignYWxsb3ctcHJpbWl0aXZlLW1vZHVsZXMnKSA+PSAwKSB7XG4gICAgcmV0dXJuIHsgYWxsb3dQcmltaXRpdmVNb2R1bGVzOiB0cnVlIH1cbiAgfVxuICByZXR1cm4gb3B0aW9uc1swXSB8fCB7fVxufVxuXG5mdW5jdGlvbiBhbGxvd1ByaW1pdGl2ZShub2RlLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucy5hbGxvd1ByaW1pdGl2ZU1vZHVsZXMpIHJldHVybiBmYWxzZVxuICBpZiAobm9kZS5wYXJlbnQudHlwZSAhPT0gJ0Fzc2lnbm1lbnRFeHByZXNzaW9uJykgcmV0dXJuIGZhbHNlXG4gIHJldHVybiAobm9kZS5wYXJlbnQucmlnaHQudHlwZSAhPT0gJ09iamVjdEV4cHJlc3Npb24nKVxufVxuXG5mdW5jdGlvbiBhbGxvd1JlcXVpcmUobm9kZSwgb3B0aW9ucykge1xuICByZXR1cm4gb3B0aW9ucy5hbGxvd1JlcXVpcmVcbn1cblxuZnVuY3Rpb24gYWxsb3dDb25kaXRpb25hbFJlcXVpcmUobm9kZSwgb3B0aW9ucykge1xuICByZXR1cm4gb3B0aW9ucy5hbGxvd0NvbmRpdGlvbmFsUmVxdWlyZSAhPT0gZmFsc2Vcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTY29wZShzY29wZSkge1xuICByZXR1cm4gc2NvcGUudmFyaWFibGVTY29wZS50eXBlID09PSAnbW9kdWxlJ1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXN0cmVlL2VzdHJlZS9ibG9iL21hc3Rlci9lczUubWRcbmZ1bmN0aW9uIGlzQ29uZGl0aW9uYWwobm9kZSkge1xuICBpZiAoXG4gICAgbm9kZS50eXBlID09PSAnSWZTdGF0ZW1lbnQnXG4gICAgfHwgbm9kZS50eXBlID09PSAnVHJ5U3RhdGVtZW50J1xuICAgIHx8IG5vZGUudHlwZSA9PT0gJ0xvZ2ljYWxFeHByZXNzaW9uJ1xuICAgIHx8IG5vZGUudHlwZSA9PT0gJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbidcbiAgKSByZXR1cm4gdHJ1ZVxuICBpZiAobm9kZS5wYXJlbnQpIHJldHVybiBpc0NvbmRpdGlvbmFsKG5vZGUucGFyZW50KVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJ1bGUgRGVmaW5pdGlvblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3Qgc2NoZW1hU3RyaW5nID0geyBlbnVtOiBbJ2FsbG93LXByaW1pdGl2ZS1tb2R1bGVzJ10gfVxuY29uc3Qgc2NoZW1hT2JqZWN0ID0ge1xuICB0eXBlOiAnb2JqZWN0JyxcbiAgcHJvcGVydGllczoge1xuICAgIGFsbG93UHJpbWl0aXZlTW9kdWxlczogeyAndHlwZSc6ICdib29sZWFuJyB9LFxuICAgIGFsbG93UmVxdWlyZTogeyAndHlwZSc6ICdib29sZWFuJyB9LFxuICAgIGFsbG93Q29uZGl0aW9uYWxSZXF1aXJlOiB7ICd0eXBlJzogJ2Jvb2xlYW4nIH0sXG4gIH0sXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1jb21tb25qcycpLFxuICAgIH0sXG5cbiAgICBzY2hlbWE6IHtcbiAgICAgIGFueU9mOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiBbc2NoZW1hU3RyaW5nXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW3NjaGVtYU9iamVjdF0sXG4gICAgICAgICAgYWRkaXRpb25hbEl0ZW1zOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IG5vcm1hbGl6ZUxlZ2FjeU9wdGlvbnMoY29udGV4dC5vcHRpb25zKVxuXG4gICAgcmV0dXJuIHtcblxuICAgICAgJ01lbWJlckV4cHJlc3Npb24nOiBmdW5jdGlvbiAobm9kZSkge1xuXG4gICAgICAgIC8vIG1vZHVsZS5leHBvcnRzXG4gICAgICAgIGlmIChub2RlLm9iamVjdC5uYW1lID09PSAnbW9kdWxlJyAmJiBub2RlLnByb3BlcnR5Lm5hbWUgPT09ICdleHBvcnRzJykge1xuICAgICAgICAgIGlmIChhbGxvd1ByaW1pdGl2ZShub2RlLCBvcHRpb25zKSkgcmV0dXJuXG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlOiBFWFBPUlRfTUVTU0FHRSB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXhwb3J0cy5cbiAgICAgICAgaWYgKG5vZGUub2JqZWN0Lm5hbWUgPT09ICdleHBvcnRzJykge1xuICAgICAgICAgIGNvbnN0IGlzSW5TY29wZSA9IGNvbnRleHQuZ2V0U2NvcGUoKVxuICAgICAgICAgICAgLnZhcmlhYmxlc1xuICAgICAgICAgICAgLnNvbWUodmFyaWFibGUgPT4gdmFyaWFibGUubmFtZSA9PT0gJ2V4cG9ydHMnKVxuICAgICAgICAgIGlmICghIGlzSW5TY29wZSkge1xuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlOiBFWFBPUlRfTUVTU0FHRSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9LFxuICAgICAgJ0NhbGxFeHByZXNzaW9uJzogZnVuY3Rpb24gKGNhbGwpIHtcbiAgICAgICAgaWYgKCF2YWxpZGF0ZVNjb3BlKGNvbnRleHQuZ2V0U2NvcGUoKSkpIHJldHVyblxuXG4gICAgICAgIGlmIChjYWxsLmNhbGxlZS50eXBlICE9PSAnSWRlbnRpZmllcicpIHJldHVyblxuICAgICAgICBpZiAoY2FsbC5jYWxsZWUubmFtZSAhPT0gJ3JlcXVpcmUnKSByZXR1cm5cblxuICAgICAgICBpZiAoY2FsbC5hcmd1bWVudHMubGVuZ3RoICE9PSAxKSByZXR1cm5cbiAgICAgICAgdmFyIG1vZHVsZSA9IGNhbGwuYXJndW1lbnRzWzBdXG5cbiAgICAgICAgaWYgKG1vZHVsZS50eXBlICE9PSAnTGl0ZXJhbCcpIHJldHVyblxuICAgICAgICBpZiAodHlwZW9mIG1vZHVsZS52YWx1ZSAhPT0gJ3N0cmluZycpIHJldHVyblxuXG4gICAgICAgIGlmIChhbGxvd1JlcXVpcmUoY2FsbCwgb3B0aW9ucykpIHJldHVyblxuXG4gICAgICAgIGlmIChhbGxvd0NvbmRpdGlvbmFsUmVxdWlyZShjYWxsLCBvcHRpb25zKSAmJiBpc0NvbmRpdGlvbmFsKGNhbGwucGFyZW50KSkgcmV0dXJuXG5cbiAgICAgICAgLy8ga2VlcGluZyBpdCBzaW1wbGU6IGFsbCAxLXN0cmluZy1hcmcgYHJlcXVpcmVgIGNhbGxzIGFyZSByZXBvcnRlZFxuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZTogY2FsbC5jYWxsZWUsXG4gICAgICAgICAgbWVzc2FnZTogSU1QT1JUX01FU1NBR0UsXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgIH1cblxuICB9LFxufVxuIl19
\ No newline at end of file
+          message: IMPORT_MESSAGE });
+
+      } };
+
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1jb21tb25qcy5qcyJdLCJuYW1lcyI6WyJFWFBPUlRfTUVTU0FHRSIsIklNUE9SVF9NRVNTQUdFIiwibm9ybWFsaXplTGVnYWN5T3B0aW9ucyIsIm9wdGlvbnMiLCJpbmRleE9mIiwiYWxsb3dQcmltaXRpdmVNb2R1bGVzIiwiYWxsb3dQcmltaXRpdmUiLCJub2RlIiwicGFyZW50IiwidHlwZSIsInJpZ2h0IiwiYWxsb3dSZXF1aXJlIiwiYWxsb3dDb25kaXRpb25hbFJlcXVpcmUiLCJ2YWxpZGF0ZVNjb3BlIiwic2NvcGUiLCJ2YXJpYWJsZVNjb3BlIiwiaXNDb25kaXRpb25hbCIsInNjaGVtYVN0cmluZyIsImVudW0iLCJzY2hlbWFPYmplY3QiLCJwcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJhbnlPZiIsIml0ZW1zIiwiYWRkaXRpb25hbEl0ZW1zIiwiY3JlYXRlIiwiY29udGV4dCIsIm9iamVjdCIsIm5hbWUiLCJwcm9wZXJ0eSIsInJlcG9ydCIsIm1lc3NhZ2UiLCJpc0luU2NvcGUiLCJnZXRTY29wZSIsInZhcmlhYmxlcyIsInNvbWUiLCJ2YXJpYWJsZSIsImNhbGwiLCJjYWxsZWUiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ2YWx1ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSxxQzs7QUFFQSxNQUFNQSxpQkFBaUIsdUNBQXZCO0FBQ01DLGlCQUFpQiwwQ0FEdkIsQyxDQVBBOzs7Z0VBVUEsU0FBU0Msc0JBQVQsQ0FBZ0NDLE9BQWhDLEVBQXlDLENBQ3ZDLElBQUlBLFFBQVFDLE9BQVIsQ0FBZ0IseUJBQWhCLEtBQThDLENBQWxELEVBQXFEO0FBQ25ELFdBQU8sRUFBRUMsdUJBQXVCLElBQXpCLEVBQVA7QUFDRDtBQUNELFNBQU9GLFFBQVEsQ0FBUixLQUFjLEVBQXJCO0FBQ0Q7O0FBRUQsU0FBU0csY0FBVCxD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QVNyQyxjQUFqQixFQUFmO0FBQ0Q7QUFDRjs7QUFFRixPQXBCSTtBQXFCTCx3QkFBa0IsVUFBVTJDLElBQVYsRUFBZ0I7QUFDaEMsWUFBSSxDQUFDOUIsY0FBY21CLFFBQVFPLFFBQVIsRUFBZCxDQUFMLEVBQXdDOztBQUV4QyxZQUFJSSxLQUFLQyxNQUFMLENBQVluQyxJQUFaLEtBQXFCLFlBQXpCLEVBQXVDO0FBQ3ZDLFlBQUlrQyxLQUFLQyxNQUFMLENBQVlWLElBQVosS0FBcUIsU0FBekIsRUFBb0M7O0FBRXBDLFlBQUlTLEtBQUtFLFNBQUwsQ0FBZUMsTUFBZixLQUEwQixDQUE5QixFQUFpQztBQUNqQyxZQUFJeEIsU0FBU3FCLEtBQUtFLFNBQUwsQ0FBZSxDQUFmLENBQWI7O0FBRUEsWUFBSXZCLE9BQU9iLElBQVAsS0FBZ0IsU0FBcEIsRUFBK0I7QUFDL0IsWUFBSSxPQUFPYSxPQUFPeUIsS0FBZCxLQUF3QixRQUE1QixFQUFzQzs7QUFFdEMsWUFBSXBDLGFBQWFnQyxJQUFiLEVBQW1CeEMsT0FBbkIsQ0FBSixFQUFpQzs7QUFFakMsWUFBSVMsd0JBQXdCK0IsSUFBeEIsRUFBOEJ4QyxPQUE5QixLQUEwQ2EsY0FBYzJCLEtBQUtuQyxNQUFuQixDQUE5QyxFQUEwRTs7QUFFMUU7QUFDQXdCLGdCQUFRSSxNQUFSLENBQWU7QUFDYjdCLGdCQUFNb0MsS0FBS0MsTUFERTtBQUViUCxtQkFBU3BDLGNBRkksRUFBZjs7QUFJRCxPQTFDSSxFQUFQOzs7QUE2Q0QsR0F2RWMsRUFBakIiLCJmaWxlIjoibm8tY29tbW9uanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgUnVsZSB0byBwcmVmZXIgRVM2IHRvIENKU1xuICogQGF1dGhvciBKYW11bmQgRmVyZ3Vzb25cbiAqL1xuXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5jb25zdCBFWFBPUlRfTUVTU0FHRSA9ICdFeHBlY3RlZCBcImV4cG9ydFwiIG9yIFwiZXhwb3J0IGRlZmF1bHRcIidcbiAgICAsIElNUE9SVF9NRVNTQUdFID0gJ0V4cGVjdGVkIFwiaW1wb3J0XCIgaW5zdGVhZCBvZiBcInJlcXVpcmUoKVwiJ1xuXG5mdW5jdGlvbiBub3JtYWxpemVMZWdhY3lPcHRpb25zKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuaW5kZXhPZignYWxsb3ctcHJpbWl0aXZlLW1vZHVsZXMnKSA+PSAwKSB7XG4gICAgcmV0dXJuIHsgYWxsb3dQcmltaXRpdmVNb2R1bGVzOiB0cnVlIH1cbiAgfVxuICByZXR1cm4gb3B0aW9uc1swXSB8fCB7fVxufVxuXG5mdW5jdGlvbiBhbGxvd1ByaW1pdGl2ZShub2RlLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucy5hbGxvd1ByaW1pdGl2ZU1vZHVsZXMpIHJldHVybiBmYWxzZVxuICBpZiAobm9kZS5wYXJlbnQudHlwZSAhPT0gJ0Fzc2lnbm1lbnRFeHByZXNzaW9uJykgcmV0dXJuIGZhbHNlXG4gIHJldHVybiAobm9kZS5wYXJlbnQucmlnaHQudHlwZSAhPT0gJ09iamVjdEV4cHJlc3Npb24nKVxufVxuXG5mdW5jdGlvbiBhbGxvd1JlcXVpcmUobm9kZSwgb3B0aW9ucykge1xuICByZXR1cm4gb3B0aW9ucy5hbGxvd1JlcXVpcmVcbn1cblxuZnVuY3Rpb24gYWxsb3dDb25kaXRpb25hbFJlcXVpcmUobm9kZSwgb3B0aW9ucykge1xuICByZXR1cm4gb3B0aW9ucy5hbGxvd0NvbmRpdGlvbmFsUmVxdWlyZSAhPT0gZmFsc2Vcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTY29wZShzY29wZSkge1xuICByZXR1cm4gc2NvcGUudmFyaWFibGVTY29wZS50eXBlID09PSAnbW9kdWxlJ1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXN0cmVlL2VzdHJlZS9ibG9iL21hc3Rlci9lczUubWRcbmZ1bmN0aW9uIGlzQ29uZGl0aW9uYWwobm9kZSkge1xuICBpZiAoXG4gICAgbm9kZS50eXBlID09PSAnSWZTdGF0ZW1lbnQnXG4gICAgfHwgbm9kZS50eXBlID09PSAnVHJ5U3RhdGVtZW50J1xuICAgIHx8IG5vZGUudHlwZSA9PT0gJ0xvZ2ljYWxFeHByZXNzaW9uJ1xuICAgIHx8IG5vZGUudHlwZSA9PT0gJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbidcbiAgKSByZXR1cm4gdHJ1ZVxuICBpZiAobm9kZS5wYXJlbnQpIHJldHVybiBpc0NvbmRpdGlvbmFsKG5vZGUucGFyZW50KVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJ1bGUgRGVmaW5pdGlvblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3Qgc2NoZW1hU3RyaW5nID0geyBlbnVtOiBbJ2FsbG93LXByaW1pdGl2ZS1tb2R1bGVzJ10gfVxuY29uc3Qgc2NoZW1hT2JqZWN0ID0ge1xuICB0eXBlOiAnb2JqZWN0JyxcbiAgcHJvcGVydGllczoge1xuICAgIGFsbG93UHJpbWl0aXZlTW9kdWxlczogeyAndHlwZSc6ICdib29sZWFuJyB9LFxuICAgIGFsbG93UmVxdWlyZTogeyAndHlwZSc6ICdib29sZWFuJyB9LFxuICAgIGFsbG93Q29uZGl0aW9uYWxSZXF1aXJlOiB7ICd0eXBlJzogJ2Jvb2xlYW4nIH0sXG4gIH0sXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1jb21tb25qcycpLFxuICAgIH0sXG5cbiAgICBzY2hlbWE6IHtcbiAgICAgIGFueU9mOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiBbc2NoZW1hU3RyaW5nXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW3NjaGVtYU9iamVjdF0sXG4gICAgICAgICAgYWRkaXRpb25hbEl0ZW1zOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IG5vcm1hbGl6ZUxlZ2FjeU9wdGlvbnMoY29udGV4dC5vcHRpb25zKVxuXG4gICAgcmV0dXJuIHtcblxuICAgICAgJ01lbWJlckV4cHJlc3Npb24nOiBmdW5jdGlvbiAobm9kZSkge1xuXG4gICAgICAgIC8vIG1vZHVsZS5leHBvcnRzXG4gICAgICAgIGlmIChub2RlLm9iamVjdC5uYW1lID09PSAnbW9kdWxlJyAmJiBub2RlLnByb3BlcnR5Lm5hbWUgPT09ICdleHBvcnRzJykge1xuICAgICAgICAgIGlmIChhbGxvd1ByaW1pdGl2ZShub2RlLCBvcHRpb25zKSkgcmV0dXJuXG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlOiBFWFBPUlRfTUVTU0FHRSB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXhwb3J0cy5cbiAgICAgICAgaWYgKG5vZGUub2JqZWN0Lm5hbWUgPT09ICdleHBvcnRzJykge1xuICAgICAgICAgIGNvbnN0IGlzSW5TY29wZSA9IGNvbnRleHQuZ2V0U2NvcGUoKVxuICAgICAgICAgICAgLnZhcmlhYmxlc1xuICAgICAgICAgICAgLnNvbWUodmFyaWFibGUgPT4gdmFyaWFibGUubmFtZSA9PT0gJ2V4cG9ydHMnKVxuICAgICAgICAgIGlmICghIGlzSW5TY29wZSkge1xuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlOiBFWFBPUlRfTUVTU0FHRSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9LFxuICAgICAgJ0NhbGxFeHByZXNzaW9uJzogZnVuY3Rpb24gKGNhbGwpIHtcbiAgICAgICAgaWYgKCF2YWxpZGF0ZVNjb3BlKGNvbnRleHQuZ2V0U2NvcGUoKSkpIHJldHVyblxuXG4gICAgICAgIGlmIChjYWxsLmNhbGxlZS50eXBlICE9PSAnSWRlbnRpZmllcicpIHJldHVyblxuICAgICAgICBpZiAoY2FsbC5jYWxsZWUubmFtZSAhPT0gJ3JlcXVpcmUnKSByZXR1cm5cblxuICAgICAgICBpZiAoY2FsbC5hcmd1bWVudHMubGVuZ3RoICE9PSAxKSByZXR1cm5cbiAgICAgICAgdmFyIG1vZHVsZSA9IGNhbGwuYXJndW1lbnRzWzBdXG5cbiAgICAgICAgaWYgKG1vZHVsZS50eXBlICE9PSAnTGl0ZXJhbCcpIHJldHVyblxuICAgICAgICBpZiAodHlwZW9mIG1vZHVsZS52YWx1ZSAhPT0gJ3N0cmluZycpIHJldHVyblxuXG4gICAgICAgIGlmIChhbGxvd1JlcXVpcmUoY2FsbCwgb3B0aW9ucykpIHJldHVyblxuXG4gICAgICAgIGlmIChhbGxvd0NvbmRpdGlvbmFsUmVxdWlyZShjYWxsLCBvcHRpb25zKSAmJiBpc0NvbmRpdGlvbmFsKGNhbGwucGFyZW50KSkgcmV0dXJuXG5cbiAgICAgICAgLy8ga2VlcGluZyBpdCBzaW1wbGU6IGFsbCAxLXN0cmluZy1hcmcgYHJlcXVpcmVgIGNhbGxzIGFyZSByZXBvcnRlZFxuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZTogY2FsbC5jYWxsZWUsXG4gICAgICAgICAgbWVzc2FnZTogSU1QT1JUX01FU1NBR0UsXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgIH1cblxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-cycle.js b/node_modules/eslint-plugin-import/lib/rules/no-cycle.js
index 0327673..84d0525 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-cycle.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-cycle.js
@@ -1,23 +1,12 @@
-'use strict';
+'use strict';var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}(); /**
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       * @fileOverview Ensures that no imported module imports the linted module.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       * @author Ben Mosher
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       */
 
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); /**
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @fileOverview Ensures that no imported module imports the linted module.
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author Ben Mosher
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
-
-var _ExportMap = require('../ExportMap');
-
-var _ExportMap2 = _interopRequireDefault(_ExportMap);
-
-var _moduleVisitor = require('eslint-module-utils/moduleVisitor');
-
-var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _ExportMap = require('../ExportMap');var _ExportMap2 = _interopRequireDefault(_ExportMap);
+var _importType = require('../core/importType');
+var _moduleVisitor = require('eslint-module-utils/moduleVisitor');var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 // todo: cache cycles / deep relationships for faster repeat evaluation
 module.exports = {
@@ -26,21 +15,39 @@
     docs: { url: (0, _docsUrl2.default)('no-cycle') },
     schema: [(0, _moduleVisitor.makeOptionsSchema)({
       maxDepth: {
-        description: 'maximum dependency depth to traverse',
-        type: 'integer',
-        minimum: 1
-      }
-    })]
-  },
+        oneOf: [
+        {
+          description: 'maximum dependency depth to traverse',
+          type: 'integer',
+          minimum: 1 },
+
+        {
+          enum: ['∞'],
+          type: 'string' }] },
+
+
+
+      ignoreExternal: {
+        description: 'ignore external modules',
+        type: 'boolean',
+        default: false } })] },
+
+
+
 
   create: function (context) {
     const myPath = context.getFilename();
     if (myPath === '<text>') return {}; // can't cycle-check a non-file
 
     const options = context.options[0] || {};
-    const maxDepth = options.maxDepth || Infinity;
+    const maxDepth = typeof options.maxDepth === 'number' ? options.maxDepth : Infinity;
+    const ignoreModule = name => options.ignoreExternal ? (0, _importType.isExternalModule)(name) : false;
 
     function checkSourceValue(sourceNode, importer) {
+      if (ignoreModule(sourceNode.value)) {
+        return; // ignore external modules
+      }
+
       const imported = _ExportMap2.default.get(sourceNode.value, context);
 
       if (importer.importKind === 'type') {
@@ -57,30 +64,21 @@
 
       const untraversed = [{ mget: () => imported, route: [] }];
       const traversed = new Set();
-      function detectCycle(_ref) {
-        let mget = _ref.mget,
-            route = _ref.route;
-
+      function detectCycle(_ref) {let mget = _ref.mget,route = _ref.route;
         const m = mget();
         if (m == null) return;
         if (traversed.has(m.path)) return;
         traversed.add(m.path);
 
-        for (let _ref2 of m.imports) {
-          var _ref3 = _slicedToArray(_ref2, 2);
-
-          let path = _ref3[0];
-          var _ref3$ = _ref3[1];
-          let getter = _ref3$.getter;
-          let source = _ref3$.source;
-
+        for (let _ref2 of m.imports) {var _ref3 = _slicedToArray(_ref2, 2);let path = _ref3[0];var _ref3$ = _ref3[1];let getter = _ref3$.getter;let source = _ref3$.source;
           if (path === myPath) return true;
           if (traversed.has(path)) continue;
+          if (ignoreModule(source.value)) continue;
           if (route.length + 1 < maxDepth) {
             untraversed.push({
               mget: getter,
-              route: route.concat(source)
-            });
+              route: route.concat(source) });
+
           }
         }
       }
@@ -88,7 +86,9 @@
       while (untraversed.length > 0) {
         const next = untraversed.shift(); // bfs!
         if (detectCycle(next)) {
-          const message = next.route.length > 0 ? `Dependency cycle via ${routeString(next.route)}` : 'Dependency cycle detected.';
+          const message = next.route.length > 0 ?
+          `Dependency cycle via ${routeString(next.route)}` :
+          'Dependency cycle detected.';
           context.report(importer, message);
           return;
         }
@@ -96,10 +96,10 @@
     }
 
     return (0, _moduleVisitor2.default)(checkSourceValue, context.options[0]);
-  }
-};
+  } };
+
 
 function routeString(route) {
   return route.map(s => `${s.value}:${s.loc.start.line}`).join('=>');
 }
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1jeWNsZS5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwibWF4RGVwdGgiLCJkZXNjcmlwdGlvbiIsIm1pbmltdW0iLCJjcmVhdGUiLCJjb250ZXh0IiwibXlQYXRoIiwiZ2V0RmlsZW5hbWUiLCJvcHRpb25zIiwiSW5maW5pdHkiLCJjaGVja1NvdXJjZVZhbHVlIiwic291cmNlTm9kZSIsImltcG9ydGVyIiwiaW1wb3J0ZWQiLCJFeHBvcnRzIiwiZ2V0IiwidmFsdWUiLCJpbXBvcnRLaW5kIiwicGF0aCIsInVudHJhdmVyc2VkIiwibWdldCIsInJvdXRlIiwidHJhdmVyc2VkIiwiU2V0IiwiZGV0ZWN0Q3ljbGUiLCJtIiwiaGFzIiwiYWRkIiwiaW1wb3J0cyIsImdldHRlciIsInNvdXJjZSIsImxlbmd0aCIsInB1c2giLCJjb25jYXQiLCJuZXh0Iiwic2hpZnQiLCJtZXNzYWdlIiwicm91dGVTdHJpbmciLCJyZXBvcnQiLCJtYXAiLCJzIiwibG9jIiwic3RhcnQiLCJsaW5lIiwiam9pbiJdLCJtYXBwaW5ncyI6Ijs7eXBCQUFBOzs7OztBQUtBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUE7QUFDQUEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNLEVBQUVDLEtBQUssdUJBQVEsVUFBUixDQUFQLEVBRkY7QUFHSkMsWUFBUSxDQUFDLHNDQUFrQjtBQUN6QkMsZ0JBQVM7QUFDUEMscUJBQWEsc0NBRE47QUFFUEwsY0FBTSxTQUZDO0FBR1BNLGlCQUFTO0FBSEY7QUFEZ0IsS0FBbEIsQ0FBRDtBQUhKLEdBRFM7O0FBYWZDLFVBQVEsVUFBVUMsT0FBVixFQUFtQjtBQUN6QixVQUFNQyxTQUFTRCxRQUFRRSxXQUFSLEVBQWY7QUFDQSxRQUFJRCxXQUFXLFFBQWYsRUFBeUIsT0FBTyxFQUFQLENBRkEsQ0FFVTs7QUFFbkMsVUFBTUUsVUFBVUgsUUFBUUcsT0FBUixDQUFnQixDQUFoQixLQUFzQixFQUF0QztBQUNBLFVBQU1QLFdBQVdPLFFBQVFQLFFBQVIsSUFBb0JRLFFBQXJDOztBQUVBLGFBQVNDLGdCQUFULENBQTBCQyxVQUExQixFQUFzQ0MsUUFBdEMsRUFBZ0Q7QUFDOUMsWUFBTUMsV0FBV0Msb0JBQVFDLEdBQVIsQ0FBWUosV0FBV0ssS0FBdkIsRUFBOEJYLE9BQTlCLENBQWpCOztBQUVBLFVBQUlPLFNBQVNLLFVBQVQsS0FBd0IsTUFBNUIsRUFBb0M7QUFDbEMsZUFEa0MsQ0FDM0I7QUFDUjs7QUFFRCxVQUFJSixZQUFZLElBQWhCLEVBQXNCO0FBQ3BCLGVBRG9CLENBQ1o7QUFDVDs7QUFFRCxVQUFJQSxTQUFTSyxJQUFULEtBQWtCWixNQUF0QixFQUE4QjtBQUM1QixlQUQ0QixDQUNwQjtBQUNUOztBQUVELFlBQU1hLGNBQWMsQ0FBQyxFQUFDQyxNQUFNLE1BQU1QLFFBQWIsRUFBdUJRLE9BQU0sRUFBN0IsRUFBRCxDQUFwQjtBQUNBLFlBQU1DLFlBQVksSUFBSUMsR0FBSixFQUFsQjtBQUNBLGVBQVNDLFdBQVQsT0FBb0M7QUFBQSxZQUFkSixJQUFjLFFBQWRBLElBQWM7QUFBQSxZQUFSQyxLQUFRLFFBQVJBLEtBQVE7O0FBQ2xDLGNBQU1JLElBQUlMLE1BQVY7QUFDQSxZQUFJSyxLQUFLLElBQVQsRUFBZTtBQUNmLFlBQUlILFVBQVVJLEdBQVYsQ0FBY0QsRUFBRVAsSUFBaEIsQ0FBSixFQUEyQjtBQUMzQkksa0JBQVVLLEdBQVYsQ0FBY0YsRUFBRVAsSUFBaEI7O0FBRUEsMEJBQXVDTyxFQUFFRyxPQUF6QyxFQUFrRDtBQUFBOztBQUFBLGNBQXhDVixJQUF3QztBQUFBO0FBQUEsY0FBaENXLE1BQWdDLFVBQWhDQSxNQUFnQztBQUFBLGNBQXhCQyxNQUF3QixVQUF4QkEsTUFBd0I7O0FBQ2hELGNBQUlaLFNBQVNaLE1BQWIsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLGNBQUlnQixVQUFVSSxHQUFWLENBQWNSLElBQWQsQ0FBSixFQUF5QjtBQUN6QixjQUFJRyxNQUFNVSxNQUFOLEdBQWUsQ0FBZixHQUFtQjlCLFFBQXZCLEVBQWlDO0FBQy9Ca0Isd0JBQVlhLElBQVosQ0FBaUI7QUFDZlosb0JBQU1TLE1BRFM7QUFFZlIscUJBQU9BLE1BQU1ZLE1BQU4sQ0FBYUgsTUFBYjtBQUZRLGFBQWpCO0FBSUQ7QUFDRjtBQUNGOztBQUVELGFBQU9YLFlBQVlZLE1BQVosR0FBcUIsQ0FBNUIsRUFBK0I7QUFDN0IsY0FBTUcsT0FBT2YsWUFBWWdCLEtBQVosRUFBYixDQUQ2QixDQUNJO0FBQ2pDLFlBQUlYLFlBQVlVLElBQVosQ0FBSixFQUF1QjtBQUNyQixnQkFBTUUsVUFBV0YsS0FBS2IsS0FBTCxDQUFXVSxNQUFYLEdBQW9CLENBQXBCLEdBQ1osd0JBQXVCTSxZQUFZSCxLQUFLYixLQUFqQixDQUF3QixFQURuQyxHQUViLDRCQUZKO0FBR0FoQixrQkFBUWlDLE1BQVIsQ0FBZTFCLFFBQWYsRUFBeUJ3QixPQUF6QjtBQUNBO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFdBQU8sNkJBQWMxQixnQkFBZCxFQUFnQ0wsUUFBUUcsT0FBUixDQUFnQixDQUFoQixDQUFoQyxDQUFQO0FBQ0Q7QUFwRWMsQ0FBakI7O0FBdUVBLFNBQVM2QixXQUFULENBQXFCaEIsS0FBckIsRUFBNEI7QUFDMUIsU0FBT0EsTUFBTWtCLEdBQU4sQ0FBVUMsS0FBTSxHQUFFQSxFQUFFeEIsS0FBTSxJQUFHd0IsRUFBRUMsR0FBRixDQUFNQyxLQUFOLENBQVlDLElBQUssRUFBOUMsRUFBaURDLElBQWpELENBQXNELElBQXRELENBQVA7QUFDRCIsImZpbGUiOiJuby1jeWNsZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVPdmVydmlldyBFbnN1cmVzIHRoYXQgbm8gaW1wb3J0ZWQgbW9kdWxlIGltcG9ydHMgdGhlIGxpbnRlZCBtb2R1bGUuXG4gKiBAYXV0aG9yIEJlbiBNb3NoZXJcbiAqL1xuXG5pbXBvcnQgRXhwb3J0cyBmcm9tICcuLi9FeHBvcnRNYXAnXG5pbXBvcnQgbW9kdWxlVmlzaXRvciwgeyBtYWtlT3B0aW9uc1NjaGVtYSB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvbW9kdWxlVmlzaXRvcidcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbi8vIHRvZG86IGNhY2hlIGN5Y2xlcyAvIGRlZXAgcmVsYXRpb25zaGlwcyBmb3IgZmFzdGVyIHJlcGVhdCBldmFsdWF0aW9uXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7IHVybDogZG9jc1VybCgnbm8tY3ljbGUnKSB9LFxuICAgIHNjaGVtYTogW21ha2VPcHRpb25zU2NoZW1hKHtcbiAgICAgIG1heERlcHRoOntcbiAgICAgICAgZGVzY3JpcHRpb246ICdtYXhpbXVtIGRlcGVuZGVuY3kgZGVwdGggdG8gdHJhdmVyc2UnLFxuICAgICAgICB0eXBlOiAnaW50ZWdlcicsXG4gICAgICAgIG1pbmltdW06IDEsXG4gICAgICB9LFxuICAgIH0pXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgY29uc3QgbXlQYXRoID0gY29udGV4dC5nZXRGaWxlbmFtZSgpXG4gICAgaWYgKG15UGF0aCA9PT0gJzx0ZXh0PicpIHJldHVybiB7fSAvLyBjYW4ndCBjeWNsZS1jaGVjayBhIG5vbi1maWxlXG5cbiAgICBjb25zdCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHt9XG4gICAgY29uc3QgbWF4RGVwdGggPSBvcHRpb25zLm1heERlcHRoIHx8IEluZmluaXR5XG5cbiAgICBmdW5jdGlvbiBjaGVja1NvdXJjZVZhbHVlKHNvdXJjZU5vZGUsIGltcG9ydGVyKSB7XG4gICAgICBjb25zdCBpbXBvcnRlZCA9IEV4cG9ydHMuZ2V0KHNvdXJjZU5vZGUudmFsdWUsIGNvbnRleHQpXG5cbiAgICAgIGlmIChpbXBvcnRlci5pbXBvcnRLaW5kID09PSAndHlwZScpIHtcbiAgICAgICAgcmV0dXJuIC8vIG5vIEZsb3cgaW1wb3J0IHJlc29sdXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKGltcG9ydGVkID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICAvLyBuby11bnJlc29sdmVkIHRlcnJpdG9yeVxuICAgICAgfVxuXG4gICAgICBpZiAoaW1wb3J0ZWQucGF0aCA9PT0gbXlQYXRoKSB7XG4gICAgICAgIHJldHVybiAgLy8gbm8tc2VsZi1pbXBvcnQgdGVycml0b3J5XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVudHJhdmVyc2VkID0gW3ttZ2V0OiAoKSA9PiBpbXBvcnRlZCwgcm91dGU6W119XVxuICAgICAgY29uc3QgdHJhdmVyc2VkID0gbmV3IFNldCgpXG4gICAgICBmdW5jdGlvbiBkZXRlY3RDeWNsZSh7bWdldCwgcm91dGV9KSB7XG4gICAgICAgIGNvbnN0IG0gPSBtZ2V0KClcbiAgICAgICAgaWYgKG0gPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIGlmICh0cmF2ZXJzZWQuaGFzKG0ucGF0aCkpIHJldHVyblxuICAgICAgICB0cmF2ZXJzZWQuYWRkKG0ucGF0aClcblxuICAgICAgICBmb3IgKGxldCBbcGF0aCwgeyBnZXR0ZXIsIHNvdXJjZSB9XSBvZiBtLmltcG9ydHMpIHtcbiAgICAgICAgICBpZiAocGF0aCA9PT0gbXlQYXRoKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgIGlmICh0cmF2ZXJzZWQuaGFzKHBhdGgpKSBjb250aW51ZVxuICAgICAgICAgIGlmIChyb3V0ZS5sZW5ndGggKyAxIDwgbWF4RGVwdGgpIHtcbiAgICAgICAgICAgIHVudHJhdmVyc2VkLnB1c2goe1xuICAgICAgICAgICAgICBtZ2V0OiBnZXR0ZXIsXG4gICAgICAgICAgICAgIHJvdXRlOiByb3V0ZS5jb25jYXQoc291cmNlKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICh1bnRyYXZlcnNlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB1bnRyYXZlcnNlZC5zaGlmdCgpIC8vIGJmcyFcbiAgICAgICAgaWYgKGRldGVjdEN5Y2xlKG5leHQpKSB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IChuZXh0LnJvdXRlLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gYERlcGVuZGVuY3kgY3ljbGUgdmlhICR7cm91dGVTdHJpbmcobmV4dC5yb3V0ZSl9YFxuICAgICAgICAgICAgOiAnRGVwZW5kZW5jeSBjeWNsZSBkZXRlY3RlZC4nKVxuICAgICAgICAgIGNvbnRleHQucmVwb3J0KGltcG9ydGVyLCBtZXNzYWdlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZVZpc2l0b3IoY2hlY2tTb3VyY2VWYWx1ZSwgY29udGV4dC5vcHRpb25zWzBdKVxuICB9LFxufVxuXG5mdW5jdGlvbiByb3V0ZVN0cmluZyhyb3V0ZSkge1xuICByZXR1cm4gcm91dGUubWFwKHMgPT4gYCR7cy52YWx1ZX06JHtzLmxvYy5zdGFydC5saW5lfWApLmpvaW4oJz0+Jylcbn1cbiJdfQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1jeWNsZS5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwibWF4RGVwdGgiLCJvbmVPZiIsImRlc2NyaXB0aW9uIiwibWluaW11bSIsImVudW0iLCJpZ25vcmVFeHRlcm5hbCIsImRlZmF1bHQiLCJjcmVhdGUiLCJjb250ZXh0IiwibXlQYXRoIiwiZ2V0RmlsZW5hbWUiLCJvcHRpb25zIiwiSW5maW5pdHkiLCJpZ25vcmVNb2R1bGUiLCJuYW1lIiwiY2hlY2tTb3VyY2VWYWx1ZSIsInNvdXJjZU5vZGUiLCJpbXBvcnRlciIsInZhbHVlIiwiaW1wb3J0ZWQiLCJFeHBvcnRzIiwiZ2V0IiwiaW1wb3J0S2luZCIsInBhdGgiLCJ1bnRyYXZlcnNlZCIsIm1nZXQiLCJyb3V0ZSIsInRyYXZlcnNlZCIsIlNldCIsImRldGVjdEN5Y2xlIiwibSIsImhhcyIsImFkZCIsImltcG9ydHMiLCJnZXR0ZXIiLCJzb3VyY2UiLCJsZW5ndGgiLCJwdXNoIiwiY29uY2F0IiwibmV4dCIsInNoaWZ0IiwibWVzc2FnZSIsInJvdXRlU3RyaW5nIiwicmVwb3J0IiwibWFwIiwicyIsImxvYyIsInN0YXJ0IiwibGluZSIsImpvaW4iXSwibWFwcGluZ3MiOiJzb0JBQUE7Ozs7O0FBS0EseUM7QUFDQTtBQUNBLGtFO0FBQ0EscUM7O0FBRUE7QUFDQUEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNLEVBQUVDLEtBQUssdUJBQVEsVUFBUixDQUFQLEVBRkY7QUFHSkMsWUFBUSxDQUFDLHNDQUFrQjtBQUN6QkMsZ0JBQVU7QUFDUkMsZUFBTztBQUNMO0FBQ0VDLHVCQUFhLHNDQURmO0FBRUVOLGdCQUFNLFNBRlI7QUFHRU8sbUJBQVMsQ0FIWCxFQURLOztBQU1MO0FBQ0VDLGdCQUFNLENBQUMsR0FBRCxDQURSO0FBRUVSLGdCQUFNLFFBRlIsRUFOSyxDQURDLEVBRGU7Ozs7QUFjekJTLHNCQUFnQjtBQUNkSCxxQkFBYSx5QkFEQztBQUVkTixjQUFNLFNBRlE7QUFHZFUsaUJBQVMsS0FISyxFQWRTLEVBQWxCLENBQUQsQ0FISixFQURTOzs7OztBQTBCZkMsVUFBUSxVQUFVQyxPQUFWLEVBQW1CO0FBQ3pCLFVBQU1DLFNBQVNELFFBQVFFLFdBQVIsRUFBZjtBQUNBLFFBQUlELFdBQVcsUUFBZixFQUF5QixPQUFPLEVBQVAsQ0FGQSxDQUVVOztBQUVuQyxVQUFNRSxVQUFVSCxRQUFRRyxPQUFSLENBQWdCLENBQWhCLEtBQXNCLEVBQXRDO0FBQ0EsVUFBTVgsV0FBVyxPQUFPVyxRQUFRWCxRQUFmLEtBQTRCLFFBQTVCLEdBQXVDVyxRQUFRWCxRQUEvQyxHQUEwRFksUUFBM0U7QUFDQSxVQUFNQyxlQUFnQkMsSUFBRCxJQUFVSCxRQUFRTixjQUFSLEdBQXlCLGtDQUFpQlMsSUFBakIsQ0FBekIsR0FBa0QsS0FBakY7O0FBRUEsYUFBU0MsZ0JBQVQsQ0FBMEJDLFVBQTFCLEVBQXNDQyxRQUF0QyxFQUFnRDtBQUM5QyxVQUFJSixhQUFhRyxXQUFXRSxLQUF4QixDQUFKLEVBQW9DO0FBQ2xDLGVBRGtDLENBQzNCO0FBQ1I7O0FBRUQsWUFBTUMsV0FBV0Msb0JBQVFDLEdBQVIsQ0FBWUwsV0FBV0UsS0FBdkIsRUFBOEJWLE9BQTlCLENBQWpCOztBQUVBLFVBQUlTLFNBQVNLLFVBQVQsS0FBd0IsTUFBNUIsRUFBb0M7QUFDbEMsZUFEa0MsQ0FDM0I7QUFDUjs7QUFFRCxVQUFJSCxZQUFZLElBQWhCLEVBQXNCO0FBQ3BCLGVBRG9CLENBQ1o7QUFDVDs7QUFFRCxVQUFJQSxTQUFTSSxJQUFULEtBQWtCZCxNQUF0QixFQUE4QjtBQUM1QixlQUQ0QixDQUNwQjtBQUNUOztBQUVELFlBQU1lLGNBQWMsQ0FBQyxFQUFDQyxNQUFNLE1BQU1OLFFBQWIsRUFBdUJPLE9BQU0sRUFBN0IsRUFBRCxDQUFwQjtBQUNBLFlBQU1DLFlBQVksSUFBSUMsR0FBSixFQUFsQjtBQUNBLGVBQVNDLFdBQVQsT0FBb0MsS0FBZEosSUFBYyxRQUFkQSxJQUFjLENBQVJDLEtBQVEsUUFBUkEsS0FBUTtBQUNsQyxjQUFNSSxJQUFJTCxNQUFWO0FBQ0EsWUFBSUssS0FBSyxJQUFULEVBQWU7QUFDZixZQUFJSCxVQUFVSSxHQUFWLENBQWNELEVBQUVQLElBQWhCLENBQUosRUFBMkI7QUFDM0JJLGtCQUFVSyxHQUFWLENBQWNGLEVBQUVQLElBQWhCOztBQUVBLDBCQUF1Q08sRUFBRUcsT0FBekMsRUFBa0QsMENBQXhDVixJQUF3QyxzQ0FBaENXLE1BQWdDLFVBQWhDQSxNQUFnQyxLQUF4QkMsTUFBd0IsVUFBeEJBLE1BQXdCO0FBQ2hELGNBQUlaLFNBQVNkLE1BQWIsRUFBcUIsT0FBTyxJQUFQO0FBQ3JCLGNBQUlrQixVQUFVSSxHQUFWLENBQWNSLElBQWQsQ0FBSixFQUF5QjtBQUN6QixjQUFJVixhQUFhc0IsT0FBT2pCLEtBQXBCLENBQUosRUFBZ0M7QUFDaEMsY0FBSVEsTUFBTVUsTUFBTixHQUFlLENBQWYsR0FBbUJwQyxRQUF2QixFQUFpQztBQUMvQndCLHdCQUFZYSxJQUFaLENBQWlCO0FBQ2ZaLG9CQUFNUyxNQURTO0FBRWZSLHFCQUFPQSxNQUFNWSxNQUFOLENBQWFILE1BQWIsQ0FGUSxFQUFqQjs7QUFJRDtBQUNGO0FBQ0Y7O0FBRUQsYUFBT1gsWUFBWVksTUFBWixHQUFxQixDQUE1QixFQUErQjtBQUM3QixjQUFNRyxPQUFPZixZQUFZZ0IsS0FBWixFQUFiLENBRDZCLENBQ0k7QUFDakMsWUFBSVgsWUFBWVUsSUFBWixDQUFKLEVBQXVCO0FBQ3JCLGdCQUFNRSxVQUFXRixLQUFLYixLQUFMLENBQVdVLE1BQVgsR0FBb0IsQ0FBcEI7QUFDWixrQ0FBdUJNLFlBQVlILEtBQUtiLEtBQWpCLENBQXdCLEVBRG5DO0FBRWIsc0NBRko7QUFHQWxCLGtCQUFRbUMsTUFBUixDQUFlMUIsUUFBZixFQUF5QndCLE9BQXpCO0FBQ0E7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsV0FBTyw2QkFBYzFCLGdCQUFkLEVBQWdDUCxRQUFRRyxPQUFSLENBQWdCLENBQWhCLENBQWhDLENBQVA7QUFDRCxHQXZGYyxFQUFqQjs7O0FBMEZBLFNBQVMrQixXQUFULENBQXFCaEIsS0FBckIsRUFBNEI7QUFDMUIsU0FBT0EsTUFBTWtCLEdBQU4sQ0FBVUMsS0FBTSxHQUFFQSxFQUFFM0IsS0FBTSxJQUFHMkIsRUFBRUMsR0FBRixDQUFNQyxLQUFOLENBQVlDLElBQUssRUFBOUMsRUFBaURDLElBQWpELENBQXNELElBQXRELENBQVA7QUFDRCIsImZpbGUiOiJuby1jeWNsZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVPdmVydmlldyBFbnN1cmVzIHRoYXQgbm8gaW1wb3J0ZWQgbW9kdWxlIGltcG9ydHMgdGhlIGxpbnRlZCBtb2R1bGUuXG4gKiBAYXV0aG9yIEJlbiBNb3NoZXJcbiAqL1xuXG5pbXBvcnQgRXhwb3J0cyBmcm9tICcuLi9FeHBvcnRNYXAnXG5pbXBvcnQgeyBpc0V4dGVybmFsTW9kdWxlIH0gZnJvbSAnLi4vY29yZS9pbXBvcnRUeXBlJ1xuaW1wb3J0IG1vZHVsZVZpc2l0b3IsIHsgbWFrZU9wdGlvbnNTY2hlbWEgfSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL21vZHVsZVZpc2l0b3InXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG4vLyB0b2RvOiBjYWNoZSBjeWNsZXMgLyBkZWVwIHJlbGF0aW9uc2hpcHMgZm9yIGZhc3RlciByZXBlYXQgZXZhbHVhdGlvblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczogeyB1cmw6IGRvY3NVcmwoJ25vLWN5Y2xlJykgfSxcbiAgICBzY2hlbWE6IFttYWtlT3B0aW9uc1NjaGVtYSh7XG4gICAgICBtYXhEZXB0aDoge1xuICAgICAgICBvbmVPZjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnbWF4aW11bSBkZXBlbmRlbmN5IGRlcHRoIHRvIHRyYXZlcnNlJyxcbiAgICAgICAgICAgIHR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgICAgIG1pbmltdW06IDEsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbnVtOiBbJ+KIniddLFxuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBpZ25vcmVFeHRlcm5hbDoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ2lnbm9yZSBleHRlcm5hbCBtb2R1bGVzJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSldLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBjb25zdCBteVBhdGggPSBjb250ZXh0LmdldEZpbGVuYW1lKClcbiAgICBpZiAobXlQYXRoID09PSAnPHRleHQ+JykgcmV0dXJuIHt9IC8vIGNhbid0IGN5Y2xlLWNoZWNrIGEgbm9uLWZpbGVcblxuICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnNbMF0gfHwge31cbiAgICBjb25zdCBtYXhEZXB0aCA9IHR5cGVvZiBvcHRpb25zLm1heERlcHRoID09PSAnbnVtYmVyJyA/IG9wdGlvbnMubWF4RGVwdGggOiBJbmZpbml0eVxuICAgIGNvbnN0IGlnbm9yZU1vZHVsZSA9IChuYW1lKSA9PiBvcHRpb25zLmlnbm9yZUV4dGVybmFsID8gaXNFeHRlcm5hbE1vZHVsZShuYW1lKSA6IGZhbHNlXG5cbiAgICBmdW5jdGlvbiBjaGVja1NvdXJjZVZhbHVlKHNvdXJjZU5vZGUsIGltcG9ydGVyKSB7XG4gICAgICBpZiAoaWdub3JlTW9kdWxlKHNvdXJjZU5vZGUudmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAvLyBpZ25vcmUgZXh0ZXJuYWwgbW9kdWxlc1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbXBvcnRlZCA9IEV4cG9ydHMuZ2V0KHNvdXJjZU5vZGUudmFsdWUsIGNvbnRleHQpXG5cbiAgICAgIGlmIChpbXBvcnRlci5pbXBvcnRLaW5kID09PSAndHlwZScpIHtcbiAgICAgICAgcmV0dXJuIC8vIG5vIEZsb3cgaW1wb3J0IHJlc29sdXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKGltcG9ydGVkID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICAvLyBuby11bnJlc29sdmVkIHRlcnJpdG9yeVxuICAgICAgfVxuXG4gICAgICBpZiAoaW1wb3J0ZWQucGF0aCA9PT0gbXlQYXRoKSB7XG4gICAgICAgIHJldHVybiAgLy8gbm8tc2VsZi1pbXBvcnQgdGVycml0b3J5XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVudHJhdmVyc2VkID0gW3ttZ2V0OiAoKSA9PiBpbXBvcnRlZCwgcm91dGU6W119XVxuICAgICAgY29uc3QgdHJhdmVyc2VkID0gbmV3IFNldCgpXG4gICAgICBmdW5jdGlvbiBkZXRlY3RDeWNsZSh7bWdldCwgcm91dGV9KSB7XG4gICAgICAgIGNvbnN0IG0gPSBtZ2V0KClcbiAgICAgICAgaWYgKG0gPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIGlmICh0cmF2ZXJzZWQuaGFzKG0ucGF0aCkpIHJldHVyblxuICAgICAgICB0cmF2ZXJzZWQuYWRkKG0ucGF0aClcblxuICAgICAgICBmb3IgKGxldCBbcGF0aCwgeyBnZXR0ZXIsIHNvdXJjZSB9XSBvZiBtLmltcG9ydHMpIHtcbiAgICAgICAgICBpZiAocGF0aCA9PT0gbXlQYXRoKSByZXR1cm4gdHJ1ZVxuICAgICAgICAgIGlmICh0cmF2ZXJzZWQuaGFzKHBhdGgpKSBjb250aW51ZVxuICAgICAgICAgIGlmIChpZ25vcmVNb2R1bGUoc291cmNlLnZhbHVlKSkgY29udGludWVcbiAgICAgICAgICBpZiAocm91dGUubGVuZ3RoICsgMSA8IG1heERlcHRoKSB7XG4gICAgICAgICAgICB1bnRyYXZlcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgbWdldDogZ2V0dGVyLFxuICAgICAgICAgICAgICByb3V0ZTogcm91dGUuY29uY2F0KHNvdXJjZSksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAodW50cmF2ZXJzZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBuZXh0ID0gdW50cmF2ZXJzZWQuc2hpZnQoKSAvLyBiZnMhXG4gICAgICAgIGlmIChkZXRlY3RDeWNsZShuZXh0KSkge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAobmV4dC5yb3V0ZS5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IGBEZXBlbmRlbmN5IGN5Y2xlIHZpYSAke3JvdXRlU3RyaW5nKG5leHQucm91dGUpfWBcbiAgICAgICAgICAgIDogJ0RlcGVuZGVuY3kgY3ljbGUgZGV0ZWN0ZWQuJylcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydChpbXBvcnRlciwgbWVzc2FnZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVWaXNpdG9yKGNoZWNrU291cmNlVmFsdWUsIGNvbnRleHQub3B0aW9uc1swXSlcbiAgfSxcbn1cblxuZnVuY3Rpb24gcm91dGVTdHJpbmcocm91dGUpIHtcbiAgcmV0dXJuIHJvdXRlLm1hcChzID0+IGAke3MudmFsdWV9OiR7cy5sb2Muc3RhcnQubGluZX1gKS5qb2luKCc9PicpXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-default-export.js b/node_modules/eslint-plugin-import/lib/rules/no-default-export.js
index d9114e6..9434bcd 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-default-export.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-default-export.js
@@ -1,11 +1,13 @@
-'use strict';
+'use strict';var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'suggestion',
-    docs: {},
-    schema: []
-  },
+    docs: {
+      url: (0, _docsUrl2.default)('no-default-export') },
+
+    schema: [] },
+
 
   create(context) {
     // ignore non-modules
@@ -14,10 +16,9 @@
     }
 
     const preferNamed = 'Prefer named exports.';
-    const noAliasDefault = (_ref) => {
-      let local = _ref.local;
-      return `Do not alias \`${local.name}\` as \`default\`. Just export ` + `\`${local.name}\` itself instead.`;
-    };
+    const noAliasDefault = (_ref) => {let local = _ref.local;return (
+        `Do not alias \`${local.name}\` as \`default\`. Just export ` +
+        `\`${local.name}\` itself instead.`);};
 
     return {
       ExportDefaultDeclaration(node) {
@@ -26,14 +27,15 @@
 
       ExportNamedDeclaration(node) {
         node.specifiers.forEach(specifier => {
-          if (specifier.type === 'ExportDefaultSpecifier' && specifier.exported.name === 'default') {
+          if (specifier.type === 'ExportDefaultSpecifier' &&
+          specifier.exported.name === 'default') {
             context.report({ node, message: preferNamed });
-          } else if (specifier.type === 'ExportSpecifier' && specifier.exported.name === 'default') {
+          } else if (specifier.type === 'ExportSpecifier' &&
+          specifier.exported.name === 'default') {
             context.report({ node, message: noAliasDefault(specifier) });
           }
         });
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1kZWZhdWx0LWV4cG9ydC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwic2NoZW1hIiwiY3JlYXRlIiwiY29udGV4dCIsInBhcnNlck9wdGlvbnMiLCJzb3VyY2VUeXBlIiwicHJlZmVyTmFtZWQiLCJub0FsaWFzRGVmYXVsdCIsImxvY2FsIiwibmFtZSIsIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiIsIm5vZGUiLCJyZXBvcnQiLCJtZXNzYWdlIiwiRXhwb3J0TmFtZWREZWNsYXJhdGlvbiIsInNwZWNpZmllcnMiLCJmb3JFYWNoIiwic3BlY2lmaWVyIiwiZXhwb3J0ZWQiXSwibWFwcGluZ3MiOiI7O0FBQUFBLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFlBREY7QUFFSkMsVUFBTSxFQUZGO0FBR0pDLFlBQVE7QUFISixHQURTOztBQU9mQyxTQUFPQyxPQUFQLEVBQWdCO0FBQ2Q7QUFDQSxRQUFJQSxRQUFRQyxhQUFSLENBQXNCQyxVQUF0QixLQUFxQyxRQUF6QyxFQUFtRDtBQUNqRCxhQUFPLEVBQVA7QUFDRDs7QUFFRCxVQUFNQyxjQUFjLHVCQUFwQjtBQUNBLFVBQU1DLGlCQUFpQjtBQUFBLFVBQUVDLEtBQUYsUUFBRUEsS0FBRjtBQUFBLGFBQ3BCLGtCQUFpQkEsTUFBTUMsSUFBSyxpQ0FBN0IsR0FDQyxLQUFJRCxNQUFNQyxJQUFLLG9CQUZLO0FBQUEsS0FBdkI7O0FBSUEsV0FBTztBQUNMQywrQkFBeUJDLElBQXpCLEVBQStCO0FBQzdCUixnQkFBUVMsTUFBUixDQUFlLEVBQUNELElBQUQsRUFBT0UsU0FBU1AsV0FBaEIsRUFBZjtBQUNELE9BSEk7O0FBS0xRLDZCQUF1QkgsSUFBdkIsRUFBNkI7QUFDM0JBLGFBQUtJLFVBQUwsQ0FBZ0JDLE9BQWhCLENBQXdCQyxhQUFhO0FBQ25DLGNBQUlBLFVBQVVsQixJQUFWLEtBQW1CLHdCQUFuQixJQUNBa0IsVUFBVUMsUUFBVixDQUFtQlQsSUFBbkIsS0FBNEIsU0FEaEMsRUFDMkM7QUFDekNOLG9CQUFRUyxNQUFSLENBQWUsRUFBQ0QsSUFBRCxFQUFPRSxTQUFTUCxXQUFoQixFQUFmO0FBQ0QsV0FIRCxNQUdPLElBQUlXLFVBQVVsQixJQUFWLEtBQW1CLGlCQUFuQixJQUNQa0IsVUFBVUMsUUFBVixDQUFtQlQsSUFBbkIsS0FBNEIsU0FEekIsRUFDb0M7QUFDekNOLG9CQUFRUyxNQUFSLENBQWUsRUFBQ0QsSUFBRCxFQUFPRSxTQUFTTixlQUFlVSxTQUFmLENBQWhCLEVBQWY7QUFDRDtBQUNGLFNBUkQ7QUFTRDtBQWZJLEtBQVA7QUFpQkQ7QUFuQ2MsQ0FBakIiLCJmaWxlIjoibm8tZGVmYXVsdC1leHBvcnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7fSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgLy8gaWdub3JlIG5vbi1tb2R1bGVzXG4gICAgaWYgKGNvbnRleHQucGFyc2VyT3B0aW9ucy5zb3VyY2VUeXBlICE9PSAnbW9kdWxlJykge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmVyTmFtZWQgPSAnUHJlZmVyIG5hbWVkIGV4cG9ydHMuJ1xuICAgIGNvbnN0IG5vQWxpYXNEZWZhdWx0ID0gKHtsb2NhbH0pID0+XG4gICAgICBgRG8gbm90IGFsaWFzIFxcYCR7bG9jYWwubmFtZX1cXGAgYXMgXFxgZGVmYXVsdFxcYC4gSnVzdCBleHBvcnQgYCArXG4gICAgICBgXFxgJHtsb2NhbC5uYW1lfVxcYCBpdHNlbGYgaW5zdGVhZC5gXG5cbiAgICByZXR1cm4ge1xuICAgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoe25vZGUsIG1lc3NhZ2U6IHByZWZlck5hbWVkfSlcbiAgICAgIH0sXG5cbiAgICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgICBub2RlLnNwZWNpZmllcnMuZm9yRWFjaChzcGVjaWZpZXIgPT4ge1xuICAgICAgICAgIGlmIChzcGVjaWZpZXIudHlwZSA9PT0gJ0V4cG9ydERlZmF1bHRTcGVjaWZpZXInICYmXG4gICAgICAgICAgICAgIHNwZWNpZmllci5leHBvcnRlZC5uYW1lID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtub2RlLCBtZXNzYWdlOiBwcmVmZXJOYW1lZH0pXG4gICAgICAgICAgfSBlbHNlIGlmIChzcGVjaWZpZXIudHlwZSA9PT0gJ0V4cG9ydFNwZWNpZmllcicgJiZcbiAgICAgICAgICAgICAgc3BlY2lmaWVyLmV4cG9ydGVkLm5hbWUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoe25vZGUsIG1lc3NhZ2U6IG5vQWxpYXNEZWZhdWx0KHNwZWNpZmllcil9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1kZWZhdWx0LWV4cG9ydC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwiY29udGV4dCIsInBhcnNlck9wdGlvbnMiLCJzb3VyY2VUeXBlIiwicHJlZmVyTmFtZWQiLCJub0FsaWFzRGVmYXVsdCIsImxvY2FsIiwibmFtZSIsIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiIsIm5vZGUiLCJyZXBvcnQiLCJtZXNzYWdlIiwiRXhwb3J0TmFtZWREZWNsYXJhdGlvbiIsInNwZWNpZmllcnMiLCJmb3JFYWNoIiwic3BlY2lmaWVyIiwiZXhwb3J0ZWQiXSwibWFwcGluZ3MiOiJhQUFBLHFDOztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxZQURGO0FBRUpDLFVBQU07QUFDSkMsV0FBSyx1QkFBUSxtQkFBUixDQURELEVBRkY7O0FBS0pDLFlBQVEsRUFMSixFQURTOzs7QUFTZkMsU0FBT0MsT0FBUCxFQUFnQjtBQUNkO0FBQ0EsUUFBSUEsUUFBUUMsYUFBUixDQUFzQkMsVUFBdEIsS0FBcUMsUUFBekMsRUFBbUQ7QUFDakQsYUFBTyxFQUFQO0FBQ0Q7O0FBRUQsVUFBTUMsY0FBYyx1QkFBcEI7QUFDQSxVQUFNQyxpQkFBaUIsZUFBRUMsS0FBRixRQUFFQSxLQUFGO0FBQ3BCLDBCQUFpQkEsTUFBTUMsSUFBSyxpQ0FBN0I7QUFDQyxhQUFJRCxNQUFNQyxJQUFLLG9CQUZLLEdBQXZCOztBQUlBLFdBQU87QUFDTEMsK0JBQXlCQyxJQUF6QixFQUErQjtBQUM3QlIsZ0JBQVFTLE1BQVIsQ0FBZSxFQUFDRCxJQUFELEVBQU9FLFNBQVNQLFdBQWhCLEVBQWY7QUFDRCxPQUhJOztBQUtMUSw2QkFBdUJILElBQXZCLEVBQTZCO0FBQzNCQSxhQUFLSSxVQUFMLENBQWdCQyxPQUFoQixDQUF3QkMsYUFBYTtBQUNuQyxjQUFJQSxVQUFVbkIsSUFBVixLQUFtQix3QkFBbkI7QUFDQW1CLG9CQUFVQyxRQUFWLENBQW1CVCxJQUFuQixLQUE0QixTQURoQyxFQUMyQztBQUN6Q04sb0JBQVFTLE1BQVIsQ0FBZSxFQUFDRCxJQUFELEVBQU9FLFNBQVNQLFdBQWhCLEVBQWY7QUFDRCxXQUhELE1BR08sSUFBSVcsVUFBVW5CLElBQVYsS0FBbUIsaUJBQW5CO0FBQ1BtQixvQkFBVUMsUUFBVixDQUFtQlQsSUFBbkIsS0FBNEIsU0FEekIsRUFDb0M7QUFDekNOLG9CQUFRUyxNQUFSLENBQWUsRUFBQ0QsSUFBRCxFQUFPRSxTQUFTTixlQUFlVSxTQUFmLENBQWhCLEVBQWY7QUFDRDtBQUNGLFNBUkQ7QUFTRCxPQWZJLEVBQVA7O0FBaUJELEdBckNjLEVBQWpCIiwiZmlsZSI6Im5vLWRlZmF1bHQtZXhwb3J0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1kZWZhdWx0LWV4cG9ydCcpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGUoY29udGV4dCkge1xuICAgIC8vIGlnbm9yZSBub24tbW9kdWxlc1xuICAgIGlmIChjb250ZXh0LnBhcnNlck9wdGlvbnMuc291cmNlVHlwZSAhPT0gJ21vZHVsZScpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIGNvbnN0IHByZWZlck5hbWVkID0gJ1ByZWZlciBuYW1lZCBleHBvcnRzLidcbiAgICBjb25zdCBub0FsaWFzRGVmYXVsdCA9ICh7bG9jYWx9KSA9PlxuICAgICAgYERvIG5vdCBhbGlhcyBcXGAke2xvY2FsLm5hbWV9XFxgIGFzIFxcYGRlZmF1bHRcXGAuIEp1c3QgZXhwb3J0IGAgK1xuICAgICAgYFxcYCR7bG9jYWwubmFtZX1cXGAgaXRzZWxmIGluc3RlYWQuYFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihub2RlKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtub2RlLCBtZXNzYWdlOiBwcmVmZXJOYW1lZH0pXG4gICAgICB9LFxuXG4gICAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgbm9kZS5zcGVjaWZpZXJzLmZvckVhY2goc3BlY2lmaWVyID0+IHtcbiAgICAgICAgICBpZiAoc3BlY2lmaWVyLnR5cGUgPT09ICdFeHBvcnREZWZhdWx0U3BlY2lmaWVyJyAmJlxuICAgICAgICAgICAgICBzcGVjaWZpZXIuZXhwb3J0ZWQubmFtZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7bm9kZSwgbWVzc2FnZTogcHJlZmVyTmFtZWR9KVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3BlY2lmaWVyLnR5cGUgPT09ICdFeHBvcnRTcGVjaWZpZXInICYmXG4gICAgICAgICAgICAgIHNwZWNpZmllci5leHBvcnRlZC5uYW1lID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtub2RlLCBtZXNzYWdlOiBub0FsaWFzRGVmYXVsdChzcGVjaWZpZXIpfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgIH1cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-deprecated.js b/node_modules/eslint-plugin-import/lib/rules/no-deprecated.js
index 954f595..f641ead 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-deprecated.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-deprecated.js
@@ -1,18 +1,6 @@
-'use strict';
-
-var _declaredScope = require('eslint-module-utils/declaredScope');
-
-var _declaredScope2 = _interopRequireDefault(_declaredScope);
-
-var _ExportMap = require('../ExportMap');
-
-var _ExportMap2 = _interopRequireDefault(_ExportMap);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _declaredScope = require('eslint-module-utils/declaredScope');var _declaredScope2 = _interopRequireDefault(_declaredScope);
+var _ExportMap = require('../ExportMap');var _ExportMap2 = _interopRequireDefault(_ExportMap);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 function message(deprecation) {
   return 'Deprecated' + (deprecation.description ? ': ' + deprecation.description : '.');
@@ -31,14 +19,14 @@
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-deprecated')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('no-deprecated') },
+
+    schema: [] },
+
 
   create: function (context) {
     const deprecated = new Map(),
-          namespaces = new Map();
+    namespaces = new Map();
 
     function checkSpecifiers(node) {
       if (node.type !== 'ImportDeclaration') return;
@@ -48,7 +36,8 @@
       if (imports == null) return;
 
       let moduleDeprecation;
-      if (imports.doc && imports.doc.tags.some(t => t.title === 'deprecated' && (moduleDeprecation = t))) {
+      if (imports.doc &&
+      imports.doc.tags.some(t => t.title === 'deprecated' && (moduleDeprecation = t))) {
         context.report({ node, message: message(moduleDeprecation) });
       }
 
@@ -61,8 +50,8 @@
         let imported, local;
         switch (im.type) {
 
-          case 'ImportNamespaceSpecifier':
-            {
+
+          case 'ImportNamespaceSpecifier':{
               if (!imports.size) return;
               namespaces.set(im.local.name, imports);
               return;
@@ -78,8 +67,7 @@
             local = im.local.name;
             break;
 
-          default:
-            return; // can't handle this one
+          default:return; // can't handle this one
         }
 
         // unknown thing can't be deprecated
@@ -95,14 +83,12 @@
         context.report({ node: im, message: message(deprecation) });
 
         deprecated.set(local, deprecation);
+
       });
     }
 
     return {
-      'Program': (_ref) => {
-        let body = _ref.body;
-        return body.forEach(checkSpecifiers);
-      },
+      'Program': (_ref) => {let body = _ref.body;return body.forEach(checkSpecifiers);},
 
       'Identifier': function (node) {
         if (node.parent.type === 'MemberExpression' && node.parent.property === node) {
@@ -117,8 +103,8 @@
         if ((0, _declaredScope2.default)(context, node.name) !== 'module') return;
         context.report({
           node,
-          message: message(deprecated.get(node.name))
-        });
+          message: message(deprecated.get(node.name)) });
+
       },
 
       'MemberExpression': function (dereference) {
@@ -131,7 +117,8 @@
         var namespace = namespaces.get(dereference.object.name);
         var namepath = [dereference.object.name];
         // while property is namespace and parent is member expression, keep validating
-        while (namespace instanceof _ExportMap2.default && dereference.type === 'MemberExpression') {
+        while (namespace instanceof _ExportMap2.default &&
+        dereference.type === 'MemberExpression') {
 
           // ignore computed parts for now
           if (dereference.computed) return;
@@ -150,8 +137,7 @@
           namespace = metadata.namespace;
           dereference = dereference.parent;
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1kZXByZWNhdGVkLmpzIl0sIm5hbWVzIjpbIm1lc3NhZ2UiLCJkZXByZWNhdGlvbiIsImRlc2NyaXB0aW9uIiwiZ2V0RGVwcmVjYXRpb24iLCJtZXRhZGF0YSIsImRvYyIsInRhZ3MiLCJzb21lIiwidCIsInRpdGxlIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJkZXByZWNhdGVkIiwiTWFwIiwibmFtZXNwYWNlcyIsImNoZWNrU3BlY2lmaWVycyIsIm5vZGUiLCJzb3VyY2UiLCJpbXBvcnRzIiwiRXhwb3J0cyIsImdldCIsInZhbHVlIiwibW9kdWxlRGVwcmVjYXRpb24iLCJyZXBvcnQiLCJlcnJvcnMiLCJsZW5ndGgiLCJyZXBvcnRFcnJvcnMiLCJzcGVjaWZpZXJzIiwiZm9yRWFjaCIsImltIiwiaW1wb3J0ZWQiLCJsb2NhbCIsInNpemUiLCJzZXQiLCJuYW1lIiwiZXhwb3J0ZWQiLCJuYW1lc3BhY2UiLCJib2R5IiwicGFyZW50IiwicHJvcGVydHkiLCJzbGljZSIsImhhcyIsImRlcmVmZXJlbmNlIiwib2JqZWN0IiwibmFtZXBhdGgiLCJjb21wdXRlZCIsInB1c2giXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFFQSxTQUFTQSxPQUFULENBQWlCQyxXQUFqQixFQUE4QjtBQUM1QixTQUFPLGdCQUFnQkEsWUFBWUMsV0FBWixHQUEwQixPQUFPRCxZQUFZQyxXQUE3QyxHQUEyRCxHQUEzRSxDQUFQO0FBQ0Q7O0FBRUQsU0FBU0MsY0FBVCxDQUF3QkMsUUFBeEIsRUFBa0M7QUFDaEMsTUFBSSxDQUFDQSxRQUFELElBQWEsQ0FBQ0EsU0FBU0MsR0FBM0IsRUFBZ0M7O0FBRWhDLE1BQUlKLFdBQUo7QUFDQSxNQUFJRyxTQUFTQyxHQUFULENBQWFDLElBQWIsQ0FBa0JDLElBQWxCLENBQXVCQyxLQUFL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QUFFOUM7QUFDQSxjQUFJb0MsWUFBWUcsUUFBaEIsRUFBMEI7O0FBRTFCLGdCQUFNaEQsV0FBV3VDLFVBQVVoQixHQUFWLENBQWNzQixZQUFZSCxRQUFaLENBQXFCTCxJQUFuQyxDQUFqQjs7QUFFQSxjQUFJLENBQUNyQyxRQUFMLEVBQWU7QUFDZixnQkFBTUgsY0FBY0UsZUFBZUMsUUFBZixDQUFwQjs7QUFFQSxjQUFJSCxXQUFKLEVBQWlCO0FBQ2ZpQixvQkFBUVksTUFBUixDQUFlLEVBQUVQLE1BQU0wQixZQUFZSCxRQUFwQixFQUE4QjlDLFNBQVNBLFFBQVFDLFdBQVIsQ0FBdkMsRUFBZjtBQUNEOztBQUVEO0FBQ0FrRCxtQkFBU0UsSUFBVCxDQUFjSixZQUFZSCxRQUFaLENBQXFCTCxJQUFuQztBQUNBRSxzQkFBWXZDLFNBQVN1QyxTQUFyQjtBQUNBTSx3QkFBY0EsWUFBWUosTUFBMUI7QUFDRDtBQUNGO0FBbERJLEtBQVA7QUFvREQ7QUE1SGMsQ0FBakIiLCJmaWxlIjoibm8tZGVwcmVjYXRlZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZWNsYXJlZFNjb3BlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvZGVjbGFyZWRTY29wZSdcbmltcG9ydCBFeHBvcnRzIGZyb20gJy4uL0V4cG9ydE1hcCdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbmZ1bmN0aW9uIG1lc3NhZ2UoZGVwcmVjYXRpb24pIHtcbiAgcmV0dXJuICdEZXByZWNhdGVkJyArIChkZXByZWNhdGlvbi5kZXNjcmlwdGlvbiA/ICc6ICcgKyBkZXByZWNhdGlvbi5kZXNjcmlwdGlvbiA6ICcuJylcbn1cblxuZnVuY3Rpb24gZ2V0RGVwcmVjYXRpb24obWV0YWRhdGEpIHtcbiAgaWYgKCFtZXRhZGF0YSB8fCAhbWV0YWRhdGEuZG9jKSByZXR1cm5cblxuICBsZXQgZGVwcmVjYXRpb25cbiAgaWYgKG1ldGFkYXRhLmRvYy50YWdzLnNvbWUodCA9PiB0LnRpdGxlID09PSAnZGVwcmVjYXRlZCcgJiYgKGRlcHJlY2F0aW9uID0gdCkpKSB7XG4gICAgcmV0dXJuIGRlcHJlY2F0aW9uXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1kZXByZWNhdGVkJyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBjb25zdCBkZXByZWNhdGVkID0gbmV3IE1hcCgpXG4gICAgICAgICwgbmFtZXNwYWNlcyA9IG5ldyBNYXAoKVxuXG4gICAgZnVuY3Rpb24gY2hlY2tTcGVjaWZpZXJzKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLnR5cGUgIT09ICdJbXBvcnREZWNsYXJhdGlvbicpIHJldHVyblxuICAgICAgaWYgKG5vZGUuc291cmNlID09IG51bGwpIHJldHVybiAvLyBsb2NhbCBleHBvcnQsIGlnbm9yZVxuXG4gICAgICBjb25zdCBpbXBvcnRzID0gRXhwb3J0cy5nZXQobm9kZS5zb3VyY2UudmFsdWUsIGNvbnRleHQpXG4gICAgICBpZiAoaW1wb3J0cyA9PSBudWxsKSByZXR1cm5cblxuICAgICAgbGV0IG1vZHVsZURlcHJlY2F0aW9uXG4gICAgICBpZiAoaW1wb3J0cy5kb2MgJiZcbiAgICAgICAgICBpbXBvcnRzLmRvYy50YWdzLnNvbWUodCA9PiB0LnRpdGxlID09PSAnZGVwcmVjYXRlZCcgJiYgKG1vZHVsZURlcHJlY2F0aW9uID0gdCkpKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHsgbm9kZSwgbWVzc2FnZTogbWVzc2FnZShtb2R1bGVEZXByZWNhdGlvbikgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGltcG9ydHMuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICBpbXBvcnRzLnJlcG9ydEVycm9ycyhjb250ZXh0LCBub2RlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbm9kZS5zcGVjaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKGltKSB7XG4gICAgICAgIGxldCBpbXBvcnRlZCwgbG9jYWxcbiAgICAgICAgc3dpdGNoIChpbS50eXBlKSB7XG5cblxuICAgICAgICAgIGNhc2UgJ0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllcic6e1xuICAgICAgICAgICAgaWYgKCFpbXBvcnRzLnNpemUpIHJldHVyblxuICAgICAgICAgICAgbmFtZXNwYWNlcy5zZXQoaW0ubG9jYWwubmFtZSwgaW1wb3J0cylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInOlxuICAgICAgICAgICAgaW1wb3J0ZWQgPSAnZGVmYXVsdCdcbiAgICAgICAgICAgIGxvY2FsID0gaW0ubG9jYWwubmFtZVxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGNhc2UgJ0ltcG9ydFNwZWNpZmllcic6XG4gICAgICAgICAgICBpbXBvcnRlZCA9IGltLmltcG9ydGVkLm5hbWVcbiAgICAgICAgICAgIGxvY2FsID0gaW0ubG9jYWwubmFtZVxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAvLyBjYW4ndCBoYW5kbGUgdGhpcyBvbmVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVua25vd24gdGhpbmcgY2FuJ3QgYmUgZGVwcmVjYXRlZFxuICAgICAgICBjb25zdCBleHBvcnRlZCA9IGltcG9ydHMuZ2V0KGltcG9ydGVkKVxuICAgICAgICBpZiAoZXhwb3J0ZWQgPT0gbnVsbCkgcmV0dXJuXG5cbiAgICAgICAgLy8gY2FwdHVyZSBpbXBvcnQgb2YgZGVlcCBuYW1lc3BhY2VcbiAgICAgICAgaWYgKGV4cG9ydGVkLm5hbWVzcGFjZSkgbmFtZXNwYWNlcy5zZXQobG9jYWwsIGV4cG9ydGVkLm5hbWVzcGFjZSlcblxuICAgICAgICBjb25zdCBkZXByZWNhdGlvbiA9IGdldERlcHJlY2F0aW9uKGltcG9ydHMuZ2V0KGltcG9ydGVkKSlcbiAgICAgICAgaWYgKCFkZXByZWNhdGlvbikgcmV0dXJuXG5cbiAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlOiBpbSwgbWVzc2FnZTogbWVzc2FnZShkZXByZWNhdGlvbikgfSlcblxuICAgICAgICBkZXByZWNhdGVkLnNldChsb2NhbCwgZGVwcmVjYXRpb24pXG5cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICdQcm9ncmFtJzogKHsgYm9keSB9KSA9PiBib2R5LmZvckVhY2goY2hlY2tTcGVjaWZpZXJzKSxcblxuICAgICAgJ0lkZW50aWZpZXInOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5wYXJlbnQudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nICYmIG5vZGUucGFyZW50LnByb3BlcnR5ID09PSBub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGhhbmRsZWQgYnkgTWVtYmVyRXhwcmVzc2lvblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWdub3JlIHNwZWNpZmllciBpZGVudGlmaWVyc1xuICAgICAgICBpZiAobm9kZS5wYXJlbnQudHlwZS5zbGljZSgwLCA2KSA9PT0gJ0ltcG9ydCcpIHJldHVyblxuXG4gICAgICAgIGlmICghZGVwcmVjYXRlZC5oYXMobm9kZS5uYW1lKSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKGRlY2xhcmVkU2NvcGUoY29udGV4dCwgbm9kZS5uYW1lKSAhPT0gJ21vZHVsZScpIHJldHVyblxuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlKGRlcHJlY2F0ZWQuZ2V0KG5vZGUubmFtZSkpLFxuICAgICAgICB9KVxuICAgICAgfSxcblxuICAgICAgJ01lbWJlckV4cHJlc3Npb24nOiBmdW5jdGlvbiAoZGVyZWZlcmVuY2UpIHtcbiAgICAgICAgaWYgKGRlcmVmZXJlbmNlLm9iamVjdC50eXBlICE9PSAnSWRlbnRpZmllcicpIHJldHVyblxuICAgICAgICBpZiAoIW5hbWVzcGFjZXMuaGFzKGRlcmVmZXJlbmNlLm9iamVjdC5uYW1lKSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKGRlY2xhcmVkU2NvcGUoY29udGV4dCwgZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWUpICE9PSAnbW9kdWxlJykgcmV0dXJuXG5cbiAgICAgICAgLy8gZ28gZGVlcFxuICAgICAgICB2YXIgbmFtZXNwYWNlID0gbmFtZXNwYWNlcy5nZXQoZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWUpXG4gICAgICAgIHZhciBuYW1lcGF0aCA9IFtkZXJlZmVyZW5jZS5vYmplY3QubmFtZV1cbiAgICAgICAgLy8gd2hpbGUgcHJvcGVydHkgaXMgbmFtZXNwYWNlIGFuZCBwYXJlbnQgaXMgbWVtYmVyIGV4cHJlc3Npb24sIGtlZXAgdmFsaWRhdGluZ1xuICAgICAgICB3aGlsZSAobmFtZXNwYWNlIGluc3RhbmNlb2YgRXhwb3J0cyAmJlxuICAgICAgICAgICAgICAgZGVyZWZlcmVuY2UudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG5cbiAgICAgICAgICAvLyBpZ25vcmUgY29tcHV0ZWQgcGFydHMgZm9yIG5vd1xuICAgICAgICAgIGlmIChkZXJlZmVyZW5jZS5jb21wdXRlZCkgcmV0dXJuXG5cbiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IG5hbWVzcGFjZS5nZXQoZGVyZWZlcmVuY2UucHJvcGVydHkubmFtZSlcblxuICAgICAgICAgIGlmICghbWV0YWRhdGEpIGJyZWFrXG4gICAgICAgICAgY29uc3QgZGVwcmVjYXRpb24gPSBnZXREZXByZWNhdGlvbihtZXRhZGF0YSlcblxuICAgICAgICAgIGlmIChkZXByZWNhdGlvbikge1xuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlOiBkZXJlZmVyZW5jZS5wcm9wZXJ0eSwgbWVzc2FnZTogbWVzc2FnZShkZXByZWNhdGlvbikgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzdGFzaCBhbmQgcG9wXG4gICAgICAgICAgbmFtZXBhdGgucHVzaChkZXJlZmVyZW5jZS5wcm9wZXJ0eS5uYW1lKVxuICAgICAgICAgIG5hbWVzcGFjZSA9IG1ldGFkYXRhLm5hbWVzcGFjZVxuICAgICAgICAgIGRlcmVmZXJlbmNlID0gZGVyZWZlcmVuY2UucGFyZW50XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1kZXByZWNhdGVkLmpzIl0sIm5hbWVzIjpbIm1lc3NhZ2UiLCJkZXByZWNhdGlvbiIsImRlc2NyaXB0aW9uIiwiZ2V0RGVwcmVjYXRpb24iLCJtZXRhZGF0YSIsImRvYyIsInRhZ3MiLCJzb21lIiwidCIsInRpdGxlIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJkZXByZWNhdGVkIiwiTWFwIiwibmFtZXNwYWNlcyIsImNoZWNrU3BlY2lmaWVycyIsIm5vZGUiLCJzb3VyY2UiLCJpbXBvcnRzIiwiRXhwb3J0cyIsImdldCIsInZhbHVlIiwibW9kdWxlRGVwcmVjYXRpb24iLCJyZXBvcnQiLCJlcnJvcnMiLCJsZW5ndGgiLCJyZXBvcnRFcnJvcnMiLCJzcGVjaWZpZXJzIiwiZm9yRWFjaCIsImltIiwiaW1wb3J0ZWQiLCJsb2NhbCIsInNpemUiLCJzZXQiLCJuYW1lIiwiZXhwb3J0ZWQiLCJuYW1lc3BhY2UiLCJib2R5IiwicGFyZW50IiwicHJvcGVydHkiLCJzbGljZSIsImhhcyIsImRlcmVmZXJlbmNlIiwib2JqZWN0IiwibmFtZXBhdGgiLCJjb21wdXRlZCIsInB1c2giXSwibWFwcGluZ3MiOiJhQUFBLGtFO0FBQ0EseUM7QUFDQSxxQzs7QUFFQSxTQUFTQSxPQUFULENBQWlCQyxXQUFqQixFQUE4QjtBQUM1QixTQUFPLGdCQUFnQkEsWUFBWUMsV0FBWixHQUEwQixPQUFPRCxZQUFZQyxXQUE3QyxHQUEyRCxHQUEzRSxDQUFQO0FBQ0Q7O0FBRUQsU0FBU0MsY0FBVCxDQUF3QkMsUUFBeEIsRUFBa0M7QUFDaEMsTUFBSSxDQUFDQSxRQUFELElBQWEsQ0FBQ0EsU0FBU0MsR0FBM0IsRUFBZ0M7O0FBRWhDLE1BQUlKLFdBQUo7QUFDQSxNQUFJRyxTQUFTQyxHQUFULENBQWFDLElBQWIsQ0FBa0JDLElBQWxCLENBQXVCQyxLQUFLQSxF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QyxZQUFZRyxRQUFoQixFQUEwQjs7QUFFMUIsZ0JBQU1oRCxXQUFXdUMsVUFBVWhCLEdBQVYsQ0FBY3NCLFlBQVlILFFBQVosQ0FBcUJMLElBQW5DLENBQWpCOztBQUVBLGNBQUksQ0FBQ3JDLFFBQUwsRUFBZTtBQUNmLGdCQUFNSCxjQUFjRSxlQUFlQyxRQUFmLENBQXBCOztBQUVBLGNBQUlILFdBQUosRUFBaUI7QUFDZmlCLG9CQUFRWSxNQUFSLENBQWUsRUFBRVAsTUFBTTBCLFlBQVlILFFBQXBCLEVBQThCOUMsU0FBU0EsUUFBUUMsV0FBUixDQUF2QyxFQUFmO0FBQ0Q7O0FBRUQ7QUFDQWtELG1CQUFTRSxJQUFULENBQWNKLFlBQVlILFFBQVosQ0FBcUJMLElBQW5DO0FBQ0FFLHNCQUFZdkMsU0FBU3VDLFNBQXJCO0FBQ0FNLHdCQUFjQSxZQUFZSixNQUExQjtBQUNEO0FBQ0YsT0FsREksRUFBUDs7QUFvREQsR0E1SGMsRUFBakIiLCJmaWxlIjoibm8tZGVwcmVjYXRlZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZWNsYXJlZFNjb3BlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvZGVjbGFyZWRTY29wZSdcbmltcG9ydCBFeHBvcnRzIGZyb20gJy4uL0V4cG9ydE1hcCdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbmZ1bmN0aW9uIG1lc3NhZ2UoZGVwcmVjYXRpb24pIHtcbiAgcmV0dXJuICdEZXByZWNhdGVkJyArIChkZXByZWNhdGlvbi5kZXNjcmlwdGlvbiA/ICc6ICcgKyBkZXByZWNhdGlvbi5kZXNjcmlwdGlvbiA6ICcuJylcbn1cblxuZnVuY3Rpb24gZ2V0RGVwcmVjYXRpb24obWV0YWRhdGEpIHtcbiAgaWYgKCFtZXRhZGF0YSB8fCAhbWV0YWRhdGEuZG9jKSByZXR1cm5cblxuICBsZXQgZGVwcmVjYXRpb25cbiAgaWYgKG1ldGFkYXRhLmRvYy50YWdzLnNvbWUodCA9PiB0LnRpdGxlID09PSAnZGVwcmVjYXRlZCcgJiYgKGRlcHJlY2F0aW9uID0gdCkpKSB7XG4gICAgcmV0dXJuIGRlcHJlY2F0aW9uXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1kZXByZWNhdGVkJyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBjb25zdCBkZXByZWNhdGVkID0gbmV3IE1hcCgpXG4gICAgICAgICwgbmFtZXNwYWNlcyA9IG5ldyBNYXAoKVxuXG4gICAgZnVuY3Rpb24gY2hlY2tTcGVjaWZpZXJzKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLnR5cGUgIT09ICdJbXBvcnREZWNsYXJhdGlvbicpIHJldHVyblxuICAgICAgaWYgKG5vZGUuc291cmNlID09IG51bGwpIHJldHVybiAvLyBsb2NhbCBleHBvcnQsIGlnbm9yZVxuXG4gICAgICBjb25zdCBpbXBvcnRzID0gRXhwb3J0cy5nZXQobm9kZS5zb3VyY2UudmFsdWUsIGNvbnRleHQpXG4gICAgICBpZiAoaW1wb3J0cyA9PSBudWxsKSByZXR1cm5cblxuICAgICAgbGV0IG1vZHVsZURlcHJlY2F0aW9uXG4gICAgICBpZiAoaW1wb3J0cy5kb2MgJiZcbiAgICAgICAgICBpbXBvcnRzLmRvYy50YWdzLnNvbWUodCA9PiB0LnRpdGxlID09PSAnZGVwcmVjYXRlZCcgJiYgKG1vZHVsZURlcHJlY2F0aW9uID0gdCkpKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHsgbm9kZSwgbWVzc2FnZTogbWVzc2FnZShtb2R1bGVEZXByZWNhdGlvbikgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGltcG9ydHMuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICBpbXBvcnRzLnJlcG9ydEVycm9ycyhjb250ZXh0LCBub2RlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbm9kZS5zcGVjaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKGltKSB7XG4gICAgICAgIGxldCBpbXBvcnRlZCwgbG9jYWxcbiAgICAgICAgc3dpdGNoIChpbS50eXBlKSB7XG5cblxuICAgICAgICAgIGNhc2UgJ0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllcic6e1xuICAgICAgICAgICAgaWYgKCFpbXBvcnRzLnNpemUpIHJldHVyblxuICAgICAgICAgICAgbmFtZXNwYWNlcy5zZXQoaW0ubG9jYWwubmFtZSwgaW1wb3J0cylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInOlxuICAgICAgICAgICAgaW1wb3J0ZWQgPSAnZGVmYXVsdCdcbiAgICAgICAgICAgIGxvY2FsID0gaW0ubG9jYWwubmFtZVxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGNhc2UgJ0ltcG9ydFNwZWNpZmllcic6XG4gICAgICAgICAgICBpbXBvcnRlZCA9IGltLmltcG9ydGVkLm5hbWVcbiAgICAgICAgICAgIGxvY2FsID0gaW0ubG9jYWwubmFtZVxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAvLyBjYW4ndCBoYW5kbGUgdGhpcyBvbmVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVua25vd24gdGhpbmcgY2FuJ3QgYmUgZGVwcmVjYXRlZFxuICAgICAgICBjb25zdCBleHBvcnRlZCA9IGltcG9ydHMuZ2V0KGltcG9ydGVkKVxuICAgICAgICBpZiAoZXhwb3J0ZWQgPT0gbnVsbCkgcmV0dXJuXG5cbiAgICAgICAgLy8gY2FwdHVyZSBpbXBvcnQgb2YgZGVlcCBuYW1lc3BhY2VcbiAgICAgICAgaWYgKGV4cG9ydGVkLm5hbWVzcGFjZSkgbmFtZXNwYWNlcy5zZXQobG9jYWwsIGV4cG9ydGVkLm5hbWVzcGFjZSlcblxuICAgICAgICBjb25zdCBkZXByZWNhdGlvbiA9IGdldERlcHJlY2F0aW9uKGltcG9ydHMuZ2V0KGltcG9ydGVkKSlcbiAgICAgICAgaWYgKCFkZXByZWNhdGlvbikgcmV0dXJuXG5cbiAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlOiBpbSwgbWVzc2FnZTogbWVzc2FnZShkZXByZWNhdGlvbikgfSlcblxuICAgICAgICBkZXByZWNhdGVkLnNldChsb2NhbCwgZGVwcmVjYXRpb24pXG5cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICdQcm9ncmFtJzogKHsgYm9keSB9KSA9PiBib2R5LmZvckVhY2goY2hlY2tTcGVjaWZpZXJzKSxcblxuICAgICAgJ0lkZW50aWZpZXInOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5wYXJlbnQudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nICYmIG5vZGUucGFyZW50LnByb3BlcnR5ID09PSBub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGhhbmRsZWQgYnkgTWVtYmVyRXhwcmVzc2lvblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWdub3JlIHNwZWNpZmllciBpZGVudGlmaWVyc1xuICAgICAgICBpZiAobm9kZS5wYXJlbnQudHlwZS5zbGljZSgwLCA2KSA9PT0gJ0ltcG9ydCcpIHJldHVyblxuXG4gICAgICAgIGlmICghZGVwcmVjYXRlZC5oYXMobm9kZS5uYW1lKSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKGRlY2xhcmVkU2NvcGUoY29udGV4dCwgbm9kZS5uYW1lKSAhPT0gJ21vZHVsZScpIHJldHVyblxuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlKGRlcHJlY2F0ZWQuZ2V0KG5vZGUubmFtZSkpLFxuICAgICAgICB9KVxuICAgICAgfSxcblxuICAgICAgJ01lbWJlckV4cHJlc3Npb24nOiBmdW5jdGlvbiAoZGVyZWZlcmVuY2UpIHtcbiAgICAgICAgaWYgKGRlcmVmZXJlbmNlLm9iamVjdC50eXBlICE9PSAnSWRlbnRpZmllcicpIHJldHVyblxuICAgICAgICBpZiAoIW5hbWVzcGFjZXMuaGFzKGRlcmVmZXJlbmNlLm9iamVjdC5uYW1lKSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKGRlY2xhcmVkU2NvcGUoY29udGV4dCwgZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWUpICE9PSAnbW9kdWxlJykgcmV0dXJuXG5cbiAgICAgICAgLy8gZ28gZGVlcFxuICAgICAgICB2YXIgbmFtZXNwYWNlID0gbmFtZXNwYWNlcy5nZXQoZGVyZWZlcmVuY2Uub2JqZWN0Lm5hbWUpXG4gICAgICAgIHZhciBuYW1lcGF0aCA9IFtkZXJlZmVyZW5jZS5vYmplY3QubmFtZV1cbiAgICAgICAgLy8gd2hpbGUgcHJvcGVydHkgaXMgbmFtZXNwYWNlIGFuZCBwYXJlbnQgaXMgbWVtYmVyIGV4cHJlc3Npb24sIGtlZXAgdmFsaWRhdGluZ1xuICAgICAgICB3aGlsZSAobmFtZXNwYWNlIGluc3RhbmNlb2YgRXhwb3J0cyAmJlxuICAgICAgICAgICAgICAgZGVyZWZlcmVuY2UudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG5cbiAgICAgICAgICAvLyBpZ25vcmUgY29tcHV0ZWQgcGFydHMgZm9yIG5vd1xuICAgICAgICAgIGlmIChkZXJlZmVyZW5jZS5jb21wdXRlZCkgcmV0dXJuXG5cbiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IG5hbWVzcGFjZS5nZXQoZGVyZWZlcmVuY2UucHJvcGVydHkubmFtZSlcblxuICAgICAgICAgIGlmICghbWV0YWRhdGEpIGJyZWFrXG4gICAgICAgICAgY29uc3QgZGVwcmVjYXRpb24gPSBnZXREZXByZWNhdGlvbihtZXRhZGF0YSlcblxuICAgICAgICAgIGlmIChkZXByZWNhdGlvbikge1xuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlOiBkZXJlZmVyZW5jZS5wcm9wZXJ0eSwgbWVzc2FnZTogbWVzc2FnZShkZXByZWNhdGlvbikgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzdGFzaCBhbmQgcG9wXG4gICAgICAgICAgbmFtZXBhdGgucHVzaChkZXJlZmVyZW5jZS5wcm9wZXJ0eS5uYW1lKVxuICAgICAgICAgIG5hbWVzcGFjZSA9IG1ldGFkYXRhLm5hbWVzcGFjZVxuICAgICAgICAgIGRlcmVmZXJlbmNlID0gZGVyZWZlcmVuY2UucGFyZW50XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-duplicates.js b/node_modules/eslint-plugin-import/lib/rules/no-duplicates.js
index a7cbae3..951f3b7 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-duplicates.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-duplicates.js
@@ -1,36 +1,11 @@
-'use strict';
-
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
-var _resolve = require('eslint-module-utils/resolve');
-
-var _resolve2 = _interopRequireDefault(_resolve);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }
-
-function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }
+'use strict';var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _toConsumableArray(arr) {if (Array.isArray(arr)) {for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];return arr2;} else {return Array.from(arr);}}function _toArray(arr) {return Array.isArray(arr) ? arr : Array.from(arr);}
 
 function checkImports(imported, context) {
-  for (const _ref of imported.entries()) {
-    var _ref2 = _slicedToArray(_ref, 2);
-
-    const module = _ref2[0];
-    const nodes = _ref2[1];
-
+  for (const _ref of imported.entries()) {var _ref2 = _slicedToArray(_ref, 2);const module = _ref2[0];const nodes = _ref2[1];
     if (nodes.length > 1) {
-      const message = `'${module}' imported multiple times.`;
-
-      var _nodes = _toArray(nodes);
-
-      const first = _nodes[0],
-            rest = _nodes.slice(1);
-
+      const message = `'${module}' imported multiple times.`;var _nodes = _toArray(
+      nodes);const first = _nodes[0],rest = _nodes.slice(1);
       const sourceCode = context.getSourceCode();
       const fix = getFix(first, rest, sourceCode);
 
@@ -43,8 +18,8 @@
       for (const node of rest) {
         context.report({
           node: node.source,
-          message
-        });
+          message });
+
       }
     }
   }
@@ -69,7 +44,9 @@
     return undefined;
   }
 
-  const defaultImportNames = new Set([first].concat(_toConsumableArray(rest)).map(getDefaultImportName).filter(Boolean));
+  const defaultImportNames = new Set(
+  [first].concat(_toConsumableArray(rest)).map(getDefaultImportName).filter(Boolean));
+
 
   // Bail if there are multiple different default import names – it's up to the
   // user to choose which one to keep.
@@ -79,9 +56,13 @@
 
   // Leave it to the user to handle comments. Also skip `import * as ns from
   // './foo'` imports, since they cannot be merged into another import.
-  const restWithoutComments = rest.filter(node => !(hasProblematicComments(node, sourceCode) || hasNamespace(node)));
+  const restWithoutComments = rest.filter(node => !(
+  hasProblematicComments(node, sourceCode) ||
+  hasNamespace(node)));
 
-  const specifiers = restWithoutComments.map(node => {
+
+  const specifiers = restWithoutComments.
+  map(node => {
     const tokens = sourceCode.getTokens(node);
     const openBrace = tokens.find(token => isPunctuator(token, '{'));
     const closeBrace = tokens.find(token => isPunctuator(token, '}'));
@@ -94,11 +75,16 @@
       importNode: node,
       text: sourceCode.text.slice(openBrace.range[1], closeBrace.range[0]),
       hasTrailingComma: isPunctuator(sourceCode.getTokenBefore(closeBrace), ','),
-      isEmpty: !hasSpecifiers(node)
-    };
-  }).filter(Boolean);
+      isEmpty: !hasSpecifiers(node) };
 
-  const unnecessaryImports = restWithoutComments.filter(node => !hasSpecifiers(node) && !hasNamespace(node) && !specifiers.some(specifier => specifier.importNode === node));
+  }).
+  filter(Boolean);
+
+  const unnecessaryImports = restWithoutComments.filter(node =>
+  !hasSpecifiers(node) &&
+  !hasNamespace(node) &&
+  !specifiers.some(specifier => specifier.importNode === node));
+
 
   const shouldAddDefault = getDefaultImportName(first) == null && defaultImportNames.size === 1;
   const shouldAddSpecifiers = specifiers.length > 0;
@@ -112,34 +98,33 @@
     const tokens = sourceCode.getTokens(first);
     const openBrace = tokens.find(token => isPunctuator(token, '{'));
     const closeBrace = tokens.find(token => isPunctuator(token, '}'));
-    const firstToken = sourceCode.getFirstToken(first);
+    const firstToken = sourceCode.getFirstToken(first);var _defaultImportNames = _slicedToArray(
+    defaultImportNames, 1);const defaultImportName = _defaultImportNames[0];
 
-    var _defaultImportNames = _slicedToArray(defaultImportNames, 1);
+    const firstHasTrailingComma =
+    closeBrace != null &&
+    isPunctuator(sourceCode.getTokenBefore(closeBrace), ',');
+    const firstIsEmpty = !hasSpecifiers(first);var _specifiers$reduce =
 
-    const defaultImportName = _defaultImportNames[0];
+    specifiers.reduce(
+    (_ref3, specifier) => {var _ref4 = _slicedToArray(_ref3, 2);let result = _ref4[0],needsComma = _ref4[1];
+      return [
+      needsComma && !specifier.isEmpty ?
+      `${result},${specifier.text}` :
+      `${result}${specifier.text}`,
+      specifier.isEmpty ? needsComma : true];
 
-
-    const firstHasTrailingComma = closeBrace != null && isPunctuator(sourceCode.getTokenBefore(closeBrace), ',');
-    const firstIsEmpty = !hasSpecifiers(first);
-
-    var _specifiers$reduce = specifiers.reduce((_ref3, specifier) => {
-      var _ref4 = _slicedToArray(_ref3, 2);
-
-      let result = _ref4[0],
-          needsComma = _ref4[1];
-
-      return [needsComma && !specifier.isEmpty ? `${result},${specifier.text}` : `${result}${specifier.text}`, specifier.isEmpty ? needsComma : true];
-    }, ['', !firstHasTrailingComma && !firstIsEmpty]),
-        _specifiers$reduce2 = _slicedToArray(_specifiers$reduce, 1);
-
-    const specifiersText = _specifiers$reduce2[0];
+    },
+    ['', !firstHasTrailingComma && !firstIsEmpty]),_specifiers$reduce2 = _slicedToArray(_specifiers$reduce, 1);const specifiersText = _specifiers$reduce2[0];
 
 
     const fixes = [];
 
     if (shouldAddDefault && openBrace == null && shouldAddSpecifiers) {
       // `import './foo'` → `import def, {...} from './foo'`
-      fixes.push(fixer.insertTextAfter(firstToken, ` ${defaultImportName}, {${specifiersText}} from`));
+      fixes.push(
+      fixer.insertTextAfter(firstToken, ` ${defaultImportName}, {${specifiersText}} from`));
+
     } else if (shouldAddDefault && openBrace == null && !shouldAddSpecifiers) {
       // `import './foo'` → `import def from './foo'`
       fixes.push(fixer.insertTextAfter(firstToken, ` ${defaultImportName} from`));
@@ -151,8 +136,13 @@
         fixes.push(fixer.insertTextBefore(closeBrace, specifiersText));
       }
     } else if (!shouldAddDefault && openBrace == null && shouldAddSpecifiers) {
-      // `import './foo'` → `import {...} from './foo'`
-      fixes.push(fixer.insertTextAfter(firstToken, ` {${specifiersText}} from`));
+      if (first.specifiers.length === 0) {
+        // `import './foo'` → `import {...} from './foo'`
+        fixes.push(fixer.insertTextAfter(firstToken, ` {${specifiersText}} from`));
+      } else {
+        // `import def from './foo'` → `import def, {...} from './foo'`
+        fixes.push(fixer.insertTextAfter(first.specifiers[0], `, {${specifiersText}}`));
+      }
     } else if (!shouldAddDefault && openBrace != null && closeBrace != null) {
       // `import {...} './foo'` → `import {..., ...} from './foo'`
       fixes.push(fixer.insertTextBefore(closeBrace, specifiersText));
@@ -180,38 +170,47 @@
 
 // Get the name of the default import of `node`, if any.
 function getDefaultImportName(node) {
-  const defaultSpecifier = node.specifiers.find(specifier => specifier.type === 'ImportDefaultSpecifier');
+  const defaultSpecifier = node.specifiers.
+  find(specifier => specifier.type === 'ImportDefaultSpecifier');
   return defaultSpecifier != null ? defaultSpecifier.local.name : undefined;
 }
 
 // Checks whether `node` has a namespace import.
 function hasNamespace(node) {
-  const specifiers = node.specifiers.filter(specifier => specifier.type === 'ImportNamespaceSpecifier');
+  const specifiers = node.specifiers.
+  filter(specifier => specifier.type === 'ImportNamespaceSpecifier');
   return specifiers.length > 0;
 }
 
 // Checks whether `node` has any non-default specifiers.
 function hasSpecifiers(node) {
-  const specifiers = node.specifiers.filter(specifier => specifier.type === 'ImportSpecifier');
+  const specifiers = node.specifiers.
+  filter(specifier => specifier.type === 'ImportSpecifier');
   return specifiers.length > 0;
 }
 
 // It's not obvious what the user wants to do with comments associated with
 // duplicate imports, so skip imports with comments when autofixing.
 function hasProblematicComments(node, sourceCode) {
-  return hasCommentBefore(node, sourceCode) || hasCommentAfter(node, sourceCode) || hasCommentInsideNonSpecifiers(node, sourceCode);
+  return (
+    hasCommentBefore(node, sourceCode) ||
+    hasCommentAfter(node, sourceCode) ||
+    hasCommentInsideNonSpecifiers(node, sourceCode));
+
 }
 
 // Checks whether `node` has a comment (that ends) on the previous line or on
 // the same line as `node` (starts).
 function hasCommentBefore(node, sourceCode) {
-  return sourceCode.getCommentsBefore(node).some(comment => comment.loc.end.line >= node.loc.start.line - 1);
+  return sourceCode.getCommentsBefore(node).
+  some(comment => comment.loc.end.line >= node.loc.start.line - 1);
 }
 
 // Checks whether `node` has a comment (that starts) on the same line as `node`
 // (ends).
 function hasCommentAfter(node, sourceCode) {
-  return sourceCode.getCommentsAfter(node).some(comment => comment.loc.start.line === node.loc.end.line);
+  return sourceCode.getCommentsAfter(node).
+  some(comment => comment.loc.start.line === node.loc.end.line);
 }
 
 // Checks whether `node` has any comments _inside,_ except inside the `{...}`
@@ -223,7 +222,9 @@
   // Slice away the first token, since we're no looking for comments _before_
   // `node` (only inside). If there's a `{...}` part, look for comments before
   // the `{`, but not before the `}` (hence the `+1`s).
-  const someTokens = openBraceIndex >= 0 && closeBraceIndex >= 0 ? tokens.slice(1, openBraceIndex + 1).concat(tokens.slice(closeBraceIndex + 1)) : tokens.slice(1);
+  const someTokens = openBraceIndex >= 0 && closeBraceIndex >= 0 ?
+  tokens.slice(1, openBraceIndex + 1).concat(tokens.slice(closeBraceIndex + 1)) :
+  tokens.slice(1);
   return someTokens.some(token => sourceCode.getCommentsBefore(token).length > 0);
 }
 
@@ -231,23 +232,26 @@
   meta: {
     type: 'problem',
     docs: {
-      url: (0, _docsUrl2.default)('no-duplicates')
-    },
+      url: (0, _docsUrl2.default)('no-duplicates') },
+
     fixable: 'code',
-    schema: [{
+    schema: [
+    {
       type: 'object',
       properties: {
         considerQueryString: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
+          type: 'boolean' } },
+
+
+      additionalProperties: false }] },
+
+
+
 
   create: function (context) {
     // Prepare the resolver from options.
-    const considerQueryStringOption = context.options[0] && context.options[0]['considerQueryString'];
+    const considerQueryStringOption = context.options[0] &&
+    context.options[0]['considerQueryString'];
     const defaultResolver = sourcePath => (0, _resolve2.default)(sourcePath, context) || sourcePath;
     const resolver = considerQueryStringOption ? sourcePath => {
       const parts = sourcePath.match(/^([^?]*)\?(.*)$/);
@@ -264,7 +268,8 @@
       'ImportDeclaration': function (n) {
         // resolved path will cover aliased duplicates
         const resolvedPath = resolver(n.source.value);
-        const importMap = n.importKind === 'type' ? typesImported : hasNamespace(n) ? nsImported : imported;
+        const importMap = n.importKind === 'type' ? typesImported :
+        hasNamespace(n) ? nsImported : imported;
 
         if (importMap.has(resolvedPath)) {
           importMap.get(resolvedPath).push(n);
@@ -277,8 +282,7 @@
         checkImports(imported, context);
         checkImports(nsImported, context);
         checkImports(typesImported, context);
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1kdXBsaWNhdGVzLmpzIl0sIm5hbWVzIjpbImNoZWNrSW1wb3J0cyIsImltcG9ydGVkIiwiY29udGV4dCIsImVudHJpZXMiLCJtb2R1bGUiLCJub2RlcyIsImxlbmd0aCIsIm1lc3NhZ2UiLCJmaXJzdCIsInJlc3QiLCJzb3VyY2VDb2RlIiwiZ2V0U291cmNlQ29kZSIsImZpeCIsImdldEZpeCIsInJlcG9ydCIsIm5vZGUiLCJzb3VyY2UiLCJnZXRDb21tZW50c0JlZm9yZSIsInVuZGVmaW5lZCIsImhhc1Byb2JsZW1hdGljQ29tbWVudHMiLCJoYXNOYW1lc3BhY2UiLCJkZWZhdWx0SW1wb3J0TmFtZXMiLCJTZXQiLCJtYXAiLCJnZXREZWZhdWx0SW1wb3J0TmFtZSIsImZpbHRlciIsIkJvb2xlYW4iLCJzaXplIiwicmVzdFdpdGhvdXRDb21tZW50cyIsInNwZWNpZmllcnMiLCJ0b2tlbnMiLCJnZXRUb2tlbnMiLCJvcGVuQnJhY2UiLCJmaW5kIiwidG9rZW4iLCJpc1B1bmN0dWF0b3IiLCJjbG9zZUJyYWNlIiwiaW1wb3J0Tm9kZSIsInRleHQiLCJzbGljZSIsInJhbmdlIiwiaGFzVHJhaWxpbmdDb21tYSIsImdldFRva2VuQmVmb3JlIiwiaXNFbXB0eSIsImhhc1NwZWNpZmllcnMiLCJ1bm5lY2Vzc2FyeUltcG9ydHMiLCJzb21lIiwic3BlY2lmaWVyIiwic2hvdWxkQWRkRGVmYXVsdCIsInNob3VsZEFkZFNwZWNpZmllcnMiLCJzaG91bGRSZW1vdmVVbm5lY2Vzc2FyeSIsImZpeGVyIiwiZmlyc3RUb2tlbiIsImdldEZpcnN0VG9rZW4iLCJkZWZhdWx0SW1wb3J0TmFtZSIsImZpcnN0SGFzVHJhaWxpbmdDb21tYSIsImZpcnN0SXNFbXB0eSIsInJlZHVjZSIsInJlc3VsdCIsIm5lZWRzQ29tbWEiLCJzcGVjaWZpZXJzVGV4dCIsImZpeGVzIiwicHVzaCIsImluc2VydFRleHRBZnRlciIsImluc2VydFRleHRCZWZvcmUiLCJyZW1vdmUiLCJ2YWx1ZSIsInR5cGUiLCJkZWZhdWx0U3BlY2lmaWVyIiwibG9jYWwiLCJuYW1lIiwiaGFzQ29tbWVudEJlZm9yZSIsImhhc0NvbW1lbnRBZnRlciIsImhhc0NvbW1lbnRJbnNpZGVOb25TcGVjaWZpZXJzIiwiY29tbWVudCIsImxvYyIsImVuZCIsImxpbmUiLCJzdGFydCIsImdldENvbW1lbnRzQWZ0ZXIiLCJvcGVuQnJhY2VJbmRleCIsImZpbmRJbmRleCIsImNsb3NlQnJhY2VJbmRleCIsInNvbWVUb2tlbnMiLCJjb25jYXQiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJmaXhhYmxlIiwic2NoZW1hIiwicHJvcGVydGllcyIsImNvbnNpZGVyUXVlcnlTdHJpbmciLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImNyZWF0ZSIsImNvbnNpZGVyUXVlcnlTdHJpbmdPcHRpb24iLCJvcHRpb25zIiwiZGVmYXVsdFJlc29sdmVyIiwic291cmNlUGF0aCIsInJlc29sdmVyIiwicGFydHMiLCJtYXRjaCIsIk1hcCIsIm5zSW1wb3J0ZWQiLCJ0eXBlc0ltcG9ydGVkIiwibiIsInJlc29sdmVkUGF0aCIsImltcG9ydE1hcCIsImltcG9ydEtpbmQiLCJoYXMiLCJnZXQiLCJzZXQiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTs7OztBQUNBOzs7Ozs7Ozs7O0FBRUEsU0FBU0EsWUFBVCxDQUFzQkMsUUFBdEIsRUFBZ0NDLE9BQWhDLEVBQXlDO0FBQ3ZDLHFCQUE4QkQsU0FBU0UsT0FBVCxFQUE5QixFQUFrRDtBQUFBOztBQUFBLFVBQXRDQyxNQUFzQztBQUFBLFVBQTlCQyxLQUE4Qjs7QUFDaEQsUUFBSUEsTUFBTUMsTUFBTixHQUFlLENBQW5CLEVBQXNCO0FBQ3BCLFlBQU1DLFVBQVcsSUFBR0gsTUFBTyw0QkFBM0I7O0FBRG9CLDRCQUVLQyxLQUZMOztBQUFBLFlBRWJHLEtBRmE7QUFBQSxZQUVIQyxJQUZHOztBQUdwQixZQUFNQyxhQUFhUixRQUFRUyxhQUFSLEVBQW5CO0FBQ0EsWUFB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RyxNQUFNLENBQU4sQ0FBaEIsSUFBNEIsR0FBNUIsR0FBa0NBLE1BQU0sQ0FBTixDQUF6QztBQUNELEtBTmdCLEdBTVpILGVBTkw7O0FBUUEsVUFBTWhHLFdBQVcsSUFBSXFHLEdBQUosRUFBakI7QUFDQSxVQUFNQyxhQUFhLElBQUlELEdBQUosRUFBbkI7QUFDQSxVQUFNRSxnQkFBZ0IsSUFBSUYsR0FBSixFQUF0QjtBQUNBLFdBQU87QUFDTCwyQkFBcUIsVUFBVUcsQ0FBVixFQUFhO0FBQ2hDO0FBQ0EsY0FBTUMsZUFBZVAsU0FBU00sRUFBRXpGLE1BQUYsQ0FBU2tELEtBQWxCLENBQXJCO0FBQ0EsY0FBTXlDLFlBQVlGLEVBQUVHLFVBQUYsS0FBaUIsTUFBakIsR0FBMEJKLGFBQTFCLEdBQ2ZwRixhQUFhcUYsQ0FBYixJQUFrQkYsVUFBbEIsR0FBK0J0RyxRQURsQzs7QUFHQSxZQUFJMEcsVUFBVUUsR0FBVixDQUFjSCxZQUFkLENBQUosRUFBaUM7QUFDL0JDLG9CQUFVRyxHQUFWLENBQWNKLFlBQWQsRUFBNEI1QyxJQUE1QixDQUFpQzJDLENBQWpDO0FBQ0QsU0FGRCxNQUVPO0FBQ0xFLG9CQUFVSSxHQUFWLENBQWNMLFlBQWQsRUFBNEIsQ0FBQ0QsQ0FBRCxDQUE1QjtBQUNEO0FBQ0YsT0FaSTs7QUFjTCxzQkFBZ0IsWUFBWTtBQUMxQnpHLHFCQUFhQyxRQUFiLEVBQXVCQyxPQUF2QjtBQUNBRixxQkFBYXVHLFVBQWIsRUFBeUJyRyxPQUF6QjtBQUNBRixxQkFBYXdHLGFBQWIsRUFBNEJ0RyxPQUE1QjtBQUNEO0FBbEJJLEtBQVA7QUFvQkQ7QUF4RGMsQ0FBakIiLCJmaWxlIjoibm8tZHVwbGljYXRlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZXNvbHZlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVzb2x2ZSdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbmZ1bmN0aW9uIGNoZWNrSW1wb3J0cyhpbXBvcnRlZCwgY29udGV4dCkge1xuICBmb3IgKGNvbnN0IFttb2R1bGUsIG5vZGVzXSBvZiBpbXBvcnRlZC5lbnRyaWVzKCkpIHtcbiAgICBpZiAobm9kZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGAnJHttb2R1bGV9JyBpbXBvcnRlZCBtdWx0aXBsZSB0aW1lcy5gXG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gbm9kZXNcbiAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBjb250ZXh0LmdldFNvdXJjZUNvZGUoKVxuICAgICAgY29uc3QgZml4ID0gZ2V0Rml4KGZpcnN0LCByZXN0LCBzb3VyY2VDb2RlKVxuXG4gICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgIG5vZGU6IGZpcnN0LnNvdXJjZSxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgZml4LCAvLyBBdHRhY2ggdGhlIGF1dG9maXggKGlmIGFueSkgdG8gdGhlIGZpcnN0IGltcG9ydC5cbiAgICAgIH0pXG5cbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiByZXN0KSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICBub2RlOiBub2RlLnNvdXJjZSxcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRGaXgoZmlyc3QsIHJlc3QsIHNvdXJjZUNvZGUpIHtcbiAgLy8gU29ycnkgRVNMaW50IDw9IDMgdXNlcnMsIG5vIGF1dG9maXggZm9yIHlvdS4gQXV0b2ZpeGluZyBkdXBsaWNhdGUgaW1wb3J0c1xuICAvLyByZXF1aXJlcyBtdWx0aXBsZSBgZml4ZXIud2hhdGV2ZXIoKWAgY2FsbHMgaW4gdGhlIGBmaXhgOiBXZSBib3RoIG5lZWQgdG9cbiAgLy8gdXBkYXRlIHRoZSBmaXJzdCBvbmUsIGFuZCByZW1vdmUgdGhlIHJlc3QuIFN1cHBvcnQgZm9yIG11bHRpcGxlXG4gIC8vIGBmaXhlci53aGF0ZXZlcigpYCBpbiBhIHNpbmdsZSBgZml4YCB3YXMgYWRkZWQgaW4gRVNMaW50IDQuMS5cbiAgLy8gYHNvdXJjZUNvZGUuZ2V0Q29tbWVudHNCZWZvcmVgIHdhcyBhZGRlZCBpbiA0LjAsIHNvIHRoYXQncyBhbiBlYXN5IHRoaW5nIHRvXG4gIC8vIGNoZWNrIGZvci5cbiAgaWYgKHR5cGVvZiBzb3VyY2VDb2RlLmdldENvbW1lbnRzQmVmb3JlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLy8gQWRqdXN0aW5nIHRoZSBmaXJzdCBpbXBvcnQgbWlnaHQgbWFrZSBpdCBtdWx0aWxpbmUsIHdoaWNoIGNvdWxkIGJyZWFrXG4gIC8vIGBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVgIGNvbW1lbnRzIGFuZCBzaW1pbGFyLCBzbyBiYWlsIGlmIHRoZSBmaXJzdFxuICAvLyBpbXBvcnQgaGFzIGNvbW1lbnRzLiBBbHNvLCBpZiB0aGUgZmlyc3QgaW1wb3J0IGlzIGBpbXBvcnQgKiBhcyBucyBmcm9tXG4gIC8vICcuL2ZvbydgIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8uXG4gIGlmIChoYXNQcm9ibGVtYXRpY0NvbW1lbnRzKGZpcnN0LCBzb3VyY2VDb2RlKSB8fCBoYXNOYW1lc3BhY2UoZmlyc3QpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgZGVmYXVsdEltcG9ydE5hbWVzID0gbmV3IFNldChcbiAgICBbZmlyc3QsIC4uLnJlc3RdLm1hcChnZXREZWZhdWx0SW1wb3J0TmFtZSkuZmlsdGVyKEJvb2xlYW4pXG4gIClcblxuICAvLyBCYWlsIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBkaWZmZXJlbnQgZGVmYXVsdCBpbXBvcnQgbmFtZXMg4oCTIGl0J3MgdXAgdG8gdGhlXG4gIC8vIHVzZXIgdG8gY2hvb3NlIHdoaWNoIG9uZSB0byBrZWVwLlxuICBpZiAoZGVmYXVsdEltcG9ydE5hbWVzLnNpemUgPiAxKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLy8gTGVhdmUgaXQgdG8gdGhlIHVzZXIgdG8gaGFuZGxlIGNvbW1lbnRzLiBBbHNvIHNraXAgYGltcG9ydCAqIGFzIG5zIGZyb21cbiAgLy8gJy4vZm9vJ2AgaW1wb3J0cywgc2luY2UgdGhleSBjYW5ub3QgYmUgbWVyZ2VkIGludG8gYW5vdGhlciBpbXBvcnQuXG4gIGNvbnN0IHJlc3RXaXRob3V0Q29tbWVudHMgPSByZXN0LmZpbHRlcihub2RlID0+ICEoXG4gICAgaGFzUHJvYmxlbWF0aWNDb21tZW50cyhub2RlLCBzb3VyY2VDb2RlKSB8fFxuICAgIGhhc05hbWVzcGFjZShub2RlKVxuICApKVxuXG4gIGNvbnN0IHNwZWNpZmllcnMgPSByZXN0V2l0aG91dENvbW1lbnRzXG4gICAgLm1hcChub2RlID0+IHtcbiAgICAgIGNvbnN0IHRva2VucyA9IHNvdXJjZUNvZGUuZ2V0VG9rZW5zKG5vZGUpXG4gICAgICBjb25zdCBvcGVuQnJhY2UgPSB0b2tlbnMuZmluZCh0b2tlbiA9PiBpc1B1bmN0dWF0b3IodG9rZW4sICd7JykpXG4gICAgICBjb25zdCBjbG9zZUJyYWNlID0gdG9rZW5zLmZpbmQodG9rZW4gPT4gaXNQdW5jdHVhdG9yKHRva2VuLCAnfScpKVxuXG4gICAgICBpZiAob3BlbkJyYWNlID09IG51bGwgfHwgY2xvc2VCcmFjZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW1wb3J0Tm9kZTogbm9kZSxcbiAgICAgICAgdGV4dDogc291cmNlQ29kZS50ZXh0LnNsaWNlKG9wZW5CcmFjZS5yYW5nZVsxXSwgY2xvc2VCcmFjZS5yYW5nZVswXSksXG4gICAgICAgIGhhc1RyYWlsaW5nQ29tbWE6IGlzUHVuY3R1YXRvcihzb3VyY2VDb2RlLmdldFRva2VuQmVmb3JlKGNsb3NlQnJhY2UpLCAnLCcpLFxuICAgICAgICBpc0VtcHR5OiAhaGFzU3BlY2lmaWVycyhub2RlKSxcbiAgICAgIH1cbiAgICB9KVxuICAgIC5maWx0ZXIoQm9vbGVhbilcblxuICBjb25zdCB1bm5lY2Vzc2FyeUltcG9ydHMgPSByZXN0V2l0aG91dENvbW1lbnRzLmZpbHRlcihub2RlID0+XG4gICAgIWhhc1NwZWNpZmllcnMobm9kZSkgJiZcbiAgICAhaGFzTmFtZXNwYWNlKG5vZGUpICYmXG4gICAgIXNwZWNpZmllcnMuc29tZShzcGVjaWZpZXIgPT4gc3BlY2lmaWVyLmltcG9ydE5vZGUgPT09IG5vZGUpXG4gIClcblxuICBjb25zdCBzaG91bGRBZGREZWZhdWx0ID0gZ2V0RGVmYXVsdEltcG9ydE5hbWUoZmlyc3QpID09IG51bGwgJiYgZGVmYXVsdEltcG9ydE5hbWVzLnNpemUgPT09IDFcbiAgY29uc3Qgc2hvdWxkQWRkU3BlY2lmaWVycyA9IHNwZWNpZmllcnMubGVuZ3RoID4gMFxuICBjb25zdCBzaG91bGRSZW1vdmVVbm5lY2Vzc2FyeSA9IHVubmVjZXNzYXJ5SW1wb3J0cy5sZW5ndGggPiAwXG5cbiAgaWYgKCEoc2hvdWxkQWRkRGVmYXVsdCB8fCBzaG91bGRBZGRTcGVjaWZpZXJzIHx8IHNob3VsZFJlbW92ZVVubmVjZXNzYXJ5KSkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHJldHVybiBmaXhlciA9PiB7XG4gICAgY29uc3QgdG9rZW5zID0gc291cmNlQ29kZS5nZXRUb2tlbnMoZmlyc3QpXG4gICAgY29uc3Qgb3BlbkJyYWNlID0gdG9rZW5zLmZpbmQodG9rZW4gPT4gaXNQdW5jdHVhdG9yKHRva2VuLCAneycpKVxuICAgIGNvbnN0IGNsb3NlQnJhY2UgPSB0b2tlbnMuZmluZCh0b2tlbiA9PiBpc1B1bmN0dWF0b3IodG9rZW4sICd9JykpXG4gICAgY29uc3QgZmlyc3RUb2tlbiA9IHNvdXJjZUNvZGUuZ2V0Rmlyc3RUb2tlbihmaXJzdClcbiAgICBjb25zdCBbZGVmYXVsdEltcG9ydE5hbWVdID0gZGVmYXVsdEltcG9ydE5hbWVzXG5cbiAgICBjb25zdCBmaXJzdEhhc1RyYWlsaW5nQ29tbWEgPVxuICAgICAgY2xvc2VCcmFjZSAhPSBudWxsICYmXG4gICAgICBpc1B1bmN0dWF0b3Ioc291cmNlQ29kZS5nZXRUb2tlbkJlZm9yZShjbG9zZUJyYWNlKSwgJywnKVxuICAgIGNvbnN0IGZpcnN0SXNFbXB0eSA9ICFoYXNTcGVjaWZpZXJzKGZpcnN0KVxuXG4gICAgY29uc3QgW3NwZWNpZmllcnNUZXh0XSA9IHNwZWNpZmllcnMucmVkdWNlKFxuICAgICAgKFtyZXN1bHQsIG5lZWRzQ29tbWFdLCBzcGVjaWZpZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBuZWVkc0NvbW1hICYmICFzcGVjaWZpZXIuaXNFbXB0eVxuICAgICAgICAgICAgPyBgJHtyZXN1bHR9LCR7c3BlY2lmaWVyLnRleHR9YFxuICAgICAgICAgICAgOiBgJHtyZXN1bHR9JHtzcGVjaWZpZXIudGV4dH1gLFxuICAgICAgICAgIHNwZWNpZmllci5pc0VtcHR5ID8gbmVlZHNDb21tYSA6IHRydWUsXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBbJycsICFmaXJzdEhhc1RyYWlsaW5nQ29tbWEgJiYgIWZpcnN0SXNFbXB0eV1cbiAgICApXG5cbiAgICBjb25zdCBmaXhlcyA9IFtdXG5cbiAgICBpZiAoc2hvdWxkQWRkRGVmYXVsdCAmJiBvcGVuQnJhY2UgPT0gbnVsbCAmJiBzaG91bGRBZGRTcGVjaWZpZXJzKSB7XG4gICAgICAvLyBgaW1wb3J0ICcuL2ZvbydgIOKGkiBgaW1wb3J0IGRlZiwgey4uLn0gZnJvbSAnLi9mb28nYFxuICAgICAgZml4ZXMucHVzaChcbiAgICAgICAgZml4ZXIuaW5zZXJ0VGV4dEFmdGVyKGZpcnN0VG9rZW4sIGAgJHtkZWZhdWx0SW1wb3J0TmFtZX0sIHske3NwZWNpZmllcnNUZXh0fX0gZnJvbWApXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChzaG91bGRBZGREZWZhdWx0ICYmIG9wZW5CcmFjZSA9PSBudWxsICYmICFzaG91bGRBZGRTcGVjaWZpZXJzKSB7XG4gICAgICAvLyBgaW1wb3J0ICcuL2ZvbydgIOKGkiBgaW1wb3J0IGRlZiBmcm9tICcuL2ZvbydgXG4gICAgICBmaXhlcy5wdXNoKGZpeGVyLmluc2VydFRleHRBZnRlcihmaXJzdFRva2VuLCBgICR7ZGVmYXVsdEltcG9ydE5hbWV9IGZyb21gKSlcbiAgICB9IGVsc2UgaWYgKHNob3VsZEFkZERlZmF1bHQgJiYgb3BlbkJyYWNlICE9IG51bGwgJiYgY2xvc2VCcmFjZSAhPSBudWxsKSB7XG4gICAgICAvLyBgaW1wb3J0IHsuLi59IGZyb20gJy4vZm9vJ2Ag4oaSIGBpbXBvcnQgZGVmLCB7Li4ufSBmcm9tICcuL2ZvbydgXG4gICAgICBmaXhlcy5wdXNoKGZpeGVyLmluc2VydFRleHRBZnRlcihmaXJzdFRva2VuLCBgICR7ZGVmYXVsdEltcG9ydE5hbWV9LGApKVxuICAgICAgaWYgKHNob3VsZEFkZFNwZWNpZmllcnMpIHtcbiAgICAgICAgLy8gYGltcG9ydCBkZWYsIHsuLi59IGZyb20gJy4vZm9vJ2Ag4oaSIGBpbXBvcnQgZGVmLCB7Li4uLCAuLi59IGZyb20gJy4vZm9vJ2BcbiAgICAgICAgZml4ZXMucHVzaChmaXhlci5pbnNlcnRUZXh0QmVmb3JlKGNsb3NlQnJhY2UsIHNwZWNpZmllcnNUZXh0KSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFzaG91bGRBZGREZWZhdWx0ICYmIG9wZW5CcmFjZSA9PSBudWxsICYmIHNob3VsZEFkZFNwZWNpZmllcnMpIHtcbiAgICAgIC8vIGBpbXBvcnQgJy4vZm9vJ2Ag4oaSIGBpbXBvcnQgey4uLn0gZnJvbSAnLi9mb28nYFxuICAgICAgZml4ZXMucHVzaChmaXhlci5pbnNlcnRUZXh0QWZ0ZXIoZmlyc3RUb2tlbiwgYCB7JHtzcGVjaWZpZXJzVGV4dH19IGZyb21gKSlcbiAgICB9IGVsc2UgaWYgKCFzaG91bGRBZGREZWZhdWx0ICYmIG9wZW5CcmFjZSAhPSBudWxsICYmIGNsb3NlQnJhY2UgIT0gbnVsbCkge1xuICAgICAgLy8gYGltcG9ydCB7Li4ufSAnLi9mb28nYCDihpIgYGltcG9ydCB7Li4uLCAuLi59IGZyb20gJy4vZm9vJ2BcbiAgICAgIGZpeGVzLnB1c2goZml4ZXIuaW5zZXJ0VGV4dEJlZm9yZShjbG9zZUJyYWNlLCBzcGVjaWZpZXJzVGV4dCkpXG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGltcG9ydHMgd2hvc2Ugc3BlY2lmaWVycyBoYXZlIGJlZW4gbW92ZWQgaW50byB0aGUgZmlyc3QgaW1wb3J0LlxuICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIHNwZWNpZmllcnMpIHtcbiAgICAgIGZpeGVzLnB1c2goZml4ZXIucmVtb3ZlKHNwZWNpZmllci5pbXBvcnROb2RlKSlcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgaW1wb3J0cyB3aG9zZSBkZWZhdWx0IGltcG9ydCBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgZmlyc3QgaW1wb3J0LFxuICAgIC8vIGFuZCBzaWRlLWVmZmVjdC1vbmx5IGltcG9ydHMgdGhhdCBhcmUgdW5uZWNlc3NhcnkgZHVlIHRvIHRoZSBmaXJzdFxuICAgIC8vIGltcG9ydC5cbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdW5uZWNlc3NhcnlJbXBvcnRzKSB7XG4gICAgICBmaXhlcy5wdXNoKGZpeGVyLnJlbW92ZShub2RlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gZml4ZXNcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1B1bmN0dWF0b3Iobm9kZSwgdmFsdWUpIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ1B1bmN0dWF0b3InICYmIG5vZGUudmFsdWUgPT09IHZhbHVlXG59XG5cbi8vIEdldCB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBpbXBvcnQgb2YgYG5vZGVgLCBpZiBhbnkuXG5mdW5jdGlvbiBnZXREZWZhdWx0SW1wb3J0TmFtZShub2RlKSB7XG4gIGNvbnN0IGRlZmF1bHRTcGVjaWZpZXIgPSBub2RlLnNwZWNpZmllcnNcbiAgICAuZmluZChzcGVjaWZpZXIgPT4gc3BlY2lmaWVyLnR5cGUgPT09ICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJylcbiAgcmV0dXJuIGRlZmF1bHRTcGVjaWZpZXIgIT0gbnVsbCA/IGRlZmF1bHRTcGVjaWZpZXIubG9jYWwubmFtZSA6IHVuZGVmaW5lZFxufVxuXG4vLyBDaGVja3Mgd2hldGhlciBgbm9kZWAgaGFzIGEgbmFtZXNwYWNlIGltcG9ydC5cbmZ1bmN0aW9uIGhhc05hbWVzcGFjZShub2RlKSB7XG4gIGNvbnN0IHNwZWNpZmllcnMgPSBub2RlLnNwZWNpZmllcnNcbiAgICAuZmlsdGVyKHNwZWNpZmllciA9PiBzcGVjaWZpZXIudHlwZSA9PT0gJ0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllcicpXG4gIHJldHVybiBzcGVjaWZpZXJzLmxlbmd0aCA+IDBcbn1cblxuLy8gQ2hlY2tzIHdoZXRoZXIgYG5vZGVgIGhhcyBhbnkgbm9uLWRlZmF1bHQgc3BlY2lmaWVycy5cbmZ1bmN0aW9uIGhhc1NwZWNpZmllcnMobm9kZSkge1xuICBjb25zdCBzcGVjaWZpZXJzID0gbm9kZS5zcGVjaWZpZXJzXG4gICAgLmZpbHRlcihzcGVjaWZpZXIgPT4gc3BlY2lmaWVyLnR5cGUgPT09ICdJbXBvcnRTcGVjaWZpZXInKVxuICByZXR1cm4gc3BlY2lmaWVycy5sZW5ndGggPiAwXG59XG5cbi8vIEl0J3Mgbm90IG9idmlvdXMgd2hhdCB0aGUgdXNlciB3YW50cyB0byBkbyB3aXRoIGNvbW1lbnRzIGFzc29jaWF0ZWQgd2l0aFxuLy8gZHVwbGljYXRlIGltcG9ydHMsIHNvIHNraXAgaW1wb3J0cyB3aXRoIGNvbW1lbnRzIHdoZW4gYXV0b2ZpeGluZy5cbmZ1bmN0aW9uIGhhc1Byb2JsZW1hdGljQ29tbWVudHMobm9kZSwgc291cmNlQ29kZSkge1xuICByZXR1cm4gKFxuICAgIGhhc0NvbW1lbnRCZWZvcmUobm9kZSwgc291cmNlQ29kZSkgfHxcbiAgICBoYXNDb21tZW50QWZ0ZXIobm9kZSwgc291cmNlQ29kZSkgfHxcbiAgICBoYXNDb21tZW50SW5zaWRlTm9uU3BlY2lmaWVycyhub2RlLCBzb3VyY2VDb2RlKVxuICApXG59XG5cbi8vIENoZWNrcyB3aGV0aGVyIGBub2RlYCBoYXMgYSBjb21tZW50ICh0aGF0IGVuZHMpIG9uIHRoZSBwcmV2aW91cyBsaW5lIG9yIG9uXG4vLyB0aGUgc2FtZSBsaW5lIGFzIGBub2RlYCAoc3RhcnRzKS5cbmZ1bmN0aW9uIGhhc0NvbW1lbnRCZWZvcmUobm9kZSwgc291cmNlQ29kZSkge1xuICByZXR1cm4gc291cmNlQ29kZS5nZXRDb21tZW50c0JlZm9yZShub2RlKVxuICAgIC5zb21lKGNvbW1lbnQgPT4gY29tbWVudC5sb2MuZW5kLmxpbmUgPj0gbm9kZS5sb2Muc3RhcnQubGluZSAtIDEpXG59XG5cbi8vIENoZWNrcyB3aGV0aGVyIGBub2RlYCBoYXMgYSBjb21tZW50ICh0aGF0IHN0YXJ0cykgb24gdGhlIHNhbWUgbGluZSBhcyBgbm9kZWBcbi8vIChlbmRzKS5cbmZ1bmN0aW9uIGhhc0NvbW1lbnRBZnRlcihub2RlLCBzb3VyY2VDb2RlKSB7XG4gIHJldHVybiBzb3VyY2VDb2RlLmdldENvbW1lbnRzQWZ0ZXIobm9kZSlcbiAgICAuc29tZShjb21tZW50ID0+IGNvbW1lbnQubG9jLnN0YXJ0LmxpbmUgPT09IG5vZGUubG9jLmVuZC5saW5lKVxufVxuXG4vLyBDaGVja3Mgd2hldGhlciBgbm9kZWAgaGFzIGFueSBjb21tZW50cyBfaW5zaWRlLF8gZXhjZXB0IGluc2lkZSB0aGUgYHsuLi59YFxuLy8gcGFydCAoaWYgYW55KS5cbmZ1bmN0aW9uIGhhc0NvbW1lbnRJbnNpZGVOb25TcGVjaWZpZXJzKG5vZGUsIHNvdXJjZUNvZGUpIHtcbiAgY29uc3QgdG9rZW5zID0gc291cmNlQ29kZS5nZXRUb2tlbnMobm9kZSlcbiAgY29uc3Qgb3BlbkJyYWNlSW5kZXggPSB0b2tlbnMuZmluZEluZGV4KHRva2VuID0+IGlzUHVuY3R1YXRvcih0b2tlbiwgJ3snKSlcbiAgY29uc3QgY2xvc2VCcmFjZUluZGV4ID0gdG9rZW5zLmZpbmRJbmRleCh0b2tlbiA9PiBpc1B1bmN0dWF0b3IodG9rZW4sICd9JykpXG4gIC8vIFNsaWNlIGF3YXkgdGhlIGZpcnN0IHRva2VuLCBzaW5jZSB3ZSdyZSBubyBsb29raW5nIGZvciBjb21tZW50cyBfYmVmb3JlX1xuICAvLyBgbm9kZWAgKG9ubHkgaW5zaWRlKS4gSWYgdGhlcmUncyBhIGB7Li4ufWAgcGFydCwgbG9vayBmb3IgY29tbWVudHMgYmVmb3JlXG4gIC8vIHRoZSBge2AsIGJ1dCBub3QgYmVmb3JlIHRoZSBgfWAgKGhlbmNlIHRoZSBgKzFgcykuXG4gIGNvbnN0IHNvbWVUb2tlbnMgPSBvcGVuQnJhY2VJbmRleCA+PSAwICYmIGNsb3NlQnJhY2VJbmRleCA+PSAwXG4gICAgPyB0b2tlbnMuc2xpY2UoMSwgb3BlbkJyYWNlSW5kZXggKyAxKS5jb25jYXQodG9rZW5zLnNsaWNlKGNsb3NlQnJhY2VJbmRleCArIDEpKVxuICAgIDogdG9rZW5zLnNsaWNlKDEpXG4gIHJldHVybiBzb21lVG9rZW5zLnNvbWUodG9rZW4gPT4gc291cmNlQ29kZS5nZXRDb21tZW50c0JlZm9yZSh0b2tlbikubGVuZ3RoID4gMClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAncHJvYmxlbScsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1kdXBsaWNhdGVzJyksXG4gICAgfSxcbiAgICBmaXhhYmxlOiAnY29kZScsXG4gICAgc2NoZW1hOiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgY29uc2lkZXJRdWVyeVN0cmluZzoge1xuICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgLy8gUHJlcGFyZSB0aGUgcmVzb2x2ZXIgZnJvbSBvcHRpb25zLlxuICAgIGNvbnN0IGNvbnNpZGVyUXVlcnlTdHJpbmdPcHRpb24gPSBjb250ZXh0Lm9wdGlvbnNbMF0gJiZcbiAgICAgIGNvbnRleHQub3B0aW9uc1swXVsnY29uc2lkZXJRdWVyeVN0cmluZyddXG4gICAgY29uc3QgZGVmYXVsdFJlc29sdmVyID0gc291cmNlUGF0aCA9PiByZXNvbHZlKHNvdXJjZVBhdGgsIGNvbnRleHQpIHx8IHNvdXJjZVBhdGhcbiAgICBjb25zdCByZXNvbHZlciA9IGNvbnNpZGVyUXVlcnlTdHJpbmdPcHRpb24gPyAoc291cmNlUGF0aCA9PiB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHNvdXJjZVBhdGgubWF0Y2goL14oW14/XSopXFw/KC4qKSQvKVxuICAgICAgaWYgKCFwYXJ0cykge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFJlc29sdmVyKHNvdXJjZVBhdGgpXG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmYXVsdFJlc29sdmVyKHBhcnRzWzFdKSArICc/JyArIHBhcnRzWzJdXG4gICAgfSkgOiBkZWZhdWx0UmVzb2x2ZXJcblxuICAgIGNvbnN0IGltcG9ydGVkID0gbmV3IE1hcCgpXG4gICAgY29uc3QgbnNJbXBvcnRlZCA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IHR5cGVzSW1wb3J0ZWQgPSBuZXcgTWFwKClcbiAgICByZXR1cm4ge1xuICAgICAgJ0ltcG9ydERlY2xhcmF0aW9uJzogZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgLy8gcmVzb2x2ZWQgcGF0aCB3aWxsIGNvdmVyIGFsaWFzZWQgZHVwbGljYXRlc1xuICAgICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlcihuLnNvdXJjZS52YWx1ZSlcbiAgICAgICAgY29uc3QgaW1wb3J0TWFwID0gbi5pbXBvcnRLaW5kID09PSAndHlwZScgPyB0eXBlc0ltcG9ydGVkIDpcbiAgICAgICAgICAoaGFzTmFtZXNwYWNlKG4pID8gbnNJbXBvcnRlZCA6IGltcG9ydGVkKVxuXG4gICAgICAgIGlmIChpbXBvcnRNYXAuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICAgICAgICBpbXBvcnRNYXAuZ2V0KHJlc29sdmVkUGF0aCkucHVzaChuKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGltcG9ydE1hcC5zZXQocmVzb2x2ZWRQYXRoLCBbbl0pXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgICdQcm9ncmFtOmV4aXQnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoZWNrSW1wb3J0cyhpbXBvcnRlZCwgY29udGV4dClcbiAgICAgICAgY2hlY2tJbXBvcnRzKG5zSW1wb3J0ZWQsIGNvbnRleHQpXG4gICAgICAgIGNoZWNrSW1wb3J0cyh0eXBlc0ltcG9ydGVkLCBjb250ZXh0KVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1kdXBsaWNhdGVzLmpzIl0sIm5hbWVzIjpbImNoZWNrSW1wb3J0cyIsImltcG9ydGVkIiwiY29udGV4dCIsImVudHJpZXMiLCJtb2R1bGUiLCJub2RlcyIsImxlbmd0aCIsIm1lc3NhZ2UiLCJmaXJzdCIsInJlc3QiLCJzb3VyY2VDb2RlIiwiZ2V0U291cmNlQ29kZSIsImZpeCIsImdldEZpeCIsInJlcG9ydCIsIm5vZGUiLCJzb3VyY2UiLCJnZXRDb21tZW50c0JlZm9yZSIsInVuZGVmaW5lZCIsImhhc1Byb2JsZW1hdGljQ29tbWVudHMiLCJoYXNOYW1lc3BhY2UiLCJkZWZhdWx0SW1wb3J0TmFtZXMiLCJTZXQiLCJtYXAiLCJnZXREZWZhdWx0SW1wb3J0TmFtZSIsImZpbHRlciIsIkJvb2xlYW4iLCJzaXplIiwicmVzdFdpdGhvdXRDb21tZW50cyIsInNwZWNpZmllcnMiLCJ0b2tlbnMiLCJnZXRUb2tlbnMiLCJvcGVuQnJhY2UiLCJmaW5kIiwidG9rZW4iLCJpc1B1bmN0dWF0b3IiLCJjbG9zZUJyYWNlIiwiaW1wb3J0Tm9kZSIsInRleHQiLCJzbGljZSIsInJhbmdlIiwiaGFzVHJhaWxpbmdDb21tYSIsImdldFRva2VuQmVmb3JlIiwiaXNFbXB0eSIsImhhc1NwZWNpZmllcnMiLCJ1bm5lY2Vzc2FyeUltcG9ydHMiLCJzb21lIiwic3BlY2lmaWVyIiwic2hvdWxkQWRkRGVmYXVsdCIsInNob3VsZEFkZFNwZWNpZmllcnMiLCJzaG91bGRSZW1vdmVVbm5lY2Vzc2FyeSIsImZpeGVyIiwiZmlyc3RUb2tlbiIsImdldEZpcnN0VG9rZW4iLCJkZWZhdWx0SW1wb3J0TmFtZSIsImZpcnN0SGFzVHJhaWxpbmdDb21tYSIsImZpcnN0SXNFbXB0eSIsInJlZHVjZSIsInJlc3VsdCIsIm5lZWRzQ29tbWEiLCJzcGVjaWZpZXJzVGV4dCIsImZpeGVzIiwicHVzaCIsImluc2VydFRleHRBZnRlciIsImluc2VydFRleHRCZWZvcmUiLCJyZW1vdmUiLCJ2YWx1ZSIsInR5cGUiLCJkZWZhdWx0U3BlY2lmaWVyIiwibG9jYWwiLCJuYW1lIiwiaGFzQ29tbWVudEJlZm9yZSIsImhhc0NvbW1lbnRBZnRlciIsImhhc0NvbW1lbnRJbnNpZGVOb25TcGVjaWZpZXJzIiwiY29tbWVudCIsImxvYyIsImVuZCIsImxpbmUiLCJzdGFydCIsImdldENvbW1lbnRzQWZ0ZXIiLCJvcGVuQnJhY2VJbmRleCIsImZpbmRJbmRleCIsImNsb3NlQnJhY2VJbmRleCIsInNvbWVUb2tlbnMiLCJjb25jYXQiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJmaXhhYmxlIiwic2NoZW1hIiwicHJvcGVydGllcyIsImNvbnNpZGVyUXVlcnlTdHJpbmciLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImNyZWF0ZSIsImNvbnNpZGVyUXVlcnlTdHJpbmdPcHRpb24iLCJvcHRpb25zIiwiZGVmYXVsdFJlc29sdmVyIiwic291cmNlUGF0aCIsInJlc29sdmVyIiwicGFydHMiLCJtYXRjaCIsIk1hcCIsIm5zSW1wb3J0ZWQiLCJ0eXBlc0ltcG9ydGVkIiwibiIsInJlc29sdmVkUGF0aCIsImltcG9ydE1hcCIsImltcG9ydEtpbmQiLCJoYXMiLCJnZXQiLCJzZXQiXSwibWFwcGluZ3MiOiJxb0JBQUEsc0Q7QUFDQSxxQzs7QUFFQSxTQUFTQSxZQUFULENBQXNCQyxRQUF0QixFQUFnQ0MsT0FBaEMsRUFBeUM7QUFDdkMscUJBQThCRCxTQUFTRSxPQUFULEVBQTlCLEVBQWtELDJDQUF0Q0MsTUFBc0Msa0JBQTlCQyxLQUE4QjtBQUNoRCxRQUFJQSxNQUFNQyxNQUFOLEdBQWUsQ0FBbkIsRUFBc0I7QUFDcEIsWUFBTUMsVUFBVyxJQUFHSCxNQUFPLDRCQUEzQixDQURvQjtBQUVLQyxXQUZMLFFBRWJHLEtBRmEsYUFFSEMsSUFGRztBQUdwQixZQUFNQyxhQUFhUixRQUFRUyxhQUFSLEVBQW5CO0FBQ0EsWUFBTUMsTUFBTUMsT0FBT0wsS0FBUCxFQUFjQyxJQUFkLEVBQW9C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c29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJ1xuaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcblxuZnVuY3Rpb24gY2hlY2tJbXBvcnRzKGltcG9ydGVkLCBjb250ZXh0KSB7XG4gIGZvciAoY29uc3QgW21vZHVsZSwgbm9kZXNdIG9mIGltcG9ydGVkLmVudHJpZXMoKSkge1xuICAgIGlmIChub2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYCcke21vZHVsZX0nIGltcG9ydGVkIG11bHRpcGxlIHRpbWVzLmBcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBub2Rlc1xuICAgICAgY29uc3Qgc291cmNlQ29kZSA9IGNvbnRleHQuZ2V0U291cmNlQ29kZSgpXG4gICAgICBjb25zdCBmaXggPSBnZXRGaXgoZmlyc3QsIHJlc3QsIHNvdXJjZUNvZGUpXG5cbiAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgbm9kZTogZmlyc3Quc291cmNlLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBmaXgsIC8vIEF0dGFjaCB0aGUgYXV0b2ZpeCAoaWYgYW55KSB0byB0aGUgZmlyc3QgaW1wb3J0LlxuICAgICAgfSlcblxuICAgICAgZm9yIChjb25zdCBub2RlIG9mIHJlc3QpIHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgIG5vZGU6IG5vZGUuc291cmNlLFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEZpeChmaXJzdCwgcmVzdCwgc291cmNlQ29kZSkge1xuICAvLyBTb3JyeSBFU0xpbnQgPD0gMyB1c2Vycywgbm8gYXV0b2ZpeCBmb3IgeW91LiBBdXRvZml4aW5nIGR1cGxpY2F0ZSBpbXBvcnRzXG4gIC8vIHJlcXVpcmVzIG11bHRpcGxlIGBmaXhlci53aGF0ZXZlcigpYCBjYWxscyBpbiB0aGUgYGZpeGA6IFdlIGJvdGggbmVlZCB0b1xuICAvLyB1cGRhdGUgdGhlIGZpcnN0IG9uZSwgYW5kIHJlbW92ZSB0aGUgcmVzdC4gU3VwcG9ydCBmb3IgbXVsdGlwbGVcbiAgLy8gYGZpeGVyLndoYXRldmVyKClgIGluIGEgc2luZ2xlIGBmaXhgIHdhcyBhZGRlZCBpbiBFU0xpbnQgNC4xLlxuICAvLyBgc291cmNlQ29kZS5nZXRDb21tZW50c0JlZm9yZWAgd2FzIGFkZGVkIGluIDQuMCwgc28gdGhhdCdzIGFuIGVhc3kgdGhpbmcgdG9cbiAgLy8gY2hlY2sgZm9yLlxuICBpZiAodHlwZW9mIHNvdXJjZUNvZGUuZ2V0Q29tbWVudHNCZWZvcmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvLyBBZGp1c3RpbmcgdGhlIGZpcnN0IGltcG9ydCBtaWdodCBtYWtlIGl0IG11bHRpbGluZSwgd2hpY2ggY291bGQgYnJlYWtcbiAgLy8gYGVzbGludC1kaXNhYmxlLW5leHQtbGluZWAgY29tbWVudHMgYW5kIHNpbWlsYXIsIHNvIGJhaWwgaWYgdGhlIGZpcnN0XG4gIC8vIGltcG9ydCBoYXMgY29tbWVudHMuIEFsc28sIGlmIHRoZSBmaXJzdCBpbXBvcnQgaXMgYGltcG9ydCAqIGFzIG5zIGZyb21cbiAgLy8gJy4vZm9vJ2AgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkby5cbiAgaWYgKGhhc1Byb2JsZW1hdGljQ29tbWVudHMoZmlyc3QsIHNvdXJjZUNvZGUpIHx8IGhhc05hbWVzcGFjZShmaXJzdCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBkZWZhdWx0SW1wb3J0TmFtZXMgPSBuZXcgU2V0KFxuICAgIFtmaXJzdCwgLi4ucmVzdF0ubWFwKGdldERlZmF1bHRJbXBvcnROYW1lKS5maWx0ZXIoQm9vbGVhbilcbiAgKVxuXG4gIC8vIEJhaWwgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGRpZmZlcmVudCBkZWZhdWx0IGltcG9ydCBuYW1lcyDigJMgaXQncyB1cCB0byB0aGVcbiAgLy8gdXNlciB0byBjaG9vc2Ugd2hpY2ggb25lIHRvIGtlZXAuXG4gIGlmIChkZWZhdWx0SW1wb3J0TmFtZXMuc2l6ZSA+IDEpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvLyBMZWF2ZSBpdCB0byB0aGUgdXNlciB0byBoYW5kbGUgY29tbWVudHMuIEFsc28gc2tpcCBgaW1wb3J0ICogYXMgbnMgZnJvbVxuICAvLyAnLi9mb28nYCBpbXBvcnRzLCBzaW5jZSB0aGV5IGNhbm5vdCBiZSBtZXJnZWQgaW50byBhbm90aGVyIGltcG9ydC5cbiAgY29uc3QgcmVzdFdpdGhvdXRDb21tZW50cyA9IHJlc3QuZmlsdGVyKG5vZGUgPT4gIShcbiAgICBoYXNQcm9ibGVtYXRpY0NvbW1lbnRzKG5vZGUsIHNvdXJjZUNvZGUpIHx8XG4gICAgaGFzTmFtZXNwYWNlKG5vZGUpXG4gICkpXG5cbiAgY29uc3Qgc3BlY2lmaWVycyA9IHJlc3RXaXRob3V0Q29tbWVudHNcbiAgICAubWFwKG5vZGUgPT4ge1xuICAgICAgY29uc3QgdG9rZW5zID0gc291cmNlQ29kZS5nZXRUb2tlbnMobm9kZSlcbiAgICAgIGNvbnN0IG9wZW5CcmFjZSA9IHRva2Vucy5maW5kKHRva2VuID0+IGlzUHVuY3R1YXRvcih0b2tlbiwgJ3snKSlcbiAgICAgIGNvbnN0IGNsb3NlQnJhY2UgPSB0b2tlbnMuZmluZCh0b2tlbiA9PiBpc1B1bmN0dWF0b3IodG9rZW4sICd9JykpXG5cbiAgICAgIGlmIChvcGVuQnJhY2UgPT0gbnVsbCB8fCBjbG9zZUJyYWNlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbXBvcnROb2RlOiBub2RlLFxuICAgICAgICB0ZXh0OiBzb3VyY2VDb2RlLnRleHQuc2xpY2Uob3BlbkJyYWNlLnJhbmdlWzFdLCBjbG9zZUJyYWNlLnJhbmdlWzBdKSxcbiAgICAgICAgaGFzVHJhaWxpbmdDb21tYTogaXNQdW5jdHVhdG9yKHNvdXJjZUNvZGUuZ2V0VG9rZW5CZWZvcmUoY2xvc2VCcmFjZSksICcsJyksXG4gICAgICAgIGlzRW1wdHk6ICFoYXNTcGVjaWZpZXJzKG5vZGUpLFxuICAgICAgfVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuXG4gIGNvbnN0IHVubmVjZXNzYXJ5SW1wb3J0cyA9IHJlc3RXaXRob3V0Q29tbWVudHMuZmlsdGVyKG5vZGUgPT5cbiAgICAhaGFzU3BlY2lmaWVycyhub2RlKSAmJlxuICAgICFoYXNOYW1lc3BhY2Uobm9kZSkgJiZcbiAgICAhc3BlY2lmaWVycy5zb21lKHNwZWNpZmllciA9PiBzcGVjaWZpZXIuaW1wb3J0Tm9kZSA9PT0gbm9kZSlcbiAgKVxuXG4gIGNvbnN0IHNob3VsZEFkZERlZmF1bHQgPSBnZXREZWZhdWx0SW1wb3J0TmFtZShmaXJzdCkgPT0gbnVsbCAmJiBkZWZhdWx0SW1wb3J0TmFtZXMuc2l6ZSA9PT0gMVxuICBjb25zdCBzaG91bGRBZGRTcGVjaWZpZXJzID0gc3BlY2lmaWVycy5sZW5ndGggPiAwXG4gIGNvbnN0IHNob3VsZFJlbW92ZVVubmVjZXNzYXJ5ID0gdW5uZWNlc3NhcnlJbXBvcnRzLmxlbmd0aCA+IDBcblxuICBpZiAoIShzaG91bGRBZGREZWZhdWx0IHx8IHNob3VsZEFkZFNwZWNpZmllcnMgfHwgc2hvdWxkUmVtb3ZlVW5uZWNlc3NhcnkpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcmV0dXJuIGZpeGVyID0+IHtcbiAgICBjb25zdCB0b2tlbnMgPSBzb3VyY2VDb2RlLmdldFRva2VucyhmaXJzdClcbiAgICBjb25zdCBvcGVuQnJhY2UgPSB0b2tlbnMuZmluZCh0b2tlbiA9PiBpc1B1bmN0dWF0b3IodG9rZW4sICd7JykpXG4gICAgY29uc3QgY2xvc2VCcmFjZSA9IHRva2Vucy5maW5kKHRva2VuID0+IGlzUHVuY3R1YXRvcih0b2tlbiwgJ30nKSlcbiAgICBjb25zdCBmaXJzdFRva2VuID0gc291cmNlQ29kZS5nZXRGaXJzdFRva2VuKGZpcnN0KVxuICAgIGNvbnN0IFtkZWZhdWx0SW1wb3J0TmFtZV0gPSBkZWZhdWx0SW1wb3J0TmFtZXNcblxuICAgIGNvbnN0IGZpcnN0SGFzVHJhaWxpbmdDb21tYSA9XG4gICAgICBjbG9zZUJyYWNlICE9IG51bGwgJiZcbiAgICAgIGlzUHVuY3R1YXRvcihzb3VyY2VDb2RlLmdldFRva2VuQmVmb3JlKGNsb3NlQnJhY2UpLCAnLCcpXG4gICAgY29uc3QgZmlyc3RJc0VtcHR5ID0gIWhhc1NwZWNpZmllcnMoZmlyc3QpXG5cbiAgICBjb25zdCBbc3BlY2lmaWVyc1RleHRdID0gc3BlY2lmaWVycy5yZWR1Y2UoXG4gICAgICAoW3Jlc3VsdCwgbmVlZHNDb21tYV0sIHNwZWNpZmllcikgPT4ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIG5lZWRzQ29tbWEgJiYgIXNwZWNpZmllci5pc0VtcHR5XG4gICAgICAgICAgICA/IGAke3Jlc3VsdH0sJHtzcGVjaWZpZXIudGV4dH1gXG4gICAgICAgICAgICA6IGAke3Jlc3VsdH0ke3NwZWNpZmllci50ZXh0fWAsXG4gICAgICAgICAgc3BlY2lmaWVyLmlzRW1wdHkgPyBuZWVkc0NvbW1hIDogdHJ1ZSxcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIFsnJywgIWZpcnN0SGFzVHJhaWxpbmdDb21tYSAmJiAhZmlyc3RJc0VtcHR5XVxuICAgIClcblxuICAgIGNvbnN0IGZpeGVzID0gW11cblxuICAgIGlmIChzaG91bGRBZGREZWZhdWx0ICYmIG9wZW5CcmFjZSA9PSBudWxsICYmIHNob3VsZEFkZFNwZWNpZmllcnMpIHtcbiAgICAgIC8vIGBpbXBvcnQgJy4vZm9vJ2Ag4oaSIGBpbXBvcnQgZGVmLCB7Li4ufSBmcm9tICcuL2ZvbydgXG4gICAgICBmaXhlcy5wdXNoKFxuICAgICAgICBmaXhlci5pbnNlcnRUZXh0QWZ0ZXIoZmlyc3RUb2tlbiwgYCAke2RlZmF1bHRJbXBvcnROYW1lfSwgeyR7c3BlY2lmaWVyc1RleHR9fSBmcm9tYClcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKHNob3VsZEFkZERlZmF1bHQgJiYgb3BlbkJyYWNlID09IG51bGwgJiYgIXNob3VsZEFkZFNwZWNpZmllcnMpIHtcbiAgICAgIC8vIGBpbXBvcnQgJy4vZm9vJ2Ag4oaSIGBpbXBvcnQgZGVmIGZyb20gJy4vZm9vJ2BcbiAgICAgIGZpeGVzLnB1c2goZml4ZXIuaW5zZXJ0VGV4dEFmdGVyKGZpcnN0VG9rZW4sIGAgJHtkZWZhdWx0SW1wb3J0TmFtZX0gZnJvbWApKVxuICAgIH0gZWxzZSBpZiAoc2hvdWxkQWRkRGVmYXVsdCAmJiBvcGVuQnJhY2UgIT0gbnVsbCAmJiBjbG9zZUJyYWNlICE9IG51bGwpIHtcbiAgICAgIC8vIGBpbXBvcnQgey4uLn0gZnJvbSAnLi9mb28nYCDihpIgYGltcG9ydCBkZWYsIHsuLi59IGZyb20gJy4vZm9vJ2BcbiAgICAgIGZpeGVzLnB1c2goZml4ZXIuaW5zZXJ0VGV4dEFmdGVyKGZpcnN0VG9rZW4sIGAgJHtkZWZhdWx0SW1wb3J0TmFtZX0sYCkpXG4gICAgICBpZiAoc2hvdWxkQWRkU3BlY2lmaWVycykge1xuICAgICAgICAvLyBgaW1wb3J0IGRlZiwgey4uLn0gZnJvbSAnLi9mb28nYCDihpIgYGltcG9ydCBkZWYsIHsuLi4sIC4uLn0gZnJvbSAnLi9mb28nYFxuICAgICAgICBmaXhlcy5wdXNoKGZpeGVyLmluc2VydFRleHRCZWZvcmUoY2xvc2VCcmFjZSwgc3BlY2lmaWVyc1RleHQpKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNob3VsZEFkZERlZmF1bHQgJiYgb3BlbkJyYWNlID09IG51bGwgJiYgc2hvdWxkQWRkU3BlY2lmaWVycykge1xuICAgICAgaWYgKGZpcnN0LnNwZWNpZmllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGBpbXBvcnQgJy4vZm9vJ2Ag4oaSIGBpbXBvcnQgey4uLn0gZnJvbSAnLi9mb28nYFxuICAgICAgICBmaXhlcy5wdXNoKGZpeGVyLmluc2VydFRleHRBZnRlcihmaXJzdFRva2VuLCBgIHske3NwZWNpZmllcnNUZXh0fX0gZnJvbWApKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYGltcG9ydCBkZWYgZnJvbSAnLi9mb28nYCDihpIgYGltcG9ydCBkZWYsIHsuLi59IGZyb20gJy4vZm9vJ2BcbiAgICAgICAgZml4ZXMucHVzaChmaXhlci5pbnNlcnRUZXh0QWZ0ZXIoZmlyc3Quc3BlY2lmaWVyc1swXSwgYCwgeyR7c3BlY2lmaWVyc1RleHR9fWApKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXNob3VsZEFkZERlZmF1bHQgJiYgb3BlbkJyYWNlICE9IG51bGwgJiYgY2xvc2VCcmFjZSAhPSBudWxsKSB7XG4gICAgICAvLyBgaW1wb3J0IHsuLi59ICcuL2ZvbydgIOKGkiBgaW1wb3J0IHsuLi4sIC4uLn0gZnJvbSAnLi9mb28nYFxuICAgICAgZml4ZXMucHVzaChmaXhlci5pbnNlcnRUZXh0QmVmb3JlKGNsb3NlQnJhY2UsIHNwZWNpZmllcnNUZXh0KSlcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgaW1wb3J0cyB3aG9zZSBzcGVjaWZpZXJzIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIHRoZSBmaXJzdCBpbXBvcnQuXG4gICAgZm9yIChjb25zdCBzcGVjaWZpZXIgb2Ygc3BlY2lmaWVycykge1xuICAgICAgZml4ZXMucHVzaChmaXhlci5yZW1vdmUoc3BlY2lmaWVyLmltcG9ydE5vZGUpKVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBpbXBvcnRzIHdob3NlIGRlZmF1bHQgaW1wb3J0IGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBmaXJzdCBpbXBvcnQsXG4gICAgLy8gYW5kIHNpZGUtZWZmZWN0LW9ubHkgaW1wb3J0cyB0aGF0IGFyZSB1bm5lY2Vzc2FyeSBkdWUgdG8gdGhlIGZpcnN0XG4gICAgLy8gaW1wb3J0LlxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiB1bm5lY2Vzc2FyeUltcG9ydHMpIHtcbiAgICAgIGZpeGVzLnB1c2goZml4ZXIucmVtb3ZlKG5vZGUpKVxuICAgIH1cblxuICAgIHJldHVybiBmaXhlc1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUHVuY3R1YXRvcihub2RlLCB2YWx1ZSkge1xuICByZXR1cm4gbm9kZS50eXBlID09PSAnUHVuY3R1YXRvcicgJiYgbm9kZS52YWx1ZSA9PT0gdmFsdWVcbn1cblxuLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGltcG9ydCBvZiBgbm9kZWAsIGlmIGFueS5cbmZ1bmN0aW9uIGdldERlZmF1bHRJbXBvcnROYW1lKG5vZGUpIHtcbiAgY29uc3QgZGVmYXVsdFNwZWNpZmllciA9IG5vZGUuc3BlY2lmaWVyc1xuICAgIC5maW5kKHNwZWNpZmllciA9PiBzcGVjaWZpZXIudHlwZSA9PT0gJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInKVxuICByZXR1cm4gZGVmYXVsdFNwZWNpZmllciAhPSBudWxsID8gZGVmYXVsdFNwZWNpZmllci5sb2NhbC5uYW1lIDogdW5kZWZpbmVkXG59XG5cbi8vIENoZWNrcyB3aGV0aGVyIGBub2RlYCBoYXMgYSBuYW1lc3BhY2UgaW1wb3J0LlxuZnVuY3Rpb24gaGFzTmFtZXNwYWNlKG5vZGUpIHtcbiAgY29uc3Qgc3BlY2lmaWVycyA9IG5vZGUuc3BlY2lmaWVyc1xuICAgIC5maWx0ZXIoc3BlY2lmaWVyID0+IHNwZWNpZmllci50eXBlID09PSAnSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyJylcbiAgcmV0dXJuIHNwZWNpZmllcnMubGVuZ3RoID4gMFxufVxuXG4vLyBDaGVja3Mgd2hldGhlciBgbm9kZWAgaGFzIGFueSBub24tZGVmYXVsdCBzcGVjaWZpZXJzLlxuZnVuY3Rpb24gaGFzU3BlY2lmaWVycyhub2RlKSB7XG4gIGNvbnN0IHNwZWNpZmllcnMgPSBub2RlLnNwZWNpZmllcnNcbiAgICAuZmlsdGVyKHNwZWNpZmllciA9PiBzcGVjaWZpZXIudHlwZSA9PT0gJ0ltcG9ydFNwZWNpZmllcicpXG4gIHJldHVybiBzcGVjaWZpZXJzLmxlbmd0aCA+IDBcbn1cblxuLy8gSXQncyBub3Qgb2J2aW91cyB3aGF0IHRoZSB1c2VyIHdhbnRzIHRvIGRvIHdpdGggY29tbWVudHMgYXNzb2NpYXRlZCB3aXRoXG4vLyBkdXBsaWNhdGUgaW1wb3J0cywgc28gc2tpcCBpbXBvcnRzIHdpdGggY29tbWVudHMgd2hlbiBhdXRvZml4aW5nLlxuZnVuY3Rpb24gaGFzUHJvYmxlbWF0aWNDb21tZW50cyhub2RlLCBzb3VyY2VDb2RlKSB7XG4gIHJldHVybiAoXG4gICAgaGFzQ29tbWVudEJlZm9yZShub2RlLCBzb3VyY2VDb2RlKSB8fFxuICAgIGhhc0NvbW1lbnRBZnRlcihub2RlLCBzb3VyY2VDb2RlKSB8fFxuICAgIGhhc0NvbW1lbnRJbnNpZGVOb25TcGVjaWZpZXJzKG5vZGUsIHNvdXJjZUNvZGUpXG4gIClcbn1cblxuLy8gQ2hlY2tzIHdoZXRoZXIgYG5vZGVgIGhhcyBhIGNvbW1lbnQgKHRoYXQgZW5kcykgb24gdGhlIHByZXZpb3VzIGxpbmUgb3Igb25cbi8vIHRoZSBzYW1lIGxpbmUgYXMgYG5vZGVgIChzdGFydHMpLlxuZnVuY3Rpb24gaGFzQ29tbWVudEJlZm9yZShub2RlLCBzb3VyY2VDb2RlKSB7XG4gIHJldHVybiBzb3VyY2VDb2RlLmdldENvbW1lbnRzQmVmb3JlKG5vZGUpXG4gICAgLnNvbWUoY29tbWVudCA9PiBjb21tZW50LmxvYy5lbmQubGluZSA+PSBub2RlLmxvYy5zdGFydC5saW5lIC0gMSlcbn1cblxuLy8gQ2hlY2tzIHdoZXRoZXIgYG5vZGVgIGhhcyBhIGNvbW1lbnQgKHRoYXQgc3RhcnRzKSBvbiB0aGUgc2FtZSBsaW5lIGFzIGBub2RlYFxuLy8gKGVuZHMpLlxuZnVuY3Rpb24gaGFzQ29tbWVudEFmdGVyKG5vZGUsIHNvdXJjZUNvZGUpIHtcbiAgcmV0dXJuIHNvdXJjZUNvZGUuZ2V0Q29tbWVudHNBZnRlcihub2RlKVxuICAgIC5zb21lKGNvbW1lbnQgPT4gY29tbWVudC5sb2Muc3RhcnQubGluZSA9PT0gbm9kZS5sb2MuZW5kLmxpbmUpXG59XG5cbi8vIENoZWNrcyB3aGV0aGVyIGBub2RlYCBoYXMgYW55IGNvbW1lbnRzIF9pbnNpZGUsXyBleGNlcHQgaW5zaWRlIHRoZSBgey4uLn1gXG4vLyBwYXJ0IChpZiBhbnkpLlxuZnVuY3Rpb24gaGFzQ29tbWVudEluc2lkZU5vblNwZWNpZmllcnMobm9kZSwgc291cmNlQ29kZSkge1xuICBjb25zdCB0b2tlbnMgPSBzb3VyY2VDb2RlLmdldFRva2Vucyhub2RlKVxuICBjb25zdCBvcGVuQnJhY2VJbmRleCA9IHRva2Vucy5maW5kSW5kZXgodG9rZW4gPT4gaXNQdW5jdHVhdG9yKHRva2VuLCAneycpKVxuICBjb25zdCBjbG9zZUJyYWNlSW5kZXggPSB0b2tlbnMuZmluZEluZGV4KHRva2VuID0+IGlzUHVuY3R1YXRvcih0b2tlbiwgJ30nKSlcbiAgLy8gU2xpY2UgYXdheSB0aGUgZmlyc3QgdG9rZW4sIHNpbmNlIHdlJ3JlIG5vIGxvb2tpbmcgZm9yIGNvbW1lbnRzIF9iZWZvcmVfXG4gIC8vIGBub2RlYCAob25seSBpbnNpZGUpLiBJZiB0aGVyZSdzIGEgYHsuLi59YCBwYXJ0LCBsb29rIGZvciBjb21tZW50cyBiZWZvcmVcbiAgLy8gdGhlIGB7YCwgYnV0IG5vdCBiZWZvcmUgdGhlIGB9YCAoaGVuY2UgdGhlIGArMWBzKS5cbiAgY29uc3Qgc29tZVRva2VucyA9IG9wZW5CcmFjZUluZGV4ID49IDAgJiYgY2xvc2VCcmFjZUluZGV4ID49IDBcbiAgICA/IHRva2Vucy5zbGljZSgxLCBvcGVuQnJhY2VJbmRleCArIDEpLmNvbmNhdCh0b2tlbnMuc2xpY2UoY2xvc2VCcmFjZUluZGV4ICsgMSkpXG4gICAgOiB0b2tlbnMuc2xpY2UoMSlcbiAgcmV0dXJuIHNvbWVUb2tlbnMuc29tZSh0b2tlbiA9PiBzb3VyY2VDb2RlLmdldENvbW1lbnRzQmVmb3JlKHRva2VuKS5sZW5ndGggPiAwKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLWR1cGxpY2F0ZXMnKSxcbiAgICB9LFxuICAgIGZpeGFibGU6ICdjb2RlJyxcbiAgICBzY2hlbWE6IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBjb25zaWRlclF1ZXJ5U3RyaW5nOiB7XG4gICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAvLyBQcmVwYXJlIHRoZSByZXNvbHZlciBmcm9tIG9wdGlvbnMuXG4gICAgY29uc3QgY29uc2lkZXJRdWVyeVN0cmluZ09wdGlvbiA9IGNvbnRleHQub3B0aW9uc1swXSAmJlxuICAgICAgY29udGV4dC5vcHRpb25zWzBdWydjb25zaWRlclF1ZXJ5U3RyaW5nJ11cbiAgICBjb25zdCBkZWZhdWx0UmVzb2x2ZXIgPSBzb3VyY2VQYXRoID0+IHJlc29sdmUoc291cmNlUGF0aCwgY29udGV4dCkgfHwgc291cmNlUGF0aFxuICAgIGNvbnN0IHJlc29sdmVyID0gY29uc2lkZXJRdWVyeVN0cmluZ09wdGlvbiA/IChzb3VyY2VQYXRoID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gc291cmNlUGF0aC5tYXRjaCgvXihbXj9dKilcXD8oLiopJC8pXG4gICAgICBpZiAoIXBhcnRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0UmVzb2x2ZXIoc291cmNlUGF0aClcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZhdWx0UmVzb2x2ZXIocGFydHNbMV0pICsgJz8nICsgcGFydHNbMl1cbiAgICB9KSA6IGRlZmF1bHRSZXNvbHZlclxuXG4gICAgY29uc3QgaW1wb3J0ZWQgPSBuZXcgTWFwKClcbiAgICBjb25zdCBuc0ltcG9ydGVkID0gbmV3IE1hcCgpXG4gICAgY29uc3QgdHlwZXNJbXBvcnRlZCA9IG5ldyBNYXAoKVxuICAgIHJldHVybiB7XG4gICAgICAnSW1wb3J0RGVjbGFyYXRpb24nOiBmdW5jdGlvbiAobikge1xuICAgICAgICAvLyByZXNvbHZlZCBwYXRoIHdpbGwgY292ZXIgYWxpYXNlZCBkdXBsaWNhdGVzXG4gICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVyKG4uc291cmNlLnZhbHVlKVxuICAgICAgICBjb25zdCBpbXBvcnRNYXAgPSBuLmltcG9ydEtpbmQgPT09ICd0eXBlJyA/IHR5cGVzSW1wb3J0ZWQgOlxuICAgICAgICAgIChoYXNOYW1lc3BhY2UobikgPyBuc0ltcG9ydGVkIDogaW1wb3J0ZWQpXG5cbiAgICAgICAgaWYgKGltcG9ydE1hcC5oYXMocmVzb2x2ZWRQYXRoKSkge1xuICAgICAgICAgIGltcG9ydE1hcC5nZXQocmVzb2x2ZWRQYXRoKS5wdXNoKG4pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW1wb3J0TWFwLnNldChyZXNvbHZlZFBhdGgsIFtuXSlcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgJ1Byb2dyYW06ZXhpdCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2hlY2tJbXBvcnRzKGltcG9ydGVkLCBjb250ZXh0KVxuICAgICAgICBjaGVja0ltcG9ydHMobnNJbXBvcnRlZCwgY29udGV4dClcbiAgICAgICAgY2hlY2tJbXBvcnRzKHR5cGVzSW1wb3J0ZWQsIGNvbnRleHQpXG4gICAgICB9LFxuICAgIH1cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-dynamic-require.js b/node_modules/eslint-plugin-import/lib/rules/no-dynamic-require.js
index c981ee2..e63b3db 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-dynamic-require.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-dynamic-require.js
@@ -1,27 +1,26 @@
-'use strict';
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 function isRequire(node) {
-  return node && node.callee && node.callee.type === 'Identifier' && node.callee.name === 'require' && node.arguments.length >= 1;
+  return node &&
+  node.callee &&
+  node.callee.type === 'Identifier' &&
+  node.callee.name === 'require' &&
+  node.arguments.length >= 1;
 }
 
 function isStaticValue(arg) {
-  return arg.type === 'Literal' || arg.type === 'TemplateLiteral' && arg.expressions.length === 0;
+  return arg.type === 'Literal' ||
+  arg.type === 'TemplateLiteral' && arg.expressions.length === 0;
 }
 
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-dynamic-require')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('no-dynamic-require') },
+
+    schema: [] },
+
 
   create: function (context) {
     return {
@@ -29,11 +28,10 @@
         if (isRequire(node) && !isStaticValue(node.arguments[0])) {
           context.report({
             node,
-            message: 'Calls to require() should use string literals'
-          });
+            message: 'Calls to require() should use string literals' });
+
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1keW5hbWljLXJlcXVpcmUuanMiXSwibmFtZXMiOlsiaXNSZXF1aXJlIiwibm9kZSIsImNhbGxlZSIsInR5cGUiLCJuYW1lIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiaXNTdGF0aWNWYWx1ZSIsImFyZyIsImV4cHJlc3Npb25zIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwiY29udGV4dCIsIkNhbGxFeHByZXNzaW9uIiwicmVwb3J0IiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsU0FBVCxDQUFtQkMsSUFBbkIsRUFBeUI7QUFDdkIsU0FBT0EsUUFDTEEsS0FBS0MsTUFEQSxJQUVMRCxLQUFLQyxNQUFMLENBQVlDLElBQVosS0FBcUIsWUFGaEIsSUFHTEYsS0FBS0MsTUFBTCxDQUFZRSxJQUFaLEtBQXFCLFNBSGhCLElBSUxILEtBQUtJLFNBQUwsQ0FBZUMsTUFBZixJQUF5QixDQUozQjtBQUtEOztBQUVELFNBQVNDLGFBQVQsQ0FBdUJDLEdBQXZCLEVBQTRCO0FBQzFCLFNBQU9BLElBQUlMLElBQUosS0FBYSxTQUFiLElBQ0pLLElBQUlMLElBQUosS0FBYSxpQkFBYixJQUFrQ0ssSUFBSUMsV0FBSixDQUFnQkgsTUFBaEIsS0FBMkIsQ0FEaEU7QUFFRDs7QUFFREksT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pULFVBQU0sWUFERjtBQUVKVSxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsb0JBQVI7QUFERCxLQUZGO0FBS0pDLFlBQVE7QUFMSixHQURTOztBQVNmQyxVQUFRLFVBQVVDLE9BQVYsRUFBbUI7QUFDekIsV0FBTztBQUNMQyxxQkFBZWpCLElBQWYsRUFBcUI7QUFDbkIsWUFBSUQsVUFBVUMsSUFBVixLQUFtQixDQUFDTSxjQUFjTixLQUFLSSxTQUFMLENBQWUsQ0FBZixDQUFkLENBQXhCLEVBQTBEO0FBQ3hEWSxrQkFBUUUsTUFBUixDQUFlO0FBQ2JsQixnQkFEYTtBQUVibUIscUJBQVM7QUFGSSxXQUFmO0FBSUQ7QUFDRjtBQVJJLEtBQVA7QUFVRDtBQXBCYyxDQUFqQiIsImZpbGUiOiJuby1keW5hbWljLXJlcXVpcmUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5mdW5jdGlvbiBpc1JlcXVpcmUobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJlxuICAgIG5vZGUuY2FsbGVlICYmXG4gICAgbm9kZS5jYWxsZWUudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmXG4gICAgbm9kZS5jYWxsZWUubmFtZSA9PT0gJ3JlcXVpcmUnICYmXG4gICAgbm9kZS5hcmd1bWVudHMubGVuZ3RoID49IDFcbn1cblxuZnVuY3Rpb24gaXNTdGF0aWNWYWx1ZShhcmcpIHtcbiAgcmV0dXJuIGFyZy50eXBlID09PSAnTGl0ZXJhbCcgfHxcbiAgICAoYXJnLnR5cGUgPT09ICdUZW1wbGF0ZUxpdGVyYWwnICYmIGFyZy5leHByZXNzaW9ucy5sZW5ndGggPT09IDApXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tZHluYW1pYy1yZXF1aXJlJyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgQ2FsbEV4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBpZiAoaXNSZXF1aXJlKG5vZGUpICYmICFpc1N0YXRpY1ZhbHVlKG5vZGUuYXJndW1lbnRzWzBdKSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlOiAnQ2FsbHMgdG8gcmVxdWlyZSgpIHNob3VsZCB1c2Ugc3RyaW5nIGxpdGVyYWxzJyxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1keW5hbWljLXJlcXVpcmUuanMiXSwibmFtZXMiOlsiaXNSZXF1aXJlIiwibm9kZSIsImNhbGxlZSIsInR5cGUiLCJuYW1lIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiaXNTdGF0aWNWYWx1ZSIsImFyZyIsImV4cHJlc3Npb25zIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwiY29udGV4dCIsIkNhbGxFeHByZXNzaW9uIiwicmVwb3J0IiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6ImFBQUEscUM7O0FBRUEsU0FBU0EsU0FBVCxDQUFtQkMsSUFBbkIsRUFBeUI7QUFDdkIsU0FBT0E7QUFDTEEsT0FBS0MsTUFEQTtBQUVMRCxPQUFLQyxNQUFMLENBQVlDLElBQVosS0FBcUIsWUFGaEI7QUFHTEYsT0FBS0MsTUFBTCxDQUFZRSxJQUFaLEtBQXFCLFNBSGhCO0FBSUxILE9BQUtJLFNBQUwsQ0FBZUMsTUFBZixJQUF5QixDQUozQjtBQUtEOztBQUVELFNBQVNDLGFBQVQsQ0FBdUJDLEdBQXZCLEVBQTRCO0FBQzFCLFNBQU9BLElBQUlMLElBQUosS0FBYSxTQUFiO0FBQ0pLLE1BQUlMLElBQUosS0FBYSxpQkFBYixJQUFrQ0ssSUFBSUMsV0FBSixDQUFnQkgsTUFBaEIsS0FBMkIsQ0FEaEU7QUFFRDs7QUFFREksT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pULFVBQU0sWUFERjtBQUVKVSxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsb0JBQVIsQ0FERCxFQUZGOztBQUtKQyxZQUFRLEVBTEosRUFEUzs7O0FBU2ZDLFVBQVEsVUFBVUMsT0FBVixFQUFtQjtBQUN6QixXQUFPO0FBQ0xDLHFCQUFlakIsSUFBZixFQUFxQjtBQUNuQixZQUFJRCxVQUFVQyxJQUFWLEtBQW1CLENBQUNNLGNBQWNOLEtBQUtJLFNBQUwsQ0FBZSxDQUFmLENBQWQsQ0FBeEIsRUFBMEQ7QUFDeERZLGtCQUFRRSxNQUFSLENBQWU7QUFDYmxCLGdCQURhO0FBRWJtQixxQkFBUywrQ0FGSSxFQUFmOztBQUlEO0FBQ0YsT0FSSSxFQUFQOztBQVVELEdBcEJjLEVBQWpCIiwiZmlsZSI6Im5vLWR5bmFtaWMtcmVxdWlyZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbmZ1bmN0aW9uIGlzUmVxdWlyZShub2RlKSB7XG4gIHJldHVybiBub2RlICYmXG4gICAgbm9kZS5jYWxsZWUgJiZcbiAgICBub2RlLmNhbGxlZS50eXBlID09PSAnSWRlbnRpZmllcicgJiZcbiAgICBub2RlLmNhbGxlZS5uYW1lID09PSAncmVxdWlyZScgJiZcbiAgICBub2RlLmFyZ3VtZW50cy5sZW5ndGggPj0gMVxufVxuXG5mdW5jdGlvbiBpc1N0YXRpY1ZhbHVlKGFyZykge1xuICByZXR1cm4gYXJnLnR5cGUgPT09ICdMaXRlcmFsJyB8fFxuICAgIChhcmcudHlwZSA9PT0gJ1RlbXBsYXRlTGl0ZXJhbCcgJiYgYXJnLmV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1keW5hbWljLXJlcXVpcmUnKSxcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHJldHVybiB7XG4gICAgICBDYWxsRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICAgIGlmIChpc1JlcXVpcmUobm9kZSkgJiYgIWlzU3RhdGljVmFsdWUobm9kZS5hcmd1bWVudHNbMF0pKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdDYWxscyB0byByZXF1aXJlKCkgc2hvdWxkIHVzZSBzdHJpbmcgbGl0ZXJhbHMnLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-extraneous-dependencies.js b/node_modules/eslint-plugin-import/lib/rules/no-extraneous-dependencies.js
index 91499e3..b8d8918 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-extraneous-dependencies.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-extraneous-dependencies.js
@@ -1,42 +1,13 @@
-'use strict';
+'use strict';var _path = require('path');var _path2 = _interopRequireDefault(_path);
+var _fs = require('fs');var _fs2 = _interopRequireDefault(_fs);
+var _readPkgUp = require('read-pkg-up');var _readPkgUp2 = _interopRequireDefault(_readPkgUp);
+var _minimatch = require('minimatch');var _minimatch2 = _interopRequireDefault(_minimatch);
+var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);
+var _moduleVisitor = require('eslint-module-utils/moduleVisitor');var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
+var _importType = require('../core/importType');var _importType2 = _interopRequireDefault(_importType);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
-var _path = require('path');
-
-var _path2 = _interopRequireDefault(_path);
-
-var _fs = require('fs');
-
-var _fs2 = _interopRequireDefault(_fs);
-
-var _readPkgUp = require('read-pkg-up');
-
-var _readPkgUp2 = _interopRequireDefault(_readPkgUp);
-
-var _minimatch = require('minimatch');
-
-var _minimatch2 = _interopRequireDefault(_minimatch);
-
-var _resolve = require('eslint-module-utils/resolve');
-
-var _resolve2 = _interopRequireDefault(_resolve);
-
-var _importType = require('../core/importType');
-
-var _importType2 = _interopRequireDefault(_importType);
-
-var _staticRequire = require('../core/staticRequire');
-
-var _staticRequire2 = _interopRequireDefault(_staticRequire);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function hasKeys() {
-  let obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
+function hasKeys() {let obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
   return Object.keys(obj).length > 0;
 }
 
@@ -52,8 +23,8 @@
     peerDependencies: pkg.peerDependencies || {},
     // BundledDeps should be in the form of an array, but object notation is also supported by
     // `npm`, so we convert it to an array if it is an object
-    bundledDependencies: arrayOrKeys(pkg.bundleDependencies || pkg.bundledDependencies || [])
-  };
+    bundledDependencies: arrayOrKeys(pkg.bundleDependencies || pkg.bundledDependencies || []) };
+
 }
 
 function getDependencies(context, packageDir) {
@@ -64,8 +35,8 @@
       devDependencies: {},
       optionalDependencies: {},
       peerDependencies: {},
-      bundledDependencies: []
-    };
+      bundledDependencies: [] };
+
 
     if (packageDir && packageDir.length > 0) {
       if (!Array.isArray(packageDir)) {
@@ -78,15 +49,30 @@
     if (paths.length > 0) {
       // use rule config to find package.json
       paths.forEach(dir => {
-        const _packageContent = extractDepFields(JSON.parse(_fs2.default.readFileSync(_path2.default.join(dir, 'package.json'), 'utf8')));
-        Object.keys(packageContent).forEach(depsKey => Object.assign(packageContent[depsKey], _packageContent[depsKey]));
+        const _packageContent = extractDepFields(
+        JSON.parse(_fs2.default.readFileSync(_path2.default.join(dir, 'package.json'), 'utf8')));
+
+        Object.keys(packageContent).forEach(depsKey =>
+        Object.assign(packageContent[depsKey], _packageContent[depsKey]));
+
       });
     } else {
       // use closest package.json
-      Object.assign(packageContent, extractDepFields(_readPkgUp2.default.sync({ cwd: context.getFilename(), normalize: false }).pkg));
+      Object.assign(
+      packageContent,
+      extractDepFields(
+      _readPkgUp2.default.sync({ cwd: context.getFilename(), normalize: false }).pkg));
+
+
     }
 
-    if (![packageContent.dependencies, packageContent.devDependencies, packageContent.optionalDependencies, packageContent.peerDependencies, packageContent.bundledDependencies].some(hasKeys)) {
+    if (![
+    packageContent.dependencies,
+    packageContent.devDependencies,
+    packageContent.optionalDependencies,
+    packageContent.peerDependencies,
+    packageContent.bundledDependencies].
+    some(hasKeys)) {
       return null;
     }
 
@@ -95,14 +81,14 @@
     if (paths.length > 0 && e.code === 'ENOENT') {
       context.report({
         message: 'The package.json file could not be found.',
-        loc: { line: 0, column: 0 }
-      });
+        loc: { line: 0, column: 0 } });
+
     }
     if (e.name === 'JSONError' || e instanceof SyntaxError) {
       context.report({
         message: 'The package.json file could not be parsed: ' + e.message,
-        loc: { line: 0, column: 0 }
-      });
+        loc: { line: 0, column: 0 } });
+
     }
 
     return null;
@@ -110,7 +96,8 @@
 }
 
 function missingErrorMessage(packageName) {
-  return `'${packageName}' should be listed in the project's dependencies. ` + `Run 'npm i -S ${packageName}' to add it`;
+  return `'${packageName}' should be listed in the project's dependencies. ` +
+  `Run 'npm i -S ${packageName}' to add it`;
 }
 
 function devDepErrorMessage(packageName) {
@@ -118,12 +105,13 @@
 }
 
 function optDepErrorMessage(packageName) {
-  return `'${packageName}' should be listed in the project's dependencies, ` + `not optionalDependencies.`;
+  return `'${packageName}' should be listed in the project's dependencies, ` +
+  `not optionalDependencies.`;
 }
 
 function reportIfMissing(context, deps, depsOptions, node, name) {
   // Do not report when importing types
-  if (node.importKind === 'type') {
+  if (node.importKind === 'type' || node.parent && node.parent.importKind === 'type') {
     return;
   }
 
@@ -132,19 +120,24 @@
   }
 
   const resolved = (0, _resolve2.default)(name, context);
-  if (!resolved) {
-    return;
-  }
+  if (!resolved) {return;}
 
   const splitName = name.split('/');
-  const packageName = splitName[0][0] === '@' ? splitName.slice(0, 2).join('/') : splitName[0];
+  const packageName = splitName[0][0] === '@' ?
+  splitName.slice(0, 2).join('/') :
+  splitName[0];
   const isInDeps = deps.dependencies[packageName] !== undefined;
   const isInDevDeps = deps.devDependencies[packageName] !== undefined;
   const isInOptDeps = deps.optionalDependencies[packageName] !== undefined;
   const isInPeerDeps = deps.peerDependencies[packageName] !== undefined;
   const isInBundledDeps = deps.bundledDependencies.indexOf(packageName) !== -1;
 
-  if (isInDeps || depsOptions.allowDevDeps && isInDevDeps || depsOptions.allowPeerDeps && isInPeerDeps || depsOptions.allowOptDeps && isInOptDeps || depsOptions.allowBundledDeps && isInBundledDeps) {
+  if (isInDeps ||
+  depsOptions.allowDevDeps && isInDevDeps ||
+  depsOptions.allowPeerDeps && isInPeerDeps ||
+  depsOptions.allowOptDeps && isInOptDeps ||
+  depsOptions.allowBundledDeps && isInBundledDeps)
+  {
     return;
   }
 
@@ -167,28 +160,33 @@
     return config;
   }
   // Array of globs.
-  return config.some(c => (0, _minimatch2.default)(filename, c) || (0, _minimatch2.default)(filename, _path2.default.join(process.cwd(), c)));
+  return config.some(c =>
+  (0, _minimatch2.default)(filename, c) ||
+  (0, _minimatch2.default)(filename, _path2.default.join(process.cwd(), c)));
+
 }
 
 module.exports = {
   meta: {
     type: 'problem',
     docs: {
-      url: (0, _docsUrl2.default)('no-extraneous-dependencies')
-    },
+      url: (0, _docsUrl2.default)('no-extraneous-dependencies') },
 
-    schema: [{
+
+    schema: [
+    {
       'type': 'object',
       'properties': {
         'devDependencies': { 'type': ['boolean', 'array'] },
         'optionalDependencies': { 'type': ['boolean', 'array'] },
         'peerDependencies': { 'type': ['boolean', 'array'] },
         'bundledDependencies': { 'type': ['boolean', 'array'] },
-        'packageDir': { 'type': ['string', 'array'] }
-      },
-      'additionalProperties': false
-    }]
-  },
+        'packageDir': { 'type': ['string', 'array'] } },
+
+      'additionalProperties': false }] },
+
+
+
 
   create: function (context) {
     const options = context.options[0] || {};
@@ -199,31 +197,11 @@
       allowDevDeps: testConfig(options.devDependencies, filename) !== false,
       allowOptDeps: testConfig(options.optionalDependencies, filename) !== false,
       allowPeerDeps: testConfig(options.peerDependencies, filename) !== false,
-      allowBundledDeps: testConfig(options.bundledDependencies, filename) !== false
+      allowBundledDeps: testConfig(options.bundledDependencies, filename) !== false };
 
-      // todo: use module visitor from module-utils core
-    };return {
-      ImportDeclaration: function (node) {
-        if (node.source) {
-          reportIfMissing(context, deps, depsOptions, node, node.source.value);
-        }
-      },
-      ExportNamedDeclaration: function (node) {
-        if (node.source) {
-          reportIfMissing(context, deps, depsOptions, node, node.source.value);
-        }
-      },
-      ExportAllDeclaration: function (node) {
-        if (node.source) {
-          reportIfMissing(context, deps, depsOptions, node, node.source.value);
-        }
-      },
-      CallExpression: function handleRequires(node) {
-        if ((0, _staticRequire2.default)(node)) {
-          reportIfMissing(context, deps, depsOptions, node, node.arguments[0].value);
-        }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcy5qcyJdLCJuYW1lcyI6WyJoYXNLZXlzIiwib2JqIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImFycmF5T3JLZXlzIiwiYXJyYXlPck9iamVjdCIsIkFycmF5IiwiaXNBcnJheSIsImV4dHJhY3REZXBGaWVsZHMiLCJwa2ciLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJvcHRpb25hbERlcGVuZGVuY2llcyIsInBlZXJEZXBlbmRlbmNpZXMiLCJidW5kbGVkRGVwZW5kZW5jaWVzIiwiYnVuZGxlRGVwZW5kZW5jaWVzIiwiZ2V0RGVwZW5kZW5jaWVzIiwiY29udGV4dCIsInBhY2thZ2VEaXIiLCJwYXRocyIsInBhY2thZ2VDb250ZW50IiwicGF0aCIsInJlc29sdmUiLCJtYXAiLCJkaXIiLCJmb3JFYWNoIiwiX3BhY2thZ2VDb250ZW50IiwiSlNPTiIsInBhcnNlIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJqb2luIiwiZGVwc0tleSIsImFzc2lnbiIsInJlYWRQa2dVcCIsInN5bmMiLCJjd2QiLCJnZXRGaWxlbmFtZSIsIm5vcm1hbGl6ZSIsInNvbWUiLCJlIiwiY29kZSIsInJlcG9ydCIsIm1lc3NhZ2UiLCJsb2MiLCJsaW5lIiwiY29sdW1uIiwibmFtZSIsIlN5bnRheEVycm9yIiwibWlzc2luZ0Vycm9yTWVzc2FnZSIsInBhY2thZ2VOYW1lIiwiZGV2RGVwRXJyb3JNZXNzYWdlIiwib3B0RGVwRXJyb3JNZXNzYWdlIiwicmVwb3J0SWZNaXNzaW5nIiwiZGVwcyIsImRlcHNPcHRpb25zIiwibm9kZSIsImltcG9ydEtpbmQiLCJyZXNvbHZlZCIsInNwbGl0TmFtZSIsInNwbGl0Iiwic2xpY2UiLCJpc0luRGVwcyIsInVuZGVmaW5lZCIsImlzSW5EZXZEZXBzIiwiaXNJbk9wdERlcHMiLCJpc0luUGVlckRlcHMiLCJpc0luQnVuZGxlZERlcHMiLCJpbmRleE9mIiwiYWxsb3dEZXZEZXBzIiwiYWxsb3dQZWVyRGVwcyIsImFsbG93T3B0RGVwcyIsImFsbG93QnVuZGxlZERlcHMiLCJ0ZXN0Q29uZmlnIiwiY29uZmlnIiwiZmlsZW5hbWUiLCJjIiwicHJvY2VzcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJvcHRpb25zIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJzb3VyY2UiLCJ2YWx1ZSIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iLCJFeHBvcnRBbGxEZWNsYXJhdGlvbiIsIkNhbGxFeHByZXNzaW9uIiwiaGFuZGxlUmVxdWlyZXMiLCJhcmd1bWVudHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsU0FBU0EsT0FBVCxHQUEyQjtBQUFBLE1BQVZDLEdBQVUsdUVBQUosRUFBSTs7QUFDekIsU0FBT0MsT0FBT0MsSUFBUCxDQUFZRixHQUFaLEVBQWlCRyxNQUFqQixHQUEwQixDQUFqQztBQUNEOztBQUVELFNBQVNDLFdBQVQsQ0FBcUJDLGFBQXJCLEVBQW9DO0FBQ2xDLFNBQU9DLE1BQU1DLE9BQU4sQ0FBY0YsYUFBZCxJQUErQkEsYUFBL0IsR0FBK0NKLE9BQU9DLElBQVAsQ0FBWUcsYUFBWixDQUF0RDtBQUNEOztBQUVELFNBQVNHLGdCQUFULENBQTBCQyxHQUExQixFQUErQjtBQUM3QixTQUFPO0FBQ0xDLGtCQUFjRCxJQUFJQyxZQUFKLElBQW9CLEVBRDdCO0FBRUxDLHFCQUFpQkYsSUFBSUUsZUFBSixJQUF1QixFQUZuQztBQUdMQywwQkFBc0JILElBQUlHLG9CQUFKLElBQTRCLEVBSDdDO0FBSUxDLHNCQUFrQkosSUFBSUksZ0JBQUosSUFBd0IsRUFKckM7QUFLTDtBQUNBO0FBQ0FDLHlCQUFxQlYsWUFBWUssSUFBSU0sa0JBQUosSUFBMEJOLElBQUlLLG1CQUE5QixJQUFxRCxF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QnFDLElBQXpCLEVBQStCQyxXQUEvQixFQUE0Q0MsSUFBNUMsRUFBa0RBLEtBQUtnQyxNQUFMLENBQVlDLEtBQTlEO0FBQ0Q7QUFDRixPQVZJO0FBV0xFLDRCQUFzQixVQUFVbkMsSUFBVixFQUFnQjtBQUNwQyxZQUFJQSxLQUFLZ0MsTUFBVCxFQUFpQjtBQUNmbkMsMEJBQWdCcEMsT0FBaEIsRUFBeUJxQyxJQUF6QixFQUErQkMsV0FBL0IsRUFBNENDLElBQTVDLEVBQWtEQSxLQUFLZ0MsTUFBTCxDQUFZQyxLQUE5RDtBQUNEO0FBQ0YsT0FmSTtBQWdCTEcsc0JBQWdCLFNBQVNDLGNBQVQsQ0FBd0JyQyxJQUF4QixFQUE4QjtBQUM1QyxZQUFJLDZCQUFnQkEsSUFBaEIsQ0FBSixFQUEyQjtBQUN6QkgsMEJBQWdCcEMsT0FBaEIsRUFBeUJxQyxJQUF6QixFQUErQkMsV0FBL0IsRUFBNENDLElBQTVDLEVBQWtEQSxLQUFLc0MsU0FBTCxDQUFlLENBQWYsRUFBa0JMLEtBQXBFO0FBQ0Q7QUFDRjtBQXBCSSxLQUFQO0FBc0JEO0FBekRjLENBQWpCIiwiZmlsZSI6Im5vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCByZWFkUGtnVXAgZnJvbSAncmVhZC1wa2ctdXAnXG5pbXBvcnQgbWluaW1hdGNoIGZyb20gJ21pbmltYXRjaCdcbmltcG9ydCByZXNvbHZlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVzb2x2ZSdcbmltcG9ydCBpbXBvcnRUeXBlIGZyb20gJy4uL2NvcmUvaW1wb3J0VHlwZSdcbmltcG9ydCBpc1N0YXRpY1JlcXVpcmUgZnJvbSAnLi4vY29yZS9zdGF0aWNSZXF1aXJlJ1xuaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcblxuZnVuY3Rpb24gaGFzS2V5cyhvYmogPSB7fSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPiAwXG59XG5cbmZ1bmN0aW9uIGFycmF5T3JLZXlzKGFycmF5T3JPYmplY3QpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyYXlPck9iamVjdCkgPyBhcnJheU9yT2JqZWN0IDogT2JqZWN0LmtleXMoYXJyYXlPck9iamVjdClcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlcEZpZWxkcyhwa2cpIHtcbiAgcmV0dXJuIHtcbiAgICBkZXBlbmRlbmNpZXM6IHBrZy5kZXBlbmRlbmNpZXMgfHwge30sXG4gICAgZGV2RGVwZW5kZW5jaWVzOiBwa2cuZGV2RGVwZW5kZW5jaWVzIHx8IHt9LFxuICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOiBwa2cub3B0aW9uYWxEZXBlbmRlbmNpZXMgfHwge30sXG4gICAgcGVlckRlcGVuZGVuY2llczogcGtnLnBlZXJEZXBlbmRlbmNpZXMgfHwge30sXG4gICAgLy8gQnVuZGxlZERlcHMgc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mIGFuIGFycmF5LCBidXQgb2JqZWN0IG5vdGF0aW9uIGlzIGFsc28gc3VwcG9ydGVkIGJ5XG4gICAgLy8gYG5wbWAsIHNvIHdlIGNvbnZlcnQgaXQgdG8gYW4gYXJyYXkgaWYgaXQgaXMgYW4gb2JqZWN0XG4gICAgYnVuZGxlZERlcGVuZGVuY2llczogYXJyYXlPcktleXMocGtnLmJ1bmRsZURlcGVuZGVuY2llcyB8fCBwa2cuYnVuZGxlZERlcGVuZGVuY2llcyB8fCBbXSksXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jaWVzKGNvbnRleHQsIHBhY2thZ2VEaXIpIHtcbiAgbGV0IHBhdGhzID0gW11cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlQ29udGVudCA9IHtcbiAgICAgIGRlcGVuZGVuY2llczoge30sXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IHt9LFxuICAgICAgb3B0aW9uYWxEZXBlbmRlbmNpZXM6IHt9LFxuICAgICAgcGVlckRlcGVuZGVuY2llczoge30sXG4gICAgICBidW5kbGVkRGVwZW5kZW5jaWVzOiBbXSxcbiAgICB9XG5cbiAgICBpZiAocGFja2FnZURpciAmJiBwYWNrYWdlRGlyLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYWNrYWdlRGlyKSkge1xuICAgICAgICBwYXRocyA9IFtwYXRoLnJlc29sdmUocGFja2FnZURpcildXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXRocyA9IHBhY2thZ2VEaXIubWFwKGRpciA9PiBwYXRoLnJlc29sdmUoZGlyKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gdXNlIHJ1bGUgY29uZmlnIHRvIGZpbmQgcGFja2FnZS5qc29uXG4gICAgICBwYXRocy5mb3JFYWNoKGRpciA9PiB7XG4gICAgICAgIGNvbnN0IF9wYWNrYWdlQ29udGVudCA9IGV4dHJhY3REZXBGaWVsZHMoXG4gICAgICAgICAgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKVxuICAgICAgICApXG4gICAgICAgIE9iamVjdC5rZXlzKHBhY2thZ2VDb250ZW50KS5mb3JFYWNoKGRlcHNLZXkgPT5cbiAgICAgICAgICBPYmplY3QuYXNzaWduKHBhY2thZ2VDb250ZW50W2RlcHNLZXldLCBfcGFja2FnZUNvbnRlbnRbZGVwc0tleV0pXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVzZSBjbG9zZXN0IHBhY2thZ2UuanNvblxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgcGFja2FnZUNvbnRlbnQsXG4gICAgICAgIGV4dHJhY3REZXBGaWVsZHMoXG4gICAgICAgICAgcmVhZFBrZ1VwLnN5bmMoe2N3ZDogY29udGV4dC5nZXRGaWxlbmFtZSgpLCBub3JtYWxpemU6IGZhbHNlfSkucGtnXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICBpZiAoIVtcbiAgICAgIHBhY2thZ2VDb250ZW50LmRlcGVuZGVuY2llcyxcbiAgICAgIHBhY2thZ2VDb250ZW50LmRldkRlcGVuZGVuY2llcyxcbiAgICAgIHBhY2thZ2VDb250ZW50Lm9wdGlvbmFsRGVwZW5kZW5jaWVzLFxuICAgICAgcGFja2FnZUNvbnRlbnQucGVlckRlcGVuZGVuY2llcyxcbiAgICAgIHBhY2thZ2VDb250ZW50LmJ1bmRsZWREZXBlbmRlbmNpZXMsXG4gICAgXS5zb21lKGhhc0tleXMpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBwYWNrYWdlQ29udGVudFxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHBhdGhzLmxlbmd0aCA+IDAgJiYgZS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICBtZXNzYWdlOiAnVGhlIHBhY2thZ2UuanNvbiBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZC4nLFxuICAgICAgICBsb2M6IHsgbGluZTogMCwgY29sdW1uOiAwIH0sXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZS5uYW1lID09PSAnSlNPTkVycm9yJyB8fCBlIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHtcbiAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgbWVzc2FnZTogJ1RoZSBwYWNrYWdlLmpzb24gZmlsZSBjb3VsZCBub3QgYmUgcGFyc2VkOiAnICsgZS5tZXNzYWdlLFxuICAgICAgICBsb2M6IHsgbGluZTogMCwgY29sdW1uOiAwIH0sXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuZnVuY3Rpb24gbWlzc2luZ0Vycm9yTWVzc2FnZShwYWNrYWdlTmFtZSkge1xuICByZXR1cm4gYCcke3BhY2thZ2VOYW1lfScgc2hvdWxkIGJlIGxpc3RlZCBpbiB0aGUgcHJvamVjdCdzIGRlcGVuZGVuY2llcy4gYCArXG4gICAgYFJ1biAnbnBtIGkgLVMgJHtwYWNrYWdlTmFtZX0nIHRvIGFkZCBpdGBcbn1cblxuZnVuY3Rpb24gZGV2RGVwRXJyb3JNZXNzYWdlKHBhY2thZ2VOYW1lKSB7XG4gIHJldHVybiBgJyR7cGFja2FnZU5hbWV9JyBzaG91bGQgYmUgbGlzdGVkIGluIHRoZSBwcm9qZWN0J3MgZGVwZW5kZW5jaWVzLCBub3QgZGV2RGVwZW5kZW5jaWVzLmBcbn1cblxuZnVuY3Rpb24gb3B0RGVwRXJyb3JNZXNzYWdlKHBhY2thZ2VOYW1lKSB7XG4gIHJldHVybiBgJyR7cGFja2FnZU5hbWV9JyBzaG91bGQgYmUgbGlzdGVkIGluIHRoZSBwcm9qZWN0J3MgZGVwZW5kZW5jaWVzLCBgICtcbiAgICBgbm90IG9wdGlvbmFsRGVwZW5kZW5jaWVzLmBcbn1cblxuZnVuY3Rpb24gcmVwb3J0SWZNaXNzaW5nKGNvbnRleHQsIGRlcHMsIGRlcHNPcHRpb25zLCBub2RlLCBuYW1lKSB7XG4gIC8vIERvIG5vdCByZXBvcnQgd2hlbiBpbXBvcnRpbmcgdHlwZXNcbiAgaWYgKG5vZGUuaW1wb3J0S2luZCA9PT0gJ3R5cGUnKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoaW1wb3J0VHlwZShuYW1lLCBjb250ZXh0KSAhPT0gJ2V4dGVybmFsJykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKG5hbWUsIGNvbnRleHQpXG4gIGlmICghcmVzb2x2ZWQpIHsgcmV0dXJuIH1cblxuICBjb25zdCBzcGxpdE5hbWUgPSBuYW1lLnNwbGl0KCcvJylcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBzcGxpdE5hbWVbMF1bMF0gPT09ICdAJ1xuICAgID8gc3BsaXROYW1lLnNsaWNlKDAsIDIpLmpvaW4oJy8nKVxuICAgIDogc3BsaXROYW1lWzBdXG4gIGNvbnN0IGlzSW5EZXBzID0gZGVwcy5kZXBlbmRlbmNpZXNbcGFja2FnZU5hbWVdICE9PSB1bmRlZmluZWRcbiAgY29uc3QgaXNJbkRldkRlcHMgPSBkZXBzLmRldkRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV0gIT09IHVuZGVmaW5lZFxuICBjb25zdCBpc0luT3B0RGVwcyA9IGRlcHMub3B0aW9uYWxEZXBlbmRlbmNpZXNbcGFja2FnZU5hbWVdICE9PSB1bmRlZmluZWRcbiAgY29uc3QgaXNJblBlZXJEZXBzID0gZGVwcy5wZWVyRGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXSAhPT0gdW5kZWZpbmVkXG4gIGNvbnN0IGlzSW5CdW5kbGVkRGVwcyA9IGRlcHMuYnVuZGxlZERlcGVuZGVuY2llcy5pbmRleE9mKHBhY2thZ2VOYW1lKSAhPT0gLTFcblxuICBpZiAoaXNJbkRlcHMgfHxcbiAgICAoZGVwc09wdGlvbnMuYWxsb3dEZXZEZXBzICYmIGlzSW5EZXZEZXBzKSB8fFxuICAgIChkZXBzT3B0aW9ucy5hbGxvd1BlZXJEZXBzICYmIGlzSW5QZWVyRGVwcykgfHxcbiAgICAoZGVwc09wdGlvbnMuYWxsb3dPcHREZXBzICYmIGlzSW5PcHREZXBzKSB8fFxuICAgIChkZXBzT3B0aW9ucy5hbGxvd0J1bmRsZWREZXBzICYmIGlzSW5CdW5kbGVkRGVwcylcbiAgKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoaXNJbkRldkRlcHMgJiYgIWRlcHNPcHRpb25zLmFsbG93RGV2RGVwcykge1xuICAgIGNvbnRleHQucmVwb3J0KG5vZGUsIGRldkRlcEVycm9yTWVzc2FnZShwYWNrYWdlTmFtZSkpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoaXNJbk9wdERlcHMgJiYgIWRlcHNPcHRpb25zLmFsbG93T3B0RGVwcykge1xuICAgIGNvbnRleHQucmVwb3J0KG5vZGUsIG9wdERlcEVycm9yTWVzc2FnZShwYWNrYWdlTmFtZSkpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb250ZXh0LnJlcG9ydChub2RlLCBtaXNzaW5nRXJyb3JNZXNzYWdlKHBhY2thZ2VOYW1lKSlcbn1cblxuZnVuY3Rpb24gdGVzdENvbmZpZyhjb25maWcsIGZpbGVuYW1lKSB7XG4gIC8vIFNpbXBsZXN0IGNvbmZpZ3VyYXRpb24gZmlyc3QsIGVpdGhlciBhIGJvb2xlYW4gb3Igbm90aGluZy5cbiAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgY29uZmlnID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBjb25maWdcbiAgfVxuICAvLyBBcnJheSBvZiBnbG9icy5cbiAgcmV0dXJuIGNvbmZpZy5zb21lKGMgPT4gKFxuICAgIG1pbmltYXRjaChmaWxlbmFtZSwgYykgfHxcbiAgICBtaW5pbWF0Y2goZmlsZW5hbWUsIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBjKSlcbiAgKSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAncHJvYmxlbScsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcycpLFxuICAgIH0sXG5cbiAgICBzY2hlbWE6IFtcbiAgICAgIHtcbiAgICAgICAgJ3R5cGUnOiAnb2JqZWN0JyxcbiAgICAgICAgJ3Byb3BlcnRpZXMnOiB7XG4gICAgICAgICAgJ2RldkRlcGVuZGVuY2llcyc6IHsgJ3R5cGUnOiBbJ2Jvb2xlYW4nLCAnYXJyYXknXSB9LFxuICAgICAgICAgICdvcHRpb25hbERlcGVuZGVuY2llcyc6IHsgJ3R5cGUnOiBbJ2Jvb2xlYW4nLCAnYXJyYXknXSB9LFxuICAgICAgICAgICdwZWVyRGVwZW5kZW5jaWVzJzogeyAndHlwZSc6IFsnYm9vbGVhbicsICdhcnJheSddIH0sXG4gICAgICAgICAgJ2J1bmRsZWREZXBlbmRlbmNpZXMnOiB7ICd0eXBlJzogWydib29sZWFuJywgJ2FycmF5J10gfSxcbiAgICAgICAgICAncGFja2FnZURpcic6IHsgJ3R5cGUnOiBbJ3N0cmluZycsICdhcnJheSddIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdhZGRpdGlvbmFsUHJvcGVydGllcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHt9XG4gICAgY29uc3QgZmlsZW5hbWUgPSBjb250ZXh0LmdldEZpbGVuYW1lKClcbiAgICBjb25zdCBkZXBzID0gZ2V0RGVwZW5kZW5jaWVzKGNvbnRleHQsIG9wdGlvbnMucGFja2FnZURpcikgfHwgZXh0cmFjdERlcEZpZWxkcyh7fSlcblxuICAgIGNvbnN0IGRlcHNPcHRpb25zID0ge1xuICAgICAgYWxsb3dEZXZEZXBzOiB0ZXN0Q29uZmlnKG9wdGlvbnMuZGV2RGVwZW5kZW5jaWVzLCBmaWxlbmFtZSkgIT09IGZhbHNlLFxuICAgICAgYWxsb3dPcHREZXBzOiB0ZXN0Q29uZmlnKG9wdGlvbnMub3B0aW9uYWxEZXBlbmRlbmNpZXMsIGZpbGVuYW1lKSAhPT0gZmFsc2UsXG4gICAgICBhbGxvd1BlZXJEZXBzOiB0ZXN0Q29uZmlnKG9wdGlvbnMucGVlckRlcGVuZGVuY2llcywgZmlsZW5hbWUpICE9PSBmYWxzZSxcbiAgICAgIGFsbG93QnVuZGxlZERlcHM6IHRlc3RDb25maWcob3B0aW9ucy5idW5kbGVkRGVwZW5kZW5jaWVzLCBmaWxlbmFtZSkgIT09IGZhbHNlLFxuICAgIH1cblxuICAgIC8vIHRvZG86IHVzZSBtb2R1bGUgdmlzaXRvciBmcm9tIG1vZHVsZS11dGlscyBjb3JlXG4gICAgcmV0dXJuIHtcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5zb3VyY2UpIHtcbiAgICAgICAgICByZXBvcnRJZk1pc3NpbmcoY29udGV4dCwgZGVwcywgZGVwc09wdGlvbnMsIG5vZGUsIG5vZGUuc291cmNlLnZhbHVlKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgRXhwb3J0TmFtZWREZWNsYXJhdGlvbjogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuc291cmNlKSB7XG4gICAgICAgICAgcmVwb3J0SWZNaXNzaW5nKGNvbnRleHQsIGRlcHMsIGRlcHNPcHRpb25zLCBub2RlLCBub2RlLnNvdXJjZS52YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5zb3VyY2UpIHtcbiAgICAgICAgICByZXBvcnRJZk1pc3NpbmcoY29udGV4dCwgZGVwcywgZGVwc09wdGlvbnMsIG5vZGUsIG5vZGUuc291cmNlLnZhbHVlKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ2FsbEV4cHJlc3Npb246IGZ1bmN0aW9uIGhhbmRsZVJlcXVpcmVzKG5vZGUpIHtcbiAgICAgICAgaWYgKGlzU3RhdGljUmVxdWlyZShub2RlKSkge1xuICAgICAgICAgIHJlcG9ydElmTWlzc2luZyhjb250ZXh0LCBkZXBzLCBkZXBzT3B0aW9ucywgbm9kZSwgbm9kZS5hcmd1bWVudHNbMF0udmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+
+    return (0, _moduleVisitor2.default)(node => {
+      reportIfMissing(context, deps, depsOptions, node, node.value);
+    }, { commonjs: true });
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcy5qcyJdLCJuYW1lcyI6WyJoYXNLZXlzIiwib2JqIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImFycmF5T3JLZXlzIiwiYXJyYXlPck9iamVjdCIsIkFycmF5IiwiaXNBcnJheSIsImV4dHJhY3REZXBGaWVsZHMiLCJwa2ciLCJkZXBlbmRlbmNpZXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJvcHRpb25hbERlcGVuZGVuY2llcyIsInBlZXJEZXBlbmRlbmNpZXMiLCJidW5kbGVkRGVwZW5kZW5jaWVzIiwiYnVuZGxlRGVwZW5kZW5jaWVzIiwiZ2V0RGVwZW5kZW5jaWVzIiwiY29udGV4dCIsInBhY2thZ2VEaXIiLCJwYXRocyIsInBhY2thZ2VDb250ZW50IiwicGF0aCIsInJlc29sdmUiLCJtYXAiLCJkaXIiLCJmb3JFYWNoIiwiX3BhY2thZ2VDb250ZW50IiwiSlNPTiIsInBhcnNlIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJqb2luIiwiZGVwc0tleSIsImFzc2lnbiIsInJlYWRQa2dVcCIsInN5bmMiLCJjd2QiLCJnZXRGaWxlbmFtZSIsIm5vcm1hbGl6ZSIsInNvbWUiLCJlIiwiY29kZSIsInJlcG9ydCIsIm1lc3NhZ2UiLCJsb2MiLCJsaW5lIiwiY29sdW1uIiwibmFtZSIsIlN5bnRheEVycm9yIiwibWlzc2luZ0Vycm9yTWVzc2FnZSIsInBhY2thZ2VOYW1lIiwiZGV2RGVwRXJyb3JNZXNzYWdlIiwib3B0RGVwRXJyb3JNZXNzYWdlIiwicmVwb3J0SWZNaXNzaW5nIiwiZGVwcyIsImRlcHNPcHRpb25zIiwibm9kZSIsImltcG9ydEtpbmQiLCJwYXJlbnQiLCJyZXNvbHZlZCIsInNwbGl0TmFtZSIsInNwbGl0Iiwic2xpY2UiLCJpc0luRGVwcyIsInVuZGVmaW5lZCIsImlzSW5EZXZEZXBzIiwiaXNJbk9wdERlcHMiLCJpc0luUGVlckRlcHMiLCJpc0luQnVuZGxlZERlcHMiLCJpbmRleE9mIiwiYWxsb3dEZXZEZXBzIiwiYWxsb3dQZWVyRGVwcyIsImFsbG93T3B0RGVwcyIsImFsbG93QnVuZGxlZERlcHMiLCJ0ZXN0Q29uZmlnIiwiY29uZmlnIiwiZmlsZW5hbWUiLCJjIiwicHJvY2VzcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJvcHRpb25zIiwidmFsdWUiLCJjb21tb25qcyJdLCJtYXBwaW5ncyI6ImFBQUEsNEI7QUFDQSx3QjtBQUNBLHdDO0FBQ0Esc0M7QUFDQSxzRDtBQUNBLGtFO0FBQ0EsZ0Q7QUFDQSxxQzs7QUFFQSxTQUFTQSxPQUFULEdBQTJCLEtBQVZDLEdBQVUsdUVBQUosRUFBSTtBQUN6QixTQUFPQyxPQUFPQyxJQUFQLENBQVlGLEdBQVosRUFBaUJHLE1BQWpCLEdBQTBCLENBQWpDO0FBQ0Q7O0FBRUQsU0FBU0MsV0FBVCxDQUFxQkMsYUFBckIsRUFBb0M7QUFDbEMsU0FBT0MsTUFBTUMsT0FBTixDQUFjRixhQUFkLElBQStCQSxhQUEvQixHQUErQ0osT0FBT0MsSUFBUCxDQUFZRyxhQUFaLENBQXREO0FBQ0Q7O0FBRUQsU0FBU0csZ0JBQVQsQ0FBMEJDLEdBQTFCLEVBQStCO0FBQzdCLFNBQU87QUFDTEMsa0JBQWNELElBQUlDLFlBQUosSUFBb0IsRUFEN0I7QUFFTEMscUJBQWlCRixJQUFJRSxlQUFKLElBQXVCLEVBRm5DO0FBR0xDLDBCQUFzQkgsSUFBSUcsb0JBQUosSUFBNEIsRUFIN0M7QUFJTEMsc0JBQWtCSixJQUFJSSxnQkFBSixJQUF3QixFQUpyQztBQUtMO0FBQ0E7QUFDQUMseUJBQXFCVixZQUFZSyxJQUFJTSxrQkFBSixJQUEwQk4sSUFBSUssbUJBQTlCLElBQXFELEVBQWpFLENBUGhCLEVBQVA7O0FBU0Q7O0FBRUQsU0FBU0UsZUFBVCxDQUF5QkMsT0FBekIsRUFBa0NDLFVBQWxDLEVBQThDO0FBQzVDLE1BQUlDLFFBQVEsRUFBWjtBQUNBLE1BQUk7QUFDRixVQUFN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USxDQUFDLFNBQUQsRUFBWSxPQUFaLENBQVYsRUFKWDtBQUtaLHNCQUFjLEVBQUUsUUFBUSxDQUFDLFFBQUQsRUFBVyxPQUFYLENBQVYsRUFMRixFQUZoQjs7QUFTRSw4QkFBd0IsS0FUMUIsRUFETSxDQU5KLEVBRFM7Ozs7O0FBc0JmQyxVQUFRLFVBQVVyRSxPQUFWLEVBQW1CO0FBQ3pCLFVBQU1zRSxVQUFVdEUsUUFBUXNFLE9BQVIsQ0FBZ0IsQ0FBaEIsS0FBc0IsRUFBdEM7QUFDQSxVQUFNWCxXQUFXM0QsUUFBUW9CLFdBQVIsRUFBakI7QUFDQSxVQUFNaUIsT0FBT3RDLGdCQUFnQkMsT0FBaEIsRUFBeUJzRSxRQUFRckUsVUFBakMsS0FBZ0RWLGlCQUFpQixFQUFqQixDQUE3RDs7QUFFQSxVQUFNK0MsY0FBYztBQUNsQmUsb0JBQWNJLFdBQVdhLFFBQVE1RSxlQUFuQixFQUFvQ2lFLFFBQXBDLE1BQWtELEtBRDlDO0FBRWxCSixvQkFBY0UsV0FBV2EsUUFBUTNFLG9CQUFuQixFQUF5Q2dFLFFBQXpDLE1BQXVELEtBRm5EO0FBR2xCTCxxQkFBZUcsV0FBV2EsUUFBUTFFLGdCQUFuQixFQUFxQytELFFBQXJDLE1BQW1ELEtBSGhEO0FBSWxCSCx3QkFBa0JDLFdBQVdhLFFBQVF6RSxtQkFBbkIsRUFBd0M4RCxRQUF4QyxNQUFzRCxLQUp0RCxFQUFwQjs7O0FBT0EsV0FBTyw2QkFBY3BCLFFBQVE7QUFDM0JILHNCQUFnQnBDLE9BQWhCLEVBQXlCcUMsSUFBekIsRUFBK0JDLFdBQS9CLEVBQTRDQyxJQUE1QyxFQUFrREEsS0FBS2dDLEtBQXZEO0FBQ0QsS0FGTSxFQUVKLEVBQUNDLFVBQVUsSUFBWCxFQUZJLENBQVA7QUFHRCxHQXJDYyxFQUFqQiIsImZpbGUiOiJuby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgcmVhZFBrZ1VwIGZyb20gJ3JlYWQtcGtnLXVwJ1xuaW1wb3J0IG1pbmltYXRjaCBmcm9tICdtaW5pbWF0Y2gnXG5pbXBvcnQgcmVzb2x2ZSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL3Jlc29sdmUnXG5pbXBvcnQgbW9kdWxlVmlzaXRvciBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL21vZHVsZVZpc2l0b3InXG5pbXBvcnQgaW1wb3J0VHlwZSBmcm9tICcuLi9jb3JlL2ltcG9ydFR5cGUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5mdW5jdGlvbiBoYXNLZXlzKG9iaiA9IHt9KSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA+IDBcbn1cblxuZnVuY3Rpb24gYXJyYXlPcktleXMoYXJyYXlPck9iamVjdCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcnJheU9yT2JqZWN0KSA/IGFycmF5T3JPYmplY3QgOiBPYmplY3Qua2V5cyhhcnJheU9yT2JqZWN0KVxufVxuXG5mdW5jdGlvbiBleHRyYWN0RGVwRmllbGRzKHBrZykge1xuICByZXR1cm4ge1xuICAgIGRlcGVuZGVuY2llczogcGtnLmRlcGVuZGVuY2llcyB8fCB7fSxcbiAgICBkZXZEZXBlbmRlbmNpZXM6IHBrZy5kZXZEZXBlbmRlbmNpZXMgfHwge30sXG4gICAgb3B0aW9uYWxEZXBlbmRlbmNpZXM6IHBrZy5vcHRpb25hbERlcGVuZGVuY2llcyB8fCB7fSxcbiAgICBwZWVyRGVwZW5kZW5jaWVzOiBwa2cucGVlckRlcGVuZGVuY2llcyB8fCB7fSxcbiAgICAvLyBCdW5kbGVkRGVwcyBzaG91bGQgYmUgaW4gdGhlIGZvcm0gb2YgYW4gYXJyYXksIGJ1dCBvYmplY3Qgbm90YXRpb24gaXMgYWxzbyBzdXBwb3J0ZWQgYnlcbiAgICAvLyBgbnBtYCwgc28gd2UgY29udmVydCBpdCB0byBhbiBhcnJheSBpZiBpdCBpcyBhbiBvYmplY3RcbiAgICBidW5kbGVkRGVwZW5kZW5jaWVzOiBhcnJheU9yS2V5cyhwa2cuYnVuZGxlRGVwZW5kZW5jaWVzIHx8IHBrZy5idW5kbGVkRGVwZW5kZW5jaWVzIHx8IFtdKSxcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmNpZXMoY29udGV4dCwgcGFja2FnZURpcikge1xuICBsZXQgcGF0aHMgPSBbXVxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VDb250ZW50ID0ge1xuICAgICAgZGVwZW5kZW5jaWVzOiB7fSxcbiAgICAgIGRldkRlcGVuZGVuY2llczoge30sXG4gICAgICBvcHRpb25hbERlcGVuZGVuY2llczoge30sXG4gICAgICBwZWVyRGVwZW5kZW5jaWVzOiB7fSxcbiAgICAgIGJ1bmRsZWREZXBlbmRlbmNpZXM6IFtdLFxuICAgIH1cblxuICAgIGlmIChwYWNrYWdlRGlyICYmIHBhY2thZ2VEaXIubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhY2thZ2VEaXIpKSB7XG4gICAgICAgIHBhdGhzID0gW3BhdGgucmVzb2x2ZShwYWNrYWdlRGlyKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGhzID0gcGFja2FnZURpci5tYXAoZGlyID0+IHBhdGgucmVzb2x2ZShkaXIpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyB1c2UgcnVsZSBjb25maWcgdG8gZmluZCBwYWNrYWdlLmpzb25cbiAgICAgIHBhdGhzLmZvckVhY2goZGlyID0+IHtcbiAgICAgICAgY29uc3QgX3BhY2thZ2VDb250ZW50ID0gZXh0cmFjdERlcEZpZWxkcyhcbiAgICAgICAgICBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpXG4gICAgICAgIClcbiAgICAgICAgT2JqZWN0LmtleXMocGFja2FnZUNvbnRlbnQpLmZvckVhY2goZGVwc0tleSA9PlxuICAgICAgICAgIE9iamVjdC5hc3NpZ24ocGFja2FnZUNvbnRlbnRbZGVwc0tleV0sIF9wYWNrYWdlQ29udGVudFtkZXBzS2V5XSlcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXNlIGNsb3Nlc3QgcGFja2FnZS5qc29uXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICBwYWNrYWdlQ29udGVudCxcbiAgICAgICAgZXh0cmFjdERlcEZpZWxkcyhcbiAgICAgICAgICByZWFkUGtnVXAuc3luYyh7Y3dkOiBjb250ZXh0LmdldEZpbGVuYW1lKCksIG5vcm1hbGl6ZTogZmFsc2V9KS5wa2dcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICghW1xuICAgICAgcGFja2FnZUNvbnRlbnQuZGVwZW5kZW5jaWVzLFxuICAgICAgcGFja2FnZUNvbnRlbnQuZGV2RGVwZW5kZW5jaWVzLFxuICAgICAgcGFja2FnZUNvbnRlbnQub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgICBwYWNrYWdlQ29udGVudC5wZWVyRGVwZW5kZW5jaWVzLFxuICAgICAgcGFja2FnZUNvbnRlbnQuYnVuZGxlZERlcGVuZGVuY2llcyxcbiAgICBdLnNvbWUoaGFzS2V5cykpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhY2thZ2VDb250ZW50XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAocGF0aHMubGVuZ3RoID4gMCAmJiBlLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgIG1lc3NhZ2U6ICdUaGUgcGFja2FnZS5qc29uIGZpbGUgY291bGQgbm90IGJlIGZvdW5kLicsXG4gICAgICAgIGxvYzogeyBsaW5lOiAwLCBjb2x1bW46IDAgfSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlLm5hbWUgPT09ICdKU09ORXJyb3InIHx8IGUgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikge1xuICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICBtZXNzYWdlOiAnVGhlIHBhY2thZ2UuanNvbiBmaWxlIGNvdWxkIG5vdCBiZSBwYXJzZWQ6ICcgKyBlLm1lc3NhZ2UsXG4gICAgICAgIGxvYzogeyBsaW5lOiAwLCBjb2x1bW46IDAgfSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5mdW5jdGlvbiBtaXNzaW5nRXJyb3JNZXNzYWdlKHBhY2thZ2VOYW1lKSB7XG4gIHJldHVybiBgJyR7cGFja2FnZU5hbWV9JyBzaG91bGQgYmUgbGlzdGVkIGluIHRoZSBwcm9qZWN0J3MgZGVwZW5kZW5jaWVzLiBgICtcbiAgICBgUnVuICducG0gaSAtUyAke3BhY2thZ2VOYW1lfScgdG8gYWRkIGl0YFxufVxuXG5mdW5jdGlvbiBkZXZEZXBFcnJvck1lc3NhZ2UocGFja2FnZU5hbWUpIHtcbiAgcmV0dXJuIGAnJHtwYWNrYWdlTmFtZX0nIHNob3VsZCBiZSBsaXN0ZWQgaW4gdGhlIHByb2plY3QncyBkZXBlbmRlbmNpZXMsIG5vdCBkZXZEZXBlbmRlbmNpZXMuYFxufVxuXG5mdW5jdGlvbiBvcHREZXBFcnJvck1lc3NhZ2UocGFja2FnZU5hbWUpIHtcbiAgcmV0dXJuIGAnJHtwYWNrYWdlTmFtZX0nIHNob3VsZCBiZSBsaXN0ZWQgaW4gdGhlIHByb2plY3QncyBkZXBlbmRlbmNpZXMsIGAgK1xuICAgIGBub3Qgb3B0aW9uYWxEZXBlbmRlbmNpZXMuYFxufVxuXG5mdW5jdGlvbiByZXBvcnRJZk1pc3NpbmcoY29udGV4dCwgZGVwcywgZGVwc09wdGlvbnMsIG5vZGUsIG5hbWUpIHtcbiAgLy8gRG8gbm90IHJlcG9ydCB3aGVuIGltcG9ydGluZyB0eXBlc1xuICBpZiAobm9kZS5pbXBvcnRLaW5kID09PSAndHlwZScgfHwgKG5vZGUucGFyZW50ICYmIG5vZGUucGFyZW50LmltcG9ydEtpbmQgPT09ICd0eXBlJykpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChpbXBvcnRUeXBlKG5hbWUsIGNvbnRleHQpICE9PSAnZXh0ZXJuYWwnKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmUobmFtZSwgY29udGV4dClcbiAgaWYgKCFyZXNvbHZlZCkgeyByZXR1cm4gfVxuXG4gIGNvbnN0IHNwbGl0TmFtZSA9IG5hbWUuc3BsaXQoJy8nKVxuICBjb25zdCBwYWNrYWdlTmFtZSA9IHNwbGl0TmFtZVswXVswXSA9PT0gJ0AnXG4gICAgPyBzcGxpdE5hbWUuc2xpY2UoMCwgMikuam9pbignLycpXG4gICAgOiBzcGxpdE5hbWVbMF1cbiAgY29uc3QgaXNJbkRlcHMgPSBkZXBzLmRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV0gIT09IHVuZGVmaW5lZFxuICBjb25zdCBpc0luRGV2RGVwcyA9IGRlcHMuZGV2RGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXSAhPT0gdW5kZWZpbmVkXG4gIGNvbnN0IGlzSW5PcHREZXBzID0gZGVwcy5vcHRpb25hbERlcGVuZGVuY2llc1twYWNrYWdlTmFtZV0gIT09IHVuZGVmaW5lZFxuICBjb25zdCBpc0luUGVlckRlcHMgPSBkZXBzLnBlZXJEZXBlbmRlbmNpZXNbcGFja2FnZU5hbWVdICE9PSB1bmRlZmluZWRcbiAgY29uc3QgaXNJbkJ1bmRsZWREZXBzID0gZGVwcy5idW5kbGVkRGVwZW5kZW5jaWVzLmluZGV4T2YocGFja2FnZU5hbWUpICE9PSAtMVxuXG4gIGlmIChpc0luRGVwcyB8fFxuICAgIChkZXBzT3B0aW9ucy5hbGxvd0RldkRlcHMgJiYgaXNJbkRldkRlcHMpIHx8XG4gICAgKGRlcHNPcHRpb25zLmFsbG93UGVlckRlcHMgJiYgaXNJblBlZXJEZXBzKSB8fFxuICAgIChkZXBzT3B0aW9ucy5hbGxvd09wdERlcHMgJiYgaXNJbk9wdERlcHMpIHx8XG4gICAgKGRlcHNPcHRpb25zLmFsbG93QnVuZGxlZERlcHMgJiYgaXNJbkJ1bmRsZWREZXBzKVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChpc0luRGV2RGVwcyAmJiAhZGVwc09wdGlvbnMuYWxsb3dEZXZEZXBzKSB7XG4gICAgY29udGV4dC5yZXBvcnQobm9kZSwgZGV2RGVwRXJyb3JNZXNzYWdlKHBhY2thZ2VOYW1lKSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChpc0luT3B0RGVwcyAmJiAhZGVwc09wdGlvbnMuYWxsb3dPcHREZXBzKSB7XG4gICAgY29udGV4dC5yZXBvcnQobm9kZSwgb3B0RGVwRXJyb3JNZXNzYWdlKHBhY2thZ2VOYW1lKSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnRleHQucmVwb3J0KG5vZGUsIG1pc3NpbmdFcnJvck1lc3NhZ2UocGFja2FnZU5hbWUpKVxufVxuXG5mdW5jdGlvbiB0ZXN0Q29uZmlnKGNvbmZpZywgZmlsZW5hbWUpIHtcbiAgLy8gU2ltcGxlc3QgY29uZmlndXJhdGlvbiBmaXJzdCwgZWl0aGVyIGEgYm9vbGVhbiBvciBub3RoaW5nLlxuICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBjb25maWcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG4gIC8vIEFycmF5IG9mIGdsb2JzLlxuICByZXR1cm4gY29uZmlnLnNvbWUoYyA9PiAoXG4gICAgbWluaW1hdGNoKGZpbGVuYW1lLCBjKSB8fFxuICAgIG1pbmltYXRjaChmaWxlbmFtZSwgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGMpKVxuICApKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzJyksXG4gICAgfSxcblxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICAndHlwZSc6ICdvYmplY3QnLFxuICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAnZGV2RGVwZW5kZW5jaWVzJzogeyAndHlwZSc6IFsnYm9vbGVhbicsICdhcnJheSddIH0sXG4gICAgICAgICAgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJzogeyAndHlwZSc6IFsnYm9vbGVhbicsICdhcnJheSddIH0sXG4gICAgICAgICAgJ3BlZXJEZXBlbmRlbmNpZXMnOiB7ICd0eXBlJzogWydib29sZWFuJywgJ2FycmF5J10gfSxcbiAgICAgICAgICAnYnVuZGxlZERlcGVuZGVuY2llcyc6IHsgJ3R5cGUnOiBbJ2Jvb2xlYW4nLCAnYXJyYXknXSB9LFxuICAgICAgICAgICdwYWNrYWdlRGlyJzogeyAndHlwZSc6IFsnc3RyaW5nJywgJ2FycmF5J10gfSxcbiAgICAgICAgfSxcbiAgICAgICAgJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnNbMF0gfHwge31cbiAgICBjb25zdCBmaWxlbmFtZSA9IGNvbnRleHQuZ2V0RmlsZW5hbWUoKVxuICAgIGNvbnN0IGRlcHMgPSBnZXREZXBlbmRlbmNpZXMoY29udGV4dCwgb3B0aW9ucy5wYWNrYWdlRGlyKSB8fCBleHRyYWN0RGVwRmllbGRzKHt9KVxuXG4gICAgY29uc3QgZGVwc09wdGlvbnMgPSB7XG4gICAgICBhbGxvd0RldkRlcHM6IHRlc3RDb25maWcob3B0aW9ucy5kZXZEZXBlbmRlbmNpZXMsIGZpbGVuYW1lKSAhPT0gZmFsc2UsXG4gICAgICBhbGxvd09wdERlcHM6IHRlc3RDb25maWcob3B0aW9ucy5vcHRpb25hbERlcGVuZGVuY2llcywgZmlsZW5hbWUpICE9PSBmYWxzZSxcbiAgICAgIGFsbG93UGVlckRlcHM6IHRlc3RDb25maWcob3B0aW9ucy5wZWVyRGVwZW5kZW5jaWVzLCBmaWxlbmFtZSkgIT09IGZhbHNlLFxuICAgICAgYWxsb3dCdW5kbGVkRGVwczogdGVzdENvbmZpZyhvcHRpb25zLmJ1bmRsZWREZXBlbmRlbmNpZXMsIGZpbGVuYW1lKSAhPT0gZmFsc2UsXG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZVZpc2l0b3Iobm9kZSA9PiB7XG4gICAgICByZXBvcnRJZk1pc3NpbmcoY29udGV4dCwgZGVwcywgZGVwc09wdGlvbnMsIG5vZGUsIG5vZGUudmFsdWUpXG4gICAgfSwge2NvbW1vbmpzOiB0cnVlfSlcbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-internal-modules.js b/node_modules/eslint-plugin-import/lib/rules/no-internal-modules.js
index 43d6b28..32d90d1 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-internal-modules.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-internal-modules.js
@@ -1,49 +1,32 @@
-'use strict';
+'use strict';var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();var _minimatch = require('minimatch');var _minimatch2 = _interopRequireDefault(_minimatch);
 
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
-var _minimatch = require('minimatch');
-
-var _minimatch2 = _interopRequireDefault(_minimatch);
-
-var _resolve = require('eslint-module-utils/resolve');
-
-var _resolve2 = _interopRequireDefault(_resolve);
-
-var _importType = require('../core/importType');
-
-var _importType2 = _interopRequireDefault(_importType);
-
-var _staticRequire = require('../core/staticRequire');
-
-var _staticRequire2 = _interopRequireDefault(_staticRequire);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);
+var _importType = require('../core/importType');var _importType2 = _interopRequireDefault(_importType);
+var _staticRequire = require('../core/staticRequire');var _staticRequire2 = _interopRequireDefault(_staticRequire);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-internal-modules')
-    },
+      url: (0, _docsUrl2.default)('no-internal-modules') },
 
-    schema: [{
+
+    schema: [
+    {
       type: 'object',
       properties: {
         allow: {
           type: 'array',
           items: {
-            type: 'string'
-          }
-        }
-      },
-      additionalProperties: false
-    }]
-  },
+            type: 'string' } } },
+
+
+
+      additionalProperties: false }] },
+
+
+
 
   create: function noReachingInside(context) {
     const options = context.options[0] || {};
@@ -62,7 +45,9 @@
 
     // find a directory that is being reached into, but which shouldn't be
     function isReachViolation(importPath) {
-      const steps = normalizeSep(importPath).split('/').reduce((acc, step) => {
+      const steps = normalizeSep(importPath).
+      split('/').
+      reduce((acc, step) => {
         if (!step || step === '.') {
           return acc;
         } else if (step === '..') {
@@ -92,11 +77,13 @@
 
     function checkImportForReaching(importPath, node) {
       const potentialViolationTypes = ['parent', 'index', 'sibling', 'external', 'internal'];
-      if (potentialViolationTypes.indexOf((0, _importType2.default)(importPath, context)) !== -1 && isReachViolation(importPath)) {
+      if (potentialViolationTypes.indexOf((0, _importType2.default)(importPath, context)) !== -1 &&
+      isReachViolation(importPath))
+      {
         context.report({
           node,
-          message: `Reaching to "${importPath}" is not allowed.`
-        });
+          message: `Reaching to "${importPath}" is not allowed.` });
+
       }
     }
 
@@ -104,16 +91,20 @@
       ImportDeclaration(node) {
         checkImportForReaching(node.source.value, node.source);
       },
+      ExportAllDeclaration(node) {
+        checkImportForReaching(node.source.value, node.source);
+      },
+      ExportNamedDeclaration(node) {
+        if (node.source) {
+          checkImportForReaching(node.source.value, node.source);
+        }
+      },
       CallExpression(node) {
-        if ((0, _staticRequire2.default)(node)) {
-          var _node$arguments = _slicedToArray(node.arguments, 1);
-
-          const firstArgument = _node$arguments[0];
-
+        if ((0, _staticRequire2.default)(node)) {var _node$arguments = _slicedToArray(
+          node.arguments, 1);const firstArgument = _node$arguments[0];
           checkImportForReaching(firstArgument.value, firstArgument);
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1pbnRlcm5hbC1tb2R1bGVzLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiYWxsb3ciLCJpdGVtcyIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiY3JlYXRlIiwibm9SZWFjaGluZ0luc2lkZSIsImNvbnRleHQiLCJvcHRpb25zIiwiYWxsb3dSZWdleHBzIiwibWFwIiwicCIsIm1pbmltYXRjaCIsIm1ha2VSZSIsInJlYWNoaW5nQWxsb3dlZCIsImltcG9ydFBhdGgiLCJzb21lIiwicmUiLCJ0ZXN0Iiwibm9ybWFsaXplU2VwIiwic29tZVBhdGgiLCJzcGxpdCIsImpvaW4iLCJpc1JlYWNoVmlvbGF0aW9uIiwic3RlcHMiLCJyZWR1Y2UiLCJhY2MiLCJzdGVwIiwic2xpY2UiLCJjb25jYXQiLCJub25TY29wZVN0ZXBzIiwiZmlsdGVyIiwiaW5kZXhPZiIsImxlbmd0aCIsImp1c3RTdGVwcyIsInJlc29sdmVkIiwiY2hlY2tJbXBvcnRGb3JSZWFjaGluZyIsIm5vZGUiLCJwb3RlbnRpYWxWaW9sYXRpb25UeXBlcyIsInJlcG9ydCIsIm1lc3NhZ2UiLCJJbXBvcnREZWNsYXJhdGlvbiIsInNvdXJjZSIsInZhbHVlIiwiQ2FsbEV4cHJlc3Npb24iLCJhcmd1bWVudHMiLCJmaXJzdEFyZ3VtZW50Il0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUFBLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFlBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLHFCQUFSO0FBREQsS0FGRjs7QUFNSkMsWUFBUSxDQUNOO0FBQ0VILFlBQU0sUUFEUjtBQUVFSSxrQkFBWTtBQUNWQyxlQUFPO0FBQ0xMLGdCQUFNLE9BREQ7QUFFTE0saUJBQU87QUFD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QUEsK0NBQ0NBLEtBQUtRLFNBRE47O0FBQUEsZ0JBQ2pCQyxhQURpQjs7QUFFekJWLGlDQUF1QlUsY0FBY0gsS0FBckMsRUFBNENHLGFBQTVDO0FBQ0Q7QUFDRjtBQVRJLEtBQVA7QUFXRDtBQTdGYyxDQUFqQiIsImZpbGUiOiJuby1pbnRlcm5hbC1tb2R1bGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1pbmltYXRjaCBmcm9tICdtaW5pbWF0Y2gnXG5cbmltcG9ydCByZXNvbHZlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVzb2x2ZSdcbmltcG9ydCBpbXBvcnRUeXBlIGZyb20gJy4uL2NvcmUvaW1wb3J0VHlwZSdcbmltcG9ydCBpc1N0YXRpY1JlcXVpcmUgZnJvbSAnLi4vY29yZS9zdGF0aWNSZXF1aXJlJ1xuaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1pbnRlcm5hbC1tb2R1bGVzJyksXG4gICAgfSxcblxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGFsbG93OiB7XG4gICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIG5vUmVhY2hpbmdJbnNpZGUoY29udGV4dCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnNbMF0gfHwge31cbiAgICBjb25zdCBhbGxvd1JlZ2V4cHMgPSAob3B0aW9ucy5hbGxvdyB8fCBbXSkubWFwKHAgPT4gbWluaW1hdGNoLm1ha2VSZShwKSlcblxuICAgIC8vIHRlc3QgaWYgcmVhY2hpbmcgdG8gdGhpcyBkZXN0aW5hdGlvbiBpcyBhbGxvd2VkXG4gICAgZnVuY3Rpb24gcmVhY2hpbmdBbGxvd2VkKGltcG9ydFBhdGgpIHtcbiAgICAgIHJldHVybiBhbGxvd1JlZ2V4cHMuc29tZShyZSA9PiByZS50ZXN0KGltcG9ydFBhdGgpKVxuICAgIH1cblxuICAgIC8vIG1pbmltYXRjaCBwYXR0ZXJucyBhcmUgZXhwZWN0ZWQgdG8gdXNlIC8gcGF0aCBzZXBhcmF0b3JzLCBsaWtlIGltcG9ydFxuICAgIC8vIHN0YXRlbWVudHMsIHNvIG5vcm1hbGl6ZSBwYXRocyB0byB1c2UgdGhlIHNhbWVcbiAgICBmdW5jdGlvbiBub3JtYWxpemVTZXAoc29tZVBhdGgpIHtcbiAgICAgIHJldHVybiBzb21lUGF0aC5zcGxpdCgnXFxcXCcpLmpvaW4oJy8nKVxuICAgIH1cblxuICAgIC8vIGZpbmQgYSBkaXJlY3RvcnkgdGhhdCBpcyBiZWluZyByZWFjaGVkIGludG8sIGJ1dCB3aGljaCBzaG91bGRuJ3QgYmVcbiAgICBmdW5jdGlvbiBpc1JlYWNoVmlvbGF0aW9uKGltcG9ydFBhdGgpIHtcbiAgICAgIGNvbnN0IHN0ZXBzID0gbm9ybWFsaXplU2VwKGltcG9ydFBhdGgpXG4gICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgc3RlcCkgPT4ge1xuICAgICAgICAgIGlmICghc3RlcCB8fCBzdGVwID09PSAnLicpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0ZXAgPT09ICcuLicpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2Muc2xpY2UoMCwgLTEpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhY2MuY29uY2F0KHN0ZXApXG4gICAgICAgICAgfVxuICAgICAgICB9LCBbXSlcblxuICAgICAgY29uc3Qgbm9uU2NvcGVTdGVwcyA9IHN0ZXBzLmZpbHRlcihzdGVwID0+IHN0ZXAuaW5kZXhPZignQCcpICE9PSAwKVxuICAgICAgaWYgKG5vblNjb3BlU3RlcHMubGVuZ3RoIDw9IDEpIHJldHVybiBmYWxzZVxuXG4gICAgICAvLyBiZWZvcmUgdHJ5aW5nIHRvIHJlc29sdmUsIHNlZSBpZiB0aGUgcmF3IGltcG9ydCAod2l0aCByZWxhdGl2ZVxuICAgICAgLy8gc2VnbWVudHMgcmVzb2x2ZWQpIG1hdGNoZXMgYW4gYWxsb3dlZCBwYXR0ZXJuXG4gICAgICBjb25zdCBqdXN0U3RlcHMgPSBzdGVwcy5qb2luKCcvJylcbiAgICAgIGlmIChyZWFjaGluZ0FsbG93ZWQoanVzdFN0ZXBzKSB8fCByZWFjaGluZ0FsbG93ZWQoYC8ke2p1c3RTdGVwc31gKSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIC8vIGlmIHRoZSBpbXBvcnQgc3RhdGVtZW50IGRvZXNuJ3QgbWF0Y2ggZGlyZWN0bHksIHRyeSB0byBtYXRjaCB0aGVcbiAgICAgIC8vIHJlc29sdmVkIHBhdGggaWYgdGhlIGltcG9ydCBpcyByZXNvbHZhYmxlXG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmUoaW1wb3J0UGF0aCwgY29udGV4dClcbiAgICAgIGlmICghcmVzb2x2ZWQgfHwgcmVhY2hpbmdBbGxvd2VkKG5vcm1hbGl6ZVNlcChyZXNvbHZlZCkpKSByZXR1cm4gZmFsc2VcblxuICAgICAgLy8gdGhpcyBpbXBvcnQgd2FzIG5vdCBhbGxvd2VkIGJ5IHRoZSBhbGxvd2VkIHBhdGhzLCBhbmQgcmVhY2hlc1xuICAgICAgLy8gc28gaXQgaXMgYSB2aW9sYXRpb25cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tJbXBvcnRGb3JSZWFjaGluZyhpbXBvcnRQYXRoLCBub2RlKSB7XG4gICAgICBjb25zdCBwb3RlbnRpYWxWaW9sYXRpb25UeXBlcyA9IFsncGFyZW50JywgJ2luZGV4JywgJ3NpYmxpbmcnLCAnZXh0ZXJuYWwnLCAnaW50ZXJuYWwnXVxuICAgICAgaWYgKHBvdGVudGlhbFZpb2xhdGlvblR5cGVzLmluZGV4T2YoaW1wb3J0VHlwZShpbXBvcnRQYXRoLCBjb250ZXh0KSkgIT09IC0xICYmXG4gICAgICAgIGlzUmVhY2hWaW9sYXRpb24oaW1wb3J0UGF0aClcbiAgICAgICkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBtZXNzYWdlOiBgUmVhY2hpbmcgdG8gXCIke2ltcG9ydFBhdGh9XCIgaXMgbm90IGFsbG93ZWQuYCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgSW1wb3J0RGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgICBjaGVja0ltcG9ydEZvclJlYWNoaW5nKG5vZGUuc291cmNlLnZhbHVlLCBub2RlLnNvdXJjZSlcbiAgICAgIH0sXG4gICAgICBDYWxsRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICAgIGlmIChpc1N0YXRpY1JlcXVpcmUobm9kZSkpIHtcbiAgICAgICAgICBjb25zdCBbIGZpcnN0QXJndW1lbnQgXSA9IG5vZGUuYXJndW1lbnRzXG4gICAgICAgICAgY2hlY2tJbXBvcnRGb3JSZWFjaGluZyhmaXJzdEFyZ3VtZW50LnZhbHVlLCBmaXJzdEFyZ3VtZW50KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1pbnRlcm5hbC1tb2R1bGVzLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiYWxsb3ciLCJpdGVtcyIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiY3JlYXRlIiwibm9SZWFjaGluZ0luc2lkZSIsImNvbnRleHQiLCJvcHRpb25zIiwiYWxsb3dSZWdleHBzIiwibWFwIiwicCIsIm1pbmltYXRjaCIsIm1ha2VSZSIsInJlYWNoaW5nQWxsb3dlZCIsImltcG9ydFBhdGgiLCJzb21lIiwicmUiLCJ0ZXN0Iiwibm9ybWFsaXplU2VwIiwic29tZVBhdGgiLCJzcGxpdCIsImpvaW4iLCJpc1JlYWNoVmlvbGF0aW9uIiwic3RlcHMiLCJyZWR1Y2UiLCJhY2MiLCJzdGVwIiwic2xpY2UiLCJjb25jYXQiLCJub25TY29wZVN0ZXBzIiwiZmlsdGVyIiwiaW5kZXhPZiIsImxlbmd0aCIsImp1c3RTdGVwcyIsInJlc29sdmVkIiwiY2hlY2tJbXBvcnRGb3JSZWFjaGluZyIsIm5vZGUiLCJwb3RlbnRpYWxWaW9sYXRpb25UeXBlcyIsInJlcG9ydCIsIm1lc3NhZ2UiLCJJbXBvcnREZWNsYXJhdGlvbiIsInNvdXJjZSIsInZhbHVlIiwiRXhwb3J0QWxsRGVjbGFyYXRpb24iLCJFeHBvcnROYW1lZERlY2xhcmF0aW9uIiwiQ2FsbEV4cHJlc3Npb24iLCJhcmd1bWVudHMiLCJmaXJzdEFyZ3VtZW50Il0sIm1hcHBpbmdzIjoicW9CQUFBLHNDOztBQUVBLHNEO0FBQ0EsZ0Q7QUFDQSxzRDtBQUNBLHFDOztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxZQURGO0FBRUpDLFVBQU07QUFDSkMsV0FBSyx1QkFBUSxxQkFBUixDQURELEVBRkY7OztBQU1KQyxZQUFRO0FBQ047QUFDRUgsWUFBTSxRQURSO0FBRUVJLGtC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QkFBcUJQLElBQXJCLEVBQTJCO0FBQ3pCRCwrQkFBdUJDLEtBQUtLLE1BQUwsQ0FBWUMsS0FBbkMsRUFBMENOLEtBQUtLLE1BQS9DO0FBQ0QsT0FOSTtBQU9MRyw2QkFBdUJSLElBQXZCLEVBQTZCO0FBQzNCLFlBQUlBLEtBQUtLLE1BQVQsRUFBaUI7QUFDZk4saUNBQXVCQyxLQUFLSyxNQUFMLENBQVlDLEtBQW5DLEVBQTBDTixLQUFLSyxNQUEvQztBQUNEO0FBQ0YsT0FYSTtBQVlMSSxxQkFBZVQsSUFBZixFQUFxQjtBQUNuQixZQUFJLDZCQUFnQkEsSUFBaEIsQ0FBSixFQUEyQjtBQUNDQSxlQUFLVSxTQUROLFdBQ2pCQyxhQURpQjtBQUV6QlosaUNBQXVCWSxjQUFjTCxLQUFyQyxFQUE0Q0ssYUFBNUM7QUFDRDtBQUNGLE9BakJJLEVBQVA7O0FBbUJELEdBckdjLEVBQWpCIiwiZmlsZSI6Im5vLWludGVybmFsLW1vZHVsZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbWluaW1hdGNoIGZyb20gJ21pbmltYXRjaCdcblxuaW1wb3J0IHJlc29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJ1xuaW1wb3J0IGltcG9ydFR5cGUgZnJvbSAnLi4vY29yZS9pbXBvcnRUeXBlJ1xuaW1wb3J0IGlzU3RhdGljUmVxdWlyZSBmcm9tICcuLi9jb3JlL3N0YXRpY1JlcXVpcmUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLWludGVybmFsLW1vZHVsZXMnKSxcbiAgICB9LFxuXG4gICAgc2NoZW1hOiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgYWxsb3c6IHtcbiAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gbm9SZWFjaGluZ0luc2lkZShjb250ZXh0KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9uc1swXSB8fCB7fVxuICAgIGNvbnN0IGFsbG93UmVnZXhwcyA9IChvcHRpb25zLmFsbG93IHx8IFtdKS5tYXAocCA9PiBtaW5pbWF0Y2gubWFrZVJlKHApKVxuXG4gICAgLy8gdGVzdCBpZiByZWFjaGluZyB0byB0aGlzIGRlc3RpbmF0aW9uIGlzIGFsbG93ZWRcbiAgICBmdW5jdGlvbiByZWFjaGluZ0FsbG93ZWQoaW1wb3J0UGF0aCkge1xuICAgICAgcmV0dXJuIGFsbG93UmVnZXhwcy5zb21lKHJlID0+IHJlLnRlc3QoaW1wb3J0UGF0aCkpXG4gICAgfVxuXG4gICAgLy8gbWluaW1hdGNoIHBhdHRlcm5zIGFyZSBleHBlY3RlZCB0byB1c2UgLyBwYXRoIHNlcGFyYXRvcnMsIGxpa2UgaW1wb3J0XG4gICAgLy8gc3RhdGVtZW50cywgc28gbm9ybWFsaXplIHBhdGhzIHRvIHVzZSB0aGUgc2FtZVxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlcChzb21lUGF0aCkge1xuICAgICAgcmV0dXJuIHNvbWVQYXRoLnNwbGl0KCdcXFxcJykuam9pbignLycpXG4gICAgfVxuXG4gICAgLy8gZmluZCBhIGRpcmVjdG9yeSB0aGF0IGlzIGJlaW5nIHJlYWNoZWQgaW50bywgYnV0IHdoaWNoIHNob3VsZG4ndCBiZVxuICAgIGZ1bmN0aW9uIGlzUmVhY2hWaW9sYXRpb24oaW1wb3J0UGF0aCkge1xuICAgICAgY29uc3Qgc3RlcHMgPSBub3JtYWxpemVTZXAoaW1wb3J0UGF0aClcbiAgICAgICAgLnNwbGl0KCcvJylcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBzdGVwKSA9PiB7XG4gICAgICAgICAgaWYgKCFzdGVwIHx8IHN0ZXAgPT09ICcuJykge1xuICAgICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3RlcCA9PT0gJy4uJykge1xuICAgICAgICAgICAgcmV0dXJuIGFjYy5zbGljZSgwLCAtMSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGFjYy5jb25jYXQoc3RlcClcbiAgICAgICAgICB9XG4gICAgICAgIH0sIFtdKVxuXG4gICAgICBjb25zdCBub25TY29wZVN0ZXBzID0gc3RlcHMuZmlsdGVyKHN0ZXAgPT4gc3RlcC5pbmRleE9mKCdAJykgIT09IDApXG4gICAgICBpZiAobm9uU2NvcGVTdGVwcy5sZW5ndGggPD0gMSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIC8vIGJlZm9yZSB0cnlpbmcgdG8gcmVzb2x2ZSwgc2VlIGlmIHRoZSByYXcgaW1wb3J0ICh3aXRoIHJlbGF0aXZlXG4gICAgICAvLyBzZWdtZW50cyByZXNvbHZlZCkgbWF0Y2hlcyBhbiBhbGxvd2VkIHBhdHRlcm5cbiAgICAgIGNvbnN0IGp1c3RTdGVwcyA9IHN0ZXBzLmpvaW4oJy8nKVxuICAgICAgaWYgKHJlYWNoaW5nQWxsb3dlZChqdXN0U3RlcHMpIHx8IHJlYWNoaW5nQWxsb3dlZChgLyR7anVzdFN0ZXBzfWApKSByZXR1cm4gZmFsc2VcblxuICAgICAgLy8gaWYgdGhlIGltcG9ydCBzdGF0ZW1lbnQgZG9lc24ndCBtYXRjaCBkaXJlY3RseSwgdHJ5IHRvIG1hdGNoIHRoZVxuICAgICAgLy8gcmVzb2x2ZWQgcGF0aCBpZiB0aGUgaW1wb3J0IGlzIHJlc29sdmFibGVcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShpbXBvcnRQYXRoLCBjb250ZXh0KVxuICAgICAgaWYgKCFyZXNvbHZlZCB8fCByZWFjaGluZ0FsbG93ZWQobm9ybWFsaXplU2VwKHJlc29sdmVkKSkpIHJldHVybiBmYWxzZVxuXG4gICAgICAvLyB0aGlzIGltcG9ydCB3YXMgbm90IGFsbG93ZWQgYnkgdGhlIGFsbG93ZWQgcGF0aHMsIGFuZCByZWFjaGVzXG4gICAgICAvLyBzbyBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0ltcG9ydEZvclJlYWNoaW5nKGltcG9ydFBhdGgsIG5vZGUpIHtcbiAgICAgIGNvbnN0IHBvdGVudGlhbFZpb2xhdGlvblR5cGVzID0gWydwYXJlbnQnLCAnaW5kZXgnLCAnc2libGluZycsICdleHRlcm5hbCcsICdpbnRlcm5hbCddXG4gICAgICBpZiAocG90ZW50aWFsVmlvbGF0aW9uVHlwZXMuaW5kZXhPZihpbXBvcnRUeXBlKGltcG9ydFBhdGgsIGNvbnRleHQpKSAhPT0gLTEgJiZcbiAgICAgICAgaXNSZWFjaFZpb2xhdGlvbihpbXBvcnRQYXRoKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBSZWFjaGluZyB0byBcIiR7aW1wb3J0UGF0aH1cIiBpcyBub3QgYWxsb3dlZC5gLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBJbXBvcnREZWNsYXJhdGlvbihub2RlKSB7XG4gICAgICAgIGNoZWNrSW1wb3J0Rm9yUmVhY2hpbmcobm9kZS5zb3VyY2UudmFsdWUsIG5vZGUuc291cmNlKVxuICAgICAgfSxcbiAgICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgY2hlY2tJbXBvcnRGb3JSZWFjaGluZyhub2RlLnNvdXJjZS52YWx1ZSwgbm9kZS5zb3VyY2UpXG4gICAgICB9LFxuICAgICAgRXhwb3J0TmFtZWREZWNsYXJhdGlvbihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnNvdXJjZSkge1xuICAgICAgICAgIGNoZWNrSW1wb3J0Rm9yUmVhY2hpbmcobm9kZS5zb3VyY2UudmFsdWUsIG5vZGUuc291cmNlKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ2FsbEV4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBpZiAoaXNTdGF0aWNSZXF1aXJlKG5vZGUpKSB7XG4gICAgICAgICAgY29uc3QgWyBmaXJzdEFyZ3VtZW50IF0gPSBub2RlLmFyZ3VtZW50c1xuICAgICAgICAgIGNoZWNrSW1wb3J0Rm9yUmVhY2hpbmcoZmlyc3RBcmd1bWVudC52YWx1ZSwgZmlyc3RBcmd1bWVudClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-mutable-exports.js b/node_modules/eslint-plugin-import/lib/rules/no-mutable-exports.js
index b703977..30a9eff 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-mutable-exports.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-mutable-exports.js
@@ -1,32 +1,23 @@
-'use strict';
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-mutable-exports')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('no-mutable-exports') },
+
+    schema: [] },
+
 
   create: function (context) {
-    function checkDeclaration(node) {
-      const kind = node.kind;
-
+    function checkDeclaration(node) {const
+      kind = node.kind;
       if (kind === 'var' || kind === 'let') {
         context.report(node, `Exporting mutable '${kind}' binding, use 'const' instead.`);
       }
     }
 
-    function checkDeclarationsInScope(_ref, name) {
-      let variables = _ref.variables;
-
+    function checkDeclarationsInScope(_ref, name) {let variables = _ref.variables;
       for (let variable of variables) {
         if (variable.name === name) {
           for (let def of variable.defs) {
@@ -60,8 +51,7 @@
 
     return {
       'ExportDefaultDeclaration': handleExportDefault,
-      'ExportNamedDeclaration': handleExportNamed
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1tdXRhYmxlLWV4cG9ydHMuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJjaGVja0RlY2xhcmF0aW9uIiwibm9kZSIsImtpbmQiLCJyZXBvcnQiLCJjaGVja0RlY2xhcmF0aW9uc0luU2NvcGUiLCJuYW1lIiwidmFyaWFibGVzIiwidmFyaWFibGUiLCJkZWYiLCJkZWZzIiwicGFyZW50IiwiaGFuZGxlRXhwb3J0RGVmYXVsdCIsInNjb3BlIiwiZ2V0U2NvcGUiLCJkZWNsYXJhdGlvbiIsImhhbmRsZUV4cG9ydE5hbWVkIiwic291cmNlIiwic3BlY2lmaWVyIiwic3BlY2lmaWVycyIsImxvY2FsIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7Ozs7QUFFQUEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsb0JBQVI7QUFERCxLQUZGO0FBS0pDLFlBQVE7QUFMSixHQURTOztBQVNmQyxVQUFRLFVBQVVDLE9BQVYsRUFBbUI7QUFDekIsYUFBU0MsZ0JBQVQsQ0FBMEJDLElBQTFCLEVBQWdDO0FBQUEsWUFDdkJDLElBRHVCLEdBQ2ZELElBRGUsQ0FDdkJDLElBRHVCOztBQUU5QixVQUFJQSxTQUFTLEtBQVQsSUFBa0JBLFNBQVMsS0FBL0IsRUFBc0M7QUFDcENILGdCQUFRSSxNQUFSLENBQWVGLElBQWYsRUFBc0Isc0JBQXFCQyxJQUFLLGlDQUFoRDtBQUNEO0FBQ0Y7O0FBRUQsYUFBU0Usd0JBQVQsT0FBK0NDLElBQS9DLEVBQXFEO0FBQUEsVUFBbEJDLFNBQWtCLFFBQWxCQSxTQUFrQjs7QUFDbkQsV0FBSyxJQUFJQyxRQUFULElBQXFCRCxTQUFyQixFQUFnQztBQUM5QixZQUFJQyxTQUFTRixJQUFULEtBQWtCQSxJQUF0QixFQUE0QjtBQUMxQixlQUFLLElBQUlHLEdBQVQsSUFBZ0JELFNBQVNFLElBQXpCLEVBQStCO0FBQzdCLGdCQUFJRCxJQUFJZCxJQUFKLEtBQWEsVUFBYixJQUEyQmMsSUFBSUUsTUFBbkMsRUFBMkM7QUFDekNWLCtCQUFpQlEsSUFBSUUsTUFBckI7QUFDRDtBQUNGO0FBQ0Y7QUFDRjtBQUNGOztBQUVELGFBQVNDLG1CQUFULENBQTZCVixJQUE3QixFQUFtQztBQUNqQyxZQUFNVyxRQUFRYixRQUFRYyxRQUFSLEVBQWQ7O0FBRUEsVUFBSVosS0FBS2EsV0FBTCxDQUFpQlQsSUFBckIsRUFBMkI7QUFDekJELGlDQUF5QlEsS0FBekIsRUFBZ0NYLEtBQUthLFdBQUwsQ0FBaUJULElBQWpEO0FBQ0Q7QUFDRjs7QUFFRCxhQUFTVSxpQkFBVCxDQUEyQmQsSUFBM0IsRUFBaUM7QUFDL0IsWUFBTVcsUUFBUWIsUUFBUWMsUUFBUixFQUFkOztBQUVBLFVBQUlaLEtBQUthLFdBQVQsRUFBdUI7QUFDckJkLHlCQUFpQkMsS0FBS2EsV0FBdEI7QUFDRCxPQUZELE1BRU8sSUFBSSxDQUFDYixLQUFLZSxNQUFWLEVBQWtCO0FBQ3ZCLGFBQUssSUFBSUMsU0FBVCxJQUFzQmhCLEtBQUtpQixVQUEzQixFQUF1QztBQUNyQ2QsbUNBQXlCUSxLQUF6QixFQUFnQ0ssVUFBVUUsS0FBVixDQUFnQmQsSUFBaEQ7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsV0FBTztBQUNMLGtDQUE0Qk0sbUJBRHZCO0FBRUwsZ0NBQTBCSTtBQUZyQixLQUFQO0FBSUQ7QUFyRGMsQ0FBakIiLCJmaWxlIjoibm8tbXV0YWJsZS1leHBvcnRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1tdXRhYmxlLWV4cG9ydHMnKSxcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIGZ1bmN0aW9uIGNoZWNrRGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgY29uc3Qge2tpbmR9ID0gbm9kZVxuICAgICAgaWYgKGtpbmQgPT09ICd2YXInIHx8IGtpbmQgPT09ICdsZXQnKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KG5vZGUsIGBFeHBvcnRpbmcgbXV0YWJsZSAnJHtraW5kfScgYmluZGluZywgdXNlICdjb25zdCcgaW5zdGVhZC5gKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrRGVjbGFyYXRpb25zSW5TY29wZSh7dmFyaWFibGVzfSwgbmFtZSkge1xuICAgICAgZm9yIChsZXQgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgZm9yIChsZXQgZGVmIG9mIHZhcmlhYmxlLmRlZnMpIHtcbiAgICAgICAgICAgIGlmIChkZWYudHlwZSA9PT0gJ1ZhcmlhYmxlJyAmJiBkZWYucGFyZW50KSB7XG4gICAgICAgICAgICAgIGNoZWNrRGVjbGFyYXRpb24oZGVmLnBhcmVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVFeHBvcnREZWZhdWx0KG5vZGUpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gY29udGV4dC5nZXRTY29wZSgpXG5cbiAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uLm5hbWUpIHtcbiAgICAgICAgY2hlY2tEZWNsYXJhdGlvbnNJblNjb3BlKHNjb3BlLCBub2RlLmRlY2xhcmF0aW9uLm5hbWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlRXhwb3J0TmFtZWQobm9kZSkge1xuICAgICAgY29uc3Qgc2NvcGUgPSBjb250ZXh0LmdldFNjb3BlKClcblxuICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb24pICB7XG4gICAgICAgIGNoZWNrRGVjbGFyYXRpb24obm9kZS5kZWNsYXJhdGlvbilcbiAgICAgIH0gZWxzZSBpZiAoIW5vZGUuc291cmNlKSB7XG4gICAgICAgIGZvciAobGV0IHNwZWNpZmllciBvZiBub2RlLnNwZWNpZmllcnMpIHtcbiAgICAgICAgICBjaGVja0RlY2xhcmF0aW9uc0luU2NvcGUoc2NvcGUsIHNwZWNpZmllci5sb2NhbC5uYW1lKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICdFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24nOiBoYW5kbGVFeHBvcnREZWZhdWx0LFxuICAgICAgJ0V4cG9ydE5hbWVkRGVjbGFyYXRpb24nOiBoYW5kbGVFeHBvcnROYW1lZCxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
+      'ExportNamedDeclaration': handleExportNamed };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1tdXRhYmxlLWV4cG9ydHMuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJjaGVja0RlY2xhcmF0aW9uIiwibm9kZSIsImtpbmQiLCJyZXBvcnQiLCJjaGVja0RlY2xhcmF0aW9uc0luU2NvcGUiLCJuYW1lIiwidmFyaWFibGVzIiwidmFyaWFibGUiLCJkZWYiLCJkZWZzIiwicGFyZW50IiwiaGFuZGxlRXhwb3J0RGVmYXVsdCIsInNjb3BlIiwiZ2V0U2NvcGUiLCJkZWNsYXJhdGlvbiIsImhhbmRsZUV4cG9ydE5hbWVkIiwic291cmNlIiwic3BlY2lmaWVyIiwic3BlY2lmaWVycyIsImxvY2FsIl0sIm1hcHBpbmdzIjoiYUFBQSxxQzs7QUFFQUEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsb0JBQVIsQ0FERCxFQUZGOztBQUtKQyxZQUFRLEVBTEosRUFEUzs7O0FBU2ZDLFVBQVEsVUFBVUMsT0FBVixFQUFtQjtBQUN6QixhQUFTQyxnQkFBVCxDQUEwQkMsSUFBMUIsRUFBZ0M7QUFDdkJDLFVBRHVCLEdBQ2ZELElBRGUsQ0FDdkJDLElBRHVCO0FBRTlCLFVBQUlBLFNBQVMsS0FBVCxJQUFrQkEsU0FBUyxLQUEvQixFQUFzQztBQUNwQ0gsZ0JBQVFJLE1BQVIsQ0FBZUYsSUFBZixFQUFzQixzQkFBcUJDLElBQUssaUNBQWhEO0FBQ0Q7QUFDRjs7QUFFRCxhQUFTRSx3QkFBVCxPQUErQ0MsSUFBL0MsRUFBcUQsS0FBbEJDLFNBQWtCLFFBQWxCQSxTQUFrQjtBQUNuRCxXQUFLLElBQUlDLFFBQVQsSUFBcUJELFNBQXJCLEVBQWdDO0FBQzlCLFlBQUlDLFNBQVNGLElBQVQsS0FBa0JBLElBQXRCLEVBQTRCO0FBQzFCLGVBQUssSUFBSUcsR0FBVCxJQUFnQkQsU0FBU0UsSUFBekIsRUFBK0I7QUFDN0IsZ0JBQUlELElBQUlkLElBQUosS0FBYSxVQUFiLElBQTJCYyxJQUFJRSxNQUFuQyxFQUEyQztBQUN6Q1YsK0JBQWlCUSxJQUFJRSxNQUFyQjtBQUNEO0FBQ0Y7QUFDRjtBQUNGO0FBQ0Y7O0FBRUQsYUFBU0MsbUJBQVQsQ0FBNkJWLElBQTdCLEVBQW1DO0FBQ2pDLFlBQU1XLFFBQVFiLFFBQVFjLFFBQVIsRUFBZDs7QUFFQSxVQUFJWixLQUFLYSxXQUFMLENBQWlCVCxJQUFyQixFQUEyQjtBQUN6QkQsaUNBQXlCUSxLQUF6QixFQUFnQ1gsS0FBS2EsV0FBTCxDQUFpQlQsSUFBakQ7QUFDRDtBQUNGOztBQUVELGFBQVNVLGlCQUFULENBQTJCZCxJQUEzQixFQUFpQztBQUMvQixZQUFNVyxRQUFRYixRQUFRYyxRQUFSLEVBQWQ7O0FBRUEsVUFBSVosS0FBS2EsV0FBVCxFQUF1QjtBQUNyQmQseUJBQWlCQyxLQUFLYSxXQUF0QjtBQUNELE9BRkQsTUFFTyxJQUFJLENBQUNiLEtBQUtlLE1BQVYsRUFBa0I7QUFDdkIsYUFBSyxJQUFJQyxTQUFULElBQXNCaEIsS0FBS2lCLFVBQTNCLEVBQXVDO0FBQ3JDZCxtQ0FBeUJRLEtBQXpCLEVBQWdDSyxVQUFVRSxLQUFWLENBQWdCZCxJQUFoRDtBQUNEO0FBQ0Y7QUFDRjs7QUFFRCxXQUFPO0FBQ0wsa0NBQTRCTSxtQkFEdkI7QUFFTCxnQ0FBMEJJLGlCQUZyQixFQUFQOztBQUlELEdBckRjLEVBQWpCIiwiZmlsZSI6Im5vLW11dGFibGUtZXhwb3J0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tbXV0YWJsZS1leHBvcnRzJyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBmdW5jdGlvbiBjaGVja0RlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgIGNvbnN0IHtraW5kfSA9IG5vZGVcbiAgICAgIGlmIChraW5kID09PSAndmFyJyB8fCBraW5kID09PSAnbGV0Jykge1xuICAgICAgICBjb250ZXh0LnJlcG9ydChub2RlLCBgRXhwb3J0aW5nIG11dGFibGUgJyR7a2luZH0nIGJpbmRpbmcsIHVzZSAnY29uc3QnIGluc3RlYWQuYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0RlY2xhcmF0aW9uc0luU2NvcGUoe3ZhcmlhYmxlc30sIG5hbWUpIHtcbiAgICAgIGZvciAobGV0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcykge1xuICAgICAgICBpZiAodmFyaWFibGUubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIGZvciAobGV0IGRlZiBvZiB2YXJpYWJsZS5kZWZzKSB7XG4gICAgICAgICAgICBpZiAoZGVmLnR5cGUgPT09ICdWYXJpYWJsZScgJiYgZGVmLnBhcmVudCkge1xuICAgICAgICAgICAgICBjaGVja0RlY2xhcmF0aW9uKGRlZi5wYXJlbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlRXhwb3J0RGVmYXVsdChub2RlKSB7XG4gICAgICBjb25zdCBzY29wZSA9IGNvbnRleHQuZ2V0U2NvcGUoKVxuXG4gICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbi5uYW1lKSB7XG4gICAgICAgIGNoZWNrRGVjbGFyYXRpb25zSW5TY29wZShzY29wZSwgbm9kZS5kZWNsYXJhdGlvbi5uYW1lKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZUV4cG9ydE5hbWVkKG5vZGUpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gY29udGV4dC5nZXRTY29wZSgpXG5cbiAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uKSAge1xuICAgICAgICBjaGVja0RlY2xhcmF0aW9uKG5vZGUuZGVjbGFyYXRpb24pXG4gICAgICB9IGVsc2UgaWYgKCFub2RlLnNvdXJjZSkge1xuICAgICAgICBmb3IgKGxldCBzcGVjaWZpZXIgb2Ygbm9kZS5zcGVjaWZpZXJzKSB7XG4gICAgICAgICAgY2hlY2tEZWNsYXJhdGlvbnNJblNjb3BlKHNjb3BlLCBzcGVjaWZpZXIubG9jYWwubmFtZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJzogaGFuZGxlRXhwb3J0RGVmYXVsdCxcbiAgICAgICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJzogaGFuZGxlRXhwb3J0TmFtZWQsXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-named-as-default-member.js b/node_modules/eslint-plugin-import/lib/rules/no-named-as-default-member.js
index 27394b3..4ef823f 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-named-as-default-member.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-named-as-default-member.js
@@ -1,18 +1,12 @@
 'use strict';
 
-var _ExportMap = require('../ExportMap');
 
-var _ExportMap2 = _interopRequireDefault(_ExportMap);
 
-var _importDeclaration = require('../importDeclaration');
 
-var _importDeclaration2 = _interopRequireDefault(_importDeclaration);
 
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _ExportMap = require('../ExportMap');var _ExportMap2 = _interopRequireDefault(_ExportMap);
+var _importDeclaration = require('../importDeclaration');var _importDeclaration2 = _interopRequireDefault(_importDeclaration);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 //------------------------------------------------------------------------------
 // Rule Definition
@@ -22,10 +16,10 @@
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-named-as-default-member')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('no-named-as-default-member') },
+
+    schema: [] },
+
 
   create: function (context) {
 
@@ -44,8 +38,8 @@
 
       fileImports.set(node.local.name, {
         exportMap,
-        sourcePath: declaration.source.value
-      });
+        sourcePath: declaration.source.value });
+
     }
 
     function storePropertyLookup(objectName, propName, node) {
@@ -61,13 +55,15 @@
     }
 
     function handleDestructuringAssignment(node) {
-      const isDestructure = node.id.type === 'ObjectPattern' && node.init != null && node.init.type === 'Identifier';
+      const isDestructure =
+      node.id.type === 'ObjectPattern' &&
+      node.init != null &&
+      node.init.type === 'Identifier';
+
       if (!isDestructure) return;
 
       const objectName = node.init.name;
-      for (const _ref of node.id.properties) {
-        const key = _ref.key;
-
+      for (const _ref of node.id.properties) {const key = _ref.key;
         if (key == null) continue; // true for rest properties
         storePropertyLookup(objectName, key.name, key);
       }
@@ -78,18 +74,20 @@
         const fileImport = fileImports.get(objectName);
         if (fileImport == null) return;
 
-        for (const _ref2 of lookups) {
-          const propName = _ref2.propName;
-          const node = _ref2.node;
-
+        for (const _ref2 of lookups) {const propName = _ref2.propName;const node = _ref2.node;
           // the default import can have a "default" property
           if (propName === 'default') continue;
           if (!fileImport.exportMap.namespace.has(propName)) continue;
 
           context.report({
             node,
-            message: `Caution: \`${objectName}\` also has a named export ` + `\`${propName}\`. Check if you meant to write ` + `\`import {${propName}} from '${fileImport.sourcePath}'\` ` + 'instead.'
-          });
+            message:
+            `Caution: \`${objectName}\` also has a named export ` +
+            `\`${propName}\`. Check if you meant to write ` +
+            `\`import {${propName}} from '${fileImport.sourcePath}'\` ` +
+            'instead.' });
+
+
         }
       });
     }
@@ -98,13 +96,12 @@
       'ImportDefaultSpecifier': handleImportDefault,
       'MemberExpression': handlePropLookup,
       'VariableDeclarator': handleDestructuringAssignment,
-      'Program:exit': handleProgramExit
-    };
-  }
-}; /**
-    * @fileoverview Rule to warn about potentially confused use of name exports
-    * @author Desmond Brand
-    * @copyright 2016 Desmond Brand. All rights reserved.
-    * See LICENSE in root directory for full license.
-    */
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlci5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwiY29udGV4dCIsImZpbGVJbXBvcnRzIiwiTWFwIiwiYWxsUHJvcGVydHlMb29rdXBzIiwiaGFuZGxlSW1wb3J0RGVmYXVsdCIsIm5vZGUiLCJkZWNsYXJhdGlvbiIsImV4cG9ydE1hcCIsIkV4cG9ydHMiLCJnZXQiLCJzb3VyY2UiLCJ2YWx1ZSIsImVycm9ycyIsImxlbmd0aCIsInJlcG9ydEVycm9ycyIsInNldCIsImxvY2FsIiwibmFtZSIsInNvdXJjZVBhdGgiLCJzdG9yZVByb3BlcnR5TG9va3VwIiwib2JqZWN0TmFtZSIsInByb3BOYW1lIiwibG9va3VwcyIsInB1c2giLCJoYW5kbGVQcm9wTG9va3VwIiwib2JqZWN0IiwicHJvcGVydHkiLCJoYW5kbGVEZXN0cnVjdHVyaW5nQXNzaWdubWVudCIsImlzRGVzdHJ1Y3R1cmUiLCJpZCIsImluaXQiLCJwcm9wZXJ0aWVzIiwia2V5IiwiaGFuZGxlUHJvZ3JhbUV4aXQiLCJmb3JFYWNoIiwiZmlsZUltcG9ydCIsIm5hbWVzcGFjZSIsImhhcyIsInJlcG9ydCIsIm1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7O0FBTUE7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFFQTtBQUNBO0FBQ0E7O0FBRUFBLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFlBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLDRCQUFSO0FBREQsS0FGRjtBQUtKQyxZQUFRO0FBTEosR0FEUzs7QUFTZkMsVUFBUSxVQUFTQyxPQUFULEVBQWtCOztBQUV4QixVQUFNQyxjQUFjLElBQUlDLEdBQUosRUFBcEI7QUFDQSxVQUFNQyxxQkFBcUIsSUFBSUQsR0FBSixFQUEzQjs7QUFFQSxhQUFTRSxtQkFB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akI7QUFJTCxzQkFBZ0JNO0FBSlgsS0FBUDtBQU1EO0FBdEZjLENBQWpCLEMsQ0FkQSIsImZpbGUiOiJuby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVvdmVydmlldyBSdWxlIHRvIHdhcm4gYWJvdXQgcG90ZW50aWFsbHkgY29uZnVzZWQgdXNlIG9mIG5hbWUgZXhwb3J0c1xuICogQGF1dGhvciBEZXNtb25kIEJyYW5kXG4gKiBAY29weXJpZ2h0IDIwMTYgRGVzbW9uZCBCcmFuZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFNlZSBMSUNFTlNFIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCBFeHBvcnRzIGZyb20gJy4uL0V4cG9ydE1hcCdcbmltcG9ydCBpbXBvcnREZWNsYXJhdGlvbiBmcm9tICcuLi9pbXBvcnREZWNsYXJhdGlvbidcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSdWxlIERlZmluaXRpb25cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXInKSxcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICBjb25zdCBmaWxlSW1wb3J0cyA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGFsbFByb3BlcnR5TG9va3VwcyA9IG5ldyBNYXAoKVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlSW1wb3J0RGVmYXVsdChub2RlKSB7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGltcG9ydERlY2xhcmF0aW9uKGNvbnRleHQpXG4gICAgICBjb25zdCBleHBvcnRNYXAgPSBFeHBvcnRzLmdldChkZWNsYXJhdGlvbi5zb3VyY2UudmFsdWUsIGNvbnRleHQpXG4gICAgICBpZiAoZXhwb3J0TWFwID09IG51bGwpIHJldHVyblxuXG4gICAgICBpZiAoZXhwb3J0TWFwLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgZXhwb3J0TWFwLnJlcG9ydEVycm9ycyhjb250ZXh0LCBkZWNsYXJhdGlvbilcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGZpbGVJbXBvcnRzLnNldChub2RlLmxvY2FsLm5hbWUsIHtcbiAgICAgICAgZXhwb3J0TWFwLFxuICAgICAgICBzb3VyY2VQYXRoOiBkZWNsYXJhdGlvbi5zb3VyY2UudmFsdWUsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0b3JlUHJvcGVydHlMb29rdXAob2JqZWN0TmFtZSwgcHJvcE5hbWUsIG5vZGUpIHtcbiAgICAgIGNvbnN0IGxvb2t1cHMgPSBhbGxQcm9wZXJ0eUxvb2t1cHMuZ2V0KG9iamVjdE5hbWUpIHx8IFtdXG4gICAgICBsb29rdXBzLnB1c2goe25vZGUsIHByb3BOYW1lfSlcbiAgICAgIGFsbFByb3BlcnR5TG9va3Vwcy5zZXQob2JqZWN0TmFtZSwgbG9va3VwcylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVQcm9wTG9va3VwKG5vZGUpIHtcbiAgICAgIGNvbnN0IG9iamVjdE5hbWUgPSBub2RlLm9iamVjdC5uYW1lXG4gICAgICBjb25zdCBwcm9wTmFtZSA9IG5vZGUucHJvcGVydHkubmFtZVxuICAgICAgc3RvcmVQcm9wZXJ0eUxvb2t1cChvYmplY3ROYW1lLCBwcm9wTmFtZSwgbm9kZSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVEZXN0cnVjdHVyaW5nQXNzaWdubWVudChub2RlKSB7XG4gICAgICBjb25zdCBpc0Rlc3RydWN0dXJlID0gKFxuICAgICAgICBub2RlLmlkLnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJyAmJlxuICAgICAgICBub2RlLmluaXQgIT0gbnVsbCAmJlxuICAgICAgICBub2RlLmluaXQudHlwZSA9PT0gJ0lkZW50aWZpZXInXG4gICAgICApXG4gICAgICBpZiAoIWlzRGVzdHJ1Y3R1cmUpIHJldHVyblxuXG4gICAgICBjb25zdCBvYmplY3ROYW1lID0gbm9kZS5pbml0Lm5hbWVcbiAgICAgIGZvciAoY29uc3QgeyBrZXkgfSBvZiBub2RlLmlkLnByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKGtleSA9PSBudWxsKSBjb250aW51ZSAgLy8gdHJ1ZSBmb3IgcmVzdCBwcm9wZXJ0aWVzXG4gICAgICAgIHN0b3JlUHJvcGVydHlMb29rdXAob2JqZWN0TmFtZSwga2V5Lm5hbWUsIGtleSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVQcm9ncmFtRXhpdCgpIHtcbiAgICAgIGFsbFByb3BlcnR5TG9va3Vwcy5mb3JFYWNoKChsb29rdXBzLCBvYmplY3ROYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVJbXBvcnQgPSBmaWxlSW1wb3J0cy5nZXQob2JqZWN0TmFtZSlcbiAgICAgICAgaWYgKGZpbGVJbXBvcnQgPT0gbnVsbCkgcmV0dXJuXG5cbiAgICAgICAgZm9yIChjb25zdCB7cHJvcE5hbWUsIG5vZGV9IG9mIGxvb2t1cHMpIHtcbiAgICAgICAgICAvLyB0aGUgZGVmYXVsdCBpbXBvcnQgY2FuIGhhdmUgYSBcImRlZmF1bHRcIiBwcm9wZXJ0eVxuICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ2RlZmF1bHQnKSBjb250aW51ZVxuICAgICAgICAgIGlmICghZmlsZUltcG9ydC5leHBvcnRNYXAubmFtZXNwYWNlLmhhcyhwcm9wTmFtZSkpIGNvbnRpbnVlXG5cbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogKFxuICAgICAgICAgICAgICBgQ2F1dGlvbjogXFxgJHtvYmplY3ROYW1lfVxcYCBhbHNvIGhhcyBhIG5hbWVkIGV4cG9ydCBgICtcbiAgICAgICAgICAgICAgYFxcYCR7cHJvcE5hbWV9XFxgLiBDaGVjayBpZiB5b3UgbWVhbnQgdG8gd3JpdGUgYCArXG4gICAgICAgICAgICAgIGBcXGBpbXBvcnQgeyR7cHJvcE5hbWV9fSBmcm9tICcke2ZpbGVJbXBvcnQuc291cmNlUGF0aH0nXFxgIGAgK1xuICAgICAgICAgICAgICAnaW5zdGVhZC4nXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJzogaGFuZGxlSW1wb3J0RGVmYXVsdCxcbiAgICAgICdNZW1iZXJFeHByZXNzaW9uJzogaGFuZGxlUHJvcExvb2t1cCxcbiAgICAgICdWYXJpYWJsZURlY2xhcmF0b3InOiBoYW5kbGVEZXN0cnVjdHVyaW5nQXNzaWdubWVudCxcbiAgICAgICdQcm9ncmFtOmV4aXQnOiBoYW5kbGVQcm9ncmFtRXhpdCxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
+      'Program:exit': handleProgramExit };
+
+  } }; /**
+        * @fileoverview Rule to warn about potentially confused use of name exports
+        * @author Desmond Brand
+        * @copyright 2016 Desmond Brand. All rights reserved.
+        * See LICENSE in root directory for full license.
+        */
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlci5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwiY29udGV4dCIsImZpbGVJbXBvcnRzIiwiTWFwIiwiYWxsUHJvcGVydHlMb29rdXBzIiwiaGFuZGxlSW1wb3J0RGVmYXVsdCIsIm5vZGUiLCJkZWNsYXJhdGlvbiIsImV4cG9ydE1hcCIsIkV4cG9ydHMiLCJnZXQiLCJzb3VyY2UiLCJ2YWx1ZSIsImVycm9ycyIsImxlbmd0aCIsInJlcG9ydEVycm9ycyIsInNldCIsImxvY2FsIiwibmFtZSIsInNvdXJjZVBhdGgiLCJzdG9yZVByb3BlcnR5TG9va3VwIiwib2JqZWN0TmFtZSIsInByb3BOYW1lIiwibG9va3VwcyIsInB1c2giLCJoYW5kbGVQcm9wTG9va3VwIiwib2JqZWN0IiwicHJvcGVydHkiLCJoYW5kbGVEZXN0cnVjdHVyaW5nQXNzaWdubWVudCIsImlzRGVzdHJ1Y3R1cmUiLCJpZCIsImluaXQiLCJwcm9wZXJ0aWVzIiwia2V5IiwiaGFuZGxlUHJvZ3JhbUV4aXQiLCJmb3JFYWNoIiwiZmlsZUltcG9ydCIsIm5hbWVzcGFjZSIsImhhcyIsInJlcG9ydCIsIm1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7OztBQU1BLHlDO0FBQ0EseUQ7QUFDQSxxQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUFBLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFlBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLDRCQUFSLENBREQsRUFGRjs7QUFLSkMsWUFBUSxFQUxKLEVBRFM7OztBQVNmQyxVQUFRLFVBQVNDLE9BQVQsRUFBa0I7O0FBRXhCLFVBQU1DLGNBQWMsSUFBSUMsR0FBSixFQUFwQjtBQUNBLFVBQU1DLHFCQUFxQixJQUFJRCxHQUFKLEVBQTNCOztBQUVBLGFBQVNF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c0JBQWdCTSxpQkFKWCxFQUFQOztBQU1ELEdBdEZjLEVBQWpCLEMsQ0FkQSIsImZpbGUiOiJuby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVvdmVydmlldyBSdWxlIHRvIHdhcm4gYWJvdXQgcG90ZW50aWFsbHkgY29uZnVzZWQgdXNlIG9mIG5hbWUgZXhwb3J0c1xuICogQGF1dGhvciBEZXNtb25kIEJyYW5kXG4gKiBAY29weXJpZ2h0IDIwMTYgRGVzbW9uZCBCcmFuZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFNlZSBMSUNFTlNFIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cbmltcG9ydCBFeHBvcnRzIGZyb20gJy4uL0V4cG9ydE1hcCdcbmltcG9ydCBpbXBvcnREZWNsYXJhdGlvbiBmcm9tICcuLi9pbXBvcnREZWNsYXJhdGlvbidcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSdWxlIERlZmluaXRpb25cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXInKSxcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICBjb25zdCBmaWxlSW1wb3J0cyA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGFsbFByb3BlcnR5TG9va3VwcyA9IG5ldyBNYXAoKVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlSW1wb3J0RGVmYXVsdChub2RlKSB7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGltcG9ydERlY2xhcmF0aW9uKGNvbnRleHQpXG4gICAgICBjb25zdCBleHBvcnRNYXAgPSBFeHBvcnRzLmdldChkZWNsYXJhdGlvbi5zb3VyY2UudmFsdWUsIGNvbnRleHQpXG4gICAgICBpZiAoZXhwb3J0TWFwID09IG51bGwpIHJldHVyblxuXG4gICAgICBpZiAoZXhwb3J0TWFwLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgZXhwb3J0TWFwLnJlcG9ydEVycm9ycyhjb250ZXh0LCBkZWNsYXJhdGlvbilcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGZpbGVJbXBvcnRzLnNldChub2RlLmxvY2FsLm5hbWUsIHtcbiAgICAgICAgZXhwb3J0TWFwLFxuICAgICAgICBzb3VyY2VQYXRoOiBkZWNsYXJhdGlvbi5zb3VyY2UudmFsdWUsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0b3JlUHJvcGVydHlMb29rdXAob2JqZWN0TmFtZSwgcHJvcE5hbWUsIG5vZGUpIHtcbiAgICAgIGNvbnN0IGxvb2t1cHMgPSBhbGxQcm9wZXJ0eUxvb2t1cHMuZ2V0KG9iamVjdE5hbWUpIHx8IFtdXG4gICAgICBsb29rdXBzLnB1c2goe25vZGUsIHByb3BOYW1lfSlcbiAgICAgIGFsbFByb3BlcnR5TG9va3Vwcy5zZXQob2JqZWN0TmFtZSwgbG9va3VwcylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVQcm9wTG9va3VwKG5vZGUpIHtcbiAgICAgIGNvbnN0IG9iamVjdE5hbWUgPSBub2RlLm9iamVjdC5uYW1lXG4gICAgICBjb25zdCBwcm9wTmFtZSA9IG5vZGUucHJvcGVydHkubmFtZVxuICAgICAgc3RvcmVQcm9wZXJ0eUxvb2t1cChvYmplY3ROYW1lLCBwcm9wTmFtZSwgbm9kZSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVEZXN0cnVjdHVyaW5nQXNzaWdubWVudChub2RlKSB7XG4gICAgICBjb25zdCBpc0Rlc3RydWN0dXJlID0gKFxuICAgICAgICBub2RlLmlkLnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJyAmJlxuICAgICAgICBub2RlLmluaXQgIT0gbnVsbCAmJlxuICAgICAgICBub2RlLmluaXQudHlwZSA9PT0gJ0lkZW50aWZpZXInXG4gICAgICApXG4gICAgICBpZiAoIWlzRGVzdHJ1Y3R1cmUpIHJldHVyblxuXG4gICAgICBjb25zdCBvYmplY3ROYW1lID0gbm9kZS5pbml0Lm5hbWVcbiAgICAgIGZvciAoY29uc3QgeyBrZXkgfSBvZiBub2RlLmlkLnByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKGtleSA9PSBudWxsKSBjb250aW51ZSAgLy8gdHJ1ZSBmb3IgcmVzdCBwcm9wZXJ0aWVzXG4gICAgICAgIHN0b3JlUHJvcGVydHlMb29rdXAob2JqZWN0TmFtZSwga2V5Lm5hbWUsIGtleSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVQcm9ncmFtRXhpdCgpIHtcbiAgICAgIGFsbFByb3BlcnR5TG9va3Vwcy5mb3JFYWNoKChsb29rdXBzLCBvYmplY3ROYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVJbXBvcnQgPSBmaWxlSW1wb3J0cy5nZXQob2JqZWN0TmFtZSlcbiAgICAgICAgaWYgKGZpbGVJbXBvcnQgPT0gbnVsbCkgcmV0dXJuXG5cbiAgICAgICAgZm9yIChjb25zdCB7cHJvcE5hbWUsIG5vZGV9IG9mIGxvb2t1cHMpIHtcbiAgICAgICAgICAvLyB0aGUgZGVmYXVsdCBpbXBvcnQgY2FuIGhhdmUgYSBcImRlZmF1bHRcIiBwcm9wZXJ0eVxuICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ2RlZmF1bHQnKSBjb250aW51ZVxuICAgICAgICAgIGlmICghZmlsZUltcG9ydC5leHBvcnRNYXAubmFtZXNwYWNlLmhhcyhwcm9wTmFtZSkpIGNvbnRpbnVlXG5cbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogKFxuICAgICAgICAgICAgICBgQ2F1dGlvbjogXFxgJHtvYmplY3ROYW1lfVxcYCBhbHNvIGhhcyBhIG5hbWVkIGV4cG9ydCBgICtcbiAgICAgICAgICAgICAgYFxcYCR7cHJvcE5hbWV9XFxgLiBDaGVjayBpZiB5b3UgbWVhbnQgdG8gd3JpdGUgYCArXG4gICAgICAgICAgICAgIGBcXGBpbXBvcnQgeyR7cHJvcE5hbWV9fSBmcm9tICcke2ZpbGVJbXBvcnQuc291cmNlUGF0aH0nXFxgIGAgK1xuICAgICAgICAgICAgICAnaW5zdGVhZC4nXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJzogaGFuZGxlSW1wb3J0RGVmYXVsdCxcbiAgICAgICdNZW1iZXJFeHByZXNzaW9uJzogaGFuZGxlUHJvcExvb2t1cCxcbiAgICAgICdWYXJpYWJsZURlY2xhcmF0b3InOiBoYW5kbGVEZXN0cnVjdHVyaW5nQXNzaWdubWVudCxcbiAgICAgICdQcm9ncmFtOmV4aXQnOiBoYW5kbGVQcm9ncmFtRXhpdCxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-named-as-default.js b/node_modules/eslint-plugin-import/lib/rules/no-named-as-default.js
index 8376f9d..0b8d213 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-named-as-default.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-named-as-default.js
@@ -1,27 +1,15 @@
-'use strict';
-
-var _ExportMap = require('../ExportMap');
-
-var _ExportMap2 = _interopRequireDefault(_ExportMap);
-
-var _importDeclaration = require('../importDeclaration');
-
-var _importDeclaration2 = _interopRequireDefault(_importDeclaration);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _ExportMap = require('../ExportMap');var _ExportMap2 = _interopRequireDefault(_ExportMap);
+var _importDeclaration = require('../importDeclaration');var _importDeclaration2 = _interopRequireDefault(_importDeclaration);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'problem',
     docs: {
-      url: (0, _docsUrl2.default)('no-named-as-default')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('no-named-as-default') },
+
+    schema: [] },
+
 
   create: function (context) {
     function checkDefault(nameKey, defaultSpecifier) {
@@ -38,15 +26,18 @@
         return;
       }
 
-      if (imports.has('default') && imports.has(defaultSpecifier[nameKey].name)) {
+      if (imports.has('default') &&
+      imports.has(defaultSpecifier[nameKey].name)) {
 
-        context.report(defaultSpecifier, 'Using exported name \'' + defaultSpecifier[nameKey].name + '\' as identifier for default export.');
+        context.report(defaultSpecifier,
+        'Using exported name \'' + defaultSpecifier[nameKey].name +
+        '\' as identifier for default export.');
+
       }
     }
     return {
       'ImportDefaultSpecifier': checkDefault.bind(null, 'local'),
-      'ExportDefaultSpecifier': checkDefault.bind(null, 'exported')
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1uYW1lZC1hcy1kZWZhdWx0LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0IiwiY2hlY2tEZWZhdWx0IiwibmFtZUtleSIsImRlZmF1bHRTcGVjaWZpZXIiLCJuYW1lIiwiZGVjbGFyYXRpb24iLCJpbXBvcnRzIiwiRXhwb3J0cyIsImdldCIsInNvdXJjZSIsInZhbHVlIiwiZXJyb3JzIiwibGVuZ3RoIiwicmVwb3J0RXJyb3JzIiwiaGFzIiwicmVwb3J0IiwiYmluZCJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxTQURGO0FBRUpDLFVBQU07QUFDSkMsV0FBSyx1QkFBUSxxQkFBUjtBQURELEtBRkY7QUFLSkMsWUFBUTtBQUxKLEdBRFM7O0FBU2ZDLFVBQVEsVUFBVUMsT0FBVixFQUFtQjtBQUN6QixhQUFTQyxZQUFULENBQXNCQyxPQUF0QixFQUErQkMsZ0JBQS9CLEVBQWlEO0FBQy9DO0FBQ0EsVUFBSUEsaUJBQWlCRCxPQUFqQixFQUEwQkUsSUFBMUIsS0FBbUMsU0FBdkMsRUFBa0Q7O0FBRWxELFVBQUlDLGNBQWMsaUNBQWtCTCxPQUFsQixDQUFsQjs7QUFFQSxVQUFJTSxVQUFVQyxvQkFBUUMsR0FBUixDQUFZSCxZQUFZSSxNQUFaLENBQW1CQyxLQUEvQixFQUFzQ1YsT0FBdEMsQ0FBZDtBQUNBLFVBQUlNLFdBQVcsSUFBZixFQUFxQjs7QUFFckIsVUFBSUEsUUFBUUssTUFBUixDQUFlQyxNQUFuQixFQUEyQjtBQUN6Qk4sZ0JBQVFPLFlBQVIsQ0FBcUJiLE9BQXJCLEVBQThCSyxXQUE5QjtBQUNBO0FBQ0Q7O0FBRUQsVUFBSUMsUUFBUVEsR0FBUixDQUFZLFNBQVosS0FDQVIsUUFBUVEsR0FBUixDQUFZWCxpQkFBaUJELE9BQWpCLEVBQTBCRSxJQUF0QyxDQURKLEVBQ2lEOztBQUUvQ0osZ0JBQVFlLE1BQVIsQ0FBZVosZ0JBQWYsRUFDRSwyQkFBMkJBLGlCQUFpQkQsT0FBakIsRUFBMEJFLElBQXJELEdBQ0Esc0NBRkY7QUFJRDtBQUNGO0FBQ0QsV0FBTztBQUNMLGdDQUEwQkgsYUFBYWUsSUFBYixDQUFrQixJQUFsQixFQUF3QixPQUF4QixDQURyQjtBQUVMLGdDQUEwQmYsYUFBYWUsSUFBYixDQUFrQixJQUFsQixFQUF3QixVQUF4QjtBQUZyQixLQUFQO0FBSUQ7QUFyQ2MsQ0FBakIiLCJmaWxlIjoibm8tbmFtZWQtYXMtZGVmYXVsdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFeHBvcnRzIGZyb20gJy4uL0V4cG9ydE1hcCdcbmltcG9ydCBpbXBvcnREZWNsYXJhdGlvbiBmcm9tICcuLi9pbXBvcnREZWNsYXJhdGlvbidcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3Byb2JsZW0nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tbmFtZWQtYXMtZGVmYXVsdCcpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgZnVuY3Rpb24gY2hlY2tEZWZhdWx0KG5hbWVLZXksIGRlZmF1bHRTcGVjaWZpZXIpIHtcbiAgICAgIC8vICM1NjY6IGRlZmF1bHQgaXMgYSB2YWxpZCBzcGVjaWZpZXJcbiAgICAgIGlmIChkZWZhdWx0U3BlY2lmaWVyW25hbWVLZXldLm5hbWUgPT09ICdkZWZhdWx0JykgcmV0dXJuXG5cbiAgICAgIHZhciBkZWNsYXJhdGlvbiA9IGltcG9ydERlY2xhcmF0aW9uKGNvbnRleHQpXG5cbiAgICAgIHZhciBpbXBvcnRzID0gRXhwb3J0cy5nZXQoZGVjbGFyYXRpb24uc291cmNlLnZhbHVlLCBjb250ZXh0KVxuICAgICAgaWYgKGltcG9ydHMgPT0gbnVsbCkgcmV0dXJuXG5cbiAgICAgIGlmIChpbXBvcnRzLmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgaW1wb3J0cy5yZXBvcnRFcnJvcnMoY29udGV4dCwgZGVjbGFyYXRpb24pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoaW1wb3J0cy5oYXMoJ2RlZmF1bHQnKSAmJlxuICAgICAgICAgIGltcG9ydHMuaGFzKGRlZmF1bHRTcGVjaWZpZXJbbmFtZUtleV0ubmFtZSkpIHtcblxuICAgICAgICBjb250ZXh0LnJlcG9ydChkZWZhdWx0U3BlY2lmaWVyLFxuICAgICAgICAgICdVc2luZyBleHBvcnRlZCBuYW1lIFxcJycgKyBkZWZhdWx0U3BlY2lmaWVyW25hbWVLZXldLm5hbWUgK1xuICAgICAgICAgICdcXCcgYXMgaWRlbnRpZmllciBmb3IgZGVmYXVsdCBleHBvcnQuJylcblxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInOiBjaGVja0RlZmF1bHQuYmluZChudWxsLCAnbG9jYWwnKSxcbiAgICAgICdFeHBvcnREZWZhdWx0U3BlY2lmaWVyJzogY2hlY2tEZWZhdWx0LmJpbmQobnVsbCwgJ2V4cG9ydGVkJyksXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+      'ExportDefaultSpecifier': checkDefault.bind(null, 'exported') };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1uYW1lZC1hcy1kZWZhdWx0LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0IiwiY2hlY2tEZWZhdWx0IiwibmFtZUtleSIsImRlZmF1bHRTcGVjaWZpZXIiLCJuYW1lIiwiZGVjbGFyYXRpb24iLCJpbXBvcnRzIiwiRXhwb3J0cyIsImdldCIsInNvdXJjZSIsInZhbHVlIiwiZXJyb3JzIiwibGVuZ3RoIiwicmVwb3J0RXJyb3JzIiwiaGFzIiwicmVwb3J0IiwiYmluZCJdLCJtYXBwaW5ncyI6ImFBQUEseUM7QUFDQSx5RDtBQUNBLHFDOztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxTQURGO0FBRUpDLFVBQU07QUFDSkMsV0FBSyx1QkFBUSxxQkFBUixDQURELEVBRkY7O0FBS0pDLFlBQVEsRUFMSixFQURTOzs7QUFTZkMsVUFBUSxVQUFVQyxPQUFWLEVBQW1CO0FBQ3pCLGFBQVNDLFlBQVQsQ0FBc0JDLE9BQXRCLEVBQStCQyxnQkFBL0IsRUFBaUQ7QUFDL0M7QUFDQSxVQUFJQSxpQkFBaUJELE9BQWpCLEVBQTBCRSxJQUExQixLQUFtQyxTQUF2QyxFQUFrRDs7QUFFbEQsVUFBSUMsY0FBYyxpQ0FBa0JMLE9BQWxCLENBQWxCOztBQUVBLFVBQUlNLFVBQVVDLG9CQUFRQyxHQUFSLENBQVlILFlBQVlJLE1BQVosQ0FBbUJDLEtBQS9CLEVBQXNDVixPQUF0QyxDQUFkO0FBQ0EsVUFBSU0sV0FBVyxJQUFmLEVBQXFCOztBQUVyQixVQUFJQSxRQUFRSyxNQUFSLENBQWVDLE1BQW5CLEVBQTJCO0FBQ3pCTixnQkFBUU8sWUFBUixDQUFxQmIsT0FBckIsRUFBOEJLLFdBQTlCO0FBQ0E7QUFDRDs7QUFFRCxVQUFJQyxRQUFRUSxHQUFSLENBQVksU0FBWjtBQUNBUixjQUFRUSxHQUFSLENBQVlYLGlCQUFpQkQsT0FBakIsRUFBMEJFLElBQXRDLENBREosRUFDaUQ7O0FBRS9DSixnQkFBUWUsTUFBUixDQUFlWixnQkFBZjtBQUNFLG1DQUEyQkEsaUJBQWlCRCxPQUFqQixFQUEwQkUsSUFBckQ7QUFDQSw4Q0FGRjs7QUFJRDtBQUNGO0FBQ0QsV0FBTztBQUNMLGdDQUEwQkgsYUFBYWUsSUFBYixDQUFrQixJQUFsQixFQUF3QixPQUF4QixDQURyQjtBQUVMLGdDQUEwQmYsYUFBYWUsSUFBYixDQUFrQixJQUFsQixFQUF3QixVQUF4QixDQUZyQixFQUFQOztBQUlELEdBckNjLEVBQWpCIiwiZmlsZSI6Im5vLW5hbWVkLWFzLWRlZmF1bHQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXhwb3J0cyBmcm9tICcuLi9FeHBvcnRNYXAnXG5pbXBvcnQgaW1wb3J0RGVjbGFyYXRpb24gZnJvbSAnLi4vaW1wb3J0RGVjbGFyYXRpb24nXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLW5hbWVkLWFzLWRlZmF1bHQnKSxcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIGZ1bmN0aW9uIGNoZWNrRGVmYXVsdChuYW1lS2V5LCBkZWZhdWx0U3BlY2lmaWVyKSB7XG4gICAgICAvLyAjNTY2OiBkZWZhdWx0IGlzIGEgdmFsaWQgc3BlY2lmaWVyXG4gICAgICBpZiAoZGVmYXVsdFNwZWNpZmllcltuYW1lS2V5XS5uYW1lID09PSAnZGVmYXVsdCcpIHJldHVyblxuXG4gICAgICB2YXIgZGVjbGFyYXRpb24gPSBpbXBvcnREZWNsYXJhdGlvbihjb250ZXh0KVxuXG4gICAgICB2YXIgaW1wb3J0cyA9IEV4cG9ydHMuZ2V0KGRlY2xhcmF0aW9uLnNvdXJjZS52YWx1ZSwgY29udGV4dClcbiAgICAgIGlmIChpbXBvcnRzID09IG51bGwpIHJldHVyblxuXG4gICAgICBpZiAoaW1wb3J0cy5lcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGltcG9ydHMucmVwb3J0RXJyb3JzKGNvbnRleHQsIGRlY2xhcmF0aW9uKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGltcG9ydHMuaGFzKCdkZWZhdWx0JykgJiZcbiAgICAgICAgICBpbXBvcnRzLmhhcyhkZWZhdWx0U3BlY2lmaWVyW25hbWVLZXldLm5hbWUpKSB7XG5cbiAgICAgICAgY29udGV4dC5yZXBvcnQoZGVmYXVsdFNwZWNpZmllcixcbiAgICAgICAgICAnVXNpbmcgZXhwb3J0ZWQgbmFtZSBcXCcnICsgZGVmYXVsdFNwZWNpZmllcltuYW1lS2V5XS5uYW1lICtcbiAgICAgICAgICAnXFwnIGFzIGlkZW50aWZpZXIgZm9yIGRlZmF1bHQgZXhwb3J0LicpXG5cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJzogY2hlY2tEZWZhdWx0LmJpbmQobnVsbCwgJ2xvY2FsJyksXG4gICAgICAnRXhwb3J0RGVmYXVsdFNwZWNpZmllcic6IGNoZWNrRGVmYXVsdC5iaW5kKG51bGwsICdleHBvcnRlZCcpLFxuICAgIH1cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-named-default.js b/node_modules/eslint-plugin-import/lib/rules/no-named-default.js
index 63565df..e877c7b 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-named-default.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-named-default.js
@@ -1,19 +1,13 @@
-'use strict';
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-named-default')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('no-named-default') },
+
+    schema: [] },
+
 
   create: function (context) {
     return {
@@ -25,8 +19,7 @@
               message: `Use default import syntax to import '${im.local.name}'.` });
           }
         });
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1uYW1lZC1kZWZhdWx0LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0Iiwibm9kZSIsInNwZWNpZmllcnMiLCJmb3JFYWNoIiwiaW0iLCJpbXBvcnRlZCIsIm5hbWUiLCJyZXBvcnQiLCJsb2NhbCIsIm1lc3NhZ2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7OztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxZQURGO0FBRUpDLFVBQU07QUFDSkMsV0FBSyx1QkFBUSxrQkFBUjtBQURELEtBRkY7QUFLSkMsWUFBUTtBQUxKLEdBRFM7O0FBU2ZDLFVBQVEsVUFBVUMsT0FBVixFQUFtQjtBQUN6QixXQUFPO0FBQ0wsMkJBQXFCLFVBQVVDLElBQVYsRUFBZ0I7QUFDbkNBLGFBQUtDLFVBQUwsQ0FBZ0JDLE9BQWhCLENBQXdCLFVBQVVDLEVBQVYsRUFBYztBQUNwQyxjQUFJQSxHQUFHVCxJQUFILEtBQVksaUJBQVosSUFBaUNTLEdBQUdDLFFBQUgsQ0FBWUMsSUFBWixLQUFxQixTQUExRCxFQUFxRTtBQUNuRU4sb0JBQVFPLE1BQVIsQ0FBZTtBQUNiTixvQkFBTUcsR0FBR0ksS0FESTtBQUViQyx1QkFBVSx3Q0FBdUNMLEdBQUdJLEtBQUgsQ0FBU0YsSUFBSyxJQUZsRCxFQUFmO0FBR0Q7QUFDRixTQU5EO0FBT0Q7QUFUSSxLQUFQO0FBV0Q7QUFyQmMsQ0FBakIiLCJmaWxlIjoibm8tbmFtZWQtZGVmYXVsdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tbmFtZWQtZGVmYXVsdCcpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdJbXBvcnREZWNsYXJhdGlvbic6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIG5vZGUuc3BlY2lmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChpbSkge1xuICAgICAgICAgIGlmIChpbS50eXBlID09PSAnSW1wb3J0U3BlY2lmaWVyJyAmJiBpbS5pbXBvcnRlZC5uYW1lID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICAgbm9kZTogaW0ubG9jYWwsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBVc2UgZGVmYXVsdCBpbXBvcnQgc3ludGF4IHRvIGltcG9ydCAnJHtpbS5sb2NhbC5uYW1lfScuYCB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1uYW1lZC1kZWZhdWx0LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0Iiwibm9kZSIsInNwZWNpZmllcnMiLCJmb3JFYWNoIiwiaW0iLCJpbXBvcnRlZCIsIm5hbWUiLCJyZXBvcnQiLCJsb2NhbCIsIm1lc3NhZ2UiXSwibWFwcGluZ3MiOiJhQUFBLHFDOztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxZQURGO0FBRUpDLFVBQU07QUFDSkMsV0FBSyx1QkFBUSxrQkFBUixDQURELEVBRkY7O0FBS0pDLFlBQVEsRUFMSixFQURTOzs7QUFTZkMsVUFBUSxVQUFVQyxPQUFWLEVBQW1CO0FBQ3pCLFdBQU87QUFDTCwyQkFBcUIsVUFBVUMsSUFBVixFQUFnQjtBQUNuQ0EsYUFBS0MsVUFBTCxDQUFnQkMsT0FBaEIsQ0FBd0IsVUFBVUMsRUFBVixFQUFjO0FBQ3BDLGNBQUlBLEdBQUdULElBQUgsS0FBWSxpQkFBWixJQUFpQ1MsR0FBR0MsUUFBSCxDQUFZQyxJQUFaLEtBQXFCLFNBQTFELEVBQXFFO0FBQ25FTixvQkFBUU8sTUFBUixDQUFlO0FBQ2JOLG9CQUFNRyxHQUFHSSxLQURJO0FBRWJDLHVCQUFVLHdDQUF1Q0wsR0FBR0ksS0FBSCxDQUFTRixJQUFLLElBRmxELEVBQWY7QUFHRDtBQUNGLFNBTkQ7QUFPRCxPQVRJLEVBQVA7O0FBV0QsR0FyQmMsRUFBakIiLCJmaWxlIjoibm8tbmFtZWQtZGVmYXVsdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tbmFtZWQtZGVmYXVsdCcpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdJbXBvcnREZWNsYXJhdGlvbic6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIG5vZGUuc3BlY2lmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChpbSkge1xuICAgICAgICAgIGlmIChpbS50eXBlID09PSAnSW1wb3J0U3BlY2lmaWVyJyAmJiBpbS5pbXBvcnRlZC5uYW1lID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgICAgbm9kZTogaW0ubG9jYWwsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBVc2UgZGVmYXVsdCBpbXBvcnQgc3ludGF4IHRvIGltcG9ydCAnJHtpbS5sb2NhbC5uYW1lfScuYCB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-named-export.js b/node_modules/eslint-plugin-import/lib/rules/no-named-export.js
index b9ec45b..8139a6b 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-named-export.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-named-export.js
@@ -1,17 +1,11 @@
-'use strict';
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: { url: (0, _docsUrl2.default)('no-named-export') },
-    schema: []
-  },
+    schema: [] },
+
 
   create(context) {
     // ignore non-modules
@@ -35,8 +29,7 @@
         if (someNamed) {
           context.report({ node, message });
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1uYW1lZC1leHBvcnQuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJwYXJzZXJPcHRpb25zIiwic291cmNlVHlwZSIsIm1lc3NhZ2UiLCJFeHBvcnRBbGxEZWNsYXJhdGlvbiIsIm5vZGUiLCJyZXBvcnQiLCJFeHBvcnROYW1lZERlY2xhcmF0aW9uIiwic3BlY2lmaWVycyIsImxlbmd0aCIsInNvbWVOYW1lZCIsInNvbWUiLCJzcGVjaWZpZXIiLCJleHBvcnRlZCIsIm5hbWUiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7OztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxZQURGO0FBRUpDLFVBQU0sRUFBRUMsS0FBSyx1QkFBUSxpQkFBUixDQUFQLEVBRkY7QUFHSkMsWUFBUTtBQUhKLEdBRFM7O0FBT2ZDLFNBQU9DLE9BQVAsRUFBZ0I7QUFDZDtBQUNBLFFBQUlBLFFBQVFDLGFBQVIsQ0FBc0JDLFVBQXRCLEtBQXFDLFFBQXpDLEVBQW1EO0FBQ2pELGFBQU8sRUFBUDtBQUNEOztBQUVELFVBQU1DLFVBQVUsZ0NBQWhCOztBQUVBLFdBQU87QUFDTEMsMkJBQXFCQyxJQUFyQixFQUEyQjtBQUN6QkwsZ0JBQVFNLE1BQVIsQ0FBZSxFQUFDRCxJQUFELEVBQU9GLE9BQVAsRUFBZjtBQUNELE9BSEk7O0FBS0xJLDZCQUF1QkYsSUFBdkIsRUFBNkI7QUFDM0IsWUFBSUEsS0FBS0csVUFBTCxDQUFnQkMsTUFBaEIsS0FBMkIsQ0FBL0IsRUFBa0M7QUFDaEMsaUJBQU9ULFFBQVFNLE1BQVIsQ0FBZSxFQUFDRCxJQUFELEVBQU9GLE9BQVAsRUFBZixDQUFQO0FBQ0Q7O0FBRUQsY0FBTU8sWUFBWUwsS0FBS0csVUFBTCxDQUFnQkcsSUFBaEIsQ0FBcUJDLGFBQWFBLFVBQVVDLFFBQVYsQ0FBbUJDLElBQW5CLEtBQTRCLFNBQTlELENBQWxCO0FBQ0EsWUFBSUosU0FBSixFQUFlO0FBQ2JWLGtCQUFRTSxNQUFSLENBQWUsRUFBQ0QsSUFBRCxFQUFPRixPQUFQLEVBQWY7QUFDRDtBQUNGO0FBZEksS0FBUDtBQWdCRDtBQS9CYyxDQUFqQiIsImZpbGUiOiJuby1uYW1lZC1leHBvcnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7IHVybDogZG9jc1VybCgnbm8tbmFtZWQtZXhwb3J0JykgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgLy8gaWdub3JlIG5vbi1tb2R1bGVzXG4gICAgaWYgKGNvbnRleHQucGFyc2VyT3B0aW9ucy5zb3VyY2VUeXBlICE9PSAnbW9kdWxlJykge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9ICdOYW1lZCBleHBvcnRzIGFyZSBub3QgYWxsb3dlZC4nXG5cbiAgICByZXR1cm4ge1xuICAgICAgRXhwb3J0QWxsRGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydCh7bm9kZSwgbWVzc2FnZX0pXG4gICAgICB9LFxuXG4gICAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuc3BlY2lmaWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5yZXBvcnQoe25vZGUsIG1lc3NhZ2V9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc29tZU5hbWVkID0gbm9kZS5zcGVjaWZpZXJzLnNvbWUoc3BlY2lmaWVyID0+IHNwZWNpZmllci5leHBvcnRlZC5uYW1lICE9PSAnZGVmYXVsdCcpXG4gICAgICAgIGlmIChzb21lTmFtZWQpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7bm9kZSwgbWVzc2FnZX0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1uYW1lZC1leHBvcnQuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJwYXJzZXJPcHRpb25zIiwic291cmNlVHlwZSIsIm1lc3NhZ2UiLCJFeHBvcnRBbGxEZWNsYXJhdGlvbiIsIm5vZGUiLCJyZXBvcnQiLCJFeHBvcnROYW1lZERlY2xhcmF0aW9uIiwic3BlY2lmaWVycyIsImxlbmd0aCIsInNvbWVOYW1lZCIsInNvbWUiLCJzcGVjaWZpZXIiLCJleHBvcnRlZCIsIm5hbWUiXSwibWFwcGluZ3MiOiJhQUFBLHFDOztBQUVBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxZQURGO0FBRUpDLFVBQU0sRUFBRUMsS0FBSyx1QkFBUSxpQkFBUixDQUFQLEVBRkY7QUFHSkMsWUFBUSxFQUhKLEVBRFM7OztBQU9mQyxTQUFPQyxPQUFQLEVBQWdCO0FBQ2Q7QUFDQSxRQUFJQSxRQUFRQyxhQUFSLENBQXNCQyxVQUF0QixLQUFxQyxRQUF6QyxFQUFtRDtBQUNqRCxhQUFPLEVBQVA7QUFDRDs7QUFFRCxVQUFNQyxVQUFVLGdDQUFoQjs7QUFFQSxXQUFPO0FBQ0xDLDJCQUFxQkMsSUFBckIsRUFBMkI7QUFDekJMLGdCQUFRTSxNQUFSLENBQWUsRUFBQ0QsSUFBRCxFQUFPRixPQUFQLEVBQWY7QUFDRCxPQUhJOztBQUtMSSw2QkFBdUJGLElBQXZCLEVBQTZCO0FBQzNCLFlBQUlBLEtBQUtHLFVBQUwsQ0FBZ0JDLE1BQWhCLEtBQTJCLENBQS9CLEVBQWtDO0FBQ2hDLGlCQUFPVCxRQUFRTSxNQUFSLENBQWUsRUFBQ0QsSUFBRCxFQUFPRixPQUFQLEVBQWYsQ0FBUDtBQUNEOztBQUVELGNBQU1PLFlBQVlMLEtBQUtHLFVBQUwsQ0FBZ0JHLElBQWhCLENBQXFCQyxhQUFhQSxVQUFVQyxRQUFWLENBQW1CQyxJQUFuQixLQUE0QixTQUE5RCxDQUFsQjtBQUNBLFlBQUlKLFNBQUosRUFBZTtBQUNiVixrQkFBUU0sTUFBUixDQUFlLEVBQUNELElBQUQsRUFBT0YsT0FBUCxFQUFmO0FBQ0Q7QUFDRixPQWRJLEVBQVA7O0FBZ0JELEdBL0JjLEVBQWpCIiwiZmlsZSI6Im5vLW5hbWVkLWV4cG9ydC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHsgdXJsOiBkb2NzVXJsKCduby1uYW1lZC1leHBvcnQnKSB9LFxuICAgIHNjaGVtYTogW10sXG4gIH0sXG5cbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICAvLyBpZ25vcmUgbm9uLW1vZHVsZXNcbiAgICBpZiAoY29udGV4dC5wYXJzZXJPcHRpb25zLnNvdXJjZVR5cGUgIT09ICdtb2R1bGUnKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gJ05hbWVkIGV4cG9ydHMgYXJlIG5vdCBhbGxvd2VkLidcblxuICAgIHJldHVybiB7XG4gICAgICBFeHBvcnRBbGxEZWNsYXJhdGlvbihub2RlKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtub2RlLCBtZXNzYWdlfSlcbiAgICAgIH0sXG5cbiAgICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS5zcGVjaWZpZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlcG9ydCh7bm9kZSwgbWVzc2FnZX0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb21lTmFtZWQgPSBub2RlLnNwZWNpZmllcnMuc29tZShzcGVjaWZpZXIgPT4gc3BlY2lmaWVyLmV4cG9ydGVkLm5hbWUgIT09ICdkZWZhdWx0JylcbiAgICAgICAgaWYgKHNvbWVOYW1lZCkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtub2RlLCBtZXNzYWdlfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-namespace.js b/node_modules/eslint-plugin-import/lib/rules/no-namespace.js
index b25a26e..2a24bf8 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-namespace.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-namespace.js
@@ -1,36 +1,32 @@
 'use strict';
 
-var _docsUrl = require('../docsUrl');
 
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
 
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } } /**
-                                                                                                                                                                                                 * @fileoverview Rule to disallow namespace import
-                                                                                                                                                                                                 * @author Radek Benkel
-                                                                                                                                                                                                 */
-
-//------------------------------------------------------------------------------
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _toConsumableArray(arr) {if (Array.isArray(arr)) {for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];return arr2;} else {return Array.from(arr);}} /**
+                                                                                                                                                                                                                                                                                                                                                                             * @fileoverview Rule to disallow namespace import
+                                                                                                                                                                                                                                                                                                                                                                             * @author Radek Benkel
+                                                                                                                                                                                                                                                                                                                                                                             */ //------------------------------------------------------------------------------
 // Rule Definition
 //------------------------------------------------------------------------------
 
-
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-namespace')
-    },
+      url: (0, _docsUrl2.default)('no-namespace') },
+
     fixable: 'code',
-    schema: []
-  },
+    schema: [] },
+
 
   create: function (context) {
     return {
       'ImportNamespaceSpecifier': function (node) {
         const scopeVariables = context.getScope().variables;
-        const namespaceVariable = scopeVariables.find(variable => variable.defs[0].node === node);
+        const namespaceVariable = scopeVariables.find(variable =>
+        variable.defs[0].node === node);
+
         const namespaceReferences = namespaceVariable.references;
         const namespaceIdentifiers = namespaceReferences.map(reference => reference.identifier);
         const canFix = namespaceIdentifiers.length > 0 && !usesNamespaceAsObject(namespaceIdentifiers);
@@ -60,10 +56,18 @@
 
             // Choose new names for each import
             const importNames = Object.keys(importNameConflicts);
-            const importLocalNames = generateLocalNames(importNames, importNameConflicts, namespaceVariable.name);
+            const importLocalNames = generateLocalNames(
+            importNames,
+            importNameConflicts,
+            namespaceVariable.name);
+
 
             // Replace the ImportNamespaceSpecifier with a list of ImportSpecifiers
-            const namedImportSpecifiers = importNames.map(importName => importName === importLocalNames[importName] ? importName : `${importName} as ${importLocalNames[importName]}`);
+            const namedImportSpecifiers = importNames.map(importName =>
+            importName === importLocalNames[importName] ?
+            importName :
+            `${importName} as ${importLocalNames[importName]}`);
+
             fixes.push(fixer.replaceText(node, `{ ${namedImportSpecifiers.join(', ')} }`));
 
             // Pass 2: Replace references to the namespace with references to the named imports
@@ -76,38 +80,44 @@
             });
 
             return fixes;
-          })
-        });
-      }
-    };
+          }) });
+
+      } };
+
   }
 
+
   /**
-   * @param {Identifier[]} namespaceIdentifiers
-   * @returns {boolean} `true` if the namespace variable is more than just a glorified constant
-   */
-};function usesNamespaceAsObject(namespaceIdentifiers) {
+     * @param {Identifier[]} namespaceIdentifiers
+     * @returns {boolean} `true` if the namespace variable is more than just a glorified constant
+     */ };
+function usesNamespaceAsObject(namespaceIdentifiers) {
   return !namespaceIdentifiers.every(identifier => {
     const parent = identifier.parent;
 
     // `namespace.x` or `namespace['x']`
-    return parent && parent.type === 'MemberExpression' && (parent.property.type === 'Identifier' || parent.property.type === 'Literal');
+    return (
+      parent && parent.type === 'MemberExpression' && (
+      parent.property.type === 'Identifier' || parent.property.type === 'Literal'));
+
   });
 }
 
 /**
- * @param {MemberExpression} memberExpression
- * @returns {string} the name of the member in the object expression, e.g. the `x` in `namespace.x`
- */
+   * @param {MemberExpression} memberExpression
+   * @returns {string} the name of the member in the object expression, e.g. the `x` in `namespace.x`
+   */
 function getMemberPropertyName(memberExpression) {
-  return memberExpression.property.type === 'Identifier' ? memberExpression.property.name : memberExpression.property.value;
+  return memberExpression.property.type === 'Identifier' ?
+  memberExpression.property.name :
+  memberExpression.property.value;
 }
 
 /**
- * @param {ScopeManager} scopeManager
- * @param {ASTNode} node
- * @return {Set<string>}
- */
+   * @param {ScopeManager} scopeManager
+   * @param {ASTNode} node
+   * @return {Set<string>}
+   */
 function getVariableNamesInScope(scopeManager, node) {
   let currentNode = node;
   let scope = scopeManager.acquire(currentNode);
@@ -115,15 +125,18 @@
     currentNode = currentNode.parent;
     scope = scopeManager.acquire(currentNode, true);
   }
-  return new Set([].concat(_toConsumableArray(scope.variables.map(variable => variable.name)), _toConsumableArray(scope.upper.variables.map(variable => variable.name))));
+  return new Set([].concat(_toConsumableArray(
+  scope.variables.map(variable => variable.name)), _toConsumableArray(
+  scope.upper.variables.map(variable => variable.name))));
+
 }
 
 /**
- *
- * @param {*} names
- * @param {*} nameConflicts
- * @param {*} namespaceName
- */
+   *
+   * @param {*} names
+   * @param {*} nameConflicts
+   * @param {*} namespaceName
+   */
 function generateLocalNames(names, nameConflicts, namespaceName) {
   const localNames = {};
   names.forEach(name => {
@@ -144,4 +157,4 @@
   });
   return localNames;
 }
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1uYW1lc3BhY2UuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsImZpeGFibGUiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0Iiwibm9kZSIsInNjb3BlVmFyaWFibGVzIiwiZ2V0U2NvcGUiLCJ2YXJpYWJsZXMiLCJuYW1lc3BhY2VWYXJpYWJsZSIsImZpbmQiLCJ2YXJpYWJsZSIsImRlZnMiLCJuYW1lc3BhY2VSZWZlcmVuY2VzIiwicmVmZXJlbmNlcyIsIm5hbWVzcGFjZUlkZW50aWZpZXJzIiwibWFwIiwicmVmZXJlbmNlIiwiaWRlbnRpZmllciIsImNhbkZpeCIsImxlbmd0aCIsInVzZXNOYW1lc3BhY2VBc09iamVjdCIsInJlcG9ydCIsIm1lc3NhZ2UiLCJmaXgiLCJmaXhlciIsInNjb3BlTWFuYWdlciIsImdldFNvdXJjZUNvZGUiLCJmaXhlcyIsImltcG9ydE5hbWVDb25mbGljdHMiLCJmb3JFYWNoIiwicGFyZW50IiwiaW1wb3J0TmFtZSIsImdldE1lbWJlclByb3BlcnR5TmFtZSIsImxvY2FsQ29uZmxpY3RzIiwiZ2V0VmFyaWFibGVOYW1lc0luU2NvcGUiLCJjIiwiYWRkIiwiaW1wb3J0TmFtZXMiLCJPYmplY3QiLCJrZXlzIiwiaW1wb3J0TG9jYWxOYW1lcyIsImdlbmVyYXRlTG9jYWxOYW1lcyIsIm5hbWUiLCJuYW1lZEltcG9ydFNwZWNpZmllcnMiLCJwdXNoIiwicmVwbGFjZVRleHQiLCJqb2luIiwiZXZlcnkiLCJwcm9wZXJ0eSIsIm1lbWJlckV4cHJlc3Npb24iLCJ2YWx1ZSIsImN1cnJlbnROb2RlIiwic2NvcGUiLCJhY3F1aXJlIiwiU2V0IiwidXBwZXIiLCJuYW1lcyIsIm5hbWVDb25mbGljdHMiLCJuYW1lc3BhY2VOYW1lIiwibG9jYWxOYW1lcyIsImxvY2FsTmFtZSIsImhhcyIsImkiLCJJbmZpbml0eSJdLCJtYXBwaW5ncyI6Ijs7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LEdBQXRCLENBQTBCTCxZQUFZQSxTQUFTZ0MsSUFBL0MsQ0FGRSxHQUFQO0FBSUQ7O0FBRUQ7Ozs7OztBQU1BLFNBQVNELGtCQUFULENBQTRCZSxLQUE1QixFQUFtQ0MsYUFBbkMsRUFBa0RDLGFBQWxELEVBQWlFO0FBQy9ELFFBQU1DLGFBQWEsRUFBbkI7QUFDQUgsUUFBTTNCLE9BQU4sQ0FBZWEsSUFBRCxJQUFVO0FBQ3RCLFFBQUlrQixTQUFKO0FBQ0EsUUFBSSxDQUFDSCxjQUFjZixJQUFkLEVBQW9CbUIsR0FBcEIsQ0FBd0JuQixJQUF4QixDQUFMLEVBQW9DO0FBQ2xDa0Isa0JBQVlsQixJQUFaO0FBQ0QsS0FGRCxNQUVPLElBQUksQ0FBQ2UsY0FBY2YsSUFBZCxFQUFvQm1CLEdBQXBCLENBQXlCLEdBQUVILGFBQWMsSUFBR2hCLElBQUssRUFBakQsQ0FBTCxFQUEwRDtBQUMvRGtCLGtCQUFhLEdBQUVGLGFBQWMsSUFBR2hCLElBQUssRUFBckM7QUFDRCxLQUZNLE1BRUE7QUFDTCxXQUFLLElBQUlvQixJQUFJLENBQWIsRUFBZ0JBLElBQUlDLFFBQXBCLEVBQThCRCxHQUE5QixFQUFtQztBQUNqQyxZQUFJLENBQUNMLGNBQWNmLElBQWQsRUFBb0JtQixHQUFwQixDQUF5QixHQUFFSCxhQUFjLElBQUdoQixJQUFLLElBQUdvQixDQUFFLEVBQXRELENBQUwsRUFBK0Q7QUFDN0RGLHNCQUFhLEdBQUVGLGFBQWMsSUFBR2hCLElBQUssSUFBR29CLENBQUUsRUFBMUM7QUFDQTtBQUNEO0FBQ0Y7QUFDRjtBQUNESCxlQUFXakIsSUFBWCxJQUFtQmtCLFNBQW5CO0FBQ0QsR0FmRDtBQWdCQSxTQUFPRCxVQUFQO0FBQ0QiLCJmaWxlIjoibm8tbmFtZXNwYWNlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFJ1bGUgdG8gZGlzYWxsb3cgbmFtZXNwYWNlIGltcG9ydFxuICogQGF1dGhvciBSYWRlayBCZW5rZWxcbiAqL1xuXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUnVsZSBEZWZpbml0aW9uXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tbmFtZXNwYWNlJyksXG4gICAgfSxcbiAgICBmaXhhYmxlOiAnY29kZScsXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBjb25zdCBzY29wZVZhcmlhYmxlcyA9IGNvbnRleHQuZ2V0U2NvcGUoKS52YXJpYWJsZXNcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlVmFyaWFibGUgPSBzY29wZVZhcmlhYmxlcy5maW5kKCh2YXJpYWJsZSkgPT5cbiAgICAgICAgICB2YXJpYWJsZS5kZWZzWzBdLm5vZGUgPT09IG5vZGVcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBuYW1lc3BhY2VSZWZlcmVuY2VzID0gbmFtZXNwYWNlVmFyaWFibGUucmVmZXJlbmNlc1xuICAgICAgICBjb25zdCBuYW1lc3BhY2VJZGVudGlmaWVycyA9IG5hbWVzcGFjZVJlZmVyZW5jZXMubWFwKHJlZmVyZW5jZSA9PiByZWZlcmVuY2UuaWRlbnRpZmllcilcbiAgICAgICAgY29uc3QgY2FuRml4ID0gbmFtZXNwYWNlSWRlbnRpZmllcnMubGVuZ3RoID4gMCAmJiAhdXNlc05hbWVzcGFjZUFzT2JqZWN0KG5hbWVzcGFjZUlkZW50aWZpZXJzKVxuXG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBVbmV4cGVjdGVkIG5hbWVzcGFjZSBpbXBvcnQuYCxcbiAgICAgICAgICBmaXg6IGNhbkZpeCAmJiAoZml4ZXIgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2NvcGVNYW5hZ2VyID0gY29udGV4dC5nZXRTb3VyY2VDb2RlKCkuc2NvcGVNYW5hZ2VyXG4gICAgICAgICAgICBjb25zdCBmaXhlcyA9IFtdXG5cbiAgICAgICAgICAgIC8vIFBhc3MgMTogQ29sbGVjdCB2YXJpYWJsZSBuYW1lcyB0aGF0IGFyZSBhbHJlYWR5IGluIHNjb3BlIGZvciBlYWNoIHJlZmVyZW5jZSB3ZSB3YW50XG4gICAgICAgICAgICAvLyB0byB0cmFuc2Zvcm0sIHNvIHRoYXQgd2UgY2FuIGJlIHN1cmUgdGhhdCB3ZSBjaG9vc2Ugbm9uLWNvbmZsaWN0aW5nIGltcG9ydCBuYW1lc1xuICAgICAgICAgICAgY29uc3QgaW1wb3J0TmFtZUNvbmZsaWN0cyA9IHt9XG4gICAgICAgICAgICBuYW1lc3BhY2VJZGVudGlmaWVycy5mb3JFYWNoKChpZGVudGlmaWVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGlkZW50aWZpZXIucGFyZW50XG4gICAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGltcG9ydE5hbWUgPSBnZXRNZW1iZXJQcm9wZXJ0eU5hbWUocGFyZW50KVxuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsQ29uZmxpY3RzID0gZ2V0VmFyaWFibGVOYW1lc0luU2NvcGUoc2NvcGVNYW5hZ2VyLCBwYXJlbnQpXG4gICAgICAgICAgICAgICAgaWYgKCFpbXBvcnROYW1lQ29uZmxpY3RzW2ltcG9ydE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICBpbXBvcnROYW1lQ29uZmxpY3RzW2ltcG9ydE5hbWVdID0gbG9jYWxDb25mbGljdHNcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbG9jYWxDb25mbGljdHMuZm9yRWFjaCgoYykgPT4gaW1wb3J0TmFtZUNvbmZsaWN0c1tpbXBvcnROYW1lXS5hZGQoYykpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAvLyBDaG9vc2UgbmV3IG5hbWVzIGZvciBlYWNoIGltcG9ydFxuICAgICAgICAgICAgY29uc3QgaW1wb3J0TmFtZXMgPSBPYmplY3Qua2V5cyhpbXBvcnROYW1lQ29uZmxpY3RzKVxuICAgICAgICAgICAgY29uc3QgaW1wb3J0TG9jYWxOYW1lcyA9IGdlbmVyYXRlTG9jYWxOYW1lcyhcbiAgICAgICAgICAgICAgaW1wb3J0TmFtZXMsXG4gICAgICAgICAgICAgIGltcG9ydE5hbWVDb25mbGljdHMsXG4gICAgICAgICAgICAgIG5hbWVzcGFjZVZhcmlhYmxlLm5hbWVcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyIHdpdGggYSBsaXN0IG9mIEltcG9ydFNwZWNpZmllcnNcbiAgICAgICAgICAgIGNvbnN0IG5hbWVkSW1wb3J0U3BlY2lmaWVycyA9IGltcG9ydE5hbWVzLm1hcCgoaW1wb3J0TmFtZSkgPT5cbiAgICAgICAgICAgICAgaW1wb3J0TmFtZSA9PT0gaW1wb3J0TG9jYWxOYW1lc1tpbXBvcnROYW1lXVxuICAgICAgICAgICAgICAgID8gaW1wb3J0TmFtZVxuICAgICAgICAgICAgICAgIDogYCR7aW1wb3J0TmFtZX0gYXMgJHtpbXBvcnRMb2NhbE5hbWVzW2ltcG9ydE5hbWVdfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGZpeGVzLnB1c2goZml4ZXIucmVwbGFjZVRleHQobm9kZSwgYHsgJHtuYW1lZEltcG9ydFNwZWNpZmllcnMuam9pbignLCAnKX0gfWApKVxuXG4gICAgICAgICAgICAvLyBQYXNzIDI6IFJlcGxhY2UgcmVmZXJlbmNlcyB0byB0aGUgbmFtZXNwYWNlIHdpdGggcmVmZXJlbmNlcyB0byB0aGUgbmFtZWQgaW1wb3J0c1xuICAgICAgICAgICAgbmFtZXNwYWNlSWRlbnRpZmllcnMuZm9yRWFjaCgoaWRlbnRpZmllcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBpZGVudGlmaWVyLnBhcmVudFxuICAgICAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnROYW1lID0gZ2V0TWVtYmVyUHJvcGVydHlOYW1lKHBhcmVudClcbiAgICAgICAgICAgICAgICBmaXhlcy5wdXNoKGZpeGVyLnJlcGxhY2VUZXh0KHBhcmVudCwgaW1wb3J0TG9jYWxOYW1lc1tpbXBvcnROYW1lXSkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHJldHVybiBmaXhlc1xuICAgICAgICAgIH0pLFxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG5cbi8qKlxuICogQHBhcmFtIHtJZGVudGlmaWVyW119IG5hbWVzcGFjZUlkZW50aWZpZXJzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBuYW1lc3BhY2UgdmFyaWFibGUgaXMgbW9yZSB0aGFuIGp1c3QgYSBnbG9yaWZpZWQgY29uc3RhbnRcbiAqL1xuZnVuY3Rpb24gdXNlc05hbWVzcGFjZUFzT2JqZWN0KG5hbWVzcGFjZUlkZW50aWZpZXJzKSB7XG4gIHJldHVybiAhbmFtZXNwYWNlSWRlbnRpZmllcnMuZXZlcnkoKGlkZW50aWZpZXIpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSBpZGVudGlmaWVyLnBhcmVudFxuXG4gICAgLy8gYG5hbWVzcGFjZS54YCBvciBgbmFtZXNwYWNlWyd4J11gXG4gICAgcmV0dXJuIChcbiAgICAgIHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nICYmXG4gICAgICAocGFyZW50LnByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJyB8fCBwYXJlbnQucHJvcGVydHkudHlwZSA9PT0gJ0xpdGVyYWwnKVxuICAgIClcbiAgfSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge01lbWJlckV4cHJlc3Npb259IG1lbWJlckV4cHJlc3Npb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgaW4gdGhlIG9iamVjdCBleHByZXNzaW9uLCBlLmcuIHRoZSBgeGAgaW4gYG5hbWVzcGFjZS54YFxuICovXG5mdW5jdGlvbiBnZXRNZW1iZXJQcm9wZXJ0eU5hbWUobWVtYmVyRXhwcmVzc2lvbikge1xuICByZXR1cm4gbWVtYmVyRXhwcmVzc2lvbi5wcm9wZXJ0eS50eXBlID09PSAnSWRlbnRpZmllcidcbiAgICA/IG1lbWJlckV4cHJlc3Npb24ucHJvcGVydHkubmFtZVxuICAgIDogbWVtYmVyRXhwcmVzc2lvbi5wcm9wZXJ0eS52YWx1ZVxufVxuXG4vKipcbiAqIEBwYXJhbSB7U2NvcGVNYW5hZ2VyfSBzY29wZU1hbmFnZXJcbiAqIEBwYXJhbSB7QVNUTm9kZX0gbm9kZVxuICogQHJldHVybiB7U2V0PHN0cmluZz59XG4gKi9cbmZ1bmN0aW9uIGdldFZhcmlhYmxlTmFtZXNJblNjb3BlKHNjb3BlTWFuYWdlciwgbm9kZSkge1xuICBsZXQgY3VycmVudE5vZGUgPSBub2RlXG4gIGxldCBzY29wZSA9IHNjb3BlTWFuYWdlci5hY3F1aXJlKGN1cnJlbnROb2RlKVxuICB3aGlsZSAoc2NvcGUgPT0gbnVsbCkge1xuICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50XG4gICAgc2NvcGUgPSBzY29wZU1hbmFnZXIuYWNxdWlyZShjdXJyZW50Tm9kZSwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gbmV3IFNldChbXG4gICAgLi4uc2NvcGUudmFyaWFibGVzLm1hcCh2YXJpYWJsZSA9PiB2YXJpYWJsZS5uYW1lKSxcbiAgICAuLi5zY29wZS51cHBlci52YXJpYWJsZXMubWFwKHZhcmlhYmxlID0+IHZhcmlhYmxlLm5hbWUpLFxuICBdKVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0geyp9IG5hbWVzXG4gKiBAcGFyYW0geyp9IG5hbWVDb25mbGljdHNcbiAqIEBwYXJhbSB7Kn0gbmFtZXNwYWNlTmFtZVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUxvY2FsTmFtZXMobmFtZXMsIG5hbWVDb25mbGljdHMsIG5hbWVzcGFjZU5hbWUpIHtcbiAgY29uc3QgbG9jYWxOYW1lcyA9IHt9XG4gIG5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICBsZXQgbG9jYWxOYW1lXG4gICAgaWYgKCFuYW1lQ29uZmxpY3RzW25hbWVdLmhhcyhuYW1lKSkge1xuICAgICAgbG9jYWxOYW1lID0gbmFtZVxuICAgIH0gZWxzZSBpZiAoIW5hbWVDb25mbGljdHNbbmFtZV0uaGFzKGAke25hbWVzcGFjZU5hbWV9XyR7bmFtZX1gKSkge1xuICAgICAgbG9jYWxOYW1lID0gYCR7bmFtZXNwYWNlTmFtZX1fJHtuYW1lfWBcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBJbmZpbml0eTsgaSsrKSB7XG4gICAgICAgIGlmICghbmFtZUNvbmZsaWN0c1tuYW1lXS5oYXMoYCR7bmFtZXNwYWNlTmFtZX1fJHtuYW1lfV8ke2l9YCkpIHtcbiAgICAgICAgICBsb2NhbE5hbWUgPSBgJHtuYW1lc3BhY2VOYW1lfV8ke25hbWV9XyR7aX1gXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBsb2NhbE5hbWVzW25hbWVdID0gbG9jYWxOYW1lXG4gIH0pXG4gIHJldHVybiBsb2NhbE5hbWVzXG59XG4iXX0=
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1uYW1lc3BhY2UuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsImZpeGFibGUiLCJzY2hlbWEiLCJjcmVhdGUiLCJjb250ZXh0Iiwibm9kZSIsInNjb3BlVmFyaWFibGVzIiwiZ2V0U2NvcGUiLCJ2YXJpYWJsZXMiLCJuYW1lc3BhY2VWYXJpYWJsZSIsImZpbmQiLCJ2YXJpYWJsZSIsImRlZnMiLCJuYW1lc3BhY2VSZWZlcmVuY2VzIiwicmVmZXJlbmNlcyIsIm5hbWVzcGFjZUlkZW50aWZpZXJzIiwibWFwIiwicmVmZXJlbmNlIiwiaWRlbnRpZmllciIsImNhbkZpeCIsImxlbmd0aCIsInVzZXNOYW1lc3BhY2VBc09iamVjdCIsInJlcG9ydCIsIm1lc3NhZ2UiLCJmaXgiLCJmaXhlciIsInNjb3BlTWFuYWdlciIsImdldFNvdXJjZUNvZGUiLCJmaXhlcyIsImltcG9ydE5hbWVDb25mbGljdHMiLCJmb3JFYWNoIiwicGFyZW50IiwiaW1wb3J0TmFtZSIsImdldE1lbWJlclByb3BlcnR5TmFtZSIsImxvY2FsQ29uZmxpY3RzIiwiZ2V0VmFyaWFibGVOYW1lc0luU2NvcGUiLCJjIiwiYWRkIiwiaW1wb3J0TmFtZXMiLCJPYmplY3QiLCJrZXlzIiwiaW1wb3J0TG9jYWxOYW1lcyIsImdlbmVyYXRlTG9jYWxOYW1lcyIsIm5hbWUiLCJuYW1lZEltcG9ydFNwZWNpZmllcnMiLCJwdXNoIiwicmVwbGFjZVRleHQiLCJqb2luIiwiZXZlcnkiLCJwcm9wZXJ0eSIsIm1lbWJlckV4cHJlc3Npb24iLCJ2YWx1ZSIsImN1cnJlbnROb2RlIiwic2NvcGUiLCJhY3F1aXJlIiwiU2V0IiwidXBwZXIiLCJuYW1lcyIsIm5hbWVDb25mbGljdHMiLCJuYW1lc3BhY2VOYW1lIiwibG9jYWxOYW1lcyIsImxvY2FsTmFtZSIsImhhcyIsImkiLCJJbmZpbml0eSJdLCJtYXBwaW5ncyI6Ijs7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QVosQ0FBc0JRLEdBQXRCLENBQTBCTCxZQUFZQSxTQUFTZ0MsSUFBL0MsQ0FGRSxHQUFQOztBQUlEOztBQUVEOzs7Ozs7QUFNQSxTQUFTRCxrQkFBVCxDQUE0QmUsS0FBNUIsRUFBbUNDLGFBQW5DLEVBQWtEQyxhQUFsRCxFQUFpRTtBQUMvRCxRQUFNQyxhQUFhLEVBQW5CO0FBQ0FILFFBQU0zQixPQUFOLENBQWVhLElBQUQsSUFBVTtBQUN0QixRQUFJa0IsU0FBSjtBQUNBLFFBQUksQ0FBQ0gsY0FBY2YsSUFBZCxFQUFvQm1CLEdBQXBCLENBQXdCbkIsSUFBeEIsQ0FBTCxFQUFvQztBQUNsQ2tCLGtCQUFZbEIsSUFBWjtBQUNELEtBRkQsTUFFTyxJQUFJLENBQUNlLGNBQWNmLElBQWQsRUFBb0JtQixHQUFwQixDQUF5QixHQUFFSCxhQUFjLElBQUdoQixJQUFLLEVBQWpELENBQUwsRUFBMEQ7QUFDL0RrQixrQkFBYSxHQUFFRixhQUFjLElBQUdoQixJQUFLLEVBQXJDO0FBQ0QsS0FGTSxNQUVBO0FBQ0wsV0FBSyxJQUFJb0IsSUFBSSxDQUFiLEVBQWdCQSxJQUFJQyxRQUFwQixFQUE4QkQsR0FBOUIsRUFBbUM7QUFDakMsWUFBSSxDQUFDTCxjQUFjZixJQUFkLEVBQW9CbUIsR0FBcEIsQ0FBeUIsR0FBRUgsYUFBYyxJQUFHaEIsSUFBSyxJQUFHb0IsQ0FBRSxFQUF0RCxDQUFMLEVBQStEO0FBQzdERixzQkFBYSxHQUFFRixhQUFjLElBQUdoQixJQUFLLElBQUdvQixDQUFFLEVBQTFDO0FBQ0E7QUFDRDtBQUNGO0FBQ0Y7QUFDREgsZUFBV2pCLElBQVgsSUFBbUJrQixTQUFuQjtBQUNELEdBZkQ7QUFnQkEsU0FBT0QsVUFBUDtBQUNEIiwiZmlsZSI6Im5vLW5hbWVzcGFjZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVvdmVydmlldyBSdWxlIHRvIGRpc2FsbG93IG5hbWVzcGFjZSBpbXBvcnRcbiAqIEBhdXRob3IgUmFkZWsgQmVua2VsXG4gKi9cblxuaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJ1bGUgRGVmaW5pdGlvblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLW5hbWVzcGFjZScpLFxuICAgIH0sXG4gICAgZml4YWJsZTogJ2NvZGUnLFxuICAgIHNjaGVtYTogW10sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHJldHVybiB7XG4gICAgICAnSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyJzogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVWYXJpYWJsZXMgPSBjb250ZXh0LmdldFNjb3BlKCkudmFyaWFibGVzXG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZVZhcmlhYmxlID0gc2NvcGVWYXJpYWJsZXMuZmluZCgodmFyaWFibGUpID0+XG4gICAgICAgICAgdmFyaWFibGUuZGVmc1swXS5ub2RlID09PSBub2RlXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlUmVmZXJlbmNlcyA9IG5hbWVzcGFjZVZhcmlhYmxlLnJlZmVyZW5jZXNcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlSWRlbnRpZmllcnMgPSBuYW1lc3BhY2VSZWZlcmVuY2VzLm1hcChyZWZlcmVuY2UgPT4gcmVmZXJlbmNlLmlkZW50aWZpZXIpXG4gICAgICAgIGNvbnN0IGNhbkZpeCA9IG5hbWVzcGFjZUlkZW50aWZpZXJzLmxlbmd0aCA+IDAgJiYgIXVzZXNOYW1lc3BhY2VBc09iamVjdChuYW1lc3BhY2VJZGVudGlmaWVycylcblxuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBtZXNzYWdlOiBgVW5leHBlY3RlZCBuYW1lc3BhY2UgaW1wb3J0LmAsXG4gICAgICAgICAgZml4OiBjYW5GaXggJiYgKGZpeGVyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNjb3BlTWFuYWdlciA9IGNvbnRleHQuZ2V0U291cmNlQ29kZSgpLnNjb3BlTWFuYWdlclxuICAgICAgICAgICAgY29uc3QgZml4ZXMgPSBbXVxuXG4gICAgICAgICAgICAvLyBQYXNzIDE6IENvbGxlY3QgdmFyaWFibGUgbmFtZXMgdGhhdCBhcmUgYWxyZWFkeSBpbiBzY29wZSBmb3IgZWFjaCByZWZlcmVuY2Ugd2Ugd2FudFxuICAgICAgICAgICAgLy8gdG8gdHJhbnNmb3JtLCBzbyB0aGF0IHdlIGNhbiBiZSBzdXJlIHRoYXQgd2UgY2hvb3NlIG5vbi1jb25mbGljdGluZyBpbXBvcnQgbmFtZXNcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydE5hbWVDb25mbGljdHMgPSB7fVxuICAgICAgICAgICAgbmFtZXNwYWNlSWRlbnRpZmllcnMuZm9yRWFjaCgoaWRlbnRpZmllcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBpZGVudGlmaWVyLnBhcmVudFxuICAgICAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnROYW1lID0gZ2V0TWVtYmVyUHJvcGVydHlOYW1lKHBhcmVudClcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbENvbmZsaWN0cyA9IGdldFZhcmlhYmxlTmFtZXNJblNjb3BlKHNjb3BlTWFuYWdlciwgcGFyZW50KVxuICAgICAgICAgICAgICAgIGlmICghaW1wb3J0TmFtZUNvbmZsaWN0c1tpbXBvcnROYW1lXSkge1xuICAgICAgICAgICAgICAgICAgaW1wb3J0TmFtZUNvbmZsaWN0c1tpbXBvcnROYW1lXSA9IGxvY2FsQ29uZmxpY3RzXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGxvY2FsQ29uZmxpY3RzLmZvckVhY2goKGMpID0+IGltcG9ydE5hbWVDb25mbGljdHNbaW1wb3J0TmFtZV0uYWRkKGMpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgLy8gQ2hvb3NlIG5ldyBuYW1lcyBmb3IgZWFjaCBpbXBvcnRcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydE5hbWVzID0gT2JqZWN0LmtleXMoaW1wb3J0TmFtZUNvbmZsaWN0cylcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydExvY2FsTmFtZXMgPSBnZW5lcmF0ZUxvY2FsTmFtZXMoXG4gICAgICAgICAgICAgIGltcG9ydE5hbWVzLFxuICAgICAgICAgICAgICBpbXBvcnROYW1lQ29uZmxpY3RzLFxuICAgICAgICAgICAgICBuYW1lc3BhY2VWYXJpYWJsZS5uYW1lXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllciB3aXRoIGEgbGlzdCBvZiBJbXBvcnRTcGVjaWZpZXJzXG4gICAgICAgICAgICBjb25zdCBuYW1lZEltcG9ydFNwZWNpZmllcnMgPSBpbXBvcnROYW1lcy5tYXAoKGltcG9ydE5hbWUpID0+XG4gICAgICAgICAgICAgIGltcG9ydE5hbWUgPT09IGltcG9ydExvY2FsTmFtZXNbaW1wb3J0TmFtZV1cbiAgICAgICAgICAgICAgICA/IGltcG9ydE5hbWVcbiAgICAgICAgICAgICAgICA6IGAke2ltcG9ydE5hbWV9IGFzICR7aW1wb3J0TG9jYWxOYW1lc1tpbXBvcnROYW1lXX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBmaXhlcy5wdXNoKGZpeGVyLnJlcGxhY2VUZXh0KG5vZGUsIGB7ICR7bmFtZWRJbXBvcnRTcGVjaWZpZXJzLmpvaW4oJywgJyl9IH1gKSlcblxuICAgICAgICAgICAgLy8gUGFzcyAyOiBSZXBsYWNlIHJlZmVyZW5jZXMgdG8gdGhlIG5hbWVzcGFjZSB3aXRoIHJlZmVyZW5jZXMgdG8gdGhlIG5hbWVkIGltcG9ydHNcbiAgICAgICAgICAgIG5hbWVzcGFjZUlkZW50aWZpZXJzLmZvckVhY2goKGlkZW50aWZpZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gaWRlbnRpZmllci5wYXJlbnRcbiAgICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1wb3J0TmFtZSA9IGdldE1lbWJlclByb3BlcnR5TmFtZShwYXJlbnQpXG4gICAgICAgICAgICAgICAgZml4ZXMucHVzaChmaXhlci5yZXBsYWNlVGV4dChwYXJlbnQsIGltcG9ydExvY2FsTmFtZXNbaW1wb3J0TmFtZV0pKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICByZXR1cm4gZml4ZXNcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuXG4vKipcbiAqIEBwYXJhbSB7SWRlbnRpZmllcltdfSBuYW1lc3BhY2VJZGVudGlmaWVyc1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgbmFtZXNwYWNlIHZhcmlhYmxlIGlzIG1vcmUgdGhhbiBqdXN0IGEgZ2xvcmlmaWVkIGNvbnN0YW50XG4gKi9cbmZ1bmN0aW9uIHVzZXNOYW1lc3BhY2VBc09iamVjdChuYW1lc3BhY2VJZGVudGlmaWVycykge1xuICByZXR1cm4gIW5hbWVzcGFjZUlkZW50aWZpZXJzLmV2ZXJ5KChpZGVudGlmaWVyKSA9PiB7XG4gICAgY29uc3QgcGFyZW50ID0gaWRlbnRpZmllci5wYXJlbnRcblxuICAgIC8vIGBuYW1lc3BhY2UueGAgb3IgYG5hbWVzcGFjZVsneCddYFxuICAgIHJldHVybiAoXG4gICAgICBwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJyAmJlxuICAgICAgKHBhcmVudC5wcm9wZXJ0eS50eXBlID09PSAnSWRlbnRpZmllcicgfHwgcGFyZW50LnByb3BlcnR5LnR5cGUgPT09ICdMaXRlcmFsJylcbiAgICApXG4gIH0pXG59XG5cbi8qKlxuICogQHBhcmFtIHtNZW1iZXJFeHByZXNzaW9ufSBtZW1iZXJFeHByZXNzaW9uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIGluIHRoZSBvYmplY3QgZXhwcmVzc2lvbiwgZS5nLiB0aGUgYHhgIGluIGBuYW1lc3BhY2UueGBcbiAqL1xuZnVuY3Rpb24gZ2V0TWVtYmVyUHJvcGVydHlOYW1lKG1lbWJlckV4cHJlc3Npb24pIHtcbiAgcmV0dXJuIG1lbWJlckV4cHJlc3Npb24ucHJvcGVydHkudHlwZSA9PT0gJ0lkZW50aWZpZXInXG4gICAgPyBtZW1iZXJFeHByZXNzaW9uLnByb3BlcnR5Lm5hbWVcbiAgICA6IG1lbWJlckV4cHJlc3Npb24ucHJvcGVydHkudmFsdWVcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Njb3BlTWFuYWdlcn0gc2NvcGVNYW5hZ2VyXG4gKiBAcGFyYW0ge0FTVE5vZGV9IG5vZGVcbiAqIEByZXR1cm4ge1NldDxzdHJpbmc+fVxuICovXG5mdW5jdGlvbiBnZXRWYXJpYWJsZU5hbWVzSW5TY29wZShzY29wZU1hbmFnZXIsIG5vZGUpIHtcbiAgbGV0IGN1cnJlbnROb2RlID0gbm9kZVxuICBsZXQgc2NvcGUgPSBzY29wZU1hbmFnZXIuYWNxdWlyZShjdXJyZW50Tm9kZSlcbiAgd2hpbGUgKHNjb3BlID09IG51bGwpIHtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudFxuICAgIHNjb3BlID0gc2NvcGVNYW5hZ2VyLmFjcXVpcmUoY3VycmVudE5vZGUsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG5ldyBTZXQoW1xuICAgIC4uLnNjb3BlLnZhcmlhYmxlcy5tYXAodmFyaWFibGUgPT4gdmFyaWFibGUubmFtZSksXG4gICAgLi4uc2NvcGUudXBwZXIudmFyaWFibGVzLm1hcCh2YXJpYWJsZSA9PiB2YXJpYWJsZS5uYW1lKSxcbiAgXSlcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHsqfSBuYW1lc1xuICogQHBhcmFtIHsqfSBuYW1lQ29uZmxpY3RzXG4gKiBAcGFyYW0geyp9IG5hbWVzcGFjZU5hbWVcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVMb2NhbE5hbWVzKG5hbWVzLCBuYW1lQ29uZmxpY3RzLCBuYW1lc3BhY2VOYW1lKSB7XG4gIGNvbnN0IGxvY2FsTmFtZXMgPSB7fVxuICBuYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgbGV0IGxvY2FsTmFtZVxuICAgIGlmICghbmFtZUNvbmZsaWN0c1tuYW1lXS5oYXMobmFtZSkpIHtcbiAgICAgIGxvY2FsTmFtZSA9IG5hbWVcbiAgICB9IGVsc2UgaWYgKCFuYW1lQ29uZmxpY3RzW25hbWVdLmhhcyhgJHtuYW1lc3BhY2VOYW1lfV8ke25hbWV9YCkpIHtcbiAgICAgIGxvY2FsTmFtZSA9IGAke25hbWVzcGFjZU5hbWV9XyR7bmFtZX1gXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgSW5maW5pdHk7IGkrKykge1xuICAgICAgICBpZiAoIW5hbWVDb25mbGljdHNbbmFtZV0uaGFzKGAke25hbWVzcGFjZU5hbWV9XyR7bmFtZX1fJHtpfWApKSB7XG4gICAgICAgICAgbG9jYWxOYW1lID0gYCR7bmFtZXNwYWNlTmFtZX1fJHtuYW1lfV8ke2l9YFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbG9jYWxOYW1lc1tuYW1lXSA9IGxvY2FsTmFtZVxuICB9KVxuICByZXR1cm4gbG9jYWxOYW1lc1xufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-nodejs-modules.js b/node_modules/eslint-plugin-import/lib/rules/no-nodejs-modules.js
index 584f4dc..811adec 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-nodejs-modules.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-nodejs-modules.js
@@ -1,18 +1,6 @@
-'use strict';
-
-var _importType = require('../core/importType');
-
-var _importType2 = _interopRequireDefault(_importType);
-
-var _staticRequire = require('../core/staticRequire');
-
-var _staticRequire2 = _interopRequireDefault(_staticRequire);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _importType = require('../core/importType');var _importType2 = _interopRequireDefault(_importType);
+var _staticRequire = require('../core/staticRequire');var _staticRequire2 = _interopRequireDefault(_staticRequire);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 function reportIfMissing(context, node, allowed, name) {
   if (allowed.indexOf(name) === -1 && (0, _importType2.default)(name, context) === 'builtin') {
@@ -24,22 +12,24 @@
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-nodejs-modules')
-    },
-    schema: [{
+      url: (0, _docsUrl2.default)('no-nodejs-modules') },
+
+    schema: [
+    {
       type: 'object',
       properties: {
         allow: {
           type: 'array',
           uniqueItems: true,
           items: {
-            type: 'string'
-          }
-        }
-      },
-      additionalProperties: false
-    }]
-  },
+            type: 'string' } } },
+
+
+
+      additionalProperties: false }] },
+
+
+
 
   create: function (context) {
     const options = context.options[0] || {};
@@ -53,8 +43,7 @@
         if ((0, _staticRequire2.default)(node)) {
           reportIfMissing(context, node, allowed, node.arguments[0].value);
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1ub2RlanMtbW9kdWxlcy5qcyJdLCJuYW1lcyI6WyJyZXBvcnRJZk1pc3NpbmciLCJjb250ZXh0Iiwibm9kZSIsImFsbG93ZWQiLCJuYW1lIiwiaW5kZXhPZiIsInJlcG9ydCIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiYWxsb3ciLCJ1bmlxdWVJdGVtcyIsIml0ZW1zIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjcmVhdGUiLCJvcHRpb25zIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJoYW5kbGVJbXBvcnRzIiwic291cmNlIiwidmFsdWUiLCJDYWxsRXhwcmVzc2lvbiIsImhhbmRsZVJlcXVpcmVzIiwiYXJndW1lbnRzIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsU0FBU0EsZUFBVCxDQUF5QkMsT0FBekIsRUFBa0NDLElBQWxDLEVBQXdDQyxPQUF4QyxFQUFpREMsSUFBakQsRUFBdUQ7QUFDckQsTUFBSUQsUUFBUUUsT0FBUixDQUFnQkQsSUFBaEIsTUFBMEIsQ0FBQyxDQUEzQixJQUFnQywwQkFBV0EsSUFBWCxFQUFpQkgsT0FBakIsTUFBOEIsU0FBbEUsRUFBNkU7QUFDM0VBLFlBQVFLLE1BQVIsQ0FBZUosSUFBZixFQUFxQiwyQ0FBMkNFLElBQTNDLEdBQWtELEdBQXZFO0FBQ0Q7QUFDRjs7QUFFREcsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsbUJBQVI7QUFERCxLQUZGO0FBS0pDLFlBQVEsQ0FDTjtBQUNFSCxZQUFNLFFBRFI7QUFFRUksa0JBQVk7QUFDVkMsZUFBTztBQUNMTCxnQkFBTSxPQUREO0FBRUxNLHVCQUFhLElBRlI7QUFHTEMsaUJBQU87QUFDTFAsa0JBQU07QUFERDtBQUhGO0FBREcsT0FGZDtBQVdFUSw0QkFBc0I7QUFYeEIsS0FETTtBQUxKLEdBRFM7O0FBdUJmQyxVQUFRLFVBQVVsQixPQUFWLEVBQW1CO0FBQ3pCLFVBQU1tQixVQUFVbkIsUUFBUW1CLE9BQVIsQ0FBZ0IsQ0FBaEIsS0FBc0IsRUFBdEM7QUFDQSxVQUFNakIsVUFBVWlCLFFBQVFMLEtBQVIsSUFBaUIsRUFBakM7O0FBRUEsV0FBTztBQUNMTSx5QkFBbUIsU0FBU0MsYUFBVCxDQUF1QnBCLElBQXZCLEVBQTZCO0FBQzlDRix3QkFBZ0JDLE9BQWhCLEVBQXlCQyxJQUF6QixFQUErQkMsT0FBL0IsRUFBd0NELEtBQUtxQixNQUFMLENBQVlDLEtBQXBEO0FBQ0QsT0FISTtBQUlMQyxzQkFBZ0IsU0FBU0MsY0FBVCxDQUF3QnhCLElBQXhCLEVBQThCO0FBQzVDLFlBQUksNkJBQWdCQSxJQUFoQixDQUFKLEVBQTJCO0FBQ3pCRiwwQkFBZ0JDLE9BQWhCLEVBQXlCQyxJQUF6QixFQUErQkMsT0FBL0IsRUFBd0NELEtBQUt5QixTQUFMLENBQWUsQ0FBZixFQUFrQkgsS0FBMUQ7QUFDRDtBQUNGO0FBUkksS0FBUDtBQVVEO0FBckNjLENBQWpCIiwiZmlsZSI6Im5vLW5vZGVqcy1tb2R1bGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGltcG9ydFR5cGUgZnJvbSAnLi4vY29yZS9pbXBvcnRUeXBlJ1xuaW1wb3J0IGlzU3RhdGljUmVxdWlyZSBmcm9tICcuLi9jb3JlL3N0YXRpY1JlcXVpcmUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5mdW5jdGlvbiByZXBvcnRJZk1pc3NpbmcoY29udGV4dCwgbm9kZSwgYWxsb3dlZCwgbmFtZSkge1xuICBpZiAoYWxsb3dlZC5pbmRleE9mKG5hbWUpID09PSAtMSAmJiBpbXBvcnRUeXBlKG5hbWUsIGNvbnRleHQpID09PSAnYnVpbHRpbicpIHtcbiAgICBjb250ZXh0LnJlcG9ydChub2RlLCAnRG8gbm90IGltcG9ydCBOb2RlLmpzIGJ1aWx0aW4gbW9kdWxlIFwiJyArIG5hbWUgKyAnXCInKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tbm9kZWpzLW1vZHVsZXMnKSxcbiAgICB9LFxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGFsbG93OiB7XG4gICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgdW5pcXVlSXRlbXM6IHRydWUsXG4gICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHt9XG4gICAgY29uc3QgYWxsb3dlZCA9IG9wdGlvbnMuYWxsb3cgfHwgW11cblxuICAgIHJldHVybiB7XG4gICAgICBJbXBvcnREZWNsYXJhdGlvbjogZnVuY3Rpb24gaGFuZGxlSW1wb3J0cyhub2RlKSB7XG4gICAgICAgIHJlcG9ydElmTWlzc2luZyhjb250ZXh0LCBub2RlLCBhbGxvd2VkLCBub2RlLnNvdXJjZS52YWx1ZSlcbiAgICAgIH0sXG4gICAgICBDYWxsRXhwcmVzc2lvbjogZnVuY3Rpb24gaGFuZGxlUmVxdWlyZXMobm9kZSkge1xuICAgICAgICBpZiAoaXNTdGF0aWNSZXF1aXJlKG5vZGUpKSB7XG4gICAgICAgICAgcmVwb3J0SWZNaXNzaW5nKGNvbnRleHQsIG5vZGUsIGFsbG93ZWQsIG5vZGUuYXJndW1lbnRzWzBdLnZhbHVlKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1ub2RlanMtbW9kdWxlcy5qcyJdLCJuYW1lcyI6WyJyZXBvcnRJZk1pc3NpbmciLCJjb250ZXh0Iiwibm9kZSIsImFsbG93ZWQiLCJuYW1lIiwiaW5kZXhPZiIsInJlcG9ydCIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiYWxsb3ciLCJ1bmlxdWVJdGVtcyIsIml0ZW1zIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjcmVhdGUiLCJvcHRpb25zIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJoYW5kbGVJbXBvcnRzIiwic291cmNlIiwidmFsdWUiLCJDYWxsRXhwcmVzc2lvbiIsImhhbmRsZVJlcXVpcmVzIiwiYXJndW1lbnRzIl0sIm1hcHBpbmdzIjoiYUFBQSxnRDtBQUNBLHNEO0FBQ0EscUM7O0FBRUEsU0FBU0EsZUFBVCxDQUF5QkMsT0FBekIsRUFBa0NDLElBQWxDLEVBQXdDQyxPQUF4QyxFQUFpREMsSUFBakQsRUFBdUQ7QUFDckQsTUFBSUQsUUFBUUUsT0FBUixDQUFnQkQsSUFBaEIsTUFBMEIsQ0FBQyxDQUEzQixJQUFnQywwQkFBV0EsSUFBWCxFQUFpQkgsT0FBakIsTUFBOEIsU0FBbEUsRUFBNkU7QUFDM0VBLFlBQVFLLE1BQVIsQ0FBZUosSUFBZixFQUFxQiwyQ0FBMkNFLElBQTNDLEdBQWtELEdBQXZFO0FBQ0Q7QUFDRjs7QUFFREcsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsbUJBQVIsQ0FERCxFQUZGOztBQUtKQyxZQUFRO0FBQ047QUFDRUgsWUFBTSxRQURSO0FBRUVJLGtCQUFZO0FBQ1ZDLGVBQU87QUFDTEwsZ0JBQU0sT0FERDtBQUVMTSx1QkFBYSxJQUZSO0FBR0xDLGlCQUFPO0FBQ0xQLGtCQUFNLFFBREQsRUFIRixFQURHLEVBRmQ7Ozs7QUFXRVEsNEJBQXNCLEtBWHhCLEVBRE0sQ0FMSixFQURTOzs7OztBQXVCZkMsVUFBUSxVQUFVbEIsT0FBVixFQUFtQjtBQUN6QixVQUFNbUIsVUFBVW5CLFFBQVFtQixPQUFSLENBQWdCLENBQWhCLEtBQXNCLEVBQXRDO0FBQ0EsVUFBTWpCLFVBQVVpQixRQUFRTCxLQUFSLElBQWlCLEVBQWpDOztBQUVBLFdBQU87QUFDTE0seUJBQW1CLFNBQVNDLGFBQVQsQ0FBdUJwQixJQUF2QixFQUE2QjtBQUM5Q0Ysd0JBQWdCQyxPQUFoQixFQUF5QkMsSUFBekIsRUFBK0JDLE9BQS9CLEVBQXdDRCxLQUFLcUIsTUFBTCxDQUFZQyxLQUFwRDtBQUNELE9BSEk7QUFJTEMsc0JBQWdCLFNBQVNDLGNBQVQsQ0FBd0J4QixJQUF4QixFQUE4QjtBQUM1QyxZQUFJLDZCQUFnQkEsSUFBaEIsQ0FBSixFQUEyQjtBQUN6QkYsMEJBQWdCQyxPQUFoQixFQUF5QkMsSUFBekIsRUFBK0JDLE9BQS9CLEVBQXdDRCxLQUFLeUIsU0FBTCxDQUFlLENBQWYsRUFBa0JILEtBQTFEO0FBQ0Q7QUFDRixPQVJJLEVBQVA7O0FBVUQsR0FyQ2MsRUFBakIiLCJmaWxlIjoibm8tbm9kZWpzLW1vZHVsZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaW1wb3J0VHlwZSBmcm9tICcuLi9jb3JlL2ltcG9ydFR5cGUnXG5pbXBvcnQgaXNTdGF0aWNSZXF1aXJlIGZyb20gJy4uL2NvcmUvc3RhdGljUmVxdWlyZSdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbmZ1bmN0aW9uIHJlcG9ydElmTWlzc2luZyhjb250ZXh0LCBub2RlLCBhbGxvd2VkLCBuYW1lKSB7XG4gIGlmIChhbGxvd2VkLmluZGV4T2YobmFtZSkgPT09IC0xICYmIGltcG9ydFR5cGUobmFtZSwgY29udGV4dCkgPT09ICdidWlsdGluJykge1xuICAgIGNvbnRleHQucmVwb3J0KG5vZGUsICdEbyBub3QgaW1wb3J0IE5vZGUuanMgYnVpbHRpbiBtb2R1bGUgXCInICsgbmFtZSArICdcIicpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1ub2RlanMtbW9kdWxlcycpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgYWxsb3c6IHtcbiAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICB1bmlxdWVJdGVtczogdHJ1ZSxcbiAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnNbMF0gfHwge31cbiAgICBjb25zdCBhbGxvd2VkID0gb3B0aW9ucy5hbGxvdyB8fCBbXVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uOiBmdW5jdGlvbiBoYW5kbGVJbXBvcnRzKG5vZGUpIHtcbiAgICAgICAgcmVwb3J0SWZNaXNzaW5nKGNvbnRleHQsIG5vZGUsIGFsbG93ZWQsIG5vZGUuc291cmNlLnZhbHVlKVxuICAgICAgfSxcbiAgICAgIENhbGxFeHByZXNzaW9uOiBmdW5jdGlvbiBoYW5kbGVSZXF1aXJlcyhub2RlKSB7XG4gICAgICAgIGlmIChpc1N0YXRpY1JlcXVpcmUobm9kZSkpIHtcbiAgICAgICAgICByZXBvcnRJZk1pc3NpbmcoY29udGV4dCwgbm9kZSwgYWxsb3dlZCwgbm9kZS5hcmd1bWVudHNbMF0udmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-relative-parent-imports.js b/node_modules/eslint-plugin-import/lib/rules/no-relative-parent-imports.js
index 8563a90..13695c1 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-relative-parent-imports.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-relative-parent-imports.js
@@ -1,33 +1,18 @@
-'use strict';
-
-var _moduleVisitor = require('eslint-module-utils/moduleVisitor');
-
-var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
+'use strict';var _moduleVisitor = require('eslint-module-utils/moduleVisitor');var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);
 var _path = require('path');
+var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);
 
-var _resolve = require('eslint-module-utils/resolve');
-
-var _resolve2 = _interopRequireDefault(_resolve);
-
-var _importType = require('../core/importType');
-
-var _importType2 = _interopRequireDefault(_importType);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _importType = require('../core/importType');var _importType2 = _interopRequireDefault(_importType);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-relative-parent-imports')
-    },
-    schema: [(0, _moduleVisitor.makeOptionsSchema)()]
-  },
+      url: (0, _docsUrl2.default)('no-relative-parent-imports') },
+
+    schema: [(0, _moduleVisitor.makeOptionsSchema)()] },
+
 
   create: function noRelativePackages(context) {
     const myPath = context.getFilename();
@@ -36,15 +21,13 @@
     function checkSourceValue(sourceNode) {
       const depPath = sourceNode.value;
 
-      if ((0, _importType2.default)(depPath, context) === 'external') {
-        // ignore packages
+      if ((0, _importType2.default)(depPath, context) === 'external') {// ignore packages
         return;
       }
 
       const absDepPath = (0, _resolve2.default)(depPath, context);
 
-      if (!absDepPath) {
-        // unable to resolve path
+      if (!absDepPath) {// unable to resolve path
         return;
       }
 
@@ -53,12 +36,14 @@
       if ((0, _importType2.default)(relDepPath, context) === 'parent') {
         context.report({
           node: sourceNode,
-          message: 'Relative imports from parent directories are not allowed. ' + `Please either pass what you're importing through at runtime ` + `(dependency injection), move \`${(0, _path.basename)(myPath)}\` to same ` + `directory as \`${depPath}\` or consider making \`${depPath}\` a package.`
-        });
+          message: 'Relative imports from parent directories are not allowed. ' +
+          `Please either pass what you're importing through at runtime ` +
+          `(dependency injection), move \`${(0, _path.basename)(myPath)}\` to same ` +
+          `directory as \`${depPath}\` or consider making \`${depPath}\` a package.` });
+
       }
     }
 
     return (0, _moduleVisitor2.default)(checkSourceValue, context.options[0]);
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1yZWxhdGl2ZS1wYXJlbnQtaW1wb3J0cy5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwibm9SZWxhdGl2ZVBhY2thZ2VzIiwiY29udGV4dCIsIm15UGF0aCIsImdldEZpbGVuYW1lIiwiY2hlY2tTb3VyY2VWYWx1ZSIsInNvdXJjZU5vZGUiLCJkZXBQYXRoIiwidmFsdWUiLCJhYnNEZXBQYXRoIiwicmVsRGVwUGF0aCIsInJlcG9ydCIsIm5vZGUiLCJtZXNzYWdlIiwib3B0aW9ucyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFFQTs7Ozs7O0FBRUFBLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFlBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLDRCQUFSO0FBREQsS0FGRjtBQUtKQyxZQUFRLENBQUMsdUNBQUQ7QUFMSixHQURTOztBQVNmQyxVQUFRLFNBQVNDLGtCQUFULENBQTRCQyxPQUE1QixFQUFxQztBQUMzQyxVQUFNQyxTQUFTRCxRQUFRRSxXQUFSLEVBQWY7QUFDQSxRQUFJRCxXQUFXLFFBQWYsRUFBeUIsT0FBTyxFQUFQLENBRmtCLENBRVI7O0FBRW5DLGFBQVNFLGdCQUFULENBQTBCQyxVQUExQixFQUFzQztBQUNwQyxZQUFNQyxVQUFVRCxXQUFXRSxLQUEzQjs7QUFFQSxVQUFJLDBCQUFXRCxPQUFYLEVBQW9CTCxPQUFwQixNQUFpQyxVQUFyQyxFQUFpRDtBQUFFO0FBQ2pEO0FBQ0Q7O0FBRUQsWUFBTU8sYUFBYSx1QkFBUUYsT0FBUixFQUFpQkwsT0FBakIsQ0FBbkI7O0FBRUEsVUFBSSxDQUFDTyxVQUFMLEVBQWlCO0FBQUU7QUFDakI7QUFDRDs7QUFFRCxZQUFNQyxhQUFhLG9CQUFTLG1CQUFRUCxNQUFSLENBQVQsRUFBMEJNLFVBQTFCLENBQW5COztBQUVBLFVBQUksMEJBQVdDLFVBQVgsRUFBdUJSLE9BQXZCLE1BQW9DLFFBQXhDLEVBQWtEO0FBQ2hEQSxnQkFBUVMsTUFBUixDQUFlO0FBQ2JDLGdCQUFNTixVQURPO0FBRWJPLG1CQUFTLCtEQUNOLDhEQURNLEdBRU4sa0NBQWlDLG9CQUFTVixNQUFULENBQWlCLGFBRjVDLEdBR04sa0JBQWlCSSxPQUFRLDJCQUEwQkEsT0FBUTtBQUxqRCxTQUFmO0FBT0Q7QUFDRjs7QUFFRCxXQUFPLDZCQUFjRixnQkFBZCxFQUFnQ0gsUUFBUVksT0FBUixDQUFnQixDQUFoQixDQUFoQyxDQUFQO0FBQ0Q7QUF4Q2MsQ0FBakIiLCJmaWxlIjoibm8tcmVsYXRpdmUtcGFyZW50LWltcG9ydHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9kdWxlVmlzaXRvciwgeyBtYWtlT3B0aW9uc1NjaGVtYSB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvbW9kdWxlVmlzaXRvcidcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgcmVsYXRpdmUgfSBmcm9tICdwYXRoJ1xuaW1wb3J0IHJlc29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJ1xuXG5pbXBvcnQgaW1wb3J0VHlwZSBmcm9tICcuLi9jb3JlL2ltcG9ydFR5cGUnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tcmVsYXRpdmUtcGFyZW50LWltcG9ydHMnKSxcbiAgICB9LFxuICAgIHNjaGVtYTogW21ha2VPcHRpb25zU2NoZW1hKCldLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gbm9SZWxhdGl2ZVBhY2thZ2VzKGNvbnRleHQpIHtcbiAgICBjb25zdCBteVBhdGggPSBjb250ZXh0LmdldEZpbGVuYW1lKClcbiAgICBpZiAobXlQYXRoID09PSAnPHRleHQ+JykgcmV0dXJuIHt9IC8vIGNhbid0IGNoZWNrIGEgbm9uLWZpbGVcblxuICAgIGZ1bmN0aW9uIGNoZWNrU291cmNlVmFsdWUoc291cmNlTm9kZSkge1xuICAgICAgY29uc3QgZGVwUGF0aCA9IHNvdXJjZU5vZGUudmFsdWVcblxuICAgICAgaWYgKGltcG9ydFR5cGUoZGVwUGF0aCwgY29udGV4dCkgPT09ICdleHRlcm5hbCcpIHsgLy8gaWdub3JlIHBhY2thZ2VzXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBhYnNEZXBQYXRoID0gcmVzb2x2ZShkZXBQYXRoLCBjb250ZXh0KVxuXG4gICAgICBpZiAoIWFic0RlcFBhdGgpIHsgLy8gdW5hYmxlIHRvIHJlc29sdmUgcGF0aFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsRGVwUGF0aCA9IHJlbGF0aXZlKGRpcm5hbWUobXlQYXRoKSwgYWJzRGVwUGF0aClcblxuICAgICAgaWYgKGltcG9ydFR5cGUocmVsRGVwUGF0aCwgY29udGV4dCkgPT09ICdwYXJlbnQnKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICBub2RlOiBzb3VyY2VOb2RlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdSZWxhdGl2ZSBpbXBvcnRzIGZyb20gcGFyZW50IGRpcmVjdG9yaWVzIGFyZSBub3QgYWxsb3dlZC4gJyArXG4gICAgICAgICAgICBgUGxlYXNlIGVpdGhlciBwYXNzIHdoYXQgeW91J3JlIGltcG9ydGluZyB0aHJvdWdoIGF0IHJ1bnRpbWUgYCArXG4gICAgICAgICAgICBgKGRlcGVuZGVuY3kgaW5qZWN0aW9uKSwgbW92ZSBcXGAke2Jhc2VuYW1lKG15UGF0aCl9XFxgIHRvIHNhbWUgYCArXG4gICAgICAgICAgICBgZGlyZWN0b3J5IGFzIFxcYCR7ZGVwUGF0aH1cXGAgb3IgY29uc2lkZXIgbWFraW5nIFxcYCR7ZGVwUGF0aH1cXGAgYSBwYWNrYWdlLmAsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZVZpc2l0b3IoY2hlY2tTb3VyY2VWYWx1ZSwgY29udGV4dC5vcHRpb25zWzBdKVxuICB9LFxufVxuIl19
\ No newline at end of file
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1yZWxhdGl2ZS1wYXJlbnQtaW1wb3J0cy5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwibm9SZWxhdGl2ZVBhY2thZ2VzIiwiY29udGV4dCIsIm15UGF0aCIsImdldEZpbGVuYW1lIiwiY2hlY2tTb3VyY2VWYWx1ZSIsInNvdXJjZU5vZGUiLCJkZXBQYXRoIiwidmFsdWUiLCJhYnNEZXBQYXRoIiwicmVsRGVwUGF0aCIsInJlcG9ydCIsIm5vZGUiLCJtZXNzYWdlIiwib3B0aW9ucyJdLCJtYXBwaW5ncyI6ImFBQUEsa0U7QUFDQSxxQztBQUNBO0FBQ0Esc0Q7O0FBRUEsZ0Q7O0FBRUFBLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFlBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLDRCQUFSLENBREQsRUFGRjs7QUFLSkMsWUFBUSxDQUFDLHVDQUFELENBTEosRUFEUzs7O0FBU2ZDLFVBQVEsU0FBU0Msa0JBQVQsQ0FBNEJDLE9BQTVCLEVBQXFDO0FBQzNDLFVBQU1DLFNBQVNELFFBQVFFLFdBQVIsRUFBZjtBQUNBLFFBQUlELFdBQVcsUUFBZixFQUF5QixPQUFPLEVBQVAsQ0FGa0IsQ0FFUjs7QUFFbkMsYUFBU0UsZ0JBQVQsQ0FBMEJDLFVBQTFCLEVBQXNDO0FBQ3BDLFlBQU1DLFVBQVVELFdBQVdFLEtBQTNCOztBQUVBLFVBQUksMEJBQVdELE9BQVgsRUFBb0JMLE9BQXBCLE1BQWlDLFVBQXJDLEVBQWlELENBQUU7QUFDakQ7QUFDRDs7QUFFRCxZQUFNTyxhQUFhLHVCQUFRRixPQUFSLEVBQWlCTCxPQUFqQixDQUFuQjs7QUFFQSxVQUFJLENBQUNPLFVBQUwsRUFBaUIsQ0FBRTtBQUNqQjtBQUNEOztBQUVELFlBQU1DLGFBQWEsb0JBQVMsbUJBQVFQLE1BQVIsQ0FBVCxFQUEwQk0sVUFBMUIsQ0FBbkI7O0FBRUEsVUFBSSwwQkFBV0MsVUFBWCxFQUF1QlIsT0FBdkIsTUFBb0MsUUFBeEMsRUFBa0Q7QUFDaERBLGdCQUFRUyxNQUFSLENBQWU7QUFDYkMsZ0JBQU1OLFVBRE87QUFFYk8sbUJBQVM7QUFDTix3RUFETTtBQUVOLDRDQUFpQyxvQkFBU1YsTUFBVCxDQUFpQixhQUY1QztBQUdOLDRCQUFpQkksT0FBUSwyQkFBMEJBLE9BQVEsZUFMakQsRUFBZjs7QUFPRDtBQUNGOztBQUVELFdBQU8sNkJBQWNGLGdCQUFkLEVBQWdDSCxRQUFRWSxPQUFSLENBQWdCLENBQWhCLENBQWhDLENBQVA7QUFDRCxHQXhDYyxFQUFqQiIsImZpbGUiOiJuby1yZWxhdGl2ZS1wYXJlbnQtaW1wb3J0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb2R1bGVWaXNpdG9yLCB7IG1ha2VPcHRpb25zU2NoZW1hIH0gZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9tb2R1bGVWaXNpdG9yJ1xuaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCByZWxhdGl2ZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgcmVzb2x2ZSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL3Jlc29sdmUnXG5cbmltcG9ydCBpbXBvcnRUeXBlIGZyb20gJy4uL2NvcmUvaW1wb3J0VHlwZSdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1yZWxhdGl2ZS1wYXJlbnQtaW1wb3J0cycpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbbWFrZU9wdGlvbnNTY2hlbWEoKV0sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiBub1JlbGF0aXZlUGFja2FnZXMoY29udGV4dCkge1xuICAgIGNvbnN0IG15UGF0aCA9IGNvbnRleHQuZ2V0RmlsZW5hbWUoKVxuICAgIGlmIChteVBhdGggPT09ICc8dGV4dD4nKSByZXR1cm4ge30gLy8gY2FuJ3QgY2hlY2sgYSBub24tZmlsZVxuXG4gICAgZnVuY3Rpb24gY2hlY2tTb3VyY2VWYWx1ZShzb3VyY2VOb2RlKSB7XG4gICAgICBjb25zdCBkZXBQYXRoID0gc291cmNlTm9kZS52YWx1ZVxuXG4gICAgICBpZiAoaW1wb3J0VHlwZShkZXBQYXRoLCBjb250ZXh0KSA9PT0gJ2V4dGVybmFsJykgeyAvLyBpZ25vcmUgcGFja2FnZXNcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFic0RlcFBhdGggPSByZXNvbHZlKGRlcFBhdGgsIGNvbnRleHQpXG5cbiAgICAgIGlmICghYWJzRGVwUGF0aCkgeyAvLyB1bmFibGUgdG8gcmVzb2x2ZSBwYXRoXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxEZXBQYXRoID0gcmVsYXRpdmUoZGlybmFtZShteVBhdGgpLCBhYnNEZXBQYXRoKVxuXG4gICAgICBpZiAoaW1wb3J0VHlwZShyZWxEZXBQYXRoLCBjb250ZXh0KSA9PT0gJ3BhcmVudCcpIHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgIG5vZGU6IHNvdXJjZU5vZGUsXG4gICAgICAgICAgbWVzc2FnZTogJ1JlbGF0aXZlIGltcG9ydHMgZnJvbSBwYXJlbnQgZGlyZWN0b3JpZXMgYXJlIG5vdCBhbGxvd2VkLiAnICtcbiAgICAgICAgICAgIGBQbGVhc2UgZWl0aGVyIHBhc3Mgd2hhdCB5b3UncmUgaW1wb3J0aW5nIHRocm91Z2ggYXQgcnVudGltZSBgICtcbiAgICAgICAgICAgIGAoZGVwZW5kZW5jeSBpbmplY3Rpb24pLCBtb3ZlIFxcYCR7YmFzZW5hbWUobXlQYXRoKX1cXGAgdG8gc2FtZSBgICtcbiAgICAgICAgICAgIGBkaXJlY3RvcnkgYXMgXFxgJHtkZXBQYXRofVxcYCBvciBjb25zaWRlciBtYWtpbmcgXFxgJHtkZXBQYXRofVxcYCBhIHBhY2thZ2UuYCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbW9kdWxlVmlzaXRvcihjaGVja1NvdXJjZVZhbHVlLCBjb250ZXh0Lm9wdGlvbnNbMF0pXG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-restricted-paths.js b/node_modules/eslint-plugin-import/lib/rules/no-restricted-paths.js
index 4e836e5..d318e40 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-restricted-paths.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-restricted-paths.js
@@ -1,41 +1,20 @@
-'use strict';
+'use strict';var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();var _containsPath = require('contains-path');var _containsPath2 = _interopRequireDefault(_containsPath);
+var _path = require('path');var _path2 = _interopRequireDefault(_path);
 
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
-var _containsPath = require('contains-path');
-
-var _containsPath2 = _interopRequireDefault(_containsPath);
-
-var _path = require('path');
-
-var _path2 = _interopRequireDefault(_path);
-
-var _resolve = require('eslint-module-utils/resolve');
-
-var _resolve2 = _interopRequireDefault(_resolve);
-
-var _staticRequire = require('../core/staticRequire');
-
-var _staticRequire2 = _interopRequireDefault(_staticRequire);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-var _importType = require('../core/importType');
-
-var _importType2 = _interopRequireDefault(_importType);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);
+var _staticRequire = require('../core/staticRequire');var _staticRequire2 = _interopRequireDefault(_staticRequire);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);
+var _importType = require('../core/importType');var _importType2 = _interopRequireDefault(_importType);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'problem',
     docs: {
-      url: (0, _docsUrl2.default)('no-restricted-paths')
-    },
+      url: (0, _docsUrl2.default)('no-restricted-paths') },
 
-    schema: [{
+
+    schema: [
+    {
       type: 'object',
       properties: {
         zones: {
@@ -49,19 +28,21 @@
               except: {
                 type: 'array',
                 items: {
-                  type: 'string'
-                },
-                uniqueItems: true
-              }
-            },
-            additionalProperties: false
-          }
-        },
-        basePath: { type: 'string' }
-      },
-      additionalProperties: false
-    }]
-  },
+                  type: 'string' },
+
+                uniqueItems: true },
+
+              message: { type: 'string' } },
+
+            additionalProperties: false } },
+
+
+        basePath: { type: 'string' } },
+
+      additionalProperties: false }] },
+
+
+
 
   create: function noRestrictedPaths(context) {
     const options = context.options[0] || {};
@@ -83,8 +64,8 @@
     function reportInvalidExceptionPath(node) {
       context.report({
         node,
-        message: 'Restricted path exceptions must be descendants of the configured `from` path for that zone.'
-      });
+        message: 'Restricted path exceptions must be descendants of the configured `from` path for that zone.' });
+
     }
 
     function checkForRestrictedImportPath(importPath, node) {
@@ -102,15 +83,19 @@
           return;
         }
 
-        const absoluteExceptionPaths = exceptionPaths.map(exceptionPath => _path2.default.resolve(absoluteFrom, exceptionPath));
-        const hasValidExceptionPaths = absoluteExceptionPaths.every(absoluteExceptionPath => isValidExceptionPath(absoluteFrom, absoluteExceptionPath));
+        const absoluteExceptionPaths = exceptionPaths.map(exceptionPath =>
+        _path2.default.resolve(absoluteFrom, exceptionPath));
+
+        const hasValidExceptionPaths = absoluteExceptionPaths.
+        every(absoluteExceptionPath => isValidExceptionPath(absoluteFrom, absoluteExceptionPath));
 
         if (!hasValidExceptionPaths) {
           reportInvalidExceptionPath(node);
           return;
         }
 
-        const pathIsExcepted = absoluteExceptionPaths.some(absoluteExceptionPath => (0, _containsPath2.default)(absoluteImportPath, absoluteExceptionPath));
+        const pathIsExcepted = absoluteExceptionPaths.
+        some(absoluteExceptionPath => (0, _containsPath2.default)(absoluteImportPath, absoluteExceptionPath));
 
         if (pathIsExcepted) {
           return;
@@ -118,9 +103,9 @@
 
         context.report({
           node,
-          message: `Unexpected path "{{importPath}}" imported in restricted zone.`,
-          data: { importPath }
-        });
+          message: `Unexpected path "{{importPath}}" imported in restricted zone.${zone.message ? ` ${zone.message}` : ''}`,
+          data: { importPath } });
+
       });
     }
 
@@ -129,16 +114,12 @@
         checkForRestrictedImportPath(node.source.value, node.source);
       },
       CallExpression(node) {
-        if ((0, _staticRequire2.default)(node)) {
-          var _node$arguments = _slicedToArray(node.arguments, 1);
-
-          const firstArgument = _node$arguments[0];
-
+        if ((0, _staticRequire2.default)(node)) {var _node$arguments = _slicedToArray(
+          node.arguments, 1);const firstArgument = _node$arguments[0];
 
           checkForRestrictedImportPath(firstArgument.value, firstArgument);
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1yZXN0cmljdGVkLXBhdGhzLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiem9uZXMiLCJtaW5JdGVtcyIsIml0ZW1zIiwidGFyZ2V0IiwiZnJvbSIsImV4Y2VwdCIsInVuaXF1ZUl0ZW1zIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJiYXNlUGF0aCIsImNyZWF0ZSIsIm5vUmVzdHJpY3RlZFBhdGhzIiwiY29udGV4dCIsIm9wdGlvbnMiLCJyZXN0cmljdGVkUGF0aHMiLCJwcm9jZXNzIiwiY3dkIiwiY3VycmVudEZpbGVuYW1lIiwiZ2V0RmlsZW5hbWUiLCJtYXRjaGluZ1pvbmVzIiwiZmlsdGVyIiwiem9uZSIsInRhcmdldFBhdGgiLCJwYXRoIiwicmVzb2x2ZSIsImlzVmFsaWRFeGNlcHRpb25QYXRoIiwiYWJzb2x1dGVGcm9tUGF0aCIsImFic29sdXRlRXhjZXB0aW9uUGF0aCIsInJlbGF0aXZlRXhjZXB0aW9uUGF0aCIsInJlbGF0aXZlIiwicmVwb3J0SW52YWxpZEV4Y2VwdGlvblBhdGgiLCJub2RlIiwicmVwb3J0IiwibWVzc2FnZSIsImNoZWNrRm9yUmVzdHJpY3RlZEltcG9ydFBhdGgiLCJpbXBvcnRQYXRoIiwiYWJzb2x1dGVJbXBvcnRQYXRoIiwiZm9yRWFjaCIsImV4Y2VwdGlvblBhdGhzIiwiYWJzb2x1dGVGcm9tIiwiYWJzb2x1dGVFeGNlcHRpb25QYXRocyIsIm1hcCIsImV4Y2VwdGlvblBhdGgiLCJoYXNWYWxpZEV4Y2VwdGlvblBhdGhzIiwiZXZlcnkiLCJwYXRoSXNFeGNlcHRlZCIsInNvbWUiLCJkYXRhIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJzb3VyY2UiLCJ2YWx1ZSIsIkNhbGxFeHByZXNzaW9uIiwiYXJndW1lbnRzIiwiZmlyc3RBcmd1bWVudCJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7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O0FBQ0E7QUFDRDs7QUFFRCxjQUFNYyxpQkFBaUJMLHVCQUNwQk0sSUFEb0IsQ0FDZG5CLHFCQUFELElBQTJCLDRCQUFhUyxrQkFBYixFQUFpQ1QscUJBQWpDLENBRFosQ0FBdkI7O0FBR0EsWUFBSWtCLGNBQUosRUFBb0I7QUFDbEI7QUFDRDs7QUFFRGpDLGdCQUFRb0IsTUFBUixDQUFlO0FBQ2JELGNBRGE7QUFFYkUsbUJBQVUsK0RBRkc7QUFHYmMsZ0JBQU0sRUFBRVosVUFBRjtBQUhPLFNBQWY7QUFLRCxPQS9CRDtBQWdDSDs7QUFFRCxXQUFPO0FBQ0xhLHdCQUFrQmpCLElBQWxCLEVBQXdCO0FBQ3RCRyxxQ0FBNkJILEtBQUtrQixNQUFMLENBQVlDLEtBQXpDLEVBQWdEbkIsS0FBS2tCLE1BQXJEO0FBQ0QsT0FISTtBQUlMRSxxQkFBZXBCLElBQWYsRUFBcUI7QUFDbkIsWUFBSSw2QkFBZ0JBLElBQWhCLENBQUosRUFBMkI7QUFBQSwrQ0FDQ0EsS0FBS3FCLFNBRE47O0FBQUEsZ0JBQ2pCQyxhQURpQjs7O0FBR3pCbkIsdUNBQTZCbUIsY0FBY0gsS0FBM0MsRUFBa0RHLGFBQWxEO0FBQ0Q7QUFDRjtBQVZJLEtBQVA7QUFZRDtBQWxIYyxDQUFqQiIsImZpbGUiOiJuby1yZXN0cmljdGVkLXBhdGhzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbnRhaW5zUGF0aCBmcm9tICdjb250YWlucy1wYXRoJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcblxuaW1wb3J0IHJlc29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJ1xuaW1wb3J0IGlzU3RhdGljUmVxdWlyZSBmcm9tICcuLi9jb3JlL3N0YXRpY1JlcXVpcmUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuaW1wb3J0IGltcG9ydFR5cGUgZnJvbSAnLi4vY29yZS9pbXBvcnRUeXBlJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLXJlc3RyaWN0ZWQtcGF0aHMnKSxcbiAgICB9LFxuXG4gICAgc2NoZW1hOiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgem9uZXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICBtaW5JdGVtczogMSxcbiAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICAgICAgZnJvbTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgICAgIGV4Y2VwdDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiYXNlUGF0aDogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB9LFxuICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiBub1Jlc3RyaWN0ZWRQYXRocyhjb250ZXh0KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9uc1swXSB8fCB7fVxuICAgIGNvbnN0IHJlc3RyaWN0ZWRQYXRocyA9IG9wdGlvbnMuem9uZXMgfHwgW11cbiAgICBjb25zdCBiYXNlUGF0aCA9IG9wdGlvbnMuYmFzZVBhdGggfHwgcHJvY2Vzcy5jd2QoKVxuICAgIGNvbnN0IGN1cnJlbnRGaWxlbmFtZSA9IGNvbnRleHQuZ2V0RmlsZW5hbWUoKVxuICAgIGNvbnN0IG1hdGNoaW5nWm9uZXMgPSByZXN0cmljdGVkUGF0aHMuZmlsdGVyKCh6b25lKSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VQYXRoLCB6b25lLnRhcmdldClcblxuICAgICAgcmV0dXJuIGNvbnRhaW5zUGF0aChjdXJyZW50RmlsZW5hbWUsIHRhcmdldFBhdGgpXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIGlzVmFsaWRFeGNlcHRpb25QYXRoKGFic29sdXRlRnJvbVBhdGgsIGFic29sdXRlRXhjZXB0aW9uUGF0aCkge1xuICAgICAgY29uc3QgcmVsYXRpdmVFeGNlcHRpb25QYXRoID0gcGF0aC5yZWxhdGl2ZShhYnNvbHV0ZUZyb21QYXRoLCBhYnNvbHV0ZUV4Y2VwdGlvblBhdGgpXG5cbiAgICAgIHJldHVybiBpbXBvcnRUeXBlKHJlbGF0aXZlRXhjZXB0aW9uUGF0aCwgY29udGV4dCkgIT09ICdwYXJlbnQnXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVwb3J0SW52YWxpZEV4Y2VwdGlvblBhdGgobm9kZSkge1xuICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICBub2RlLFxuICAgICAgICBtZXNzYWdlOiAnUmVzdHJpY3RlZCBwYXRoIGV4Y2VwdGlvbnMgbXVzdCBiZSBkZXNjZW5kYW50cyBvZiB0aGUgY29uZmlndXJlZCBgZnJvbWAgcGF0aCBmb3IgdGhhdCB6b25lLicsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrRm9yUmVzdHJpY3RlZEltcG9ydFBhdGgoaW1wb3J0UGF0aCwgbm9kZSkge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZUltcG9ydFBhdGggPSByZXNvbHZlKGltcG9ydFBhdGgsIGNvbnRleHQpXG5cbiAgICAgICAgaWYgKCFhYnNvbHV0ZUltcG9ydFBhdGgpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIG1hdGNoaW5nWm9uZXMuZm9yRWFjaCgoem9uZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvblBhdGhzID0gem9uZS5leGNlcHQgfHwgW11cbiAgICAgICAgICBjb25zdCBhYnNvbHV0ZUZyb20gPSBwYXRoLnJlc29sdmUoYmFzZVBhdGgsIHpvbmUuZnJvbSlcblxuICAgICAgICAgIGlmICghY29udGFpbnNQYXRoKGFic29sdXRlSW1wb3J0UGF0aCwgYWJzb2x1dGVGcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYWJzb2x1dGVFeGNlcHRpb25QYXRocyA9IGV4Y2VwdGlvblBhdGhzLm1hcCgoZXhjZXB0aW9uUGF0aCkgPT5cbiAgICAgICAgICAgIHBhdGgucmVzb2x2ZShhYnNvbHV0ZUZyb20sIGV4Y2VwdGlvblBhdGgpXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnN0IGhhc1ZhbGlkRXhjZXB0aW9uUGF0aHMgPSBhYnNvbHV0ZUV4Y2VwdGlvblBhdGhzXG4gICAgICAgICAgICAuZXZlcnkoKGFic29sdXRlRXhjZXB0aW9uUGF0aCkgPT4gaXNWYWxpZEV4Y2VwdGlvblBhdGgoYWJzb2x1dGVGcm9tLCBhYnNvbHV0ZUV4Y2VwdGlvblBhdGgpKVxuXG4gICAgICAgICAgaWYgKCFoYXNWYWxpZEV4Y2VwdGlvblBhdGhzKSB7XG4gICAgICAgICAgICByZXBvcnRJbnZhbGlkRXhjZXB0aW9uUGF0aChub2RlKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcGF0aElzRXhjZXB0ZWQgPSBhYnNvbHV0ZUV4Y2VwdGlvblBhdGhzXG4gICAgICAgICAgICAuc29tZSgoYWJzb2x1dGVFeGNlcHRpb25QYXRoKSA9PiBjb250YWluc1BhdGgoYWJzb2x1dGVJbXBvcnRQYXRoLCBhYnNvbHV0ZUV4Y2VwdGlvblBhdGgpKVxuXG4gICAgICAgICAgaWYgKHBhdGhJc0V4Y2VwdGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogYFVuZXhwZWN0ZWQgcGF0aCBcInt7aW1wb3J0UGF0aH19XCIgaW1wb3J0ZWQgaW4gcmVzdHJpY3RlZCB6b25lLmAsXG4gICAgICAgICAgICBkYXRhOiB7IGltcG9ydFBhdGggfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBJbXBvcnREZWNsYXJhdGlvbihub2RlKSB7XG4gICAgICAgIGNoZWNrRm9yUmVzdHJpY3RlZEltcG9ydFBhdGgobm9kZS5zb3VyY2UudmFsdWUsIG5vZGUuc291cmNlKVxuICAgICAgfSxcbiAgICAgIENhbGxFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKGlzU3RhdGljUmVxdWlyZShub2RlKSkge1xuICAgICAgICAgIGNvbnN0IFsgZmlyc3RBcmd1bWVudCBdID0gbm9kZS5hcmd1bWVudHNcblxuICAgICAgICAgIGNoZWNrRm9yUmVzdHJpY3RlZEltcG9ydFBhdGgoZmlyc3RBcmd1bWVudC52YWx1ZSwgZmlyc3RBcmd1bWVudClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1yZXN0cmljdGVkLXBhdGhzLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiem9uZXMiLCJtaW5JdGVtcyIsIml0ZW1zIiwidGFyZ2V0IiwiZnJvbSIsImV4Y2VwdCIsInVuaXF1ZUl0ZW1zIiwibWVzc2FnZSIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiYmFzZVBhdGgiLCJjcmVhdGUiLCJub1Jlc3RyaWN0ZWRQYXRocyIsImNvbnRleHQiLCJvcHRpb25zIiwicmVzdHJpY3RlZFBhdGhzIiwicHJvY2VzcyIsImN3ZCIsImN1cnJlbnRGaWxlbmFtZSIsImdldEZpbGVuYW1lIiwibWF0Y2hpbmdab25lcyIsImZpbHRlciIsInpvbmUiLCJ0YXJnZXRQYXRoIiwicGF0aCIsInJlc29sdmUiLCJpc1ZhbGlkRXhjZXB0aW9uUGF0aCIsImFic29sdXRlRnJvbVBhdGgiLCJhYnNvbHV0ZUV4Y2VwdGlvblBhdGgiLCJyZWxhdGl2ZUV4Y2VwdGlvblBhdGgiLCJyZWxhdGl2ZSIsInJlcG9ydEludmFsaWRFeGNlcHRpb25QYXRoIiwibm9kZSIsInJlcG9ydCIsImNoZWNrRm9yUmVzdHJpY3RlZEltcG9ydFBhdGgiLCJpbXBvcnRQYXRoIiwiYWJzb2x1dGVJbXBvcnRQYXRoIiwiZm9yRWFjaCIsImV4Y2VwdGlvblBhdGhzIiwiYWJzb2x1dGVGcm9tIiwiYWJzb2x1dGVFeGNlcHRpb25QYXRocyIsIm1hcCIsImV4Y2VwdGlvblBhdGgiLCJoYXNWYWxpZEV4Y2VwdGlvblBhdGhzIiwiZXZlcnkiLCJwYXRoSXNFeGNlcHRlZCIsInNvbWUiLCJkYXRhIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJzb3VyY2UiLCJ2YWx1ZSIsIkNhbGxFeHByZXNzaW9uIiwiYXJndW1lbnRzIiwiZmlyc3RBcmd1bWVudCJdLCJtYXBwaW5ncyI6InFvQkFBQSw2QztB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WUFBSSxDQUFDZSxzQkFBTCxFQUE2QjtBQUMzQloscUNBQTJCQyxJQUEzQjtBQUNBO0FBQ0Q7O0FBRUQsY0FBTWEsaUJBQWlCTDtBQUNwQk0sWUFEb0IsQ0FDZGxCLHFCQUFELElBQTJCLDRCQUFhUSxrQkFBYixFQUFpQ1IscUJBQWpDLENBRFosQ0FBdkI7O0FBR0EsWUFBSWlCLGNBQUosRUFBb0I7QUFDbEI7QUFDRDs7QUFFRGhDLGdCQUFRb0IsTUFBUixDQUFlO0FBQ2JELGNBRGE7QUFFYnhCLG1CQUFVLGdFQUErRGMsS0FBS2QsT0FBTCxHQUFnQixJQUFHYyxLQUFLZCxPQUFRLEVBQWhDLEdBQW9DLEVBQUcsRUFGbkc7QUFHYnVDLGdCQUFNLEVBQUVaLFVBQUYsRUFITyxFQUFmOztBQUtELE9BL0JEO0FBZ0NIOztBQUVELFdBQU87QUFDTGEsd0JBQWtCaEIsSUFBbEIsRUFBd0I7QUFDdEJFLHFDQUE2QkYsS0FBS2lCLE1BQUwsQ0FBWUMsS0FBekMsRUFBZ0RsQixLQUFLaUIsTUFBckQ7QUFDRCxPQUhJO0FBSUxFLHFCQUFlbkIsSUFBZixFQUFxQjtBQUNuQixZQUFJLDZCQUFnQkEsSUFBaEIsQ0FBSixFQUEyQjtBQUNDQSxlQUFLb0IsU0FETixXQUNqQkMsYUFEaUI7O0FBR3pCbkIsdUNBQTZCbUIsY0FBY0gsS0FBM0MsRUFBa0RHLGFBQWxEO0FBQ0Q7QUFDRixPQVZJLEVBQVA7O0FBWUQsR0FuSGMsRUFBakIiLCJmaWxlIjoibm8tcmVzdHJpY3RlZC1wYXRocy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjb250YWluc1BhdGggZnJvbSAnY29udGFpbnMtcGF0aCdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5cbmltcG9ydCByZXNvbHZlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVzb2x2ZSdcbmltcG9ydCBpc1N0YXRpY1JlcXVpcmUgZnJvbSAnLi4vY29yZS9zdGF0aWNSZXF1aXJlJ1xuaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcbmltcG9ydCBpbXBvcnRUeXBlIGZyb20gJy4uL2NvcmUvaW1wb3J0VHlwZSdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAncHJvYmxlbScsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby1yZXN0cmljdGVkLXBhdGhzJyksXG4gICAgfSxcblxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIHpvbmVzOiB7XG4gICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgbWluSXRlbXM6IDEsXG4gICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIHRhcmdldDogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgICAgIGZyb206IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgICAgICBleGNlcHQ6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB1bmlxdWVJdGVtczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJhc2VQYXRoOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIG5vUmVzdHJpY3RlZFBhdGhzKGNvbnRleHQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHt9XG4gICAgY29uc3QgcmVzdHJpY3RlZFBhdGhzID0gb3B0aW9ucy56b25lcyB8fCBbXVxuICAgIGNvbnN0IGJhc2VQYXRoID0gb3B0aW9ucy5iYXNlUGF0aCB8fCBwcm9jZXNzLmN3ZCgpXG4gICAgY29uc3QgY3VycmVudEZpbGVuYW1lID0gY29udGV4dC5nZXRGaWxlbmFtZSgpXG4gICAgY29uc3QgbWF0Y2hpbmdab25lcyA9IHJlc3RyaWN0ZWRQYXRocy5maWx0ZXIoKHpvbmUpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLnJlc29sdmUoYmFzZVBhdGgsIHpvbmUudGFyZ2V0KVxuXG4gICAgICByZXR1cm4gY29udGFpbnNQYXRoKGN1cnJlbnRGaWxlbmFtZSwgdGFyZ2V0UGF0aClcbiAgICB9KVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZEV4Y2VwdGlvblBhdGgoYWJzb2x1dGVGcm9tUGF0aCwgYWJzb2x1dGVFeGNlcHRpb25QYXRoKSB7XG4gICAgICBjb25zdCByZWxhdGl2ZUV4Y2VwdGlvblBhdGggPSBwYXRoLnJlbGF0aXZlKGFic29sdXRlRnJvbVBhdGgsIGFic29sdXRlRXhjZXB0aW9uUGF0aClcblxuICAgICAgcmV0dXJuIGltcG9ydFR5cGUocmVsYXRpdmVFeGNlcHRpb25QYXRoLCBjb250ZXh0KSAhPT0gJ3BhcmVudCdcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXBvcnRJbnZhbGlkRXhjZXB0aW9uUGF0aChub2RlKSB7XG4gICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIG1lc3NhZ2U6ICdSZXN0cmljdGVkIHBhdGggZXhjZXB0aW9ucyBtdXN0IGJlIGRlc2NlbmRhbnRzIG9mIHRoZSBjb25maWd1cmVkIGBmcm9tYCBwYXRoIGZvciB0aGF0IHpvbmUuJyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tGb3JSZXN0cmljdGVkSW1wb3J0UGF0aChpbXBvcnRQYXRoLCBub2RlKSB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlSW1wb3J0UGF0aCA9IHJlc29sdmUoaW1wb3J0UGF0aCwgY29udGV4dClcblxuICAgICAgICBpZiAoIWFic29sdXRlSW1wb3J0UGF0aCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgbWF0Y2hpbmdab25lcy5mb3JFYWNoKCh6b25lKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhjZXB0aW9uUGF0aHMgPSB6b25lLmV4Y2VwdCB8fCBbXVxuICAgICAgICAgIGNvbnN0IGFic29sdXRlRnJvbSA9IHBhdGgucmVzb2x2ZShiYXNlUGF0aCwgem9uZS5mcm9tKVxuXG4gICAgICAgICAgaWYgKCFjb250YWluc1BhdGgoYWJzb2x1dGVJbXBvcnRQYXRoLCBhYnNvbHV0ZUZyb20pKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhYnNvbHV0ZUV4Y2VwdGlvblBhdGhzID0gZXhjZXB0aW9uUGF0aHMubWFwKChleGNlcHRpb25QYXRoKSA9PlxuICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGFic29sdXRlRnJvbSwgZXhjZXB0aW9uUGF0aClcbiAgICAgICAgICApXG4gICAgICAgICAgY29uc3QgaGFzVmFsaWRFeGNlcHRpb25QYXRocyA9IGFic29sdXRlRXhjZXB0aW9uUGF0aHNcbiAgICAgICAgICAgIC5ldmVyeSgoYWJzb2x1dGVFeGNlcHRpb25QYXRoKSA9PiBpc1ZhbGlkRXhjZXB0aW9uUGF0aChhYnNvbHV0ZUZyb20sIGFic29sdXRlRXhjZXB0aW9uUGF0aCkpXG5cbiAgICAgICAgICBpZiAoIWhhc1ZhbGlkRXhjZXB0aW9uUGF0aHMpIHtcbiAgICAgICAgICAgIHJlcG9ydEludmFsaWRFeGNlcHRpb25QYXRoKG5vZGUpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBwYXRoSXNFeGNlcHRlZCA9IGFic29sdXRlRXhjZXB0aW9uUGF0aHNcbiAgICAgICAgICAgIC5zb21lKChhYnNvbHV0ZUV4Y2VwdGlvblBhdGgpID0+IGNvbnRhaW5zUGF0aChhYnNvbHV0ZUltcG9ydFBhdGgsIGFic29sdXRlRXhjZXB0aW9uUGF0aCkpXG5cbiAgICAgICAgICBpZiAocGF0aElzRXhjZXB0ZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlOiBgVW5leHBlY3RlZCBwYXRoIFwie3tpbXBvcnRQYXRofX1cIiBpbXBvcnRlZCBpbiByZXN0cmljdGVkIHpvbmUuJHt6b25lLm1lc3NhZ2UgPyBgICR7em9uZS5tZXNzYWdlfWAgOiAnJ31gLFxuICAgICAgICAgICAgZGF0YTogeyBpbXBvcnRQYXRoIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgSW1wb3J0RGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgICBjaGVja0ZvclJlc3RyaWN0ZWRJbXBvcnRQYXRoKG5vZGUuc291cmNlLnZhbHVlLCBub2RlLnNvdXJjZSlcbiAgICAgIH0sXG4gICAgICBDYWxsRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICAgIGlmIChpc1N0YXRpY1JlcXVpcmUobm9kZSkpIHtcbiAgICAgICAgICBjb25zdCBbIGZpcnN0QXJndW1lbnQgXSA9IG5vZGUuYXJndW1lbnRzXG5cbiAgICAgICAgICBjaGVja0ZvclJlc3RyaWN0ZWRJbXBvcnRQYXRoKGZpcnN0QXJndW1lbnQudmFsdWUsIGZpcnN0QXJndW1lbnQpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-self-import.js b/node_modules/eslint-plugin-import/lib/rules/no-self-import.js
index 068833a..5095163 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-self-import.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-self-import.js
@@ -1,18 +1,11 @@
 'use strict';
 
-var _resolve = require('eslint-module-utils/resolve');
 
-var _resolve2 = _interopRequireDefault(_resolve);
 
-var _staticRequire = require('../core/staticRequire');
 
-var _staticRequire2 = _interopRequireDefault(_staticRequire);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);
+var _staticRequire = require('../core/staticRequire');var _staticRequire2 = _interopRequireDefault(_staticRequire);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 function isImportingSelf(context, node, requireName) {
   const filePath = context.getFilename();
@@ -21,25 +14,22 @@
   if (filePath !== '<text>' && filePath === (0, _resolve2.default)(requireName, context)) {
     context.report({
       node,
-      message: 'Module imports itself.'
-    });
+      message: 'Module imports itself.' });
+
   }
 } /**
    * @fileOverview Forbids a module from importing itself
    * @author Gio d'Amelio
-   */
-
-module.exports = {
-  meta: {
+   */module.exports = { meta: {
     type: 'problem',
     docs: {
       description: 'Forbid a module from importing itself',
       recommended: true,
-      url: (0, _docsUrl2.default)('no-self-import')
-    },
+      url: (0, _docsUrl2.default)('no-self-import') },
 
-    schema: []
-  },
+
+    schema: [] },
+
   create: function (context) {
     return {
       ImportDeclaration(node) {
@@ -49,8 +39,7 @@
         if ((0, _staticRequire2.default)(node)) {
           isImportingSelf(context, node, node.arguments[0].value);
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1zZWxmLWltcG9ydC5qcyJdLCJuYW1lcyI6WyJpc0ltcG9ydGluZ1NlbGYiLCJjb250ZXh0Iiwibm9kZSIsInJlcXVpcmVOYW1lIiwiZmlsZVBhdGgiLCJnZXRGaWxlbmFtZSIsInJlcG9ydCIsIm1lc3NhZ2UiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwiZGVzY3JpcHRpb24iLCJyZWNvbW1lbmRlZCIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsIkltcG9ydERlY2xhcmF0aW9uIiwic291cmNlIiwidmFsdWUiLCJDYWxsRXhwcmVzc2lvbiIsImFyZ3VtZW50cyJdLCJtYXBwaW5ncyI6Ijs7QUFLQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUVBLFNBQVNBLGVBQVQsQ0FBeUJDLE9BQXpCLEVBQWtDQyxJQUFsQyxFQUF3Q0MsV0FBeEMsRUFBcUQ7QUFDbkQsUUFBTUMsV0FBV0gsUUFBUUksV0FBUixFQUFqQjs7QUFFQTtBQUNBLE1BQUlELGFBQWEsUUFBYixJQUF5QkEsYUFBYSx1QkFBUUQsV0FBUixFQUFxQkYsT0FBckIsQ0FBMUMsRUFBeUU7QUFDdkVBLFlBQVFLLE1BQVIsQ0FBZTtBQUNYSixVQURXO0FBRVhLLGVBQVM7QUFGRSxLQUFmO0FBSUQ7QUFDRixDLENBbkJEOzs7OztBQXFCQUMsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sU0FERjtBQUVKQyxVQUFNO0FBQ0pDLG1CQUFhLHVDQURUO0FBRUpDLG1CQUFhLElBRlQ7QUFHSkMsV0FBSyx1QkFBUSxnQkFBUjtBQUhELEtBRkY7O0FBUUpDLFlBQVE7QUFSSixHQURTO0FBV2ZDLFVBQVEsVUFBVWhCLE9BQVYsRUFBbUI7QUFDekIsV0FBTztBQUNMaUIsd0JBQWtCaEIsSUFBbEIsRUFBd0I7QUFDdEJGLHdCQUFnQkMsT0FBaEIsRUFBeUJDLElBQXpCLEVBQStCQSxLQUFLaUIsTUFBTCxDQUFZQyxLQUEzQztBQUNELE9BSEk7QUFJTEMscUJBQWVuQixJQUFmLEVBQXFCO0FBQ25CLFlBQUksNkJBQWdCQSxJQUFoQixDQUFKLEVBQTJCO0FBQ3pCRiwwQkFBZ0JDLE9BQWhCLEVBQXlCQyxJQUF6QixFQUErQkEsS0FBS29CLFNBQUwsQ0FBZSxDQUFmLEVBQWtCRixLQUFqRDtBQUNEO0FBQ0Y7QUFSSSxLQUFQO0FBVUQ7QUF0QmMsQ0FBakIiLCJmaWxlIjoibm8tc2VsZi1pbXBvcnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlT3ZlcnZpZXcgRm9yYmlkcyBhIG1vZHVsZSBmcm9tIGltcG9ydGluZyBpdHNlbGZcbiAqIEBhdXRob3IgR2lvIGQnQW1lbGlvXG4gKi9cblxuaW1wb3J0IHJlc29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJ1xuaW1wb3J0IGlzU3RhdGljUmVxdWlyZSBmcm9tICcuLi9jb3JlL3N0YXRpY1JlcXVpcmUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5mdW5jdGlvbiBpc0ltcG9ydGluZ1NlbGYoY29udGV4dCwgbm9kZSwgcmVxdWlyZU5hbWUpIHtcbiAgY29uc3QgZmlsZVBhdGggPSBjb250ZXh0LmdldEZpbGVuYW1lKClcblxuICAvLyBJZiB0aGUgaW5wdXQgaXMgZnJvbSBzdGRpbiwgdGhpcyB0ZXN0IGNhbid0IGZhaWxcbiAgaWYgKGZpbGVQYXRoICE9PSAnPHRleHQ+JyAmJiBmaWxlUGF0aCA9PT0gcmVzb2x2ZShyZXF1aXJlTmFtZSwgY29udGV4dCkpIHtcbiAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIG1lc3NhZ2U6ICdNb2R1bGUgaW1wb3J0cyBpdHNlbGYuJyxcbiAgICB9KVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3Byb2JsZW0nLFxuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRm9yYmlkIGEgbW9kdWxlIGZyb20gaW1wb3J0aW5nIGl0c2VsZicsXG4gICAgICByZWNvbW1lbmRlZDogdHJ1ZSxcbiAgICAgIHVybDogZG9jc1VybCgnbm8tc2VsZi1pbXBvcnQnKSxcbiAgICB9LFxuXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHJldHVybiB7XG4gICAgICBJbXBvcnREZWNsYXJhdGlvbihub2RlKSB7XG4gICAgICAgIGlzSW1wb3J0aW5nU2VsZihjb250ZXh0LCBub2RlLCBub2RlLnNvdXJjZS52YWx1ZSlcbiAgICAgIH0sXG4gICAgICBDYWxsRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICAgIGlmIChpc1N0YXRpY1JlcXVpcmUobm9kZSkpIHtcbiAgICAgICAgICBpc0ltcG9ydGluZ1NlbGYoY29udGV4dCwgbm9kZSwgbm9kZS5hcmd1bWVudHNbMF0udmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1zZWxmLWltcG9ydC5qcyJdLCJuYW1lcyI6WyJpc0ltcG9ydGluZ1NlbGYiLCJjb250ZXh0Iiwibm9kZSIsInJlcXVpcmVOYW1lIiwiZmlsZVBhdGgiLCJnZXRGaWxlbmFtZSIsInJlcG9ydCIsIm1lc3NhZ2UiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwiZGVzY3JpcHRpb24iLCJyZWNvbW1lbmRlZCIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsIkltcG9ydERlY2xhcmF0aW9uIiwic291cmNlIiwidmFsdWUiLCJDYWxsRXhwcmVzc2lvbiIsImFyZ3VtZW50cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSxzRDtBQUNBLHNEO0FBQ0EscUM7O0FBRUEsU0FBU0EsZUFBVCxDQUF5QkMsT0FBekIsRUFBa0NDLElBQWxDLEVBQXdDQyxXQUF4QyxFQUFxRDtBQUNuRCxRQUFNQyxXQUFXSCxRQUFRSSxXQUFSLEVBQWpCOztBQUVBO0FBQ0EsTUFBSUQsYUFBYSxRQUFiLElBQXlCQSxhQUFhLHVCQUFRRCxXQUFSLEVBQXFCRixPQUFyQixDQUExQyxFQUF5RTtBQUN2RUEsWUFBUUssTUFBUixDQUFlO0FBQ1hKLFVBRFc7QUFFWEssZUFBUyx3QkFGRSxFQUFmOztBQUlEO0FBQ0YsQyxDQW5CRDs7O0tBcUJBQyxPQUFPQyxPQUFQLEdBQWlCLEVBQ2ZDLE1BQU07QUFDSkMsVUFBTSxTQURGO0FBRUpDLFVBQU07QUFDSkMsbUJBQWEsdUNBRFQ7QUFFSkMsbUJBQWEsSUFGVDtBQUdKQyxXQUFLLHVCQUFRLGdCQUFSLENBSEQsRUFGRjs7O0FBUUpDLFlBQVEsRUFSSixFQURTOztBQVdmQyxVQUFRLFVBQVVoQixPQUFWLEVBQW1CO0FBQ3pCLFdBQU87QUFDTGlCLHdCQUFrQmhCLElBQWxCLEVBQXdCO0FBQ3RCRix3QkFBZ0JDLE9BQWhCLEVBQXlCQyxJQUF6QixFQUErQkEsS0FBS2lCLE1BQUwsQ0FBWUMsS0FBM0M7QUFDRCxPQUhJO0FBSUxDLHFCQUFlbkIsSUFBZixFQUFxQjtBQUNuQixZQUFJLDZCQUFnQkEsSUFBaEIsQ0FBSixFQUEyQjtBQUN6QkYsMEJBQWdCQyxPQUFoQixFQUF5QkMsSUFBekIsRUFBK0JBLEtBQUtvQixTQUFMLENBQWUsQ0FBZixFQUFrQkYsS0FBakQ7QUFDRDtBQUNGLE9BUkksRUFBUDs7QUFVRCxHQXRCYyxFQUFqQiIsImZpbGUiOiJuby1zZWxmLWltcG9ydC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVPdmVydmlldyBGb3JiaWRzIGEgbW9kdWxlIGZyb20gaW1wb3J0aW5nIGl0c2VsZlxuICogQGF1dGhvciBHaW8gZCdBbWVsaW9cbiAqL1xuXG5pbXBvcnQgcmVzb2x2ZSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL3Jlc29sdmUnXG5pbXBvcnQgaXNTdGF0aWNSZXF1aXJlIGZyb20gJy4uL2NvcmUvc3RhdGljUmVxdWlyZSdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbmZ1bmN0aW9uIGlzSW1wb3J0aW5nU2VsZihjb250ZXh0LCBub2RlLCByZXF1aXJlTmFtZSkge1xuICBjb25zdCBmaWxlUGF0aCA9IGNvbnRleHQuZ2V0RmlsZW5hbWUoKVxuXG4gIC8vIElmIHRoZSBpbnB1dCBpcyBmcm9tIHN0ZGluLCB0aGlzIHRlc3QgY2FuJ3QgZmFpbFxuICBpZiAoZmlsZVBhdGggIT09ICc8dGV4dD4nICYmIGZpbGVQYXRoID09PSByZXNvbHZlKHJlcXVpcmVOYW1lLCBjb250ZXh0KSkge1xuICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbWVzc2FnZTogJ01vZHVsZSBpbXBvcnRzIGl0c2VsZi4nLFxuICAgIH0pXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAncHJvYmxlbScsXG4gICAgZG9jczoge1xuICAgICAgZGVzY3JpcHRpb246ICdGb3JiaWQgYSBtb2R1bGUgZnJvbSBpbXBvcnRpbmcgaXRzZWxmJyxcbiAgICAgIHJlY29tbWVuZGVkOiB0cnVlLFxuICAgICAgdXJsOiBkb2NzVXJsKCduby1zZWxmLWltcG9ydCcpLFxuICAgIH0sXG5cbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgaXNJbXBvcnRpbmdTZWxmKGNvbnRleHQsIG5vZGUsIG5vZGUuc291cmNlLnZhbHVlKVxuICAgICAgfSxcbiAgICAgIENhbGxFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKGlzU3RhdGljUmVxdWlyZShub2RlKSkge1xuICAgICAgICAgIGlzSW1wb3J0aW5nU2VsZihjb250ZXh0LCBub2RlLCBub2RlLmFyZ3VtZW50c1swXS52YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-unassigned-import.js b/node_modules/eslint-plugin-import/lib/rules/no-unassigned-import.js
index 65250b8..1d6d3f3 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-unassigned-import.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-unassigned-import.js
@@ -1,28 +1,14 @@
-'use strict';
+'use strict';var _path = require('path');var _path2 = _interopRequireDefault(_path);
+var _minimatch = require('minimatch');var _minimatch2 = _interopRequireDefault(_minimatch);
 
-var _path = require('path');
-
-var _path2 = _interopRequireDefault(_path);
-
-var _minimatch = require('minimatch');
-
-var _minimatch2 = _interopRequireDefault(_minimatch);
-
-var _staticRequire = require('../core/staticRequire');
-
-var _staticRequire2 = _interopRequireDefault(_staticRequire);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _staticRequire = require('../core/staticRequire');var _staticRequire2 = _interopRequireDefault(_staticRequire);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 function report(context, node) {
   context.report({
     node,
-    message: 'Imported module should be assigned'
-  });
+    message: 'Imported module should be assigned' });
+
 }
 
 function testIsAllow(globs, filename, source) {
@@ -32,14 +18,16 @@
 
   let filePath;
 
-  if (source[0] !== '.' && source[0] !== '/') {
-    // a node module
+  if (source[0] !== '.' && source[0] !== '/') {// a node module
     filePath = source;
   } else {
     filePath = _path2.default.resolve(_path2.default.dirname(filename), source); // get source absolute path
   }
 
-  return globs.find(glob => (0, _minimatch2.default)(filePath, glob) || (0, _minimatch2.default)(filePath, _path2.default.join(process.cwd(), glob))) !== undefined;
+  return globs.find(glob =>
+  (0, _minimatch2.default)(filePath, glob) ||
+  (0, _minimatch2.default)(filePath, _path2.default.join(process.cwd(), glob))) !==
+  undefined;
 }
 
 function create(context) {
@@ -54,11 +42,13 @@
       }
     },
     ExpressionStatement(node) {
-      if (node.expression.type === 'CallExpression' && (0, _staticRequire2.default)(node.expression) && !isAllow(node.expression.arguments[0].value)) {
+      if (node.expression.type === 'CallExpression' &&
+      (0, _staticRequire2.default)(node.expression) &&
+      !isAllow(node.expression.arguments[0].value)) {
         report(context, node.expression);
       }
-    }
-  };
+    } };
+
 }
 
 module.exports = {
@@ -66,9 +56,10 @@
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-unassigned-import')
-    },
-    schema: [{
+      url: (0, _docsUrl2.default)('no-unassigned-import') },
+
+    schema: [
+    {
       'type': 'object',
       'properties': {
         'devDependencies': { 'type': ['boolean', 'array'] },
@@ -77,12 +68,9 @@
         'allow': {
           'type': 'array',
           'items': {
-            'type': 'string'
-          }
-        }
-      },
-      'additionalProperties': false
-    }]
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11bmFzc2lnbmVkLWltcG9ydC5qcyJdLCJuYW1lcyI6WyJyZXBvcnQiLCJjb250ZXh0Iiwibm9kZSIsIm1lc3NhZ2UiLCJ0ZXN0SXNBbGxvdyIsImdsb2JzIiwiZmlsZW5hbWUiLCJzb3VyY2UiLCJBcnJheSIsImlzQXJyYXkiLCJmaWxlUGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiZGlybmFtZSIsImZpbmQiLCJnbG9iIiwiam9pbiIsInByb2Nlc3MiLCJjd2QiLCJ1bmRlZmluZWQiLCJjcmVhdGUiLCJvcHRpb25zIiwiZ2V0RmlsZW5hbWUiLCJpc0FsbG93IiwiYWxsb3ciLCJJbXBvcnREZWNsYXJhdGlvbiIsInNwZWNpZmllcnMiLCJsZW5ndGgiLCJ2YWx1ZSIsIkV4cHJlc3Npb25TdGF0ZW1lbnQiLCJleHByZXNzaW9uIiwidHlwZSIsImFyZ3VtZW50cyIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwiZG9jcyIsInVybCIsInNjaGVtYSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7OztBQUNBOzs7O0FBRUE7Ozs7QUFDQTs7Ozs7O0FBRUEsU0FBU0EsTUFBVCxDQUFnQkMsT0FBaEIsRUFBeUJDLElBQXpCLEVBQStCO0FBQzdCRCxVQUFRRCxNQUFSLENBQWU7QUFDYkUsUUFEYTtBQUViQyxhQUFTO0FBRkksR0FBZjtBQUlEOztBQUVELFNBQVNDLFdBQVQsQ0FBcUJDLEtBQXJCLEVBQTRCQyxRQUE1QixFQUFzQ0MsTUFBdEMsRUFBOEM7QUFDNUMsTUFBSSxDQUFDQyxNQUFNQyxPQUFOLENBQWNKLEtBQWQsQ0FBTCxFQUEyQjtBQUN6QixXQUFPLEtBQVAsQ0FEeUIsQ0FDWjtBQUNkOztBQUVELE1BQUlLLFFBQUo7O0FBRUEsTUFBSUgsT0FBTyxDQUFQLE1BQWMsR0FBZCxJQUFxQkEsT0FBTyxDQUFQLE1BQWMsR0FBdkMsRUFBNEM7QUFBRTtBQUM1Q0csZUFBV0gsTUFBWDtBQUNELEdBRkQsTUFFTztBQUNMRyxlQUFXQyxlQUFLQyxPQUFMLENBQWFELGVBQUtFLE9BQUwsQ0FBYVAsUUFBYixDQUFiLEVBQXFDQyxNQUFyQyxDQUFYLENBREssQ0FDbUQ7QUFDekQ7O0FBRUQsU0FBT0YsTUFBTVMsSUFBTixDQUFXQyxRQUNoQix5QkFBVUwsUUFBVixFQUFvQkssSUFBcEIsS0FDQSx5QkFBVUwsUUFBVixFQUFvQkMsZUFBS0ssSUFBTCxDQUFVQyxRQUFRQyxHQUFSLEVBQVYsRUFBeUJILElBQXpCLENBQXBCLENBRkssTUFHQUksU0FIUDtBQUlEOztBQUVELFNBQVNDLE1BQVQsQ0FBZ0JuQixPQUFoQixFQUF5QjtBQUN2QixRQUFNb0IsVUFBVXBCLFFBQVFvQixPQUFSLENBQWdCLENBQWhCLEtBQXNCLEVBQXRDO0FBQ0EsUUFBTWYsV0FBV0wsUUFBUXFCLFdBQVIsRUFBakI7QUFDQSxRQUFNQyxVQUFVaEIsVUFBVUgsWUFBWWlCLFFBQVFHLEtBQXBCLEVBQTJCbEIsUUFBM0IsRUFBcUNDLE1BQXJDLENBQTFCOztBQUVBLFNBQU87QUFDTGtCLHNCQUFrQnZCLElBQWxCLEVBQXdCO0FBQ3RCLFVBQUlBLEtBQUt3QixVQUFMLENBQWdCQyxNQUFoQixLQUEyQixDQUEzQixJQUFnQyxDQUFDSixRQUFRckIsS0FBS0ssTUFBTCxDQUFZcUIsS0FBcEIsQ0FBckMsRUFBaUU7QUFDL0Q1QixlQUFPQyxPQUFQLEVBQWdCQyxJQUFoQjtBQUNEO0FBQ0YsS0FMSTtBQU1MMkIsd0JBQW9CM0IsSUFBcEIsRUFBMEI7QUFDeEIsVUFBSUEsS0FBSzRCLFVBQUwsQ0FBZ0JDLElBQWhCLEtBQXlCLGdCQUF6QixJQUNGLDZCQUFnQjdCLEtBQUs0QixVQUFyQixDQURFLElBRUYsQ0FBQ1AsUUFBUXJCLEtBQUs0QixVQUFMLENBQWdCRSxTQUFoQixDQUEwQixDQUExQixFQUE2QkosS0FBckMsQ0FGSCxFQUVnRDtBQUM5QzVCLGVBQU9DLE9BQVAsRUFBZ0JDLEtBQUs0QixVQUFyQjtBQUNEO0FBQ0Y7QUFaSSxHQUFQO0FBY0Q7O0FBRURHLE9BQU9DLE9BQVAsR0FBaUI7QUFDZmQsUUFEZTtBQUVmZSxRQUFNO0FBQ0pKLFVBQU0sWUFERjtBQUVKSyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsc0JBQVI7QUFERCxLQUZGO0FBS0pDLFlBQVEsQ0FDTjtBQUNFLGNBQVEsUUFEVjtBQUVFLG9CQUFjO0FBQ1osMkJBQW1CLEVBQUUsUUFBUSxDQUFDLFNBQUQsRUFBWSxPQUFaLENBQVYsRUFEUDtBQUVaLGdDQUF3QixFQUFFLFFBQVEsQ0FBQyxTQUFELEVBQVksT0FBWixDQUFWLEVBRlo7QUFHWiw0QkFBb0IsRUFBRSxRQUFRLENBQUMsU0FBRCxFQUFZLE9BQVosQ0FBVixFQUhSO0FBSVosaUJBQVM7QUFDUCxrQkFBUSxPQUREO0FBRVAsbUJBQVM7QUFDUCxvQkFBUTtBQUREO0FBRkY7QUFKRyxPQUZoQjtBQWFFLDhCQUF3QjtBQWIxQixLQURNO0FBTEo7QUFGUyxDQUFqQiIsImZpbGUiOiJuby11bmFzc2lnbmVkLWltcG9ydC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgbWluaW1hdGNoIGZyb20gJ21pbmltYXRjaCdcblxuaW1wb3J0IGlzU3RhdGljUmVxdWlyZSBmcm9tICcuLi9jb3JlL3N0YXRpY1JlcXVpcmUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5mdW5jdGlvbiByZXBvcnQoY29udGV4dCwgbm9kZSkge1xuICBjb250ZXh0LnJlcG9ydCh7XG4gICAgbm9kZSxcbiAgICBtZXNzYWdlOiAnSW1wb3J0ZWQgbW9kdWxlIHNob3VsZCBiZSBhc3NpZ25lZCcsXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHRlc3RJc0FsbG93KGdsb2JzLCBmaWxlbmFtZSwgc291cmNlKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShnbG9icykpIHtcbiAgICByZXR1cm4gZmFsc2UgLy8gZGVmYXVsdCBkb2Vzbid0IGFsbG93IGFueSBwYXR0ZXJuc1xuICB9XG5cbiAgbGV0IGZpbGVQYXRoXG5cbiAgaWYgKHNvdXJjZVswXSAhPT0gJy4nICYmIHNvdXJjZVswXSAhPT0gJy8nKSB7IC8vIGEgbm9kZSBtb2R1bGVcbiAgICBmaWxlUGF0aCA9IHNvdXJjZVxuICB9IGVsc2Uge1xuICAgIGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShmaWxlbmFtZSksIHNvdXJjZSkgLy8gZ2V0IHNvdXJjZSBhYnNvbHV0ZSBwYXRoXG4gIH1cblxuICByZXR1cm4gZ2xvYnMuZmluZChnbG9iID0+IChcbiAgICBtaW5pbWF0Y2goZmlsZVBhdGgsIGdsb2IpIHx8XG4gICAgbWluaW1hdGNoKGZpbGVQYXRoLCBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZ2xvYikpXG4gICkpICE9PSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gY3JlYXRlKGNvbnRleHQpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9uc1swXSB8fCB7fVxuICBjb25zdCBmaWxlbmFtZSA9IGNvbnRleHQuZ2V0RmlsZW5hbWUoKVxuICBjb25zdCBpc0FsbG93ID0gc291cmNlID0+IHRlc3RJc0FsbG93KG9wdGlvbnMuYWxsb3csIGZpbGVuYW1lLCBzb3VyY2UpXG5cbiAgcmV0dXJuIHtcbiAgICBJbXBvcnREZWNsYXJhdGlvbihub2RlKSB7XG4gICAgICBpZiAobm9kZS5zcGVjaWZpZXJzLmxlbmd0aCA9PT0gMCAmJiAhaXNBbGxvdyhub2RlLnNvdXJjZS52YWx1ZSkpIHtcbiAgICAgICAgcmVwb3J0KGNvbnRleHQsIG5vZGUpXG4gICAgICB9XG4gICAgfSxcbiAgICBFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgIGlmIChub2RlLmV4cHJlc3Npb24udHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJyAmJlxuICAgICAgICBpc1N0YXRpY1JlcXVpcmUobm9kZS5leHByZXNzaW9uKSAmJlxuICAgICAgICAhaXNBbGxvdyhub2RlLmV4cHJlc3Npb24uYXJndW1lbnRzWzBdLnZhbHVlKSkge1xuICAgICAgICByZXBvcnQoY29udGV4dCwgbm9kZS5leHByZXNzaW9uKVxuICAgICAgfVxuICAgIH0sXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZSxcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLXVuYXNzaWduZWQtaW1wb3J0JyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFtcbiAgICAgIHtcbiAgICAgICAgJ3R5cGUnOiAnb2JqZWN0JyxcbiAgICAgICAgJ3Byb3BlcnRpZXMnOiB7XG4gICAgICAgICAgJ2RldkRlcGVuZGVuY2llcyc6IHsgJ3R5cGUnOiBbJ2Jvb2xlYW4nLCAnYXJyYXknXSB9LFxuICAgICAgICAgICdvcHRpb25hbERlcGVuZGVuY2llcyc6IHsgJ3R5cGUnOiBbJ2Jvb2xlYW4nLCAnYXJyYXknXSB9LFxuICAgICAgICAgICdwZWVyRGVwZW5kZW5jaWVzJzogeyAndHlwZSc6IFsnYm9vbGVhbicsICdhcnJheSddIH0sXG4gICAgICAgICAgJ2FsbG93Jzoge1xuICAgICAgICAgICAgJ3R5cGUnOiAnYXJyYXknLFxuICAgICAgICAgICAgJ2l0ZW1zJzoge1xuICAgICAgICAgICAgICAndHlwZSc6ICdzdHJpbmcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAnYWRkaXRpb25hbFByb3BlcnRpZXMnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
+            'type': 'string' } } },
+
+
+
+      'additionalProperties': false }] } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11bmFzc2lnbmVkLWltcG9ydC5qcyJdLCJuYW1lcyI6WyJyZXBvcnQiLCJjb250ZXh0Iiwibm9kZSIsIm1lc3NhZ2UiLCJ0ZXN0SXNBbGxvdyIsImdsb2JzIiwiZmlsZW5hbWUiLCJzb3VyY2UiLCJBcnJheSIsImlzQXJyYXkiLCJmaWxlUGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiZGlybmFtZSIsImZpbmQiLCJnbG9iIiwiam9pbiIsInByb2Nlc3MiLCJjd2QiLCJ1bmRlZmluZWQiLCJjcmVhdGUiLCJvcHRpb25zIiwiZ2V0RmlsZW5hbWUiLCJpc0FsbG93IiwiYWxsb3ciLCJJbXBvcnREZWNsYXJhdGlvbiIsInNwZWNpZmllcnMiLCJsZW5ndGgiLCJ2YWx1ZSIsIkV4cHJlc3Npb25TdGF0ZW1lbnQiLCJleHByZXNzaW9uIiwidHlwZSIsImFyZ3VtZW50cyIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwiZG9jcyIsInVybCIsInNjaGVtYSJdLCJtYXBwaW5ncyI6ImFBQUEsNEI7QUFDQSxzQzs7QUFFQSxzRDtBQUNBLHFDOztBQUVBLFNBQVNBLE1BQVQsQ0FBZ0JDLE9BQWhCLEVBQXlCQyxJQUF6QixFQUErQjtBQUM3QkQsVUFBUUQsTUFBUixDQUFlO0FBQ2JFLFFBRGE7QUFFYkMsYUFBUyxvQ0FGSSxFQUFmOztBQUlEOztBQUVELFNBQVNDLFdBQVQsQ0FBcUJDLEtBQXJCLEVBQTRCQyxRQUE1QixFQUFzQ0MsTUFBdEMsRUFBOEM7QUFDNUMsTUFBSSxDQUFDQyxNQUFNQyxPQUFOLENBQWNKLEtBQWQsQ0FBTCxFQUEyQjtBQUN6QixXQUFPLEtBQVAsQ0FEeUIsQ0FDWjtBQUNkOztBQUVELE1BQUlLLFFBQUo7O0FBRUEsTUFBSUgsT0FBTyxDQUFQLE1BQWMsR0FBZCxJQUFxQkEsT0FBTyxDQUFQLE1BQWMsR0FBdkMsRUFBNEMsQ0FBRTtBQUM1Q0csZUFBV0gsTUFBWDtBQUNELEdBRkQsTUFFTztBQUNMRyxlQUFXQyxlQUFLQyxPQUFMLENBQWFELGVBQUtFLE9BQUwsQ0FBYVAsUUFBYixDQUFiLEVBQXFDQyxNQUFyQyxDQUFYLENBREssQ0FDbUQ7QUFDekQ7O0FBRUQsU0FBT0YsTUFBTVMsSUFBTixDQUFXQztBQUNoQiwyQkFBVUwsUUFBVixFQUFvQkssSUFBcEI7QUFDQSwyQkFBVUwsUUFBVixFQUFvQkMsZUFBS0ssSUFBTCxDQUFVQyxRQUFRQyxHQUFSLEVBQVYsRUFBeUJILElBQXpCLENBQXBCLENBRks7QUFHQUksV0FIUDtBQUlEOztBQUVELFNBQVNDLE1BQVQsQ0FBZ0JuQixPQUFoQixFQUF5QjtBQUN2QixRQUFNb0IsVUFBVXBCLFFBQVFvQixPQUFSLENBQWdCLENBQWhCLEtBQXNCLEVBQXRDO0FBQ0EsUUFBTWYsV0FBV0wsUUFBUXFCLFdBQVIsRUFBakI7QUFDQSxRQUFNQyxVQUFVaEIsVUFBVUgsWUFBWWlCLFFBQVFHLEtBQXBCLEVBQTJCbEIsUUFBM0IsRUFBcUNDLE1BQXJDLENBQTFCOztBQUVBLFNBQU87QUFDTGtCLHNCQUFrQnZCLElBQWxCLEVBQXdCO0FBQ3RCLFVBQUlBLEtBQUt3QixVQUFMLENBQWdCQyxNQUFoQixLQUEyQixDQUEzQixJQUFnQyxDQUFDSixRQUFRckIsS0FBS0ssTUFBTCxDQUFZcUIsS0FBcEIsQ0FBckMsRUFBaUU7QUFDL0Q1QixlQUFPQyxPQUFQLEVBQWdCQyxJQUFoQjtBQUNEO0FBQ0YsS0FMSTtBQU1MMkIsd0JBQW9CM0IsSUFBcEIsRUFBMEI7QUFDeEIsVUFBSUEsS0FBSzRCLFVBQUwsQ0FBZ0JDLElBQWhCLEtBQXlCLGdCQUF6QjtBQUNGLG1DQUFnQjdCLEtBQUs0QixVQUFyQixDQURFO0FBRUYsT0FBQ1AsUUFBUXJCLEtBQUs0QixVQUFMLENBQWdCRSxTQUFoQixDQUEwQixDQUExQixFQUE2QkosS0FBckMsQ0FGSCxFQUVnRDtBQUM5QzVCLGVBQU9DLE9BQVAsRUFBZ0JDLEtBQUs0QixVQUFyQjtBQUNEO0FBQ0YsS0FaSSxFQUFQOztBQWNEOztBQUVERyxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZkLFFBRGU7QUFFZmUsUUFBTTtBQUNKSixVQUFNLFlBREY7QUFFSkssVUFBTTtBQUNKQyxXQUFLLHVCQUFRLHNCQUFSLENBREQsRUFGRjs7QUFLSkMsWUFBUTtBQUNOO0FBQ0UsY0FBUSxRQURWO0FBRUUsb0JBQWM7QUFDWiwyQkFBbUIsRUFBRSxRQUFRLENBQUMsU0FBRCxFQUFZLE9BQVosQ0FBVixFQURQO0FBRVosZ0NBQXdCLEVBQUUsUUFBUSxDQUFDLFNBQUQsRUFBWSxPQUFaLENBQVYsRUFGWjtBQUdaLDRCQUFvQixFQUFFLFFBQVEsQ0FBQyxTQUFELEVBQVksT0FBWixDQUFWLEVBSFI7QUFJWixpQkFBUztBQUNQLGtCQUFRLE9BREQ7QUFFUCxtQkFBUztBQUNQLG9CQUFRLFFBREQsRUFGRixFQUpHLEVBRmhCOzs7O0FBYUUsOEJBQXdCLEtBYjFCLEVBRE0sQ0FMSixFQUZTLEVBQWpCIiwiZmlsZSI6Im5vLXVuYXNzaWduZWQtaW1wb3J0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBtaW5pbWF0Y2ggZnJvbSAnbWluaW1hdGNoJ1xuXG5pbXBvcnQgaXNTdGF0aWNSZXF1aXJlIGZyb20gJy4uL2NvcmUvc3RhdGljUmVxdWlyZSdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbmZ1bmN0aW9uIHJlcG9ydChjb250ZXh0LCBub2RlKSB7XG4gIGNvbnRleHQucmVwb3J0KHtcbiAgICBub2RlLFxuICAgIG1lc3NhZ2U6ICdJbXBvcnRlZCBtb2R1bGUgc2hvdWxkIGJlIGFzc2lnbmVkJyxcbiAgfSlcbn1cblxuZnVuY3Rpb24gdGVzdElzQWxsb3coZ2xvYnMsIGZpbGVuYW1lLCBzb3VyY2UpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGdsb2JzKSkge1xuICAgIHJldHVybiBmYWxzZSAvLyBkZWZhdWx0IGRvZXNuJ3QgYWxsb3cgYW55IHBhdHRlcm5zXG4gIH1cblxuICBsZXQgZmlsZVBhdGhcblxuICBpZiAoc291cmNlWzBdICE9PSAnLicgJiYgc291cmNlWzBdICE9PSAnLycpIHsgLy8gYSBub2RlIG1vZHVsZVxuICAgIGZpbGVQYXRoID0gc291cmNlXG4gIH0gZWxzZSB7XG4gICAgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSwgc291cmNlKSAvLyBnZXQgc291cmNlIGFic29sdXRlIHBhdGhcbiAgfVxuXG4gIHJldHVybiBnbG9icy5maW5kKGdsb2IgPT4gKFxuICAgIG1pbmltYXRjaChmaWxlUGF0aCwgZ2xvYikgfHxcbiAgICBtaW5pbWF0Y2goZmlsZVBhdGgsIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBnbG9iKSlcbiAgKSkgIT09IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBjcmVhdGUoY29udGV4dCkge1xuICBjb25zdCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHt9XG4gIGNvbnN0IGZpbGVuYW1lID0gY29udGV4dC5nZXRGaWxlbmFtZSgpXG4gIGNvbnN0IGlzQWxsb3cgPSBzb3VyY2UgPT4gdGVzdElzQWxsb3cob3B0aW9ucy5hbGxvdywgZmlsZW5hbWUsIHNvdXJjZSlcblxuICByZXR1cm4ge1xuICAgIEltcG9ydERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLnNwZWNpZmllcnMubGVuZ3RoID09PSAwICYmICFpc0FsbG93KG5vZGUuc291cmNlLnZhbHVlKSkge1xuICAgICAgICByZXBvcnQoY29udGV4dCwgbm9kZSlcbiAgICAgIH1cbiAgICB9LFxuICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSkge1xuICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbi50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nICYmXG4gICAgICAgIGlzU3RhdGljUmVxdWlyZShub2RlLmV4cHJlc3Npb24pICYmXG4gICAgICAgICFpc0FsbG93KG5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHNbMF0udmFsdWUpKSB7XG4gICAgICAgIHJlcG9ydChjb250ZXh0LCBub2RlLmV4cHJlc3Npb24pXG4gICAgICB9XG4gICAgfSxcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY3JlYXRlLFxuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tdW5hc3NpZ25lZC1pbXBvcnQnKSxcbiAgICB9LFxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICAndHlwZSc6ICdvYmplY3QnLFxuICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAnZGV2RGVwZW5kZW5jaWVzJzogeyAndHlwZSc6IFsnYm9vbGVhbicsICdhcnJheSddIH0sXG4gICAgICAgICAgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJzogeyAndHlwZSc6IFsnYm9vbGVhbicsICdhcnJheSddIH0sXG4gICAgICAgICAgJ3BlZXJEZXBlbmRlbmNpZXMnOiB7ICd0eXBlJzogWydib29sZWFuJywgJ2FycmF5J10gfSxcbiAgICAgICAgICAnYWxsb3cnOiB7XG4gICAgICAgICAgICAndHlwZSc6ICdhcnJheScsXG4gICAgICAgICAgICAnaXRlbXMnOiB7XG4gICAgICAgICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgICdhZGRpdGlvbmFsUHJvcGVydGllcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-unresolved.js b/node_modules/eslint-plugin-import/lib/rules/no-unresolved.js
index 5f675c4..a3f65be 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-unresolved.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-unresolved.js
@@ -1,58 +1,49 @@
 'use strict';
 
-var _resolve = require('eslint-module-utils/resolve');
 
-var _resolve2 = _interopRequireDefault(_resolve);
 
-var _ModuleCache = require('eslint-module-utils/ModuleCache');
 
-var _ModuleCache2 = _interopRequireDefault(_ModuleCache);
-
-var _moduleVisitor = require('eslint-module-utils/moduleVisitor');
-
-var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * @fileOverview Ensures that an imported path exists, given resolution rules.
- * @author Ben Mosher
- */
-
-module.exports = {
-  meta: {
+var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);
+var _ModuleCache = require('eslint-module-utils/ModuleCache');var _ModuleCache2 = _interopRequireDefault(_ModuleCache);
+var _moduleVisitor = require('eslint-module-utils/moduleVisitor');var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /**
+                                                                                                                                                                                     * @fileOverview Ensures that an imported path exists, given resolution rules.
+                                                                                                                                                                                     * @author Ben Mosher
+                                                                                                                                                                                     */module.exports = { meta: {
     type: 'problem',
     docs: {
-      url: (0, _docsUrl2.default)('no-unresolved')
-    },
+      url: (0, _docsUrl2.default)('no-unresolved') },
+
 
     schema: [(0, _moduleVisitor.makeOptionsSchema)({
-      caseSensitive: { type: 'boolean', default: true }
-    })]
-  },
+      caseSensitive: { type: 'boolean', default: true } })] },
+
+
 
   create: function (context) {
 
     function checkSourceValue(source) {
-      const shouldCheckCase = !_resolve.CASE_SENSITIVE_FS && (!context.options[0] || context.options[0].caseSensitive !== false);
+      const shouldCheckCase = !_resolve.CASE_SENSITIVE_FS && (
+      !context.options[0] || context.options[0].caseSensitive !== false);
 
       const resolvedPath = (0, _resolve2.default)(source.value, context);
 
       if (resolvedPath === undefined) {
-        context.report(source, `Unable to resolve path to module '${source.value}'.`);
-      } else if (shouldCheckCase) {
+        context.report(source,
+        `Unable to resolve path to module '${source.value}'.`);
+      } else
+
+      if (shouldCheckCase) {
         const cacheSettings = _ModuleCache2.default.getSettings(context.settings);
         if (!(0, _resolve.fileExistsWithCaseSync)(resolvedPath, cacheSettings)) {
-          context.report(source, `Casing of ${source.value} does not match the underlying filesystem.`);
+          context.report(source,
+          `Casing of ${source.value} does not match the underlying filesystem.`);
         }
+
       }
     }
 
     return (0, _moduleVisitor2.default)(checkSourceValue, context.options[0]);
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11bnJlc29sdmVkLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjYXNlU2Vuc2l0aXZlIiwiZGVmYXVsdCIsImNyZWF0ZSIsImNvbnRleHQiLCJjaGVja1NvdXJjZVZhbHVlIiwic291cmNlIiwic2hvdWxkQ2hlY2tDYXNlIiwiQ0FTRV9TRU5TSVRJVkVfRlMiLCJvcHRpb25zIiwicmVzb2x2ZWRQYXRoIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJyZXBvcnQiLCJjYWNoZVNldHRpbmdzIiwiTW9kdWxlQ2FjaGUiLCJnZXRTZXR0aW5ncyIsInNldHRpbmdzIl0sIm1hcHBpbmdzIjoiOztBQUtBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFSQTs7Ozs7QUFVQUEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sU0FERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsZUFBUjtBQURELEtBRkY7O0FBTUpDLFlBQVEsQ0FBRSxzQ0FBa0I7QUFDMUJDLHFCQUFlLEVBQUVKLE1BQU0sU0FBUixFQUFtQkssU0FBUyxJQUE1QjtBQURXLEtBQWxCLENBQUY7QUFOSixHQURTOztBQVlmQyxVQUFRLFVBQVVDLE9BQVYsRUFBbUI7O0FBRXpCLGFBQVNDLGdCQUFULENBQTBCQyxNQUExQixFQUFrQztBQUNoQyxZQUFNQyxrQkFBa0IsQ0FBQ0MsMEJBQUQsS0FDckIsQ0FBQ0osUUFBUUssT0FBUixDQUFnQixDQUFoQixDQUFELElBQXVCTCxRQUFRSyxPQUFSLENBQWdCLENBQWhCLEVBQW1CUixhQUFuQixLQUFxQyxLQUR2QyxDQUF4Qjs7QUFHQSxZQUFNUyxlQUFlLHVCQUFRSixPQUFPSyxLQUFmLEVBQXNCUCxPQUF0QixDQUFyQjs7QUFFQSxVQUFJTSxpQkFBaUJFLFNBQXJCLEVBQWdDO0FBQzlCUixnQkFBUVMsTUFBUixDQUFlUCxNQUFmLEVBQ0cscUNBQW9DQSxPQUFPSyxLQUFNLElBRHBEO0FBRUQsT0FIRCxNQUtLLElBQUlKLGVBQUosRUFBcUI7QUFDeEIsY0FBTU8sZ0JBQWdCQyxzQkFBWUMsV0FBWixDQUF3QlosUUFBUWEsUUFBaEMsQ0FBdEI7QUFDQSxZQUFJLENBQUMscUNBQXVCUCxZQUF2QixFQUFxQ0ksYUFBckMsQ0FBTCxFQUEwRDtBQUN4RFYsa0JBQVFTLE1BQVIsQ0FBZVAsTUFBZixFQUNHLGFBQVlBLE9BQU9LLEtBQU0sNENBRDVCO0FBRUQ7QUFFRjtBQUNGOztBQUVELFdBQU8sNkJBQWNOLGdCQUFkLEVBQWdDRCxRQUFRSyxPQUFSLENBQWdCLENBQWhCLENBQWhDLENBQVA7QUFFRDtBQXJDYyxDQUFqQiIsImZpbGUiOiJuby11bnJlc29sdmVkLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IEVuc3VyZXMgdGhhdCBhbiBpbXBvcnRlZCBwYXRoIGV4aXN0cywgZ2l2ZW4gcmVzb2x1dGlvbiBydWxlcy5cbiAqIEBhdXRob3IgQmVuIE1vc2hlclxuICovXG5cbmltcG9ydCByZXNvbHZlLCB7IENBU0VfU0VOU0lUSVZFX0ZTLCBmaWxlRXhpc3RzV2l0aENhc2VTeW5jIH0gZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJ1xuaW1wb3J0IE1vZHVsZUNhY2hlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvTW9kdWxlQ2FjaGUnXG5pbXBvcnQgbW9kdWxlVmlzaXRvciwgeyBtYWtlT3B0aW9uc1NjaGVtYSB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvbW9kdWxlVmlzaXRvcidcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3Byb2JsZW0nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tdW5yZXNvbHZlZCcpLFxuICAgIH0sXG5cbiAgICBzY2hlbWE6IFsgbWFrZU9wdGlvbnNTY2hlbWEoe1xuICAgICAgY2FzZVNlbnNpdGl2ZTogeyB0eXBlOiAnYm9vbGVhbicsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICB9KV0sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuXG4gICAgZnVuY3Rpb24gY2hlY2tTb3VyY2VWYWx1ZShzb3VyY2UpIHtcbiAgICAgIGNvbnN0IHNob3VsZENoZWNrQ2FzZSA9ICFDQVNFX1NFTlNJVElWRV9GUyAmJlxuICAgICAgICAoIWNvbnRleHQub3B0aW9uc1swXSB8fCBjb250ZXh0Lm9wdGlvbnNbMF0uY2FzZVNlbnNpdGl2ZSAhPT0gZmFsc2UpXG5cbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmUoc291cmNlLnZhbHVlLCBjb250ZXh0KVxuXG4gICAgICBpZiAocmVzb2x2ZWRQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoc291cmNlLFxuICAgICAgICAgIGBVbmFibGUgdG8gcmVzb2x2ZSBwYXRoIHRvIG1vZHVsZSAnJHtzb3VyY2UudmFsdWV9Jy5gKVxuICAgICAgfVxuXG4gICAgICBlbHNlIGlmIChzaG91bGRDaGVja0Nhc2UpIHtcbiAgICAgICAgY29uc3QgY2FjaGVTZXR0aW5ncyA9IE1vZHVsZUNhY2hlLmdldFNldHRpbmdzKGNvbnRleHQuc2V0dGluZ3MpXG4gICAgICAgIGlmICghZmlsZUV4aXN0c1dpdGhDYXNlU3luYyhyZXNvbHZlZFBhdGgsIGNhY2hlU2V0dGluZ3MpKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoc291cmNlLFxuICAgICAgICAgICAgYENhc2luZyBvZiAke3NvdXJjZS52YWx1ZX0gZG9lcyBub3QgbWF0Y2ggdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbS5gKVxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbW9kdWxlVmlzaXRvcihjaGVja1NvdXJjZVZhbHVlLCBjb250ZXh0Lm9wdGlvbnNbMF0pXG5cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11bnJlc29sdmVkLmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwidHlwZSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJjYXNlU2Vuc2l0aXZlIiwiZGVmYXVsdCIsImNyZWF0ZSIsImNvbnRleHQiLCJjaGVja1NvdXJjZVZhbHVlIiwic291cmNlIiwic2hvdWxkQ2hlY2tDYXNlIiwiQ0FTRV9TRU5TSVRJVkVfRlMiLCJvcHRpb25zIiwicmVzb2x2ZWRQYXRoIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJyZXBvcnQiLCJjYWNoZVNldHRpbmdzIiwiTW9kdWxlQ2FjaGUiLCJnZXRTZXR0aW5ncyIsInNldHRpbmdzIl0sIm1hcHBpbmdzIjoiOzs7OztBQUtBLHNEO0FBQ0EsOEQ7QUFDQSxrRTtBQUNBLHFDLCtJQVJBOzs7dUxBVUFBLE9BQU9DLE9BQVAsR0FBaUIsRUFDZkMsTUFBTTtBQUNKQyxVQUFNLFNBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLGVBQVIsQ0FERCxFQUZGOzs7QUFNSkMsWUFBUSxDQUFFLHNDQUFrQjtBQUMxQkMscUJBQWUsRUFBRUosTUFBTSxTQUFSLEVBQW1CSyxTQUFTLElBQTVCLEVBRFcsRUFBbEIsQ0FBRixDQU5KLEVBRFM7Ozs7QUFZZkMsVUFBUSxVQUFVQyxPQUFWLEVBQW1COztBQUV6QixhQUFTQyxnQkFBVCxDQUEwQkMsTUFBMUIsRUFBa0M7QUFDaEMsWUFBTUMsa0JBQWtCLENBQUNDLDBCQUFEO0FBQ3JCLE9BQUNKLFFBQVFLLE9BQVIsQ0FBZ0IsQ0FBaEIsQ0FBRCxJQUF1QkwsUUFBUUssT0FBUixDQUFnQixDQUFoQixFQUFtQlIsYUFBbkIsS0FBcUMsS0FEdkMsQ0FBeEI7O0FBR0EsWUFBTVMsZUFBZSx1QkFBUUosT0FBT0ssS0FBZixFQUFzQlAsT0FBdEIsQ0FBckI7O0FBRUEsVUFBSU0saUJBQWlCRSxTQUFyQixFQUFnQztBQUM5QlIsZ0JBQVFTLE1BQVIsQ0FBZVAsTUFBZjtBQUNHLDZDQUFvQ0EsT0FBT0ssS0FBTSxJQURwRDtBQUVELE9BSEQ7O0FBS0ssVUFBSUosZUFBSixFQUFxQjtBQUN4QixjQUFNTyxnQkFBZ0JDLHNCQUFZQyxXQUFaLENBQXdCWixRQUFRYSxRQUFoQyxDQUF0QjtBQUNBLFlBQUksQ0FBQyxxQ0FBdUJQLFlBQXZCLEVBQXFDSSxhQUFyQyxDQUFMLEVBQTBEO0FBQ3hEVixrQkFBUVMsTUFBUixDQUFlUCxNQUFmO0FBQ0csdUJBQVlBLE9BQU9LLEtBQU0sNENBRDVCO0FBRUQ7O0FBRUY7QUFDRjs7QUFFRCxXQUFPLDZCQUFjTixnQkFBZCxFQUFnQ0QsUUFBUUssT0FBUixDQUFnQixDQUFoQixDQUFoQyxDQUFQOztBQUVELEdBckNjLEVBQWpCIiwiZmlsZSI6Im5vLXVucmVzb2x2ZWQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlT3ZlcnZpZXcgRW5zdXJlcyB0aGF0IGFuIGltcG9ydGVkIHBhdGggZXhpc3RzLCBnaXZlbiByZXNvbHV0aW9uIHJ1bGVzLlxuICogQGF1dGhvciBCZW4gTW9zaGVyXG4gKi9cblxuaW1wb3J0IHJlc29sdmUsIHsgQ0FTRV9TRU5TSVRJVkVfRlMsIGZpbGVFeGlzdHNXaXRoQ2FzZVN5bmMgfSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL3Jlc29sdmUnXG5pbXBvcnQgTW9kdWxlQ2FjaGUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9Nb2R1bGVDYWNoZSdcbmltcG9ydCBtb2R1bGVWaXNpdG9yLCB7IG1ha2VPcHRpb25zU2NoZW1hIH0gZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9tb2R1bGVWaXNpdG9yJ1xuaW1wb3J0IGRvY3NVcmwgZnJvbSAnLi4vZG9jc1VybCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAncHJvYmxlbScsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby11bnJlc29sdmVkJyksXG4gICAgfSxcblxuICAgIHNjaGVtYTogWyBtYWtlT3B0aW9uc1NjaGVtYSh7XG4gICAgICBjYXNlU2Vuc2l0aXZlOiB7IHR5cGU6ICdib29sZWFuJywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIH0pXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cbiAgICBmdW5jdGlvbiBjaGVja1NvdXJjZVZhbHVlKHNvdXJjZSkge1xuICAgICAgY29uc3Qgc2hvdWxkQ2hlY2tDYXNlID0gIUNBU0VfU0VOU0lUSVZFX0ZTICYmXG4gICAgICAgICghY29udGV4dC5vcHRpb25zWzBdIHx8IGNvbnRleHQub3B0aW9uc1swXS5jYXNlU2Vuc2l0aXZlICE9PSBmYWxzZSlcblxuICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShzb3VyY2UudmFsdWUsIGNvbnRleHQpXG5cbiAgICAgIGlmIChyZXNvbHZlZFBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydChzb3VyY2UsXG4gICAgICAgICAgYFVuYWJsZSB0byByZXNvbHZlIHBhdGggdG8gbW9kdWxlICcke3NvdXJjZS52YWx1ZX0nLmApXG4gICAgICB9XG5cbiAgICAgIGVsc2UgaWYgKHNob3VsZENoZWNrQ2FzZSkge1xuICAgICAgICBjb25zdCBjYWNoZVNldHRpbmdzID0gTW9kdWxlQ2FjaGUuZ2V0U2V0dGluZ3MoY29udGV4dC5zZXR0aW5ncylcbiAgICAgICAgaWYgKCFmaWxlRXhpc3RzV2l0aENhc2VTeW5jKHJlc29sdmVkUGF0aCwgY2FjaGVTZXR0aW5ncykpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydChzb3VyY2UsXG4gICAgICAgICAgICBgQ2FzaW5nIG9mICR7c291cmNlLnZhbHVlfSBkb2VzIG5vdCBtYXRjaCB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtLmApXG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVWaXNpdG9yKGNoZWNrU291cmNlVmFsdWUsIGNvbnRleHQub3B0aW9uc1swXSlcblxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-unused-modules.js b/node_modules/eslint-plugin-import/lib/rules/no-unused-modules.js
index 08ed26e..d75c7ef 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-unused-modules.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-unused-modules.js
@@ -1,58 +1,31 @@
 'use strict';
 
-var _ExportMap = require('../ExportMap');
 
-var _ExportMap2 = _interopRequireDefault(_ExportMap);
 
+
+
+var _ExportMap = require('../ExportMap');var _ExportMap2 = _interopRequireDefault(_ExportMap);
 var _ignore = require('eslint-module-utils/ignore');
-
-var _resolve = require('eslint-module-utils/resolve');
-
-var _resolve2 = _interopRequireDefault(_resolve);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
+var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);
 var _path = require('path');
-
-var _readPkgUp = require('read-pkg-up');
-
-var _readPkgUp2 = _interopRequireDefault(_readPkgUp);
-
-var _object = require('object.values');
-
-var _object2 = _interopRequireDefault(_object);
-
-var _arrayIncludes = require('array-includes');
-
-var _arrayIncludes2 = _interopRequireDefault(_arrayIncludes);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } } /**
-                                                                                                                                                                                                 * @fileOverview Ensures that modules contain exports and/or all
-                                                                                                                                                                                                 * modules are consumed within other modules.
-                                                                                                                                                                                                 * @author René Fermann
-                                                                                                                                                                                                 */
-
-// eslint/lib/util/glob-util has been moved to eslint/lib/util/glob-utils with version 5.3
+var _readPkgUp = require('read-pkg-up');var _readPkgUp2 = _interopRequireDefault(_readPkgUp);
+var _object = require('object.values');var _object2 = _interopRequireDefault(_object);
+var _arrayIncludes = require('array-includes');var _arrayIncludes2 = _interopRequireDefault(_arrayIncludes);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _toConsumableArray(arr) {if (Array.isArray(arr)) {for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];return arr2;} else {return Array.from(arr);}} /**
+                                                                                                                                                                                                                                                                                                                                                                                                   * @fileOverview Ensures that modules contain exports and/or all
+                                                                                                                                                                                                                                                                                                                                                                                                   * modules are consumed within other modules.
+                                                                                                                                                                                                                                                                                                                                                                                                   * @author René Fermann
+                                                                                                                                                                                                                                                                                                                                                                                                   */ // eslint/lib/util/glob-util has been moved to eslint/lib/util/glob-utils with version 5.3
 // and has been moved to eslint/lib/cli-engine/file-enumerator in version 6
-let listFilesToProcess;
-try {
-  const FileEnumerator = require('eslint/lib/cli-engine/file-enumerator').FileEnumerator;
+let listFilesToProcess;try {const FileEnumerator = require('eslint/lib/cli-engine/file-enumerator').FileEnumerator;
   listFilesToProcess = function (src, extensions) {
     const e = new FileEnumerator({
-      extensions: extensions
-    });
-    return Array.from(e.iterateFiles(src), (_ref) => {
-      let filePath = _ref.filePath,
-          ignored = _ref.ignored;
-      return {
+      extensions: extensions });
+
+    return Array.from(e.iterateFiles(src), (_ref) => {let filePath = _ref.filePath,ignored = _ref.ignored;return {
         ignored,
-        filename: filePath
-      };
-    });
+        filename: filePath };});
+
   };
 } catch (e1) {
   // Prevent passing invalid options (extensions array) to old versions of the function.
@@ -63,8 +36,8 @@
     originalListFilesToProcess = require('eslint/lib/util/glob-utils').listFilesToProcess;
     listFilesToProcess = function (src, extensions) {
       return originalListFilesToProcess(src, {
-        extensions: extensions
-      });
+        extensions: extensions });
+
     };
   } catch (e2) {
     originalListFilesToProcess = require('eslint/lib/util/glob-util').listFilesToProcess;
@@ -72,8 +45,7 @@
     listFilesToProcess = function (src, extensions) {
       const patterns = src.reduce((carry, pattern) => {
         return carry.concat(extensions.map(extension => {
-          return (/\*\*|\*\./.test(pattern) ? pattern : `${pattern}/**/*${extension}`
-          );
+          return (/\*\*|\*\./.test(pattern) ? pattern : `${pattern}/**/*${extension}`);
         }));
       }, src.slice());
 
@@ -91,24 +63,93 @@
 const VARIABLE_DECLARATION = 'VariableDeclaration';
 const FUNCTION_DECLARATION = 'FunctionDeclaration';
 const CLASS_DECLARATION = 'ClassDeclaration';
-const DEFAULT = 'default';
+const INTERFACE_DECLARATION = 'InterfaceDeclaration';
 const TYPE_ALIAS = 'TypeAlias';
+const TS_INTERFACE_DECLARATION = 'TSInterfaceDeclaration';
+const TS_TYPE_ALIAS_DECLARATION = 'TSTypeAliasDeclaration';
+const TS_ENUM_DECLARATION = 'TSEnumDeclaration';
+const DEFAULT = 'default';
 
+function forEachDeclarationIdentifier(declaration, cb) {
+  if (declaration) {
+    if (
+    declaration.type === FUNCTION_DECLARATION ||
+    declaration.type === CLASS_DECLARATION ||
+    declaration.type === INTERFACE_DECLARATION ||
+    declaration.type === TYPE_ALIAS ||
+    declaration.type === TS_INTERFACE_DECLARATION ||
+    declaration.type === TS_TYPE_ALIAS_DECLARATION ||
+    declaration.type === TS_ENUM_DECLARATION)
+    {
+      cb(declaration.id.name);
+    } else if (declaration.type === VARIABLE_DECLARATION) {
+      declaration.declarations.forEach((_ref2) => {let id = _ref2.id;
+        cb(id.name);
+      });
+    }
+  }
+}
+
+/**
+   * List of imports per file.
+   *
+   * Represented by a two-level Map to a Set of identifiers. The upper-level Map
+   * keys are the paths to the modules containing the imports, while the
+   * lower-level Map keys are the paths to the files which are being imported
+   * from. Lastly, the Set of identifiers contains either names being imported
+   * or a special AST node name listed above (e.g ImportDefaultSpecifier).
+   *
+   * For example, if we have a file named foo.js containing:
+   *
+   *   import { o2 } from './bar.js';
+   *
+   * Then we will have a structure that looks like:
+   *
+   *   Map { 'foo.js' => Map { 'bar.js' => Set { 'o2' } } }
+   *
+   * @type {Map<string, Map<string, Set<string>>>}
+   */
 const importList = new Map();
+
+/**
+                               * List of exports per file.
+                               *
+                               * Represented by a two-level Map to an object of metadata. The upper-level Map
+                               * keys are the paths to the modules containing the exports, while the
+                               * lower-level Map keys are the specific identifiers or special AST node names
+                               * being exported. The leaf-level metadata object at the moment only contains a
+                               * `whereUsed` propoerty, which contains a Set of paths to modules that import
+                               * the name.
+                               *
+                               * For example, if we have a file named bar.js containing the following exports:
+                               *
+                               *   const o2 = 'bar';
+                               *   export { o2 };
+                               *
+                               * And a file named foo.js containing the following import:
+                               *
+                               *   import { o2 } from './bar.js';
+                               *
+                               * Then we will have a structure that looks like:
+                               *
+                               *   Map { 'bar.js' => Map { 'o2' => { whereUsed: Set { 'foo.js' } } } }
+                               *
+                               * @type {Map<string, Map<string, object>>}
+                               */
 const exportList = new Map();
+
 const ignoredFiles = new Set();
 const filesOutsideSrc = new Set();
 
 const isNodeModule = path => {
-  return (/\/(node_modules)\//.test(path)
-  );
+  return (/\/(node_modules)\//.test(path));
 };
 
 /**
- * read all files matching the patterns in src and ignoreExports
- *
- * return all files matching src pattern, which are not matching the ignoreExports pattern
- */
+    * read all files matching the patterns in src and ignoreExports
+    *
+    * return all files matching src pattern, which are not matching the ignoreExports pattern
+    */
 const resolveFiles = (src, ignoreExports, context) => {
   const extensions = Array.from((0, _ignore.getFileExtensions)(context.settings));
 
@@ -117,40 +158,28 @@
 
   // prepare list of ignored files
   const ignoredFilesList = listFilesToProcess(ignoreExports, extensions);
-  ignoredFilesList.forEach((_ref2) => {
-    let filename = _ref2.filename;
-    return ignoredFiles.add(filename);
-  });
+  ignoredFilesList.forEach((_ref3) => {let filename = _ref3.filename;return ignoredFiles.add(filename);});
 
   // prepare list of source files, don't consider files from node_modules
-  srcFileList.filter((_ref3) => {
-    let filename = _ref3.filename;
-    return !isNodeModule(filename);
-  }).forEach((_ref4) => {
-    let filename = _ref4.filename;
-
+  srcFileList.filter((_ref4) => {let filename = _ref4.filename;return !isNodeModule(filename);}).forEach((_ref5) => {let filename = _ref5.filename;
     srcFiles.add(filename);
   });
   return srcFiles;
 };
 
 /**
- * parse all source files and build up 2 maps containing the existing imports and exports
- */
+    * parse all source files and build up 2 maps containing the existing imports and exports
+    */
 const prepareImportsAndExports = (srcFiles, context) => {
   const exportAll = new Map();
   srcFiles.forEach(file => {
     const exports = new Map();
     const imports = new Map();
     const currentExports = _ExportMap2.default.get(file, context);
-    if (currentExports) {
-      const dependencies = currentExports.dependencies,
-            reexports = currentExports.reexports,
-            localImportList = currentExports.imports,
-            namespace = currentExports.namespace;
+    if (currentExports) {const
+      dependencies = currentExports.dependencies,reexports = currentExports.reexports,localImportList = currentExports.imports,namespace = currentExports.namespace;
 
       // dependencies === export * from
-
       const currentExportAll = new Set();
       dependencies.forEach(getDependency => {
         const dependency = getDependency();
@@ -191,7 +220,13 @@
         if (isNodeModule(key)) {
           return;
         }
-        imports.set(key, value.importedSpecifiers);
+        let localImport = imports.get(key);
+        if (typeof localImport !== 'undefined') {
+          localImport = new Set([].concat(_toConsumableArray(localImport), _toConsumableArray(value.importedSpecifiers)));
+        } else {
+          localImport = value.importedSpecifiers;
+        }
+        imports.set(key, localImport);
       });
       importList.set(file, imports);
 
@@ -221,9 +256,9 @@
 };
 
 /**
- * traverse through all imports and add the respective path to the whereUsed-list
- * of the corresponding export
- */
+    * traverse through all imports and add the respective path to the whereUsed-list
+    * of the corresponding export
+    */
 const determineUsage = () => {
   importList.forEach((listValue, listKey) => {
     listValue.forEach((value, key) => {
@@ -240,9 +275,8 @@
           }
           if (typeof specifier !== 'undefined') {
             const exportStatement = exports.get(specifier);
-            if (typeof exportStatement !== 'undefined') {
-              const whereUsed = exportStatement.whereUsed;
-
+            if (typeof exportStatement !== 'undefined') {const
+              whereUsed = exportStatement.whereUsed;
               whereUsed.add(listKey);
               exports.set(specifier, { whereUsed });
             }
@@ -261,17 +295,17 @@
 };
 
 /**
- * prepare the lists of existing imports and exports - should only be executed once at
- * the start of a new eslint run
- */
+    * prepare the lists of existing imports and exports - should only be executed once at
+    * the start of a new eslint run
+    */
 let srcFiles;
 let lastPrepareKey;
 const doPreparation = (src, ignoreExports, context) => {
   const prepareKey = JSON.stringify({
     src: (src || []).sort(),
     ignoreExports: (ignoreExports || []).sort(),
-    extensions: Array.from((0, _ignore.getFileExtensions)(context.settings)).sort()
-  });
+    extensions: Array.from((0, _ignore.getFileExtensions)(context.settings)).sort() });
+
   if (prepareKey === lastPrepareKey) {
     return;
   }
@@ -287,22 +321,14 @@
   lastPrepareKey = prepareKey;
 };
 
-const newNamespaceImportExists = specifiers => specifiers.some((_ref5) => {
-  let type = _ref5.type;
-  return type === IMPORT_NAMESPACE_SPECIFIER;
-});
+const newNamespaceImportExists = specifiers =>
+specifiers.some((_ref6) => {let type = _ref6.type;return type === IMPORT_NAMESPACE_SPECIFIER;});
 
-const newDefaultImportExists = specifiers => specifiers.some((_ref6) => {
-  let type = _ref6.type;
-  return type === IMPORT_DEFAULT_SPECIFIER;
-});
+const newDefaultImportExists = specifiers =>
+specifiers.some((_ref7) => {let type = _ref7.type;return type === IMPORT_DEFAULT_SPECIFIER;});
 
-const fileIsInPkg = file => {
-  var _readPkgUp$sync = _readPkgUp2.default.sync({ cwd: file, normalize: false });
-
-  const path = _readPkgUp$sync.path,
-        pkg = _readPkgUp$sync.pkg;
-
+const fileIsInPkg = file => {var _readPkgUp$sync =
+  _readPkgUp2.default.sync({ cwd: file, normalize: false });const path = _readPkgUp$sync.path,pkg = _readPkgUp$sync.pkg;
   const basePath = (0, _path.dirname)(path);
 
   const checkPkgFieldString = pkgField => {
@@ -365,71 +391,70 @@
           minItems: 1,
           items: {
             type: 'string',
-            minLength: 1
-          }
-        },
+            minLength: 1 } },
+
+
         ignoreExports: {
-          description: 'files/paths for which unused exports will not be reported (e.g module entry points)',
+          description:
+          'files/paths for which unused exports will not be reported (e.g module entry points)',
           type: 'array',
           minItems: 1,
           items: {
             type: 'string',
-            minLength: 1
-          }
-        },
+            minLength: 1 } },
+
+
         missingExports: {
           description: 'report modules without any exports',
-          type: 'boolean'
-        },
+          type: 'boolean' },
+
         unusedExports: {
           description: 'report exports without any usage',
-          type: 'boolean'
-        }
-      },
+          type: 'boolean' } },
+
+
       not: {
         properties: {
           unusedExports: { enum: [false] },
-          missingExports: { enum: [false] }
-        }
-      },
+          missingExports: { enum: [false] } } },
+
+
       anyOf: [{
         not: {
           properties: {
-            unusedExports: { enum: [true] }
-          }
-        },
-        required: ['missingExports']
-      }, {
+            unusedExports: { enum: [true] } } },
+
+
+        required: ['missingExports'] },
+      {
         not: {
           properties: {
-            missingExports: { enum: [true] }
-          }
-        },
-        required: ['unusedExports']
-      }, {
+            missingExports: { enum: [true] } } },
+
+
+        required: ['unusedExports'] },
+      {
         properties: {
-          unusedExports: { enum: [true] }
-        },
-        required: ['unusedExports']
-      }, {
+          unusedExports: { enum: [true] } },
+
+        required: ['unusedExports'] },
+      {
         properties: {
-          missingExports: { enum: [true] }
-        },
-        required: ['missingExports']
-      }]
-    }]
-  },
+          missingExports: { enum: [true] } },
 
-  create: context => {
-    var _ref7 = context.options[0] || {};
+        required: ['missingExports'] }] }] },
 
-    const src = _ref7.src;
-    var _ref7$ignoreExports = _ref7.ignoreExports;
-    const ignoreExports = _ref7$ignoreExports === undefined ? [] : _ref7$ignoreExports,
-          missingExports = _ref7.missingExports,
-          unusedExports = _ref7.unusedExports;
 
 
+
+  create: context => {var _ref8 =
+
+
+
+
+
+    context.options[0] || {};const src = _ref8.src;var _ref8$ignoreExports = _ref8.ignoreExports;const ignoreExports = _ref8$ignoreExports === undefined ? [] : _ref8$ignoreExports,missingExports = _ref8.missingExports,unusedExports = _ref8.unusedExports;
+
     if (unusedExports) {
       doPreparation(src, ignoreExports, context);
     }
@@ -504,24 +529,33 @@
         }
       }
 
-      const exportStatement = exports.get(exportedValue);
+      // exportsList will always map any imported value of 'default' to 'ImportDefaultSpecifier'
+      const exportsKey = exportedValue === DEFAULT ? IMPORT_DEFAULT_SPECIFIER : exportedValue;
 
-      const value = exportedValue === IMPORT_DEFAULT_SPECIFIER ? DEFAULT : exportedValue;
+      const exportStatement = exports.get(exportsKey);
+
+      const value = exportsKey === IMPORT_DEFAULT_SPECIFIER ? DEFAULT : exportsKey;
 
       if (typeof exportStatement !== 'undefined') {
         if (exportStatement.whereUsed.size < 1) {
-          context.report(node, `exported declaration '${value}' not used within other modules`);
+          context.report(
+          node,
+          `exported declaration '${value}' not used within other modules`);
+
         }
       } else {
-        context.report(node, `exported declaration '${value}' not used within other modules`);
+        context.report(
+        node,
+        `exported declaration '${value}' not used within other modules`);
+
       }
     };
 
     /**
-     * only useful for tools like vscode-eslint
-     *
-     * update lists of existing exports during runtime
-     */
+        * only useful for tools like vscode-eslint
+        *
+        * update lists of existing exports during runtime
+        */
     const updateExportUsage = node => {
       if (ignoredFiles.has(file)) {
         return;
@@ -538,11 +572,7 @@
       const newExports = new Map();
       const newExportIdentifiers = new Set();
 
-      node.body.forEach((_ref8) => {
-        let type = _ref8.type,
-            declaration = _ref8.declaration,
-            specifiers = _ref8.specifiers;
-
+      node.body.forEach((_ref9) => {let type = _ref9.type,declaration = _ref9.declaration,specifiers = _ref9.specifiers;
         if (type === EXPORT_DEFAULT_DECLARATION) {
           newExportIdentifiers.add(IMPORT_DEFAULT_SPECIFIER);
         }
@@ -554,18 +584,9 @@
               }
             });
           }
-          if (declaration) {
-            if (declaration.type === FUNCTION_DECLARATION || declaration.type === CLASS_DECLARATION || declaration.type === TYPE_ALIAS) {
-              newExportIdentifiers.add(declaration.id.name);
-            }
-            if (declaration.type === VARIABLE_DECLARATION) {
-              declaration.declarations.forEach((_ref9) => {
-                let id = _ref9.id;
-
-                newExportIdentifiers.add(id.name);
-              });
-            }
-          }
+          forEachDeclarationIdentifier(declaration, name => {
+            newExportIdentifiers.add(name);
+          });
         }
       });
 
@@ -597,10 +618,10 @@
     };
 
     /**
-     * only useful for tools like vscode-eslint
-     *
-     * update lists of existing imports during runtime
-     */
+        * only useful for tools like vscode-eslint
+        *
+        * update lists of existing imports during runtime
+        */
     const updateImportUsage = node => {
       if (!unusedExports) {
         return;
@@ -633,7 +654,8 @@
           oldDefaultImports.add(key);
         }
         value.forEach(val => {
-          if (val !== IMPORT_NAMESPACE_SPECIFIER && val !== IMPORT_DEFAULT_SPECIFIER) {
+          if (val !== IMPORT_NAMESPACE_SPECIFIER &&
+          val !== IMPORT_DEFAULT_SPECIFIER) {
             oldImports.set(val, key);
           }
         });
@@ -647,13 +669,12 @@
           if (astNode.source) {
             resolvedPath = (0, _resolve2.default)(astNode.source.raw.replace(/('|")/g, ''), context);
             astNode.specifiers.forEach(specifier => {
-              let name;
-              if (specifier.exported.name === DEFAULT) {
-                name = IMPORT_DEFAULT_SPECIFIER;
+              const name = specifier.local.name;
+              if (specifier.local.name === DEFAULT) {
+                newDefaultImports.add(resolvedPath);
               } else {
-                name = specifier.local.name;
+                newImports.set(name, resolvedPath);
               }
-              newImports.set(name, resolvedPath);
             });
           }
         }
@@ -682,7 +703,8 @@
           }
 
           astNode.specifiers.forEach(specifier => {
-            if (specifier.type === IMPORT_DEFAULT_SPECIFIER || specifier.type === IMPORT_NAMESPACE_SPECIFIER) {
+            if (specifier.type === IMPORT_DEFAULT_SPECIFIER ||
+            specifier.type === IMPORT_NAMESPACE_SPECIFIER) {
               return;
             }
             newImports.set(specifier.imported.name, resolvedPath);
@@ -876,18 +898,10 @@
         node.specifiers.forEach(specifier => {
           checkUsage(node, specifier.exported.name);
         });
-        if (node.declaration) {
-          if (node.declaration.type === FUNCTION_DECLARATION || node.declaration.type === CLASS_DECLARATION || node.declaration.type === TYPE_ALIAS) {
-            checkUsage(node, node.declaration.id.name);
-          }
-          if (node.declaration.type === VARIABLE_DECLARATION) {
-            node.declaration.declarations.forEach(declaration => {
-              checkUsage(node, declaration.id.name);
-            });
-          }
-        }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11bnVzZWQtbW9kdWxlcy5qcyJdLCJuYW1lcyI6WyJsaXN0RmlsZXNUb1Byb2Nlc3MiLCJGaWxlRW51bWVyYXRvciIsInJlcXVpcmUiLCJzcmMiLCJleHRlbnNpb25zIiwiZSIsIkFycmF5IiwiZnJvbSIsIml0ZXJhdGVGaWxlcyIsImZpbGVQYXRoIiwiaWdub3JlZCIsImZpbGVuYW1lIiwiZTEiLCJvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyIsImUyIiwicGF0dGVybnMiLCJyZWR1Y2UiLCJjYXJyeSIsInBhdHRlcm4iLCJjb25jYXQiLCJtYXAiLCJleHRlbnNpb24iLCJ0ZXN0Iiwic2xpY2UiLCJFWFBPUlRfREVGQVVMVF9ERUNMQVJBVElPTiIsIkVYUE9SVF9OQU1FRF9ERUNMQVJBVElPTiIsIkVYUE9SVF9BTExfREVDTEFSQVRJT04iLCJJTVBPUlRfREVDTEFSQVRJT04iLCJJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiIsIklNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiIsIlZBUklBQkxFX0RFQ0xBUkFUSU9OIiwiRlVOQ1RJT05fREVDTEFSQVRJT04iLCJDTEFTU19ERUNMQVJBVElPTiIsIkRFRkFVTFQiLCJUWVBFX0FMSUFTIiwiaW1wb3J0TGlzdCIsIk1hcCIsImV4cG9ydExpc3QiLCJpZ25vcmVkRmlsZXMiLCJTZXQiLCJmaWxlc091dHNpZGVTcmMiLCJpc05vZGVNb2R1bGUiLCJwYXRoIiwicmVzb2x2ZUZpbGVzIiwiaWdub3JlRXhwb3J0cyIsImNvbnRleHQiLCJzZXR0aW5ncyIsInNyY0ZpbGVzIiwic3JjRmlsZUxpc3QiLCJpZ25vcmVkRmlsZXNMaXN0IiwiZm9yRWFjaCIsImFkZCIsImZpbHRlciIsInByZXBhcmVJbXBvcnRzQW5kRXhwb3J0cyIsImV4cG9ydEFsbCIsImZpbGUiLCJleHBvcnRzIiwiaW1wb3J0cyIsImN1cnJlbnRFeHBvcnRzIiwiRXhwb3J0cyIsImdldCIsImRlcGVuZGVuY2llcyIsInJlZXhwb3J0cyIsImxvY2FsSW1wb3J0TGlzdCIsIm5hbWVzcGFjZSIsImN1cnJlbnRFeHBvcnRBbGwiLCJnZXREZXBlbmRlbmN5IiwiZGVwZW5kZW5jeSIsInNldCIsInZhbHVlIiwia2V5Iiwid2hlcmVVc2VkIiwicmVleHBvcnQiLCJnZXRJbXBvcnQiLCJsb2NhbEltcG9ydCIsImN1cnJlbnRWYWx1ZSIsImxvY2FsIiwiaW1wb3J0ZWRTcGVjaWZpZXJzIiwiaGFzIiwidmFsIiwiY3VycmVudEV4cG9ydCIsImRldGVybWluZVVzYWdlIiwibGlzdFZhbHVlIiwibGlzdEtleSIsImN1cnJlbnRJbXBvcnQiLCJzcGVjaWZpZXIiLCJleHBvcnRTdGF0ZW1lbnQiLCJnZXRTcmMiLCJwcm9jZXNzIiwiY3dkIiwibGFzdFByZXBhcmVLZXkiLCJkb1ByZXBhcmF0aW9uIiwicHJlcGFyZUtleSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzb3J0IiwiY2xlYXIiLCJuZXdOYW1lc3BhY2VJbXBvcnRFeGlzdHMiLCJzcGVjaWZpZXJzIiwic29tZSIsInR5cGUiLCJuZXdEZWZhdWx0SW1wb3J0RXhpc3RzIiwiZmlsZUlzSW5Qa2ciLCJyZWFkUGtnVXAiLCJzeW5jIiwibm9ybWFsaXplIiwicGtnIiwiYmFzZVBhdGgiLCJjaGVja1BrZ0ZpZWxkU3RyaW5nIiwicGtnRmllbGQiLCJjaGVja1BrZ0ZpZWxkT2JqZWN0IiwicGtnRmllbGRGaWxlcyIsImNoZWNrUGtnRmllbGQiLCJwcml2YXRlIiwiYmluIiwiYnJvd3NlciIsIm1haW4iLCJtb2R1bGUiLCJtZXRhIiwiZG9jcyIsInVybCIsInNjaGVtYSIsInByb3BlcnRpZXMiLCJkZXNjcmlwdGlvbiIsIm1pbkl0ZW1zIiwiaXRlbXMiLCJtaW5MZW5ndGgiLCJtaXNzaW5nRXhwb3J0cyIsInVudXNlZEV4cG9ydHMiLCJub3QiLCJlbnVtIiwiYW55T2YiLCJyZXF1aXJlZCIsImNyZWF0ZSIsIm9wdGlvbnMiLCJnZXRGaWxlbmFtZSIsImNoZWNrRXhwb3J0UHJlc2VuY2UiLCJub2RlIiwiZXhwb3J0Q291bnQiLCJuYW1lc3BhY2VJbXBvcnRzIiwiZGVsZXRlIiwic2l6ZSIsInJlcG9ydCIsImJvZHkiLCJjaGVja1VzYWdlIiwiZXhwb3J0ZWRWYWx1ZSIsInVwZGF0ZUV4cG9ydFVzYWdlIiwibmV3RXhwb3J0cyIsIm5ld0V4cG9ydElkZW50aWZpZXJzIiwiZGVjbGFyYXRpb24iLCJsZW5ndGgiLCJleHBvcnRlZCIsIm5hbWUiLCJpZCIsImRlY2xhcmF0aW9ucyIsInVwZGF0ZUltcG9ydFVzYWdlIiwib2xkSW1wb3J0UGF0aHMiLCJvbGROYW1lc3BhY2VJbXBvcnRzIiwibmV3TmFtZXNwYWNlSW1wb3J0cyIsIm9sZEV4cG9ydEFsbCIsIm5ld0V4cG9ydEFsbCIsIm9sZERlZmF1bHRJbXBvcnRzIiwibmV3RGVmYXVsdEltcG9ydHMiLCJvbGRJbXBvcnRzIiwibmV3SW1wb3J0cyIsImFzdE5vZGUiLCJyZXNvbHZlZFBhdGgiLCJzb3VyY2UiLCJyYXciLCJyZXBsYWNlIiwiaW1wb3J0ZWQiXSwibWFwcGluZ3MiOiI7O0FBTUE7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Z01BYkE7Ozs7OztBQWVBO0FBQ0E7QUFDQSxJQUFJQSxrQkFBSjtBQUNBLElBQUk7QUFDRixRQUFNQyxpQkFBaUJDLFFBQVEsdUNBQVIsRUFBaURELGNBQXhFO0FBQ0FELHVCQUFxQixVQUFVRyxHQUFWLEVBQWVDLFVBQWYsRUFBMkI7QUFDOUMsVUFBTUMsSUFBSSxJQUFJSixjQUFKLENBQW1CO0FBQzNCRyxrQkFBWUE7QUFEZSxLQUFuQixDQUFWO0FBR0EsV0FBT0UsTUFBTUMsSUFBTixDQUFXRixFQUFFRyxZQUFGLENBQWVMLEdBQWYsQ0FBWCxFQUFnQztBQUFBLFVBQUdNLFFBQUgsUUFBR0EsUUFBSDtBQUFBLFVBQWFDLE9BQWIsUUFBYUEsT0FBYjtBQUFBLGFBQTRCO0FBQ2pFQSxlQURpRTtBQUVqRUMsa0JBQVVGO0FBRnVELE9BQTVCO0FBQUEsS0FB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QW9EO0FBQ2xEMkcsaUJBQUtZLFdBQUwsQ0FBaUJLLFlBQWpCLENBQThCeEcsT0FBOUIsQ0FBc0NtRyxlQUFlO0FBQ25ETCx5QkFBV1AsSUFBWCxFQUFpQlksWUFBWUksRUFBWixDQUFlRCxJQUFoQztBQUNELGFBRkQ7QUFHRDtBQUNGO0FBQ0Y7QUEzQkksS0FBUDtBQTZCRDtBQWhpQmMsQ0FBakIiLCJmaWxlIjoibm8tdW51c2VkLW1vZHVsZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlT3ZlcnZpZXcgRW5zdXJlcyB0aGF0IG1vZHVsZXMgY29udGFpbiBleHBvcnRzIGFuZC9vciBhbGxcbiAqIG1vZHVsZXMgYXJlIGNvbnN1bWVkIHdpdGhpbiBvdGhlciBtb2R1bGVzLlxuICogQGF1dGhvciBSZW7DqSBGZXJtYW5uXG4gKi9cblxuaW1wb3J0IEV4cG9ydHMgZnJvbSAnLi4vRXhwb3J0TWFwJ1xuaW1wb3J0IHsgZ2V0RmlsZUV4dGVuc2lvbnMgfSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL2lnbm9yZSdcbmltcG9ydCByZXNvbHZlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVzb2x2ZSdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAncGF0aCdcbmltcG9ydCByZWFkUGtnVXAgZnJvbSAncmVhZC1wa2ctdXAnXG5pbXBvcnQgdmFsdWVzIGZyb20gJ29iamVjdC52YWx1ZXMnXG5pbXBvcnQgaW5jbHVkZXMgZnJvbSAnYXJyYXktaW5jbHVkZXMnXG5cbi8vIGVzbGludC9saWIvdXRpbC9nbG9iLXV0aWwgaGFzIGJlZW4gbW92ZWQgdG8gZXNsaW50L2xpYi91dGlsL2dsb2ItdXRpbHMgd2l0aCB2ZXJzaW9uIDUuM1xuLy8gYW5kIGhhcyBiZWVuIG1vdmVkIHRvIGVzbGludC9saWIvY2xpLWVuZ2luZS9maWxlLWVudW1lcmF0b3IgaW4gdmVyc2lvbiA2XG5sZXQgbGlzdEZpbGVzVG9Qcm9jZXNzXG50cnkge1xuICBjb25zdCBGaWxlRW51bWVyYXRvciA9IHJlcXVpcmUoJ2VzbGludC9saWIvY2xpLWVuZ2luZS9maWxlLWVudW1lcmF0b3InKS5GaWxlRW51bWVyYXRvclxuICBsaXN0RmlsZXNUb1Byb2Nlc3MgPSBmdW5jdGlvbiAoc3JjLCBleHRlbnNpb25zKSB7XG4gICAgY29uc3QgZSA9IG5ldyBGaWxlRW51bWVyYXRvcih7XG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLFxuICAgIH0pXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZS5pdGVyYXRlRmlsZXMoc3JjKSwgKHsgZmlsZVBhdGgsIGlnbm9yZWQgfSkgPT4gKHtcbiAgICAgIGlnbm9yZWQsXG4gICAgICBmaWxlbmFtZTogZmlsZVBhdGgsXG4gICAgfSkpXG4gIH1cbn0gY2F0Y2ggKGUxKSB7XG4gIC8vIFByZXZlbnQgcGFzc2luZyBpbnZhbGlkIG9wdGlvbnMgKGV4dGVuc2lvbnMgYXJyYXkpIHRvIG9sZCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvdjUuMTYuMC9saWIvdXRpbC9nbG9iLXV0aWxzLmpzI0wxNzgtTDI4MFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL3Y1LjIuMC9saWIvdXRpbC9nbG9iLXV0aWwuanMjTDE3NC1MMjY5XG4gIGxldCBvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2Vzc1xuICB0cnkge1xuICAgIG9yaWdpbmFsTGlzdEZpbGVzVG9Qcm9jZXNzID0gcmVxdWlyZSgnZXNsaW50L2xpYi91dGlsL2dsb2ItdXRpbHMnKS5saXN0RmlsZXNUb1Byb2Nlc3NcbiAgICBsaXN0RmlsZXNUb1Byb2Nlc3MgPSBmdW5jdGlvbiAoc3JjLCBleHRlbnNpb25zKSB7XG4gICAgICByZXR1cm4gb3JpZ2luYWxMaXN0RmlsZXNUb1Byb2Nlc3Moc3JjLCB7XG4gICAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMsXG4gICAgICB9KVxuICAgIH1cbiAgfSBjYXRjaCAoZTIpIHtcbiAgICBvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyA9IHJlcXVpcmUoJ2VzbGludC9saWIvdXRpbC9nbG9iLXV0aWwnKS5saXN0RmlsZXNUb1Byb2Nlc3NcblxuICAgIGxpc3RGaWxlc1RvUHJvY2VzcyA9IGZ1bmN0aW9uIChzcmMsIGV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gc3JjLnJlZHVjZSgoY2FycnksIHBhdHRlcm4pID0+IHtcbiAgICAgICAgcmV0dXJuIGNhcnJ5LmNvbmNhdChleHRlbnNpb25zLm1hcCgoZXh0ZW5zaW9uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIC9cXCpcXCp8XFwqXFwuLy50ZXN0KHBhdHRlcm4pID8gcGF0dGVybiA6IGAke3BhdHRlcm59LyoqLyoke2V4dGVuc2lvbn1gXG4gICAgICAgIH0pKVxuICAgICAgfSwgc3JjLnNsaWNlKCkpXG5cbiAgICAgIHJldHVybiBvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyhwYXR0ZXJucylcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgRVhQT1JUX0RFRkFVTFRfREVDTEFSQVRJT04gPSAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJ1xuY29uc3QgRVhQT1JUX05BTUVEX0RFQ0xBUkFUSU9OID0gJ0V4cG9ydE5hbWVkRGVjbGFyYXRpb24nXG5jb25zdCBFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OID0gJ0V4cG9ydEFsbERlY2xhcmF0aW9uJ1xuY29uc3QgSU1QT1JUX0RFQ0xBUkFUSU9OID0gJ0ltcG9ydERlY2xhcmF0aW9uJ1xuY29uc3QgSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIgPSAnSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyJ1xuY29uc3QgSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSID0gJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInXG5jb25zdCBWQVJJQUJMRV9ERUNMQVJBVElPTiA9ICdWYXJpYWJsZURlY2xhcmF0aW9uJ1xuY29uc3QgRlVOQ1RJT05fREVDTEFSQVRJT04gPSAnRnVuY3Rpb25EZWNsYXJhdGlvbidcbmNvbnN0IENMQVNTX0RFQ0xBUkFUSU9OID0gJ0NsYXNzRGVjbGFyYXRpb24nXG5jb25zdCBERUZBVUxUID0gJ2RlZmF1bHQnXG5jb25zdCBUWVBFX0FMSUFTID0gJ1R5cGVBbGlhcydcblxuY29uc3QgaW1wb3J0TGlzdCA9IG5ldyBNYXAoKVxuY29uc3QgZXhwb3J0TGlzdCA9IG5ldyBNYXAoKVxuY29uc3QgaWdub3JlZEZpbGVzID0gbmV3IFNldCgpXG5jb25zdCBmaWxlc091dHNpZGVTcmMgPSBuZXcgU2V0KClcblxuY29uc3QgaXNOb2RlTW9kdWxlID0gcGF0aCA9PiB7XG4gIHJldHVybiAvXFwvKG5vZGVfbW9kdWxlcylcXC8vLnRlc3QocGF0aClcbn1cblxuLyoqXG4gKiByZWFkIGFsbCBmaWxlcyBtYXRjaGluZyB0aGUgcGF0dGVybnMgaW4gc3JjIGFuZCBpZ25vcmVFeHBvcnRzXG4gKlxuICogcmV0dXJuIGFsbCBmaWxlcyBtYXRjaGluZyBzcmMgcGF0dGVybiwgd2hpY2ggYXJlIG5vdCBtYXRjaGluZyB0aGUgaWdub3JlRXhwb3J0cyBwYXR0ZXJuXG4gKi9cbmNvbnN0IHJlc29sdmVGaWxlcyA9IChzcmMsIGlnbm9yZUV4cG9ydHMsIGNvbnRleHQpID0+IHtcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IEFycmF5LmZyb20oZ2V0RmlsZUV4dGVuc2lvbnMoY29udGV4dC5zZXR0aW5ncykpXG5cbiAgY29uc3Qgc3JjRmlsZXMgPSBuZXcgU2V0KClcbiAgY29uc3Qgc3JjRmlsZUxpc3QgPSBsaXN0RmlsZXNUb1Byb2Nlc3Moc3JjLCBleHRlbnNpb25zKVxuXG4gIC8vIHByZXBhcmUgbGlzdCBvZiBpZ25vcmVkIGZpbGVzXG4gIGNvbnN0IGlnbm9yZWRGaWxlc0xpc3QgPSAgbGlzdEZpbGVzVG9Qcm9jZXNzKGlnbm9yZUV4cG9ydHMsIGV4dGVuc2lvbnMpXG4gIGlnbm9yZWRGaWxlc0xpc3QuZm9yRWFjaCgoeyBmaWxlbmFtZSB9KSA9PiBpZ25vcmVkRmlsZXMuYWRkKGZpbGVuYW1lKSlcblxuICAvLyBwcmVwYXJlIGxpc3Qgb2Ygc291cmNlIGZpbGVzLCBkb24ndCBjb25zaWRlciBmaWxlcyBmcm9tIG5vZGVfbW9kdWxlc1xuICBzcmNGaWxlTGlzdC5maWx0ZXIoKHsgZmlsZW5hbWUgfSkgPT4gIWlzTm9kZU1vZHVsZShmaWxlbmFtZSkpLmZvckVhY2goKHsgZmlsZW5hbWUgfSkgPT4ge1xuICAgIHNyY0ZpbGVzLmFkZChmaWxlbmFtZSlcbiAgfSlcbiAgcmV0dXJuIHNyY0ZpbGVzXG59XG5cbi8qKlxuICogcGFyc2UgYWxsIHNvdXJjZSBmaWxlcyBhbmQgYnVpbGQgdXAgMiBtYXBzIGNvbnRhaW5pbmcgdGhlIGV4aXN0aW5nIGltcG9ydHMgYW5kIGV4cG9ydHNcbiAqL1xuY29uc3QgcHJlcGFyZUltcG9ydHNBbmRFeHBvcnRzID0gKHNyY0ZpbGVzLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IGV4cG9ydEFsbCA9IG5ldyBNYXAoKVxuICBzcmNGaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBuZXcgTWFwKClcbiAgICBjb25zdCBpbXBvcnRzID0gbmV3IE1hcCgpXG4gICAgY29uc3QgY3VycmVudEV4cG9ydHMgPSBFeHBvcnRzLmdldChmaWxlLCBjb250ZXh0KVxuICAgIGlmIChjdXJyZW50RXhwb3J0cykge1xuICAgICAgY29uc3QgeyBkZXBlbmRlbmNpZXMsIHJlZXhwb3J0cywgaW1wb3J0czogbG9jYWxJbXBvcnRMaXN0LCBuYW1lc3BhY2UgIH0gPSBjdXJyZW50RXhwb3J0c1xuXG4gICAgICAvLyBkZXBlbmRlbmNpZXMgPT09IGV4cG9ydCAqIGZyb21cbiAgICAgIGNvbnN0IGN1cnJlbnRFeHBvcnRBbGwgPSBuZXcgU2V0KClcbiAgICAgIGRlcGVuZGVuY2llcy5mb3JFYWNoKGdldERlcGVuZGVuY3kgPT4ge1xuICAgICAgICBjb25zdCBkZXBlbmRlbmN5ID0gZ2V0RGVwZW5kZW5jeSgpXG4gICAgICAgIGlmIChkZXBlbmRlbmN5ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50RXhwb3J0QWxsLmFkZChkZXBlbmRlbmN5LnBhdGgpXG4gICAgICB9KVxuICAgICAgZXhwb3J0QWxsLnNldChmaWxlLCBjdXJyZW50RXhwb3J0QWxsKVxuXG4gICAgICByZWV4cG9ydHMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5ID09PSBERUZBVUxUKSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSLCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVleHBvcnQgPSAgdmFsdWUuZ2V0SW1wb3J0KClcbiAgICAgICAgaWYgKCFyZWV4cG9ydCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGxldCBsb2NhbEltcG9ydCA9IGltcG9ydHMuZ2V0KHJlZXhwb3J0LnBhdGgpXG4gICAgICAgIGxldCBjdXJyZW50VmFsdWVcbiAgICAgICAgaWYgKHZhbHVlLmxvY2FsID09PSBERUZBVUxUKSB7XG4gICAgICAgICAgY3VycmVudFZhbHVlID0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudFZhbHVlID0gdmFsdWUubG9jYWxcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxvY2FsSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxvY2FsSW1wb3J0ID0gbmV3IFNldChbLi4ubG9jYWxJbXBvcnQsIGN1cnJlbnRWYWx1ZV0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9jYWxJbXBvcnQgPSBuZXcgU2V0KFtjdXJyZW50VmFsdWVdKVxuICAgICAgICB9XG4gICAgICAgIGltcG9ydHMuc2V0KHJlZXhwb3J0LnBhdGgsIGxvY2FsSW1wb3J0KVxuICAgICAgfSlcblxuICAgICAgbG9jYWxJbXBvcnRMaXN0LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGlzTm9kZU1vZHVsZShrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaW1wb3J0cy5zZXQoa2V5LCB2YWx1ZS5pbXBvcnRlZFNwZWNpZmllcnMpXG4gICAgICB9KVxuICAgICAgaW1wb3J0TGlzdC5zZXQoZmlsZSwgaW1wb3J0cylcblxuICAgICAgLy8gYnVpbGQgdXAgZXhwb3J0IGxpc3Qgb25seSwgaWYgZmlsZSBpcyBub3QgaWdub3JlZFxuICAgICAgaWYgKGlnbm9yZWRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBuYW1lc3BhY2UuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5ID09PSBERUZBVUxUKSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSLCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGV4cG9ydHMuc2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04sIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSlcbiAgICBleHBvcnRzLnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgeyB3aGVyZVVzZWQ6IG5ldyBTZXQoKSB9KVxuICAgIGV4cG9ydExpc3Quc2V0KGZpbGUsIGV4cG9ydHMpXG4gIH0pXG4gIGV4cG9ydEFsbC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgdmFsdWUuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWwpXG4gICAgICBjb25zdCBjdXJyZW50RXhwb3J0ID0gY3VycmVudEV4cG9ydHMuZ2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04pXG4gICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5hZGQoa2V5KVxuICAgIH0pXG4gIH0pXG59XG5cbi8qKlxuICogdHJhdmVyc2UgdGhyb3VnaCBhbGwgaW1wb3J0cyBhbmQgYWRkIHRoZSByZXNwZWN0aXZlIHBhdGggdG8gdGhlIHdoZXJlVXNlZC1saXN0XG4gKiBvZiB0aGUgY29ycmVzcG9uZGluZyBleHBvcnRcbiAqL1xuY29uc3QgZGV0ZXJtaW5lVXNhZ2UgPSAoKSA9PiB7XG4gIGltcG9ydExpc3QuZm9yRWFjaCgobGlzdFZhbHVlLCBsaXN0S2V5KSA9PiB7XG4gICAgbGlzdFZhbHVlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldChrZXkpXG4gICAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goY3VycmVudEltcG9ydCA9PiB7XG4gICAgICAgICAgbGV0IHNwZWNpZmllclxuICAgICAgICAgIGlmIChjdXJyZW50SW1wb3J0ID09PSBJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUikge1xuICAgICAgICAgICAgc3BlY2lmaWVyID0gSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVJcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbXBvcnQgPT09IElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUikge1xuICAgICAgICAgICAgc3BlY2lmaWVyID0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNwZWNpZmllciA9IGN1cnJlbnRJbXBvcnRcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBzcGVjaWZpZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBleHBvcnRTdGF0ZW1lbnQgPSBleHBvcnRzLmdldChzcGVjaWZpZXIpXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydFN0YXRlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyB3aGVyZVVzZWQgfSA9IGV4cG9ydFN0YXRlbWVudFxuICAgICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGxpc3RLZXkpXG4gICAgICAgICAgICAgIGV4cG9ydHMuc2V0KHNwZWNpZmllciwgeyB3aGVyZVVzZWQgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSlcbn1cblxuY29uc3QgZ2V0U3JjID0gc3JjID0+IHtcbiAgaWYgKHNyYykge1xuICAgIHJldHVybiBzcmNcbiAgfVxuICByZXR1cm4gW3Byb2Nlc3MuY3dkKCldXG59XG5cbi8qKlxuICogcHJlcGFyZSB0aGUgbGlzdHMgb2YgZXhpc3RpbmcgaW1wb3J0cyBhbmQgZXhwb3J0cyAtIHNob3VsZCBvbmx5IGJlIGV4ZWN1dGVkIG9uY2UgYXRcbiAqIHRoZSBzdGFydCBvZiBhIG5ldyBlc2xpbnQgcnVuXG4gKi9cbmxldCBzcmNGaWxlc1xubGV0IGxhc3RQcmVwYXJlS2V5XG5jb25zdCBkb1ByZXBhcmF0aW9uID0gKHNyYywgaWdub3JlRXhwb3J0cywgY29udGV4dCkgPT4ge1xuICBjb25zdCBwcmVwYXJlS2V5ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIHNyYzogKHNyYyB8fCBbXSkuc29ydCgpLFxuICAgIGlnbm9yZUV4cG9ydHM6IChpZ25vcmVFeHBvcnRzIHx8IFtdKS5zb3J0KCksXG4gICAgZXh0ZW5zaW9uczogQXJyYXkuZnJvbShnZXRGaWxlRXh0ZW5zaW9ucyhjb250ZXh0LnNldHRpbmdzKSkuc29ydCgpLFxuICB9KVxuICBpZiAocHJlcGFyZUtleSA9PT0gbGFzdFByZXBhcmVLZXkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGltcG9ydExpc3QuY2xlYXIoKVxuICBleHBvcnRMaXN0LmNsZWFyKClcbiAgaWdub3JlZEZpbGVzLmNsZWFyKClcbiAgZmlsZXNPdXRzaWRlU3JjLmNsZWFyKClcblxuICBzcmNGaWxlcyA9IHJlc29sdmVGaWxlcyhnZXRTcmMoc3JjKSwgaWdub3JlRXhwb3J0cywgY29udGV4dClcbiAgcHJlcGFyZUltcG9ydHNBbmRFeHBvcnRzKHNyY0ZpbGVzLCBjb250ZXh0KVxuICBkZXRlcm1pbmVVc2FnZSgpXG4gIGxhc3RQcmVwYXJlS2V5ID0gcHJlcGFyZUtleVxufVxuXG5jb25zdCBuZXdOYW1lc3BhY2VJbXBvcnRFeGlzdHMgPSBzcGVjaWZpZXJzID0+XG4gIHNwZWNpZmllcnMuc29tZSgoeyB0eXBlIH0pID0+IHR5cGUgPT09IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKVxuXG5jb25zdCBuZXdEZWZhdWx0SW1wb3J0RXhpc3RzID0gc3BlY2lmaWVycyA9PlxuICBzcGVjaWZpZXJzLnNvbWUoKHsgdHlwZSB9KSA9PiB0eXBlID09PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpXG5cbmNvbnN0IGZpbGVJc0luUGtnID0gZmlsZSA9PiB7XG4gIGNvbnN0IHsgcGF0aCwgcGtnIH0gPSByZWFkUGtnVXAuc3luYyh7Y3dkOiBmaWxlLCBub3JtYWxpemU6IGZhbHNlfSlcbiAgY29uc3QgYmFzZVBhdGggPSBkaXJuYW1lKHBhdGgpXG5cbiAgY29uc3QgY2hlY2tQa2dGaWVsZFN0cmluZyA9IHBrZ0ZpZWxkID0+IHtcbiAgICBpZiAoam9pbihiYXNlUGF0aCwgcGtnRmllbGQpID09PSBmaWxlKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gIH1cblxuICBjb25zdCBjaGVja1BrZ0ZpZWxkT2JqZWN0ID0gcGtnRmllbGQgPT4ge1xuICAgICAgY29uc3QgcGtnRmllbGRGaWxlcyA9IHZhbHVlcyhwa2dGaWVsZCkubWFwKHZhbHVlID0+IGpvaW4oYmFzZVBhdGgsIHZhbHVlKSlcbiAgICAgIGlmIChpbmNsdWRlcyhwa2dGaWVsZEZpbGVzLCBmaWxlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICB9XG5cbiAgY29uc3QgY2hlY2tQa2dGaWVsZCA9IHBrZ0ZpZWxkID0+IHtcbiAgICBpZiAodHlwZW9mIHBrZ0ZpZWxkID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGNoZWNrUGtnRmllbGRTdHJpbmcocGtnRmllbGQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwa2dGaWVsZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBjaGVja1BrZ0ZpZWxkT2JqZWN0KHBrZ0ZpZWxkKVxuICAgIH1cbiAgfVxuXG4gIGlmIChwa2cucHJpdmF0ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKHBrZy5iaW4pIHtcbiAgICBpZiAoY2hlY2tQa2dGaWVsZChwa2cuYmluKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICBpZiAocGtnLmJyb3dzZXIpIHtcbiAgICBpZiAoY2hlY2tQa2dGaWVsZChwa2cuYnJvd3NlcikpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgaWYgKHBrZy5tYWluKSB7XG4gICAgaWYgKGNoZWNrUGtnRmllbGRTdHJpbmcocGtnLm1haW4pKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7IHVybDogZG9jc1VybCgnbm8tdW51c2VkLW1vZHVsZXMnKSB9LFxuICAgIHNjaGVtYTogW3tcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgc3JjOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdmaWxlcy9wYXRocyB0byBiZSBhbmFseXplZCAob25seSBmb3IgdW51c2VkIGV4cG9ydHMpJyxcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIG1pbkl0ZW1zOiAxLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBpZ25vcmVFeHBvcnRzOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnZmlsZXMvcGF0aHMgZm9yIHdoaWNoIHVudXNlZCBleHBvcnRzIHdpbGwgbm90IGJlIHJlcG9ydGVkIChlLmcgbW9kdWxlIGVudHJ5IHBvaW50cyknLFxuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgbWluSXRlbXM6IDEsXG4gICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG1pc3NpbmdFeHBvcnRzOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdyZXBvcnQgbW9kdWxlcyB3aXRob3V0IGFueSBleHBvcnRzJyxcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIH0sXG4gICAgICAgIHVudXNlZEV4cG9ydHM6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ3JlcG9ydCBleHBvcnRzIHdpdGhvdXQgYW55IHVzYWdlJyxcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbm90OiB7XG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICB1bnVzZWRFeHBvcnRzOiB7IGVudW06IFtmYWxzZV0gfSxcbiAgICAgICAgICBtaXNzaW5nRXhwb3J0czogeyBlbnVtOiBbZmFsc2VdIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYW55T2Y6W3tcbiAgICAgICAgbm90OiB7XG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgdW51c2VkRXhwb3J0czogeyBlbnVtOiBbdHJ1ZV0gfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogWydtaXNzaW5nRXhwb3J0cyddLFxuICAgICAgfSwge1xuICAgICAgICBub3Q6IHtcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBtaXNzaW5nRXhwb3J0czogeyBlbnVtOiBbdHJ1ZV0gfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogWyd1bnVzZWRFeHBvcnRzJ10sXG4gICAgICB9LCB7XG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICB1bnVzZWRFeHBvcnRzOiB7IGVudW06IFt0cnVlXSB9LFxuICAgICAgICB9LFxuICAgICAgICByZXF1aXJlZDogWyd1bnVzZWRFeHBvcnRzJ10sXG4gICAgICB9LCB7XG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBtaXNzaW5nRXhwb3J0czogeyBlbnVtOiBbdHJ1ZV0gfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFsnbWlzc2luZ0V4cG9ydHMnXSxcbiAgICAgIH1dLFxuICAgIH1dLFxuICB9LFxuXG4gIGNyZWF0ZTogY29udGV4dCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgc3JjLFxuICAgICAgaWdub3JlRXhwb3J0cyA9IFtdLFxuICAgICAgbWlzc2luZ0V4cG9ydHMsXG4gICAgICB1bnVzZWRFeHBvcnRzLFxuICAgIH0gPSBjb250ZXh0Lm9wdGlvbnNbMF0gfHwge31cblxuICAgIGlmICh1bnVzZWRFeHBvcnRzKSB7XG4gICAgICBkb1ByZXBhcmF0aW9uKHNyYywgaWdub3JlRXhwb3J0cywgY29udGV4dClcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlID0gY29udGV4dC5nZXRGaWxlbmFtZSgpXG5cbiAgICBjb25zdCBjaGVja0V4cG9ydFByZXNlbmNlID0gbm9kZSA9PiB7XG4gICAgICBpZiAoIW1pc3NpbmdFeHBvcnRzKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoaWdub3JlZEZpbGVzLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhwb3J0Q291bnQgPSBleHBvcnRMaXN0LmdldChmaWxlKVxuICAgICAgY29uc3QgZXhwb3J0QWxsID0gZXhwb3J0Q291bnQuZ2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04pXG4gICAgICBjb25zdCBuYW1lc3BhY2VJbXBvcnRzID0gZXhwb3J0Q291bnQuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKVxuXG4gICAgICBleHBvcnRDb3VudC5kZWxldGUoRVhQT1JUX0FMTF9ERUNMQVJBVElPTilcbiAgICAgIGV4cG9ydENvdW50LmRlbGV0ZShJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUilcbiAgICAgIGlmIChleHBvcnRDb3VudC5zaXplIDwgMSkge1xuICAgICAgICAvLyBub2RlLmJvZHlbMF0gPT09ICd1bmRlZmluZWQnIG9ubHkgaGFwcGVucywgaWYgZXZlcnl0aGluZyBpcyBjb21tZW50ZWQgb3V0IGluIHRoZSBmaWxlXG4gICAgICAgIC8vIGJlaW5nIGxpbnRlZFxuICAgICAgICBjb250ZXh0LnJlcG9ydChub2RlLmJvZHlbMF0gPyBub2RlLmJvZHlbMF0gOiBub2RlLCAnTm8gZXhwb3J0cyBmb3VuZCcpXG4gICAgICB9XG4gICAgICBleHBvcnRDb3VudC5zZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTiwgZXhwb3J0QWxsKVxuICAgICAgZXhwb3J0Q291bnQuc2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSLCBuYW1lc3BhY2VJbXBvcnRzKVxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrVXNhZ2UgPSAobm9kZSwgZXhwb3J0ZWRWYWx1ZSkgPT4ge1xuICAgICAgaWYgKCF1bnVzZWRFeHBvcnRzKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoaWdub3JlZEZpbGVzLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVJc0luUGtnKGZpbGUpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZXNPdXRzaWRlU3JjLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gbWFrZSBzdXJlIGZpbGUgdG8gYmUgbGludGVkIGlzIGluY2x1ZGVkIGluIHNvdXJjZSBmaWxlc1xuICAgICAgaWYgKCFzcmNGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgc3JjRmlsZXMgPSByZXNvbHZlRmlsZXMoZ2V0U3JjKHNyYyksIGlnbm9yZUV4cG9ydHMsIGNvbnRleHQpXG4gICAgICAgIGlmICghc3JjRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgICAgZmlsZXNPdXRzaWRlU3JjLmFkZChmaWxlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldChmaWxlKVxuXG4gICAgICAvLyBzcGVjaWFsIGNhc2U6IGV4cG9ydCAqIGZyb21cbiAgICAgIGNvbnN0IGV4cG9ydEFsbCA9IGV4cG9ydHMuZ2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04pXG4gICAgICBpZiAodHlwZW9mIGV4cG9ydEFsbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZXhwb3J0ZWRWYWx1ZSAhPT0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKSB7XG4gICAgICAgIGlmIChleHBvcnRBbGwud2hlcmVVc2VkLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc3BlY2lhbCBjYXNlOiBuYW1lc3BhY2UgaW1wb3J0XG4gICAgICBjb25zdCBuYW1lc3BhY2VJbXBvcnRzID0gZXhwb3J0cy5nZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpXG4gICAgICBpZiAodHlwZW9mIG5hbWVzcGFjZUltcG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChuYW1lc3BhY2VJbXBvcnRzLndoZXJlVXNlZC5zaXplID4gMCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4cG9ydFN0YXRlbWVudCA9IGV4cG9ydHMuZ2V0KGV4cG9ydGVkVmFsdWUpXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZXhwb3J0ZWRWYWx1ZSA9PT0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSID8gREVGQVVMVCA6IGV4cG9ydGVkVmFsdWVcblxuICAgICAgaWYgKHR5cGVvZiBleHBvcnRTdGF0ZW1lbnQgIT09ICd1bmRlZmluZWQnKXtcbiAgICAgICAgaWYgKGV4cG9ydFN0YXRlbWVudC53aGVyZVVzZWQuc2l6ZSA8IDEpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydChcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBgZXhwb3J0ZWQgZGVjbGFyYXRpb24gJyR7dmFsdWV9JyBub3QgdXNlZCB3aXRoaW4gb3RoZXIgbW9kdWxlc2BcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgYGV4cG9ydGVkIGRlY2xhcmF0aW9uICcke3ZhbHVlfScgbm90IHVzZWQgd2l0aGluIG90aGVyIG1vZHVsZXNgXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBvbmx5IHVzZWZ1bCBmb3IgdG9vbHMgbGlrZSB2c2NvZGUtZXNsaW50XG4gICAgICpcbiAgICAgKiB1cGRhdGUgbGlzdHMgb2YgZXhpc3RpbmcgZXhwb3J0cyBkdXJpbmcgcnVudGltZVxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUV4cG9ydFVzYWdlID0gbm9kZSA9PiB7XG4gICAgICBpZiAoaWdub3JlZEZpbGVzLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldChmaWxlKVxuXG4gICAgICAvLyBuZXcgbW9kdWxlIGhhcyBiZWVuIGNyZWF0ZWQgZHVyaW5nIHJ1bnRpbWVcbiAgICAgIC8vIGluY2x1ZGUgaXQgaW4gZnVydGhlciBwcm9jZXNzaW5nXG4gICAgICBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV4cG9ydHMgPSBuZXcgTWFwKClcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3RXhwb3J0cyA9IG5ldyBNYXAoKVxuICAgICAgY29uc3QgbmV3RXhwb3J0SWRlbnRpZmllcnMgPSBuZXcgU2V0KClcblxuICAgICAgbm9kZS5ib2R5LmZvckVhY2goKHsgdHlwZSwgZGVjbGFyYXRpb24sIHNwZWNpZmllcnMgfSkgPT4ge1xuICAgICAgICBpZiAodHlwZSA9PT0gRVhQT1JUX0RFRkFVTFRfREVDTEFSQVRJT04pIHtcbiAgICAgICAgICBuZXdFeHBvcnRJZGVudGlmaWVycy5hZGQoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBFWFBPUlRfTkFNRURfREVDTEFSQVRJT04pIHtcbiAgICAgICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzcGVjaWZpZXJzLmZvckVhY2goc3BlY2lmaWVyID0+IHtcbiAgICAgICAgICAgICAgaWYgKHNwZWNpZmllci5leHBvcnRlZCkge1xuICAgICAgICAgICAgICAgIG5ld0V4cG9ydElkZW50aWZpZXJzLmFkZChzcGVjaWZpZXIuZXhwb3J0ZWQubmFtZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09IEZVTkNUSU9OX0RFQ0xBUkFUSU9OIHx8XG4gICAgICAgICAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09IENMQVNTX0RFQ0xBUkFUSU9OIHx8XG4gICAgICAgICAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09IFRZUEVfQUxJQVNcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBuZXdFeHBvcnRJZGVudGlmaWVycy5hZGQoZGVjbGFyYXRpb24uaWQubmFtZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSBWQVJJQUJMRV9ERUNMQVJBVElPTikge1xuICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnMuZm9yRWFjaCgoeyBpZCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgbmV3RXhwb3J0SWRlbnRpZmllcnMuYWRkKGlkLm5hbWUpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBvbGQgZXhwb3J0cyBleGlzdCB3aXRoaW4gbGlzdCBvZiBuZXcgZXhwb3J0cyBpZGVudGlmaWVyczogYWRkIHRvIG1hcCBvZiBuZXcgZXhwb3J0c1xuICAgICAgZXhwb3J0cy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChuZXdFeHBvcnRJZGVudGlmaWVycy5oYXMoa2V5KSkge1xuICAgICAgICAgIG5ld0V4cG9ydHMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5ldyBleHBvcnQgaWRlbnRpZmllcnMgYWRkZWQ6IGFkZCB0byBtYXAgb2YgbmV3IGV4cG9ydHNcbiAgICAgIG5ld0V4cG9ydElkZW50aWZpZXJzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKCFleHBvcnRzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgbmV3RXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIHByZXNlcnZlIGluZm9ybWF0aW9uIGFib3V0IG5hbWVzcGFjZSBpbXBvcnRzXG4gICAgICBsZXQgZXhwb3J0QWxsID0gZXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTilcbiAgICAgIGxldCBuYW1lc3BhY2VJbXBvcnRzID0gZXhwb3J0cy5nZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpXG5cbiAgICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlSW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbmFtZXNwYWNlSW1wb3J0cyA9IHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfVxuICAgICAgfVxuXG4gICAgICBuZXdFeHBvcnRzLnNldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OLCBleHBvcnRBbGwpXG4gICAgICBuZXdFeHBvcnRzLnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgbmFtZXNwYWNlSW1wb3J0cylcbiAgICAgIGV4cG9ydExpc3Quc2V0KGZpbGUsIG5ld0V4cG9ydHMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogb25seSB1c2VmdWwgZm9yIHRvb2xzIGxpa2UgdnNjb2RlLWVzbGludFxuICAgICAqXG4gICAgICogdXBkYXRlIGxpc3RzIG9mIGV4aXN0aW5nIGltcG9ydHMgZHVyaW5nIHJ1bnRpbWVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVJbXBvcnRVc2FnZSA9IG5vZGUgPT4ge1xuICAgICAgaWYgKCF1bnVzZWRFeHBvcnRzKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBsZXQgb2xkSW1wb3J0UGF0aHMgPSBpbXBvcnRMaXN0LmdldChmaWxlKVxuICAgICAgaWYgKHR5cGVvZiBvbGRJbXBvcnRQYXRocyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb2xkSW1wb3J0UGF0aHMgPSBuZXcgTWFwKClcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2xkTmFtZXNwYWNlSW1wb3J0cyA9IG5ldyBTZXQoKVxuICAgICAgY29uc3QgbmV3TmFtZXNwYWNlSW1wb3J0cyA9IG5ldyBTZXQoKVxuXG4gICAgICBjb25zdCBvbGRFeHBvcnRBbGwgPSBuZXcgU2V0KClcbiAgICAgIGNvbnN0IG5ld0V4cG9ydEFsbCA9IG5ldyBTZXQoKVxuXG4gICAgICBjb25zdCBvbGREZWZhdWx0SW1wb3J0cyA9IG5ldyBTZXQoKVxuICAgICAgY29uc3QgbmV3RGVmYXVsdEltcG9ydHMgPSBuZXcgU2V0KClcblxuICAgICAgY29uc3Qgb2xkSW1wb3J0cyA9IG5ldyBNYXAoKVxuICAgICAgY29uc3QgbmV3SW1wb3J0cyA9IG5ldyBNYXAoKVxuICAgICAgb2xkSW1wb3J0UGF0aHMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUuaGFzKEVYUE9SVF9BTExfREVDTEFSQVRJT04pKSB7XG4gICAgICAgICAgb2xkRXhwb3J0QWxsLmFkZChrZXkpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLmhhcyhJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUikpIHtcbiAgICAgICAgICBvbGROYW1lc3BhY2VJbXBvcnRzLmFkZChrZXkpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLmhhcyhJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpKSB7XG4gICAgICAgICAgb2xkRGVmYXVsdEltcG9ydHMuYWRkKGtleSlcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZS5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgaWYgKHZhbCAhPT0gSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIgJiZcbiAgICAgICAgICAgICAgdmFsICE9PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpIHtcbiAgICAgICAgICAgICAgIG9sZEltcG9ydHMuc2V0KHZhbCwga2V5KVxuICAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIG5vZGUuYm9keS5mb3JFYWNoKGFzdE5vZGUgPT4ge1xuICAgICAgICBsZXQgcmVzb2x2ZWRQYXRoXG5cbiAgICAgICAgLy8gc3VwcG9ydCBmb3IgZXhwb3J0IHsgdmFsdWUgfSBmcm9tICdtb2R1bGUnXG4gICAgICAgIGlmIChhc3ROb2RlLnR5cGUgPT09IEVYUE9SVF9OQU1FRF9ERUNMQVJBVElPTikge1xuICAgICAgICAgIGlmIChhc3ROb2RlLnNvdXJjZSkge1xuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShhc3ROb2RlLnNvdXJjZS5yYXcucmVwbGFjZSgvKCd8XCIpL2csICcnKSwgY29udGV4dClcbiAgICAgICAgICAgIGFzdE5vZGUuc3BlY2lmaWVycy5mb3JFYWNoKHNwZWNpZmllciA9PiB7XG4gICAgICAgICAgICAgIGxldCBuYW1lXG4gICAgICAgICAgICAgIGlmIChzcGVjaWZpZXIuZXhwb3J0ZWQubmFtZSA9PT0gREVGQVVMVCkge1xuICAgICAgICAgICAgICAgIG5hbWUgPSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuYW1lID0gc3BlY2lmaWVyLmxvY2FsLm5hbWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBuZXdJbXBvcnRzLnNldChuYW1lLCByZXNvbHZlZFBhdGgpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhc3ROb2RlLnR5cGUgPT09IEVYUE9SVF9BTExfREVDTEFSQVRJT04pIHtcbiAgICAgICAgICByZXNvbHZlZFBhdGggPSByZXNvbHZlKGFzdE5vZGUuc291cmNlLnJhdy5yZXBsYWNlKC8oJ3xcIikvZywgJycpLCBjb250ZXh0KVxuICAgICAgICAgIG5ld0V4cG9ydEFsbC5hZGQocmVzb2x2ZWRQYXRoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzdE5vZGUudHlwZSA9PT0gSU1QT1JUX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShhc3ROb2RlLnNvdXJjZS5yYXcucmVwbGFjZSgvKCd8XCIpL2csICcnKSwgY29udGV4dClcbiAgICAgICAgICBpZiAoIXJlc29sdmVkUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGlzTm9kZU1vZHVsZShyZXNvbHZlZFBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobmV3TmFtZXNwYWNlSW1wb3J0RXhpc3RzKGFzdE5vZGUuc3BlY2lmaWVycykpIHtcbiAgICAgICAgICAgIG5ld05hbWVzcGFjZUltcG9ydHMuYWRkKHJlc29sdmVkUGF0aClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobmV3RGVmYXVsdEltcG9ydEV4aXN0cyhhc3ROb2RlLnNwZWNpZmllcnMpKSB7XG4gICAgICAgICAgICBuZXdEZWZhdWx0SW1wb3J0cy5hZGQocmVzb2x2ZWRQYXRoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFzdE5vZGUuc3BlY2lmaWVycy5mb3JFYWNoKHNwZWNpZmllciA9PiB7XG4gICAgICAgICAgICBpZiAoc3BlY2lmaWVyLnR5cGUgPT09IElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiB8fFxuICAgICAgICAgICAgICAgIHNwZWNpZmllci50eXBlID09PSBJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUikge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0ltcG9ydHMuc2V0KHNwZWNpZmllci5pbXBvcnRlZC5uYW1lLCByZXNvbHZlZFBhdGgpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgbmV3RXhwb3J0QWxsLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBpZiAoIW9sZEV4cG9ydEFsbC5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbXBvcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1wb3J0cyA9IG5ldyBTZXQoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpbXBvcnRzLmFkZChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKVxuICAgICAgICAgIG9sZEltcG9ydFBhdGhzLnNldCh2YWx1ZSwgaW1wb3J0cylcblxuICAgICAgICAgIGxldCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQodmFsdWUpXG4gICAgICAgICAgbGV0IGN1cnJlbnRFeHBvcnRcbiAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0ID0gZXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwb3J0cyA9IG5ldyBNYXAoKVxuICAgICAgICAgICAgZXhwb3J0TGlzdC5zZXQodmFsdWUsIGV4cG9ydHMpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuYWRkKGZpbGUpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHdoZXJlVXNlZCA9IG5ldyBTZXQoKVxuICAgICAgICAgICAgd2hlcmVVc2VkLmFkZChmaWxlKVxuICAgICAgICAgICAgZXhwb3J0cy5zZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTiwgeyB3aGVyZVVzZWQgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIG9sZEV4cG9ydEFsbC5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKCFuZXdFeHBvcnRBbGwuaGFzKHZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpXG4gICAgICAgICAgaW1wb3J0cy5kZWxldGUoRVhQT1JUX0FMTF9ERUNMQVJBVElPTilcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSlcbiAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RXhwb3J0ID0gZXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTilcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuZGVsZXRlKGZpbGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBuZXdEZWZhdWx0SW1wb3J0cy5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKCFvbGREZWZhdWx0SW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbXBvcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1wb3J0cyA9IG5ldyBTZXQoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpbXBvcnRzLmFkZChJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpXG4gICAgICAgICAgb2xkSW1wb3J0UGF0aHMuc2V0KHZhbHVlLCBpbXBvcnRzKVxuXG4gICAgICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSlcbiAgICAgICAgICBsZXQgY3VycmVudEV4cG9ydFxuICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQgPSBleHBvcnRzLmdldChJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9ydHMgPSBuZXcgTWFwKClcbiAgICAgICAgICAgIGV4cG9ydExpc3Quc2V0KHZhbHVlLCBleHBvcnRzKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmFkZChmaWxlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB3aGVyZVVzZWQgPSBuZXcgU2V0KClcbiAgICAgICAgICAgIHdoZXJlVXNlZC5hZGQoZmlsZSlcbiAgICAgICAgICAgIGV4cG9ydHMuc2V0KElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiwgeyB3aGVyZVVzZWQgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIG9sZERlZmF1bHRJbXBvcnRzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBpZiAoIW5ld0RlZmF1bHRJbXBvcnRzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBpbXBvcnRzID0gb2xkSW1wb3J0UGF0aHMuZ2V0KHZhbHVlKVxuICAgICAgICAgIGltcG9ydHMuZGVsZXRlKElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUilcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSlcbiAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RXhwb3J0ID0gZXhwb3J0cy5nZXQoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5kZWxldGUoZmlsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIG5ld05hbWVzcGFjZUltcG9ydHMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIGlmICghb2xkTmFtZXNwYWNlSW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbXBvcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1wb3J0cyA9IG5ldyBTZXQoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpbXBvcnRzLmFkZChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUilcbiAgICAgICAgICBvbGRJbXBvcnRQYXRocy5zZXQodmFsdWUsIGltcG9ydHMpXG5cbiAgICAgICAgICBsZXQgZXhwb3J0cyA9IGV4cG9ydExpc3QuZ2V0KHZhbHVlKVxuICAgICAgICAgIGxldCBjdXJyZW50RXhwb3J0XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHBvcnRzID0gbmV3IE1hcCgpXG4gICAgICAgICAgICBleHBvcnRMaXN0LnNldCh2YWx1ZSwgZXhwb3J0cylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5hZGQoZmlsZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2hlcmVVc2VkID0gbmV3IFNldCgpXG4gICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGZpbGUpXG4gICAgICAgICAgICBleHBvcnRzLnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgeyB3aGVyZVVzZWQgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIG9sZE5hbWVzcGFjZUltcG9ydHMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIGlmICghbmV3TmFtZXNwYWNlSW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSlcbiAgICAgICAgICBpbXBvcnRzLmRlbGV0ZShJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUilcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSlcbiAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RXhwb3J0ID0gZXhwb3J0cy5nZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpXG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmRlbGV0ZShmaWxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgbmV3SW1wb3J0cy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmICghb2xkSW1wb3J0cy5oYXMoa2V5KSkge1xuICAgICAgICAgIGxldCBpbXBvcnRzID0gb2xkSW1wb3J0UGF0aHMuZ2V0KHZhbHVlKVxuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KClcbiAgICAgICAgICB9XG4gICAgICAgICAgaW1wb3J0cy5hZGQoa2V5KVxuICAgICAgICAgIG9sZEltcG9ydFBhdGhzLnNldCh2YWx1ZSwgaW1wb3J0cylcblxuICAgICAgICAgIGxldCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQodmFsdWUpXG4gICAgICAgICAgbGV0IGN1cnJlbnRFeHBvcnRcbiAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0ID0gZXhwb3J0cy5nZXQoa2V5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHBvcnRzID0gbmV3IE1hcCgpXG4gICAgICAgICAgICBleHBvcnRMaXN0LnNldCh2YWx1ZSwgZXhwb3J0cylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5hZGQoZmlsZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2hlcmVVc2VkID0gbmV3IFNldCgpXG4gICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGZpbGUpXG4gICAgICAgICAgICBleHBvcnRzLnNldChrZXksIHsgd2hlcmVVc2VkIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBvbGRJbXBvcnRzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKCFuZXdJbXBvcnRzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSlcbiAgICAgICAgICBpbXBvcnRzLmRlbGV0ZShrZXkpXG5cbiAgICAgICAgICBjb25zdCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQodmFsdWUpXG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KGtleSlcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuZGVsZXRlKGZpbGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAnUHJvZ3JhbTpleGl0Jzogbm9kZSA9PiB7XG4gICAgICAgIHVwZGF0ZUV4cG9ydFVzYWdlKG5vZGUpXG4gICAgICAgIHVwZGF0ZUltcG9ydFVzYWdlKG5vZGUpXG4gICAgICAgIGNoZWNrRXhwb3J0UHJlc2VuY2Uobm9kZSlcbiAgICAgIH0sXG4gICAgICAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJzogbm9kZSA9PiB7XG4gICAgICAgIGNoZWNrVXNhZ2Uobm9kZSwgSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKVxuICAgICAgfSxcbiAgICAgICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJzogbm9kZSA9PiB7XG4gICAgICAgIG5vZGUuc3BlY2lmaWVycy5mb3JFYWNoKHNwZWNpZmllciA9PiB7XG4gICAgICAgICAgICBjaGVja1VzYWdlKG5vZGUsIHNwZWNpZmllci5leHBvcnRlZC5uYW1lKVxuICAgICAgICB9KVxuICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbikge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb24udHlwZSA9PT0gRlVOQ1RJT05fREVDTEFSQVRJT04gfHxcbiAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb24udHlwZSA9PT0gQ0xBU1NfREVDTEFSQVRJT04gfHxcbiAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb24udHlwZSA9PT0gVFlQRV9BTElBU1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgY2hlY2tVc2FnZShub2RlLCBub2RlLmRlY2xhcmF0aW9uLmlkLm5hbWUpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uLnR5cGUgPT09IFZBUklBQkxFX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uLmRlY2xhcmF0aW9ucy5mb3JFYWNoKGRlY2xhcmF0aW9uID0+IHtcbiAgICAgICAgICAgICAgY2hlY2tVc2FnZShub2RlLCBkZWNsYXJhdGlvbi5pZC5uYW1lKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+        forEachDeclarationIdentifier(node.declaration, name => {
+          checkUsage(node, name);
+        });
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11bnVzZWQtbW9kdWxlcy5qcyJdLCJuYW1lcyI6WyJsaXN0RmlsZXNUb1Byb2Nlc3MiLCJGaWxlRW51bWVyYXRvciIsInJlcXVpcmUiLCJzcmMiLCJleHRlbnNpb25zIiwiZSIsIkFycmF5IiwiZnJvbSIsIml0ZXJhdGVGaWxlcyIsImZpbGVQYXRoIiwiaWdub3JlZCIsImZpbGVuYW1lIiwiZTEiLCJvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyIsImUyIiwicGF0dGVybnMiLCJyZWR1Y2UiLCJjYXJyeSIsInBhdHRlcm4iLCJjb25jYXQiLCJtYXAiLCJleHRlbnNpb24iLCJ0ZXN0Iiwic2xpY2UiLCJFWFBPUlRfREVGQVVMVF9ERUNMQVJBVElPTiIsIkVYUE9SVF9OQU1FRF9ERUNMQVJBVElPTiIsIkVYUE9SVF9BTExfREVDTEFSQVRJT04iLCJJTVBPUlRfREVDTEFSQVRJT04iLCJJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiIsIklNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiIsIlZBUklBQkxFX0RFQ0xBUkFUSU9OIiwiRlVOQ1RJT05fREVDTEFSQVRJT04iLCJDTEFTU19ERUNMQVJBVElPTiIsIklOVEVSRkFDRV9ERUNMQVJBVElPTiIsIlRZUEVfQUxJQVMiLCJUU19JTlRFUkZBQ0VfREVDTEFSQVRJT04iLCJUU19UWVBFX0FMSUFTX0RFQ0xBUkFUSU9OIiwiVFNfRU5VTV9ERUNMQVJBVElPTiIsIkRFRkFVTFQiLCJmb3JFYWNoRGVjbGFyYXRpb25JZGVudGlmaWVyIiwiZGVjbGFyYXRpb24iLCJjYiIsInR5cGUiLCJpZCIsIm5hbWUiLCJkZWNsYXJhdGlvbnMiLCJmb3JFYWNoIiwiaW1wb3J0TGlzdCIsIk1hcCIsImV4cG9ydExpc3QiLCJpZ25vcmVkRmlsZXMiLCJTZXQiLCJmaWxlc091dHNpZGVTcmMiLCJpc05vZGVNb2R1bGUiLCJwYXRoIiwicmVzb2x2ZUZpbGVzIiwiaWdub3JlRXhwb3J0cyIsImNvbnRleHQiLCJzZXR0aW5ncyIsInNyY0ZpbGVzIiwic3JjRmlsZUxpc3QiLCJpZ25vcmVkRmlsZXNMaXN0IiwiYWRkIiwiZmlsdGVyIiwicHJlcGFyZUltcG9ydHNBbmRFeHBvcnRzIiwiZXhwb3J0QWxsIiwiZmlsZSIsImV4cG9ydHMiLCJpbXBvcnRzIiwiY3VycmVudEV4cG9ydHMiLCJFeHBvcnRzIiwiZ2V0IiwiZGVwZW5kZW5jaWVzIiwicmVleHBvcnRzIiwibG9jYWxJbXBvcnRMaXN0IiwibmFtZXNwYWNlIiwiY3VycmVudEV4cG9ydEFsbCIsImdldERlcGVuZGVuY3kiLCJkZXBlbmRlbmN5Iiwic2V0IiwidmFsdWUiLCJrZXkiLCJ3aGVyZVVzZWQiLCJyZWV4cG9ydCIsImdldEltcG9ydCIsImxvY2FsSW1wb3J0IiwiY3VycmVudFZhbHVlIiwibG9jYWwiLCJpbXBvcnRlZFNwZWNpZmllcnMiLCJoYXMiLCJ2YWwiLCJjdXJyZW50RXhwb3J0IiwiZGV0ZXJtaW5lVXNhZ2UiLCJsaXN0VmFsdWUiLCJsaXN0S2V5IiwiY3VycmVudEltcG9ydCIsInNwZWNpZmllciIsImV4cG9ydFN0YXRlbWVudCIsImdldFNyYyIsInByb2Nlc3MiLCJjd2QiLCJsYXN0UHJlcGFyZUtleSIsImRvUHJlcGFyYXRpb24iLCJwcmVwYXJlS2V5IiwiSlNPTiIsInN0cmluZ2lmeSIsInNvcnQiLCJjbGVhciIsIm5ld05hbWVzcGFjZUltcG9ydEV4aXN0cyIsInNwZWNpZmllcnMiLCJzb21lIiwibmV3RGVmYXVsdEltcG9ydEV4aXN0cyIsImZpbGVJc0luUGtnIiwicmVhZFBrZ1VwIiwic3luYyIsIm5vcm1hbGl6ZSIsInBrZyIsImJhc2VQYXRoIiwiY2hlY2tQa2dGaWVsZFN0cmluZyIsInBrZ0ZpZWxkIiwiY2hlY2tQa2dGaWVsZE9iamVjdCIsInBrZ0ZpZWxkRmlsZXMiLCJjaGVja1BrZ0ZpZWxkIiwicHJpdmF0ZSIsImJpbiIsImJyb3dzZXIiLCJtYWluIiwibW9kdWxlIiwibWV0YSIsImRvY3MiLCJ1cmwiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiZGVzY3JpcHRpb24iLCJtaW5JdGVtcyIsIml0ZW1zIiwibWluTGVuZ3RoIiwibWlzc2luZ0V4cG9ydHMiLCJ1bnVzZWRFeHBvcnRzIiwibm90IiwiZW51bSIsImFueU9mIiwicmVxdWlyZWQiLCJjcmVhdGUiLCJvcHRpb25zIiwiZ2V0RmlsZW5hbWUiLCJjaGVja0V4cG9ydFByZXNlbmNlIiwibm9kZSIsImV4cG9ydENvdW50IiwibmFtZXNwYWNlSW1wb3J0cyIsImRlbGV0ZSIsInNpemUiLCJyZXBvcnQiLCJib2R5IiwiY2hlY2tVc2FnZSIsImV4cG9ydGVkVmFsdWUiLCJleHBvcnRzS2V5IiwidXBkYXRlRXhwb3J0VXNhZ2UiLCJuZXdFeHBvcnRzIiwibmV3RXhwb3J0SWRlbnRpZmllcnMiLCJsZW5ndGgiLCJleHBvcnRlZCIsInVwZGF0ZUltcG9ydFVzYWdlIiwib2xkSW1wb3J0UGF0aHMiLCJvbGROYW1lc3BhY2VJbXBvcnRzIiwibmV3TmFtZXNwYWNlSW1wb3J0cyIsIm9sZEV4cG9ydEFsbCIsIm5ld0V4cG9ydEFsbCIsIm9sZERlZmF1bHRJbXBvcnRzIiwibmV3RGVmYXVsdEltcG9ydHMiLCJvbGRJbXBvcnRzIiwibmV3SW1wb3J0cyIsImFzdE5vZGUiLCJyZXNvbHZlZFBhdGgiLCJzb3VyY2UiLCJyYXciLCJyZXBsYWNlIiwiaW1wb3J0ZWQiXSwibWFwcGluZ3MiOiI7Ozs7OztBQU1BLHlDO0FBQ0E7QUFDQSxzRDtBQUNBLHFDO0FBQ0E7QUFDQSx3QztBQUNBLHVDO0FBQ0EsK0MsbVZBYkE7Ozs7c1lBZUE7QUFDQTtBQUNBLElBQUlBLGtCQUFKLENBQ0EsSUFBSSxDQUNGLE1BQU1DLGlCQUFpQkMsUUFBUSx1Q0FBUixFQUFpREQsY0FBeEU7QUFDQUQsdUJBQXFCLFVBQVVHLEdBQVYsRUFBZUMsVUFBZixFQUEyQjtBQUM5QyxVQUFNQyxJQUFJLElBQUlKLGNBQUosQ0FBbUI7QUFDM0JHLGtCQUFZQSxVQURlLEVBQW5CLENBQVY7O0FBR0EsV0FBT0UsTUFBTUMsSUFBTixD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cEYsSUFBL0I7QUFDRDtBQUNGO0FBQ0Y7QUFDRixPQWJEO0FBY0QsS0FyUUQ7O0FBdVFBLFdBQU87QUFDTCxzQkFBZ0JpRixRQUFRO0FBQ3RCVSwwQkFBa0JWLElBQWxCO0FBQ0FlLDBCQUFrQmYsSUFBbEI7QUFDQUQsNEJBQW9CQyxJQUFwQjtBQUNELE9BTEk7QUFNTCxrQ0FBNEJBLFFBQVE7QUFDbENPLG1CQUFXUCxJQUFYLEVBQWlCdEgsd0JBQWpCO0FBQ0QsT0FSSTtBQVNMLGdDQUEwQnNILFFBQVE7QUFDaENBLGFBQUt0QyxVQUFMLENBQWdCL0QsT0FBaEIsQ0FBd0JrRCxhQUFhO0FBQ2pDMEQscUJBQVdQLElBQVgsRUFBaUJuRCxVQUFVaUUsUUFBVixDQUFtQnJILElBQXBDO0FBQ0gsU0FGRDtBQUdBTCxxQ0FBNkI0RyxLQUFLM0csV0FBbEMsRUFBZ0RJLElBQUQsSUFBVTtBQUN2RDhHLHFCQUFXUCxJQUFYLEVBQWlCdkcsSUFBakI7QUFDRCxTQUZEO0FBR0QsT0FoQkksRUFBUDs7QUFrQkQsR0E1Z0JjLEVBQWpCIiwiZmlsZSI6Im5vLXVudXNlZC1tb2R1bGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IEVuc3VyZXMgdGhhdCBtb2R1bGVzIGNvbnRhaW4gZXhwb3J0cyBhbmQvb3IgYWxsXG4gKiBtb2R1bGVzIGFyZSBjb25zdW1lZCB3aXRoaW4gb3RoZXIgbW9kdWxlcy5cbiAqIEBhdXRob3IgUmVuw6kgRmVybWFublxuICovXG5cbmltcG9ydCBFeHBvcnRzIGZyb20gJy4uL0V4cG9ydE1hcCdcbmltcG9ydCB7IGdldEZpbGVFeHRlbnNpb25zIH0gZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9pZ25vcmUnXG5pbXBvcnQgcmVzb2x2ZSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL3Jlc29sdmUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgcmVhZFBrZ1VwIGZyb20gJ3JlYWQtcGtnLXVwJ1xuaW1wb3J0IHZhbHVlcyBmcm9tICdvYmplY3QudmFsdWVzJ1xuaW1wb3J0IGluY2x1ZGVzIGZyb20gJ2FycmF5LWluY2x1ZGVzJ1xuXG4vLyBlc2xpbnQvbGliL3V0aWwvZ2xvYi11dGlsIGhhcyBiZWVuIG1vdmVkIHRvIGVzbGludC9saWIvdXRpbC9nbG9iLXV0aWxzIHdpdGggdmVyc2lvbiA1LjNcbi8vIGFuZCBoYXMgYmVlbiBtb3ZlZCB0byBlc2xpbnQvbGliL2NsaS1lbmdpbmUvZmlsZS1lbnVtZXJhdG9yIGluIHZlcnNpb24gNlxubGV0IGxpc3RGaWxlc1RvUHJvY2Vzc1xudHJ5IHtcbiAgY29uc3QgRmlsZUVudW1lcmF0b3IgPSByZXF1aXJlKCdlc2xpbnQvbGliL2NsaS1lbmdpbmUvZmlsZS1lbnVtZXJhdG9yJykuRmlsZUVudW1lcmF0b3JcbiAgbGlzdEZpbGVzVG9Qcm9jZXNzID0gZnVuY3Rpb24gKHNyYywgZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGUgPSBuZXcgRmlsZUVudW1lcmF0b3Ioe1xuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyxcbiAgICB9KVxuICAgIHJldHVybiBBcnJheS5mcm9tKGUuaXRlcmF0ZUZpbGVzKHNyYyksICh7IGZpbGVQYXRoLCBpZ25vcmVkIH0pID0+ICh7XG4gICAgICBpZ25vcmVkLFxuICAgICAgZmlsZW5hbWU6IGZpbGVQYXRoLFxuICAgIH0pKVxuICB9XG59IGNhdGNoIChlMSkge1xuICAvLyBQcmV2ZW50IHBhc3NpbmcgaW52YWxpZCBvcHRpb25zIChleHRlbnNpb25zIGFycmF5KSB0byBvbGQgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL3Y1LjE2LjAvbGliL3V0aWwvZ2xvYi11dGlscy5qcyNMMTc4LUwyODBcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi92NS4yLjAvbGliL3V0aWwvZ2xvYi11dGlsLmpzI0wxNzQtTDI2OVxuICBsZXQgb3JpZ2luYWxMaXN0RmlsZXNUb1Byb2Nlc3NcbiAgdHJ5IHtcbiAgICBvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyA9IHJlcXVpcmUoJ2VzbGludC9saWIvdXRpbC9nbG9iLXV0aWxzJykubGlzdEZpbGVzVG9Qcm9jZXNzXG4gICAgbGlzdEZpbGVzVG9Qcm9jZXNzID0gZnVuY3Rpb24gKHNyYywgZXh0ZW5zaW9ucykge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsTGlzdEZpbGVzVG9Qcm9jZXNzKHNyYywge1xuICAgICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLFxuICAgICAgfSlcbiAgICB9XG4gIH0gY2F0Y2ggKGUyKSB7XG4gICAgb3JpZ2luYWxMaXN0RmlsZXNUb1Byb2Nlc3MgPSByZXF1aXJlKCdlc2xpbnQvbGliL3V0aWwvZ2xvYi11dGlsJykubGlzdEZpbGVzVG9Qcm9jZXNzXG5cbiAgICBsaXN0RmlsZXNUb1Byb2Nlc3MgPSBmdW5jdGlvbiAoc3JjLCBleHRlbnNpb25zKSB7XG4gICAgICBjb25zdCBwYXR0ZXJucyA9IHNyYy5yZWR1Y2UoKGNhcnJ5LCBwYXR0ZXJuKSA9PiB7XG4gICAgICAgIHJldHVybiBjYXJyeS5jb25jYXQoZXh0ZW5zaW9ucy5tYXAoKGV4dGVuc2lvbikgPT4ge1xuICAgICAgICAgIHJldHVybiAvXFwqXFwqfFxcKlxcLi8udGVzdChwYXR0ZXJuKSA/IHBhdHRlcm4gOiBgJHtwYXR0ZXJufS8qKi8qJHtleHRlbnNpb259YFxuICAgICAgICB9KSlcbiAgICAgIH0sIHNyYy5zbGljZSgpKVxuXG4gICAgICByZXR1cm4gb3JpZ2luYWxMaXN0RmlsZXNUb1Byb2Nlc3MocGF0dGVybnMpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IEVYUE9SVF9ERUZBVUxUX0RFQ0xBUkFUSU9OID0gJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbidcbmNvbnN0IEVYUE9SVF9OQU1FRF9ERUNMQVJBVElPTiA9ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJ1xuY29uc3QgRVhQT1JUX0FMTF9ERUNMQVJBVElPTiA9ICdFeHBvcnRBbGxEZWNsYXJhdGlvbidcbmNvbnN0IElNUE9SVF9ERUNMQVJBVElPTiA9ICdJbXBvcnREZWNsYXJhdGlvbidcbmNvbnN0IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSID0gJ0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllcidcbmNvbnN0IElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiA9ICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJ1xuY29uc3QgVkFSSUFCTEVfREVDTEFSQVRJT04gPSAnVmFyaWFibGVEZWNsYXJhdGlvbidcbmNvbnN0IEZVTkNUSU9OX0RFQ0xBUkFUSU9OID0gJ0Z1bmN0aW9uRGVjbGFyYXRpb24nXG5jb25zdCBDTEFTU19ERUNMQVJBVElPTiA9ICdDbGFzc0RlY2xhcmF0aW9uJ1xuY29uc3QgSU5URVJGQUNFX0RFQ0xBUkFUSU9OID0gJ0ludGVyZmFjZURlY2xhcmF0aW9uJ1xuY29uc3QgVFlQRV9BTElBUyA9ICdUeXBlQWxpYXMnXG5jb25zdCBUU19JTlRFUkZBQ0VfREVDTEFSQVRJT04gPSAnVFNJbnRlcmZhY2VEZWNsYXJhdGlvbidcbmNvbnN0IFRTX1RZUEVfQUxJQVNfREVDTEFSQVRJT04gPSAnVFNUeXBlQWxpYXNEZWNsYXJhdGlvbidcbmNvbnN0IFRTX0VOVU1fREVDTEFSQVRJT04gPSAnVFNFbnVtRGVjbGFyYXRpb24nXG5jb25zdCBERUZBVUxUID0gJ2RlZmF1bHQnXG5cbmZ1bmN0aW9uIGZvckVhY2hEZWNsYXJhdGlvbklkZW50aWZpZXIoZGVjbGFyYXRpb24sIGNiKSB7XG4gIGlmIChkZWNsYXJhdGlvbikge1xuICAgIGlmIChcbiAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09IEZVTkNUSU9OX0RFQ0xBUkFUSU9OIHx8XG4gICAgICBkZWNsYXJhdGlvbi50eXBlID09PSBDTEFTU19ERUNMQVJBVElPTiB8fFxuICAgICAgZGVjbGFyYXRpb24udHlwZSA9PT0gSU5URVJGQUNFX0RFQ0xBUkFUSU9OIHx8XG4gICAgICBkZWNsYXJhdGlvbi50eXBlID09PSBUWVBFX0FMSUFTIHx8XG4gICAgICBkZWNsYXJhdGlvbi50eXBlID09PSBUU19JTlRFUkZBQ0VfREVDTEFSQVRJT04gfHxcbiAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09IFRTX1RZUEVfQUxJQVNfREVDTEFSQVRJT04gfHxcbiAgICAgIGRlY2xhcmF0aW9uLnR5cGUgPT09IFRTX0VOVU1fREVDTEFSQVRJT05cbiAgICApIHtcbiAgICAgIGNiKGRlY2xhcmF0aW9uLmlkLm5hbWUpXG4gICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSBWQVJJQUJMRV9ERUNMQVJBVElPTikge1xuICAgICAgZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zLmZvckVhY2goKHsgaWQgfSkgPT4ge1xuICAgICAgICBjYihpZC5uYW1lKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0IG9mIGltcG9ydHMgcGVyIGZpbGUuXG4gKlxuICogUmVwcmVzZW50ZWQgYnkgYSB0d28tbGV2ZWwgTWFwIHRvIGEgU2V0IG9mIGlkZW50aWZpZXJzLiBUaGUgdXBwZXItbGV2ZWwgTWFwXG4gKiBrZXlzIGFyZSB0aGUgcGF0aHMgdG8gdGhlIG1vZHVsZXMgY29udGFpbmluZyB0aGUgaW1wb3J0cywgd2hpbGUgdGhlXG4gKiBsb3dlci1sZXZlbCBNYXAga2V5cyBhcmUgdGhlIHBhdGhzIHRvIHRoZSBmaWxlcyB3aGljaCBhcmUgYmVpbmcgaW1wb3J0ZWRcbiAqIGZyb20uIExhc3RseSwgdGhlIFNldCBvZiBpZGVudGlmaWVycyBjb250YWlucyBlaXRoZXIgbmFtZXMgYmVpbmcgaW1wb3J0ZWRcbiAqIG9yIGEgc3BlY2lhbCBBU1Qgbm9kZSBuYW1lIGxpc3RlZCBhYm92ZSAoZS5nIEltcG9ydERlZmF1bHRTcGVjaWZpZXIpLlxuICpcbiAqIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGEgZmlsZSBuYW1lZCBmb28uanMgY29udGFpbmluZzpcbiAqXG4gKiAgIGltcG9ydCB7IG8yIH0gZnJvbSAnLi9iYXIuanMnO1xuICpcbiAqIFRoZW4gd2Ugd2lsbCBoYXZlIGEgc3RydWN0dXJlIHRoYXQgbG9va3MgbGlrZTpcbiAqXG4gKiAgIE1hcCB7ICdmb28uanMnID0+IE1hcCB7ICdiYXIuanMnID0+IFNldCB7ICdvMicgfSB9IH1cbiAqXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+Pn1cbiAqL1xuY29uc3QgaW1wb3J0TGlzdCA9IG5ldyBNYXAoKVxuXG4vKipcbiAqIExpc3Qgb2YgZXhwb3J0cyBwZXIgZmlsZS5cbiAqXG4gKiBSZXByZXNlbnRlZCBieSBhIHR3by1sZXZlbCBNYXAgdG8gYW4gb2JqZWN0IG9mIG1ldGFkYXRhLiBUaGUgdXBwZXItbGV2ZWwgTWFwXG4gKiBrZXlzIGFyZSB0aGUgcGF0aHMgdG8gdGhlIG1vZHVsZXMgY29udGFpbmluZyB0aGUgZXhwb3J0cywgd2hpbGUgdGhlXG4gKiBsb3dlci1sZXZlbCBNYXAga2V5cyBhcmUgdGhlIHNwZWNpZmljIGlkZW50aWZpZXJzIG9yIHNwZWNpYWwgQVNUIG5vZGUgbmFtZXNcbiAqIGJlaW5nIGV4cG9ydGVkLiBUaGUgbGVhZi1sZXZlbCBtZXRhZGF0YSBvYmplY3QgYXQgdGhlIG1vbWVudCBvbmx5IGNvbnRhaW5zIGFcbiAqIGB3aGVyZVVzZWRgIHByb3BvZXJ0eSwgd2hpY2ggY29udGFpbnMgYSBTZXQgb2YgcGF0aHMgdG8gbW9kdWxlcyB0aGF0IGltcG9ydFxuICogdGhlIG5hbWUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmIHdlIGhhdmUgYSBmaWxlIG5hbWVkIGJhci5qcyBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgZXhwb3J0czpcbiAqXG4gKiAgIGNvbnN0IG8yID0gJ2Jhcic7XG4gKiAgIGV4cG9ydCB7IG8yIH07XG4gKlxuICogQW5kIGEgZmlsZSBuYW1lZCBmb28uanMgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGltcG9ydDpcbiAqXG4gKiAgIGltcG9ydCB7IG8yIH0gZnJvbSAnLi9iYXIuanMnO1xuICpcbiAqIFRoZW4gd2Ugd2lsbCBoYXZlIGEgc3RydWN0dXJlIHRoYXQgbG9va3MgbGlrZTpcbiAqXG4gKiAgIE1hcCB7ICdiYXIuanMnID0+IE1hcCB7ICdvMicgPT4geyB3aGVyZVVzZWQ6IFNldCB7ICdmb28uanMnIH0gfSB9IH1cbiAqXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPHN0cmluZywgb2JqZWN0Pj59XG4gKi9cbmNvbnN0IGV4cG9ydExpc3QgPSBuZXcgTWFwKClcblxuY29uc3QgaWdub3JlZEZpbGVzID0gbmV3IFNldCgpXG5jb25zdCBmaWxlc091dHNpZGVTcmMgPSBuZXcgU2V0KClcblxuY29uc3QgaXNOb2RlTW9kdWxlID0gcGF0aCA9PiB7XG4gIHJldHVybiAvXFwvKG5vZGVfbW9kdWxlcylcXC8vLnRlc3QocGF0aClcbn1cblxuLyoqXG4gKiByZWFkIGFsbCBmaWxlcyBtYXRjaGluZyB0aGUgcGF0dGVybnMgaW4gc3JjIGFuZCBpZ25vcmVFeHBvcnRzXG4gKlxuICogcmV0dXJuIGFsbCBmaWxlcyBtYXRjaGluZyBzcmMgcGF0dGVybiwgd2hpY2ggYXJlIG5vdCBtYXRjaGluZyB0aGUgaWdub3JlRXhwb3J0cyBwYXR0ZXJuXG4gKi9cbmNvbnN0IHJlc29sdmVGaWxlcyA9IChzcmMsIGlnbm9yZUV4cG9ydHMsIGNvbnRleHQpID0+IHtcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IEFycmF5LmZyb20oZ2V0RmlsZUV4dGVuc2lvbnMoY29udGV4dC5zZXR0aW5ncykpXG5cbiAgY29uc3Qgc3JjRmlsZXMgPSBuZXcgU2V0KClcbiAgY29uc3Qgc3JjRmlsZUxpc3QgPSBsaXN0RmlsZXNUb1Byb2Nlc3Moc3JjLCBleHRlbnNpb25zKVxuXG4gIC8vIHByZXBhcmUgbGlzdCBvZiBpZ25vcmVkIGZpbGVzXG4gIGNvbnN0IGlnbm9yZWRGaWxlc0xpc3QgPSAgbGlzdEZpbGVzVG9Qcm9jZXNzKGlnbm9yZUV4cG9ydHMsIGV4dGVuc2lvbnMpXG4gIGlnbm9yZWRGaWxlc0xpc3QuZm9yRWFjaCgoeyBmaWxlbmFtZSB9KSA9PiBpZ25vcmVkRmlsZXMuYWRkKGZpbGVuYW1lKSlcblxuICAvLyBwcmVwYXJlIGxpc3Qgb2Ygc291cmNlIGZpbGVzLCBkb24ndCBjb25zaWRlciBmaWxlcyBmcm9tIG5vZGVfbW9kdWxlc1xuICBzcmNGaWxlTGlzdC5maWx0ZXIoKHsgZmlsZW5hbWUgfSkgPT4gIWlzTm9kZU1vZHVsZShmaWxlbmFtZSkpLmZvckVhY2goKHsgZmlsZW5hbWUgfSkgPT4ge1xuICAgIHNyY0ZpbGVzLmFkZChmaWxlbmFtZSlcbiAgfSlcbiAgcmV0dXJuIHNyY0ZpbGVzXG59XG5cbi8qKlxuICogcGFyc2UgYWxsIHNvdXJjZSBmaWxlcyBhbmQgYnVpbGQgdXAgMiBtYXBzIGNvbnRhaW5pbmcgdGhlIGV4aXN0aW5nIGltcG9ydHMgYW5kIGV4cG9ydHNcbiAqL1xuY29uc3QgcHJlcGFyZUltcG9ydHNBbmRFeHBvcnRzID0gKHNyY0ZpbGVzLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IGV4cG9ydEFsbCA9IG5ldyBNYXAoKVxuICBzcmNGaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBuZXcgTWFwKClcbiAgICBjb25zdCBpbXBvcnRzID0gbmV3IE1hcCgpXG4gICAgY29uc3QgY3VycmVudEV4cG9ydHMgPSBFeHBvcnRzLmdldChmaWxlLCBjb250ZXh0KVxuICAgIGlmIChjdXJyZW50RXhwb3J0cykge1xuICAgICAgY29uc3QgeyBkZXBlbmRlbmNpZXMsIHJlZXhwb3J0cywgaW1wb3J0czogbG9jYWxJbXBvcnRMaXN0LCBuYW1lc3BhY2UgIH0gPSBjdXJyZW50RXhwb3J0c1xuXG4gICAgICAvLyBkZXBlbmRlbmNpZXMgPT09IGV4cG9ydCAqIGZyb21cbiAgICAgIGNvbnN0IGN1cnJlbnRFeHBvcnRBbGwgPSBuZXcgU2V0KClcbiAgICAgIGRlcGVuZGVuY2llcy5mb3JFYWNoKGdldERlcGVuZGVuY3kgPT4ge1xuICAgICAgICBjb25zdCBkZXBlbmRlbmN5ID0gZ2V0RGVwZW5kZW5jeSgpXG4gICAgICAgIGlmIChkZXBlbmRlbmN5ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50RXhwb3J0QWxsLmFkZChkZXBlbmRlbmN5LnBhdGgpXG4gICAgICB9KVxuICAgICAgZXhwb3J0QWxsLnNldChmaWxlLCBjdXJyZW50RXhwb3J0QWxsKVxuXG4gICAgICByZWV4cG9ydHMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5ID09PSBERUZBVUxUKSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSLCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVleHBvcnQgPSAgdmFsdWUuZ2V0SW1wb3J0KClcbiAgICAgICAgaWYgKCFyZWV4cG9ydCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGxldCBsb2NhbEltcG9ydCA9IGltcG9ydHMuZ2V0KHJlZXhwb3J0LnBhdGgpXG4gICAgICAgIGxldCBjdXJyZW50VmFsdWVcbiAgICAgICAgaWYgKHZhbHVlLmxvY2FsID09PSBERUZBVUxUKSB7XG4gICAgICAgICAgY3VycmVudFZhbHVlID0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudFZhbHVlID0gdmFsdWUubG9jYWxcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxvY2FsSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxvY2FsSW1wb3J0ID0gbmV3IFNldChbLi4ubG9jYWxJbXBvcnQsIGN1cnJlbnRWYWx1ZV0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9jYWxJbXBvcnQgPSBuZXcgU2V0KFtjdXJyZW50VmFsdWVdKVxuICAgICAgICB9XG4gICAgICAgIGltcG9ydHMuc2V0KHJlZXhwb3J0LnBhdGgsIGxvY2FsSW1wb3J0KVxuICAgICAgfSlcblxuICAgICAgbG9jYWxJbXBvcnRMaXN0LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGlzTm9kZU1vZHVsZShrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxvY2FsSW1wb3J0ID0gaW1wb3J0cy5nZXQoa2V5KVxuICAgICAgICBpZiAodHlwZW9mIGxvY2FsSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxvY2FsSW1wb3J0ID0gbmV3IFNldChbLi4ubG9jYWxJbXBvcnQsIC4uLnZhbHVlLmltcG9ydGVkU3BlY2lmaWVyc10pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9jYWxJbXBvcnQgPSB2YWx1ZS5pbXBvcnRlZFNwZWNpZmllcnNcbiAgICAgICAgfVxuICAgICAgICBpbXBvcnRzLnNldChrZXksIGxvY2FsSW1wb3J0KVxuICAgICAgfSlcbiAgICAgIGltcG9ydExpc3Quc2V0KGZpbGUsIGltcG9ydHMpXG5cbiAgICAgIC8vIGJ1aWxkIHVwIGV4cG9ydCBsaXN0IG9ubHksIGlmIGZpbGUgaXMgbm90IGlnbm9yZWRcbiAgICAgIGlmIChpZ25vcmVkRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgbmFtZXNwYWNlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gREVGQVVMVCkge1xuICAgICAgICAgIGV4cG9ydHMuc2V0KElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiwgeyB3aGVyZVVzZWQ6IG5ldyBTZXQoKSB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGV4cG9ydHMuc2V0KGtleSwgeyB3aGVyZVVzZWQ6IG5ldyBTZXQoKSB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBleHBvcnRzLnNldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OLCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pXG4gICAgZXhwb3J0cy5zZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIsIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSlcbiAgICBleHBvcnRMaXN0LnNldChmaWxlLCBleHBvcnRzKVxuICB9KVxuICBleHBvcnRBbGwuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIHZhbHVlLmZvckVhY2godmFsID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRFeHBvcnRzID0gZXhwb3J0TGlzdC5nZXQodmFsKVxuICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGN1cnJlbnRFeHBvcnRzLmdldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKVxuICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuYWRkKGtleSlcbiAgICB9KVxuICB9KVxufVxuXG4vKipcbiAqIHRyYXZlcnNlIHRocm91Z2ggYWxsIGltcG9ydHMgYW5kIGFkZCB0aGUgcmVzcGVjdGl2ZSBwYXRoIHRvIHRoZSB3aGVyZVVzZWQtbGlzdFxuICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgZXhwb3J0XG4gKi9cbmNvbnN0IGRldGVybWluZVVzYWdlID0gKCkgPT4ge1xuICBpbXBvcnRMaXN0LmZvckVhY2goKGxpc3RWYWx1ZSwgbGlzdEtleSkgPT4ge1xuICAgIGxpc3RWYWx1ZS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQoa2V5KVxuICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGN1cnJlbnRJbXBvcnQgPT4ge1xuICAgICAgICAgIGxldCBzcGVjaWZpZXJcbiAgICAgICAgICBpZiAoY3VycmVudEltcG9ydCA9PT0gSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpIHtcbiAgICAgICAgICAgIHNwZWNpZmllciA9IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSXG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50SW1wb3J0ID09PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpIHtcbiAgICAgICAgICAgIHNwZWNpZmllciA9IElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUlxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzcGVjaWZpZXIgPSBjdXJyZW50SW1wb3J0XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygc3BlY2lmaWVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgZXhwb3J0U3RhdGVtZW50ID0gZXhwb3J0cy5nZXQoc3BlY2lmaWVyKVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRTdGF0ZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgd2hlcmVVc2VkIH0gPSBleHBvcnRTdGF0ZW1lbnRcbiAgICAgICAgICAgICAgd2hlcmVVc2VkLmFkZChsaXN0S2V5KVxuICAgICAgICAgICAgICBleHBvcnRzLnNldChzcGVjaWZpZXIsIHsgd2hlcmVVc2VkIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG59XG5cbmNvbnN0IGdldFNyYyA9IHNyYyA9PiB7XG4gIGlmIChzcmMpIHtcbiAgICByZXR1cm4gc3JjXG4gIH1cbiAgcmV0dXJuIFtwcm9jZXNzLmN3ZCgpXVxufVxuXG4vKipcbiAqIHByZXBhcmUgdGhlIGxpc3RzIG9mIGV4aXN0aW5nIGltcG9ydHMgYW5kIGV4cG9ydHMgLSBzaG91bGQgb25seSBiZSBleGVjdXRlZCBvbmNlIGF0XG4gKiB0aGUgc3RhcnQgb2YgYSBuZXcgZXNsaW50IHJ1blxuICovXG5sZXQgc3JjRmlsZXNcbmxldCBsYXN0UHJlcGFyZUtleVxuY29uc3QgZG9QcmVwYXJhdGlvbiA9IChzcmMsIGlnbm9yZUV4cG9ydHMsIGNvbnRleHQpID0+IHtcbiAgY29uc3QgcHJlcGFyZUtleSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBzcmM6IChzcmMgfHwgW10pLnNvcnQoKSxcbiAgICBpZ25vcmVFeHBvcnRzOiAoaWdub3JlRXhwb3J0cyB8fCBbXSkuc29ydCgpLFxuICAgIGV4dGVuc2lvbnM6IEFycmF5LmZyb20oZ2V0RmlsZUV4dGVuc2lvbnMoY29udGV4dC5zZXR0aW5ncykpLnNvcnQoKSxcbiAgfSlcbiAgaWYgKHByZXBhcmVLZXkgPT09IGxhc3RQcmVwYXJlS2V5KSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpbXBvcnRMaXN0LmNsZWFyKClcbiAgZXhwb3J0TGlzdC5jbGVhcigpXG4gIGlnbm9yZWRGaWxlcy5jbGVhcigpXG4gIGZpbGVzT3V0c2lkZVNyYy5jbGVhcigpXG5cbiAgc3JjRmlsZXMgPSByZXNvbHZlRmlsZXMoZ2V0U3JjKHNyYyksIGlnbm9yZUV4cG9ydHMsIGNvbnRleHQpXG4gIHByZXBhcmVJbXBvcnRzQW5kRXhwb3J0cyhzcmNGaWxlcywgY29udGV4dClcbiAgZGV0ZXJtaW5lVXNhZ2UoKVxuICBsYXN0UHJlcGFyZUtleSA9IHByZXBhcmVLZXlcbn1cblxuY29uc3QgbmV3TmFtZXNwYWNlSW1wb3J0RXhpc3RzID0gc3BlY2lmaWVycyA9PlxuICBzcGVjaWZpZXJzLnNvbWUoKHsgdHlwZSB9KSA9PiB0eXBlID09PSBJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUilcblxuY29uc3QgbmV3RGVmYXVsdEltcG9ydEV4aXN0cyA9IHNwZWNpZmllcnMgPT5cbiAgc3BlY2lmaWVycy5zb21lKCh7IHR5cGUgfSkgPT4gdHlwZSA9PT0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKVxuXG5jb25zdCBmaWxlSXNJblBrZyA9IGZpbGUgPT4ge1xuICBjb25zdCB7IHBhdGgsIHBrZyB9ID0gcmVhZFBrZ1VwLnN5bmMoe2N3ZDogZmlsZSwgbm9ybWFsaXplOiBmYWxzZX0pXG4gIGNvbnN0IGJhc2VQYXRoID0gZGlybmFtZShwYXRoKVxuXG4gIGNvbnN0IGNoZWNrUGtnRmllbGRTdHJpbmcgPSBwa2dGaWVsZCA9PiB7XG4gICAgaWYgKGpvaW4oYmFzZVBhdGgsIHBrZ0ZpZWxkKSA9PT0gZmlsZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICB9XG5cbiAgY29uc3QgY2hlY2tQa2dGaWVsZE9iamVjdCA9IHBrZ0ZpZWxkID0+IHtcbiAgICAgIGNvbnN0IHBrZ0ZpZWxkRmlsZXMgPSB2YWx1ZXMocGtnRmllbGQpLm1hcCh2YWx1ZSA9PiBqb2luKGJhc2VQYXRoLCB2YWx1ZSkpXG4gICAgICBpZiAoaW5jbHVkZXMocGtnRmllbGRGaWxlcywgZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNoZWNrUGtnRmllbGQgPSBwa2dGaWVsZCA9PiB7XG4gICAgaWYgKHR5cGVvZiBwa2dGaWVsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBjaGVja1BrZ0ZpZWxkU3RyaW5nKHBrZ0ZpZWxkKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcGtnRmllbGQgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gY2hlY2tQa2dGaWVsZE9iamVjdChwa2dGaWVsZClcbiAgICB9XG4gIH1cblxuICBpZiAocGtnLnByaXZhdGUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChwa2cuYmluKSB7XG4gICAgaWYgKGNoZWNrUGtnRmllbGQocGtnLmJpbikpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgaWYgKHBrZy5icm93c2VyKSB7XG4gICAgaWYgKGNoZWNrUGtnRmllbGQocGtnLmJyb3dzZXIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGlmIChwa2cubWFpbikge1xuICAgIGlmIChjaGVja1BrZ0ZpZWxkU3RyaW5nKHBrZy5tYWluKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAnc3VnZ2VzdGlvbicsXG4gICAgZG9jczogeyB1cmw6IGRvY3NVcmwoJ25vLXVudXNlZC1tb2R1bGVzJykgfSxcbiAgICBzY2hlbWE6IFt7XG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHNyYzoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnZmlsZXMvcGF0aHMgdG8gYmUgYW5hbHl6ZWQgKG9ubHkgZm9yIHVudXNlZCBleHBvcnRzKScsXG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBtaW5JdGVtczogMSxcbiAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBtaW5MZW5ndGg6IDEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgaWdub3JlRXhwb3J0czoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ2ZpbGVzL3BhdGhzIGZvciB3aGljaCB1bnVzZWQgZXhwb3J0cyB3aWxsIG5vdCBiZSByZXBvcnRlZCAoZS5nIG1vZHVsZSBlbnRyeSBwb2ludHMpJyxcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIG1pbkl0ZW1zOiAxLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBtaXNzaW5nRXhwb3J0czoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAncmVwb3J0IG1vZHVsZXMgd2l0aG91dCBhbnkgZXhwb3J0cycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICB1bnVzZWRFeHBvcnRzOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdyZXBvcnQgZXhwb3J0cyB3aXRob3V0IGFueSB1c2FnZScsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG5vdDoge1xuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgdW51c2VkRXhwb3J0czogeyBlbnVtOiBbZmFsc2VdIH0sXG4gICAgICAgICAgbWlzc2luZ0V4cG9ydHM6IHsgZW51bTogW2ZhbHNlXSB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFueU9mOlt7XG4gICAgICAgIG5vdDoge1xuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHVudXNlZEV4cG9ydHM6IHsgZW51bTogW3RydWVdIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFsnbWlzc2luZ0V4cG9ydHMnXSxcbiAgICAgIH0sIHtcbiAgICAgICAgbm90OiB7XG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgbWlzc2luZ0V4cG9ydHM6IHsgZW51bTogW3RydWVdIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFsndW51c2VkRXhwb3J0cyddLFxuICAgICAgfSwge1xuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgdW51c2VkRXhwb3J0czogeyBlbnVtOiBbdHJ1ZV0gfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFsndW51c2VkRXhwb3J0cyddLFxuICAgICAgfSwge1xuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgbWlzc2luZ0V4cG9ydHM6IHsgZW51bTogW3RydWVdIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVpcmVkOiBbJ21pc3NpbmdFeHBvcnRzJ10sXG4gICAgICB9XSxcbiAgICB9XSxcbiAgfSxcblxuICBjcmVhdGU6IGNvbnRleHQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHNyYyxcbiAgICAgIGlnbm9yZUV4cG9ydHMgPSBbXSxcbiAgICAgIG1pc3NpbmdFeHBvcnRzLFxuICAgICAgdW51c2VkRXhwb3J0cyxcbiAgICB9ID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHt9XG5cbiAgICBpZiAodW51c2VkRXhwb3J0cykge1xuICAgICAgZG9QcmVwYXJhdGlvbihzcmMsIGlnbm9yZUV4cG9ydHMsIGNvbnRleHQpXG4gICAgfVxuXG4gICAgY29uc3QgZmlsZSA9IGNvbnRleHQuZ2V0RmlsZW5hbWUoKVxuXG4gICAgY29uc3QgY2hlY2tFeHBvcnRQcmVzZW5jZSA9IG5vZGUgPT4ge1xuICAgICAgaWYgKCFtaXNzaW5nRXhwb3J0cykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGlnbm9yZWRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4cG9ydENvdW50ID0gZXhwb3J0TGlzdC5nZXQoZmlsZSlcbiAgICAgIGNvbnN0IGV4cG9ydEFsbCA9IGV4cG9ydENvdW50LmdldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKVxuICAgICAgY29uc3QgbmFtZXNwYWNlSW1wb3J0cyA9IGV4cG9ydENvdW50LmdldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUilcblxuICAgICAgZXhwb3J0Q291bnQuZGVsZXRlKEVYUE9SVF9BTExfREVDTEFSQVRJT04pXG4gICAgICBleHBvcnRDb3VudC5kZWxldGUoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpXG4gICAgICBpZiAoZXhwb3J0Q291bnQuc2l6ZSA8IDEpIHtcbiAgICAgICAgLy8gbm9kZS5ib2R5WzBdID09PSAndW5kZWZpbmVkJyBvbmx5IGhhcHBlbnMsIGlmIGV2ZXJ5dGhpbmcgaXMgY29tbWVudGVkIG91dCBpbiB0aGUgZmlsZVxuICAgICAgICAvLyBiZWluZyBsaW50ZWRcbiAgICAgICAgY29udGV4dC5yZXBvcnQobm9kZS5ib2R5WzBdID8gbm9kZS5ib2R5WzBdIDogbm9kZSwgJ05vIGV4cG9ydHMgZm91bmQnKVxuICAgICAgfVxuICAgICAgZXhwb3J0Q291bnQuc2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04sIGV4cG9ydEFsbClcbiAgICAgIGV4cG9ydENvdW50LnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgbmFtZXNwYWNlSW1wb3J0cylcbiAgICB9XG5cbiAgICBjb25zdCBjaGVja1VzYWdlID0gKG5vZGUsIGV4cG9ydGVkVmFsdWUpID0+IHtcbiAgICAgIGlmICghdW51c2VkRXhwb3J0cykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGlnbm9yZWRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChmaWxlSXNJblBrZyhmaWxlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVzT3V0c2lkZVNyYy5oYXMoZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBmaWxlIHRvIGJlIGxpbnRlZCBpcyBpbmNsdWRlZCBpbiBzb3VyY2UgZmlsZXNcbiAgICAgIGlmICghc3JjRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHNyY0ZpbGVzID0gcmVzb2x2ZUZpbGVzKGdldFNyYyhzcmMpLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KVxuICAgICAgICBpZiAoIXNyY0ZpbGVzLmhhcyhmaWxlKSkge1xuICAgICAgICAgIGZpbGVzT3V0c2lkZVNyYy5hZGQoZmlsZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQoZmlsZSlcblxuICAgICAgLy8gc3BlY2lhbCBjYXNlOiBleHBvcnQgKiBmcm9tXG4gICAgICBjb25zdCBleHBvcnRBbGwgPSBleHBvcnRzLmdldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKVxuICAgICAgaWYgKHR5cGVvZiBleHBvcnRBbGwgIT09ICd1bmRlZmluZWQnICYmIGV4cG9ydGVkVmFsdWUgIT09IElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUikge1xuICAgICAgICBpZiAoZXhwb3J0QWxsLndoZXJlVXNlZC5zaXplID4gMCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHNwZWNpYWwgY2FzZTogbmFtZXNwYWNlIGltcG9ydFxuICAgICAgY29uc3QgbmFtZXNwYWNlSW1wb3J0cyA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKVxuICAgICAgaWYgKHR5cGVvZiBuYW1lc3BhY2VJbXBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAobmFtZXNwYWNlSW1wb3J0cy53aGVyZVVzZWQuc2l6ZSA+IDApIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBleHBvcnRzTGlzdCB3aWxsIGFsd2F5cyBtYXAgYW55IGltcG9ydGVkIHZhbHVlIG9mICdkZWZhdWx0JyB0byAnSW1wb3J0RGVmYXVsdFNwZWNpZmllcidcbiAgICAgIGNvbnN0IGV4cG9ydHNLZXkgPSBleHBvcnRlZFZhbHVlID09PSBERUZBVUxUID8gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSIDogZXhwb3J0ZWRWYWx1ZVxuXG4gICAgICBjb25zdCBleHBvcnRTdGF0ZW1lbnQgPSBleHBvcnRzLmdldChleHBvcnRzS2V5KVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IGV4cG9ydHNLZXkgPT09IElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiA/IERFRkFVTFQgOiBleHBvcnRzS2V5XG5cbiAgICAgIGlmICh0eXBlb2YgZXhwb3J0U3RhdGVtZW50ICE9PSAndW5kZWZpbmVkJyl7XG4gICAgICAgIGlmIChleHBvcnRTdGF0ZW1lbnQud2hlcmVVc2VkLnNpemUgPCAxKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgYGV4cG9ydGVkIGRlY2xhcmF0aW9uICcke3ZhbHVlfScgbm90IHVzZWQgd2l0aGluIG90aGVyIG1vZHVsZXNgXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LnJlcG9ydChcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGBleHBvcnRlZCBkZWNsYXJhdGlvbiAnJHt2YWx1ZX0nIG5vdCB1c2VkIHdpdGhpbiBvdGhlciBtb2R1bGVzYFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogb25seSB1c2VmdWwgZm9yIHRvb2xzIGxpa2UgdnNjb2RlLWVzbGludFxuICAgICAqXG4gICAgICogdXBkYXRlIGxpc3RzIG9mIGV4aXN0aW5nIGV4cG9ydHMgZHVyaW5nIHJ1bnRpbWVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVFeHBvcnRVc2FnZSA9IG5vZGUgPT4ge1xuICAgICAgaWYgKGlnbm9yZWRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxldCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQoZmlsZSlcblxuICAgICAgLy8gbmV3IG1vZHVsZSBoYXMgYmVlbiBjcmVhdGVkIGR1cmluZyBydW50aW1lXG4gICAgICAvLyBpbmNsdWRlIGl0IGluIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgICAgaWYgKHR5cGVvZiBleHBvcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBleHBvcnRzID0gbmV3IE1hcCgpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0V4cG9ydHMgPSBuZXcgTWFwKClcbiAgICAgIGNvbnN0IG5ld0V4cG9ydElkZW50aWZpZXJzID0gbmV3IFNldCgpXG5cbiAgICAgIG5vZGUuYm9keS5mb3JFYWNoKCh7IHR5cGUsIGRlY2xhcmF0aW9uLCBzcGVjaWZpZXJzIH0pID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09IEVYUE9SVF9ERUZBVUxUX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgbmV3RXhwb3J0SWRlbnRpZmllcnMuYWRkKElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUilcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gRVhQT1JUX05BTUVEX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3BlY2lmaWVycy5mb3JFYWNoKHNwZWNpZmllciA9PiB7XG4gICAgICAgICAgICAgIGlmIChzcGVjaWZpZXIuZXhwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBuZXdFeHBvcnRJZGVudGlmaWVycy5hZGQoc3BlY2lmaWVyLmV4cG9ydGVkLm5hbWUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2hEZWNsYXJhdGlvbklkZW50aWZpZXIoZGVjbGFyYXRpb24sIChuYW1lKSA9PiB7XG4gICAgICAgICAgICBuZXdFeHBvcnRJZGVudGlmaWVycy5hZGQobmFtZSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBvbGQgZXhwb3J0cyBleGlzdCB3aXRoaW4gbGlzdCBvZiBuZXcgZXhwb3J0cyBpZGVudGlmaWVyczogYWRkIHRvIG1hcCBvZiBuZXcgZXhwb3J0c1xuICAgICAgZXhwb3J0cy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChuZXdFeHBvcnRJZGVudGlmaWVycy5oYXMoa2V5KSkge1xuICAgICAgICAgIG5ld0V4cG9ydHMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5ldyBleHBvcnQgaWRlbnRpZmllcnMgYWRkZWQ6IGFkZCB0byBtYXAgb2YgbmV3IGV4cG9ydHNcbiAgICAgIG5ld0V4cG9ydElkZW50aWZpZXJzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKCFleHBvcnRzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgbmV3RXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIHByZXNlcnZlIGluZm9ybWF0aW9uIGFib3V0IG5hbWVzcGFjZSBpbXBvcnRzXG4gICAgICBsZXQgZXhwb3J0QWxsID0gZXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTilcbiAgICAgIGxldCBuYW1lc3BhY2VJbXBvcnRzID0gZXhwb3J0cy5nZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpXG5cbiAgICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlSW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbmFtZXNwYWNlSW1wb3J0cyA9IHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfVxuICAgICAgfVxuXG4gICAgICBuZXdFeHBvcnRzLnNldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OLCBleHBvcnRBbGwpXG4gICAgICBuZXdFeHBvcnRzLnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgbmFtZXNwYWNlSW1wb3J0cylcbiAgICAgIGV4cG9ydExpc3Quc2V0KGZpbGUsIG5ld0V4cG9ydHMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogb25seSB1c2VmdWwgZm9yIHRvb2xzIGxpa2UgdnNjb2RlLWVzbGludFxuICAgICAqXG4gICAgICogdXBkYXRlIGxpc3RzIG9mIGV4aXN0aW5nIGltcG9ydHMgZHVyaW5nIHJ1bnRpbWVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVJbXBvcnRVc2FnZSA9IG5vZGUgPT4ge1xuICAgICAgaWYgKCF1bnVzZWRFeHBvcnRzKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBsZXQgb2xkSW1wb3J0UGF0aHMgPSBpbXBvcnRMaXN0LmdldChmaWxlKVxuICAgICAgaWYgKHR5cGVvZiBvbGRJbXBvcnRQYXRocyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb2xkSW1wb3J0UGF0aHMgPSBuZXcgTWFwKClcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2xkTmFtZXNwYWNlSW1wb3J0cyA9IG5ldyBTZXQoKVxuICAgICAgY29uc3QgbmV3TmFtZXNwYWNlSW1wb3J0cyA9IG5ldyBTZXQoKVxuXG4gICAgICBjb25zdCBvbGRFeHBvcnRBbGwgPSBuZXcgU2V0KClcbiAgICAgIGNvbnN0IG5ld0V4cG9ydEFsbCA9IG5ldyBTZXQoKVxuXG4gICAgICBjb25zdCBvbGREZWZhdWx0SW1wb3J0cyA9IG5ldyBTZXQoKVxuICAgICAgY29uc3QgbmV3RGVmYXVsdEltcG9ydHMgPSBuZXcgU2V0KClcblxuICAgICAgY29uc3Qgb2xkSW1wb3J0cyA9IG5ldyBNYXAoKVxuICAgICAgY29uc3QgbmV3SW1wb3J0cyA9IG5ldyBNYXAoKVxuICAgICAgb2xkSW1wb3J0UGF0aHMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUuaGFzKEVYUE9SVF9BTExfREVDTEFSQVRJT04pKSB7XG4gICAgICAgICAgb2xkRXhwb3J0QWxsLmFkZChrZXkpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLmhhcyhJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUikpIHtcbiAgICAgICAgICBvbGROYW1lc3BhY2VJbXBvcnRzLmFkZChrZXkpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLmhhcyhJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpKSB7XG4gICAgICAgICAgb2xkRGVmYXVsdEltcG9ydHMuYWRkKGtleSlcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZS5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgaWYgKHZhbCAhPT0gSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIgJiZcbiAgICAgICAgICAgICAgdmFsICE9PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpIHtcbiAgICAgICAgICAgICAgIG9sZEltcG9ydHMuc2V0KHZhbCwga2V5KVxuICAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIG5vZGUuYm9keS5mb3JFYWNoKGFzdE5vZGUgPT4ge1xuICAgICAgICBsZXQgcmVzb2x2ZWRQYXRoXG5cbiAgICAgICAgLy8gc3VwcG9ydCBmb3IgZXhwb3J0IHsgdmFsdWUgfSBmcm9tICdtb2R1bGUnXG4gICAgICAgIGlmIChhc3ROb2RlLnR5cGUgPT09IEVYUE9SVF9OQU1FRF9ERUNMQVJBVElPTikge1xuICAgICAgICAgIGlmIChhc3ROb2RlLnNvdXJjZSkge1xuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShhc3ROb2RlLnNvdXJjZS5yYXcucmVwbGFjZSgvKCd8XCIpL2csICcnKSwgY29udGV4dClcbiAgICAgICAgICAgIGFzdE5vZGUuc3BlY2lmaWVycy5mb3JFYWNoKHNwZWNpZmllciA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBzcGVjaWZpZXIubG9jYWwubmFtZVxuICAgICAgICAgICAgICBpZiAoc3BlY2lmaWVyLmxvY2FsLm5hbWUgPT09IERFRkFVTFQpIHtcbiAgICAgICAgICAgICAgICBuZXdEZWZhdWx0SW1wb3J0cy5hZGQocmVzb2x2ZWRQYXRoKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld0ltcG9ydHMuc2V0KG5hbWUsIHJlc29sdmVkUGF0aClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXN0Tm9kZS50eXBlID09PSBFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShhc3ROb2RlLnNvdXJjZS5yYXcucmVwbGFjZSgvKCd8XCIpL2csICcnKSwgY29udGV4dClcbiAgICAgICAgICBuZXdFeHBvcnRBbGwuYWRkKHJlc29sdmVkUGF0aClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhc3ROb2RlLnR5cGUgPT09IElNUE9SVF9ERUNMQVJBVElPTikge1xuICAgICAgICAgIHJlc29sdmVkUGF0aCA9IHJlc29sdmUoYXN0Tm9kZS5zb3VyY2UucmF3LnJlcGxhY2UoLygnfFwiKS9nLCAnJyksIGNvbnRleHQpXG4gICAgICAgICAgaWYgKCFyZXNvbHZlZFBhdGgpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc05vZGVNb2R1bGUocmVzb2x2ZWRQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5ld05hbWVzcGFjZUltcG9ydEV4aXN0cyhhc3ROb2RlLnNwZWNpZmllcnMpKSB7XG4gICAgICAgICAgICBuZXdOYW1lc3BhY2VJbXBvcnRzLmFkZChyZXNvbHZlZFBhdGgpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5ld0RlZmF1bHRJbXBvcnRFeGlzdHMoYXN0Tm9kZS5zcGVjaWZpZXJzKSkge1xuICAgICAgICAgICAgbmV3RGVmYXVsdEltcG9ydHMuYWRkKHJlc29sdmVkUGF0aClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhc3ROb2RlLnNwZWNpZmllcnMuZm9yRWFjaChzcGVjaWZpZXIgPT4ge1xuICAgICAgICAgICAgaWYgKHNwZWNpZmllci50eXBlID09PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgfHxcbiAgICAgICAgICAgICAgICBzcGVjaWZpZXIudHlwZSA9PT0gSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdJbXBvcnRzLnNldChzcGVjaWZpZXIuaW1wb3J0ZWQubmFtZSwgcmVzb2x2ZWRQYXRoKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIG5ld0V4cG9ydEFsbC5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKCFvbGRFeHBvcnRBbGwuaGFzKHZhbHVlKSkge1xuICAgICAgICAgIGxldCBpbXBvcnRzID0gb2xkSW1wb3J0UGF0aHMuZ2V0KHZhbHVlKVxuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KClcbiAgICAgICAgICB9XG4gICAgICAgICAgaW1wb3J0cy5hZGQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTilcbiAgICAgICAgICBvbGRJbXBvcnRQYXRocy5zZXQodmFsdWUsIGltcG9ydHMpXG5cbiAgICAgICAgICBsZXQgZXhwb3J0cyA9IGV4cG9ydExpc3QuZ2V0KHZhbHVlKVxuICAgICAgICAgIGxldCBjdXJyZW50RXhwb3J0XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9ydHMgPSBuZXcgTWFwKClcbiAgICAgICAgICAgIGV4cG9ydExpc3Quc2V0KHZhbHVlLCBleHBvcnRzKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmFkZChmaWxlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB3aGVyZVVzZWQgPSBuZXcgU2V0KClcbiAgICAgICAgICAgIHdoZXJlVXNlZC5hZGQoZmlsZSlcbiAgICAgICAgICAgIGV4cG9ydHMuc2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04sIHsgd2hlcmVVc2VkIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBvbGRFeHBvcnRBbGwuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIGlmICghbmV3RXhwb3J0QWxsLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBpbXBvcnRzID0gb2xkSW1wb3J0UGF0aHMuZ2V0KHZhbHVlKVxuICAgICAgICAgIGltcG9ydHMuZGVsZXRlKEVYUE9SVF9BTExfREVDTEFSQVRJT04pXG5cbiAgICAgICAgICBjb25zdCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQodmFsdWUpXG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04pXG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmRlbGV0ZShmaWxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgbmV3RGVmYXVsdEltcG9ydHMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIGlmICghb2xkRGVmYXVsdEltcG9ydHMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgIGxldCBpbXBvcnRzID0gb2xkSW1wb3J0UGF0aHMuZ2V0KHZhbHVlKVxuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KClcbiAgICAgICAgICB9XG4gICAgICAgICAgaW1wb3J0cy5hZGQoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKVxuICAgICAgICAgIG9sZEltcG9ydFBhdGhzLnNldCh2YWx1ZSwgaW1wb3J0cylcblxuICAgICAgICAgIGxldCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQodmFsdWUpXG4gICAgICAgICAgbGV0IGN1cnJlbnRFeHBvcnRcbiAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0ID0gZXhwb3J0cy5nZXQoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHBvcnRzID0gbmV3IE1hcCgpXG4gICAgICAgICAgICBleHBvcnRMaXN0LnNldCh2YWx1ZSwgZXhwb3J0cylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5hZGQoZmlsZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2hlcmVVc2VkID0gbmV3IFNldCgpXG4gICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGZpbGUpXG4gICAgICAgICAgICBleHBvcnRzLnNldChJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIsIHsgd2hlcmVVc2VkIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBvbGREZWZhdWx0SW1wb3J0cy5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgaWYgKCFuZXdEZWZhdWx0SW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSlcbiAgICAgICAgICBpbXBvcnRzLmRlbGV0ZShJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpXG5cbiAgICAgICAgICBjb25zdCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQodmFsdWUpXG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUilcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuZGVsZXRlKGZpbGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBuZXdOYW1lc3BhY2VJbXBvcnRzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBpZiAoIW9sZE5hbWVzcGFjZUltcG9ydHMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgIGxldCBpbXBvcnRzID0gb2xkSW1wb3J0UGF0aHMuZ2V0KHZhbHVlKVxuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KClcbiAgICAgICAgICB9XG4gICAgICAgICAgaW1wb3J0cy5hZGQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpXG4gICAgICAgICAgb2xkSW1wb3J0UGF0aHMuc2V0KHZhbHVlLCBpbXBvcnRzKVxuXG4gICAgICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSlcbiAgICAgICAgICBsZXQgY3VycmVudEV4cG9ydFxuICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQgPSBleHBvcnRzLmdldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwb3J0cyA9IG5ldyBNYXAoKVxuICAgICAgICAgICAgZXhwb3J0TGlzdC5zZXQodmFsdWUsIGV4cG9ydHMpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuYWRkKGZpbGUpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHdoZXJlVXNlZCA9IG5ldyBTZXQoKVxuICAgICAgICAgICAgd2hlcmVVc2VkLmFkZChmaWxlKVxuICAgICAgICAgICAgZXhwb3J0cy5zZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIsIHsgd2hlcmVVc2VkIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBvbGROYW1lc3BhY2VJbXBvcnRzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBpZiAoIW5ld05hbWVzcGFjZUltcG9ydHMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpXG4gICAgICAgICAgaW1wb3J0cy5kZWxldGUoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpXG5cbiAgICAgICAgICBjb25zdCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQodmFsdWUpXG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5kZWxldGUoZmlsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIG5ld0ltcG9ydHMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoIW9sZEltcG9ydHMuaGFzKGtleSkpIHtcbiAgICAgICAgICBsZXQgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSlcbiAgICAgICAgICBpZiAodHlwZW9mIGltcG9ydHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpbXBvcnRzID0gbmV3IFNldCgpXG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKGtleSlcbiAgICAgICAgICBvbGRJbXBvcnRQYXRocy5zZXQodmFsdWUsIGltcG9ydHMpXG5cbiAgICAgICAgICBsZXQgZXhwb3J0cyA9IGV4cG9ydExpc3QuZ2V0KHZhbHVlKVxuICAgICAgICAgIGxldCBjdXJyZW50RXhwb3J0XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KGtleSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwb3J0cyA9IG5ldyBNYXAoKVxuICAgICAgICAgICAgZXhwb3J0TGlzdC5zZXQodmFsdWUsIGV4cG9ydHMpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuYWRkKGZpbGUpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHdoZXJlVXNlZCA9IG5ldyBTZXQoKVxuICAgICAgICAgICAgd2hlcmVVc2VkLmFkZChmaWxlKVxuICAgICAgICAgICAgZXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZCB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgb2xkSW1wb3J0cy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmICghbmV3SW1wb3J0cy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpXG4gICAgICAgICAgaW1wb3J0cy5kZWxldGUoa2V5KVxuXG4gICAgICAgICAgY29uc3QgZXhwb3J0cyA9IGV4cG9ydExpc3QuZ2V0KHZhbHVlKVxuICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFeHBvcnQgPSBleHBvcnRzLmdldChrZXkpXG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmRlbGV0ZShmaWxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ1Byb2dyYW06ZXhpdCc6IG5vZGUgPT4ge1xuICAgICAgICB1cGRhdGVFeHBvcnRVc2FnZShub2RlKVxuICAgICAgICB1cGRhdGVJbXBvcnRVc2FnZShub2RlKVxuICAgICAgICBjaGVja0V4cG9ydFByZXNlbmNlKG5vZGUpXG4gICAgICB9LFxuICAgICAgJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbic6IG5vZGUgPT4ge1xuICAgICAgICBjaGVja1VzYWdlKG5vZGUsIElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUilcbiAgICAgIH0sXG4gICAgICAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbic6IG5vZGUgPT4ge1xuICAgICAgICBub2RlLnNwZWNpZmllcnMuZm9yRWFjaChzcGVjaWZpZXIgPT4ge1xuICAgICAgICAgICAgY2hlY2tVc2FnZShub2RlLCBzcGVjaWZpZXIuZXhwb3J0ZWQubmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgZm9yRWFjaERlY2xhcmF0aW9uSWRlbnRpZmllcihub2RlLmRlY2xhcmF0aW9uLCAobmFtZSkgPT4ge1xuICAgICAgICAgIGNoZWNrVXNhZ2Uobm9kZSwgbmFtZSlcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-useless-path-segments.js b/node_modules/eslint-plugin-import/lib/rules/no-useless-path-segments.js
index e4c6d2b..10b6574 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-useless-path-segments.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-useless-path-segments.js
@@ -1,50 +1,35 @@
 'use strict';
 
+
+
+
 var _ignore = require('eslint-module-utils/ignore');
-
-var _moduleVisitor = require('eslint-module-utils/moduleVisitor');
-
-var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
-
-var _resolve = require('eslint-module-utils/resolve');
-
-var _resolve2 = _interopRequireDefault(_resolve);
-
-var _path = require('path');
-
-var _path2 = _interopRequireDefault(_path);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _moduleVisitor = require('eslint-module-utils/moduleVisitor');var _moduleVisitor2 = _interopRequireDefault(_moduleVisitor);
+var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);
+var _path = require('path');var _path2 = _interopRequireDefault(_path);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 /**
- * convert a potentially relative path from node utils into a true
- * relative path.
- *
- * ../ -> ..
- * ./ -> .
- * .foo/bar -> ./.foo/bar
- * ..foo/bar -> ./..foo/bar
- * foo/bar -> ./foo/bar
- *
- * @param relativePath {string} relative posix path potentially missing leading './'
- * @returns {string} relative posix path that always starts with a ./
- **/
+                                                                                                                                                                                     * convert a potentially relative path from node utils into a true
+                                                                                                                                                                                     * relative path.
+                                                                                                                                                                                     *
+                                                                                                                                                                                     * ../ -> ..
+                                                                                                                                                                                     * ./ -> .
+                                                                                                                                                                                     * .foo/bar -> ./.foo/bar
+                                                                                                                                                                                     * ..foo/bar -> ./..foo/bar
+                                                                                                                                                                                     * foo/bar -> ./foo/bar
+                                                                                                                                                                                     *
+                                                                                                                                                                                     * @param relativePath {string} relative posix path potentially missing leading './'
+                                                                                                                                                                                     * @returns {string} relative posix path that always starts with a ./
+                                                                                                                                                                                     **/
 function toRelativePath(relativePath) {
   const stripped = relativePath.replace(/\/$/g, ''); // Remove trailing /
 
-  return (/^((\.\.)|(\.))($|\/)/.test(stripped) ? stripped : `./${stripped}`
-  );
+  return (/^((\.\.)|(\.))($|\/)/.test(stripped) ? stripped : `./${stripped}`);
 } /**
    * @fileOverview Ensures that there are no useless path segments
    * @author Thomas Grainger
-   */
-
-function normalize(fn) {
-  return toRelativePath(_path2.default.posix.normalize(fn));
+   */function normalize(fn) {return toRelativePath(_path2.default.posix.normalize(fn));
 }
 
 function countRelativeParents(pathSegments) {
@@ -55,36 +40,37 @@
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('no-useless-path-segments')
-    },
+      url: (0, _docsUrl2.default)('no-useless-path-segments') },
+
 
     fixable: 'code',
 
-    schema: [{
+    schema: [
+    {
       type: 'object',
       properties: {
         commonjs: { type: 'boolean' },
-        noUselessIndex: { type: 'boolean' }
-      },
-      additionalProperties: false
-    }]
-  },
+        noUselessIndex: { type: 'boolean' } },
+
+      additionalProperties: false }] },
+
+
+
 
   create(context) {
     const currentDir = _path2.default.dirname(context.getFilename());
     const options = context.options[0];
 
-    function checkSourceValue(source) {
-      const importPath = source.value;
-
+    function checkSourceValue(source) {const
+      importPath = source.value;
 
       function reportWithProposedPath(proposedPath) {
         context.report({
           node: source,
           // Note: Using messageIds is not possible due to the support for ESLint 2 and 3
           message: `Useless path segments for "${importPath}", should be "${proposedPath}"`,
-          fix: fixer => proposedPath && fixer.replaceText(source, JSON.stringify(proposedPath))
-        });
+          fix: fixer => proposedPath && fixer.replaceText(source, JSON.stringify(proposedPath)) });
+
       }
 
       // Only relative imports are relevant for this rule --> Skip checking
@@ -101,7 +87,9 @@
       }
 
       const fileExtensions = (0, _ignore.getFileExtensions)(context.settings);
-      const regexUnnecessaryIndex = new RegExp(`.*\\/index(\\${Array.from(fileExtensions).join('|\\')})?$`);
+      const regexUnnecessaryIndex = new RegExp(
+      `.*\\/index(\\${Array.from(fileExtensions).join('|\\')})?$`);
+
 
       // Check if path contains unnecessary index (including a configured extension)
       if (options && options.noUselessIndex && regexUnnecessaryIndex.test(importPath)) {
@@ -142,10 +130,16 @@
       }
 
       // Report and propose minimal number of required relative parents
-      return reportWithProposedPath(toRelativePath(importPathSplit.slice(0, countExpectedRelativeParents).concat(importPathSplit.slice(countImportPathRelativeParents + diff)).join('/')));
+      return reportWithProposedPath(
+      toRelativePath(
+      importPathSplit.
+      slice(0, countExpectedRelativeParents).
+      concat(importPathSplit.slice(countImportPathRelativeParents + diff)).
+      join('/')));
+
+
     }
 
     return (0, _moduleVisitor2.default)(checkSourceValue, options);
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11c2VsZXNzLXBhdGgtc2VnbWVudHMuanMiXSwibmFtZXMiOlsidG9SZWxhdGl2ZVBhdGgiLCJyZWxhdGl2ZVBhdGgiLCJzdHJpcHBlZCIsInJlcGxhY2UiLCJ0ZXN0Iiwibm9ybWFsaXplIiwiZm4iLCJwYXRoIiwicG9zaXgiLCJjb3VudFJlbGF0aXZlUGFyZW50cyIsInBhdGhTZWdtZW50cyIsInJlZHVjZSIsInN1bSIsInBhdGhTZWdtZW50IiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsImZpeGFibGUiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiY29tbW9uanMiLCJub1VzZWxlc3NJbmRleCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiY3JlYXRlIiwiY29udGV4dCIsImN1cnJlbnREaXIiLCJkaXJuYW1lIiwiZ2V0RmlsZW5hbWUiLCJvcHRpb25zIiwiY2hlY2tTb3VyY2VWYWx1ZSIsInNvdXJjZSIsImltcG9ydFBhdGgiLCJ2YWx1ZSIsInJlcG9ydFdpdGhQcm9wb3NlZFBhdGgiLCJwcm9wb3NlZFBhdGgiLCJyZXBvcnQiLCJub2RlIiwibWVzc2FnZSIsImZpeCIsImZpeGVyIiwicmVwbGFjZVRleHQiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhcnRzV2l0aCIsInJlc29sdmVkUGF0aCIsIm5vcm1lZFBhdGgiLCJyZXNvbHZlZE5vcm1lZFBhdGgiLCJmaWxlRXh0ZW5zaW9ucyIsInNldHRpbmdzIiwicmVnZXhVbm5lY2Vzc2FyeUluZGV4IiwiUmVnRXhwIiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsInBhcmVudERpcmVjdG9yeSIsImZpbGVFeHRlbnNpb24iLCJ1bmRlZmluZWQiLCJleHBlY3RlZCIsInJlbGF0aXZlIiwiZXhwZWN0ZWRTcGxpdCIsInNwbGl0Iiwic2VwIiwiaW1wb3J0UGF0aFNwbGl0IiwiY291bnRJbXBvcnRQYXRoUmVsYXRpdmVQYXJlbnRzIiwiY291bnRFeHBl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WixFQUVHRyxNQUZILENBRVVMLGdCQUFnQkksS0FBaEIsQ0FBc0JILGlDQUFpQ0UsSUFBdkQsQ0FGVixFQUdHWixJQUhILENBR1EsR0FIUixDQURGLENBREssQ0FBUDtBQVFEOztBQUVELFdBQU8sNkJBQWN4QixnQkFBZCxFQUFnQ0QsT0FBaEMsQ0FBUDtBQUNEO0FBekdjLENBQWpCIiwiZmlsZSI6Im5vLXVzZWxlc3MtcGF0aC1zZWdtZW50cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVPdmVydmlldyBFbnN1cmVzIHRoYXQgdGhlcmUgYXJlIG5vIHVzZWxlc3MgcGF0aCBzZWdtZW50c1xuICogQGF1dGhvciBUaG9tYXMgR3JhaW5nZXJcbiAqL1xuXG5pbXBvcnQgeyBnZXRGaWxlRXh0ZW5zaW9ucyB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvaWdub3JlJ1xuaW1wb3J0IG1vZHVsZVZpc2l0b3IgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9tb2R1bGVWaXNpdG9yJ1xuaW1wb3J0IHJlc29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbi8qKlxuICogY29udmVydCBhIHBvdGVudGlhbGx5IHJlbGF0aXZlIHBhdGggZnJvbSBub2RlIHV0aWxzIGludG8gYSB0cnVlXG4gKiByZWxhdGl2ZSBwYXRoLlxuICpcbiAqIC4uLyAtPiAuLlxuICogLi8gLT4gLlxuICogLmZvby9iYXIgLT4gLi8uZm9vL2JhclxuICogLi5mb28vYmFyIC0+IC4vLi5mb28vYmFyXG4gKiBmb28vYmFyIC0+IC4vZm9vL2JhclxuICpcbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGgge3N0cmluZ30gcmVsYXRpdmUgcG9zaXggcGF0aCBwb3RlbnRpYWxseSBtaXNzaW5nIGxlYWRpbmcgJy4vJ1xuICogQHJldHVybnMge3N0cmluZ30gcmVsYXRpdmUgcG9zaXggcGF0aCB0aGF0IGFsd2F5cyBzdGFydHMgd2l0aCBhIC4vXG4gKiovXG5mdW5jdGlvbiB0b1JlbGF0aXZlUGF0aChyZWxhdGl2ZVBhdGgpIHtcbiAgY29uc3Qgc3RyaXBwZWQgPSByZWxhdGl2ZVBhdGgucmVwbGFjZSgvXFwvJC9nLCAnJykgLy8gUmVtb3ZlIHRyYWlsaW5nIC9cblxuICByZXR1cm4gL14oKFxcLlxcLil8KFxcLikpKCR8XFwvKS8udGVzdChzdHJpcHBlZCkgPyBzdHJpcHBlZCA6IGAuLyR7c3RyaXBwZWR9YFxufVxuXG5mdW5jdGlvbiBub3JtYWxpemUoZm4pIHtcbiAgcmV0dXJuIHRvUmVsYXRpdmVQYXRoKHBhdGgucG9zaXgubm9ybWFsaXplKGZuKSlcbn1cblxuZnVuY3Rpb24gY291bnRSZWxhdGl2ZVBhcmVudHMocGF0aFNlZ21lbnRzKSB7XG4gIHJldHVybiBwYXRoU2VnbWVudHMucmVkdWNlKChzdW0sIHBhdGhTZWdtZW50KSA9PiBwYXRoU2VnbWVudCA9PT0gJy4uJyA/IHN1bSArIDEgOiBzdW0sIDApXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnbm8tdXNlbGVzcy1wYXRoLXNlZ21lbnRzJyksXG4gICAgfSxcblxuICAgIGZpeGFibGU6ICdjb2RlJyxcblxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGNvbW1vbmpzOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICAgIG5vVXNlbGVzc0luZGV4OiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICB9LFxuICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5cbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCBjdXJyZW50RGlyID0gcGF0aC5kaXJuYW1lKGNvbnRleHQuZ2V0RmlsZW5hbWUoKSlcbiAgICBjb25zdCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zWzBdXG5cbiAgICBmdW5jdGlvbiBjaGVja1NvdXJjZVZhbHVlKHNvdXJjZSkge1xuICAgICAgY29uc3QgeyB2YWx1ZTogaW1wb3J0UGF0aCB9ID0gc291cmNlXG5cbiAgICAgIGZ1bmN0aW9uIHJlcG9ydFdpdGhQcm9wb3NlZFBhdGgocHJvcG9zZWRQYXRoKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICBub2RlOiBzb3VyY2UsXG4gICAgICAgICAgLy8gTm90ZTogVXNpbmcgbWVzc2FnZUlkcyBpcyBub3QgcG9zc2libGUgZHVlIHRvIHRoZSBzdXBwb3J0IGZvciBFU0xpbnQgMiBhbmQgM1xuICAgICAgICAgIG1lc3NhZ2U6IGBVc2VsZXNzIHBhdGggc2VnbWVudHMgZm9yIFwiJHtpbXBvcnRQYXRofVwiLCBzaG91bGQgYmUgXCIke3Byb3Bvc2VkUGF0aH1cImAsXG4gICAgICAgICAgZml4OiBmaXhlciA9PiBwcm9wb3NlZFBhdGggJiYgZml4ZXIucmVwbGFjZVRleHQoc291cmNlLCBKU09OLnN0cmluZ2lmeShwcm9wb3NlZFBhdGgpKSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gT25seSByZWxhdGl2ZSBpbXBvcnRzIGFyZSByZWxldmFudCBmb3IgdGhpcyBydWxlIC0tPiBTa2lwIGNoZWNraW5nXG4gICAgICBpZiAoIWltcG9ydFBhdGguc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBSZXBvcnQgcnVsZSB2aW9sYXRpb24gaWYgcGF0aCBpcyBub3QgdGhlIHNob3J0ZXN0IHBvc3NpYmxlXG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlKGltcG9ydFBhdGgsIGNvbnRleHQpXG4gICAgICBjb25zdCBub3JtZWRQYXRoID0gbm9ybWFsaXplKGltcG9ydFBhdGgpXG4gICAgICBjb25zdCByZXNvbHZlZE5vcm1lZFBhdGggPSByZXNvbHZlKG5vcm1lZFBhdGgsIGNvbnRleHQpXG4gICAgICBpZiAobm9ybWVkUGF0aCAhPT0gaW1wb3J0UGF0aCAmJiByZXNvbHZlZFBhdGggPT09IHJlc29sdmVkTm9ybWVkUGF0aCkge1xuICAgICAgICByZXR1cm4gcmVwb3J0V2l0aFByb3Bvc2VkUGF0aChub3JtZWRQYXRoKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWxlRXh0ZW5zaW9ucyA9IGdldEZpbGVFeHRlbnNpb25zKGNvbnRleHQuc2V0dGluZ3MpXG4gICAgICBjb25zdCByZWdleFVubmVjZXNzYXJ5SW5kZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICBgLipcXFxcL2luZGV4KFxcXFwke0FycmF5LmZyb20oZmlsZUV4dGVuc2lvbnMpLmpvaW4oJ3xcXFxcJyl9KT8kYFxuICAgICAgKVxuXG4gICAgICAvLyBDaGVjayBpZiBwYXRoIGNvbnRhaW5zIHVubmVjZXNzYXJ5IGluZGV4IChpbmNsdWRpbmcgYSBjb25maWd1cmVkIGV4dGVuc2lvbilcbiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubm9Vc2VsZXNzSW5kZXggJiYgcmVnZXhVbm5lY2Vzc2FyeUluZGV4LnRlc3QoaW1wb3J0UGF0aCkpIHtcbiAgICAgICAgY29uc3QgcGFyZW50RGlyZWN0b3J5ID0gcGF0aC5kaXJuYW1lKGltcG9ydFBhdGgpXG5cbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYW1iaWd1b3VzIGltcG9ydHNcbiAgICAgICAgaWYgKHBhcmVudERpcmVjdG9yeSAhPT0gJy4nICYmIHBhcmVudERpcmVjdG9yeSAhPT0gJy4uJykge1xuICAgICAgICAgIGZvciAobGV0IGZpbGVFeHRlbnNpb24gb2YgZmlsZUV4dGVuc2lvbnMpIHtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlKGAke3BhcmVudERpcmVjdG9yeX0ke2ZpbGVFeHRlbnNpb259YCwgY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcG9ydFdpdGhQcm9wb3NlZFBhdGgoYCR7cGFyZW50RGlyZWN0b3J5fS9gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXBvcnRXaXRoUHJvcG9zZWRQYXRoKHBhcmVudERpcmVjdG9yeSlcbiAgICAgIH1cblxuICAgICAgLy8gUGF0aCBpcyBzaG9ydGVzdCBwb3NzaWJsZSArIHN0YXJ0cyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAtLT4gUmV0dXJuIGRpcmVjdGx5XG4gICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBQYXRoIGlzIG5vdCBleGlzdGluZyAtLT4gUmV0dXJuIGRpcmVjdGx5IChmb2xsb3dpbmcgY29kZSByZXF1aXJlcyBwYXRoIHRvIGJlIGRlZmluZWQpXG4gICAgICBpZiAocmVzb2x2ZWRQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gcGF0aC5yZWxhdGl2ZShjdXJyZW50RGlyLCByZXNvbHZlZFBhdGgpIC8vIEV4cGVjdGVkIGltcG9ydCBwYXRoXG4gICAgICBjb25zdCBleHBlY3RlZFNwbGl0ID0gZXhwZWN0ZWQuc3BsaXQocGF0aC5zZXApIC8vIFNwbGl0IGJ5IC8gb3IgXFwgKGRlcGVuZGluZyBvbiBPUylcbiAgICAgIGNvbnN0IGltcG9ydFBhdGhTcGxpdCA9IGltcG9ydFBhdGgucmVwbGFjZSgvXlxcLlxcLy8sICcnKS5zcGxpdCgnLycpXG4gICAgICBjb25zdCBjb3VudEltcG9ydFBhdGhSZWxhdGl2ZVBhcmVudHMgPSBjb3VudFJlbGF0aXZlUGFyZW50cyhpbXBvcnRQYXRoU3BsaXQpXG4gICAgICBjb25zdCBjb3VudEV4cGVjdGVkUmVsYXRpdmVQYXJlbnRzID0gY291bnRSZWxhdGl2ZVBhcmVudHMoZXhwZWN0ZWRTcGxpdClcbiAgICAgIGNvbnN0IGRpZmYgPSBjb3VudEltcG9ydFBhdGhSZWxhdGl2ZVBhcmVudHMgLSBjb3VudEV4cGVjdGVkUmVsYXRpdmVQYXJlbnRzXG5cbiAgICAgIC8vIFNhbWUgbnVtYmVyIG9mIHJlbGF0aXZlIHBhcmVudHMgLS0+IFBhdGhzIGFyZSB0aGUgc2FtZSAtLT4gUmV0dXJuIGRpcmVjdGx5XG4gICAgICBpZiAoZGlmZiA8PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBSZXBvcnQgYW5kIHByb3Bvc2UgbWluaW1hbCBudW1iZXIgb2YgcmVxdWlyZWQgcmVsYXRpdmUgcGFyZW50c1xuICAgICAgcmV0dXJuIHJlcG9ydFdpdGhQcm9wb3NlZFBhdGgoXG4gICAgICAgIHRvUmVsYXRpdmVQYXRoKFxuICAgICAgICAgIGltcG9ydFBhdGhTcGxpdFxuICAgICAgICAgICAgLnNsaWNlKDAsIGNvdW50RXhwZWN0ZWRSZWxhdGl2ZVBhcmVudHMpXG4gICAgICAgICAgICAuY29uY2F0KGltcG9ydFBhdGhTcGxpdC5zbGljZShjb3VudEltcG9ydFBhdGhSZWxhdGl2ZVBhcmVudHMgKyBkaWZmKSlcbiAgICAgICAgICAgIC5qb2luKCcvJylcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVWaXNpdG9yKGNoZWNrU291cmNlVmFsdWUsIG9wdGlvbnMpXG4gIH0sXG59XG4iXX0=
\ No newline at end of file
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11c2VsZXNzLXBhdGgtc2VnbWVudHMuanMiXSwibmFtZXMiOlsidG9SZWxhdGl2ZVBhdGgiLCJyZWxhdGl2ZVBhdGgiLCJzdHJpcHBlZCIsInJlcGxhY2UiLCJ0ZXN0Iiwibm9ybWFsaXplIiwiZm4iLCJwYXRoIiwicG9zaXgiLCJjb3VudFJlbGF0aXZlUGFyZW50cyIsInBhdGhTZWdtZW50cyIsInJlZHVjZSIsInN1bSIsInBhdGhTZWdtZW50IiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsImZpeGFibGUiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwiY29tbW9uanMiLCJub1VzZWxlc3NJbmRleCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiY3JlYXRlIiwiY29udGV4dCIsImN1cnJlbnREaXIiLCJkaXJuYW1lIiwiZ2V0RmlsZW5hbWUiLCJvcHRpb25zIiwiY2hlY2tTb3VyY2VWYWx1ZSIsInNvdXJjZSIsImltcG9ydFBhdGgiLCJ2YWx1ZSIsInJlcG9ydFdpdGhQcm9wb3NlZFBhdGgiLCJwcm9wb3NlZFBhdGgiLCJyZXBvcnQiLCJub2RlIiwibWVzc2FnZSIsImZpeCIsImZpeGVyIiwicmVwbGFjZVRleHQiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhcnRzV2l0aCIsInJlc29sdmVkUGF0aCIsIm5vcm1lZFBhdGgiLCJyZXNvbHZlZE5vcm1lZFBhdGgiLCJmaWxlRXh0ZW5zaW9ucyIsInNldHRpbmdzIiwicmVnZXhVbm5lY2Vzc2FyeUluZGV4IiwiUmVnRXhwIiwiQXJyYXkiLCJmcm9tIiwiam9pbiIsInBhcmVudERpcmVjdG9yeSIsImZpbGVFeHRlbnNpb24iLCJ1bmRlZmluZWQiLCJleHBlY3RlZCIsInJlbGF0aXZlIiwiZXhwZWN0ZWRTcGxpdCIsInNwbGl0Iiwic2VwIiwiaW1wb3J0UGF0aFNwbGl0IiwiY291bnRJbXBvcnRQYXRoUmVsYXRpdmVQYXJlbnRzIiwiY291bnRFeHBl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O0FBRUdHLFlBRkgsQ0FFVUwsZ0JBQWdCSSxLQUFoQixDQUFzQkgsaUNBQWlDRSxJQUF2RCxDQUZWO0FBR0daLFVBSEgsQ0FHUSxHQUhSLENBREYsQ0FESyxDQUFQOzs7QUFRRDs7QUFFRCxXQUFPLDZCQUFjeEIsZ0JBQWQsRUFBZ0NELE9BQWhDLENBQVA7QUFDRCxHQXpHYyxFQUFqQiIsImZpbGUiOiJuby11c2VsZXNzLXBhdGgtc2VnbWVudHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlT3ZlcnZpZXcgRW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubyB1c2VsZXNzIHBhdGggc2VnbWVudHNcbiAqIEBhdXRob3IgVGhvbWFzIEdyYWluZ2VyXG4gKi9cblxuaW1wb3J0IHsgZ2V0RmlsZUV4dGVuc2lvbnMgfSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL2lnbm9yZSdcbmltcG9ydCBtb2R1bGVWaXNpdG9yIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvbW9kdWxlVmlzaXRvcidcbmltcG9ydCByZXNvbHZlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVzb2x2ZSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG4vKipcbiAqIGNvbnZlcnQgYSBwb3RlbnRpYWxseSByZWxhdGl2ZSBwYXRoIGZyb20gbm9kZSB1dGlscyBpbnRvIGEgdHJ1ZVxuICogcmVsYXRpdmUgcGF0aC5cbiAqXG4gKiAuLi8gLT4gLi5cbiAqIC4vIC0+IC5cbiAqIC5mb28vYmFyIC0+IC4vLmZvby9iYXJcbiAqIC4uZm9vL2JhciAtPiAuLy4uZm9vL2JhclxuICogZm9vL2JhciAtPiAuL2Zvby9iYXJcbiAqXG4gKiBAcGFyYW0gcmVsYXRpdmVQYXRoIHtzdHJpbmd9IHJlbGF0aXZlIHBvc2l4IHBhdGggcG90ZW50aWFsbHkgbWlzc2luZyBsZWFkaW5nICcuLydcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHJlbGF0aXZlIHBvc2l4IHBhdGggdGhhdCBhbHdheXMgc3RhcnRzIHdpdGggYSAuL1xuICoqL1xuZnVuY3Rpb24gdG9SZWxhdGl2ZVBhdGgocmVsYXRpdmVQYXRoKSB7XG4gIGNvbnN0IHN0cmlwcGVkID0gcmVsYXRpdmVQYXRoLnJlcGxhY2UoL1xcLyQvZywgJycpIC8vIFJlbW92ZSB0cmFpbGluZyAvXG5cbiAgcmV0dXJuIC9eKChcXC5cXC4pfChcXC4pKSgkfFxcLykvLnRlc3Qoc3RyaXBwZWQpID8gc3RyaXBwZWQgOiBgLi8ke3N0cmlwcGVkfWBcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplKGZuKSB7XG4gIHJldHVybiB0b1JlbGF0aXZlUGF0aChwYXRoLnBvc2l4Lm5vcm1hbGl6ZShmbikpXG59XG5cbmZ1bmN0aW9uIGNvdW50UmVsYXRpdmVQYXJlbnRzKHBhdGhTZWdtZW50cykge1xuICByZXR1cm4gcGF0aFNlZ21lbnRzLnJlZHVjZSgoc3VtLCBwYXRoU2VnbWVudCkgPT4gcGF0aFNlZ21lbnQgPT09ICcuLicgPyBzdW0gKyAxIDogc3VtLCAwKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLXVzZWxlc3MtcGF0aC1zZWdtZW50cycpLFxuICAgIH0sXG5cbiAgICBmaXhhYmxlOiAnY29kZScsXG5cbiAgICBzY2hlbWE6IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBjb21tb25qczogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgICBub1VzZWxlc3NJbmRleDogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuXG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgY29uc3QgY3VycmVudERpciA9IHBhdGguZGlybmFtZShjb250ZXh0LmdldEZpbGVuYW1lKCkpXG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9uc1swXVxuXG4gICAgZnVuY3Rpb24gY2hlY2tTb3VyY2VWYWx1ZShzb3VyY2UpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWU6IGltcG9ydFBhdGggfSA9IHNvdXJjZVxuXG4gICAgICBmdW5jdGlvbiByZXBvcnRXaXRoUHJvcG9zZWRQYXRoKHByb3Bvc2VkUGF0aCkge1xuICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgbm9kZTogc291cmNlLFxuICAgICAgICAgIC8vIE5vdGU6IFVzaW5nIG1lc3NhZ2VJZHMgaXMgbm90IHBvc3NpYmxlIGR1ZSB0byB0aGUgc3VwcG9ydCBmb3IgRVNMaW50IDIgYW5kIDNcbiAgICAgICAgICBtZXNzYWdlOiBgVXNlbGVzcyBwYXRoIHNlZ21lbnRzIGZvciBcIiR7aW1wb3J0UGF0aH1cIiwgc2hvdWxkIGJlIFwiJHtwcm9wb3NlZFBhdGh9XCJgLFxuICAgICAgICAgIGZpeDogZml4ZXIgPT4gcHJvcG9zZWRQYXRoICYmIGZpeGVyLnJlcGxhY2VUZXh0KHNvdXJjZSwgSlNPTi5zdHJpbmdpZnkocHJvcG9zZWRQYXRoKSksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgcmVsYXRpdmUgaW1wb3J0cyBhcmUgcmVsZXZhbnQgZm9yIHRoaXMgcnVsZSAtLT4gU2tpcCBjaGVja2luZ1xuICAgICAgaWYgKCFpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gUmVwb3J0IHJ1bGUgdmlvbGF0aW9uIGlmIHBhdGggaXMgbm90IHRoZSBzaG9ydGVzdCBwb3NzaWJsZVxuICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShpbXBvcnRQYXRoLCBjb250ZXh0KVxuICAgICAgY29uc3Qgbm9ybWVkUGF0aCA9IG5vcm1hbGl6ZShpbXBvcnRQYXRoKVxuICAgICAgY29uc3QgcmVzb2x2ZWROb3JtZWRQYXRoID0gcmVzb2x2ZShub3JtZWRQYXRoLCBjb250ZXh0KVxuICAgICAgaWYgKG5vcm1lZFBhdGggIT09IGltcG9ydFBhdGggJiYgcmVzb2x2ZWRQYXRoID09PSByZXNvbHZlZE5vcm1lZFBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHJlcG9ydFdpdGhQcm9wb3NlZFBhdGgobm9ybWVkUGF0aClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbnMgPSBnZXRGaWxlRXh0ZW5zaW9ucyhjb250ZXh0LnNldHRpbmdzKVxuICAgICAgY29uc3QgcmVnZXhVbm5lY2Vzc2FyeUluZGV4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgYC4qXFxcXC9pbmRleChcXFxcJHtBcnJheS5mcm9tKGZpbGVFeHRlbnNpb25zKS5qb2luKCd8XFxcXCcpfSk/JGBcbiAgICAgIClcblxuICAgICAgLy8gQ2hlY2sgaWYgcGF0aCBjb250YWlucyB1bm5lY2Vzc2FyeSBpbmRleCAoaW5jbHVkaW5nIGEgY29uZmlndXJlZCBleHRlbnNpb24pXG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLm5vVXNlbGVzc0luZGV4ICYmIHJlZ2V4VW5uZWNlc3NhcnlJbmRleC50ZXN0KGltcG9ydFBhdGgpKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudERpcmVjdG9yeSA9IHBhdGguZGlybmFtZShpbXBvcnRQYXRoKVxuXG4gICAgICAgIC8vIFRyeSB0byBmaW5kIGFtYmlndW91cyBpbXBvcnRzXG4gICAgICAgIGlmIChwYXJlbnREaXJlY3RvcnkgIT09ICcuJyAmJiBwYXJlbnREaXJlY3RvcnkgIT09ICcuLicpIHtcbiAgICAgICAgICBmb3IgKGxldCBmaWxlRXh0ZW5zaW9uIG9mIGZpbGVFeHRlbnNpb25zKSB7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZShgJHtwYXJlbnREaXJlY3Rvcnl9JHtmaWxlRXh0ZW5zaW9ufWAsIGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXBvcnRXaXRoUHJvcG9zZWRQYXRoKGAke3BhcmVudERpcmVjdG9yeX0vYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVwb3J0V2l0aFByb3Bvc2VkUGF0aChwYXJlbnREaXJlY3RvcnkpXG4gICAgICB9XG5cbiAgICAgIC8vIFBhdGggaXMgc2hvcnRlc3QgcG9zc2libGUgKyBzdGFydHMgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkgLS0+IFJldHVybiBkaXJlY3RseVxuICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gUGF0aCBpcyBub3QgZXhpc3RpbmcgLS0+IFJldHVybiBkaXJlY3RseSAoZm9sbG93aW5nIGNvZGUgcmVxdWlyZXMgcGF0aCB0byBiZSBkZWZpbmVkKVxuICAgICAgaWYgKHJlc29sdmVkUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBleHBlY3RlZCA9IHBhdGgucmVsYXRpdmUoY3VycmVudERpciwgcmVzb2x2ZWRQYXRoKSAvLyBFeHBlY3RlZCBpbXBvcnQgcGF0aFxuICAgICAgY29uc3QgZXhwZWN0ZWRTcGxpdCA9IGV4cGVjdGVkLnNwbGl0KHBhdGguc2VwKSAvLyBTcGxpdCBieSAvIG9yIFxcIChkZXBlbmRpbmcgb24gT1MpXG4gICAgICBjb25zdCBpbXBvcnRQYXRoU3BsaXQgPSBpbXBvcnRQYXRoLnJlcGxhY2UoL15cXC5cXC8vLCAnJykuc3BsaXQoJy8nKVxuICAgICAgY29uc3QgY291bnRJbXBvcnRQYXRoUmVsYXRpdmVQYXJlbnRzID0gY291bnRSZWxhdGl2ZVBhcmVudHMoaW1wb3J0UGF0aFNwbGl0KVxuICAgICAgY29uc3QgY291bnRFeHBlY3RlZFJlbGF0aXZlUGFyZW50cyA9IGNvdW50UmVsYXRpdmVQYXJlbnRzKGV4cGVjdGVkU3BsaXQpXG4gICAgICBjb25zdCBkaWZmID0gY291bnRJbXBvcnRQYXRoUmVsYXRpdmVQYXJlbnRzIC0gY291bnRFeHBlY3RlZFJlbGF0aXZlUGFyZW50c1xuXG4gICAgICAvLyBTYW1lIG51bWJlciBvZiByZWxhdGl2ZSBwYXJlbnRzIC0tPiBQYXRocyBhcmUgdGhlIHNhbWUgLS0+IFJldHVybiBkaXJlY3RseVxuICAgICAgaWYgKGRpZmYgPD0gMCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gUmVwb3J0IGFuZCBwcm9wb3NlIG1pbmltYWwgbnVtYmVyIG9mIHJlcXVpcmVkIHJlbGF0aXZlIHBhcmVudHNcbiAgICAgIHJldHVybiByZXBvcnRXaXRoUHJvcG9zZWRQYXRoKFxuICAgICAgICB0b1JlbGF0aXZlUGF0aChcbiAgICAgICAgICBpbXBvcnRQYXRoU3BsaXRcbiAgICAgICAgICAgIC5zbGljZSgwLCBjb3VudEV4cGVjdGVkUmVsYXRpdmVQYXJlbnRzKVxuICAgICAgICAgICAgLmNvbmNhdChpbXBvcnRQYXRoU3BsaXQuc2xpY2UoY291bnRJbXBvcnRQYXRoUmVsYXRpdmVQYXJlbnRzICsgZGlmZikpXG4gICAgICAgICAgICAuam9pbignLycpXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kdWxlVmlzaXRvcihjaGVja1NvdXJjZVZhbHVlLCBvcHRpb25zKVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/no-webpack-loader-syntax.js b/node_modules/eslint-plugin-import/lib/rules/no-webpack-loader-syntax.js
index 9727c5f..df99f18 100644
--- a/node_modules/eslint-plugin-import/lib/rules/no-webpack-loader-syntax.js
+++ b/node_modules/eslint-plugin-import/lib/rules/no-webpack-loader-syntax.js
@@ -1,18 +1,11 @@
-'use strict';
-
-var _staticRequire = require('../core/staticRequire');
-
-var _staticRequire2 = _interopRequireDefault(_staticRequire);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+'use strict';var _staticRequire = require('../core/staticRequire');var _staticRequire2 = _interopRequireDefault(_staticRequire);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 function reportIfNonStandard(context, node, name) {
   if (name.indexOf('!') !== -1) {
-    context.report(node, `Unexpected '!' in '${name}'. ` + 'Do not use import syntax to configure webpack loaders.');
+    context.report(node, `Unexpected '!' in '${name}'. ` +
+    'Do not use import syntax to configure webpack loaders.');
+
   }
 }
 
@@ -20,10 +13,10 @@
   meta: {
     type: 'problem',
     docs: {
-      url: (0, _docsUrl2.default)('no-webpack-loader-syntax')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('no-webpack-loader-syntax') },
+
+    schema: [] },
+
 
   create: function (context) {
     return {
@@ -34,8 +27,7 @@
         if ((0, _staticRequire2.default)(node)) {
           reportIfNonStandard(context, node, node.arguments[0].value);
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby13ZWJwYWNrLWxvYWRlci1zeW50YXguanMiXSwibmFtZXMiOlsicmVwb3J0SWZOb25TdGFuZGFyZCIsImNvbnRleHQiLCJub2RlIiwibmFtZSIsImluZGV4T2YiLCJyZXBvcnQiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJoYW5kbGVJbXBvcnRzIiwic291cmNlIiwidmFsdWUiLCJDYWxsRXhwcmVzc2lvbiIsImhhbmRsZVJlcXVpcmVzIiwiYXJndW1lbnRzIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7O0FBQ0E7Ozs7OztBQUVBLFNBQVNBLG1CQUFULENBQTZCQyxPQUE3QixFQUFzQ0MsSUFBdEMsRUFBNENDLElBQTVDLEVBQWtEO0FBQ2hELE1BQUlBLEtBQUtDLE9BQUwsQ0FBYSxHQUFiLE1BQXNCLENBQUMsQ0FBM0IsRUFBOEI7QUFDNUJILFlBQVFJLE1BQVIsQ0FBZUgsSUFBZixFQUFzQixzQkFBcUJDLElBQUssS0FBM0IsR0FDbkIsd0RBREY7QUFHRDtBQUNGOztBQUVERyxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSkMsVUFBTSxTQURGO0FBRUpDLFVBQU07QUFDSkMsV0FBSyx1QkFBUSwwQkFBUjtBQURELEtBRkY7QUFLSkMsWUFBUTtBQUxKLEdBRFM7O0FBU2ZDLFVBQVEsVUFBVVosT0FBVixFQUFtQjtBQUN6QixXQUFPO0FBQ0xhLHlCQUFtQixTQUFTQyxhQUFULENBQXVCYixJQUF2QixFQUE2QjtBQUM5Q0YsNEJBQW9CQyxPQUFwQixFQUE2QkMsSUFBN0IsRUFBbUNBLEtBQUtjLE1BQUwsQ0FBWUMsS0FBL0M7QUFDRCxPQUhJO0FBSUxDLHNCQUFnQixTQUFTQyxjQUFULENBQXdCakIsSUFBeEIsRUFBOEI7QUFDNUMsWUFBSSw2QkFBZ0JBLElBQWhCLENBQUosRUFBMkI7QUFDekJGLDhCQUFvQkMsT0FBcEIsRUFBNkJDLElBQTdCLEVBQW1DQSxLQUFLa0IsU0FBTCxDQUFlLENBQWYsRUFBa0JILEtBQXJEO0FBQ0Q7QUFDRjtBQVJJLEtBQVA7QUFVRDtBQXBCYyxDQUFqQiIsImZpbGUiOiJuby13ZWJwYWNrLWxvYWRlci1zeW50YXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaXNTdGF0aWNSZXF1aXJlIGZyb20gJy4uL2NvcmUvc3RhdGljUmVxdWlyZSdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbmZ1bmN0aW9uIHJlcG9ydElmTm9uU3RhbmRhcmQoY29udGV4dCwgbm9kZSwgbmFtZSkge1xuICBpZiAobmFtZS5pbmRleE9mKCchJykgIT09IC0xKSB7XG4gICAgY29udGV4dC5yZXBvcnQobm9kZSwgYFVuZXhwZWN0ZWQgJyEnIGluICcke25hbWV9Jy4gYCArXG4gICAgICAnRG8gbm90IHVzZSBpbXBvcnQgc3ludGF4IHRvIGNvbmZpZ3VyZSB3ZWJwYWNrIGxvYWRlcnMuJ1xuICAgIClcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ25vLXdlYnBhY2stbG9hZGVyLXN5bnRheCcpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uOiBmdW5jdGlvbiBoYW5kbGVJbXBvcnRzKG5vZGUpIHtcbiAgICAgICAgcmVwb3J0SWZOb25TdGFuZGFyZChjb250ZXh0LCBub2RlLCBub2RlLnNvdXJjZS52YWx1ZSlcbiAgICAgIH0sXG4gICAgICBDYWxsRXhwcmVzc2lvbjogZnVuY3Rpb24gaGFuZGxlUmVxdWlyZXMobm9kZSkge1xuICAgICAgICBpZiAoaXNTdGF0aWNSZXF1aXJlKG5vZGUpKSB7XG4gICAgICAgICAgcmVwb3J0SWZOb25TdGFuZGFyZChjb250ZXh0LCBub2RlLCBub2RlLmFyZ3VtZW50c1swXS52YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby13ZWJwYWNrLWxvYWRlci1zeW50YXguanMiXSwibmFtZXMiOlsicmVwb3J0SWZOb25TdGFuZGFyZCIsImNvbnRleHQiLCJub2RlIiwibmFtZSIsImluZGV4T2YiLCJyZXBvcnQiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJoYW5kbGVJbXBvcnRzIiwic291cmNlIiwidmFsdWUiLCJDYWxsRXhwcmVzc2lvbiIsImhhbmRsZVJlcXVpcmVzIiwiYXJndW1lbnRzIl0sIm1hcHBpbmdzIjoiYUFBQSxzRDtBQUNBLHFDOztBQUVBLFNBQVNBLG1CQUFULENBQTZCQyxPQUE3QixFQUFzQ0MsSUFBdEMsRUFBNENDLElBQTVDLEVBQWtEO0FBQ2hELE1BQUlBLEtBQUtDLE9BQUwsQ0FBYSxHQUFiLE1BQXNCLENBQUMsQ0FBM0IsRUFBOEI7QUFDNUJILFlBQVFJLE1BQVIsQ0FBZUgsSUFBZixFQUFzQixzQkFBcUJDLElBQUssS0FBM0I7QUFDbkIsNERBREY7O0FBR0Q7QUFDRjs7QUFFREcsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sU0FERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsMEJBQVIsQ0FERCxFQUZGOztBQUtKQyxZQUFRLEVBTEosRUFEUzs7O0FBU2ZDLFVBQVEsVUFBVVosT0FBVixFQUFtQjtBQUN6QixXQUFPO0FBQ0xhLHlCQUFtQixTQUFTQyxhQUFULENBQXVCYixJQUF2QixFQUE2QjtBQUM5Q0YsNEJBQW9CQyxPQUFwQixFQUE2QkMsSUFBN0IsRUFBbUNBLEtBQUtjLE1BQUwsQ0FBWUMsS0FBL0M7QUFDRCxPQUhJO0FBSUxDLHNCQUFnQixTQUFTQyxjQUFULENBQXdCakIsSUFBeEIsRUFBOEI7QUFDNUMsWUFBSSw2QkFBZ0JBLElBQWhCLENBQUosRUFBMkI7QUFDekJGLDhCQUFvQkMsT0FBcEIsRUFBNkJDLElBQTdCLEVBQW1DQSxLQUFLa0IsU0FBTCxDQUFlLENBQWYsRUFBa0JILEtBQXJEO0FBQ0Q7QUFDRixPQVJJLEVBQVA7O0FBVUQsR0FwQmMsRUFBakIiLCJmaWxlIjoibm8td2VicGFjay1sb2FkZXItc3ludGF4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGlzU3RhdGljUmVxdWlyZSBmcm9tICcuLi9jb3JlL3N0YXRpY1JlcXVpcmUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5mdW5jdGlvbiByZXBvcnRJZk5vblN0YW5kYXJkKGNvbnRleHQsIG5vZGUsIG5hbWUpIHtcbiAgaWYgKG5hbWUuaW5kZXhPZignIScpICE9PSAtMSkge1xuICAgIGNvbnRleHQucmVwb3J0KG5vZGUsIGBVbmV4cGVjdGVkICchJyBpbiAnJHtuYW1lfScuIGAgK1xuICAgICAgJ0RvIG5vdCB1c2UgaW1wb3J0IHN5bnRheCB0byBjb25maWd1cmUgd2VicGFjayBsb2FkZXJzLidcbiAgICApXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1ldGE6IHtcbiAgICB0eXBlOiAncHJvYmxlbScsXG4gICAgZG9jczoge1xuICAgICAgdXJsOiBkb2NzVXJsKCduby13ZWJwYWNrLWxvYWRlci1zeW50YXgnKSxcbiAgICB9LFxuICAgIHNjaGVtYTogW10sXG4gIH0sXG5cbiAgY3JlYXRlOiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHJldHVybiB7XG4gICAgICBJbXBvcnREZWNsYXJhdGlvbjogZnVuY3Rpb24gaGFuZGxlSW1wb3J0cyhub2RlKSB7XG4gICAgICAgIHJlcG9ydElmTm9uU3RhbmRhcmQoY29udGV4dCwgbm9kZSwgbm9kZS5zb3VyY2UudmFsdWUpXG4gICAgICB9LFxuICAgICAgQ2FsbEV4cHJlc3Npb246IGZ1bmN0aW9uIGhhbmRsZVJlcXVpcmVzKG5vZGUpIHtcbiAgICAgICAgaWYgKGlzU3RhdGljUmVxdWlyZShub2RlKSkge1xuICAgICAgICAgIHJlcG9ydElmTm9uU3RhbmRhcmQoY29udGV4dCwgbm9kZSwgbm9kZS5hcmd1bWVudHNbMF0udmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/order.js b/node_modules/eslint-plugin-import/lib/rules/order.js
index a891ea0..d3cd442 100644
--- a/node_modules/eslint-plugin-import/lib/rules/order.js
+++ b/node_modules/eslint-plugin-import/lib/rules/order.js
@@ -1,24 +1,9 @@
-'use strict';
+'use strict';var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();
 
-var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
-
-var _minimatch = require('minimatch');
-
-var _minimatch2 = _interopRequireDefault(_minimatch);
-
-var _importType = require('../core/importType');
-
-var _importType2 = _interopRequireDefault(_importType);
-
-var _staticRequire = require('../core/staticRequire');
-
-var _staticRequire2 = _interopRequireDefault(_staticRequire);
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _minimatch = require('minimatch');var _minimatch2 = _interopRequireDefault(_minimatch);
+var _importType = require('../core/importType');var _importType2 = _interopRequireDefault(_importType);
+var _staticRequire = require('../core/staticRequire');var _staticRequire2 = _interopRequireDefault(_staticRequire);
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 const defaultGroups = ['builtin', 'external', 'parent', 'sibling', 'index'];
 
@@ -26,11 +11,7 @@
 
 function reverse(array) {
   return array.map(function (v) {
-    return {
-      name: v.name,
-      rank: -v.rank,
-      node: v.node
-    };
+    return Object.assign({}, v, { rank: -v.rank });
   }).reverse();
 }
 
@@ -66,7 +47,8 @@
   for (let i = 0; i < tokens.length; i++) {
     if (condition(tokens[i])) {
       result.push(tokens[i]);
-    } else {
+    } else
+    {
       break;
     }
   }
@@ -79,7 +61,8 @@
   for (let i = tokens.length - 1; i >= 0; i--) {
     if (condition(tokens[i])) {
       result.push(tokens[i]);
-    } else {
+    } else
+    {
       break;
     }
   }
@@ -110,7 +93,9 @@
 
 function findEndOfLineWithComments(sourceCode, node) {
   const tokensToEndOfLine = takeTokensAfterWhile(sourceCode, node, commentOnSameLineAs(node));
-  let endOfTokens = tokensToEndOfLine.length > 0 ? tokensToEndOfLine[tokensToEndOfLine.length - 1].range[1] : node.range[1];
+  let endOfTokens = tokensToEndOfLine.length > 0 ?
+  tokensToEndOfLine[tokensToEndOfLine.length - 1].range[1] :
+  node.range[1];
   let result = endOfTokens;
   for (let i = endOfTokens; i < sourceCode.text.length; i++) {
     if (sourceCode.text[i] === '\n') {
@@ -126,7 +111,9 @@
 }
 
 function commentOnSameLineAs(node) {
-  return token => (token.type === 'Block' || token.type === 'Line') && token.loc.start.line === token.loc.end.line && token.loc.end.line === node.loc.end.line;
+  return token => (token.type === 'Block' || token.type === 'Line') &&
+  token.loc.start.line === token.loc.end.line &&
+  token.loc.end.line === node.loc.end.line;
 }
 
 function findStartOfLineWithComments(sourceCode, node) {
@@ -150,7 +137,15 @@
     return false;
   }
   const decl = node.declarations[0];
-  const result = decl.id && (decl.id.type === 'Identifier' || decl.id.type === 'ObjectPattern') && decl.init != null && decl.init.type === 'CallExpression' && decl.init.callee != null && decl.init.callee.name === 'require' && decl.init.arguments != null && decl.init.arguments.length === 1 && decl.init.arguments[0].type === 'Literal';
+  const result = decl.id && (
+  decl.id.type === 'Identifier' || decl.id.type === 'ObjectPattern') &&
+  decl.init != null &&
+  decl.init.type === 'CallExpression' &&
+  decl.init.callee != null &&
+  decl.init.callee.name === 'require' &&
+  decl.init.arguments != null &&
+  decl.init.arguments.length === 1 &&
+  decl.init.arguments[0].type === 'Literal';
   return result;
 }
 
@@ -158,19 +153,20 @@
   return node.type === 'ImportDeclaration' && node.specifiers != null && node.specifiers.length > 0;
 }
 
+function isPlainImportEquals(node) {
+  return node.type === 'TSImportEqualsDeclaration' && node.moduleReference.expression;
+}
+
 function canCrossNodeWhileReorder(node) {
-  return isPlainRequireModule(node) || isPlainImportModule(node);
+  return isPlainRequireModule(node) || isPlainImportModule(node) || isPlainImportEquals(node);
 }
 
 function canReorderItems(firstNode, secondNode) {
-  const parent = firstNode.parent;
-
-  var _sort = [parent.body.indexOf(firstNode), parent.body.indexOf(secondNode)].sort(),
-      _sort2 = _slicedToArray(_sort, 2);
-
-  const firstIndex = _sort2[0],
-        secondIndex = _sort2[1];
-
+  const parent = firstNode.parent;var _sort =
+  [
+  parent.body.indexOf(firstNode),
+  parent.body.indexOf(secondNode)].
+  sort(),_sort2 = _slicedToArray(_sort, 2);const firstIndex = _sort2[0],secondIndex = _sort2[1];
   const nodesBetween = parent.body.slice(firstIndex, secondIndex + 1);
   for (var nodeBetween of nodesBetween) {
     if (!canCrossNodeWhileReorder(nodeBetween)) {
@@ -197,20 +193,28 @@
     newCode = newCode + '\n';
   }
 
-  const message = '`' + secondNode.name + '` import should occur ' + order + ' import of `' + firstNode.name + '`';
+  const message = `\`${secondNode.displayName}\` import should occur ${order} import of \`${firstNode.displayName}\``;
 
   if (order === 'before') {
     context.report({
       node: secondNode.node,
       message: message,
-      fix: canFix && (fixer => fixer.replaceTextRange([firstRootStart, secondRootEnd], newCode + sourceCode.text.substring(firstRootStart, secondRootStart)))
-    });
+      fix: canFix && (fixer =>
+      fixer.replaceTextRange(
+      [firstRootStart, secondRootEnd],
+      newCode + sourceCode.text.substring(firstRootStart, secondRootStart))) });
+
+
   } else if (order === 'after') {
     context.report({
       node: secondNode.node,
       message: message,
-      fix: canFix && (fixer => fixer.replaceTextRange([secondRootStart, firstRootEnd], sourceCode.text.substring(secondRootEnd, firstRootEnd) + newCode))
-    });
+      fix: canFix && (fixer =>
+      fixer.replaceTextRange(
+      [secondRootStart, firstRootEnd],
+      sourceCode.text.substring(secondRootEnd, firstRootEnd) + newCode)) });
+
+
   }
 }
 
@@ -238,28 +242,22 @@
   reportOutOfOrder(context, imported, outOfOrder, 'before');
 }
 
-function importsSorterAsc(importA, importB) {
-  if (importA < importB) {
-    return -1;
-  }
+function getSorter(ascending) {
+  const multiplier = ascending ? 1 : -1;
 
-  if (importA > importB) {
-    return 1;
-  }
+  return function importsSorter(importA, importB) {
+    let result;
 
-  return 0;
-}
+    if (importA < importB) {
+      result = -1;
+    } else if (importA > importB) {
+      result = 1;
+    } else {
+      result = 0;
+    }
 
-function importsSorterDesc(importA, importB) {
-  if (importA < importB) {
-    return 1;
-  }
-
-  if (importA > importB) {
-    return -1;
-  }
-
-  return 0;
+    return result * multiplier;
+  };
 }
 
 function mutateRanksToAlphabetize(imported, alphabetizeOptions) {
@@ -267,13 +265,13 @@
     if (!Array.isArray(acc[importedItem.rank])) {
       acc[importedItem.rank] = [];
     }
-    acc[importedItem.rank].push(importedItem.name);
+    acc[importedItem.rank].push(importedItem.value);
     return acc;
   }, {});
 
   const groupRanks = Object.keys(groupedByRanks);
 
-  const sorterFn = alphabetizeOptions.order === 'asc' ? importsSorterAsc : importsSorterDesc;
+  const sorterFn = getSorter(alphabetizeOptions.order === 'asc');
   const comparator = alphabetizeOptions.caseInsensitive ? (a, b) => sorterFn(String(a).toLowerCase(), String(b).toLowerCase()) : (a, b) => sorterFn(a, b);
   // sort imports locally within their group
   groupRanks.forEach(function (groupRank) {
@@ -292,55 +290,55 @@
 
   // mutate the original group-rank with alphabetized-rank
   imported.forEach(function (importedItem) {
-    importedItem.rank = alphabetizedRanks[importedItem.name];
+    importedItem.rank = alphabetizedRanks[importedItem.value];
   });
 }
 
 // DETECTING
 
 function computePathRank(ranks, pathGroups, path, maxPosition) {
-  for (let i = 0, l = pathGroups.length; i < l; i++) {
-    var _pathGroups$i = pathGroups[i];
-    const pattern = _pathGroups$i.pattern,
-          patternOptions = _pathGroups$i.patternOptions,
-          group = _pathGroups$i.group;
-    var _pathGroups$i$positio = _pathGroups$i.position;
-    const position = _pathGroups$i$positio === undefined ? 1 : _pathGroups$i$positio;
-
+  for (let i = 0, l = pathGroups.length; i < l; i++) {var _pathGroups$i =
+    pathGroups[i];const pattern = _pathGroups$i.pattern,patternOptions = _pathGroups$i.patternOptions,group = _pathGroups$i.group;var _pathGroups$i$positio = _pathGroups$i.position;const position = _pathGroups$i$positio === undefined ? 1 : _pathGroups$i$positio;
     if ((0, _minimatch2.default)(path, pattern, patternOptions || { nocomment: true })) {
       return ranks[group] + position / maxPosition;
     }
   }
 }
 
-function computeRank(context, ranks, name, type, excludedImportTypes) {
-  const impType = (0, _importType2.default)(name, context);
+function computeRank(context, ranks, importEntry, excludedImportTypes) {
+  let impType;
   let rank;
-  if (!excludedImportTypes.has(impType)) {
-    rank = computePathRank(ranks.groups, ranks.pathGroups, name, ranks.maxPosition);
+  if (importEntry.type === 'import:object') {
+    impType = 'object';
+  } else {
+    impType = (0, _importType2.default)(importEntry.value, context);
   }
-  if (!rank) {
+  if (!excludedImportTypes.has(impType)) {
+    rank = computePathRank(ranks.groups, ranks.pathGroups, importEntry.value, ranks.maxPosition);
+  }
+  if (typeof rank === 'undefined') {
     rank = ranks.groups[impType];
   }
-  if (type !== 'import') {
+  if (importEntry.type !== 'import' && !importEntry.type.startsWith('import:')) {
     rank += 100;
   }
 
   return rank;
 }
 
-function registerNode(context, node, name, type, ranks, imported, excludedImportTypes) {
-  const rank = computeRank(context, ranks, name, type, excludedImportTypes);
+function registerNode(context, importEntry, ranks, imported, excludedImportTypes) {
+  const rank = computeRank(context, ranks, importEntry, excludedImportTypes);
   if (rank !== -1) {
-    imported.push({ name, rank, node });
+    imported.push(Object.assign({}, importEntry, { rank }));
   }
 }
 
 function isInVariableDeclarator(node) {
-  return node && (node.type === 'VariableDeclarator' || isInVariableDeclarator(node.parent));
+  return node && (
+  node.type === 'VariableDeclarator' || isInVariableDeclarator(node.parent));
 }
 
-const types = ['builtin', 'external', 'internal', 'unknown', 'parent', 'sibling', 'index'];
+const types = ['builtin', 'external', 'internal', 'unknown', 'parent', 'sibling', 'index', 'object'];
 
 // Creates an object with type-rank pairs.
 // Example: { index: 0, sibling: 1, parent: 1, external: 1, builtin: 2, internal: 2 }
@@ -352,7 +350,8 @@
     }
     group.forEach(function (groupItem) {
       if (types.indexOf(groupItem) === -1) {
-        throw new Error('Incorrect configuration of the rule: Unknown type `' + JSON.stringify(groupItem) + '`');
+        throw new Error('Incorrect configuration of the rule: Unknown type `' +
+        JSON.stringify(groupItem) + '`');
       }
       if (res[groupItem] !== undefined) {
         throw new Error('Incorrect configuration of the rule: `' + groupItem + '` is duplicated');
@@ -376,10 +375,8 @@
   const after = {};
   const before = {};
 
-  const transformed = pathGroups.map((pathGroup, index) => {
-    const group = pathGroup.group,
-          positionString = pathGroup.position;
-
+  const transformed = pathGroups.map((pathGroup, index) => {const
+    group = pathGroup.group,positionString = pathGroup.position;
     let position = 0;
     if (positionString === 'after') {
       if (!after[group]) {
@@ -413,13 +410,14 @@
 
   return {
     pathGroups: transformed,
-    maxPosition: maxPosition > 10 ? Math.pow(10, Math.ceil(Math.log10(maxPosition))) : 10
-  };
+    maxPosition: maxPosition > 10 ? Math.pow(10, Math.ceil(Math.log10(maxPosition))) : 10 };
+
 }
 
 function fixNewLineAfterImport(context, previousImport) {
   const prevRoot = findRootNode(previousImport.node);
-  const tokensToEndOfLine = takeTokensAfterWhile(context.getSourceCode(), prevRoot, commentOnSameLineAs(prevRoot));
+  const tokensToEndOfLine = takeTokensAfterWhile(
+  context.getSourceCode(), prevRoot, commentOnSameLineAs(prevRoot));
 
   let endOfLine = prevRoot.range[1];
   if (tokensToEndOfLine.length > 0) {
@@ -432,7 +430,10 @@
   const sourceCode = context.getSourceCode();
   const prevRoot = findRootNode(previousImport.node);
   const currRoot = findRootNode(currentImport.node);
-  const rangeToRemove = [findEndOfLineWithComments(sourceCode, prevRoot), findStartOfLineWithComments(sourceCode, currRoot)];
+  const rangeToRemove = [
+  findEndOfLineWithComments(sourceCode, prevRoot),
+  findStartOfLineWithComments(sourceCode, currRoot)];
+
   if (/^\s*$/.test(sourceCode.text.substring(rangeToRemove[0], rangeToRemove[1]))) {
     return fixer => fixer.removeRange(rangeToRemove);
   }
@@ -441,7 +442,10 @@
 
 function makeNewlinesBetweenReport(context, imported, newlinesBetweenImports) {
   const getNumberOfEmptyLinesBetween = (currentImport, previousImport) => {
-    const linesBetweenImports = context.getSourceCode().lines.slice(previousImport.node.loc.end.line, currentImport.node.loc.start.line - 1);
+    const linesBetweenImports = context.getSourceCode().lines.slice(
+    previousImport.node.loc.end.line,
+    currentImport.node.loc.start.line - 1);
+
 
     return linesBetweenImports.filter(line => !line.trim().length).length;
   };
@@ -450,26 +454,29 @@
   imported.slice(1).forEach(function (currentImport) {
     const emptyLinesBetween = getNumberOfEmptyLinesBetween(currentImport, previousImport);
 
-    if (newlinesBetweenImports === 'always' || newlinesBetweenImports === 'always-and-inside-groups') {
+    if (newlinesBetweenImports === 'always' ||
+    newlinesBetweenImports === 'always-and-inside-groups') {
       if (currentImport.rank !== previousImport.rank && emptyLinesBetween === 0) {
         context.report({
           node: previousImport.node,
           message: 'There should be at least one empty line between import groups',
-          fix: fixNewLineAfterImport(context, previousImport)
-        });
-      } else if (currentImport.rank === previousImport.rank && emptyLinesBetween > 0 && newlinesBetweenImports !== 'always-and-inside-groups') {
+          fix: fixNewLineAfterImport(context, previousImport) });
+
+      } else if (currentImport.rank === previousImport.rank &&
+      emptyLinesBetween > 0 &&
+      newlinesBetweenImports !== 'always-and-inside-groups') {
         context.report({
           node: previousImport.node,
           message: 'There should be no empty line within import group',
-          fix: removeNewLineAfterImport(context, currentImport, previousImport)
-        });
+          fix: removeNewLineAfterImport(context, currentImport, previousImport) });
+
       }
     } else if (emptyLinesBetween > 0) {
       context.report({
         node: previousImport.node,
         message: 'There should be no empty line between import groups',
-        fix: removeNewLineAfterImport(context, currentImport, previousImport)
-      });
+        fix: removeNewLineAfterImport(context, currentImport, previousImport) });
+
     }
 
     previousImport = currentImport;
@@ -488,89 +495,92 @@
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('order')
-    },
+      url: (0, _docsUrl2.default)('order') },
+
 
     fixable: 'code',
-    schema: [{
+    schema: [
+    {
       type: 'object',
       properties: {
         groups: {
-          type: 'array'
-        },
+          type: 'array' },
+
         pathGroupsExcludedImportTypes: {
-          type: 'array'
-        },
+          type: 'array' },
+
         pathGroups: {
           type: 'array',
           items: {
             type: 'object',
             properties: {
               pattern: {
-                type: 'string'
-              },
+                type: 'string' },
+
               patternOptions: {
-                type: 'object'
-              },
+                type: 'object' },
+
               group: {
                 type: 'string',
-                enum: types
-              },
+                enum: types },
+
               position: {
                 type: 'string',
-                enum: ['after', 'before']
-              }
-            },
-            required: ['pattern', 'group']
-          }
-        },
+                enum: ['after', 'before'] } },
+
+
+            required: ['pattern', 'group'] } },
+
+
         'newlines-between': {
-          enum: ['ignore', 'always', 'always-and-inside-groups', 'never']
-        },
+          enum: [
+          'ignore',
+          'always',
+          'always-and-inside-groups',
+          'never'] },
+
+
         alphabetize: {
           type: 'object',
           properties: {
             caseInsensitive: {
               type: 'boolean',
-              default: false
-            },
+              default: false },
+
             order: {
               enum: ['ignore', 'asc', 'desc'],
-              default: 'ignore'
-            }
-          },
-          additionalProperties: false
-        }
-      },
-      additionalProperties: false
-    }]
-  },
+              default: 'ignore' } },
+
+
+          additionalProperties: false } },
+
+
+      additionalProperties: false }] },
+
+
+
 
   create: function importOrderRule(context) {
     const options = context.options[0] || {};
     const newlinesBetweenImports = options['newlines-between'] || 'ignore';
-    const pathGroupsExcludedImportTypes = new Set(options['pathGroupsExcludedImportTypes'] || ['builtin', 'external']);
+    const pathGroupsExcludedImportTypes = new Set(options['pathGroupsExcludedImportTypes'] || ['builtin', 'external', 'object']);
     const alphabetize = getAlphabetizeConfig(options);
     let ranks;
 
-    try {
-      var _convertPathGroupsFor = convertPathGroupsForRanks(options.pathGroups || []);
-
-      const pathGroups = _convertPathGroupsFor.pathGroups,
-            maxPosition = _convertPathGroupsFor.maxPosition;
-
+    try {var _convertPathGroupsFor =
+      convertPathGroupsForRanks(options.pathGroups || []);const pathGroups = _convertPathGroupsFor.pathGroups,maxPosition = _convertPathGroupsFor.maxPosition;
       ranks = {
         groups: convertGroupsToRanks(options.groups || defaultGroups),
         pathGroups,
-        maxPosition
-      };
+        maxPosition };
+
     } catch (error) {
       // Malformed configuration
       return {
         Program: function (node) {
           context.report(node, error.message);
-        }
-      };
+        } };
+
     }
     let imported = [];
     let level = 0;
@@ -584,18 +594,69 @@
 
     return {
       ImportDeclaration: function handleImports(node) {
-        if (node.specifiers.length) {
-          // Ignoring unassigned imports
+        if (node.specifiers.length) {// Ignoring unassigned imports
           const name = node.source.value;
-          registerNode(context, node, name, 'import', ranks, imported, pathGroupsExcludedImportTypes);
+          registerNode(
+          context,
+          {
+            node,
+            value: name,
+            displayName: name,
+            type: 'import' },
+
+          ranks,
+          imported,
+          pathGroupsExcludedImportTypes);
+
         }
       },
+      TSImportEqualsDeclaration: function handleImports(node) {
+        let displayName;
+        let value;
+        let type;
+        // skip "export import"s
+        if (node.isExport) {
+          return;
+        }
+        if (node.moduleReference.type === 'TSExternalModuleReference') {
+          value = node.moduleReference.expression.value;
+          displayName = value;
+          type = 'import';
+        } else {
+          value = '';
+          displayName = context.getSourceCode().getText(node.moduleReference);
+          type = 'import:object';
+        }
+        registerNode(
+        context,
+        {
+          node,
+          value,
+          displayName,
+          type },
+
+        ranks,
+        imported,
+        pathGroupsExcludedImportTypes);
+
+      },
       CallExpression: function handleRequires(node) {
         if (level !== 0 || !(0, _staticRequire2.default)(node) || !isInVariableDeclarator(node.parent)) {
           return;
         }
         const name = node.arguments[0].value;
-        registerNode(context, node, name, 'require', ranks, imported, pathGroupsExcludedImportTypes);
+        registerNode(
+        context,
+        {
+          node,
+          value: name,
+          displayName: name,
+          type: 'require' },
+
+        ranks,
+        imported,
+        pathGroupsExcludedImportTypes);
+
       },
       'Program:exit': function reportAndReset() {
         if (newlinesBetweenImports !== 'ignore') {
@@ -619,8 +680,7 @@
       'FunctionExpression:exit': decrementLevel,
       'ArrowFunctionExpression:exit': decrementLevel,
       'BlockStatement:exit': decrementLevel,
-      'ObjectExpression:exit': decrementLevel
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9vcmRlci5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0R3JvdXBzIiwicmV2ZXJzZSIsImFycmF5IiwibWFwIiwidiIsIm5hbWUiLCJyYW5rIiwibm9kZSIsImdldFRva2Vuc09yQ29tbWVudHNBZnRlciIsInNvdXJjZUNvZGUiLCJjb3VudCIsImN1cnJlbnROb2RlT3JUb2tlbiIsInJlc3VsdCIsImkiLCJnZXRUb2tlbk9yQ29tbWVudEFmdGVyIiwicHVzaCIsImdldFRva2Vuc09yQ29tbWVudHNCZWZvcmUiLCJnZXRUb2tlbk9yQ29tbWVudEJlZm9yZSIsInRha2VUb2tlbnNBZnRlcldoaWxlIiwiY29uZGl0aW9uIiwidG9rZW5zIiwibGVuZ3RoIiwidGFrZVRva2Vuc0JlZm9yZVdoaWxlIiwiZmluZE91dE9mT3JkZXIiLCJpbXBvcnRlZCIsIm1heFNlZW5SYW5rTm9kZSIsImZpbHRlciIsImltcG9ydGVkTW9kdWxlIiwicmVzIiwiZmluZFJvb3ROb2RlIiwicGFyZW50IiwiYm9keSIsImZpbmRFbmRPZkxpbmVXaXRoQ29tbWVudHMiLCJ0b2tlbnNUb0VuZE9mTGluZSIsImNvbW1lbnRPblNhbWVMaW5lQXMiLCJlbmRPZlRva2VucyIsInJhbmdlIiwidGV4dCIsInRva2VuIiwidHlwZSIsImxvYyIsInN0YXJ0IiwibGluZSIsImVuZCIsImZpbmRTdGFydE9mTGluZVdpdGhDb21tZW50cyIsInN0YXJ0T2ZUb2tlbnMiLCJpc1BsYWluUmVxdWlyZU1vZHVsZSIsImRlY2xhcmF0aW9ucyIsImRlY2wiLCJpZCIsImluaXQiLCJjYWxsZWUiLCJhcmd1bWVudHMiLCJpc1BsYWluSW1wb3J0TW9kdWxlIiwic3BlY2lmaWVycyIsImNhbkNyb3NzTm9kZVdoaWxlUmVvcmRlciIsImNhblJlb3JkZXJJdGVtcyIsImZpcnN0Tm9kZSIsInNlY29uZE5vZGUiLCJpbmRleE9mIiwic29ydCIsImZpcnN0SW5kZXgiLCJzZWNvbmRJbmRleCIsIm5vZGVzQmV0d2VlbiIsInNsaWNlIiwibm9kZUJldHdlZW4iLCJmaXhPdXRPZk9yZGVyIiwiY29udGV4dCIsIm9yZGVyIiwiZ2V0U291cmNlQ29kZSIsImZpcnN0Um9vdCIsImZpcnN0Um9vdFN0YXJ0IiwiZmlyc3RSb290RW5kIiwic2Vjb25kUm9vdCIsInNlY29uZFJvb3RTdGFydCIsInNlY29uZFJvb3RFbmQiLCJjYW5GaXgiLCJuZXdDb2RlIiwic3Vic3RyaW5nIiwibWVzc2FnZSIsInJlcG9ydCIsImZpeCIsImZpeGVyIiwicmVwbGFjZVRleHRSYW5nZSIsInJlcG9ydE91dE9mT3JkZXIiLCJvdXRPZk9yZGVyIiwiZm9yRWFjaCIsImltcCIsImZvdW5kIiwiZmluZCIsImhhc0hpZ2hlclJhbmsiLCJpbXBvcnRlZEl0ZW0iLCJtYWtlT3V0T2ZPcmRlclJlcG9ydCIsInJldmVyc2VkSW1wb3J0ZWQiLCJyZXZlcnNlZE9yZGVyIiwiaW1wb3J0c1NvcnRlckFzYyIsImltcG9ydEEiLCJpbXBvcnRCIiwiaW1wb3J0c1NvcnRlckRlc2MiLCJtdXRhdGVSYW5rc1RvQWxwaGFiZXRpemUiLCJhbHBoYWJldGl6ZU9wdGlvbnMiLCJncm91cGVkQnlSYW5rcyIsInJlZHVjZSIsImFjYyIsIkFycmF5IiwiaXNBcnJheSIsImdyb3VwUmFua3MiLCJPYmplY3QiLCJrZXlzIiwic29ydGVyRm4iLCJjb21wYXJhdG9yIiwiY2FzZUluc2Vuc2l0aXZlIiwiYSIsImIiLCJTdHJpbmciLCJ0b0xvd2VyQ2FzZSIsImdyb3VwUmFuayIsIm5ld1JhbmsiLCJhbHBoYWJldGl6ZWRSYW5rcyIsImltcG9ydGVkSXRlbU5hbWUiLCJwYXJzZUludCIsImNvbXB1dGVQYXRoUmFuayIsInJhbmtzIiwicGF0aEdyb3VwcyIsInBhdGgiLCJtYXhQb3NpdGlvbiIsImwiLCJwYXR0ZXJuIiwicGF0dGVybk9wdGlvbnMiLCJncm91cCIsInBvc2l0aW9uIiwibm9jb21tZW50IiwiY29tcHV0ZVJhbmsiLCJleGNsdWRlZEltcG9ydFR5cGVzIiwiaW1wVHlwZSIsImhhcyIsImdyb3VwcyIsInJlZ2lzdGVyTm9kZSIsImlzSW5WYXJpYWJsZURlY2xhcmF0b3IiLCJ0eXBlcyIsImNvbnZlcnRHcm91cHNUb1JhbmtzIiwicmFua09iamVjdCIsImluZGV4IiwiZ3JvdXBJdGVtIiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwidW5kZWZpbmVkIiwib21pdHRlZFR5cGVzIiwiY29udmVydFBhdGhHcm91cHNGb3JSYW5rcyIsImFmdGVyIiwiYmVmb3JlIiwidHJhbnNmb3JtZWQiLCJwYXRoR3JvdXAiLCJwb3NpdGlvblN0cmluZyIsImFzc2lnbiIsImdyb3VwTGVuZ3RoIiwiZ3JvdXBJbmRleCIsIk1hdGgiLCJtYXgiLCJrZXkiLCJncm91cE5leHRQb3NpdGlvbiIsInBvdyIsImNlaWwiLCJsb2cxMCIsImZpeE5ld0xpbmVBZnRlckltcG9ydCIsInByZXZpb3VzSW1wb3J0IiwicHJldlJvb3QiLCJlbmRPZkxpbmUiLCJpbnNlcnRUZXh0QWZ0ZXJSYW5nZSIsInJlbW92ZU5ld0xpbmVBZnRlckltcG9ydCIsImN1cnJlbnRJbXBvcnQiLCJjdXJyUm9vdCIsInJhbmdlVG9SZW1vdmUiLCJ0ZXN0IiwicmVtb3ZlUmFuZ2UiLCJtYWtlTmV3bGluZXNCZXR3ZWVuUmVwb3J0IiwibmV3bGluZXNCZXR3ZWVuSW1wb3J0cyIsImdldE51bWJlck9mRW1wdHlMaW5lc0JldHdlZW4iLCJsaW5lc0JldHdlZW5JbXBvcnRzIiwibGluZXMiLCJ0cmltIiwiZW1wdHlMaW5lc0JldHdlZW4iLCJnZXRBbHBoYWJldGl6ZUNvbmZpZyIsIm9wdGlvbnMiLCJhbHBoYWJldGl6ZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwiZG9jcyIsInVybCIsImZpeGFibGUiLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIiwicGF0aEdyb3Vwc0V4Y2x1ZGVkSW1wb3J0VHlwZXMiLCJpdGVtcyIsImVudW0iLCJyZXF1aXJlZCIsImRlZmF1bHQiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImNyZWF0ZSIsImltcG9ydE9yZGVyUnVsZSIsIlNldCIsImVycm9yIiwiUHJvZ3JhbSIsImxldmVsIiwiaW5jcmVtZW50TGV2ZWwiLCJkZWNyZW1lbnRMZXZlbCIsIkltcG9ydERlY2xhcmF0aW9uIiwiaGFuZGxlSW1wb3J0cyIsInNvdXJjZSIsInZhbHVlIiwiQ2FsbEV4cHJlc3Npb24iLCJoYW5kbGVSZXF1aXJlcyIsInJlcG9ydEFuZFJlc2V0IiwiRnVuY3Rpb25EZWNsYXJhdGlvbiIsIkZ1bmN0aW9uRXhwcmVzc2lvbiIsIkFycm93RnVuY3Rpb25FeHByZXNzaW9uIiwiQmxvY2tTdGF0ZW1lbnQiLCJPYmplY3RFeHByZXNzaW9uIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFFQSxNQUFNQSxnQkFBZ0IsQ0FBQyxTQUFELEVBQVksVUFBWixFQUF3QixRQUF4QixFQUFrQyxTQUFsQyxFQUE2QyxPQUE3QyxDQUF0Qjs7QUFFQTs7QUFFQSxTQUFTQyxPQUFULENBQWlCQyxLQUFqQixFQUF3QjtBQUN0QixTQUFPQSxNQUFNQyxHQUFOLENBQVUsVUFBVUMsQ0FBVixFQUFhO0FBQzVCLFdBQU87QUFDTEMsWUFBTUQsRUFBRUMsSUFESDtBQUVMQyxZQUFNLENBQUNGLEVBQUVFLElBRko7QUFHTEMsWUFBTUgsRUFBRUc7QUFISCxLQUFQO0FBS0QsR0FOTSxFQU1KTixPQU5JLEVBQVA7QUFPRDs7QUFFRCxTQUFTTyx3QkFBVCxDQUFrQ0MsVUFBbEMsRUFBOENGLElBQTlDLEVBQW9ERyxLQUFwRCxFQUEyRDtBQUN6RCxNQUFJQyxxQkFBcUJKLElBQXpCO0FBQ0EsUUFBTUssU0FBUyxFQUFmO0FBQ0EsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlILEtBQXBCLEVBQTJCRyxHQUEzQixFQUFnQztBQUM5QkYseUJBQXFCRixXQUFXSyxzQkFBWCxDQUFrQ0gsa0JBQWxDLENBQXJCO0FBQ0EsUUFBSUEsc0JBQXNCLElBQTFCLEVBQWdDO0FBQzlCO0FBQ0Q7QUFD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LElBQWUsQ0FBQyw2QkFBZ0J0TSxJQUFoQixDQUFoQixJQUF5QyxDQUFDbUksdUJBQXVCbkksS0FBS3VCLE1BQTVCLENBQTlDLEVBQW1GO0FBQ2pGO0FBQ0Q7QUFDRCxjQUFNekIsT0FBT0UsS0FBSzZDLFNBQUwsQ0FBZSxDQUFmLEVBQWtCK0osS0FBL0I7QUFDQTFFLHFCQUNFdEUsT0FERixFQUVFNUQsSUFGRixFQUdFRixJQUhGLEVBSUUsU0FKRixFQUtFcUgsS0FMRixFQU1FbEcsUUFORixFQU9FMEssNkJBUEY7QUFTRCxPQTdCSTtBQThCTCxzQkFBZ0IsU0FBU29CLGNBQVQsR0FBMEI7QUFDeEMsWUFBSXJDLDJCQUEyQixRQUEvQixFQUF5QztBQUN2Q0Qsb0NBQTBCN0csT0FBMUIsRUFBbUMzQyxRQUFuQyxFQUE2Q3lKLHNCQUE3QztBQUNEOztBQUVELFlBQUlRLFlBQVlySCxLQUFaLEtBQXNCLFFBQTFCLEVBQW9DO0FBQ2xDK0IsbUNBQXlCM0UsUUFBekIsRUFBbUNpSyxXQUFuQztBQUNEOztBQUVEN0YsNkJBQXFCekIsT0FBckIsRUFBOEIzQyxRQUE5Qjs7QUFFQUEsbUJBQVcsRUFBWDtBQUNELE9BMUNJO0FBMkNMK0wsMkJBQXFCVCxjQTNDaEI7QUE0Q0xVLDBCQUFvQlYsY0E1Q2Y7QUE2Q0xXLCtCQUF5QlgsY0E3Q3BCO0FBOENMWSxzQkFBZ0JaLGNBOUNYO0FBK0NMYSx3QkFBa0JiLGNBL0NiO0FBZ0RMLGtDQUE0QkMsY0FoRHZCO0FBaURMLGlDQUEyQkEsY0FqRHRCO0FBa0RMLHNDQUFnQ0EsY0FsRDNCO0FBbURMLDZCQUF1QkEsY0FuRGxCO0FBb0RMLCtCQUF5QkE7QUFwRHBCLEtBQVA7QUFzREQ7QUEzSmMsQ0FBakIiLCJmaWxlIjoib3JkZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuaW1wb3J0IG1pbmltYXRjaCBmcm9tICdtaW5pbWF0Y2gnXG5pbXBvcnQgaW1wb3J0VHlwZSBmcm9tICcuLi9jb3JlL2ltcG9ydFR5cGUnXG5pbXBvcnQgaXNTdGF0aWNSZXF1aXJlIGZyb20gJy4uL2NvcmUvc3RhdGljUmVxdWlyZSdcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbmNvbnN0IGRlZmF1bHRHcm91cHMgPSBbJ2J1aWx0aW4nLCAnZXh0ZXJuYWwnLCAncGFyZW50JywgJ3NpYmxpbmcnLCAnaW5kZXgnXVxuXG4vLyBSRVBPUlRJTkcgQU5EIEZJWElOR1xuXG5mdW5jdGlvbiByZXZlcnNlKGFycmF5KSB7XG4gIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdi5uYW1lLFxuICAgICAgcmFuazogLXYucmFuayxcbiAgICAgIG5vZGU6IHYubm9kZSxcbiAgICB9XG4gIH0pLnJldmVyc2UoKVxufVxuXG5mdW5jdGlvbiBnZXRUb2tlbnNPckNvbW1lbnRzQWZ0ZXIoc291cmNlQ29kZSwgbm9kZSwgY291bnQpIHtcbiAgbGV0IGN1cnJlbnROb2RlT3JUb2tlbiA9IG5vZGVcbiAgY29uc3QgcmVzdWx0ID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgY3VycmVudE5vZGVPclRva2VuID0gc291cmNlQ29kZS5nZXRUb2tlbk9yQ29tbWVudEFmdGVyKGN1cnJlbnROb2RlT3JUb2tlbilcbiAgICBpZiAoY3VycmVudE5vZGVPclRva2VuID09IG51bGwpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKGN1cnJlbnROb2RlT3JUb2tlbilcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGdldFRva2Vuc09yQ29tbWVudHNCZWZvcmUoc291cmNlQ29kZSwgbm9kZSwgY291bnQpIHtcbiAgbGV0IGN1cnJlbnROb2RlT3JUb2tlbiA9IG5vZGVcbiAgY29uc3QgcmVzdWx0ID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgY3VycmVudE5vZGVPclRva2VuID0gc291cmNlQ29kZS5nZXRUb2tlbk9yQ29tbWVudEJlZm9yZShjdXJyZW50Tm9kZU9yVG9rZW4pXG4gICAgaWYgKGN1cnJlbnROb2RlT3JUb2tlbiA9PSBudWxsKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgICByZXN1bHQucHVzaChjdXJyZW50Tm9kZU9yVG9rZW4pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5yZXZlcnNlKClcbn1cblxuZnVuY3Rpb24gdGFrZVRva2Vuc0FmdGVyV2hpbGUoc291cmNlQ29kZSwgbm9kZSwgY29uZGl0aW9uKSB7XG4gIGNvbnN0IHRva2VucyA9IGdldFRva2Vuc09yQ29tbWVudHNBZnRlcihzb3VyY2VDb2RlLCBub2RlLCAxMDApXG4gIGNvbnN0IHJlc3VsdCA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNvbmRpdGlvbih0b2tlbnNbaV0pKSB7XG4gICAgICByZXN1bHQucHVzaCh0b2tlbnNbaV0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiB0YWtlVG9rZW5zQmVmb3JlV2hpbGUoc291cmNlQ29kZSwgbm9kZSwgY29uZGl0aW9uKSB7XG4gIGNvbnN0IHRva2VucyA9IGdldFRva2Vuc09yQ29tbWVudHNCZWZvcmUoc291cmNlQ29kZSwgbm9kZSwgMTAwKVxuICBjb25zdCByZXN1bHQgPSBbXVxuICBmb3IgKGxldCBpID0gdG9rZW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGNvbmRpdGlvbih0b2tlbnNbaV0pKSB7XG4gICAgICByZXN1bHQucHVzaCh0b2tlbnNbaV0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5yZXZlcnNlKClcbn1cblxuZnVuY3Rpb24gZmluZE91dE9mT3JkZXIoaW1wb3J0ZWQpIHtcbiAgaWYgKGltcG9ydGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXVxuICB9XG4gIGxldCBtYXhTZWVuUmFua05vZGUgPSBpbXBvcnRlZFswXVxuICByZXR1cm4gaW1wb3J0ZWQuZmlsdGVyKGZ1bmN0aW9uIChpbXBvcnRlZE1vZHVsZSkge1xuICAgIGNvbnN0IHJlcyA9IGltcG9ydGVkTW9kdWxlLnJhbmsgPCBtYXhTZWVuUmFua05vZGUucmFua1xuICAgIGlmIChtYXhTZWVuUmFua05vZGUucmFuayA8IGltcG9ydGVkTW9kdWxlLnJhbmspIHtcbiAgICAgIG1heFNlZW5SYW5rTm9kZSA9IGltcG9ydGVkTW9kdWxlXG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfSlcbn1cblxuZnVuY3Rpb24gZmluZFJvb3ROb2RlKG5vZGUpIHtcbiAgbGV0IHBhcmVudCA9IG5vZGVcbiAgd2hpbGUgKHBhcmVudC5wYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQucGFyZW50LmJvZHkgPT0gbnVsbCkge1xuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRcbiAgfVxuICByZXR1cm4gcGFyZW50XG59XG5cbmZ1bmN0aW9uIGZpbmRFbmRPZkxpbmVXaXRoQ29tbWVudHMoc291cmNlQ29kZSwgbm9kZSkge1xuICBjb25zdCB0b2tlbnNUb0VuZE9mTGluZSA9IHRha2VUb2tlbnNBZnRlcldoaWxlKHNvdXJjZUNvZGUsIG5vZGUsIGNvbW1lbnRPblNhbWVMaW5lQXMobm9kZSkpXG4gIGxldCBlbmRPZlRva2VucyA9IHRva2Vuc1RvRW5kT2ZMaW5lLmxlbmd0aCA+IDBcbiAgICA/IHRva2Vuc1RvRW5kT2ZMaW5lW3Rva2Vuc1RvRW5kT2ZMaW5lLmxlbmd0aCAtIDFdLnJhbmdlWzFdXG4gICAgOiBub2RlLnJhbmdlWzFdXG4gIGxldCByZXN1bHQgPSBlbmRPZlRva2Vuc1xuICBmb3IgKGxldCBpID0gZW5kT2ZUb2tlbnM7IGkgPCBzb3VyY2VDb2RlLnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc291cmNlQ29kZS50ZXh0W2ldID09PSAnXFxuJykge1xuICAgICAgcmVzdWx0ID0gaSArIDFcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGlmIChzb3VyY2VDb2RlLnRleHRbaV0gIT09ICcgJyAmJiBzb3VyY2VDb2RlLnRleHRbaV0gIT09ICdcXHQnICYmIHNvdXJjZUNvZGUudGV4dFtpXSAhPT0gJ1xccicpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIHJlc3VsdCA9IGkgKyAxXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBjb21tZW50T25TYW1lTGluZUFzKG5vZGUpIHtcbiAgcmV0dXJuIHRva2VuID0+ICh0b2tlbi50eXBlID09PSAnQmxvY2snIHx8ICB0b2tlbi50eXBlID09PSAnTGluZScpICYmXG4gICAgICB0b2tlbi5sb2Muc3RhcnQubGluZSA9PT0gdG9rZW4ubG9jLmVuZC5saW5lICYmXG4gICAgICB0b2tlbi5sb2MuZW5kLmxpbmUgPT09IG5vZGUubG9jLmVuZC5saW5lXG59XG5cbmZ1bmN0aW9uIGZpbmRTdGFydE9mTGluZVdpdGhDb21tZW50cyhzb3VyY2VDb2RlLCBub2RlKSB7XG4gIGNvbnN0IHRva2Vuc1RvRW5kT2ZMaW5lID0gdGFrZVRva2Vuc0JlZm9yZVdoaWxlKHNvdXJjZUNvZGUsIG5vZGUsIGNvbW1lbnRPblNhbWVMaW5lQXMobm9kZSkpXG4gIGxldCBzdGFydE9mVG9rZW5zID0gdG9rZW5zVG9FbmRPZkxpbmUubGVuZ3RoID4gMCA/IHRva2Vuc1RvRW5kT2ZMaW5lWzBdLnJhbmdlWzBdIDogbm9kZS5yYW5nZVswXVxuICBsZXQgcmVzdWx0ID0gc3RhcnRPZlRva2Vuc1xuICBmb3IgKGxldCBpID0gc3RhcnRPZlRva2VucyAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICBpZiAoc291cmNlQ29kZS50ZXh0W2ldICE9PSAnICcgJiYgc291cmNlQ29kZS50ZXh0W2ldICE9PSAnXFx0Jykge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgcmVzdWx0ID0gaVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gaXNQbGFpblJlcXVpcmVNb2R1bGUobm9kZSkge1xuICBpZiAobm9kZS50eXBlICE9PSAnVmFyaWFibGVEZWNsYXJhdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBpZiAobm9kZS5kZWNsYXJhdGlvbnMubGVuZ3RoICE9PSAxKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgZGVjbCA9IG5vZGUuZGVjbGFyYXRpb25zWzBdXG4gIGNvbnN0IHJlc3VsdCA9IGRlY2wuaWQgJiZcbiAgICAoZGVjbC5pZC50eXBlID09PSAnSWRlbnRpZmllcicgfHwgZGVjbC5pZC50eXBlID09PSAnT2JqZWN0UGF0dGVybicpICYmXG4gICAgZGVjbC5pbml0ICE9IG51bGwgJiZcbiAgICBkZWNsLmluaXQudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJyAmJlxuICAgIGRlY2wuaW5pdC5jYWxsZWUgIT0gbnVsbCAmJlxuICAgIGRlY2wuaW5pdC5jYWxsZWUubmFtZSA9PT0gJ3JlcXVpcmUnICYmXG4gICAgZGVjbC5pbml0LmFyZ3VtZW50cyAhPSBudWxsICYmXG4gICAgZGVjbC5pbml0LmFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICBkZWNsLmluaXQuYXJndW1lbnRzWzBdLnR5cGUgPT09ICdMaXRlcmFsJ1xuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5JbXBvcnRNb2R1bGUobm9kZSkge1xuICByZXR1cm4gbm9kZS50eXBlID09PSAnSW1wb3J0RGVjbGFyYXRpb24nICYmIG5vZGUuc3BlY2lmaWVycyAhPSBudWxsICYmIG5vZGUuc3BlY2lmaWVycy5sZW5ndGggPiAwXG59XG5cbmZ1bmN0aW9uIGNhbkNyb3NzTm9kZVdoaWxlUmVvcmRlcihub2RlKSB7XG4gIHJldHVybiBpc1BsYWluUmVxdWlyZU1vZHVsZShub2RlKSB8fCBpc1BsYWluSW1wb3J0TW9kdWxlKG5vZGUpXG59XG5cbmZ1bmN0aW9uIGNhblJlb3JkZXJJdGVtcyhmaXJzdE5vZGUsIHNlY29uZE5vZGUpIHtcbiAgY29uc3QgcGFyZW50ID0gZmlyc3ROb2RlLnBhcmVudFxuICBjb25zdCBbZmlyc3RJbmRleCwgc2Vjb25kSW5kZXhdID0gW1xuICAgIHBhcmVudC5ib2R5LmluZGV4T2YoZmlyc3ROb2RlKSxcbiAgICBwYXJlbnQuYm9keS5pbmRleE9mKHNlY29uZE5vZGUpLFxuICBdLnNvcnQoKVxuICBjb25zdCBub2Rlc0JldHdlZW4gPSBwYXJlbnQuYm9keS5zbGljZShmaXJzdEluZGV4LCBzZWNvbmRJbmRleCArIDEpXG4gIGZvciAodmFyIG5vZGVCZXR3ZWVuIG9mIG5vZGVzQmV0d2Vlbikge1xuICAgIGlmICghY2FuQ3Jvc3NOb2RlV2hpbGVSZW9yZGVyKG5vZGVCZXR3ZWVuKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGZpeE91dE9mT3JkZXIoY29udGV4dCwgZmlyc3ROb2RlLCBzZWNvbmROb2RlLCBvcmRlcikge1xuICBjb25zdCBzb3VyY2VDb2RlID0gY29udGV4dC5nZXRTb3VyY2VDb2RlKClcblxuICBjb25zdCBmaXJzdFJvb3QgPSBmaW5kUm9vdE5vZGUoZmlyc3ROb2RlLm5vZGUpXG4gIGNvbnN0IGZpcnN0Um9vdFN0YXJ0ID0gZmluZFN0YXJ0T2ZMaW5lV2l0aENvbW1lbnRzKHNvdXJjZUNvZGUsIGZpcnN0Um9vdClcbiAgY29uc3QgZmlyc3RSb290RW5kID0gZmluZEVuZE9mTGluZVdpdGhDb21tZW50cyhzb3VyY2VDb2RlLCBmaXJzdFJvb3QpXG5cbiAgY29uc3Qgc2Vjb25kUm9vdCA9IGZpbmRSb290Tm9kZShzZWNvbmROb2RlLm5vZGUpXG4gIGNvbnN0IHNlY29uZFJvb3RTdGFydCA9IGZpbmRTdGFydE9mTGluZVdpdGhDb21tZW50cyhzb3VyY2VDb2RlLCBzZWNvbmRSb290KVxuICBjb25zdCBzZWNvbmRSb290RW5kID0gZmluZEVuZE9mTGluZVdpdGhDb21tZW50cyhzb3VyY2VDb2RlLCBzZWNvbmRSb290KVxuICBjb25zdCBjYW5GaXggPSBjYW5SZW9yZGVySXRlbXMoZmlyc3RSb290LCBzZWNvbmRSb290KVxuXG4gIGxldCBuZXdDb2RlID0gc291cmNlQ29kZS50ZXh0LnN1YnN0cmluZyhzZWNvbmRSb290U3RhcnQsIHNlY29uZFJvb3RFbmQpXG4gIGlmIChuZXdDb2RlW25ld0NvZGUubGVuZ3RoIC0gMV0gIT09ICdcXG4nKSB7XG4gICAgbmV3Q29kZSA9IG5ld0NvZGUgKyAnXFxuJ1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9ICdgJyArIHNlY29uZE5vZGUubmFtZSArICdgIGltcG9ydCBzaG91bGQgb2NjdXIgJyArIG9yZGVyICtcbiAgICAgICcgaW1wb3J0IG9mIGAnICsgZmlyc3ROb2RlLm5hbWUgKyAnYCdcblxuICBpZiAob3JkZXIgPT09ICdiZWZvcmUnKSB7XG4gICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgbm9kZTogc2Vjb25kTm9kZS5ub2RlLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIGZpeDogY2FuRml4ICYmIChmaXhlciA9PlxuICAgICAgICBmaXhlci5yZXBsYWNlVGV4dFJhbmdlKFxuICAgICAgICAgIFtmaXJzdFJvb3RTdGFydCwgc2Vjb25kUm9vdEVuZF0sXG4gICAgICAgICAgbmV3Q29kZSArIHNvdXJjZUNvZGUudGV4dC5zdWJzdHJpbmcoZmlyc3RSb290U3RhcnQsIHNlY29uZFJvb3RTdGFydClcbiAgICAgICAgKSksXG4gICAgfSlcbiAgfSBlbHNlIGlmIChvcmRlciA9PT0gJ2FmdGVyJykge1xuICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgIG5vZGU6IHNlY29uZE5vZGUubm9kZSxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICBmaXg6IGNhbkZpeCAmJiAoZml4ZXIgPT5cbiAgICAgICAgZml4ZXIucmVwbGFjZVRleHRSYW5nZShcbiAgICAgICAgICBbc2Vjb25kUm9vdFN0YXJ0LCBmaXJzdFJvb3RFbmRdLFxuICAgICAgICAgIHNvdXJjZUNvZGUudGV4dC5zdWJzdHJpbmcoc2Vjb25kUm9vdEVuZCwgZmlyc3RSb290RW5kKSArIG5ld0NvZGVcbiAgICAgICAgKSksXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBvcnRPdXRPZk9yZGVyKGNvbnRleHQsIGltcG9ydGVkLCBvdXRPZk9yZGVyLCBvcmRlcikge1xuICBvdXRPZk9yZGVyLmZvckVhY2goZnVuY3Rpb24gKGltcCkge1xuICAgIGNvbnN0IGZvdW5kID0gaW1wb3J0ZWQuZmluZChmdW5jdGlvbiBoYXNIaWdoZXJSYW5rKGltcG9ydGVkSXRlbSkge1xuICAgICAgcmV0dXJuIGltcG9ydGVkSXRlbS5yYW5rID4gaW1wLnJhbmtcbiAgICB9KVxuICAgIGZpeE91dE9mT3JkZXIoY29udGV4dCwgZm91bmQsIGltcCwgb3JkZXIpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIG1ha2VPdXRPZk9yZGVyUmVwb3J0KGNvbnRleHQsIGltcG9ydGVkKSB7XG4gIGNvbnN0IG91dE9mT3JkZXIgPSBmaW5kT3V0T2ZPcmRlcihpbXBvcnRlZClcbiAgaWYgKCFvdXRPZk9yZGVyLmxlbmd0aCkge1xuICAgIHJldHVyblxuICB9XG4gIC8vIFRoZXJlIGFyZSB0aGluZ3MgdG8gcmVwb3J0LiBUcnkgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiByZXBvcnRlZCBlcnJvcnMuXG4gIGNvbnN0IHJldmVyc2VkSW1wb3J0ZWQgPSByZXZlcnNlKGltcG9ydGVkKVxuICBjb25zdCByZXZlcnNlZE9yZGVyID0gZmluZE91dE9mT3JkZXIocmV2ZXJzZWRJbXBvcnRlZClcbiAgaWYgKHJldmVyc2VkT3JkZXIubGVuZ3RoIDwgb3V0T2ZPcmRlci5sZW5ndGgpIHtcbiAgICByZXBvcnRPdXRPZk9yZGVyKGNvbnRleHQsIHJldmVyc2VkSW1wb3J0ZWQsIHJldmVyc2VkT3JkZXIsICdhZnRlcicpXG4gICAgcmV0dXJuXG4gIH1cbiAgcmVwb3J0T3V0T2ZPcmRlcihjb250ZXh0LCBpbXBvcnRlZCwgb3V0T2ZPcmRlciwgJ2JlZm9yZScpXG59XG5cbmZ1bmN0aW9uIGltcG9ydHNTb3J0ZXJBc2MoaW1wb3J0QSwgaW1wb3J0Qikge1xuICBpZiAoaW1wb3J0QSA8IGltcG9ydEIpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIGlmIChpbXBvcnRBID4gaW1wb3J0Qikge1xuICAgIHJldHVybiAxXG4gIH1cblxuICByZXR1cm4gMFxufVxuXG5mdW5jdGlvbiBpbXBvcnRzU29ydGVyRGVzYyhpbXBvcnRBLCBpbXBvcnRCKSB7XG4gIGlmIChpbXBvcnRBIDwgaW1wb3J0Qikge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBpZiAoaW1wb3J0QSA+IGltcG9ydEIpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIHJldHVybiAwXG59XG5cbmZ1bmN0aW9uIG11dGF0ZVJhbmtzVG9BbHBoYWJldGl6ZShpbXBvcnRlZCwgYWxwaGFiZXRpemVPcHRpb25zKSB7XG4gIGNvbnN0IGdyb3VwZWRCeVJhbmtzID0gaW1wb3J0ZWQucmVkdWNlKGZ1bmN0aW9uKGFjYywgaW1wb3J0ZWRJdGVtKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFjY1tpbXBvcnRlZEl0ZW0ucmFua10pKSB7XG4gICAgICBhY2NbaW1wb3J0ZWRJdGVtLnJhbmtdID0gW11cbiAgICB9XG4gICAgYWNjW2ltcG9ydGVkSXRlbS5yYW5rXS5wdXNoKGltcG9ydGVkSXRlbS5uYW1lKVxuICAgIHJldHVybiBhY2NcbiAgfSwge30pXG5cbiAgY29uc3QgZ3JvdXBSYW5rcyA9IE9iamVjdC5rZXlzKGdyb3VwZWRCeVJhbmtzKVxuXG4gIGNvbnN0IHNvcnRlckZuID0gYWxwaGFiZXRpemVPcHRpb25zLm9yZGVyID09PSAnYXNjJyA/IGltcG9ydHNTb3J0ZXJBc2MgOiBpbXBvcnRzU29ydGVyRGVzY1xuICBjb25zdCBjb21wYXJhdG9yID0gYWxwaGFiZXRpemVPcHRpb25zLmNhc2VJbnNlbnNpdGl2ZSA/IChhLCBiKSA9PiBzb3J0ZXJGbihTdHJpbmcoYSkudG9Mb3dlckNhc2UoKSwgU3RyaW5nKGIpLnRvTG93ZXJDYXNlKCkpIDogKGEsIGIpID0+IHNvcnRlckZuKGEsIGIpXG4gIC8vIHNvcnQgaW1wb3J0cyBsb2NhbGx5IHdpdGhpbiB0aGVpciBncm91cFxuICBncm91cFJhbmtzLmZvckVhY2goZnVuY3Rpb24oZ3JvdXBSYW5rKSB7XG4gICAgZ3JvdXBlZEJ5UmFua3NbZ3JvdXBSYW5rXS5zb3J0KGNvbXBhcmF0b3IpXG4gIH0pXG5cbiAgLy8gYXNzaWduIGdsb2JhbGx5IHVuaXF1ZSByYW5rIHRvIGVhY2ggaW1wb3J0XG4gIGxldCBuZXdSYW5rID0gMFxuICBjb25zdCBhbHBoYWJldGl6ZWRSYW5rcyA9IGdyb3VwUmFua3Muc29ydCgpLnJlZHVjZShmdW5jdGlvbihhY2MsIGdyb3VwUmFuaykge1xuICAgIGdyb3VwZWRCeVJhbmtzW2dyb3VwUmFua10uZm9yRWFjaChmdW5jdGlvbihpbXBvcnRlZEl0ZW1OYW1lKSB7XG4gICAgICBhY2NbaW1wb3J0ZWRJdGVtTmFtZV0gPSBwYXJzZUludChncm91cFJhbmssIDEwKSArIG5ld1JhbmtcbiAgICAgIG5ld1JhbmsgKz0gMVxuICAgIH0pXG4gICAgcmV0dXJuIGFjY1xuICB9LCB7fSlcblxuICAvLyBtdXRhdGUgdGhlIG9yaWdpbmFsIGdyb3VwLXJhbmsgd2l0aCBhbHBoYWJldGl6ZWQtcmFua1xuICBpbXBvcnRlZC5mb3JFYWNoKGZ1bmN0aW9uKGltcG9ydGVkSXRlbSkge1xuICAgIGltcG9ydGVkSXRlbS5yYW5rID0gYWxwaGFiZXRpemVkUmFua3NbaW1wb3J0ZWRJdGVtLm5hbWVdXG4gIH0pXG59XG5cbi8vIERFVEVDVElOR1xuXG5mdW5jdGlvbiBjb21wdXRlUGF0aFJhbmsocmFua3MsIHBhdGhHcm91cHMsIHBhdGgsIG1heFBvc2l0aW9uKSB7XG4gIGZvciAobGV0IGkgPSAwLCBsID0gcGF0aEdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCB7IHBhdHRlcm4sIHBhdHRlcm5PcHRpb25zLCBncm91cCwgcG9zaXRpb24gPSAxIH0gPSBwYXRoR3JvdXBzW2ldXG4gICAgaWYgKG1pbmltYXRjaChwYXRoLCBwYXR0ZXJuLCBwYXR0ZXJuT3B0aW9ucyB8fCB7IG5vY29tbWVudDogdHJ1ZSB9KSkge1xuICAgICAgcmV0dXJuIHJhbmtzW2dyb3VwXSArIChwb3NpdGlvbiAvIG1heFBvc2l0aW9uKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlUmFuayhjb250ZXh0LCByYW5rcywgbmFtZSwgdHlwZSwgZXhjbHVkZWRJbXBvcnRUeXBlcykge1xuICBjb25zdCBpbXBUeXBlID0gaW1wb3J0VHlwZShuYW1lLCBjb250ZXh0KVxuICBsZXQgcmFua1xuICBpZiAoIWV4Y2x1ZGVkSW1wb3J0VHlwZXMuaGFzKGltcFR5cGUpKSB7XG4gICAgcmFuayA9IGNvbXB1dGVQYXRoUmFuayhyYW5rcy5ncm91cHMsIHJhbmtzLnBhdGhHcm91cHMsIG5hbWUsIHJhbmtzLm1heFBvc2l0aW9uKVxuICB9XG4gIGlmICghcmFuaykge1xuICAgIHJhbmsgPSByYW5rcy5ncm91cHNbaW1wVHlwZV1cbiAgfVxuICBpZiAodHlwZSAhPT0gJ2ltcG9ydCcpIHtcbiAgICByYW5rICs9IDEwMFxuICB9XG5cbiAgcmV0dXJuIHJhbmtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJOb2RlKGNvbnRleHQsIG5vZGUsIG5hbWUsIHR5cGUsIHJhbmtzLCBpbXBvcnRlZCwgZXhjbHVkZWRJbXBvcnRUeXBlcykge1xuICBjb25zdCByYW5rID0gY29tcHV0ZVJhbmsoY29udGV4dCwgcmFua3MsIG5hbWUsIHR5cGUsIGV4Y2x1ZGVkSW1wb3J0VHlwZXMpXG4gIGlmIChyYW5rICE9PSAtMSkge1xuICAgIGltcG9ydGVkLnB1c2goe25hbWUsIHJhbmssIG5vZGV9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW5WYXJpYWJsZURlY2xhcmF0b3Iobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJlxuICAgIChub2RlLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0b3InIHx8IGlzSW5WYXJpYWJsZURlY2xhcmF0b3Iobm9kZS5wYXJlbnQpKVxufVxuXG5jb25zdCB0eXBlcyA9IFsnYnVpbHRpbicsICdleHRlcm5hbCcsICdpbnRlcm5hbCcsICd1bmtub3duJywgJ3BhcmVudCcsICdzaWJsaW5nJywgJ2luZGV4J11cblxuLy8gQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0eXBlLXJhbmsgcGFpcnMuXG4vLyBFeGFtcGxlOiB7IGluZGV4OiAwLCBzaWJsaW5nOiAxLCBwYXJlbnQ6IDEsIGV4dGVybmFsOiAxLCBidWlsdGluOiAyLCBpbnRlcm5hbDogMiB9XG4vLyBXaWxsIHRocm93IGFuIGVycm9yIGlmIGl0IGNvbnRhaW5zIGEgdHlwZSB0aGF0IGRvZXMgbm90IGV4aXN0LCBvciBoYXMgYSBkdXBsaWNhdGVcbmZ1bmN0aW9uIGNvbnZlcnRHcm91cHNUb1JhbmtzKGdyb3Vwcykge1xuICBjb25zdCByYW5rT2JqZWN0ID0gZ3JvdXBzLnJlZHVjZShmdW5jdGlvbihyZXMsIGdyb3VwLCBpbmRleCkge1xuICAgIGlmICh0eXBlb2YgZ3JvdXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICBncm91cCA9IFtncm91cF1cbiAgICB9XG4gICAgZ3JvdXAuZm9yRWFjaChmdW5jdGlvbihncm91cEl0ZW0pIHtcbiAgICAgIGlmICh0eXBlcy5pbmRleE9mKGdyb3VwSXRlbSkgPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJ1bGU6IFVua25vd24gdHlwZSBgJyArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZ3JvdXBJdGVtKSArICdgJylcbiAgICAgIH1cbiAgICAgIGlmIChyZXNbZ3JvdXBJdGVtXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJ1bGU6IGAnICsgZ3JvdXBJdGVtICsgJ2AgaXMgZHVwbGljYXRlZCcpXG4gICAgICB9XG4gICAgICByZXNbZ3JvdXBJdGVtXSA9IGluZGV4XG4gICAgfSlcbiAgICByZXR1cm4gcmVzXG4gIH0sIHt9KVxuXG4gIGNvbnN0IG9taXR0ZWRUeXBlcyA9IHR5cGVzLmZpbHRlcihmdW5jdGlvbih0eXBlKSB7XG4gICAgcmV0dXJuIHJhbmtPYmplY3RbdHlwZV0gPT09IHVuZGVmaW5lZFxuICB9KVxuXG4gIHJldHVybiBvbWl0dGVkVHlwZXMucmVkdWNlKGZ1bmN0aW9uKHJlcywgdHlwZSkge1xuICAgIHJlc1t0eXBlXSA9IGdyb3Vwcy5sZW5ndGhcbiAgICByZXR1cm4gcmVzXG4gIH0sIHJhbmtPYmplY3QpXG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQYXRoR3JvdXBzRm9yUmFua3MocGF0aEdyb3Vwcykge1xuICBjb25zdCBhZnRlciA9IHt9XG4gIGNvbnN0IGJlZm9yZSA9IHt9XG5cbiAgY29uc3QgdHJhbnNmb3JtZWQgPSBwYXRoR3JvdXBzLm1hcCgocGF0aEdyb3VwLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgZ3JvdXAsIHBvc2l0aW9uOiBwb3NpdGlvblN0cmluZyB9ID0gcGF0aEdyb3VwXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIGlmIChwb3NpdGlvblN0cmluZyA9PT0gJ2FmdGVyJykge1xuICAgICAgaWYgKCFhZnRlcltncm91cF0pIHtcbiAgICAgICAgYWZ0ZXJbZ3JvdXBdID0gMVxuICAgICAgfVxuICAgICAgcG9zaXRpb24gPSBhZnRlcltncm91cF0rK1xuICAgIH0gZWxzZSBpZiAocG9zaXRpb25TdHJpbmcgPT09ICdiZWZvcmUnKSB7XG4gICAgICBpZiAoIWJlZm9yZVtncm91cF0pIHtcbiAgICAgICAgYmVmb3JlW2dyb3VwXSA9IFtdXG4gICAgICB9XG4gICAgICBiZWZvcmVbZ3JvdXBdLnB1c2goaW5kZXgpXG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHBhdGhHcm91cCwgeyBwb3NpdGlvbiB9KVxuICB9KVxuXG4gIGxldCBtYXhQb3NpdGlvbiA9IDFcblxuICBPYmplY3Qua2V5cyhiZWZvcmUpLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBMZW5ndGggPSBiZWZvcmVbZ3JvdXBdLmxlbmd0aFxuICAgIGJlZm9yZVtncm91cF0uZm9yRWFjaCgoZ3JvdXBJbmRleCwgaW5kZXgpID0+IHtcbiAgICAgIHRyYW5zZm9ybWVkW2dyb3VwSW5kZXhdLnBvc2l0aW9uID0gLTEgKiAoZ3JvdXBMZW5ndGggLSBpbmRleClcbiAgICB9KVxuICAgIG1heFBvc2l0aW9uID0gTWF0aC5tYXgobWF4UG9zaXRpb24sIGdyb3VwTGVuZ3RoKVxuICB9KVxuXG4gIE9iamVjdC5rZXlzKGFmdGVyKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCBncm91cE5leHRQb3NpdGlvbiA9IGFmdGVyW2tleV1cbiAgICBtYXhQb3NpdGlvbiA9IE1hdGgubWF4KG1heFBvc2l0aW9uLCBncm91cE5leHRQb3NpdGlvbiAtIDEpXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoR3JvdXBzOiB0cmFuc2Zvcm1lZCxcbiAgICBtYXhQb3NpdGlvbjogbWF4UG9zaXRpb24gPiAxMCA/IE1hdGgucG93KDEwLCBNYXRoLmNlaWwoTWF0aC5sb2cxMChtYXhQb3NpdGlvbikpKSA6IDEwLFxuICB9XG59XG5cbmZ1bmN0aW9uIGZpeE5ld0xpbmVBZnRlckltcG9ydChjb250ZXh0LCBwcmV2aW91c0ltcG9ydCkge1xuICBjb25zdCBwcmV2Um9vdCA9IGZpbmRSb290Tm9kZShwcmV2aW91c0ltcG9ydC5ub2RlKVxuICBjb25zdCB0b2tlbnNUb0VuZE9mTGluZSA9IHRha2VUb2tlbnNBZnRlcldoaWxlKFxuICAgIGNvbnRleHQuZ2V0U291cmNlQ29kZSgpLCBwcmV2Um9vdCwgY29tbWVudE9uU2FtZUxpbmVBcyhwcmV2Um9vdCkpXG5cbiAgbGV0IGVuZE9mTGluZSA9IHByZXZSb290LnJhbmdlWzFdXG4gIGlmICh0b2tlbnNUb0VuZE9mTGluZS5sZW5ndGggPiAwKSB7XG4gICAgZW5kT2ZMaW5lID0gdG9rZW5zVG9FbmRPZkxpbmVbdG9rZW5zVG9FbmRPZkxpbmUubGVuZ3RoIC0gMV0ucmFuZ2VbMV1cbiAgfVxuICByZXR1cm4gKGZpeGVyKSA9PiBmaXhlci5pbnNlcnRUZXh0QWZ0ZXJSYW5nZShbcHJldlJvb3QucmFuZ2VbMF0sIGVuZE9mTGluZV0sICdcXG4nKVxufVxuXG5mdW5jdGlvbiByZW1vdmVOZXdMaW5lQWZ0ZXJJbXBvcnQoY29udGV4dCwgY3VycmVudEltcG9ydCwgcHJldmlvdXNJbXBvcnQpIHtcbiAgY29uc3Qgc291cmNlQ29kZSA9IGNvbnRleHQuZ2V0U291cmNlQ29kZSgpXG4gIGNvbnN0IHByZXZSb290ID0gZmluZFJvb3ROb2RlKHByZXZpb3VzSW1wb3J0Lm5vZGUpXG4gIGNvbnN0IGN1cnJSb290ID0gZmluZFJvb3ROb2RlKGN1cnJlbnRJbXBvcnQubm9kZSlcbiAgY29uc3QgcmFuZ2VUb1JlbW92ZSA9IFtcbiAgICBmaW5kRW5kT2ZMaW5lV2l0aENvbW1lbnRzKHNvdXJjZUNvZGUsIHByZXZSb290KSxcbiAgICBmaW5kU3RhcnRPZkxpbmVXaXRoQ29tbWVudHMoc291cmNlQ29kZSwgY3VyclJvb3QpLFxuICBdXG4gIGlmICgvXlxccyokLy50ZXN0KHNvdXJjZUNvZGUudGV4dC5zdWJzdHJpbmcocmFuZ2VUb1JlbW92ZVswXSwgcmFuZ2VUb1JlbW92ZVsxXSkpKSB7XG4gICAgcmV0dXJuIChmaXhlcikgPT4gZml4ZXIucmVtb3ZlUmFuZ2UocmFuZ2VUb1JlbW92ZSlcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIG1ha2VOZXdsaW5lc0JldHdlZW5SZXBvcnQgKGNvbnRleHQsIGltcG9ydGVkLCBuZXdsaW5lc0JldHdlZW5JbXBvcnRzKSB7XG4gIGNvbnN0IGdldE51bWJlck9mRW1wdHlMaW5lc0JldHdlZW4gPSAoY3VycmVudEltcG9ydCwgcHJldmlvdXNJbXBvcnQpID0+IHtcbiAgICBjb25zdCBsaW5lc0JldHdlZW5JbXBvcnRzID0gY29udGV4dC5nZXRTb3VyY2VDb2RlKCkubGluZXMuc2xpY2UoXG4gICAgICBwcmV2aW91c0ltcG9ydC5ub2RlLmxvYy5lbmQubGluZSxcbiAgICAgIGN1cnJlbnRJbXBvcnQubm9kZS5sb2Muc3RhcnQubGluZSAtIDFcbiAgICApXG5cbiAgICByZXR1cm4gbGluZXNCZXR3ZWVuSW1wb3J0cy5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnRyaW0oKS5sZW5ndGgpLmxlbmd0aFxuICB9XG4gIGxldCBwcmV2aW91c0ltcG9ydCA9IGltcG9ydGVkWzBdXG5cbiAgaW1wb3J0ZWQuc2xpY2UoMSkuZm9yRWFjaChmdW5jdGlvbihjdXJyZW50SW1wb3J0KSB7XG4gICAgY29uc3QgZW1wdHlMaW5lc0JldHdlZW4gPSBnZXROdW1iZXJPZkVtcHR5TGluZXNCZXR3ZWVuKGN1cnJlbnRJbXBvcnQsIHByZXZpb3VzSW1wb3J0KVxuXG4gICAgaWYgKG5ld2xpbmVzQmV0d2VlbkltcG9ydHMgPT09ICdhbHdheXMnXG4gICAgICAgIHx8IG5ld2xpbmVzQmV0d2VlbkltcG9ydHMgPT09ICdhbHdheXMtYW5kLWluc2lkZS1ncm91cHMnKSB7XG4gICAgICBpZiAoY3VycmVudEltcG9ydC5yYW5rICE9PSBwcmV2aW91c0ltcG9ydC5yYW5rICYmIGVtcHR5TGluZXNCZXR3ZWVuID09PSAwKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICBub2RlOiBwcmV2aW91c0ltcG9ydC5ub2RlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdUaGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIGVtcHR5IGxpbmUgYmV0d2VlbiBpbXBvcnQgZ3JvdXBzJyxcbiAgICAgICAgICBmaXg6IGZpeE5ld0xpbmVBZnRlckltcG9ydChjb250ZXh0LCBwcmV2aW91c0ltcG9ydCksXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbXBvcnQucmFuayA9PT0gcHJldmlvdXNJbXBvcnQucmFua1xuICAgICAgICAmJiBlbXB0eUxpbmVzQmV0d2VlbiA+IDBcbiAgICAgICAgJiYgbmV3bGluZXNCZXR3ZWVuSW1wb3J0cyAhPT0gJ2Fsd2F5cy1hbmQtaW5zaWRlLWdyb3VwcycpIHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgIG5vZGU6IHByZXZpb3VzSW1wb3J0Lm5vZGUsXG4gICAgICAgICAgbWVzc2FnZTogJ1RoZXJlIHNob3VsZCBiZSBubyBlbXB0eSBsaW5lIHdpdGhpbiBpbXBvcnQgZ3JvdXAnLFxuICAgICAgICAgIGZpeDogcmVtb3ZlTmV3TGluZUFmdGVySW1wb3J0KGNvbnRleHQsIGN1cnJlbnRJbXBvcnQsIHByZXZpb3VzSW1wb3J0KSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVtcHR5TGluZXNCZXR3ZWVuID4gMCkge1xuICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICBub2RlOiBwcmV2aW91c0ltcG9ydC5ub2RlLFxuICAgICAgICBtZXNzYWdlOiAnVGhlcmUgc2hvdWxkIGJlIG5vIGVtcHR5IGxpbmUgYmV0d2VlbiBpbXBvcnQgZ3JvdXBzJyxcbiAgICAgICAgZml4OiByZW1vdmVOZXdMaW5lQWZ0ZXJJbXBvcnQoY29udGV4dCwgY3VycmVudEltcG9ydCwgcHJldmlvdXNJbXBvcnQpLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBwcmV2aW91c0ltcG9ydCA9IGN1cnJlbnRJbXBvcnRcbiAgfSlcbn1cblxuZnVuY3Rpb24gZ2V0QWxwaGFiZXRpemVDb25maWcob3B0aW9ucykge1xuICBjb25zdCBhbHBoYWJldGl6ZSA9IG9wdGlvbnMuYWxwaGFiZXRpemUgfHwge31cbiAgY29uc3Qgb3JkZXIgPSBhbHBoYWJldGl6ZS5vcmRlciB8fCAnaWdub3JlJ1xuICBjb25zdCBjYXNlSW5zZW5zaXRpdmUgPSBhbHBoYWJldGl6ZS5jYXNlSW5zZW5zaXRpdmUgfHwgZmFsc2VcblxuICByZXR1cm4ge29yZGVyLCBjYXNlSW5zZW5zaXRpdmV9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnb3JkZXInKSxcbiAgICB9LFxuXG4gICAgZml4YWJsZTogJ2NvZGUnLFxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGdyb3Vwczoge1xuICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhdGhHcm91cHNFeGNsdWRlZEltcG9ydFR5cGVzOiB7XG4gICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGF0aEdyb3Vwczoge1xuICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgcGF0dGVybjoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBncm91cDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICBlbnVtOiB0eXBlcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgIGVudW06IFsnYWZ0ZXInLCAnYmVmb3JlJ10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IFsncGF0dGVybicsICdncm91cCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICduZXdsaW5lcy1iZXR3ZWVuJzoge1xuICAgICAgICAgICAgZW51bTogW1xuICAgICAgICAgICAgICAnaWdub3JlJyxcbiAgICAgICAgICAgICAgJ2Fsd2F5cycsXG4gICAgICAgICAgICAgICdhbHdheXMtYW5kLWluc2lkZS1ncm91cHMnLFxuICAgICAgICAgICAgICAnbmV2ZXInLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFscGhhYmV0aXplOiB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgY2FzZUluc2Vuc2l0aXZlOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvcmRlcjoge1xuICAgICAgICAgICAgICAgIGVudW06IFsnaWdub3JlJywgJ2FzYycsICdkZXNjJ10sXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJ2lnbm9yZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIGltcG9ydE9yZGVyUnVsZSAoY29udGV4dCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnNbMF0gfHwge31cbiAgICBjb25zdCBuZXdsaW5lc0JldHdlZW5JbXBvcnRzID0gb3B0aW9uc1snbmV3bGluZXMtYmV0d2VlbiddIHx8ICdpZ25vcmUnXG4gICAgY29uc3QgcGF0aEdyb3Vwc0V4Y2x1ZGVkSW1wb3J0VHlwZXMgPSBuZXcgU2V0KG9wdGlvbnNbJ3BhdGhHcm91cHNFeGNsdWRlZEltcG9ydFR5cGVzJ10gfHwgWydidWlsdGluJywgJ2V4dGVybmFsJ10pXG4gICAgY29uc3QgYWxwaGFiZXRpemUgPSBnZXRBbHBoYWJldGl6ZUNvbmZpZyhvcHRpb25zKVxuICAgIGxldCByYW5rc1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcGF0aEdyb3VwcywgbWF4UG9zaXRpb24gfSA9IGNvbnZlcnRQYXRoR3JvdXBzRm9yUmFua3Mob3B0aW9ucy5wYXRoR3JvdXBzIHx8IFtdKVxuICAgICAgcmFua3MgPSB7XG4gICAgICAgIGdyb3VwczogY29udmVydEdyb3Vwc1RvUmFua3Mob3B0aW9ucy5ncm91cHMgfHwgZGVmYXVsdEdyb3VwcyksXG4gICAgICAgIHBhdGhHcm91cHMsXG4gICAgICAgIG1heFBvc2l0aW9uLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBNYWxmb3JtZWQgY29uZmlndXJhdGlvblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUHJvZ3JhbTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KG5vZGUsIGVycm9yLm1lc3NhZ2UpXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuICAgIGxldCBpbXBvcnRlZCA9IFtdXG4gICAgbGV0IGxldmVsID0gMFxuXG4gICAgZnVuY3Rpb24gaW5jcmVtZW50TGV2ZWwoKSB7XG4gICAgICBsZXZlbCsrXG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlY3JlbWVudExldmVsKCkge1xuICAgICAgbGV2ZWwtLVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBJbXBvcnREZWNsYXJhdGlvbjogZnVuY3Rpb24gaGFuZGxlSW1wb3J0cyhub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnNwZWNpZmllcnMubGVuZ3RoKSB7IC8vIElnbm9yaW5nIHVuYXNzaWduZWQgaW1wb3J0c1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBub2RlLnNvdXJjZS52YWx1ZVxuICAgICAgICAgIHJlZ2lzdGVyTm9kZShcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICdpbXBvcnQnLFxuICAgICAgICAgICAgcmFua3MsXG4gICAgICAgICAgICBpbXBvcnRlZCxcbiAgICAgICAgICAgIHBhdGhHcm91cHNFeGNsdWRlZEltcG9ydFR5cGVzXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ2FsbEV4cHJlc3Npb246IGZ1bmN0aW9uIGhhbmRsZVJlcXVpcmVzKG5vZGUpIHtcbiAgICAgICAgaWYgKGxldmVsICE9PSAwIHx8ICFpc1N0YXRpY1JlcXVpcmUobm9kZSkgfHwgIWlzSW5WYXJpYWJsZURlY2xhcmF0b3Iobm9kZS5wYXJlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZSA9IG5vZGUuYXJndW1lbnRzWzBdLnZhbHVlXG4gICAgICAgIHJlZ2lzdGVyTm9kZShcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICAncmVxdWlyZScsXG4gICAgICAgICAgcmFua3MsXG4gICAgICAgICAgaW1wb3J0ZWQsXG4gICAgICAgICAgcGF0aEdyb3Vwc0V4Y2x1ZGVkSW1wb3J0VHlwZXNcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgICdQcm9ncmFtOmV4aXQnOiBmdW5jdGlvbiByZXBvcnRBbmRSZXNldCgpIHtcbiAgICAgICAgaWYgKG5ld2xpbmVzQmV0d2VlbkltcG9ydHMgIT09ICdpZ25vcmUnKSB7XG4gICAgICAgICAgbWFrZU5ld2xpbmVzQmV0d2VlblJlcG9ydChjb250ZXh0LCBpbXBvcnRlZCwgbmV3bGluZXNCZXR3ZWVuSW1wb3J0cylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhbHBoYWJldGl6ZS5vcmRlciAhPT0gJ2lnbm9yZScpIHtcbiAgICAgICAgICBtdXRhdGVSYW5rc1RvQWxwaGFiZXRpemUoaW1wb3J0ZWQsIGFscGhhYmV0aXplKVxuICAgICAgICB9XG5cbiAgICAgICAgbWFrZU91dE9mT3JkZXJSZXBvcnQoY29udGV4dCwgaW1wb3J0ZWQpXG5cbiAgICAgICAgaW1wb3J0ZWQgPSBbXVxuICAgICAgfSxcbiAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb246IGluY3JlbWVudExldmVsLFxuICAgICAgRnVuY3Rpb25FeHByZXNzaW9uOiBpbmNyZW1lbnRMZXZlbCxcbiAgICAgIEFycm93RnVuY3Rpb25FeHByZXNzaW9uOiBpbmNyZW1lbnRMZXZlbCxcbiAgICAgIEJsb2NrU3RhdGVtZW50OiBpbmNyZW1lbnRMZXZlbCxcbiAgICAgIE9iamVjdEV4cHJlc3Npb246IGluY3JlbWVudExldmVsLFxuICAgICAgJ0Z1bmN0aW9uRGVjbGFyYXRpb246ZXhpdCc6IGRlY3JlbWVudExldmVsLFxuICAgICAgJ0Z1bmN0aW9uRXhwcmVzc2lvbjpleGl0JzogZGVjcmVtZW50TGV2ZWwsXG4gICAgICAnQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246ZXhpdCc6IGRlY3JlbWVudExldmVsLFxuICAgICAgJ0Jsb2NrU3RhdGVtZW50OmV4aXQnOiBkZWNyZW1lbnRMZXZlbCxcbiAgICAgICdPYmplY3RFeHByZXNzaW9uOmV4aXQnOiBkZWNyZW1lbnRMZXZlbCxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
+      'ObjectExpression:exit': decrementLevel };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9vcmRlci5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0R3JvdXBzIiwicmV2ZXJzZSIsImFycmF5IiwibWFwIiwidiIsIk9iamVjdCIsImFzc2lnbiIsInJhbmsiLCJnZXRUb2tlbnNPckNvbW1lbnRzQWZ0ZXIiLCJzb3VyY2VDb2RlIiwibm9kZSIsImNvdW50IiwiY3VycmVudE5vZGVPclRva2VuIiwicmVzdWx0IiwiaSIsImdldFRva2VuT3JDb21tZW50QWZ0ZXIiLCJwdXNoIiwiZ2V0VG9rZW5zT3JDb21tZW50c0JlZm9yZSIsImdldFRva2VuT3JDb21tZW50QmVmb3JlIiwidGFrZVRva2Vuc0FmdGVyV2hpbGUiLCJjb25kaXRpb24iLCJ0b2tlbnMiLCJsZW5ndGgiLCJ0YWtlVG9rZW5zQmVmb3JlV2hpbGUiLCJmaW5kT3V0T2ZPcmRlciIsImltcG9ydGVkIiwibWF4U2VlblJhbmtOb2RlIiwiZmlsdGVyIiwiaW1wb3J0ZWRNb2R1bGUiLCJyZXMiLCJmaW5kUm9vdE5vZGUiLCJwYXJlbnQiLCJib2R5IiwiZmluZEVuZE9mTGluZVdpdGhDb21tZW50cyIsInRva2Vuc1RvRW5kT2ZMaW5lIiwiY29tbWVudE9uU2FtZUxpbmVBcyIsImVuZE9mVG9rZW5zIiwicmFuZ2UiLCJ0ZXh0IiwidG9rZW4iLCJ0eXBlIiwibG9jIiwic3RhcnQiLCJsaW5lIiwiZW5kIiwiZmluZFN0YXJ0T2ZMaW5lV2l0aENvbW1lbnRzIiwic3RhcnRPZlRva2VucyIsImlzUGxhaW5SZXF1aXJlTW9kdWxlIiwiZGVjbGFyYXRpb25zIiwiZGVjbCIsImlkIiwiaW5pdCIsImNhbGxlZSIsIm5hbWUiLCJhcmd1bWVudHMiLCJpc1BsYWluSW1wb3J0TW9kdWxlIiwic3BlY2lmaWVycyIsImlzUGxhaW5JbXBvcnRFcXVhbHMiLCJtb2R1bGVSZWZlcmVuY2UiLCJleHByZXNzaW9uIiwiY2FuQ3Jvc3NOb2RlV2hpbGVSZW9yZGVyIiwiY2FuUmVvcmRlckl0ZW1zIiwiZmlyc3ROb2RlIiwic2Vjb25kTm9kZSIsImluZGV4T2YiLCJzb3J0IiwiZmlyc3RJbmRleCIsInNlY29uZEluZGV4Iiwibm9kZXNCZXR3ZWVuIiwic2xpY2UiLCJub2RlQmV0d2VlbiIsImZpeE91dE9mT3JkZXIiLCJjb250ZXh0Iiwib3JkZXIiLCJnZXRTb3VyY2VDb2RlIiwiZmlyc3RSb290IiwiZmlyc3RSb290U3RhcnQiLCJmaXJzdFJvb3RFbmQiLCJzZWNvbmRSb290Iiwic2Vjb25kUm9vdFN0YXJ0Iiwic2Vjb25kUm9vdEVuZCIsImNhbkZpeCIsIm5ld0NvZGUiLCJzdWJzdHJpbmciLCJtZXNzYWdlIiwiZGlzcGxheU5hbWUiLCJyZXBvcnQiLCJmaXgiLCJmaXhlciIsInJlcGxhY2VUZXh0UmFuZ2UiLCJyZXBvcnRPdXRPZk9yZGVyIiwib3V0T2ZPcmRlciIsImZvckVhY2giLCJpbXAiLCJmb3VuZCIsImZpbmQiLCJoYXNIaWdoZXJSYW5rIiwiaW1wb3J0ZWRJdGVtIiwibWFrZU91dE9mT3JkZXJSZXBvcnQiLCJyZXZlcnNlZEltcG9ydGVkIiwicmV2ZXJzZWRPcmRlciIsImdldFNvcnRlciIsImFzY2VuZGluZyIsIm11bHRpcGxpZXIiLCJpbXBvcnRzU29ydGVyIiwiaW1wb3J0QSIsImltcG9ydEIiLCJtdXRhdGVSYW5rc1RvQWxwaGFiZXRpemUiLCJhbHBoYWJldGl6ZU9wdGlvbnMiLCJncm91cGVkQnlSYW5rcyIsInJlZHVjZSIsImFjYyIsIkFycmF5IiwiaXNBcnJheSIsInZhbHVlIiwiZ3JvdXBSYW5rcyIsImtleXMiLCJzb3J0ZXJGbiIsImNvbXBhcmF0b3IiLCJjYXNlSW5zZW5zaXRpdmUiLCJhIiwiYiIsIlN0cmluZyIsInRvTG93ZXJDYXNlIiwiZ3JvdXBSYW5rIiwibmV3UmFuayIsImFscGhhYmV0aXplZFJhbmtzIiwiaW1wb3J0ZWRJdGVtTmFtZSIsInBhcnNlSW50IiwiY29tcHV0ZVBhdGhSYW5rIiwicmFua3MiLCJwYXRoR3JvdXBzIiwicGF0aCIsIm1heFBvc2l0aW9uIiwibCIsInBhdHRlcm4iLCJwYXR0ZXJuT3B0aW9ucyIsImdyb3VwIiwicG9zaXRpb24iLCJub2NvbW1lbnQiLCJjb21wdXRlUmFuayIsImltcG9ydEVudHJ5IiwiZXhjbHVkZWRJbXBvcnRUeXBlcyIsImltcFR5cGUiLCJoYXMiLCJncm91cHMiLCJzdGFydHNXaXRoIiwicmVnaXN0ZXJOb2RlIiwiaXNJblZhcmlhYmxlRGVjbGFyYXRvciIsInR5cGVzIiwiY29udmVydEdyb3Vwc1RvUmFua3MiLCJyYW5rT2JqZWN0IiwiaW5kZXgiLCJncm91cEl0ZW0iLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJvbWl0dGVkVHlwZXMiLCJjb252ZXJ0UGF0aEdyb3Vwc0ZvclJhbmtzIiwiYWZ0ZXIiLCJiZWZvcmUiLCJ0cmFuc2Zvcm1lZCIsInBhdGhHcm91cCIsInBvc2l0aW9uU3RyaW5nIiwiZ3JvdXBMZW5ndGgiLCJncm91cEluZGV4IiwiTWF0aCIsIm1heCIsImtleSIsImdyb3VwTmV4dFBvc2l0aW9uIiwicG93IiwiY2VpbCIsImxvZzEwIiwiZml4TmV3TGluZUFmdGVySW1wb3J0IiwicHJldmlvdXNJbXBvcnQiLCJwcmV2Um9vdCIsImVuZE9mTGluZSIsImluc2VydFRleHRBZnRlclJhbmdlIiwicmVtb3ZlTmV3TGluZUFmdGVySW1wb3J0IiwiY3VycmVudEltcG9ydCIsImN1cnJSb290IiwicmFuZ2VUb1JlbW92ZSIsInRlc3QiLCJyZW1vdmVSYW5nZSIsIm1ha2VOZXdsaW5lc0JldHdlZW5SZXBvcnQiLCJuZXdsaW5lc0JldHdlZW5JbXBvcnRzIiwiZ2V0TnVtYmVyT2ZFbXB0eUxpbmVzQmV0d2VlbiIsImxpbmVzQmV0d2VlbkltcG9ydHMiLCJsaW5lcyIsInRyaW0iLCJlbXB0eUxpbmVzQmV0d2VlbiIsImdldEFscGhhYmV0aXplQ29uZmlnIiwib3B0aW9ucyIsImFscGhhYmV0aXplIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJkb2NzIiwidXJsIiwiZml4YWJsZSIsInNjaGVtYSIsInByb3BlcnRpZXMiLCJwYXRoR3JvdXBzRXhjbHVkZWRJbXBvcnRUeXBlcyIsIml0ZW1zIiwiZW51bSIsInJlcXVpcmVkIiwiZGVmYXVsdCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiY3JlYXRlIiwiaW1wb3J0T3JkZXJSdWxlIiwiU2V0IiwiZXJyb3IiLCJQcm9ncmFtIiwibGV2ZWwiLCJpbmNyZW1lbnRMZXZlbCIsImRlY3JlbWVudExldmVsIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJoYW5kbGVJbXBvcnRzIiwic291cmNlIiwiVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiIsImlzRXhwb3J0IiwiZ2V0VGV4dCIsIkNhbGxFeHByZXNzaW9uIiwiaGFuZGxlUmVxdWlyZXMiLCJyZXBvcnRBbmRSZXNldCIsIkZ1bmN0aW9uRGVjbGFyYXRpb24iLCJGdW5jdGlvbkV4cHJlc3Npb24iLCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiIsIkJsb2NrU3RhdGVtZW50IiwiT2JqZWN0RXhwcmVzc2lvbiJdLCJtYXBwaW5ncyI6IkFBQUEsYTs7QUFFQSxzQztBQUNBLGdEO0FBQ0Esc0Q7QUFDQSxxQzs7QUFFQSxNQUFNQSxnQkFBZ0IsQ0FBQyxTQUFELEVBQVksVUFBWixFQUF3QixRQUF4QixFQUFrQyxTQUFsQyxFQUE2QyxPQUE3QyxDQUF0Qjs7QUFFQTs7QUFFQSxTQUFTQyxPQUFULENBQWlCQyxLQUFqQixFQUF3QjtBQUN0QixTQUFPQSxNQUFNQyxHQUFOLENBQVUsVUFBVUMsQ0FBVixFQUFhO0FBQzVCLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYyxFQUFkLEVBQWtCRixDQUFsQixFQUFxQixFQUFFRyxNQUFNLENBQUNILEVBQUVHLElBQVgsRUFBckIsQ0FBUDtBQUNELEdBRk0sRUFFSk4sT0FGSSxFQUFQO0FBR0Q7O0FBRUQsU0FBU08sd0JBQVQsQ0FBa0NDLFVBQWxDLEVBQThDQyxJQUE5QyxFQUFvREMsS0FBcEQsRUFBMkQ7QUFDekQsTUFBSUMscUJBQXFCRixJQUF6QjtBQUNBLFFBQU1HLFNBQVMsRUFB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c0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCBtaW5pbWF0Y2ggZnJvbSAnbWluaW1hdGNoJ1xuaW1wb3J0IGltcG9ydFR5cGUgZnJvbSAnLi4vY29yZS9pbXBvcnRUeXBlJ1xuaW1wb3J0IGlzU3RhdGljUmVxdWlyZSBmcm9tICcuLi9jb3JlL3N0YXRpY1JlcXVpcmUnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5jb25zdCBkZWZhdWx0R3JvdXBzID0gWydidWlsdGluJywgJ2V4dGVybmFsJywgJ3BhcmVudCcsICdzaWJsaW5nJywgJ2luZGV4J11cblxuLy8gUkVQT1JUSU5HIEFORCBGSVhJTkdcblxuZnVuY3Rpb24gcmV2ZXJzZShhcnJheSkge1xuICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHYsIHsgcmFuazogLXYucmFuayB9KVxuICB9KS5yZXZlcnNlKClcbn1cblxuZnVuY3Rpb24gZ2V0VG9rZW5zT3JDb21tZW50c0FmdGVyKHNvdXJjZUNvZGUsIG5vZGUsIGNvdW50KSB7XG4gIGxldCBjdXJyZW50Tm9kZU9yVG9rZW4gPSBub2RlXG4gIGNvbnN0IHJlc3VsdCA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGN1cnJlbnROb2RlT3JUb2tlbiA9IHNvdXJjZUNvZGUuZ2V0VG9rZW5PckNvbW1lbnRBZnRlcihjdXJyZW50Tm9kZU9yVG9rZW4pXG4gICAgaWYgKGN1cnJlbnROb2RlT3JUb2tlbiA9PSBudWxsKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgICByZXN1bHQucHVzaChjdXJyZW50Tm9kZU9yVG9rZW4pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBnZXRUb2tlbnNPckNvbW1lbnRzQmVmb3JlKHNvdXJjZUNvZGUsIG5vZGUsIGNvdW50KSB7XG4gIGxldCBjdXJyZW50Tm9kZU9yVG9rZW4gPSBub2RlXG4gIGNvbnN0IHJlc3VsdCA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGN1cnJlbnROb2RlT3JUb2tlbiA9IHNvdXJjZUNvZGUuZ2V0VG9rZW5PckNvbW1lbnRCZWZvcmUoY3VycmVudE5vZGVPclRva2VuKVxuICAgIGlmIChjdXJyZW50Tm9kZU9yVG9rZW4gPT0gbnVsbCkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgcmVzdWx0LnB1c2goY3VycmVudE5vZGVPclRva2VuKVxuICB9XG4gIHJldHVybiByZXN1bHQucmV2ZXJzZSgpXG59XG5cbmZ1bmN0aW9uIHRha2VUb2tlbnNBZnRlcldoaWxlKHNvdXJjZUNvZGUsIG5vZGUsIGNvbmRpdGlvbikge1xuICBjb25zdCB0b2tlbnMgPSBnZXRUb2tlbnNPckNvbW1lbnRzQWZ0ZXIoc291cmNlQ29kZSwgbm9kZSwgMTAwKVxuICBjb25zdCByZXN1bHQgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjb25kaXRpb24odG9rZW5zW2ldKSkge1xuICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gdGFrZVRva2Vuc0JlZm9yZVdoaWxlKHNvdXJjZUNvZGUsIG5vZGUsIGNvbmRpdGlvbikge1xuICBjb25zdCB0b2tlbnMgPSBnZXRUb2tlbnNPckNvbW1lbnRzQmVmb3JlKHNvdXJjZUNvZGUsIG5vZGUsIDEwMClcbiAgY29uc3QgcmVzdWx0ID0gW11cbiAgZm9yIChsZXQgaSA9IHRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChjb25kaXRpb24odG9rZW5zW2ldKSkge1xuICAgICAgcmVzdWx0LnB1c2godG9rZW5zW2ldKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQucmV2ZXJzZSgpXG59XG5cbmZ1bmN0aW9uIGZpbmRPdXRPZk9yZGVyKGltcG9ydGVkKSB7XG4gIGlmIChpbXBvcnRlZC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICBsZXQgbWF4U2VlblJhbmtOb2RlID0gaW1wb3J0ZWRbMF1cbiAgcmV0dXJuIGltcG9ydGVkLmZpbHRlcihmdW5jdGlvbiAoaW1wb3J0ZWRNb2R1bGUpIHtcbiAgICBjb25zdCByZXMgPSBpbXBvcnRlZE1vZHVsZS5yYW5rIDwgbWF4U2VlblJhbmtOb2RlLnJhbmtcbiAgICBpZiAobWF4U2VlblJhbmtOb2RlLnJhbmsgPCBpbXBvcnRlZE1vZHVsZS5yYW5rKSB7XG4gICAgICBtYXhTZWVuUmFua05vZGUgPSBpbXBvcnRlZE1vZHVsZVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGZpbmRSb290Tm9kZShub2RlKSB7XG4gIGxldCBwYXJlbnQgPSBub2RlXG4gIHdoaWxlIChwYXJlbnQucGFyZW50ICE9IG51bGwgJiYgcGFyZW50LnBhcmVudC5ib2R5ID09IG51bGwpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50XG4gIH1cbiAgcmV0dXJuIHBhcmVudFxufVxuXG5mdW5jdGlvbiBmaW5kRW5kT2ZMaW5lV2l0aENvbW1lbnRzKHNvdXJjZUNvZGUsIG5vZGUpIHtcbiAgY29uc3QgdG9rZW5zVG9FbmRPZkxpbmUgPSB0YWtlVG9rZW5zQWZ0ZXJXaGlsZShzb3VyY2VDb2RlLCBub2RlLCBjb21tZW50T25TYW1lTGluZUFzKG5vZGUpKVxuICBsZXQgZW5kT2ZUb2tlbnMgPSB0b2tlbnNUb0VuZE9mTGluZS5sZW5ndGggPiAwXG4gICAgPyB0b2tlbnNUb0VuZE9mTGluZVt0b2tlbnNUb0VuZE9mTGluZS5sZW5ndGggLSAxXS5yYW5nZVsxXVxuICAgIDogbm9kZS5yYW5nZVsxXVxuICBsZXQgcmVzdWx0ID0gZW5kT2ZUb2tlbnNcbiAgZm9yIChsZXQgaSA9IGVuZE9mVG9rZW5zOyBpIDwgc291cmNlQ29kZS50ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHNvdXJjZUNvZGUudGV4dFtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIHJlc3VsdCA9IGkgKyAxXG4gICAgICBicmVha1xuICAgIH1cbiAgICBpZiAoc291cmNlQ29kZS50ZXh0W2ldICE9PSAnICcgJiYgc291cmNlQ29kZS50ZXh0W2ldICE9PSAnXFx0JyAmJiBzb3VyY2VDb2RlLnRleHRbaV0gIT09ICdcXHInKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgICByZXN1bHQgPSBpICsgMVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gY29tbWVudE9uU2FtZUxpbmVBcyhub2RlKSB7XG4gIHJldHVybiB0b2tlbiA9PiAodG9rZW4udHlwZSA9PT0gJ0Jsb2NrJyB8fCAgdG9rZW4udHlwZSA9PT0gJ0xpbmUnKSAmJlxuICAgICAgdG9rZW4ubG9jLnN0YXJ0LmxpbmUgPT09IHRva2VuLmxvYy5lbmQubGluZSAmJlxuICAgICAgdG9rZW4ubG9jLmVuZC5saW5lID09PSBub2RlLmxvYy5lbmQubGluZVxufVxuXG5mdW5jdGlvbiBmaW5kU3RhcnRPZkxpbmVXaXRoQ29tbWVudHMoc291cmNlQ29kZSwgbm9kZSkge1xuICBjb25zdCB0b2tlbnNUb0VuZE9mTGluZSA9IHRha2VUb2tlbnNCZWZvcmVXaGlsZShzb3VyY2VDb2RlLCBub2RlLCBjb21tZW50T25TYW1lTGluZUFzKG5vZGUpKVxuICBsZXQgc3RhcnRPZlRva2VucyA9IHRva2Vuc1RvRW5kT2ZMaW5lLmxlbmd0aCA+IDAgPyB0b2tlbnNUb0VuZE9mTGluZVswXS5yYW5nZVswXSA6IG5vZGUucmFuZ2VbMF1cbiAgbGV0IHJlc3VsdCA9IHN0YXJ0T2ZUb2tlbnNcbiAgZm9yIChsZXQgaSA9IHN0YXJ0T2ZUb2tlbnMgLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgaWYgKHNvdXJjZUNvZGUudGV4dFtpXSAhPT0gJyAnICYmIHNvdXJjZUNvZGUudGV4dFtpXSAhPT0gJ1xcdCcpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIHJlc3VsdCA9IGlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5SZXF1aXJlTW9kdWxlKG5vZGUpIHtcbiAgaWYgKG5vZGUudHlwZSAhPT0gJ1ZhcmlhYmxlRGVjbGFyYXRpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgaWYgKG5vZGUuZGVjbGFyYXRpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGNvbnN0IGRlY2wgPSBub2RlLmRlY2xhcmF0aW9uc1swXVxuICBjb25zdCByZXN1bHQgPSBkZWNsLmlkICYmXG4gICAgKGRlY2wuaWQudHlwZSA9PT0gJ0lkZW50aWZpZXInIHx8IGRlY2wuaWQudHlwZSA9PT0gJ09iamVjdFBhdHRlcm4nKSAmJlxuICAgIGRlY2wuaW5pdCAhPSBudWxsICYmXG4gICAgZGVjbC5pbml0LnR5cGUgPT09ICdDYWxsRXhwcmVzc2lvbicgJiZcbiAgICBkZWNsLmluaXQuY2FsbGVlICE9IG51bGwgJiZcbiAgICBkZWNsLmluaXQuY2FsbGVlLm5hbWUgPT09ICdyZXF1aXJlJyAmJlxuICAgIGRlY2wuaW5pdC5hcmd1bWVudHMgIT0gbnVsbCAmJlxuICAgIGRlY2wuaW5pdC5hcmd1bWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgZGVjbC5pbml0LmFyZ3VtZW50c1swXS50eXBlID09PSAnTGl0ZXJhbCdcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBpc1BsYWluSW1wb3J0TW9kdWxlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0ltcG9ydERlY2xhcmF0aW9uJyAmJiBub2RlLnNwZWNpZmllcnMgIT0gbnVsbCAmJiBub2RlLnNwZWNpZmllcnMubGVuZ3RoID4gMFxufVxuXG5mdW5jdGlvbiBpc1BsYWluSW1wb3J0RXF1YWxzKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ1RTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24nICYmIG5vZGUubW9kdWxlUmVmZXJlbmNlLmV4cHJlc3Npb25cbn1cblxuZnVuY3Rpb24gY2FuQ3Jvc3NOb2RlV2hpbGVSZW9yZGVyKG5vZGUpIHtcbiAgcmV0dXJuIGlzUGxhaW5SZXF1aXJlTW9kdWxlKG5vZGUpIHx8IGlzUGxhaW5JbXBvcnRNb2R1bGUobm9kZSkgfHwgaXNQbGFpbkltcG9ydEVxdWFscyhub2RlKVxufVxuXG5mdW5jdGlvbiBjYW5SZW9yZGVySXRlbXMoZmlyc3ROb2RlLCBzZWNvbmROb2RlKSB7XG4gIGNvbnN0IHBhcmVudCA9IGZpcnN0Tm9kZS5wYXJlbnRcbiAgY29uc3QgW2ZpcnN0SW5kZXgsIHNlY29uZEluZGV4XSA9IFtcbiAgICBwYXJlbnQuYm9keS5pbmRleE9mKGZpcnN0Tm9kZSksXG4gICAgcGFyZW50LmJvZHkuaW5kZXhPZihzZWNvbmROb2RlKSxcbiAgXS5zb3J0KClcbiAgY29uc3Qgbm9kZXNCZXR3ZWVuID0gcGFyZW50LmJvZHkuc2xpY2UoZmlyc3RJbmRleCwgc2Vjb25kSW5kZXggKyAxKVxuICBmb3IgKHZhciBub2RlQmV0d2VlbiBvZiBub2Rlc0JldHdlZW4pIHtcbiAgICBpZiAoIWNhbkNyb3NzTm9kZVdoaWxlUmVvcmRlcihub2RlQmV0d2VlbikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBmaXhPdXRPZk9yZGVyKGNvbnRleHQsIGZpcnN0Tm9kZSwgc2Vjb25kTm9kZSwgb3JkZXIpIHtcbiAgY29uc3Qgc291cmNlQ29kZSA9IGNvbnRleHQuZ2V0U291cmNlQ29kZSgpXG5cbiAgY29uc3QgZmlyc3RSb290ID0gZmluZFJvb3ROb2RlKGZpcnN0Tm9kZS5ub2RlKVxuICBjb25zdCBmaXJzdFJvb3RTdGFydCA9IGZpbmRTdGFydE9mTGluZVdpdGhDb21tZW50cyhzb3VyY2VDb2RlLCBmaXJzdFJvb3QpXG4gIGNvbnN0IGZpcnN0Um9vdEVuZCA9IGZpbmRFbmRPZkxpbmVXaXRoQ29tbWVudHMoc291cmNlQ29kZSwgZmlyc3RSb290KVxuXG4gIGNvbnN0IHNlY29uZFJvb3QgPSBmaW5kUm9vdE5vZGUoc2Vjb25kTm9kZS5ub2RlKVxuICBjb25zdCBzZWNvbmRSb290U3RhcnQgPSBmaW5kU3RhcnRPZkxpbmVXaXRoQ29tbWVudHMoc291cmNlQ29kZSwgc2Vjb25kUm9vdClcbiAgY29uc3Qgc2Vjb25kUm9vdEVuZCA9IGZpbmRFbmRPZkxpbmVXaXRoQ29tbWVudHMoc291cmNlQ29kZSwgc2Vjb25kUm9vdClcbiAgY29uc3QgY2FuRml4ID0gY2FuUmVvcmRlckl0ZW1zKGZpcnN0Um9vdCwgc2Vjb25kUm9vdClcblxuICBsZXQgbmV3Q29kZSA9IHNvdXJjZUNvZGUudGV4dC5zdWJzdHJpbmcoc2Vjb25kUm9vdFN0YXJ0LCBzZWNvbmRSb290RW5kKVxuICBpZiAobmV3Q29kZVtuZXdDb2RlLmxlbmd0aCAtIDFdICE9PSAnXFxuJykge1xuICAgIG5ld0NvZGUgPSBuZXdDb2RlICsgJ1xcbidcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBgXFxgJHtzZWNvbmROb2RlLmRpc3BsYXlOYW1lfVxcYCBpbXBvcnQgc2hvdWxkIG9jY3VyICR7b3JkZXJ9IGltcG9ydCBvZiBcXGAke2ZpcnN0Tm9kZS5kaXNwbGF5TmFtZX1cXGBgXG5cbiAgaWYgKG9yZGVyID09PSAnYmVmb3JlJykge1xuICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgIG5vZGU6IHNlY29uZE5vZGUubm9kZSxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICBmaXg6IGNhbkZpeCAmJiAoZml4ZXIgPT5cbiAgICAgICAgZml4ZXIucmVwbGFjZVRleHRSYW5nZShcbiAgICAgICAgICBbZmlyc3RSb290U3RhcnQsIHNlY29uZFJvb3RFbmRdLFxuICAgICAgICAgIG5ld0NvZGUgKyBzb3VyY2VDb2RlLnRleHQuc3Vic3RyaW5nKGZpcnN0Um9vdFN0YXJ0LCBzZWNvbmRSb290U3RhcnQpXG4gICAgICAgICkpLFxuICAgIH0pXG4gIH0gZWxzZSBpZiAob3JkZXIgPT09ICdhZnRlcicpIHtcbiAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICBub2RlOiBzZWNvbmROb2RlLm5vZGUsXG4gICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgZml4OiBjYW5GaXggJiYgKGZpeGVyID0+XG4gICAgICAgIGZpeGVyLnJlcGxhY2VUZXh0UmFuZ2UoXG4gICAgICAgICAgW3NlY29uZFJvb3RTdGFydCwgZmlyc3RSb290RW5kXSxcbiAgICAgICAgICBzb3VyY2VDb2RlLnRleHQuc3Vic3RyaW5nKHNlY29uZFJvb3RFbmQsIGZpcnN0Um9vdEVuZCkgKyBuZXdDb2RlXG4gICAgICAgICkpLFxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwb3J0T3V0T2ZPcmRlcihjb250ZXh0LCBpbXBvcnRlZCwgb3V0T2ZPcmRlciwgb3JkZXIpIHtcbiAgb3V0T2ZPcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChpbXApIHtcbiAgICBjb25zdCBmb3VuZCA9IGltcG9ydGVkLmZpbmQoZnVuY3Rpb24gaGFzSGlnaGVyUmFuayhpbXBvcnRlZEl0ZW0pIHtcbiAgICAgIHJldHVybiBpbXBvcnRlZEl0ZW0ucmFuayA+IGltcC5yYW5rXG4gICAgfSlcbiAgICBmaXhPdXRPZk9yZGVyKGNvbnRleHQsIGZvdW5kLCBpbXAsIG9yZGVyKVxuICB9KVxufVxuXG5mdW5jdGlvbiBtYWtlT3V0T2ZPcmRlclJlcG9ydChjb250ZXh0LCBpbXBvcnRlZCkge1xuICBjb25zdCBvdXRPZk9yZGVyID0gZmluZE91dE9mT3JkZXIoaW1wb3J0ZWQpXG4gIGlmICghb3V0T2ZPcmRlci5sZW5ndGgpIHtcbiAgICByZXR1cm5cbiAgfVxuICAvLyBUaGVyZSBhcmUgdGhpbmdzIHRvIHJlcG9ydC4gVHJ5IHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgcmVwb3J0ZWQgZXJyb3JzLlxuICBjb25zdCByZXZlcnNlZEltcG9ydGVkID0gcmV2ZXJzZShpbXBvcnRlZClcbiAgY29uc3QgcmV2ZXJzZWRPcmRlciA9IGZpbmRPdXRPZk9yZGVyKHJldmVyc2VkSW1wb3J0ZWQpXG4gIGlmIChyZXZlcnNlZE9yZGVyLmxlbmd0aCA8IG91dE9mT3JkZXIubGVuZ3RoKSB7XG4gICAgcmVwb3J0T3V0T2ZPcmRlcihjb250ZXh0LCByZXZlcnNlZEltcG9ydGVkLCByZXZlcnNlZE9yZGVyLCAnYWZ0ZXInKVxuICAgIHJldHVyblxuICB9XG4gIHJlcG9ydE91dE9mT3JkZXIoY29udGV4dCwgaW1wb3J0ZWQsIG91dE9mT3JkZXIsICdiZWZvcmUnKVxufVxuXG5mdW5jdGlvbiBnZXRTb3J0ZXIoYXNjZW5kaW5nKSB7XG4gIGNvbnN0IG11bHRpcGxpZXIgPSBhc2NlbmRpbmcgPyAxIDogLTFcblxuICByZXR1cm4gZnVuY3Rpb24gaW1wb3J0c1NvcnRlcihpbXBvcnRBLCBpbXBvcnRCKSB7XG4gICAgbGV0IHJlc3VsdFxuXG4gICAgaWYgKGltcG9ydEEgPCBpbXBvcnRCKSB7XG4gICAgICByZXN1bHQgPSAtMVxuICAgIH0gZWxzZSBpZiAoaW1wb3J0QSA+IGltcG9ydEIpIHtcbiAgICAgIHJlc3VsdCA9IDFcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gMFxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQgKiBtdWx0aXBsaWVyXG4gIH1cbn1cblxuZnVuY3Rpb24gbXV0YXRlUmFua3NUb0FscGhhYmV0aXplKGltcG9ydGVkLCBhbHBoYWJldGl6ZU9wdGlvbnMpIHtcbiAgY29uc3QgZ3JvdXBlZEJ5UmFua3MgPSBpbXBvcnRlZC5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBpbXBvcnRlZEl0ZW0pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWNjW2ltcG9ydGVkSXRlbS5yYW5rXSkpIHtcbiAgICAgIGFjY1tpbXBvcnRlZEl0ZW0ucmFua10gPSBbXVxuICAgIH1cbiAgICBhY2NbaW1wb3J0ZWRJdGVtLnJhbmtdLnB1c2goaW1wb3J0ZWRJdGVtLnZhbHVlKVxuICAgIHJldHVybiBhY2NcbiAgfSwge30pXG5cbiAgY29uc3QgZ3JvdXBSYW5rcyA9IE9iamVjdC5rZXlzKGdyb3VwZWRCeVJhbmtzKVxuXG4gIGNvbnN0IHNvcnRlckZuID0gZ2V0U29ydGVyKGFscGhhYmV0aXplT3B0aW9ucy5vcmRlciA9PT0gJ2FzYycpXG4gIGNvbnN0IGNvbXBhcmF0b3IgPSBhbHBoYWJldGl6ZU9wdGlvbnMuY2FzZUluc2Vuc2l0aXZlID8gKGEsIGIpID0+IHNvcnRlckZuKFN0cmluZyhhKS50b0xvd2VyQ2FzZSgpLCBTdHJpbmcoYikudG9Mb3dlckNhc2UoKSkgOiAoYSwgYikgPT4gc29ydGVyRm4oYSwgYilcbiAgLy8gc29ydCBpbXBvcnRzIGxvY2FsbHkgd2l0aGluIHRoZWlyIGdyb3VwXG4gIGdyb3VwUmFua3MuZm9yRWFjaChmdW5jdGlvbihncm91cFJhbmspIHtcbiAgICBncm91cGVkQnlSYW5rc1tncm91cFJhbmtdLnNvcnQoY29tcGFyYXRvcilcbiAgfSlcblxuICAvLyBhc3NpZ24gZ2xvYmFsbHkgdW5pcXVlIHJhbmsgdG8gZWFjaCBpbXBvcnRcbiAgbGV0IG5ld1JhbmsgPSAwXG4gIGNvbnN0IGFscGhhYmV0aXplZFJhbmtzID0gZ3JvdXBSYW5rcy5zb3J0KCkucmVkdWNlKGZ1bmN0aW9uKGFjYywgZ3JvdXBSYW5rKSB7XG4gICAgZ3JvdXBlZEJ5UmFua3NbZ3JvdXBSYW5rXS5mb3JFYWNoKGZ1bmN0aW9uKGltcG9ydGVkSXRlbU5hbWUpIHtcbiAgICAgIGFjY1tpbXBvcnRlZEl0ZW1OYW1lXSA9IHBhcnNlSW50KGdyb3VwUmFuaywgMTApICsgbmV3UmFua1xuICAgICAgbmV3UmFuayArPSAxXG4gICAgfSlcbiAgICByZXR1cm4gYWNjXG4gIH0sIHt9KVxuXG4gIC8vIG11dGF0ZSB0aGUgb3JpZ2luYWwgZ3JvdXAtcmFuayB3aXRoIGFscGhhYmV0aXplZC1yYW5rXG4gIGltcG9ydGVkLmZvckVhY2goZnVuY3Rpb24oaW1wb3J0ZWRJdGVtKSB7XG4gICAgaW1wb3J0ZWRJdGVtLnJhbmsgPSBhbHBoYWJldGl6ZWRSYW5rc1tpbXBvcnRlZEl0ZW0udmFsdWVdXG4gIH0pXG59XG5cbi8vIERFVEVDVElOR1xuXG5mdW5jdGlvbiBjb21wdXRlUGF0aFJhbmsocmFua3MsIHBhdGhHcm91cHMsIHBhdGgsIG1heFBvc2l0aW9uKSB7XG4gIGZvciAobGV0IGkgPSAwLCBsID0gcGF0aEdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCB7IHBhdHRlcm4sIHBhdHRlcm5PcHRpb25zLCBncm91cCwgcG9zaXRpb24gPSAxIH0gPSBwYXRoR3JvdXBzW2ldXG4gICAgaWYgKG1pbmltYXRjaChwYXRoLCBwYXR0ZXJuLCBwYXR0ZXJuT3B0aW9ucyB8fCB7IG5vY29tbWVudDogdHJ1ZSB9KSkge1xuICAgICAgcmV0dXJuIHJhbmtzW2dyb3VwXSArIChwb3NpdGlvbiAvIG1heFBvc2l0aW9uKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlUmFuayhjb250ZXh0LCByYW5rcywgaW1wb3J0RW50cnksIGV4Y2x1ZGVkSW1wb3J0VHlwZXMpIHtcbiAgbGV0IGltcFR5cGVcbiAgbGV0IHJhbmtcbiAgaWYgKGltcG9ydEVudHJ5LnR5cGUgPT09ICdpbXBvcnQ6b2JqZWN0Jykge1xuICAgIGltcFR5cGUgPSAnb2JqZWN0J1xuICB9IGVsc2Uge1xuICAgIGltcFR5cGUgPSBpbXBvcnRUeXBlKGltcG9ydEVudHJ5LnZhbHVlLCBjb250ZXh0KVxuICB9XG4gIGlmICghZXhjbHVkZWRJbXBvcnRUeXBlcy5oYXMoaW1wVHlwZSkpIHtcbiAgICByYW5rID0gY29tcHV0ZVBhdGhSYW5rKHJhbmtzLmdyb3VwcywgcmFua3MucGF0aEdyb3VwcywgaW1wb3J0RW50cnkudmFsdWUsIHJhbmtzLm1heFBvc2l0aW9uKVxuICB9XG4gIGlmICh0eXBlb2YgcmFuayA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByYW5rID0gcmFua3MuZ3JvdXBzW2ltcFR5cGVdXG4gIH1cbiAgaWYgKGltcG9ydEVudHJ5LnR5cGUgIT09ICdpbXBvcnQnICYmICFpbXBvcnRFbnRyeS50eXBlLnN0YXJ0c1dpdGgoJ2ltcG9ydDonKSkge1xuICAgIHJhbmsgKz0gMTAwXG4gIH1cblxuICByZXR1cm4gcmFua1xufVxuXG5mdW5jdGlvbiByZWdpc3Rlck5vZGUoY29udGV4dCwgaW1wb3J0RW50cnksIHJhbmtzLCBpbXBvcnRlZCwgZXhjbHVkZWRJbXBvcnRUeXBlcykge1xuICBjb25zdCByYW5rID0gY29tcHV0ZVJhbmsoY29udGV4dCwgcmFua3MsIGltcG9ydEVudHJ5LCBleGNsdWRlZEltcG9ydFR5cGVzKVxuICBpZiAocmFuayAhPT0gLTEpIHtcbiAgICBpbXBvcnRlZC5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGltcG9ydEVudHJ5LCB7IHJhbmsgfSkpXG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJblZhcmlhYmxlRGVjbGFyYXRvcihub2RlKSB7XG4gIHJldHVybiBub2RlICYmXG4gICAgKG5vZGUudHlwZSA9PT0gJ1ZhcmlhYmxlRGVjbGFyYXRvcicgfHwgaXNJblZhcmlhYmxlRGVjbGFyYXRvcihub2RlLnBhcmVudCkpXG59XG5cbmNvbnN0IHR5cGVzID0gWydidWlsdGluJywgJ2V4dGVybmFsJywgJ2ludGVybmFsJywgJ3Vua25vd24nLCAncGFyZW50JywgJ3NpYmxpbmcnLCAnaW5kZXgnLCAnb2JqZWN0J11cblxuLy8gQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0eXBlLXJhbmsgcGFpcnMuXG4vLyBFeGFtcGxlOiB7IGluZGV4OiAwLCBzaWJsaW5nOiAxLCBwYXJlbnQ6IDEsIGV4dGVybmFsOiAxLCBidWlsdGluOiAyLCBpbnRlcm5hbDogMiB9XG4vLyBXaWxsIHRocm93IGFuIGVycm9yIGlmIGl0IGNvbnRhaW5zIGEgdHlwZSB0aGF0IGRvZXMgbm90IGV4aXN0LCBvciBoYXMgYSBkdXBsaWNhdGVcbmZ1bmN0aW9uIGNvbnZlcnRHcm91cHNUb1JhbmtzKGdyb3Vwcykge1xuICBjb25zdCByYW5rT2JqZWN0ID0gZ3JvdXBzLnJlZHVjZShmdW5jdGlvbihyZXMsIGdyb3VwLCBpbmRleCkge1xuICAgIGlmICh0eXBlb2YgZ3JvdXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICBncm91cCA9IFtncm91cF1cbiAgICB9XG4gICAgZ3JvdXAuZm9yRWFjaChmdW5jdGlvbihncm91cEl0ZW0pIHtcbiAgICAgIGlmICh0eXBlcy5pbmRleE9mKGdyb3VwSXRlbSkgPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJ1bGU6IFVua25vd24gdHlwZSBgJyArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZ3JvdXBJdGVtKSArICdgJylcbiAgICAgIH1cbiAgICAgIGlmIChyZXNbZ3JvdXBJdGVtXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJ1bGU6IGAnICsgZ3JvdXBJdGVtICsgJ2AgaXMgZHVwbGljYXRlZCcpXG4gICAgICB9XG4gICAgICByZXNbZ3JvdXBJdGVtXSA9IGluZGV4XG4gICAgfSlcbiAgICByZXR1cm4gcmVzXG4gIH0sIHt9KVxuXG4gIGNvbnN0IG9taXR0ZWRUeXBlcyA9IHR5cGVzLmZpbHRlcihmdW5jdGlvbih0eXBlKSB7XG4gICAgcmV0dXJuIHJhbmtPYmplY3RbdHlwZV0gPT09IHVuZGVmaW5lZFxuICB9KVxuXG4gIHJldHVybiBvbWl0dGVkVHlwZXMucmVkdWNlKGZ1bmN0aW9uKHJlcywgdHlwZSkge1xuICAgIHJlc1t0eXBlXSA9IGdyb3Vwcy5sZW5ndGhcbiAgICByZXR1cm4gcmVzXG4gIH0sIHJhbmtPYmplY3QpXG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRQYXRoR3JvdXBzRm9yUmFua3MocGF0aEdyb3Vwcykge1xuICBjb25zdCBhZnRlciA9IHt9XG4gIGNvbnN0IGJlZm9yZSA9IHt9XG5cbiAgY29uc3QgdHJhbnNmb3JtZWQgPSBwYXRoR3JvdXBzLm1hcCgocGF0aEdyb3VwLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHsgZ3JvdXAsIHBvc2l0aW9uOiBwb3NpdGlvblN0cmluZyB9ID0gcGF0aEdyb3VwXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIGlmIChwb3NpdGlvblN0cmluZyA9PT0gJ2FmdGVyJykge1xuICAgICAgaWYgKCFhZnRlcltncm91cF0pIHtcbiAgICAgICAgYWZ0ZXJbZ3JvdXBdID0gMVxuICAgICAgfVxuICAgICAgcG9zaXRpb24gPSBhZnRlcltncm91cF0rK1xuICAgIH0gZWxzZSBpZiAocG9zaXRpb25TdHJpbmcgPT09ICdiZWZvcmUnKSB7XG4gICAgICBpZiAoIWJlZm9yZVtncm91cF0pIHtcbiAgICAgICAgYmVmb3JlW2dyb3VwXSA9IFtdXG4gICAgICB9XG4gICAgICBiZWZvcmVbZ3JvdXBdLnB1c2goaW5kZXgpXG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHBhdGhHcm91cCwgeyBwb3NpdGlvbiB9KVxuICB9KVxuXG4gIGxldCBtYXhQb3NpdGlvbiA9IDFcblxuICBPYmplY3Qua2V5cyhiZWZvcmUpLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBMZW5ndGggPSBiZWZvcmVbZ3JvdXBdLmxlbmd0aFxuICAgIGJlZm9yZVtncm91cF0uZm9yRWFjaCgoZ3JvdXBJbmRleCwgaW5kZXgpID0+IHtcbiAgICAgIHRyYW5zZm9ybWVkW2dyb3VwSW5kZXhdLnBvc2l0aW9uID0gLTEgKiAoZ3JvdXBMZW5ndGggLSBpbmRleClcbiAgICB9KVxuICAgIG1heFBvc2l0aW9uID0gTWF0aC5tYXgobWF4UG9zaXRpb24sIGdyb3VwTGVuZ3RoKVxuICB9KVxuXG4gIE9iamVjdC5rZXlzKGFmdGVyKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCBncm91cE5leHRQb3NpdGlvbiA9IGFmdGVyW2tleV1cbiAgICBtYXhQb3NpdGlvbiA9IE1hdGgubWF4KG1heFBvc2l0aW9uLCBncm91cE5leHRQb3NpdGlvbiAtIDEpXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoR3JvdXBzOiB0cmFuc2Zvcm1lZCxcbiAgICBtYXhQb3NpdGlvbjogbWF4UG9zaXRpb24gPiAxMCA/IE1hdGgucG93KDEwLCBNYXRoLmNlaWwoTWF0aC5sb2cxMChtYXhQb3NpdGlvbikpKSA6IDEwLFxuICB9XG59XG5cbmZ1bmN0aW9uIGZpeE5ld0xpbmVBZnRlckltcG9ydChjb250ZXh0LCBwcmV2aW91c0ltcG9ydCkge1xuICBjb25zdCBwcmV2Um9vdCA9IGZpbmRSb290Tm9kZShwcmV2aW91c0ltcG9ydC5ub2RlKVxuICBjb25zdCB0b2tlbnNUb0VuZE9mTGluZSA9IHRha2VUb2tlbnNBZnRlcldoaWxlKFxuICAgIGNvbnRleHQuZ2V0U291cmNlQ29kZSgpLCBwcmV2Um9vdCwgY29tbWVudE9uU2FtZUxpbmVBcyhwcmV2Um9vdCkpXG5cbiAgbGV0IGVuZE9mTGluZSA9IHByZXZSb290LnJhbmdlWzFdXG4gIGlmICh0b2tlbnNUb0VuZE9mTGluZS5sZW5ndGggPiAwKSB7XG4gICAgZW5kT2ZMaW5lID0gdG9rZW5zVG9FbmRPZkxpbmVbdG9rZW5zVG9FbmRPZkxpbmUubGVuZ3RoIC0gMV0ucmFuZ2VbMV1cbiAgfVxuICByZXR1cm4gKGZpeGVyKSA9PiBmaXhlci5pbnNlcnRUZXh0QWZ0ZXJSYW5nZShbcHJldlJvb3QucmFuZ2VbMF0sIGVuZE9mTGluZV0sICdcXG4nKVxufVxuXG5mdW5jdGlvbiByZW1vdmVOZXdMaW5lQWZ0ZXJJbXBvcnQoY29udGV4dCwgY3VycmVudEltcG9ydCwgcHJldmlvdXNJbXBvcnQpIHtcbiAgY29uc3Qgc291cmNlQ29kZSA9IGNvbnRleHQuZ2V0U291cmNlQ29kZSgpXG4gIGNvbnN0IHByZXZSb290ID0gZmluZFJvb3ROb2RlKHByZXZpb3VzSW1wb3J0Lm5vZGUpXG4gIGNvbnN0IGN1cnJSb290ID0gZmluZFJvb3ROb2RlKGN1cnJlbnRJbXBvcnQubm9kZSlcbiAgY29uc3QgcmFuZ2VUb1JlbW92ZSA9IFtcbiAgICBmaW5kRW5kT2ZMaW5lV2l0aENvbW1lbnRzKHNvdXJjZUNvZGUsIHByZXZSb290KSxcbiAgICBmaW5kU3RhcnRPZkxpbmVXaXRoQ29tbWVudHMoc291cmNlQ29kZSwgY3VyclJvb3QpLFxuICBdXG4gIGlmICgvXlxccyokLy50ZXN0KHNvdXJjZUNvZGUudGV4dC5zdWJzdHJpbmcocmFuZ2VUb1JlbW92ZVswXSwgcmFuZ2VUb1JlbW92ZVsxXSkpKSB7XG4gICAgcmV0dXJuIChmaXhlcikgPT4gZml4ZXIucmVtb3ZlUmFuZ2UocmFuZ2VUb1JlbW92ZSlcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIG1ha2VOZXdsaW5lc0JldHdlZW5SZXBvcnQgKGNvbnRleHQsIGltcG9ydGVkLCBuZXdsaW5lc0JldHdlZW5JbXBvcnRzKSB7XG4gIGNvbnN0IGdldE51bWJlck9mRW1wdHlMaW5lc0JldHdlZW4gPSAoY3VycmVudEltcG9ydCwgcHJldmlvdXNJbXBvcnQpID0+IHtcbiAgICBjb25zdCBsaW5lc0JldHdlZW5JbXBvcnRzID0gY29udGV4dC5nZXRTb3VyY2VDb2RlKCkubGluZXMuc2xpY2UoXG4gICAgICBwcmV2aW91c0ltcG9ydC5ub2RlLmxvYy5lbmQubGluZSxcbiAgICAgIGN1cnJlbnRJbXBvcnQubm9kZS5sb2Muc3RhcnQubGluZSAtIDFcbiAgICApXG5cbiAgICByZXR1cm4gbGluZXNCZXR3ZWVuSW1wb3J0cy5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnRyaW0oKS5sZW5ndGgpLmxlbmd0aFxuICB9XG4gIGxldCBwcmV2aW91c0ltcG9ydCA9IGltcG9ydGVkWzBdXG5cbiAgaW1wb3J0ZWQuc2xpY2UoMSkuZm9yRWFjaChmdW5jdGlvbihjdXJyZW50SW1wb3J0KSB7XG4gICAgY29uc3QgZW1wdHlMaW5lc0JldHdlZW4gPSBnZXROdW1iZXJPZkVtcHR5TGluZXNCZXR3ZWVuKGN1cnJlbnRJbXBvcnQsIHByZXZpb3VzSW1wb3J0KVxuXG4gICAgaWYgKG5ld2xpbmVzQmV0d2VlbkltcG9ydHMgPT09ICdhbHdheXMnXG4gICAgICAgIHx8IG5ld2xpbmVzQmV0d2VlbkltcG9ydHMgPT09ICdhbHdheXMtYW5kLWluc2lkZS1ncm91cHMnKSB7XG4gICAgICBpZiAoY3VycmVudEltcG9ydC5yYW5rICE9PSBwcmV2aW91c0ltcG9ydC5yYW5rICYmIGVtcHR5TGluZXNCZXR3ZWVuID09PSAwKSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICBub2RlOiBwcmV2aW91c0ltcG9ydC5ub2RlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdUaGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIGVtcHR5IGxpbmUgYmV0d2VlbiBpbXBvcnQgZ3JvdXBzJyxcbiAgICAgICAgICBmaXg6IGZpeE5ld0xpbmVBZnRlckltcG9ydChjb250ZXh0LCBwcmV2aW91c0ltcG9ydCksXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbXBvcnQucmFuayA9PT0gcHJldmlvdXNJbXBvcnQucmFua1xuICAgICAgICAmJiBlbXB0eUxpbmVzQmV0d2VlbiA+IDBcbiAgICAgICAgJiYgbmV3bGluZXNCZXR3ZWVuSW1wb3J0cyAhPT0gJ2Fsd2F5cy1hbmQtaW5zaWRlLWdyb3VwcycpIHtcbiAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgIG5vZGU6IHByZXZpb3VzSW1wb3J0Lm5vZGUsXG4gICAgICAgICAgbWVzc2FnZTogJ1RoZXJlIHNob3VsZCBiZSBubyBlbXB0eSBsaW5lIHdpdGhpbiBpbXBvcnQgZ3JvdXAnLFxuICAgICAgICAgIGZpeDogcmVtb3ZlTmV3TGluZUFmdGVySW1wb3J0KGNvbnRleHQsIGN1cnJlbnRJbXBvcnQsIHByZXZpb3VzSW1wb3J0KSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVtcHR5TGluZXNCZXR3ZWVuID4gMCkge1xuICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICBub2RlOiBwcmV2aW91c0ltcG9ydC5ub2RlLFxuICAgICAgICBtZXNzYWdlOiAnVGhlcmUgc2hvdWxkIGJlIG5vIGVtcHR5IGxpbmUgYmV0d2VlbiBpbXBvcnQgZ3JvdXBzJyxcbiAgICAgICAgZml4OiByZW1vdmVOZXdMaW5lQWZ0ZXJJbXBvcnQoY29udGV4dCwgY3VycmVudEltcG9ydCwgcHJldmlvdXNJbXBvcnQpLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBwcmV2aW91c0ltcG9ydCA9IGN1cnJlbnRJbXBvcnRcbiAgfSlcbn1cblxuZnVuY3Rpb24gZ2V0QWxwaGFiZXRpemVDb25maWcob3B0aW9ucykge1xuICBjb25zdCBhbHBoYWJldGl6ZSA9IG9wdGlvbnMuYWxwaGFiZXRpemUgfHwge31cbiAgY29uc3Qgb3JkZXIgPSBhbHBoYWJldGl6ZS5vcmRlciB8fCAnaWdub3JlJ1xuICBjb25zdCBjYXNlSW5zZW5zaXRpdmUgPSBhbHBoYWJldGl6ZS5jYXNlSW5zZW5zaXRpdmUgfHwgZmFsc2VcblxuICByZXR1cm4ge29yZGVyLCBjYXNlSW5zZW5zaXRpdmV9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgnb3JkZXInKSxcbiAgICB9LFxuXG4gICAgZml4YWJsZTogJ2NvZGUnLFxuICAgIHNjaGVtYTogW1xuICAgICAge1xuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGdyb3Vwczoge1xuICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhdGhHcm91cHNFeGNsdWRlZEltcG9ydFR5cGVzOiB7XG4gICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGF0aEdyb3Vwczoge1xuICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgcGF0dGVybjoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBncm91cDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICBlbnVtOiB0eXBlcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgIGVudW06IFsnYWZ0ZXInLCAnYmVmb3JlJ10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IFsncGF0dGVybicsICdncm91cCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICduZXdsaW5lcy1iZXR3ZWVuJzoge1xuICAgICAgICAgICAgZW51bTogW1xuICAgICAgICAgICAgICAnaWdub3JlJyxcbiAgICAgICAgICAgICAgJ2Fsd2F5cycsXG4gICAgICAgICAgICAgICdhbHdheXMtYW5kLWluc2lkZS1ncm91cHMnLFxuICAgICAgICAgICAgICAnbmV2ZXInLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFscGhhYmV0aXplOiB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgY2FzZUluc2Vuc2l0aXZlOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvcmRlcjoge1xuICAgICAgICAgICAgICAgIGVudW06IFsnaWdub3JlJywgJ2FzYycsICdkZXNjJ10sXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJ2lnbm9yZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uIGltcG9ydE9yZGVyUnVsZSAoY29udGV4dCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnNbMF0gfHwge31cbiAgICBjb25zdCBuZXdsaW5lc0JldHdlZW5JbXBvcnRzID0gb3B0aW9uc1snbmV3bGluZXMtYmV0d2VlbiddIHx8ICdpZ25vcmUnXG4gICAgY29uc3QgcGF0aEdyb3Vwc0V4Y2x1ZGVkSW1wb3J0VHlwZXMgPSBuZXcgU2V0KG9wdGlvbnNbJ3BhdGhHcm91cHNFeGNsdWRlZEltcG9ydFR5cGVzJ10gfHwgWydidWlsdGluJywgJ2V4dGVybmFsJywgJ29iamVjdCddKVxuICAgIGNvbnN0IGFscGhhYmV0aXplID0gZ2V0QWxwaGFiZXRpemVDb25maWcob3B0aW9ucylcbiAgICBsZXQgcmFua3NcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHBhdGhHcm91cHMsIG1heFBvc2l0aW9uIH0gPSBjb252ZXJ0UGF0aEdyb3Vwc0ZvclJhbmtzKG9wdGlvbnMucGF0aEdyb3VwcyB8fCBbXSlcbiAgICAgIHJhbmtzID0ge1xuICAgICAgICBncm91cHM6IGNvbnZlcnRHcm91cHNUb1JhbmtzKG9wdGlvbnMuZ3JvdXBzIHx8IGRlZmF1bHRHcm91cHMpLFxuICAgICAgICBwYXRoR3JvdXBzLFxuICAgICAgICBtYXhQb3NpdGlvbixcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTWFsZm9ybWVkIGNvbmZpZ3VyYXRpb25cbiAgICAgIHJldHVybiB7XG4gICAgICAgIFByb2dyYW06IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydChub2RlLCBlcnJvci5tZXNzYWdlKVxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgaW1wb3J0ZWQgPSBbXVxuICAgIGxldCBsZXZlbCA9IDBcblxuICAgIGZ1bmN0aW9uIGluY3JlbWVudExldmVsKCkge1xuICAgICAgbGV2ZWwrK1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWNyZW1lbnRMZXZlbCgpIHtcbiAgICAgIGxldmVsLS1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgSW1wb3J0RGVjbGFyYXRpb246IGZ1bmN0aW9uIGhhbmRsZUltcG9ydHMobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5zcGVjaWZpZXJzLmxlbmd0aCkgeyAvLyBJZ25vcmluZyB1bmFzc2lnbmVkIGltcG9ydHNcbiAgICAgICAgICBjb25zdCBuYW1lID0gbm9kZS5zb3VyY2UudmFsdWVcbiAgICAgICAgICByZWdpc3Rlck5vZGUoXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB2YWx1ZTogbmFtZSxcbiAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIHR5cGU6ICdpbXBvcnQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJhbmtzLFxuICAgICAgICAgICAgaW1wb3J0ZWQsXG4gICAgICAgICAgICBwYXRoR3JvdXBzRXhjbHVkZWRJbXBvcnRUeXBlc1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb246IGZ1bmN0aW9uIGhhbmRsZUltcG9ydHMobm9kZSkge1xuICAgICAgICBsZXQgZGlzcGxheU5hbWVcbiAgICAgICAgbGV0IHZhbHVlXG4gICAgICAgIGxldCB0eXBlXG4gICAgICAgIC8vIHNraXAgXCJleHBvcnQgaW1wb3J0XCJzXG4gICAgICAgIGlmIChub2RlLmlzRXhwb3J0KSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubW9kdWxlUmVmZXJlbmNlLnR5cGUgPT09ICdUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlJykge1xuICAgICAgICAgIHZhbHVlID0gbm9kZS5tb2R1bGVSZWZlcmVuY2UuZXhwcmVzc2lvbi52YWx1ZVxuICAgICAgICAgIGRpc3BsYXlOYW1lID0gdmFsdWVcbiAgICAgICAgICB0eXBlID0gJ2ltcG9ydCdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9ICcnXG4gICAgICAgICAgZGlzcGxheU5hbWUgPSBjb250ZXh0LmdldFNvdXJjZUNvZGUoKS5nZXRUZXh0KG5vZGUubW9kdWxlUmVmZXJlbmNlKVxuICAgICAgICAgIHR5cGUgPSAnaW1wb3J0Om9iamVjdCdcbiAgICAgICAgfVxuICAgICAgICByZWdpc3Rlck5vZGUoXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByYW5rcyxcbiAgICAgICAgICBpbXBvcnRlZCxcbiAgICAgICAgICBwYXRoR3JvdXBzRXhjbHVkZWRJbXBvcnRUeXBlc1xuICAgICAgICApXG4gICAgICB9LFxuICAgICAgQ2FsbEV4cHJlc3Npb246IGZ1bmN0aW9uIGhhbmRsZVJlcXVpcmVzKG5vZGUpIHtcbiAgICAgICAgaWYgKGxldmVsICE9PSAwIHx8ICFpc1N0YXRpY1JlcXVpcmUobm9kZSkgfHwgIWlzSW5WYXJpYWJsZURlY2xhcmF0b3Iobm9kZS5wYXJlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZSA9IG5vZGUuYXJndW1lbnRzWzBdLnZhbHVlXG4gICAgICAgIHJlZ2lzdGVyTm9kZShcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICB2YWx1ZTogbmFtZSxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBuYW1lLFxuICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmUnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmFua3MsXG4gICAgICAgICAgaW1wb3J0ZWQsXG4gICAgICAgICAgcGF0aEdyb3Vwc0V4Y2x1ZGVkSW1wb3J0VHlwZXNcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgICdQcm9ncmFtOmV4aXQnOiBmdW5jdGlvbiByZXBvcnRBbmRSZXNldCgpIHtcbiAgICAgICAgaWYgKG5ld2xpbmVzQmV0d2VlbkltcG9ydHMgIT09ICdpZ25vcmUnKSB7XG4gICAgICAgICAgbWFrZU5ld2xpbmVzQmV0d2VlblJlcG9ydChjb250ZXh0LCBpbXBvcnRlZCwgbmV3bGluZXNCZXR3ZWVuSW1wb3J0cylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhbHBoYWJldGl6ZS5vcmRlciAhPT0gJ2lnbm9yZScpIHtcbiAgICAgICAgICBtdXRhdGVSYW5rc1RvQWxwaGFiZXRpemUoaW1wb3J0ZWQsIGFscGhhYmV0aXplKVxuICAgICAgICB9XG5cbiAgICAgICAgbWFrZU91dE9mT3JkZXJSZXBvcnQoY29udGV4dCwgaW1wb3J0ZWQpXG5cbiAgICAgICAgaW1wb3J0ZWQgPSBbXVxuICAgICAgfSxcbiAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb246IGluY3JlbWVudExldmVsLFxuICAgICAgRnVuY3Rpb25FeHByZXNzaW9uOiBpbmNyZW1lbnRMZXZlbCxcbiAgICAgIEFycm93RnVuY3Rpb25FeHByZXNzaW9uOiBpbmNyZW1lbnRMZXZlbCxcbiAgICAgIEJsb2NrU3RhdGVtZW50OiBpbmNyZW1lbnRMZXZlbCxcbiAgICAgIE9iamVjdEV4cHJlc3Npb246IGluY3JlbWVudExldmVsLFxuICAgICAgJ0Z1bmN0aW9uRGVjbGFyYXRpb246ZXhpdCc6IGRlY3JlbWVudExldmVsLFxuICAgICAgJ0Z1bmN0aW9uRXhwcmVzc2lvbjpleGl0JzogZGVjcmVtZW50TGV2ZWwsXG4gICAgICAnQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246ZXhpdCc6IGRlY3JlbWVudExldmVsLFxuICAgICAgJ0Jsb2NrU3RhdGVtZW50OmV4aXQnOiBkZWNyZW1lbnRMZXZlbCxcbiAgICAgICdPYmplY3RFeHByZXNzaW9uOmV4aXQnOiBkZWNyZW1lbnRMZXZlbCxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/prefer-default-export.js b/node_modules/eslint-plugin-import/lib/rules/prefer-default-export.js
index 7d42ea1..da0c31e 100644
--- a/node_modules/eslint-plugin-import/lib/rules/prefer-default-export.js
+++ b/node_modules/eslint-plugin-import/lib/rules/prefer-default-export.js
@@ -1,19 +1,15 @@
 'use strict';
 
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
 
 module.exports = {
   meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('prefer-default-export')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('prefer-default-export') },
+
+    schema: [] },
+
 
   create: function (context) {
     let specifierExportCount = 0;
@@ -25,11 +21,13 @@
     function captureDeclaration(identifierOrPattern) {
       if (identifierOrPattern.type === 'ObjectPattern') {
         // recursively capture
-        identifierOrPattern.properties.forEach(function (property) {
+        identifierOrPattern.properties.
+        forEach(function (property) {
           captureDeclaration(property.value);
         });
       } else if (identifierOrPattern.type === 'ArrayPattern') {
-        identifierOrPattern.elements.forEach(captureDeclaration);
+        identifierOrPattern.elements.
+        forEach(captureDeclaration);
       } else {
         // assume it's a single standard identifier
         specifierExportCount++;
@@ -52,12 +50,16 @@
 
       'ExportNamedDeclaration': function (node) {
         // if there are specifiers, node.declaration should be null
-        if (!node.declaration) return;
+        if (!node.declaration) return;const
 
-        const type = node.declaration.type;
+        type = node.declaration.type;
 
-
-        if (type === 'TSTypeAliasDeclaration' || type === 'TypeAlias' || type === 'TSInterfaceDeclaration' || type === 'InterfaceDeclaration') {
+        if (
+        type === 'TSTypeAliasDeclaration' ||
+        type === 'TypeAlias' ||
+        type === 'TSInterfaceDeclaration' ||
+        type === 'InterfaceDeclaration')
+        {
           specifierExportCount++;
           hasTypeExport = true;
           return;
@@ -67,7 +69,8 @@
           node.declaration.declarations.forEach(function (declaration) {
             captureDeclaration(declaration.id);
           });
-        } else {
+        } else
+        {
           // captures 'export function foo() {}' syntax
           specifierExportCount++;
         }
@@ -87,8 +90,7 @@
         if (specifierExportCount === 1 && !hasDefaultExport && !hasStarExport && !hasTypeExport) {
           context.report(namedExportNode, 'Prefer default export.');
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9wcmVmZXItZGVmYXVsdC1leHBvcnQuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJzcGVjaWZpZXJFeHBvcnRDb3VudCIsImhhc0RlZmF1bHRFeHBvcnQiLCJoYXNTdGFyRXhwb3J0IiwiaGFzVHlwZUV4cG9ydCIsIm5hbWVkRXhwb3J0Tm9kZSIsImNhcHR1cmVEZWNsYXJhdGlvbiIsImlkZW50aWZpZXJPclBhdHRlcm4iLCJwcm9wZXJ0aWVzIiwiZm9yRWFjaCIsInByb3BlcnR5IiwidmFsdWUiLCJlbGVtZW50cyIsIm5vZGUiLCJleHBvcnRlZCIsIm5hbWUiLCJkZWNsYXJhdGlvbiIsImRlY2xhcmF0aW9ucyIsImlkIiwicmVwb3J0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTs7Ozs7O0FBRUFBLE9BQU9DLE9BQVAsR0FBaUI7QUFDZkMsUUFBTTtBQUNKQyxVQUFNLFlBREY7QUFFSkMsVUFBTTtBQUNKQyxXQUFLLHVCQUFRLHVCQUFSO0FBREQsS0FGRjtBQUtKQyxZQUFRO0FBTEosR0FEUzs7QUFTZkMsVUFBUSxVQUFTQyxPQUFULEVBQWtCO0FBQ3hCLFFBQUlDLHVCQUF1QixDQUEzQjtBQUNBLFFBQUlDLG1CQUFtQixLQUF2QjtBQUNBLFFBQUlDLGdCQUFnQixLQUFwQjtBQUNBLFFBQUlDLGdCQUFnQixLQUFwQjtBQUNBLFFBQUlDLGtCQUFrQixJQUF0Qjs7QUFFQSxhQUFTQyxrQkFBVCxDQUE0QkMsbUJBQTVCLEVBQWlEO0FBQy9DLFVBQUlBLG9CQUFvQlosSUFBcEIsS0FBNkIsZUFBakMsRUFBa0Q7QUFDaEQ7QUFDQVksNEJBQW9CQyxVQUFwQixDQUNHQyxPQURILENBQ1csVUFBU0MsUUFBVCxFQUFtQjtBQUMxQkosNkJBQW1CSSxTQUFTQyxLQUE1QjtBQUNELFNBSEg7QUFJRCxPQU5ELE1BTU8sSUFBSUosb0JBQW9CWixJQUFwQixLQUE2QixjQUFqQyxFQUFpRDtBQUN0RFksNEJBQW9CSyxRQUFwQixDQUNHSCxPQURILENBQ1dILGtCQURYO0FBRUQsT0FITSxNQUdDO0FBQ1I7QUFDRUw7QUFDRDtBQUNGOztBQUVELFdBQU87QUFDTCxnQ0FBMEIsWUFBVztBQUNuQ0MsMkJBQW1CLElBQW5CO0FBQ0QsT0FISTs7QUFLTCx5QkFBbUIsVUFBU1csSUFBVCxFQUFlO0FBQ2hDLFlBQUlBLEtBQUtDLFFBQUwsQ0FBY0MsSUFBZCxLQUF1QixTQUEzQixFQUFzQztBQUNwQ2IsNkJBQW1CLElBQW5CO0FBQ0QsU0FGRCxNQUVPO0FBQ0xEO0FBQ0FJLDRCQUFrQlEsSUFBbEI7QUFDRDtBQUNGLE9BWkk7O0FBY0wsZ0NBQTBCLFVBQVNBLElBQVQsRUFBZTtBQUN2QztBQUNBLFlBQUksQ0FBQ0EsS0FBS0csV0FBVixFQUF1Qjs7QUFGZ0IsY0FJL0JyQixJQUorQixHQUl0QmtCLEtBQUtHLFdBSmlCLENBSS9CckIsSUFKK0I7OztBQU12QyxZQUNFQSxTQUFTLHdCQUFULElBQ0FBLFNBQVMsV0FEVCxJQUVBQSxTQUFTLHdCQUZULElBR0FBLFNBQVMsc0JBSlgsRUFLRTtBQUNBTTtBQUNBRywwQkFBZ0IsSUFBaEI7QUFDQTtBQUNEOztBQUVELFlBQUlTLEtBQUtHLFdBQUwsQ0FBaUJDLFlBQXJCLEVBQW1DO0FBQ2pDSixlQUFLRyxXQUFMLENBQWlCQyxZQUFqQixDQUE4QlIsT0FBOUIsQ0FBc0MsVUFBU08sV0FBVCxFQUFzQjtBQUMxRFYsK0JBQW1CVSxZQUFZRSxFQUEvQjtBQUNELFdBRkQ7QUFHRCxTQUpELE1BS0s7QUFDSDtBQUNBakI7QUFDRDs7QUFFREksMEJBQWtCUSxJQUFsQjtBQUNELE9BMUNJOztBQTRDTCxrQ0FBNEIsWUFBVztBQUNyQ1gsMkJBQW1CLElBQW5CO0FBQ0QsT0E5Q0k7O0FBZ0RMLDhCQUF3QixZQUFXO0FBQ2pDQyx3QkFBZ0IsSUFBaEI7QUFDRCxPQWxESTs7QUFvREwsc0JBQWdCLFlBQVc7QUFDekIsWUFBSUYseUJBQXlCLENBQXpCLElBQThCLENBQUNDLGdCQUEvQixJQUFtRCxDQUFDQyxhQUFwRCxJQUFxRSxDQUFDQyxhQUExRSxFQUF5RjtBQUN2Rkosa0JBQVFtQixNQUFSLENBQWVkLGVBQWYsRUFBZ0Msd0JBQWhDO0FBQ0Q7QUFDRjtBQXhESSxLQUFQO0FBMEREO0FBMUZjLENBQWpCIiwiZmlsZSI6InByZWZlci1kZWZhdWx0LWV4cG9ydC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ3ByZWZlci1kZWZhdWx0LWV4cG9ydCcpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbXSxcbiAgfSxcblxuICBjcmVhdGU6IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgICBsZXQgc3BlY2lmaWVyRXhwb3J0Q291bnQgPSAwXG4gICAgbGV0IGhhc0RlZmF1bHRFeHBvcnQgPSBmYWxzZVxuICAgIGxldCBoYXNTdGFyRXhwb3J0ID0gZmFsc2VcbiAgICBsZXQgaGFzVHlwZUV4cG9ydCA9IGZhbHNlXG4gICAgbGV0IG5hbWVkRXhwb3J0Tm9kZSA9IG51bGxcblxuICAgIGZ1bmN0aW9uIGNhcHR1cmVEZWNsYXJhdGlvbihpZGVudGlmaWVyT3JQYXR0ZXJuKSB7XG4gICAgICBpZiAoaWRlbnRpZmllck9yUGF0dGVybi50eXBlID09PSAnT2JqZWN0UGF0dGVybicpIHtcbiAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2FwdHVyZVxuICAgICAgICBpZGVudGlmaWVyT3JQYXR0ZXJuLnByb3BlcnRpZXNcbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbihwcm9wZXJ0eSkge1xuICAgICAgICAgICAgY2FwdHVyZURlY2xhcmF0aW9uKHByb3BlcnR5LnZhbHVlKVxuICAgICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKGlkZW50aWZpZXJPclBhdHRlcm4udHlwZSA9PT0gJ0FycmF5UGF0dGVybicpIHtcbiAgICAgICAgaWRlbnRpZmllck9yUGF0dGVybi5lbGVtZW50c1xuICAgICAgICAgIC5mb3JFYWNoKGNhcHR1cmVEZWNsYXJhdGlvbilcbiAgICAgIH0gZWxzZSAge1xuICAgICAgLy8gYXNzdW1lIGl0J3MgYSBzaW5nbGUgc3RhbmRhcmQgaWRlbnRpZmllclxuICAgICAgICBzcGVjaWZpZXJFeHBvcnRDb3VudCsrXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICdFeHBvcnREZWZhdWx0U3BlY2lmaWVyJzogZnVuY3Rpb24oKSB7XG4gICAgICAgIGhhc0RlZmF1bHRFeHBvcnQgPSB0cnVlXG4gICAgICB9LFxuXG4gICAgICAnRXhwb3J0U3BlY2lmaWVyJzogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS5leHBvcnRlZC5uYW1lID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICBoYXNEZWZhdWx0RXhwb3J0ID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNwZWNpZmllckV4cG9ydENvdW50KytcbiAgICAgICAgICBuYW1lZEV4cG9ydE5vZGUgPSBub2RlXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJzogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgc3BlY2lmaWVycywgbm9kZS5kZWNsYXJhdGlvbiBzaG91bGQgYmUgbnVsbFxuICAgICAgICBpZiAoIW5vZGUuZGVjbGFyYXRpb24pIHJldHVyblxuXG4gICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gbm9kZS5kZWNsYXJhdGlvblxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlID09PSAnVFNUeXBlQWxpYXNEZWNsYXJhdGlvbicgfHxcbiAgICAgICAgICB0eXBlID09PSAnVHlwZUFsaWFzJyB8fFxuICAgICAgICAgIHR5cGUgPT09ICdUU0ludGVyZmFjZURlY2xhcmF0aW9uJyB8fFxuICAgICAgICAgIHR5cGUgPT09ICdJbnRlcmZhY2VEZWNsYXJhdGlvbidcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3BlY2lmaWVyRXhwb3J0Q291bnQrK1xuICAgICAgICAgIGhhc1R5cGVFeHBvcnQgPSB0cnVlXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uLmRlY2xhcmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBjYXB0dXJlRGVjbGFyYXRpb24oZGVjbGFyYXRpb24uaWQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyBjYXB0dXJlcyAnZXhwb3J0IGZ1bmN0aW9uIGZvbygpIHt9JyBzeW50YXhcbiAgICAgICAgICBzcGVjaWZpZXJFeHBvcnRDb3VudCsrXG4gICAgICAgIH1cblxuICAgICAgICBuYW1lZEV4cG9ydE5vZGUgPSBub2RlXG4gICAgICB9LFxuXG4gICAgICAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJzogZnVuY3Rpb24oKSB7XG4gICAgICAgIGhhc0RlZmF1bHRFeHBvcnQgPSB0cnVlXG4gICAgICB9LFxuXG4gICAgICAnRXhwb3J0QWxsRGVjbGFyYXRpb24nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaGFzU3RhckV4cG9ydCA9IHRydWVcbiAgICAgIH0sXG5cbiAgICAgICdQcm9ncmFtOmV4aXQnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHNwZWNpZmllckV4cG9ydENvdW50ID09PSAxICYmICFoYXNEZWZhdWx0RXhwb3J0ICYmICFoYXNTdGFyRXhwb3J0ICYmICFoYXNUeXBlRXhwb3J0KSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQobmFtZWRFeHBvcnROb2RlLCAnUHJlZmVyIGRlZmF1bHQgZXhwb3J0LicpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuICB9LFxufVxuIl19
\ No newline at end of file
+      } };
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9wcmVmZXItZGVmYXVsdC1leHBvcnQuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1ldGEiLCJ0eXBlIiwiZG9jcyIsInVybCIsInNjaGVtYSIsImNyZWF0ZSIsImNvbnRleHQiLCJzcGVjaWZpZXJFeHBvcnRDb3VudCIsImhhc0RlZmF1bHRFeHBvcnQiLCJoYXNTdGFyRXhwb3J0IiwiaGFzVHlwZUV4cG9ydCIsIm5hbWVkRXhwb3J0Tm9kZSIsImNhcHR1cmVEZWNsYXJhdGlvbiIsImlkZW50aWZpZXJPclBhdHRlcm4iLCJwcm9wZXJ0aWVzIiwiZm9yRWFjaCIsInByb3BlcnR5IiwidmFsdWUiLCJlbGVtZW50cyIsIm5vZGUiLCJleHBvcnRlZCIsIm5hbWUiLCJkZWNsYXJhdGlvbiIsImRlY2xhcmF0aW9ucyIsImlkIiwicmVwb3J0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQSxxQzs7QUFFQUEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsdUJBQVIsQ0FERCxFQUZGOztBQUtKQyxZQUFRLEVBTEosRUFEUzs7O0FBU2ZDLFVBQVEsVUFBU0MsT0FBVCxFQUFrQjtBQUN4QixRQUFJQyx1QkFBdUIsQ0FBM0I7QUFDQSxRQUFJQyxtQkFBbUIsS0FBdkI7QUFDQSxRQUFJQyxnQkFBZ0IsS0FBcEI7QUFDQSxRQUFJQyxnQkFBZ0IsS0FBcEI7QUFDQSxRQUFJQyxrQkFBa0IsSUFBdEI7O0FBRUEsYUFBU0Msa0JBQVQsQ0FBNEJDLG1CQUE1QixFQUFpRDtBQUMvQyxVQUFJQSxvQkFBb0JaLElBQXBCLEtBQTZCLGVBQWpDLEVBQWtEO0FBQ2hEO0FBQ0FZLDRCQUFvQkMsVUFBcEI7QUFDR0MsZUFESCxDQUNXLFVBQVNDLFFBQVQsRUFBbUI7QUFDMUJKLDZCQUFtQkksU0FBU0MsS0FBNUI7QUFDRCxTQUhIO0FBSUQsT0FORCxNQU1PLElBQUlKLG9CQUFvQlosSUFBcEIsS0FBNkIsY0FBakMsRUFBaUQ7QUFDdERZLDRCQUFvQkssUUFBcEI7QUFDR0gsZUFESCxDQUNXSCxrQkFEWDtBQUVELE9BSE0sTUFHQztBQUNSO0FBQ0VMO0FBQ0Q7QUFDRjs7QUFFRCxXQUFPO0FBQ0wsZ0NBQTBCLFlBQVc7QUFDbkNDLDJCQUFtQixJQUFuQjtBQUNELE9BSEk7O0FBS0wseUJBQW1CLFVBQVNXLElBQVQsRUFBZTtBQUNoQyxZQUFJQSxLQUFLQyxRQUFMLENBQWNDLElBQWQsS0FBdUIsU0FBM0IsRUFBc0M7QUFDcENiLDZCQUFtQixJQUFuQjtBQUNELFNBRkQsTUFFTztBQUNMRDtBQUNBSSw0QkFBa0JRLElBQWxCO0FBQ0Q7QUFDRixPQVpJOztBQWNMLGdDQUEwQixVQUFTQSxJQUFULEVBQWU7QUFDdkM7QUFDQSxZQUFJLENBQUNBLEtBQUtHLFdBQVYsRUFBdUIsT0FGZ0I7O0FBSS9CckIsWUFKK0IsR0FJdEJrQixLQUFLRyxXQUppQixDQUkvQnJCLElBSitCOztBQU12QztBQUNFQSxpQkFBUyx3QkFBVDtBQUNBQSxpQkFBUyxXQURUO0FBRUFBLGlCQUFTLHdCQUZUO0FBR0FBLGlCQUFTLHNCQUpYO0FBS0U7QUFDQU07QUFDQUcsMEJBQWdCLElBQWhCO0FBQ0E7QUFDRDs7QUFFRCxZQUFJUyxLQUFLRyxXQUFMLENBQWlCQyxZQUFyQixFQUFtQztBQUNqQ0osZUFBS0csV0FBTCxDQUFpQkMsWUFBakIsQ0FBOEJSLE9BQTlCLENBQXNDLFVBQVNPLFdBQVQsRUFBc0I7QUFDMURWLCtCQUFtQlUsWUFBWUUsRUFBL0I7QUFDRCxXQUZEO0FBR0QsU0FKRDtBQUtLO0FBQ0g7QUFDQWpCO0FBQ0Q7O0FBRURJLDBCQUFrQlEsSUFBbEI7QUFDRCxPQTFDSTs7QUE0Q0wsa0NBQTRCLFlBQVc7QUFDckNYLDJCQUFtQixJQUFuQjtBQUNELE9BOUNJOztBQWdETCw4QkFBd0IsWUFBVztBQUNqQ0Msd0JBQWdCLElBQWhCO0FBQ0QsT0FsREk7O0FBb0RMLHNCQUFnQixZQUFXO0FBQ3pCLFlBQUlGLHlCQUF5QixDQUF6QixJQUE4QixDQUFDQyxnQkFBL0IsSUFBbUQsQ0FBQ0MsYUFBcEQsSUFBcUUsQ0FBQ0MsYUFBMUUsRUFBeUY7QUFDdkZKLGtCQUFRbUIsTUFBUixDQUFlZCxlQUFmLEVBQWdDLHdCQUFoQztBQUNEO0FBQ0YsT0F4REksRUFBUDs7QUEwREQsR0ExRmMsRUFBakIiLCJmaWxlIjoicHJlZmVyLWRlZmF1bHQtZXhwb3J0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIHVybDogZG9jc1VybCgncHJlZmVyLWRlZmF1bHQtZXhwb3J0JyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24oY29udGV4dCkge1xuICAgIGxldCBzcGVjaWZpZXJFeHBvcnRDb3VudCA9IDBcbiAgICBsZXQgaGFzRGVmYXVsdEV4cG9ydCA9IGZhbHNlXG4gICAgbGV0IGhhc1N0YXJFeHBvcnQgPSBmYWxzZVxuICAgIGxldCBoYXNUeXBlRXhwb3J0ID0gZmFsc2VcbiAgICBsZXQgbmFtZWRFeHBvcnROb2RlID0gbnVsbFxuXG4gICAgZnVuY3Rpb24gY2FwdHVyZURlY2xhcmF0aW9uKGlkZW50aWZpZXJPclBhdHRlcm4pIHtcbiAgICAgIGlmIChpZGVudGlmaWVyT3JQYXR0ZXJuLnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJykge1xuICAgICAgICAvLyByZWN1cnNpdmVseSBjYXB0dXJlXG4gICAgICAgIGlkZW50aWZpZXJPclBhdHRlcm4ucHJvcGVydGllc1xuICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKHByb3BlcnR5KSB7XG4gICAgICAgICAgICBjYXB0dXJlRGVjbGFyYXRpb24ocHJvcGVydHkudmFsdWUpXG4gICAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoaWRlbnRpZmllck9yUGF0dGVybi50eXBlID09PSAnQXJyYXlQYXR0ZXJuJykge1xuICAgICAgICBpZGVudGlmaWVyT3JQYXR0ZXJuLmVsZW1lbnRzXG4gICAgICAgICAgLmZvckVhY2goY2FwdHVyZURlY2xhcmF0aW9uKVxuICAgICAgfSBlbHNlICB7XG4gICAgICAvLyBhc3N1bWUgaXQncyBhIHNpbmdsZSBzdGFuZGFyZCBpZGVudGlmaWVyXG4gICAgICAgIHNwZWNpZmllckV4cG9ydENvdW50KytcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ0V4cG9ydERlZmF1bHRTcGVjaWZpZXInOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaGFzRGVmYXVsdEV4cG9ydCA9IHRydWVcbiAgICAgIH0sXG5cbiAgICAgICdFeHBvcnRTcGVjaWZpZXInOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmV4cG9ydGVkLm5hbWUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgIGhhc0RlZmF1bHRFeHBvcnQgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3BlY2lmaWVyRXhwb3J0Q291bnQrK1xuICAgICAgICAgIG5hbWVkRXhwb3J0Tm9kZSA9IG5vZGVcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgJ0V4cG9ydE5hbWVkRGVjbGFyYXRpb24nOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBzcGVjaWZpZXJzLCBub2RlLmRlY2xhcmF0aW9uIHNob3VsZCBiZSBudWxsXG4gICAgICAgIGlmICghbm9kZS5kZWNsYXJhdGlvbikgcmV0dXJuXG5cbiAgICAgICAgY29uc3QgeyB0eXBlIH0gPSBub2RlLmRlY2xhcmF0aW9uXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGUgPT09ICdUU1R5cGVBbGlhc0RlY2xhcmF0aW9uJyB8fFxuICAgICAgICAgIHR5cGUgPT09ICdUeXBlQWxpYXMnIHx8XG4gICAgICAgICAgdHlwZSA9PT0gJ1RTSW50ZXJmYWNlRGVjbGFyYXRpb24nIHx8XG4gICAgICAgICAgdHlwZSA9PT0gJ0ludGVyZmFjZURlY2xhcmF0aW9uJ1xuICAgICAgICApIHtcbiAgICAgICAgICBzcGVjaWZpZXJFeHBvcnRDb3VudCsrXG4gICAgICAgICAgaGFzVHlwZUV4cG9ydCA9IHRydWVcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uLmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zLmZvckVhY2goZnVuY3Rpb24oZGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIGNhcHR1cmVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbi5pZClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIGNhcHR1cmVzICdleHBvcnQgZnVuY3Rpb24gZm9vKCkge30nIHN5bnRheFxuICAgICAgICAgIHNwZWNpZmllckV4cG9ydENvdW50KytcbiAgICAgICAgfVxuXG4gICAgICAgIG5hbWVkRXhwb3J0Tm9kZSA9IG5vZGVcbiAgICAgIH0sXG5cbiAgICAgICdFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgaGFzRGVmYXVsdEV4cG9ydCA9IHRydWVcbiAgICAgIH0sXG5cbiAgICAgICdFeHBvcnRBbGxEZWNsYXJhdGlvbic6IGZ1bmN0aW9uKCkge1xuICAgICAgICBoYXNTdGFyRXhwb3J0ID0gdHJ1ZVxuICAgICAgfSxcblxuICAgICAgJ1Byb2dyYW06ZXhpdCc6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoc3BlY2lmaWVyRXhwb3J0Q291bnQgPT09IDEgJiYgIWhhc0RlZmF1bHRFeHBvcnQgJiYgIWhhc1N0YXJFeHBvcnQgJiYgIWhhc1R5cGVFeHBvcnQpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydChuYW1lZEV4cG9ydE5vZGUsICdQcmVmZXIgZGVmYXVsdCBleHBvcnQuJylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH0sXG59XG4iXX0=
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/lib/rules/unambiguous.js b/node_modules/eslint-plugin-import/lib/rules/unambiguous.js
index 00b518b..68a12f8 100644
--- a/node_modules/eslint-plugin-import/lib/rules/unambiguous.js
+++ b/node_modules/eslint-plugin-import/lib/rules/unambiguous.js
@@ -1,26 +1,19 @@
 'use strict';
 
+
+
+
 var _unambiguous = require('eslint-module-utils/unambiguous');
-
-var _docsUrl = require('../docsUrl');
-
-var _docsUrl2 = _interopRequireDefault(_docsUrl);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * @fileOverview Report modules that could parse incorrectly as scripts.
- * @author Ben Mosher
- */
-
-module.exports = {
-  meta: {
+var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /**
+                                                                                                                                                                                     * @fileOverview Report modules that could parse incorrectly as scripts.
+                                                                                                                                                                                     * @author Ben Mosher
+                                                                                                                                                                                     */module.exports = { meta: {
     type: 'suggestion',
     docs: {
-      url: (0, _docsUrl2.default)('unambiguous')
-    },
-    schema: []
-  },
+      url: (0, _docsUrl2.default)('unambiguous') },
+
+    schema: [] },
+
 
   create: function (context) {
     // ignore non-modules
@@ -33,11 +26,11 @@
         if (!(0, _unambiguous.isModule)(ast)) {
           context.report({
             node: ast,
-            message: 'This module could be parsed as a valid script.'
-          });
+            message: 'This module could be parsed as a valid script.' });
+
         }
-      }
-    };
-  }
-};
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy91bmFtYmlndW91cy5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwiY29udGV4dCIsInBhcnNlck9wdGlvbnMiLCJzb3VyY2VUeXBlIiwiUHJvZ3JhbSIsImFzdCIsInJlcG9ydCIsIm5vZGUiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiOztBQUtBOztBQUNBOzs7Ozs7QUFOQTs7Ozs7QUFRQUEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsYUFBUjtBQURELEtBRkY7QUFLSkMsWUFBUTtBQUxKLEdBRFM7O0FBU2ZDLFVBQVEsVUFBVUMsT0FBVixFQUFtQjtBQUN6QjtBQUNBLFFBQUlBLFFBQVFDLGFBQVIsQ0FBc0JDLFVBQXRCLEtBQXFDLFFBQXpDLEVBQW1EO0FBQ2pELGFBQU8sRUFBUDtBQUNEOztBQUVELFdBQU87QUFDTEMsZUFBUyxVQUFVQyxHQUFWLEVBQWU7QUFDdEIsWUFBSSxDQUFDLDJCQUFTQSxHQUFULENBQUwsRUFBb0I7QUFDbEJKLGtCQUFRSyxNQUFSLENBQWU7QUFDYkMsa0JBQU1GLEdBRE87QUFFYkcscUJBQVM7QUFGSSxXQUFmO0FBSUQ7QUFDRjtBQVJJLEtBQVA7QUFXRDtBQTFCYyxDQUFqQiIsImZpbGUiOiJ1bmFtYmlndW91cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVPdmVydmlldyBSZXBvcnQgbW9kdWxlcyB0aGF0IGNvdWxkIHBhcnNlIGluY29ycmVjdGx5IGFzIHNjcmlwdHMuXG4gKiBAYXV0aG9yIEJlbiBNb3NoZXJcbiAqL1xuXG5pbXBvcnQgeyBpc01vZHVsZSB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvdW5hbWJpZ3VvdXMnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ3VuYW1iaWd1b3VzJyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAvLyBpZ25vcmUgbm9uLW1vZHVsZXNcbiAgICBpZiAoY29udGV4dC5wYXJzZXJPcHRpb25zLnNvdXJjZVR5cGUgIT09ICdtb2R1bGUnKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgUHJvZ3JhbTogZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICBpZiAoIWlzTW9kdWxlKGFzdCkpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBhc3QsXG4gICAgICAgICAgICBtZXNzYWdlOiAnVGhpcyBtb2R1bGUgY291bGQgYmUgcGFyc2VkIGFzIGEgdmFsaWQgc2NyaXB0LicsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG5cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
+      } };
+
+
+  } };
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy91bmFtYmlndW91cy5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsInR5cGUiLCJkb2NzIiwidXJsIiwic2NoZW1hIiwiY3JlYXRlIiwiY29udGV4dCIsInBhcnNlck9wdGlvbnMiLCJzb3VyY2VUeXBlIiwiUHJvZ3JhbSIsImFzdCIsInJlcG9ydCIsIm5vZGUiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7OztBQUtBO0FBQ0EscUMsK0lBTkE7Ozt1TEFRQUEsT0FBT0MsT0FBUCxHQUFpQixFQUNmQyxNQUFNO0FBQ0pDLFVBQU0sWUFERjtBQUVKQyxVQUFNO0FBQ0pDLFdBQUssdUJBQVEsYUFBUixDQURELEVBRkY7O0FBS0pDLFlBQVEsRUFMSixFQURTOzs7QUFTZkMsVUFBUSxVQUFVQyxPQUFWLEVBQW1CO0FBQ3pCO0FBQ0EsUUFBSUEsUUFBUUMsYUFBUixDQUFzQkMsVUFBdEIsS0FBcUMsUUFBekMsRUFBbUQ7QUFDakQsYUFBTyxFQUFQO0FBQ0Q7O0FBRUQsV0FBTztBQUNMQyxlQUFTLFVBQVVDLEdBQVYsRUFBZTtBQUN0QixZQUFJLENBQUMsMkJBQVNBLEdBQVQsQ0FBTCxFQUFvQjtBQUNsQkosa0JBQVFLLE1BQVIsQ0FBZTtBQUNiQyxrQkFBTUYsR0FETztBQUViRyxxQkFBUyxnREFGSSxFQUFmOztBQUlEO0FBQ0YsT0FSSSxFQUFQOzs7QUFXRCxHQTFCYyxFQUFqQiIsImZpbGUiOiJ1bmFtYmlndW91cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVPdmVydmlldyBSZXBvcnQgbW9kdWxlcyB0aGF0IGNvdWxkIHBhcnNlIGluY29ycmVjdGx5IGFzIHNjcmlwdHMuXG4gKiBAYXV0aG9yIEJlbiBNb3NoZXJcbiAqL1xuXG5pbXBvcnQgeyBpc01vZHVsZSB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvdW5hbWJpZ3VvdXMnXG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICB1cmw6IGRvY3NVcmwoJ3VuYW1iaWd1b3VzJyksXG4gICAgfSxcbiAgICBzY2hlbWE6IFtdLFxuICB9LFxuXG4gIGNyZWF0ZTogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAvLyBpZ25vcmUgbm9uLW1vZHVsZXNcbiAgICBpZiAoY29udGV4dC5wYXJzZXJPcHRpb25zLnNvdXJjZVR5cGUgIT09ICdtb2R1bGUnKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgUHJvZ3JhbTogZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICBpZiAoIWlzTW9kdWxlKGFzdCkpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBhc3QsXG4gICAgICAgICAgICBtZXNzYWdlOiAnVGhpcyBtb2R1bGUgY291bGQgYmUgcGFyc2VkIGFzIGEgdmFsaWQgc2NyaXB0LicsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG5cbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-flowtype/node_modules/.bin/eslint b/node_modules/eslint-plugin-import/node_modules/.bin/eslint
similarity index 100%
rename from node_modules/eslint-plugin-flowtype/node_modules/.bin/eslint
rename to node_modules/eslint-plugin-import/node_modules/.bin/eslint
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/.editorconfig b/node_modules/eslint-plugin-import/node_modules/resolve/.editorconfig
new file mode 100644
index 0000000..bc228f8
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/.editorconfig
@@ -0,0 +1,20 @@
+root = true
+
+[*]
+indent_style = tab
+indent_size = 4
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+max_line_length = 150
+
+[CHANGELOG.md]
+indent_style = space
+indent_size = 2
+
+[*.json]
+max_line_length = off
+
+[Makefile]
+max_line_length = off
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/.eslintignore b/node_modules/eslint-plugin-import/node_modules/resolve/.eslintignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/.eslintignore
@@ -0,0 +1 @@
+node_modules
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/.eslintrc b/node_modules/eslint-plugin-import/node_modules/resolve/.eslintrc
new file mode 100644
index 0000000..a22863c
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/.eslintrc
@@ -0,0 +1,39 @@
+{
+    "extends": "@ljharb",
+    "root": true,
+    "rules": {
+        "array-bracket-newline": 0,
+        "array-element-newline": 0,
+        "indent": [2, 4],
+        "strict": 0,
+        "complexity": 0,
+        "consistent-return": 0,
+        "curly": 0,
+        "dot-notation": [2, { "allowKeywords": true }],
+        "func-name-matching": 0,
+        "func-style": 0,
+        "global-require": 0,
+        "id-length": [2, { "min": 1, "max": 30 }],
+        "max-lines-per-function": 0,
+        "max-nested-callbacks": 0,
+        "max-params": 0,
+        "max-statements-per-line": [2, { "max": 2 }],
+        "max-statements": 0,
+        "no-magic-numbers": 0,
+        "no-console": 0,
+        "no-shadow": 0,
+        "no-unused-vars": [2, { "vars": "all", "args": "none" }],
+        "no-use-before-define": 0,
+        "object-curly-newline": 0,
+        "operator-linebreak": [2, "before"],
+        "sort-keys": 0,
+    },
+    "overrides": [
+        {
+            "files": "test/resolver/nested_symlinks/mylib/*.js",
+            "rules": {
+                "no-throw-literal": 0,
+            },
+        },
+    ],
+}
diff --git a/node_modules/object.entries/.travis.yml b/node_modules/eslint-plugin-import/node_modules/resolve/.travis.yml
similarity index 100%
rename from node_modules/object.entries/.travis.yml
rename to node_modules/eslint-plugin-import/node_modules/resolve/.travis.yml
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/LICENSE b/node_modules/eslint-plugin-import/node_modules/resolve/LICENSE
new file mode 100644
index 0000000..ff4fce2
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2012 James Halliday
+
+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/node_modules/eslint-plugin-import/node_modules/resolve/appveyor.yml b/node_modules/eslint-plugin-import/node_modules/resolve/appveyor.yml
new file mode 100644
index 0000000..9458fb8
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/appveyor.yml
@@ -0,0 +1,54 @@
+version: 1.0.{build}
+skip_branch_with_pr: true
+build: off
+
+environment:
+  matrix:
+    - nodejs_version: "12"
+    - nodejs_version: "11"
+    - nodejs_version: "10"
+    - nodejs_version: "9"
+    - nodejs_version: "8"
+    - nodejs_version: "7"
+    - nodejs_version: "6"
+    - nodejs_version: "5"
+    - nodejs_version: "4"
+    - nodejs_version: "3"
+    - nodejs_version: "2"
+    - nodejs_version: "1"
+    - nodejs_version: "0.12"
+    - nodejs_version: "0.10"
+    - nodejs_version: "0.8"
+    - nodejs_version: "0.6"
+matrix:
+  # fast_finish: true
+  allow_failures:
+    - nodejs_version: "5" # due to windows npm bug, registry-side
+    - nodejs_version: "0.8"
+    - nodejs_version: "0.6"
+
+platform:
+  - x86
+  - x64
+
+# Install scripts. (runs after repo cloning)
+install:
+ # Fix symlinks in working copy (see https://github.com/appveyor/ci/issues/650#issuecomment-186592582) / https://github.com/charleskorn/batect/commit/d08986802ec43086902958c4ee7e57ff3e71dbef
+ - git config core.symlinks true
+ - git reset --hard
+ # Get the latest stable version of Node.js or io.js
+ - ps: Install-Product node $env:nodejs_version $env:platform
+ - IF %nodejs_version% EQU 0.6 npm config set strict-ssl false && npm -g install npm@1.3
+ - IF %nodejs_version% EQU 0.8 npm config set strict-ssl false && npm -g install npm@1.4.28 && npm install -g npm@4.5
+ - set PATH=%APPDATA%\npm;%PATH%
+ #- IF %nodejs_version% NEQ 0.6 AND %nodejs_version% NEQ 0.8 npm -g install npm
+ # install modules
+ - npm install
+
+# Post-install test scripts.
+test_script:
+ # Output useful info for debugging.
+ - node --version
+ - npm --version
+ # run tests
+ - npm run tests-only
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/example/async.js b/node_modules/eslint-plugin-import/node_modules/resolve/example/async.js
new file mode 100644
index 0000000..20e65dc
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/example/async.js
@@ -0,0 +1,5 @@
+var resolve = require('../');
+resolve('tap', { basedir: __dirname }, function (err, res) {
+    if (err) console.error(err);
+    else console.log(res);
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/example/sync.js b/node_modules/eslint-plugin-import/node_modules/resolve/example/sync.js
new file mode 100644
index 0000000..54b2cc1
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/example/sync.js
@@ -0,0 +1,3 @@
+var resolve = require('../');
+var res = resolve.sync('tap', { basedir: __dirname });
+console.log(res);
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/index.js
new file mode 100644
index 0000000..125d814
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/index.js
@@ -0,0 +1,6 @@
+var async = require('./lib/async');
+async.core = require('./lib/core');
+async.isCore = require('./lib/is-core');
+async.sync = require('./lib/sync');
+
+module.exports = async;
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/lib/async.js b/node_modules/eslint-plugin-import/node_modules/resolve/lib/async.js
new file mode 100644
index 0000000..06aa458
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/lib/async.js
@@ -0,0 +1,298 @@
+var fs = require('fs');
+var path = require('path');
+var caller = require('./caller.js');
+var nodeModulesPaths = require('./node-modules-paths.js');
+var normalizeOptions = require('./normalize-options.js');
+var isCore = require('./is-core');
+
+var realpathFS = fs.realpath && typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath;
+
+var defaultIsFile = function isFile(file, cb) {
+    fs.stat(file, function (err, stat) {
+        if (!err) {
+            return cb(null, stat.isFile() || stat.isFIFO());
+        }
+        if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false);
+        return cb(err);
+    });
+};
+
+var defaultIsDir = function isDirectory(dir, cb) {
+    fs.stat(dir, function (err, stat) {
+        if (!err) {
+            return cb(null, stat.isDirectory());
+        }
+        if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false);
+        return cb(err);
+    });
+};
+
+var defaultRealpath = function realpath(x, cb) {
+    realpathFS(x, function (realpathErr, realPath) {
+        if (realpathErr && realpathErr.code !== 'ENOENT') cb(realpathErr);
+        else cb(null, realpathErr ? x : realPath);
+    });
+};
+
+var maybeRealpath = function maybeRealpath(realpath, x, opts, cb) {
+    if (opts && opts.preserveSymlinks === false) {
+        realpath(x, cb);
+    } else {
+        cb(null, x);
+    }
+};
+
+var getPackageCandidates = function getPackageCandidates(x, start, opts) {
+    var dirs = nodeModulesPaths(start, opts, x);
+    for (var i = 0; i < dirs.length; i++) {
+        dirs[i] = path.join(dirs[i], x);
+    }
+    return dirs;
+};
+
+module.exports = function resolve(x, options, callback) {
+    var cb = callback;
+    var opts = options;
+    if (typeof options === 'function') {
+        cb = opts;
+        opts = {};
+    }
+    if (typeof x !== 'string') {
+        var err = new TypeError('Path must be a string.');
+        return process.nextTick(function () {
+            cb(err);
+        });
+    }
+
+    opts = normalizeOptions(x, opts);
+
+    var isFile = opts.isFile || defaultIsFile;
+    var isDirectory = opts.isDirectory || defaultIsDir;
+    var readFile = opts.readFile || fs.readFile;
+    var realpath = opts.realpath || defaultRealpath;
+    var packageIterator = opts.packageIterator;
+
+    var extensions = opts.extensions || ['.js'];
+    var basedir = opts.basedir || path.dirname(caller());
+    var parent = opts.filename || basedir;
+
+    opts.paths = opts.paths || [];
+
+    // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory
+    var absoluteStart = path.resolve(basedir);
+
+    maybeRealpath(
+        realpath,
+        absoluteStart,
+        opts,
+        function (err, realStart) {
+            if (err) cb(err);
+            else init(realStart);
+        }
+    );
+
+    var res;
+    function init(basedir) {
+        if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) {
+            res = path.resolve(basedir, x);
+            if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/';
+            if ((/\/$/).test(x) && res === basedir) {
+                loadAsDirectory(res, opts.package, onfile);
+            } else loadAsFile(res, opts.package, onfile);
+        } else if (isCore(x)) {
+            return cb(null, x);
+        } else loadNodeModules(x, basedir, function (err, n, pkg) {
+            if (err) cb(err);
+            else if (n) {
+                return maybeRealpath(realpath, n, opts, function (err, realN) {
+                    if (err) {
+                        cb(err);
+                    } else {
+                        cb(null, realN, pkg);
+                    }
+                });
+            } else {
+                var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'");
+                moduleError.code = 'MODULE_NOT_FOUND';
+                cb(moduleError);
+            }
+        });
+    }
+
+    function onfile(err, m, pkg) {
+        if (err) cb(err);
+        else if (m) cb(null, m, pkg);
+        else loadAsDirectory(res, function (err, d, pkg) {
+            if (err) cb(err);
+            else if (d) {
+                maybeRealpath(realpath, d, opts, function (err, realD) {
+                    if (err) {
+                        cb(err);
+                    } else {
+                        cb(null, realD, pkg);
+                    }
+                });
+            } else {
+                var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'");
+                moduleError.code = 'MODULE_NOT_FOUND';
+                cb(moduleError);
+            }
+        });
+    }
+
+    function loadAsFile(x, thePackage, callback) {
+        var loadAsFilePackage = thePackage;
+        var cb = callback;
+        if (typeof loadAsFilePackage === 'function') {
+            cb = loadAsFilePackage;
+            loadAsFilePackage = undefined;
+        }
+
+        var exts = [''].concat(extensions);
+        load(exts, x, loadAsFilePackage);
+
+        function load(exts, x, loadPackage) {
+            if (exts.length === 0) return cb(null, undefined, loadPackage);
+            var file = x + exts[0];
+
+            var pkg = loadPackage;
+            if (pkg) onpkg(null, pkg);
+            else loadpkg(path.dirname(file), onpkg);
+
+            function onpkg(err, pkg_, dir) {
+                pkg = pkg_;
+                if (err) return cb(err);
+                if (dir && pkg && opts.pathFilter) {
+                    var rfile = path.relative(dir, file);
+                    var rel = rfile.slice(0, rfile.length - exts[0].length);
+                    var r = opts.pathFilter(pkg, x, rel);
+                    if (r) return load(
+                        [''].concat(extensions.slice()),
+                        path.resolve(dir, r),
+                        pkg
+                    );
+                }
+                isFile(file, onex);
+            }
+            function onex(err, ex) {
+                if (err) return cb(err);
+                if (ex) return cb(null, file, pkg);
+                load(exts.slice(1), x, pkg);
+            }
+        }
+    }
+
+    function loadpkg(dir, cb) {
+        if (dir === '' || dir === '/') return cb(null);
+        if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) {
+            return cb(null);
+        }
+        if ((/[/\\]node_modules[/\\]*$/).test(dir)) return cb(null);
+
+        maybeRealpath(realpath, dir, opts, function (unwrapErr, pkgdir) {
+            if (unwrapErr) return loadpkg(path.dirname(dir), cb);
+            var pkgfile = path.join(pkgdir, 'package.json');
+            isFile(pkgfile, function (err, ex) {
+                // on err, ex is false
+                if (!ex) return loadpkg(path.dirname(dir), cb);
+
+                readFile(pkgfile, function (err, body) {
+                    if (err) cb(err);
+                    try { var pkg = JSON.parse(body); } catch (jsonErr) {}
+
+                    if (pkg && opts.packageFilter) {
+                        pkg = opts.packageFilter(pkg, pkgfile);
+                    }
+                    cb(null, pkg, dir);
+                });
+            });
+        });
+    }
+
+    function loadAsDirectory(x, loadAsDirectoryPackage, callback) {
+        var cb = callback;
+        var fpkg = loadAsDirectoryPackage;
+        if (typeof fpkg === 'function') {
+            cb = fpkg;
+            fpkg = opts.package;
+        }
+
+        maybeRealpath(realpath, x, opts, function (unwrapErr, pkgdir) {
+            if (unwrapErr) return cb(unwrapErr);
+            var pkgfile = path.join(pkgdir, 'package.json');
+            isFile(pkgfile, function (err, ex) {
+                if (err) return cb(err);
+                if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb);
+
+                readFile(pkgfile, function (err, body) {
+                    if (err) return cb(err);
+                    try {
+                        var pkg = JSON.parse(body);
+                    } catch (jsonErr) {}
+
+                    if (pkg && opts.packageFilter) {
+                        pkg = opts.packageFilter(pkg, pkgfile);
+                    }
+
+                    if (pkg && pkg.main) {
+                        if (typeof pkg.main !== 'string') {
+                            var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string');
+                            mainError.code = 'INVALID_PACKAGE_MAIN';
+                            return cb(mainError);
+                        }
+                        if (pkg.main === '.' || pkg.main === './') {
+                            pkg.main = 'index';
+                        }
+                        loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) {
+                            if (err) return cb(err);
+                            if (m) return cb(null, m, pkg);
+                            if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb);
+
+                            var dir = path.resolve(x, pkg.main);
+                            loadAsDirectory(dir, pkg, function (err, n, pkg) {
+                                if (err) return cb(err);
+                                if (n) return cb(null, n, pkg);
+                                loadAsFile(path.join(x, 'index'), pkg, cb);
+                            });
+                        });
+                        return;
+                    }
+
+                    loadAsFile(path.join(x, '/index'), pkg, cb);
+                });
+            });
+        });
+    }
+
+    function processDirs(cb, dirs) {
+        if (dirs.length === 0) return cb(null, undefined);
+        var dir = dirs[0];
+
+        isDirectory(path.dirname(dir), isdir);
+
+        function isdir(err, isdir) {
+            if (err) return cb(err);
+            if (!isdir) return processDirs(cb, dirs.slice(1));
+            loadAsFile(dir, opts.package, onfile);
+        }
+
+        function onfile(err, m, pkg) {
+            if (err) return cb(err);
+            if (m) return cb(null, m, pkg);
+            loadAsDirectory(dir, opts.package, ondir);
+        }
+
+        function ondir(err, n, pkg) {
+            if (err) return cb(err);
+            if (n) return cb(null, n, pkg);
+            processDirs(cb, dirs.slice(1));
+        }
+    }
+    function loadNodeModules(x, start, cb) {
+        var thunk = function () { return getPackageCandidates(x, start, opts); };
+        processDirs(
+            cb,
+            packageIterator ? packageIterator(x, start, thunk, opts) : thunk()
+        );
+    }
+};
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/lib/caller.js b/node_modules/eslint-plugin-import/node_modules/resolve/lib/caller.js
new file mode 100644
index 0000000..b14a280
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/lib/caller.js
@@ -0,0 +1,8 @@
+module.exports = function () {
+    // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
+    var origPrepareStackTrace = Error.prepareStackTrace;
+    Error.prepareStackTrace = function (_, stack) { return stack; };
+    var stack = (new Error()).stack;
+    Error.prepareStackTrace = origPrepareStackTrace;
+    return stack[2].getFileName();
+};
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/lib/core.js b/node_modules/eslint-plugin-import/node_modules/resolve/lib/core.js
new file mode 100644
index 0000000..0877650
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/lib/core.js
@@ -0,0 +1,53 @@
+var current = (process.versions && process.versions.node && process.versions.node.split('.')) || [];
+
+function specifierIncluded(specifier) {
+    var parts = specifier.split(' ');
+    var op = parts.length > 1 ? parts[0] : '=';
+    var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.');
+
+    for (var i = 0; i < 3; ++i) {
+        var cur = Number(current[i] || 0);
+        var ver = Number(versionParts[i] || 0);
+        if (cur === ver) {
+            continue; // eslint-disable-line no-restricted-syntax, no-continue
+        }
+        if (op === '<') {
+            return cur < ver;
+        } else if (op === '>=') {
+            return cur >= ver;
+        } else {
+            return false;
+        }
+    }
+    return op === '>=';
+}
+
+function matchesRange(range) {
+    var specifiers = range.split(/ ?&& ?/);
+    if (specifiers.length === 0) { return false; }
+    for (var i = 0; i < specifiers.length; ++i) {
+        if (!specifierIncluded(specifiers[i])) { return false; }
+    }
+    return true;
+}
+
+function versionIncluded(specifierValue) {
+    if (typeof specifierValue === 'boolean') { return specifierValue; }
+    if (specifierValue && typeof specifierValue === 'object') {
+        for (var i = 0; i < specifierValue.length; ++i) {
+            if (matchesRange(specifierValue[i])) { return true; }
+        }
+        return false;
+    }
+    return matchesRange(specifierValue);
+}
+
+var data = require('./core.json');
+
+var core = {};
+for (var mod in data) { // eslint-disable-line no-restricted-syntax
+    if (Object.prototype.hasOwnProperty.call(data, mod)) {
+        core[mod] = versionIncluded(data[mod]);
+    }
+}
+module.exports = core;
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/lib/core.json b/node_modules/eslint-plugin-import/node_modules/resolve/lib/core.json
new file mode 100644
index 0000000..d51b70b
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/lib/core.json
@@ -0,0 +1,75 @@
+{
+    "assert": true,
+    "async_hooks": ">= 8",
+    "buffer_ieee754": "< 0.9.7",
+    "buffer": true,
+    "child_process": true,
+    "cluster": true,
+    "console": true,
+    "constants": true,
+    "crypto": true,
+    "_debug_agent": ">= 1 && < 8",
+    "_debugger": "< 8",
+    "dgram": true,
+    "dns": true,
+    "domain": true,
+    "events": true,
+    "freelist": "< 6",
+    "fs": true,
+    "fs/promises": [">= 10 && < 10.1", ">= 14"],
+    "_http_agent": ">= 0.11.1",
+    "_http_client": ">= 0.11.1",
+    "_http_common": ">= 0.11.1",
+    "_http_incoming": ">= 0.11.1",
+    "_http_outgoing": ">= 0.11.1",
+    "_http_server": ">= 0.11.1",
+    "http": true,
+    "http2": ">= 8.8",
+    "https": true,
+    "inspector": ">= 8.0.0",
+    "_linklist": "< 8",
+    "module": true,
+    "net": true,
+    "node-inspect/lib/_inspect": ">= 7.6.0 && < 12",
+    "node-inspect/lib/internal/inspect_client": ">= 7.6.0 && < 12",
+    "node-inspect/lib/internal/inspect_repl": ">= 7.6.0 && < 12",
+    "os": true,
+    "path": true,
+    "perf_hooks": ">= 8.5",
+    "process": ">= 1",
+    "punycode": true,
+    "querystring": true,
+    "readline": true,
+    "repl": true,
+    "smalloc": ">= 0.11.5 && < 3",
+    "_stream_duplex": ">= 0.9.4",
+    "_stream_transform": ">= 0.9.4",
+    "_stream_wrap": ">= 1.4.1",
+    "_stream_passthrough": ">= 0.9.4",
+    "_stream_readable": ">= 0.9.4",
+    "_stream_writable": ">= 0.9.4",
+    "stream": true,
+    "string_decoder": true,
+    "sys": true,
+    "timers": true,
+    "_tls_common": ">= 0.11.13",
+    "_tls_legacy": ">= 0.11.3 && < 10",
+    "_tls_wrap": ">= 0.11.3",
+    "tls": true,
+    "trace_events": ">= 10",
+    "tty": true,
+    "url": true,
+    "util": true,
+    "v8/tools/arguments": ">= 10 && < 12",
+    "v8/tools/codemap": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
+    "v8/tools/consarray": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
+    "v8/tools/csvparser": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
+    "v8/tools/logreader": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
+    "v8/tools/profile_view": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
+    "v8/tools/splaytree": [">= 4.4.0 && < 5", ">= 5.2.0 && < 12"],
+    "v8": ">= 1",
+    "vm": true,
+    "wasi": ">= 13.4 && < 13.5",
+    "worker_threads": ">= 11.7",
+    "zlib": true
+}
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/lib/is-core.js b/node_modules/eslint-plugin-import/node_modules/resolve/lib/is-core.js
new file mode 100644
index 0000000..48bc96c
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/lib/is-core.js
@@ -0,0 +1,5 @@
+var core = require('./core');
+
+module.exports = function isCore(x) {
+    return Object.prototype.hasOwnProperty.call(core, x);
+};
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/lib/node-modules-paths.js b/node_modules/eslint-plugin-import/node_modules/resolve/lib/node-modules-paths.js
new file mode 100644
index 0000000..2b43813
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/lib/node-modules-paths.js
@@ -0,0 +1,42 @@
+var path = require('path');
+var parse = path.parse || require('path-parse');
+
+var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) {
+    var prefix = '/';
+    if ((/^([A-Za-z]:)/).test(absoluteStart)) {
+        prefix = '';
+    } else if ((/^\\\\/).test(absoluteStart)) {
+        prefix = '\\\\';
+    }
+
+    var paths = [absoluteStart];
+    var parsed = parse(absoluteStart);
+    while (parsed.dir !== paths[paths.length - 1]) {
+        paths.push(parsed.dir);
+        parsed = parse(parsed.dir);
+    }
+
+    return paths.reduce(function (dirs, aPath) {
+        return dirs.concat(modules.map(function (moduleDir) {
+            return path.resolve(prefix, aPath, moduleDir);
+        }));
+    }, []);
+};
+
+module.exports = function nodeModulesPaths(start, opts, request) {
+    var modules = opts && opts.moduleDirectory
+        ? [].concat(opts.moduleDirectory)
+        : ['node_modules'];
+
+    if (opts && typeof opts.paths === 'function') {
+        return opts.paths(
+            request,
+            start,
+            function () { return getNodeModulesDirs(start, modules); },
+            opts
+        );
+    }
+
+    var dirs = getNodeModulesDirs(start, modules);
+    return opts && opts.paths ? dirs.concat(opts.paths) : dirs;
+};
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/lib/normalize-options.js b/node_modules/eslint-plugin-import/node_modules/resolve/lib/normalize-options.js
new file mode 100644
index 0000000..4b56904
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/lib/normalize-options.js
@@ -0,0 +1,10 @@
+module.exports = function (x, opts) {
+    /**
+     * This file is purposefully a passthrough. It's expected that third-party
+     * environments will override it at runtime in order to inject special logic
+     * into `resolve` (by manipulating the options). One such example is the PnP
+     * code path in Yarn.
+     */
+
+    return opts || {};
+};
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/lib/sync.js b/node_modules/eslint-plugin-import/node_modules/resolve/lib/sync.js
new file mode 100644
index 0000000..da74e19
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/lib/sync.js
@@ -0,0 +1,191 @@
+var isCore = require('./is-core');
+var fs = require('fs');
+var path = require('path');
+var caller = require('./caller.js');
+var nodeModulesPaths = require('./node-modules-paths.js');
+var normalizeOptions = require('./normalize-options.js');
+
+var realpathFS = fs.realpathSync && typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync;
+
+var defaultIsFile = function isFile(file) {
+    try {
+        var stat = fs.statSync(file);
+    } catch (e) {
+        if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
+        throw e;
+    }
+    return stat.isFile() || stat.isFIFO();
+};
+
+var defaultIsDir = function isDirectory(dir) {
+    try {
+        var stat = fs.statSync(dir);
+    } catch (e) {
+        if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
+        throw e;
+    }
+    return stat.isDirectory();
+};
+
+var defaultRealpathSync = function realpathSync(x) {
+    try {
+        return realpathFS(x);
+    } catch (realpathErr) {
+        if (realpathErr.code !== 'ENOENT') {
+            throw realpathErr;
+        }
+    }
+    return x;
+};
+
+var maybeRealpathSync = function maybeRealpathSync(realpathSync, x, opts) {
+    if (opts && opts.preserveSymlinks === false) {
+        return realpathSync(x);
+    }
+    return x;
+};
+
+var getPackageCandidates = function getPackageCandidates(x, start, opts) {
+    var dirs = nodeModulesPaths(start, opts, x);
+    for (var i = 0; i < dirs.length; i++) {
+        dirs[i] = path.join(dirs[i], x);
+    }
+    return dirs;
+};
+
+module.exports = function resolveSync(x, options) {
+    if (typeof x !== 'string') {
+        throw new TypeError('Path must be a string.');
+    }
+    var opts = normalizeOptions(x, options);
+
+    var isFile = opts.isFile || defaultIsFile;
+    var readFileSync = opts.readFileSync || fs.readFileSync;
+    var isDirectory = opts.isDirectory || defaultIsDir;
+    var realpathSync = opts.realpathSync || defaultRealpathSync;
+    var packageIterator = opts.packageIterator;
+
+    var extensions = opts.extensions || ['.js'];
+    var basedir = opts.basedir || path.dirname(caller());
+    var parent = opts.filename || basedir;
+
+    opts.paths = opts.paths || [];
+
+    // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory
+    var absoluteStart = maybeRealpathSync(realpathSync, path.resolve(basedir), opts);
+
+    if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) {
+        var res = path.resolve(absoluteStart, x);
+        if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/';
+        var m = loadAsFileSync(res) || loadAsDirectorySync(res);
+        if (m) return maybeRealpathSync(realpathSync, m, opts);
+    } else if (isCore(x)) {
+        return x;
+    } else {
+        var n = loadNodeModulesSync(x, absoluteStart);
+        if (n) return maybeRealpathSync(realpathSync, n, opts);
+    }
+
+    var err = new Error("Cannot find module '" + x + "' from '" + parent + "'");
+    err.code = 'MODULE_NOT_FOUND';
+    throw err;
+
+    function loadAsFileSync(x) {
+        var pkg = loadpkg(path.dirname(x));
+
+        if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) {
+            var rfile = path.relative(pkg.dir, x);
+            var r = opts.pathFilter(pkg.pkg, x, rfile);
+            if (r) {
+                x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign
+            }
+        }
+
+        if (isFile(x)) {
+            return x;
+        }
+
+        for (var i = 0; i < extensions.length; i++) {
+            var file = x + extensions[i];
+            if (isFile(file)) {
+                return file;
+            }
+        }
+    }
+
+    function loadpkg(dir) {
+        if (dir === '' || dir === '/') return;
+        if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) {
+            return;
+        }
+        if ((/[/\\]node_modules[/\\]*$/).test(dir)) return;
+
+        var pkgfile = path.join(maybeRealpathSync(realpathSync, dir, opts), 'package.json');
+
+        if (!isFile(pkgfile)) {
+            return loadpkg(path.dirname(dir));
+        }
+
+        var body = readFileSync(pkgfile);
+
+        try {
+            var pkg = JSON.parse(body);
+        } catch (jsonErr) {}
+
+        if (pkg && opts.packageFilter) {
+            // v2 will pass pkgfile
+            pkg = opts.packageFilter(pkg, /*pkgfile,*/ dir); // eslint-disable-line spaced-comment
+        }
+
+        return { pkg: pkg, dir: dir };
+    }
+
+    function loadAsDirectorySync(x) {
+        var pkgfile = path.join(maybeRealpathSync(realpathSync, x, opts), '/package.json');
+        if (isFile(pkgfile)) {
+            try {
+                var body = readFileSync(pkgfile, 'UTF8');
+                var pkg = JSON.parse(body);
+            } catch (e) {}
+
+            if (pkg && opts.packageFilter) {
+                // v2 will pass pkgfile
+                pkg = opts.packageFilter(pkg, /*pkgfile,*/ x); // eslint-disable-line spaced-comment
+            }
+
+            if (pkg && pkg.main) {
+                if (typeof pkg.main !== 'string') {
+                    var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string');
+                    mainError.code = 'INVALID_PACKAGE_MAIN';
+                    throw mainError;
+                }
+                if (pkg.main === '.' || pkg.main === './') {
+                    pkg.main = 'index';
+                }
+                try {
+                    var m = loadAsFileSync(path.resolve(x, pkg.main));
+                    if (m) return m;
+                    var n = loadAsDirectorySync(path.resolve(x, pkg.main));
+                    if (n) return n;
+                } catch (e) {}
+            }
+        }
+
+        return loadAsFileSync(path.join(x, '/index'));
+    }
+
+    function loadNodeModulesSync(x, start) {
+        var thunk = function () { return getPackageCandidates(x, start, opts); };
+        var dirs = packageIterator ? packageIterator(x, start, thunk, opts) : thunk();
+
+        for (var i = 0; i < dirs.length; i++) {
+            var dir = dirs[i];
+            if (isDirectory(path.dirname(dir))) {
+                var m = loadAsFileSync(dir);
+                if (m) return m;
+                var n = loadAsDirectorySync(dir);
+                if (n) return n;
+            }
+        }
+    }
+};
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/package.json
new file mode 100644
index 0000000..b6d3bec
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/package.json
@@ -0,0 +1,47 @@
+{
+	"name": "resolve",
+	"description": "resolve like require.resolve() on behalf of files asynchronously and synchronously",
+	"version": "1.17.0",
+	"repository": {
+		"type": "git",
+		"url": "git://github.com/browserify/resolve.git"
+	},
+	"main": "index.js",
+	"keywords": [
+		"resolve",
+		"require",
+		"node",
+		"module"
+	],
+	"scripts": {
+		"prepublish": "safe-publish-latest",
+		"lint": "eslint .",
+		"pretests-only": "cd ./test/resolver/nested_symlinks && node mylib/sync && node mylib/async",
+		"tests-only": "tape test/*.js",
+		"pretest": "npm run lint",
+		"test": "npm run --silent tests-only",
+		"posttest": "npm run test:multirepo",
+		"test:multirepo": "cd ./test/resolver/multirepo && npm install && npm test"
+	},
+	"devDependencies": {
+		"@ljharb/eslint-config": "^16.0.0",
+		"array.prototype.map": "^1.0.2",
+		"eslint": "^6.8.0",
+		"object-keys": "^1.1.1",
+		"safe-publish-latest": "^1.1.4",
+		"tap": "0.4.13",
+		"tape": "^5.0.0-next.5"
+	},
+	"license": "MIT",
+	"author": {
+		"name": "James Halliday",
+		"email": "mail@substack.net",
+		"url": "http://substack.net"
+	},
+	"funding": {
+		"url": "https://github.com/sponsors/ljharb"
+	},
+	"dependencies": {
+		"path-parse": "^1.0.6"
+	}
+}
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/readme.markdown b/node_modules/eslint-plugin-import/node_modules/resolve/readme.markdown
new file mode 100644
index 0000000..5e1aea3
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/readme.markdown
@@ -0,0 +1,242 @@
+# resolve
+
+implements the [node `require.resolve()`
+algorithm](https://nodejs.org/api/modules.html#modules_all_together)
+such that you can `require.resolve()` on behalf of a file asynchronously and
+synchronously
+
+[![build status](https://secure.travis-ci.org/browserify/resolve.png)](http://travis-ci.org/browserify/resolve)
+
+# example
+
+asynchronously resolve:
+
+```js
+var resolve = require('resolve');
+resolve('tap', { basedir: __dirname }, function (err, res) {
+    if (err) console.error(err);
+    else console.log(res);
+});
+```
+
+```
+$ node example/async.js
+/home/substack/projects/node-resolve/node_modules/tap/lib/main.js
+```
+
+synchronously resolve:
+
+```js
+var resolve = require('resolve');
+var res = resolve.sync('tap', { basedir: __dirname });
+console.log(res);
+```
+
+```
+$ node example/sync.js
+/home/substack/projects/node-resolve/node_modules/tap/lib/main.js
+```
+
+# methods
+
+```js
+var resolve = require('resolve');
+```
+
+## resolve(id, opts={}, cb)
+
+Asynchronously resolve the module path string `id` into `cb(err, res [, pkg])`, where `pkg` (if defined) is the data from `package.json`.
+
+options are:
+
+* opts.basedir - directory to begin resolving from
+
+* opts.package - `package.json` data applicable to the module being loaded
+
+* opts.extensions - array of file extensions to search in order
+
+* opts.readFile - how to read files asynchronously
+
+* opts.isFile - function to asynchronously test whether a file exists
+
+* opts.isDirectory - function to asynchronously test whether a directory exists
+
+* opts.realpath - function to asynchronously resolve a potential symlink to its real path
+
+* `opts.packageFilter(pkg, pkgfile, dir)` - transform the parsed package.json contents before looking at the "main" field
+  * pkg - package data
+  * pkgfile - path to package.json
+  * dir - directory for package.json
+
+* `opts.pathFilter(pkg, path, relativePath)` - transform a path within a package
+  * pkg - package data
+  * path - the path being resolved
+  * relativePath - the path relative from the package.json location
+  * returns - a relative path that will be joined from the package.json location
+
+* opts.paths - require.paths array to use if nothing is found on the normal `node_modules` recursive walk (probably don't use this)
+
+  For advanced users, `paths` can also be a `opts.paths(request, start, opts)` function
+    * request - the import specifier being resolved
+    * start - lookup path
+    * getNodeModulesDirs - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution
+    * opts - the resolution options
+
+* `opts.packageIterator(request, start, opts)` - return the list of candidate paths where the packages sources may be found (probably don't use this)
+    * request - the import specifier being resolved
+    * start - lookup path
+    * getPackageCandidates - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution
+    * opts - the resolution options
+
+* opts.moduleDirectory - directory (or directories) in which to recursively look for modules. default: `"node_modules"`
+
+* opts.preserveSymlinks - if true, doesn't resolve `basedir` to real path before resolving.
+This is the way Node resolves dependencies when executed with the [--preserve-symlinks](https://nodejs.org/api/all.html#cli_preserve_symlinks) flag.
+**Note:** this property is currently `true` by default but it will be changed to
+`false` in the next major version because *Node's resolution algorithm does not preserve symlinks by default*.
+
+default `opts` values:
+
+```js
+{
+    paths: [],
+    basedir: __dirname,
+    extensions: ['.js'],
+    readFile: fs.readFile,
+    isFile: function isFile(file, cb) {
+        fs.stat(file, function (err, stat) {
+            if (!err) {
+                return cb(null, stat.isFile() || stat.isFIFO());
+            }
+            if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false);
+            return cb(err);
+        });
+    },
+    isDirectory: function isDirectory(dir, cb) {
+        fs.stat(dir, function (err, stat) {
+            if (!err) {
+                return cb(null, stat.isDirectory());
+            }
+            if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false);
+            return cb(err);
+        });
+    },
+    realpath: function realpath(file, cb) {
+       var realpath = typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath;
+       realpath(file, function (realPathErr, realPath) {
+           if (realPathErr && realPathErr.code !== 'ENOENT') cb(realPathErr);
+           else cb(null, realPathErr ? file : realPath);
+       });
+   },
+    moduleDirectory: 'node_modules',
+    preserveSymlinks: true
+}
+```
+
+## resolve.sync(id, opts)
+
+Synchronously resolve the module path string `id`, returning the result and
+throwing an error when `id` can't be resolved.
+
+options are:
+
+* opts.basedir - directory to begin resolving from
+
+* opts.extensions - array of file extensions to search in order
+
+* opts.readFile - how to read files synchronously
+
+* opts.isFile - function to synchronously test whether a file exists
+
+* opts.isDirectory - function to synchronously test whether a directory exists
+
+* opts.realpathSync - function to synchronously resolve a potential symlink to its real path
+
+* `opts.packageFilter(pkg, dir)` - transform the parsed package.json contents before looking at the "main" field
+  * pkg - package data
+  * dir - directory for package.json (Note: the second argument will change to "pkgfile" in v2)
+
+* `opts.pathFilter(pkg, path, relativePath)` - transform a path within a package
+  * pkg - package data
+  * path - the path being resolved
+  * relativePath - the path relative from the package.json location
+  * returns - a relative path that will be joined from the package.json location
+
+* opts.paths - require.paths array to use if nothing is found on the normal `node_modules` recursive walk (probably don't use this)
+
+  For advanced users, `paths` can also be a `opts.paths(request, start, opts)` function
+    * request - the import specifier being resolved
+    * start - lookup path
+    * getNodeModulesDirs - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution
+    * opts - the resolution options
+
+* `opts.packageIterator(request, start, opts)` - return the list of candidate paths where the packages sources may be found (probably don't use this)
+    * request - the import specifier being resolved
+    * start - lookup path
+    * getPackageCandidates - a thunk (no-argument function) that returns the paths using standard `node_modules` resolution
+    * opts - the resolution options
+
+* opts.moduleDirectory - directory (or directories) in which to recursively look for modules. default: `"node_modules"`
+
+* opts.preserveSymlinks - if true, doesn't resolve `basedir` to real path before resolving.
+This is the way Node resolves dependencies when executed with the [--preserve-symlinks](https://nodejs.org/api/all.html#cli_preserve_symlinks) flag.
+**Note:** this property is currently `true` by default but it will be changed to
+`false` in the next major version because *Node's resolution algorithm does not preserve symlinks by default*.
+
+default `opts` values:
+
+```js
+{
+    paths: [],
+    basedir: __dirname,
+    extensions: ['.js'],
+    readFileSync: fs.readFileSync,
+    isFile: function isFile(file) {
+        try {
+            var stat = fs.statSync(file);
+        } catch (e) {
+            if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
+            throw e;
+        }
+        return stat.isFile() || stat.isFIFO();
+    },
+    isDirectory: function isDirectory(dir) {
+        try {
+            var stat = fs.statSync(dir);
+        } catch (e) {
+            if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
+            throw e;
+        }
+        return stat.isDirectory();
+    },
+    realpathSync: function realpathSync(file) {
+        try {
+            var realpath = typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync;
+            return realpath(file);
+        } catch (realPathErr) {
+            if (realPathErr.code !== 'ENOENT') {
+                throw realPathErr;
+            }
+        }
+        return file;
+    },
+    moduleDirectory: 'node_modules',
+    preserveSymlinks: true
+}
+```
+
+## resolve.isCore(pkg)
+
+Return whether a package is in core.
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```sh
+npm install resolve
+```
+
+# license
+
+MIT
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/.eslintrc b/node_modules/eslint-plugin-import/node_modules/resolve/test/.eslintrc
new file mode 100644
index 0000000..ddd262d
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/.eslintrc
@@ -0,0 +1,5 @@
+{
+    "rules": {
+        "max-lines": 0
+    }
+}
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/core.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/core.js
new file mode 100644
index 0000000..4c111e1
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/core.js
@@ -0,0 +1,85 @@
+var test = require('tape');
+var keys = require('object-keys');
+var resolve = require('../');
+
+test('core modules', function (t) {
+    t.test('isCore()', function (st) {
+        st.ok(resolve.isCore('fs'));
+        st.ok(resolve.isCore('net'));
+        st.ok(resolve.isCore('http'));
+
+        st.ok(!resolve.isCore('seq'));
+        st.ok(!resolve.isCore('../'));
+
+        st.ok(!resolve.isCore('toString'));
+
+        st.end();
+    });
+
+    t.test('core list', function (st) {
+        var cores = keys(resolve.core);
+        st.plan(cores.length);
+
+        for (var i = 0; i < cores.length; ++i) {
+            var mod = cores[i];
+            if (resolve.core[mod]) {
+                st.doesNotThrow(
+                    function () { require(mod); }, // eslint-disable-line no-loop-func
+                    mod + ' supported; requiring does not throw'
+                );
+            } else {
+                st.throws(
+                    function () { require(mod); }, // eslint-disable-line no-loop-func
+                    mod + ' not supported; requiring throws'
+                );
+            }
+        }
+
+        st.end();
+    });
+
+    t.test('core via repl module', { skip: !resolve.core.repl }, function (st) {
+        var libs = require('repl')._builtinLibs; // eslint-disable-line no-underscore-dangle
+        if (!libs) {
+            st.skip('module.builtinModules does not exist');
+            return st.end();
+        }
+        for (var i = 0; i < libs.length; ++i) {
+            var mod = libs[i];
+            st.ok(resolve.core[mod], mod + ' is a core module');
+            st.doesNotThrow(
+                function () { require(mod); }, // eslint-disable-line no-loop-func
+                'requiring ' + mod + ' does not throw'
+            );
+        }
+        st.end();
+    });
+
+    t.test('core via builtinModules list', { skip: !resolve.core.module }, function (st) {
+        var libs = require('module').builtinModules;
+        if (!libs) {
+            st.skip('module.builtinModules does not exist');
+            return st.end();
+        }
+        var blacklist = [
+            '_debug_agent',
+            'v8/tools/tickprocessor-driver',
+            'v8/tools/SourceMap',
+            'v8/tools/tickprocessor',
+            'v8/tools/profile'
+        ];
+        for (var i = 0; i < libs.length; ++i) {
+            var mod = libs[i];
+            if (blacklist.indexOf(mod) === -1) {
+                st.ok(resolve.core[mod], mod + ' is a core module');
+                st.doesNotThrow(
+                    function () { require(mod); }, // eslint-disable-line no-loop-func
+                    'requiring ' + mod + ' does not throw'
+                );
+            }
+        }
+        st.end();
+    });
+
+    t.end();
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/dotdot.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/dotdot.js
new file mode 100644
index 0000000..3080665
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/dotdot.js
@@ -0,0 +1,29 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('dotdot', function (t) {
+    t.plan(4);
+    var dir = path.join(__dirname, '/dotdot/abc');
+
+    resolve('..', { basedir: dir }, function (err, res, pkg) {
+        t.ifError(err);
+        t.equal(res, path.join(__dirname, 'dotdot/index.js'));
+    });
+
+    resolve('.', { basedir: dir }, function (err, res, pkg) {
+        t.ifError(err);
+        t.equal(res, path.join(dir, 'index.js'));
+    });
+});
+
+test('dotdot sync', function (t) {
+    t.plan(2);
+    var dir = path.join(__dirname, '/dotdot/abc');
+
+    var a = resolve.sync('..', { basedir: dir });
+    t.equal(a, path.join(__dirname, 'dotdot/index.js'));
+
+    var b = resolve.sync('.', { basedir: dir });
+    t.equal(b, path.join(dir, 'index.js'));
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/dotdot/abc/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/dotdot/abc/index.js
new file mode 100644
index 0000000..67f2534
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/dotdot/abc/index.js
@@ -0,0 +1,2 @@
+var x = require('..');
+console.log(x);
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/dotdot/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/dotdot/index.js
new file mode 100644
index 0000000..643f9fc
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/dotdot/index.js
@@ -0,0 +1 @@
+module.exports = 'whatever';
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/faulty_basedir.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/faulty_basedir.js
new file mode 100644
index 0000000..5f2141a
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/faulty_basedir.js
@@ -0,0 +1,29 @@
+var test = require('tape');
+var path = require('path');
+var resolve = require('../');
+
+test('faulty basedir must produce error in windows', { skip: process.platform !== 'win32' }, function (t) {
+    t.plan(1);
+
+    var resolverDir = 'C:\\a\\b\\c\\d';
+
+    resolve('tape/lib/test.js', { basedir: resolverDir }, function (err, res, pkg) {
+        t.equal(!!err, true);
+    });
+});
+
+test('non-existent basedir should not throw when preserveSymlinks is false', function (t) {
+    t.plan(2);
+
+    var opts = {
+        basedir: path.join(path.sep, 'unreal', 'path', 'that', 'does', 'not', 'exist'),
+        preserveSymlinks: false
+    };
+
+    var module = './dotdot/abc';
+
+    resolve(module, opts, function (err, res) {
+        t.equal(err.code, 'MODULE_NOT_FOUND');
+        t.equal(res, undefined);
+    });
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/filter.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/filter.js
new file mode 100644
index 0000000..8f8cccd
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/filter.js
@@ -0,0 +1,34 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('filter', function (t) {
+    t.plan(4);
+    var dir = path.join(__dirname, 'resolver');
+    var packageFilterArgs;
+    resolve('./baz', {
+        basedir: dir,
+        packageFilter: function (pkg, pkgfile) {
+            pkg.main = 'doom'; // eslint-disable-line no-param-reassign
+            packageFilterArgs = [pkg, pkgfile];
+            return pkg;
+        }
+    }, function (err, res, pkg) {
+        if (err) t.fail(err);
+
+        t.equal(res, path.join(dir, 'baz/doom.js'), 'changing the package "main" works');
+
+        var packageData = packageFilterArgs[0];
+        t.equal(pkg, packageData, 'first packageFilter argument is "pkg"');
+        t.equal(packageData.main, 'doom', 'package "main" was altered');
+
+        var packageFile = packageFilterArgs[1];
+        t.equal(
+            packageFile,
+            path.join(dir, 'baz/package.json'),
+            'second packageFilter argument is "pkgfile"'
+        );
+
+        t.end();
+    });
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/filter_sync.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/filter_sync.js
new file mode 100644
index 0000000..8a43b98
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/filter_sync.js
@@ -0,0 +1,33 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('filter', function (t) {
+    var dir = path.join(__dirname, 'resolver');
+    var packageFilterArgs;
+    var res = resolve.sync('./baz', {
+        basedir: dir,
+        // NOTE: in v2.x, this will be `pkg, pkgfile, dir`, but must remain "broken" here in v1.x for compatibility
+        packageFilter: function (pkg, /*pkgfile,*/ dir) { // eslint-disable-line spaced-comment
+            pkg.main = 'doom'; // eslint-disable-line no-param-reassign
+            packageFilterArgs = 'is 1.x' ? [pkg, dir] : [pkg, pkgfile, dir]; // eslint-disable-line no-constant-condition, no-undef
+            return pkg;
+        }
+    });
+
+    t.equal(res, path.join(dir, 'baz/doom.js'), 'changing the package "main" works');
+
+    var packageData = packageFilterArgs[0];
+    t.equal(packageData.main, 'doom', 'package "main" was altered');
+
+    if (!'is 1.x') { // eslint-disable-line no-constant-condition
+        var packageFile = packageFilterArgs[1];
+        t.equal(packageFile, path.join(dir, 'baz', 'package.json'), 'package.json path is correct');
+    }
+
+    var packageDir = packageFilterArgs['is 1.x' ? 1 : 2]; // eslint-disable-line no-constant-condition
+    // eslint-disable-next-line no-constant-condition
+    t.equal(packageDir, path.join(dir, 'baz'), ('is 1.x' ? 'second' : 'third') + ' packageFilter argument is "dir"');
+
+    t.end();
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/mock.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/mock.js
new file mode 100644
index 0000000..b9f17fe
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/mock.js
@@ -0,0 +1,239 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('mock', function (t) {
+    t.plan(8);
+
+    var files = {};
+    files[path.resolve('/foo/bar/baz.js')] = 'beep';
+
+    var dirs = {};
+    dirs[path.resolve('/foo/bar')] = true;
+
+    function opts(basedir) {
+        return {
+            basedir: path.resolve(basedir),
+            isFile: function (file, cb) {
+                cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file)));
+            },
+            isDirectory: function (dir, cb) {
+                cb(null, !!dirs[path.resolve(dir)]);
+            },
+            readFile: function (file, cb) {
+                cb(null, files[path.resolve(file)]);
+            },
+            realpath: function (file, cb) {
+                cb(null, file);
+            }
+        };
+    }
+
+    resolve('./baz', opts('/foo/bar'), function (err, res, pkg) {
+        if (err) return t.fail(err);
+        t.equal(res, path.resolve('/foo/bar/baz.js'));
+        t.equal(pkg, undefined);
+    });
+
+    resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) {
+        if (err) return t.fail(err);
+        t.equal(res, path.resolve('/foo/bar/baz.js'));
+        t.equal(pkg, undefined);
+    });
+
+    resolve('baz', opts('/foo/bar'), function (err, res) {
+        t.equal(err.message, "Cannot find module 'baz' from '" + path.resolve('/foo/bar') + "'");
+        t.equal(err.code, 'MODULE_NOT_FOUND');
+    });
+
+    resolve('../baz', opts('/foo/bar'), function (err, res) {
+        t.equal(err.message, "Cannot find module '../baz' from '" + path.resolve('/foo/bar') + "'");
+        t.equal(err.code, 'MODULE_NOT_FOUND');
+    });
+});
+
+test('mock from package', function (t) {
+    t.plan(8);
+
+    var files = {};
+    files[path.resolve('/foo/bar/baz.js')] = 'beep';
+
+    var dirs = {};
+    dirs[path.resolve('/foo/bar')] = true;
+
+    function opts(basedir) {
+        return {
+            basedir: path.resolve(basedir),
+            isFile: function (file, cb) {
+                cb(null, Object.prototype.hasOwnProperty.call(files, file));
+            },
+            isDirectory: function (dir, cb) {
+                cb(null, !!dirs[path.resolve(dir)]);
+            },
+            'package': { main: 'bar' },
+            readFile: function (file, cb) {
+                cb(null, files[file]);
+            },
+            realpath: function (file, cb) {
+                cb(null, file);
+            }
+        };
+    }
+
+    resolve('./baz', opts('/foo/bar'), function (err, res, pkg) {
+        if (err) return t.fail(err);
+        t.equal(res, path.resolve('/foo/bar/baz.js'));
+        t.equal(pkg && pkg.main, 'bar');
+    });
+
+    resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) {
+        if (err) return t.fail(err);
+        t.equal(res, path.resolve('/foo/bar/baz.js'));
+        t.equal(pkg && pkg.main, 'bar');
+    });
+
+    resolve('baz', opts('/foo/bar'), function (err, res) {
+        t.equal(err.message, "Cannot find module 'baz' from '" + path.resolve('/foo/bar') + "'");
+        t.equal(err.code, 'MODULE_NOT_FOUND');
+    });
+
+    resolve('../baz', opts('/foo/bar'), function (err, res) {
+        t.equal(err.message, "Cannot find module '../baz' from '" + path.resolve('/foo/bar') + "'");
+        t.equal(err.code, 'MODULE_NOT_FOUND');
+    });
+});
+
+test('mock package', function (t) {
+    t.plan(2);
+
+    var files = {};
+    files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep';
+    files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({
+        main: './baz.js'
+    });
+
+    var dirs = {};
+    dirs[path.resolve('/foo')] = true;
+    dirs[path.resolve('/foo/node_modules')] = true;
+
+    function opts(basedir) {
+        return {
+            basedir: path.resolve(basedir),
+            isFile: function (file, cb) {
+                cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file)));
+            },
+            isDirectory: function (dir, cb) {
+                cb(null, !!dirs[path.resolve(dir)]);
+            },
+            readFile: function (file, cb) {
+                cb(null, files[path.resolve(file)]);
+            },
+            realpath: function (file, cb) {
+                cb(null, file);
+            }
+        };
+    }
+
+    resolve('bar', opts('/foo'), function (err, res, pkg) {
+        if (err) return t.fail(err);
+        t.equal(res, path.resolve('/foo/node_modules/bar/baz.js'));
+        t.equal(pkg && pkg.main, './baz.js');
+    });
+});
+
+test('mock package from package', function (t) {
+    t.plan(2);
+
+    var files = {};
+    files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep';
+    files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({
+        main: './baz.js'
+    });
+
+    var dirs = {};
+    dirs[path.resolve('/foo')] = true;
+    dirs[path.resolve('/foo/node_modules')] = true;
+
+    function opts(basedir) {
+        return {
+            basedir: path.resolve(basedir),
+            isFile: function (file, cb) {
+                cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file)));
+            },
+            isDirectory: function (dir, cb) {
+                cb(null, !!dirs[path.resolve(dir)]);
+            },
+            'package': { main: 'bar' },
+            readFile: function (file, cb) {
+                cb(null, files[path.resolve(file)]);
+            },
+            realpath: function (file, cb) {
+                cb(null, file);
+            }
+        };
+    }
+
+    resolve('bar', opts('/foo'), function (err, res, pkg) {
+        if (err) return t.fail(err);
+        t.equal(res, path.resolve('/foo/node_modules/bar/baz.js'));
+        t.equal(pkg && pkg.main, './baz.js');
+    });
+});
+
+test('symlinked', function (t) {
+    t.plan(4);
+
+    var files = {};
+    files[path.resolve('/foo/bar/baz.js')] = 'beep';
+    files[path.resolve('/foo/bar/symlinked/baz.js')] = 'beep';
+
+    var dirs = {};
+    dirs[path.resolve('/foo/bar')] = true;
+    dirs[path.resolve('/foo/bar/symlinked')] = true;
+
+    function opts(basedir) {
+        return {
+            preserveSymlinks: false,
+            basedir: path.resolve(basedir),
+            isFile: function (file, cb) {
+                cb(null, Object.prototype.hasOwnProperty.call(files, path.resolve(file)));
+            },
+            isDirectory: function (dir, cb) {
+                cb(null, !!dirs[path.resolve(dir)]);
+            },
+            readFile: function (file, cb) {
+                cb(null, files[path.resolve(file)]);
+            },
+            realpath: function (file, cb) {
+                var resolved = path.resolve(file);
+
+                if (resolved.indexOf('symlinked') >= 0) {
+                    cb(null, resolved);
+                    return;
+                }
+
+                var ext = path.extname(resolved);
+
+                if (ext) {
+                    var dir = path.dirname(resolved);
+                    var base = path.basename(resolved);
+                    cb(null, path.join(dir, 'symlinked', base));
+                } else {
+                    cb(null, path.join(resolved, 'symlinked'));
+                }
+            }
+        };
+    }
+
+    resolve('./baz', opts('/foo/bar'), function (err, res, pkg) {
+        if (err) return t.fail(err);
+        t.equal(res, path.resolve('/foo/bar/symlinked/baz.js'));
+        t.equal(pkg, undefined);
+    });
+
+    resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) {
+        if (err) return t.fail(err);
+        t.equal(res, path.resolve('/foo/bar/symlinked/baz.js'));
+        t.equal(pkg, undefined);
+    });
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/mock_sync.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/mock_sync.js
new file mode 100644
index 0000000..fcf8114
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/mock_sync.js
@@ -0,0 +1,141 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('mock', function (t) {
+    t.plan(4);
+
+    var files = {};
+    files[path.resolve('/foo/bar/baz.js')] = 'beep';
+
+    var dirs = {};
+    dirs[path.resolve('/foo/bar')] = true;
+
+    function opts(basedir) {
+        return {
+            basedir: path.resolve(basedir),
+            isFile: function (file) {
+                return Object.prototype.hasOwnProperty.call(files, path.resolve(file));
+            },
+            isDirectory: function (dir) {
+                return !!dirs[path.resolve(dir)];
+            },
+            readFileSync: function (file) {
+                return files[path.resolve(file)];
+            },
+            realpathSync: function (file) {
+                return file;
+            }
+        };
+    }
+
+    t.equal(
+        resolve.sync('./baz', opts('/foo/bar')),
+        path.resolve('/foo/bar/baz.js')
+    );
+
+    t.equal(
+        resolve.sync('./baz.js', opts('/foo/bar')),
+        path.resolve('/foo/bar/baz.js')
+    );
+
+    t.throws(function () {
+        resolve.sync('baz', opts('/foo/bar'));
+    });
+
+    t.throws(function () {
+        resolve.sync('../baz', opts('/foo/bar'));
+    });
+});
+
+test('mock package', function (t) {
+    t.plan(1);
+
+    var files = {};
+    files[path.resolve('/foo/node_modules/bar/baz.js')] = 'beep';
+    files[path.resolve('/foo/node_modules/bar/package.json')] = JSON.stringify({
+        main: './baz.js'
+    });
+
+    var dirs = {};
+    dirs[path.resolve('/foo')] = true;
+    dirs[path.resolve('/foo/node_modules')] = true;
+
+    function opts(basedir) {
+        return {
+            basedir: path.resolve(basedir),
+            isFile: function (file) {
+                return Object.prototype.hasOwnProperty.call(files, path.resolve(file));
+            },
+            isDirectory: function (dir) {
+                return !!dirs[path.resolve(dir)];
+            },
+            readFileSync: function (file) {
+                return files[path.resolve(file)];
+            },
+            realpathSync: function (file) {
+                return file;
+            }
+        };
+    }
+
+    t.equal(
+        resolve.sync('bar', opts('/foo')),
+        path.resolve('/foo/node_modules/bar/baz.js')
+    );
+});
+
+test('symlinked', function (t) {
+    t.plan(2);
+
+    var files = {};
+    files[path.resolve('/foo/bar/baz.js')] = 'beep';
+    files[path.resolve('/foo/bar/symlinked/baz.js')] = 'beep';
+
+    var dirs = {};
+    dirs[path.resolve('/foo/bar')] = true;
+    dirs[path.resolve('/foo/bar/symlinked')] = true;
+
+    function opts(basedir) {
+        return {
+            preserveSymlinks: false,
+            basedir: path.resolve(basedir),
+            isFile: function (file) {
+                return Object.prototype.hasOwnProperty.call(files, path.resolve(file));
+            },
+            isDirectory: function (dir) {
+                return !!dirs[path.resolve(dir)];
+            },
+            readFileSync: function (file) {
+                return files[path.resolve(file)];
+            },
+            realpathSync: function (file) {
+                var resolved = path.resolve(file);
+
+                if (resolved.indexOf('symlinked') >= 0) {
+                    return resolved;
+                }
+
+                var ext = path.extname(resolved);
+
+                if (ext) {
+                    var dir = path.dirname(resolved);
+                    var base = path.basename(resolved);
+                    return path.join(dir, 'symlinked', base);
+                } else {
+                    return path.join(resolved, 'symlinked');
+                }
+            }
+        };
+    }
+
+    t.equal(
+        resolve.sync('./baz', opts('/foo/bar')),
+        path.resolve('/foo/bar/symlinked/baz.js')
+    );
+
+    t.equal(
+        resolve.sync('./baz.js', opts('/foo/bar')),
+        path.resolve('/foo/bar/symlinked/baz.js')
+    );
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir.js
new file mode 100644
index 0000000..b50e5bb
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir.js
@@ -0,0 +1,56 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('moduleDirectory strings', function (t) {
+    t.plan(4);
+    var dir = path.join(__dirname, 'module_dir');
+    var xopts = {
+        basedir: dir,
+        moduleDirectory: 'xmodules'
+    };
+    resolve('aaa', xopts, function (err, res, pkg) {
+        t.ifError(err);
+        t.equal(res, path.join(dir, '/xmodules/aaa/index.js'));
+    });
+
+    var yopts = {
+        basedir: dir,
+        moduleDirectory: 'ymodules'
+    };
+    resolve('aaa', yopts, function (err, res, pkg) {
+        t.ifError(err);
+        t.equal(res, path.join(dir, '/ymodules/aaa/index.js'));
+    });
+});
+
+test('moduleDirectory array', function (t) {
+    t.plan(6);
+    var dir = path.join(__dirname, 'module_dir');
+    var aopts = {
+        basedir: dir,
+        moduleDirectory: ['xmodules', 'ymodules', 'zmodules']
+    };
+    resolve('aaa', aopts, function (err, res, pkg) {
+        t.ifError(err);
+        t.equal(res, path.join(dir, '/xmodules/aaa/index.js'));
+    });
+
+    var bopts = {
+        basedir: dir,
+        moduleDirectory: ['zmodules', 'ymodules', 'xmodules']
+    };
+    resolve('aaa', bopts, function (err, res, pkg) {
+        t.ifError(err);
+        t.equal(res, path.join(dir, '/ymodules/aaa/index.js'));
+    });
+
+    var copts = {
+        basedir: dir,
+        moduleDirectory: ['xmodules', 'ymodules', 'zmodules']
+    };
+    resolve('bbb', copts, function (err, res, pkg) {
+        t.ifError(err);
+        t.equal(res, path.join(dir, '/zmodules/bbb/main.js'));
+    });
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir/xmodules/aaa/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir/xmodules/aaa/index.js
new file mode 100644
index 0000000..dd7cf7b
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir/xmodules/aaa/index.js
@@ -0,0 +1 @@
+module.exports = function (x) { return x * 100; };
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir/ymodules/aaa/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir/ymodules/aaa/index.js
new file mode 100644
index 0000000..ef2d4d4
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir/ymodules/aaa/index.js
@@ -0,0 +1 @@
+module.exports = function (x) { return x + 100; };
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir/zmodules/bbb/main.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir/zmodules/bbb/main.js
new file mode 100644
index 0000000..e8ba629
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir/zmodules/bbb/main.js
@@ -0,0 +1 @@
+module.exports = function (n) { return n * 111; };
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir/zmodules/bbb/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir/zmodules/bbb/package.json
new file mode 100644
index 0000000..c13b8cf
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/module_dir/zmodules/bbb/package.json
@@ -0,0 +1,3 @@
+{
+  "main": "main.js"
+}
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/node-modules-paths.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/node-modules-paths.js
new file mode 100644
index 0000000..675441d
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/node-modules-paths.js
@@ -0,0 +1,143 @@
+var test = require('tape');
+var path = require('path');
+var parse = path.parse || require('path-parse');
+var keys = require('object-keys');
+
+var nodeModulesPaths = require('../lib/node-modules-paths');
+
+var verifyDirs = function verifyDirs(t, start, dirs, moduleDirectories, paths) {
+    var moduleDirs = [].concat(moduleDirectories || 'node_modules');
+    if (paths) {
+        for (var k = 0; k < paths.length; ++k) {
+            moduleDirs.push(path.basename(paths[k]));
+        }
+    }
+
+    var foundModuleDirs = {};
+    var uniqueDirs = {};
+    var parsedDirs = {};
+    for (var i = 0; i < dirs.length; ++i) {
+        var parsed = parse(dirs[i]);
+        if (!foundModuleDirs[parsed.base]) { foundModuleDirs[parsed.base] = 0; }
+        foundModuleDirs[parsed.base] += 1;
+        parsedDirs[parsed.dir] = true;
+        uniqueDirs[dirs[i]] = true;
+    }
+    t.equal(keys(parsedDirs).length >= start.split(path.sep).length, true, 'there are >= dirs than "start" has');
+    var foundModuleDirNames = keys(foundModuleDirs);
+    t.deepEqual(foundModuleDirNames, moduleDirs, 'all desired module dirs were found');
+    t.equal(keys(uniqueDirs).length, dirs.length, 'all dirs provided were unique');
+
+    var counts = {};
+    for (var j = 0; j < foundModuleDirNames.length; ++j) {
+        counts[foundModuleDirs[j]] = true;
+    }
+    t.equal(keys(counts).length, 1, 'all found module directories had the same count');
+};
+
+test('node-modules-paths', function (t) {
+    t.test('no options', function (t) {
+        var start = path.join(__dirname, 'resolver');
+        var dirs = nodeModulesPaths(start);
+
+        verifyDirs(t, start, dirs);
+
+        t.end();
+    });
+
+    t.test('empty options', function (t) {
+        var start = path.join(__dirname, 'resolver');
+        var dirs = nodeModulesPaths(start, {});
+
+        verifyDirs(t, start, dirs);
+
+        t.end();
+    });
+
+    t.test('with paths=array option', function (t) {
+        var start = path.join(__dirname, 'resolver');
+        var paths = ['a', 'b'];
+        var dirs = nodeModulesPaths(start, { paths: paths });
+
+        verifyDirs(t, start, dirs, null, paths);
+
+        t.end();
+    });
+
+    t.test('with paths=function option', function (t) {
+        var paths = function paths(request, absoluteStart, getNodeModulesDirs, opts) {
+            return getNodeModulesDirs().concat(path.join(absoluteStart, 'not node modules', request));
+        };
+
+        var start = path.join(__dirname, 'resolver');
+        var dirs = nodeModulesPaths(start, { paths: paths }, 'pkg');
+
+        verifyDirs(t, start, dirs, null, [path.join(start, 'not node modules', 'pkg')]);
+
+        t.end();
+    });
+
+    t.test('with paths=function skipping node modules resolution', function (t) {
+        var paths = function paths(request, absoluteStart, getNodeModulesDirs, opts) {
+            return [];
+        };
+        var start = path.join(__dirname, 'resolver');
+        var dirs = nodeModulesPaths(start, { paths: paths });
+        t.deepEqual(dirs, [], 'no node_modules was computed');
+        t.end();
+    });
+
+    t.test('with moduleDirectory option', function (t) {
+        var start = path.join(__dirname, 'resolver');
+        var moduleDirectory = 'not node modules';
+        var dirs = nodeModulesPaths(start, { moduleDirectory: moduleDirectory });
+
+        verifyDirs(t, start, dirs, moduleDirectory);
+
+        t.end();
+    });
+
+    t.test('with 1 moduleDirectory and paths options', function (t) {
+        var start = path.join(__dirname, 'resolver');
+        var paths = ['a', 'b'];
+        var moduleDirectory = 'not node modules';
+        var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectory });
+
+        verifyDirs(t, start, dirs, moduleDirectory, paths);
+
+        t.end();
+    });
+
+    t.test('with 1+ moduleDirectory and paths options', function (t) {
+        var start = path.join(__dirname, 'resolver');
+        var paths = ['a', 'b'];
+        var moduleDirectories = ['not node modules', 'other modules'];
+        var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories });
+
+        verifyDirs(t, start, dirs, moduleDirectories, paths);
+
+        t.end();
+    });
+
+    t.test('combine paths correctly on Windows', function (t) {
+        var start = 'C:\\Users\\username\\myProject\\src';
+        var paths = [];
+        var moduleDirectories = ['node_modules', start];
+        var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories });
+
+        t.equal(dirs.indexOf(path.resolve(start)) > -1, true, 'should contain start dir');
+
+        t.end();
+    });
+
+    t.test('combine paths correctly on non-Windows', { skip: process.platform === 'win32' }, function (t) {
+        var start = '/Users/username/git/myProject/src';
+        var paths = [];
+        var moduleDirectories = ['node_modules', '/Users/username/git/myProject/src'];
+        var dirs = nodeModulesPaths(start, { paths: paths, moduleDirectory: moduleDirectories });
+
+        t.equal(dirs.indexOf(path.resolve(start)) > -1, true, 'should contain start dir');
+
+        t.end();
+    });
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path.js
new file mode 100644
index 0000000..d06aa4e
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path.js
@@ -0,0 +1,70 @@
+var fs = require('fs');
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('$NODE_PATH', function (t) {
+    t.plan(8);
+
+    var isDir = function (dir, cb) {
+        if (dir === '/node_path' || dir === 'node_path/x') {
+            return cb(null, true);
+        }
+        fs.stat(dir, function (err, stat) {
+            if (!err) {
+                return cb(null, stat.isDirectory());
+            }
+            if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false);
+            return cb(err);
+        });
+    };
+
+    resolve('aaa', {
+        paths: [
+            path.join(__dirname, '/node_path/x'),
+            path.join(__dirname, '/node_path/y')
+        ],
+        basedir: __dirname,
+        isDirectory: isDir
+    }, function (err, res) {
+        t.error(err);
+        t.equal(res, path.join(__dirname, '/node_path/x/aaa/index.js'), 'aaa resolves');
+    });
+
+    resolve('bbb', {
+        paths: [
+            path.join(__dirname, '/node_path/x'),
+            path.join(__dirname, '/node_path/y')
+        ],
+        basedir: __dirname,
+        isDirectory: isDir
+    }, function (err, res) {
+        t.error(err);
+        t.equal(res, path.join(__dirname, '/node_path/y/bbb/index.js'), 'bbb resolves');
+    });
+
+    resolve('ccc', {
+        paths: [
+            path.join(__dirname, '/node_path/x'),
+            path.join(__dirname, '/node_path/y')
+        ],
+        basedir: __dirname,
+        isDirectory: isDir
+    }, function (err, res) {
+        t.error(err);
+        t.equal(res, path.join(__dirname, '/node_path/x/ccc/index.js'), 'ccc resolves');
+    });
+
+    // ensure that relative paths still resolve against the regular `node_modules` correctly
+    resolve('tap', {
+        paths: [
+            'node_path'
+        ],
+        basedir: path.join(__dirname, 'node_path/x'),
+        isDirectory: isDir
+    }, function (err, res) {
+        var root = require('tap/package.json').main;
+        t.error(err);
+        t.equal(res, path.resolve(__dirname, '..', 'node_modules/tap', root), 'tap resolves');
+    });
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path/x/aaa/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path/x/aaa/index.js
new file mode 100644
index 0000000..ad70d0b
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path/x/aaa/index.js
@@ -0,0 +1 @@
+module.exports = 'A';
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path/x/ccc/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path/x/ccc/index.js
new file mode 100644
index 0000000..a64132e
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path/x/ccc/index.js
@@ -0,0 +1 @@
+module.exports = 'C';
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path/y/bbb/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path/y/bbb/index.js
new file mode 100644
index 0000000..4d0f32e
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path/y/bbb/index.js
@@ -0,0 +1 @@
+module.exports = 'B';
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path/y/ccc/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path/y/ccc/index.js
new file mode 100644
index 0000000..793315e
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/node_path/y/ccc/index.js
@@ -0,0 +1 @@
+module.exports = 'CY';
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/nonstring.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/nonstring.js
new file mode 100644
index 0000000..ef63c40
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/nonstring.js
@@ -0,0 +1,9 @@
+var test = require('tape');
+var resolve = require('../');
+
+test('nonstring', function (t) {
+    t.plan(1);
+    resolve(555, function (err, res, pkg) {
+        t.ok(err);
+    });
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/pathfilter.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/pathfilter.js
new file mode 100644
index 0000000..16519ae
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/pathfilter.js
@@ -0,0 +1,75 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+var resolverDir = path.join(__dirname, '/pathfilter/deep_ref');
+
+var pathFilterFactory = function (t) {
+    return function (pkg, x, remainder) {
+        t.equal(pkg.version, '1.2.3');
+        t.equal(x, path.join(resolverDir, 'node_modules/deep/ref'));
+        t.equal(remainder, 'ref');
+        return 'alt';
+    };
+};
+
+test('#62: deep module references and the pathFilter', function (t) {
+    t.test('deep/ref.js', function (st) {
+        st.plan(3);
+
+        resolve('deep/ref', { basedir: resolverDir }, function (err, res, pkg) {
+            if (err) st.fail(err);
+
+            st.equal(pkg.version, '1.2.3');
+            st.equal(res, path.join(resolverDir, 'node_modules/deep/ref.js'));
+        });
+
+        var res = resolve.sync('deep/ref', { basedir: resolverDir });
+        st.equal(res, path.join(resolverDir, 'node_modules/deep/ref.js'));
+    });
+
+    t.test('deep/deeper/ref', function (st) {
+        st.plan(4);
+
+        resolve(
+            'deep/deeper/ref',
+            { basedir: resolverDir },
+            function (err, res, pkg) {
+                if (err) t.fail(err);
+                st.notEqual(pkg, undefined);
+                st.equal(pkg.version, '1.2.3');
+                st.equal(res, path.join(resolverDir, 'node_modules/deep/deeper/ref.js'));
+            }
+        );
+
+        var res = resolve.sync(
+            'deep/deeper/ref',
+            { basedir: resolverDir }
+        );
+        st.equal(res, path.join(resolverDir, 'node_modules/deep/deeper/ref.js'));
+    });
+
+    t.test('deep/ref alt', function (st) {
+        st.plan(8);
+
+        var pathFilter = pathFilterFactory(st);
+
+        var res = resolve.sync(
+            'deep/ref',
+            { basedir: resolverDir, pathFilter: pathFilter }
+        );
+        st.equal(res, path.join(resolverDir, 'node_modules/deep/alt.js'));
+
+        resolve(
+            'deep/ref',
+            { basedir: resolverDir, pathFilter: pathFilter },
+            function (err, res, pkg) {
+                if (err) st.fail(err);
+                st.equal(res, path.join(resolverDir, 'node_modules/deep/alt.js'));
+                st.end();
+            }
+        );
+    });
+
+    t.end();
+});
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/pathfilter/deep_ref/main.js
similarity index 100%
copy from node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js
copy to node_modules/eslint-plugin-import/node_modules/resolve/test/pathfilter/deep_ref/main.js
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence.js
new file mode 100644
index 0000000..2febb59
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence.js
@@ -0,0 +1,23 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('precedence', function (t) {
+    t.plan(3);
+    var dir = path.join(__dirname, 'precedence/aaa');
+
+    resolve('./', { basedir: dir }, function (err, res, pkg) {
+        t.ifError(err);
+        t.equal(res, path.join(dir, 'index.js'));
+        t.equal(pkg.name, 'resolve');
+    });
+});
+
+test('./ should not load ${dir}.js', function (t) { // eslint-disable-line no-template-curly-in-string
+    t.plan(1);
+    var dir = path.join(__dirname, 'precedence/bbb');
+
+    resolve('./', { basedir: dir }, function (err, res, pkg) {
+        t.ok(err);
+    });
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/aaa.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/aaa.js
new file mode 100644
index 0000000..b83a3e7
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/aaa.js
@@ -0,0 +1 @@
+module.exports = 'wtf';
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/aaa/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/aaa/index.js
new file mode 100644
index 0000000..e0f8f6a
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/aaa/index.js
@@ -0,0 +1 @@
+module.exports = 'okok';
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/aaa/main.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/aaa/main.js
new file mode 100644
index 0000000..93542a9
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/aaa/main.js
@@ -0,0 +1 @@
+console.log(require('./'));
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/bbb.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/bbb.js
new file mode 100644
index 0000000..2298f47
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/bbb.js
@@ -0,0 +1 @@
+module.exports = '>_<';
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/bbb/main.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/bbb/main.js
new file mode 100644
index 0000000..716b81d
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/precedence/bbb/main.js
@@ -0,0 +1 @@
+console.log(require('./')); // should throw
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver.js
new file mode 100644
index 0000000..aa36ee1
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver.js
@@ -0,0 +1,450 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('async foo', function (t) {
+    t.plan(12);
+    var dir = path.join(__dirname, 'resolver');
+
+    resolve('./foo', { basedir: dir }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'foo.js'));
+        t.equal(pkg && pkg.name, 'resolve');
+    });
+
+    resolve('./foo.js', { basedir: dir }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'foo.js'));
+        t.equal(pkg && pkg.name, 'resolve');
+    });
+
+    resolve('./foo', { basedir: dir, 'package': { main: 'resolver' } }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'foo.js'));
+        t.equal(pkg && pkg.main, 'resolver');
+    });
+
+    resolve('./foo.js', { basedir: dir, 'package': { main: 'resolver' } }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'foo.js'));
+        t.equal(pkg.main, 'resolver');
+    });
+
+    resolve('./foo', { basedir: dir, filename: path.join(dir, 'baz.js') }, function (err, res) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'foo.js'));
+    });
+
+    resolve('foo', { basedir: dir }, function (err) {
+        t.equal(err.message, "Cannot find module 'foo' from '" + path.resolve(dir) + "'");
+        t.equal(err.code, 'MODULE_NOT_FOUND');
+    });
+
+    // Test that filename is reported as the "from" value when passed.
+    resolve('foo', { basedir: dir, filename: path.join(dir, 'baz.js') }, function (err) {
+        t.equal(err.message, "Cannot find module 'foo' from '" + path.join(dir, 'baz.js') + "'");
+    });
+});
+
+test('bar', function (t) {
+    t.plan(6);
+    var dir = path.join(__dirname, 'resolver');
+
+    resolve('foo', { basedir: dir + '/bar' }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'bar/node_modules/foo/index.js'));
+        t.equal(pkg, undefined);
+    });
+
+    resolve('foo', { basedir: dir + '/bar' }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'bar/node_modules/foo/index.js'));
+        t.equal(pkg, undefined);
+    });
+
+    resolve('foo', { basedir: dir + '/bar', 'package': { main: 'bar' } }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'bar/node_modules/foo/index.js'));
+        t.equal(pkg.main, 'bar');
+    });
+});
+
+test('baz', function (t) {
+    t.plan(4);
+    var dir = path.join(__dirname, 'resolver');
+
+    resolve('./baz', { basedir: dir }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'baz/quux.js'));
+        t.equal(pkg.main, 'quux.js');
+    });
+
+    resolve('./baz', { basedir: dir, 'package': { main: 'resolver' } }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'baz/quux.js'));
+        t.equal(pkg.main, 'quux.js');
+    });
+});
+
+test('biz', function (t) {
+    t.plan(24);
+    var dir = path.join(__dirname, 'resolver/biz/node_modules');
+
+    resolve('./grux', { basedir: dir }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'grux/index.js'));
+        t.equal(pkg, undefined);
+    });
+
+    resolve('./grux', { basedir: dir, 'package': { main: 'biz' } }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'grux/index.js'));
+        t.equal(pkg.main, 'biz');
+    });
+
+    resolve('./garply', { basedir: dir }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'garply/lib/index.js'));
+        t.equal(pkg.main, './lib');
+    });
+
+    resolve('./garply', { basedir: dir, 'package': { main: 'biz' } }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'garply/lib/index.js'));
+        t.equal(pkg.main, './lib');
+    });
+
+    resolve('tiv', { basedir: dir + '/grux' }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'tiv/index.js'));
+        t.equal(pkg, undefined);
+    });
+
+    resolve('tiv', { basedir: dir + '/grux', 'package': { main: 'grux' } }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'tiv/index.js'));
+        t.equal(pkg.main, 'grux');
+    });
+
+    resolve('tiv', { basedir: dir + '/garply' }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'tiv/index.js'));
+        t.equal(pkg, undefined);
+    });
+
+    resolve('tiv', { basedir: dir + '/garply', 'package': { main: './lib' } }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'tiv/index.js'));
+        t.equal(pkg.main, './lib');
+    });
+
+    resolve('grux', { basedir: dir + '/tiv' }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'grux/index.js'));
+        t.equal(pkg, undefined);
+    });
+
+    resolve('grux', { basedir: dir + '/tiv', 'package': { main: 'tiv' } }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'grux/index.js'));
+        t.equal(pkg.main, 'tiv');
+    });
+
+    resolve('garply', { basedir: dir + '/tiv' }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'garply/lib/index.js'));
+        t.equal(pkg.main, './lib');
+    });
+
+    resolve('garply', { basedir: dir + '/tiv', 'package': { main: 'tiv' } }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'garply/lib/index.js'));
+        t.equal(pkg.main, './lib');
+    });
+});
+
+test('quux', function (t) {
+    t.plan(2);
+    var dir = path.join(__dirname, 'resolver/quux');
+
+    resolve('./foo', { basedir: dir, 'package': { main: 'quux' } }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'foo/index.js'));
+        t.equal(pkg.main, 'quux');
+    });
+});
+
+test('normalize', function (t) {
+    t.plan(2);
+    var dir = path.join(__dirname, 'resolver/biz/node_modules/grux');
+
+    resolve('../grux', { basedir: dir }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'index.js'));
+        t.equal(pkg, undefined);
+    });
+});
+
+test('cup', function (t) {
+    t.plan(5);
+    var dir = path.join(__dirname, 'resolver');
+
+    resolve('./cup', { basedir: dir, extensions: ['.js', '.coffee'] }, function (err, res) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'cup.coffee'));
+    });
+
+    resolve('./cup.coffee', { basedir: dir }, function (err, res) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'cup.coffee'));
+    });
+
+    resolve('./cup', { basedir: dir, extensions: ['.js'] }, function (err, res) {
+        t.equal(err.message, "Cannot find module './cup' from '" + path.resolve(dir) + "'");
+        t.equal(err.code, 'MODULE_NOT_FOUND');
+    });
+
+    // Test that filename is reported as the "from" value when passed.
+    resolve('./cup', { basedir: dir, extensions: ['.js'], filename: path.join(dir, 'cupboard.js') }, function (err, res) {
+        t.equal(err.message, "Cannot find module './cup' from '" + path.join(dir, 'cupboard.js') + "'");
+    });
+});
+
+test('mug', function (t) {
+    t.plan(3);
+    var dir = path.join(__dirname, 'resolver');
+
+    resolve('./mug', { basedir: dir }, function (err, res) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'mug.js'));
+    });
+
+    resolve('./mug', { basedir: dir, extensions: ['.coffee', '.js'] }, function (err, res) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, '/mug.coffee'));
+    });
+
+    resolve('./mug', { basedir: dir, extensions: ['.js', '.coffee'] }, function (err, res) {
+        t.equal(res, path.join(dir, '/mug.js'));
+    });
+});
+
+test('other path', function (t) {
+    t.plan(6);
+    var resolverDir = path.join(__dirname, 'resolver');
+    var dir = path.join(resolverDir, 'bar');
+    var otherDir = path.join(resolverDir, 'other_path');
+
+    resolve('root', { basedir: dir, paths: [otherDir] }, function (err, res) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(resolverDir, 'other_path/root.js'));
+    });
+
+    resolve('lib/other-lib', { basedir: dir, paths: [otherDir] }, function (err, res) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(resolverDir, 'other_path/lib/other-lib.js'));
+    });
+
+    resolve('root', { basedir: dir }, function (err, res) {
+        t.equal(err.message, "Cannot find module 'root' from '" + path.resolve(dir) + "'");
+        t.equal(err.code, 'MODULE_NOT_FOUND');
+    });
+
+    resolve('zzz', { basedir: dir, paths: [otherDir] }, function (err, res) {
+        t.equal(err.message, "Cannot find module 'zzz' from '" + path.resolve(dir) + "'");
+        t.equal(err.code, 'MODULE_NOT_FOUND');
+    });
+});
+
+test('path iterator', function (t) {
+    t.plan(2);
+
+    var resolverDir = path.join(__dirname, 'resolver');
+
+    var exactIterator = function (x, start, getPackageCandidates, opts) {
+        return [path.join(resolverDir, x)];
+    };
+
+    resolve('baz', { packageIterator: exactIterator }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(resolverDir, 'baz/quux.js'));
+        t.equal(pkg && pkg.name, 'baz');
+    });
+});
+
+test('incorrect main', function (t) {
+    t.plan(1);
+
+    var resolverDir = path.join(__dirname, 'resolver');
+    var dir = path.join(resolverDir, 'incorrect_main');
+
+    resolve('./incorrect_main', { basedir: resolverDir }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'index.js'));
+    });
+});
+
+test('without basedir', function (t) {
+    t.plan(1);
+
+    var dir = path.join(__dirname, 'resolver/without_basedir');
+    var tester = require(path.join(dir, 'main.js'));
+
+    tester(t, function (err, res, pkg) {
+        if (err) {
+            t.fail(err);
+        } else {
+            t.equal(res, path.join(dir, 'node_modules/mymodule.js'));
+        }
+    });
+});
+
+test('#52 - incorrectly resolves module-paths like "./someFolder/" when there is a file of the same name', function (t) {
+    t.plan(2);
+
+    var dir = path.join(__dirname, 'resolver');
+
+    resolve('./foo', { basedir: path.join(dir, 'same_names') }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'same_names/foo.js'));
+    });
+
+    resolve('./foo/', { basedir: path.join(dir, 'same_names') }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'same_names/foo/index.js'));
+    });
+});
+
+test('#211 - incorrectly resolves module-paths like "." when from inside a folder with a sibling file of the same name', function (t) {
+    t.plan(2);
+
+    var dir = path.join(__dirname, 'resolver');
+
+    resolve('./', { basedir: path.join(dir, 'same_names/foo') }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'same_names/foo/index.js'));
+    });
+
+    resolve('.', { basedir: path.join(dir, 'same_names/foo') }, function (err, res, pkg) {
+        if (err) t.fail(err);
+        t.equal(res, path.join(dir, 'same_names/foo/index.js'));
+    });
+});
+
+test('async: #121 - treating an existing file as a dir when no basedir', function (t) {
+    var testFile = path.basename(__filename);
+
+    t.test('sanity check', function (st) {
+        st.plan(1);
+        resolve('./' + testFile, function (err, res, pkg) {
+            if (err) t.fail(err);
+            st.equal(res, __filename, 'sanity check');
+        });
+    });
+
+    t.test('with a fake directory', function (st) {
+        st.plan(4);
+
+        resolve('./' + testFile + '/blah', function (err, res, pkg) {
+            st.ok(err, 'there is an error');
+            st.notOk(res, 'no result');
+
+            st.equal(err && err.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve');
+            st.equal(
+                err && err.message,
+                'Cannot find module \'./' + testFile + '/blah\' from \'' + __dirname + '\'',
+                'can not find nonexistent module'
+            );
+            st.end();
+        });
+    });
+
+    t.end();
+});
+
+test('async dot main', function (t) {
+    var start = new Date();
+    t.plan(3);
+    resolve('./resolver/dot_main', function (err, ret) {
+        t.notOk(err);
+        t.equal(ret, path.join(__dirname, 'resolver/dot_main/index.js'));
+        t.ok(new Date() - start < 50, 'resolve.sync timedout');
+        t.end();
+    });
+});
+
+test('async dot slash main', function (t) {
+    var start = new Date();
+    t.plan(3);
+    resolve('./resolver/dot_slash_main', function (err, ret) {
+        t.notOk(err);
+        t.equal(ret, path.join(__dirname, 'resolver/dot_slash_main/index.js'));
+        t.ok(new Date() - start < 50, 'resolve.sync timedout');
+        t.end();
+    });
+});
+
+test('not a directory', function (t) {
+    t.plan(6);
+    var path = './foo';
+    resolve(path, { basedir: __filename }, function (err, res, pkg) {
+        t.ok(err, 'a non-directory errors');
+        t.equal(arguments.length, 1);
+        t.equal(res, undefined);
+        t.equal(pkg, undefined);
+
+        t.equal(err && err.message, 'Cannot find module \'' + path + '\' from \'' + __filename + '\'');
+        t.equal(err && err.code, 'MODULE_NOT_FOUND');
+    });
+});
+
+test('non-string "main" field in package.json', function (t) {
+    t.plan(5);
+
+    var dir = path.join(__dirname, 'resolver');
+    resolve('./invalid_main', { basedir: dir }, function (err, res, pkg) {
+        t.ok(err, 'errors on non-string main');
+        t.equal(err.message, 'package “invalid main” `main` must be a string');
+        t.equal(err.code, 'INVALID_PACKAGE_MAIN');
+        t.equal(res, undefined, 'res is undefined');
+        t.equal(pkg, undefined, 'pkg is undefined');
+    });
+});
+
+test('non-string "main" field in package.json', function (t) {
+    t.plan(5);
+
+    var dir = path.join(__dirname, 'resolver');
+    resolve('./invalid_main', { basedir: dir }, function (err, res, pkg) {
+        t.ok(err, 'errors on non-string main');
+        t.equal(err.message, 'package “invalid main” `main` must be a string');
+        t.equal(err.code, 'INVALID_PACKAGE_MAIN');
+        t.equal(res, undefined, 'res is undefined');
+        t.equal(pkg, undefined, 'pkg is undefined');
+    });
+});
+
+test('browser field in package.json', function (t) {
+    t.plan(3);
+
+    var dir = path.join(__dirname, 'resolver');
+    resolve(
+        './browser_field',
+        {
+            basedir: dir,
+            packageFilter: function packageFilter(pkg) {
+                if (pkg.browser) {
+                    pkg.main = pkg.browser; // eslint-disable-line no-param-reassign
+                    delete pkg.browser; // eslint-disable-line no-param-reassign
+                }
+                return pkg;
+            }
+        },
+        function (err, res, pkg) {
+            if (err) t.fail(err);
+            t.equal(res, path.join(dir, 'browser_field', 'b.js'));
+            t.equal(pkg && pkg.main, 'b');
+            t.equal(pkg && pkg.browser, undefined);
+        }
+    );
+});
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/baz/doom.js
similarity index 100%
rename from node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js
rename to node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/baz/doom.js
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/baz/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/baz/package.json
new file mode 100644
index 0000000..2f77720
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/baz/package.json
@@ -0,0 +1,4 @@
+{
+    "name": "baz",
+    "main": "quux.js"
+}
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/baz/quux.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/baz/quux.js
new file mode 100644
index 0000000..bd816ea
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/baz/quux.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/browser_field/a.js
similarity index 100%
copy from node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js
copy to node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/browser_field/a.js
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/browser_field/b.js
similarity index 100%
copy from node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js
copy to node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/browser_field/b.js
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/browser_field/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/browser_field/package.json
new file mode 100644
index 0000000..bf406f0
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/browser_field/package.json
@@ -0,0 +1,5 @@
+{
+  "name": "browser_field",
+  "main": "a",
+  "browser": "b"
+}
diff --git a/node_modules/graphql/jsutils/ObjMap.mjs b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/cup.coffee
similarity index 100%
rename from node_modules/graphql/jsutils/ObjMap.mjs
rename to node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/cup.coffee
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/dot_main/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/dot_main/index.js
new file mode 100644
index 0000000..bd816ea
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/dot_main/index.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/dot_main/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/dot_main/package.json
new file mode 100644
index 0000000..d7f4fc8
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/dot_main/package.json
@@ -0,0 +1,3 @@
+{
+    "main": "."
+}
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/dot_slash_main/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/dot_slash_main/index.js
new file mode 100644
index 0000000..bd816ea
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/dot_slash_main/index.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/dot_slash_main/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/dot_slash_main/package.json
new file mode 100644
index 0000000..f51287b
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/dot_slash_main/package.json
@@ -0,0 +1,3 @@
+{
+    "main": "./"
+}
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/foo.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/foo.js
new file mode 100644
index 0000000..bd816ea
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/foo.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/incorrect_main/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/incorrect_main/index.js
new file mode 100644
index 0000000..bc1fb0a
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/incorrect_main/index.js
@@ -0,0 +1,2 @@
+// this is the actual main file 'index.js', not 'wrong.js' like the package.json would indicate
+module.exports = 1;
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/incorrect_main/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/incorrect_main/package.json
new file mode 100644
index 0000000..b718804
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/incorrect_main/package.json
@@ -0,0 +1,3 @@
+{
+    "main": "wrong.js"
+}
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/invalid_main/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/invalid_main/package.json
new file mode 100644
index 0000000..0cf8279
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/invalid_main/package.json
@@ -0,0 +1,7 @@
+{
+  "name": "invalid main",
+  "main": [
+    "why is this a thing",
+    "srsly omg wtf"
+  ]
+}
diff --git a/node_modules/eslint-plugin-jsx-a11y/.watchmanconfig b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/mug.coffee
old mode 100755
new mode 100644
similarity index 100%
rename from node_modules/eslint-plugin-jsx-a11y/.watchmanconfig
rename to node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/mug.coffee
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/mug.js
similarity index 100%
copy from node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js
copy to node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/mug.js
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/lerna.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/lerna.json
new file mode 100644
index 0000000..d6707ca
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/lerna.json
@@ -0,0 +1,6 @@
+{
+  "packages": [
+    "packages/*"
+  ],
+  "version": "0.0.0"
+}
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/package.json
new file mode 100644
index 0000000..8508f9d
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/package.json
@@ -0,0 +1,20 @@
+{
+  "name": "monorepo-symlink-test",
+  "private": true,
+  "version": "0.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "postinstall": "lerna bootstrap",
+    "test": "node packages/package-a"
+  },
+  "author": "",
+  "license": "MIT",
+  "dependencies": {
+    "jquery": "^3.3.1",
+    "resolve": "../../../"
+  },
+  "devDependencies": {
+    "lerna": "^3.4.3"
+  }
+}
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js
new file mode 100644
index 0000000..8875a32
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/packages/package-a/index.js
@@ -0,0 +1,35 @@
+'use strict';
+
+var assert = require('assert');
+var path = require('path');
+var resolve = require('resolve');
+
+var basedir = __dirname + '/node_modules/@my-scope/package-b';
+
+var expected = path.join(__dirname, '../../node_modules/jquery/dist/jquery.js');
+
+/*
+ * preserveSymlinks === false
+ * will search NPM package from
+ * - packages/package-b/node_modules
+ * - packages/node_modules
+ * - node_modules
+ */
+assert.equal(resolve.sync('jquery', { basedir: basedir, preserveSymlinks: false }), expected);
+assert.equal(resolve.sync('../../node_modules/jquery', { basedir: basedir, preserveSymlinks: false }), expected);
+
+/*
+ * preserveSymlinks === true
+ * will search NPM package from
+ * - packages/package-a/node_modules/@my-scope/packages/package-b/node_modules
+ * - packages/package-a/node_modules/@my-scope/packages/node_modules
+ * - packages/package-a/node_modules/@my-scope/node_modules
+ * - packages/package-a/node_modules/node_modules
+ * - packages/package-a/node_modules
+ * - packages/node_modules
+ * - node_modules
+ */
+assert.equal(resolve.sync('jquery', { basedir: basedir, preserveSymlinks: true }), expected);
+assert.equal(resolve.sync('../../../../../node_modules/jquery', { basedir: basedir, preserveSymlinks: true }), expected);
+
+console.log(' * all monorepo paths successfully resolved through symlinks');
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json
new file mode 100644
index 0000000..204de51
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/packages/package-a/package.json
@@ -0,0 +1,14 @@
+{
+  "name": "@my-scope/package-a",
+  "version": "0.0.0",
+  "private": true,
+  "description": "",
+  "license": "MIT",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: run tests from root\" && exit 1"
+  },
+  "dependencies": {
+    "@my-scope/package-b": "^0.0.0"
+  }
+}
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js
similarity index 100%
copy from node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js
copy to node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/packages/package-b/index.js
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json
new file mode 100644
index 0000000..f57c3b5
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/multirepo/packages/package-b/package.json
@@ -0,0 +1,14 @@
+{
+  "name": "@my-scope/package-b",
+  "private": true,
+  "version": "0.0.0",
+  "description": "",
+  "license": "MIT",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: run tests from root\" && exit 1"
+  },
+  "dependencies": {
+    "@my-scope/package-a": "^0.0.0"
+  }
+}
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js
new file mode 100644
index 0000000..9b4846a
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/nested_symlinks/mylib/async.js
@@ -0,0 +1,26 @@
+var a = require.resolve('buffer/').replace(process.cwd(), '$CWD');
+var b;
+var c;
+
+var test = function test() {
+    console.log(a, ': require.resolve, preserveSymlinks ' + (process.execArgv.indexOf('preserve-symlinks') > -1 ? 'true' : 'false'));
+    console.log(b, ': preserveSymlinks true');
+    console.log(c, ': preserveSymlinks false');
+
+    if (a !== b && a !== c) {
+        throw 'async: no match';
+    }
+    console.log('async: success! a matched either b or c\n');
+};
+
+require('resolve')('buffer/', { preserveSymlinks: true }, function (err, result) {
+    if (err) { throw err; }
+    b = result.replace(process.cwd(), '$CWD');
+    if (b && c) { test(); }
+});
+require('resolve')('buffer/', { preserveSymlinks: false }, function (err, result) {
+    if (err) { throw err; }
+    c = result.replace(process.cwd(), '$CWD');
+    if (b && c) { test(); }
+});
+
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json
new file mode 100644
index 0000000..acfe9e9
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/nested_symlinks/mylib/package.json
@@ -0,0 +1,15 @@
+{
+  "name": "mylib",
+  "version": "0.0.0",
+  "description": "",
+  "private": true,
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "buffer": "*"
+  }
+}
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js
new file mode 100644
index 0000000..3283efc
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/nested_symlinks/mylib/sync.js
@@ -0,0 +1,12 @@
+var a = require.resolve('buffer/').replace(process.cwd(), '$CWD');
+var b = require('resolve').sync('buffer/', { preserveSymlinks: true }).replace(process.cwd(), '$CWD');
+var c = require('resolve').sync('buffer/', { preserveSymlinks: false }).replace(process.cwd(), '$CWD');
+
+console.log(a, ': require.resolve, preserveSymlinks ' + (process.execArgv.indexOf('preserve-symlinks') > -1 ? 'true' : 'false'));
+console.log(b, ': preserveSymlinks true');
+console.log(c, ': preserveSymlinks false');
+
+if (a !== b && a !== c) {
+    throw 'sync: no match';
+}
+console.log('sync: success! a matched either b or c\n');
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/other_path/lib/other-lib.js
similarity index 100%
copy from node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js
copy to node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/other_path/lib/other-lib.js
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/other_path/root.js
similarity index 100%
copy from node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js
copy to node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/other_path/root.js
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/quux/foo/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/quux/foo/index.js
new file mode 100644
index 0000000..bd816ea
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/quux/foo/index.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/same_names/foo.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/same_names/foo.js
new file mode 100644
index 0000000..888cae3
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/same_names/foo.js
@@ -0,0 +1 @@
+module.exports = 42;
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/same_names/foo/index.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/same_names/foo/index.js
new file mode 100644
index 0000000..bd816ea
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/same_names/foo/index.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js
similarity index 100%
copy from node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js
copy to node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/symlinked/_/node_modules/foo.js
diff --git a/node_modules/eslint-plugin-jsx-a11y/.watchmanconfig b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep
old mode 100755
new mode 100644
similarity index 100%
copy from node_modules/eslint-plugin-jsx-a11y/.watchmanconfig
copy to node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/symlinked/_/symlink_target/.gitkeep
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/symlinked/package/bar.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/symlinked/package/bar.js
new file mode 100644
index 0000000..cb1c2c0
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/symlinked/package/bar.js
@@ -0,0 +1 @@
+module.exports = 'bar';
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/symlinked/package/package.json b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/symlinked/package/package.json
new file mode 100644
index 0000000..8e1b585
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/symlinked/package/package.json
@@ -0,0 +1,3 @@
+{
+    "main": "bar.js"
+}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/without_basedir/main.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/without_basedir/main.js
new file mode 100644
index 0000000..5b31975
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver/without_basedir/main.js
@@ -0,0 +1,5 @@
+var resolve = require('../../../');
+
+module.exports = function (t, cb) {
+    resolve('mymodule', null, cb);
+};
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver_sync.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver_sync.js
new file mode 100644
index 0000000..3082c96
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/resolver_sync.js
@@ -0,0 +1,358 @@
+var path = require('path');
+var test = require('tape');
+var resolve = require('../');
+
+test('foo', function (t) {
+    var dir = path.join(__dirname, 'resolver');
+
+    t.equal(
+        resolve.sync('./foo', { basedir: dir }),
+        path.join(dir, 'foo.js')
+    );
+
+    t.equal(
+        resolve.sync('./foo.js', { basedir: dir }),
+        path.join(dir, 'foo.js')
+    );
+
+    t.equal(
+        resolve.sync('./foo.js', { basedir: dir, filename: path.join(dir, 'bar.js') }),
+        path.join(dir, 'foo.js')
+    );
+
+    t.throws(function () {
+        resolve.sync('foo', { basedir: dir });
+    });
+
+    // Test that filename is reported as the "from" value when passed.
+    t.throws(
+        function () {
+            resolve.sync('foo', { basedir: dir, filename: path.join(dir, 'bar.js') });
+        },
+        {
+            name: 'Error',
+            message: "Cannot find module 'foo' from '" + path.join(dir, 'bar.js') + "'"
+        }
+    );
+
+    t.end();
+});
+
+test('bar', function (t) {
+    var dir = path.join(__dirname, 'resolver');
+
+    t.equal(
+        resolve.sync('foo', { basedir: path.join(dir, 'bar') }),
+        path.join(dir, 'bar/node_modules/foo/index.js')
+    );
+    t.end();
+});
+
+test('baz', function (t) {
+    var dir = path.join(__dirname, 'resolver');
+
+    t.equal(
+        resolve.sync('./baz', { basedir: dir }),
+        path.join(dir, 'baz/quux.js')
+    );
+    t.end();
+});
+
+test('biz', function (t) {
+    var dir = path.join(__dirname, 'resolver/biz/node_modules');
+    t.equal(
+        resolve.sync('./grux', { basedir: dir }),
+        path.join(dir, 'grux/index.js')
+    );
+
+    t.equal(
+        resolve.sync('tiv', { basedir: path.join(dir, 'grux') }),
+        path.join(dir, 'tiv/index.js')
+    );
+
+    t.equal(
+        resolve.sync('grux', { basedir: path.join(dir, 'tiv') }),
+        path.join(dir, 'grux/index.js')
+    );
+    t.end();
+});
+
+test('normalize', function (t) {
+    var dir = path.join(__dirname, 'resolver/biz/node_modules/grux');
+    t.equal(
+        resolve.sync('../grux', { basedir: dir }),
+        path.join(dir, 'index.js')
+    );
+    t.end();
+});
+
+test('cup', function (t) {
+    var dir = path.join(__dirname, 'resolver');
+    t.equal(
+        resolve.sync('./cup', {
+            basedir: dir,
+            extensions: ['.js', '.coffee']
+        }),
+        path.join(dir, 'cup.coffee')
+    );
+
+    t.equal(
+        resolve.sync('./cup.coffee', { basedir: dir }),
+        path.join(dir, 'cup.coffee')
+    );
+
+    t.throws(function () {
+        resolve.sync('./cup', {
+            basedir: dir,
+            extensions: ['.js']
+        });
+    });
+
+    t.end();
+});
+
+test('mug', function (t) {
+    var dir = path.join(__dirname, 'resolver');
+    t.equal(
+        resolve.sync('./mug', { basedir: dir }),
+        path.join(dir, 'mug.js')
+    );
+
+    t.equal(
+        resolve.sync('./mug', {
+            basedir: dir,
+            extensions: ['.coffee', '.js']
+        }),
+        path.join(dir, 'mug.coffee')
+    );
+
+    t.equal(
+        resolve.sync('./mug', {
+            basedir: dir,
+            extensions: ['.js', '.coffee']
+        }),
+        path.join(dir, 'mug.js')
+    );
+
+    t.end();
+});
+
+test('other path', function (t) {
+    var resolverDir = path.join(__dirname, 'resolver');
+    var dir = path.join(resolverDir, 'bar');
+    var otherDir = path.join(resolverDir, 'other_path');
+
+    t.equal(
+        resolve.sync('root', {
+            basedir: dir,
+            paths: [otherDir]
+        }),
+        path.join(resolverDir, 'other_path/root.js')
+    );
+
+    t.equal(
+        resolve.sync('lib/other-lib', {
+            basedir: dir,
+            paths: [otherDir]
+        }),
+        path.join(resolverDir, 'other_path/lib/other-lib.js')
+    );
+
+    t.throws(function () {
+        resolve.sync('root', { basedir: dir });
+    });
+
+    t.throws(function () {
+        resolve.sync('zzz', {
+            basedir: dir,
+            paths: [otherDir]
+        });
+    });
+
+    t.end();
+});
+
+test('path iterator', function (t) {
+    var resolverDir = path.join(__dirname, 'resolver');
+
+    var exactIterator = function (x, start, getPackageCandidates, opts) {
+        return [path.join(resolverDir, x)];
+    };
+
+    t.equal(
+        resolve.sync('baz', { packageIterator: exactIterator }),
+        path.join(resolverDir, 'baz/quux.js')
+    );
+
+    t.end();
+});
+
+test('incorrect main', function (t) {
+    var resolverDir = path.join(__dirname, 'resolver');
+    var dir = path.join(resolverDir, 'incorrect_main');
+
+    t.equal(
+        resolve.sync('./incorrect_main', { basedir: resolverDir }),
+        path.join(dir, 'index.js')
+    );
+
+    t.end();
+});
+
+var stubStatSync = function stubStatSync(fn) {
+    var fs = require('fs');
+    var statSync = fs.statSync;
+    try {
+        fs.statSync = function () {
+            throw new EvalError('Unknown Error');
+        };
+        return fn();
+    } finally {
+        fs.statSync = statSync;
+    }
+};
+
+test('#79 - re-throw non ENOENT errors from stat', function (t) {
+    var dir = path.join(__dirname, 'resolver');
+
+    stubStatSync(function () {
+        t.throws(function () {
+            resolve.sync('foo', { basedir: dir });
+        }, /Unknown Error/);
+    });
+
+    t.end();
+});
+
+test('#52 - incorrectly resolves module-paths like "./someFolder/" when there is a file of the same name', function (t) {
+    var dir = path.join(__dirname, 'resolver');
+
+    t.equal(
+        resolve.sync('./foo', { basedir: path.join(dir, 'same_names') }),
+        path.join(dir, 'same_names/foo.js')
+    );
+    t.equal(
+        resolve.sync('./foo/', { basedir: path.join(dir, 'same_names') }),
+        path.join(dir, 'same_names/foo/index.js')
+    );
+    t.end();
+});
+
+test('#211 - incorrectly resolves module-paths like "." when from inside a folder with a sibling file of the same name', function (t) {
+    var dir = path.join(__dirname, 'resolver');
+
+    t.equal(
+        resolve.sync('./', { basedir: path.join(dir, 'same_names/foo') }),
+        path.join(dir, 'same_names/foo/index.js')
+    );
+    t.equal(
+        resolve.sync('.', { basedir: path.join(dir, 'same_names/foo') }),
+        path.join(dir, 'same_names/foo/index.js')
+    );
+    t.end();
+});
+
+test('sync: #121 - treating an existing file as a dir when no basedir', function (t) {
+    var testFile = path.basename(__filename);
+
+    t.test('sanity check', function (st) {
+        st.equal(
+            resolve.sync('./' + testFile),
+            __filename,
+            'sanity check'
+        );
+        st.end();
+    });
+
+    t.test('with a fake directory', function (st) {
+        function run() { return resolve.sync('./' + testFile + '/blah'); }
+
+        st.throws(run, 'throws an error');
+
+        try {
+            run();
+        } catch (e) {
+            st.equal(e.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve');
+            st.equal(
+                e.message,
+                'Cannot find module \'./' + testFile + '/blah\' from \'' + __dirname + '\'',
+                'can not find nonexistent module'
+            );
+        }
+
+        st.end();
+    });
+
+    t.end();
+});
+
+test('sync dot main', function (t) {
+    var start = new Date();
+    t.equal(resolve.sync('./resolver/dot_main'), path.join(__dirname, 'resolver/dot_main/index.js'));
+    t.ok(new Date() - start < 50, 'resolve.sync timedout');
+    t.end();
+});
+
+test('sync dot slash main', function (t) {
+    var start = new Date();
+    t.equal(resolve.sync('./resolver/dot_slash_main'), path.join(__dirname, 'resolver/dot_slash_main/index.js'));
+    t.ok(new Date() - start < 50, 'resolve.sync timedout');
+    t.end();
+});
+
+test('not a directory', function (t) {
+    var path = './foo';
+    try {
+        resolve.sync(path, { basedir: __filename });
+        t.fail();
+    } catch (err) {
+        t.ok(err, 'a non-directory errors');
+        t.equal(err && err.message, 'Cannot find module \'' + path + "' from '" + __filename + "'");
+        t.equal(err && err.code, 'MODULE_NOT_FOUND');
+    }
+    t.end();
+});
+
+test('non-string "main" field in package.json', function (t) {
+    var dir = path.join(__dirname, 'resolver');
+    try {
+        var result = resolve.sync('./invalid_main', { basedir: dir });
+        t.equal(result, undefined, 'result should not exist');
+        t.fail('should not get here');
+    } catch (err) {
+        t.ok(err, 'errors on non-string main');
+        t.equal(err.message, 'package “invalid main” `main` must be a string');
+        t.equal(err.code, 'INVALID_PACKAGE_MAIN');
+    }
+    t.end();
+});
+
+test('non-string "main" field in package.json', function (t) {
+    var dir = path.join(__dirname, 'resolver');
+    try {
+        var result = resolve.sync('./invalid_main', { basedir: dir });
+        t.equal(result, undefined, 'result should not exist');
+        t.fail('should not get here');
+    } catch (err) {
+        t.ok(err, 'errors on non-string main');
+        t.equal(err.message, 'package “invalid main” `main` must be a string');
+        t.equal(err.code, 'INVALID_PACKAGE_MAIN');
+    }
+    t.end();
+});
+
+test('browser field in package.json', function (t) {
+    var dir = path.join(__dirname, 'resolver');
+    var res = resolve.sync('./browser_field', {
+        basedir: dir,
+        packageFilter: function packageFilter(pkg) {
+            if (pkg.browser) {
+                pkg.main = pkg.browser; // eslint-disable-line no-param-reassign
+                delete pkg.browser; // eslint-disable-line no-param-reassign
+            }
+            return pkg;
+        }
+    });
+    t.equal(res, path.join(dir, 'browser_field', 'b.js'));
+    t.end();
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/shadowed_core.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/shadowed_core.js
new file mode 100644
index 0000000..98c52a7
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/shadowed_core.js
@@ -0,0 +1,38 @@
+var test = require('tape');
+var resolve = require('../');
+var path = require('path');
+
+test('shadowed core modules still return core module', function (t) {
+    t.plan(2);
+
+    resolve('util', { basedir: path.join(__dirname, 'shadowed_core') }, function (err, res) {
+        t.ifError(err);
+        t.equal(res, 'util');
+    });
+});
+
+test('shadowed core modules still return core module [sync]', function (t) {
+    t.plan(1);
+
+    var res = resolve.sync('util', { basedir: path.join(__dirname, 'shadowed_core') });
+
+    t.equal(res, 'util');
+});
+
+test('shadowed core modules return shadow when appending `/`', function (t) {
+    t.plan(2);
+
+    resolve('util/', { basedir: path.join(__dirname, 'shadowed_core') }, function (err, res) {
+        t.ifError(err);
+        t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js'));
+    });
+});
+
+test('shadowed core modules return shadow when appending `/` [sync]', function (t) {
+    t.plan(1);
+
+    var res = resolve.sync('util/', { basedir: path.join(__dirname, 'shadowed_core') });
+
+    t.equal(res, path.join(__dirname, 'shadowed_core/node_modules/util/index.js'));
+});
+
diff --git a/node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/shadowed_core/node_modules/util/index.js
similarity index 100%
copy from node_modules/@octokit/request/node_modules/@octokit/request-error/dist-src/types.js
copy to node_modules/eslint-plugin-import/node_modules/resolve/test/shadowed_core/node_modules/util/index.js
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/subdirs.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/subdirs.js
new file mode 100644
index 0000000..b7b8450
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/subdirs.js
@@ -0,0 +1,13 @@
+var test = require('tape');
+var resolve = require('../');
+var path = require('path');
+
+test('subdirs', function (t) {
+    t.plan(2);
+
+    var dir = path.join(__dirname, '/subdirs');
+    resolve('a/b/c/x.json', { basedir: dir }, function (err, res) {
+        t.ifError(err);
+        t.equal(res, path.join(dir, 'node_modules/a/b/c/x.json'));
+    });
+});
diff --git a/node_modules/eslint-plugin-import/node_modules/resolve/test/symlinks.js b/node_modules/eslint-plugin-import/node_modules/resolve/test/symlinks.js
new file mode 100644
index 0000000..152d14e
--- /dev/null
+++ b/node_modules/eslint-plugin-import/node_modules/resolve/test/symlinks.js
@@ -0,0 +1,173 @@
+var path = require('path');
+var fs = require('fs');
+var test = require('tape');
+var map = require('array.prototype.map');
+var resolve = require('../');
+
+var symlinkDir = path.join(__dirname, 'resolver', 'symlinked', 'symlink');
+var packageDir = path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'package');
+var modADir = path.join(__dirname, 'symlinks', 'source', 'node_modules', 'mod-a');
+var symlinkModADir = path.join(__dirname, 'symlinks', 'dest', 'node_modules', 'mod-a');
+try {
+    fs.unlinkSync(symlinkDir);
+} catch (err) {}
+try {
+    fs.unlinkSync(packageDir);
+} catch (err) {}
+try {
+    fs.unlinkSync(modADir);
+} catch (err) {}
+try {
+    fs.unlinkSync(symlinkModADir);
+} catch (err) {}
+
+try {
+    fs.symlinkSync('./_/symlink_target', symlinkDir, 'dir');
+} catch (err) {
+    // if fails then it is probably on Windows and lets try to create a junction
+    fs.symlinkSync(path.join(__dirname, 'resolver', 'symlinked', '_', 'symlink_target') + '\\', symlinkDir, 'junction');
+}
+try {
+    fs.symlinkSync('../../package', packageDir, 'dir');
+} catch (err) {
+    // if fails then it is probably on Windows and lets try to create a junction
+    fs.symlinkSync(path.join(__dirname, '..', '..', 'package') + '\\', packageDir, 'junction');
+}
+try {
+    fs.symlinkSync('../../source/node_modules/mod-a', symlinkModADir, 'dir');
+} catch (err) {
+    // if fails then it is probably on Windows and lets try to create a junction
+    fs.symlinkSync(path.join(__dirname, '..', '..', 'source', 'node_modules', 'mod-a') + '\\', symlinkModADir, 'junction');
+}
+
+test('symlink', function (t) {
+    t.plan(2);
+
+    resolve('foo', { basedir: symlinkDir, preserveSymlinks: false }, function (err, res, pkg) {
+        t.error(err);
+        t.equal(res, path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'foo.js'));
+    });
+});
+
+test('sync symlink when preserveSymlinks = true', function (t) {
+    t.plan(4);
+
+    resolve('foo', { basedir: symlinkDir }, function (err, res, pkg) {
+        t.ok(err, 'there is an error');
+        t.notOk(res, 'no result');
+
+        t.equal(err && err.code, 'MODULE_NOT_FOUND', 'error code matches require.resolve');
+        t.equal(
+            err && err.message,
+            'Cannot find module \'foo\' from \'' + symlinkDir + '\'',
+            'can not find nonexistent module'
+        );
+    });
+});
+
+test('sync symlink', function (t) {
+    var start = new Date();
+    t.doesNotThrow(function () {
+        t.equal(resolve.sync('foo', { basedir: symlinkDir, preserveSymlinks: false }), path.join(__dirname, 'resolver', 'symlinked', '_', 'node_modules', 'foo.js'));
+    });
+    t.ok(new Date() - start < 50, 'resolve.sync timedout');
+    t.end();
+});
+
+test('sync symlink when preserveSymlinks = true', function (t) {
+    t.throws(function () {
+        resolve.sync('foo', { basedir: symlinkDir });
+    }, /Cannot find module 'foo'/);
+    t.end();
+});
+
+test('sync symlink from node_modules to other dir when preserveSymlinks = false', function (t) {
+    var basedir = path.join(__dirname, 'resolver', 'symlinked', '_');
+    var fn = resolve.sync('package', { basedir: basedir, preserveSymlinks: false });
+
+    t.equal(fn, path.resolve(__dirname, 'resolver/symlinked/package/bar.js'));
+    t.end();
+});
+
+test('async symlink from node_modules to other dir when preserveSymlinks = false', function (t) {
+    t.plan(2);
+    var basedir = path.join(__dirname, 'resolver', 'symlinked', '_');
+    resolve('package', { basedir: basedir, preserveSymlinks: false }, function (err, result) {
+        t.notOk(err, 'no error');
+        t.equal(result, path.resolve(__dirname, 'resolver/symlinked/package/bar.js'));
+    });
+});
+
+test('packageFilter', function (t) {
+    function relative(x) {
+        return path.relative(__dirname, x);
+    }
+
+    function testPackageFilter(preserveSymlinks) {
+        return function (st) {
+            st.plan('is 1.x' ? 3 : 5); // eslint-disable-line no-constant-condition
+
+            var destMain = 'symlinks/dest/node_modules/mod-a/index.js';
+            var destPkg = 'symlinks/dest/node_modules/mod-a/package.json';
+            var sourceMain = 'symlinks/source/node_modules/mod-a/index.js';
+            var sourcePkg = 'symlinks/source/node_modules/mod-a/package.json';
+            var destDir = path.join(__dirname, 'symlinks', 'dest');
+
+            /* eslint multiline-comment-style: 0 */
+            /* v2.x will restore these tests
+            var packageFilterPath = [];
+            var actualPath = resolve.sync('mod-a', {
+                basedir: destDir,
+                preserveSymlinks: preserveSymlinks,
+                packageFilter: function (pkg, pkgfile, dir) {
+                    packageFilterPath.push(pkgfile);
+                }
+            });
+            st.equal(
+                relative(actualPath),
+                path.normalize(preserveSymlinks ? destMain : sourceMain),
+                'sync: actual path is correct'
+            );
+            st.deepEqual(
+                map(packageFilterPath, relative),
+                map(preserveSymlinks ? [destPkg, destPkg] : [sourcePkg, sourcePkg], path.normalize),
+                'sync: packageFilter pkgfile arg is correct'
+            );
+            */
+
+            var asyncPackageFilterPath = [];
+            resolve(
+                'mod-a',
+                {
+                    basedir: destDir,
+                    preserveSymlinks: preserveSymlinks,
+                    packageFilter: function (pkg, pkgfile) {
+                        asyncPackageFilterPath.push(pkgfile);
+                    }
+                },
+                function (err, actualPath) {
+                    st.error(err, 'no error');
+                    st.equal(
+                        relative(actualPath),
+                        path.normalize(preserveSymlinks ? destMain : sourceMain),
+                        'async: actual path is correct'
+                    );
+                    st.deepEqual(
+                        map(asyncPackageFilterPath, relative),
+                        map(
+                            preserveSymlinks ? [destPkg, destPkg, destPkg] : [sourcePkg, sourcePkg, sourcePkg],
+                            path.normalize
+                        ),
+                        'async: packageFilter pkgfile arg is correct'
+                    );
+                }
+            );
+        };
+    }
+
+    t.test('preserveSymlinks: false', testPackageFilter(false));
+
+    t.test('preserveSymlinks: true', testPackageFilter(true));
+
+    t.end();
+});
diff --git a/node_modules/eslint-plugin-import/package.json b/node_modules/eslint-plugin-import/package.json
index 841128f..18fd70a 100644
--- a/node_modules/eslint-plugin-import/package.json
+++ b/node_modules/eslint-plugin-import/package.json
@@ -1,6 +1,6 @@
 {
   "name": "eslint-plugin-import",
-  "version": "2.20.1",
+  "version": "2.22.1",
   "description": "Import with sanity.",
   "engines": {
     "node": ">=4"
@@ -21,17 +21,17 @@
     "prebuild": "rimraf lib",
     "build": "babel --quiet --out-dir lib src",
     "postbuild": "npm run copy-metafiles",
-    "copy-metafiles": "for DIR in memo-parser resolvers/node resolvers/webpack utils; do cp LICENSE .npmrc \"${DIR}/\"; done",
-    "watch": "npm run mocha -- --watch tests/src",
+    "copy-metafiles": "node --require babel-register ./scripts/copyMetafiles",
+    "watch": "npm run tests-only -- -- --watch",
     "pretest": "linklocal",
     "posttest": "eslint .",
-    "mocha": "cross-env BABEL_ENV=test NODE_PATH=./src nyc -s mocha -R dot --recursive -t 5s",
+    "mocha": "cross-env BABEL_ENV=test nyc -s mocha",
     "tests-only": "npm run mocha tests/src",
     "test": "npm run tests-only",
-    "test-compiled": "npm run prepublish && NODE_PATH=./lib mocha --compilers js:babel-register --recursive tests/src",
-    "test-all": "npm test && for resolver in ./resolvers/*; do cd $resolver && npm test && cd ../..; done",
-    "prepublish": "npm run build",
-    "coveralls": "nyc report --reporter lcovonly && cat ./coverage/lcov.info | coveralls"
+    "test-compiled": "npm run prepublish && BABEL_ENV=testCompiled mocha --compilers js:babel-register tests/src",
+    "test-all": "node --require babel-register ./scripts/testAll",
+    "prepublish": "not-in-publish || npm run build",
+    "coveralls": "nyc report --reporter lcovonly && coveralls < ./coverage/lcov.info"
   },
   "repository": {
     "type": "git",
@@ -55,51 +55,61 @@
   "devDependencies": {
     "@eslint/import-test-order-redirect-scoped": "file:./tests/files/order-redirect-scoped",
     "@test-scope/some-module": "file:./tests/files/symlinked-module",
-    "@typescript-eslint/parser": "1.10.3-alpha.13",
+    "@typescript-eslint/parser": "^2.23.0 || ^3.3.0",
+    "array.prototype.flatmap": "^1.2.3",
     "babel-cli": "^6.26.0",
     "babel-core": "^6.26.3",
     "babel-eslint": "^8.2.6",
     "babel-plugin-istanbul": "^4.1.6",
+    "babel-plugin-module-resolver": "^2.7.1",
     "babel-preset-es2015-argon": "latest",
+    "babel-preset-flow": "^6.23.0",
     "babel-register": "^6.26.0",
     "babylon": "^6.18.0",
     "chai": "^4.2.0",
-    "coveralls": "^3.0.6",
+    "coveralls": "^3.1.0",
     "cross-env": "^4.0.0",
-    "eslint": "2.x - 6.x",
+    "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0",
     "eslint-import-resolver-node": "file:./resolvers/node",
-    "eslint-import-resolver-typescript": "^1.0.2",
+    "eslint-import-resolver-typescript": "^1.1.1",
     "eslint-import-resolver-webpack": "file:./resolvers/webpack",
     "eslint-import-test-order-redirect": "file:./tests/files/order-redirect",
     "eslint-module-utils": "file:./utils",
-    "eslint-plugin-eslint-plugin": "^2.2.1",
+    "eslint-plugin-eslint-plugin": "^2.3.0",
     "eslint-plugin-import": "2.x",
+    "eslint-plugin-json": "^2.1.2",
+    "fs-copy-file-sync": "^1.1.1",
+    "glob": "^7.1.6",
+    "in-publish": "^2.0.1",
     "linklocal": "^2.8.2",
+    "lodash.isarray": "^4.0.0",
     "mocha": "^3.5.3",
+    "npm-which": "^3.0.1",
     "nyc": "^11.9.0",
     "redux": "^3.7.2",
     "rimraf": "^2.7.1",
     "semver": "^6.3.0",
     "sinon": "^2.4.1",
-    "typescript": "~3.2.2",
+    "typescript": "~3.9.5",
     "typescript-eslint-parser": "^22.0.0"
   },
   "peerDependencies": {
-    "eslint": "2.x - 6.x"
+    "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0"
   },
   "dependencies": {
-    "array-includes": "^3.0.3",
-    "array.prototype.flat": "^1.2.1",
+    "array-includes": "^3.1.1",
+    "array.prototype.flat": "^1.2.3",
     "contains-path": "^0.1.0",
     "debug": "^2.6.9",
     "doctrine": "1.5.0",
-    "eslint-import-resolver-node": "^0.3.2",
-    "eslint-module-utils": "^2.4.1",
+    "eslint-import-resolver-node": "^0.3.4",
+    "eslint-module-utils": "^2.6.0",
     "has": "^1.0.3",
     "minimatch": "^3.0.4",
-    "object.values": "^1.1.0",
+    "object.values": "^1.1.1",
     "read-pkg-up": "^2.0.0",
-    "resolve": "^1.12.0"
+    "resolve": "^1.17.0",
+    "tsconfig-paths": "^3.9.0"
   },
   "nyc": {
     "require": [
diff --git a/node_modules/eslint-plugin-jest/CHANGELOG.md b/node_modules/eslint-plugin-jest/CHANGELOG.md
index 92bfbad..599e5a6 100644
--- a/node_modules/eslint-plugin-jest/CHANGELOG.md
+++ b/node_modules/eslint-plugin-jest/CHANGELOG.md
@@ -1,3 +1,10 @@
+# [24.1.0](https://github.com/jest-community/eslint-plugin-jest/compare/v24.0.2...v24.1.0) (2020-10-05)
+
+
+### Features
+
+* **prefer-expect-assertions:** add `onlyFunctionsWithAsyncKeyword` option ([#677](https://github.com/jest-community/eslint-plugin-jest/issues/677)) ([d0cea37](https://github.com/jest-community/eslint-plugin-jest/commit/d0cea37ae0a8ab07b8082cedbaaf161bcc94c405))
+
 ## [24.0.2](https://github.com/jest-community/eslint-plugin-jest/compare/v24.0.1...v24.0.2) (2020-09-20)
 
 
diff --git a/node_modules/eslint-plugin-jest/docs/rules/prefer-expect-assertions.md b/node_modules/eslint-plugin-jest/docs/rules/prefer-expect-assertions.md
index d997203..b80b63d 100644
--- a/node_modules/eslint-plugin-jest/docs/rules/prefer-expect-assertions.md
+++ b/node_modules/eslint-plugin-jest/docs/rules/prefer-expect-assertions.md
@@ -55,3 +55,45 @@
   expect(someThing()).toEqual('foo');
 });
 ```
+
+## Options
+
+#### `onlyFunctionsWithAsyncKeyword`
+
+When `true`, this rule will only warn for tests that use the `async` keyword.
+
+```json
+{
+  "rules": {
+    "jest/prefer-expect-assertions": [
+      "warn",
+      { "onlyFunctionsWithAsyncKeyword": true }
+    ]
+  }
+}
+```
+
+When `onlyFunctionsWithAsyncKeyword` option is set to `true`, the following
+pattern would be a warning:
+
+```js
+test('my test', async () => {
+  const result = await someAsyncFunc();
+  expect(result).toBe('foo');
+});
+```
+
+While the following patterns would not be considered warnings:
+
+```js
+test('my test', () => {
+  const result = someFunction();
+  expect(result).toBe('foo');
+});
+
+test('my test', async () => {
+  expect.assertions(1);
+  const result = await someAsyncFunc();
+  expect(result).toBe('foo');
+});
+```
diff --git a/node_modules/eslint-plugin-jest/lib/rules/prefer-expect-assertions.js b/node_modules/eslint-plugin-jest/lib/rules/prefer-expect-assertions.js
index 4414709..1552fe7 100644
--- a/node_modules/eslint-plugin-jest/lib/rules/prefer-expect-assertions.js
+++ b/node_modules/eslint-plugin-jest/lib/rules/prefer-expect-assertions.js
@@ -39,13 +39,27 @@
       suggestRemovingExtraArguments: 'Remove extra arguments'
     },
     type: 'suggestion',
-    schema: []
+    schema: [{
+      type: 'object',
+      properties: {
+        onlyFunctionsWithAsyncKeyword: {
+          type: 'boolean'
+        }
+      },
+      additionalProperties: false
+    }]
   },
-  defaultOptions: [],
+  defaultOptions: [{
+    onlyFunctionsWithAsyncKeyword: false
+  }],
 
-  create(context) {
+  create(context, [options]) {
     return {
       'CallExpression[callee.name=/^(it|test)$/][arguments.1.body.body]'(node) {
+        if (options.onlyFunctionsWithAsyncKeyword && !node.arguments[1].async) {
+          return;
+        }
+
         const testFuncBody = node.arguments[1].body.body;
 
         if (!isFirstLineExprStmt(testFuncBody)) {
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/CHANGELOG.md b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/CHANGELOG.md
deleted file mode 100644
index b32112b..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/CHANGELOG.md
+++ /dev/null
@@ -1,698 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-# [4.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.1...v4.1.0) (2020-09-07)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-## [4.0.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.0...v4.0.1) (2020-08-31)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [4.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.10.1...v4.0.0) (2020-08-31)
-
-## [Please see the release notes for v4.0.0](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v4.0.0)
-
-### Features
-
-* consume new scope analysis package ([#2039](https://github.com/typescript-eslint/typescript-eslint/issues/2039)) ([3be125d](https://github.com/typescript-eslint/typescript-eslint/commit/3be125d9bdbee1984ac6037874edf619213bd3d0))
-* support ESTree optional chaining representation ([#2308](https://github.com/typescript-eslint/typescript-eslint/issues/2308)) ([e9d2ab6](https://github.com/typescript-eslint/typescript-eslint/commit/e9d2ab638b6767700b52797e74b814ea059beaae))
-
-
-
-
-
-## [3.10.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.10.0...v3.10.1) (2020-08-25)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [3.10.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.9.1...v3.10.0) (2020-08-24)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-## [3.9.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.9.0...v3.9.1) (2020-08-17)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [3.9.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.8.0...v3.9.0) (2020-08-10)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [3.8.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.7.1...v3.8.0) (2020-08-03)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-## [3.7.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.7.0...v3.7.1) (2020-07-27)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [3.7.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.6.1...v3.7.0) (2020-07-20)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-## [3.6.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.6.0...v3.6.1) (2020-07-13)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [3.6.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.5.0...v3.6.0) (2020-07-06)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [3.5.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.4.0...v3.5.0) (2020-06-29)
-
-
-### Features
-
-* add package scope-manager ([#1939](https://github.com/typescript-eslint/typescript-eslint/issues/1939)) ([682eb7e](https://github.com/typescript-eslint/typescript-eslint/commit/682eb7e009c3f22a542882dfd3602196a60d2a1e))
-* split types into their own package ([#2229](https://github.com/typescript-eslint/typescript-eslint/issues/2229)) ([5f45918](https://github.com/typescript-eslint/typescript-eslint/commit/5f4591886f3438329fbf2229b03ac66174334a24))
-
-
-
-
-
-# [3.4.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.3.0...v3.4.0) (2020-06-22)
-
-
-### Bug Fixes
-
-* **experimental-utils:** correct types for TS versions older than 3.8 ([#2217](https://github.com/typescript-eslint/typescript-eslint/issues/2217)) ([5e4dda2](https://github.com/typescript-eslint/typescript-eslint/commit/5e4dda264a7d6a6a1626848e7599faea1ac34922))
-* **experimental-utils:** getParserServices takes a readonly context ([#2235](https://github.com/typescript-eslint/typescript-eslint/issues/2235)) ([26da8de](https://github.com/typescript-eslint/typescript-eslint/commit/26da8de7fcde9eddec63212d79af781c4bb22991))
-
-
-
-
-
-# [3.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.2.0...v3.3.0) (2020-06-15)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [3.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.1.0...v3.2.0) (2020-06-08)
-
-
-### Bug Fixes
-
-* **eslint-plugin:** [prefer-optional-chain] handling first member expression ([#2156](https://github.com/typescript-eslint/typescript-eslint/issues/2156)) ([de18660](https://github.com/typescript-eslint/typescript-eslint/commit/de18660a8cf8f7033798646d8c5b0938d1accb12))
-
-
-
-
-
-# [3.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.2...v3.1.0) (2020-06-01)
-
-
-### Bug Fixes
-
-* **experimental-utils:** downlevel type declarations for versions older than 3.8 ([#2133](https://github.com/typescript-eslint/typescript-eslint/issues/2133)) ([7925823](https://github.com/typescript-eslint/typescript-eslint/commit/792582326a8065270b69a0ffcaad5a7b4b103ff3))
-
-
-### Features
-
-* **eslint-plugin:** [explicit-module-boundary-types] improve accuracy and coverage ([#2135](https://github.com/typescript-eslint/typescript-eslint/issues/2135)) ([caaa859](https://github.com/typescript-eslint/typescript-eslint/commit/caaa8599284d02ab3341e282cad35a52d0fb86c7))
-
-
-
-
-
-## [3.0.2](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.1...v3.0.2) (2020-05-27)
-
-
-### Bug Fixes
-
-* regression for eslint v6 ([#2105](https://github.com/typescript-eslint/typescript-eslint/issues/2105)) ([31fc503](https://github.com/typescript-eslint/typescript-eslint/commit/31fc5039ed919e1515fda673c186d5c83eb5beb3))
-
-
-
-
-
-## [3.0.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.0...v3.0.1) (2020-05-25)
-
-
-### Bug Fixes
-
-* **experimental-utils:** export `CLIEngine` & `ESLint` ([#2083](https://github.com/typescript-eslint/typescript-eslint/issues/2083)) ([014341b](https://github.com/typescript-eslint/typescript-eslint/commit/014341bb23261f609fc2a6fe7fece191466a084a))
-
-
-
-
-
-# [3.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.34.0...v3.0.0) (2020-05-21)
-
-## [Please see the release notes for v3.0.0](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v3.0.0)
-
-### Bug Fixes
-
-* **experimental-utils:** add back SourceCode.isSpaceBetweenTokens ([ae82ea4](https://github.com/typescript-eslint/typescript-eslint/commit/ae82ea4a85a4ca332ebe6104e96c59dba30411be))
-* **typescript-estree:** remove now defunct `Import` node type ([f199cbd](https://github.com/typescript-eslint/typescript-eslint/commit/f199cbdbbd892b5ba03bfff66f463f3d9c92ee9b))
-
-
-### Features
-
-* **experimental-utils:** upgrade eslint types for v7 ([#2023](https://github.com/typescript-eslint/typescript-eslint/issues/2023)) ([06869c9](https://github.com/typescript-eslint/typescript-eslint/commit/06869c9656fa37936126666845aee40aad546ebd))
-* drop support for node v8 ([#1997](https://github.com/typescript-eslint/typescript-eslint/issues/1997)) ([b6c3b7b](https://github.com/typescript-eslint/typescript-eslint/commit/b6c3b7b84b8d199fa75a46432febd4a364a63217))
-* upgrade to ESLint v7 ([#2022](https://github.com/typescript-eslint/typescript-eslint/issues/2022)) ([208de71](https://github.com/typescript-eslint/typescript-eslint/commit/208de71059746bf38e94bd460346ffb2698a3e12))
-* **eslint-plugin:** [ban-types] rework default options ([#848](https://github.com/typescript-eslint/typescript-eslint/issues/848)) ([8e31d5d](https://github.com/typescript-eslint/typescript-eslint/commit/8e31d5dbe9fe5227fdbefcecfd50ce5dd51360c3))
-* **typescript-estree:** always return parserServices ([#716](https://github.com/typescript-eslint/typescript-eslint/issues/716)) ([5b23443](https://github.com/typescript-eslint/typescript-eslint/commit/5b23443c48f3f62424db3e742243f3568080b946))
-
-
-
-
-
-# [2.34.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.33.0...v2.34.0) (2020-05-18)
-
-
-### Features
-
-* **experimental-utils:** add `suggestion` property for rule  modules ([#2033](https://github.com/typescript-eslint/typescript-eslint/issues/2033)) ([f42a5b0](https://github.com/typescript-eslint/typescript-eslint/commit/f42a5b09ebfa173f418a99c552b0cbe221567194))
-
-
-
-
-
-# [2.33.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.32.0...v2.33.0) (2020-05-12)
-
-
-### Bug Fixes
-
-* **experimental-utils:** remove accidental dep on json-schema ([#2010](https://github.com/typescript-eslint/typescript-eslint/issues/2010)) ([1875fba](https://github.com/typescript-eslint/typescript-eslint/commit/1875fbad41f2a3dda8f610f5dcd180c6205b73d3))
-
-
-
-
-
-# [2.32.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.31.0...v2.32.0) (2020-05-11)
-
-
-### Features
-
-* bump dependencies and align AST ([#2007](https://github.com/typescript-eslint/typescript-eslint/issues/2007)) ([18668b7](https://github.com/typescript-eslint/typescript-eslint/commit/18668b78fd7d1e5281af7fc26c76e0ca53297f69))
-
-
-
-
-
-# [2.31.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.30.0...v2.31.0) (2020-05-04)
-
-
-### Features
-
-* **experimental-utils:** expose our RuleTester extension ([#1948](https://github.com/typescript-eslint/typescript-eslint/issues/1948)) ([2dd1638](https://github.com/typescript-eslint/typescript-eslint/commit/2dd1638aaa2658ba99b2341861146b586f489121))
-
-
-
-
-
-# [2.30.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.29.0...v2.30.0) (2020-04-27)
-
-
-### Features
-
-* **experimental-utils:** allow rule options to be a readonly tuple ([#1924](https://github.com/typescript-eslint/typescript-eslint/issues/1924)) ([4ef6788](https://github.com/typescript-eslint/typescript-eslint/commit/4ef67884962b6aac61cc895aaa3ba16aa892ecf4))
-
-
-
-
-
-# [2.29.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.28.0...v2.29.0) (2020-04-20)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.28.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.27.0...v2.28.0) (2020-04-13)
-
-
-### Features
-
-* **eslint-plugin:** add rule `prefer-reduce-type-parameter` ([#1707](https://github.com/typescript-eslint/typescript-eslint/issues/1707)) ([c92d240](https://github.com/typescript-eslint/typescript-eslint/commit/c92d240e49113779053eac32038382b282812afc))
-
-
-
-
-
-# [2.27.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.26.0...v2.27.0) (2020-04-06)
-
-
-### Features
-
-* **experimental-utils:** add types for suggestions from CLIEngine ([#1844](https://github.com/typescript-eslint/typescript-eslint/issues/1844)) ([7c11bd6](https://github.com/typescript-eslint/typescript-eslint/commit/7c11bd66f2d0e5ea9d3943e6b8c66e6ddff50862))
-* **experimental-utils:** update eslint types to match v6.8 ([#1846](https://github.com/typescript-eslint/typescript-eslint/issues/1846)) ([16ce74d](https://github.com/typescript-eslint/typescript-eslint/commit/16ce74d247781ac890dc0baa30c384f97e581b6b))
-
-
-
-
-
-# [2.26.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.25.0...v2.26.0) (2020-03-30)
-
-
-### Features
-
-* **typescript-estree:** add option to ignore certain folders from glob resolution ([#1802](https://github.com/typescript-eslint/typescript-eslint/issues/1802)) ([1e29e69](https://github.com/typescript-eslint/typescript-eslint/commit/1e29e69b289d61107a7de67592beae331ba50222))
-
-
-
-
-
-# [2.25.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.24.0...v2.25.0) (2020-03-23)
-
-
-### Features
-
-* **experimental-utils:** expose ast utility functions ([#1670](https://github.com/typescript-eslint/typescript-eslint/issues/1670)) ([3eb5d45](https://github.com/typescript-eslint/typescript-eslint/commit/3eb5d4525e95c8ab990f55588b8d830a02ce5a9c))
-
-
-
-
-
-# [2.24.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.23.0...v2.24.0) (2020-03-16)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.23.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.22.0...v2.23.0) (2020-03-09)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.22.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.21.0...v2.22.0) (2020-03-02)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.21.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.20.0...v2.21.0) (2020-02-24)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.20.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.19.2...v2.20.0) (2020-02-17)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-## [2.19.2](https://github.com/typescript-eslint/typescript-eslint/compare/v2.19.1...v2.19.2) (2020-02-10)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-## [2.19.1](https://github.com/typescript-eslint/typescript-eslint/compare/v2.19.0...v2.19.1) (2020-02-10)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.19.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.18.0...v2.19.0) (2020-02-03)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.18.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.17.0...v2.18.0) (2020-01-27)
-
-
-### Bug Fixes
-
-* improve token types and add missing type guards ([#1497](https://github.com/typescript-eslint/typescript-eslint/issues/1497)) ([ce41d7d](https://github.com/typescript-eslint/typescript-eslint/commit/ce41d7de33bcb7ccf96c03ac1438304c5a49ff54))
-* **experimental-utils:** widen type of `settings` property ([#1527](https://github.com/typescript-eslint/typescript-eslint/issues/1527)) ([b515e47](https://github.com/typescript-eslint/typescript-eslint/commit/b515e47af2bc914c7ebcfa4be813409dcd86b1c3))
-
-
-### Features
-
-* **experimental-utils:** make RuleMetaData.docs optional ([#1462](https://github.com/typescript-eslint/typescript-eslint/issues/1462)) ([cde97ac](https://github.com/typescript-eslint/typescript-eslint/commit/cde97aca24df5a0f28f37006ed130ebc217fb2ad))
-* **parser:** clean up scope-analysis types ([#1481](https://github.com/typescript-eslint/typescript-eslint/issues/1481)) ([4a727fa](https://github.com/typescript-eslint/typescript-eslint/commit/4a727fa083d749dba9eaf39322856f5f69c28cd8))
-
-
-
-
-
-# [2.17.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.16.0...v2.17.0) (2020-01-20)
-
-
-### Features
-
-* **experimental-utils:** expose getParserServices from utils ([#1448](https://github.com/typescript-eslint/typescript-eslint/issues/1448)) ([982c8bc](https://github.com/typescript-eslint/typescript-eslint/commit/982c8bc))
-
-
-
-
-
-# [2.16.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.15.0...v2.16.0) (2020-01-13)
-
-
-### Features
-
-* **typescript-estree:** add parserOption to turn on debug logs ([#1413](https://github.com/typescript-eslint/typescript-eslint/issues/1413)) ([25092fd](https://github.com/typescript-eslint/typescript-eslint/commit/25092fd))
-* **typescript-estree:** add strict type mapping to esTreeNodeToTSNodeMap ([#1382](https://github.com/typescript-eslint/typescript-eslint/issues/1382)) ([d3d70a3](https://github.com/typescript-eslint/typescript-eslint/commit/d3d70a3))
-
-
-
-
-
-# [2.15.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.14.0...v2.15.0) (2020-01-06)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.14.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.13.0...v2.14.0) (2019-12-30)
-
-
-### Features
-
-* add internal eslint plugin for repo-specific lint rules ([#1373](https://github.com/typescript-eslint/typescript-eslint/issues/1373)) ([3a15413](https://github.com/typescript-eslint/typescript-eslint/commit/3a15413))
-
-
-
-
-
-# [2.13.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.12.0...v2.13.0) (2019-12-23)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.12.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.11.0...v2.12.0) (2019-12-16)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.11.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.10.0...v2.11.0) (2019-12-09)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.10.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.9.0...v2.10.0) (2019-12-02)
-
-
-### Features
-
-* **eslint-plugin:** [no-non-null-assert] add suggestion fixer ([#1260](https://github.com/typescript-eslint/typescript-eslint/issues/1260)) ([e350a21](https://github.com/typescript-eslint/typescript-eslint/commit/e350a21))
-* **experimental-utils:** add isSpaceBetween declaration to Sou… ([#1268](https://github.com/typescript-eslint/typescript-eslint/issues/1268)) ([f83f04b](https://github.com/typescript-eslint/typescript-eslint/commit/f83f04b))
-
-
-
-
-
-# [2.9.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.8.0...v2.9.0) (2019-11-25)
-
-
-### Features
-
-* suggestion types, suggestions for no-explicit-any ([#1250](https://github.com/typescript-eslint/typescript-eslint/issues/1250)) ([b16a4b6](https://github.com/typescript-eslint/typescript-eslint/commit/b16a4b6))
-* **eslint-plugin:** add prefer-nullish-coalescing ([#1069](https://github.com/typescript-eslint/typescript-eslint/issues/1069)) ([a9cd399](https://github.com/typescript-eslint/typescript-eslint/commit/a9cd399))
-* **eslint-plugin:** add rule prefer-optional-chain ([#1213](https://github.com/typescript-eslint/typescript-eslint/issues/1213)) ([ad7e1a7](https://github.com/typescript-eslint/typescript-eslint/commit/ad7e1a7))
-
-
-
-
-
-# [2.8.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.7.0...v2.8.0) (2019-11-18)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.7.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.6.1...v2.7.0) (2019-11-11)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-## [2.6.1](https://github.com/typescript-eslint/typescript-eslint/compare/v2.6.0...v2.6.1) (2019-11-04)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.6.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.5.0...v2.6.0) (2019-10-28)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.5.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.4.0...v2.5.0) (2019-10-21)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.4.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.3.3...v2.4.0) (2019-10-14)
-
-
-### Bug Fixes
-
-* support long running "watch" lint sessions ([#973](https://github.com/typescript-eslint/typescript-eslint/issues/973)) ([854620e](https://github.com/typescript-eslint/typescript-eslint/commit/854620e))
-
-
-### Features
-
-* **typescript-estree:** support for parsing 3.7 features ([#1045](https://github.com/typescript-eslint/typescript-eslint/issues/1045)) ([623febf](https://github.com/typescript-eslint/typescript-eslint/commit/623febf))
-
-
-
-
-
-## [2.3.3](https://github.com/typescript-eslint/typescript-eslint/compare/v2.3.2...v2.3.3) (2019-10-07)
-
-
-### Bug Fixes
-
-* **experimental-utils:** remove Rule.meta.extraDescription ([#1036](https://github.com/typescript-eslint/typescript-eslint/issues/1036)) ([192e23d](https://github.com/typescript-eslint/typescript-eslint/commit/192e23d))
-
-
-
-
-
-## [2.3.2](https://github.com/typescript-eslint/typescript-eslint/compare/v2.3.1...v2.3.2) (2019-09-30)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-## [2.3.1](https://github.com/typescript-eslint/typescript-eslint/compare/v2.3.0...v2.3.1) (2019-09-23)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.2.0...v2.3.0) (2019-09-16)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.1.0...v2.2.0) (2019-09-09)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.0.0...v2.1.0) (2019-09-02)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [2.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.13.0...v2.0.0) (2019-08-13)
-
-
-### Bug Fixes
-
-* **eslint-plugin:** add `Literal` to `RuleListener` types ([#824](https://github.com/typescript-eslint/typescript-eslint/issues/824)) ([3c902a1](https://github.com/typescript-eslint/typescript-eslint/commit/3c902a1))
-* **utils:** add ES2019 as valid `ecmaVersion` ([#746](https://github.com/typescript-eslint/typescript-eslint/issues/746)) ([d11fbbe](https://github.com/typescript-eslint/typescript-eslint/commit/d11fbbe))
-
-
-### Features
-
-* explicitly support eslint v6 ([#645](https://github.com/typescript-eslint/typescript-eslint/issues/645)) ([34a7cf6](https://github.com/typescript-eslint/typescript-eslint/commit/34a7cf6))
-
-
-* feat(eslint-plugin)!: recommended-requiring-type-checking config (#846) ([d3470c9](https://github.com/typescript-eslint/typescript-eslint/commit/d3470c9)), closes [#846](https://github.com/typescript-eslint/typescript-eslint/issues/846)
-* feat(eslint-plugin)!: change recommended config (#729) ([428567d](https://github.com/typescript-eslint/typescript-eslint/commit/428567d)), closes [#729](https://github.com/typescript-eslint/typescript-eslint/issues/729)
-* feat(eslint-plugin)!: add rule `consistent-type-assertions` (#731) ([92e98de](https://github.com/typescript-eslint/typescript-eslint/commit/92e98de)), closes [#731](https://github.com/typescript-eslint/typescript-eslint/issues/731)
-
-
-### BREAKING CHANGES
-
-* removed some rules from recommended config
-* recommended config changes are considered breaking
-* Merges both no-angle-bracket-type-assertion and no-object-literal-type-assertion into one rule
-* Node 6 is no longer supported
-
-
-
-
-
-# [1.13.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.12.0...v1.13.0) (2019-07-21)
-
-
-### Bug Fixes
-
-* Correct `@types/json-schema` dependency ([#675](https://github.com/typescript-eslint/typescript-eslint/issues/675)) ([a5398ce](https://github.com/typescript-eslint/typescript-eslint/commit/a5398ce))
-* **utils:** move `typescript` from peer dep to dev dep ([#712](https://github.com/typescript-eslint/typescript-eslint/issues/712)) ([f949355](https://github.com/typescript-eslint/typescript-eslint/commit/f949355))
-* **utils:** RuleTester should not require a parser ([#713](https://github.com/typescript-eslint/typescript-eslint/issues/713)) ([158a417](https://github.com/typescript-eslint/typescript-eslint/commit/158a417))
-
-
-### Features
-
-* **eslint-plugin:** add new rule no-misused-promises ([#612](https://github.com/typescript-eslint/typescript-eslint/issues/612)) ([28a131d](https://github.com/typescript-eslint/typescript-eslint/commit/28a131d))
-
-
-
-
-
-# [1.12.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.11.0...v1.12.0) (2019-07-12)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-
-
-
-
-# [1.11.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.10.2...v1.11.0) (2019-06-23)
-
-
-### Bug Fixes
-
-* **eslint-plugin:** Remove duplicated code ([#611](https://github.com/typescript-eslint/typescript-eslint/issues/611)) ([c4df4ff](https://github.com/typescript-eslint/typescript-eslint/commit/c4df4ff))
-
-
-### Features
-
-* **eslint-plugin:** add `consistent-type-definitions` rule ([#463](https://github.com/typescript-eslint/typescript-eslint/issues/463)) ([ec87d06](https://github.com/typescript-eslint/typescript-eslint/commit/ec87d06))
-
-
-
-
-
-## [1.10.2](https://github.com/typescript-eslint/typescript-eslint/compare/v1.10.1...v1.10.2) (2019-06-10)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-## [1.10.1](https://github.com/typescript-eslint/typescript-eslint/compare/v1.10.0...v1.10.1) (2019-06-09)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-# [1.10.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.9.0...v1.10.0) (2019-06-09)
-
-### Bug Fixes
-
-- **experimental-utils:** add `endLine` and `endColumn` ([#517](https://github.com/typescript-eslint/typescript-eslint/issues/517)) ([d9e5f15](https://github.com/typescript-eslint/typescript-eslint/commit/d9e5f15))
-- **experimental-utils:** Avoid typescript import at runtime ([#584](https://github.com/typescript-eslint/typescript-eslint/issues/584)) ([fac5c7d](https://github.com/typescript-eslint/typescript-eslint/commit/fac5c7d)), closes [/github.com/typescript-eslint/typescript-eslint/pull/425#issuecomment-498162293](https://github.com//github.com/typescript-eslint/typescript-eslint/pull/425/issues/issuecomment-498162293)
-
-### Features
-
-- make utils/TSESLint export typed classes instead of just types ([#526](https://github.com/typescript-eslint/typescript-eslint/issues/526)) ([370ac72](https://github.com/typescript-eslint/typescript-eslint/commit/370ac72))
-- support TypeScript versions >=3.2.1 <3.6.0 ([#597](https://github.com/typescript-eslint/typescript-eslint/issues/597)) ([5d2b962](https://github.com/typescript-eslint/typescript-eslint/commit/5d2b962))
-
-# [1.9.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.8.0...v1.9.0) (2019-05-12)
-
-**Note:** Version bump only for package @typescript-eslint/experimental-utils
-
-# [1.8.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.7.0...v1.8.0) (2019-05-10)
-
-### Features
-
-- Move shared types into their own package ([#425](https://github.com/typescript-eslint/typescript-eslint/issues/425)) ([a7a03ce](https://github.com/typescript-eslint/typescript-eslint/commit/a7a03ce))
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/LICENSE b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/LICENSE
deleted file mode 100644
index 7e73701..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2019 TypeScript ESLint and other contributors
-
-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/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/README.md b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/README.md
deleted file mode 100644
index 208578b..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-<h1 align="center">Utils for ESLint Plugins</h1>
-
-<p align="center">Utilities for working with TypeScript + ESLint together.</p>
-
-<p align="center">
-    <img src="https://github.com/typescript-eslint/typescript-eslint/workflows/CI/badge.svg" alt="CI" />
-    <a href="https://www.npmjs.com/package/@typescript-eslint/eslint-plugin"><img src="https://img.shields.io/npm/v/@typescript-eslint/eslint-plugin.svg?style=flat-square" alt="NPM Version" /></a>
-    <a href="https://www.npmjs.com/package/@typescript-eslint/eslint-plugin"><img src="https://img.shields.io/npm/dm/@typescript-eslint/eslint-plugin.svg?style=flat-square" alt="NPM Downloads" /></a>
-</p>
-
-## Note
-
-This package has inherited its version number from the `@typescript-eslint` project.
-Meaning that even though this package is `2.x.y`, you shouldn't expect 100% stability between minor version bumps.
-i.e. treat it as a `0.x.y` package.
-
-Feel free to use it now, and let us know what utilities you need or send us PRs with utilities you build on top of it.
-
-Once it is stable, it will be renamed to `@typescript-eslint/util` for a `4.0.0` release.
-
-## Exports
-
-| Name                                                           | Description                                                                                                                                                                                                                       |
-| -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [`ASTUtils`](./src/ast-utils)                                  | Tools for operating on the ESTree AST. Also includes the [`eslint-utils`](https://www.npmjs.com/package/eslint-utils) package, correctly typed to work with the types found in `TSESTree`                                         |
-| [`ESLintUtils`](./src/eslint-utils)                            | Tools for creating ESLint rules with TypeScript.                                                                                                                                                                                  |
-| `JSONSchema`                                                   | Types from the [`@types/json-schema`](https://www.npmjs.com/package/@types/json-schema) package, re-exported to save you having to manually import them. Also ensures you're using the same version of the types as this package. |
-| [`TSESLint`](./src/ts-eslint)                                  | Types for ESLint, correctly typed to work with the types found in `TSESTree`.                                                                                                                                                     |
-| [`TSESLintScope`](./src/ts-eslint-scope)                       | The [`eslint-scope`](https://www.npmjs.com/package/eslint-scope) package, correctly typed to work with the types found in both `TSESTree` and `TSESLint`                                                                          |
-| [`TSESTree`](../types/src/ts-estree.ts)                        | Types for the TypeScript flavor of ESTree created by `@typescript-eslint/typescript-estree`.                                                                                                                                      |
-| [`AST_NODE_TYPES`](../types/src/ast-node-types.ts)             | An enum with the names of every single _node_ found in `TSESTree`.                                                                                                                                                                |
-| [`AST_TOKEN_TYPES`](../types/src/ast-token-types.ts)           | An enum with the names of every single _token_ found in `TSESTree`.                                                                                                                                                               |
-| [`ParserServices`](../typescript-estree/src/parser-options.ts) | Typing for the parser services provided when parsing a file using `@typescript-eslint/typescript-estree`.                                                                                                                         |
-
-## Contributing
-
-[See the contributing guide here](../../CONTRIBUTING.md)
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/RuleTester.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/RuleTester.d.ts
deleted file mode 100644
index 2479b2e..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/RuleTester.d.ts
+++ /dev/null
@@ -1,137 +0,0 @@
-import { AST_NODE_TYPES, AST_TOKEN_TYPES } from '../ts-estree';
-import { ParserOptions } from './ParserOptions';
-import { RuleModule } from './Rule';
-interface ValidTestCase<TOptions extends Readonly<unknown[]>> {
-    /**
-     * Code for the test case.
-     */
-    readonly code: string;
-    /**
-     * Environments for the test case.
-     */
-    readonly env?: Readonly<Record<string, boolean>>;
-    /**
-     * The fake filename for the test case. Useful for rules that make assertion about filenames.
-     */
-    readonly filename?: string;
-    /**
-     * The additional global variables.
-     */
-    readonly globals?: Record<string, 'readonly' | 'writable' | 'off'>;
-    /**
-     * Options for the test case.
-     */
-    readonly options?: Readonly<TOptions>;
-    /**
-     * The absolute path for the parser.
-     */
-    readonly parser?: string;
-    /**
-     * Options for the parser.
-     */
-    readonly parserOptions?: Readonly<ParserOptions>;
-    /**
-     * Settings for the test case.
-     */
-    readonly settings?: Readonly<Record<string, unknown>>;
-}
-interface SuggestionOutput<TMessageIds extends string> {
-    /**
-     * Reported message ID.
-     */
-    readonly messageId: TMessageIds;
-    /**
-     * The data used to fill the message template.
-     */
-    readonly data?: Readonly<Record<string, unknown>>;
-    /**
-     * NOTE: Suggestions will be applied as a stand-alone change, without triggering multi-pass fixes.
-     * Each individual error has its own suggestion, so you have to show the correct, _isolated_ output for each suggestion.
-     */
-    readonly output: string;
-}
-interface InvalidTestCase<TMessageIds extends string, TOptions extends Readonly<unknown[]>> extends ValidTestCase<TOptions> {
-    /**
-     * Expected errors.
-     */
-    readonly errors: TestCaseError<TMessageIds>[];
-    /**
-     * The expected code after autofixes are applied. If set to `null`, the test runner will assert that no autofix is suggested.
-     */
-    readonly output?: string | null;
-}
-interface TestCaseError<TMessageIds extends string> {
-    /**
-     * The 1-based column number of the reported start location.
-     */
-    readonly column?: number;
-    /**
-     * The data used to fill the message template.
-     */
-    readonly data?: Readonly<Record<string, unknown>>;
-    /**
-     * The 1-based column number of the reported end location.
-     */
-    readonly endColumn?: number;
-    /**
-     * The 1-based line number of the reported end location.
-     */
-    readonly endLine?: number;
-    /**
-     * The 1-based line number of the reported start location.
-     */
-    readonly line?: number;
-    /**
-     * Reported message ID.
-     */
-    readonly messageId: TMessageIds;
-    /**
-     * Reported suggestions.
-     */
-    readonly suggestions?: SuggestionOutput<TMessageIds>[] | null;
-    /**
-     * The type of the reported AST node.
-     */
-    readonly type?: AST_NODE_TYPES | AST_TOKEN_TYPES;
-}
-interface RunTests<TMessageIds extends string, TOptions extends Readonly<unknown[]>> {
-    readonly valid: (ValidTestCase<TOptions> | string)[];
-    readonly invalid: InvalidTestCase<TMessageIds, TOptions>[];
-}
-interface RuleTesterConfig {
-    readonly parser: string;
-    readonly parserOptions?: Readonly<ParserOptions>;
-}
-declare class RuleTesterBase {
-    /**
-     * Creates a new instance of RuleTester.
-     * @param testerConfig extra configuration for the tester
-     */
-    constructor(testerConfig?: RuleTesterConfig);
-    /**
-     * Adds a new rule test to execute.
-     * @param ruleName The name of the rule to run.
-     * @param rule The rule to test.
-     * @param test The collection of tests to run.
-     */
-    run<TMessageIds extends string, TOptions extends Readonly<unknown[]>>(ruleName: string, rule: RuleModule<TMessageIds, TOptions>, tests: RunTests<TMessageIds, TOptions>): void;
-    /**
-     * If you supply a value to this property, the rule tester will call this instead of using the version defined on
-     * the global namespace.
-     * @param text a string describing the rule
-     * @param callback the test callback
-     */
-    static describe?: (text: string, callback: () => void) => void;
-    /**
-     * If you supply a value to this property, the rule tester will call this instead of using the version defined on
-     * the global namespace.
-     * @param text a string describing the test case
-     * @param callback the test callback
-     */
-    static it?: (text: string, callback: () => void) => void;
-}
-declare const RuleTester_base: typeof RuleTesterBase;
-declare class RuleTester extends RuleTester_base {
-}
-export { InvalidTestCase, SuggestionOutput, RuleTester, RuleTesterConfig, RunTests, TestCaseError, ValidTestCase, };
-//# sourceMappingURL=RuleTester.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Scope.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Scope.d.ts
deleted file mode 100644
index 79dfc9d..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/_ts3.4/dist/ts-eslint/Scope.d.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import * as scopeManager from '@typescript-eslint/scope-manager';
-import { TSESTree } from '@typescript-eslint/types';
-declare namespace Scope {
-    class ESLintScopeVariable {
-        readonly defs: Definition[];
-        readonly identifiers: TSESTree.Identifier[];
-        readonly name: string;
-        readonly references: Reference[];
-        readonly scope: Scope;
-        /**
-         * Written to by ESLint.
-         * If this key exists, this variable is a global variable added by ESLint.
-         * If this is `true`, this variable can be assigned arbitrary values.
-         * If this is `false`, this variable is readonly.
-         */
-        writeable?: boolean;
-        /**
-         * Written to by ESLint.
-         * This property is undefined if there are no globals directive comments.
-         * The array of globals directive comments which defined this global variable in the source code file.
-         */
-        eslintExplicitGlobal?: boolean;
-        /**
-         * Written to by ESLint.
-         * The configured value in config files. This can be different from `variable.writeable` if there are globals directive comments.
-         */
-        eslintImplicitGlobalSetting?: 'readonly' | 'writable';
-        /**
-         * Written to by ESLint.
-         * If this key exists, it is a global variable added by ESLint.
-         * If `true`, this global variable was defined by a globals directive comment in the source code file.
-         */
-        eslintExplicitGlobalComments?: TSESTree.Comment[];
-    }
-    export type ScopeManager = scopeManager.ScopeManager;
-    export type Reference = scopeManager.Reference;
-    export type Variable = scopeManager.Variable | ESLintScopeVariable;
-    export type Scope = scopeManager.Scope;
-    export type DefinitionType = scopeManager.Definition;
-    export type Definition = scopeManager.Definition;
-    export {};
-}
-export { Scope };
-//# sourceMappingURL=Scope.d.ts.map
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts
deleted file mode 100644
index 565a6a9..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { RuleMetaData, RuleMetaDataDocs, RuleListener, RuleContext, RuleModule } from '../ts-eslint/Rule';
-declare type CreateRuleMetaDocs = Omit<RuleMetaDataDocs, 'url'>;
-declare type CreateRuleMeta<TMessageIds extends string> = {
-    docs: CreateRuleMetaDocs;
-} & Omit<RuleMetaData<TMessageIds>, 'docs'>;
-declare function RuleCreator(urlCreator: (ruleName: string) => string): <TOptions extends readonly unknown[], TMessageIds extends string, TRuleListener extends RuleListener = RuleListener>({ name, meta, defaultOptions, create, }: Readonly<{
-    name: string;
-    meta: CreateRuleMeta<TMessageIds>;
-    defaultOptions: Readonly<TOptions>;
-    create: (context: Readonly<RuleContext<TMessageIds, TOptions>>, optionsWithDefault: Readonly<TOptions>) => TRuleListener;
-}>) => RuleModule<TMessageIds, TOptions, TRuleListener>;
-export { RuleCreator };
-//# sourceMappingURL=RuleCreator.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts.map
deleted file mode 100644
index 2d86f2a..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"RuleCreator.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/RuleCreator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,UAAU,EACX,MAAM,mBAAmB,CAAC;AAI3B,aAAK,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AACxD,aAAK,cAAc,CAAC,WAAW,SAAS,MAAM,IAAI;IAChD,IAAI,EAAE,kBAAkB,CAAC;CAC1B,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;AAE5C,iBAAS,WAAW,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM;UAanD,MAAM;;;;wDA2Bf;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js
deleted file mode 100644
index cba8ed6..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js
+++ /dev/null
@@ -1,19 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.RuleCreator = void 0;
-const applyDefault_1 = require("./applyDefault");
-function RuleCreator(urlCreator) {
-    // This function will get much easier to call when this is merged https://github.com/Microsoft/TypeScript/pull/26349
-    // TODO - when the above PR lands; add type checking for the context.report `data` property
-    return function createRule({ name, meta, defaultOptions, create, }) {
-        return {
-            meta: Object.assign(Object.assign({}, meta), { docs: Object.assign(Object.assign({}, meta.docs), { url: urlCreator(name) }) }),
-            create(context) {
-                const optionsWithDefault = applyDefault_1.applyDefault(defaultOptions, context.options);
-                return create(context, optionsWithDefault);
-            },
-        };
-    };
-}
-exports.RuleCreator = RuleCreator;
-//# sourceMappingURL=RuleCreator.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js.map
deleted file mode 100644
index cea4eb0..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/RuleCreator.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"RuleCreator.js","sourceRoot":"","sources":["../../src/eslint-utils/RuleCreator.ts"],"names":[],"mappings":";;;AAOA,iDAA8C;AAQ9C,SAAS,WAAW,CAAC,UAAwC;IAC3D,oHAAoH;IACpH,2FAA2F;IAC3F,OAAO,SAAS,UAAU,CAIxB,EACA,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,MAAM,GASN;QACA,OAAO;YACL,IAAI,kCACC,IAAI,KACP,IAAI,kCACC,IAAI,CAAC,IAAI,KACZ,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,MAExB;YACD,MAAM,CACJ,OAAqD;gBAErD,MAAM,kBAAkB,GAAG,2BAAY,CACrC,cAAc,EACd,OAAO,CAAC,OAAO,CAChB,CAAC;gBACF,OAAO,MAAM,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YAC7C,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAEQ,kCAAW"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts
deleted file mode 100644
index b92df58..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * Pure function - doesn't mutate either parameter!
- * Uses the default options and overrides with the options provided by the user
- * @param defaultOptions the defaults
- * @param userOptions the user opts
- * @returns the options with defaults
- */
-declare function applyDefault<TUser extends readonly unknown[], TDefault extends TUser>(defaultOptions: TDefault, userOptions: TUser | null): TDefault;
-export { applyDefault };
-//# sourceMappingURL=applyDefault.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts.map
deleted file mode 100644
index 50c710e..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"applyDefault.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/applyDefault.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,iBAAS,YAAY,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EAAE,QAAQ,SAAS,KAAK,EAC5E,cAAc,EAAE,QAAQ,EACxB,WAAW,EAAE,KAAK,GAAG,IAAI,GACxB,QAAQ,CAuBV;AAMD,OAAO,EAAE,YAAY,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js
deleted file mode 100644
index 6ae1a79..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js
+++ /dev/null
@@ -1,32 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.applyDefault = void 0;
-const deepMerge_1 = require("./deepMerge");
-/**
- * Pure function - doesn't mutate either parameter!
- * Uses the default options and overrides with the options provided by the user
- * @param defaultOptions the defaults
- * @param userOptions the user opts
- * @returns the options with defaults
- */
-function applyDefault(defaultOptions, userOptions) {
-    // clone defaults
-    const options = JSON.parse(JSON.stringify(defaultOptions));
-    if (userOptions === null || userOptions === undefined) {
-        return options;
-    }
-    options.forEach((opt, i) => {
-        if (userOptions[i] !== undefined) {
-            const userOpt = userOptions[i];
-            if (deepMerge_1.isObjectNotArray(userOpt) && deepMerge_1.isObjectNotArray(opt)) {
-                options[i] = deepMerge_1.deepMerge(opt, userOpt);
-            }
-            else {
-                options[i] = userOpt;
-            }
-        }
-    });
-    return options;
-}
-exports.applyDefault = applyDefault;
-//# sourceMappingURL=applyDefault.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js.map
deleted file mode 100644
index 797a3b5..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/applyDefault.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"applyDefault.js","sourceRoot":"","sources":["../../src/eslint-utils/applyDefault.ts"],"names":[],"mappings":";;;AAAA,2CAA0D;AAE1D;;;;;;GAMG;AACH,SAAS,YAAY,CACnB,cAAwB,EACxB,WAAyB;IAEzB,iBAAiB;IACjB,MAAM,OAAO,GAAwB,IAAI,CAAC,KAAK,CAC7C,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAC/B,CAAC;IAEF,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,SAAS,EAAE;QACrD,OAAO,OAAO,CAAC;KAChB;IAED,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACzB,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;YAChC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAE/B,IAAI,4BAAgB,CAAC,OAAO,CAAC,IAAI,4BAAgB,CAAC,GAAG,CAAC,EAAE;gBACtD,OAAO,CAAC,CAAC,CAAC,GAAG,qBAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;aACtC;iBAAM;gBACL,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;aACtB;SACF;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAMQ,oCAAY"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.d.ts
deleted file mode 100644
index 3411802..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.d.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { ValidTestCase, InvalidTestCase } from '../ts-eslint';
-/**
- * Converts a batch of single line tests into a number of separate test cases.
- * This makes it easier to write tests which use the same options.
- *
- * Why wouldn't you just leave them as one test?
- * Because it makes the test error messages harder to decipher.
- * This way each line will fail separately, instead of them all failing together.
- */
-declare function batchedSingleLineTests<TOptions extends Readonly<unknown[]>>(test: ValidTestCase<TOptions>): ValidTestCase<TOptions>[];
-/**
- * Converts a batch of single line tests into a number of separate test cases.
- * This makes it easier to write tests which use the same options.
- *
- * Why wouldn't you just leave them as one test?
- * Because it makes the test error messages harder to decipher.
- * This way each line will fail separately, instead of them all failing together.
- *
- * Make sure you have your line numbers correct for error reporting, as it will match
- * the line numbers up with the split tests!
- */
-declare function batchedSingleLineTests<TMessageIds extends string, TOptions extends Readonly<unknown[]>>(test: InvalidTestCase<TMessageIds, TOptions>): InvalidTestCase<TMessageIds, TOptions>[];
-export { batchedSingleLineTests };
-//# sourceMappingURL=batchedSingleLineTests.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.d.ts.map
deleted file mode 100644
index 55841a1..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"batchedSingleLineTests.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/batchedSingleLineTests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE9D;;;;;;;GAOG;AACH,iBAAS,sBAAsB,CAAC,QAAQ,SAAS,QAAQ,CAAC,OAAO,EAAE,CAAC,EAClE,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,GAC5B,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC7B;;;;;;;;;;GAUG;AACH,iBAAS,sBAAsB,CAC7B,WAAW,SAAS,MAAM,EAC1B,QAAQ,SAAS,QAAQ,CAAC,OAAO,EAAE,CAAC,EAEpC,IAAI,EAAE,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,GAC3C,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;AAwC5C,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js
deleted file mode 100644
index 7ff9390..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.batchedSingleLineTests = void 0;
-function batchedSingleLineTests(options) {
-    // eslint counts lines from 1
-    const lineOffset = options.code.startsWith('\n') ? 2 : 1;
-    const output = 'output' in options && options.output
-        ? options.output.trim().split('\n')
-        : null;
-    return options.code
-        .trim()
-        .split('\n')
-        .map((code, i) => {
-        const lineNum = i + lineOffset;
-        const errors = 'errors' in options
-            ? options.errors.filter(e => e.line === lineNum)
-            : [];
-        const returnVal = Object.assign(Object.assign({}, options), { code, errors: errors.map(e => (Object.assign(Object.assign({}, e), { line: 1 }))) });
-        if (output === null || output === void 0 ? void 0 : output[i]) {
-            return Object.assign(Object.assign({}, returnVal), { output: output[i] });
-        }
-        return returnVal;
-    });
-}
-exports.batchedSingleLineTests = batchedSingleLineTests;
-//# sourceMappingURL=batchedSingleLineTests.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js.map
deleted file mode 100644
index 31f68d6..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/batchedSingleLineTests.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"batchedSingleLineTests.js","sourceRoot":"","sources":["../../src/eslint-utils/batchedSingleLineTests.ts"],"names":[],"mappings":";;;AA8BA,SAAS,sBAAsB,CAI7B,OAAyE;IAEzE,6BAA6B;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GACV,QAAQ,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM;QACnC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC;IACX,OAAO,OAAO,CAAC,IAAI;SAChB,IAAI,EAAE;SACN,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACf,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC;QAC/B,MAAM,MAAM,GACV,QAAQ,IAAI,OAAO;YACjB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;YAChD,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,SAAS,mCACV,OAAO,KACV,IAAI,EACJ,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iCACnB,CAAC,KACJ,IAAI,EAAE,CAAC,IACP,CAAC,GACJ,CAAC;QACF,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,CAAC,GAAG;YACf,uCACK,SAAS,KACZ,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IACjB;SACH;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACP,CAAC;AAEQ,wDAAsB"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts
deleted file mode 100644
index 9650020..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-declare type ObjectLike<T = unknown> = Record<string, T>;
-/**
- * Check if the variable contains an object strictly rejecting arrays
- * @param obj an object
- * @returns `true` if obj is an object
- */
-declare function isObjectNotArray<T extends ObjectLike>(obj: unknown | unknown[]): obj is T;
-/**
- * Pure function - doesn't mutate either parameter!
- * Merges two objects together deeply, overwriting the properties in first with the properties in second
- * @param first The first object
- * @param second The second object
- * @returns a new object
- */
-export declare function deepMerge(first?: ObjectLike, second?: ObjectLike): Record<string, unknown>;
-export { isObjectNotArray };
-//# sourceMappingURL=deepMerge.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts.map
deleted file mode 100644
index 769f39c..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"deepMerge.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/deepMerge.ts"],"names":[],"mappings":"AAAA,aAAK,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAEjD;;;;GAIG;AACH,iBAAS,gBAAgB,CAAC,CAAC,SAAS,UAAU,EAC5C,GAAG,EAAE,OAAO,GAAG,OAAO,EAAE,GACvB,GAAG,IAAI,CAAC,CAEV;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,KAAK,GAAE,UAAe,EACtB,MAAM,GAAE,UAAe,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0BzB;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js
deleted file mode 100644
index 34fdffc..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js
+++ /dev/null
@@ -1,48 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.isObjectNotArray = exports.deepMerge = void 0;
-/**
- * Check if the variable contains an object strictly rejecting arrays
- * @param obj an object
- * @returns `true` if obj is an object
- */
-function isObjectNotArray(obj) {
-    return typeof obj === 'object' && !Array.isArray(obj);
-}
-exports.isObjectNotArray = isObjectNotArray;
-/**
- * Pure function - doesn't mutate either parameter!
- * Merges two objects together deeply, overwriting the properties in first with the properties in second
- * @param first The first object
- * @param second The second object
- * @returns a new object
- */
-function deepMerge(first = {}, second = {}) {
-    // get the unique set of keys across both objects
-    const keys = new Set(Object.keys(first).concat(Object.keys(second)));
-    return Array.from(keys).reduce((acc, key) => {
-        const firstHasKey = key in first;
-        const secondHasKey = key in second;
-        const firstValue = first[key];
-        const secondValue = second[key];
-        if (firstHasKey && secondHasKey) {
-            if (isObjectNotArray(firstValue) && isObjectNotArray(secondValue)) {
-                // object type
-                acc[key] = deepMerge(firstValue, secondValue);
-            }
-            else {
-                // value type
-                acc[key] = secondValue;
-            }
-        }
-        else if (firstHasKey) {
-            acc[key] = firstValue;
-        }
-        else {
-            acc[key] = secondValue;
-        }
-        return acc;
-    }, {});
-}
-exports.deepMerge = deepMerge;
-//# sourceMappingURL=deepMerge.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js.map
deleted file mode 100644
index 7ee4604..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/deepMerge.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"deepMerge.js","sourceRoot":"","sources":["../../src/eslint-utils/deepMerge.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,SAAS,gBAAgB,CACvB,GAAwB;IAExB,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC;AAwCQ,4CAAgB;AAtCzB;;;;;;GAMG;AACH,SAAgB,SAAS,CACvB,QAAoB,EAAE,EACtB,SAAqB,EAAE;IAEvB,iDAAiD;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAErE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAa,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACtD,MAAM,WAAW,GAAG,GAAG,IAAI,KAAK,CAAC;QACjC,MAAM,YAAY,GAAG,GAAG,IAAI,MAAM,CAAC;QACnC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,WAAW,IAAI,YAAY,EAAE;YAC/B,IAAI,gBAAgB,CAAC,UAAU,CAAC,IAAI,gBAAgB,CAAC,WAAW,CAAC,EAAE;gBACjE,cAAc;gBACd,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;aAC/C;iBAAM;gBACL,aAAa;gBACb,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;aACxB;SACF;aAAM,IAAI,WAAW,EAAE;YACtB,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;SACvB;aAAM;YACL,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;SACxB;QAED,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AA7BD,8BA6BC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts
deleted file mode 100644
index 98626f4..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import * as TSESLint from '../ts-eslint';
-import { ParserServices } from '../ts-estree';
-/**
- * Try to retrieve typescript parser service from context
- */
-declare function getParserServices<TMessageIds extends string, TOptions extends readonly unknown[]>(context: Readonly<TSESLint.RuleContext<TMessageIds, TOptions>>, allowWithoutFullTypeInformation?: boolean): ParserServices;
-export { getParserServices };
-//# sourceMappingURL=getParserServices.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts.map
deleted file mode 100644
index 52fea2c..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"getParserServices.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/getParserServices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAK9C;;GAEG;AACH,iBAAS,iBAAiB,CACxB,WAAW,SAAS,MAAM,EAC1B,QAAQ,SAAS,SAAS,OAAO,EAAE,EAEnC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,EAC9D,+BAA+B,UAAQ,GACtC,cAAc,CAuBhB;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js
deleted file mode 100644
index 09302fd..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js
+++ /dev/null
@@ -1,28 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.getParserServices = void 0;
-const ERROR_MESSAGE = 'You have used a rule which requires parserServices to be generated. You must therefore provide a value for the "parserOptions.project" property for @typescript-eslint/parser.';
-/**
- * Try to retrieve typescript parser service from context
- */
-function getParserServices(context, allowWithoutFullTypeInformation = false) {
-    var _a;
-    // backwards compatibility check
-    // old versions of the parser would not return any parserServices unless parserOptions.project was set
-    if (!context.parserServices ||
-        !context.parserServices.program ||
-        !context.parserServices.esTreeNodeToTSNodeMap ||
-        !context.parserServices.tsNodeToESTreeNodeMap) {
-        throw new Error(ERROR_MESSAGE);
-    }
-    const hasFullTypeInformation = (_a = context.parserServices.hasFullTypeInformation) !== null && _a !== void 0 ? _a : 
-    /* backwards compatible */ true;
-    // if a rule requires full type information, then hard fail if it doesn't exist
-    // this forces the user to supply parserOptions.project
-    if (!hasFullTypeInformation && !allowWithoutFullTypeInformation) {
-        throw new Error(ERROR_MESSAGE);
-    }
-    return context.parserServices;
-}
-exports.getParserServices = getParserServices;
-//# sourceMappingURL=getParserServices.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js.map
deleted file mode 100644
index 4d40125..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/getParserServices.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"getParserServices.js","sourceRoot":"","sources":["../../src/eslint-utils/getParserServices.ts"],"names":[],"mappings":";;;AAGA,MAAM,aAAa,GACjB,gLAAgL,CAAC;AAEnL;;GAEG;AACH,SAAS,iBAAiB,CAIxB,OAA8D,EAC9D,+BAA+B,GAAG,KAAK;;IAEvC,gCAAgC;IAChC,sGAAsG;IACtG,IACE,CAAC,OAAO,CAAC,cAAc;QACvB,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO;QAC/B,CAAC,OAAO,CAAC,cAAc,CAAC,qBAAqB;QAC7C,CAAC,OAAO,CAAC,cAAc,CAAC,qBAAqB,EAC7C;QACA,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;KAChC;IAED,MAAM,sBAAsB,SAC1B,OAAO,CAAC,cAAc,CAAC,sBAAsB;IAC7C,0BAA0B,CAAC,IAAI,CAAC;IAElC,+EAA+E;IAC/E,uDAAuD;IACvD,IAAI,CAAC,sBAAsB,IAAI,CAAC,+BAA+B,EAAE;QAC/D,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;KAChC;IAED,OAAO,OAAO,CAAC,cAAc,CAAC;AAChC,CAAC;AAEQ,8CAAiB"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts
deleted file mode 100644
index 8cdfcb0..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export * from './applyDefault';
-export * from './batchedSingleLineTests';
-export * from './getParserServices';
-export * from './InferTypesFromRule';
-export * from './RuleCreator';
-export * from './RuleTester';
-export * from './deepMerge';
-//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts.map
deleted file mode 100644
index 7aca90d..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/eslint-utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js
deleted file mode 100644
index dde280d..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-__exportStar(require("./applyDefault"), exports);
-__exportStar(require("./batchedSingleLineTests"), exports);
-__exportStar(require("./getParserServices"), exports);
-__exportStar(require("./InferTypesFromRule"), exports);
-__exportStar(require("./RuleCreator"), exports);
-__exportStar(require("./RuleTester"), exports);
-__exportStar(require("./deepMerge"), exports);
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js.map
deleted file mode 100644
index f24be47..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eslint-utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAA+B;AAC/B,2DAAyC;AACzC,sDAAoC;AACpC,uDAAqC;AACrC,gDAA8B;AAC9B,+CAA6B;AAC7B,8CAA4B"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts
deleted file mode 100644
index b8a60a9..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import * as ASTUtils from './ast-utils';
-import * as ESLintUtils from './eslint-utils';
-import * as JSONSchema from './json-schema';
-import * as TSESLint from './ts-eslint';
-import * as TSESLintScope from './ts-eslint-scope';
-export { ASTUtils, ESLintUtils, JSONSchema, TSESLint, TSESLintScope };
-export * from './ts-estree';
-//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts.map
deleted file mode 100644
index 822db07..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/index.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,UAAU,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AACtE,cAAc,aAAa,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/index.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/index.js
deleted file mode 100644
index ef12e06..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/index.js
+++ /dev/null
@@ -1,37 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TSESLintScope = exports.TSESLint = exports.JSONSchema = exports.ESLintUtils = exports.ASTUtils = void 0;
-const ASTUtils = __importStar(require("./ast-utils"));
-exports.ASTUtils = ASTUtils;
-const ESLintUtils = __importStar(require("./eslint-utils"));
-exports.ESLintUtils = ESLintUtils;
-const JSONSchema = __importStar(require("./json-schema"));
-exports.JSONSchema = JSONSchema;
-const TSESLint = __importStar(require("./ts-eslint"));
-exports.TSESLint = TSESLint;
-const TSESLintScope = __importStar(require("./ts-eslint-scope"));
-exports.TSESLintScope = TSESLintScope;
-__exportStar(require("./ts-estree"), exports);
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/index.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/index.js.map
deleted file mode 100644
index b500da1..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAAwC;AAM/B,4BAAQ;AALjB,4DAA8C;AAK3B,kCAAW;AAJ9B,0DAA4C;AAIZ,gCAAU;AAH1C,sDAAwC;AAGI,4BAAQ;AAFpD,iEAAmD;AAEG,sCAAa;AACnE,8CAA4B"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts
deleted file mode 100644
index bd6f29c..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { JSONSchema4, JSONSchema4Type, JSONSchema4TypeName, JSONSchema4Version, JSONSchema6, JSONSchema6Definition, JSONSchema6Type, JSONSchema6TypeName, JSONSchema6Version, JSONSchema7, JSONSchema7Array, JSONSchema7Definition, JSONSchema7Type, JSONSchema7TypeName, JSONSchema7Version, ValidationError, ValidationResult, } from 'json-schema';
-//# sourceMappingURL=json-schema.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts.map
deleted file mode 100644
index 845788b..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"json-schema.d.ts","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js
deleted file mode 100644
index 289fb57..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-// Note - @types/json-schema@7.0.4 added some function declarations to the type package
-// If we do export *, then it will also export these function declarations.
-// This will cause typescript to not scrub the require from the build, breaking anyone who doesn't have it as a dependency
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=json-schema.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js.map
deleted file mode 100644
index 51d0b02..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/json-schema.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../src/json-schema.ts"],"names":[],"mappings":";AAAA,uFAAuF;AACvF,2EAA2E;AAC3E,0HAA0H"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts
deleted file mode 100644
index bcaf94a..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { TSESTree } from '../ts-estree';
-interface Definition {
-    type: string;
-    name: TSESTree.BindingName;
-    node: TSESTree.Node;
-    parent?: TSESTree.Node | null;
-    index?: number | null;
-    kind?: string | null;
-    rest?: boolean;
-}
-interface DefinitionConstructor {
-    new (type: string, name: TSESTree.BindingName | TSESTree.PropertyName, node: TSESTree.Node, parent?: TSESTree.Node | null, index?: number | null, kind?: string | null): Definition;
-}
-declare const Definition: DefinitionConstructor;
-interface ParameterDefinition extends Definition {
-}
-declare const ParameterDefinition: DefinitionConstructor & (new (name: TSESTree.Node, node: TSESTree.Node, index?: number | null | undefined, rest?: boolean | undefined) => ParameterDefinition);
-export { Definition, ParameterDefinition };
-//# sourceMappingURL=Definition.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts.map
deleted file mode 100644
index ab9c638..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Definition.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Definition.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC;IAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AACD,UAAU,qBAAqB;IAC7B,KACE,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,YAAY,EAClD,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,EAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,UAAU,CAAC;CACf;AACD,QAAA,MAAM,UAAU,uBAA4C,CAAC;AAG7D,UAAU,mBAAoB,SAAQ,UAAU;CAAG;AACnD,QAAA,MAAM,mBAAmB,sCAEf,SAAS,IAAI,QACb,SAAS,IAAI,oEAGlB,mBAAmB,CACvB,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js
deleted file mode 100644
index dd3de1f..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ParameterDefinition = exports.Definition = void 0;
-const definition_1 = require("eslint-scope/lib/definition");
-const Definition = definition_1.Definition;
-exports.Definition = Definition;
-const ParameterDefinition = definition_1.ParameterDefinition;
-exports.ParameterDefinition = ParameterDefinition;
-//# sourceMappingURL=Definition.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js.map
deleted file mode 100644
index fa19c8c..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Definition.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Definition.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Definition.ts"],"names":[],"mappings":";;;AAAA,4DAGqC;AAsBrC,MAAM,UAAU,GAAG,uBAAyC,CAAC;AAapD,gCAAU;AATnB,MAAM,mBAAmB,GAAG,gCAO3B,CAAC;AAEmB,kDAAmB"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts
deleted file mode 100644
index 48ce3c5..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { TSESTree } from '../ts-estree';
-declare type PatternVisitorCallback = (pattern: TSESTree.Identifier, info: {
-    rest: boolean;
-    topLevel: boolean;
-    assignments: TSESTree.AssignmentPattern[];
-}) => void;
-interface PatternVisitorOptions {
-    processRightHandNodes?: boolean;
-}
-interface Visitor {
-    visitChildren<T extends TSESTree.BaseNode | undefined | null>(node?: T): void;
-    visit<T extends TSESTree.BaseNode | undefined | null>(node?: T): void;
-}
-export { PatternVisitorCallback, PatternVisitorOptions, Visitor };
-//# sourceMappingURL=Options.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts.map
deleted file mode 100644
index fae66aa..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Options.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,aAAK,sBAAsB,GAAG,CAC5B,OAAO,EAAE,QAAQ,CAAC,UAAU,EAC5B,IAAI,EAAE;IACJ,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;CAC3C,KACE,IAAI,CAAC;AAEV,UAAU,qBAAqB;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,UAAU,OAAO;IACf,aAAa,CAAC,CAAC,SAAS,QAAQ,CAAC,QAAQ,GAAG,SAAS,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAC9E,KAAK,CAAC,CAAC,SAAS,QAAQ,CAAC,QAAQ,GAAG,SAAS,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;CACvE;AAED,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.js
deleted file mode 100644
index 08cea89..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.js
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=Options.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.js.map
deleted file mode 100644
index 8d8fb9e..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Options.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Options.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Options.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts
deleted file mode 100644
index e21224b..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { TSESTree } from '../ts-estree';
-import { ScopeManager } from './ScopeManager';
-import { PatternVisitorCallback, PatternVisitorOptions, Visitor } from './Options';
-interface PatternVisitor extends Visitor {
-    options: PatternVisitorOptions;
-    scopeManager: ScopeManager;
-    parent?: TSESTree.Node;
-    rightHandNodes: TSESTree.Node[];
-    Identifier(pattern: TSESTree.Node): void;
-    Property(property: TSESTree.Node): void;
-    ArrayPattern(pattern: TSESTree.Node): void;
-    AssignmentPattern(pattern: TSESTree.Node): void;
-    RestElement(pattern: TSESTree.Node): void;
-    MemberExpression(node: TSESTree.Node): void;
-    SpreadElement(node: TSESTree.Node): void;
-    ArrayExpression(node: TSESTree.Node): void;
-    AssignmentExpression(node: TSESTree.Node): void;
-    CallExpression(node: TSESTree.Node): void;
-}
-declare const PatternVisitor: {
-    new (options: PatternVisitorOptions, rootPattern: TSESTree.BaseNode, callback: PatternVisitorCallback): PatternVisitor;
-    isPattern(node: TSESTree.Node): boolean;
-};
-export { PatternVisitor };
-//# sourceMappingURL=PatternVisitor.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts.map
deleted file mode 100644
index eec5b0b..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"PatternVisitor.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/PatternVisitor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,OAAO,EACR,MAAM,WAAW,CAAC;AAEnB,UAAU,cAAe,SAAQ,OAAO;IACtC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;IACvB,cAAc,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEhC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACxC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3C,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAChD,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC1C,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC5C,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACzC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3C,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAChD,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;CAC3C;AACD,QAAA,MAAM,cAAc;kBAEP,qBAAqB,eACjB,SAAS,QAAQ,YACpB,sBAAsB,GAC/B,cAAc;oBAGD,SAAS,IAAI,GAAG,OAAO;CACxC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js
deleted file mode 100644
index 43aa849..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js
+++ /dev/null
@@ -1,10 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.PatternVisitor = void 0;
-const pattern_visitor_1 = __importDefault(require("eslint-scope/lib/pattern-visitor"));
-const PatternVisitor = pattern_visitor_1.default;
-exports.PatternVisitor = PatternVisitor;
-//# sourceMappingURL=PatternVisitor.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js.map
deleted file mode 100644
index e08efc8..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/PatternVisitor.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"PatternVisitor.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/PatternVisitor.ts"],"names":[],"mappings":";;;;;;AAAA,uFAAoE;AA0BpE,MAAM,cAAc,GAAG,yBAStB,CAAC;AAEO,wCAAc"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts
deleted file mode 100644
index 0d479b3..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { TSESTree } from '../ts-estree';
-import { Scope } from './Scope';
-import { Variable } from './Variable';
-export declare type ReferenceFlag = 0x1 | 0x2 | 0x3;
-interface Reference {
-    identifier: TSESTree.Identifier;
-    from: Scope;
-    resolved: Variable | null;
-    writeExpr: TSESTree.Node | null;
-    init: boolean;
-    partial: boolean;
-    __maybeImplicitGlobal: boolean;
-    tainted?: boolean;
-    typeMode?: boolean;
-    isWrite(): boolean;
-    isRead(): boolean;
-    isWriteOnly(): boolean;
-    isReadOnly(): boolean;
-    isReadWrite(): boolean;
-}
-declare const Reference: {
-    new (identifier: TSESTree.Identifier, scope: Scope, flag?: 2 | 3 | 1 | undefined, writeExpr?: TSESTree.ArrayExpression | TSESTree.ArrayPattern | TSESTree.ArrowFunctionExpression | TSESTree.AssignmentExpression | TSESTree.AssignmentPattern | TSESTree.AwaitExpression | TSESTree.BigIntLiteral | TSESTree.BinaryExpression | TSESTree.BlockStatement | TSESTree.BreakStatement | TSESTree.CallExpression | TSESTree.CatchClause | TSESTree.ChainExpression | TSESTree.ClassBody | TSESTree.ClassDeclaration | TSESTree.ClassExpression | TSESTree.ClassPropertyComputedName | TSESTree.ClassPropertyNonComputedName | TSESTree.ConditionalExpression | TSESTree.ContinueStatement | TSESTree.DebuggerStatement | TSESTree.Decorator | TSESTree.DoWhileStatement | TSESTree.EmptyStatement | TSESTree.ExportAllDeclaration | TSESTree.ExportDefaultDeclaration | TSESTree.ExportNamedDeclaration | TSESTree.ExportSpecifier | TSESTree.ExpressionStatement | TSESTree.ForInStatement | TSESTree.ForOfStatement | TSESTree.ForStatement | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.Identifier | TSESTree.IfStatement | TSESTree.ImportDeclaration | TSESTree.ImportDefaultSpecifier | TSESTree.ImportExpression | TSESTree.ImportNamespaceSpecifier | TSESTree.ImportSpecifier | TSESTree.JSXAttribute | TSESTree.JSXClosingElement | TSESTree.JSXClosingFragment | TSESTree.JSXElement | TSESTree.JSXEmptyExpression | TSESTree.JSXExpressionContainer | TSESTree.JSXFragment | TSESTree.JSXIdentifier | TSESTree.JSXMemberExpression | TSESTree.JSXOpeningElement | TSESTree.JSXOpeningFragment | TSESTree.JSXSpreadAttribute | TSESTree.JSXSpreadChild | TSESTree.JSXText | TSESTree.LabeledStatement | TSESTree.BooleanLiteral | TSESTree.NumberLiteral | TSESTree.NullLiteral | TSESTree.RegExpLiteral | TSESTree.StringLiteral | TSESTree.LogicalExpression | TSESTree.MemberExpressionComputedName | TSESTree.MemberExpressionNonComputedName | TSESTree.MetaProperty | TSESTree.MethodDefinitionComputedName | TSESTree.MethodDefinitionNonComputedName | TSESTree.NewExpression | TSESTree.ObjectExpression | TSESTree.ObjectPattern | TSESTree.Program | TSESTree.PropertyComputedName | TSESTree.PropertyNonComputedName | TSESTree.RestElement | TSESTree.ReturnStatement | TSESTree.SequenceExpression | TSESTree.SpreadElement | TSESTree.Super | TSESTree.SwitchCase | TSESTree.SwitchStatement | TSESTree.TaggedTemplateExpression | TSESTree.TemplateElement | TSESTree.TemplateLiteral | TSESTree.ThisExpression | TSESTree.ThrowStatement | TSESTree.TryStatement | TSESTree.TSAbstractClassPropertyComputedName | TSESTree.TSAbstractClassPropertyNonComputedName | TSESTree.TSAbstractKeyword | TSESTree.TSAbstractMethodDefinitionComputedName | TSESTree.TSAbstractMethodDefinitionNonComputedName | TSESTree.TSAnyKeyword | TSESTree.TSArrayType | TSESTree.TSAsExpression | TSESTree.TSAsyncKeyword | TSESTree.TSBigIntKeyword | TSESTree.TSBooleanKeyword | TSESTree.TSCallSignatureDeclaration | TSESTree.TSClassImplements | TSESTree.TSConditionalType | TSESTree.TSConstructorType | TSESTree.TSConstructSignatureDeclaration | TSESTree.TSDeclareFunction | TSESTree.TSDeclareKeyword | TSESTree.TSEmptyBodyFunctionExpression | TSESTree.TSEnumDeclaration | TSESTree.TSEnumMemberComputedName | TSESTree.TSEnumMemberNonComputedName | TSESTree.TSExportAssignment | TSESTree.TSExportKeyword | TSESTree.TSExternalModuleReference | TSESTree.TSFunctionType | TSESTree.TSImportEqualsDeclaration | TSESTree.TSImportType | TSESTree.TSIndexedAccessType | TSESTree.TSIndexSignature | TSESTree.TSInferType | TSESTree.TSInterfaceBody | TSESTree.TSInterfaceDeclaration | TSESTree.TSInterfaceHeritage | TSESTree.TSIntersectionType | TSESTree.TSLiteralType | TSESTree.TSMappedType | TSESTree.TSMethodSignatureComputedName | TSESTree.TSMethodSignatureNonComputedName | TSESTree.TSModuleBlock | TSESTree.TSModuleDeclaration | TSESTree.TSNamedTupleMember | TSESTree.TSNamespaceExportDeclaration | TSESTree.TSNeverKeyword | TSESTree.TSNonNullExpression | TSESTree.TSNullKeyword | TSESTree.TSNumberKeyword | TSESTree.TSObjectKeyword | TSESTree.TSOptionalType | TSESTree.TSParameterProperty | TSESTree.TSParenthesizedType | TSESTree.TSPrivateKeyword | TSESTree.TSPropertySignatureComputedName | TSESTree.TSPropertySignatureNonComputedName | TSESTree.TSProtectedKeyword | TSESTree.TSPublicKeyword | TSESTree.TSQualifiedName | TSESTree.TSReadonlyKeyword | TSESTree.TSRestType | TSESTree.TSStaticKeyword | TSESTree.TSStringKeyword | TSESTree.TSSymbolKeyword | TSESTree.TSThisType | TSESTree.TSTupleType | TSESTree.TSTypeAliasDeclaration | TSESTree.TSTypeAnnotation | TSESTree.TSTypeAssertion | TSESTree.TSTypeLiteral | TSESTree.TSTypeOperator | TSESTree.TSTypeParameter | TSESTree.TSTypeParameterDeclaration | TSESTree.TSTypeParameterInstantiation | TSESTree.TSTypePredicate | TSESTree.TSTypeQuery | TSESTree.TSTypeReference | TSESTree.TSUndefinedKeyword | TSESTree.TSUnionType | TSESTree.TSUnknownKeyword | TSESTree.TSVoidKeyword | TSESTree.UnaryExpression | TSESTree.UpdateExpression | TSESTree.VariableDeclaration | TSESTree.VariableDeclarator | TSESTree.WhileStatement | TSESTree.WithStatement | TSESTree.YieldExpression | null | undefined, maybeImplicitGlobal?: boolean | undefined, partial?: boolean | undefined, init?: boolean | undefined): Reference;
-    READ: 0x1;
-    WRITE: 0x2;
-    RW: 0x3;
-};
-export { Reference };
-//# sourceMappingURL=Reference.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts.map
deleted file mode 100644
index 1384afb..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Reference.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Reference.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,oBAAY,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE5C,UAAU,SAAS;IACjB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAChC,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IAEd,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,OAAO,IAAI,OAAO,CAAC;IACnB,MAAM,IAAI,OAAO,CAAC;IAClB,WAAW,IAAI,OAAO,CAAC;IACvB,UAAU,IAAI,OAAO,CAAC;IACtB,WAAW,IAAI,OAAO,CAAC;CACxB;AACD,QAAA,MAAM,SAAS;qBAEC,SAAS,UAAU,SACxB,KAAK,2lKAMX,SAAS;UAEN,GAAG;WACF,GAAG;QACN,GAAG;CACR,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js
deleted file mode 100644
index 71a4559..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js
+++ /dev/null
@@ -1,10 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Reference = void 0;
-const reference_1 = __importDefault(require("eslint-scope/lib/reference"));
-const Reference = reference_1.default;
-exports.Reference = Reference;
-//# sourceMappingURL=Reference.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js.map
deleted file mode 100644
index 8b1c95b..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Reference.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Reference.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Reference.ts"],"names":[],"mappings":";;;;;;AAAA,2EAAyD;AAyBzD,MAAM,SAAS,GAAG,mBAcjB,CAAC;AAEO,8BAAS"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts
deleted file mode 100644
index beeb288..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { TSESTree } from '../ts-estree';
-import { PatternVisitorCallback, PatternVisitorOptions, Visitor } from './Options';
-import { Scope } from './Scope';
-import { ScopeManager } from './ScopeManager';
-interface Referencer<SM extends ScopeManager> extends Visitor {
-    isInnerMethodDefinition: boolean;
-    options: any;
-    scopeManager: SM;
-    parent?: TSESTree.Node;
-    currentScope(): Scope;
-    close(node: TSESTree.Node): void;
-    pushInnerMethodDefinition(isInnerMethodDefinition: boolean): boolean;
-    popInnerMethodDefinition(isInnerMethodDefinition: boolean): void;
-    referencingDefaultValue(pattern: any, assignments: any, maybeImplicitGlobal: any, init: boolean): void;
-    visitPattern(node: TSESTree.Node, options: PatternVisitorOptions, callback: PatternVisitorCallback): void;
-    visitFunction(node: TSESTree.Node): void;
-    visitClass(node: TSESTree.Node): void;
-    visitProperty(node: TSESTree.Node): void;
-    visitForIn(node: TSESTree.Node): void;
-    visitVariableDeclaration(variableTargetScope: any, type: any, node: TSESTree.Node, index: any): void;
-    AssignmentExpression(node: TSESTree.Node): void;
-    CatchClause(node: TSESTree.Node): void;
-    Program(node: TSESTree.Program): void;
-    Identifier(node: TSESTree.Identifier): void;
-    UpdateExpression(node: TSESTree.Node): void;
-    MemberExpression(node: TSESTree.Node): void;
-    Property(node: TSESTree.Node): void;
-    MethodDefinition(node: TSESTree.Node): void;
-    BreakStatement(): void;
-    ContinueStatement(): void;
-    LabeledStatement(node: TSESTree.Node): void;
-    ForStatement(node: TSESTree.Node): void;
-    ClassExpression(node: TSESTree.Node): void;
-    ClassDeclaration(node: TSESTree.Node): void;
-    CallExpression(node: TSESTree.Node): void;
-    BlockStatement(node: TSESTree.Node): void;
-    ThisExpression(): void;
-    WithStatement(node: TSESTree.Node): void;
-    VariableDeclaration(node: TSESTree.Node): void;
-    SwitchStatement(node: TSESTree.Node): void;
-    FunctionDeclaration(node: TSESTree.Node): void;
-    FunctionExpression(node: TSESTree.Node): void;
-    ForOfStatement(node: TSESTree.Node): void;
-    ForInStatement(node: TSESTree.Node): void;
-    ArrowFunctionExpression(node: TSESTree.Node): void;
-    ImportDeclaration(node: TSESTree.Node): void;
-    visitExportDeclaration(node: TSESTree.Node): void;
-    ExportDeclaration(node: TSESTree.Node): void;
-    ExportNamedDeclaration(node: TSESTree.Node): void;
-    ExportSpecifier(node: TSESTree.Node): void;
-    MetaProperty(): void;
-}
-declare const Referencer: new <SM extends ScopeManager>(options: any, scopeManager: SM) => Referencer<SM>;
-export { Referencer };
-//# sourceMappingURL=Referencer.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts.map
deleted file mode 100644
index 37a11bf..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Referencer.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Referencer.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js
deleted file mode 100644
index 4aafa5a..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js
+++ /dev/null
@@ -1,11 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Referencer = void 0;
-/* eslint-disable @typescript-eslint/no-explicit-any */
-const referencer_1 = __importDefault(require("eslint-scope/lib/referencer"));
-const Referencer = referencer_1.default;
-exports.Referencer = Referencer;
-//# sourceMappingURL=Referencer.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js.map
deleted file mode 100644
index 2d80e28..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Referencer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Referencer.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Referencer.ts"],"names":[],"mappings":";;;;;;AAAA,uDAAuD;AACvD,6EAA2D;AA2E3D,MAAM,UAAU,GAAG,oBAElB,CAAC;AAEO,gCAAU"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts
deleted file mode 100644
index ae6bd11..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts
+++ /dev/null
@@ -1,103 +0,0 @@
-import { TSESTree } from '../ts-estree';
-import { Definition } from './Definition';
-import { Reference, ReferenceFlag } from './Reference';
-import { ScopeManager } from './ScopeManager';
-import { Variable } from './Variable';
-declare type ScopeType = 'block' | 'catch' | 'class' | 'for' | 'function' | 'function-expression-name' | 'global' | 'module' | 'switch' | 'with' | 'TDZ' | 'enum' | 'empty-function';
-interface Scope {
-    type: ScopeType;
-    isStrict: boolean;
-    upper: Scope | null;
-    childScopes: Scope[];
-    variableScope: Scope;
-    block: TSESTree.Node;
-    variables: Variable[];
-    set: Map<string, Variable>;
-    references: Reference[];
-    through: Reference[];
-    thisFound?: boolean;
-    taints: Map<string, boolean>;
-    functionExpressionScope: boolean;
-    __left: Reference[];
-    __shouldStaticallyClose(scopeManager: ScopeManager): boolean;
-    __shouldStaticallyCloseForGlobal(ref: any): boolean;
-    __staticCloseRef(ref: any): void;
-    __dynamicCloseRef(ref: any): void;
-    __globalCloseRef(ref: any): void;
-    __close(scopeManager: ScopeManager): Scope;
-    __isValidResolution(ref: any, variable: any): variable is Variable;
-    __resolve(ref: Reference): boolean;
-    __delegateToUpperScope(ref: any): void;
-    __addDeclaredVariablesOfNode(variable: any, node: TSESTree.Node): void;
-    __defineGeneric(name: string, set: Map<string, Variable>, variables: Variable[], node: TSESTree.Identifier, def: Definition): void;
-    __define(node: TSESTree.Node, def: Definition): void;
-    __referencing(node: TSESTree.Node, assign?: ReferenceFlag, writeExpr?: TSESTree.Node, maybeImplicitGlobal?: any, partial?: any, init?: any): void;
-    __detectEval(): void;
-    __detectThis(): void;
-    __isClosed(): boolean;
-    /**
-     * returns resolved {Reference}
-     * @method Scope#resolve
-     * @param {Espree.Identifier} ident - identifier to be resolved.
-     * @returns {Reference} reference
-     */
-    resolve(ident: TSESTree.Node): Reference;
-    /**
-     * returns this scope is static
-     * @method Scope#isStatic
-     * @returns {boolean} static
-     */
-    isStatic(): boolean;
-    /**
-     * returns this scope has materialized arguments
-     * @method Scope#isArgumentsMaterialized
-     * @returns {boolean} arguments materialized
-     */
-    isArgumentsMaterialized(): boolean;
-    /**
-     * returns this scope has materialized `this` reference
-     * @method Scope#isThisMaterialized
-     * @returns {boolean} this materialized
-     */
-    isThisMaterialized(): boolean;
-    isUsedName(name: any): boolean;
-}
-interface ScopeConstructor {
-    new (scopeManager: ScopeManager, type: ScopeType, upperScope: Scope | null, block: TSESTree.Node | null, isMethodDefinition: boolean): Scope;
-}
-declare const Scope: ScopeConstructor;
-interface ScopeChildConstructorWithUpperScope<T> {
-    new (scopeManager: ScopeManager, upperScope: Scope, block: TSESTree.Node | null): T;
-}
-interface GlobalScope extends Scope {
-}
-declare const GlobalScope: ScopeConstructor & (new (scopeManager: ScopeManager, block: TSESTree.Node | null) => GlobalScope);
-interface ModuleScope extends Scope {
-}
-declare const ModuleScope: ScopeConstructor & ScopeChildConstructorWithUpperScope<ModuleScope>;
-interface FunctionExpressionNameScope extends Scope {
-}
-declare const FunctionExpressionNameScope: ScopeConstructor & ScopeChildConstructorWithUpperScope<FunctionExpressionNameScope>;
-interface CatchScope extends Scope {
-}
-declare const CatchScope: ScopeConstructor & ScopeChildConstructorWithUpperScope<CatchScope>;
-interface WithScope extends Scope {
-}
-declare const WithScope: ScopeConstructor & ScopeChildConstructorWithUpperScope<WithScope>;
-interface BlockScope extends Scope {
-}
-declare const BlockScope: ScopeConstructor & ScopeChildConstructorWithUpperScope<BlockScope>;
-interface SwitchScope extends Scope {
-}
-declare const SwitchScope: ScopeConstructor & ScopeChildConstructorWithUpperScope<SwitchScope>;
-interface FunctionScope extends Scope {
-}
-declare const FunctionScope: ScopeConstructor & (new (scopeManager: ScopeManager, upperScope: Scope, block: TSESTree.Node | null, isMethodDefinition: boolean) => FunctionScope);
-interface ForScope extends Scope {
-}
-declare const ForScope: ScopeConstructor & ScopeChildConstructorWithUpperScope<ForScope>;
-interface ClassScope extends Scope {
-}
-declare const ClassScope: ScopeConstructor & ScopeChildConstructorWithUpperScope<ClassScope>;
-export { ScopeType, Scope, GlobalScope, ModuleScope, FunctionExpressionNameScope, CatchScope, WithScope, BlockScope, SwitchScope, FunctionScope, ForScope, ClassScope, };
-//# sourceMappingURL=Scope.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts.map
deleted file mode 100644
index 8b6f342..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Scope.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Scope.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js
deleted file mode 100644
index f4f604f..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js
+++ /dev/null
@@ -1,28 +0,0 @@
-"use strict";
-/* eslint-disable @typescript-eslint/no-empty-interface, @typescript-eslint/no-explicit-any */
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ClassScope = exports.ForScope = exports.FunctionScope = exports.SwitchScope = exports.BlockScope = exports.WithScope = exports.CatchScope = exports.FunctionExpressionNameScope = exports.ModuleScope = exports.GlobalScope = exports.Scope = void 0;
-const scope_1 = require("eslint-scope/lib/scope");
-const Scope = scope_1.Scope;
-exports.Scope = Scope;
-const GlobalScope = scope_1.GlobalScope;
-exports.GlobalScope = GlobalScope;
-const ModuleScope = scope_1.ModuleScope;
-exports.ModuleScope = ModuleScope;
-const FunctionExpressionNameScope = scope_1.FunctionExpressionNameScope;
-exports.FunctionExpressionNameScope = FunctionExpressionNameScope;
-const CatchScope = scope_1.CatchScope;
-exports.CatchScope = CatchScope;
-const WithScope = scope_1.WithScope;
-exports.WithScope = WithScope;
-const BlockScope = scope_1.BlockScope;
-exports.BlockScope = BlockScope;
-const SwitchScope = scope_1.SwitchScope;
-exports.SwitchScope = SwitchScope;
-const FunctionScope = scope_1.FunctionScope;
-exports.FunctionScope = FunctionScope;
-const ForScope = scope_1.ForScope;
-exports.ForScope = ForScope;
-const ClassScope = scope_1.ClassScope;
-exports.ClassScope = ClassScope;
-//# sourceMappingURL=Scope.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js.map
deleted file mode 100644
index b0d7969..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Scope.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Scope.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Scope.ts"],"names":[],"mappings":";AAAA,8FAA8F;;;AAE9F,kDAYgC;AA8GhC,MAAM,KAAK,GAAG,aAA+B,CAAC;AA2D5C,sBAAK;AAhDP,MAAM,WAAW,GAAG,mBAEnB,CAAC;AA+CA,kCAAW;AA5Cb,MAAM,WAAW,GAAG,mBAC8B,CAAC;AA4CjD,kCAAW;AAzCb,MAAM,2BAA2B,GAAG,mCAC8B,CAAC;AAyCjE,kEAA2B;AAtC7B,MAAM,UAAU,GAAG,kBAC8B,CAAC;AAsChD,gCAAU;AAnCZ,MAAM,SAAS,GAAG,iBAC8B,CAAC;AAmC/C,8BAAS;AAhCX,MAAM,UAAU,GAAG,kBAC8B,CAAC;AAgChD,gCAAU;AA7BZ,MAAM,WAAW,GAAG,mBAC8B,CAAC;AA6BjD,kCAAW;AA1Bb,MAAM,aAAa,GAAG,qBAOrB,CAAC;AAoBA,sCAAa;AAjBf,MAAM,QAAQ,GAAG,gBAC8B,CAAC;AAiB9C,4BAAQ;AAdV,MAAM,UAAU,GAAG,kBAC8B,CAAC;AAchD,gCAAU"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts
deleted file mode 100644
index 9b7e929..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { TSESTree } from '../ts-estree';
-import { EcmaVersion } from '../ts-eslint';
-import { Scope } from './Scope';
-import { Variable } from './Variable';
-interface ScopeManagerOptions {
-    directive?: boolean;
-    optimistic?: boolean;
-    ignoreEval?: boolean;
-    nodejsScope?: boolean;
-    sourceType?: 'module' | 'script';
-    impliedStrict?: boolean;
-    ecmaVersion?: EcmaVersion;
-}
-interface ScopeManager {
-    __options: ScopeManagerOptions;
-    __currentScope: Scope;
-    __nodeToScope: WeakMap<TSESTree.Node, Scope[]>;
-    __declaredVariables: WeakMap<TSESTree.Node, Variable[]>;
-    scopes: Scope[];
-    globalScope: Scope;
-    __useDirective(): boolean;
-    __isOptimistic(): boolean;
-    __ignoreEval(): boolean;
-    __isNodejsScope(): boolean;
-    isModule(): boolean;
-    isImpliedStrict(): boolean;
-    isStrictModeSupported(): boolean;
-    __get(node: TSESTree.Node): Scope | undefined;
-    getDeclaredVariables(node: TSESTree.Node): Variable[];
-    acquire(node: TSESTree.Node, inner?: boolean): Scope | null;
-    acquireAll(node: TSESTree.Node): Scope | null;
-    release(node: TSESTree.Node, inner?: boolean): Scope | null;
-    attach(): void;
-    detach(): void;
-    __nestScope<T extends Scope>(scope: T): T;
-    __nestGlobalScope(node: TSESTree.Node): Scope;
-    __nestBlockScope(node: TSESTree.Node): Scope;
-    __nestFunctionScope(node: TSESTree.Node, isMethodDefinition: boolean): Scope;
-    __nestForScope(node: TSESTree.Node): Scope;
-    __nestCatchScope(node: TSESTree.Node): Scope;
-    __nestWithScope(node: TSESTree.Node): Scope;
-    __nestClassScope(node: TSESTree.Node): Scope;
-    __nestSwitchScope(node: TSESTree.Node): Scope;
-    __nestModuleScope(node: TSESTree.Node): Scope;
-    __nestFunctionExpressionNameScope(node: TSESTree.Node): Scope;
-    __isES6(): boolean;
-}
-declare const ScopeManager: new (options: ScopeManagerOptions) => ScopeManager;
-export { ScopeManager, ScopeManagerOptions };
-//# sourceMappingURL=ScopeManager.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts.map
deleted file mode 100644
index 7c9ba53..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ScopeManager.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/ScopeManager.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js
deleted file mode 100644
index c886eb7..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js
+++ /dev/null
@@ -1,10 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ScopeManager = void 0;
-const scope_manager_1 = __importDefault(require("eslint-scope/lib/scope-manager"));
-const ScopeManager = scope_manager_1.default;
-exports.ScopeManager = ScopeManager;
-//# sourceMappingURL=ScopeManager.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js.map
deleted file mode 100644
index 35d90d1..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/ScopeManager.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ScopeManager.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/ScopeManager.ts"],"names":[],"mappings":";;;;;;AAAA,mFAAgE;AAwDhE,MAAM,YAAY,GAAG,uBAEpB,CAAC;AAEO,oCAAY"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts
deleted file mode 100644
index a5d6ddf..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { TSESTree } from '../ts-estree';
-import { Reference } from './Reference';
-import { Definition } from './Definition';
-import { Scope } from './Scope';
-interface Variable {
-    name: string;
-    identifiers: TSESTree.Identifier[];
-    references: Reference[];
-    defs: Definition[];
-    eslintUsed?: boolean;
-    stack?: unknown;
-    tainted?: boolean;
-    scope?: Scope;
-}
-declare const Variable: new () => Variable;
-export { Variable };
-//# sourceMappingURL=Variable.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts.map
deleted file mode 100644
index 604e185..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Variable.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/Variable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;IACnC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,QAAA,MAAM,QAAQ,YACJ,QACT,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js
deleted file mode 100644
index c0fdac2..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js
+++ /dev/null
@@ -1,10 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Variable = void 0;
-const variable_1 = __importDefault(require("eslint-scope/lib/variable"));
-const Variable = variable_1.default;
-exports.Variable = Variable;
-//# sourceMappingURL=Variable.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js.map
deleted file mode 100644
index d6545bb..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/Variable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Variable.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/Variable.ts"],"names":[],"mappings":";;;;;;AAAA,yEAAuD;AAiBvD,MAAM,QAAQ,GAAG,kBAEhB,CAAC;AAEO,4BAAQ"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts
deleted file mode 100644
index dbcb76b..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { EcmaVersion } from '../ts-eslint';
-import { TSESTree } from '../ts-estree';
-import { ScopeManager } from './ScopeManager';
-interface AnalysisOptions {
-    optimistic?: boolean;
-    directive?: boolean;
-    ignoreEval?: boolean;
-    nodejsScope?: boolean;
-    impliedStrict?: boolean;
-    fallback?: string | ((node: TSESTree.Node) => string[]);
-    sourceType?: 'script' | 'module';
-    ecmaVersion?: EcmaVersion;
-}
-declare const analyze: (ast: TSESTree.Node, options?: AnalysisOptions | undefined) => ScopeManager;
-export { analyze, AnalysisOptions };
-//# sourceMappingURL=analyze.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts.map
deleted file mode 100644
index 9a3654b..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/analyze.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,UAAU,eAAe;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;IACxD,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AACD,QAAA,MAAM,OAAO,QACN,SAAS,IAAI,4CAEf,YAAY,CAAC;AAElB,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js
deleted file mode 100644
index 7fddff1..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.analyze = void 0;
-const eslint_scope_1 = require("eslint-scope");
-const analyze = eslint_scope_1.analyze;
-exports.analyze = analyze;
-//# sourceMappingURL=analyze.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js.map
deleted file mode 100644
index f015cc4..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/analyze.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/analyze.ts"],"names":[],"mappings":";;;AAAA,+CAAwD;AAexD,MAAM,OAAO,GAAG,sBAGC,CAAC;AAET,0BAAO"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.d.ts
deleted file mode 100644
index c795b88..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export * from './analyze';
-export * from './Definition';
-export * from './Options';
-export * from './PatternVisitor';
-export * from './Reference';
-export * from './Referencer';
-export * from './Scope';
-export * from './ScopeManager';
-export * from './Variable';
-export declare const version: string;
-//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.d.ts.map
deleted file mode 100644
index 26afd66..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ts-eslint-scope/index.ts"],"names":[],"mappings":"AAEA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,eAAO,MAAM,OAAO,EAAE,MAAsB,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js
deleted file mode 100644
index 34d3243..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js
+++ /dev/null
@@ -1,25 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.version = void 0;
-const eslint_scope_1 = require("eslint-scope");
-__exportStar(require("./analyze"), exports);
-__exportStar(require("./Definition"), exports);
-__exportStar(require("./Options"), exports);
-__exportStar(require("./PatternVisitor"), exports);
-__exportStar(require("./Reference"), exports);
-__exportStar(require("./Referencer"), exports);
-__exportStar(require("./Scope"), exports);
-__exportStar(require("./ScopeManager"), exports);
-__exportStar(require("./Variable"), exports);
-exports.version = eslint_scope_1.version;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js.map
deleted file mode 100644
index 8872a9f..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ts-eslint-scope/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,+CAAwD;AAExD,4CAA0B;AAC1B,+CAA6B;AAC7B,4CAA0B;AAC1B,mDAAiC;AACjC,8CAA4B;AAC5B,+CAA6B;AAC7B,0CAAwB;AACxB,iDAA+B;AAC/B,6CAA2B;AACd,QAAA,OAAO,GAAW,sBAAa,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts
deleted file mode 100644
index 88d6379..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { TSESTree, AST_TOKEN_TYPES } from '../ts-estree';
-declare namespace AST {
-    type TokenType = AST_TOKEN_TYPES;
-    type Token = TSESTree.Token;
-    type SourceLocation = TSESTree.SourceLocation;
-    type Range = TSESTree.Range;
-}
-export { AST };
-//# sourceMappingURL=AST.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts.map
deleted file mode 100644
index 8dca544..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AST.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/AST.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEzD,kBAAU,GAAG,CAAC;IACZ,KAAY,SAAS,GAAG,eAAe,CAAC;IAExC,KAAY,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAEnC,KAAY,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;IAErD,KAAY,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;CACpC;AAED,OAAO,EAAE,GAAG,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.js
deleted file mode 100644
index 323ed55..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-/* eslint-disable @typescript-eslint/no-namespace */
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=AST.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.js.map
deleted file mode 100644
index 2aa7f04..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/AST.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AST.js","sourceRoot":"","sources":["../../src/ts-eslint/AST.ts"],"names":[],"mappings":";AAAA,oDAAoD"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts
deleted file mode 100644
index f996162..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts
+++ /dev/null
@@ -1,143 +0,0 @@
-import { Linter } from './Linter';
-import { RuleListener, RuleMetaData, RuleModule } from './Rule';
-declare class CLIEngineBase {
-    /**
-     * Creates a new instance of the core CLI engine.
-     * @param providedOptions The options for this instance.
-     */
-    constructor(options: CLIEngine.Options);
-    /**
-     * Add a plugin by passing its configuration
-     * @param name Name of the plugin.
-     * @param pluginObject Plugin configuration object.
-     */
-    addPlugin(name: string, pluginObject: Linter.Plugin): void;
-    /**
-     * Executes the current configuration on an array of file and directory names.
-     * @param patterns An array of file and directory names.
-     * @returns The results for all files that were linted.
-     */
-    executeOnFiles(patterns: string[]): CLIEngine.LintReport;
-    /**
-     * Executes the current configuration on text.
-     * @param text A string of JavaScript code to lint.
-     * @param filename An optional string representing the texts filename.
-     * @param warnIgnored Always warn when a file is ignored
-     * @returns The results for the linting.
-     */
-    executeOnText(text: string, filename?: string, warnIgnored?: boolean): CLIEngine.LintReport;
-    /**
-     * Returns a configuration object for the given file based on the CLI options.
-     * This is the same logic used by the ESLint CLI executable to determine configuration for each file it processes.
-     * @param filePath The path of the file to retrieve a config object for.
-     * @returns A configuration object for the file.
-     */
-    getConfigForFile(filePath: string): Linter.Config;
-    /**
-     * Returns the formatter representing the given format.
-     * @param format The name of the format to load or the path to a custom formatter.
-     * @returns The formatter function.
-     */
-    getFormatter(format?: string): CLIEngine.Formatter;
-    /**
-     * Checks if a given path is ignored by ESLint.
-     * @param filePath The path of the file to check.
-     * @returns Whether or not the given path is ignored.
-     */
-    isPathIgnored(filePath: string): boolean;
-    /**
-     * Resolves the patterns passed into `executeOnFiles()` into glob-based patterns for easier handling.
-     * @param patterns The file patterns passed on the command line.
-     * @returns The equivalent glob patterns.
-     */
-    resolveFileGlobPatterns(patterns: string[]): string[];
-    getRules<TMessageIds extends string = string, TOptions extends readonly unknown[] = unknown[], TRuleListener extends RuleListener = RuleListener>(): Map<string, RuleModule<TMessageIds, TOptions, TRuleListener>>;
-    /**
-     * Returns results that only contains errors.
-     * @param results The results to filter.
-     * @returns The filtered results.
-     */
-    static getErrorResults(results: CLIEngine.LintResult[]): CLIEngine.LintResult[];
-    /**
-     * Returns the formatter representing the given format or null if the `format` is not a string.
-     * @param format The name of the format to load or the path to a custom formatter.
-     * @returns The formatter function.
-     */
-    static getFormatter(format?: string): CLIEngine.Formatter;
-    /**
-     * Outputs fixes from the given results to files.
-     * @param report The report object created by CLIEngine.
-     */
-    static outputFixes(report: CLIEngine.LintReport): void;
-    static version: string;
-}
-declare namespace CLIEngine {
-    interface Options {
-        allowInlineConfig?: boolean;
-        baseConfig?: false | {
-            [name: string]: unknown;
-        };
-        cache?: boolean;
-        cacheFile?: string;
-        cacheLocation?: string;
-        configFile?: string;
-        cwd?: string;
-        envs?: string[];
-        errorOnUnmatchedPattern?: boolean;
-        extensions?: string[];
-        fix?: boolean;
-        globals?: string[];
-        ignore?: boolean;
-        ignorePath?: string;
-        ignorePattern?: string | string[];
-        useEslintrc?: boolean;
-        parser?: string;
-        parserOptions?: Linter.ParserOptions;
-        plugins?: string[];
-        resolvePluginsRelativeTo?: string;
-        rules?: {
-            [name: string]: Linter.RuleLevel | Linter.RuleLevelAndOptions;
-        };
-        rulePaths?: string[];
-        reportUnusedDisableDirectives?: boolean;
-    }
-    interface LintResult {
-        filePath: string;
-        messages: Linter.LintMessage[];
-        errorCount: number;
-        warningCount: number;
-        fixableErrorCount: number;
-        fixableWarningCount: number;
-        output?: string;
-        source?: string;
-    }
-    interface LintReport {
-        results: LintResult[];
-        errorCount: number;
-        warningCount: number;
-        fixableErrorCount: number;
-        fixableWarningCount: number;
-        usedDeprecatedRules: DeprecatedRuleUse[];
-    }
-    interface DeprecatedRuleUse {
-        ruleId: string;
-        replacedBy: string[];
-    }
-    interface LintResultData<TMessageIds extends string> {
-        rulesMeta: {
-            [ruleId: string]: RuleMetaData<TMessageIds>;
-        };
-    }
-    type Formatter = <TMessageIds extends string>(results: LintResult[], data?: LintResultData<TMessageIds>) => string;
-}
-declare const CLIEngine_base: typeof CLIEngineBase;
-/**
- * The underlying utility that runs the ESLint command line interface. This object will read the filesystem for
- * configuration and file information but will not output any results. Instead, it allows you direct access to the
- * important information so you can deal with the output yourself.
- * @deprecated use the ESLint class instead
- */
-declare class CLIEngine extends CLIEngine_base {
-}
-export { CLIEngine };
-//# sourceMappingURL=CLIEngine.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts.map
deleted file mode 100644
index 6d8d24e..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"CLIEngine.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/CLIEngine.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js
deleted file mode 100644
index 8ccf2b7..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-/* eslint-disable @typescript-eslint/no-namespace */
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CLIEngine = void 0;
-const eslint_1 = require("eslint");
-/**
- * The underlying utility that runs the ESLint command line interface. This object will read the filesystem for
- * configuration and file information but will not output any results. Instead, it allows you direct access to the
- * important information so you can deal with the output yourself.
- * @deprecated use the ESLint class instead
- */
-class CLIEngine extends eslint_1.CLIEngine {
-}
-exports.CLIEngine = CLIEngine;
-//# sourceMappingURL=CLIEngine.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js.map
deleted file mode 100644
index 4ac1481..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/CLIEngine.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"CLIEngine.js","sourceRoot":"","sources":["../../src/ts-eslint/CLIEngine.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;AAEpD,mCAAsD;AAyKtD;;;;;GAKG;AACH,MAAM,SAAU,SAAS,kBAAwC;CAAG;AAE3D,8BAAS"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts
deleted file mode 100644
index 248e8fb..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts
+++ /dev/null
@@ -1,324 +0,0 @@
-import { TSESTree, ParserServices } from '../ts-estree';
-import { ParserOptions as TSParserOptions } from './ParserOptions';
-import { RuleCreateFunction, RuleFix, RuleModule } from './Rule';
-import { Scope } from './Scope';
-import { SourceCode } from './SourceCode';
-declare class LinterBase {
-    /**
-     * Initialize the Linter.
-     * @param config the config object
-     */
-    constructor(config?: Linter.LinterOptions);
-    /**
-     * Define a new parser module
-     * @param parserId Name of the parser
-     * @param parserModule The parser object
-     */
-    defineParser(parserId: string, parserModule: Linter.ParserModule): void;
-    /**
-     * Defines a new linting rule.
-     * @param ruleId A unique rule identifier
-     * @param ruleModule Function from context to object mapping AST node types to event handlers
-     */
-    defineRule<TMessageIds extends string, TOptions extends readonly unknown[]>(ruleId: string, ruleModule: RuleModule<TMessageIds, TOptions> | RuleCreateFunction): void;
-    /**
-     * Defines many new linting rules.
-     * @param rulesToDefine map from unique rule identifier to rule
-     */
-    defineRules<TMessageIds extends string, TOptions extends readonly unknown[]>(rulesToDefine: Record<string, RuleModule<TMessageIds, TOptions> | RuleCreateFunction>): void;
-    /**
-     * Gets an object with all loaded rules.
-     * @returns All loaded rules
-     */
-    getRules(): Map<string, RuleModule<string, unknown[]>>;
-    /**
-     * Gets the `SourceCode` object representing the parsed source.
-     * @returns The `SourceCode` object.
-     */
-    getSourceCode(): SourceCode;
-    /**
-     * Verifies the text against the rules specified by the second argument.
-     * @param textOrSourceCode The text to parse or a SourceCode object.
-     * @param config An ESLintConfig instance to configure everything.
-     * @param filenameOrOptions The optional filename of the file being checked.
-     *        If this is not set, the filename will default to '<input>' in the rule context.
-     *        If this is an object, then it has "filename", "allowInlineConfig", and some properties.
-     * @returns The results as an array of messages or an empty array if no messages.
-     */
-    verify(textOrSourceCode: SourceCode | string, config: Linter.Config, filenameOrOptions?: string | Linter.VerifyOptions): Linter.LintMessage[];
-    /**
-     * Performs multiple autofix passes over the text until as many fixes as possible have been applied.
-     * @param text The source text to apply fixes to.
-     * @param config The ESLint config object to use.
-     * @param options The ESLint options object to use.
-     * @returns The result of the fix operation as returned from the SourceCodeFixer.
-     */
-    verifyAndFix(code: string, config: Linter.Config, options: Linter.FixOptions): Linter.FixReport;
-    /**
-     * The version from package.json.
-     */
-    readonly version: string;
-    /**
-     * The version from package.json.
-     */
-    static readonly version: string;
-}
-declare namespace Linter {
-    export interface LinterOptions {
-        /**
-         * path to a directory that should be considered as the current working directory.
-         */
-        cwd?: string;
-    }
-    export type Severity = 0 | 1 | 2;
-    export type SeverityString = 'off' | 'warn' | 'error';
-    export type RuleLevel = Severity | SeverityString;
-    export type RuleLevelAndOptions = [RuleLevel, ...unknown[]];
-    export type RuleEntry = RuleLevel | RuleLevelAndOptions;
-    export type RulesRecord = Partial<Record<string, RuleEntry>>;
-    interface BaseConfig {
-        $schema?: string;
-        /**
-         * The environment settings.
-         */
-        env?: {
-            [name: string]: boolean;
-        };
-        /**
-         * The path to other config files or the package name of shareable configs.
-         */
-        extends?: string | string[];
-        /**
-         * The global variable settings.
-         */
-        globals?: {
-            [name: string]: boolean;
-        };
-        /**
-         * The flag that disables directive comments.
-         */
-        noInlineConfig?: boolean;
-        /**
-         * The override settings per kind of files.
-         */
-        overrides?: ConfigOverride[];
-        /**
-         * The path to a parser or the package name of a parser.
-         */
-        parser?: string;
-        /**
-         * The parser options.
-         */
-        parserOptions?: ParserOptions;
-        /**
-         * The plugin specifiers.
-         */
-        plugins?: string[];
-        /**
-         * The processor specifier.
-         */
-        processor?: string;
-        /**
-         * The flag to report unused `eslint-disable` comments.
-         */
-        reportUnusedDisableDirectives?: boolean;
-        /**
-         * The rule settings.
-         */
-        rules?: RulesRecord;
-        /**
-         * The shared settings.
-         */
-        settings?: {
-            [name: string]: unknown;
-        };
-    }
-    export interface ConfigOverride extends BaseConfig {
-        excludedFiles?: string | string[];
-        files: string | string[];
-    }
-    export interface Config extends BaseConfig {
-        /**
-         * The glob patterns that ignore to lint.
-         */
-        ignorePatterns?: string | string[];
-        /**
-         * The root flag.
-         */
-        root?: boolean;
-    }
-    export type ParserOptions = TSParserOptions;
-    export interface VerifyOptions {
-        /**
-         * Allow/disallow inline comments' ability to change config once it is set. Defaults to true if not supplied.
-         * Useful if you want to validate JS without comments overriding rules.
-         */
-        allowInlineConfig?: boolean;
-        /**
-         * if `true` then the linter doesn't make `fix` properties into the lint result.
-         */
-        disableFixes?: boolean;
-        /**
-         * the filename of the source code.
-         */
-        filename?: string;
-        /**
-         * the predicate function that selects adopt code blocks.
-         */
-        filterCodeBlock?: (filename: string, text: string) => boolean;
-        /**
-         * postprocessor for report messages.
-         * If provided, this should accept an array of the message lists
-         * for each code block returned from the preprocessor, apply a mapping to
-         * the messages as appropriate, and return a one-dimensional array of
-         * messages.
-         */
-        postprocess?: Processor['postprocess'];
-        /**
-         * preprocessor for source text.
-         * If provided, this should accept a string of source text, and return an array of code blocks to lint.
-         */
-        preprocess?: Processor['preprocess'];
-        /**
-         * Adds reported errors for unused `eslint-disable` directives.
-         */
-        reportUnusedDisableDirectives?: boolean | SeverityString;
-    }
-    export interface FixOptions extends VerifyOptions {
-        /**
-         * Determines whether fixes should be applied.
-         */
-        fix?: boolean;
-    }
-    export interface LintSuggestion {
-        desc: string;
-        fix: RuleFix;
-        messageId?: string;
-    }
-    export interface LintMessage {
-        /**
-         * The 1-based column number.
-         */
-        column: number;
-        /**
-         * The 1-based column number of the end location.
-         */
-        endColumn?: number;
-        /**
-         * The 1-based line number of the end location.
-         */
-        endLine?: number;
-        /**
-         * If `true` then this is a fatal error.
-         */
-        fatal?: true;
-        /**
-         * Information for autofix.
-         */
-        fix?: RuleFix;
-        /**
-         * The 1-based line number.
-         */
-        line: number;
-        /**
-         * The error message.
-         */
-        message: string;
-        messageId?: string;
-        nodeType: string;
-        /**
-         * The ID of the rule which makes this message.
-         */
-        ruleId: string | null;
-        /**
-         * The severity of this message.
-         */
-        severity: Severity;
-        source: string | null;
-        /**
-         * Information for suggestions
-         */
-        suggestions?: LintSuggestion[];
-    }
-    export interface FixReport {
-        /**
-         * True, if the code was fixed
-         */
-        fixed: boolean;
-        /**
-         * Fixed code text (might be the same as input if no fixes were applied).
-         */
-        output: string;
-        /**
-         * Collection of all messages for the given code
-         */
-        messages: LintMessage[];
-    }
-    export type ParserModule = {
-        parse(text: string, options?: ParserOptions): TSESTree.Program;
-    } | {
-        parseForESLint(text: string, options?: ParserOptions): ESLintParseResult;
-    };
-    export interface ESLintParseResult {
-        ast: TSESTree.Program;
-        parserServices?: ParserServices;
-        scopeManager?: Scope.ScopeManager;
-        visitorKeys?: SourceCode.VisitorKeys;
-    }
-    export interface Processor {
-        /**
-         * The function to extract code blocks.
-         */
-        preprocess?: (text: string, filename: string) => Array<string | {
-            text: string;
-            filename: string;
-        }>;
-        /**
-         * The function to merge messages.
-         */
-        postprocess?: (messagesList: Linter.LintMessage[][], filename: string) => Linter.LintMessage[];
-        /**
-         * If `true` then it means the processor supports autofix.
-         */
-        supportsAutofix?: boolean;
-    }
-    export interface Environment {
-        /**
-         * The definition of global variables.
-         */
-        globals?: Record<string, Linter.Config>;
-        /**
-         * The parser options that will be enabled under this environment.
-         */
-        parserOptions?: ParserOptions;
-    }
-    export interface Plugin {
-        /**
-         * The definition of plugin configs.
-         */
-        configs?: Record<string, Linter.Config>;
-        /**
-         * The definition of plugin environments.
-         */
-        environments?: Record<string, Environment>;
-        /**
-         * The definition of plugin processors.
-         */
-        processors?: Record<string, Processor>;
-        /**
-         * The definition of plugin rules.
-         */
-        rules?: Record<string, RuleCreateFunction | RuleModule<string, unknown[]>>;
-    }
-    export {};
-}
-declare const Linter_base: typeof LinterBase;
-/**
- * The Linter object does the actual evaluation of the JavaScript code. It doesn't do any filesystem operations, it
- * simply parses and reports on the code. In particular, the Linter object does not process configuration objects
- * or files.
- */
-declare class Linter extends Linter_base {
-}
-export { Linter };
-//# sourceMappingURL=Linter.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts.map
deleted file mode 100644
index 5c2bc13..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Linter.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/Linter.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js
deleted file mode 100644
index 4fd16f1..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-/* eslint-disable @typescript-eslint/no-namespace */
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Linter = void 0;
-const eslint_1 = require("eslint");
-/**
- * The Linter object does the actual evaluation of the JavaScript code. It doesn't do any filesystem operations, it
- * simply parses and reports on the code. In particular, the Linter object does not process configuration objects
- * or files.
- */
-class Linter extends eslint_1.Linter {
-}
-exports.Linter = Linter;
-//# sourceMappingURL=Linter.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js.map
deleted file mode 100644
index 8c8e207..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Linter.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Linter.js","sourceRoot":"","sources":["../../src/ts-eslint/Linter.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;AAEpD,mCAAgD;AA8WhD;;;;GAIG;AACH,MAAM,MAAO,SAAS,eAAkC;CAAG;AAElD,wBAAM"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts
deleted file mode 100644
index d864322..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { DebugLevel, EcmaVersion, ParserOptions, SourceType, } from '@typescript-eslint/types';
-//# sourceMappingURL=ParserOptions.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts.map
deleted file mode 100644
index 33c6d0e..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ParserOptions.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/ParserOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,UAAU,GACX,MAAM,0BAA0B,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.js
deleted file mode 100644
index 40b03dd..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.js
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=ParserOptions.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.js.map
deleted file mode 100644
index 7bd7a94..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/ParserOptions.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ParserOptions.js","sourceRoot":"","sources":["../../src/ts-eslint/ParserOptions.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts
deleted file mode 100644
index 66a6599..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts
+++ /dev/null
@@ -1,369 +0,0 @@
-import { JSONSchema4 } from '../json-schema';
-import { ParserServices, TSESTree } from '../ts-estree';
-import { AST } from './AST';
-import { Linter } from './Linter';
-import { Scope } from './Scope';
-import { SourceCode } from './SourceCode';
-interface RuleMetaDataDocs {
-    /**
-     * The general category the rule falls within
-     */
-    category: 'Best Practices' | 'Stylistic Issues' | 'Variables' | 'Possible Errors';
-    /**
-     * Concise description of the rule
-     */
-    description: string;
-    /**
-     * The recommendation level for the rule.
-     * Used by the build tools to generate the recommended config.
-     * Set to false to not include it as a recommendation
-     */
-    recommended: 'error' | 'warn' | false;
-    /**
-     * The URL of the rule's docs
-     */
-    url: string;
-    /**
-     * Specifies whether the rule can return suggestions.
-     */
-    suggestion?: boolean;
-    /**
-     * Does the rule require us to create a full TypeScript Program in order for it
-     * to type-check code. This is only used for documentation purposes.
-     */
-    requiresTypeChecking?: boolean;
-    /**
-     * Does the rule extend (or is it based off of) an ESLint code rule?
-     * Alternately accepts the name of the base rule, in case the rule has been renamed.
-     * This is only used for documentation purposes.
-     */
-    extendsBaseRule?: boolean | string;
-}
-interface RuleMetaData<TMessageIds extends string> {
-    /**
-     * True if the rule is deprecated, false otherwise
-     */
-    deprecated?: boolean;
-    /**
-     * Documentation for the rule, unnecessary for custom rules/plugins
-     */
-    docs?: RuleMetaDataDocs;
-    /**
-     * The fixer category. Omit if there is no fixer
-     */
-    fixable?: 'code' | 'whitespace';
-    /**
-     * A map of messages which the rule can report.
-     * The key is the messageId, and the string is the parameterised error string.
-     * See: https://eslint.org/docs/developer-guide/working-with-rules#messageids
-     */
-    messages: Record<TMessageIds, string>;
-    /**
-     * The type of rule.
-     * - `"problem"` means the rule is identifying code that either will cause an error or may cause a confusing behavior. Developers should consider this a high priority to resolve.
-     * - `"suggestion"` means the rule is identifying something that could be done in a better way but no errors will occur if the code isn’t changed.
-     * - `"layout"` means the rule cares primarily about whitespace, semicolons, commas, and parentheses, all the parts of the program that determine how the code looks rather than how it executes. These rules work on parts of the code that aren’t specified in the AST.
-     */
-    type: 'suggestion' | 'problem' | 'layout';
-    /**
-     * The name of the rule this rule was replaced by, if it was deprecated.
-     */
-    replacedBy?: string[];
-    /**
-     * The options schema. Supply an empty array if there are no options.
-     */
-    schema: JSONSchema4 | JSONSchema4[];
-}
-interface RuleFix {
-    range: AST.Range;
-    text: string;
-}
-interface RuleFixer {
-    insertTextAfter(nodeOrToken: TSESTree.Node | TSESTree.Token, text: string): RuleFix;
-    insertTextAfterRange(range: AST.Range, text: string): RuleFix;
-    insertTextBefore(nodeOrToken: TSESTree.Node | TSESTree.Token, text: string): RuleFix;
-    insertTextBeforeRange(range: AST.Range, text: string): RuleFix;
-    remove(nodeOrToken: TSESTree.Node | TSESTree.Token): RuleFix;
-    removeRange(range: AST.Range): RuleFix;
-    replaceText(nodeOrToken: TSESTree.Node | TSESTree.Token, text: string): RuleFix;
-    replaceTextRange(range: AST.Range, text: string): RuleFix;
-}
-declare type ReportFixFunction = (fixer: RuleFixer) => null | RuleFix | RuleFix[] | IterableIterator<RuleFix>;
-declare type ReportSuggestionArray<TMessageIds extends string> = ReportDescriptorBase<TMessageIds>[];
-interface ReportDescriptorBase<TMessageIds extends string> {
-    /**
-     * The parameters for the message string associated with `messageId`.
-     */
-    readonly data?: Readonly<Record<string, unknown>>;
-    /**
-     * The fixer function.
-     */
-    readonly fix?: ReportFixFunction | null;
-    /**
-     * The messageId which is being reported.
-     */
-    readonly messageId: TMessageIds;
-}
-interface ReportDescriptorWithSuggestion<TMessageIds extends string> extends ReportDescriptorBase<TMessageIds> {
-    /**
-     * 6.7's Suggestions API
-     */
-    readonly suggest?: Readonly<ReportSuggestionArray<TMessageIds>> | null;
-}
-interface ReportDescriptorNodeOptionalLoc {
-    /**
-     * The Node or AST Token which the report is being attached to
-     */
-    readonly node: TSESTree.Node | TSESTree.Comment | TSESTree.Token;
-    /**
-     * An override of the location of the report
-     */
-    readonly loc?: Readonly<TSESTree.SourceLocation> | Readonly<TSESTree.LineAndColumnData>;
-}
-interface ReportDescriptorLocOnly {
-    /**
-     * An override of the location of the report
-     */
-    loc: Readonly<TSESTree.SourceLocation> | Readonly<TSESTree.LineAndColumnData>;
-}
-declare type ReportDescriptor<TMessageIds extends string> = ReportDescriptorWithSuggestion<TMessageIds> & (ReportDescriptorNodeOptionalLoc | ReportDescriptorLocOnly);
-interface RuleContext<TMessageIds extends string, TOptions extends readonly unknown[]> {
-    /**
-     * The rule ID.
-     */
-    id: string;
-    /**
-     * An array of the configured options for this rule.
-     * This array does not include the rule severity.
-     */
-    options: TOptions;
-    /**
-     * The name of the parser from configuration.
-     */
-    parserPath: string;
-    /**
-     * The parser options configured for this run
-     */
-    parserOptions: Linter.ParserOptions;
-    /**
-     * An object containing parser-provided services for rules
-     */
-    parserServices?: ParserServices;
-    /**
-     * The shared settings from configuration.
-     * We do not have any shared settings in this plugin.
-     */
-    settings: Record<string, unknown>;
-    /**
-     * Returns an array of the ancestors of the currently-traversed node, starting at
-     * the root of the AST and continuing through the direct parent of the current node.
-     * This array does not include the currently-traversed node itself.
-     */
-    getAncestors(): TSESTree.Node[];
-    /**
-     * Returns a list of variables declared by the given node.
-     * This information can be used to track references to variables.
-     */
-    getDeclaredVariables(node: TSESTree.Node): Scope.Variable[];
-    /**
-     * Returns the filename associated with the source.
-     */
-    getFilename(): string;
-    /**
-     * Returns the scope of the currently-traversed node.
-     * This information can be used track references to variables.
-     */
-    getScope(): Scope.Scope;
-    /**
-     * Returns a SourceCode object that you can use to work with the source that
-     * was passed to ESLint.
-     */
-    getSourceCode(): Readonly<SourceCode>;
-    /**
-     * Marks a variable with the given name in the current scope as used.
-     * This affects the no-unused-vars rule.
-     */
-    markVariableAsUsed(name: string): boolean;
-    /**
-     * Reports a problem in the code.
-     */
-    report(descriptor: ReportDescriptor<TMessageIds>): void;
-}
-declare type RuleFunction<T extends TSESTree.BaseNode = never> = (node: T) => void;
-interface RuleListener {
-    [nodeSelector: string]: RuleFunction | undefined;
-    ArrayExpression?: RuleFunction<TSESTree.ArrayExpression>;
-    ArrayPattern?: RuleFunction<TSESTree.ArrayPattern>;
-    ArrowFunctionExpression?: RuleFunction<TSESTree.ArrowFunctionExpression>;
-    AssignmentPattern?: RuleFunction<TSESTree.AssignmentPattern>;
-    AssignmentExpression?: RuleFunction<TSESTree.AssignmentExpression>;
-    AwaitExpression?: RuleFunction<TSESTree.AwaitExpression>;
-    BigIntLiteral?: RuleFunction<TSESTree.BigIntLiteral>;
-    BinaryExpression?: RuleFunction<TSESTree.BinaryExpression>;
-    BlockStatement?: RuleFunction<TSESTree.BlockStatement>;
-    BreakStatement?: RuleFunction<TSESTree.BreakStatement>;
-    CallExpression?: RuleFunction<TSESTree.CallExpression>;
-    CatchClause?: RuleFunction<TSESTree.CatchClause>;
-    ChainExpression?: RuleFunction<TSESTree.ChainExpression>;
-    ClassBody?: RuleFunction<TSESTree.ClassBody>;
-    ClassDeclaration?: RuleFunction<TSESTree.ClassDeclaration>;
-    ClassExpression?: RuleFunction<TSESTree.ClassExpression>;
-    ClassProperty?: RuleFunction<TSESTree.ClassProperty>;
-    Comment?: RuleFunction<TSESTree.Comment>;
-    ConditionalExpression?: RuleFunction<TSESTree.ConditionalExpression>;
-    ContinueStatement?: RuleFunction<TSESTree.ContinueStatement>;
-    DebuggerStatement?: RuleFunction<TSESTree.DebuggerStatement>;
-    Decorator?: RuleFunction<TSESTree.Decorator>;
-    DoWhileStatement?: RuleFunction<TSESTree.DoWhileStatement>;
-    EmptyStatement?: RuleFunction<TSESTree.EmptyStatement>;
-    ExportAllDeclaration?: RuleFunction<TSESTree.ExportAllDeclaration>;
-    ExportDefaultDeclaration?: RuleFunction<TSESTree.ExportDefaultDeclaration>;
-    ExportNamedDeclaration?: RuleFunction<TSESTree.ExportNamedDeclaration>;
-    ExportSpecifier?: RuleFunction<TSESTree.ExportSpecifier>;
-    ExpressionStatement?: RuleFunction<TSESTree.ExpressionStatement>;
-    ForInStatement?: RuleFunction<TSESTree.ForInStatement>;
-    ForOfStatement?: RuleFunction<TSESTree.ForOfStatement>;
-    ForStatement?: RuleFunction<TSESTree.ForStatement>;
-    FunctionDeclaration?: RuleFunction<TSESTree.FunctionDeclaration>;
-    FunctionExpression?: RuleFunction<TSESTree.FunctionExpression>;
-    Identifier?: RuleFunction<TSESTree.Identifier>;
-    IfStatement?: RuleFunction<TSESTree.IfStatement>;
-    ImportDeclaration?: RuleFunction<TSESTree.ImportDeclaration>;
-    ImportDefaultSpecifier?: RuleFunction<TSESTree.ImportDefaultSpecifier>;
-    ImportExpression?: RuleFunction<TSESTree.ImportExpression>;
-    ImportNamespaceSpecifier?: RuleFunction<TSESTree.ImportNamespaceSpecifier>;
-    ImportSpecifier?: RuleFunction<TSESTree.ImportSpecifier>;
-    JSXAttribute?: RuleFunction<TSESTree.JSXAttribute>;
-    JSXClosingElement?: RuleFunction<TSESTree.JSXClosingElement>;
-    JSXClosingFragment?: RuleFunction<TSESTree.JSXClosingFragment>;
-    JSXElement?: RuleFunction<TSESTree.JSXElement>;
-    JSXEmptyExpression?: RuleFunction<TSESTree.JSXEmptyExpression>;
-    JSXExpressionContainer?: RuleFunction<TSESTree.JSXExpressionContainer>;
-    JSXFragment?: RuleFunction<TSESTree.JSXFragment>;
-    JSXIdentifier?: RuleFunction<TSESTree.JSXIdentifier>;
-    JSXMemberExpression?: RuleFunction<TSESTree.JSXMemberExpression>;
-    JSXOpeningElement?: RuleFunction<TSESTree.JSXOpeningElement>;
-    JSXOpeningFragment?: RuleFunction<TSESTree.JSXOpeningFragment>;
-    JSXSpreadAttribute?: RuleFunction<TSESTree.JSXSpreadAttribute>;
-    JSXSpreadChild?: RuleFunction<TSESTree.JSXSpreadChild>;
-    JSXText?: RuleFunction<TSESTree.JSXText>;
-    LabeledStatement?: RuleFunction<TSESTree.LabeledStatement>;
-    Literal?: RuleFunction<TSESTree.Literal>;
-    LogicalExpression?: RuleFunction<TSESTree.LogicalExpression>;
-    MemberExpression?: RuleFunction<TSESTree.MemberExpression>;
-    MetaProperty?: RuleFunction<TSESTree.MetaProperty>;
-    MethodDefinition?: RuleFunction<TSESTree.MethodDefinition>;
-    NewExpression?: RuleFunction<TSESTree.NewExpression>;
-    ObjectExpression?: RuleFunction<TSESTree.ObjectExpression>;
-    ObjectPattern?: RuleFunction<TSESTree.ObjectPattern>;
-    Program?: RuleFunction<TSESTree.Program>;
-    Property?: RuleFunction<TSESTree.Property>;
-    RestElement?: RuleFunction<TSESTree.RestElement>;
-    ReturnStatement?: RuleFunction<TSESTree.ReturnStatement>;
-    SequenceExpression?: RuleFunction<TSESTree.SequenceExpression>;
-    SpreadElement?: RuleFunction<TSESTree.SpreadElement>;
-    Super?: RuleFunction<TSESTree.Super>;
-    SwitchCase?: RuleFunction<TSESTree.SwitchCase>;
-    SwitchStatement?: RuleFunction<TSESTree.SwitchStatement>;
-    TaggedTemplateExpression?: RuleFunction<TSESTree.TaggedTemplateExpression>;
-    TemplateElement?: RuleFunction<TSESTree.TemplateElement>;
-    TemplateLiteral?: RuleFunction<TSESTree.TemplateLiteral>;
-    ThisExpression?: RuleFunction<TSESTree.ThisExpression>;
-    ThrowStatement?: RuleFunction<TSESTree.ThrowStatement>;
-    Token?: RuleFunction<TSESTree.Token>;
-    TryStatement?: RuleFunction<TSESTree.TryStatement>;
-    TSAbstractClassProperty?: RuleFunction<TSESTree.TSAbstractClassProperty>;
-    TSAbstractKeyword?: RuleFunction<TSESTree.TSAbstractKeyword>;
-    TSAbstractMethodDefinition?: RuleFunction<TSESTree.TSAbstractMethodDefinition>;
-    TSAnyKeyword?: RuleFunction<TSESTree.TSAnyKeyword>;
-    TSArrayType?: RuleFunction<TSESTree.TSArrayType>;
-    TSAsExpression?: RuleFunction<TSESTree.TSAsExpression>;
-    TSAsyncKeyword?: RuleFunction<TSESTree.TSAsyncKeyword>;
-    TSBigIntKeyword?: RuleFunction<TSESTree.TSBigIntKeyword>;
-    TSBooleanKeyword?: RuleFunction<TSESTree.TSBooleanKeyword>;
-    TSCallSignatureDeclaration?: RuleFunction<TSESTree.TSCallSignatureDeclaration>;
-    TSClassImplements?: RuleFunction<TSESTree.TSClassImplements>;
-    TSConditionalType?: RuleFunction<TSESTree.TSConditionalType>;
-    TSConstructorType?: RuleFunction<TSESTree.TSConstructorType>;
-    TSConstructSignatureDeclaration?: RuleFunction<TSESTree.TSConstructSignatureDeclaration>;
-    TSDeclareKeyword?: RuleFunction<TSESTree.TSDeclareKeyword>;
-    TSDeclareFunction?: RuleFunction<TSESTree.TSDeclareFunction>;
-    TSEmptyBodyFunctionExpression?: RuleFunction<TSESTree.TSEmptyBodyFunctionExpression>;
-    TSEnumDeclaration?: RuleFunction<TSESTree.TSEnumDeclaration>;
-    TSEnumMember?: RuleFunction<TSESTree.TSEnumMember>;
-    TSExportAssignment?: RuleFunction<TSESTree.TSExportAssignment>;
-    TSExportKeyword?: RuleFunction<TSESTree.TSExportKeyword>;
-    TSExternalModuleReference?: RuleFunction<TSESTree.TSExternalModuleReference>;
-    TSFunctionType?: RuleFunction<TSESTree.TSFunctionType>;
-    TSImportEqualsDeclaration?: RuleFunction<TSESTree.TSImportEqualsDeclaration>;
-    TSImportType?: RuleFunction<TSESTree.TSImportType>;
-    TSIndexedAccessType?: RuleFunction<TSESTree.TSIndexedAccessType>;
-    TSIndexSignature?: RuleFunction<TSESTree.TSIndexSignature>;
-    TSInferType?: RuleFunction<TSESTree.TSInferType>;
-    TSInterfaceBody?: RuleFunction<TSESTree.TSInterfaceBody>;
-    TSInterfaceDeclaration?: RuleFunction<TSESTree.TSInterfaceDeclaration>;
-    TSInterfaceHeritage?: RuleFunction<TSESTree.TSInterfaceHeritage>;
-    TSIntersectionType?: RuleFunction<TSESTree.TSIntersectionType>;
-    TSLiteralType?: RuleFunction<TSESTree.TSLiteralType>;
-    TSMappedType?: RuleFunction<TSESTree.TSMappedType>;
-    TSMethodSignature?: RuleFunction<TSESTree.TSMethodSignature>;
-    TSModuleBlock?: RuleFunction<TSESTree.TSModuleBlock>;
-    TSModuleDeclaration?: RuleFunction<TSESTree.TSModuleDeclaration>;
-    TSNamespaceExportDeclaration?: RuleFunction<TSESTree.TSNamespaceExportDeclaration>;
-    TSNeverKeyword?: RuleFunction<TSESTree.TSNeverKeyword>;
-    TSNonNullExpression?: RuleFunction<TSESTree.TSNonNullExpression>;
-    TSNullKeyword?: RuleFunction<TSESTree.TSNullKeyword>;
-    TSNumberKeyword?: RuleFunction<TSESTree.TSNumberKeyword>;
-    TSObjectKeyword?: RuleFunction<TSESTree.TSObjectKeyword>;
-    TSOptionalType?: RuleFunction<TSESTree.TSOptionalType>;
-    TSParameterProperty?: RuleFunction<TSESTree.TSParameterProperty>;
-    TSParenthesizedType?: RuleFunction<TSESTree.TSParenthesizedType>;
-    TSPrivateKeyword?: RuleFunction<TSESTree.TSPrivateKeyword>;
-    TSPropertySignature?: RuleFunction<TSESTree.TSPropertySignature>;
-    TSProtectedKeyword?: RuleFunction<TSESTree.TSProtectedKeyword>;
-    TSPublicKeyword?: RuleFunction<TSESTree.TSPublicKeyword>;
-    TSQualifiedName?: RuleFunction<TSESTree.TSQualifiedName>;
-    TSReadonlyKeyword?: RuleFunction<TSESTree.TSReadonlyKeyword>;
-    TSRestType?: RuleFunction<TSESTree.TSRestType>;
-    TSStaticKeyword?: RuleFunction<TSESTree.TSStaticKeyword>;
-    TSStringKeyword?: RuleFunction<TSESTree.TSStringKeyword>;
-    TSSymbolKeyword?: RuleFunction<TSESTree.TSSymbolKeyword>;
-    TSThisType?: RuleFunction<TSESTree.TSThisType>;
-    TSTupleType?: RuleFunction<TSESTree.TSTupleType>;
-    TSTypeAliasDeclaration?: RuleFunction<TSESTree.TSTypeAliasDeclaration>;
-    TSTypeAnnotation?: RuleFunction<TSESTree.TSTypeAnnotation>;
-    TSTypeAssertion?: RuleFunction<TSESTree.TSTypeAssertion>;
-    TSTypeLiteral?: RuleFunction<TSESTree.TSTypeLiteral>;
-    TSTypeOperator?: RuleFunction<TSESTree.TSTypeOperator>;
-    TSTypeParameter?: RuleFunction<TSESTree.TSTypeParameter>;
-    TSTypeParameterDeclaration?: RuleFunction<TSESTree.TSTypeParameterDeclaration>;
-    TSTypeParameterInstantiation?: RuleFunction<TSESTree.TSTypeParameterInstantiation>;
-    TSTypePredicate?: RuleFunction<TSESTree.TSTypePredicate>;
-    TSTypeQuery?: RuleFunction<TSESTree.TSTypeQuery>;
-    TSTypeReference?: RuleFunction<TSESTree.TSTypeReference>;
-    TSUndefinedKeyword?: RuleFunction<TSESTree.TSUndefinedKeyword>;
-    TSUnionType?: RuleFunction<TSESTree.TSUnionType>;
-    TSUnknownKeyword?: RuleFunction<TSESTree.TSUnknownKeyword>;
-    TSVoidKeyword?: RuleFunction<TSESTree.TSVoidKeyword>;
-    UnaryExpression?: RuleFunction<TSESTree.UnaryExpression>;
-    UpdateExpression?: RuleFunction<TSESTree.UpdateExpression>;
-    VariableDeclaration?: RuleFunction<TSESTree.VariableDeclaration>;
-    VariableDeclarator?: RuleFunction<TSESTree.VariableDeclarator>;
-    WhileStatement?: RuleFunction<TSESTree.WhileStatement>;
-    WithStatement?: RuleFunction<TSESTree.WithStatement>;
-    YieldExpression?: RuleFunction<TSESTree.YieldExpression>;
-}
-interface RuleModule<TMessageIds extends string, TOptions extends readonly unknown[], TRuleListener extends RuleListener = RuleListener> {
-    /**
-     * Metadata about the rule
-     */
-    meta: RuleMetaData<TMessageIds>;
-    /**
-     * Function which returns an object with methods that ESLint calls to “visit”
-     * nodes while traversing the abstract syntax tree.
-     */
-    create(context: Readonly<RuleContext<TMessageIds, TOptions>>): TRuleListener;
-}
-declare type RuleCreateFunction = (context: Readonly<RuleContext<never, unknown[]>>) => RuleListener;
-export { ReportDescriptor, ReportFixFunction, ReportSuggestionArray, RuleContext, RuleCreateFunction, RuleFix, RuleFixer, RuleFunction, RuleListener, RuleMetaData, RuleMetaDataDocs, RuleModule, };
-//# sourceMappingURL=Rule.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts.map
deleted file mode 100644
index 0e858f8..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Rule.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/Rule.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.js
deleted file mode 100644
index 8113a7e..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.js
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=Rule.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.js.map
deleted file mode 100644
index 88c1f03..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Rule.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Rule.js","sourceRoot":"","sources":["../../src/ts-eslint/Rule.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts
deleted file mode 100644
index 2276560..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts
+++ /dev/null
@@ -1,137 +0,0 @@
-import { AST_NODE_TYPES, AST_TOKEN_TYPES } from '../ts-estree';
-import { ParserOptions } from './ParserOptions';
-import { RuleModule } from './Rule';
-interface ValidTestCase<TOptions extends Readonly<unknown[]>> {
-    /**
-     * Code for the test case.
-     */
-    readonly code: string;
-    /**
-     * Environments for the test case.
-     */
-    readonly env?: Readonly<Record<string, boolean>>;
-    /**
-     * The fake filename for the test case. Useful for rules that make assertion about filenames.
-     */
-    readonly filename?: string;
-    /**
-     * The additional global variables.
-     */
-    readonly globals?: Record<string, 'readonly' | 'writable' | 'off'>;
-    /**
-     * Options for the test case.
-     */
-    readonly options?: Readonly<TOptions>;
-    /**
-     * The absolute path for the parser.
-     */
-    readonly parser?: string;
-    /**
-     * Options for the parser.
-     */
-    readonly parserOptions?: Readonly<ParserOptions>;
-    /**
-     * Settings for the test case.
-     */
-    readonly settings?: Readonly<Record<string, unknown>>;
-}
-interface SuggestionOutput<TMessageIds extends string> {
-    /**
-     * Reported message ID.
-     */
-    readonly messageId: TMessageIds;
-    /**
-     * The data used to fill the message template.
-     */
-    readonly data?: Readonly<Record<string, unknown>>;
-    /**
-     * NOTE: Suggestions will be applied as a stand-alone change, without triggering multi-pass fixes.
-     * Each individual error has its own suggestion, so you have to show the correct, _isolated_ output for each suggestion.
-     */
-    readonly output: string;
-}
-interface InvalidTestCase<TMessageIds extends string, TOptions extends Readonly<unknown[]>> extends ValidTestCase<TOptions> {
-    /**
-     * Expected errors.
-     */
-    readonly errors: TestCaseError<TMessageIds>[];
-    /**
-     * The expected code after autofixes are applied. If set to `null`, the test runner will assert that no autofix is suggested.
-     */
-    readonly output?: string | null;
-}
-interface TestCaseError<TMessageIds extends string> {
-    /**
-     * The 1-based column number of the reported start location.
-     */
-    readonly column?: number;
-    /**
-     * The data used to fill the message template.
-     */
-    readonly data?: Readonly<Record<string, unknown>>;
-    /**
-     * The 1-based column number of the reported end location.
-     */
-    readonly endColumn?: number;
-    /**
-     * The 1-based line number of the reported end location.
-     */
-    readonly endLine?: number;
-    /**
-     * The 1-based line number of the reported start location.
-     */
-    readonly line?: number;
-    /**
-     * Reported message ID.
-     */
-    readonly messageId: TMessageIds;
-    /**
-     * Reported suggestions.
-     */
-    readonly suggestions?: SuggestionOutput<TMessageIds>[] | null;
-    /**
-     * The type of the reported AST node.
-     */
-    readonly type?: AST_NODE_TYPES | AST_TOKEN_TYPES;
-}
-interface RunTests<TMessageIds extends string, TOptions extends Readonly<unknown[]>> {
-    readonly valid: (ValidTestCase<TOptions> | string)[];
-    readonly invalid: InvalidTestCase<TMessageIds, TOptions>[];
-}
-interface RuleTesterConfig {
-    readonly parser: string;
-    readonly parserOptions?: Readonly<ParserOptions>;
-}
-declare class RuleTesterBase {
-    /**
-     * Creates a new instance of RuleTester.
-     * @param testerConfig extra configuration for the tester
-     */
-    constructor(testerConfig?: RuleTesterConfig);
-    /**
-     * Adds a new rule test to execute.
-     * @param ruleName The name of the rule to run.
-     * @param rule The rule to test.
-     * @param test The collection of tests to run.
-     */
-    run<TMessageIds extends string, TOptions extends Readonly<unknown[]>>(ruleName: string, rule: RuleModule<TMessageIds, TOptions>, tests: RunTests<TMessageIds, TOptions>): void;
-    /**
-     * If you supply a value to this property, the rule tester will call this instead of using the version defined on
-     * the global namespace.
-     * @param text a string describing the rule
-     * @param callback the test callback
-     */
-    static describe?: (text: string, callback: () => void) => void;
-    /**
-     * If you supply a value to this property, the rule tester will call this instead of using the version defined on
-     * the global namespace.
-     * @param text a string describing the test case
-     * @param callback the test callback
-     */
-    static it?: (text: string, callback: () => void) => void;
-}
-declare const RuleTester_base: typeof RuleTesterBase;
-declare class RuleTester extends RuleTester_base {
-}
-export { InvalidTestCase, SuggestionOutput, RuleTester, RuleTesterConfig, RunTests, TestCaseError, ValidTestCase, };
-//# sourceMappingURL=RuleTester.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts.map
deleted file mode 100644
index 045a474..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"RuleTester.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/RuleTester.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js
deleted file mode 100644
index f31d0a6..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.RuleTester = void 0;
-const eslint_1 = require("eslint");
-class RuleTester extends eslint_1.RuleTester {
-}
-exports.RuleTester = RuleTester;
-//# sourceMappingURL=RuleTester.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js.map
deleted file mode 100644
index 4fe5fc6..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/RuleTester.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"RuleTester.js","sourceRoot":"","sources":["../../src/ts-eslint/RuleTester.ts"],"names":[],"mappings":";;;AAAA,mCAAwD;AAiKxD,MAAM,UAAW,SAAS,mBAA0C;CAAG;AAKrE,gCAAU"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts
deleted file mode 100644
index 004dec4..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import * as scopeManager from '@typescript-eslint/scope-manager';
-import { TSESTree } from '@typescript-eslint/types';
-declare namespace Scope {
-    class ESLintScopeVariable {
-        readonly defs: Definition[];
-        readonly identifiers: TSESTree.Identifier[];
-        readonly name: string;
-        readonly references: Reference[];
-        readonly scope: Scope;
-        /**
-         * Written to by ESLint.
-         * If this key exists, this variable is a global variable added by ESLint.
-         * If this is `true`, this variable can be assigned arbitrary values.
-         * If this is `false`, this variable is readonly.
-         */
-        writeable?: boolean;
-        /**
-         * Written to by ESLint.
-         * This property is undefined if there are no globals directive comments.
-         * The array of globals directive comments which defined this global variable in the source code file.
-         */
-        eslintExplicitGlobal?: boolean;
-        /**
-         * Written to by ESLint.
-         * The configured value in config files. This can be different from `variable.writeable` if there are globals directive comments.
-         */
-        eslintImplicitGlobalSetting?: 'readonly' | 'writable';
-        /**
-         * Written to by ESLint.
-         * If this key exists, it is a global variable added by ESLint.
-         * If `true`, this global variable was defined by a globals directive comment in the source code file.
-         */
-        eslintExplicitGlobalComments?: TSESTree.Comment[];
-    }
-    export type ScopeManager = scopeManager.ScopeManager;
-    export type Reference = scopeManager.Reference;
-    export type Variable = scopeManager.Variable | ESLintScopeVariable;
-    export type Scope = scopeManager.Scope;
-    export type DefinitionType = scopeManager.Definition;
-    export type Definition = scopeManager.Definition;
-    export {};
-}
-export { Scope };
-//# sourceMappingURL=Scope.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts.map
deleted file mode 100644
index 3464622..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Scope.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/Scope.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,YAAY,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,kBAAU,KAAK,CAAC;IAGd,MAAc,mBAAmB;QAC/B,SAAgB,IAAI,EAAE,UAAU,EAAE,CAAC;QACnC,SAAgB,WAAW,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;QACnD,SAAgB,IAAI,EAAE,MAAM,CAAC;QAC7B,SAAgB,UAAU,EAAE,SAAS,EAAE,CAAC;QACxC,SAAgB,KAAK,EAAE,KAAK,CAAC;QAE7B;;;;;WAKG;QACI,SAAS,CAAC,EAAE,OAAO,CAAC;QAE3B;;;;WAIG;QACI,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAEtC;;;WAGG;QACI,2BAA2B,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;QAE7D;;;;WAIG;QACI,4BAA4B,CAAC,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;KAC1D;IAED,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC;IACrD,MAAM,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;IAC/C,MAAM,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,GAAG,mBAAmB,CAAC;IACnE,MAAM,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;IAEvC,MAAM,MAAM,cAAc,GAAG,YAAY,CAAC,UAAU,CAAC;IACrD,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;;CAClD;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js
deleted file mode 100644
index 3d9d67b..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-/* eslint-disable @typescript-eslint/no-namespace */
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Scope = void 0;
-var Scope;
-(function (Scope) {
-})(Scope || (Scope = {}));
-exports.Scope = Scope;
-//# sourceMappingURL=Scope.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js.map
deleted file mode 100644
index bf72f5e..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/Scope.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Scope.js","sourceRoot":"","sources":["../../src/ts-eslint/Scope.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;AAKpD,IAAU,KAAK,CA8Cd;AA9CD,WAAU,KAAK;AA8Cf,CAAC,EA9CS,KAAK,KAAL,KAAK,QA8Cd;AAEQ,sBAAK"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts
deleted file mode 100644
index 5d5b193..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts
+++ /dev/null
@@ -1,350 +0,0 @@
-import { ParserServices, TSESTree } from '../ts-estree';
-import { Scope } from './Scope';
-declare class TokenStore {
-    /**
-     * Checks whether any comments exist or not between the given 2 nodes.
-     * @param left The node to check.
-     * @param right The node to check.
-     * @returns `true` if one or more comments exist.
-     */
-    commentsExistBetween(left: TSESTree.Node | TSESTree.Token, right: TSESTree.Node | TSESTree.Token): boolean;
-    /**
-     * Gets all comment tokens directly after the given node or token.
-     * @param nodeOrToken The AST node or token to check for adjacent comment tokens.
-     * @returns An array of comments in occurrence order.
-     */
-    getCommentsAfter(nodeOrToken: TSESTree.Node | TSESTree.Token): TSESTree.Comment[];
-    /**
-     * Gets all comment tokens directly before the given node or token.
-     * @param nodeOrToken The AST node or token to check for adjacent comment tokens.
-     * @returns An array of comments in occurrence order.
-     */
-    getCommentsBefore(nodeOrToken: TSESTree.Node | TSESTree.Token): TSESTree.Comment[];
-    /**
-     * Gets all comment tokens inside the given node.
-     * @param node The AST node to get the comments for.
-     * @returns An array of comments in occurrence order.
-     */
-    getCommentsInside(node: TSESTree.Node): TSESTree.Comment[];
-    /**
-     * Gets the first token of the given node.
-     * @param node The AST node.
-     * @param option The option object. If this is a number then it's `options.skip`. If this is a function then it's `options.filter`.
-     * @returns An object representing the token.
-     */
-    getFirstToken<T extends SourceCode.CursorWithSkipOptions>(node: TSESTree.Node, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    /**
-     * Gets the first token between two non-overlapping nodes.
-     * @param left Node before the desired token range.
-     * @param right Node after the desired token range.
-     * @param option The option object. If this is a number then it's `options.skip`. If this is a function then it's `options.filter`.
-     * @returns An object representing the token.
-     */
-    getFirstTokenBetween<T extends SourceCode.CursorWithSkipOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    /**
-     * Gets the first `count` tokens of the given node.
-     * @param node The AST node.
-     * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.
-     * @returns Tokens.
-     */
-    getFirstTokens<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    /**
-     * Gets the first `count` tokens between two non-overlapping nodes.
-     * @param left Node before the desired token range.
-     * @param right Node after the desired token range.
-     * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.
-     * @returns Tokens between left and right.
-     */
-    getFirstTokensBetween<T extends SourceCode.CursorWithCountOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    /**
-     * Gets the last token of the given node.
-     * @param node The AST node.
-     * @param option The option object. If this is a number then it's `options.skip`. If this is a function then it's `options.filter`.
-     * @returns An object representing the token.
-     */
-    getLastToken<T extends SourceCode.CursorWithSkipOptions>(node: TSESTree.Node, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    /**
-     * Gets the last token between two non-overlapping nodes.
-     * @param left Node before the desired token range.
-     * @param right Node after the desired token range.
-     * @param option The option object. If this is a number then it's `options.skip`. If this is a function then it's `options.filter`.
-     * @returns An object representing the token.
-     */
-    getLastTokenBetween<T extends SourceCode.CursorWithSkipOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    /**
-     * Gets the last `count` tokens of the given node.
-     * @param node The AST node.
-     * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.
-     * @returns Tokens.
-     */
-    getLastTokens<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    /**
-     * Gets the last `count` tokens between two non-overlapping nodes.
-     * @param left Node before the desired token range.
-     * @param right Node after the desired token range.
-     * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.
-     * @returns Tokens between left and right.
-     */
-    getLastTokensBetween<T extends SourceCode.CursorWithCountOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    /**
-     * Gets the token that follows a given node or token.
-     * @param node The AST node or token.
-     * @param option The option object. If this is a number then it's `options.skip`. If this is a function then it's `options.filter`.
-     * @returns An object representing the token.
-     */
-    getTokenAfter<T extends SourceCode.CursorWithSkipOptions>(node: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    /**
-     * Gets the token that precedes a given node or token.
-     * @param node The AST node or token.
-     * @param options The option object
-     * @returns An object representing the token.
-     */
-    getTokenBefore<T extends SourceCode.CursorWithSkipOptions>(node: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    /**
-     * Gets the token starting at the specified index.
-     * @param offset Index of the start of the token's range.
-     * @param option The option object. If this is a number then it's `options.skip`. If this is a function then it's `options.filter`.
-     * @returns The token starting at index, or null if no such token.
-     */
-    getTokenByRangeStart<T extends {
-        includeComments?: boolean;
-    }>(offset: number, options?: T): SourceCode.ReturnTypeFromOptions<T> | null;
-    /**
-     * Gets all tokens that are related to the given node.
-     * @param node The AST node.
-     * @param beforeCount The number of tokens before the node to retrieve.
-     * @param afterCount The number of tokens after the node to retrieve.
-     * @returns Array of objects representing tokens.
-     */
-    getTokens(node: TSESTree.Node, beforeCount?: number, afterCount?: number): TSESTree.Token[];
-    /**
-     * Gets all tokens that are related to the given node.
-     * @param node The AST node.
-     * @param options The option object. If this is a function then it's `options.filter`.
-     * @returns Array of objects representing tokens.
-     */
-    getTokens<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node, options: T): SourceCode.ReturnTypeFromOptions<T>[];
-    /**
-     * Gets the `count` tokens that follows a given node or token.
-     * @param node The AST node.
-     * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.
-     * @returns Tokens.
-     */
-    getTokensAfter<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    /**
-     * Gets the `count` tokens that precedes a given node or token.
-     * @param node The AST node.
-     * @param options The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.
-     * @returns Tokens.
-     */
-    getTokensBefore<T extends SourceCode.CursorWithCountOptions>(node: TSESTree.Node | TSESTree.Token | TSESTree.Comment, options?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    /**
-     * Gets all of the tokens between two non-overlapping nodes.
-     * @param left Node before the desired token range.
-     * @param right Node after the desired token range.
-     * @param options The option object. If this is a function then it's `options.filter`.
-     * @returns Tokens between left and right.
-     */
-    getTokensBetween<T extends SourceCode.CursorWithCountOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, padding?: T): SourceCode.ReturnTypeFromOptions<T>[];
-    /**
-     * Gets all of the tokens between two non-overlapping nodes.
-     * @param left Node before the desired token range.
-     * @param right Node after the desired token range.
-     * @param padding Number of extra tokens on either side of center.
-     * @returns Tokens between left and right.
-     */
-    getTokensBetween<T extends SourceCode.CursorWithCountOptions>(left: TSESTree.Node | TSESTree.Token | TSESTree.Comment, right: TSESTree.Node | TSESTree.Token | TSESTree.Comment, padding?: number): SourceCode.ReturnTypeFromOptions<T>[];
-}
-declare class SourceCodeBase extends TokenStore {
-    /**
-     * Represents parsed source code.
-     * @param text The source code text.
-     * @param ast The Program node of the AST representing the code. This AST should be created from the text that BOM was stripped.
-     */
-    constructor(text: string, ast: SourceCode.Program);
-    /**
-     * Represents parsed source code.
-     * @param config The config object.
-     */
-    constructor(config: SourceCode.SourceCodeConfig);
-    /**
-     * The parsed AST for the source code.
-     */
-    ast: SourceCode.Program;
-    /**
-     * Retrieves an array containing all comments in the source code.
-     * @returns An array of comment nodes.
-     */
-    getAllComments(): TSESTree.Comment[];
-    /**
-     * Gets all comments for the given node.
-     * @param node The AST node to get the comments for.
-     * @returns An object containing a leading and trailing array of comments indexed by their position.
-     */
-    getComments(node: TSESTree.Node): {
-        leading: TSESTree.Comment[];
-        trailing: TSESTree.Comment[];
-    };
-    /**
-     * Converts a (line, column) pair into a range index.
-     * @param loc A line/column location
-     * @returns The range index of the location in the file.
-     */
-    getIndexFromLoc(location: TSESTree.LineAndColumnData): number;
-    /**
-     * Gets the entire source text split into an array of lines.
-     * @returns The source text as an array of lines.
-     */
-    getLines(): string[];
-    /**
-     * Converts a source text index into a (line, column) pair.
-     * @param index The index of a character in a file
-     * @returns A {line, column} location object with a 0-indexed column
-     */
-    getLocFromIndex(index: number): TSESTree.LineAndColumnData;
-    /**
-     * Gets the deepest node containing a range index.
-     * @param index Range index of the desired node.
-     * @returns The node if found or `null` if not found.
-     */
-    getNodeByRangeIndex(index: number): TSESTree.Node | null;
-    /**
-     * Gets the source code for the given node.
-     * @param node The AST node to get the text for.
-     * @param beforeCount The number of characters before the node to retrieve.
-     * @param afterCount The number of characters after the node to retrieve.
-     * @returns The text representing the AST node.
-     */
-    getText(node?: TSESTree.Node, beforeCount?: number, afterCount?: number): string;
-    /**
-     * The flag to indicate that the source code has Unicode BOM.
-     */
-    hasBOM: boolean;
-    /**
-     * Determines if two nodes or tokens have at least one whitespace character
-     * between them. Order does not matter. Returns false if the given nodes or
-     * tokens overlap.
-     * This was added in v6.7.0.
-     * @since 6.7.0
-     * @param first The first node or token to check between.
-     * @param second The second node or token to check between.
-     * @returns True if there is a whitespace character between any of the tokens found between the two given nodes or tokens.
-     */
-    isSpaceBetween?(first: TSESTree.Token | TSESTree.Comment | TSESTree.Node, second: TSESTree.Token | TSESTree.Comment | TSESTree.Node): boolean;
-    /**
-     * Determines if two nodes or tokens have at least one whitespace character
-     * between them. Order does not matter. Returns false if the given nodes or
-     * tokens overlap.
-     * For backward compatibility, this method returns true if there are
-     * `JSXText` tokens that contain whitespace between the two.
-     * @param first The first node or token to check between.
-     * @param second The second node or token to check between.
-     * @returns {boolean} True if there is a whitespace character between
-     * any of the tokens found between the two given nodes or tokens.
-     * @deprecated in favor of isSpaceBetween
-     */
-    isSpaceBetweenTokens(first: TSESTree.Token, second: TSESTree.Token): boolean;
-    /**
-     * The source code split into lines according to ECMA-262 specification.
-     * This is done to avoid each rule needing to do so separately.
-     */
-    lines: string[];
-    /**
-     * The indexes in `text` that each line starts
-     */
-    lineStartIndices: number[];
-    /**
-     * The parser services of this source code.
-     */
-    parserServices: ParserServices;
-    /**
-     * The scope of this source code.
-     */
-    scopeManager: Scope.ScopeManager | null;
-    /**
-     * The original text source code. BOM was stripped from this text.
-     */
-    text: string;
-    /**
-     * All of the tokens and comments in the AST.
-     */
-    tokensAndComments: (TSESTree.Comment | TSESTree.Token)[];
-    /**
-     * The visitor keys to traverse AST.
-     */
-    visitorKeys: SourceCode.VisitorKeys;
-    /**
-     * Split the source code into multiple lines based on the line delimiters.
-     * @param text Source code as a string.
-     * @returns Array of source code lines.
-     */
-    static splitLines(text: string): string[];
-}
-declare namespace SourceCode {
-    interface Program extends TSESTree.Program {
-        comments: TSESTree.Comment[];
-        tokens: TSESTree.Token[];
-    }
-    interface SourceCodeConfig {
-        /**
-         * The Program node of the AST representing the code. This AST should be created from the text that BOM was stripped.
-         */
-        ast: Program;
-        /**
-         * The parser services.
-         */
-        parserServices: ParserServices | null;
-        /**
-         * The scope of this source code.
-         */
-        scopeManager: Scope.ScopeManager | null;
-        /**
-         * The source code text.
-         */
-        text: string;
-        /**
-         * The visitor keys to traverse AST.
-         */
-        visitorKeys: VisitorKeys | null;
-    }
-    interface VisitorKeys {
-        [nodeType: string]: string[];
-    }
-    type FilterPredicate = (tokenOrComment: TSESTree.Token | TSESTree.Comment) => boolean;
-    type ReturnTypeFromOptions<T> = T extends {
-        includeComments: true;
-    } ? TSESTree.Token : Exclude<TSESTree.Token, TSESTree.Comment>;
-    type CursorWithSkipOptions = number | FilterPredicate | {
-        /**
-         * The predicate function to choose tokens.
-         */
-        filter?: FilterPredicate;
-        /**
-         * The flag to iterate comments as well.
-         */
-        includeComments?: boolean;
-        /**
-         * The count of tokens the cursor skips.
-         */
-        skip?: number;
-    };
-    type CursorWithCountOptions = number | FilterPredicate | {
-        /**
-         * The predicate function to choose tokens.
-         */
-        filter?: FilterPredicate;
-        /**
-         * The flag to iterate comments as well.
-         */
-        includeComments?: boolean;
-        /**
-         * The maximum count of tokens the cursor iterates.
-         */
-        count?: number;
-    };
-}
-declare const SourceCode_base: typeof SourceCodeBase;
-declare class SourceCode extends SourceCode_base {
-}
-export { SourceCode };
-//# sourceMappingURL=SourceCode.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts.map
deleted file mode 100644
index 18f49a7..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SourceCode.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/SourceCode.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js
deleted file mode 100644
index 8e029b1..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-/* eslint-disable @typescript-eslint/no-namespace */
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.SourceCode = void 0;
-const eslint_1 = require("eslint");
-class SourceCode extends eslint_1.SourceCode {
-}
-exports.SourceCode = SourceCode;
-//# sourceMappingURL=SourceCode.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js.map
deleted file mode 100644
index 60f58ea..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/SourceCode.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SourceCode.js","sourceRoot":"","sources":["../../src/ts-eslint/SourceCode.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;AAEpD,mCAAwD;AAubxD,MAAM,UAAW,SAAS,mBAA0C;CAAG;AAE9D,gCAAU"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts
deleted file mode 100644
index 05d889d..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export * from './AST';
-export * from './CLIEngine';
-export * from './ESLint';
-export * from './Linter';
-export * from './ParserOptions';
-export * from './Rule';
-export * from './RuleTester';
-export * from './Scope';
-export * from './SourceCode';
-//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts.map
deleted file mode 100644
index 6b3df41..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ts-eslint/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js
deleted file mode 100644
index 4125958..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-__exportStar(require("./AST"), exports);
-__exportStar(require("./CLIEngine"), exports);
-__exportStar(require("./ESLint"), exports);
-__exportStar(require("./Linter"), exports);
-__exportStar(require("./ParserOptions"), exports);
-__exportStar(require("./Rule"), exports);
-__exportStar(require("./RuleTester"), exports);
-__exportStar(require("./Scope"), exports);
-__exportStar(require("./SourceCode"), exports);
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js.map
deleted file mode 100644
index 7ffb898..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ts-eslint/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAAsB;AACtB,8CAA4B;AAC5B,2CAAyB;AACzB,2CAAyB;AACzB,kDAAgC;AAChC,yCAAuB;AACvB,+CAA6B;AAC7B,0CAAwB;AACxB,+CAA6B"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/node_modules/.bin/eslint b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/node_modules/.bin/eslint
deleted file mode 120000
index f502c26..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/node_modules/.bin/eslint
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../../eslint/bin/eslint.js
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/package.json b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/package.json
deleted file mode 100644
index 0217ca1..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/experimental-utils/package.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
-  "name": "@typescript-eslint/experimental-utils",
-  "version": "4.1.0",
-  "description": "(Experimental) Utilities for working with TypeScript + ESLint together",
-  "keywords": [
-    "eslint",
-    "typescript",
-    "estree"
-  ],
-  "engines": {
-    "node": "^10.12.0 || >=12.0.0"
-  },
-  "files": [
-    "dist",
-    "_ts3.4",
-    "package.json",
-    "README.md",
-    "LICENSE"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/typescript-eslint/typescript-eslint.git",
-    "directory": "packages/experimental-utils"
-  },
-  "bugs": {
-    "url": "https://github.com/typescript-eslint/typescript-eslint/issues"
-  },
-  "license": "MIT",
-  "main": "dist/index.js",
-  "types": "dist/index.d.ts",
-  "scripts": {
-    "build": "tsc -b tsconfig.build.json",
-    "postbuild": "downlevel-dts dist _ts3.4/dist",
-    "clean": "tsc -b tsconfig.build.json --clean",
-    "postclean": "rimraf dist && rimraf _ts3.4",
-    "format": "prettier --write \"./**/*.{ts,js,json,md}\" --ignore-path ../../.prettierignore",
-    "lint": "eslint . --ext .js,.ts --ignore-path='../../.eslintignore'",
-    "test": "jest --coverage",
-    "typecheck": "tsc -p tsconfig.json --noEmit"
-  },
-  "dependencies": {
-    "@types/json-schema": "^7.0.3",
-    "@typescript-eslint/scope-manager": "4.1.0",
-    "@typescript-eslint/types": "4.1.0",
-    "@typescript-eslint/typescript-estree": "4.1.0",
-    "eslint-scope": "^5.0.0",
-    "eslint-utils": "^2.0.0"
-  },
-  "peerDependencies": {
-    "eslint": "*"
-  },
-  "devDependencies": {
-    "typescript": "*"
-  },
-  "funding": {
-    "type": "opencollective",
-    "url": "https://opencollective.com/typescript-eslint"
-  },
-  "typesVersions": {
-    "<3.8": {
-      "*": [
-        "_ts3.4/*"
-      ]
-    }
-  },
-  "gitHead": "00a24706222254774121ee62038e67d0efa993e7"
-}
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/CHANGELOG.md b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/CHANGELOG.md
deleted file mode 100644
index 284d90a..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/CHANGELOG.md
+++ /dev/null
@@ -1,925 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-# [4.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.1...v4.1.0) (2020-09-07)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-## [4.0.1](https://github.com/typescript-eslint/typescript-eslint/compare/v4.0.0...v4.0.1) (2020-08-31)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [4.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.10.1...v4.0.0) (2020-08-31)
-
-
-### Bug Fixes
-
-* correct decorator traversal for AssignmentPattern ([#2375](https://github.com/typescript-eslint/typescript-eslint/issues/2375)) ([d738fa4](https://github.com/typescript-eslint/typescript-eslint/commit/d738fa4eff0a5c4cfc9b30b1c0502f8d1e78d7b6))
-* **typescript-estree:** correct ChainExpression interaction with parentheses and non-nulls ([#2380](https://github.com/typescript-eslint/typescript-eslint/issues/2380)) ([762bc99](https://github.com/typescript-eslint/typescript-eslint/commit/762bc99584ede4d0b8099a743991e957aec86aa8))
-
-
-### Features
-
-* support ESTree optional chaining representation ([#2308](https://github.com/typescript-eslint/typescript-eslint/issues/2308)) ([e9d2ab6](https://github.com/typescript-eslint/typescript-eslint/commit/e9d2ab638b6767700b52797e74b814ea059beaae))
-* **typescript-estree:** switch to globby ([#2418](https://github.com/typescript-eslint/typescript-eslint/issues/2418)) ([3a7ec9b](https://github.com/typescript-eslint/typescript-eslint/commit/3a7ec9bcf1873a99c6da2f19ade8ab4763b4793c)), closes [#2398](https://github.com/typescript-eslint/typescript-eslint/issues/2398)
-
-
-### BREAKING CHANGES
-
-* **typescript-estree:** - removes the ability to supply a `RegExp` to `projectFolderIgnoreList`, and changes the meaning of the string value from a regex to a glob.
-* - Removed decorators property from several Nodes that could never semantically have them (FunctionDeclaration, TSEnumDeclaration, and TSInterfaceDeclaration)
-- Removed AST_NODE_TYPES.Import. This is a minor breaking change as the node type that used this was removed ages ago.
-
-
-
-
-
-## [3.10.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.10.0...v3.10.1) (2020-08-25)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [3.10.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.9.1...v3.10.0) (2020-08-24)
-
-
-### Bug Fixes
-
-* **typescript-estree:** ts.NamedTupleMember workaround for <TS4.0 ([#2405](https://github.com/typescript-eslint/typescript-eslint/issues/2405)) ([b62331a](https://github.com/typescript-eslint/typescript-eslint/commit/b62331ad02dcff3236e18f10eb92d59e7371d4c3))
-
-
-### Features
-
-* **typescript-estree:** update allowed TS version range ([#2419](https://github.com/typescript-eslint/typescript-eslint/issues/2419)) ([e6be621](https://github.com/typescript-eslint/typescript-eslint/commit/e6be62128b3a98541fe590512892c4b501914e46))
-
-
-
-
-
-## [3.9.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.9.0...v3.9.1) (2020-08-17)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [3.9.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.8.0...v3.9.0) (2020-08-10)
-
-
-### Features
-
-* **typescript-estree:** support TSv4 labelled tuple members ([#2378](https://github.com/typescript-eslint/typescript-eslint/issues/2378)) ([00d84ff](https://github.com/typescript-eslint/typescript-eslint/commit/00d84ffbcbe9d0ec98bdb2f2ce59959a27ce4dbe))
-
-
-
-
-
-# [3.8.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.7.1...v3.8.0) (2020-08-03)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-## [3.7.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.7.0...v3.7.1) (2020-07-27)
-
-
-### Bug Fixes
-
-* **typescript-estree:** correct AST regression introduced by TS4.0 upgrade ([#2316](https://github.com/typescript-eslint/typescript-eslint/issues/2316)) ([d7fefba](https://github.com/typescript-eslint/typescript-eslint/commit/d7fefba3741a526ff2b58dd713995c3ee5603962))
-
-
-
-
-
-# [3.7.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.6.1...v3.7.0) (2020-07-20)
-
-
-### Features
-
-* **typescript-estree:** support short-circuiting assignment operators ([#2307](https://github.com/typescript-eslint/typescript-eslint/issues/2307)) ([2c90d9f](https://github.com/typescript-eslint/typescript-eslint/commit/2c90d9fa3aa5ebd7db697dddb7762bca2dd0e06b))
-* **typescript-estree:** support type annotations on catch clauses ([#2306](https://github.com/typescript-eslint/typescript-eslint/issues/2306)) ([b5afe9c](https://github.com/typescript-eslint/typescript-eslint/commit/b5afe9c560b9f38c8dffc312a600db30944129c8))
-
-
-
-
-
-## [3.6.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.6.0...v3.6.1) (2020-07-13)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [3.6.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.5.0...v3.6.0) (2020-07-06)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [3.5.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.4.0...v3.5.0) (2020-06-29)
-
-
-### Bug Fixes
-
-* **typescript-estree:** forward compatibility for new compound assignment operators ([#2253](https://github.com/typescript-eslint/typescript-eslint/issues/2253)) ([ba41680](https://github.com/typescript-eslint/typescript-eslint/commit/ba41680f2a25b1aa4d05c2d4b132ac73a6faefbd))
-
-
-### Features
-
-* add package scope-manager ([#1939](https://github.com/typescript-eslint/typescript-eslint/issues/1939)) ([682eb7e](https://github.com/typescript-eslint/typescript-eslint/commit/682eb7e009c3f22a542882dfd3602196a60d2a1e))
-* split types into their own package ([#2229](https://github.com/typescript-eslint/typescript-eslint/issues/2229)) ([5f45918](https://github.com/typescript-eslint/typescript-eslint/commit/5f4591886f3438329fbf2229b03ac66174334a24))
-* split visitor keys into their own package ([#2230](https://github.com/typescript-eslint/typescript-eslint/issues/2230)) ([689dae3](https://github.com/typescript-eslint/typescript-eslint/commit/689dae37392d527c64ae83db2a4c3e6b7fecece7))
-
-
-
-
-
-# [3.4.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.3.0...v3.4.0) (2020-06-22)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [3.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.2.0...v3.3.0) (2020-06-15)
-
-
-### Bug Fixes
-
-* **typescript-estree:** handle TS4.0 breaking change in TupleType ([#2197](https://github.com/typescript-eslint/typescript-eslint/issues/2197)) ([5d68129](https://github.com/typescript-eslint/typescript-eslint/commit/5d6812914831a386997b453b4db1e3283e26005d))
-
-
-
-
-
-# [3.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.1.0...v3.2.0) (2020-06-08)
-
-
-### Bug Fixes
-
-* **eslint-plugin:** [prefer-optional-chain] handling first member expression ([#2156](https://github.com/typescript-eslint/typescript-eslint/issues/2156)) ([de18660](https://github.com/typescript-eslint/typescript-eslint/commit/de18660a8cf8f7033798646d8c5b0938d1accb12))
-
-
-
-
-
-# [3.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.2...v3.1.0) (2020-06-01)
-
-
-### Bug Fixes
-
-* **eslint-plugin:** [no-unused-expressions] ignore import expressions ([#2130](https://github.com/typescript-eslint/typescript-eslint/issues/2130)) ([e383691](https://github.com/typescript-eslint/typescript-eslint/commit/e3836910efdafd9edf04daed149c9e839c08047e))
-* **experimental-utils:** downlevel type declarations for versions older than 3.8 ([#2133](https://github.com/typescript-eslint/typescript-eslint/issues/2133)) ([7925823](https://github.com/typescript-eslint/typescript-eslint/commit/792582326a8065270b69a0ffcaad5a7b4b103ff3))
-
-
-
-
-
-## [3.0.2](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.1...v3.0.2) (2020-05-27)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-## [3.0.1](https://github.com/typescript-eslint/typescript-eslint/compare/v3.0.0...v3.0.1) (2020-05-25)
-
-
-### Bug Fixes
-
-* **typescript-estree:** handle `BigInt` with `_` numeric separator ([#2067](https://github.com/typescript-eslint/typescript-eslint/issues/2067)) ([66f1627](https://github.com/typescript-eslint/typescript-eslint/commit/66f1627b11a566d5b925a577e800f99d5c808be2))
-* **typescript-estree:** mark TS 3.8 and 3.9 as "supported" ([#2057](https://github.com/typescript-eslint/typescript-eslint/issues/2057)) ([5eedbff](https://github.com/typescript-eslint/typescript-eslint/commit/5eedbff01178ea33b98ab22e556df4c1a195f839)), closes [#1436](https://github.com/typescript-eslint/typescript-eslint/issues/1436) [#1436](https://github.com/typescript-eslint/typescript-eslint/issues/1436)
-
-
-
-
-
-# [3.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.34.0...v3.0.0) (2020-05-21)
-
-## [Please see the release notes for v3.0.0](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v3.0.0)
-
-### Bug Fixes
-
-* **typescript-estree:** remove now defunct `Import` node type ([f199cbd](https://github.com/typescript-eslint/typescript-eslint/commit/f199cbdbbd892b5ba03bfff66f463f3d9c92ee9b))
-* **typescript-estree:** use `TSEmptyBodyFunctionExpression` for body-less nodes ([#1289](https://github.com/typescript-eslint/typescript-eslint/issues/1289)) ([82e7163](https://github.com/typescript-eslint/typescript-eslint/commit/82e7163214b56ccde93ba97807b161669a50a60b))
-
-
-### Features
-
-* add index files to parser and typescript-estree ([3dfc46d](https://github.com/typescript-eslint/typescript-eslint/commit/3dfc46dccbbd28eed2d74c7b6cacddf1a0848598))
-* bump minimum required TS version ([#2004](https://github.com/typescript-eslint/typescript-eslint/issues/2004)) ([7ad4d7c](https://github.com/typescript-eslint/typescript-eslint/commit/7ad4d7c2db088b6f779b9d883a4acad13eee3775))
-* **eslint-plugin:** [ban-types] rework default options ([#848](https://github.com/typescript-eslint/typescript-eslint/issues/848)) ([8e31d5d](https://github.com/typescript-eslint/typescript-eslint/commit/8e31d5dbe9fe5227fdbefcecfd50ce5dd51360c3))
-* **typescript-estree:** align nodes with estree 2020 ([#1389](https://github.com/typescript-eslint/typescript-eslint/issues/1389)) ([aff5b62](https://github.com/typescript-eslint/typescript-eslint/commit/aff5b62044f9b93f2087a1d261e9be3f8d6fd54d))
-* **typescript-estree:** align optional fields ([#1429](https://github.com/typescript-eslint/typescript-eslint/issues/1429)) ([0e0010f](https://github.com/typescript-eslint/typescript-eslint/commit/0e0010f82952f9beeeb84136eea00cc5eecc9db6))
-* drop support for node v8 ([#1997](https://github.com/typescript-eslint/typescript-eslint/issues/1997)) ([b6c3b7b](https://github.com/typescript-eslint/typescript-eslint/commit/b6c3b7b84b8d199fa75a46432febd4a364a63217))
-* **typescript-estree:** always return parserServices ([#716](https://github.com/typescript-eslint/typescript-eslint/issues/716)) ([5b23443](https://github.com/typescript-eslint/typescript-eslint/commit/5b23443c48f3f62424db3e742243f3568080b946))
-* **typescript-estree:** handle 3.9's non-null assertion changes ([#2036](https://github.com/typescript-eslint/typescript-eslint/issues/2036)) ([06bec63](https://github.com/typescript-eslint/typescript-eslint/commit/06bec63c56536db070608ab136d2ad57083f0c6a))
-
-
-
-
-
-# [2.34.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.33.0...v2.34.0) (2020-05-18)
-
-
-### Bug Fixes
-
-* **typescript-estree:** fix handling of range/loc removal ([#2028](https://github.com/typescript-eslint/typescript-eslint/issues/2028)) ([ce344d9](https://github.com/typescript-eslint/typescript-eslint/commit/ce344d90e7c78b0c4b4b823494a3e78190f45c64))
-
-
-
-
-
-# [2.33.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.32.0...v2.33.0) (2020-05-12)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [2.32.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.31.0...v2.32.0) (2020-05-11)
-
-
-### Features
-
-* bump dependencies and align AST ([#2007](https://github.com/typescript-eslint/typescript-eslint/issues/2007)) ([18668b7](https://github.com/typescript-eslint/typescript-eslint/commit/18668b78fd7d1e5281af7fc26c76e0ca53297f69))
-
-
-
-
-
-# [2.31.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.30.0...v2.31.0) (2020-05-04)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [2.30.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.29.0...v2.30.0) (2020-04-27)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [2.29.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.28.0...v2.29.0) (2020-04-20)
-
-
-### Features
-
-* **eslint-plugin:** [no-floating-promise] add option to ignore IIFEs ([#1799](https://github.com/typescript-eslint/typescript-eslint/issues/1799)) ([cea51bf](https://github.com/typescript-eslint/typescript-eslint/commit/cea51bf130d6d3c2935f5e2dcc468196f2ad9d00))
-
-
-
-
-
-# [2.28.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.27.0...v2.28.0) (2020-04-13)
-
-
-### Features
-
-* **eslint-plugin:** add rule `prefer-ts-expect-error` ([#1705](https://github.com/typescript-eslint/typescript-eslint/issues/1705)) ([7021f21](https://github.com/typescript-eslint/typescript-eslint/commit/7021f2151a25db2a8edf17e06cd6f21e90761ec8))
-* **eslint-plugin:** add rule no-unsafe-assignment ([#1694](https://github.com/typescript-eslint/typescript-eslint/issues/1694)) ([a49b860](https://github.com/typescript-eslint/typescript-eslint/commit/a49b860cbbb2c7d718b99f561e2fb6eaadf16f17))
-
-
-
-
-
-# [2.27.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.26.0...v2.27.0) (2020-04-06)
-
-
-### Bug Fixes
-
-* **typescript-estree:** add support for TS3.9 extra file extensions ([#1833](https://github.com/typescript-eslint/typescript-eslint/issues/1833)) ([1f0ff41](https://github.com/typescript-eslint/typescript-eslint/commit/1f0ff41aa1bc3b7c5330b2f5fe22e24bf578a6b2))
-
-
-### Features
-
-* **eslint-plugin:** sort members alphabetically ([#263](https://github.com/typescript-eslint/typescript-eslint/issues/263)) ([485e902](https://github.com/typescript-eslint/typescript-eslint/commit/485e90213a0f8baac0587f7d56925448883fc5bd))
-
-
-
-
-
-# [2.26.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.25.0...v2.26.0) (2020-03-30)
-
-
-### Features
-
-* **typescript-estree:** add option to ignore certain folders from glob resolution ([#1802](https://github.com/typescript-eslint/typescript-eslint/issues/1802)) ([1e29e69](https://github.com/typescript-eslint/typescript-eslint/commit/1e29e69b289d61107a7de67592beae331ba50222))
-
-
-
-
-
-# [2.25.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.24.0...v2.25.0) (2020-03-23)
-
-
-### Bug Fixes
-
-* **typescript-estree:** export * regression from 133f622f ([#1751](https://github.com/typescript-eslint/typescript-eslint/issues/1751)) ([09d8afc](https://github.com/typescript-eslint/typescript-eslint/commit/09d8afca684635b5ac604bc1794240484a70ce91))
-
-
-
-
-
-# [2.24.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.23.0...v2.24.0) (2020-03-16)
-
-
-### Bug Fixes
-
-* **typescript-estree:** unnecessary program updates by removing timeout methods ([#1693](https://github.com/typescript-eslint/typescript-eslint/issues/1693)) ([2ccd66b](https://github.com/typescript-eslint/typescript-eslint/commit/2ccd66b920816d54cc1a639059f60410df665900))
-
-
-### Features
-
-* **typescript-estree:** support 3.8 `export * as ns` ([#1698](https://github.com/typescript-eslint/typescript-eslint/issues/1698)) ([133f622](https://github.com/typescript-eslint/typescript-eslint/commit/133f622f38a286eac45288a9789d2ee529d5e582))
-
-
-
-
-
-# [2.23.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.22.0...v2.23.0) (2020-03-09)
-
-
-### Features
-
-* **typescript-estree:** support 3.8 import/export type ([#1697](https://github.com/typescript-eslint/typescript-eslint/issues/1697)) ([625d603](https://github.com/typescript-eslint/typescript-eslint/commit/625d603f94bf0521f834313bf31c734ce4948b7a))
-
-
-
-
-
-# [2.22.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.21.0...v2.22.0) (2020-03-02)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [2.21.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.20.0...v2.21.0) (2020-02-24)
-
-
-### Bug Fixes
-
-* **typescript-estree:** process.stdout can be undefined ([#1619](https://github.com/typescript-eslint/typescript-eslint/issues/1619)) ([0d8e87e](https://github.com/typescript-eslint/typescript-eslint/commit/0d8e87e09704588273bc94a740279b3e8af7474f))
-
-
-
-
-
-# [2.20.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.19.2...v2.20.0) (2020-02-17)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-## [2.19.2](https://github.com/typescript-eslint/typescript-eslint/compare/v2.19.1...v2.19.2) (2020-02-10)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-## [2.19.1](https://github.com/typescript-eslint/typescript-eslint/compare/v2.19.0...v2.19.1) (2020-02-10)
-
-
-### Bug Fixes
-
-* **typescript-estree:** ts returning wrong file with project references ([#1575](https://github.com/typescript-eslint/typescript-eslint/issues/1575)) ([4c12dac](https://github.com/typescript-eslint/typescript-eslint/commit/4c12dac075f774801a145cd29c4c7eff64f98fdc))
-
-
-
-
-
-# [2.19.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.18.0...v2.19.0) (2020-02-03)
-
-
-### Bug Fixes
-
-* **typescript-estree:** fix regression introduced in [#1525](https://github.com/typescript-eslint/typescript-eslint/issues/1525) ([#1543](https://github.com/typescript-eslint/typescript-eslint/issues/1543)) ([bec4572](https://github.com/typescript-eslint/typescript-eslint/commit/bec45722dfed8aeb49189d151252b83d4a34239c))
-* **typescript-estree:** persisted parse and module none ([#1516](https://github.com/typescript-eslint/typescript-eslint/issues/1516)) ([7c70323](https://github.com/typescript-eslint/typescript-eslint/commit/7c7032322f55d9492e21d3bfa5da16da1f05cbce))
-
-
-
-
-
-# [2.18.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.17.0...v2.18.0) (2020-01-27)
-
-
-### Bug Fixes
-
-* improve token types and add missing type guards ([#1497](https://github.com/typescript-eslint/typescript-eslint/issues/1497)) ([ce41d7d](https://github.com/typescript-eslint/typescript-eslint/commit/ce41d7de33bcb7ccf96c03ac1438304c5a49ff54))
-* **typescript-estree:** error on unexpected jsdoc nodes ([#1525](https://github.com/typescript-eslint/typescript-eslint/issues/1525)) ([c8dfac3](https://github.com/typescript-eslint/typescript-eslint/commit/c8dfac3d2f066e50fa9d2b5a86beffdaafddb643))
-* **typescript-estree:** fix identifier tokens typed as `Keyword` ([#1487](https://github.com/typescript-eslint/typescript-eslint/issues/1487)) ([77a1caa](https://github.com/typescript-eslint/typescript-eslint/commit/77a1caa562638645b4717449800e410107d512c8))
-
-
-### Features
-
-* **eslint-plugin:** add new rule prefer-as-const ([#1431](https://github.com/typescript-eslint/typescript-eslint/issues/1431)) ([420db96](https://github.com/typescript-eslint/typescript-eslint/commit/420db96921435e8bf7fb484ae74552a912a6adde))
-
-
-
-
-
-# [2.17.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.16.0...v2.17.0) (2020-01-20)
-
-
-### Bug Fixes
-
-* **typescript-estree:** correct type of `ArrayPattern.elements` ([#1451](https://github.com/typescript-eslint/typescript-eslint/issues/1451)) ([62e4ca0](https://github.com/typescript-eslint/typescript-eslint/commit/62e4ca0))
-
-
-
-
-
-# [2.16.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.15.0...v2.16.0) (2020-01-13)
-
-
-### Bug Fixes
-
-* **typescript-estree:** fix persisted parse for relative paths ([#1424](https://github.com/typescript-eslint/typescript-eslint/issues/1424)) ([9720d2c](https://github.com/typescript-eslint/typescript-eslint/commit/9720d2c))
-* **typescript-estree:** parsing of deeply nested new files in new folder ([#1412](https://github.com/typescript-eslint/typescript-eslint/issues/1412)) ([206c94b](https://github.com/typescript-eslint/typescript-eslint/commit/206c94b))
-* **typescript-estree:** resolve path relative to tsconfigRootDir ([#1439](https://github.com/typescript-eslint/typescript-eslint/issues/1439)) ([c709056](https://github.com/typescript-eslint/typescript-eslint/commit/c709056))
-
-
-### Features
-
-* **typescript-estree:** add parserOption to turn on debug logs ([#1413](https://github.com/typescript-eslint/typescript-eslint/issues/1413)) ([25092fd](https://github.com/typescript-eslint/typescript-eslint/commit/25092fd))
-* **typescript-estree:** add strict type mapping to esTreeNodeToTSNodeMap ([#1382](https://github.com/typescript-eslint/typescript-eslint/issues/1382)) ([d3d70a3](https://github.com/typescript-eslint/typescript-eslint/commit/d3d70a3))
-
-
-
-
-
-# [2.15.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.14.0...v2.15.0) (2020-01-06)
-
-
-### Bug Fixes
-
-* **typescript-estree:** correct persisted parse for windows ([#1406](https://github.com/typescript-eslint/typescript-eslint/issues/1406)) ([1a42f3d](https://github.com/typescript-eslint/typescript-eslint/commit/1a42f3d))
-
-
-
-
-
-# [2.14.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.13.0...v2.14.0) (2019-12-30)
-
-
-### Bug Fixes
-
-* **typescript-estree:** visit typeParameters in OptionalCallExpr ([#1377](https://github.com/typescript-eslint/typescript-eslint/issues/1377)) ([cba6a2a](https://github.com/typescript-eslint/typescript-eslint/commit/cba6a2a))
-
-
-### Features
-
-* add internal eslint plugin for repo-specific lint rules ([#1373](https://github.com/typescript-eslint/typescript-eslint/issues/1373)) ([3a15413](https://github.com/typescript-eslint/typescript-eslint/commit/3a15413))
-
-
-
-
-
-# [2.13.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.12.0...v2.13.0) (2019-12-23)
-
-
-### Bug Fixes
-
-* **typescript-estree:** correct type of key for base nodes ([#1367](https://github.com/typescript-eslint/typescript-eslint/issues/1367)) ([099225a](https://github.com/typescript-eslint/typescript-eslint/commit/099225a))
-
-
-### Features
-
-* **typescript-estree:** computed members discriminated unions ([#1349](https://github.com/typescript-eslint/typescript-eslint/issues/1349)) ([013df9a](https://github.com/typescript-eslint/typescript-eslint/commit/013df9a))
-* **typescript-estree:** tighten prop name and destructure types ([#1346](https://github.com/typescript-eslint/typescript-eslint/issues/1346)) ([f335c50](https://github.com/typescript-eslint/typescript-eslint/commit/f335c50))
-
-
-
-
-
-# [2.12.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.11.0...v2.12.0) (2019-12-16)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [2.11.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.10.0...v2.11.0) (2019-12-09)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [2.10.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.9.0...v2.10.0) (2019-12-02)
-
-
-### Bug Fixes
-
-* **eslint-plugin:** [no-unused-expressions] ignore directives ([#1285](https://github.com/typescript-eslint/typescript-eslint/issues/1285)) ([ce4c803](https://github.com/typescript-eslint/typescript-eslint/commit/ce4c803))
-* **typescript-estree:** make FunctionDeclaration.body non-null ([#1288](https://github.com/typescript-eslint/typescript-eslint/issues/1288)) ([dc73510](https://github.com/typescript-eslint/typescript-eslint/commit/dc73510))
-
-
-
-
-
-# [2.9.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.8.0...v2.9.0) (2019-11-25)
-
-
-### Bug Fixes
-
-* **typescript-estree:** fix synthetic default import ([#1245](https://github.com/typescript-eslint/typescript-eslint/issues/1245)) ([d97f809](https://github.com/typescript-eslint/typescript-eslint/commit/d97f809))
-
-
-### Features
-
-* **eslint-plugin:** add no-unused-vars-experimental ([#688](https://github.com/typescript-eslint/typescript-eslint/issues/688)) ([05ebea5](https://github.com/typescript-eslint/typescript-eslint/commit/05ebea5))
-
-
-
-
-
-# [2.8.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.7.0...v2.8.0) (2019-11-18)
-
-
-### Bug Fixes
-
-* **eslint-plugin:** [unified-signatures] crash: cannot read pro… ([#1096](https://github.com/typescript-eslint/typescript-eslint/issues/1096)) ([d1de3a7](https://github.com/typescript-eslint/typescript-eslint/commit/d1de3a7))
-* **typescript-estree:** correctly account for trailing slash in… ([#1205](https://github.com/typescript-eslint/typescript-eslint/issues/1205)) ([ba89168](https://github.com/typescript-eslint/typescript-eslint/commit/ba89168))
-* **typescript-estree:** options range loc being always true ([#704](https://github.com/typescript-eslint/typescript-eslint/issues/704)) ([db1aa18](https://github.com/typescript-eslint/typescript-eslint/commit/db1aa18))
-
-
-
-
-
-# [2.7.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.6.1...v2.7.0) (2019-11-11)
-
-
-### Bug Fixes
-
-* **typescript-estree:** hash code to reduce update frequency ([#1179](https://github.com/typescript-eslint/typescript-eslint/issues/1179)) ([96d1cc3](https://github.com/typescript-eslint/typescript-eslint/commit/96d1cc3))
-* **typescript-estree:** reduce bundle footprint of tsutils ([#1177](https://github.com/typescript-eslint/typescript-eslint/issues/1177)) ([c8fe515](https://github.com/typescript-eslint/typescript-eslint/commit/c8fe515))
-
-
-
-
-
-## [2.6.1](https://github.com/typescript-eslint/typescript-eslint/compare/v2.6.0...v2.6.1) (2019-11-04)
-
-
-### Bug Fixes
-
-* **typescript-estree:** don't use typescript's synthetic default ([#1156](https://github.com/typescript-eslint/typescript-eslint/issues/1156)) ([17c956e](https://github.com/typescript-eslint/typescript-eslint/commit/17c956e)), closes [#1153](https://github.com/typescript-eslint/typescript-eslint/issues/1153)
-* **typescript-estree:** fix filename handling for vue JSX + markdown ([#1127](https://github.com/typescript-eslint/typescript-eslint/issues/1127)) ([366518f](https://github.com/typescript-eslint/typescript-eslint/commit/366518f))
-* **typescript-estree:** improve comment parsing code ([#1120](https://github.com/typescript-eslint/typescript-eslint/issues/1120)) ([e54998d](https://github.com/typescript-eslint/typescript-eslint/commit/e54998d))
-
-
-
-
-
-# [2.6.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.5.0...v2.6.0) (2019-10-28)
-
-
-### Bug Fixes
-
-* **parser:** adds TTY check before logging the version mismatch warning ([#1121](https://github.com/typescript-eslint/typescript-eslint/issues/1121)) ([768ef63](https://github.com/typescript-eslint/typescript-eslint/commit/768ef63))
-* **typescript-estree:** better handle canonical paths ([#1111](https://github.com/typescript-eslint/typescript-eslint/issues/1111)) ([8dcbf4c](https://github.com/typescript-eslint/typescript-eslint/commit/8dcbf4c))
-* **typescript-estree:** correct parenthesized optional chain AST ([#1141](https://github.com/typescript-eslint/typescript-eslint/issues/1141)) ([5ae286e](https://github.com/typescript-eslint/typescript-eslint/commit/5ae286e))
-* **typescript-estree:** ensure parent pointers are set ([#1129](https://github.com/typescript-eslint/typescript-eslint/issues/1129)) ([d4703e1](https://github.com/typescript-eslint/typescript-eslint/commit/d4703e1))
-* **typescript-estree:** normalize paths to fix cache miss on windows ([#1128](https://github.com/typescript-eslint/typescript-eslint/issues/1128)) ([6d0f2ce](https://github.com/typescript-eslint/typescript-eslint/commit/6d0f2ce))
-
-
-### Features
-
-* **typescript-estree:** add support for declare class properties ([#1136](https://github.com/typescript-eslint/typescript-eslint/issues/1136)) ([1508670](https://github.com/typescript-eslint/typescript-eslint/commit/1508670))
-
-
-
-
-
-# [2.5.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.4.0...v2.5.0) (2019-10-21)
-
-
-### Bug Fixes
-
-* **typescript-estree:** correct semver check range ([#1109](https://github.com/typescript-eslint/typescript-eslint/issues/1109)) ([2fc9bd2](https://github.com/typescript-eslint/typescript-eslint/commit/2fc9bd2))
-* **typescript-estree:** handle running out of fs watchers ([#1088](https://github.com/typescript-eslint/typescript-eslint/issues/1088)) ([ec62747](https://github.com/typescript-eslint/typescript-eslint/commit/ec62747))
-* **typescript-estree:** parsing error for vue sfc ([#1083](https://github.com/typescript-eslint/typescript-eslint/issues/1083)) ([7a8cce6](https://github.com/typescript-eslint/typescript-eslint/commit/7a8cce6))
-* **typescript-estree:** remove now unneeded dep on chokidar ([088a691](https://github.com/typescript-eslint/typescript-eslint/commit/088a691))
-
-
-### Features
-
-* **typescript-estree:** support long running lint without watch ([#1106](https://github.com/typescript-eslint/typescript-eslint/issues/1106)) ([ed5564d](https://github.com/typescript-eslint/typescript-eslint/commit/ed5564d))
-
-
-
-
-
-# [2.4.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.3.3...v2.4.0) (2019-10-14)
-
-
-### Bug Fixes
-
-* support long running "watch" lint sessions ([#973](https://github.com/typescript-eslint/typescript-eslint/issues/973)) ([854620e](https://github.com/typescript-eslint/typescript-eslint/commit/854620e))
-
-
-### Features
-
-* **typescript-estree:** support for parsing 3.7 features ([#1045](https://github.com/typescript-eslint/typescript-eslint/issues/1045)) ([623febf](https://github.com/typescript-eslint/typescript-eslint/commit/623febf))
-
-
-
-
-
-## [2.3.3](https://github.com/typescript-eslint/typescript-eslint/compare/v2.3.2...v2.3.3) (2019-10-07)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-## [2.3.2](https://github.com/typescript-eslint/typescript-eslint/compare/v2.3.1...v2.3.2) (2019-09-30)
-
-
-### Bug Fixes
-
-* **typescript-estree:** correct ClassDeclarationBase type ([#1008](https://github.com/typescript-eslint/typescript-eslint/issues/1008)) ([8ce3a81](https://github.com/typescript-eslint/typescript-eslint/commit/8ce3a81))
-* **typescript-estree:** handle optional computed prop w/o type ([#1026](https://github.com/typescript-eslint/typescript-eslint/issues/1026)) ([95c13fe](https://github.com/typescript-eslint/typescript-eslint/commit/95c13fe))
-
-
-
-
-
-## [2.3.1](https://github.com/typescript-eslint/typescript-eslint/compare/v2.3.0...v2.3.1) (2019-09-23)
-
-
-### Bug Fixes
-
-* **typescript-estree:** parsing error for await in non-async func ([#988](https://github.com/typescript-eslint/typescript-eslint/issues/988)) ([19abbe0](https://github.com/typescript-eslint/typescript-eslint/commit/19abbe0))
-
-
-
-
-
-# [2.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.2.0...v2.3.0) (2019-09-16)
-
-
-### Bug Fixes
-
-* **typescript-estree:** ImportDeclaration.specifier to Literal ([#974](https://github.com/typescript-eslint/typescript-eslint/issues/974)) ([2bf8231](https://github.com/typescript-eslint/typescript-eslint/commit/2bf8231))
-
-
-
-
-
-# [2.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.1.0...v2.2.0) (2019-09-09)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [2.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v2.0.0...v2.1.0) (2019-09-02)
-
-
-### Bug Fixes
-
-* **eslint-plugin:** [unified-signatures] type comparison and exported nodes ([#839](https://github.com/typescript-eslint/typescript-eslint/issues/839)) ([580eceb](https://github.com/typescript-eslint/typescript-eslint/commit/580eceb))
-* **typescript-estree:** improve missing project file error msg ([#866](https://github.com/typescript-eslint/typescript-eslint/issues/866)) ([8f3b0a8](https://github.com/typescript-eslint/typescript-eslint/commit/8f3b0a8)), closes [#853](https://github.com/typescript-eslint/typescript-eslint/issues/853)
-
-
-### Features
-
-* **eslint-plugin:** [no-type-alias] support tuples ([#775](https://github.com/typescript-eslint/typescript-eslint/issues/775)) ([c68e033](https://github.com/typescript-eslint/typescript-eslint/commit/c68e033))
-* **typescript-estree:** Accept a glob pattern for `options.project` ([#806](https://github.com/typescript-eslint/typescript-eslint/issues/806)) ([9e5f21e](https://github.com/typescript-eslint/typescript-eslint/commit/9e5f21e))
-
-
-
-
-
-# [2.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.13.0...v2.0.0) (2019-08-13)
-
-
-* feat(eslint-plugin)!: change recommended config (#729) ([428567d](https://github.com/typescript-eslint/typescript-eslint/commit/428567d)), closes [#729](https://github.com/typescript-eslint/typescript-eslint/issues/729)
-* feat(typescript-estree)!: throw error on file not in project when `project` set (#760) ([3777b77](https://github.com/typescript-eslint/typescript-eslint/commit/3777b77)), closes [#760](https://github.com/typescript-eslint/typescript-eslint/issues/760)
-* feat(eslint-plugin)!: add rule `consistent-type-assertions` (#731) ([92e98de](https://github.com/typescript-eslint/typescript-eslint/commit/92e98de)), closes [#731](https://github.com/typescript-eslint/typescript-eslint/issues/731)
-
-
-### Bug Fixes
-
-* **typescript-estree:** fix `is` token typed as `Keyword ([#750](https://github.com/typescript-eslint/typescript-eslint/issues/750)) ([35dec52](https://github.com/typescript-eslint/typescript-eslint/commit/35dec52))
-* **typescript-estree:** jsx comment parsing ([#703](https://github.com/typescript-eslint/typescript-eslint/issues/703)) ([0cfc48e](https://github.com/typescript-eslint/typescript-eslint/commit/0cfc48e))
-
-
-### Features
-
-* explicitly support eslint v6 ([#645](https://github.com/typescript-eslint/typescript-eslint/issues/645)) ([34a7cf6](https://github.com/typescript-eslint/typescript-eslint/commit/34a7cf6))
-
-
-### BREAKING CHANGES
-
-* recommended config changes are considered breaking
-* by default we will now throw when a file is not in the `project` provided
-* Merges both no-angle-bracket-type-assertion and no-object-literal-type-assertion into one rule
-* Node 6 is no longer supported
-
-
-
-
-
-# [1.13.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.12.0...v1.13.0) (2019-07-21)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-
-
-
-
-# [1.12.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.11.0...v1.12.0) (2019-07-12)
-
-
-### Bug Fixes
-
-* **eslint-plugin:** handle `const;` ([#633](https://github.com/typescript-eslint/typescript-eslint/issues/633)) ([430d628](https://github.com/typescript-eslint/typescript-eslint/commit/430d628)), closes [#441](https://github.com/typescript-eslint/typescript-eslint/issues/441)
-* **typescript-estree:** fix `async` identifier token typed as `Keyword` ([#681](https://github.com/typescript-eslint/typescript-eslint/issues/681)) ([6de19d3](https://github.com/typescript-eslint/typescript-eslint/commit/6de19d3))
-
-
-### Features
-
-* **eslint-plugin:** added new rule prefer-readonly ([#555](https://github.com/typescript-eslint/typescript-eslint/issues/555)) ([76b89a5](https://github.com/typescript-eslint/typescript-eslint/commit/76b89a5))
-
-
-
-
-
-# [1.11.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.10.2...v1.11.0) (2019-06-23)
-
-
-### Bug Fixes
-
-* **typescript-estree:** fix more cases with double slash in JSX text ([#607](https://github.com/typescript-eslint/typescript-eslint/issues/607)) ([34cfa53](https://github.com/typescript-eslint/typescript-eslint/commit/34cfa53))
-
-
-
-
-
-## [1.10.2](https://github.com/typescript-eslint/typescript-eslint/compare/v1.10.1...v1.10.2) (2019-06-10)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-## [1.10.1](https://github.com/typescript-eslint/typescript-eslint/compare/v1.10.0...v1.10.1) (2019-06-09)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-# [1.10.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.9.0...v1.10.0) (2019-06-09)
-
-### Bug Fixes
-
-- **eslint-plugin:** [explicit-function-return-type] Fix obj setter prop ([8c8497c](https://github.com/typescript-eslint/typescript-eslint/commit/8c8497c)), closes [#525](https://github.com/typescript-eslint/typescript-eslint/issues/525)
-- **eslint-plugin:** [no-extra-parens] Fix crash default switch case crash ([5ec2b32](https://github.com/typescript-eslint/typescript-eslint/commit/5ec2b32)), closes [#509](https://github.com/typescript-eslint/typescript-eslint/issues/509)
-- **typescript-estree:** allow expressions in ExportDefaultDeclaration ([#593](https://github.com/typescript-eslint/typescript-eslint/issues/593)) ([861844d](https://github.com/typescript-eslint/typescript-eslint/commit/861844d))
-- **typescript-estree:** stop ignoring comments in JSX with generic ([#596](https://github.com/typescript-eslint/typescript-eslint/issues/596)) ([31d5bd4](https://github.com/typescript-eslint/typescript-eslint/commit/31d5bd4))
-
-### Features
-
-- make utils/TSESLint export typed classes instead of just types ([#526](https://github.com/typescript-eslint/typescript-eslint/issues/526)) ([370ac72](https://github.com/typescript-eslint/typescript-eslint/commit/370ac72))
-- support TypeScript versions >=3.2.1 <3.6.0 ([#597](https://github.com/typescript-eslint/typescript-eslint/issues/597)) ([5d2b962](https://github.com/typescript-eslint/typescript-eslint/commit/5d2b962))
-
-# [1.9.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.8.0...v1.9.0) (2019-05-12)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-# [1.8.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.7.0...v1.8.0) (2019-05-10)
-
-### Bug Fixes
-
-- **eslint-plugin:** [array-type] support readonly operator ([#429](https://github.com/typescript-eslint/typescript-eslint/issues/429)) ([8e2d2f5](https://github.com/typescript-eslint/typescript-eslint/commit/8e2d2f5))
-- **eslint-plugin:** Support more nodes [no-extra-parens](<[#465](https://github.com/typescript-eslint/typescript-eslint/issues/465)>) ([2d15644](https://github.com/typescript-eslint/typescript-eslint/commit/2d15644))
-- **typescript-estree:** ensure parents are defined during subsequent parses ([#500](https://github.com/typescript-eslint/typescript-eslint/issues/500)) ([665278f](https://github.com/typescript-eslint/typescript-eslint/commit/665278f))
-
-### Features
-
-- **eslint-plugin:** (EXPERIMENTAL) begin indent rewrite ([#439](https://github.com/typescript-eslint/typescript-eslint/issues/439)) ([6eb97d4](https://github.com/typescript-eslint/typescript-eslint/commit/6eb97d4))
-- **eslint-plugin:** no-inferrable-types: Support more primitives ([#442](https://github.com/typescript-eslint/typescript-eslint/issues/442)) ([4e193ca](https://github.com/typescript-eslint/typescript-eslint/commit/4e193ca))
-- **ts-estree:** add preserveNodeMaps option ([#494](https://github.com/typescript-eslint/typescript-eslint/issues/494)) ([c3061f9](https://github.com/typescript-eslint/typescript-eslint/commit/c3061f9))
-- Move shared types into their own package ([#425](https://github.com/typescript-eslint/typescript-eslint/issues/425)) ([a7a03ce](https://github.com/typescript-eslint/typescript-eslint/commit/a7a03ce))
-
-# [1.7.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.6.0...v1.7.0) (2019-04-20)
-
-### Features
-
-- **eslint-plugin:** support type assertions in no-extra-parens rule ([#311](https://github.com/typescript-eslint/typescript-eslint/issues/311)) ([116ca75](https://github.com/typescript-eslint/typescript-eslint/commit/116ca75))
-
-# [1.6.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.5.0...v1.6.0) (2019-04-03)
-
-### Bug Fixes
-
-- **typescript-estree:** add ExportDefaultDeclaration to union DeclarationStatement ([#378](https://github.com/typescript-eslint/typescript-eslint/issues/378)) ([bf04398](https://github.com/typescript-eslint/typescript-eslint/commit/bf04398))
-
-### Features
-
-- change TypeScript version range to >=3.2.1 <3.5.0 ([#399](https://github.com/typescript-eslint/typescript-eslint/issues/399)) ([a4f95d3](https://github.com/typescript-eslint/typescript-eslint/commit/a4f95d3))
-
-# [1.5.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.4.2...v1.5.0) (2019-03-20)
-
-### Bug Fixes
-
-- **eslint-plugin:** fix false positives for adjacent-overload-signatures regarding computed property names ([#340](https://github.com/typescript-eslint/typescript-eslint/issues/340)) ([f6e5118](https://github.com/typescript-eslint/typescript-eslint/commit/f6e5118))
-- **typescript-estree:** only call watch callback on new files ([#367](https://github.com/typescript-eslint/typescript-eslint/issues/367)) ([0ef07c4](https://github.com/typescript-eslint/typescript-eslint/commit/0ef07c4))
-
-## [1.4.2](https://github.com/typescript-eslint/typescript-eslint/compare/v1.4.1...v1.4.2) (2019-02-25)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-## [1.4.1](https://github.com/typescript-eslint/typescript-eslint/compare/v1.4.0...v1.4.1) (2019-02-23)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-# [1.4.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.3.0...v1.4.0) (2019-02-19)
-
-### Bug Fixes
-
-- **ts-estree:** make sure that every node can be converted to tsNode ([#287](https://github.com/typescript-eslint/typescript-eslint/issues/287)) ([9f1d314](https://github.com/typescript-eslint/typescript-eslint/commit/9f1d314))
-- **typescript-estree, eslint-plugin:** stop adding ParenthesizedExpressions to node maps ([#226](https://github.com/typescript-eslint/typescript-eslint/issues/226)) ([317405a](https://github.com/typescript-eslint/typescript-eslint/commit/317405a))
-
-### Features
-
-- **eslint-plugin:** add 'no-unnecessary-qualifier' rule ([#231](https://github.com/typescript-eslint/typescript-eslint/issues/231)) ([cc8f906](https://github.com/typescript-eslint/typescript-eslint/commit/cc8f906))
-- **eslint-plugin:** Migrate plugin to ts ([#120](https://github.com/typescript-eslint/typescript-eslint/issues/120)) ([61c60dc](https://github.com/typescript-eslint/typescript-eslint/commit/61c60dc))
-- **ts-estree:** fix parsing nested sequence expressions ([#286](https://github.com/typescript-eslint/typescript-eslint/issues/286)) ([ecc9631](https://github.com/typescript-eslint/typescript-eslint/commit/ecc9631))
-
-# [1.3.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.2.0...v1.3.0) (2019-02-07)
-
-### Bug Fixes
-
-- **ts-estree:** align typeArguments and typeParameters across nodes ([#223](https://github.com/typescript-eslint/typescript-eslint/issues/223)) ([3306198](https://github.com/typescript-eslint/typescript-eslint/commit/3306198))
-- **ts-estree:** convert decorators on var and fn decs ([#211](https://github.com/typescript-eslint/typescript-eslint/issues/211)) ([0a1777f](https://github.com/typescript-eslint/typescript-eslint/commit/0a1777f))
-- **ts-estree:** fix issues with typeParams in FunctionExpression ([#208](https://github.com/typescript-eslint/typescript-eslint/issues/208)) ([d4dfa3b](https://github.com/typescript-eslint/typescript-eslint/commit/d4dfa3b))
-
-### Features
-
-- change TypeScript version range to >=3.2.1 <3.4.0 ([#184](https://github.com/typescript-eslint/typescript-eslint/issues/184)) ([f513a14](https://github.com/typescript-eslint/typescript-eslint/commit/f513a14))
-- **ts-estree:** enable errors 1098 and 1099 ([#219](https://github.com/typescript-eslint/typescript-eslint/issues/219)) ([fc50167](https://github.com/typescript-eslint/typescript-eslint/commit/fc50167))
-
-# [1.2.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.1.1...v1.2.0) (2019-02-01)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
-
-## [1.1.1](https://github.com/typescript-eslint/typescript-eslint/compare/v1.1.0...v1.1.1) (2019-01-29)
-
-### Bug Fixes
-
-- **parser:** add visiting of type parameters in JSXOpeningElement ([#150](https://github.com/typescript-eslint/typescript-eslint/issues/150)) ([5e16003](https://github.com/typescript-eslint/typescript-eslint/commit/5e16003))
-- **ts-estree:** expand optional property to include question token ([#138](https://github.com/typescript-eslint/typescript-eslint/issues/138)) ([9068b62](https://github.com/typescript-eslint/typescript-eslint/commit/9068b62))
-
-### Performance Improvements
-
-- **ts-estree:** don't create Program in parse() ([#148](https://github.com/typescript-eslint/typescript-eslint/issues/148)) ([aacf5b0](https://github.com/typescript-eslint/typescript-eslint/commit/aacf5b0))
-
-# [1.1.0](https://github.com/typescript-eslint/typescript-eslint/compare/v1.0.0...v1.1.0) (2019-01-23)
-
-### Bug Fixes
-
-- **typescript-estree:** correct range of parameters with comments ([#128](https://github.com/typescript-eslint/typescript-eslint/issues/128)) ([91eedf2](https://github.com/typescript-eslint/typescript-eslint/commit/91eedf2))
-- **typescript-estree:** fix range of assignment in parameter ([#115](https://github.com/typescript-eslint/typescript-eslint/issues/115)) ([4e781f1](https://github.com/typescript-eslint/typescript-eslint/commit/4e781f1))
-
-# [1.0.0](https://github.com/typescript-eslint/typescript-eslint/compare/v0.2.1...v1.0.0) (2019-01-20)
-
-### Features
-
-- **parser:** support ecmaFeatures.jsx flag and tests ([#85](https://github.com/typescript-eslint/typescript-eslint/issues/85)) ([b321736](https://github.com/typescript-eslint/typescript-eslint/commit/b321736))
-
-## [0.2.1](https://github.com/typescript-eslint/typescript-eslint/compare/v0.2.0...v0.2.1) (2019-01-20)
-
-**Note:** Version bump only for package @typescript-eslint/typescript-estree
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/LICENSE b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/LICENSE
deleted file mode 100644
index fda3b75..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-TypeScript ESTree
-
-Originally extracted from:
-
-TypeScript ESLint Parser
-Copyright JS Foundation and other contributors, https://js.foundation
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-  * Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-  * Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/README.md b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/README.md
deleted file mode 100644
index 3a434c7..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/README.md
+++ /dev/null
@@ -1,287 +0,0 @@
-<h1 align="center">TypeScript ESTree</h1>
-
-<p align="center">A parser that converts TypeScript source code into an <a href="https://github.com/estree/estree">ESTree</a>-compatible form</p>
-
-<p align="center">
-    <img src="https://github.com/typescript-eslint/typescript-eslint/workflows/CI/badge.svg" alt="CI" />
-    <a href="https://www.npmjs.com/package/@typescript-eslint/typescript-estree"><img src="https://img.shields.io/npm/v/@typescript-eslint/typescript-estree.svg?style=flat-square" alt="NPM Version" /></a>
-    <a href="https://www.npmjs.com/package/@typescript-eslint/typescript-estree"><img src="https://img.shields.io/npm/dm/@typescript-eslint/typescript-estree.svg?style=flat-square" alt="NPM Downloads" /></a>
-</p>
-
-## Getting Started
-
-**[You can find our Getting Started docs here](../../docs/getting-started/linting/README.md)**
-
-## About
-
-This parser is somewhat generic and robust, and could be used to power any use-case which requires taking TypeScript source code and producing an ESTree-compatible AST.
-
-In fact, it is already used within these hyper-popular open-source projects to power their TypeScript support:
-
-- [ESLint](https://eslint.org), the pluggable linting utility for JavaScript and JSX
-- [Prettier](https://prettier.io), an opinionated code formatter
-
-## Installation
-
-```sh
-yarn add -D @typescript-eslint/typescript-estree
-```
-
-## API
-
-### Parsing
-
-#### `parse(code, options)`
-
-Parses the given string of code with the options provided and returns an ESTree-compatible AST.
-
-```ts
-interface ParseOptions {
-  /**
-   * create a top-level comments array containing all comments
-   */
-  comment?: boolean;
-
-  /**
-   * An array of modules to turn explicit debugging on for.
-   * - 'typescript-eslint' is the same as setting the env var `DEBUG=typescript-eslint:*`
-   * - 'eslint' is the same as setting the env var `DEBUG=eslint:*`
-   * - 'typescript' is the same as setting `extendedDiagnostics: true` in your tsconfig compilerOptions
-   *
-   * For convenience, also supports a boolean:
-   * - true === ['typescript-eslint']
-   * - false === []
-   */
-  debugLevel?: boolean | ('typescript-eslint' | 'eslint' | 'typescript')[];
-
-  /**
-   * Cause the parser to error if it encounters an unknown AST node type (useful for testing).
-   * This case only usually occurs when TypeScript releases new features.
-   */
-  errorOnUnknownASTType?: boolean;
-
-  /**
-   * Absolute (or relative to `cwd`) path to the file being parsed.
-   */
-  filePath?: string;
-
-  /**
-   * Enable parsing of JSX.
-   * For more details, see https://www.typescriptlang.org/docs/handbook/jsx.html
-   *
-   * NOTE: this setting does not effect known file types (.js, .jsx, .ts, .tsx, .json) because the
-   * TypeScript compiler has its own internal handling for known file extensions.
-   *
-   * For the exact behavior, see https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/parser#parseroptionsecmafeaturesjsx
-   */
-  jsx?: boolean;
-
-  /**
-   * Controls whether the `loc` information to each node.
-   * The `loc` property is an object which contains the exact line/column the node starts/ends on.
-   * This is similar to the `range` property, except it is line/column relative.
-   */
-  loc?: boolean;
-
-  /*
-   * Allows overriding of function used for logging.
-   * When value is `false`, no logging will occur.
-   * When value is not provided, `console.log()` will be used.
-   */
-  loggerFn?: Function | false;
-
-  /**
-   * Controls whether the `range` property is included on AST nodes.
-   * The `range` property is a [number, number] which indicates the start/end index of the node in the file contents.
-   * This is similar to the `loc` property, except this is the absolute index.
-   */
-  range?: boolean;
-
-  /**
-   * Set to true to create a top-level array containing all tokens from the file.
-   */
-  tokens?: boolean;
-
-  /*
-   * The JSX AST changed the node type for string literals
-   * inside a JSX Element from `Literal` to `JSXText`.
-   * When value is `true`, these nodes will be parsed as type `JSXText`.
-   * When value is `false`, these nodes will be parsed as type `Literal`.
-   */
-  useJSXTextNode?: boolean;
-}
-
-const PARSE_DEFAULT_OPTIONS: ParseOptions = {
-  comment: false,
-  errorOnUnknownASTType: false,
-  filePath: 'estree.ts', // or 'estree.tsx', if you pass jsx: true
-  jsx: false,
-  loc: false,
-  loggerFn: undefined,
-  range: false,
-  tokens: false,
-  useJSXTextNode: false,
-};
-
-declare function parse(
-  code: string,
-  options: ParseOptions = PARSE_DEFAULT_OPTIONS,
-): TSESTree.Program;
-```
-
-Example usage:
-
-```js
-import { parse } from '@typescript-eslint/typescript-estree';
-
-const code = `const hello: string = 'world';`;
-const ast = parse(code, {
-  loc: true,
-  range: true,
-});
-```
-
-#### `parseAndGenerateServices(code, options)`
-
-Parses the given string of code with the options provided and returns an ESTree-compatible AST. Accepts additional options which can be used to generate type information along with the AST.
-
-```ts
-interface ParseAndGenerateServicesOptions extends ParseOptions {
-  /**
-   * Causes the parser to error if the TypeScript compiler returns any unexpected syntax/semantic errors.
-   */
-  errorOnTypeScriptSyntacticAndSemanticIssues?: boolean;
-
-  /**
-   * When `project` is provided, this controls the non-standard file extensions which will be parsed.
-   * It accepts an array of file extensions, each preceded by a `.`.
-   */
-  extraFileExtensions?: string[];
-
-  /**
-   * Absolute (or relative to `tsconfigRootDir`) path to the file being parsed.
-   * When `project` is provided, this is required, as it is used to fetch the file from the TypeScript compiler's cache.
-   */
-  filePath?: string;
-
-  /**
-   * Allows the user to control whether or not two-way AST node maps are preserved
-   * during the AST conversion process.
-   *
-   * By default: the AST node maps are NOT preserved, unless `project` has been specified,
-   * in which case the maps are made available on the returned `parserServices`.
-   *
-   * NOTE: If `preserveNodeMaps` is explicitly set by the user, it will be respected,
-   * regardless of whether or not `project` is in use.
-   */
-  preserveNodeMaps?: boolean;
-
-  /**
-   * Absolute (or relative to `tsconfigRootDir`) paths to the tsconfig(s).
-   * If this is provided, type information will be returned.
-   */
-  project?: string | string[];
-
-  /**
-   * If you provide a glob (or globs) to the project option, you can use this option to ignore certain folders from
-   * being matched by the globs.
-   * This accepts an array of globs to ignore.
-   *
-   * By default, this is set to ["/node_modules/"]
-   */
-  projectFolderIgnoreList?: string[];
-
-  /**
-   * The absolute path to the root directory for all provided `project`s.
-   */
-  tsconfigRootDir?: string;
-
-  /**
-   ***************************************************************************************
-   * IT IS RECOMMENDED THAT YOU DO NOT USE THIS OPTION, AS IT CAUSES PERFORMANCE ISSUES. *
-   ***************************************************************************************
-   *
-   * When passed with `project`, this allows the parser to create a catch-all, default program.
-   * This means that if the parser encounters a file not included in any of the provided `project`s,
-   * it will not error, but will instead parse the file and its dependencies in a new program.
-   */
-  createDefaultProgram?: boolean;
-}
-
-const PARSE_AND_GENERATE_SERVICES_DEFAULT_OPTIONS: ParseOptions = {
-  ...PARSE_DEFAULT_OPTIONS,
-  errorOnTypeScriptSyntacticAndSemanticIssues: false,
-  extraFileExtensions: [],
-  preserveNodeMaps: false, // or true, if you do not set this, but pass `project`
-  project: undefined,
-  projectFolderIgnoreList: ['/node_modules/'],
-  tsconfigRootDir: process.cwd(),
-};
-
-declare function parseAndGenerateServices(
-  code: string,
-  options: ParseOptions = PARSE_DEFAULT_OPTIONS,
-): TSESTree.Program;
-```
-
-Example usage:
-
-```js
-import { parseAndGenerateServices } from '@typescript-eslint/typescript-estree';
-
-const code = `const hello: string = 'world';`;
-const ast = parseAndGenerateServices(code, {
-  filePath: '/some/path/to/file/foo.ts',
-  loc: true,
-  project: './tsconfig.json',
-  range: true,
-});
-```
-
-### `TSESTree`, `AST_NODE_TYPES` and `AST_TOKEN_TYPES`
-
-Types for the AST produced by the parse functions.
-
-- `TSESTree` is a namespace which contains object types representing all of the AST Nodes produced by the parser.
-- `AST_NODE_TYPES` is an enum which provides the values for every single AST node's `type` property.
-- `AST_TOKEN_TYPES` is an enum which provides the values for every single AST token's `type` property.
-
-## Supported TypeScript Version
-
-See the [Supported TypeScript Version](../../README.md#supported-typescript-version) section in the project root.
-
-If you use a non-supported version of TypeScript, the parser will log a warning to the console.
-
-**Please ensure that you are using a supported version before submitting any issues/bug reports.**
-
-## Reporting Issues
-
-Please check the current list of open and known issues and ensure the issue has not been reported before. When creating a new issue provide as much information about your environment as possible. This includes:
-
-- TypeScript version
-- The `typescript-estree` version
-
-## AST Alignment Tests
-
-A couple of years after work on this parser began, the TypeScript Team at Microsoft began [officially supporting TypeScript parsing via Babel](https://blogs.msdn.microsoft.com/typescript/2018/08/27/typescript-and-babel-7/).
-
-I work closely with the TypeScript Team and we are gradually aligning the AST of this project with the one produced by Babel's parser. To that end, I have created a full test harness to compare the ASTs of the two projects which runs on every PR, please see the code for more details.
-
-## Build/Test Commands
-
-- `npm test` - run all tests
-- `npm run unit-tests` - run only unit tests
-- `npm run ast-alignment-tests` - run only Babylon AST alignment tests
-
-## Debugging
-
-If you encounter a bug with the parser that you want to investigate, you can turn on the debug logging via setting the environment variable: `DEBUG=typescript-eslint:*`.
-I.e. in this repo you can run: `DEBUG=typescript-eslint:* yarn lint`.
-
-## License
-
-TypeScript ESTree inherits from the the original TypeScript ESLint Parser license, as the majority of the work began there. It is licensed under a permissive BSD 2-clause license.
-
-## Contributing
-
-[See the contributing guide here](../../CONTRIBUTING.md)
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts
deleted file mode 100644
index 61bc2f1..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { SourceFile } from 'typescript';
-import { ASTMaps } from './convert';
-import { Extra } from './parser-options';
-import { TSESTree } from './ts-estree';
-export declare function astConverter(ast: SourceFile, extra: Extra, shouldPreserveNodeMaps: boolean): {
-    estree: TSESTree.Program;
-    astMaps: ASTMaps;
-};
-//# sourceMappingURL=ast-converter.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts.map
deleted file mode 100644
index df6276c..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ast-converter.d.ts","sourceRoot":"","sources":["../src/ast-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAA2B,OAAO,EAAE,MAAM,WAAW,CAAC;AAG7D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,wBAAgB,YAAY,CAC1B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,KAAK,EACZ,sBAAsB,EAAE,OAAO,GAC9B;IAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA4DhD"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js
deleted file mode 100644
index 6af960e..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js
+++ /dev/null
@@ -1,63 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.astConverter = void 0;
-const convert_1 = require("./convert");
-const convert_comments_1 = require("./convert-comments");
-const node_utils_1 = require("./node-utils");
-const simple_traverse_1 = require("./simple-traverse");
-function astConverter(ast, extra, shouldPreserveNodeMaps) {
-    /**
-     * The TypeScript compiler produced fundamental parse errors when parsing the
-     * source.
-     */
-    // internal typescript api...
-    // eslint-disable-next-line @typescript-eslint/no-explicit-any
-    const parseDiagnostics = ast.parseDiagnostics;
-    if (parseDiagnostics.length) {
-        throw convert_1.convertError(parseDiagnostics[0]);
-    }
-    /**
-     * Recursively convert the TypeScript AST into an ESTree-compatible AST
-     */
-    const instance = new convert_1.Converter(ast, {
-        errorOnUnknownASTType: extra.errorOnUnknownASTType || false,
-        useJSXTextNode: extra.useJSXTextNode || false,
-        shouldPreserveNodeMaps,
-    });
-    const estree = instance.convertProgram();
-    /**
-     * Optionally remove range and loc if specified
-     */
-    if (!extra.range || !extra.loc) {
-        simple_traverse_1.simpleTraverse(estree, {
-            enter: node => {
-                if (!extra.range) {
-                    // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- TS 4.0 made this an error because the types aren't optional
-                    // @ts-expect-error
-                    delete node.range;
-                }
-                if (!extra.loc) {
-                    // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- TS 4.0 made this an error because the types aren't optional
-                    // @ts-expect-error
-                    delete node.loc;
-                }
-            },
-        });
-    }
-    /**
-     * Optionally convert and include all tokens in the AST
-     */
-    if (extra.tokens) {
-        estree.tokens = node_utils_1.convertTokens(ast);
-    }
-    /**
-     * Optionally convert and include all comments in the AST
-     */
-    if (extra.comment) {
-        estree.comments = convert_comments_1.convertComments(ast, extra.code);
-    }
-    const astMaps = instance.getASTMaps();
-    return { estree, astMaps };
-}
-exports.astConverter = astConverter;
-//# sourceMappingURL=ast-converter.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js.map
deleted file mode 100644
index 6a5b215..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ast-converter.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ast-converter.js","sourceRoot":"","sources":["../src/ast-converter.ts"],"names":[],"mappings":";;;AACA,uCAA6D;AAC7D,yDAAqD;AACrD,6CAA6C;AAG7C,uDAAmD;AAEnD,SAAgB,YAAY,CAC1B,GAAe,EACf,KAAY,EACZ,sBAA+B;IAE/B;;;OAGG;IACH,6BAA6B;IAC7B,8DAA8D;IAC9D,MAAM,gBAAgB,GAAI,GAAW,CAAC,gBAAgB,CAAC;IACvD,IAAI,gBAAgB,CAAC,MAAM,EAAE;QAC3B,MAAM,sBAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;KACzC;IAED;;OAEG;IACH,MAAM,QAAQ,GAAG,IAAI,mBAAS,CAAC,GAAG,EAAE;QAClC,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,IAAI,KAAK;QAC3D,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,KAAK;QAC7C,sBAAsB;KACvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IAEzC;;OAEG;IACH,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;QAC9B,gCAAc,CAAC,MAAM,EAAE;YACrB,KAAK,EAAE,IAAI,CAAC,EAAE;gBACZ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;oBAChB,4HAA4H;oBAC5H,mBAAmB;oBACnB,OAAO,IAAI,CAAC,KAAK,CAAC;iBACnB;gBACD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;oBACd,4HAA4H;oBAC5H,mBAAmB;oBACnB,OAAO,IAAI,CAAC,GAAG,CAAC;iBACjB;YACH,CAAC;SACF,CAAC,CAAC;KACJ;IAED;;OAEG;IACH,IAAI,KAAK,CAAC,MAAM,EAAE;QAChB,MAAM,CAAC,MAAM,GAAG,0BAAa,CAAC,GAAG,CAAC,CAAC;KACpC;IAED;;OAEG;IACH,IAAI,KAAK,CAAC,OAAO,EAAE;QACjB,MAAM,CAAC,QAAQ,GAAG,kCAAe,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;KACpD;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;IAEtC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAhED,oCAgEC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.d.ts
deleted file mode 100644
index 3f081e6..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as ts from 'typescript';
-import { TSESTree } from './ts-estree';
-/**
- * Convert all comments for the given AST.
- * @param ast the AST object
- * @param code the TypeScript code
- * @returns the converted ESTreeComment
- * @private
- */
-export declare function convertComments(ast: ts.SourceFile, code: string): TSESTree.Comment[];
-//# sourceMappingURL=convert-comments.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.d.ts.map
deleted file mode 100644
index e3e8a04..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"convert-comments.d.ts","sourceRoot":"","sources":["../src/convert-comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAGjC,OAAO,EAAmB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAExD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,EAAE,CAAC,UAAU,EAClB,IAAI,EAAE,MAAM,GACX,QAAQ,CAAC,OAAO,EAAE,CAgCpB"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js
deleted file mode 100644
index de4a735..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js
+++ /dev/null
@@ -1,59 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.convertComments = void 0;
-const ts = __importStar(require("typescript"));
-const util_1 = require("tsutils/util/util");
-const node_utils_1 = require("./node-utils");
-const ts_estree_1 = require("./ts-estree");
-/**
- * Convert all comments for the given AST.
- * @param ast the AST object
- * @param code the TypeScript code
- * @returns the converted ESTreeComment
- * @private
- */
-function convertComments(ast, code) {
-    const comments = [];
-    util_1.forEachComment(ast, (_, comment) => {
-        const type = comment.kind == ts.SyntaxKind.SingleLineCommentTrivia
-            ? ts_estree_1.AST_TOKEN_TYPES.Line
-            : ts_estree_1.AST_TOKEN_TYPES.Block;
-        const range = [comment.pos, comment.end];
-        const loc = node_utils_1.getLocFor(range[0], range[1], ast);
-        // both comments start with 2 characters - /* or //
-        const textStart = range[0] + 2;
-        const textEnd = comment.kind === ts.SyntaxKind.SingleLineCommentTrivia
-            ? // single line comments end at the end
-                range[1] - textStart
-            : // multiline comments end 2 characters early
-                range[1] - textStart - 2;
-        comments.push({
-            type,
-            value: code.substr(textStart, textEnd),
-            range,
-            loc,
-        });
-    }, ast);
-    return comments;
-}
-exports.convertComments = convertComments;
-//# sourceMappingURL=convert-comments.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js.map
deleted file mode 100644
index 6952a58..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert-comments.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"convert-comments.js","sourceRoot":"","sources":["../src/convert-comments.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,4CAAmD;AACnD,6CAAyC;AACzC,2CAAwD;AAExD;;;;;;GAMG;AACH,SAAgB,eAAe,CAC7B,GAAkB,EAClB,IAAY;IAEZ,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,qBAAc,CACZ,GAAG,EACH,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;QACb,MAAM,IAAI,GACR,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAuB;YACnD,CAAC,CAAC,2BAAe,CAAC,IAAI;YACtB,CAAC,CAAC,2BAAe,CAAC,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,sBAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAE/C,mDAAmD;QACnD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,OAAO,GACX,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;YACpD,CAAC,CAAC,sCAAsC;gBACtC,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS;YACtB,CAAC,CAAC,4CAA4C;gBAC5C,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;YACtC,KAAK;YACL,GAAG;SACJ,CAAC,CAAC;IACL,CAAC,EACD,GAAG,CACJ,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAnCD,0CAmCC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts
deleted file mode 100644
index c065e15..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts
+++ /dev/null
@@ -1,152 +0,0 @@
-import * as ts from 'typescript';
-import { TSError } from './node-utils';
-import { ParserWeakMap, ParserWeakMapESTreeToTSNode } from './parser-options';
-import { TSESTree, TSNode } from './ts-estree';
-interface ConverterOptions {
-    errorOnUnknownASTType: boolean;
-    useJSXTextNode: boolean;
-    shouldPreserveNodeMaps: boolean;
-}
-/**
- * Extends and formats a given error object
- * @param error the error object
- * @returns converted error object
- */
-export declare function convertError(error: any): TSError;
-export interface ASTMaps {
-    esTreeNodeToTSNodeMap: ParserWeakMapESTreeToTSNode;
-    tsNodeToESTreeNodeMap: ParserWeakMap<TSNode, TSESTree.Node>;
-}
-export declare class Converter {
-    private readonly ast;
-    private readonly options;
-    private readonly esTreeNodeToTSNodeMap;
-    private readonly tsNodeToESTreeNodeMap;
-    private allowPattern;
-    private inTypeMode;
-    /**
-     * Converts a TypeScript node into an ESTree node
-     * @param ast the full TypeScript AST
-     * @param options additional options for the conversion
-     * @returns the converted ESTreeNode
-     */
-    constructor(ast: ts.SourceFile, options: ConverterOptions);
-    getASTMaps(): ASTMaps;
-    convertProgram(): TSESTree.Program;
-    /**
-     * Converts a TypeScript node into an ESTree node.
-     * @param node the child ts.Node
-     * @param parent parentNode
-     * @param inTypeMode flag to determine if we are in typeMode
-     * @param allowPattern flag to determine if patterns are allowed
-     * @returns the converted ESTree node
-     */
-    private converter;
-    /**
-     * Fixes the exports of the given ts.Node
-     * @param node the ts.Node
-     * @param result result
-     * @returns the ESTreeNode with fixed exports
-     */
-    private fixExports;
-    /**
-     * Register specific TypeScript node into map with first ESTree node provided
-     */
-    private registerTSNodeInNodeMap;
-    /**
-     * Converts a TypeScript node into an ESTree node.
-     * @param child the child ts.Node
-     * @param parent parentNode
-     * @returns the converted ESTree node
-     */
-    private convertPattern;
-    /**
-     * Converts a TypeScript node into an ESTree node.
-     * @param child the child ts.Node
-     * @param parent parentNode
-     * @returns the converted ESTree node
-     */
-    private convertChild;
-    /**
-     * Converts a TypeScript node into an ESTree node.
-     * @param child the child ts.Node
-     * @param parent parentNode
-     * @returns the converted ESTree node
-     */
-    private convertType;
-    private createNode;
-    private convertBindingNameWithTypeAnnotation;
-    /**
-     * Converts a child into a type annotation. This creates an intermediary
-     * TypeAnnotation node to match what Flow does.
-     * @param child The TypeScript AST node to convert.
-     * @param parent parentNode
-     * @returns The type annotation node.
-     */
-    private convertTypeAnnotation;
-    /**
-     * Coverts body Nodes and add a directive field to StringLiterals
-     * @param nodes of ts.Node
-     * @param parent parentNode
-     * @returns Array of body statements
-     */
-    private convertBodyExpressions;
-    /**
-     * Converts a ts.Node's typeArguments to TSTypeParameterInstantiation node
-     * @param typeArguments ts.NodeArray typeArguments
-     * @param node parent used to create this node
-     * @returns TypeParameterInstantiation node
-     */
-    private convertTypeArgumentsToTypeParameters;
-    /**
-     * Converts a ts.Node's typeParameters to TSTypeParameterDeclaration node
-     * @param typeParameters ts.Node typeParameters
-     * @returns TypeParameterDeclaration node
-     */
-    private convertTSTypeParametersToTypeParametersDeclaration;
-    /**
-     * Converts an array of ts.Node parameters into an array of ESTreeNode params
-     * @param parameters An array of ts.Node params to be converted
-     * @returns an array of converted ESTreeNode params
-     */
-    private convertParameters;
-    private convertChainExpression;
-    /**
-     * For nodes that are copied directly from the TypeScript AST into
-     * ESTree mostly as-is. The only difference is the addition of a type
-     * property instead of a kind property. Recursively copies all children.
-     */
-    private deeplyCopy;
-    /**
-     * Converts a TypeScript JSX node.tagName into an ESTree node.name
-     * @param node the tagName object from a JSX ts.Node
-     * @param parent
-     * @returns the converted ESTree name object
-     */
-    private convertJSXTagName;
-    /**
-     * Applies the given TS modifiers to the given result object.
-     * @param result
-     * @param modifiers original ts.Nodes from the node.modifiers array
-     * @returns the current result object will be mutated
-     * @deprecated This method adds not standardized `modifiers` property in nodes
-     */
-    private applyModifiersToResult;
-    /**
-     * Uses the provided range location to adjust the location data of the given Node
-     * @param result The node that will have its location data mutated
-     * @param childRange The child node range used to expand location
-     */
-    private fixParentLocation;
-    /**
-     * Converts a TypeScript node into an ESTree node.
-     * The core of the conversion logic:
-     * Identify and convert each relevant TypeScript SyntaxKind
-     * @param node the child ts.Node
-     * @param parent parentNode
-     * @returns the converted ESTree node
-     */
-    private convertNode;
-}
-export {};
-//# sourceMappingURL=convert.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts.map
deleted file mode 100644
index c1f6816..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAkBL,OAAO,EAGR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAEL,QAAQ,EACR,MAAM,EAEP,MAAM,aAAa,CAAC;AAKrB,UAAU,gBAAgB;IACxB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAMhD;AAED,MAAM,WAAW,OAAO;IACtB,qBAAqB,EAAE,2BAA2B,CAAC;IACnD,qBAAqB,EAAE,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAiB;IACvD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAiB;IAEvD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;OAKG;gBACS,GAAG,EAAE,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,gBAAgB;IAKzD,UAAU,IAAI,OAAO;IAOrB,cAAc,IAAI,QAAQ,CAAC,OAAO;IAIlC;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;IAkCjB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAyDlB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAItB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAIpB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,oCAAoC;IAe5C;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAqB7B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IA8B9B;;;;;OAKG;IACH,OAAO,CAAC,oCAAoC;IAa5C;;;;OAIG;IACH,OAAO,CAAC,kDAAkD;IAe1D;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,sBAAsB;IA4C9B;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAmElB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA2CzB;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IAkD9B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAczB;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;CA8iEpB"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert.js
deleted file mode 100644
index e45592f..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert.js
+++ /dev/null
@@ -1,2206 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Converter = exports.convertError = void 0;
-// There's lots of funny stuff due to the typing of ts.Node
-/* eslint-disable @typescript-eslint/no-explicit-any */
-const ts = __importStar(require("typescript"));
-const node_utils_1 = require("./node-utils");
-const ts_estree_1 = require("./ts-estree");
-const version_check_1 = require("./version-check");
-const SyntaxKind = ts.SyntaxKind;
-/**
- * Extends and formats a given error object
- * @param error the error object
- * @returns converted error object
- */
-function convertError(error) {
-    return node_utils_1.createError(error.file, error.start, error.message || error.messageText);
-}
-exports.convertError = convertError;
-class Converter {
-    /**
-     * Converts a TypeScript node into an ESTree node
-     * @param ast the full TypeScript AST
-     * @param options additional options for the conversion
-     * @returns the converted ESTreeNode
-     */
-    constructor(ast, options) {
-        this.esTreeNodeToTSNodeMap = new WeakMap();
-        this.tsNodeToESTreeNodeMap = new WeakMap();
-        this.allowPattern = false;
-        this.inTypeMode = false;
-        this.ast = ast;
-        this.options = Object.assign({}, options);
-    }
-    getASTMaps() {
-        return {
-            esTreeNodeToTSNodeMap: this.esTreeNodeToTSNodeMap,
-            tsNodeToESTreeNodeMap: this.tsNodeToESTreeNodeMap,
-        };
-    }
-    convertProgram() {
-        return this.converter(this.ast);
-    }
-    /**
-     * Converts a TypeScript node into an ESTree node.
-     * @param node the child ts.Node
-     * @param parent parentNode
-     * @param inTypeMode flag to determine if we are in typeMode
-     * @param allowPattern flag to determine if patterns are allowed
-     * @returns the converted ESTree node
-     */
-    converter(node, parent, inTypeMode, allowPattern) {
-        /**
-         * Exit early for null and undefined
-         */
-        if (!node) {
-            return null;
-        }
-        const typeMode = this.inTypeMode;
-        const pattern = this.allowPattern;
-        if (inTypeMode !== undefined) {
-            this.inTypeMode = inTypeMode;
-        }
-        if (allowPattern !== undefined) {
-            this.allowPattern = allowPattern;
-        }
-        const result = this.convertNode(node, (parent !== null && parent !== void 0 ? parent : node.parent));
-        this.registerTSNodeInNodeMap(node, result);
-        this.inTypeMode = typeMode;
-        this.allowPattern = pattern;
-        return result;
-    }
-    /**
-     * Fixes the exports of the given ts.Node
-     * @param node the ts.Node
-     * @param result result
-     * @returns the ESTreeNode with fixed exports
-     */
-    fixExports(node, result) {
-        // check for exports
-        if (node.modifiers && node.modifiers[0].kind === SyntaxKind.ExportKeyword) {
-            /**
-             * Make sure that original node is registered instead of export
-             */
-            this.registerTSNodeInNodeMap(node, result);
-            const exportKeyword = node.modifiers[0];
-            const nextModifier = node.modifiers[1];
-            const declarationIsDefault = nextModifier && nextModifier.kind === SyntaxKind.DefaultKeyword;
-            const varToken = declarationIsDefault
-                ? node_utils_1.findNextToken(nextModifier, this.ast, this.ast)
-                : node_utils_1.findNextToken(exportKeyword, this.ast, this.ast);
-            result.range[0] = varToken.getStart(this.ast);
-            result.loc = node_utils_1.getLocFor(result.range[0], result.range[1], this.ast);
-            if (declarationIsDefault) {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ExportDefaultDeclaration,
-                    declaration: result,
-                    range: [exportKeyword.getStart(this.ast), result.range[1]],
-                    exportKind: 'value',
-                });
-            }
-            else {
-                const isType = result.type === ts_estree_1.AST_NODE_TYPES.TSInterfaceDeclaration ||
-                    result.type === ts_estree_1.AST_NODE_TYPES.TSTypeAliasDeclaration;
-                const isDeclare = result.declare === true;
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ExportNamedDeclaration,
-                    declaration: result,
-                    specifiers: [],
-                    source: null,
-                    exportKind: isType || isDeclare ? 'type' : 'value',
-                    range: [exportKeyword.getStart(this.ast), result.range[1]],
-                });
-            }
-        }
-        return result;
-    }
-    /**
-     * Register specific TypeScript node into map with first ESTree node provided
-     */
-    registerTSNodeInNodeMap(node, result) {
-        if (result && this.options.shouldPreserveNodeMaps) {
-            if (!this.tsNodeToESTreeNodeMap.has(node)) {
-                this.tsNodeToESTreeNodeMap.set(node, result);
-            }
-        }
-    }
-    /**
-     * Converts a TypeScript node into an ESTree node.
-     * @param child the child ts.Node
-     * @param parent parentNode
-     * @returns the converted ESTree node
-     */
-    convertPattern(child, parent) {
-        return this.converter(child, parent, this.inTypeMode, true);
-    }
-    /**
-     * Converts a TypeScript node into an ESTree node.
-     * @param child the child ts.Node
-     * @param parent parentNode
-     * @returns the converted ESTree node
-     */
-    convertChild(child, parent) {
-        return this.converter(child, parent, this.inTypeMode, false);
-    }
-    /**
-     * Converts a TypeScript node into an ESTree node.
-     * @param child the child ts.Node
-     * @param parent parentNode
-     * @returns the converted ESTree node
-     */
-    convertType(child, parent) {
-        return this.converter(child, parent, true, false);
-    }
-    createNode(node, data) {
-        const result = data;
-        if (!result.range) {
-            result.range = node_utils_1.getRange(
-            // this is completely valid, but TS hates it
-            node, this.ast);
-        }
-        if (!result.loc) {
-            result.loc = node_utils_1.getLocFor(result.range[0], result.range[1], this.ast);
-        }
-        if (result && this.options.shouldPreserveNodeMaps) {
-            this.esTreeNodeToTSNodeMap.set(result, node);
-        }
-        return result;
-    }
-    convertBindingNameWithTypeAnnotation(name, tsType, parent) {
-        const id = this.convertPattern(name);
-        if (tsType) {
-            id.typeAnnotation = this.convertTypeAnnotation(tsType, parent);
-            this.fixParentLocation(id, id.typeAnnotation.range);
-        }
-        return id;
-    }
-    /**
-     * Converts a child into a type annotation. This creates an intermediary
-     * TypeAnnotation node to match what Flow does.
-     * @param child The TypeScript AST node to convert.
-     * @param parent parentNode
-     * @returns The type annotation node.
-     */
-    convertTypeAnnotation(child, parent) {
-        // in FunctionType and ConstructorType typeAnnotation has 2 characters `=>` and in other places is just colon
-        const offset = (parent === null || parent === void 0 ? void 0 : parent.kind) === SyntaxKind.FunctionType ||
-            (parent === null || parent === void 0 ? void 0 : parent.kind) === SyntaxKind.ConstructorType
-            ? 2
-            : 1;
-        const annotationStartCol = child.getFullStart() - offset;
-        const loc = node_utils_1.getLocFor(annotationStartCol, child.end, this.ast);
-        return {
-            type: ts_estree_1.AST_NODE_TYPES.TSTypeAnnotation,
-            loc,
-            range: [annotationStartCol, child.end],
-            typeAnnotation: this.convertType(child),
-        };
-    }
-    /**
-     * Coverts body Nodes and add a directive field to StringLiterals
-     * @param nodes of ts.Node
-     * @param parent parentNode
-     * @returns Array of body statements
-     */
-    convertBodyExpressions(nodes, parent) {
-        let allowDirectives = node_utils_1.canContainDirective(parent);
-        return (nodes
-            .map(statement => {
-            const child = this.convertChild(statement);
-            if (allowDirectives) {
-                if ((child === null || child === void 0 ? void 0 : child.expression) &&
-                    ts.isExpressionStatement(statement) &&
-                    ts.isStringLiteral(statement.expression)) {
-                    const raw = child.expression.raw;
-                    child.directive = raw.slice(1, -1);
-                    return child; // child can be null, but it's filtered below
-                }
-                else {
-                    allowDirectives = false;
-                }
-            }
-            return child; // child can be null, but it's filtered below
-        })
-            // filter out unknown nodes for now
-            .filter(statement => statement));
-    }
-    /**
-     * Converts a ts.Node's typeArguments to TSTypeParameterInstantiation node
-     * @param typeArguments ts.NodeArray typeArguments
-     * @param node parent used to create this node
-     * @returns TypeParameterInstantiation node
-     */
-    convertTypeArgumentsToTypeParameters(typeArguments, node) {
-        const greaterThanToken = node_utils_1.findNextToken(typeArguments, this.ast, this.ast);
-        return this.createNode(node, {
-            type: ts_estree_1.AST_NODE_TYPES.TSTypeParameterInstantiation,
-            range: [typeArguments.pos - 1, greaterThanToken.end],
-            params: typeArguments.map(typeArgument => this.convertType(typeArgument)),
-        });
-    }
-    /**
-     * Converts a ts.Node's typeParameters to TSTypeParameterDeclaration node
-     * @param typeParameters ts.Node typeParameters
-     * @returns TypeParameterDeclaration node
-     */
-    convertTSTypeParametersToTypeParametersDeclaration(typeParameters) {
-        const greaterThanToken = node_utils_1.findNextToken(typeParameters, this.ast, this.ast);
-        return {
-            type: ts_estree_1.AST_NODE_TYPES.TSTypeParameterDeclaration,
-            range: [typeParameters.pos - 1, greaterThanToken.end],
-            loc: node_utils_1.getLocFor(typeParameters.pos - 1, greaterThanToken.end, this.ast),
-            params: typeParameters.map(typeParameter => this.convertType(typeParameter)),
-        };
-    }
-    /**
-     * Converts an array of ts.Node parameters into an array of ESTreeNode params
-     * @param parameters An array of ts.Node params to be converted
-     * @returns an array of converted ESTreeNode params
-     */
-    convertParameters(parameters) {
-        if (!parameters || !parameters.length) {
-            return [];
-        }
-        return parameters.map(param => {
-            var _a;
-            const convertedParam = this.convertChild(param);
-            if ((_a = param.decorators) === null || _a === void 0 ? void 0 : _a.length) {
-                convertedParam.decorators = param.decorators.map(el => this.convertChild(el));
-            }
-            return convertedParam;
-        });
-    }
-    convertChainExpression(node, tsNode) {
-        const { child, isOptional } = (() => {
-            if (node.type === ts_estree_1.AST_NODE_TYPES.MemberExpression) {
-                return { child: node.object, isOptional: node.optional };
-            }
-            if (node.type === ts_estree_1.AST_NODE_TYPES.CallExpression) {
-                return { child: node.callee, isOptional: node.optional };
-            }
-            return { child: node.expression, isOptional: false };
-        })();
-        const isChildUnwrappable = node_utils_1.isChildUnwrappableOptionalChain(tsNode, child);
-        if (!isChildUnwrappable && !isOptional) {
-            return node;
-        }
-        if (isChildUnwrappable && node_utils_1.isChainExpression(child)) {
-            // unwrap the chain expression child
-            const newChild = child.expression;
-            if (node.type === ts_estree_1.AST_NODE_TYPES.MemberExpression) {
-                node.object = newChild;
-            }
-            else if (node.type === ts_estree_1.AST_NODE_TYPES.CallExpression) {
-                node.callee = newChild;
-            }
-            else {
-                node.expression = newChild;
-            }
-        }
-        return this.createNode(tsNode, {
-            type: ts_estree_1.AST_NODE_TYPES.ChainExpression,
-            expression: node,
-        });
-    }
-    /**
-     * For nodes that are copied directly from the TypeScript AST into
-     * ESTree mostly as-is. The only difference is the addition of a type
-     * property instead of a kind property. Recursively copies all children.
-     */
-    deeplyCopy(node) {
-        if (node.kind === ts.SyntaxKind.JSDocFunctionType) {
-            throw node_utils_1.createError(this.ast, node.pos, 'JSDoc types can only be used inside documentation comments.');
-        }
-        const customType = `TS${SyntaxKind[node.kind]}`;
-        /**
-         * If the "errorOnUnknownASTType" option is set to true, throw an error,
-         * otherwise fallback to just including the unknown type as-is.
-         */
-        if (this.options.errorOnUnknownASTType && !ts_estree_1.AST_NODE_TYPES[customType]) {
-            throw new Error(`Unknown AST_NODE_TYPE: "${customType}"`);
-        }
-        const result = this.createNode(node, {
-            type: customType,
-        });
-        if ('type' in node) {
-            result.typeAnnotation =
-                node.type && 'kind' in node.type && ts.isTypeNode(node.type)
-                    ? this.convertTypeAnnotation(node.type, node)
-                    : null;
-        }
-        if ('typeArguments' in node) {
-            result.typeParameters =
-                node.typeArguments && 'pos' in node.typeArguments
-                    ? this.convertTypeArgumentsToTypeParameters(node.typeArguments, node)
-                    : null;
-        }
-        if ('typeParameters' in node) {
-            result.typeParameters =
-                node.typeParameters && 'pos' in node.typeParameters
-                    ? this.convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters)
-                    : null;
-        }
-        if ('decorators' in node && node.decorators && node.decorators.length) {
-            result.decorators = node.decorators.map(el => this.convertChild(el));
-        }
-        Object.entries(node)
-            .filter(([key]) => !/^(?:_children|kind|parent|pos|end|flags|modifierFlagsCache|jsDoc|type|typeArguments|typeParameters|decorators)$/.test(key))
-            .forEach(([key, value]) => {
-            if (Array.isArray(value)) {
-                result[key] = value.map(el => this.convertChild(el));
-            }
-            else if (value && typeof value === 'object' && value.kind) {
-                // need to check node[key].kind to ensure we don't try to convert a symbol
-                result[key] = this.convertChild(value);
-            }
-            else {
-                result[key] = value;
-            }
-        });
-        return result;
-    }
-    /**
-     * Converts a TypeScript JSX node.tagName into an ESTree node.name
-     * @param node the tagName object from a JSX ts.Node
-     * @param parent
-     * @returns the converted ESTree name object
-     */
-    convertJSXTagName(node, parent) {
-        let result;
-        switch (node.kind) {
-            case SyntaxKind.PropertyAccessExpression:
-                if (node.name.kind === SyntaxKind.PrivateIdentifier) {
-                    // This is one of the few times where TS explicitly errors, and doesn't even gracefully handle the syntax.
-                    // So we shouldn't ever get into this state to begin with.
-                    throw new Error('Non-private identifier expected.');
-                }
-                result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.JSXMemberExpression,
-                    object: this.convertJSXTagName(node.expression, parent),
-                    property: this.convertJSXTagName(node.name, parent),
-                });
-                break;
-            case SyntaxKind.ThisKeyword:
-                result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.JSXIdentifier,
-                    name: 'this',
-                });
-                break;
-            case SyntaxKind.Identifier:
-            default:
-                result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.JSXIdentifier,
-                    name: node.text,
-                });
-                break;
-        }
-        this.registerTSNodeInNodeMap(node, result);
-        return result;
-    }
-    /**
-     * Applies the given TS modifiers to the given result object.
-     * @param result
-     * @param modifiers original ts.Nodes from the node.modifiers array
-     * @returns the current result object will be mutated
-     * @deprecated This method adds not standardized `modifiers` property in nodes
-     */
-    applyModifiersToResult(result, modifiers) {
-        if (!modifiers || !modifiers.length) {
-            return;
-        }
-        /**
-         * Some modifiers are explicitly handled by applying them as
-         * boolean values on the result node. As well as adding them
-         * to the result, we remove them from the array, so that they
-         * are not handled twice.
-         */
-        const handledModifierIndices = {};
-        for (let i = 0; i < modifiers.length; i++) {
-            const modifier = modifiers[i];
-            switch (modifier.kind) {
-                /**
-                 * Ignore ExportKeyword and DefaultKeyword, they are handled
-                 * via the fixExports utility function
-                 */
-                case SyntaxKind.ExportKeyword:
-                case SyntaxKind.DefaultKeyword:
-                    handledModifierIndices[i] = true;
-                    break;
-                case SyntaxKind.ConstKeyword:
-                    result.const = true;
-                    handledModifierIndices[i] = true;
-                    break;
-                case SyntaxKind.DeclareKeyword:
-                    result.declare = true;
-                    handledModifierIndices[i] = true;
-                    break;
-                default:
-            }
-        }
-        /**
-         * If there are still valid modifiers available which have
-         * not been explicitly handled above, we just convert and
-         * add the modifiers array to the result node.
-         */
-        const remainingModifiers = modifiers.filter((_, i) => !handledModifierIndices[i]);
-        if (!remainingModifiers || !remainingModifiers.length) {
-            return;
-        }
-        result.modifiers = remainingModifiers.map(el => this.convertChild(el));
-    }
-    /**
-     * Uses the provided range location to adjust the location data of the given Node
-     * @param result The node that will have its location data mutated
-     * @param childRange The child node range used to expand location
-     */
-    fixParentLocation(result, childRange) {
-        if (childRange[0] < result.range[0]) {
-            result.range[0] = childRange[0];
-            result.loc.start = node_utils_1.getLineAndCharacterFor(result.range[0], this.ast);
-        }
-        if (childRange[1] > result.range[1]) {
-            result.range[1] = childRange[1];
-            result.loc.end = node_utils_1.getLineAndCharacterFor(result.range[1], this.ast);
-        }
-    }
-    /**
-     * Converts a TypeScript node into an ESTree node.
-     * The core of the conversion logic:
-     * Identify and convert each relevant TypeScript SyntaxKind
-     * @param node the child ts.Node
-     * @param parent parentNode
-     * @returns the converted ESTree node
-     */
-    convertNode(node, parent) {
-        var _a, _b, _c, _d, _e, _f, _g, _h, _j;
-        switch (node.kind) {
-            case SyntaxKind.SourceFile: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Program,
-                    body: this.convertBodyExpressions(node.statements, node),
-                    sourceType: node.externalModuleIndicator ? 'module' : 'script',
-                    range: [node.getStart(this.ast), node.endOfFileToken.end],
-                });
-            }
-            case SyntaxKind.Block: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.BlockStatement,
-                    body: this.convertBodyExpressions(node.statements, node),
-                });
-            }
-            case SyntaxKind.Identifier: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Identifier,
-                    name: node.text,
-                });
-            }
-            case SyntaxKind.WithStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.WithStatement,
-                    object: this.convertChild(node.expression),
-                    body: this.convertChild(node.statement),
-                });
-            // Control Flow
-            case SyntaxKind.ReturnStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ReturnStatement,
-                    argument: this.convertChild(node.expression),
-                });
-            case SyntaxKind.LabeledStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.LabeledStatement,
-                    label: this.convertChild(node.label),
-                    body: this.convertChild(node.statement),
-                });
-            case SyntaxKind.ContinueStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ContinueStatement,
-                    label: this.convertChild(node.label),
-                });
-            case SyntaxKind.BreakStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.BreakStatement,
-                    label: this.convertChild(node.label),
-                });
-            // Choice
-            case SyntaxKind.IfStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.IfStatement,
-                    test: this.convertChild(node.expression),
-                    consequent: this.convertChild(node.thenStatement),
-                    alternate: this.convertChild(node.elseStatement),
-                });
-            case SyntaxKind.SwitchStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.SwitchStatement,
-                    discriminant: this.convertChild(node.expression),
-                    cases: node.caseBlock.clauses.map(el => this.convertChild(el)),
-                });
-            case SyntaxKind.CaseClause:
-            case SyntaxKind.DefaultClause:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.SwitchCase,
-                    // expression is present in case only
-                    test: node.kind === SyntaxKind.CaseClause
-                        ? this.convertChild(node.expression)
-                        : null,
-                    consequent: node.statements.map(el => this.convertChild(el)),
-                });
-            // Exceptions
-            case SyntaxKind.ThrowStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ThrowStatement,
-                    argument: this.convertChild(node.expression),
-                });
-            case SyntaxKind.TryStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TryStatement,
-                    block: this.convertChild(node.tryBlock),
-                    handler: this.convertChild(node.catchClause),
-                    finalizer: this.convertChild(node.finallyBlock),
-                });
-            case SyntaxKind.CatchClause:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.CatchClause,
-                    param: node.variableDeclaration
-                        ? this.convertBindingNameWithTypeAnnotation(node.variableDeclaration.name, node.variableDeclaration.type)
-                        : null,
-                    body: this.convertChild(node.block),
-                });
-            // Loops
-            case SyntaxKind.WhileStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.WhileStatement,
-                    test: this.convertChild(node.expression),
-                    body: this.convertChild(node.statement),
-                });
-            /**
-             * Unlike other parsers, TypeScript calls a "DoWhileStatement"
-             * a "DoStatement"
-             */
-            case SyntaxKind.DoStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.DoWhileStatement,
-                    test: this.convertChild(node.expression),
-                    body: this.convertChild(node.statement),
-                });
-            case SyntaxKind.ForStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ForStatement,
-                    init: this.convertChild(node.initializer),
-                    test: this.convertChild(node.condition),
-                    update: this.convertChild(node.incrementor),
-                    body: this.convertChild(node.statement),
-                });
-            case SyntaxKind.ForInStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ForInStatement,
-                    left: this.convertPattern(node.initializer),
-                    right: this.convertChild(node.expression),
-                    body: this.convertChild(node.statement),
-                });
-            case SyntaxKind.ForOfStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ForOfStatement,
-                    left: this.convertPattern(node.initializer),
-                    right: this.convertChild(node.expression),
-                    body: this.convertChild(node.statement),
-                    await: Boolean(node.awaitModifier &&
-                        node.awaitModifier.kind === SyntaxKind.AwaitKeyword),
-                });
-            // Declarations
-            case SyntaxKind.FunctionDeclaration: {
-                const isDeclare = node_utils_1.hasModifier(SyntaxKind.DeclareKeyword, node);
-                const result = this.createNode(node, {
-                    type: isDeclare || !node.body
-                        ? ts_estree_1.AST_NODE_TYPES.TSDeclareFunction
-                        : ts_estree_1.AST_NODE_TYPES.FunctionDeclaration,
-                    id: this.convertChild(node.name),
-                    generator: !!node.asteriskToken,
-                    expression: false,
-                    async: node_utils_1.hasModifier(SyntaxKind.AsyncKeyword, node),
-                    params: this.convertParameters(node.parameters),
-                    body: this.convertChild(node.body) || undefined,
-                });
-                // Process returnType
-                if (node.type) {
-                    result.returnType = this.convertTypeAnnotation(node.type, node);
-                }
-                if (isDeclare) {
-                    result.declare = true;
-                }
-                // Process typeParameters
-                if (node.typeParameters) {
-                    result.typeParameters = this.convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters);
-                }
-                // check for exports
-                return this.fixExports(node, result);
-            }
-            case SyntaxKind.VariableDeclaration: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.VariableDeclarator,
-                    id: this.convertBindingNameWithTypeAnnotation(node.name, node.type, node),
-                    init: this.convertChild(node.initializer),
-                });
-                if (node.exclamationToken) {
-                    result.definite = true;
-                }
-                return result;
-            }
-            case SyntaxKind.VariableStatement: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.VariableDeclaration,
-                    declarations: node.declarationList.declarations.map(el => this.convertChild(el)),
-                    kind: node_utils_1.getDeclarationKind(node.declarationList),
-                });
-                /**
-                 * Semantically, decorators are not allowed on variable declarations,
-                 * but the TypeScript compiler will parse them and produce a valid AST,
-                 * so we handle them here too.
-                 */
-                if (node.decorators) {
-                    result.decorators = node.decorators.map(el => this.convertChild(el));
-                }
-                if (node_utils_1.hasModifier(SyntaxKind.DeclareKeyword, node)) {
-                    result.declare = true;
-                }
-                // check for exports
-                return this.fixExports(node, result);
-            }
-            // mostly for for-of, for-in
-            case SyntaxKind.VariableDeclarationList:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.VariableDeclaration,
-                    declarations: node.declarations.map(el => this.convertChild(el)),
-                    kind: node_utils_1.getDeclarationKind(node),
-                });
-            // Expressions
-            case SyntaxKind.ExpressionStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ExpressionStatement,
-                    expression: this.convertChild(node.expression),
-                });
-            case SyntaxKind.ThisKeyword:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ThisExpression,
-                });
-            case SyntaxKind.ArrayLiteralExpression: {
-                // TypeScript uses ArrayLiteralExpression in destructuring assignment, too
-                if (this.allowPattern) {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.ArrayPattern,
-                        elements: node.elements.map(el => this.convertPattern(el)),
-                    });
-                }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.ArrayExpression,
-                        elements: node.elements.map(el => this.convertChild(el)),
-                    });
-                }
-            }
-            case SyntaxKind.ObjectLiteralExpression: {
-                // TypeScript uses ObjectLiteralExpression in destructuring assignment, too
-                if (this.allowPattern) {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.ObjectPattern,
-                        properties: node.properties.map(el => this.convertPattern(el)),
-                    });
-                }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.ObjectExpression,
-                        properties: node.properties.map(el => this.convertChild(el)),
-                    });
-                }
-            }
-            case SyntaxKind.PropertyAssignment:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Property,
-                    key: this.convertChild(node.name),
-                    value: this.converter(node.initializer, node, this.inTypeMode, this.allowPattern),
-                    computed: node_utils_1.isComputedProperty(node.name),
-                    method: false,
-                    shorthand: false,
-                    kind: 'init',
-                });
-            case SyntaxKind.ShorthandPropertyAssignment: {
-                if (node.objectAssignmentInitializer) {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.Property,
-                        key: this.convertChild(node.name),
-                        value: this.createNode(node, {
-                            type: ts_estree_1.AST_NODE_TYPES.AssignmentPattern,
-                            left: this.convertPattern(node.name),
-                            right: this.convertChild(node.objectAssignmentInitializer),
-                        }),
-                        computed: false,
-                        method: false,
-                        shorthand: true,
-                        kind: 'init',
-                    });
-                }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.Property,
-                        key: this.convertChild(node.name),
-                        value: this.convertChild(node.name),
-                        computed: false,
-                        method: false,
-                        shorthand: true,
-                        kind: 'init',
-                    });
-                }
-            }
-            case SyntaxKind.ComputedPropertyName:
-                return this.convertChild(node.expression);
-            case SyntaxKind.PropertyDeclaration: {
-                const isAbstract = node_utils_1.hasModifier(SyntaxKind.AbstractKeyword, node);
-                const result = this.createNode(node, {
-                    type: isAbstract
-                        ? ts_estree_1.AST_NODE_TYPES.TSAbstractClassProperty
-                        : ts_estree_1.AST_NODE_TYPES.ClassProperty,
-                    key: this.convertChild(node.name),
-                    value: this.convertChild(node.initializer),
-                    computed: node_utils_1.isComputedProperty(node.name),
-                    static: node_utils_1.hasModifier(SyntaxKind.StaticKeyword, node),
-                    readonly: node_utils_1.hasModifier(SyntaxKind.ReadonlyKeyword, node) || undefined,
-                    declare: node_utils_1.hasModifier(SyntaxKind.DeclareKeyword, node),
-                });
-                if (node.type) {
-                    result.typeAnnotation = this.convertTypeAnnotation(node.type, node);
-                }
-                if (node.decorators) {
-                    result.decorators = node.decorators.map(el => this.convertChild(el));
-                }
-                const accessibility = node_utils_1.getTSNodeAccessibility(node);
-                if (accessibility) {
-                    result.accessibility = accessibility;
-                }
-                if ((node.name.kind === SyntaxKind.Identifier ||
-                    node.name.kind === SyntaxKind.ComputedPropertyName) &&
-                    node.questionToken) {
-                    result.optional = true;
-                }
-                if (node.exclamationToken) {
-                    result.definite = true;
-                }
-                if (result.key.type === ts_estree_1.AST_NODE_TYPES.Literal && node.questionToken) {
-                    result.optional = true;
-                }
-                return result;
-            }
-            case SyntaxKind.GetAccessor:
-            case SyntaxKind.SetAccessor:
-            case SyntaxKind.MethodDeclaration: {
-                const method = this.createNode(node, {
-                    type: !node.body
-                        ? ts_estree_1.AST_NODE_TYPES.TSEmptyBodyFunctionExpression
-                        : ts_estree_1.AST_NODE_TYPES.FunctionExpression,
-                    id: null,
-                    generator: !!node.asteriskToken,
-                    expression: false,
-                    async: node_utils_1.hasModifier(SyntaxKind.AsyncKeyword, node),
-                    body: this.convertChild(node.body),
-                    range: [node.parameters.pos - 1, node.end],
-                    params: [],
-                });
-                if (node.type) {
-                    method.returnType = this.convertTypeAnnotation(node.type, node);
-                }
-                // Process typeParameters
-                if (node.typeParameters) {
-                    method.typeParameters = this.convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters);
-                    this.fixParentLocation(method, method.typeParameters.range);
-                }
-                let result;
-                if (parent.kind === SyntaxKind.ObjectLiteralExpression) {
-                    method.params = node.parameters.map(el => this.convertChild(el));
-                    result = this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.Property,
-                        key: this.convertChild(node.name),
-                        value: method,
-                        computed: node_utils_1.isComputedProperty(node.name),
-                        method: node.kind === SyntaxKind.MethodDeclaration,
-                        shorthand: false,
-                        kind: 'init',
-                    });
-                }
-                else {
-                    // class
-                    /**
-                     * Unlike in object literal methods, class method params can have decorators
-                     */
-                    method.params = this.convertParameters(node.parameters);
-                    /**
-                     * TypeScript class methods can be defined as "abstract"
-                     */
-                    const methodDefinitionType = node_utils_1.hasModifier(SyntaxKind.AbstractKeyword, node)
-                        ? ts_estree_1.AST_NODE_TYPES.TSAbstractMethodDefinition
-                        : ts_estree_1.AST_NODE_TYPES.MethodDefinition;
-                    result = this.createNode(node, {
-                        type: methodDefinitionType,
-                        key: this.convertChild(node.name),
-                        value: method,
-                        computed: node_utils_1.isComputedProperty(node.name),
-                        static: node_utils_1.hasModifier(SyntaxKind.StaticKeyword, node),
-                        kind: 'method',
-                    });
-                    if (node.decorators) {
-                        result.decorators = node.decorators.map(el => this.convertChild(el));
-                    }
-                    const accessibility = node_utils_1.getTSNodeAccessibility(node);
-                    if (accessibility) {
-                        result.accessibility = accessibility;
-                    }
-                }
-                if (node.questionToken) {
-                    result.optional = true;
-                }
-                if (node.kind === SyntaxKind.GetAccessor) {
-                    result.kind = 'get';
-                }
-                else if (node.kind === SyntaxKind.SetAccessor) {
-                    result.kind = 'set';
-                }
-                else if (!result.static &&
-                    node.name.kind === SyntaxKind.StringLiteral &&
-                    node.name.text === 'constructor' &&
-                    result.type !== ts_estree_1.AST_NODE_TYPES.Property) {
-                    result.kind = 'constructor';
-                }
-                return result;
-            }
-            // TypeScript uses this even for static methods named "constructor"
-            case SyntaxKind.Constructor: {
-                const lastModifier = node_utils_1.getLastModifier(node);
-                const constructorToken = (lastModifier && node_utils_1.findNextToken(lastModifier, node, this.ast)) ||
-                    node.getFirstToken();
-                const constructor = this.createNode(node, {
-                    type: !node.body
-                        ? ts_estree_1.AST_NODE_TYPES.TSEmptyBodyFunctionExpression
-                        : ts_estree_1.AST_NODE_TYPES.FunctionExpression,
-                    id: null,
-                    params: this.convertParameters(node.parameters),
-                    generator: false,
-                    expression: false,
-                    async: false,
-                    body: this.convertChild(node.body),
-                    range: [node.parameters.pos - 1, node.end],
-                });
-                // Process typeParameters
-                if (node.typeParameters) {
-                    constructor.typeParameters = this.convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters);
-                    this.fixParentLocation(constructor, constructor.typeParameters.range);
-                }
-                // Process returnType
-                if (node.type) {
-                    constructor.returnType = this.convertTypeAnnotation(node.type, node);
-                }
-                const constructorKey = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Identifier,
-                    name: 'constructor',
-                    range: [constructorToken.getStart(this.ast), constructorToken.end],
-                });
-                const isStatic = node_utils_1.hasModifier(SyntaxKind.StaticKeyword, node);
-                const result = this.createNode(node, {
-                    type: node_utils_1.hasModifier(SyntaxKind.AbstractKeyword, node)
-                        ? ts_estree_1.AST_NODE_TYPES.TSAbstractMethodDefinition
-                        : ts_estree_1.AST_NODE_TYPES.MethodDefinition,
-                    key: constructorKey,
-                    value: constructor,
-                    computed: false,
-                    static: isStatic,
-                    kind: isStatic ? 'method' : 'constructor',
-                });
-                const accessibility = node_utils_1.getTSNodeAccessibility(node);
-                if (accessibility) {
-                    result.accessibility = accessibility;
-                }
-                return result;
-            }
-            case SyntaxKind.FunctionExpression: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.FunctionExpression,
-                    id: this.convertChild(node.name),
-                    generator: !!node.asteriskToken,
-                    params: this.convertParameters(node.parameters),
-                    body: this.convertChild(node.body),
-                    async: node_utils_1.hasModifier(SyntaxKind.AsyncKeyword, node),
-                    expression: false,
-                });
-                // Process returnType
-                if (node.type) {
-                    result.returnType = this.convertTypeAnnotation(node.type, node);
-                }
-                // Process typeParameters
-                if (node.typeParameters) {
-                    result.typeParameters = this.convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters);
-                }
-                return result;
-            }
-            case SyntaxKind.SuperKeyword:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Super,
-                });
-            case SyntaxKind.ArrayBindingPattern:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ArrayPattern,
-                    elements: node.elements.map(el => this.convertPattern(el)),
-                });
-            // occurs with missing array elements like [,]
-            case SyntaxKind.OmittedExpression:
-                return null;
-            case SyntaxKind.ObjectBindingPattern:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ObjectPattern,
-                    properties: node.elements.map(el => this.convertPattern(el)),
-                });
-            case SyntaxKind.BindingElement: {
-                if (parent.kind === SyntaxKind.ArrayBindingPattern) {
-                    const arrayItem = this.convertChild(node.name, parent);
-                    if (node.initializer) {
-                        return this.createNode(node, {
-                            type: ts_estree_1.AST_NODE_TYPES.AssignmentPattern,
-                            left: arrayItem,
-                            right: this.convertChild(node.initializer),
-                        });
-                    }
-                    else if (node.dotDotDotToken) {
-                        return this.createNode(node, {
-                            type: ts_estree_1.AST_NODE_TYPES.RestElement,
-                            argument: arrayItem,
-                        });
-                    }
-                    else {
-                        return arrayItem;
-                    }
-                }
-                else {
-                    let result;
-                    if (node.dotDotDotToken) {
-                        result = this.createNode(node, {
-                            type: ts_estree_1.AST_NODE_TYPES.RestElement,
-                            argument: this.convertChild((_a = node.propertyName) !== null && _a !== void 0 ? _a : node.name),
-                        });
-                    }
-                    else {
-                        result = this.createNode(node, {
-                            type: ts_estree_1.AST_NODE_TYPES.Property,
-                            key: this.convertChild((_b = node.propertyName) !== null && _b !== void 0 ? _b : node.name),
-                            value: this.convertChild(node.name),
-                            computed: Boolean(node.propertyName &&
-                                node.propertyName.kind === SyntaxKind.ComputedPropertyName),
-                            method: false,
-                            shorthand: !node.propertyName,
-                            kind: 'init',
-                        });
-                    }
-                    if (node.initializer) {
-                        result.value = this.createNode(node, {
-                            type: ts_estree_1.AST_NODE_TYPES.AssignmentPattern,
-                            left: this.convertChild(node.name),
-                            right: this.convertChild(node.initializer),
-                            range: [node.name.getStart(this.ast), node.initializer.end],
-                        });
-                    }
-                    return result;
-                }
-            }
-            case SyntaxKind.ArrowFunction: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ArrowFunctionExpression,
-                    generator: false,
-                    id: null,
-                    params: this.convertParameters(node.parameters),
-                    body: this.convertChild(node.body),
-                    async: node_utils_1.hasModifier(SyntaxKind.AsyncKeyword, node),
-                    expression: node.body.kind !== SyntaxKind.Block,
-                });
-                // Process returnType
-                if (node.type) {
-                    result.returnType = this.convertTypeAnnotation(node.type, node);
-                }
-                // Process typeParameters
-                if (node.typeParameters) {
-                    result.typeParameters = this.convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters);
-                }
-                return result;
-            }
-            case SyntaxKind.YieldExpression:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.YieldExpression,
-                    delegate: !!node.asteriskToken,
-                    argument: this.convertChild(node.expression),
-                });
-            case SyntaxKind.AwaitExpression:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.AwaitExpression,
-                    argument: this.convertChild(node.expression),
-                });
-            // Template Literals
-            case SyntaxKind.NoSubstitutionTemplateLiteral:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TemplateLiteral,
-                    quasis: [
-                        this.createNode(node, {
-                            type: ts_estree_1.AST_NODE_TYPES.TemplateElement,
-                            value: {
-                                raw: this.ast.text.slice(node.getStart(this.ast) + 1, node.end - 1),
-                                cooked: node.text,
-                            },
-                            tail: true,
-                        }),
-                    ],
-                    expressions: [],
-                });
-            case SyntaxKind.TemplateExpression: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TemplateLiteral,
-                    quasis: [this.convertChild(node.head)],
-                    expressions: [],
-                });
-                node.templateSpans.forEach(templateSpan => {
-                    result.expressions.push(this.convertChild(templateSpan.expression));
-                    result.quasis.push(this.convertChild(templateSpan.literal));
-                });
-                return result;
-            }
-            case SyntaxKind.TaggedTemplateExpression:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TaggedTemplateExpression,
-                    typeParameters: node.typeArguments
-                        ? this.convertTypeArgumentsToTypeParameters(node.typeArguments, node)
-                        : undefined,
-                    tag: this.convertChild(node.tag),
-                    quasi: this.convertChild(node.template),
-                });
-            case SyntaxKind.TemplateHead:
-            case SyntaxKind.TemplateMiddle:
-            case SyntaxKind.TemplateTail: {
-                const tail = node.kind === SyntaxKind.TemplateTail;
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TemplateElement,
-                    value: {
-                        raw: this.ast.text.slice(node.getStart(this.ast) + 1, node.end - (tail ? 1 : 2)),
-                        cooked: node.text,
-                    },
-                    tail,
-                });
-            }
-            // Patterns
-            case SyntaxKind.SpreadAssignment:
-            case SyntaxKind.SpreadElement: {
-                if (this.allowPattern) {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.RestElement,
-                        argument: this.convertPattern(node.expression),
-                    });
-                }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.SpreadElement,
-                        argument: this.convertChild(node.expression),
-                    });
-                }
-            }
-            case SyntaxKind.Parameter: {
-                let parameter;
-                let result;
-                if (node.dotDotDotToken) {
-                    parameter = result = this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.RestElement,
-                        argument: this.convertChild(node.name),
-                    });
-                }
-                else if (node.initializer) {
-                    parameter = this.convertChild(node.name);
-                    result = this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.AssignmentPattern,
-                        left: parameter,
-                        right: this.convertChild(node.initializer),
-                    });
-                    if (node.modifiers) {
-                        // AssignmentPattern should not contain modifiers in range
-                        result.range[0] = parameter.range[0];
-                        result.loc = node_utils_1.getLocFor(result.range[0], result.range[1], this.ast);
-                    }
-                }
-                else {
-                    parameter = result = this.convertChild(node.name, parent);
-                }
-                if (node.type) {
-                    parameter.typeAnnotation = this.convertTypeAnnotation(node.type, node);
-                    this.fixParentLocation(parameter, parameter.typeAnnotation.range);
-                }
-                if (node.questionToken) {
-                    if (node.questionToken.end > parameter.range[1]) {
-                        parameter.range[1] = node.questionToken.end;
-                        parameter.loc.end = node_utils_1.getLineAndCharacterFor(parameter.range[1], this.ast);
-                    }
-                    parameter.optional = true;
-                }
-                if (node.modifiers) {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.TSParameterProperty,
-                        accessibility: (_c = node_utils_1.getTSNodeAccessibility(node)) !== null && _c !== void 0 ? _c : undefined,
-                        readonly: node_utils_1.hasModifier(SyntaxKind.ReadonlyKeyword, node) || undefined,
-                        static: node_utils_1.hasModifier(SyntaxKind.StaticKeyword, node) || undefined,
-                        export: node_utils_1.hasModifier(SyntaxKind.ExportKeyword, node) || undefined,
-                        parameter: result,
-                    });
-                }
-                return result;
-            }
-            // Classes
-            case SyntaxKind.ClassDeclaration:
-            case SyntaxKind.ClassExpression: {
-                const heritageClauses = (_d = node.heritageClauses) !== null && _d !== void 0 ? _d : [];
-                const classNodeType = node.kind === SyntaxKind.ClassDeclaration
-                    ? ts_estree_1.AST_NODE_TYPES.ClassDeclaration
-                    : ts_estree_1.AST_NODE_TYPES.ClassExpression;
-                const superClass = heritageClauses.find(clause => clause.token === SyntaxKind.ExtendsKeyword);
-                const implementsClause = heritageClauses.find(clause => clause.token === SyntaxKind.ImplementsKeyword);
-                const result = this.createNode(node, {
-                    type: classNodeType,
-                    id: this.convertChild(node.name),
-                    body: this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.ClassBody,
-                        body: [],
-                        range: [node.members.pos - 1, node.end],
-                    }),
-                    superClass: (superClass === null || superClass === void 0 ? void 0 : superClass.types[0]) ? this.convertChild(superClass.types[0].expression)
-                        : null,
-                });
-                if (superClass) {
-                    if (superClass.types.length > 1) {
-                        throw node_utils_1.createError(this.ast, superClass.types[1].pos, 'Classes can only extend a single class.');
-                    }
-                    if ((_e = superClass.types[0]) === null || _e === void 0 ? void 0 : _e.typeArguments) {
-                        result.superTypeParameters = this.convertTypeArgumentsToTypeParameters(superClass.types[0].typeArguments, superClass.types[0]);
-                    }
-                }
-                if (node.typeParameters) {
-                    result.typeParameters = this.convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters);
-                }
-                if (implementsClause) {
-                    result.implements = implementsClause.types.map(el => this.convertChild(el));
-                }
-                /**
-                 * TypeScript class declarations can be defined as "abstract"
-                 */
-                if (node_utils_1.hasModifier(SyntaxKind.AbstractKeyword, node)) {
-                    result.abstract = true;
-                }
-                if (node_utils_1.hasModifier(SyntaxKind.DeclareKeyword, node)) {
-                    result.declare = true;
-                }
-                if (node.decorators) {
-                    result.decorators = node.decorators.map(el => this.convertChild(el));
-                }
-                const filteredMembers = node.members.filter(node_utils_1.isESTreeClassMember);
-                if (filteredMembers.length) {
-                    result.body.body = filteredMembers.map(el => this.convertChild(el));
-                }
-                // check for exports
-                return this.fixExports(node, result);
-            }
-            // Modules
-            case SyntaxKind.ModuleBlock:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSModuleBlock,
-                    body: this.convertBodyExpressions(node.statements, node),
-                });
-            case SyntaxKind.ImportDeclaration: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ImportDeclaration,
-                    source: this.convertChild(node.moduleSpecifier),
-                    specifiers: [],
-                    importKind: 'value',
-                });
-                if (node.importClause) {
-                    if (node.importClause.isTypeOnly) {
-                        result.importKind = 'type';
-                    }
-                    if (node.importClause.name) {
-                        result.specifiers.push(this.convertChild(node.importClause));
-                    }
-                    if (node.importClause.namedBindings) {
-                        switch (node.importClause.namedBindings.kind) {
-                            case SyntaxKind.NamespaceImport:
-                                result.specifiers.push(this.convertChild(node.importClause.namedBindings));
-                                break;
-                            case SyntaxKind.NamedImports:
-                                result.specifiers = result.specifiers.concat(node.importClause.namedBindings.elements.map(el => this.convertChild(el)));
-                                break;
-                        }
-                    }
-                }
-                return result;
-            }
-            case SyntaxKind.NamespaceImport:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ImportNamespaceSpecifier,
-                    local: this.convertChild(node.name),
-                });
-            case SyntaxKind.ImportSpecifier:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ImportSpecifier,
-                    local: this.convertChild(node.name),
-                    imported: this.convertChild((_f = node.propertyName) !== null && _f !== void 0 ? _f : node.name),
-                });
-            case SyntaxKind.ImportClause: {
-                const local = this.convertChild(node.name);
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ImportDefaultSpecifier,
-                    local,
-                    range: local.range,
-                });
-            }
-            case SyntaxKind.ExportDeclaration:
-                if (((_g = node.exportClause) === null || _g === void 0 ? void 0 : _g.kind) === SyntaxKind.NamedExports) {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.ExportNamedDeclaration,
-                        source: this.convertChild(node.moduleSpecifier),
-                        specifiers: node.exportClause.elements.map(el => this.convertChild(el)),
-                        exportKind: node.isTypeOnly ? 'type' : 'value',
-                        declaration: null,
-                    });
-                }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.ExportAllDeclaration,
-                        source: this.convertChild(node.moduleSpecifier),
-                        exportKind: node.isTypeOnly ? 'type' : 'value',
-                        exported: 
-                        // note - for compat with 3.7.x, where node.exportClause is always undefined and
-                        //        SyntaxKind.NamespaceExport does not exist yet (i.e. is undefined), this
-                        //        cannot be shortened to an optional chain, or else you end up with
-                        //        undefined === undefined, and the true path will hard error at runtime
-                        node.exportClause &&
-                            node.exportClause.kind === SyntaxKind.NamespaceExport
-                            ? this.convertChild(node.exportClause.name)
-                            : null,
-                    });
-                }
-            case SyntaxKind.ExportSpecifier:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ExportSpecifier,
-                    local: this.convertChild((_h = node.propertyName) !== null && _h !== void 0 ? _h : node.name),
-                    exported: this.convertChild(node.name),
-                });
-            case SyntaxKind.ExportAssignment:
-                if (node.isExportEquals) {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.TSExportAssignment,
-                        expression: this.convertChild(node.expression),
-                    });
-                }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.ExportDefaultDeclaration,
-                        declaration: this.convertChild(node.expression),
-                        exportKind: 'value',
-                    });
-                }
-            // Unary Operations
-            case SyntaxKind.PrefixUnaryExpression:
-            case SyntaxKind.PostfixUnaryExpression: {
-                const operator = node_utils_1.getTextForTokenKind(node.operator);
-                /**
-                 * ESTree uses UpdateExpression for ++/--
-                 */
-                if (operator === '++' || operator === '--') {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.UpdateExpression,
-                        operator,
-                        prefix: node.kind === SyntaxKind.PrefixUnaryExpression,
-                        argument: this.convertChild(node.operand),
-                    });
-                }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.UnaryExpression,
-                        operator,
-                        prefix: node.kind === SyntaxKind.PrefixUnaryExpression,
-                        argument: this.convertChild(node.operand),
-                    });
-                }
-            }
-            case SyntaxKind.DeleteExpression:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.UnaryExpression,
-                    operator: 'delete',
-                    prefix: true,
-                    argument: this.convertChild(node.expression),
-                });
-            case SyntaxKind.VoidExpression:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.UnaryExpression,
-                    operator: 'void',
-                    prefix: true,
-                    argument: this.convertChild(node.expression),
-                });
-            case SyntaxKind.TypeOfExpression:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.UnaryExpression,
-                    operator: 'typeof',
-                    prefix: true,
-                    argument: this.convertChild(node.expression),
-                });
-            case SyntaxKind.TypeOperator:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSTypeOperator,
-                    operator: node_utils_1.getTextForTokenKind(node.operator),
-                    typeAnnotation: this.convertChild(node.type),
-                });
-            // Binary Operations
-            case SyntaxKind.BinaryExpression: {
-                // TypeScript uses BinaryExpression for sequences as well
-                if (node_utils_1.isComma(node.operatorToken)) {
-                    const result = this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.SequenceExpression,
-                        expressions: [],
-                    });
-                    const left = this.convertChild(node.left);
-                    if (left.type === ts_estree_1.AST_NODE_TYPES.SequenceExpression &&
-                        node.left.kind !== SyntaxKind.ParenthesizedExpression) {
-                        result.expressions = result.expressions.concat(left.expressions);
-                    }
-                    else {
-                        result.expressions.push(left);
-                    }
-                    result.expressions.push(this.convertChild(node.right));
-                    return result;
-                }
-                else {
-                    const type = node_utils_1.getBinaryExpressionType(node.operatorToken);
-                    if (this.allowPattern &&
-                        type === ts_estree_1.AST_NODE_TYPES.AssignmentExpression) {
-                        return this.createNode(node, {
-                            type: ts_estree_1.AST_NODE_TYPES.AssignmentPattern,
-                            left: this.convertPattern(node.left, node),
-                            right: this.convertChild(node.right),
-                        });
-                    }
-                    return this.createNode(node, {
-                        type,
-                        operator: node_utils_1.getTextForTokenKind(node.operatorToken.kind),
-                        left: this.converter(node.left, node, this.inTypeMode, type === ts_estree_1.AST_NODE_TYPES.AssignmentExpression),
-                        right: this.convertChild(node.right),
-                    });
-                }
-            }
-            case SyntaxKind.PropertyAccessExpression: {
-                const object = this.convertChild(node.expression);
-                const property = this.convertChild(node.name);
-                const computed = false;
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.MemberExpression,
-                    object,
-                    property,
-                    computed,
-                    optional: node.questionDotToken !== undefined,
-                });
-                return this.convertChainExpression(result, node);
-            }
-            case SyntaxKind.ElementAccessExpression: {
-                const object = this.convertChild(node.expression);
-                const property = this.convertChild(node.argumentExpression);
-                const computed = true;
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.MemberExpression,
-                    object,
-                    property,
-                    computed,
-                    optional: node.questionDotToken !== undefined,
-                });
-                return this.convertChainExpression(result, node);
-            }
-            case SyntaxKind.CallExpression: {
-                if (node.expression.kind === SyntaxKind.ImportKeyword) {
-                    if (node.arguments.length !== 1) {
-                        throw node_utils_1.createError(this.ast, node.arguments.pos, 'Dynamic import must have one specifier as an argument.');
-                    }
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.ImportExpression,
-                        source: this.convertChild(node.arguments[0]),
-                    });
-                }
-                const callee = this.convertChild(node.expression);
-                const args = node.arguments.map(el => this.convertChild(el));
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.CallExpression,
-                    callee,
-                    arguments: args,
-                    optional: node.questionDotToken !== undefined,
-                });
-                if (node.typeArguments) {
-                    result.typeParameters = this.convertTypeArgumentsToTypeParameters(node.typeArguments, node);
-                }
-                return this.convertChainExpression(result, node);
-            }
-            case SyntaxKind.NewExpression: {
-                // NOTE - NewExpression cannot have an optional chain in it
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.NewExpression,
-                    callee: this.convertChild(node.expression),
-                    arguments: node.arguments
-                        ? node.arguments.map(el => this.convertChild(el))
-                        : [],
-                });
-                if (node.typeArguments) {
-                    result.typeParameters = this.convertTypeArgumentsToTypeParameters(node.typeArguments, node);
-                }
-                return result;
-            }
-            case SyntaxKind.ConditionalExpression:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.ConditionalExpression,
-                    test: this.convertChild(node.condition),
-                    consequent: this.convertChild(node.whenTrue),
-                    alternate: this.convertChild(node.whenFalse),
-                });
-            case SyntaxKind.MetaProperty: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.MetaProperty,
-                    meta: this.createNode(
-                    // TODO: do we really want to convert it to Token?
-                    node.getFirstToken(), {
-                        type: ts_estree_1.AST_NODE_TYPES.Identifier,
-                        name: node_utils_1.getTextForTokenKind(node.keywordToken),
-                    }),
-                    property: this.convertChild(node.name),
-                });
-            }
-            case SyntaxKind.Decorator: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Decorator,
-                    expression: this.convertChild(node.expression),
-                });
-            }
-            // Literals
-            case SyntaxKind.StringLiteral: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Literal,
-                    raw: '',
-                    value: '',
-                });
-                result.raw = this.ast.text.slice(result.range[0], result.range[1]);
-                if ('name' in parent && parent.name === node) {
-                    result.value = node.text;
-                }
-                else {
-                    result.value = node_utils_1.unescapeStringLiteralText(node.text);
-                }
-                return result;
-            }
-            case SyntaxKind.NumericLiteral: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Literal,
-                    value: Number(node.text),
-                    raw: node.getText(),
-                });
-            }
-            case SyntaxKind.BigIntLiteral: {
-                const range = node_utils_1.getRange(node, this.ast);
-                const rawValue = this.ast.text.slice(range[0], range[1]);
-                const bigint = rawValue
-                    // remove suffix `n`
-                    .slice(0, -1)
-                    // `BigInt` doesn't accept numeric separator
-                    // and `bigint` property should not include numeric separator
-                    .replace(/_/g, '');
-                const value = typeof BigInt !== 'undefined' ? BigInt(bigint) : null;
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Literal,
-                    raw: rawValue,
-                    value: value,
-                    bigint: value === null ? bigint : String(value),
-                    range,
-                });
-            }
-            case SyntaxKind.RegularExpressionLiteral: {
-                const pattern = node.text.slice(1, node.text.lastIndexOf('/'));
-                const flags = node.text.slice(node.text.lastIndexOf('/') + 1);
-                let regex = null;
-                try {
-                    regex = new RegExp(pattern, flags);
-                }
-                catch (exception) {
-                    regex = null;
-                }
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Literal,
-                    value: regex,
-                    raw: node.text,
-                    regex: {
-                        pattern,
-                        flags,
-                    },
-                });
-            }
-            case SyntaxKind.TrueKeyword:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Literal,
-                    value: true,
-                    raw: 'true',
-                });
-            case SyntaxKind.FalseKeyword:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Literal,
-                    value: false,
-                    raw: 'false',
-                });
-            case SyntaxKind.NullKeyword: {
-                if (!version_check_1.typescriptVersionIsAtLeast['4.0'] && this.inTypeMode) {
-                    // 4.0 started nesting null types inside a LiteralType node, but we still need to support pre-4.0
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.TSNullKeyword,
-                    });
-                }
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.Literal,
-                    value: null,
-                    raw: 'null',
-                });
-            }
-            case SyntaxKind.EmptyStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.EmptyStatement,
-                });
-            case SyntaxKind.DebuggerStatement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.DebuggerStatement,
-                });
-            // JSX
-            case SyntaxKind.JsxElement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.JSXElement,
-                    openingElement: this.convertChild(node.openingElement),
-                    closingElement: this.convertChild(node.closingElement),
-                    children: node.children.map(el => this.convertChild(el)),
-                });
-            case SyntaxKind.JsxFragment:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.JSXFragment,
-                    openingFragment: this.convertChild(node.openingFragment),
-                    closingFragment: this.convertChild(node.closingFragment),
-                    children: node.children.map(el => this.convertChild(el)),
-                });
-            case SyntaxKind.JsxSelfClosingElement: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.JSXElement,
-                    /**
-                     * Convert SyntaxKind.JsxSelfClosingElement to SyntaxKind.JsxOpeningElement,
-                     * TypeScript does not seem to have the idea of openingElement when tag is self-closing
-                     */
-                    openingElement: this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.JSXOpeningElement,
-                        typeParameters: node.typeArguments
-                            ? this.convertTypeArgumentsToTypeParameters(node.typeArguments, node)
-                            : undefined,
-                        selfClosing: true,
-                        name: this.convertJSXTagName(node.tagName, node),
-                        attributes: node.attributes.properties.map(el => this.convertChild(el)),
-                        range: node_utils_1.getRange(node, this.ast),
-                    }),
-                    closingElement: null,
-                    children: [],
-                });
-            }
-            case SyntaxKind.JsxOpeningElement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.JSXOpeningElement,
-                    typeParameters: node.typeArguments
-                        ? this.convertTypeArgumentsToTypeParameters(node.typeArguments, node)
-                        : undefined,
-                    selfClosing: false,
-                    name: this.convertJSXTagName(node.tagName, node),
-                    attributes: node.attributes.properties.map(el => this.convertChild(el)),
-                });
-            case SyntaxKind.JsxClosingElement:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.JSXClosingElement,
-                    name: this.convertJSXTagName(node.tagName, node),
-                });
-            case SyntaxKind.JsxOpeningFragment:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.JSXOpeningFragment,
-                });
-            case SyntaxKind.JsxClosingFragment:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.JSXClosingFragment,
-                });
-            case SyntaxKind.JsxExpression: {
-                const expression = node.expression
-                    ? this.convertChild(node.expression)
-                    : this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.JSXEmptyExpression,
-                        range: [node.getStart(this.ast) + 1, node.getEnd() - 1],
-                    });
-                if (node.dotDotDotToken) {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.JSXSpreadChild,
-                        expression,
-                    });
-                }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.JSXExpressionContainer,
-                        expression,
-                    });
-                }
-            }
-            case SyntaxKind.JsxAttribute: {
-                const attributeName = this.convertChild(node.name);
-                attributeName.type = ts_estree_1.AST_NODE_TYPES.JSXIdentifier;
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.JSXAttribute,
-                    name: attributeName,
-                    value: this.convertChild(node.initializer),
-                });
-            }
-            /**
-             * The JSX AST changed the node type for string literals
-             * inside a JSX Element from `Literal` to `JSXText`. We
-             * provide a flag to support both types until `Literal`
-             * node type is deprecated in ESLint v5.
-             */
-            case SyntaxKind.JsxText: {
-                const start = node.getFullStart();
-                const end = node.getEnd();
-                if (this.options.useJSXTextNode) {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.JSXText,
-                        value: this.ast.text.slice(start, end),
-                        raw: this.ast.text.slice(start, end),
-                        range: [start, end],
-                    });
-                }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.Literal,
-                        value: this.ast.text.slice(start, end),
-                        raw: this.ast.text.slice(start, end),
-                        range: [start, end],
-                    });
-                }
-            }
-            case SyntaxKind.JsxSpreadAttribute:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.JSXSpreadAttribute,
-                    argument: this.convertChild(node.expression),
-                });
-            case SyntaxKind.QualifiedName: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSQualifiedName,
-                    left: this.convertChild(node.left),
-                    right: this.convertChild(node.right),
-                });
-            }
-            // TypeScript specific
-            case SyntaxKind.TypeReference: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSTypeReference,
-                    typeName: this.convertType(node.typeName),
-                    typeParameters: node.typeArguments
-                        ? this.convertTypeArgumentsToTypeParameters(node.typeArguments, node)
-                        : undefined,
-                });
-            }
-            case SyntaxKind.TypeParameter: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSTypeParameter,
-                    name: this.convertType(node.name),
-                    constraint: node.constraint
-                        ? this.convertType(node.constraint)
-                        : undefined,
-                    default: node.default ? this.convertType(node.default) : undefined,
-                });
-            }
-            case SyntaxKind.ThisType:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSThisType,
-                });
-            case SyntaxKind.AnyKeyword:
-            case SyntaxKind.BigIntKeyword:
-            case SyntaxKind.BooleanKeyword:
-            case SyntaxKind.NeverKeyword:
-            case SyntaxKind.NumberKeyword:
-            case SyntaxKind.ObjectKeyword:
-            case SyntaxKind.StringKeyword:
-            case SyntaxKind.SymbolKeyword:
-            case SyntaxKind.UnknownKeyword:
-            case SyntaxKind.VoidKeyword:
-            case SyntaxKind.UndefinedKeyword: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES[`TS${SyntaxKind[node.kind]}`],
-                });
-            }
-            case SyntaxKind.NonNullExpression: {
-                const nnExpr = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSNonNullExpression,
-                    expression: this.convertChild(node.expression),
-                });
-                return this.convertChainExpression(nnExpr, node);
-            }
-            case SyntaxKind.TypeLiteral: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSTypeLiteral,
-                    members: node.members.map(el => this.convertChild(el)),
-                });
-            }
-            case SyntaxKind.ArrayType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSArrayType,
-                    elementType: this.convertType(node.elementType),
-                });
-            }
-            case SyntaxKind.IndexedAccessType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSIndexedAccessType,
-                    objectType: this.convertType(node.objectType),
-                    indexType: this.convertType(node.indexType),
-                });
-            }
-            case SyntaxKind.ConditionalType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSConditionalType,
-                    checkType: this.convertType(node.checkType),
-                    extendsType: this.convertType(node.extendsType),
-                    trueType: this.convertType(node.trueType),
-                    falseType: this.convertType(node.falseType),
-                });
-            }
-            case SyntaxKind.TypeQuery: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSTypeQuery,
-                    exprName: this.convertType(node.exprName),
-                });
-            }
-            case SyntaxKind.MappedType: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSMappedType,
-                    typeParameter: this.convertType(node.typeParameter),
-                });
-                if (node.readonlyToken) {
-                    if (node.readonlyToken.kind === SyntaxKind.ReadonlyKeyword) {
-                        result.readonly = true;
-                    }
-                    else {
-                        result.readonly = node_utils_1.getTextForTokenKind(node.readonlyToken.kind);
-                    }
-                }
-                if (node.questionToken) {
-                    if (node.questionToken.kind === SyntaxKind.QuestionToken) {
-                        result.optional = true;
-                    }
-                    else {
-                        result.optional = node_utils_1.getTextForTokenKind(node.questionToken.kind);
-                    }
-                }
-                if (node.type) {
-                    result.typeAnnotation = this.convertType(node.type);
-                }
-                return result;
-            }
-            case SyntaxKind.ParenthesizedExpression:
-                return this.convertChild(node.expression, parent);
-            case SyntaxKind.TypeAliasDeclaration: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSTypeAliasDeclaration,
-                    id: this.convertChild(node.name),
-                    typeAnnotation: this.convertType(node.type),
-                });
-                if (node_utils_1.hasModifier(SyntaxKind.DeclareKeyword, node)) {
-                    result.declare = true;
-                }
-                // Process typeParameters
-                if (node.typeParameters) {
-                    result.typeParameters = this.convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters);
-                }
-                // check for exports
-                return this.fixExports(node, result);
-            }
-            case SyntaxKind.MethodSignature: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSMethodSignature,
-                    computed: node_utils_1.isComputedProperty(node.name),
-                    key: this.convertChild(node.name),
-                    params: this.convertParameters(node.parameters),
-                });
-                if (node_utils_1.isOptional(node)) {
-                    result.optional = true;
-                }
-                if (node.type) {
-                    result.returnType = this.convertTypeAnnotation(node.type, node);
-                }
-                if (node_utils_1.hasModifier(SyntaxKind.ReadonlyKeyword, node)) {
-                    result.readonly = true;
-                }
-                if (node.typeParameters) {
-                    result.typeParameters = this.convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters);
-                }
-                const accessibility = node_utils_1.getTSNodeAccessibility(node);
-                if (accessibility) {
-                    result.accessibility = accessibility;
-                }
-                if (node_utils_1.hasModifier(SyntaxKind.ExportKeyword, node)) {
-                    result.export = true;
-                }
-                if (node_utils_1.hasModifier(SyntaxKind.StaticKeyword, node)) {
-                    result.static = true;
-                }
-                return result;
-            }
-            case SyntaxKind.PropertySignature: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSPropertySignature,
-                    optional: node_utils_1.isOptional(node) || undefined,
-                    computed: node_utils_1.isComputedProperty(node.name),
-                    key: this.convertChild(node.name),
-                    typeAnnotation: node.type
-                        ? this.convertTypeAnnotation(node.type, node)
-                        : undefined,
-                    initializer: this.convertChild(node.initializer) || undefined,
-                    readonly: node_utils_1.hasModifier(SyntaxKind.ReadonlyKeyword, node) || undefined,
-                    static: node_utils_1.hasModifier(SyntaxKind.StaticKeyword, node) || undefined,
-                    export: node_utils_1.hasModifier(SyntaxKind.ExportKeyword, node) || undefined,
-                });
-                const accessibility = node_utils_1.getTSNodeAccessibility(node);
-                if (accessibility) {
-                    result.accessibility = accessibility;
-                }
-                return result;
-            }
-            case SyntaxKind.IndexSignature: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSIndexSignature,
-                    parameters: node.parameters.map(el => this.convertChild(el)),
-                });
-                if (node.type) {
-                    result.typeAnnotation = this.convertTypeAnnotation(node.type, node);
-                }
-                if (node_utils_1.hasModifier(SyntaxKind.ReadonlyKeyword, node)) {
-                    result.readonly = true;
-                }
-                const accessibility = node_utils_1.getTSNodeAccessibility(node);
-                if (accessibility) {
-                    result.accessibility = accessibility;
-                }
-                if (node_utils_1.hasModifier(SyntaxKind.ExportKeyword, node)) {
-                    result.export = true;
-                }
-                if (node_utils_1.hasModifier(SyntaxKind.StaticKeyword, node)) {
-                    result.static = true;
-                }
-                return result;
-            }
-            case SyntaxKind.ConstructorType:
-            case SyntaxKind.FunctionType:
-            case SyntaxKind.ConstructSignature:
-            case SyntaxKind.CallSignature: {
-                let type;
-                switch (node.kind) {
-                    case SyntaxKind.ConstructSignature:
-                        type = ts_estree_1.AST_NODE_TYPES.TSConstructSignatureDeclaration;
-                        break;
-                    case SyntaxKind.CallSignature:
-                        type = ts_estree_1.AST_NODE_TYPES.TSCallSignatureDeclaration;
-                        break;
-                    case SyntaxKind.FunctionType:
-                        type = ts_estree_1.AST_NODE_TYPES.TSFunctionType;
-                        break;
-                    case SyntaxKind.ConstructorType:
-                    default:
-                        type = ts_estree_1.AST_NODE_TYPES.TSConstructorType;
-                        break;
-                }
-                const result = this.createNode(node, {
-                    type: type,
-                    params: this.convertParameters(node.parameters),
-                });
-                if (node.type) {
-                    result.returnType = this.convertTypeAnnotation(node.type, node);
-                }
-                if (node.typeParameters) {
-                    result.typeParameters = this.convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters);
-                }
-                return result;
-            }
-            case SyntaxKind.ExpressionWithTypeArguments: {
-                const result = this.createNode(node, {
-                    type: parent && parent.kind === SyntaxKind.InterfaceDeclaration
-                        ? ts_estree_1.AST_NODE_TYPES.TSInterfaceHeritage
-                        : ts_estree_1.AST_NODE_TYPES.TSClassImplements,
-                    expression: this.convertChild(node.expression),
-                });
-                if (node.typeArguments) {
-                    result.typeParameters = this.convertTypeArgumentsToTypeParameters(node.typeArguments, node);
-                }
-                return result;
-            }
-            case SyntaxKind.InterfaceDeclaration: {
-                const interfaceHeritageClauses = (_j = node.heritageClauses) !== null && _j !== void 0 ? _j : [];
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSInterfaceDeclaration,
-                    body: this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.TSInterfaceBody,
-                        body: node.members.map(member => this.convertChild(member)),
-                        range: [node.members.pos - 1, node.end],
-                    }),
-                    id: this.convertChild(node.name),
-                });
-                if (node.typeParameters) {
-                    result.typeParameters = this.convertTSTypeParametersToTypeParametersDeclaration(node.typeParameters);
-                }
-                if (interfaceHeritageClauses.length > 0) {
-                    const interfaceExtends = [];
-                    const interfaceImplements = [];
-                    for (const heritageClause of interfaceHeritageClauses) {
-                        if (heritageClause.token === SyntaxKind.ExtendsKeyword) {
-                            for (const n of heritageClause.types) {
-                                interfaceExtends.push(this.convertChild(n, node));
-                            }
-                        }
-                        else {
-                            for (const n of heritageClause.types) {
-                                interfaceImplements.push(this.convertChild(n, node));
-                            }
-                        }
-                    }
-                    if (interfaceExtends.length) {
-                        result.extends = interfaceExtends;
-                    }
-                    if (interfaceImplements.length) {
-                        result.implements = interfaceImplements;
-                    }
-                }
-                if (node_utils_1.hasModifier(SyntaxKind.AbstractKeyword, node)) {
-                    result.abstract = true;
-                }
-                if (node_utils_1.hasModifier(SyntaxKind.DeclareKeyword, node)) {
-                    result.declare = true;
-                }
-                // check for exports
-                return this.fixExports(node, result);
-            }
-            case SyntaxKind.TypePredicate: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSTypePredicate,
-                    asserts: node.assertsModifier !== undefined,
-                    parameterName: this.convertChild(node.parameterName),
-                    typeAnnotation: null,
-                });
-                /**
-                 * Specific fix for type-guard location data
-                 */
-                if (node.type) {
-                    result.typeAnnotation = this.convertTypeAnnotation(node.type, node);
-                    result.typeAnnotation.loc = result.typeAnnotation.typeAnnotation.loc;
-                    result.typeAnnotation.range =
-                        result.typeAnnotation.typeAnnotation.range;
-                }
-                return result;
-            }
-            case SyntaxKind.ImportType:
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSImportType,
-                    isTypeOf: !!node.isTypeOf,
-                    parameter: this.convertChild(node.argument),
-                    qualifier: this.convertChild(node.qualifier),
-                    typeParameters: node.typeArguments
-                        ? this.convertTypeArgumentsToTypeParameters(node.typeArguments, node)
-                        : null,
-                });
-            case SyntaxKind.EnumDeclaration: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSEnumDeclaration,
-                    id: this.convertChild(node.name),
-                    members: node.members.map(el => this.convertChild(el)),
-                });
-                // apply modifiers first...
-                this.applyModifiersToResult(result, node.modifiers);
-                // ...then check for exports
-                return this.fixExports(node, result);
-            }
-            case SyntaxKind.EnumMember: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSEnumMember,
-                    id: this.convertChild(node.name),
-                });
-                if (node.initializer) {
-                    result.initializer = this.convertChild(node.initializer);
-                }
-                if (node.name.kind === ts.SyntaxKind.ComputedPropertyName) {
-                    result.computed = true;
-                }
-                return result;
-            }
-            case SyntaxKind.ModuleDeclaration: {
-                const result = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSModuleDeclaration,
-                    id: this.convertChild(node.name),
-                });
-                if (node.body) {
-                    result.body = this.convertChild(node.body);
-                }
-                // apply modifiers first...
-                this.applyModifiersToResult(result, node.modifiers);
-                if (node.flags & ts.NodeFlags.GlobalAugmentation) {
-                    result.global = true;
-                }
-                // ...then check for exports
-                return this.fixExports(node, result);
-            }
-            // TypeScript specific types
-            case SyntaxKind.ParenthesizedType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSParenthesizedType,
-                    typeAnnotation: this.convertType(node.type),
-                });
-            }
-            case SyntaxKind.UnionType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSUnionType,
-                    types: node.types.map(el => this.convertType(el)),
-                });
-            }
-            case SyntaxKind.IntersectionType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSIntersectionType,
-                    types: node.types.map(el => this.convertType(el)),
-                });
-            }
-            case SyntaxKind.AsExpression: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSAsExpression,
-                    expression: this.convertChild(node.expression),
-                    typeAnnotation: this.convertType(node.type),
-                });
-            }
-            case SyntaxKind.InferType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSInferType,
-                    typeParameter: this.convertType(node.typeParameter),
-                });
-            }
-            case SyntaxKind.LiteralType: {
-                if (version_check_1.typescriptVersionIsAtLeast['4.0'] &&
-                    node.literal.kind === SyntaxKind.NullKeyword) {
-                    // 4.0 started nesting null types inside a LiteralType node
-                    // but our AST is designed around the old way of null being a keyword
-                    return this.createNode(node.literal, {
-                        type: ts_estree_1.AST_NODE_TYPES.TSNullKeyword,
-                    });
-                }
-                else {
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.TSLiteralType,
-                        literal: this.convertType(node.literal),
-                    });
-                }
-            }
-            case SyntaxKind.TypeAssertionExpression: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSTypeAssertion,
-                    typeAnnotation: this.convertType(node.type),
-                    expression: this.convertChild(node.expression),
-                });
-            }
-            case SyntaxKind.ImportEqualsDeclaration: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSImportEqualsDeclaration,
-                    id: this.convertChild(node.name),
-                    moduleReference: this.convertChild(node.moduleReference),
-                    isExport: node_utils_1.hasModifier(SyntaxKind.ExportKeyword, node),
-                });
-            }
-            case SyntaxKind.ExternalModuleReference: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSExternalModuleReference,
-                    expression: this.convertChild(node.expression),
-                });
-            }
-            case SyntaxKind.NamespaceExportDeclaration: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSNamespaceExportDeclaration,
-                    id: this.convertChild(node.name),
-                });
-            }
-            case SyntaxKind.AbstractKeyword: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSAbstractKeyword,
-                });
-            }
-            // Tuple
-            case SyntaxKind.TupleType: {
-                // In TS 4.0, the `elementTypes` property was changed to `elements`.
-                // To support both at compile time, we cast to access the newer version
-                // if the former does not exist.
-                const elementTypes = 'elementTypes' in node
-                    ? node.elementTypes.map((el) => this.convertType(el))
-                    : node.elements.map((el) => this.convertType(el));
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSTupleType,
-                    elementTypes,
-                });
-            }
-            case SyntaxKind.NamedTupleMember: {
-                const member = this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSNamedTupleMember,
-                    elementType: this.convertType(node.type, node),
-                    label: this.convertChild(node.name, node),
-                    optional: node.questionToken != null,
-                });
-                if (node.dotDotDotToken) {
-                    // adjust the start to account for the "..."
-                    member.range[0] = member.label.range[0];
-                    member.loc.start = member.label.loc.start;
-                    return this.createNode(node, {
-                        type: ts_estree_1.AST_NODE_TYPES.TSRestType,
-                        typeAnnotation: member,
-                    });
-                }
-                return member;
-            }
-            case SyntaxKind.OptionalType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSOptionalType,
-                    typeAnnotation: this.convertType(node.type),
-                });
-            }
-            case SyntaxKind.RestType: {
-                return this.createNode(node, {
-                    type: ts_estree_1.AST_NODE_TYPES.TSRestType,
-                    typeAnnotation: this.convertType(node.type),
-                });
-            }
-            default:
-                return this.deeplyCopy(node);
-        }
-    }
-}
-exports.Converter = Converter;
-//# sourceMappingURL=convert.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert.js.map
deleted file mode 100644
index da4e64d..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/convert.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"convert.js","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts
deleted file mode 100644
index 85764ac..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import * as ts from 'typescript';
-interface DirectoryStructureHost {
-    readDirectory?(path: string, extensions?: ReadonlyArray<string>, exclude?: ReadonlyArray<string>, include?: ReadonlyArray<string>, depth?: number): string[];
-}
-interface CachedDirectoryStructureHost extends DirectoryStructureHost {
-    readDirectory(path: string, extensions?: ReadonlyArray<string>, exclude?: ReadonlyArray<string>, include?: ReadonlyArray<string>, depth?: number): string[];
-}
-interface WatchCompilerHostOfConfigFile<T extends ts.BuilderProgram> extends ts.WatchCompilerHostOfConfigFile<T> {
-    onCachedDirectoryStructureHostCreate(host: CachedDirectoryStructureHost): void;
-    extraFileExtensions?: readonly ts.FileExtensionInfo[];
-}
-export { WatchCompilerHostOfConfigFile };
-//# sourceMappingURL=WatchCompilerHostOfConfigFile.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts.map
deleted file mode 100644
index 408e42e..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"WatchCompilerHostOfConfigFile.d.ts","sourceRoot":"","sources":["../../src/create-program/WatchCompilerHostOfConfigFile.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAGjC,UAAU,sBAAsB;IAC9B,aAAa,CAAC,CACZ,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,EAAE,CAAC;CACb;AAGD,UAAU,4BAA6B,SAAQ,sBAAsB;IACnE,aAAa,CACX,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,EAC/B,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,EAAE,CAAC;CACb;AAGD,UAAU,6BAA6B,CAAC,CAAC,SAAS,EAAE,CAAC,cAAc,CACjE,SAAQ,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC3C,oCAAoC,CAClC,IAAI,EAAE,4BAA4B,GACjC,IAAI,CAAC;IACR,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAC;CACvD;AAED,OAAO,EAAE,6BAA6B,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.js
deleted file mode 100644
index dcb0712..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-// These types are internal to TS.
-// They have been trimmed down to only include the relevant bits
-// We use some special internal TS apis to help us do our parsing flexibly
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=WatchCompilerHostOfConfigFile.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.js.map
deleted file mode 100644
index 757e885..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/WatchCompilerHostOfConfigFile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"WatchCompilerHostOfConfigFile.js","sourceRoot":"","sources":["../../src/create-program/WatchCompilerHostOfConfigFile.ts"],"names":[],"mappings":";AAAA,kCAAkC;AAClC,gEAAgE;AAChE,0EAA0E"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.d.ts
deleted file mode 100644
index ea80b73..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Extra } from '../parser-options';
-import { ASTAndProgram } from './shared';
-/**
- * @param code The code of the file being linted
- * @param extra The config object
- * @param extra.tsconfigRootDir The root directory for relative tsconfig paths
- * @param extra.projects Provided tsconfig paths
- * @returns If found, returns the source file corresponding to the code and the containing program
- */
-declare function createDefaultProgram(code: string, extra: Extra): ASTAndProgram | undefined;
-export { createDefaultProgram };
-//# sourceMappingURL=createDefaultProgram.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.d.ts.map
deleted file mode 100644
index 2c26fe5..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"createDefaultProgram.d.ts","sourceRoot":"","sources":["../../src/create-program/createDefaultProgram.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EACL,aAAa,EAGd,MAAM,UAAU,CAAC;AAIlB;;;;;;GAMG;AACH,iBAAS,oBAAoB,CAC3B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,GACX,aAAa,GAAG,SAAS,CAqC3B;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js
deleted file mode 100644
index 9f60bc0..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js
+++ /dev/null
@@ -1,59 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.createDefaultProgram = void 0;
-const debug_1 = __importDefault(require("debug"));
-const path_1 = __importDefault(require("path"));
-const ts = __importStar(require("typescript"));
-const shared_1 = require("./shared");
-const log = debug_1.default('typescript-eslint:typescript-estree:createDefaultProgram');
-/**
- * @param code The code of the file being linted
- * @param extra The config object
- * @param extra.tsconfigRootDir The root directory for relative tsconfig paths
- * @param extra.projects Provided tsconfig paths
- * @returns If found, returns the source file corresponding to the code and the containing program
- */
-function createDefaultProgram(code, extra) {
-    log('Getting default program for: %s', extra.filePath || 'unnamed file');
-    if (!extra.projects || extra.projects.length !== 1) {
-        return undefined;
-    }
-    const tsconfigPath = shared_1.getTsconfigPath(extra.projects[0], extra);
-    const commandLine = ts.getParsedCommandLineOfConfigFile(tsconfigPath, shared_1.createDefaultCompilerOptionsFromExtra(extra), Object.assign(Object.assign({}, ts.sys), { onUnRecoverableConfigFileDiagnostic: () => { } }));
-    if (!commandLine) {
-        return undefined;
-    }
-    const compilerHost = ts.createCompilerHost(commandLine.options, 
-    /* setParentNodes */ true);
-    const oldReadFile = compilerHost.readFile;
-    compilerHost.readFile = (fileName) => path_1.default.normalize(fileName) === path_1.default.normalize(extra.filePath)
-        ? code
-        : oldReadFile(fileName);
-    const program = ts.createProgram([extra.filePath], commandLine.options, compilerHost);
-    const ast = program.getSourceFile(extra.filePath);
-    return ast && { ast, program };
-}
-exports.createDefaultProgram = createDefaultProgram;
-//# sourceMappingURL=createDefaultProgram.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js.map
deleted file mode 100644
index 7ae63e4..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createDefaultProgram.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"createDefaultProgram.js","sourceRoot":"","sources":["../../src/create-program/createDefaultProgram.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,gDAAwB;AACxB,+CAAiC;AAEjC,qCAIkB;AAElB,MAAM,GAAG,GAAG,eAAK,CAAC,0DAA0D,CAAC,CAAC;AAE9E;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,IAAY,EACZ,KAAY;IAEZ,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,QAAQ,IAAI,cAAc,CAAC,CAAC;IAEzE,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QAClD,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,YAAY,GAAG,wBAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE/D,MAAM,WAAW,GAAG,EAAE,CAAC,gCAAgC,CACrD,YAAY,EACZ,8CAAqC,CAAC,KAAK,CAAC,kCACvC,EAAE,CAAC,GAAG,KAAE,mCAAmC,EAAE,GAAG,EAAE,GAAE,CAAC,IAC3D,CAAC;IAEF,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,YAAY,GAAG,EAAE,CAAC,kBAAkB,CACxC,WAAW,CAAC,OAAO;IACnB,oBAAoB,CAAC,IAAI,CAC1B,CAAC;IACF,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC;IAC1C,YAAY,CAAC,QAAQ,GAAG,CAAC,QAAgB,EAAsB,EAAE,CAC/D,cAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,cAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC;QACzD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE5B,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAC9B,CAAC,KAAK,CAAC,QAAQ,CAAC,EAChB,WAAW,CAAC,OAAO,EACnB,YAAY,CACb,CAAC;IACF,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAElD,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC;AAEQ,oDAAoB"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.d.ts
deleted file mode 100644
index 26bc6e4..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { Extra } from '../parser-options';
-import { ASTAndProgram } from './shared';
-/**
- * @param code The code of the file being linted
- * @returns Returns a new source file and program corresponding to the linted code
- */
-declare function createIsolatedProgram(code: string, extra: Extra): ASTAndProgram;
-export { createIsolatedProgram };
-//# sourceMappingURL=createIsolatedProgram.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.d.ts.map
deleted file mode 100644
index d246fca..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"createIsolatedProgram.d.ts","sourceRoot":"","sources":["../../src/create-program/createIsolatedProgram.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EACL,aAAa,EAGd,MAAM,UAAU,CAAC;AAIlB;;;GAGG;AACH,iBAAS,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,aAAa,CAmExE;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js
deleted file mode 100644
index 88d4ba3..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js
+++ /dev/null
@@ -1,78 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.createIsolatedProgram = void 0;
-const debug_1 = __importDefault(require("debug"));
-const ts = __importStar(require("typescript"));
-const shared_1 = require("./shared");
-const log = debug_1.default('typescript-eslint:typescript-estree:createIsolatedProgram');
-/**
- * @param code The code of the file being linted
- * @returns Returns a new source file and program corresponding to the linted code
- */
-function createIsolatedProgram(code, extra) {
-    log('Getting isolated program in %s mode for: %s', extra.jsx ? 'TSX' : 'TS', extra.filePath);
-    const compilerHost = {
-        fileExists() {
-            return true;
-        },
-        getCanonicalFileName() {
-            return extra.filePath;
-        },
-        getCurrentDirectory() {
-            return '';
-        },
-        getDirectories() {
-            return [];
-        },
-        getDefaultLibFileName() {
-            return 'lib.d.ts';
-        },
-        // TODO: Support Windows CRLF
-        getNewLine() {
-            return '\n';
-        },
-        getSourceFile(filename) {
-            return ts.createSourceFile(filename, code, ts.ScriptTarget.Latest, 
-            /* setParentNodes */ true, shared_1.getScriptKind(extra, filename));
-        },
-        readFile() {
-            return undefined;
-        },
-        useCaseSensitiveFileNames() {
-            return true;
-        },
-        writeFile() {
-            return null;
-        },
-    };
-    const program = ts.createProgram([extra.filePath], Object.assign({ noResolve: true, target: ts.ScriptTarget.Latest, jsx: extra.jsx ? ts.JsxEmit.Preserve : undefined }, shared_1.createDefaultCompilerOptionsFromExtra(extra)), compilerHost);
-    const ast = program.getSourceFile(extra.filePath);
-    if (!ast) {
-        throw new Error('Expected an ast to be returned for the single-file isolated program.');
-    }
-    return { ast, program };
-}
-exports.createIsolatedProgram = createIsolatedProgram;
-//# sourceMappingURL=createIsolatedProgram.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js.map
deleted file mode 100644
index 75a6145..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createIsolatedProgram.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"createIsolatedProgram.js","sourceRoot":"","sources":["../../src/create-program/createIsolatedProgram.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,+CAAiC;AAEjC,qCAIkB;AAElB,MAAM,GAAG,GAAG,eAAK,CAAC,2DAA2D,CAAC,CAAC;AAE/E;;;GAGG;AACH,SAAS,qBAAqB,CAAC,IAAY,EAAE,KAAY;IACvD,GAAG,CACD,6CAA6C,EAC7C,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EACxB,KAAK,CAAC,QAAQ,CACf,CAAC;IAEF,MAAM,YAAY,GAAoB;QACpC,UAAU;YACR,OAAO,IAAI,CAAC;QACd,CAAC;QACD,oBAAoB;YAClB,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;QACD,mBAAmB;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,cAAc;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,qBAAqB;YACnB,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,6BAA6B;QAC7B,UAAU;YACR,OAAO,IAAI,CAAC;QACd,CAAC;QACD,aAAa,CAAC,QAAgB;YAC5B,OAAO,EAAE,CAAC,gBAAgB,CACxB,QAAQ,EACR,IAAI,EACJ,EAAE,CAAC,YAAY,CAAC,MAAM;YACtB,oBAAoB,CAAC,IAAI,EACzB,sBAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAC/B,CAAC;QACJ,CAAC;QACD,QAAQ;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,yBAAyB;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,SAAS;YACP,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;IAEF,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAC9B,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAEd,SAAS,EAAE,IAAI,EACf,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAC9B,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAC7C,8CAAqC,CAAC,KAAK,CAAC,GAEjD,YAAY,CACb,CAAC;IAEF,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,EAAE;QACR,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;KACH;IAED,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC;AAEQ,sDAAqB"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.d.ts
deleted file mode 100644
index 04a7e10..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { Extra } from '../parser-options';
-import { ASTAndProgram } from './shared';
-/**
- * @param code The code of the file being linted
- * @param createDefaultProgram True if the default program should be created
- * @param extra The config object
- * @returns If found, returns the source file corresponding to the code and the containing program
- */
-declare function createProjectProgram(code: string, createDefaultProgram: boolean, extra: Extra): ASTAndProgram | undefined;
-export { createProjectProgram };
-//# sourceMappingURL=createProjectProgram.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.d.ts.map
deleted file mode 100644
index 1838090..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"createProjectProgram.d.ts","sourceRoot":"","sources":["../../src/create-program/createProjectProgram.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAazC;;;;;GAKG;AACH,iBAAS,oBAAoB,CAC3B,IAAI,EAAE,MAAM,EACZ,oBAAoB,EAAE,OAAO,EAC7B,KAAK,EAAE,KAAK,GACX,aAAa,GAAG,SAAS,CAyE3B;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js
deleted file mode 100644
index 917330b..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js
+++ /dev/null
@@ -1,75 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.createProjectProgram = void 0;
-const debug_1 = __importDefault(require("debug"));
-const path_1 = __importDefault(require("path"));
-const createWatchProgram_1 = require("./createWatchProgram");
-const node_utils_1 = require("../node-utils");
-const log = debug_1.default('typescript-eslint:typescript-estree:createProjectProgram');
-const DEFAULT_EXTRA_FILE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'];
-function getExtension(fileName) {
-    if (!fileName) {
-        return null;
-    }
-    return fileName.endsWith('.d.ts') ? '.d.ts' : path_1.default.extname(fileName);
-}
-/**
- * @param code The code of the file being linted
- * @param createDefaultProgram True if the default program should be created
- * @param extra The config object
- * @returns If found, returns the source file corresponding to the code and the containing program
- */
-function createProjectProgram(code, createDefaultProgram, extra) {
-    log('Creating project program for: %s', extra.filePath);
-    const astAndProgram = node_utils_1.firstDefined(createWatchProgram_1.getProgramsForProjects(code, extra.filePath, extra), currentProgram => {
-        const ast = currentProgram.getSourceFile(extra.filePath);
-        // working around https://github.com/typescript-eslint/typescript-eslint/issues/1573
-        const expectedExt = getExtension(extra.filePath);
-        const returnedExt = getExtension(ast === null || ast === void 0 ? void 0 : ast.fileName);
-        if (expectedExt !== returnedExt) {
-            return;
-        }
-        return ast && { ast, program: currentProgram };
-    });
-    if (!astAndProgram && !createDefaultProgram) {
-        // the file was either not matched within the tsconfig, or the extension wasn't expected
-        const errorLines = [
-            '"parserOptions.project" has been set for @typescript-eslint/parser.',
-            `The file does not match your project config: ${path_1.default.relative(extra.tsconfigRootDir || process.cwd(), extra.filePath)}.`,
-        ];
-        let hasMatchedAnError = false;
-        const extraFileExtensions = extra.extraFileExtensions || [];
-        extraFileExtensions.forEach(extraExtension => {
-            if (!extraExtension.startsWith('.')) {
-                errorLines.push(`Found unexpected extension "${extraExtension}" specified with the "extraFileExtensions" option. Did you mean ".${extraExtension}"?`);
-            }
-            if (DEFAULT_EXTRA_FILE_EXTENSIONS.includes(extraExtension)) {
-                errorLines.push(`You unnecessarily included the extension "${extraExtension}" with the "extraFileExtensions" option. This extension is already handled by the parser by default.`);
-            }
-        });
-        const fileExtension = path_1.default.extname(extra.filePath);
-        if (!DEFAULT_EXTRA_FILE_EXTENSIONS.includes(fileExtension)) {
-            const nonStandardExt = `The extension for the file (${fileExtension}) is non-standard`;
-            if (extraFileExtensions.length > 0) {
-                if (!extraFileExtensions.includes(fileExtension)) {
-                    errorLines.push(`${nonStandardExt}. It should be added to your existing "parserOptions.extraFileExtensions".`);
-                    hasMatchedAnError = true;
-                }
-            }
-            else {
-                errorLines.push(`${nonStandardExt}. You should add "parserOptions.extraFileExtensions" to your config.`);
-                hasMatchedAnError = true;
-            }
-        }
-        if (!hasMatchedAnError) {
-            errorLines.push('The file must be included in at least one of the projects provided.');
-        }
-        throw new Error(errorLines.join('\n'));
-    }
-    return astAndProgram;
-}
-exports.createProjectProgram = createProjectProgram;
-//# sourceMappingURL=createProjectProgram.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js.map
deleted file mode 100644
index a39bb00..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createProjectProgram.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"createProjectProgram.js","sourceRoot":"","sources":["../../src/create-program/createProjectProgram.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.d.ts
deleted file mode 100644
index 340cdd9..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import * as ts from 'typescript';
-import { Extra } from '../parser-options';
-declare function createSourceFile(code: string, extra: Extra): ts.SourceFile;
-export { createSourceFile };
-//# sourceMappingURL=createSourceFile.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.d.ts.map
deleted file mode 100644
index 68f375d..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"createSourceFile.d.ts","sourceRoot":"","sources":["../../src/create-program/createSourceFile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAK1C,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,CAAC,UAAU,CAcnE;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js
deleted file mode 100644
index 910a1fa..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js
+++ /dev/null
@@ -1,36 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.createSourceFile = void 0;
-const debug_1 = __importDefault(require("debug"));
-const ts = __importStar(require("typescript"));
-const shared_1 = require("./shared");
-const log = debug_1.default('typescript-eslint:typescript-estree:createSourceFile');
-function createSourceFile(code, extra) {
-    log('Getting AST without type information in %s mode for: %s', extra.jsx ? 'TSX' : 'TS', extra.filePath);
-    return ts.createSourceFile(extra.filePath, code, ts.ScriptTarget.Latest, 
-    /* setParentNodes */ true, shared_1.getScriptKind(extra));
-}
-exports.createSourceFile = createSourceFile;
-//# sourceMappingURL=createSourceFile.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js.map
deleted file mode 100644
index 693f43c..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createSourceFile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"createSourceFile.js","sourceRoot":"","sources":["../../src/create-program/createSourceFile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,+CAAiC;AAEjC,qCAAyC;AAEzC,MAAM,GAAG,GAAG,eAAK,CAAC,sDAAsD,CAAC,CAAC;AAE1E,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAAY;IAClD,GAAG,CACD,yDAAyD,EACzD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EACxB,KAAK,CAAC,QAAQ,CACf,CAAC;IAEF,OAAO,EAAE,CAAC,gBAAgB,CACxB,KAAK,CAAC,QAAQ,EACd,IAAI,EACJ,EAAE,CAAC,YAAY,CAAC,MAAM;IACtB,oBAAoB,CAAC,IAAI,EACzB,sBAAa,CAAC,KAAK,CAAC,CACrB,CAAC;AACJ,CAAC;AAEQ,4CAAgB"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts
deleted file mode 100644
index af73e0c..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as ts from 'typescript';
-import { Extra } from '../parser-options';
-/**
- * Clear all of the parser caches.
- * This should only be used in testing to ensure the parser is clean between tests.
- */
-declare function clearCaches(): void;
-/**
- * Calculate project environments using options provided by consumer and paths from config
- * @param code The code being linted
- * @param filePathIn The path of the file being parsed
- * @param extra.tsconfigRootDir The root directory for relative tsconfig paths
- * @param extra.projects Provided tsconfig paths
- * @returns The programs corresponding to the supplied tsconfig paths
- */
-declare function getProgramsForProjects(code: string, filePathIn: string, extra: Extra): ts.Program[];
-declare function createWatchProgram(tsconfigPath: string, extra: Extra): ts.WatchOfConfigFile<ts.BuilderProgram>;
-export { clearCaches, createWatchProgram, getProgramsForProjects };
-//# sourceMappingURL=createWatchProgram.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts.map
deleted file mode 100644
index 5e6bce8..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"createWatchProgram.d.ts","sourceRoot":"","sources":["../../src/create-program/createWatchProgram.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AA6C1C;;;GAGG;AACH,iBAAS,WAAW,IAAI,IAAI,CAO3B;AA2DD;;;;;;;GAOG;AACH,iBAAS,sBAAsB,CAC7B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,KAAK,GACX,EAAE,CAAC,OAAO,EAAE,CAgGd;AAMD,iBAAS,kBAAkB,CACzB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,KAAK,GACX,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,cAAc,CAAC,CAwHzC;AAoJD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js
deleted file mode 100644
index fe03663..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js
+++ /dev/null
@@ -1,388 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.getProgramsForProjects = exports.createWatchProgram = exports.clearCaches = void 0;
-const debug_1 = __importDefault(require("debug"));
-const fs_1 = __importDefault(require("fs"));
-const semver_1 = __importDefault(require("semver"));
-const ts = __importStar(require("typescript"));
-const shared_1 = require("./shared");
-const log = debug_1.default('typescript-eslint:typescript-estree:createWatchProgram');
-/**
- * Maps tsconfig paths to their corresponding file contents and resulting watches
- */
-const knownWatchProgramMap = new Map();
-/**
- * Maps file/folder paths to their set of corresponding watch callbacks
- * There may be more than one per file/folder if a file/folder is shared between projects
- */
-const fileWatchCallbackTrackingMap = new Map();
-const folderWatchCallbackTrackingMap = new Map();
-/**
- * Stores the list of known files for each program
- */
-const programFileListCache = new Map();
-/**
- * Caches the last modified time of the tsconfig files
- */
-const tsconfigLastModifiedTimestampCache = new Map();
-const parsedFilesSeenHash = new Map();
-/**
- * Clear all of the parser caches.
- * This should only be used in testing to ensure the parser is clean between tests.
- */
-function clearCaches() {
-    knownWatchProgramMap.clear();
-    fileWatchCallbackTrackingMap.clear();
-    folderWatchCallbackTrackingMap.clear();
-    parsedFilesSeenHash.clear();
-    programFileListCache.clear();
-    tsconfigLastModifiedTimestampCache.clear();
-}
-exports.clearCaches = clearCaches;
-function saveWatchCallback(trackingMap) {
-    return (fileName, callback) => {
-        const normalizedFileName = shared_1.getCanonicalFileName(fileName);
-        const watchers = (() => {
-            let watchers = trackingMap.get(normalizedFileName);
-            if (!watchers) {
-                watchers = new Set();
-                trackingMap.set(normalizedFileName, watchers);
-            }
-            return watchers;
-        })();
-        watchers.add(callback);
-        return {
-            close: () => {
-                watchers.delete(callback);
-            },
-        };
-    };
-}
-/**
- * Holds information about the file currently being linted
- */
-const currentLintOperationState = {
-    code: '',
-    filePath: '',
-};
-/**
- * Appropriately report issues found when reading a config file
- * @param diagnostic The diagnostic raised when creating a program
- */
-function diagnosticReporter(diagnostic) {
-    throw new Error(ts.flattenDiagnosticMessageText(diagnostic.messageText, ts.sys.newLine));
-}
-/**
- * Hash content for compare content.
- * @param content hashed contend
- * @returns hashed result
- */
-function createHash(content) {
-    var _a;
-    // No ts.sys in browser environments.
-    if ((_a = ts.sys) === null || _a === void 0 ? void 0 : _a.createHash) {
-        return ts.sys.createHash(content);
-    }
-    return content;
-}
-/**
- * Calculate project environments using options provided by consumer and paths from config
- * @param code The code being linted
- * @param filePathIn The path of the file being parsed
- * @param extra.tsconfigRootDir The root directory for relative tsconfig paths
- * @param extra.projects Provided tsconfig paths
- * @returns The programs corresponding to the supplied tsconfig paths
- */
-function getProgramsForProjects(code, filePathIn, extra) {
-    const filePath = shared_1.getCanonicalFileName(filePathIn);
-    const results = [];
-    // preserve reference to code and file being linted
-    currentLintOperationState.code = code;
-    currentLintOperationState.filePath = filePath;
-    // Update file version if necessary
-    const fileWatchCallbacks = fileWatchCallbackTrackingMap.get(filePath);
-    const codeHash = createHash(code);
-    if (parsedFilesSeenHash.get(filePath) !== codeHash &&
-        fileWatchCallbacks &&
-        fileWatchCallbacks.size > 0) {
-        fileWatchCallbacks.forEach(cb => cb(filePath, ts.FileWatcherEventKind.Changed));
-    }
-    /*
-     * before we go into the process of attempting to find and update every program
-     * see if we know of a program that contains this file
-     */
-    for (const rawTsconfigPath of extra.projects) {
-        const tsconfigPath = shared_1.getTsconfigPath(rawTsconfigPath, extra);
-        const existingWatch = knownWatchProgramMap.get(tsconfigPath);
-        if (!existingWatch) {
-            continue;
-        }
-        let fileList = programFileListCache.get(tsconfigPath);
-        let updatedProgram = null;
-        if (!fileList) {
-            updatedProgram = existingWatch.getProgram().getProgram();
-            fileList = new Set(updatedProgram.getRootFileNames().map(f => shared_1.getCanonicalFileName(f)));
-            programFileListCache.set(tsconfigPath, fileList);
-        }
-        if (fileList.has(filePath)) {
-            log('Found existing program for file. %s', filePath);
-            updatedProgram = updatedProgram !== null && updatedProgram !== void 0 ? updatedProgram : existingWatch.getProgram().getProgram();
-            // sets parent pointers in source files
-            updatedProgram.getTypeChecker();
-            return [updatedProgram];
-        }
-    }
-    log('File did not belong to any existing programs, moving to create/update. %s', filePath);
-    /*
-     * We don't know of a program that contains the file, this means that either:
-     * - the required program hasn't been created yet, or
-     * - the file is new/renamed, and the program hasn't been updated.
-     */
-    for (const rawTsconfigPath of extra.projects) {
-        const tsconfigPath = shared_1.getTsconfigPath(rawTsconfigPath, extra);
-        const existingWatch = knownWatchProgramMap.get(tsconfigPath);
-        if (existingWatch) {
-            const updatedProgram = maybeInvalidateProgram(existingWatch, filePath, tsconfigPath);
-            if (!updatedProgram) {
-                continue;
-            }
-            // sets parent pointers in source files
-            updatedProgram.getTypeChecker();
-            results.push(updatedProgram);
-            continue;
-        }
-        const programWatch = createWatchProgram(tsconfigPath, extra);
-        const program = programWatch.getProgram().getProgram();
-        // cache watch program and return current program
-        knownWatchProgramMap.set(tsconfigPath, programWatch);
-        // sets parent pointers in source files
-        program.getTypeChecker();
-        results.push(program);
-    }
-    return results;
-}
-exports.getProgramsForProjects = getProgramsForProjects;
-const isRunningNoTimeoutFix = semver_1.default.satisfies(ts.version, '>=3.9.0-beta', {
-    includePrerelease: true,
-});
-function createWatchProgram(tsconfigPath, extra) {
-    log('Creating watch program for %s.', tsconfigPath);
-    // create compiler host
-    const watchCompilerHost = ts.createWatchCompilerHost(tsconfigPath, shared_1.createDefaultCompilerOptionsFromExtra(extra), ts.sys, ts.createAbstractBuilder, diagnosticReporter, 
-    /*reportWatchStatus*/ () => { });
-    // ensure readFile reads the code being linted instead of the copy on disk
-    const oldReadFile = watchCompilerHost.readFile;
-    watchCompilerHost.readFile = (filePathIn, encoding) => {
-        const filePath = shared_1.getCanonicalFileName(filePathIn);
-        const fileContent = filePath === currentLintOperationState.filePath
-            ? currentLintOperationState.code
-            : oldReadFile(filePath, encoding);
-        if (fileContent !== undefined) {
-            parsedFilesSeenHash.set(filePath, createHash(fileContent));
-        }
-        return fileContent;
-    };
-    // ensure process reports error on failure instead of exiting process immediately
-    watchCompilerHost.onUnRecoverableConfigFileDiagnostic = diagnosticReporter;
-    // ensure process doesn't emit programs
-    watchCompilerHost.afterProgramCreate = (program) => {
-        // report error if there are any errors in the config file
-        const configFileDiagnostics = program
-            .getConfigFileParsingDiagnostics()
-            .filter(diag => diag.category === ts.DiagnosticCategory.Error && diag.code !== 18003);
-        if (configFileDiagnostics.length > 0) {
-            diagnosticReporter(configFileDiagnostics[0]);
-        }
-    };
-    /*
-     * From the CLI, the file watchers won't matter, as the files will be parsed once and then forgotten.
-     * When running from an IDE, these watchers will let us tell typescript about changes.
-     *
-     * ESLint IDE plugins will send us unfinished file content as the user types (before it's saved to disk).
-     * We use the file watchers to tell typescript about this latest file content.
-     *
-     * When files are created (or renamed), we won't know about them because we have no filesystem watchers attached.
-     * We use the folder watchers to tell typescript it needs to go and find new files in the project folders.
-     */
-    watchCompilerHost.watchFile = saveWatchCallback(fileWatchCallbackTrackingMap);
-    watchCompilerHost.watchDirectory = saveWatchCallback(folderWatchCallbackTrackingMap);
-    // allow files with custom extensions to be included in program (uses internal ts api)
-    const oldOnDirectoryStructureHostCreate = watchCompilerHost.onCachedDirectoryStructureHostCreate;
-    watchCompilerHost.onCachedDirectoryStructureHostCreate = (host) => {
-        const oldReadDirectory = host.readDirectory;
-        host.readDirectory = (path, extensions, exclude, include, depth) => oldReadDirectory(path, !extensions ? undefined : extensions.concat(extra.extraFileExtensions), exclude, include, depth);
-        oldOnDirectoryStructureHostCreate(host);
-    };
-    // This works only on 3.9
-    watchCompilerHost.extraFileExtensions = extra.extraFileExtensions.map(extension => ({
-        extension,
-        isMixedContent: true,
-        scriptKind: ts.ScriptKind.Deferred,
-    }));
-    watchCompilerHost.trace = log;
-    // Since we don't want to asynchronously update program we want to disable timeout methods
-    // So any changes in the program will be delayed and updated when getProgram is called on watch
-    let callback;
-    if (isRunningNoTimeoutFix) {
-        watchCompilerHost.setTimeout = undefined;
-        watchCompilerHost.clearTimeout = undefined;
-    }
-    else {
-        log('Running without timeout fix');
-        // But because of https://github.com/microsoft/TypeScript/pull/37308 we cannot just set it to undefined
-        // instead save it and call before getProgram is called
-        watchCompilerHost.setTimeout = (cb, _ms, ...args) => {
-            callback = cb.bind(/*this*/ undefined, ...args);
-            return callback;
-        };
-        watchCompilerHost.clearTimeout = () => {
-            callback = undefined;
-        };
-    }
-    const watch = ts.createWatchProgram(watchCompilerHost);
-    if (!isRunningNoTimeoutFix) {
-        const originalGetProgram = watch.getProgram;
-        watch.getProgram = () => {
-            if (callback) {
-                callback();
-            }
-            callback = undefined;
-            return originalGetProgram.call(watch);
-        };
-    }
-    return watch;
-}
-exports.createWatchProgram = createWatchProgram;
-function hasTSConfigChanged(tsconfigPath) {
-    const stat = fs_1.default.statSync(tsconfigPath);
-    const lastModifiedAt = stat.mtimeMs;
-    const cachedLastModifiedAt = tsconfigLastModifiedTimestampCache.get(tsconfigPath);
-    tsconfigLastModifiedTimestampCache.set(tsconfigPath, lastModifiedAt);
-    if (cachedLastModifiedAt === undefined) {
-        return false;
-    }
-    return Math.abs(cachedLastModifiedAt - lastModifiedAt) > Number.EPSILON;
-}
-function maybeInvalidateProgram(existingWatch, filePath, tsconfigPath) {
-    /*
-     * By calling watchProgram.getProgram(), it will trigger a resync of the program based on
-     * whatever new file content we've given it from our input.
-     */
-    let updatedProgram = existingWatch.getProgram().getProgram();
-    // In case this change causes problems in larger real world codebases
-    // Provide an escape hatch so people don't _have_ to revert to an older version
-    if (process.env.TSESTREE_NO_INVALIDATION === 'true') {
-        return updatedProgram;
-    }
-    if (hasTSConfigChanged(tsconfigPath)) {
-        /*
-         * If the stat of the tsconfig has changed, that could mean the include/exclude/files lists has changed
-         * We need to make sure typescript knows this so it can update appropriately
-         */
-        log('tsconfig has changed - triggering program update. %s', tsconfigPath);
-        fileWatchCallbackTrackingMap
-            .get(tsconfigPath)
-            .forEach(cb => cb(tsconfigPath, ts.FileWatcherEventKind.Changed));
-        // tsconfig change means that the file list more than likely changed, so clear the cache
-        programFileListCache.delete(tsconfigPath);
-    }
-    let sourceFile = updatedProgram.getSourceFile(filePath);
-    if (sourceFile) {
-        return updatedProgram;
-    }
-    /*
-     * Missing source file means our program's folder structure might be out of date.
-     * So we need to tell typescript it needs to update the correct folder.
-     */
-    log('File was not found in program - triggering folder update. %s', filePath);
-    // Find the correct directory callback by climbing the folder tree
-    const currentDir = shared_1.canonicalDirname(filePath);
-    let current = null;
-    let next = currentDir;
-    let hasCallback = false;
-    while (current !== next) {
-        current = next;
-        const folderWatchCallbacks = folderWatchCallbackTrackingMap.get(current);
-        if (folderWatchCallbacks) {
-            folderWatchCallbacks.forEach(cb => {
-                if (currentDir !== current) {
-                    cb(currentDir, ts.FileWatcherEventKind.Changed);
-                }
-                cb(current, ts.FileWatcherEventKind.Changed);
-            });
-            hasCallback = true;
-        }
-        next = shared_1.canonicalDirname(current);
-    }
-    if (!hasCallback) {
-        /*
-         * No callback means the paths don't matchup - so no point returning any program
-         * this will signal to the caller to skip this program
-         */
-        log('No callback found for file, not part of this program. %s', filePath);
-        return null;
-    }
-    // directory update means that the file list more than likely changed, so clear the cache
-    programFileListCache.delete(tsconfigPath);
-    // force the immediate resync
-    updatedProgram = existingWatch.getProgram().getProgram();
-    sourceFile = updatedProgram.getSourceFile(filePath);
-    if (sourceFile) {
-        return updatedProgram;
-    }
-    /*
-     * At this point we're in one of two states:
-     * - The file isn't supposed to be in this program due to exclusions
-     * - The file is new, and was renamed from an old, included filename
-     *
-     * For the latter case, we need to tell typescript that the old filename is now deleted
-     */
-    log('File was still not found in program after directory update - checking file deletions. %s', filePath);
-    const rootFilenames = updatedProgram.getRootFileNames();
-    // use find because we only need to "delete" one file to cause typescript to do a full resync
-    const deletedFile = rootFilenames.find(file => !fs_1.default.existsSync(file));
-    if (!deletedFile) {
-        // There are no deleted files, so it must be the former case of the file not belonging to this program
-        return null;
-    }
-    const fileWatchCallbacks = fileWatchCallbackTrackingMap.get(shared_1.getCanonicalFileName(deletedFile));
-    if (!fileWatchCallbacks) {
-        // shouldn't happen, but just in case
-        log('Could not find watch callbacks for root file. %s', deletedFile);
-        return updatedProgram;
-    }
-    log('Marking file as deleted. %s', deletedFile);
-    fileWatchCallbacks.forEach(cb => cb(deletedFile, ts.FileWatcherEventKind.Deleted));
-    // deleted files means that the file list _has_ changed, so clear the cache
-    programFileListCache.delete(tsconfigPath);
-    updatedProgram = existingWatch.getProgram().getProgram();
-    sourceFile = updatedProgram.getSourceFile(filePath);
-    if (sourceFile) {
-        return updatedProgram;
-    }
-    log('File was still not found in program after deletion check, assuming it is not part of this program. %s', filePath);
-    return null;
-}
-//# sourceMappingURL=createWatchProgram.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js.map
deleted file mode 100644
index 326e15a..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/createWatchProgram.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"createWatchProgram.js","sourceRoot":"","sources":["../../src/create-program/createWatchProgram.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts
deleted file mode 100644
index ea10a48..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import * as ts from 'typescript';
-import { Extra } from '../parser-options';
-interface ASTAndProgram {
-    ast: ts.SourceFile;
-    program: ts.Program;
-}
-declare function createDefaultCompilerOptionsFromExtra(extra: Extra): ts.CompilerOptions;
-declare type CanonicalPath = string & {
-    __brand: unknown;
-};
-declare function getCanonicalFileName(filePath: string): CanonicalPath;
-declare function ensureAbsolutePath(p: string, extra: Extra): string;
-declare function getTsconfigPath(tsconfigPath: string, extra: Extra): CanonicalPath;
-declare function canonicalDirname(p: CanonicalPath): CanonicalPath;
-declare function getScriptKind(extra: Extra, filePath?: string): ts.ScriptKind;
-export { ASTAndProgram, canonicalDirname, CanonicalPath, createDefaultCompilerOptionsFromExtra, ensureAbsolutePath, getCanonicalFileName, getScriptKind, getTsconfigPath, };
-//# sourceMappingURL=shared.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts.map
deleted file mode 100644
index 3e22bc4..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/create-program/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,UAAU,aAAa;IACrB,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC;IACnB,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;CACrB;AAkBD,iBAAS,qCAAqC,CAC5C,KAAK,EAAE,KAAK,GACX,EAAE,CAAC,eAAe,CASpB;AAGD,aAAK,aAAa,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AASnD,iBAAS,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAM7D;AAED,iBAAS,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAI3D;AAED,iBAAS,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,aAAa,CAE1E;AAED,iBAAS,gBAAgB,CAAC,CAAC,EAAE,aAAa,GAAG,aAAa,CAEzD;AAED,iBAAS,aAAa,CACpB,KAAK,EAAE,KAAK,EACZ,QAAQ,GAAE,MAAuB,GAChC,EAAE,CAAC,UAAU,CAwBf;AAED,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,qCAAqC,EACrC,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js
deleted file mode 100644
index 5e8c198..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js
+++ /dev/null
@@ -1,98 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.getTsconfigPath = exports.getScriptKind = exports.getCanonicalFileName = exports.ensureAbsolutePath = exports.createDefaultCompilerOptionsFromExtra = exports.canonicalDirname = void 0;
-const path_1 = __importDefault(require("path"));
-const ts = __importStar(require("typescript"));
-/**
- * Default compiler options for program generation from single root file
- */
-const DEFAULT_COMPILER_OPTIONS = {
-    allowNonTsExtensions: true,
-    allowJs: true,
-    checkJs: true,
-    noEmit: true,
-    // extendedDiagnostics: true,
-    /**
-     * Flags required to make no-unused-vars work
-     */
-    noUnusedLocals: true,
-    noUnusedParameters: true,
-};
-function createDefaultCompilerOptionsFromExtra(extra) {
-    if (extra.debugLevel.has('typescript')) {
-        return Object.assign(Object.assign({}, DEFAULT_COMPILER_OPTIONS), { extendedDiagnostics: true });
-    }
-    return DEFAULT_COMPILER_OPTIONS;
-}
-exports.createDefaultCompilerOptionsFromExtra = createDefaultCompilerOptionsFromExtra;
-// typescript doesn't provide a ts.sys implementation for browser environments
-const useCaseSensitiveFileNames = ts.sys !== undefined ? ts.sys.useCaseSensitiveFileNames : true;
-const correctPathCasing = useCaseSensitiveFileNames
-    ? (filePath) => filePath
-    : (filePath) => filePath.toLowerCase();
-function getCanonicalFileName(filePath) {
-    let normalized = path_1.default.normalize(filePath);
-    if (normalized.endsWith(path_1.default.sep)) {
-        normalized = normalized.substr(0, normalized.length - 1);
-    }
-    return correctPathCasing(normalized);
-}
-exports.getCanonicalFileName = getCanonicalFileName;
-function ensureAbsolutePath(p, extra) {
-    return path_1.default.isAbsolute(p)
-        ? p
-        : path_1.default.join(extra.tsconfigRootDir || process.cwd(), p);
-}
-exports.ensureAbsolutePath = ensureAbsolutePath;
-function getTsconfigPath(tsconfigPath, extra) {
-    return getCanonicalFileName(ensureAbsolutePath(tsconfigPath, extra));
-}
-exports.getTsconfigPath = getTsconfigPath;
-function canonicalDirname(p) {
-    return path_1.default.dirname(p);
-}
-exports.canonicalDirname = canonicalDirname;
-function getScriptKind(extra, filePath = extra.filePath) {
-    const extension = path_1.default.extname(filePath).toLowerCase();
-    // note - we respect the user's extension when it is known  we could override it and force it to match their
-    // jsx setting, but that could create weird situations where we throw parse errors when TSC doesn't
-    switch (extension) {
-        case '.ts':
-            return ts.ScriptKind.TS;
-        case '.tsx':
-            return ts.ScriptKind.TSX;
-        case '.js':
-            return ts.ScriptKind.JS;
-        case '.jsx':
-            return ts.ScriptKind.JSX;
-        case '.json':
-            return ts.ScriptKind.JSON;
-        default:
-            // unknown extension, force typescript to ignore the file extension, and respect the user's setting
-            return extra.jsx ? ts.ScriptKind.TSX : ts.ScriptKind.TS;
-    }
-}
-exports.getScriptKind = getScriptKind;
-//# sourceMappingURL=shared.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js.map
deleted file mode 100644
index 30f05b2..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/create-program/shared.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts
deleted file mode 100644
index e9b5d41..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts
+++ /dev/null
@@ -1,282 +0,0 @@
-import * as ts from 'typescript';
-import { AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree } from './ts-estree';
-declare const SyntaxKind: typeof ts.SyntaxKind;
-interface TokenToText {
-    [SyntaxKind.OpenBraceToken]: '{';
-    [SyntaxKind.CloseBraceToken]: '}';
-    [SyntaxKind.OpenParenToken]: '(';
-    [SyntaxKind.CloseParenToken]: ')';
-    [SyntaxKind.OpenBracketToken]: '[';
-    [SyntaxKind.CloseBracketToken]: ']';
-    [SyntaxKind.DotToken]: '.';
-    [SyntaxKind.DotDotDotToken]: '...';
-    [SyntaxKind.SemicolonToken]: ';';
-    [SyntaxKind.CommaToken]: ',';
-    [SyntaxKind.LessThanToken]: '<';
-    [SyntaxKind.GreaterThanToken]: '>';
-    [SyntaxKind.LessThanEqualsToken]: '<=';
-    [SyntaxKind.GreaterThanEqualsToken]: '>=';
-    [SyntaxKind.EqualsEqualsToken]: '==';
-    [SyntaxKind.ExclamationEqualsToken]: '!=';
-    [SyntaxKind.EqualsEqualsEqualsToken]: '===';
-    [SyntaxKind.InstanceOfKeyword]: 'instanceof';
-    [SyntaxKind.ExclamationEqualsEqualsToken]: '!==';
-    [SyntaxKind.EqualsGreaterThanToken]: '=>';
-    [SyntaxKind.PlusToken]: '+';
-    [SyntaxKind.MinusToken]: '-';
-    [SyntaxKind.AsteriskToken]: '*';
-    [SyntaxKind.AsteriskAsteriskToken]: '**';
-    [SyntaxKind.SlashToken]: '/';
-    [SyntaxKind.PercentToken]: '%';
-    [SyntaxKind.PlusPlusToken]: '++';
-    [SyntaxKind.MinusMinusToken]: '--';
-    [SyntaxKind.LessThanLessThanToken]: '<<';
-    [SyntaxKind.LessThanSlashToken]: '</';
-    [SyntaxKind.GreaterThanGreaterThanToken]: '>>';
-    [SyntaxKind.GreaterThanGreaterThanGreaterThanToken]: '>>>';
-    [SyntaxKind.AmpersandToken]: '&';
-    [SyntaxKind.BarToken]: '|';
-    [SyntaxKind.CaretToken]: '^';
-    [SyntaxKind.ExclamationToken]: '!';
-    [SyntaxKind.TildeToken]: '~';
-    [SyntaxKind.AmpersandAmpersandToken]: '&&';
-    [SyntaxKind.BarBarToken]: '||';
-    [SyntaxKind.QuestionToken]: '?';
-    [SyntaxKind.ColonToken]: ':';
-    [SyntaxKind.EqualsToken]: '=';
-    [SyntaxKind.PlusEqualsToken]: '+=';
-    [SyntaxKind.MinusEqualsToken]: '-=';
-    [SyntaxKind.AsteriskEqualsToken]: '*=';
-    [SyntaxKind.AsteriskAsteriskEqualsToken]: '**=';
-    [SyntaxKind.SlashEqualsToken]: '/=';
-    [SyntaxKind.PercentEqualsToken]: '%=';
-    [SyntaxKind.LessThanLessThanEqualsToken]: '<<=';
-    [SyntaxKind.GreaterThanGreaterThanEqualsToken]: '>>=';
-    [SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: '>>>=';
-    [SyntaxKind.AmpersandEqualsToken]: '&=';
-    [SyntaxKind.AmpersandAmpersandEqualsToken]: '&&=';
-    [SyntaxKind.BarEqualsToken]: '|=';
-    [SyntaxKind.BarBarEqualsToken]: '||=';
-    [SyntaxKind.CaretEqualsToken]: '^=';
-    [SyntaxKind.QuestionQuestionEqualsToken]: '??=';
-    [SyntaxKind.AtToken]: '@';
-    [SyntaxKind.InKeyword]: 'in';
-    [SyntaxKind.UniqueKeyword]: 'unique';
-    [SyntaxKind.KeyOfKeyword]: 'keyof';
-    [SyntaxKind.NewKeyword]: 'new';
-    [SyntaxKind.ImportKeyword]: 'import';
-    [SyntaxKind.ReadonlyKeyword]: 'readonly';
-    [SyntaxKind.QuestionQuestionToken]: '??';
-    [SyntaxKind.QuestionDotToken]: '?.';
-}
-/**
- * Returns true if the given ts.Token is the assignment operator
- * @param operator the operator token
- * @returns is assignment
- */
-export declare function isAssignmentOperator<T extends ts.SyntaxKind>(operator: ts.Token<T>): boolean;
-/**
- * Returns true if the given ts.Token is a logical operator
- * @param operator the operator token
- * @returns is a logical operator
- */
-export declare function isLogicalOperator<T extends ts.SyntaxKind>(operator: ts.Token<T>): boolean;
-/**
- * Returns the string form of the given TSToken SyntaxKind
- * @param kind the token's SyntaxKind
- * @returns the token applicable token as a string
- */
-export declare function getTextForTokenKind<T extends ts.SyntaxKind>(kind: T): T extends keyof TokenToText ? TokenToText[T] : string | undefined;
-/**
- * Returns true if the given ts.Node is a valid ESTree class member
- * @param node TypeScript AST node
- * @returns is valid ESTree class member
- */
-export declare function isESTreeClassMember(node: ts.Node): boolean;
-/**
- * Checks if a ts.Node has a modifier
- * @param modifierKind TypeScript SyntaxKind modifier
- * @param node TypeScript AST node
- * @returns has the modifier specified
- */
-export declare function hasModifier(modifierKind: ts.KeywordSyntaxKind, node: ts.Node): boolean;
-/**
- * Get last last modifier in ast
- * @param node TypeScript AST node
- * @returns returns last modifier if present or null
- */
-export declare function getLastModifier(node: ts.Node): ts.Modifier | null;
-/**
- * Returns true if the given ts.Token is a comma
- * @param token the TypeScript token
- * @returns is comma
- */
-export declare function isComma(token: ts.Node): boolean;
-/**
- * Returns true if the given ts.Node is a comment
- * @param node the TypeScript node
- * @returns is comment
- */
-export declare function isComment(node: ts.Node): boolean;
-/**
- * Returns true if the given ts.Node is a JSDoc comment
- * @param node the TypeScript node
- * @returns is JSDoc comment
- */
-export declare function isJSDocComment(node: ts.Node): boolean;
-/**
- * Returns the binary expression type of the given ts.Token
- * @param operator the operator token
- * @returns the binary expression type
- */
-export declare function getBinaryExpressionType<T extends ts.SyntaxKind>(operator: ts.Token<T>): AST_NODE_TYPES.AssignmentExpression | AST_NODE_TYPES.LogicalExpression | AST_NODE_TYPES.BinaryExpression;
-/**
- * Returns line and column data for the given positions,
- * @param pos position to check
- * @param ast the AST object
- * @returns line and column
- */
-export declare function getLineAndCharacterFor(pos: number, ast: ts.SourceFile): TSESTree.LineAndColumnData;
-/**
- * Returns line and column data for the given start and end positions,
- * for the given AST
- * @param start start data
- * @param end   end data
- * @param ast   the AST object
- * @returns the loc data
- */
-export declare function getLocFor(start: number, end: number, ast: ts.SourceFile): TSESTree.SourceLocation;
-/**
- * Check whatever node can contain directive
- * @param node
- * @returns returns true if node can contain directive
- */
-export declare function canContainDirective(node: ts.SourceFile | ts.Block | ts.ModuleBlock): boolean;
-/**
- * Returns range for the given ts.Node
- * @param node the ts.Node or ts.Token
- * @param ast the AST object
- * @returns the range data
- */
-export declare function getRange(node: ts.Node, ast: ts.SourceFile): [number, number];
-/**
- * Returns true if a given ts.Node is a token
- * @param node the ts.Node
- * @returns is a token
- */
-export declare function isToken(node: ts.Node): boolean;
-/**
- * Returns true if a given ts.Node is a JSX token
- * @param node ts.Node to be checked
- * @returns is a JSX token
- */
-export declare function isJSXToken(node: ts.Node): boolean;
-/**
- * Returns the declaration kind of the given ts.Node
- * @param node TypeScript AST node
- * @returns declaration kind
- */
-export declare function getDeclarationKind(node: ts.VariableDeclarationList): 'let' | 'const' | 'var';
-/**
- * Gets a ts.Node's accessibility level
- * @param node The ts.Node
- * @returns accessibility "public", "protected", "private", or null
- */
-export declare function getTSNodeAccessibility(node: ts.Node): 'public' | 'protected' | 'private' | null;
-/**
- * Finds the next token based on the previous one and its parent
- * Had to copy this from TS instead of using TS's version because theirs doesn't pass the ast to getChildren
- * @param previousToken The previous TSToken
- * @param parent The parent TSNode
- * @param ast The TS AST
- * @returns the next TSToken
- */
-export declare function findNextToken(previousToken: ts.TextRange, parent: ts.Node, ast: ts.SourceFile): ts.Node | undefined;
-/**
- * Find the first matching ancestor based on the given predicate function.
- * @param node The current ts.Node
- * @param predicate The predicate function to apply to each checked ancestor
- * @returns a matching parent ts.Node
- */
-export declare function findFirstMatchingAncestor(node: ts.Node, predicate: (node: ts.Node) => boolean): ts.Node | undefined;
-/**
- * Returns true if a given ts.Node has a JSX token within its hierarchy
- * @param node ts.Node to be checked
- * @returns has JSX ancestor
- */
-export declare function hasJSXAncestor(node: ts.Node): boolean;
-/**
- * Unescape the text content of string literals, e.g. &amp; -> &
- * @param text The escaped string literal text.
- * @returns The unescaped string literal text.
- */
-export declare function unescapeStringLiteralText(text: string): string;
-/**
- * Returns true if a given ts.Node is a computed property
- * @param node ts.Node to be checked
- * @returns is Computed Property
- */
-export declare function isComputedProperty(node: ts.Node): boolean;
-/**
- * Returns true if a given ts.Node is optional (has QuestionToken)
- * @param node ts.Node to be checked
- * @returns is Optional
- */
-export declare function isOptional(node: {
-    questionToken?: ts.QuestionToken;
-}): boolean;
-/**
- * Returns true if the node is an optional chain node
- */
-export declare function isChainExpression(node: TSESTree.Node): node is TSESTree.ChainExpression;
-/**
- * Returns true of the child of property access expression is an optional chain
- */
-export declare function isChildUnwrappableOptionalChain(node: ts.PropertyAccessExpression | ts.ElementAccessExpression | ts.CallExpression | ts.NonNullExpression, child: TSESTree.Node): boolean;
-/**
- * Returns the type of a given ts.Token
- * @param token the ts.Token
- * @returns the token type
- */
-export declare function getTokenType(token: ts.Identifier | ts.Token<ts.SyntaxKind>): Exclude<AST_TOKEN_TYPES, AST_TOKEN_TYPES.Line | AST_TOKEN_TYPES.Block>;
-/**
- * Extends and formats a given ts.Token, for a given AST
- * @param token the ts.Token
- * @param ast   the AST object
- * @returns the converted Token
- */
-export declare function convertToken(token: ts.Node, ast: ts.SourceFile): TSESTree.Token;
-/**
- * Converts all tokens for the given AST
- * @param ast the AST object
- * @returns the converted Tokens
- */
-export declare function convertTokens(ast: ts.SourceFile): TSESTree.Token[];
-export interface TSError {
-    index: number;
-    lineNumber: number;
-    column: number;
-    message: string;
-}
-/**
- * @param ast     the AST object
- * @param start      the index at which the error starts
- * @param message the error message
- * @returns converted error object
- */
-export declare function createError(ast: ts.SourceFile, start: number, message: string): TSError;
-/**
- * @param n the TSNode
- * @param ast the TS AST
- */
-export declare function nodeHasTokens(n: ts.Node, ast: ts.SourceFile): boolean;
-/**
- * Like `forEach`, but suitable for use with numbers and strings (which may be falsy).
- * @template T
- * @template U
- * @param array
- * @param callback
- */
-export declare function firstDefined<T, U>(array: readonly T[] | undefined, callback: (element: T, index: number) => U | undefined): U | undefined;
-export {};
-//# sourceMappingURL=node-utils.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts.map
deleted file mode 100644
index f898a2f..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"node-utils.d.ts","sourceRoot":"","sources":["../src/node-utils.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js
deleted file mode 100644
index 05c95cf..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js
+++ /dev/null
@@ -1,543 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.firstDefined = exports.nodeHasTokens = exports.createError = exports.convertTokens = exports.convertToken = exports.getTokenType = exports.isChildUnwrappableOptionalChain = exports.isChainExpression = exports.isOptional = exports.isComputedProperty = exports.unescapeStringLiteralText = exports.hasJSXAncestor = exports.findFirstMatchingAncestor = exports.findNextToken = exports.getTSNodeAccessibility = exports.getDeclarationKind = exports.isJSXToken = exports.isToken = exports.getRange = exports.canContainDirective = exports.getLocFor = exports.getLineAndCharacterFor = exports.getBinaryExpressionType = exports.isJSDocComment = exports.isComment = exports.isComma = exports.getLastModifier = exports.hasModifier = exports.isESTreeClassMember = exports.getTextForTokenKind = exports.isLogicalOperator = exports.isAssignmentOperator = void 0;
-const unescape_1 = __importDefault(require("lodash/unescape"));
-const ts = __importStar(require("typescript"));
-const ts_estree_1 = require("./ts-estree");
-const SyntaxKind = ts.SyntaxKind;
-const LOGICAL_OPERATORS = [
-    SyntaxKind.BarBarToken,
-    SyntaxKind.AmpersandAmpersandToken,
-    SyntaxKind.QuestionQuestionToken,
-];
-/**
- * Returns true if the given ts.Token is the assignment operator
- * @param operator the operator token
- * @returns is assignment
- */
-function isAssignmentOperator(operator) {
-    return (operator.kind >= SyntaxKind.FirstAssignment &&
-        operator.kind <= SyntaxKind.LastAssignment);
-}
-exports.isAssignmentOperator = isAssignmentOperator;
-/**
- * Returns true if the given ts.Token is a logical operator
- * @param operator the operator token
- * @returns is a logical operator
- */
-function isLogicalOperator(operator) {
-    return LOGICAL_OPERATORS.includes(operator.kind);
-}
-exports.isLogicalOperator = isLogicalOperator;
-/**
- * Returns the string form of the given TSToken SyntaxKind
- * @param kind the token's SyntaxKind
- * @returns the token applicable token as a string
- */
-function getTextForTokenKind(kind) {
-    return ts.tokenToString(kind);
-}
-exports.getTextForTokenKind = getTextForTokenKind;
-/**
- * Returns true if the given ts.Node is a valid ESTree class member
- * @param node TypeScript AST node
- * @returns is valid ESTree class member
- */
-function isESTreeClassMember(node) {
-    return node.kind !== SyntaxKind.SemicolonClassElement;
-}
-exports.isESTreeClassMember = isESTreeClassMember;
-/**
- * Checks if a ts.Node has a modifier
- * @param modifierKind TypeScript SyntaxKind modifier
- * @param node TypeScript AST node
- * @returns has the modifier specified
- */
-function hasModifier(modifierKind, node) {
-    return (!!node.modifiers &&
-        !!node.modifiers.length &&
-        node.modifiers.some(modifier => modifier.kind === modifierKind));
-}
-exports.hasModifier = hasModifier;
-/**
- * Get last last modifier in ast
- * @param node TypeScript AST node
- * @returns returns last modifier if present or null
- */
-function getLastModifier(node) {
-    return ((!!node.modifiers &&
-        !!node.modifiers.length &&
-        node.modifiers[node.modifiers.length - 1]) ||
-        null);
-}
-exports.getLastModifier = getLastModifier;
-/**
- * Returns true if the given ts.Token is a comma
- * @param token the TypeScript token
- * @returns is comma
- */
-function isComma(token) {
-    return token.kind === SyntaxKind.CommaToken;
-}
-exports.isComma = isComma;
-/**
- * Returns true if the given ts.Node is a comment
- * @param node the TypeScript node
- * @returns is comment
- */
-function isComment(node) {
-    return (node.kind === SyntaxKind.SingleLineCommentTrivia ||
-        node.kind === SyntaxKind.MultiLineCommentTrivia);
-}
-exports.isComment = isComment;
-/**
- * Returns true if the given ts.Node is a JSDoc comment
- * @param node the TypeScript node
- * @returns is JSDoc comment
- */
-function isJSDocComment(node) {
-    return node.kind === SyntaxKind.JSDocComment;
-}
-exports.isJSDocComment = isJSDocComment;
-/**
- * Returns the binary expression type of the given ts.Token
- * @param operator the operator token
- * @returns the binary expression type
- */
-function getBinaryExpressionType(operator) {
-    if (isAssignmentOperator(operator)) {
-        return ts_estree_1.AST_NODE_TYPES.AssignmentExpression;
-    }
-    else if (isLogicalOperator(operator)) {
-        return ts_estree_1.AST_NODE_TYPES.LogicalExpression;
-    }
-    return ts_estree_1.AST_NODE_TYPES.BinaryExpression;
-}
-exports.getBinaryExpressionType = getBinaryExpressionType;
-/**
- * Returns line and column data for the given positions,
- * @param pos position to check
- * @param ast the AST object
- * @returns line and column
- */
-function getLineAndCharacterFor(pos, ast) {
-    const loc = ast.getLineAndCharacterOfPosition(pos);
-    return {
-        line: loc.line + 1,
-        column: loc.character,
-    };
-}
-exports.getLineAndCharacterFor = getLineAndCharacterFor;
-/**
- * Returns line and column data for the given start and end positions,
- * for the given AST
- * @param start start data
- * @param end   end data
- * @param ast   the AST object
- * @returns the loc data
- */
-function getLocFor(start, end, ast) {
-    return {
-        start: getLineAndCharacterFor(start, ast),
-        end: getLineAndCharacterFor(end, ast),
-    };
-}
-exports.getLocFor = getLocFor;
-/**
- * Check whatever node can contain directive
- * @param node
- * @returns returns true if node can contain directive
- */
-function canContainDirective(node) {
-    if (node.kind === ts.SyntaxKind.Block) {
-        switch (node.parent.kind) {
-            case ts.SyntaxKind.Constructor:
-            case ts.SyntaxKind.GetAccessor:
-            case ts.SyntaxKind.SetAccessor:
-            case ts.SyntaxKind.ArrowFunction:
-            case ts.SyntaxKind.FunctionExpression:
-            case ts.SyntaxKind.FunctionDeclaration:
-            case ts.SyntaxKind.MethodDeclaration:
-                return true;
-            default:
-                return false;
-        }
-    }
-    return true;
-}
-exports.canContainDirective = canContainDirective;
-/**
- * Returns range for the given ts.Node
- * @param node the ts.Node or ts.Token
- * @param ast the AST object
- * @returns the range data
- */
-function getRange(node, ast) {
-    return [node.getStart(ast), node.getEnd()];
-}
-exports.getRange = getRange;
-/**
- * Returns true if a given ts.Node is a token
- * @param node the ts.Node
- * @returns is a token
- */
-function isToken(node) {
-    return (node.kind >= SyntaxKind.FirstToken && node.kind <= SyntaxKind.LastToken);
-}
-exports.isToken = isToken;
-/**
- * Returns true if a given ts.Node is a JSX token
- * @param node ts.Node to be checked
- * @returns is a JSX token
- */
-function isJSXToken(node) {
-    return (node.kind >= SyntaxKind.JsxElement && node.kind <= SyntaxKind.JsxAttribute);
-}
-exports.isJSXToken = isJSXToken;
-/**
- * Returns the declaration kind of the given ts.Node
- * @param node TypeScript AST node
- * @returns declaration kind
- */
-function getDeclarationKind(node) {
-    if (node.flags & ts.NodeFlags.Let) {
-        return 'let';
-    }
-    if (node.flags & ts.NodeFlags.Const) {
-        return 'const';
-    }
-    return 'var';
-}
-exports.getDeclarationKind = getDeclarationKind;
-/**
- * Gets a ts.Node's accessibility level
- * @param node The ts.Node
- * @returns accessibility "public", "protected", "private", or null
- */
-function getTSNodeAccessibility(node) {
-    const modifiers = node.modifiers;
-    if (!modifiers) {
-        return null;
-    }
-    for (let i = 0; i < modifiers.length; i++) {
-        const modifier = modifiers[i];
-        switch (modifier.kind) {
-            case SyntaxKind.PublicKeyword:
-                return 'public';
-            case SyntaxKind.ProtectedKeyword:
-                return 'protected';
-            case SyntaxKind.PrivateKeyword:
-                return 'private';
-            default:
-                break;
-        }
-    }
-    return null;
-}
-exports.getTSNodeAccessibility = getTSNodeAccessibility;
-/**
- * Finds the next token based on the previous one and its parent
- * Had to copy this from TS instead of using TS's version because theirs doesn't pass the ast to getChildren
- * @param previousToken The previous TSToken
- * @param parent The parent TSNode
- * @param ast The TS AST
- * @returns the next TSToken
- */
-function findNextToken(previousToken, parent, ast) {
-    return find(parent);
-    function find(n) {
-        if (ts.isToken(n) && n.pos === previousToken.end) {
-            // this is token that starts at the end of previous token - return it
-            return n;
-        }
-        return firstDefined(n.getChildren(ast), (child) => {
-            const shouldDiveInChildNode = 
-            // previous token is enclosed somewhere in the child
-            (child.pos <= previousToken.pos && child.end > previousToken.end) ||
-                // previous token ends exactly at the beginning of child
-                child.pos === previousToken.end;
-            return shouldDiveInChildNode && nodeHasTokens(child, ast)
-                ? find(child)
-                : undefined;
-        });
-    }
-}
-exports.findNextToken = findNextToken;
-/**
- * Find the first matching ancestor based on the given predicate function.
- * @param node The current ts.Node
- * @param predicate The predicate function to apply to each checked ancestor
- * @returns a matching parent ts.Node
- */
-function findFirstMatchingAncestor(node, predicate) {
-    while (node) {
-        if (predicate(node)) {
-            return node;
-        }
-        node = node.parent;
-    }
-    return undefined;
-}
-exports.findFirstMatchingAncestor = findFirstMatchingAncestor;
-/**
- * Returns true if a given ts.Node has a JSX token within its hierarchy
- * @param node ts.Node to be checked
- * @returns has JSX ancestor
- */
-function hasJSXAncestor(node) {
-    return !!findFirstMatchingAncestor(node, isJSXToken);
-}
-exports.hasJSXAncestor = hasJSXAncestor;
-/**
- * Unescape the text content of string literals, e.g. &amp; -> &
- * @param text The escaped string literal text.
- * @returns The unescaped string literal text.
- */
-function unescapeStringLiteralText(text) {
-    return unescape_1.default(text);
-}
-exports.unescapeStringLiteralText = unescapeStringLiteralText;
-/**
- * Returns true if a given ts.Node is a computed property
- * @param node ts.Node to be checked
- * @returns is Computed Property
- */
-function isComputedProperty(node) {
-    return node.kind === SyntaxKind.ComputedPropertyName;
-}
-exports.isComputedProperty = isComputedProperty;
-/**
- * Returns true if a given ts.Node is optional (has QuestionToken)
- * @param node ts.Node to be checked
- * @returns is Optional
- */
-function isOptional(node) {
-    return node.questionToken
-        ? node.questionToken.kind === SyntaxKind.QuestionToken
-        : false;
-}
-exports.isOptional = isOptional;
-/**
- * Returns true if the node is an optional chain node
- */
-function isChainExpression(node) {
-    return node.type === ts_estree_1.AST_NODE_TYPES.ChainExpression;
-}
-exports.isChainExpression = isChainExpression;
-/**
- * Returns true of the child of property access expression is an optional chain
- */
-function isChildUnwrappableOptionalChain(node, child) {
-    if (isChainExpression(child) &&
-        // (x?.y).z is semantically different, and as such .z is no longer optional
-        node.expression.kind !== ts.SyntaxKind.ParenthesizedExpression) {
-        return true;
-    }
-    return false;
-}
-exports.isChildUnwrappableOptionalChain = isChildUnwrappableOptionalChain;
-/**
- * Returns the type of a given ts.Token
- * @param token the ts.Token
- * @returns the token type
- */
-function getTokenType(token) {
-    if ('originalKeywordKind' in token && token.originalKeywordKind) {
-        if (token.originalKeywordKind === SyntaxKind.NullKeyword) {
-            return ts_estree_1.AST_TOKEN_TYPES.Null;
-        }
-        else if (token.originalKeywordKind >= SyntaxKind.FirstFutureReservedWord &&
-            token.originalKeywordKind <= SyntaxKind.LastKeyword) {
-            return ts_estree_1.AST_TOKEN_TYPES.Identifier;
-        }
-        return ts_estree_1.AST_TOKEN_TYPES.Keyword;
-    }
-    if (token.kind >= SyntaxKind.FirstKeyword &&
-        token.kind <= SyntaxKind.LastFutureReservedWord) {
-        if (token.kind === SyntaxKind.FalseKeyword ||
-            token.kind === SyntaxKind.TrueKeyword) {
-            return ts_estree_1.AST_TOKEN_TYPES.Boolean;
-        }
-        return ts_estree_1.AST_TOKEN_TYPES.Keyword;
-    }
-    if (token.kind >= SyntaxKind.FirstPunctuation &&
-        token.kind <= SyntaxKind.LastBinaryOperator) {
-        return ts_estree_1.AST_TOKEN_TYPES.Punctuator;
-    }
-    if (token.kind >= SyntaxKind.NoSubstitutionTemplateLiteral &&
-        token.kind <= SyntaxKind.TemplateTail) {
-        return ts_estree_1.AST_TOKEN_TYPES.Template;
-    }
-    switch (token.kind) {
-        case SyntaxKind.NumericLiteral:
-            return ts_estree_1.AST_TOKEN_TYPES.Numeric;
-        case SyntaxKind.JsxText:
-            return ts_estree_1.AST_TOKEN_TYPES.JSXText;
-        case SyntaxKind.StringLiteral:
-            // A TypeScript-StringLiteral token with a TypeScript-JsxAttribute or TypeScript-JsxElement parent,
-            // must actually be an ESTree-JSXText token
-            if (token.parent &&
-                (token.parent.kind === SyntaxKind.JsxAttribute ||
-                    token.parent.kind === SyntaxKind.JsxElement)) {
-                return ts_estree_1.AST_TOKEN_TYPES.JSXText;
-            }
-            return ts_estree_1.AST_TOKEN_TYPES.String;
-        case SyntaxKind.RegularExpressionLiteral:
-            return ts_estree_1.AST_TOKEN_TYPES.RegularExpression;
-        case SyntaxKind.Identifier:
-        case SyntaxKind.ConstructorKeyword:
-        case SyntaxKind.GetKeyword:
-        case SyntaxKind.SetKeyword:
-        // falls through
-        default:
-    }
-    // Some JSX tokens have to be determined based on their parent
-    if (token.parent && token.kind === SyntaxKind.Identifier) {
-        if (isJSXToken(token.parent)) {
-            return ts_estree_1.AST_TOKEN_TYPES.JSXIdentifier;
-        }
-        if (token.parent.kind === SyntaxKind.PropertyAccessExpression &&
-            hasJSXAncestor(token)) {
-            return ts_estree_1.AST_TOKEN_TYPES.JSXIdentifier;
-        }
-    }
-    return ts_estree_1.AST_TOKEN_TYPES.Identifier;
-}
-exports.getTokenType = getTokenType;
-/**
- * Extends and formats a given ts.Token, for a given AST
- * @param token the ts.Token
- * @param ast   the AST object
- * @returns the converted Token
- */
-function convertToken(token, ast) {
-    const start = token.kind === SyntaxKind.JsxText
-        ? token.getFullStart()
-        : token.getStart(ast);
-    const end = token.getEnd();
-    const value = ast.text.slice(start, end);
-    const tokenType = getTokenType(token);
-    if (tokenType === ts_estree_1.AST_TOKEN_TYPES.RegularExpression) {
-        return {
-            type: tokenType,
-            value,
-            range: [start, end],
-            loc: getLocFor(start, end, ast),
-            regex: {
-                pattern: value.slice(1, value.lastIndexOf('/')),
-                flags: value.slice(value.lastIndexOf('/') + 1),
-            },
-        };
-    }
-    else {
-        return {
-            type: tokenType,
-            value,
-            range: [start, end],
-            loc: getLocFor(start, end, ast),
-        };
-    }
-}
-exports.convertToken = convertToken;
-/**
- * Converts all tokens for the given AST
- * @param ast the AST object
- * @returns the converted Tokens
- */
-function convertTokens(ast) {
-    const result = [];
-    /**
-     * @param node the ts.Node
-     */
-    function walk(node) {
-        // TypeScript generates tokens for types in JSDoc blocks. Comment tokens
-        // and their children should not be walked or added to the resulting tokens list.
-        if (isComment(node) || isJSDocComment(node)) {
-            return;
-        }
-        if (isToken(node) && node.kind !== SyntaxKind.EndOfFileToken) {
-            const converted = convertToken(node, ast);
-            if (converted) {
-                result.push(converted);
-            }
-        }
-        else {
-            node.getChildren(ast).forEach(walk);
-        }
-    }
-    walk(ast);
-    return result;
-}
-exports.convertTokens = convertTokens;
-/**
- * @param ast     the AST object
- * @param start      the index at which the error starts
- * @param message the error message
- * @returns converted error object
- */
-function createError(ast, start, message) {
-    const loc = ast.getLineAndCharacterOfPosition(start);
-    return {
-        index: start,
-        lineNumber: loc.line + 1,
-        column: loc.character,
-        message,
-    };
-}
-exports.createError = createError;
-/**
- * @param n the TSNode
- * @param ast the TS AST
- */
-function nodeHasTokens(n, ast) {
-    // If we have a token or node that has a non-zero width, it must have tokens.
-    // Note: getWidth() does not take trivia into account.
-    return n.kind === SyntaxKind.EndOfFileToken
-        ? // eslint-disable-next-line @typescript-eslint/no-explicit-any
-            !!n.jsDoc
-        : n.getWidth(ast) !== 0;
-}
-exports.nodeHasTokens = nodeHasTokens;
-/**
- * Like `forEach`, but suitable for use with numbers and strings (which may be falsy).
- * @template T
- * @template U
- * @param array
- * @param callback
- */
-function firstDefined(array, callback) {
-    if (array === undefined) {
-        return undefined;
-    }
-    for (let i = 0; i < array.length; i++) {
-        const result = callback(array[i], i);
-        if (result !== undefined) {
-            return result;
-        }
-    }
-    return undefined;
-}
-exports.firstDefined = firstDefined;
-//# sourceMappingURL=node-utils.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js.map
deleted file mode 100644
index 306ba36..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"node-utils.js","sourceRoot":"","sources":["../src/node-utils.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts
deleted file mode 100644
index e64a09d..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts
+++ /dev/null
@@ -1,150 +0,0 @@
-import { DebugLevel } from '@typescript-eslint/types';
-import { Program } from 'typescript';
-import { TSESTree, TSNode, TSESTreeToTSNode, TSToken } from './ts-estree';
-declare type DebugModule = 'typescript-eslint' | 'eslint' | 'typescript';
-export interface Extra {
-    code: string;
-    comment: boolean;
-    comments: TSESTree.Comment[];
-    createDefaultProgram: boolean;
-    debugLevel: Set<DebugModule>;
-    errorOnTypeScriptSyntacticAndSemanticIssues: boolean;
-    errorOnUnknownASTType: boolean;
-    extraFileExtensions: string[];
-    filePath: string;
-    jsx: boolean;
-    loc: boolean;
-    log: (message: string) => void;
-    preserveNodeMaps?: boolean;
-    projects: string[];
-    range: boolean;
-    strict: boolean;
-    tokens: null | TSESTree.Token[];
-    tsconfigRootDir: string;
-    useJSXTextNode: boolean;
-}
-interface ParseOptions {
-    /**
-     * create a top-level comments array containing all comments
-     */
-    comment?: boolean;
-    /**
-     * An array of modules to turn explicit debugging on for.
-     * - 'typescript-eslint' is the same as setting the env var `DEBUG=typescript-eslint:*`
-     * - 'eslint' is the same as setting the env var `DEBUG=eslint:*`
-     * - 'typescript' is the same as setting `extendedDiagnostics: true` in your tsconfig compilerOptions
-     *
-     * For convenience, also supports a boolean:
-     * - true === ['typescript-eslint']
-     * - false === []
-     */
-    debugLevel?: DebugLevel;
-    /**
-     * Cause the parser to error if it encounters an unknown AST node type (useful for testing).
-     * This case only usually occurs when TypeScript releases new features.
-     */
-    errorOnUnknownASTType?: boolean;
-    /**
-     * Absolute (or relative to `cwd`) path to the file being parsed.
-     */
-    filePath?: string;
-    /**
-     * Enable parsing of JSX.
-     * For more details, see https://www.typescriptlang.org/docs/handbook/jsx.html
-     *
-     * NOTE: this setting does not effect known file types (.js, .jsx, .ts, .tsx, .json) because the
-     * TypeScript compiler has its own internal handling for known file extensions.
-     *
-     * For the exact behavior, see https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/parser#parseroptionsecmafeaturesjsx
-     */
-    jsx?: boolean;
-    /**
-     * Controls whether the `loc` information to each node.
-     * The `loc` property is an object which contains the exact line/column the node starts/ends on.
-     * This is similar to the `range` property, except it is line/column relative.
-     */
-    loc?: boolean;
-    loggerFn?: ((message: string) => void) | false;
-    /**
-     * Controls whether the `range` property is included on AST nodes.
-     * The `range` property is a [number, number] which indicates the start/end index of the node in the file contents.
-     * This is similar to the `loc` property, except this is the absolute index.
-     */
-    range?: boolean;
-    /**
-     * Set to true to create a top-level array containing all tokens from the file.
-     */
-    tokens?: boolean;
-    useJSXTextNode?: boolean;
-}
-interface ParseAndGenerateServicesOptions extends ParseOptions {
-    /**
-     * Causes the parser to error if the TypeScript compiler returns any unexpected syntax/semantic errors.
-     */
-    errorOnTypeScriptSyntacticAndSemanticIssues?: boolean;
-    /**
-     * When `project` is provided, this controls the non-standard file extensions which will be parsed.
-     * It accepts an array of file extensions, each preceded by a `.`.
-     */
-    extraFileExtensions?: string[];
-    /**
-     * Absolute (or relative to `tsconfigRootDir`) path to the file being parsed.
-     * When `project` is provided, this is required, as it is used to fetch the file from the TypeScript compiler's cache.
-     */
-    filePath?: string;
-    /**
-     * Allows the user to control whether or not two-way AST node maps are preserved
-     * during the AST conversion process.
-     *
-     * By default: the AST node maps are NOT preserved, unless `project` has been specified,
-     * in which case the maps are made available on the returned `parserServices`.
-     *
-     * NOTE: If `preserveNodeMaps` is explicitly set by the user, it will be respected,
-     * regardless of whether or not `project` is in use.
-     */
-    preserveNodeMaps?: boolean;
-    /**
-     * Absolute (or relative to `tsconfigRootDir`) paths to the tsconfig(s).
-     * If this is provided, type information will be returned.
-     */
-    project?: string | string[];
-    /**
-     * If you provide a glob (or globs) to the project option, you can use this option to ignore certain folders from
-     * being matched by the globs.
-     * This accepts an array of globs to ignore.
-     *
-     * By default, this is set to ["**\/node_modules/**"]
-     */
-    projectFolderIgnoreList?: string[];
-    /**
-     * The absolute path to the root directory for all provided `project`s.
-     */
-    tsconfigRootDir?: string;
-    /**
-     ***************************************************************************************
-     * IT IS RECOMMENDED THAT YOU DO NOT USE THIS OPTION, AS IT CAUSES PERFORMANCE ISSUES. *
-     ***************************************************************************************
-     *
-     * When passed with `project`, this allows the parser to create a catch-all, default program.
-     * This means that if the parser encounters a file not included in any of the provided `project`s,
-     * it will not error, but will instead parse the file and its dependencies in a new program.
-     */
-    createDefaultProgram?: boolean;
-}
-export declare type TSESTreeOptions = ParseAndGenerateServicesOptions;
-export interface ParserWeakMap<TKey, TValueBase> {
-    get<TValue extends TValueBase>(key: TKey): TValue;
-    has(key: unknown): boolean;
-}
-export interface ParserWeakMapESTreeToTSNode<TKey extends TSESTree.Node = TSESTree.Node> {
-    get<TKeyBase extends TKey>(key: TKeyBase): TSESTreeToTSNode<TKeyBase>;
-    has(key: unknown): boolean;
-}
-export interface ParserServices {
-    program: Program;
-    esTreeNodeToTSNodeMap: ParserWeakMapESTreeToTSNode;
-    tsNodeToESTreeNodeMap: ParserWeakMap<TSNode | TSToken, TSESTree.Node>;
-    hasFullTypeInformation: boolean;
-}
-export {};
-//# sourceMappingURL=parser-options.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts.map
deleted file mode 100644
index af6375f..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"parser-options.d.ts","sourceRoot":"","sources":["../src/parser-options.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.js
deleted file mode 100644
index 66f40a2..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.js
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=parser-options.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.js.map
deleted file mode 100644
index 22b7b8a..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"parser-options.js","sourceRoot":"","sources":["../src/parser-options.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts
deleted file mode 100644
index d31f3a7..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { TSESTreeOptions, ParserServices } from './parser-options';
-import { TSESTree } from './ts-estree';
-interface EmptyObject {
-}
-declare type AST<T extends TSESTreeOptions> = TSESTree.Program & (T['tokens'] extends true ? {
-    tokens: TSESTree.Token[];
-} : EmptyObject) & (T['comment'] extends true ? {
-    comments: TSESTree.Comment[];
-} : EmptyObject);
-interface ParseAndGenerateServicesResult<T extends TSESTreeOptions> {
-    ast: AST<T>;
-    services: ParserServices;
-}
-declare function parse<T extends TSESTreeOptions = TSESTreeOptions>(code: string, options?: T): AST<T>;
-declare function parseAndGenerateServices<T extends TSESTreeOptions = TSESTreeOptions>(code: string, options: T): ParseAndGenerateServicesResult<T>;
-export { AST, parse, parseAndGenerateServices, ParseAndGenerateServicesResult };
-//# sourceMappingURL=parser.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts.map
deleted file mode 100644
index 0647033..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAWA,OAAO,EAAS,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE1E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAwSvC,UAAU,WAAW;CAAG;AACxB,aAAK,GAAG,CAAC,CAAC,SAAS,eAAe,IAAI,QAAQ,CAAC,OAAO,GACpD,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,GAAG;IAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAA;CAAE,GAAG,WAAW,CAAC,GACvE,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAA;CAAE,GAAG,WAAW,CAAC,CAAC;AAE/E,UAAU,8BAA8B,CAAC,CAAC,SAAS,eAAe;IAChE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACZ,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,iBAAS,KAAK,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,EACxD,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,CAAC,GACV,GAAG,CAAC,CAAC,CAAC,CA4CR;AAED,iBAAS,wBAAwB,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,EAC3E,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,GACT,8BAA8B,CAAC,CAAC,CAAC,CA0EnC;AAED,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser.js
deleted file mode 100644
index 20db621..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser.js
+++ /dev/null
@@ -1,380 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
-    return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.parseAndGenerateServices = exports.parse = void 0;
-const debug_1 = __importDefault(require("debug"));
-const globby_1 = require("globby");
-const is_glob_1 = __importDefault(require("is-glob"));
-const semver_1 = __importDefault(require("semver"));
-const ts = __importStar(require("typescript"));
-const ast_converter_1 = require("./ast-converter");
-const convert_1 = require("./convert");
-const createDefaultProgram_1 = require("./create-program/createDefaultProgram");
-const createIsolatedProgram_1 = require("./create-program/createIsolatedProgram");
-const createProjectProgram_1 = require("./create-program/createProjectProgram");
-const createSourceFile_1 = require("./create-program/createSourceFile");
-const semantic_or_syntactic_errors_1 = require("./semantic-or-syntactic-errors");
-const shared_1 = require("./create-program/shared");
-const log = debug_1.default('typescript-eslint:typescript-estree:parser');
-/**
- * This needs to be kept in sync with the top-level README.md in the
- * typescript-eslint monorepo
- */
-const SUPPORTED_TYPESCRIPT_VERSIONS = '>=3.3.1 <4.1.0';
-/*
- * The semver package will ignore prerelease ranges, and we don't want to explicitly document every one
- * List them all separately here, so we can automatically create the full string
- */
-const SUPPORTED_PRERELEASE_RANGES = [];
-const ACTIVE_TYPESCRIPT_VERSION = ts.version;
-const isRunningSupportedTypeScriptVersion = semver_1.default.satisfies(ACTIVE_TYPESCRIPT_VERSION, [SUPPORTED_TYPESCRIPT_VERSIONS]
-    .concat(SUPPORTED_PRERELEASE_RANGES)
-    .join(' || '));
-let extra;
-let warnedAboutTSVersion = false;
-function enforceString(code) {
-    /**
-     * Ensure the source code is a string
-     */
-    if (typeof code !== 'string') {
-        return String(code);
-    }
-    return code;
-}
-/**
- * @param code The code of the file being linted
- * @param shouldProvideParserServices True if the program should be attempted to be calculated from provided tsconfig files
- * @param shouldCreateDefaultProgram True if the program should be created from compiler host
- * @returns Returns a source file and program corresponding to the linted code
- */
-function getProgramAndAST(code, shouldProvideParserServices, shouldCreateDefaultProgram) {
-    return ((shouldProvideParserServices &&
-        createProjectProgram_1.createProjectProgram(code, shouldCreateDefaultProgram, extra)) ||
-        (shouldProvideParserServices &&
-            shouldCreateDefaultProgram &&
-            createDefaultProgram_1.createDefaultProgram(code, extra)) ||
-        createIsolatedProgram_1.createIsolatedProgram(code, extra));
-}
-/**
- * Compute the filename based on the parser options.
- *
- * Even if jsx option is set in typescript compiler, filename still has to
- * contain .tsx file extension.
- *
- * @param options Parser options
- */
-function getFileName({ jsx } = {}) {
-    return jsx ? 'estree.tsx' : 'estree.ts';
-}
-/**
- * Resets the extra config object
- */
-function resetExtra() {
-    extra = {
-        code: '',
-        comment: false,
-        comments: [],
-        createDefaultProgram: false,
-        debugLevel: new Set(),
-        errorOnTypeScriptSyntacticAndSemanticIssues: false,
-        errorOnUnknownASTType: false,
-        extraFileExtensions: [],
-        filePath: getFileName(),
-        jsx: false,
-        loc: false,
-        log: console.log,
-        preserveNodeMaps: true,
-        projects: [],
-        range: false,
-        strict: false,
-        tokens: null,
-        tsconfigRootDir: process.cwd(),
-        useJSXTextNode: false,
-    };
-}
-/**
- * Normalizes, sanitizes, resolves and filters the provided
- */
-function prepareAndTransformProjects(projectsInput, ignoreListInput) {
-    let projects = [];
-    // Normalize and sanitize the project paths
-    if (typeof projectsInput === 'string') {
-        projects.push(projectsInput);
-    }
-    else if (Array.isArray(projectsInput)) {
-        for (const project of projectsInput) {
-            if (typeof project === 'string') {
-                projects.push(project);
-            }
-        }
-    }
-    if (projects.length === 0) {
-        return projects;
-    }
-    // Transform glob patterns into paths
-    const globbedProjects = projects.filter(project => is_glob_1.default(project));
-    projects = projects
-        .filter(project => !is_glob_1.default(project))
-        .concat(globby_1.sync([...globbedProjects, ...ignoreListInput], {
-        cwd: extra.tsconfigRootDir,
-    }));
-    log('parserOptions.project (excluding ignored) matched projects: %s', projects);
-    return projects;
-}
-function applyParserOptionsToExtra(options) {
-    var _a;
-    /**
-     * Configure Debug logging
-     */
-    if (options.debugLevel === true) {
-        extra.debugLevel = new Set(['typescript-eslint']);
-    }
-    else if (Array.isArray(options.debugLevel)) {
-        extra.debugLevel = new Set(options.debugLevel);
-    }
-    if (extra.debugLevel.size > 0) {
-        // debug doesn't support multiple `enable` calls, so have to do it all at once
-        const namespaces = [];
-        if (extra.debugLevel.has('typescript-eslint')) {
-            namespaces.push('typescript-eslint:*');
-        }
-        if (extra.debugLevel.has('eslint') ||
-            // make sure we don't turn off the eslint debug if it was enabled via --debug
-            debug_1.default.enabled('eslint:*')) {
-            // https://github.com/eslint/eslint/blob/9dfc8501fb1956c90dc11e6377b4cb38a6bea65d/bin/eslint.js#L25
-            namespaces.push('eslint:*,-eslint:code-path');
-        }
-        debug_1.default.enable(namespaces.join(','));
-    }
-    /**
-     * Track range information in the AST
-     */
-    extra.range = typeof options.range === 'boolean' && options.range;
-    extra.loc = typeof options.loc === 'boolean' && options.loc;
-    /**
-     * Track tokens in the AST
-     */
-    if (typeof options.tokens === 'boolean' && options.tokens) {
-        extra.tokens = [];
-    }
-    /**
-     * Track comments in the AST
-     */
-    if (typeof options.comment === 'boolean' && options.comment) {
-        extra.comment = true;
-        extra.comments = [];
-    }
-    /**
-     * Enable JSX - note the applicable file extension is still required
-     */
-    if (typeof options.jsx === 'boolean' && options.jsx) {
-        extra.jsx = true;
-    }
-    /**
-     * Get the file path
-     */
-    if (typeof options.filePath === 'string' && options.filePath !== '<input>') {
-        extra.filePath = options.filePath;
-    }
-    else {
-        extra.filePath = getFileName(extra);
-    }
-    /**
-     * The JSX AST changed the node type for string literals
-     * inside a JSX Element from `Literal` to `JSXText`.
-     *
-     * When value is `true`, these nodes will be parsed as type `JSXText`.
-     * When value is `false`, these nodes will be parsed as type `Literal`.
-     */
-    if (typeof options.useJSXTextNode === 'boolean' && options.useJSXTextNode) {
-        extra.useJSXTextNode = true;
-    }
-    /**
-     * Allow the user to cause the parser to error if it encounters an unknown AST Node Type
-     * (used in testing)
-     */
-    if (typeof options.errorOnUnknownASTType === 'boolean' &&
-        options.errorOnUnknownASTType) {
-        extra.errorOnUnknownASTType = true;
-    }
-    /**
-     * Allow the user to override the function used for logging
-     */
-    if (typeof options.loggerFn === 'function') {
-        extra.log = options.loggerFn;
-    }
-    else if (options.loggerFn === false) {
-        extra.log = () => { };
-    }
-    if (typeof options.tsconfigRootDir === 'string') {
-        extra.tsconfigRootDir = options.tsconfigRootDir;
-    }
-    // NOTE - ensureAbsolutePath relies upon having the correct tsconfigRootDir in extra
-    extra.filePath = shared_1.ensureAbsolutePath(extra.filePath, extra);
-    // NOTE - prepareAndTransformProjects relies upon having the correct tsconfigRootDir in extra
-    const projectFolderIgnoreList = ((_a = options.projectFolderIgnoreList) !== null && _a !== void 0 ? _a : [])
-        .reduce((acc, folder) => {
-        if (typeof folder === 'string') {
-            acc.push(folder);
-        }
-        return acc;
-    }, [])
-        // prefix with a ! for not match glob
-        .map(folder => (folder.startsWith('!') ? folder : `!${folder}`));
-    extra.projects = prepareAndTransformProjects(options.project, projectFolderIgnoreList);
-    if (Array.isArray(options.extraFileExtensions) &&
-        options.extraFileExtensions.every(ext => typeof ext === 'string')) {
-        extra.extraFileExtensions = options.extraFileExtensions;
-    }
-    /**
-     * Allow the user to enable or disable the preservation of the AST node maps
-     * during the conversion process.
-     */
-    if (typeof options.preserveNodeMaps === 'boolean') {
-        extra.preserveNodeMaps = options.preserveNodeMaps;
-    }
-    extra.createDefaultProgram =
-        typeof options.createDefaultProgram === 'boolean' &&
-            options.createDefaultProgram;
-}
-function warnAboutTSVersion() {
-    var _a;
-    if (!isRunningSupportedTypeScriptVersion && !warnedAboutTSVersion) {
-        const isTTY = typeof process === undefined ? false : (_a = process.stdout) === null || _a === void 0 ? void 0 : _a.isTTY;
-        if (isTTY) {
-            const border = '=============';
-            const versionWarning = [
-                border,
-                'WARNING: You are currently running a version of TypeScript which is not officially supported by @typescript-eslint/typescript-estree.',
-                'You may find that it works just fine, or you may not.',
-                `SUPPORTED TYPESCRIPT VERSIONS: ${SUPPORTED_TYPESCRIPT_VERSIONS}`,
-                `YOUR TYPESCRIPT VERSION: ${ACTIVE_TYPESCRIPT_VERSION}`,
-                'Please only submit bug reports when using the officially supported version.',
-                border,
-            ];
-            extra.log(versionWarning.join('\n\n'));
-        }
-        warnedAboutTSVersion = true;
-    }
-}
-function parse(code, options) {
-    /**
-     * Reset the parse configuration
-     */
-    resetExtra();
-    /**
-     * Ensure users do not attempt to use parse() when they need parseAndGenerateServices()
-     */
-    if (options === null || options === void 0 ? void 0 : options.errorOnTypeScriptSyntacticAndSemanticIssues) {
-        throw new Error(`"errorOnTypeScriptSyntacticAndSemanticIssues" is only supported for parseAndGenerateServices()`);
-    }
-    /**
-     * Ensure the source code is a string, and store a reference to it
-     */
-    code = enforceString(code);
-    extra.code = code;
-    /**
-     * Apply the given parser options
-     */
-    if (typeof options !== 'undefined') {
-        applyParserOptionsToExtra(options);
-    }
-    /**
-     * Warn if the user is using an unsupported version of TypeScript
-     */
-    warnAboutTSVersion();
-    /**
-     * Create a ts.SourceFile directly, no ts.Program is needed for a simple
-     * parse
-     */
-    const ast = createSourceFile_1.createSourceFile(code, extra);
-    /**
-     * Convert the TypeScript AST to an ESTree-compatible one
-     */
-    const { estree } = ast_converter_1.astConverter(ast, extra, false);
-    return estree;
-}
-exports.parse = parse;
-function parseAndGenerateServices(code, options) {
-    /**
-     * Reset the parse configuration
-     */
-    resetExtra();
-    /**
-     * Ensure the source code is a string, and store a reference to it
-     */
-    code = enforceString(code);
-    extra.code = code;
-    /**
-     * Apply the given parser options
-     */
-    if (typeof options !== 'undefined') {
-        applyParserOptionsToExtra(options);
-        if (typeof options.errorOnTypeScriptSyntacticAndSemanticIssues ===
-            'boolean' &&
-            options.errorOnTypeScriptSyntacticAndSemanticIssues) {
-            extra.errorOnTypeScriptSyntacticAndSemanticIssues = true;
-        }
-    }
-    /**
-     * Warn if the user is using an unsupported version of TypeScript
-     */
-    warnAboutTSVersion();
-    /**
-     * Generate a full ts.Program in order to be able to provide parser
-     * services, such as type-checking
-     */
-    const shouldProvideParserServices = extra.projects && extra.projects.length > 0;
-    const { ast, program } = getProgramAndAST(code, shouldProvideParserServices, extra.createDefaultProgram);
-    /**
-     * Convert the TypeScript AST to an ESTree-compatible one, and optionally preserve
-     * mappings between converted and original AST nodes
-     */
-    const preserveNodeMaps = typeof extra.preserveNodeMaps === 'boolean' ? extra.preserveNodeMaps : true;
-    const { estree, astMaps } = ast_converter_1.astConverter(ast, extra, preserveNodeMaps);
-    /**
-     * Even if TypeScript parsed the source code ok, and we had no problems converting the AST,
-     * there may be other syntactic or semantic issues in the code that we can optionally report on.
-     */
-    if (program && extra.errorOnTypeScriptSyntacticAndSemanticIssues) {
-        const error = semantic_or_syntactic_errors_1.getFirstSemanticOrSyntacticError(program, ast);
-        if (error) {
-            throw convert_1.convertError(error);
-        }
-    }
-    /**
-     * Return the converted AST and additional parser services
-     */
-    return {
-        ast: estree,
-        services: {
-            hasFullTypeInformation: shouldProvideParserServices,
-            program,
-            esTreeNodeToTSNodeMap: astMaps.esTreeNodeToTSNodeMap,
-            tsNodeToESTreeNodeMap: astMaps.tsNodeToESTreeNodeMap,
-        },
-    };
-}
-exports.parseAndGenerateServices = parseAndGenerateServices;
-//# sourceMappingURL=parser.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser.js.map
deleted file mode 100644
index d717c37..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/parser.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.d.ts
deleted file mode 100644
index 06b3e12..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as ts from 'typescript';
-interface SemanticOrSyntacticError extends ts.Diagnostic {
-    message: string;
-}
-/**
- * By default, diagnostics from the TypeScript compiler contain all errors - regardless of whether
- * they are related to generic ECMAScript standards, or TypeScript-specific constructs.
- *
- * Therefore, we filter out all diagnostics, except for the ones we explicitly want to consider when
- * the user opts in to throwing errors on semantic issues.
- */
-export declare function getFirstSemanticOrSyntacticError(program: ts.Program, ast: ts.SourceFile): SemanticOrSyntacticError | undefined;
-export {};
-//# sourceMappingURL=semantic-or-syntactic-errors.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.d.ts.map
deleted file mode 100644
index 83299c5..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"semantic-or-syntactic-errors.d.ts","sourceRoot":"","sources":["../src/semantic-or-syntactic-errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,UAAU,wBAAyB,SAAQ,EAAE,CAAC,UAAU;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,EAAE,CAAC,OAAO,EACnB,GAAG,EAAE,EAAE,CAAC,UAAU,GACjB,wBAAwB,GAAG,SAAS,CAmCtC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js
deleted file mode 100644
index 96473c4..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js
+++ /dev/null
@@ -1,112 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.getFirstSemanticOrSyntacticError = void 0;
-const ts = __importStar(require("typescript"));
-/**
- * By default, diagnostics from the TypeScript compiler contain all errors - regardless of whether
- * they are related to generic ECMAScript standards, or TypeScript-specific constructs.
- *
- * Therefore, we filter out all diagnostics, except for the ones we explicitly want to consider when
- * the user opts in to throwing errors on semantic issues.
- */
-function getFirstSemanticOrSyntacticError(program, ast) {
-    try {
-        const supportedSyntacticDiagnostics = whitelistSupportedDiagnostics(program.getSyntacticDiagnostics(ast));
-        if (supportedSyntacticDiagnostics.length) {
-            return convertDiagnosticToSemanticOrSyntacticError(supportedSyntacticDiagnostics[0]);
-        }
-        const supportedSemanticDiagnostics = whitelistSupportedDiagnostics(program.getSemanticDiagnostics(ast));
-        if (supportedSemanticDiagnostics.length) {
-            return convertDiagnosticToSemanticOrSyntacticError(supportedSemanticDiagnostics[0]);
-        }
-        return undefined;
-    }
-    catch (e) {
-        /**
-         * TypeScript compiler has certain Debug.fail() statements in, which will cause the diagnostics
-         * retrieval above to throw.
-         *
-         * E.g. from ast-alignment-tests
-         * "Debug Failure. Shouldn't ever directly check a JsxOpeningElement"
-         *
-         * For our current use-cases this is undesired behavior, so we just suppress it
-         * and log a a warning.
-         */
-        /* istanbul ignore next */
-        console.warn(`Warning From TSC: "${e.message}`); // eslint-disable-line no-console
-        /* istanbul ignore next */
-        return undefined;
-    }
-}
-exports.getFirstSemanticOrSyntacticError = getFirstSemanticOrSyntacticError;
-function whitelistSupportedDiagnostics(diagnostics) {
-    return diagnostics.filter(diagnostic => {
-        switch (diagnostic.code) {
-            case 1013: // "A rest parameter or binding pattern may not have a trailing comma."
-            case 1014: // "A rest parameter must be last in a parameter list."
-            case 1044: // "'{0}' modifier cannot appear on a module or namespace element."
-            case 1045: // "A '{0}' modifier cannot be used with an interface declaration."
-            case 1048: // "A rest parameter cannot have an initializer."
-            case 1049: // "A 'set' accessor must have exactly one parameter."
-            case 1070: // "'{0}' modifier cannot appear on a type member."
-            case 1071: // "'{0}' modifier cannot appear on an index signature."
-            case 1085: // "Octal literals are not available when targeting ECMAScript 5 and higher. Use the syntax '{0}'."
-            case 1090: // "'{0}' modifier cannot appear on a parameter."
-            case 1096: // "An index signature must have exactly one parameter."
-            case 1097: // "'{0}' list cannot be empty."
-            case 1098: // "Type parameter list cannot be empty."
-            case 1099: // "Type argument list cannot be empty."
-            case 1117: // "An object literal cannot have multiple properties with the same name in strict mode."
-            case 1121: // "Octal literals are not allowed in strict mode."
-            case 1123: //  "Variable declaration list cannot be empty."
-            case 1141: // "String literal expected."
-            case 1162: // "An object member cannot be declared optional."
-            case 1164: // "Computed property names are not allowed in enums."
-            case 1172: // "'extends' clause already seen."
-            case 1173: // "'extends' clause must precede 'implements' clause."
-            case 1175: // "'implements' clause already seen."
-            case 1176: // "Interface declaration cannot have 'implements' clause."
-            case 1190: // "The variable declaration of a 'for...of' statement cannot have an initializer."
-            case 1196: // "Catch clause variable type annotation must be 'any' or 'unknown' if specified."
-            case 1200: // "Line terminator not permitted before arrow."
-            case 1206: // "Decorators are not valid here."
-            case 1211: // "A class declaration without the 'default' modifier must have a name."
-            case 1242: // "'abstract' modifier can only appear on a class, method, or property declaration."
-            case 1246: // "An interface property cannot have an initializer."
-            case 1255: // "A definite assignment assertion '!' is not permitted in this context."
-            case 1308: // "'await' expression is only allowed within an async function."
-            case 2364: // "The left-hand side of an assignment expression must be a variable or a property access."
-            case 2369: // "A parameter property is only allowed in a constructor implementation."
-            case 2452: // "An enum member cannot have a numeric name."
-            case 2462: // "A rest element must be last in a destructuring pattern."
-            case 8017: // "Octal literal types must use ES2015 syntax. Use the syntax '{0}'."
-            case 17012: // "'{0}' is not a valid meta-property for keyword '{1}'. Did you mean '{2}'?"
-            case 17013: // "Meta-property '{0}' is only allowed in the body of a function declaration, function expression, or constructor."
-                return true;
-        }
-        return false;
-    });
-}
-function convertDiagnosticToSemanticOrSyntacticError(diagnostic) {
-    return Object.assign(Object.assign({}, diagnostic), { message: ts.flattenDiagnosticMessageText(diagnostic.messageText, ts.sys.newLine) });
-}
-//# sourceMappingURL=semantic-or-syntactic-errors.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js.map
deleted file mode 100644
index af69657..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/semantic-or-syntactic-errors.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"semantic-or-syntactic-errors.js","sourceRoot":"","sources":["../src/semantic-or-syntactic-errors.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts
deleted file mode 100644
index be2b1fc..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { TSESTree } from './ts-estree';
-declare type SimpleTraverseOptions = {
-    enter: (node: TSESTree.Node, parent: TSESTree.Node | undefined) => void;
-} | {
-    [key: string]: (node: TSESTree.Node, parent: TSESTree.Node | undefined) => void;
-};
-export declare function simpleTraverse(startingNode: TSESTree.Node, options: SimpleTraverseOptions, setParentPointers?: boolean): void;
-export {};
-//# sourceMappingURL=simple-traverse.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts.map
deleted file mode 100644
index 7acdb86..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"simple-traverse.d.ts","sourceRoot":"","sources":["../src/simple-traverse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAevC,aAAK,qBAAqB,GACtB;IACE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;CACzE,GACD;IACE,CAAC,GAAG,EAAE,MAAM,GAAG,CACb,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,SAAS,KAC9B,IAAI,CAAC;CACX,CAAC;AA8CN,wBAAgB,cAAc,CAC5B,YAAY,EAAE,QAAQ,CAAC,IAAI,EAC3B,OAAO,EAAE,qBAAqB,EAC9B,iBAAiB,UAAQ,GACxB,IAAI,CAKN"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js
deleted file mode 100644
index b19f9b7..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js
+++ /dev/null
@@ -1,53 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.simpleTraverse = void 0;
-const visitor_keys_1 = require("@typescript-eslint/visitor-keys");
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-function isValidNode(x) {
-    return x !== null && typeof x === 'object' && typeof x.type === 'string';
-}
-function getVisitorKeysForNode(allVisitorKeys, node) {
-    const keys = allVisitorKeys[node.type];
-    return (keys !== null && keys !== void 0 ? keys : []);
-}
-class SimpleTraverser {
-    constructor(selectors, setParentPointers = false) {
-        this.allVisitorKeys = visitor_keys_1.visitorKeys;
-        this.selectors = selectors;
-        this.setParentPointers = setParentPointers;
-    }
-    traverse(node, parent) {
-        if (!isValidNode(node)) {
-            return;
-        }
-        if (this.setParentPointers) {
-            node.parent = parent;
-        }
-        if ('enter' in this.selectors) {
-            this.selectors.enter(node, parent);
-        }
-        else if (node.type in this.selectors) {
-            this.selectors[node.type](node, parent);
-        }
-        const keys = getVisitorKeysForNode(this.allVisitorKeys, node);
-        if (keys.length < 1) {
-            return;
-        }
-        for (const key of keys) {
-            const childOrChildren = node[key];
-            if (Array.isArray(childOrChildren)) {
-                for (const child of childOrChildren) {
-                    this.traverse(child, node);
-                }
-            }
-            else {
-                this.traverse(childOrChildren, node);
-            }
-        }
-    }
-}
-function simpleTraverse(startingNode, options, setParentPointers = false) {
-    new SimpleTraverser(options, setParentPointers).traverse(startingNode, undefined);
-}
-exports.simpleTraverse = simpleTraverse;
-//# sourceMappingURL=simple-traverse.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js.map
deleted file mode 100644
index 910f55e..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"simple-traverse.js","sourceRoot":"","sources":["../src/simple-traverse.ts"],"names":[],"mappings":";;;AAAA,kEAA8D;AAG9D,8DAA8D;AAC9D,SAAS,WAAW,CAAC,CAAM;IACzB,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC3E,CAAC;AAED,SAAS,qBAAqB,CAC5B,cAAkC,EAClC,IAAmB;IAEnB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,CAAU,CAAC;AAC/B,CAAC;AAaD,MAAM,eAAe;IAKnB,YAAY,SAAgC,EAAE,iBAAiB,GAAG,KAAK;QAJtD,mBAAc,GAAG,0BAAW,CAAC;QAK5C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAED,QAAQ,CAAC,IAAa,EAAE,MAAiC;QACvD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;YACtB,OAAO;SACR;QAED,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;SACtB;QAED,IAAI,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE;YAC7B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;SACpC;aAAM,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;YACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;SACzC;QAED,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,OAAO;SACR;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YAElC,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;gBAClC,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE;oBACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;iBAC5B;aACF;iBAAM;gBACL,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;aACtC;SACF;IACH,CAAC;CACF;AAED,SAAgB,cAAc,CAC5B,YAA2B,EAC3B,OAA8B,EAC9B,iBAAiB,GAAG,KAAK;IAEzB,IAAI,eAAe,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CACtD,YAAY,EACZ,SAAS,CACV,CAAC;AACJ,CAAC;AATD,wCASC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts
deleted file mode 100644
index c3aa41b..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts
+++ /dev/null
@@ -1,169 +0,0 @@
-import { AST_NODE_TYPES, TSESTree } from '@typescript-eslint/types';
-import * as ts from 'typescript';
-import { TSNode } from './ts-nodes';
-export interface EstreeToTsNodeTypes {
-    [AST_NODE_TYPES.ArrayExpression]: ts.ArrayLiteralExpression;
-    [AST_NODE_TYPES.ArrayPattern]: ts.ArrayLiteralExpression | ts.ArrayBindingPattern;
-    [AST_NODE_TYPES.ArrowFunctionExpression]: ts.ArrowFunction;
-    [AST_NODE_TYPES.AssignmentExpression]: ts.BinaryExpression;
-    [AST_NODE_TYPES.AssignmentPattern]: ts.ShorthandPropertyAssignment | ts.BindingElement | ts.BinaryExpression | ts.ParameterDeclaration;
-    [AST_NODE_TYPES.AwaitExpression]: ts.AwaitExpression;
-    [AST_NODE_TYPES.BinaryExpression]: ts.BinaryExpression;
-    [AST_NODE_TYPES.BlockStatement]: ts.Block;
-    [AST_NODE_TYPES.BreakStatement]: ts.BreakStatement;
-    [AST_NODE_TYPES.CallExpression]: ts.CallExpression;
-    [AST_NODE_TYPES.CatchClause]: ts.CatchClause;
-    [AST_NODE_TYPES.ChainExpression]: ts.CallExpression | ts.PropertyAccessExpression | ts.ElementAccessExpression | ts.NonNullExpression;
-    [AST_NODE_TYPES.ClassBody]: ts.ClassDeclaration | ts.ClassExpression;
-    [AST_NODE_TYPES.ClassDeclaration]: ts.ClassDeclaration;
-    [AST_NODE_TYPES.ClassExpression]: ts.ClassExpression;
-    [AST_NODE_TYPES.ClassProperty]: ts.PropertyDeclaration;
-    [AST_NODE_TYPES.ConditionalExpression]: ts.ConditionalExpression;
-    [AST_NODE_TYPES.ContinueStatement]: ts.ContinueStatement;
-    [AST_NODE_TYPES.DebuggerStatement]: ts.DebuggerStatement;
-    [AST_NODE_TYPES.Decorator]: ts.Decorator;
-    [AST_NODE_TYPES.DoWhileStatement]: ts.DoStatement;
-    [AST_NODE_TYPES.EmptyStatement]: ts.EmptyStatement;
-    [AST_NODE_TYPES.ExportAllDeclaration]: ts.ExportDeclaration;
-    [AST_NODE_TYPES.ExportDefaultDeclaration]: ts.ExportAssignment | ts.FunctionDeclaration | ts.VariableStatement | ts.ClassDeclaration | ts.ClassExpression | ts.TypeAliasDeclaration | ts.InterfaceDeclaration | ts.EnumDeclaration | ts.ModuleDeclaration;
-    [AST_NODE_TYPES.ExportNamedDeclaration]: ts.ExportDeclaration | ts.FunctionDeclaration | ts.VariableStatement | ts.ClassDeclaration | ts.ClassExpression | ts.TypeAliasDeclaration | ts.InterfaceDeclaration | ts.EnumDeclaration | ts.ModuleDeclaration;
-    [AST_NODE_TYPES.ExportSpecifier]: ts.ExportSpecifier;
-    [AST_NODE_TYPES.ExpressionStatement]: ts.ExpressionStatement;
-    [AST_NODE_TYPES.ForInStatement]: ts.ForInStatement;
-    [AST_NODE_TYPES.ForOfStatement]: ts.ForOfStatement;
-    [AST_NODE_TYPES.ForStatement]: ts.ForStatement;
-    [AST_NODE_TYPES.FunctionDeclaration]: ts.FunctionDeclaration;
-    [AST_NODE_TYPES.FunctionExpression]: ts.FunctionExpression | ts.ConstructorDeclaration | ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.MethodDeclaration;
-    [AST_NODE_TYPES.Identifier]: ts.Identifier | ts.ConstructorDeclaration | ts.Token<ts.SyntaxKind.NewKeyword | ts.SyntaxKind.ImportKeyword>;
-    [AST_NODE_TYPES.IfStatement]: ts.IfStatement;
-    [AST_NODE_TYPES.ImportDeclaration]: ts.ImportDeclaration;
-    [AST_NODE_TYPES.ImportDefaultSpecifier]: ts.ImportClause;
-    [AST_NODE_TYPES.ImportExpression]: ts.CallExpression;
-    [AST_NODE_TYPES.ImportNamespaceSpecifier]: ts.NamespaceImport;
-    [AST_NODE_TYPES.ImportSpecifier]: ts.ImportSpecifier;
-    [AST_NODE_TYPES.JSXAttribute]: ts.JsxAttribute;
-    [AST_NODE_TYPES.JSXClosingElement]: ts.JsxClosingElement;
-    [AST_NODE_TYPES.JSXClosingFragment]: ts.JsxClosingFragment;
-    [AST_NODE_TYPES.JSXElement]: ts.JsxElement | ts.JsxSelfClosingElement;
-    [AST_NODE_TYPES.JSXEmptyExpression]: ts.JsxExpression;
-    [AST_NODE_TYPES.JSXExpressionContainer]: ts.JsxExpression;
-    [AST_NODE_TYPES.JSXFragment]: ts.JsxFragment;
-    [AST_NODE_TYPES.JSXIdentifier]: ts.Identifier | ts.ThisExpression;
-    [AST_NODE_TYPES.JSXOpeningElement]: ts.JsxOpeningElement | ts.JsxSelfClosingElement;
-    [AST_NODE_TYPES.JSXOpeningFragment]: ts.JsxOpeningFragment;
-    [AST_NODE_TYPES.JSXSpreadAttribute]: ts.JsxSpreadAttribute;
-    [AST_NODE_TYPES.JSXSpreadChild]: ts.JsxExpression;
-    [AST_NODE_TYPES.JSXMemberExpression]: ts.PropertyAccessExpression;
-    [AST_NODE_TYPES.JSXText]: ts.JsxText;
-    [AST_NODE_TYPES.LabeledStatement]: ts.LabeledStatement;
-    [AST_NODE_TYPES.Literal]: ts.StringLiteral | ts.NumericLiteral | ts.RegularExpressionLiteral | ts.JsxText | ts.NullLiteral | ts.BooleanLiteral | ts.BigIntLiteral;
-    [AST_NODE_TYPES.LogicalExpression]: ts.BinaryExpression;
-    [AST_NODE_TYPES.MemberExpression]: ts.PropertyAccessExpression | ts.ElementAccessExpression;
-    [AST_NODE_TYPES.MetaProperty]: ts.MetaProperty;
-    [AST_NODE_TYPES.MethodDefinition]: ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.MethodDeclaration | ts.ConstructorDeclaration;
-    [AST_NODE_TYPES.NewExpression]: ts.NewExpression;
-    [AST_NODE_TYPES.ObjectExpression]: ts.ObjectLiteralExpression;
-    [AST_NODE_TYPES.ObjectPattern]: ts.ObjectLiteralExpression | ts.ObjectBindingPattern;
-    [AST_NODE_TYPES.Program]: ts.SourceFile;
-    [AST_NODE_TYPES.Property]: ts.PropertyAssignment | ts.ShorthandPropertyAssignment | ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.MethodDeclaration | ts.BindingElement;
-    [AST_NODE_TYPES.RestElement]: ts.BindingElement | ts.SpreadAssignment | ts.SpreadElement | ts.ParameterDeclaration;
-    [AST_NODE_TYPES.ReturnStatement]: ts.ReturnStatement;
-    [AST_NODE_TYPES.SequenceExpression]: ts.BinaryExpression;
-    [AST_NODE_TYPES.SpreadElement]: ts.SpreadElement | ts.SpreadAssignment;
-    [AST_NODE_TYPES.Super]: ts.SuperExpression;
-    [AST_NODE_TYPES.SwitchCase]: ts.CaseClause | ts.DefaultClause;
-    [AST_NODE_TYPES.SwitchStatement]: ts.SwitchStatement;
-    [AST_NODE_TYPES.TaggedTemplateExpression]: ts.TaggedTemplateExpression;
-    [AST_NODE_TYPES.TemplateElement]: ts.NoSubstitutionTemplateLiteral | ts.TemplateHead | ts.TemplateMiddle | ts.TemplateTail;
-    [AST_NODE_TYPES.TemplateLiteral]: ts.NoSubstitutionTemplateLiteral | ts.TemplateExpression;
-    [AST_NODE_TYPES.ThisExpression]: ts.ThisExpression | ts.KeywordTypeNode;
-    [AST_NODE_TYPES.ThrowStatement]: ts.ThrowStatement;
-    [AST_NODE_TYPES.TryStatement]: ts.TryStatement;
-    [AST_NODE_TYPES.TSAbstractClassProperty]: ts.PropertyDeclaration;
-    [AST_NODE_TYPES.TSAbstractMethodDefinition]: ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.MethodDeclaration | ts.ConstructorDeclaration;
-    [AST_NODE_TYPES.TSArrayType]: ts.ArrayTypeNode;
-    [AST_NODE_TYPES.TSAsExpression]: ts.AsExpression;
-    [AST_NODE_TYPES.TSCallSignatureDeclaration]: ts.PropertySignature;
-    [AST_NODE_TYPES.TSClassImplements]: ts.ExpressionWithTypeArguments;
-    [AST_NODE_TYPES.TSConditionalType]: ts.ConditionalTypeNode;
-    [AST_NODE_TYPES.TSConstructorType]: ts.ConstructorTypeNode;
-    [AST_NODE_TYPES.TSConstructSignatureDeclaration]: ts.ConstructorTypeNode | ts.FunctionTypeNode | ts.ConstructSignatureDeclaration | ts.CallSignatureDeclaration;
-    [AST_NODE_TYPES.TSDeclareFunction]: ts.FunctionDeclaration;
-    [AST_NODE_TYPES.TSEnumDeclaration]: ts.EnumDeclaration;
-    [AST_NODE_TYPES.TSEnumMember]: ts.EnumMember;
-    [AST_NODE_TYPES.TSExportAssignment]: ts.ExportAssignment;
-    [AST_NODE_TYPES.TSExternalModuleReference]: ts.ExternalModuleReference;
-    [AST_NODE_TYPES.TSFunctionType]: ts.FunctionTypeNode;
-    [AST_NODE_TYPES.TSImportEqualsDeclaration]: ts.ImportEqualsDeclaration;
-    [AST_NODE_TYPES.TSImportType]: ts.ImportTypeNode;
-    [AST_NODE_TYPES.TSIndexedAccessType]: ts.IndexedAccessTypeNode;
-    [AST_NODE_TYPES.TSIndexSignature]: ts.IndexSignatureDeclaration;
-    [AST_NODE_TYPES.TSInferType]: ts.InferTypeNode;
-    [AST_NODE_TYPES.TSInterfaceDeclaration]: ts.InterfaceDeclaration;
-    [AST_NODE_TYPES.TSInterfaceBody]: ts.InterfaceDeclaration;
-    [AST_NODE_TYPES.TSInterfaceHeritage]: ts.ExpressionWithTypeArguments;
-    [AST_NODE_TYPES.TSIntersectionType]: ts.IntersectionTypeNode;
-    [AST_NODE_TYPES.TSLiteralType]: ts.LiteralTypeNode;
-    [AST_NODE_TYPES.TSMappedType]: ts.MappedTypeNode;
-    [AST_NODE_TYPES.TSMethodSignature]: ts.MethodSignature;
-    [AST_NODE_TYPES.TSModuleBlock]: ts.ModuleBlock;
-    [AST_NODE_TYPES.TSModuleDeclaration]: ts.ModuleDeclaration;
-    [AST_NODE_TYPES.TSNamedTupleMember]: ts.NamedTupleMember;
-    [AST_NODE_TYPES.TSNamespaceExportDeclaration]: ts.NamespaceExportDeclaration;
-    [AST_NODE_TYPES.TSNonNullExpression]: ts.NonNullExpression;
-    [AST_NODE_TYPES.TSOptionalType]: ts.OptionalTypeNode;
-    [AST_NODE_TYPES.TSParameterProperty]: ts.ParameterDeclaration;
-    [AST_NODE_TYPES.TSParenthesizedType]: ts.ParenthesizedTypeNode;
-    [AST_NODE_TYPES.TSPropertySignature]: ts.PropertySignature;
-    [AST_NODE_TYPES.TSQualifiedName]: ts.QualifiedName;
-    [AST_NODE_TYPES.TSRestType]: ts.RestTypeNode | ts.NamedTupleMember;
-    [AST_NODE_TYPES.TSThisType]: ts.ThisTypeNode;
-    [AST_NODE_TYPES.TSTupleType]: ts.TupleTypeNode;
-    [AST_NODE_TYPES.TSTypeAliasDeclaration]: ts.TypeAliasDeclaration;
-    [AST_NODE_TYPES.TSTypeAnnotation]: undefined;
-    [AST_NODE_TYPES.TSTypeAssertion]: ts.TypeAssertion;
-    [AST_NODE_TYPES.TSTypeLiteral]: ts.TypeLiteralNode;
-    [AST_NODE_TYPES.TSTypeOperator]: ts.TypeOperatorNode;
-    [AST_NODE_TYPES.TSTypeParameter]: ts.TypeParameterDeclaration;
-    [AST_NODE_TYPES.TSTypeParameterDeclaration]: undefined;
-    [AST_NODE_TYPES.TSTypeParameterInstantiation]: ts.TaggedTemplateExpression | ts.ImportTypeNode | ts.ExpressionWithTypeArguments | ts.TypeReferenceNode | ts.JsxOpeningElement | ts.JsxSelfClosingElement | ts.NewExpression | ts.CallExpression;
-    [AST_NODE_TYPES.TSTypePredicate]: ts.TypePredicateNode;
-    [AST_NODE_TYPES.TSTypeQuery]: ts.TypeQueryNode;
-    [AST_NODE_TYPES.TSTypeReference]: ts.TypeReferenceNode;
-    [AST_NODE_TYPES.TSUnionType]: ts.UnionTypeNode;
-    [AST_NODE_TYPES.UpdateExpression]: ts.PrefixUnaryExpression | ts.PostfixUnaryExpression;
-    [AST_NODE_TYPES.UnaryExpression]: ts.PrefixUnaryExpression | ts.PostfixUnaryExpression | ts.DeleteExpression | ts.VoidExpression | ts.TypeOfExpression;
-    [AST_NODE_TYPES.VariableDeclaration]: ts.VariableDeclarationList | ts.VariableStatement;
-    [AST_NODE_TYPES.VariableDeclarator]: ts.VariableDeclaration;
-    [AST_NODE_TYPES.WhileStatement]: ts.WhileStatement;
-    [AST_NODE_TYPES.WithStatement]: ts.WithStatement;
-    [AST_NODE_TYPES.YieldExpression]: ts.YieldExpression;
-    [AST_NODE_TYPES.TSEmptyBodyFunctionExpression]: ts.FunctionExpression | ts.ConstructorDeclaration | ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.MethodDeclaration;
-    [AST_NODE_TYPES.TSAbstractKeyword]: ts.Token<ts.SyntaxKind.AbstractKeyword>;
-    [AST_NODE_TYPES.TSNullKeyword]: ts.NullLiteral | ts.KeywordTypeNode;
-    [AST_NODE_TYPES.TSAnyKeyword]: ts.KeywordTypeNode;
-    [AST_NODE_TYPES.TSBigIntKeyword]: ts.KeywordTypeNode;
-    [AST_NODE_TYPES.TSBooleanKeyword]: ts.KeywordTypeNode;
-    [AST_NODE_TYPES.TSNeverKeyword]: ts.KeywordTypeNode;
-    [AST_NODE_TYPES.TSNumberKeyword]: ts.KeywordTypeNode;
-    [AST_NODE_TYPES.TSObjectKeyword]: ts.KeywordTypeNode;
-    [AST_NODE_TYPES.TSStringKeyword]: ts.KeywordTypeNode;
-    [AST_NODE_TYPES.TSSymbolKeyword]: ts.KeywordTypeNode;
-    [AST_NODE_TYPES.TSUnknownKeyword]: ts.KeywordTypeNode;
-    [AST_NODE_TYPES.TSVoidKeyword]: ts.KeywordTypeNode;
-    [AST_NODE_TYPES.TSUndefinedKeyword]: ts.KeywordTypeNode;
-    [AST_NODE_TYPES.TSAsyncKeyword]: ts.Token<ts.SyntaxKind.AsyncKeyword>;
-    [AST_NODE_TYPES.TSDeclareKeyword]: ts.Token<ts.SyntaxKind.DeclareKeyword>;
-    [AST_NODE_TYPES.TSExportKeyword]: ts.Token<ts.SyntaxKind.ExportKeyword>;
-    [AST_NODE_TYPES.TSStaticKeyword]: ts.Token<ts.SyntaxKind.StaticKeyword>;
-    [AST_NODE_TYPES.TSPublicKeyword]: ts.Token<ts.SyntaxKind.PublicKeyword>;
-    [AST_NODE_TYPES.TSPrivateKeyword]: ts.Token<ts.SyntaxKind.PrivateKeyword>;
-    [AST_NODE_TYPES.TSProtectedKeyword]: ts.Token<ts.SyntaxKind.ProtectedKeyword>;
-    [AST_NODE_TYPES.TSReadonlyKeyword]: ts.Token<ts.SyntaxKind.ReadonlyKeyword>;
-}
-/**
- * Maps TSESTree AST Node type to the expected TypeScript AST Node type(s).
- * This mapping is based on the internal logic of the parser.
- */
-export declare type TSESTreeToTSNode<T extends TSESTree.Node = TSESTree.Node> = Extract<TSNode | ts.Token<ts.SyntaxKind.NewKeyword | ts.SyntaxKind.ImportKeyword>, EstreeToTsNodeTypes[T['type']]>;
-//# sourceMappingURL=estree-to-ts-node-types.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts.map
deleted file mode 100644
index 8704471..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"estree-to-ts-node-types.d.ts","sourceRoot":"","sources":["../../src/ts-estree/estree-to-ts-node-types.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js
deleted file mode 100644
index 1a133cd..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const types_1 = require("@typescript-eslint/types");
-//# sourceMappingURL=estree-to-ts-node-types.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js.map
deleted file mode 100644
index b48e0fd..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"estree-to-ts-node-types.js","sourceRoot":"","sources":["../../src/ts-estree/estree-to-ts-node-types.ts"],"names":[],"mappings":";;AAAA,oDAAoE"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts
deleted file mode 100644
index 37f26a3..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export { AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree, } from '@typescript-eslint/types';
-export * from './ts-nodes';
-export * from './estree-to-ts-node-types';
-//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts.map
deleted file mode 100644
index 6a839dc..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ts-estree/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,eAAe,EACf,QAAQ,GACT,MAAM,0BAA0B,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,2BAA2B,CAAC"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js
deleted file mode 100644
index 7f93802..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TSESTree = exports.AST_TOKEN_TYPES = exports.AST_NODE_TYPES = void 0;
-// for simplicity and backwards-compatibility
-var types_1 = require("@typescript-eslint/types");
-Object.defineProperty(exports, "AST_NODE_TYPES", { enumerable: true, get: function () { return types_1.AST_NODE_TYPES; } });
-Object.defineProperty(exports, "AST_TOKEN_TYPES", { enumerable: true, get: function () { return types_1.AST_TOKEN_TYPES; } });
-Object.defineProperty(exports, "TSESTree", { enumerable: true, get: function () { return types_1.TSESTree; } });
-__exportStar(require("./ts-nodes"), exports);
-__exportStar(require("./estree-to-ts-node-types"), exports);
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js.map
deleted file mode 100644
index 5325d5d..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ts-estree/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,6CAA6C;AAC7C,kDAIkC;AAHhC,uGAAA,cAAc,OAAA;AACd,wGAAA,eAAe,OAAA;AACf,iGAAA,QAAQ,OAAA;AAEV,6CAA2B;AAC3B,4DAA0C"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts
deleted file mode 100644
index 8142fc4..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import * as ts from 'typescript';
-declare module 'typescript' {
-    interface NamedTupleMember extends ts.Node {
-    }
-}
-export declare type TSToken = ts.Token<ts.SyntaxKind>;
-export declare type TSNode = ts.Modifier | ts.Identifier | ts.QualifiedName | ts.ComputedPropertyName | ts.Decorator | ts.TypeParameterDeclaration | ts.CallSignatureDeclaration | ts.ConstructSignatureDeclaration | ts.VariableDeclaration | ts.VariableDeclarationList | ts.ParameterDeclaration | ts.BindingElement | ts.PropertySignature | ts.PropertyDeclaration | ts.PropertyAssignment | ts.ShorthandPropertyAssignment | ts.SpreadAssignment | ts.ObjectBindingPattern | ts.ArrayBindingPattern | ts.FunctionDeclaration | ts.MethodSignature | ts.MethodDeclaration | ts.ConstructorDeclaration | ts.SemicolonClassElement | ts.GetAccessorDeclaration | ts.SetAccessorDeclaration | ts.IndexSignatureDeclaration | ts.KeywordTypeNode | ts.ImportTypeNode | ts.ThisTypeNode | ts.ConstructorTypeNode | ts.FunctionTypeNode | ts.TypeReferenceNode | ts.TypePredicateNode | ts.TypeQueryNode | ts.TypeLiteralNode | ts.ArrayTypeNode | ts.NamedTupleMember | ts.TupleTypeNode | ts.OptionalTypeNode | ts.RestTypeNode | ts.UnionTypeNode | ts.IntersectionTypeNode | ts.ConditionalTypeNode | ts.InferTypeNode | ts.ParenthesizedTypeNode | ts.TypeOperatorNode | ts.IndexedAccessTypeNode | ts.MappedTypeNode | ts.LiteralTypeNode | ts.StringLiteral | ts.OmittedExpression | ts.PartiallyEmittedExpression | ts.PrefixUnaryExpression | ts.PostfixUnaryExpression | ts.NullLiteral | ts.BooleanLiteral | ts.ThisExpression | ts.SuperExpression | ts.ImportExpression | ts.DeleteExpression | ts.TypeOfExpression | ts.VoidExpression | ts.AwaitExpression | ts.YieldExpression | ts.SyntheticExpression | ts.BinaryExpression | ts.ConditionalExpression | ts.FunctionExpression | ts.ArrowFunction | ts.RegularExpressionLiteral | ts.NoSubstitutionTemplateLiteral | ts.NumericLiteral | ts.BigIntLiteral | ts.TemplateHead | ts.TemplateMiddle | ts.TemplateTail | ts.TemplateExpression | ts.TemplateSpan | ts.ParenthesizedExpression | ts.ArrayLiteralExpression | ts.SpreadElement | ts.ObjectLiteralExpression | ts.PropertyAccessExpression | ts.ElementAccessExpression | ts.CallExpression | ts.ExpressionWithTypeArguments | ts.NewExpression | ts.TaggedTemplateExpression | ts.AsExpression | ts.TypeAssertion | ts.NonNullExpression | ts.MetaProperty | ts.JsxElement | ts.JsxOpeningElement | ts.JsxSelfClosingElement | ts.JsxFragment | ts.JsxOpeningFragment | ts.JsxClosingFragment | ts.JsxAttribute | ts.JsxSpreadAttribute | ts.JsxClosingElement | ts.JsxExpression | ts.JsxText | ts.NotEmittedStatement | ts.CommaListExpression | ts.EmptyStatement | ts.DebuggerStatement | ts.MissingDeclaration | ts.Block | ts.VariableStatement | ts.ExpressionStatement | ts.IfStatement | ts.DoStatement | ts.WhileStatement | ts.ForStatement | ts.ForInStatement | ts.ForOfStatement | ts.BreakStatement | ts.ContinueStatement | ts.ReturnStatement | ts.WithStatement | ts.SwitchStatement | ts.CaseBlock | ts.CaseClause | ts.DefaultClause | ts.LabeledStatement | ts.ThrowStatement | ts.TryStatement | ts.CatchClause | ts.ClassDeclaration | ts.ClassExpression | ts.InterfaceDeclaration | ts.HeritageClause | ts.TypeAliasDeclaration | ts.EnumMember | ts.EnumDeclaration | ts.ModuleDeclaration | ts.ModuleBlock | ts.ImportEqualsDeclaration | ts.ExternalModuleReference | ts.ImportDeclaration | ts.ImportClause | ts.NamespaceImport | ts.NamespaceExportDeclaration | ts.ExportDeclaration | ts.NamedImports | ts.NamedExports | ts.ImportSpecifier | ts.ExportSpecifier | ts.ExportAssignment | ts.SourceFile | ts.Bundle | ts.InputFiles | ts.UnparsedSource | ts.JsonMinusNumericLiteral | ts.JSDoc | ts.JSDocTypeExpression | ts.JSDocUnknownTag | ts.JSDocAugmentsTag | ts.JSDocClassTag | ts.JSDocEnumTag | ts.JSDocThisTag | ts.JSDocTemplateTag | ts.JSDocReturnTag | ts.JSDocTypeTag | ts.JSDocTypedefTag | ts.JSDocCallbackTag | ts.JSDocSignature | ts.JSDocPropertyTag | ts.JSDocParameterTag | ts.JSDocTypeLiteral | ts.JSDocFunctionType | ts.JSDocAllType | ts.JSDocUnknownType | ts.JSDocNullableType | ts.JSDocNonNullableType | ts.JSDocOptionalType | ts.JSDocVariadicType | ts.JSDocAuthorTag;
-//# sourceMappingURL=ts-nodes.d.ts.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts.map
deleted file mode 100644
index aacaf81..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ts-nodes.d.ts","sourceRoot":"","sources":["../../src/ts-estree/ts-nodes.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.js b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.js
deleted file mode 100644
index ba99b5f..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.js
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=ts-nodes.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.js.map b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.js.map
deleted file mode 100644
index a4fa02c..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ts-nodes.js","sourceRoot":"","sources":["../../src/ts-estree/ts-nodes.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/node_modules/.bin/semver b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/node_modules/.bin/semver
deleted file mode 120000
index 501bb2f..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/node_modules/.bin/semver
+++ /dev/null
@@ -1 +0,0 @@
-../../../../semver/bin/semver.js
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/package.json b/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/package.json
deleted file mode 100644
index 878ff3c..0000000
--- a/node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree/package.json
+++ /dev/null
@@ -1,88 +0,0 @@
-{
-  "name": "@typescript-eslint/typescript-estree",
-  "version": "4.1.0",
-  "description": "A parser that converts TypeScript source code into an ESTree compatible form",
-  "main": "dist/index.js",
-  "types": "dist/index.d.ts",
-  "files": [
-    "dist",
-    "README.md",
-    "LICENSE"
-  ],
-  "engines": {
-    "node": "^10.12.0 || >=12.0.0"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/typescript-eslint/typescript-eslint.git",
-    "directory": "packages/typescript-estree"
-  },
-  "bugs": {
-    "url": "https://github.com/typescript-eslint/typescript-eslint/issues"
-  },
-  "license": "BSD-2-Clause",
-  "keywords": [
-    "ast",
-    "estree",
-    "ecmascript",
-    "javascript",
-    "typescript",
-    "parser",
-    "syntax"
-  ],
-  "scripts": {
-    "build": "tsc -b tsconfig.build.json",
-    "postbuild": "downlevel-dts dist _ts3.4/dist",
-    "clean": "tsc -b tsconfig.build.json --clean",
-    "postclean": "rimraf dist",
-    "format": "prettier --write \"./**/*.{ts,js,json,md}\" --ignore-path ../../.prettierignore",
-    "lint": "eslint . --ext .js,.ts --ignore-path='../../.eslintignore'",
-    "test": "jest --coverage",
-    "typecheck": "tsc -p tsconfig.json --noEmit"
-  },
-  "dependencies": {
-    "@typescript-eslint/types": "4.1.0",
-    "@typescript-eslint/visitor-keys": "4.1.0",
-    "debug": "^4.1.1",
-    "globby": "^11.0.1",
-    "is-glob": "^4.0.1",
-    "lodash": "^4.17.15",
-    "semver": "^7.3.2",
-    "tsutils": "^3.17.1"
-  },
-  "devDependencies": {
-    "@babel/code-frame": "^7.10.4",
-    "@babel/parser": "^7.11.3",
-    "@babel/types": "^7.11.0",
-    "@types/babel__code-frame": "^7.0.1",
-    "@types/debug": "*",
-    "@types/glob": "*",
-    "@types/is-glob": "^4.0.1",
-    "@types/lodash": "*",
-    "@types/semver": "^7.1.0",
-    "@types/tmp": "^0.2.0",
-    "@typescript-eslint/shared-fixtures": "4.1.0",
-    "glob": "*",
-    "jest-specific-snapshot": "*",
-    "make-dir": "*",
-    "tmp": "^0.2.1",
-    "typescript": "*"
-  },
-  "peerDependenciesMeta": {
-    "typescript": {
-      "optional": true
-    }
-  },
-  "funding": {
-    "type": "opencollective",
-    "url": "https://opencollective.com/typescript-eslint"
-  },
-  "typesVersions": {
-    "<3.8": {
-      "*": [
-        "_ts3.4/*"
-      ]
-    }
-  },
-  "gitHead": "00a24706222254774121ee62038e67d0efa993e7"
-}
diff --git a/node_modules/eslint-plugin-jest/package.json b/node_modules/eslint-plugin-jest/package.json
index 83d02ac..91d4cb0 100644
--- a/node_modules/eslint-plugin-jest/package.json
+++ b/node_modules/eslint-plugin-jest/package.json
@@ -1,6 +1,6 @@
 {
   "name": "eslint-plugin-jest",
-  "version": "24.0.2",
+  "version": "24.1.0",
   "description": "Eslint rules for Jest",
   "keywords": [
     "eslint",
diff --git a/node_modules/eslint-plugin-jsdoc/CONTRIBUTING.md b/node_modules/eslint-plugin-jsdoc/CONTRIBUTING.md
deleted file mode 100644
index 7de573c..0000000
--- a/node_modules/eslint-plugin-jsdoc/CONTRIBUTING.md
+++ /dev/null
@@ -1,86 +0,0 @@
-# CONTRIBUTING to eslint-plugin-jsdoc
-
-## Testing changes locally
-
-You might try a TDD approach and add tests within the `test` directory,
-to try different configs, you may find it easier to try out changes in
-a separate local directory.
-
-You can run [`npm link`](https://docs.npmjs.com/cli/link) for this purpose,
-pointing from your project to this project. For example, while in your project
-root and with `eslint-plugin-jsdoc` as a sibling, run:
-
-```shell
-npm link ../eslint-plugin-jsdoc
-```
-
-## Building the project
-
-After running `npm install` to get the latest dependencies and devDependencies,
-you can run the following command to update the `dist` files, with `dist/index.js`
-being the `main` entrance point from `package.json`:
-
-```shell
-npm run build
-```
-
-## Coding standards
-
-The project follows ESLint rules from [`canonical`](https://www.npmjs.com/package/eslint-config-canonical)
-and testing follows its subconfig, `canonical/mocha`.
-
-## Testing
-
-Tests are expected. Each rule file should be in CamelCase (despite the rule names themselves being hyphenated) and should be added within `test/assertions` and then imported/required by
-`test/rules/index.js`.
-
-Each rule file should be an ESM default export of an object which has `valid` and `invalid` array properties containing the tests. Tests of each type should be provided.
-
-`parserOptions` will be `ecmaVersion: 6` by default, but tests can override `parserOptions`
-with their own.
-
-See ESLint's [RuleTester](https://eslint.org/docs/developer-guide/nodejs-api#ruletester)
-for more on the allowable properties (e.g., `code`, `errors` (for invalid rules),
-`options`, `settings`, etc.).
-
-Note that besides `npm test`, there is `npm run test-cov` which shows more
-detailed information on coverage. Coverage should be maintained at 100%, and
-if there are a few guards in place for future use, the code block in question
-can be ignored by being preceded by `/* istanbul ignore next */` (including
-for warnings where the block is never passed over (i.e., the block is always
-entered)). If you want to test without coverage at all, you can use
-`npm run test-no-cov`. To only test rules rather than other files, you
-can use `npm run test-index`.
-
-To test specific rules, you can supply a comma-separated list with the `--rule`
-flag passed to `test-index`, e.g., for `check-examples` and `require-example`:
-
-`npm run --rule=check-examples,require-example test-index`.
-
-You can further limit this by providing `--invalid` and/or `--valid` flags
-with a comma-separated list of 0-based indexes that you wish to include (also
-accepts negative offsets from the end, e.g., `-1` for the last item). For
-example, to check the first and third invalid tests of `check-examples`
-alon with the second valid test, you can run:
-
-`npm run --rule=check-examples --invalid=0,2 --valid=1 test-index`.
-
-## Requirements for PRs
-
-PRs should be mergeable, [rebasing](https://git-scm.com/book/en/v2/Git-Branching-Rebasing)
-first against the latest `master`.
-
-The number of commits will ideally be limited in number, unless extra commits
-can better show a progression of features.
-
-Commit messages should be worded clearly and the reason for any PR made clear
-by linking to an issue or giving a full description of what it achieves.
-
-## Merging
-
-We use [semantic-release](https://github.com/semantic-release/semantic-release)
-for preparing releases, so the commit messages (or at least the merge that
-brings them into `master`) must follow the
-[AngularJS commit guidelines](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines) with a special format such as `feat: describe new feature`
-in order for the releasing to occur and for the described items to be added
-to the release notes.
diff --git a/node_modules/eslint-plugin-jsdoc/LICENSE b/node_modules/eslint-plugin-jsdoc/LICENSE
deleted file mode 100644
index 6c41d45..0000000
--- a/node_modules/eslint-plugin-jsdoc/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-Copyright (c) 2018, Gajus Kuizinas (http://gajus.com/)
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of the Gajus Kuizinas (http://gajus.com/) nor the
-      names of its contributors may be used to endorse or promote products
-      derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL ANUARY BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/eslint-plugin-jsdoc/README.md b/node_modules/eslint-plugin-jsdoc/README.md
deleted file mode 100644
index 7442d07..0000000
--- a/node_modules/eslint-plugin-jsdoc/README.md
+++ /dev/null
@@ -1,11240 +0,0 @@
-<a name="eslint-plugin-jsdoc"></a>
-# eslint-plugin-jsdoc
-
-[![GitSpo Mentions](https://gitspo.com/badges/mentions/gajus/eslint-plugin-jsdoc?style=flat-square)](https://gitspo.com/mentions/gajus/eslint-plugin-jsdoc)
-[![NPM version](http://img.shields.io/npm/v/eslint-plugin-jsdoc.svg?style=flat-square)](https://www.npmjs.org/package/eslint-plugin-jsdoc)
-[![Travis build status](http://img.shields.io/travis/gajus/eslint-plugin-jsdoc/master.svg?style=flat-square)](https://travis-ci.org/gajus/eslint-plugin-jsdoc)
-[![js-canonical-style](https://img.shields.io/badge/code%20style-canonical-blue.svg?style=flat-square)](https://github.com/gajus/canonical)
-
-JSDoc linting rules for ESLint.
-
-* [eslint-plugin-jsdoc](#eslint-plugin-jsdoc)
-    * [Installation](#eslint-plugin-jsdoc-installation)
-    * [Configuration](#eslint-plugin-jsdoc-configuration)
-    * [Options](#eslint-plugin-jsdoc-options)
-    * [Settings](#eslint-plugin-jsdoc-settings)
-        * [Allow `@private` to disable rules for that comment block](#eslint-plugin-jsdoc-settings-allow-private-to-disable-rules-for-that-comment-block)
-        * [`maxLines` and `minLines`](#eslint-plugin-jsdoc-settings-maxlines-and-minlines)
-        * [Mode](#eslint-plugin-jsdoc-settings-mode)
-        * [Alias Preference](#eslint-plugin-jsdoc-settings-alias-preference)
-        * [`@override`/`@augments`/`@extends`/`@implements` Without Accompanying `@param`/`@description`/`@example`/`@returns`](#eslint-plugin-jsdoc-settings-override-augments-extends-implements-without-accompanying-param-description-example-returns)
-        * [Settings to Configure `check-types` and `no-undefined-types`](#eslint-plugin-jsdoc-settings-settings-to-configure-check-types-and-no-undefined-types)
-    * [Rules](#eslint-plugin-jsdoc-rules)
-        * [`check-access`](#eslint-plugin-jsdoc-rules-check-access)
-        * [`check-alignment`](#eslint-plugin-jsdoc-rules-check-alignment)
-        * [`check-examples`](#eslint-plugin-jsdoc-rules-check-examples)
-        * [`check-indentation`](#eslint-plugin-jsdoc-rules-check-indentation)
-        * [`check-param-names`](#eslint-plugin-jsdoc-rules-check-param-names)
-        * [`check-property-names`](#eslint-plugin-jsdoc-rules-check-property-names)
-        * [`check-syntax`](#eslint-plugin-jsdoc-rules-check-syntax)
-        * [`check-tag-names`](#eslint-plugin-jsdoc-rules-check-tag-names)
-        * [`check-types`](#eslint-plugin-jsdoc-rules-check-types)
-        * [`check-values`](#eslint-plugin-jsdoc-rules-check-values)
-        * [`empty-tags`](#eslint-plugin-jsdoc-rules-empty-tags)
-        * [`implements-on-classes`](#eslint-plugin-jsdoc-rules-implements-on-classes)
-        * [`match-description`](#eslint-plugin-jsdoc-rules-match-description)
-        * [`newline-after-description`](#eslint-plugin-jsdoc-rules-newline-after-description)
-        * [`no-types`](#eslint-plugin-jsdoc-rules-no-types)
-        * [`no-undefined-types`](#eslint-plugin-jsdoc-rules-no-undefined-types)
-        * [`require-description-complete-sentence`](#eslint-plugin-jsdoc-rules-require-description-complete-sentence)
-        * [`require-description`](#eslint-plugin-jsdoc-rules-require-description)
-        * [`require-example`](#eslint-plugin-jsdoc-rules-require-example)
-        * [`require-file-overview`](#eslint-plugin-jsdoc-rules-require-file-overview)
-        * [`require-hyphen-before-param-description`](#eslint-plugin-jsdoc-rules-require-hyphen-before-param-description)
-        * [`require-jsdoc`](#eslint-plugin-jsdoc-rules-require-jsdoc)
-        * [`require-param-description`](#eslint-plugin-jsdoc-rules-require-param-description)
-        * [`require-param-name`](#eslint-plugin-jsdoc-rules-require-param-name)
-        * [`require-param-type`](#eslint-plugin-jsdoc-rules-require-param-type)
-        * [`require-param`](#eslint-plugin-jsdoc-rules-require-param)
-        * [`require-property`](#eslint-plugin-jsdoc-rules-require-property)
-        * [`require-property-description`](#eslint-plugin-jsdoc-rules-require-property-description)
-        * [`require-property-name`](#eslint-plugin-jsdoc-rules-require-property-name)
-        * [`require-property-type`](#eslint-plugin-jsdoc-rules-require-property-type)
-        * [`require-returns-check`](#eslint-plugin-jsdoc-rules-require-returns-check)
-        * [`require-returns-description`](#eslint-plugin-jsdoc-rules-require-returns-description)
-        * [`require-returns-type`](#eslint-plugin-jsdoc-rules-require-returns-type)
-        * [`require-returns`](#eslint-plugin-jsdoc-rules-require-returns)
-        * [`valid-types`](#eslint-plugin-jsdoc-rules-valid-types)
-
-
-<a name="eslint-plugin-jsdoc-installation"></a>
-## Installation
-
-Install [ESLint](https://www.github.com/eslint/eslint) either locally or globally.
-
-```sh
-npm install --save-dev eslint
-```
-
-If you have installed `ESLint` globally, you have to install JSDoc plugin globally too. Otherwise, install it locally.
-
-```sh
-npm install --save-dev eslint-plugin-jsdoc
-```
-
-<a name="eslint-plugin-jsdoc-configuration"></a>
-## Configuration
-
-Add `plugins` section and specify `eslint-plugin-jsdoc` as a plugin.
-
-```json
-{
-    "plugins": [
-        "jsdoc"
-    ]
-}
-```
-
-Finally, enable all of the rules that you would like to use.
-
-```javascript
-{
-    "rules": {
-        "jsdoc/check-alignment": 1, // Recommended
-        "jsdoc/check-examples": 1,
-        "jsdoc/check-indentation": 1,
-        "jsdoc/check-param-names": 1, // Recommended
-        "jsdoc/check-syntax": 1,
-        "jsdoc/check-tag-names": 1, // Recommended
-        "jsdoc/check-types": 1, // Recommended
-        "jsdoc/implements-on-classes": 1, // Recommended
-        "jsdoc/match-description": 1,
-        "jsdoc/newline-after-description": 1, // Recommended
-        "jsdoc/no-types": 1,
-        "jsdoc/no-undefined-types": 1, // Recommended
-        "jsdoc/require-description": 1,
-        "jsdoc/require-description-complete-sentence": 1,
-        "jsdoc/require-example": 1,
-        "jsdoc/require-hyphen-before-param-description": 1,
-        "jsdoc/require-jsdoc": 1, // Recommended
-        "jsdoc/require-param": 1, // Recommended
-        "jsdoc/require-param-description": 1, // Recommended
-        "jsdoc/require-param-name": 1, // Recommended
-        "jsdoc/require-param-type": 1, // Recommended
-        "jsdoc/require-returns": 1, // Recommended
-        "jsdoc/require-returns-check": 1, // Recommended
-        "jsdoc/require-returns-description": 1, // Recommended
-        "jsdoc/require-returns-type": 1, // Recommended
-        "jsdoc/valid-types": 1 // Recommended
-    }
-}
-```
-
-Or you can simply use the following which enables the rules commented
-above as "recommended":
-
-```json
-{
-  "extends": ["plugin:jsdoc/recommended"]
-}
-```
-
-You can then selectively add to or override the recommended rules.
-
-<a name="eslint-plugin-jsdoc-options"></a>
-## Options
-
-Rules may, as per the [ESLint user guide](https://eslint.org/docs/user-guide/configuring), have their own individual options. In `eslint-plugin-jsdoc`, a few options,
-such as, `exemptedBy` and `contexts`, may be used across different rules.
-
-`eslint-plugin-jsdoc` options, if present, are in the form of an object
-supplied as the second argument in an array after the error level.
-
-```js
-// `.eslintrc.js`
-{
-  rules: {
-    'jsdoc/require-example': [
-        // The Error level should be `error`, `warn`, or `off` (or 2, 1, or 0)
-        'error',
-        // The options vary by rule, but are added to an options object:
-        {
-          avoidExampleOnConstructors: true,
-          exemptedBy: ['type']
-        }
-    ]
-  }
-}
-```
-
-<a name="eslint-plugin-jsdoc-settings"></a>
-## Settings
-
-<a name="eslint-plugin-jsdoc-settings-allow-private-to-disable-rules-for-that-comment-block"></a>
-### Allow <code>@private</code> to disable rules for that comment block
-
-- `settings.jsdoc.ignorePrivate` - Disables all rules for the comment block
-  on which a `@private` tag (or `@access private`) occurs. Defaults to
-  `false`. Note: This has no effect with the rule `check-access` (whose
-  purpose is to check access modifiers).
-
-<a name="eslint-plugin-jsdoc-settings-maxlines-and-minlines"></a>
-### <code>maxLines</code> and <code>minLines</code>
-
-One can use `minLines` and `maxLines` to indicate how many line breaks
-(if any) will be checked to find a jsdoc comment block before the given
-code block. These settings default to `0` and `1` respectively.
-
-In conjunction with the `require-jsdoc` rule, these settings can
-be enforced so as to report problems if a jsdoc block is not found within
-the specified boundaries. The settings are also used in the fixer to determine
-how many line breaks to add when a block is missing.
-
-<a name="eslint-plugin-jsdoc-settings-mode"></a>
-### Mode
-
-- `settings.jsdoc.mode` - Set to `jsdoc` (the default), `typescript`, or `closure`.
-  Currently is used for the following:
-  - Determine valid tags for `check-tag-names`
-  - Only check `@template` in `no-undefined-types` for types in "closure" and
-    "typescript" modes
-  - For type-checking rules, determine which tags will be checked for types
-    (Closure allows types on some tags which the others do not,
-    so these tags will additionally be checked in "closure" mode)
-  - Check preferred tag names
-
-<a name="eslint-plugin-jsdoc-settings-alias-preference"></a>
-### Alias Preference
-
-Use `settings.jsdoc.tagNamePreference` to configure a preferred alias name for a JSDoc tag. The format of the configuration is: `<primary tag name>: <preferred alias name>`, e.g.
-
-```json
-{
-    "rules": {},
-    "settings": {
-        "jsdoc": {
-            "tagNamePreference": {
-                "param": "arg",
-                "returns": "return"
-            }
-        }
-    }
-}
-```
-
-One may also use an object with a `message` and `replacement`.
-
-The following will report the message `@extends is to be used over @augments as it is more evocative of classes than @augments` upon encountering `@augments`.
-
-```json
-{
-    "rules": {},
-    "settings": {
-        "jsdoc": {
-            "tagNamePreference": {
-                "augments": {
-                  "message": "@extends is to be used over @augments as it is more evocative of classes than @augments",
-                  "replacement": "extends"
-                }
-            }
-        }
-    }
-}
-```
-
-If one wishes to reject a normally valid tag, e.g., `@todo`, one may set the tag to `false`:
-
-```json
-{
-    "rules": {},
-    "settings": {
-        "jsdoc": {
-            "tagNamePreference": {
-                "todo": false
-            }
-        }
-    }
-}
-```
-
-A project wishing to ensure no blocks are left excluded from entering the
-documentation, might wish to prevent the `@ignore` tag in the above manner.
-
-Or one may set the targeted tag to an object with a custom `message`, but without a `replacement` property:
-
-```json
-{
-    "rules": {},
-    "settings": {
-        "jsdoc": {
-            "tagNamePreference": {
-                "todo": {
-                  "message": "We expect immediate perfection, so don't leave to-dos in your code."
-                }
-            }
-        }
-    }
-}
-```
-
-Note that the preferred tags indicated in the `settings.jsdoc.tagNamePreference`
-map will be assumed to be defined by `check-tag-names`.
-
-<a name="eslint-plugin-jsdoc-settings-alias-preference-default-preferred-aliases"></a>
-#### Default Preferred Aliases
-
-The defaults in `eslint-plugin-jsdoc` (for tags which offer
-aliases) are as follows:
-
-- `@abstract` (over `@virtual`)
-- `@augments` (over `@extends`)
-- `@class` (over `@constructor`)
-- `@constant` (over `@const`)
-- `@default` (over `@defaultvalue`)
-- `@description` (over `@desc`)
-- `@external` (over `@host`)
-- `@file` (over `@fileoverview`, `@overview`)
-- `@fires` (over `@emits`)
-- `@function` (over `@func`, `@method`)
-- `@member` (over `@var`)
-- `@param` (over `@arg`, `@argument`)
-- `@property` (over `@prop`)
-- `@returns` (over `@return`)
-- `@throws` (over `@exception`)
-- `@yields` (over `@yield`)
-
-This setting is utilized by the the rule for tag name checking
-(`check-tag-names`) as well as in the `@param` and `@require` rules:
-
-- `check-param-names`
-- `check-tag-names`
-- `require-hyphen-before-param-description`
-- `require-description`
-- `require-param`
-- `require-param-description`
-- `require-param-name`
-- `require-param-type`
-- `require-returns`
-- `require-returns-check`
-- `require-returns-description`
-- `require-returns-type`
-
-<a name="eslint-plugin-jsdoc-settings-override-augments-extends-implements-without-accompanying-param-description-example-returns"></a>
-### <code>@override</code>/<code>@augments</code>/<code>@extends</code>/<code>@implements</code> Without Accompanying <code>@param</code>/<code>@description</code>/<code>@example</code>/<code>@returns</code>
-
-The following settings allows the element(s) they reference to be omitted
-on the JSDoc comment block of the function or that of its parent class
-for any of the "require" rules (i.e., `require-param`, `require-description`,
-`require-example`, or `require-returns`).
-
-* `settings.jsdoc.overrideReplacesDocs` (`@override`) - Defaults to `true`
-* `settings.jsdoc.augmentsExtendsReplacesDocs` (`@augments` or its alias `@extends`) - Defaults to `false`.
-* `settings.jsdoc.implementsReplacesDocs` (`@implements`) - Defaults to `false`
-
-The format of the configuration is as follows:
-
-```json
-{
-    "rules": {},
-    "settings": {
-        "jsdoc": {
-            "overrideReplacesDocs": true,
-            "augmentsExtendsReplacesDocs": true,
-            "implementsReplacesDocs": true
-        }
-    }
-}
-```
-
-<a name="eslint-plugin-jsdoc-settings-settings-to-configure-check-types-and-no-undefined-types"></a>
-### Settings to Configure <code>check-types</code> and <code>no-undefined-types</code>
-
-- `settings.jsdoc.preferredTypes` An option map to indicate preferred
-  or forbidden types (if default types are indicated here, these will
-  have precedence over the default recommendations for `check-types`).
-  The keys of this map are the types to be replaced (or forbidden).
-  These keys may include:
-  1. The "ANY" type, `*`
-  1. The pseudo-type `[]` which we use to denote the parent (array)
-    types used in the syntax `string[]`, `number[]`, etc.
-  1. The pseudo-type `.<>` (or `.`) to represent the format `Array.<value>`
-    or `Object.<key, value>`
-  1. The pseudo-type `<>` to represent the format `Array<value>` or
-    `Object<key, value>`
-  1. A plain string type, e.g., `MyType`
-  1. A plain string type followed by one of the above pseudo-types (except
-    for `[]` which is always assumed to be an `Array`), e.g., `Array.`, or
-    `SpecialObject<>`.
-
-  If a bare pseudo-type is used, it will match all parent types of that form.
-  If a pseudo-type prefixed with a type name is used, it will only match
-  parent types of that form and type name.
-
-  The values can be:
-  - `false` to forbid the type
-  - a string to indicate the type that should be preferred in its place
-    (and which `fix` mode can replace); this can be one of the formats
-    of the keys described above.
-    - Note that the format will not be changed unless you use a pseudo-type
-      in the replacement. (For example, `'Array.<>': 'MyArray'` will change
-      `Array.<string>` to `MyArray.<string>`, preserving the dot. To get rid
-      of the dot, you must use the pseudo-type with `<>`, i.e.,
-      `'Array.<>': 'MyArray<>'`, which will change `Array.<string>` to
-      `MyArray<string>`).
-    - If you use a _bare_ pseudo-type in the replacement (e.g.,
-      `'MyArray.<>': '<>'`), the type will be converted to the format
-      of the pseudo-type without changing the type name. For example,
-      `MyArray.<string>` will become `MyArray<string>` but `Array.<string>`
-      will not be modified.
-  - an object with:
-    - the key `message` to provide a specific error message
-      when encountering the discouraged type.
-      - The message string will have the substrings with special meaning,
-        `{{tagName}}` and `{{tagValue}}`, replaced with their
-        corresponding value.
-    - an optional key `replacement` with either of the following values:
-      - a string type to be preferred in its place (and which `fix` mode
-        can replace)
-      - `false` (for forbidding the type)
-
-Note that the preferred types indicated as targets in `settings.jsdoc.preferredTypes`
-map will be assumed to be defined by `no-undefined-types`.
-
-See the option of `check-types`, `unifyParentAndChildTypeChecks`, for
-how the keys of `preferredTypes` may have `<>` or `.<>` (or just `.`)
-appended and its bearing on whether types are checked as parents/children
-only (e.g., to match `Array` if the type is `Array` vs. `Array.<string>`).
-
-<a name="eslint-plugin-jsdoc-rules"></a>
-## Rules
-
-<a name="eslint-plugin-jsdoc-rules-check-access"></a>
-### <code>check-access</code>
-
-Checks that `@access` tags use one of the following values:
-
-- "package", "private", "protected", "public"
-
-Also reports:
-
-- Mixing of `@access` with `@public`, `@private`, `@protected`, or `@package`
-  on the same doc block.
-- Use of multiple instances of `@access` (or the `@public`, etc. style tags)
-  on the same doc block.
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|`@access`|
-|Settings||
-|Options||
-
-The following patterns are considered problems:
-
-````js
-/**
- * @access foo
- */
-function quux (foo) {
-
-}
-// Message: Missing valid JSDoc @access level.
-
-/**
- * @access foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"ignorePrivate":true}}
-// Message: Missing valid JSDoc @access level.
-
-/**
- * @accessLevel foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"access":"accessLevel"}}}
-// Message: Missing valid JSDoc @accessLevel level.
-
-/**
- * @access
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"access":false}}}
-// Message: Unexpected tag `@access`
-
-class MyClass {
-  /**
-   * @access
-   */
-  myClassField = 1
-}
-// Message: Missing valid JSDoc @access level.
-
-/**
- * @access public
- * @public
- */
-function quux (foo) {
-
-}
-// Message: The @access tag may not be used with specific access-control tags (@package, @private, @protected, or @public).
-
-/**
- * @access public
- * @access private
- */
-function quux (foo) {
-
-}
-// Message: At most one access-control tag may be present on a jsdoc block.
-
-/**
- * @access public
- * @access private
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"ignorePrivate":true}}
-// Message: At most one access-control tag may be present on a jsdoc block.
-
-/**
- * @public
- * @private
- */
-function quux (foo) {
-
-}
-// Message: At most one access-control tag may be present on a jsdoc block.
-
-/**
- * @public
- * @private
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"ignorePrivate":true}}
-// Message: At most one access-control tag may be present on a jsdoc block.
-
-/**
- * @public
- * @public
- */
-function quux (foo) {
-
-}
-// Message: At most one access-control tag may be present on a jsdoc block.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- *
- */
-function quux (foo) {
-
-}
-
-/**
- * @access public
- */
-function quux (foo) {
-
-}
-
-/**
- * @accessLevel package
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"access":"accessLevel"}}}
-
-class MyClass {
-  /**
-   * @access private
-   */
-  myClassField = 1
-}
-
-/**
- * @public
- */
-function quux (foo) {
-
-}
-
-/**
- * @private
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"ignorePrivate":true}}
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-check-alignment"></a>
-### <code>check-alignment</code>
-
-Reports invalid alignment of JSDoc block asterisks.
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|N/A|
-
-The following patterns are considered problems:
-
-````js
-/**
-  * @param {Number} foo
- */
-function quux (foo) {
-  // with spaces
-}
-// Message: Expected JSDoc block to be aligned.
-
-/**
-  * @param {Number} foo
- */
-function quux (foo) {
-	// with tabs
-}
-// Message: Expected JSDoc block to be aligned.
-
-/**
-  * @param {Number} foo
- */
-function quux (foo) {
-  // with spaces
-}
-// Message: Expected JSDoc block to be aligned.
-
-/**
-* @param {Number} foo
-*/
-function quux (foo) {
-  // with spaces
-}
-// Message: Expected JSDoc block to be aligned.
-
-/**
- * @param {Number} foo
-  */
-function quux (foo) {
-
-}
-// Message: Expected JSDoc block to be aligned.
-
- /**
- * @param {Number} foo
- */
-function quux (foo) {
-
-}
-// Message: Expected JSDoc block to be aligned.
-
- /**
-  * @param {Number} foo
- */
-function quux (foo) {
-
-}
-// Message: Expected JSDoc block to be aligned.
-
-/**
-  * @param {Number} foo
-  */
- function quux (foo) {
-
- }
-// Message: Expected JSDoc block to be aligned.
-
-/**
-   * A jsdoc not attached to any node.
- */
-// Message: Expected JSDoc block to be aligned.
-
-class Foo {
-  /**
-   *  Some method
-    * @param a
-   */
-  quux(a) {}
-}
-// Message: Expected JSDoc block to be aligned.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * Desc
- *
- * @param {Number} foo
- */
-function quux (foo) {
-
-}
-
-/**
- * Desc
- *
- * @param {{
-  foo: Bar,
-  bar: Baz
- * }} foo
- *
- */
-function quux (foo) {
-
-}
-
-/*  <- JSDoc must start with 2 stars.
-  *    So this is unchecked.
- */
-function quux (foo) {}
-
-/**
-  * @param {Number} foo
-  * @private
- */
-function quux (foo) {
-  // with spaces
-}
-// Settings: {"jsdoc":{"ignorePrivate":true}}
-
-/**
-  * @param {Number} foo
-  * @access private
- */
-function quux (foo) {
-  // with spaces
-}
-// Settings: {"jsdoc":{"ignorePrivate":true}}
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-check-examples"></a>
-### <code>check-examples</code>
-
-Ensures that (JavaScript) examples within JSDoc adhere to ESLint rules.
-
-<a name="eslint-plugin-jsdoc-rules-check-examples-options-1"></a>
-#### Options
-
-The options below all default to no-op/`false` except as noted.
-
-<a name="eslint-plugin-jsdoc-rules-check-examples-options-1-captionrequired"></a>
-##### <code>captionRequired</code>
-
-JSDoc specs use of an optional `<caption>` element at the beginning of
-`@example`.
-
-The option `captionRequired` insists on a `<caption>` being present at
-the beginning of any `@example`.
-
-<a name="eslint-plugin-jsdoc-rules-check-examples-options-1-examplecoderegex-and-rejectexamplecoderegex"></a>
-##### <code>exampleCodeRegex</code> and <code>rejectExampleCodeRegex</code>
-
-JSDoc does not specify a formal means for delimiting code blocks within
-`@example` (it uses generic syntax highlighting techniques for its own
-syntax highlighting). The following options determine whether a given
-`@example` tag will have the `check-examples` checks applied to it:
-
-* `exampleCodeRegex` - Regex which whitelists lintable
-  examples. If a parenthetical group is used, the first one will be used,
-  so you may wish to use `(?:...)` groups where you do not wish the
-  first such group treated as one to include. If no parenthetical group
-  exists or matches, the whole matching expression will be used.
-  An example might be ````"^```(?:js|javascript)([\\s\\S]*)```\s*$"````
-  to only match explicitly fenced JavaScript blocks. Defaults to only
-  using the `u` flag, so to add your own flags, encapsulate your
-  expression as a string, but like a literal, e.g., ````/```js.*```/gi````.
-  Note that specifying a global regular expression (i.e., with `g`) will
-  allow independent linting of matched blocks within a single `@example`.
-* `rejectExampleCodeRegex` - Regex blacklist which rejects
-  non-lintable examples (has priority over `exampleCodeRegex`). An example
-  might be ```"^`"``` to avoid linting fenced blocks which may indicate
-  a non-JavaScript language. See `exampleCodeRegex` on how to add flags
-  if the default `u` is not sufficient.
-
-If neither is in use, all examples will be matched. Note also that even if
-`captionRequired` is not set, any initial `<caption>` will be stripped out
-before doing the regex matching.
-
-<a name="eslint-plugin-jsdoc-rules-check-examples-options-1-paddedindent"></a>
-##### <code>paddedIndent</code>
-
-This integer property allows one to add a fixed amount of whitespace at the
-beginning of the second or later lines of the example to be stripped so as
-to avoid linting issues with the decorative whitespace. For example, if set
-to a value of `4`, the initial whitespace below will not trigger `indent`
-rule errors as the extra 4 spaces on each subsequent line will be stripped
-out before evaluation.
-
-```js
-/**
- * @example
- *     anArray.filter((a) => {
- *      return a.b;
- *     });
- */
-```
-
-<a name="eslint-plugin-jsdoc-rules-check-examples-options-1-reportunuseddisabledirectives"></a>
-##### <code>reportUnusedDisableDirectives</code>
-
-If not set to `false`, `reportUnusedDisableDirectives` will report disabled
-directives which are not used (and thus not needed). Defaults to `true`.
-Corresponds to ESLint's [`--report-unused-disable-directives`](https://eslint.org/docs/user-guide/command-line-interface#--report-unused-disable-directives).
-
-Inline ESLint config within `@example` JavaScript is allowed, though the
-disabling of ESLint directives which are not needed by the resolved rules
-will be reported as with the ESLint `--report-unused-disable-directives`
-command.
-
-<a name="eslint-plugin-jsdoc-rules-check-examples-options-for-determining-eslint-rule-applicability-allowinlineconfig-nodefaultexamplerules-matchingfilename-configfile-checkeslintrc-and-baseconfig"></a>
-#### Options for Determining ESLint Rule Applicability (<code>allowInlineConfig</code>, <code>noDefaultExampleRules</code>, <code>matchingFileName</code>, <code>configFile</code>, <code>checkEslintrc</code>, and <code>baseConfig</code>)
-
-The following options determine which individual ESLint rules will be
-applied to the JavaScript found within the `@example` tags (as determined
-to be applicable by the above regex options). They are ordered by
-decreasing precedence:
-
-* `allowInlineConfig` - If not set to `false`, will allow
-  inline config within the `@example` to override other config. Defaults
-  to `true`.
-* `noDefaultExampleRules` - Setting to `true` will disable the
-  default rules which are expected to be troublesome for most documentation
-  use. See the section below for the specific default rules.
-* `configFile` - A config file. Corresponds to ESLint's [`-c`](https://eslint.org/docs/user-guide/command-line-interface#-c---config).
-* `matchingFileName` - Option for a file name (even non-existent) to trigger
-  specific rules defined in one's config; usable with ESLint `.eslintrc.*`
-  `overrides` -> `files` globs, to apply a desired subset of rules with
-  `@example` (besides allowing for rules specific to examples, this option
-  can be useful for enabling reuse of the same rules within `@example` as
-  with JavaScript Markdown lintable by
-  [other plugins](https://github.com/eslint/eslint-plugin-markdown), e.g.,
-  if one sets `matchingFileName` to `dummy.md` so that `@example` rules will
-  follow one's Markdown rules).
-* `checkEslintrc` - Defaults to `true` in adding rules
-  based on an `.eslintrc.*` file. Setting to `false` corresponds to
-  ESLint's [`--no-eslintrc`](https://eslint.org/docs/user-guide/command-line-interface#--no-eslintrc).
-  If `matchingFileName` is set, this will automatically be `true` and
-  will use the config corresponding to that file. If `matchingFileName` is
-  not set and this value is set to `false`, the `.eslintrc.*` configs will
-  not be checked. If `matchingFileName` is not set, and this is unset or
-  set to `true`, the `.eslintrc.*` configs will be checked as though the file
-  name were the same as the file containing the example, with any file
-  extension changed to ".md" (and if there is no file extension, "dummy.md"
-  will be used). This allows convenient sharing of similar rules with often
-  also context-free Markdown as well as use of `overrides` as described under
-  `matchingFileName`. Note that this option (whether set by `matchingFileName`
-  or set manually to `true`) may come at somewhat of a performance penalty
-  as the file's existence is checked by eslint.
-* `baseConfig` - Set to an object of rules with the same schema
-  as `.eslintrc.*` for defaults.
-
-<a name="eslint-plugin-jsdoc-rules-check-examples-options-for-determining-eslint-rule-applicability-allowinlineconfig-nodefaultexamplerules-matchingfilename-configfile-checkeslintrc-and-baseconfig-rules-disabled-by-default-unless-nodefaultexamplerules-is-set-to-true"></a>
-##### Rules Disabled by Default Unless <code>noDefaultExampleRules</code> is Set to <code>true</code>
-
-* `eol-last` - Insisting that a newline "always" be at the end is less likely
-  to be desired in sample code as with the code file convention.
-* `no-console` - This rule is unlikely to have inadvertent temporary debugging
-  within examples.
-* `no-multiple-empty-lines` - This rule may be problematic for projects which
-  use an initial newline just to start an example. Also, projects may wish to
-  use extra lines within examples just for easier illustration
-  purposes.
-* `no-undef` - Many variables in examples will be `undefined`.
-* `no-unused-vars` - It is common to define variables for clarity without always
-  using them within examples.
-* `padded-blocks` - It can generally look nicer to pad a little even if one's
-  code follows more stringency as far as block padding.
-* `import/no-unresolved` - One wouldn't generally expect example paths to
-  resolve relative to the current JavaScript file as one would with real code.
-* `import/unambiguous` - Snippets in examples are likely too short to always
-  include full import/export info.
-* `node/no-missing-import` - See `import/no-unresolved`.
-* `node/no-missing-require` -  See `import/no-unresolved`.
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|`example`|
-|Options| *See above* |
-
-The following patterns are considered problems:
-
-````js
-/**
- * @example alert('hello')
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"no-alert":2,"semi":["error","always"]}},"checkEslintrc":false}]
-// Message: @example error (no-alert): Unexpected alert.
-
-/**
- * @example alert('hello')
- */
-class quux {
-
-}
-// Options: [{"baseConfig":{"rules":{"no-alert":2,"semi":["error","always"]}},"checkEslintrc":false}]
-// Message: @example error (no-alert): Unexpected alert.
-
-/**
- * @example ```js
- alert('hello');
- ```
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"semi":["error","never"]}},"checkEslintrc":false,"exampleCodeRegex":"```js([\\s\\S]*)```"}]
-// Message: @example error (semi): Extra semicolon.
-
-/**
- * @example
- *
- * ```js alert('hello'); ```
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"semi":["error","never"]}},"checkEslintrc":false,"exampleCodeRegex":"```js ([\\s\\S]*)```"}]
-// Message: @example error (semi): Extra semicolon.
-
-/**
- * @example
- * ```js alert('hello'); ```
- */
-var quux = {
-
-};
-// Options: [{"baseConfig":{"rules":{"semi":["error","never"]}},"checkEslintrc":false,"exampleCodeRegex":"```js ([\\s\\S]*)```"}]
-// Message: @example error (semi): Extra semicolon.
-
-/**
- * @example ```
- * js alert('hello'); ```
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"semi":["error","never"]}},"checkEslintrc":false,"exampleCodeRegex":"```\njs ([\\s\\S]*)```"}]
-// Message: @example error (semi): Extra semicolon.
-
-/**
- * @example <b>Not JavaScript</b>
- */
-function quux () {
-
-}
-/**
- * @example quux2();
- */
-function quux2 () {
-
-}
-// Options: [{"baseConfig":{"rules":{"semi":["error","never"]}},"checkEslintrc":false,"rejectExampleCodeRegex":"^\\s*<.*>\\s*$"}]
-// Message: @example error (semi): Extra semicolon.
-
-/**
- * @example
- * quux(); // does something useful
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"no-undef":["error"]}},"checkEslintrc":false,"noDefaultExampleRules":true}]
-// Message: @example error (no-undef): 'quux' is not defined.
-
-/**
- * @example <caption>Valid usage</caption>
- * quux(); // does something useful
- *
- * @example
- * quux('random unwanted arg'); // results in an error
- */
-function quux () {
-
-}
-// Options: [{"captionRequired":true,"checkEslintrc":false}]
-// Message: Caption is expected for examples.
-
-/**
- * @example  quux();
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"indent":["error"]}},"checkEslintrc":false,"noDefaultExampleRules":false}]
-// Message: @example error (indent): Expected indentation of 0 spaces but found 1.
-
-/**
- * @example test() // eslint-disable-line semi
- */
-function quux () {}
-// Options: [{"checkEslintrc":false,"noDefaultExampleRules":true,"reportUnusedDisableDirectives":true}]
-// Message: @example error: Unused eslint-disable directive (no problems were reported from 'semi').
-
-/**
- * @example
- test() // eslint-disable-line semi
- */
-function quux () {}
-// Options: [{"allowInlineConfig":false,"baseConfig":{"rules":{"semi":["error","always"]}},"checkEslintrc":false,"noDefaultExampleRules":true}]
-// Message: @example error (semi): Missing semicolon.
-
-/**
- * @example const i = 5;
- * quux2()
- */
-function quux2 () {
-
-}
-// Options: [{"matchingFileName":"../../jsdocUtils.js"}]
-// Message: @example warning (id-length): Identifier name 'i' is too short (< 2).
-
-/**
- * @example const i = 5;
- * quux2()
- */
-function quux2 () {
-
-}
-// Message: @example warning (id-length): Identifier name 'i' is too short (< 2).
-
-/**
- * @example const i = 5;
- *   quux2()
- */
-function quux2 () {
-
-}
-// Options: [{"paddedIndent":2}]
-// Message: @example warning (id-length): Identifier name 'i' is too short (< 2).
-
-/**
- * @example
- * const i = 5;
- * quux2()
- */
-function quux2 () {
-
-}
-// Message: @example warning (id-length): Identifier name 'i' is too short (< 2).
-
-/**
- * @example const idx = 5;
- * quux2()
- */
-function quux2 () {
-
-}
-// Options: [{"matchingFileName":"dummy.js"}]
-// Message: @example error (semi): Missing semicolon.
-
-/**
- * @example const idx = 5;
- *
- * quux2()
- */
-function quux2 () {
-
-}
-// Options: [{"matchingFileName":"dummy.js"}]
-// Message: @example error (semi): Missing semicolon.
-
-/**
- * @example const idx = 5;
- *
- * quux2()
- */
-function quux2 () {
-
-}
-// Options: [{"checkEslintrc":false,"matchingFileName":"dummy.js"}]
-// Message: @example error: Parsing error: The keyword 'const' is reserved
-
-/**
- * @example // begin
- alert('hello')
- // end
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"semi":["warn","always"]}},"checkEslintrc":false,"exampleCodeRegex":"// begin[\\s\\S]*// end","noDefaultExampleRules":true}]
-// Message: @example warning (semi): Missing semicolon.
-
-/**
- *
- */
-function f () {
-
-}
-// Settings: {"jsdoc":{"allowInlineConfig":true,"baseConfig":{},"captionRequired":false,"configFile":"configFile.js","eslintrcForExamples":true,"exampleCodeRegex":".*?","matchingFileName":"test.md","noDefaultExampleRules":false,"rejectExampleCodeRegex":"\\W*","reportUnusedDisableDirectives":true}}
-// Message: `settings.jsdoc.captionRequired` has been removed, use options in the rule `check-examples` instead.
-
-/**
- * @typedef {string} Foo
- * @example <caption></caption>
- * 'foo'
- */
-// Options: [{"captionRequired":true,"checkEslintrc":false}]
-// Message: Caption is expected for examples.
-
-/**
- * @example
- * const list: number[] = [1, 2, 3]
- * quux(list);
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"parser":"@typescript-eslint/parser","parserOptions":{"ecmaVersion":6},"rules":{"semi":["error","always"]}},"checkEslintrc":false}]
-// Message: @example error (semi): Missing semicolon.
-
-/**
- * @example
- * const test = something?.find((_) => {
- *   return _
- * });
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"parserOptions":{"ecmaVersion":6},"rules":{"semi":["error","always"]}}}]
-// Message: @example error (semi): Missing semicolon.
-
-/**
- * @example <caption>Say `Hello!` to the user.</caption>
- * First, import the function:
- *
- * ```js
- * import popup from './popup'
- * const aConstInSameScope = 5;
- * ```
- *
- * Then use it like this:
- *
- * ```js
- * const aConstInSameScope = 7;
- * popup('Hello!')
- * ```
- *
- * Here is the result on macOS:
- *
- * ![Screenshot](path/to/screenshot.jpg)
- */
-// Options: [{"baseConfig":{"parserOptions":{"ecmaVersion":2015,"sourceType":"module"},"rules":{"semi":["error","always"]}},"checkEslintrc":false,"exampleCodeRegex":"/^```(?:js|javascript)\\n([\\s\\S]*?)```$/gm"}]
-// Message: @example error (semi): Missing semicolon.
-
-/**
- * @example // begin
- alert('hello')
- // end
- * And here is another example:
- // begin
- alert('there')
- // end
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"semi":["warn","always"]}},"checkEslintrc":false,"exampleCodeRegex":"/\\/\\/ begin[\\s\\S]*?// end/g","noDefaultExampleRules":true}]
-// Message: @example warning (semi): Missing semicolon.
-
-/**
- * @example
- *   quux();
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"indent":["error"]}},"checkEslintrc":false,"noDefaultExampleRules":false}]
-// Message: @example error (indent): Expected indentation of 0 spaces but found 2.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @example ```js
- alert('hello');
- ```
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"semi":["error","always"]}},"checkEslintrc":false,"exampleCodeRegex":"```js([\\s\\S]*)```"}]
-
-/**
- * @example ```js
- alert('hello');
- ```
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"semi":["error","always"]}},"checkEslintrc":false,"exampleCodeRegex":"/```js([\\s\\S]*)```/"}]
-
-/**
- * @example
- * // arbitrary example content
- */
-function quux () {
-
-}
-// Options: [{"checkEslintrc":false}]
-
-/**
- * @example
- * quux(); // does something useful
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"no-undef":["error"]}},"checkEslintrc":false,"noDefaultExampleRules":false}]
-
-/**
- * @example quux();
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"indent":["error"]}},"checkEslintrc":false,"noDefaultExampleRules":false}]
-
-/**
- * @example <caption>Valid usage</caption>
- * quux(); // does something useful
- *
- * @example <caption>Invalid usage</caption>
- * quux('random unwanted arg'); // results in an error
- */
-function quux () {
-
-}
-// Options: [{"captionRequired":true,"checkEslintrc":false}]
-
-/**
- * @example test() // eslint-disable-line semi
- */
-function quux () {}
-// Options: [{"checkEslintrc":false,"noDefaultExampleRules":true,"reportUnusedDisableDirectives":false}]
-
-/**
- * @example
- test() // eslint-disable-line semi
- */
-function quux () {}
-// Options: [{"allowInlineConfig":true,"baseConfig":{"rules":{"semi":["error","always"]}},"checkEslintrc":false,"noDefaultExampleRules":true}]
-
-/**
- * @example ```js
- alert('hello')
- ```
- */
-var quux = {
-
-};
-// Options: [{"baseConfig":{"rules":{"semi":["error","never"]}},"checkEslintrc":false,"exampleCodeRegex":"```js([\\s\\S]*)```"}]
-
-/**
- * @example
- * foo(function (err) {
- *     throw err;
- * });
- */
-function quux () {}
-// Options: [{"baseConfig":{"rules":{"indent":["error"]}},"checkEslintrc":false,"noDefaultExampleRules":false}]
-
-/**
- * @example
- * const list: number[] = [1, 2, 3];
- * quux(list);
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"parser":"@typescript-eslint/parser","parserOptions":{"ecmaVersion":6},"rules":{"semi":["error","always"]}},"checkEslintrc":false}]
-
-/**
- * @example const ident = 5;
- *   quux2();
- *   bar();
- */
-function quux2 () {
-
-}
-// Options: [{"paddedIndent":2}]
-
-/**
- * @example
- * function quux() {
- *     bar();
- * }
- */
-function quux () {
-
-}
-// Options: [{"baseConfig":{"rules":{"indent":["error"]}},"checkEslintrc":false,"noDefaultExampleRules":false}]
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-check-indentation"></a>
-### <code>check-indentation</code>
-
-Reports invalid padding inside JSDoc blocks.
-
-Ignores parts enclosed in Markdown "code block"'s. For example,
-the following description is not reported:
-
-```js
-/**
- * Some description:
- * ```html
- * <section>
- *   <title>test</title>
- * </section>
- * ```
- */
-```
-
-<a name="eslint-plugin-jsdoc-rules-check-indentation-options-2"></a>
-#### Options
-
-This rule has an object option.
-
-<a name="eslint-plugin-jsdoc-rules-check-indentation-options-2-excludetags"></a>
-##### <code>excludeTags</code>
-
-Array of tags (e.g., `['example', 'description']`) whose content will be
-"hidden" from the `check-indentation` rule. Defaults to `['example']`.
-
-By default, the whole JSDoc block will be checked for invalid padding.
-That would include `@example` blocks too, which can get in the way
-of adding full, readable examples of code without ending up with multiple
-linting issues.
-
-When disabled (by passing `excludeTags: []` option), the following code *will*
-report a padding issue:
-
-```js
-/**
- * @example
- * anArray.filter((a) => {
- *   return a.b;
- * });
- */
-```
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|N/A|
-|Options| `excludeTags` |
-
-The following patterns are considered problems:
-
-````js
-/**  foo */
-function quux () {
-
-}
-// Message: There must be no indentation.
-
-/**
- * foo
- *
- * @param bar
- *  baz
- */
-function quux () {
-
-}
-// Message: There must be no indentation.
-
-/**
- * Foo
- *   bar
- */
-class Moo {}
-// Message: There must be no indentation.
-
-/**
- * foo
- *
- * @example
- * anArray.filter((a) => {
- *   return a.b;
- * });
- */
-function quux () {
-
-}
-// Options: [{"excludeTags":[]}]
-// Message: There must be no indentation.
-
-/**
- * foo
- *
- * @example
- *   aaaa
- * @returns
- *   eeee
- */
-function quux () {
-
-}
-// Message: There must be no indentation.
-
-/**
- * foo
- * ```html
- * <section>
- *   <title>test</title>
- * </section>
- * ```
- * @returns
- *   eeee
- */
-function quux () {
-
-}
-// Message: There must be no indentation.
-
-/**
- * foo
- * ```   aaaa```
- * @returns
- *   eeee
- */
-function quux () {
-
-}
-// Message: There must be no indentation.
-
-/**
-* @example <caption>
-* Here is a long
-*   indented summary of this
-* example
-* </caption>
-* ```js
-* function hi () {
-*   alert('Hello');
-* }
-* ```
-*/
-// Options: [{"excludeTags":[]}]
-// Message: There must be no indentation.
-
-/**
-* @example <caption>
-* Here is a long
-* summary of this
-* example
-* </caption>
-* // Code is not wrapped into fenced code block
-* function hi () {
-*   alert('Hello');
-* }
-*/
-// Options: [{"excludeTags":[]}]
-// Message: There must be no indentation.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * foo
- *
- * @param bar
- * baz
- */
-function quux () {
-
-}
-
-/*** foo */
-function quux () {
-
-}
-
-/**
- * foo
- *
- * @example
- * anArray.filter((a) => {
- *   return a.b;
- * });
- */
-function quux () {
-
-}
-
-/**
- * foo
- *
- * @example
- * anArray.filter((a) => {
- *   return a.b;
- * });
- * @returns
- *   eeee
- */
-function quux () {
-
-}
-// Options: [{"excludeTags":["example","returns"]}]
-
-/**
- * foo
- * ```html
- * <section>
- *   <title>test</title>
- * </section>
- * ```
- * @returns eeee
- */
-function quux () {
-
-}
-
-/**
- * foo
- * ```   aaaa```
- * @returns eeee
- */
-function quux () {
-
-}
-
-/**
-* @example <caption>
-* Here is a long
-* summary of this
-* example
-* </caption>
-* ```js
-* function hi () {
-*   alert('Hello');
-* }
-* ```
-*/
-// Options: [{"excludeTags":[]}]
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-check-param-names"></a>
-### <code>check-param-names</code>
-
-Ensures that parameter names in JSDoc match those in the function declaration.
-
-<a name="eslint-plugin-jsdoc-rules-check-param-names-options-3"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-check-param-names-options-3-allowextratrailingparamdocs"></a>
-##### <code>allowExtraTrailingParamDocs</code>
-
-If set to `true`, this option will allow extra `@param` definitions (e.g.,
-representing future expected or virtual params) to be present without needing
-their presence within the function signature. Other inconsistencies between
-`@param`'s and present function parameters will still be reported.
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`|
-|Options|`allowExtraTrailingParamDocs`|
-|Tags|`param`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @param Foo
- */
-function quux (foo = 'FOO') {
-
-}
-// Message: Expected @param names to be "foo". Got "Foo".
-
-/**
- * @arg Foo
- */
-function quux (foo = 'FOO') {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":"arg"}}}
-// Message: Expected @arg names to be "foo". Got "Foo".
-
-/**
- * @param Foo
- */
-function quux (foo) {
-
-}
-// Message: Expected @param names to be "foo". Got "Foo".
-
-/**
- * @param Foo.Bar
- */
-function quux (foo) {
-
-}
-// Message: @param path declaration ("Foo.Bar") appears before any real parameter.
-
-/**
- * @param foo
- * @param Foo.Bar
- */
-function quux (foo) {
-
-}
-// Message: @param path declaration ("Foo.Bar") root node name ("Foo") does not match previous real parameter name ("foo").
-
-/**
- * Assign the project to a list of employees.
- * @param {string} employees[].name - The name of an employee.
- * @param {string} employees[].department - The employee's department.
- */
-function assign (employees) {
-
-};
-// Message: @param path declaration ("employees[].name") appears before any real parameter.
-
-/**
- * Assign the project to a list of employees.
- * @param {string} employees[].name - The name of an employee.
- * @param {string} employees[].name - The employee's department.
- */
-function assign (employees) {
-
-};
-// Message: Duplicate @param "employees[].name"
-
-/**
- * @param foo
- * @param foo.bar
- * @param bar
- */
-function quux (bar, foo) {
-
-}
-// Message: Expected @param names to be "bar, foo". Got "foo, bar".
-
-/**
- * @param foo
- * @param bar
- */
-function quux (foo) {
-
-}
-// Message: @param "bar" does not match an existing function parameter.
-
-/**
- * @param foo
- * @param foo
- */
-function quux (foo) {
-
-}
-// Message: Duplicate @param "foo"
-
-/**
- * @param foo
- * @param foo
- */
-function quux (foo, bar) {
-
-}
-// Message: Duplicate @param "foo"
-
-/**
- * @param foo
- * @param foo
- */
-function quux (foo, foo) {
-
-}
-// Message: Duplicate @param "foo"
-
-/**
- * @param cfg
- * @param cfg.foo
- * @param cfg.foo
- */
-function quux ({foo, bar}) {
-
-}
-// Message: Duplicate @param "cfg.foo"
-
-/**
- * @param cfg
- * @param cfg.foo
- * @param [cfg.foo]
- * @param baz
- */
-function quux ({foo, bar}, baz) {
-
-}
-// Message: Duplicate @param "cfg.foo"
-
-/**
- * @param cfg
- * @param cfg.foo
- * @param [cfg.foo="with a default"]
- * @param baz
- */
-function quux ({foo, bar}, baz) {
-
-}
-// Message: Duplicate @param "cfg.foo"
-
-export class SomeClass {
-  /**
-   * @param prop
-   */
-  constructor(private property: string) {}
-}
-// Message: Expected @param names to be "property". Got "prop".
-
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":false}}}
-// Message: Unexpected tag `@param`
-
-/**
- * @param {Error} error Exit code
- * @param {number} [code = 1] Exit code
- */
-function quux (error, cde = 1) {
-};
-// Message: Expected @param names to be "error, cde". Got "error, code".
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- *
- */
-function quux (foo) {
-
-}
-
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @param foo
- * @param bar
- */
-function quux (foo, bar) {
-
-}
-
-/**
- * @param foo
- * @param bar
- */
-function quux (foo, bar, baz) {
-
-}
-
-/**
- * @param foo
- * @param foo.foo
- * @param bar
- */
-function quux (foo, bar) {
-
-}
-
-/**
- * @param args
- */
-function quux (...args) {
-
-}
-
-/**
- * @param foo
- */
-function quux ({a, b}) {
-
-}
-
-/**
- * @param foo
- * @param foo.bar
- * @param foo.baz
- * @param bar
- */
-function quux (foo, bar) {
-
-}
-
-/**
- * @param args
- */
-function quux ({a, b} = {}) {
-
-}
-
-/**
- * @param foo
- */
-function quux ([a, b] = []) {
-
-}
-
-/**
- * Assign the project to a list of employees.
- * @param {object[]} employees - The employees who are responsible for the project.
- * @param {string} employees[].name - The name of an employee.
- * @param {string} employees[].department - The employee's department.
- */
-function assign (employees) {
-
-};
-
-export class SomeClass {
-  /**
-   * @param property
-   */
-  constructor(private property: string) {}
-}
-
-/**
- * @param {Error} error Exit code
- * @param {number} [code = 1] Exit code
- */
-function quux (error, code = 1) {
-};
-
-/**
- * @param foo
- * @param bar
- */
-function quux (foo) {
-
-}
-// Options: [{"allowExtraTrailingParamDocs":true}]
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-check-param-names-deconstructing-function-parameter"></a>
-#### Deconstructing Function Parameter
-
-`eslint-plugin-jsdoc` does not validate names of parameters in function deconstruction, e.g.
-
-```js
-/**
- * @param foo
- */
-function quux ({
-    a,
-    b
-}) {
-
-}
-```
-
-`{a, b}` is an [`ObjectPattern`](https://github.com/estree/estree/blob/master/es2015.md#objectpattern) AST type and does not have a name. Therefore, the associated parameter in JSDoc block can have any name.
-
-Likewise for the pattern `[a, b]` which is an [`ArrayPattern`](https://github.com/estree/estree/blob/master/es2015.md#arraypattern).
-
-<a name="eslint-plugin-jsdoc-rules-check-property-names"></a>
-### <code>check-property-names</code>
-
-Ensures that property names in JSDoc are not duplicated on the same block
-and that nested properties have defined roots.
-
-<a name="eslint-plugin-jsdoc-rules-check-property-names-options-4"></a>
-#### Options
-
-|||
-|---|---|
-|Context|Everywhere|
-|Tags|`property`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @typedef (SomeType) SomeTypedef
- * @property Foo.Bar
- */
-// Message: @property path declaration ("Foo.Bar") appears before any real property.
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @property foo
- * @property Foo.Bar
- */
-// Message: @property path declaration ("Foo.Bar") root node name ("Foo") does not match previous real property name ("foo").
-
-/**
- * Assign the project to a list of employees.
- * @typedef (SomeType) SomeTypedef
- * @property {string} employees[].name - The name of an employee.
- * @property {string} employees[].department - The employee's department.
- */
-// Message: @property path declaration ("employees[].name") appears before any real property.
-
-/**
- * Assign the project to a list of employees.
- * @typedef (SomeType) SomeTypedef
- * @property {string} employees[].name - The name of an employee.
- * @property {string} employees[].name - The employee's department.
- */
-// Message: Duplicate @property "employees[].name"
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @property foo
- * @property foo
- */
-// Message: Duplicate @property "foo"
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @property cfg
- * @property cfg.foo
- * @property cfg.foo
- */
-function quux ({foo, bar}) {
-
-}
-// Message: Duplicate @property "cfg.foo"
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @property cfg
- * @property cfg.foo
- * @property [cfg.foo]
- * @property baz
- */
-function quux ({foo, bar}, baz) {
-
-}
-// Message: Duplicate @property "cfg.foo"
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @property cfg
- * @property cfg.foo
- * @property [cfg.foo="with a default"]
- * @property baz
- */
-function quux ({foo, bar}, baz) {
-
-}
-// Message: Duplicate @property "cfg.foo"
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @prop foo
- * @prop foo
- */
-// Settings: {"jsdoc":{"tagNamePreference":{"property":"prop"}}}
-// Message: Duplicate @prop "foo"
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @property foo
- */
-// Settings: {"jsdoc":{"tagNamePreference":{"property":false}}}
-// Message: Unexpected tag `@property`
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- *
- */
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @property foo
- */
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @prop foo
- */
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @property foo
- * @property bar
- */
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @property foo
- * @property foo.foo
- * @property bar
- */
-
-/**
- * Assign the project to a list of employees.
- * @typedef (SomeType) SomeTypedef
- * @property {object[]} employees - The employees who are responsible for the project.
- * @property {string} employees[].name - The name of an employee.
- * @property {string} employees[].department - The employee's department.
- */
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @property {Error} error Exit code
- * @property {number} [code = 1] Exit code
- */
-
-/**
- * @namespace (SomeType) SomeNamespace
- * @property {Error} error Exit code
- * @property {number} [code = 1] Exit code
- */
-
-/**
- * @class
- * @property {Error} error Exit code
- * @property {number} [code = 1] Exit code
- */
-function quux (code = 1) {
-  this.error = new Error('oops');
-  this.code = code;
-}
-
-/**
- * @typedef (SomeType) SomeTypedef
- * @property foo
- * @property foo.bar
- * @property foo.baz
- * @property bar
- */
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-check-syntax"></a>
-### <code>check-syntax</code>
-
-Reports against Google Closure Compiler syntax.
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|N/A|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @param {string=} foo
- */
-function quux (foo) {
-
-}
-// Message: Syntax should not be Google Closure Compiler style.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @param {string} [foo]
- */
-function quux (foo) {
-
-}
-
-/**
- *
- */
-function quux (foo) {
-
-}
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-check-tag-names"></a>
-### <code>check-tag-names</code>
-
-Reports invalid block tag names.
-
-Valid [JSDoc 3 Block Tags](https://jsdoc.app/#block-tags) are:
-
-```
-abstract
-access
-alias
-async
-augments
-author
-borrows
-callback
-class
-classdesc
-constant
-constructs
-copyright
-default
-deprecated
-description
-enum
-event
-example
-exports
-external
-file
-fires
-function
-generator
-global
-hideconstructor
-ignore
-implements
-inheritdoc
-inner
-instance
-interface
-kind
-lends
-license
-listens
-member
-memberof
-memberof!
-mixes
-mixin
-module
-name
-namespace
-override
-package
-param
-private
-property
-protected
-public
-readonly
-requires
-returns
-see
-since
-static
-summary
-this
-throws
-todo
-tutorial
-type
-typedef
-variation
-version
-yields
-```
-
-`modifies` is also supported (see [source](https://github.com/jsdoc/jsdoc/blob/master/packages/jsdoc/lib/jsdoc/tag/dictionary/definitions.js#L594)) but is undocumented.
-
-The following synonyms are also recognized:
-
-```
-arg
-argument
-const
-constructor
-defaultvalue
-desc
-emits
-exception
-extends
-fileoverview
-func
-host
-method
-overview
-prop
-return
-var
-virtual
-yield
-```
-
-For [TypeScript](https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html#supported-jsdoc)
-(or Closure), when `settings.jsdoc.mode` is set to `typescript` or `closure`,
-one may also use the following:
-
-```
-template
-```
-
-And for [Closure](https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler),
-when `settings.jsdoc.mode` is set to `closure`, one may use the following (in
-addition to the jsdoc and TypeScript tags):
-
-```
-define (synonym of `const` per jsdoc source)
-dict
-export
-externs
-final
-implicitCast (casing distinct from that recognized by jsdoc internally)
-inheritDoc (casing distinct from that recognized by jsdoc internally)
-noalias
-nocollapse
-nocompile
-noinline
-nosideeffects
-polymer
-polymerBehavior
-preserve
-record (synonym of `interface` per jsdoc source)
-struct
-suppress
-unrestricted
-```
-
-...and these undocumented tags which are only in [source](https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/parsing/Annotation.java):
-
-```
-closurePrimitive
-customElement
-expose
-hidden
-idGenerator
-meaning
-mixinClass
-mixinFunction
-ngInject
-owner
-typeSummary
-wizaction
-```
-
-Note that the tags indicated as replacements in `settings.jsdoc.tagNamePreference` will automatically be considered as valid.
-
-<a name="eslint-plugin-jsdoc-rules-check-tag-names-options-5"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-check-tag-names-options-5-definedtags"></a>
-##### <code>definedTags</code>
-
-Use an array of `definedTags` strings to configure additional, allowed tags.
-The format is as follows:
-
-```json
-{
-  "definedTags": ["note", "record"]
-}
-```
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|N/A|
-|Options|`definedTags`|
-|Settings|`tagNamePreference`, `mode`|
-
-The following patterns are considered problems:
-
-````js
-/** @typoo {string} */
-let a;
-// Message: Invalid JSDoc tag name "typoo".
-
-/**
- * @Param
- */
-function quux () {
-
-}
-// Message: Invalid JSDoc tag name "Param".
-
-/**
- * @foo
- */
-function quux () {
-
-}
-// Message: Invalid JSDoc tag name "foo".
-
-/**
- * @arg foo
- */
-function quux (foo) {
-
-}
-// Message: Invalid JSDoc tag (preference). Replace "arg" JSDoc tag with "param".
-
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":"arg"}}}
-// Message: Invalid JSDoc tag (preference). Replace "param" JSDoc tag with "arg".
-
-/**
- * @arg foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"arg":"somethingDifferent"}}}
-// Message: Invalid JSDoc tag (preference). Replace "arg" JSDoc tag with "somethingDifferent".
-
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":"parameter"}}}
-// Message: Invalid JSDoc tag (preference). Replace "param" JSDoc tag with "parameter".
-
-/**
- * @bar foo
- */
-function quux (foo) {
-
-}
-// Message: Invalid JSDoc tag name "bar".
-
-/**
- * @baz @bar foo
- */
-function quux (foo) {
-
-}
-// Options: [{"definedTags":["bar"]}]
-// Message: Invalid JSDoc tag name "baz".
-
-/**
- * @bar
- * @baz
- */
-function quux (foo) {
-
-}
-// Options: [{"definedTags":["bar"]}]
-// Message: Invalid JSDoc tag name "baz".
-
-/**
- * @todo
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"todo":false}}}
-// Message: Blacklisted tag found (`@todo`)
-
-/**
- * @todo
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"todo":{"message":"Please resolve to-dos or add to the tracker"}}}}
-// Message: Please resolve to-dos or add to the tracker
-
-/**
- * @todo
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"todo":{"message":"Please use x-todo instead of todo","replacement":"x-todo"}}}}
-// Message: Please use x-todo instead of todo
-
-/**
- * @todo
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"todo":{"message":"Please use x-todo instead of todo","replacement":"x-todo"}}}}
-// Message: Please use x-todo instead of todo
-
-/**
- * @todo
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"todo":55}}}
-// Message: Invalid `settings.jsdoc.tagNamePreference`. Values must be falsy, a string, or an object.
-
-/**
- * @property {object} a
- * @prop {boolean} b
- */
-function quux () {
-
-}
-// Message: Invalid JSDoc tag (preference). Replace "prop" JSDoc tag with "property".
-
-/**
- * @abc foo
- * @abcd bar
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"abc":"abcd"}}}
-// Options: [{"definedTags":["abcd"]}]
-// Message: Invalid JSDoc tag (preference). Replace "abc" JSDoc tag with "abcd".
-
-/**
- * @abc
- * @abcd
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"abc":"abcd"}}}
-// Message: Invalid JSDoc tag (preference). Replace "abc" JSDoc tag with "abcd".
-
-/** 
- * @modifies
- * @abstract
- * @access
- * @alias
- * @async
- * @augments
- * @author
- * @borrows
- * @callback
- * @class
- * @classdesc
- * @constant
- * @constructs
- * @copyright
- * @default
- * @deprecated
- * @description
- * @enum
- * @event
- * @example
- * @exports
- * @external
- * @file
- * @fires
- * @function
- * @generator
- * @global
- * @hideconstructor
- * @ignore
- * @implements
- * @inheritdoc
- * @inner
- * @instance
- * @interface
- * @kind
- * @lends
- * @license
- * @listens
- * @member
- * @memberof
- * @memberof!
- * @mixes
- * @mixin
- * @module
- * @name
- * @namespace
- * @override
- * @package
- * @param
- * @private
- * @property
- * @protected
- * @public
- * @readonly
- * @requires
- * @returns
- * @see
- * @since
- * @static
- * @summary
- * @this
- * @throws
- * @todo
- * @tutorial
- * @type
- * @typedef
- * @variation
- * @version
- * @yields
- */
-function quux (foo) {}
-// Settings: {"jsdoc":{"mode":"badMode"}}
-// Message: Unrecognized value `badMode` for `settings.jsdoc.mode`.
-
-/** 
- * @modifies
- * @abstract
- * @access
- * @alias
- * @async
- * @augments
- * @author
- * @borrows
- * @callback
- * @class
- * @classdesc
- * @constant
- * @constructs
- * @copyright
- * @default
- * @deprecated
- * @description
- * @enum
- * @event
- * @example
- * @exports
- * @external
- * @file
- * @fires
- * @function
- * @generator
- * @global
- * @hideconstructor
- * @ignore
- * @implements
- * @inheritdoc
- * @inner
- * @instance
- * @interface
- * @kind
- * @lends
- * @license
- * @listens
- * @member
- * @memberof
- * @memberof!
- * @mixes
- * @mixin
- * @module
- * @name
- * @namespace
- * @override
- * @package
- * @param
- * @private
- * @property
- * @protected
- * @public
- * @readonly
- * @requires
- * @returns
- * @see
- * @since
- * @static
- * @summary
- * @this
- * @throws
- * @todo
- * @tutorial
- * @type
- * @typedef
- * @variation
- * @version
- * @yields
- * @template
- */
-function quux (foo) {}
-// Message: Invalid JSDoc tag name "template".
-
-/** 
- * @externs
- */
-function quux (foo) {}
-// Message: Invalid JSDoc tag name "externs".
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @memberof! foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @arg foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":"arg"}}}
-
-/**
- * @bar foo
- */
-function quux (foo) {
-
-}
-// Options: [{"definedTags":["bar"]}]
-
-/**
- * @baz @bar foo
- */
-function quux (foo) {
-
-}
-// Options: [{"definedTags":["baz","bar"]}]
-
-/**
- * @baz @bar foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":"baz","returns":{"message":"Prefer `bar`","replacement":"bar"},"todo":false}}}
-
-/** 
- * @modifies
- * @abstract
- * @access
- * @alias
- * @async
- * @augments
- * @author
- * @borrows
- * @callback
- * @class
- * @classdesc
- * @constant
- * @constructs
- * @copyright
- * @default
- * @deprecated
- * @description
- * @enum
- * @event
- * @example
- * @exports
- * @external
- * @file
- * @fires
- * @function
- * @generator
- * @global
- * @hideconstructor
- * @ignore
- * @implements
- * @inheritdoc
- * @inner
- * @instance
- * @interface
- * @kind
- * @lends
- * @license
- * @listens
- * @member
- * @memberof
- * @memberof!
- * @mixes
- * @mixin
- * @module
- * @name
- * @namespace
- * @override
- * @package
- * @param
- * @private
- * @property
- * @protected
- * @public
- * @readonly
- * @requires
- * @returns
- * @see
- * @since
- * @static
- * @summary
- * @this
- * @throws
- * @todo
- * @tutorial
- * @type
- * @typedef
- * @variation
- * @version
- * @yields
- */
-function quux (foo) {}
-
-/** 
- * @modifies
- * @abstract
- * @access
- * @alias
- * @async
- * @augments
- * @author
- * @borrows
- * @callback
- * @class
- * @classdesc
- * @constant
- * @constructs
- * @copyright
- * @default
- * @deprecated
- * @description
- * @enum
- * @event
- * @example
- * @exports
- * @external
- * @file
- * @fires
- * @function
- * @generator
- * @global
- * @hideconstructor
- * @ignore
- * @implements
- * @inheritdoc
- * @inner
- * @instance
- * @interface
- * @kind
- * @lends
- * @license
- * @listens
- * @member
- * @memberof
- * @memberof!
- * @mixes
- * @mixin
- * @module
- * @name
- * @namespace
- * @override
- * @package
- * @param
- * @private
- * @property
- * @protected
- * @public
- * @readonly
- * @requires
- * @returns
- * @see
- * @since
- * @static
- * @summary
- * @this
- * @throws
- * @todo
- * @tutorial
- * @type
- * @typedef
- * @variation
- * @version
- * @yields
- * @template
- */
-function quux (foo) {}
-// Settings: {"jsdoc":{"mode":"typescript"}}
-
-/** 
- * @externs
- */
-function quux (foo) {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-/**
- *
- */
-function quux (foo) {
-
-}
-
-/**
- * @todo
- */
-function quux () {
-
-}
-
-/**
- * @extends Foo
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"augments":{"message":"@extends is to be used over @augments.","replacement":"extends"}}}}
-
-/**
- * Registers the `target` class as a transient dependency; each time the dependency is resolved a new instance will be created.
- *
- * @param target - The class / constructor function to register as transient.
- *
- * @example ```ts
-@transient()
-class Foo { }
-```
- * @param Time for a new tag
- */
-export function transient<T>(target?: T): T {
-  // ...
-}
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-check-types"></a>
-### <code>check-types</code>
-
-Reports invalid types.
-
-By default, ensures that the casing of native types is the same as in this list:
-
-```
-undefined
-null
-boolean
-number
-bigint
-string
-symbol
-object
-Array
-Function
-Date
-RegExp
-```
-
-<a name="eslint-plugin-jsdoc-rules-check-types-options-6"></a>
-#### Options
-
-`check-types` allows one option:
-
-- An option object:
-  - with the key `noDefaults` to insist that only the supplied option type
-    map is to be used, and that the default preferences (such as "string"
-    over "String") will not be enforced. The option's default is `false`.
-  - with the key `exemptTagContexts` which will avoid reporting when a
-    bad type is found on a specified tag. Set to an array of objects with
-    a key `tag` set to the tag to exempt, and a `types` key which can
-    either be `true` to indicate that any types on that tag will be allowed,
-    or to an array of strings which will only allow specific bad types.
-    If an array of strings is given, these must match the type exactly,
-    e.g., if you only allow `"object"`, it will not allow
-    `"object<string, string>"`. Note that this is different from the
-    behavior of `settings.jsdoc.preferredTypes`. This option is useful
-    for normally restricting generic types like `object` with
-    `preferredTypes`, but allowing `typedef` to indicate that its base
-    type is `object`.
-  - with the key `unifyParentAndChildTypeChecks` which will treat
-    `settings.jsdoc.preferredTypes` keys such as `SomeType` as matching
-    not only child types such as an unadorned `SomeType` but also
-    `SomeType<aChildType>`, `SomeType.<aChildType>`, or if `SomeType` is
-    `Array` (or `[]`), it will match `aChildType[]`. If this is `false` or
-    unset, the former format will only apply to types which are not parent
-    types/unions whereas the latter formats will only apply for parent
-    types/unions. The special types `[]`, `.<>` (or `.`), and `<>`
-    act only as parent types (and will not match a bare child type such as
-    `Array` even when unified, though, as mentioned, `Array` will match
-    say `string[]` or `Array.<string>` when unified). The special type
-    `*` is only a child type. Note that there is no detection of parent
-    and child type together, e.g., you cannot specify preferences for
-    `string[]` specifically as distinct from say `number[]`, but you can
-    target both with `[]` or the child types `number` or `string`.
-
-See also the documentation on `settings.jsdoc.preferredTypes` which impacts
-the behavior of `check-types`.
-
-<a name="eslint-plugin-jsdoc-rules-check-types-why-not-capital-case-everything"></a>
-#### Why not capital case everything?
-
-Why are `boolean`, `number` and `string` exempt from starting with a capital letter? Let's take `string` as an example. In Javascript, everything is an object. The string Object has prototypes for string functions such as `.toUpperCase()`.
-
-Fortunately we don't have to write `new String()` everywhere in our code. Javascript will automatically wrap string primitives into string Objects when we're applying a string function to a string primitive. This way the memory footprint is a tiny little bit smaller, and the [GC](https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)) has less work to do.
-
-So in a sense, there two types of strings in Javascript; `{string}` literals, also called primitives and `{String}` Objects. We use the primitives because it's easier to write and uses less memory. `{String}` and `{string}` are technically both valid, but they are not the same.
-
-```js
-new String('lard') // String {0: "l", 1: "a", 2: "r", 3: "d", length: 4}
-'lard' // "lard"
-new String('lard') === 'lard' // false
-```
-
-To make things more confusing, there are also object literals and object Objects. But object literals are still static Objects and object Objects are instantiated Objects. So an object primitive is still an object Object.
-
-However, `Object.create(null)` objects are not `instanceof Object`, however, so
-in the case of this Object we lower-case to indicate possible support for
-these objects.
-
-Basically, for primitives, we want to define the type as a primitive, because that's what we use in 99.9% of cases. For everything else, we use the type rather than the primitive. Otherwise it would all just be `{object}`.
-
-In short: It's not about consistency, rather about the 99.9% use case. (And some
-functions might not even support the objects if they are checking for identity.)
-
-type name | `typeof` | check-types | testcase
---|--|--|--
-**Array** | object | **Array** | `([]) instanceof Array` -> `true`
-**Function** | function | **function** | `(function f () {}) instanceof Function` -> `true`
-**Date** | object | **Date** | `(new Date()) instanceof Date` -> `true`
-**RegExp** | object | **RegExp** | `(new RegExp(/.+/)) instanceof RegExp` -> `true`
-Object | **object** | **object** | `({}) instanceof Object` -> `true` but `Object.create(null) instanceof Object` -> `false`
-Boolean | **boolean** | **boolean** | `(true) instanceof Boolean` -> **`false`**
-Number | **number** | **number** | `(41) instanceof Number` -> **`false`**
-String | **string** | **string** | `("test") instanceof String` -> **`false`**
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|`augments`, `class`, `constant`, `enum`, `implements`, `member`, `module`, `namespace`, `param`, `property`, `returns`, `throws`, `type`, `typedef`, `yields`|
-|Aliases|`constructor`, `const`, `extends`, `var`, `arg`, `argument`, `prop`, `return`, `exception`, `yield`|
-|Closure-only|`package`, `private`, `protected`, `public`, `static`|
-|Options|`noDefaults`, `exemptTagContexts`, `unifyParentAndChildTypeChecks`|
-|Settings|`preferredTypes`, `mode`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @param {abc} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"abc":100}}}
-// Message: Invalid `settings.jsdoc.preferredTypes`. Values must be falsy, a string, or an object.
-
-/**
- * @param {Number} foo
- */
-function quux (foo) {
-
-}
-// Message: Invalid JSDoc @param "foo" type "Number"; prefer: "number".
-
-/**
- * @arg {Number} foo
- */
-function quux (foo) {
-
-}
-// Message: Invalid JSDoc @arg "foo" type "Number"; prefer: "number".
-
-/**
- * @returns {Number} foo
- * @throws {Number} foo
- */
-function quux () {
-
-}
-// Message: Invalid JSDoc @returns type "Number"; prefer: "number".
-
-/**
- * @param {(Number|string|Boolean)=} foo
- */
-function quux (foo, bar, baz) {
-
-}
-// Message: Invalid JSDoc @param "foo" type "Number"; prefer: "number".
-
-/**
- * @param {Array.<Number|String>} foo
- */
-function quux (foo, bar, baz) {
-
-}
-// Message: Invalid JSDoc @param "foo" type "Number"; prefer: "number".
-
-/**
- * @param {(Number|String)[]} foo
- */
-function quux (foo, bar, baz) {
-
-}
-// Message: Invalid JSDoc @param "foo" type "Number"; prefer: "number".
-
-/**
- * @param {abc} foo
- */
-function qux(foo) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"abc":"Abc","string":"Str"}}}
-// Message: Invalid JSDoc @param "foo" type "abc"; prefer: "Abc".
-
-/**
- * @param {abc} foo
- */
-function qux(foo) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"abc":{"replacement":"Abc"},"string":"Str"}}}
-// Message: Invalid JSDoc @param "foo" type "abc"; prefer: "Abc".
-
-/**
- * @param {abc} foo
- */
-function qux(foo) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"abc":{"message":"Messed up JSDoc @{{tagName}}{{tagValue}} type \"abc\"; prefer: \"Abc\".","replacement":"Abc"},"string":"Str"}}}
-// Message: Messed up JSDoc @param "foo" type "abc"; prefer: "Abc".
-
-/**
- * @param {abc} foo
- * @param {cde} bar
- * @param {object} baz
- */
-function qux(foo, bar, baz) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"abc":{"message":"Messed up JSDoc @{{tagName}}{{tagValue}} type \"abc\"; prefer: \"Abc\".","replacement":"Abc"},"cde":{"message":"More messed up JSDoc @{{tagName}}{{tagValue}} type \"cde\"; prefer: \"Cde\".","replacement":"Cde"},"object":"Object"}}}
-// Message: Messed up JSDoc @param "foo" type "abc"; prefer: "Abc".
-
-/**
- * @param {abc} foo
- */
-function qux(foo) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"abc":{"message":"Messed up JSDoc @{{tagName}}{{tagValue}} type \"abc\".","replacement":false},"string":"Str"}}}
-// Message: Messed up JSDoc @param "foo" type "abc".
-
-/**
- * @param {abc} foo
- */
-function qux(foo) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"abc":{"message":"Messed up JSDoc @{{tagName}}{{tagValue}} type \"abc\"."},"string":"Str"}}}
-// Message: Messed up JSDoc @param "foo" type "abc".
-
-/**
- * @param {abc} foo
- * @param {Number} bar
- */
-function qux(foo, bar) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"abc":"Abc","string":"Str"}}}
-// Options: [{"noDefaults":true}]
-// Message: Invalid JSDoc @param "foo" type "abc"; prefer: "Abc".
-
-/**
- * @param {abc} foo
- * @param {Number} bar
- */
-function qux(foo, bar) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"abc":"Abc","string":"Str"}}}
-// Message: Invalid JSDoc @param "foo" type "abc"; prefer: "Abc".
-
-/**
- * @param {abc} foo
- */
-function qux(foo) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"abc":false,"string":"Str"}}}
-// Message: Invalid JSDoc @param "foo" type "abc".
-
-/**
- * @param {abc} foo
- */
-function qux(foo) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"abc":false}}}
-// Message: Invalid JSDoc @param "foo" type "abc".
-
-/**
- * @param {*} baz
- */
-function qux(baz) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"*":false,"abc":"Abc","string":"Str"}}}
-// Message: Invalid JSDoc @param "baz" type "*".
-
-/**
- * @param {*} baz
- */
-function qux(baz) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"*":"aaa","abc":"Abc","string":"Str"}}}
-// Message: Invalid JSDoc @param "baz" type "*"; prefer: "aaa".
-
-/**
- * @param {abc} foo
- * @param {Number} bar
- */
-function qux(foo, bar) {
-}
-// Settings: {"jsdoc":{"preferredTypes":{"abc":"Abc","string":"Str"}}}
-// Message: Invalid JSDoc @param "foo" type "abc"; prefer: "Abc".
-
-/**
- * @param {Array} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array":"GenericArray"}}}
-// Message: Invalid JSDoc @param "foo" type "Array"; prefer: "GenericArray".
-
-/**
- * @param {Array} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array":"GenericArray","Array.<>":"GenericArray"}}}
-// Message: Invalid JSDoc @param "foo" type "Array"; prefer: "GenericArray".
-
-/**
- * @param {Array.<string>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array.<>":"GenericArray"}}}
-// Message: Invalid JSDoc @param "foo" type "Array"; prefer: "GenericArray".
-
-/**
- * @param {Array<string>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array<>":"GenericArray"}}}
-// Message: Invalid JSDoc @param "foo" type "Array"; prefer: "GenericArray".
-
-/**
- * @param {string[]} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"[]":"SpecialTypeArray"}}}
-// Message: Invalid JSDoc @param "foo" type "[]"; prefer: "SpecialTypeArray".
-
-/**
- * @param {string[]} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"[]":"SpecialTypeArray"}}}
-// Options: [{"unifyParentAndChildTypeChecks":true}]
-// Message: Invalid JSDoc @param "foo" type "[]"; prefer: "SpecialTypeArray".
-
-/**
- * @param {string[]} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array":"SpecialTypeArray"}}}
-// Options: [{"unifyParentAndChildTypeChecks":true}]
-// Message: Invalid JSDoc @param "foo" type "Array"; prefer: "SpecialTypeArray".
-
-/**
- * @param {object} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"GenericObject"}}}
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "GenericObject".
-
-/**
- * @param {object} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"GenericObject","object.<>":"GenericObject"}}}
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "GenericObject".
-
-/**
- * @param {object} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"GenericObject","object<>":"GenericObject"}}}
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "GenericObject".
-
-/**
- * @param {object.<string>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object.<>":"GenericObject"}}}
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "GenericObject".
-
-/**
- * @param {object<string>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object<>":"GenericObject"}}}
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "GenericObject".
-
-/**
- * @param {object.<string, number>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object.<>":"GenericObject"}}}
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "GenericObject".
-
-/**
- * @param {object<string, number>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object<>":"GenericObject"}}}
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "GenericObject".
-
-/**
- * @param {object.<string>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"GenericObject"}}}
-// Options: [{"unifyParentAndChildTypeChecks":true}]
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "GenericObject".
-
-/**
- * @param {object<string>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"GenericObject"}}}
-// Options: [{"unifyParentAndChildTypeChecks":true}]
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "GenericObject".
-
-/**
- * @param {object} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"GenericObject"}}}
-// Options: [{"unifyParentAndChildTypeChecks":true}]
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "GenericObject".
-
-/**
- * @param {object} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":false}}}
-// Options: [{"unifyParentAndChildTypeChecks":true}]
-// Message: Invalid JSDoc @param "foo" type "object".
-
-/**
- * @param {object} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":false}}}
-// Message: Invalid JSDoc @param "foo" type "object".
-
-/**
- * @param {object.<string, number>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"GenericObject"}}}
-// Options: [{"unifyParentAndChildTypeChecks":true}]
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "GenericObject".
-
-/**
- * @param {object<string, number>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"GenericObject"}}}
-// Options: [{"unifyParentAndChildTypeChecks":true}]
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "GenericObject".
-
-/**
- *
- * @param {string[][]} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"[]":"Array."}}}
-// Message: Invalid JSDoc @param "foo" type "[]"; prefer: "Array.".
-
-/**
- *
- * @param {string[][]} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"[]":"Array.<>"}}}
-// Message: Invalid JSDoc @param "foo" type "[]"; prefer: "Array.<>".
-
-/**
- *
- * @param {string[][]} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"[]":"Array<>"}}}
-// Message: Invalid JSDoc @param "foo" type "[]"; prefer: "Array<>".
-
-/**
- *
- * @param {object.<string, object.<string, string>>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object.":"Object"}}}
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "Object".
-
-/**
- *
- * @param {object.<string, object.<string, string>>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object.":"Object<>"}}}
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "Object<>".
-
-/**
- *
- * @param {object<string, object<string, string>>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object<>":"Object."}}}
-// Message: Invalid JSDoc @param "foo" type "object"; prefer: "Object.".
-
-/**
- *
- * @param {Array.<Array.<string>>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array.":"[]"}}}
-// Message: Invalid JSDoc @param "foo" type "Array"; prefer: "[]".
-
-/**
- *
- * @param {Array.<Array.<string>>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array.":"Array<>"}}}
-// Message: Invalid JSDoc @param "foo" type "Array"; prefer: "Array<>".
-
-/**
- *
- * @param {Array.<Array.<string>>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array.":"<>"}}}
-// Message: Invalid JSDoc @param "foo" type "Array"; prefer: "<>".
-
-/**
- *
- * @param {Array.<MyArray.<string>>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array.":"<>"}}}
-// Message: Invalid JSDoc @param "foo" type "Array"; prefer: "<>".
-
-/**
- *
- * @param {Array.<MyArray.<string>>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"MyArray.":"<>"}}}
-// Message: Invalid JSDoc @param "foo" type "MyArray"; prefer: "<>".
-
-/**
- *
- * @param {Array<Array<string>>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"<>":"Array."}}}
-// Message: Invalid JSDoc @param "foo" type "Array"; prefer: "Array.".
-
-/**
- *
- * @param {Array<Array<string>>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array":"Array."}}}
-// Options: [{"unifyParentAndChildTypeChecks":true}]
-// Message: Invalid JSDoc @param "foo" type "Array"; prefer: "Array.".
-
-/**
- *
- * @param {Array<Array<string>>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"<>":"[]"}}}
-// Message: Invalid JSDoc @param "foo" type "Array"; prefer: "[]".
-
-/** @typedef {String} foo */
-// Message: Invalid JSDoc @typedef "foo" type "String"; prefer: "string".
-
-/**
- * @this {array}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-// Message: Invalid JSDoc @this type "array"; prefer: "Array".
-
-/**
- * @export {array}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-// Message: Invalid JSDoc @export type "array"; prefer: "Array".
-
-/**
- * @typedef {object} foo
- * @property {object} bar
- */
-// Settings: {"jsdoc":{"preferredTypes":{"object":"Object"}}}
-// Options: [{"exemptTagContexts":[{"tag":"typedef","types":true}]}]
-// Message: Invalid JSDoc @property "bar" type "object"; prefer: "Object".
-
-/** @typedef {object} foo */
-// Settings: {"jsdoc":{"preferredTypes":{"object":"Object"}}}
-// Options: [{"exemptTagContexts":[{"tag":"typedef","types":["array"]}]}]
-// Message: Invalid JSDoc @typedef "foo" type "object"; prefer: "Object".
-
-/**
- * @typedef {object} foo
- * @property {object} bar
- */
-// Settings: {"jsdoc":{"preferredTypes":{"object":"Object"}}}
-// Options: [{"exemptTagContexts":[{"tag":"typedef","types":["object"]}]}]
-// Message: Invalid JSDoc @property "bar" type "object"; prefer: "Object".
-
-/** @typedef {object<string, string>} foo */
-// Settings: {"jsdoc":{"preferredTypes":{"object<>":"Object<>"}}}
-// Options: [{"exemptTagContexts":[{"tag":"typedef","types":["object"]}]}]
-// Message: Invalid JSDoc @typedef "foo" type "object"; prefer: "Object<>".
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @param {number} foo
- * @param {Bar} bar
- * @param {*} baz
- */
-function quux (foo, bar, baz) {
-
-}
-
-/**
- * @arg {number} foo
- * @arg {Bar} bar
- * @arg {*} baz
- */
-function quux (foo, bar, baz) {
-
-}
-
-/**
- * @param {(number|string|boolean)=} foo
- */
-function quux (foo, bar, baz) {
-
-}
-
-/**
- * @param {typeof bar} foo
- */
-function qux(foo) {
-}
-
-/**
- * @param {import('./foo').bar.baz} foo
- */
-function qux(foo) {
-}
-
-/**
- * @param {(x: number, y: string) => string} foo
- */
-function qux(foo) {
-}
-
-/**
- * @param {() => string} foo
- */
-function qux(foo) {
-}
-
-/**
- * @returns {Number} foo
- * @throws {Number} foo
- */
-function quux () {
-
-}
-// Options: [{"noDefaults":true}]
-
-/**
- * @param {Object} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"Object"}}}
-
-/**
- * @param {Array} foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @param {Array.<string>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array":"GenericArray"}}}
-
-/**
- * @param {Array<string>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array":"GenericArray"}}}
-
-/**
- * @param {string[]} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array":"SpecialTypeArray","Array.<>":"SpecialTypeArray","Array<>":"SpecialTypeArray"}}}
-
-/**
- * @param {string[]} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array.<>":"SpecialTypeArray","Array<>":"SpecialTypeArray"}}}
-// Options: [{"unifyParentAndChildTypeChecks":true}]
-
-/**
- * @param {Array} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"[]":"SpecialTypeArray"}}}
-
-/**
- * @param {Array} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"[]":"SpecialTypeArray"}}}
-// Options: [{"unifyParentAndChildTypeChecks":true}]
-
-/**
- * @param {Array} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array.<>":"GenericArray"}}}
-
-/**
- * @param {Array} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"Array<>":"GenericArray"}}}
-
-/**
- * @param {object} foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @param {object.<string>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"GenericObject"}}}
-
-/**
- * @param {object<string>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"GenericObject"}}}
-
-/**
- * @param {object.<string, number>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"GenericObject"}}}
-
-/**
- * @param {object<string, number>} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object":"GenericObject"}}}
-
-/**
- * @param {object} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object.<>":"GenericObject"}}}
-
-/**
- * @param {object} foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"object<>":"GenericObject"}}}
-
-/**
- * @param {Number<} Ignore the error as not a validating rule
- */
-function quux (foo) {
-
-}
-
-/** @param {function(...)} callback The function to invoke. */
-var subscribe = function(callback) {};
-
-/**
- * @this {Array}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-/**
- * @export {Array}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-/** @type {new() => EntityBase} */
-
-/** @typedef {object} foo */
-// Settings: {"jsdoc":{"preferredTypes":{"object":"Object"}}}
-// Options: [{"exemptTagContexts":[{"tag":"typedef","types":true}]}]
-
-/** @typedef {object<string, string>} foo */
-// Settings: {"jsdoc":{"preferredTypes":{"object":"Object"}}}
-
-/** @typedef {object<string, string>} foo */
-// Settings: {"jsdoc":{"preferredTypes":{"object<>":"Object<>"}}}
-// Options: [{"exemptTagContexts":[{"tag":"typedef","types":["object<string, string>"]}]}]
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-check-values"></a>
-### <code>check-values</code>
-
-This rule checks the values for a handful of tags:
-
-1. `@version` - Checks that there is a present and valid
-    [semver](https://semver.org/) version value.
-2. `@since` - As with `@version`
-3. `@license` - Checks that there is a present and valid SPDX identifier
-    or is present within an `allowedLicenses` option.
-4. `@author` - Checks there is a value present, and if the option
-    `allowedAuthors` is present, ensure that the author value is one
-    of these array items.
-
-<a name="eslint-plugin-jsdoc-rules-check-values-options-7"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-check-values-options-7-allowedauthors"></a>
-##### <code>allowedAuthors</code>
-
-An array of allowable author values. If absent, only non-whitespace will
-be checked for.
-
-<a name="eslint-plugin-jsdoc-rules-check-values-options-7-allowedlicenses"></a>
-##### <code>allowedLicenses</code>
-
-An array of allowable license values or `true` to allow any license text.
-If present as an array, will be used in place of SPDX identifiers.
-
-<a name="eslint-plugin-jsdoc-rules-check-values-options-7-licensepattern"></a>
-##### <code>licensePattern</code>
-
-A string to be converted into a `RegExp` (with `u` flag) and whose first
-parenthetical grouping, if present, will match the portion of the license
-description to check (if no grouping is present, then the whole portion
-matched will be used). Defaults to `([^\n]*)`, i.e., the SPDX expression
-is expected before any line breaks.
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|`@version`, `@since`, `@license`, `@author`|
-|Options|`allowedAuthors`, `allowedLicenses`, `licensePattern`|
-|Settings|`tagNamePreference`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @version
- */
-function quux (foo) {
-
-}
-// Message: Missing JSDoc @version.
-
-/**
- * @version 3.1
- */
-function quux (foo) {
-
-}
-// Message: Invalid JSDoc @version: "3.1".
-
-/**
- * @since
- */
-function quux (foo) {
-
-}
-// Message: Missing JSDoc @since.
-
-/**
- * @since 3.1
- */
-function quux (foo) {
-
-}
-// Message: Invalid JSDoc @since: "3.1".
-
-/**
- * @license
- */
-function quux (foo) {
-
-}
-// Message: Missing JSDoc @license.
-
-/**
- * @license FOO
- */
-function quux (foo) {
-
-}
-// Message: Invalid JSDoc @license: "FOO"; expected SPDX expression: https://spdx.org/licenses/.
-
-/**
- * @license FOO
- */
-function quux (foo) {
-
-}
-// Options: [{"allowedLicenses":["BAR","BAX"]}]
-// Message: Invalid JSDoc @license: "FOO"; expected one of BAR, BAX.
-
-/**
- * @license MIT-7
- * Some extra text...
- */
-function quux (foo) {
-
-}
-// Message: Invalid JSDoc @license: "MIT-7"; expected SPDX expression: https://spdx.org/licenses/.
-
-/**
- * @license (MIT OR GPL-2.5)
- */
-function quux (foo) {
-
-}
-// Message: Invalid JSDoc @license: "(MIT OR GPL-2.5)"; expected SPDX expression: https://spdx.org/licenses/.
-
-/**
- * @license MIT
- * Some extra text
- */
-function quux (foo) {
-
-}
-// Options: [{"licensePattern":"[\\s\\S]*"}]
-// Message: Invalid JSDoc @license: "MIT
-Some extra text"; expected SPDX expression: https://spdx.org/licenses/.
-
-/**
- * @author
- */
-function quux (foo) {
-
-}
-// Message: Missing JSDoc @author.
-
-/**
- * @author Brett Zamir
- */
-function quux (foo) {
-
-}
-// Options: [{"allowedAuthors":["Gajus Kuizinas","golopot"]}]
-// Message: Invalid JSDoc @author: "Brett Zamir"; expected one of Gajus Kuizinas, golopot.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @version 3.4.1
- */
-function quux (foo) {
-
-}
-
-/**
- * @version      3.4.1
- */
-function quux (foo) {
-
-}
-
-/**
- * @since 3.4.1
- */
-function quux (foo) {
-
-}
-
-/**
- * @since      3.4.1
- */
-function quux (foo) {
-
-}
-
-/**
- * @license MIT
- */
-function quux (foo) {
-
-}
-
-/**
- * @license MIT
- * Some extra text...
- */
-function quux (foo) {
-
-}
-
-/**
- * @license (MIT OR GPL-2.0)
- */
-function quux (foo) {
-
-}
-
-/**
- * @license FOO
- */
-function quux (foo) {
-
-}
-// Options: [{"allowedLicenses":["FOO","BAR","BAX"]}]
-
-/**
- * @license FOO
- */
-function quux (foo) {
-
-}
-// Options: [{"allowedLicenses":true}]
-
-/**
- * @license MIT
- * Some extra text
- */
-function quux (foo) {
-
-}
-// Options: [{"licensePattern":"[^\n]*"}]
-
-/**
- * @author Gajus Kuizinas
- */
-function quux (foo) {
-
-}
-
-/**
- * @author Brett Zamir
- */
-function quux (foo) {
-
-}
-// Options: [{"allowedAuthors":["Gajus Kuizinas","golopot","Brett Zamir"]}]
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-empty-tags"></a>
-### <code>empty-tags</code>
-
-Expects the following tags to be empty of any content:
-
-- `@abstract`
-- `@async`
-- `@generator`
-- `@global`
-- `@hideconstructor`
-- `@ignore`
-- `@inheritdoc`
-- `@inner`
-- `@instance`
-- `@override`
-- `@readonly`
-
-The following will also be expected to be empty unless `settings.jsdoc.mode`
-is set to "closure" (which allows types).
-
-- `@package`
-- `@private`
-- `@protected`
-- `@public`
-- `@static`
-
-Note that `@private` will still be checked for content by this rule even with
-`settings.jsdoc.ignorePrivate` set to `true` (a setting which normally
-causes rules not to take effect).
-
-<a name="eslint-plugin-jsdoc-rules-empty-tags-options-8"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-empty-tags-options-8-tags"></a>
-##### <code>tags</code>
-
-If you want additional tags to be checked for their descriptions, you may
-add them within this option.
-
-```js
-{
-  'jsdoc/empty-tags': ['error', {tags: ['event']}]
-}
-```
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags| and others added by `tags`|
-|Aliases||
-|Options|`tags`|
-The following patterns are considered problems:
-
-````js
-/**
- * @abstract extra text
- */
-function quux () {
-
-}
-// Message: @abstract should be empty.
-
-/**
- * @abstract extra text
- * @inheritdoc
- * @async out of place
- */
-function quux () {
-
-}
-// Message: @abstract should be empty.
-
-/**
- * @event anEvent
- */
-function quux () {
-
-}
-// Options: [{"tags":["event"]}]
-// Message: @event should be empty.
-
-/**
- * @private {someType}
- */
-function quux () {
-
-}
-// Message: @private should be empty.
-
-/**
- * @private {someType}
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"ignorePrivate":true}}
-// Message: @private should be empty.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @abstract
- */
-function quux () {
-
-}
-
-/**
- *
- */
-function quux () {
-
-}
-
-/**
- * @param aName
- */
-function quux () {
-
-}
-
-/**
- * @abstract
- * @inheritdoc
- * @async
- */
-function quux () {
-
-}
-
-/**
- * @private {someType}
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-/**
- * @private
- */
-function quux () {
-
-}
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-implements-on-classes"></a>
-### <code>implements-on-classes</code>
-
-Reports an issue with any non-constructor function using `@implements`.
-
-Constructor functions, whether marked with `@class`, `@constructs`, or being
-an ES6 class constructor, will not be flagged.
-
-To indicate that a function follows another function's signature, one might
-instead use `@type` to indicate the `@function` or `@callback` to which the
-funciton is adhering.
-
-<a name="eslint-plugin-jsdoc-rules-implements-on-classes-options-9"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-implements-on-classes-options-9-contexts"></a>
-##### <code>contexts</code>
-
-Set this to an array of strings representing the AST context
-where you wish the rule to be applied.
-Overrides the default contexts (see below). Set to `"any"` if you want
-the rule to apply to any jsdoc block throughout your files (as is necessary
-for finding function blocks not attached to a function declaration or
-expression, i.e., `@callback` or `@function` (or its aliases `@func` or
-`@method`) (including those associated with an `@interface`).
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
-|Tags|`implements` (prevented)|
-|Options|`contexts`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @implements {SomeClass}
- */
-function quux () {
-
-}
-// Message: @implements used on a non-constructor function
-
-/**
- * @implements {SomeClass}
- */
-function quux () {
-
-}
-// Options: [{"contexts":["any"]}]
-// Message: @implements used on a non-constructor function
-
-/**
- * @function
- * @implements {SomeClass}
- */
-function quux () {
-
-}
-// Options: [{"contexts":["any"]}]
-// Message: @implements used on a non-constructor function
-
-/**
- * @callback
- * @implements {SomeClass}
- */
-// Options: [{"contexts":["any"]}]
-// Message: @implements used on a non-constructor function
-
-/**
- * @implements {SomeClass}
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"implements":false}}}
-// Message: Unexpected tag `@implements`
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @implements {SomeClass}
- * @class
- */
-function quux () {
-
-}
-
-/**
- * @implements {SomeClass}
- * @class
- */
-function quux () {
-
-}
-// Options: [{"contexts":["any"]}]
-
-/**
- * @implements {SomeClass}
- */
-// Options: [{"contexts":["any"]}]
-
-/**
- * @implements {SomeClass}
- * @constructor
- */
-function quux () {
-
-}
-
-/**
- *
- */
-class quux {
-  /**
-   * @implements {SomeClass}
-   */
-  constructor () {
-
-  }
-}
-
-/**
- *
- */
-const quux = class {
-  /**
-   * @implements {SomeClass}
-   */
-  constructor () {
-
-  }
-}
-
-/**
- *
- */
-function quux () {
-
-}
-
-/**
- *
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"implements":false}}}
-
-/**
- * @function
- * @implements {SomeClass}
- */
-
-/**
- * @callback
- * @implements {SomeClass}
- */
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-match-description"></a>
-### <code>match-description</code>
-
-Enforces a regular expression pattern on descriptions.
-
-The default is this basic expression to match English sentences (Support
-for Unicode upper case may be added in a future version when it can be handled
-by our supported Node versions):
-
-``^([A-Z]|[`\\d_])[\\s\\S]*[.?!`]$``
-
-Applies to the jsdoc block description and `@description` (or `@desc`)
-by default but the `tags` option (see below) may be used to match other tags.
-
-<a name="eslint-plugin-jsdoc-rules-match-description-options-10"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-match-description-options-10-matchdescription"></a>
-##### <code>matchDescription</code>
-
-You can supply your own expression to override the default, passing a
-`matchDescription` string on the options object.
-
-```js
-{
-  'jsdoc/match-description': ['error', {matchDescription: '[A-Z].*\\.'}]
-}
-```
-
-As with the default, the supplied regular expression will be applied with the
-Unicode (`"u"`) flag and is *not* case-insensitive.
-
-<a name="eslint-plugin-jsdoc-rules-match-description-options-10-tags-1"></a>
-##### <code>tags</code>
-
-If you want different regular expressions to apply to tags, you may use
-the `tags` option object:
-
-```js
-{
-  'jsdoc/match-description': ['error', {tags: {
-    param: '\\- [A-Z].*\\.',
-    returns: '[A-Z].*\\.'
-  }}]
-}
-```
-
-In place of a string, you can also add `true` to indicate that a particular
-tag should be linted with the `matchDescription` value (or the default).
-
-```js
-{
-  'jsdoc/match-description': ['error', {tags: {
-    param: true,
-    returns: true
-  }}]
-}
-```
-
-The tags `@param`/`@arg`/`@argument` and `@property`/`@prop` will be properly
-parsed to ensure that the matched "description" text includes only the text
-after the name.
-
-All other tags will treat the text following the tag name, a space, and
-an optional curly-bracketed type expression (and another space) as part of
-its "description" (e.g., for `@returns {someType} some description`, the
-description is `some description` while for `@some-tag xyz`, the description
-is `xyz`).
-
-<a name="eslint-plugin-jsdoc-rules-match-description-options-10-maindescription"></a>
-##### <code>mainDescription</code>
-
-If you wish to override the main function description without changing the
-default `match-description`, you may use `mainDescription`:
-
-```js
-{
-  'jsdoc/match-description': ['error', {
-    mainDescription: '[A-Z].*\\.',
-    tags: {
-      param: true,
-      returns: true
-    }
-  }]
-}
-```
-
-There is no need to add `mainDescription: true`, as by default, the main
-function (and only the main function) is linted, though you may disable checking
-it by setting it to `false`.
-
-<a name="eslint-plugin-jsdoc-rules-match-description-options-10-contexts-1"></a>
-##### <code>contexts</code>
-
-Set this to an array of strings representing the AST context
-where you wish the rule to be applied (e.g., `ClassDeclaration` for ES6 classes).
-Overrides the default contexts (see below). Set to `"any"` if you want
-the rule to apply to any jsdoc block throughout your files.
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
-|Tags|docblock and `@description` by default but more with `tags`|
-|Aliases|`@desc`|
-|Settings||
-|Options|`contexts`, `tags` (accepts tags with names and optional type such as 'param', 'arg', 'argument', 'property', and 'prop', and accepts arbitrary list of other tags with an optional type (but without names), e.g., 'returns', 'return'), `mainDescription`, `matchDescription`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * foo.
- */
-const q = class {
-
-}
-// Options: [{"contexts":["ClassExpression"]}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * foo.
- */
-// Options: [{"contexts":["any"]}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * foo.
- */
-// Options: [{"contexts":["any"]}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * foo.
- */
-const q = {
-
-};
-// Options: [{"contexts":["ObjectExpression"]}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * foo.
- */
-function quux () {
-
-}
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo)
- */
-function quux () {
-
-}
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * тест.
- */
-function quux () {
-
-}
-// Options: [{"matchDescription":"[А-Я][А-я]+\\."}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Abc.
- */
-function quux () {
-
-}
-// Options: [{"mainDescription":"[А-Я][А-я]+\\.","tags":{"param":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo
- */
-function quux () {
-
-}
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo.
- *
- * @param foo foo.
- */
-function quux (foo) {
-
-}
-// Options: [{"tags":{"param":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo.
- *
- * @prop foo foo.
- */
-function quux (foo) {
-
-}
-// Options: [{"tags":{"prop":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo.
- *
- * @summary foo.
- */
-function quux () {
-
-}
-// Options: [{"tags":{"summary":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo.
- *
- * @author
- */
-function quux () {
-
-}
-// Options: [{"tags":{"author":".+"}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo.
- *
- * @x-tag
- */
-function quux () {
-
-}
-// Options: [{"tags":{"x-tag":".+"}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo.
- *
- * @description foo foo.
- */
-function quux (foo) {
-
-}
-// Options: [{"tags":{"description":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo
- *
- * @param foo foo.
- */
-function quux (foo) {
-
-}
-// Options: [{"mainDescription":"^[a-zA-Z]*$","tags":{"param":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo
- *
- * @param foo foo.
- */
-function quux (foo) {
-
-}
-// Options: [{"mainDescription":false,"tags":{"param":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo.
- *
- * @param foo bar
- */
-function quux (foo) {
-
-}
-// Options: [{"tags":{"param":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * {@see Foo.bar} buz
- */
-function quux (foo) {
-
-}
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo.
- *
- * @returns {number} foo
- */
-function quux (foo) {
-
-}
-// Options: [{"tags":{"returns":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo.
- *
- * @returns foo.
- */
-function quux (foo) {
-
-}
-// Options: [{"tags":{"returns":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * lorem ipsum dolor sit amet, consectetur adipiscing elit. pellentesque elit diam,
- * iaculis eu dignissim sed, ultrices sed nisi. nulla at ligula auctor, consectetur neque sed,
- * tincidunt nibh. vivamus sit amet vulputate ligula. vivamus interdum elementum nisl,
- * vitae rutrum tortor semper ut. morbi porta ante vitae dictum fermentum.
- * proin ut nulla at quam convallis gravida in id elit. sed dolor mauris, blandit quis ante at,
- * consequat auctor magna. duis pharetra purus in porttitor mollis.
- */
-function longDescription (foo) {
-
-}
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * @arg {number} foo - Foo
- */
-function quux (foo) {
-
-}
-// Options: [{"tags":{"arg":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * @argument {number} foo - Foo
- */
-function quux (foo) {
-
-}
-// Options: [{"tags":{"argument":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * @return {number} foo
- */
-function quux (foo) {
-
-}
-// Options: [{"tags":{"return":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Returns bar.
- *
- * @return {number} bar
- */
-function quux (foo) {
-
-}
-// Options: [{"tags":{"return":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * @param notRet
- * @returns Тест.
- */
-function quux () {
-
-}
-// Options: [{"tags":{"param":"[А-Я][А-я]+\\."}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * @description notRet
- * @returns Тест.
- */
-function quux () {
-
-}
-// Options: [{"tags":{"description":"[А-Я][А-я]+\\."}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * foo.
- */
-class quux {
-
-}
-// Options: [{"contexts":["ClassDeclaration"]}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-class MyClass {
-  /**
-   * Abc
-   */
-  myClassField = 1
-}
-// Options: [{"contexts":["ClassProperty"]}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * foo.
- */
-interface quux {
-
-}
-// Options: [{"contexts":["TSInterfaceDeclaration"]}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-const myObject = {
-  /**
-   * Bad description
-   */
-  myProp: true
-};
-// Options: [{"contexts":["Property"]}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * @param foo Foo bar
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"description":false}}}
-// Options: [{"tags":{"param":true}}]
-// Message: JSDoc description does not satisfy the regex pattern.
-
-/**
- * Foo bar
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"description":false}}}
-// Message: JSDoc description does not satisfy the regex pattern.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- *
- */
-
-/**
- *
- */
- function quux () {
-
- }
-
-/**
- * @param foo - Foo.
- */
-function quux () {
-
-}
-// Options: [{"tags":{"param":true}}]
-
-/**
- * Foo.
- */
-function quux () {
-
-}
-
-/**
- * Foo.
- * Bar.
- */
-function quux () {
-
-}
-
-/**
- * Foo.
- *
- * Bar.
- */
-function quux () {
-
-}
-
-/**
- * Тест.
- */
-function quux () {
-
-}
-// Options: [{"matchDescription":"[А-Я][А-я]+\\."}]
-
-/**
- * @param notRet
- * @returns Тест.
- */
-function quux () {
-
-}
-// Options: [{"tags":{"returns":"[А-Я][А-я]+\\."}}]
-
-/**
- * @param notRet
- * @description Тест.
- */
-function quux () {
-
-}
-// Options: [{"tags":{"description":"[А-Я][А-я]+\\."}}]
-
-/**
- * Foo
- * bar.
- */
-function quux () {
-
-}
-
-/**
- * @returns Foo bar.
- */
-function quux () {
-
-}
-// Options: [{"tags":{"returns":true}}]
-
-/**
- * @returns {type1} Foo bar.
- */
-function quux () {
-
-}
-// Options: [{"tags":{"returns":true}}]
-
-/**
- * @description Foo bar.
- */
-function quux () {
-
-}
-// Options: [{"tags":{"description":true}}]
-
-/**
- * Foo. {@see Math.sin}.
- */
-function quux () {
-
-}
-
-/**
- * Foo {@see Math.sin} bar.
- */
-function quux () {
-
-}
-
-/**
- * Foo?
- *
- * Bar!
- *
- * Baz:
- *   1. Foo.
- *   2. Bar.
- */
-function quux () {
-
-}
-
-/**
- * Hello:
- * World.
- */
-function quux () {
-
-}
-
-/**
- * Hello: world.
- */
-function quux () {
-
-}
-
-/**
- * Foo
- * Bar.
- */
-function quux () {
-
-}
-
-/**
- * Foo.
- *
- * foo.
- */
-function quux () {
-
-}
-
-/**
- * foo.
- */
-function quux () {
-
-}
-// Options: [{"mainDescription":false}]
-
-/**
- * foo.
- */
-class quux {
-
-}
-
-/**
- * foo.
- */
-class quux {
-
-}
-// Options: [{"mainDescription":true}]
-
-class MyClass {
-  /**
-   * Abc.
-   */
-  myClassField = 1
-}
-// Options: [{"contexts":["ClassProperty"]}]
-
-/**
- * Foo.
- */
-interface quux {
-
-}
-// Options: [{"contexts":["TSInterfaceDeclaration"]}]
-
-const myObject = {
-  /**
-   * Bad description
-   */
-  myProp: true
-};
-// Options: [{"contexts":[]}]
-
-/**
- * foo.
- */
-const q = class {
-
-}
-// Options: [{"contexts":[]}]
-
-/**
- * foo.
- */
-const q = {
-
-};
-// Options: [{"contexts":[]}]
-
-/**
- * @description foo.
- */
-function quux () {
-
-}
-// Options: [{"tags":{"param":true}}]
-
-/**
- * Foo.
- *
- * @summary Foo.
- */
-function quux () {
-
-}
-// Options: [{"tags":{"summary":true}}]
-
-/**
- * Foo.
- *
- * @author Somebody
- */
-function quux () {
-
-}
-// Options: [{"tags":{"author":".+"}}]
-
-/**
- * Foo.
- *
- * @x-tag something
- */
-function quux () {
-
-}
-// Options: [{"tags":{"x-tag":".+"}}]
-
-/**
- * Foo.
- *
- * @prop foo Foo.
- */
-function quux (foo) {
-
-}
-// Options: [{"tags":{"prop":true}}]
-
-/**
- * @param foo Foo bar.
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"description":false}}}
-
-/**
- *
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"description":false}}}
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-newline-after-description"></a>
-### <code>newline-after-description</code>
-
-Enforces a consistent padding of the block description.
-
-<a name="eslint-plugin-jsdoc-rules-newline-after-description-options-11"></a>
-#### Options
-
-This rule allows one optional string argument. If it is `"always"` then a problem is raised when there is no newline after the description. If it is `"never"` then a problem is raised when there is a newline after the description. The default value is `"always"`.
-
-|||
-|---|---|
-|Context|everywhere|
-|Options|(a string matching `"always"|"never"`)|
-|Tags|N/A (doc block)|
-
-The following patterns are considered problems:
-
-````js
-/**
- * Foo.
- *
- * Foo.
- * @foo
- */
-function quux () {
-
-}
-// Options: ["always"]
-// Message: There must be a newline after the description of the JSDoc block.
-
-/**
- * Foo.
- * @foo
- *
- * Foo.
- */
-function quux () {
-
-}
-// Options: ["always"]
-// Message: There must be a newline after the description of the JSDoc block.
-
-/**
- * Foo.
- *
- * Foo.
- * @foo
- */
-function quux () {
-
-}
-// Message: There must be a newline after the description of the JSDoc block.
-
-/**
- * Bar.
- *
- * Bar.
- *
- * @bar
- */
-function quux () {
-
-}
-// Options: ["never"]
-// Message: There must be no newline after the description of the JSDoc block.
-
-/**
- * Bar.
- *
- * @bar
- *
- * Bar.
- */
-function quux () {
-
-}
-// Options: ["never"]
-// Message: There must be no newline after the description of the JSDoc block.
-
-
-         /**
-          * Bar.
-          *
-          * Bar.
-          *
-          * @bar
-          */
-         function quux () {
-
-         }
-// Options: ["never"]
-// Message: There must be no newline after the description of the JSDoc block.
-
-/**
- * A.
- *
- * @typedef {object} A
- * @prop {boolean} a A.
- */
-// Options: ["never"]
-// Message: There must be no newline after the description of the JSDoc block.
-
-/**
- * A.
- * @typedef {object} A
- * @prop {boolean} a A.
- */
-// Options: ["always"]
-// Message: There must be a newline after the description of the JSDoc block.
-
-
-     /**
-      * Service for fetching symbols.
-      * @param {object} $http - Injected http helper.
-      * @param {object} $q - Injected Promise api helper.
-      * @param {object} $location - Injected window location object.
-      * @param {object} REPORT_DIALOG_CONSTANTS - Injected handle.
-      */
-// Message: There must be a newline after the description of the JSDoc block.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * Foo.
- */
-function quux () {
-
-}
-// Options: ["always"]
-
-/**
- * Bar.
- */
-function quux () {
-
-}
-// Options: ["never"]
-
-/**
- * Foo.
- *
- * @foo
- */
-function quux () {
-
-}
-// Options: ["always"]
-
-/**
- * Bar.
- * @bar
- */
-function quux () {
-
-}
-// Options: ["never"]
-
-
-     /**
-      * @foo
-      * Test 
-      * abc 
-      * @bar 
-      */
-
-
-     /**
-      * 
-      * @foo
-      * Test 
-      * abc 
-      * @bar 
-      */
-
-/***
- *
- */
-function quux () {
-
-}
-// Options: ["always"]
-
-/**
- * Parses query string to object containing URL parameters
- * 
- * @param queryString
- * Input string
- * 
- * @returns
- * Object containing URL parameters
- */
-export function parseQueryString(queryString: string): { [key: string]: string } {    // <-- Line 10 that fails
-
-}
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-no-types"></a>
-### <code>no-types</code>
-
-This rule reports types being used on `@param` or `@returns`.
-
-The rule is intended to prevent the indication of types on tags where
-the type information would be redundant with TypeScript.
-
-<a name="eslint-plugin-jsdoc-rules-no-types-options-12"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-no-types-options-12-contexts-2"></a>
-##### <code>contexts</code>
-
-Set this to an array of strings representing the AST context
-where you wish the rule to be applied.
-Overrides the default contexts (see below). Set to `"any"` if you want
-the rule to apply to any jsdoc block throughout your files (as is necessary
-for finding function blocks not attached to a function declaration or
-expression, i.e., `@callback` or `@function` (or its aliases `@func` or
-`@method`) (including those associated with an `@interface`).
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
-|Tags|`param`, `returns`|
-|Aliases|`arg`, `argument`, `return`|
-|Options|`contexts`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @param {number} foo
- */
-function quux (foo) {
-
-}
-// Message: Types are not permitted on @param.
-
-/**
- * @param {number} foo
- */
-function quux (foo) {
-
-}
-// Options: [{"contexts":["any"]}]
-// Message: Types are not permitted on @param.
-
-/**
- * @function
- * @param {number} foo
- */
-// Options: [{"contexts":["any"]}]
-// Message: Types are not permitted on @param.
-
-/**
- * @callback
- * @param {number} foo
- */
-// Options: [{"contexts":["any"]}]
-// Message: Types are not permitted on @param.
-
-/**
- * @returns {number}
- */
-function quux () {
-
-}
-// Message: Types are not permitted on @returns.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @param foo
- */
-// Options: [{"contexts":["any"]}]
-
-/**
- * @function
- * @param {number} foo
- */
-
-/**
- * @callback
- * @param {number} foo
- */
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-no-undefined-types"></a>
-### <code>no-undefined-types</code>
-
-Checks that types in jsdoc comments are defined. This can be used to check
-unimported types.
-
-When enabling this rule, types in jsdoc comments will resolve as used
-variables, i.e. will not be marked as unused by `no-unused-vars`.
-
-In addition to considering globals found in code (or in ESLint-indicated
-`globals`) as defined, the following tags will also be checked for
-name(path) definitions to also serve as a potential "type" for checking
-the tag types in the table below:
-
-`@callback`, `@class` (or `@constructor`), `@constant` (or `@const`), `@event`, `@external` (or `@host`), `@function` (or `@func` or `@method`), `@interface`, `@member` (or `@var`), `@mixin`, `@name`, `@namespace`, `@template` (for "closure" or "typescript" `settings.jsdoc.mode` only), `@typedef`.
-
-The following tags will also be checked but only when the mode is `closure`:
-
-`@package`, `@private`, `@protected`, `@public`, `@static`
-
-The following types are always considered defined.
-
-- `null`, `undefined`, `void`, `string`, `boolean`, `object`,
-  `function`, `symbol`
-- `number`, `bigint`, `NaN`, `Infinity`
-- `any`, `*`
-- `Array`, `Object`, `RegExp`, `Date`, `Function`
-
-Note that preferred types indicated within `settings.jsdoc.preferredTypes` will
-also be assumed to be defined.
-
-<a name="eslint-plugin-jsdoc-rules-no-undefined-types-options-13"></a>
-#### Options
-
-An option object may have the following key:
-
-- `definedTypes` - This array can be populated to indicate other types which
-  are automatically considered as defined (in addition to globals, etc.).
-  Defaults to an empty array.
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|`augments`, `class`, `constant`, `enum`, `implements`, `member`, `module`, `namespace`, `param`, `property`, `returns`, `throws`, `type`, `typedef`, `yields`|
-|Aliases|`constructor`, `const`, `extends`, `var`, `arg`, `argument`, `prop`, `return`, `exception`, `yield`|
-|Closure-only|`package`, `private`, `protected`, `public`, `static`|
-|Options|`definedTypes`|
-|Settings|`preferredTypes`, `mode`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @param {HerType} baz - Foo.
- */
-function quux(foo, bar, baz) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"HerType":1000}}}
-// Message: Invalid `settings.jsdoc.preferredTypes`. Values must be falsy, a string, or an object.
-
-/**
- * @param {HerType} baz - Foo.
- */
-function quux(foo, bar, baz) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"HerType":false}}}
-// Message: The type 'HerType' is undefined.
-
-/**
- * @param {strnig} foo - Bar.
- */
-function quux(foo) {
-
-}
-// Message: The type 'strnig' is undefined.
-
-/**
- * @param {MyType} foo - Bar.
- * @param {HisType} bar - Foo.
- */
-function quux(foo, bar) {
-
-}
-// Options: [{"definedTypes":["MyType"]}]
-// Message: The type 'HisType' is undefined.
-
-/**
- * @param {MyType} foo - Bar.
- * @param {HisType} bar - Foo.
- * @param {HerType} baz - Foo.
- */
-function quux(foo, bar, baz) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"hertype":{"replacement":"HerType"}}}}
-// Options: [{"definedTypes":["MyType"]}]
-// Message: The type 'HisType' is undefined.
-
- /**
-  * @param {MyType} foo - Bar.
-  * @param {HisType} bar - Foo.
-  * @param {HerType} baz - Foo.
-  */
-function quux(foo, bar, baz) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"hertype":{"replacement":false},"histype":"HisType"}}}
-// Options: [{"definedTypes":["MyType"]}]
-// Message: The type 'HerType' is undefined.
-
-/**
- * @template TEMPLATE_TYPE
- * @param {WRONG_TEMPLATE_TYPE} bar
- */
-function foo (bar) {
-};
-// Settings: {"jsdoc":{"mode":"closure"}}
-// Message: The type 'WRONG_TEMPLATE_TYPE' is undefined.
-
-class Foo {
-  /**
-   * @return {TEMPLATE_TYPE}
-   */
-  bar () {
-  }
-}
-// Message: The type 'TEMPLATE_TYPE' is undefined.
-
-class Foo {
-  /**
-   * @return {TEMPLATE_TYPE}
-   */
-  invalidTemplateReference () {
-  }
-}
-
-/**
- * @template TEMPLATE_TYPE
- */
-class Bar {
-  /**
-   * @return {TEMPLATE_TYPE}
-   */
-  validTemplateReference () {
-  }
-}
-// Settings: {"jsdoc":{"mode":"typescript"}}
-// Message: The type 'TEMPLATE_TYPE' is undefined.
-
-/**
- * @type {strnig}
- */
-var quux = {
-
-};
-// Message: The type 'strnig' is undefined.
-
-/**
- * @template TEMPLATE_TYPE_A, TEMPLATE_TYPE_B
- */
-class Foo {
-  /**
-   * @param {TEMPLATE_TYPE_A} baz
-   * @return {TEMPLATE_TYPE_B}
-   */
-  bar (baz) {
-  }
-}
-// Message: The type 'TEMPLATE_TYPE_A' is undefined.
-
-/**
- * @param {...VAR_TYPE} varargs
- */
-function quux (varargs) {
-}
-// Message: The type 'VAR_TYPE' is undefined.
-
-/**
- * @this {Navigator}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-// Message: The type 'Navigator' is undefined.
-
-/**
- * @export {SomeType}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-// Message: The type 'SomeType' is undefined.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @param {string} foo - Bar.
- */
-function quux(foo) {
-
-}
-
-/**
- * @param {Promise} foo - Bar.
- */
-function quux(foo) {
-
-}
-
-class MyClass {}
-
-/**
- * @param {MyClass} foo - Bar.
- */
-function quux(foo) {
-  console.log(foo);
-}
-
-quux(0);
-
-const MyType = require('my-library').MyType;
-
-/**
- * @param {MyType} foo - Bar.
- */
-  function quux(foo) {
-
-}
-
-const MyType = require('my-library').MyType;
-
-/**
- * @param {MyType} foo - Bar.
- */
-  function quux(foo) {
-
-}
-
-import {MyType} from 'my-library';
-
-/**
- * @param {MyType} foo - Bar.
- * @param {object<string, number>} foo
- * @param {Array<string>} baz
- */
-  function quux(foo, bar, baz) {
-
-}
-
-/*globals MyType*/
-
-/**
- * @param {MyType} foo - Bar.
- * @param {HisType} bar - Foo.
- */
-  function quux(foo, bar) {
-
-}
-
-/**
- * @typedef {object} hello
- * @property {string} a - a.
- */
-
-/**
- * @param {hello} foo
- */
-function quux(foo) {
-
-}
-
-/**
- * @param {Array<syntaxError} foo
- */
-function quux(foo) {
-
-}
-
-/**
- * Callback test.
- *
- * @callback addStuffCallback
- * @param {String} sum - An test integer.
- */
-/**
- * Test Eslint.
- *
- * @param {addStuffCallback} callback - A callback to run.
- */
-function testFunction(callback) {
-  callback();
-}
-
-/**
- *
- *
- */
-function foo () {
-
-}
-
-/**
- *
- *
- */
-function foo () {
-
-}
-
-/**
- * @param {MyType} foo - Bar.
- * @param {HisType} bar - Foo.
- */
-function quux(foo, bar) {
-
-}
-// Options: [{"definedTypes":["MyType","HisType"]}]
-
-/**
- * @param {MyType} foo - Bar.
- * @param {HisType} bar - Foo.
- * @param {HerType} baz - Foo.
- */
-function quux(foo, bar, baz) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"hertype":{"replacement":"HerType"},"histype":"HisType"}}}
-// Options: [{"definedTypes":["MyType"]}]
-
-/**
- * @param {MyType} foo - Bar.
- * @param {HisType} bar - Foo.
- * @param {HerType} baz - Foo.
- */
-function quux(foo, bar, baz) {
-
-}
-// Settings: {"jsdoc":{"preferredTypes":{"hertype":{"replacement":"HerType<>"},"histype":"HisType.<>"}}}
-// Options: [{"definedTypes":["MyType"]}]
-
-/**
- * @template TEMPLATE_TYPE
- * @param {TEMPLATE_TYPE} bar
- * @return {TEMPLATE_TYPE}
- */
-function foo (bar) {
-};
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-/**
- * @template TEMPLATE_TYPE
- */
-class Foo {
-  /**
-   * @return {TEMPLATE_TYPE}
-   */
-  bar () {
-  }
-}
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-/**
- * @template TEMPLATE_TYPE
- */
-class Foo {
-  /**
-   * @return {TEMPLATE_TYPE}
-   */
-  bar () {}
-
-  /**
-   * @return {TEMPLATE_TYPE}
-   */
-  baz () {}
-}
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-/**
- * @template TEMPLATE_TYPE_A, TEMPLATE_TYPE_B
- */
-class Foo {
-  /**
-   * @param {TEMPLATE_TYPE_A} baz
-   * @return {TEMPLATE_TYPE_B}
-   */
-  bar (baz) {
-  }
-}
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-/****/
-
-/**
- *
- */
-function quux () {
-
-}
-
-/**
- * Run callback when hooked method is called.
- *
- * @template {BaseObject} T
- * @param {T} obj - object whose method should be hooked.
- * @param {string} method - method which should be hooked.
- * @param {(sender: T) => void} callback - callback which should
- * be called when the hooked method was invoked.
- */
-function registerEvent(obj, method, callback) {
-
-}
-// Settings: {"jsdoc":{"mode":"typescript"}}
-
- /**
- * @param {...} varargs
- */
-function quux (varargs) {
-}
-
-/**
- * @param {...number} varargs
- */
-function quux (varargs) {
-}
-
-class Navigator {}
-/**
- * @this {Navigator}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-class SomeType {}
-/**
- * @export {SomeType}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-description-complete-sentence"></a>
-### <code>require-description-complete-sentence</code>
-
-Requires that block description, explicit `@description`, and `@param`/`@returns`
-tag descriptions are written in complete sentences, i.e.,
-
-* Description must start with an uppercase alphabetical character.
-* Paragraphs must start with an uppercase alphabetical character.
-* Sentences must end with a period.
-* Every line in a paragraph (except the first) which starts with an uppercase
-  character must be preceded by a line ending with a period.
-* A colon or semi-colon followed by two line breaks is still part of the
-  containing paragraph (unlike normal dual line breaks).
-* Text within inline tags `{...}` are not checked for sentence divisions.
-* Periods after items within the `abbreviations` option array are not treated
-  as sentence endings.
-
-<a name="eslint-plugin-jsdoc-rules-require-description-complete-sentence-options-14"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-require-description-complete-sentence-options-14-tags-2"></a>
-##### <code>tags</code>
-
-If you want additional tags to be checked for their descriptions, you may
-add them within this option.
-
-```js
-{
-  'jsdoc/require-description-complete-sentence': ['error', {tags: ['see', 'copyright']}]
-}
-```
-
-The tags `@param`/`@arg`/`@argument` and `@property`/`@prop` will be properly
-parsed to ensure that the checked "description" text includes only the text
-after the name.
-
-All other tags will treat the text following the tag name, a space, and
-an optional curly-bracketed type expression (and another space) as part of
-its "description" (e.g., for `@returns {someType} some description`, the
-description is `some description` while for `@some-tag xyz`, the description
-is `xyz`).
-
-<a name="eslint-plugin-jsdoc-rules-require-description-complete-sentence-options-14-abbreviations"></a>
-##### <code>abbreviations</code>
-
-You can provide an `abbreviations` options array to avoid such strings of text
-being treated as sentence endings when followed by dots. The `.` is not
-necessary at the end of the array items.
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|doc block, `param`, `returns`, `description`, `property`, `summary`, `file`, `classdesc`, `todo`, `deprecated`, `throws`, 'yields' and others added by `tags`|
-|Aliases|`arg`, `argument`, `return`, `desc`, `prop`, `fileoverview`, `overview`, `exception`, `yield`|
-|Options|`tags`, `abbreviations`|
-The following patterns are considered problems:
-
-````js
-/**
- * foo.
- */
-function quux () {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * foo?
- */
-function quux () {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * @description foo.
- */
-function quux () {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * Foo)
- */
-function quux () {
-
-}
-// Message: Sentence must end with a period.
-
-/**
- * `foo` is a variable
- */
-function quux () {
-
-}
-// Message: Sentence must end with a period.
-
-/**
- * Foo.
- *
- * foo.
- */
-function quux () {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * тест.
- */
-function quux () {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * Foo
- */
-function quux () {
-
-}
-// Message: Sentence must end with a period.
-
-/**
- * Foo
- * Bar.
- */
-function quux () {
-
-}
-// Message: A line of text is started with an uppercase character, but preceding line does not end the sentence.
-
-/**
- * Foo.
- *
- * @param foo foo.
- */
-function quux (foo) {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * Foo.
- *
- * @param foo bar
- */
-function quux (foo) {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * {@see Foo.bar} buz
- */
-function quux (foo) {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * Foo.
- *
- * @returns {number} foo
- */
-function quux (foo) {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * Foo.
- *
- * @returns foo.
- */
-function quux (foo) {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * lorem ipsum dolor sit amet, consectetur adipiscing elit. pellentesque elit diam,
- * iaculis eu dignissim sed, ultrices sed nisi. nulla at ligula auctor, consectetur neque sed,
- * tincidunt nibh. vivamus sit amet vulputate ligula. vivamus interdum elementum nisl,
- * vitae rutrum tortor semper ut. morbi porta ante vitae dictum fermentum.
- * proin ut nulla at quam convallis gravida in id elit. sed dolor mauris, blandit quis ante at,
- * consequat auctor magna. duis pharetra purus in porttitor mollis.
- */
-function longDescription (foo) {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * @arg {number} foo - Foo
- */
-function quux (foo) {
-
-}
-// Message: Sentence must end with a period.
-
-/**
- * @argument {number} foo - Foo
- */
-function quux (foo) {
-
-}
-// Message: Sentence must end with a period.
-
-/**
- * @return {number} foo
- */
-function quux (foo) {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * Returns bar.
- *
- * @return {number} bar
- */
-function quux (foo) {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * @throws {object} Hello World
- * hello world
-*/
-// Message: Sentence must end with a period.
-
-/**
- * @summary Foo
- */
-function quux () {
-
-}
-// Message: Sentence must end with a period.
-
-/**
- * @throws {SomeType} Foo
- */
-function quux () {
-
-}
-// Message: Sentence must end with a period.
-
-/**
- * @see Foo
- */
-function quux () {
-
-}
-// Options: [{"tags":["see"]}]
-// Message: Sentence must end with a period.
-
-/**
- * @param foo Foo bar
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"description":false}}}
-// Options: [{"tags":["param"]}]
-// Message: Sentence must end with a period.
-
-/**
- * Sorry, but this isn't a complete sentence, Mr.
- */
-function quux () {
-
-}
-// Options: [{"abbreviations":["Mr"]}]
-// Message: Sentence must end with a period.
-
-/**
- * Sorry, but this isn't a complete sentence Mr.
- */
-function quux () {
-
-}
-// Options: [{"abbreviations":["Mr."]}]
-// Message: Sentence must end with a period.
-
-/**
- * Sorry, but this isn't a complete sentence Mr. 
- */
-function quux () {
-
-}
-// Options: [{"abbreviations":["Mr"]}]
-// Message: Sentence must end with a period.
-
-/**
- * Sorry, but this isn't a complete sentence Mr. and Mrs.
- */
-function quux () {
-
-}
-// Options: [{"abbreviations":["Mr","Mrs"]}]
-// Message: Sentence must end with a period.
-
-/**
- * This is a complete sentence. But this isn't, Mr.
- */
-function quux () {
-
-}
-// Options: [{"abbreviations":["Mr"]}]
-// Message: Sentence must end with a period.
-
-/**
- * This is a complete Mr. sentence. But this isn't, Mr.
- */
-function quux () {
-
-}
-// Options: [{"abbreviations":["Mr"]}]
-// Message: Sentence must end with a period.
-
-/**
- * This is a complete Mr. sentence.
- */
-function quux () {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * This is fun, i.e. enjoyable, but not superlatively so, e.g. not
- * super, wonderful, etc..
- */
-function quux () {
-
-}
-// Message: Sentence should start with an uppercase character.
-
-/**
- * Do not have dynamic content; e.g. homepage. Here a simple unique id
- * suffices.
- */
- function quux () {
-
- }
-// Message: Sentence should start with an uppercase character.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @param foo - Foo.
- */
-function quux () {
-
-}
-
-/**
- * Foo.
- */
-function quux () {
-
-}
-
-/**
- * Foo.
- * Bar.
- */
-function quux () {
-
-}
-
-/**
- * Foo.
- *
- * Bar.
- */
-function quux () {
-
-}
-
-/**
- * Тест.
- */
-function quux () {
-
-}
-
-/**
- * Foo
- * bar.
- */
-function quux () {
-
-}
-
-/**
- * @returns Foo bar.
- */
-function quux () {
-
-}
-
-/**
- * Foo. {@see Math.sin}.
- */
-function quux () {
-
-}
-
-/**
- * Foo {@see Math.sin} bar.
- */
-function quux () {
-
-}
-
-/**
- * Foo?
- *
- * Bar!
- *
- * Baz:
- *   1. Foo.
- *   2. Bar.
- */
-function quux () {
-
-}
-
-/**
- * Hello:
- * World.
- */
-function quux () {
-
-}
-
-/**
- * Hello: world.
- */
-function quux () {
-
-}
-
-/**
- *
- */
-function quux () {
-
-}
-
-/**
- * @description Foo.
- */
-function quux () {
-
-}
-
-/**
- * `foo` is a variable.
- */
-function quux () {
-
-}
-
-/**
- * Foo.
- *
- * `foo`.
- */
-function quux () {
-
-}
-
-/**
- * @param foo - `bar`.
- */
-function quux () {
-
-}
-
-/**
- * @returns {number} `foo`.
- */
-function quux () {
-
-}
-
-/**
- * Foo
- * `bar`.
- */
-function quux () {
-
-}
-
-/**
- * @example Foo
- */
-function quux () {
-
-}
-
-/**
- * @see Foo
- */
-function quux () {
-
-}
-
-/**
- * Foo.
- *
- * @param foo Foo.
- */
-function quux (foo) {
-
-}
-
-/**
- * Foo.
- *
- * @param foo Foo.
- */
-function quux (foo) {
-
-}
-// Options: [{"tags":["param"]}]
-
-/**
- * @param foo Foo bar.
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"description":false}}}
-// Options: [{"tags":["param"]}]
-
-/**
- *
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"description":false}}}
-
-/**
-* We stop loading Items when we have loaded:
-*
-* 1) The main Item;
-* 2) All its variants.
-*/
-
-/**
- * This method is working on 2 steps.
- *
- * | Step | Comment     |
- * |------|-------------|
- * |   1  | do it       |
- * |   2  | do it again |
- */
-
-/**
- * This is something that
- * I want to test.
- */
-function quux () {
-
-}
-
-/**
- * When making HTTP requests, the
- * URL is super important.
- */
-function quux () {
-
-}
-
-/**
- * Sorry, but this isn't a complete sentence, Mr.
- */
-function quux () {
-
-}
-
-/**
- * Sorry, but this isn't a complete sentence Mr..
- */
-function quux () {
-
-}
-// Options: [{"abbreviations":["Mr."]}]
-
-/**
- * Sorry, but this isn't a complete sentence Mr. 
- */
-function quux () {
-
-}
-
-/**
- * Sorry, but this isn't a complete sentence Mr. and Mrs..
- */
-function quux () {
-
-}
-// Options: [{"abbreviations":["Mr","Mrs"]}]
-
-/**
- * This is a complete sentence aMr.
- */
-function quux () {
-
-}
-// Options: [{"abbreviations":["Mr"]}]
-
-/**
- * This is a complete sentence. But this isn't, Mr.
- */
-function quux () {
-
-}
-
-/**
- * This is a complete Mr. Sentence. But this isn't, Mr.
- */
-function quux () {
-
-}
-
-/**
- * This is a complete Mr. sentence.
- */
-function quux () {
-
-}
-// Options: [{"abbreviations":["Mr"]}]
-
-/**
- * This is fun, i.e. enjoyable, but not superlatively so, e.g. not
- * super, wonderful, etc..
- */
-function quux () {
-
-}
-// Options: [{"abbreviations":["etc","e.g.","i.e."]}]
-
-
-**
-* Do not have dynamic content; e.g. homepage. Here a simple unique id
-* suffices.
-*/
-function quux () {
-
-}
-// Options: [{"abbreviations":["etc","e.g.","i.e."]}]
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-description"></a>
-### <code>require-description</code>
-
-Requires that all functions have a description.
-
-* All functions must have an implicit description or have the option
-  `descriptionStyle` set to `tag`.
-* Every jsdoc block description (or description tag if `descriptionStyle` is
-  `"tag"`) must have a non-empty description that explains the purpose of the
-  method.
-
-<a name="eslint-plugin-jsdoc-rules-require-description-options-15"></a>
-#### Options
-
-An options object may have any of the following properties:
-
-- `contexts` - Set to an array of strings representing the AST context
-  where you wish the rule to be applied (e.g., `ClassDeclaration` for ES6
-  classes). Overrides the default contexts (see below).  Set to `"any"` if
-  you want the rule to apply to any jsdoc block throughout your files.
-- `exemptedBy` - Array of tags (e.g., `['type']`) whose presence on the
-    document block avoids the need for a `@description`. Defaults to an
-    empty array.
-- `descriptionStyle` - Whether to accept implicit descriptions (`"body"`) or
-    `@description` tags (`"tag"`) as satisfying the rule. Set to `"any"` to
-    accept either style. Defaults to `"body"`.
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
-|Tags|`description` or jsdoc block|
-|Aliases|`desc`|
-|Options|`contexts`, `exemptedBy`, `descriptionStyle`|
-|Settings|`overrideReplacesDocs`, `augmentsExtendsReplacesDocs`, `implementsReplacesDocs`|
-
-The following patterns are considered problems:
-
-````js
-/**
- *
- */
-function quux () {
-
-}
-// Options: [{"descriptionStyle":"tag"}]
-// Message: Missing JSDoc @description declaration.
-
-/**
- *
- */
-function quux () {
-
-}
-// Options: [{"descriptionStyle":"any"}]
-// Message: Missing JSDoc block description or @description declaration.
-
-/**
- *
- */
-function quux () {
-
-}
-// Options: [{"descriptionStyle":"body"}]
-// Message: Missing JSDoc block description.
-
-/**
- *
- */
-class quux {
-
-}
-// Options: [{"contexts":["ClassDeclaration"],"descriptionStyle":"tag"}]
-// Message: Missing JSDoc @description declaration.
-
-/**
- *
- */
-// Options: [{"contexts":["any"],"descriptionStyle":"tag"}]
-// Message: Missing JSDoc @description declaration.
-
-/**
- *
- */
-class quux {
-
-}
-// Options: [{"contexts":["ClassDeclaration"],"descriptionStyle":"tag"}]
-// Message: Missing JSDoc @description declaration.
-
-/**
- *
- */
-class quux {
-
-}
-// Options: [{"contexts":["ClassDeclaration"],"descriptionStyle":"tag"}]
-// Message: Missing JSDoc @description declaration.
-
-/**
- * @description
- */
-function quux () {
-
-}
-// Options: [{"descriptionStyle":"tag"}]
-// Message: Missing JSDoc @description description.
-
-/**
- *
- */
-interface quux {
-
-}
-// Options: [{"contexts":["TSInterfaceDeclaration"],"descriptionStyle":"tag"}]
-// Message: Missing JSDoc @description declaration.
-
-/**
- *
- */
-var quux = class {
-
-};
-// Options: [{"contexts":["ClassExpression"],"descriptionStyle":"tag"}]
-// Message: Missing JSDoc @description declaration.
-
-/**
- *
- */
-var quux = {
-
-};
-// Options: [{"contexts":["ObjectExpression"],"descriptionStyle":"tag"}]
-// Message: Missing JSDoc @description declaration.
-
-/**
- * @someDesc
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"description":{"message":"Please avoid `{{tagName}}`; use `{{replacement}}` instead","replacement":"someDesc"}}}}
-// Options: [{"descriptionStyle":"tag"}]
-// Message: Missing JSDoc @someDesc description.
-
-/**
- * @description
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"description":false}}}
-// Options: [{"descriptionStyle":"tag"}]
-// Message: Unexpected tag `@description`
-
-/**
- * @description
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"description":false}}}
-// Options: [{"descriptionStyle":"any"}]
-// Message: Missing JSDoc block description or @description declaration.
-
-/**
- *
- */
-function quux () {
-}
-// Options: [{"exemptedBy":["notPresent"]}]
-// Message: Missing JSDoc block description.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- *
- */
-
-/**
- * @description
- * // arbitrary description content
- */
-function quux () {
-
-}
-// Options: [{"descriptionStyle":"tag"}]
-
-/**
- * @description
- * quux(); // does something useful
- */
-function quux () {
-
-}
-// Options: [{"descriptionStyle":"tag"}]
-
-/**
- * @description <caption>Valid usage</caption>
- * quux(); // does something useful
- *
- * @description <caption>Invalid usage</caption>
- * quux('random unwanted arg'); // results in an error
- */
-function quux () {
-
-}
-// Options: [{"descriptionStyle":"tag"}]
-
-/**
- *
- */
-class quux {
-
-}
-// Options: [{"descriptionStyle":"tag"}]
-
-/**
- *
- */
-function quux () {
-
-}
-// Options: [{"contexts":["ClassDeclaration"]}]
-
-/**
- * @type {MyCallback}
- */
-function quux () {
-
-}
-// Options: [{"exemptedBy":["type"]}]
-
-/**
- *
- */
-interface quux {
-
-}
-// Options: [{"descriptionStyle":"tag"}]
-
-/**
- *
- */
-var quux = class {
-
-};
-// Options: [{"descriptionStyle":"tag"}]
-
-/**
- *
- */
-var quux = {
-
-};
-// Options: [{"descriptionStyle":"tag"}]
-
-/**
- * Has an implicit description
- */
-function quux () {
-
-}
-// Options: [{"descriptionStyle":"body"}]
-
-/**
- * Has an implicit description
- */
-function quux () {
-
-}
-
-/**
- * Has an implicit description
- */
-function quux () {
-
-}
-// Options: [{"descriptionStyle":"any"}]
-
-/**
- * @description Has an explicit description
- */
-function quux () {
-
-}
-// Options: [{"descriptionStyle":"any"}]
-
-/**
- *
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"description":false}}}
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-example"></a>
-### <code>require-example</code>
-
-Requires that all functions have examples.
-
-* All functions must have one or more `@example` tags.
-* Every example tag must have a non-empty description that explains the method's usage.
-
-<a name="eslint-plugin-jsdoc-rules-require-example-options-16"></a>
-#### Options
-
-This rule has an object option.
-
-<a name="eslint-plugin-jsdoc-rules-require-example-options-16-exemptedby"></a>
-##### <code>exemptedBy</code>
-
-Array of tags (e.g., `['type']`) whose presence on the document
-block avoids the need for an `@example`. Defaults to an empty array.
-
-<a name="eslint-plugin-jsdoc-rules-require-example-options-16-avoidexampleonconstructors"></a>
-##### <code>avoidExampleOnConstructors</code>
-
-Set to `true` to avoid the need for an example on a constructor (whether
-indicated as such by a jsdoc tag or by being within an ES6 `class`).
-Defaults to `false`.
-
-<a name="eslint-plugin-jsdoc-rules-require-example-options-16-contexts-3"></a>
-##### <code>contexts</code>
-
-Set this to an array of strings representing the AST context
-where you wish the rule to be applied (e.g., `ClassDeclaration` for ES6 classes).
-Overrides the default contexts (see below). Set to `"any"` if you want
-the rule to apply to any jsdoc block throughout your files.
-
-<a name="eslint-plugin-jsdoc-rules-require-example-fixer"></a>
-#### Fixer
-
-The fixer for `require-example` will add an empty `@example`, but it will still
-report a missing example description after this is added.
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
-|Tags|`example`|
-|Options|`exemptedBy`, `avoidExampleOnConstructors`, `contexts`|
-|Settings|`overrideReplacesDocs`, `augmentsExtendsReplacesDocs`, `implementsReplacesDocs`|
-
-The following patterns are considered problems:
-
-````js
-/**
- *
- */
-function quux () {
-
-}
-// Message: Missing JSDoc @example declaration.
-
-/**
- * @example
- */
-function quux () {
-
-}
-// Message: Missing JSDoc @example description.
-
-/**
- * @constructor
- */
-function f () {
-
-}
-// Settings: {"jsdoc":{"avoidExampleOnConstructors":true}}
-// Message: `settings.jsdoc.avoidExampleOnConstructors` has been removed, use options in the rule `require-example` instead.
-
-/**
- * @constructor
- */
-function quux () {
-
-}
-// Message: Missing JSDoc @example declaration.
-
-/**
- * @constructor
- * @example
- */
-function quux () {
-
-}
-// Message: Missing JSDoc @example description.
-
-/**
- *
- */
-class quux {
-
-}
-// Options: [{"contexts":["ClassDeclaration"]}]
-// Message: Missing JSDoc @example declaration.
-
-/**
- *
- */
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @example declaration.
-
-/**
- *
- */
-function quux () {
-}
-// Options: [{"exemptedBy":["notPresent"]}]
-// Message: Missing JSDoc @example declaration.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- *
- */
-
-/**
- * @example
- * // arbitrary example content
- */
-function quux () {
-
-}
-
-/**
- * @example
- * quux(); // does something useful
- */
-function quux () {
-
-}
-
-/**
- * @example <caption>Valid usage</caption>
- * quux(); // does something useful
- *
- * @example <caption>Invalid usage</caption>
- * quux('random unwanted arg'); // results in an error
- */
-function quux () {
-
-}
-
-/**
- * @constructor
- */
-function quux () {
-
-}
-// Options: [{"avoidExampleOnConstructors":true}]
-
-/**
- * @constructor
- * @example
- */
-function quux () {
-
-}
-// Options: [{"avoidExampleOnConstructors":true}]
-
-class Foo {
-  /**
-   *
-   */
-  constructor () {
-
-  }
-}
-// Options: [{"avoidExampleOnConstructors":true}]
-
-/**
- * @inheritdoc
- */
-function quux () {
-
-}
-
-/**
- * @type {MyCallback}
- */
-function quux () {
-
-}
-// Options: [{"exemptedBy":["type"]}]
-
-/**
- * @example Some example code
- */
-class quux {
-
-}
-// Options: [{"contexts":["ClassDeclaration"]}]
-
-/**
- *
- */
-function quux () {
-
-}
-// Options: [{"contexts":["ClassDeclaration"]}]
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-file-overview"></a>
-### <code>require-file-overview</code>
-
-Checks that:
-
-1. All files have a `@file`, `@fileoverview`, or `@overview` tag.
-2. Duplicate file overview tags within a given file will be reported
-3. File overview tags will be reported which are not, as per
-  [the docs](https://jsdoc.app/tags-file.html), "at the beginning of
-  the file"–where beginning of the file is interpreted in this rule
-  as being when the overview tag is not preceded by anything other than
-  a comment.
-
-<a name="eslint-plugin-jsdoc-rules-require-file-overview-options-17"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-require-file-overview-options-17-tags-3"></a>
-##### <code>tags</code>
-
-The keys of this object are tag names, and the values are configuration
-objects indicating what will be checked for these whole-file tags.
-
-Each configuration object has the following boolean keys (which default
-to `false` when this option is supplied): `mustExist`, `preventDuplicates`,
-`initialCommentsOnly`. These correspond to the three items above.
-
-When no `tags` is present, the default is:
-
-```json
-{
-  "file": {
-    "initialCommentsOnly": true,
-    "mustExist": true,
-    "preventDuplicates": true,
-  }
-}
-```
-
-You can add additional tag names and/or override `file` if you supply this
-option, e.g., in place of or in addition to `file`, giving other potential
-file global tags like `@license`, `@copyright`, `@author`, `@module` or
-`@exports`, optionally restricting them to a single use or preventing them
-from being preceded by anything besides comments.
-
-For example:
-
-```js
-{
-  "license": {
-    "mustExist": true,
-    "preventDuplicates": true,
-  }
-}
-```
-
-This would require one and only one `@license` in the file, though because
-`initialCommentsOnly` is absent and defaults to `false`, the `@license`
-can be anywhere.
-
-In the case of `@license`, you can use this rule along with the
-`check-values` rule (with its `allowedLicenses` or `licensePattern` options),
-to enforce a license whitelist be present on every JS file.
-
-Note that if you choose to use `preventDuplicates` with `license`, you still
-have a way to allow multiple licenses for the whole page by using the SPDX
-"AND" expression, e.g., `@license (MIT AND GPL-3.0)`.
-
-Note that the tag names are the main jsdoc tag name, so you should use `file`
-in this configuration object regardless of whether you have configured
-`fileoverview` instead of `file` on `tagNamePreference` (i.e., `fileoverview`
-will be checked, but you must use `file` on the configuration object).
-
-|||
-|---|---|
-|Context|Everywhere|
-|Tags|`file`; others when `tags` set|
-|Aliases|`fileoverview`, `overview`|
-|Options|`tags`|
-
-The following patterns are considered problems:
-
-````js
-
-// Message: Missing @file
-
-
-// Options: [{"tags":{"file":{"initialCommentsOnly":true,"mustExist":true,"preventDuplicates":true}}}]
-// Message: Missing @file
-
-
-// Options: [{"tags":{"file":{"mustExist":true}}}]
-// Message: Missing @file
-
-
-// Options: [{"tags":{"author":{"initialCommentsOnly":false,"mustExist":true,"preventDuplicates":false}}}]
-// Message: Missing @author
-
-/**
- *
- */
-// Message: Missing @file
-
-/**
- *
- */
-function quux () {}
-// Message: Missing @file
-
-/**
- *
- */
-function quux () {}
-// Settings: {"jsdoc":{"tagNamePreference":{"file":"fileoverview"}}}
-// Message: Missing @fileoverview
-
-/**
- *
- */
-function quux () {}
-// Settings: {"jsdoc":{"tagNamePreference":{"file":"overview"}}}
-// Message: Missing @overview
-
-/**
- *
- */
-function quux () {}
-// Settings: {"jsdoc":{"tagNamePreference":{"file":false}}}
-// Message: `settings.jsdoc.tagNamePreference` cannot block @file for the `require-file-overview` rule
-
-/**
- *
- */
-function quux () {}
-// Settings: {"jsdoc":{"tagNamePreference":{"file":false}}}
-// Options: [{"tags":{"file":{"initialCommentsOnly":false,"mustExist":true,"preventDuplicates":false}}}]
-// Message: `settings.jsdoc.tagNamePreference` cannot block @file for the `require-file-overview` rule
-
-/**
- *
- */
-function quux () {}
-// Settings: {"jsdoc":{"tagNamePreference":{"file":{"message":"Don't use file"}}}}
-// Message: `settings.jsdoc.tagNamePreference` cannot block @file for the `require-file-overview` rule
-
-/**
- * @param a
- */
-function quux (a) {}
-// Message: Missing @file
-
-/**
- * @param a
- */
-function quux (a) {}
-
-/**
- * @param b
- */
-function bar (b) {}
-// Message: Missing @file
-
-/**
- * @file
- */
-
- /**
-  * @file
-  */
-// Message: Duplicate @file
-
-/**
- * @copyright
- */
-
- /**
-  * @copyright
-  */
-// Options: [{"tags":{"copyright":{"initialCommentsOnly":false,"mustExist":false,"preventDuplicates":true}}}]
-// Message: Duplicate @copyright
-
-function quux () {
-}
-/**
- * @file
- */
-// Message: @file should be at the beginning of the file
-
-function quux () {
-}
-/**
- * @license
- */
-// Options: [{"tags":{"license":{"initialCommentsOnly":true,"mustExist":false,"preventDuplicates":false}}}]
-// Message: @license should be at the beginning of the file
-
-function quux () {
-}
-/**
- * @license
- */
-// Options: [{"tags":{"license":{"initialCommentsOnly":true}}}]
-// Message: @license should be at the beginning of the file
-
-/**
- * @file
- */
-
-/**
- * @file
- */
-// Options: [{"tags":{"file":{"initialCommentsOnly":true,"preventDuplicates":true}}}]
-// Message: Duplicate @file
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @file
- */
-
-/**
- * @file
- */
-
-/**
- * @file
- */
-// Options: [{"tags":{"license":{"initialCommentsOnly":true,"preventDuplicates":true}}}]
-
-// Ok preceded by comment
-/**
- * @file
- */
-
-/**
- * @fileoverview
- */
-// Settings: {"jsdoc":{"tagNamePreference":{"file":"fileoverview"}}}
-
-/**
- * @overview
- */
-// Settings: {"jsdoc":{"tagNamePreference":{"file":"overview"}}}
-
-/**
- * @file Description of file
- */
-
-/**
- * @file Description of file
- */
-function quux () {
-}
-
-/**
- *
- */
-
-function quux () {
-}
-/**
- *
- */
-// Options: [{"tags":{"license":{"initialCommentsOnly":true,"mustExist":false,"preventDuplicates":false}}}]
-
-function quux () {
-}
-/**
- *
- */
-// Options: [{"tags":{"license":{"initialCommentsOnly":false,"mustExist":false,"preventDuplicates":false}}}]
-
-function quux () {
-}
-/**
- *
- */
-// Options: [{"tags":{"license":{"initialCommentsOnly":false,"mustExist":false,"preventDuplicates":true}}}]
-
-/**
- * @license MIT
- */
-
- var a
-
- /**
-  * @type {Array}
-  */
-// Options: [{"tags":{"license":{"initialCommentsOnly":true,"mustExist":false,"preventDuplicates":false}}}]
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-hyphen-before-param-description"></a>
-### <code>require-hyphen-before-param-description</code>
-
-Requires a hyphen before the `@param` description.
-
-<a name="eslint-plugin-jsdoc-rules-require-hyphen-before-param-description-options-18"></a>
-#### Options
-
-This rule takes one optional string argument and an optional options object.
-
-If the string is `"always"` then a problem is raised when there is no hyphen
-before the description. If it is `"never"` then a problem is raised when there
-is a hyphen before the description. The default value is `"always"`.
-
-The options object may have the following properties:
-
-- `checkProperties` - Boolean on whether to also apply the rule to `@property`
-  tags.
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|`param` and optionally `property`|
-|Aliases|`arg`, `argument`; optionally `prop`|
-|Options|(a string matching `"always"|"never"`) and an optional object with a `checkProperties` property|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @param foo Foo.
- */
-function quux () {
-
-}
-// Options: ["always"]
-// Message: There must be a hyphen before @param description.
-
-/**
- * @param foo Foo.
- */
-function quux () {
-
-}
-// Message: There must be a hyphen before @param description.
-
-/**
- * @param foo - Foo.
- */
-function quux () {
-
-}
-// Options: ["never"]
-// Message: There must be no hyphen before @param description.
-
-/**
- * @param foo - foo
- * @param foo foo
- */
-function quux () {
-
-}
-// Options: ["always"]
-// Message: There must be a hyphen before @param description.
-
-/**
- * @param foo foo
- * bar
- * @param bar - bar
- */
-function quux () {
-
-}
-// Options: ["always"]
-// Message: There must be a hyphen before @param description.
-
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":false}}}
-// Message: Unexpected tag `@param`
-
-/**
- * @typedef {SomeType} ATypeDefName
- * @property foo Foo.
- */
-// Options: ["always",{"checkProperties":true}]
-// Message: There must be a hyphen before @property description.
-
-/**
- * @typedef {SomeType} ATypeDefName
- * @property foo - Foo.
- */
-// Options: ["never",{"checkProperties":true}]
-// Message: There must be no hyphen before @property description.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @param foo - Foo.
- */
-function quux () {
-
-}
-// Options: ["always"]
-
-/**
- * @param foo Foo.
- */
-function quux () {
-
-}
-// Options: ["never"]
-
-/**
- * @param foo
- */
-function quux () {
-
-}
-
-/**
- * @typedef {SomeType} ATypeDefName
- * @property foo - Foo.
- */
-// Options: ["always",{"checkProperties":true}]
-
-/**
- * @typedef {SomeType} ATypeDefName
- * @property foo Foo.
- */
-// Options: ["never",{"checkProperties":true}]
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-jsdoc"></a>
-### <code>require-jsdoc</code>
-
-Checks for presence of jsdoc comments, on class declarations as well as
-functions.
-
-<a name="eslint-plugin-jsdoc-rules-require-jsdoc-options-19"></a>
-#### Options
-
-Accepts one optional options object with the following optional keys.
-
-- `publicOnly` - This option will insist that missing jsdoc blocks are
-  only reported for function bodies / class declarations that are exported
-  from the module. May be a boolean or object. If set to `true`, the defaults
-  below will be used. If unset, jsdoc block reporting will not be limited to
-  exports.
-
-  This object supports the following optional boolean keys (`false` unless
-  otherwise noted):
-
-  - `ancestorsOnly` - Only check node ancestors to check if node is exported
-  - `esm` - ESM exports are checked for JSDoc comments (Defaults to `true`)
-  - `cjs` - CommonJS exports are checked for JSDoc comments  (Defaults to `true`)
-  - `window` - Window global exports are checked for JSDoc comments
-
-- `require` - An object with the following optional boolean keys which all
-    default to `false` except as noted, indicating the contexts where the rule
-    will apply:
-
-  - `ArrowFunctionExpression`
-  - `ClassDeclaration`
-  - `ClassExpression`
-  - `FunctionDeclaration` (defaults to `true`)
-  - `FunctionExpression`
-  - `MethodDefinition`
-
-- `contexts` - Set this to an array of strings representing the additional
-  AST contexts where you wish the rule to be applied (e.g., `Property` for
-  properties). Defaults to an empty array.
-
-- `exemptEmptyFunctions` (default: false) - When `true`, the rule will not report
-  missing jsdoc blocks above functions/methods with no parameters or return values
-  (intended where variable names are sufficient for themselves as documentation).
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `ClassDeclaration`, `ClassExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
-|Tags|N/A|
-|Options|`publicOnly`, `require`, `contexts`, `exemptEmptyFunctions`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @func myFunction
- */
-function myFunction() {
-
-}
-// Settings: {"jsdoc":{"maxLines":3,"minLines":2}}
-// Message: Missing JSDoc comment.
-
-/**
- * @func myFunction
- */
-
-
-function myFunction() {
-
-}
-// Settings: {"jsdoc":{"maxLines":2}}
-// Message: Missing JSDoc comment.
-
-/** @func myFunction */ function myFunction() {
-
-}
-// Settings: {"jsdoc":{"minLines":1}}
-// Message: Missing JSDoc comment.
-
-export var test = function () {
-
-};
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-function test () {
-
-}
-export var test2 = test;
-// Options: [{"publicOnly":true,"require":{"FunctionDeclaration":true}}]
-// Message: Missing JSDoc comment.
-
-export const test = () => {
-
-};
-// Options: [{"publicOnly":true,"require":{"ArrowFunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-export let test = class {
-
-};
-// Options: [{"publicOnly":true,"require":{"ClassExpression":true}}]
-// Message: Missing JSDoc comment.
-
-export default function () {}
-// Options: [{"publicOnly":{"cjs":false,"esm":true,"window":false},"require":{"FunctionDeclaration":true}}]
-// Message: Missing JSDoc comment.
-
-export default () => {}
-// Options: [{"publicOnly":{"cjs":false,"esm":true,"window":false},"require":{"ArrowFunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-export default (function () {})
-// Options: [{"publicOnly":{"cjs":false,"esm":true,"window":false},"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-export default class {}
-// Options: [{"publicOnly":{"cjs":false,"esm":true,"window":false},"require":{"ClassDeclaration":true}}]
-// Message: Missing JSDoc comment.
-
-function quux (foo) {
-
-}
-// Message: Missing JSDoc comment.
-
-
-// Settings: {"jsdoc":{"exemptEmptyFunctions":true}}
-// Message: `settings.jsdoc.exemptEmptyFunctions` has been removed, use options in the rule `require-jsdoc` instead.
-
-function quux (foo) {
-
-}
-// Options: [{"exemptEmptyFunctions":true}]
-// Message: Missing JSDoc comment.
-
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"minLines":2}}
-// Options: [{"exemptEmptyFunctions":true}]
-// Message: Missing JSDoc comment.
-
-function myFunction() {}
-// Message: Missing JSDoc comment.
-
-/**
- * Description for A.
- */
-class A {
-   constructor(xs) {
-        this.a = xs;
-   }
-}
-// Options: [{"require":{"ClassDeclaration":true,"MethodDefinition":true}}]
-// Message: Missing JSDoc comment.
-
-class A {
-    /**
-     * Description for constructor.
-     * @param {object[]} xs - xs
-     */
-    constructor(xs) {
-        this.a = xs;
-    }
-}
-// Options: [{"require":{"ClassDeclaration":true,"MethodDefinition":true}}]
-// Message: Missing JSDoc comment.
-
-class A extends B {
-    /**
-     * Description for constructor.
-     * @param {object[]} xs - xs
-     */
-    constructor(xs) {
-        this.a = xs;
-    }
-}
-// Options: [{"require":{"ClassDeclaration":true,"MethodDefinition":true}}]
-// Message: Missing JSDoc comment.
-
-export class A extends B {
-    /**
-     * Description for constructor.
-     * @param {object[]} xs - xs
-     */
-    constructor(xs) {
-        this.a = xs;
-    }
-}
-// Options: [{"require":{"ClassDeclaration":true,"MethodDefinition":true}}]
-// Message: Missing JSDoc comment.
-
-export default class A extends B {
-    /**
-     * Description for constructor.
-     * @param {object[]} xs - xs
-     */
-    constructor(xs) {
-        this.a = xs;
-    }
-}
-// Options: [{"require":{"ClassDeclaration":true,"MethodDefinition":true}}]
-// Message: Missing JSDoc comment.
-
-var myFunction = () => {}
-// Options: [{"require":{"ArrowFunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-var myFunction = () => () => {}
-// Options: [{"require":{"ArrowFunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-var foo = function() {}
-// Options: [{"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-const foo = {bar() {}}
-// Options: [{"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-var foo = {bar: function() {}}
-// Options: [{"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-function foo (abc) {}
-// Options: [{"exemptEmptyFunctions":false}]
-// Message: Missing JSDoc comment.
-
-function foo () {
-  return true;
-}
-// Options: [{"exemptEmptyFunctions":false}]
-// Message: Missing JSDoc comment.
-
-module.exports = function quux () {
-
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-module.exports = function quux () {
-
-}
-// Options: [{"publicOnly":{"ancestorsOnly":true},"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-module.exports = {
-  method: function() {
-
-  }
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-module.exports = {
-  test: {
-    test2: function() {
-
-    }
-  }
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-module.exports = {
-  test: {
-    test2: function() {
-
-    }
-  }
-}
-// Options: [{"publicOnly":{"ancestorsOnly":true},"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-const test = module.exports = function () {
-
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-/**
-*
-*/
-const test = module.exports = function () {
-
-}
-
-test.prototype.method = function() {}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-const test = function () {
-
-}
-module.exports = {
-  test: test
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-const test = () => {
-
-}
-module.exports = {
-  test: test
-}
-// Options: [{"publicOnly":true,"require":{"ArrowFunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-class Test {
-    method() {
-
-    }
-}
-module.exports = Test;
-// Options: [{"publicOnly":true,"require":{"MethodDefinition":true}}]
-// Message: Missing JSDoc comment.
-
-export default function quux () {
-
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-export default function quux () {
-
-}
-// Options: [{"publicOnly":{"ancestorsOnly":true},"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-function quux () {
-
-}
-export default quux;
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-export function test() {
-
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-export function test() {
-
-}
-// Options: [{"publicOnly":{"ancestorsOnly":true},"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-var test = function () {
-
-}
-var test2 = 2;
-export { test, test2 }
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-var test = function () {
-
-}
-export { test as test2 }
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-export default class A {
-
-}
-// Options: [{"publicOnly":true,"require":{"ClassDeclaration":true}}]
-// Message: Missing JSDoc comment.
-
-export default class A {
-
-}
-// Options: [{"publicOnly":{"ancestorsOnly":true},"require":{"ClassDeclaration":true}}]
-// Message: Missing JSDoc comment.
-
-var test = function () {
-
-}
-// Options: [{"publicOnly":{"window":true},"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-window.test = function () {
-
-}
-// Options: [{"publicOnly":{"window":true},"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-function test () {
-
-}
-// Options: [{"publicOnly":{"window":true}}]
-// Message: Missing JSDoc comment.
-
-module.exports = function() {
-
-}
-// Options: [{"publicOnly":{"cjs":true,"esm":false,"window":false},"require":{"FunctionExpression":true}}]
-// Message: Missing JSDoc comment.
-
-export function someMethod() {
-
-}
-// Options: [{"publicOnly":{"cjs":false,"esm":true,"window":false},"require":{"FunctionDeclaration":true}}]
-// Message: Missing JSDoc comment.
-
-export function someMethod() {
-
-}
-// Options: [{"publicOnly":{"cjs":false,"esm":true,"window":false},"require":{"FunctionDeclaration":true}}]
-// Message: Missing JSDoc comment.
-
-const myObject = {
-  myProp: true
-};
-// Options: [{"contexts":["Property"]}]
-// Message: Missing JSDoc comment.
-
-/**
- * Foo interface documentation.
- */
-export interface Foo extends Bar {
-  /**
-   * baz method documentation.
-   */
-  baz(): void;
-
-  meow(): void;
-}
-// Options: [{"contexts":["TSMethodSignature"]}]
-// Message: Missing JSDoc comment.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- *
- */
-
-var array = [1,2,3];
-array.forEach(function() {});
-
-/**
- * @class MyClass
- **/
-function MyClass() {}
-
-/**
- Function doing something
- */
-function myFunction() {}
-/**
- Function doing something
- */
-var myFunction = function() {};
-/**
- Function doing something
- */
-Object.myFunction = function () {};
-var obj = {
-   /**
-    *  Function doing something
-    **/
-    myFunction: function () {} };
-
-/**
- @func myFunction
- */
-function myFunction() {}
-/**
- @method myFunction
- */
-function myFunction() {}
-/**
- @function myFunction
- */
-function myFunction() {}
-
-/**
- @func myFunction
- */
-var myFunction = function () {}
-/**
- @method myFunction
- */
-var myFunction = function () {}
-/**
- @function myFunction
- */
-var myFunction = function () {}
-
-/**
- @func myFunction
- */
-Object.myFunction = function() {}
-/**
- @method myFunction
- */
-Object.myFunction = function() {}
-/**
- @function myFunction
- */
-Object.myFunction = function() {}
-(function(){})();
-
-var object = {
-  /**
-   *  @func myFunction - Some function
-   */
-  myFunction: function() {} }
-var object = {
-  /**
-   *  @method myFunction - Some function
-   */
-  myFunction: function() {} }
-var object = {
-  /**
-   *  @function myFunction - Some function
-   */
-  myFunction: function() {} }
-
-var array = [1,2,3];
-array.filter(function() {});
-Object.keys(this.options.rules || {}).forEach(function(name) {}.bind(this));
-var object = { name: 'key'};
-Object.keys(object).forEach(function() {})
-
-/**
- * @func myFunction
- */
-
-function myFunction() {
-
-}
-// Settings: {"jsdoc":{"maxLines":2,"minLines":0}}
-
-/**
- * @func myFunction
- */
-
-
-function myFunction() {
-
-}
-// Settings: {"jsdoc":{"maxLines":3,"minLines":0}}
-
-/** @func myFunction */  function myFunction() {
-
-}
-// Settings: {"jsdoc":{"maxLines":0,"minLines":0}}
-
-/**
- * @func myFunction
- */
-
-function myFunction() {
-
-}
-// Settings: {"jsdoc":{"maxLines":3,"minLines":2}}
-
-function myFunction() {}
-// Options: [{"require":{"ClassDeclaration":true,"FunctionDeclaration":false,"MethodDefinition":true}}]
-
-var myFunction = function() {}
-// Options: [{"require":{"ClassDeclaration":true,"FunctionDeclaration":false,"MethodDefinition":true}}]
-
-/**
- * Description for A.
- */
-class A {
-    /**
-     * Description for constructor.
-     * @param {object[]} xs - xs
-     */
-    constructor(xs) {
-        this.a = xs;
-    }
-}
-// Options: [{"require":{"ClassDeclaration":true,"MethodDefinition":true}}]
-
-/**
- * Description for A.
- */
-class App extends Component {
-    /**
-     * Description for constructor.
-     * @param {object[]} xs - xs
-     */
-    constructor(xs) {
-        this.a = xs;
-    }
-}
-// Options: [{"require":{"ClassDeclaration":true,"MethodDefinition":true}}]
-
-/**
- * Description for A.
- */
-export default class App extends Component {
-    /**
-     * Description for constructor.
-     * @param {object[]} xs - xs
-     */
-    constructor(xs) {
-        this.a = xs;
-    }
-}
-// Options: [{"require":{"ClassDeclaration":true,"MethodDefinition":true}}]
-
-/**
- * Description for A.
- */
-export class App extends Component {
-    /**
-     * Description for constructor.
-     * @param {object[]} xs - xs
-     */
-    constructor(xs) {
-        this.a = xs;
-    }
-}
-// Options: [{"require":{"ClassDeclaration":true,"MethodDefinition":true}}]
-
-class A {
-    constructor(xs) {
-        this.a = xs;
-    }
-}
-// Options: [{"require":{"ClassDeclaration":false,"MethodDefinition":false}}]
-
-/**
-* Function doing something
-*/
-var myFunction = () => {}
-// Options: [{"require":{"ArrowFunctionExpression":true}}]
-
-/**
-* Function doing something
-*/
-var myFunction = function () {}
-// Options: [{"require":{"ArrowFunctionExpression":true}}]
-
-/**
-* Function doing something
-*/
-var myFunction = () => {}
-// Options: [{"require":{"ArrowFunctionExpression":false}}]
-
-/**
- Function doing something
-*/
-var myFunction = () => () => {}
-// Options: [{"require":{"ArrowFunctionExpression":true}}]
-
-setTimeout(() => {}, 10);
-// Options: [{"require":{"ArrowFunctionExpression":true}}]
-
-/**
-JSDoc Block
-*/
-var foo = function() {}
-// Options: [{"require":{"FunctionExpression":true}}]
-
-const foo = {/**
-JSDoc Block
-*/
-bar() {}}
-// Options: [{"require":{"FunctionExpression":true}}]
-
-var foo = {/**
-JSDoc Block
-*/
-bar: function() {}}
-// Options: [{"require":{"FunctionExpression":true}}]
-
-var foo = { [function() {}]: 1 };
-// Options: [{"require":{"FunctionExpression":true}}]
-
-function foo () {}
-// Options: [{"exemptEmptyFunctions":true}]
-
-function foo () {
-  return;
-}
-// Options: [{"exemptEmptyFunctions":true}]
-
-const test = {};
-/**
- * test
- */
- test.method = function () {
-
-}
-module.exports = {
-  prop: { prop2: test.method }
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-
-/**
- *
- */
-function test() {
-
-}
-
-module.exports = {
-  prop: { prop2: test }
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-
-/**
- *
- */
-test = function() {
-
-}
-
-module.exports = {
-  prop: { prop2: test }
-}
-// Options: [{"publicOnly":{"cjs":true,"esm":false,"window":false},"require":{"FunctionExpression":true}}]
-
-/**
- *
- */
-test = function() {
-
-}
-
-exports.someMethod = {
-  prop: { prop2: test }
-}
-// Options: [{"publicOnly":{"cjs":false,"esm":true,"window":false},"require":{"FunctionExpression":true}}]
-
-/**
- *
- */
-const test = () => {
-
-}
-
-module.exports = {
-prop: { prop2: test }
-}
-// Options: [{"publicOnly":true,"require":{"ArrowFunctionExpression":true}}]
-
-const test = () => {
-
-}
-module.exports = {
-  prop: { prop2: test }
-}
-// Options: [{"publicOnly":{"ancestorsOnly":true},"require":{"ArrowFunctionExpression":true}}]
-
-/**
- *
- */
-window.test = function() {
-
-}
-
-module.exports = {
-prop: window
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-
-test = function() {
-
-}
-
-/**
- *
- */
-test = function() {
-
-}
-
-module.exports = {
-prop: { prop2: test }
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-
-test = function() {
-
-}
-
-test = 2;
-
-module.exports = {
-prop: { prop2: test }
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-
-/**
- *
- */
-function test() {
-
-}
-
-/**
- *
- */
-test.prototype.method = function() {
-
-}
-
-module.exports = {
-prop: { prop2: test }
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-
-class Test {
-  /**
-   * Test
-   */
-  method() {
-
-  }
-}
-module.exports = Test;
-// Options: [{"publicOnly":true,"require":{"MethodDefinition":true}}]
-
-/**
- *
- */
-export default function quux () {
-
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-
-/**
- *
- */
-export default function quux () {
-
-}
-// Options: [{"publicOnly":{"ancestorsOnly":true},"require":{"FunctionExpression":true}}]
-
-/**
- *
- */
-function quux () {
-
-}
-export default quux;
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-
-function quux () {
-
-}
-export default quux;
-// Options: [{"publicOnly":{"ancestorsOnly":true},"require":{"FunctionExpression":true}}]
-
-/**
- *
- */
-export function test() {
-
-}
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-
-/**
- *
- */
-export function test() {
-
-}
-// Options: [{"publicOnly":{"ancestorsOnly":true},"require":{"FunctionExpression":true}}]
-
-/**
- *
- */
-var test = function () {
-
-}
-var test2 = 2;
-export { test, test2 }
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-
-/**
- *
- */
-var test = function () {
-
-}
-export { test as test2 }
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-
-/**
- *
- */
-export default class A {
-
-}
-// Options: [{"publicOnly":{"ancestorsOnly":true},"require":{"ClassDeclaration":true}}]
-
-/**
- *
- */
-var test = function () {
-
-}
-// Options: [{"publicOnly":{"window":true},"require":{"FunctionExpression":true}}]
-
-let test = function () {
-
-}
-// Options: [{"publicOnly":{"window":true},"require":{"FunctionExpression":true}}]
-
-let test = class {
-
-}
-// Options: [{"publicOnly":true,"require":{"ClassExpression":false}}]
-
-/**
- *
- */
-let test = class {
-
-}
-// Options: [{"publicOnly":true,"require":{"ClassExpression":true}}]
-
-export function someMethod() {
-
-}
-// Options: [{"publicOnly":{"cjs":true,"esm":false,"window":false},"require":{"FunctionDeclaration":true}}]
-
-export function someMethod() {
-
-}
-// Options: [{"publicOnly":{"cjs":true,"esm":false,"window":false},"require":{"FunctionDeclaration":true}}]
-
-exports.someMethod = function() {
-
-}
-// Options: [{"publicOnly":{"cjs":false,"esm":true,"window":false},"require":{"FunctionExpression":true}}]
-
-const myObject = {
-  myProp: true
-};
-// Options: [{"contexts":[]}]
-
-function bear() {}
-/**
- *
- */
-function quux () {
-}
-export default quux;
-// Options: [{"publicOnly":true,"require":{"FunctionExpression":true}}]
-
-/**
- * This example interface is great!
- */
-export interface Example {
-  /**
-   * My super test string!
-   */
-  test: string
-}
-// Options: [{"contexts":["TSInterfaceDeclaration"]}]
-
-/**
- * This example interface is great!
- */
-interface Example {
-  /**
-   * My super test string!
-   */
-  test: string
-}
-// Options: [{"contexts":["TSInterfaceDeclaration"]}]
-
-/**
- * This example type is great!
- */
-export type Example = {
-  /**
-   * My super test string!
-   */
-  test: string
-};
-// Options: [{"contexts":["TSTypeAliasDeclaration"]}]
-
-/**
- * This example type is great!
- */
-type Example = {
-  /**
-   * My super test string!
-   */
-  test: string
-};
-// Options: [{"contexts":["TSTypeAliasDeclaration"]}]
-
-/**
- * This example enum is great!
- */
-export enum Example {
-  /**
-   * My super test enum!
-   */
-  test = 123
-}
-// Options: [{"contexts":["TSEnumDeclaration"]}]
-
-/**
- * This example enum is great!
- */
-enum Example {
-  /**
-   * My super test enum!
-   */
-  test = 123
-}
-// Options: [{"contexts":["TSEnumDeclaration"]}]
-
-const foo = {...{}};
-function bar() {}
-// Options: [{"exemptEmptyFunctions":false,"publicOnly":true,"require":{"ArrowFunctionExpression":true,"ClassDeclaration":true,"ClassExpression":true,"FunctionDeclaration":true,"FunctionExpression":false,"MethodDefinition":true}}]
-
-/**
- * Class documentation
- */
- @logged
-export default class Foo {
- // ....
-}
-// Options: [{"exemptEmptyFunctions":false,"require":{"ClassDeclaration":true}}]
-
-const a = {};
-const b = {
-  ...a
-};
-
-export default b;
-// Options: [{"contexts":["ObjectExpression"],"exemptEmptyFunctions":false,"publicOnly":true}]
-
-/**
- * Foo interface documentation.
- */
-export interface Foo extends Bar {
-  /**
-   * baz method documentation.
-   */
-  baz(): void;
-
-  /**
-   * meow method documentation.
-   */
-  meow(): void;
-}
-// Options: [{"contexts":["TSMethodSignature"]}]
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-param-description"></a>
-### <code>require-param-description</code>
-
-Requires that each `@param` tag has a `description` value.
-
-<a name="eslint-plugin-jsdoc-rules-require-param-description-options-20"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-require-param-description-options-20-contexts-4"></a>
-##### <code>contexts</code>
-
-Set this to an array of strings representing the AST context
-where you wish the rule to be applied.
-Overrides the default contexts (see below). Set to `"any"` if you want
-the rule to apply to any jsdoc block throughout your files (as is necessary
-for finding function blocks not attached to a function declaration or
-expression, i.e., `@callback` or `@function` (or its aliases `@func` or
-`@method`) (including those associated with an `@interface`).
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
-|Tags|`param`|
-|Aliases|`arg`, `argument`|
-|Options|`contexts`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-// Message: Missing JSDoc @param "foo" description.
-
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @param "foo" description.
-
-/**
- * @function
- * @param foo
- */
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @param "foo" description.
-
-/**
- * @callback
- * @param foo
- */
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @param "foo" description.
-
-/**
- * @arg foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":"arg"}}}
-// Message: Missing JSDoc @arg "foo" description.
-
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":false}}}
-// Message: Unexpected tag `@param`
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- *
- */
-function quux (foo) {
-
-}
-
-/**
- * @param foo Foo.
- */
-function quux (foo) {
-
-}
-
-/**
- * @param foo Foo.
- */
-function quux (foo) {
-
-}
-// Options: [{"contexts":["any"]}]
-
-/**
- * @function
- * @param foo
- */
-
-/**
- * @callback
- * @param foo
- */
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-param-name"></a>
-### <code>require-param-name</code>
-
-Requires that all function parameters have names.
-
-> The `@param` tag requires you to specify the name of the parameter you are documenting. You can also include the parameter's type, enclosed in curly brackets, and a description of the parameter.
->
-> [JSDoc](https://jsdoc.app/tags-param.html#overview)
-
-<a name="eslint-plugin-jsdoc-rules-require-param-name-options-21"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-require-param-name-options-21-contexts-5"></a>
-##### <code>contexts</code>
-
-Set this to an array of strings representing the AST context
-where you wish the rule to be applied.
-Overrides the default contexts (see below). Set to `"any"` if you want
-the rule to apply to any jsdoc block throughout your files (as is necessary
-for finding function blocks not attached to a function declaration or
-expression, i.e., `@callback` or `@function` (or its aliases `@func` or
-`@method`) (including those associated with an `@interface`).
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
-|Tags|`param`|
-|Aliases|`arg`, `argument`|
-|Options|`contexts`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @param
- */
-function quux (foo) {
-
-}
-// Message: There must be an identifier after @param type.
-
-/**
- * @param {string}
- */
-function quux (foo) {
-
-}
-// Message: There must be an identifier after @param tag.
-
-/**
- * @param {string}
- */
-function quux (foo) {
-
-}
-// Options: [{"contexts":["any"]}]
-// Message: There must be an identifier after @param tag.
-
-/**
- * @function
- * @param {string}
- */
-// Options: [{"contexts":["any"]}]
-// Message: There must be an identifier after @param tag.
-
-/**
- * @callback
- * @param {string}
- */
-// Options: [{"contexts":["any"]}]
-// Message: There must be an identifier after @param tag.
-
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":false}}}
-// Message: Unexpected tag `@param`
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-// Options: [{"contexts":["any"]}]
-
-/**
- * @param {string} foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @function
- * @param
- */
-
-/**
- * @callback
- * @param
- */
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-param-type"></a>
-### <code>require-param-type</code>
-
-Requires that each `@param` tag has a `type` value.
-
-<a name="eslint-plugin-jsdoc-rules-require-param-type-options-22"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-require-param-type-options-22-contexts-6"></a>
-##### <code>contexts</code>
-
-Set this to an array of strings representing the AST context
-where you wish the rule to be applied.
-Overrides the default contexts (see below). Set to `"any"` if you want
-the rule to apply to any jsdoc block throughout your files (as is necessary
-for finding function blocks not attached to a function declaration or
-expression, i.e., `@callback` or `@function` (or its aliases `@func` or
-`@method`) (including those associated with an `@interface`).
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
-|Tags|`param`|
-|Aliases|`arg`, `argument`|
-|Options|`contexts`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-// Message: Missing JSDoc @param "foo" type.
-
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @param "foo" type.
-
-/**
- * @function
- * @param foo
- */
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @param "foo" type.
-
-/**
- * @callback
- * @param foo
- */
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @param "foo" type.
-
-/**
- * @arg foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":"arg"}}}
-// Message: Missing JSDoc @arg "foo" type.
-
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":false}}}
-// Message: Unexpected tag `@param`
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- *
- */
-function quux (foo) {
-
-}
-
-/**
- * @param {number} foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @param {number} foo
- */
-function quux (foo) {
-
-}
-// Options: [{"contexts":["any"]}]
-
-/**
- * @function
- * @param foo
- */
-
-/**
- * @callback
- * @param foo
- */
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-param"></a>
-### <code>require-param</code>
-
-Requires that all function parameters are documented.
-
-<a name="eslint-plugin-jsdoc-rules-require-param-options-23"></a>
-#### Options
-
-An options object accepts one optional property:
-
-- `exemptedBy` - Array of tags (e.g., `['type']`) whose presence on the document
-    block avoids the need for a `@param`. Defaults to an empty array.
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`|
-|Tags|`param`|
-|Aliases|`arg`, `argument`|
-|Options|`exemptedBy`|
-|Settings|`overrideReplacesDocs`, `augmentsExtendsReplacesDocs`, `implementsReplacesDocs`|
-
-The following patterns are considered problems:
-
-````js
-/**
- *
- */
-function quux (foo) {
-
-}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- *
- */
-function quux (foo, bar) {
-
-}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- * @param foo
- */
-function quux (foo, bar) {
-
-}
-// Message: Missing JSDoc @param "bar" declaration.
-
-/**
- * @param bar
- */
-function quux (foo, bar, baz) {
-
-}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- * @param foo
- * @param bar
- */
-function quux (foo, bar, baz) {
-
-}
-// Message: Missing JSDoc @param "baz" declaration.
-
-/**
- * @param baz
- */
-function quux (foo, bar, baz) {
-
-}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- * @param
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":"arg"}}}
-// Message: Missing JSDoc @arg "foo" declaration.
-
-/**
- * @param foo
- */
-function quux (foo, bar) {
-
-}
-// Message: Missing JSDoc @param "bar" declaration.
-
-/**
- * @override
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"overrideReplacesDocs":false}}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- * @implements
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"implementsReplacesDocs":false}}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- * @augments
- */
-function quux (foo) {
-
-}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- * @extends
- */
-function quux (foo) {
-
-}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- * @override
- */
-class A {
-  /**
-    *
-    */
-  quux (foo) {
-
-  }
-}
-// Settings: {"jsdoc":{"overrideReplacesDocs":false}}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- * @implements
- */
-class A {
-  /**
-   *
-   */
-  quux (foo) {
-
-  }
-}
-// Settings: {"jsdoc":{"implementsReplacesDocs":false}}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- * @augments
- */
-class A {
-  /**
-   *
-   */
-  quux (foo) {
-
-  }
-}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- * @extends
- */
-class A {
-  /**
-   *
-   */
-  quux (foo) {
-
-  }
-}
-// Message: Missing JSDoc @param "foo" declaration.
-
-export class SomeClass {
-  /**
-   * @param property
-   */
-  constructor(private property: string, private foo: number) {}
-}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- * @param
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":false}}}
-// Message: Unexpected tag `@param`
-
-/**
- *
- */
-function quux ({bar, baz}, foo) {
-}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- *
- */
-function quux (foo, {bar, baz}) {
-}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- *
- */
-function quux ([bar, baz], foo) {
-}
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- *
- */
-function quux (foo) {
-}
-// Options: [{"exemptedBy":["notPresent"]}]
-// Message: Missing JSDoc @param "foo" declaration.
-
-/**
- * Assign the project to a list of employees.
- * @param {object[]} employees - The employees who are responsible for the project.
- * @param {string} employees[].name - The name of an employee.
- * @param {string} employees[].department - The employee's department.
- */
-function assign (employees, name) {
-
-};
-// Message: Missing JSDoc @param "name" declaration.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @param foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @inheritdoc
- */
-function quux (foo) {
-
-}
-
-/**
- * @arg foo
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"param":"arg"}}}
-
-/**
- * @override
- * @param foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @override
- */
-function quux (foo) {
-
-}
-
-/**
- * @override
- */
-class A {
-  /**
-    *
-    */
-  quux (foo) {
-
-  }
-}
-
-/**
- * @override
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"overrideReplacesDocs":true}}
-
-/**
- * @implements
- */
-class A {
-  /**
-   *
-   */
-  quux (foo) {
-
-  }
-}
-
-/**
- * @implements
- */
-function quux (foo) {
-
-}
-
-/**
- * @implements
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"implementsReplacesDocs":true}}
-
-/**
- * @implements
- * @param foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @augments
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"augmentsExtendsReplacesDocs":true}}
-
-/**
- * @augments
- * @param foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @extends
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"augmentsExtendsReplacesDocs":true}}
-
-/**
- * @extends
- * @param foo
- */
-function quux (foo) {
-
-}
-
-/**
- * @augments
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"augmentsExtendsReplacesDocs":true}}
-
-/**
- * @extends
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"augmentsExtendsReplacesDocs":true}}
-
-/**
- * @override
- */
-class A {
-  /**
-  * @param foo
-  */
-  quux (foo) {
-
-  }
-}
-
-/**
- * @override
- */
-class A {
-  /**
-   *
-   */
-  quux (foo) {
-
-  }
-}
-// Settings: {"jsdoc":{"overrideReplacesDocs":true}}
-
-/**
- * @implements
- */
-class A {
-  /**
-   *
-   */
-  quux (foo) {
-
-  }
-}
-// Settings: {"jsdoc":{"implementsReplacesDocs":true}}
-
-/**
- * @implements
- */
-class A {
-  /**
-   * @param foo
-   */
-  quux (foo) {
-
-  }
-}
-
-/**
- * @augments
- */
-class A {
-  /**
-   *
-   */
-  quux (foo) {
-
-  }
-}
-// Settings: {"jsdoc":{"augmentsExtendsReplacesDocs":true}}
-
-/**
- * @augments
- */
-class A {
-  /**
-   * @param foo
-   */
-  quux (foo) {
-
-  }
-}
-
-/**
- * @extends
- */
-class A {
-  /**
-   *
-   */
-  quux (foo) {
-
-  }
-}
-// Settings: {"jsdoc":{"augmentsExtendsReplacesDocs":true}}
-
-/**
- * @extends
- */
-class A {
-  /**
-   * @param foo
-   */
-  quux (foo) {
-
-  }
-}
-
-/**
- * @augments
- */
-class A {
-  /**
-   *
-   */
-  quux (foo) {
-
-  }
-}
-// Settings: {"jsdoc":{"augmentsExtendsReplacesDocs":true}}
-
-/**
- * @extends
- */
-class A {
-  /**
-   *
-   */
-  quux (foo) {
-
-  }
-}
-// Settings: {"jsdoc":{"augmentsExtendsReplacesDocs":true}}
-
-/**
- * @private
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"ignorePrivate":true}}
-
-/**
- * @access private
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"ignorePrivate":true}}
-
-// issue 182: optional chaining
-/** @const {boolean} test */
-const test = something?.find(_ => _)
-
-/** @type {RequestHandler} */
-function foo(req, res, next) {}
-
-/**
- * @type {MyCallback}
- */
-function quux () {
-
-}
-// Options: [{"exemptedBy":["type"]}]
-
-/**
- * @override
- */
-var A = class {
-  /**
-    *
-    */
-  quux (foo) {
-
-  }
-}
-
-export class SomeClass {
-  /**
-   * @param property
-   */
-  constructor(private property: string) {}
-}
-
-/**
- * Assign the project to an employee.
- *
- * @param {object} employee - The employee who is responsible for the project.
- * @param {string} employee.name - The name of the employee.
- * @param {string} employee.department - The employee's department.
- */
-function assign({name, department}) {
-  // ...
-}
-
-export abstract class StephanPlugin<O, D> {
-
-    /**
-     * Called right after Stephan loads the plugin file.
-     *
-     * @example
-     *```typescript
-     * type Options = {
-     *      verbose?: boolean;
-     *      token?: string;
-     * }
-     * ```
-     *
-     * Note that your Options type should only have optional properties...
-     *
-     * @param args Arguments compiled and provided by StephanClient.
-     * @param args.options The options as provided by the user, or an empty object if not provided.
-     * @param defaultOptions The default options as provided by the plugin, or an empty object.
-     */
-    public constructor({options, client}: {
-        options: O;
-        client: unknown;
-    }, defaultOptions: D) {
-
-    }
-}
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-property"></a>
-### <code>require-property</code>
-
-Requires that all `@typedef` and `@namespace` tags have `@property`
-when their type is a plain `object`, `Object`, or `PlainObject`.
-
-Note that if any other type, including a subtype of object such as
-`object<string, string>`, will not be reported.
-
-<a name="eslint-plugin-jsdoc-rules-require-property-fixer-1"></a>
-#### Fixer
-
-The fixer for `require-example` will add an empty `@property`.
-
-|||
-|---|---|
-|Context|Everywhere|
-|Tags|`typedef`, `namespace`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @typedef {object} SomeTypedef
- */
-// Message: Missing JSDoc @property.
-
-/**
- * @typedef {PlainObject} SomeTypedef
- */
-// Settings: {"jsdoc":{"tagNamePreference":{"property":"prop"}}}
-// Message: Missing JSDoc @prop.
-
-/**
- * @namespace {Object} SomeName
- */
-// Message: Missing JSDoc @property.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- *
- */
-
-/**
- * @property
- */
-
-/**
- * @typedef {Object} SomeTypedef
- * @property {SomeType} propName Prop description
- */
-
-/**
- * @typedef {object} SomeTypedef
- * @prop {SomeType} propName Prop description
- */
-// Settings: {"jsdoc":{"tagNamePreference":{"property":"prop"}}}
-
-/**
- * @typedef {object} SomeTypedef
- * @property
- * // arbitrary property content
- */
-
-/**
- * @typedef {object<string, string>} SomeTypedef
- */
-
-/**
- * @typedef {string} SomeTypedef
- */
-
-/**
- * @namespace {object} SomeName
- * @property {SomeType} propName Prop description
- */
-
-/**
- * @namespace {object} SomeName
- * @property
- * // arbitrary property content
- */
-
-/**
- * @typedef {object} SomeTypedef
- * @property someProp
- * @property anotherProp This with a description
- * @property {anotherType} yetAnotherProp This with a type and desc.
- */
-function quux () {
-
-}
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-property-description"></a>
-### <code>require-property-description</code>
-
-Requires that each `@property` tag has a `description` value.
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|N/A|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @typedef {SomeType} SomeTypedef
- * @property foo
- */
-// Message: Missing JSDoc @property "foo" description.
-
-/**
- * @typedef {SomeType} SomeTypedef
- * @prop foo
- */
-// Settings: {"jsdoc":{"tagNamePreference":{"property":"prop"}}}
-// Message: Missing JSDoc @prop "foo" description.
-
-/**
- * @typedef {SomeType} SomeTypedef
- * @property foo
- */
-// Settings: {"jsdoc":{"tagNamePreference":{"property":false}}}
-// Message: Unexpected tag `@property`
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @typedef {SomeType} SomeTypedef
- */
-
-/**
- * @typedef {SomeType} SomeTypedef
- * @property foo Foo.
- */
-
-/**
- * @namespace {SomeType} SomeName
- * @property foo Foo.
- */
-
-/**
- * @class
- * @property foo Foo.
- */
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-property-name"></a>
-### <code>require-property-name</code>
-
-Requires that all function `@property` tags have names.
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|N/A|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @typedef {SomeType} SomeTypedef
- * @property
- */
-// Message: There must be an identifier after @property type.
-
-/**
- * @typedef {SomeType} SomeTypedef
- * @property {string}
- */
-// Message: There must be an identifier after @property tag.
-
-/**
- * @typedef {SomeType} SomeTypedef
- * @property foo
- */
-// Settings: {"jsdoc":{"tagNamePreference":{"property":false}}}
-// Message: Unexpected tag `@property`
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @typedef {SomeType} SomeTypedef
- * @property foo
- */
-
-/**
- * @typedef {SomeType} SomeTypedef
- * @property {string} foo
- */
-
-/**
- * @namespace {SomeType} SomeName
- * @property {string} foo
- */
-
-/**
- * @class
- * @property {string} foo
- */
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-property-type"></a>
-### <code>require-property-type</code>
-
-Requires that each `@property` tag has a `type` value.
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|N/A|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @typedef {SomeType} SomeTypedef
- * @property foo
- */
-// Message: Missing JSDoc @property "foo" type.
-
-/**
- * @typedef {SomeType} SomeTypedef
- * @prop foo
- */
-// Settings: {"jsdoc":{"tagNamePreference":{"property":"prop"}}}
-// Message: Missing JSDoc @prop "foo" type.
-
-/**
- * @typedef {SomeType} SomeTypedef
- * @property foo
- */
-// Settings: {"jsdoc":{"tagNamePreference":{"property":false}}}
-// Message: Unexpected tag `@property`
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @typedef {SomeType} SomeTypedef
- */
-
-/**
- * @typedef {SomeType} SomeTypedef
- * @property {number} foo
- */
-
-/**
- * @namespace {SomeType} SomeName
- * @property {number} foo
- */
-
-/**
- * @class
- * @property {number} foo
- */
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-returns-check"></a>
-### <code>require-returns-check</code>
-
-Requires a return statement in function body if a `@returns` tag is specified in jsdoc comment.
-
-Will also report if multiple `@returns` tags are present.
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`|
-|Tags|`returns`|
-|Aliases|`return`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @returns
- */
-function quux (foo) {
-
-}
-// Message: JSDoc @returns declaration present but return expression not available in function.
-
-/**
- * @return
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"returns":"return"}}}
-// Message: JSDoc @return declaration present but return expression not available in function.
-
-/**
- * @returns
- */
-const quux = () => {}
-// Message: JSDoc @returns declaration present but return expression not available in function.
-
-/**
- * @returns {undefined} Foo.
- * @returns {String} Foo.
- */
-function quux () {
-
-  return foo;
-}
-// Message: Found more than one @returns declaration.
-
-const language = {
-  /**
-   * @param {string} name
-   * @returns {string}
-   */
-  get name() {
-    this._name = name;
-  }
-}
-// Message: JSDoc @returns declaration present but return expression not available in function.
-
-class Foo {
-  /**
-   * @returns {string}
-   */
-  bar () {
-  }
-}
-// Message: JSDoc @returns declaration present but return expression not available in function.
-
-/**
- * @returns
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"returns":false}}}
-// Message: Unexpected tag `@returns`
-
-/**
- * @returns {string}
- */
-function f () {
-  function g() {
-    return 'foo'
-  }
-
-  () => {
-    return 5
-  }
-}
-// Message: JSDoc @returns declaration present but return expression not available in function.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @returns Foo.
- */
-function quux () {
-
-  return foo;
-}
-
-/**
- * @returns {string} Foo.
- */
-function quux () {
-
-  return foo;
-}
-
-/**
- * @returns {string} Foo.
- */
-function quux () {
-
-  return foo;
-}
-
-/**
- *
- */
-function quux () {
-}
-
-/**
- * @returns {*} Foo.
- */
-const quux = () => foo;
-
-/**
- * @returns {undefined} Foo.
- */
-function quux () {}
-
-/**
- * @returns { void } Foo.
- */
-function quux () {}
-
-/**
- * @returns {Promise<void>}
- */
-async function quux() {}
-
-/**
- * @returns {Promise<void>}
- */
-const quux = async function () {}
-
-/**
- * @returns {Promise<void>}
- */
-const quux = async () => {}
-
-/**
- * @returns Foo.
- * @abstract
- */
-function quux () {
-  throw new Error('must be implemented by subclass!');
-}
-
-/**
- * @returns Foo.
- * @virtual
- */
-function quux () {
-  throw new Error('must be implemented by subclass!');
-}
-
-/**
- * @returns Foo.
- * @constructor
- */
-function quux () {
-}
-
-/**
- * @interface
- */
-class Foo {
-  /**
-   * @returns {string}
-   */
-  bar () {
-  }
-}
-
-/**
- * @record
- */
-class Foo {
-  /**
-   * @returns {string}
-   */
-  bar () {
-  }
-}
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-/**
- * @returns {undefined} Foo.
- */
-function quux () {
-}
-
-/**
- * @returns {void} Foo.
- */
-function quux () {
-}
-
-/**
- * @returns {void} Foo.
- */
-function quux () {
-  return undefined;
-}
-
-/**
- * @returns {void} Foo.
- */
-function quux () {
-  return;
-}
-
-/**
- *
- */
-function quux () {
-  return undefined;
-}
-
-/**
- *
- */
-function quux () {
-  return;
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  try {
-    return true;
-  } catch (err) {
-  }
-  return;
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  try {
-  } finally {
-    return true;
-  }
-  return;
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  try {
-    return;
-  } catch (err) {
-  }
-  return true;
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  try {
-    something();
-  } catch (err) {
-    return true;
-  }
-  return;
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  switch (true) {
-  case 'abc':
-    return true;
-  }
-  return;
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  switch (true) {
-  case 'abc':
-    return;
-  }
-  return true;
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  for (const i of abc) {
-    return true;
-  }
-  return;
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  for (const a in b) {
-    return true;
-  }
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  for (let i=0; i<n; i+=1) {
-    return true;
-  }
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  while(true) {
-    return true
-  }
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  do {
-    return true
-  }
-  while(true)
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  if (true) {
-    return;
-  }
-  return true;
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  if (true) {
-    return true;
-  }
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  var a = {};
-  with (a) {
-    return true;
-  }
-}
-
-/**
- * @returns {true}
- */
-function quux () {
-  if (true) {
-    return;
-  } else {
-    return true;
-  }
-  return;
-}
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-returns-description"></a>
-### <code>require-returns-description</code>
-
-Requires that the `@returns` tag has a `description` value. The error
-will not be reported if the return value is `void` or `undefined`.
-
-<a name="eslint-plugin-jsdoc-rules-require-returns-description-options-24"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-require-returns-description-options-24-contexts-7"></a>
-##### <code>contexts</code>
-
-Set this to an array of strings representing the AST context
-where you wish the rule to be applied.
-Overrides the default contexts (see below). Set to `"any"` if you want
-the rule to apply to any jsdoc block throughout your files (as is necessary
-for finding function blocks not attached to a function declaration or
-expression, i.e., `@callback` or `@function` (or its aliases `@func` or
-`@method`) (including those associated with an `@interface`).
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
-|Tags|`returns`|
-|Aliases|`return`|
-|Options|`contexts`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @returns
- */
-function quux (foo) {
-
-}
-// Message: Missing JSDoc @returns description.
-
-/**
- * @returns {string}
- */
-function quux (foo) {
-
-}
-// Message: Missing JSDoc @returns description.
-
-/**
- * @returns {string}
- */
-function quux (foo) {
-
-}
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @returns description.
-
-/**
- * @function
- * @returns {string}
- */
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @returns description.
-
-/**
- * @callback
- * @returns {string}
- */
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @returns description.
-
-/**
- * @return
- */
-function quux (foo) {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"returns":"return"}}}
-// Message: Missing JSDoc @return description.
-
-/**
- * @returns
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"returns":false}}}
-// Message: Unexpected tag `@returns`
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- *
- */
-function quux () {
-
-}
-
-/**
- * @returns Foo.
- */
-function quux () {
-
-}
-
-/**
- * @returns Foo.
- */
-function quux () {
-
-}
-// Options: [{"contexts":["any"]}]
-
-/**
- * @returns {undefined}
- */
-function quux () {
-
-}
-
-/**
- * @returns {void}
- */
-function quux () {
-
-}
-
-/**
- * @function
- * @returns
- */
-
-/**
- * @callback
- * @returns
- */
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-returns-type"></a>
-### <code>require-returns-type</code>
-
-Requires that `@returns` tag has `type` value.
-
-<a name="eslint-plugin-jsdoc-rules-require-returns-type-options-25"></a>
-#### Options
-
-<a name="eslint-plugin-jsdoc-rules-require-returns-type-options-25-contexts-8"></a>
-##### <code>contexts</code>
-
-Set this to an array of strings representing the AST context
-where you wish the rule to be applied.
-Overrides the default contexts (see below). Set to `"any"` if you want
-the rule to apply to any jsdoc block throughout your files (as is necessary
-for finding function blocks not attached to a function declaration or
-expression, i.e., `@callback` or `@function` (or its aliases `@func` or
-`@method`) (including those associated with an `@interface`).
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
-|Tags|`returns`|
-|Aliases|`return`|
-|Options|`contexts`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @returns
- */
-function quux () {
-
-}
-// Message: Missing JSDoc @returns type.
-
-/**
- * @returns Foo.
- */
-function quux () {
-
-}
-// Message: Missing JSDoc @returns type.
-
-/**
- * @returns Foo.
- */
-function quux () {
-
-}
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @returns type.
-
-/**
- * @function
- * @returns Foo.
- */
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @returns type.
-
-/**
- * @callback
- * @returns Foo.
- */
-// Options: [{"contexts":["any"]}]
-// Message: Missing JSDoc @returns type.
-
-/**
- * @return Foo.
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"returns":"return"}}}
-// Message: Missing JSDoc @return type.
-
-/**
- * @returns
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"returns":false}}}
-// Message: Unexpected tag `@returns`
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @returns {number}
- */
-function quux () {
-
-}
-
-/**
- * @returns {number}
- */
-function quux () {
-
-}
-// Options: [{"contexts":["any"]}]
-
-/**
- * @function
- * @returns Foo.
- */
-
-/**
- * @callback
- * @returns Foo.
- */
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-require-returns"></a>
-### <code>require-returns</code>
-
-Requires returns are documented.
-
-Will also report if multiple `@returns` tags are present.
-
-<a name="eslint-plugin-jsdoc-rules-require-returns-options-26"></a>
-#### Options
-
-- `exemptedBy` - Array of tags (e.g., `['type']`) whose presence on the document
-    block avoids the need for a `@returns`. Defaults to an empty array.
-- `forceRequireReturn` - Set to `true` to always insist on
-  `@returns` documentation regardless of implicit or explicit `return`'s
-  in the function. May be desired to flag that a project is aware of an
-  `undefined`/`void` return. Defaults to `false`.
-- `forceReturnsWithAsync` - By default `async` functions that do not explicitly
-  return a value pass this rule as an `async` function will always return a
-  `Promise`, even if the `Promise` resolves to void. You can force all `async`
-  functions to require return statements by setting `forceReturnsWithAsync`
-  to `true` on the options object. This may be useful for flagging that there
-  has been consideration of return type. Defaults to `false`.
-- `contexts` - Set this to an array of strings representing the AST context
-  where you wish the rule to be applied.
-  Overrides the default contexts (see below). Set to `"any"` if you want
-  the rule to apply to any jsdoc block throughout your files (as is necessary
-  for finding function blocks not attached to a function declaration or
-  expression, i.e., `@callback` or `@function` (or its aliases `@func` or
-  `@method`) (including those associated with an `@interface`). This
-  rule will only apply on non-default contexts when there is such a tag
-  present and the `forceRequireReturn` option is set or if the
-  `forceReturnsWithAsync` option is set with a present `@async` tag
-  (since we are not checking against the actual `return` values in these
-  cases).
-
-```js
-'jsdoc/require-returns': ['error', {forceReturnsWithAsync: true}]
-```
-
-|||
-|---|---|
-|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
-|Tags|`returns`|
-|Aliases|`return`|
-|Options|`contexts`, `exemptedBy`, `forceRequireReturn`, `forceReturnsWithAsync`|
-|Settings|`overrideReplacesDocs`, `augmentsExtendsReplacesDocs`, `implementsReplacesDocs`|
-
-The following patterns are considered problems:
-
-````js
-/**
- *
- */
-function quux (foo) {
-
-  return foo;
-}
-// Message: Missing JSDoc @returns declaration.
-
-/**
- *
- */
-const foo = () => ({
-  bar: 'baz'
-})
-// Message: Missing JSDoc @returns declaration.
-
-/**
- *
- */
-const foo = bar=>({ bar })
-// Message: Missing JSDoc @returns declaration.
-
-/**
- *
- */
-const foo = bar => bar.baz()
-// Message: Missing JSDoc @returns declaration.
-
-/**
- *
- */
-function quux (foo) {
-
-  return foo;
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"returns":"return"}}}
-// Message: Missing JSDoc @return declaration.
-
-/**
- *
- */
-function foo() {}
-
-/**
- *
- */
-function bar() {}
-// Settings: {"jsdoc":{"forceRequireReturn":true}}
-// Message: `settings.jsdoc.forceRequireReturn` has been removed, use options in the rule `require-returns` instead.
-
-/**
- *
- */
-async function quux() {
-}
-// Options: [{"forceRequireReturn":true}]
-// Message: Missing JSDoc @returns declaration.
-
-/**
- *
- */
-const quux = async function () {}
-// Options: [{"forceRequireReturn":true}]
-// Message: Missing JSDoc @returns declaration.
-
-/**
- *
- */
-const quux = async () => {}
-// Options: [{"forceRequireReturn":true}]
-// Message: Missing JSDoc @returns declaration.
-
-/**
- *
- */
-async function quux () {}
-// Options: [{"forceRequireReturn":true}]
-// Message: Missing JSDoc @returns declaration.
-
-/**
- *
- */
-function quux () {
-}
-// Options: [{"forceRequireReturn":true}]
-// Message: Missing JSDoc @returns declaration.
-
-/**
- *
- */
-function quux () {
-}
-// Options: [{"contexts":["any"],"forceRequireReturn":true}]
-// Message: Missing JSDoc @returns declaration.
-
-/**
- * @function
- */
-// Options: [{"contexts":["any"],"forceRequireReturn":true}]
-// Message: Missing JSDoc @returns declaration.
-
-/**
- * @callback
- */
-// Options: [{"contexts":["any"],"forceRequireReturn":true}]
-// Message: Missing JSDoc @returns declaration.
-
-const language = {
-  /**
-   * @param {string} name
-   */
-  get name() {
-    return this._name;
-  }
-}
-// Message: Missing JSDoc @returns declaration.
-
-/**
- *
- */
-async function quux () {
-}
-// Options: [{"forceReturnsWithAsync":true}]
-// Message: Missing JSDoc @returns declaration.
-
-/**
- * @function
- * @async
- */
-// Options: [{"contexts":["any"],"forceReturnsWithAsync":true}]
-// Message: Missing JSDoc @returns declaration.
-
-/**
- * @callback
- * @async
- */
-// Options: [{"contexts":["any"],"forceReturnsWithAsync":true}]
-// Message: Missing JSDoc @returns declaration.
-
-/**
- * @returns {undefined}
- * @returns {void}
- */
-function quux (foo) {
-
-  return foo;
-}
-// Message: Found more than one @returns declaration.
-
-/**
- * @returns
- */
-function quux () {
-
-}
-// Settings: {"jsdoc":{"tagNamePreference":{"returns":false}}}
-// Message: Unexpected tag `@returns`
-
-/**
- * @param foo
- */
-function quux (foo) {
-  return 'bar';
-}
-// Options: [{"exemptedBy":["notPresent"]}]
-// Message: Missing JSDoc @returns declaration.
-
-/**
- * @param {array} a
- */
-async function foo(a) {
-  return;
-}
-// Options: [{"forceReturnsWithAsync":true}]
-// Message: Missing JSDoc @returns declaration.
-
-/**
- * @param {array} a
- */
-async function foo(a) {
-  return Promise.all(a);
-}
-// Options: [{"forceReturnsWithAsync":true}]
-// Message: Missing JSDoc @returns declaration.
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @returns Foo.
- */
-function quux () {
-
-  return foo;
-}
-
-/**
- * @returns Foo.
- */
-function quux () {
-
-  return foo;
-}
-// Options: [{"contexts":["any"]}]
-
-/**
- *
- */
-function quux () {
-}
-
-/**
- *
- */
-function quux (bar) {
-  bar.filter(baz => {
-    return baz.corge();
-  })
-}
-
-/**
- * @returns Array
- */
-function quux (bar) {
-  return bar.filter(baz => {
-    return baz.corge();
-  })
-}
-
-/**
- * @returns Array
- */
-const quux = (bar) => bar.filter(({ corge }) => corge())
-
-/**
- * @inheritdoc
- */
-function quux (foo) {
-}
-
-/**
- * @override
- */
-function quux (foo) {
-}
-
-/**
- * @constructor
- */
-function quux (foo) {
-}
-
-/**
- * @implements
- */
-function quux (foo) {
-}
-
-/**
- * @override
- */
-function quux (foo) {
-
-  return foo;
-}
-
-/**
- * @class
- */
-function quux (foo) {
-
-}
-
-/**
- * @constructor
- */
-function quux (foo) {
-
-}
-
-/**
- * @returns {object}
- */
-function quux () {
-
-  return {a: foo};
-}
-
-/**
- * @returns {object}
- */
-const quux = () => ({a: foo});
-
-/**
- * @returns {object}
- */
-const quux = () => {
-  return {a: foo}
-};
-
-/**
- * @returns {void}
- */
-function quux () {
-}
-
-/**
- * @returns {void}
- */
-const quux = () => {
-
-}
-
-/**
- * @returns {undefined}
- */
-function quux () {
-}
-
-/**
- * @returns {undefined}
- */
-const quux = () => {
-
-}
-
-/**
- *
- */
-function quux () {
-}
-
-/**
- *
- */
-const quux = () => {
-
-}
-
-class Foo {
-  /**
-   *
-   */
-  constructor () {
-  }
-}
-// Options: [{"forceRequireReturn":true}]
-
-const language = {
-  /**
-   * @param {string} name
-   */
-  set name(name) {
-    this._name = name;
-  }
-}
-
-/**
- * @returns {void}
- */
-function quux () {
-}
-// Options: [{"forceRequireReturn":true}]
-
-/**
- * @returns {void}
- */
-function quux () {
-  return undefined;
-}
-
-/**
- * @returns {void}
- */
-function quux () {
-  return undefined;
-}
-// Options: [{"forceRequireReturn":true}]
-
-/**
- * @returns {void}
- */
-function quux () {
-  return;
-}
-
-/**
- * @returns {void}
- */
-function quux () {
-}
-// Options: [{"forceRequireReturn":true}]
-
-/**
- * @returns {void}
- */
-function quux () {
-  return;
-}
-// Options: [{"forceRequireReturn":true}]
-
-/** @type {RequestHandler} */
-function quux (req, res , next) {
-  return;
-}
-
-/**
- * @returns {Promise}
- */
-async function quux () {
-}
-// Options: [{"forceRequireReturn":true}]
-
-/**
- * @returns {Promise}
- */
-async function quux () {
-}
-// Options: [{"forceReturnsWithAsync":true}]
-
-/**
- *
- */
-async function quux () {}
-
-/**
- *
- */
-const quux = async function () {}
-
-/**
- *
- */
-const quux = async () => {}
-
-/** foo class */
-class foo {
-  /** foo constructor */
-  constructor () {
-    // =>
-    this.bar = true;
-  }
-}
-
-export default foo;
-
-/**
- *
- */
-function quux () {
-}
-// Options: [{"forceReturnsWithAsync":true}]
-
-/**
- * @type {MyCallback}
- */
-function quux () {
-
-}
-// Options: [{"exemptedBy":["type"]}]
-
-/**
- * @param {array} a
- */
-async function foo(a) {
-  return Promise.all(a);
-}
-
-/**
- * @param {array} a
- */
-async function foo(a) {
-  return;
-}
-
-/**
- *
- */
-// Options: [{"contexts":["any"]}]
-
-/**
- * @async
- */
-// Options: [{"contexts":["any"]}]
-
-/**
- * @function
- */
-// Options: [{"forceRequireReturn":true}]
-
-/**
- * @callback
- */
-// Options: [{"forceRequireReturn":true}]
-
-/**
- * @function
- * @async
- */
-// Options: [{"forceReturnsWithAsync":true}]
-
-/**
- * @callback
- * @async
- */
-// Options: [{"forceReturnsWithAsync":true}]
-
-/**
- * @function
- */
-// Options: [{"contexts":["any"],"forceReturnsWithAsync":true}]
-
-/**
- * @callback
- */
-// Options: [{"contexts":["any"],"forceReturnsWithAsync":true}]
-````
-
-
-<a name="eslint-plugin-jsdoc-rules-valid-types"></a>
-### <code>valid-types</code>
-
-Requires all types to be valid JSDoc or Closure compiler types without syntax errors.
-
-Also impacts behaviors on namepath (or event)-defining and pointing tags:
-
-1. Name(path)-defining tags requiring namepath: `@external`, `@host`, `@name`, `@typedef`
-1. Name(path)-defining tags (which may have value without namepath or their
-    namepath can be expressed elsewhere on the block): `@event`, `@callback`,
-    `@class`, `@constructor`, `@constant`, `@const`,
-    `@function`, `@func`, `@method`, `@interface`, `@member`, `@var`,
-    `@mixin`, `@namespace`
-1. Name(path)-pointing tags requiring namepath: `@alias`, `@augments`, `@extends`, `@lends`, `@memberof`, `@memberof!`, `@mixes`, `@this`
-1. Name(path)-pointing tags (which may have value without namepath or their
-    namepath can be expressed elsewhere on the block): `@listens`, `@fires`,
-    `@emits`, and `@modifies`
-1. Name(path)-pointing tags (multiple names in one): `@borrows`
-
-...with the following applying to the above sets:
-
-- Expect tags in set 1-4 to have a valid namepath if present
-- Prevent sets 2 and 4 from being empty by setting `allowEmptyNamepaths` to
-  `false` as these tags might have some indicative value without a path
-  or may allow a name expressed elsewhere on the block (but sets 1 and 3 will
-  always fail if empty)
-- For the special case of set 5, i.e., `@borrows <that namepath> as <this namepath>`,
-  check that both namepaths are present and valid and ensure there is an `as `
-  between them. In the case of `<this namepath>`, it can be preceded by
-  one of the name path operators, `#`, `.`, or `~`.
-- For the special case of `@memberof` and `@memberof!` (part of set 3), as
-   per the [specification](https://jsdoc.app/tags-memberof.html), they also
-   allow `#`, `.`, or `~` at the end (which is not allowed at the end of
-   normal paths).
-
-<a name="eslint-plugin-jsdoc-rules-valid-types-options-27"></a>
-#### Options
-
-- `allowEmptyNamepaths` (default: true) - Set to `false` to disallow
-  empty name paths with `@callback`, `@event`, `@class`, `@constructor`,
-  `@constant`, `@const`, `@function`, `@func`, `@method`, `@interface`,
-  `@member`, `@var`, `@mixin`, `@namespace`, `@listens`, `@fires`,
-  `@modifies`, or `@emits` (these might often be expected to have an
-  accompanying name path, though they have some indicative value without
-  one; these may also allow names to be defined in another manner elsewhere
-  in the block)
-- `checkSeesForNamepaths` (default: false) - Set this to `true` to insist
-  that `@see` only use name paths (the tag is normally permitted to
-  allow other text)
-
-
-|||
-|---|---|
-|Context|everywhere|
-|Tags|For name only unless otherwise stated: `alias`, `augments`, `borrows`, `callback`, `class` (for name and type), `constant` (for name and type), `enum` (for type), `event`, `external`, `fires`, `function`, `implements` (for type), `interface`, `lends`, `listens`, `member` (for name and type),  `memberof`, `memberof!`, `mixes`, `mixin`, `modifies`, `module` (for name and type), `name`, `namespace` (for name and type), `param` (for name and type), `property` (for name and type), `returns` (for type), `this`, `throws` (for type), `type` (for type), `typedef` (for name and type), `yields` (for type)|
-|Aliases|`extends`, `constructor`, `const`, `host`, `emits`, `func`, `method`, `var`, `arg`, `argument`, `prop`, `return`, `exception`, `yield`|
-|Closure-only|For type only: `package`, `private`, `protected`, `public`, `static`|
-|Options|`allowEmptyNamepaths`, `checkSeesForNamepaths`|
-|Settings|`mode`|
-
-The following patterns are considered problems:
-
-````js
-/**
- * @param {Array<string} foo
- */
-function quux() {
-
-}
-// Message: Syntax error in type: Array<string
-
-/**
- * @memberof module:namespace.SomeClass<~
- */
-function quux() {
-
-}
-// Message: Syntax error in namepath: module:namespace.SomeClass<~
-
-/**
- * @memberof module:namespace.SomeClass~<
- */
-function quux() {
-
-}
-// Message: Syntax error in namepath: module:namespace.SomeClass~<
-
-/**
- * @borrows foo% as bar
- */
-function quux() {
-
-}
-// Message: Syntax error in namepath: foo%
-
-/**
- * @borrows #foo as bar
- */
-function quux() {
-
-}
-// Message: Syntax error in namepath: #foo
-
-/**
- * @borrows foo as bar%
- */
-function quux() {
-
-}
-// Message: Syntax error in namepath: bar%
-
-/**
- * @borrows foo
- */
-function quux() {
-
-}
-// Message: @borrows must have an "as" expression. Found ""
-
-/**
- * @see foo%
- */
-function quux() {
-
-}
-// Options: [{"checkSeesForNamepaths":true}]
-// Message: Syntax error in namepath: foo%
-
-/** */
-function foo() {}
-// Settings: {"jsdoc":{"allowEmptyNamepaths":true,"checkSeesForNamepaths":true}}
-// Message: `settings.jsdoc.allowEmptyNamepaths` has been removed, use options in the rule `valid-types` instead.
-
-/**
- * @alias module:abc#event:foo-bar
- */
-function quux() {
-
-}
-// Message: Syntax error in namepath: module:abc#event:foo-bar
-
-/**
- * @mixes module:namespace.SomeClass~
- */
-function quux() {
-
-}
-// Message: Syntax error in namepath: module:namespace.SomeClass~
-
-/**
- * @callback
- */
-function quux() {
-
-}
-// Options: [{"allowEmptyNamepaths":false}]
-// Message: Tag @callback must have a name/namepath
-
-/**
- * @constant {str%ng}
- */
- const FOO = 'foo';
-// Message: Syntax error in type: str%ng
-
-/**
- * @typedef {str%ng} UserString
- */
-// Message: Syntax error in type: str%ng
-
-/**
- * @typedef {string} UserStr%ng
- */
-// Message: Syntax error in namepath: UserStr%ng
-
-/**
- * @extends
- */
- class Bar {};
-// Message: Tag @extends must have either a type or namepath
-
-/**
- * @type
- */
- let foo;
-// Message: Tag @type must have a type
-
-/**
- * @modifies {bar|foo<}
- */
-function quux (foo, bar, baz) {}
-// Message: Syntax error in type: bar|foo<
-
-/**
- * @private {BadTypeChecked<}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-// Message: Syntax error in type: BadTypeChecked<
-
-/**
- * @this {BadTypeChecked<}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-// Message: Syntax error in type: BadTypeChecked<
-
-/**
- * @define
- */
- function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-// Message: Tag @define must have a type
-
-/**
- * @this
- */
- let foo;
-// Settings: {"jsdoc":{"mode":"closure"}}
-// Message: Tag @this must have a type
-````
-
-The following patterns are not considered problems:
-
-````js
-/**
- * @param {Array<string>} foo
- */
-function quux() {
-
-}
-
-/**
- * @param {string} foo
- */
-function quux() {
-
-}
-
-/**
- * @param foo
- */
-function quux() {
-
-}
-
-/**
- * @borrows foo as bar
- */
-function quux() {
-
-}
-
-/**
- * @borrows foo as #bar
- */
-function quux() {
-
-}
-
-/**
- * @see foo%
- */
-function quux() {
-
-}
-
-/**
- * @alias module:namespace.SomeClass#event:ext_anevent
- */
-function quux() {
-
-}
-
-/**
- * @callback foo
- */
-function quux() {
-
-}
-
-/**
- * @callback
- */
-function quux() {
-
-}
-// Options: [{"allowEmptyNamepaths":true}]
-
-/**
- * @class
- */
-function quux() {
-
-}
-
-/**
- * @see {@link foo}
- */
-function quux() {
-
-}
-// Options: [{"checkSeesForNamepaths":true}]
-
-/**
- *
- * @fires {module:namespace.SomeClass#event:ext_anevent}
- */
-function quux() {
-
-}
-
-/**
- * @memberof module:namespace.SomeClass~
- */
-function quux() {
-
-}
-
-/**
- * @memberof! module:namespace.SomeClass.
- */
-function quux() {
-
-}
-
-/**
- *
- */
-function quux() {
-
-}
-
-/**
- * @constant {string}
- */
- const FOO = 'foo';
-
-/**
- * @constant {string} FOO
- */
- const FOO = 'foo';
-
-/**
- * @extends Foo
- */
- class Bar {};
-
-/**
- * @extends {Foo<String>}
- */
- class Bar {};
-
-/**
- * @typedef {number|string} UserDefinedType
- */
-
-/**
- * @typedef {number|string}
- */
-let UserDefinedGCCType;
-
-/**
- * @modifies {foo|bar}
- */
-function quux (foo, bar, baz) {}
-
-/**
- * @private {BadTypeNotCheckedInJsdoc<}
- */
-function quux () {}
-
-/**
- * @this {Navigator}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-/**
- * @export {SomeType}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-/**
- * @define {boolean}
- */
-function quux () {}
-// Settings: {"jsdoc":{"mode":"closure"}}
-
-/**
- * @define
- */
- function quux () {}
-````
-
-
diff --git a/node_modules/eslint-plugin-jsdoc/dist/WarnSettings.js b/node_modules/eslint-plugin-jsdoc/dist/WarnSettings.js
deleted file mode 100644
index 16c667e..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/WarnSettings.js
+++ /dev/null
@@ -1,36 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-const WarnSettings = function WarnSettings() {
-  /** @type {WeakMap<object, Set<string>>} */
-  const warnedSettings = new WeakMap();
-  return {
-    /**
-     * Warn only once for each context and setting
-     *
-     * @param {object} context
-     * @param {string} setting
-     */
-    hasBeenWarned(context, setting) {
-      return warnedSettings.has(context) && warnedSettings.get(context).has(setting);
-    },
-
-    markSettingAsWarned(context, setting) {
-      if (!warnedSettings.has(context)) {
-        warnedSettings.set(context, new Set());
-      }
-
-      warnedSettings.get(context).add(setting);
-    }
-
-  };
-};
-
-var _default = WarnSettings;
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=WarnSettings.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/WarnSettings.js.map b/node_modules/eslint-plugin-jsdoc/dist/WarnSettings.js.map
deleted file mode 100644
index 4878417..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/WarnSettings.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/WarnSettings.js"],"names":["WarnSettings","warnedSettings","WeakMap","hasBeenWarned","context","setting","has","get","markSettingAsWarned","set","Set","add"],"mappings":";;;;;;;AAAA,MAAMA,YAAY,GAAG,SAAfA,YAAe,GAAY;AAC/B;AACA,QAAMC,cAAc,GAAG,IAAIC,OAAJ,EAAvB;AAEA,SAAO;AACL;;;;;;AAMAC,IAAAA,aAAa,CAAEC,OAAF,EAAWC,OAAX,EAAoB;AAC/B,aAAOJ,cAAc,CAACK,GAAf,CAAmBF,OAAnB,KAA+BH,cAAc,CAACM,GAAf,CAAmBH,OAAnB,EAA4BE,GAA5B,CAAgCD,OAAhC,CAAtC;AACD,KATI;;AAWLG,IAAAA,mBAAmB,CAAEJ,OAAF,EAAWC,OAAX,EAAoB;AACrC,UAAI,CAACJ,cAAc,CAACK,GAAf,CAAmBF,OAAnB,CAAL,EAAkC;AAChCH,QAAAA,cAAc,CAACQ,GAAf,CAAmBL,OAAnB,EAA4B,IAAIM,GAAJ,EAA5B;AACD;;AAEDT,MAAAA,cAAc,CAACM,GAAf,CAAmBH,OAAnB,EAA4BO,GAA5B,CAAgCN,OAAhC;AACD;;AAjBI,GAAP;AAmBD,CAvBD;;eAyBeL,Y","sourcesContent":["const WarnSettings = function () {\n  /** @type {WeakMap<object, Set<string>>} */\n  const warnedSettings = new WeakMap();\n\n  return {\n    /**\n     * Warn only once for each context and setting\n     *\n     * @param {object} context\n     * @param {string} setting\n     */\n    hasBeenWarned (context, setting) {\n      return warnedSettings.has(context) && warnedSettings.get(context).has(setting);\n    },\n\n    markSettingAsWarned (context, setting) {\n      if (!warnedSettings.has(context)) {\n        warnedSettings.set(context, new Set());\n      }\n\n      warnedSettings.get(context).add(setting);\n    },\n  };\n};\n\nexport default WarnSettings;\n"],"file":"WarnSettings.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/eslint/LICENSE-MIT.txt b/node_modules/eslint-plugin-jsdoc/dist/eslint/LICENSE-MIT.txt
deleted file mode 100644
index 7fe552a..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/eslint/LICENSE-MIT.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright JS Foundation and other contributors, https://js.foundation
-
-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/node_modules/eslint-plugin-jsdoc/dist/eslint/getJSDocComment.js b/node_modules/eslint-plugin-jsdoc/dist/eslint/getJSDocComment.js
deleted file mode 100644
index e091927..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/eslint/getJSDocComment.js
+++ /dev/null
@@ -1,166 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = exports.getReducedASTNode = void 0;
-
-/**
- * Obtained originally from {@link https://github.com/eslint/eslint/blob/master/lib/util/source-code.js#L313}
- *
- * @license MIT
- */
-
-/**
- * Checks if the given token is a comment token or not.
- *
- * @param {Token} token - The token to check.
- * @returns {boolean} `true` if the token is a comment token.
- */
-const isCommentToken = token => {
-  return token.type === 'Line' || token.type === 'Block' || token.type === 'Shebang';
-};
-
-const getDecorator = (token, sourceCode) => {
-  if (token && token.type === 'Identifier') {
-    const tokenBefore = sourceCode.getTokenBefore(token, {
-      includeComments: true
-    });
-
-    if (tokenBefore && tokenBefore.type === 'Punctuator' && tokenBefore.value === '@') {
-      return tokenBefore;
-    }
-  }
-
-  return false;
-};
-/**
- * Check to see if its a ES6 export declaration.
- *
- * @param {ASTNode} astNode An AST node.
- * @returns {boolean} whether the given node represents an export declaration.
- * @private
- */
-
-
-const looksLikeExport = function looksLikeExport(astNode) {
-  return astNode.type === 'ExportDefaultDeclaration' || astNode.type === 'ExportNamedDeclaration' || astNode.type === 'ExportAllDeclaration' || astNode.type === 'ExportSpecifier';
-};
-/**
- * Reduces the provided node to the appropriate node for evaluating JSDoc comment status.
- *
- * @param {ASTNode} node An AST node.
- * @param {SourceCode} sourceCode The ESLint SourceCode.
- * @returns {ASTNode} The AST node that can be evaluated for appropriate JSDoc comments.
- * @private
- */
-
-
-const getReducedASTNode = function getReducedASTNode(node, sourceCode) {
-  let parent = node.parent;
-
-  switch (node.type) {
-    case 'TSInterfaceDeclaration':
-    case 'TSTypeAliasDeclaration':
-    case 'TSEnumDeclaration':
-    case 'ClassDeclaration':
-    case 'FunctionDeclaration':
-      return looksLikeExport(parent) ? parent : node;
-
-    case 'ClassExpression':
-    case 'ObjectExpression':
-    case 'ArrowFunctionExpression':
-    case 'FunctionExpression':
-      if (!['CallExpression', 'OptionalCallExpression', 'NewExpression'].includes(parent.type)) {
-        while (!sourceCode.getCommentsBefore(parent).length && !/Function/u.test(parent.type) && parent.type !== 'MethodDefinition' && parent.type !== 'Property') {
-          parent = parent.parent;
-
-          if (!parent) {
-            break;
-          }
-        }
-
-        if (parent && parent.type !== 'FunctionDeclaration' && parent.type !== 'Program') {
-          return parent;
-        }
-      }
-
-      return node;
-
-    default:
-      return node;
-  }
-};
-/**
- * Retrieves the JSDoc comment for a given node.
- *
- * @param {SourceCode} sourceCode The ESLint SourceCode
- * @param {ASTNode} node The AST node to get the comment for.
- * @param {object} settings The settings in context
- * @returns {Token|null} The Block comment token containing the JSDoc comment
- *    for the given node or null if not found.
- * @public
- * @deprecated
- */
-
-
-exports.getReducedASTNode = getReducedASTNode;
-
-const getJSDocComment = function getJSDocComment(sourceCode, node, settings) {
-  /**
-   * Checks for the presence of a JSDoc comment for the given node and returns it.
-   *
-   * @param {ASTNode} astNode The AST node to get the comment for.
-   * @returns {Token|null} The Block comment token containing the JSDoc comment
-   *    for the given node or null if not found.
-   * @private
-   */
-  const findJSDocComment = astNode => {
-    const minLines = settings.minLines,
-          maxLines = settings.maxLines;
-    let currentNode = astNode;
-    let tokenBefore = null;
-
-    while (currentNode) {
-      tokenBefore = sourceCode.getTokenBefore(currentNode, {
-        includeComments: true
-      });
-      const decorator = getDecorator(tokenBefore, sourceCode);
-
-      if (decorator) {
-        currentNode = decorator;
-        continue;
-      }
-
-      if (!tokenBefore || !isCommentToken(tokenBefore)) {
-        return null;
-      }
-
-      if (tokenBefore.type === 'Line') {
-        currentNode = tokenBefore;
-        continue;
-      }
-
-      break;
-    }
-
-    if (tokenBefore.type === 'Block' && tokenBefore.value.charAt(0) === '*' && currentNode.loc.start.line - tokenBefore.loc.end.line >= minLines && currentNode.loc.start.line - tokenBefore.loc.end.line <= maxLines) {
-      return tokenBefore;
-    }
-
-    return null;
-  };
-
-  const reducedNode = getReducedASTNode(node, sourceCode);
-  /* istanbul ignore next */
-
-  if (!reducedNode) {
-    return null;
-  }
-
-  return findJSDocComment(reducedNode);
-};
-
-var _default = getJSDocComment;
-exports.default = _default;
-//# sourceMappingURL=getJSDocComment.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/eslint/getJSDocComment.js.map b/node_modules/eslint-plugin-jsdoc/dist/eslint/getJSDocComment.js.map
deleted file mode 100644
index b80b960..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/eslint/getJSDocComment.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/eslint/getJSDocComment.js"],"names":["isCommentToken","token","type","getDecorator","sourceCode","tokenBefore","getTokenBefore","includeComments","value","looksLikeExport","astNode","getReducedASTNode","node","parent","includes","getCommentsBefore","length","test","getJSDocComment","settings","findJSDocComment","minLines","maxLines","currentNode","decorator","charAt","loc","start","line","end","reducedNode"],"mappings":"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","sourcesContent":["/**\n * Obtained originally from {@link https://github.com/eslint/eslint/blob/master/lib/util/source-code.js#L313}\n *\n * @license MIT\n */\n\n/**\n * Checks if the given token is a comment token or not.\n *\n * @param {Token} token - The token to check.\n * @returns {boolean} `true` if the token is a comment token.\n */\nconst isCommentToken = (token) => {\n  return token.type === 'Line' || token.type === 'Block' || token.type === 'Shebang';\n};\n\nconst getDecorator = (token, sourceCode) => {\n  if (token && token.type === 'Identifier') {\n    const tokenBefore = sourceCode.getTokenBefore(token, {includeComments: true});\n    if (tokenBefore && tokenBefore.type === 'Punctuator' && tokenBefore.value === '@') {\n      return tokenBefore;\n    }\n  }\n\n  return false;\n};\n\n/**\n * Check to see if its a ES6 export declaration.\n *\n * @param {ASTNode} astNode An AST node.\n * @returns {boolean} whether the given node represents an export declaration.\n * @private\n */\nconst looksLikeExport = function (astNode) {\n  return astNode.type === 'ExportDefaultDeclaration' || astNode.type === 'ExportNamedDeclaration' ||\n    astNode.type === 'ExportAllDeclaration' || astNode.type === 'ExportSpecifier';\n};\n\n/**\n * Reduces the provided node to the appropriate node for evaluating JSDoc comment status.\n *\n * @param {ASTNode} node An AST node.\n * @param {SourceCode} sourceCode The ESLint SourceCode.\n * @returns {ASTNode} The AST node that can be evaluated for appropriate JSDoc comments.\n * @private\n */\nconst getReducedASTNode = function (node, sourceCode) {\n  let {parent} = node;\n\n  switch (node.type) {\n  case 'TSInterfaceDeclaration':\n  case 'TSTypeAliasDeclaration':\n  case 'TSEnumDeclaration':\n  case 'ClassDeclaration':\n  case 'FunctionDeclaration':\n    return looksLikeExport(parent) ? parent : node;\n\n  case 'ClassExpression':\n  case 'ObjectExpression':\n  case 'ArrowFunctionExpression':\n  case 'FunctionExpression':\n    if (\n      !['CallExpression', 'OptionalCallExpression', 'NewExpression'].includes(parent.type)\n    ) {\n      while (\n        !sourceCode.getCommentsBefore(parent).length &&\n        !/Function/u.test(parent.type) &&\n        parent.type !== 'MethodDefinition' &&\n        parent.type !== 'Property'\n      ) {\n        parent = parent.parent;\n\n        if (!parent) {\n          break;\n        }\n      }\n\n      if (parent && parent.type !== 'FunctionDeclaration' && parent.type !== 'Program') {\n        return parent;\n      }\n    }\n\n    return node;\n\n  default:\n    return node;\n  }\n};\n\n/**\n * Retrieves the JSDoc comment for a given node.\n *\n * @param {SourceCode} sourceCode The ESLint SourceCode\n * @param {ASTNode} node The AST node to get the comment for.\n * @param {object} settings The settings in context\n * @returns {Token|null} The Block comment token containing the JSDoc comment\n *    for the given node or null if not found.\n * @public\n * @deprecated\n */\nconst getJSDocComment = function (sourceCode, node, settings) {\n  /**\n   * Checks for the presence of a JSDoc comment for the given node and returns it.\n   *\n   * @param {ASTNode} astNode The AST node to get the comment for.\n   * @returns {Token|null} The Block comment token containing the JSDoc comment\n   *    for the given node or null if not found.\n   * @private\n   */\n  const findJSDocComment = (astNode) => {\n    const {minLines, maxLines} = settings;\n    let currentNode = astNode;\n    let tokenBefore = null;\n\n    while (currentNode) {\n      tokenBefore = sourceCode.getTokenBefore(currentNode, {includeComments: true});\n      const decorator = getDecorator(tokenBefore, sourceCode);\n      if (decorator) {\n        currentNode = decorator;\n        continue;\n      }\n      if (!tokenBefore || !isCommentToken(tokenBefore)) {\n        return null;\n      }\n      if (tokenBefore.type === 'Line') {\n        currentNode = tokenBefore;\n        continue;\n      }\n      break;\n    }\n\n    if (\n      tokenBefore.type === 'Block' &&\n      tokenBefore.value.charAt(0) === '*' &&\n      currentNode.loc.start.line - tokenBefore.loc.end.line >= minLines &&\n      currentNode.loc.start.line - tokenBefore.loc.end.line <= maxLines\n    ) {\n      return tokenBefore;\n    }\n\n    return null;\n  };\n\n  const reducedNode = getReducedASTNode(node, sourceCode);\n  /* istanbul ignore next */\n  if (!reducedNode) {\n    return null;\n  }\n\n  return findJSDocComment(reducedNode);\n};\n\nexport {getReducedASTNode};\nexport default getJSDocComment;\n"],"file":"getJSDocComment.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/exportParser.js b/node_modules/eslint-plugin-jsdoc/dist/exportParser.js
deleted file mode 100644
index c579812..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/exportParser.js
+++ /dev/null
@@ -1,546 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _debug = _interopRequireDefault(require("debug"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const debug = (0, _debug.default)('requireExportJsdoc');
-
-const createNode = function createNode() {
-  return {
-    props: {}
-  };
-};
-
-const getSymbolValue = function getSymbolValue(symbol) {
-  /* istanbul ignore next */
-  if (!symbol) {
-    /* istanbul ignore next */
-    return null;
-  }
-  /* istanbul ignore next */
-
-
-  if (symbol.type === 'literal') {
-    return symbol.value.value;
-  }
-  /* istanbul ignore next */
-
-
-  return null;
-};
-
-const getIdentifier = function getIdentifier(node, globals, scope, opts) {
-  if (opts.simpleIdentifier) {
-    // Type is Identier for noncomputed properties
-    const identifierLiteral = createNode();
-    identifierLiteral.type = 'literal';
-    identifierLiteral.value = {
-      value: node.name
-    };
-    return identifierLiteral;
-  }
-  /* istanbul ignore next */
-
-
-  const block = scope || globals; // As scopes are not currently supported, they are not traversed upwards recursively
-
-  if (block.props[node.name]) {
-    return block.props[node.name];
-  } // Seems this will only be entered once scopes added and entered
-
-  /* istanbul ignore next */
-
-
-  if (globals.props[node.name]) {
-    return globals.props[node.name];
-  }
-
-  return null;
-};
-
-let _createSymbol = null;
-
-const getSymbol = function getSymbol(node, globals, scope, opt) {
-  const opts = opt || {};
-
-  switch (node.type) {
-    case 'Identifier':
-      {
-        return getIdentifier(node, globals, scope, opts);
-      }
-
-    case 'MemberExpression':
-      {
-        const obj = getSymbol(node.object, globals, scope, opts);
-        const propertySymbol = getSymbol(node.property, globals, scope, {
-          simpleIdentifier: !node.computed
-        });
-        const propertyValue = getSymbolValue(propertySymbol);
-        /* istanbul ignore next */
-
-        if (obj && propertyValue && obj.props[propertyValue]) {
-          const block = obj.props[propertyValue];
-          return block;
-        }
-        /*
-        if (opts.createMissingProps && propertyValue) {
-          obj.props[propertyValue] = createNode();
-           return obj.props[propertyValue];
-        }
-        */
-
-        /* istanbul ignore next */
-
-
-        debug(`MemberExpression: Missing property ${node.property.name}`);
-        /* istanbul ignore next */
-
-        return null;
-      }
-
-    case 'ClassDeclaration':
-    case 'ClassExpression':
-    case 'FunctionExpression':
-    case 'FunctionDeclaration':
-    case 'ArrowFunctionExpression':
-      {
-        const val = createNode();
-        val.props.prototype = createNode();
-        val.props.prototype.type = 'object';
-        val.type = 'object';
-        val.value = node;
-        return val;
-      }
-
-    case 'AssignmentExpression':
-      {
-        return _createSymbol(node.left, globals, node.right, scope, opts);
-      }
-
-    case 'ClassBody':
-      {
-        const val = createNode();
-        node.body.forEach(method => {
-          val.props[method.key.name] = createNode();
-          val.props[method.key.name].type = 'object';
-          val.props[method.key.name].value = method.value;
-        });
-        val.type = 'object';
-        val.value = node;
-        return val;
-      }
-
-    case 'ObjectExpression':
-      {
-        const val = createNode();
-        val.type = 'object';
-        node.properties.forEach(prop => {
-          if ([// @typescript-eslint/parser, espree, acorn, etc.
-          'SpreadElement', // babel-eslint
-          'ExperimentalSpreadProperty'].includes(prop.type)) {
-            return;
-          }
-
-          const propVal = getSymbol(prop.value, globals, scope, opts);
-          /* istanbul ignore next */
-
-          if (propVal) {
-            val.props[prop.key.name] = propVal;
-          }
-        });
-        return val;
-      }
-
-    case 'Literal':
-      {
-        const val = createNode();
-        val.type = 'literal';
-        val.value = node;
-        return val;
-      }
-  }
-  /* istanbul ignore next */
-
-
-  return null;
-};
-
-const createBlockSymbol = function createBlockSymbol(block, name, value, globals, isGlobal) {
-  block.props[name] = value;
-
-  if (isGlobal && globals.props.window && globals.props.window.special) {
-    globals.props.window.props[name] = value;
-  }
-};
-
-_createSymbol = function createSymbol(node, globals, value, scope, isGlobal) {
-  const block = scope || globals;
-  let symbol;
-
-  switch (node.type) {
-    case 'FunctionDeclaration': // Fallthrough
-
-    case 'ClassDeclaration':
-      {
-        if (node.id && node.id.type === 'Identifier') {
-          return _createSymbol(node.id, globals, node, globals);
-        }
-
-        break;
-      }
-
-    case 'Identifier':
-      {
-        if (value) {
-          const valueSymbol = getSymbol(value, globals, block);
-          /* istanbul ignore next */
-
-          if (valueSymbol) {
-            createBlockSymbol(block, node.name, valueSymbol, globals, isGlobal);
-            return block.props[node.name];
-          }
-          /* istanbul ignore next */
-
-
-          debug('Identifier: Missing value symbol for %s', node.name);
-        } else {
-          createBlockSymbol(block, node.name, createNode(), globals, isGlobal);
-          return block.props[node.name];
-        }
-        /* istanbul ignore next */
-
-
-        break;
-      }
-
-    case 'MemberExpression':
-      {
-        symbol = getSymbol(node.object, globals, block);
-        const propertySymbol = getSymbol(node.property, globals, block, {
-          simpleIdentifier: !node.computed
-        });
-        const propertyValue = getSymbolValue(propertySymbol);
-
-        if (symbol && propertyValue) {
-          createBlockSymbol(symbol, propertyValue, getSymbol(value, globals, block), globals, isGlobal);
-          return symbol.props[propertyValue];
-        }
-        /* istanbul ignore next */
-
-
-        debug('MemberExpression: Missing symbol: %s', node.property.name);
-        break;
-      }
-  }
-
-  return null;
-}; // Creates variables from variable definitions
-
-
-const initVariables = function initVariables(node, globals, opts) {
-  switch (node.type) {
-    case 'Program':
-      {
-        node.body.forEach(childNode => {
-          initVariables(childNode, globals, opts);
-        });
-        break;
-      }
-
-    case 'ExpressionStatement':
-      {
-        initVariables(node.expression, globals, opts);
-        break;
-      }
-
-    case 'VariableDeclaration':
-      {
-        node.declarations.forEach(declaration => {
-          // let and const
-          const symbol = _createSymbol(declaration.id, globals, null, globals);
-
-          if (opts.initWindow && node.kind === 'var' && globals.props.window) {
-            // If var, also add to window
-            globals.props.window.props[declaration.id.name] = symbol;
-          }
-        });
-        break;
-      }
-
-    case 'ExportNamedDeclaration':
-      {
-        if (node.declaration) {
-          initVariables(node.declaration, globals, opts);
-        }
-
-        break;
-      }
-  }
-}; // Populates variable maps using AST
-
-
-const mapVariables = function mapVariables(node, globals, opt, isExport) {
-  /* istanbul ignore next */
-  const opts = opt || {};
-  /* istanbul ignore next */
-
-  switch (node.type) {
-    case 'Program':
-      {
-        if (opts.ancestorsOnly) {
-          return false;
-        }
-
-        node.body.forEach(childNode => {
-          mapVariables(childNode, globals, opts);
-        });
-        break;
-      }
-
-    case 'ExpressionStatement':
-      {
-        mapVariables(node.expression, globals, opts);
-        break;
-      }
-
-    case 'AssignmentExpression':
-      {
-        _createSymbol(node.left, globals, node.right);
-
-        break;
-      }
-
-    case 'VariableDeclaration':
-      {
-        node.declarations.forEach(declaration => {
-          const isGlobal = opts.initWindow && node.kind === 'var' && globals.props.window;
-
-          const symbol = _createSymbol(declaration.id, globals, declaration.init, globals, isGlobal);
-
-          if (symbol && isExport) {
-            symbol.exported = true;
-          }
-        });
-        break;
-      }
-
-    case 'FunctionDeclaration':
-      {
-        /* istanbul ignore next */
-        if (node.id.type === 'Identifier') {
-          _createSymbol(node.id, globals, node, globals, true);
-        }
-
-        break;
-      }
-
-    case 'ExportDefaultDeclaration':
-      {
-        const symbol = _createSymbol(node.declaration, globals, node.declaration);
-
-        if (symbol) {
-          symbol.exported = true;
-        } else if (!node.id) {
-          globals.ANONYMOUS_DEFAULT = node.declaration;
-        }
-
-        break;
-      }
-
-    case 'ExportNamedDeclaration':
-      {
-        if (node.declaration) {
-          if (node.declaration.type === 'VariableDeclaration') {
-            mapVariables(node.declaration, globals, opts, true);
-          } else {
-            const symbol = _createSymbol(node.declaration, globals, node.declaration);
-            /* istanbul ignore next */
-
-
-            if (symbol) {
-              symbol.exported = true;
-            }
-          }
-        }
-
-        node.specifiers.forEach(specifier => {
-          mapVariables(specifier, globals, opts);
-        });
-        break;
-      }
-
-    case 'ExportSpecifier':
-      {
-        const symbol = getSymbol(node.local, globals, globals);
-        /* istanbul ignore next */
-
-        if (symbol) {
-          symbol.exported = true;
-        }
-
-        break;
-      }
-
-    case 'ClassDeclaration':
-      {
-        _createSymbol(node.id, globals, node.body, globals);
-
-        break;
-      }
-
-    default:
-      {
-        /* istanbul ignore next */
-        return false;
-      }
-  }
-
-  return true;
-};
-
-const findNode = function findNode(node, block, cache) {
-  let blockCache = cache || [];
-  /* istanbul ignore next */
-
-  if (!block || blockCache.includes(block)) {
-    return false;
-  }
-
-  blockCache = blockCache.slice();
-  blockCache.push(block);
-
-  if (block.type === 'object') {
-    if (block.value === node) {
-      return true;
-    }
-  }
-
-  const props = block.props;
-
-  for (const prop in props) {
-    /* istanbul ignore next */
-    if (Object.prototype.hasOwnProperty.call(props, prop)) {
-      const propval = props[prop]; // Only check node if it had resolvable value
-
-      if (propval && findNode(node, propval, blockCache)) {
-        return true;
-      }
-    }
-  }
-
-  return false;
-};
-
-const findExportedNode = function findExportedNode(block, node, cache) {
-  if (block.ANONYMOUS_DEFAULT === node) {
-    return true;
-  }
-  /* istanbul ignore next */
-
-
-  if (block === null) {
-    return false;
-  }
-
-  const blockCache = cache || [];
-  const props = block.props;
-
-  for (const key in props) {
-    /* istanbul ignore next */
-    if (Object.prototype.hasOwnProperty.call(props, key)) {
-      blockCache.push(props[key]);
-
-      if (props[key].exported) {
-        if (node === props[key].value || findNode(node, props[key].value)) {
-          return true;
-        }
-      } // No need to check `props[key]` for exported nodes as ESM
-      //  exports are only global
-
-    }
-  }
-
-  return false;
-};
-
-const isNodeExported = function isNodeExported(node, globals, opt) {
-  if (opt.initModuleExports && globals.props.module && globals.props.module.props.exports) {
-    if (findNode(node, globals.props.module.props.exports)) {
-      return true;
-    }
-  }
-
-  if (opt.initWindow && globals.props.window) {
-    if (findNode(node, globals.props.window)) {
-      return true;
-    }
-  }
-
-  if (opt.esm && findExportedNode(globals, node)) {
-    return true;
-  }
-
-  return false;
-};
-
-const parseRecursive = function parseRecursive(node, globalVars, opts) {
-  // Iterate from top using recursion - stop at first processed node from top
-  if (node.parent) {
-    if (parseRecursive(node.parent, globalVars, opts)) {
-      return true;
-    }
-  }
-
-  return mapVariables(node, globalVars, opts);
-};
-
-const parse = function parse(ast, node, opt) {
-  /* istanbul ignore next */
-  const opts = opt || {
-    ancestorsOnly: false,
-    esm: true,
-    initModuleExports: true,
-    initWindow: true
-  };
-  const globalVars = createNode();
-
-  if (opts.initModuleExports) {
-    globalVars.props.module = createNode();
-    globalVars.props.module.props.exports = createNode();
-    globalVars.props.exports = globalVars.props.module.props.exports;
-  }
-
-  if (opts.initWindow) {
-    globalVars.props.window = createNode();
-    globalVars.props.window.special = true;
-  }
-
-  if (opts.ancestorsOnly) {
-    parseRecursive(node, globalVars, opts);
-  } else {
-    initVariables(ast, globalVars, opts);
-    mapVariables(ast, globalVars, opts);
-  }
-
-  return {
-    globalVars
-  };
-};
-
-const isExported = function isExported(node, parseResult, opt) {
-  return isNodeExported(node, parseResult.globalVars, opt);
-};
-
-var _default = {
-  isExported,
-  parse
-};
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=exportParser.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/exportParser.js.map b/node_modules/eslint-plugin-jsdoc/dist/exportParser.js.map
deleted file mode 100644
index bb7c20c..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/exportParser.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/exportParser.js"],"names":["debug","createNode","props","getSymbolValue","symbol","type","value","getIdentifier","node","globals","scope","opts","simpleIdentifier","identifierLiteral","name","block","createSymbol","getSymbol","opt","obj","object","propertySymbol","property","computed","propertyValue","val","prototype","left","right","body","forEach","method","key","properties","prop","includes","propVal","createBlockSymbol","isGlobal","window","special","id","valueSymbol","initVariables","childNode","expression","declarations","declaration","initWindow","kind","mapVariables","isExport","ancestorsOnly","init","exported","ANONYMOUS_DEFAULT","specifiers","specifier","local","findNode","cache","blockCache","slice","push","Object","hasOwnProperty","call","propval","findExportedNode","isNodeExported","initModuleExports","module","exports","esm","parseRecursive","globalVars","parent","parse","ast","isExported","parseResult"],"mappings":"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","sourcesContent":["import debugModule from 'debug';\n\nconst debug = debugModule('requireExportJsdoc');\n\nconst createNode = function () {\n  return {\n    props: {},\n  };\n};\n\nconst getSymbolValue = function (symbol) {\n  /* istanbul ignore next */\n  if (!symbol) {\n    /* istanbul ignore next */\n    return null;\n  }\n  /* istanbul ignore next */\n  if (symbol.type === 'literal') {\n    return symbol.value.value;\n  }\n\n  /* istanbul ignore next */\n  return null;\n};\n\nconst getIdentifier = function (node, globals, scope, opts) {\n  if (opts.simpleIdentifier) {\n    // Type is Identier for noncomputed properties\n    const identifierLiteral = createNode();\n    identifierLiteral.type = 'literal';\n    identifierLiteral.value = {value: node.name};\n\n    return identifierLiteral;\n  }\n\n  /* istanbul ignore next */\n  const block = scope || globals;\n\n  // As scopes are not currently supported, they are not traversed upwards recursively\n  if (block.props[node.name]) {\n    return block.props[node.name];\n  }\n\n  // Seems this will only be entered once scopes added and entered\n  /* istanbul ignore next */\n  if (globals.props[node.name]) {\n    return globals.props[node.name];\n  }\n\n  return null;\n};\n\nlet createSymbol = null;\nconst getSymbol = function (node, globals, scope, opt) {\n  const opts = opt || {};\n  switch (node.type) {\n  case 'Identifier': {\n    return getIdentifier(node, globals, scope, opts);\n  } case 'MemberExpression': {\n    const obj = getSymbol(node.object, globals, scope, opts);\n    const propertySymbol = getSymbol(node.property, globals, scope, {simpleIdentifier: !node.computed});\n    const propertyValue = getSymbolValue(propertySymbol);\n\n    /* istanbul ignore next */\n    if (obj && propertyValue && obj.props[propertyValue]) {\n      const block = obj.props[propertyValue];\n\n      return block;\n    }\n\n    /*\n    if (opts.createMissingProps && propertyValue) {\n      obj.props[propertyValue] = createNode();\n\n      return obj.props[propertyValue];\n    }\n    */\n    /* istanbul ignore next */\n    debug(`MemberExpression: Missing property ${node.property.name}`);\n\n    /* istanbul ignore next */\n    return null;\n  } case 'ClassDeclaration': case 'ClassExpression': case 'FunctionExpression': case 'FunctionDeclaration': case 'ArrowFunctionExpression': {\n    const val = createNode();\n    val.props.prototype = createNode();\n    val.props.prototype.type = 'object';\n    val.type = 'object';\n    val.value = node;\n\n    return val;\n  } case 'AssignmentExpression': {\n    return createSymbol(node.left, globals, node.right, scope, opts);\n  } case 'ClassBody': {\n    const val = createNode();\n    node.body.forEach((method) => {\n      val.props[method.key.name] = createNode();\n      val.props[method.key.name].type = 'object';\n      val.props[method.key.name].value = method.value;\n    });\n    val.type = 'object';\n    val.value = node;\n\n    return val;\n  } case 'ObjectExpression': {\n    const val = createNode();\n    val.type = 'object';\n    node.properties.forEach((prop) => {\n      if ([\n        // @typescript-eslint/parser, espree, acorn, etc.\n        'SpreadElement',\n\n        // babel-eslint\n        'ExperimentalSpreadProperty',\n      ].includes(prop.type)) {\n        return;\n      }\n      const propVal = getSymbol(prop.value, globals, scope, opts);\n      /* istanbul ignore next */\n      if (propVal) {\n        val.props[prop.key.name] = propVal;\n      }\n    });\n\n    return val;\n  } case 'Literal': {\n    const val = createNode();\n    val.type = 'literal';\n    val.value = node;\n\n    return val;\n  }\n  }\n\n  /* istanbul ignore next */\n  return null;\n};\n\nconst createBlockSymbol = function (block, name, value, globals, isGlobal) {\n  block.props[name] = value;\n  if (isGlobal && globals.props.window && globals.props.window.special) {\n    globals.props.window.props[name] = value;\n  }\n};\n\ncreateSymbol = function (node, globals, value, scope, isGlobal) {\n  const block = scope || globals;\n  let symbol;\n  switch (node.type) {\n  case 'FunctionDeclaration':\n\n    // Fallthrough\n  case 'ClassDeclaration': {\n    if (node.id && node.id.type === 'Identifier') {\n      return createSymbol(node.id, globals, node, globals);\n    }\n    break;\n  } case 'Identifier': {\n    if (value) {\n      const valueSymbol = getSymbol(value, globals, block);\n      /* istanbul ignore next */\n      if (valueSymbol) {\n        createBlockSymbol(block, node.name, valueSymbol, globals, isGlobal);\n\n        return block.props[node.name];\n      }\n      /* istanbul ignore next */\n      debug('Identifier: Missing value symbol for %s', node.name);\n    } else {\n      createBlockSymbol(block, node.name, createNode(), globals, isGlobal);\n\n      return block.props[node.name];\n    }\n    /* istanbul ignore next */\n    break;\n  } case 'MemberExpression': {\n    symbol = getSymbol(node.object, globals, block);\n\n    const propertySymbol = getSymbol(node.property, globals, block, {simpleIdentifier: !node.computed});\n    const propertyValue = getSymbolValue(propertySymbol);\n    if (symbol && propertyValue) {\n      createBlockSymbol(symbol, propertyValue, getSymbol(value, globals, block), globals, isGlobal);\n\n      return symbol.props[propertyValue];\n    }\n    /* istanbul ignore next */\n    debug('MemberExpression: Missing symbol: %s', node.property.name);\n    break;\n  }\n  }\n\n  return null;\n};\n\n// Creates variables from variable definitions\nconst initVariables = function (node, globals, opts) {\n  switch (node.type) {\n  case 'Program': {\n    node.body.forEach((childNode) => {\n      initVariables(childNode, globals, opts);\n    });\n    break;\n  } case 'ExpressionStatement': {\n    initVariables(node.expression, globals, opts);\n    break;\n  } case 'VariableDeclaration': {\n    node.declarations.forEach((declaration) => {\n      // let and const\n      const symbol = createSymbol(declaration.id, globals, null, globals);\n      if (opts.initWindow && node.kind === 'var' && globals.props.window) {\n        // If var, also add to window\n        globals.props.window.props[declaration.id.name] = symbol;\n      }\n    });\n    break;\n  } case 'ExportNamedDeclaration': {\n    if (node.declaration) {\n      initVariables(node.declaration, globals, opts);\n    }\n    break;\n  }\n  }\n};\n\n// Populates variable maps using AST\nconst mapVariables = function (node, globals, opt, isExport) {\n  /* istanbul ignore next */\n  const opts = opt || {};\n  /* istanbul ignore next */\n  switch (node.type) {\n  case 'Program': {\n    if (opts.ancestorsOnly) {\n      return false;\n    }\n    node.body.forEach((childNode) => {\n      mapVariables(childNode, globals, opts);\n    });\n    break;\n  } case 'ExpressionStatement': {\n    mapVariables(node.expression, globals, opts);\n    break;\n  } case 'AssignmentExpression': {\n    createSymbol(node.left, globals, node.right);\n    break;\n  } case 'VariableDeclaration': {\n    node.declarations.forEach((declaration) => {\n      const isGlobal = opts.initWindow && node.kind === 'var' && globals.props.window;\n      const symbol = createSymbol(declaration.id, globals, declaration.init, globals, isGlobal);\n      if (symbol && isExport) {\n        symbol.exported = true;\n      }\n    });\n    break;\n  } case 'FunctionDeclaration': {\n    /* istanbul ignore next */\n    if (node.id.type === 'Identifier') {\n      createSymbol(node.id, globals, node, globals, true);\n    }\n    break;\n  } case 'ExportDefaultDeclaration': {\n    const symbol = createSymbol(node.declaration, globals, node.declaration);\n    if (symbol) {\n      symbol.exported = true;\n    } else if (!node.id) {\n      globals.ANONYMOUS_DEFAULT = node.declaration;\n    }\n    break;\n  } case 'ExportNamedDeclaration': {\n    if (node.declaration) {\n      if (node.declaration.type === 'VariableDeclaration') {\n        mapVariables(node.declaration, globals, opts, true);\n      } else {\n        const symbol = createSymbol(node.declaration, globals, node.declaration);\n        /* istanbul ignore next */\n        if (symbol) {\n          symbol.exported = true;\n        }\n      }\n    }\n    node.specifiers.forEach((specifier) => {\n      mapVariables(specifier, globals, opts);\n    });\n    break;\n  } case 'ExportSpecifier': {\n    const symbol = getSymbol(node.local, globals, globals);\n    /* istanbul ignore next */\n    if (symbol) {\n      symbol.exported = true;\n    }\n    break;\n  } case 'ClassDeclaration': {\n    createSymbol(node.id, globals, node.body, globals);\n    break;\n  } default: {\n    /* istanbul ignore next */\n    return false;\n  }\n  }\n\n  return true;\n};\n\nconst findNode = function (node, block, cache) {\n  let blockCache = cache || [];\n  /* istanbul ignore next */\n  if (!block || blockCache.includes(block)) {\n    return false;\n  }\n  blockCache = blockCache.slice();\n  blockCache.push(block);\n\n  if (block.type === 'object') {\n    if (block.value === node) {\n      return true;\n    }\n  }\n\n  const {props} = block;\n  for (const prop in props) {\n    /* istanbul ignore next */\n    if (Object.prototype.hasOwnProperty.call(props, prop)) {\n      const propval = props[prop];\n\n      // Only check node if it had resolvable value\n      if (propval && findNode(node, propval, blockCache)) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n};\n\nconst findExportedNode = function (block, node, cache) {\n  if (block.ANONYMOUS_DEFAULT === node) {\n    return true;\n  }\n  /* istanbul ignore next */\n  if (block === null) {\n    return false;\n  }\n  const blockCache = cache || [];\n  const {props} = block;\n  for (const key in props) {\n    /* istanbul ignore next */\n    if (Object.prototype.hasOwnProperty.call(props, key)) {\n      blockCache.push(props[key]);\n      if (props[key].exported) {\n        if (node === props[key].value || findNode(node, props[key].value)) {\n          return true;\n        }\n      }\n\n      // No need to check `props[key]` for exported nodes as ESM\n      //  exports are only global\n    }\n  }\n\n  return false;\n};\n\nconst isNodeExported = function (node, globals, opt) {\n  if (opt.initModuleExports && globals.props.module && globals.props.module.props.exports) {\n    if (findNode(node, globals.props.module.props.exports)) {\n      return true;\n    }\n  }\n\n  if (opt.initWindow && globals.props.window) {\n    if (findNode(node, globals.props.window)) {\n      return true;\n    }\n  }\n\n  if (opt.esm && findExportedNode(globals, node)) {\n    return true;\n  }\n\n  return false;\n};\n\nconst parseRecursive = function (node, globalVars, opts) {\n  // Iterate from top using recursion - stop at first processed node from top\n  if (node.parent) {\n    if (parseRecursive(node.parent, globalVars, opts)) {\n      return true;\n    }\n  }\n\n  return mapVariables(node, globalVars, opts);\n};\n\nconst parse = function (ast, node, opt) {\n  /* istanbul ignore next */\n  const opts = opt || {\n    ancestorsOnly: false,\n    esm: true,\n    initModuleExports: true,\n    initWindow: true,\n  };\n\n  const globalVars = createNode();\n  if (opts.initModuleExports) {\n    globalVars.props.module = createNode();\n    globalVars.props.module.props.exports = createNode();\n    globalVars.props.exports = globalVars.props.module.props.exports;\n  }\n  if (opts.initWindow) {\n    globalVars.props.window = createNode();\n    globalVars.props.window.special = true;\n  }\n\n  if (opts.ancestorsOnly) {\n    parseRecursive(node, globalVars, opts);\n  } else {\n    initVariables(ast, globalVars, opts);\n    mapVariables(ast, globalVars, opts);\n  }\n\n  return {\n    globalVars,\n  };\n};\n\nconst isExported = function (node, parseResult, opt) {\n  return isNodeExported(node, parseResult.globalVars, opt);\n};\n\nexport default {\n  isExported,\n  parse,\n};\n"],"file":"exportParser.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/index.js b/node_modules/eslint-plugin-jsdoc/dist/index.js
deleted file mode 100644
index 932938b..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/index.js
+++ /dev/null
@@ -1,172 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _checkAccess = _interopRequireDefault(require("./rules/checkAccess"));
-
-var _checkAlignment = _interopRequireDefault(require("./rules/checkAlignment"));
-
-var _checkExamples = _interopRequireDefault(require("./rules/checkExamples"));
-
-var _checkIndentation = _interopRequireDefault(require("./rules/checkIndentation"));
-
-var _checkParamNames = _interopRequireDefault(require("./rules/checkParamNames"));
-
-var _checkPropertyNames = _interopRequireDefault(require("./rules/checkPropertyNames"));
-
-var _checkSyntax = _interopRequireDefault(require("./rules/checkSyntax"));
-
-var _checkTagNames = _interopRequireDefault(require("./rules/checkTagNames"));
-
-var _checkTypes = _interopRequireDefault(require("./rules/checkTypes"));
-
-var _checkValues = _interopRequireDefault(require("./rules/checkValues"));
-
-var _emptyTags = _interopRequireDefault(require("./rules/emptyTags"));
-
-var _implementsOnClasses = _interopRequireDefault(require("./rules/implementsOnClasses"));
-
-var _matchDescription = _interopRequireDefault(require("./rules/matchDescription"));
-
-var _newlineAfterDescription = _interopRequireDefault(require("./rules/newlineAfterDescription"));
-
-var _noBadBlocks = _interopRequireDefault(require("./rules/noBadBlocks"));
-
-var _noDefaults = _interopRequireDefault(require("./rules/noDefaults"));
-
-var _noTypes = _interopRequireDefault(require("./rules/noTypes"));
-
-var _noUndefinedTypes = _interopRequireDefault(require("./rules/noUndefinedTypes"));
-
-var _requireDescriptionCompleteSentence = _interopRequireDefault(require("./rules/requireDescriptionCompleteSentence"));
-
-var _requireDescription = _interopRequireDefault(require("./rules/requireDescription"));
-
-var _requireExample = _interopRequireDefault(require("./rules/requireExample"));
-
-var _requireFileOverview = _interopRequireDefault(require("./rules/requireFileOverview"));
-
-var _requireHyphenBeforeParamDescription = _interopRequireDefault(require("./rules/requireHyphenBeforeParamDescription"));
-
-var _requireParamName = _interopRequireDefault(require("./rules/requireParamName"));
-
-var _requireParam = _interopRequireDefault(require("./rules/requireParam"));
-
-var _requireParamDescription = _interopRequireDefault(require("./rules/requireParamDescription"));
-
-var _requireParamType = _interopRequireDefault(require("./rules/requireParamType"));
-
-var _requireProperty = _interopRequireDefault(require("./rules/requireProperty"));
-
-var _requirePropertyDescription = _interopRequireDefault(require("./rules/requirePropertyDescription"));
-
-var _requirePropertyName = _interopRequireDefault(require("./rules/requirePropertyName"));
-
-var _requirePropertyType = _interopRequireDefault(require("./rules/requirePropertyType"));
-
-var _requireReturns = _interopRequireDefault(require("./rules/requireReturns"));
-
-var _requireReturnsCheck = _interopRequireDefault(require("./rules/requireReturnsCheck"));
-
-var _requireReturnsDescription = _interopRequireDefault(require("./rules/requireReturnsDescription"));
-
-var _requireReturnsType = _interopRequireDefault(require("./rules/requireReturnsType"));
-
-var _validTypes = _interopRequireDefault(require("./rules/validTypes"));
-
-var _requireJsdoc = _interopRequireDefault(require("./rules/requireJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/* eslint-disable import/max-dependencies */
-var _default = {
-  configs: {
-    recommended: {
-      plugins: ['jsdoc'],
-      rules: {
-        'jsdoc/check-access': 'warn',
-        'jsdoc/check-alignment': 'warn',
-        'jsdoc/check-examples': 'off',
-        'jsdoc/check-indentation': 'off',
-        'jsdoc/check-param-names': 'warn',
-        'jsdoc/check-property-names': 'warn',
-        'jsdoc/check-syntax': 'off',
-        'jsdoc/check-tag-names': 'warn',
-        'jsdoc/check-types': 'warn',
-        'jsdoc/check-values': 'warn',
-        'jsdoc/empty-tags': 'warn',
-        'jsdoc/implements-on-classes': 'warn',
-        'jsdoc/match-description': 'off',
-        'jsdoc/newline-after-description': 'warn',
-        'jsdoc/no-bad-blocks': 'off',
-        'jsdoc/no-defaults': 'off',
-        'jsdoc/no-types': 'off',
-        'jsdoc/no-undefined-types': 'warn',
-        'jsdoc/require-description': 'off',
-        'jsdoc/require-description-complete-sentence': 'off',
-        'jsdoc/require-example': 'off',
-        'jsdoc/require-file-overview': 'off',
-        'jsdoc/require-hyphen-before-param-description': 'off',
-        'jsdoc/require-jsdoc': 'warn',
-        'jsdoc/require-param': 'warn',
-        'jsdoc/require-param-description': 'warn',
-        'jsdoc/require-param-name': 'warn',
-        'jsdoc/require-param-type': 'warn',
-        'jsdoc/require-property': 'warn',
-        'jsdoc/require-property-description': 'warn',
-        'jsdoc/require-property-name': 'warn',
-        'jsdoc/require-property-type': 'warn',
-        'jsdoc/require-returns': 'warn',
-        'jsdoc/require-returns-check': 'warn',
-        'jsdoc/require-returns-description': 'warn',
-        'jsdoc/require-returns-type': 'warn',
-        'jsdoc/valid-types': 'warn'
-      }
-    }
-  },
-  rules: {
-    'check-access': _checkAccess.default,
-    'check-alignment': _checkAlignment.default,
-    'check-examples': _checkExamples.default,
-    'check-indentation': _checkIndentation.default,
-    'check-param-names': _checkParamNames.default,
-    'check-property-names': _checkPropertyNames.default,
-    'check-syntax': _checkSyntax.default,
-    'check-tag-names': _checkTagNames.default,
-    'check-types': _checkTypes.default,
-    'check-values': _checkValues.default,
-    'empty-tags': _emptyTags.default,
-    'implements-on-classes': _implementsOnClasses.default,
-    'match-description': _matchDescription.default,
-    'newline-after-description': _newlineAfterDescription.default,
-    'no-bad-blocks': _noBadBlocks.default,
-    'no-defaults': _noDefaults.default,
-    'no-types': _noTypes.default,
-    'no-undefined-types': _noUndefinedTypes.default,
-    'require-description': _requireDescription.default,
-    'require-description-complete-sentence': _requireDescriptionCompleteSentence.default,
-    'require-example': _requireExample.default,
-    'require-file-overview': _requireFileOverview.default,
-    'require-hyphen-before-param-description': _requireHyphenBeforeParamDescription.default,
-    'require-jsdoc': _requireJsdoc.default,
-    'require-param': _requireParam.default,
-    'require-param-description': _requireParamDescription.default,
-    'require-param-name': _requireParamName.default,
-    'require-param-type': _requireParamType.default,
-    'require-property': _requireProperty.default,
-    'require-property-description': _requirePropertyDescription.default,
-    'require-property-name': _requirePropertyName.default,
-    'require-property-type': _requirePropertyType.default,
-    'require-returns': _requireReturns.default,
-    'require-returns-check': _requireReturnsCheck.default,
-    'require-returns-description': _requireReturnsDescription.default,
-    'require-returns-type': _requireReturnsType.default,
-    'valid-types': _validTypes.default
-  }
-};
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/index.js.map b/node_modules/eslint-plugin-jsdoc/dist/index.js.map
deleted file mode 100644
index 0098c30..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/index.js"],"names":["configs","recommended","plugins","rules","checkAccess","checkAlignment","checkExamples","checkIndentation","checkParamNames","checkPropertyNames","checkSyntax","checkTagNames","checkTypes","checkValues","emptyTags","implementsOnClasses","matchDescription","newlineAfterDescription","noBadBlocks","noDefaults","noTypes","noUndefinedTypes","requireDescription","requireDescriptionCompleteSentence","requireExample","requireFileOverview","requireHyphenBeforeParamDescription","requireJsdoc","requireParam","requireParamDescription","requireParamName","requireParamType","requireProperty","requirePropertyDescription","requirePropertyName","requirePropertyType","requireReturns","requireReturnsCheck","requireReturnsDescription","requireReturnsType","validTypes"],"mappings":";;;;;;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AArCA;eAuCe;AACbA,EAAAA,OAAO,EAAE;AACPC,IAAAA,WAAW,EAAE;AACXC,MAAAA,OAAO,EAAE,CAAC,OAAD,CADE;AAEXC,MAAAA,KAAK,EAAE;AACL,8BAAsB,MADjB;AAEL,iCAAyB,MAFpB;AAGL,gCAAwB,KAHnB;AAIL,mCAA2B,KAJtB;AAKL,mCAA2B,MALtB;AAML,sCAA8B,MANzB;AAOL,8BAAsB,KAPjB;AAQL,iCAAyB,MARpB;AASL,6BAAqB,MAThB;AAUL,8BAAsB,MAVjB;AAWL,4BAAoB,MAXf;AAYL,uCAA+B,MAZ1B;AAaL,mCAA2B,KAbtB;AAcL,2CAAmC,MAd9B;AAeL,+BAAuB,KAflB;AAgBL,6BAAqB,KAhBhB;AAiBL,0BAAkB,KAjBb;AAkBL,oCAA4B,MAlBvB;AAmBL,qCAA6B,KAnBxB;AAoBL,uDAA+C,KApB1C;AAqBL,iCAAyB,KArBpB;AAsBL,uCAA+B,KAtB1B;AAuBL,yDAAiD,KAvB5C;AAwBL,+BAAuB,MAxBlB;AAyBL,+BAAuB,MAzBlB;AA0BL,2CAAmC,MA1B9B;AA2BL,oCAA4B,MA3BvB;AA4BL,oCAA4B,MA5BvB;AA6BL,kCAA0B,MA7BrB;AA8BL,8CAAsC,MA9BjC;AA+BL,uCAA+B,MA/B1B;AAgCL,uCAA+B,MAhC1B;AAiCL,iCAAyB,MAjCpB;AAkCL,uCAA+B,MAlC1B;AAmCL,6CAAqC,MAnChC;AAoCL,sCAA8B,MApCzB;AAqCL,6BAAqB;AArChB;AAFI;AADN,GADI;AA6CbA,EAAAA,KAAK,EAAE;AACL,oBAAgBC,oBADX;AAEL,uBAAmBC,uBAFd;AAGL,sBAAkBC,sBAHb;AAIL,yBAAqBC,yBAJhB;AAKL,yBAAqBC,wBALhB;AAML,4BAAwBC,2BANnB;AAOL,oBAAgBC,oBAPX;AAQL,uBAAmBC,sBARd;AASL,mBAAeC,mBATV;AAUL,oBAAgBC,oBAVX;AAWL,kBAAcC,kBAXT;AAYL,6BAAyBC,4BAZpB;AAaL,yBAAqBC,yBAbhB;AAcL,iCAA6BC,gCAdxB;AAeL,qBAAiBC,oBAfZ;AAgBL,mBAAeC,mBAhBV;AAiBL,gBAAYC,gBAjBP;AAkBL,0BAAsBC,yBAlBjB;AAmBL,2BAAuBC,2BAnBlB;AAoBL,6CAAyCC,2CApBpC;AAqBL,uBAAmBC,uBArBd;AAsBL,6BAAyBC,4BAtBpB;AAuBL,+CAA2CC,4CAvBtC;AAwBL,qBAAiBC,qBAxBZ;AAyBL,qBAAiBC,qBAzBZ;AA0BL,iCAA6BC,gCA1BxB;AA2BL,0BAAsBC,yBA3BjB;AA4BL,0BAAsBC,yBA5BjB;AA6BL,wBAAoBC,wBA7Bf;AA8BL,oCAAgCC,mCA9B3B;AA+BL,6BAAyBC,4BA/BpB;AAgCL,6BAAyBC,4BAhCpB;AAiCL,uBAAmBC,uBAjCd;AAkCL,6BAAyBC,4BAlCpB;AAmCL,mCAA+BC,kCAnC1B;AAoCL,4BAAwBC,2BApCnB;AAqCL,mBAAeC;AArCV;AA7CM,C","sourcesContent":["/* eslint-disable import/max-dependencies */\nimport checkAccess from './rules/checkAccess';\nimport checkAlignment from './rules/checkAlignment';\nimport checkExamples from './rules/checkExamples';\nimport checkIndentation from './rules/checkIndentation';\nimport checkParamNames from './rules/checkParamNames';\nimport checkPropertyNames from './rules/checkPropertyNames';\nimport checkSyntax from './rules/checkSyntax';\nimport checkTagNames from './rules/checkTagNames';\nimport checkTypes from './rules/checkTypes';\nimport checkValues from './rules/checkValues';\nimport emptyTags from './rules/emptyTags';\nimport implementsOnClasses from './rules/implementsOnClasses';\nimport matchDescription from './rules/matchDescription';\nimport newlineAfterDescription from './rules/newlineAfterDescription';\nimport noBadBlocks from './rules/noBadBlocks';\nimport noDefaults from './rules/noDefaults';\nimport noTypes from './rules/noTypes';\nimport noUndefinedTypes from './rules/noUndefinedTypes';\nimport requireDescriptionCompleteSentence from './rules/requireDescriptionCompleteSentence';\nimport requireDescription from './rules/requireDescription';\nimport requireExample from './rules/requireExample';\nimport requireFileOverview from './rules/requireFileOverview';\nimport requireHyphenBeforeParamDescription from './rules/requireHyphenBeforeParamDescription';\nimport requireParamName from './rules/requireParamName';\nimport requireParam from './rules/requireParam';\nimport requireParamDescription from './rules/requireParamDescription';\nimport requireParamType from './rules/requireParamType';\nimport requireProperty from './rules/requireProperty';\nimport requirePropertyDescription from './rules/requirePropertyDescription';\nimport requirePropertyName from './rules/requirePropertyName';\nimport requirePropertyType from './rules/requirePropertyType';\nimport requireReturns from './rules/requireReturns';\nimport requireReturnsCheck from './rules/requireReturnsCheck';\nimport requireReturnsDescription from './rules/requireReturnsDescription';\nimport requireReturnsType from './rules/requireReturnsType';\nimport validTypes from './rules/validTypes';\nimport requireJsdoc from './rules/requireJsdoc';\n\nexport default {\n  configs: {\n    recommended: {\n      plugins: ['jsdoc'],\n      rules: {\n        'jsdoc/check-access': 'warn',\n        'jsdoc/check-alignment': 'warn',\n        'jsdoc/check-examples': 'off',\n        'jsdoc/check-indentation': 'off',\n        'jsdoc/check-param-names': 'warn',\n        'jsdoc/check-property-names': 'warn',\n        'jsdoc/check-syntax': 'off',\n        'jsdoc/check-tag-names': 'warn',\n        'jsdoc/check-types': 'warn',\n        'jsdoc/check-values': 'warn',\n        'jsdoc/empty-tags': 'warn',\n        'jsdoc/implements-on-classes': 'warn',\n        'jsdoc/match-description': 'off',\n        'jsdoc/newline-after-description': 'warn',\n        'jsdoc/no-bad-blocks': 'off',\n        'jsdoc/no-defaults': 'off',\n        'jsdoc/no-types': 'off',\n        'jsdoc/no-undefined-types': 'warn',\n        'jsdoc/require-description': 'off',\n        'jsdoc/require-description-complete-sentence': 'off',\n        'jsdoc/require-example': 'off',\n        'jsdoc/require-file-overview': 'off',\n        'jsdoc/require-hyphen-before-param-description': 'off',\n        'jsdoc/require-jsdoc': 'warn',\n        'jsdoc/require-param': 'warn',\n        'jsdoc/require-param-description': 'warn',\n        'jsdoc/require-param-name': 'warn',\n        'jsdoc/require-param-type': 'warn',\n        'jsdoc/require-property': 'warn',\n        'jsdoc/require-property-description': 'warn',\n        'jsdoc/require-property-name': 'warn',\n        'jsdoc/require-property-type': 'warn',\n        'jsdoc/require-returns': 'warn',\n        'jsdoc/require-returns-check': 'warn',\n        'jsdoc/require-returns-description': 'warn',\n        'jsdoc/require-returns-type': 'warn',\n        'jsdoc/valid-types': 'warn',\n      },\n    },\n  },\n  rules: {\n    'check-access': checkAccess,\n    'check-alignment': checkAlignment,\n    'check-examples': checkExamples,\n    'check-indentation': checkIndentation,\n    'check-param-names': checkParamNames,\n    'check-property-names': checkPropertyNames,\n    'check-syntax': checkSyntax,\n    'check-tag-names': checkTagNames,\n    'check-types': checkTypes,\n    'check-values': checkValues,\n    'empty-tags': emptyTags,\n    'implements-on-classes': implementsOnClasses,\n    'match-description': matchDescription,\n    'newline-after-description': newlineAfterDescription,\n    'no-bad-blocks': noBadBlocks,\n    'no-defaults': noDefaults,\n    'no-types': noTypes,\n    'no-undefined-types': noUndefinedTypes,\n    'require-description': requireDescription,\n    'require-description-complete-sentence': requireDescriptionCompleteSentence,\n    'require-example': requireExample,\n    'require-file-overview': requireFileOverview,\n    'require-hyphen-before-param-description': requireHyphenBeforeParamDescription,\n    'require-jsdoc': requireJsdoc,\n    'require-param': requireParam,\n    'require-param-description': requireParamDescription,\n    'require-param-name': requireParamName,\n    'require-param-type': requireParamType,\n    'require-property': requireProperty,\n    'require-property-description': requirePropertyDescription,\n    'require-property-name': requirePropertyName,\n    'require-property-type': requirePropertyType,\n    'require-returns': requireReturns,\n    'require-returns-check': requireReturnsCheck,\n    'require-returns-description': requireReturnsDescription,\n    'require-returns-type': requireReturnsType,\n    'valid-types': validTypes,\n  },\n};\n"],"file":"index.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/iterateJsdoc.js b/node_modules/eslint-plugin-jsdoc/dist/iterateJsdoc.js
deleted file mode 100644
index 5cbe1e7..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/iterateJsdoc.js
+++ /dev/null
@@ -1,689 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = iterateJsdoc;
-exports.parseComment = exports.getSettings = void 0;
-
-var _commentParser = _interopRequireWildcard(require("comment-parser"));
-
-var _lodash = _interopRequireDefault(require("lodash"));
-
-var _jsdocUtils = _interopRequireDefault(require("./jsdocUtils"));
-
-var _getJSDocComment = _interopRequireWildcard(require("./eslint/getJSDocComment"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
-
-// eslint-disable-next-line import/no-named-default
-const globalState = new Map();
-
-const skipSeeLink = parser => {
-  return (str, data) => {
-    if (data.tag === 'see' && str.match(/\{@link.+?\}/u)) {
-      return null;
-    }
-
-    return parser(str, data);
-  };
-};
-/**
- *
- * @param {object} commentNode
- * @param {string} indent Whitespace
- * @param {boolean} [trim=true]
- * @returns {object}
- */
-
-
-const parseComment = (commentNode, indent, trim = true) => {
-  // Preserve JSDoc block start/end indentation.
-  return (0, _commentParser.default)(`${indent}/*${commentNode.value}${indent}*/`, {
-    // @see https://github.com/yavorskiy/comment-parser/issues/21
-    parsers: [_commentParser.default.PARSERS.parse_tag, skipSeeLink((str, data) => {
-      if (['default', 'defaultvalue'].includes(data.tag)) {
-        return null;
-      }
-
-      return _commentParser.default.PARSERS.parse_type(str, data);
-    }), skipSeeLink((str, data) => {
-      if (['example', 'return', 'returns', 'throws', 'exception', 'access', 'version', 'since', 'license', 'author', 'default', 'defaultvalue'].includes(data.tag)) {
-        return null;
-      }
-
-      return _commentParser.default.PARSERS.parse_name(str, data);
-    }), // parse_description
-    (str, data) => {
-      // Only expected throw in previous step is if bad name (i.e.,
-      //   missing end bracket on optional name), but `@example`
-      //  skips name parsing
-
-      /* istanbul ignore next */
-      if (data.errors && data.errors.length) {
-        return null;
-      } // Tweak original regex to capture only single optional space
-
-
-      const result = str.match(/^ ?((.|\s)+)?/u); // Always has at least whitespace due to `indent` we've added
-
-      /* istanbul ignore next */
-
-      if (result) {
-        return {
-          data: {
-            description: result[1] === undefined ? '' : result[1]
-          },
-          source: result[0]
-        };
-      } // Always has at least whitespace due to `indent` we've added
-
-      /* istanbul ignore next */
-
-
-      return null;
-    }],
-    trim
-  })[0] || {};
-};
-
-exports.parseComment = parseComment;
-
-const getBasicUtils = (context, {
-  tagNamePreference,
-  mode
-}) => {
-  const utils = {};
-
-  utils.reportSettings = message => {
-    context.report({
-      loc: {
-        start: {
-          column: 1,
-          line: 1
-        }
-      },
-      message
-    });
-  };
-
-  utils.getPreferredTagNameObject = ({
-    tagName
-  }) => {
-    const ret = _jsdocUtils.default.getPreferredTagName(context, mode, tagName, tagNamePreference);
-
-    const isObject = ret && typeof ret === 'object';
-
-    if (ret === false || isObject && !ret.replacement) {
-      return {
-        blocked: true,
-        tagName
-      };
-    }
-
-    return ret;
-  };
-
-  return utils;
-};
-
-const getUtils = (node, jsdoc, jsdocNode, settings, report, context, iteratingAll) => {
-  const ancestors = context.getAncestors();
-  const sourceCode = context.getSourceCode();
-  const utils = getBasicUtils(context, settings);
-  const tagNamePreference = settings.tagNamePreference,
-        overrideReplacesDocs = settings.overrideReplacesDocs,
-        implementsReplacesDocs = settings.implementsReplacesDocs,
-        augmentsExtendsReplacesDocs = settings.augmentsExtendsReplacesDocs,
-        maxLines = settings.maxLines,
-        minLines = settings.minLines,
-        mode = settings.mode;
-
-  utils.isIteratingFunction = () => {
-    return !iteratingAll || ['ArrowFunctionExpression', 'FunctionDeclaration', 'FunctionExpression'].includes(node && node.type);
-  };
-
-  utils.isVirtualFunction = () => {
-    return iteratingAll && utils.hasATag(['callback', 'function', 'func', 'method']);
-  };
-
-  utils.stringify = tagBlock => {
-    const indent = _jsdocUtils.default.getIndent(sourceCode);
-
-    return (0, _commentParser.stringify)([tagBlock], {
-      indent
-    }).slice(indent.length - 1);
-  };
-
-  utils.reportJSDoc = (msg, tag, handler) => {
-    report(msg, handler ? fixer => {
-      handler();
-      const replacement = utils.stringify(jsdoc);
-      return fixer.replaceText(jsdocNode, replacement);
-    } : null, tag);
-  };
-
-  utils.getFunctionParameterNames = () => {
-    return _jsdocUtils.default.getFunctionParameterNames(node);
-  };
-
-  utils.isConstructor = () => {
-    return node && node.parent && node.parent.kind === 'constructor';
-  };
-
-  utils.isSetter = () => {
-    return node && node.parent.kind === 'set';
-  };
-
-  utils.getJsdocTagsDeep = tagName => {
-    const name = utils.getPreferredTagName({
-      tagName
-    });
-
-    if (!name) {
-      return false;
-    }
-
-    return _jsdocUtils.default.getJsdocTagsDeep(jsdoc, name);
-  };
-
-  utils.getJsdocTags = tagName => {
-    const name = utils.getPreferredTagName({
-      tagName
-    });
-
-    if (!name) {
-      return false;
-    }
-
-    return _jsdocUtils.default.getJsdocTags(jsdoc, name);
-  };
-
-  utils.getPreferredTagName = ({
-    tagName,
-    skipReportingBlockedTag = false,
-    allowObjectReturn = false,
-    defaultMessage = `Unexpected tag \`@${tagName}\``
-  }) => {
-    const ret = _jsdocUtils.default.getPreferredTagName(context, mode, tagName, tagNamePreference);
-
-    const isObject = ret && typeof ret === 'object';
-
-    if (utils.hasTag(tagName) && (ret === false || isObject && !ret.replacement)) {
-      if (skipReportingBlockedTag) {
-        return {
-          blocked: true,
-          tagName
-        };
-      }
-
-      const message = isObject && ret.message || defaultMessage;
-      report(message, null, utils.getTags(tagName)[0]);
-      return false;
-    }
-
-    return isObject && !allowObjectReturn ? ret.replacement : ret;
-  };
-
-  utils.isValidTag = (name, definedTags) => {
-    return _jsdocUtils.default.isValidTag(context, mode, name, definedTags);
-  };
-
-  utils.hasATag = name => {
-    return _jsdocUtils.default.hasATag(jsdoc, name);
-  };
-
-  utils.hasTag = name => {
-    return _jsdocUtils.default.hasTag(jsdoc, name);
-  };
-
-  utils.avoidDocs = () => {
-    if (overrideReplacesDocs !== false && (utils.hasTag('override') || utils.classHasTag('override')) || implementsReplacesDocs !== false && (utils.hasTag('implements') || utils.classHasTag('implements')) || // inheritdoc implies that all documentation is inherited; see https://jsdoc.app/tags-inheritdoc.html
-    utils.hasTag('inheritdoc') || augmentsExtendsReplacesDocs && (utils.hasATag(['augments', 'extends']) || utils.classHasTag('augments') || utils.classHasTag('extends'))) {
-      return true;
-    }
-
-    const exemptedBy = _lodash.default.get(context, 'options[0].exemptedBy');
-
-    if (exemptedBy && exemptedBy.length && utils.getPresentTags(exemptedBy).length) {
-      return true;
-    }
-
-    return false;
-  };
-
-  utils.tagMustHaveEitherTypeOrNamePosition = tagName => {
-    return _jsdocUtils.default.tagMustHaveEitherTypeOrNamePosition(tagName);
-  };
-
-  utils.tagMightHaveEitherTypeOrNamePosition = tagName => {
-    return _jsdocUtils.default.tagMightHaveEitherTypeOrNamePosition(mode, tagName);
-  };
-
-  utils.tagMustHaveNamePosition = tagName => {
-    return _jsdocUtils.default.tagMustHaveNamePosition(tagName);
-  };
-
-  utils.tagMightHaveNamePosition = tagName => {
-    return _jsdocUtils.default.tagMightHaveNamePosition(tagName);
-  };
-
-  utils.tagMustHaveTypePosition = tagName => {
-    return _jsdocUtils.default.tagMustHaveTypePosition(mode, tagName);
-  };
-
-  utils.tagMightHaveTypePosition = tagName => {
-    return _jsdocUtils.default.tagMightHaveTypePosition(mode, tagName);
-  };
-
-  utils.isNamepathDefiningTag = tagName => {
-    return _jsdocUtils.default.isNamepathDefiningTag(tagName);
-  };
-
-  utils.hasDefinedTypeReturnTag = tag => {
-    return _jsdocUtils.default.hasDefinedTypeReturnTag(tag);
-  };
-
-  utils.hasReturnValue = () => {
-    return _jsdocUtils.default.hasReturnValue(node);
-  };
-
-  utils.isAsync = () => {
-    return node.async;
-  };
-
-  utils.getTags = tagName => {
-    return utils.filterTags(item => {
-      return item.tag === tagName;
-    });
-  };
-
-  utils.getPresentTags = tagList => {
-    return utils.filterTags(tag => {
-      return tagList.includes(tag.tag);
-    });
-  };
-
-  utils.filterTags = filter => {
-    return _jsdocUtils.default.filterTags(jsdoc.tags, filter);
-  };
-
-  utils.getTagsByType = tags => {
-    return _jsdocUtils.default.getTagsByType(context, mode, tags, tagNamePreference);
-  };
-
-  utils.hasOptionTag = tagName => {
-    const tags = _lodash.default.get(context, 'options[0].tags');
-
-    return Boolean(tags && tags.includes(tagName));
-  };
-
-  utils.getClassNode = () => {
-    return [...ancestors, node].reverse().find(parent => {
-      return parent && ['ClassDeclaration', 'ClassExpression'].includes(parent.type);
-    }) || null;
-  };
-
-  utils.getClassJsdoc = () => {
-    const classNode = utils.getClassNode();
-
-    if (!classNode) {
-      return null;
-    }
-
-    const classJsdocNode = (0, _getJSDocComment.default)(sourceCode, classNode, {
-      maxLines,
-      minLines
-    });
-
-    if (classJsdocNode) {
-      const indent = ' '.repeat(classJsdocNode.loc.start.column);
-      return parseComment(classJsdocNode, indent);
-    }
-
-    return null;
-  };
-
-  utils.classHasTag = tagName => {
-    const classJsdoc = utils.getClassJsdoc();
-    return Boolean(classJsdoc) && _jsdocUtils.default.hasTag(classJsdoc, tagName);
-  };
-
-  utils.forEachPreferredTag = (tagName, arrayHandler, skipReportingBlockedTag = false) => {
-    const targetTagName = utils.getPreferredTagName({
-      skipReportingBlockedTag,
-      tagName
-    });
-
-    if (!targetTagName || skipReportingBlockedTag && targetTagName && typeof targetTagName === 'object') {
-      return;
-    }
-
-    const matchingJsdocTags = _lodash.default.filter(jsdoc.tags || [], {
-      tag: targetTagName
-    });
-
-    matchingJsdocTags.forEach(matchingJsdocTag => {
-      arrayHandler(matchingJsdocTag, targetTagName);
-    });
-  };
-
-  return utils;
-};
-
-const getSettings = context => {
-  /* eslint-disable sort-keys-fix/sort-keys-fix */
-  const settings = {
-    // All rules
-    ignorePrivate: Boolean(_lodash.default.get(context, 'settings.jsdoc.ignorePrivate')),
-    maxLines: Number(_lodash.default.get(context, 'settings.jsdoc.maxLines', 1)),
-    minLines: Number(_lodash.default.get(context, 'settings.jsdoc.minLines', 0)),
-    // `check-tag-names` and many returns/param rules
-    tagNamePreference: _lodash.default.get(context, 'settings.jsdoc.tagNamePreference') || {},
-    // `check-types` and `no-undefined-types`
-    preferredTypes: _lodash.default.get(context, 'settings.jsdoc.preferredTypes') || {},
-    // `require-param`, `require-description`, `require-example`, `require-returns`
-    overrideReplacesDocs: _lodash.default.get(context, 'settings.jsdoc.overrideReplacesDocs'),
-    implementsReplacesDocs: _lodash.default.get(context, 'settings.jsdoc.implementsReplacesDocs'),
-    augmentsExtendsReplacesDocs: _lodash.default.get(context, 'settings.jsdoc.augmentsExtendsReplacesDocs'),
-    // Many rules, e.g., `check-tag-names`
-    mode: _lodash.default.get(context, 'settings.jsdoc.mode') || 'jsdoc'
-  };
-  /* eslint-enable sort-keys-fix/sort-keys-fix */
-
-  return settings;
-};
-/**
- * Create the report function
- *
- * @param {object} context
- * @param {object} commentNode
- */
-
-
-exports.getSettings = getSettings;
-
-const makeReport = (context, commentNode) => {
-  const report = (message, fix = null, jsdocLoc = null, data = null) => {
-    let loc;
-
-    if (jsdocLoc) {
-      const lineNumber = commentNode.loc.start.line + jsdocLoc.line;
-      loc = {
-        end: {
-          line: lineNumber
-        },
-        start: {
-          line: lineNumber
-        }
-      };
-
-      if (jsdocLoc.column) {
-        const colNumber = commentNode.loc.start.column + jsdocLoc.column;
-        loc.end.column = colNumber;
-        loc.start.column = colNumber;
-      }
-    }
-
-    context.report({
-      data,
-      fix,
-      loc,
-      message,
-      node: commentNode
-    });
-  };
-
-  return report;
-};
-/**
- * @typedef {ReturnType<typeof getUtils>} Utils
- * @typedef {ReturnType<typeof getSettings>} Settings
- * @typedef {(
- *   arg: {
- *     context: object,
- *     sourceCode: object,
- *     indent: string,
- *     jsdoc: object,
- *     jsdocNode: object,
- *     node: object | null,
- *     report: ReturnType<typeof makeReport>,
- *     settings: Settings,
- *     utils: Utils,
- *   }
- * ) => any } JsdocVisitor
- */
-
-
-const iterate = (ruleConfig, context, lines, jsdocNode, node, settings, sourceCode, iterator, state, iteratingAll) => {
-  const sourceLine = lines[jsdocNode.loc.start.line - 1];
-  const indent = sourceLine.charAt(0).repeat(jsdocNode.loc.start.column);
-  const jsdoc = parseComment(jsdocNode, indent, !ruleConfig.noTrim);
-  const report = makeReport(context, jsdocNode);
-  const utils = getUtils(node, jsdoc, jsdocNode, settings, report, context, iteratingAll);
-
-  if (settings.ignorePrivate && !ruleConfig.checkPrivate && (utils.hasTag('private') || _lodash.default.filter(jsdoc.tags, {
-    tag: 'access'
-  }).some(({
-    description
-  }) => {
-    return description === 'private';
-  }))) {
-    return;
-  }
-
-  iterator({
-    context,
-    globalState,
-    indent,
-    iteratingAll,
-    jsdoc,
-    jsdocNode,
-    node,
-    report,
-    settings,
-    sourceCode,
-    state,
-    utils
-  });
-};
-/**
- * Create an eslint rule that iterates over all JSDocs, regardless of whether
- * they are attached to a function-like node.
- *
- * @param {JsdocVisitor} iterator
- * @param {{meta: any}} ruleConfig
- */
-
-
-const iterateAllJsdocs = (iterator, ruleConfig) => {
-  const trackedJsdocs = [];
-
-  const callIterator = (context, node, jsdocNodes, state, lastCall) => {
-    const sourceCode = context.getSourceCode();
-    const settings = getSettings(context);
-    const lines = sourceCode.lines;
-    const utils = getBasicUtils(context, settings);
-    jsdocNodes.forEach(jsdocNode => {
-      if (!/^\/\*\*\s/.test(sourceCode.getText(jsdocNode))) {
-        return;
-      }
-
-      iterate(ruleConfig, context, lines, jsdocNode, node, settings, sourceCode, iterator, state, true);
-    });
-
-    if (lastCall && ruleConfig.exit) {
-      ruleConfig.exit({
-        context,
-        state,
-        utils
-      });
-    }
-  };
-
-  return {
-    create(context) {
-      const sourceCode = context.getSourceCode();
-      const settings = getSettings(context);
-      const state = {};
-      return {
-        '*:not(Program)'(node) {
-          const reducedNode = (0, _getJSDocComment.getReducedASTNode)(node, sourceCode);
-
-          if (node !== reducedNode) {
-            return;
-          }
-
-          const comment = (0, _getJSDocComment.default)(sourceCode, node, settings);
-
-          if (trackedJsdocs.includes(comment)) {
-            return;
-          }
-
-          if (!comment) {
-            if (ruleConfig.nonComment) {
-              ruleConfig.nonComment({
-                node,
-                state
-              });
-            }
-
-            return;
-          }
-
-          trackedJsdocs.push(comment);
-          callIterator(context, node, [comment], state);
-        },
-
-        'Program:exit'() {
-          const allComments = sourceCode.getAllComments();
-          const untrackedJSdoc = allComments.filter(node => {
-            return !trackedJsdocs.includes(node);
-          });
-          callIterator(context, null, untrackedJSdoc, state, true);
-        }
-
-      };
-    },
-
-    meta: ruleConfig.meta
-  };
-};
-/**
- * Create an eslint rule that iterates over all JSDocs, regardless of whether
- * they are attached to a function-like node.
- *
- * @param {JsdocVisitor} iterator
- * @param {{meta: any}} ruleConfig
- */
-
-
-const checkFile = (iterator, ruleConfig) => {
-  return {
-    create(context) {
-      const sourceCode = context.getSourceCode();
-      const settings = getSettings(context);
-      return {
-        'Program:exit'() {
-          const allComments = sourceCode.getAllComments();
-          const lines = sourceCode.lines;
-          const utils = getBasicUtils(context, settings);
-          iterator({
-            allComments,
-            context,
-            lines,
-            makeReport,
-            settings,
-            sourceCode,
-            utils
-          });
-        }
-
-      };
-    },
-
-    meta: ruleConfig.meta
-  };
-};
-
-/**
- * @param {JsdocVisitor} iterator
- * @param {{
- *   meta: any,
- *   contextDefaults?: true | string[],
- *   iterateAllJsdocs?: true,
- * }} ruleConfig
- */
-function iterateJsdoc(iterator, ruleConfig) {
-  const metaType = _lodash.default.get(ruleConfig, 'meta.type');
-
-  if (!metaType || !['problem', 'suggestion', 'layout'].includes(metaType)) {
-    throw new TypeError('Rule must include `meta.type` option (with value "problem", "suggestion", or "layout")');
-  }
-
-  if (typeof iterator !== 'function') {
-    throw new TypeError('The iterator argument must be a function.');
-  }
-
-  if (ruleConfig.checkFile) {
-    return checkFile(iterator, ruleConfig);
-  }
-
-  if (ruleConfig.iterateAllJsdocs) {
-    return iterateAllJsdocs(iterator, ruleConfig);
-  }
-
-  return {
-    /**
-     * The entrypoint for the JSDoc rule.
-     *
-     * @param {*} context
-     *   a reference to the context which hold all important information
-     *   like settings and the sourcecode to check.
-     * @returns {object}
-     *   a list with parser callback function.
-     */
-    create(context) {
-      let contexts;
-
-      if (ruleConfig.contextDefaults) {
-        contexts = _jsdocUtils.default.enforcedContexts(context, ruleConfig.contextDefaults);
-
-        if (contexts.includes('any')) {
-          return iterateAllJsdocs(iterator, ruleConfig).create(context);
-        }
-      }
-
-      const sourceCode = context.getSourceCode();
-      const settings = getSettings(context);
-      const lines = sourceCode.lines;
-
-      const checkJsdoc = node => {
-        const jsdocNode = (0, _getJSDocComment.default)(sourceCode, node, settings);
-
-        if (!jsdocNode) {
-          return;
-        }
-
-        iterate(ruleConfig, context, lines, jsdocNode, node, settings, sourceCode, iterator);
-      };
-
-      if (ruleConfig.contextDefaults) {
-        return _jsdocUtils.default.getContextObject(contexts, checkJsdoc);
-      }
-
-      return {
-        ArrowFunctionExpression: checkJsdoc,
-        FunctionDeclaration: checkJsdoc,
-        FunctionExpression: checkJsdoc
-      };
-    },
-
-    meta: ruleConfig.meta
-  };
-}
-//# sourceMappingURL=iterateJsdoc.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/iterateJsdoc.js.map b/node_modules/eslint-plugin-jsdoc/dist/iterateJsdoc.js.map
deleted file mode 100644
index 31c118c..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/iterateJsdoc.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/iterateJsdoc.js"],"names":["globalState","Map","skipSeeLink","parser","str","data","tag","match","parseComment","commentNode","indent","trim","value","parsers","commentParser","PARSERS","parse_tag","includes","parse_type","parse_name","errors","length","result","description","undefined","source","getBasicUtils","context","tagNamePreference","mode","utils","reportSettings","message","report","loc","start","column","line","getPreferredTagNameObject","tagName","ret","jsdocUtils","getPreferredTagName","isObject","replacement","blocked","getUtils","node","jsdoc","jsdocNode","settings","iteratingAll","ancestors","getAncestors","sourceCode","getSourceCode","overrideReplacesDocs","implementsReplacesDocs","augmentsExtendsReplacesDocs","maxLines","minLines","isIteratingFunction","type","isVirtualFunction","hasATag","stringify","tagBlock","getIndent","slice","reportJSDoc","msg","handler","fixer","replaceText","getFunctionParameterNames","isConstructor","parent","kind","isSetter","getJsdocTagsDeep","name","getJsdocTags","skipReportingBlockedTag","allowObjectReturn","defaultMessage","hasTag","getTags","isValidTag","definedTags","avoidDocs","classHasTag","exemptedBy","_","get","getPresentTags","tagMustHaveEitherTypeOrNamePosition","tagMightHaveEitherTypeOrNamePosition","tagMustHaveNamePosition","tagMightHaveNamePosition","tagMustHaveTypePosition","tagMightHaveTypePosition","isNamepathDefiningTag","hasDefinedTypeReturnTag","hasReturnValue","isAsync","async","filterTags","item","tagList","filter","tags","getTagsByType","hasOptionTag","Boolean","getClassNode","reverse","find","getClassJsdoc","classNode","classJsdocNode","repeat","classJsdoc","forEachPreferredTag","arrayHandler","targetTagName","matchingJsdocTags","forEach","matchingJsdocTag","getSettings","ignorePrivate","Number","preferredTypes","makeReport","fix","jsdocLoc","lineNumber","end","colNumber","iterate","ruleConfig","lines","iterator","state","sourceLine","charAt","noTrim","checkPrivate","some","iterateAllJsdocs","trackedJsdocs","callIterator","jsdocNodes","lastCall","test","getText","exit","create","reducedNode","comment","nonComment","push","allComments","getAllComments","untrackedJSdoc","meta","checkFile","iterateJsdoc","metaType","TypeError","contexts","contextDefaults","enforcedContexts","checkJsdoc","getContextObject","ArrowFunctionExpression","FunctionDeclaration","FunctionExpression"],"mappings":";;;;;;;;AACA;;AACA;;AACA;;AACA;;;;;;;;AAJA;AAMA,MAAMA,WAAW,GAAG,IAAIC,GAAJ,EAApB;;AAEA,MAAMC,WAAW,GAAIC,MAAD,IAAY;AAC9B,SAAO,CAACC,GAAD,EAAMC,IAAN,KAAe;AACpB,QAAIA,IAAI,CAACC,GAAL,KAAa,KAAb,IAAsBF,GAAG,CAACG,KAAJ,CAAU,eAAV,CAA1B,EAAsD;AACpD,aAAO,IAAP;AACD;;AAED,WAAOJ,MAAM,CAACC,GAAD,EAAMC,IAAN,CAAb;AACD,GAND;AAOD,CARD;AAUA;;;;;;;;;AAOA,MAAMG,YAAY,GAAG,CAACC,WAAD,EAAcC,MAAd,EAAsBC,IAAI,GAAG,IAA7B,KAAsC;AACzD;AACA,SAAO,4BAAe,GAAED,MAAO,KAAID,WAAW,CAACG,KAAM,GAAEF,MAAO,IAAvD,EAA4D;AACjE;AACAG,IAAAA,OAAO,EAAE,CACPC,uBAAcC,OAAd,CAAsBC,SADf,EAEPd,WAAW,CACT,CAACE,GAAD,EAAMC,IAAN,KAAe;AACb,UAAI,CAAC,SAAD,EAAY,cAAZ,EAA4BY,QAA5B,CAAqCZ,IAAI,CAACC,GAA1C,CAAJ,EAAoD;AAClD,eAAO,IAAP;AACD;;AAED,aAAOQ,uBAAcC,OAAd,CAAsBG,UAAtB,CAAiCd,GAAjC,EAAsCC,IAAtC,CAAP;AACD,KAPQ,CAFJ,EAWPH,WAAW,CACT,CAACE,GAAD,EAAMC,IAAN,KAAe;AACb,UAAI,CACF,SADE,EACS,QADT,EACmB,SADnB,EAC8B,QAD9B,EACwC,WADxC,EAEF,QAFE,EAEQ,SAFR,EAEmB,OAFnB,EAE4B,SAF5B,EAEuC,QAFvC,EAGF,SAHE,EAGS,cAHT,EAIFY,QAJE,CAIOZ,IAAI,CAACC,GAJZ,CAAJ,EAIsB;AACpB,eAAO,IAAP;AACD;;AAED,aAAOQ,uBAAcC,OAAd,CAAsBI,UAAtB,CAAiCf,GAAjC,EAAsCC,IAAtC,CAAP;AACD,KAXQ,CAXJ,EAyBP;AACA,KAACD,GAAD,EAAMC,IAAN,KAAe;AACb;AACA;AACA;;AACA;AACA,UAAIA,IAAI,CAACe,MAAL,IAAef,IAAI,CAACe,MAAL,CAAYC,MAA/B,EAAuC;AACrC,eAAO,IAAP;AACD,OAPY,CASb;;;AACA,YAAMC,MAAM,GAAGlB,GAAG,CAACG,KAAJ,CAAU,gBAAV,CAAf,CAVa,CAYb;;AACA;;AACA,UAAIe,MAAJ,EAAY;AACV,eAAO;AACLjB,UAAAA,IAAI,EAAE;AACJkB,YAAAA,WAAW,EAAED,MAAM,CAAC,CAAD,CAAN,KAAcE,SAAd,GAA0B,EAA1B,GAA+BF,MAAM,CAAC,CAAD;AAD9C,WADD;AAILG,UAAAA,MAAM,EAAEH,MAAM,CAAC,CAAD;AAJT,SAAP;AAMD,OArBY,CAuBb;;AACA;;;AACA,aAAO,IAAP;AACD,KApDM,CAFwD;AAwDjEX,IAAAA;AAxDiE,GAA5D,EAyDJ,CAzDI,KAyDE,EAzDT;AA0DD,CA5DD;;;;AA8DA,MAAMe,aAAa,GAAG,CAACC,OAAD,EAAU;AAACC,EAAAA,iBAAD;AAAoBC,EAAAA;AAApB,CAAV,KAAwC;AAC5D,QAAMC,KAAK,GAAG,EAAd;;AACAA,EAAAA,KAAK,CAACC,cAAN,GAAwBC,OAAD,IAAa;AAClCL,IAAAA,OAAO,CAACM,MAAR,CAAe;AACbC,MAAAA,GAAG,EAAE;AACHC,QAAAA,KAAK,EAAE;AACLC,UAAAA,MAAM,EAAE,CADH;AAELC,UAAAA,IAAI,EAAE;AAFD;AADJ,OADQ;AAObL,MAAAA;AAPa,KAAf;AASD,GAVD;;AAYAF,EAAAA,KAAK,CAACQ,yBAAN,GAAkC,CAAC;AAACC,IAAAA;AAAD,GAAD,KAAe;AAC/C,UAAMC,GAAG,GAAGC,oBAAWC,mBAAX,CAA+Bf,OAA/B,EAAwCE,IAAxC,EAA8CU,OAA9C,EAAuDX,iBAAvD,CAAZ;;AACA,UAAMe,QAAQ,GAAGH,GAAG,IAAI,OAAOA,GAAP,KAAe,QAAvC;;AACA,QAAIA,GAAG,KAAK,KAAR,IAAiBG,QAAQ,IAAI,CAACH,GAAG,CAACI,WAAtC,EAAmD;AACjD,aAAO;AACLC,QAAAA,OAAO,EAAE,IADJ;AAELN,QAAAA;AAFK,OAAP;AAID;;AAED,WAAOC,GAAP;AACD,GAXD;;AAaA,SAAOV,KAAP;AACD,CA5BD;;AA8BA,MAAMgB,QAAQ,GAAG,CACfC,IADe,EAEfC,KAFe,EAGfC,SAHe,EAIfC,QAJe,EAKfjB,MALe,EAMfN,OANe,EAOfwB,YAPe,KAQZ;AACH,QAAMC,SAAS,GAAGzB,OAAO,CAAC0B,YAAR,EAAlB;AACA,QAAMC,UAAU,GAAG3B,OAAO,CAAC4B,aAAR,EAAnB;AAEA,QAAMzB,KAAK,GAAGJ,aAAa,CAACC,OAAD,EAAUuB,QAAV,CAA3B;AAJG,QAODtB,iBAPC,GAcCsB,QAdD,CAODtB,iBAPC;AAAA,QAQD4B,oBARC,GAcCN,QAdD,CAQDM,oBARC;AAAA,QASDC,sBATC,GAcCP,QAdD,CASDO,sBATC;AAAA,QAUDC,2BAVC,GAcCR,QAdD,CAUDQ,2BAVC;AAAA,QAWDC,QAXC,GAcCT,QAdD,CAWDS,QAXC;AAAA,QAYDC,QAZC,GAcCV,QAdD,CAYDU,QAZC;AAAA,QAaD/B,IAbC,GAcCqB,QAdD,CAaDrB,IAbC;;AAgBHC,EAAAA,KAAK,CAAC+B,mBAAN,GAA4B,MAAM;AAChC,WAAO,CAACV,YAAD,IAAiB,CACtB,yBADsB,EAEtB,qBAFsB,EAGtB,oBAHsB,EAItBlC,QAJsB,CAIb8B,IAAI,IAAIA,IAAI,CAACe,IAJA,CAAxB;AAKD,GAND;;AAQAhC,EAAAA,KAAK,CAACiC,iBAAN,GAA0B,MAAM;AAC9B,WAAOZ,YAAY,IAAIrB,KAAK,CAACkC,OAAN,CAAc,CAAC,UAAD,EAAa,UAAb,EAAyB,MAAzB,EAAiC,QAAjC,CAAd,CAAvB;AACD,GAFD;;AAIAlC,EAAAA,KAAK,CAACmC,SAAN,GAAmBC,QAAD,IAAc;AAC9B,UAAMxD,MAAM,GAAG+B,oBAAW0B,SAAX,CAAqBb,UAArB,CAAf;;AAEA,WAAO,8BAAiB,CAACY,QAAD,CAAjB,EAA6B;AAACxD,MAAAA;AAAD,KAA7B,EAAuC0D,KAAvC,CAA6C1D,MAAM,CAACW,MAAP,GAAgB,CAA7D,CAAP;AACD,GAJD;;AAMAS,EAAAA,KAAK,CAACuC,WAAN,GAAoB,CAACC,GAAD,EAAMhE,GAAN,EAAWiE,OAAX,KAAuB;AACzCtC,IAAAA,MAAM,CAACqC,GAAD,EAAMC,OAAO,GAAIC,KAAD,IAAW;AAC/BD,MAAAA,OAAO;AACP,YAAM3B,WAAW,GAAGd,KAAK,CAACmC,SAAN,CAAgBjB,KAAhB,CAApB;AAEA,aAAOwB,KAAK,CAACC,WAAN,CAAkBxB,SAAlB,EAA6BL,WAA7B,CAAP;AACD,KALkB,GAKf,IALE,EAKItC,GALJ,CAAN;AAMD,GAPD;;AASAwB,EAAAA,KAAK,CAAC4C,yBAAN,GAAkC,MAAM;AACtC,WAAOjC,oBAAWiC,yBAAX,CAAqC3B,IAArC,CAAP;AACD,GAFD;;AAIAjB,EAAAA,KAAK,CAAC6C,aAAN,GAAsB,MAAM;AAC1B,WAAO5B,IAAI,IAAIA,IAAI,CAAC6B,MAAb,IAAuB7B,IAAI,CAAC6B,MAAL,CAAYC,IAAZ,KAAqB,aAAnD;AACD,GAFD;;AAIA/C,EAAAA,KAAK,CAACgD,QAAN,GAAiB,MAAM;AACrB,WAAO/B,IAAI,IAAIA,IAAI,CAAC6B,MAAL,CAAYC,IAAZ,KAAqB,KAApC;AACD,GAFD;;AAIA/C,EAAAA,KAAK,CAACiD,gBAAN,GAA0BxC,OAAD,IAAa;AACpC,UAAMyC,IAAI,GAAGlD,KAAK,CAACY,mBAAN,CAA0B;AAACH,MAAAA;AAAD,KAA1B,CAAb;;AACA,QAAI,CAACyC,IAAL,EAAW;AACT,aAAO,KAAP;AACD;;AAED,WAAOvC,oBAAWsC,gBAAX,CAA4B/B,KAA5B,EAAmCgC,IAAnC,CAAP;AACD,GAPD;;AASAlD,EAAAA,KAAK,CAACmD,YAAN,GAAsB1C,OAAD,IAAa;AAChC,UAAMyC,IAAI,GAAGlD,KAAK,CAACY,mBAAN,CAA0B;AAACH,MAAAA;AAAD,KAA1B,CAAb;;AACA,QAAI,CAACyC,IAAL,EAAW;AACT,aAAO,KAAP;AACD;;AAED,WAAOvC,oBAAWwC,YAAX,CAAwBjC,KAAxB,EAA+BgC,IAA/B,CAAP;AACD,GAPD;;AASAlD,EAAAA,KAAK,CAACY,mBAAN,GAA4B,CAAC;AAACH,IAAAA,OAAD;AAAU2C,IAAAA,uBAAuB,GAAG,KAApC;AAA2CC,IAAAA,iBAAiB,GAAG,KAA/D;AAAsEC,IAAAA,cAAc,GAAI,qBAAoB7C,OAAQ;AAApH,GAAD,KAA8H;AACxJ,UAAMC,GAAG,GAAGC,oBAAWC,mBAAX,CAA+Bf,OAA/B,EAAwCE,IAAxC,EAA8CU,OAA9C,EAAuDX,iBAAvD,CAAZ;;AACA,UAAMe,QAAQ,GAAGH,GAAG,IAAI,OAAOA,GAAP,KAAe,QAAvC;;AACA,QAAIV,KAAK,CAACuD,MAAN,CAAa9C,OAAb,MAA0BC,GAAG,KAAK,KAAR,IAAiBG,QAAQ,IAAI,CAACH,GAAG,CAACI,WAA5D,CAAJ,EAA8E;AAC5E,UAAIsC,uBAAJ,EAA6B;AAC3B,eAAO;AACLrC,UAAAA,OAAO,EAAE,IADJ;AAELN,UAAAA;AAFK,SAAP;AAID;;AACD,YAAMP,OAAO,GAAGW,QAAQ,IAAIH,GAAG,CAACR,OAAhB,IAA2BoD,cAA3C;AACAnD,MAAAA,MAAM,CAACD,OAAD,EAAU,IAAV,EAAgBF,KAAK,CAACwD,OAAN,CAAc/C,OAAd,EAAuB,CAAvB,CAAhB,CAAN;AAEA,aAAO,KAAP;AACD;;AAED,WAAOI,QAAQ,IAAI,CAACwC,iBAAb,GAAiC3C,GAAG,CAACI,WAArC,GAAmDJ,GAA1D;AACD,GAjBD;;AAmBAV,EAAAA,KAAK,CAACyD,UAAN,GAAmB,CAACP,IAAD,EAAOQ,WAAP,KAAuB;AACxC,WAAO/C,oBAAW8C,UAAX,CAAsB5D,OAAtB,EAA+BE,IAA/B,EAAqCmD,IAArC,EAA2CQ,WAA3C,CAAP;AACD,GAFD;;AAIA1D,EAAAA,KAAK,CAACkC,OAAN,GAAiBgB,IAAD,IAAU;AACxB,WAAOvC,oBAAWuB,OAAX,CAAmBhB,KAAnB,EAA0BgC,IAA1B,CAAP;AACD,GAFD;;AAIAlD,EAAAA,KAAK,CAACuD,MAAN,GAAgBL,IAAD,IAAU;AACvB,WAAOvC,oBAAW4C,MAAX,CAAkBrC,KAAlB,EAAyBgC,IAAzB,CAAP;AACD,GAFD;;AAIAlD,EAAAA,KAAK,CAAC2D,SAAN,GAAkB,MAAM;AACtB,QACEjC,oBAAoB,KAAK,KAAzB,KACG1B,KAAK,CAACuD,MAAN,CAAa,UAAb,KAA4BvD,KAAK,CAAC4D,WAAN,CAAkB,UAAlB,CAD/B,KAEAjC,sBAAsB,KAAK,KAA3B,KACG3B,KAAK,CAACuD,MAAN,CAAa,YAAb,KAA8BvD,KAAK,CAAC4D,WAAN,CAAkB,YAAlB,CADjC,CAFA,IAKA;AACA5D,IAAAA,KAAK,CAACuD,MAAN,CAAa,YAAb,CANA,IAQA3B,2BAA2B,KACxB5B,KAAK,CAACkC,OAAN,CAAc,CAAC,UAAD,EAAa,SAAb,CAAd,KACClC,KAAK,CAAC4D,WAAN,CAAkB,UAAlB,CADD,IAEG5D,KAAK,CAAC4D,WAAN,CAAkB,SAAlB,CAHqB,CAT7B,EAYuC;AACrC,aAAO,IAAP;AACD;;AAED,UAAMC,UAAU,GAAGC,gBAAEC,GAAF,CAAMlE,OAAN,EAAe,uBAAf,CAAnB;;AACA,QAAIgE,UAAU,IAAIA,UAAU,CAACtE,MAAzB,IAAmCS,KAAK,CAACgE,cAAN,CAAqBH,UAArB,EAAiCtE,MAAxE,EAAgF;AAC9E,aAAO,IAAP;AACD;;AAED,WAAO,KAAP;AACD,GAvBD;;AAyBAS,EAAAA,KAAK,CAACiE,mCAAN,GAA6CxD,OAAD,IAAa;AACvD,WAAOE,oBAAWsD,mCAAX,CAA+CxD,OAA/C,CAAP;AACD,GAFD;;AAIAT,EAAAA,KAAK,CAACkE,oCAAN,GAA8CzD,OAAD,IAAa;AACxD,WAAOE,oBAAWuD,oCAAX,CAAgDnE,IAAhD,EAAsDU,OAAtD,CAAP;AACD,GAFD;;AAIAT,EAAAA,KAAK,CAACmE,uBAAN,GAAiC1D,OAAD,IAAa;AAC3C,WAAOE,oBAAWwD,uBAAX,CAAmC1D,OAAnC,CAAP;AACD,GAFD;;AAIAT,EAAAA,KAAK,CAACoE,wBAAN,GAAkC3D,OAAD,IAAa;AAC5C,WAAOE,oBAAWyD,wBAAX,CAAoC3D,OAApC,CAAP;AACD,GAFD;;AAIAT,EAAAA,KAAK,CAACqE,uBAAN,GAAiC5D,OAAD,IAAa;AAC3C,WAAOE,oBAAW0D,uBAAX,CAAmCtE,IAAnC,EAAyCU,OAAzC,CAAP;AACD,GAFD;;AAIAT,EAAAA,KAAK,CAACsE,wBAAN,GAAkC7D,OAAD,IAAa;AAC5C,WAAOE,oBAAW2D,wBAAX,CAAoCvE,IAApC,EAA0CU,OAA1C,CAAP;AACD,GAFD;;AAIAT,EAAAA,KAAK,CAACuE,qBAAN,GAA+B9D,OAAD,IAAa;AACzC,WAAOE,oBAAW4D,qBAAX,CAAiC9D,OAAjC,CAAP;AACD,GAFD;;AAIAT,EAAAA,KAAK,CAACwE,uBAAN,GAAiChG,GAAD,IAAS;AACvC,WAAOmC,oBAAW6D,uBAAX,CAAmChG,GAAnC,CAAP;AACD,GAFD;;AAIAwB,EAAAA,KAAK,CAACyE,cAAN,GAAuB,MAAM;AAC3B,WAAO9D,oBAAW8D,cAAX,CAA0BxD,IAA1B,CAAP;AACD,GAFD;;AAIAjB,EAAAA,KAAK,CAAC0E,OAAN,GAAgB,MAAM;AACpB,WAAOzD,IAAI,CAAC0D,KAAZ;AACD,GAFD;;AAIA3E,EAAAA,KAAK,CAACwD,OAAN,GAAiB/C,OAAD,IAAa;AAC3B,WAAOT,KAAK,CAAC4E,UAAN,CAAkBC,IAAD,IAAU;AAChC,aAAOA,IAAI,CAACrG,GAAL,KAAaiC,OAApB;AACD,KAFM,CAAP;AAGD,GAJD;;AAMAT,EAAAA,KAAK,CAACgE,cAAN,GAAwBc,OAAD,IAAa;AAClC,WAAO9E,KAAK,CAAC4E,UAAN,CAAkBpG,GAAD,IAAS;AAC/B,aAAOsG,OAAO,CAAC3F,QAAR,CAAiBX,GAAG,CAACA,GAArB,CAAP;AACD,KAFM,CAAP;AAGD,GAJD;;AAMAwB,EAAAA,KAAK,CAAC4E,UAAN,GAAoBG,MAAD,IAAY;AAC7B,WAAOpE,oBAAWiE,UAAX,CAAsB1D,KAAK,CAAC8D,IAA5B,EAAkCD,MAAlC,CAAP;AACD,GAFD;;AAIA/E,EAAAA,KAAK,CAACiF,aAAN,GAAuBD,IAAD,IAAU;AAC9B,WAAOrE,oBAAWsE,aAAX,CAAyBpF,OAAzB,EAAkCE,IAAlC,EAAwCiF,IAAxC,EAA8ClF,iBAA9C,CAAP;AACD,GAFD;;AAIAE,EAAAA,KAAK,CAACkF,YAAN,GAAsBzE,OAAD,IAAa;AAChC,UAAMuE,IAAI,GAAGlB,gBAAEC,GAAF,CAAMlE,OAAN,EAAe,iBAAf,CAAb;;AAEA,WAAOsF,OAAO,CAACH,IAAI,IAAIA,IAAI,CAAC7F,QAAL,CAAcsB,OAAd,CAAT,CAAd;AACD,GAJD;;AAMAT,EAAAA,KAAK,CAACoF,YAAN,GAAqB,MAAM;AACzB,WAAO,CAAC,GAAG9D,SAAJ,EAAeL,IAAf,EAAqBoE,OAArB,GAA+BC,IAA/B,CAAqCxC,MAAD,IAAY;AACrD,aAAOA,MAAM,IAAI,CAAC,kBAAD,EAAqB,iBAArB,EAAwC3D,QAAxC,CAAiD2D,MAAM,CAACd,IAAxD,CAAjB;AACD,KAFM,KAED,IAFN;AAGD,GAJD;;AAMAhC,EAAAA,KAAK,CAACuF,aAAN,GAAsB,MAAM;AAC1B,UAAMC,SAAS,GAAGxF,KAAK,CAACoF,YAAN,EAAlB;;AAEA,QAAI,CAACI,SAAL,EAAgB;AACd,aAAO,IAAP;AACD;;AAED,UAAMC,cAAc,GAAG,8BAAgBjE,UAAhB,EAA4BgE,SAA5B,EAAuC;AAC5D3D,MAAAA,QAD4D;AAE5DC,MAAAA;AAF4D,KAAvC,CAAvB;;AAKA,QAAI2D,cAAJ,EAAoB;AAClB,YAAM7G,MAAM,GAAG,IAAI8G,MAAJ,CAAWD,cAAc,CAACrF,GAAf,CAAmBC,KAAnB,CAAyBC,MAApC,CAAf;AAEA,aAAO5B,YAAY,CAAC+G,cAAD,EAAiB7G,MAAjB,CAAnB;AACD;;AAED,WAAO,IAAP;AACD,GAnBD;;AAqBAoB,EAAAA,KAAK,CAAC4D,WAAN,GAAqBnD,OAAD,IAAa;AAC/B,UAAMkF,UAAU,GAAG3F,KAAK,CAACuF,aAAN,EAAnB;AAEA,WAAOJ,OAAO,CAACQ,UAAD,CAAP,IAAuBhF,oBAAW4C,MAAX,CAAkBoC,UAAlB,EAA8BlF,OAA9B,CAA9B;AACD,GAJD;;AAMAT,EAAAA,KAAK,CAAC4F,mBAAN,GAA4B,CAACnF,OAAD,EAAUoF,YAAV,EAAwBzC,uBAAuB,GAAG,KAAlD,KAA4D;AACtF,UAAM0C,aAAa,GAAG9F,KAAK,CAACY,mBAAN,CAA0B;AAC9CwC,MAAAA,uBAD8C;AAE9C3C,MAAAA;AAF8C,KAA1B,CAAtB;;AAIA,QAAI,CAACqF,aAAD,IACF1C,uBAAuB,IAAI0C,aAA3B,IAA4C,OAAOA,aAAP,KAAyB,QADvE,EAEE;AACA;AACD;;AACD,UAAMC,iBAAiB,GAAGjC,gBAAEiB,MAAF,CAAS7D,KAAK,CAAC8D,IAAN,IAAc,EAAvB,EAA2B;AACnDxG,MAAAA,GAAG,EAAEsH;AAD8C,KAA3B,CAA1B;;AAIAC,IAAAA,iBAAiB,CAACC,OAAlB,CAA2BC,gBAAD,IAAsB;AAC9CJ,MAAAA,YAAY,CAACI,gBAAD,EAAmBH,aAAnB,CAAZ;AACD,KAFD;AAGD,GAjBD;;AAmBA,SAAO9F,KAAP;AACD,CAhQD;;AAkQA,MAAMkG,WAAW,GAAIrG,OAAD,IAAa;AAC/B;AACA,QAAMuB,QAAQ,GAAG;AACf;AACA+E,IAAAA,aAAa,EAAEhB,OAAO,CAACrB,gBAAEC,GAAF,CAAMlE,OAAN,EAAe,8BAAf,CAAD,CAFP;AAGfgC,IAAAA,QAAQ,EAAEuE,MAAM,CAACtC,gBAAEC,GAAF,CAAMlE,OAAN,EAAe,yBAAf,EAA0C,CAA1C,CAAD,CAHD;AAIfiC,IAAAA,QAAQ,EAAEsE,MAAM,CAACtC,gBAAEC,GAAF,CAAMlE,OAAN,EAAe,yBAAf,EAA0C,CAA1C,CAAD,CAJD;AAMf;AACAC,IAAAA,iBAAiB,EAAEgE,gBAAEC,GAAF,CAAMlE,OAAN,EAAe,kCAAf,KAAsD,EAP1D;AASf;AACAwG,IAAAA,cAAc,EAAEvC,gBAAEC,GAAF,CAAMlE,OAAN,EAAe,+BAAf,KAAmD,EAVpD;AAYf;AACA6B,IAAAA,oBAAoB,EAAEoC,gBAAEC,GAAF,CAAMlE,OAAN,EAAe,qCAAf,CAbP;AAcf8B,IAAAA,sBAAsB,EAAEmC,gBAAEC,GAAF,CAAMlE,OAAN,EAAe,uCAAf,CAdT;AAef+B,IAAAA,2BAA2B,EAAEkC,gBAAEC,GAAF,CAAMlE,OAAN,EAAe,4CAAf,CAfd;AAiBf;AACAE,IAAAA,IAAI,EAAE+D,gBAAEC,GAAF,CAAMlE,OAAN,EAAe,qBAAf,KAAyC;AAlBhC,GAAjB;AAoBA;;AAEA,SAAOuB,QAAP;AACD,CAzBD;AA2BA;;;;;;;;;;AAMA,MAAMkF,UAAU,GAAG,CAACzG,OAAD,EAAUlB,WAAV,KAA0B;AAC3C,QAAMwB,MAAM,GAAG,CAACD,OAAD,EAAUqG,GAAG,GAAG,IAAhB,EAAsBC,QAAQ,GAAG,IAAjC,EAAuCjI,IAAI,GAAG,IAA9C,KAAuD;AACpE,QAAI6B,GAAJ;;AAEA,QAAIoG,QAAJ,EAAc;AACZ,YAAMC,UAAU,GAAG9H,WAAW,CAACyB,GAAZ,CAAgBC,KAAhB,CAAsBE,IAAtB,GAA6BiG,QAAQ,CAACjG,IAAzD;AAEAH,MAAAA,GAAG,GAAG;AACJsG,QAAAA,GAAG,EAAE;AAACnG,UAAAA,IAAI,EAAEkG;AAAP,SADD;AAEJpG,QAAAA,KAAK,EAAE;AAACE,UAAAA,IAAI,EAAEkG;AAAP;AAFH,OAAN;;AAIA,UAAID,QAAQ,CAAClG,MAAb,EAAqB;AACnB,cAAMqG,SAAS,GAAGhI,WAAW,CAACyB,GAAZ,CAAgBC,KAAhB,CAAsBC,MAAtB,GAA+BkG,QAAQ,CAAClG,MAA1D;AAEAF,QAAAA,GAAG,CAACsG,GAAJ,CAAQpG,MAAR,GAAiBqG,SAAjB;AACAvG,QAAAA,GAAG,CAACC,KAAJ,CAAUC,MAAV,GAAmBqG,SAAnB;AACD;AACF;;AAED9G,IAAAA,OAAO,CAACM,MAAR,CAAe;AACb5B,MAAAA,IADa;AAEbgI,MAAAA,GAFa;AAGbnG,MAAAA,GAHa;AAIbF,MAAAA,OAJa;AAKbe,MAAAA,IAAI,EAAEtC;AALO,KAAf;AAOD,GAzBD;;AA2BA,SAAOwB,MAAP;AACD,CA7BD;AA+BA;;;;;;;;;;;;;;;;;;;AAkBA,MAAMyG,OAAO,GAAG,CACdC,UADc,EACFhH,OADE,EACOiH,KADP,EACc3F,SADd,EACyBF,IADzB,EAC+BG,QAD/B,EAEdI,UAFc,EAEFuF,QAFE,EAEQC,KAFR,EAEe3F,YAFf,KAGX;AACH,QAAM4F,UAAU,GAAGH,KAAK,CAAC3F,SAAS,CAACf,GAAV,CAAcC,KAAd,CAAoBE,IAApB,GAA2B,CAA5B,CAAxB;AACA,QAAM3B,MAAM,GAAGqI,UAAU,CAACC,MAAX,CAAkB,CAAlB,EAAqBxB,MAArB,CAA4BvE,SAAS,CAACf,GAAV,CAAcC,KAAd,CAAoBC,MAAhD,CAAf;AACA,QAAMY,KAAK,GAAGxC,YAAY,CAACyC,SAAD,EAAYvC,MAAZ,EAAoB,CAACiI,UAAU,CAACM,MAAhC,CAA1B;AACA,QAAMhH,MAAM,GAAGmG,UAAU,CAACzG,OAAD,EAAUsB,SAAV,CAAzB;AAEA,QAAMnB,KAAK,GAAGgB,QAAQ,CACpBC,IADoB,EAEpBC,KAFoB,EAGpBC,SAHoB,EAIpBC,QAJoB,EAKpBjB,MALoB,EAMpBN,OANoB,EAOpBwB,YAPoB,CAAtB;;AAUA,MACED,QAAQ,CAAC+E,aAAT,IACA,CAACU,UAAU,CAACO,YADZ,KAECpH,KAAK,CAACuD,MAAN,CAAa,SAAb,KAA2BO,gBAAEiB,MAAF,CAAS7D,KAAK,CAAC8D,IAAf,EAAqB;AAC/CxG,IAAAA,GAAG,EAAE;AAD0C,GAArB,EAEzB6I,IAFyB,CAEpB,CAAC;AAAC5H,IAAAA;AAAD,GAAD,KAAmB;AACzB,WAAOA,WAAW,KAAK,SAAvB;AACD,GAJ2B,CAF5B,CADF,EAQE;AACA;AACD;;AAEDsH,EAAAA,QAAQ,CAAC;AACPlH,IAAAA,OADO;AAEP3B,IAAAA,WAFO;AAGPU,IAAAA,MAHO;AAIPyC,IAAAA,YAJO;AAKPH,IAAAA,KALO;AAMPC,IAAAA,SANO;AAOPF,IAAAA,IAPO;AAQPd,IAAAA,MARO;AASPiB,IAAAA,QATO;AAUPI,IAAAA,UAVO;AAWPwF,IAAAA,KAXO;AAYPhH,IAAAA;AAZO,GAAD,CAAR;AAcD,CA7CD;AA+CA;;;;;;;;;AAOA,MAAMsH,gBAAgB,GAAG,CAACP,QAAD,EAAWF,UAAX,KAA0B;AACjD,QAAMU,aAAa,GAAG,EAAtB;;AAEA,QAAMC,YAAY,GAAG,CAAC3H,OAAD,EAAUoB,IAAV,EAAgBwG,UAAhB,EAA4BT,KAA5B,EAAmCU,QAAnC,KAAgD;AACnE,UAAMlG,UAAU,GAAG3B,OAAO,CAAC4B,aAAR,EAAnB;AACA,UAAML,QAAQ,GAAG8E,WAAW,CAACrG,OAAD,CAA5B;AAFmE,UAG5DiH,KAH4D,GAGnDtF,UAHmD,CAG5DsF,KAH4D;AAKnE,UAAM9G,KAAK,GAAGJ,aAAa,CAACC,OAAD,EAAUuB,QAAV,CAA3B;AACAqG,IAAAA,UAAU,CAACzB,OAAX,CAAoB7E,SAAD,IAAe;AAChC,UAAI,CAAE,WAAD,CAAcwG,IAAd,CAAmBnG,UAAU,CAACoG,OAAX,CAAmBzG,SAAnB,CAAnB,CAAL,EAAwD;AACtD;AACD;;AACDyF,MAAAA,OAAO,CACLC,UADK,EACOhH,OADP,EACgBiH,KADhB,EACuB3F,SADvB,EACkCF,IADlC,EAELG,QAFK,EAEKI,UAFL,EAEiBuF,QAFjB,EAGLC,KAHK,EAGE,IAHF,CAAP;AAKD,KATD;;AAUA,QAAIU,QAAQ,IAAIb,UAAU,CAACgB,IAA3B,EAAiC;AAC/BhB,MAAAA,UAAU,CAACgB,IAAX,CAAgB;AACdhI,QAAAA,OADc;AAEdmH,QAAAA,KAFc;AAGdhH,QAAAA;AAHc,OAAhB;AAKD;AACF,GAvBD;;AAyBA,SAAO;AACL8H,IAAAA,MAAM,CAAEjI,OAAF,EAAW;AACf,YAAM2B,UAAU,GAAG3B,OAAO,CAAC4B,aAAR,EAAnB;AACA,YAAML,QAAQ,GAAG8E,WAAW,CAACrG,OAAD,CAA5B;AACA,YAAMmH,KAAK,GAAG,EAAd;AAEA,aAAO;AACL,yBAAkB/F,IAAlB,EAAwB;AACtB,gBAAM8G,WAAW,GAAG,wCAAkB9G,IAAlB,EAAwBO,UAAxB,CAApB;;AAEA,cAAIP,IAAI,KAAK8G,WAAb,EAA0B;AACxB;AACD;;AAED,gBAAMC,OAAO,GAAG,8BAAgBxG,UAAhB,EAA4BP,IAA5B,EAAkCG,QAAlC,CAAhB;;AACA,cAAImG,aAAa,CAACpI,QAAd,CAAuB6I,OAAvB,CAAJ,EAAqC;AACnC;AACD;;AACD,cAAI,CAACA,OAAL,EAAc;AACZ,gBAAInB,UAAU,CAACoB,UAAf,EAA2B;AACzBpB,cAAAA,UAAU,CAACoB,UAAX,CAAsB;AACpBhH,gBAAAA,IADoB;AAEpB+F,gBAAAA;AAFoB,eAAtB;AAID;;AAED;AACD;;AAEDO,UAAAA,aAAa,CAACW,IAAd,CAAmBF,OAAnB;AACAR,UAAAA,YAAY,CAAC3H,OAAD,EAAUoB,IAAV,EAAgB,CAAC+G,OAAD,CAAhB,EAA2BhB,KAA3B,CAAZ;AACD,SAzBI;;AA0BL,yBAAkB;AAChB,gBAAMmB,WAAW,GAAG3G,UAAU,CAAC4G,cAAX,EAApB;AACA,gBAAMC,cAAc,GAAGF,WAAW,CAACpD,MAAZ,CAAoB9D,IAAD,IAAU;AAClD,mBAAO,CAACsG,aAAa,CAACpI,QAAd,CAAuB8B,IAAvB,CAAR;AACD,WAFsB,CAAvB;AAIAuG,UAAAA,YAAY,CAAC3H,OAAD,EAAU,IAAV,EAAgBwI,cAAhB,EAAgCrB,KAAhC,EAAuC,IAAvC,CAAZ;AACD;;AAjCI,OAAP;AAmCD,KAzCI;;AA0CLsB,IAAAA,IAAI,EAAEzB,UAAU,CAACyB;AA1CZ,GAAP;AA4CD,CAxED;AA0EA;;;;;;;;;AAOA,MAAMC,SAAS,GAAG,CAACxB,QAAD,EAAWF,UAAX,KAA0B;AAC1C,SAAO;AACLiB,IAAAA,MAAM,CAAEjI,OAAF,EAAW;AACf,YAAM2B,UAAU,GAAG3B,OAAO,CAAC4B,aAAR,EAAnB;AACA,YAAML,QAAQ,GAAG8E,WAAW,CAACrG,OAAD,CAA5B;AAEA,aAAO;AACL,yBAAkB;AAChB,gBAAMsI,WAAW,GAAG3G,UAAU,CAAC4G,cAAX,EAApB;AADgB,gBAETtB,KAFS,GAEAtF,UAFA,CAETsF,KAFS;AAGhB,gBAAM9G,KAAK,GAAGJ,aAAa,CAACC,OAAD,EAAUuB,QAAV,CAA3B;AAEA2F,UAAAA,QAAQ,CAAC;AACPoB,YAAAA,WADO;AAEPtI,YAAAA,OAFO;AAGPiH,YAAAA,KAHO;AAIPR,YAAAA,UAJO;AAKPlF,YAAAA,QALO;AAMPI,YAAAA,UANO;AAOPxB,YAAAA;AAPO,WAAD,CAAR;AASD;;AAfI,OAAP;AAiBD,KAtBI;;AAuBLsI,IAAAA,IAAI,EAAEzB,UAAU,CAACyB;AAvBZ,GAAP;AAyBD,CA1BD;;AAiCA;;;;;;;;AAQe,SAASE,YAAT,CAAuBzB,QAAvB,EAAiCF,UAAjC,EAA6C;AAC1D,QAAM4B,QAAQ,GAAG3E,gBAAEC,GAAF,CAAM8C,UAAN,EAAkB,WAAlB,CAAjB;;AACA,MAAI,CAAC4B,QAAD,IAAa,CAAC,CAAC,SAAD,EAAY,YAAZ,EAA0B,QAA1B,EAAoCtJ,QAApC,CAA6CsJ,QAA7C,CAAlB,EAA0E;AACxE,UAAM,IAAIC,SAAJ,CAAc,wFAAd,CAAN;AACD;;AACD,MAAI,OAAO3B,QAAP,KAAoB,UAAxB,EAAoC;AAClC,UAAM,IAAI2B,SAAJ,CAAc,2CAAd,CAAN;AACD;;AAED,MAAI7B,UAAU,CAAC0B,SAAf,EAA0B;AACxB,WAAOA,SAAS,CAACxB,QAAD,EAAWF,UAAX,CAAhB;AACD;;AAED,MAAIA,UAAU,CAACS,gBAAf,EAAiC;AAC/B,WAAOA,gBAAgB,CAACP,QAAD,EAAWF,UAAX,CAAvB;AACD;;AAED,SAAO;AACL;;;;;;;;;AASAiB,IAAAA,MAAM,CAAEjI,OAAF,EAAW;AACf,UAAI8I,QAAJ;;AACA,UAAI9B,UAAU,CAAC+B,eAAf,EAAgC;AAC9BD,QAAAA,QAAQ,GAAGhI,oBAAWkI,gBAAX,CAA4BhJ,OAA5B,EAAqCgH,UAAU,CAAC+B,eAAhD,CAAX;;AACA,YAAID,QAAQ,CAACxJ,QAAT,CAAkB,KAAlB,CAAJ,EAA8B;AAC5B,iBAAOmI,gBAAgB,CAACP,QAAD,EAAWF,UAAX,CAAhB,CAAuCiB,MAAvC,CAA8CjI,OAA9C,CAAP;AACD;AACF;;AAED,YAAM2B,UAAU,GAAG3B,OAAO,CAAC4B,aAAR,EAAnB;AACA,YAAML,QAAQ,GAAG8E,WAAW,CAACrG,OAAD,CAA5B;AAVe,YAWRiH,KAXQ,GAWCtF,UAXD,CAWRsF,KAXQ;;AAaf,YAAMgC,UAAU,GAAI7H,IAAD,IAAU;AAC3B,cAAME,SAAS,GAAG,8BAAgBK,UAAhB,EAA4BP,IAA5B,EAAkCG,QAAlC,CAAlB;;AAEA,YAAI,CAACD,SAAL,EAAgB;AACd;AACD;;AAEDyF,QAAAA,OAAO,CACLC,UADK,EACOhH,OADP,EACgBiH,KADhB,EACuB3F,SADvB,EACkCF,IADlC,EAELG,QAFK,EAEKI,UAFL,EAEiBuF,QAFjB,CAAP;AAID,OAXD;;AAaA,UAAIF,UAAU,CAAC+B,eAAf,EAAgC;AAC9B,eAAOjI,oBAAWoI,gBAAX,CAA4BJ,QAA5B,EAAsCG,UAAtC,CAAP;AACD;;AAED,aAAO;AACLE,QAAAA,uBAAuB,EAAEF,UADpB;AAELG,QAAAA,mBAAmB,EAAEH,UAFhB;AAGLI,QAAAA,kBAAkB,EAAEJ;AAHf,OAAP;AAKD,KA7CI;;AA8CLR,IAAAA,IAAI,EAAEzB,UAAU,CAACyB;AA9CZ,GAAP;AAgDD","sourcesContent":["// eslint-disable-next-line import/no-named-default\nimport {default as commentParser, stringify as commentStringify} from 'comment-parser';\nimport _ from 'lodash';\nimport jsdocUtils from './jsdocUtils';\nimport getJSDocComment, {getReducedASTNode} from './eslint/getJSDocComment';\n\nconst globalState = new Map();\n\nconst skipSeeLink = (parser) => {\n  return (str, data) => {\n    if (data.tag === 'see' && str.match(/\\{@link.+?\\}/u)) {\n      return null;\n    }\n\n    return parser(str, data);\n  };\n};\n\n/**\n *\n * @param {object} commentNode\n * @param {string} indent Whitespace\n * @param {boolean} [trim=true]\n * @returns {object}\n */\nconst parseComment = (commentNode, indent, trim = true) => {\n  // Preserve JSDoc block start/end indentation.\n  return commentParser(`${indent}/*${commentNode.value}${indent}*/`, {\n    // @see https://github.com/yavorskiy/comment-parser/issues/21\n    parsers: [\n      commentParser.PARSERS.parse_tag,\n      skipSeeLink(\n        (str, data) => {\n          if (['default', 'defaultvalue'].includes(data.tag)) {\n            return null;\n          }\n\n          return commentParser.PARSERS.parse_type(str, data);\n        },\n      ),\n      skipSeeLink(\n        (str, data) => {\n          if ([\n            'example', 'return', 'returns', 'throws', 'exception',\n            'access', 'version', 'since', 'license', 'author',\n            'default', 'defaultvalue',\n          ].includes(data.tag)) {\n            return null;\n          }\n\n          return commentParser.PARSERS.parse_name(str, data);\n        },\n      ),\n\n      // parse_description\n      (str, data) => {\n        // Only expected throw in previous step is if bad name (i.e.,\n        //   missing end bracket on optional name), but `@example`\n        //  skips name parsing\n        /* istanbul ignore next */\n        if (data.errors && data.errors.length) {\n          return null;\n        }\n\n        // Tweak original regex to capture only single optional space\n        const result = str.match(/^ ?((.|\\s)+)?/u);\n\n        // Always has at least whitespace due to `indent` we've added\n        /* istanbul ignore next */\n        if (result) {\n          return {\n            data: {\n              description: result[1] === undefined ? '' : result[1],\n            },\n            source: result[0],\n          };\n        }\n\n        // Always has at least whitespace due to `indent` we've added\n        /* istanbul ignore next */\n        return null;\n      },\n    ],\n    trim,\n  })[0] || {};\n};\n\nconst getBasicUtils = (context, {tagNamePreference, mode}) => {\n  const utils = {};\n  utils.reportSettings = (message) => {\n    context.report({\n      loc: {\n        start: {\n          column: 1,\n          line: 1,\n        },\n      },\n      message,\n    });\n  };\n\n  utils.getPreferredTagNameObject = ({tagName}) => {\n    const ret = jsdocUtils.getPreferredTagName(context, mode, tagName, tagNamePreference);\n    const isObject = ret && typeof ret === 'object';\n    if (ret === false || isObject && !ret.replacement) {\n      return {\n        blocked: true,\n        tagName,\n      };\n    }\n\n    return ret;\n  };\n\n  return utils;\n};\n\nconst getUtils = (\n  node,\n  jsdoc,\n  jsdocNode,\n  settings,\n  report,\n  context,\n  iteratingAll,\n) => {\n  const ancestors = context.getAncestors();\n  const sourceCode = context.getSourceCode();\n\n  const utils = getBasicUtils(context, settings);\n\n  const {\n    tagNamePreference,\n    overrideReplacesDocs,\n    implementsReplacesDocs,\n    augmentsExtendsReplacesDocs,\n    maxLines,\n    minLines,\n    mode,\n  } = settings;\n\n  utils.isIteratingFunction = () => {\n    return !iteratingAll || [\n      'ArrowFunctionExpression',\n      'FunctionDeclaration',\n      'FunctionExpression',\n    ].includes(node && node.type);\n  };\n\n  utils.isVirtualFunction = () => {\n    return iteratingAll && utils.hasATag(['callback', 'function', 'func', 'method']);\n  };\n\n  utils.stringify = (tagBlock) => {\n    const indent = jsdocUtils.getIndent(sourceCode);\n\n    return commentStringify([tagBlock], {indent}).slice(indent.length - 1);\n  };\n\n  utils.reportJSDoc = (msg, tag, handler) => {\n    report(msg, handler ? (fixer) => {\n      handler();\n      const replacement = utils.stringify(jsdoc);\n\n      return fixer.replaceText(jsdocNode, replacement);\n    } : null, tag);\n  };\n\n  utils.getFunctionParameterNames = () => {\n    return jsdocUtils.getFunctionParameterNames(node);\n  };\n\n  utils.isConstructor = () => {\n    return node && node.parent && node.parent.kind === 'constructor';\n  };\n\n  utils.isSetter = () => {\n    return node && node.parent.kind === 'set';\n  };\n\n  utils.getJsdocTagsDeep = (tagName) => {\n    const name = utils.getPreferredTagName({tagName});\n    if (!name) {\n      return false;\n    }\n\n    return jsdocUtils.getJsdocTagsDeep(jsdoc, name);\n  };\n\n  utils.getJsdocTags = (tagName) => {\n    const name = utils.getPreferredTagName({tagName});\n    if (!name) {\n      return false;\n    }\n\n    return jsdocUtils.getJsdocTags(jsdoc, name);\n  };\n\n  utils.getPreferredTagName = ({tagName, skipReportingBlockedTag = false, allowObjectReturn = false, defaultMessage = `Unexpected tag \\`@${tagName}\\``}) => {\n    const ret = jsdocUtils.getPreferredTagName(context, mode, tagName, tagNamePreference);\n    const isObject = ret && typeof ret === 'object';\n    if (utils.hasTag(tagName) && (ret === false || isObject && !ret.replacement)) {\n      if (skipReportingBlockedTag) {\n        return {\n          blocked: true,\n          tagName,\n        };\n      }\n      const message = isObject && ret.message || defaultMessage;\n      report(message, null, utils.getTags(tagName)[0]);\n\n      return false;\n    }\n\n    return isObject && !allowObjectReturn ? ret.replacement : ret;\n  };\n\n  utils.isValidTag = (name, definedTags) => {\n    return jsdocUtils.isValidTag(context, mode, name, definedTags);\n  };\n\n  utils.hasATag = (name) => {\n    return jsdocUtils.hasATag(jsdoc, name);\n  };\n\n  utils.hasTag = (name) => {\n    return jsdocUtils.hasTag(jsdoc, name);\n  };\n\n  utils.avoidDocs = () => {\n    if (\n      overrideReplacesDocs !== false &&\n        (utils.hasTag('override') || utils.classHasTag('override')) ||\n      implementsReplacesDocs !== false &&\n        (utils.hasTag('implements') || utils.classHasTag('implements')) ||\n\n      // inheritdoc implies that all documentation is inherited; see https://jsdoc.app/tags-inheritdoc.html\n      utils.hasTag('inheritdoc') ||\n\n      augmentsExtendsReplacesDocs &&\n        (utils.hasATag(['augments', 'extends']) ||\n          utils.classHasTag('augments') ||\n            utils.classHasTag('extends'))) {\n      return true;\n    }\n\n    const exemptedBy = _.get(context, 'options[0].exemptedBy');\n    if (exemptedBy && exemptedBy.length && utils.getPresentTags(exemptedBy).length) {\n      return true;\n    }\n\n    return false;\n  };\n\n  utils.tagMustHaveEitherTypeOrNamePosition = (tagName) => {\n    return jsdocUtils.tagMustHaveEitherTypeOrNamePosition(tagName);\n  };\n\n  utils.tagMightHaveEitherTypeOrNamePosition = (tagName) => {\n    return jsdocUtils.tagMightHaveEitherTypeOrNamePosition(mode, tagName);\n  };\n\n  utils.tagMustHaveNamePosition = (tagName) => {\n    return jsdocUtils.tagMustHaveNamePosition(tagName);\n  };\n\n  utils.tagMightHaveNamePosition = (tagName) => {\n    return jsdocUtils.tagMightHaveNamePosition(tagName);\n  };\n\n  utils.tagMustHaveTypePosition = (tagName) => {\n    return jsdocUtils.tagMustHaveTypePosition(mode, tagName);\n  };\n\n  utils.tagMightHaveTypePosition = (tagName) => {\n    return jsdocUtils.tagMightHaveTypePosition(mode, tagName);\n  };\n\n  utils.isNamepathDefiningTag = (tagName) => {\n    return jsdocUtils.isNamepathDefiningTag(tagName);\n  };\n\n  utils.hasDefinedTypeReturnTag = (tag) => {\n    return jsdocUtils.hasDefinedTypeReturnTag(tag);\n  };\n\n  utils.hasReturnValue = () => {\n    return jsdocUtils.hasReturnValue(node);\n  };\n\n  utils.isAsync = () => {\n    return node.async;\n  };\n\n  utils.getTags = (tagName) => {\n    return utils.filterTags((item) => {\n      return item.tag === tagName;\n    });\n  };\n\n  utils.getPresentTags = (tagList) => {\n    return utils.filterTags((tag) => {\n      return tagList.includes(tag.tag);\n    });\n  };\n\n  utils.filterTags = (filter) => {\n    return jsdocUtils.filterTags(jsdoc.tags, filter);\n  };\n\n  utils.getTagsByType = (tags) => {\n    return jsdocUtils.getTagsByType(context, mode, tags, tagNamePreference);\n  };\n\n  utils.hasOptionTag = (tagName) => {\n    const tags = _.get(context, 'options[0].tags');\n\n    return Boolean(tags && tags.includes(tagName));\n  };\n\n  utils.getClassNode = () => {\n    return [...ancestors, node].reverse().find((parent) => {\n      return parent && ['ClassDeclaration', 'ClassExpression'].includes(parent.type);\n    }) || null;\n  };\n\n  utils.getClassJsdoc = () => {\n    const classNode = utils.getClassNode();\n\n    if (!classNode) {\n      return null;\n    }\n\n    const classJsdocNode = getJSDocComment(sourceCode, classNode, {\n      maxLines,\n      minLines,\n    });\n\n    if (classJsdocNode) {\n      const indent = ' '.repeat(classJsdocNode.loc.start.column);\n\n      return parseComment(classJsdocNode, indent);\n    }\n\n    return null;\n  };\n\n  utils.classHasTag = (tagName) => {\n    const classJsdoc = utils.getClassJsdoc();\n\n    return Boolean(classJsdoc) && jsdocUtils.hasTag(classJsdoc, tagName);\n  };\n\n  utils.forEachPreferredTag = (tagName, arrayHandler, skipReportingBlockedTag = false) => {\n    const targetTagName = utils.getPreferredTagName({\n      skipReportingBlockedTag,\n      tagName,\n    });\n    if (!targetTagName ||\n      skipReportingBlockedTag && targetTagName && typeof targetTagName === 'object'\n    ) {\n      return;\n    }\n    const matchingJsdocTags = _.filter(jsdoc.tags || [], {\n      tag: targetTagName,\n    });\n\n    matchingJsdocTags.forEach((matchingJsdocTag) => {\n      arrayHandler(matchingJsdocTag, targetTagName);\n    });\n  };\n\n  return utils;\n};\n\nconst getSettings = (context) => {\n  /* eslint-disable sort-keys-fix/sort-keys-fix */\n  const settings = {\n    // All rules\n    ignorePrivate: Boolean(_.get(context, 'settings.jsdoc.ignorePrivate')),\n    maxLines: Number(_.get(context, 'settings.jsdoc.maxLines', 1)),\n    minLines: Number(_.get(context, 'settings.jsdoc.minLines', 0)),\n\n    // `check-tag-names` and many returns/param rules\n    tagNamePreference: _.get(context, 'settings.jsdoc.tagNamePreference') || {},\n\n    // `check-types` and `no-undefined-types`\n    preferredTypes: _.get(context, 'settings.jsdoc.preferredTypes') || {},\n\n    // `require-param`, `require-description`, `require-example`, `require-returns`\n    overrideReplacesDocs: _.get(context, 'settings.jsdoc.overrideReplacesDocs'),\n    implementsReplacesDocs: _.get(context, 'settings.jsdoc.implementsReplacesDocs'),\n    augmentsExtendsReplacesDocs: _.get(context, 'settings.jsdoc.augmentsExtendsReplacesDocs'),\n\n    // Many rules, e.g., `check-tag-names`\n    mode: _.get(context, 'settings.jsdoc.mode') || 'jsdoc',\n  };\n  /* eslint-enable sort-keys-fix/sort-keys-fix */\n\n  return settings;\n};\n\n/**\n * Create the report function\n *\n * @param {object} context\n * @param {object} commentNode\n */\nconst makeReport = (context, commentNode) => {\n  const report = (message, fix = null, jsdocLoc = null, data = null) => {\n    let loc;\n\n    if (jsdocLoc) {\n      const lineNumber = commentNode.loc.start.line + jsdocLoc.line;\n\n      loc = {\n        end: {line: lineNumber},\n        start: {line: lineNumber},\n      };\n      if (jsdocLoc.column) {\n        const colNumber = commentNode.loc.start.column + jsdocLoc.column;\n\n        loc.end.column = colNumber;\n        loc.start.column = colNumber;\n      }\n    }\n\n    context.report({\n      data,\n      fix,\n      loc,\n      message,\n      node: commentNode,\n    });\n  };\n\n  return report;\n};\n\n/**\n * @typedef {ReturnType<typeof getUtils>} Utils\n * @typedef {ReturnType<typeof getSettings>} Settings\n * @typedef {(\n *   arg: {\n *     context: object,\n *     sourceCode: object,\n *     indent: string,\n *     jsdoc: object,\n *     jsdocNode: object,\n *     node: object | null,\n *     report: ReturnType<typeof makeReport>,\n *     settings: Settings,\n *     utils: Utils,\n *   }\n * ) => any } JsdocVisitor\n */\n\nconst iterate = (\n  ruleConfig, context, lines, jsdocNode, node, settings,\n  sourceCode, iterator, state, iteratingAll,\n) => {\n  const sourceLine = lines[jsdocNode.loc.start.line - 1];\n  const indent = sourceLine.charAt(0).repeat(jsdocNode.loc.start.column);\n  const jsdoc = parseComment(jsdocNode, indent, !ruleConfig.noTrim);\n  const report = makeReport(context, jsdocNode);\n\n  const utils = getUtils(\n    node,\n    jsdoc,\n    jsdocNode,\n    settings,\n    report,\n    context,\n    iteratingAll,\n  );\n\n  if (\n    settings.ignorePrivate &&\n    !ruleConfig.checkPrivate &&\n    (utils.hasTag('private') || _.filter(jsdoc.tags, {\n      tag: 'access',\n    }).some(({description}) => {\n      return description === 'private';\n    }))\n  ) {\n    return;\n  }\n\n  iterator({\n    context,\n    globalState,\n    indent,\n    iteratingAll,\n    jsdoc,\n    jsdocNode,\n    node,\n    report,\n    settings,\n    sourceCode,\n    state,\n    utils,\n  });\n};\n\n/**\n * Create an eslint rule that iterates over all JSDocs, regardless of whether\n * they are attached to a function-like node.\n *\n * @param {JsdocVisitor} iterator\n * @param {{meta: any}} ruleConfig\n */\nconst iterateAllJsdocs = (iterator, ruleConfig) => {\n  const trackedJsdocs = [];\n\n  const callIterator = (context, node, jsdocNodes, state, lastCall) => {\n    const sourceCode = context.getSourceCode();\n    const settings = getSettings(context);\n    const {lines} = sourceCode;\n\n    const utils = getBasicUtils(context, settings);\n    jsdocNodes.forEach((jsdocNode) => {\n      if (!(/^\\/\\*\\*\\s/).test(sourceCode.getText(jsdocNode))) {\n        return;\n      }\n      iterate(\n        ruleConfig, context, lines, jsdocNode, node,\n        settings, sourceCode, iterator,\n        state, true,\n      );\n    });\n    if (lastCall && ruleConfig.exit) {\n      ruleConfig.exit({\n        context,\n        state,\n        utils,\n      });\n    }\n  };\n\n  return {\n    create (context) {\n      const sourceCode = context.getSourceCode();\n      const settings = getSettings(context);\n      const state = {};\n\n      return {\n        '*:not(Program)' (node) {\n          const reducedNode = getReducedASTNode(node, sourceCode);\n\n          if (node !== reducedNode) {\n            return;\n          }\n\n          const comment = getJSDocComment(sourceCode, node, settings);\n          if (trackedJsdocs.includes(comment)) {\n            return;\n          }\n          if (!comment) {\n            if (ruleConfig.nonComment) {\n              ruleConfig.nonComment({\n                node,\n                state,\n              });\n            }\n\n            return;\n          }\n\n          trackedJsdocs.push(comment);\n          callIterator(context, node, [comment], state);\n        },\n        'Program:exit' () {\n          const allComments = sourceCode.getAllComments();\n          const untrackedJSdoc = allComments.filter((node) => {\n            return !trackedJsdocs.includes(node);\n          });\n\n          callIterator(context, null, untrackedJSdoc, state, true);\n        },\n      };\n    },\n    meta: ruleConfig.meta,\n  };\n};\n\n/**\n * Create an eslint rule that iterates over all JSDocs, regardless of whether\n * they are attached to a function-like node.\n *\n * @param {JsdocVisitor} iterator\n * @param {{meta: any}} ruleConfig\n */\nconst checkFile = (iterator, ruleConfig) => {\n  return {\n    create (context) {\n      const sourceCode = context.getSourceCode();\n      const settings = getSettings(context);\n\n      return {\n        'Program:exit' () {\n          const allComments = sourceCode.getAllComments();\n          const {lines} = sourceCode;\n          const utils = getBasicUtils(context, settings);\n\n          iterator({\n            allComments,\n            context,\n            lines,\n            makeReport,\n            settings,\n            sourceCode,\n            utils,\n          });\n        },\n      };\n    },\n    meta: ruleConfig.meta,\n  };\n};\n\nexport {\n  getSettings,\n  parseComment,\n};\n\n/**\n * @param {JsdocVisitor} iterator\n * @param {{\n *   meta: any,\n *   contextDefaults?: true | string[],\n *   iterateAllJsdocs?: true,\n * }} ruleConfig\n */\nexport default function iterateJsdoc (iterator, ruleConfig) {\n  const metaType = _.get(ruleConfig, 'meta.type');\n  if (!metaType || !['problem', 'suggestion', 'layout'].includes(metaType)) {\n    throw new TypeError('Rule must include `meta.type` option (with value \"problem\", \"suggestion\", or \"layout\")');\n  }\n  if (typeof iterator !== 'function') {\n    throw new TypeError('The iterator argument must be a function.');\n  }\n\n  if (ruleConfig.checkFile) {\n    return checkFile(iterator, ruleConfig);\n  }\n\n  if (ruleConfig.iterateAllJsdocs) {\n    return iterateAllJsdocs(iterator, ruleConfig);\n  }\n\n  return {\n    /**\n     * The entrypoint for the JSDoc rule.\n     *\n     * @param {*} context\n     *   a reference to the context which hold all important information\n     *   like settings and the sourcecode to check.\n     * @returns {object}\n     *   a list with parser callback function.\n     */\n    create (context) {\n      let contexts;\n      if (ruleConfig.contextDefaults) {\n        contexts = jsdocUtils.enforcedContexts(context, ruleConfig.contextDefaults);\n        if (contexts.includes('any')) {\n          return iterateAllJsdocs(iterator, ruleConfig).create(context);\n        }\n      }\n\n      const sourceCode = context.getSourceCode();\n      const settings = getSettings(context);\n      const {lines} = sourceCode;\n\n      const checkJsdoc = (node) => {\n        const jsdocNode = getJSDocComment(sourceCode, node, settings);\n\n        if (!jsdocNode) {\n          return;\n        }\n\n        iterate(\n          ruleConfig, context, lines, jsdocNode, node,\n          settings, sourceCode, iterator,\n        );\n      };\n\n      if (ruleConfig.contextDefaults) {\n        return jsdocUtils.getContextObject(contexts, checkJsdoc);\n      }\n\n      return {\n        ArrowFunctionExpression: checkJsdoc,\n        FunctionDeclaration: checkJsdoc,\n        FunctionExpression: checkJsdoc,\n      };\n    },\n    meta: ruleConfig.meta,\n  };\n}\n"],"file":"iterateJsdoc.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js b/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js
deleted file mode 100644
index 884461a..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js
+++ /dev/null
@@ -1,464 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _lodash = _interopRequireDefault(require("lodash"));
-
-var _tagNames = require("./tagNames");
-
-var _WarnSettings = _interopRequireDefault(require("./WarnSettings"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const getFunctionParameterNames = functionNode => {
-  const getParamName = param => {
-    if (_lodash.default.has(param, 'name')) {
-      return param.name;
-    }
-
-    if (_lodash.default.has(param, 'left.name')) {
-      return param.left.name;
-    }
-
-    if (param.type === 'ObjectPattern' || _lodash.default.get(param, 'left.type') === 'ObjectPattern') {
-      return '<ObjectPattern>';
-    }
-
-    if (param.type === 'ArrayPattern' || _lodash.default.get(param, 'left.type') === 'ArrayPattern') {
-      return '<ArrayPattern>';
-    }
-
-    if (param.type === 'RestElement') {
-      return param.argument.name;
-    }
-
-    if (param.type === 'TSParameterProperty') {
-      return getParamName(param.parameter);
-    }
-
-    throw new Error('Unsupported function signature format.');
-  };
-
-  return functionNode.params.map(getParamName);
-};
-/**
- * Gets all names of the target type, including those that refer to a path, e.g.
- * "@param foo; @param foo.bar".
- */
-
-
-const getJsdocTagsDeep = (jsdoc, targetTagName) => {
-  return (jsdoc.tags || []).reduce((arr, {
-    name,
-    tag
-  }, idx) => {
-    if (tag !== targetTagName) {
-      return arr;
-    }
-
-    arr.push({
-      idx,
-      name
-    });
-    return arr;
-  }, []);
-};
-
-const getJsdocTags = (jsdoc, targetTagName) => {
-  let jsdocNames;
-  jsdocNames = getJsdocTagsDeep(jsdoc, targetTagName);
-  jsdocNames = jsdocNames.filter(({
-    name
-  }) => {
-    return !name.includes('.');
-  });
-  return jsdocNames;
-};
-
-const modeWarnSettings = (0, _WarnSettings.default)();
-
-const getTagNamesForMode = (mode, context) => {
-  switch (mode) {
-    case 'jsdoc':
-      return _tagNames.jsdocTags;
-
-    case 'typescript':
-      return _tagNames.typeScriptTags;
-
-    case 'closure':
-      return _tagNames.closureTags;
-
-    default:
-      if (!modeWarnSettings.hasBeenWarned(context, 'mode')) {
-        context.report({
-          loc: {
-            start: {
-              column: 1,
-              line: 1
-            }
-          },
-          message: `Unrecognized value \`${mode}\` for \`settings.jsdoc.mode\`.`
-        });
-        modeWarnSettings.markSettingAsWarned(context, 'mode');
-      } // We'll avoid breaking too many other rules
-
-
-      return _tagNames.jsdocTags;
-  }
-};
-
-const getPreferredTagName = (context, mode, name, tagPreference = {}) => {
-  const prefValues = _lodash.default.values(tagPreference);
-
-  if (prefValues.includes(name) || prefValues.some(prefVal => {
-    return prefVal && typeof prefVal === 'object' && prefVal.replacement === name;
-  })) {
-    return name;
-  }
-
-  if (_lodash.default.has(tagPreference, name)) {
-    return tagPreference[name];
-  }
-
-  const tagNames = getTagNamesForMode(mode, context);
-
-  const preferredTagName = _lodash.default.findKey(tagNames, aliases => {
-    return aliases.includes(name);
-  });
-
-  if (preferredTagName) {
-    return preferredTagName;
-  }
-
-  return name;
-};
-
-const isValidTag = (context, mode, name, definedTags) => {
-  const tagNames = getTagNamesForMode(mode, context);
-
-  const validTagNames = _lodash.default.keys(tagNames).concat(_lodash.default.flatten(_lodash.default.values(tagNames)));
-
-  const additionalTags = definedTags;
-  const allTags = validTagNames.concat(additionalTags);
-  return allTags.includes(name);
-};
-
-const hasTag = (jsdoc, targetTagName) => {
-  const targetTagLower = targetTagName.toLowerCase();
-  return _lodash.default.some(jsdoc.tags, doc => {
-    return doc.tag.toLowerCase() === targetTagLower;
-  });
-};
-
-const hasATag = (jsdoc, targetTagNames) => {
-  return targetTagNames.some(targetTagName => {
-    return hasTag(jsdoc, targetTagName);
-  });
-};
-/**
- * Checks if the JSDoc comment declares a return value.
- *
- * @param {JsDocTag} tag
- *   the tag which should be checked.
- * @returns {boolean}
- *   true in case a return value is declared; otherwise false.
- */
-
-
-const hasDefinedTypeReturnTag = tag => {
-  // The function should not continue in the event @returns is not defined...
-  if (typeof tag === 'undefined' || tag === null) {
-    return false;
-  } // .. same applies if it declares `@returns {undefined}` or `@returns {void}`
-
-
-  const tagType = tag.type.trim();
-
-  if (tagType === 'undefined' || tagType === 'void') {
-    return false;
-  } // In any other case, something must be returned, and
-  // a return statement is expected
-
-
-  return true;
-};
-
-const tagsWithMandatoryTypePosition = [// These both show curly brackets in the doc signature and examples
-// "typeExpression"
-'implements', // "typeName"
-'type'];
-const tagsWithMandatoryTypePositionClosure = [...tagsWithMandatoryTypePosition, 'this', 'define']; // All of these have a signature with "type" except for
-//  `augments`/`extends` ("namepath")
-//  `param`/`arg`/`argument` (no signature)
-//  `property`/`prop` (no signature)
-// `modifies` (undocumented)
-
-const tagsWithOptionalTypePosition = [// These have the example showing curly brackets but not in their doc signature, e.g.: https://jsdoc.app/tags-enum.html
-'enum', 'member', 'var', 'typedef', // These do not show curly brackets in either the signature or examples
-'augments', 'extends', 'class', 'constructor', 'constant', 'const', // These show the signature with curly brackets but not in the example
-'module', 'namespace', // These have no formal signature in the docs but show curly brackets
-//   in the examples
-'param', 'arg', 'argument', 'property', 'prop', // These show curly brackets in the signature and in the examples
-'returns', 'return', 'throws', 'exception', 'yields', 'yield', // Has no documentation, but test example has curly brackets, and
-//  "name" would be suggested rather than "namepath" based on example; not
-//  sure if name is required
-'modifies'];
-const tagsWithOptionalTypePositionClosure = [...tagsWithOptionalTypePosition, 'export', // Shows the signature with curly brackets but not in the example
-// "typeExpression"
-'package', 'private', 'protected', // These do not show a signature nor show curly brackets in the example
-'public', 'static']; // None of these show as having curly brackets for their name/namepath
-
-const namepathDefiningTags = [// These appear to require a "name" in their signature, albeit these
-//  are somewhat different from other "name"'s (including as described
-// at https://jsdoc.app/about-namepaths.html )
-'external', 'host', 'event', // These allow for "name"'s in their signature, but indicate as optional
-'class', 'constructor', 'constant', 'const', 'function', 'func', 'method', 'interface', 'member', 'var', 'mixin', 'namespace', // Todo: Should add `module` here (with optional "name" and no curly brackets);
-//  this block impacts `no-undefined-types` and `valid-types` (search for
-//  "isNamepathDefiningTag|tagMightHaveNamePosition|tagMightHaveEitherTypeOrNamePosition")
-// These seem to all require a "namepath" in their signatures (with no counter-examples)
-'name', 'typedef', 'callback']; // The following do not seem to allow curly brackets in their doc
-//  signature or examples (besides `modifies`)
-
-const tagsWithOptionalNamePosition = [...namepathDefiningTags, // `borrows` has a different format, however, so needs special parsing;
-//   seems to require both, and as "namepath"'s
-'borrows', // Signature seems to require a "name" (of an event) and no counter-examples
-'emits', 'fires', 'listens', // Signature seems to require a "namepath" (and no counter-examples)
-'alias', 'augments', 'extends', 'lends', 'this', // Signature seems to require a "namepath" (and no counter-examples),
-//  though it allows an incomplete namepath ending with connecting symbol
-'memberof', 'memberof!', // Signature seems to require a "OtherObjectPath" with no counter-examples
-'mixes', // Signature allows for "namepath" or text
-'see']; // Todo: `@link` seems to require a namepath OR URL and might be checked as such.
-// The doc signature of `event` seems to require a "name"
-
-const tagsWithMandatoryNamePosition = [// "name" (and a special syntax for the `external` name)
-'external', 'host', // "namepath"
-'callback', 'name', 'typedef'];
-const tagsWithMandatoryTypeOrNamePosition = [// "namepath"
-'alias', 'augments', 'extends', 'borrows', 'lends', 'memberof', 'memberof!', 'name', 'this', 'typedef', // "name"
-'external', 'host', // "OtherObjectPath"
-'mixes'];
-
-const isNamepathDefiningTag = tagName => {
-  return namepathDefiningTags.includes(tagName);
-};
-
-const tagMightHaveTypePosition = (mode, tag) => {
-  if (mode === 'closure') {
-    return tagsWithMandatoryTypePositionClosure.includes(tag) || tagsWithOptionalTypePositionClosure.includes(tag);
-  }
-
-  return tagsWithMandatoryTypePosition.includes(tag) || tagsWithOptionalTypePosition.includes(tag);
-};
-
-const tagMustHaveTypePosition = (mode, tag) => {
-  if (mode === 'closure') {
-    return tagsWithMandatoryTypePositionClosure.includes(tag);
-  }
-
-  return tagsWithMandatoryTypePosition.includes(tag);
-};
-
-const tagMightHaveNamePosition = tag => {
-  return tagsWithOptionalNamePosition.includes(tag);
-};
-
-const tagMustHaveNamePosition = tag => {
-  return tagsWithMandatoryNamePosition.includes(tag);
-};
-
-const tagMightHaveEitherTypeOrNamePosition = (mode, tag) => {
-  return tagMightHaveTypePosition(mode, tag) || tagMightHaveNamePosition(tag);
-};
-
-const tagMustHaveEitherTypeOrNamePosition = tag => {
-  return tagsWithMandatoryTypeOrNamePosition.includes(tag);
-};
-/**
- * Checks if a node has a return statement. Void return does not count.
- *
- * @param {object} node
- * @returns {boolean}
- */
-// eslint-disable-next-line complexity
-
-
-const hasReturnValue = node => {
-  if (!node) {
-    return false;
-  }
-
-  switch (node.type) {
-    case 'FunctionExpression':
-    case 'FunctionDeclaration':
-    case 'ArrowFunctionExpression':
-      {
-        return node.expression || hasReturnValue(node.body);
-      }
-
-    case 'BlockStatement':
-      {
-        return node.body.some(bodyNode => {
-          return bodyNode.type !== 'FunctionDeclaration' && hasReturnValue(bodyNode);
-        });
-      }
-
-    case 'WhileStatement':
-    case 'DoWhileStatement':
-    case 'ForStatement':
-    case 'ForInStatement':
-    case 'ForOfStatement':
-    case 'WithStatement':
-      {
-        return hasReturnValue(node.body);
-      }
-
-    case 'IfStatement':
-      {
-        return hasReturnValue(node.consequent) || hasReturnValue(node.alternate);
-      }
-
-    case 'TryStatement':
-      {
-        return hasReturnValue(node.block) || hasReturnValue(node.handler && node.handler.body) || hasReturnValue(node.finalizer);
-      }
-
-    case 'SwitchStatement':
-      {
-        return node.cases.some(someCase => {
-          return someCase.consequent.some(hasReturnValue);
-        });
-      }
-
-    case 'ReturnStatement':
-      {
-        // void return does not count.
-        if (node.argument === null) {
-          return false;
-        }
-
-        return true;
-      }
-
-    default:
-      {
-        return false;
-      }
-  }
-};
-/** @param {string} tag */
-
-/*
-const isInlineTag = (tag) => {
-  return /^(@link|@linkcode|@linkplain|@tutorial) /u.test(tag);
-};
-*/
-
-/**
- * Parses GCC Generic/Template types
- *
- * @see {https://github.com/google/closure-compiler/wiki/Generic-Types}
- * @param {JsDocTag} tag
- * @returns {Array<string>}
- */
-
-
-const parseClosureTemplateTag = tag => {
-  return (tag.name + ' ' + tag.description).split(',').map(type => {
-    return type.trim();
-  });
-};
-/**
- * Checks user option for `contexts` array, defaulting to
- *   contexts designated by the rule. Returns an array of
- *   ESTree AST types, indicating allowable contexts.
- *
- * @param {*} context
- * @param {true|string[]} defaultContexts
- * @returns {string[]}
- */
-
-
-const enforcedContexts = (context, defaultContexts) => {
-  const _ref = context.options[0] || {},
-        _ref$contexts = _ref.contexts,
-        contexts = _ref$contexts === void 0 ? defaultContexts === true ? ['ArrowFunctionExpression', 'FunctionDeclaration', 'FunctionExpression'] : defaultContexts : _ref$contexts;
-
-  return contexts;
-};
-/**
- * @param {string[]} contexts
- * @param {Function} checkJsdoc
- */
-
-
-const getContextObject = (contexts, checkJsdoc) => {
-  return contexts.reduce((obj, prop) => {
-    obj[prop] = checkJsdoc;
-    return obj;
-  }, {});
-};
-
-const filterTags = (tags = [], filter) => {
-  return tags.filter(filter);
-};
-
-const tagsWithNamesAndDescriptions = ['param', 'arg', 'argument', 'property', 'prop', // These two are parsed by our custom parser as though having a `name`
-'returns', 'return'];
-
-const getTagsByType = (context, mode, tags, tagPreference) => {
-  const descName = getPreferredTagName(context, mode, 'description', tagPreference);
-  const tagsWithoutNames = [];
-  const tagsWithNames = filterTags(tags, tag => {
-    const tagName = tag.tag;
-    const tagWithName = tagsWithNamesAndDescriptions.includes(tagName);
-
-    if (!tagWithName && tagName !== descName) {
-      tagsWithoutNames.push(tag);
-    }
-
-    return tagWithName;
-  });
-  return {
-    tagsWithNames,
-    tagsWithoutNames
-  };
-};
-
-const getIndent = sourceCode => {
-  let indent = sourceCode.text.match(/^\n*([ \t]+)/u);
-  /* istanbul ignore next */
-
-  indent = indent ? indent[1] + indent[1].charAt() : ' ';
-  return indent;
-};
-
-var _default = {
-  enforcedContexts,
-  filterTags,
-  getContextObject,
-  getFunctionParameterNames,
-  getIndent,
-  getJsdocTags,
-  getJsdocTagsDeep,
-  getPreferredTagName,
-  getTagsByType,
-  hasATag,
-  hasDefinedTypeReturnTag,
-  hasReturnValue,
-  hasTag,
-  isNamepathDefiningTag,
-  isValidTag,
-  parseClosureTemplateTag,
-  tagMightHaveEitherTypeOrNamePosition,
-  tagMightHaveNamePosition,
-  tagMightHaveTypePosition,
-  tagMustHaveEitherTypeOrNamePosition,
-  tagMustHaveNamePosition,
-  tagMustHaveTypePosition
-};
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=jsdocUtils.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js.map b/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js.map
deleted file mode 100644
index a966d96..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/jsdocUtils.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/jsdocUtils.js"],"names":["getFunctionParameterNames","functionNode","getParamName","param","_","has","name","left","type","get","argument","parameter","Error","params","map","getJsdocTagsDeep","jsdoc","targetTagName","tags","reduce","arr","tag","idx","push","getJsdocTags","jsdocNames","filter","includes","modeWarnSettings","getTagNamesForMode","mode","context","jsdocTags","typeScriptTags","closureTags","hasBeenWarned","report","loc","start","column","line","message","markSettingAsWarned","getPreferredTagName","tagPreference","prefValues","values","some","prefVal","replacement","tagNames","preferredTagName","findKey","aliases","isValidTag","definedTags","validTagNames","keys","concat","flatten","additionalTags","allTags","hasTag","targetTagLower","toLowerCase","doc","hasATag","targetTagNames","hasDefinedTypeReturnTag","tagType","trim","tagsWithMandatoryTypePosition","tagsWithMandatoryTypePositionClosure","tagsWithOptionalTypePosition","tagsWithOptionalTypePositionClosure","namepathDefiningTags","tagsWithOptionalNamePosition","tagsWithMandatoryNamePosition","tagsWithMandatoryTypeOrNamePosition","isNamepathDefiningTag","tagName","tagMightHaveTypePosition","tagMustHaveTypePosition","tagMightHaveNamePosition","tagMustHaveNamePosition","tagMightHaveEitherTypeOrNamePosition","tagMustHaveEitherTypeOrNamePosition","hasReturnValue","node","expression","body","bodyNode","consequent","alternate","block","handler","finalizer","cases","someCase","parseClosureTemplateTag","description","split","enforcedContexts","defaultContexts","options","contexts","getContextObject","checkJsdoc","obj","prop","filterTags","tagsWithNamesAndDescriptions","getTagsByType","descName","tagsWithoutNames","tagsWithNames","tagWithName","getIndent","sourceCode","indent","text","match","charAt"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport {jsdocTags, closureTags, typeScriptTags} from './tagNames';\nimport WarnSettings from './WarnSettings';\n\ntype ParserMode = \"jsdoc\"|\"typescript\"|\"closure\";\n\nconst getFunctionParameterNames = (functionNode : Object) : Array<string> => {\n  const getParamName = (param) => {\n    if (_.has(param, 'name')) {\n      return param.name;\n    }\n\n    if (_.has(param, 'left.name')) {\n      return param.left.name;\n    }\n\n    if (param.type === 'ObjectPattern' || _.get(param, 'left.type') === 'ObjectPattern') {\n      return '<ObjectPattern>';\n    }\n\n    if (param.type === 'ArrayPattern' || _.get(param, 'left.type') === 'ArrayPattern') {\n      return '<ArrayPattern>';\n    }\n\n    if (param.type === 'RestElement') {\n      return param.argument.name;\n    }\n\n    if (param.type === 'TSParameterProperty') {\n      return getParamName(param.parameter);\n    }\n\n    throw new Error('Unsupported function signature format.');\n  };\n\n  return functionNode.params.map(getParamName);\n};\n\n/**\n * Gets all names of the target type, including those that refer to a path, e.g.\n * \"@param foo; @param foo.bar\".\n */\nconst getJsdocTagsDeep = (jsdoc : Object, targetTagName : string) : Array<Object> => {\n  return (jsdoc.tags || []).reduce((arr, {name, tag}, idx) => {\n    if (tag !== targetTagName) {\n      return arr;\n    }\n    arr.push({\n      idx,\n      name,\n    });\n\n    return arr;\n  }, []);\n};\n\nconst getJsdocTags = (jsdoc : Object, targetTagName : string) : Array<string> => {\n  let jsdocNames;\n\n  jsdocNames = getJsdocTagsDeep(jsdoc, targetTagName);\n\n  jsdocNames = jsdocNames.filter(({name}) => {\n    return !name.includes('.');\n  });\n\n  return jsdocNames;\n};\n\nconst modeWarnSettings = WarnSettings();\n\nconst getTagNamesForMode = (mode, context) => {\n  switch (mode) {\n  case 'jsdoc':\n    return jsdocTags;\n  case 'typescript':\n    return typeScriptTags;\n  case 'closure':\n    return closureTags;\n  default:\n    if (!modeWarnSettings.hasBeenWarned(context, 'mode')) {\n      context.report({\n        loc: {\n          start: {\n            column: 1,\n            line: 1,\n          },\n        },\n        message: `Unrecognized value \\`${mode}\\` for \\`settings.jsdoc.mode\\`.`,\n      });\n      modeWarnSettings.markSettingAsWarned(context, 'mode');\n    }\n\n    // We'll avoid breaking too many other rules\n    return jsdocTags;\n  }\n};\n\nconst getPreferredTagName = (\n  context,\n  mode : ParserMode,\n  name : string,\n  tagPreference : Object = {},\n) : string|Object => {\n  const prefValues = _.values(tagPreference);\n  if (prefValues.includes(name) || prefValues.some((prefVal) => {\n    return prefVal && typeof prefVal === 'object' && prefVal.replacement === name;\n  })) {\n    return name;\n  }\n\n  if (_.has(tagPreference, name)) {\n    return tagPreference[name];\n  }\n\n  const tagNames = getTagNamesForMode(mode, context);\n\n  const preferredTagName = _.findKey(tagNames, (aliases) => {\n    return aliases.includes(name);\n  });\n  if (preferredTagName) {\n    return preferredTagName;\n  }\n\n  return name;\n};\n\nconst isValidTag = (\n  context,\n  mode : ParserMode,\n  name : string,\n  definedTags : Array,\n) : boolean => {\n  const tagNames = getTagNamesForMode(mode, context);\n  const validTagNames = _.keys(tagNames).concat(_.flatten(_.values(tagNames)));\n  const additionalTags = definedTags;\n  const allTags = validTagNames.concat(additionalTags);\n\n  return allTags.includes(name);\n};\n\nconst hasTag = (jsdoc : Object, targetTagName : string) : boolean => {\n  const targetTagLower = targetTagName.toLowerCase();\n\n  return _.some(jsdoc.tags, (doc : Object) => {\n    return doc.tag.toLowerCase() === targetTagLower;\n  });\n};\n\nconst hasATag = (jsdoc : Object, targetTagNames : Array) : boolean => {\n  return targetTagNames.some((targetTagName) => {\n    return hasTag(jsdoc, targetTagName);\n  });\n};\n\n/**\n * Checks if the JSDoc comment declares a return value.\n *\n * @param {JsDocTag} tag\n *   the tag which should be checked.\n * @returns {boolean}\n *   true in case a return value is declared; otherwise false.\n */\nconst hasDefinedTypeReturnTag = (tag) => {\n  // The function should not continue in the event @returns is not defined...\n  if (typeof tag === 'undefined' || tag === null) {\n    return false;\n  }\n\n  // .. same applies if it declares `@returns {undefined}` or `@returns {void}`\n  const tagType = tag.type.trim();\n  if (tagType === 'undefined' || tagType === 'void') {\n    return false;\n  }\n\n  // In any other case, something must be returned, and\n  // a return statement is expected\n  return true;\n};\n\nconst tagsWithMandatoryTypePosition = [\n  // These both show curly brackets in the doc signature and examples\n  // \"typeExpression\"\n  'implements',\n\n  // \"typeName\"\n  'type',\n];\n\nconst tagsWithMandatoryTypePositionClosure = [\n  ...tagsWithMandatoryTypePosition,\n  'this',\n  'define',\n];\n\n// All of these have a signature with \"type\" except for\n//  `augments`/`extends` (\"namepath\")\n//  `param`/`arg`/`argument` (no signature)\n//  `property`/`prop` (no signature)\n// `modifies` (undocumented)\nconst tagsWithOptionalTypePosition = [\n  // These have the example showing curly brackets but not in their doc signature, e.g.: https://jsdoc.app/tags-enum.html\n  'enum',\n  'member', 'var',\n\n  'typedef',\n\n  // These do not show curly brackets in either the signature or examples\n  'augments', 'extends',\n\n  'class', 'constructor',\n  'constant', 'const',\n\n  // These show the signature with curly brackets but not in the example\n  'module',\n  'namespace',\n\n  // These have no formal signature in the docs but show curly brackets\n  //   in the examples\n  'param', 'arg', 'argument',\n  'property', 'prop',\n\n  // These show curly brackets in the signature and in the examples\n  'returns', 'return',\n  'throws', 'exception',\n  'yields', 'yield',\n\n  // Has no documentation, but test example has curly brackets, and\n  //  \"name\" would be suggested rather than \"namepath\" based on example; not\n  //  sure if name is required\n  'modifies',\n];\n\nconst tagsWithOptionalTypePositionClosure = [\n  ...tagsWithOptionalTypePosition,\n\n  'export',\n\n  // Shows the signature with curly brackets but not in the example\n  // \"typeExpression\"\n  'package',\n  'private',\n  'protected',\n\n  // These do not show a signature nor show curly brackets in the example\n  'public',\n  'static',\n];\n\n// None of these show as having curly brackets for their name/namepath\nconst namepathDefiningTags = [\n  // These appear to require a \"name\" in their signature, albeit these\n  //  are somewhat different from other \"name\"'s (including as described\n  // at https://jsdoc.app/about-namepaths.html )\n  'external', 'host',\n  'event',\n\n  // These allow for \"name\"'s in their signature, but indicate as optional\n  'class', 'constructor',\n  'constant', 'const',\n  'function', 'func', 'method',\n  'interface',\n  'member', 'var',\n  'mixin',\n  'namespace',\n\n  // Todo: Should add `module` here (with optional \"name\" and no curly brackets);\n  //  this block impacts `no-undefined-types` and `valid-types` (search for\n  //  \"isNamepathDefiningTag|tagMightHaveNamePosition|tagMightHaveEitherTypeOrNamePosition\")\n\n  // These seem to all require a \"namepath\" in their signatures (with no counter-examples)\n  'name',\n  'typedef',\n  'callback',\n];\n\n// The following do not seem to allow curly brackets in their doc\n//  signature or examples (besides `modifies`)\nconst tagsWithOptionalNamePosition = [\n  ...namepathDefiningTags,\n\n  // `borrows` has a different format, however, so needs special parsing;\n  //   seems to require both, and as \"namepath\"'s\n  'borrows',\n\n  // Signature seems to require a \"name\" (of an event) and no counter-examples\n  'emits', 'fires',\n  'listens',\n\n  // Signature seems to require a \"namepath\" (and no counter-examples)\n  'alias',\n  'augments', 'extends',\n  'lends',\n  'this',\n\n  // Signature seems to require a \"namepath\" (and no counter-examples),\n  //  though it allows an incomplete namepath ending with connecting symbol\n  'memberof', 'memberof!',\n\n  // Signature seems to require a \"OtherObjectPath\" with no counter-examples\n  'mixes',\n\n  // Signature allows for \"namepath\" or text\n  'see',\n];\n\n// Todo: `@link` seems to require a namepath OR URL and might be checked as such.\n\n// The doc signature of `event` seems to require a \"name\"\nconst tagsWithMandatoryNamePosition = [\n  // \"name\" (and a special syntax for the `external` name)\n  'external', 'host',\n\n  // \"namepath\"\n  'callback',\n  'name',\n  'typedef',\n];\n\nconst tagsWithMandatoryTypeOrNamePosition = [\n  // \"namepath\"\n  'alias',\n  'augments', 'extends',\n  'borrows',\n  'lends',\n  'memberof', 'memberof!',\n  'name',\n  'this',\n  'typedef',\n\n  // \"name\"\n  'external', 'host',\n\n  // \"OtherObjectPath\"\n  'mixes',\n];\n\nconst isNamepathDefiningTag = (tagName) => {\n  return namepathDefiningTags.includes(tagName);\n};\n\nconst tagMightHaveTypePosition = (mode, tag) => {\n  if (mode === 'closure') {\n    return tagsWithMandatoryTypePositionClosure.includes(tag) ||\n      tagsWithOptionalTypePositionClosure.includes(tag);\n  }\n\n  return tagsWithMandatoryTypePosition.includes(tag) ||\n    tagsWithOptionalTypePosition.includes(tag);\n};\n\nconst tagMustHaveTypePosition = (mode, tag) => {\n  if (mode === 'closure') {\n    return tagsWithMandatoryTypePositionClosure.includes(tag);\n  }\n\n  return tagsWithMandatoryTypePosition.includes(tag);\n};\n\nconst tagMightHaveNamePosition = (tag) => {\n  return tagsWithOptionalNamePosition.includes(tag);\n};\n\nconst tagMustHaveNamePosition = (tag) => {\n  return tagsWithMandatoryNamePosition.includes(tag);\n};\n\nconst tagMightHaveEitherTypeOrNamePosition = (mode, tag) => {\n  return tagMightHaveTypePosition(mode, tag) || tagMightHaveNamePosition(tag);\n};\n\nconst tagMustHaveEitherTypeOrNamePosition = (tag) => {\n  return tagsWithMandatoryTypeOrNamePosition.includes(tag);\n};\n\n/**\n * Checks if a node has a return statement. Void return does not count.\n *\n * @param {object} node\n * @returns {boolean}\n */\n// eslint-disable-next-line complexity\nconst hasReturnValue = (node) => {\n  if (!node) {\n    return false;\n  }\n  switch (node.type) {\n  case 'FunctionExpression':\n  case 'FunctionDeclaration':\n  case 'ArrowFunctionExpression': {\n    return node.expression || hasReturnValue(node.body);\n  }\n  case 'BlockStatement': {\n    return node.body.some((bodyNode) => {\n      return bodyNode.type !== 'FunctionDeclaration' && hasReturnValue(bodyNode);\n    });\n  }\n  case 'WhileStatement':\n  case 'DoWhileStatement':\n  case 'ForStatement':\n  case 'ForInStatement':\n  case 'ForOfStatement':\n  case 'WithStatement': {\n    return hasReturnValue(node.body);\n  }\n  case 'IfStatement': {\n    return hasReturnValue(node.consequent) || hasReturnValue(node.alternate);\n  }\n  case 'TryStatement': {\n    return hasReturnValue(node.block) ||\n      hasReturnValue(node.handler && node.handler.body) ||\n      hasReturnValue(node.finalizer);\n  }\n  case 'SwitchStatement': {\n    return node.cases.some(\n      (someCase) => {\n        return someCase.consequent.some(hasReturnValue);\n      },\n    );\n  }\n  case 'ReturnStatement': {\n    // void return does not count.\n    if (node.argument === null) {\n      return false;\n    }\n\n    return true;\n  }\n  default: {\n    return false;\n  }\n  }\n};\n\n/** @param {string} tag */\n/*\nconst isInlineTag = (tag) => {\n  return /^(@link|@linkcode|@linkplain|@tutorial) /u.test(tag);\n};\n*/\n\n/**\n * Parses GCC Generic/Template types\n *\n * @see {https://github.com/google/closure-compiler/wiki/Generic-Types}\n * @param {JsDocTag} tag\n * @returns {Array<string>}\n */\nconst parseClosureTemplateTag = (tag) => {\n  return (tag.name + ' ' + tag.description)\n    .split(',')\n    .map((type) => {\n      return type.trim();\n    });\n};\n\n/**\n * Checks user option for `contexts` array, defaulting to\n *   contexts designated by the rule. Returns an array of\n *   ESTree AST types, indicating allowable contexts.\n *\n * @param {*} context\n * @param {true|string[]} defaultContexts\n * @returns {string[]}\n */\nconst enforcedContexts = (context, defaultContexts) => {\n  const {\n    /* istanbul ignore next */\n    contexts = defaultContexts === true ? [\n      'ArrowFunctionExpression',\n      'FunctionDeclaration',\n      'FunctionExpression',\n    ] : defaultContexts,\n  } = context.options[0] || {};\n\n  return contexts;\n};\n\n/**\n * @param {string[]} contexts\n * @param {Function} checkJsdoc\n */\nconst getContextObject = (contexts, checkJsdoc) => {\n  return contexts.reduce((obj, prop) => {\n    obj[prop] = checkJsdoc;\n\n    return obj;\n  }, {});\n};\n\nconst filterTags = (tags = [], filter) => {\n  return tags.filter(filter);\n};\n\nconst tagsWithNamesAndDescriptions = [\n  'param', 'arg', 'argument', 'property', 'prop',\n\n  // These two are parsed by our custom parser as though having a `name`\n  'returns', 'return',\n];\n\nconst getTagsByType = (context, mode, tags, tagPreference) => {\n  const descName = getPreferredTagName(context, mode, 'description', tagPreference);\n  const tagsWithoutNames = [];\n  const tagsWithNames = filterTags(tags, (tag) => {\n    const {tag: tagName} = tag;\n    const tagWithName = tagsWithNamesAndDescriptions.includes(tagName);\n    if (!tagWithName && tagName !== descName) {\n      tagsWithoutNames.push(tag);\n    }\n\n    return tagWithName;\n  });\n\n  return {\n    tagsWithNames,\n    tagsWithoutNames,\n  };\n};\n\nconst getIndent = (sourceCode) => {\n  let indent = sourceCode.text.match(/^\\n*([ \\t]+)/u);\n  /* istanbul ignore next */\n  indent = indent ? indent[1] + indent[1].charAt() : ' ';\n\n  return indent;\n};\n\nexport default {\n  enforcedContexts,\n  filterTags,\n  getContextObject,\n  getFunctionParameterNames,\n  getIndent,\n  getJsdocTags,\n  getJsdocTagsDeep,\n  getPreferredTagName,\n  getTagsByType,\n  hasATag,\n  hasDefinedTypeReturnTag,\n  hasReturnValue,\n  hasTag,\n  isNamepathDefiningTag,\n  isValidTag,\n  parseClosureTemplateTag,\n  tagMightHaveEitherTypeOrNamePosition,\n  tagMightHaveNamePosition,\n  tagMightHaveTypePosition,\n  tagMustHaveEitherTypeOrNamePosition,\n  tagMustHaveNamePosition,\n  tagMustHaveTypePosition,\n};\n"],"file":"jsdocUtils.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkAccess.js b/node_modules/eslint-plugin-jsdoc/dist/rules/checkAccess.js
deleted file mode 100644
index 2bf8168..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkAccess.js
+++ /dev/null
@@ -1,45 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const accessLevels = ['package', 'private', 'protected', 'public'];
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  utils
-}) => {
-  utils.forEachPreferredTag('access', (jsdocParameter, targetTagName) => {
-    const desc = targetTagName === 'access' ? jsdocParameter.description : jsdocParameter.name + ' ' + jsdocParameter.description;
-
-    if (!accessLevels.includes(desc.trim())) {
-      report(`Missing valid JSDoc @${targetTagName} level.`, null, jsdocParameter);
-    }
-  });
-  const accessLength = utils.getTags('access').length;
-  const individualTagLength = utils.getPresentTags(accessLevels).length;
-
-  if (accessLength && individualTagLength) {
-    report('The @access tag may not be used with specific access-control tags (@package, @private, @protected, or @public).');
-  }
-
-  if (accessLength > 1 || individualTagLength > 1) {
-    report('At most one access-control tag may be present on a jsdoc block.');
-  }
-}, {
-  checkPrivate: true,
-  iterateAllJsdocs: true,
-  meta: {
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=checkAccess.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkAccess.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/checkAccess.js.map
deleted file mode 100644
index e48605f..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkAccess.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/checkAccess.js"],"names":["accessLevels","report","utils","forEachPreferredTag","jsdocParameter","targetTagName","desc","description","name","includes","trim","accessLength","getTags","length","individualTagLength","getPresentTags","checkPrivate","iterateAllJsdocs","meta","type"],"mappings":";;;;;;;AAAA;;;;AAEA,MAAMA,YAAY,GAAG,CAAC,SAAD,EAAY,SAAZ,EAAuB,WAAvB,EAAoC,QAApC,CAArB;;eAEe,2BAAa,CAAC;AAC3BC,EAAAA,MAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJA,EAAAA,KAAK,CAACC,mBAAN,CAA0B,QAA1B,EAAoC,CAACC,cAAD,EAAiBC,aAAjB,KAAmC;AACrE,UAAMC,IAAI,GAAGD,aAAa,KAAK,QAAlB,GACXD,cAAc,CAACG,WADJ,GAEXH,cAAc,CAACI,IAAf,GAAsB,GAAtB,GAA4BJ,cAAc,CAACG,WAF7C;;AAIA,QAAI,CAACP,YAAY,CAACS,QAAb,CAAsBH,IAAI,CAACI,IAAL,EAAtB,CAAL,EAAyC;AACvCT,MAAAA,MAAM,CACH,wBAAuBI,aAAc,SADlC,EAEJ,IAFI,EAGJD,cAHI,CAAN;AAKD;AACF,GAZD;AAaA,QAAMO,YAAY,GAAGT,KAAK,CAACU,OAAN,CAAc,QAAd,EAAwBC,MAA7C;AACA,QAAMC,mBAAmB,GAAGZ,KAAK,CAACa,cAAN,CAAqBf,YAArB,EAAmCa,MAA/D;;AACA,MAAIF,YAAY,IAAIG,mBAApB,EAAyC;AACvCb,IAAAA,MAAM,CACJ,iHADI,CAAN;AAGD;;AACD,MAAIU,YAAY,GAAG,CAAf,IAAoBG,mBAAmB,GAAG,CAA9C,EAAiD;AAC/Cb,IAAAA,MAAM,CACJ,iEADI,CAAN;AAGD;AACF,CA7Bc,EA6BZ;AACDe,EAAAA,YAAY,EAAE,IADb;AAEDC,EAAAA,gBAAgB,EAAE,IAFjB;AAGDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,IAAI,EAAE;AADF;AAHL,CA7BY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nconst accessLevels = ['package', 'private', 'protected', 'public'];\n\nexport default iterateJsdoc(({\n  report,\n  utils,\n}) => {\n  utils.forEachPreferredTag('access', (jsdocParameter, targetTagName) => {\n    const desc = targetTagName === 'access' ?\n      jsdocParameter.description :\n      jsdocParameter.name + ' ' + jsdocParameter.description;\n\n    if (!accessLevels.includes(desc.trim())) {\n      report(\n        `Missing valid JSDoc @${targetTagName} level.`,\n        null,\n        jsdocParameter,\n      );\n    }\n  });\n  const accessLength = utils.getTags('access').length;\n  const individualTagLength = utils.getPresentTags(accessLevels).length;\n  if (accessLength && individualTagLength) {\n    report(\n      'The @access tag may not be used with specific access-control tags (@package, @private, @protected, or @public).',\n    );\n  }\n  if (accessLength > 1 || individualTagLength > 1) {\n    report(\n      'At most one access-control tag may be present on a jsdoc block.',\n    );\n  }\n}, {\n  checkPrivate: true,\n  iterateAllJsdocs: true,\n  meta: {\n    type: 'suggestion',\n  },\n});\n"],"file":"checkAccess.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkAlignment.js b/node_modules/eslint-plugin-jsdoc/dist/rules/checkAlignment.js
deleted file mode 100644
index 8d9f69a..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkAlignment.js
+++ /dev/null
@@ -1,59 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const trimStart = string => {
-  return string.replace(/^\s+/u, '');
-};
-
-var _default = (0, _iterateJsdoc.default)(({
-  sourceCode,
-  jsdocNode,
-  report,
-  indent
-}) => {
-  // `indent` is whitespace from line 1 (`/**`), so slice and account for "/".
-  const indentLevel = indent.length + 1;
-  const sourceLines = sourceCode.getText(jsdocNode).split('\n').slice(1).map(line => {
-    return line.split('*')[0];
-  }).filter(line => {
-    return !trimStart(line).length;
-  });
-
-  const fix = fixer => {
-    const replacement = sourceCode.getText(jsdocNode).split('\n').map((line, index) => {
-      // Ignore the first line and all lines not starting with `*`
-      const ignored = !index || trimStart(line.split('*')[0]).length;
-      return ignored ? line : `${indent} ${trimStart(line)}`;
-    }).join('\n');
-    return fixer.replaceText(jsdocNode, replacement);
-  };
-
-  sourceLines.some((line, lineNum) => {
-    if (line.length !== indentLevel) {
-      report('Expected JSDoc block to be aligned.', fix, {
-        line: lineNum + 1
-      });
-      return true;
-    }
-
-    return false;
-  });
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    fixable: 'code',
-    type: 'layout'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=checkAlignment.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkAlignment.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/checkAlignment.js.map
deleted file mode 100644
index f032dd8..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkAlignment.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/checkAlignment.js"],"names":["trimStart","string","replace","sourceCode","jsdocNode","report","indent","indentLevel","length","sourceLines","getText","split","slice","map","line","filter","fix","fixer","replacement","index","ignored","join","replaceText","some","lineNum","iterateAllJsdocs","meta","fixable","type"],"mappings":";;;;;;;AAAA;;;;AAEA,MAAMA,SAAS,GAAIC,MAAD,IAAY;AAC5B,SAAOA,MAAM,CAACC,OAAP,CAAe,OAAf,EAAwB,EAAxB,CAAP;AACD,CAFD;;eAIe,2BAAa,CAAC;AAC3BC,EAAAA,UAD2B;AAE3BC,EAAAA,SAF2B;AAG3BC,EAAAA,MAH2B;AAI3BC,EAAAA;AAJ2B,CAAD,KAKtB;AACJ;AACA,QAAMC,WAAW,GAAGD,MAAM,CAACE,MAAP,GAAgB,CAApC;AACA,QAAMC,WAAW,GAAGN,UAAU,CAACO,OAAX,CAAmBN,SAAnB,EAA8BO,KAA9B,CAAoC,IAApC,EACjBC,KADiB,CACX,CADW,EAEjBC,GAFiB,CAEZC,IAAD,IAAU;AACb,WAAOA,IAAI,CAACH,KAAL,CAAW,GAAX,EAAgB,CAAhB,CAAP;AACD,GAJiB,EAKjBI,MALiB,CAKTD,IAAD,IAAU;AAChB,WAAO,CAACd,SAAS,CAACc,IAAD,CAAT,CAAgBN,MAAxB;AACD,GAPiB,CAApB;;AASA,QAAMQ,GAAG,GAAIC,KAAD,IAAW;AACrB,UAAMC,WAAW,GAAGf,UAAU,CAACO,OAAX,CAAmBN,SAAnB,EAA8BO,KAA9B,CAAoC,IAApC,EACjBE,GADiB,CACb,CAACC,IAAD,EAAOK,KAAP,KAAiB;AACpB;AACA,YAAMC,OAAO,GAAG,CAACD,KAAD,IAAUnB,SAAS,CAACc,IAAI,CAACH,KAAL,CAAW,GAAX,EAAgB,CAAhB,CAAD,CAAT,CAA8BH,MAAxD;AAEA,aAAOY,OAAO,GAAGN,IAAH,GAAW,GAAER,MAAO,IAAGN,SAAS,CAACc,IAAD,CAAO,EAArD;AACD,KANiB,EAOjBO,IAPiB,CAOZ,IAPY,CAApB;AASA,WAAOJ,KAAK,CAACK,WAAN,CAAkBlB,SAAlB,EAA6Bc,WAA7B,CAAP;AACD,GAXD;;AAaAT,EAAAA,WAAW,CAACc,IAAZ,CAAiB,CAACT,IAAD,EAAOU,OAAP,KAAmB;AAClC,QAAIV,IAAI,CAACN,MAAL,KAAgBD,WAApB,EAAiC;AAC/BF,MAAAA,MAAM,CAAC,qCAAD,EAAwCW,GAAxC,EAA6C;AACjDF,QAAAA,IAAI,EAAEU,OAAO,GAAG;AADiC,OAA7C,CAAN;AAIA,aAAO,IAAP;AACD;;AAED,WAAO,KAAP;AACD,GAVD;AAWD,CAzCc,EAyCZ;AACDC,EAAAA,gBAAgB,EAAE,IADjB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,OAAO,EAAE,MADL;AAEJC,IAAAA,IAAI,EAAE;AAFF;AAFL,CAzCY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nconst trimStart = (string) => {\n  return string.replace(/^\\s+/u, '');\n};\n\nexport default iterateJsdoc(({\n  sourceCode,\n  jsdocNode,\n  report,\n  indent,\n}) => {\n  // `indent` is whitespace from line 1 (`/**`), so slice and account for \"/\".\n  const indentLevel = indent.length + 1;\n  const sourceLines = sourceCode.getText(jsdocNode).split('\\n')\n    .slice(1)\n    .map((line) => {\n      return line.split('*')[0];\n    })\n    .filter((line) => {\n      return !trimStart(line).length;\n    });\n\n  const fix = (fixer) => {\n    const replacement = sourceCode.getText(jsdocNode).split('\\n')\n      .map((line, index) => {\n        // Ignore the first line and all lines not starting with `*`\n        const ignored = !index || trimStart(line.split('*')[0]).length;\n\n        return ignored ? line : `${indent} ${trimStart(line)}`;\n      })\n      .join('\\n');\n\n    return fixer.replaceText(jsdocNode, replacement);\n  };\n\n  sourceLines.some((line, lineNum) => {\n    if (line.length !== indentLevel) {\n      report('Expected JSDoc block to be aligned.', fix, {\n        line: lineNum + 1,\n      });\n\n      return true;\n    }\n\n    return false;\n  });\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    fixable: 'code',\n    type: 'layout',\n  },\n});\n"],"file":"checkAlignment.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkExamples.js b/node_modules/eslint-plugin-jsdoc/dist/rules/checkExamples.js
deleted file mode 100644
index 7c5d41b..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkExamples.js
+++ /dev/null
@@ -1,359 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _eslint = require("eslint");
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-var _warnRemovedSettings = _interopRequireDefault(require("../warnRemovedSettings"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
-
-function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-const zeroBasedLineIndexAdjust = -1;
-const likelyNestedJSDocIndentSpace = 1;
-const preTagSpaceLength = 1; // If a space is present, we should ignore it
-
-const firstLinePrefixLength = preTagSpaceLength;
-const hasCaptionRegex = /^\s*<caption>(.*?)<\/caption>/u;
-
-const escapeStringRegexp = str => {
-  return str.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
-};
-
-const countChars = (str, ch) => {
-  return (str.match(new RegExp(escapeStringRegexp(ch), 'gu')) || []).length;
-};
-
-const getRegexFromString = regexString => {
-  const match = regexString.match(/^\/(.*)\/([gimyus]*)$/u);
-  let flags = 'u';
-  let regex = regexString;
-
-  if (match) {
-    var _match = _slicedToArray(match, 3);
-
-    regex = _match[1];
-    flags = _match[2];
-
-    if (!flags) {
-      flags = 'u';
-    }
-
-    const uniqueFlags = [...new Set(flags)];
-    flags = uniqueFlags.join('');
-  }
-
-  return new RegExp(regex, flags);
-};
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  utils,
-  context,
-  globalState
-}) => {
-  (0, _warnRemovedSettings.default)(context, 'check-examples');
-  const tagName = utils.getPreferredTagName({
-    tagName: 'example'
-  });
-
-  if (!utils.hasTag(tagName)) {
-    return;
-  }
-
-  if (!globalState.has('checkExamples-matchingFileName')) {
-    globalState.set('checkExamples-matchingFileName', new Map());
-  }
-
-  const matchingFileNameMap = globalState.get('checkExamples-matchingFileName');
-  const options = context.options[0] || {};
-  let _options$exampleCodeR = options.exampleCodeRegex,
-      exampleCodeRegex = _options$exampleCodeR === void 0 ? null : _options$exampleCodeR,
-      _options$rejectExampl = options.rejectExampleCodeRegex,
-      rejectExampleCodeRegex = _options$rejectExampl === void 0 ? null : _options$rejectExampl;
-  const _options$noDefaultExa = options.noDefaultExampleRules,
-        noDefaultExampleRules = _options$noDefaultExa === void 0 ? false : _options$noDefaultExa,
-        _options$checkEslintr = options.checkEslintrc,
-        checkEslintrc = _options$checkEslintr === void 0 ? true : _options$checkEslintr,
-        _options$matchingFile = options.matchingFileName,
-        filename = _options$matchingFile === void 0 ? null : _options$matchingFile,
-        _options$paddedIndent = options.paddedIndent,
-        paddedIndent = _options$paddedIndent === void 0 ? 0 : _options$paddedIndent,
-        _options$baseConfig = options.baseConfig,
-        baseConfig = _options$baseConfig === void 0 ? {} : _options$baseConfig,
-        configFile = options.configFile,
-        _options$allowInlineC = options.allowInlineConfig,
-        allowInlineConfig = _options$allowInlineC === void 0 ? true : _options$allowInlineC,
-        _options$reportUnused = options.reportUnusedDisableDirectives,
-        reportUnusedDisableDirectives = _options$reportUnused === void 0 ? true : _options$reportUnused,
-        _options$captionRequi = options.captionRequired,
-        captionRequired = _options$captionRequi === void 0 ? false : _options$captionRequi;
-  let defaultFileName;
-
-  if (!filename) {
-    const jsFileName = context.getFilename();
-
-    if (typeof jsFileName === 'string' && jsFileName.includes('.')) {
-      defaultFileName = jsFileName.replace(/\..*?$/, '.md');
-    } else {
-      defaultFileName = 'dummy.md';
-    }
-  } // Make this configurable?
-
-
-  const rulePaths = [];
-  const rules = noDefaultExampleRules ? undefined : {
-    // "always" newline rule at end unlikely in sample code
-    'eol-last': 0,
-    // Wouldn't generally expect example paths to resolve relative to JS file
-    'import/no-unresolved': 0,
-    // Snippets likely too short to always include import/export info
-    'import/unambiguous': 0,
-    // Unlikely to have inadvertent debugging within examples
-    'no-console': 0,
-    // Often wish to start `@example` code after newline; also may use
-    //   empty lines for spacing
-    'no-multiple-empty-lines': 0,
-    // Many variables in examples will be `undefined`
-    'no-undef': 0,
-    // Common to define variables for clarity without always using them
-    'no-unused-vars': 0,
-    // See import/no-unresolved
-    'node/no-missing-import': 0,
-    'node/no-missing-require': 0,
-    // Can generally look nicer to pad a little even if code imposes more stringency
-    'padded-blocks': 0
-  };
-
-  if (exampleCodeRegex) {
-    exampleCodeRegex = getRegexFromString(exampleCodeRegex);
-  }
-
-  if (rejectExampleCodeRegex) {
-    rejectExampleCodeRegex = getRegexFromString(rejectExampleCodeRegex);
-  }
-
-  utils.forEachPreferredTag('example', (tag, targetTagName) => {
-    let source = tag.description;
-    const match = source.match(hasCaptionRegex);
-
-    if (captionRequired && (!match || !match[1].trim())) {
-      report('Caption is expected for examples.', null, tag);
-    } // If we allow newlines in hasCaptionRegex, we should add to line count
-
-
-    source = source.replace(hasCaptionRegex, '');
-
-    if (exampleCodeRegex && !exampleCodeRegex.test(source) || rejectExampleCodeRegex && rejectExampleCodeRegex.test(source)) {
-      return;
-    }
-
-    const sources = [];
-
-    if (exampleCodeRegex) {
-      let nonJSPrefacingCols = 0;
-      let nonJSPrefacingLines = 0;
-      let startingIndex = 0;
-      let lastStringCount = 0;
-      let exampleCode;
-      exampleCodeRegex.lastIndex = 0;
-
-      while ((exampleCode = exampleCodeRegex.exec(source)) !== null) {
-        const _exampleCode = exampleCode,
-              index = _exampleCode.index,
-              n0 = _exampleCode[0],
-              n1 = _exampleCode[1]; // Count anything preceding user regex match (can affect line numbering)
-
-        const preMatch = source.slice(startingIndex, index);
-        const preMatchLines = countChars(preMatch, '\n');
-        const colDelta = preMatchLines ? preMatch.slice(preMatch.lastIndexOf('\n') + 1).length : preMatch.length;
-        let nonJSPreface;
-        let nonJSPrefaceLineCount;
-
-        if (n1) {
-          const idx = n0.indexOf(n1);
-          nonJSPreface = n0.slice(0, idx);
-          nonJSPrefaceLineCount = countChars(nonJSPreface, '\n');
-        } else {
-          nonJSPreface = '';
-          nonJSPrefaceLineCount = 0;
-        }
-
-        nonJSPrefacingLines += lastStringCount + preMatchLines + nonJSPrefaceLineCount; // Ignore `preMatch` delta if newlines here
-
-        if (nonJSPrefaceLineCount) {
-          const charsInLastLine = nonJSPreface.slice(nonJSPreface.lastIndexOf('\n') + 1).length;
-          nonJSPrefacingCols += charsInLastLine;
-        } else {
-          nonJSPrefacingCols += colDelta + nonJSPreface.length;
-        }
-
-        const string = n1 || n0;
-        sources.push({
-          nonJSPrefacingCols,
-          nonJSPrefacingLines,
-          string
-        });
-        startingIndex = exampleCodeRegex.lastIndex;
-        lastStringCount = countChars(string, '\n');
-
-        if (!exampleCodeRegex.global) {
-          break;
-        }
-      }
-    } else {
-      sources.push({
-        nonJSPrefacingCols: 0,
-        nonJSPrefacingLines: 0,
-        string: source
-      });
-    } // Todo: Make fixable
-    // Todo: Fix whitespace indent
-
-
-    const checkRules = function checkRules({
-      nonJSPrefacingCols,
-      nonJSPrefacingLines,
-      string
-    }) {
-      const cliConfig = {
-        allowInlineConfig,
-        baseConfig,
-        configFile,
-        reportUnusedDisableDirectives,
-        rulePaths,
-        rules,
-        useEslintrc: checkEslintrc
-      };
-      const cliConfigStr = JSON.stringify(cliConfig);
-      const src = paddedIndent ? string.replace(new RegExp(`(^|\n) {${paddedIndent}}(?!$)`, 'gu'), '\n') : string; // Programmatic ESLint API: https://eslint.org/docs/developer-guide/nodejs-api
-
-      const fileNameMapKey = filename ? 'a' + cliConfigStr + filename : 'b' + cliConfigStr + defaultFileName;
-      const file = filename || defaultFileName;
-      let cliFile;
-
-      if (matchingFileNameMap.has(fileNameMapKey)) {
-        cliFile = matchingFileNameMap.get(fileNameMapKey);
-      } else {
-        const cli = new _eslint.CLIEngine(cliConfig);
-        let config;
-
-        if (filename || checkEslintrc) {
-          config = cli.getConfigForFile(file);
-        } // We need a new instance to ensure that the rules that may only
-        //  be available to `file` (if it has its own `.eslintrc`),
-        //  will be defined.
-
-
-        cliFile = new _eslint.CLIEngine({
-          allowInlineConfig,
-          baseConfig: _objectSpread({}, baseConfig, {}, config),
-          configFile,
-          reportUnusedDisableDirectives,
-          rulePaths,
-          rules,
-          useEslintrc: false
-        });
-        matchingFileNameMap.set(fileNameMapKey, cliFile);
-      }
-
-      const _cliFile$executeOnTex = cliFile.executeOnText(src),
-            _cliFile$executeOnTex2 = _slicedToArray(_cliFile$executeOnTex.results, 1),
-            messages = _cliFile$executeOnTex2[0].messages; // NOTE: `tag.line` can be 0 if of form `/** @tag ... */`
-
-
-      const codeStartLine = tag.line + nonJSPrefacingLines;
-      const codeStartCol = likelyNestedJSDocIndentSpace;
-      messages.forEach(({
-        message,
-        line,
-        column,
-        severity,
-        ruleId
-      }) => {
-        const startLine = codeStartLine + line + zeroBasedLineIndexAdjust;
-        const startCol = codeStartCol + ( // This might not work for line 0, but line 0 is unlikely for examples
-        line <= 1 ? nonJSPrefacingCols + firstLinePrefixLength : preTagSpaceLength) + column;
-        report('@' + targetTagName + ' ' + (severity === 2 ? 'error' : 'warning') + (ruleId ? ' (' + ruleId + ')' : '') + ': ' + message, null, {
-          column: startCol,
-          line: startLine
-        });
-      });
-    };
-
-    sources.forEach(checkRules);
-  });
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        allowInlineConfig: {
-          default: true,
-          type: 'boolean'
-        },
-        baseConfig: {
-          type: 'object'
-        },
-        captionRequired: {
-          default: false,
-          type: 'boolean'
-        },
-        checkEslintrc: {
-          default: true,
-          type: 'boolean'
-        },
-        configFile: {
-          type: 'string'
-        },
-        exampleCodeRegex: {
-          type: 'string'
-        },
-        matchingFileName: {
-          type: 'string'
-        },
-        noDefaultExampleRules: {
-          default: false,
-          type: 'boolean'
-        },
-        paddedIndent: {
-          default: 0,
-          type: 'integer'
-        },
-        rejectExampleCodeRegex: {
-          type: 'string'
-        },
-        reportUnusedDisableDirectives: {
-          default: true,
-          type: 'boolean'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  },
-  noTrim: true
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=checkExamples.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkExamples.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/checkExamples.js.map
deleted file mode 100644
index 7eccc42..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkExamples.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/checkExamples.js"],"names":["zeroBasedLineIndexAdjust","likelyNestedJSDocIndentSpace","preTagSpaceLength","firstLinePrefixLength","hasCaptionRegex","escapeStringRegexp","str","replace","countChars","ch","match","RegExp","length","getRegexFromString","regexString","flags","regex","uniqueFlags","Set","join","report","utils","context","globalState","tagName","getPreferredTagName","hasTag","has","set","Map","matchingFileNameMap","get","options","exampleCodeRegex","rejectExampleCodeRegex","noDefaultExampleRules","checkEslintrc","matchingFileName","filename","paddedIndent","baseConfig","configFile","allowInlineConfig","reportUnusedDisableDirectives","captionRequired","defaultFileName","jsFileName","getFilename","includes","rulePaths","rules","undefined","forEachPreferredTag","tag","targetTagName","source","description","trim","test","sources","nonJSPrefacingCols","nonJSPrefacingLines","startingIndex","lastStringCount","exampleCode","lastIndex","exec","index","n0","n1","preMatch","slice","preMatchLines","colDelta","lastIndexOf","nonJSPreface","nonJSPrefaceLineCount","idx","indexOf","charsInLastLine","string","push","global","checkRules","cliConfig","useEslintrc","cliConfigStr","JSON","stringify","src","fileNameMapKey","file","cliFile","cli","CLIEngine","config","getConfigForFile","executeOnText","results","messages","codeStartLine","line","codeStartCol","forEach","message","column","severity","ruleId","startLine","startCol","iterateAllJsdocs","meta","schema","additionalProperties","properties","default","type","noTrim"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;;;;;;;;;;;;;;;;;AAEA,MAAMA,wBAAwB,GAAG,CAAC,CAAlC;AACA,MAAMC,4BAA4B,GAAG,CAArC;AACA,MAAMC,iBAAiB,GAAG,CAA1B,C,CAEA;;AACA,MAAMC,qBAAqB,GAAGD,iBAA9B;AAEA,MAAME,eAAe,GAAG,gCAAxB;;AAEA,MAAMC,kBAAkB,GAAIC,GAAD,IAAS;AAClC,SAAOA,GAAG,CAACC,OAAJ,CAAY,sBAAZ,EAAoC,MAApC,CAAP;AACD,CAFD;;AAGA,MAAMC,UAAU,GAAG,CAACF,GAAD,EAAMG,EAAN,KAAa;AAC9B,SAAO,CAACH,GAAG,CAACI,KAAJ,CAAU,IAAIC,MAAJ,CAAWN,kBAAkB,CAACI,EAAD,CAA7B,EAAmC,IAAnC,CAAV,KAAuD,EAAxD,EAA4DG,MAAnE;AACD,CAFD;;AAIA,MAAMC,kBAAkB,GAAIC,WAAD,IAAiB;AAC1C,QAAMJ,KAAK,GAAGI,WAAW,CAACJ,KAAZ,CAAkB,wBAAlB,CAAd;AACA,MAAIK,KAAK,GAAG,GAAZ;AACA,MAAIC,KAAK,GAAGF,WAAZ;;AACA,MAAIJ,KAAJ,EAAW;AAAA,gCACUA,KADV;;AACNM,IAAAA,KADM;AACCD,IAAAA,KADD;;AAET,QAAI,CAACA,KAAL,EAAY;AACVA,MAAAA,KAAK,GAAG,GAAR;AACD;;AACD,UAAME,WAAW,GAAG,CAAC,GAAG,IAAIC,GAAJ,CAAQH,KAAR,CAAJ,CAApB;AACAA,IAAAA,KAAK,GAAGE,WAAW,CAACE,IAAZ,CAAiB,EAAjB,CAAR;AACD;;AAED,SAAO,IAAIR,MAAJ,CAAWK,KAAX,EAAkBD,KAAlB,CAAP;AACD,CAdD;;eAgBe,2BAAa,CAAC;AAC3BK,EAAAA,MAD2B;AAE3BC,EAAAA,KAF2B;AAG3BC,EAAAA,OAH2B;AAI3BC,EAAAA;AAJ2B,CAAD,KAKtB;AACJ,oCAAoBD,OAApB,EAA6B,gBAA7B;AACA,QAAME,OAAO,GAAGH,KAAK,CAACI,mBAAN,CAA0B;AAACD,IAAAA,OAAO,EAAE;AAAV,GAA1B,CAAhB;;AACA,MAAI,CAACH,KAAK,CAACK,MAAN,CAAaF,OAAb,CAAL,EAA4B;AAC1B;AACD;;AAED,MAAI,CAACD,WAAW,CAACI,GAAZ,CAAgB,gCAAhB,CAAL,EAAwD;AACtDJ,IAAAA,WAAW,CAACK,GAAZ,CAAgB,gCAAhB,EAAkD,IAAIC,GAAJ,EAAlD;AACD;;AACD,QAAMC,mBAAmB,GAAGP,WAAW,CAACQ,GAAZ,CAAgB,gCAAhB,CAA5B;AAEA,QAAMC,OAAO,GAAGV,OAAO,CAACU,OAAR,CAAgB,CAAhB,KAAsB,EAAtC;AAZI,8BAgBAA,OAhBA,CAcFC,gBAdE;AAAA,MAcFA,gBAdE,sCAciB,IAdjB;AAAA,8BAgBAD,OAhBA,CAeFE,sBAfE;AAAA,MAeFA,sBAfE,sCAeuB,IAfvB;AAAA,gCA2BAF,OA3BA,CAkBFG,qBAlBE;AAAA,QAkBFA,qBAlBE,sCAkBsB,KAlBtB;AAAA,gCA2BAH,OA3BA,CAmBFI,aAnBE;AAAA,QAmBFA,aAnBE,sCAmBc,IAnBd;AAAA,gCA2BAJ,OA3BA,CAoBFK,gBApBE;AAAA,QAoBgBC,QApBhB,sCAoB2B,IApB3B;AAAA,gCA2BAN,OA3BA,CAqBFO,YArBE;AAAA,QAqBFA,YArBE,sCAqBa,CArBb;AAAA,8BA2BAP,OA3BA,CAsBFQ,UAtBE;AAAA,QAsBFA,UAtBE,oCAsBW,EAtBX;AAAA,QAuBFC,UAvBE,GA2BAT,OA3BA,CAuBFS,UAvBE;AAAA,gCA2BAT,OA3BA,CAwBFU,iBAxBE;AAAA,QAwBFA,iBAxBE,sCAwBkB,IAxBlB;AAAA,gCA2BAV,OA3BA,CAyBFW,6BAzBE;AAAA,QAyBFA,6BAzBE,sCAyB8B,IAzB9B;AAAA,gCA2BAX,OA3BA,CA0BFY,eA1BE;AAAA,QA0BFA,eA1BE,sCA0BgB,KA1BhB;AA6BJ,MAAIC,eAAJ;;AACA,MAAI,CAACP,QAAL,EAAe;AACb,UAAMQ,UAAU,GAAGxB,OAAO,CAACyB,WAAR,EAAnB;;AACA,QAAI,OAAOD,UAAP,KAAsB,QAAtB,IAAkCA,UAAU,CAACE,QAAX,CAAoB,GAApB,CAAtC,EAAgE;AAC9DH,MAAAA,eAAe,GAAGC,UAAU,CAACvC,OAAX,CAAmB,QAAnB,EAA6B,KAA7B,CAAlB;AACD,KAFD,MAEO;AACLsC,MAAAA,eAAe,GAAG,UAAlB;AACD;AACF,GArCG,CAuCJ;;;AACA,QAAMI,SAAS,GAAG,EAAlB;AAEA,QAAMC,KAAK,GAAGf,qBAAqB,GAAGgB,SAAH,GAAe;AAChD;AACA,gBAAY,CAFoC;AAIhD;AACA,4BAAwB,CALwB;AAOhD;AACA,0BAAsB,CAR0B;AAUhD;AACA,kBAAc,CAXkC;AAahD;AACA;AACA,+BAA2B,CAfqB;AAiBhD;AACA,gBAAY,CAlBoC;AAoBhD;AACA,sBAAkB,CArB8B;AAuBhD;AACA,8BAA0B,CAxBsB;AAyBhD,+BAA2B,CAzBqB;AA2BhD;AACA,qBAAiB;AA5B+B,GAAlD;;AA+BA,MAAIlB,gBAAJ,EAAsB;AACpBA,IAAAA,gBAAgB,GAAGpB,kBAAkB,CAACoB,gBAAD,CAArC;AACD;;AACD,MAAIC,sBAAJ,EAA4B;AAC1BA,IAAAA,sBAAsB,GAAGrB,kBAAkB,CAACqB,sBAAD,CAA3C;AACD;;AAEDb,EAAAA,KAAK,CAAC+B,mBAAN,CAA0B,SAA1B,EAAqC,CAACC,GAAD,EAAMC,aAAN,KAAwB;AAC3D,QAAIC,MAAM,GAAGF,GAAG,CAACG,WAAjB;AACA,UAAM9C,KAAK,GAAG6C,MAAM,CAAC7C,KAAP,CAAaN,eAAb,CAAd;;AAEA,QAAIwC,eAAe,KAAK,CAAClC,KAAD,IAAU,CAACA,KAAK,CAAC,CAAD,CAAL,CAAS+C,IAAT,EAAhB,CAAnB,EAAqD;AACnDrC,MAAAA,MAAM,CAAC,mCAAD,EAAsC,IAAtC,EAA4CiC,GAA5C,CAAN;AACD,KAN0D,CAQ3D;;;AACAE,IAAAA,MAAM,GAAGA,MAAM,CAAChD,OAAP,CAAeH,eAAf,EAAgC,EAAhC,CAAT;;AAEA,QAAI6B,gBAAgB,IAAI,CAACA,gBAAgB,CAACyB,IAAjB,CAAsBH,MAAtB,CAArB,IACFrB,sBAAsB,IAAIA,sBAAsB,CAACwB,IAAvB,CAA4BH,MAA5B,CAD5B,EAEE;AACA;AACD;;AAED,UAAMI,OAAO,GAAG,EAAhB;;AACA,QAAI1B,gBAAJ,EAAsB;AACpB,UAAI2B,kBAAkB,GAAG,CAAzB;AACA,UAAIC,mBAAmB,GAAG,CAA1B;AAEA,UAAIC,aAAa,GAAG,CAApB;AACA,UAAIC,eAAe,GAAG,CAAtB;AAEA,UAAIC,WAAJ;AACA/B,MAAAA,gBAAgB,CAACgC,SAAjB,GAA6B,CAA7B;;AACA,aAAO,CAACD,WAAW,GAAG/B,gBAAgB,CAACiC,IAAjB,CAAsBX,MAAtB,CAAf,MAAkD,IAAzD,EAA+D;AAAA,6BAC/BS,WAD+B;AAAA,cACtDG,KADsD,gBACtDA,KADsD;AAAA,cAC5CC,EAD4C,gBAC/C,CAD+C;AAAA,cACrCC,EADqC,gBACxC,CADwC,GAG7D;;AACA,cAAMC,QAAQ,GAAGf,MAAM,CAACgB,KAAP,CAAaT,aAAb,EAA4BK,KAA5B,CAAjB;AAEA,cAAMK,aAAa,GAAGhE,UAAU,CAAC8D,QAAD,EAAW,IAAX,CAAhC;AAEA,cAAMG,QAAQ,GAAGD,aAAa,GAC5BF,QAAQ,CAACC,KAAT,CAAeD,QAAQ,CAACI,WAAT,CAAqB,IAArB,IAA6B,CAA5C,EAA+C9D,MADnB,GAE5B0D,QAAQ,CAAC1D,MAFX;AAIA,YAAI+D,YAAJ;AACA,YAAIC,qBAAJ;;AACA,YAAIP,EAAJ,EAAQ;AACN,gBAAMQ,GAAG,GAAGT,EAAE,CAACU,OAAH,CAAWT,EAAX,CAAZ;AACAM,UAAAA,YAAY,GAAGP,EAAE,CAACG,KAAH,CAAS,CAAT,EAAYM,GAAZ,CAAf;AACAD,UAAAA,qBAAqB,GAAGpE,UAAU,CAACmE,YAAD,EAAe,IAAf,CAAlC;AACD,SAJD,MAIO;AACLA,UAAAA,YAAY,GAAG,EAAf;AACAC,UAAAA,qBAAqB,GAAG,CAAxB;AACD;;AAEDf,QAAAA,mBAAmB,IAAIE,eAAe,GAAGS,aAAlB,GAAkCI,qBAAzD,CAvB6D,CAyB7D;;AACA,YAAIA,qBAAJ,EAA2B;AACzB,gBAAMG,eAAe,GAAGJ,YAAY,CAACJ,KAAb,CAAmBI,YAAY,CAACD,WAAb,CAAyB,IAAzB,IAAiC,CAApD,EAAuD9D,MAA/E;AAEAgD,UAAAA,kBAAkB,IAAImB,eAAtB;AACD,SAJD,MAIO;AACLnB,UAAAA,kBAAkB,IAAIa,QAAQ,GAAGE,YAAY,CAAC/D,MAA9C;AACD;;AAED,cAAMoE,MAAM,GAAGX,EAAE,IAAID,EAArB;AACAT,QAAAA,OAAO,CAACsB,IAAR,CAAa;AACXrB,UAAAA,kBADW;AAEXC,UAAAA,mBAFW;AAGXmB,UAAAA;AAHW,SAAb;AAKAlB,QAAAA,aAAa,GAAG7B,gBAAgB,CAACgC,SAAjC;AACAF,QAAAA,eAAe,GAAGvD,UAAU,CAACwE,MAAD,EAAS,IAAT,CAA5B;;AACA,YAAI,CAAC/C,gBAAgB,CAACiD,MAAtB,EAA8B;AAC5B;AACD;AACF;AACF,KAvDD,MAuDO;AACLvB,MAAAA,OAAO,CAACsB,IAAR,CAAa;AACXrB,QAAAA,kBAAkB,EAAE,CADT;AAEXC,QAAAA,mBAAmB,EAAE,CAFV;AAGXmB,QAAAA,MAAM,EAAEzB;AAHG,OAAb;AAKD,KA/E0D,CAiF3D;AACA;;;AACA,UAAM4B,UAAU,GAAG,SAAbA,UAAa,CAAU;AAC3BvB,MAAAA,kBAD2B;AAE3BC,MAAAA,mBAF2B;AAG3BmB,MAAAA;AAH2B,KAAV,EAIhB;AACD,YAAMI,SAAS,GAAG;AAChB1C,QAAAA,iBADgB;AAEhBF,QAAAA,UAFgB;AAGhBC,QAAAA,UAHgB;AAIhBE,QAAAA,6BAJgB;AAKhBM,QAAAA,SALgB;AAMhBC,QAAAA,KANgB;AAOhBmC,QAAAA,WAAW,EAAEjD;AAPG,OAAlB;AASA,YAAMkD,YAAY,GAAGC,IAAI,CAACC,SAAL,CAAeJ,SAAf,CAArB;AAEA,YAAMK,GAAG,GAAGlD,YAAY,GACtByC,MAAM,CAACzE,OAAP,CAAe,IAAII,MAAJ,CAAY,WAAU4B,YAAa,QAAnC,EAA4C,IAA5C,CAAf,EAAkE,IAAlE,CADsB,GAEtByC,MAFF,CAZC,CAgBD;;AACA,YAAMU,cAAc,GAAGpD,QAAQ,GAC7B,MAAMgD,YAAN,GAAqBhD,QADQ,GAE7B,MAAMgD,YAAN,GAAqBzC,eAFvB;AAGA,YAAM8C,IAAI,GAAGrD,QAAQ,IAAIO,eAAzB;AACA,UAAI+C,OAAJ;;AACA,UAAI9D,mBAAmB,CAACH,GAApB,CAAwB+D,cAAxB,CAAJ,EAA6C;AAC3CE,QAAAA,OAAO,GAAG9D,mBAAmB,CAACC,GAApB,CAAwB2D,cAAxB,CAAV;AACD,OAFD,MAEO;AACL,cAAMG,GAAG,GAAG,IAAIC,iBAAJ,CAAcV,SAAd,CAAZ;AACA,YAAIW,MAAJ;;AACA,YAAIzD,QAAQ,IAAIF,aAAhB,EAA+B;AAC7B2D,UAAAA,MAAM,GAAGF,GAAG,CAACG,gBAAJ,CAAqBL,IAArB,CAAT;AACD,SALI,CAOL;AACA;AACA;;;AACAC,QAAAA,OAAO,GAAG,IAAIE,iBAAJ,CAAc;AACtBpD,UAAAA,iBADsB;AAEtBF,UAAAA,UAAU,oBACLA,UADK,MAELuD,MAFK,CAFY;AAMtBtD,UAAAA,UANsB;AAOtBE,UAAAA,6BAPsB;AAQtBM,UAAAA,SARsB;AAStBC,UAAAA,KATsB;AAUtBmC,UAAAA,WAAW,EAAE;AAVS,SAAd,CAAV;AAYAvD,QAAAA,mBAAmB,CAACF,GAApB,CAAwB8D,cAAxB,EAAwCE,OAAxC;AACD;;AA/CA,oCAkDCA,OAAO,CAACK,aAAR,CAAsBR,GAAtB,CAlDD;AAAA,0EAiDMS,OAjDN;AAAA,YAiDiBC,QAjDjB,6BAiDiBA,QAjDjB,EAoDD;;;AACA,YAAMC,aAAa,GAAG/C,GAAG,CAACgD,IAAJ,GAAWxC,mBAAjC;AACA,YAAMyC,YAAY,GAAGrG,4BAArB;AAEAkG,MAAAA,QAAQ,CAACI,OAAT,CAAiB,CAAC;AAACC,QAAAA,OAAD;AAAUH,QAAAA,IAAV;AAAgBI,QAAAA,MAAhB;AAAwBC,QAAAA,QAAxB;AAAkCC,QAAAA;AAAlC,OAAD,KAA+C;AAC9D,cAAMC,SAAS,GAAGR,aAAa,GAAGC,IAAhB,GAAuBrG,wBAAzC;AACA,cAAM6G,QAAQ,GAAGP,YAAY,KAE3B;AACAD,QAAAA,IAAI,IAAI,CAAR,GAAYzC,kBAAkB,GAAGzD,qBAAjC,GAAyDD,iBAH9B,CAAZ,GAIbuG,MAJJ;AAMArF,QAAAA,MAAM,CACJ,MAAMkC,aAAN,GAAsB,GAAtB,IAA6BoD,QAAQ,KAAK,CAAb,GAAiB,OAAjB,GAA2B,SAAxD,KACGC,MAAM,GAAG,OAAOA,MAAP,GAAgB,GAAnB,GAAyB,EADlC,IACwC,IADxC,GAEEH,OAHE,EAIJ,IAJI,EAKJ;AACEC,UAAAA,MAAM,EAAEI,QADV;AAEER,UAAAA,IAAI,EAAEO;AAFR,SALI,CAAN;AAUD,OAlBD;AAmBD,KA/ED;;AAiFAjD,IAAAA,OAAO,CAAC4C,OAAR,CAAgBpB,UAAhB;AACD,GArKD;AAsKD,CA3Pc,EA2PZ;AACD2B,EAAAA,gBAAgB,EAAE,IADjB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,oBAAoB,EAAE,KADxB;AAEEC,MAAAA,UAAU,EAAE;AACVxE,QAAAA,iBAAiB,EAAE;AACjByE,UAAAA,OAAO,EAAE,IADQ;AAEjBC,UAAAA,IAAI,EAAE;AAFW,SADT;AAKV5E,QAAAA,UAAU,EAAE;AACV4E,UAAAA,IAAI,EAAE;AADI,SALF;AAQVxE,QAAAA,eAAe,EAAE;AACfuE,UAAAA,OAAO,EAAE,KADM;AAEfC,UAAAA,IAAI,EAAE;AAFS,SARP;AAYVhF,QAAAA,aAAa,EAAE;AACb+E,UAAAA,OAAO,EAAE,IADI;AAEbC,UAAAA,IAAI,EAAE;AAFO,SAZL;AAgBV3E,QAAAA,UAAU,EAAE;AACV2E,UAAAA,IAAI,EAAE;AADI,SAhBF;AAmBVnF,QAAAA,gBAAgB,EAAE;AAChBmF,UAAAA,IAAI,EAAE;AADU,SAnBR;AAsBV/E,QAAAA,gBAAgB,EAAE;AAChB+E,UAAAA,IAAI,EAAE;AADU,SAtBR;AAyBVjF,QAAAA,qBAAqB,EAAE;AACrBgF,UAAAA,OAAO,EAAE,KADY;AAErBC,UAAAA,IAAI,EAAE;AAFe,SAzBb;AA6BV7E,QAAAA,YAAY,EAAE;AACZ4E,UAAAA,OAAO,EAAE,CADG;AAEZC,UAAAA,IAAI,EAAE;AAFM,SA7BJ;AAiCVlF,QAAAA,sBAAsB,EAAE;AACtBkF,UAAAA,IAAI,EAAE;AADgB,SAjCd;AAoCVzE,QAAAA,6BAA6B,EAAE;AAC7BwE,UAAAA,OAAO,EAAE,IADoB;AAE7BC,UAAAA,IAAI,EAAE;AAFuB;AApCrB,OAFd;AA2CEA,MAAAA,IAAI,EAAE;AA3CR,KADM,CADJ;AAgDJA,IAAAA,IAAI,EAAE;AAhDF,GAFL;AAoDDC,EAAAA,MAAM,EAAE;AApDP,CA3PY,C","sourcesContent":["import {CLIEngine} from 'eslint';\nimport iterateJsdoc from '../iterateJsdoc';\nimport warnRemovedSettings from '../warnRemovedSettings';\n\nconst zeroBasedLineIndexAdjust = -1;\nconst likelyNestedJSDocIndentSpace = 1;\nconst preTagSpaceLength = 1;\n\n// If a space is present, we should ignore it\nconst firstLinePrefixLength = preTagSpaceLength;\n\nconst hasCaptionRegex = /^\\s*<caption>(.*?)<\\/caption>/u;\n\nconst escapeStringRegexp = (str) => {\n  return str.replace(/[.*+?^${}()|[\\]\\\\]/gu, '\\\\$&');\n};\nconst countChars = (str, ch) => {\n  return (str.match(new RegExp(escapeStringRegexp(ch), 'gu')) || []).length;\n};\n\nconst getRegexFromString = (regexString) => {\n  const match = regexString.match(/^\\/(.*)\\/([gimyus]*)$/u);\n  let flags = 'u';\n  let regex = regexString;\n  if (match) {\n    [, regex, flags] = match;\n    if (!flags) {\n      flags = 'u';\n    }\n    const uniqueFlags = [...new Set(flags)];\n    flags = uniqueFlags.join('');\n  }\n\n  return new RegExp(regex, flags);\n};\n\nexport default iterateJsdoc(({\n  report,\n  utils,\n  context,\n  globalState,\n}) => {\n  warnRemovedSettings(context, 'check-examples');\n  const tagName = utils.getPreferredTagName({tagName: 'example'});\n  if (!utils.hasTag(tagName)) {\n    return;\n  }\n\n  if (!globalState.has('checkExamples-matchingFileName')) {\n    globalState.set('checkExamples-matchingFileName', new Map());\n  }\n  const matchingFileNameMap = globalState.get('checkExamples-matchingFileName');\n\n  const options = context.options[0] || {};\n  let {\n    exampleCodeRegex = null,\n    rejectExampleCodeRegex = null,\n  } = options;\n  const {\n    noDefaultExampleRules = false,\n    checkEslintrc = true,\n    matchingFileName: filename = null,\n    paddedIndent = 0,\n    baseConfig = {},\n    configFile,\n    allowInlineConfig = true,\n    reportUnusedDisableDirectives = true,\n    captionRequired = false,\n  } = options;\n\n  let defaultFileName;\n  if (!filename) {\n    const jsFileName = context.getFilename();\n    if (typeof jsFileName === 'string' && jsFileName.includes('.')) {\n      defaultFileName = jsFileName.replace(/\\..*?$/, '.md');\n    } else {\n      defaultFileName = 'dummy.md';\n    }\n  }\n\n  // Make this configurable?\n  const rulePaths = [];\n\n  const rules = noDefaultExampleRules ? undefined : {\n    // \"always\" newline rule at end unlikely in sample code\n    'eol-last': 0,\n\n    // Wouldn't generally expect example paths to resolve relative to JS file\n    'import/no-unresolved': 0,\n\n    // Snippets likely too short to always include import/export info\n    'import/unambiguous': 0,\n\n    // Unlikely to have inadvertent debugging within examples\n    'no-console': 0,\n\n    // Often wish to start `@example` code after newline; also may use\n    //   empty lines for spacing\n    'no-multiple-empty-lines': 0,\n\n    // Many variables in examples will be `undefined`\n    'no-undef': 0,\n\n    // Common to define variables for clarity without always using them\n    'no-unused-vars': 0,\n\n    // See import/no-unresolved\n    'node/no-missing-import': 0,\n    'node/no-missing-require': 0,\n\n    // Can generally look nicer to pad a little even if code imposes more stringency\n    'padded-blocks': 0,\n  };\n\n  if (exampleCodeRegex) {\n    exampleCodeRegex = getRegexFromString(exampleCodeRegex);\n  }\n  if (rejectExampleCodeRegex) {\n    rejectExampleCodeRegex = getRegexFromString(rejectExampleCodeRegex);\n  }\n\n  utils.forEachPreferredTag('example', (tag, targetTagName) => {\n    let source = tag.description;\n    const match = source.match(hasCaptionRegex);\n\n    if (captionRequired && (!match || !match[1].trim())) {\n      report('Caption is expected for examples.', null, tag);\n    }\n\n    // If we allow newlines in hasCaptionRegex, we should add to line count\n    source = source.replace(hasCaptionRegex, '');\n\n    if (exampleCodeRegex && !exampleCodeRegex.test(source) ||\n      rejectExampleCodeRegex && rejectExampleCodeRegex.test(source)\n    ) {\n      return;\n    }\n\n    const sources = [];\n    if (exampleCodeRegex) {\n      let nonJSPrefacingCols = 0;\n      let nonJSPrefacingLines = 0;\n\n      let startingIndex = 0;\n      let lastStringCount = 0;\n\n      let exampleCode;\n      exampleCodeRegex.lastIndex = 0;\n      while ((exampleCode = exampleCodeRegex.exec(source)) !== null) {\n        const {index, 0: n0, 1: n1} = exampleCode;\n\n        // Count anything preceding user regex match (can affect line numbering)\n        const preMatch = source.slice(startingIndex, index);\n\n        const preMatchLines = countChars(preMatch, '\\n');\n\n        const colDelta = preMatchLines ?\n          preMatch.slice(preMatch.lastIndexOf('\\n') + 1).length :\n          preMatch.length;\n\n        let nonJSPreface;\n        let nonJSPrefaceLineCount;\n        if (n1) {\n          const idx = n0.indexOf(n1);\n          nonJSPreface = n0.slice(0, idx);\n          nonJSPrefaceLineCount = countChars(nonJSPreface, '\\n');\n        } else {\n          nonJSPreface = '';\n          nonJSPrefaceLineCount = 0;\n        }\n\n        nonJSPrefacingLines += lastStringCount + preMatchLines + nonJSPrefaceLineCount;\n\n        // Ignore `preMatch` delta if newlines here\n        if (nonJSPrefaceLineCount) {\n          const charsInLastLine = nonJSPreface.slice(nonJSPreface.lastIndexOf('\\n') + 1).length;\n\n          nonJSPrefacingCols += charsInLastLine;\n        } else {\n          nonJSPrefacingCols += colDelta + nonJSPreface.length;\n        }\n\n        const string = n1 || n0;\n        sources.push({\n          nonJSPrefacingCols,\n          nonJSPrefacingLines,\n          string,\n        });\n        startingIndex = exampleCodeRegex.lastIndex;\n        lastStringCount = countChars(string, '\\n');\n        if (!exampleCodeRegex.global) {\n          break;\n        }\n      }\n    } else {\n      sources.push({\n        nonJSPrefacingCols: 0,\n        nonJSPrefacingLines: 0,\n        string: source,\n      });\n    }\n\n    // Todo: Make fixable\n    // Todo: Fix whitespace indent\n    const checkRules = function ({\n      nonJSPrefacingCols,\n      nonJSPrefacingLines,\n      string,\n    }) {\n      const cliConfig = {\n        allowInlineConfig,\n        baseConfig,\n        configFile,\n        reportUnusedDisableDirectives,\n        rulePaths,\n        rules,\n        useEslintrc: checkEslintrc,\n      };\n      const cliConfigStr = JSON.stringify(cliConfig);\n\n      const src = paddedIndent ?\n        string.replace(new RegExp(`(^|\\n) {${paddedIndent}}(?!$)`, 'gu'), '\\n') :\n        string;\n\n      // Programmatic ESLint API: https://eslint.org/docs/developer-guide/nodejs-api\n      const fileNameMapKey = filename ?\n        'a' + cliConfigStr + filename :\n        'b' + cliConfigStr + defaultFileName;\n      const file = filename || defaultFileName;\n      let cliFile;\n      if (matchingFileNameMap.has(fileNameMapKey)) {\n        cliFile = matchingFileNameMap.get(fileNameMapKey);\n      } else {\n        const cli = new CLIEngine(cliConfig);\n        let config;\n        if (filename || checkEslintrc) {\n          config = cli.getConfigForFile(file);\n        }\n\n        // We need a new instance to ensure that the rules that may only\n        //  be available to `file` (if it has its own `.eslintrc`),\n        //  will be defined.\n        cliFile = new CLIEngine({\n          allowInlineConfig,\n          baseConfig: {\n            ...baseConfig,\n            ...config,\n          },\n          configFile,\n          reportUnusedDisableDirectives,\n          rulePaths,\n          rules,\n          useEslintrc: false,\n        });\n        matchingFileNameMap.set(fileNameMapKey, cliFile);\n      }\n\n      const {results: [{messages}]} =\n        cliFile.executeOnText(src);\n\n      // NOTE: `tag.line` can be 0 if of form `/** @tag ... */`\n      const codeStartLine = tag.line + nonJSPrefacingLines;\n      const codeStartCol = likelyNestedJSDocIndentSpace;\n\n      messages.forEach(({message, line, column, severity, ruleId}) => {\n        const startLine = codeStartLine + line + zeroBasedLineIndexAdjust;\n        const startCol = codeStartCol + (\n\n          // This might not work for line 0, but line 0 is unlikely for examples\n          line <= 1 ? nonJSPrefacingCols + firstLinePrefixLength : preTagSpaceLength\n        ) + column;\n\n        report(\n          '@' + targetTagName + ' ' + (severity === 2 ? 'error' : 'warning') +\n            (ruleId ? ' (' + ruleId + ')' : '') + ': ' +\n            message,\n          null,\n          {\n            column: startCol,\n            line: startLine,\n          },\n        );\n      });\n    };\n\n    sources.forEach(checkRules);\n  });\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          allowInlineConfig: {\n            default: true,\n            type: 'boolean',\n          },\n          baseConfig: {\n            type: 'object',\n          },\n          captionRequired: {\n            default: false,\n            type: 'boolean',\n          },\n          checkEslintrc: {\n            default: true,\n            type: 'boolean',\n          },\n          configFile: {\n            type: 'string',\n          },\n          exampleCodeRegex: {\n            type: 'string',\n          },\n          matchingFileName: {\n            type: 'string',\n          },\n          noDefaultExampleRules: {\n            default: false,\n            type: 'boolean',\n          },\n          paddedIndent: {\n            default: 0,\n            type: 'integer',\n          },\n          rejectExampleCodeRegex: {\n            type: 'string',\n          },\n          reportUnusedDisableDirectives: {\n            default: true,\n            type: 'boolean',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n  noTrim: true,\n});\n"],"file":"checkExamples.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkIndentation.js b/node_modules/eslint-plugin-jsdoc/dist/rules/checkIndentation.js
deleted file mode 100644
index 1ee82e8..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkIndentation.js
+++ /dev/null
@@ -1,67 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const maskExcludedContent = (str, excludeTags) => {
-  const regContent = new RegExp(`([ \\t]+\\*)[ \\t]@(?:${excludeTags.join('|')})(?=[ \\n])([\\w|\\W]*?\\n)(?=[ \\t]*\\*(?:[ \\t]*@|\\/))`, 'gu');
-  return str.replace(regContent, (match, margin, code) => {
-    return new Array(code.match(/\n/gu).length + 1).join(margin + '\n');
-  });
-};
-
-const maskCodeBlocks = str => {
-  const regContent = /([ \t]+\*)[ \t]```[^\n]*?([\w|\W]*?\n)(?=[ \t]*\*(?:[ \t]*(?:```|@)|\/))/gu;
-  return str.replace(regContent, (match, margin, code) => {
-    return new Array(code.match(/\n/gu).length + 1).join(margin + '\n');
-  });
-};
-
-var _default = (0, _iterateJsdoc.default)(({
-  sourceCode,
-  jsdocNode,
-  report,
-  context
-}) => {
-  const options = context.options[0] || {};
-  const _options$excludeTags = options.excludeTags,
-        excludeTags = _options$excludeTags === void 0 ? ['example'] : _options$excludeTags;
-  const reg = new RegExp(/^(?:\/?\**|[ \t]*)\*[ \t]{2}/gmu);
-  const textWithoutCodeBlocks = maskCodeBlocks(sourceCode.getText(jsdocNode));
-  const text = excludeTags.length ? maskExcludedContent(textWithoutCodeBlocks, excludeTags) : textWithoutCodeBlocks;
-
-  if (reg.test(text)) {
-    const lineBreaks = text.slice(0, reg.lastIndex).match(/\n/gu) || [];
-    report('There must be no indentation.', null, {
-      line: lineBreaks.length
-    });
-  }
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        excludeTags: {
-          items: {
-            pattern: '^\\S+$',
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'layout'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=checkIndentation.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkIndentation.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/checkIndentation.js.map
deleted file mode 100644
index 20cc48f..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkIndentation.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/checkIndentation.js"],"names":["maskExcludedContent","str","excludeTags","regContent","RegExp","join","replace","match","margin","code","Array","length","maskCodeBlocks","sourceCode","jsdocNode","report","context","options","reg","textWithoutCodeBlocks","getText","text","test","lineBreaks","slice","lastIndex","line","iterateAllJsdocs","meta","schema","additionalProperties","properties","items","pattern","type"],"mappings":";;;;;;;AAAA;;;;AAEA,MAAMA,mBAAmB,GAAG,CAACC,GAAD,EAAMC,WAAN,KAAsB;AAChD,QAAMC,UAAU,GAAG,IAAIC,MAAJ,CAAY,yBAAwBF,WAAW,CAACG,IAAZ,CAAiB,GAAjB,CAAsB,2DAA1D,EAAsH,IAAtH,CAAnB;AAEA,SAAOJ,GAAG,CAACK,OAAJ,CAAYH,UAAZ,EAAwB,CAACI,KAAD,EAAQC,MAAR,EAAgBC,IAAhB,KAAyB;AACtD,WAAO,IAAIC,KAAJ,CAAUD,IAAI,CAACF,KAAL,CAAW,MAAX,EAAmBI,MAAnB,GAA4B,CAAtC,EAAyCN,IAAzC,CAA8CG,MAAM,GAAG,IAAvD,CAAP;AACD,GAFM,CAAP;AAGD,CAND;;AAQA,MAAMI,cAAc,GAAIX,GAAD,IAAS;AAC9B,QAAME,UAAU,GAAG,4EAAnB;AAEA,SAAOF,GAAG,CAACK,OAAJ,CAAYH,UAAZ,EAAwB,CAACI,KAAD,EAAQC,MAAR,EAAgBC,IAAhB,KAAyB;AACtD,WAAO,IAAIC,KAAJ,CAAUD,IAAI,CAACF,KAAL,CAAW,MAAX,EAAmBI,MAAnB,GAA4B,CAAtC,EAAyCN,IAAzC,CAA8CG,MAAM,GAAG,IAAvD,CAAP;AACD,GAFM,CAAP;AAGD,CAND;;eAQe,2BAAa,CAAC;AAC3BK,EAAAA,UAD2B;AAE3BC,EAAAA,SAF2B;AAG3BC,EAAAA,MAH2B;AAI3BC,EAAAA;AAJ2B,CAAD,KAKtB;AACJ,QAAMC,OAAO,GAAGD,OAAO,CAACC,OAAR,CAAgB,CAAhB,KAAsB,EAAtC;AADI,+BAIAA,OAJA,CAGFf,WAHE;AAAA,QAGFA,WAHE,qCAGY,CAAC,SAAD,CAHZ;AAMJ,QAAMgB,GAAG,GAAG,IAAId,MAAJ,CAAW,iCAAX,CAAZ;AACA,QAAMe,qBAAqB,GAAGP,cAAc,CAACC,UAAU,CAACO,OAAX,CAAmBN,SAAnB,CAAD,CAA5C;AACA,QAAMO,IAAI,GAAGnB,WAAW,CAACS,MAAZ,GAAqBX,mBAAmB,CAACmB,qBAAD,EAAwBjB,WAAxB,CAAxC,GAA+EiB,qBAA5F;;AAEA,MAAID,GAAG,CAACI,IAAJ,CAASD,IAAT,CAAJ,EAAoB;AAClB,UAAME,UAAU,GAAGF,IAAI,CAACG,KAAL,CAAW,CAAX,EAAcN,GAAG,CAACO,SAAlB,EAA6BlB,KAA7B,CAAmC,MAAnC,KAA8C,EAAjE;AACAQ,IAAAA,MAAM,CAAC,+BAAD,EAAkC,IAAlC,EAAwC;AAC5CW,MAAAA,IAAI,EAAEH,UAAU,CAACZ;AAD2B,KAAxC,CAAN;AAGD;AACF,CArBc,EAqBZ;AACDgB,EAAAA,gBAAgB,EAAE,IADjB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,MAAM,EAAE,CAAC;AACPC,MAAAA,oBAAoB,EAAE,KADf;AAEPC,MAAAA,UAAU,EAAE;AACV7B,QAAAA,WAAW,EAAE;AACX8B,UAAAA,KAAK,EAAE;AACLC,YAAAA,OAAO,EAAE,QADJ;AAELC,YAAAA,IAAI,EAAE;AAFD,WADI;AAKXA,UAAAA,IAAI,EAAE;AALK;AADH,OAFL;AAWPA,MAAAA,IAAI,EAAE;AAXC,KAAD,CADJ;AAcJA,IAAAA,IAAI,EAAE;AAdF;AAFL,CArBY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nconst maskExcludedContent = (str, excludeTags) => {\n  const regContent = new RegExp(`([ \\\\t]+\\\\*)[ \\\\t]@(?:${excludeTags.join('|')})(?=[ \\\\n])([\\\\w|\\\\W]*?\\\\n)(?=[ \\\\t]*\\\\*(?:[ \\\\t]*@|\\\\/))`, 'gu');\n\n  return str.replace(regContent, (match, margin, code) => {\n    return new Array(code.match(/\\n/gu).length + 1).join(margin + '\\n');\n  });\n};\n\nconst maskCodeBlocks = (str) => {\n  const regContent = /([ \\t]+\\*)[ \\t]```[^\\n]*?([\\w|\\W]*?\\n)(?=[ \\t]*\\*(?:[ \\t]*(?:```|@)|\\/))/gu;\n\n  return str.replace(regContent, (match, margin, code) => {\n    return new Array(code.match(/\\n/gu).length + 1).join(margin + '\\n');\n  });\n};\n\nexport default iterateJsdoc(({\n  sourceCode,\n  jsdocNode,\n  report,\n  context,\n}) => {\n  const options = context.options[0] || {};\n  const {\n    excludeTags = ['example'],\n  } = options;\n\n  const reg = new RegExp(/^(?:\\/?\\**|[ \\t]*)\\*[ \\t]{2}/gmu);\n  const textWithoutCodeBlocks = maskCodeBlocks(sourceCode.getText(jsdocNode));\n  const text = excludeTags.length ? maskExcludedContent(textWithoutCodeBlocks, excludeTags) : textWithoutCodeBlocks;\n\n  if (reg.test(text)) {\n    const lineBreaks = text.slice(0, reg.lastIndex).match(/\\n/gu) || [];\n    report('There must be no indentation.', null, {\n      line: lineBreaks.length,\n    });\n  }\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    schema: [{\n      additionalProperties: false,\n      properties: {\n        excludeTags: {\n          items: {\n            pattern: '^\\\\S+$',\n            type: 'string',\n          },\n          type: 'array',\n        },\n      },\n      type: 'object',\n    }],\n    type: 'layout',\n  },\n});\n"],"file":"checkIndentation.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkParamNames.js b/node_modules/eslint-plugin-jsdoc/dist/rules/checkParamNames.js
deleted file mode 100644
index 1de28e4..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkParamNames.js
+++ /dev/null
@@ -1,146 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const validateParameterNames = (targetTagName, allowExtraTrailingParamDocs, functionParameterNames, jsdoc, jsdocNode, utils, report) => {
-  const paramTags = Object.entries(jsdoc.tags).filter(([, tag]) => {
-    return tag.tag === targetTagName;
-  });
-  const paramTagsNonNested = paramTags.filter(([, tag]) => {
-    return !tag.name.includes('.');
-  });
-  let dotted = 0;
-  return paramTags.some(([, tag], index) => {
-    let tagsIndex;
-    const dupeTagInfo = paramTags.find(([tgsIndex, tg], idx) => {
-      tagsIndex = tgsIndex;
-      return tg.name === tag.name && idx !== index;
-    });
-
-    if (dupeTagInfo) {
-      utils.reportJSDoc(`Duplicate @${targetTagName} "${tag.name}"`, dupeTagInfo[1], () => {
-        jsdoc.tags.splice(tagsIndex, 1);
-      });
-      return true;
-    }
-
-    if (tag.name.includes('.')) {
-      dotted++;
-      return false;
-    }
-
-    const functionParameterName = functionParameterNames[index - dotted];
-
-    if (!functionParameterName) {
-      if (allowExtraTrailingParamDocs) {
-        return false;
-      }
-
-      report(`@${targetTagName} "${tag.name}" does not match an existing function parameter.`, null, tag);
-      return true;
-    }
-
-    if (functionParameterName === '<ObjectPattern>' || functionParameterName === '<ArrayPattern>') {
-      return false;
-    }
-
-    if (functionParameterName !== tag.name.trim()) {
-      const expectedNames = functionParameterNames.join(', ');
-      const actualNames = paramTagsNonNested.map(([, {
-        name
-      }]) => {
-        return name.trim();
-      }).join(', ');
-      report(`Expected @${targetTagName} names to be "${expectedNames}". Got "${actualNames}".`, null, tag);
-      return true;
-    }
-
-    return false;
-  });
-};
-
-const validateParameterNamesDeep = (targetTagName, allowExtraTrailingParamDocs, jsdocParameterNames, jsdoc, report) => {
-  let lastRealParameter;
-  return jsdocParameterNames.some(({
-    name: jsdocParameterName,
-    idx
-  }) => {
-    const isPropertyPath = jsdocParameterName.includes('.');
-
-    if (isPropertyPath) {
-      if (!lastRealParameter) {
-        report(`@${targetTagName} path declaration ("${jsdocParameterName}") appears before any real parameter.`, null, jsdoc.tags[idx]);
-        return true;
-      }
-
-      let pathRootNodeName = jsdocParameterName.slice(0, jsdocParameterName.indexOf('.'));
-
-      if (pathRootNodeName.endsWith('[]')) {
-        pathRootNodeName = pathRootNodeName.slice(0, -2);
-      }
-
-      if (pathRootNodeName !== lastRealParameter) {
-        report(`@${targetTagName} path declaration ("${jsdocParameterName}") root node name ("${pathRootNodeName}") ` + `does not match previous real parameter name ("${lastRealParameter}").`, null, jsdoc.tags[idx]);
-        return true;
-      }
-    } else {
-      lastRealParameter = jsdocParameterName;
-    }
-
-    return false;
-  });
-};
-
-var _default = (0, _iterateJsdoc.default)(({
-  context,
-  jsdoc,
-  jsdocNode,
-  report,
-  utils
-}) => {
-  const _ref = context.options[0] || {},
-        allowExtraTrailingParamDocs = _ref.allowExtraTrailingParamDocs;
-
-  const jsdocParameterNamesDeep = utils.getJsdocTagsDeep('param');
-
-  if (!jsdocParameterNamesDeep.length) {
-    return;
-  }
-
-  const functionParameterNames = utils.getFunctionParameterNames();
-  const targetTagName = utils.getPreferredTagName({
-    tagName: 'param'
-  });
-  const isError = validateParameterNames(targetTagName, allowExtraTrailingParamDocs, functionParameterNames, jsdoc, jsdocNode, utils, report);
-
-  if (isError) {
-    return;
-  }
-
-  validateParameterNamesDeep(targetTagName, allowExtraTrailingParamDocs, jsdocParameterNamesDeep, jsdoc, report);
-}, {
-  meta: {
-    fixable: 'code',
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        allowExtraTrailingParamDocs: {
-          type: 'boolean'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=checkParamNames.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkParamNames.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/checkParamNames.js.map
deleted file mode 100644
index ffd18bf..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkParamNames.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/checkParamNames.js"],"names":["validateParameterNames","targetTagName","allowExtraTrailingParamDocs","functionParameterNames","jsdoc","jsdocNode","utils","report","paramTags","Object","entries","tags","filter","tag","paramTagsNonNested","name","includes","dotted","some","index","tagsIndex","dupeTagInfo","find","tgsIndex","tg","idx","reportJSDoc","splice","functionParameterName","trim","expectedNames","join","actualNames","map","validateParameterNamesDeep","jsdocParameterNames","lastRealParameter","jsdocParameterName","isPropertyPath","pathRootNodeName","slice","indexOf","endsWith","context","options","jsdocParameterNamesDeep","getJsdocTagsDeep","length","getFunctionParameterNames","getPreferredTagName","tagName","isError","meta","fixable","schema","additionalProperties","properties","type"],"mappings":"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","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nconst validateParameterNames = (\n  targetTagName : string, allowExtraTrailingParamDocs: boolean,\n  functionParameterNames : Array<string>, jsdoc, jsdocNode, utils, report,\n) => {\n  const paramTags = Object.entries(jsdoc.tags).filter(([, tag]) => {\n    return tag.tag === targetTagName;\n  });\n  const paramTagsNonNested = paramTags.filter(([, tag]) => {\n    return !tag.name.includes('.');\n  });\n\n  let dotted = 0;\n\n  return paramTags.some(([, tag], index) => {\n    let tagsIndex;\n    const dupeTagInfo = paramTags.find(([tgsIndex, tg], idx) => {\n      tagsIndex = tgsIndex;\n\n      return tg.name === tag.name && idx !== index;\n    });\n    if (dupeTagInfo) {\n      utils.reportJSDoc(`Duplicate @${targetTagName} \"${tag.name}\"`, dupeTagInfo[1], () => {\n        jsdoc.tags.splice(tagsIndex, 1);\n      });\n\n      return true;\n    }\n    if (tag.name.includes('.')) {\n      dotted++;\n\n      return false;\n    }\n\n    const functionParameterName = functionParameterNames[index - dotted];\n\n    if (!functionParameterName) {\n      if (allowExtraTrailingParamDocs) {\n        return false;\n      }\n\n      report(\n        `@${targetTagName} \"${tag.name}\" does not match an existing function parameter.`,\n        null,\n        tag,\n      );\n\n      return true;\n    }\n\n    if (functionParameterName === '<ObjectPattern>' || functionParameterName === '<ArrayPattern>') {\n      return false;\n    }\n\n    if (functionParameterName !== tag.name.trim()) {\n      const expectedNames = functionParameterNames.join(', ');\n      const actualNames = paramTagsNonNested.map(([, {name}]) => {\n        return name.trim();\n      }).join(', ');\n\n      report(\n        `Expected @${targetTagName} names to be \"${expectedNames}\". Got \"${actualNames}\".`,\n        null,\n        tag,\n      );\n\n      return true;\n    }\n\n    return false;\n  });\n};\n\nconst validateParameterNamesDeep = (\n  targetTagName : string, allowExtraTrailingParamDocs: boolean,\n  jsdocParameterNames : Array<string>, jsdoc, report : Function,\n) => {\n  let lastRealParameter;\n\n  return jsdocParameterNames.some(({name: jsdocParameterName, idx}) => {\n    const isPropertyPath = jsdocParameterName.includes('.');\n\n    if (isPropertyPath) {\n      if (!lastRealParameter) {\n        report(`@${targetTagName} path declaration (\"${jsdocParameterName}\") appears before any real parameter.`, null, jsdoc.tags[idx]);\n\n        return true;\n      }\n\n      let pathRootNodeName = jsdocParameterName.slice(0, jsdocParameterName.indexOf('.'));\n\n      if (pathRootNodeName.endsWith('[]')) {\n        pathRootNodeName = pathRootNodeName.slice(0, -2);\n      }\n\n      if (pathRootNodeName !== lastRealParameter) {\n        report(\n          `@${targetTagName} path declaration (\"${jsdocParameterName}\") root node name (\"${pathRootNodeName}\") ` +\n          `does not match previous real parameter name (\"${lastRealParameter}\").`,\n          null,\n          jsdoc.tags[idx],\n        );\n\n        return true;\n      }\n    } else {\n      lastRealParameter = jsdocParameterName;\n    }\n\n    return false;\n  });\n};\n\nexport default iterateJsdoc(({\n  context,\n  jsdoc,\n  jsdocNode,\n  report,\n  utils,\n}) => {\n  const {allowExtraTrailingParamDocs} = context.options[0] || {};\n\n  const jsdocParameterNamesDeep = utils.getJsdocTagsDeep('param');\n  if (!jsdocParameterNamesDeep.length) {\n    return;\n  }\n  const functionParameterNames = utils.getFunctionParameterNames();\n  const targetTagName = utils.getPreferredTagName({tagName: 'param'});\n  const isError = validateParameterNames(\n    targetTagName, allowExtraTrailingParamDocs, functionParameterNames,\n    jsdoc, jsdocNode, utils, report,\n  );\n\n  if (isError) {\n    return;\n  }\n\n  validateParameterNamesDeep(\n    targetTagName, allowExtraTrailingParamDocs, jsdocParameterNamesDeep,\n    jsdoc, report,\n  );\n}, {\n  meta: {\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          allowExtraTrailingParamDocs: {\n            type: 'boolean',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"checkParamNames.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkPropertyNames.js b/node_modules/eslint-plugin-jsdoc/dist/rules/checkPropertyNames.js
deleted file mode 100644
index 81e1a62..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkPropertyNames.js
+++ /dev/null
@@ -1,98 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const validatePropertyNames = (targetTagName, jsdoc, jsdocNode, utils) => {
-  const propertyTags = Object.entries(jsdoc.tags).filter(([, tag]) => {
-    return tag.tag === targetTagName;
-  });
-  return propertyTags.some(([, tag], index) => {
-    let tagsIndex;
-    const dupeTagInfo = propertyTags.find(([tgsIndex, tg], idx) => {
-      tagsIndex = tgsIndex;
-      return tg.name === tag.name && idx !== index;
-    });
-
-    if (dupeTagInfo) {
-      utils.reportJSDoc(`Duplicate @${targetTagName} "${tag.name}"`, dupeTagInfo[1], () => {
-        jsdoc.tags.splice(tagsIndex, 1);
-      });
-      return true;
-    }
-
-    return false;
-  });
-};
-
-const validatePropertyNamesDeep = (targetTagName, jsdocPropertyNames, jsdoc, report) => {
-  let lastRealProperty;
-  return jsdocPropertyNames.some(({
-    name: jsdocPropertyName,
-    idx
-  }) => {
-    const isPropertyPath = jsdocPropertyName.includes('.');
-
-    if (isPropertyPath) {
-      if (!lastRealProperty) {
-        report(`@${targetTagName} path declaration ("${jsdocPropertyName}") appears before any real property.`, null, jsdoc.tags[idx]);
-        return true;
-      }
-
-      let pathRootNodeName = jsdocPropertyName.slice(0, jsdocPropertyName.indexOf('.'));
-
-      if (pathRootNodeName.endsWith('[]')) {
-        pathRootNodeName = pathRootNodeName.slice(0, -2);
-      }
-
-      if (pathRootNodeName !== lastRealProperty) {
-        report(`@${targetTagName} path declaration ("${jsdocPropertyName}") root node name ("${pathRootNodeName}") ` + `does not match previous real property name ("${lastRealProperty}").`, null, jsdoc.tags[idx]);
-        return true;
-      }
-    } else {
-      lastRealProperty = jsdocPropertyName;
-    }
-
-    return false;
-  });
-};
-
-var _default = (0, _iterateJsdoc.default)(({
-  jsdoc,
-  jsdocNode,
-  report,
-  utils
-}) => {
-  const jsdocPropertyNamesDeep = utils.getJsdocTagsDeep('property');
-
-  if (!jsdocPropertyNamesDeep.length) {
-    return;
-  }
-
-  const targetTagName = utils.getPreferredTagName({
-    tagName: 'property'
-  });
-  const isError = validatePropertyNames(targetTagName, jsdoc, jsdocNode, utils);
-
-  if (isError) {
-    return;
-  }
-
-  validatePropertyNamesDeep(targetTagName, jsdocPropertyNamesDeep, jsdoc, report);
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    fixable: 'code',
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=checkPropertyNames.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkPropertyNames.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/checkPropertyNames.js.map
deleted file mode 100644
index 7a5d9ba..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkPropertyNames.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/checkPropertyNames.js"],"names":["validatePropertyNames","targetTagName","jsdoc","jsdocNode","utils","propertyTags","Object","entries","tags","filter","tag","some","index","tagsIndex","dupeTagInfo","find","tgsIndex","tg","idx","name","reportJSDoc","splice","validatePropertyNamesDeep","jsdocPropertyNames","report","lastRealProperty","jsdocPropertyName","isPropertyPath","includes","pathRootNodeName","slice","indexOf","endsWith","jsdocPropertyNamesDeep","getJsdocTagsDeep","length","getPreferredTagName","tagName","isError","iterateAllJsdocs","meta","fixable","type"],"mappings":"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","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nconst validatePropertyNames = (\n  targetTagName : string,\n  jsdoc, jsdocNode, utils,\n) => {\n  const propertyTags = Object.entries(jsdoc.tags).filter(([, tag]) => {\n    return tag.tag === targetTagName;\n  });\n\n  return propertyTags.some(([, tag], index) => {\n    let tagsIndex;\n    const dupeTagInfo = propertyTags.find(([tgsIndex, tg], idx) => {\n      tagsIndex = tgsIndex;\n\n      return tg.name === tag.name && idx !== index;\n    });\n    if (dupeTagInfo) {\n      utils.reportJSDoc(`Duplicate @${targetTagName} \"${tag.name}\"`, dupeTagInfo[1], () => {\n        jsdoc.tags.splice(tagsIndex, 1);\n      });\n\n      return true;\n    }\n\n    return false;\n  });\n};\n\nconst validatePropertyNamesDeep = (\n  targetTagName : string,\n  jsdocPropertyNames : Array<string>, jsdoc, report : Function,\n) => {\n  let lastRealProperty;\n\n  return jsdocPropertyNames.some(({name: jsdocPropertyName, idx}) => {\n    const isPropertyPath = jsdocPropertyName.includes('.');\n\n    if (isPropertyPath) {\n      if (!lastRealProperty) {\n        report(`@${targetTagName} path declaration (\"${jsdocPropertyName}\") appears before any real property.`, null, jsdoc.tags[idx]);\n\n        return true;\n      }\n\n      let pathRootNodeName = jsdocPropertyName.slice(0, jsdocPropertyName.indexOf('.'));\n\n      if (pathRootNodeName.endsWith('[]')) {\n        pathRootNodeName = pathRootNodeName.slice(0, -2);\n      }\n\n      if (pathRootNodeName !== lastRealProperty) {\n        report(\n          `@${targetTagName} path declaration (\"${jsdocPropertyName}\") root node name (\"${pathRootNodeName}\") ` +\n          `does not match previous real property name (\"${lastRealProperty}\").`,\n          null,\n          jsdoc.tags[idx],\n        );\n\n        return true;\n      }\n    } else {\n      lastRealProperty = jsdocPropertyName;\n    }\n\n    return false;\n  });\n};\n\nexport default iterateJsdoc(({\n  jsdoc,\n  jsdocNode,\n  report,\n  utils,\n}) => {\n  const jsdocPropertyNamesDeep = utils.getJsdocTagsDeep('property');\n  if (!jsdocPropertyNamesDeep.length) {\n    return;\n  }\n  const targetTagName = utils.getPreferredTagName({tagName: 'property'});\n  const isError = validatePropertyNames(\n    targetTagName,\n    jsdoc, jsdocNode, utils,\n  );\n\n  if (isError) {\n    return;\n  }\n\n  validatePropertyNamesDeep(\n    targetTagName, jsdocPropertyNamesDeep,\n    jsdoc, report,\n  );\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    fixable: 'code',\n    type: 'suggestion',\n  },\n});\n"],"file":"checkPropertyNames.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkSyntax.js b/node_modules/eslint-plugin-jsdoc/dist/rules/checkSyntax.js
deleted file mode 100644
index 9a02621..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkSyntax.js
+++ /dev/null
@@ -1,56 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  jsdoc,
-  report
-}) => {
-  if (!jsdoc.tags) {
-    return;
-  }
-
-  var _iteratorNormalCompletion = true;
-  var _didIteratorError = false;
-  var _iteratorError = undefined;
-
-  try {
-    for (var _iterator = jsdoc.tags[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-      const tag = _step.value;
-
-      if (tag.type.slice(-1) === '=') {
-        report('Syntax should not be Google Closure Compiler style.', null, tag);
-        break;
-      }
-    }
-  } catch (err) {
-    _didIteratorError = true;
-    _iteratorError = err;
-  } finally {
-    try {
-      if (!_iteratorNormalCompletion && _iterator.return != null) {
-        _iterator.return();
-      }
-    } finally {
-      if (_didIteratorError) {
-        throw _iteratorError;
-      }
-    }
-  }
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=checkSyntax.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkSyntax.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/checkSyntax.js.map
deleted file mode 100644
index 41b81e6..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkSyntax.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/checkSyntax.js"],"names":["jsdoc","report","tags","tag","type","slice","iterateAllJsdocs","meta"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,KAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJ,MAAI,CAACD,KAAK,CAACE,IAAX,EAAiB;AACf;AACD;;AAHG;AAAA;AAAA;;AAAA;AAKJ,yBAAkBF,KAAK,CAACE,IAAxB,8HAA8B;AAAA,YAAnBC,GAAmB;;AAC5B,UAAIA,GAAG,CAACC,IAAJ,CAASC,KAAT,CAAe,CAAC,CAAhB,MAAuB,GAA3B,EAAgC;AAC9BJ,QAAAA,MAAM,CAAC,qDAAD,EAAwD,IAAxD,EAA8DE,GAA9D,CAAN;AACA;AACD;AACF;AAVG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWL,CAdc,EAcZ;AACDG,EAAAA,gBAAgB,EAAE,IADjB;AAEDC,EAAAA,IAAI,EAAE;AACJH,IAAAA,IAAI,EAAE;AADF;AAFL,CAdY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  jsdoc,\n  report,\n}) => {\n  if (!jsdoc.tags) {\n    return;\n  }\n\n  for (const tag of jsdoc.tags) {\n    if (tag.type.slice(-1) === '=') {\n      report('Syntax should not be Google Closure Compiler style.', null, tag);\n      break;\n    }\n  }\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    type: 'suggestion',\n  },\n});\n"],"file":"checkSyntax.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkTagNames.js b/node_modules/eslint-plugin-jsdoc/dist/rules/checkTagNames.js
deleted file mode 100644
index 903b2b3..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkTagNames.js
+++ /dev/null
@@ -1,111 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _lodash = _interopRequireDefault(require("lodash"));
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  sourceCode,
-  jsdoc,
-  report,
-  utils,
-  context,
-  settings,
-  jsdocNode
-}) => {
-  if (!jsdoc.tags) {
-    return;
-  }
-
-  const _ref = context.options[0] || {},
-        _ref$definedTags = _ref.definedTags,
-        definedTags = _ref$definedTags === void 0 ? [] : _ref$definedTags;
-
-  let definedPreferredTags = [];
-  let definedNonPreferredTags = [];
-  const tagNamePreference = settings.tagNamePreference;
-
-  if (Object.keys(tagNamePreference).length) {
-    definedNonPreferredTags = _lodash.default.keys(tagNamePreference); // Replace `_.values` with `Object.values` when we may start requiring Node 7+
-
-    definedPreferredTags = _lodash.default.values(tagNamePreference).map(preferredTag => {
-      if (typeof preferredTag === 'string') {
-        // May become an empty string but will be filtered out below
-        return preferredTag;
-      }
-
-      if (!preferredTag) {
-        return undefined;
-      }
-
-      if (typeof preferredTag !== 'object') {
-        utils.reportSettings('Invalid `settings.jsdoc.tagNamePreference`. Values must be falsy, a string, or an object.');
-      }
-
-      return preferredTag.replacement;
-    }).filter(preferredType => {
-      return preferredType;
-    });
-  }
-
-  jsdoc.tags.forEach(jsdocTag => {
-    const tagName = jsdocTag.tag;
-
-    if (utils.isValidTag(tagName, [...definedTags, ...definedPreferredTags, ...definedNonPreferredTags])) {
-      let preferredTagName = utils.getPreferredTagName({
-        allowObjectReturn: true,
-        defaultMessage: `Blacklisted tag found (\`@${tagName}\`)`,
-        tagName
-      });
-      let message = `Invalid JSDoc tag (preference). Replace "${tagName}" JSDoc tag with "${preferredTagName}".`;
-
-      if (!preferredTagName) {
-        return;
-      }
-
-      if (typeof preferredTagName === 'object') {
-        var _preferredTagName = preferredTagName;
-        message = _preferredTagName.message;
-        preferredTagName = _preferredTagName.replacement;
-      }
-
-      if (preferredTagName !== tagName) {
-        report(message, fixer => {
-          const replacement = sourceCode.getText(jsdocNode).replace(new RegExp(`@${_lodash.default.escapeRegExp(tagName)}\\b`, 'u'), `@${preferredTagName}`);
-          return fixer.replaceText(jsdocNode, replacement);
-        }, jsdocTag);
-      }
-    } else {
-      report(`Invalid JSDoc tag name "${tagName}".`, null, jsdocTag);
-    }
-  });
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    fixable: 'code',
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        definedTags: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=checkTagNames.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkTagNames.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/checkTagNames.js.map
deleted file mode 100644
index 3f53172..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkTagNames.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/checkTagNames.js"],"names":["sourceCode","jsdoc","report","utils","context","settings","jsdocNode","tags","options","definedTags","definedPreferredTags","definedNonPreferredTags","tagNamePreference","Object","keys","length","_","values","map","preferredTag","undefined","reportSettings","replacement","filter","preferredType","forEach","jsdocTag","tagName","tag","isValidTag","preferredTagName","getPreferredTagName","allowObjectReturn","defaultMessage","message","fixer","getText","replace","RegExp","escapeRegExp","replaceText","iterateAllJsdocs","meta","fixable","schema","additionalProperties","properties","items","type"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  sourceCode,\n  jsdoc,\n  report,\n  utils,\n  context,\n  settings,\n  jsdocNode,\n}) => {\n  if (!jsdoc.tags) {\n    return;\n  }\n  const {definedTags = []} = context.options[0] || {};\n\n  let definedPreferredTags = [];\n  let definedNonPreferredTags = [];\n  const {tagNamePreference} = settings;\n  if (Object.keys(tagNamePreference).length) {\n    definedNonPreferredTags = _.keys(tagNamePreference);\n\n    // Replace `_.values` with `Object.values` when we may start requiring Node 7+\n    definedPreferredTags = _.values(tagNamePreference).map((preferredTag) => {\n      if (typeof preferredTag === 'string') {\n        // May become an empty string but will be filtered out below\n        return preferredTag;\n      }\n      if (!preferredTag) {\n        return undefined;\n      }\n      if (typeof preferredTag !== 'object') {\n        utils.reportSettings(\n          'Invalid `settings.jsdoc.tagNamePreference`. Values must be falsy, a string, or an object.',\n        );\n      }\n\n      return preferredTag.replacement;\n    }).filter((preferredType) => {\n      return preferredType;\n    });\n  }\n\n  jsdoc.tags.forEach((jsdocTag) => {\n    const tagName = jsdocTag.tag;\n    if (utils.isValidTag(tagName, [...definedTags, ...definedPreferredTags, ...definedNonPreferredTags])) {\n      let preferredTagName = utils.getPreferredTagName({\n        allowObjectReturn: true,\n        defaultMessage: `Blacklisted tag found (\\`@${tagName}\\`)`,\n        tagName,\n      });\n      let message = `Invalid JSDoc tag (preference). Replace \"${tagName}\" JSDoc tag with \"${preferredTagName}\".`;\n      if (!preferredTagName) {\n        return;\n      }\n      if (typeof preferredTagName === 'object') {\n        ({message, replacement: preferredTagName} = preferredTagName);\n      }\n\n      if (preferredTagName !== tagName) {\n        report(message, (fixer) => {\n          const replacement = sourceCode.getText(jsdocNode).replace(\n            new RegExp(`@${_.escapeRegExp(tagName)}\\\\b`, 'u'),\n            `@${preferredTagName}`,\n          );\n\n          return fixer.replaceText(jsdocNode, replacement);\n        }, jsdocTag);\n      }\n    } else {\n      report(`Invalid JSDoc tag name \"${tagName}\".`, null, jsdocTag);\n    }\n  });\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          definedTags: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"checkTagNames.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkTypes.js b/node_modules/eslint-plugin-jsdoc/dist/rules/checkTypes.js
deleted file mode 100644
index 0f026fc..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkTypes.js
+++ /dev/null
@@ -1,273 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _lodash = _interopRequireDefault(require("lodash"));
-
-var _jsdoctypeparser = require("jsdoctypeparser");
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
-
-function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-const strictNativeTypes = ['undefined', 'null', 'boolean', 'number', 'bigint', 'string', 'symbol', 'object', 'Array', 'Function', 'Date', 'RegExp'];
-
-const adjustNames = (type, preferred, isGenericMatch, nodeName, node, parentNode) => {
-  let ret = preferred;
-
-  if (isGenericMatch) {
-    if (preferred === '[]') {
-      parentNode.meta.syntax = 'SQUARE_BRACKET';
-      ret = 'Array';
-    } else {
-      const dotBracketEnd = preferred.match(/\.(?:<>)?$/u);
-
-      if (dotBracketEnd) {
-        parentNode.meta.syntax = 'ANGLE_BRACKET_WITH_DOT';
-        ret = preferred.slice(0, -dotBracketEnd[0].length);
-      } else {
-        const bracketEnd = preferred.endsWith('<>');
-
-        if (bracketEnd) {
-          parentNode.meta.syntax = 'ANGLE_BRACKET';
-          ret = preferred.slice(0, -2);
-        }
-      }
-    }
-  } else if (type === 'ANY') {
-    node.type = 'NAME';
-  }
-
-  node.name = ret.replace(/(?:\.|<>|\.<>|\[\])$/u, ''); // For bare pseudo-types like `<>`
-
-  if (!ret) {
-    node.name = nodeName;
-  }
-};
-
-var _default = (0, _iterateJsdoc.default)(({
-  jsdocNode,
-  sourceCode,
-  report,
-  utils,
-  settings,
-  context
-}) => {
-  const jsdocTagsWithPossibleType = utils.filterTags(tag => {
-    return utils.tagMightHaveTypePosition(tag.tag);
-  });
-  const preferredTypes = settings.preferredTypes;
-
-  const _ref = context.options[0] || {},
-        noDefaults = _ref.noDefaults,
-        unifyParentAndChildTypeChecks = _ref.unifyParentAndChildTypeChecks,
-        _ref$exemptTagContext = _ref.exemptTagContexts,
-        exemptTagContexts = _ref$exemptTagContext === void 0 ? [] : _ref$exemptTagContext;
-
-  const getPreferredTypeInfo = (type, nodeName, parentName, parentNode) => {
-    let hasMatchingPreferredType;
-    let isGenericMatch;
-    let typeName = nodeName;
-
-    if (Object.keys(preferredTypes).length) {
-      const parentType = parentName === 'subject';
-
-      if (unifyParentAndChildTypeChecks || parentType) {
-        const syntax = _lodash.default.get(parentNode, 'meta.syntax');
-
-        [['.', 'ANGLE_BRACKET_WITH_DOT'], ['.<>', 'ANGLE_BRACKET_WITH_DOT'], ['<>', 'ANGLE_BRACKET']].some(([checkPostFix, syn]) => {
-          isGenericMatch = _lodash.default.get(preferredTypes, nodeName + checkPostFix) !== undefined && syntax === syn;
-
-          if (isGenericMatch) {
-            typeName += checkPostFix;
-          }
-
-          return isGenericMatch;
-        });
-
-        if (!isGenericMatch && parentType) {
-          [['[]', 'SQUARE_BRACKET'], ['.', 'ANGLE_BRACKET_WITH_DOT'], ['.<>', 'ANGLE_BRACKET_WITH_DOT'], ['<>', 'ANGLE_BRACKET']].some(([checkPostFix, syn]) => {
-            isGenericMatch = _lodash.default.get(preferredTypes, checkPostFix) !== undefined && syntax === syn;
-
-            if (isGenericMatch) {
-              typeName = checkPostFix;
-            }
-
-            return isGenericMatch;
-          });
-        }
-      }
-
-      const directNameMatch = _lodash.default.get(preferredTypes, nodeName) !== undefined;
-      const unifiedSyntaxParentMatch = parentType && directNameMatch && unifyParentAndChildTypeChecks;
-      isGenericMatch = isGenericMatch || unifiedSyntaxParentMatch;
-      hasMatchingPreferredType = isGenericMatch || directNameMatch && !parentType;
-    }
-
-    return [hasMatchingPreferredType, typeName, isGenericMatch];
-  };
-
-  jsdocTagsWithPossibleType.forEach(jsdocTag => {
-    const invalidTypes = [];
-    let typeAst;
-
-    try {
-      typeAst = (0, _jsdoctypeparser.parse)(jsdocTag.type);
-    } catch (error) {
-      return;
-    }
-
-    (0, _jsdoctypeparser.traverse)(typeAst, (node, parentName, parentNode) => {
-      const type = node.type,
-            name = node.name;
-
-      if (!['NAME', 'ANY'].includes(type)) {
-        return;
-      }
-
-      let nodeName = type === 'ANY' ? '*' : name;
-
-      const _getPreferredTypeInfo = getPreferredTypeInfo(type, nodeName, parentName, parentNode),
-            _getPreferredTypeInfo2 = _slicedToArray(_getPreferredTypeInfo, 3),
-            hasMatchingPreferredType = _getPreferredTypeInfo2[0],
-            typeName = _getPreferredTypeInfo2[1],
-            isGenericMatch = _getPreferredTypeInfo2[2];
-
-      let preferred;
-
-      if (hasMatchingPreferredType) {
-        const preferredSetting = preferredTypes[typeName];
-        nodeName = typeName === '[]' ? typeName : nodeName;
-
-        if (!preferredSetting) {
-          invalidTypes.push([nodeName]);
-        } else if (typeof preferredSetting === 'string') {
-          preferred = preferredSetting;
-          invalidTypes.push([nodeName, preferred]);
-        } else if (typeof preferredSetting === 'object') {
-          preferred = _lodash.default.get(preferredSetting, 'replacement');
-          invalidTypes.push([nodeName, preferred, _lodash.default.get(preferredSetting, 'message')]);
-        } else {
-          utils.reportSettings('Invalid `settings.jsdoc.preferredTypes`. Values must be falsy, a string, or an object.');
-          return;
-        }
-      } else if (!noDefaults && type === 'NAME') {
-        var _iteratorNormalCompletion = true;
-        var _didIteratorError = false;
-        var _iteratorError = undefined;
-
-        try {
-          for (var _iterator = strictNativeTypes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-            const strictNativeType = _step.value;
-
-            if (strictNativeType.toLowerCase() === nodeName.toLowerCase() && strictNativeType !== nodeName && ( // Don't report if user has own map for a strict native type
-            !preferredTypes || _lodash.default.get(preferredTypes, strictNativeType) === undefined)) {
-              preferred = strictNativeType;
-              invalidTypes.push([nodeName, preferred]);
-              break;
-            }
-          }
-        } catch (err) {
-          _didIteratorError = true;
-          _iteratorError = err;
-        } finally {
-          try {
-            if (!_iteratorNormalCompletion && _iterator.return != null) {
-              _iterator.return();
-            }
-          } finally {
-            if (_didIteratorError) {
-              throw _iteratorError;
-            }
-          }
-        }
-      } // For fixer
-
-
-      if (preferred) {
-        adjustNames(type, preferred, isGenericMatch, nodeName, node, parentNode);
-      }
-    });
-
-    if (invalidTypes.length) {
-      const fixedType = (0, _jsdoctypeparser.publish)(typeAst);
-      const tagName = jsdocTag.tag;
-      invalidTypes.forEach(([badType, preferredType = '', message]) => {
-        const fix = fixer => {
-          return fixer.replaceText(jsdocNode, sourceCode.getText(jsdocNode).replace(`{${jsdocTag.type}}`, `{${fixedType}}`));
-        };
-
-        const tagValue = jsdocTag.name ? ` "${jsdocTag.name}"` : '';
-
-        if (exemptTagContexts.some(({
-          tag,
-          types
-        }) => {
-          return tag === tagName && (types === true || types.includes(jsdocTag.type));
-        })) {
-          return;
-        }
-
-        report(message || `Invalid JSDoc @${tagName}${tagValue} type "${badType}"` + (preferredType ? '; ' : '.') + (preferredType ? `prefer: "${preferredType}".` : ''), preferredType ? fix : null, jsdocTag, message ? {
-          tagName,
-          tagValue
-        } : null);
-      });
-    }
-  });
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    fixable: 'code',
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        exemptTagContexts: {
-          items: {
-            additionalProperties: false,
-            properties: {
-              tag: {
-                type: 'string'
-              },
-              types: {
-                oneOf: [{
-                  type: 'boolean'
-                }, {
-                  items: {
-                    type: 'string'
-                  },
-                  type: 'array'
-                }]
-              }
-            },
-            type: 'object'
-          },
-          type: 'array'
-        },
-        noDefaults: {
-          type: 'boolean'
-        },
-        unifyParentAndChildTypeChecks: {
-          type: 'boolean'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=checkTypes.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkTypes.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/checkTypes.js.map
deleted file mode 100644
index bf4c8ee..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkTypes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/checkTypes.js"],"names":["strictNativeTypes","adjustNames","type","preferred","isGenericMatch","nodeName","node","parentNode","ret","meta","syntax","dotBracketEnd","match","slice","length","bracketEnd","endsWith","name","replace","jsdocNode","sourceCode","report","utils","settings","context","jsdocTagsWithPossibleType","filterTags","tag","tagMightHaveTypePosition","preferredTypes","options","noDefaults","unifyParentAndChildTypeChecks","exemptTagContexts","getPreferredTypeInfo","parentName","hasMatchingPreferredType","typeName","Object","keys","parentType","_","get","some","checkPostFix","syn","undefined","directNameMatch","unifiedSyntaxParentMatch","forEach","jsdocTag","invalidTypes","typeAst","error","includes","preferredSetting","push","reportSettings","strictNativeType","toLowerCase","fixedType","tagName","badType","preferredType","message","fix","fixer","replaceText","getText","tagValue","types","iterateAllJsdocs","fixable","schema","additionalProperties","properties","items","oneOf"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport {parse, traverse, publish} from 'jsdoctypeparser';\nimport iterateJsdoc from '../iterateJsdoc';\n\nconst strictNativeTypes = [\n  'undefined',\n  'null',\n  'boolean',\n  'number',\n  'bigint',\n  'string',\n  'symbol',\n  'object',\n  'Array',\n  'Function',\n  'Date',\n  'RegExp',\n];\n\nconst adjustNames = (type, preferred, isGenericMatch, nodeName, node, parentNode) => {\n  let ret = preferred;\n  if (isGenericMatch) {\n    if (preferred === '[]') {\n      parentNode.meta.syntax = 'SQUARE_BRACKET';\n      ret = 'Array';\n    } else {\n      const dotBracketEnd = preferred.match(/\\.(?:<>)?$/u);\n      if (dotBracketEnd) {\n        parentNode.meta.syntax = 'ANGLE_BRACKET_WITH_DOT';\n        ret = preferred.slice(0, -dotBracketEnd[0].length);\n      } else {\n        const bracketEnd = preferred.endsWith('<>');\n        if (bracketEnd) {\n          parentNode.meta.syntax = 'ANGLE_BRACKET';\n          ret = preferred.slice(0, -2);\n        }\n      }\n    }\n  } else if (type === 'ANY') {\n    node.type = 'NAME';\n  }\n  node.name = ret.replace(/(?:\\.|<>|\\.<>|\\[\\])$/u, '');\n\n  // For bare pseudo-types like `<>`\n  if (!ret) {\n    node.name = nodeName;\n  }\n};\n\nexport default iterateJsdoc(({\n  jsdocNode,\n  sourceCode,\n  report,\n  utils,\n  settings,\n  context,\n}) => {\n  const jsdocTagsWithPossibleType = utils.filterTags((tag) => {\n    return utils.tagMightHaveTypePosition(tag.tag);\n  });\n\n  const {preferredTypes} = settings;\n  const {\n    noDefaults,\n    unifyParentAndChildTypeChecks,\n    exemptTagContexts = [],\n  } = context.options[0] || {};\n\n  const getPreferredTypeInfo = (type, nodeName, parentName, parentNode) => {\n    let hasMatchingPreferredType;\n    let isGenericMatch;\n    let typeName = nodeName;\n    if (Object.keys(preferredTypes).length) {\n      const parentType = parentName === 'subject';\n      if (unifyParentAndChildTypeChecks || parentType) {\n        const syntax = _.get(parentNode, 'meta.syntax');\n\n        [\n          ['.', 'ANGLE_BRACKET_WITH_DOT'],\n          ['.<>', 'ANGLE_BRACKET_WITH_DOT'],\n          ['<>', 'ANGLE_BRACKET'],\n        ].some(([checkPostFix, syn]) => {\n          isGenericMatch = _.get(\n            preferredTypes,\n            nodeName + checkPostFix,\n          ) !== undefined &&\n            syntax === syn;\n          if (isGenericMatch) {\n            typeName += checkPostFix;\n          }\n\n          return isGenericMatch;\n        });\n        if (!isGenericMatch && parentType) {\n          [\n            ['[]', 'SQUARE_BRACKET'],\n            ['.', 'ANGLE_BRACKET_WITH_DOT'],\n            ['.<>', 'ANGLE_BRACKET_WITH_DOT'],\n            ['<>', 'ANGLE_BRACKET'],\n          ].some(([checkPostFix, syn]) => {\n            isGenericMatch = _.get(preferredTypes, checkPostFix) !== undefined &&\n              syntax === syn;\n            if (isGenericMatch) {\n              typeName = checkPostFix;\n            }\n\n            return isGenericMatch;\n          });\n        }\n      }\n      const directNameMatch = _.get(preferredTypes, nodeName) !== undefined;\n      const unifiedSyntaxParentMatch = parentType && directNameMatch && unifyParentAndChildTypeChecks;\n      isGenericMatch = isGenericMatch || unifiedSyntaxParentMatch;\n\n      hasMatchingPreferredType = isGenericMatch ||\n        directNameMatch && !parentType;\n    }\n\n    return [hasMatchingPreferredType, typeName, isGenericMatch];\n  };\n\n  jsdocTagsWithPossibleType.forEach((jsdocTag) => {\n    const invalidTypes = [];\n    let typeAst;\n\n    try {\n      typeAst = parse(jsdocTag.type);\n    } catch (error) {\n      return;\n    }\n\n    traverse(typeAst, (node, parentName, parentNode) => {\n      const {type, name} = node;\n      if (!['NAME', 'ANY'].includes(type)) {\n        return;\n      }\n      let nodeName = type === 'ANY' ? '*' : name;\n\n      const [hasMatchingPreferredType, typeName, isGenericMatch] = getPreferredTypeInfo(type, nodeName, parentName, parentNode);\n\n      let preferred;\n      if (hasMatchingPreferredType) {\n        const preferredSetting = preferredTypes[typeName];\n        nodeName = typeName === '[]' ? typeName : nodeName;\n\n        if (!preferredSetting) {\n          invalidTypes.push([nodeName]);\n        } else if (typeof preferredSetting === 'string') {\n          preferred = preferredSetting;\n          invalidTypes.push([nodeName, preferred]);\n        } else if (typeof preferredSetting === 'object') {\n          preferred = _.get(preferredSetting, 'replacement');\n          invalidTypes.push([\n            nodeName,\n            preferred,\n            _.get(preferredSetting, 'message'),\n          ]);\n        } else {\n          utils.reportSettings(\n            'Invalid `settings.jsdoc.preferredTypes`. Values must be falsy, a string, or an object.',\n          );\n\n          return;\n        }\n      } else if (!noDefaults && type === 'NAME') {\n        for (const strictNativeType of strictNativeTypes) {\n          if (strictNativeType.toLowerCase() === nodeName.toLowerCase() &&\n            strictNativeType !== nodeName &&\n\n            // Don't report if user has own map for a strict native type\n            (!preferredTypes || _.get(preferredTypes, strictNativeType) === undefined)\n          ) {\n            preferred = strictNativeType;\n            invalidTypes.push([nodeName, preferred]);\n            break;\n          }\n        }\n      }\n\n      // For fixer\n      if (preferred) {\n        adjustNames(type, preferred, isGenericMatch, nodeName, node, parentNode);\n      }\n    });\n\n    if (invalidTypes.length) {\n      const fixedType = publish(typeAst);\n\n      const tagName = jsdocTag.tag;\n      invalidTypes.forEach(([badType, preferredType = '', message]) => {\n        const fix = (fixer) => {\n          return fixer.replaceText(\n            jsdocNode,\n            sourceCode.getText(jsdocNode).replace(\n              `{${jsdocTag.type}}`,\n              `{${fixedType}}`,\n            ),\n          );\n        };\n\n        const tagValue = jsdocTag.name ? ` \"${jsdocTag.name}\"` : '';\n        if (exemptTagContexts.some(({tag, types}) => {\n          return tag === tagName &&\n            (types === true || types.includes(jsdocTag.type));\n        })) {\n          return;\n        }\n\n        report(\n          message ||\n            `Invalid JSDoc @${tagName}${tagValue} type \"${badType}\"` +\n            (preferredType ? '; ' : '.') +\n            (preferredType ? `prefer: \"${preferredType}\".` : ''),\n          preferredType ? fix : null,\n          jsdocTag,\n          message ? {\n            tagName,\n            tagValue,\n          } : null,\n        );\n      });\n    }\n  });\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          exemptTagContexts: {\n            items: {\n              additionalProperties: false,\n              properties: {\n                tag: {\n                  type: 'string',\n                },\n                types: {\n                  oneOf: [\n                    {\n                      type: 'boolean',\n                    },\n                    {\n                      items: {\n                        type: 'string',\n                      },\n                      type: 'array',\n                    },\n                  ],\n                },\n              },\n              type: 'object',\n            },\n            type: 'array',\n          },\n          noDefaults: {\n            type: 'boolean',\n          },\n          unifyParentAndChildTypeChecks: {\n            type: 'boolean',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"checkTypes.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkValues.js b/node_modules/eslint-plugin-jsdoc/dist/rules/checkValues.js
deleted file mode 100644
index f615d61..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkValues.js
+++ /dev/null
@@ -1,110 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _semver = _interopRequireDefault(require("semver"));
-
-var _spdxExpressionParse = _interopRequireDefault(require("spdx-expression-parse"));
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  utils,
-  report,
-  context
-}) => {
-  const options = context.options[0] || {};
-  const _options$allowedLicen = options.allowedLicenses,
-        allowedLicenses = _options$allowedLicen === void 0 ? null : _options$allowedLicen,
-        _options$allowedAutho = options.allowedAuthors,
-        allowedAuthors = _options$allowedAutho === void 0 ? null : _options$allowedAutho,
-        _options$licensePatte = options.licensePattern,
-        licensePattern = _options$licensePatte === void 0 ? '([^\n]*)' : _options$licensePatte;
-  utils.forEachPreferredTag('version', (jsdocParameter, targetTagName) => {
-    const version = jsdocParameter.description.trim();
-
-    if (!version) {
-      report(`Missing JSDoc @${targetTagName}.`, null, jsdocParameter);
-    } else if (!_semver.default.valid(version)) {
-      report(`Invalid JSDoc @${targetTagName}: "${jsdocParameter.description}".`, null, jsdocParameter);
-    }
-  });
-  utils.forEachPreferredTag('since', (jsdocParameter, targetTagName) => {
-    const version = jsdocParameter.description.trim();
-
-    if (!version) {
-      report(`Missing JSDoc @${targetTagName}.`, null, jsdocParameter);
-    } else if (!_semver.default.valid(version)) {
-      report(`Invalid JSDoc @${targetTagName}: "${jsdocParameter.description}".`, null, jsdocParameter);
-    }
-  });
-  utils.forEachPreferredTag('license', (jsdocParameter, targetTagName) => {
-    const licenseRegex = new RegExp(licensePattern, 'g');
-    const match = jsdocParameter.description.match(licenseRegex);
-    const license = match && match[1] || match[0];
-
-    if (!license.trim()) {
-      report(`Missing JSDoc @${targetTagName}.`, null, jsdocParameter);
-    } else if (allowedLicenses) {
-      if (allowedLicenses !== true && !allowedLicenses.includes(license)) {
-        report(`Invalid JSDoc @${targetTagName}: "${license}"; expected one of ${allowedLicenses.join(', ')}.`, null, jsdocParameter);
-      }
-    } else {
-      try {
-        (0, _spdxExpressionParse.default)(license);
-      } catch (error) {
-        report(`Invalid JSDoc @${targetTagName}: "${license}"; expected SPDX expression: https://spdx.org/licenses/.`, null, jsdocParameter);
-      }
-    }
-  });
-  utils.forEachPreferredTag('author', (jsdocParameter, targetTagName) => {
-    const author = jsdocParameter.description;
-
-    if (!author.trim()) {
-      report(`Missing JSDoc @${targetTagName}.`, null, jsdocParameter);
-    } else if (allowedAuthors) {
-      if (!allowedAuthors.includes(author)) {
-        report(`Invalid JSDoc @${targetTagName}: "${jsdocParameter.description}"; expected one of ${allowedAuthors.join(', ')}.`, null, jsdocParameter);
-      }
-    }
-  });
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        allowedAuthors: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        },
-        allowedLicenses: {
-          anyOf: [{
-            items: {
-              type: 'string'
-            },
-            type: 'array'
-          }, {
-            type: 'boolean'
-          }]
-        },
-        licensePattern: {
-          type: 'string'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=checkValues.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/checkValues.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/checkValues.js.map
deleted file mode 100644
index 97ae60c..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/checkValues.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/checkValues.js"],"names":["utils","report","context","options","allowedLicenses","allowedAuthors","licensePattern","forEachPreferredTag","jsdocParameter","targetTagName","version","description","trim","semver","valid","licenseRegex","RegExp","match","license","includes","join","error","author","iterateAllJsdocs","meta","schema","additionalProperties","properties","items","type","anyOf"],"mappings":"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","sourcesContent":["import semver from 'semver';\nimport spdxExpressionParse from 'spdx-expression-parse';\nimport iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  utils,\n  report,\n  context,\n}) => {\n  const options = context.options[0] || {};\n  const {\n    allowedLicenses = null,\n    allowedAuthors = null,\n    licensePattern = '([^\\n]*)',\n  } = options;\n\n  utils.forEachPreferredTag('version', (jsdocParameter, targetTagName) => {\n    const version = jsdocParameter.description.trim();\n    if (!version) {\n      report(\n        `Missing JSDoc @${targetTagName}.`,\n        null,\n        jsdocParameter,\n      );\n    } else if (!semver.valid(version)) {\n      report(\n        `Invalid JSDoc @${targetTagName}: \"${jsdocParameter.description}\".`,\n        null,\n        jsdocParameter,\n      );\n    }\n  });\n  utils.forEachPreferredTag('since', (jsdocParameter, targetTagName) => {\n    const version = jsdocParameter.description.trim();\n    if (!version) {\n      report(\n        `Missing JSDoc @${targetTagName}.`,\n        null,\n        jsdocParameter,\n      );\n    } else if (!semver.valid(version)) {\n      report(\n        `Invalid JSDoc @${targetTagName}: \"${jsdocParameter.description}\".`,\n        null,\n        jsdocParameter,\n      );\n    }\n  });\n  utils.forEachPreferredTag('license', (jsdocParameter, targetTagName) => {\n    const licenseRegex = new RegExp(licensePattern, 'g');\n    const match = jsdocParameter.description.match(licenseRegex);\n    const license = match && match[1] || match[0];\n    if (!license.trim()) {\n      report(\n        `Missing JSDoc @${targetTagName}.`,\n        null,\n        jsdocParameter,\n      );\n    } else if (allowedLicenses) {\n      if (allowedLicenses !== true && !allowedLicenses.includes(license)) {\n        report(\n          `Invalid JSDoc @${targetTagName}: \"${license}\"; expected one of ${allowedLicenses.join(', ')}.`,\n          null,\n          jsdocParameter,\n        );\n      }\n    } else {\n      try {\n        spdxExpressionParse(license);\n      } catch (error) {\n        report(\n          `Invalid JSDoc @${targetTagName}: \"${license}\"; expected SPDX expression: https://spdx.org/licenses/.`,\n          null,\n          jsdocParameter,\n        );\n      }\n    }\n  });\n\n  utils.forEachPreferredTag('author', (jsdocParameter, targetTagName) => {\n    const author = jsdocParameter.description;\n    if (!author.trim()) {\n      report(\n        `Missing JSDoc @${targetTagName}.`,\n        null,\n        jsdocParameter,\n      );\n    } else if (allowedAuthors) {\n      if (!allowedAuthors.includes(author)) {\n        report(\n          `Invalid JSDoc @${targetTagName}: \"${jsdocParameter.description}\"; expected one of ${allowedAuthors.join(', ')}.`,\n          null,\n          jsdocParameter,\n        );\n      }\n    }\n  });\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          allowedAuthors: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n          allowedLicenses: {\n            anyOf: [\n              {\n                items: {\n                  type: 'string',\n                },\n                type: 'array',\n              },\n              {\n                type: 'boolean',\n              },\n            ],\n          },\n          licensePattern: {\n            type: 'string',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"checkValues.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/emptyTags.js b/node_modules/eslint-plugin-jsdoc/dist/rules/emptyTags.js
deleted file mode 100644
index ba5672b..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/emptyTags.js
+++ /dev/null
@@ -1,71 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const defaultEmptyTags = ['abstract', 'async', 'generator', 'global', 'hideconstructor', 'ignore', 'inheritdoc', 'inner', 'instance', 'override', 'readonly'];
-const emptyIfNotClosure = ['package', 'private', 'protected', 'public', 'static'];
-
-var _default = (0, _iterateJsdoc.default)(({
-  settings,
-  jsdoc,
-  utils
-}) => {
-  if (!jsdoc.tags) {
-    return;
-  }
-
-  const emptyTags = utils.filterTags(({
-    tag: tagName
-  }) => {
-    return defaultEmptyTags.includes(tagName) || utils.hasOptionTag(tagName) && jsdoc.tags.some(({
-      tag
-    }) => {
-      return tag === tagName;
-    }) || settings.mode !== 'closure' && emptyIfNotClosure.includes(tagName);
-  });
-  emptyTags.forEach(tag => {
-    const fix = () => {
-      tag.name = '';
-      tag.description = '';
-      tag.type = '';
-      tag.optional = false;
-      tag.default = undefined;
-    };
-
-    const content = tag.name || tag.description || tag.type;
-
-    if (content) {
-      utils.reportJSDoc(`@${tag.tag} should be empty.`, tag, fix);
-    }
-  });
-}, {
-  checkPrivate: true,
-  iterateAllJsdocs: true,
-  meta: {
-    fixable: 'code',
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        tags: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=emptyTags.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/emptyTags.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/emptyTags.js.map
deleted file mode 100644
index 829b569..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/emptyTags.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/emptyTags.js"],"names":["defaultEmptyTags","emptyIfNotClosure","settings","jsdoc","utils","tags","emptyTags","filterTags","tag","tagName","includes","hasOptionTag","some","mode","forEach","fix","name","description","type","optional","default","undefined","content","reportJSDoc","checkPrivate","iterateAllJsdocs","meta","fixable","schema","additionalProperties","properties","items"],"mappings":";;;;;;;AAAA;;;;AAEA,MAAMA,gBAAgB,GAAG,CACvB,UADuB,EACX,OADW,EACF,WADE,EACW,QADX,EACqB,iBADrB,EAEvB,QAFuB,EAEb,YAFa,EAEC,OAFD,EAEU,UAFV,EAEsB,UAFtB,EAEkC,UAFlC,CAAzB;AAKA,MAAMC,iBAAiB,GAAG,CACxB,SADwB,EACb,SADa,EACF,WADE,EACW,QADX,EACqB,QADrB,CAA1B;;eAIe,2BAAa,CAAC;AAC3BC,EAAAA,QAD2B;AAE3BC,EAAAA,KAF2B;AAG3BC,EAAAA;AAH2B,CAAD,KAItB;AACJ,MAAI,CAACD,KAAK,CAACE,IAAX,EAAiB;AACf;AACD;;AACD,QAAMC,SAAS,GAAGF,KAAK,CAACG,UAAN,CAAiB,CAAC;AAACC,IAAAA,GAAG,EAAEC;AAAN,GAAD,KAAoB;AACrD,WAAOT,gBAAgB,CAACU,QAAjB,CAA0BD,OAA1B,KACLL,KAAK,CAACO,YAAN,CAAmBF,OAAnB,KAA+BN,KAAK,CAACE,IAAN,CAAWO,IAAX,CAAgB,CAAC;AAACJ,MAAAA;AAAD,KAAD,KAAW;AACxD,aAAOA,GAAG,KAAKC,OAAf;AACD,KAF8B,CAD1B,IAILP,QAAQ,CAACW,IAAT,KAAkB,SAAlB,IAA+BZ,iBAAiB,CAACS,QAAlB,CAA2BD,OAA3B,CAJjC;AAKD,GANiB,CAAlB;AAOAH,EAAAA,SAAS,CAACQ,OAAV,CAAmBN,GAAD,IAAS;AACzB,UAAMO,GAAG,GAAG,MAAM;AAChBP,MAAAA,GAAG,CAACQ,IAAJ,GAAW,EAAX;AACAR,MAAAA,GAAG,CAACS,WAAJ,GAAkB,EAAlB;AACAT,MAAAA,GAAG,CAACU,IAAJ,GAAW,EAAX;AACAV,MAAAA,GAAG,CAACW,QAAJ,GAAe,KAAf;AACAX,MAAAA,GAAG,CAACY,OAAJ,GAAcC,SAAd;AACD,KAND;;AAOA,UAAMC,OAAO,GAAGd,GAAG,CAACQ,IAAJ,IAAYR,GAAG,CAACS,WAAhB,IAA+BT,GAAG,CAACU,IAAnD;;AACA,QAAII,OAAJ,EAAa;AACXlB,MAAAA,KAAK,CAACmB,WAAN,CAAmB,IAAGf,GAAG,CAACA,GAAI,mBAA9B,EAAkDA,GAAlD,EAAuDO,GAAvD;AACD;AACF,GAZD;AAaD,CA5Bc,EA4BZ;AACDS,EAAAA,YAAY,EAAE,IADb;AAEDC,EAAAA,gBAAgB,EAAE,IAFjB;AAGDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,OAAO,EAAE,MADL;AAEJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,oBAAoB,EAAE,KADxB;AAEEC,MAAAA,UAAU,EAAE;AACVzB,QAAAA,IAAI,EAAE;AACJ0B,UAAAA,KAAK,EAAE;AACLb,YAAAA,IAAI,EAAE;AADD,WADH;AAIJA,UAAAA,IAAI,EAAE;AAJF;AADI,OAFd;AAUEA,MAAAA,IAAI,EAAE;AAVR,KADM,CAFJ;AAgBJA,IAAAA,IAAI,EAAE;AAhBF;AAHL,CA5BY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nconst defaultEmptyTags = [\n  'abstract', 'async', 'generator', 'global', 'hideconstructor',\n  'ignore', 'inheritdoc', 'inner', 'instance', 'override', 'readonly',\n];\n\nconst emptyIfNotClosure = [\n  'package', 'private', 'protected', 'public', 'static',\n];\n\nexport default iterateJsdoc(({\n  settings,\n  jsdoc,\n  utils,\n}) => {\n  if (!jsdoc.tags) {\n    return;\n  }\n  const emptyTags = utils.filterTags(({tag: tagName}) => {\n    return defaultEmptyTags.includes(tagName) ||\n      utils.hasOptionTag(tagName) && jsdoc.tags.some(({tag}) => {\n        return tag === tagName;\n      }) ||\n      settings.mode !== 'closure' && emptyIfNotClosure.includes(tagName);\n  });\n  emptyTags.forEach((tag) => {\n    const fix = () => {\n      tag.name = '';\n      tag.description = '';\n      tag.type = '';\n      tag.optional = false;\n      tag.default = undefined;\n    };\n    const content = tag.name || tag.description || tag.type;\n    if (content) {\n      utils.reportJSDoc(`@${tag.tag} should be empty.`, tag, fix);\n    }\n  });\n}, {\n  checkPrivate: true,\n  iterateAllJsdocs: true,\n  meta: {\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          tags: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"emptyTags.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/implementsOnClasses.js b/node_modules/eslint-plugin-jsdoc/dist/rules/implementsOnClasses.js
deleted file mode 100644
index ba146ae..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/implementsOnClasses.js
+++ /dev/null
@@ -1,50 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  utils
-}) => {
-  const iteratingFunction = utils.isIteratingFunction();
-
-  if (iteratingFunction) {
-    if (utils.hasATag(['class', 'constructor']) || utils.isConstructor()) {
-      return;
-    }
-  } else if (!utils.isVirtualFunction()) {
-    return;
-  }
-
-  utils.forEachPreferredTag('implements', tag => {
-    report('@implements used on a non-constructor function', null, tag);
-  });
-}, {
-  contextDefaults: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        contexts: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=implementsOnClasses.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/implementsOnClasses.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/implementsOnClasses.js.map
deleted file mode 100644
index 0f49881..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/implementsOnClasses.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/implementsOnClasses.js"],"names":["report","utils","iteratingFunction","isIteratingFunction","hasATag","isConstructor","isVirtualFunction","forEachPreferredTag","tag","contextDefaults","meta","schema","additionalProperties","properties","contexts","items","type"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,MAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJ,QAAMC,iBAAiB,GAAGD,KAAK,CAACE,mBAAN,EAA1B;;AAEA,MAAID,iBAAJ,EAAuB;AACrB,QAAID,KAAK,CAACG,OAAN,CAAc,CAChB,OADgB,EAEhB,aAFgB,CAAd,KAIFH,KAAK,CAACI,aAAN,EAJF,EAKE;AACA;AACD;AACF,GATD,MASO,IAAI,CAACJ,KAAK,CAACK,iBAAN,EAAL,EAAgC;AACrC;AACD;;AAEDL,EAAAA,KAAK,CAACM,mBAAN,CAA0B,YAA1B,EAAyCC,GAAD,IAAS;AAC/CR,IAAAA,MAAM,CAAC,gDAAD,EAAmD,IAAnD,EAAyDQ,GAAzD,CAAN;AACD,GAFD;AAGD,CAtBc,EAsBZ;AACDC,EAAAA,eAAe,EAAE,IADhB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,oBAAoB,EAAE,KADxB;AAEEC,MAAAA,UAAU,EAAE;AACVC,QAAAA,QAAQ,EAAE;AACRC,UAAAA,KAAK,EAAE;AACLC,YAAAA,IAAI,EAAE;AADD,WADC;AAIRA,UAAAA,IAAI,EAAE;AAJE;AADA,OAFd;AAUEA,MAAAA,IAAI,EAAE;AAVR,KADM,CADJ;AAeJA,IAAAA,IAAI,EAAE;AAfF;AAFL,CAtBY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  report,\n  utils,\n}) => {\n  const iteratingFunction = utils.isIteratingFunction();\n\n  if (iteratingFunction) {\n    if (utils.hasATag([\n      'class',\n      'constructor',\n    ]) ||\n      utils.isConstructor()\n    ) {\n      return;\n    }\n  } else if (!utils.isVirtualFunction()) {\n    return;\n  }\n\n  utils.forEachPreferredTag('implements', (tag) => {\n    report('@implements used on a non-constructor function', null, tag);\n  });\n}, {\n  contextDefaults: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          contexts: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"implementsOnClasses.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/matchDescription.js b/node_modules/eslint-plugin-jsdoc/dist/rules/matchDescription.js
deleted file mode 100644
index 8fb1613..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/matchDescription.js
+++ /dev/null
@@ -1,137 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _lodash = _interopRequireDefault(require("lodash"));
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-// If supporting Node >= 10, we could loosen the default to this for the
-//   initial letter: \\p{Upper}
-const matchDescriptionDefault = '^[A-Z`\\d_][\\s\\S]*[.?!`]$';
-
-const stringOrDefault = (value, userDefault) => {
-  return typeof value === 'string' ? value : userDefault || matchDescriptionDefault;
-};
-
-var _default = (0, _iterateJsdoc.default)(({
-  jsdoc,
-  report,
-  context,
-  utils
-}) => {
-  const options = context.options[0] || {};
-
-  const validateDescription = (description, tag) => {
-    if (!tag && options.mainDescription === false) {
-      return;
-    }
-
-    let tagValue = options.mainDescription;
-
-    if (tag) {
-      const tagName = tag.tag;
-      tagValue = options.tags[tagName];
-    }
-
-    const regex = new RegExp(stringOrDefault(tagValue, options.matchDescription), 'u');
-
-    if (!regex.test(description)) {
-      report('JSDoc description does not satisfy the regex pattern.', null, tag || {
-        // Add one as description would typically be into block
-        line: jsdoc.line + 1
-      });
-    }
-  };
-
-  if (jsdoc.description) {
-    validateDescription(jsdoc.description);
-  }
-
-  if (!options.tags || !Object.keys(options.tags).length) {
-    return;
-  }
-
-  const hasOptionTag = tagName => {
-    return Boolean(options.tags[tagName]);
-  };
-
-  utils.forEachPreferredTag('description', (matchingJsdocTag, targetTagName) => {
-    const description = (matchingJsdocTag.name + ' ' + matchingJsdocTag.description).trim();
-
-    if (hasOptionTag(targetTagName)) {
-      validateDescription(description, matchingJsdocTag);
-    }
-  }, true);
-  const whitelistedTags = utils.filterTags(({
-    tag: tagName
-  }) => {
-    return hasOptionTag(tagName);
-  });
-
-  const _utils$getTagsByType = utils.getTagsByType(whitelistedTags),
-        tagsWithNames = _utils$getTagsByType.tagsWithNames,
-        tagsWithoutNames = _utils$getTagsByType.tagsWithoutNames;
-
-  tagsWithNames.some(tag => {
-    const description = _lodash.default.trimStart(tag.description, '- ');
-
-    return validateDescription(description, tag);
-  });
-  tagsWithoutNames.some(tag => {
-    const description = (tag.name + ' ' + tag.description).trim();
-    return validateDescription(description, tag);
-  });
-}, {
-  contextDefaults: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        contexts: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        },
-        mainDescription: {
-          oneOf: [{
-            format: 'regex',
-            type: 'string'
-          }, {
-            type: 'boolean'
-          }]
-        },
-        matchDescription: {
-          format: 'regex',
-          type: 'string'
-        },
-        tags: {
-          patternProperties: {
-            '.*': {
-              oneOf: [{
-                format: 'regex',
-                type: 'string'
-              }, {
-                enum: [true],
-                type: 'boolean'
-              }]
-            }
-          },
-          type: 'object'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=matchDescription.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/matchDescription.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/matchDescription.js.map
deleted file mode 100644
index 28bd571..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/matchDescription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/matchDescription.js"],"names":["matchDescriptionDefault","stringOrDefault","value","userDefault","jsdoc","report","context","utils","options","validateDescription","description","tag","mainDescription","tagValue","tagName","tags","regex","RegExp","matchDescription","test","line","Object","keys","length","hasOptionTag","Boolean","forEachPreferredTag","matchingJsdocTag","targetTagName","name","trim","whitelistedTags","filterTags","getTagsByType","tagsWithNames","tagsWithoutNames","some","_","trimStart","contextDefaults","meta","schema","additionalProperties","properties","contexts","items","type","oneOf","format","patternProperties","enum"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport iterateJsdoc from '../iterateJsdoc';\n\n// If supporting Node >= 10, we could loosen the default to this for the\n//   initial letter: \\\\p{Upper}\nconst matchDescriptionDefault = '^[A-Z`\\\\d_][\\\\s\\\\S]*[.?!`]$';\n\nconst stringOrDefault = (value, userDefault) => {\n  return typeof value === 'string' ?\n    value :\n    userDefault || matchDescriptionDefault;\n};\n\nexport default iterateJsdoc(({\n  jsdoc,\n  report,\n  context,\n  utils,\n}) => {\n  const options = context.options[0] || {};\n\n  const validateDescription = (description, tag) => {\n    if (!tag && options.mainDescription === false) {\n      return;\n    }\n\n    let tagValue = options.mainDescription;\n    if (tag) {\n      const tagName = tag.tag;\n      tagValue = options.tags[tagName];\n    }\n\n    const regex = new RegExp(\n      stringOrDefault(tagValue, options.matchDescription),\n      'u',\n    );\n\n    if (!regex.test(description)) {\n      report('JSDoc description does not satisfy the regex pattern.', null, tag || {\n        // Add one as description would typically be into block\n        line: jsdoc.line + 1,\n      });\n    }\n  };\n\n  if (jsdoc.description) {\n    validateDescription(jsdoc.description);\n  }\n\n  if (!options.tags || !Object.keys(options.tags).length) {\n    return;\n  }\n\n  const hasOptionTag = (tagName) => {\n    return Boolean(options.tags[tagName]);\n  };\n\n  utils.forEachPreferredTag('description', (matchingJsdocTag, targetTagName) => {\n    const description = (matchingJsdocTag.name + ' ' + matchingJsdocTag.description).trim();\n    if (hasOptionTag(targetTagName)) {\n      validateDescription(description, matchingJsdocTag);\n    }\n  }, true);\n\n  const whitelistedTags = utils.filterTags(({tag: tagName}) => {\n    return hasOptionTag(tagName);\n  });\n  const {tagsWithNames, tagsWithoutNames} = utils.getTagsByType(whitelistedTags);\n\n  tagsWithNames.some((tag) => {\n    const description = _.trimStart(tag.description, '- ');\n\n    return validateDescription(description, tag);\n  });\n\n  tagsWithoutNames.some((tag) => {\n    const description = (tag.name + ' ' + tag.description).trim();\n\n    return validateDescription(description, tag);\n  });\n}, {\n  contextDefaults: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          contexts: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n          mainDescription: {\n            oneOf: [\n              {\n                format: 'regex',\n                type: 'string',\n              },\n              {\n                type: 'boolean',\n              },\n            ],\n          },\n          matchDescription: {\n            format: 'regex',\n            type: 'string',\n          },\n          tags: {\n            patternProperties: {\n              '.*': {\n                oneOf: [\n                  {\n                    format: 'regex',\n                    type: 'string',\n                  },\n                  {\n                    enum: [true],\n                    type: 'boolean',\n                  },\n                ],\n              },\n            },\n            type: 'object',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"matchDescription.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/newlineAfterDescription.js b/node_modules/eslint-plugin-jsdoc/dist/rules/newlineAfterDescription.js
deleted file mode 100644
index 8e43309..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/newlineAfterDescription.js
+++ /dev/null
@@ -1,77 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _lodash = _interopRequireDefault(require("lodash"));
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  jsdoc,
-  report,
-  context,
-  jsdocNode,
-  sourceCode,
-  indent
-}) => {
-  let always;
-
-  if (!jsdoc.description.trim() || !jsdoc.tags.length) {
-    return;
-  }
-
-  if (_lodash.default.has(context.options, 0)) {
-    always = context.options[0] === 'always';
-  } else {
-    always = true;
-  }
-
-  const descriptionEndsWithANewline = /\n\r?$/.test(jsdoc.description);
-
-  if (always) {
-    if (!descriptionEndsWithANewline) {
-      const sourceLines = sourceCode.getText(jsdocNode).split('\n');
-      const splitDesc = jsdoc.description.split('\n');
-      const lastDescriptionLine = splitDesc.length - 1;
-      report('There must be a newline after the description of the JSDoc block.', fixer => {
-        // Add the new line
-        const injectedLine = `${indent} *` + (sourceLines[lastDescriptionLine].endsWith('\r') ? '\r' : '');
-        sourceLines.splice(lastDescriptionLine + 1, 0, injectedLine);
-        return fixer.replaceText(jsdocNode, sourceLines.join('\n'));
-      }, {
-        line: lastDescriptionLine
-      });
-    }
-  } else if (descriptionEndsWithANewline) {
-    const sourceLines = sourceCode.getText(jsdocNode).split('\n');
-    const splitDesc = jsdoc.description.split('\n');
-    const lastDescriptionLine = splitDesc.length - 1;
-    report('There must be no newline after the description of the JSDoc block.', fixer => {
-      // Remove the extra line
-      sourceLines.splice(lastDescriptionLine, 1);
-      return fixer.replaceText(jsdocNode, sourceLines.join('\n'));
-    }, {
-      line: lastDescriptionLine
-    });
-  }
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    fixable: 'whitespace',
-    schema: [{
-      enum: ['always', 'never'],
-      type: 'string'
-    }],
-    type: 'layout'
-  },
-  noTrim: true
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=newlineAfterDescription.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/newlineAfterDescription.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/newlineAfterDescription.js.map
deleted file mode 100644
index 3837753..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/newlineAfterDescription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/newlineAfterDescription.js"],"names":["jsdoc","report","context","jsdocNode","sourceCode","indent","always","description","trim","tags","length","_","has","options","descriptionEndsWithANewline","test","sourceLines","getText","split","splitDesc","lastDescriptionLine","fixer","injectedLine","endsWith","splice","replaceText","join","line","iterateAllJsdocs","meta","fixable","schema","enum","type","noTrim"],"mappings":";;;;;;;AAAA;;AACA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,KAD2B;AAE3BC,EAAAA,MAF2B;AAG3BC,EAAAA,OAH2B;AAI3BC,EAAAA,SAJ2B;AAK3BC,EAAAA,UAL2B;AAM3BC,EAAAA;AAN2B,CAAD,KAOtB;AACJ,MAAIC,MAAJ;;AAEA,MAAI,CAACN,KAAK,CAACO,WAAN,CAAkBC,IAAlB,EAAD,IAA6B,CAACR,KAAK,CAACS,IAAN,CAAWC,MAA7C,EAAqD;AACnD;AACD;;AAED,MAAIC,gBAAEC,GAAF,CAAMV,OAAO,CAACW,OAAd,EAAuB,CAAvB,CAAJ,EAA+B;AAC7BP,IAAAA,MAAM,GAAGJ,OAAO,CAACW,OAAR,CAAgB,CAAhB,MAAuB,QAAhC;AACD,GAFD,MAEO;AACLP,IAAAA,MAAM,GAAG,IAAT;AACD;;AAED,QAAMQ,2BAA2B,GAAI,QAAD,CAAWC,IAAX,CAAgBf,KAAK,CAACO,WAAtB,CAApC;;AAEA,MAAID,MAAJ,EAAY;AACV,QAAI,CAACQ,2BAAL,EAAkC;AAChC,YAAME,WAAW,GAAGZ,UAAU,CAACa,OAAX,CAAmBd,SAAnB,EAA8Be,KAA9B,CAAoC,IAApC,CAApB;AACA,YAAMC,SAAS,GAAGnB,KAAK,CAACO,WAAN,CAAkBW,KAAlB,CAAwB,IAAxB,CAAlB;AACA,YAAME,mBAAmB,GAAGD,SAAS,CAACT,MAAV,GAAmB,CAA/C;AACAT,MAAAA,MAAM,CAAC,mEAAD,EAAuEoB,KAAD,IAAW;AACrF;AACA,cAAMC,YAAY,GAAI,GAAEjB,MAAO,IAAV,IAClBW,WAAW,CAACI,mBAAD,CAAX,CAAiCG,QAAjC,CAA0C,IAA1C,IAAkD,IAAlD,GAAyD,EADvC,CAArB;AAEAP,QAAAA,WAAW,CAACQ,MAAZ,CAAmBJ,mBAAmB,GAAG,CAAzC,EAA4C,CAA5C,EAA+CE,YAA/C;AAEA,eAAOD,KAAK,CAACI,WAAN,CAAkBtB,SAAlB,EAA6Ba,WAAW,CAACU,IAAZ,CAAiB,IAAjB,CAA7B,CAAP;AACD,OAPK,EAOH;AACDC,QAAAA,IAAI,EAAEP;AADL,OAPG,CAAN;AAUD;AACF,GAhBD,MAgBO,IAAIN,2BAAJ,EAAiC;AACtC,UAAME,WAAW,GAAGZ,UAAU,CAACa,OAAX,CAAmBd,SAAnB,EAA8Be,KAA9B,CAAoC,IAApC,CAApB;AACA,UAAMC,SAAS,GAAGnB,KAAK,CAACO,WAAN,CAAkBW,KAAlB,CAAwB,IAAxB,CAAlB;AACA,UAAME,mBAAmB,GAAGD,SAAS,CAACT,MAAV,GAAmB,CAA/C;AACAT,IAAAA,MAAM,CAAC,oEAAD,EAAwEoB,KAAD,IAAW;AACtF;AACAL,MAAAA,WAAW,CAACQ,MAAZ,CAAmBJ,mBAAnB,EAAwC,CAAxC;AAEA,aAAOC,KAAK,CAACI,WAAN,CAAkBtB,SAAlB,EAA6Ba,WAAW,CAACU,IAAZ,CAAiB,IAAjB,CAA7B,CAAP;AACD,KALK,EAKH;AACDC,MAAAA,IAAI,EAAEP;AADL,KALG,CAAN;AAQD;AACF,CAnDc,EAmDZ;AACDQ,EAAAA,gBAAgB,EAAE,IADjB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,OAAO,EAAE,YADL;AAEJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,IAAI,EAAE,CAAC,QAAD,EAAW,OAAX,CADR;AAEEC,MAAAA,IAAI,EAAE;AAFR,KADM,CAFJ;AAQJA,IAAAA,IAAI,EAAE;AARF,GAFL;AAYDC,EAAAA,MAAM,EAAE;AAZP,CAnDY,C","sourcesContent":["import _ from 'lodash';\nimport iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  jsdoc,\n  report,\n  context,\n  jsdocNode,\n  sourceCode,\n  indent,\n}) => {\n  let always;\n\n  if (!jsdoc.description.trim() || !jsdoc.tags.length) {\n    return;\n  }\n\n  if (_.has(context.options, 0)) {\n    always = context.options[0] === 'always';\n  } else {\n    always = true;\n  }\n\n  const descriptionEndsWithANewline = (/\\n\\r?$/).test(jsdoc.description);\n\n  if (always) {\n    if (!descriptionEndsWithANewline) {\n      const sourceLines = sourceCode.getText(jsdocNode).split('\\n');\n      const splitDesc = jsdoc.description.split('\\n');\n      const lastDescriptionLine = splitDesc.length - 1;\n      report('There must be a newline after the description of the JSDoc block.', (fixer) => {\n        // Add the new line\n        const injectedLine = `${indent} *` +\n          (sourceLines[lastDescriptionLine].endsWith('\\r') ? '\\r' : '');\n        sourceLines.splice(lastDescriptionLine + 1, 0, injectedLine);\n\n        return fixer.replaceText(jsdocNode, sourceLines.join('\\n'));\n      }, {\n        line: lastDescriptionLine,\n      });\n    }\n  } else if (descriptionEndsWithANewline) {\n    const sourceLines = sourceCode.getText(jsdocNode).split('\\n');\n    const splitDesc = jsdoc.description.split('\\n');\n    const lastDescriptionLine = splitDesc.length - 1;\n    report('There must be no newline after the description of the JSDoc block.', (fixer) => {\n      // Remove the extra line\n      sourceLines.splice(lastDescriptionLine, 1);\n\n      return fixer.replaceText(jsdocNode, sourceLines.join('\\n'));\n    }, {\n      line: lastDescriptionLine,\n    });\n  }\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    fixable: 'whitespace',\n    schema: [\n      {\n        enum: ['always', 'never'],\n        type: 'string',\n      },\n    ],\n    type: 'layout',\n  },\n  noTrim: true,\n});\n"],"file":"newlineAfterDescription.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/noBadBlocks.js b/node_modules/eslint-plugin-jsdoc/dist/rules/noBadBlocks.js
deleted file mode 100644
index 507e93e..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/noBadBlocks.js
+++ /dev/null
@@ -1,46 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  context,
-  sourceCode,
-  allComments,
-  makeReport
-}) => {
-  const nonJsdocNodes = allComments.filter(comment => {
-    return /^\/\*(?!\*)[\s*]*@\w/.test(sourceCode.getText(comment));
-  });
-
-  if (!nonJsdocNodes.length) {
-    return;
-  }
-
-  nonJsdocNodes.forEach(node => {
-    const report = makeReport(context, node);
-
-    const fix = fixer => {
-      const text = sourceCode.getText(node);
-      return fixer.replaceText(node, text.replace('/*', '/**'));
-    };
-
-    report('Expected JSDoc-like comment to begin with two asterisks.', fix);
-  });
-}, {
-  checkFile: true,
-  meta: {
-    fixable: 'code',
-    type: 'layout'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=noBadBlocks.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/noBadBlocks.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/noBadBlocks.js.map
deleted file mode 100644
index d01764c..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/noBadBlocks.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/noBadBlocks.js"],"names":["context","sourceCode","allComments","makeReport","nonJsdocNodes","filter","comment","test","getText","length","forEach","node","report","fix","fixer","text","replaceText","replace","checkFile","meta","fixable","type"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,OAD2B;AAE3BC,EAAAA,UAF2B;AAG3BC,EAAAA,WAH2B;AAI3BC,EAAAA;AAJ2B,CAAD,KAKtB;AACJ,QAAMC,aAAa,GAAGF,WAAW,CAACG,MAAZ,CAAoBC,OAAD,IAAa;AACpD,WAAQ,sBAAD,CAAyBC,IAAzB,CAA8BN,UAAU,CAACO,OAAX,CAAmBF,OAAnB,CAA9B,CAAP;AACD,GAFqB,CAAtB;;AAGA,MAAI,CAACF,aAAa,CAACK,MAAnB,EAA2B;AACzB;AACD;;AAEDL,EAAAA,aAAa,CAACM,OAAd,CAAuBC,IAAD,IAAU;AAC9B,UAAMC,MAAM,GAAGT,UAAU,CAACH,OAAD,EAAUW,IAAV,CAAzB;;AAEA,UAAME,GAAG,GAAIC,KAAD,IAAW;AACrB,YAAMC,IAAI,GAAGd,UAAU,CAACO,OAAX,CAAmBG,IAAnB,CAAb;AAEA,aAAOG,KAAK,CAACE,WAAN,CAAkBL,IAAlB,EAAwBI,IAAI,CAACE,OAAL,CAAa,IAAb,EAAmB,KAAnB,CAAxB,CAAP;AACD,KAJD;;AAKAL,IAAAA,MAAM,CAAC,0DAAD,EAA6DC,GAA7D,CAAN;AACD,GATD;AAUD,CAvBc,EAuBZ;AACDK,EAAAA,SAAS,EAAE,IADV;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,OAAO,EAAE,MADL;AAEJC,IAAAA,IAAI,EAAE;AAFF;AAFL,CAvBY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  context,\n  sourceCode,\n  allComments,\n  makeReport,\n}) => {\n  const nonJsdocNodes = allComments.filter((comment) => {\n    return (/^\\/\\*(?!\\*)[\\s*]*@\\w/).test(sourceCode.getText(comment));\n  });\n  if (!nonJsdocNodes.length) {\n    return;\n  }\n\n  nonJsdocNodes.forEach((node) => {\n    const report = makeReport(context, node);\n\n    const fix = (fixer) => {\n      const text = sourceCode.getText(node);\n\n      return fixer.replaceText(node, text.replace('/*', '/**'));\n    };\n    report('Expected JSDoc-like comment to begin with two asterisks.', fix);\n  });\n}, {\n  checkFile: true,\n  meta: {\n    fixable: 'code',\n    type: 'layout',\n  },\n});\n"],"file":"noBadBlocks.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/noDefaults.js b/node_modules/eslint-plugin-jsdoc/dist/rules/noDefaults.js
deleted file mode 100644
index 61d591c..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/noDefaults.js
+++ /dev/null
@@ -1,65 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  context,
-  utils
-}) => {
-  const _ref = context.options[0] || {},
-        noOptionalParamNames = _ref.noOptionalParamNames;
-
-  const paramTags = utils.getPresentTags(['param', 'arg', 'argument']);
-  paramTags.forEach(tag => {
-    if (noOptionalParamNames && tag.optional) {
-      utils.reportJSDoc(`Optional param names are not permitted on @${tag.tag}.`, tag, () => {
-        tag.default = '';
-        tag.optional = false;
-      });
-    } else if (tag.default) {
-      utils.reportJSDoc(`Defaults are not permitted on @${tag.tag}.`, tag, () => {
-        tag.default = '';
-      });
-    }
-  });
-  const defaultTags = utils.getPresentTags(['default', 'defaultvalue']);
-  defaultTags.forEach(tag => {
-    if (tag.description) {
-      utils.reportJSDoc(`Default values are not permitted on @${tag.tag}.`, tag, () => {
-        tag.description = '';
-      });
-    }
-  });
-}, {
-  contextDefaults: true,
-  meta: {
-    fixable: 'code',
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        contexts: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        },
-        noOptionalParamNames: {
-          type: 'boolean'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=noDefaults.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/noDefaults.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/noDefaults.js.map
deleted file mode 100644
index 26760d3..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/noDefaults.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/noDefaults.js"],"names":["context","utils","options","noOptionalParamNames","paramTags","getPresentTags","forEach","tag","optional","reportJSDoc","default","defaultTags","description","contextDefaults","meta","fixable","schema","additionalProperties","properties","contexts","items","type"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,OAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AAAA,eAC2BD,OAAO,CAACE,OAAR,CAAgB,CAAhB,KAAsB,EADjD;AAAA,QACGC,oBADH,QACGA,oBADH;;AAEJ,QAAMC,SAAS,GAAGH,KAAK,CAACI,cAAN,CAAqB,CAAC,OAAD,EAAU,KAAV,EAAiB,UAAjB,CAArB,CAAlB;AACAD,EAAAA,SAAS,CAACE,OAAV,CAAmBC,GAAD,IAAS;AACzB,QAAIJ,oBAAoB,IAAII,GAAG,CAACC,QAAhC,EAA0C;AACxCP,MAAAA,KAAK,CAACQ,WAAN,CAAmB,8CAA6CF,GAAG,CAACA,GAAI,GAAxE,EAA4EA,GAA5E,EAAiF,MAAM;AACrFA,QAAAA,GAAG,CAACG,OAAJ,GAAc,EAAd;AACAH,QAAAA,GAAG,CAACC,QAAJ,GAAe,KAAf;AACD,OAHD;AAID,KALD,MAKO,IAAID,GAAG,CAACG,OAAR,EAAiB;AACtBT,MAAAA,KAAK,CAACQ,WAAN,CAAmB,kCAAiCF,GAAG,CAACA,GAAI,GAA5D,EAAgEA,GAAhE,EAAqE,MAAM;AACzEA,QAAAA,GAAG,CAACG,OAAJ,GAAc,EAAd;AACD,OAFD;AAGD;AACF,GAXD;AAYA,QAAMC,WAAW,GAAGV,KAAK,CAACI,cAAN,CAAqB,CAAC,SAAD,EAAY,cAAZ,CAArB,CAApB;AACAM,EAAAA,WAAW,CAACL,OAAZ,CAAqBC,GAAD,IAAS;AAC3B,QAAIA,GAAG,CAACK,WAAR,EAAqB;AACnBX,MAAAA,KAAK,CAACQ,WAAN,CAAmB,wCAAuCF,GAAG,CAACA,GAAI,GAAlE,EAAsEA,GAAtE,EAA2E,MAAM;AAC/EA,QAAAA,GAAG,CAACK,WAAJ,GAAkB,EAAlB;AACD,OAFD;AAGD;AACF,GAND;AAOD,CA1Bc,EA0BZ;AACDC,EAAAA,eAAe,EAAE,IADhB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,OAAO,EAAE,MADL;AAEJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,oBAAoB,EAAE,KADxB;AAEEC,MAAAA,UAAU,EAAE;AACVC,QAAAA,QAAQ,EAAE;AACRC,UAAAA,KAAK,EAAE;AACLC,YAAAA,IAAI,EAAE;AADD,WADC;AAIRA,UAAAA,IAAI,EAAE;AAJE,SADA;AAOVlB,QAAAA,oBAAoB,EAAE;AACpBkB,UAAAA,IAAI,EAAE;AADc;AAPZ,OAFd;AAaEA,MAAAA,IAAI,EAAE;AAbR,KADM,CAFJ;AAmBJA,IAAAA,IAAI,EAAE;AAnBF;AAFL,CA1BY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  context,\n  utils,\n}) => {\n  const {noOptionalParamNames} = context.options[0] || {};\n  const paramTags = utils.getPresentTags(['param', 'arg', 'argument']);\n  paramTags.forEach((tag) => {\n    if (noOptionalParamNames && tag.optional) {\n      utils.reportJSDoc(`Optional param names are not permitted on @${tag.tag}.`, tag, () => {\n        tag.default = '';\n        tag.optional = false;\n      });\n    } else if (tag.default) {\n      utils.reportJSDoc(`Defaults are not permitted on @${tag.tag}.`, tag, () => {\n        tag.default = '';\n      });\n    }\n  });\n  const defaultTags = utils.getPresentTags(['default', 'defaultvalue']);\n  defaultTags.forEach((tag) => {\n    if (tag.description) {\n      utils.reportJSDoc(`Default values are not permitted on @${tag.tag}.`, tag, () => {\n        tag.description = '';\n      });\n    }\n  });\n}, {\n  contextDefaults: true,\n  meta: {\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          contexts: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n          noOptionalParamNames: {\n            type: 'boolean',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"noDefaults.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/noTypes.js b/node_modules/eslint-plugin-jsdoc/dist/rules/noTypes.js
deleted file mode 100644
index 2fd4f00..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/noTypes.js
+++ /dev/null
@@ -1,49 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  utils
-}) => {
-  if (!utils.isIteratingFunction() && !utils.isVirtualFunction()) {
-    return;
-  }
-
-  const tags = utils.getPresentTags(['param', 'arg', 'argument', 'returns', 'return']);
-  tags.forEach(tag => {
-    if (tag.type) {
-      utils.reportJSDoc(`Types are not permitted on @${tag.tag}.`, tag, () => {
-        tag.type = '';
-      });
-    }
-  });
-}, {
-  contextDefaults: true,
-  meta: {
-    fixable: 'code',
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        contexts: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=noTypes.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/noTypes.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/noTypes.js.map
deleted file mode 100644
index ba3976a..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/noTypes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/noTypes.js"],"names":["utils","isIteratingFunction","isVirtualFunction","tags","getPresentTags","forEach","tag","type","reportJSDoc","contextDefaults","meta","fixable","schema","additionalProperties","properties","contexts","items"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA;AAD2B,CAAD,KAEtB;AACJ,MAAI,CAACA,KAAK,CAACC,mBAAN,EAAD,IAAgC,CAACD,KAAK,CAACE,iBAAN,EAArC,EAAgE;AAC9D;AACD;;AAED,QAAMC,IAAI,GAAGH,KAAK,CAACI,cAAN,CAAqB,CAAC,OAAD,EAAU,KAAV,EAAiB,UAAjB,EAA6B,SAA7B,EAAwC,QAAxC,CAArB,CAAb;AAEAD,EAAAA,IAAI,CAACE,OAAL,CAAcC,GAAD,IAAS;AACpB,QAAIA,GAAG,CAACC,IAAR,EAAc;AACZP,MAAAA,KAAK,CAACQ,WAAN,CAAmB,+BAA8BF,GAAG,CAACA,GAAI,GAAzD,EAA6DA,GAA7D,EAAkE,MAAM;AACtEA,QAAAA,GAAG,CAACC,IAAJ,GAAW,EAAX;AACD,OAFD;AAGD;AACF,GAND;AAOD,CAhBc,EAgBZ;AACDE,EAAAA,eAAe,EAAE,IADhB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,OAAO,EAAE,MADL;AAEJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,oBAAoB,EAAE,KADxB;AAEEC,MAAAA,UAAU,EAAE;AACVC,QAAAA,QAAQ,EAAE;AACRC,UAAAA,KAAK,EAAE;AACLT,YAAAA,IAAI,EAAE;AADD,WADC;AAIRA,UAAAA,IAAI,EAAE;AAJE;AADA,OAFd;AAUEA,MAAAA,IAAI,EAAE;AAVR,KADM,CAFJ;AAgBJA,IAAAA,IAAI,EAAE;AAhBF;AAFL,CAhBY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  utils,\n}) => {\n  if (!utils.isIteratingFunction() && !utils.isVirtualFunction()) {\n    return;\n  }\n\n  const tags = utils.getPresentTags(['param', 'arg', 'argument', 'returns', 'return']);\n\n  tags.forEach((tag) => {\n    if (tag.type) {\n      utils.reportJSDoc(`Types are not permitted on @${tag.tag}.`, tag, () => {\n        tag.type = '';\n      });\n    }\n  });\n}, {\n  contextDefaults: true,\n  meta: {\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          contexts: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"noTypes.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/noUndefinedTypes.js b/node_modules/eslint-plugin-jsdoc/dist/rules/noUndefinedTypes.js
deleted file mode 100644
index 3736b48..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/noUndefinedTypes.js
+++ /dev/null
@@ -1,154 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _lodash = _interopRequireDefault(require("lodash"));
-
-var _jsdoctypeparser = require("jsdoctypeparser");
-
-var _iterateJsdoc = _interopRequireWildcard(require("../iterateJsdoc"));
-
-var _jsdocUtils = _interopRequireDefault(require("../jsdocUtils"));
-
-function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const extraTypes = ['null', 'undefined', 'void', 'string', 'boolean', 'object', 'function', 'symbol', 'number', 'bigint', 'NaN', 'Infinity', 'any', '*', 'Array', 'Object', 'RegExp', 'Date', 'Function'];
-
-const stripPseudoTypes = str => {
-  return str && str.replace(/(?:\.|<>|\.<>|\[\])$/u, '');
-};
-
-var _default = (0, _iterateJsdoc.default)(({
-  context,
-  report,
-  settings,
-  sourceCode: {
-    scopeManager
-  },
-  utils
-}) => {
-  const globalScope = scopeManager.globalScope;
-
-  const _ref = context.options[0] || {},
-        _ref$definedTypes = _ref.definedTypes,
-        definedTypes = _ref$definedTypes === void 0 ? [] : _ref$definedTypes;
-
-  let definedPreferredTypes = [];
-  const preferredTypes = settings.preferredTypes;
-
-  if (Object.keys(preferredTypes).length) {
-    // Replace `_.values` with `Object.values` when we may start requiring Node 7+
-    definedPreferredTypes = _lodash.default.values(preferredTypes).map(preferredType => {
-      if (typeof preferredType === 'string') {
-        // May become an empty string but will be filtered out below
-        return stripPseudoTypes(preferredType);
-      }
-
-      if (!preferredType) {
-        return undefined;
-      }
-
-      if (typeof preferredType !== 'object') {
-        utils.reportSettings('Invalid `settings.jsdoc.preferredTypes`. Values must be falsy, a string, or an object.');
-      }
-
-      return stripPseudoTypes(preferredType.replacement);
-    }).filter(preferredType => {
-      return preferredType;
-    });
-  }
-
-  const typedefDeclarations = (0, _lodash.default)(context.getAllComments()).filter(comment => {
-    return comment.value.startsWith('*');
-  }).map(_iterateJsdoc.parseComment).flatMap(doc => {
-    return (doc.tags || []).filter(({
-      tag
-    }) => {
-      return utils.isNamepathDefiningTag(tag);
-    });
-  }).map(tag => {
-    return tag.name;
-  }).value();
-  let templateTags = utils.getPresentTags('template');
-  const classJsdoc = utils.getClassJsdoc();
-
-  if (classJsdoc && classJsdoc.tags) {
-    templateTags = templateTags.concat(classJsdoc.tags.filter(tag => {
-      return tag.tag === 'template';
-    }));
-  }
-
-  const closureGenericTypes = _lodash.default.flatMap(templateTags, tag => {
-    return _jsdocUtils.default.parseClosureTemplateTag(tag);
-  });
-
-  const allDefinedTypes = globalScope.variables.map(variable => {
-    return variable.name;
-  }) // If the file is a module, concat the variables from the module scope.
-  .concat( // This covers `commonjs` as well as `node`
-  scopeManager.__options.nodejsScope || scopeManager.isModule() ? globalScope.childScopes.reduce((arr, {
-    variables
-  }) => {
-    // Flatten
-    arr.push(...variables);
-    return arr;
-  }, []).map(({
-    name
-  }) => {
-    return name;
-  }) : []).concat(extraTypes).concat(typedefDeclarations).concat(definedTypes).concat(definedPreferredTypes).concat(settings.mode === 'jsdoc' ? [] : closureGenericTypes);
-  const jsdocTagsWithPossibleType = utils.filterTags(tag => {
-    return utils.tagMightHaveTypePosition(tag.tag);
-  });
-  jsdocTagsWithPossibleType.forEach(tag => {
-    let parsedType;
-
-    try {
-      parsedType = (0, _jsdoctypeparser.parse)(tag.type);
-    } catch (error) {
-      // On syntax error, will be handled by valid-types.
-      return;
-    }
-
-    (0, _jsdoctypeparser.traverse)(parsedType, ({
-      type,
-      name
-    }) => {
-      if (type === 'NAME') {
-        if (!allDefinedTypes.includes(name)) {
-          report(`The type '${name}' is undefined.`, null, tag);
-        } else if (!_lodash.default.includes(extraTypes, name)) {
-          context.markVariableAsUsed(name);
-        }
-      }
-    });
-  });
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        definedTypes: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=noUndefinedTypes.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/noUndefinedTypes.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/noUndefinedTypes.js.map
deleted file mode 100644
index ccce045..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/noUndefinedTypes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/noUndefinedTypes.js"],"names":["extraTypes","stripPseudoTypes","str","replace","context","report","settings","sourceCode","scopeManager","utils","globalScope","options","definedTypes","definedPreferredTypes","preferredTypes","Object","keys","length","_","values","map","preferredType","undefined","reportSettings","replacement","filter","typedefDeclarations","getAllComments","comment","value","startsWith","parseComment","flatMap","doc","tags","tag","isNamepathDefiningTag","name","templateTags","getPresentTags","classJsdoc","getClassJsdoc","concat","closureGenericTypes","jsdocUtils","parseClosureTemplateTag","allDefinedTypes","variables","variable","__options","nodejsScope","isModule","childScopes","reduce","arr","push","mode","jsdocTagsWithPossibleType","filterTags","tagMightHaveTypePosition","forEach","parsedType","type","error","includes","markVariableAsUsed","iterateAllJsdocs","meta","schema","additionalProperties","properties","items"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport {parse as parseType, traverse} from 'jsdoctypeparser';\nimport iterateJsdoc, {parseComment} from '../iterateJsdoc';\nimport jsdocUtils from '../jsdocUtils';\n\nconst extraTypes = [\n  'null', 'undefined', 'void', 'string', 'boolean', 'object',\n  'function', 'symbol',\n  'number', 'bigint', 'NaN', 'Infinity',\n  'any', '*',\n  'Array', 'Object', 'RegExp', 'Date', 'Function',\n];\n\nconst stripPseudoTypes = (str) => {\n  return str && str.replace(/(?:\\.|<>|\\.<>|\\[\\])$/u, '');\n};\n\nexport default iterateJsdoc(({\n  context,\n  report,\n  settings,\n  sourceCode: {scopeManager},\n  utils,\n}) => {\n  const {globalScope} = scopeManager;\n\n  const {definedTypes = []} = context.options[0] || {};\n\n  let definedPreferredTypes = [];\n  const {preferredTypes} = settings;\n  if (Object.keys(preferredTypes).length) {\n    // Replace `_.values` with `Object.values` when we may start requiring Node 7+\n    definedPreferredTypes = _.values(preferredTypes).map((preferredType) => {\n      if (typeof preferredType === 'string') {\n        // May become an empty string but will be filtered out below\n        return stripPseudoTypes(preferredType);\n      }\n      if (!preferredType) {\n        return undefined;\n      }\n      if (typeof preferredType !== 'object') {\n        utils.reportSettings(\n          'Invalid `settings.jsdoc.preferredTypes`. Values must be falsy, a string, or an object.',\n        );\n      }\n\n      return stripPseudoTypes(preferredType.replacement);\n    }).filter((preferredType) => {\n      return preferredType;\n    });\n  }\n\n  const typedefDeclarations = _(context.getAllComments())\n    .filter((comment) => {\n      return comment.value.startsWith('*');\n    })\n    .map(parseComment)\n    .flatMap((doc) => {\n      return (doc.tags || []).filter(({tag}) => {\n        return utils.isNamepathDefiningTag(tag);\n      });\n    })\n    .map((tag) => {\n      return tag.name;\n    })\n    .value();\n\n  let templateTags = utils.getPresentTags('template');\n  const classJsdoc = utils.getClassJsdoc();\n  if (classJsdoc && classJsdoc.tags) {\n    templateTags = templateTags.concat(\n      classJsdoc.tags\n        .filter((tag) => {\n          return tag.tag === 'template';\n        }),\n    );\n  }\n\n  const closureGenericTypes = _.flatMap(templateTags, (tag) => {\n    return jsdocUtils.parseClosureTemplateTag(tag);\n  });\n\n  const allDefinedTypes = globalScope.variables.map((variable) => {\n    return variable.name;\n  })\n\n    // If the file is a module, concat the variables from the module scope.\n    .concat(\n\n      // This covers `commonjs` as well as `node`\n      scopeManager.__options.nodejsScope ||\n      scopeManager.isModule() ?\n        globalScope.childScopes.reduce((arr, {variables}) => {\n          // Flatten\n          arr.push(...variables);\n\n          return arr;\n        }, []).map(({name}) => {\n          return name;\n        }) : [],\n    )\n    .concat(extraTypes)\n    .concat(typedefDeclarations)\n    .concat(definedTypes)\n    .concat(definedPreferredTypes)\n    .concat(settings.mode === 'jsdoc' ? [] : closureGenericTypes);\n\n  const jsdocTagsWithPossibleType = utils.filterTags((tag) => {\n    return utils.tagMightHaveTypePosition(tag.tag);\n  });\n\n  jsdocTagsWithPossibleType.forEach((tag) => {\n    let parsedType;\n\n    try {\n      parsedType = parseType(tag.type);\n    } catch (error) {\n      // On syntax error, will be handled by valid-types.\n      return;\n    }\n\n    traverse(parsedType, ({type, name}) => {\n      if (type === 'NAME') {\n        if (!allDefinedTypes.includes(name)) {\n          report(`The type '${name}' is undefined.`, null, tag);\n        } else if (!_.includes(extraTypes, name)) {\n          context.markVariableAsUsed(name);\n        }\n      }\n    });\n  });\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          definedTypes: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"noUndefinedTypes.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescription.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescription.js
deleted file mode 100644
index 127d3cd..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescription.js
+++ /dev/null
@@ -1,109 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _lodash = _interopRequireDefault(require("lodash"));
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  jsdoc,
-  report,
-  utils,
-  context
-}) => {
-  if (utils.avoidDocs()) {
-    return;
-  }
-
-  const _ref = context.options[0] || {},
-        _ref$descriptionStyle = _ref.descriptionStyle,
-        descriptionStyle = _ref$descriptionStyle === void 0 ? 'body' : _ref$descriptionStyle;
-
-  let targetTagName = utils.getPreferredTagName({
-    // We skip reporting except when `@description` is essential to the rule,
-    //  so user can block the tag and still meaningfully use this rule
-    //  even if the tag is present (and `check-tag-names` is the one to
-    //  normally report the fact that it is blocked but present)
-    skipReportingBlockedTag: descriptionStyle !== 'tag',
-    tagName: 'description'
-  });
-
-  if (!targetTagName) {
-    return;
-  }
-
-  const isBlocked = typeof targetTagName === 'object' && targetTagName.blocked;
-
-  if (isBlocked) {
-    targetTagName = targetTagName.tagName;
-  }
-
-  const checkDescription = description => {
-    const exampleContent = _lodash.default.compact(description.trim().split('\n'));
-
-    return exampleContent.length;
-  };
-
-  if (descriptionStyle !== 'tag') {
-    if (checkDescription(jsdoc.description || '')) {
-      return;
-    }
-
-    if (descriptionStyle === 'body') {
-      report('Missing JSDoc block description.');
-      return;
-    }
-  }
-
-  const functionExamples = isBlocked ? [] : _lodash.default.filter(jsdoc.tags, {
-    tag: targetTagName
-  });
-
-  if (!functionExamples.length) {
-    report(descriptionStyle === 'any' ? `Missing JSDoc block description or @${targetTagName} declaration.` : `Missing JSDoc @${targetTagName} declaration.`);
-    return;
-  }
-
-  functionExamples.forEach(example => {
-    if (!checkDescription(`${example.name} ${example.description}`)) {
-      report(`Missing JSDoc @${targetTagName} description.`);
-    }
-  });
-}, {
-  contextDefaults: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        contexts: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        },
-        descriptionStyle: {
-          enum: ['body', 'tag', 'any'],
-          type: 'string'
-        },
-        exemptedBy: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireDescription.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescription.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescription.js.map
deleted file mode 100644
index cdd3570..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireDescription.js"],"names":["jsdoc","report","utils","context","avoidDocs","options","descriptionStyle","targetTagName","getPreferredTagName","skipReportingBlockedTag","tagName","isBlocked","blocked","checkDescription","description","exampleContent","_","compact","trim","split","length","functionExamples","filter","tags","tag","forEach","example","name","contextDefaults","meta","schema","additionalProperties","properties","contexts","items","type","enum","exemptedBy"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  jsdoc,\n  report,\n  utils,\n  context,\n}) => {\n  if (utils.avoidDocs()) {\n    return;\n  }\n  const {descriptionStyle = 'body'} = context.options[0] || {};\n\n  let targetTagName = utils.getPreferredTagName({\n    // We skip reporting except when `@description` is essential to the rule,\n    //  so user can block the tag and still meaningfully use this rule\n    //  even if the tag is present (and `check-tag-names` is the one to\n    //  normally report the fact that it is blocked but present)\n    skipReportingBlockedTag: descriptionStyle !== 'tag',\n    tagName: 'description',\n  });\n  if (!targetTagName) {\n    return;\n  }\n  const isBlocked = typeof targetTagName === 'object' && targetTagName.blocked;\n  if (isBlocked) {\n    targetTagName = targetTagName.tagName;\n  }\n\n  const checkDescription = (description) => {\n    const exampleContent = _.compact(description.trim().split('\\n'));\n\n    return exampleContent.length;\n  };\n\n  if (descriptionStyle !== 'tag') {\n    if (checkDescription(jsdoc.description || '')) {\n      return;\n    }\n\n    if (descriptionStyle === 'body') {\n      report('Missing JSDoc block description.');\n\n      return;\n    }\n  }\n\n  const functionExamples = isBlocked ?\n    [] :\n    _.filter(jsdoc.tags, {\n      tag: targetTagName,\n    });\n\n  if (!functionExamples.length) {\n    report(\n      descriptionStyle === 'any' ?\n        `Missing JSDoc block description or @${targetTagName} declaration.` :\n        `Missing JSDoc @${targetTagName} declaration.`,\n    );\n\n    return;\n  }\n\n  functionExamples.forEach((example) => {\n    if (!checkDescription(`${example.name} ${example.description}`)) {\n      report(`Missing JSDoc @${targetTagName} description.`);\n    }\n  });\n}, {\n  contextDefaults: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          contexts: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n          descriptionStyle: {\n            enum: ['body', 'tag', 'any'],\n            type: 'string',\n          },\n          exemptedBy: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"requireDescription.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescriptionCompleteSentence.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescriptionCompleteSentence.js
deleted file mode 100644
index d505372..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescriptionCompleteSentence.js
+++ /dev/null
@@ -1,230 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _lodash = _interopRequireDefault(require("lodash"));
-
-var _mainUmd = require("regextras/dist/main-umd");
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const otherDescriptiveTags = [// 'copyright' and 'see' might be good addition, but as the former may be
-//   sensitive text, and the latter may have just a link, they are not
-//   included by default
-'summary', 'file', 'fileoverview', 'overview', 'classdesc', 'todo', 'deprecated', 'throws', 'exception', 'yields', 'yield'];
-
-const extractParagraphs = text => {
-  // Todo [engine:node@>8.11.0]: Uncomment following line with neg. lookbehind instead
-  // return text.split(/(?<![;:])\n\n/u);
-  return [...text].reverse().join('').split(/\n\n(?![;:])/u).map(par => {
-    return [...par].reverse().join('');
-  }).reverse();
-};
-
-const extractSentences = (text, abbreviationsRegex) => {
-  const txt = text // Remove all {} tags.
-  .replace(/\{[\s\S]*?\}\s*/gu, '') // Remove custom abbreviations
-  .replace(abbreviationsRegex, '');
-  const sentenceEndGrouping = /([.?!])(?:\s+|$)/u;
-  const puncts = (0, _mainUmd.RegExtras)(sentenceEndGrouping).map(txt, punct => {
-    return punct;
-  });
-  return txt.split(/[.?!](?:\s+|$)/u) // Re-add the dot.
-  .map((sentence, idx) => {
-    return /^\s*$/u.test(sentence) ? sentence : `${sentence}${puncts[idx] || ''}`;
-  });
-};
-
-const isNewLinePrecededByAPeriod = text => {
-  let lastLineEndsSentence;
-  const lines = text.split('\n');
-  return !lines.some(line => {
-    if (lastLineEndsSentence === false && /^[A-Z][a-z]/u.test(line)) {
-      return true;
-    }
-
-    lastLineEndsSentence = /[.:?!|]$/u.test(line);
-    return false;
-  });
-};
-
-const isCapitalized = str => {
-  return str[0] === str[0].toUpperCase();
-};
-
-const isTable = str => {
-  return str.charAt() === '|';
-};
-
-const capitalize = str => {
-  return str.charAt(0).toUpperCase() + str.slice(1);
-};
-
-const validateDescription = (description, reportOrig, jsdocNode, abbreviationsRegex, sourceCode, tag) => {
-  if (!description) {
-    return false;
-  }
-
-  const paragraphs = extractParagraphs(description);
-  return paragraphs.some((paragraph, parIdx) => {
-    const sentences = extractSentences(paragraph, abbreviationsRegex);
-
-    const fix = fixer => {
-      let text = sourceCode.getText(jsdocNode);
-
-      if (!/[.:?!]$/u.test(paragraph)) {
-        const line = _lodash.default.last(paragraph.split('\n'));
-
-        text = text.replace(new RegExp(`${_lodash.default.escapeRegExp(line)}$`, 'mu'), `${line}.`);
-      }
-
-      var _iteratorNormalCompletion = true;
-      var _didIteratorError = false;
-      var _iteratorError = undefined;
-
-      try {
-        for (var _iterator = sentences.filter(sentence_ => {
-          return !/^\s*$/u.test(sentence_) && !isCapitalized(sentence_) && !isTable(sentence_);
-        })[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-          const sentence = _step.value;
-          const beginning = sentence.split('\n')[0];
-
-          if (tag.tag) {
-            const reg = new RegExp(`(@${_lodash.default.escapeRegExp(tag.tag)}.*)${_lodash.default.escapeRegExp(beginning)}`, 'u');
-            text = text.replace(reg, ($0, $1) => {
-              return $1 + capitalize(beginning);
-            });
-          } else {
-            text = text.replace(beginning, capitalize(beginning));
-          }
-        }
-      } catch (err) {
-        _didIteratorError = true;
-        _iteratorError = err;
-      } finally {
-        try {
-          if (!_iteratorNormalCompletion && _iterator.return != null) {
-            _iterator.return();
-          }
-        } finally {
-          if (_didIteratorError) {
-            throw _iteratorError;
-          }
-        }
-      }
-
-      return fixer.replaceText(jsdocNode, text);
-    };
-
-    const report = (msg, fixer, tagObj) => {
-      tagObj.line += parIdx * 2; // Avoid errors if old column doesn't exist here
-
-      tagObj.column = 0;
-      reportOrig(msg, fixer, tagObj);
-    };
-
-    if (sentences.some(sentence => {
-      return !/^\s*$/u.test(sentence) && !isCapitalized(sentence) && !isTable(sentence);
-    })) {
-      report('Sentence should start with an uppercase character.', fix, tag);
-    }
-
-    const paragraphNoAbbreviations = paragraph.replace(abbreviationsRegex, '');
-
-    if (!/[.!?|]$/u.test(paragraphNoAbbreviations)) {
-      report('Sentence must end with a period.', fix, tag);
-      return true;
-    }
-
-    if (!isNewLinePrecededByAPeriod(paragraphNoAbbreviations)) {
-      report('A line of text is started with an uppercase character, but preceding line does not end the sentence.', null, tag);
-      return true;
-    }
-
-    return false;
-  });
-};
-
-var _default = (0, _iterateJsdoc.default)(({
-  sourceCode,
-  context,
-  jsdoc,
-  report,
-  jsdocNode,
-  utils
-}) => {
-  const options = context.options[0] || {};
-  const _options$abbreviation = options.abbreviations,
-        abbreviations = _options$abbreviation === void 0 ? [] : _options$abbreviation;
-  const abbreviationsRegex = abbreviations.length ? new RegExp('\\b' + abbreviations.map(abbreviation => {
-    return _lodash.default.escapeRegExp(abbreviation.replace(/\.$/g, '') + '.');
-  }).join('|') + '(?:$|\\s)', 'gu') : '';
-
-  if (!jsdoc.tags || validateDescription(jsdoc.description, report, jsdocNode, abbreviationsRegex, sourceCode, {
-    line: jsdoc.line + 1
-  })) {
-    return;
-  }
-
-  utils.forEachPreferredTag('description', matchingJsdocTag => {
-    const description = `${matchingJsdocTag.name} ${matchingJsdocTag.description}`.trim();
-    validateDescription(description, report, jsdocNode, abbreviationsRegex, sourceCode, matchingJsdocTag);
-  }, true);
-
-  const _utils$getTagsByType = utils.getTagsByType(jsdoc.tags),
-        tagsWithNames = _utils$getTagsByType.tagsWithNames;
-
-  const tagsWithoutNames = utils.filterTags(({
-    tag: tagName
-  }) => {
-    return otherDescriptiveTags.includes(tagName) || utils.hasOptionTag(tagName) && !tagsWithNames.some(({
-      tag
-    }) => {
-      // If user accidentally adds tags with names (or like `returns`
-      //  get parsed as having names), do not add to this list
-      return tag === tagName;
-    });
-  });
-  tagsWithNames.some(tag => {
-    const description = _lodash.default.trimStart(tag.description, '- ');
-
-    return validateDescription(description, report, jsdocNode, abbreviationsRegex, sourceCode, tag);
-  });
-  tagsWithoutNames.some(tag => {
-    const description = `${tag.name} ${tag.description}`.trim();
-    return validateDescription(description, report, jsdocNode, abbreviationsRegex, sourceCode, tag);
-  });
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    fixable: 'code',
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        abbreviations: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        },
-        tags: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireDescriptionCompleteSentence.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescriptionCompleteSentence.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescriptionCompleteSentence.js.map
deleted file mode 100644
index c95b99c..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireDescriptionCompleteSentence.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireDescriptionCompleteSentence.js"],"names":["otherDescriptiveTags","extractParagraphs","text","reverse","join","split","map","par","extractSentences","abbreviationsRegex","txt","replace","sentenceEndGrouping","puncts","punct","sentence","idx","test","isNewLinePrecededByAPeriod","lastLineEndsSentence","lines","some","line","isCapitalized","str","toUpperCase","isTable","charAt","capitalize","slice","validateDescription","description","reportOrig","jsdocNode","sourceCode","tag","paragraphs","paragraph","parIdx","sentences","fix","fixer","getText","_","last","RegExp","escapeRegExp","filter","sentence_","beginning","reg","$0","$1","replaceText","report","msg","tagObj","column","paragraphNoAbbreviations","context","jsdoc","utils","options","abbreviations","length","abbreviation","tags","forEachPreferredTag","matchingJsdocTag","name","trim","getTagsByType","tagsWithNames","tagsWithoutNames","filterTags","tagName","includes","hasOptionTag","trimStart","iterateAllJsdocs","meta","fixable","schema","additionalProperties","properties","items","type"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport {RegExtras} from 'regextras/dist/main-umd';\nimport iterateJsdoc from '../iterateJsdoc';\n\nconst otherDescriptiveTags = [\n  // 'copyright' and 'see' might be good addition, but as the former may be\n  //   sensitive text, and the latter may have just a link, they are not\n  //   included by default\n  'summary', 'file', 'fileoverview', 'overview', 'classdesc', 'todo',\n  'deprecated', 'throws', 'exception', 'yields', 'yield',\n];\n\nconst extractParagraphs = (text) => {\n  // Todo [engine:node@>8.11.0]: Uncomment following line with neg. lookbehind instead\n  // return text.split(/(?<![;:])\\n\\n/u);\n  return [...text].reverse().join('').split(/\\n\\n(?![;:])/u).map((par) => {\n    return [...par].reverse().join('');\n  }).reverse();\n};\n\nconst extractSentences = (text, abbreviationsRegex) => {\n  const txt = text\n\n    // Remove all {} tags.\n    .replace(/\\{[\\s\\S]*?\\}\\s*/gu, '')\n\n    // Remove custom abbreviations\n    .replace(abbreviationsRegex, '');\n\n  const sentenceEndGrouping = /([.?!])(?:\\s+|$)/u;\n  const puncts = RegExtras(sentenceEndGrouping).map(txt, (punct) => {\n    return punct;\n  });\n\n  return txt\n\n    .split(/[.?!](?:\\s+|$)/u)\n\n    // Re-add the dot.\n    .map((sentence, idx) => {\n      return /^\\s*$/u.test(sentence) ? sentence : `${sentence}${puncts[idx] || ''}`;\n    });\n};\n\nconst isNewLinePrecededByAPeriod = (text) => {\n  let lastLineEndsSentence;\n\n  const lines = text.split('\\n');\n\n  return !lines.some((line) => {\n    if (lastLineEndsSentence === false && /^[A-Z][a-z]/u.test(line)) {\n      return true;\n    }\n\n    lastLineEndsSentence = /[.:?!|]$/u.test(line);\n\n    return false;\n  });\n};\n\nconst isCapitalized = (str) => {\n  return str[0] === str[0].toUpperCase();\n};\n\nconst isTable = (str) => {\n  return str.charAt() === '|';\n};\n\nconst capitalize = (str) => {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\nconst validateDescription = (description, reportOrig, jsdocNode, abbreviationsRegex, sourceCode, tag) => {\n  if (!description) {\n    return false;\n  }\n\n  const paragraphs = extractParagraphs(description);\n\n  return paragraphs.some((paragraph, parIdx) => {\n    const sentences = extractSentences(paragraph, abbreviationsRegex);\n\n    const fix = (fixer) => {\n      let text = sourceCode.getText(jsdocNode);\n\n      if (!/[.:?!]$/u.test(paragraph)) {\n        const line = _.last(paragraph.split('\\n'));\n\n        text = text.replace(new RegExp(`${_.escapeRegExp(line)}$`, 'mu'), `${line}.`);\n      }\n\n      for (const sentence of sentences.filter((sentence_) => {\n        return !(/^\\s*$/u).test(sentence_) && !isCapitalized(sentence_) &&\n          !isTable(sentence_);\n      })) {\n        const beginning = sentence.split('\\n')[0];\n\n        if (tag.tag) {\n          const reg = new RegExp(`(@${_.escapeRegExp(tag.tag)}.*)${_.escapeRegExp(beginning)}`, 'u');\n\n          text = text.replace(reg, ($0, $1) => {\n            return $1 + capitalize(beginning);\n          });\n        } else {\n          text = text.replace(beginning, capitalize(beginning));\n        }\n      }\n\n      return fixer.replaceText(jsdocNode, text);\n    };\n\n    const report = (msg, fixer, tagObj) => {\n      tagObj.line += parIdx * 2;\n\n      // Avoid errors if old column doesn't exist here\n      tagObj.column = 0;\n      reportOrig(msg, fixer, tagObj);\n    };\n\n    if (sentences.some((sentence) => {\n      return !(/^\\s*$/u).test(sentence) && !isCapitalized(sentence) && !isTable(sentence);\n    })) {\n      report('Sentence should start with an uppercase character.', fix, tag);\n    }\n\n    const paragraphNoAbbreviations = paragraph.replace(abbreviationsRegex, '');\n\n    if (!/[.!?|]$/u.test(paragraphNoAbbreviations)) {\n      report('Sentence must end with a period.', fix, tag);\n\n      return true;\n    }\n\n    if (!isNewLinePrecededByAPeriod(paragraphNoAbbreviations)) {\n      report('A line of text is started with an uppercase character, but preceding line does not end the sentence.', null, tag);\n\n      return true;\n    }\n\n    return false;\n  });\n};\n\nexport default iterateJsdoc(({\n  sourceCode,\n  context,\n  jsdoc,\n  report,\n  jsdocNode,\n  utils,\n}) => {\n  const options = context.options[0] || {};\n  const {\n    abbreviations = [],\n  } = options;\n\n  const abbreviationsRegex = abbreviations.length ?\n    new RegExp('\\\\b' + abbreviations.map((abbreviation) => {\n      return _.escapeRegExp(abbreviation.replace(/\\.$/g, '') + '.');\n    }).join('|') + '(?:$|\\\\s)', 'gu') :\n    '';\n\n  if (!jsdoc.tags ||\n    validateDescription(jsdoc.description, report, jsdocNode, abbreviationsRegex, sourceCode, {\n      line: jsdoc.line + 1,\n    })\n  ) {\n    return;\n  }\n\n  utils.forEachPreferredTag('description', (matchingJsdocTag) => {\n    const description = `${matchingJsdocTag.name} ${matchingJsdocTag.description}`.trim();\n    validateDescription(description, report, jsdocNode, abbreviationsRegex, sourceCode, matchingJsdocTag);\n  }, true);\n\n  const {tagsWithNames} = utils.getTagsByType(jsdoc.tags);\n  const tagsWithoutNames = utils.filterTags(({tag: tagName}) => {\n    return otherDescriptiveTags.includes(tagName) ||\n      utils.hasOptionTag(tagName) && !tagsWithNames.some(({tag}) => {\n        // If user accidentally adds tags with names (or like `returns`\n        //  get parsed as having names), do not add to this list\n        return tag === tagName;\n      });\n  });\n\n  tagsWithNames.some((tag) => {\n    const description = _.trimStart(tag.description, '- ');\n\n    return validateDescription(description, report, jsdocNode, abbreviationsRegex, sourceCode, tag);\n  });\n\n  tagsWithoutNames.some((tag) => {\n    const description = `${tag.name} ${tag.description}`.trim();\n\n    return validateDescription(description, report, jsdocNode, abbreviationsRegex, sourceCode, tag);\n  });\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          abbreviations: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n          tags: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"requireDescriptionCompleteSentence.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireExample.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireExample.js
deleted file mode 100644
index 530f108..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireExample.js
+++ /dev/null
@@ -1,100 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _lodash = _interopRequireDefault(require("lodash"));
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-var _warnRemovedSettings = _interopRequireDefault(require("../warnRemovedSettings"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  jsdoc,
-  report,
-  utils,
-  context
-}) => {
-  (0, _warnRemovedSettings.default)(context, 'require-example');
-
-  if (utils.avoidDocs()) {
-    return;
-  }
-
-  const _ref = context.options[0] || {},
-        _ref$avoidExampleOnCo = _ref.avoidExampleOnConstructors,
-        avoidExampleOnConstructors = _ref$avoidExampleOnCo === void 0 ? false : _ref$avoidExampleOnCo;
-
-  const targetTagName = 'example';
-
-  const functionExamples = _lodash.default.filter(jsdoc.tags, {
-    tag: targetTagName
-  });
-
-  if (avoidExampleOnConstructors && (utils.hasATag(['class', 'constructor']) || utils.isConstructor())) {
-    return;
-  }
-
-  if (!functionExamples.length) {
-    utils.reportJSDoc(`Missing JSDoc @${targetTagName} declaration.`, null, () => {
-      if (!jsdoc.tags) {
-        jsdoc.tags = [];
-      }
-
-      const line = jsdoc.tags.length ? jsdoc.tags[jsdoc.tags.length - 1].line + 1 : 0;
-      jsdoc.tags.push({
-        description: '',
-        line,
-        name: '',
-        optional: false,
-        tag: targetTagName,
-        type: ''
-      });
-    });
-    return;
-  }
-
-  functionExamples.forEach(example => {
-    const exampleContent = _lodash.default.compact(`${example.name} ${example.description}`.trim().split('\n'));
-
-    if (!exampleContent.length) {
-      report(`Missing JSDoc @${targetTagName} description.`);
-    }
-  });
-}, {
-  contextDefaults: true,
-  meta: {
-    fixable: 'code',
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        avoidExampleOnConstructors: {
-          default: false,
-          type: 'boolean'
-        },
-        contexts: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        },
-        exemptedBy: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireExample.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireExample.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireExample.js.map
deleted file mode 100644
index e4d0ebd..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireExample.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireExample.js"],"names":["jsdoc","report","utils","context","avoidDocs","options","avoidExampleOnConstructors","targetTagName","functionExamples","_","filter","tags","tag","hasATag","isConstructor","length","reportJSDoc","line","push","description","name","optional","type","forEach","example","exampleContent","compact","trim","split","contextDefaults","meta","fixable","schema","additionalProperties","properties","default","contexts","items","exemptedBy"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport iterateJsdoc from '../iterateJsdoc';\nimport warnRemovedSettings from '../warnRemovedSettings';\n\nexport default iterateJsdoc(({\n  jsdoc,\n  report,\n  utils,\n  context,\n}) => {\n  warnRemovedSettings(context, 'require-example');\n\n  if (utils.avoidDocs()) {\n    return;\n  }\n\n  const {avoidExampleOnConstructors = false} = context.options[0] || {};\n\n  const targetTagName = 'example';\n\n  const functionExamples = _.filter(jsdoc.tags, {\n    tag: targetTagName,\n  });\n\n  if (avoidExampleOnConstructors && (\n    utils.hasATag([\n      'class',\n      'constructor',\n    ]) ||\n    utils.isConstructor()\n  )) {\n    return;\n  }\n\n  if (!functionExamples.length) {\n    utils.reportJSDoc(`Missing JSDoc @${targetTagName} declaration.`, null, () => {\n      if (!jsdoc.tags) {\n        jsdoc.tags = [];\n      }\n      const line = jsdoc.tags.length ? jsdoc.tags[jsdoc.tags.length - 1].line + 1 : 0;\n      jsdoc.tags.push({\n        description: '',\n        line,\n        name: '',\n        optional: false,\n        tag: targetTagName,\n        type: '',\n      });\n    });\n\n    return;\n  }\n\n  functionExamples.forEach((example) => {\n    const exampleContent = _.compact(`${example.name} ${example.description}`.trim().split('\\n'));\n\n    if (!exampleContent.length) {\n      report(`Missing JSDoc @${targetTagName} description.`);\n    }\n  });\n}, {\n  contextDefaults: true,\n  meta: {\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          avoidExampleOnConstructors: {\n            default: false,\n            type: 'boolean',\n          },\n          contexts: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n          exemptedBy: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"requireExample.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireFileOverview.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireFileOverview.js
deleted file mode 100644
index f98e902..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireFileOverview.js
+++ /dev/null
@@ -1,160 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
-
-function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-const defaultTags = {
-  file: {
-    initialCommentsOnly: true,
-    mustExist: true,
-    preventDuplicates: true
-  }
-};
-
-const setDefaults = state => {
-  // First iteration
-  if (!state.globalTags) {
-    state.globalTags = {};
-    state.hasDuplicates = {};
-    state.hasTag = {};
-    state.hasNonCommentBeforeTag = {};
-  }
-};
-
-var _default = (0, _iterateJsdoc.default)(({
-  jsdocNode,
-  state,
-  utils,
-  context
-}) => {
-  const _ref = context.options[0] || {},
-        _ref$tags = _ref.tags,
-        tags = _ref$tags === void 0 ? defaultTags : _ref$tags;
-
-  setDefaults(state);
-
-  for (var _i = 0, _Object$keys = Object.keys(tags); _i < _Object$keys.length; _i++) {
-    const tagName = _Object$keys[_i];
-    const targetTagName = utils.getPreferredTagName({
-      tagName
-    });
-    const hasTag = targetTagName && utils.hasTag(targetTagName);
-    state.hasTag[tagName] = hasTag || state.hasTag[tagName];
-    const hasDuplicate = state.hasDuplicates[tagName];
-
-    if (hasDuplicate === false) {
-      // Was marked before, so if a tag now, is a dupe
-      state.hasDuplicates[tagName] = hasTag;
-    } else if (!hasDuplicate && hasTag) {
-      // No dupes set before, but has first tag, so change state
-      //   from `undefined` to `false` so can detect next time
-      state.hasDuplicates[tagName] = false;
-      state.hasNonCommentBeforeTag[tagName] = state.hasNonComment && state.hasNonComment < jsdocNode.start;
-    }
-  }
-}, {
-  exit({
-    context,
-    state,
-    utils
-  }) {
-    setDefaults(state);
-
-    const _ref2 = context.options[0] || {},
-          _ref2$tags = _ref2.tags,
-          tags = _ref2$tags === void 0 ? defaultTags : _ref2$tags;
-
-    for (var _i2 = 0, _Object$entries = Object.entries(tags); _i2 < _Object$entries.length; _i2++) {
-      const _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2),
-            tagName = _Object$entries$_i[0],
-            _Object$entries$_i$ = _Object$entries$_i[1],
-            _Object$entries$_i$$m = _Object$entries$_i$.mustExist,
-            mustExist = _Object$entries$_i$$m === void 0 ? false : _Object$entries$_i$$m,
-            _Object$entries$_i$$p = _Object$entries$_i$.preventDuplicates,
-            preventDuplicates = _Object$entries$_i$$p === void 0 ? false : _Object$entries$_i$$p,
-            _Object$entries$_i$$i = _Object$entries$_i$.initialCommentsOnly,
-            initialCommentsOnly = _Object$entries$_i$$i === void 0 ? false : _Object$entries$_i$$i;
-
-      const obj = utils.getPreferredTagNameObject({
-        tagName
-      });
-
-      if (obj && obj.blocked) {
-        utils.reportSettings(`\`settings.jsdoc.tagNamePreference\` cannot block @${obj.tagName} ` + 'for the `require-file-overview` rule');
-      } else {
-        const targetTagName = obj && obj.replacement || obj;
-
-        if (mustExist && !state.hasTag[tagName]) {
-          utils.reportSettings(`Missing @${targetTagName}`);
-        }
-
-        if (preventDuplicates && state.hasDuplicates[tagName]) {
-          utils.reportSettings(`Duplicate @${targetTagName}`);
-        }
-
-        if (initialCommentsOnly && state.hasNonCommentBeforeTag[tagName]) {
-          utils.reportSettings(`@${targetTagName} should be at the beginning of the file`);
-        }
-      }
-    }
-  },
-
-  iterateAllJsdocs: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        tags: {
-          patternProperties: {
-            '.*': {
-              additionalProperties: false,
-              properties: {
-                initialCommentsOnly: {
-                  type: 'boolean'
-                },
-                mustExist: {
-                  type: 'boolean'
-                },
-                preventDuplicates: {
-                  type: 'boolean'
-                }
-              },
-              type: 'object'
-            }
-          },
-          type: 'object'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  },
-
-  nonComment({
-    state,
-    node
-  }) {
-    if (!state.hasNonComment) {
-      state.hasNonComment = node.start;
-    }
-  }
-
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireFileOverview.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireFileOverview.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireFileOverview.js.map
deleted file mode 100644
index 4ad2057..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireFileOverview.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireFileOverview.js"],"names":["defaultTags","file","initialCommentsOnly","mustExist","preventDuplicates","setDefaults","state","globalTags","hasDuplicates","hasTag","hasNonCommentBeforeTag","jsdocNode","utils","context","options","tags","Object","keys","tagName","targetTagName","getPreferredTagName","hasDuplicate","hasNonComment","start","exit","entries","obj","getPreferredTagNameObject","blocked","reportSettings","replacement","iterateAllJsdocs","meta","schema","additionalProperties","properties","patternProperties","type","nonComment","node"],"mappings":"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","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nconst defaultTags = {\n  file: {\n    initialCommentsOnly: true,\n    mustExist: true,\n    preventDuplicates: true,\n  },\n};\n\nconst setDefaults = (state) => {\n  // First iteration\n  if (!state.globalTags) {\n    state.globalTags = {};\n    state.hasDuplicates = {};\n    state.hasTag = {};\n    state.hasNonCommentBeforeTag = {};\n  }\n};\n\nexport default iterateJsdoc(({\n  jsdocNode,\n  state,\n  utils,\n  context,\n}) => {\n  const {\n    tags = defaultTags,\n  } = context.options[0] || {};\n\n  setDefaults(state);\n\n  for (const tagName of Object.keys(tags)) {\n    const targetTagName = utils.getPreferredTagName({tagName});\n\n    const hasTag = targetTagName && utils.hasTag(targetTagName);\n\n    state.hasTag[tagName] = hasTag || state.hasTag[tagName];\n\n    const hasDuplicate = state.hasDuplicates[tagName];\n\n    if (hasDuplicate === false) {\n      // Was marked before, so if a tag now, is a dupe\n      state.hasDuplicates[tagName] = hasTag;\n    } else if (!hasDuplicate && hasTag) {\n      // No dupes set before, but has first tag, so change state\n      //   from `undefined` to `false` so can detect next time\n      state.hasDuplicates[tagName] = false;\n      state.hasNonCommentBeforeTag[tagName] = state.hasNonComment &&\n        state.hasNonComment < jsdocNode.start;\n    }\n  }\n}, {\n  exit ({context, state, utils}) {\n    setDefaults(state);\n    const {\n      tags = defaultTags,\n    } = context.options[0] || {};\n\n    for (const [tagName, {\n      mustExist = false,\n      preventDuplicates = false,\n      initialCommentsOnly = false,\n    }] of Object.entries(tags)) {\n      const obj = utils.getPreferredTagNameObject({tagName});\n      if (obj && obj.blocked) {\n        utils.reportSettings(\n          `\\`settings.jsdoc.tagNamePreference\\` cannot block @${obj.tagName} ` +\n          'for the `require-file-overview` rule',\n        );\n      } else {\n        const targetTagName = obj && obj.replacement || obj;\n        if (mustExist && !state.hasTag[tagName]) {\n          utils.reportSettings(`Missing @${targetTagName}`);\n        }\n        if (preventDuplicates && state.hasDuplicates[tagName]) {\n          utils.reportSettings(\n            `Duplicate @${targetTagName}`,\n          );\n        }\n        if (initialCommentsOnly &&\n            state.hasNonCommentBeforeTag[tagName]\n        ) {\n          utils.reportSettings(\n            `@${targetTagName} should be at the beginning of the file`,\n          );\n        }\n      }\n    }\n  },\n  iterateAllJsdocs: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          tags: {\n            patternProperties: {\n              '.*': {\n                additionalProperties: false,\n                properties: {\n                  initialCommentsOnly: {\n                    type: 'boolean',\n                  },\n                  mustExist: {\n                    type: 'boolean',\n                  },\n                  preventDuplicates: {\n                    type: 'boolean',\n                  },\n                },\n                type: 'object',\n              },\n            },\n            type: 'object',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n  nonComment ({state, node}) {\n    if (!state.hasNonComment) {\n      state.hasNonComment = node.start;\n    }\n  },\n});\n"],"file":"requireFileOverview.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireHyphenBeforeParamDescription.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireHyphenBeforeParamDescription.js
deleted file mode 100644
index b130813..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireHyphenBeforeParamDescription.js
+++ /dev/null
@@ -1,94 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
-
-function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  sourceCode,
-  utils,
-  report,
-  context,
-  jsdocNode
-}) => {
-  const _context$options = _slicedToArray(context.options, 2),
-        circumstance = _context$options[0],
-        _context$options$ = _context$options[1],
-        _context$options$2 = _context$options$ === void 0 ? {} : _context$options$,
-        checkProperties = _context$options$2.checkProperties;
-
-  const always = !circumstance || circumstance === 'always';
-
-  const checkHyphens = (jsdocTag, targetTagName) => {
-    if (!jsdocTag.description) {
-      return;
-    }
-
-    if (always) {
-      if (!jsdocTag.description.startsWith('-')) {
-        report(`There must be a hyphen before @${targetTagName} description.`, fixer => {
-          const lineIndex = jsdocTag.line;
-          const sourceLines = sourceCode.getText(jsdocNode).split('\n'); // Get start index of description, accounting for multi-line descriptions
-
-          const description = jsdocTag.description.split('\n')[0];
-          const descriptionIndex = sourceLines[lineIndex].lastIndexOf(description);
-          const replacementLine = sourceLines[lineIndex].slice(0, descriptionIndex) + '- ' + description;
-          sourceLines.splice(lineIndex, 1, replacementLine);
-          const replacement = sourceLines.join('\n');
-          return fixer.replaceText(jsdocNode, replacement);
-        }, jsdocTag);
-      }
-    } else if (jsdocTag.description.startsWith('-')) {
-      report(`There must be no hyphen before @${targetTagName} description.`, fixer => {
-        const _$exec = /-\s*/u.exec(jsdocTag.description),
-              _$exec2 = _slicedToArray(_$exec, 1),
-              unwantedPart = _$exec2[0];
-
-        const replacement = sourceCode.getText(jsdocNode).replace(jsdocTag.description, jsdocTag.description.slice(unwantedPart.length));
-        return fixer.replaceText(jsdocNode, replacement);
-      }, jsdocTag);
-    }
-  };
-
-  utils.forEachPreferredTag('param', checkHyphens);
-
-  if (checkProperties) {
-    utils.forEachPreferredTag('property', checkHyphens);
-  }
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    fixable: 'code',
-    schema: [{
-      enum: ['always', 'never'],
-      type: 'string'
-    }, {
-      additionalProperties: false,
-      properties: {
-        checkProperties: {
-          default: false,
-          type: 'boolean'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'layout'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireHyphenBeforeParamDescription.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireHyphenBeforeParamDescription.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireHyphenBeforeParamDescription.js.map
deleted file mode 100644
index d489759..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireHyphenBeforeParamDescription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireHyphenBeforeParamDescription.js"],"names":["sourceCode","utils","report","context","jsdocNode","options","circumstance","checkProperties","always","checkHyphens","jsdocTag","targetTagName","description","startsWith","fixer","lineIndex","line","sourceLines","getText","split","descriptionIndex","lastIndexOf","replacementLine","slice","splice","replacement","join","replaceText","exec","unwantedPart","replace","length","forEachPreferredTag","iterateAllJsdocs","meta","fixable","schema","enum","type","additionalProperties","properties","default"],"mappings":"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","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  sourceCode,\n  utils,\n  report,\n  context,\n  jsdocNode,\n}) => {\n  const [circumstance, {checkProperties} = {}] = context.options;\n  const always = !circumstance || circumstance === 'always';\n\n  const checkHyphens = (jsdocTag, targetTagName) => {\n    if (!jsdocTag.description) {\n      return;\n    }\n\n    if (always) {\n      if (!jsdocTag.description.startsWith('-')) {\n        report(`There must be a hyphen before @${targetTagName} description.`, (fixer) => {\n          const lineIndex = jsdocTag.line;\n          const sourceLines = sourceCode.getText(jsdocNode).split('\\n');\n\n          // Get start index of description, accounting for multi-line descriptions\n          const description = jsdocTag.description.split('\\n')[0];\n          const descriptionIndex = sourceLines[lineIndex].lastIndexOf(description);\n\n          const replacementLine = sourceLines[lineIndex]\n            .slice(0, descriptionIndex) + '- ' + description;\n          sourceLines.splice(lineIndex, 1, replacementLine);\n          const replacement = sourceLines.join('\\n');\n\n          return fixer.replaceText(jsdocNode, replacement);\n        }, jsdocTag);\n      }\n    } else if (jsdocTag.description.startsWith('-')) {\n      report(`There must be no hyphen before @${targetTagName} description.`, (fixer) => {\n        const [unwantedPart] = /-\\s*/u.exec(jsdocTag.description);\n\n        const replacement = sourceCode\n          .getText(jsdocNode)\n          .replace(jsdocTag.description, jsdocTag.description.slice(unwantedPart.length));\n\n        return fixer.replaceText(jsdocNode, replacement);\n      }, jsdocTag);\n    }\n  };\n\n  utils.forEachPreferredTag('param', checkHyphens);\n  if (checkProperties) {\n    utils.forEachPreferredTag('property', checkHyphens);\n  }\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    fixable: 'code',\n    schema: [\n      {\n        enum: ['always', 'never'],\n        type: 'string',\n      },\n      {\n        additionalProperties: false,\n        properties: {\n          checkProperties: {\n            default: false,\n            type: 'boolean',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'layout',\n  },\n});\n"],"file":"requireHyphenBeforeParamDescription.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireJsdoc.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireJsdoc.js
deleted file mode 100644
index 6b2ff26..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireJsdoc.js
+++ /dev/null
@@ -1,271 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _lodash = _interopRequireDefault(require("lodash"));
-
-var _jsdocUtils = _interopRequireDefault(require("../jsdocUtils"));
-
-var _exportParser = _interopRequireDefault(require("../exportParser"));
-
-var _getJSDocComment = _interopRequireDefault(require("../eslint/getJSDocComment"));
-
-var _warnRemovedSettings = _interopRequireDefault(require("../warnRemovedSettings"));
-
-var _iterateJsdoc = require("../iterateJsdoc");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const OPTIONS_SCHEMA = {
-  additionalProperties: false,
-  properties: {
-    contexts: {
-      items: {
-        type: 'string'
-      },
-      type: 'array'
-    },
-    exemptEmptyFunctions: {
-      default: false,
-      type: 'boolean'
-    },
-    publicOnly: {
-      oneOf: [{
-        default: false,
-        type: 'boolean'
-      }, {
-        additionalProperties: false,
-        default: {},
-        properties: {
-          ancestorsOnly: {
-            type: 'boolean'
-          },
-          cjs: {
-            type: 'boolean'
-          },
-          esm: {
-            type: 'boolean'
-          },
-          window: {
-            type: 'boolean'
-          }
-        },
-        type: 'object'
-      }]
-    },
-    require: {
-      additionalProperties: false,
-      default: {},
-      properties: {
-        ArrowFunctionExpression: {
-          default: false,
-          type: 'boolean'
-        },
-        ClassDeclaration: {
-          default: false,
-          type: 'boolean'
-        },
-        ClassExpression: {
-          default: false,
-          type: 'boolean'
-        },
-        FunctionDeclaration: {
-          default: true,
-          type: 'boolean'
-        },
-        FunctionExpression: {
-          default: false,
-          type: 'boolean'
-        },
-        MethodDefinition: {
-          default: false,
-          type: 'boolean'
-        }
-      },
-      type: 'object'
-    }
-  },
-  type: 'object'
-};
-
-const getOption = (context, baseObject, option, key) => {
-  if (!_lodash.default.has(context, `options[0][${option}][${key}]`)) {
-    return baseObject.properties[key].default;
-  }
-
-  return context.options[0][option][key];
-};
-
-const getOptions = context => {
-  return {
-    exemptEmptyFunctions: context.options[0] ? context.options[0].exemptEmptyFunctions : false,
-    publicOnly: (baseObj => {
-      const publicOnly = _lodash.default.get(context, 'options[0].publicOnly');
-
-      if (!publicOnly) {
-        return false;
-      }
-
-      return Object.keys(baseObj.properties).reduce((obj, prop) => {
-        const opt = getOption(context, baseObj, 'publicOnly', prop);
-        obj[prop] = opt;
-        return obj;
-      }, {});
-    })(OPTIONS_SCHEMA.properties.publicOnly.oneOf[1]),
-    require: (baseObj => {
-      return Object.keys(baseObj.properties).reduce((obj, prop) => {
-        const opt = getOption(context, baseObj, 'require', prop);
-        obj[prop] = opt;
-        return obj;
-      }, {});
-    })(OPTIONS_SCHEMA.properties.require)
-  };
-};
-
-var _default = {
-  create(context) {
-    (0, _warnRemovedSettings.default)(context, 'require-jsdoc');
-    const sourceCode = context.getSourceCode();
-    const settings = (0, _iterateJsdoc.getSettings)(context);
-
-    const _getOptions = getOptions(context),
-          requireOption = _getOptions.require,
-          publicOnly = _getOptions.publicOnly,
-          exemptEmptyFunctions = _getOptions.exemptEmptyFunctions;
-
-    const checkJsDoc = node => {
-      const jsDocNode = (0, _getJSDocComment.default)(sourceCode, node, settings);
-
-      if (jsDocNode) {
-        return;
-      }
-
-      if (exemptEmptyFunctions) {
-        const functionParameterNames = _jsdocUtils.default.getFunctionParameterNames(node);
-
-        if (!functionParameterNames.length && !_jsdocUtils.default.hasReturnValue(node, context)) {
-          return;
-        }
-      }
-
-      const fix = fixer => {
-        // Default to one line break if the `minLines`/`maxLines` settings allow
-        const lines = settings.minLines === 0 && settings.maxLines >= 1 ? 1 : settings.minLines;
-
-        const indent = _jsdocUtils.default.getIndent(sourceCode);
-
-        const insertion = `/**\n${indent}*\n${indent}*/${'\n'.repeat(lines)}${indent.slice(0, -1)}`;
-        const baseNode = ['ExportDefaultDeclaration', 'ExportNamedDeclaration'].includes(node.parent && node.parent.type) ? node.parent : node;
-        return fixer.insertTextBefore(baseNode, insertion);
-      };
-
-      const report = () => {
-        const loc = {
-          end: node.loc.start + 1,
-          start: node.loc.start
-        };
-        context.report({
-          fix,
-          loc,
-          messageId: 'missingJsDoc',
-          node
-        });
-      };
-
-      if (publicOnly) {
-        const opt = {
-          ancestorsOnly: Boolean(_lodash.default.get(publicOnly, 'ancestorsOnly', false)),
-          esm: Boolean(_lodash.default.get(publicOnly, 'esm', true)),
-          initModuleExports: Boolean(_lodash.default.get(publicOnly, 'cjs', true)),
-          initWindow: Boolean(_lodash.default.get(publicOnly, 'window', false))
-        };
-
-        const parseResult = _exportParser.default.parse(sourceCode.ast, node, opt);
-
-        const exported = _exportParser.default.isExported(node, parseResult, opt);
-
-        if (exported) {
-          report();
-        }
-      } else {
-        report();
-      }
-    }; // eslint-disable-next-line fp/no-mutating-assign
-
-
-    return Object.assign(_jsdocUtils.default.getContextObject(_jsdocUtils.default.enforcedContexts(context, []), checkJsDoc), {
-      ArrowFunctionExpression(node) {
-        if (!requireOption.ArrowFunctionExpression) {
-          return;
-        }
-
-        if (!['VariableDeclarator', 'ExportDefaultDeclaration'].includes(node.parent.type)) {
-          return;
-        }
-
-        checkJsDoc(node);
-      },
-
-      ClassDeclaration(node) {
-        if (!requireOption.ClassDeclaration) {
-          return;
-        }
-
-        checkJsDoc(node);
-      },
-
-      ClassExpression(node) {
-        if (!requireOption.ClassExpression) {
-          return;
-        }
-
-        checkJsDoc(node);
-      },
-
-      FunctionDeclaration(node) {
-        if (!requireOption.FunctionDeclaration) {
-          return;
-        }
-
-        checkJsDoc(node);
-      },
-
-      FunctionExpression(node) {
-        if (requireOption.MethodDefinition && node.parent.type === 'MethodDefinition') {
-          checkJsDoc(node);
-          return;
-        }
-
-        if (!requireOption.FunctionExpression) {
-          return;
-        }
-
-        if (['VariableDeclarator', 'AssignmentExpression', 'ExportDefaultDeclaration'].includes(node.parent.type) || node.parent.type === 'Property' && node === node.parent.value) {
-          checkJsDoc(node);
-        }
-      }
-
-    });
-  },
-
-  meta: {
-    doc: {
-      category: 'Stylistic Issues',
-      description: 'Require JSDoc comments',
-      recommended: 'true',
-      url: 'https://github.com/gajus/eslint-plugin-jsdoc'
-    },
-    fixable: 'code',
-    messages: {
-      missingJsDoc: 'Missing JSDoc comment.'
-    },
-    schema: [OPTIONS_SCHEMA],
-    type: 'suggestion'
-  }
-};
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireJsdoc.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireJsdoc.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireJsdoc.js.map
deleted file mode 100644
index 9732bb7..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireJsdoc.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireJsdoc.js"],"names":["OPTIONS_SCHEMA","additionalProperties","properties","contexts","items","type","exemptEmptyFunctions","default","publicOnly","oneOf","ancestorsOnly","cjs","esm","window","require","ArrowFunctionExpression","ClassDeclaration","ClassExpression","FunctionDeclaration","FunctionExpression","MethodDefinition","getOption","context","baseObject","option","key","_","has","options","getOptions","baseObj","get","Object","keys","reduce","obj","prop","opt","create","sourceCode","getSourceCode","settings","requireOption","checkJsDoc","node","jsDocNode","functionParameterNames","jsdocUtils","getFunctionParameterNames","length","hasReturnValue","fix","fixer","lines","minLines","maxLines","indent","getIndent","insertion","repeat","slice","baseNode","includes","parent","insertTextBefore","report","loc","end","start","messageId","Boolean","initModuleExports","initWindow","parseResult","exportParser","parse","ast","exported","isExported","assign","getContextObject","enforcedContexts","value","meta","doc","category","description","recommended","url","fixable","messages","missingJsDoc","schema"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAEA,MAAMA,cAAc,GAAG;AACrBC,EAAAA,oBAAoB,EAAE,KADD;AAErBC,EAAAA,UAAU,EAAE;AACVC,IAAAA,QAAQ,EAAE;AACRC,MAAAA,KAAK,EAAE;AACLC,QAAAA,IAAI,EAAE;AADD,OADC;AAIRA,MAAAA,IAAI,EAAE;AAJE,KADA;AAOVC,IAAAA,oBAAoB,EAAE;AACpBC,MAAAA,OAAO,EAAE,KADW;AAEpBF,MAAAA,IAAI,EAAE;AAFc,KAPZ;AAWVG,IAAAA,UAAU,EAAE;AACVC,MAAAA,KAAK,EAAE,CACL;AACEF,QAAAA,OAAO,EAAE,KADX;AAEEF,QAAAA,IAAI,EAAE;AAFR,OADK,EAKL;AACEJ,QAAAA,oBAAoB,EAAE,KADxB;AAEEM,QAAAA,OAAO,EAAE,EAFX;AAGEL,QAAAA,UAAU,EAAE;AACVQ,UAAAA,aAAa,EAAE;AACbL,YAAAA,IAAI,EAAE;AADO,WADL;AAIVM,UAAAA,GAAG,EAAE;AACHN,YAAAA,IAAI,EAAE;AADH,WAJK;AAOVO,UAAAA,GAAG,EAAE;AACHP,YAAAA,IAAI,EAAE;AADH,WAPK;AAUVQ,UAAAA,MAAM,EAAE;AACNR,YAAAA,IAAI,EAAE;AADA;AAVE,SAHd;AAiBEA,QAAAA,IAAI,EAAE;AAjBR,OALK;AADG,KAXF;AAsCVS,IAAAA,OAAO,EAAE;AACPb,MAAAA,oBAAoB,EAAE,KADf;AAEPM,MAAAA,OAAO,EAAE,EAFF;AAGPL,MAAAA,UAAU,EAAE;AACVa,QAAAA,uBAAuB,EAAE;AACvBR,UAAAA,OAAO,EAAE,KADc;AAEvBF,UAAAA,IAAI,EAAE;AAFiB,SADf;AAKVW,QAAAA,gBAAgB,EAAE;AAChBT,UAAAA,OAAO,EAAE,KADO;AAEhBF,UAAAA,IAAI,EAAE;AAFU,SALR;AASVY,QAAAA,eAAe,EAAE;AACfV,UAAAA,OAAO,EAAE,KADM;AAEfF,UAAAA,IAAI,EAAE;AAFS,SATP;AAaVa,QAAAA,mBAAmB,EAAE;AACnBX,UAAAA,OAAO,EAAE,IADU;AAEnBF,UAAAA,IAAI,EAAE;AAFa,SAbX;AAiBVc,QAAAA,kBAAkB,EAAE;AAClBZ,UAAAA,OAAO,EAAE,KADS;AAElBF,UAAAA,IAAI,EAAE;AAFY,SAjBV;AAqBVe,QAAAA,gBAAgB,EAAE;AAChBb,UAAAA,OAAO,EAAE,KADO;AAEhBF,UAAAA,IAAI,EAAE;AAFU;AArBR,OAHL;AA6BPA,MAAAA,IAAI,EAAE;AA7BC;AAtCC,GAFS;AAwErBA,EAAAA,IAAI,EAAE;AAxEe,CAAvB;;AA2EA,MAAMgB,SAAS,GAAG,CAACC,OAAD,EAAUC,UAAV,EAAsBC,MAAtB,EAA8BC,GAA9B,KAAsC;AACtD,MAAI,CAACC,gBAAEC,GAAF,CAAML,OAAN,EAAgB,cAAaE,MAAO,KAAIC,GAAI,GAA5C,CAAL,EAAsD;AACpD,WAAOF,UAAU,CAACrB,UAAX,CAAsBuB,GAAtB,EAA2BlB,OAAlC;AACD;;AAED,SAAOe,OAAO,CAACM,OAAR,CAAgB,CAAhB,EAAmBJ,MAAnB,EAA2BC,GAA3B,CAAP;AACD,CAND;;AAQA,MAAMI,UAAU,GAAIP,OAAD,IAAa;AAC9B,SAAO;AACLhB,IAAAA,oBAAoB,EAAEgB,OAAO,CAACM,OAAR,CAAgB,CAAhB,IAAqBN,OAAO,CAACM,OAAR,CAAgB,CAAhB,EAAmBtB,oBAAxC,GAA+D,KADhF;AAELE,IAAAA,UAAU,EAAE,CAAEsB,OAAD,IAAa;AACxB,YAAMtB,UAAU,GAAGkB,gBAAEK,GAAF,CAAMT,OAAN,EAAe,uBAAf,CAAnB;;AACA,UAAI,CAACd,UAAL,EAAiB;AACf,eAAO,KAAP;AACD;;AAED,aAAOwB,MAAM,CAACC,IAAP,CAAYH,OAAO,CAAC5B,UAApB,EAAgCgC,MAAhC,CAAuC,CAACC,GAAD,EAAMC,IAAN,KAAe;AAC3D,cAAMC,GAAG,GAAGhB,SAAS,CAACC,OAAD,EAAUQ,OAAV,EAAmB,YAAnB,EAAiCM,IAAjC,CAArB;AACAD,QAAAA,GAAG,CAACC,IAAD,CAAH,GAAYC,GAAZ;AAEA,eAAOF,GAAP;AACD,OALM,EAKJ,EALI,CAAP;AAMD,KAZW,EAYTnC,cAAc,CAACE,UAAf,CAA0BM,UAA1B,CAAqCC,KAArC,CAA2C,CAA3C,CAZS,CAFP;AAeLK,IAAAA,OAAO,EAAE,CAAEgB,OAAD,IAAa;AACrB,aAAOE,MAAM,CAACC,IAAP,CAAYH,OAAO,CAAC5B,UAApB,EAAgCgC,MAAhC,CAAuC,CAACC,GAAD,EAAMC,IAAN,KAAe;AAC3D,cAAMC,GAAG,GAAGhB,SAAS,CAACC,OAAD,EAAUQ,OAAV,EAAmB,SAAnB,EAA8BM,IAA9B,CAArB;AACAD,QAAAA,GAAG,CAACC,IAAD,CAAH,GAAYC,GAAZ;AAEA,eAAOF,GAAP;AACD,OALM,EAKJ,EALI,CAAP;AAMD,KAPQ,EAONnC,cAAc,CAACE,UAAf,CAA0BY,OAPpB;AAfJ,GAAP;AAwBD,CAzBD;;eA2Be;AACbwB,EAAAA,MAAM,CAAEhB,OAAF,EAAW;AACf,sCAAoBA,OAApB,EAA6B,eAA7B;AAEA,UAAMiB,UAAU,GAAGjB,OAAO,CAACkB,aAAR,EAAnB;AACA,UAAMC,QAAQ,GAAG,+BAAYnB,OAAZ,CAAjB;;AAJe,wBAMoDO,UAAU,CAACP,OAAD,CAN9D;AAAA,UAMCoB,aAND,eAMR5B,OANQ;AAAA,UAMgBN,UANhB,eAMgBA,UANhB;AAAA,UAM4BF,oBAN5B,eAM4BA,oBAN5B;;AAQf,UAAMqC,UAAU,GAAIC,IAAD,IAAU;AAC3B,YAAMC,SAAS,GAAG,8BAAgBN,UAAhB,EAA4BK,IAA5B,EAAkCH,QAAlC,CAAlB;;AAEA,UAAII,SAAJ,EAAe;AACb;AACD;;AAED,UAAIvC,oBAAJ,EAA0B;AACxB,cAAMwC,sBAAsB,GAAGC,oBAAWC,yBAAX,CAAqCJ,IAArC,CAA/B;;AACA,YAAI,CAACE,sBAAsB,CAACG,MAAxB,IAAkC,CAACF,oBAAWG,cAAX,CAA0BN,IAA1B,EAAgCtB,OAAhC,CAAvC,EAAiF;AAC/E;AACD;AACF;;AAED,YAAM6B,GAAG,GAAIC,KAAD,IAAW;AACrB;AACA,cAAMC,KAAK,GAAGZ,QAAQ,CAACa,QAAT,KAAsB,CAAtB,IAA2Bb,QAAQ,CAACc,QAAT,IAAqB,CAAhD,GAAoD,CAApD,GAAwDd,QAAQ,CAACa,QAA/E;;AACA,cAAME,MAAM,GAAGT,oBAAWU,SAAX,CAAqBlB,UAArB,CAAf;;AACA,cAAMmB,SAAS,GAAI,QAAOF,MAAO,MAAKA,MAAO,KAAI,KAAKG,MAAL,CAAYN,KAAZ,CAAmB,GAAEG,MAAM,CAACI,KAAP,CAAa,CAAb,EAAgB,CAAC,CAAjB,CAAoB,EAA1F;AACA,cAAMC,QAAQ,GAAG,CACf,0BADe,EACa,wBADb,EAEfC,QAFe,CAENlB,IAAI,CAACmB,MAAL,IAAenB,IAAI,CAACmB,MAAL,CAAY1D,IAFrB,IAE6BuC,IAAI,CAACmB,MAFlC,GAE2CnB,IAF5D;AAIA,eAAOQ,KAAK,CAACY,gBAAN,CAAuBH,QAAvB,EAAiCH,SAAjC,CAAP;AACD,OAVD;;AAYA,YAAMO,MAAM,GAAG,MAAM;AACnB,cAAMC,GAAG,GAAG;AACVC,UAAAA,GAAG,EAAEvB,IAAI,CAACsB,GAAL,CAASE,KAAT,GAAiB,CADZ;AAEVA,UAAAA,KAAK,EAAExB,IAAI,CAACsB,GAAL,CAASE;AAFN,SAAZ;AAIA9C,QAAAA,OAAO,CAAC2C,MAAR,CAAe;AACbd,UAAAA,GADa;AAEbe,UAAAA,GAFa;AAGbG,UAAAA,SAAS,EAAE,cAHE;AAIbzB,UAAAA;AAJa,SAAf;AAMD,OAXD;;AAaA,UAAIpC,UAAJ,EAAgB;AACd,cAAM6B,GAAG,GAAG;AACV3B,UAAAA,aAAa,EAAE4D,OAAO,CAAC5C,gBAAEK,GAAF,CAAMvB,UAAN,EAAkB,eAAlB,EAAmC,KAAnC,CAAD,CADZ;AAEVI,UAAAA,GAAG,EAAE0D,OAAO,CAAC5C,gBAAEK,GAAF,CAAMvB,UAAN,EAAkB,KAAlB,EAAyB,IAAzB,CAAD,CAFF;AAGV+D,UAAAA,iBAAiB,EAAED,OAAO,CAAC5C,gBAAEK,GAAF,CAAMvB,UAAN,EAAkB,KAAlB,EAAyB,IAAzB,CAAD,CAHhB;AAIVgE,UAAAA,UAAU,EAAEF,OAAO,CAAC5C,gBAAEK,GAAF,CAAMvB,UAAN,EAAkB,QAAlB,EAA4B,KAA5B,CAAD;AAJT,SAAZ;;AAMA,cAAMiE,WAAW,GAAGC,sBAAaC,KAAb,CAAmBpC,UAAU,CAACqC,GAA9B,EAAmChC,IAAnC,EAAyCP,GAAzC,CAApB;;AACA,cAAMwC,QAAQ,GAAGH,sBAAaI,UAAb,CAAwBlC,IAAxB,EAA8B6B,WAA9B,EAA2CpC,GAA3C,CAAjB;;AAEA,YAAIwC,QAAJ,EAAc;AACZZ,UAAAA,MAAM;AACP;AACF,OAbD,MAaO;AACLA,QAAAA,MAAM;AACP;AACF,KAvDD,CARe,CAiEf;;;AACA,WAAOjC,MAAM,CAAC+C,MAAP,CACLhC,oBAAWiC,gBAAX,CAA4BjC,oBAAWkC,gBAAX,CAA4B3D,OAA5B,EAAqC,EAArC,CAA5B,EAAsEqB,UAAtE,CADK,EAEL;AACE5B,MAAAA,uBAAuB,CAAE6B,IAAF,EAAQ;AAC7B,YAAI,CAACF,aAAa,CAAC3B,uBAAnB,EAA4C;AAC1C;AACD;;AAED,YAAI,CAAC,CAAC,oBAAD,EAAuB,0BAAvB,EAAmD+C,QAAnD,CAA4DlB,IAAI,CAACmB,MAAL,CAAY1D,IAAxE,CAAL,EAAoF;AAClF;AACD;;AAEDsC,QAAAA,UAAU,CAACC,IAAD,CAAV;AACD,OAXH;;AAaE5B,MAAAA,gBAAgB,CAAE4B,IAAF,EAAQ;AACtB,YAAI,CAACF,aAAa,CAAC1B,gBAAnB,EAAqC;AACnC;AACD;;AAED2B,QAAAA,UAAU,CAACC,IAAD,CAAV;AACD,OAnBH;;AAqBE3B,MAAAA,eAAe,CAAE2B,IAAF,EAAQ;AACrB,YAAI,CAACF,aAAa,CAACzB,eAAnB,EAAoC;AAClC;AACD;;AAED0B,QAAAA,UAAU,CAACC,IAAD,CAAV;AACD,OA3BH;;AA6BE1B,MAAAA,mBAAmB,CAAE0B,IAAF,EAAQ;AACzB,YAAI,CAACF,aAAa,CAACxB,mBAAnB,EAAwC;AACtC;AACD;;AAEDyB,QAAAA,UAAU,CAACC,IAAD,CAAV;AACD,OAnCH;;AAqCEzB,MAAAA,kBAAkB,CAAEyB,IAAF,EAAQ;AACxB,YAAIF,aAAa,CAACtB,gBAAd,IAAkCwB,IAAI,CAACmB,MAAL,CAAY1D,IAAZ,KAAqB,kBAA3D,EAA+E;AAC7EsC,UAAAA,UAAU,CAACC,IAAD,CAAV;AAEA;AACD;;AAED,YAAI,CAACF,aAAa,CAACvB,kBAAnB,EAAuC;AACrC;AACD;;AAED,YACE,CAAC,oBAAD,EAAuB,sBAAvB,EAA+C,0BAA/C,EAA2E2C,QAA3E,CAAoFlB,IAAI,CAACmB,MAAL,CAAY1D,IAAhG,KACAuC,IAAI,CAACmB,MAAL,CAAY1D,IAAZ,KAAqB,UAArB,IAAmCuC,IAAI,KAAKA,IAAI,CAACmB,MAAL,CAAYmB,KAF1D,EAGE;AACAvC,UAAAA,UAAU,CAACC,IAAD,CAAV;AACD;AACF;;AAtDH,KAFK,CAAP;AA2DD,GA9HY;;AA+HbuC,EAAAA,IAAI,EAAE;AACJC,IAAAA,GAAG,EAAE;AACHC,MAAAA,QAAQ,EAAE,kBADP;AAEHC,MAAAA,WAAW,EAAE,wBAFV;AAGHC,MAAAA,WAAW,EAAE,MAHV;AAIHC,MAAAA,GAAG,EAAE;AAJF,KADD;AAQJC,IAAAA,OAAO,EAAE,MARL;AAUJC,IAAAA,QAAQ,EAAE;AACRC,MAAAA,YAAY,EAAE;AADN,KAVN;AAcJC,IAAAA,MAAM,EAAE,CACN5F,cADM,CAdJ;AAkBJK,IAAAA,IAAI,EAAE;AAlBF;AA/HO,C","sourcesContent":["import _ from 'lodash';\nimport jsdocUtils from '../jsdocUtils';\nimport exportParser from '../exportParser';\nimport getJSDocComment from '../eslint/getJSDocComment';\nimport warnRemovedSettings from '../warnRemovedSettings';\nimport {getSettings} from '../iterateJsdoc';\n\nconst OPTIONS_SCHEMA = {\n  additionalProperties: false,\n  properties: {\n    contexts: {\n      items: {\n        type: 'string',\n      },\n      type: 'array',\n    },\n    exemptEmptyFunctions: {\n      default: false,\n      type: 'boolean',\n    },\n    publicOnly: {\n      oneOf: [\n        {\n          default: false,\n          type: 'boolean',\n        },\n        {\n          additionalProperties: false,\n          default: {},\n          properties: {\n            ancestorsOnly: {\n              type: 'boolean',\n            },\n            cjs: {\n              type: 'boolean',\n            },\n            esm: {\n              type: 'boolean',\n            },\n            window: {\n              type: 'boolean',\n            },\n          },\n          type: 'object',\n        },\n      ],\n    },\n    require: {\n      additionalProperties: false,\n      default: {},\n      properties: {\n        ArrowFunctionExpression: {\n          default: false,\n          type: 'boolean',\n        },\n        ClassDeclaration: {\n          default: false,\n          type: 'boolean',\n        },\n        ClassExpression: {\n          default: false,\n          type: 'boolean',\n        },\n        FunctionDeclaration: {\n          default: true,\n          type: 'boolean',\n        },\n        FunctionExpression: {\n          default: false,\n          type: 'boolean',\n        },\n        MethodDefinition: {\n          default: false,\n          type: 'boolean',\n        },\n      },\n      type: 'object',\n    },\n  },\n  type: 'object',\n};\n\nconst getOption = (context, baseObject, option, key) => {\n  if (!_.has(context, `options[0][${option}][${key}]`)) {\n    return baseObject.properties[key].default;\n  }\n\n  return context.options[0][option][key];\n};\n\nconst getOptions = (context) => {\n  return {\n    exemptEmptyFunctions: context.options[0] ? context.options[0].exemptEmptyFunctions : false,\n    publicOnly: ((baseObj) => {\n      const publicOnly = _.get(context, 'options[0].publicOnly');\n      if (!publicOnly) {\n        return false;\n      }\n\n      return Object.keys(baseObj.properties).reduce((obj, prop) => {\n        const opt = getOption(context, baseObj, 'publicOnly', prop);\n        obj[prop] = opt;\n\n        return obj;\n      }, {});\n    })(OPTIONS_SCHEMA.properties.publicOnly.oneOf[1]),\n    require: ((baseObj) => {\n      return Object.keys(baseObj.properties).reduce((obj, prop) => {\n        const opt = getOption(context, baseObj, 'require', prop);\n        obj[prop] = opt;\n\n        return obj;\n      }, {});\n    })(OPTIONS_SCHEMA.properties.require),\n  };\n};\n\nexport default {\n  create (context) {\n    warnRemovedSettings(context, 'require-jsdoc');\n\n    const sourceCode = context.getSourceCode();\n    const settings = getSettings(context);\n\n    const {require: requireOption, publicOnly, exemptEmptyFunctions} = getOptions(context);\n\n    const checkJsDoc = (node) => {\n      const jsDocNode = getJSDocComment(sourceCode, node, settings);\n\n      if (jsDocNode) {\n        return;\n      }\n\n      if (exemptEmptyFunctions) {\n        const functionParameterNames = jsdocUtils.getFunctionParameterNames(node);\n        if (!functionParameterNames.length && !jsdocUtils.hasReturnValue(node, context)) {\n          return;\n        }\n      }\n\n      const fix = (fixer) => {\n        // Default to one line break if the `minLines`/`maxLines` settings allow\n        const lines = settings.minLines === 0 && settings.maxLines >= 1 ? 1 : settings.minLines;\n        const indent = jsdocUtils.getIndent(sourceCode);\n        const insertion = `/**\\n${indent}*\\n${indent}*/${'\\n'.repeat(lines)}${indent.slice(0, -1)}`;\n        const baseNode = [\n          'ExportDefaultDeclaration', 'ExportNamedDeclaration',\n        ].includes(node.parent && node.parent.type) ? node.parent : node;\n\n        return fixer.insertTextBefore(baseNode, insertion);\n      };\n\n      const report = () => {\n        const loc = {\n          end: node.loc.start + 1,\n          start: node.loc.start,\n        };\n        context.report({\n          fix,\n          loc,\n          messageId: 'missingJsDoc',\n          node,\n        });\n      };\n\n      if (publicOnly) {\n        const opt = {\n          ancestorsOnly: Boolean(_.get(publicOnly, 'ancestorsOnly', false)),\n          esm: Boolean(_.get(publicOnly, 'esm', true)),\n          initModuleExports: Boolean(_.get(publicOnly, 'cjs', true)),\n          initWindow: Boolean(_.get(publicOnly, 'window', false)),\n        };\n        const parseResult = exportParser.parse(sourceCode.ast, node, opt);\n        const exported = exportParser.isExported(node, parseResult, opt);\n\n        if (exported) {\n          report();\n        }\n      } else {\n        report();\n      }\n    };\n\n    // eslint-disable-next-line fp/no-mutating-assign\n    return Object.assign(\n      jsdocUtils.getContextObject(jsdocUtils.enforcedContexts(context, []), checkJsDoc),\n      {\n        ArrowFunctionExpression (node) {\n          if (!requireOption.ArrowFunctionExpression) {\n            return;\n          }\n\n          if (!['VariableDeclarator', 'ExportDefaultDeclaration'].includes(node.parent.type)) {\n            return;\n          }\n\n          checkJsDoc(node);\n        },\n\n        ClassDeclaration (node) {\n          if (!requireOption.ClassDeclaration) {\n            return;\n          }\n\n          checkJsDoc(node);\n        },\n\n        ClassExpression (node) {\n          if (!requireOption.ClassExpression) {\n            return;\n          }\n\n          checkJsDoc(node);\n        },\n\n        FunctionDeclaration (node) {\n          if (!requireOption.FunctionDeclaration) {\n            return;\n          }\n\n          checkJsDoc(node);\n        },\n\n        FunctionExpression (node) {\n          if (requireOption.MethodDefinition && node.parent.type === 'MethodDefinition') {\n            checkJsDoc(node);\n\n            return;\n          }\n\n          if (!requireOption.FunctionExpression) {\n            return;\n          }\n\n          if (\n            ['VariableDeclarator', 'AssignmentExpression', 'ExportDefaultDeclaration'].includes(node.parent.type) ||\n            node.parent.type === 'Property' && node === node.parent.value\n          ) {\n            checkJsDoc(node);\n          }\n        },\n      },\n    );\n  },\n  meta: {\n    doc: {\n      category: 'Stylistic Issues',\n      description: 'Require JSDoc comments',\n      recommended: 'true',\n      url: 'https://github.com/gajus/eslint-plugin-jsdoc',\n    },\n\n    fixable: 'code',\n\n    messages: {\n      missingJsDoc: 'Missing JSDoc comment.',\n    },\n\n    schema: [\n      OPTIONS_SCHEMA,\n    ],\n\n    type: 'suggestion',\n  },\n};\n"],"file":"requireJsdoc.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParam.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireParam.js
deleted file mode 100644
index 6fcf85d..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParam.js
+++ /dev/null
@@ -1,120 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  jsdoc,
-  utils
-}) => {
-  const functionParameterNames = utils.getFunctionParameterNames();
-  const jsdocParameterNames = utils.getJsdocTags('param');
-
-  if (!jsdocParameterNames) {
-    return;
-  }
-
-  if (utils.avoidDocs()) {
-    return;
-  } // Param type is specified by type in @type
-
-
-  if (utils.hasTag('type')) {
-    return;
-  }
-
-  const preferredTagName = utils.getPreferredTagName({
-    tagName: 'param'
-  });
-
-  const findExpectedIndex = (jsdocTags, indexAtFunctionParams) => {
-    const functionTags = jsdocTags.filter(({
-      tag
-    }) => {
-      return tag === preferredTagName;
-    });
-    let expectedIndex = jsdocTags.length;
-    jsdocTags.forEach((tag, index) => {
-      if (tag.tag === preferredTagName) {
-        expectedIndex = index;
-
-        if (functionTags.indexOf(tag) < indexAtFunctionParams) {
-          expectedIndex += 1;
-        }
-      }
-    });
-    return expectedIndex;
-  };
-
-  const missingTags = [];
-  functionParameterNames.forEach((functionParameterName, functionParameterIdx) => {
-    if (['<ObjectPattern>', '<ArrayPattern>'].includes(functionParameterName)) {
-      return;
-    }
-
-    if (jsdocParameterNames && !jsdocParameterNames.find(({
-      name
-    }) => {
-      return name === functionParameterName;
-    })) {
-      missingTags.push({
-        functionParameterIdx,
-        functionParameterName
-      });
-    }
-  });
-
-  const fixAll = (missings, tags) => {
-    missings.forEach(({
-      functionParameterIdx,
-      functionParameterName
-    }) => {
-      const expectedIdx = findExpectedIndex(tags, functionParameterIdx);
-      tags.splice(expectedIdx, 0, {
-        name: functionParameterName,
-        tag: preferredTagName
-      });
-    });
-  };
-
-  missingTags.forEach(({
-    functionParameterName
-  }, index) => {
-    // Fix all missing tags the first time.
-    const fixer = index > 0 ? null : () => {
-      if (!jsdoc.tags) {
-        jsdoc.tags = [];
-      }
-
-      fixAll(missingTags, jsdoc.tags);
-    };
-    utils.reportJSDoc(`Missing JSDoc @${preferredTagName} "${functionParameterName}" declaration.`, null, fixer);
-  });
-}, {
-  meta: {
-    fixable: 'code',
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        exemptedBy: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireParam.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParam.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireParam.js.map
deleted file mode 100644
index 5af7da6..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParam.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireParam.js"],"names":["jsdoc","utils","functionParameterNames","getFunctionParameterNames","jsdocParameterNames","getJsdocTags","avoidDocs","hasTag","preferredTagName","getPreferredTagName","tagName","findExpectedIndex","jsdocTags","indexAtFunctionParams","functionTags","filter","tag","expectedIndex","length","forEach","index","indexOf","missingTags","functionParameterName","functionParameterIdx","includes","find","name","push","fixAll","missings","tags","expectedIdx","splice","fixer","reportJSDoc","meta","fixable","schema","additionalProperties","properties","exemptedBy","items","type"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,KAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJ,QAAMC,sBAAsB,GAAGD,KAAK,CAACE,yBAAN,EAA/B;AACA,QAAMC,mBAAmB,GAAGH,KAAK,CAACI,YAAN,CAAmB,OAAnB,CAA5B;;AACA,MAAI,CAACD,mBAAL,EAA0B;AACxB;AACD;;AAED,MAAIH,KAAK,CAACK,SAAN,EAAJ,EAAuB;AACrB;AACD,GATG,CAWJ;;;AACA,MAAIL,KAAK,CAACM,MAAN,CAAa,MAAb,CAAJ,EAA0B;AACxB;AACD;;AAED,QAAMC,gBAAgB,GAAGP,KAAK,CAACQ,mBAAN,CAA0B;AAACC,IAAAA,OAAO,EAAE;AAAV,GAA1B,CAAzB;;AAEA,QAAMC,iBAAiB,GAAG,CAACC,SAAD,EAAYC,qBAAZ,KAAsC;AAC9D,UAAMC,YAAY,GAAGF,SAAS,CAACG,MAAV,CAAiB,CAAC;AAACC,MAAAA;AAAD,KAAD,KAAW;AAC/C,aAAOA,GAAG,KAAKR,gBAAf;AACD,KAFoB,CAArB;AAGA,QAAIS,aAAa,GAAGL,SAAS,CAACM,MAA9B;AACAN,IAAAA,SAAS,CAACO,OAAV,CAAkB,CAACH,GAAD,EAAMI,KAAN,KAAgB;AAChC,UAAIJ,GAAG,CAACA,GAAJ,KAAYR,gBAAhB,EAAkC;AAChCS,QAAAA,aAAa,GAAGG,KAAhB;;AACA,YAAIN,YAAY,CAACO,OAAb,CAAqBL,GAArB,IAA4BH,qBAAhC,EAAuD;AACrDI,UAAAA,aAAa,IAAI,CAAjB;AACD;AACF;AACF,KAPD;AASA,WAAOA,aAAP;AACD,GAfD;;AAiBA,QAAMK,WAAW,GAAG,EAApB;AAEApB,EAAAA,sBAAsB,CAACiB,OAAvB,CAA+B,CAACI,qBAAD,EAAwBC,oBAAxB,KAAiD;AAC9E,QAAI,CAAC,iBAAD,EAAoB,gBAApB,EAAsCC,QAAtC,CAA+CF,qBAA/C,CAAJ,EAA2E;AACzE;AACD;;AAED,QAAInB,mBAAmB,IAAI,CAACA,mBAAmB,CAACsB,IAApB,CAAyB,CAAC;AAACC,MAAAA;AAAD,KAAD,KAAY;AAC/D,aAAOA,IAAI,KAAKJ,qBAAhB;AACD,KAF2B,CAA5B,EAEI;AACFD,MAAAA,WAAW,CAACM,IAAZ,CAAiB;AACfJ,QAAAA,oBADe;AAEfD,QAAAA;AAFe,OAAjB;AAID;AACF,GAbD;;AAeA,QAAMM,MAAM,GAAG,CAACC,QAAD,EAAWC,IAAX,KAAoB;AACjCD,IAAAA,QAAQ,CAACX,OAAT,CAAiB,CAAC;AAACK,MAAAA,oBAAD;AAAuBD,MAAAA;AAAvB,KAAD,KAAmD;AAClE,YAAMS,WAAW,GAAGrB,iBAAiB,CAACoB,IAAD,EAAOP,oBAAP,CAArC;AACAO,MAAAA,IAAI,CAACE,MAAL,CAAYD,WAAZ,EAAyB,CAAzB,EAA4B;AAC1BL,QAAAA,IAAI,EAAEJ,qBADoB;AAE1BP,QAAAA,GAAG,EAAER;AAFqB,OAA5B;AAID,KAND;AAOD,GARD;;AAUAc,EAAAA,WAAW,CAACH,OAAZ,CAAoB,CAAC;AAACI,IAAAA;AAAD,GAAD,EAA0BH,KAA1B,KAAoC;AACtD;AACA,UAAMc,KAAK,GAAGd,KAAK,GAAG,CAAR,GAAY,IAAZ,GAAmB,MAAM;AACrC,UAAI,CAACpB,KAAK,CAAC+B,IAAX,EAAiB;AACf/B,QAAAA,KAAK,CAAC+B,IAAN,GAAa,EAAb;AACD;;AAEDF,MAAAA,MAAM,CAACP,WAAD,EAActB,KAAK,CAAC+B,IAApB,CAAN;AACD,KAND;AAOA9B,IAAAA,KAAK,CAACkC,WAAN,CAAmB,kBAAiB3B,gBAAiB,KAAIe,qBAAsB,gBAA/E,EAAgG,IAAhG,EAAsGW,KAAtG;AACD,GAVD;AAWD,CA5Ec,EA4EZ;AACDE,EAAAA,IAAI,EAAE;AACJC,IAAAA,OAAO,EAAE,MADL;AAEJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,oBAAoB,EAAE,KADxB;AAEEC,MAAAA,UAAU,EAAE;AACVC,QAAAA,UAAU,EAAE;AACVC,UAAAA,KAAK,EAAE;AACLC,YAAAA,IAAI,EAAE;AADD,WADG;AAIVA,UAAAA,IAAI,EAAE;AAJI;AADF,OAFd;AAUEA,MAAAA,IAAI,EAAE;AAVR,KADM,CAFJ;AAgBJA,IAAAA,IAAI,EAAE;AAhBF;AADL,CA5EY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  jsdoc,\n  utils,\n}) => {\n  const functionParameterNames = utils.getFunctionParameterNames();\n  const jsdocParameterNames = utils.getJsdocTags('param');\n  if (!jsdocParameterNames) {\n    return;\n  }\n\n  if (utils.avoidDocs()) {\n    return;\n  }\n\n  // Param type is specified by type in @type\n  if (utils.hasTag('type')) {\n    return;\n  }\n\n  const preferredTagName = utils.getPreferredTagName({tagName: 'param'});\n\n  const findExpectedIndex = (jsdocTags, indexAtFunctionParams) => {\n    const functionTags = jsdocTags.filter(({tag}) => {\n      return tag === preferredTagName;\n    });\n    let expectedIndex = jsdocTags.length;\n    jsdocTags.forEach((tag, index) => {\n      if (tag.tag === preferredTagName) {\n        expectedIndex = index;\n        if (functionTags.indexOf(tag) < indexAtFunctionParams) {\n          expectedIndex += 1;\n        }\n      }\n    });\n\n    return expectedIndex;\n  };\n\n  const missingTags = [];\n\n  functionParameterNames.forEach((functionParameterName, functionParameterIdx) => {\n    if (['<ObjectPattern>', '<ArrayPattern>'].includes(functionParameterName)) {\n      return;\n    }\n\n    if (jsdocParameterNames && !jsdocParameterNames.find(({name}) => {\n      return name === functionParameterName;\n    })) {\n      missingTags.push({\n        functionParameterIdx,\n        functionParameterName,\n      });\n    }\n  });\n\n  const fixAll = (missings, tags) => {\n    missings.forEach(({functionParameterIdx, functionParameterName}) => {\n      const expectedIdx = findExpectedIndex(tags, functionParameterIdx);\n      tags.splice(expectedIdx, 0, {\n        name: functionParameterName,\n        tag: preferredTagName,\n      });\n    });\n  };\n\n  missingTags.forEach(({functionParameterName}, index) => {\n    // Fix all missing tags the first time.\n    const fixer = index > 0 ? null : () => {\n      if (!jsdoc.tags) {\n        jsdoc.tags = [];\n      }\n\n      fixAll(missingTags, jsdoc.tags);\n    };\n    utils.reportJSDoc(`Missing JSDoc @${preferredTagName} \"${functionParameterName}\" declaration.`, null, fixer);\n  });\n}, {\n  meta: {\n    fixable: 'code',\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          exemptedBy: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"requireParam.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamDescription.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamDescription.js
deleted file mode 100644
index 48bf27b..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamDescription.js
+++ /dev/null
@@ -1,42 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  utils
-}) => {
-  utils.forEachPreferredTag('param', (jsdocParameter, targetTagName) => {
-    if (!jsdocParameter.description) {
-      report(`Missing JSDoc @${targetTagName} "${jsdocParameter.name}" description.`, null, jsdocParameter);
-    }
-  });
-}, {
-  contextDefaults: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        contexts: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireParamDescription.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamDescription.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamDescription.js.map
deleted file mode 100644
index 8b4e3eb..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamDescription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireParamDescription.js"],"names":["report","utils","forEachPreferredTag","jsdocParameter","targetTagName","description","name","contextDefaults","meta","schema","additionalProperties","properties","contexts","items","type"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,MAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJA,EAAAA,KAAK,CAACC,mBAAN,CAA0B,OAA1B,EAAmC,CAACC,cAAD,EAAiBC,aAAjB,KAAmC;AACpE,QAAI,CAACD,cAAc,CAACE,WAApB,EAAiC;AAC/BL,MAAAA,MAAM,CACH,kBAAiBI,aAAc,KAAID,cAAc,CAACG,IAAK,gBADpD,EAEJ,IAFI,EAGJH,cAHI,CAAN;AAKD;AACF,GARD;AASD,CAbc,EAaZ;AACDI,EAAAA,eAAe,EAAE,IADhB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,oBAAoB,EAAE,KADxB;AAEEC,MAAAA,UAAU,EAAE;AACVC,QAAAA,QAAQ,EAAE;AACRC,UAAAA,KAAK,EAAE;AACLC,YAAAA,IAAI,EAAE;AADD,WADC;AAIRA,UAAAA,IAAI,EAAE;AAJE;AADA,OAFd;AAUEA,MAAAA,IAAI,EAAE;AAVR,KADM,CADJ;AAeJA,IAAAA,IAAI,EAAE;AAfF;AAFL,CAbY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  report,\n  utils,\n}) => {\n  utils.forEachPreferredTag('param', (jsdocParameter, targetTagName) => {\n    if (!jsdocParameter.description) {\n      report(\n        `Missing JSDoc @${targetTagName} \"${jsdocParameter.name}\" description.`,\n        null,\n        jsdocParameter,\n      );\n    }\n  });\n}, {\n  contextDefaults: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          contexts: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"requireParamDescription.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamName.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamName.js
deleted file mode 100644
index c235c28..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamName.js
+++ /dev/null
@@ -1,42 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  utils
-}) => {
-  utils.forEachPreferredTag('param', (jsdocParameter, targetTagName) => {
-    if (jsdocParameter.tag && jsdocParameter.name === '') {
-      report(`There must be an identifier after @${targetTagName} ${jsdocParameter.type === '' ? 'type' : 'tag'}.`, null, jsdocParameter);
-    }
-  });
-}, {
-  contextDefaults: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        contexts: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireParamName.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamName.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamName.js.map
deleted file mode 100644
index 7822e03..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamName.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireParamName.js"],"names":["report","utils","forEachPreferredTag","jsdocParameter","targetTagName","tag","name","type","contextDefaults","meta","schema","additionalProperties","properties","contexts","items"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,MAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJA,EAAAA,KAAK,CAACC,mBAAN,CAA0B,OAA1B,EAAmC,CAACC,cAAD,EAAiBC,aAAjB,KAAmC;AACpE,QAAID,cAAc,CAACE,GAAf,IAAsBF,cAAc,CAACG,IAAf,KAAwB,EAAlD,EAAsD;AACpDN,MAAAA,MAAM,CACH,sCAAqCI,aAAc,IAAGD,cAAc,CAACI,IAAf,KAAwB,EAAxB,GAA6B,MAA7B,GAAsC,KAAM,GAD/F,EAEJ,IAFI,EAGJJ,cAHI,CAAN;AAKD;AACF,GARD;AASD,CAbc,EAaZ;AACDK,EAAAA,eAAe,EAAE,IADhB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,oBAAoB,EAAE,KADxB;AAEEC,MAAAA,UAAU,EAAE;AACVC,QAAAA,QAAQ,EAAE;AACRC,UAAAA,KAAK,EAAE;AACLP,YAAAA,IAAI,EAAE;AADD,WADC;AAIRA,UAAAA,IAAI,EAAE;AAJE;AADA,OAFd;AAUEA,MAAAA,IAAI,EAAE;AAVR,KADM,CADJ;AAeJA,IAAAA,IAAI,EAAE;AAfF;AAFL,CAbY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  report,\n  utils,\n}) => {\n  utils.forEachPreferredTag('param', (jsdocParameter, targetTagName) => {\n    if (jsdocParameter.tag && jsdocParameter.name === '') {\n      report(\n        `There must be an identifier after @${targetTagName} ${jsdocParameter.type === '' ? 'type' : 'tag'}.`,\n        null,\n        jsdocParameter,\n      );\n    }\n  });\n}, {\n  contextDefaults: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          contexts: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"requireParamName.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamType.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamType.js
deleted file mode 100644
index 1944953..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamType.js
+++ /dev/null
@@ -1,42 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  utils
-}) => {
-  utils.forEachPreferredTag('param', (jsdocParameter, targetTagName) => {
-    if (!jsdocParameter.type) {
-      report(`Missing JSDoc @${targetTagName} "${jsdocParameter.name}" type.`, null, jsdocParameter);
-    }
-  });
-}, {
-  contextDefaults: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        contexts: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireParamType.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamType.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamType.js.map
deleted file mode 100644
index a91b4b4..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireParamType.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireParamType.js"],"names":["report","utils","forEachPreferredTag","jsdocParameter","targetTagName","type","name","contextDefaults","meta","schema","additionalProperties","properties","contexts","items"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,MAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJA,EAAAA,KAAK,CAACC,mBAAN,CAA0B,OAA1B,EAAmC,CAACC,cAAD,EAAiBC,aAAjB,KAAmC;AACpE,QAAI,CAACD,cAAc,CAACE,IAApB,EAA0B;AACxBL,MAAAA,MAAM,CACH,kBAAiBI,aAAc,KAAID,cAAc,CAACG,IAAK,SADpD,EAEJ,IAFI,EAGJH,cAHI,CAAN;AAKD;AACF,GARD;AASD,CAbc,EAaZ;AACDI,EAAAA,eAAe,EAAE,IADhB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,oBAAoB,EAAE,KADxB;AAEEC,MAAAA,UAAU,EAAE;AACVC,QAAAA,QAAQ,EAAE;AACRC,UAAAA,KAAK,EAAE;AACLR,YAAAA,IAAI,EAAE;AADD,WADC;AAIRA,UAAAA,IAAI,EAAE;AAJE;AADA,OAFd;AAUEA,MAAAA,IAAI,EAAE;AAVR,KADM,CADJ;AAeJA,IAAAA,IAAI,EAAE;AAfF;AAFL,CAbY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  report,\n  utils,\n}) => {\n  utils.forEachPreferredTag('param', (jsdocParameter, targetTagName) => {\n    if (!jsdocParameter.type) {\n      report(\n        `Missing JSDoc @${targetTagName} \"${jsdocParameter.name}\" type.`,\n        null,\n        jsdocParameter,\n      );\n    }\n  });\n}, {\n  contextDefaults: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          contexts: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"requireParamType.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireProperty.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireProperty.js
deleted file mode 100644
index c1754ce..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireProperty.js
+++ /dev/null
@@ -1,61 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  jsdoc,
-  utils
-}) => {
-  const propertyAssociatedTags = utils.filterTags(({
-    tag
-  }) => {
-    return ['typedef', 'namespace'].includes(tag);
-  });
-
-  if (!propertyAssociatedTags.length) {
-    return;
-  }
-
-  const targetTagName = utils.getPreferredTagName({
-    tagName: 'property'
-  });
-
-  if (utils.hasATag([targetTagName])) {
-    return;
-  }
-
-  propertyAssociatedTags.forEach(propertyAssociatedTag => {
-    if (!['object', 'Object', 'PlainObject'].includes(propertyAssociatedTag.type)) {
-      return;
-    }
-
-    utils.reportJSDoc(`Missing JSDoc @${targetTagName}.`, null, () => {
-      const line = jsdoc.tags[jsdoc.tags.length - 1].line + 1;
-      jsdoc.tags.push({
-        description: '',
-        line,
-        name: '',
-        optional: false,
-        tag: targetTagName,
-        type: ''
-      });
-    });
-  });
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    fixable: 'code',
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireProperty.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireProperty.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireProperty.js.map
deleted file mode 100644
index d82e747..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireProperty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireProperty.js"],"names":["jsdoc","utils","propertyAssociatedTags","filterTags","tag","includes","length","targetTagName","getPreferredTagName","tagName","hasATag","forEach","propertyAssociatedTag","type","reportJSDoc","line","tags","push","description","name","optional","iterateAllJsdocs","meta","fixable"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,KAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJ,QAAMC,sBAAsB,GAAGD,KAAK,CAACE,UAAN,CAAiB,CAAC;AAACC,IAAAA;AAAD,GAAD,KAAW;AACzD,WAAO,CAAC,SAAD,EAAY,WAAZ,EAAyBC,QAAzB,CAAkCD,GAAlC,CAAP;AACD,GAF8B,CAA/B;;AAGA,MAAI,CAACF,sBAAsB,CAACI,MAA5B,EAAoC;AAClC;AACD;;AACD,QAAMC,aAAa,GAAGN,KAAK,CAACO,mBAAN,CAA0B;AAACC,IAAAA,OAAO,EAAE;AAAV,GAA1B,CAAtB;;AAEA,MAAIR,KAAK,CAACS,OAAN,CAAc,CAACH,aAAD,CAAd,CAAJ,EAAoC;AAClC;AACD;;AAEDL,EAAAA,sBAAsB,CAACS,OAAvB,CAAgCC,qBAAD,IAA2B;AACxD,QAAI,CAAC,CAAC,QAAD,EAAW,QAAX,EAAqB,aAArB,EAAoCP,QAApC,CAA6CO,qBAAqB,CAACC,IAAnE,CAAL,EAA+E;AAC7E;AACD;;AACDZ,IAAAA,KAAK,CAACa,WAAN,CAAmB,kBAAiBP,aAAc,GAAlD,EAAsD,IAAtD,EAA4D,MAAM;AAChE,YAAMQ,IAAI,GAAGf,KAAK,CAACgB,IAAN,CAAWhB,KAAK,CAACgB,IAAN,CAAWV,MAAX,GAAoB,CAA/B,EAAkCS,IAAlC,GAAyC,CAAtD;AACAf,MAAAA,KAAK,CAACgB,IAAN,CAAWC,IAAX,CAAgB;AACdC,QAAAA,WAAW,EAAE,EADC;AAEdH,QAAAA,IAFc;AAGdI,QAAAA,IAAI,EAAE,EAHQ;AAIdC,QAAAA,QAAQ,EAAE,KAJI;AAKdhB,QAAAA,GAAG,EAAEG,aALS;AAMdM,QAAAA,IAAI,EAAE;AANQ,OAAhB;AAQD,KAVD;AAWD,GAfD;AAgBD,CAhCc,EAgCZ;AACDQ,EAAAA,gBAAgB,EAAE,IADjB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,OAAO,EAAE,MADL;AAEJV,IAAAA,IAAI,EAAE;AAFF;AAFL,CAhCY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  jsdoc,\n  utils,\n}) => {\n  const propertyAssociatedTags = utils.filterTags(({tag}) => {\n    return ['typedef', 'namespace'].includes(tag);\n  });\n  if (!propertyAssociatedTags.length) {\n    return;\n  }\n  const targetTagName = utils.getPreferredTagName({tagName: 'property'});\n\n  if (utils.hasATag([targetTagName])) {\n    return;\n  }\n\n  propertyAssociatedTags.forEach((propertyAssociatedTag) => {\n    if (!['object', 'Object', 'PlainObject'].includes(propertyAssociatedTag.type)) {\n      return;\n    }\n    utils.reportJSDoc(`Missing JSDoc @${targetTagName}.`, null, () => {\n      const line = jsdoc.tags[jsdoc.tags.length - 1].line + 1;\n      jsdoc.tags.push({\n        description: '',\n        line,\n        name: '',\n        optional: false,\n        tag: targetTagName,\n        type: '',\n      });\n    });\n  });\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    fixable: 'code',\n    type: 'suggestion',\n  },\n});\n"],"file":"requireProperty.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyDescription.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyDescription.js
deleted file mode 100644
index 5a70cc0..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyDescription.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  utils
-}) => {
-  utils.forEachPreferredTag('property', (jsdoc, targetTagName) => {
-    if (!jsdoc.description) {
-      report(`Missing JSDoc @${targetTagName} "${jsdoc.name}" description.`, null, jsdoc);
-    }
-  });
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requirePropertyDescription.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyDescription.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyDescription.js.map
deleted file mode 100644
index 9c98435..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyDescription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requirePropertyDescription.js"],"names":["report","utils","forEachPreferredTag","jsdoc","targetTagName","description","name","iterateAllJsdocs","meta","type"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,MAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJA,EAAAA,KAAK,CAACC,mBAAN,CAA0B,UAA1B,EAAsC,CAACC,KAAD,EAAQC,aAAR,KAA0B;AAC9D,QAAI,CAACD,KAAK,CAACE,WAAX,EAAwB;AACtBL,MAAAA,MAAM,CACH,kBAAiBI,aAAc,KAAID,KAAK,CAACG,IAAK,gBAD3C,EAEJ,IAFI,EAGJH,KAHI,CAAN;AAKD;AACF,GARD;AASD,CAbc,EAaZ;AACDI,EAAAA,gBAAgB,EAAE,IADjB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,IAAI,EAAE;AADF;AAFL,CAbY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  report,\n  utils,\n}) => {\n  utils.forEachPreferredTag('property', (jsdoc, targetTagName) => {\n    if (!jsdoc.description) {\n      report(\n        `Missing JSDoc @${targetTagName} \"${jsdoc.name}\" description.`,\n        null,\n        jsdoc,\n      );\n    }\n  });\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    type: 'suggestion',\n  },\n});\n"],"file":"requirePropertyDescription.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyName.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyName.js
deleted file mode 100644
index 4cdbcb4..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyName.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  utils
-}) => {
-  utils.forEachPreferredTag('property', (jsdoc, targetTagName) => {
-    if (jsdoc.tag && jsdoc.name === '') {
-      report(`There must be an identifier after @${targetTagName} ${jsdoc.type === '' ? 'type' : 'tag'}.`, null, jsdoc);
-    }
-  });
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requirePropertyName.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyName.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyName.js.map
deleted file mode 100644
index 254a00e..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyName.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requirePropertyName.js"],"names":["report","utils","forEachPreferredTag","jsdoc","targetTagName","tag","name","type","iterateAllJsdocs","meta"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,MAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJA,EAAAA,KAAK,CAACC,mBAAN,CAA0B,UAA1B,EAAsC,CAACC,KAAD,EAAQC,aAAR,KAA0B;AAC9D,QAAID,KAAK,CAACE,GAAN,IAAaF,KAAK,CAACG,IAAN,KAAe,EAAhC,EAAoC;AAClCN,MAAAA,MAAM,CACH,sCAAqCI,aAAc,IAAGD,KAAK,CAACI,IAAN,KAAe,EAAf,GAAoB,MAApB,GAA6B,KAAM,GADtF,EAEJ,IAFI,EAGJJ,KAHI,CAAN;AAKD;AACF,GARD;AASD,CAbc,EAaZ;AACDK,EAAAA,gBAAgB,EAAE,IADjB;AAEDC,EAAAA,IAAI,EAAE;AACJF,IAAAA,IAAI,EAAE;AADF;AAFL,CAbY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  report,\n  utils,\n}) => {\n  utils.forEachPreferredTag('property', (jsdoc, targetTagName) => {\n    if (jsdoc.tag && jsdoc.name === '') {\n      report(\n        `There must be an identifier after @${targetTagName} ${jsdoc.type === '' ? 'type' : 'tag'}.`,\n        null,\n        jsdoc,\n      );\n    }\n  });\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    type: 'suggestion',\n  },\n});\n"],"file":"requirePropertyName.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyType.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyType.js
deleted file mode 100644
index 758910e..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyType.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  utils
-}) => {
-  utils.forEachPreferredTag('property', (jsdoc, targetTagName) => {
-    if (!jsdoc.type) {
-      report(`Missing JSDoc @${targetTagName} "${jsdoc.name}" type.`, null, jsdoc);
-    }
-  });
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requirePropertyType.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyType.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyType.js.map
deleted file mode 100644
index 9370642..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requirePropertyType.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requirePropertyType.js"],"names":["report","utils","forEachPreferredTag","jsdoc","targetTagName","type","name","iterateAllJsdocs","meta"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,MAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJA,EAAAA,KAAK,CAACC,mBAAN,CAA0B,UAA1B,EAAsC,CAACC,KAAD,EAAQC,aAAR,KAA0B;AAC9D,QAAI,CAACD,KAAK,CAACE,IAAX,EAAiB;AACfL,MAAAA,MAAM,CACH,kBAAiBI,aAAc,KAAID,KAAK,CAACG,IAAK,SAD3C,EAEJ,IAFI,EAGJH,KAHI,CAAN;AAKD;AACF,GARD;AASD,CAbc,EAaZ;AACDI,EAAAA,gBAAgB,EAAE,IADjB;AAEDC,EAAAA,IAAI,EAAE;AACJH,IAAAA,IAAI,EAAE;AADF;AAFL,CAbY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  report,\n  utils,\n}) => {\n  utils.forEachPreferredTag('property', (jsdoc, targetTagName) => {\n    if (!jsdoc.type) {\n      report(\n        `Missing JSDoc @${targetTagName} \"${jsdoc.name}\" type.`,\n        null,\n        jsdoc,\n      );\n    }\n  });\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    type: 'suggestion',\n  },\n});\n"],"file":"requirePropertyType.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturns.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturns.js
deleted file mode 100644
index 953622e..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturns.js
+++ /dev/null
@@ -1,143 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-var _warnRemovedSettings = _interopRequireDefault(require("../warnRemovedSettings"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
-
-function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-/**
- * We can skip checking for a return value, in case the documentation is inherited
- * or the method is either a constructor or an abstract method.
- *
- * In either of these cases the return value is optional or not defined.
- *
- * @param {*} utils
- *   a reference to the utils which are used to probe if a tag is present or not.
- * @returns {boolean}
- *   true in case deep checking can be skipped; otherwise false.
- */
-const canSkip = utils => {
-  return utils.hasATag([// inheritdoc implies that all documentation is inherited
-  // see https://jsdoc.app/tags-inheritdoc.html
-  //
-  // Abstract methods are by definition incomplete,
-  // so it is not an error if it declares a return value but does not implement it.
-  'abstract', 'virtual', // Constructors do not have a return value by definition (https://jsdoc.app/tags-class.html)
-  // So we can bail out here, too.
-  'class', 'constructor', // Return type is specified by type in @type
-  'type', // This seems to imply a class as well
-  'interface']) || utils.isConstructor() || // Though ESLint avoided getters: https://github.com/eslint/eslint/blob/master/lib/rules/valid-jsdoc.js#L435
-  //  ... getters seem that they should, unlike setters, always return:
-  utils.isSetter() || utils.avoidDocs();
-};
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  utils,
-  context
-}) => {
-  (0, _warnRemovedSettings.default)(context, 'require-returns'); // A preflight check. We do not need to run a deep check
-  // in case the @returns comment is optional or undefined.
-
-  if (canSkip(utils)) {
-    return;
-  }
-
-  const _ref = context.options[0] || {},
-        _ref$forceRequireRetu = _ref.forceRequireReturn,
-        forceRequireReturn = _ref$forceRequireRetu === void 0 ? false : _ref$forceRequireRetu,
-        _ref$forceReturnsWith = _ref.forceReturnsWithAsync,
-        forceReturnsWithAsync = _ref$forceReturnsWith === void 0 ? false : _ref$forceReturnsWith;
-
-  const tagName = utils.getPreferredTagName({
-    tagName: 'returns'
-  });
-
-  if (!tagName) {
-    return;
-  }
-
-  const tags = utils.getTags(tagName);
-
-  if (tags.length > 1) {
-    report(`Found more than one @${tagName} declaration.`);
-  }
-
-  const iteratingFunction = utils.isIteratingFunction(); // In case the code returns something, we expect a return value in JSDoc.
-
-  const _tags = _slicedToArray(tags, 1),
-        tag = _tags[0];
-
-  const missingReturnTag = typeof tag === 'undefined' || tag === null;
-
-  const shouldReport = () => {
-    if (!missingReturnTag) {
-      return false;
-    }
-
-    if (forceRequireReturn && (iteratingFunction || utils.isVirtualFunction())) {
-      return true;
-    }
-
-    const isAsync = !iteratingFunction && utils.hasTag('async') || iteratingFunction && utils.isAsync();
-
-    if (forceReturnsWithAsync && isAsync) {
-      return true;
-    }
-
-    return !isAsync && iteratingFunction && utils.hasReturnValue();
-  };
-
-  if (shouldReport()) {
-    report(`Missing JSDoc @${tagName} declaration.`);
-  }
-}, {
-  contextDefaults: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        contexts: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        },
-        exemptedBy: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        },
-        forceRequireReturn: {
-          default: false,
-          type: 'boolean'
-        },
-        forceReturnsWithAsync: {
-          default: false,
-          type: 'boolean'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireReturns.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturns.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturns.js.map
deleted file mode 100644
index bae88c3..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturns.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireReturns.js"],"names":["canSkip","utils","hasATag","isConstructor","isSetter","avoidDocs","report","context","options","forceRequireReturn","forceReturnsWithAsync","tagName","getPreferredTagName","tags","getTags","length","iteratingFunction","isIteratingFunction","tag","missingReturnTag","shouldReport","isVirtualFunction","isAsync","hasTag","hasReturnValue","contextDefaults","meta","schema","additionalProperties","properties","contexts","items","type","exemptedBy","default"],"mappings":"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","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\nimport warnRemovedSettings from '../warnRemovedSettings';\n\n/**\n * We can skip checking for a return value, in case the documentation is inherited\n * or the method is either a constructor or an abstract method.\n *\n * In either of these cases the return value is optional or not defined.\n *\n * @param {*} utils\n *   a reference to the utils which are used to probe if a tag is present or not.\n * @returns {boolean}\n *   true in case deep checking can be skipped; otherwise false.\n */\nconst canSkip = (utils) => {\n  return utils.hasATag([\n    // inheritdoc implies that all documentation is inherited\n    // see https://jsdoc.app/tags-inheritdoc.html\n    //\n    // Abstract methods are by definition incomplete,\n    // so it is not an error if it declares a return value but does not implement it.\n    'abstract',\n    'virtual',\n\n    // Constructors do not have a return value by definition (https://jsdoc.app/tags-class.html)\n    // So we can bail out here, too.\n    'class',\n    'constructor',\n\n    // Return type is specified by type in @type\n    'type',\n\n    // This seems to imply a class as well\n    'interface',\n  ]) ||\n    utils.isConstructor() ||\n\n    // Though ESLint avoided getters: https://github.com/eslint/eslint/blob/master/lib/rules/valid-jsdoc.js#L435\n    //  ... getters seem that they should, unlike setters, always return:\n    utils.isSetter() ||\n    utils.avoidDocs();\n};\n\nexport default iterateJsdoc(({\n  report,\n  utils,\n  context,\n}) => {\n  warnRemovedSettings(context, 'require-returns');\n\n  // A preflight check. We do not need to run a deep check\n  // in case the @returns comment is optional or undefined.\n  if (canSkip(utils)) {\n    return;\n  }\n\n  const {\n    forceRequireReturn = false,\n    forceReturnsWithAsync = false,\n  } = context.options[0] || {};\n\n  const tagName = utils.getPreferredTagName({tagName: 'returns'});\n  if (!tagName) {\n    return;\n  }\n  const tags = utils.getTags(tagName);\n\n  if (tags.length > 1) {\n    report(`Found more than one @${tagName} declaration.`);\n  }\n\n  const iteratingFunction = utils.isIteratingFunction();\n\n  // In case the code returns something, we expect a return value in JSDoc.\n  const [tag] = tags;\n  const missingReturnTag = typeof tag === 'undefined' || tag === null;\n\n  const shouldReport = () => {\n    if (!missingReturnTag) {\n      return false;\n    }\n\n    if (forceRequireReturn && (\n      iteratingFunction || utils.isVirtualFunction()\n    )) {\n      return true;\n    }\n\n    const isAsync = !iteratingFunction && utils.hasTag('async') ||\n      iteratingFunction && utils.isAsync();\n\n    if (forceReturnsWithAsync && isAsync) {\n      return true;\n    }\n\n    return !isAsync && iteratingFunction && utils.hasReturnValue();\n  };\n\n  if (shouldReport()) {\n    report(`Missing JSDoc @${tagName} declaration.`);\n  }\n}, {\n  contextDefaults: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          contexts: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n          exemptedBy: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n          forceRequireReturn: {\n            default: false,\n            type: 'boolean',\n          },\n          forceReturnsWithAsync: {\n            default: false,\n            type: 'boolean',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"requireReturns.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsCheck.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsCheck.js
deleted file mode 100755
index 917afad..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsCheck.js
+++ /dev/null
@@ -1,74 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const canSkip = (utils, settings) => {
-  const voidingTags = [// An abstract function is by definition incomplete
-  // so it is perfectly fine if a return is documented but
-  // not present within the function.
-  // A subclass may inherit the doc and implement the
-  // missing return.
-  'abstract', 'virtual', // A constructor function returns `this` by default, so may be `@returns`
-  //   tag indicating this but no explicit return
-  'class', 'constructor', 'interface'];
-
-  if (settings.mode === 'closure') {
-    // Structural Interface in GCC terms, equivalent to @interface tag as far as this rule is concerned
-    voidingTags.push('record');
-  }
-
-  return utils.hasATag(voidingTags) || utils.isConstructor() || utils.classHasTag('interface') || settings.mode === 'closure' && utils.classHasTag('record');
-};
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  settings,
-  utils
-}) => {
-  if (canSkip(utils, settings)) {
-    return;
-  }
-
-  if (utils.isAsync()) {
-    return;
-  }
-
-  const tagName = utils.getPreferredTagName({
-    tagName: 'returns'
-  });
-
-  if (!tagName) {
-    return;
-  }
-
-  const tags = utils.getTags(tagName);
-
-  if (tags.length === 0) {
-    return;
-  }
-
-  if (tags.length > 1) {
-    report(`Found more than one @${tagName} declaration.`);
-    return;
-  } // In case a return value is declared in JSDoc, we also expect one in the code.
-
-
-  if (utils.hasDefinedTypeReturnTag(tags[0]) && !utils.hasReturnValue()) {
-    report(`JSDoc @${tagName} declaration present but return expression not available in function.`);
-  }
-}, {
-  meta: {
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireReturnsCheck.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsCheck.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsCheck.js.map
deleted file mode 100644
index bf96909..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsCheck.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireReturnsCheck.js"],"names":["canSkip","utils","settings","voidingTags","mode","push","hasATag","isConstructor","classHasTag","report","isAsync","tagName","getPreferredTagName","tags","getTags","length","hasDefinedTypeReturnTag","hasReturnValue","meta","type"],"mappings":";;;;;;;AAAA;;;;AAEA,MAAMA,OAAO,GAAG,CAACC,KAAD,EAAQC,QAAR,KAAqB;AACnC,QAAMC,WAAW,GAAG,CAClB;AACA;AACA;AACA;AACA;AACA,YANkB,EAOlB,SAPkB,EASlB;AACA;AACA,SAXkB,EAYlB,aAZkB,EAalB,WAbkB,CAApB;;AAgBA,MAAID,QAAQ,CAACE,IAAT,KAAkB,SAAtB,EAAiC;AAC/B;AACAD,IAAAA,WAAW,CAACE,IAAZ,CAAiB,QAAjB;AACD;;AAED,SAAOJ,KAAK,CAACK,OAAN,CAAcH,WAAd,KACLF,KAAK,CAACM,aAAN,EADK,IAELN,KAAK,CAACO,WAAN,CAAkB,WAAlB,CAFK,IAGLN,QAAQ,CAACE,IAAT,KAAkB,SAAlB,IAA+BH,KAAK,CAACO,WAAN,CAAkB,QAAlB,CAHjC;AAID,CA1BD;;eA4Be,2BAAa,CAAC;AAC3BC,EAAAA,MAD2B;AAE3BP,EAAAA,QAF2B;AAG3BD,EAAAA;AAH2B,CAAD,KAItB;AACJ,MAAID,OAAO,CAACC,KAAD,EAAQC,QAAR,CAAX,EAA8B;AAC5B;AACD;;AAED,MAAID,KAAK,CAACS,OAAN,EAAJ,EAAqB;AACnB;AACD;;AAED,QAAMC,OAAO,GAAGV,KAAK,CAACW,mBAAN,CAA0B;AAACD,IAAAA,OAAO,EAAE;AAAV,GAA1B,CAAhB;;AACA,MAAI,CAACA,OAAL,EAAc;AACZ;AACD;;AACD,QAAME,IAAI,GAAGZ,KAAK,CAACa,OAAN,CAAcH,OAAd,CAAb;;AAEA,MAAIE,IAAI,CAACE,MAAL,KAAgB,CAApB,EAAuB;AACrB;AACD;;AAED,MAAIF,IAAI,CAACE,MAAL,GAAc,CAAlB,EAAqB;AACnBN,IAAAA,MAAM,CAAE,wBAAuBE,OAAQ,eAAjC,CAAN;AAEA;AACD,GAvBG,CAyBJ;;;AACA,MAAIV,KAAK,CAACe,uBAAN,CAA8BH,IAAI,CAAC,CAAD,CAAlC,KAA0C,CAACZ,KAAK,CAACgB,cAAN,EAA/C,EAAuE;AACrER,IAAAA,MAAM,CAAE,UAASE,OAAQ,uEAAnB,CAAN;AACD;AACF,CAjCc,EAiCZ;AACDO,EAAAA,IAAI,EAAE;AACJC,IAAAA,IAAI,EAAE;AADF;AADL,CAjCY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nconst canSkip = (utils, settings) => {\n  const voidingTags = [\n    // An abstract function is by definition incomplete\n    // so it is perfectly fine if a return is documented but\n    // not present within the function.\n    // A subclass may inherit the doc and implement the\n    // missing return.\n    'abstract',\n    'virtual',\n\n    // A constructor function returns `this` by default, so may be `@returns`\n    //   tag indicating this but no explicit return\n    'class',\n    'constructor',\n    'interface',\n  ];\n\n  if (settings.mode === 'closure') {\n    // Structural Interface in GCC terms, equivalent to @interface tag as far as this rule is concerned\n    voidingTags.push('record');\n  }\n\n  return utils.hasATag(voidingTags) ||\n    utils.isConstructor() ||\n    utils.classHasTag('interface') ||\n    settings.mode === 'closure' && utils.classHasTag('record');\n};\n\nexport default iterateJsdoc(({\n  report,\n  settings,\n  utils,\n}) => {\n  if (canSkip(utils, settings)) {\n    return;\n  }\n\n  if (utils.isAsync()) {\n    return;\n  }\n\n  const tagName = utils.getPreferredTagName({tagName: 'returns'});\n  if (!tagName) {\n    return;\n  }\n  const tags = utils.getTags(tagName);\n\n  if (tags.length === 0) {\n    return;\n  }\n\n  if (tags.length > 1) {\n    report(`Found more than one @${tagName} declaration.`);\n\n    return;\n  }\n\n  // In case a return value is declared in JSDoc, we also expect one in the code.\n  if (utils.hasDefinedTypeReturnTag(tags[0]) && !utils.hasReturnValue()) {\n    report(`JSDoc @${tagName} declaration present but return expression not available in function.`);\n  }\n}, {\n  meta: {\n    type: 'suggestion',\n  },\n});\n"],"file":"requireReturnsCheck.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsDescription.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsDescription.js
deleted file mode 100644
index f742bb8..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsDescription.js
+++ /dev/null
@@ -1,48 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  utils
-}) => {
-  utils.forEachPreferredTag('returns', (jsdocTag, targetTagName) => {
-    const type = jsdocTag.type && jsdocTag.type.trim();
-
-    if (type === 'void' || type === 'undefined') {
-      return;
-    }
-
-    if (!jsdocTag.description) {
-      report(`Missing JSDoc @${targetTagName} description.`, null, jsdocTag);
-    }
-  });
-}, {
-  contextDefaults: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        contexts: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireReturnsDescription.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsDescription.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsDescription.js.map
deleted file mode 100644
index b9e05ae..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsDescription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireReturnsDescription.js"],"names":["report","utils","forEachPreferredTag","jsdocTag","targetTagName","type","trim","description","contextDefaults","meta","schema","additionalProperties","properties","contexts","items"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,MAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJA,EAAAA,KAAK,CAACC,mBAAN,CAA0B,SAA1B,EAAqC,CAACC,QAAD,EAAWC,aAAX,KAA6B;AAChE,UAAMC,IAAI,GAAGF,QAAQ,CAACE,IAAT,IAAiBF,QAAQ,CAACE,IAAT,CAAcC,IAAd,EAA9B;;AAEA,QAAID,IAAI,KAAK,MAAT,IAAmBA,IAAI,KAAK,WAAhC,EAA6C;AAC3C;AACD;;AAED,QAAI,CAACF,QAAQ,CAACI,WAAd,EAA2B;AACzBP,MAAAA,MAAM,CAAE,kBAAiBI,aAAc,eAAjC,EAAiD,IAAjD,EAAuDD,QAAvD,CAAN;AACD;AACF,GAVD;AAWD,CAfc,EAeZ;AACDK,EAAAA,eAAe,EAAE,IADhB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,oBAAoB,EAAE,KADxB;AAEEC,MAAAA,UAAU,EAAE;AACVC,QAAAA,QAAQ,EAAE;AACRC,UAAAA,KAAK,EAAE;AACLT,YAAAA,IAAI,EAAE;AADD,WADC;AAIRA,UAAAA,IAAI,EAAE;AAJE;AADA,OAFd;AAUEA,MAAAA,IAAI,EAAE;AAVR,KADM,CADJ;AAeJA,IAAAA,IAAI,EAAE;AAfF;AAFL,CAfY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  report,\n  utils,\n}) => {\n  utils.forEachPreferredTag('returns', (jsdocTag, targetTagName) => {\n    const type = jsdocTag.type && jsdocTag.type.trim();\n\n    if (type === 'void' || type === 'undefined') {\n      return;\n    }\n\n    if (!jsdocTag.description) {\n      report(`Missing JSDoc @${targetTagName} description.`, null, jsdocTag);\n    }\n  });\n}, {\n  contextDefaults: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          contexts: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"requireReturnsDescription.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsType.js b/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsType.js
deleted file mode 100644
index ae472ea..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsType.js
+++ /dev/null
@@ -1,42 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var _default = (0, _iterateJsdoc.default)(({
-  report,
-  utils
-}) => {
-  utils.forEachPreferredTag('returns', (jsdocTag, targetTagName) => {
-    if (!jsdocTag.type) {
-      report(`Missing JSDoc @${targetTagName} type.`, null, jsdocTag);
-    }
-  });
-}, {
-  contextDefaults: true,
-  meta: {
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        contexts: {
-          items: {
-            type: 'string'
-          },
-          type: 'array'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=requireReturnsType.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsType.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsType.js.map
deleted file mode 100644
index a1b91a3..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/requireReturnsType.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/requireReturnsType.js"],"names":["report","utils","forEachPreferredTag","jsdocTag","targetTagName","type","contextDefaults","meta","schema","additionalProperties","properties","contexts","items"],"mappings":";;;;;;;AAAA;;;;eAEe,2BAAa,CAAC;AAC3BA,EAAAA,MAD2B;AAE3BC,EAAAA;AAF2B,CAAD,KAGtB;AACJA,EAAAA,KAAK,CAACC,mBAAN,CAA0B,SAA1B,EAAqC,CAACC,QAAD,EAAWC,aAAX,KAA6B;AAChE,QAAI,CAACD,QAAQ,CAACE,IAAd,EAAoB;AAClBL,MAAAA,MAAM,CAAE,kBAAiBI,aAAc,QAAjC,EAA0C,IAA1C,EAAgDD,QAAhD,CAAN;AACD;AACF,GAJD;AAKD,CATc,EASZ;AACDG,EAAAA,eAAe,EAAE,IADhB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,oBAAoB,EAAE,KADxB;AAEEC,MAAAA,UAAU,EAAE;AACVC,QAAAA,QAAQ,EAAE;AACRC,UAAAA,KAAK,EAAE;AACLP,YAAAA,IAAI,EAAE;AADD,WADC;AAIRA,UAAAA,IAAI,EAAE;AAJE;AADA,OAFd;AAUEA,MAAAA,IAAI,EAAE;AAVR,KADM,CADJ;AAeJA,IAAAA,IAAI,EAAE;AAfF;AAFL,CATY,C","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n  report,\n  utils,\n}) => {\n  utils.forEachPreferredTag('returns', (jsdocTag, targetTagName) => {\n    if (!jsdocTag.type) {\n      report(`Missing JSDoc @${targetTagName} type.`, null, jsdocTag);\n    }\n  });\n}, {\n  contextDefaults: true,\n  meta: {\n    schema: [\n      {\n        additionalProperties: false,\n        properties: {\n          contexts: {\n            items: {\n              type: 'string',\n            },\n            type: 'array',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"requireReturnsType.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/validTypes.js b/node_modules/eslint-plugin-jsdoc/dist/rules/validTypes.js
deleted file mode 100644
index d37528e..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/validTypes.js
+++ /dev/null
@@ -1,148 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _jsdoctypeparser = require("jsdoctypeparser");
-
-var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
-
-var _warnRemovedSettings = _interopRequireDefault(require("../warnRemovedSettings"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const asExpression = /as\s+/u;
-
-var _default = (0, _iterateJsdoc.default)(({
-  jsdoc,
-  report,
-  utils,
-  context
-}) => {
-  (0, _warnRemovedSettings.default)(context, 'valid-types');
-
-  const _ref = context.options[0] || {},
-        _ref$allowEmptyNamepa = _ref.allowEmptyNamepaths,
-        allowEmptyNamepaths = _ref$allowEmptyNamepa === void 0 ? true : _ref$allowEmptyNamepa,
-        _ref$checkSeesForName = _ref.checkSeesForNamepaths,
-        checkSeesForNamepaths = _ref$checkSeesForName === void 0 ? false : _ref$checkSeesForName;
-
-  if (!jsdoc.tags) {
-    return;
-  }
-
-  jsdoc.tags.forEach(tag => {
-    const validNamepathParsing = function validNamepathParsing(namepath, tagName) {
-      try {
-        (0, _jsdoctypeparser.parse)(namepath);
-      } catch (error) {
-        let handled = false;
-
-        if (tagName) {
-          if (['memberof', 'memberof!'].includes(tagName)) {
-            const endChar = namepath.slice(-1);
-
-            if (['#', '.', '~'].includes(endChar)) {
-              try {
-                (0, _jsdoctypeparser.parse)(namepath.slice(0, -1));
-                handled = true;
-              } catch (memberofError) {// Use the original error for including the whole type
-              }
-            }
-          } else if (tagName === 'borrows') {
-            const startChar = namepath.charAt();
-
-            if (['#', '.', '~'].includes(startChar)) {
-              try {
-                (0, _jsdoctypeparser.parse)(namepath.slice(1));
-                handled = true;
-              } catch (memberofError) {// Use the original error for including the whole type
-              }
-            }
-          }
-        }
-
-        if (!handled) {
-          report(`Syntax error in namepath: ${namepath}`, null, tag);
-          return false;
-        }
-      }
-
-      return true;
-    };
-
-    const validTypeParsing = function validTypeParsing(type) {
-      try {
-        (0, _jsdoctypeparser.parse)(type);
-      } catch (error) {
-        report(`Syntax error in type: ${type}`, null, tag);
-        return false;
-      }
-
-      return true;
-    };
-
-    const hasTypePosition = utils.tagMightHaveTypePosition(tag.tag) && Boolean(tag.type);
-    const mustHaveTypePosition = utils.tagMustHaveTypePosition(tag.tag);
-    const hasNameOrNamepathPosition = utils.tagMightHaveNamePosition(tag.tag) && Boolean(tag.name) && !(tag.tag === 'see' && !checkSeesForNamepaths);
-    const mustHaveNameOrNamepathPosition = utils.tagMustHaveNamePosition(tag.tag) && !allowEmptyNamepaths;
-    const hasEither = utils.tagMightHaveEitherTypeOrNamePosition(tag.tag) && hasTypePosition || hasNameOrNamepathPosition;
-    const mustHaveEither = utils.tagMustHaveEitherTypeOrNamePosition(tag.tag);
-
-    if (tag.tag === 'borrows') {
-      const thisNamepath = tag.description.replace(asExpression, '');
-
-      if (!asExpression.test(tag.description) || !thisNamepath) {
-        report(`@borrows must have an "as" expression. Found "${tag.description}"`, null, tag);
-        return;
-      }
-
-      if (validNamepathParsing(thisNamepath, 'borrows')) {
-        const thatNamepath = tag.name;
-        validNamepathParsing(thatNamepath);
-      }
-    } else {
-      if (mustHaveEither && !hasEither && !mustHaveTypePosition) {
-        report(`Tag @${tag.tag} must have either a type or namepath`, null, tag);
-        return;
-      }
-
-      if (hasTypePosition) {
-        validTypeParsing(tag.type);
-      } else if (mustHaveTypePosition) {
-        report(`Tag @${tag.tag} must have a type`, null, tag);
-      }
-
-      if (hasNameOrNamepathPosition) {
-        validNamepathParsing(tag.name, tag.tag);
-      } else if (mustHaveNameOrNamepathPosition) {
-        report(`Tag @${tag.tag} must have a name/namepath`, null, tag);
-      }
-    }
-  });
-}, {
-  iterateAllJsdocs: true,
-  meta: {
-    schema: [{
-      additionalProperies: false,
-      properties: {
-        allowEmptyNamepaths: {
-          default: true,
-          type: 'boolean'
-        },
-        checkSeesForNamepaths: {
-          default: false,
-          type: 'boolean'
-        }
-      },
-      type: 'object'
-    }],
-    type: 'suggestion'
-  }
-});
-
-exports.default = _default;
-module.exports = exports.default;
-//# sourceMappingURL=validTypes.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/rules/validTypes.js.map b/node_modules/eslint-plugin-jsdoc/dist/rules/validTypes.js.map
deleted file mode 100644
index 3e38caa..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/rules/validTypes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/rules/validTypes.js"],"names":["asExpression","jsdoc","report","utils","context","options","allowEmptyNamepaths","checkSeesForNamepaths","tags","forEach","tag","validNamepathParsing","namepath","tagName","error","handled","includes","endChar","slice","memberofError","startChar","charAt","validTypeParsing","type","hasTypePosition","tagMightHaveTypePosition","Boolean","mustHaveTypePosition","tagMustHaveTypePosition","hasNameOrNamepathPosition","tagMightHaveNamePosition","name","mustHaveNameOrNamepathPosition","tagMustHaveNamePosition","hasEither","tagMightHaveEitherTypeOrNamePosition","mustHaveEither","tagMustHaveEitherTypeOrNamePosition","thisNamepath","description","replace","test","thatNamepath","iterateAllJsdocs","meta","schema","additionalProperies","properties","default"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;;;AAEA,MAAMA,YAAY,GAAG,QAArB;;eAEe,2BAAa,CAAC;AAC3BC,EAAAA,KAD2B;AAE3BC,EAAAA,MAF2B;AAG3BC,EAAAA,KAH2B;AAI3BC,EAAAA;AAJ2B,CAAD,KAKtB;AACJ,oCAAoBA,OAApB,EAA6B,aAA7B;;AADI,eAMAA,OAAO,CAACC,OAAR,CAAgB,CAAhB,KAAsB,EANtB;AAAA,qCAIFC,mBAJE;AAAA,QAIFA,mBAJE,sCAIoB,IAJpB;AAAA,qCAKFC,qBALE;AAAA,QAKFA,qBALE,sCAKsB,KALtB;;AAQJ,MAAI,CAACN,KAAK,CAACO,IAAX,EAAiB;AACf;AACD;;AACDP,EAAAA,KAAK,CAACO,IAAN,CAAWC,OAAX,CAAoBC,GAAD,IAAS;AAC1B,UAAMC,oBAAoB,GAAG,SAAvBA,oBAAuB,CAAUC,QAAV,EAAoBC,OAApB,EAA6B;AACxD,UAAI;AACF,oCAAMD,QAAN;AACD,OAFD,CAEE,OAAOE,KAAP,EAAc;AACd,YAAIC,OAAO,GAAG,KAAd;;AAEA,YAAIF,OAAJ,EAAa;AACX,cAAI,CAAC,UAAD,EAAa,WAAb,EAA0BG,QAA1B,CAAmCH,OAAnC,CAAJ,EAAiD;AAC/C,kBAAMI,OAAO,GAAGL,QAAQ,CAACM,KAAT,CAAe,CAAC,CAAhB,CAAhB;;AACA,gBAAI,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgBF,QAAhB,CAAyBC,OAAzB,CAAJ,EAAuC;AACrC,kBAAI;AACF,4CAAML,QAAQ,CAACM,KAAT,CAAe,CAAf,EAAkB,CAAC,CAAnB,CAAN;AACAH,gBAAAA,OAAO,GAAG,IAAV;AACD,eAHD,CAGE,OAAOI,aAAP,EAAsB,CACtB;AACD;AACF;AACF,WAVD,MAUO,IAAIN,OAAO,KAAK,SAAhB,EAA2B;AAChC,kBAAMO,SAAS,GAAGR,QAAQ,CAACS,MAAT,EAAlB;;AACA,gBAAI,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgBL,QAAhB,CAAyBI,SAAzB,CAAJ,EAAyC;AACvC,kBAAI;AACF,4CAAMR,QAAQ,CAACM,KAAT,CAAe,CAAf,CAAN;AACAH,gBAAAA,OAAO,GAAG,IAAV;AACD,eAHD,CAGE,OAAOI,aAAP,EAAsB,CACtB;AACD;AACF;AACF;AACF;;AAED,YAAI,CAACJ,OAAL,EAAc;AACZb,UAAAA,MAAM,CAAE,6BAA4BU,QAAS,EAAvC,EAA0C,IAA1C,EAAgDF,GAAhD,CAAN;AAEA,iBAAO,KAAP;AACD;AACF;;AAED,aAAO,IAAP;AACD,KAtCD;;AAwCA,UAAMY,gBAAgB,GAAG,SAAnBA,gBAAmB,CAAUC,IAAV,EAAgB;AACvC,UAAI;AACF,oCAAMA,IAAN;AACD,OAFD,CAEE,OAAOT,KAAP,EAAc;AACdZ,QAAAA,MAAM,CAAE,yBAAwBqB,IAAK,EAA/B,EAAkC,IAAlC,EAAwCb,GAAxC,CAAN;AAEA,eAAO,KAAP;AACD;;AAED,aAAO,IAAP;AACD,KAVD;;AAYA,UAAMc,eAAe,GAAGrB,KAAK,CAACsB,wBAAN,CAA+Bf,GAAG,CAACA,GAAnC,KAA2CgB,OAAO,CAAChB,GAAG,CAACa,IAAL,CAA1E;AACA,UAAMI,oBAAoB,GAAGxB,KAAK,CAACyB,uBAAN,CAA8BlB,GAAG,CAACA,GAAlC,CAA7B;AAEA,UAAMmB,yBAAyB,GAAG1B,KAAK,CAAC2B,wBAAN,CAA+BpB,GAAG,CAACA,GAAnC,KAA2CgB,OAAO,CAAChB,GAAG,CAACqB,IAAL,CAAlD,IAAgE,EAAErB,GAAG,CAACA,GAAJ,KAAY,KAAZ,IAAqB,CAACH,qBAAxB,CAAlG;AACA,UAAMyB,8BAA8B,GAAG7B,KAAK,CAAC8B,uBAAN,CAA8BvB,GAAG,CAACA,GAAlC,KAA0C,CAACJ,mBAAlF;AAEA,UAAM4B,SAAS,GAAG/B,KAAK,CAACgC,oCAAN,CAA2CzB,GAAG,CAACA,GAA/C,KAAuDc,eAAvD,IAA0EK,yBAA5F;AACA,UAAMO,cAAc,GAAGjC,KAAK,CAACkC,mCAAN,CAA0C3B,GAAG,CAACA,GAA9C,CAAvB;;AAEA,QAAIA,GAAG,CAACA,GAAJ,KAAY,SAAhB,EAA2B;AACzB,YAAM4B,YAAY,GAAG5B,GAAG,CAAC6B,WAAJ,CAAgBC,OAAhB,CAAwBxC,YAAxB,EAAsC,EAAtC,CAArB;;AAEA,UAAI,CAACA,YAAY,CAACyC,IAAb,CAAkB/B,GAAG,CAAC6B,WAAtB,CAAD,IAAuC,CAACD,YAA5C,EAA0D;AACxDpC,QAAAA,MAAM,CAAE,iDAAgDQ,GAAG,CAAC6B,WAAY,GAAlE,EAAsE,IAAtE,EAA4E7B,GAA5E,CAAN;AAEA;AACD;;AAED,UAAIC,oBAAoB,CAAC2B,YAAD,EAAe,SAAf,CAAxB,EAAmD;AACjD,cAAMI,YAAY,GAAGhC,GAAG,CAACqB,IAAzB;AAEApB,QAAAA,oBAAoB,CAAC+B,YAAD,CAApB;AACD;AACF,KAdD,MAcO;AACL,UAAIN,cAAc,IAAI,CAACF,SAAnB,IAAgC,CAACP,oBAArC,EAA2D;AACzDzB,QAAAA,MAAM,CAAE,QAAOQ,GAAG,CAACA,GAAI,sCAAjB,EAAwD,IAAxD,EAA8DA,GAA9D,CAAN;AAEA;AACD;;AAED,UAAIc,eAAJ,EAAqB;AACnBF,QAAAA,gBAAgB,CAACZ,GAAG,CAACa,IAAL,CAAhB;AACD,OAFD,MAEO,IAAII,oBAAJ,EAA0B;AAC/BzB,QAAAA,MAAM,CAAE,QAAOQ,GAAG,CAACA,GAAI,mBAAjB,EAAqC,IAArC,EAA2CA,GAA3C,CAAN;AACD;;AAED,UAAImB,yBAAJ,EAA+B;AAC7BlB,QAAAA,oBAAoB,CAACD,GAAG,CAACqB,IAAL,EAAWrB,GAAG,CAACA,GAAf,CAApB;AACD,OAFD,MAEO,IAAIsB,8BAAJ,EAAoC;AACzC9B,QAAAA,MAAM,CAAE,QAAOQ,GAAG,CAACA,GAAI,4BAAjB,EAA8C,IAA9C,EAAoDA,GAApD,CAAN;AACD;AACF;AACF,GA/FD;AAgGD,CAhHc,EAgHZ;AACDiC,EAAAA,gBAAgB,EAAE,IADjB;AAEDC,EAAAA,IAAI,EAAE;AACJC,IAAAA,MAAM,EAAE,CACN;AACEC,MAAAA,mBAAmB,EAAE,KADvB;AAEEC,MAAAA,UAAU,EAAE;AACVzC,QAAAA,mBAAmB,EAAE;AACnB0C,UAAAA,OAAO,EAAE,IADU;AAEnBzB,UAAAA,IAAI,EAAE;AAFa,SADX;AAKVhB,QAAAA,qBAAqB,EAAE;AACrByC,UAAAA,OAAO,EAAE,KADY;AAErBzB,UAAAA,IAAI,EAAE;AAFe;AALb,OAFd;AAYEA,MAAAA,IAAI,EAAE;AAZR,KADM,CADJ;AAiBJA,IAAAA,IAAI,EAAE;AAjBF;AAFL,CAhHY,C","sourcesContent":["import {parse} from 'jsdoctypeparser';\nimport iterateJsdoc from '../iterateJsdoc';\nimport warnRemovedSettings from '../warnRemovedSettings';\n\nconst asExpression = /as\\s+/u;\n\nexport default iterateJsdoc(({\n  jsdoc,\n  report,\n  utils,\n  context,\n}) => {\n  warnRemovedSettings(context, 'valid-types');\n\n  const {\n    allowEmptyNamepaths = true,\n    checkSeesForNamepaths = false,\n  } = context.options[0] || {};\n\n  if (!jsdoc.tags) {\n    return;\n  }\n  jsdoc.tags.forEach((tag) => {\n    const validNamepathParsing = function (namepath, tagName) {\n      try {\n        parse(namepath);\n      } catch (error) {\n        let handled = false;\n\n        if (tagName) {\n          if (['memberof', 'memberof!'].includes(tagName)) {\n            const endChar = namepath.slice(-1);\n            if (['#', '.', '~'].includes(endChar)) {\n              try {\n                parse(namepath.slice(0, -1));\n                handled = true;\n              } catch (memberofError) {\n                // Use the original error for including the whole type\n              }\n            }\n          } else if (tagName === 'borrows') {\n            const startChar = namepath.charAt();\n            if (['#', '.', '~'].includes(startChar)) {\n              try {\n                parse(namepath.slice(1));\n                handled = true;\n              } catch (memberofError) {\n                // Use the original error for including the whole type\n              }\n            }\n          }\n        }\n\n        if (!handled) {\n          report(`Syntax error in namepath: ${namepath}`, null, tag);\n\n          return false;\n        }\n      }\n\n      return true;\n    };\n\n    const validTypeParsing = function (type) {\n      try {\n        parse(type);\n      } catch (error) {\n        report(`Syntax error in type: ${type}`, null, tag);\n\n        return false;\n      }\n\n      return true;\n    };\n\n    const hasTypePosition = utils.tagMightHaveTypePosition(tag.tag) && Boolean(tag.type);\n    const mustHaveTypePosition = utils.tagMustHaveTypePosition(tag.tag);\n\n    const hasNameOrNamepathPosition = utils.tagMightHaveNamePosition(tag.tag) && Boolean(tag.name) && !(tag.tag === 'see' && !checkSeesForNamepaths);\n    const mustHaveNameOrNamepathPosition = utils.tagMustHaveNamePosition(tag.tag) && !allowEmptyNamepaths;\n\n    const hasEither = utils.tagMightHaveEitherTypeOrNamePosition(tag.tag) && hasTypePosition || hasNameOrNamepathPosition;\n    const mustHaveEither = utils.tagMustHaveEitherTypeOrNamePosition(tag.tag);\n\n    if (tag.tag === 'borrows') {\n      const thisNamepath = tag.description.replace(asExpression, '');\n\n      if (!asExpression.test(tag.description) || !thisNamepath) {\n        report(`@borrows must have an \"as\" expression. Found \"${tag.description}\"`, null, tag);\n\n        return;\n      }\n\n      if (validNamepathParsing(thisNamepath, 'borrows')) {\n        const thatNamepath = tag.name;\n\n        validNamepathParsing(thatNamepath);\n      }\n    } else {\n      if (mustHaveEither && !hasEither && !mustHaveTypePosition) {\n        report(`Tag @${tag.tag} must have either a type or namepath`, null, tag);\n\n        return;\n      }\n\n      if (hasTypePosition) {\n        validTypeParsing(tag.type);\n      } else if (mustHaveTypePosition) {\n        report(`Tag @${tag.tag} must have a type`, null, tag);\n      }\n\n      if (hasNameOrNamepathPosition) {\n        validNamepathParsing(tag.name, tag.tag);\n      } else if (mustHaveNameOrNamepathPosition) {\n        report(`Tag @${tag.tag} must have a name/namepath`, null, tag);\n      }\n    }\n  });\n}, {\n  iterateAllJsdocs: true,\n  meta: {\n    schema: [\n      {\n        additionalProperies: false,\n        properties: {\n          allowEmptyNamepaths: {\n            default: true,\n            type: 'boolean',\n          },\n          checkSeesForNamepaths: {\n            default: false,\n            type: 'boolean',\n          },\n        },\n        type: 'object',\n      },\n    ],\n    type: 'suggestion',\n  },\n});\n"],"file":"validTypes.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/tagNames.js b/node_modules/eslint-plugin-jsdoc/dist/tagNames.js
deleted file mode 100644
index 5374ebd..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/tagNames.js
+++ /dev/null
@@ -1,148 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.typeScriptTags = exports.closureTags = exports.jsdocTags = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-const jsdocTagsUndocumented = {
-  // Undocumented but present; see
-  // https://github.com/jsdoc/jsdoc/issues/1283#issuecomment-516816802
-  // https://github.com/jsdoc/jsdoc/blob/master/packages/jsdoc/lib/jsdoc/tag/dictionary/definitions.js#L594
-  modifies: []
-};
-
-const jsdocTags = _objectSpread({}, jsdocTagsUndocumented, {
-  abstract: ['virtual'],
-  access: [],
-  alias: [],
-  async: [],
-  augments: ['extends'],
-  author: [],
-  borrows: [],
-  callback: [],
-  class: ['constructor'],
-  classdesc: [],
-  constant: ['const'],
-  constructs: [],
-  copyright: [],
-  default: ['defaultvalue'],
-  deprecated: [],
-  description: ['desc'],
-  enum: [],
-  event: [],
-  example: [],
-  exports: [],
-  external: ['host'],
-  file: ['fileoverview', 'overview'],
-  fires: ['emits'],
-  function: ['func', 'method'],
-  generator: [],
-  global: [],
-  hideconstructor: [],
-  ignore: [],
-  implements: [],
-  inheritdoc: [],
-  inner: [],
-  instance: [],
-  interface: [],
-  kind: [],
-  lends: [],
-  license: [],
-  listens: [],
-  member: ['var'],
-  memberof: [],
-  'memberof!': [],
-  mixes: [],
-  mixin: [],
-  module: [],
-  name: [],
-  namespace: [],
-  override: [],
-  package: [],
-  param: ['arg', 'argument'],
-  private: [],
-  property: ['prop'],
-  protected: [],
-  public: [],
-  readonly: [],
-  requires: [],
-  returns: ['return'],
-  see: [],
-  since: [],
-  static: [],
-  summary: [],
-  this: [],
-  throws: ['exception'],
-  todo: [],
-  tutorial: [],
-  type: [],
-  typedef: [],
-  variation: [],
-  version: [],
-  yields: ['yield']
-});
-
-exports.jsdocTags = jsdocTags;
-
-const typeScriptTags = _objectSpread({}, jsdocTags, {
-  // `@template` is also in TypeScript per:
-  //      https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html#supported-jsdoc
-  template: []
-});
-
-exports.typeScriptTags = typeScriptTags;
-const undocumentedClosureTags = {
-  // These are in Closure source but not in jsdoc source nor in the Closure
-  //  docs: https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/parsing/Annotation.java
-  closurePrimitive: [],
-  customElement: [],
-  expose: [],
-  hidden: [],
-  idGenerator: [],
-  meaning: [],
-  mixinClass: [],
-  mixinFunction: [],
-  ngInject: [],
-  owner: [],
-  typeSummary: [],
-  wizaction: []
-};
-
-const closureTags = _objectSpread({}, typeScriptTags, {}, undocumentedClosureTags, {
-  // From https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler
-  // These are all recognized in https://github.com/jsdoc/jsdoc/blob/master/packages/jsdoc/lib/jsdoc/tag/dictionary/definitions.js
-  //   except for the experimental `noinline` and the casing differences noted below
-  // Defined as a synonym of `const` in jsdoc `definitions.js`
-  define: [],
-  dict: [],
-  export: [],
-  externs: [],
-  final: [],
-  // With casing distinct from jsdoc `definitions.js`
-  implicitCast: [],
-  // With casing distinct from jsdoc `definitions.js`
-  inheritDoc: [],
-  noalias: [],
-  nocollapse: [],
-  nocompile: [],
-  noinline: [],
-  nosideeffects: [],
-  polymer: [],
-  polymerBehavior: [],
-  preserve: [],
-  // Defined as a synonym of `interface` in jsdoc `definitions.js`
-  record: [],
-  struct: [],
-  suppress: [],
-  unrestricted: []
-});
-
-exports.closureTags = closureTags;
-//# sourceMappingURL=tagNames.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/tagNames.js.map b/node_modules/eslint-plugin-jsdoc/dist/tagNames.js.map
deleted file mode 100644
index d291a86..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/tagNames.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/tagNames.js"],"names":["jsdocTagsUndocumented","modifies","jsdocTags","abstract","access","alias","async","augments","author","borrows","callback","class","classdesc","constant","constructs","copyright","default","deprecated","description","enum","event","example","exports","external","file","fires","function","generator","global","hideconstructor","ignore","implements","inheritdoc","inner","instance","interface","kind","lends","license","listens","member","memberof","mixes","mixin","module","name","namespace","override","package","param","private","property","protected","public","readonly","requires","returns","see","since","static","summary","this","throws","todo","tutorial","type","typedef","variation","version","yields","typeScriptTags","template","undocumentedClosureTags","closurePrimitive","customElement","expose","hidden","idGenerator","meaning","mixinClass","mixinFunction","ngInject","owner","typeSummary","wizaction","closureTags","define","dict","export","externs","final","implicitCast","inheritDoc","noalias","nocollapse","nocompile","noinline","nosideeffects","polymer","polymerBehavior","preserve","record","struct","suppress","unrestricted"],"mappings":"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","sourcesContent":["const jsdocTagsUndocumented = {\n  // Undocumented but present; see\n  // https://github.com/jsdoc/jsdoc/issues/1283#issuecomment-516816802\n  // https://github.com/jsdoc/jsdoc/blob/master/packages/jsdoc/lib/jsdoc/tag/dictionary/definitions.js#L594\n  modifies: [],\n};\n\nconst jsdocTags = {\n  ...jsdocTagsUndocumented,\n  abstract: [\n    'virtual',\n  ],\n  access: [],\n  alias: [],\n  async: [],\n  augments: [\n    'extends',\n  ],\n  author: [],\n  borrows: [],\n  callback: [],\n  class: [\n    'constructor',\n  ],\n  classdesc: [],\n  constant: [\n    'const',\n  ],\n  constructs: [],\n  copyright: [],\n  default: [\n    'defaultvalue',\n  ],\n  deprecated: [],\n  description: [\n    'desc',\n  ],\n  enum: [],\n  event: [],\n  example: [],\n  exports: [],\n  external: [\n    'host',\n  ],\n  file: [\n    'fileoverview',\n    'overview',\n  ],\n  fires: [\n    'emits',\n  ],\n  function: [\n    'func',\n    'method',\n  ],\n  generator: [],\n  global: [],\n  hideconstructor: [],\n  ignore: [],\n  implements: [],\n  inheritdoc: [],\n  inner: [],\n  instance: [],\n  interface: [],\n  kind: [],\n  lends: [],\n  license: [],\n  listens: [],\n  member: [\n    'var',\n  ],\n  memberof: [],\n  'memberof!': [],\n  mixes: [],\n  mixin: [],\n\n  module: [],\n  name: [],\n  namespace: [],\n  override: [],\n  package: [],\n  param: [\n    'arg',\n    'argument',\n  ],\n  private: [],\n  property: [\n    'prop',\n  ],\n  protected: [],\n  public: [],\n  readonly: [],\n  requires: [],\n  returns: [\n    'return',\n  ],\n  see: [],\n  since: [],\n  static: [],\n  summary: [],\n\n  this: [],\n  throws: [\n    'exception',\n  ],\n  todo: [],\n  tutorial: [],\n  type: [],\n  typedef: [],\n  variation: [],\n  version: [],\n  yields: [\n    'yield',\n  ],\n};\n\nconst typeScriptTags = {\n  ...jsdocTags,\n\n  // `@template` is also in TypeScript per:\n  //      https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html#supported-jsdoc\n  template: [],\n};\n\nconst undocumentedClosureTags = {\n  // These are in Closure source but not in jsdoc source nor in the Closure\n  //  docs: https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/parsing/Annotation.java\n  closurePrimitive: [],\n  customElement: [],\n  expose: [],\n  hidden: [],\n  idGenerator: [],\n  meaning: [],\n  mixinClass: [],\n  mixinFunction: [],\n  ngInject: [],\n  owner: [],\n  typeSummary: [],\n  wizaction: [],\n};\n\nconst closureTags = {\n  ...typeScriptTags,\n  ...undocumentedClosureTags,\n\n  // From https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler\n  // These are all recognized in https://github.com/jsdoc/jsdoc/blob/master/packages/jsdoc/lib/jsdoc/tag/dictionary/definitions.js\n  //   except for the experimental `noinline` and the casing differences noted below\n\n  // Defined as a synonym of `const` in jsdoc `definitions.js`\n  define: [],\n\n  dict: [],\n  export: [],\n  externs: [],\n  final: [],\n\n  // With casing distinct from jsdoc `definitions.js`\n  implicitCast: [],\n\n  // With casing distinct from jsdoc `definitions.js`\n  inheritDoc: [],\n\n  noalias: [],\n  nocollapse: [],\n  nocompile: [],\n  noinline: [],\n  nosideeffects: [],\n  polymer: [],\n  polymerBehavior: [],\n  preserve: [],\n\n  // Defined as a synonym of `interface` in jsdoc `definitions.js`\n  record: [],\n\n  struct: [],\n  suppress: [],\n\n  unrestricted: [],\n};\n\nexport {jsdocTags, closureTags, typeScriptTags};\n"],"file":"tagNames.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/warnRemovedSettings.js b/node_modules/eslint-plugin-jsdoc/dist/warnRemovedSettings.js
deleted file mode 100644
index 6f0e15a..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/warnRemovedSettings.js
+++ /dev/null
@@ -1,113 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = warnRemovedSettings;
-
-var _WarnSettings = _interopRequireDefault(require("./WarnSettings"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-const warnSettings = (0, _WarnSettings.default)();
-/**
- * @typedef {(
- *     "require-jsdoc"
- *   | "require-returns"
- *   | "valid-types"
- *   | "require-example"
- *   | "check-examples"
- * )} RulesWithMovedSettings
- */
-
-/**
- * @param {object} obj
- * @param {string} property
- * @returns {boolean}
- */
-
-const has = (obj, property) => {
-  return Object.prototype.hasOwnProperty.call(obj, property);
-};
-/**
- *
- * @param {RulesWithMovedSettings} ruleName
- * @returns {string[]}
- */
-
-
-const getMovedSettings = ruleName => {
-  switch (ruleName) {
-    case 'require-jsdoc':
-      return ['exemptEmptyFunctions'];
-
-    case 'require-returns':
-      return ['forceRequireReturn'];
-
-    case 'valid-types':
-      return ['allowEmptyNamepaths', 'checkSeesForNamepaths'];
-
-    case 'require-example':
-      return ['avoidExampleOnConstructors'];
-
-    case 'check-examples':
-      return ['captionRequired', 'exampleCodeRegex', 'rejectExampleCodeRegex', 'allowInlineConfig', 'noDefaultExampleRules', 'matchingFileName', 'configFile', // The old name for `checkEslintrc`
-      'eslintrcForExamples', 'baseConfig', 'reportUnusedDisableDirectives'];
-  }
-  /* istanbul ignore next */
-
-
-  return [];
-};
-/**
- * @param {object} context
- * @param {RulesWithMovedSettings} ruleName
- */
-
-
-function warnRemovedSettings(context, ruleName) {
-  const movedSettings = getMovedSettings(ruleName);
-
-  if (!context.settings || !context.settings.jsdoc) {
-    return;
-  }
-
-  var _iteratorNormalCompletion = true;
-  var _didIteratorError = false;
-  var _iteratorError = undefined;
-
-  try {
-    for (var _iterator = movedSettings[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-      const setting = _step.value;
-
-      if (has(context.settings.jsdoc, setting) && !warnSettings.hasBeenWarned(context, setting)) {
-        context.report({
-          loc: {
-            start: {
-              column: 1,
-              line: 1
-            }
-          },
-          message: `\`settings.jsdoc.${setting}\` has been removed, ` + `use options in the rule \`${ruleName}\` instead.`
-        });
-        warnSettings.markSettingAsWarned(context, setting);
-      }
-    }
-  } catch (err) {
-    _didIteratorError = true;
-    _iteratorError = err;
-  } finally {
-    try {
-      if (!_iteratorNormalCompletion && _iterator.return != null) {
-        _iterator.return();
-      }
-    } finally {
-      if (_didIteratorError) {
-        throw _iteratorError;
-      }
-    }
-  }
-}
-
-module.exports = exports.default;
-//# sourceMappingURL=warnRemovedSettings.js.map
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/dist/warnRemovedSettings.js.map b/node_modules/eslint-plugin-jsdoc/dist/warnRemovedSettings.js.map
deleted file mode 100644
index 0f1042b..0000000
--- a/node_modules/eslint-plugin-jsdoc/dist/warnRemovedSettings.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/warnRemovedSettings.js"],"names":["warnSettings","has","obj","property","Object","prototype","hasOwnProperty","call","getMovedSettings","ruleName","warnRemovedSettings","context","movedSettings","settings","jsdoc","setting","hasBeenWarned","report","loc","start","column","line","message","markSettingAsWarned"],"mappings":";;;;;;;AAAA;;;;AAEA,MAAMA,YAAY,GAAG,4BAArB;AAEA;;;;;;;;;;AAUA;;;;;;AAKA,MAAMC,GAAG,GAAG,CAACC,GAAD,EAAMC,QAAN,KAAmB;AAC7B,SAAOC,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCL,GAArC,EAA0CC,QAA1C,CAAP;AACD,CAFD;AAIA;;;;;;;AAKA,MAAMK,gBAAgB,GAAIC,QAAD,IAAc;AACrC,UAAQA,QAAR;AACA,SAAK,eAAL;AACE,aAAO,CAAC,sBAAD,CAAP;;AACF,SAAK,iBAAL;AACE,aAAO,CAAC,oBAAD,CAAP;;AACF,SAAK,aAAL;AACE,aAAO,CAAC,qBAAD,EAAwB,uBAAxB,CAAP;;AACF,SAAK,iBAAL;AACE,aAAO,CAAC,4BAAD,CAAP;;AACF,SAAK,gBAAL;AACE,aAAO,CACL,iBADK,EAEL,kBAFK,EAGL,wBAHK,EAIL,mBAJK,EAKL,uBALK,EAML,kBANK,EAOL,YAPK,EASL;AACA,2BAVK,EAWL,YAXK,EAYL,+BAZK,CAAP;AAVF;AA0BA;;;AACA,SAAO,EAAP;AACD,CA7BD;AA+BA;;;;;;AAIe,SAASC,mBAAT,CAA8BC,OAA9B,EAAuCF,QAAvC,EAAiD;AAC9D,QAAMG,aAAa,GAAGJ,gBAAgB,CAACC,QAAD,CAAtC;;AAEA,MAAI,CAACE,OAAO,CAACE,QAAT,IAAqB,CAACF,OAAO,CAACE,QAAR,CAAiBC,KAA3C,EAAkD;AAChD;AACD;;AAL6D;AAAA;AAAA;;AAAA;AAO9D,yBAAsBF,aAAtB,8HAAqC;AAAA,YAA1BG,OAA0B;;AACnC,UACEd,GAAG,CAACU,OAAO,CAACE,QAAR,CAAiBC,KAAlB,EAAyBC,OAAzB,CAAH,IACA,CAACf,YAAY,CAACgB,aAAb,CAA2BL,OAA3B,EAAoCI,OAApC,CAFH,EAGE;AACAJ,QAAAA,OAAO,CAACM,MAAR,CAAe;AACbC,UAAAA,GAAG,EAAE;AACHC,YAAAA,KAAK,EAAE;AACLC,cAAAA,MAAM,EAAE,CADH;AAELC,cAAAA,IAAI,EAAE;AAFD;AADJ,WADQ;AAObC,UAAAA,OAAO,EAAG,oBAAmBP,OAAQ,uBAA5B,GACN,6BAA4BN,QAAS;AAR3B,SAAf;AAUAT,QAAAA,YAAY,CAACuB,mBAAb,CAAiCZ,OAAjC,EAA0CI,OAA1C;AACD;AACF;AAxB6D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyB/D","sourcesContent":["import WarnSettings from './WarnSettings';\n\nconst warnSettings = WarnSettings();\n\n/**\n * @typedef {(\n *     \"require-jsdoc\"\n *   | \"require-returns\"\n *   | \"valid-types\"\n *   | \"require-example\"\n *   | \"check-examples\"\n * )} RulesWithMovedSettings\n */\n\n/**\n * @param {object} obj\n * @param {string} property\n * @returns {boolean}\n */\nconst has = (obj, property) => {\n  return Object.prototype.hasOwnProperty.call(obj, property);\n};\n\n/**\n *\n * @param {RulesWithMovedSettings} ruleName\n * @returns {string[]}\n */\nconst getMovedSettings = (ruleName) => {\n  switch (ruleName) {\n  case 'require-jsdoc':\n    return ['exemptEmptyFunctions'];\n  case 'require-returns':\n    return ['forceRequireReturn'];\n  case 'valid-types':\n    return ['allowEmptyNamepaths', 'checkSeesForNamepaths'];\n  case 'require-example':\n    return ['avoidExampleOnConstructors'];\n  case 'check-examples':\n    return [\n      'captionRequired',\n      'exampleCodeRegex',\n      'rejectExampleCodeRegex',\n      'allowInlineConfig',\n      'noDefaultExampleRules',\n      'matchingFileName',\n      'configFile',\n\n      // The old name for `checkEslintrc`\n      'eslintrcForExamples',\n      'baseConfig',\n      'reportUnusedDisableDirectives',\n    ];\n  }\n\n  /* istanbul ignore next */\n  return [];\n};\n\n/**\n * @param {object} context\n * @param {RulesWithMovedSettings} ruleName\n */\nexport default function warnRemovedSettings (context, ruleName) {\n  const movedSettings = getMovedSettings(ruleName);\n\n  if (!context.settings || !context.settings.jsdoc) {\n    return;\n  }\n\n  for (const setting of movedSettings) {\n    if (\n      has(context.settings.jsdoc, setting) &&\n      !warnSettings.hasBeenWarned(context, setting)\n    ) {\n      context.report({\n        loc: {\n          start: {\n            column: 1,\n            line: 1,\n          },\n        },\n        message: `\\`settings.jsdoc.${setting}\\` has been removed, ` +\n          `use options in the rule \\`${ruleName}\\` instead.`,\n      });\n      warnSettings.markSettingAsWarned(context, setting);\n    }\n  }\n}\n"],"file":"warnRemovedSettings.js"}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/node_modules/.bin/jsdoctypeparser b/node_modules/eslint-plugin-jsdoc/node_modules/.bin/jsdoctypeparser
deleted file mode 120000
index 9a09353..0000000
--- a/node_modules/eslint-plugin-jsdoc/node_modules/.bin/jsdoctypeparser
+++ /dev/null
@@ -1 +0,0 @@
-../../../jsdoctypeparser/bin/jsdoctypeparser
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/node_modules/.bin/semver b/node_modules/eslint-plugin-jsdoc/node_modules/.bin/semver
deleted file mode 120000
index c3277a7..0000000
--- a/node_modules/eslint-plugin-jsdoc/node_modules/.bin/semver
+++ /dev/null
@@ -1 +0,0 @@
-../../../semver/bin/semver.js
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsdoc/package.json b/node_modules/eslint-plugin-jsdoc/package.json
deleted file mode 100644
index 998336f..0000000
--- a/node_modules/eslint-plugin-jsdoc/package.json
+++ /dev/null
@@ -1,89 +0,0 @@
-{
-  "author": {
-    "email": "gajus@gajus.com",
-    "name": "Gajus Kuizinas",
-    "url": "http://gajus.com"
-  },
-  "dependencies": {
-    "comment-parser": "^0.7.2",
-    "debug": "^4.1.1",
-    "jsdoctypeparser": "^6.1.0",
-    "lodash": "^4.17.15",
-    "regextras": "^0.7.0",
-    "semver": "^6.3.0",
-    "spdx-expression-parse": "^3.0.0"
-  },
-  "description": "JSDoc linting rules for ESLint.",
-  "devDependencies": {
-    "@babel/cli": "^7.8.4",
-    "@babel/core": "^7.8.6",
-    "@babel/node": "^7.8.4",
-    "@babel/plugin-transform-flow-strip-types": "^7.8.3",
-    "@babel/preset-env": "^7.8.6",
-    "@babel/register": "^7.8.6",
-    "@typescript-eslint/parser": "^2.21.0",
-    "babel-eslint": "^10.1.0",
-    "babel-plugin-add-module-exports": "^1.0.2",
-    "babel-plugin-istanbul": "^6.0.0",
-    "chai": "^4.2.0",
-    "eslint": "6.8.0",
-    "eslint-config-canonical": "^19.0.3",
-    "gitdown": "^3.1.3",
-    "glob": "^7.1.6",
-    "husky": "^4.2.3",
-    "mocha": "^7.1.0",
-    "nyc": "^15.0.0",
-    "semantic-release": "^17.0.4",
-    "typescript": "^3.8.3"
-  },
-  "engines": {
-    "node": ">=8"
-  },
-  "husky": {
-    "hooks": {
-      "pre-push": "npm run lint && npm run test && npm run build && npm run check-readme"
-    }
-  },
-  "keywords": [
-    "eslint",
-    "plugin",
-    "jsdoc"
-  ],
-  "license": "BSD-3-Clause",
-  "main": "./dist/index.js",
-  "name": "eslint-plugin-jsdoc",
-  "peerDependencies": {
-    "eslint": "^6.0.0"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/gajus/eslint-plugin-jsdoc"
-  },
-  "scripts": {
-    "build": "rm -fr ./dist && NODE_ENV=production babel ./src --out-dir ./dist --copy-files --source-maps --ignore ./src/bin/*.js --no-copy-ignored",
-    "check-readme": "babel-node ./src/bin/generateReadme.js --check",
-    "create-readme": "babel-node ./src/bin/generateReadme.js",
-    "lint-fix": "eslint --report-unused-disable-directives --fix ./src ./test",
-    "lint": "eslint --report-unused-disable-directives ./src ./test",
-    "test-cov": "BABEL_ENV=test nyc mocha --recursive --require @babel/register --reporter progress --timeout 9000",
-    "test-no-cov": "BABEL_ENV=test mocha --recursive --require @babel/register --reporter progress --timeout 9000",
-    "test-index": "BABEL_ENV=test mocha --recursive --require @babel/register --reporter progress --timeout 9000 test/rules/index.js",
-    "test": "BABEL_ENV=test nyc --reporter text-summary mocha --recursive --require @babel/register --reporter progress --timeout 9000"
-  },
-  "nyc": {
-    "require": [
-      "@babel/register"
-    ],
-    "sourceMap": false,
-    "instrument": false,
-    "include": [
-      "src/"
-    ],
-    "check-coverage": true,
-    "branches": 100,
-    "lines": 100,
-    "functions": 100,
-    "statements": 100
-  },
-  "version": "22.0.0"
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/.babelrc b/node_modules/eslint-plugin-jsx-a11y/.babelrc
deleted file mode 100644
index 2159bf6..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/.babelrc
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "presets": [
-    [
-      "airbnb",
-      {
-        "targets": {
-          "node": 4
-        }
-      }
-    ]
-  ],
-  "plugins": ["@babel/plugin-transform-flow-strip-types"]
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/.eslintignore b/node_modules/eslint-plugin-jsx-a11y/.eslintignore
deleted file mode 100644
index 869feff..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/.eslintignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules/
-reports/
-lib/
diff --git a/node_modules/eslint-plugin-jsx-a11y/.eslintrc b/node_modules/eslint-plugin-jsx-a11y/.eslintrc
deleted file mode 100644
index 0151770..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/.eslintrc
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  extends: [
-    "airbnb-base",
-    "plugin:flowtype/recommended"
-  ],
-  parser: "babel-eslint",
-  plugins: [
-    "flowtype"
-  ],
-  rules: {
-    'max-len': 'off',
-    'no-template-curly-in-string': 'off',
-  }
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/CHANGELOG.md b/node_modules/eslint-plugin-jsx-a11y/CHANGELOG.md
deleted file mode 100644
index cad7991..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/CHANGELOG.md
+++ /dev/null
@@ -1,408 +0,0 @@
-6.2.3 / 2019-06-30
-=================
-- [617] Add @babel/runtime to the dependencies
-
-6.2.2 / 2019-06-29
-=================
-- Update jsx-ast-utils to v2.2.1
-- Add @babel/cli to the dev dependencies
-- Update ESLint to v6
-- Update jsx-ast-utils to 2.2.0
-- Update flow-bin to version 0.102.0
-- [589] Allow expression statements for attribute values in no-noninteractive-tabindexlow-bin-0.101.0
-- [583] Allow expression values in attributes by configurationrror
-- [596] Adding a test case for no-static-element-interactionseper/flow-bin-0.101.0) Merge branch 'master' into greenkeeper/flow-bin-0.101.0
-- Only run branch test coverage on the master branch
-- chore(package): update flow-bin to version 0.100.0
-- Allow select as a valid child of label.
-- Allow Node 4 / ESLint 3 failure to unblock ESLint upgrade in PR #568
-- chore(package): update flow-bin to version 0.99.0
-- Remove rootDir from Jest path configs
-- (fix) Template literals with undefined evaluate to the string undefined.
-- adds more tests to “anchor-is-valid”
-- Fixes “anchor-is-valid” false positive for hrefs starting with the word “javascript”
-- chore(package): update eslint-plugin-flowtype to version 3.5.0
-- Modified no-static-element-interactions to pass on non-literal roles.
-- Added isNonLiteralProperty util method
-- [#399] Account for spread in parser options
-- [552] control-has-associated-label should allow generic links
-- [issue 392] ul role='list' test case
-- chore(package): update eslint to version 5.15.2
-- chore(package): update flow-bin to version 0.95.0
-- chore(package): update expect to version 24.3.1
-- Fix typo: defintions > definitions
-- docs: add proper title to links to axe website for media-has-caption
-- docs: removes deprecated rule label-has-for
-- docs: fix typo and couple grammatical errors in Readme
-- Ignore null/undefined values in role-supports-aria-props rule
-- Ignore undefined values in aria-proptypes rule
-- Ignore null values in aria-proptypes rule
-- set target for node 4
-
-6.2.1 / 2019-02-03
-=================
-- 9980e45 [fix] Prevent Error when JSXSpreadAttribute is passed to isSemanticRoleElement
-
-6.2.0 / 2019-01-25
-=================
-- 5650674 [new rule] control-has-associated-label checks interactives for a label
-- f234698 [docs] add How to manage IDs
-- 9924d03 [docs] document jsx-a11y/label-has-associated-control assert option
-- 77b9870 [docs] Add newlines below headings
-- 8244e43 [docs] Add syntax highlighting to example
-- 26f41c8 [docs] Change explanation for role="presentation" escape hatch
-- 33a1f94 [fix] - Purely decorative emojis do not need descriptions.
-- 29d20f7 [fix] (package): update emoji-regex to version 7.0.2
-- 0b63f73 [chore] (package): update flow-bin to version 0.88.0
-- baa1344 [fix] Disable jsx-a11y/label-has-for in recommended
-- 2c5fb06 [chore] (package): update jscodeshift to version 0.6.0
-- 87debc0 [fix] corrected no-noninteractive-element-to-interactive-role.md file
-- d56265b [chore] (package): update flow-bin to version 0.87.0
-- 477966f [fix] Update test for implicit role of `img`
-- f484ce3 [fix] No implicit role for `<img>` with `alt=""`
-- 6c33bcb [fix] Add select to the list of default control elements in label-has-associated-control
-- 011f8d9 [fix] Dialog and Alert roles can host keyboard listeners
-- 0f6a8af [fix] More easier `plugin:jsx-a11y/{recommended,strict}` configs
-- 3844248 [fix] Mark the replacement for label-has-for
-- 93265cb [fix] normalizedValues to values
-- 651366c [fix] Make aria-role case sensitive
-- 56d3b9a [fix] [484] Fix role-has-required-aria-props for semantic elements like input[checkbox]
-- 46e9abd [fix] Handle the type={truthy} case in jsx
-
-6.1.2 / 2018-10-05
-=================
-- [fix] Add link-type styling recommendation to anchor-is-valid #486
-- [fix] `label-has-for`: `textarea`s are inputs too #470
-
-6.1.1 / 2018-07-03
-==================
-- [fix] aria-proptypes support for idlist, #454
-- [fix] Image with expanded props throws 'The prop must be a JSXAttribute collected by the AST parser.', #459
-- [fix] label-has-for: broken in v6.1.0, #455
-
-6.1.0 / 2018-06-26
-==================
-- [new] Support for eslint v5, #451
-- [new] aria-query updated to latest version
-- [new] eslint-config-airbnb-base updated to the latest version
-- [deprecate] The rule label-has-for is deprecated and replaced with label-has-associated-control
-- [fix] heading-has-content updated to work with custom components, #431
-- [fix] aria-errormessage prop is now a valid ARIA property, #424
-
-6.0.2 / 2017-06-28
-==================
-- [fix] Prefix directories in `.npmignore` with `/` so it only matches the top-level directory
-
-
-6.0.1 / 2017-06-28
-==================
-- [temporary] Remove `src` and `flow` from package to resolve flow issues for consuming packages.
-
-
-6.0.0 / 2017-06-05
-=================
-- [new] Add rule `anchor-is-valid`. See documentation for configuration options. Thanks @AlmeroSteyn.
-- [breaking] `href-no-hash` replaced with `anchor-is-valid` in the recommended and strict configs. Use the `invalidHref` aspect (active by default) in `anchor-is-valid` to continue to apply the behavior provided by `href-no-hash`.
-- [breaking] Removed support for ESLint peer dependency at version ^2.10.2.
-- [update] The rule `label-has-for` now allows inputs nested in label tags. Previously it was strict about requiring a `for` attribute. Thanks @ignatiusreza and @mjaltamirano.
-- [update] New configuration for `interactive-supports-focus`. Recommended and strict configs for now contain a trimmed-down whitelist of roles that will be checked.
-- [fix] Incompatibility between node version 4 and 5. Thanks @evilebottnawi.
-- [fix] Missing README entry for `media-has-caption`. Thanks @ismail-syed.
-- [fix] README updates explaining recommended and strict configs. Thanks @Donaldini.
-- [fix] Updated to aria-query@0.7.0, which includes new ARIA 1.1 properties. Previously, the `aria-props` rule incorrectly threw errors for these new properties.
-
-5.1.1 / 2017-07-03
-==================
- - [fix] revert v6 breaking changes unintentionally added in v5.1 (#283)
-
-5.1.0 / 2017-06-26
-==================
- - [new] Support eslint v4. (#267)
- - [new] `label-has-for`: add "required" option to allow customization (#240)
- - [new] add `anchor-is-valid` (#224)
- - [new] `interactive-supports-focus`: Split interactive supports focus into tabbable and focusable cases (#236)
- - [new] `anchor-is-valid`: add `aspects` option (#251)
- - [Deps] Bump aria-query to 0.7.0
-
-5.0.3 / 2017-05-16
-==================
-- [fix] Remove `flow` directory from `.npmignore` to accommodate explicit imports from `v5.0.2`.
-
-
-5.0.2 / 2017-05-16
-==================
-- [fix] Explicitly import flow types to resolve flow failures in consuming projects.
-
-
-5.0.1 / 2017-05-07
-==================
-- [fix] Polyfill Array.includes for node < 6 support.
-
-
-5.0.0 / 2017-05-05
-==================
-- [breaking] Refactor `img-has-alt` rule into `alt-text` rule
-- [breaking] Rule `onclick-has-role` is removed. Replaced with `no-static-element-interactions` and `no-noninteractive-element-interactions`.
-- [breaking] Rule `onclick-has-focus` is removed. Replaced with `interactive-supports-focus`.
-- [new] - Add rule `media-has-caption` rule
-- [new] - Add `ignoreNonDOM` option to `no-autofocus`.
-- [new] - Add rule `no-interactive-element-to-noninteractive-role`
-- [new] - Add rule `no-noninteractive-element-to-interactive-role`
-- [new] - Add rule `no-noninteractive-tabindex`
-- [new] - Configs split into "recommended" and "strict".
-- [enhanced] - Configuration options added to `no-static-element-interactions` and `no-noninteractive-element-interactions`. Options allow for fine-tuning of elements and event handlers to check.
-
-
-4.0.0 / 2017-02-04
-==================
-Add new rules:
-- `jsx-a11y/accessible-emoji`
-- `jsx-a11y/aria-activedescendant-has-tabindex`
-- `jsx-a11y/iframe-has-title`
-- `jsx-a11y/no-autofocus`
-- `jsx-a11y/no-distracting-elements` *(breaking: consolidated no-marquee and no-blink into this rule.)*
-- `jsx-a11y/no-redundant-roles`
-- [fix] - redundant-alt to only check full words
-- [docs] - Documentation upgrades across the board.
-- [new] - Add `ignoreNonDom`
-- [dev] - Add script to scaffold new rule creation.
-
-
-3.0.2 / 2016-12-14
-==================
-- [fix] - make `aria-invalid` values true and false pass for rule `aria-proptypes`
-
-3.0.1 / 2016-10-11
-==================
-- [breaking] - Update all rule schemas to accept objects. This allows a future schema expansion to not be a breaking change.
-- [breaking] - All rules with schemas that accepted a string OR array, now only allows an array.
-- [new] - `href-no-hash` accepts new schema property `specialLink` to check for custom `href` properties on elements. (fixes [#76](https://github.com/evcohen/eslint-plugin-jsx-a11y/issues/76))
-- [breaking][fix] - `img-has-alt` now prefers `alt=""` over `role="presentation"`. You can set both, but not just `role="presentation"` by itself to ensure a11y across all devices.
-
-Note - see [rule documentation](https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules) for updated schemas.
-
-2.2.3 / 2016-10-08
-==================
-- [fix] - Add `switch` aria role.
-- [devDependencies] - Updgrade dev dependencies and fix linting issues.
-
-
-2.2.2 / 2016-09-12
-==================
-- [fix] `x-has-content` rules now pass with children prop set.
-
-
-2.2.1 / 2016-08-31
-==================
-- [fix] Update `tablist` role to include missing property `aria-multiselectable`.
-
-
-2.2.0 / 2016-08-26
-==================
-- [new] Add `click-events-have-key-events` rule.
-- [new] Add `no-static-element-interactions` rule.
-- [devDependencies] Upgrade `eslint`, `eslint-config-airbnb`, `mocha` to latest.
-- [lint] Fix all new linting errors with upgrade
-- [nit] Use `error` syntax over `2` syntax in recommended config.
-
-
-2.1.0 / 2016-08-10
-==================
-- [fix] Require `aria-checked` for roles that are subclasses of `checkbox`
-- [new] Add `anchor-has-content` rule.
-- [refactor] Use new eslint rule syntax
-- [new] Add support for custom words in `img-redundant-alt` (mainly for i18n).
-
-
-2.0.1 / 2016-07-13
-==================
-- [fix] JSXElement support in expression handlers for prop types.
-- [fix] `heading-has-content`: dangerouslySetInnerHTML will pass.
-
-
-2.0.0 / 2016-07-12
-==================
-- [breaking] Scope `no-onchange` rule to select menu elements only.
-
-
-1.5.5 / 2016-07-05
-==================
-- [fix] Add `eslint` v3 as a `peerDependency`.
-
-
-1.5.4 / 2016-07-05
-==================
-- [fix] Add `eslint` as a `peerDependency`.
-
-
-1.5.3 / 2016-06-16
-==================
-- [fix] Fix crash when ``<ELEMENT role />`` for `role-supports-aria-props`.
-
-
-1.5.2 / 2016-06-16
-==================
-- [fix] Fix `img-redundant-alt` rule to use `getLiteralPropValue` from `jsx-ast-utils`.
-
-
-1.5.1 / 2016-06-16
-==================
-- [fix] Fix checking for undefined in `heading-has-content` for children content.
-
-
-1.5.0 / 2016-06-16
-==================
-- [new] Add [heading-has-content](docs/rules/heading-has-content.md) rule.
-- [new] Add [html-has-lang](docs/rules/html-has-lang.md) rule.
-- [new] Add [lang](docs/rules/lang.md) rule.
-- [new] Add [no-marquee](docs/rules/no-marquee.md) rule.
-- [new] Add [scope](docs/rules/scope.md) rule.
-
-
-1.4.2 / 2016-06-10
-==================
-- [new] Integrate with latest `jsx-ast-utils` to use `propName` function. More support for namespaced names on attributes and elements.
-
-
-1.4.1 / 2016-06-10
-==================
-- [fix] Handle spread props in `aria-unsupported-elements` and `role-supports-aria-props` when reporting.
-
-
-1.4.0 / 2016-06-10
-==================
-- [dependency] Integrate [jsx-ast-utils](https://github.com/evcohen/jsx-ast-utils)
-- [fix] Better error reporting for aria-unsupported-elements indicating which prop to remove.
-
-
-1.3.0 / 2016-06-05
-==================
-- [new] Spelling suggestions for incorrect `aria-*` props
-- [fix] Ensure `role` value is a string before converting to lowercase in `img-has-alt` rule.
-
-
-1.2.3 / 2016-06-02
-==================
-- [fix] Handle dynamic `tabIndex` expression values, but still retain validation logic for literal `tabIndex` values.
-
-
-1.2.2 / 2016-05-20
-==================
-- [fix] Fix checks involving the tabIndex attribute that do not account for integer literals
-
-
-1.2.1 / 2016-05-19
-==================
-- [fix] Avoid testing interactivity of wrapper components with same name but different casing
-as DOM elements (such as `Button` vs `button`).
-
-
-1.2.0 / 2016-05-06
-==================
-- [new] Import all roles from DPUB-ARIA.
-
-
-1.1.0 / 2016-05-06
-==================
-- [new] Add expression value handler for `BinaryExpression` type.
-- [new] Add expression value handler for `NewExpression` type.
-- [new] Add expression value handler for `ObjectExpression` type.
-- [fix] Throws error when getting an expression of type without a handler function.
-	- This is for more graceful error handling and better issue reporting.
-
-
-1.0.4 / 2016-04-28
-==================
-- [fix] Add expression value handler for `ConditionalExpression` type.
-
-
-1.0.3 / 2016-04-25
-==================
-- [fix] Fix typo in recommended rules for `onclick-has-focus`.
-
-
-1.0.2 / 2016-04-20
-==================
-- [fix] Add expression value handler for `ThisExpression` type.
-
-
-1.0.1 / 2016-04-19
-==================
-- [fix] Fix build to copy source JSON files to build output.
-
-
-1.0.0 / 2016-04-19
-==================
-- [breaking] Rename `img-uses-alt` to `img-has-alt`
-- [breaking] Rename `onlick-uses-role` to `onclick-has-role`
-- [breaking] Rename `mouse-events-map-to-key-events` to `mouse-events-have-key-events`
-- [breaking] Rename `use-onblur-not-onchange` to `no-onchange`
-- [breaking] Rename `label-uses-for` to `label-has-for`
-- [breaking] Rename `redundant-alt` to `img-redundant-alt`
-- [breaking] Rename `no-hash-href` to `href-no-hash`
-- [breaking] Rename `valid-aria-role` to `aria-role`
-
-- [new] Implement `aria-props` rule
-- [new] Implement `aria-proptypes` rule
-- [new] Implement `aria-unsupported-elements` rule
-- [new] Implement `onclick-has-focus` rule
-- [new] Implement `role-has-required-aria-props` rule
-- [new] Implement `role-supports-aria-props` rule
-- [new] Implement `tabindex-no-positive` rule
-
-
-0.6.2 / 2016-04-08
-==================
-- [fix] Fix rule details for img-uses-alt: allow alt="" or role="presentation".
-
-
-0.6.1 / 2016-04-07
-==================
-- [fix] Do not infer interactivity of components that are not low-level DOM elements.
-
-
-0.6.0 / 2016-04-06
-==================
-- [breaking] Allow alt="" when role="presentation" on img-uses-alt rule.
-- [new] More descriptive error messaging for img-uses-alt rule.
-
-
-0.5.2 / 2016-04-05
-==================
-- [fix] Handle token lists for valid-aria-role.
-
-
-0.5.1 / 2016-04-05
-==================
-- [fix] Handle null valued props for valid-aria-role.
-
-
-0.5.0 / 2016-04-02
-==================
-- [new] Implement valid-aria-role rule. Based on [AX_ARIA_01](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_aria_01)
-
-
-0.4.3 / 2016-03-29
-==================
-- [fix] Handle LogicalExpression attribute types when extracting values. LogicalExpressions are of form `<Component prop={foo || "foobar"} />`
-
-
-0.4.2 / 2016-03-24
-==================
-- [fix] Allow component names of form `Object.Property` i.e. `UX.Layout`
-
-
-0.3.0 / 2016-03-02
-==================
-- [new] Implement [no-hash-href](docs/rules/no-hash-href.md) rule.
-- [fix] Fixed TemplateLiteral AST value building to get more exact values from template strings.
-
-
-0.2.0 / 2016-03-01
-==================
-- [new] Implement [redunant-alt](docs/rules/redundant-alt.md) rule.
-
-
-0.1.2 / 2016-03-01
-==================
-- Initial pre-release.
diff --git a/node_modules/eslint-plugin-jsx-a11y/LICENSE.md b/node_modules/eslint-plugin-jsx-a11y/LICENSE.md
deleted file mode 100644
index a66c74b..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/LICENSE.md
+++ /dev/null
@@ -1,8 +0,0 @@
-The MIT License (MIT)
-Copyright (c) 2016 Ethan Cohen
-
-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/node_modules/eslint-plugin-jsx-a11y/README.md b/node_modules/eslint-plugin-jsx-a11y/README.md
deleted file mode 100644
index bc8c29f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/README.md
+++ /dev/null
@@ -1,298 +0,0 @@
-<p align="center">
-  <a href="https://travis-ci.org/evcohen/eslint-plugin-jsx-a11y">
-    <img src="https://api.travis-ci.org/evcohen/eslint-plugin-jsx-a11y.svg?branch=master"
-         alt="build status">
-  </a>
-  <a href="https://npmjs.org/package/eslint-plugin-jsx-a11y">
-    <img src="https://img.shields.io/npm/v/eslint-plugin-jsx-a11y.svg"
-         alt="npm version">
-  </a>
-  <a href="https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/LICENSE.md">
-    <img src="https://img.shields.io/npm/l/eslint-plugin-jsx-a11y.svg"
-         alt="license">
-  </a>
-  <a href='https://coveralls.io/github/evcohen/eslint-plugin-jsx-a11y?branch=master'>
-    <img src='https://coveralls.io/repos/github/evcohen/eslint-plugin-jsx-a11y/badge.svg?branch=master' alt='Coverage Status' />
-  </a>
-  <a href='https://npmjs.org/package/eslint-plugin-jsx-a11y'>
-    <img src='https://img.shields.io/npm/dt/eslint-plugin-jsx-a11y.svg'
-    alt='Total npm downloads' />
-  </a>
-</p>
-
-# eslint-plugin-jsx-a11y
-
-Static AST checker for accessibility rules on JSX elements.
-
-## Why?
-Ryan Florence built out this awesome runtime-analysis tool called [react-a11y](https://github.com/reactjs/react-a11y). It is super useful. However, since you're probably already using linting in your project, this plugin comes for free and closer to the actual development process. Pairing this plugin with an editor lint plugin, you can bake accessibility standards into your application in real-time.
-
-**Note**: This project does not *replace* react-a11y, but can and should be used in conjunction with it. Static analysis tools cannot determine values of variables that are being placed in props before runtime, so linting will not fail if that value is undefined and/or does not pass the lint rule.
-
-## Installation
-
-**If you are installing this plugin via `eslint-config-airbnb`, please follow [these instructions](https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb#eslint-config-airbnb-1).**
-
-You'll first need to install [ESLint](http://eslint.org):
-
-```sh
-# npm
-npm install eslint --save-dev
-
-# yarn
-yarn add eslint --dev
-```
-
-Next, install `eslint-plugin-jsx-a11y`:
-
-```sh
-# npm
-npm install eslint-plugin-jsx-a11y --save-dev
-
-# yarn
-yarn add eslint-plugin-jsx-a11y --dev
-```
-
-**Note:** If you installed ESLint globally (using the `-g` flag in npm, or the `global` prefix in yarn) then you must also install `eslint-plugin-jsx-a11y` globally.
-
-## Usage
-
-Add `jsx-a11y` to the plugins section of your `.eslintrc` configuration file. You can omit the `eslint-plugin-` prefix:
-
-```json
-{
-  "plugins": [
-    "jsx-a11y"
-  ]
-}
-```
-
-
-Then configure the rules you want to use under the rules section.
-
-```json
-{
-  "rules": {
-    "jsx-a11y/rule-name": 2
-  }
-}
-```
-
-
-You can also enable all the recommended or strict rules at once.
-Add `plugin:jsx-a11y/recommended` or `plugin:jsx-a11y/strict` in `extends`:
-
-```json
-{
-  "extends": [
-    "plugin:jsx-a11y/recommended"
-  ]
-}
-```
-
-## Supported Rules
-
-- [accessible-emoji](docs/rules/accessible-emoji.md): Enforce emojis are wrapped in <span> and provide screenreader access.
-- [alt-text](docs/rules/alt-text.md): Enforce all elements that require alternative text have meaningful information to relay back to end user.
-- [anchor-has-content](docs/rules/anchor-has-content.md): Enforce all anchors to contain accessible content.
-- [anchor-is-valid](docs/rules/anchor-is-valid.md): Enforce all anchors are valid, navigable elements.
-- [aria-activedescendant-has-tabindex](docs/rules/aria-activedescendant-has-tabindex.md): Enforce elements with aria-activedescendant are tabbable.
-- [aria-props](docs/rules/aria-props.md): Enforce all `aria-*` props are valid.
-- [aria-proptypes](docs/rules/aria-proptypes.md): Enforce ARIA state and property values are valid.
-- [aria-role](docs/rules/aria-role.md): Enforce that elements with ARIA roles must use a valid, non-abstract ARIA role.
-- [aria-unsupported-elements](docs/rules/aria-unsupported-elements.md): Enforce that elements that do not support ARIA roles, states, and properties do not have those attributes.
-- [click-events-have-key-events](docs/rules/click-events-have-key-events.md): Enforce a clickable non-interactive element has at least one keyboard event listener.
-- [heading-has-content](docs/rules/heading-has-content.md): Enforce heading (`h1`, `h2`, etc) elements contain accessible content.
-- [html-has-lang](docs/rules/html-has-lang.md): Enforce `<html>` element has `lang` prop.
-- [iframe-has-title](docs/rules/iframe-has-title.md): Enforce iframe elements have a title attribute.
-- [img-redundant-alt](docs/rules/img-redundant-alt.md): Enforce `<img>` alt prop does not contain the word "image", "picture", or "photo".
-- [interactive-supports-focus](docs/rules/interactive-supports-focus.md): Enforce that elements with interactive handlers like `onClick` must be focusable.
-- [label-has-associated-control](docs/rules/label-has-associated-control.md): Enforce that a `label` tag has a text label and an associated control.
-- [lang](docs/rules/lang.md): Enforce lang attribute has a valid value.
-- [media-has-caption](docs/rules/media-has-caption.md): Enforces that `<audio>` and `<video>` elements must have a `<track>` for captions.
-- [mouse-events-have-key-events](docs/rules/mouse-events-have-key-events.md): Enforce that `onMouseOver`/`onMouseOut` are accompanied by `onFocus`/`onBlur` for keyboard-only users.
-- [no-access-key](docs/rules/no-access-key.md): Enforce that the `accessKey` prop is not used on any element to avoid complications with keyboard commands used by a screenreader.
-- [no-autofocus](docs/rules/no-autofocus.md): Enforce autoFocus prop is not used.
-- [no-distracting-elements](docs/rules/no-distracting-elements.md): Enforce distracting elements are not used.
-- [no-interactive-element-to-noninteractive-role](docs/rules/no-interactive-element-to-noninteractive-role.md): Interactive elements should not be assigned non-interactive roles.
-- [no-noninteractive-element-interactions](docs/rules/no-noninteractive-element-interactions.md): Non-interactive elements should not be assigned mouse or keyboard event listeners.
-- [no-noninteractive-element-to-interactive-role](docs/rules/no-noninteractive-element-to-interactive-role.md): Non-interactive elements should not be assigned interactive roles.
-- [no-noninteractive-tabindex](docs/rules/no-noninteractive-tabindex.md): `tabIndex` should only be declared on interactive elements.
-- [no-onchange](docs/rules/no-onchange.md): Enforce usage of `onBlur` over `onChange` on select menus for accessibility.
-- [no-redundant-roles](docs/rules/no-redundant-roles.md): Enforce explicit role property is not the same as implicit/default role property on element.
-- [no-static-element-interactions](docs/rules/no-static-element-interactions.md): Enforce that non-interactive, visible elements (such as `<div>`) that have click handlers use the role attribute.
-- [role-has-required-aria-props](docs/rules/role-has-required-aria-props.md): Enforce that elements with ARIA roles must have all required attributes for that role.
-- [role-supports-aria-props](docs/rules/role-supports-aria-props.md): Enforce that elements with explicit or implicit roles defined contain only `aria-*` properties supported by that `role`.
-- [scope](docs/rules/scope.md): Enforce `scope` prop is only used on `<th>` elements.
-- [tabindex-no-positive](docs/rules/tabindex-no-positive.md): Enforce `tabIndex` value is not greater than zero.
-
-### Difference between 'recommended' and 'strict' mode
-
-Rule | Recommended | Strict
------------- | ------------- | -------------
-[accessible-emoji](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/accessible-emoji.md) | error | error
-[alt-text](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/alt-text.md) | error | error
-[anchor-has-content](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-has-content.md) | error | error
-[anchor-is-valid](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md) | error | error
-[aria-activedescendant-has-tabindex](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-activedescendant-has-tabindex.md) | error | error
-[aria-props](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-props.md) | error | error
-[aria-proptypes](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-proptypes.md) | error | error
-[aria-role](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-role.md) | error | error
-[aria-unsupported-elements](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/aria-unsupported-elements.md) | error | error
-[click-events-have-key-events](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/click-events-have-key-events.md) | error | error
-[heading-has-content](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/heading-has-content.md) | error | error
-[html-has-lang](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/html-has-lang.md) | error | error
-[iframe-has-title](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/iframe-has-title.md) | error | error
-[img-redundant-alt](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/img-redundant-alt.md) | error | error
-[interactive-supports-focus](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/interactive-supports-focus.md) | error | error
-[label-has-associated-control](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/label-has-associated-control.md) | error | error
-[media-has-caption](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/media-has-caption.md) | error | error
-[mouse-events-have-key-events](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/mouse-events-have-key-events.md) | error | error
-[no-access-key](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-access-key.md) | error | error
-[no-autofocus](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-autofocus.md) | error | error
-[no-distracting-elements](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-distracting-elements.md) | error | error
-[no-interactive-element-to-noninteractive-role](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-interactive-element-to-noninteractive-role.md) | error, with options | error
-[no-noninteractive-element-interactions](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-noninteractive-element-interactions.md) | error, with options | error
-[no-noninteractive-element-to-interactive-role](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-noninteractive-element-to-interactive-role.md) | error, with options | error
-[no-noninteractive-tabindex](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-noninteractive-tabindex.md) | error, with options | error
-[no-onchange](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-onchange.md) | error | error
-[no-redundant-roles](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-redundant-roles.md) | error | error
-[no-static-element-interactions](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-static-element-interactions.md) | error, with options | error
-[role-has-required-aria-props](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/role-has-required-aria-props.md) | error | error
-[role-supports-aria-props](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/role-supports-aria-props.md) | error | error
-[scope](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/scope.md) | error, with options | error
-[tabindex-no-positive](https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/tabindex-no-positive.md) | error | error
-
-
-The following rules have extra options when in *recommended* mode:
-
-#### no-interactive-element-to-noninteractive-role
-```
-'jsx-a11y/no-interactive-element-to-noninteractive-role': [
-  'error',
-  {
-    tr: ['none', 'presentation'],
-  },
-]
-```
-
-#### no-noninteractive-element-interactions
-```
-'jsx-a11y/no-noninteractive-element-interactions': [
-  'error',
-  {
-    handlers: [
-      'onClick',
-      'onMouseDown',
-      'onMouseUp',
-      'onKeyPress',
-      'onKeyDown',
-      'onKeyUp',
-    ],
-  },
-]
-```
-
-#### no-noninteractive-element-to-interactive-role
-```
-'jsx-a11y/no-noninteractive-element-to-interactive-role': [
-  'error',
-  {
-    ul: [
-      'listbox',
-      'menu',
-      'menubar',
-      'radiogroup',
-      'tablist',
-      'tree',
-      'treegrid',
-    ],
-    ol: [
-      'listbox',
-      'menu',
-      'menubar',
-      'radiogroup',
-      'tablist',
-      'tree',
-      'treegrid',
-    ],
-    li: ['menuitem', 'option', 'row', 'tab', 'treeitem'],
-    table: ['grid'],
-    td: ['gridcell'],
-  },
-]
-```
-
-#### no-noninteractive-tabindex
-```
-'jsx-a11y/no-noninteractive-tabindex': [
-  'error',
-  {
-    tags: [],
-    roles: ['tabpanel'],
-  },
-]
-```
-
-#### no-static-element-interactions
-```
-'jsx-a11y/no-noninteractive-element-interactions': [
-  'error',
-  {
-    handlers: [
-      'onClick',
-      'onMouseDown',
-      'onMouseUp',
-      'onKeyPress',
-      'onKeyDown',
-      'onKeyUp',
-    ],
-  },
-]
-```
-
-## Creating a new rule
-
-If you are developing new rules for this project, you can use the `create-rule`
-script to scaffold the new files.
-
-```
-$ ./scripts/create-rule.js my-new-rule
-```
-
-## Some background on WAI-ARIA, the AX Tree and Browsers
-
-### Accessibility API
-An operating system will provide an accessibility API that maps application state and content onto input/output controllers such as a screen reader, braille device, keyboard, etc.
-
-These APIs were developed as computer interfaces shifted from buffers (which are text-based and inherently quite accessible) to graphical user interfaces (GUIs). The first attempts to make GUIs accessible involved raster image parsing to recognize characters, words, etc. This information was stored in a parallel buffer and made accessible to assistive technology (AT) devices.
-
-As GUIs became more complex, the raster parsing approach became untenable. Accessibility APIs were developed to replace them. Check out [NSAccessibility (AXAPI)](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Protocols/NSAccessibility_Protocol/index.html) for an example. See [Core Accessibility API Mappings 1.1](https://www.w3.org/TR/core-aam-1.1/) for more details.
-
-### Browsers
-Browsers support an Accessibility API on a per operating system basis. For instance, Firefox implements the MSAA accessibility API on Windows, but does not implement the AXAPI on OSX.
-
-### The Accessibility (AX) Tree & DOM
-From the [W3 Core Accessibility API Mappings 1.1](https://www.w3.org/TR/core-aam-1.1/#intro_treetypes)
-
-> The accessibility tree and the DOM tree are parallel structures. Roughly speaking the accessibility tree is a subset of the DOM tree. It includes the user interface objects of the user agent and the objects of the document. Accessible objects are created in the accessibility tree for every DOM element that should be exposed to assistive technology, either because it may fire an accessibility event or because it has a property, relationship or feature which needs to be exposed. Generally, if something can be trimmed out it will be, for reasons of performance and simplicity. For example, a <span> with just a style change and no semantics may not get its own accessible object, but the style change will be exposed by other means.
-
-Browser vendors are beginning to expose the AX Tree through inspection tools. Chrome has an experiment available to enable their inspection tool.
-
-You can also see a text-based version of the AX Tree in Chrome in the stable release version.
-
-#### Viewing the AX Tree in Chrome
-  1. Navigate to `chrome://accessibility/` in Chrome.
-  1. Toggle the `accessibility off` link for any tab that you want to inspect.
-  1. A link labeled `show accessibility tree` will appear; click this link.
-  1. Balk at the wall of text that gets displayed, but then regain your conviction.
-  1. Use the browser's find command to locate strings and values in the wall of text.
-
-### Pulling it all together
-A browser constructs an AX Tree as a subset of the DOM. ARIA heavily informs the properties of this AX Tree. This AX Tree is exposed to the system level Accessibility API which mediates assistive technology agents.
-
-We model ARIA in the [aria-query](https://github.com/a11yance/aria-query) project. We model AXObjects (that comprise the AX Tree) in the [axobject-query](https://github.com/A11yance/axobject-query) project. The goal of the WAI-ARIA specification is to be a complete declarative interface to the AXObject model. The [in-draft 1.2 version](https://github.com/w3c/aria/issues?q=is%3Aissue+is%3Aopen+label%3A%22ARIA+1.2%22) is moving towards this goal. But until then, we must consider the semantics constructs afforded by ARIA as well as those afforded by the AXObject model (AXAPI) in order to determine how HTML can be used to express user interface affordances to assistive technology users.
-
-## License
-
-eslint-plugin-jsx-a11y is licensed under the [MIT License](LICENSE.md).
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/__mocks__/IdentifierMock.js b/node_modules/eslint-plugin-jsx-a11y/__mocks__/IdentifierMock.js
deleted file mode 100644
index 2b51c72..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__mocks__/IdentifierMock.js
+++ /dev/null
@@ -1,6 +0,0 @@
-export default function IdentifierMock(ident) {
-  return {
-    type: 'Identifier',
-    name: ident,
-  };
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXAttributeMock.js b/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXAttributeMock.js
deleted file mode 100644
index 50fc4f2..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXAttributeMock.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import toAST from 'to-ast'; // eslint-disable-line import/no-extraneous-dependencies
-import JSXExpressionContainerMock from './JSXExpressionContainerMock';
-
-export default function JSXAttributeMock(prop, value, isExpressionContainer = false) {
-  let astValue;
-  if (value && value.type !== undefined) {
-    astValue = value;
-  } else {
-    astValue = toAST(value);
-  }
-  let attributeValue = astValue;
-  if (isExpressionContainer || astValue.type !== 'Literal') {
-    attributeValue = JSXExpressionContainerMock(astValue);
-  }
-
-  return {
-    type: 'JSXAttribute',
-    name: {
-      type: 'JSXIdentifier',
-      name: prop,
-    },
-    value: attributeValue,
-  };
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXElementMock.js b/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXElementMock.js
deleted file mode 100644
index 1cc05af..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXElementMock.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * @flow
- */
-
-import JSXAttributeMock from './JSXAttributeMock';
-
-export type TJSXElementMock = {
-  type: 'JSXElement',
-  openingElement: {
-    type: 'JSXOpeningElement',
-    name: {
-      type: 'JSXIdentifier',
-      name: string,
-    },
-    attributes: Array<JSXAttributeMock>,
-  },
-  children: Array<Node>,
-};
-
-export default function JSXElementMock(
-  tagName: string,
-  attributes: Array<JSXAttributeMock> = [],
-  children: Array<Node> = [],
-): TJSXElementMock {
-  return {
-    type: 'JSXElement',
-    openingElement: {
-      type: 'JSXOpeningElement',
-      name: {
-        type: 'JSXIdentifier',
-        name: tagName,
-      },
-      attributes,
-    },
-    children,
-  };
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXExpressionContainerMock.js b/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXExpressionContainerMock.js
deleted file mode 100644
index 7f15af5..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXExpressionContainerMock.js
+++ /dev/null
@@ -1,6 +0,0 @@
-export default function JSXExpressionContainerMock(exp) {
-  return {
-    type: 'JSXExpressionContainer',
-    expression: exp,
-  };
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXSpreadAttributeMock.js b/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXSpreadAttributeMock.js
deleted file mode 100644
index a11cc41..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXSpreadAttributeMock.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * @flow
- */
-
-import IdentifierMock from './IdentifierMock';
-
-export default function JSXSpreadAttributeMock(identifier: string) {
-  return {
-    type: 'JSXSpreadAttribute',
-    argument: IdentifierMock(identifier),
-  };
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXTextMock.js b/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXTextMock.js
deleted file mode 100644
index f94a12b..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__mocks__/JSXTextMock.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * @flow
- */
-export default function JSXTextMock(value: string) {
-  return {
-    type: 'JSXText',
-    value,
-    raw: value,
-  };
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/__mocks__/LiteralMock.js b/node_modules/eslint-plugin-jsx-a11y/__mocks__/LiteralMock.js
deleted file mode 100644
index 24f885c..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__mocks__/LiteralMock.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * @flow
- */
-export default function LiteralMock(value: string) {
-  return {
-    type: 'Literal',
-    value,
-    raw: value,
-  };
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/__mocks__/genInteractives.js b/node_modules/eslint-plugin-jsx-a11y/__mocks__/genInteractives.js
deleted file mode 100644
index 9ddf507..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__mocks__/genInteractives.js
+++ /dev/null
@@ -1,206 +0,0 @@
-/**
- * @flow
- */
-
-import { dom, roles } from 'aria-query';
-import includes from 'array-includes';
-import JSXAttributeMock from './JSXAttributeMock';
-import JSXElementMock from './JSXElementMock';
-
-import type { TJSXElementMock } from './JSXElementMock';
-
-const domElements = [...dom.keys()];
-const roleNames = [...roles.keys()];
-
-const interactiveElementsMap = {
-  a: [{ prop: 'href', value: '#' }],
-  area: [{ prop: 'href', value: '#' }],
-  audio: [],
-  button: [],
-  canvas: [],
-  embed: [],
-  label: [],
-  link: [],
-  input: [],
-  'input[type="button"]': [{ prop: 'type', value: 'button' }],
-  'input[type="checkbox"]': [{ prop: 'type', value: 'checkbox' }],
-  'input[type="color"]': [{ prop: 'type', value: 'color' }],
-  'input[type="date"]': [{ prop: 'type', value: 'date' }],
-  'input[type="datetime"]': [{ prop: 'type', value: 'datetime' }],
-  'input[type="email"]': [{ prop: 'type', value: 'email' }],
-  'input[type="file"]': [{ prop: 'type', value: 'file' }],
-  'input[type="image"]': [{ prop: 'type', value: 'image' }],
-  'input[type="month"]': [{ prop: 'type', value: 'month' }],
-  'input[type="number"]': [{ prop: 'type', value: 'number' }],
-  'input[type="password"]': [{ prop: 'type', value: 'password' }],
-  'input[type="radio"]': [{ prop: 'type', value: 'radio' }],
-  'input[type="range"]': [{ prop: 'type', value: 'range' }],
-  'input[type="reset"]': [{ prop: 'type', value: 'reset' }],
-  'input[type="search"]': [{ prop: 'type', value: 'search' }],
-  'input[type="submit"]': [{ prop: 'type', value: 'submit' }],
-  'input[type="tel"]': [{ prop: 'type', value: 'tel' }],
-  'input[type="text"]': [{ prop: 'type', value: 'text' }],
-  'input[type="time"]': [{ prop: 'type', value: 'time' }],
-  'input[type="url"]': [{ prop: 'type', value: 'url' }],
-  'input[type="week"]': [{ prop: 'type', value: 'week' }],
-  menuitem: [],
-  option: [],
-  select: [],
-  // Whereas ARIA makes a distinction between cell and gridcell, the AXObject
-  // treats them both as CellRole and since gridcell is interactive, we consider
-  // cell interactive as well.
-  // td: [],
-  th: [],
-  tr: [],
-  textarea: [],
-  video: [],
-};
-
-const nonInteractiveElementsMap = {
-  abbr: [],
-  article: [],
-  blockquote: [],
-  br: [],
-  caption: [],
-  dd: [],
-  details: [],
-  dfn: [],
-  dialog: [],
-  dir: [],
-  dl: [],
-  dt: [],
-  fieldset: [],
-  figcaption: [],
-  figure: [],
-  footer: [],
-  form: [],
-  frame: [],
-  h1: [],
-  h2: [],
-  h3: [],
-  h4: [],
-  h5: [],
-  h6: [],
-  hr: [],
-  iframe: [],
-  img: [],
-  legend: [],
-  li: [],
-  main: [],
-  mark: [],
-  marquee: [],
-  menu: [],
-  meter: [],
-  nav: [],
-  ol: [],
-  p: [],
-  pre: [],
-  progress: [],
-  ruby: [],
-  section: [],
-  table: [],
-  tbody: [],
-  td: [],
-  tfoot: [],
-  thead: [],
-  time: [],
-  ul: [],
-};
-
-const indeterminantInteractiveElementsMap = domElements.reduce(
-  (accumulator: { [key: string]: Array<any> }, name: string): { [key: string]: Array<any> } => ({
-    ...accumulator,
-    [name]: [],
-  }),
-  {},
-);
-
-Object.keys(interactiveElementsMap)
-  .concat(Object.keys(nonInteractiveElementsMap))
-  .forEach((name: string) => delete indeterminantInteractiveElementsMap[name]);
-
-const abstractRoles = roleNames.filter(role => roles.get(role).abstract);
-
-const nonAbstractRoles = roleNames.filter(role => !roles.get(role).abstract);
-
-const interactiveRoles = []
-  .concat(
-    roleNames,
-    // 'toolbar' does not descend from widget, but it does support
-    // aria-activedescendant, thus in practice we treat it as a widget.
-    'toolbar',
-  )
-  .filter(role => !roles.get(role).abstract)
-  .filter(role => roles.get(role).superClass.some(klasses => includes(klasses, 'widget')));
-
-const nonInteractiveRoles = roleNames
-  .filter(role => !roles.get(role).abstract)
-  .filter(role => !roles.get(role).superClass.some(klasses => includes(klasses, 'widget')))
-  // 'toolbar' does not descend from widget, but it does support
-  // aria-activedescendant, thus in practice we treat it as a widget.
-  .filter(role => !includes(['toolbar'], role));
-
-export function genElementSymbol(openingElement: Object) {
-  return (
-    openingElement.name.name + (openingElement.attributes.length > 0
-      ? `${openingElement.attributes
-        .map(attr => `[${attr.name.name}="${attr.value.value}"]`)
-        .join('')}`
-      : ''
-    )
-  );
-}
-
-export function genInteractiveElements(): Array<TJSXElementMock> {
-  return Object.keys(interactiveElementsMap).map((elementSymbol: string): TJSXElementMock => {
-    const bracketIndex = elementSymbol.indexOf('[');
-    let name = elementSymbol;
-    if (bracketIndex > -1) {
-      name = elementSymbol.slice(0, bracketIndex);
-    }
-    const attributes = interactiveElementsMap[elementSymbol].map(({ prop, value }) => JSXAttributeMock(prop, value));
-    return JSXElementMock(name, attributes);
-  });
-}
-
-export function genInteractiveRoleElements(): Array<TJSXElementMock> {
-  return [...interactiveRoles, 'button article', 'fakerole button article'].map((value): TJSXElementMock => JSXElementMock(
-    'div',
-    [JSXAttributeMock('role', value)],
-  ));
-}
-
-export function genNonInteractiveElements(): Array<TJSXElementMock> {
-  return Object.keys(nonInteractiveElementsMap).map((elementSymbol): TJSXElementMock => {
-    const bracketIndex = elementSymbol.indexOf('[');
-    let name = elementSymbol;
-    if (bracketIndex > -1) {
-      name = elementSymbol.slice(0, bracketIndex);
-    }
-    const attributes = nonInteractiveElementsMap[elementSymbol].map(({ prop, value }) => JSXAttributeMock(prop, value));
-    return JSXElementMock(name, attributes);
-  });
-}
-
-export function genNonInteractiveRoleElements() {
-  return [
-    ...nonInteractiveRoles,
-    'article button',
-    'fakerole article button',
-  ].map(value => JSXElementMock('div', [JSXAttributeMock('role', value)]));
-}
-
-export function genAbstractRoleElements() {
-  return abstractRoles.map(value => JSXElementMock('div', [JSXAttributeMock('role', value)]));
-}
-
-export function genNonAbstractRoleElements() {
-  return nonAbstractRoles.map(value => JSXElementMock('div', [JSXAttributeMock('role', value)]));
-}
-
-export function genIndeterminantInteractiveElements(): Array<TJSXElementMock> {
-  return Object.keys(indeterminantInteractiveElementsMap).map((name) => {
-    const attributes = indeterminantInteractiveElementsMap[name].map(({ prop, value }): TJSXElementMock => JSXAttributeMock(prop, value));
-    return JSXElementMock(name, attributes);
-  });
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/__util__/parserOptionsMapper.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/__util__/parserOptionsMapper.js
deleted file mode 100644
index c3d2f77..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/__util__/parserOptionsMapper.js
+++ /dev/null
@@ -1,24 +0,0 @@
-const defaultParserOptions = {
-  ecmaVersion: 2018,
-  ecmaFeatures: {
-    experimentalObjectRestSpread: true,
-    jsx: true,
-  },
-};
-
-export default function parserOptionsMapper({
-  code,
-  errors,
-  options = [],
-  parserOptions = {},
-}) {
-  return {
-    code,
-    errors,
-    options,
-    parserOptions: {
-      ...defaultParserOptions,
-      ...parserOptions,
-    },
-  };
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/__util__/ruleOptionsMapperFactory.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/__util__/ruleOptionsMapperFactory.js
deleted file mode 100644
index 5f50608..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/__util__/ruleOptionsMapperFactory.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * @flow
- */
-
-type ESLintTestRunnerTestCase = {
-  code: string,
-  errors: ?Array<{ message: string, type: string }>,
-  options: ?Array<mixed>,
-  parserOptions: ?Array<mixed>
-};
-
-export default function ruleOptionsMapperFactory(ruleOptions: Array<mixed> = []) {
-  // eslint-disable-next-line
-  return ({ code, errors, options, parserOptions }: ESLintTestRunnerTestCase): ESLintTestRunnerTestCase => {
-    return {
-      code,
-      errors,
-      // Flatten the array of objects in an array of one object.
-      options: (options || []).concat(ruleOptions).reduce((acc, item) => [{
-        ...acc[0],
-        ...item,
-      }], [{}]),
-      parserOptions,
-    };
-  };
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/index-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/index-test.js
deleted file mode 100644
index 94ed70f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/index-test.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/* eslint-env jest */
-/* eslint global-require: 0 */
-
-import assert from 'assert';
-import fs from 'fs';
-import path from 'path';
-import plugin from '../src';
-
-const rules = fs.readdirSync(path.resolve(__dirname, '../src/rules/'))
-  .map(f => path.basename(f, '.js'));
-
-describe('all rule files should be exported by the plugin', () => {
-  rules.forEach((ruleName) => {
-    it(`should export ${ruleName}`, () => {
-      assert.equal(
-        plugin.rules[ruleName],
-        require(path.join('../src/rules', ruleName)) // eslint-disable-line
-      );
-    });
-  });
-});
-
-describe('configurations', () => {
-  it('should export a \'recommended\' configuration', () => {
-    assert(plugin.configs.recommended);
-  });
-});
-
-describe('schemas', () => {
-  rules.forEach((ruleName) => {
-    it(`${ruleName} should export a schema with type object`, () => {
-      const rule = require(path.join('../src/rules', ruleName)); // eslint-disable-line
-      const schema = rule.meta && rule.meta.schema && rule.meta.schema[0];
-      const { type } = schema;
-
-      assert.deepEqual(type, 'object');
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/accessible-emoji-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/accessible-emoji-test.js
deleted file mode 100644
index 133f169..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/accessible-emoji-test.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce <marquee> elements are not used.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/accessible-emoji';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: 'Emojis should be wrapped in <span>, have role="img", and have an accessible description with aria-label or aria-labelledby.',
-  type: 'JSXOpeningElement',
-};
-
-ruleTester.run('accessible-emoji', rule, {
-  valid: [
-    { code: '<div />;' },
-    { code: '<span />' },
-    { code: '<span>No emoji here!</span>' },
-    { code: '<span role="img" aria-label="Panda face">🐼</span>' },
-    { code: '<span role="img" aria-label="Snowman">&#9731;</span>' },
-    { code: '<span role="img" aria-labelledby="id1">🐼</span>' },
-    { code: '<span role="img" aria-labelledby="id1">&#9731;</span>' },
-    { code: '<span role="img" aria-labelledby="id1" aria-label="Snowman">&#9731;</span>' },
-    { code: '<span>{props.emoji}</span>' },
-    { code: '<span aria-hidden>{props.emoji}</span>' },
-    { code: '<span aria-hidden="true">🐼</span>' },
-    { code: '<span aria-hidden>🐼</span>' },
-    { code: '<div aria-hidden="true">🐼</div>' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<span>🐼</span>', errors: [expectedError] },
-    { code: '<span>foo🐼bar</span>', errors: [expectedError] },
-    { code: '<span>foo 🐼 bar</span>', errors: [expectedError] },
-    { code: '<i role="img" aria-label="Panda face">🐼</i>', errors: [expectedError] },
-    { code: '<i role="img" aria-labelledby="id1">🐼</i>', errors: [expectedError] },
-    { code: '<Foo>🐼</Foo>', errors: [expectedError] },
-    { code: '<span aria-hidden="false">🐼</span>', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/alt-text-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/alt-text-test.js
deleted file mode 100644
index 9ae6ade..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/alt-text-test.js
+++ /dev/null
@@ -1,248 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce all elements that require alternative text have it.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/alt-text';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const missingPropError = type => ({
-  message: `${type} elements must have an alt prop, either with meaningful text, or an empty string for decorative images.`,
-  type: 'JSXOpeningElement',
-});
-
-const altValueError = type => ({
-  message: `Invalid alt value for ${type}. \
-Use alt="" for presentational images.`,
-  type: 'JSXOpeningElement',
-});
-
-const preferAltError = () => ({
-  message: 'Prefer alt="" over a presentational role. First rule of aria is to not use aria if it can be achieved via native HTML.',
-  type: 'JSXOpeningElement',
-});
-
-const objectError = 'Embedded <object> elements must have alternative text by providing inner text, aria-label or aria-labelledby props.';
-
-const areaError = 'Each area of an image map must have a text alternative through the `alt`, `aria-label`, or `aria-labelledby` prop.';
-
-const inputImageError = '<input> elements with type="image" must have a text alternative through the `alt`, `aria-label`, or `aria-labelledby` prop.';
-
-const array = [{
-  img: ['Thumbnail', 'Image'],
-  object: ['Object'],
-  area: ['Area'],
-  'input[type="image"]': ['InputImage'],
-}];
-
-
-ruleTester.run('alt-text', rule, {
-  valid: [
-    // DEFAULT ELEMENT 'img' TESTS
-    { code: '<img alt="foo" />;' },
-    { code: '<img alt={"foo"} />;' },
-    { code: '<img alt={alt} />;' },
-    { code: '<img ALT="foo" />;' },
-    { code: '<img ALT={`This is the ${alt} text`} />;' },
-    { code: '<img ALt="foo" />;' },
-    { code: '<img alt="foo" salt={undefined} />;' },
-    { code: '<img {...this.props} alt="foo" />' },
-    { code: '<a />' },
-    { code: '<div />' },
-    { code: '<img alt={function(e) {} } />' },
-    { code: '<div alt={function(e) {} } />' },
-    { code: '<img alt={() => void 0} />' },
-    { code: '<IMG />' },
-    { code: '<UX.Layout>test</UX.Layout>' },
-    { code: '<img alt={alt || "Alt text" } />' },
-    { code: '<img alt={photo.caption} />;' },
-    { code: '<img alt={bar()} />;' },
-    { code: '<img alt={foo.bar || ""} />' },
-    { code: '<img alt={bar() || ""} />' },
-    { code: '<img alt={foo.bar() || ""} />' },
-    { code: '<img alt="" />' },
-    { code: '<img alt={`${undefined}`} />' },
-    { code: '<img alt=" " />' },
-    { code: '<img alt="" role="presentation" />' },
-    { code: '<img alt="" role="none" />' },
-    { code: '<img alt="" role={`presentation`} />' },
-    { code: '<img alt="" role={"presentation"} />' },
-    { code: '<img alt="this is lit..." role="presentation" />' },
-    { code: '<img alt={error ? "not working": "working"} />' },
-    { code: '<img alt={undefined ? "working": "not working"} />' },
-    { code: '<img alt={plugin.name + " Logo"} />' },
-
-    // DEFAULT <object> TESTS
-    { code: '<object aria-label="foo" />' },
-    { code: '<object aria-labelledby="id1" />' },
-    { code: '<object>Foo</object>' },
-    { code: '<object><p>This is descriptive!</p></object>' },
-    { code: '<Object />' },
-    { code: '<object title="An object" />' },
-
-    // DEFAULT <area> TESTS
-    { code: '<area aria-label="foo" />' },
-    { code: '<area aria-labelledby="id1" />' },
-    { code: '<area alt="" />' },
-    { code: '<area alt="This is descriptive!" />' },
-    { code: '<area alt={altText} />' },
-    { code: '<Area />' },
-
-    // DEFAULT <input type="image"> TESTS
-    { code: '<input />' },
-    { code: '<input type="foo" />' },
-    { code: '<input type="image" aria-label="foo" />' },
-    { code: '<input type="image" aria-labelledby="id1" />' },
-    { code: '<input type="image" alt="" />' },
-    { code: '<input type="image" alt="This is descriptive!" />' },
-    { code: '<input type="image" alt={altText} />' },
-    { code: '<InputImage />' },
-
-    // CUSTOM ELEMENT TESTS FOR ARRAY OPTION TESTS
-    { code: '<Thumbnail alt="foo" />;', options: array },
-    { code: '<Thumbnail alt={"foo"} />;', options: array },
-    { code: '<Thumbnail alt={alt} />;', options: array },
-    { code: '<Thumbnail ALT="foo" />;', options: array },
-    { code: '<Thumbnail ALT={`This is the ${alt} text`} />;', options: array },
-    { code: '<Thumbnail ALt="foo" />;', options: array },
-    { code: '<Thumbnail alt="foo" salt={undefined} />;', options: array },
-    { code: '<Thumbnail {...this.props} alt="foo" />', options: array },
-    { code: '<thumbnail />', options: array },
-    { code: '<Thumbnail alt={function(e) {} } />', options: array },
-    { code: '<div alt={function(e) {} } />', options: array },
-    { code: '<Thumbnail alt={() => void 0} />', options: array },
-    { code: '<THUMBNAIL />', options: array },
-    { code: '<Thumbnail alt={alt || "foo" } />', options: array },
-    { code: '<Image alt="foo" />;', options: array },
-    { code: '<Image alt={"foo"} />;', options: array },
-    { code: '<Image alt={alt} />;', options: array },
-    { code: '<Image ALT="foo" />;', options: array },
-    { code: '<Image ALT={`This is the ${alt} text`} />;', options: array },
-    { code: '<Image ALt="foo" />;', options: array },
-    { code: '<Image alt="foo" salt={undefined} />;', options: array },
-    { code: '<Image {...this.props} alt="foo" />', options: array },
-    { code: '<image />', options: array },
-    { code: '<Image alt={function(e) {} } />', options: array },
-    { code: '<div alt={function(e) {} } />', options: array },
-    { code: '<Image alt={() => void 0} />', options: array },
-    { code: '<IMAGE />', options: array },
-    { code: '<Image alt={alt || "foo" } />', options: array },
-    { code: '<Object aria-label="foo" />', options: array },
-    { code: '<Object aria-labelledby="id1" />', options: array },
-    { code: '<Object>Foo</Object>', options: array },
-    { code: '<Object><p>This is descriptive!</p></Object>', options: array },
-    { code: '<Object title="An object" />', options: array },
-    { code: '<Area aria-label="foo" />', options: array },
-    { code: '<Area aria-labelledby="id1" />', options: array },
-    { code: '<Area alt="" />', options: array },
-    { code: '<Area alt="This is descriptive!" />', options: array },
-    { code: '<Area alt={altText} />', options: array },
-    { code: '<InputImage aria-label="foo" />', options: array },
-    { code: '<InputImage aria-labelledby="id1" />', options: array },
-    { code: '<InputImage alt="" />', options: array },
-    { code: '<InputImage alt="This is descriptive!" />', options: array },
-    { code: '<InputImage alt={altText} />', options: array },
-  ].map(parserOptionsMapper),
-  invalid: [
-    // DEFAULT ELEMENT 'img' TESTS
-    { code: '<img />;', errors: [missingPropError('img')] },
-    { code: '<img alt />;', errors: [altValueError('img')] },
-    { code: '<img alt={undefined} />;', errors: [altValueError('img')] },
-    { code: '<img src="xyz" />', errors: [missingPropError('img')] },
-    { code: '<img role />', errors: [missingPropError('img')] },
-    { code: '<img {...this.props} />', errors: [missingPropError('img')] },
-    { code: '<img alt={false || false} />', errors: [altValueError('img')] },
-    { code: '<img alt={undefined} role="presentation" />;', errors: [altValueError('img')] },
-    { code: '<img alt role="presentation" />;', errors: [altValueError('img')] },
-    { code: '<img role="presentation" />;', errors: [preferAltError()] },
-    { code: '<img role="none" />;', errors: [preferAltError()] },
-
-    // DEFAULT ELEMENT 'object' TESTS
-    { code: '<object />', errors: [objectError] },
-    { code: '<object><div aria-hidden /></object>', errors: [objectError] },
-    { code: '<object title={undefined} />', errors: [objectError] },
-
-    // DEFAULT ELEMENT 'area' TESTS
-    { code: '<area />', errors: [areaError] },
-    { code: '<area alt />', errors: [areaError] },
-    { code: '<area alt={undefined} />', errors: [areaError] },
-    { code: '<area src="xyz" />', errors: [areaError] },
-    { code: '<area {...this.props} />', errors: [areaError] },
-
-    // DEFAULT ELEMENT 'input type="image"' TESTS
-    { code: '<input type="image" />', errors: [inputImageError] },
-    { code: '<input type="image" alt />', errors: [inputImageError] },
-    { code: '<input type="image" alt={undefined} />', errors: [inputImageError] },
-    { code: '<input type="image">Foo</input>', errors: [inputImageError] },
-    { code: '<input type="image" {...this.props} />', errors: [inputImageError] },
-
-    // CUSTOM ELEMENT TESTS FOR ARRAY OPTION TESTS
-    {
-      code: '<Thumbnail />;',
-      errors: [missingPropError('Thumbnail')],
-      options: array,
-    },
-    {
-      code: '<Thumbnail alt />;',
-      errors: [altValueError('Thumbnail')],
-      options: array,
-    },
-    {
-      code: '<Thumbnail alt={undefined} />;',
-      errors: [altValueError('Thumbnail')],
-      options: array,
-    },
-    {
-      code: '<Thumbnail src="xyz" />',
-      errors: [missingPropError('Thumbnail')],
-      options: array,
-    },
-    {
-      code: '<Thumbnail {...this.props} />',
-      errors: [missingPropError('Thumbnail')],
-      options: array,
-    },
-    { code: '<Image />;', errors: [missingPropError('Image')], options: array },
-    { code: '<Image alt />;', errors: [altValueError('Image')], options: array },
-    {
-      code: '<Image alt={undefined} />;',
-      errors: [altValueError('Image')],
-      options: array,
-    },
-    {
-      code: '<Image src="xyz" />',
-      errors: [missingPropError('Image')],
-      options: array,
-    },
-    {
-      code: '<Image {...this.props} />',
-      errors: [missingPropError('Image')],
-      options: array,
-    },
-    { code: '<Object />', errors: [objectError], options: array },
-    { code: '<Object><div aria-hidden /></Object>', errors: [objectError], options: array },
-    { code: '<Object title={undefined} />', errors: [objectError], options: array },
-    { code: '<Area />', errors: [areaError], options: array },
-    { code: '<Area alt />', errors: [areaError], options: array },
-    { code: '<Area alt={undefined} />', errors: [areaError], options: array },
-    { code: '<Area src="xyz" />', errors: [areaError], options: array },
-    { code: '<Area {...this.props} />', errors: [areaError], options: array },
-    { code: '<InputImage />', errors: [inputImageError], options: array },
-    { code: '<InputImage alt />', errors: [inputImageError], options: array },
-    { code: '<InputImage alt={undefined} />', errors: [inputImageError], options: array },
-    { code: '<InputImage>Foo</InputImage>', errors: [inputImageError], options: array },
-    { code: '<InputImage {...this.props} />', errors: [inputImageError], options: array },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/anchor-has-content-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/anchor-has-content-test.js
deleted file mode 100644
index bfa5138..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/anchor-has-content-test.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce anchor elements to contain accessible content.
- * @author Lisa Ring & Niklas Holmberg
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/anchor-has-content';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: 'Anchors must have content and the content must be accessible by a screen reader.',
-  type: 'JSXOpeningElement',
-};
-
-ruleTester.run('anchor-has-content', rule, {
-  valid: [
-    { code: '<div />;' },
-    { code: '<a>Foo</a>' },
-    { code: '<a><Bar /></a>' },
-    { code: '<a>{foo}</a>' },
-    { code: '<a>{foo.bar}</a>' },
-    { code: '<a dangerouslySetInnerHTML={{ __html: "foo" }} />' },
-    { code: '<a children={children} />' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<a />', errors: [expectedError] },
-    { code: '<a><Bar aria-hidden /></a>', errors: [expectedError] },
-    { code: '<a>{undefined}</a>', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/anchor-is-valid-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/anchor-is-valid-test.js
deleted file mode 100644
index 341187b..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/anchor-is-valid-test.js
+++ /dev/null
@@ -1,542 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Performs validity check on anchor hrefs. Warns when anchors are used as buttons.
- * @author Almero Steyn
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/anchor-is-valid';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const preferButtonErrorMessage = 'Anchor used as a button. Anchors are primarily expected to navigate. Use the button element instead. Learn more: https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md';
-
-const noHrefErrorMessage = 'The href attribute is required for an anchor to be keyboard accessible. Provide a valid, navigable address as the href value. If you cannot provide an href, but still need the element to resemble a link, use a button and change it with appropriate styles. Learn more: https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md';
-
-const invalidHrefErrorMessage = 'The href attribute requires a valid value to be accessible. Provide a valid, navigable address as the href value. If you cannot provide a valid href, but still need the element to resemble a link, use a button and change it with appropriate styles. Learn more: https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md';
-
-const preferButtonexpectedError = {
-  message: preferButtonErrorMessage,
-  type: 'JSXOpeningElement',
-};
-const noHrefexpectedError = {
-  message: noHrefErrorMessage,
-  type: 'JSXOpeningElement',
-};
-const invalidHrefexpectedError = {
-  message: invalidHrefErrorMessage,
-  type: 'JSXOpeningElement',
-};
-
-const components = [{
-  components: ['Anchor', 'Link'],
-}];
-const specialLink = [{
-  specialLink: ['hrefLeft', 'hrefRight'],
-}];
-const noHrefAspect = [{
-  aspects: ['noHref'],
-}];
-const invalidHrefAspect = [{
-  aspects: ['invalidHref'],
-}];
-const preferButtonAspect = [{
-  aspects: ['preferButton'],
-}];
-const noHrefInvalidHrefAspect = [{
-  aspects: ['noHref', 'invalidHref'],
-}];
-const noHrefPreferButtonAspect = [{
-  aspects: ['noHref', 'preferButton'],
-}];
-const preferButtonInvalidHrefAspect = [{
-  aspects: ['preferButton', 'invalidHref'],
-}];
-
-const componentsAndSpecialLink = [{
-  components: ['Anchor'],
-  specialLink: ['hrefLeft'],
-}];
-
-const componentsAndSpecialLinkAndInvalidHrefAspect = [{
-  components: ['Anchor'],
-  specialLink: ['hrefLeft'],
-  aspects: ['invalidHref'],
-}];
-
-const componentsAndSpecialLinkAndNoHrefAspect = [{
-  components: ['Anchor'],
-  specialLink: ['hrefLeft'],
-  aspects: ['noHref'],
-}];
-
-ruleTester.run('anchor-is-valid', rule, {
-  valid: [
-    // DEFAULT ELEMENT 'a' TESTS
-    { code: '<Anchor />;' },
-    { code: '<a {...props} />' },
-    { code: '<a href="foo" />' },
-    { code: '<a href={foo} />' },
-    { code: '<a href="/foo" />' },
-    { code: '<a href="https://foo.bar.com" />' },
-    { code: '<div href="foo" />' },
-    { code: '<a href="javascript" />' },
-    { code: '<a href="javascriptFoo" />' },
-    { code: '<a href={`#foo`}/>' },
-    { code: '<a href={"foo"}/>' },
-    { code: '<a href={"javascript"}/>' },
-    { code: '<a href={`#javascript`}/>' },
-    { code: '<a href="#foo" />' },
-    { code: '<a href="#javascript" />' },
-    { code: '<a href="#javascriptFoo" />' },
-    { code: '<UX.Layout>test</UX.Layout>' },
-    { code: '<a href={this} />' },
-
-    // CUSTOM ELEMENT TEST FOR ARRAY OPTION
-    { code: '<Anchor {...props} />', options: components },
-    { code: '<Anchor href="foo" />', options: components },
-    { code: '<Anchor href={foo} />', options: components },
-    { code: '<Anchor href="/foo" />', options: components },
-    { code: '<Anchor href="https://foo.bar.com" />', options: components },
-    { code: '<div href="foo" />', options: components },
-    { code: '<Anchor href={`#foo`}/>', options: components },
-    { code: '<Anchor href={"foo"}/>', options: components },
-    { code: '<Anchor href="#foo" />', options: components },
-    { code: '<Link {...props} />', options: components },
-    { code: '<Link href="foo" />', options: components },
-    { code: '<Link href={foo} />', options: components },
-    { code: '<Link href="/foo" />', options: components },
-    { code: '<Link href="https://foo.bar.com" />', options: components },
-    { code: '<div href="foo" />', options: components },
-    { code: '<Link href={`#foo`}/>', options: components },
-    { code: '<Link href={"foo"}/>', options: components },
-    { code: '<Link href="#foo" />', options: components },
-
-    // CUSTOM PROP TESTS
-    { code: '<a {...props} />', options: specialLink },
-    { code: '<a hrefLeft="foo" />', options: specialLink },
-    { code: '<a hrefLeft={foo} />', options: specialLink },
-    { code: '<a hrefLeft="/foo" />', options: specialLink },
-    { code: '<a hrefLeft="https://foo.bar.com" />', options: specialLink },
-    { code: '<div hrefLeft="foo" />', options: specialLink },
-    { code: '<a hrefLeft={`#foo`}/>', options: specialLink },
-    { code: '<a hrefLeft={"foo"}/>', options: specialLink },
-    { code: '<a hrefLeft="#foo" />', options: specialLink },
-    { code: '<UX.Layout>test</UX.Layout>', options: specialLink },
-    { code: '<a hrefRight={this} />', options: specialLink },
-    { code: '<a {...props} />', options: specialLink },
-    { code: '<a hrefRight="foo" />', options: specialLink },
-    { code: '<a hrefRight={foo} />', options: specialLink },
-    { code: '<a hrefRight="/foo" />', options: specialLink },
-    { code: '<a hrefRight="https://foo.bar.com" />', options: specialLink },
-    { code: '<div hrefRight="foo" />', options: specialLink },
-    { code: '<a hrefRight={`#foo`}/>', options: specialLink },
-    { code: '<a hrefRight={"foo"}/>', options: specialLink },
-    { code: '<a hrefRight="#foo" />', options: specialLink },
-    { code: '<UX.Layout>test</UX.Layout>', options: specialLink },
-    { code: '<a hrefRight={this} />', options: specialLink },
-
-    // CUSTOM BOTH COMPONENTS AND SPECIALLINK TESTS
-    { code: '<Anchor {...props} />', options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft="foo" />', options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft={foo} />', options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft="/foo" />', options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft="https://foo.bar.com" />', options: componentsAndSpecialLink },
-    { code: '<div hrefLeft="foo" />', options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft={`#foo`}/>', options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft={"foo"}/>', options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft="#foo" />', options: componentsAndSpecialLink },
-    { code: '<UX.Layout>test</UX.Layout>', options: componentsAndSpecialLink },
-
-    // WITH ONCLICK
-    // DEFAULT ELEMENT 'a' TESTS
-    { code: '<a {...props} onClick={() => void 0} />' },
-    { code: '<a href="foo" onClick={() => void 0} />' },
-    { code: '<a href={foo} onClick={() => void 0} />' },
-    { code: '<a href="/foo" onClick={() => void 0} />' },
-    { code: '<a href="https://foo.bar.com" onClick={() => void 0} />' },
-    { code: '<div href="foo" onClick={() => void 0} />' },
-    { code: '<a href={`#foo`} onClick={() => void 0} />' },
-    { code: '<a href={"foo"} onClick={() => void 0} />' },
-    { code: '<a href="#foo" onClick={() => void 0} />' },
-    { code: '<a href={this} onClick={() => void 0} />' },
-
-    // CUSTOM ELEMENT TEST FOR ARRAY OPTION
-    { code: '<Anchor {...props} onClick={() => void 0} />', options: components },
-    { code: '<Anchor href="foo" onClick={() => void 0} />', options: components },
-    { code: '<Anchor href={foo} onClick={() => void 0} />', options: components },
-    { code: '<Anchor href="/foo" onClick={() => void 0} />', options: components },
-    { code: '<Anchor href="https://foo.bar.com" onClick={() => void 0} />', options: components },
-    { code: '<Anchor href={`#foo`} onClick={() => void 0} />', options: components },
-    { code: '<Anchor href={"foo"} onClick={() => void 0} />', options: components },
-    { code: '<Anchor href="#foo" onClick={() => void 0} />', options: components },
-    { code: '<Link {...props} onClick={() => void 0} />', options: components },
-    { code: '<Link href="foo" onClick={() => void 0} />', options: components },
-    { code: '<Link href={foo} onClick={() => void 0} />', options: components },
-    { code: '<Link href="/foo" onClick={() => void 0} />', options: components },
-    { code: '<Link href="https://foo.bar.com" onClick={() => void 0} />', options: components },
-    { code: '<div href="foo" onClick={() => void 0} />', options: components },
-    { code: '<Link href={`#foo`} onClick={() => void 0} />', options: components },
-    { code: '<Link href={"foo"} onClick={() => void 0} />', options: components },
-    { code: '<Link href="#foo" onClick={() => void 0} />', options: components },
-
-    // CUSTOM PROP TESTS
-    { code: '<a {...props} onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefLeft="foo" onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefLeft={foo} onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefLeft="/foo" onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefLeft href="https://foo.bar.com" onClick={() => void 0} />', options: specialLink },
-    { code: '<div hrefLeft="foo" onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefLeft={`#foo`} onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefLeft={"foo"} onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefLeft="#foo" onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefRight={this} onClick={() => void 0} />', options: specialLink },
-    { code: '<a {...props} onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefRight="foo" onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefRight={foo} onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefRight="/foo" onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefRight href="https://foo.bar.com" onClick={() => void 0} />', options: specialLink },
-    { code: '<div hrefRight="foo" onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefRight={`#foo`} onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefRight={"foo"} onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefRight="#foo" onClick={() => void 0} />', options: specialLink },
-    { code: '<a hrefRight={this} onClick={() => void 0} />', options: specialLink },
-
-    // CUSTOM BOTH COMPONENTS AND SPECIALLINK TESTS
-    { code: '<Anchor {...props} onClick={() => void 0} />', options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft="foo" onClick={() => void 0} />', options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft={foo} onClick={() => void 0} />', options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft="/foo" onClick={() => void 0} />', options: componentsAndSpecialLink },
-    {
-      code: '<Anchor hrefLeft href="https://foo.bar.com" onClick={() => void 0} />',
-      options: componentsAndSpecialLink,
-    },
-    { code: '<Anchor hrefLeft={`#foo`} onClick={() => void 0} />', options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft={"foo"} onClick={() => void 0} />', options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft="#foo" onClick={() => void 0} />', options: componentsAndSpecialLink },
-
-    // WITH ASPECTS TESTS
-    // NO HREF
-    { code: '<a />', options: invalidHrefAspect },
-    { code: '<a href={undefined} />', options: invalidHrefAspect },
-    { code: '<a href={null} />', options: invalidHrefAspect },
-    { code: '<a />', options: preferButtonAspect },
-    { code: '<a href={undefined} />', options: preferButtonAspect },
-    { code: '<a href={null} />', options: preferButtonAspect },
-    { code: '<a />', options: preferButtonInvalidHrefAspect },
-    { code: '<a href={undefined} />', options: preferButtonInvalidHrefAspect },
-    { code: '<a href={null} />', options: preferButtonInvalidHrefAspect },
-
-    // INVALID HREF
-    { code: '<a href="" />;', options: preferButtonAspect },
-    { code: '<a href="#" />', options: preferButtonAspect },
-    { code: '<a href={"#"} />', options: preferButtonAspect },
-    { code: '<a href="javascript:void(0)" />', options: preferButtonAspect },
-    { code: '<a href={"javascript:void(0)"} />', options: preferButtonAspect },
-    { code: '<a href="" />;', options: noHrefAspect },
-    { code: '<a href="#" />', options: noHrefAspect },
-    { code: '<a href={"#"} />', options: noHrefAspect },
-    { code: '<a href="javascript:void(0)" />', options: noHrefAspect },
-    { code: '<a href={"javascript:void(0)"} />', options: noHrefAspect },
-    { code: '<a href="" />;', options: noHrefPreferButtonAspect },
-    { code: '<a href="#" />', options: noHrefPreferButtonAspect },
-    { code: '<a href={"#"} />', options: noHrefPreferButtonAspect },
-    { code: '<a href="javascript:void(0)" />', options: noHrefPreferButtonAspect },
-    { code: '<a href={"javascript:void(0)"} />', options: noHrefPreferButtonAspect },
-
-    // SHOULD BE BUTTON
-    { code: '<a onClick={() => void 0} />', options: invalidHrefAspect },
-    { code: '<a href="#" onClick={() => void 0} />', options: noHrefAspect },
-    { code: '<a href="javascript:void(0)" onClick={() => void 0} />', options: noHrefAspect },
-    {
-      code: '<a href={"javascript:void(0)"} onClick={() => void 0} />',
-      options: noHrefAspect,
-    },
-
-    // CUSTOM COMPONENTS AND SPECIALLINK AND ASPECT
-    { code: '<Anchor hrefLeft={undefined} />', options: componentsAndSpecialLinkAndInvalidHrefAspect },
-    { code: '<Anchor hrefLeft={null} />', options: componentsAndSpecialLinkAndInvalidHrefAspect },
-    { code: '<Anchor hrefLeft={undefined} />', options: componentsAndSpecialLinkAndInvalidHrefAspect },
-    { code: '<Anchor hrefLeft={null} />', options: componentsAndSpecialLinkAndInvalidHrefAspect },
-    { code: '<Anchor hrefLeft={undefined} />', options: componentsAndSpecialLinkAndInvalidHrefAspect },
-    { code: '<Anchor hrefLeft={null} />', options: componentsAndSpecialLinkAndInvalidHrefAspect },
-
-  ].map(parserOptionsMapper),
-  invalid: [
-    // DEFAULT ELEMENT 'a' TESTS
-    // NO HREF
-    { code: '<a />', errors: [noHrefexpectedError] },
-    { code: '<a href={undefined} />', errors: [noHrefexpectedError] },
-    { code: '<a href={null} />', errors: [noHrefexpectedError] },
-    // INVALID HREF
-    { code: '<a href="" />;', errors: [invalidHrefexpectedError] },
-    { code: '<a href="#" />', errors: [invalidHrefErrorMessage] },
-    { code: '<a href={"#"} />', errors: [invalidHrefErrorMessage] },
-    { code: '<a href="javascript:void(0)" />', errors: [invalidHrefexpectedError] },
-    { code: '<a href={"javascript:void(0)"} />', errors: [invalidHrefexpectedError] },
-    // SHOULD BE BUTTON
-    { code: '<a onClick={() => void 0} />', errors: [preferButtonexpectedError] },
-    { code: '<a href="#" onClick={() => void 0} />', errors: [preferButtonexpectedError] },
-    { code: '<a href="javascript:void(0)" onClick={() => void 0} />', errors: [preferButtonexpectedError] },
-    {
-      code: '<a href={"javascript:void(0)"} onClick={() => void 0} />',
-      errors: [preferButtonexpectedError],
-    },
-
-    // CUSTOM ELEMENT TEST FOR ARRAY OPTION
-    // NO HREF
-    { code: '<Link />', errors: [noHrefexpectedError], options: components },
-    { code: '<Link href={undefined} />', errors: [noHrefexpectedError], options: components },
-    { code: '<Link href={null} />', errors: [noHrefexpectedError], options: components },
-    // INVALID HREF
-    { code: '<Link href="" />', errors: [invalidHrefexpectedError], options: components },
-    { code: '<Link href="#" />', errors: [invalidHrefErrorMessage], options: components },
-    { code: '<Link href={"#"} />', errors: [invalidHrefErrorMessage], options: components },
-    { code: '<Link href="javascript:void(0)" />', errors: [invalidHrefexpectedError], options: components },
-    { code: '<Link href={"javascript:void(0)"} />', errors: [invalidHrefexpectedError], options: components },
-    { code: '<Anchor href="" />', errors: [invalidHrefexpectedError], options: components },
-    { code: '<Anchor href="#" />', errors: [invalidHrefErrorMessage], options: components },
-    { code: '<Anchor href={"#"} />', errors: [invalidHrefErrorMessage], options: components },
-    { code: '<Anchor href="javascript:void(0)" />', errors: [invalidHrefexpectedError], options: components },
-    { code: '<Anchor href={"javascript:void(0)"} />', errors: [invalidHrefexpectedError], options: components },
-    // SHOULD BE BUTTON
-    { code: '<Link onClick={() => void 0} />', errors: [preferButtonexpectedError], options: components },
-    { code: '<Link href="#" onClick={() => void 0} />', errors: [preferButtonexpectedError], options: components },
-    {
-      code: '<Link href="javascript:void(0)" onClick={() => void 0} />',
-      errors: [preferButtonexpectedError],
-      options: components,
-    },
-    {
-      code: '<Link href={"javascript:void(0)"} onClick={() => void 0} />',
-      errors: [preferButtonexpectedError],
-      options: components,
-    },
-    { code: '<Anchor onClick={() => void 0} />', errors: [preferButtonexpectedError], options: components },
-    { code: '<Anchor href="#" onClick={() => void 0} />', errors: [preferButtonexpectedError], options: components },
-    {
-      code: '<Anchor href="javascript:void(0)" onClick={() => void 0} />',
-      errors: [preferButtonexpectedError],
-      options: components,
-    },
-    {
-      code: '<Anchor href={"javascript:void(0)"} onClick={() => void 0} />',
-      errors: [preferButtonexpectedError],
-      options: components,
-    },
-
-    // CUSTOM PROP TESTS
-    // NO HREF
-    { code: '<a hrefLeft={undefined} />', errors: [noHrefexpectedError], options: specialLink },
-    { code: '<a hrefLeft={null} />', errors: [noHrefexpectedError], options: specialLink },
-    // INVALID HREF
-    { code: '<a hrefLeft="" />;', errors: [invalidHrefexpectedError], options: specialLink },
-    { code: '<a hrefLeft="#" />', errors: [invalidHrefErrorMessage], options: specialLink },
-    { code: '<a hrefLeft={"#"} />', errors: [invalidHrefErrorMessage], options: specialLink },
-    { code: '<a hrefLeft="javascript:void(0)" />', errors: [invalidHrefexpectedError], options: specialLink },
-    { code: '<a hrefLeft={"javascript:void(0)"} />', errors: [invalidHrefexpectedError], options: specialLink },
-    // SHOULD BE BUTTON
-    { code: '<a hrefLeft="#" onClick={() => void 0} />', errors: [preferButtonexpectedError], options: specialLink },
-    {
-      code: '<a hrefLeft="javascript:void(0)" onClick={() => void 0} />',
-      errors: [preferButtonexpectedError],
-      options: specialLink,
-    },
-    {
-      code: '<a hrefLeft={"javascript:void(0)"} onClick={() => void 0} />',
-      errors: [preferButtonexpectedError],
-      options: specialLink,
-    },
-
-    // CUSTOM BOTH COMPONENTS AND SPECIALLINK TESTS
-    // NO HREF
-    { code: '<Anchor Anchor={undefined} />', errors: [noHrefexpectedError], options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft={null} />', errors: [noHrefexpectedError], options: componentsAndSpecialLink },
-    // INVALID HREF
-    { code: '<Anchor hrefLeft="" />;', errors: [invalidHrefexpectedError], options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft="#" />', errors: [invalidHrefErrorMessage], options: componentsAndSpecialLink },
-    { code: '<Anchor hrefLeft={"#"} />', errors: [invalidHrefErrorMessage], options: componentsAndSpecialLink },
-    {
-      code: '<Anchor hrefLeft="javascript:void(0)" />',
-      errors: [invalidHrefexpectedError],
-      options: componentsAndSpecialLink,
-    },
-    {
-      code: '<Anchor hrefLeft={"javascript:void(0)"} />',
-      errors: [invalidHrefexpectedError],
-      options: componentsAndSpecialLink,
-    },
-    // SHOULD BE BUTTON
-    {
-      code: '<Anchor hrefLeft="#" onClick={() => void 0} />',
-      errors: [preferButtonexpectedError],
-      options: componentsAndSpecialLink,
-    },
-    {
-      code: '<Anchor hrefLeft="javascript:void(0)" onClick={() => void 0} />',
-      errors: [preferButtonexpectedError],
-      options: componentsAndSpecialLink,
-    },
-    {
-      code: '<Anchor hrefLeft={"javascript:void(0)"} onClick={() => void 0} />',
-      errors: [preferButtonexpectedError],
-      options: componentsAndSpecialLink,
-    },
-
-    // WITH ASPECTS TESTS
-    // NO HREF
-    { code: '<a />', options: noHrefAspect, errors: [noHrefErrorMessage] },
-    { code: '<a />', options: noHrefPreferButtonAspect, errors: [noHrefErrorMessage] },
-    { code: '<a />', options: noHrefInvalidHrefAspect, errors: [noHrefErrorMessage] },
-    { code: '<a href={undefined} />', options: noHrefAspect, errors: [noHrefErrorMessage] },
-    { code: '<a href={undefined} />', options: noHrefPreferButtonAspect, errors: [noHrefErrorMessage] },
-    { code: '<a href={undefined} />', options: noHrefInvalidHrefAspect, errors: [noHrefErrorMessage] },
-    { code: '<a href={null} />', options: noHrefAspect, errors: [noHrefErrorMessage] },
-    { code: '<a href={null} />', options: noHrefPreferButtonAspect, errors: [noHrefErrorMessage] },
-    { code: '<a href={null} />', options: noHrefInvalidHrefAspect, errors: [noHrefErrorMessage] },
-
-    // INVALID HREF
-    { code: '<a href="" />;', options: invalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    { code: '<a href="" />;', options: noHrefInvalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    { code: '<a href="" />;', options: preferButtonInvalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    { code: '<a href="#" />;', options: invalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    { code: '<a href="#" />;', options: noHrefInvalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    { code: '<a href="#" />;', options: preferButtonInvalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    { code: '<a href={"#"} />;', options: invalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    { code: '<a href={"#"} />;', options: noHrefInvalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    { code: '<a href={"#"} />;', options: preferButtonInvalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    { code: '<a href="javascript:void(0)" />;', options: invalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    { code: '<a href="javascript:void(0)" />;', options: noHrefInvalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    {
-      code: '<a href="javascript:void(0)" />;',
-      options: preferButtonInvalidHrefAspect,
-      errors: [invalidHrefErrorMessage],
-    },
-    { code: '<a href={"javascript:void(0)"} />;', options: invalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    { code: '<a href={"javascript:void(0)"} />;', options: noHrefInvalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    {
-      code: '<a href={"javascript:void(0)"} />;',
-      options: preferButtonInvalidHrefAspect,
-      errors: [invalidHrefErrorMessage],
-    },
-
-    // SHOULD BE BUTTON
-    { code: '<a onClick={() => void 0} />', options: preferButtonAspect, errors: [preferButtonErrorMessage] },
-    {
-      code: '<a onClick={() => void 0} />',
-      options: preferButtonInvalidHrefAspect,
-      errors: [preferButtonErrorMessage],
-    },
-    { code: '<a onClick={() => void 0} />', options: noHrefPreferButtonAspect, errors: [preferButtonErrorMessage] },
-    { code: '<a onClick={() => void 0} />', options: noHrefAspect, errors: [noHrefErrorMessage] },
-    { code: '<a onClick={() => void 0} />', options: noHrefInvalidHrefAspect, errors: [noHrefErrorMessage] },
-    { code: '<a href="#" onClick={() => void 0} />', options: preferButtonAspect, errors: [preferButtonErrorMessage] },
-    {
-      code: '<a href="#" onClick={() => void 0} />',
-      options: noHrefPreferButtonAspect,
-      errors: [preferButtonErrorMessage],
-    },
-    {
-      code: '<a href="#" onClick={() => void 0} />',
-      options: preferButtonInvalidHrefAspect,
-      errors: [preferButtonErrorMessage],
-    },
-    { code: '<a href="#" onClick={() => void 0} />', options: invalidHrefAspect, errors: [invalidHrefErrorMessage] },
-    {
-      code: '<a href="#" onClick={() => void 0} />',
-      options: noHrefInvalidHrefAspect,
-      errors: [invalidHrefErrorMessage],
-    },
-    {
-      code: '<a href="javascript:void(0)" onClick={() => void 0} />',
-      options: preferButtonAspect,
-      errors: [preferButtonErrorMessage],
-    },
-    {
-      code: '<a href="javascript:void(0)" onClick={() => void 0} />',
-      options: noHrefPreferButtonAspect,
-      errors: [preferButtonErrorMessage],
-    },
-    {
-      code: '<a href="javascript:void(0)" onClick={() => void 0} />',
-      options: preferButtonInvalidHrefAspect,
-      errors: [preferButtonErrorMessage],
-    },
-    {
-      code: '<a href="javascript:void(0)" onClick={() => void 0} />',
-      options: invalidHrefAspect,
-      errors: [invalidHrefErrorMessage],
-    },
-    {
-      code: '<a href="javascript:void(0)" onClick={() => void 0} />',
-      options: noHrefInvalidHrefAspect,
-      errors: [invalidHrefErrorMessage],
-    },
-    {
-      code: '<a href={"javascript:void(0)"} onClick={() => void 0} />',
-      options: preferButtonAspect,
-      errors: [preferButtonErrorMessage],
-    },
-    {
-      code: '<a href={"javascript:void(0)"} onClick={() => void 0} />',
-      options: noHrefPreferButtonAspect,
-      errors: [preferButtonErrorMessage],
-    },
-    {
-      code: '<a href={"javascript:void(0)"} onClick={() => void 0} />',
-      options: preferButtonInvalidHrefAspect,
-      errors: [preferButtonErrorMessage],
-    },
-    {
-      code: '<a href={"javascript:void(0)"} onClick={() => void 0} />',
-      options: invalidHrefAspect,
-      errors: [invalidHrefErrorMessage],
-    },
-    {
-      code: '<a href={"javascript:void(0)"} onClick={() => void 0} />',
-      options: noHrefInvalidHrefAspect,
-      errors: [invalidHrefErrorMessage],
-    },
-
-    // CUSTOM COMPONENTS AND SPECIALLINK AND ASPECT
-    {
-      code: '<Anchor hrefLeft={undefined} />',
-      options: componentsAndSpecialLinkAndNoHrefAspect,
-      errors: [noHrefErrorMessage],
-    },
-    {
-      code: '<Anchor hrefLeft={null} />',
-      options: componentsAndSpecialLinkAndNoHrefAspect,
-      errors: [noHrefErrorMessage],
-    },
-    {
-      code: '<Anchor hrefLeft={undefined} />',
-      options: componentsAndSpecialLinkAndNoHrefAspect,
-      errors: [noHrefErrorMessage],
-    },
-    {
-      code: '<Anchor hrefLeft={null} />',
-      options: componentsAndSpecialLinkAndNoHrefAspect,
-      errors: [noHrefErrorMessage],
-    },
-    {
-      code: '<Anchor hrefLeft={undefined} />',
-      options: componentsAndSpecialLinkAndNoHrefAspect,
-      errors: [noHrefErrorMessage],
-    },
-    {
-      code: '<Anchor hrefLeft={null} />',
-      options: componentsAndSpecialLinkAndNoHrefAspect,
-      errors: [noHrefErrorMessage],
-    },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-activedescendant-has-tabindex-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-activedescendant-has-tabindex-test.js
deleted file mode 100644
index 941403c..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-activedescendant-has-tabindex-test.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * @fileoverview Enforce elements with aria-activedescendant are tabbable.
- * @author Jesse Beach <@jessebeach>
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/aria-activedescendant-has-tabindex';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: 'An element that manages focus with `aria-activedescendant` must be tabbable',
-  type: 'JSXOpeningElement',
-};
-
-ruleTester.run('aria-activedescendant-has-tabindex', rule, {
-  valid: [
-    {
-      code: '<CustomComponent />;',
-    },
-    {
-      code: '<CustomComponent aria-activedescendant={someID} />;',
-    },
-    {
-      code: '<CustomComponent aria-activedescendant={someID} tabIndex={0} />;',
-    },
-    {
-      code: '<CustomComponent aria-activedescendant={someID} tabIndex={-1} />;',
-    },
-    {
-      code: '<div />;',
-    },
-    {
-      code: '<input />;',
-    },
-    {
-      code: '<div tabIndex={0} />;',
-    },
-    {
-      code: '<div aria-activedescendant={someID} tabIndex={0} />;',
-    },
-    {
-      code: '<div aria-activedescendant={someID} tabIndex="0" />;',
-    },
-    {
-      code: '<div aria-activedescendant={someID} tabIndex={1} />;',
-    },
-    {
-      code: '<input aria-activedescendant={someID} />;',
-    },
-    {
-      code: '<input aria-activedescendant={someID} tabIndex={0} />;',
-    },
-  ].map(parserOptionsMapper),
-  invalid: [
-    {
-      code: '<div aria-activedescendant={someID} />;',
-      errors: [expectedError],
-    },
-    {
-      code: '<div aria-activedescendant={someID} tabIndex={-1} />;',
-      errors: [expectedError],
-    },
-    {
-      code: '<div aria-activedescendant={someID} tabIndex="-1" />;',
-      errors: [expectedError],
-    },
-    {
-      code: '<input aria-activedescendant={someID} tabIndex={-1} />;',
-      errors: [expectedError],
-    },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-props-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-props-test.js
deleted file mode 100644
index 058abad..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-props-test.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce all aria-* properties are valid.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { aria } from 'aria-query';
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/aria-props';
-import getSuggestion from '../../../src/util/getSuggestion';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-const ariaAttributes = [...aria.keys()];
-
-const errorMessage = (name) => {
-  const suggestions = getSuggestion(name, ariaAttributes);
-  const message = `${name}: This attribute is an invalid ARIA attribute.`;
-
-  if (suggestions.length > 0) {
-    return {
-      type: 'JSXAttribute',
-      message: `${message} Did you mean to use ${suggestions}?`,
-    };
-  }
-
-  return {
-    type: 'JSXAttribute',
-    message,
-  };
-};
-
-// Create basic test cases using all valid role types.
-const basicValidityTests = ariaAttributes.map(prop => ({
-  code: `<div ${prop.toLowerCase()}="foobar" />`,
-}));
-
-ruleTester.run('aria-props', rule, {
-  valid: [
-    // Variables should pass, as we are only testing literals.
-    { code: '<div />' },
-    { code: '<div></div>' },
-    { code: '<div aria="wee"></div>' }, // Needs aria-*
-    { code: '<div abcARIAdef="true"></div>' },
-    { code: '<div fooaria-foobar="true"></div>' },
-    { code: '<div fooaria-hidden="true"></div>' },
-    { code: '<Bar baz />' },
-    { code: '<input type="text" aria-errormessage="foobar" />' },
-  ].concat(basicValidityTests).map(parserOptionsMapper),
-  invalid: [
-    { code: '<div aria-="foobar" />', errors: [errorMessage('aria-')] },
-    {
-      code: '<div aria-labeledby="foobar" />',
-      errors: [errorMessage('aria-labeledby')],
-    },
-    {
-      code: '<div aria-skldjfaria-klajsd="foobar" />',
-      errors: [errorMessage('aria-skldjfaria-klajsd')],
-    },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-proptypes-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-proptypes-test.js
deleted file mode 100644
index 04bf9c5..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-proptypes-test.js
+++ /dev/null
@@ -1,306 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce ARIA state and property values are valid.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { aria } from 'aria-query';
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/aria-proptypes';
-
-const { validityCheck } = rule;
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const errorMessage = (name) => {
-  const {
-    type,
-    values: permittedValues,
-  } = aria.get(name.toLowerCase());
-
-  switch (type) {
-    case 'tristate':
-      return `The value for ${name} must be a boolean or the string "mixed".`;
-    case 'token':
-      return `The value for ${name} must be a single token from the following: ${permittedValues}.`;
-    case 'tokenlist':
-      return `The value for ${name} must be a list of one or more \
-tokens from the following: ${permittedValues}.`;
-    case 'idlist':
-      return `The value for ${name} must be a list of strings that represent DOM element IDs (idlist)`;
-    case 'id':
-      return `The value for ${name} must be a string that represents a DOM element ID`;
-    case 'boolean':
-    case 'string':
-    case 'integer':
-    case 'number':
-    default:
-      return `The value for ${name} must be a ${type}.`;
-  }
-};
-
-describe('validityCheck', () => {
-  it('should false for an unknown expected type', () => {
-    expect(validityCheck(
-      null,
-      null,
-    )).toBe(false);
-  });
-});
-
-ruleTester.run('aria-proptypes', rule, {
-  valid: [
-    // DON'T TEST INVALID ARIA-* PROPS
-    { code: '<div aria-foo="true" />' },
-    { code: '<div abcaria-foo="true" />' },
-
-    // BOOLEAN
-    { code: '<div aria-hidden={true} />' },
-    { code: '<div aria-hidden="true" />' },
-    { code: '<div aria-hidden={"false"} />' },
-    { code: '<div aria-hidden={!false} />' },
-    { code: '<div aria-hidden />' },
-    { code: '<div aria-hidden={false} />' },
-    { code: '<div aria-hidden={!true} />' },
-    { code: '<div aria-hidden={!"yes"} />' },
-    { code: '<div aria-hidden={foo} />' },
-    { code: '<div aria-hidden={foo.bar} />' },
-    { code: '<div aria-hidden={null} />' },
-    { code: '<div aria-hidden={undefined} />' },
-    { code: '<div aria-hidden={<div />} />' },
-
-    // STRING
-    { code: '<div aria-label="Close" />' },
-    { code: '<div aria-label={`Close`} />' },
-    { code: '<div aria-label={foo} />' },
-    { code: '<div aria-label={foo.bar} />' },
-    { code: '<div aria-label={null} />' },
-    { code: '<div aria-label={undefined} />' },
-    { code: '<input aria-invalid={error ? "true" : "false"} />' },
-    { code: '<input aria-invalid={undefined ? "true" : "false"} />' },
-
-    // TRISTATE
-    { code: '<div aria-checked={true} />' },
-    { code: '<div aria-checked="true" />' },
-    { code: '<div aria-checked={"false"} />' },
-    { code: '<div aria-checked={!false} />' },
-    { code: '<div aria-checked />' },
-    { code: '<div aria-checked={false} />' },
-    { code: '<div aria-checked={!true} />' },
-    { code: '<div aria-checked={!"yes"} />' },
-    { code: '<div aria-checked={foo} />' },
-    { code: '<div aria-checked={foo.bar} />' },
-    { code: '<div aria-checked="mixed" />' },
-    { code: '<div aria-checked={`mixed`} />' },
-    { code: '<div aria-checked={null} />' },
-    { code: '<div aria-checked={undefined} />' },
-
-    // INTEGER
-    { code: '<div aria-level={123} />' },
-    { code: '<div aria-level={-123} />' },
-    { code: '<div aria-level={+123} />' },
-    { code: '<div aria-level={~123} />' },
-    { code: '<div aria-level={"123"} />' },
-    { code: '<div aria-level={`123`} />' },
-    { code: '<div aria-level="123" />' },
-    { code: '<div aria-level={foo} />' },
-    { code: '<div aria-level={foo.bar} />' },
-    { code: '<div aria-level={null} />' },
-    { code: '<div aria-level={undefined} />' },
-
-    // NUMBER
-    { code: '<div aria-valuemax={123} />' },
-    { code: '<div aria-valuemax={-123} />' },
-    { code: '<div aria-valuemax={+123} />' },
-    { code: '<div aria-valuemax={~123} />' },
-    { code: '<div aria-valuemax={"123"} />' },
-    { code: '<div aria-valuemax={`123`} />' },
-    { code: '<div aria-valuemax="123" />' },
-    { code: '<div aria-valuemax={foo} />' },
-    { code: '<div aria-valuemax={foo.bar} />' },
-    { code: '<div aria-valuemax={null} />' },
-    { code: '<div aria-valuemax={undefined} />' },
-
-    // TOKEN
-    { code: '<div aria-sort="ascending" />' },
-    { code: '<div aria-sort="ASCENDING" />' },
-    { code: '<div aria-sort={"ascending"} />' },
-    { code: '<div aria-sort={`ascending`} />' },
-    { code: '<div aria-sort="descending" />' },
-    { code: '<div aria-sort={"descending"} />' },
-    { code: '<div aria-sort={`descending`} />' },
-    { code: '<div aria-sort="none" />' },
-    { code: '<div aria-sort={"none"} />' },
-    { code: '<div aria-sort={`none`} />' },
-    { code: '<div aria-sort="other" />' },
-    { code: '<div aria-sort={"other"} />' },
-    { code: '<div aria-sort={`other`} />' },
-    { code: '<div aria-sort={foo} />' },
-    { code: '<div aria-sort={foo.bar} />' },
-    { code: '<div aria-invalid={true} />' },
-    { code: '<div aria-invalid="true" />' },
-    { code: '<div aria-invalid={false} />' },
-    { code: '<div aria-invalid="false" />' },
-    { code: '<div aria-invalid="grammar" />' },
-    { code: '<div aria-invalid="spelling" />' },
-    { code: '<div aria-invalid={null} />' },
-    { code: '<div aria-invalid={undefined} />' },
-
-    // TOKENLIST
-    { code: '<div aria-relevant="additions" />' },
-    { code: '<div aria-relevant={"additions"} />' },
-    { code: '<div aria-relevant={`additions`} />' },
-    { code: '<div aria-relevant="additions removals" />' },
-    { code: '<div aria-relevant="additions additions" />' },
-    { code: '<div aria-relevant={"additions removals"} />' },
-    { code: '<div aria-relevant={`additions removals`} />' },
-    { code: '<div aria-relevant="additions removals text" />' },
-    { code: '<div aria-relevant={"additions removals text"} />' },
-    { code: '<div aria-relevant={`additions removals text`} />' },
-    { code: '<div aria-relevant="additions removals text all" />' },
-    { code: '<div aria-relevant={"additions removals text all"} />' },
-    { code: '<div aria-relevant={`removals additions text all`} />' },
-    { code: '<div aria-relevant={foo} />' },
-    { code: '<div aria-relevant={foo.bar} />' },
-    { code: '<div aria-relevant={null} />' },
-    { code: '<div aria-relevant={undefined} />' },
-
-    // ID
-    { code: '<div aria-activedescendant="ascending" />' },
-    { code: '<div aria-activedescendant="ASCENDING" />' },
-    { code: '<div aria-activedescendant={"ascending"} />' },
-    { code: '<div aria-activedescendant={`ascending`} />' },
-    { code: '<div aria-activedescendant="descending" />' },
-    { code: '<div aria-activedescendant={"descending"} />' },
-    { code: '<div aria-activedescendant={`descending`} />' },
-    { code: '<div aria-activedescendant="none" />' },
-    { code: '<div aria-activedescendant={"none"} />' },
-    { code: '<div aria-activedescendant={`none`} />' },
-    { code: '<div aria-activedescendant="other" />' },
-    { code: '<div aria-activedescendant={"other"} />' },
-    { code: '<div aria-activedescendant={`other`} />' },
-    { code: '<div aria-activedescendant={foo} />' },
-    { code: '<div aria-activedescendant={foo.bar} />' },
-    { code: '<div aria-activedescendant={null} />' },
-    { code: '<div aria-activedescendant={undefined} />' },
-
-    // IDLIST
-    { code: '<div aria-labelledby="additions" />' },
-    { code: '<div aria-labelledby={"additions"} />' },
-    { code: '<div aria-labelledby={`additions`} />' },
-    { code: '<div aria-labelledby="additions removals" />' },
-    { code: '<div aria-labelledby="additions additions" />' },
-    { code: '<div aria-labelledby={"additions removals"} />' },
-    { code: '<div aria-labelledby={`additions removals`} />' },
-    { code: '<div aria-labelledby="additions removals text" />' },
-    { code: '<div aria-labelledby={"additions removals text"} />' },
-    { code: '<div aria-labelledby={`additions removals text`} />' },
-    { code: '<div aria-labelledby="additions removals text all" />' },
-    { code: '<div aria-labelledby={"additions removals text all"} />' },
-    { code: '<div aria-labelledby={`removals additions text all`} />' },
-    { code: '<div aria-labelledby={foo} />' },
-    { code: '<div aria-labelledby={foo.bar} />' },
-    { code: '<div aria-labelledby={null} />' },
-    { code: '<div aria-labelledby={undefined} />' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    // BOOLEAN
-    { code: '<div aria-hidden="yes" />', errors: [errorMessage('aria-hidden')] },
-    { code: '<div aria-hidden="no" />', errors: [errorMessage('aria-hidden')] },
-    { code: '<div aria-hidden={1234} />', errors: [errorMessage('aria-hidden')] },
-    {
-      code: '<div aria-hidden={`${abc}`} />',
-      errors: [errorMessage('aria-hidden')],
-    },
-
-    // STRING
-    { code: '<div aria-label />', errors: [errorMessage('aria-label')] },
-    { code: '<div aria-label={true} />', errors: [errorMessage('aria-label')] },
-    { code: '<div aria-label={false} />', errors: [errorMessage('aria-label')] },
-    { code: '<div aria-label={1234} />', errors: [errorMessage('aria-label')] },
-    { code: '<div aria-label={!true} />', errors: [errorMessage('aria-label')] },
-
-    // TRISTATE
-    { code: '<div aria-checked="yes" />', errors: [errorMessage('aria-checked')] },
-    { code: '<div aria-checked="no" />', errors: [errorMessage('aria-checked')] },
-    { code: '<div aria-checked={1234} />', errors: [errorMessage('aria-checked')] },
-    {
-      code: '<div aria-checked={`${abc}`} />',
-      errors: [errorMessage('aria-checked')],
-    },
-
-    // INTEGER
-    { code: '<div aria-level="yes" />', errors: [errorMessage('aria-level')] },
-    { code: '<div aria-level="no" />', errors: [errorMessage('aria-level')] },
-    { code: '<div aria-level={`abc`} />', errors: [errorMessage('aria-level')] },
-    { code: '<div aria-level={true} />', errors: [errorMessage('aria-level')] },
-    { code: '<div aria-level />', errors: [errorMessage('aria-level')] },
-    { code: '<div aria-level={"false"} />', errors: [errorMessage('aria-level')] },
-    { code: '<div aria-level={!"false"} />', errors: [errorMessage('aria-level')] },
-
-    // NUMBER
-    { code: '<div aria-valuemax="yes" />', errors: [errorMessage('aria-valuemax')] },
-    { code: '<div aria-valuemax="no" />', errors: [errorMessage('aria-valuemax')] },
-    {
-      code: '<div aria-valuemax={`abc`} />',
-      errors: [errorMessage('aria-valuemax')],
-    },
-    {
-      code: '<div aria-valuemax={true} />',
-      errors: [errorMessage('aria-valuemax')],
-    },
-    { code: '<div aria-valuemax />', errors: [errorMessage('aria-valuemax')] },
-    {
-      code: '<div aria-valuemax={"false"} />',
-      errors: [errorMessage('aria-valuemax')],
-    },
-    {
-      code: '<div aria-valuemax={!"false"} />',
-      errors: [errorMessage('aria-valuemax')],
-    },
-
-    // TOKEN
-    { code: '<div aria-sort="" />', errors: [errorMessage('aria-sort')] },
-    { code: '<div aria-sort="descnding" />', errors: [errorMessage('aria-sort')] },
-    { code: '<div aria-sort />', errors: [errorMessage('aria-sort')] },
-    { code: '<div aria-sort={true} />', errors: [errorMessage('aria-sort')] },
-    { code: '<div aria-sort={"false"} />', errors: [errorMessage('aria-sort')] },
-    {
-      code: '<div aria-sort="ascending descending" />',
-      errors: [errorMessage('aria-sort')],
-    },
-
-    // TOKENLIST
-    { code: '<div aria-relevant="" />', errors: [errorMessage('aria-relevant')] },
-    {
-      code: '<div aria-relevant="foobar" />',
-      errors: [errorMessage('aria-relevant')],
-    },
-    { code: '<div aria-relevant />', errors: [errorMessage('aria-relevant')] },
-    {
-      code: '<div aria-relevant={true} />',
-      errors: [errorMessage('aria-relevant')],
-    },
-    {
-      code: '<div aria-relevant={"false"} />',
-      errors: [errorMessage('aria-relevant')],
-    },
-    {
-      code: '<div aria-relevant="additions removalss" />',
-      errors: [errorMessage('aria-relevant')],
-    },
-    {
-      code: '<div aria-relevant="additions removalss " />',
-      errors: [errorMessage('aria-relevant')],
-    },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-role-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-role-test.js
deleted file mode 100644
index 789bb2f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-role-test.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce aria role attribute is valid.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { roles } from 'aria-query';
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/aria-role';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const errorMessage = {
-  message: 'Elements with ARIA roles must use a valid, non-abstract ARIA role.',
-  type: 'JSXAttribute',
-};
-
-const roleKeys = [...roles.keys()];
-
-const validRoles = roleKeys.filter(role => roles.get(role).abstract === false);
-const invalidRoles = roleKeys.filter(role => roles.get(role).abstract === true);
-
-const createTests = roleNames => roleNames.map(role => ({
-  code: `<div role="${role.toLowerCase()}" />`,
-}));
-
-const validTests = createTests(validRoles);
-const invalidTests = createTests(invalidRoles).map((test) => {
-  const invalidTest = Object.assign({}, test);
-  invalidTest.errors = [errorMessage];
-  return invalidTest;
-});
-
-const ignoreNonDOMSchema = [{
-  ignoreNonDOM: true,
-}];
-
-ruleTester.run('aria-role', rule, {
-  valid: [
-    // Variables should pass, as we are only testing literals.
-    { code: '<div />' },
-    { code: '<div></div>' },
-    { code: '<div role={role} />' },
-    { code: '<div role={role || "button"} />' },
-    { code: '<div role={role || "foobar"} />' },
-    { code: '<div role="tabpanel row" />' },
-    { code: '<div role="switch" />' },
-    { code: '<div role="doc-abstract" />' },
-    { code: '<div role="doc-appendix doc-bibliography" />' },
-    { code: '<Bar baz />' },
-    { code: '<Foo role="bar" />', options: ignoreNonDOMSchema },
-    { code: '<fakeDOM role="bar" />', options: ignoreNonDOMSchema },
-    { code: '<img role="presentation" />', options: ignoreNonDOMSchema },
-  ].concat(validTests).map(parserOptionsMapper),
-
-  invalid: [
-    { code: '<div role="foobar" />', errors: [errorMessage] },
-    { code: '<div role="datepicker"></div>', errors: [errorMessage] },
-    { code: '<div role="range"></div>', errors: [errorMessage] },
-    { code: '<div role="Button"></div>', errors: [errorMessage] },
-    { code: '<div role=""></div>', errors: [errorMessage] },
-    { code: '<div role="tabpanel row foobar"></div>', errors: [errorMessage] },
-    { code: '<div role="tabpanel row range"></div>', errors: [errorMessage] },
-    { code: '<div role="doc-endnotes range"></div>', errors: [errorMessage] },
-    { code: '<div role />', errors: [errorMessage] },
-    { code: '<div role={null}></div>', errors: [errorMessage] },
-    { code: '<Foo role="datepicker" />', errors: [errorMessage] },
-    { code: '<Foo role="Button" />', errors: [errorMessage] },
-  ].concat(invalidTests).map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-unsupported-elements-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-unsupported-elements-test.js
deleted file mode 100644
index 3862b35..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/aria-unsupported-elements-test.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce that elements that do not support ARIA roles,
- *  states and properties do not have those attributes.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { dom } from 'aria-query';
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/aria-unsupported-elements';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const errorMessage = invalidProp => ({
-  message: `This element does not support ARIA roles, states and properties. \
-Try removing the prop '${invalidProp}'.`,
-  type: 'JSXOpeningElement',
-});
-
-const domElements = [...dom.keys()];
-// Generate valid test cases
-const roleValidityTests = domElements.map((element) => {
-  const isReserved = dom.get(element).reserved || false;
-  const role = isReserved ? '' : 'role';
-
-  return {
-    code: `<${element} ${role} />`,
-  };
-});
-
-const ariaValidityTests = domElements.map((element) => {
-  const isReserved = dom.get(element).reserved || false;
-  const aria = isReserved ? '' : 'aria-hidden';
-
-  return {
-    code: `<${element} ${aria} />`,
-  };
-}).concat({
-  code: '<fake aria-hidden />',
-  errors: [errorMessage('aria-hidden')],
-});
-
-// Generate invalid test cases.
-const invalidRoleValidityTests = domElements
-  .filter(element => Boolean(dom.get(element).reserved))
-  .map(reservedElem => ({
-    code: `<${reservedElem} role {...props} />`,
-    errors: [errorMessage('role')],
-  }));
-
-const invalidAriaValidityTests = domElements
-  .filter(element => Boolean(dom.get(element).reserved))
-  .map(reservedElem => ({
-    code: `<${reservedElem} aria-hidden aria-role="none" {...props} />`,
-    errors: [errorMessage('aria-hidden')],
-  }));
-
-ruleTester.run('aria-unsupported-elements', rule, {
-  valid: roleValidityTests.concat(ariaValidityTests).map(parserOptionsMapper),
-  invalid: invalidRoleValidityTests.concat(invalidAriaValidityTests)
-    .map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/click-events-have-key-events-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/click-events-have-key-events-test.js
deleted file mode 100644
index 7d1328f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/click-events-have-key-events-test.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce a clickable non-interactive element has at least 1 keyboard event listener.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/click-events-have-key-events';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const errorMessage = 'Visible, non-interactive elements with click handlers must have at least one keyboard listener.';
-
-const expectedError = {
-  message: errorMessage,
-  type: 'JSXOpeningElement',
-};
-
-ruleTester.run('click-events-have-key-events', rule, {
-  valid: [
-    { code: '<div onClick={() => void 0} onKeyDown={foo}/>;' },
-    { code: '<div onClick={() => void 0} onKeyUp={foo} />;' },
-    { code: '<div onClick={() => void 0} onKeyPress={foo}/>;' },
-    { code: '<div onClick={() => void 0} onKeyDown={foo} onKeyUp={bar} />;' },
-    { code: '<div onClick={() => void 0} onKeyDown={foo} {...props} />;' },
-    { code: '<div className="foo" />;' },
-    { code: '<div onClick={() => void 0} aria-hidden />;' },
-    { code: '<div onClick={() => void 0} aria-hidden={true} />;' },
-    { code: '<div onClick={() => void 0} aria-hidden={false} onKeyDown={foo} />;' },
-    {
-      code: '<div onClick={() => void 0} onKeyDown={foo} aria-hidden={undefined} />;',
-    },
-    { code: '<input type="text" onClick={() => void 0} />' },
-    { code: '<input onClick={() => void 0} />' },
-    { code: '<button onClick={() => void 0} className="foo" />' },
-    { code: '<option onClick={() => void 0} className="foo" />' },
-    { code: '<select onClick={() => void 0} className="foo" />' },
-    { code: '<textarea onClick={() => void 0} className="foo" />' },
-    { code: '<a onClick={() => void 0} href="http://x.y.z" />' },
-    { code: '<a onClick={() => void 0} href="http://x.y.z" tabIndex="0" />' },
-    { code: '<input onClick={() => void 0} type="hidden" />;' },
-    { code: '<div onClick={() => void 0} role="presentation" />;' },
-    { code: '<div onClick={() => void 0} role="none" />;' },
-    { code: '<TestComponent onClick={doFoo} />' },
-    { code: '<Button onClick={doFoo} />' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<div onClick={() => void 0} />;', errors: [expectedError] },
-    {
-      code: '<div onClick={() => void 0} role={undefined} />;',
-      errors: [expectedError],
-    },
-    { code: '<div onClick={() => void 0} {...props} />;', errors: [expectedError] },
-    { code: '<section onClick={() => void 0} />;', errors: [expectedError] },
-    { code: '<main onClick={() => void 0} />;', errors: [expectedError] },
-    { code: '<article onClick={() => void 0} />;', errors: [expectedError] },
-    { code: '<header onClick={() => void 0} />;', errors: [expectedError] },
-    { code: '<footer onClick={() => void 0} />;', errors: [expectedError] },
-    {
-      code: '<div onClick={() => void 0} aria-hidden={false} />;',
-      errors: [expectedError],
-    },
-    { code: '<a onClick={() => void 0} />', errors: [expectedError] },
-    { code: '<a tabIndex="0" onClick={() => void 0} />', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/control-has-associated-label-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/control-has-associated-label-test.js
deleted file mode 100644
index 043a141..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/control-has-associated-label-test.js
+++ /dev/null
@@ -1,309 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Control elements must be associated with a text label
- * @author jessebeach
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import { configs } from '../../../src/index';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import ruleOptionsMapperFactory from '../../__util__/ruleOptionsMapperFactory';
-import rule from '../../../src/rules/control-has-associated-label';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const ruleName = 'jsx-a11y/control-has-associated-label';
-
-const expectedError = {
-  message: 'A control must be associated with a text label.',
-  type: 'JSXOpeningElement',
-};
-
-const alwaysValid = [
-  // Custom Control Components
-  { code: '<CustomControl><span><span>Save</span></span></CustomControl>', options: [{ depth: 3, controlComponents: ['CustomControl'] }] },
-  { code: '<CustomControl><span><span label="Save"></span></span></CustomControl>', options: [{ depth: 3, controlComponents: ['CustomControl'], labelAttributes: ['label'] }] },
-  // Interactive Elements
-  { code: '<button>Save</button>' },
-  { code: '<button><span>Save</span></button>' },
-  { code: '<button><span><span>Save</span></span></button>', options: [{ depth: 3 }] },
-  { code: '<button><span><span><span><span><span><span><span><span>Save</span></span></span></span></span></span></span></span></button>', options: [{ depth: 9 }] },
-  { code: '<button><img alt="Save" /></button>' },
-  { code: '<button aria-label="Save" />' },
-  { code: '<button><span aria-label="Save" /></button>' },
-  { code: '<button aria-labelledby="js_1" />' },
-  { code: '<button><span aria-labelledby="js_1" /></button>' },
-  { code: '<button>{sureWhyNot}</button>' },
-  { code: '<button><span><span label="Save"></span></span></button>', options: [{ depth: 3, labelAttributes: ['label'] }] },
-  { code: '<a href="#">Save</a>' },
-  { code: '<area href="#">Save</area>' },
-  { code: '<label>Save</label>' },
-  { code: '<link>Save</link>' },
-  { code: '<menuitem>Save</menuitem>' },
-  { code: '<option>Save</option>' },
-  { code: '<th>Save</th>' },
-  // Interactive Roles
-  { code: '<div role="button">Save</div>' },
-  { code: '<div role="checkbox">Save</div>' },
-  { code: '<div role="columnheader">Save</div>' },
-  { code: '<div role="combobox">Save</div>' },
-  { code: '<div role="gridcell">Save</div>' },
-  { code: '<div role="link">Save</div>' },
-  { code: '<div role="menuitem">Save</div>' },
-  { code: '<div role="menuitemcheckbox">Save</div>' },
-  { code: '<div role="menuitemradio">Save</div>' },
-  { code: '<div role="option">Save</div>' },
-  { code: '<div role="progressbar">Save</div>' },
-  { code: '<div role="radio">Save</div>' },
-  { code: '<div role="rowheader">Save</div>' },
-  { code: '<div role="searchbox">Save</div>' },
-  { code: '<div role="slider">Save</div>' },
-  { code: '<div role="spinbutton">Save</div>' },
-  { code: '<div role="switch">Save</div>' },
-  { code: '<div role="tab">Save</div>' },
-  { code: '<div role="textbox">Save</div>' },
-  { code: '<div role="treeitem">Save</div>' },
-  { code: '<div role="button" aria-label="Save" />' },
-  { code: '<div role="checkbox" aria-label="Save" />' },
-  { code: '<div role="columnheader" aria-label="Save" />' },
-  { code: '<div role="combobox" aria-label="Save" />' },
-  { code: '<div role="gridcell" aria-label="Save" />' },
-  { code: '<div role="link" aria-label="Save" />' },
-  { code: '<div role="menuitem" aria-label="Save" />' },
-  { code: '<div role="menuitemcheckbox" aria-label="Save" />' },
-  { code: '<div role="menuitemradio" aria-label="Save" />' },
-  { code: '<div role="option" aria-label="Save" />' },
-  { code: '<div role="progressbar" aria-label="Save" />' },
-  { code: '<div role="radio" aria-label="Save" />' },
-  { code: '<div role="rowheader" aria-label="Save" />' },
-  { code: '<div role="searchbox" aria-label="Save" />' },
-  { code: '<div role="slider" aria-label="Save" />' },
-  { code: '<div role="spinbutton" aria-label="Save" />' },
-  { code: '<div role="switch" aria-label="Save" />' },
-  { code: '<div role="tab" aria-label="Save" />' },
-  { code: '<div role="textbox" aria-label="Save" />' },
-  { code: '<div role="treeitem" aria-label="Save" />' },
-  { code: '<div role="button" aria-labelledby="js_1" />' },
-  { code: '<div role="checkbox" aria-labelledby="js_1" />' },
-  { code: '<div role="columnheader" aria-labelledby="js_1" />' },
-  { code: '<div role="combobox" aria-labelledby="js_1" />' },
-  { code: '<div role="gridcell" aria-labelledby="Save" />' },
-  { code: '<div role="link" aria-labelledby="js_1" />' },
-  { code: '<div role="menuitem" aria-labelledby="js_1" />' },
-  { code: '<div role="menuitemcheckbox" aria-labelledby="js_1" />' },
-  { code: '<div role="menuitemradio" aria-labelledby="js_1" />' },
-  { code: '<div role="option" aria-labelledby="js_1" />' },
-  { code: '<div role="progressbar" aria-labelledby="js_1" />' },
-  { code: '<div role="radio" aria-labelledby="js_1" />' },
-  { code: '<div role="rowheader" aria-labelledby="js_1" />' },
-  { code: '<div role="searchbox" aria-labelledby="js_1" />' },
-  { code: '<div role="slider" aria-labelledby="js_1" />' },
-  { code: '<div role="spinbutton" aria-labelledby="js_1" />' },
-  { code: '<div role="switch" aria-labelledby="js_1" />' },
-  { code: '<div role="tab" aria-labelledby="js_1" />' },
-  { code: '<div role="textbox" aria-labelledby="js_1" />' },
-  { code: '<div role="treeitem" aria-labelledby="js_1" />' },
-  // Non-interactive Elements
-  { code: '<abbr />' },
-  { code: '<article />' },
-  { code: '<blockquote />' },
-  { code: '<br />' },
-  { code: '<caption />' },
-  { code: '<dd />' },
-  { code: '<details />' },
-  { code: '<dfn />' },
-  { code: '<dialog />' },
-  { code: '<dir />' },
-  { code: '<dl />' },
-  { code: '<dt />' },
-  { code: '<fieldset />' },
-  { code: '<figcaption />' },
-  { code: '<figure />' },
-  { code: '<footer />' },
-  { code: '<form />' },
-  { code: '<frame />' },
-  { code: '<h1 />' },
-  { code: '<h2 />' },
-  { code: '<h3 />' },
-  { code: '<h4 />' },
-  { code: '<h5 />' },
-  { code: '<h6 />' },
-  { code: '<hr />' },
-  { code: '<iframe />' },
-  { code: '<img />' },
-  { code: '<legend />' },
-  { code: '<li />' },
-  { code: '<link />' },
-  { code: '<main />' },
-  { code: '<mark />' },
-  { code: '<marquee />' },
-  { code: '<menu />' },
-  { code: '<meter />' },
-  { code: '<nav />' },
-  { code: '<ol />' },
-  { code: '<p />' },
-  { code: '<pre />' },
-  { code: '<progress />' },
-  { code: '<ruby />' },
-  { code: '<section />' },
-  { code: '<table />' },
-  { code: '<tbody />' },
-  { code: '<td />' },
-  { code: '<tfoot />' },
-  { code: '<thead />' },
-  { code: '<time />' },
-  { code: '<ul />' },
-  // Non-interactive Roles
-  { code: '<div role="alert" />' },
-  { code: '<div role="alertdialog" />' },
-  { code: '<div role="application" />' },
-  { code: '<div role="article" />' },
-  { code: '<div role="banner" />' },
-  { code: '<div role="cell" />' },
-  { code: '<div role="complementary" />' },
-  { code: '<div role="contentinfo" />' },
-  { code: '<div role="definition" />' },
-  { code: '<div role="dialog" />' },
-  { code: '<div role="directory" />' },
-  { code: '<div role="document" />' },
-  { code: '<div role="feed" />' },
-  { code: '<div role="figure" />' },
-  { code: '<div role="form" />' },
-  { code: '<div role="group" />' },
-  { code: '<div role="heading" />' },
-  { code: '<div role="img" />' },
-  { code: '<div role="list" />' },
-  { code: '<div role="listitem" />' },
-  { code: '<div role="log" />' },
-  { code: '<div role="main" />' },
-  { code: '<div role="marquee" />' },
-  { code: '<div role="math" />' },
-  { code: '<div role="navigation" />' },
-  { code: '<div role="none" />' },
-  { code: '<div role="note" />' },
-  { code: '<div role="presentation" />' },
-  { code: '<div role="region" />' },
-  { code: '<div role="rowgroup" />' },
-  { code: '<div role="scrollbar" />' },
-  { code: '<div role="search" />' },
-  { code: '<div role="separator" />' },
-  { code: '<div role="status" />' },
-  { code: '<div role="table" />' },
-  { code: '<div role="tabpanel" />' },
-  { code: '<div role="term" />' },
-  { code: '<div role="timer" />' },
-  { code: '<div role="tooltip" />' },
-  // Via config
-  // Inputs. Ignore them because they might get a label from a wrapping label element.
-  { code: '<input />' },
-  { code: '<input type="button" />' },
-  { code: '<input type="checkbox" />' },
-  { code: '<input type="color" />' },
-  { code: '<input type="date" />' },
-  { code: '<input type="datetime" />' },
-  { code: '<input type="email" />' },
-  { code: '<input type="file" />' },
-  { code: '<input type="image" />' },
-  { code: '<input type="month" />' },
-  { code: '<input type="number" />' },
-  { code: '<input type="password" />' },
-  { code: '<input type="radio" />' },
-  { code: '<input type="range" />' },
-  { code: '<input type="reset" />' },
-  { code: '<input type="search" />' },
-  { code: '<input type="submit" />' },
-  { code: '<input type="tel" />' },
-  { code: '<input type="text" />' },
-  { code: '<input type="time" />' },
-  { code: '<input type="url" />' },
-  { code: '<input type="week" />' },
-  // Marginal interactive elements. It is difficult to insist that these
-  // elements contain a text label.
-  { code: '<audio />' },
-  { code: '<canvas />' },
-  { code: '<embed />' },
-  { code: '<textarea />' },
-  { code: '<tr />' },
-  { code: '<video />' },
-  // Interactive roles to ignore
-  { code: '<div role="grid" />' },
-  { code: '<div role="listbox" />' },
-  { code: '<div role="menu" />' },
-  { code: '<div role="menubar" />' },
-  { code: '<div role="radiogroup" />' },
-  { code: '<div role="row" />' },
-  { code: '<div role="tablist" />' },
-  { code: '<div role="toolbar" />' },
-  { code: '<div role="tree" />' },
-  { code: '<div role="treegrid" />' },
-];
-const neverValid = [
-  { code: '<button />', errors: [expectedError] },
-  { code: '<button><span /></button>', errors: [expectedError] },
-  { code: '<button><img /></button>', errors: [expectedError] },
-  { code: '<button><span title="This is not a real label" /></button>', errors: [expectedError] },
-  { code: '<button><span><span><span>Save</span></span></span></button>', options: [{ depth: 3 }], errors: [expectedError] },
-  { code: '<CustomControl><span><span></span></span></CustomControl>', options: [{ depth: 3, controlComponents: ['CustomControl'] }], errors: [expectedError] },
-  { code: '<a href="#" />', errors: [expectedError] },
-  { code: '<area href="#" />', errors: [expectedError] },
-  { code: '<label />', errors: [expectedError] },
-  { code: '<menuitem />', errors: [expectedError] },
-  { code: '<option />', errors: [expectedError] },
-  { code: '<th />', errors: [expectedError] },
-  // Interactive Roles
-  { code: '<div role="button" />', errors: [expectedError] },
-  { code: '<div role="checkbox" />', errors: [expectedError] },
-  { code: '<div role="columnheader" />', errors: [expectedError] },
-  { code: '<div role="combobox" />', errors: [expectedError] },
-  { code: '<div role="link" />', errors: [expectedError] },
-  { code: '<div role="gridcell" />', errors: [expectedError] },
-  { code: '<div role="menuitem" />', errors: [expectedError] },
-  { code: '<div role="menuitemcheckbox" />', errors: [expectedError] },
-  { code: '<div role="menuitemradio" />', errors: [expectedError] },
-  { code: '<div role="option" />', errors: [expectedError] },
-  { code: '<div role="progressbar" />', errors: [expectedError] },
-  { code: '<div role="radio" />', errors: [expectedError] },
-  { code: '<div role="rowheader" />', errors: [expectedError] },
-  { code: '<div role="searchbox" />', errors: [expectedError] },
-  { code: '<div role="slider" />', errors: [expectedError] },
-  { code: '<div role="spinbutton" />', errors: [expectedError] },
-  { code: '<div role="switch" />', errors: [expectedError] },
-  { code: '<div role="tab" />', errors: [expectedError] },
-  { code: '<div role="textbox" />', errors: [expectedError] },
-];
-
-const recommendedOptions = (configs.recommended.rules[ruleName][1] || {});
-ruleTester.run(`${ruleName}:recommended`, rule, {
-  valid: [
-    ...alwaysValid,
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-});
-
-const strictOptions = (configs.strict.rules[ruleName][1] || {});
-ruleTester.run(`${ruleName}:strict`, rule, {
-  valid: [
-    ...alwaysValid,
-  ]
-    .map(ruleOptionsMapperFactory(strictOptions))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-  ]
-    .map(ruleOptionsMapperFactory(strictOptions))
-    .map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/heading-has-content-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/heading-has-content-test.js
deleted file mode 100644
index 7e762b1..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/heading-has-content-test.js
+++ /dev/null
@@ -1,67 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce heading (h1, h2, etc) elements contain accessible content.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/heading-has-content';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: 'Headings must have content and the content must be accessible by a screen reader.',
-  type: 'JSXOpeningElement',
-};
-
-const components = [{
-  components: ['Heading', 'Title'],
-}];
-
-ruleTester.run('heading-has-content', rule, {
-  valid: [
-    // DEFAULT ELEMENT TESTS
-    { code: '<div />;' },
-    { code: '<h1>Foo</h1>' },
-    { code: '<h2>Foo</h2>' },
-    { code: '<h3>Foo</h3>' },
-    { code: '<h4>Foo</h4>' },
-    { code: '<h5>Foo</h5>' },
-    { code: '<h6>Foo</h6>' },
-    { code: '<h6>123</h6>' },
-    { code: '<h1><Bar /></h1>' },
-    { code: '<h1>{foo}</h1>' },
-    { code: '<h1>{foo.bar}</h1>' },
-    { code: '<h1 dangerouslySetInnerHTML={{ __html: "foo" }} />' },
-    { code: '<h1 children={children} />' },
-    // CUSTOM ELEMENT TESTS FOR COMPONENTS OPTION
-    { code: '<Heading>Foo</Heading>', options: components },
-    { code: '<Title>Foo</Title>', options: components },
-    { code: '<Heading><Bar /></Heading>', options: components },
-    { code: '<Heading>{foo}</Heading>', options: components },
-    { code: '<Heading>{foo.bar}</Heading>', options: components },
-    { code: '<Heading dangerouslySetInnerHTML={{ __html: "foo" }} />', options: components },
-    { code: '<Heading children={children} />', options: components },
-    { code: '<h1 aria-hidden />' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    // DEFAULT ELEMENT TESTS
-    { code: '<h1 />', errors: [expectedError] },
-    { code: '<h1><Bar aria-hidden /></h1>', errors: [expectedError] },
-    { code: '<h1>{undefined}</h1>', errors: [expectedError] },
-
-    // CUSTOM ELEMENT TESTS FOR COMPONENTS OPTION
-    { code: '<Heading />', errors: [expectedError], options: components },
-    { code: '<Heading><Bar aria-hidden /></Heading>', errors: [expectedError], options: components },
-    { code: '<Heading>{undefined}</Heading>', errors: [expectedError], options: components },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/html-has-lang-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/html-has-lang-test.js
deleted file mode 100644
index ff3fb25..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/html-has-lang-test.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce html element has lang prop.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/html-has-lang';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: '<html> elements must have the lang prop.',
-  type: 'JSXOpeningElement',
-};
-
-ruleTester.run('html-has-lang', rule, {
-  valid: [
-    { code: '<div />;' },
-    { code: '<html lang="en" />' },
-    { code: '<html lang="en-US" />' },
-    { code: '<html lang={foo} />' },
-    { code: '<html lang />' },
-    { code: '<HTML />' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<html />', errors: [expectedError] },
-    { code: '<html {...props} />', errors: [expectedError] },
-    { code: '<html lang={undefined} />', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/iframe-has-title-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/iframe-has-title-test.js
deleted file mode 100644
index ed07483..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/iframe-has-title-test.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce iframe elements have a title attribute.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/iframe-has-title';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: '<iframe> elements must have a unique title property.',
-  type: 'JSXOpeningElement',
-};
-
-ruleTester.run('html-has-lang', rule, {
-  valid: [
-    { code: '<div />;' },
-    { code: '<iframe title="Unique title" />' },
-    { code: '<iframe title={foo} />' },
-    { code: '<FooComponent />' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<iframe />', errors: [expectedError] },
-    { code: '<iframe {...props} />', errors: [expectedError] },
-    { code: '<iframe title={undefined} />', errors: [expectedError] },
-    { code: '<iframe title="" />', errors: [expectedError] },
-    { code: '<iframe title={false} />', errors: [expectedError] },
-    { code: '<iframe title={true} />', errors: [expectedError] },
-    { code: "<iframe title={''} />", errors: [expectedError] },
-    { code: '<iframe title={``} />', errors: [expectedError] },
-    { code: '<iframe title={""} />', errors: [expectedError] },
-    { code: '<iframe title={42} />', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/img-redundant-alt-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/img-redundant-alt-test.js
deleted file mode 100644
index a345352..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/img-redundant-alt-test.js
+++ /dev/null
@@ -1,115 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce img alt attribute does not have the word image, picture, or photo.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/img-redundant-alt';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const array = [{
-  components: ['Image'],
-  words: ['Word1', 'Word2'],
-}];
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: 'Redundant alt attribute. Screen-readers already announce `img` tags as an image. You don’t need to use the words `image`, `photo,` or `picture` (or any specified custom words) in the alt prop.',
-  type: 'JSXOpeningElement',
-};
-
-ruleTester.run('img-redundant-alt', rule, {
-  valid: [
-    { code: '<img alt="foo" />;' },
-    { code: '<img alt="picture of me taking a photo of an image" aria-hidden />' },
-    { code: '<img aria-hidden alt="photo of image" />' },
-    { code: '<img ALt="foo" />;' },
-    { code: '<img {...this.props} alt="foo" />' },
-    { code: '<img {...this.props} alt={"foo"} />' },
-    { code: '<img {...this.props} alt={alt} />' },
-    { code: '<a />' },
-    { code: '<img />' },
-    { code: '<IMG />' },
-    { code: '<img alt={undefined} />' },
-    { code: '<img alt={`this should pass for ${now}`} />' },
-    { code: '<img alt={`this should pass for ${photo}`} />' },
-    { code: '<img alt={`this should pass for ${image}`} />' },
-    { code: '<img alt={`this should pass for ${picture}`} />' },
-    { code: '<img alt={`${photo}`} />' },
-    { code: '<img alt={`${image}`} />' },
-    { code: '<img alt={`${picture}`} />' },
-    { code: '<img alt={"undefined"} />' },
-    { code: '<img alt={() => {}} />' },
-    { code: '<img alt={function(e){}} />' },
-    { code: '<img aria-hidden={false} alt="Doing cool things." />' },
-    { code: '<UX.Layout>test</UX.Layout>' },
-    { code: '<img alt={imageAlt} />' },
-    { code: '<img alt />' },
-    { code: '<img alt="Photography" />;' },
-    { code: '<img alt="ImageMagick" />;' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<img alt="Photo of friend." />;', errors: [expectedError] },
-    { code: '<img alt="Picture of friend." />;', errors: [expectedError] },
-    { code: '<img alt="Image of friend." />;', errors: [expectedError] },
-    { code: '<img alt="PhOtO of friend." />;', errors: [expectedError] },
-    { code: '<img alt={"photo"} />;', errors: [expectedError] },
-    { code: '<img alt="piCTUre of friend." />;', errors: [expectedError] },
-    { code: '<img alt="imAGE of friend." />;', errors: [expectedError] },
-    {
-      code: '<img alt="photo of cool person" aria-hidden={false} />',
-      errors: [expectedError],
-    },
-    {
-      code: '<img alt="picture of cool person" aria-hidden={false} />',
-      errors: [expectedError],
-    },
-    {
-      code: '<img alt="image of cool person" aria-hidden={false} />',
-      errors: [expectedError],
-    },
-    { code: '<img alt="photo" {...this.props} />', errors: [expectedError] },
-    { code: '<img alt="image" {...this.props} />', errors: [expectedError] },
-    { code: '<img alt="picture" {...this.props} />', errors: [expectedError] },
-    {
-      code: '<img alt={`picture doing ${things}`} {...this.props} />',
-      errors: [expectedError],
-    },
-    {
-      code: '<img alt={`photo doing ${things}`} {...this.props} />',
-      errors: [expectedError],
-    },
-    {
-      code: '<img alt={`image doing ${things}`} {...this.props} />',
-      errors: [expectedError],
-    },
-    {
-      code: '<img alt={`picture doing ${picture}`} {...this.props} />',
-      errors: [expectedError],
-    },
-    {
-      code: '<img alt={`photo doing ${photo}`} {...this.props} />',
-      errors: [expectedError],
-    },
-    {
-      code: '<img alt={`image doing ${image}`} {...this.props} />',
-      errors: [expectedError],
-    },
-
-    // TESTS FOR ARRAY OPTION TESTS
-    { code: '<img alt="Word1" />;', options: array, errors: [expectedError] },
-    { code: '<img alt="Word2" />;', options: array, errors: [expectedError] },
-    { code: '<Image alt="Word1" />;', options: array, errors: [expectedError] },
-    { code: '<Image alt="Word2" />;', options: array, errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/interactive-supports-focus-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/interactive-supports-focus-test.js
deleted file mode 100644
index b2ca2bd..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/interactive-supports-focus-test.js
+++ /dev/null
@@ -1,248 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce that elements with onClick handlers must be focusable.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import includes from 'array-includes';
-import { RuleTester } from 'eslint';
-import {
-  eventHandlers,
-  eventHandlersByType,
-} from 'jsx-ast-utils';
-import { configs } from '../../../src/index';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/interactive-supports-focus';
-import ruleOptionsMapperFactory from '../../__util__/ruleOptionsMapperFactory';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-function template(strings, ...keys) {
-  return (...values) => keys.reduce(
-    (acc, k, i) => acc + (values[k] || '') + strings[i + 1],
-    strings[0],
-  );
-}
-
-const ruleName = 'interactive-supports-focus';
-const type = 'JSXOpeningElement';
-const codeTemplate = template`<${0} role="${1}" ${2}={() => void 0} />`;
-const tabindexTemplate = template`<${0} role="${1}" ${2}={() => void 0} tabIndex="0" />`;
-const tabbableTemplate = template`Elements with the '${0}' interactive role must be tabbable.`;
-const focusableTemplate = template`Elements with the '${0}' interactive role must be focusable.`;
-
-const recommendedOptions = configs.recommended.rules[`jsx-a11y/${ruleName}`][1] || {};
-
-const strictOptions = configs.strict.rules[`jsx-a11y/${ruleName}`][1] || {};
-
-const alwaysValid = [
-  { code: '<div />' },
-  { code: '<div aria-hidden onClick={() => void 0} />' },
-  { code: '<div aria-hidden={true == true} onClick={() => void 0} />' },
-  { code: '<div aria-hidden={true === true} onClick={() => void 0} />' },
-  { code: '<div aria-hidden={hidden !== false} onClick={() => void 0} />' },
-  { code: '<div aria-hidden={hidden != false} onClick={() => void 0} />' },
-  { code: '<div aria-hidden={1 < 2} onClick={() => void 0} />' },
-  { code: '<div aria-hidden={1 <= 2} onClick={() => void 0} />' },
-  { code: '<div aria-hidden={2 > 1} onClick={() => void 0} />' },
-  { code: '<div aria-hidden={2 >= 1} onClick={() => void 0} />' },
-  { code: '<div onClick={() => void 0} />;' },
-  { code: '<div onClick={() => void 0} tabIndex={undefined} />;' },
-  { code: '<div onClick={() => void 0} tabIndex="bad" />;' },
-  { code: '<div onClick={() => void 0} role={undefined} />;' },
-  { code: '<div role="section" onClick={() => void 0} />' },
-  { code: '<div onClick={() => void 0} aria-hidden={false} />;' },
-  { code: '<div onClick={() => void 0} {...props} />;' },
-  { code: '<input type="text" onClick={() => void 0} />' },
-  { code: '<input type="hidden" onClick={() => void 0} tabIndex="-1" />' },
-  { code: '<input type="hidden" onClick={() => void 0} tabIndex={-1} />' },
-  { code: '<input onClick={() => void 0} />' },
-  { code: '<input onClick={() => void 0} role="combobox" />' },
-  { code: '<button onClick={() => void 0} className="foo" />' },
-  { code: '<option onClick={() => void 0} className="foo" />' },
-  { code: '<select onClick={() => void 0} className="foo" />' },
-  { code: '<area href="#" onClick={() => void 0} className="foo" />' },
-  { code: '<area onClick={() => void 0} className="foo" />' },
-  { code: '<textarea onClick={() => void 0} className="foo" />' },
-  { code: '<a onClick="showNextPage();">Next page</a>' },
-  { code: '<a onClick="showNextPage();" tabIndex={undefined}>Next page</a>' },
-  { code: '<a onClick="showNextPage();" tabIndex="bad">Next page</a>' },
-  { code: '<a onClick={() => void 0} />' },
-  { code: '<a tabIndex="0" onClick={() => void 0} />' },
-  { code: '<a tabIndex={dynamicTabIndex} onClick={() => void 0} />' },
-  { code: '<a tabIndex={0} onClick={() => void 0} />' },
-  { code: '<a role="button" href="#" onClick={() => void 0} />' },
-  { code: '<a onClick={() => void 0} href="http://x.y.z" />' },
-  { code: '<a onClick={() => void 0} href="http://x.y.z" tabIndex="0" />' },
-  { code: '<a onClick={() => void 0} href="http://x.y.z" tabIndex={0} />' },
-  { code: '<a onClick={() => void 0} href="http://x.y.z" role="button" />' },
-  { code: '<TestComponent onClick={doFoo} />' },
-  { code: '<input onClick={() => void 0} type="hidden" />;' },
-  { code: '<span onClick="submitForm();">Submit</span>' },
-  { code: '<span onClick="submitForm();" tabIndex={undefined}>Submit</span>' },
-  { code: '<span onClick="submitForm();" tabIndex="bad">Submit</span>' },
-  { code: '<span onClick="doSomething();" tabIndex="0">Click me!</span>' },
-  { code: '<span onClick="doSomething();" tabIndex={0}>Click me!</span>' },
-  { code: '<span onClick="doSomething();" tabIndex="-1">Click me too!</span>' },
-  {
-    code: '<a href="javascript:void(0);" onClick="doSomething();">Click ALL the things!</a>',
-  },
-  { code: '<section onClick={() => void 0} />;' },
-  { code: '<main onClick={() => void 0} />;' },
-  { code: '<article onClick={() => void 0} />;' },
-  { code: '<header onClick={() => void 0} />;' },
-  { code: '<footer onClick={() => void 0} />;' },
-  { code: '<div role="button" tabIndex="0" onClick={() => void 0} />' },
-  { code: '<div role="checkbox" tabIndex="0" onClick={() => void 0} />' },
-  { code: '<div role="link" tabIndex="0" onClick={() => void 0} />' },
-  { code: '<div role="menuitem" tabIndex="0" onClick={() => void 0} />' },
-  { code: '<div role="menuitemcheckbox" tabIndex="0" onClick={() => void 0} />' },
-  { code: '<div role="menuitemradio" tabIndex="0" onClick={() => void 0} />' },
-  { code: '<div role="option" tabIndex="0" onClick={() => void 0} />' },
-  { code: '<div role="radio" tabIndex="0" onClick={() => void 0} />' },
-  { code: '<div role="spinbutton" tabIndex="0" onClick={() => void 0} />' },
-  { code: '<div role="switch" tabIndex="0" onClick={() => void 0} />' },
-  { code: '<div role="tab" tabIndex="0" onClick={() => void 0} />' },
-  { code: '<div role="textbox" tabIndex="0" onClick={() => void 0} />' },
-  { code: '<div role="textbox" aria-disabled="true" onClick={() => void 0} />' },
-  { code: '<Foo.Bar onClick={() => void 0} aria-hidden={false} />;' },
-  { code: '<Input onClick={() => void 0} type="hidden" />;' },
-];
-
-const interactiveRoles = [
-  'button',
-  'checkbox',
-  'link',
-  'gridcell',
-  'menuitem',
-  'menuitemcheckbox',
-  'menuitemradio',
-  'option',
-  'radio',
-  'searchbox',
-  'slider',
-  'spinbutton',
-  'switch',
-  'tab',
-  'textbox',
-  'treeitem',
-];
-
-const recommendedRoles = [
-  'button',
-  'checkbox',
-  'link',
-  'searchbox',
-  'spinbutton',
-  'switch',
-  'textbox',
-];
-
-const strictRoles = [
-  'button',
-  'checkbox',
-  'link',
-  'progressbar',
-  'searchbox',
-  'slider',
-  'spinbutton',
-  'switch',
-  'textbox',
-];
-
-const staticElements = [
-  'div',
-];
-
-const triggeringHandlers = [
-  ...eventHandlersByType.mouse,
-  ...eventHandlersByType.keyboard,
-];
-
-const passReducer = (roles, handlers, messageTemplate) => (
-  staticElements.reduce((elementAcc, element) => (
-    elementAcc.concat(roles.reduce((roleAcc, role) => (
-      roleAcc.concat(handlers.map(handler => ({
-        code: messageTemplate(element, role, handler),
-      })))
-    ), []))
-  ), [])
-);
-
-const failReducer = (roles, handlers, messageTemplate) => (
-  staticElements.reduce((elementAcc, element) => (
-    elementAcc.concat(roles.reduce((roleAcc, role) => (
-      roleAcc.concat(handlers.map(handler => ({
-        code: codeTemplate(element, role, handler),
-        errors: [{
-          type,
-          message: messageTemplate(role),
-        }],
-      })))
-    ), []))
-  ), [])
-);
-
-ruleTester.run(`${ruleName}:recommended`, rule, {
-  valid: [
-    ...alwaysValid,
-    ...passReducer(
-      interactiveRoles,
-      eventHandlers.filter(handler => !includes(triggeringHandlers, handler)),
-      codeTemplate,
-    ),
-    ...passReducer(
-      interactiveRoles.filter(role => !includes(recommendedRoles, role)),
-      eventHandlers.filter(handler => includes(triggeringHandlers, handler)),
-      tabindexTemplate,
-    ),
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...failReducer(recommendedRoles, triggeringHandlers, tabbableTemplate),
-    ...failReducer(
-      interactiveRoles.filter(role => !includes(recommendedRoles, role)),
-      triggeringHandlers,
-      focusableTemplate,
-    ),
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-});
-
-ruleTester.run(`${ruleName}:strict`, rule, {
-  valid: [
-    ...alwaysValid,
-    ...passReducer(
-      interactiveRoles,
-      eventHandlers.filter(handler => !includes(triggeringHandlers, handler)),
-      codeTemplate,
-    ),
-    ...passReducer(
-      interactiveRoles.filter(role => !includes(strictRoles, role)),
-      eventHandlers.filter(handler => includes(triggeringHandlers, handler)),
-      tabindexTemplate,
-    ),
-  ]
-    .map(ruleOptionsMapperFactory(strictOptions))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...failReducer(strictRoles, triggeringHandlers, tabbableTemplate),
-    ...failReducer(
-      interactiveRoles.filter(role => !includes(strictRoles, role)),
-      triggeringHandlers,
-      focusableTemplate,
-    ),
-  ]
-    .map(ruleOptionsMapperFactory(strictOptions))
-    .map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/label-has-associated-control-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/label-has-associated-control-test.js
deleted file mode 100644
index 9b7d9f5..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/label-has-associated-control-test.js
+++ /dev/null
@@ -1,188 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce label tags have an associated control.
- * @author Jesse Beach
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/label-has-associated-control';
-import ruleOptionsMapperFactory from '../../__util__/ruleOptionsMapperFactory';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const ruleName = 'label-has-associated-control';
-
-const expectedError = {
-  message: 'A form label must be associated with a control.',
-  type: 'JSXOpeningElement',
-};
-
-const htmlForValid = [
-  { code: '<label htmlFor="js_id"><span><span><span>A label</span></span></span></label>', options: [{ depth: 4 }] },
-  { code: '<label htmlFor="js_id" aria-label="A label" />' },
-  { code: '<label htmlFor="js_id" aria-labelledby="A label" />' },
-  // Custom label component.
-  { code: '<CustomLabel htmlFor="js_id" aria-label="A label" />', options: [{ labelComponents: ['CustomLabel'] }] },
-  { code: '<CustomLabel htmlFor="js_id" label="A label" />', options: [{ labelAttributes: ['label'], labelComponents: ['CustomLabel'] }] },
-  // Custom label attributes.
-  { code: '<label htmlFor="js_id" label="A label" />', options: [{ labelAttributes: ['label'] }] },
-];
-const nestingValid = [
-  { code: '<label>A label<input /></label>' },
-  { code: '<label>A label<textarea /></label>' },
-  { code: '<label><img alt="A label" /><input /></label>' },
-  { code: '<label><img aria-label="A label" /><input /></label>' },
-  { code: '<label><span>A label<input /></span></label>' },
-  { code: '<label><span><span>A label<input /></span></span></label>', options: [{ depth: 3 }] },
-  { code: '<label><span><span><span>A label<input /></span></span></span></label>', options: [{ depth: 4 }] },
-  { code: '<label><span><span><span><span>A label</span><input /></span></span></span></label>', options: [{ depth: 5 }] },
-  { code: '<label><span><span><span><span aria-label="A label" /><input /></span></span></span></label>', options: [{ depth: 5 }] },
-  { code: '<label><span><span><span><input aria-label="A label" /></span></span></span></label>', options: [{ depth: 5 }] },
-  // Custom controlComponents.
-  { code: '<label><span>A label<CustomInput /></span></label>', options: [{ controlComponents: ['CustomInput'] }] },
-  { code: '<CustomLabel><span>A label<CustomInput /></span></CustomLabel>', options: [{ controlComponents: ['CustomInput'], labelComponents: ['CustomLabel'] }] },
-  { code: '<CustomLabel><span label="A label"><CustomInput /></span></CustomLabel>', options: [{ controlComponents: ['CustomInput'], labelComponents: ['CustomLabel'], labelAttributes: ['label'] }] },
-];
-
-const bothValid = [
-  { code: '<label htmlFor="js_id"><span><span><span>A label<input /></span></span></span></label>', options: [{ depth: 4 }] },
-  { code: '<label htmlFor="js_id" aria-label="A label"><input /></label>' },
-  { code: '<label htmlFor="js_id" aria-labelledby="A label"><input /></label>' },
-  { code: '<label htmlFor="js_id" aria-labelledby="A label"><textarea /></label>' },
-  // Custom label component.
-  { code: '<CustomLabel htmlFor="js_id" aria-label="A label"><input /></CustomLabel>', options: [{ labelComponents: ['CustomLabel'] }] },
-  { code: '<CustomLabel htmlFor="js_id" label="A label"><input /></CustomLabel>', options: [{ labelAttributes: ['label'], labelComponents: ['CustomLabel'] }] },
-  // Custom label attributes.
-  { code: '<label htmlFor="js_id" label="A label"><input /></label>', options: [{ labelAttributes: ['label'] }] },
-  { code: '<label htmlFor="selectInput">Some text<select id="selectInput" /></label>' },
-];
-
-const alwaysValid = [
-  { code: '<div />' },
-  { code: '<CustomElement />' },
-];
-
-const htmlForInvalid = [
-  { code: '<label htmlFor="js_id"><span><span><span>A label</span></span></span></label>', options: [{ depth: 4 }], errors: [expectedError] },
-  { code: '<label htmlFor="js_id" aria-label="A label" />', errors: [expectedError] },
-  { code: '<label htmlFor="js_id" aria-labelledby="A label" />', errors: [expectedError] },
-  // Custom label component.
-  { code: '<CustomLabel htmlFor="js_id" aria-label="A label" />', options: [{ labelComponents: ['CustomLabel'] }], errors: [expectedError] },
-  { code: '<CustomLabel htmlFor="js_id" label="A label" />', options: [{ labelAttributes: ['label'], labelComponents: ['CustomLabel'] }], errors: [expectedError] },
-  // Custom label attributes.
-  { code: '<label htmlFor="js_id" label="A label" />', options: [{ labelAttributes: ['label'] }], errors: [expectedError] },
-];
-const nestingInvalid = [
-  { code: '<label>A label<input /></label>', errors: [expectedError] },
-  { code: '<label>A label<textarea /></label>', errors: [expectedError] },
-  { code: '<label><img alt="A label" /><input /></label>', errors: [expectedError] },
-  { code: '<label><img aria-label="A label" /><input /></label>', errors: [expectedError] },
-  { code: '<label><span>A label<input /></span></label>', errors: [expectedError] },
-  { code: '<label><span><span>A label<input /></span></span></label>', options: [{ depth: 3 }], errors: [expectedError] },
-  { code: '<label><span><span><span>A label<input /></span></span></span></label>', options: [{ depth: 4 }], errors: [expectedError] },
-  { code: '<label><span><span><span><span>A label</span><input /></span></span></span></label>', options: [{ depth: 5 }], errors: [expectedError] },
-  { code: '<label><span><span><span><span aria-label="A label" /><input /></span></span></span></label>', options: [{ depth: 5 }], errors: [expectedError] },
-  { code: '<label><span><span><span><input aria-label="A label" /></span></span></span></label>', options: [{ depth: 5 }], errors: [expectedError] },
-  // Custom controlComponents.
-  { code: '<label><span>A label<CustomInput /></span></label>', options: [{ controlComponents: ['CustomInput'] }], errors: [expectedError] },
-  { code: '<CustomLabel><span>A label<CustomInput /></span></CustomLabel>', options: [{ controlComponents: ['CustomInput'], labelComponents: ['CustomLabel'] }], errors: [expectedError] },
-  { code: '<CustomLabel><span label="A label"><CustomInput /></span></CustomLabel>', options: [{ controlComponents: ['CustomInput'], labelComponents: ['CustomLabel'], labelAttributes: ['label'] }], errors: [expectedError] },
-];
-
-const neverValid = [
-  { code: '<label htmlFor="js_id" />', errors: [expectedError] },
-  { code: '<label htmlFor="js_id"><input /></label>', errors: [expectedError] },
-  { code: '<label htmlFor="js_id"><textarea /></label>', errors: [expectedError] },
-  { code: '<label></label>', errors: [expectedError] },
-  { code: '<label>A label</label>', errors: [expectedError] },
-  { code: '<div><label /><input /></div>', errors: [expectedError] },
-  { code: '<div><label>A label</label><input /></div>', errors: [expectedError] },
-  // Custom label component.
-  { code: '<CustomLabel aria-label="A label" />', options: [{ labelComponents: ['CustomLabel'] }], errors: [expectedError] },
-  { code: '<CustomLabel label="A label" />', options: [{ labelAttributes: ['label'], labelComponents: ['CustomLabel'] }], errors: [expectedError] },
-  // Custom label attributes.
-  { code: '<label label="A label" />', options: [{ labelAttributes: ['label'] }], errors: [expectedError] },
-  // Custom controlComponents.
-  { code: '<label><span><CustomInput /></span></label>', options: [{ controlComponents: ['CustomInput'] }], errors: [expectedError] },
-  { code: '<CustomLabel><span><CustomInput /></span></CustomLabel>', options: [{ controlComponents: ['CustomInput'], labelComponents: ['CustomLabel'] }], errors: [expectedError] },
-  { code: '<CustomLabel><span><CustomInput /></span></CustomLabel>', options: [{ controlComponents: ['CustomInput'], labelComponents: ['CustomLabel'], labelAttributes: ['label'] }], errors: [expectedError] },
-];
-// htmlFor valid
-ruleTester.run(ruleName, rule, {
-  valid: [
-    ...alwaysValid,
-    ...htmlForValid,
-  ]
-    .map(ruleOptionsMapperFactory({
-      assert: 'htmlFor',
-    }))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-    ...nestingInvalid,
-  ]
-    .map(ruleOptionsMapperFactory({
-      assert: 'htmlFor',
-    }))
-    .map(parserOptionsMapper),
-});
-
-// nesting valid
-ruleTester.run(ruleName, rule, {
-  valid: [
-    ...alwaysValid,
-    ...nestingValid,
-  ]
-    .map(ruleOptionsMapperFactory({
-      assert: 'nesting',
-    }))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-    ...htmlForInvalid,
-  ]
-    .map(ruleOptionsMapperFactory({
-      assert: 'nesting',
-    }))
-    .map(parserOptionsMapper),
-});
-
-// either valid
-ruleTester.run(ruleName, rule, {
-  valid: [
-    ...alwaysValid,
-    ...htmlForValid,
-    ...nestingValid,
-  ]
-    .map(ruleOptionsMapperFactory({
-      assert: 'either',
-    }))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-  ].map(parserOptionsMapper),
-});
-
-// both valid
-ruleTester.run(ruleName, rule, {
-  valid: [
-    ...alwaysValid,
-    ...bothValid,
-  ]
-    .map(ruleOptionsMapperFactory({
-      assert: 'both',
-    }))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/label-has-for-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/label-has-for-test.js
deleted file mode 100644
index 85cb1b1..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/label-has-for-test.js
+++ /dev/null
@@ -1,224 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce label tags have htmlFor attribute.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import assign from 'object.assign';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/label-has-for';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedNestingError = {
-  message: 'Form label must have the following type of associated control: nesting',
-  type: 'JSXOpeningElement',
-};
-
-const expectedSomeError = {
-  message: 'Form label must have ANY of the following types of associated control: nesting, id',
-  type: 'JSXOpeningElement',
-};
-
-const expectedEveryError = {
-  message: 'Form label must have ALL of the following types of associated control: nesting, id',
-  type: 'JSXOpeningElement',
-};
-
-
-const optionsComponents = [{
-  components: ['Label', 'Descriptor'],
-}];
-const optionsRequiredNesting = [{
-  required: 'nesting',
-}];
-const optionsRequiredSome = [{
-  required: { some: ['nesting', 'id'] },
-}];
-const optionsRequiredEvery = [{
-  required: { every: ['nesting', 'id'] },
-}];
-const optionsChildrenAllowed = [{
-  allowChildren: true,
-}];
-
-ruleTester.run('label-has-for', rule, {
-  valid: [
-    // DEFAULT ELEMENT 'label' TESTS
-    { code: '<div />' },
-    { code: '<label htmlFor="foo"><input /></label>' },
-    { code: '<label htmlFor="foo"><textarea /></label>' },
-    { code: '<Label />' }, // lower-case convention refers to real HTML elements.
-    { code: '<Label htmlFor="foo" />' },
-    { code: '<Descriptor />' },
-    { code: '<Descriptor htmlFor="foo">Test!</Descriptor>' },
-    { code: '<UX.Layout>test</UX.Layout>' },
-
-    // CUSTOM ELEMENT ARRAY OPTION TESTS
-    { code: '<Label htmlFor="foo" />', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
-    { code: '<Label htmlFor={"foo"} />', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
-    { code: '<Label htmlFor={foo} />', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
-    { code: '<Label htmlFor={`${id}`} />', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
-    { code: '<div />', options: optionsComponents },
-    { code: '<Label htmlFor="something"><input /></Label>', options: optionsComponents },
-    { code: '<Label htmlFor="foo">Test!</Label>', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
-    { code: '<Descriptor htmlFor="foo" />', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
-    { code: '<Descriptor htmlFor={"foo"} />', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
-    { code: '<Descriptor htmlFor={foo} />', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
-    { code: '<Descriptor htmlFor={`${id}`} />', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
-    { code: '<Descriptor htmlFor="foo">Test!</Descriptor>', options: [assign({}, optionsComponents[0], optionsRequiredSome[0])] },
-    { code: '<label htmlFor="foo" />', options: optionsRequiredSome },
-    { code: '<label htmlFor={"foo"} />', options: optionsRequiredSome },
-    { code: '<label htmlFor={foo} />', options: optionsRequiredSome },
-    { code: '<label htmlFor={`${id}`} />', options: optionsRequiredSome },
-    { code: '<label htmlFor="foo">Test!</label>', options: optionsRequiredSome },
-    { code: '<label><input /></label>', options: optionsRequiredSome },
-    { code: '<label><input /></label>', options: optionsRequiredNesting },
-    { code: '<label htmlFor="input"><input /></label>', options: optionsRequiredEvery },
-    { code: '<label><input /></label>', options: optionsChildrenAllowed },
-    { code: '<Descriptor htmlFor="foo">Test!</Descriptor>', options: [assign({}, optionsComponents, optionsChildrenAllowed)] },
-    { code: '<label>Test!</label>', options: optionsChildrenAllowed },
-    { code: '<label htmlFor="foo">Test!</label>', options: optionsChildrenAllowed },
-    { code: '<label>{children}</label>', options: optionsChildrenAllowed },
-    { code: '<label htmlFor="children">{children}</label>', options: optionsChildrenAllowed },
-    { code: '<label htmlFor={id}>{ labelText }<div><input id={id} type="checkbox" name={id} value={value} /></div></label>', options: optionsRequiredEvery },
-    { code: '<label htmlFor={id}>{ labelText }<div><div><div><div><input id={id} type="checkbox" name={id} value={value} /></div></div></div></div></label>', options: optionsRequiredEvery },
-  ].map(parserOptionsMapper),
-  invalid: [
-    // DEFAULT ELEMENT 'label' TESTS
-    { code: '<label id="foo" />', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label htmlFor={undefined} />', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label htmlFor={`${undefined}`} />', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label>First Name</label>', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label {...props}>Foo</label>', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label><input /></label>', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label><textarea /></label>', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label>{children}</label>', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label htmlFor="foo" />', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label htmlFor={"foo"} />', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label htmlFor={foo} />', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label htmlFor={`${id}`} />', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label htmlFor="foo">Test!</label>', errors: [expectedEveryError], options: optionsRequiredEvery },
-    { code: '<label htmlFor={id}>{ labelText }<div><div><div><div><div id={id} type="checkbox" name={id} value={value} /></div></div></div></div></label>', errors: [expectedEveryError], options: optionsRequiredEvery },
-    //
-    // // CUSTOM ELEMENT ARRAY OPTION TESTS
-    {
-      code: '<Label></Label>',
-      errors: [expectedEveryError],
-      options: optionsComponents,
-    },
-    {
-      code: '<Label htmlFor="foo" />',
-      errors: [expectedEveryError],
-      options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
-    },
-    {
-      code: '<Label htmlFor={"foo"} />',
-      errors: [expectedEveryError],
-      options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
-    },
-    {
-      code: '<Label htmlFor={foo} />',
-      errors: [expectedEveryError],
-      options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
-    },
-    {
-      code: '<Label htmlFor={`${id}`} />',
-      errors: [expectedEveryError],
-      options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
-    },
-    {
-      code: '<Label htmlFor="foo">Test!</Label>',
-      errors: [expectedEveryError],
-      options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
-    },
-    {
-      code: '<Descriptor htmlFor="foo" />',
-      errors: [expectedEveryError],
-      options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
-    },
-    {
-      code: '<Descriptor htmlFor={"foo"} />',
-      errors: [expectedEveryError],
-      options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
-    },
-    {
-      code: '<Descriptor htmlFor={foo} />',
-      errors: [expectedEveryError],
-      options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
-    },
-    {
-      code: '<Descriptor htmlFor={`${id}`} />',
-      errors: [expectedEveryError],
-      options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
-    },
-    {
-      code: '<Descriptor htmlFor="foo">Test!</Descriptor>',
-      errors: [expectedEveryError],
-      options: [{ ...optionsComponents[0], ...optionsRequiredEvery[0] }],
-    },
-    { code: '<Label id="foo" />', errors: [expectedEveryError], options: optionsComponents },
-    {
-      code: '<Label htmlFor={undefined} />',
-      errors: [expectedEveryError],
-      options: optionsComponents,
-    },
-    {
-      code: '<Label htmlFor={`${undefined}`} />',
-      errors: [expectedEveryError],
-      options: optionsComponents,
-    },
-    { code: '<Label>First Name</Label>', errors: [expectedEveryError], options: optionsComponents },
-    {
-      code: '<Label {...props}>Foo</Label>',
-      errors: [expectedEveryError],
-      options: optionsComponents,
-    },
-    { code: '<Descriptor id="foo" />', errors: [expectedEveryError], options: optionsComponents },
-    {
-      code: '<Descriptor htmlFor={undefined} />',
-      errors: [expectedEveryError],
-      options: optionsComponents,
-    },
-    {
-      code: '<Descriptor htmlFor={`${undefined}`} />',
-      errors: [expectedEveryError],
-      options: optionsComponents,
-    },
-    {
-      code: '<Descriptor>First Name</Descriptor>',
-      errors: [expectedEveryError],
-      options: optionsComponents,
-    },
-    {
-      code: '<Descriptor {...props}>Foo</Descriptor>',
-      errors: [expectedEveryError],
-      options: optionsComponents,
-    },
-    { code: '<label>{children}</label>', errors: [expectedEveryError], options: optionsComponents },
-    { code: '<label htmlFor="foo" />', errors: [expectedNestingError], options: optionsRequiredNesting },
-    { code: '<label>First Name</label>', errors: [expectedNestingError], options: optionsRequiredNesting },
-    { code: '<label>First Name</label>', errors: [expectedSomeError], options: optionsRequiredSome },
-    { code: '<label>{children}</label>', errors: [expectedSomeError], options: optionsRequiredSome },
-    { code: '<label>{children}</label>', errors: [expectedNestingError], options: optionsRequiredNesting },
-    {
-      code: '<form><input type="text" id="howmuch" value="1" /><label htmlFor="howmuch">How much ?</label></form>',
-      errors: [expectedEveryError],
-      options: optionsRequiredEvery,
-    },
-    {
-      code: '<form><input type="text" id="howmuch" value="1" /><label htmlFor="howmuch">How much ?<span /></label></form>',
-      errors: [expectedEveryError],
-      options: optionsRequiredEvery,
-    },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/lang-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/lang-test.js
deleted file mode 100644
index 810bebc..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/lang-test.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce lang attribute has a valid value.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/lang';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: 'lang attribute must have a valid value.',
-  type: 'JSXAttribute',
-};
-
-ruleTester.run('lang', rule, {
-  valid: [
-    { code: '<div />;' },
-    { code: '<div foo="bar" />;' },
-    { code: '<div lang="foo" />;' },
-    { code: '<html lang="en" />' },
-    { code: '<html lang="en-US" />' },
-    { code: '<html lang={foo} />' },
-    { code: '<HTML lang="foo" />' },
-    { code: '<Foo lang="bar" />' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<html lang="foo" />', errors: [expectedError] },
-    { code: '<html lang="zz-LL" />', errors: [expectedError] },
-    { code: '<html lang={undefined} />', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/media-has-caption-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/media-has-caption-test.js
deleted file mode 100644
index 665ad2f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/media-has-caption-test.js
+++ /dev/null
@@ -1,138 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview <audio> and <video> elements must have a <track> for captions.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/media-has-caption';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: 'Media elements such as <audio> and <video> must have a <track> for captions.',
-  type: 'JSXOpeningElement',
-};
-
-const customSchema = [
-  {
-    audio: ['Audio'],
-    video: ['Video'],
-    track: ['Track'],
-  },
-];
-
-ruleTester.run('media-has-caption', rule, {
-  valid: [
-    { code: '<div />;' },
-    { code: '<MyDiv />;' },
-    { code: '<audio><track kind="captions" /></audio>' },
-    { code: '<audio><track kind="Captions" /></audio>' },
-    {
-      code: '<audio><track kind="Captions" /><track kind="subtitles" /></audio>',
-    },
-    { code: '<video><track kind="captions" /></video>' },
-    { code: '<video><track kind="Captions" /></video>' },
-    {
-      code: '<video><track kind="Captions" /><track kind="subtitles" /></video>',
-    },
-    {
-      code: '<audio muted={true}></audio>',
-    },
-    {
-      code: '<video muted={true}></video>',
-    },
-    {
-      code: '<video muted></video>',
-    },
-    {
-      code: '<Audio><track kind="captions" /></Audio>',
-      options: customSchema,
-    },
-    {
-      code: '<audio><Track kind="captions" /></audio>',
-      options: customSchema,
-    },
-    {
-      code: '<Video><track kind="captions" /></Video>',
-      options: customSchema,
-    },
-    {
-      code: '<video><Track kind="captions" /></video>',
-      options: customSchema,
-    },
-    {
-      code: '<Audio><Track kind="captions" /></Audio>',
-      options: customSchema,
-    },
-    {
-      code: '<Video><Track kind="captions" /></Video>',
-      options: customSchema,
-    },
-    {
-      code: '<Video muted></Video>',
-      options: customSchema,
-    },
-    {
-      code: '<Video muted={true}></Video>',
-      options: customSchema,
-    },
-    {
-      code: '<Audio muted></Audio>',
-      options: customSchema,
-    },
-    {
-      code: '<Audio muted={true}></Audio>',
-      options: customSchema,
-    },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<audio><track /></audio>', errors: [expectedError] },
-    {
-      code: '<audio><track kind="subtitles" /></audio>',
-      errors: [expectedError],
-    },
-    { code: '<audio />', errors: [expectedError] },
-    { code: '<video><track /></video>', errors: [expectedError] },
-    {
-      code: '<video><track kind="subtitles" /></video>',
-      errors: [expectedError],
-    },
-    {
-      code: '<Audio muted={false}></Audio>',
-      options: customSchema,
-      errors: [expectedError],
-    },
-    {
-      code: '<Video muted={false}></Video>',
-      options: customSchema,
-      errors: [expectedError],
-    },
-    { code: '<video />', errors: [expectedError] },
-    { code: '<audio>Foo</audio>', errors: [expectedError] },
-    { code: '<video>Foo</video>', errors: [expectedError] },
-    { code: '<Audio />', options: customSchema, errors: [expectedError] },
-    { code: '<Video />', options: customSchema, errors: [expectedError] },
-    { code: '<audio><Track /></audio>', options: customSchema, errors: [expectedError] },
-    { code: '<video><Track /></video>', options: customSchema, errors: [expectedError] },
-    {
-      code: '<Audio><Track kind="subtitles" /></Audio>',
-      options: customSchema,
-      errors: [expectedError],
-    },
-    {
-      code: '<Video><Track kind="subtitles" /></Video>',
-      options: customSchema,
-      errors: [expectedError],
-    },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/mouse-events-have-key-events-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/mouse-events-have-key-events-test.js
deleted file mode 100644
index 542fe93..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/mouse-events-have-key-events-test.js
+++ /dev/null
@@ -1,67 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce onmouseover/onmouseout are accompanied
- *  by onfocus/onblur.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/mouse-events-have-key-events';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const mouseOverError = {
-  message: 'onMouseOver must be accompanied by onFocus for accessibility.',
-  type: 'JSXOpeningElement',
-};
-const mouseOutError = {
-  message: 'onMouseOut must be accompanied by onBlur for accessibility.',
-  type: 'JSXOpeningElement',
-};
-
-ruleTester.run('mouse-events-have-key-events', rule, {
-  valid: [
-    { code: '<div onMouseOver={() => void 0} onFocus={() => void 0} />;' },
-    {
-      code: '<div onMouseOver={() => void 0} onFocus={() => void 0} {...props} />;',
-    },
-    { code: '<div onMouseOver={handleMouseOver} onFocus={handleFocus} />;' },
-    {
-      code: '<div onMouseOver={handleMouseOver} onFocus={handleFocus} {...props} />;',
-    },
-    { code: '<div />;' },
-    { code: '<div onMouseOut={() => void 0} onBlur={() => void 0} />' },
-    { code: '<div onMouseOut={() => void 0} onBlur={() => void 0} {...props} />' },
-    { code: '<div onMouseOut={handleMouseOut} onBlur={handleOnBlur} />' },
-    { code: '<div onMouseOut={handleMouseOut} onBlur={handleOnBlur} {...props} />' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<div onMouseOver={() => void 0} />;', errors: [mouseOverError] },
-    { code: '<div onMouseOut={() => void 0} />', errors: [mouseOutError] },
-    {
-      code: '<div onMouseOver={() => void 0} onFocus={undefined} />;',
-      errors: [mouseOverError],
-    },
-    {
-      code: '<div onMouseOut={() => void 0} onBlur={undefined} />',
-      errors: [mouseOutError],
-    },
-    {
-      code: '<div onMouseOver={() => void 0} {...props} />',
-      errors: [mouseOverError],
-    },
-    {
-      code: '<div onMouseOut={() => void 0} {...props} />',
-      errors: [mouseOutError],
-    },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-access-key-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-access-key-test.js
deleted file mode 100644
index ea2ee66..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-access-key-test.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce no accesskey attribute on element.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/no-access-key';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: 'No access key attribute allowed. Inconsistencies between keyboard shortcuts and keyboard comments used by screenreader and keyboard only users create a11y complications.',
-  type: 'JSXOpeningElement',
-};
-
-ruleTester.run('no-access-key', rule, {
-  valid: [
-    { code: '<div />;' },
-    { code: '<div {...props} />' },
-    { code: '<div accessKey={undefined} />' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<div accesskey="h" />', errors: [expectedError] },
-    { code: '<div accessKey="h" />', errors: [expectedError] },
-    { code: '<div accessKey="h" {...props} />', errors: [expectedError] },
-    { code: '<div acCesSKeY="y" />', errors: [expectedError] },
-    { code: '<div accessKey={"y"} />', errors: [expectedError] },
-    { code: '<div accessKey={`${y}`} />', errors: [expectedError] },
-    {
-      code: '<div accessKey={`${undefined}y${undefined}`} />',
-      errors: [expectedError],
-    },
-    { code: '<div accessKey={`This is ${bad}`} />', errors: [expectedError] },
-    { code: '<div accessKey={accessKey} />', errors: [expectedError] },
-    { code: '<div accessKey={`${undefined}`} />', errors: [expectedError] },
-    { code: '<div accessKey={`${undefined}${undefined}`} />', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-autofocus-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-autofocus-test.js
deleted file mode 100644
index 7562862..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-autofocus-test.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce autoFocus prop is not used.
- * @author Ethan Cohen <@evcohen>
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/no-autofocus';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: 'The autoFocus prop should not be used, as it can reduce usability and accessibility for users.',
-  type: 'JSXAttribute',
-};
-
-const ignoreNonDOMSchema = [
-  {
-    ignoreNonDOM: true,
-  },
-];
-
-ruleTester.run('no-autofocus', rule, {
-  valid: [
-    { code: '<div />;' },
-    { code: '<div autofocus />;' },
-    { code: '<input autofocus="true" />;' },
-    { code: '<Foo bar />' },
-    { code: '<Foo autoFocus />', options: ignoreNonDOMSchema },
-    { code: '<div><div autofocus /></div>', options: ignoreNonDOMSchema },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<div autoFocus />', errors: [expectedError] },
-    { code: '<div autoFocus={true} />', errors: [expectedError] },
-    { code: '<div autoFocus={false} />', errors: [expectedError] },
-    { code: '<div autoFocus={undefined} />', errors: [expectedError] },
-    { code: '<div autoFocus="true" />', errors: [expectedError] },
-    { code: '<div autoFocus="false" />', errors: [expectedError] },
-    { code: '<input autoFocus />', errors: [expectedError] },
-    { code: '<Foo autoFocus />', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-distracting-elements-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-distracting-elements-test.js
deleted file mode 100644
index 7ca6f51..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-distracting-elements-test.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce distracting elements are not used.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/no-distracting-elements';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = element => ({
-  message: `Do not use <${element}> elements as they can create visual accessibility issues and are deprecated.`,
-  type: 'JSXOpeningElement',
-});
-
-ruleTester.run('no-marquee', rule, {
-  valid: [
-    { code: '<div />;' },
-    { code: '<Marquee />' },
-    { code: '<div marquee />' },
-    { code: '<Blink />' },
-    { code: '<div blink />' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<marquee />', errors: [expectedError('marquee')] },
-    { code: '<marquee {...props} />', errors: [expectedError('marquee')] },
-    { code: '<marquee lang={undefined} />', errors: [expectedError('marquee')] },
-    { code: '<blink />', errors: [expectedError('blink')] },
-    { code: '<blink {...props} />', errors: [expectedError('blink')] },
-    { code: '<blink foo={undefined} />', errors: [expectedError('blink')] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-interactive-element-to-noninteractive-role-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-interactive-element-to-noninteractive-role-test.js
deleted file mode 100644
index fc788da..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-interactive-element-to-noninteractive-role-test.js
+++ /dev/null
@@ -1,389 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Disallow inherently interactive elements to be assigned
- * non-interactive roles.
- * @author Jesse Beach
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import { configs } from '../../../src/index';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/no-interactive-element-to-noninteractive-role';
-import ruleOptionsMapperFactory from '../../__util__/ruleOptionsMapperFactory';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-const ruleTester = new RuleTester();
-
-const errorMessage = 'Interactive elements should not be assigned non-interactive roles.';
-
-const expectedError = {
-  message: errorMessage,
-  type: 'JSXAttribute',
-};
-
-const ruleName = 'jsx-a11y/no-interactive-element-to-noninteractive-role';
-
-const alwaysValid = [
-  { code: '<TestComponent onClick={doFoo} />' },
-  { code: '<Button onClick={doFoo} />' },
-  /* Interactive elements */
-  { code: '<a href="http://x.y.z" role="button" />' },
-  { code: '<a href="http://x.y.z" tabIndex="0" role="button" />' },
-  { code: '<button className="foo" role="button" />' },
-  /* All flavors of input */
-  { code: '<input role="button" />' },
-  { code: '<input type="button" role="button" />' },
-  { code: '<input type="checkbox" role="button" />' },
-  { code: '<input type="color" role="button" />' },
-  { code: '<input type="date" role="button" />' },
-  { code: '<input type="datetime" role="button" />' },
-  { code: '<input type="datetime-local" role="button" />' },
-  { code: '<input type="email" role="button" />' },
-  { code: '<input type="file" role="button" />' },
-  { code: '<input type="image" role="button" />' },
-  { code: '<input type="month" role="button" />' },
-  { code: '<input type="number" role="button" />' },
-  { code: '<input type="password" role="button" />' },
-  { code: '<input type="radio" role="button" />' },
-  { code: '<input type="range" role="button" />' },
-  { code: '<input type="reset" role="button" />' },
-  { code: '<input type="search" role="button" />' },
-  { code: '<input type="submit" role="button" />' },
-  { code: '<input type="tel" role="button" />' },
-  { code: '<input type="text" role="button" />' },
-  { code: '<input type="time" role="button" />' },
-  { code: '<input type="url" role="button" />' },
-  { code: '<input type="week" role="button" />' },
-  { code: '<input type="hidden" role="button" />' },
-  /* End all flavors of input */
-  { code: '<menuitem role="button" />;' },
-  { code: '<option className="foo" role="button" />' },
-  { code: '<select className="foo" role="button" />' },
-  { code: '<textarea className="foo" role="button" />' },
-  { code: '<tr role="button" />;' },
-  /* HTML elements with neither an interactive or non-interactive valence (static) */
-  { code: '<a role="button" />' },
-  { code: '<a role="img" />;' },
-  { code: '<a tabIndex="0" role="button" />' },
-  { code: '<a tabIndex="0" role="img" />' },
-  { code: '<acronym role="button" />;' },
-  { code: '<address role="button" />;' },
-  { code: '<applet role="button" />;' },
-  { code: '<aside role="button" />;' },
-  { code: '<audio role="button" />;' },
-  { code: '<b role="button" />;' },
-  { code: '<base role="button" />;' },
-  { code: '<bdi role="button" />;' },
-  { code: '<bdo role="button" />;' },
-  { code: '<big role="button" />;' },
-  { code: '<blink role="button" />;' },
-  { code: '<blockquote role="button" />;' },
-  { code: '<body role="button" />;' },
-  { code: '<br role="button" />;' },
-  { code: '<canvas role="button" />;' },
-  { code: '<caption role="button" />;' },
-  { code: '<center role="button" />;' },
-  { code: '<cite role="button" />;' },
-  { code: '<code role="button" />;' },
-  { code: '<col role="button" />;' },
-  { code: '<colgroup role="button" />;' },
-  { code: '<content role="button" />;' },
-  { code: '<data role="button" />;' },
-  { code: '<datalist role="button" />;' },
-  { code: '<del role="button" />;' },
-  { code: '<details role="button" />;' },
-  { code: '<dir role="button" />;' },
-  { code: '<div role="button" />;' },
-  { code: '<div className="foo" role="button" />;' },
-  { code: '<div className="foo" {...props} role="button" />;' },
-  { code: '<div aria-hidden role="button" />;' },
-  { code: '<div aria-hidden={true} role="button" />;' },
-  { code: '<div role="button" />;' },
-  { code: '<div role={undefined} role="button" />;' },
-  { code: '<div {...props} role="button" />;' },
-  { code: '<div onKeyUp={() => void 0} aria-hidden={false} role="button" />;' },
-  { code: '<dl role="button" />;' },
-  { code: '<em role="button" />;' },
-  { code: '<embed role="button" />;' },
-  { code: '<figcaption role="button" />;' },
-  { code: '<font role="button" />;' },
-  { code: '<footer role="button" />;' },
-  { code: '<frameset role="button" />;' },
-  { code: '<head role="button" />;' },
-  { code: '<header role="button" />;' },
-  { code: '<hgroup role="button" />;' },
-  { code: '<html role="button" />;' },
-  { code: '<i role="button" />;' },
-  { code: '<iframe role="button" />;' },
-  { code: '<ins role="button" />;' },
-  { code: '<kbd role="button" />;' },
-  { code: '<keygen role="button" />;' },
-  { code: '<label role="button" />;' },
-  { code: '<legend role="button" />;' },
-  { code: '<link role="button" />;' },
-  { code: '<map role="button" />;' },
-  { code: '<mark role="button" />;' },
-  { code: '<marquee role="button" />;' },
-  { code: '<menu role="button" />;' },
-  { code: '<meta role="button" />;' },
-  { code: '<meter role="button" />;' },
-  { code: '<noembed role="button" />;' },
-  { code: '<noscript role="button" />;' },
-  { code: '<object role="button" />;' },
-  { code: '<optgroup role="button" />;' },
-  { code: '<output role="button" />;' },
-  { code: '<p role="button" />;' },
-  { code: '<param role="button" />;' },
-  { code: '<picture role="button" />;' },
-  { code: '<pre role="button" />;' },
-  { code: '<progress role="button" />;' },
-  { code: '<q role="button" />;' },
-  { code: '<rp role="button" />;' },
-  { code: '<rt role="button" />;' },
-  { code: '<rtc role="button" />;' },
-  { code: '<ruby role="button" />;' },
-  { code: '<s role="button" />;' },
-  { code: '<samp role="button" />;' },
-  { code: '<script role="button" />;' },
-  { code: '<section role="button" />;' },
-  { code: '<small role="button" />;' },
-  { code: '<source role="button" />;' },
-  { code: '<spacer role="button" />;' },
-  { code: '<span role="button" />;' },
-  { code: '<strike role="button" />;' },
-  { code: '<strong role="button" />;' },
-  { code: '<style role="button" />;' },
-  { code: '<sub role="button" />;' },
-  { code: '<summary role="button" />;' },
-  { code: '<sup role="button" />;' },
-  { code: '<th role="button" />;' },
-  { code: '<time role="button" />;' },
-  { code: '<title role="button" />;' },
-  { code: '<track role="button" />;' },
-  { code: '<tt role="button" />;' },
-  { code: '<u role="button" />;' },
-  { code: '<var role="button" />;' },
-  { code: '<video role="button" />;' },
-  { code: '<wbr role="button" />;' },
-  { code: '<xmp role="button" />;' },
-  /* HTML elements attributed with an interactive role */
-  { code: '<div role="button" />;' },
-  { code: '<div role="checkbox" />;' },
-  { code: '<div role="columnheader" />;' },
-  { code: '<div role="combobox" />;' },
-  { code: '<div role="grid" />;' },
-  { code: '<div role="gridcell" />;' },
-  { code: '<div role="link" />;' },
-  { code: '<div role="listbox" />;' },
-  { code: '<div role="menu" />;' },
-  { code: '<div role="menubar" />;' },
-  { code: '<div role="menuitem" />;' },
-  { code: '<div role="menuitemcheckbox" />;' },
-  { code: '<div role="menuitemradio" />;' },
-  { code: '<div role="option" />;' },
-  { code: '<div role="progressbar" />;' },
-  { code: '<div role="radio" />;' },
-  { code: '<div role="radiogroup" />;' },
-  { code: '<div role="row" />;' },
-  { code: '<div role="rowheader" />;' },
-  { code: '<div role="searchbox" />;' },
-  { code: '<div role="slider" />;' },
-  { code: '<div role="spinbutton" />;' },
-  { code: '<div role="switch" />;' },
-  { code: '<div role="tab" />;' },
-  { code: '<div role="textbox" />;' },
-  { code: '<div role="treeitem" />;' },
-  /* Presentation is a special case role that indicates intentional static semantics */
-  { code: '<div role="presentation" />;' },
-  /* HTML elements attributed with an abstract role */
-  { code: '<div role="command" />;' },
-  { code: '<div role="composite" />;' },
-  { code: '<div role="input" />;' },
-  { code: '<div role="landmark" />;' },
-  { code: '<div role="range" />;' },
-  { code: '<div role="roletype" />;' },
-  { code: '<div role="section" />;' },
-  { code: '<div role="sectionhead" />;' },
-  { code: '<div role="select" />;' },
-  { code: '<div role="structure" />;' },
-  { code: '<div role="tablist" />;' },
-  { code: '<div role="toolbar" />;' },
-  { code: '<div role="tree" />;' },
-  { code: '<div role="treegrid" />;' },
-  { code: '<div role="widget" />;' },
-  { code: '<div role="window" />;' },
-  /* HTML elements with an inherent, non-interactive role, assigned an
-   * interactive role. */
-  { code: '<main role="button" />;' },
-  { code: '<area role="button" />;' },
-  { code: '<article role="button" />;' },
-  { code: '<article role="button" />;' },
-  { code: '<dd role="button" />;' },
-  { code: '<dfn role="button" />;' },
-  { code: '<dt role="button" />;' },
-  { code: '<fieldset role="button" />;' },
-  { code: '<figure role="button" />;' },
-  { code: '<form role="button" />;' },
-  { code: '<frame role="button" />;' },
-  { code: '<h1 role="button" />;' },
-  { code: '<h2 role="button" />;' },
-  { code: '<h3 role="button" />;' },
-  { code: '<h4 role="button" />;' },
-  { code: '<h5 role="button" />;' },
-  { code: '<h6 role="button" />;' },
-  { code: '<hr role="button" />;' },
-  { code: '<img role="button" />;' },
-  { code: '<li role="button" />;' },
-  { code: '<li role="presentation" />;' },
-  { code: '<nav role="button" />;' },
-  { code: '<ol role="button" />;' },
-  { code: '<table role="button" />;' },
-  { code: '<tbody role="button" />;' },
-  { code: '<td role="button" />;' },
-  { code: '<tfoot role="button" />;' },
-  { code: '<thead role="button" />;' },
-  { code: '<ul role="button" />;' },
-  /* HTML elements attributed with a non-interactive role */
-  { code: '<div role="alert" />;' },
-  { code: '<div role="alertdialog" />;' },
-  { code: '<div role="application" />;' },
-  { code: '<div role="article" />;' },
-  { code: '<div role="banner" />;' },
-  { code: '<div role="cell" />;' },
-  { code: '<div role="complementary" />;' },
-  { code: '<div role="contentinfo" />;' },
-  { code: '<div role="definition" />;' },
-  { code: '<div role="dialog" />;' },
-  { code: '<div role="directory" />;' },
-  { code: '<div role="document" />;' },
-  { code: '<div role="feed" />;' },
-  { code: '<div role="figure" />;' },
-  { code: '<div role="form" />;' },
-  { code: '<div role="group" />;' },
-  { code: '<div role="heading" />;' },
-  { code: '<div role="img" />;' },
-  { code: '<div role="list" />;' },
-  { code: '<div role="listitem" />;' },
-  { code: '<div role="log" />;' },
-  { code: '<div role="main" />;' },
-  { code: '<div role="marquee" />;' },
-  { code: '<div role="math" />;' },
-  { code: '<div role="navigation" />;' },
-  { code: '<div role="note" />;' },
-  { code: '<div role="region" />;' },
-  { code: '<div role="rowgroup" />;' },
-  { code: '<div role="search" />;' },
-  { code: '<div role="separator" />;' },
-  { code: '<div role="scrollbar" />;' },
-  { code: '<div role="status" />;' },
-  { code: '<div role="table" />;' },
-  { code: '<div role="tabpanel" />;' },
-  { code: '<div role="term" />;' },
-  { code: '<div role="timer" />;' },
-  { code: '<div role="tooltip" />;' },
-  /* Namespaced roles are not checked */
-  { code: '<div mynamespace:role="term" />' },
-  { code: '<input mynamespace:role="img" />' },
-];
-
-const neverValid = [
-  /* Interactive elements */
-  { code: '<a href="http://x.y.z" role="img" />', errors: [expectedError] },
-  { code: '<a href="http://x.y.z" tabIndex="0" role="img" />', errors: [expectedError] },
-  /* All flavors of input */
-  { code: '<input role="img" />', errors: [expectedError] },
-  { code: '<input type="img" role="img" />', errors: [expectedError] },
-  { code: '<input type="checkbox" role="img" />', errors: [expectedError] },
-  { code: '<input type="color" role="img" />', errors: [expectedError] },
-  { code: '<input type="date" role="img" />', errors: [expectedError] },
-  { code: '<input type="datetime" role="img" />', errors: [expectedError] },
-  { code: '<input type="datetime-local" role="img" />', errors: [expectedError] },
-  { code: '<input type="email" role="img" />', errors: [expectedError] },
-  { code: '<input type="file" role="img" />', errors: [expectedError] },
-  { code: '<input type="hidden" role="img" />', errors: [expectedError] },
-  { code: '<input type="image" role="img" />', errors: [expectedError] },
-  { code: '<input type="month" role="img" />', errors: [expectedError] },
-  { code: '<input type="number" role="img" />', errors: [expectedError] },
-  { code: '<input type="password" role="img" />', errors: [expectedError] },
-  { code: '<input type="radio" role="img" />', errors: [expectedError] },
-  { code: '<input type="range" role="img" />', errors: [expectedError] },
-  { code: '<input type="reset" role="img" />', errors: [expectedError] },
-  { code: '<input type="search" role="img" />', errors: [expectedError] },
-  { code: '<input type="submit" role="img" />', errors: [expectedError] },
-  { code: '<input type="tel" role="img" />', errors: [expectedError] },
-  { code: '<input type="text" role="img" />', errors: [expectedError] },
-  { code: '<input type="time" role="img" />', errors: [expectedError] },
-  { code: '<input type="url" role="img" />', errors: [expectedError] },
-  { code: '<input type="week" role="img" />', errors: [expectedError] },
-  /* End all flavors of input */
-  { code: '<menuitem role="img" />;', errors: [expectedError] },
-  { code: '<option className="foo" role="img" />', errors: [expectedError] },
-  { code: '<select className="foo" role="img" />', errors: [expectedError] },
-  { code: '<textarea className="foo" role="img" />', errors: [expectedError] },
-  { code: '<tr role="img" />;', errors: [expectedError] },
-  /* Interactive elements */
-  { code: '<a href="http://x.y.z" role="listitem" />', errors: [expectedError] },
-  { code: '<a href="http://x.y.z" tabIndex="0" role="listitem" />', errors: [expectedError] },
-  /* All flavors of input */
-  { code: '<input role="listitem" />', errors: [expectedError] },
-  { code: '<input type="listitem" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="checkbox" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="color" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="date" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="datetime" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="datetime-local" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="email" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="file" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="image" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="month" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="number" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="password" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="radio" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="range" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="reset" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="search" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="submit" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="tel" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="text" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="time" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="url" role="listitem" />', errors: [expectedError] },
-  { code: '<input type="week" role="listitem" />', errors: [expectedError] },
-  /* End all flavors of input */
-  { code: '<menuitem role="listitem" />;', errors: [expectedError] },
-  { code: '<option className="foo" role="listitem" />', errors: [expectedError] },
-  { code: '<select className="foo" role="listitem" />', errors: [expectedError] },
-  { code: '<textarea className="foo" role="listitem" />', errors: [expectedError] },
-  { code: '<tr role="listitem" />;', errors: [expectedError] },
-];
-
-const recommendedOptions = (configs.recommended.rules[ruleName][1] || {});
-ruleTester.run(`${ruleName}:recommended`, rule, {
-  valid: [
-    ...alwaysValid,
-    { code: '<tr role="presentation" />;' },
-    { code: '<Component role="presentation" />;' },
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-});
-
-ruleTester.run(`${ruleName}:strict`, rule, {
-  valid: [
-    ...alwaysValid,
-  ].map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-    { code: '<tr role="presentation" />;', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-noninteractive-element-interactions-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-noninteractive-element-interactions-test.js
deleted file mode 100644
index 10d5d54..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-noninteractive-element-interactions-test.js
+++ /dev/null
@@ -1,465 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce non-interactive elements have no interactive handlers.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import { configs } from '../../../src/index';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/no-noninteractive-element-interactions';
-import ruleOptionsMapperFactory from '../../__util__/ruleOptionsMapperFactory';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const errorMessage = 'Non-interactive elements should not be assigned mouse or keyboard event listeners.';
-
-const expectedError = {
-  message: errorMessage,
-  type: 'JSXOpeningElement',
-};
-
-const ruleName = 'no-noninteractive-element-interactions';
-
-const alwaysValid = [
-  { code: '<TestComponent onClick={doFoo} />' },
-  { code: '<Button onClick={doFoo} />' },
-  /* All flavors of input */
-  { code: '<input onClick={() => void 0} />' },
-  { code: '<input type="button" onClick={() => void 0} />' },
-  { code: '<input type="checkbox" onClick={() => void 0} />' },
-  { code: '<input type="color" onClick={() => void 0} />' },
-  { code: '<input type="date" onClick={() => void 0} />' },
-  { code: '<input type="datetime" onClick={() => void 0} />' },
-  { code: '<input type="datetime-local" onClick={() => void 0} />' },
-  { code: '<input type="email" onClick={() => void 0} />' },
-  { code: '<input type="file" onClick={() => void 0} />' },
-  { code: '<input type="image" onClick={() => void 0} />' },
-  { code: '<input type="month" onClick={() => void 0} />' },
-  { code: '<input type="number" onClick={() => void 0} />' },
-  { code: '<input type="password" onClick={() => void 0} />' },
-  { code: '<input type="radio" onClick={() => void 0} />' },
-  { code: '<input type="range" onClick={() => void 0} />' },
-  { code: '<input type="reset" onClick={() => void 0} />' },
-  { code: '<input type="search" onClick={() => void 0} />' },
-  { code: '<input type="submit" onClick={() => void 0} />' },
-  { code: '<input type="tel" onClick={() => void 0} />' },
-  { code: '<input type="text" onClick={() => void 0} />' },
-  { code: '<input type="time" onClick={() => void 0} />' },
-  { code: '<input type="url" onClick={() => void 0} />' },
-  { code: '<input type="week" onClick={() => void 0} />' },
-  { code: '<input type="hidden" onClick={() => void 0} />' },
-  /* End all flavors of input */
-  { code: '<a onClick={() => void 0} />' },
-  { code: '<a onClick={() => {}} />;' },
-  { code: '<a tabIndex="0" onClick={() => void 0} />' },
-  { code: '<a onClick={() => void 0} href="http://x.y.z" />' },
-  { code: '<a onClick={() => void 0} href="http://x.y.z" tabIndex="0" />' },
-  { code: '<area onClick={() => {}} />;' },
-  { code: '<button onClick={() => void 0} className="foo" />' },
-  { code: '<label onClick={() => {}} />;' },
-  { code: '<menuitem onClick={() => {}} />;' },
-  { code: '<option onClick={() => void 0} className="foo" />' },
-  { code: '<select onClick={() => void 0} className="foo" />' },
-  { code: '<textarea onClick={() => void 0} className="foo" />' },
-  { code: '<tr onClick={() => {}} />;' },
-  /* HTML elements with neither an interactive or non-interactive valence (static) */
-  { code: '<acronym onClick={() => {}} />;' },
-  { code: '<address onClick={() => {}} />;' },
-  { code: '<applet onClick={() => {}} />;' },
-  { code: '<aside onClick={() => {}} />;' },
-  { code: '<audio onClick={() => {}} />;' },
-  { code: '<b onClick={() => {}} />;' },
-  { code: '<base onClick={() => {}} />;' },
-  { code: '<bdi onClick={() => {}} />;' },
-  { code: '<bdo onClick={() => {}} />;' },
-  { code: '<big onClick={() => {}} />;' },
-  { code: '<blink onClick={() => {}} />;' },
-  { code: '<body onClick={() => {}} />;' },
-  { code: '<body onLoad={() => {}} />;' },
-  { code: '<canvas onClick={() => {}} />;' },
-  { code: '<center onClick={() => {}} />;' },
-  { code: '<cite onClick={() => {}} />;' },
-  { code: '<code onClick={() => {}} />;' },
-  { code: '<col onClick={() => {}} />;' },
-  { code: '<colgroup onClick={() => {}} />;' },
-  { code: '<content onClick={() => {}} />;' },
-  { code: '<data onClick={() => {}} />;' },
-  { code: '<datalist onClick={() => {}} />;' },
-  { code: '<del onClick={() => {}} />;' },
-  { code: '<div />;' },
-  { code: '<div className="foo" />;' },
-  { code: '<div className="foo" {...props} />;' },
-  { code: '<div onClick={() => void 0} aria-hidden />;' },
-  { code: '<div onClick={() => void 0} aria-hidden={true} />;' },
-  { code: '<div onClick={() => void 0} />;' },
-  { code: '<div onClick={() => void 0} role={undefined} />;' },
-  { code: '<div onClick={() => void 0} {...props} />;' },
-  { code: '<div onClick={null} />;' },
-  { code: '<div onKeyUp={() => void 0} aria-hidden={false} />;' },
-  { code: '<em onClick={() => {}} />;' },
-  { code: '<embed onClick={() => {}} />;' },
-  { code: '<font onClick={() => {}} />;' },
-  { code: '<font onSubmit={() => {}} />;' },
-  { code: '<frameset onClick={() => {}} />;' },
-  { code: '<head onClick={() => {}} />;' },
-  { code: '<header onClick={() => {}} />;' },
-  { code: '<hgroup onClick={() => {}} />;' },
-  { code: '<html onClick={() => {}} />;' },
-  { code: '<i onClick={() => {}} />;' },
-  { code: '<iframe onLoad={() => {}} />;' },
-  {
-    code: `
-      <iframe
-        name="embeddedExternalPayment"
-        ref="embeddedExternalPayment"
-        style={iframeStyle}
-        onLoad={this.handleLoadIframe}
-      />
-    `,
-  },
-  { code: '<img {...props} onError={() => {}} />;' },
-  { code: '<img onLoad={() => {}} />;' },
-  { code: '<ins onClick={() => {}} />;' },
-  { code: '<kbd onClick={() => {}} />;' },
-  { code: '<keygen onClick={() => {}} />;' },
-  { code: '<link onClick={() => {}} />;' },
-  { code: '<main onClick={null} />;' },
-  { code: '<map onClick={() => {}} />;' },
-  { code: '<meta onClick={() => {}} />;' },
-  { code: '<noembed onClick={() => {}} />;' },
-  { code: '<noscript onClick={() => {}} />;' },
-  { code: '<object onClick={() => {}} />;' },
-  { code: '<optgroup onClick={() => {}} />;' },
-  { code: '<output onClick={() => {}} />;' },
-  { code: '<param onClick={() => {}} />;' },
-  { code: '<picture onClick={() => {}} />;' },
-  { code: '<q onClick={() => {}} />;' },
-  { code: '<rp onClick={() => {}} />;' },
-  { code: '<rt onClick={() => {}} />;' },
-  { code: '<rtc onClick={() => {}} />;' },
-  { code: '<s onClick={() => {}} />;' },
-  { code: '<samp onClick={() => {}} />;' },
-  { code: '<script onClick={() => {}} />;' },
-  { code: '<small onClick={() => {}} />;' },
-  { code: '<source onClick={() => {}} />;' },
-  { code: '<spacer onClick={() => {}} />;' },
-  { code: '<span onClick={() => {}} />;' },
-  { code: '<strike onClick={() => {}} />;' },
-  { code: '<strong onClick={() => {}} />;' },
-  { code: '<style onClick={() => {}} />;' },
-  { code: '<sub onClick={() => {}} />;' },
-  { code: '<summary onClick={() => {}} />;' },
-  { code: '<sup onClick={() => {}} />;' },
-  { code: '<th onClick={() => {}} />;' },
-  { code: '<title onClick={() => {}} />;' },
-  { code: '<track onClick={() => {}} />;' },
-  { code: '<tt onClick={() => {}} />;' },
-  { code: '<u onClick={() => {}} />;' },
-  { code: '<var onClick={() => {}} />;' },
-  { code: '<video onClick={() => {}} />;' },
-  { code: '<wbr onClick={() => {}} />;' },
-  { code: '<xmp onClick={() => {}} />;' },
-  /* HTML elements attributed with an interactive role */
-  { code: '<div role="button" onClick={() => {}} />;' },
-  { code: '<div role="checkbox" onClick={() => {}} />;' },
-  { code: '<div role="columnheader" onClick={() => {}} />;' },
-  { code: '<div role="combobox" onClick={() => {}} />;' },
-  { code: '<div role="grid" onClick={() => {}} />;' },
-  { code: '<div role="gridcell" onClick={() => {}} />;' },
-  { code: '<div role="link" onClick={() => {}} />;' },
-  { code: '<div role="listbox" onClick={() => {}} />;' },
-  { code: '<div role="menu" onClick={() => {}} />;' },
-  { code: '<div role="menubar" onClick={() => {}} />;' },
-  { code: '<div role="menuitem" onClick={() => {}} />;' },
-  { code: '<div role="menuitemcheckbox" onClick={() => {}} />;' },
-  { code: '<div role="menuitemradio" onClick={() => {}} />;' },
-  { code: '<div role="option" onClick={() => {}} />;' },
-  { code: '<div role="progressbar" onClick={() => {}} />;' },
-  { code: '<div role="radio" onClick={() => {}} />;' },
-  { code: '<div role="radiogroup" onClick={() => {}} />;' },
-  { code: '<div role="row" onClick={() => {}} />;' },
-  { code: '<div role="rowheader" onClick={() => {}} />;' },
-  { code: '<div role="searchbox" onClick={() => {}} />;' },
-  { code: '<div role="slider" onClick={() => {}} />;' },
-  { code: '<div role="spinbutton" onClick={() => {}} />;' },
-  { code: '<div role="switch" onClick={() => {}} />;' },
-  { code: '<div role="tab" onClick={() => {}} />;' },
-  { code: '<div role="textbox" onClick={() => {}} />;' },
-  { code: '<div role="treeitem" onClick={() => {}} />;' },
-  /* Presentation is a special case role that indicates intentional static semantics */
-  { code: '<div role="presentation" onClick={() => {}} />;' },
-  /* HTML elements attributed with an abstract role */
-  { code: '<div role="command" onClick={() => {}} />;' },
-  { code: '<div role="composite" onClick={() => {}} />;' },
-  { code: '<div role="input" onClick={() => {}} />;' },
-  { code: '<div role="landmark" onClick={() => {}} />;' },
-  { code: '<div role="range" onClick={() => {}} />;' },
-  { code: '<div role="roletype" onClick={() => {}} />;' },
-  { code: '<div role="sectionhead" onClick={() => {}} />;' },
-  { code: '<div role="select" onClick={() => {}} />;' },
-  { code: '<div role="structure" onClick={() => {}} />;' },
-  { code: '<div role="tablist" onClick={() => {}} />;' },
-  { code: '<div role="toolbar" onClick={() => {}} />;' },
-  { code: '<div role="tree" onClick={() => {}} />;' },
-  { code: '<div role="treegrid" onClick={() => {}} />;' },
-  { code: '<div role="widget" onClick={() => {}} />;' },
-  { code: '<div role="window" onClick={() => {}} />;' },
-  // All the possible handlers
-  { code: '<div role="article" onCopy={() => {}} />;' },
-  { code: '<div role="article" onCut={() => {}} />;' },
-  { code: '<div role="article" onPaste={() => {}} />;' },
-  { code: '<div role="article" onCompositionEnd={() => {}} />;' },
-  { code: '<div role="article" onCompositionStart={() => {}} />;' },
-  { code: '<div role="article" onCompositionUpdate={() => {}} />;' },
-  { code: '<div role="article" onChange={() => {}} />;' },
-  { code: '<div role="article" onInput={() => {}} />;' },
-  { code: '<div role="article" onSubmit={() => {}} />;' },
-  { code: '<div role="article" onSelect={() => {}} />;' },
-  { code: '<div role="article" onTouchCancel={() => {}} />;' },
-  { code: '<div role="article" onTouchEnd={() => {}} />;' },
-  { code: '<div role="article" onTouchMove={() => {}} />;' },
-  { code: '<div role="article" onTouchStart={() => {}} />;' },
-  { code: '<div role="article" onScroll={() => {}} />;' },
-  { code: '<div role="article" onWheel={() => {}} />;' },
-  { code: '<div role="article" onAbort={() => {}} />;' },
-  { code: '<div role="article" onCanPlay={() => {}} />;' },
-  { code: '<div role="article" onCanPlayThrough={() => {}} />;' },
-  { code: '<div role="article" onDurationChange={() => {}} />;' },
-  { code: '<div role="article" onEmptied={() => {}} />;' },
-  { code: '<div role="article" onEncrypted={() => {}} />;' },
-  { code: '<div role="article" onEnded={() => {}} />;' },
-  { code: '<div role="article" onLoadedData={() => {}} />;' },
-  { code: '<div role="article" onLoadedMetadata={() => {}} />;' },
-  { code: '<div role="article" onLoadStart={() => {}} />;' },
-  { code: '<div role="article" onPause={() => {}} />;' },
-  { code: '<div role="article" onPlay={() => {}} />;' },
-  { code: '<div role="article" onPlaying={() => {}} />;' },
-  { code: '<div role="article" onProgress={() => {}} />;' },
-  { code: '<div role="article" onRateChange={() => {}} />;' },
-  { code: '<div role="article" onSeeked={() => {}} />;' },
-  { code: '<div role="article" onSeeking={() => {}} />;' },
-  { code: '<div role="article" onStalled={() => {}} />;' },
-  { code: '<div role="article" onSuspend={() => {}} />;' },
-  { code: '<div role="article" onTimeUpdate={() => {}} />;' },
-  { code: '<div role="article" onVolumeChange={() => {}} />;' },
-  { code: '<div role="article" onWaiting={() => {}} />;' },
-  { code: '<div role="article" onAnimationStart={() => {}} />;' },
-  { code: '<div role="article" onAnimationEnd={() => {}} />;' },
-  { code: '<div role="article" onAnimationIteration={() => {}} />;' },
-  { code: '<div role="article" onTransitionEnd={() => {}} />;' },
-];
-
-const neverValid = [
-  /* HTML elements with an inherent, non-interactive role */
-  { code: '<main onClick={() => void 0} />;', errors: [expectedError] },
-  { code: '<article onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<blockquote onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<br onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<caption onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<dd onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<details onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<dfn onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<dl onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<dir onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<dt onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<fieldset onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<figcaption onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<figure onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<footer onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<form onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<frame onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<h1 onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<h2 onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<h3 onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<h4 onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<h5 onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<h6 onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<hr onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<iframe onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<img onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<legend onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<li onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<mark onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<marquee onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<menu onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<meter onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<nav onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<ol onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<p onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<pre onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<progress onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<ruby onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<section onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<table onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<tbody onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<td onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<tfoot onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<thead onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<time onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<ol onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<ul onClick={() => {}} />;', errors: [expectedError] },
-  /* HTML elements attributed with a non-interactive role */
-  { code: '<div role="alert" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="alertdialog" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="application" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="article" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="banner" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="cell" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="complementary" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="contentinfo" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="definition" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="dialog" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="directory" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="document" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="feed" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="figure" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="form" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="group" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="heading" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="img" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="list" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="listitem" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="log" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="main" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="marquee" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="math" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="navigation" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="note" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="region" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="rowgroup" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="search" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="separator" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="scrollbar" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="status" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="table" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="tabpanel" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="term" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="timer" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="tooltip" onClick={() => {}} />;', errors: [expectedError] },
-  // Handlers
-  { code: '<div role="article" onKeyDown={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="article" onKeyPress={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="article" onKeyUp={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="article" onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="article" onLoad={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="article" onError={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="article" onMouseDown={() => {}} />;', errors: [expectedError] },
-  { code: '<div role="article" onMouseUp={() => {}} />;', errors: [expectedError] },
-];
-
-const recommendedOptions = configs.recommended.rules[`jsx-a11y/${ruleName}`][1] || {};
-ruleTester.run(`${ruleName}:recommended`, rule, {
-  valid: [
-    ...alwaysValid,
-    // All the possible handlers
-    { code: '<div role="article" onCopy={() => {}} />;' },
-    { code: '<div role="article" onCut={() => {}} />;' },
-    { code: '<div role="article" onPaste={() => {}} />;' },
-    { code: '<div role="article" onCompositionEnd={() => {}} />;' },
-    { code: '<div role="article" onCompositionStart={() => {}} />;' },
-    { code: '<div role="article" onCompositionUpdate={() => {}} />;' },
-    { code: '<div role="article" onFocus={() => {}} />;' },
-    { code: '<div role="article" onBlur={() => {}} />;' },
-    { code: '<div role="article" onChange={() => {}} />;' },
-    { code: '<div role="article" onInput={() => {}} />;' },
-    { code: '<div role="article" onSubmit={() => {}} />;' },
-    { code: '<div role="article" onContextMenu={() => {}} />;' },
-    { code: '<div role="article" onDblClick={() => {}} />;' },
-    { code: '<div role="article" onDoubleClick={() => {}} />;' },
-    { code: '<div role="article" onDrag={() => {}} />;' },
-    { code: '<div role="article" onDragEnd={() => {}} />;' },
-    { code: '<div role="article" onDragEnter={() => {}} />;' },
-    { code: '<div role="article" onDragExit={() => {}} />;' },
-    { code: '<div role="article" onDragLeave={() => {}} />;' },
-    { code: '<div role="article" onDragOver={() => {}} />;' },
-    { code: '<div role="article" onDragStart={() => {}} />;' },
-    { code: '<div role="article" onDrop={() => {}} />;' },
-    { code: '<div role="article" onMouseEnter={() => {}} />;' },
-    { code: '<div role="article" onMouseLeave={() => {}} />;' },
-    { code: '<div role="article" onMouseMove={() => {}} />;' },
-    { code: '<div role="article" onMouseOut={() => {}} />;' },
-    { code: '<div role="article" onMouseOver={() => {}} />;' },
-    { code: '<div role="article" onSelect={() => {}} />;' },
-    { code: '<div role="article" onTouchCancel={() => {}} />;' },
-    { code: '<div role="article" onTouchEnd={() => {}} />;' },
-    { code: '<div role="article" onTouchMove={() => {}} />;' },
-    { code: '<div role="article" onTouchStart={() => {}} />;' },
-    { code: '<div role="article" onScroll={() => {}} />;' },
-    { code: '<div role="article" onWheel={() => {}} />;' },
-    { code: '<div role="article" onAbort={() => {}} />;' },
-    { code: '<div role="article" onCanPlay={() => {}} />;' },
-    { code: '<div role="article" onCanPlayThrough={() => {}} />;' },
-    { code: '<div role="article" onDurationChange={() => {}} />;' },
-    { code: '<div role="article" onEmptied={() => {}} />;' },
-    { code: '<div role="article" onEncrypted={() => {}} />;' },
-    { code: '<div role="article" onEnded={() => {}} />;' },
-    { code: '<div role="article" onLoadedData={() => {}} />;' },
-    { code: '<div role="article" onLoadedMetadata={() => {}} />;' },
-    { code: '<div role="article" onLoadStart={() => {}} />;' },
-    { code: '<div role="article" onPause={() => {}} />;' },
-    { code: '<div role="article" onPlay={() => {}} />;' },
-    { code: '<div role="article" onPlaying={() => {}} />;' },
-    { code: '<div role="article" onProgress={() => {}} />;' },
-    { code: '<div role="article" onRateChange={() => {}} />;' },
-    { code: '<div role="article" onSeeked={() => {}} />;' },
-    { code: '<div role="article" onSeeking={() => {}} />;' },
-    { code: '<div role="article" onStalled={() => {}} />;' },
-    { code: '<div role="article" onSuspend={() => {}} />;' },
-    { code: '<div role="article" onTimeUpdate={() => {}} />;' },
-    { code: '<div role="article" onVolumeChange={() => {}} />;' },
-    { code: '<div role="article" onWaiting={() => {}} />;' },
-    { code: '<div role="article" onAnimationStart={() => {}} />;' },
-    { code: '<div role="article" onAnimationEnd={() => {}} />;' },
-    { code: '<div role="article" onAnimationIteration={() => {}} />;' },
-    { code: '<div role="article" onTransitionEnd={() => {}} />;' },
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-});
-
-const strictOptions = configs.strict.rules[`jsx-a11y/${ruleName}`][1] || {};
-ruleTester.run(`${ruleName}:strict`, rule, {
-  valid: [
-    ...alwaysValid,
-  ]
-    .map(ruleOptionsMapperFactory(strictOptions))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-    // All the possible handlers
-    { code: '<div role="article" onFocus={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onBlur={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onContextMenu={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onDblClick={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onDoubleClick={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onDrag={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onDragEnd={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onDragEnter={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onDragExit={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onDragLeave={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onDragOver={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onDragStart={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onDrop={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onMouseEnter={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onMouseLeave={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onMouseMove={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onMouseOut={() => {}} />;', errors: [expectedError] },
-    { code: '<div role="article" onMouseOver={() => {}} />;', errors: [expectedError] },
-  ]
-    .map(ruleOptionsMapperFactory(strictOptions))
-    .map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-noninteractive-element-to-interactive-role-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-noninteractive-element-to-interactive-role-test.js
deleted file mode 100644
index 3a6282c..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-noninteractive-element-to-interactive-role-test.js
+++ /dev/null
@@ -1,484 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Disallow inherently non-interactive elements to be assigned
- * interactive roles.
- * @author Jesse Beach
- * @author $AUTHOR
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import { configs } from '../../../src/index';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/no-noninteractive-element-to-interactive-role';
-import ruleOptionsMapperFactory from '../../__util__/ruleOptionsMapperFactory';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const errorMessage = 'Non-interactive elements should not be assigned interactive roles.';
-
-const expectedError = {
-  message: errorMessage,
-  type: 'JSXAttribute',
-};
-
-const ruleName = 'jsx-a11y/no-noninteractive-element-to-interactive-role';
-
-const alwaysValid = [
-  { code: '<TestComponent onClick={doFoo} />' },
-  { code: '<Button onClick={doFoo} />' },
-  /* Interactive elements */
-  { code: '<a tabIndex="0" role="button" />' },
-  { code: '<a href="http://x.y.z" role="button" />' },
-  { code: '<a href="http://x.y.z" tabIndex="0" role="button" />' },
-  { code: '<area role="button" />;' },
-  { code: '<area role="menuitem" />;' },
-  { code: '<button className="foo" role="button" />' },
-  /* All flavors of input */
-  { code: '<input role="button" />' },
-  { code: '<input type="button" role="button" />' },
-  { code: '<input type="checkbox" role="button" />' },
-  { code: '<input type="color" role="button" />' },
-  { code: '<input type="date" role="button" />' },
-  { code: '<input type="datetime" role="button" />' },
-  { code: '<input type="datetime-local" role="button" />' },
-  { code: '<input type="email" role="button" />' },
-  { code: '<input type="file" role="button" />' },
-  { code: '<input type="hidden" role="button" />' },
-  { code: '<input type="image" role="button" />' },
-  { code: '<input type="month" role="button" />' },
-  { code: '<input type="number" role="button" />' },
-  { code: '<input type="password" role="button" />' },
-  { code: '<input type="radio" role="button" />' },
-  { code: '<input type="range" role="button" />' },
-  { code: '<input type="reset" role="button" />' },
-  { code: '<input type="search" role="button" />' },
-  { code: '<input type="submit" role="button" />' },
-  { code: '<input type="tel" role="button" />' },
-  { code: '<input type="text" role="button" />' },
-  { code: '<input type="time" role="button" />' },
-  { code: '<input type="url" role="button" />' },
-  { code: '<input type="week" role="button" />' },
-  { code: '<input type="hidden" role="img" />' },
-  /* End all flavors of input */
-  { code: '<menuitem role="button" />;' },
-  { code: '<option className="foo" role="button" />' },
-  { code: '<select className="foo" role="button" />' },
-  { code: '<textarea className="foo" role="button" />' },
-  { code: '<tr role="button" />;' },
-  { code: '<tr role="presentation" />;' },
-  /* Interactive elements */
-  { code: '<a tabIndex="0" role="img" />' },
-  { code: '<a href="http://x.y.z" role="img" />' },
-  { code: '<a href="http://x.y.z" tabIndex="0" role="img" />' },
-  /* All flavors of input */
-  { code: '<input role="img" />' },
-  { code: '<input type="img" role="img" />' },
-  { code: '<input type="checkbox" role="img" />' },
-  { code: '<input type="color" role="img" />' },
-  { code: '<input type="date" role="img" />' },
-  { code: '<input type="datetime" role="img" />' },
-  { code: '<input type="datetime-local" role="img" />' },
-  { code: '<input type="email" role="img" />' },
-  { code: '<input type="file" role="img" />' },
-  { code: '<input type="hidden" role="button" />' },
-  { code: '<input type="image" role="img" />' },
-  { code: '<input type="month" role="img" />' },
-  { code: '<input type="number" role="img" />' },
-  { code: '<input type="password" role="img" />' },
-  { code: '<input type="radio" role="img" />' },
-  { code: '<input type="range" role="img" />' },
-  { code: '<input type="reset" role="img" />' },
-  { code: '<input type="search" role="img" />' },
-  { code: '<input type="submit" role="img" />' },
-  { code: '<input type="tel" role="img" />' },
-  { code: '<input type="text" role="img" />' },
-  { code: '<input type="time" role="img" />' },
-  { code: '<input type="url" role="img" />' },
-  { code: '<input type="week" role="img" />' },
-  /* End all flavors of input */
-  { code: '<menuitem role="img" />;' },
-  { code: '<option className="foo" role="img" />' },
-  { code: '<select className="foo" role="img" />' },
-  { code: '<textarea className="foo" role="img" />' },
-  { code: '<tr role="img" />;' },
-  /* Interactive elements */
-  { code: '<a tabIndex="0" role="listitem" />' },
-  { code: '<a href="http://x.y.z" role="listitem" />' },
-  { code: '<a href="http://x.y.z" tabIndex="0" role="listitem" />' },
-  /* All flavors of input */
-  { code: '<input role="listitem" />' },
-  { code: '<input type="listitem" role="listitem" />' },
-  { code: '<input type="checkbox" role="listitem" />' },
-  { code: '<input type="color" role="listitem" />' },
-  { code: '<input type="date" role="listitem" />' },
-  { code: '<input type="datetime" role="listitem" />' },
-  { code: '<input type="datetime-local" role="listitem" />' },
-  { code: '<input type="email" role="listitem" />' },
-  { code: '<input type="file" role="listitem" />' },
-  { code: '<input type="image" role="listitem" />' },
-  { code: '<input type="month" role="listitem" />' },
-  { code: '<input type="number" role="listitem" />' },
-  { code: '<input type="password" role="listitem" />' },
-  { code: '<input type="radio" role="listitem" />' },
-  { code: '<input type="range" role="listitem" />' },
-  { code: '<input type="reset" role="listitem" />' },
-  { code: '<input type="search" role="listitem" />' },
-  { code: '<input type="submit" role="listitem" />' },
-  { code: '<input type="tel" role="listitem" />' },
-  { code: '<input type="text" role="listitem" />' },
-  { code: '<input type="time" role="listitem" />' },
-  { code: '<input type="url" role="listitem" />' },
-  { code: '<input type="week" role="listitem" />' },
-  /* End all flavors of input */
-  { code: '<label role="button" />;' },
-  { code: '<menuitem role="listitem" />;' },
-  { code: '<option className="foo" role="listitem" />' },
-  { code: '<select className="foo" role="listitem" />' },
-  { code: '<textarea className="foo" role="listitem" />' },
-  { code: '<tr role="listitem" />;' },
-  /* HTML elements with neither an interactive or non-interactive valence (static) */
-  { code: '<acronym role="button" />;' },
-  { code: '<address role="button" />;' },
-  { code: '<applet role="button" />;' },
-  { code: '<aside role="button" />;' },
-  { code: '<audio role="button" />;' },
-  { code: '<b role="button" />;' },
-  { code: '<base role="button" />;' },
-  { code: '<bdi role="button" />;' },
-  { code: '<bdo role="button" />;' },
-  { code: '<big role="button" />;' },
-  { code: '<blink role="button" />;' },
-  { code: '<body role="button" />;' },
-  { code: '<canvas role="button" />;' },
-  { code: '<center role="button" />;' },
-  { code: '<cite role="button" />;' },
-  { code: '<code role="button" />;' },
-  { code: '<col role="button" />;' },
-  { code: '<colgroup role="button" />;' },
-  { code: '<content role="button" />;' },
-  { code: '<data role="button" />;' },
-  { code: '<datalist role="button" />;' },
-  { code: '<del role="button" />;' },
-  { code: '<div role="button" />;' },
-  { code: '<div className="foo" role="button" />;' },
-  { code: '<div className="foo" {...props} role="button" />;' },
-  { code: '<div aria-hidden role="button" />;' },
-  { code: '<div aria-hidden={true} role="button" />;' },
-  { code: '<div role="button" />;' },
-  { code: '<div role={undefined} role="button" />;' },
-  { code: '<div {...props} role="button" />;' },
-  { code: '<div onKeyUp={() => void 0} aria-hidden={false} role="button" />;' },
-  { code: '<em role="button" />;' },
-  { code: '<embed role="button" />;' },
-  { code: '<font role="button" />;' },
-  { code: '<frameset role="button" />;' },
-  { code: '<head role="button" />;' },
-  { code: '<header role="button" />;' },
-  { code: '<hgroup role="button" />;' },
-  { code: '<html role="button" />;' },
-  { code: '<i role="button" />;' },
-  { code: '<ins role="button" />;' },
-  { code: '<kbd role="button" />;' },
-  { code: '<keygen role="button" />;' },
-  { code: '<link role="button" />;' },
-  { code: '<map role="button" />;' },
-  { code: '<meta role="button" />;' },
-  { code: '<noembed role="button" />;' },
-  { code: '<noscript role="button" />;' },
-  { code: '<object role="button" />;' },
-  { code: '<optgroup role="button" />;' },
-  { code: '<output role="button" />;' },
-  { code: '<param role="button" />;' },
-  { code: '<picture role="button" />;' },
-  { code: '<q role="button" />;' },
-  { code: '<rp role="button" />;' },
-  { code: '<rt role="button" />;' },
-  { code: '<rtc role="button" />;' },
-  { code: '<s role="button" />;' },
-  { code: '<samp role="button" />;' },
-  { code: '<script role="button" />;' },
-  { code: '<small role="button" />;' },
-  { code: '<source role="button" />;' },
-  { code: '<spacer role="button" />;' },
-  { code: '<span role="button" />;' },
-  { code: '<strike role="button" />;' },
-  { code: '<strong role="button" />;' },
-  { code: '<style role="button" />;' },
-  { code: '<sub role="button" />;' },
-  { code: '<summary role="button" />;' },
-  { code: '<sup role="button" />;' },
-  { code: '<th role="button" />;' },
-  { code: '<title role="button" />;' },
-  { code: '<track role="button" />;' },
-  { code: '<tt role="button" />;' },
-  { code: '<u role="button" />;' },
-  { code: '<var role="button" />;' },
-  { code: '<video role="button" />;' },
-  { code: '<wbr role="button" />;' },
-  { code: '<xmp role="button" />;' },
-  /* HTML elements attributed with an interactive role */
-  { code: '<div role="button" />;' },
-  { code: '<div role="checkbox" />;' },
-  { code: '<div role="columnheader" />;' },
-  { code: '<div role="combobox" />;' },
-  { code: '<div role="grid" />;' },
-  { code: '<div role="gridcell" />;' },
-  { code: '<div role="link" />;' },
-  { code: '<div role="listbox" />;' },
-  { code: '<div role="menu" />;' },
-  { code: '<div role="menubar" />;' },
-  { code: '<div role="menuitem" />;' },
-  { code: '<div role="menuitemcheckbox" />;' },
-  { code: '<div role="menuitemradio" />;' },
-  { code: '<div role="option" />;' },
-  { code: '<div role="progressbar" />;' },
-  { code: '<div role="radio" />;' },
-  { code: '<div role="radiogroup" />;' },
-  { code: '<div role="row" />;' },
-  { code: '<div role="rowheader" />;' },
-  { code: '<div role="searchbox" />;' },
-  { code: '<div role="slider" />;' },
-  { code: '<div role="spinbutton" />;' },
-  { code: '<div role="switch" />;' },
-  { code: '<div role="tab" />;' },
-  { code: '<div role="textbox" />;' },
-  { code: '<div role="treeitem" />;' },
-  /* Presentation is a special case role that indicates intentional static semantics */
-  { code: '<div role="presentation" />;' },
-  /* HTML elements attributed with an abstract role */
-  { code: '<div role="command" />;' },
-  { code: '<div role="composite" />;' },
-  { code: '<div role="input" />;' },
-  { code: '<div role="landmark" />;' },
-  { code: '<div role="range" />;' },
-  { code: '<div role="roletype" />;' },
-  { code: '<div role="section" />;' },
-  { code: '<div role="sectionhead" />;' },
-  { code: '<div role="select" />;' },
-  { code: '<div role="structure" />;' },
-  { code: '<div role="tablist" />;' },
-  { code: '<div role="toolbar" />;' },
-  { code: '<div role="tree" />;' },
-  { code: '<div role="treegrid" />;' },
-  { code: '<div role="widget" />;' },
-  { code: '<div role="window" />;' },
-  /* HTML elements with an inherent non-interactive role, assigned an
-   * interactive role. */
-  { code: '<main role="listitem" />;' },
-  { code: '<a role="listitem" />' },
-  { code: '<a role="listitem" />;' },
-  { code: '<a role="button" />' },
-  { code: '<a role="button" />;' },
-  { code: '<a role="menuitem" />' },
-  { code: '<a role="menuitem" />;' },
-  { code: '<area role="listitem" />;' },
-  { code: '<article role="listitem" />;' },
-  { code: '<article role="listitem" />;' },
-  { code: '<dd role="listitem" />;' },
-  { code: '<dfn role="listitem" />;' },
-  { code: '<dt role="listitem" />;' },
-  { code: '<fieldset role="listitem" />;' },
-  { code: '<figure role="listitem" />;' },
-  { code: '<form role="listitem" />;' },
-  { code: '<frame role="listitem" />;' },
-  { code: '<h1 role="listitem" />;' },
-  { code: '<h2 role="listitem" />;' },
-  { code: '<h3 role="listitem" />;' },
-  { code: '<h4 role="listitem" />;' },
-  { code: '<h5 role="listitem" />;' },
-  { code: '<h6 role="listitem" />;' },
-  { code: '<hr role="listitem" />;' },
-  { code: '<img role="listitem" />;' },
-  { code: '<li role="listitem" />;' },
-  { code: '<li role="presentation" />;' },
-  { code: '<nav role="listitem" />;' },
-  { code: '<ol role="listitem" />;' },
-  { code: '<table role="listitem" />;' },
-  { code: '<tbody role="listitem" />;' },
-  { code: '<td role="listitem" />;' },
-  { code: '<tfoot role="listitem" />;' },
-  { code: '<thead role="listitem" />;' },
-  { code: '<ul role="listitem" />;' },
-  /* HTML elements attributed with a non-interactive role */
-  { code: '<div role="alert" />;' },
-  { code: '<div role="alertdialog" />;' },
-  { code: '<div role="application" />;' },
-  { code: '<div role="article" />;' },
-  { code: '<div role="banner" />;' },
-  { code: '<div role="cell" />;' },
-  { code: '<div role="complementary" />;' },
-  { code: '<div role="contentinfo" />;' },
-  { code: '<div role="definition" />;' },
-  { code: '<div role="dialog" />;' },
-  { code: '<div role="directory" />;' },
-  { code: '<div role="document" />;' },
-  { code: '<div role="feed" />;' },
-  { code: '<div role="figure" />;' },
-  { code: '<div role="form" />;' },
-  { code: '<div role="group" />;' },
-  { code: '<div role="heading" />;' },
-  { code: '<div role="img" />;' },
-  { code: '<div role="list" />;' },
-  { code: '<div role="listitem" />;' },
-  { code: '<div role="log" />;' },
-  { code: '<div role="main" />;' },
-  { code: '<div role="marquee" />;' },
-  { code: '<div role="math" />;' },
-  { code: '<div role="navigation" />;' },
-  { code: '<div role="note" />;' },
-  { code: '<div role="region" />;' },
-  { code: '<div role="rowgroup" />;' },
-  { code: '<div role="search" />;' },
-  { code: '<div role="separator" />;' },
-  { code: '<div role="scrollbar" />;' },
-  { code: '<div role="status" />;' },
-  { code: '<div role="table" />;' },
-  { code: '<div role="tabpanel" />;' },
-  { code: '<div role="term" />;' },
-  { code: '<div role="timer" />;' },
-  { code: '<div role="tooltip" />;' },
-  { code: '<ul role="list" />;' },
-];
-
-const neverValid = [
-  /* HTML elements with an inherent non-interactive role, assigned an
-   * interactive role. */
-  { code: '<main role="button" />;', errors: [expectedError] },
-  { code: '<article role="button" />;', errors: [expectedError] },
-  { code: '<article role="button" />;', errors: [expectedError] },
-  { code: '<blockquote role="button" />;', errors: [expectedError] },
-  { code: '<br role="button" />;', errors: [expectedError] },
-  { code: '<caption role="button" />;', errors: [expectedError] },
-  { code: '<dd role="button" />;', errors: [expectedError] },
-  { code: '<details role="button" />;', errors: [expectedError] },
-  { code: '<dir role="button" />;', errors: [expectedError] },
-  { code: '<dl role="button" />;', errors: [expectedError] },
-  { code: '<dfn role="button" />;', errors: [expectedError] },
-  { code: '<dt role="button" />;', errors: [expectedError] },
-  { code: '<fieldset role="button" />;', errors: [expectedError] },
-  { code: '<figcaption role="button" />;', errors: [expectedError] },
-  { code: '<figure role="button" />;', errors: [expectedError] },
-  { code: '<footer role="button" />;', errors: [expectedError] },
-  { code: '<form role="button" />;', errors: [expectedError] },
-  { code: '<frame role="button" />;', errors: [expectedError] },
-  { code: '<h1 role="button" />;', errors: [expectedError] },
-  { code: '<h2 role="button" />;', errors: [expectedError] },
-  { code: '<h3 role="button" />;', errors: [expectedError] },
-  { code: '<h4 role="button" />;', errors: [expectedError] },
-  { code: '<h5 role="button" />;', errors: [expectedError] },
-  { code: '<h6 role="button" />;', errors: [expectedError] },
-  { code: '<hr role="button" />;', errors: [expectedError] },
-  { code: '<iframe role="button" />;', errors: [expectedError] },
-  { code: '<img role="button" />;', errors: [expectedError] },
-  { code: '<legend role="button" />;', errors: [expectedError] },
-  { code: '<li role="button" />;', errors: [expectedError] },
-  { code: '<mark role="button" />;', errors: [expectedError] },
-  { code: '<marquee role="button" />;', errors: [expectedError] },
-  { code: '<menu role="button" />;', errors: [expectedError] },
-  { code: '<meter role="button" />;', errors: [expectedError] },
-  { code: '<nav role="button" />;', errors: [expectedError] },
-  { code: '<ol role="button" />;', errors: [expectedError] },
-  { code: '<pre role="button" />;', errors: [expectedError] },
-  { code: '<progress role="button" />;', errors: [expectedError] },
-  { code: '<ruby role="button" />;', errors: [expectedError] },
-  { code: '<table role="button" />;', errors: [expectedError] },
-  { code: '<tbody role="button" />;', errors: [expectedError] },
-  { code: '<td role="button" />;', errors: [expectedError] },
-  { code: '<tfoot role="button" />;', errors: [expectedError] },
-  { code: '<thead role="button" />;', errors: [expectedError] },
-  { code: '<time role="button" />;', errors: [expectedError] },
-  { code: '<ul role="button" />;', errors: [expectedError] },
-  /* HTML elements with an inherent non-interactive role, assigned an
-   * interactive role. */
-  { code: '<main role="menuitem" />;', errors: [expectedError] },
-  { code: '<article role="menuitem" />;', errors: [expectedError] },
-  { code: '<article role="menuitem" />;', errors: [expectedError] },
-  { code: '<dd role="menuitem" />;', errors: [expectedError] },
-  { code: '<dfn role="menuitem" />;', errors: [expectedError] },
-  { code: '<dt role="menuitem" />;', errors: [expectedError] },
-  { code: '<fieldset role="menuitem" />;', errors: [expectedError] },
-  { code: '<figure role="menuitem" />;', errors: [expectedError] },
-  { code: '<form role="menuitem" />;', errors: [expectedError] },
-  { code: '<frame role="menuitem" />;', errors: [expectedError] },
-  { code: '<h1 role="menuitem" />;', errors: [expectedError] },
-  { code: '<h2 role="menuitem" />;', errors: [expectedError] },
-  { code: '<h3 role="menuitem" />;', errors: [expectedError] },
-  { code: '<h4 role="menuitem" />;', errors: [expectedError] },
-  { code: '<h5 role="menuitem" />;', errors: [expectedError] },
-  { code: '<h6 role="menuitem" />;', errors: [expectedError] },
-  { code: '<hr role="menuitem" />;', errors: [expectedError] },
-  { code: '<img role="menuitem" />;', errors: [expectedError] },
-  { code: '<nav role="menuitem" />;', errors: [expectedError] },
-  { code: '<ol role="menuitem" />;', errors: [expectedError] },
-  { code: '<p role="button" />;', errors: [expectedError] },
-  { code: '<section role="button" />;', errors: [expectedError] },
-  { code: '<table role="menuitem" />;', errors: [expectedError] },
-  { code: '<tbody role="menuitem" />;', errors: [expectedError] },
-  { code: '<td role="menuitem" />;', errors: [expectedError] },
-  { code: '<tfoot role="menuitem" />;', errors: [expectedError] },
-  { code: '<thead role="menuitem" />;', errors: [expectedError] },
-];
-
-const recommendedOptions = (configs.recommended.rules[ruleName][1] || {});
-ruleTester.run(`${ruleName}:recommended`, rule, {
-  valid: [
-    ...alwaysValid,
-    { code: '<ul role="menu" />;' },
-    { code: '<ul role="menubar" />;' },
-    { code: '<ul role="radiogroup" />;' },
-    { code: '<ul role="tablist" />;' },
-    { code: '<ul role="tree" />;' },
-    { code: '<ul role="treegrid" />;' },
-    { code: '<ol role="menu" />;' },
-    { code: '<ol role="menubar" />;' },
-    { code: '<ol role="radiogroup" />;' },
-    { code: '<ol role="tablist" />;' },
-    { code: '<ol role="tree" />;' },
-    { code: '<ol role="treegrid" />;' },
-    { code: '<li role="tab" />;' },
-    { code: '<li role="menuitem" />;' },
-    { code: '<li role="row" />;' },
-    { code: '<li role="treeitem" />;' },
-    { code: '<Component role="treeitem" />;' },
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-});
-
-ruleTester.run(`${ruleName}:strict`, rule, {
-  valid: [
-    ...alwaysValid,
-  ].map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-    { code: '<ul role="menu" />;', errors: [expectedError] },
-    { code: '<ul role="menubar" />;', errors: [expectedError] },
-    { code: '<ul role="radiogroup" />;', errors: [expectedError] },
-    { code: '<ul role="tablist" />;', errors: [expectedError] },
-    { code: '<ul role="tree" />;', errors: [expectedError] },
-    { code: '<ul role="treegrid" />;', errors: [expectedError] },
-    { code: '<ol role="menu" />;', errors: [expectedError] },
-    { code: '<ol role="menubar" />;', errors: [expectedError] },
-    { code: '<ol role="radiogroup" />;', errors: [expectedError] },
-    { code: '<ol role="tablist" />;', errors: [expectedError] },
-    { code: '<ol role="tree" />;', errors: [expectedError] },
-    { code: '<ol role="treegrid" />;', errors: [expectedError] },
-    { code: '<li role="tab" />;', errors: [expectedError] },
-    { code: '<li role="menuitem" />;', errors: [expectedError] },
-    { code: '<li role="row" />;', errors: [expectedError] },
-    { code: '<li role="treeitem" />;', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-noninteractive-tabindex-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-noninteractive-tabindex-test.js
deleted file mode 100644
index aa4f1a7..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-noninteractive-tabindex-test.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Disallow tabindex on static and noninteractive elements
- * @author jessebeach
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import { configs } from '../../../src/index';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/no-noninteractive-tabindex';
-import ruleOptionsMapperFactory from '../../__util__/ruleOptionsMapperFactory';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const ruleName = 'no-noninteractive-tabindex';
-
-const expectedError = {
-  message: '`tabIndex` should only be declared on interactive elements.',
-  type: 'JSXAttribute',
-};
-
-const alwaysValid = [
-  { code: '<MyButton tabIndex={0} />' },
-  { code: '<button />' },
-  { code: '<button tabIndex="0" />' },
-  { code: '<button tabIndex={0} />' },
-  { code: '<div />' },
-  { code: '<div tabIndex="-1" />' },
-  { code: '<div role="button" tabIndex="0" />' },
-  { code: '<div role="article" tabIndex="-1" />' },
-  { code: '<article tabIndex="-1" />' },
-];
-
-const neverValid = [
-  { code: '<div tabIndex="0" />', errors: [expectedError] },
-  { code: '<div role="article" tabIndex="0" />', errors: [expectedError] },
-  { code: '<article tabIndex="0" />', errors: [expectedError] },
-  { code: '<article tabIndex={0} />', errors: [expectedError] },
-];
-
-const recommendedOptions = (
-  configs.recommended.rules[`jsx-a11y/${ruleName}`][1] || {}
-);
-
-ruleTester.run(`${ruleName}:recommended`, rule, {
-  valid: [
-    ...alwaysValid,
-    { code: '<div role="tabpanel" tabIndex="0" />' },
-    // Expressions should fail in strict mode
-    { code: '<div role={ROLE_BUTTON} onClick={() => {}} tabIndex="0" />;' },
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-});
-
-ruleTester.run(`${ruleName}:strict`, rule, {
-  valid: [
-    ...alwaysValid,
-  ].map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-    { code: '<div role="tabpanel" tabIndex="0" />', errors: [expectedError] },
-    // Expressions should fail in strict mode
-    { code: '<div role={ROLE_BUTTON} onClick={() => {}} tabIndex="0" />;', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-onchange-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-onchange-test.js
deleted file mode 100644
index fa80244..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-onchange-test.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce usage of onBlur over onChange on select menus for accessibility.
- * @author Ethan Cohen
- */
-
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/no-onchange';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: 'onBlur must be used instead of onchange, unless absolutely necessary and it causes no negative consequences for keyboard only or screen reader users.',
-  type: 'JSXOpeningElement',
-};
-
-ruleTester.run('no-onchange', rule, {
-  valid: [
-    { code: '<select onBlur={() => {}} />;' },
-    { code: '<select onBlur={handleOnBlur} />;' },
-    { code: '<option />;' },
-    { code: '<option onBlur={() => {}} onChange={() => {}} />;' },
-    { code: '<option {...props} />' },
-    { code: '<input onChange={() => {}} />;' },
-    { code: '<input onChange={handleOnChange} />;' },
-    { code: '<input />;' },
-    { code: '<input onChange={() => {}} onChange={() => {}} />;' },
-    { code: '<input {...props} />' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<select onChange={() => {}} />;', errors: [expectedError] },
-    { code: '<select onChange={handleOnChange} />;', errors: [expectedError] },
-    { code: '<option onChange={() => {}} />', errors: [expectedError] },
-    { code: '<option onChange={() => {}} {...props} />', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-redundant-roles-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-redundant-roles-test.js
deleted file mode 100644
index 2412866..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-redundant-roles-test.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce explicit role property is not the
- * same as implicit default role property on element.
- * @author Ethan Cohen <@evcohen>
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/no-redundant-roles';
-import ruleOptionsMapperFactory from '../../__util__/ruleOptionsMapperFactory';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = (element, implicitRole) => ({
-  message: `The element ${element} has an implicit role of ${implicitRole}. Defining this explicitly is redundant and should be avoided.`,
-  type: 'JSXOpeningElement',
-});
-
-const ruleName = 'jsx-a11y/no-redundant-roles';
-
-const alwaysValid = [
-  { code: '<div />;' },
-  { code: '<button role="main" />' },
-  { code: '<MyComponent role="button" />' },
-  { code: '<button role={`${foo}button`} />' },
-];
-
-const neverValid = [
-  { code: '<button role="button" />', errors: [expectedError('button', 'button')] },
-  { code: '<body role="DOCUMENT" />', errors: [expectedError('body', 'document')] },
-];
-
-ruleTester.run(`${ruleName}:recommended`, rule, {
-  valid: [
-    ...alwaysValid,
-    { code: '<nav role="navigation" />' },
-  ]
-    .map(parserOptionsMapper),
-  invalid: neverValid
-    .map(parserOptionsMapper),
-});
-
-const noNavExceptionsOptions = { nav: [] };
-
-ruleTester.run(`${ruleName}:recommended`, rule, {
-  valid: alwaysValid
-    .map(ruleOptionsMapperFactory(noNavExceptionsOptions))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-    { code: '<nav role="navigation" />', errors: [expectedError('nav', 'navigation')] },
-  ]
-    .map(ruleOptionsMapperFactory(noNavExceptionsOptions))
-    .map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-static-element-interactions-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-static-element-interactions-test.js
deleted file mode 100644
index 6b593f5..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/no-static-element-interactions-test.js
+++ /dev/null
@@ -1,455 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce static elements have no interactive handlers.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import { configs } from '../../../src/index';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/no-static-element-interactions';
-import ruleOptionsMapperFactory from '../../__util__/ruleOptionsMapperFactory';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const errorMessage = 'Static HTML elements with event handlers require a role.';
-
-const expectedError = {
-  message: errorMessage,
-  type: 'JSXOpeningElement',
-};
-
-const ruleName = 'no-static-element-interactions';
-
-const alwaysValid = [
-  { code: '<TestComponent onClick={doFoo} />' },
-  { code: '<Button onClick={doFoo} />' },
-  { code: '<div />;' },
-  { code: '<div className="foo" />;' },
-  { code: '<div className="foo" {...props} />;' },
-  { code: '<div onClick={() => void 0} aria-hidden />;' },
-  { code: '<div onClick={() => void 0} aria-hidden={true} />;' },
-  { code: '<div onClick={null} />;' },
-  /* All flavors of input */
-  { code: '<input onClick={() => void 0} />' },
-  { code: '<input type="button" onClick={() => void 0} />' },
-  { code: '<input type="checkbox" onClick={() => void 0} />' },
-  { code: '<input type="color" onClick={() => void 0} />' },
-  { code: '<input type="date" onClick={() => void 0} />' },
-  { code: '<input type="datetime" onClick={() => void 0} />' },
-  { code: '<input type="datetime-local" onClick={() => void 0} />' },
-  { code: '<input type="email" onClick={() => void 0} />' },
-  { code: '<input type="file" onClick={() => void 0} />' },
-  { code: '<input type="hidden" onClick={() => void 0} />' },
-  { code: '<input type="image" onClick={() => void 0} />' },
-  { code: '<input type="month" onClick={() => void 0} />' },
-  { code: '<input type="number" onClick={() => void 0} />' },
-  { code: '<input type="password" onClick={() => void 0} />' },
-  { code: '<input type="radio" onClick={() => void 0} />' },
-  { code: '<input type="range" onClick={() => void 0} />' },
-  { code: '<input type="reset" onClick={() => void 0} />' },
-  { code: '<input type="search" onClick={() => void 0} />' },
-  { code: '<input type="submit" onClick={() => void 0} />' },
-  { code: '<input type="tel" onClick={() => void 0} />' },
-  { code: '<input type="text" onClick={() => void 0} />' },
-  { code: '<input type="time" onClick={() => void 0} />' },
-  { code: '<input type="url" onClick={() => void 0} />' },
-  { code: '<input type="week" onClick={() => void 0} />' },
-  /* End all flavors of input */
-  { code: '<button onClick={() => void 0} className="foo" />' },
-  { code: '<menuitem onClick={() => {}} />;' },
-  { code: '<option onClick={() => void 0} className="foo" />' },
-  { code: '<select onClick={() => void 0} className="foo" />' },
-  { code: '<textarea onClick={() => void 0} className="foo" />' },
-  { code: '<a onClick={() => void 0} href="http://x.y.z" />' },
-  { code: '<a onClick={() => void 0} href="http://x.y.z" tabIndex="0" />' },
-  { code: '<audio onClick={() => {}} />;' },
-  { code: '<form onClick={() => {}} />;' },
-  { code: '<form onSubmit={() => {}} />;' },
-  /* HTML elements attributed with an interactive role */
-  { code: '<div role="button" onClick={() => {}} />;' },
-  { code: '<div role="checkbox" onClick={() => {}} />;' },
-  { code: '<div role="columnheader" onClick={() => {}} />;' },
-  { code: '<div role="combobox" onClick={() => {}} />;' },
-  { code: '<div role="form" onClick={() => {}} />;' },
-  { code: '<div role="gridcell" onClick={() => {}} />;' },
-  { code: '<div role="link" onClick={() => {}} />;' },
-  { code: '<div role="menuitem" onClick={() => {}} />;' },
-  { code: '<div role="menuitemcheckbox" onClick={() => {}} />;' },
-  { code: '<div role="menuitemradio" onClick={() => {}} />;' },
-  { code: '<div role="option" onClick={() => {}} />;' },
-  { code: '<div role="radio" onClick={() => {}} />;' },
-  { code: '<div role="rowheader" onClick={() => {}} />;' },
-  { code: '<div role="searchbox" onClick={() => {}} />;' },
-  { code: '<div role="slider" onClick={() => {}} />;' },
-  { code: '<div role="spinbutton" onClick={() => {}} />;' },
-  { code: '<div role="switch" onClick={() => {}} />;' },
-  { code: '<div role="tab" onClick={() => {}} />;' },
-  { code: '<div role="textbox" onClick={() => {}} />;' },
-  { code: '<div role="treeitem" onClick={() => {}} />;' },
-  /* Presentation is a special case role that indicates intentional static semantics */
-  { code: '<div role="presentation" onClick={() => {}} />;' },
-  { code: '<div role="presentation" onKeyDown={() => {}} />;' },
-  /* HTML elements with an inherent, non-interactive role */
-  { code: '<main onClick={() => void 0} />;' },
-  { code: '<article onClick={() => {}} />;' },
-  { code: '<article onDblClick={() => void 0} />;' },
-  { code: '<blockquote onClick={() => {}} />;' },
-  { code: '<br onClick={() => {}} />;' },
-  { code: '<canvas onClick={() => {}} />;' },
-  { code: '<caption onClick={() => {}} />;' },
-  { code: '<details onClick={() => {}} />;' },
-  { code: '<dd onClick={() => {}} />;' },
-  { code: '<dfn onClick={() => {}} />;' },
-  { code: '<dir onClick={() => {}} />;' },
-  { code: '<dl onClick={() => {}} />;' },
-  { code: '<dt onClick={() => {}} />;' },
-  { code: '<embed onClick={() => {}} />;' },
-  { code: '<fieldset onClick={() => {}} />;' },
-  { code: '<figcaption onClick={() => {}} />;' },
-  { code: '<figure onClick={() => {}} />;' },
-  { code: '<footer onClick={() => {}} />;' },
-  { code: '<frame onClick={() => {}} />;' },
-  { code: '<h1 onClick={() => {}} />;' },
-  { code: '<h2 onClick={() => {}} />;' },
-  { code: '<h3 onClick={() => {}} />;' },
-  { code: '<h4 onClick={() => {}} />;' },
-  { code: '<h5 onClick={() => {}} />;' },
-  { code: '<h6 onClick={() => {}} />;' },
-  { code: '<hr onClick={() => {}} />;' },
-  { code: '<iframe onClick={() => {}} />;' },
-  { code: '<img onClick={() => {}} />;' },
-  { code: '<label onClick={() => {}} />;' },
-  { code: '<legend onClick={() => {}} />;' },
-  { code: '<li onClick={() => {}} />;' },
-  { code: '<link onClick={() => {}} />;' },
-  { code: '<mark onClick={() => {}} />;' },
-  { code: '<marquee onClick={() => {}} />;' },
-  { code: '<menu onClick={() => {}} />;' },
-  { code: '<meter onClick={() => {}} />;' },
-  { code: '<nav onClick={() => {}} />;' },
-  { code: '<ol onClick={() => {}} />;' },
-  { code: '<p onClick={() => {}} />;' },
-  { code: '<pre onClick={() => {}} />;' },
-  { code: '<progress onClick={() => {}} />;' },
-  { code: '<ruby onClick={() => {}} />;' },
-  { code: '<table onClick={() => {}} />;' },
-  { code: '<tbody onClick={() => {}} />;' },
-  { code: '<tfoot onClick={() => {}} />;' },
-  { code: '<th onClick={() => {}} />;' },
-  { code: '<thead onClick={() => {}} />;' },
-  { code: '<time onClick={() => {}} />;' },
-  { code: '<tr onClick={() => {}} />;' },
-  { code: '<video onClick={() => {}} />;' },
-  { code: '<ul onClick={() => {}} />;' },
-  /* HTML elements attributed with an abstract role */
-  { code: '<div role="command" onClick={() => {}} />;' },
-  { code: '<div role="composite" onClick={() => {}} />;' },
-  { code: '<div role="input" onClick={() => {}} />;' },
-  { code: '<div role="landmark" onClick={() => {}} />;' },
-  { code: '<div role="range" onClick={() => {}} />;' },
-  { code: '<div role="roletype" onClick={() => {}} />;' },
-  { code: '<div role="sectionhead" onClick={() => {}} />;' },
-  { code: '<div role="select" onClick={() => {}} />;' },
-  { code: '<div role="structure" onClick={() => {}} />;' },
-  { code: '<div role="widget" onClick={() => {}} />;' },
-  { code: '<div role="window" onClick={() => {}} />;' },
-  /* HTML elements attributed with a non-interactive role */
-  { code: '<div role="alert" onClick={() => {}} />;' },
-  { code: '<div role="alertdialog" onClick={() => {}} />;' },
-  { code: '<div role="application" onClick={() => {}} />;' },
-  { code: '<div role="article" onClick={() => {}} />;' },
-  { code: '<div role="banner" onClick={() => {}} />;' },
-  { code: '<div role="cell" onClick={() => {}} />;' },
-  { code: '<div role="complementary" onClick={() => {}} />;' },
-  { code: '<div role="contentinfo" onClick={() => {}} />;' },
-  { code: '<div role="definition" onClick={() => {}} />;' },
-  { code: '<div role="dialog" onClick={() => {}} />;' },
-  { code: '<div role="directory" onClick={() => {}} />;' },
-  { code: '<div role="document" onClick={() => {}} />;' },
-  { code: '<div role="feed" onClick={() => {}} />;' },
-  { code: '<div role="figure" onClick={() => {}} />;' },
-  { code: '<div role="grid" onClick={() => {}} />;' },
-  { code: '<div role="group" onClick={() => {}} />;' },
-  { code: '<div role="heading" onClick={() => {}} />;' },
-  { code: '<div role="img" onClick={() => {}} />;' },
-  { code: '<div role="list" onClick={() => {}} />;' },
-  { code: '<div role="listbox" onClick={() => {}} />;' },
-  { code: '<div role="listitem" onClick={() => {}} />;' },
-  { code: '<div role="log" onClick={() => {}} />;' },
-  { code: '<div role="main" onClick={() => {}} />;' },
-  { code: '<div role="marquee" onClick={() => {}} />;' },
-  { code: '<div role="math" onClick={() => {}} />;' },
-  { code: '<div role="menu" onClick={() => {}} />;' },
-  { code: '<div role="menubar" onClick={() => {}} />;' },
-  { code: '<div role="navigation" onClick={() => {}} />;' },
-  { code: '<div role="note" onClick={() => {}} />;' },
-  { code: '<div role="progressbar" onClick={() => {}} />;' },
-  { code: '<div role="radiogroup" onClick={() => {}} />;' },
-  { code: '<div role="region" onClick={() => {}} />;' },
-  { code: '<div role="row" onClick={() => {}} />;' },
-  { code: '<div role="rowgroup" onClick={() => {}} />;' },
-  { code: '<div role="section" onClick={() => {}} />;' },
-  { code: '<div role="search" onClick={() => {}} />;' },
-  { code: '<div role="separator" onClick={() => {}} />;' },
-  { code: '<div role="scrollbar" onClick={() => {}} />;' },
-  { code: '<div role="status" onClick={() => {}} />;' },
-  { code: '<div role="table" onClick={() => {}} />;' },
-  { code: '<div role="tablist" onClick={() => {}} />;' },
-  { code: '<div role="tabpanel" onClick={() => {}} />;' },
-  { code: '<td onClick={() => {}} />;' },
-  { code: '<div role="term" onClick={() => {}} />;' },
-  { code: '<div role="timer" onClick={() => {}} />;' },
-  { code: '<div role="toolbar" onClick={() => {}} />;' },
-  { code: '<div role="tooltip" onClick={() => {}} />;' },
-  { code: '<div role="tree" onClick={() => {}} />;' },
-  { code: '<div role="treegrid" onClick={() => {}} />;' },
-  // All the possible handlers
-  { code: '<div onCopy={() => {}} />;' },
-  { code: '<div onCut={() => {}} />;' },
-  { code: '<div onPaste={() => {}} />;' },
-  { code: '<div onCompositionEnd={() => {}} />;' },
-  { code: '<div onCompositionStart={() => {}} />;' },
-  { code: '<div onCompositionUpdate={() => {}} />;' },
-  { code: '<div onChange={() => {}} />;' },
-  { code: '<div onInput={() => {}} />;' },
-  { code: '<div onSubmit={() => {}} />;' },
-  { code: '<div onSelect={() => {}} />;' },
-  { code: '<div onTouchCancel={() => {}} />;' },
-  { code: '<div onTouchEnd={() => {}} />;' },
-  { code: '<div onTouchMove={() => {}} />;' },
-  { code: '<div onTouchStart={() => {}} />;' },
-  { code: '<div onScroll={() => {}} />;' },
-  { code: '<div onWheel={() => {}} />;' },
-  { code: '<div onAbort={() => {}} />;' },
-  { code: '<div onCanPlay={() => {}} />;' },
-  { code: '<div onCanPlayThrough={() => {}} />;' },
-  { code: '<div onDurationChange={() => {}} />;' },
-  { code: '<div onEmptied={() => {}} />;' },
-  { code: '<div onEncrypted={() => {}} />;' },
-  { code: '<div onEnded={() => {}} />;' },
-  { code: '<div onError={() => {}} />;' },
-  { code: '<div onLoadedData={() => {}} />;' },
-  { code: '<div onLoadedMetadata={() => {}} />;' },
-  { code: '<div onLoadStart={() => {}} />;' },
-  { code: '<div onPause={() => {}} />;' },
-  { code: '<div onPlay={() => {}} />;' },
-  { code: '<div onPlaying={() => {}} />;' },
-  { code: '<div onProgress={() => {}} />;' },
-  { code: '<div onRateChange={() => {}} />;' },
-  { code: '<div onSeeked={() => {}} />;' },
-  { code: '<div onSeeking={() => {}} />;' },
-  { code: '<div onStalled={() => {}} />;' },
-  { code: '<div onSuspend={() => {}} />;' },
-  { code: '<div onTimeUpdate={() => {}} />;' },
-  { code: '<div onVolumeChange={() => {}} />;' },
-  { code: '<div onWaiting={() => {}} />;' },
-  { code: '<div onLoad={() => {}} />;' },
-  { code: '<div onError={() => {}} />;' },
-  { code: '<div onAnimationStart={() => {}} />;' },
-  { code: '<div onAnimationEnd={() => {}} />;' },
-  { code: '<div onAnimationIteration={() => {}} />;' },
-  { code: '<div onTransitionEnd={() => {}} />;' },
-];
-
-const neverValid = [
-  { code: '<div onClick={() => void 0} />;', errors: [expectedError] },
-  { code: '<div onClick={() => void 0} role={undefined} />;', errors: [expectedError] },
-  { code: '<div onClick={() => void 0} {...props} />;', errors: [expectedError] },
-  { code: '<div onKeyUp={() => void 0} aria-hidden={false} />;', errors: [expectedError] },
-  /* Static elements; no inherent role */
-  { code: '<a onClick={() => void 0} />', errors: [expectedError] },
-  { code: '<a onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<a tabIndex="0" onClick={() => void 0} />', errors: [expectedError] },
-  { code: '<area onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<acronym onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<address onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<applet onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<aside onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<b onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<base onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<bdi onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<bdo onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<big onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<blink onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<body onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<center onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<cite onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<code onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<col onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<colgroup onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<content onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<data onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<datalist onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<del onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<em onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<font onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<frameset onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<head onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<header onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<hgroup onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<html onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<i onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<ins onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<kbd onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<keygen onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<map onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<meta onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<noembed onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<noscript onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<object onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<optgroup onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<output onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<param onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<picture onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<q onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<rp onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<rt onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<rtc onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<s onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<samp onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<script onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<small onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<source onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<spacer onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<span onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<strike onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<strong onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<style onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<sub onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<summary onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<sup onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<title onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<track onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<tt onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<u onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<var onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<wbr onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<xmp onClick={() => {}} />;', errors: [expectedError] },
-  // Handlers
-  { code: '<div onKeyDown={() => {}} />;', errors: [expectedError] },
-  { code: '<div onKeyPress={() => {}} />;', errors: [expectedError] },
-  { code: '<div onKeyUp={() => {}} />;', errors: [expectedError] },
-  { code: '<div onClick={() => {}} />;', errors: [expectedError] },
-  { code: '<div onMouseDown={() => {}} />;', errors: [expectedError] },
-  { code: '<div onMouseUp={() => {}} />;', errors: [expectedError] },
-];
-
-const recommendedOptions = configs.recommended.rules[`jsx-a11y/${ruleName}`][1] || {};
-ruleTester.run(`${ruleName}:recommended`, rule, {
-  valid: [
-    ...alwaysValid,
-    // All the possible handlers
-    { code: '<div onCopy={() => {}} />;' },
-    { code: '<div onCut={() => {}} />;' },
-    { code: '<div onPaste={() => {}} />;' },
-    { code: '<div onCompositionEnd={() => {}} />;' },
-    { code: '<div onCompositionStart={() => {}} />;' },
-    { code: '<div onCompositionUpdate={() => {}} />;' },
-    { code: '<div onFocus={() => {}} />;' },
-    { code: '<div onBlur={() => {}} />;' },
-    { code: '<div onChange={() => {}} />;' },
-    { code: '<div onInput={() => {}} />;' },
-    { code: '<div onSubmit={() => {}} />;' },
-    { code: '<div onContextMenu={() => {}} />;' },
-    { code: '<div onDblClick={() => {}} />;' },
-    { code: '<div onDoubleClick={() => {}} />;' },
-    { code: '<div onDrag={() => {}} />;' },
-    { code: '<div onDragEnd={() => {}} />;' },
-    { code: '<div onDragEnter={() => {}} />;' },
-    { code: '<div onDragExit={() => {}} />;' },
-    { code: '<div onDragLeave={() => {}} />;' },
-    { code: '<div onDragOver={() => {}} />;' },
-    { code: '<div onDragStart={() => {}} />;' },
-    { code: '<div onDrop={() => {}} />;' },
-    { code: '<div onMouseEnter={() => {}} />;' },
-    { code: '<div onMouseLeave={() => {}} />;' },
-    { code: '<div onMouseMove={() => {}} />;' },
-    { code: '<div onMouseOut={() => {}} />;' },
-    { code: '<div onMouseOver={() => {}} />;' },
-    { code: '<div onSelect={() => {}} />;' },
-    { code: '<div onTouchCancel={() => {}} />;' },
-    { code: '<div onTouchEnd={() => {}} />;' },
-    { code: '<div onTouchMove={() => {}} />;' },
-    { code: '<div onTouchStart={() => {}} />;' },
-    { code: '<div onScroll={() => {}} />;' },
-    { code: '<div onWheel={() => {}} />;' },
-    { code: '<div onAbort={() => {}} />;' },
-    { code: '<div onCanPlay={() => {}} />;' },
-    { code: '<div onCanPlayThrough={() => {}} />;' },
-    { code: '<div onDurationChange={() => {}} />;' },
-    { code: '<div onEmptied={() => {}} />;' },
-    { code: '<div onEncrypted={() => {}} />;' },
-    { code: '<div onEnded={() => {}} />;' },
-    { code: '<div onError={() => {}} />;' },
-    { code: '<div onLoadedData={() => {}} />;' },
-    { code: '<div onLoadedMetadata={() => {}} />;' },
-    { code: '<div onLoadStart={() => {}} />;' },
-    { code: '<div onPause={() => {}} />;' },
-    { code: '<div onPlay={() => {}} />;' },
-    { code: '<div onPlaying={() => {}} />;' },
-    { code: '<div onProgress={() => {}} />;' },
-    { code: '<div onRateChange={() => {}} />;' },
-    { code: '<div onSeeked={() => {}} />;' },
-    { code: '<div onSeeking={() => {}} />;' },
-    { code: '<div onStalled={() => {}} />;' },
-    { code: '<div onSuspend={() => {}} />;' },
-    { code: '<div onTimeUpdate={() => {}} />;' },
-    { code: '<div onVolumeChange={() => {}} />;' },
-    { code: '<div onWaiting={() => {}} />;' },
-    { code: '<div onLoad={() => {}} />;' },
-    { code: '<div onError={() => {}} />;' },
-    { code: '<div onAnimationStart={() => {}} />;' },
-    { code: '<div onAnimationEnd={() => {}} />;' },
-    { code: '<div onAnimationIteration={() => {}} />;' },
-    { code: '<div onTransitionEnd={() => {}} />;' },
-    // Expressions should pass in recommended mode
-    { code: '<div role={ROLE_BUTTON} onClick={() => {}} />;' },
-    { code: '<div  {...this.props} role={this.props.role} onKeyPress={e => this.handleKeyPress(e)}>{this.props.children}</div>' },
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-  ]
-    .map(ruleOptionsMapperFactory(recommendedOptions))
-    .map(parserOptionsMapper),
-});
-
-ruleTester.run(`${ruleName}:strict`, rule, {
-  valid: [
-    ...alwaysValid,
-  ].map(parserOptionsMapper),
-  invalid: [
-    ...neverValid,
-    // All the possible handlers
-    { code: '<div onContextMenu={() => {}} />;', errors: [expectedError] },
-    { code: '<div onDblClick={() => {}} />;', errors: [expectedError] },
-    { code: '<div onDoubleClick={() => {}} />;', errors: [expectedError] },
-    { code: '<div onDrag={() => {}} />;', errors: [expectedError] },
-    { code: '<div onDragEnd={() => {}} />;', errors: [expectedError] },
-    { code: '<div onDragEnter={() => {}} />;', errors: [expectedError] },
-    { code: '<div onDragExit={() => {}} />;', errors: [expectedError] },
-    { code: '<div onDragLeave={() => {}} />;', errors: [expectedError] },
-    { code: '<div onDragOver={() => {}} />;', errors: [expectedError] },
-    { code: '<div onDragStart={() => {}} />;', errors: [expectedError] },
-    { code: '<div onDrop={() => {}} />;', errors: [expectedError] },
-    { code: '<div onMouseEnter={() => {}} />;', errors: [expectedError] },
-    { code: '<div onMouseLeave={() => {}} />;', errors: [expectedError] },
-    { code: '<div onMouseMove={() => {}} />;', errors: [expectedError] },
-    { code: '<div onMouseOut={() => {}} />;', errors: [expectedError] },
-    { code: '<div onMouseOver={() => {}} />;', errors: [expectedError] },
-    // Expressions should fail in strict mode
-    { code: '<div role={ROLE_BUTTON} onClick={() => {}} />;', errors: [expectedError] },
-    { code: '<div  {...this.props} role={this.props.role} onKeyPress={e => this.handleKeyPress(e)}>{this.props.children}</div>', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/role-has-required-aria-props-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/role-has-required-aria-props-test.js
deleted file mode 100644
index 9d38641..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/role-has-required-aria-props-test.js
+++ /dev/null
@@ -1,140 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce that elements with ARIA roles must
- *  have all required attributes for that role.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { roles } from 'aria-query';
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/role-has-required-aria-props';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const errorMessage = (role) => {
-  const requiredProps = Object.keys(roles.get(role).requiredProps);
-
-  return {
-    message: `Elements with the ARIA role "${role}" must have the following attributes defined: ${requiredProps}`,
-    type: 'JSXAttribute',
-  };
-};
-
-
-// Create basic test cases using all valid role types.
-const basicValidityTests = [...roles.keys()].map((role) => {
-  const {
-    requiredProps: requiredPropKeyValues,
-  } = roles.get(role);
-  const requiredProps = Object.keys(requiredPropKeyValues);
-  const propChain = requiredProps.join(' ');
-
-  return {
-    code: `<div role="${role.toLowerCase()}" ${propChain} />`,
-  };
-});
-
-ruleTester.run('role-has-required-aria-props', rule, {
-  valid: [
-    { code: '<Bar baz />' },
-    { code: '<MyComponent role="combobox" />' },
-    // Variables should pass, as we are only testing literals.
-    { code: '<div />' },
-    { code: '<div></div>' },
-    { code: '<div role={role} />' },
-    { code: '<div role={role || "button"} />' },
-    { code: '<div role={role || "foobar"} />' },
-    { code: '<div role="row" />' },
-    { code: '<span role="checkbox" aria-checked="false" aria-labelledby="foo" tabindex="0"></span>' },
-    { code: '<input role="checkbox" aria-checked="false" aria-labelledby="foo" tabindex="0" {...props} type="checkbox" />' },
-    { code: '<input type="checkbox" role="switch" />' },
-  ].concat(basicValidityTests).map(parserOptionsMapper),
-
-  invalid: [
-    // SLIDER
-    { code: '<div role="slider" />', errors: [errorMessage('slider')] },
-    {
-      code: '<div role="slider" aria-valuemax />',
-      errors: [errorMessage('slider')],
-    },
-    {
-      code: '<div role="slider" aria-valuemax aria-valuemin />',
-      errors: [errorMessage('slider')],
-    },
-    {
-      code: '<div role="slider" aria-valuemax aria-valuenow />',
-      errors: [errorMessage('slider')],
-    },
-    {
-      code: '<div role="slider" aria-valuemin aria-valuenow />',
-      errors: [errorMessage('slider')],
-    },
-
-    // SPINBUTTON
-    { code: '<div role="spinbutton" />', errors: [errorMessage('spinbutton')] },
-    {
-      code: '<div role="spinbutton" aria-valuemax />',
-      errors: [errorMessage('spinbutton')],
-    },
-    {
-      code: '<div role="spinbutton" aria-valuemax aria-valuemin />',
-      errors: [errorMessage('spinbutton')],
-    },
-    {
-      code: '<div role="spinbutton" aria-valuemax aria-valuenow />',
-      errors: [errorMessage('spinbutton')],
-    },
-    {
-      code: '<div role="spinbutton" aria-valuemin aria-valuenow />',
-      errors: [errorMessage('spinbutton')],
-    },
-
-    // CHECKBOX
-    { code: '<div role="checkbox" />', errors: [errorMessage('checkbox')] },
-    { code: '<div role="checkbox" checked />', errors: [errorMessage('checkbox')] },
-    {
-      code: '<div role="checkbox" aria-chcked />',
-      errors: [errorMessage('checkbox')],
-    },
-    {
-      code: '<span role="checkbox" aria-labelledby="foo" tabindex="0"></span>',
-      errors: [errorMessage('checkbox')],
-    },
-
-    // COMBOBOX
-    { code: '<div role="combobox" />', errors: [errorMessage('combobox')] },
-    { code: '<div role="combobox" expanded />', errors: [errorMessage('combobox')] },
-    {
-      code: '<div role="combobox" aria-expandd />',
-      errors: [errorMessage('combobox')],
-    },
-
-    // SCROLLBAR
-    { code: '<div role="scrollbar" />', errors: [errorMessage('scrollbar')] },
-    {
-      code: '<div role="scrollbar" aria-valuemax />',
-      errors: [errorMessage('scrollbar')],
-    },
-    {
-      code: '<div role="scrollbar" aria-valuemax aria-valuemin />',
-      errors: [errorMessage('scrollbar')],
-    },
-    {
-      code: '<div role="scrollbar" aria-valuemax aria-valuenow />',
-      errors: [errorMessage('scrollbar')],
-    },
-    {
-      code: '<div role="scrollbar" aria-valuemin aria-valuenow />',
-      errors: [errorMessage('scrollbar')],
-    },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/role-supports-aria-props-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/role-supports-aria-props-test.js
deleted file mode 100644
index 763ee22..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/role-supports-aria-props-test.js
+++ /dev/null
@@ -1,448 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce that an element does not have an unsupported ARIA attribute.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import {
-  aria,
-  roles,
-} from 'aria-query';
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/role-supports-aria-props';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const generateErrorMessage = (attr, role, tag, isImplicit) => {
-  if (isImplicit) {
-    return `The attribute ${attr} is not supported by the role ${role}. \
-This role is implicit on the element ${tag}.`;
-  }
-
-  return `The attribute ${attr} is not supported by the role ${role}.`;
-};
-
-const errorMessage = (attr, role, tag, isImplicit) => ({
-  message: generateErrorMessage(attr, role, tag, isImplicit),
-  type: 'JSXOpeningElement',
-});
-
-const nonAbstractRoles = [...roles.keys()].filter(role => roles.get(role).abstract === false);
-
-const createTests = rolesNames => rolesNames.reduce((tests, role) => {
-  const {
-    props: propKeyValues,
-  } = roles.get(role);
-  const validPropsForRole = Object.keys(propKeyValues);
-  const invalidPropsForRole = [...aria.keys()]
-    .map(attribute => attribute.toLowerCase())
-    .filter(attribute => validPropsForRole.indexOf(attribute) === -1);
-  const normalRole = role.toLowerCase();
-
-  const allTests = [];
-
-  allTests[0] = tests[0].concat(validPropsForRole.map(prop => ({
-    code: `<div role="${normalRole}" ${prop.toLowerCase()} />`,
-  })));
-
-  allTests[1] = tests[1].concat(invalidPropsForRole.map(prop => ({
-    code: `<div role="${normalRole}" ${prop.toLowerCase()} />`,
-    errors: [errorMessage(prop.toLowerCase(), normalRole, 'div', false)],
-  })));
-
-  return allTests;
-}, [[], []]);
-
-const [validTests, invalidTests] = createTests(nonAbstractRoles);
-
-ruleTester.run('role-supports-aria-props', rule, {
-  valid: [
-    { code: '<Foo bar />' },
-    { code: '<div />' },
-    { code: '<div id="main" />' },
-    { code: '<div role />' },
-    { code: '<div role="presentation" {...props} />' },
-    { code: '<Foo.Bar baz={true} />' },
-
-    // IMPLICIT ROLE TESTS
-    // A TESTS - implicit role is `link`
-    { code: '<a href="#" aria-expanded />' },
-    { code: '<a href="#" aria-atomic />' },
-    { code: '<a href="#" aria-busy />' },
-    { code: '<a href="#" aria-controls />' },
-    { code: '<a href="#" aria-current />' },
-    { code: '<a href="#" aria-describedby />' },
-    { code: '<a href="#" aria-disabled />' },
-    { code: '<a href="#" aria-dropeffect />' },
-    { code: '<a href="#" aria-flowto />' },
-    { code: '<a href="#" aria-grabbed />' },
-    { code: '<a href="#" aria-haspopup />' },
-    { code: '<a href="#" aria-hidden />' },
-    { code: '<a href="#" aria-invalid />' },
-    { code: '<a href="#" aria-label />' },
-    { code: '<a href="#" aria-labelledby />' },
-    { code: '<a href="#" aria-live />' },
-    { code: '<a href="#" aria-owns />' },
-    { code: '<a href="#" aria-relevant />' },
-
-    // this will have global
-    { code: '<a aria-checked />' },
-
-    // AREA TESTS - implicit role is `link`
-    { code: '<area href="#" aria-expanded />' },
-    { code: '<area href="#" aria-atomic />' },
-    { code: '<area href="#" aria-busy />' },
-    { code: '<area href="#" aria-controls />' },
-    { code: '<area href="#" aria-describedby />' },
-    { code: '<area href="#" aria-disabled />' },
-    { code: '<area href="#" aria-dropeffect />' },
-    { code: '<area href="#" aria-flowto />' },
-    { code: '<area href="#" aria-grabbed />' },
-    { code: '<area href="#" aria-haspopup />' },
-    { code: '<area href="#" aria-hidden />' },
-    { code: '<area href="#" aria-invalid />' },
-    { code: '<area href="#" aria-label />' },
-    { code: '<area href="#" aria-labelledby />' },
-    { code: '<area href="#" aria-live />' },
-    { code: '<area href="#" aria-owns />' },
-    { code: '<area href="#" aria-relevant />' },
-
-    // this will have global
-    { code: '<area aria-checked />' },
-
-    // LINK TESTS - implicit role is `link`
-    { code: '<link href="#" aria-expanded />' },
-    { code: '<link href="#" aria-atomic />' },
-    { code: '<link href="#" aria-busy />' },
-    { code: '<link href="#" aria-controls />' },
-    { code: '<link href="#" aria-describedby />' },
-    { code: '<link href="#" aria-disabled />' },
-    { code: '<link href="#" aria-dropeffect />' },
-    { code: '<link href="#" aria-flowto />' },
-    { code: '<link href="#" aria-grabbed />' },
-    { code: '<link href="#" aria-haspopup />' },
-    { code: '<link href="#" aria-hidden />' },
-    { code: '<link href="#" aria-invalid />' },
-    { code: '<link href="#" aria-label />' },
-    { code: '<link href="#" aria-labelledby />' },
-    { code: '<link href="#" aria-live />' },
-    { code: '<link href="#" aria-owns />' },
-    { code: '<link href="#" aria-relevant />' },
-
-    // this will have global
-    { code: '<link aria-checked />' },
-
-    // IMG TESTS - no implicit role
-    { code: '<img alt="" aria-checked />' },
-
-    // this will have role of `img`
-    { code: '<img alt="foobar" aria-busy />' },
-
-    // MENU TESTS - implicit role is `toolbar` when `type="toolbar"`
-    { code: '<menu type="toolbar" aria-activedescendant />' },
-    { code: '<menu type="toolbar" aria-expanded />' },
-    { code: '<menu type="toolbar" aria-atomic />' },
-    { code: '<menu type="toolbar" aria-busy />' },
-    { code: '<menu type="toolbar" aria-controls />' },
-    { code: '<menu type="toolbar" aria-describedby />' },
-    { code: '<menu type="toolbar" aria-disabled />' },
-    { code: '<menu type="toolbar" aria-dropeffect />' },
-    { code: '<menu type="toolbar" aria-flowto />' },
-    { code: '<menu type="toolbar" aria-grabbed />' },
-    { code: '<menu type="toolbar" aria-haspopup />' },
-    { code: '<menu type="toolbar" aria-hidden />' },
-    { code: '<menu type="toolbar" aria-invalid />' },
-    { code: '<menu type="toolbar" aria-label />' },
-    { code: '<menu type="toolbar" aria-labelledby />' },
-    { code: '<menu type="toolbar" aria-live />' },
-    { code: '<menu type="toolbar" aria-owns />' },
-    { code: '<menu type="toolbar" aria-relevant />' },
-
-    // this will have global
-    { code: '<menu aria-checked />' },
-
-    // MENUITEM TESTS
-    // when `type="command`, the implicit role is `menuitem`
-    { code: '<menuitem type="command" aria-atomic />' },
-    { code: '<menuitem type="command" aria-busy />' },
-    { code: '<menuitem type="command" aria-controls />' },
-    { code: '<menuitem type="command" aria-describedby />' },
-    { code: '<menuitem type="command" aria-disabled />' },
-    { code: '<menuitem type="command" aria-dropeffect />' },
-    { code: '<menuitem type="command" aria-flowto />' },
-    { code: '<menuitem type="command" aria-grabbed />' },
-    { code: '<menuitem type="command" aria-haspopup />' },
-    { code: '<menuitem type="command" aria-hidden />' },
-    { code: '<menuitem type="command" aria-invalid />' },
-    { code: '<menuitem type="command" aria-label />' },
-    { code: '<menuitem type="command" aria-labelledby />' },
-    { code: '<menuitem type="command" aria-live />' },
-    { code: '<menuitem type="command" aria-owns />' },
-    { code: '<menuitem type="command" aria-relevant />' },
-    // when `type="checkbox`, the implicit role is `menuitemcheckbox`
-    { code: '<menuitem type="checkbox" aria-checked />' },
-    { code: '<menuitem type="checkbox" aria-atomic />' },
-    { code: '<menuitem type="checkbox" aria-busy />' },
-    { code: '<menuitem type="checkbox" aria-controls />' },
-    { code: '<menuitem type="checkbox" aria-describedby />' },
-    { code: '<menuitem type="checkbox" aria-disabled />' },
-    { code: '<menuitem type="checkbox" aria-dropeffect />' },
-    { code: '<menuitem type="checkbox" aria-flowto />' },
-    { code: '<menuitem type="checkbox" aria-grabbed />' },
-    { code: '<menuitem type="checkbox" aria-haspopup />' },
-    { code: '<menuitem type="checkbox" aria-hidden />' },
-    { code: '<menuitem type="checkbox" aria-invalid />' },
-    { code: '<menuitem type="checkbox" aria-label />' },
-    { code: '<menuitem type="checkbox" aria-labelledby />' },
-    { code: '<menuitem type="checkbox" aria-live />' },
-    { code: '<menuitem type="checkbox" aria-owns />' },
-    { code: '<menuitem type="checkbox" aria-relevant />' },
-    // when `type="radio`, the implicit role is `menuitemradio`
-    { code: '<menuitem type="radio" aria-checked />' },
-    { code: '<menuitem type="radio" aria-atomic />' },
-    { code: '<menuitem type="radio" aria-busy />' },
-    { code: '<menuitem type="radio" aria-controls />' },
-    { code: '<menuitem type="radio" aria-describedby />' },
-    { code: '<menuitem type="radio" aria-disabled />' },
-    { code: '<menuitem type="radio" aria-dropeffect />' },
-    { code: '<menuitem type="radio" aria-flowto />' },
-    { code: '<menuitem type="radio" aria-grabbed />' },
-    { code: '<menuitem type="radio" aria-haspopup />' },
-    { code: '<menuitem type="radio" aria-hidden />' },
-    { code: '<menuitem type="radio" aria-invalid />' },
-    { code: '<menuitem type="radio" aria-label />' },
-    { code: '<menuitem type="radio" aria-labelledby />' },
-    { code: '<menuitem type="radio" aria-live />' },
-    { code: '<menuitem type="radio" aria-owns />' },
-    { code: '<menuitem type="radio" aria-relevant />' },
-    { code: '<menuitem type="radio" aria-posinset />' },
-    { code: '<menuitem type="radio" aria-selected />' },
-    { code: '<menuitem type="radio" aria-setsize />' },
-
-    // these will have global
-    { code: '<menuitem aria-checked />' },
-    { code: '<menuitem type="foo" aria-checked />' },
-
-    // INPUT TESTS
-    // when `type="button"`, the implicit role is `button`
-    { code: '<input type="button" aria-expanded />' },
-    { code: '<input type="button" aria-pressed />' },
-    { code: '<input type="button" aria-atomic />' },
-    { code: '<input type="button" aria-busy />' },
-    { code: '<input type="button" aria-controls />' },
-    { code: '<input type="button" aria-describedby />' },
-    { code: '<input type="button" aria-disabled />' },
-    { code: '<input type="button" aria-dropeffect />' },
-    { code: '<input type="button" aria-flowto />' },
-    { code: '<input type="button" aria-grabbed />' },
-    { code: '<input type="button" aria-haspopup />' },
-    { code: '<input type="button" aria-hidden />' },
-    { code: '<input type="button" aria-invalid />' },
-    { code: '<input type="button" aria-label />' },
-    { code: '<input type="button" aria-labelledby />' },
-    { code: '<input type="button" aria-live />' },
-    { code: '<input type="button" aria-owns />' },
-    { code: '<input type="button" aria-relevant />' },
-    // when `type="image"`, the implicit role is `button`
-    { code: '<input type="image" aria-expanded />' },
-    { code: '<input type="image" aria-pressed />' },
-    { code: '<input type="image" aria-atomic />' },
-    { code: '<input type="image" aria-busy />' },
-    { code: '<input type="image" aria-controls />' },
-    { code: '<input type="image" aria-describedby />' },
-    { code: '<input type="image" aria-disabled />' },
-    { code: '<input type="image" aria-dropeffect />' },
-    { code: '<input type="image" aria-flowto />' },
-    { code: '<input type="image" aria-grabbed />' },
-    { code: '<input type="image" aria-haspopup />' },
-    { code: '<input type="image" aria-hidden />' },
-    { code: '<input type="image" aria-invalid />' },
-    { code: '<input type="image" aria-label />' },
-    { code: '<input type="image" aria-labelledby />' },
-    { code: '<input type="image" aria-live />' },
-    { code: '<input type="image" aria-owns />' },
-    { code: '<input type="image" aria-relevant />' },
-    // when `type="reset"`, the implicit role is `button`
-    { code: '<input type="reset" aria-expanded />' },
-    { code: '<input type="reset" aria-pressed />' },
-    { code: '<input type="reset" aria-atomic />' },
-    { code: '<input type="reset" aria-busy />' },
-    { code: '<input type="reset" aria-controls />' },
-    { code: '<input type="reset" aria-describedby />' },
-    { code: '<input type="reset" aria-disabled />' },
-    { code: '<input type="reset" aria-dropeffect />' },
-    { code: '<input type="reset" aria-flowto />' },
-    { code: '<input type="reset" aria-grabbed />' },
-    { code: '<input type="reset" aria-haspopup />' },
-    { code: '<input type="reset" aria-hidden />' },
-    { code: '<input type="reset" aria-invalid />' },
-    { code: '<input type="reset" aria-label />' },
-    { code: '<input type="reset" aria-labelledby />' },
-    { code: '<input type="reset" aria-live />' },
-    { code: '<input type="reset" aria-owns />' },
-    { code: '<input type="reset" aria-relevant />' },
-    // when `type="submit"`, the implicit role is `button`
-    { code: '<input type="submit" aria-expanded />' },
-    { code: '<input type="submit" aria-pressed />' },
-    { code: '<input type="submit" aria-atomic />' },
-    { code: '<input type="submit" aria-busy />' },
-    { code: '<input type="submit" aria-controls />' },
-    { code: '<input type="submit" aria-describedby />' },
-    { code: '<input type="submit" aria-disabled />' },
-    { code: '<input type="submit" aria-dropeffect />' },
-    { code: '<input type="submit" aria-flowto />' },
-    { code: '<input type="submit" aria-grabbed />' },
-    { code: '<input type="submit" aria-haspopup />' },
-    { code: '<input type="submit" aria-hidden />' },
-    { code: '<input type="submit" aria-invalid />' },
-    { code: '<input type="submit" aria-label />' },
-    { code: '<input type="submit" aria-labelledby />' },
-    { code: '<input type="submit" aria-live />' },
-    { code: '<input type="submit" aria-owns />' },
-    { code: '<input type="submit" aria-relevant />' },
-    // when `type="checkbox"`, the implicit role is `checkbox`
-    { code: '<input type="checkbox" aria-checked />' },
-    { code: '<input type="checkbox" aria-atomic />' },
-    { code: '<input type="checkbox" aria-busy />' },
-    { code: '<input type="checkbox" aria-controls />' },
-    { code: '<input type="checkbox" aria-describedby />' },
-    { code: '<input type="checkbox" aria-disabled />' },
-    { code: '<input type="checkbox" aria-dropeffect />' },
-    { code: '<input type="checkbox" aria-flowto />' },
-    { code: '<input type="checkbox" aria-grabbed />' },
-    { code: '<input type="checkbox" aria-haspopup />' },
-    { code: '<input type="checkbox" aria-hidden />' },
-    { code: '<input type="checkbox" aria-invalid />' },
-    { code: '<input type="checkbox" aria-label />' },
-    { code: '<input type="checkbox" aria-labelledby />' },
-    { code: '<input type="checkbox" aria-live />' },
-    { code: '<input type="checkbox" aria-owns />' },
-    { code: '<input type="checkbox" aria-relevant />' },
-    // when `type="radio"`, the implicit role is `radio`
-    { code: '<input type="radio" aria-checked />' },
-    { code: '<input type="radio" aria-atomic />' },
-    { code: '<input type="radio" aria-busy />' },
-    { code: '<input type="radio" aria-controls />' },
-    { code: '<input type="radio" aria-describedby />' },
-    { code: '<input type="radio" aria-disabled />' },
-    { code: '<input type="radio" aria-dropeffect />' },
-    { code: '<input type="radio" aria-flowto />' },
-    { code: '<input type="radio" aria-grabbed />' },
-    { code: '<input type="radio" aria-haspopup />' },
-    { code: '<input type="radio" aria-hidden />' },
-    { code: '<input type="radio" aria-invalid />' },
-    { code: '<input type="radio" aria-label />' },
-    { code: '<input type="radio" aria-labelledby />' },
-    { code: '<input type="radio" aria-live />' },
-    { code: '<input type="radio" aria-owns />' },
-    { code: '<input type="radio" aria-relevant />' },
-    { code: '<input type="radio" aria-posinset />' },
-    { code: '<input type="radio" aria-selected />' },
-    { code: '<input type="radio" aria-setsize />' },
-    // when `type="range"`, the implicit role is `slider`
-    { code: '<input type="range" aria-valuemax />' },
-    { code: '<input type="range" aria-valuemin />' },
-    { code: '<input type="range" aria-valuenow />' },
-    { code: '<input type="range" aria-orientation />' },
-    { code: '<input type="range" aria-atomic />' },
-    { code: '<input type="range" aria-busy />' },
-    { code: '<input type="range" aria-controls />' },
-    { code: '<input type="range" aria-describedby />' },
-    { code: '<input type="range" aria-disabled />' },
-    { code: '<input type="range" aria-dropeffect />' },
-    { code: '<input type="range" aria-flowto />' },
-    { code: '<input type="range" aria-grabbed />' },
-    { code: '<input type="range" aria-haspopup />' },
-    { code: '<input type="range" aria-hidden />' },
-    { code: '<input type="range" aria-invalid />' },
-    { code: '<input type="range" aria-label />' },
-    { code: '<input type="range" aria-labelledby />' },
-    { code: '<input type="range" aria-live />' },
-    { code: '<input type="range" aria-owns />' },
-    { code: '<input type="range" aria-relevant />' },
-    { code: '<input type="range" aria-valuetext />' },
-
-    // these will have role of `textbox`,
-    { code: '<input type="email" aria-disabled />' },
-    { code: '<input type="password" aria-disabled />' },
-    { code: '<input type="search" aria-disabled />' },
-    { code: '<input type="tel" aria-disabled />' },
-    { code: '<input type="url" aria-disabled />' },
-    { code: '<input aria-disabled />' },
-
-    // Allow null/undefined values regardless of role
-    { code: '<h2 role="presentation" aria-level={null} />' },
-    { code: '<h2 role="presentation" aria-level={undefined} />' },
-
-    // OTHER TESTS
-    { code: '<aside aria-expanded />' },
-    { code: '<article aria-expanded />' },
-    { code: '<body aria-expanded />' },
-    { code: '<button aria-pressed />' },
-    { code: '<datalist aria-expanded />' },
-    { code: '<details aria-expanded />' },
-    { code: '<dialog aria-expanded />' },
-    { code: '<dl aria-expanded />' },
-    { code: '<form aria-hidden />' },
-    { code: '<h1 aria-hidden />' },
-    { code: '<h2 aria-hidden />' },
-    { code: '<h3 aria-hidden />' },
-    { code: '<h4 aria-hidden />' },
-    { code: '<h5 aria-hidden />' },
-    { code: '<h6 aria-hidden />' },
-    { code: '<hr aria-hidden />' },
-    { code: '<li aria-current />' },
-    { code: '<li aria-expanded />' },
-    { code: '<meter aria-atomic />' },
-    { code: '<nav aria-expanded />' },
-    { code: '<ol aria-expanded />' },
-    { code: '<option aria-atomic />' },
-    { code: '<output aria-expanded />' },
-    { code: '<progress aria-atomic />' },
-    { code: '<section aria-expanded />' },
-    { code: '<select aria-expanded />' },
-    { code: '<tbody aria-expanded />' },
-    { code: '<textarea aria-hidden />' },
-    { code: '<tfoot aria-expanded />' },
-    { code: '<thead aria-expanded />' },
-    { code: '<ul aria-expanded />' },
-
-  ].concat(validTests).map(parserOptionsMapper),
-
-  invalid: [
-    // implicit basic checks
-    {
-      code: '<a href="#" aria-checked />',
-      errors: [errorMessage('aria-checked', 'link', 'a', true)],
-    },
-    {
-      code: '<area href="#" aria-checked />',
-      errors: [errorMessage('aria-checked', 'link', 'area', true)],
-    },
-    {
-      code: '<link href="#" aria-checked />',
-      errors: [errorMessage('aria-checked', 'link', 'link', true)],
-    },
-    {
-      code: '<img alt="foobar" aria-checked />',
-      errors: [errorMessage('aria-checked', 'img', 'img', true)],
-    },
-    {
-      code: '<menu type="toolbar" aria-checked />',
-      errors: [errorMessage('aria-checked', 'toolbar', 'menu', true)],
-    },
-    {
-      code: '<aside aria-checked />',
-      errors: [errorMessage('aria-checked', 'complementary', 'aside', true)],
-    },
-  ].concat(invalidTests).map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/scope-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/scope-test.js
deleted file mode 100644
index 995f0c0..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/scope-test.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce scope prop is only used on <th> elements.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/scope';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: 'The scope prop can only be used on <th> elements.',
-  type: 'JSXAttribute',
-};
-
-ruleTester.run('scope', rule, {
-  valid: [
-    { code: '<div />;' },
-    { code: '<div foo />;' },
-    { code: '<th scope />' },
-    { code: '<th scope="row" />' },
-    { code: '<th scope={foo} />' },
-    { code: '<th scope={"col"} {...props} />' },
-    { code: '<Foo scope="bar" {...props} />' },
-  ].map(parserOptionsMapper),
-  invalid: [
-    { code: '<div scope />', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/tabindex-no-positive-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/tabindex-no-positive-test.js
deleted file mode 100644
index a986601..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/rules/tabindex-no-positive-test.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/* eslint-env jest */
-/**
- * @fileoverview Enforce tabIndex value is not greater than zero.
- * @author Ethan Cohen
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/tabindex-no-positive';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: 'Avoid positive integer values for tabIndex.',
-  type: 'JSXAttribute',
-};
-
-ruleTester.run('tabindex-no-positive', rule, {
-  valid: [
-    { code: '<div />;' },
-    { code: '<div {...props} />' },
-    { code: '<div id="main" />' },
-    { code: '<div tabIndex={undefined} />' },
-    { code: '<div tabIndex={`${undefined}`} />' },
-    { code: '<div tabIndex={`${undefined}${undefined}`} />' },
-    { code: '<div tabIndex={0} />' },
-    { code: '<div tabIndex={-1} />' },
-    { code: '<div tabIndex={null} />' },
-    { code: '<div tabIndex={bar()} />' },
-    { code: '<div tabIndex={bar} />' },
-    { code: '<div tabIndex={"foobar"} />' },
-    { code: '<div tabIndex="0" />' },
-    { code: '<div tabIndex="-1" />' },
-    { code: '<div tabIndex="-5" />' },
-    { code: '<div tabIndex="-5.5" />' },
-    { code: '<div tabIndex={-5.5} />' },
-    { code: '<div tabIndex={-5} />' },
-  ].map(parserOptionsMapper),
-
-  invalid: [
-    { code: '<div tabIndex="1" />', errors: [expectedError] },
-    { code: '<div tabIndex={1} />', errors: [expectedError] },
-    { code: '<div tabIndex={"1"} />', errors: [expectedError] },
-    { code: '<div tabIndex={`1`} />', errors: [expectedError] },
-    { code: '<div tabIndex={1.589} />', errors: [expectedError] },
-  ].map(parserOptionsMapper),
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/attributesComparator-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/attributesComparator-test.js
deleted file mode 100644
index 7df5c77..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/attributesComparator-test.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import attributesComparator from '../../../src/util/attributesComparator';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-import JSXElementMock from '../../../__mocks__/JSXElementMock';
-
-describe('attributesComparator', () => {
-  describe('base attributes', () => {
-    let baseAttributes;
-    let attributes;
-    describe('are undefined', () => {
-      describe('and attributes are undefined', () => {
-        it('should return true', () => {
-          expect(attributesComparator()).toBe(true);
-        });
-      });
-    });
-    describe('are empty', () => {
-      beforeEach(() => {
-        baseAttributes = [];
-      });
-      describe('and attributes', () => {
-        describe('are empty', () => {
-          attributes = [];
-          it('should return true', () => {
-            expect(attributesComparator(baseAttributes, attributes))
-              .toBe(true);
-          });
-        });
-        describe('have values', () => {
-          attributes = [
-            JSXAttributeMock('foo', 0),
-            JSXAttributeMock('bar', 'baz'),
-          ];
-          it('should return true', () => {
-            expect(attributesComparator(baseAttributes, attributes))
-              .toBe(true);
-          });
-        });
-      });
-    });
-    describe('have values', () => {
-      beforeEach(() => {
-        baseAttributes = [
-          {
-            name: 'biz',
-            value: 1,
-          }, {
-            name: 'fizz',
-            value: 'pop',
-          }, {
-            name: 'fuzz',
-            value: 'lolz',
-          },
-        ];
-      });
-      describe('and attributes', () => {
-        describe('are empty', () => {
-          attributes = [];
-          it('should return false', () => {
-            expect(attributesComparator(baseAttributes, attributes))
-              .toBe(false);
-          });
-        });
-        describe('have values', () => {
-          describe('and the values are the different', () => {
-            it('should return false', () => {
-              attributes = [
-                JSXElementMock(),
-                JSXAttributeMock('biz', 2),
-                JSXAttributeMock('ziff', 'opo'),
-                JSXAttributeMock('far', 'lolz'),
-              ];
-              expect(attributesComparator(baseAttributes, attributes))
-                .toBe(false);
-            });
-          });
-          describe('and the values are a subset', () => {
-            it('should return true', () => {
-              attributes = [
-                JSXAttributeMock('biz', 1),
-                JSXAttributeMock('fizz', 'pop'),
-                JSXAttributeMock('goo', 'gazz'),
-              ];
-              expect(attributesComparator(baseAttributes, attributes))
-                .toBe(false);
-            });
-          });
-          describe('and the values are the same', () => {
-            it('should return true', () => {
-              attributes = [
-                JSXAttributeMock('biz', 1),
-                JSXAttributeMock('fizz', 'pop'),
-                JSXAttributeMock('fuzz', 'lolz'),
-              ];
-              expect(attributesComparator(baseAttributes, attributes))
-                .toBe(true);
-            });
-          });
-          describe('and the values are a superset', () => {
-            it('should return true', () => {
-              attributes = [
-                JSXAttributeMock('biz', 1),
-                JSXAttributeMock('fizz', 'pop'),
-                JSXAttributeMock('fuzz', 'lolz'),
-                JSXAttributeMock('dar', 'tee'),
-              ];
-              expect(attributesComparator(baseAttributes, attributes))
-                .toBe(true);
-            });
-          });
-        });
-      });
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getComputedRole-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getComputedRole-test.js
deleted file mode 100644
index f1518a1..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getComputedRole-test.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/* eslint-env jest */
-import getComputedRole from '../../../src/util/getComputedRole';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-
-describe('getComputedRole', () => {
-  describe('explicit role', () => {
-    describe('valid role', () => {
-      it('should return the role', () => {
-        expect(getComputedRole(
-          'div',
-          [JSXAttributeMock('role', 'button')],
-        )).toBe('button');
-      });
-    });
-    describe('invalid role', () => {
-      describe('has implicit', () => {
-        it('should return the implicit role', () => {
-          expect(getComputedRole(
-            'li',
-            [JSXAttributeMock('role', 'beeswax')],
-          )).toBe('listitem');
-        });
-      });
-      describe('lacks implicit', () => {
-        it('should return null', () => {
-          expect(getComputedRole(
-            'div',
-            [JSXAttributeMock('role', 'beeswax')],
-          )).toBeNull();
-        });
-      });
-    });
-
-    describe('no role', () => {
-      describe('has implicit', () => {
-        it('should return the implicit role', () => {
-          expect(getComputedRole(
-            'li',
-            [],
-          )).toBe('listitem');
-        });
-      });
-      describe('lacks implicit', () => {
-        it('should return null', () => {
-          expect(getComputedRole(
-            'div',
-            [],
-          )).toBeNull();
-        });
-      });
-    });
-  });
-  describe('implicit role', () => {
-    describe('has implicit', () => {
-      it('should return the implicit role', () => {
-        expect(getComputedRole(
-          'li',
-          [JSXAttributeMock('role', 'beeswax')],
-        )).toBe('listitem');
-      });
-    });
-    describe('lacks implicit', () => {
-      it('should return null', () => {
-        expect(getComputedRole(
-          'div',
-          [],
-        )).toBeNull();
-      });
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getExplicitRole-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getExplicitRole-test.js
deleted file mode 100644
index 83c4ef2..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getExplicitRole-test.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/* eslint-env jest */
-import getExplicitRole from '../../../src/util/getExplicitRole';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-
-describe('getExplicitRole', () => {
-  describe('valid role', () => {
-    it('should return the role', () => {
-      expect(getExplicitRole(
-        'div',
-        [JSXAttributeMock('role', 'button')],
-      )).toBe('button');
-    });
-  });
-  describe('invalid role', () => {
-    it('should return null', () => {
-      expect(getExplicitRole(
-        'div',
-        [JSXAttributeMock('role', 'beeswax')],
-      )).toBeNull();
-    });
-  });
-  describe('no role', () => {
-    it('should return null', () => {
-      expect(getExplicitRole(
-        'div',
-        [],
-      )).toBeNull();
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getImplicitRole-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getImplicitRole-test.js
deleted file mode 100644
index 2a4a9e2..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getImplicitRole-test.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/* eslint-env jest */
-import getImplicitRole from '../../../src/util/getImplicitRole';
-
-describe('getImplicitRole', () => {
-  describe('has implicit', () => {
-    it('should return the implicit role', () => {
-      expect(getImplicitRole(
-        'li',
-        [],
-      )).toBe('listitem');
-    });
-  });
-  describe('lacks implicit', () => {
-    it('should return null', () => {
-      expect(getImplicitRole(
-        'div',
-        [],
-      )).toBeNull();
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getSuggestion-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getSuggestion-test.js
deleted file mode 100644
index 6bc2073..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getSuggestion-test.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/* eslint-env jest */
-import assert from 'assert';
-import getSuggestion from '../../../src/util/getSuggestion';
-
-describe('spell check suggestion API', () => {
-  it('should return no suggestions given empty word and no dictionary', () => {
-    const word = '';
-    const expected = [];
-    const actual = getSuggestion(word);
-
-    assert.deepEqual(expected, actual);
-  });
-
-  it('should return no suggestions given real word and no dictionary', () => {
-    const word = 'foo';
-    const expected = [];
-    const actual = getSuggestion(word);
-
-    assert.deepEqual(expected, actual);
-  });
-
-  it('should return correct suggestion given real word and a dictionary', () => {
-    const word = 'fo';
-    const dictionary = ['foo', 'bar', 'baz'];
-    const expected = ['foo'];
-    const actual = getSuggestion(word, dictionary);
-
-    assert.deepEqual(expected, actual);
-  });
-
-  it('should return multiple correct suggestions given real word and a dictionary', () => {
-    const word = 'theer';
-    const dictionary = ['there', 'their', 'foo', 'bar'];
-    const expected = ['there', 'their'];
-    const actual = getSuggestion(word, dictionary);
-
-    assert.deepEqual(expected, actual);
-  });
-
-  it('should return correct # of suggestions given the limit argument', () => {
-    const word = 'theer';
-    const dictionary = ['there', 'their', 'foo', 'bar'];
-    const limit = 1;
-    const expected = 1;
-    const actual = getSuggestion(word, dictionary, limit).length;
-
-    assert.deepEqual(expected, actual);
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getTabIndex-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getTabIndex-test.js
deleted file mode 100644
index 792fe33..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/getTabIndex-test.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/* eslint-env jest */
-import getTabIndex from '../../../src/util/getTabIndex';
-import IdentifierMock from '../../../__mocks__/IdentifierMock';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-
-describe('getTabIndex', () => {
-  describe('tabIndex is defined', () => {
-    describe('as a number ', () => {
-      describe('zero', () => {
-        it('should return zero', () => {
-          expect(getTabIndex(JSXAttributeMock('tabIndex', 0))).toBe(0);
-        });
-      });
-      describe('positive integer', () => {
-        it('should return the integer', () => {
-          expect(getTabIndex(JSXAttributeMock('tabIndex', 1))).toBe(1);
-        });
-      });
-      describe('negative integer', () => {
-        it('should return the integer', () => {
-          expect(getTabIndex(JSXAttributeMock('tabIndex', -1))).toBe(-1);
-        });
-      });
-      describe('float', () => {
-        it('should return undefined', () => {
-          expect(getTabIndex(JSXAttributeMock('tabIndex', 9.1))).toBeUndefined();
-        });
-      });
-    });
-    describe('as a string', () => {
-      describe('empty', () => {
-        it('should return undefined', () => {
-          expect(getTabIndex(JSXAttributeMock('tabIndex', ''))).toBeUndefined();
-        });
-      });
-      describe('which converts to a number', () => {
-        it('should return an integer', () => {
-          expect(getTabIndex(JSXAttributeMock('tabIndex', '0'))).toBe(0);
-        });
-      });
-      describe('which is NaN', () => {
-        it('should return undefined', () => {
-          expect(getTabIndex(JSXAttributeMock('tabIndex', '0a'))).toBeUndefined();
-        });
-      });
-    });
-    describe('as a boolean', () => {
-      describe('true', () => {
-        it('should return undefined', () => {
-          expect(getTabIndex(JSXAttributeMock('tabIndex', true))).toBeUndefined();
-        });
-      });
-      describe('false', () => {
-        it('should return undefined', () => {
-          expect(getTabIndex(JSXAttributeMock('tabIndex', false))).toBeUndefined();
-        });
-      });
-    });
-    describe('as an expression', () => {
-      describe('function expression', () => {
-        it('should return the correct type', () => {
-          const attr = function mockFn() { return 0; };
-          expect(typeof getTabIndex(JSXAttributeMock('tabIndex', attr))).toEqual('function');
-        });
-      });
-      describe('variable expression', () => {
-        it('should return the Identifier name', () => {
-          const name = 'identName';
-          expect(getTabIndex(JSXAttributeMock(
-            'tabIndex',
-            IdentifierMock(name),
-            true,
-          ))).toEqual(name);
-        });
-      });
-    });
-  });
-  describe('tabIndex is not defined', () => {
-    it('should return undefined', () => {
-      expect(getTabIndex(JSXAttributeMock('tabIndex', undefined))).toBeUndefined();
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/hasAccessibleChild-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/hasAccessibleChild-test.js
deleted file mode 100644
index 60d26d2..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/hasAccessibleChild-test.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/* eslint-env jest */
-import hasAccessibleChild from '../../../src/util/hasAccessibleChild';
-import JSXElementMock from '../../../__mocks__/JSXElementMock';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-import JSXExpressionContainerMock from '../../../__mocks__/JSXExpressionContainerMock';
-
-describe('hasAccessibleChild', () => {
-  describe('has no children and does not set dangerouslySetInnerHTML', () => {
-    it('returns false', () => {
-      expect(hasAccessibleChild(JSXElementMock('div', []))).toBe(false);
-    });
-  });
-
-
-  describe('has no children and sets dangerouslySetInnerHTML', () => {
-    it('Returns true', () => {
-      const prop = JSXAttributeMock('dangerouslySetInnerHTML', true);
-      const element = JSXElementMock('div', [prop], []);
-      expect(hasAccessibleChild(element)).toBe(true);
-    });
-  });
-
-  describe('has children', () => {
-    it('Returns true for a Literal child', () => {
-      const child = {
-        type: 'Literal',
-        value: 'foo',
-      };
-      const element = JSXElementMock('div', [], [child]);
-      expect(hasAccessibleChild(element)).toBe(true);
-    });
-
-    it('Returns true for visible child JSXElement', () => {
-      const child = JSXElementMock('div', []);
-      const element = JSXElementMock('div', [], [child]);
-      expect(hasAccessibleChild(element)).toBe(true);
-    });
-
-    it('Returns true for JSXText Element', () => {
-      const child = {
-        type: 'JSXText',
-        value: 'foo',
-      };
-      const element = JSXElementMock('div', [], [child]);
-      expect(hasAccessibleChild(element)).toBe(true);
-    });
-
-    it('Returns false for hidden child JSXElement', () => {
-      const ariaHiddenAttr = JSXAttributeMock('aria-hidden', true);
-      const child = JSXElementMock('div', [ariaHiddenAttr]);
-      const element = JSXElementMock('div', [], [child]);
-      expect(hasAccessibleChild(element)).toBe(false);
-    });
-
-    it('Returns true for defined JSXExpressionContainer', () => {
-      const expression = {
-        type: 'Identifier',
-        name: 'foo',
-      };
-      const child = JSXExpressionContainerMock(expression);
-      const element = JSXElementMock('div', [], [child]);
-      expect(hasAccessibleChild(element)).toBe(true);
-    });
-
-    it('Returns false for undefined JSXExpressionContainer', () => {
-      const expression = {
-        type: 'Identifier',
-        name: 'undefined',
-      };
-      const child = JSXExpressionContainerMock(expression);
-      const element = JSXElementMock('div', [], [child]);
-      expect(hasAccessibleChild(element)).toBe(false);
-    });
-
-    it('Returns false for unknown child type', () => {
-      const child = {
-        type: 'Unknown',
-      };
-      const element = JSXElementMock('div', [], [child]);
-      expect(hasAccessibleChild(element)).toBe(false);
-    });
-
-    it('Returns true with children passed as a prop', () => {
-      const children = JSXAttributeMock('children', true);
-      const element = JSXElementMock('div', [children], []);
-      expect(hasAccessibleChild(element)).toBe(true);
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/implicitRoles/input-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/implicitRoles/input-test.js
deleted file mode 100644
index 2f2412b..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/implicitRoles/input-test.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import JSXAttributeMock from '../../../../__mocks__/JSXAttributeMock';
-import getImplicitRoleForInput from '../../../../src/util/implicitRoles/input';
-
-describe('isAbstractRole', () => {
-  it('works for buttons', () => {
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'button')])).toBe('button');
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'image')])).toBe('button');
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'reset')])).toBe('button');
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'submit')])).toBe('button');
-  });
-  it('works for checkboxes', () => {
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'checkbox')])).toBe('checkbox');
-  });
-  it('works for radios', () => {
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'radio')])).toBe('radio');
-  });
-  it('works for ranges', () => {
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'range')])).toBe('slider');
-  });
-  it('works for textboxes', () => {
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'email')])).toBe('textbox');
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'password')])).toBe('textbox');
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'search')])).toBe('textbox');
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'tel')])).toBe('textbox');
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', 'url')])).toBe('textbox');
-  });
-  it('works for the default case', () => {
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', '')])).toBe('textbox');
-  });
-  it('works for the true case', () => {
-    expect(getImplicitRoleForInput([JSXAttributeMock('type', true)])).toBe('textbox');
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/implicitRoles/menu-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/implicitRoles/menu-test.js
deleted file mode 100644
index ce95128..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/implicitRoles/menu-test.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import JSXAttributeMock from '../../../../__mocks__/JSXAttributeMock';
-import getImplicitRoleForMenu from '../../../../src/util/implicitRoles/menu';
-
-describe('isAbstractRole', () => {
-  it('works for toolbars', () => {
-    expect(getImplicitRoleForMenu([JSXAttributeMock('type', 'toolbar')])).toBe('toolbar');
-  });
-  it('works for non-toolbars', () => {
-    expect(getImplicitRoleForMenu([JSXAttributeMock('type', '')])).toBe('');
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/implicitRoles/menuitem-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/implicitRoles/menuitem-test.js
deleted file mode 100644
index c0c9f47..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/implicitRoles/menuitem-test.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import JSXAttributeMock from '../../../../__mocks__/JSXAttributeMock';
-import getImplicitRoleForMenuitem from '../../../../src/util/implicitRoles/menuitem';
-
-describe('isAbstractRole', () => {
-  it('works for menu items', () => {
-    expect(getImplicitRoleForMenuitem([JSXAttributeMock('type', 'command')])).toBe('menuitem');
-  });
-  it('works for menu item checkboxes', () => {
-    expect(getImplicitRoleForMenuitem([JSXAttributeMock('type', 'checkbox')])).toBe('menuitemcheckbox');
-  });
-  it('works for menu item radios', () => {
-    expect(getImplicitRoleForMenuitem([JSXAttributeMock('type', 'radio')])).toBe('menuitemradio');
-  });
-  it('works for non-toolbars', () => {
-    expect(getImplicitRoleForMenuitem([JSXAttributeMock('type', '')])).toBe('');
-  });
-  it('works for the true case', () => {
-    expect(getImplicitRoleForMenuitem([JSXAttributeMock('type', true)])).toBe('');
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isAbstractRole-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isAbstractRole-test.js
deleted file mode 100644
index 5b07509..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isAbstractRole-test.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import { elementType } from 'jsx-ast-utils';
-import isAbstractRole from '../../../src/util/isAbstractRole';
-import {
-  genElementSymbol,
-  genAbstractRoleElements,
-  genNonAbstractRoleElements,
-} from '../../../__mocks__/genInteractives';
-
-describe('isAbstractRole', () => {
-  describe('JSX Components (no tagName)', () => {
-    it('should NOT identify them as abstract role elements', () => {
-      expect(isAbstractRole(undefined, []))
-        .toBe(false);
-    });
-  });
-  describe('elements with an abstract role', () => {
-    genAbstractRoleElements().forEach(({ openingElement }) => {
-      const { attributes } = openingElement;
-      it(`should identify \`${genElementSymbol(openingElement)}\` as an abstract role element`, () => {
-        expect(isAbstractRole(
-          elementType(openingElement),
-          attributes,
-        )).toBe(true);
-      });
-    });
-  });
-  describe('elements with a non-abstract role', () => {
-    genNonAbstractRoleElements().forEach(({ openingElement }) => {
-      const { attributes } = openingElement;
-      it(`should NOT identify \`${genElementSymbol(openingElement)}\` as an abstract role element`, () => {
-        expect(isAbstractRole(
-          elementType(openingElement),
-          attributes,
-        )).toBe(false);
-      });
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isDOMElement-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isDOMElement-test.js
deleted file mode 100644
index 5f21831..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isDOMElement-test.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/* eslint-env mocha */
-import { dom } from 'aria-query';
-import expect from 'expect';
-import { elementType } from 'jsx-ast-utils';
-import isDOMElement from '../../../src/util/isDOMElement';
-import JSXElementMock from '../../../__mocks__/JSXElementMock';
-
-const domElements = [...dom.keys()];
-
-describe('isDOMElement', () => {
-  describe('DOM elements', () => {
-    domElements.forEach((el) => {
-      it(`should identify ${el} as a DOM element`, () => {
-        const element = JSXElementMock(el);
-        expect(isDOMElement(elementType(element.openingElement)))
-          .toBe(true);
-      });
-    });
-  });
-  describe('Custom Element', () => {
-    it('should not identify a custom element', () => {
-      const element = JSXElementMock('CustomElement');
-      expect(isDOMElement(element))
-        .toBe(false);
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isDisabledElement-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isDisabledElement-test.js
deleted file mode 100644
index e0ef79e..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isDisabledElement-test.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import isDisabledElement from '../../../src/util/isDisabledElement';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-
-describe('isDisabledElement', () => {
-  describe('HTML5', () => {
-    describe('disabled', () => {
-      it('should identify HTML5 disabled elements', () => {
-        const attributes = [
-          JSXAttributeMock('disabled', 'disabled'),
-        ];
-        expect(isDisabledElement(attributes))
-          .toBe(true);
-      });
-    });
-    describe('not disabled', () => {
-      it('should identify HTML5 disabled elements with null as the value', () => {
-        const attributes = [
-          JSXAttributeMock('disabled', null),
-        ];
-        expect(isDisabledElement(attributes))
-          .toBe(true);
-      });
-      it('should not identify HTML5 disabled elements with undefined as the value', () => {
-        const attributes = [
-          JSXAttributeMock('disabled', undefined),
-        ];
-        expect(isDisabledElement(attributes))
-          .toBe(false);
-      });
-    });
-  });
-  describe('ARIA', () => {
-    describe('disabled', () => {
-      it('should not identify ARIA disabled elements', () => {
-        const attributes = [
-          JSXAttributeMock('aria-disabled', 'true'),
-        ];
-        expect(isDisabledElement(attributes))
-          .toBe(true);
-      });
-      it('should not identify ARIA disabled elements', () => {
-        const attributes = [
-          JSXAttributeMock('aria-disabled', true),
-        ];
-        expect(isDisabledElement(attributes))
-          .toBe(true);
-      });
-    });
-    describe('not disabled', () => {
-      it('should not identify ARIA disabled elements', () => {
-        const attributes = [
-          JSXAttributeMock('aria-disabled', 'false'),
-        ];
-        expect(isDisabledElement(attributes))
-          .toBe(false);
-      });
-      it('should not identify ARIA disabled elements', () => {
-        const attributes = [
-          JSXAttributeMock('aria-disabled', false),
-        ];
-        expect(isDisabledElement(attributes))
-          .toBe(false);
-      });
-      it('should not identify ARIA disabled elements with null as the value', () => {
-        const attributes = [
-          JSXAttributeMock('aria-disabled', null),
-        ];
-        expect(isDisabledElement(attributes))
-          .toBe(false);
-      });
-      it('should not identify ARIA disabled elements with undefined as the value', () => {
-        const attributes = [
-          JSXAttributeMock('aria-disabled', undefined),
-        ];
-        expect(isDisabledElement(attributes))
-          .toBe(false);
-      });
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isInteractiveElement-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isInteractiveElement-test.js
deleted file mode 100644
index 559fc07..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isInteractiveElement-test.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import { elementType } from 'jsx-ast-utils';
-import isInteractiveElement from '../../../src/util/isInteractiveElement';
-import JSXElementMock from '../../../__mocks__/JSXElementMock';
-import {
-  genElementSymbol,
-  genIndeterminantInteractiveElements,
-  genInteractiveElements,
-  genInteractiveRoleElements,
-  genNonInteractiveElements,
-  genNonInteractiveRoleElements,
-} from '../../../__mocks__/genInteractives';
-
-describe('isInteractiveElement', () => {
-  describe('JSX Components (no tagName)', () => {
-    it('should identify them as interactive elements', () => {
-      expect(isInteractiveElement(undefined, []))
-        .toBe(false);
-    });
-  });
-  describe('interactive elements', () => {
-    genInteractiveElements().forEach(({ openingElement }) => {
-      it(`should identify \`${genElementSymbol(openingElement)}\` as an interactive element`, () => {
-        expect(isInteractiveElement(
-          elementType(openingElement),
-          openingElement.attributes,
-        )).toBe(true);
-      });
-    });
-  });
-  describe('interactive role elements', () => {
-    genInteractiveRoleElements().forEach(({ openingElement }) => {
-      it(`should NOT identify \`${genElementSymbol(openingElement)}\` as an interactive element`, () => {
-        expect(isInteractiveElement(
-          elementType(openingElement),
-          openingElement.attributes,
-        )).toBe(false);
-      });
-    });
-  });
-  describe('non-interactive elements', () => {
-    genNonInteractiveElements().forEach(({ openingElement }) => {
-      it(`should NOT identify \`${genElementSymbol(openingElement)}\` as an interactive element`, () => {
-        expect(isInteractiveElement(
-          elementType(openingElement),
-          openingElement.attributes,
-        )).toBe(false);
-      });
-    });
-  });
-  describe('non-interactive role elements', () => {
-    genNonInteractiveRoleElements().forEach(({ openingElement }) => {
-      it(`should NOT identify \`${genElementSymbol(openingElement)}\` as an interactive element`, () => {
-        expect(isInteractiveElement(
-          elementType(openingElement),
-          openingElement.attributes,
-        )).toBe(false);
-      });
-    });
-  });
-  describe('indeterminate elements', () => {
-    genIndeterminantInteractiveElements().forEach(({ openingElement }) => {
-      it(`should NOT identify \`${openingElement.name.name}\` as an interactive element`, () => {
-        expect(isInteractiveElement(
-          elementType(openingElement),
-          openingElement.attributes,
-        )).toBe(false);
-      });
-    });
-  });
-  describe('JSX elements', () => {
-    it('is not interactive', () => {
-      expect(isInteractiveElement('CustomComponent', JSXElementMock())).toBe(false);
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isInteractiveRole-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isInteractiveRole-test.js
deleted file mode 100644
index 048f434..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isInteractiveRole-test.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import { elementType } from 'jsx-ast-utils';
-import isInteractiveRole from '../../../src/util/isInteractiveRole';
-import {
-  genElementSymbol,
-  genInteractiveRoleElements,
-  genNonInteractiveRoleElements,
-} from '../../../__mocks__/genInteractives';
-
-describe('isInteractiveRole', () => {
-  describe('JSX Components (no tagName)', () => {
-    it('should identify them as interactive role elements', () => {
-      expect(isInteractiveRole(undefined, []))
-        .toBe(false);
-    });
-  });
-  describe('elements with a non-interactive role', () => {
-    genNonInteractiveRoleElements().forEach(({ openingElement }) => {
-      const { attributes } = openingElement;
-      it(`should not identify \`${genElementSymbol(openingElement)}\` as an interactive role element`, () => {
-        expect(isInteractiveRole(
-          elementType(openingElement),
-          attributes,
-        )).toBe(false);
-      });
-    });
-  });
-  describe('elements without a role', () => {
-    it('should not identify them as interactive role elements', () => {
-      expect(isInteractiveRole('div', [])).toBe(false);
-    });
-  });
-  describe('elements with an interactive role', () => {
-    genInteractiveRoleElements().forEach(({ openingElement }) => {
-      const { attributes } = openingElement;
-      it(`should identify \`${genElementSymbol(openingElement)}\` as an interactive role element`, () => {
-        expect(isInteractiveRole(
-          elementType(openingElement),
-          attributes,
-        )).toBe(true);
-      });
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isNonInteractiveElement-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isNonInteractiveElement-test.js
deleted file mode 100644
index ea2fb36..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isNonInteractiveElement-test.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import { elementType } from 'jsx-ast-utils';
-import isNonInteractiveElement from '../../../src/util/isNonInteractiveElement';
-import {
-  genElementSymbol,
-  genIndeterminantInteractiveElements,
-  genInteractiveElements,
-  genInteractiveRoleElements,
-  genNonInteractiveElements,
-  genNonInteractiveRoleElements,
-} from '../../../__mocks__/genInteractives';
-
-describe('isNonInteractiveElement', () => {
-  describe('JSX Components (no tagName)', () => {
-    it('should identify them as interactive elements', () => {
-      expect(isNonInteractiveElement(undefined, []))
-        .toBe(false);
-    });
-  });
-  describe('non-interactive elements', () => {
-    genNonInteractiveElements().forEach(({ openingElement }) => {
-      it(`should identify \`${genElementSymbol(openingElement)}\` as a non-interactive element`, () => {
-        expect(isNonInteractiveElement(
-          elementType(openingElement),
-          openingElement.attributes,
-        )).toBe(true);
-      });
-    });
-  });
-  describe('non-interactive role elements', () => {
-    genNonInteractiveRoleElements().forEach(({ openingElement }) => {
-      it(`should NOT identify \`${genElementSymbol(openingElement)}\` as a non-interactive element`, () => {
-        expect(isNonInteractiveElement(
-          elementType(openingElement),
-          openingElement.attributes,
-        )).toBe(false);
-      });
-    });
-  });
-  describe('interactive elements', () => {
-    genInteractiveElements().forEach(({ openingElement }) => {
-      it(`should NOT identify \`${genElementSymbol(openingElement)}\` as a non-interactive element`, () => {
-        expect(isNonInteractiveElement(
-          elementType(openingElement),
-          openingElement.attributes,
-        )).toBe(false);
-      });
-    });
-  });
-  describe('interactive role elements', () => {
-    genInteractiveRoleElements().forEach(({ openingElement }) => {
-      it(`should NOT identify \`${genElementSymbol(openingElement)}\` as a non-interactive element`, () => {
-        expect(isNonInteractiveElement(
-          elementType(openingElement),
-          openingElement.attributes,
-        )).toBe(false);
-      });
-    });
-  });
-  describe('indeterminate elements', () => {
-    genIndeterminantInteractiveElements().forEach(({ openingElement }) => {
-      it(`should NOT identify \`${openingElement.name.name}\` as a non-interactive element`, () => {
-        expect(isNonInteractiveElement(
-          elementType(openingElement),
-          openingElement.attributes,
-        )).toBe(false);
-      });
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isNonInteractiveRole-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isNonInteractiveRole-test.js
deleted file mode 100644
index 4d241da..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isNonInteractiveRole-test.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import { elementType } from 'jsx-ast-utils';
-import isNonInteractiveRole from '../../../src/util/isNonInteractiveRole';
-import {
-  genElementSymbol,
-  genInteractiveRoleElements,
-  genNonInteractiveRoleElements,
-} from '../../../__mocks__/genInteractives';
-
-describe('isNonInteractiveRole', () => {
-  describe('JSX Components (no tagName)', () => {
-    it('should identify them as interactive role elements', () => {
-      expect(isNonInteractiveRole(undefined, []))
-        .toBe(false);
-    });
-  });
-  describe('elements with a non-interactive role', () => {
-    genNonInteractiveRoleElements().forEach(({ openingElement }) => {
-      const { attributes } = openingElement;
-      it(`should identify \`${genElementSymbol(openingElement)}\` as non-interactive role element`, () => {
-        expect(isNonInteractiveRole(
-          elementType(openingElement),
-          attributes,
-        )).toBe(true);
-      });
-    });
-  });
-  describe('elements without a role', () => {
-    it('should not identify them as non-interactive role elements', () => {
-      expect(isNonInteractiveRole('div', [])).toBe(false);
-    });
-  });
-  describe('elements with an interactive role', () => {
-    genInteractiveRoleElements().forEach(({ openingElement }) => {
-      const { attributes } = openingElement;
-      it(`should NOT identify \`${genElementSymbol(openingElement)}\` as a non-interactive role element`, () => {
-        expect(isNonInteractiveRole(
-          elementType(openingElement),
-          attributes,
-        )).toBe(false);
-      });
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isNonLiteralProperty-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isNonLiteralProperty-test.js
deleted file mode 100644
index e2f821d..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isNonLiteralProperty-test.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import isNonLiteralProperty from '../../../src/util/isNonLiteralProperty';
-import IdentifierMock from '../../../__mocks__/IdentifierMock';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-import JSXSpreadAttributeMock from '../../../__mocks__/JSXSpreadAttributeMock';
-import JSXTextMock from '../../../__mocks__/JSXTextMock';
-import LiteralMock from '../../../__mocks__/LiteralMock';
-
-const theProp = 'theProp';
-
-const spread = JSXSpreadAttributeMock('theSpread');
-
-describe('isNonLiteralProperty', () => {
-  describe('elements without the property', () => {
-    it('should not identify them as non-literal role elements', () => {
-      expect(isNonLiteralProperty([], theProp)).toBe(false);
-    });
-  });
-  describe('elements with a literal property', () => {
-    it('should not identify them as non-literal role elements without spread operator', () => {
-      expect(isNonLiteralProperty([JSXAttributeMock(theProp, LiteralMock('theRole'))], theProp)).toBe(false);
-    });
-    it('should not identify them as non-literal role elements with spread operator', () => {
-      expect(isNonLiteralProperty([spread, JSXAttributeMock(theProp, LiteralMock('theRole'))], theProp)).toBe(false);
-    });
-  });
-  describe('elements with a JSXText property', () => {
-    it('should not identify them as non-literal role elements', () => {
-      expect(isNonLiteralProperty([JSXAttributeMock(theProp, JSXTextMock('theRole'))], theProp)).toBe(false);
-    });
-  });
-  describe('elements with a property of undefined', () => {
-    it('should not identify them as non-literal role elements', () => {
-      const undefinedExpression = IdentifierMock('undefined');
-      expect(isNonLiteralProperty([JSXAttributeMock(theProp, undefinedExpression)], theProp)).toBe(false);
-    });
-  });
-  describe('elements with a expression property', () => {
-    it('should identify them as non-literal role elements', () => {
-      const identifierExpression = IdentifierMock('theIdentifier');
-      expect(isNonLiteralProperty([JSXAttributeMock(theProp, identifierExpression)], theProp)).toBe(true);
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isSemanticRoleElement-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isSemanticRoleElement-test.js
deleted file mode 100644
index c12df7a..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/isSemanticRoleElement-test.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import isSemanticRoleElement from '../../../src/util/isSemanticRoleElement';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-
-describe('isSemanticRoleElement', () => {
-  it('should identify semantic role elements', () => {
-    expect(isSemanticRoleElement('input', [
-      JSXAttributeMock('type', 'checkbox'),
-      JSXAttributeMock('role', 'switch'),
-    ])).toBe(true);
-  });
-  it('should reject non-semantic role elements', () => {
-    expect(isSemanticRoleElement('input', [
-      JSXAttributeMock('type', 'radio'),
-      JSXAttributeMock('role', 'switch'),
-    ])).toBe(false);
-    expect(isSemanticRoleElement('input', [
-      JSXAttributeMock('type', 'text'),
-      JSXAttributeMock('role', 'combobox'),
-    ])).toBe(false);
-    expect(isSemanticRoleElement('button', [
-      JSXAttributeMock('role', 'switch'),
-      JSXAttributeMock('aria-pressed', 'true'),
-    ])).toBe(false);
-    expect(isSemanticRoleElement('input', [
-      JSXAttributeMock('role', 'switch'),
-    ])).toBe(false);
-  });
-  it('should not throw on JSXSpreadAttribute', () => {
-    expect(() => {
-      isSemanticRoleElement('input', [
-        JSXAttributeMock('type', 'checkbox'),
-        JSXAttributeMock('role', 'checkbox'),
-        JSXAttributeMock('aria-checked', 'false'),
-        JSXAttributeMock('aria-labelledby', 'foo'),
-        JSXAttributeMock('tabindex', '0'),
-        {
-          type: 'JSXSpreadAttribute',
-          argument: {
-            type: 'Identifier',
-            name: 'props',
-          },
-        },
-      ]);
-    }).not.toThrow();
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/mayContainChildComponent-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/mayContainChildComponent-test.js
deleted file mode 100644
index b27eefd..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/mayContainChildComponent-test.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/* eslint-env jest */
-import mayContainChildComponent from '../../../src/util/mayContainChildComponent';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-import JSXElementMock from '../../../__mocks__/JSXElementMock';
-import JSXExpressionContainerMock from '../../../__mocks__/JSXExpressionContainerMock';
-
-describe('mayContainChildComponent', () => {
-  describe('no FancyComponent', () => {
-    it('should return false', () => {
-      expect(mayContainChildComponent(
-        JSXElementMock('div', [], [
-          JSXElementMock('div', [], [
-            JSXElementMock('span', [], []),
-            JSXElementMock('span', [], [
-              JSXElementMock('span', [], []),
-              JSXElementMock('span', [], [
-                JSXElementMock('span', [], []),
-              ]),
-            ]),
-          ]),
-          JSXElementMock('span', [], []),
-          JSXElementMock('img', [
-            JSXAttributeMock('src', 'some/path'),
-          ]),
-        ]),
-        'FancyComponent',
-        5,
-      )).toBe(false);
-    });
-  });
-  describe('contains an indicated component', () => {
-    it('should return true', () => {
-      expect(mayContainChildComponent(
-        JSXElementMock('div', [], [
-          JSXElementMock('input'),
-        ]),
-        'input',
-      )).toBe(true);
-    });
-    it('should return true', () => {
-      expect(mayContainChildComponent(
-        JSXElementMock('div', [], [
-          JSXElementMock('FancyComponent'),
-        ]),
-        'FancyComponent',
-      )).toBe(true);
-    });
-    it('FancyComponent is outside of default depth, should return false', () => {
-      expect(mayContainChildComponent(
-        JSXElementMock('div', [], [
-          JSXElementMock('div', [], [
-            JSXElementMock('FancyComponent'),
-          ]),
-        ]),
-        'FancyComponent',
-      )).toBe(false);
-    });
-    it('FancyComponent is inside of custom depth, should return true', () => {
-      expect(mayContainChildComponent(
-        JSXElementMock('div', [], [
-          JSXElementMock('div', [], [
-            JSXElementMock('FancyComponent'),
-          ]),
-        ]),
-        'FancyComponent',
-        2,
-      )).toBe(true);
-    });
-    it('deep nesting, should return true', () => {
-      expect(mayContainChildComponent(
-        JSXElementMock('div', [], [
-          JSXElementMock('div', [], [
-            JSXElementMock('span', [], []),
-            JSXElementMock('span', [], [
-              JSXElementMock('span', [], []),
-              JSXElementMock('span', [], [
-                JSXElementMock('span', [], [
-                  JSXElementMock('span', [], [
-                    JSXElementMock('FancyComponent'),
-                  ]),
-                ]),
-              ]),
-            ]),
-          ]),
-          JSXElementMock('span', [], []),
-          JSXElementMock('img', [
-            JSXAttributeMock('src', 'some/path'),
-          ]),
-        ]),
-        'FancyComponent',
-        6,
-      )).toBe(true);
-    });
-  });
-  describe('Intederminate situations', () => {
-    describe('expression container children', () => {
-      it('should return true', () => {
-        expect(mayContainChildComponent(
-          JSXElementMock('div', [], [
-            JSXExpressionContainerMock('mysteryBox'),
-          ]),
-          'FancyComponent',
-        )).toBe(true);
-      });
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/mayHaveAccessibleLabel-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/mayHaveAccessibleLabel-test.js
deleted file mode 100644
index f4b1553..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/mayHaveAccessibleLabel-test.js
+++ /dev/null
@@ -1,170 +0,0 @@
-/* eslint-env jest */
-import mayHaveAccessibleLabel from '../../../src/util/mayHaveAccessibleLabel';
-import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
-import JSXElementMock from '../../../__mocks__/JSXElementMock';
-import JSXExpressionContainerMock from '../../../__mocks__/JSXExpressionContainerMock';
-import JSXSpreadAttributeMock from '../../../__mocks__/JSXSpreadAttributeMock';
-import JSXTextMock from '../../../__mocks__/JSXTextMock';
-import LiteralMock from '../../../__mocks__/LiteralMock';
-
-describe('mayHaveAccessibleLabel', () => {
-  describe('no label', () => {
-    it('should return false', () => {
-      expect(mayHaveAccessibleLabel(
-        JSXElementMock('div', [], [
-          JSXElementMock('div', [], [
-            JSXElementMock('span', [], []),
-            JSXElementMock('span', [], [
-              JSXElementMock('span', [], []),
-              JSXElementMock('span', [], [
-                JSXElementMock('span', [], []),
-              ]),
-            ]),
-          ]),
-          JSXElementMock('span', [], []),
-          JSXElementMock('img', [
-            JSXAttributeMock('src', 'some/path'),
-          ]),
-        ]),
-        5,
-      )).toBe(false);
-    });
-  });
-  describe('label via attributes', () => {
-    it('aria-label, should return true', () => {
-      expect(mayHaveAccessibleLabel(JSXElementMock('div', [
-        JSXAttributeMock('aria-label', 'A delicate label'),
-      ], []))).toBe(true);
-    });
-    it('aria-label without content, should return false', () => {
-      expect(mayHaveAccessibleLabel(JSXElementMock('div', [
-        JSXAttributeMock('aria-label', ''),
-      ], []))).toBe(false);
-    });
-    it('aria-labelledby, should return true', () => {
-      expect(mayHaveAccessibleLabel(JSXElementMock('div', [
-        JSXAttributeMock('aria-labelledby', 'elementId'),
-      ], []))).toBe(true);
-    });
-    it('aria-labelledby without content, should return false', () => {
-      expect(mayHaveAccessibleLabel(JSXElementMock('div', [
-        JSXAttributeMock('aria-labelledby', ''),
-      ], []))).toBe(false);
-    });
-    it('aria-labelledby with an expression container, should return true', () => {
-      expect(mayHaveAccessibleLabel(JSXElementMock('div', [
-        JSXAttributeMock('aria-labelledby', 'elementId', true),
-      ], []))).toBe(true);
-    });
-  });
-  describe('label via custom label attribute', () => {
-    let customLabelProp;
-    beforeEach(() => {
-      customLabelProp = 'cowbell';
-    });
-    it('aria-label, should return true', () => {
-      expect(mayHaveAccessibleLabel(
-        JSXElementMock('div', [
-          JSXAttributeMock(customLabelProp, 'A delicate label'),
-        ], []),
-        1,
-        [customLabelProp],
-      )).toBe(true);
-    });
-  });
-  describe('text label', () => {
-    it('Literal text, should return true', () => {
-      expect(mayHaveAccessibleLabel(JSXElementMock('div', [], [
-        LiteralMock('A fancy label'),
-      ]))).toBe(true);
-    });
-    it('JSXText, should return true', () => {
-      expect(mayHaveAccessibleLabel(JSXElementMock('div', [], [
-        JSXTextMock('A fancy label'),
-      ]))).toBe(true);
-    });
-    it('label is outside of default depth, should return false', () => {
-      expect(mayHaveAccessibleLabel(JSXElementMock('div', [], [
-        JSXElementMock('div', [], [
-          JSXTextMock('A fancy label'),
-        ]),
-      ]))).toBe(false);
-    });
-    it('label is inside of custom depth, should return true', () => {
-      expect(mayHaveAccessibleLabel(
-        JSXElementMock('div', [], [
-          JSXElementMock('div', [], [
-            JSXTextMock('A fancy label'),
-          ]),
-        ]),
-        2,
-      )).toBe(true);
-    });
-    it('deep nesting, should return true', () => {
-      expect(mayHaveAccessibleLabel(
-        JSXElementMock('div', [], [
-          JSXElementMock('div', [], [
-            JSXElementMock('span', [], []),
-            JSXElementMock('span', [], [
-              JSXElementMock('span', [], []),
-              JSXElementMock('span', [], [
-                JSXElementMock('span', [], [
-                  JSXElementMock('span', [], [
-                    JSXTextMock('A fancy label'),
-                  ]),
-                ]),
-              ]),
-            ]),
-          ]),
-          JSXElementMock('span', [], []),
-          JSXElementMock('img', [
-            JSXAttributeMock('src', 'some/path'),
-          ]),
-        ]),
-        6,
-      )).toBe(true);
-    });
-  });
-  describe('image content', () => {
-    it('without alt, should return true', () => {
-      expect(mayHaveAccessibleLabel(JSXElementMock('div', [], [
-        JSXElementMock('img', [
-          JSXAttributeMock('src', 'some/path'),
-        ]),
-      ]))).toBe(false);
-    });
-    it('with alt, should return true', () => {
-      expect(mayHaveAccessibleLabel(JSXElementMock('div', [], [
-        JSXElementMock('img', [
-          JSXAttributeMock('src', 'some/path'),
-          JSXAttributeMock('alt', 'A sensible label'),
-        ]),
-      ]))).toBe(true);
-    });
-    it('with aria-label, should return true', () => {
-      expect(mayHaveAccessibleLabel(JSXElementMock('div', [], [
-        JSXElementMock('img', [
-          JSXAttributeMock('src', 'some/path'),
-          JSXAttributeMock('aria-label', 'A sensible label'),
-        ]),
-      ]))).toBe(true);
-    });
-  });
-  describe('Intederminate situations', () => {
-    describe('expression container children', () => {
-      it('should return true', () => {
-        expect(mayHaveAccessibleLabel(JSXElementMock('div', [], [
-          JSXExpressionContainerMock('mysteryBox'),
-        ]))).toBe(true);
-      });
-    });
-    describe('spread operator in attributes', () => {
-      it('should return true', () => {
-        expect(mayHaveAccessibleLabel(JSXElementMock('div', [
-          JSXAttributeMock('style', 'some-junk'),
-          JSXSpreadAttributeMock('props'),
-        ], []))).toBe(true);
-      });
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/parserOptionsMapper-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/parserOptionsMapper-test.js
deleted file mode 100644
index 178a104..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/parserOptionsMapper-test.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* eslint-env mocha */
-import expect from 'expect';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-
-describe('parserOptionsMapper', () => {
-  it('should return an test case object', () => {
-    const testCase = {
-      code: '<div />',
-      errors: [],
-      options: {},
-    };
-    expect(parserOptionsMapper(testCase)).toEqual({
-      code: '<div />',
-      errors: [],
-      options: {},
-      parserOptions: {
-        ecmaVersion: 2018,
-        ecmaFeatures: {
-          experimentalObjectRestSpread: true,
-          jsx: true,
-        },
-      },
-    });
-  });
-  it('should allow for overriding parserOptions', () => {
-    const testCase = {
-      code: '<div />',
-      errors: [],
-      options: {},
-      parserOptions: {
-        ecmaVersion: 5,
-      },
-    };
-    expect(parserOptionsMapper(testCase)).toEqual({
-      code: '<div />',
-      errors: [],
-      options: {},
-      parserOptions: {
-        ecmaVersion: 5,
-        ecmaFeatures: {
-          experimentalObjectRestSpread: true,
-          jsx: true,
-        },
-      },
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/schemas-test.js b/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/schemas-test.js
deleted file mode 100644
index 12b5e29..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/__tests__/src/util/schemas-test.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/* eslint-env jest */
-import assert from 'assert';
-import { generateObjSchema, arraySchema, enumArraySchema } from '../../../src/util/schemas';
-
-describe('schemas', () => {
-  it('should generate an object schema with correct properties', () => {
-    const schema = generateObjSchema({
-      foo: 'bar',
-      baz: arraySchema,
-    });
-    const properties = schema.properties || {};
-
-    assert.deepEqual(properties.foo, 'bar');
-    assert.deepEqual(properties.baz.type, 'array');
-  });
-  describe('enumArraySchema', () => {
-    it('works with no arguments', () => {
-      assert.deepEqual(enumArraySchema(), {
-        additionalItems: false,
-        items: {
-          enum: [],
-          type: 'string',
-        },
-        minItems: 0,
-        type: 'array',
-        uniqueItems: true,
-      });
-    });
-  });
-});
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/accessible-emoji.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/accessible-emoji.md
deleted file mode 100644
index ba55f4e..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/accessible-emoji.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# accessible-emoji
-
-Emoji have become a common way of communicating content to the end user. To a person using a screenreader, however, he/she may not be aware that this content is there at all. By wrapping the emoji in a `<span>`, giving it the `role="img"`, and providing a useful description in `aria-label`, the screenreader will treat the emoji as an image in the accessibility tree with an accessible name for the end user.
-
-#### Resources
-1. [Léonie Watson](http://tink.uk/accessible-emoji/)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<span role="img" aria-label="Snowman">&#9731;</span>
-<span role="img" aria-label="Panda">🐼</span>
-<span role="img" aria-labelledby="panda1">🐼</span>
-```
-
-### Fail
-```jsx
-<span>🐼</span>
-<i role="img" aria-label="Panda">🐼</i>
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/alt-text.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/alt-text.md
deleted file mode 100644
index e86edfc..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/alt-text.md
+++ /dev/null
@@ -1,143 +0,0 @@
-# alt-text
-
-Enforce that all elements that require alternative text have meaningful information to relay back to the end user. This is a critical component of accessibility for screenreader users in order for them to understand the content's purpose on the page. By default, this rule checks for alternative text on the following elements: `<img>`, `<area>`, `<input type="image">`, and `<object>`.
-
-#### Resources
-1. [axe-core, object-alt](https://dequeuniversity.com/rules/axe/3.2/object-alt)
-2. [axe-core, image-alt](https://dequeuniversity.com/rules/axe/3.2/image-alt)
-3. [axe-core, input-image-alt](https://dequeuniversity.com/rules/axe/3.2/input-image-alt)
-4. [axe-core, area-alt](https://dequeuniversity.com/rules/axe/3.2/area-alt)
-
-## How to resolve
-### `<img>`
-An `<img>` must have the `alt` prop set with meaningful text or as an empty string to indicate that it is an image for decoration.
-
-For images that are being used as icons for a button or control, the `alt` prop should be set to an empty string (`alt=""`).
-
-```jsx
-<button>
-  <img src="icon.png" alt="" />
-  Save
-</button>
-```
-The content of an `alt` attribute is used to calculate the accessible label of an element, whereas the text content is used to produce a label for the element. For this reason, adding a label to an icon can produce a confusing or duplicated label on a control that already has appropriate text content.
-
-### `<object>`
-Add alternative text to all embedded `<object>` elements using either inner text, setting the `title` prop, or using the `aria-label` or `aria-labelledby` props.
-
-### `<input type="image">`
-All `<input type="image">` elements must have a non-empty `alt` prop set with a meaningful description of the image or have the `aria-label` or `aria-labelledby` props set.
-
-### `<area>`
-All clickable `<area>` elements within an image map have an `alt`, `aria-label` or `aria-labelledby` prop that describes the purpose of the link.
-
-## Rule details
-
-This rule takes one optional object argument of type object:
-
-```json
-{
-    "rules": {
-        "jsx-a11y/alt-text": [ 2, {
-            "elements": [ "img", "object", "area", "input[type=\"image\"]" ],
-            "img": ["Image"],
-            "object": ["Object"],
-            "area": ["Area"],
-            "input[type=\"image\"]": ["InputImage"]
-          }],
-    }
-}
-```
-
-The `elements` option is a whitelist for DOM elements to check for alternative text. If an element is removed from the default set of elements (noted above), any custom components for that component will also be ignored. In order to indicate any custom wrapper components that should be checked, you can map the DOM element to an array of JSX custom components. This is a good use case when you have a wrapper component that simply renders an `img` element, for instance (like in React):
-
-```jsx
-// Image.js
-const Image = props => {
-  const {
-    alt,
-    ...otherProps
-  } = props;
-
-  return (
-    <img alt={alt} {...otherProps} />
-  );
-}
-
-...
-
-// Header.js (for example)
-...
-return (
-  <header>
-    <Image alt="Logo" src="logo.jpg" />
-  </header>
-);
-```
-
-Note that passing props as spread attribute without explicitly the necessary accessibility props defined will cause this rule to fail. Explicitly pass down the set of props needed for rule to pass. Use `Image` component above as a reference for destructuring and applying the prop. **It is a good thing to explicitly pass props that you expect to be passed for self-documentation.** For example:
-
-#### Bad
-```jsx
-function Foo(props) {
-  return <img {...props} />
-}
-```
-
-#### Good
-```jsx
-function Foo({ alt, ...props}) {
-    return <img alt={alt} {...props} />
-}
-
-// OR
-
-function Foo(props) {
-    const {
-        alt,
-        ...otherProps
-    } = props;
-
-   return <img alt={alt} {...otherProps} />
-}
-```
-
-### Succeed
-```jsx
-<img src="foo" alt="Foo eating a sandwich." />
-<img src="foo" alt={"Foo eating a sandwich."} />
-<img src="foo" alt={altText} />
-<img src="foo" alt={`${person} smiling`} />
-<img src="foo" alt="" />
-
-<object aria-label="foo" />
-<object aria-labelledby="id1" />
-<object>Meaningful description</object>
-<object title="An object" />
-
-<area aria-label="foo" />
-<area aria-labelledby="id1" />
-<area alt="This is descriptive!" />
-
-<input type="image" alt="This is descriptive!" />
-<input type="image" aria-label="foo" />
-<input type="image" aria-labelledby="id1" />
-
-```
-
-### Fail
-```jsx
-<img src="foo" />
-<img {...props} />
-<img {...props} alt /> // Has no value
-<img {...props} alt={undefined} /> // Has no value
-<img {...props} alt={`${undefined}`} /> // Has no value
-<img src="foo" role="presentation" /> // Avoid ARIA if it can be achieved without
-<img src="foo" role="none" /> // Avoid ARIA if it can be achieved without
-
-<object {...props} />
-
-<area {...props} />
-
-<input type="image" {...props} />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/anchor-has-content.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/anchor-has-content.md
deleted file mode 100644
index 8a6a1cf..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/anchor-has-content.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# anchor-has-content
-
-Enforce that anchors have content and that the content is accessible to screen readers. Accessible means that it is not hidden using the `aria-hidden` prop. Refer to the references to learn about why this is important.
-
-#### References
-1. [axe-core, link-name](https://dequeuniversity.com/rules/axe/3.2/link-name)
-
-## Rule details
-
-This rule takes one optional object argument of type object:
-
-```json
-{
-    "rules": {
-        "jsx-a11y/anchor-has-content": [ 2, {
-            "components": [ "Anchor" ],
-          }],
-    }
-}
-```
-
-For the `components` option, these strings determine which JSX elements (**always including** `<a>`) should be checked for having content. This is a good use case when you have a wrapper component that simply renders an `a` element (like in React):
-
-```js
-// Anchor.js
-const Anchor = props => {
-  return (
-    <a {...props}>{ props.children }</a>
-  );
-}
-
-...
-
-// CreateAccount.js (for example)
-...
-return (
-  <Anchor>Create Account</Anchor>
-);
-```
-
-
-### Succeed
-```jsx
-<a>Anchor Content!</a>
-<a><TextWrapper /><a>
-<a dangerouslySetInnerHTML={{ __html: 'foo' }} />
-```
-
-### Fail
-```jsx
-<a />
-<a><TextWrapper aria-hidden /></a>
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/anchor-is-valid.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/anchor-is-valid.md
deleted file mode 100644
index afbfb15..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/anchor-is-valid.md
+++ /dev/null
@@ -1,224 +0,0 @@
-# anchor-is-valid
-
-The HTML `<a>` element, with a valid `href` attribute, is formally defined as representing a **hyperlink**. That is, a link between one HTML document and another, or between one location inside an HTML document and another location inside the same document.
-
-In fact, the interactive, underlined `<a>` element has become so synonymous with web navigation that this expectation has become entrenched inside browsers, assistive technologies such as screen readers and in how people generally expect the internet to behave. In short, anchors should navigate.
-
-The use of JavaScript frameworks and libraries, like _React_, has made it very easy to add or subtract functionality from the standard HTML elements. This has led to _anchors_ often being used in applications based on how they look and function instead of what they represent.
-
-Whilst it is possible, for example, to turn the `<a>` element into a fully functional `<button>` element with ARIA, the native user agent implementations of HTML elements are to be preferred over custom ARIA solutions.
-
-## How do I resolve this error?
-
-### Case: I want to perform an action and need a clickable UI element
-
-The native user agent implementations of the `<a>` and `<button>` elements not only differ in how they look and how they act when activated, but also in how the user is expected to interact with them. Both are perfectly clickable when using a mouse, but keyboard users expect `<a>` to activate on `enter` only and `<button>` to activate on _both_ `enter` and `space`.
-
-This is exacerbated by the expectation sighted users have of how _buttons_ and _anchors_ work based on their appearance. Therefore we find that using _anchors_ as _buttons_ can easily create confusion without a relatively complicated ARIA and CSS implementation that only serves to create an element HTML already offers and browsers already implement fully accessibly.
-
-We are aware that sometimes _anchors_ are used instead of _buttons_ to achieve a specific visual design. When using the `<button>` element this can still be achieved with styling but, due to the meaning many people attach to the standard underlined `<a>` due its appearance, please reconsider this in the design.
-
-Consider the following:
-```jsx
-<a href="javascript:void(0)" onClick={foo} >Perform action</a>
-<a href="#" onClick={foo} >Perform action</a>
-<a onClick={foo} >Perform action</a>
-```
-
-All these _anchor_ implementations indicate that the element is only used to execute JavaScript code. All the above should be replaced with:
-```jsx
-<button onClick={foo} >Perform action</button>
-```
-
-### Case: I want navigable links
-
-An `<a>` element without an `href` attribute no longer functions as a hyperlink. That means that it can no longer accept keyboard focus or be clicked on. The documentation for [no-noninteractive-tabindex](no-noninteractive-tabindex.md) explores this further. Preferably use another element (such as `div` or `span`) for display of text.
-
-To properly function as a hyperlink, the `href` attribute should be present and also contain a valid _URL_. _JavaScript_ strings, empty values or using only **#** are not considered valid `href` values.
-
-Valid `href` attributes values are:
-```jsx
-<a href="/some/valid/uri" >Navigate to page</a>
-<a href="/some/valid/uri#top" >Navigate to page and location</a>
-<a href="#top" >Navigate to internal page location</a>
-```
-
-
-### Case: I need the HTML to be interactive, don't I need to use an a tag for that?
-An `<a>` tag is not inherently interactive. Without an href attribute, it really is no different to a `<div>`.
-
-Let's look at an example that is not accessible by all users:
-```jsx
-<a
-  className={'thing'}
-  onMouseEnter={() => this.setState({showSomething: true})}>
-  {label}
-</a>
-```
-
-If you need to create an interface element that the user can click on, consider using a button:
-```jsx
-<button
-  className={'thing'}
-  onClick={() => this.setState({showSomething: true})}>
-  {label}
-</button>
-```
-
-If you want to navigate while providing the user with extra functionality, for example in the `onMouseEnter` event, use an anchor with an `href` attribute containing a URL or path as its value.
-```jsx
-<a
-  href={someValidPath}
-  className={'thing'}
-  onMouseEnter={() => this.setState({showSomething: true})}>
-  {label}
-</a>
-```
-
-If you need to create an interface element that the user can mouse over or mouse out of, consider using a div element. In this case, you may need to apply a role of presentation or an interactive role. Interactive ARIA roles include `button`, `link`, `checkbox`, `menuitem`, `menuitemcheckbox`, `menuitemradio`, `option`, `radio`, `searchbox`, `switch` and `textbox`.
-```jsx
-<div
-  role="menuitem"
-  className={'thing'}
-  onClick={() => this.setState({showSomething: true})}>
-  onMouseEnter={() => this.setState({showSomething: true})}>
-  {label}
-</div>
-```
-
-In the example immediately above an `onClick` event handler was added to provide the same experience mouse users enjoy to keyboard-only and touch-screen users. Never fully rely on mouse events alone to expose functionality.
-
-### Case: I understand the previous cases but still need an element resembling a link that is purely clickable
-
-We recommend, without reserve, that elements resembling anchors should navigate. This will provide a superior user experience to a larger group of users out there.
-
-However, we understand that developers are not always in total control of the visual design of web applications. In cases where it is imperative to provide an element resembling an anchor that purely acts as a click target with no navigation as result, we would like to recommend a compromise.
-
-Again change the element to a `<button>`: 
-
-```jsx
-<button 
-  type="button"
-  className="link-button" 
-  onClick={() => this.setState({showSomething: true})}>
-    Press me, I look like a link
-</button>
-``` 
-
-Then use styling to change its appearance to that of a link:
-
-```css
-.link-button {
-  background-color: transparent;
-  border: none;
-  cursor: pointer;
-  text-decoration: underline;
-  display: inline;
-  margin: 0;
-  padding: 0;
-}
-
-.link-button:hover,
-.link-button:focus {
-text-decoration: none;
-}
-```
-
-This button element can now also be used inline in text.
-
-Once again we stress that this is an inferior implementation and some users will encounter difficulty to use your website, however, it will allow a larger group of people to interact with your website than the alternative of ignoring the rule's warning.
-
-
-### References
-  1. [WebAIM - Introduction to Links and Hypertext](http://webaim.org/techniques/hypertext/)
-  1. [Links vs. Buttons in Modern Web Applications](https://marcysutton.com/links-vs-buttons-in-modern-web-applications/)
-  1. [Using ARIA - Notes on ARIA use in HTML](https://www.w3.org/TR/using-aria/#NOTES)
-
-## Rule details
-
-This rule takes one optional object argument of type object:
-
-```json
-{
-    "rules": {
-        "jsx-a11y/anchor-is-valid": [ "error", {
-            "components": [ "Link" ],
-            "specialLink": [ "hrefLeft", "hrefRight" ],
-            "aspects": [ "noHref", "invalidHref", "preferButton" ]
-          }]
-    }
-}
-```
-
-For the `components` option, these strings determine which JSX elements (**always including** `<a>`) should be checked for the props designated in the `specialLink` options (**always including** `href`). This is a good use case when you have a wrapper component that simply renders an `<a>` element (like in React):
-
-```js
-// Link.js
-const Link = props => <a {...props}>A link</a>;
-
-...
-
-// NavBar.js (for example)
-...
-return (
-  <nav>
-    <Link href="/home" />
-  </nav>
-);
-```
-
-For the `aspects` option, these strings determine which sub-rules are run. This allows omission of certain error types in restrictive environments.
-
-- `noHref`: Checks whether an anchor contains an `href` attribute.
-- `invalidHref`: Checks if a given `href` value is valid.
-- `preferButton`: Checks if anchors have been used as buttons.
-
-The option can be used on its own or with the `components` and `specialLink` options.
-
-If omitted, all sub-rule aspects will be run by default. This is the recommended configuration for all cases except where the rule becomes unusable due to well founded restrictions. 
-
-The option must contain at least one `aspect`.
-
-### Succeed
-```jsx
-<a href="https://github.com" />
-<a href="#section" />
-<a href="foo" />
-<a href="/foo/bar" />
-<a href={someValidPath} />
-<a href="https://github.com" onClick={foo} />
-<a href="#section" onClick={foo} />
-<a href="foo" onClick={foo} />
-<a href="/foo/bar" onClick={foo} />
-<a href={someValidPath} onClick={foo} />
-```
-
-### Fail
-
-Anchors should be a button:
-```jsx
-<a onClick={foo} />
-<a href="#" onClick={foo} />
-<a href={"#"} onClick={foo} />
-<a href={`#`} onClick={foo} />
-<a href="javascript:void(0)" onClick={foo} />
-<a href={"javascript:void(0)"} onClick={foo} />
-<a href={`javascript:void(0)`} onClick={foo} />
-```
-
-Missing `href` attribute:
-```jsx
-<a />
-<a href={undefined} />
-<a href={null} />
-```
-
-Invalid `href` attribute:
-```jsx
-<a href="#" />
-<a href={"#"} />
-<a href={`#`} />
-<a href="javascript:void(0)" />
-<a href={"javascript:void(0)"} />
-<a href={`javascript:void(0)`} />
-```
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-activedescendant-has-tabindex.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-activedescendant-has-tabindex.md
deleted file mode 100644
index 29eac88..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-activedescendant-has-tabindex.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# aria-activedescendant-has-tabindex
-
-`aria-activedescendant` is used to manage focus within a [composite widget](https://www.w3.org/TR/wai-aria/roles#composite_header).
-The element with the attribute `aria-activedescendant` retains the active document
-focus; it indicates which of its child elements has secondary focus by assigning
-the ID of that element to the value of `aria-activedescendant`. This pattern is
-used to build a widget like a search typeahead select list. The search input box
-retains document focus so that the user can type in the input. If the down arrow
-key is pressed and a search suggestion is highlighted, the ID of the suggestion
-element will be applied as the value of `aria-activedescendant` on the input
-element.
-
-Because an element with `aria-activedescendant` must be tabbable, it must either
-have an inherent `tabIndex` of zero or declare a `tabIndex` of zero with the `tabIndex`
-attribute.
-
-#### References
-1. [MDN](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-activedescendant_attribute)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<CustomComponent />
-<CustomComponent aria-activedescendant={someID} />
-<CustomComponent aria-activedescendant={someID} tabIndex={0} />
-<CustomComponent aria-activedescendant={someID} tabIndex={-1} />
-<div />
-<input />
-<div tabIndex={0} />
-<div aria-activedescendant={someID} tabIndex={0} />
-<div aria-activedescendant={someID} tabIndex="0" />
-<div aria-activedescendant={someID} tabIndex={1} />
-<input aria-activedescendant={someID} />
-<input aria-activedescendant={someID} tabIndex={0} />
-```
-
-### Fail
-```jsx
-<div aria-activedescendant={someID} />
-<div aria-activedescendant={someID} tabIndex={-1} />
-<div aria-activedescendant={someID} tabIndex="-1" />
-<input aria-activedescendant={someID} tabIndex={-1} />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-props.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-props.md
deleted file mode 100644
index 36cb325..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-props.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# aria-props
-
-Elements cannot use an invalid ARIA attribute. This will fail if it finds an `aria-*` property that is not listed in [WAI-ARIA States and Properties spec](https://www.w3.org/WAI/PF/aria-1.1/states_and_properties).
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<!-- Good: Labeled using correctly spelled aria-labelledby -->
-<div id="address_label">Enter your address</div>
-<input aria-labelledby="address_label">
-```
-
-### Fail
-
-```jsx
-<!-- Bad: Labeled using incorrectly spelled aria-labeledby -->
-<div id="address_label">Enter your address</div>
-<input aria-labeledby="address_label">
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-proptypes.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-proptypes.md
deleted file mode 100644
index 9b85d5b..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-proptypes.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# aria-proptypes
-
-ARIA state and property values must be valid.
-
-#### References
-1. [Spec](https://www.w3.org/TR/wai-aria/states_and_properties)
-2. [AX_ARIA_04](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_aria_04)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<!-- Good: the aria-hidden state is of type true/false -->
-<span aria-hidden="true">foo</span>
-```
-
-### Fail
-```jsx
-<!-- Bad: the aria-hidden state is of type true/false -->
-<span aria-hidden="yes">foo</span>
-```
-
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-role.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-role.md
deleted file mode 100644
index bd8cc77..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-role.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# aria-role
-
-Elements with ARIA roles must use a valid, non-abstract ARIA role. A reference to role definitions can be found at [WAI-ARIA](https://www.w3.org/TR/wai-aria/#role_definitions) site.
-
-[AX_ARIA_01](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_aria_01)
-[DPUB-ARIA roles](https://www.w3.org/TR/dpub-aria-1.0/)
-
-## Rule details
-
-This rule takes one optional object argument of type object:
-
-```
-{
-    "rules": {
-        "jsx-a11y/aria-role": [ 2, {
-            "ignoreNonDOM": true
-        }],
-    }
-}
-```
-
-For the `ignoreNonDOM` option, this determines if developer created components are checked.
-
-### Succeed
-```jsx
-<div role="button"></div>     <!-- Good: "button" is a valid ARIA role -->
-<div role={role}></div>       <!-- Good: role is a variable & cannot be determined until runtime. -->
-<div></div>                   <!-- Good: No ARIA role -->
-<Foo role={role}></Foo>       <!-- Good: ignoreNonDOM is set to true -->
-```
-
-### Fail
-
-```jsx
-<div role="datepicker"></div> <!-- Bad: "datepicker" is not an ARIA role -->
-<div role="range"></div>      <!-- Bad: "range" is an _abstract_ ARIA role -->
-<div role=""></div>           <!-- Bad: An empty ARIA role is not allowed -->
-<Foo role={role}></Foo>       <!-- Bad: ignoreNonDOM is set to false or not set -->
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-unsupported-elements.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-unsupported-elements.md
deleted file mode 100644
index 452c3d4..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/aria-unsupported-elements.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# aria-unsupported-elements
-
-Certain reserved DOM elements do not support ARIA roles, states and properties. This is often because they are not visible, for example `meta`, `html`, `script`, `style`. This rule enforces that these DOM elements do not contain the `role` and/or `aria-*` props.
-
-#### References
-1. [AX_ARIA_12](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_aria_12)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<!-- Good: the meta element should not be given any ARIA attributes -->
-<meta charset="UTF-8" />
-```
-
-### Fail
-```jsx
-<!-- Bad: the meta element should not be given any ARIA attributes -->
-<meta charset="UTF-8" aria-hidden="false" />
-```
-
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/click-events-have-key-events.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/click-events-have-key-events.md
deleted file mode 100644
index d89869b..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/click-events-have-key-events.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# click-events-have-key-events
-
-Enforce `onClick` is accompanied by at least one of the following: `onKeyUp`, `onKeyDown`, `onKeyPress`. Coding for the keyboard is important for users with physical disabilities who cannot use a mouse, AT compatibility, and screenreader users.
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<div onClick={() => {}} onKeyDown={this.handleKeyDown} />
-<div onClick={() => {}} onKeyUp={this.handleKeyUp} />
-<div onClick={() => {}} onKeyPress={this.handleKeyPress} />
-```
-
-### Fail
-```jsx
-<div onClick={() => {}} />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/control-has-associated-label.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/control-has-associated-label.md
deleted file mode 100644
index f66d1cc..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/control-has-associated-label.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# control-has-associated-label
-
-Enforce that a control (an interactive element) has a text label.
-
-There are two supported ways to supply a control with a text label:
-
-- Provide text content inside the element.
-- Use the `aria-label` attribute on the element, with a text value.
-- Use the `aria-labelledby` attribute on the element, and point the IDREF value to an element with an accessible label.
-- Alternatively, with an `img` tag, you may use the `alt` attribute to supply a text description of the image.
-
-The rule is permissive in the sense that it will assume that expressions will eventually provide a label. So an element like this will pass.
-
-```jsx
-<button type="button">{maybeSomethingThatContainsALabel}</button>
-```
-
-## How do I resolve this error?
-
-### Case: I have a simple button that requires a label.
-
-Provide text content in the `button` element.
-
-```jsx
-<button type="button">Save</button>
-```
-
-### Case: I have an icon button and I don't want visible text.
-
-Use the `aria-label` attribute and provide the text label as the value.
-
-```jsx
-<button type="button" aria-label="Save" class="icon-save" />
-```
-
-### Case: The label for my element is already located on the page and I don't want to repeat the text in my source code.
-
-Use the `aria-labelledby` attribute and point the IDREF value to an element with an accessible label.
-
-```jsx
-<div id="js_1">Comment</div>
-<textarea aria-labelledby="js_1"></textarea>
-```
-
-### Case: My label and input components are custom components, but I still want to require that they have an accessible text label.
-
-You can configure the rule to be aware of your custom components. Refer to the Rule Details below.
-
-```jsx
-<CustomInput label="Surname" type="text" value={value} />
-```
-
-## Rule details
-
-This rule takes one optional object argument of type object:
-
-```json
-{
-  "rules": {
-    "jsx-a11y/control-has-associated-label": [ 2, {
-      "labelAttributes": ["label"],
-      "controlComponents": ["CustomComponent"],
-      "ignoreElements": [
-        "audio",
-        "canvas",
-        "embed",
-        "input",
-        "textarea",
-        "tr",
-        "video",
-      ],
-      "ignoreRoles": [
-        "grid",
-        "listbox",
-        "menu",
-        "menubar",
-        "radiogroup",
-        "row",
-        "tablist",
-        "toolbar",
-        "tree",
-        "treegrid",
-      ],
-      "depth": 3,
-    }],
-  }
-}
-```
-
-- `labelAttributes` is a list of attributes to check on the control component and its children for a label. Use this if you have a custom component that uses a string passed on a prop to render an HTML `label`, for example.
-- `controlComponents` is a list of custom React Components names that will render down to an interactive element.
-- `ignoreElements` is an array of elements that should not be considered control (interactive) elements and therefore they do not require a text label.
-- `ignoreRoles` is an array of ARIA roles that should not be considered control (interactive) roles and therefore they do not require a text label.
-- `depth` (default 2, max 25) is an integer that determines how deep within a `JSXElement` the rule should look for text content or an element with a label to determine if the interactive element will have an accessible label.
-
-### Succeed
-```jsx
-<button type="button" aria-label="Save" class="icon-save" />
-```
-
-### Fail
-```jsx
-<button type="button" class="icon-save" />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/heading-has-content.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/heading-has-content.md
deleted file mode 100644
index 6f5f53e..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/heading-has-content.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# heading-has-content
-
-Enforce that heading elements (`h1`, `h2`, etc.) have content and that the content is accessible to screen readers. Accessible means that it is not hidden using the `aria-hidden` prop. Refer to the references to learn about why this is important.
-
-#### References
-1. [axe-core, empty-heading](https://dequeuniversity.com/rules/axe/3.2/empty-heading)
-
-## Rule details
-
-This rule takes one optional object argument of type object:
-
-```json
-{
-    "rules": {
-        "jsx-a11y/heading-has-content": [ 2, {
-            "components": [ "MyHeading" ],
-          }],
-    }
-}
-```
-
-For the `components` option, these strings determine which JSX elements (**always including** `<h1>` thru `<h6>`) should be checked for having content. This is a good use case when you have a wrapper component that simply renders an `h1` element (like in React):
-
-
-```js
-// Header.js
-const Header = props => {
-  return (
-    <h1 {...props}>{ props.children }</h1>
-  );
-}
-
-...
-
-// CreateAccount.js (for example)
-...
-return (
-  <Header>Create Account</Header>
-);
-```
-
-#### Bad
-```jsx
-function Foo(props) {
-  return <label {...props} />
-}
-```
-
-### Succeed
-```jsx
-<h1>Heading Content!</h1>
-<h1><TextWrapper /><h1>
-<h1 dangerouslySetInnerHTML={{ __html: 'foo' }} />
-```
-
-### Fail
-```jsx
-<h1 />
-<h1><TextWrapper aria-hidden />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/html-has-lang.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/html-has-lang.md
deleted file mode 100644
index f5c9162..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/html-has-lang.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# html-has-lang
-
-<html> elements must have the lang prop.
-
-#### References
-1. [axe-core, html-has-lang](https://dequeuniversity.com/rules/axe/3.2/html-has-lang)
-1. [axe-core, html-lang-valid](https://dequeuniversity.com/rules/axe/3.2/html-lang-valid)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<html lang="en">
-<html lang="en-US">
-<html lang={language}>
-```
-
-### Fail
-
-```jsx
-<html>
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/iframe-has-title.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/iframe-has-title.md
deleted file mode 100644
index 7880ecc..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/iframe-has-title.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# iframe-has-title
-
-`<iframe>` elements must have a unique title property to indicate its content to the user.
-
-#### References
-1. [axe-core, frame-title](https://dequeuniversity.com/rules/axe/3.2/frame-title)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<iframe title="This is a unique title" />
-<iframe title={uniqueTitle} />
-```
-
-### Fail
-```jsx
-<iframe />
-<iframe {...props} />
-<iframe title="" />
-<iframe title={''} />
-<iframe title={``} />
-<iframe title={undefined} />
-<iframe title={false} />
-<iframe title={true} />
-<iframe title={42} />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/img-redundant-alt.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/img-redundant-alt.md
deleted file mode 100644
index 92d8755..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/img-redundant-alt.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# img-redundant-alt
-
-Enforce img alt attribute does not contain the word image, picture, or photo. Screenreaders already announce `img` elements as an image. There is no need to use words such as *image*, *photo*, and/or *picture*.
-
-## Rule details
-
-This rule takes one optional object argument of type object:
-
-```json
-{
-    "rules": {
-        "jsx-a11y/img-redundant-alt": [ 2, {
-            "components": [ "Image" ],
-            "words": [ "Bild", "Foto" ],
-          }],
-    }
-}
-```
-
-For the `components` option, these strings determine which JSX elements (**always including** `<img>`) should be checked for having redundant words in the `alt` prop value . This is a good use case when you have a wrapper component that simply renders an `img` element (like in React).
-
-For the `words` option, these strings can be used to specify custom words that should be checked for in the alt prop, including `image`, `photo`, and `picture`. Useful for specifying words in other languages.
-
-The rule will first check if `aria-hidden` is true to determine whether to enforce the rule. If the image is hidden, then rule will always succeed.
-
-### Succeed
-```jsx
-<img src="foo" alt="Foo eating a sandwich." />
-<img src="bar" aria-hidden alt="Picture of me taking a photo of an image" /> // Will pass because it is hidden.
-<img src="baz" alt={`Baz taking a ${photo}`} /> // This is valid since photo is a variable name.
-```
-
-### Fail
-```jsx
-<img src="foo" alt="Photo of foo being weird." />
-<img src="bar" alt="Image of me at a bar!" />
-<img src="baz" alt="Picture of baz fixing a bug." />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/interactive-supports-focus.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/interactive-supports-focus.md
deleted file mode 100644
index 0518def..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/interactive-supports-focus.md
+++ /dev/null
@@ -1,143 +0,0 @@
-# interactive-supports-focus
-
-Elements with an interactive role and interaction handlers (mouse or key press) must be focusable.
-
-## How do I resolve this error?
-
-### Case: I got the error "Elements with the '${role}' interactive role must be tabbable". How can I fix this?
-
-This element is a stand-alone control like a button, a link or a form element. A user should be able to reach this element by pressing the tab key on their keyboard.
-
-Add the `tabIndex` property to your component. A value of zero indicates that this element can be tabbed to.
-
-```
-<div
-  role="button"
-  tabIndex={0} />
-```
-
--- or --
-
-Replace the component with one that renders semantic html element like `<button>`, `<a href>` or `<input>` -- whichever fits your purpose.
-
-Generally buttons, links and form elements should be reachable via tab key presses. An element that can be tabbed to is said to be in the _tab ring_.
-
-### Case: I got the error "Elements with the '${role}' interactive role must be focusable". How can I fix this?
-
-This element is part of a group of buttons, links, menu items, etc. Or this element is part of a composite widget. Composite widgets prescribe standard [keyboard interaction patterns](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_generalnav). Within a group of similar elements -- like a button bar -- or within a composite widget, elements that can be focused are given a tabindex of -1. This makes the element *focusable* but not *tabbable*. Generally one item in a group should have a tabindex of zero so that a user can tab to the component. Once an element in the component has focus, your key management behaviors will control traversal within the component's pieces. As the UI author, you will need to implement the key handling behaviors such as listening for traversal key (up/down/left/right) presses and moving the page focus between the focusable elements in your widget.
-
-```
-<div role="menu">
-  <div role="menuitem" tabIndex="0">Open</div>
-  <div role="menuitem" tabIndex="-1">Save</div>
-  <div role="menuitem" tabIndex="-1">Close</div>
-</div>
-```
-
-In the example above, the first item in the group can be tabbed to. The developer provides the ability to traverse to the subsequent items via the up/down/left/right arrow keys. Traversing via arrow keys is not provided by the browser or the assistive technology. See [Fundamental Keyboard Navigation Conventions](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_generalnav) for information about established traversal behaviors for various UI widgets.
-
-### Case: This element is not a button, link, menuitem, etc. It is catching bubbled events from elements that it contains
-
-If your element is catching bubbled click or key events from descendant elements, then the proper role for this element is `presentation`.
-
-```
-<div
-  onClick={onClickHandler}
-  role="presentation">
-  <button>Save</button>
-</div>
-```
-
-Marking an element with the role `presentation` indicates to assistive technology that this element should be ignored; it exists to support the web application and is not meant for humans to interact with directly.
-
-### References
-  1. [AX_FOCUS_02](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_focus_02)
-  1. [Mozilla Developer Network - ARIA Techniques](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_button_role#Keyboard_and_focus)
-  1. [Fundamental Keyboard Navigation Conventions](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_generalnav)
-  1. [WAI-ARIA Authoring Practices Guide - Design Patterns and Widgets](https://www.w3.org/TR/wai-aria-practices-1.1/#aria_ex)
-
-## Rule details
-
-This rule takes an options object with the key `tabbable`. The value is an array of interactive ARIA roles that should be considered tabbable, not just focusable. Any interactive role not included in this list will be flagged as needing to be focusable (tabindex of -1).
-
-```
-'jsx-a11y/interactive-supports-focus': [
-  'error',
-  {
-    tabbable: [
-      'button',
-      'checkbox',
-      'link',
-      'searchbox',
-      'spinbutton',
-      'switch',
-      'textbox',
-    ],
-  },
-]
-```
-
-The recommended options list interactive roles that act as form elements. Generally, elements with a role like `menuitem` are a part of a composite widget. Focus in a composite widget is controlled and moved programmatically to satisfy the prescribed [keyboard interaction pattern](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_generalnav) for the widget.
-
-The list of possible values includes:
-
-```
-[
-  'button',
-  'checkbox',
-  'columnheader',
-  'combobox',
-  'grid',
-  'gridcell',
-  'link',
-  'listbox',
-  'menu',
-  'menubar',
-  'menuitem',
-  'menuitemcheckbox',
-  'menuitemradio',
-  'option',
-  'progressbar',
-  'radio',
-  'radiogroup',
-  'row',
-  'rowheader',
-  'searchbox',
-  'slider',
-  'spinbutton',
-  'switch',
-  'tab',
-  'tablist',
-  'textbox',
-  'toolbar',
-  'tree',
-  'treegrid',
-  'treeitem',
-  'doc-backlink',
-  'doc-biblioref',
-  'doc-glossref',
-  'doc-noteref',
-]
-```
-
-### Succeed
-```jsx
-<!-- Good: div with onClick attribute is hidden from screen reader -->
-<div aria-hidden onClick={() => void 0} />
-<!-- Good: span with onClick attribute is in the tab order -->
-<span onClick="doSomething();" tabIndex="0" role="button">Click me!</span>
-<!-- Good: span with onClick attribute may be focused programmatically -->
-<span onClick="doSomething();" tabIndex="-1" role="menuitem">Click me too!</span>
-<!-- Good: anchor element with href is inherently focusable -->
-<a href="javascript:void(0);" onClick="doSomething();">Click ALL the things!</a>
-<!-- Good: buttons are inherently focusable -->
-<button onClick="doSomething();">Click the button :)</button>
-```
-
-### Fail
-```jsx
-<!-- Bad: span with onClick attribute has no tabindex -->
-<span onclick="submitForm();" role="button">Submit</span>
-<!-- Bad: anchor element without href is not focusable -->
-<a onclick="showNextPage();" role="button">Next page</a>
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/label-has-associated-control.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/label-has-associated-control.md
deleted file mode 100644
index 9d60059..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/label-has-associated-control.md
+++ /dev/null
@@ -1,139 +0,0 @@
-# label-has-associated-control
-
-Enforce that a label tag has a text label and an associated control.
-
-There are two supported ways to associate a label with a control:
-
-- Wrapping a control in a label tag.
-- Adding `htmlFor` to a label and assigning it a DOM ID string that indicates an input on the page.
-
-This rule checks that any `label` tag (or an indicated custom component that will output a `label` tag) either (1) wraps an `input` element (or an indicated custom component that will output an `input` tag) or (2) has an `htmlFor` attribute and that the `label` tag has text content.
-
-## How do I resolve this error?
-
-### Case: I just want a text label associated with an input.
-
-The simplest way to achieve an association between a label and an input is to wrap the input in the label.
-
-```jsx
-<label>
-  Surname
-  <input type="text" />
-</label>
-```
-
-All modern browsers and assistive technology will associate the label with the control.
-
-### Case: The label is a sibling of the control.
-
-In this case, use `htmlFor` and an ID to associate the controls.
-
-```jsx
-<label htmlFor={domId}>Surname</label>
-<input type="text" id={domId} />
-```
-
-### Case: My label and input components are custom components.
-
-You can configure the rule to be aware of your custom components.
-
-```jsx
-<CustomInputLabel label="Surname">
-  <CustomInput type="text" value={value} />
-</CustomInputLabel>
-```
-
-And the configuration:
-
-```json
-{
-  "rules": {
-    "jsx-a11y/label-has-associated-control": [ 2, {
-      "labelComponents": ["CustomInputLabel"],
-      "labelAttributes": ["label"],
-      "controlComponents": ["CustomInput"],
-      "depth": 3,
-    }],
-  }
-}
-```
-
-### Case: I have two labels for the same input
-
-If the second `label` is in a different part of the HTML, then the second one can only contain `htmlFor` but not nesting. You will probably need eslint override comment on the second label.
-
-```jsx
-{/* eslint jsx-a11y/label-has-associated-control: ["error", { assert: "either" } ] */}
-<label htmlFor="a">
-  Username:
-</label>
-...
-<label htmlFor="a">
-  <input id="a" />
-</label>
-```
-
-## How to manage IDs of `input`
-
-A common way to think of `id` with libraries like React is, `id`s should be avoided since it must be unique on the page, and components need to be reusable. Hence it is tempted to generate `id` during render-time if `id` is required. *However:*
-
-IDs shouldn't be generated in the browser, so that server and client rendering are deterministic. Render-time uuids aren't just a hack, they're actually broken and should never be used.
-
-To restate, **every ID needs to be deterministic**, on the server and the client, and guaranteed to be unique on the page. EG: For each input, a required ID prop can be passed down from as far up the tree as possible to guarantee uniqueness.
-
-## Rule details
-
-This rule takes one optional object argument of type object:
-
-```json
-{
-  "rules": {
-    "jsx-a11y/label-has-associated-control": [ 2, {
-      "labelComponents": ["CustomLabel"],
-      "labelAttributes": ["inputLabel"],
-      "controlComponents": ["CustomInput"],
-      "assert": "both",
-      "depth": 3,
-    }],
-  }
-}
-```
-
-`labelComponents` is a list of custom React Component names that should be checked for an associated control.
-`labelAttributes` is a list of attributes to check on the label component and its children for a label. Use this if you have a custom component that uses a string passed on a prop to render an HTML `label`, for example.
-`controlComponents` is a list of custom React Components names that will output an input element.
-`assert` asserts that the label has htmlFor, a nested label, both or either. Available options: `'htmlFor', 'nesting', 'both', 'either'`.
-`depth` (default 2, max 25) is an integer that determines how deep within a `JSXElement` label the rule should look for text content or an element with a label to determine if the `label` element will have an accessible label.
-
-### Fail
-```jsx
-function Foo(props) {
-  return <label {...props} />
-}
-```
-
-### Succeed
-```jsx
-function Foo(props) {
-    const {
-        htmlFor,
-        ...otherProps
-    } = props;
-
-   return <label htmlFor={htmlFor} {...otherProps} />
-}
-```
-
-### Fail
-```jsx
-<input type="text" />
-<label>Surname</label>
-```
-
-### Succeed
-```jsx
-<label>
-  <input type="text" />
-  Surname
-</label>
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/label-has-for.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/label-has-for.md
deleted file mode 100644
index 5fff12c..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/label-has-for.md
+++ /dev/null
@@ -1,114 +0,0 @@
-# [Deprecated] label-has-for
-
-*This rule was deprecated in v6.1.0. It will no longer be maintained. Please use [`label-has-associated-control`](label-has-associated-control.md) instead.*
-
-Enforce label tags have associated control.
-
-There are two supported ways to associate a label with a control:
-
-- nesting: by wrapping a control in a label tag
-- id: by using the prop `htmlFor` as in `htmlFor=[ID of control]`
-
-To fully cover 100% of assistive devices, you're encouraged to validate for both nesting and id.
-
-## Rule details
-
-This rule takes one optional object argument of type object:
-
-```json
-{
-    "rules": {
-        "jsx-a11y/label-has-for": [ 2, {
-            "components": [ "Label" ],
-            "required": {
-                "every": [ "nesting", "id" ]
-            },
-            "allowChildren": false
-        }]
-    }
-}
-```
-
-For the `components` option, these strings determine which JSX elements (**always including** `<label>`) should be checked for having `htmlFor` prop. This is a good use case when you have a wrapper component that simply renders a `label` element (like in React):
-
-```js
-// Label.js
-const Label = props => {
-  const {
-    htmlFor,
-    ...otherProps
-  } = props;
-
-  return (
-    <label htmlFor={htmlFor} {...otherProps} />
-  );
-}
-
-...
-
-// CreateAccount.js (for example)
-...
-return (
-  <form>
-    <input id="firstName" type="text" />
-    <Label htmlFor="firstName">First Name</Label>
-  </form>
-);
-```
-
-The `required` option (defaults to `"required": { "every": ["nesting", "id"] }`) determines which checks are activated. You're allowed to pass in one of the following types:
-
-- string: must be one of the acceptable strings (`"nesting"` or `"id"`)
-- object, must have one of the following properties:
-
-  - some: an array of acceptable strings, will pass if ANY of the requested checks passed
-  - every: an array of acceptable strings, will pass if ALL of the requested checks passed
-
-The `allowChildren` option (defaults to `false`) determines whether `{children}` content is allowed to be passed into a `label` element. For example, the following pattern, by default, is not allowed:
-
-```js
-<label>{children}</label>
-```
-
-However, if `allowChildren` is set to `true`, no error will be raised. If you want to pass in `{children}` content without raising an error, because you cannot be sure what `{children}` will render, then set `allowChildren` to `true`.
-
-Note that passing props as spread attribute without `htmlFor` explicitly defined will cause this rule to fail. Explicitly pass down `htmlFor` prop for rule to pass. The prop must have an actual value to pass. Use `Label` component above as a reference. **It is a good thing to explicitly pass props that you expect to be passed for self-documentation.** For example:
-
-#### Bad
-```jsx
-function Foo(props) {
-  return <label {...props} />
-}
-```
-
-#### Good
-```jsx
-function Foo({ htmlFor, ...props}) {
-    return <label htmlFor={htmlFor} {...props} />
-}
-
-// OR
-
-function Foo(props) {
-    const {
-        htmlFor,
-        ...otherProps
-    } = props;
-
-   return <label htmlFor={htmlFor} {...otherProps} />
-}
-```
-
-### Succeed
-```jsx
-<label htmlFor="firstName">
-  <input type="text" id="firstName" />
-  First Name
-</label>
-```
-
-### Fail
-```jsx
-<input type="text" id="firstName" />
-<label>First Name</label>
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/lang.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/lang.md
deleted file mode 100644
index 50ec74d..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/lang.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# lang
-
-The `lang` prop on the `<html>` element must have a valid value based on ISO country and language codes.
-
-#### References
-1. [axe-core, valid-lang](https://dequeuniversity.com/rules/axe/3.2/valid-lang)
-2. [ISO Language Codes](http://www.w3schools.com/tags/ref_language_codes.asp)
-3. [ISO Country Codes](http://www.w3schools.com/tags/ref_country_codes.asp)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<html lang="en">
-<html lang="en-US">
-```
-
-### Fail
-
-```jsx
-<html>
-<html lang="foo">
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/media-has-caption.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/media-has-caption.md
deleted file mode 100644
index 6857361..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/media-has-caption.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# media-has-caption
-
-Providing captions for media is essential for deaf users to follow along. Captions should be a transcription or translation of the dialogue, sound effects, relevant musical cues, and other relevant audio information. Not only is this important for accessibility, but can also be useful for all users in the case that the media is unavailable (similar to `alt` text on an image when an image is unable to load).
-
-The captions should contain all important and relevant information to understand the corresponding media. This may mean that the captions are not a 1:1 mapping of the dialogue in the media content. However, captions are *not* necessary for video components with the `muted` attribute.
-
-### References
-
-  1. [audio](https://dequeuniversity.com/rules/axe/2.1/audio-caption)
-  1. [video](https://dequeuniversity.com/rules/axe/2.1/video-caption)
-
-## Rule details
-
-This rule takes one optional object argument of type object:
-
-```json
-{
-    "rules": {
-        "jsx-a11y/media-has-caption": [ 2, {
-            "audio": [ "Audio" ],
-            "video": [ "Video" ],
-            "track": [ "Track" ],
-          }],
-    }
-}
-```
-
-For the `audio`, `video`, and `track` options, these strings determine which JSX elements (**always including** their corresponding DOM element) should be used for this rule. This is a good use case when you have a wrapper component that simply renders an `audio`, `video`, or `track` element (like in React):
-
-### Succeed
-```jsx
-<audio><track kind="captions" {...props} /></audio>
-<video><track kind="captions" {...props} /></video>
-<video muted {...props} ></video>
-```
-
-### Fail
-```jsx
-<audio {...props} />
-<video {...props} />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/mouse-events-have-key-events.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/mouse-events-have-key-events.md
deleted file mode 100644
index 21d85ae..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/mouse-events-have-key-events.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# mouse-events-have-key-events
-
-Enforce onmouseover/onmouseout are accompanied by onfocus/onblur. Coding for the keyboard is important for users with physical disabilities who cannot use a mouse, AT compatibility, and screenreader users.
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<div onMouseOver={ () => void 0 } onFocus={ () => void 0 } />
-<div onMouseOut={ () => void 0 } onBlur={ () => void 0 } />
-<div onMouseOver={ () => void 0 } onFocus={ () => void 0 } {...otherProps} />
-<div onMouseOut={ () => void 0 } onBlur={ () => void 0 } {...otherProps} />
-```
-
-### Fail
-In example 3 and 4 below, even if otherProps contains onBlur and/or onFocus, this rule will still fail. Props should be passed down explicitly for rule to pass.
-
-```jsx
-<div onMouseOver={ () => void 0 } />
-<div onMouseOut={ () => void 0 } />
-<div onMouseOver={ () => void 0 } {...otherProps} />
-<div onMouseOut={ () => void 0 } {...otherProps} />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-access-key.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-access-key.md
deleted file mode 100644
index 1e62912..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-access-key.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# no-access-key
-
-Enforce no accessKey prop on element. Access keys are HTML attributes that allow web developers to assign keyboard shortcuts to elements. Inconsistencies between keyboard shortcuts and keyboard commands used by screenreader and keyboard only users create accessibility complications so to avoid complications, access keys should not be used.
-
-### References
-1. [WebAIM](http://webaim.org/techniques/keyboard/accesskey#spec)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<div />
-```
-
-### Fail
-```jsx
-<div accessKey="h" />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-autofocus.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-autofocus.md
deleted file mode 100644
index 6b0c104..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-autofocus.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# no-autofocus
-
-Enforce that autoFocus prop is not used on elements. Autofocusing elements can cause usability issues for sighted and non-sighted users, alike.
-
-#### References
-1. [w3c](https://w3c.github.io/html/sec-forms.html#autofocusing-a-form-control-the-autofocus-attribute)
-
-## Rule details
-
-This rule takes one optional object argument of type object:
-
-```
-{
-    "rules": {
-        "jsx-a11y/no-autofocus": [ 2, {
-            "ignoreNonDOM": true
-        }],
-    }
-}
-```
-
-For the `ignoreNonDOM` option, this determines if developer created components are checked.
-
-### Succeed
-```jsx
-<div />
-```
-
-### Fail
-```jsx
-<div autoFocus />
-<div autoFocus="true" />
-<div autoFocus="false" />
-<div autoFocus={undefined} />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-distracting-elements.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-distracting-elements.md
deleted file mode 100644
index 85380e2..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-distracting-elements.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# no-distracting-elements
-
-Enforces that no distracting elements are used. Elements that can be visually distracting can cause accessibility issues with visually impaired users. Such elements are most likely deprecated, and should be avoided. By default, the following elements are visually distracting: `<marquee>` and `<blink>`.
-
-#### References
-1. [axe-core, marquee](https://dequeuniversity.com/rules/axe/3.2/marquee)
-2. [axe-core, blink](https://dequeuniversity.com/rules/axe/3.2/blink)
-
-## Rule details
-
-This rule takes one optional object argument of type object:
-
-```json
-{
-    "rules": {
-        "jsx-a11y/no-distracting-elements": [ 2, {
-            "elements": [ "marquee", "blink" ],
-          }],
-    }
-}
-```
-
-For the `elements` option, these strings determine which JSX elements should be checked for usage. This shouldn't need to be configured unless you have a seriously compelling use case for these elements. You cannot add any additional elements than what is offered, as the schema is only valid with the provided enumerated list. If you have another element that you think may cause a11y issues due to visual impairment, please feel free to file an issue or send a PR!
-
-### Succeed
-```jsx
-<div />
-```
-
-### Fail
-```jsx
-<marquee />
-<blink />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-interactive-element-to-noninteractive-role.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-interactive-element-to-noninteractive-role.md
deleted file mode 100644
index 29d8ea1..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-interactive-element-to-noninteractive-role.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# no-interactive-element-to-noninteractive-role
-
-Interactive HTML elements indicate _controls_ in the user interface. Interactive elements include `<a href>`, `<button>`, `<input>`, `<select>`, `<textarea>`.
-
-Non-interactive HTML elements and non-interactive ARIA roles indicate _content_ and _containers_ in the user interface. Non-interactive elements include `<main>`, `<area>`, `<h1>` (,`<h2>`, etc), `<img>`, `<li>`, `<ul>` and `<ol>`.
-
-[WAI-ARIA roles](https://www.w3.org/TR/wai-aria-1.1/#usage_intro) should not be used to convert an interactive element to a non-interactive element. Non-interactive ARIA roles include `article`, `banner`, `complementary`, `img`, `listitem`, `main`, `region` and `tooltip`.
-
-## How do I resolve this error?
-
-### Case: The element should be a container, like an article
-
-Wrap your interactive element in a `<div>` with the desired role.
-
-```
-<div role="article">
-  <button>Save</button>
-</div>
-```
-
-### Case: The element should be content, like an image
-
-Put the content inside your interactive element.
-
-```
-<div
-  role="button"
-  onClick={() => {}}
-  onKeyPress={() => {}}
-  tabIndex="0">
-  <div role="img" aria-label="Save" />
-</div>
-```
-
-### References
-
-  1. [WAI-ARIA roles](https://www.w3.org/TR/wai-aria-1.1/#usage_intro)
-  1. [WAI-ARIA Authoring Practices Guide - Design Patterns and Widgets](https://www.w3.org/TR/wai-aria-practices-1.1/#aria_ex)
-  1. [Fundamental Keyboard Navigation Conventions](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_generalnav)
-  1. [Mozilla Developer Network - ARIA Techniques](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_button_role#Keyboard_and_focus)
-
-## Rule details
-
-The recommended options for this rule allow the `tr` element to be given a role of `presentation` (or its semantic equivalent `none`). Under normal circumstances, an element with an interactive role should not be semantically neutralized with `presentation` (or `none`).
-
-Options are provided as an object keyed by HTML element name; the value is an array of interactive roles that are allowed on the specified element.
-
-```
-{
-  'no-interactive-element-to-noninteractive-role': [
-    'error',
-    {
-      tr: ['none', 'presentation'],
-    },
-  ]
-}
-```
-
-Under the recommended options, the following code is valid. It would be invalid under the strict rules.
-
-```
-<tr role="presentation" />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-noninteractive-element-interactions.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-noninteractive-element-interactions.md
deleted file mode 100644
index 053d93b..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-noninteractive-element-interactions.md
+++ /dev/null
@@ -1,135 +0,0 @@
-# no-noninteractive-element-interactions
-
-Non-interactive HTML elements and non-interactive ARIA roles indicate _content_ and _containers_ in the user interface. A non-interactive element does not support event handlers (mouse and key handlers). Non-interactive elements include `<main>`, `<area>`, `<h1>` (,`<h2>`, etc), `<p>`, `<img>`, `<li>`, `<ul>` and `<ol>`. Non-interactive [WAI-ARIA roles](https://www.w3.org/TR/wai-aria-1.1/#usage_intro) include `article`, `banner`, `complementary`, `img`, `listitem`, `main`, `region` and `tooltip`.
-
-## How do I resolve this error?
-
-### Case: This element acts like a button, link, menuitem, etc.
-
-Move the event handler function to an inner element that is either a semantically interactive element (`<button>`, `<a href>`) or that has an interactive role. This leaves the _content_ or _container_ semantic value of this element intact.
-
-Common interactive roles include:
-
-  1. `button`
-  1. `link`
-  1. `checkbox`
-  1. `menuitem`
-  1. `menuitemcheckbox`
-  1. `menuitemradio`
-  1. `option`
-  1. `radio`
-  1. `searchbox`
-  1. `switch`
-  1. `textbox`
-
-Note: Adding a role to your element does **not** add behavior. When a semantic HTML element like `<button>` is used, then it will also respond to Enter key presses when it has focus. The developer is responsible for providing the expected behavior of an element that the role suggests it would have: focusability and key press support.
-see [WAI-ARIA Authoring Practices Guide - Design Patterns and Widgets](https://www.w3.org/TR/wai-aria-practices-1.1/#aria_ex).
-
-### Case: This element is catching bubbled events from elements that it contains
-
-Move the event handler function to an inner element like `<div>` and give that element a role of `presentation`. This leaves the _content_ or _container_ semantic value of this element intact.
-
-```
-<div role="article">
-  <div
-    onClick="onClickHandler"
-    onKeyPress={onKeyPressHandler}
-    role="presentation">
-    {this.props.children}
-  </div>
-</div>
-```
-
-Marking an element with the role `presentation` indicates to assistive technology that this element should be ignored; it exists to support the web application and is not meant for humans to interact with directly.
-
-### Case: This is a heading that expands/collapses content on the package
-
-Headers often double as expand/collapse controls for the content they headline. An accordion component is a common example of this pattern. Rather than assign the interaction handling code to the heading itself, put a button inside the heading instead. This pattern retains the role of the heading and the role of the button.
-
-```jsx
-<h3>
-  <button onClick={this._expandSection}>News</button>
-</h3>
-<ul id="articles-list">
-  <li>...</li>
-</ul>
-```
-
-### Case: This element is a table cell
-
-Table cells (and tables in general) are meant to contain data. ARIA provides us with a construct called a [Grid](http://w3c.github.io/aria-practices/#grid) that is essentially a 2 dimensional logical container for content and interactive elements.
-
-You have two options in this case.
-
-#### Option 1, move the interactive content inside the table cells
-
-For instance, move the button inside the cell:
-
-```
-<table>
-  <tr>
-    <td><button>Sort</button></td>
-  </tr>
-</table>
-```
-
-This preserves the table cell semantics and the button semantics; the two are not conflated on the cell.
-
-#### Option 2, convert the table into an ARIA grid
-
-If your user interface has a table-like layout, but is filled with interactive components in the cells, consider converting the table into a grid.
-
-```
-<table role="grid">
-  <tr>
-    <td role="gridcell" onClick={this.sort}>Sort</td>
-  </tr>
-</table>
-```
-
-You can also put the interactive content inside the grid cell. This maintains the semantic distinction between the cell and the interaction content, although a grid cell can be interactive.
-
-### References
-
-  1. [WAI-ARIA roles](https://www.w3.org/TR/wai-aria-1.1/#usage_intro)
-  1. [WAI-ARIA Authoring Practices Guide - Design Patterns and Widgets](https://www.w3.org/TR/wai-aria-practices-1.1/#aria_ex)
-  1. [Fundamental Keyboard Navigation Conventions](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_generalnav)
-  1. [Mozilla Developer Network - ARIA Techniques](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_button_role#Keyboard_and_focus)
-
-## Rule details
-
-You may configure which handler props should be taken into account when applying this rule. The recommended configuration includes the following 6 handlers.
-
-```javascript
-'jsx-a11y/no-noninteractive-element-interactions': [
-  'error',
-  {
-    handlers: [
-      'onClick',
-      'onMouseDown',
-      'onMouseUp',
-      'onKeyPress',
-      'onKeyDown',
-      'onKeyUp',
-    ],
-  },
-],
-```
-
-Adjust the list of handler prop names in the handlers array to increase or decrease the coverage surface of this rule in your codebase.
-
-### Succeed
-```jsx
-<div onClick={() => void 0} role="button" />
-<div onClick={() => void 0} role="presentation" />
-<input type="text" onClick={() => void 0} /> // Interactive element does not require role.
-<button onClick={() => void 0} className="foo" /> // button is interactive.
-<div onClick={() => void 0} role="button" aria-hidden /> // This is hidden from screenreader.
-<Input onClick={() => void 0} type="hidden" /> // This is a higher-level DOM component
-```
-
-### Fail
-```jsx
-<li onClick={() => void 0} />
-<div onClick={() => void 0} role="listitem" />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-noninteractive-element-to-interactive-role.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-noninteractive-element-to-interactive-role.md
deleted file mode 100644
index 8866e11..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-noninteractive-element-to-interactive-role.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# no-noninteractive-element-to-interactive-role
-
-Non-interactive HTML elements indicate _content_ and _containers_ in the user interface. Non-interactive elements include `<main>`, `<area>`, `<h1>` (,`<h2>`, etc), `<img>`, `<li>`, `<ul>` and `<ol>`.
-
-Interactive HTML elements indicate _controls_ in the user interface. Interactive elements include `<a href>`, `<button>`, `<input>`, `<select>`, `<textarea>`.
-
-
-[WAI-ARIA roles](https://www.w3.org/TR/wai-aria-1.1/#usage_intro) should not be used to convert a non-interactive element to an interactive element. Interactive ARIA roles include `button`, `link`, `checkbox`, `menuitem`, `menuitemcheckbox`, `menuitemradio`, `option`, `radio`, `searchbox`, `switch` and `textbox`.
-
-## How do I resolve this error?
-
-### Case: This element should be a control, like a button
-
-Put the control inside the non-interactive container element.
-
-```
-<li>
-  <div
-    role="button"
-    onClick={() => {}}
-    onKeyPress={() => {}}>
-    Save
-  </div>
-</li>
-```
-
-Or wrap the content inside your interactive element.
-
-```
-<div
-  role="button"
-  onClick={() => {}}
-  onKeyPress={() => {}}
-  tabIndex="0">
-  <img src="some/file.png" alt="Save" />
-</div>
-```
-
-### References
-
-1. [WAI-ARIA roles](https://www.w3.org/TR/wai-aria-1.1/#usage_intro)
-1. [WAI-ARIA Authoring Practices Guide - Design Patterns and Widgets](https://www.w3.org/TR/wai-aria-practices-1.1/#aria_ex)
-1. [Fundamental Keyboard Navigation Conventions](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_generalnav)
-1. [Mozilla Developer Network - ARIA Techniques](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_button_role#Keyboard_and_focus)
-
-## Rule details
-
-The recommended options for this rule allow several common interactive roles to be applied to a non-interactive element. The options are provided as an object keyed by HTML element name; the value is an array of interactive roles that are allowed on the specified element.
-
-```
-{
-  'no-noninteractive-element-to-interactive-role': [
-    'error',
-    {
-      ul: ['listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'],
-      ol: ['listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'],
-      li: ['menuitem', 'option', 'row', 'tab', 'treeitem'],
-      table: ['grid'],
-      td: ['gridcell'],
-    },
-  ]
-}
-```
-
-Under the recommended options, the following code is valid. It would be invalid under the strict rules.
-
-```
-<ul role="menu" />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-noninteractive-tabindex.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-noninteractive-tabindex.md
deleted file mode 100644
index ee81b98..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-noninteractive-tabindex.md
+++ /dev/null
@@ -1,87 +0,0 @@
-# no-noninteractive-tabindex
-
-Tab key navigation should be limited to elements on the page that can be interacted with. Thus it is not necessary to add a tabindex to items in an unordered list, for example, to make them navigable through assistive technology. These applications already afford page traversal mechanisms based on the HTML of the page. Generally, we should try to reduce the size of the page's tab ring rather than increasing it.
-
-## How do I resolve this error?
-
-### Case: I am using an `<a>` tag. Isn't that interactive?
-
-The `<a>` tag is tricky. Consider the following:
-
-```
-<a>Edit</a>
-<a href="#">Edit</a>
-<a role="button">Edit</a>
-```
-
-The bare `<a>` tag is an _anchor_. It has no semantic AX API mapping in either ARIA or the AXObject model. It's as meaningful as `<div>`, which is to say it has no meaning. An `<a>` tag with an `href` attribute has an inherent role of `link`. An `<a>` tag with an explicit role obtains the designated role. In the example above, this role is `button`.
-
-### Case: I am using "semantic" HTML. Isn't that interactive?
-
-If we take a step back into the field of linguistics for a moment, let's consider what it means for something to be "semantic". Nothing, in and of itself, has meaning. Meaning is constructed through dialogue. A speaker intends a meaning and a listener/observer interprets a meaning. Each participant constructs their own meaning through dialogue. There is no intrinsic or isolated meaning outside of interaction. Thus, we must ask, given that we have a "speaker" who communicates via "semantic" HTML, who is listening/observing?
-
-In our case, the observer is the Accessibility (AX) API. Browsers interpret HTML (inflected at times by ARIA) to construct a meaning (AX Tree) of the page. Whatever the semantic HTML intends has only the force of suggestion to the AX API. Therefore, we have inconsistencies. For example, there is not yet an ARIA role for `text` or `label` and thus no way to change a `<label>` into plain text or a `<span>` into a label via ARIA. `<div>` has an AXObject correpondant `DivRole`, but no such object maps to `<span>`.
-
-What this lint rule endeavors to do is apply the AX API understanding of the semantics of an HTML document back onto your code. The concept of interactivity boils down to whether a user can do something with the indicated or focused component.
-
-Common interactive roles include:
-
-  1. `button`
-  1. `link`
-  1. `checkbox`
-  1. `menuitem`
-  1. `menuitemcheckbox`
-  1. `menuitemradio`
-  1. `option`
-  1. `radio`
-  1. `searchbox`
-  1. `switch`
-  1. `textbox`
-
-Endeavor to limit tabbable elements to those that a user can act upon.
-
-### Case: Shouldn't I add a tabindex so that users can navigate to this item?
-
-It is not necessary to put a tabindex on an `<article>`, for instance or on `<li>` items; assistive technologies provide affordances to users to find and traverse these containers. Most elements that require a tabindex -- `<a href>`, `<button>`, `<input>`, `<textarea>` -- have it already.
-
-Your application might require an exception to this rule in the case of an element that captures incoming tab traversal for a composite widget. In that case, turn off this rule on a per instance basis. This is an uncommon case.
-
-### References
-
-  1. [Fundamental Keyboard Navigation Conventions](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_generalnav)
-
-## Rule details
-
-The recommended options for this rule allow `tabIndex` on elements with the noninteractive `tabpanel` role. Adding `tabIndex` to a tabpanel is a recommended practice in some instances.
-
-```javascript
-'jsx-a11y/no-noninteractive-tabindex': [
-  'error',
-  {
-    tags: [],
-    roles: ['tabpanel'],
-  },
-]
-```
-
-### Succeed
-```jsx
-<div />
-<MyButton tabIndex={0} />
-<button />
-<button tabIndex="0" />
-<button tabIndex={0} />
-<div />
-<div tabIndex="-1" />
-<div role="button" tabIndex="0" />
-<div role="article" tabIndex="-1" />
-<article tabIndex="-1" />
-```
-
-### Fail
-```jsx
-<div tabIndex="0" />
-<div role="article" tabIndex="0" />
-<article tabIndex="0" />
-<article tabIndex={0} />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-onchange.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-onchange.md
deleted file mode 100644
index b2ea5a0..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-onchange.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# no-onchange
-
-Enforce usage of `onBlur` over/in parallel with `onChange` on select menu elements for accessibility. `onBlur` **should** be used instead of `onChange`, unless absolutely necessary and it causes no negative consequences for keyboard only or screen reader users. `onBlur` is a more declarative action by the user: for instance in a dropdown, using the arrow keys to toggle between options will trigger the `onChange` event in some browsers. Regardless, when a change of context results from an `onBlur` event or an `onChange` event, the user should be notified of the change unless it occurs below the currently focused element.
-
-#### References
-1. [onChange Event Accessibility Issues](http://cita.disability.uiuc.edu/html-best-practices/auto/onchange.php)
-2. [onChange Select Menu](http://www.themaninblue.com/writing/perspective/2004/10/19/)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<select onBlur={updateModel}>
-  <option/>
-</select>
-
-<select>
-  <option onBlur={handleOnBlur} onChange={handleOnChange} />
-</select>
-```
-
-### Fail
-```jsx
-<select onChange={updateModel} />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-redundant-roles.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-redundant-roles.md
deleted file mode 100644
index 7e9e9fd..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-redundant-roles.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# no-redundant-roles
-
-Some HTML elements have native semantics that are implemented by the browser. This includes default/implicit ARIA roles. Setting an ARIA role that matches its default/implicit role is redundant since it is already set by the browser.
-
-#### References
-1. [w3](https://www.w3.org/TR/html5/dom.html#aria-role-attribute)
-
-## Rule details
-
-The default options for this rule allow an implicit role of `navigation` to be applied to a `nav` element as is [advised by w3](https://www.w3.org/WAI/GL/wiki/Using_HTML5_nav_element#Example:The_.3Cnav.3E_element). The options are provided as an object keyed by HTML element name; the value is an array of implicit ARIA roles that are allowed on the specified element.
-
-```
-{
-  'jsx-a11y/no-redundant-roles': [
-  'error',
-  {
-    nav: ['navigation'],
-  },
-}
-```
-
-### Succeed
-```jsx
-<div />
-<button role="presentation" />
-<MyComponent role="main" />
-```
-
-### Fail
-```jsx
-<button role="button" />
-<img role="img" src="foo.jpg" />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-static-element-interactions.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-static-element-interactions.md
deleted file mode 100644
index d195c6b..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/no-static-element-interactions.md
+++ /dev/null
@@ -1,97 +0,0 @@
-# no-static-element-interactions
-
-Static HTML elements do not have semantic meaning. This is clear in the case of `<div>` and `<span>`. It is less so clear in the case of elements that _seem_ semantic, but that do not have a semantic mapping in the accessibility layer. For example `<a>`, `<big>`, `<blockquote>`, `<footer>`, `<picture>`, `<strike>` and `<time>` -- to name a few -- have no semantic layer mapping. They are as void of meaning as `<div>`.
-
-The [WAI-ARIA `role` attribute](https://www.w3.org/TR/wai-aria-1.1/#usage_intro) confers a semantic mapping to an element. The semantic value can then be expressed to a user via assistive technology.
-
-In order to add interactivity such as a mouse or key event listener to a static element, that element must be given a role value as well.
-
-## How do I resolve this error?
-
-### Case: This element acts like a button, link, menuitem, etc.
-
-Indicate the element's role with the `role` attribute:
-
-```jsx
-<div
-  onClick={onClickHandler}
-  onKeyPress={onKeyPressHandler}
-  role="button"
-  tabIndex="0">
-  Save
-</div>
-```
-
-Common interactive roles include:
-
-  1. `button`
-  1. `link`
-  1. `checkbox`
-  1. `menuitem`
-  1. `menuitemcheckbox`
-  1. `menuitemradio`
-  1. `option`
-  1. `radio`
-  1. `searchbox`
-  1. `switch`
-  1. `textbox`
-
-Note: Adding a role to your element does **not** add behavior. When a semantic HTML element like `<button>` is used, then it will also respond to Enter key presses when it has focus. The developer is responsible for providing the expected behavior of an element that the role suggests it would have: focusability and key press support.
-
-### Case: The event handler is only being used to capture bubbled events
-
-If a static element has an event handler for the sole purpose of capturing events from its descendants, you can tell the linter to ignore it by setting `role="presentation"`:
-
-```jsx
-<div
-  onClick={this.handleButtonClick}
-  role="presentation">
-  <button>Save</button>
-  <button>Cancel</button>
-</div>
-```
-
-This `role` has no effect on static elements, but it clarifies your intent.
-
-### References
-
-  1. [WAI-ARIA `role` attribute](https://www.w3.org/TR/wai-aria-1.1/#usage_intro)
-  1. [WAI-ARIA Authoring Practices Guide - Design Patterns and Widgets](https://www.w3.org/TR/wai-aria-practices-1.1/#aria_ex)
-  1. [Fundamental Keyboard Navigation Conventions](https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_generalnav)
-  1. [Mozilla Developer Network - ARIA Techniques](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_button_role#Keyboard_and_focus)
-
-## Rule details
-
-You may configure which handler props should be taken into account when applying this rule. The recommended configuration includes the following 6 handlers.
-
-```javascript
-'jsx-a11y/no-static-element-interactions': [
-  'error',
-  {
-    handlers: [
-      'onClick',
-      'onMouseDown',
-      'onMouseUp',
-      'onKeyPress',
-      'onKeyDown',
-      'onKeyUp',
-    ],
-  },
-],
-```
-
-Adjust the list of handler prop names in the handlers array to increase or decrease the coverage surface of this rule in your codebase.
-
-### Succeed
-
-```jsx
-<button onClick={() => {}} className="foo" />
-<div className="foo" onClick={() => {}} role="button" />
-<input type="text" onClick={() => {}} />
-```
-
-### Fail
-
-```jsx
-<div onClick={() => {}} />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/role-has-required-aria-props.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/role-has-required-aria-props.md
deleted file mode 100644
index 3d6938f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/role-has-required-aria-props.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# role-has-required-aria-props
-
-Elements with ARIA roles must have all required attributes for that role.
-
-#### References
-1. [Spec](https://www.w3.org/TR/wai-aria/roles)
-2. [AX_ARIA_03](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_aria_03)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<!-- Good: the checkbox role requires the aria-checked state -->
-<span role="checkbox" aria-checked="false" aria-labelledby="foo" tabindex="0"></span>
-```
-
-### Fail
-
-```jsx
-<!-- Bad: the checkbox role requires the aria-checked state -->
-<span role="checkbox" aria-labelledby="foo" tabindex="0"></span>
-```
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/role-supports-aria-props.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/role-supports-aria-props.md
deleted file mode 100644
index c7d5fb0..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/role-supports-aria-props.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# role-supports-aria-props
-
-Enforce that elements with explicit or implicit roles defined contain only `aria-*` properties supported by that `role`. Many ARIA attributes (states and properties) can only be used on elements with particular roles. Some elements have implicit roles, such as `<a href="#" />`, which will resolve to `role="link"`.
-
-#### References
-1. [AX_ARIA_10](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_aria_10)
-2. [Supported States & Properties](https://www.w3.org/TR/wai-aria/roles#supportedState)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<!-- Good: the radiogroup role does support the aria-required property -->
-<ul role="radiogroup" aria-required aria-labelledby="foo">
-    <li tabIndex="-1" role="radio" aria-checked="false">Rainbow Trout</li>
-    <li tabIndex="-1" role="radio" aria-checked="false">Brook Trout</li>
-    <li tabIndex="0" role="radio" aria-checked="true">Lake Trout</li>
-</ul>
-```
-
-### Fail
-
-```jsx
-<!-- Bad: the radio role does not support the aria-required property -->
-<ul role="radiogroup" aria-labelledby="foo">
-    <li aria-required tabIndex="-1" role="radio" aria-checked="false">Rainbow Trout</li>
-    <li aria-required tabIndex="-1" role="radio" aria-checked="false">Brook Trout</li>
-    <li aria-required tabIndex="0" role="radio" aria-checked="true">Lake Trout</li>
-</ul>
-```
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/scope.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/scope.md
deleted file mode 100644
index d47a56c..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/scope.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# scope
-
-The `scope` scope should be used only on `<th>` elements.
-
-#### References
-1. [axe-core, scope](https://dequeuniversity.com/rules/axe/1.1/scope)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<th scope="col" />
-<th scope={scope} />
-```
-
-### Fail
-
-```jsx
-<div scope />
-```
diff --git a/node_modules/eslint-plugin-jsx-a11y/docs/rules/tabindex-no-positive.md b/node_modules/eslint-plugin-jsx-a11y/docs/rules/tabindex-no-positive.md
deleted file mode 100644
index 3ea9b08..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/docs/rules/tabindex-no-positive.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# tabindex-no-positive
-
-Avoid positive tabIndex property values to synchronize the flow of the page with keyboard tab order.
-
-#### References
-1. [AX_FOCUS_03](https://github.com/GoogleChrome/accessibility-developer-tools/wiki/Audit-Rules#ax_focus_03)
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-```jsx
-<span tabIndex="0">foo</span>
-<span tabIndex="-1">bar</span>
-<span tabIndex={0}>baz</span>
-```
-
-### Fail
-```jsx
-<span tabIndex="5">foo</span>
-<span tabIndex="3">bar</span>
-<span tabIndex="1">baz</span>
-<span tabIndex="2">never really sure what goes after baz</span>
-```
-
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/index.js b/node_modules/eslint-plugin-jsx-a11y/lib/index.js
deleted file mode 100644
index 4bc37a8..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/index.js
+++ /dev/null
@@ -1,170 +0,0 @@
-"use strict";
-
-/* eslint-disable global-require */
-module.exports = {
-  rules: {
-    'accessible-emoji': require('./rules/accessible-emoji'),
-    'alt-text': require('./rules/alt-text'),
-    'anchor-has-content': require('./rules/anchor-has-content'),
-    'anchor-is-valid': require('./rules/anchor-is-valid'),
-    'aria-activedescendant-has-tabindex': require('./rules/aria-activedescendant-has-tabindex'),
-    'aria-props': require('./rules/aria-props'),
-    'aria-proptypes': require('./rules/aria-proptypes'),
-    'aria-role': require('./rules/aria-role'),
-    'aria-unsupported-elements': require('./rules/aria-unsupported-elements'),
-    'click-events-have-key-events': require('./rules/click-events-have-key-events'),
-    'control-has-associated-label': require('./rules/control-has-associated-label'),
-    'heading-has-content': require('./rules/heading-has-content'),
-    'html-has-lang': require('./rules/html-has-lang'),
-    'iframe-has-title': require('./rules/iframe-has-title'),
-    'img-redundant-alt': require('./rules/img-redundant-alt'),
-    'interactive-supports-focus': require('./rules/interactive-supports-focus'),
-    'label-has-associated-control': require('./rules/label-has-associated-control'),
-    'label-has-for': require('./rules/label-has-for'),
-    lang: require('./rules/lang'),
-    'media-has-caption': require('./rules/media-has-caption'),
-    'mouse-events-have-key-events': require('./rules/mouse-events-have-key-events'),
-    'no-access-key': require('./rules/no-access-key'),
-    'no-autofocus': require('./rules/no-autofocus'),
-    'no-distracting-elements': require('./rules/no-distracting-elements'),
-    'no-interactive-element-to-noninteractive-role': require('./rules/no-interactive-element-to-noninteractive-role'),
-    'no-noninteractive-element-interactions': require('./rules/no-noninteractive-element-interactions'),
-    'no-noninteractive-element-to-interactive-role': require('./rules/no-noninteractive-element-to-interactive-role'),
-    'no-noninteractive-tabindex': require('./rules/no-noninteractive-tabindex'),
-    'no-onchange': require('./rules/no-onchange'),
-    'no-redundant-roles': require('./rules/no-redundant-roles'),
-    'no-static-element-interactions': require('./rules/no-static-element-interactions'),
-    'role-has-required-aria-props': require('./rules/role-has-required-aria-props'),
-    'role-supports-aria-props': require('./rules/role-supports-aria-props'),
-    scope: require('./rules/scope'),
-    'tabindex-no-positive': require('./rules/tabindex-no-positive')
-  },
-  configs: {
-    recommended: {
-      plugins: ['jsx-a11y'],
-      parserOptions: {
-        ecmaFeatures: {
-          jsx: true
-        }
-      },
-      rules: {
-        'jsx-a11y/accessible-emoji': 'error',
-        'jsx-a11y/alt-text': 'error',
-        'jsx-a11y/anchor-has-content': 'error',
-        'jsx-a11y/anchor-is-valid': 'error',
-        'jsx-a11y/aria-activedescendant-has-tabindex': 'error',
-        'jsx-a11y/aria-props': 'error',
-        'jsx-a11y/aria-proptypes': 'error',
-        'jsx-a11y/aria-role': 'error',
-        'jsx-a11y/aria-unsupported-elements': 'error',
-        'jsx-a11y/click-events-have-key-events': 'error',
-        'jsx-a11y/control-has-associated-label': ['off', {
-          ignoreElements: ['audio', 'canvas', 'embed', 'input', 'textarea', 'tr', 'video'],
-          ignoreRoles: ['grid', 'listbox', 'menu', 'menubar', 'radiogroup', 'row', 'tablist', 'toolbar', 'tree', 'treegrid'],
-          includeRoles: ['alert', 'dialog']
-        }],
-        'jsx-a11y/heading-has-content': 'error',
-        'jsx-a11y/html-has-lang': 'error',
-        'jsx-a11y/iframe-has-title': 'error',
-        'jsx-a11y/img-redundant-alt': 'error',
-        'jsx-a11y/interactive-supports-focus': ['error', {
-          tabbable: ['button', 'checkbox', 'link', 'searchbox', 'spinbutton', 'switch', 'textbox']
-        }],
-        'jsx-a11y/label-has-associated-control': 'error',
-        'jsx-a11y/label-has-for': 'off',
-        'jsx-a11y/media-has-caption': 'error',
-        'jsx-a11y/mouse-events-have-key-events': 'error',
-        'jsx-a11y/no-access-key': 'error',
-        'jsx-a11y/no-autofocus': 'error',
-        'jsx-a11y/no-distracting-elements': 'error',
-        'jsx-a11y/no-interactive-element-to-noninteractive-role': ['error', {
-          tr: ['none', 'presentation']
-        }],
-        'jsx-a11y/no-noninteractive-element-interactions': ['error', {
-          handlers: ['onClick', 'onError', 'onLoad', 'onMouseDown', 'onMouseUp', 'onKeyPress', 'onKeyDown', 'onKeyUp'],
-          alert: ['onKeyUp', 'onKeyDown', 'onKeyPress'],
-          body: ['onError', 'onLoad'],
-          dialog: ['onKeyUp', 'onKeyDown', 'onKeyPress'],
-          iframe: ['onError', 'onLoad'],
-          img: ['onError', 'onLoad']
-        }],
-        'jsx-a11y/no-noninteractive-element-to-interactive-role': ['error', {
-          ul: ['listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'],
-          ol: ['listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'],
-          li: ['menuitem', 'option', 'row', 'tab', 'treeitem'],
-          table: ['grid'],
-          td: ['gridcell']
-        }],
-        'jsx-a11y/no-noninteractive-tabindex': ['error', {
-          tags: [],
-          roles: ['tabpanel'],
-          allowExpressionValues: true
-        }],
-        'jsx-a11y/no-onchange': 'error',
-        'jsx-a11y/no-redundant-roles': 'error',
-        'jsx-a11y/no-static-element-interactions': ['error', {
-          allowExpressionValues: true,
-          handlers: ['onClick', 'onMouseDown', 'onMouseUp', 'onKeyPress', 'onKeyDown', 'onKeyUp']
-        }],
-        'jsx-a11y/role-has-required-aria-props': 'error',
-        'jsx-a11y/role-supports-aria-props': 'error',
-        'jsx-a11y/scope': 'error',
-        'jsx-a11y/tabindex-no-positive': 'error'
-      }
-    },
-    strict: {
-      plugins: ['jsx-a11y'],
-      parserOptions: {
-        ecmaFeatures: {
-          jsx: true
-        }
-      },
-      rules: {
-        'jsx-a11y/accessible-emoji': 'error',
-        'jsx-a11y/alt-text': 'error',
-        'jsx-a11y/anchor-has-content': 'error',
-        'jsx-a11y/anchor-is-valid': 'error',
-        'jsx-a11y/aria-activedescendant-has-tabindex': 'error',
-        'jsx-a11y/aria-props': 'error',
-        'jsx-a11y/aria-proptypes': 'error',
-        'jsx-a11y/aria-role': 'error',
-        'jsx-a11y/aria-unsupported-elements': 'error',
-        'jsx-a11y/click-events-have-key-events': 'error',
-        'jsx-a11y/control-has-associated-label': ['off', {
-          ignoreElements: ['audio', 'canvas', 'embed', 'input', 'textarea', 'tr', 'video'],
-          ignoreRoles: ['grid', 'listbox', 'menu', 'menubar', 'radiogroup', 'row', 'tablist', 'toolbar', 'tree', 'treegrid'],
-          includeRoles: ['alert', 'dialog']
-        }],
-        'jsx-a11y/heading-has-content': 'error',
-        'jsx-a11y/html-has-lang': 'error',
-        'jsx-a11y/iframe-has-title': 'error',
-        'jsx-a11y/img-redundant-alt': 'error',
-        'jsx-a11y/interactive-supports-focus': ['error', {
-          tabbable: ['button', 'checkbox', 'link', 'progressbar', 'searchbox', 'slider', 'spinbutton', 'switch', 'textbox']
-        }],
-        'jsx-a11y/label-has-for': 'error',
-        'jsx-a11y/label-has-associated-control': 'error',
-        'jsx-a11y/media-has-caption': 'error',
-        'jsx-a11y/mouse-events-have-key-events': 'error',
-        'jsx-a11y/no-access-key': 'error',
-        'jsx-a11y/no-autofocus': 'error',
-        'jsx-a11y/no-distracting-elements': 'error',
-        'jsx-a11y/no-interactive-element-to-noninteractive-role': 'error',
-        'jsx-a11y/no-noninteractive-element-interactions': ['error', {
-          body: ['onError', 'onLoad'],
-          iframe: ['onError', 'onLoad'],
-          img: ['onError', 'onLoad']
-        }],
-        'jsx-a11y/no-noninteractive-element-to-interactive-role': 'error',
-        'jsx-a11y/no-noninteractive-tabindex': 'error',
-        'jsx-a11y/no-onchange': 'error',
-        'jsx-a11y/no-redundant-roles': 'error',
-        'jsx-a11y/no-static-element-interactions': 'error',
-        'jsx-a11y/role-has-required-aria-props': 'error',
-        'jsx-a11y/role-supports-aria-props': 'error',
-        'jsx-a11y/scope': 'error',
-        'jsx-a11y/tabindex-no-positive': 'error'
-      }
-    }
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/accessible-emoji.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/accessible-emoji.js
deleted file mode 100644
index 78dcf69..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/accessible-emoji.js
+++ /dev/null
@@ -1,59 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _emojiRegex = _interopRequireDefault(require("emoji-regex"));
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-var _isHiddenFromScreenReader = _interopRequireDefault(require("../util/isHiddenFromScreenReader"));
-
-/**
- * @fileoverview Enforce emojis are wrapped in <span> and provide screenreader access.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'Emojis should be wrapped in <span>, have role="img", and have an accessible description with aria-label or aria-labelledby.';
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/accessible-emoji.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var literalChildValue = node.parent.children.find(function (child) {
-          return child.type === 'Literal' || child.type === 'JSXText';
-        });
-
-        if (literalChildValue && (0, _emojiRegex["default"])().test(literalChildValue.value)) {
-          var elementIsHidden = (0, _isHiddenFromScreenReader["default"])((0, _jsxAstUtils.elementType)(node), node.attributes);
-
-          if (elementIsHidden) {
-            return; // emoji is decorative
-          }
-
-          var rolePropValue = (0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(node.attributes, 'role'));
-          var ariaLabelProp = (0, _jsxAstUtils.getProp)(node.attributes, 'aria-label');
-          var arialLabelledByProp = (0, _jsxAstUtils.getProp)(node.attributes, 'aria-labelledby');
-          var hasLabel = ariaLabelProp !== undefined || arialLabelledByProp !== undefined;
-          var isSpan = (0, _jsxAstUtils.elementType)(node) === 'span';
-
-          if (hasLabel === false || rolePropValue !== 'img' || isSpan === false) {
-            context.report({
-              node,
-              message: errorMessage
-            });
-          }
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/alt-text.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/alt-text.js
deleted file mode 100644
index c21627d..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/alt-text.js
+++ /dev/null
@@ -1,210 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-var _hasAccessibleChild = _interopRequireDefault(require("../util/hasAccessibleChild"));
-
-var _isPresentationRole = _interopRequireDefault(require("../util/isPresentationRole"));
-
-/**
- * @fileoverview Enforce all elements that require alternative text have it.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var DEFAULT_ELEMENTS = ['img', 'object', 'area', 'input[type="image"]'];
-var schema = (0, _schemas.generateObjSchema)({
-  elements: _schemas.arraySchema,
-  img: _schemas.arraySchema,
-  object: _schemas.arraySchema,
-  area: _schemas.arraySchema,
-  'input[type="image"]': _schemas.arraySchema
-});
-var ruleByElement = {
-  img(context, node) {
-    var nodeType = (0, _jsxAstUtils.elementType)(node);
-    var altProp = (0, _jsxAstUtils.getProp)(node.attributes, 'alt'); // Missing alt prop error.
-
-    if (altProp === undefined) {
-      if ((0, _isPresentationRole["default"])(nodeType, node.attributes)) {
-        context.report({
-          node,
-          message: 'Prefer alt="" over a presentational role. First rule of aria is to not use aria if it can be achieved via native HTML.'
-        });
-        return;
-      }
-
-      context.report({
-        node,
-        message: "".concat(nodeType, " elements must have an alt prop, either with meaningful text, or an empty string for decorative images.")
-      });
-      return;
-    } // Check if alt prop is undefined.
-
-
-    var altValue = (0, _jsxAstUtils.getPropValue)(altProp);
-    var isNullValued = altProp.value === null; // <img alt />
-
-    if (altValue && !isNullValued || altValue === '') {
-      return;
-    } // Undefined alt prop error.
-
-
-    context.report({
-      node,
-      message: "Invalid alt value for ".concat(nodeType, ". Use alt=\"\" for presentational images.")
-    });
-  },
-
-  object(context, node) {
-    var ariaLabelProp = (0, _jsxAstUtils.getProp)(node.attributes, 'aria-label');
-    var arialLabelledByProp = (0, _jsxAstUtils.getProp)(node.attributes, 'aria-labelledby');
-    var hasLabel = ariaLabelProp !== undefined || arialLabelledByProp !== undefined;
-    var titleProp = (0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(node.attributes, 'title'));
-    var hasTitleAttr = !!titleProp;
-
-    if (hasLabel || hasTitleAttr || (0, _hasAccessibleChild["default"])(node.parent)) {
-      return;
-    }
-
-    context.report({
-      node,
-      message: 'Embedded <object> elements must have alternative text by providing inner text, aria-label or aria-labelledby props.'
-    });
-  },
-
-  area(context, node) {
-    var ariaLabelPropValue = (0, _jsxAstUtils.getPropValue)((0, _jsxAstUtils.getProp)(node.attributes, 'aria-label'));
-    var arialLabelledByPropValue = (0, _jsxAstUtils.getPropValue)((0, _jsxAstUtils.getProp)(node.attributes, 'aria-labelledby'));
-    var hasLabel = ariaLabelPropValue !== undefined || arialLabelledByPropValue !== undefined;
-
-    if (hasLabel) {
-      return;
-    }
-
-    var altProp = (0, _jsxAstUtils.getProp)(node.attributes, 'alt');
-
-    if (altProp === undefined) {
-      context.report({
-        node,
-        message: 'Each area of an image map must have a text alternative through the `alt`, `aria-label`, or `aria-labelledby` prop.'
-      });
-      return;
-    }
-
-    var altValue = (0, _jsxAstUtils.getPropValue)(altProp);
-    var isNullValued = altProp.value === null; // <area alt />
-
-    if (altValue && !isNullValued || altValue === '') {
-      return;
-    }
-
-    context.report({
-      node,
-      message: 'Each area of an image map must have a text alternative through the `alt`, `aria-label`, or `aria-labelledby` prop.'
-    });
-  },
-
-  'input[type="image"]': function inputImage(context, node) {
-    // Only test input[type="image"]
-    var nodeType = (0, _jsxAstUtils.elementType)(node);
-
-    if (nodeType === 'input') {
-      var typePropValue = (0, _jsxAstUtils.getPropValue)((0, _jsxAstUtils.getProp)(node.attributes, 'type'));
-
-      if (typePropValue !== 'image') {
-        return;
-      }
-    }
-
-    var ariaLabelPropValue = (0, _jsxAstUtils.getPropValue)((0, _jsxAstUtils.getProp)(node.attributes, 'aria-label'));
-    var arialLabelledByPropValue = (0, _jsxAstUtils.getPropValue)((0, _jsxAstUtils.getProp)(node.attributes, 'aria-labelledby'));
-    var hasLabel = ariaLabelPropValue !== undefined || arialLabelledByPropValue !== undefined;
-
-    if (hasLabel) {
-      return;
-    }
-
-    var altProp = (0, _jsxAstUtils.getProp)(node.attributes, 'alt');
-
-    if (altProp === undefined) {
-      context.report({
-        node,
-        message: '<input> elements with type="image" must have a text alternative through the `alt`, `aria-label`, or `aria-labelledby` prop.'
-      });
-      return;
-    }
-
-    var altValue = (0, _jsxAstUtils.getPropValue)(altProp);
-    var isNullValued = altProp.value === null; // <area alt />
-
-    if (altValue && !isNullValued || altValue === '') {
-      return;
-    }
-
-    context.report({
-      node,
-      message: '<input> elements with type="image" must have a text alternative through the `alt`, `aria-label`, or `aria-labelledby` prop.'
-    });
-  }
-};
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/alt-text.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    var _ref;
-
-    var options = context.options[0] || {}; // Elements to validate for alt text.
-
-    var elementOptions = options.elements || DEFAULT_ELEMENTS; // Get custom components for just the elements that will be tested.
-
-    var customComponents = elementOptions.map(function (element) {
-      return options[element];
-    }).reduce(function (components, customComponentsForElement) {
-      return components.concat(customComponentsForElement || []);
-    }, []);
-    var typesToValidate = new Set((_ref = []).concat.apply(_ref, [customComponents].concat((0, _toConsumableArray2["default"])(elementOptions))).map(function (type) {
-      if (type === 'input[type="image"]') {
-        return 'input';
-      }
-
-      return type;
-    }));
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var nodeType = (0, _jsxAstUtils.elementType)(node);
-
-        if (!typesToValidate.has(nodeType)) {
-          return;
-        }
-
-        var DOMElement = nodeType;
-
-        if (DOMElement === 'input') {
-          DOMElement = 'input[type="image"]';
-        } // Map nodeType to the DOM element if we are running this on a custom component.
-
-
-        if (elementOptions.indexOf(DOMElement) === -1) {
-          DOMElement = elementOptions.find(function (element) {
-            var customComponentsForElement = options[element] || [];
-            return customComponentsForElement.indexOf(nodeType) > -1;
-          });
-        }
-
-        ruleByElement[DOMElement](context, node);
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/anchor-has-content.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/anchor-has-content.js
deleted file mode 100644
index f67acd1..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/anchor-has-content.js
+++ /dev/null
@@ -1,52 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-var _hasAccessibleChild = _interopRequireDefault(require("../util/hasAccessibleChild"));
-
-/**
- * @fileoverview Enforce anchor elements to contain accessible content.
- * @author Lisa Ring & Niklas Holmberg
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'Anchors must have content and the content must be accessible by a screen reader.';
-var schema = (0, _schemas.generateObjSchema)({
-  components: _schemas.arraySchema
-});
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/anchor-has-content.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var options = context.options[0] || {};
-        var componentOptions = options.components || [];
-        var typeCheck = ['a'].concat(componentOptions);
-        var nodeType = (0, _jsxAstUtils.elementType)(node); // Only check anchor elements and custom types.
-
-        if (typeCheck.indexOf(nodeType) === -1) {
-          return;
-        }
-
-        if ((0, _hasAccessibleChild["default"])(node.parent)) {
-          return;
-        }
-
-        context.report({
-          node,
-          message: errorMessage
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/anchor-is-valid.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/anchor-is-valid.js
deleted file mode 100644
index c226e0a..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/anchor-is-valid.js
+++ /dev/null
@@ -1,115 +0,0 @@
-"use strict";
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Performs validity check on anchor hrefs. Warns when anchors are used as buttons.
- * @author Almero Steyn
- * 
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var allAspects = ['noHref', 'invalidHref', 'preferButton'];
-var preferButtonErrorMessage = 'Anchor used as a button. Anchors are primarily expected to navigate. Use the button element instead. Learn more: https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md';
-var noHrefErrorMessage = 'The href attribute is required for an anchor to be keyboard accessible. Provide a valid, navigable address as the href value. If you cannot provide an href, but still need the element to resemble a link, use a button and change it with appropriate styles. Learn more: https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md';
-var invalidHrefErrorMessage = 'The href attribute requires a valid value to be accessible. Provide a valid, navigable address as the href value. If you cannot provide a valid href, but still need the element to resemble a link, use a button and change it with appropriate styles. Learn more: https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md';
-var schema = (0, _schemas.generateObjSchema)({
-  components: _schemas.arraySchema,
-  specialLink: _schemas.arraySchema,
-  aspects: (0, _schemas.enumArraySchema)(allAspects, 1)
-});
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/anchor-is-valid.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var attributes = node.attributes;
-        var options = context.options[0] || {};
-        var componentOptions = options.components || [];
-        var typeCheck = ['a'].concat(componentOptions);
-        var nodeType = (0, _jsxAstUtils.elementType)(node); // Only check anchor elements and custom types.
-
-        if (typeCheck.indexOf(nodeType) === -1) {
-          return;
-        } // Set up the rule aspects to check.
-
-
-        var aspects = options.aspects || allAspects; // Create active aspect flag object. Failing checks will only report
-        // if the related flag is set to true.
-
-        var activeAspects = {};
-        allAspects.forEach(function (aspect) {
-          activeAspects[aspect] = aspects.indexOf(aspect) !== -1;
-        });
-        var propOptions = options.specialLink || [];
-        var propsToValidate = ['href'].concat(propOptions);
-        var values = propsToValidate.map(function (prop) {
-          return (0, _jsxAstUtils.getProp)(node.attributes, prop);
-        }).map(function (prop) {
-          return (0, _jsxAstUtils.getPropValue)(prop);
-        }); // Checks if any actual or custom href prop is provided.
-
-        var hasAnyHref = values.filter(function (value) {
-          return value === undefined || value === null;
-        }).length !== values.length; // Need to check for spread operator as props can be spread onto the element
-        // leading to an incorrect validation error.
-
-        var hasSpreadOperator = attributes.filter(function (prop) {
-          return prop.type === 'JSXSpreadAttribute';
-        }).length > 0;
-        var onClick = (0, _jsxAstUtils.getProp)(attributes, 'onClick'); // When there is no href at all, specific scenarios apply:
-
-        if (!hasAnyHref) {
-          // If no spread operator is found and no onClick event is present
-          // it is a link without href.
-          if (!hasSpreadOperator && activeAspects.noHref && (!onClick || onClick && !activeAspects.preferButton)) {
-            context.report({
-              node,
-              message: noHrefErrorMessage
-            });
-          } // If no spread operator is found but an onClick is preset it should be a button.
-
-
-          if (!hasSpreadOperator && onClick && activeAspects.preferButton) {
-            context.report({
-              node,
-              message: preferButtonErrorMessage
-            });
-          }
-
-          return;
-        } // Hrefs have been found, now check for validity.
-
-
-        var invalidHrefValues = values.filter(function (value) {
-          return value !== undefined && value !== null;
-        }).filter(function (value) {
-          return typeof value === 'string' && (!value.length || value === '#' || /^\W*?javascript:/.test(value));
-        });
-
-        if (invalidHrefValues.length !== 0) {
-          // If an onClick is found it should be a button, otherwise it is an invalid link.
-          if (onClick && activeAspects.preferButton) {
-            context.report({
-              node,
-              message: preferButtonErrorMessage
-            });
-          } else if (activeAspects.invalidHref) {
-            context.report({
-              node,
-              message: invalidHrefErrorMessage
-            });
-          }
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-activedescendant-has-tabindex.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-activedescendant-has-tabindex.js
deleted file mode 100644
index 11e51e9..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-activedescendant-has-tabindex.js
+++ /dev/null
@@ -1,70 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-var _getTabIndex = _interopRequireDefault(require("../util/getTabIndex"));
-
-var _isInteractiveElement = _interopRequireDefault(require("../util/isInteractiveElement"));
-
-/**
- * @fileoverview Enforce elements with aria-activedescendant are tabbable.
- * @author Jesse Beach <@jessebeach>
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'An element that manages focus with `aria-activedescendant` must be tabbable';
-var schema = (0, _schemas.generateObjSchema)();
-var domElements = (0, _toConsumableArray2["default"])(_ariaQuery.dom.keys());
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/aria-activedescendant-has-tabindex.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var attributes = node.attributes;
-
-        if ((0, _jsxAstUtils.getProp)(attributes, 'aria-activedescendant') === undefined) {
-          return;
-        }
-
-        var type = (0, _jsxAstUtils.elementType)(node); // Do not test higher level JSX components, as we do not know what
-        // low-level DOM element this maps to.
-
-        if (domElements.indexOf(type) === -1) {
-          return;
-        }
-
-        var tabIndex = (0, _getTabIndex["default"])((0, _jsxAstUtils.getProp)(attributes, 'tabIndex')); // If this is an interactive element, tabIndex must be either left
-        // unspecified allowing the inherent tabIndex to obtain or it must be
-        // zero (allowing for positive, even though that is not ideal). It cannot
-        // be given a negative value.
-
-        if ((0, _isInteractiveElement["default"])(type, attributes) && (tabIndex === undefined || tabIndex >= 0)) {
-          return;
-        }
-
-        if (tabIndex >= 0) {
-          return;
-        }
-
-        context.report({
-          node,
-          message: errorMessage
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-props.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-props.js
deleted file mode 100644
index c59d094..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-props.js
+++ /dev/null
@@ -1,64 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-var _getSuggestion = _interopRequireDefault(require("../util/getSuggestion"));
-
-/**
- * @fileoverview Enforce all aria-* properties are valid.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var ariaAttributes = (0, _toConsumableArray2["default"])(_ariaQuery.aria.keys());
-
-var errorMessage = function errorMessage(name) {
-  var suggestions = (0, _getSuggestion["default"])(name, ariaAttributes);
-  var message = "".concat(name, ": This attribute is an invalid ARIA attribute.");
-
-  if (suggestions.length > 0) {
-    return "".concat(message, " Did you mean to use ").concat(suggestions, "?");
-  }
-
-  return message;
-};
-
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/aria-props.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXAttribute: function JSXAttribute(attribute) {
-        var name = (0, _jsxAstUtils.propName)(attribute);
-        var normalizedName = name.toLowerCase(); // `aria` needs to be prefix of property.
-
-        if (normalizedName.indexOf('aria-') !== 0) {
-          return;
-        }
-
-        var isValid = ariaAttributes.indexOf(normalizedName) > -1;
-
-        if (isValid === false) {
-          context.report({
-            node: attribute,
-            message: errorMessage(name)
-          });
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-proptypes.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-proptypes.js
deleted file mode 100644
index a8ad261..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-proptypes.js
+++ /dev/null
@@ -1,124 +0,0 @@
-"use strict";
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Enforce ARIA state and property values are valid.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = function errorMessage(name, type, permittedValues) {
-  switch (type) {
-    case 'tristate':
-      return "The value for ".concat(name, " must be a boolean or the string \"mixed\".");
-
-    case 'token':
-      return "The value for ".concat(name, " must be a single token from the following: ").concat(permittedValues, ".");
-
-    case 'tokenlist':
-      return "The value for ".concat(name, " must be a list of one or more tokens from the following: ").concat(permittedValues, ".");
-
-    case 'idlist':
-      return "The value for ".concat(name, " must be a list of strings that represent DOM element IDs (idlist)");
-
-    case 'id':
-      return "The value for ".concat(name, " must be a string that represents a DOM element ID");
-
-    case 'boolean':
-    case 'string':
-    case 'integer':
-    case 'number':
-    default:
-      return "The value for ".concat(name, " must be a ").concat(type, ".");
-  }
-};
-
-var validityCheck = function validityCheck(value, expectedType, permittedValues) {
-  switch (expectedType) {
-    case 'boolean':
-      return typeof value === 'boolean';
-
-    case 'string':
-    case 'id':
-      return typeof value === 'string';
-
-    case 'tristate':
-      return typeof value === 'boolean' || value === 'mixed';
-
-    case 'integer':
-    case 'number':
-      // Booleans resolve to 0/1 values so hard check that it's not first.
-      // eslint-disable-next-line no-restricted-globals
-      return typeof value !== 'boolean' && isNaN(Number(value)) === false;
-
-    case 'token':
-      return permittedValues.indexOf(typeof value === 'string' ? value.toLowerCase() : value) > -1;
-
-    case 'idlist':
-      return typeof value === 'string' && value.split(' ').every(function (token) {
-        return validityCheck(token, 'id', []);
-      });
-
-    case 'tokenlist':
-      return typeof value === 'string' && value.split(' ').every(function (token) {
-        return permittedValues.indexOf(token.toLowerCase()) > -1;
-      });
-
-    default:
-      return false;
-  }
-};
-
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  validityCheck,
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/aria-proptypes.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXAttribute: function JSXAttribute(attribute) {
-        var name = (0, _jsxAstUtils.propName)(attribute);
-        var normalizedName = name.toLowerCase(); // Not a valid aria-* state or property.
-
-        if (normalizedName.indexOf('aria-') !== 0 || _ariaQuery.aria.get(normalizedName) === undefined) {
-          return;
-        } // Ignore the attribute if its value is null or undefined.
-
-
-        if ((0, _jsxAstUtils.getPropValue)(attribute) == null) return;
-        var value = (0, _jsxAstUtils.getLiteralPropValue)(attribute); // Ignore the attribute if its value is not a literal.
-
-        if (value === null) {
-          return;
-        } // These are the attributes of the property/state to check against.
-
-
-        var attributes = _ariaQuery.aria.get(normalizedName);
-
-        var permittedType = attributes.type;
-        var allowUndefined = attributes.allowUndefined || false;
-        var permittedValues = attributes.values || [];
-        var isValid = validityCheck(value, permittedType, permittedValues) || allowUndefined && value === undefined;
-
-        if (isValid) {
-          return;
-        }
-
-        context.report({
-          node: attribute,
-          message: errorMessage(name, permittedType, permittedValues)
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-role.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-role.js
deleted file mode 100644
index 76719ad..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-role.js
+++ /dev/null
@@ -1,84 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Enforce aria role attribute is valid.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'Elements with ARIA roles must use a valid, non-abstract ARIA role.';
-var schema = (0, _schemas.generateObjSchema)({
-  ignoreNonDOM: {
-    type: 'boolean',
-    "default": false
-  }
-});
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/aria-role.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXAttribute: function JSXAttribute(attribute) {
-        // Determine if ignoreNonDOM is set to true
-        // If true, then do not run rule.
-        var options = context.options[0] || {};
-        var ignoreNonDOM = !!options.ignoreNonDOM;
-
-        if (ignoreNonDOM) {
-          var type = (0, _jsxAstUtils.elementType)(attribute.parent);
-
-          if (!_ariaQuery.dom.get(type)) {
-            return;
-          }
-        } // Get prop name
-
-
-        var name = (0, _jsxAstUtils.propName)(attribute).toUpperCase();
-
-        if (name !== 'ROLE') {
-          return;
-        }
-
-        var value = (0, _jsxAstUtils.getLiteralPropValue)(attribute); // If value is undefined, then the role attribute will be dropped in the DOM.
-        // If value is null, then getLiteralAttributeValue is telling us that the
-        // value isn't in the form of a literal.
-
-        if (value === undefined || value === null) {
-          return;
-        }
-
-        var values = String(value).split(' ');
-        var validRoles = (0, _toConsumableArray2["default"])(_ariaQuery.roles.keys()).filter(function (role) {
-          return _ariaQuery.roles.get(role)["abstract"] === false;
-        });
-        var isValid = values.every(function (val) {
-          return validRoles.indexOf(val) > -1;
-        });
-
-        if (isValid === true) {
-          return;
-        }
-
-        context.report({
-          node: attribute,
-          message: errorMessage
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-unsupported-elements.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-unsupported-elements.js
deleted file mode 100644
index ad6a438..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/aria-unsupported-elements.js
+++ /dev/null
@@ -1,63 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Enforce that elements that do not support ARIA roles,
- *  states and properties do not have those attributes.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = function errorMessage(invalidProp) {
-  return "This element does not support ARIA roles, states and properties. Try removing the prop '".concat(invalidProp, "'.");
-};
-
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/aria-unsupported-elements.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var nodeType = (0, _jsxAstUtils.elementType)(node);
-        var nodeAttrs = _ariaQuery.dom.get(nodeType) || {};
-        var _nodeAttrs$reserved = nodeAttrs.reserved,
-            isReservedNodeType = _nodeAttrs$reserved === void 0 ? false : _nodeAttrs$reserved; // If it's not reserved, then it can have aria-* roles, states, and properties
-
-        if (isReservedNodeType === false) {
-          return;
-        }
-
-        var invalidAttributes = (0, _toConsumableArray2["default"])(_ariaQuery.aria.keys()).concat('role');
-        node.attributes.forEach(function (prop) {
-          if (prop.type === 'JSXSpreadAttribute') {
-            return;
-          }
-
-          var name = (0, _jsxAstUtils.propName)(prop).toLowerCase();
-
-          if (invalidAttributes.indexOf(name) > -1) {
-            context.report({
-              node,
-              message: errorMessage(name)
-            });
-          }
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/click-events-have-key-events.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/click-events-have-key-events.js
deleted file mode 100644
index d80d930..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/click-events-have-key-events.js
+++ /dev/null
@@ -1,76 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var _schemas = require("../util/schemas");
-
-var _isHiddenFromScreenReader = _interopRequireDefault(require("../util/isHiddenFromScreenReader"));
-
-var _isInteractiveElement = _interopRequireDefault(require("../util/isInteractiveElement"));
-
-var _isPresentationRole = _interopRequireDefault(require("../util/isPresentationRole"));
-
-/**
- * @fileoverview Enforce a clickable non-interactive element has at least 1 keyboard event listener.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'Visible, non-interactive elements with click handlers must have at least one keyboard listener.';
-var schema = (0, _schemas.generateObjSchema)();
-var domElements = (0, _toConsumableArray2["default"])(_ariaQuery.dom.keys());
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/click-events-have-key-events.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var props = node.attributes;
-
-        if ((0, _jsxAstUtils.getProp)(props, 'onclick') === undefined) {
-          return;
-        }
-
-        var type = (0, _jsxAstUtils.elementType)(node);
-        var requiredProps = ['onkeydown', 'onkeyup', 'onkeypress'];
-
-        if (!(0, _arrayIncludes["default"])(domElements, type)) {
-          // Do not test higher level JSX components, as we do not know what
-          // low-level DOM element this maps to.
-          return;
-        }
-
-        if ((0, _isHiddenFromScreenReader["default"])(type, props) || (0, _isPresentationRole["default"])(type, props)) {
-          return;
-        }
-
-        if ((0, _isInteractiveElement["default"])(type, props)) {
-          return;
-        }
-
-        if ((0, _jsxAstUtils.hasAnyProp)(props, requiredProps)) {
-          return;
-        } // Visible, non-interactive elements with click handlers require one keyboard event listener.
-
-
-        context.report({
-          node,
-          message: errorMessage
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/control-has-associated-label.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/control-has-associated-label.js
deleted file mode 100644
index 6afa79e..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/control-has-associated-label.js
+++ /dev/null
@@ -1,101 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var _schemas = require("../util/schemas");
-
-var _isDOMElement = _interopRequireDefault(require("../util/isDOMElement"));
-
-var _isInteractiveElement = _interopRequireDefault(require("../util/isInteractiveElement"));
-
-var _isInteractiveRole = _interopRequireDefault(require("../util/isInteractiveRole"));
-
-var _mayHaveAccessibleLabel = _interopRequireDefault(require("../util/mayHaveAccessibleLabel"));
-
-/**
- * @fileoverview Enforce controls are associated with a text label.
- * @author Jesse Beach
- *
- * 
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'A control must be associated with a text label.';
-var ignoreList = ['link'];
-var schema = (0, _schemas.generateObjSchema)({
-  labelAttributes: _schemas.arraySchema,
-  controlComponents: _schemas.arraySchema,
-  ignoreElements: _schemas.arraySchema,
-  ignoreRoles: _schemas.arraySchema,
-  depth: {
-    description: 'JSX tree depth limit to check for accessible label',
-    type: 'integer',
-    minimum: 0
-  }
-});
-module.exports = {
-  meta: {
-    docs: {},
-    schema: [schema]
-  },
-  create: function create(context) {
-    var options = context.options[0] || {};
-    var _options$labelAttribu = options.labelAttributes,
-        labelAttributes = _options$labelAttribu === void 0 ? [] : _options$labelAttribu,
-        _options$controlCompo = options.controlComponents,
-        controlComponents = _options$controlCompo === void 0 ? [] : _options$controlCompo,
-        _options$ignoreElemen = options.ignoreElements,
-        ignoreElements = _options$ignoreElemen === void 0 ? [] : _options$ignoreElemen,
-        _options$ignoreRoles = options.ignoreRoles,
-        ignoreRoles = _options$ignoreRoles === void 0 ? [] : _options$ignoreRoles;
-    var newIgnoreElements = new Set([].concat((0, _toConsumableArray2["default"])(ignoreElements), ignoreList));
-
-    var rule = function rule(node) {
-      var tag = (0, _jsxAstUtils.elementType)(node.openingElement);
-      var role = (0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(node.openingElement.attributes, 'role')); // Ignore interactive elements that might get their label from a source
-      // that cannot be discerned from static analysis, like
-      // <label><input />Save</label>
-
-      if (newIgnoreElements.has(tag)) {
-        return;
-      } // Ignore roles that are "interactive" but should not require a label.
-
-
-      if ((0, _arrayIncludes["default"])(ignoreRoles, role)) {
-        return;
-      }
-
-      var props = node.openingElement.attributes;
-      var nodeIsDOMElement = (0, _isDOMElement["default"])(tag);
-      var nodeIsInteractiveElement = (0, _isInteractiveElement["default"])(tag, props);
-      var nodeIsInteractiveRole = (0, _isInteractiveRole["default"])(tag, props);
-      var nodeIsControlComponent = controlComponents.indexOf(tag) > -1;
-      var hasAccessibleLabel = true;
-
-      if (nodeIsInteractiveElement || nodeIsDOMElement && nodeIsInteractiveRole || nodeIsControlComponent) {
-        // Prevent crazy recursion.
-        var recursionDepth = Math.min(options.depth === undefined ? 2 : options.depth, 25);
-        hasAccessibleLabel = (0, _mayHaveAccessibleLabel["default"])(node, recursionDepth, labelAttributes);
-      }
-
-      if (!hasAccessibleLabel) {
-        context.report({
-          node: node.openingElement,
-          message: errorMessage
-        });
-      }
-    }; // Create visitor selectors.
-
-
-    return {
-      JSXElement: rule
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/heading-has-content.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/heading-has-content.js
deleted file mode 100644
index b7c6cbf..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/heading-has-content.js
+++ /dev/null
@@ -1,59 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-var _hasAccessibleChild = _interopRequireDefault(require("../util/hasAccessibleChild"));
-
-var _isHiddenFromScreenReader = _interopRequireDefault(require("../util/isHiddenFromScreenReader"));
-
-/**
- * @fileoverview Enforce heading (h1, h2, etc) elements contain accessible content.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'Headings must have content and the content must be accessible by a screen reader.';
-var headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
-var schema = (0, _schemas.generateObjSchema)({
-  components: _schemas.arraySchema
-});
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/heading-has-content.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var options = context.options[0] || {};
-        var componentOptions = options.components || [];
-        var typeCheck = headings.concat(componentOptions);
-        var nodeType = (0, _jsxAstUtils.elementType)(node); // Only check 'h*' elements and custom types.
-
-        if (typeCheck.indexOf(nodeType) === -1) {
-          return;
-        }
-
-        if ((0, _hasAccessibleChild["default"])(node.parent)) {
-          return;
-        }
-
-        if ((0, _isHiddenFromScreenReader["default"])(nodeType, node.attributes)) {
-          return;
-        }
-
-        context.report({
-          node,
-          message: errorMessage
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/html-has-lang.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/html-has-lang.js
deleted file mode 100644
index 0ac48cb..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/html-has-lang.js
+++ /dev/null
@@ -1,45 +0,0 @@
-"use strict";
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Enforce html element has lang prop.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = '<html> elements must have the lang prop.';
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/html-has-lang.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var type = (0, _jsxAstUtils.elementType)(node);
-
-        if (type && type !== 'html') {
-          return;
-        }
-
-        var lang = (0, _jsxAstUtils.getPropValue)((0, _jsxAstUtils.getProp)(node.attributes, 'lang'));
-
-        if (lang) {
-          return;
-        }
-
-        context.report({
-          node,
-          message: errorMessage
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/iframe-has-title.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/iframe-has-title.js
deleted file mode 100644
index 7e65b5a..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/iframe-has-title.js
+++ /dev/null
@@ -1,45 +0,0 @@
-"use strict";
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Enforce iframe elements have a title attribute.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = '<iframe> elements must have a unique title property.';
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/iframe-has-title.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var type = (0, _jsxAstUtils.elementType)(node);
-
-        if (type && type !== 'iframe') {
-          return;
-        }
-
-        var title = (0, _jsxAstUtils.getPropValue)((0, _jsxAstUtils.getProp)(node.attributes, 'title'));
-
-        if (title && typeof title === 'string') {
-          return;
-        }
-
-        context.report({
-          node,
-          message: errorMessage
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/img-redundant-alt.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/img-redundant-alt.js
deleted file mode 100644
index 559a7fa..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/img-redundant-alt.js
+++ /dev/null
@@ -1,70 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-var _isHiddenFromScreenReader = _interopRequireDefault(require("../util/isHiddenFromScreenReader"));
-
-/**
- * @fileoverview Enforce img alt attribute does not have the word image, picture, or photo.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var REDUNDANT_WORDS = ['image', 'photo', 'picture'];
-var errorMessage = 'Redundant alt attribute. Screen-readers already announce `img` tags as an image. You don’t need to use the words `image`, `photo,` or `picture` (or any specified custom words) in the alt prop.';
-var schema = (0, _schemas.generateObjSchema)({
-  components: _schemas.arraySchema,
-  words: _schemas.arraySchema
-});
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/img-redundant-alt.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var options = context.options[0] || {};
-        var componentOptions = options.components || [];
-        var typesToValidate = ['img'].concat(componentOptions);
-        var nodeType = (0, _jsxAstUtils.elementType)(node); // Only check 'label' elements and custom types.
-
-        if (typesToValidate.indexOf(nodeType) === -1) {
-          return;
-        }
-
-        var altProp = (0, _jsxAstUtils.getProp)(node.attributes, 'alt'); // Return if alt prop is not present.
-
-        if (altProp === undefined) {
-          return;
-        }
-
-        var value = (0, _jsxAstUtils.getLiteralPropValue)(altProp);
-        var isVisible = (0, _isHiddenFromScreenReader["default"])(nodeType, node.attributes) === false;
-        var _options$words = options.words,
-            words = _options$words === void 0 ? [] : _options$words;
-        var redundantWords = REDUNDANT_WORDS.concat(words);
-
-        if (typeof value === 'string' && isVisible) {
-          var hasRedundancy = redundantWords.some(function (word) {
-            return Boolean(value.match(new RegExp("(?!{)\\b".concat(word, "\\b(?!})"), 'i')));
-          });
-
-          if (hasRedundancy === true) {
-            context.report({
-              node,
-              message: errorMessage
-            });
-          }
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/interactive-supports-focus.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/interactive-supports-focus.js
deleted file mode 100644
index 7817447..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/interactive-supports-focus.js
+++ /dev/null
@@ -1,99 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var _schemas = require("../util/schemas");
-
-var _isDisabledElement = _interopRequireDefault(require("../util/isDisabledElement"));
-
-var _isHiddenFromScreenReader = _interopRequireDefault(require("../util/isHiddenFromScreenReader"));
-
-var _isInteractiveElement = _interopRequireDefault(require("../util/isInteractiveElement"));
-
-var _isInteractiveRole = _interopRequireDefault(require("../util/isInteractiveRole"));
-
-var _isNonInteractiveElement = _interopRequireDefault(require("../util/isNonInteractiveElement"));
-
-var _isNonInteractiveRole = _interopRequireDefault(require("../util/isNonInteractiveRole"));
-
-var _isPresentationRole = _interopRequireDefault(require("../util/isPresentationRole"));
-
-var _getTabIndex = _interopRequireDefault(require("../util/getTabIndex"));
-
-/**
- * @fileoverview Enforce that elements with onClick handlers must be tabbable.
- * @author Ethan Cohen
- * 
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var schema = (0, _schemas.generateObjSchema)({
-  tabbable: (0, _schemas.enumArraySchema)((0, _toConsumableArray2["default"])(_ariaQuery.roles.keys()).filter(function (name) {
-    return !_ariaQuery.roles.get(name)["abstract"];
-  }).filter(function (name) {
-    return _ariaQuery.roles.get(name).superClass.some(function (klasses) {
-      return (0, _arrayIncludes["default"])(klasses, 'widget');
-    });
-  }))
-});
-var domElements = (0, _toConsumableArray2["default"])(_ariaQuery.dom.keys());
-var interactiveProps = [].concat((0, _toConsumableArray2["default"])(_jsxAstUtils.eventHandlersByType.mouse), (0, _toConsumableArray2["default"])(_jsxAstUtils.eventHandlersByType.keyboard));
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/interactive-supports-focus.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var tabbable = context.options && context.options[0] && context.options[0].tabbable || [];
-        var attributes = node.attributes;
-        var type = (0, _jsxAstUtils.elementType)(node);
-        var hasInteractiveProps = (0, _jsxAstUtils.hasAnyProp)(attributes, interactiveProps);
-        var hasTabindex = (0, _getTabIndex["default"])((0, _jsxAstUtils.getProp)(attributes, 'tabIndex')) !== undefined;
-
-        if (!(0, _arrayIncludes["default"])(domElements, type)) {
-          // Do not test higher level JSX components, as we do not know what
-          // low-level DOM element this maps to.
-          return;
-        }
-
-        if (!hasInteractiveProps || (0, _isDisabledElement["default"])(attributes) || (0, _isHiddenFromScreenReader["default"])(type, attributes) || (0, _isPresentationRole["default"])(type, attributes)) {
-          // Presentation is an intentional signal from the author that this
-          // element is not meant to be perceivable. For example, a click screen
-          // to close a dialog .
-          return;
-        }
-
-        if (hasInteractiveProps && (0, _isInteractiveRole["default"])(type, attributes) && !(0, _isInteractiveElement["default"])(type, attributes) && !(0, _isNonInteractiveElement["default"])(type, attributes) && !(0, _isNonInteractiveRole["default"])(type, attributes) && !hasTabindex) {
-          var role = (0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(attributes, 'role'));
-
-          if ((0, _arrayIncludes["default"])(tabbable, role)) {
-            // Always tabbable, tabIndex = 0
-            context.report({
-              node,
-              message: "Elements with the '".concat(role, "' interactive role must be tabbable.")
-            });
-          } else {
-            // Focusable, tabIndex = -1 or 0
-            context.report({
-              node,
-              message: "Elements with the '".concat(role, "' interactive role must be focusable.")
-            });
-          }
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/label-has-associated-control.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/label-has-associated-control.js
deleted file mode 100644
index edf91c8..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/label-has-associated-control.js
+++ /dev/null
@@ -1,118 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-var _mayContainChildComponent = _interopRequireDefault(require("../util/mayContainChildComponent"));
-
-var _mayHaveAccessibleLabel = _interopRequireDefault(require("../util/mayHaveAccessibleLabel"));
-
-/**
- * @fileoverview Enforce label tags have an associated control.
- * @author Jesse Beach
- *
- * 
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'A form label must be associated with a control.';
-var schema = (0, _schemas.generateObjSchema)({
-  labelComponents: _schemas.arraySchema,
-  labelAttributes: _schemas.arraySchema,
-  controlComponents: _schemas.arraySchema,
-  assert: {
-    description: 'Assert that the label has htmlFor, a nested label, both or either',
-    type: 'string',
-    "enum": ['htmlFor', 'nesting', 'both', 'either']
-  },
-  depth: {
-    description: 'JSX tree depth limit to check for accessible label',
-    type: 'integer',
-    minimum: 0
-  }
-});
-
-var validateId = function validateId(node) {
-  var htmlForAttr = (0, _jsxAstUtils.getProp)(node.attributes, 'htmlFor');
-  var htmlForValue = (0, _jsxAstUtils.getPropValue)(htmlForAttr);
-  return htmlForAttr !== false && !!htmlForValue;
-};
-
-module.exports = {
-  meta: {
-    docs: {},
-    schema: [schema]
-  },
-  create: function create(context) {
-    var options = context.options[0] || {};
-    var labelComponents = options.labelComponents || [];
-    var assertType = options.assert || 'either';
-    var componentNames = ['label'].concat(labelComponents);
-
-    var rule = function rule(node) {
-      if (componentNames.indexOf((0, _jsxAstUtils.elementType)(node.openingElement)) === -1) {
-        return;
-      }
-
-      var controlComponents = ['input', 'select', 'textarea'].concat(options.controlComponents || []); // Prevent crazy recursion.
-
-      var recursionDepth = Math.min(options.depth === undefined ? 2 : options.depth, 25);
-      var hasLabelId = validateId(node.openingElement); // Check for multiple control components.
-
-      var hasNestedControl = controlComponents.some(function (name) {
-        return (0, _mayContainChildComponent["default"])(node, name, recursionDepth);
-      });
-      var hasAccessibleLabel = (0, _mayHaveAccessibleLabel["default"])(node, recursionDepth, options.labelAttributes);
-
-      if (hasAccessibleLabel) {
-        switch (assertType) {
-          case 'htmlFor':
-            if (hasLabelId) {
-              return;
-            }
-
-            break;
-
-          case 'nesting':
-            if (hasNestedControl) {
-              return;
-            }
-
-            break;
-
-          case 'both':
-            if (hasLabelId && hasNestedControl) {
-              return;
-            }
-
-            break;
-
-          case 'either':
-            if (hasLabelId || hasNestedControl) {
-              return;
-            }
-
-            break;
-
-          default:
-            break;
-        }
-      } // htmlFor case
-
-
-      context.report({
-        node: node.openingElement,
-        message: errorMessage
-      });
-    }; // Create visitor selectors.
-
-
-    return {
-      JSXElement: rule
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/label-has-for.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/label-has-for.js
deleted file mode 100644
index baaece1..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/label-has-for.js
+++ /dev/null
@@ -1,153 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-var _hasAccessibleChild = _interopRequireDefault(require("../util/hasAccessibleChild"));
-
-/**
- * @fileoverview Enforce label tags have htmlFor attribute.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var enumValues = ['nesting', 'id'];
-var schema = {
-  type: 'object',
-  properties: {
-    components: _schemas.arraySchema,
-    required: {
-      oneOf: [{
-        type: 'string',
-        "enum": enumValues
-      }, (0, _schemas.generateObjSchema)({
-        some: (0, _schemas.enumArraySchema)(enumValues)
-      }, ['some']), (0, _schemas.generateObjSchema)({
-        every: (0, _schemas.enumArraySchema)(enumValues)
-      }, ['every'])]
-    },
-    allowChildren: {
-      type: 'boolean'
-    }
-  }
-}; // Breadth-first search, assuming that HTML for forms is shallow.
-
-function validateNesting(node) {
-  var queue = (0, _toConsumableArray2["default"])(node.parent.children);
-  var child;
-  var opener;
-
-  while (queue.length) {
-    child = queue.shift();
-    opener = child.openingElement;
-
-    if (child.type === 'JSXElement' && opener && (opener.name.name === 'input' || opener.name.name === 'textarea' || opener.name.name === 'select')) {
-      return true;
-    }
-
-    if (child.children) {
-      queue = queue.concat(child.children);
-    }
-  }
-
-  return false;
-}
-
-var validateId = function validateId(node) {
-  var htmlForAttr = (0, _jsxAstUtils.getProp)(node.attributes, 'htmlFor');
-  var htmlForValue = (0, _jsxAstUtils.getPropValue)(htmlForAttr);
-  return htmlForAttr !== false && !!htmlForValue;
-};
-
-var validate = function validate(node, required, allowChildren) {
-  if (allowChildren === true) {
-    return (0, _hasAccessibleChild["default"])(node.parent);
-  }
-
-  if (required === 'nesting') {
-    return validateNesting(node);
-  }
-
-  return validateId(node);
-};
-
-var getValidityStatus = function getValidityStatus(node, required, allowChildren) {
-  if (Array.isArray(required.some)) {
-    var _isValid = required.some.some(function (rule) {
-      return validate(node, rule, allowChildren);
-    });
-
-    var _message = !_isValid ? "Form label must have ANY of the following types of associated control: ".concat(required.some.join(', ')) : null;
-
-    return {
-      isValid: _isValid,
-      message: _message
-    };
-  }
-
-  if (Array.isArray(required.every)) {
-    var _isValid2 = required.every.every(function (rule) {
-      return validate(node, rule, allowChildren);
-    });
-
-    var _message2 = !_isValid2 ? "Form label must have ALL of the following types of associated control: ".concat(required.every.join(', ')) : null;
-
-    return {
-      isValid: _isValid2,
-      message: _message2
-    };
-  }
-
-  var isValid = validate(node, required, allowChildren);
-  var message = !isValid ? "Form label must have the following type of associated control: ".concat(required) : null;
-  return {
-    isValid,
-    message
-  };
-};
-
-module.exports = {
-  meta: {
-    deprecated: true,
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/label-has-for.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var options = context.options[0] || {};
-        var componentOptions = options.components || [];
-        var typesToValidate = ['label'].concat(componentOptions);
-        var nodeType = (0, _jsxAstUtils.elementType)(node); // Only check 'label' elements and custom types.
-
-        if (typesToValidate.indexOf(nodeType) === -1) {
-          return;
-        }
-
-        var required = options.required || {
-          every: ['nesting', 'id']
-        };
-        var allowChildren = options.allowChildren || false;
-
-        var _getValidityStatus = getValidityStatus(node, required, allowChildren),
-            isValid = _getValidityStatus.isValid,
-            message = _getValidityStatus.message;
-
-        if (!isValid) {
-          context.report({
-            node,
-            message
-          });
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/lang.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/lang.js
deleted file mode 100644
index d4d28ab..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/lang.js
+++ /dev/null
@@ -1,72 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-var _ISO = _interopRequireDefault(require("../util/attributes/ISO.json"));
-
-/**
- * @fileoverview Enforce lang attribute has a valid value.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'lang attribute must have a valid value.';
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/lang.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXAttribute: function JSXAttribute(node) {
-        var name = (0, _jsxAstUtils.propName)(node);
-
-        if (name && name.toUpperCase() !== 'LANG') {
-          return;
-        }
-
-        var parent = node.parent;
-        var type = (0, _jsxAstUtils.elementType)(parent);
-
-        if (type && type !== 'html') {
-          return;
-        }
-
-        var value = (0, _jsxAstUtils.getLiteralPropValue)(node); // Don't check identifiers
-
-        if (value === null) {
-          return;
-        }
-
-        if (value === undefined) {
-          context.report({
-            node,
-            message: errorMessage
-          });
-          return;
-        }
-
-        var hyphen = value.indexOf('-');
-        var lang = hyphen > -1 ? value.substring(0, hyphen) : value;
-        var country = hyphen > -1 ? value.substring(3) : undefined;
-
-        if (_ISO["default"].languages.indexOf(lang) > -1 && (country === undefined || _ISO["default"].countries.indexOf(country) > -1)) {
-          return;
-        }
-
-        context.report({
-          node,
-          message: errorMessage
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/media-has-caption.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/media-has-caption.js
deleted file mode 100644
index 2e7f794..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/media-has-caption.js
+++ /dev/null
@@ -1,98 +0,0 @@
-"use strict";
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview <audio> and <video> elements must have a <track> for captions.
- * @author Ethan Cohen
- * 
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'Media elements such as <audio> and <video> must have a <track> for captions.';
-var MEDIA_TYPES = ['audio', 'video'];
-var schema = (0, _schemas.generateObjSchema)({
-  audio: _schemas.arraySchema,
-  video: _schemas.arraySchema,
-  track: _schemas.arraySchema
-});
-
-var isMediaType = function isMediaType(context, type) {
-  var options = context.options[0] || {};
-  return MEDIA_TYPES.map(function (mediaType) {
-    return options[mediaType];
-  }).reduce(function (types, customComponent) {
-    return types.concat(customComponent);
-  }, MEDIA_TYPES).some(function (typeToCheck) {
-    return typeToCheck === type;
-  });
-};
-
-var isTrackType = function isTrackType(context, type) {
-  var options = context.options[0] || {};
-  return ['track'].concat(options.track || []).some(function (typeToCheck) {
-    return typeToCheck === type;
-  });
-};
-
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/media-has-caption.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXElement: function JSXElement(node) {
-        var element = node.openingElement;
-        var type = (0, _jsxAstUtils.elementType)(element);
-
-        if (!isMediaType(context, type)) {
-          return;
-        }
-
-        var mutedProp = (0, _jsxAstUtils.getProp)(element.attributes, 'muted');
-        var mutedPropVal = (0, _jsxAstUtils.getLiteralPropValue)(mutedProp);
-
-        if (mutedPropVal === true) {
-          return;
-        } // $FlowFixMe https://github.com/facebook/flow/issues/1414
-
-
-        var trackChildren = node.children.filter(function (child) {
-          if (child.type !== 'JSXElement') {
-            return false;
-          } // $FlowFixMe https://github.com/facebook/flow/issues/1414
-
-
-          return isTrackType(context, (0, _jsxAstUtils.elementType)(child.openingElement));
-        });
-
-        if (trackChildren.length === 0) {
-          context.report({
-            node: element,
-            message: errorMessage
-          });
-          return;
-        }
-
-        var hasCaption = trackChildren.some(function (track) {
-          var kindProp = (0, _jsxAstUtils.getProp)(track.openingElement.attributes, 'kind');
-          var kindPropValue = (0, _jsxAstUtils.getLiteralPropValue)(kindProp) || '';
-          return kindPropValue.toLowerCase() === 'captions';
-        });
-
-        if (!hasCaption) {
-          context.report({
-            node: element,
-            message: errorMessage
-          });
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/mouse-events-have-key-events.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/mouse-events-have-key-events.js
deleted file mode 100644
index 2ebe6c5..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/mouse-events-have-key-events.js
+++ /dev/null
@@ -1,63 +0,0 @@
-"use strict";
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Enforce onmouseover/onmouseout are
- *  accompanied by onfocus/onblur.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var mouseOverErrorMessage = 'onMouseOver must be accompanied by onFocus for accessibility.';
-var mouseOutErrorMessage = 'onMouseOut must be accompanied by onBlur for accessibility.';
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/mouse-events-have-key-events.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var attributes = node.attributes; // Check onmouseover / onfocus pairing.
-
-        var onMouseOver = (0, _jsxAstUtils.getProp)(attributes, 'onMouseOver');
-        var onMouseOverValue = (0, _jsxAstUtils.getPropValue)(onMouseOver);
-
-        if (onMouseOver && onMouseOverValue != null) {
-          var hasOnFocus = (0, _jsxAstUtils.getProp)(attributes, 'onFocus');
-          var onFocusValue = (0, _jsxAstUtils.getPropValue)(hasOnFocus);
-
-          if (hasOnFocus === false || onFocusValue === null || onFocusValue === undefined) {
-            context.report({
-              node,
-              message: mouseOverErrorMessage
-            });
-          }
-        } // Checkout onmouseout / onblur pairing
-
-
-        var onMouseOut = (0, _jsxAstUtils.getProp)(attributes, 'onMouseOut');
-        var onMouseOutValue = (0, _jsxAstUtils.getPropValue)(onMouseOut);
-
-        if (onMouseOut && onMouseOutValue != null) {
-          var hasOnBlur = (0, _jsxAstUtils.getProp)(attributes, 'onBlur');
-          var onBlurValue = (0, _jsxAstUtils.getPropValue)(hasOnBlur);
-
-          if (hasOnBlur === false || onBlurValue === null || onBlurValue === undefined) {
-            context.report({
-              node,
-              message: mouseOutErrorMessage
-            });
-          }
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-access-key.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-access-key.js
deleted file mode 100644
index 5bb1dca..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-access-key.js
+++ /dev/null
@@ -1,38 +0,0 @@
-"use strict";
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Enforce no accesskey attribute on element.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'No access key attribute allowed. Inconsistencies between keyboard shortcuts and keyboard comments used by screenreader and keyboard only users create a11y complications.';
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/no-access-key.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var accessKey = (0, _jsxAstUtils.getProp)(node.attributes, 'accesskey');
-        var accessKeyValue = (0, _jsxAstUtils.getPropValue)(accessKey);
-
-        if (accessKey && accessKeyValue) {
-          context.report({
-            node,
-            message: errorMessage
-          });
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-autofocus.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-autofocus.js
deleted file mode 100644
index 8afb38f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-autofocus.js
+++ /dev/null
@@ -1,56 +0,0 @@
-"use strict";
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _ariaQuery = require("aria-query");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Enforce autoFocus prop is not used.
- * @author Ethan Cohen <@evcohen>
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'The autoFocus prop should not be used, as it can reduce usability and accessibility for users.';
-var schema = (0, _schemas.generateObjSchema)({
-  ignoreNonDOM: {
-    type: 'boolean',
-    "default": false
-  }
-});
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/no-autofocus.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXAttribute: function JSXAttribute(attribute) {
-        // Determine if ignoreNonDOM is set to true
-        // If true, then do not run rule.
-        var options = context.options[0] || {};
-        var ignoreNonDOM = !!options.ignoreNonDOM;
-
-        if (ignoreNonDOM) {
-          var type = (0, _jsxAstUtils.elementType)(attribute.parent);
-
-          if (!_ariaQuery.dom.get(type)) {
-            return;
-          }
-        } // Don't normalize, since React only recognizes autoFocus on low-level DOM elements.
-
-
-        if ((0, _jsxAstUtils.propName)(attribute) === 'autoFocus') {
-          context.report({
-            node: attribute,
-            message: errorMessage
-          });
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-distracting-elements.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-distracting-elements.js
deleted file mode 100644
index da04a5e..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-distracting-elements.js
+++ /dev/null
@@ -1,48 +0,0 @@
-"use strict";
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Enforce distracting elements are not used.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = function errorMessage(element) {
-  return "Do not use <".concat(element, "> elements as they can create visual accessibility issues and are deprecated.");
-};
-
-var DEFAULT_ELEMENTS = ['marquee', 'blink'];
-var schema = (0, _schemas.generateObjSchema)({
-  elements: (0, _schemas.enumArraySchema)(DEFAULT_ELEMENTS)
-});
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/no-distracting-elements.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var options = context.options[0] || {};
-        var elementOptions = options.elements || DEFAULT_ELEMENTS;
-        var type = (0, _jsxAstUtils.elementType)(node);
-        var distractingElement = elementOptions.find(function (element) {
-          return type === element;
-        });
-
-        if (distractingElement) {
-          context.report({
-            node,
-            message: errorMessage(distractingElement)
-          });
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-interactive-element-to-noninteractive-role.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-interactive-element-to-noninteractive-role.js
deleted file mode 100644
index 02d5fce..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-interactive-element-to-noninteractive-role.js
+++ /dev/null
@@ -1,87 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var _has = _interopRequireDefault(require("has"));
-
-var _isInteractiveElement = _interopRequireDefault(require("../util/isInteractiveElement"));
-
-var _isNonInteractiveRole = _interopRequireDefault(require("../util/isNonInteractiveRole"));
-
-var _isPresentationRole = _interopRequireDefault(require("../util/isPresentationRole"));
-
-/**
- * @fileoverview Disallow inherently interactive elements to be assigned
- * non-interactive roles.
- * @author Jesse Beach
- * 
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'Interactive elements should not be assigned non-interactive roles.';
-var domElements = (0, _toConsumableArray2["default"])(_ariaQuery.dom.keys());
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/no-interactive-element-to-noninteractive-role.md'
-    },
-    schema: [{
-      type: 'object',
-      additionalProperties: {
-        type: 'array',
-        items: {
-          type: 'string'
-        },
-        uniqueItems: true
-      }
-    }]
-  },
-  create: function create(context) {
-    var options = context.options;
-    return {
-      JSXAttribute: function JSXAttribute(attribute) {
-        var attributeName = (0, _jsxAstUtils.propName)(attribute); // $FlowFixMe: [TODO] Mark propName as a JSXIdentifier, not a string.
-
-        if (attributeName !== 'role') {
-          return;
-        }
-
-        var node = attribute.parent;
-        var attributes = node.attributes;
-        var type = (0, _jsxAstUtils.elementType)(node);
-        var role = (0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(node.attributes, 'role'));
-
-        if (!(0, _arrayIncludes["default"])(domElements, type)) {
-          // Do not test higher level JSX components, as we do not know what
-          // low-level DOM element this maps to.
-          return;
-        } // Allow overrides from rule configuration for specific elements and
-        // roles.
-
-
-        var allowedRoles = options[0] || {};
-
-        if ((0, _has["default"])(allowedRoles, type) && (0, _arrayIncludes["default"])(allowedRoles[type], role)) {
-          return;
-        }
-
-        if ((0, _isInteractiveElement["default"])(type, attributes) && ((0, _isNonInteractiveRole["default"])(type, attributes) || (0, _isPresentationRole["default"])(type, attributes))) {
-          // Visible, non-interactive elements should not have an interactive handler.
-          context.report({
-            node: attribute,
-            message: errorMessage
-          });
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-noninteractive-element-interactions.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-noninteractive-element-interactions.js
deleted file mode 100644
index b3b80e1..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-noninteractive-element-interactions.js
+++ /dev/null
@@ -1,97 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var _has = _interopRequireDefault(require("has"));
-
-var _schemas = require("../util/schemas");
-
-var _isAbstractRole = _interopRequireDefault(require("../util/isAbstractRole"));
-
-var _isHiddenFromScreenReader = _interopRequireDefault(require("../util/isHiddenFromScreenReader"));
-
-var _isInteractiveElement = _interopRequireDefault(require("../util/isInteractiveElement"));
-
-var _isInteractiveRole = _interopRequireDefault(require("../util/isInteractiveRole"));
-
-var _isNonInteractiveElement = _interopRequireDefault(require("../util/isNonInteractiveElement"));
-
-var _isNonInteractiveRole = _interopRequireDefault(require("../util/isNonInteractiveRole"));
-
-var _isPresentationRole = _interopRequireDefault(require("../util/isPresentationRole"));
-
-/**
- * @fileoverview Enforce non-interactive elements have no interactive handlers.
- * @author Jese Beach
- * 
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'Non-interactive elements should not be assigned mouse or keyboard event listeners.';
-var domElements = (0, _toConsumableArray2["default"])(_ariaQuery.dom.keys());
-var defaultInteractiveProps = [].concat((0, _toConsumableArray2["default"])(_jsxAstUtils.eventHandlersByType.focus), (0, _toConsumableArray2["default"])(_jsxAstUtils.eventHandlersByType.image), (0, _toConsumableArray2["default"])(_jsxAstUtils.eventHandlersByType.keyboard), (0, _toConsumableArray2["default"])(_jsxAstUtils.eventHandlersByType.mouse));
-var schema = (0, _schemas.generateObjSchema)({
-  handlers: _schemas.arraySchema
-});
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/no-noninteractive-element-interactions.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    var options = context.options;
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var attributes = node.attributes;
-        var type = (0, _jsxAstUtils.elementType)(node);
-        var config = options[0] || {};
-        var interactiveProps = config.handlers || defaultInteractiveProps; // Allow overrides from rule configuration for specific elements and roles.
-
-        if ((0, _has["default"])(config, type)) {
-          attributes = attributes.filter(function (attr) {
-            return attr.type !== 'JSXSpreadAttribute' && !(0, _arrayIncludes["default"])(config[type], (0, _jsxAstUtils.propName)(attr));
-          });
-        }
-
-        var hasInteractiveProps = interactiveProps.some(function (prop) {
-          return (0, _jsxAstUtils.hasProp)(attributes, prop) && (0, _jsxAstUtils.getPropValue)((0, _jsxAstUtils.getProp)(attributes, prop)) != null;
-        });
-
-        if (!(0, _arrayIncludes["default"])(domElements, type)) {
-          // Do not test higher level JSX components, as we do not know what
-          // low-level DOM element this maps to.
-          return;
-        }
-
-        if (!hasInteractiveProps || (0, _isHiddenFromScreenReader["default"])(type, attributes) || (0, _isPresentationRole["default"])(type, attributes)) {
-          // Presentation is an intentional signal from the author that this
-          // element is not meant to be perceivable. For example, a click screen
-          // to close a dialog .
-          return;
-        }
-
-        if ((0, _isInteractiveElement["default"])(type, attributes) || (0, _isInteractiveRole["default"])(type, attributes) || !(0, _isNonInteractiveElement["default"])(type, attributes) && !(0, _isNonInteractiveRole["default"])(type, attributes) || (0, _isAbstractRole["default"])(type, attributes)) {
-          // This rule has no opinion about abtract roles.
-          return;
-        } // Visible, non-interactive elements should not have an interactive handler.
-
-
-        context.report({
-          node,
-          message: errorMessage
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-noninteractive-element-to-interactive-role.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-noninteractive-element-to-interactive-role.js
deleted file mode 100644
index d19973f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-noninteractive-element-to-interactive-role.js
+++ /dev/null
@@ -1,86 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var _has = _interopRequireDefault(require("has"));
-
-var _getExplicitRole = _interopRequireDefault(require("../util/getExplicitRole"));
-
-var _isNonInteractiveElement = _interopRequireDefault(require("../util/isNonInteractiveElement"));
-
-var _isInteractiveRole = _interopRequireDefault(require("../util/isInteractiveRole"));
-
-/**
- * @fileoverview Disallow inherently non-interactive elements to be assigned
- * interactive roles.
- * @author Jesse Beach
- * 
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'Non-interactive elements should not be assigned interactive roles.';
-var domElements = (0, _toConsumableArray2["default"])(_ariaQuery.dom.keys());
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/no-noninteractive-element-to-interactive-role.md'
-    },
-    schema: [{
-      type: 'object',
-      additionalProperties: {
-        type: 'array',
-        items: {
-          type: 'string'
-        },
-        uniqueItems: true
-      }
-    }]
-  },
-  create: function create(context) {
-    var options = context.options;
-    return {
-      JSXAttribute: function JSXAttribute(attribute) {
-        var attributeName = (0, _jsxAstUtils.propName)(attribute); // $FlowFixMe: [TODO] Mark propName as a JSXIdentifier, not a string.
-
-        if (attributeName !== 'role') {
-          return;
-        }
-
-        var node = attribute.parent;
-        var attributes = node.attributes;
-        var type = (0, _jsxAstUtils.elementType)(node);
-        var role = (0, _getExplicitRole["default"])(type, node.attributes);
-
-        if (!(0, _arrayIncludes["default"])(domElements, type)) {
-          // Do not test higher level JSX components, as we do not know what
-          // low-level DOM element this maps to.
-          return;
-        } // Allow overrides from rule configuration for specific elements and
-        // roles.
-
-
-        var allowedRoles = options[0] || {};
-
-        if ((0, _has["default"])(allowedRoles, type) && (0, _arrayIncludes["default"])(allowedRoles[type], role)) {
-          return;
-        }
-
-        if ((0, _isNonInteractiveElement["default"])(type, attributes) && (0, _isInteractiveRole["default"])(type, attributes)) {
-          context.report({
-            node: attribute,
-            message: errorMessage
-          });
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-noninteractive-tabindex.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-noninteractive-tabindex.js
deleted file mode 100644
index 69049ab..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-noninteractive-tabindex.js
+++ /dev/null
@@ -1,99 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var _isInteractiveElement = _interopRequireDefault(require("../util/isInteractiveElement"));
-
-var _isInteractiveRole = _interopRequireDefault(require("../util/isInteractiveRole"));
-
-var _isNonLiteralProperty = _interopRequireDefault(require("../util/isNonLiteralProperty"));
-
-var _schemas = require("../util/schemas");
-
-var _getTabIndex = _interopRequireDefault(require("../util/getTabIndex"));
-
-/**
- * @fileoverview Disallow tabindex on static and noninteractive elements
- * @author jessebeach
- * 
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = '`tabIndex` should only be declared on interactive elements.';
-var schema = (0, _schemas.generateObjSchema)({
-  roles: (0, _objectSpread2["default"])({}, _schemas.arraySchema, {
-    description: 'An array of ARIA roles'
-  }),
-  tags: (0, _objectSpread2["default"])({}, _schemas.arraySchema, {
-    description: 'An array of HTML tag names'
-  })
-});
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/no-noninteractive-tabindex.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    var options = context.options;
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var type = (0, _jsxAstUtils.elementType)(node);
-        var attributes = node.attributes;
-        var tabIndexProp = (0, _jsxAstUtils.getProp)(attributes, 'tabIndex');
-        var tabIndex = (0, _getTabIndex["default"])(tabIndexProp); // Early return;
-
-        if (typeof tabIndex === 'undefined') {
-          return;
-        }
-
-        var role = (0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(node.attributes, 'role'));
-
-        if (!_ariaQuery.dom.has(type)) {
-          // Do not test higher level JSX components, as we do not know what
-          // low-level DOM element this maps to.
-          return;
-        } // Allow for configuration overrides.
-
-
-        var _ref = options[0] || {},
-            tags = _ref.tags,
-            roles = _ref.roles,
-            allowExpressionValues = _ref.allowExpressionValues;
-
-        if (tags && (0, _arrayIncludes["default"])(tags, type)) {
-          return;
-        }
-
-        if (roles && (0, _arrayIncludes["default"])(roles, role)) {
-          return;
-        }
-
-        if (allowExpressionValues === true && (0, _isNonLiteralProperty["default"])(attributes, 'role')) {
-          return;
-        }
-
-        if ((0, _isInteractiveElement["default"])(type, attributes) || (0, _isInteractiveRole["default"])(type, attributes)) {
-          return;
-        }
-
-        if (tabIndex >= 0) {
-          context.report({
-            node: tabIndexProp,
-            message: errorMessage
-          });
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-onchange.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-onchange.js
deleted file mode 100644
index adfbfcc..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-onchange.js
+++ /dev/null
@@ -1,45 +0,0 @@
-"use strict";
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Enforce usage of onBlur over onChange for accessibility.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'onBlur must be used instead of onchange, unless absolutely necessary and it causes no negative consequences for keyboard only or screen reader users.';
-var applicableTypes = ['select', 'option'];
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/no-onchange.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var nodeType = (0, _jsxAstUtils.elementType)(node);
-
-        if (applicableTypes.indexOf(nodeType) === -1) {
-          return;
-        }
-
-        var onChange = (0, _jsxAstUtils.getProp)(node.attributes, 'onChange');
-        var hasOnBlur = (0, _jsxAstUtils.getProp)(node.attributes, 'onBlur') !== undefined;
-
-        if (onChange && !hasOnBlur) {
-          context.report({
-            node,
-            message: errorMessage
-          });
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-redundant-roles.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-redundant-roles.js
deleted file mode 100644
index 6f65ca1..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-redundant-roles.js
+++ /dev/null
@@ -1,81 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var _has = _interopRequireDefault(require("has"));
-
-var _getExplicitRole = _interopRequireDefault(require("../util/getExplicitRole"));
-
-var _getImplicitRole = _interopRequireDefault(require("../util/getImplicitRole"));
-
-/**
- * @fileoverview Enforce explicit role property is not the
- * same as implicit/default role property on element.
- * @author Ethan Cohen <@evcohen>
- * 
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = function errorMessage(element, implicitRole) {
-  return "The element ".concat(element, " has an implicit role of ").concat(implicitRole, ". Defining this explicitly is redundant and should be avoided.");
-};
-
-var DEFAULT_ROLE_EXCEPTIONS = {
-  nav: ['navigation']
-};
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/no-redundant-roles.md'
-    },
-    schema: [{
-      type: 'object',
-      additionalProperties: {
-        type: 'array',
-        items: {
-          type: 'string'
-        },
-        uniqueItems: true
-      }
-    }]
-  },
-  create: function create(context) {
-    var options = context.options;
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var type = (0, _jsxAstUtils.elementType)(node);
-        var implicitRole = (0, _getImplicitRole["default"])(type, node.attributes);
-        var explicitRole = (0, _getExplicitRole["default"])(type, node.attributes);
-
-        if (!implicitRole || !explicitRole) {
-          return;
-        }
-
-        if (implicitRole === explicitRole) {
-          var allowedRedundantRoles = options[0] || {};
-          var redundantRolesForElement;
-
-          if ((0, _has["default"])(allowedRedundantRoles, type)) {
-            redundantRolesForElement = allowedRedundantRoles[type];
-          } else {
-            redundantRolesForElement = DEFAULT_ROLE_EXCEPTIONS[type] || [];
-          }
-
-          if ((0, _arrayIncludes["default"])(redundantRolesForElement, implicitRole)) {
-            return;
-          }
-
-          context.report({
-            node,
-            message: errorMessage(type, implicitRole.toLowerCase())
-          });
-        }
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-static-element-interactions.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-static-element-interactions.js
deleted file mode 100644
index 0b26449..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/no-static-element-interactions.js
+++ /dev/null
@@ -1,99 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var _schemas = require("../util/schemas");
-
-var _isAbstractRole = _interopRequireDefault(require("../util/isAbstractRole"));
-
-var _isHiddenFromScreenReader = _interopRequireDefault(require("../util/isHiddenFromScreenReader"));
-
-var _isInteractiveElement = _interopRequireDefault(require("../util/isInteractiveElement"));
-
-var _isInteractiveRole = _interopRequireDefault(require("../util/isInteractiveRole"));
-
-var _isNonInteractiveElement = _interopRequireDefault(require("../util/isNonInteractiveElement"));
-
-var _isNonInteractiveRole = _interopRequireDefault(require("../util/isNonInteractiveRole"));
-
-var _isNonLiteralProperty = _interopRequireDefault(require("../util/isNonLiteralProperty"));
-
-var _isPresentationRole = _interopRequireDefault(require("../util/isPresentationRole"));
-
-/**
- * @fileoverview Enforce static elements have no interactive handlers.
- * @author Ethan Cohen
- * 
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'Static HTML elements with event handlers require a role.';
-var domElements = (0, _toConsumableArray2["default"])(_ariaQuery.dom.keys());
-var defaultInteractiveProps = [].concat((0, _toConsumableArray2["default"])(_jsxAstUtils.eventHandlersByType.focus), (0, _toConsumableArray2["default"])(_jsxAstUtils.eventHandlersByType.keyboard), (0, _toConsumableArray2["default"])(_jsxAstUtils.eventHandlersByType.mouse));
-var schema = (0, _schemas.generateObjSchema)({
-  handlers: _schemas.arraySchema
-});
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/no-static-element-interactions.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    var options = context.options;
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        var attributes = node.attributes;
-        var type = (0, _jsxAstUtils.elementType)(node);
-
-        var _ref = options[0] || {},
-            allowExpressionValues = _ref.allowExpressionValues,
-            _ref$handlers = _ref.handlers,
-            handlers = _ref$handlers === void 0 ? defaultInteractiveProps : _ref$handlers;
-
-        var hasInteractiveProps = handlers.some(function (prop) {
-          return (0, _jsxAstUtils.hasProp)(attributes, prop) && (0, _jsxAstUtils.getPropValue)((0, _jsxAstUtils.getProp)(attributes, prop)) != null;
-        });
-
-        if (!(0, _arrayIncludes["default"])(domElements, type)) {
-          // Do not test higher level JSX components, as we do not know what
-          // low-level DOM element this maps to.
-          return;
-        }
-
-        if (!hasInteractiveProps || (0, _isHiddenFromScreenReader["default"])(type, attributes) || (0, _isPresentationRole["default"])(type, attributes)) {
-          // Presentation is an intentional signal from the author that this
-          // element is not meant to be perceivable. For example, a click screen
-          // to close a dialog .
-          return;
-        }
-
-        if ((0, _isInteractiveElement["default"])(type, attributes) || (0, _isInteractiveRole["default"])(type, attributes) || (0, _isNonInteractiveElement["default"])(type, attributes) || (0, _isNonInteractiveRole["default"])(type, attributes) || (0, _isAbstractRole["default"])(type, attributes)) {
-          // This rule has no opinion about abstract roles.
-          return;
-        }
-
-        if (allowExpressionValues === true && (0, _isNonLiteralProperty["default"])(attributes, 'role')) {
-          // This rule has no opinion about non-literal roles.
-          return;
-        } // Visible, non-interactive elements should not have an interactive handler.
-
-
-        context.report({
-          node,
-          message: errorMessage
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/role-has-required-aria-props.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/role-has-required-aria-props.js
deleted file mode 100644
index 453c3e1..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/role-has-required-aria-props.js
+++ /dev/null
@@ -1,92 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-var _isSemanticRoleElement = _interopRequireDefault(require("../util/isSemanticRoleElement"));
-
-/**
- * @fileoverview Enforce that elements with ARIA roles must
- *  have all required attributes for that role.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = function errorMessage(role, requiredProps) {
-  return "Elements with the ARIA role \"".concat(role, "\" must have the following attributes defined: ").concat(String(requiredProps).toLowerCase());
-};
-
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/role-has-required-aria-props.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXAttribute: function JSXAttribute(attribute) {
-        var name = (0, _jsxAstUtils.propName)(attribute).toLowerCase();
-
-        if (name !== 'role') {
-          return;
-        }
-
-        var type = (0, _jsxAstUtils.elementType)(attribute.parent);
-
-        if (!_ariaQuery.dom.get(type)) {
-          return;
-        }
-
-        var roleAttrValue = (0, _jsxAstUtils.getLiteralPropValue)(attribute);
-        var attributes = attribute.parent.attributes; // If value is undefined, then the role attribute will be dropped in the DOM.
-        // If value is null, then getLiteralAttributeValue is telling us
-        // that the value isn't in the form of a literal.
-
-        if (roleAttrValue === undefined || roleAttrValue === null) {
-          return;
-        }
-
-        var normalizedValues = String(roleAttrValue).toLowerCase().split(' ');
-        var validRoles = normalizedValues.filter(function (val) {
-          return (0, _toConsumableArray2["default"])(_ariaQuery.roles.keys()).indexOf(val) > -1;
-        }); // Check semantic DOM elements
-        // For example, <input type="checkbox" role="switch" />
-
-        if ((0, _isSemanticRoleElement["default"])(type, attributes)) {
-          return;
-        } // Check arbitrary DOM elements
-
-
-        validRoles.forEach(function (role) {
-          var _roles$get = _ariaQuery.roles.get(role),
-              requiredPropKeyValues = _roles$get.requiredProps;
-
-          var requiredProps = Object.keys(requiredPropKeyValues);
-
-          if (requiredProps.length > 0) {
-            var hasRequiredProps = requiredProps.every(function (prop) {
-              return (0, _jsxAstUtils.getProp)(attribute.parent.attributes, prop);
-            });
-
-            if (hasRequiredProps === false) {
-              context.report({
-                node: attribute,
-                message: errorMessage(role.toLowerCase(), requiredProps)
-              });
-            }
-          }
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/role-supports-aria-props.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/role-supports-aria-props.js
deleted file mode 100644
index 8f05107..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/role-supports-aria-props.js
+++ /dev/null
@@ -1,79 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-var _getImplicitRole = _interopRequireDefault(require("../util/getImplicitRole"));
-
-/**
- * @fileoverview Enforce that elements with explicit or implicit roles defined contain only
- * `aria-*` properties supported by that `role`.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = function errorMessage(attr, role, tag, isImplicit) {
-  if (isImplicit) {
-    return "The attribute ".concat(attr, " is not supported by the role ").concat(role, ". This role is implicit on the element ").concat(tag, ".");
-  }
-
-  return "The attribute ".concat(attr, " is not supported by the role ").concat(role, ".");
-};
-
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/role-supports-aria-props.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXOpeningElement: function JSXOpeningElement(node) {
-        // If role is not explicitly defined, then try and get its implicit role.
-        var type = (0, _jsxAstUtils.elementType)(node);
-        var role = (0, _jsxAstUtils.getProp)(node.attributes, 'role');
-        var roleValue = role ? (0, _jsxAstUtils.getLiteralPropValue)(role) : (0, _getImplicitRole["default"])(type, node.attributes);
-        var isImplicit = roleValue && role === undefined; // If there is no explicit or implicit role, then assume that the element
-        // can handle the global set of aria-* properties.
-        // This actually isn't true - should fix in future release.
-
-        if (typeof roleValue !== 'string' || _ariaQuery.roles.get(roleValue) === undefined) {
-          return;
-        } // Make sure it has no aria-* properties defined outside of its property set.
-
-
-        var _roles$get = _ariaQuery.roles.get(roleValue),
-            propKeyValues = _roles$get.props;
-
-        var propertySet = Object.keys(propKeyValues);
-        var invalidAriaPropsForRole = (0, _toConsumableArray2["default"])(_ariaQuery.aria.keys()).filter(function (attribute) {
-          return propertySet.indexOf(attribute) === -1;
-        });
-        node.attributes.forEach(function (prop) {
-          // Ignore the attribute if its value is null or undefined.
-          if ((0, _jsxAstUtils.getPropValue)(prop) == null) return; // Ignore the attribute if it's a spread.
-
-          if (prop.type === 'JSXSpreadAttribute') return;
-          var name = (0, _jsxAstUtils.propName)(prop);
-
-          if (invalidAriaPropsForRole.indexOf(name) > -1) {
-            context.report({
-              node,
-              message: errorMessage(name, roleValue, type, isImplicit)
-            });
-          }
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/scope.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/scope.js
deleted file mode 100644
index 5de9e30..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/scope.js
+++ /dev/null
@@ -1,53 +0,0 @@
-"use strict";
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Enforce scope prop is only used on <th> elements.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'The scope prop can only be used on <th> elements.';
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/scope.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXAttribute: function JSXAttribute(node) {
-        var name = (0, _jsxAstUtils.propName)(node);
-
-        if (name && name.toUpperCase() !== 'SCOPE') {
-          return;
-        }
-
-        var parent = node.parent;
-        var tagName = (0, _jsxAstUtils.elementType)(parent); // Do not test higher level JSX components, as we do not know what
-        // low-level DOM element this maps to.
-
-        if (!_ariaQuery.dom.has(tagName)) {
-          return;
-        }
-
-        if (tagName && tagName.toUpperCase() === 'TH') {
-          return;
-        }
-
-        context.report({
-          node,
-          message: errorMessage
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/rules/tabindex-no-positive.js b/node_modules/eslint-plugin-jsx-a11y/lib/rules/tabindex-no-positive.js
deleted file mode 100644
index 87cd7f2..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/rules/tabindex-no-positive.js
+++ /dev/null
@@ -1,46 +0,0 @@
-"use strict";
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _schemas = require("../util/schemas");
-
-/**
- * @fileoverview Enforce tabIndex value is not greater than zero.
- * @author Ethan Cohen
- */
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-var errorMessage = 'Avoid positive integer values for tabIndex.';
-var schema = (0, _schemas.generateObjSchema)();
-module.exports = {
-  meta: {
-    docs: {
-      url: 'https://github.com/evcohen/eslint-plugin-jsx-a11y/tree/master/docs/rules/tabindex-no-positive.md'
-    },
-    schema: [schema]
-  },
-  create: function create(context) {
-    return {
-      JSXAttribute: function JSXAttribute(attribute) {
-        var name = (0, _jsxAstUtils.propName)(attribute).toUpperCase(); // Check if tabIndex is the attribute
-
-        if (name !== 'TABINDEX') {
-          return;
-        } // Only check literals because we can't infer values from certain expressions.
-
-
-        var value = Number((0, _jsxAstUtils.getLiteralPropValue)(attribute)); // eslint-disable-next-line no-restricted-globals
-
-        if (isNaN(value) || value <= 0) {
-          return;
-        }
-
-        context.report({
-          node: attribute,
-          message: errorMessage
-        });
-      }
-    };
-  }
-};
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/attributes/ISO.json b/node_modules/eslint-plugin-jsx-a11y/lib/util/attributes/ISO.json
deleted file mode 100644
index 4beb9b5..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/attributes/ISO.json
+++ /dev/null
@@ -1,390 +0,0 @@
-{
-  "countries": [
-    "AF",
-    "AL",
-    "DZ",
-    "AS",
-    "AD",
-    "AO",
-    "AI",
-    "AQ",
-    "AG",
-    "AR",
-    "AM",
-    "AW",
-    "AU",
-    "AT",
-    "AZ",
-    "BS",
-    "BH",
-    "BD",
-    "BB",
-    "BY",
-    "BE",
-    "BZ",
-    "BJ",
-    "BM",
-    "BT",
-    "BO",
-    "BA",
-    "BW",
-    "BR",
-    "IO",
-    "VG",
-    "BN",
-    "BG",
-    "BF",
-    "MM",
-    "BI",
-    "KH",
-    "CM",
-    "CA",
-    "CV",
-    "KY",
-    "CF",
-    "TD",
-    "CL",
-    "CN",
-    "CX",
-    "CC",
-    "CO",
-    "KM",
-    "CK",
-    "CR",
-    "HR",
-    "CU",
-    "CY",
-    "CZ",
-    "CD",
-    "DK",
-    "DJ",
-    "DM",
-    "DO",
-    "EC",
-    "EG",
-    "SV",
-    "GQ",
-    "ER",
-    "EE",
-    "ET",
-    "FK",
-    "FO",
-    "FJ",
-    "FI",
-    "FR",
-    "PF",
-    "GA",
-    "GM",
-    "GE",
-    "DE",
-    "GH",
-    "GI",
-    "GR",
-    "GL",
-    "GD",
-    "GU",
-    "GT",
-    "GN",
-    "GW",
-    "GY",
-    "HT",
-    "VA",
-    "HN",
-    "HK",
-    "HU",
-    "IS",
-    "IN",
-    "ID",
-    "IR",
-    "IQ",
-    "IE",
-    "IM",
-    "IL",
-    "IT",
-    "CI",
-    "JM",
-    "JP",
-    "JE",
-    "JO",
-    "KZ",
-    "KE",
-    "KI",
-    "KW",
-    "KG",
-    "LA",
-    "LV",
-    "LB",
-    "LS",
-    "LR",
-    "LY",
-    "LI",
-    "LT",
-    "LU",
-    "MO",
-    "MK",
-    "MG",
-    "MW",
-    "MY",
-    "MV",
-    "ML",
-    "MT",
-    "MH",
-    "MR",
-    "MU",
-    "YT",
-    "MX",
-    "FM",
-    "MD",
-    "MC",
-    "MN",
-    "ME",
-    "MS",
-    "MA",
-    "MZ",
-    "NA",
-    "NR",
-    "NP",
-    "NL",
-    "AN",
-    "NC",
-    "NZ",
-    "NI",
-    "NE",
-    "NG",
-    "NU",
-    "KP",
-    "MP",
-    "NO",
-    "OM",
-    "PK",
-    "PW",
-    "PA",
-    "PG",
-    "PY",
-    "PE",
-    "PH",
-    "PN",
-    "PL",
-    "PT",
-    "PR",
-    "QA",
-    "CG",
-    "RO",
-    "RU",
-    "RW",
-    "BL",
-    "SH",
-    "KN",
-    "LC",
-    "MF",
-    "PM",
-    "VC",
-    "WS",
-    "SM",
-    "ST",
-    "SA",
-    "SN",
-    "RS",
-    "SC",
-    "SL",
-    "SG",
-    "SK",
-    "SI",
-    "SB",
-    "SO",
-    "ZA",
-    "KR",
-    "ES",
-    "LK",
-    "SD",
-    "SR",
-    "SJ",
-    "SZ",
-    "SE",
-    "CH",
-    "SY",
-    "TW",
-    "TJ",
-    "TZ",
-    "TH",
-    "TL",
-    "TG",
-    "TK",
-    "TO",
-    "TT",
-    "TN",
-    "TR",
-    "TM",
-    "TC",
-    "TV",
-    "UG",
-    "UA",
-    "AE",
-    "GB",
-    "US",
-    "UY",
-    "VI",
-    "UZ",
-    "VU",
-    "VE",
-    "VN",
-    "WF",
-    "EH",
-    "YE",
-    "ZM",
-    "ZW"
-  ],
-
-  "languages": [
-    "ab",
-    "aa",
-    "af",
-    "sq",
-    "am",
-    "ar",
-    "an",
-    "hy",
-    "as",
-    "ay",
-    "az",
-    "ba",
-    "eu",
-    "bn",
-    "dz",
-    "bh",
-    "bi",
-    "br",
-    "bg",
-    "my",
-    "be",
-    "km",
-    "ca",
-    "zh",
-    "zh-Hans",
-    "zh-Hant",
-    "co",
-    "hr",
-    "cs",
-    "da",
-    "nl",
-    "en",
-    "eo",
-    "et",
-    "fo",
-    "fa",
-    "fj",
-    "fi",
-    "fr",
-    "fy",
-    "gl",
-    "gd",
-    "gv",
-    "ka",
-    "de",
-    "el",
-    "kl",
-    "gn",
-    "gu",
-    "ht",
-    "ha",
-    "he",
-    "iw",
-    "hi",
-    "hu",
-    "is",
-    "io",
-    "id",
-    "in",
-    "ia",
-    "ie",
-    "iu",
-    "ik",
-    "ga",
-    "it",
-    "ja",
-    "jv",
-    "kn",
-    "ks",
-    "kk",
-    "rw",
-    "ky",
-    "rn",
-    "ko",
-    "ku",
-    "lo",
-    "la",
-    "lv",
-    "li",
-    "ln",
-    "lt",
-    "mk",
-    "mg",
-    "ms",
-    "ml",
-    "mt",
-    "mi",
-    "mr",
-    "mo",
-    "mn",
-    "na",
-    "ne",
-    "no",
-    "oc",
-    "or",
-    "om",
-    "ps",
-    "pl",
-    "pt",
-    "pa",
-    "qu",
-    "rm",
-    "ro",
-    "ru",
-    "sm",
-    "sg",
-    "sa",
-    "sr",
-    "sh",
-    "st",
-    "tn",
-    "sn",
-    "ii",
-    "sd",
-    "si",
-    "ss",
-    "sk",
-    "sl",
-    "so",
-    "es",
-    "su",
-    "sw",
-    "sv",
-    "tl",
-    "tg",
-    "ta",
-    "tt",
-    "te",
-    "th",
-    "bo",
-    "ti",
-    "to",
-    "ts",
-    "tr",
-    "tk",
-    "tw",
-    "ug",
-    "uk",
-    "ur",
-    "uz",
-    "vi",
-    "vo",
-    "wa",
-    "cy",
-    "wo",
-    "xh",
-    "yi",
-    "ji",
-    "yo",
-    "zu"
-  ]
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/attributesComparator.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/attributesComparator.js
deleted file mode 100644
index e9bba04..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/attributesComparator.js
+++ /dev/null
@@ -1,40 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns true if all items in baseAttributes are found in attributes. Always
- * returns true if baseAttributes is empty.
- */
-function attributesComparator() {
-  var baseAttributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
-  var attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
-  return baseAttributes.every(function (baseAttr) {
-    return attributes.some(function (attribute) {
-      // Guard against non-JSXAttribute nodes like JSXSpreadAttribute
-      if (attribute.type !== 'JSXAttribute') {
-        return false;
-      } // Attribute matches.
-
-
-      if (baseAttr.name !== (0, _jsxAstUtils.propName)(attribute)) {
-        return false;
-      } // Value exists and does not match.
-
-
-      if (baseAttr.value && baseAttr.value !== (0, _jsxAstUtils.getLiteralPropValue)(attribute)) {
-        return false;
-      }
-
-      return true;
-    });
-  });
-}
-
-var _default = attributesComparator;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/getComputedRole.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/getComputedRole.js
deleted file mode 100644
index 27f0d40..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/getComputedRole.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getComputedRole;
-
-var _getExplicitRole = _interopRequireDefault(require("./getExplicitRole"));
-
-var _getImplicitRole = _interopRequireDefault(require("./getImplicitRole"));
-
-/**
- * Returns an element's computed role, which is
- *
- *  1. The valid value of its explicit role attribute; or
- *  2. The implicit value of its tag.
- */
-function getComputedRole(tag, attributes) {
-  return (0, _getExplicitRole["default"])(tag, attributes) || (0, _getImplicitRole["default"])(tag, attributes);
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/getExplicitRole.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/getExplicitRole.js
deleted file mode 100644
index 8633db7..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/getExplicitRole.js
+++ /dev/null
@@ -1,32 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getExplicitRole;
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns an element's computed role, which is
- *
- *  1. The valid value of its explicit role attribute; or
- *  2. The implicit value of its tag.
- */
-function getExplicitRole(tag, attributes) {
-  var explicitRole = function toLowerCase(role) {
-    if (typeof role === 'string') {
-      return role.toLowerCase();
-    }
-
-    return null;
-  }((0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(attributes, 'role')));
-
-  if (_ariaQuery.roles.has(explicitRole)) {
-    return explicitRole;
-  }
-
-  return null;
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/getImplicitRole.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/getImplicitRole.js
deleted file mode 100644
index 30b362f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/getImplicitRole.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRole;
-
-var _ariaQuery = require("aria-query");
-
-var _implicitRoles = _interopRequireDefault(require("./implicitRoles"));
-
-/**
- * Returns an element's implicit role given its attributes and type.
- * Some elements only have an implicit role when certain props are defined.
- */
-function getImplicitRole(type, attributes) {
-  var implicitRole;
-
-  if (_implicitRoles["default"][type]) {
-    implicitRole = _implicitRoles["default"][type](attributes);
-  }
-
-  if (_ariaQuery.roles.has(implicitRole)) {
-    return implicitRole;
-  }
-
-  return null;
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/getSuggestion.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/getSuggestion.js
deleted file mode 100644
index 29a863f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/getSuggestion.js
+++ /dev/null
@@ -1,35 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getSuggestion;
-
-var _damerauLevenshtein = _interopRequireDefault(require("damerau-levenshtein"));
-
-// Minimum edit distance to be considered a good suggestion.
-var THRESHOLD = 2;
-/**
- * Returns an array of suggestions given a word and a dictionary and limit of suggestions
- * to return.
- */
-
-function getSuggestion(word) {
-  var dictionary = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
-  var limit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
-  var distances = dictionary.reduce(function (suggestions, dictionaryWord) {
-    var distance = (0, _damerauLevenshtein["default"])(word.toUpperCase(), dictionaryWord.toUpperCase());
-    var steps = distance.steps;
-    suggestions[dictionaryWord] = steps; // eslint-disable-line
-
-    return suggestions;
-  }, {});
-  return Object.keys(distances).filter(function (suggestion) {
-    return distances[suggestion] <= THRESHOLD;
-  }).sort(function (a, b) {
-    return distances[a] - distances[b];
-  }) // Sort by distance
-  .slice(0, limit);
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/getTabIndex.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/getTabIndex.js
deleted file mode 100644
index a9b7022..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/getTabIndex.js
+++ /dev/null
@@ -1,37 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getTabIndex;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns the tabIndex value.
- */
-function getTabIndex(tabIndex) {
-  var literalValue = (0, _jsxAstUtils.getLiteralPropValue)(tabIndex); // String and number values.
-
-  if (['string', 'number'].indexOf(typeof literalValue) > -1) {
-    // Empty string will convert to zero, so check for it explicity.
-    if (typeof literalValue === 'string' && literalValue.length === 0) {
-      return undefined;
-    }
-
-    var value = Number(literalValue);
-
-    if (Number.isNaN(value)) {
-      return undefined;
-    }
-
-    return Number.isInteger(value) ? value : undefined;
-  } // Booleans are not valid values, return undefined.
-
-
-  if (literalValue === true || literalValue === false) {
-    return undefined;
-  }
-
-  return (0, _jsxAstUtils.getPropValue)(tabIndex);
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/hasAccessibleChild.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/hasAccessibleChild.js
deleted file mode 100644
index b7f037e..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/hasAccessibleChild.js
+++ /dev/null
@@ -1,35 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = hasAccessibleChild;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _isHiddenFromScreenReader = _interopRequireDefault(require("./isHiddenFromScreenReader"));
-
-function hasAccessibleChild(node) {
-  return node.children.some(function (child) {
-    switch (child.type) {
-      case 'Literal':
-      case 'JSXText':
-        return Boolean(child.value);
-
-      case 'JSXElement':
-        return !(0, _isHiddenFromScreenReader["default"])((0, _jsxAstUtils.elementType)(child.openingElement), child.openingElement.attributes);
-
-      case 'JSXExpressionContainer':
-        if (child.expression.type === 'Identifier') {
-          return child.expression.name !== 'undefined';
-        }
-
-        return true;
-
-      default:
-        return false;
-    }
-  }) || (0, _jsxAstUtils.hasAnyProp)(node.openingElement.attributes, ['dangerouslySetInnerHTML', 'children']);
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/a.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/a.js
deleted file mode 100644
index 9eabbcc..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/a.js
+++ /dev/null
@@ -1,19 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForAnchor;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns the implicit role for an anchor tag.
- */
-function getImplicitRoleForAnchor(attributes) {
-  if ((0, _jsxAstUtils.getProp)(attributes, 'href')) {
-    return 'link';
-  }
-
-  return '';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/area.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/area.js
deleted file mode 100644
index a12d26f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/area.js
+++ /dev/null
@@ -1,19 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForArea;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns the implicit role for an area tag.
- */
-function getImplicitRoleForArea(attributes) {
-  if ((0, _jsxAstUtils.getProp)(attributes, 'href')) {
-    return 'link';
-  }
-
-  return '';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/article.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/article.js
deleted file mode 100644
index c3424ff..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/article.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForArticle;
-
-/**
- * Returns the implicit role for an article tag.
- */
-function getImplicitRoleForArticle() {
-  return 'article';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/aside.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/aside.js
deleted file mode 100644
index 8bd5f79..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/aside.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForAside;
-
-/**
- * Returns the implicit role for an aside tag.
- */
-function getImplicitRoleForAside() {
-  return 'complementary';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/body.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/body.js
deleted file mode 100644
index 6ca9206..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/body.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForBody;
-
-/**
- * Returns the implicit role for a body tag.
- */
-function getImplicitRoleForBody() {
-  return 'document';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/button.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/button.js
deleted file mode 100644
index 6c100e4..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/button.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForButton;
-
-/**
- * Returns the implicit role for a button tag.
- */
-function getImplicitRoleForButton() {
-  return 'button';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/datalist.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/datalist.js
deleted file mode 100644
index b4f73b6..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/datalist.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForDatalist;
-
-/**
- * Returns the implicit role for a datalist tag.
- */
-function getImplicitRoleForDatalist() {
-  return 'listbox';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/details.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/details.js
deleted file mode 100644
index 3799273..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/details.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForDetails;
-
-/**
- * Returns the implicit role for a details tag.
- */
-function getImplicitRoleForDetails() {
-  return 'group';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/dialog.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/dialog.js
deleted file mode 100644
index e9d2c8f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/dialog.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForDialog;
-
-/**
- * Returns the implicit role for a dialog tag.
- */
-function getImplicitRoleForDialog() {
-  return 'dialog';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/dl.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/dl.js
deleted file mode 100644
index b120414..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/dl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForDl;
-
-/**
- * Returns the implicit role for a dl tag.
- */
-function getImplicitRoleForDl() {
-  return 'list';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/form.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/form.js
deleted file mode 100644
index bd23211..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/form.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForForm;
-
-/**
- * Returns the implicit role for a form tag.
- */
-function getImplicitRoleForForm() {
-  return 'form';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h1.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h1.js
deleted file mode 100644
index 3b0793a..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h1.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForH1;
-
-/**
- * Returns the implicit role for an h1 tag.
- */
-function getImplicitRoleForH1() {
-  return 'heading';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h2.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h2.js
deleted file mode 100644
index 2aace79..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h2.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForH2;
-
-/**
- * Returns the implicit role for an h2 tag.
- */
-function getImplicitRoleForH2() {
-  return 'heading';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h3.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h3.js
deleted file mode 100644
index ee41416..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h3.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForH3;
-
-/**
- * Returns the implicit role for an h3 tag.
- */
-function getImplicitRoleForH3() {
-  return 'heading';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h4.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h4.js
deleted file mode 100644
index b20a54d..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h4.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForH4;
-
-/**
- * Returns the implicit role for an h4 tag.
- */
-function getImplicitRoleForH4() {
-  return 'heading';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h5.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h5.js
deleted file mode 100644
index c11fe69..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h5.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForH5;
-
-/**
- * Returns the implicit role for an h5 tag.
- */
-function getImplicitRoleForH5() {
-  return 'heading';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h6.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h6.js
deleted file mode 100644
index a10150e..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/h6.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForH6;
-
-/**
- * Returns the implicit role for an h6tag.
- */
-function getImplicitRoleForH6() {
-  return 'heading';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/hr.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/hr.js
deleted file mode 100644
index bd176d1..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/hr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForHr;
-
-/**
- * Returns the implicit role for an hr tag.
- */
-function getImplicitRoleForHr() {
-  return 'separator';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/img.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/img.js
deleted file mode 100644
index f74caf4..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/img.js
+++ /dev/null
@@ -1,21 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForImg;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns the implicit role for an img tag.
- */
-function getImplicitRoleForImg(attributes) {
-  var alt = (0, _jsxAstUtils.getProp)(attributes, 'alt');
-
-  if (alt && (0, _jsxAstUtils.getLiteralPropValue)(alt) === '') {
-    return '';
-  }
-
-  return 'img';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/index.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/index.js
deleted file mode 100644
index ed6e811..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/index.js
+++ /dev/null
@@ -1,123 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _a = _interopRequireDefault(require("./a"));
-
-var _area = _interopRequireDefault(require("./area"));
-
-var _article = _interopRequireDefault(require("./article"));
-
-var _aside = _interopRequireDefault(require("./aside"));
-
-var _body = _interopRequireDefault(require("./body"));
-
-var _button = _interopRequireDefault(require("./button"));
-
-var _datalist = _interopRequireDefault(require("./datalist"));
-
-var _details = _interopRequireDefault(require("./details"));
-
-var _dialog = _interopRequireDefault(require("./dialog"));
-
-var _dl = _interopRequireDefault(require("./dl"));
-
-var _form = _interopRequireDefault(require("./form"));
-
-var _h = _interopRequireDefault(require("./h1"));
-
-var _h2 = _interopRequireDefault(require("./h2"));
-
-var _h3 = _interopRequireDefault(require("./h3"));
-
-var _h4 = _interopRequireDefault(require("./h4"));
-
-var _h5 = _interopRequireDefault(require("./h5"));
-
-var _h6 = _interopRequireDefault(require("./h6"));
-
-var _hr = _interopRequireDefault(require("./hr"));
-
-var _img = _interopRequireDefault(require("./img"));
-
-var _input = _interopRequireDefault(require("./input"));
-
-var _li = _interopRequireDefault(require("./li"));
-
-var _link = _interopRequireDefault(require("./link"));
-
-var _menu = _interopRequireDefault(require("./menu"));
-
-var _menuitem = _interopRequireDefault(require("./menuitem"));
-
-var _meter = _interopRequireDefault(require("./meter"));
-
-var _nav = _interopRequireDefault(require("./nav"));
-
-var _ol = _interopRequireDefault(require("./ol"));
-
-var _option = _interopRequireDefault(require("./option"));
-
-var _output = _interopRequireDefault(require("./output"));
-
-var _progress = _interopRequireDefault(require("./progress"));
-
-var _section = _interopRequireDefault(require("./section"));
-
-var _select = _interopRequireDefault(require("./select"));
-
-var _tbody = _interopRequireDefault(require("./tbody"));
-
-var _textarea = _interopRequireDefault(require("./textarea"));
-
-var _tfoot = _interopRequireDefault(require("./tfoot"));
-
-var _thead = _interopRequireDefault(require("./thead"));
-
-var _ul = _interopRequireDefault(require("./ul"));
-
-var _default = {
-  a: _a["default"],
-  area: _area["default"],
-  article: _article["default"],
-  aside: _aside["default"],
-  body: _body["default"],
-  button: _button["default"],
-  datalist: _datalist["default"],
-  details: _details["default"],
-  dialog: _dialog["default"],
-  dl: _dl["default"],
-  form: _form["default"],
-  h1: _h["default"],
-  h2: _h2["default"],
-  h3: _h3["default"],
-  h4: _h4["default"],
-  h5: _h5["default"],
-  h6: _h6["default"],
-  hr: _hr["default"],
-  img: _img["default"],
-  input: _input["default"],
-  li: _li["default"],
-  link: _link["default"],
-  menu: _menu["default"],
-  menuitem: _menuitem["default"],
-  meter: _meter["default"],
-  nav: _nav["default"],
-  ol: _ol["default"],
-  option: _option["default"],
-  output: _output["default"],
-  progress: _progress["default"],
-  section: _section["default"],
-  select: _select["default"],
-  tbody: _tbody["default"],
-  textarea: _textarea["default"],
-  tfoot: _tfoot["default"],
-  thead: _thead["default"],
-  ul: _ul["default"]
-};
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/input.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/input.js
deleted file mode 100644
index 33c9e3c..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/input.js
+++ /dev/null
@@ -1,49 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForInput;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns the implicit role for an input tag.
- */
-function getImplicitRoleForInput(attributes) {
-  var type = (0, _jsxAstUtils.getProp)(attributes, 'type');
-
-  if (type) {
-    var value = (0, _jsxAstUtils.getLiteralPropValue)(type) || '';
-
-    switch (typeof value === 'string' && value.toUpperCase()) {
-      case 'BUTTON':
-      case 'IMAGE':
-      case 'RESET':
-      case 'SUBMIT':
-        return 'button';
-
-      case 'CHECKBOX':
-        return 'checkbox';
-
-      case 'RADIO':
-        return 'radio';
-
-      case 'RANGE':
-        return 'slider';
-
-      case 'EMAIL':
-      case 'PASSWORD':
-      case 'SEARCH': // with [list] selector it's combobox
-
-      case 'TEL': // with [list] selector it's combobox
-
-      case 'URL': // with [list] selector it's combobox
-
-      default:
-        return 'textbox';
-    }
-  }
-
-  return 'textbox';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/li.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/li.js
deleted file mode 100644
index 3baab3a..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/li.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForLi;
-
-/**
- * Returns the implicit role for an li tag.
- */
-function getImplicitRoleForLi() {
-  return 'listitem';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/link.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/link.js
deleted file mode 100644
index bc14bb2..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/link.js
+++ /dev/null
@@ -1,19 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForLink;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns the implicit role for a link tag.
- */
-function getImplicitRoleForLink(attributes) {
-  if ((0, _jsxAstUtils.getProp)(attributes, 'href')) {
-    return 'link';
-  }
-
-  return '';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/menu.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/menu.js
deleted file mode 100644
index d3339d5..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/menu.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForMenu;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns the implicit role for a menu tag.
- */
-function getImplicitRoleForMenu(attributes) {
-  var type = (0, _jsxAstUtils.getProp)(attributes, 'type');
-
-  if (type) {
-    var value = (0, _jsxAstUtils.getLiteralPropValue)(type);
-    return value && value.toUpperCase() === 'TOOLBAR' ? 'toolbar' : '';
-  }
-
-  return '';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/menuitem.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/menuitem.js
deleted file mode 100644
index 51154e5..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/menuitem.js
+++ /dev/null
@@ -1,35 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForMenuitem;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns the implicit role for a menuitem tag.
- */
-function getImplicitRoleForMenuitem(attributes) {
-  var type = (0, _jsxAstUtils.getProp)(attributes, 'type');
-
-  if (type) {
-    var value = (0, _jsxAstUtils.getLiteralPropValue)(type) || '';
-
-    switch (typeof value === 'string' && value.toUpperCase()) {
-      case 'COMMAND':
-        return 'menuitem';
-
-      case 'CHECKBOX':
-        return 'menuitemcheckbox';
-
-      case 'RADIO':
-        return 'menuitemradio';
-
-      default:
-        return '';
-    }
-  }
-
-  return '';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/meter.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/meter.js
deleted file mode 100644
index 5f23304..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/meter.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForMeter;
-
-/**
- * Returns the implicit role for a meter tag.
- */
-function getImplicitRoleForMeter() {
-  return 'progressbar';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/nav.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/nav.js
deleted file mode 100644
index c7132f9..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/nav.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForNav;
-
-/**
- * Returns the implicit role for a nav tag.
- */
-function getImplicitRoleForNav() {
-  return 'navigation';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/ol.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/ol.js
deleted file mode 100644
index 4bd0474..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/ol.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForOl;
-
-/**
- * Returns the implicit role for an ol tag.
- */
-function getImplicitRoleForOl() {
-  return 'list';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/option.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/option.js
deleted file mode 100644
index 473c6fc..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/option.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForOption;
-
-/**
- * Returns the implicit role for an option tag.
- */
-function getImplicitRoleForOption() {
-  return 'option';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/output.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/output.js
deleted file mode 100644
index 1255fed..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/output.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForOutput;
-
-/**
- * Returns the implicit role for an output tag.
- */
-function getImplicitRoleForOutput() {
-  return 'status';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/progress.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/progress.js
deleted file mode 100644
index 10c5616..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/progress.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForProgress;
-
-/**
- * Returns the implicit role for a progress tag.
- */
-function getImplicitRoleForProgress() {
-  return 'progressbar';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/section.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/section.js
deleted file mode 100644
index 33e3cbf..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/section.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForSection;
-
-/**
- * Returns the implicit role for a section tag.
- */
-function getImplicitRoleForSection() {
-  return 'region';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/select.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/select.js
deleted file mode 100644
index 01359d2..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/select.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForSelect;
-
-/**
- * Returns the implicit role for a select tag.
- */
-function getImplicitRoleForSelect() {
-  return 'listbox';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/tbody.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/tbody.js
deleted file mode 100644
index 99f1b51..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/tbody.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForTbody;
-
-/**
- * Returns the implicit role for a tbody tag.
- */
-function getImplicitRoleForTbody() {
-  return 'rowgroup';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/textarea.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/textarea.js
deleted file mode 100644
index 7dde0cc..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/textarea.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForTextarea;
-
-/**
- * Returns the implicit role for a textarea tag.
- */
-function getImplicitRoleForTextarea() {
-  return 'textbox';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/tfoot.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/tfoot.js
deleted file mode 100644
index d9bdd2c..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/tfoot.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForTfoot;
-
-/**
- * Returns the implicit role for a tfoot tag.
- */
-function getImplicitRoleForTfoot() {
-  return 'rowgroup';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/thead.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/thead.js
deleted file mode 100644
index be423d0..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/thead.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForThead;
-
-/**
- * Returns the implicit role for a thead tag.
- */
-function getImplicitRoleForThead() {
-  return 'rowgroup';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/ul.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/ul.js
deleted file mode 100644
index 4916833..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/implicitRoles/ul.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = getImplicitRoleForUl;
-
-/**
- * Returns the implicit role for a ul tag.
- */
-function getImplicitRoleForUl() {
-  return 'list';
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/isAbstractRole.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/isAbstractRole.js
deleted file mode 100644
index 27f6037..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/isAbstractRole.js
+++ /dev/null
@@ -1,33 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var abstractRoles = new Set((0, _toConsumableArray2["default"])(_ariaQuery.roles.keys()).filter(function (role) {
-  return _ariaQuery.roles.get(role)["abstract"];
-}));
-var DOMElements = (0, _toConsumableArray2["default"])(_ariaQuery.dom.keys());
-
-var isAbstractRole = function isAbstractRole(tagName, attributes) {
-  // Do not test higher level JSX components, as we do not know what
-  // low-level DOM element this maps to.
-  if (DOMElements.indexOf(tagName) === -1) {
-    return false;
-  }
-
-  var role = (0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(attributes, 'role'));
-  return abstractRoles.has(role);
-};
-
-var _default = isAbstractRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/isDOMElement.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/isDOMElement.js
deleted file mode 100644
index d37e192..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/isDOMElement.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var domElements = (0, _toConsumableArray2["default"])(_ariaQuery.dom.keys());
-/**
- * Returns boolean indicating whether the given element is a DOM element.
- */
-
-var isDOMElement = function isDOMElement(tagName) {
-  return (0, _arrayIncludes["default"])(domElements, tagName);
-};
-
-var _default = isDOMElement;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/isDisabledElement.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/isDisabledElement.js
deleted file mode 100644
index 4dd64e1..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/isDisabledElement.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var isDisabledElement = function isDisabledElement(attributes) {
-  var disabledAttr = (0, _jsxAstUtils.getProp)(attributes, 'disabled');
-  var disabledAttrValue = (0, _jsxAstUtils.getPropValue)(disabledAttr);
-  var isHTML5Disabled = disabledAttr && disabledAttrValue !== undefined;
-
-  if (isHTML5Disabled) {
-    return true;
-  }
-
-  var ariaDisabledAttr = (0, _jsxAstUtils.getProp)(attributes, 'aria-disabled');
-  var ariaDisabledAttrValue = (0, _jsxAstUtils.getLiteralPropValue)(ariaDisabledAttr);
-
-  if (ariaDisabledAttr && ariaDisabledAttrValue !== undefined && ariaDisabledAttrValue === true) {
-    return true;
-  }
-
-  return false;
-};
-
-var _default = isDisabledElement;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/isHiddenFromScreenReader.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/isHiddenFromScreenReader.js
deleted file mode 100644
index a99247c..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/isHiddenFromScreenReader.js
+++ /dev/null
@@ -1,31 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns boolean indicating that the aria-hidden prop
- * is present or the value is true. Will also return true if
- * there is an input with type='hidden'.
- *
- * <div aria-hidden /> is equivalent to the DOM as <div aria-hidden=true />.
- */
-var isHiddenFromScreenReader = function isHiddenFromScreenReader(type, attributes) {
-  if (type.toUpperCase() === 'INPUT') {
-    var hidden = (0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(attributes, 'type'));
-
-    if (hidden && hidden.toUpperCase() === 'HIDDEN') {
-      return true;
-    }
-  }
-
-  var ariaHidden = (0, _jsxAstUtils.getPropValue)((0, _jsxAstUtils.getProp)(attributes, 'aria-hidden'));
-  return ariaHidden === true;
-};
-
-var _default = isHiddenFromScreenReader;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/isInteractiveElement.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/isInteractiveElement.js
deleted file mode 100644
index 0498c1f..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/isInteractiveElement.js
+++ /dev/null
@@ -1,133 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _axobjectQuery = require("axobject-query");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var _attributesComparator = _interopRequireDefault(require("./attributesComparator"));
-
-var domKeys = (0, _toConsumableArray2["default"])(_ariaQuery.dom.keys());
-var roleKeys = (0, _toConsumableArray2["default"])(_ariaQuery.roles.keys());
-var elementRoleEntries = (0, _toConsumableArray2["default"])(_ariaQuery.elementRoles);
-var nonInteractiveRoles = new Set(roleKeys.filter(function (name) {
-  var role = _ariaQuery.roles.get(name);
-
-  return !role["abstract"] && !role.superClass.some(function (classes) {
-    return (0, _arrayIncludes["default"])(classes, 'widget');
-  });
-}));
-var interactiveRoles = new Set([].concat(roleKeys, // 'toolbar' does not descend from widget, but it does support
-// aria-activedescendant, thus in practice we treat it as a widget.
-'toolbar').filter(function (name) {
-  var role = _ariaQuery.roles.get(name);
-
-  return !role["abstract"] && role.superClass.some(function (classes) {
-    return (0, _arrayIncludes["default"])(classes, 'widget');
-  });
-}));
-var nonInteractiveElementRoleSchemas = elementRoleEntries.reduce(function (accumulator, _ref) {
-  var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
-      elementSchema = _ref2[0],
-      roleSet = _ref2[1];
-
-  if ((0, _toConsumableArray2["default"])(roleSet).every(function (role) {
-    return nonInteractiveRoles.has(role);
-  })) {
-    accumulator.push(elementSchema);
-  }
-
-  return accumulator;
-}, []);
-var interactiveElementRoleSchemas = elementRoleEntries.reduce(function (accumulator, _ref3) {
-  var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2),
-      elementSchema = _ref4[0],
-      roleSet = _ref4[1];
-
-  if ((0, _toConsumableArray2["default"])(roleSet).some(function (role) {
-    return interactiveRoles.has(role);
-  })) {
-    accumulator.push(elementSchema);
-  }
-
-  return accumulator;
-}, []);
-var interactiveAXObjects = new Set((0, _toConsumableArray2["default"])(_axobjectQuery.AXObjects.keys()).filter(function (name) {
-  return _axobjectQuery.AXObjects.get(name).type === 'widget';
-}));
-var interactiveElementAXObjectSchemas = (0, _toConsumableArray2["default"])(_axobjectQuery.elementAXObjects).reduce(function (accumulator, _ref5) {
-  var _ref6 = (0, _slicedToArray2["default"])(_ref5, 2),
-      elementSchema = _ref6[0],
-      AXObjectSet = _ref6[1];
-
-  if ((0, _toConsumableArray2["default"])(AXObjectSet).every(function (role) {
-    return interactiveAXObjects.has(role);
-  })) {
-    accumulator.push(elementSchema);
-  }
-
-  return accumulator;
-}, []);
-
-function checkIsInteractiveElement(tagName, attributes) {
-  function elementSchemaMatcher(elementSchema) {
-    return tagName === elementSchema.name && (0, _attributesComparator["default"])(elementSchema.attributes, attributes);
-  } // Check in elementRoles for inherent interactive role associations for
-  // this element.
-
-
-  var isInherentInteractiveElement = interactiveElementRoleSchemas.some(elementSchemaMatcher);
-
-  if (isInherentInteractiveElement) {
-    return true;
-  } // Check in elementRoles for inherent non-interactive role associations for
-  // this element.
-
-
-  var isInherentNonInteractiveElement = nonInteractiveElementRoleSchemas.some(elementSchemaMatcher);
-
-  if (isInherentNonInteractiveElement) {
-    return false;
-  } // Check in elementAXObjects for AX Tree associations for this element.
-
-
-  var isInteractiveAXElement = interactiveElementAXObjectSchemas.some(elementSchemaMatcher);
-
-  if (isInteractiveAXElement) {
-    return true;
-  }
-
-  return false;
-}
-/**
- * Returns boolean indicating whether the given element is
- * interactive on the DOM or not. Usually used when an element
- * has a dynamic handler on it and we need to discern whether or not
- * it's intention is to be interacted with on the DOM.
- */
-
-
-var isInteractiveElement = function isInteractiveElement(tagName, attributes) {
-  // Do not test higher level JSX components, as we do not know what
-  // low-level DOM element this maps to.
-  if (!(0, _arrayIncludes["default"])(domKeys, tagName)) {
-    return false;
-  }
-
-  return checkIsInteractiveElement(tagName, attributes);
-};
-
-var _default = isInteractiveElement;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/isInteractiveRole.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/isInteractiveRole.js
deleted file mode 100644
index d82069a..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/isInteractiveRole.js
+++ /dev/null
@@ -1,69 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var roles = (0, _toConsumableArray2["default"])(_ariaQuery.roles.keys());
-var interactiveRoles = roles.filter(function (name) {
-  return !_ariaQuery.roles.get(name)["abstract"];
-}).filter(function (name) {
-  return _ariaQuery.roles.get(name).superClass.some(function (klasses) {
-    return (0, _arrayIncludes["default"])(klasses, 'widget');
-  });
-}); // 'toolbar' does not descend from widget, but it does support
-// aria-activedescendant, thus in practice we treat it as a widget.
-
-interactiveRoles.push('toolbar');
-/**
- * Returns boolean indicating whether the given element has a role
- * that is associated with an interactive component. Used when an element
- * has a dynamic handler on it and we need to discern whether or not
- * its intention is to be interacted with in the DOM.
- *
- * isInteractiveRole is a Logical Disjunction:
- * https://en.wikipedia.org/wiki/Logical_disjunction
- * The JSX element does not have a tagName or it has a tagName and a role
- * attribute with a value in the set of non-interactive roles.
- */
-
-var isInteractiveRole = function isInteractiveRole(tagName, attributes) {
-  var value = (0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(attributes, 'role')); // If value is undefined, then the role attribute will be dropped in the DOM.
-  // If value is null, then getLiteralAttributeValue is telling us that the
-  // value isn't in the form of a literal
-
-  if (value === undefined || value === null) {
-    return false;
-  }
-
-  var isInteractive = false;
-  var normalizedValues = String(value).toLowerCase().split(' ');
-  var validRoles = normalizedValues.reduce(function (accumulator, name) {
-    if ((0, _arrayIncludes["default"])(roles, name)) {
-      accumulator.push(name);
-    }
-
-    return accumulator;
-  }, []);
-
-  if (validRoles.length > 0) {
-    // The first role value is a series takes precedence.
-    isInteractive = (0, _arrayIncludes["default"])(interactiveRoles, validRoles[0]);
-  }
-
-  return isInteractive;
-};
-
-var _default = isInteractiveRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/isNonInteractiveElement.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/isNonInteractiveElement.js
deleted file mode 100644
index b261529..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/isNonInteractiveElement.js
+++ /dev/null
@@ -1,134 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _axobjectQuery = require("axobject-query");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var _attributesComparator = _interopRequireDefault(require("./attributesComparator"));
-
-var roleKeys = (0, _toConsumableArray2["default"])(_ariaQuery.roles.keys());
-var elementRoleEntries = (0, _toConsumableArray2["default"])(_ariaQuery.elementRoles);
-var nonInteractiveRoles = new Set(roleKeys.filter(function (name) {
-  var role = _ariaQuery.roles.get(name);
-
-  return !role["abstract"] && !role.superClass.some(function (classes) {
-    return (0, _arrayIncludes["default"])(classes, 'widget');
-  });
-}));
-var interactiveRoles = new Set([].concat(roleKeys, // 'toolbar' does not descend from widget, but it does support
-// aria-activedescendant, thus in practice we treat it as a widget.
-'toolbar').filter(function (name) {
-  var role = _ariaQuery.roles.get(name);
-
-  return !role["abstract"] && role.superClass.some(function (classes) {
-    return (0, _arrayIncludes["default"])(classes, 'widget');
-  });
-}));
-var nonInteractiveElementRoleSchemas = elementRoleEntries.reduce(function (accumulator, _ref) {
-  var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
-      elementSchema = _ref2[0],
-      roleSet = _ref2[1];
-
-  if ((0, _toConsumableArray2["default"])(roleSet).every(function (role) {
-    return nonInteractiveRoles.has(role);
-  })) {
-    accumulator.push(elementSchema);
-  }
-
-  return accumulator;
-}, []);
-var interactiveElementRoleSchemas = elementRoleEntries.reduce(function (accumulator, _ref3) {
-  var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2),
-      elementSchema = _ref4[0],
-      roleSet = _ref4[1];
-
-  if ((0, _toConsumableArray2["default"])(roleSet).some(function (role) {
-    return interactiveRoles.has(role);
-  })) {
-    accumulator.push(elementSchema);
-  }
-
-  return accumulator;
-}, []);
-var nonInteractiveAXObjects = new Set((0, _toConsumableArray2["default"])(_axobjectQuery.AXObjects.keys()).filter(function (name) {
-  return (0, _arrayIncludes["default"])(['window', 'structure'], _axobjectQuery.AXObjects.get(name).type);
-}));
-var nonInteractiveElementAXObjectSchemas = (0, _toConsumableArray2["default"])(_axobjectQuery.elementAXObjects).reduce(function (accumulator, _ref5) {
-  var _ref6 = (0, _slicedToArray2["default"])(_ref5, 2),
-      elementSchema = _ref6[0],
-      AXObjectSet = _ref6[1];
-
-  if ((0, _toConsumableArray2["default"])(AXObjectSet).every(function (role) {
-    return nonInteractiveAXObjects.has(role);
-  })) {
-    accumulator.push(elementSchema);
-  }
-
-  return accumulator;
-}, []);
-
-function checkIsNonInteractiveElement(tagName, attributes) {
-  function elementSchemaMatcher(elementSchema) {
-    return tagName === elementSchema.name && (0, _attributesComparator["default"])(elementSchema.attributes, attributes);
-  } // Check in elementRoles for inherent non-interactive role associations for
-  // this element.
-
-
-  var isInherentNonInteractiveElement = nonInteractiveElementRoleSchemas.some(elementSchemaMatcher);
-
-  if (isInherentNonInteractiveElement) {
-    return true;
-  } // Check in elementRoles for inherent interactive role associations for
-  // this element.
-
-
-  var isInherentInteractiveElement = interactiveElementRoleSchemas.some(elementSchemaMatcher);
-
-  if (isInherentInteractiveElement) {
-    return false;
-  } // Check in elementAXObjects for AX Tree associations for this element.
-
-
-  var isNonInteractiveAXElement = nonInteractiveElementAXObjectSchemas.some(elementSchemaMatcher);
-
-  if (isNonInteractiveAXElement) {
-    return true;
-  }
-
-  return false;
-}
-/**
- * Returns boolean indicating whether the given element is a non-interactive
- * element. If the element has either a non-interactive role assigned or it
- * is an element with an inherently non-interactive role, then this utility
- * returns true. Elements that lack either an explicitly assigned role or
- * an inherent role are not considered. For those, this utility returns false
- * because a positive determination of interactiveness cannot be determined.
- */
-
-
-var isNonInteractiveElement = function isNonInteractiveElement(tagName, attributes) {
-  // Do not test higher level JSX components, as we do not know what
-  // low-level DOM element this maps to.
-  if (!_ariaQuery.dom.has(tagName)) {
-    return false;
-  }
-
-  return checkIsNonInteractiveElement(tagName, attributes);
-};
-
-var _default = isNonInteractiveElement;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/isNonInteractiveRole.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/isNonInteractiveRole.js
deleted file mode 100644
index afd7d28..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/isNonInteractiveRole.js
+++ /dev/null
@@ -1,71 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _ariaQuery = require("aria-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var roles = (0, _toConsumableArray2["default"])(_ariaQuery.roles.keys());
-var nonInteractiveRoles = roles.filter(function (name) {
-  return !_ariaQuery.roles.get(name)["abstract"];
-}).filter(function (name) {
-  return !_ariaQuery.roles.get(name).superClass.some(function (klasses) {
-    return (0, _arrayIncludes["default"])(klasses, 'widget');
-  });
-});
-/**
- * Returns boolean indicating whether the given element has a role
- * that is associated with a non-interactive component. Non-interactive roles
- * include `listitem`, `article`, or `dialog`. These are roles that indicate
- * for the most part containers.
- *
- * Elements with these roles should not respond or handle user interactions.
- * For example, an `onClick` handler should not be assigned to an element with
- * the role `listitem`. An element inside the `listitem`, like a button or a
- * link, should handle the click.
- *
- * This utility returns true for elements that are assigned a non-interactive
- * role. It will return false for elements that do not have a role. So whereas
- * a `div` might be considered non-interactive, for the purpose of this utility,
- * it is considered neither interactive nor non-interactive -- a determination
- * cannot be made in this case and false is returned.
- */
-
-var isNonInteractiveRole = function isNonInteractiveRole(tagName, attributes) {
-  // Do not test higher level JSX components, as we do not know what
-  // low-level DOM element this maps to.
-  if (!_ariaQuery.dom.has(tagName)) {
-    return false;
-  }
-
-  var role = (0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(attributes, 'role'));
-  var isNonInteractive = false;
-  var normalizedValues = String(role).toLowerCase().split(' ');
-  var validRoles = normalizedValues.reduce(function (accumulator, name) {
-    if ((0, _arrayIncludes["default"])(roles, name)) {
-      accumulator.push(name);
-    }
-
-    return accumulator;
-  }, []);
-
-  if (validRoles.length > 0) {
-    // The first role value is a series takes precedence.
-    isNonInteractive = (0, _arrayIncludes["default"])(nonInteractiveRoles, validRoles[0]);
-  }
-
-  return isNonInteractive;
-};
-
-var _default = isNonInteractiveRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/isNonLiteralProperty.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/isNonLiteralProperty.js
deleted file mode 100644
index 225df54..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/isNonLiteralProperty.js
+++ /dev/null
@@ -1,34 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns boolean indicating whether the given element has been specified with
- * an AST node with a non-literal type.
- *
- * Returns true if the elements has a role and its value is not of a type Literal.
- * Otherwise returns false.
- */
-var isNonLiteralProperty = function isNonLiteralProperty(attributes, propName) {
-  var prop = (0, _jsxAstUtils.getProp)(attributes, propName);
-  if (!prop) return false;
-  var propValue = prop.value;
-  if (!propValue) return false;
-  if (propValue.type === 'Literal') return false;
-
-  if (propValue.type === 'JSXExpressionContainer') {
-    var expression = propValue.expression;
-    if (expression.type === 'Identifier' && expression.name === 'undefined') return false;
-    if (expression.type === 'JSXText') return false;
-  }
-
-  return true;
-};
-
-var _default = isNonLiteralProperty;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/isPresentationRole.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/isPresentationRole.js
deleted file mode 100644
index a5441dc..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/isPresentationRole.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var presentationRoles = new Set(['presentation', 'none']);
-
-var isPresentationRole = function isPresentationRole(tagName, attributes) {
-  return presentationRoles.has((0, _jsxAstUtils.getLiteralPropValue)((0, _jsxAstUtils.getProp)(attributes, 'role')));
-};
-
-var _default = isPresentationRole;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/isSemanticRoleElement.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/isSemanticRoleElement.js
deleted file mode 100644
index ff15d5a..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/isSemanticRoleElement.js
+++ /dev/null
@@ -1,68 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = void 0;
-
-var _axobjectQuery = require("axobject-query");
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-var isSemanticRoleElement = function isSemanticRoleElement(elementType, attributes) {
-  var roleAttr = (0, _jsxAstUtils.getProp)(attributes, 'role');
-  var res = false;
-  var roleAttrValue = (0, _jsxAstUtils.getLiteralPropValue)(roleAttr);
-
-  _axobjectQuery.elementAXObjects.forEach(function (axObjects, concept) {
-    if (res) {
-      return;
-    }
-
-    if (concept.name === elementType && (concept.attributes || []).every(function (cAttr) {
-      return attributes.some(function (attr) {
-        if (!attr.type || attr.type !== 'JSXAttribute') {
-          return false;
-        }
-
-        var namesMatch = cAttr.name === (0, _jsxAstUtils.propName)(attr);
-        var valuesMatch;
-
-        if (cAttr.value !== undefined) {
-          valuesMatch = cAttr.value === (0, _jsxAstUtils.getLiteralPropValue)(attr);
-        }
-
-        if (!namesMatch) {
-          return false;
-        }
-
-        return namesMatch && valuesMatch !== undefined ? valuesMatch : true;
-      });
-    })) {
-      axObjects.forEach(function (name) {
-        if (res) {
-          return;
-        }
-
-        var roles = _axobjectQuery.AXObjectRoles.get(name);
-
-        if (roles) {
-          roles.forEach(function (role) {
-            if (res === true) {
-              return;
-            }
-
-            if (role.name === roleAttrValue) {
-              res = true;
-            }
-          });
-        }
-      });
-    }
-  });
-
-  return res;
-};
-
-var _default = isSemanticRoleElement;
-exports["default"] = _default;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/mayContainChildComponent.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/mayContainChildComponent.js
deleted file mode 100644
index 6f91b35..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/mayContainChildComponent.js
+++ /dev/null
@@ -1,53 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = mayContainChildComponent;
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns true if it can positively determine that the element lacks an
- * accessible label. If no determination is possible, it returns false. Treat
- * false as an unknown value. The element might still have an accessible label,
- * but this module cannot determine it positively.
- *
- * 
- */
-function mayContainChildComponent(root, componentName) {
-  var maxDepth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
-
-  function traverseChildren(node, depth) {
-    // Bail when maxDepth is exceeded.
-    if (depth > maxDepth) {
-      return false;
-    }
-
-    if (node.children) {
-      /* $FlowFixMe */
-      for (var i = 0; i < node.children.length; i += 1) {
-        /* $FlowFixMe */
-        var childNode = node.children[i]; // Assume an expression container renders a label. It is the best we can
-        // do in this case.
-
-        if (childNode.type === 'JSXExpressionContainer') {
-          return true;
-        } // Check for comonents with the provided name.
-
-
-        if (childNode.type === 'JSXElement' && childNode.openingElement && (0, _jsxAstUtils.elementType)(childNode.openingElement) === componentName) {
-          return true;
-        }
-
-        if (traverseChildren(childNode, depth + 1)) {
-          return true;
-        }
-      }
-    }
-
-    return false;
-  }
-
-  return traverseChildren(root, 1);
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/mayHaveAccessibleLabel.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/mayHaveAccessibleLabel.js
deleted file mode 100644
index d821dac..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/mayHaveAccessibleLabel.js
+++ /dev/null
@@ -1,93 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports["default"] = mayHaveAccessibleLabel;
-
-var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
-
-var _arrayIncludes = _interopRequireDefault(require("array-includes"));
-
-var _jsxAstUtils = require("jsx-ast-utils");
-
-/**
- * Returns true if a labelling element is found or if it cannot determine if
- * a label is present because of expression containers or spread attributes.
- * A false return value means that the node definitely does not have a label,
- * but a true return return value means that the node may or may not have a
- * label.
- *
- * 
- */
-function hasLabellingProp(openingElement) {
-  var additionalLabellingProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
-  var labellingProps = ['alt', // Assume alt is used correctly on an image
-  'aria-label', 'aria-labelledby'].concat((0, _toConsumableArray2["default"])(additionalLabellingProps));
-  return openingElement.attributes.some(function (attribute) {
-    // We must assume that a spread value contains a labelling prop.
-    if (attribute.type !== 'JSXAttribute') {
-      return true;
-    } // Attribute matches.
-
-
-    if ((0, _arrayIncludes["default"])(labellingProps, (0, _jsxAstUtils.propName)(attribute)) && !!(0, _jsxAstUtils.getPropValue)(attribute)) {
-      return true;
-    }
-
-    return false;
-  });
-}
-
-function mayHaveAccessibleLabel(root) {
-  var maxDepth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
-  var additionalLabellingProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
-
-  function checkElement(node, depth) {
-    // Bail when maxDepth is exceeded.
-    if (depth > maxDepth) {
-      return false;
-    } // Check for literal text.
-
-
-    if (node.type === 'Literal' && !!node.value) {
-      return true;
-    } // Assume an expression container renders a label. It is the best we can
-    // do in this case.
-
-
-    if (node.type === 'JSXExpressionContainer') {
-      return true;
-    } // Check for JSXText.
-    // $FlowFixMe Remove after updating ast-types-flow
-
-
-    if (node.type === 'JSXText' && !!node.value) {
-      return true;
-    } // Check for labelling props.
-
-
-    if (node.openingElement
-    /* $FlowFixMe */
-    && hasLabellingProp(node.openingElement, additionalLabellingProps)) {
-      return true;
-    } // Recurse into the child element nodes.
-
-
-    if (node.children) {
-      /* $FlowFixMe */
-      for (var i = 0; i < node.children.length; i += 1) {
-        /* $FlowFixMe */
-        if (checkElement(node.children[i], depth + 1)) {
-          return true;
-        }
-      }
-    }
-
-    return false;
-  }
-
-  return checkElement(root, 0);
-}
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/lib/util/schemas.js b/node_modules/eslint-plugin-jsx-a11y/lib/util/schemas.js
deleted file mode 100644
index 7238ced..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/lib/util/schemas.js
+++ /dev/null
@@ -1,54 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.generateObjSchema = exports.enumArraySchema = exports.arraySchema = void 0;
-
-/**
- * JSON schema to accept an array of unique strings
- */
-var arraySchema = {
-  type: 'array',
-  items: {
-    type: 'string'
-  },
-  uniqueItems: true,
-  additionalItems: false
-};
-/**
- * JSON schema to accept an array of unique strings from an enumerated list.
- */
-
-exports.arraySchema = arraySchema;
-
-var enumArraySchema = function enumArraySchema() {
-  var enumeratedList = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
-  var minItems = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
-  return Object.assign({}, arraySchema, {
-    items: {
-      type: 'string',
-      "enum": enumeratedList
-    },
-    minItems
-  });
-};
-/**
- * Factory function to generate an object schema
- * with specified properties object
- */
-
-
-exports.enumArraySchema = enumArraySchema;
-
-var generateObjSchema = function generateObjSchema() {
-  var properties = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-  var required = arguments.length > 1 ? arguments[1] : undefined;
-  return {
-    type: 'object',
-    properties,
-    required
-  };
-};
-
-exports.generateObjSchema = generateObjSchema;
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-jsx-a11y/package.json b/node_modules/eslint-plugin-jsx-a11y/package.json
deleted file mode 100644
index d8446ec..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/package.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
-  "name": "eslint-plugin-jsx-a11y",
-  "version": "6.2.3",
-  "description": "Static AST checker for accessibility rules on JSX elements.",
-  "keywords": [
-    "eslint",
-    "eslintplugin",
-    "eslint-plugin",
-    "a11y",
-    "accessibility",
-    "jsx"
-  ],
-  "author": "Ethan Cohen",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/evcohen/eslint-plugin-jsx-a11y"
-  },
-  "main": "lib/index.js",
-  "scripts": {
-    "build": "rimraf lib && babel src --out-dir lib --copy-files",
-    "coveralls": "cat ./reports/lcov.info | coveralls",
-    "create": "node ./scripts/create-rule",
-    "flow": "if [ ! -e ./.flowconfig ]; then echo \"Could not find .flowconfig\"; else flow; test $? -eq 0 -o $? -eq 2; fi",
-    "lint:fix": "npm run lint -- --fix",
-    "lint": "eslint  --config .eslintrc src __tests__ __mocks__ scripts",
-    "prepublish": "safe-publish-latest && not-in-publish || (npm run lint && npm run flow && npm run jest && npm run build)",
-    "pretest": "npm run lint:fix && npm run flow",
-    "test": "npm run jest",
-    "test:ci": "npm run jest -- --ci --runInBand",
-    "jest": "jest --coverage __tests__/**/*"
-  },
-  "devDependencies": {
-    "@babel/cli": "^7.4.4",
-    "@babel/core": "^7.0.0",
-    "@babel/plugin-transform-flow-strip-types": "^7.2.3",
-    "babel-eslint": "^10.0.1",
-    "babel-jest": "^24.0.0",
-    "babel-preset-airbnb": "^4.0.0",
-    "coveralls": "^3.0.1",
-    "eslint": "^3 || ^4 || ^5 || ^6",
-    "eslint-config-airbnb-base": "^13.0.0",
-    "eslint-plugin-flowtype": "^3.5.0",
-    "eslint-plugin-import": "^2.18.0",
-    "estraverse": "^4.2.0",
-    "expect": "^24.3.1",
-    "flow-bin": "^0.102.0",
-    "in-publish": "^2.0.0",
-    "jest": "^24.0.0",
-    "jscodeshift": "^0.6.0",
-    "minimist": "^1.2.0",
-    "object.assign": "^4.1.0",
-    "rimraf": "^2.6.3",
-    "safe-publish-latest": "^1.1.1",
-    "to-ast": "^1.0.0"
-  },
-  "engines": {
-    "node": ">=4.0"
-  },
-  "license": "MIT",
-  "dependencies": {
-    "@babel/runtime": "^7.4.5",
-    "aria-query": "^3.0.0",
-    "array-includes": "^3.0.3",
-    "ast-types-flow": "^0.0.7",
-    "axobject-query": "^2.0.2",
-    "damerau-levenshtein": "^1.0.4",
-    "emoji-regex": "^7.0.2",
-    "has": "^1.0.3",
-    "jsx-ast-utils": "^2.2.1"
-  },
-  "peerDependencies": {
-    "eslint": "^3 || ^4 || ^5 || ^6"
-  },
-  "jest": {
-    "coverageReporters": [
-      "lcov",
-      "html"
-    ],
-    "coverageDirectory": "reports",
-    "roots": [
-      "__tests__"
-    ],
-    "testPathIgnorePatterns": [
-      "__tests__/__util__/"
-    ],
-    "testEnvironment": "node"
-  },
-  "greenkeeper": {
-    "ignore": [
-      "jest",
-      "babel-jest"
-    ]
-  }
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/scripts/addRuleToIndex.js b/node_modules/eslint-plugin-jsx-a11y/scripts/addRuleToIndex.js
deleted file mode 100644
index 12657a2..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/scripts/addRuleToIndex.js
+++ /dev/null
@@ -1,53 +0,0 @@
-export const parser = 'flow';
-
-export default function transformer(file, api, options) {
-  const j = api.jscodeshift;
-  const s = j(file.source);
-  const { ruleName, rulePath } = options || {};
-
-  const nameSort = (a, b) => {
-    const aName = a.key.type === 'Literal' ? a.key.value : a.key.name;
-    const bName = b.key.type === 'Literal' ? b.key.value : b.key.name;
-    if (aName < bName) {
-      return -1;
-    }
-    if (bName < aName) {
-      return 1;
-    }
-    return 0;
-  };
-
-  let changesMade = 0;
-
-  const rulePathInSrc = `./${rulePath.match(/src\/(.*)\.js/)[1]}`;
-
-  changesMade += s
-    .find(j.Identifier, {
-      name: 'rules',
-    })
-    .forEach((path, index) => {
-      // Add rule path.
-      if (index === 0) {
-        path.parentPath.value.value.properties.unshift(j.property(
-          'init',
-          j.literal(ruleName),
-          j.callExpression(j.identifier('require'), [j.literal(rulePathInSrc)]),
-        ));
-        path.parentPath.value.value.properties.sort(nameSort);
-      }
-      // Set default reporting to error.
-      if (index === 1) {
-        path.parentPath.value.value.properties.unshift(j.property('init', j.literal(`jsx-a11y/${ruleName}`), j.literal('error')));
-        path.parentPath.value.value.properties.sort(nameSort);
-      }
-    }).length;
-
-  if (changesMade === 0) {
-    return null;
-  }
-
-  return s.toSource({
-    quote: 'single',
-    trailingComma: true,
-  });
-}
diff --git a/node_modules/eslint-plugin-jsx-a11y/scripts/boilerplate/doc.js b/node_modules/eslint-plugin-jsx-a11y/scripts/boilerplate/doc.js
deleted file mode 100644
index 0eb9bc5..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/scripts/boilerplate/doc.js
+++ /dev/null
@@ -1,24 +0,0 @@
-const docBoilerplateGenerator = name => `# ${name}
-
-Write a useful explanation here!
-
-### References
-
-  1.
-
-## Rule details
-
-This rule takes no arguments.
-
-### Succeed
-\`\`\`jsx
-<div />
-\`\`\`
-
-### Fail
-\`\`\`jsx
-
-\`\`\`
-`;
-
-module.exports = docBoilerplateGenerator;
diff --git a/node_modules/eslint-plugin-jsx-a11y/scripts/boilerplate/rule.js b/node_modules/eslint-plugin-jsx-a11y/scripts/boilerplate/rule.js
deleted file mode 100644
index cfc90ef..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/scripts/boilerplate/rule.js
+++ /dev/null
@@ -1,35 +0,0 @@
-const ruleBoilerplate = (author, description) => `/**
- * @fileoverview ${description}
- * @author ${author}
- * @flow
- */
-
-// ----------------------------------------------------------------------------
-// Rule Definition
-// ----------------------------------------------------------------------------
-
-import type { JSXOpeningElement } from 'ast-types-flow';
-import { generateObjSchema } from '../util/schemas';
-
-const errorMessage = '';
-
-const schema = generateObjSchema();
-
-module.exports = {
-  meta: {
-    docs: {},
-    schema: [schema],
-  },
-
-  create: (context: ESLintContext) => ({
-    JSXOpeningElement: (node: JSXOpeningElement) => {
-      context.report({
-        node,
-        message: errorMessage,
-      });
-    },
-  }),
-};
-`;
-
-module.exports = ruleBoilerplate;
diff --git a/node_modules/eslint-plugin-jsx-a11y/scripts/boilerplate/test.js b/node_modules/eslint-plugin-jsx-a11y/scripts/boilerplate/test.js
deleted file mode 100644
index 46f220d..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/scripts/boilerplate/test.js
+++ /dev/null
@@ -1,34 +0,0 @@
-const testBoilerplate = (name, author, description) => `/* eslint-env jest */
-/**
- * @fileoverview ${description}
- * @author ${author}
- */
-
-// -----------------------------------------------------------------------------
-// Requirements
-// -----------------------------------------------------------------------------
-
-import { RuleTester } from 'eslint';
-import parserOptionsMapper from '../../__util__/parserOptionsMapper';
-import rule from '../../../src/rules/${name}';
-
-// -----------------------------------------------------------------------------
-// Tests
-// -----------------------------------------------------------------------------
-
-const ruleTester = new RuleTester();
-
-const expectedError = {
-  message: '',
-  type: 'JSXOpeningElement',
-};
-
-ruleTester.run('${name}', rule, {
-  valid: [
-    { code: '<div />;' },
-  ].map(parserOptionsMapper),
-  invalid: [].map(parserOptionsMapper),
-});
-`;
-
-module.exports = testBoilerplate;
diff --git a/node_modules/eslint-plugin-jsx-a11y/scripts/create-rule.js b/node_modules/eslint-plugin-jsx-a11y/scripts/create-rule.js
deleted file mode 100755
index 30bc8bb..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/scripts/create-rule.js
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env node --harmony
-const path = require('path');
-const fs = require('fs');
-const { exec } = require('child_process');
-const argv = require('minimist')(process.argv.slice(2)); // eslint-disable-line import/no-extraneous-dependencies
-const jscodeshiftJSON = require('jscodeshift/package.json'); // eslint-disable-line import/no-extraneous-dependencies
-
-const ruleBoilerplateGenerator = require('./boilerplate/rule');
-const testBoilerplateGenerator = require('./boilerplate/test');
-const docBoilerplateGenerator = require('./boilerplate/doc');
-
-const ruleName = argv._[0];
-const author = argv.author || '$AUTHOR';
-const description = argv.description || '$DESCRIPTION';
-
-const rulePath = path.resolve(`src/rules/${ruleName}.js`);
-const testPath = path.resolve(`__tests__/src/rules/${ruleName}-test.js`);
-const docsPath = path.resolve(`docs/rules/${ruleName}.md`);
-
-const jscodeshiftMain = jscodeshiftJSON.main;
-const jscodeshiftPath = require.resolve('jscodeshift');
-const jscodeshiftRoot = jscodeshiftPath.slice(0, jscodeshiftPath.indexOf(jscodeshiftMain));
-
-// Validate
-if (!ruleName) {
-  throw new Error('Rule name is required');
-} else if (fs.existsSync(rulePath)) {
-  throw new Error('Rule already exists!');
-}
-
-// Generate file boilerplate
-const ruleBoilerplate = ruleBoilerplateGenerator(author, description);
-const testBoilerplate = testBoilerplateGenerator(ruleName, author, description);
-const docBoilerplate = docBoilerplateGenerator(ruleName);
-
-// Create new files
-fs.writeFileSync(rulePath, ruleBoilerplate);
-fs.writeFileSync(testPath, testBoilerplate);
-fs.writeFileSync(docsPath, docBoilerplate);
-
-// Add the rule to the index
-exec(
-  [
-    path.join(jscodeshiftRoot, jscodeshiftJSON.bin.jscodeshift),
-    './src/index.js',
-    '-t ./scripts/addRuleToIndex.js',
-    '--extensions js',
-    '--parser flow',
-    `--ruleName=${ruleName}`,
-    `--rulePath=${rulePath}`,
-  ].join(' '),
-  (error) => {
-    if (error) {
-      console.error(`exec error: ${error}`); // eslint-disable-line no-console
-    }
-  },
-);
diff --git a/node_modules/eslint-plugin-jsx-a11y/scripts/create-rule.md b/node_modules/eslint-plugin-jsx-a11y/scripts/create-rule.md
deleted file mode 100644
index af6bdde..0000000
--- a/node_modules/eslint-plugin-jsx-a11y/scripts/create-rule.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Rule Generator
-
-```bash
-$ node scripts/create-rule.js rule-name --author="Your name" --description="Description of the rule"
-# OR with npm script alias
-$ npm run create -- rule-name --author="Your name" --description="Description of rule"
-```
-
-This script will generate three files with basic boilerplate for the given rule:
-1. src/rules/${rule-name}.js
-2. \__tests__/src/rules/${rule-name}-test.js
-3. docs/rules/${rule-name}.md
-
-If the rule already exists or is not specified in the correct format, an error will be thrown.
-
-If we wanted to scaffold a rule for `no-marquee`, we could run:
-```bash
-$ node scripts/create-rule.js no-marquee --author="Ethan Cohen <@evcohen>" --description="Enforce <marquee> elements are not used."
-# OR
-$ npm run create -- no-marquee --author="Ethan Cohen <@evcohen>" --description="Enforce <marquee> elements are not used."
-```
diff --git a/node_modules/eslint-plugin-react/CHANGELOG.md b/node_modules/eslint-plugin-react/CHANGELOG.md
deleted file mode 100644
index 978f887..0000000
--- a/node_modules/eslint-plugin-react/CHANGELOG.md
+++ /dev/null
@@ -1,2933 +0,0 @@
-# Change Log
-All notable changes to this project will be documented in this file.
-This project adheres to [Semantic Versioning](http://semver.org/).
-This change log adheres to standards from [Keep a CHANGELOG](http://keepachangelog.com).
-
-## [7.19.0] - 2020-03-06
-
-### Added
- * [`style-prop-object`][]: Add `allow` option ([#1819][] @hornta)
- * [`jsx-pascal-case`][]: Support unicode characters ([#2557][] @Svish)
-
-### Fixed
- * [`prefer-stateless-function`][]: avoid crash on ts empty constructor ([#2582][] @golopot)
- * [`no-adjacent-inline-elements`][]: avoid a crash ([#2575] @ljharb)
- * [`no-unused-prop-types`][]: Change the reporting to point to a more accurate node ([#2292][] @jseminck)
- * [`self-closing-comp`][]: consider JSXMemberExpression as component too ([#2572][] @Belco90)
- * [`no-unused-prop-types`][]: make `markPropTypesAsUsed` work with `TSEmptyBodyFunctionExpression` AST node ([#2560][] @guillaumewuip)
- * [`displayName`][] (but really, `propTypes` detection): do not crash on empty flow type spreads ([#2570][] @ljharb)
-
-### Changed
- * [readme] Small visual inconsistency ([#2568] @arvigeus)
- * [docs] add `react/` prefix to rule name, for consistency
- * [`no-unescaped-entities`][]: skip test cases that are now parsing errors in acorn-jsx@5.2.0 ([#2583] @golopot)
-
-[7.19.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.18.3...v7.19.0
-[#2583]: https://github.com/yannickcr/eslint-plugin-react/pull/2583
-[#2582]: https://github.com/yannickcr/eslint-plugin-react/pull/2582
-[#2575]: https://github.com/yannickcr/eslint-plugin-react/issue/2575
-[#2572]: https://github.com/yannickcr/eslint-plugin-react/pull/2572
-[#2570]: https://github.com/yannickcr/eslint-plugin-react/issue/2570
-[#2568]: https://github.com/yannickcr/eslint-plugin-react/pull/2568
-[#2560]: https://github.com/yannickcr/eslint-plugin-react/pull/2560
-[#2557]: https://github.com/yannickcr/eslint-plugin-react/pull/2557
-[#2292]: https://github.com/yannickcr/eslint-plugin-react/pull/2292
-[#1819]: https://github.com/yannickcr/eslint-plugin-react/pull/1819
-
-## [7.18.3] - 2020-02-02
-
-### Fixed
- * [`jsx-indent`][]: don't check literals not within JSX ([#2564][] @toshi-toma)
-
-[7.18.3]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.18.2...v7.18.3
-[#2564]: https://github.com/yannickcr/eslint-plugin-react/issue/2564
-
-## [7.18.2] - 2020-02-01
-
-### Fixed
- * [`jsx-indent`][]: avoid a crash on non-string literals ([#2561][] @ljharb)
-
-[7.18.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.18.1...v7.18.2
-[#2561]: https://github.com/yannickcr/eslint-plugin-react/issue/2561
-
-## [7.18.1] - 2020-02-01
-
-### Fixed
- * [`jsx-indent`][]: Does not check indents for JSXText ([#2542][] @toshi-toma)
- * [`jsx-props-no-spreading`][]: add support for namespaced jsx components ([#2534][] @jonathanpalma)
- * [`jsx-no-target-blank`][]: allow rel to be an expression ([#2544][] @odinho)
- * [`sort-comp`][]: `|` isn’t a valid regex flag; `u` and `s` are (@ljharb)
-
-### Changed
- * [Docs] use `markdown-magic` to automatically sort all rules alphabetically ([#1742][] @ybiquitous)
- * [Docs] [`jsx-props-no-spreading`][]: fix typo to use correct rule ([#2547][] @jonggyun))
-
-[7.18.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.18.0...v7.18.1
-[#2547]: https://github.com/yannickcr/eslint-plugin-react/pull/2547
-[#2544]: https://github.com/yannickcr/eslint-plugin-react/pull/2544
-[#2542]: https://github.com/yannickcr/eslint-plugin-react/pull/2542
-[#2534]: https://github.com/yannickcr/eslint-plugin-react/pull/2534
-[#1742]: https://github.com/yannickcr/eslint-plugin-react/pull/1742
-
-## [7.18.0] - 2020-01-15
-
-### Added
- * [`require-default-props`][]: add option to ignore functional components ([#2532][] @RedTn)
- * [`function-component-definition`][]: Enforce a specific function type for function components ([#2414][] @Stefanwullems)
- * [`no-adjacent-inline-elements`][]: Prevent adjacent inline elements not separated by whitespace ([#1155][] @SeanHayes)
- * [`jsx-no-script-url`][]: prevent usage of `javascript:` URLs ([#2419][] @sergei-startsev)
-
-### Fixed
- * [`jsx-pascal-case`][]: false negative with namespacing ([#1337][] @mfyuce)
- * [`jsx-curly-brace-presence`][]: Fix `curly-brace-presence` edge cases ([#2523][] @rafbgarcia)
- * [`prop-types`][]: Does not validate missing propTypes for LogicalExpression ([#2533][] @toshi-toma)
- * [`no-unknown-property`][]: allowTransparency does not exist in React >= v16.1 ([#1538][] @dawidvdh)
- * [`jsx-curly-brace-presence`][]: Fix error related to tags line break ([#2521][] @rafbgarcia)
- * [`no-typos`][]: Compilation error when method name is string instead of identifier ([#2514][] @shijistar)
- * [`jsx-curly-brace-presence`][]: allow trailing spaces in TemplateLiteral ([#2507][] @doochik)
- * [`no-unused-prop-types`], [`no-unused-state`]: fix false positives when using TS type assertions ([#2536][] @kdmadej)
-
-### Changed
- * [Docs] [`no-render-return-value`][]: Fix title ([#2540][] @micnic)
- * [Refactor]: remove unused codes in util/propTypes ([#2288][] @golopot)
- * [`no-typos`]: check static lifecycle methods ([#2006][] @bsonntag)
- * [Docs] [`jsx-first-prop-new-line`][]: Fix rule name in "Rule Options" section ([#2535][] @barreira)
- * [Tests] [`no-unused-prop-types`][]: Added test cases ([#977][] @dozoisch)
- * [Tests] avoid running tests on pretest job
- * [meta] Move eslint-plugin-eslint-plugin to devDeps ([#2510][] @nstepien)
- * [Deps] update `array-includes`, `object.entries`, `object.fromentries`, `object.values`, `resolve`
-
-[7.18.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.17.0...v7.18.0
-[#2540]: https://github.com/yannickcr/eslint-plugin-react/pull/2540
-[#2536]: https://github.com/yannickcr/eslint-plugin-react/pull/2536
-[#2535]: https://github.com/yannickcr/eslint-plugin-react/pull/2535
-[#2533]: https://github.com/yannickcr/eslint-plugin-react/pull/2533
-[#2532]: https://github.com/yannickcr/eslint-plugin-react/pull/2532
-[#2523]: https://github.com/yannickcr/eslint-plugin-react/pull/2523
-[#2521]: https://github.com/yannickcr/eslint-plugin-react/pull/2521
-[#2514]: https://github.com/yannickcr/eslint-plugin-react/pull/2514
-[#2510]: https://github.com/yannickcr/eslint-plugin-react/pull/2510
-[#2507]: https://github.com/yannickcr/eslint-plugin-react/pull/2507
-[#2419]: https://github.com/yannickcr/eslint-plugin-react/pull/2419
-[#2414]: https://github.com/yannickcr/eslint-plugin-react/pull/2414
-[#2288]: https://github.com/yannickcr/eslint-plugin-react/pull/2288
-[#2006]: https://github.com/yannickcr/eslint-plugin-react/pull/2006
-[#1538]: https://github.com/yannickcr/eslint-plugin-react/pull/1538
-[#1337]: https://github.com/yannickcr/eslint-plugin-react/pull/1337
-[#1155]: https://github.com/yannickcr/eslint-plugin-react/pull/1155
-[#977]: https://github.com/yannickcr/eslint-plugin-react/pull/977
-
-## [7.17.0] - 2019-11-28
-
-### Added
- * [`jsx-no-target-blank`][]: add `allowReferrer` option ([#2478][] @eps1lon)
- * [`jsx-handler-names`][]: add `checkLocalVariables` option ([#2470][] @aub)
- * [`prop-types`][]: Support Flow Type spread ([#2446][] @moroine)
- * [`jsx-props-no-spreading`][]: add `explicitSpread` option to allow explicit spread of props ([#2449][] @pawelnvk)
- * [`jsx-no-target-blank`][]: warn on `target={'_blank'}` expressions ([#2451][] @timkraut)
- * [`function-component-definition`]: Enforce a specific function type for function components ([#2414][] @Stefanwullems)
-
-### Fixed
- * [`sort-prop-types`][], [`jsx-sort-default-props`][]: disable broken autofix ([#2505][] @webOS101)
- * [`no-typos`][]: improve report location ([#2468][] @golopot)
- * [`jsx-no-literals`][]: trim whitespace for `allowedStrings` check ([#2436][] @cainlevy)
- * [`jsx-curly-brace-presence`][]: Fix filter of undefined error with whitespace inside jsx attr curlies ([#2460][] @dustinyoste)
- * [`no-render-return-value`][]: should warn when used in assignment expression ([#2462][] @jichu4n)
- * [`jsx-curly-brace-presence`][]: allow trailing spaces in literal ([#2448][] @doochik)
-
-### Changed
- * [Deps] update `jsx-ast-utils`, `object.fromentries`, `resolve`
- * [eslint] fix func-names and change object-shorthand to 'always' ([#2483][] @golopot)
- * [Docs] `jsx-first-prop-new-line`: Fix documentation formatting ([#2489][] @pjg)
- * [Docs] [`prop-types`][]: Update 'skipUndeclared' in rule options ([#2504][] @cjnickel)
- * [Docs] [`jsx-first-prop-new-line`][]: fix wrong rule name ([#2500][] @zgayjjf)
- * [eslint] enable eslint-plugin-eslint-plugin ([#2469][] @golopot)
- * [Docs] [`jsx-props-no-multi-spaces`][]: suggest using core rule instead ([#2463][] @golopot)
- * [Docs] [`jsx-first-prop-new-line`][]: add rule options ([#2465][] @SerdarMustafa1)
- * [Docs] [`jsx-no-target-blank`][]: Add section about overriding for trusted links ([#2438][] @aschriner)
- * [Docs] fix typo ([#2453][] @cainwatson)
- * [Docs] [`no-unused-prop-types`][]: clean up prose ([#2273][] @coryhouse)
- * [Docs] [`jsx-no-bind`][]: add section about React Hooks ([#2443][] @kdex)
-
-[7.17.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.16.0...v7.17.0
-[#2532]: https://github.com/yannickcr/eslint-plugin-react/pull/2532
-[#2505]: https://github.com/yannickcr/eslint-plugin-react/pull/2505
-[#2504]: https://github.com/yannickcr/eslint-plugin-react/pull/2504
-[#2500]: https://github.com/yannickcr/eslint-plugin-react/pull/2500
-[#2489]: https://github.com/yannickcr/eslint-plugin-react/pull/2489
-[#2483]: https://github.com/yannickcr/eslint-plugin-react/pull/2483
-[#2478]: https://github.com/yannickcr/eslint-plugin-react/pull/2478
-[#2470]: https://github.com/yannickcr/eslint-plugin-react/pull/2470
-[#2469]: https://github.com/yannickcr/eslint-plugin-react/pull/2469
-[#2468]: https://github.com/yannickcr/eslint-plugin-react/pull/2468
-[#2465]: https://github.com/yannickcr/eslint-plugin-react/pull/2465
-[#2463]: https://github.com/yannickcr/eslint-plugin-react/pull/2463
-[#2460]: https://github.com/yannickcr/eslint-plugin-react/pull/2460
-[#2453]: https://github.com/yannickcr/eslint-plugin-react/pull/2453
-[#2451]: https://github.com/yannickcr/eslint-plugin-react/pull/2451
-[#2449]: https://github.com/yannickcr/eslint-plugin-react/pull/2449
-[#2448]: https://github.com/yannickcr/eslint-plugin-react/pull/2448
-[#2446]: https://github.com/yannickcr/eslint-plugin-react/pull/2446
-[#2443]: https://github.com/yannickcr/eslint-plugin-react/pull/2443
-[#2438]: https://github.com/yannickcr/eslint-plugin-react/pull/2438
-[#2436]: https://github.com/yannickcr/eslint-plugin-react/pull/2436
-[#2414]: https://github.com/yannickcr/eslint-plugin-react/pull/2414
-[#2273]: https://github.com/yannickcr/eslint-plugin-react/pull/2273
-
-## [7.16.0] - 2019-10-04
-
-### Added
-* [`jsx-sort-default-props`][]: make rule fixable ([#2429][] @emroussel)
-
-### Fixed
-* [`jsx-no-useless-fragment`][]: use `array-includes` over `.includes` for back compat (@ljharb)
-* [`jsx-curly-brace-presence`][]: allow necessary white-space literal ([#2437][] @uniqname)
-* [`jsx-curly-brace-presence`][]: warns incorrectly on trailing whitespace ([#2431][] @BC-M)
-* [`no-unused-prop-types`][]: false positive when nested destructuring ([#2428][] @golopot)
-
-[7.16.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.15.1...v7.16.0
-[#2437]: https://github.com/yannickcr/eslint-plugin-react/pull/2437
-[#2431]: https://github.com/yannickcr/eslint-plugin-react/pull/2431
-[#2429]: https://github.com/yannickcr/eslint-plugin-react/pull/2429
-[#2428]: https://github.com/yannickcr/eslint-plugin-react/pull/2428
-
-## [7.15.1] - 2019-10-01
-
-### Fixed
-* [`jsx-curly-brace-presence`][]: bail out checks when JSXElements are passed as props ([#2426][] @vedadeepta)
-
-### Changed
-* [Docs] [`prefer-es6-class`][]: Fix typos ([#2425][] @spencerbyw)
-
-[7.15.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.15.0...v7.15.1
-[#2426]: https://github.com/yannickcr/eslint-plugin-react/pull/2426
-[#2425]: https://github.com/yannickcr/eslint-plugin-react/pull/2425
-
-## [7.15.0] - 2019-09-30
-
-### Added
-* add [`jsx-no-useless-fragment`][] rule ([#2261][] @golopot)
-* [`jsx-handler-name`][]: allow `false` to disable `eventHandlerPrefix`/`eventHandlerPropPrefix` ([#2410][] @tanmoyopenroot)
-* [`sort-comp`][]: add `static-variables` grouping ([#2408][] @vedadeepta)
-* [`jsx-no-literals`][]: Add `allowedStrings` option ([#2380][] @benhollander)
-* [`no-multi-comp`][]: Added handling for `forwardRef` and `memo` wrapping components declared in the same file ([#2184][] @jenil94)
-* [`jsx-pascal-case`][]: `allowAllCaps` option now allows `SCREAMING_SNAKE_CASE` ([#2364][] @TylerR909)
-
-### Fixed
-* [`jsx-indent`][]: Fix false positive when a jsx element is the last statement within a do expression (with tests) ([#2200][] @Kenneth-KT)
-* [`jsx-curly-brace-presence`][]: fix jsx tags in braces ([#2422][] @tanmoyopenroot)
-* [`display-name`][]: Fix false positives ([#2399][] @BPScott)
-* [`jsx-curly-brace-presence`][]: report unnecessary curly braces with children on next line ([#2409][] @vedadeepta)
-* [`no-unused-prop-types`][]: false positive with callback ([#2375][] @golopot)
-* Fix prop-types detection collision on renamed props ([#2383][] @yannickcr)
-* [`jsx-sort-props`][]: use localeCompare rather than comparison operator ([#2391][] @tanmoyopenroot)
-* [`jsx-pascal-case`][]: allow one-letter-named components ([#2395][] @Haegin)
-* [`jsx-wrap-multilines`][]: fix incorrect formatting ([#2392][] @tanmoyopenroot)
-* [`require-optimization`][]: fix when using arrow function in class components ([#2385][] @jenil94)
-* [`no-deprecated`][]: Deprecate cWM/cWRP/cWU lifecycle methods since React 16.9.0 ([#2378][] @meowtec)
-* [`jsx-key`][]: improve docs and confusing error message ([#2367][] @kaykayehnn)
-* Recognize props wrapped in flow $ReadOnly<> utility type ([#2361][] @lukeapage)
-* [`prop-types`][]: false positive with setState updator ([#2359][] @golopot)
-
-### Changed
-* [Docs] [`no-access-state-in-setstate`][]: update grammar ([#2418][] @neaumusic)
-* [`jsx-curly-brace-presence`][], [`jsx-one-expression-per-line`][], [`no-danger-with-children`][]: add `isWhiteSpaces` to `lib/util/jsx` ([#2409][] @vedadeepta)
-
-[7.15.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.14.3...v7.15.0
-[#2422]: https://github.com/yannickcr/eslint-plugin-react/pull/2422
-[#2410]: https://github.com/yannickcr/eslint-plugin-react/pull/2410
-[#2409]: https://github.com/yannickcr/eslint-plugin-react/pull/2409
-[#2408]: https://github.com/yannickcr/eslint-plugin-react/pull/2408
-[#2402]: https://github.com/yannickcr/eslint-plugin-react/pull/2402
-[#2399]: https://github.com/yannickcr/eslint-plugin-react/pull/2399
-[#2395]: https://github.com/yannickcr/eslint-plugin-react/pull/2395
-[#2392]: https://github.com/yannickcr/eslint-plugin-react/pull/2392
-[#2391]: https://github.com/yannickcr/eslint-plugin-react/pull/2391
-[#2385]: https://github.com/yannickcr/eslint-plugin-react/pull/2385
-[#2383]: https://github.com/yannickcr/eslint-plugin-react/issue/2383
-[#2380]: https://github.com/yannickcr/eslint-plugin-react/pull/2380
-[#2378]: https://github.com/yannickcr/eslint-plugin-react/pull/2378
-[#2375]: https://github.com/yannickcr/eslint-plugin-react/pull/2375
-[#2367]: https://github.com/yannickcr/eslint-plugin-react/pull/2367
-[#2364]: https://github.com/yannickcr/eslint-plugin-react/pull/2364
-[#2361]: https://github.com/yannickcr/eslint-plugin-react/pull/2361
-[#2359]: https://github.com/yannickcr/eslint-plugin-react/pull/2359
-[#2261]: https://github.com/yannickcr/eslint-plugin-react/pull/2261
-[#2200]: https://github.com/yannickcr/eslint-plugin-react/pull/2200
-[#2184]: https://github.com/yannickcr/eslint-plugin-react/pull/2184
-
-## [7.14.3] - 2019-07-23
-
-### Fixed
-* Fix [`prop-types`][] to ignore validation when Flow indexers are used ([#2330][] @yannickcr)
-* Fix error being thrown after the first warning when react version cannot be detected ([#2336][] @abhishekdev)
-* Fix component detection when `memo` and `forwardRef` are used together ([#2349][] @yannickcr)
-
-### Changed
-* Documentation improvements (@ljharb, [#2354][] @golopot)
-
-[7.14.3]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.14.2...v7.14.3
-[#2330]: https://github.com/yannickcr/eslint-plugin-react/issues/2330
-[#2336]: https://github.com/yannickcr/eslint-plugin-react/pull/2336
-[#2349]: https://github.com/yannickcr/eslint-plugin-react/issues/2349
-[#2354]: https://github.com/yannickcr/eslint-plugin-react/pull/2354
-
-## [7.14.2] - 2019-06-24
-
-### Fixed
-* Fix [`prop-types`][] crash on for...of destructuring ([#2326][] @yannickcr)
-
-[7.14.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.14.1...v7.14.2
-[#2326]: https://github.com/yannickcr/eslint-plugin-react/issues/2326
-
-## [7.14.1] - 2019-06-24
-
-### Fixed
-* Fix [`prop-types`][] crash on multiple destructuring ([#2319][] @golopot)
-
-[7.14.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.14.0...v7.14.1
-[#2319]: https://github.com/yannickcr/eslint-plugin-react/issues/2319
-
-## [7.14.0] - 2019-06-23
-
-### Added
-* Add [`jsx-curly-newline`][] rule ([#1493][] @golopot)
-* Add support for nested destructuring to [`prop-types`][] ([#296][] [#1422][] @golopot)
-* Add support for variables defined as props to [`prop-types`][] and [`no-unused-prop-types`][] ([#442][] [#833][] [#1002][] [#1116][] [#1257][] [#1764][] @golopot)
-* Add `checkFragmentShorthand` option to [`jsx-key`][] ([#2316][] @kaykayehnn)
-
-### Fixed
-* Fix [`no-did-mount-set-state`][] and [`no-did-update-set-state`][] to handle cDU and cDM defined as class properties ([#1595][] @jaaberg)
-* Fix [`sort-prop-types`][] cash when a shape PropType is defined in a variable ([#1749][] @alexzherdev)
-* Fix [`no-unused-state`][] false positive when using state of non-lifecycle method ([#2274][] @golopot)
-* Fix [`static-property-placement`][] false positive when accessing static property inside method ([#2283][] @dmason30)
-* Fix [`prop-type`][] detection for annotated props with default value ([#2298][] @yannickcr)
-
-### Changed
-* Add ESLint 6.0.0 as valid peerDependency (@yannickcr)
-* Improve [`no-render-return-value`][] performance ([#2259][] @golopot)
-* Change [`jsx-sort-props`][] to report errors only on the identifier ([#2312][] @MrHen)
-* Change to warn only once if react version cannot be detected ([#2276][] @ljharb)
-* Documentation improvements ([#2263][] @dimitropoulos, [#2262][] @ybiquitous, [#2295][] @battaglr, [#2302][] @Jason-Cooke, [#2303][] @golopot)
-* Code refactoring ([#2265][] [#2267][] [#2286][] [#2294][] @golopot, @ljharb)
-* Tests improvements ([#2304][] [#1047][] @golopot, @yannickcr)
-
-[7.14.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.13.0...v7.14.0
-[#296]: https://github.com/yannickcr/eslint-plugin-react/issues/296
-[#442]: https://github.com/yannickcr/eslint-plugin-react/issues/442
-[#833]: https://github.com/yannickcr/eslint-plugin-react/issues/833
-[#1002]: https://github.com/yannickcr/eslint-plugin-react/issues/1002
-[#1047]: https://github.com/yannickcr/eslint-plugin-react/issues/1047
-[#1116]: https://github.com/yannickcr/eslint-plugin-react/issues/1116
-[#1257]: https://github.com/yannickcr/eslint-plugin-react/issues/1257
-[#1422]: https://github.com/yannickcr/eslint-plugin-react/issues/1422
-[#1493]: https://github.com/yannickcr/eslint-plugin-react/issues/1493
-[#1595]: https://github.com/yannickcr/eslint-plugin-react/issues/1595
-[#1749]: https://github.com/yannickcr/eslint-plugin-react/issues/1749
-[#1764]: https://github.com/yannickcr/eslint-plugin-react/issues/1764
-[#2259]: https://github.com/yannickcr/eslint-plugin-react/pull/2259
-[#2262]: https://github.com/yannickcr/eslint-plugin-react/pull/2262
-[#2263]: https://github.com/yannickcr/eslint-plugin-react/pull/2263
-[#2265]: https://github.com/yannickcr/eslint-plugin-react/pull/2265
-[#2267]: https://github.com/yannickcr/eslint-plugin-react/pull/2267
-[#2274]: https://github.com/yannickcr/eslint-plugin-react/pull/2274
-[#2276]: https://github.com/yannickcr/eslint-plugin-react/issues/2276
-[#2283]: https://github.com/yannickcr/eslint-plugin-react/issues/2283
-[#2286]: https://github.com/yannickcr/eslint-plugin-react/pull/2286
-[#2294]: https://github.com/yannickcr/eslint-plugin-react/pull/2294
-[#2295]: https://github.com/yannickcr/eslint-plugin-react/pull/2295
-[#2298]: https://github.com/yannickcr/eslint-plugin-react/issues/2298
-[#2302]: https://github.com/yannickcr/eslint-plugin-react/pull/2302
-[#2303]: https://github.com/yannickcr/eslint-plugin-react/pull/2303
-[#2304]: https://github.com/yannickcr/eslint-plugin-react/pull/2304
-[#2312]: https://github.com/yannickcr/eslint-plugin-react/issues/2312
-[#2316]: https://github.com/yannickcr/eslint-plugin-react/pull/2316
-
-## [7.13.0] - 2019-05-03
-
-### Added
-* Make [`jsx-sort-props`][] fully fixable ([#2250][], @guliashvili)
-* [`boolean-prop-naming`][]: add `validateNested` option to validate shape prop names ([#2234][], @pawelnvk)
-* add [`static-property-placement`][] rule ([#2193][], @dmason30)
-* add "detect" for flow version ([#2233][], @jedwards1211)
-* [`jsx-indent`][]: Add `indentLogicalExpressions` option ([#2227][], @mdnsk)
-* add [`jsx-props-no-spreading`][] ([#2191][], @ashbhir)
-* [`no-string-refs`][]: Added `noTemplateLiteral` option ([#2167][], @jenil94)
-* add `linkComponents` setting ([#2116][], @gbakernet)
-* [`jsx-no-target-blank`][]: add support for `linkComponents` setting ([#2116][], @gbakernet)
-* Add [`state-in-constructor`][] rule ([#1945][], @lukyth)
-* Add [`prefer-read-only-props`][] rule ([#2110][], @golopot)
-* [`no-unescaped-entities`][]: more friendly error message; add config to adjust ([#2016][], @stevemao)
-
-### Fixed
-* [`jsx-props-no-multi-spaces`][]: support generic components (ts) ([#2256][], @mateuszsokola)
-* [`prop-types`][]: fix case with destructuring and default param ([#2246][], @golopot)
-* [`prefer-stateless-function`][]: Ignoring pure components without props and context usage ([#2238][], @pawelnvk)
-* `propTypes`: resolveSuperParameterPropsType: add null check ([#2232][], @jedwards1211)
-* [`self-closing-comp`][]: stop reporting single-line spaces ([#2210][], @golopot)
-* [`require-render-return`][]: more accurate report location ([#2229][], @golopot)
-* [`sort-prop-types`][]: Fix sorting props with numeric keys ([#2230][], @pawelnvk)
-* [`display-name`][]: fix false negative around nested functions ([#2225][], @dwelle)
-* [`no-unknown-property`][]: fix case like `<Foo.bar>` ([#2207][], @golopot)
-* [`jsx-curly-brace-presence`][]: accept multiline template string ([#2203][], @golopot)
-* [`jsx-one-expression-per-line`][]: fix when using tabs ([#2198][], @Ohar)
-* [`prop-types`][]: Fix false positive on computed member expression ([#2202][], @golopot)
-* [`jsx-sort-default-props`][]: fix case with spread ([#2182][], @VincentLanglet)
-* [`no-this-in-sfc`][]: Fix false positive on SFC defined as object property ([#2147][], @yannickcr)
-* [`sort-comp`][]: correctly recognize instance variables declared without explicit value ([#2183][], @yannickcr)
-* [`no-unused-state`][]: fix set state callback destructing & state use inside callback ([#2151][], @barakyosi)
-* [`no-multi-comp`][]: correctly ignore wrapped stateless components: ([#2145][], @yannickcr)
-* [`display-name`][]: avoid crash on for..of ([#2137][], @ljharb)
-
-### Changed
-* [Docs] [`no-access-state-in-setstate`][]: Use syntax highlighting for examples ([#2160][], @pReya)
-* [Docs] [`jsx-fragments`][]: add "fixable" note ([#2143][], @joshunger)
-* [Docs] Added shared settings info, React version default note ([#2180][], @samsch)
-* [Tests] [`jsx-curly-spacing`][]: add regression test case ([#2206][], @ColCh)
-
-[7.13.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.12.4...v7.13.0
-[#2256]: https://github.com/yannickcr/eslint-plugin-react/pull/2256
-[#2250]: https://github.com/yannickcr/eslint-plugin-react/pull/2250
-[#2246]: https://github.com/yannickcr/eslint-plugin-react/pull/2246
-[#2238]: https://github.com/yannickcr/eslint-plugin-react/pull/2238
-[#2234]: https://github.com/yannickcr/eslint-plugin-react/pull/2234
-[#2233]: https://github.com/yannickcr/eslint-plugin-react/pull/2233
-[#2232]: https://github.com/yannickcr/eslint-plugin-react/pull/2232
-[#2230]: https://github.com/yannickcr/eslint-plugin-react/pull/2230
-[#2229]: https://github.com/yannickcr/eslint-plugin-react/pull/2229
-[#2227]: https://github.com/yannickcr/eslint-plugin-react/pull/2227
-[#2225]: https://github.com/yannickcr/eslint-plugin-react/pull/2225
-[#2210]: https://github.com/yannickcr/eslint-plugin-react/pull/2210
-[#2207]: https://github.com/yannickcr/eslint-plugin-react/pull/2207
-[#2206]: https://github.com/yannickcr/eslint-plugin-react/pull/2206
-[#2203]: https://github.com/yannickcr/eslint-plugin-react/pull/2203
-[#2202]: https://github.com/yannickcr/eslint-plugin-react/pull/2202
-[#2198]: https://github.com/yannickcr/eslint-plugin-react/pull/2198
-[#2193]: https://github.com/yannickcr/eslint-plugin-react/pull/2193
-[#2191]: https://github.com/yannickcr/eslint-plugin-react/pull/2191
-[#2183]: https://github.com/yannickcr/eslint-plugin-react/issues/2183
-[#2182]: https://github.com/yannickcr/eslint-plugin-react/pull/2182
-[#2180]: https://github.com/yannickcr/eslint-plugin-react/pull/2180
-[#2167]: https://github.com/yannickcr/eslint-plugin-react/pull/2167
-[#2147]: https://github.com/yannickcr/eslint-plugin-react/issues/2147
-[#2145]: https://github.com/yannickcr/eslint-plugin-react/issues/2145
-[#2143]: https://github.com/yannickcr/eslint-plugin-react/pull/2143
-[#2137]: https://github.com/yannickcr/eslint-plugin-react/issues/2137
-[#2116]: https://github.com/yannickcr/eslint-plugin-react/pull/2116
-[#2110]: https://github.com/yannickcr/eslint-plugin-react/pull/2110
-[#2016]: https://github.com/yannickcr/eslint-plugin-react/pull/2016
-[#1945]: https://github.com/yannickcr/eslint-plugin-react/pull/1945
-
-## [7.12.4] - 2019-01-16
-
-### Fixed
-* [`no-unused-prop-types`][]: avoid a crash ([#2131][], @ljharb)
-* [`prop-types`][]: avoid further crashes from nonexistent nodes in unusedPropTypes ([#2127][], @ljharb)
-* [`prop-types`][]: Read name of callee object ([#2125][], @CrOrc)
-* [`prop-types`][]: Ignore reassignments when matching props declarations with components ([#2051][], [#1957][], @yannickcr)
-* [`prop-types`][], [`no-unused-prop-types`][], [`require-default-props`][]: Detect components with return statement in switch/case ([#2118][], @yannickcr)
-
-### Changed
-* [`prop-types`][], [`no-typos`][]: add passing test cases ([#2123][], [#2128][], [#2136][], [#2134][], @ljharb)
-
-[7.12.4]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.12.3...v7.12.4
-[#2136]: https://github.com/yannickcr/eslint-plugin-react/issues/2136
-[#2134]: https://github.com/yannickcr/eslint-plugin-react/issues/2134
-[#2131]: https://github.com/yannickcr/eslint-plugin-react/issues/2131
-[#2128]: https://github.com/yannickcr/eslint-plugin-react/issues/2128
-[#2127]: https://github.com/yannickcr/eslint-plugin-react/issues/2127
-[#2125]: https://github.com/yannickcr/eslint-plugin-react/pull/2125
-[#2123]: https://github.com/yannickcr/eslint-plugin-react/issues/2123
-[#2118]: https://github.com/yannickcr/eslint-plugin-react/issues/2118
-[#2051]: https://github.com/yannickcr/eslint-plugin-react/issues/2051
-[#1957]: https://github.com/yannickcr/eslint-plugin-react/issues/1957
-
-## [7.12.3] - 2019-01-04
-
-### Fixed
-* [`jsx-indent`][]: Prevent crash on valueless props ([#2120][], @jomasti)
-* [`jsx-fragments`][]: avoid crashing on self-closing fragments ([#2113][], @alexzherdev)
-* [`no-unused-prop-types`][]: Fix propType detection inside class bodies ([#2115][], @drx)
-* [`no-unused-prop-types`][]: fix issue with propTypes misclassifying props ([#2111][], @drx)
-* [`display-name`][]: fix false positive for `React.memo` ([#2109][], @jomasti)
-
-### Changed
-* [Docs] add a missing comma in the JSON settings ([#2117][], @haideralsh)
-* [Docs] update README to document React version detection ([#2114][], @mohsinulhaq)
-
-[7.12.3]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.12.2...v7.12.3
-[#2120]: https://github.com/yannickcr/eslint-plugin-react/issues/2120
-[#2117]: https://github.com/yannickcr/eslint-plugin-react/issues/2117
-[#2115]: https://github.com/yannickcr/eslint-plugin-react/issues/2115
-[#2114]: https://github.com/yannickcr/eslint-plugin-react/issues/2114
-[#2113]: https://github.com/yannickcr/eslint-plugin-react/issues/2113
-[#2111]: https://github.com/yannickcr/eslint-plugin-react/issues/2111
-[#2109]: https://github.com/yannickcr/eslint-plugin-react/issues/2109
-
-## [7.12.2] - 2019-01-02
-
-### Fixed
-* [`prop-types`][]: avoid crash on used prevProps ([#2095][], @ljharb)
-* Version warning: Link does not end with '.' ([#2103][], @yoyo837))
-* [`forbid-prop-types`][]: fix crash with propWrapper check on MemberExpressions ([#2104][], @ljharb)
-
-[7.12.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.12.1...v7.12.2
-[#2104]: https://github.com/yannickcr/eslint-plugin-react/issues/2104
-[#2103]: https://github.com/yannickcr/eslint-plugin-react/pull/2103
-[#2095]: https://github.com/yannickcr/eslint-plugin-react/issues/2095
-
-## [7.12.1] - 2019-01-01
-
-### Fixed
-* [`no-unused-state`][]: Fix crash with class fields ([#2098][], @jomasti)
-* [`prop-types`][]: Fix false positives inside lifecycle methods ([#2099][], @jomasti)
-* [`jsx-max-depth`][]: avoid a crash ([#2102][], @ljharb)
-* [`jsx-wrap-multilines`][]: avoid crash when no trailing newline ([#2100][], @ljharb)
-
-### Changed
-* Fix CHANGELOG.md ([#2097][], @alexzherdev)
-
-[7.12.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.12.0...v7.12.1
-[#2102]: https://github.com/yannickcr/eslint-plugin-react/issues/2102
-[#2100]: https://github.com/yannickcr/eslint-plugin-react/issues/2100
-[#2099]: https://github.com/yannickcr/eslint-plugin-react/pull/2099
-[#2098]: https://github.com/yannickcr/eslint-plugin-react/pull/2098
-[#2097]: https://github.com/yannickcr/eslint-plugin-react/pull/2097
-
-## [7.12.0] - 2018-12-27
-
-### Added
-* [`no-typos`]: Support createClass ([#1828][], @alexzherdev)
-* Support detecting React.forwardRef/React.memo ([#2089][], @jomasti)
-* [`jsx-indent`][]: add `checkAttributes` option for JSX attribute indentation ([#2086][], @jomasti)
-* Change allowed `propWrapperFunctions` setting values ([#2065][], @jomasti)
-* add [`jsx-fragments`][] rule to enforce fragment syntax ([#1994][], @alexzherdev)
-* Support "detect" option for React version setting ([#1978][], @alexzherdev)
-* Support shorthand fragment syntax in many rules ([#1956][], @alexzherdev)
-* [`jsx-no-literals`][]: print node value in warning message ([#2008][], @jlgonzalezdev)
-
-### Fixed
-* [`jsx-max-depth`][]: Fix depth of JSX siblings in a JSXEpressionContainer ([#1824][], @alexzherdev)
-* [`no-array-index-key`][]: fix in React.Children methods ([#2085][], @himynameisdave)
-* [`no-unused-state`][]: handle functional setState ([#2084][], @jomasti)
-* version errors should log to stderr, not stdout ([#2082][], @ljharb)
-* [`no-deprecated`][]: Disable legacy lifecycle methods linting for now ([#2069][], @sergei-startsev)
-* ensure that react and flow versions can be numbers ([#2056][], @ljharb)
-* [`forbid-foreign-prop-types`][]: ensure `allowInPropTypes` option applies to class fields ([#2040][], @Sheile)
-* [`jsx-wrap-multilines`][]: catch single missing newlines ([#1984][], @MrHen)
-* [`jsx-first-prop-new-line`][]: Fix for parsers (like TypeScript) ([#2026][], @HauptmannEck)
-* [`sort-comp`][]: Fix fixer in case of more than 10 props ([#2012][], @tihonove)
-* [`no-unused-state`][] Don't depend on state parameter name ([#1829][], @alexzherdev)
-* [`no-this-in-sfc`][] fix for class properties ([#1995][], @sergei-startsev)
-* [`no-this-in-sfc`][] fix rule behavior for arrow functions inside a class field ([#1989][], @sergei-startsev)
-* [`destructuring-assignment`][]: handle nested props usage ([#1983][], @alexzherdev)
-* [`sort-prop-types`][]: fix string property order ([#1977][], @metreniuk)
-* [`jsx-no-target-blank`][]: don’t crash when there’s no value ([#1949][], @ljharb)
-* [`prop-types`][], [`no-unused-prop-types`][]: better handle object spread ([#1939][], @alexzherdev)
-
-### Changed
-* [`jsx-fragments`][]: improve message text ([#2032][], @alexzherdev)
-* [`no-unsafe`][]: handle all unsafe life-cycle methods ([#2075][], @sergei-startsev)
-* [`require-default-props`][]: Change error message naming from singular defaultProp to plural defaultProps ([#2064][], @jseminck)
-* [Refactor] Extract used `propTypes` detection ([#1946][], @alexzherdev)
-* [Refactor] Extract `defaultProps` detection ([#1942][], @alexzherdev)
-* [Refactor] Extract required `propTypes` detection ([#2001][], @alexzherdev)
-* [Docs] [`no-did-mount-set-state`][], [`no-did-update-set-state`][], [`no-will-update-set-state`][]: fix docs URLs ([#2090][], @JBallin)
-* [Docs] Remove statement on GC in jsx-no-bind ([#2067][], @rickhanlonii)
-* [Docs] [`jsx-sort-props`][]: Fix small mistake ([#2044][], @dimitarnestorov)
-* [Docs] [`no-unescaped-entities`][]: add more escape examples ([#2015][], @stevemao)
-* [Docs] [`display-name`][]: mention default `ignoreTranspilerName` value ([#2002][], @OliverJAsh)
-* [Docs] [`jsx-no-target-blank`][]: Add full example ([#1988][], @atomcorp)
-* [Docs] Update [`jsx-no-target-blank`][].md ([#1953][], @brunocoelho)
-* [Changelog] fix "Ignore class properties" contributor ([#1941][], @alexzherdev)
-* [Tests] Remove redundant `require('babel-eslint')` from tests ([#2004][], @sergei-startsev)
-* [Tests] [`prop-types`][]: Add tests for prop-types destructuring ([#2029][], @sstern6)
-* [Tests] [`display-name`][]: add false positive component detection for destructured createElement ([#1098][], @arian)
-
-[7.12.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.11.1...v7.12.0
-[#2090]: https://github.com/yannickcr/eslint-plugin-react/pull/2090
-[#2089]: https://github.com/yannickcr/eslint-plugin-react/pull/2089
-[#2086]: https://github.com/yannickcr/eslint-plugin-react/pull/2086
-[#2085]: https://github.com/yannickcr/eslint-plugin-react/pull/2085
-[#2084]: https://github.com/yannickcr/eslint-plugin-react/pull/2084
-[#2082]: https://github.com/yannickcr/eslint-plugin-react/issues/2082
-[#2075]: https://github.com/yannickcr/eslint-plugin-react/pull/2075
-[#2069]: https://github.com/yannickcr/eslint-plugin-react/pull/2069
-[#2067]: https://github.com/yannickcr/eslint-plugin-react/pull/2067
-[#2065]: https://github.com/yannickcr/eslint-plugin-react/pull/2065
-[#2064]: https://github.com/yannickcr/eslint-plugin-react/pull/2064
-[#2056]: https://github.com/yannickcr/eslint-plugin-react/issues/2056
-[#2044]: https://github.com/yannickcr/eslint-plugin-react/pull/2044
-[#2040]: https://github.com/yannickcr/eslint-plugin-react/pull/2040
-[#2032]: https://github.com/yannickcr/eslint-plugin-react/pull/2032
-[#2029]: https://github.com/yannickcr/eslint-plugin-react/pull/2029
-[#2026]: https://github.com/yannickcr/eslint-plugin-react/pull/2026
-[#2015]: https://github.com/yannickcr/eslint-plugin-react/pull/2015
-[#2012]: https://github.com/yannickcr/eslint-plugin-react/pull/2012
-[#2008]: https://github.com/yannickcr/eslint-plugin-react/pull/2008
-[#2004]: https://github.com/yannickcr/eslint-plugin-react/pull/2004
-[#2002]: https://github.com/yannickcr/eslint-plugin-react/pull/2002
-[#2001]: https://github.com/yannickcr/eslint-plugin-react/pull/2001
-[#1995]: https://github.com/yannickcr/eslint-plugin-react/pull/1995
-[#1994]: https://github.com/yannickcr/eslint-plugin-react/pull/1994
-[#1989]: https://github.com/yannickcr/eslint-plugin-react/pull/1989
-[#1988]: https://github.com/yannickcr/eslint-plugin-react/pull/1988
-[#1984]: https://github.com/yannickcr/eslint-plugin-react/pull/1984
-[#1983]: https://github.com/yannickcr/eslint-plugin-react/pull/1983
-[#1978]: https://github.com/yannickcr/eslint-plugin-react/pull/1978
-[#1977]: https://github.com/yannickcr/eslint-plugin-react/pull/1977
-[#1956]: https://github.com/yannickcr/eslint-plugin-react/pull/1956
-[#1953]: https://github.com/yannickcr/eslint-plugin-react/pull/1953
-[#1949]: https://github.com/yannickcr/eslint-plugin-react/issues/1949
-[#1946]: https://github.com/yannickcr/eslint-plugin-react/pull/1946
-[#1942]: https://github.com/yannickcr/eslint-plugin-react/pull/1942
-[#1941]: https://github.com/yannickcr/eslint-plugin-react/pull/1941
-[#1939]: https://github.com/yannickcr/eslint-plugin-react/pull/1939
-[#1829]: https://github.com/yannickcr/eslint-plugin-react/pull/1829
-[#1828]: https://github.com/yannickcr/eslint-plugin-react/pull/1828
-[#1824]: https://github.com/yannickcr/eslint-plugin-react/pull/1824
-[#1098]: https://github.com/yannickcr/eslint-plugin-react/pull/1098
-
-## [7.11.1] - 2018-08-14
-### Fixed
-* stop crashing when assigning to propTypes ([#1932][], @alexzherdev)
-
-### Changed
-* Fix changelog links ([#1926][], @ferhatelmas)
-* Fix changelog links ([#1929][], @alexzherdev)
-
-[7.11.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.11.0...v7.11.1
-[#1932]: https://github.com/yannickcr/eslint-plugin-react/pull/1932
-[#1929]: https://github.com/yannickcr/eslint-plugin-react/pull/1929
-[#1926]: https://github.com/yannickcr/eslint-plugin-react/pull/1926
-
-## [7.11.0] - 2018-08-13
-### Added
-* [`jsx-one-expression-per-line`][]: add "allow" option ([#1924][], @alexzherdev)
-* [`sort-prop-types`][]: add autofix ([#1891][], @finnp)
-* [`jsx-no-bind`][]: Add ignoreDOMComponents option ([#1868][], @alexzherdev)
-* Output a warning if React version is missing in settings ([#1857][], @alexzherdev)
-
-### Fixed
-* [`destructuring-assignment`][]: Ignore class properties ([#1909][], @alexandernanberg)
-* [`destructuring-assignment`][], component detection: ignore components with confidence = 0 ([#1907][], @alexzherdev)
-* [`boolean-prop-naming`][]: Handle inline Flow type ([#1905][], @alexzherdev)
-* [`jsx-props-no-multi-spaces`][]: Handle member expressions ([#1890][], @alexzherdev)
-* [`sort-comp`][]: Allow methods to belong to any matching group ([#1858][], @nosilleg)
-* [`jsx-sort-props`][]: Fix `reservedFirst` ([#1883][], @fleischie)
-* [`prop-types`][]: (flow) Stop crashing on undefined or null properties ([#1860][], @nicholas-l)
-* [`no-unknown-property`][]: Make attribute "charset" valid ([#1863][], @silvenon)
-* [`no-deprecated`][]: report identifier AST node instead of the class node ([#1854][], @jsnajdr)
-* [`button-has-type`][]: Account for pragma ([#1851][], @alexzherdev)
-* [`button-has-type`][]: improve error message when an identifier is used as the value ([#1874][], @ljharb)
-* support JSXText nodes alongside Literal nodes (@ljharb)
-
-### Changed
-* Extract propTypes detection code ([#1911][], @alexzherdev)
-* Fix broken links in changelog ([#1849][], @alexzherdev)
-* [`no-unused-state`][]: combine spread visitors (@ljharb)
-* [`jsx-one-expression-per-line`][]: Fix JSX Syntax in docs ([#1867][], @peter-mouland)
-* [`jsx-max-depth`][], [`jsx-sort-default-props`][]: add missing docs urls ([#1880][], @flyerhzm)
-* [`jsx-indent`][]: add test cases ([#1892][], @alexzherdev)
-* [`prop-types`][]: add test cases ([#1898][], @alexzherdev)
-* Add a helper function for determining function-like expressions ([#1914][], @alexzherdev)
-* [`jsx-props-no-multi-spaces`][]: update docs ([#1918][], @BenRichter)
-
-[7.11.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.10.0...v7.11.0
-[#1924]: https://github.com/yannickcr/eslint-plugin-react/pull/1924
-[#1918]: https://github.com/yannickcr/eslint-plugin-react/pull/1918
-[#1914]: https://github.com/yannickcr/eslint-plugin-react/pull/1914
-[#1911]: https://github.com/yannickcr/eslint-plugin-react/pull/1911
-[#1909]: https://github.com/yannickcr/eslint-plugin-react/pull/1909
-[#1907]: https://github.com/yannickcr/eslint-plugin-react/pull/1907
-[#1905]: https://github.com/yannickcr/eslint-plugin-react/pull/1905
-[#1898]: https://github.com/yannickcr/eslint-plugin-react/pull/1898
-[#1892]: https://github.com/yannickcr/eslint-plugin-react/pull/1892
-[#1891]: https://github.com/yannickcr/eslint-plugin-react/pull/1891
-[#1890]: https://github.com/yannickcr/eslint-plugin-react/pull/1890
-[#1883]: https://github.com/yannickcr/eslint-plugin-react/pull/1883
-[#1880]: https://github.com/yannickcr/eslint-plugin-react/pull/1880
-[#1874]: https://github.com/yannickcr/eslint-plugin-react/issues/1874
-[#1868]: https://github.com/yannickcr/eslint-plugin-react/pull/1868
-[#1867]: https://github.com/yannickcr/eslint-plugin-react/pull/1867
-[#1863]: https://github.com/yannickcr/eslint-plugin-react/pull/1863
-[#1860]: https://github.com/yannickcr/eslint-plugin-react/pull/1860
-[#1858]: https://github.com/yannickcr/eslint-plugin-react/pull/1858
-[#1857]: https://github.com/yannickcr/eslint-plugin-react/pull/1857
-[#1854]: https://github.com/yannickcr/eslint-plugin-react/pull/1854
-[#1851]: https://github.com/yannickcr/eslint-plugin-react/pull/1851
-[#1849]: https://github.com/yannickcr/eslint-plugin-react/pull/1849
-
-## [7.10.0] - 2018-06-24
-### Added
-* Allow eslint ^5 ([#1843][] @papandreou, @ljharb)
-* [`no-unsafe`][] rule ([#1831][], [#1830][] @sergei-startsev)
-* [`no-will-update-set-state`][]: Account for `UNSAFE_` methods ([#1845][], [#1844][] @alexzherdev)
-
-### Fixed
-* [`no-typos`][]: Fix static propTypes handling ([#1827][], [#1677][] @alexzherdev)
-* [`destructuring-assignment`][]: Allow LHS ([#1825][], [#1728][] @alexzherdev)
-* [`no-unused-prop-types`][]: Fix crash when encountering mixed union and intersection flow types ([#1806][] @yannickcr)
-
-### Changed
-* Typo fixes in [`jsx-no-target-blank`][] ([#1805][] @ferhatelmas))
-
-[7.10.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.9.1...v7.10.0
-[#1845]: https://github.com/yannickcr/eslint-plugin-react/pull/1845
-[#1844]: https://github.com/yannickcr/eslint-plugin-react/issues/1844
-[#1843]: https://github.com/yannickcr/eslint-plugin-react/pull/1843
-[#1831]: https://github.com/yannickcr/eslint-plugin-react/pull/1831
-[#1830]: https://github.com/yannickcr/eslint-plugin-react/issues/1830
-[#1827]: https://github.com/yannickcr/eslint-plugin-react/pull/1827
-[#1825]: https://github.com/yannickcr/eslint-plugin-react/pull/1825
-[#1806]: https://github.com/yannickcr/eslint-plugin-react/issues/1806
-[#1805]: https://github.com/yannickcr/eslint-plugin-react/pull/1805
-[#1728]: https://github.com/yannickcr/eslint-plugin-react/issues/1728
-[#1677]: https://github.com/yannickcr/eslint-plugin-react/issues/1677
-
-## [7.9.1] - 2018-06-03
-* Nothing was fixed; this is a republish with some updated deps. ([#1804][] @ljharb)
-
-[7.9.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.9.0...v7.9.1
-[#1804]: https://github.com/yannickcr/eslint-plugin-react/issues/1804
-
-## [7.9.0] - 2018-06-03
-### Added
-* Add [`jsx-props-no-multi-spaces`][] rule ([#1755][] @ThiefMaster)
-* Add `first` option to [`jsx-indent-props`][] ([#398][] @ThiefMaster)
-* Add `enforceDynamicLinks` option to [`jsx-no-target-blank`][] ([#1737][] @kenearley)
-
-### Fixed
-* Fix static lifecycle methods validation in [`sort-comp`][] ([#1793][] @lynxtaa)
-* Fix crash in [`no-typos`][] when encountering anonymous react imports ([#1796][] @jsg2021)
-* Fix ESLint 3 support ([#1779][])
-
-### Changed
-* Documentation improvements ([#1794][] @lencioni)
-* Update Travis CI configuration to test on multiple ESLint verions
-
-[7.9.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.8.2...v7.9.0
-[#1755]: https://github.com/yannickcr/eslint-plugin-react/pull/1755
-[#398]: https://github.com/yannickcr/eslint-plugin-react/issues/398
-[#1737]: https://github.com/yannickcr/eslint-plugin-react/issues/1737
-[#1793]: https://github.com/yannickcr/eslint-plugin-react/issues/1793
-[#1796]: https://github.com/yannickcr/eslint-plugin-react/pull/1796
-[#1779]: https://github.com/yannickcr/eslint-plugin-react/issues/1779
-[#1794]: https://github.com/yannickcr/eslint-plugin-react/pull/1794
-
-## [7.8.2] - 2018-05-13
-### Fixed
-* Fix crash in [`boolean-prop-naming`][] when encountering a required shape prop type ([#1791][] @pcorpet)
-
-[7.8.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.8.1...v7.8.2
-[#1791]: https://github.com/yannickcr/eslint-plugin-react/issues/1791
-
-## [7.8.1] - 2018-05-12
-### Fixed
-* Fix crash in [`no-deprecated`][] when encountering a class constructor ([#1785][] @taddei)
-
-[7.8.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.8.0...v7.8.1
-[#1785]: https://github.com/yannickcr/eslint-plugin-react/issues/1785
-
-## [7.8.0] - 2018-05-11
-### Added
-* Add support for fragments to [`react-in-jsx-scope`][] ([#1758][])
-* Add support for Flow generic PropType to [`require-default-props`][] ([#1724][] @Miziak)
-* Add component whitelist option to [`forbid-component-props`][] ([#1732][] @ThiefMaster)
-* Add support for React 16.3 lifecycle methods to [`no-unused-prop-types`][] ([#1681][] @bvaughn)
-* Add support for React 16.3 lifecycle methods to [`sort-comp`][] ([#1767][] @joe-denea)
-* Add support for React 16.3 lifecycle methods to [`no-typos`][]
-* Add support for `prevState` and `nextState` to [`no-unused-state`][] ([#1759][])
-* Add warnings for `componentWillMount`, `componentWillReceiveProps` and `componentWillUpdate` lifecycle methods in [`no-deprecated`][] ([#1750][] @sergei-startsev)
-
-### Fixed
-* Fix [`no-typos`][] false positive on custom `PropType` classes ([#1389][] @brettdh)
-* Fix [`boolean-prop-naming`][] to handle required props ([#1389][] @louisscruz)
-* Fix [`jsx-curly-brace-presence`][] to allow whitespace JSX container ([#1717][] @sharmilajesupaul)
-* Fix [`jsx-no-bind`][] to handle ternary conditions ([#1722][] @gwenaellarmet)
-
-### Changed
-* Documentation improvements ([#1699][] @ronanmathew, [#1743][] @ybiquitous, [#1753][] @awthwathje, [#1783][] @chentsulin, [#1703][] @ferhatelmas)
-
-[7.8.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.7.0...v7.8.0
-[#1758]: https://github.com/yannickcr/eslint-plugin-react/issues/1758
-[#1724]: https://github.com/yannickcr/eslint-plugin-react/issues/1724
-[#1732]: https://github.com/yannickcr/eslint-plugin-react/issues/1732
-[#1681]: https://github.com/yannickcr/eslint-plugin-react/pull/1681
-[#1767]: https://github.com/yannickcr/eslint-plugin-react/issues/1767
-[#1759]: https://github.com/yannickcr/eslint-plugin-react/issues/1759
-[#1750]: https://github.com/yannickcr/eslint-plugin-react/pull/1750
-[#1389]: https://github.com/yannickcr/eslint-plugin-react/issues/1389
-[#1717]: https://github.com/yannickcr/eslint-plugin-react/issues/1717
-[#1722]: https://github.com/yannickcr/eslint-plugin-react/issues/1722
-[#1699]: https://github.com/yannickcr/eslint-plugin-react/pull/1699
-[#1743]: https://github.com/yannickcr/eslint-plugin-react/pull/1743
-[#1753]: https://github.com/yannickcr/eslint-plugin-react/issues/1753
-[#1783]: https://github.com/yannickcr/eslint-plugin-react/pull/1783
-[#1703]: https://github.com/yannickcr/eslint-plugin-react/pull/1703
-
-## [7.7.0] - 2018-02-19
-### Added
-* [`forbid-foreign-prop-types`][]: add `allowInPropTypes` option ([#1655][] @iansu)
-* Add [`jsx-max-depth`][] rule ([#1260][] @chriswong)
-
-### Fixed
-* [`no-access-state-in-setstate`][]: Exclude references to this.state in setState callback ([#1610][] @pfhayes)
-* [`no-danger-with-children`][]: prevent infinite loop ([#1571][] @ljharb)
-* [`sort-prop-types`][]: Fix sortShapeProp when shape is not an object literal ([#1669][] @justinanastos)
-* [`jsx-child-element-spacing`][]: fix error location ([#1666][] @pfhayes)
-* [`no-unused-prop-types`][]: fix for createClass ([#1675][] @yuri-sakharov)
-* [`prop-types`][]: include nextProps checking in shouldComponentUpdate ([#1690][] @amerryma)
-* [`jsx-curly-spacing`][]: refactor to fix start and end-braces in a single pass ([#1414][] @s-h-a-d-o-w)
-
-### Changed
-* [`jsx-child-element-spacing`][]: add missing docs ([#1665][] @pfhayes); fix docs ([#1670][] @SammyM)
-
-[7.7.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.6.1...v7.7.0
-[#1690]: https://github.com/yannickcr/eslint-plugin-react/pull/1690
-[#1675]: https://github.com/yannickcr/eslint-plugin-react/pull/1675
-[#1670]: https://github.com/yannickcr/eslint-plugin-react/pull/1670
-[#1669]: https://github.com/yannickcr/eslint-plugin-react/pull/1669
-[#1666]: https://github.com/yannickcr/eslint-plugin-react/pull/1666
-[#1665]: https://github.com/yannickcr/eslint-plugin-react/pull/1665
-[#1655]: https://github.com/yannickcr/eslint-plugin-react/pull/1655
-[#1610]: https://github.com/yannickcr/eslint-plugin-react/pull/1610
-[#1414]: https://github.com/yannickcr/eslint-plugin-react/pull/1414
-[#1260]: https://github.com/yannickcr/eslint-plugin-react/pull/1260
-[#1571]: https://github.com/yannickcr/eslint-plugin-react/issues/1571
-
-## [7.6.1] - 2018-01-28
-### Fixed
-* Flow: fix crash in [`prop-types`][] with recursive type annotations ([#1653][] @jetpacmonkey)
-* Fix [`no-unknown-property`][] to properly recognize `crossOrigin` instead of `crossorigin`, and allow it on `link` tags. ([#1659][] @jzDev)
-* Fix [`no-access-state-in-setstate`][] to handle object spread ([#1657][] @ljharb)
-
-[7.6.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.6.0...v7.6.1
-[#1659]: https://github.com/yannickcr/eslint-plugin-react/pull/1659
-[#1657]: https://github.com/yannickcr/eslint-plugin-react/issues/1657
-[#1653]: https://github.com/yannickcr/eslint-plugin-react/pull/1653
-
-## [7.6.0] - 2018-01-25
-### Added
-* Add [`forbid-dom-props`][] rule ([#1562][] @davazp)
-* Add [`jsx-child-element-spacing`][] rule ([#1515][] @pfhayes)
-* Add [`no-this-in-sfc`][] rule ([#1435][] @jomasti)
-* Add [`jsx-sort-default-props`][] rule ([#281][] @b0gok)
-* Add `message` option to [`boolean-prop-naming`][] ([#1588][] @louisscruz)
-* Add `beforeClosing` option to [`jsx-tag-spacing`][] ([#1396][] @cjskillingstad)
-* Add `instance-methods` and `instance-variables` to [`sort-comp`][] ([#599][] @RDGthree)
-* Add `propWrapperFunctions` support for [`boolean-prop-naming`][] ([#1478][] @jomasti)
-* Add warning for `React.addons.TestUtils` in [`no-deprecated`][] ([#1644][] @nirnaor)
-* Add URL to rule documentation to the rules metadata ([#1635][] @Arcanemagus)
-
-### Fixed
-* Fix crashes in [`no-access-state-in-setstate`][] ([#1559][] @jomasti, [#1611][] @pfhayes)
-* Fix crash in [`require-optimization`][] when encountering arrays with empty items as values in object ([#1621][] @kamataryo)
-* Fix crash in [`no-unused-prop-types`][] when passing an empty function as a PropType ([#1542][] [#1581][] @kevinzwhuang)
-* Fix crash in [`no-typos`][] when using `PropType.shape` without arguments ([#1471][] @mrichmond)
-* Fix crash when using Unions in flow propTypes ([#1468][] @justinanastos)
-* Fix missing meta in [`jsx-tag-spacing`][] ([#1650][] @flyerhzm)
-* Fix [`no-unused-state`][] to detect usage of `this.state` as an object ([#1572][])
-* Fix [`no-access-state-in-setstate`][] to detect when the `state` variable is destructured from `this.state` ([#1597][] @jaaberg)
-* Fix [`jsx-no-literals`][] to correctly find string literals part of BinaryExpressions ([#1511][] @jaaberg)
-* Fix [`no-typos`][] false positive on custom propTypes with isRequired ([#1607][] @lfades)
-* Fix [`prop-types`][] to check for `nextProps` in `componentWillReceiveProps` ([#1636][] @xjmdoo)
-* Fix [`no-unknown-property`][] to not pascal-casing `crossorigin` attribute and only allow it on script/img/video ([#1642][] @ljharb)
-
-### Changed
-* Improve [`jsx-wrap-multilines`][] auto fix ([#1576][] @sharmilajesupaul)
-* Export `defaultConfig` from [`sort-comp`][] rule for programmatic use ([#1578][] @Andarist)
-* Documentation improvements ([#1552][] @TSMMark, [#1566][] @lukeapage, [#1624][] @alexilyaev, @ljharb)
-* Update dependencies (@ljharb)
-
-[7.6.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.5.1...v7.6.0
-[#1562]: https://github.com/yannickcr/eslint-plugin-react/pull/1562
-[#1515]: https://github.com/yannickcr/eslint-plugin-react/issues/1515
-[#1435]: https://github.com/yannickcr/eslint-plugin-react/issues/1435
-[#281]: https://github.com/yannickcr/eslint-plugin-react/issues/281
-[#1588]: https://github.com/yannickcr/eslint-plugin-react/pull/1588
-[#1396]: https://github.com/yannickcr/eslint-plugin-react/issues/1396
-[#599]: https://github.com/yannickcr/eslint-plugin-react/issues/599
-[#1478]: https://github.com/yannickcr/eslint-plugin-react/pull/1478
-[#1644]: https://github.com/yannickcr/eslint-plugin-react/issues/1644
-[#1635]: https://github.com/yannickcr/eslint-plugin-react/pull/1635
-[#1559]: https://github.com/yannickcr/eslint-plugin-react/issues/1559
-[#1611]: https://github.com/yannickcr/eslint-plugin-react/pull/1611
-[#1621]: https://github.com/yannickcr/eslint-plugin-react/pull/1621
-[#1542]: https://github.com/yannickcr/eslint-plugin-react/issues/1542
-[#1581]: https://github.com/yannickcr/eslint-plugin-react/issues/1581
-[#1471]: https://github.com/yannickcr/eslint-plugin-react/issues/1471
-[#1468]: https://github.com/yannickcr/eslint-plugin-react/issues/1468
-[#1650]: https://github.com/yannickcr/eslint-plugin-react/pull/1650
-[#1572]: https://github.com/yannickcr/eslint-plugin-react/issues/1572
-[#1597]: https://github.com/yannickcr/eslint-plugin-react/issues/1597
-[#1511]: https://github.com/yannickcr/eslint-plugin-react/issues/1511
-[#1607]: https://github.com/yannickcr/eslint-plugin-react/issues/1607
-[#1636]: https://github.com/yannickcr/eslint-plugin-react/issues/1636
-[#1642]: https://github.com/yannickcr/eslint-plugin-react/issues/1642
-[#1576]: https://github.com/yannickcr/eslint-plugin-react/pull/1576
-[#1578]: https://github.com/yannickcr/eslint-plugin-react/pull/1578
-[#1552]: https://github.com/yannickcr/eslint-plugin-react/pull/1552
-[#1566]: https://github.com/yannickcr/eslint-plugin-react/pull/1566
-[#1624]: https://github.com/yannickcr/eslint-plugin-react/pull/1624
-
-## [7.5.1] - 2017-11-19
-### Fixed
-* Fix [`jsx-no-bind`][] crash ([#1543][] @jomasti)
-* Fix [`no-unused-prop-types`][] crash ([#1542][] @jomasti)
-
-### Changed
-* Documentation improvements ([#1546][] @jseminck)
-
-[7.5.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.5.0...v7.5.1
-[#1543]: https://github.com/yannickcr/eslint-plugin-react/issues/1543
-[#1542]: https://github.com/yannickcr/eslint-plugin-react/issues/1542
-[#1546]: https://github.com/yannickcr/eslint-plugin-react/issues/1546
-
-## [7.5.0] - 2017-11-18
-### Added
-* Add [`jsx-one-expression-per-line`][] rule ([#1497][] @TSMMark)
-* Add [`destructuring-assignment`][] rule ([#1462][] @DianaSuvorova)
-* Add [`no-access-state-in-setstate`][] rule ([#1374][] @jaaberg)
-* Add [`button-has-type`][] rule ([#1525][] @Hypnosphi)
-* Add warnings for `React.DOM` factories in [`no-deprecated`][] ([#1530][] @backjo)
-* Add `sortShapeProp` option to [`sort-prop-types`][] ([#1476][] @jomasti)
-* Add `parens-new-line` option to [`jsx-wrap-multilines`][] ([#1475][] @jomasti)
-* Add `checkContextTypes` and `checkChildContextTypes` options to [`forbid-prop-types`][] ([#1533][] @jomasti)
-* Add `forbidDefaultForRequired ` option to [`require-default-props`][] ([#1524][] @jomasti)
-* Add new nodes support to [`jsx-wrap-multilines`][] ([#1384][] @evgeny-petukhov)
-
-### Fixed
-* Fix [`jsx-curly-brace-presence`][] auto fix by bailing out when some chars exist ([#1479][] [#1449][] @jackyho112)
-* Fix [`boolean-prop-naming`][] crash with Object spread ([#1485][] @track0x1)
-* Fix [`no-unused-state`][] to correctly handle arrow function class method ([#1363][] @jackyho112)
-* Fix incompatibility with [`typescript-eslint-parser`](https://github.com/eslint/typescript-eslint-parser) ([#1496][] @timothykang)
-* Fix [`jsx-no-bind`][] to only warn for props and account for variable declaration ([#1444][] [#1395][] [#1417][] @jackyho112)
-* Fix [`no-unused-prop-types`][] to handle props usage in custom prop validators ([#1518][] @petersendidit)
-* Fix [`prefer-stateless-function`][] to account for `contextTypes` and `defaultProps` ([#1521][] @jomasti)
-* Fix [`jsx-no-comment-textnodes`][] to not warn when using two slashes via html entities at the beginning of a literal ([#1517][] @jomasti)
-* Fix [`default-props-match-prop-types`][] crash ([#1499][] @jomasti)
-* Fix [`no-unused-prop-types`][] to handle props used in the `setState` update callback ([#1507][] @petersendidit)
-* Fix alignment bug in [`jsx-indent`][] ([#1246][] @jseminck)
-
-### Changed
-* Documentation improvements ([#1438][] @jseminck, [#1464][] @AlaaAttya, [#1494][] @piperchester, [#1467][] @felicio, [#1512][] @adam-golab)
-* Code refactoring ([#1423][] [#1398][] @jseminck, [#1500][] [#1514][] @Aladdin-ADD, [#1502][] @SimenB, [#1508][] [#1526][] @jomasti, @ljharb)
-* Update dependencies ([#1450][] @leebyron, @ljharb)
-
-[7.5.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.4.0...v7.5.0
-[#1497]: https://github.com/yannickcr/eslint-plugin-react/pull/1497
-[#1462]: https://github.com/yannickcr/eslint-plugin-react/pull/1462
-[#1374]: https://github.com/yannickcr/eslint-plugin-react/pull/1374
-[#1525]: https://github.com/yannickcr/eslint-plugin-react/pull/1525
-[#1530]: https://github.com/yannickcr/eslint-plugin-react/pull/1530
-[#1476]: https://github.com/yannickcr/eslint-plugin-react/issues/1476
-[#1475]: https://github.com/yannickcr/eslint-plugin-react/pull/1475
-[#1533]: https://github.com/yannickcr/eslint-plugin-react/pull/1533
-[#1524]: https://github.com/yannickcr/eslint-plugin-react/issues/1524
-[#1384]: https://github.com/yannickcr/eslint-plugin-react/pull/1384
-[#1479]: https://github.com/yannickcr/eslint-plugin-react/issues/1479
-[#1449]: https://github.com/yannickcr/eslint-plugin-react/issues/1449
-[#1485]: https://github.com/yannickcr/eslint-plugin-react/pull/1485
-[#1363]: https://github.com/yannickcr/eslint-plugin-react/issues/1363
-[#1496]: https://github.com/yannickcr/eslint-plugin-react/pull/1496
-[#1444]: https://github.com/yannickcr/eslint-plugin-react/issues/1444
-[#1395]: https://github.com/yannickcr/eslint-plugin-react/issues/1395
-[#1417]: https://github.com/yannickcr/eslint-plugin-react/issues/1417
-[#1518]: https://github.com/yannickcr/eslint-plugin-react/pull/1518
-[#1521]: https://github.com/yannickcr/eslint-plugin-react/issues/1521
-[#1517]: https://github.com/yannickcr/eslint-plugin-react/issues/1517
-[#1499]: https://github.com/yannickcr/eslint-plugin-react/issues/1499
-[#1507]: https://github.com/yannickcr/eslint-plugin-react/pull/1507
-[#1246]: https://github.com/yannickcr/eslint-plugin-react/issues/1246
-[#1438]: https://github.com/yannickcr/eslint-plugin-react/pull/1438
-[#1464]: https://github.com/yannickcr/eslint-plugin-react/pull/1464
-[#1494]: https://github.com/yannickcr/eslint-plugin-react/pull/1494
-[#1467]: https://github.com/yannickcr/eslint-plugin-react/pull/1467
-[#1512]: https://github.com/yannickcr/eslint-plugin-react/pull/1512
-[#1423]: https://github.com/yannickcr/eslint-plugin-react/pull/1423
-[#1500]: https://github.com/yannickcr/eslint-plugin-react/pull/1500
-[#1514]: https://github.com/yannickcr/eslint-plugin-react/pull/1514
-[#1502]: https://github.com/yannickcr/eslint-plugin-react/pull/1502
-[#1508]: https://github.com/yannickcr/eslint-plugin-react/pull/1508
-[#1526]: https://github.com/yannickcr/eslint-plugin-react/pull/1526
-[#1398]: https://github.com/yannickcr/eslint-plugin-react/pull/1398
-[#1450]: https://github.com/yannickcr/eslint-plugin-react/pull/1450
-
-## [7.4.0] - 2017-09-24
-### Added
-* Add Flow 0.53 support ([#1376][] @jseminck)
-* Add [`jsx-curly-brace-presence`][] rule ([#1310][] @jackyho112)
-* Add support for Flow IntersectionTypeAnnotation to [`prop-types`][] and [`no-unused-prop-types`][] ([#1364][] [#1323][] @jseminck)
-* Add support for Flow TypedArgument to [`no-unused-prop-types`][] ([#1412][] @jseminck)
-* Add support for Flow ClassExpressions to [`prop-types`][] ([#1400][] @jseminck)
-* Add support for Flow read-only props to [`no-unused-prop-types`][] ([#1388][] @jseminck)
-* Add more tests for [`prop-types`][] and [`no-unused-prop-types`][] ([#1381][] @DianaSuvorova)
-* Add support for increment and decrement operations to [`no-direct-mutation-state`][] ([#1386][] @zpao)
-
-### Fixed
-* Fix [`no-unused-state`][] to ignore computed property keys ([#1361][] @jackyho112)
-* Fix [`no-typos`][] crash ([#1406][] @jseminck)
-* Fix [`boolean-prop-naming`][] crash ([#1409][] @EvHaus)
-* Fix [`prop-types`][] and [`no-unused-prop-types`][] crash with IntersectionTypeAnnotation ([#1413][] @jseminck)
-
-### Changed
-* Documentation improvements ([#1392][] @xcatliu, [#1403][] @piperchester, [#1432][] @jneuendorf)
-
-[7.4.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.3.0...v7.4.0
-[#1376]: https://github.com/yannickcr/eslint-plugin-react/issues/1376
-[#1310]: https://github.com/yannickcr/eslint-plugin-react/issues/1310
-[#1364]: https://github.com/yannickcr/eslint-plugin-react/issues/1364
-[#1323]: https://github.com/yannickcr/eslint-plugin-react/issues/1323
-[#1412]: https://github.com/yannickcr/eslint-plugin-react/pull/1412
-[#1400]: https://github.com/yannickcr/eslint-plugin-react/pull/1400
-[#1388]: https://github.com/yannickcr/eslint-plugin-react/issues/1388
-[#1381]: https://github.com/yannickcr/eslint-plugin-react/pull/1381
-[#1361]: https://github.com/yannickcr/eslint-plugin-react/issues/1361
-[#1406]: https://github.com/yannickcr/eslint-plugin-react/pull/1406
-[#1409]: https://github.com/yannickcr/eslint-plugin-react/pull/1409
-[#1392]: https://github.com/yannickcr/eslint-plugin-react/pull/1392
-[#1403]: https://github.com/yannickcr/eslint-plugin-react/pull/1403
-[#1386]: https://github.com/yannickcr/eslint-plugin-react/issues/1386
-[#1413]: https://github.com/yannickcr/eslint-plugin-react/issues/1413
-[#1432]: https://github.com/yannickcr/eslint-plugin-react/pull/1432
-
-## [7.3.0] - 2017-08-21
-### Added
-* Add checks for `propTypes`, `contextTypes` and `childContextTypes` to [`no-typos`][] ([#213][] @DianaSuvorova)
-
-### Fixed
-* Fix [`boolean-prop-naming`][] crash ([#1369][] @EvHaus)
-* Fix [`no-typos`][] crash ([#1353][] @jseminck)
-* Fix [`require-default-props`][] stopping when it finds a component without props ([#1380][] @brgibson)
-* Fix [`no-direct-mutation-state`][] detection with nested components ([#1382][])
-
-### Changed
-* Documentation improvements ([#1383][] @mjomble)
-
-[7.3.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.2.1...v7.3.0
-[#213]: https://github.com/yannickcr/eslint-plugin-react/issues/213
-[#1369]: https://github.com/yannickcr/eslint-plugin-react/issues/1369
-[#1353]: https://github.com/yannickcr/eslint-plugin-react/issues/1353
-[#1380]: https://github.com/yannickcr/eslint-plugin-react/pull/1380
-[#1382]: https://github.com/yannickcr/eslint-plugin-react/issues/1382
-[#1383]: https://github.com/yannickcr/eslint-plugin-react/pull/1383
-
-## [7.2.1] - 2017-08-14
-### Fixed
-* Fix [`forbid-prop-types`][] crash on identifiers ([#1352][] @ljharb)
-* Fix [`boolean-prop-naming`][] crash with propTypes wrapper ([#1354][] @dustinsoftware)
-* Fix [`prop-types`][] false positive with local variable `props` ([#1288][] @DianaSuvorova)
-* Fix wrapped propTypes detection ([#1366][])
-
-### Changed
-* Documentation improvements ([#1123][] @penx)
-
-[7.2.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.2.0...v7.2.1
-[#1352]: https://github.com/yannickcr/eslint-plugin-react/issues/1352
-[#1354]: https://github.com/yannickcr/eslint-plugin-react/issues/1354
-[#1288]: https://github.com/yannickcr/eslint-plugin-react/issues/1288
-[#1366]: https://github.com/yannickcr/eslint-plugin-react/issues/1366
-[#1123]: https://github.com/yannickcr/eslint-plugin-react/issues/1123
-
-## [7.2.0] - 2017-08-09
-### Added
-* Add [`no-unused-state`][] rule ([#1103][] @wbinnssmith)
-* Add [`boolean-prop-naming`][] rule ([#1264][] @EvHaus)
-* Add [`no-typos`][] rule ([#1189][] @jseminck, [#1294][] @haridusenadeera)
-* Add auto fix for [`jsx-sort-props`][] ([#1273][] @Overload119)
-* Add `getters` and `setters` groups to [`sort-comp`][] ([#100][] @RDGthree)
-* Add `noStrings` option to [`jsx-no-literals`][] ([#1202][] @deecewan)
-* Add inverse option for `always`/`never` to [`jsx-boolean-value`][] ([#1249][] @ljharb)
-
-### Fixed
-* Fix [`no-direct-mutation-state`][] to disallow `this.state` mutation in constructor ([#832][] @burabure)
-* Fix [`jsx-no-target-blank`][] crash on empty `rel` attribute ([#1269][] @dustinsoftware)
-* Fix [`sort-comp`][] component detection with `ClassExpression` ([#1076][] @webOS101)
-* Fix [`no-unused-prop-types`][] detection with async class properties and methods ([#1053][] @benstepp)
-* Fix [`void-dom-elements-no-children`][] crash ([#1226][] @kokobeware)
-* Fix [`no-danger-with-children`][] to ignore line breaks ([#1262][])
-* Fix [`no-danger-with-children`][] crash with undefined ([#1287][])
-* Fix [`jsx-no-target-blank`][] crash ([#1296][] @jseminck)
-* Fix [`no-unused-prop-types`][] to no longer ignore components with no used props ([#1303][] @DianaSuvorova)
-* Fix [`jsx-no-duplicate-props`][] crash ([#969][] @marcelmokos)
-* Fix [`jsx-no-literals`][] false positives ([#1301][] @davidyorr)
-* Fix [`no-find-dom-node`][] detection with named imports ([#785][] @Hypnosphi)
-* Fix proTypes-related rules detection with wrapped propTypes ([#1266][] @dustinsoftware)
-* Fix [`no-unused-prop-types`][] detection with propTypes wrapped in a function ([#1253][] @dustinsoftware)
-* Fix [`no-unused-prop-types`][] detection with destructured use of properties ([#816][] @DianaSuvorova)
-* Fix [`no-unused-prop-types`][] detection with inline functions ([#1309][] @DianaSuvorova)
-* Fix [`no-unused-prop-types`][] `skipShapeProps` option with Flow annotations ([#1335][] @DianaSuvorova)
-* Fix [`jsx-curly-spacing`][] schema incompatibility with ESLint 4.2.0 ([#1290][] @jseminck)
-
-### Changed
-* Documentation improvements ([#1261][] @mminer, [#1005][] @yooungt13, [#1289][] @konekoya, [#1308][] @xcatliu, [#1306][] @egberts, [#1329][] [#1344][] @DianaSuvorova)
-* ES6-ify codebase ([#1274][] [#1277][] [#1281][] @dfilipidisz)
-* Code refactoring (@ljharb)
-* Update Travis CI and AppVeyor CI configurations (@lencioni)
-
-[7.2.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.1.0...v7.2.0
-[#1103]: https://github.com/yannickcr/eslint-plugin-react/pull/1103
-[#1273]: https://github.com/yannickcr/eslint-plugin-react/pull/1273
-[#1264]: https://github.com/yannickcr/eslint-plugin-react/pull/1264
-[#1189]: https://github.com/yannickcr/eslint-plugin-react/issues/1189
-[#1294]: https://github.com/yannickcr/eslint-plugin-react/pull/1294
-[#100]: https://github.com/yannickcr/eslint-plugin-react/issues/100
-[#1202]: https://github.com/yannickcr/eslint-plugin-react/pull/1202
-[#1249]: https://github.com/yannickcr/eslint-plugin-react/issues/1249
-[#832]: https://github.com/yannickcr/eslint-plugin-react/issues/832
-[#1269]: https://github.com/yannickcr/eslint-plugin-react/issues/1269
-[#1076]: https://github.com/yannickcr/eslint-plugin-react/issues/1076
-[#1053]: https://github.com/yannickcr/eslint-plugin-react/issues/1053
-[#1226]: https://github.com/yannickcr/eslint-plugin-react/pull/1226
-[#1262]: https://github.com/yannickcr/eslint-plugin-react/issues/1262
-[#1287]: https://github.com/yannickcr/eslint-plugin-react/issues/1287
-[#1296]: https://github.com/yannickcr/eslint-plugin-react/issues/1296
-[#1303]: https://github.com/yannickcr/eslint-plugin-react/pull/1303
-[#969]: https://github.com/yannickcr/eslint-plugin-react/issues/969
-[#1301]: https://github.com/yannickcr/eslint-plugin-react/issues/1301
-[#785]: https://github.com/yannickcr/eslint-plugin-react/issues/785
-[#1266]: https://github.com/yannickcr/eslint-plugin-react/issues/1266
-[#1253]: https://github.com/yannickcr/eslint-plugin-react/pull/1253
-[#816]: https://github.com/yannickcr/eslint-plugin-react/issues/816
-[#1309]: https://github.com/yannickcr/eslint-plugin-react/issues/1309
-[#1261]: https://github.com/yannickcr/eslint-plugin-react/pull/1261
-[#1005]: https://github.com/yannickcr/eslint-plugin-react/pull/1005
-[#1289]: https://github.com/yannickcr/eslint-plugin-react/pull/1289
-[#1308]: https://github.com/yannickcr/eslint-plugin-react/pull/1308
-[#1306]: https://github.com/yannickcr/eslint-plugin-react/issues/1306
-[#1329]: https://github.com/yannickcr/eslint-plugin-react/pull/1329
-[#1274]: https://github.com/yannickcr/eslint-plugin-react/pull/1274
-[#1277]: https://github.com/yannickcr/eslint-plugin-react/pull/1277
-[#1281]: https://github.com/yannickcr/eslint-plugin-react/pull/1281
-[#1335]: https://github.com/yannickcr/eslint-plugin-react/issues/1335
-[#1344]: https://github.com/yannickcr/eslint-plugin-react/pull/1344
-[#1290]: https://github.com/yannickcr/eslint-plugin-react/pull/1290
-
-## [7.1.0] - 2017-06-13
-### Added
-* Add [`default-props-match-prop-types`][] rule ([#1022][] @webOS101)
-* Add [`no-redundant-should-component-update`][] rule ([#985][] @jomasti)
-* Add [`jsx-closing-tag-location`][] rule ([#1206][] @rsolomon)
-* Add auto fix for [`jsx-max-props-per-line`][] ([#949][] @snowypowers)
-* Add support for lifecycle methods with `nextProps`/`prevProps` in [`no-unused-prop-types`][] ([#1213][] @jseminck)
-* Add Flow SuperTypeParameters support to [`prop-types`][] ([#1236][] @gpeal)
-* Add `children` option to [`jsx-curly-spacing`][] ([#857][] @fatfisz)
-
-### Fixed
-* Fix [`prefer-stateless-function`][] `ignorePureComponents` option when using class expressions ([#1122][] @dreid)
-* Fix [`void-dom-elements-no-children`][] crash ([#1195][] @oliviertassinari)
-* Fix [`require-default-props`][] quoted `defaultProps` detection ([#1201][])
-* Fix [`jsx-sort-props`][] bug with `ignoreCase` and `callbacksLast` options set to `true` ([#1175][] @jseminck)
-* Fix [`no-unused-prop-types`][] false positive ([#1183][] [#1135][] @jseminck)
-* Fix [`jsx-no-target-blank`][] to not issue errors for non-external URLs ([#1216][] @gfx)
-* Fix [`prop-types`][] quoted Flow types detection ([#1132][] @ethanjgoldberg)
-* Fix [`no-array-index-key`][] crash with `key` without value ([#1242][] @jseminck)
-
-### Changed
-* Set ESLint 4.0.0 as valid peerDependency
-* Dead code removal ([#1227][] @jseminck)
-* Update dependencies (@ljharb)
-* Documentation improvements ([#1071][] @adnasa, [#1199][] @preco21, [#1222][] @alexilyaev, [#1231][] @vonovak, [#1239][] @webOS101, [#1241][] @102)
-
-[7.1.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.0.1...v7.1.0
-[#1022]: https://github.com/yannickcr/eslint-plugin-react/issues/1022
-[#949]: https://github.com/yannickcr/eslint-plugin-react/pull/949
-[#985]: https://github.com/yannickcr/eslint-plugin-react/issues/985
-[#1213]: https://github.com/yannickcr/eslint-plugin-react/issues/1213
-[#1236]: https://github.com/yannickcr/eslint-plugin-react/pull/1236
-[#1206]: https://github.com/yannickcr/eslint-plugin-react/issues/1206
-[#857]: https://github.com/yannickcr/eslint-plugin-react/issues/857
-[#1122]: https://github.com/yannickcr/eslint-plugin-react/pull/1122
-[#1195]: https://github.com/yannickcr/eslint-plugin-react/pull/1195
-[#1201]: https://github.com/yannickcr/eslint-plugin-react/issues/1201
-[#1175]: https://github.com/yannickcr/eslint-plugin-react/issues/1175
-[#1183]: https://github.com/yannickcr/eslint-plugin-react/issues/1183
-[#1135]: https://github.com/yannickcr/eslint-plugin-react/issues/1135
-[#1216]: https://github.com/yannickcr/eslint-plugin-react/pull/1216
-[#1132]: https://github.com/yannickcr/eslint-plugin-react/pull/1132
-[#1242]: https://github.com/yannickcr/eslint-plugin-react/issues/1242
-[#1227]: https://github.com/yannickcr/eslint-plugin-react/pull/1227
-[#1071]: https://github.com/yannickcr/eslint-plugin-react/pull/1071
-[#1199]: https://github.com/yannickcr/eslint-plugin-react/pull/1199
-[#1222]: https://github.com/yannickcr/eslint-plugin-react/pull/1222
-[#1231]: https://github.com/yannickcr/eslint-plugin-react/pull/1231
-[#1239]: https://github.com/yannickcr/eslint-plugin-react/pull/1239
-[#1241]: https://github.com/yannickcr/eslint-plugin-react/pull/1241
-
-## [7.0.1] - 2017-05-13
-### Fixed
-* Fix [`jsx-curly-spacing`][] `allowMultiline` option being undefined in some cases ([#1179][] @fatfisz)
-* Fix [`jsx-curly-spacing`][] newline with object literals bug ([#1180][] @fatfisz)
-* Fix [`prop-types`][] to not mark class static function as valid propTypes definition ([#1174][])
-* Fix [`prop-types`][] crash with Flow spread operator ([#1178][])
-* Fix [`void-dom-elements-no-children`][] crash on faulty `createElement` detection ([#1101][])
-* Fix [`require-default-props`][] error message for quoted props ([#1161][])
-
-### Changed
-* Update dependencies
-* Documentation improvements ([#1173][] @luftywiranda13, [#1192][] @markus-willems)
-
-[7.0.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v7.0.0...v7.0.1
-[#1179]: https://github.com/yannickcr/eslint-plugin-react/pull/1179
-[#1180]: https://github.com/yannickcr/eslint-plugin-react/pull/1180
-[#1174]: https://github.com/yannickcr/eslint-plugin-react/issues/1174
-[#1178]: https://github.com/yannickcr/eslint-plugin-react/issues/1178
-[#1101]: https://github.com/yannickcr/eslint-plugin-react/issues/1101
-[#1161]: https://github.com/yannickcr/eslint-plugin-react/issues/1161
-[#1173]: https://github.com/yannickcr/eslint-plugin-react/pull/1173
-[#1192]: https://github.com/yannickcr/eslint-plugin-react/pull/1192
-
-## [7.0.0] - 2017-05-06
-### Added
-* Add [`no-will-update-set-state`][] rule ([#1139][] @ManThursday)
-* Add import and destructuring support to [`no-deprecated`][]
-* Add `reservedFirst` option to [`jsx-sort-props`][] ([#1134][] @MatthewHerbst)
-
-### Breaking
-* Update rules for React 15.5.0:
-  * Add warnings for `React.PropTypes` and `React.createClass` in [`no-deprecated`][] ([#1148][] @Calyhre)
-  * Update `createClass` component factory to `createReactClass`. This is used for React component detection, if you still using `React.createClass` use the [shared settings](README.md#configuration) to specify `createClass` as component factory
-* Drop Node.js < 4 support ([#1038][] @ljharb)
-* Add [`no-danger-with-children`][] rule to recommended rules ([#748][] @ljharb)
-* Add [`no-string-refs`][] rule to recommended rules ([#749][] @ljharb)
-* Add [`jsx-key`][] rule to recommended rules ([#750][] @ljharb)
-* Add [`jsx-no-comment-textnodes`][] rule to recommended rules ([#751][] @ljharb)
-* Add [`jsx-no-target-blank`][] rule to recommended rules ([#752][] @ljharb)
-* Add [`no-unescaped-entities`][] rule to recommended rules ([#841][] @ljharb)
-* Add [`no-children-prop`][] rule to recommended rules ([#842][] @ljharb)
-* Remove deprecated [`wrap-multilines`][] rule, use [`jsx-wrap-multilines`][] instead
-* Remove deprecated [`no-comment-textnodes`][] rule, use [`jsx-no-comment-textnodes`][] instead
-* Remove deprecated [`require-extension`][] rule, use the [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) [`extensions`](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/extensions.md) rule instead
-* Deprecate [`jsx-space-before-closing`][] rule, use the [`jsx-tag-spacing`][] rule instead. [`jsx-space-before-closing`][] still works but will trigger a warning ([#1070][] @afairb)
-* [`jsx-first-prop-new-line`][] default is now `multiline-multiprop` ([#802][] @kokarn)
-* [`jsx-wrap-multilines`][] now checks arrow functions without block body. It can be deactivated in [rule options](docs/rules/jsx-wrap-multilines.md#rule-details) ([#790][] @ColCh)
-* [`jsx-no-undef`][] will not check the global scope by default. You can force it with the [`allowGlobals`](docs/rules/jsx-no-undef.md#allowglobals) option ([#1013][] @jomasti)
-
-### Fixed
-* Fix [`no-unused-prop-types`][] false positive with `nextProps` ([#1079][] @Kerumen)
-* Fix [`prefer-stateless-function`][] to not warn on classes with decorators ([#1034][] @benstepp)
-
-### Changed
-* Update dependencies ([#1119][] @danez)
-* Documentation improvements ([#1121][] @omerzach, [#1130][] @dreid, [#1131][] @shoesandsocks, [#1149][] @Adzz, [#1151][] @MatthewHerbst, [#1167][] @Slumber86)
-
-[7.0.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.10.3...v7.0.0
-[#1134]: https://github.com/yannickcr/eslint-plugin-react/pull/1134
-[#1038]: https://github.com/yannickcr/eslint-plugin-react/pull/1038
-[#802]: https://github.com/yannickcr/eslint-plugin-react/pull/802
-[#790]: https://github.com/yannickcr/eslint-plugin-react/issues/790
-[#1013]: https://github.com/yannickcr/eslint-plugin-react/pull/1013
-[#1070]: https://github.com/yannickcr/eslint-plugin-react/pull/1070
-[#748]: https://github.com/yannickcr/eslint-plugin-react/issues/748
-[#749]: https://github.com/yannickcr/eslint-plugin-react/issues/749
-[#750]: https://github.com/yannickcr/eslint-plugin-react/issues/750
-[#751]: https://github.com/yannickcr/eslint-plugin-react/issues/751
-[#752]: https://github.com/yannickcr/eslint-plugin-react/issues/752
-[#841]: https://github.com/yannickcr/eslint-plugin-react/issues/841
-[#842]: https://github.com/yannickcr/eslint-plugin-react/issues/842
-[#1139]: https://github.com/yannickcr/eslint-plugin-react/pull/1139
-[#1148]: https://github.com/yannickcr/eslint-plugin-react/pull/1148
-[#1079]: https://github.com/yannickcr/eslint-plugin-react/issues/1079
-[#1034]: https://github.com/yannickcr/eslint-plugin-react/issues/1034
-[#1119]: https://github.com/yannickcr/eslint-plugin-react/pull/1119
-[#1121]: https://github.com/yannickcr/eslint-plugin-react/pull/1121
-[#1130]: https://github.com/yannickcr/eslint-plugin-react/pull/1130
-[#1131]: https://github.com/yannickcr/eslint-plugin-react/pull/1131
-[#1149]: https://github.com/yannickcr/eslint-plugin-react/pull/1149
-[#1151]: https://github.com/yannickcr/eslint-plugin-react/pull/1151
-[#1167]: https://github.com/yannickcr/eslint-plugin-react/pull/1167
-
-## [6.10.3] - 2017-03-20
-### Fixed
-* Revert [#1057][] due to issues with [`jsx-indent`][] ([#1117][])
-
-[6.10.3]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.10.2...v6.10.3
-
-## [6.10.2] - 2017-03-19
-### Fixed
-* Fix [`jsx-indent`][] indentation calculation with nested JSX ([#1117][])
-
-[6.10.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.10.1...v6.10.2
-[#1117]: https://github.com/yannickcr/eslint-plugin-react/issues/1117
-
-## [6.10.1] - 2017-03-19
-### Fixed
-* Fix [`jsx-indent`][] auto fix with tabs ([#1057][] @kentcdodds @webOS101)
-* Fix [`jsx-indent`][] crash ([#1061][] @iancmyers)
-* Fix [`void-dom-elements-no-children`][] crash and fix it to only checks for a createElement call from
-React ([#1073][] @jomasti)
-* Fix component detection that caused a false positive in [`no-multi-comp`][] ([#1088][] @benstepp)
-
-[6.10.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.10.0...v6.10.1
-[#1057]: https://github.com/yannickcr/eslint-plugin-react/issues/1057
-[#1061]: https://github.com/yannickcr/eslint-plugin-react/issues/1061
-[#1073]: https://github.com/yannickcr/eslint-plugin-react/issues/1073
-[#1088]: https://github.com/yannickcr/eslint-plugin-react/issues/1088
-
-## [6.10.0] - 2017-02-16
-### Added
-* Add [`forbid-foreign-prop-types`][] rule ([#696][] @iancmyers)
-* Add [`void-dom-elements-no-children`][] rule ([#709][] @lencioni)
-* Add [`forbid-elements`][] rule ([#887][] @kentor)
-* Add `noSortAlphabetically` option to [`jsx-sort-props`][] ([#541][] [#786][] @markus101)
-* Add `when` option to [`jsx-max-props-per-line`][] ([#878][] @kentor)
-* Add support for `nextProps` to [`prop-types`][] ([#814][])
-
-### Fixed
-* Fix [`require-default-props`][] crash ([#1029][])
-* Fix [`require-default-props`][] rule when using Flow type from assignment ([#1043][] @wyze @CarlRosell)
-* Fix [`style-prop-object`][] to not warn with explicit `null` or `undefined` ([#812][] @ljharb)
-* Fix [`no-unused-prop-types`][] props detection in stateless components ([#885][] @BarryThePenguin)
-* Fix [`display-name`] false positive with `document.createElement` ([#996][] @jomasti)
-* Fix ESLint 2 compatibility (@ljharb)
-
-### Changed
-* Tests improvements (@ljharb)
-* Documentation improvements ([#958][] @Jorundur, [#1010][] @amilajack, [#1041][] @EvNaverniouk, [#1050][] @lencioni, [#1062][] @dguo)
-
-[6.10.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.9.0...v6.10.0
-[#696]: https://github.com/yannickcr/eslint-plugin-react/issues/696
-[#709]: https://github.com/yannickcr/eslint-plugin-react/issues/709
-[#887]: https://github.com/yannickcr/eslint-plugin-react/issues/887
-[#541]: https://github.com/yannickcr/eslint-plugin-react/issues/541
-[#786]: https://github.com/yannickcr/eslint-plugin-react/issues/786
-[#878]: https://github.com/yannickcr/eslint-plugin-react/issues/878
-[#814]: https://github.com/yannickcr/eslint-plugin-react/issues/814
-[#1029]: https://github.com/yannickcr/eslint-plugin-react/issues/1029
-[#1043]: https://github.com/yannickcr/eslint-plugin-react/issues/1043
-[#812]: https://github.com/yannickcr/eslint-plugin-react/issues/812
-[#885]: https://github.com/yannickcr/eslint-plugin-react/issues/885
-[#996]: https://github.com/yannickcr/eslint-plugin-react/issues/996
-[#958]: https://github.com/yannickcr/eslint-plugin-react/pull/958
-[#1010]: https://github.com/yannickcr/eslint-plugin-react/pull/1010
-[#1041]: https://github.com/yannickcr/eslint-plugin-react/pull/1041
-[#1050]: https://github.com/yannickcr/eslint-plugin-react/pull/1050
-[#1062]: https://github.com/yannickcr/eslint-plugin-react/pull/1062
-
-## [6.9.0] - 2017-01-08
-### Added
-* Add support for variable reference to [`sort-prop-types`][] ([#622][])
-
-### Fixed
-* Fix Node.js 0.10 support ([#1000][] @ljharb)
-* Fix [`prop-types`][] to correctly assign props to components ([#991][])
-
-### Changed
-* Documentation improvements ([#995][] @rutsky)
-
-[6.9.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.8.0...v6.9.0
-[#622]: https://github.com/yannickcr/eslint-plugin-react/issues/622
-[#1000]: https://github.com/yannickcr/eslint-plugin-react/pull/1000
-[#991]: https://github.com/yannickcr/eslint-plugin-react/issues/991
-[#995]: https://github.com/yannickcr/eslint-plugin-react/pull/995
-
-## [6.8.0] - 2016-12-05
-### Added
-* Add [`no-array-index-key`][] rule ([#978][] @lencioni)
-* Add [`require-default-props`][] rule ([#528][]  @vitorbal)
-* Add support for flow variance syntax to [`prop-types`][] ([#961][] @ajhyndman)
-
-### Fixed
-* Fix [`jsx-indent`][] with multiline jsx in ternaries ([#966][])
-* Fix component detection to ignore async functions ([#989][] @taion)
-* Fix [`jsx-curly-spacing`][] autofix to not delete comments ([#648][])
-* Fix auto-enabling of `eslint-plugin-react` in exported configurations ([#984][] @jamischarles)
-
-### Changed
-* Update dependencies
-* Documentation improvements ([#960][] @evilebottnawi, [#973][] @JamesWatling, [#982][] @captbaritone)
-
-[6.8.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.7.1...v6.8.0
-[#978]: https://github.com/yannickcr/eslint-plugin-react/pull/978
-[#528]: https://github.com/yannickcr/eslint-plugin-react/issues/528
-[#961]: https://github.com/yannickcr/eslint-plugin-react/issues/961
-[#966]: https://github.com/yannickcr/eslint-plugin-react/issues/966
-[#989]: https://github.com/yannickcr/eslint-plugin-react/pull/989
-[#648]: https://github.com/yannickcr/eslint-plugin-react/issues/648
-[#984]: https://github.com/yannickcr/eslint-plugin-react/pull/984
-[#960]: https://github.com/yannickcr/eslint-plugin-react/pull/960
-[#973]: https://github.com/yannickcr/eslint-plugin-react/pull/973
-[#982]: https://github.com/yannickcr/eslint-plugin-react/pull/982
-
-## [6.7.1] - 2016-11-15
-### Fixed
-* Fix [`jsx-tag-spacing`][] crash when options object isn't passed ([#955][] @daltones)
-
-[6.7.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.7.0...v6.7.1
-[#955]: https://github.com/yannickcr/eslint-plugin-react/issues/955
-
-## [6.7.0] - 2016-11-14
-### Added
-* Add [`jsx-tag-spacing`][] rule ([#693][] @Kovensky)
-
-### Fixed
-* Fix [`jsx-indent`][] for parenthesized ternaries ([#945][] @voxpelli)
-* Fix [`jsx-indent`][] for multiline ternaries
-* Fix [`jsx-indent`][] for arrays in jsx ([#947][])
-* Fix [`no-danger-with-children`][] crash with spread on global variables ([#921][])
-* Fix [`jsx-wrap-multilines`][] ternaries handling ([#916][])
-
-### Changed
-* Enable [`no-unused-prop-types`][] `skipShapeProps` option by default to limit false positive ([#953][] @everdimension)
-
-[6.7.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.6.0...v6.7.0
-[#693]: https://github.com/yannickcr/eslint-plugin-react/issues/693
-[#945]: https://github.com/yannickcr/eslint-plugin-react/issues/945
-[#947]: https://github.com/yannickcr/eslint-plugin-react/issues/947
-[#921]: https://github.com/yannickcr/eslint-plugin-react/issues/921
-[#916]: https://github.com/yannickcr/eslint-plugin-react/issues/916
-[#953]: https://github.com/yannickcr/eslint-plugin-react/pull/953
-
-## [6.6.0] - 2016-11-06
-### Added
-* Add [`jsx-first-prop-new-line`][] auto fix ([#886][] @snowypowers)
-
-### Fixed
-* Fix [`no-unused-prop-types`][] crash with destructured prop-types ([#938][])
-* Fix [`jsx-indent`][] in multi-line conditional expressions ([#901][], [#907][])
-* Fix [`sort-comp`][] bad error message if 2 methods in the same group must be moved ([#507][])
-
-### Changed
-* Documentation improvements ([#941][] @pwmckenna)
-
-[6.6.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.5.0...v6.6.0
-[#886]: https://github.com/yannickcr/eslint-plugin-react/pull/886
-[#938]: https://github.com/yannickcr/eslint-plugin-react/issues/938
-[#901]: https://github.com/yannickcr/eslint-plugin-react/issues/901
-[#907]: https://github.com/yannickcr/eslint-plugin-react/issues/907
-[#507]: https://github.com/yannickcr/eslint-plugin-react/issues/507
-[#941]: https://github.com/yannickcr/eslint-plugin-react/pull/941
-
-## [6.5.0] - 2016-11-01
-### Added
-* Add tab support to [`jsx-closing-bracket-location`][] auto fixer ([#909][] @arperry)
-* Add tab and space support to [`jsx-indent`][] auto fixer ([#608][] @jayphelps)
-* Add `multiline-multiprop` option to [`jsx-first-prop-new-line`][] ([#883][] @kentor)
-
-### Fixed
-* Fix [`forbid-component-props`][] crash with self reference JSX element ([#839][] @xeodou)
-* Fix [`jsx-indent`][] to ignore lines starting by literals ([#900][])
-* Fix [`no-set-state`][] to correctly detect `setState` in arrow functions ([#931][])
-
-### Changed
-* Update dependencies
-* Add `deprecated` metadata to deprecated rules ([#911][] @randycoulman)
-* Auto-enable `eslint-plugin-react` in exported configurations ([#925][] @MoOx)
-* Documentation improvements ([#910][] @Wilfred, [#932][] @gnarf)
-
-[6.5.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.4.1...v6.5.0
-[#909]: https://github.com/yannickcr/eslint-plugin-react/pull/909
-[#608]: https://github.com/yannickcr/eslint-plugin-react/pull/608
-[#883]: https://github.com/yannickcr/eslint-plugin-react/pull/883
-[#839]: https://github.com/yannickcr/eslint-plugin-react/pull/839
-[#900]: https://github.com/yannickcr/eslint-plugin-react/issues/900
-[#931]: https://github.com/yannickcr/eslint-plugin-react/issues/931
-[#911]: https://github.com/yannickcr/eslint-plugin-react/pull/911
-[#925]: https://github.com/yannickcr/eslint-plugin-react/pull/925
-[#910]: https://github.com/yannickcr/eslint-plugin-react/pull/910
-[#932]: https://github.com/yannickcr/eslint-plugin-react/pull/932
-
-## [6.4.1] - 2016-10-10
-### Fixed
-* Fix [`jsx-indent`][] for arrays ([#897][], [#898][])
-* Fix [`jsx-indent`][] to allow multi-line logical expressions with one level of indent ([#896][])
-
-[6.4.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.4.0...v6.4.1
-[#897]: https://github.com/yannickcr/eslint-plugin-react/issues/897
-[#898]: https://github.com/yannickcr/eslint-plugin-react/issues/898
-[#896]: https://github.com/yannickcr/eslint-plugin-react/pull/896
-
-## [6.4.0] - 2016-10-09
-### Added
-* Add `skipUndeclared` option to [`prop-types`][] ([#846][] @pfhayes)
-
-### Fixed
-* Fix [`jsx-no-bind`][] crash on arrow functions ([#854][])
-* Fix [`display-name`][] false negative on es6-style method in `React.createClass` ([#852][])
-* Fix [`prefer-stateless-function`][] to allow components with `childContextTypes` ([#853][])
-* Fix [`no-children-prop`][] spread support ([#862][] @randycoulman)
-* Fix [`no-unused-prop-types`][] to ignore validation when spread is used ([#840][])
-* Fix [`jsx-closing-bracket-location`][] for multi-line prop ([#889][])
-* Fix [`jsx-indent`][] in multi-line function calls ([#895][])
-* Fix [`jsx-indent`][] in multi-line logical expressions ([#540][])
-
-### Changed
-* Update dependencies
-* Documentation improvements ([#860][] @fson, [#863][] @corydolphin, [#830][] @eelyafi, [#876][] @manovotny, [#877][] @gaearon)
-
-[6.4.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.3.0...v6.4.0
-[#846]: https://github.com/yannickcr/eslint-plugin-react/pull/846
-[#854]: https://github.com/yannickcr/eslint-plugin-react/issues/854
-[#852]: https://github.com/yannickcr/eslint-plugin-react/issues/852
-[#853]: https://github.com/yannickcr/eslint-plugin-react/issues/853
-[#862]: https://github.com/yannickcr/eslint-plugin-react/pull/862
-[#840]: https://github.com/yannickcr/eslint-plugin-react/issues/840
-[#889]: https://github.com/yannickcr/eslint-plugin-react/issues/889
-[#895]: https://github.com/yannickcr/eslint-plugin-react/issues/895
-[#540]: https://github.com/yannickcr/eslint-plugin-react/issues/540
-[#860]: https://github.com/yannickcr/eslint-plugin-react/pull/860
-[#863]: https://github.com/yannickcr/eslint-plugin-react/pull/863
-[#830]: https://github.com/yannickcr/eslint-plugin-react/pull/830
-[#876]: https://github.com/yannickcr/eslint-plugin-react/pull/876
-[#877]: https://github.com/yannickcr/eslint-plugin-react/pull/877
-
-## [6.3.0] - 2016-09-20
-### Added
-* Add [`no-children-prop`][] rule ([#720][] @benstepp)
-* Add [`no-unescaped-entities`][] rule ([#681][] @pfhayes)
-* Add JSXExpressionContainer support to [`jsx-indent`][] rule ([#838][] @eelyafi)
-
-### Fixed
-* Fix [`style-prop-object`][] crash ([#834][])
-* Fix [`style-prop-object`][] false positive on computed properties ([#820][])
-* Fix [`style-prop-object`][] to deal with null and spread props that can't be resolved ([#809][] [#812][] @petersendidit)
-
-[6.3.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.2.2...v6.3.0
-[#720]: https://github.com/yannickcr/eslint-plugin-react/issues/720
-[#681]: https://github.com/yannickcr/eslint-plugin-react/pull/681
-[#838]: https://github.com/yannickcr/eslint-plugin-react/pull/838
-[#834]: https://github.com/yannickcr/eslint-plugin-react/issues/834
-[#820]: https://github.com/yannickcr/eslint-plugin-react/issues/820
-[#809]: https://github.com/yannickcr/eslint-plugin-react/issues/809
-[#812]: https://github.com/yannickcr/eslint-plugin-react/issues/812
-
-## [6.2.2] - 2016-09-15
-### Fixed
-* Fix [`no-unused-prop-types`][] crash ([#825][] @EvNaverniouk)
-* Fix [`jsx-no-target-blank`][] crash ([#821][])
-
-[6.2.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.2.1...v6.2.2
-[#821]: https://github.com/yannickcr/eslint-plugin-react/issues/821
-[#825]: https://github.com/yannickcr/eslint-plugin-react/pull/825
-
-## [6.2.1] - 2016-09-13
-### Fixed
-* Fix false positive in [`no-unused-prop-types`][] ([#792][] @EvNaverniouk)
-* Fix [`jsx-no-target-blank`][] to target only anchor elements ([#793][] @aduth)
-* Fix [`jsx-no-target-blank`][] to be case insensitive [#796][] @dmnd)
-* Fix [`jsx-uses-vars`][] shadowed variables handling ([#799][])
-
-### Changed
-* Update dependencies
-* Documentation improvements (@ljharb, [#794][] @dougshamoo, [#813][] @AndiDog, [#815][] @chris-vaszauskas)
-
-[6.2.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.2.0...v6.2.1
-[#792]: https://github.com/yannickcr/eslint-plugin-react/pull/792
-[#793]: https://github.com/yannickcr/eslint-plugin-react/pull/793
-[#794]: https://github.com/yannickcr/eslint-plugin-react/pull/794
-[#796]: https://github.com/yannickcr/eslint-plugin-react/pull/796
-[#799]: https://github.com/yannickcr/eslint-plugin-react/issues/799
-[#813]: https://github.com/yannickcr/eslint-plugin-react/pull/813
-[#815]: https://github.com/yannickcr/eslint-plugin-react/pull/815
-
-## [6.2.0] - 2016-08-28
-### Added
-* Add [`no-unused-prop-types`][] rule ([#226][] @EvNaverniouk)
-* Add [`style-prop-object`][] rule ([#715][] @petersendidit)
-* Add auto fix for [`self-closing-comp`][] ([#770][] @pl12133)
-* Add support for `typeAnnotations` in [`sort-comp`][] ([#235][] @dozoisch)
-* Add support for `PureComponent` in [`prefer-stateless-function`][] ([#781][] @tiemevanveen)
-
-### Fixed
-* Fix [`jsx-uses-vars`][] to work better with [`prefer-const`](http://eslint.org/docs/rules/prefer-const). You'll need to upgrade to ESLint 3.4.0 to completely fix the compatibility issue ([#716][])
-* Fix [`require-render-return`][] crash ([#784][])
-* Fix related components detection in [`prop-types`][] ([#735][])
-* Fix component detection to ignore functions expression without a parent component
-
-### Changed
-* Update dependencies
-* Documentation improvements (@lencioni)
-
-[6.2.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.1.2...v6.2.0
-[#226]: https://github.com/yannickcr/eslint-plugin-react/issues/226
-[#715]: https://github.com/yannickcr/eslint-plugin-react/issues/715
-[#770]: https://github.com/yannickcr/eslint-plugin-react/pull/770
-[#235]: https://github.com/yannickcr/eslint-plugin-react/issues/235
-[#781]: https://github.com/yannickcr/eslint-plugin-react/pull/781
-[#716]: https://github.com/yannickcr/eslint-plugin-react/issues/716
-[#784]: https://github.com/yannickcr/eslint-plugin-react/issues/784
-[#735]: https://github.com/yannickcr/eslint-plugin-react/issues/735
-
-## [6.1.2] - 2016-08-17
-### Fixed
-* Fix nested spread handling in [`no-danger-with-children`][] ([#771][] @petersendidit)
-
-### Changed
-* Documentation improvements
-
-[6.1.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.1.1...v6.1.2
-[#771]: https://github.com/yannickcr/eslint-plugin-react/issues/771
-
-## [6.1.1] - 2016-08-16
-### Fixed
-* Fix [`prop-types`][] on annotated components ([#766][])
-* Fix [`no-danger-with-children`][] spread support ([#767][] @petersendidit)
-
-### Changed
-* Documentation improvements ([#769][] @daltones)
-
-[6.1.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.1.0...v6.1.1
-[#766]: https://github.com/yannickcr/eslint-plugin-react/issues/766
-[#767]: https://github.com/yannickcr/eslint-plugin-react/issues/767
-[#769]: https://github.com/yannickcr/eslint-plugin-react/pull/769
-
-## [6.1.0] - 2016-08-14
-### Added
-* Add `React.PureComponent` support ([#737][])
-* Add [`forbid-component-props`][] rule ([#314][] @lencioni)
-* Add [`no-danger-with-children`][] rule ([#710][] @petersendidit)
-* Add pragma for `createClass` factory method ([#725][] @zurawiki)
-
-### Fixed
-* Fix Node.js 0.10 support ([#746][])
-* Fix [`prop-types`][] on annotated components ([#729][])
-* Fix [`require-optimization`][] test for function declaration ([#744][] @Tom910)
-* Fix [`jsx-uses-vars`][] to handle nested object properties ([#761][] @yayalice)
-* Fix rules metadata
-
-### Changed
-* Update dependencies
-* Documentation improvements ([#759][] @embrown, [#703][] [#753][] @lencioni, [#739][] @ljharb, [#731][] @wKich, [#745][] @petersendidit, [#659][] @dguo)
-
-[6.1.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v6.0.0...v6.1.0
-[#737]: https://github.com/yannickcr/eslint-plugin-react/issues/737
-[#710]: https://github.com/yannickcr/eslint-plugin-react/issues/710
-[#725]: https://github.com/yannickcr/eslint-plugin-react/pull/725
-[#746]: https://github.com/yannickcr/eslint-plugin-react/issues/746
-[#729]: https://github.com/yannickcr/eslint-plugin-react/issues/729
-[#744]: https://github.com/yannickcr/eslint-plugin-react/pull/744
-[#761]: https://github.com/yannickcr/eslint-plugin-react/pull/761
-[#759]: https://github.com/yannickcr/eslint-plugin-react/pull/759
-[#703]: https://github.com/yannickcr/eslint-plugin-react/pull/703
-[#753]: https://github.com/yannickcr/eslint-plugin-react/pull/753
-[#739]: https://github.com/yannickcr/eslint-plugin-react/issues/739
-[#731]: https://github.com/yannickcr/eslint-plugin-react/pull/731
-[#745]: https://github.com/yannickcr/eslint-plugin-react/pull/745
-[#659]: https://github.com/yannickcr/eslint-plugin-react/pull/659
-[#314]: https://github.com/yannickcr/eslint-plugin-react/pull/314
-
-## [6.0.0] - 2016-08-01
-### Added
-* Add an `all` shareable configuration with all rules enabled ([#674][] @pfhayes)
-* Add [`no-find-dom-node`][] rule ([#678][])
-* Add `shorthandLast` option to [`jsx-sort-props`][] ([#391][] @mathieumg)
-* Add `allowDecorators` option to [`require-optimization`][] ([#669][] @Tom910)
-
-### Breaking
-* Deprecate [`require-extension`][] rule, use the [eslint-plugin-import](https://github.com/benmosher/eslint-plugin-import) [`extensions`](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/extensions.md) rule instead. [`require-extension`][] still works but will trigger a warning
-* Enable `allow-in-func` mode by default in [`no-did-mount-set-state`][] and [`no-did-update-set-state`][] rules ([#702][] @lencioni)
-* Enable html tags check by default in `self-closing-comp`
-* Remove `pragma` option from `jsx-uses-react`, use the [shared settings](README.md#configuration) to specify a custom pragma ([#700][] @lencioni)
-* Remove `react` option from [`no-deprecated`][] rule, use the [shared settings](README.md#configuration) to specify the React version ([#700][] @lencioni)
-* Add [`require-render-return`][] rule to recommended rules
-* Remove [`no-danger`][] from recommended rules ([#636][] @mjackson)
-* Remove [`no-did-mount-set-state`][] and [`no-did-update-set-state`][] from recommended rules ([#596][])
-* Remove deprecated [`jsx-sort-prop-types`][] rule, use [`sort-prop-types`][] instead ([#549][] @lencioni)
-* Rename [`no-comment-textnodes`][] to [`jsx-no-comment-textnodes`][]. [`no-comment-textnodes`][] still works but will trigger a warning ([#668][] @lencioni)
-* Rename [`wrap-multilines`][] to [`jsx-wrap-multilines`][]. [`wrap-multilines`][] still works but will trigger a warning ([#668][] @lencioni)
-* Add ESLint as peerDependency ([#657][] @jokeyrhyme)
-* Add Node.js 0.10 as minimum required version ([#657][] @jokeyrhyme)
-
-### Fixed
-* Fix [`jsx-handler-names`][] incorrectly flagging `only` ([#571][] @lencioni)
-* Fix spread props cash in [`jsx-no-target-blank`][] ([#679][] @randycoulman)
-* Fix [`require-optimization`][] warning on stateless components ([#687][])
-* Fix [`jsx-uses-vars`][] that incorrectly marked some variables as used ([#694][] @lencioni)
-* Fix [`no-unknown-property`][] check on SVG attributes ([#718][])
-* Fix [`jsx-no-bind`][] reporting errors on render functions that don't return JSX ([#663][] @petersendidit)
-* Fix [`jsx-closing-bracket-location`][] autofix when `location` is set to `props-aligned` ([#684][] @pfhayes)
-* Fix [`prop-types`][] for destructured arguments being assigned to the parent stateless component in some cases ([#698][])
-* Fix [`prop-types`][] for JSX return being assigned to the parent function in some cases ([#504][])
-* Fix [`jsx-curly-spacing`][] for reporting on JSX content by mistake ([#671][])
-* Fix [`prop-types`][] crash when accessing constructor on props ([#654][])
-* Fix [`jsx-filename-extension`][] to not check filenames on text input ([#662][] @ljharb)
-* Fix [`jsx-no-comment-textnodes`][] incorrectly catching urls ([#664][] @petersendidit)
-
-### Changed
-* Only report [`jsx-filename-extension`][] warning once per file ([#660][] @mathieumg)
-* Update SVG and DOM attribute list for `no-unknown-property`
-* Update rules to use the new ESLint rule format ([#661][] @petersendidit)
-* Update dependencies
-* Documentation improvements ([#724][] @lencioni)
-* Update Travis CI and AppVeyor CI configurations (@ljharb)
-
-[6.0.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v5.2.2...v6.0.0
-[#571]: https://github.com/yannickcr/eslint-plugin-react/issues/571
-[#728]: https://github.com/yannickcr/eslint-plugin-react/pull/728
-[#679]: https://github.com/yannickcr/eslint-plugin-react/pull/679
-[#687]: https://github.com/yannickcr/eslint-plugin-react/issues/687
-[#694]: https://github.com/yannickcr/eslint-plugin-react/issues/694
-[#718]: https://github.com/yannickcr/eslint-plugin-react/issues/718
-[#723]: https://github.com/yannickcr/eslint-plugin-react/pull/723
-[#702]: https://github.com/yannickcr/eslint-plugin-react/pull/702
-[#700]: https://github.com/yannickcr/eslint-plugin-react/pull/700
-[#636]: https://github.com/yannickcr/eslint-plugin-react/pull/636
-[#596]: https://github.com/yannickcr/eslint-plugin-react/issues/596
-[#661]: https://github.com/yannickcr/eslint-plugin-react/issues/661
-[#724]: https://github.com/yannickcr/eslint-plugin-react/pull/724
-[#674]: https://github.com/yannickcr/eslint-plugin-react/issues/674
-[#678]: https://github.com/yannickcr/eslint-plugin-react/issues/678
-[#391]: https://github.com/yannickcr/eslint-plugin-react/issues/391
-[#669]: https://github.com/yannickcr/eslint-plugin-react/pull/669
-[#663]: https://github.com/yannickcr/eslint-plugin-react/issues/663
-[#684]: https://github.com/yannickcr/eslint-plugin-react/pull/684
-[#698]: https://github.com/yannickcr/eslint-plugin-react/issues/698
-[#504]: https://github.com/yannickcr/eslint-plugin-react/issues/504
-[#671]: https://github.com/yannickcr/eslint-plugin-react/issues/671
-[#549]: https://github.com/yannickcr/eslint-plugin-react/issues/549
-[#668]: https://github.com/yannickcr/eslint-plugin-react/issues/668
-[#660]: https://github.com/yannickcr/eslint-plugin-react/pull/660
-[#654]: https://github.com/yannickcr/eslint-plugin-react/issues/654
-[#662]: https://github.com/yannickcr/eslint-plugin-react/issues/662
-[#664]: https://github.com/yannickcr/eslint-plugin-react/issues/664
-[#657]: https://github.com/yannickcr/eslint-plugin-react/pull/657
-
-## [5.2.2] - 2016-06-17
-### Fixed
-* Fix [`jsx-no-bind`][] crash ([#641][])
-
-[5.2.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v5.2.1...v5.2.2
-[#641]: https://github.com/yannickcr/eslint-plugin-react/issues/641
-
-## [5.2.1] - 2016-06-17
-### Fixed
-* Fix [`jsx-pascal-case`][] for namespaced components ([#637][] @evcohen)
-
-[5.2.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v5.2.0...v5.2.1
-[#637]: https://github.com/yannickcr/eslint-plugin-react/issues/637
-
-## [5.2.0] - 2016-06-17
-### Added
-* Add [`require-optimization`][] rule ([#240][] @EvNaverniouk)
-* Add [`jsx-filename-extension`][] rule  ([#495][] @lencioni)
-* Add [`no-render-return-value`][] rule ([#531][] @iamdustan)
-* Add [`no-comment-textnodes`][] rule ([#616][] @benvinegar)
-* Add `objectLiterals` option to [`jsx-curly-spacing`][] ([#388][], [#211][] @casesandberg @ljharb)
-* Add option to [`self-closing-comp`][] to check html tags ([#572][] @gitim)
-* Add `ignore` option to [`no-unknown-property`][] rule ([#631][] @insin)
-* Add support for ES7 bind operator to [`jsx-handler-names`][] ([#630][])
-* Add support for explicit declaration that class extends React.Component ([#68][] @gausie)
-
-### Fixed
-* Fix [`jsx-closing-bracket-location`][] multiline prop support ([#493][] @tuures)
-* Fix [`prop-types`][] for props that where not assigned to the right component ([#591][])
-* Fix [`display-name`][] when JSON style is used for defining components ([#590][] @gitim)
-* Fix [`jsx-no-bind`][] for bind detection in render when assigned to a variable ([#474][] @petersendidit)
-* Fix [`jsx-curly-spacing`][] for spread operator ([#606][] @gitim)
-* Fix [`sort-comp`][] crash on spread operator ([#624][])
-* Fix [`prop-types`][] crash when destructuring props with spread only
-
-### Changed
-* Update dependencies
-* Add [doctrine](https://github.com/eslint/doctrine) as a dependency ([#68][] @gausie)
-* Add [jsx-ast-utils](https://github.com/evcohen/jsx-ast-utils) as a dependency ([#634][] @evcohen)
-* Documentation improvements ([#594][] @lencioni, [#598][] @mLuby, [#633][] @appsforartists)
-
-[5.2.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v5.1.1...v5.2.0
-[#68]: https://github.com/yannickcr/eslint-plugin-react/issues/68
-[#211]: https://github.com/yannickcr/eslint-plugin-react/issues/211
-[#240]: https://github.com/yannickcr/eslint-plugin-react/issues/240
-[#388]: https://github.com/yannickcr/eslint-plugin-react/issues/388
-[#474]: https://github.com/yannickcr/eslint-plugin-react/issues/474
-[#493]: https://github.com/yannickcr/eslint-plugin-react/pull/493
-[#495]: https://github.com/yannickcr/eslint-plugin-react/issues/495
-[#531]: https://github.com/yannickcr/eslint-plugin-react/issues/531
-[#572]: https://github.com/yannickcr/eslint-plugin-react/issues/572
-[#590]: https://github.com/yannickcr/eslint-plugin-react/issues/590
-[#591]: https://github.com/yannickcr/eslint-plugin-react/issues/591
-[#594]: https://github.com/yannickcr/eslint-plugin-react/pull/594
-[#598]: https://github.com/yannickcr/eslint-plugin-react/pull/598
-[#606]: https://github.com/yannickcr/eslint-plugin-react/issues/606
-[#616]: https://github.com/yannickcr/eslint-plugin-react/pull/616
-[#624]: https://github.com/yannickcr/eslint-plugin-react/issues/624
-[#630]: https://github.com/yannickcr/eslint-plugin-react/issues/630
-[#631]: https://github.com/yannickcr/eslint-plugin-react/pull/631
-[#633]: https://github.com/yannickcr/eslint-plugin-react/pull/633
-[#634]: https://github.com/yannickcr/eslint-plugin-react/pull/634
-
-## [5.1.1] - 2016-05-10
-### Fixed
-* Fix [`require-render-return`][] crash ([#589][])
-
-[5.1.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v5.1.0...v5.1.1
-[#589]: https://github.com/yannickcr/eslint-plugin-react/issues/589
-
-## [5.1.0] - 2016-05-10
-### Added
-* Add [`jsx-no-target-blank`][] rule ([#582][] @Gasparila)
-* Add `allowAllCaps` and `ignore` options to [`jsx-pascal-case`][] ([#575][])
-* Add class properties support to [`require-render-return`][] ([#564][])
-
-### Fixed
-* Fix [`jsx-closing-bracket-location`][] fixer ([#533][] @dtinth)
-* Fix [`require-render-return`][] to only check valid render methods ([#563][])
-* Fix detection to allow simple `this` usage in fonctional components ([#576][])
-* Fix [`forbid-prop-types`][] crash ([#579][])
-* Fix comment handling in [`jsx-curly-spacing`][] ([#584][])
-
-### Changed
-* Update dependencies
-* Documentation improvements (@coryhouse, [#581][] @scurker, [#588][])
-
-[5.1.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v5.0.1...v5.1.0
-[#582]: https://github.com/yannickcr/eslint-plugin-react/pull/582
-[#575]: https://github.com/yannickcr/eslint-plugin-react/issues/575
-[#564]: https://github.com/yannickcr/eslint-plugin-react/issues/564
-[#533]: https://github.com/yannickcr/eslint-plugin-react/issues/533
-[#563]: https://github.com/yannickcr/eslint-plugin-react/issues/563
-[#576]: https://github.com/yannickcr/eslint-plugin-react/issues/576
-[#579]: https://github.com/yannickcr/eslint-plugin-react/issues/579
-[#584]: https://github.com/yannickcr/eslint-plugin-react/pull/584
-[#559]: https://github.com/yannickcr/eslint-plugin-react/pull/559
-[#581]: https://github.com/yannickcr/eslint-plugin-react/pull/581
-[#588]: https://github.com/yannickcr/eslint-plugin-react/issues/588
-
-## [5.0.1] - 2016-04-18
-### Fixed
-* Fix [`require-render-return`][] to not check stateless functions ([#550][])
-
-[5.0.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v5.0.0...v5.0.1
-[#550]: https://github.com/yannickcr/eslint-plugin-react/issues/550
-
-## [5.0.0] - 2016-04-17
-### Added
-* Add [`jsx-first-prop-new-line`][] rule ([#410][] @jseminck)
-
-### Breaking
-* Update rules for React 15:
-  * Add warnings for `LinkedStateMixin`, `ReactPerf.printDOM` and `ReactPerf.getMeasurementsSummaryMap` in `no-deprecated`
-  * Allow stateless components to return `null` in [`prefer-stateless-function`][]
-  * Remove SVG attributes warnings ([#490][])
-
-If you're still not using React 15 you can keep the old behavior by setting the React version to `0.14` in the [shared settings](README.md#configuration).
-
-### Fixed
-* Rewrite [`require-render-return`][] rule ([#542][], [#543][])
-* Fix [`prefer-stateless-function`][] crash ([#544][])
-* Fix external propTypes handling ([#545][])
-* Do not mark inline functions in JSX as components ([#546][])
-
-### Changed
-* Update dependencies
-* Documentation improvements
-
-[5.0.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v4.3.0...v5.0.0
-[#410]: https://github.com/yannickcr/eslint-plugin-react/issues/410
-[#490]: https://github.com/yannickcr/eslint-plugin-react/issues/490
-[#542]: https://github.com/yannickcr/eslint-plugin-react/issues/542
-[#543]: https://github.com/yannickcr/eslint-plugin-react/issues/543
-[#544]: https://github.com/yannickcr/eslint-plugin-react/issues/544
-[#545]: https://github.com/yannickcr/eslint-plugin-react/issues/545
-[#546]: https://github.com/yannickcr/eslint-plugin-react/issues/546
-
-## [4.3.0] - 2016-04-07
-### Added
-* Add [`require-render-return`][] rule ([#482][] @shmuga)
-* Add auto fix for [`jsx-equals-spacing`][] ([#506][] @peet)
-* Add auto fix for [`jsx-closing-bracket-location`][] ([#511][] @KevinGrandon)
-
-### Fixed
-* Fix [`prefer-stateless-function`][] for conditional JSX ([#516][])
-* Fix [`jsx-pascal-case`][] to support single letter component names ([#505][] @dthielman)
-
-### Changed
-* Update dependencies
-* Documentation improvements ([#509][] @coryhouse, [#526][] @ahoym)
-
-[4.3.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v4.2.3...v4.3.0
-[#482]: https://github.com/yannickcr/eslint-plugin-react/issues/482
-[#506]: https://github.com/yannickcr/eslint-plugin-react/pull/506
-[#511]: https://github.com/yannickcr/eslint-plugin-react/pull/511
-[#516]: https://github.com/yannickcr/eslint-plugin-react/issues/516
-[#505]: https://github.com/yannickcr/eslint-plugin-react/issues/505
-[#509]: https://github.com/yannickcr/eslint-plugin-react/pull/509
-[#526]: https://github.com/yannickcr/eslint-plugin-react/pull/526
-
-## [4.2.3] - 2016-03-15
-### Fixed
-* Fix class properties retrieval in [`prefer-stateless-function`][] ([#499][])
-
-[4.2.3]: https://github.com/yannickcr/eslint-plugin-react/compare/v4.2.2...v4.2.3
-[#499]: https://github.com/yannickcr/eslint-plugin-react/issues/499
-
-## [4.2.2] - 2016-03-14
-### Fixed
-* Rewrite [`prefer-stateless-function`][] rule ([#491][])
-* Fix [`self-closing-comp`][] to treat non-breaking spaces as content ([#496][])
-* Fix detection for direct props in [`prop-types`][] ([#497][])
-* Fix annotated function detection in [`prop-types`][] ([#498][])
-* Fix `this` usage in [`jsx-no-undef`][] ([#489][])
-
-### Changed
-* Update dependencies
-* Add shared setting for React version
-
-[4.2.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v4.2.1...v4.2.2
-[#491]: https://github.com/yannickcr/eslint-plugin-react/issues/491
-[#496]: https://github.com/yannickcr/eslint-plugin-react/issues/496
-[#497]: https://github.com/yannickcr/eslint-plugin-react/issues/497
-[#498]: https://github.com/yannickcr/eslint-plugin-react/issues/498
-[#489]: https://github.com/yannickcr/eslint-plugin-react/issues/489
-
-## [4.2.1] - 2016-03-08
-### Fixed
-* Fix [`sort-prop-types`][] crash with spread operator ([#478][])
-* Fix stateless components detection when conditionally returning JSX ([#486][])
-* Fix case where props were not assigned to the right component ([#485][])
-* Fix missing `getChildContext` lifecycle method in [`prefer-stateless-function`][] ([#492][])
-
-[4.2.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v4.2.0...v4.2.1
-[#478]: https://github.com/yannickcr/eslint-plugin-react/issues/478
-[#486]: https://github.com/yannickcr/eslint-plugin-react/issues/486
-[#485]: https://github.com/yannickcr/eslint-plugin-react/issues/485
-[#492]: https://github.com/yannickcr/eslint-plugin-react/issues/492
-
-## [4.2.0] - 2016-03-05
-### Added
-* Add support for Flow annotations on stateless components ([#467][])
-* Add [`prefer-stateless-function`][] rule ([#214][])
-* Add auto fix for [`jsx-indent-props`][] ([#483][] @shioju)
-
-### Fixed
-* Fix [`jsx-no-undef`][] crash on objects ([#469][])
-* Fix propTypes detection when declared before the component ([#472][])
-
-### Changed
-* Update dependencies
-* Documentation improvements ([#464][] @alex-tan, [#466][] @awong-dev, [#470][] @Gpx; [#462][] @thaggie)
-
-[4.2.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v4.1.0...v4.2.0
-[#467]: https://github.com/yannickcr/eslint-plugin-react/issues/467
-[#214]: https://github.com/yannickcr/eslint-plugin-react/issues/214
-[#483]: https://github.com/yannickcr/eslint-plugin-react/pull/483
-[#469]: https://github.com/yannickcr/eslint-plugin-react/issues/469
-[#472]: https://github.com/yannickcr/eslint-plugin-react/issues/472
-[#464]: https://github.com/yannickcr/eslint-plugin-react/pull/464
-[#466]: https://github.com/yannickcr/eslint-plugin-react/pull/466
-[#470]: https://github.com/yannickcr/eslint-plugin-react/pull/470
-[#462]: https://github.com/yannickcr/eslint-plugin-react/pull/462
-
-## [4.1.0] - 2016-02-23
-### Added
-* Add component detection for class expressions
-* Add displayName detection for class expressions in [`display-name`][] ([#419][])
-
-### Fixed
-* Fix used props detection in components for which we are not confident in [`prop-types`][] ([#420][])
-* Fix false positive in [`jsx-key`][] ([#456][] @jkimbo)
-
-### Changed
-* Documentation improvements ([#457][] @wyze)
-
-[4.1.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v4.0.0...v4.1.0
-[#419]: https://github.com/yannickcr/eslint-plugin-react/issues/419
-[#420]: https://github.com/yannickcr/eslint-plugin-react/issues/420
-[#456]: https://github.com/yannickcr/eslint-plugin-react/pull/456
-[#457]: https://github.com/yannickcr/eslint-plugin-react/pull/457
-
-## [4.0.0] - 2016-02-19
-### Added
-* Add [`jsx-space-before-closing`][] rule ([#244][] @ryym)
-* Add support for destructing in function signatures to [`prop-types`][] ([#354][] @lencioni)
-
-### Breaking
-* Add support for static methods to `sort-comp`. Static methods must now be declared first, see [rule documentation](docs/rules/sort-comp.md) ([#128][] @lencioni)
-* Add shareable config in place of default configuration. [`jsx-uses-vars`][] is not enabled by default anymore, see [documentation](README.md#recommended-configuration) ([#192][])
-* Rename `jsx-sort-prop-types` to [`sort-prop-types`][]. `jsx-sort-prop-types` still works but will trigger a warning ([#87][] @lencioni)
-* Remove deprecated `jsx-quotes` rule ([#433][] @lencioni)
-* [`display-name`][] now accept the transpiler name by default. You can use the `ignoreTranspilerName` option to get the old behavior, see [rule documentation](docs/rules/display-name.md#ignoretranspilername) ([#440][] @lencioni)
-
-### Fixed
-* Only ignore lowercase JSXIdentifier in [`jsx-no-undef`][] ([#435][])
-* Fix [`jsx-handler-names`][] regex ([#425][])
-* Fix destructured props detection in [`prop-types`][] ([#443][])
-
-### Changed
-* Update dependencies ([#426][] @quentin-)
-* Documentation improvements ([#414][] @vkrol, [#370][] @tmcw, [#441][] [#429][] @lencioni, [#432][] @note89, [#438][] @jmann6)
-
-[4.0.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.16.1...v4.0.0
-[#244]: https://github.com/yannickcr/eslint-plugin-react/issues/244
-[#354]: https://github.com/yannickcr/eslint-plugin-react/issues/354
-[#128]: https://github.com/yannickcr/eslint-plugin-react/issues/128
-[#192]: https://github.com/yannickcr/eslint-plugin-react/issues/192
-[#87]: https://github.com/yannickcr/eslint-plugin-react/issues/87
-[#440]: https://github.com/yannickcr/eslint-plugin-react/pull/440
-[#435]: https://github.com/yannickcr/eslint-plugin-react/issues/435
-[#425]: https://github.com/yannickcr/eslint-plugin-react/issues/425
-[#443]: https://github.com/yannickcr/eslint-plugin-react/issues/443
-[#426]: https://github.com/yannickcr/eslint-plugin-react/pull/426
-[#414]: https://github.com/yannickcr/eslint-plugin-react/pull/414
-[#370]: https://github.com/yannickcr/eslint-plugin-react/pull/370
-[#441]: https://github.com/yannickcr/eslint-plugin-react/pull/441
-[#429]: https://github.com/yannickcr/eslint-plugin-react/pull/429
-[#432]: https://github.com/yannickcr/eslint-plugin-react/pull/432
-[#438]: https://github.com/yannickcr/eslint-plugin-react/pull/438
-[#433]: https://github.com/yannickcr/eslint-plugin-react/pull/433
-
-## [3.16.1] - 2016-01-24
-### Fixed
-* Fix [`jsx-sort-prop-types`][] issue with custom propTypes ([#408][] @alitaheri)
-
-[3.16.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.16.0...v3.16.1
-[#408]: https://github.com/yannickcr/eslint-plugin-react/issues/408
-
-## [3.16.0] - 2016-01-24
-### Added
-* Add [`jsx-equals-spacing`][] rule ([#394][] @ryym)
-* Add auto fix for `wrap-multiline`
-* Add auto fix for `jsx-boolean-value`
-* Add auto fix for `no-unknown-property`
-* Add auto fix for [`jsx-curly-spacing`][] ([#407][] @ewendel)
-* Add `requiredFirst` option to [`jsx-sort-prop-types`][] ([#392][] @chrislaskey)
-* Add `ignoreRefs` option to [`jsx-no-bind`][] ([#330][] @silvenon)
-
-### Fixed
-* Ignore `ref` in [`jsx-handler-names`][] (again) ([#396][])
-
-### Changed
-* Update dependencies
-
-[3.16.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.15.0...v3.16.0
-[#394]: https://github.com/yannickcr/eslint-plugin-react/issues/394
-[#407]: https://github.com/yannickcr/eslint-plugin-react/pull/407
-[#392]: https://github.com/yannickcr/eslint-plugin-react/pull/392
-[#330]: https://github.com/yannickcr/eslint-plugin-react/issues/330
-[#396]: https://github.com/yannickcr/eslint-plugin-react/issues/396
-
-## [3.15.0] - 2016-01-12
-### Added
-* Add support for flow annotations to [`prop-types`][] ([#382][] @phpnode)
-
-### Fixed
-* Fix [`prop-types`][] crash when initializing class variable with an empty object ([#383][])
-* Fix [`prop-types`][] crash when propTypes are using the spread operator ([#389][])
-
-### Changed
-* Improve [`sort-comp`][] error messages ([#372][] @SystemParadox)
-* Update dependencies
-
-[3.15.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.14.0...v3.15.0
-[#382]: https://github.com/yannickcr/eslint-plugin-react/pull/382
-[#383]: https://github.com/yannickcr/eslint-plugin-react/issues/383
-[#389]: https://github.com/yannickcr/eslint-plugin-react/issues/389
-[#372]: https://github.com/yannickcr/eslint-plugin-react/pull/372
-
-## [3.14.0] - 2016-01-05
-### Added
-* Add [`jsx-indent`][] rule ([#342][])
-* Add shared setting for pragma configuration ([#228][] @NickStefan)
-
-### Fixed
-* Fix crash in [`jsx-key`][] ([#380][] @nfcampos)
-* Fix crash in [`forbid-prop-types`][] ([#377][] @nfcampos)
-* Ignore `ref` in [`jsx-handler-names`][] ([#375][])
-
-### Changed
-* Add AppVeyor CI to run tests on a Windows platform
-* Add [`sort-comp`][] codemod to [`sort-comp`][] documentation ([#381][] @turadg)
-
-[3.14.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.13.1...v3.14.0
-[#342]: https://github.com/yannickcr/eslint-plugin-react/issues/342
-[#228]: https://github.com/yannickcr/eslint-plugin-react/issues/228
-[#380]: https://github.com/yannickcr/eslint-plugin-react/pull/380
-[#377]: https://github.com/yannickcr/eslint-plugin-react/pull/377
-[#375]: https://github.com/yannickcr/eslint-plugin-react/issues/375
-[#381]: https://github.com/yannickcr/eslint-plugin-react/pull/381
-
-## [3.13.1] - 2015-12-26
-### Fixed
-* Fix crash in [`jsx-key`][] ([#373][] @lukekarrys)
-
-[3.13.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.13.0...v3.13.1
-[#373]: https://github.com/yannickcr/eslint-plugin-react/issues/373
-
-## [3.13.0] - 2015-12-24
-### Added
-* Add [`no-string-refs`][] rule ([#341][] @Intellicode)
-* Add support for propTypes assigned via a variable in [`prop-types`][] ([#355][])
-
-### Fixed
-* Fix `never` option in [`prefer-es6-class`][]
-* Fix [`jsx-key`][] false-positives ([#320][] @silvenon)
-
-### Changed
-* Documentation improvements ([#368][] @lencioni, [#370][] @tmcw, [#371][])
-* Update dependencies
-
-[3.13.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.12.0...v3.13.0
-[#341]: https://github.com/yannickcr/eslint-plugin-react/issues/341
-[#355]: https://github.com/yannickcr/eslint-plugin-react/issues/355
-[#320]: https://github.com/yannickcr/eslint-plugin-react/issues/320
-
-[#368]: https://github.com/yannickcr/eslint-plugin-react/pull/368
-[#370]: https://github.com/yannickcr/eslint-plugin-react/pull/370
-[#371]: https://github.com/yannickcr/eslint-plugin-react/issues/371
-
-## [3.12.0] - 2015-12-20
-### Added
-* Add [`no-deprecated`][] rule ([#356][] @graue)
-* Add [`no-is-mounted`][] rule ([#37][] @lencioni)
-* Add `never` option to [`prefer-es6-class`][] rule ([#359][] @pwmckenna)
-
-### Fixed
-* Fix [`jsx-pascal-case`][] to stop checking lower cased components ([#329][])
-* Fix crash in component detection class ([#364][])
-
-### Changed
-* Add link to [eslint-plugin-react-native](https://github.com/Intellicode/eslint-plugin-react-native) in Readme
-* Update dependencies
-
-[3.12.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.11.3...v3.12.0
-[#356]: https://github.com/yannickcr/eslint-plugin-react/pull/356
-[#37]: https://github.com/yannickcr/eslint-plugin-react/issues/37
-[#359]: https://github.com/yannickcr/eslint-plugin-react/pull/359
-[#329]: https://github.com/yannickcr/eslint-plugin-react/issues/329
-[#364]: https://github.com/yannickcr/eslint-plugin-react/issues/364
-
-## [3.11.3] - 2015-12-05
-### Fixed
-* Fix crash in [`prop-types`][] when reassigning props ([#345][])
-* Fix [`jsx-handler-names`][] for stateless components ([#346][])
-
-### Changed
-* Update [`jsx-handler-names`][] error messages to be less specific ([#348][] @jakemmarsh)
-
-[3.11.3]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.11.2...v3.11.3
-[#345]: https://github.com/yannickcr/eslint-plugin-react/issues/345
-[#346]: https://github.com/yannickcr/eslint-plugin-react/issues/346
-[#348]: https://github.com/yannickcr/eslint-plugin-react/pull/348
-
-## [3.11.2] - 2015-12-01
-### Fixed
-* Allow numbers in [`jsx-pascal-case`][] ([#339][])
-* Fix [`jsx-handler-names`][] crash with arrays ([#340][])
-
-### Changed
-* Add `allow-in-func` option to [`no-did-update-set-state`][] documentation
-
-[3.11.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.11.1...v3.11.2
-[#339]: https://github.com/yannickcr/eslint-plugin-react/issues/339
-[#340]: https://github.com/yannickcr/eslint-plugin-react/issues/340
-
-## [3.11.1] - 2015-11-29
-### Fixed
-* Fix SVG attributes support for [`no-unknown-property`][] ([#338][])
-
-[3.11.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.11.0...v3.11.1
-[#338]: https://github.com/yannickcr/eslint-plugin-react/issues/338
-
-## [3.11.0] - 2015-11-29
-### Added
-* Add [`jsx-handler-names`][] rule ([#315][] @jakemmarsh)
-* Add SVG attributes support to [`no-unknown-property`][] ([#318][])
-* Add shorthandFirst option to [`jsx-sort-props`][] ([#336][] @lucasmotta)
-
-### Fixed
-* Fix destructured props detection in stateless components ([#326][])
-* Fix props validation for nested stateless components ([#331][])
-* Fix [`require-extension`][] to ignore extension if it's part of the package name ([#319][])
-
-### Changed
-* Allow consecutive uppercase letters in [`jsx-pascal-case`][] ([#328][] @lencioni)
-* Update dependencies
-
-[3.11.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.10.0...v3.11.0
-[#315]: https://github.com/yannickcr/eslint-plugin-react/pull/315
-[#318]: https://github.com/yannickcr/eslint-plugin-react/issues/318
-[#336]: https://github.com/yannickcr/eslint-plugin-react/pull/336
-[#326]: https://github.com/yannickcr/eslint-plugin-react/issues/326
-[#331]: https://github.com/yannickcr/eslint-plugin-react/issues/331
-[#319]: https://github.com/yannickcr/eslint-plugin-react/issues/319
-[#328]: https://github.com/yannickcr/eslint-plugin-react/issues/328
-
-## [3.10.0] - 2015-11-21
-### Added
-* Add [`jsx-pascal-case`][] rule ([#306][] @jakemmarsh)
-
-### Fixed
-* Fix crash on incomplete class property declaration ([#317][] @dapetcu21)
-* Fix crash with ESLint 1.10.0 ([#323][] @lukekarrys)
-
-[3.10.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.9.0...v3.10.0
-[#306]: https://github.com/yannickcr/eslint-plugin-react/pull/306
-[#317]: https://github.com/yannickcr/eslint-plugin-react/issues/317
-[#323]: https://github.com/yannickcr/eslint-plugin-react/issues/323
-
-## [3.9.0] - 2015-11-17
-### Added
-* Add [`jsx-key`][] rule ([#293][] @benmosher)
-* Add `allow-in-func` option to [`no-did-update-set-state`][] ([#300][])
-* Add option to only enforce [`jsx-closing-bracket-location`][] rule to one type of tag (nonEmpty or selfClosing) ([#307][])
-
-### Fixed
-* Fix crash when destructuring with only the rest spread ([#269][])
-* Fix variables detection when searching for related components ([#303][])
-* Fix [`no-unknown-property`][] to not check custom elements ([#308][] @zertosh)
-
-### Changed
-* Improve [`jsx-closing-bracket-location`][] error message ([#301][] @alopatin)
-* Update dependencies
-
-[3.9.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.8.0...v3.9.0
-[#293]: https://github.com/yannickcr/eslint-plugin-react/pull/293
-[#300]: https://github.com/yannickcr/eslint-plugin-react/issues/300
-[#307]: https://github.com/yannickcr/eslint-plugin-react/issues/307
-[#269]: https://github.com/yannickcr/eslint-plugin-react/issues/269
-[#303]: https://github.com/yannickcr/eslint-plugin-react/issues/303
-[#308]: https://github.com/yannickcr/eslint-plugin-react/pull/308
-[#301]: https://github.com/yannickcr/eslint-plugin-react/pull/301
-
-## [3.8.0] - 2015-11-07
-### Added
-* Add ignoreStateless option to [`no-multi-comp`][] ([#290][])
-
-### Fixed
-* Fix classes with properties to always be marked as components ([#291][])
-* Fix ES5 class detection when using `createClass` by itself ([#297][])
-* Fix direct props detection ([#298][])
-* Ignore functions containing the keyword `this` during component detection
-
-[3.8.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.7.1...v3.8.0
-[#290]: https://github.com/yannickcr/eslint-plugin-react/issues/290
-[#291]: https://github.com/yannickcr/eslint-plugin-react/issues/291
-[#297]: https://github.com/yannickcr/eslint-plugin-react/issues/297
-[#298]: https://github.com/yannickcr/eslint-plugin-react/issues/298
-
-## [3.7.1] - 2015-11-05
-### Fixed
-* Fix [`sort-comp`][] crash on stateless components ([#285][])
-* Fix crash in ES5 components detection ([#286][])
-* Fix ES5 components detection from nested functions ([#287][])
-
-[3.7.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.7.0...v3.7.1
-[#285]: https://github.com/yannickcr/eslint-plugin-react/issues/285
-[#286]: https://github.com/yannickcr/eslint-plugin-react/issues/286
-[#287]: https://github.com/yannickcr/eslint-plugin-react/issues/287
-
-## [3.7.0] - 2015-11-05
-### Added
-* Add [`jsx-no-bind`][] rule ([#184][] @Daniel15)
-* Add line-aligned option to [`jsx-closing-bracket-location`][] ([#243][] @alopatin)
-
-### Fixed
-* Fix a lot of issues about components detection, mostly related to stateless components ([#264][], [#267][], [#268][], [#276][], [#277][], [#280][])
-
-### Changed
-* Update dependencies
-
-[3.7.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.6.3...v3.7.0
-[#184]: https://github.com/yannickcr/eslint-plugin-react/issues/184
-[#243]: https://github.com/yannickcr/eslint-plugin-react/issues/243
-[#264]: https://github.com/yannickcr/eslint-plugin-react/issues/264
-[#267]: https://github.com/yannickcr/eslint-plugin-react/issues/267
-[#268]: https://github.com/yannickcr/eslint-plugin-react/issues/268
-[#276]: https://github.com/yannickcr/eslint-plugin-react/issues/276
-[#277]: https://github.com/yannickcr/eslint-plugin-react/issues/277
-[#280]: https://github.com/yannickcr/eslint-plugin-react/issues/280
-
-## [3.6.3] - 2015-10-20
-### Fixed
-* Fix [`display-name`][] for stateless components ([#256][])
-* Fix [`prop-types`][] props validation in constructor ([#259][])
-* Fix typo in README ([#261][] @chiedojohn)
-
-[3.6.3]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.6.2...v3.6.3
-[#256]: https://github.com/yannickcr/eslint-plugin-react/issues/256
-[#259]: https://github.com/yannickcr/eslint-plugin-react/issues/259
-[#261]: https://github.com/yannickcr/eslint-plugin-react/pull/261
-
-## [3.6.2] - 2015-10-18
-### Fixed
-* Fix wrong prop-types detection ([#255][])
-
-[3.6.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.6.1...v3.6.2
-[#255]: https://github.com/yannickcr/eslint-plugin-react/issues/255
-
-## [3.6.1] - 2015-10-18
-### Fixed
-* Fix props validation in constructor ([#254][])
-
-[3.6.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.6.0...v3.6.1
-[#254]: https://github.com/yannickcr/eslint-plugin-react/issues/254
-
-## [3.6.0] - 2015-10-18
-### Added
-* Add support for stateless function components to [`display-name`][] and [`prop-types`][] ([#237][])
-* Add callbacksLast option to [`jsx-sort-props`][] and [`jsx-sort-prop-types`][] ([#242][] @Daniel15)
-* Add [`prefer-es6-class`][] rule ([#247][] @hamiltondanielb)
-
-### Fixed
-* Fix [`forbid-prop-types`][] crash with destructured PropTypes ([#230][] @epmatsw)
-* Fix [`forbid-prop-types`][] to do not modify AST directly ([#249][] @rhysd)
-* Fix [`prop-types`][] crash with empty destructuring ([#251][])
-* Fix [`prop-types`][] to not validate computed keys in destructuring ([#236][])
-
-### Changed
-* Update dependencies
-* Improve components detection ([#233][])
-* Documentation improvements ([#248][] @dguo)
-
-[3.6.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.5.1...v3.6.0
-[#237]: https://github.com/yannickcr/eslint-plugin-react/issues/237
-[#242]: https://github.com/yannickcr/eslint-plugin-react/pull/242
-[#247]: https://github.com/yannickcr/eslint-plugin-react/issues/247
-[#230]: https://github.com/yannickcr/eslint-plugin-react/issues/230
-[#249]: https://github.com/yannickcr/eslint-plugin-react/issues/249
-[#251]: https://github.com/yannickcr/eslint-plugin-react/issues/251
-[#236]: https://github.com/yannickcr/eslint-plugin-react/issues/236
-[#233]: https://github.com/yannickcr/eslint-plugin-react/issues/233
-[#248]: https://github.com/yannickcr/eslint-plugin-react/pull/248
-
-## [3.5.1] - 2015-10-01
-### Fixed
-* Fix [`no-direct-mutation-state`][] to report only in React components ([#229][])
-* Fix [`forbid-prop-types`][] for arrayOf and instanceOf ([#230][])
-
-### Changed
-* Documentation improvements ([#232][] @edge)
-
-[3.5.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.5.0...v3.5.1
-[#229]: https://github.com/yannickcr/eslint-plugin-react/issues/229
-[#230]: https://github.com/yannickcr/eslint-plugin-react/issues/230
-[#232]: https://github.com/yannickcr/eslint-plugin-react/pull/232
-
-## [3.5.0] - 2015-09-28
-### Added
-* Add [`no-direct-mutation-state`][] rule ([#133][], [#201][] @petersendidit)
-* Add [`forbid-prop-types`][] rule ([#215][] @pwmckenna)
-
-### Fixed
-* Fix no-did-mount/update-set-state rules, these rules were not working on ES6 classes
-
-### Changed
-* Update dependencies
-* Documentation improvements ([#222][] @Andersos)
-
-[3.5.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.4.2...v3.5.0
-[#133]: https://github.com/yannickcr/eslint-plugin-react/issues/133
-[#201]: https://github.com/yannickcr/eslint-plugin-react/issues/201
-[#215]: https://github.com/yannickcr/eslint-plugin-react/issues/215
-[#222]: https://github.com/yannickcr/eslint-plugin-react/pull/222
-
-## [3.4.2] - 2015-09-18
-### Fixed
-* Only display the `jsx-quotes` deprecation warning with the default formatter ([#221][])
-
-[3.4.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.4.1...v3.4.2
-[#221]: https://github.com/yannickcr/eslint-plugin-react/issues/221
-
-## [3.4.1] - 2015-09-17
-### Fixed
-* Fix `jsx-quotes` rule deprecation message ([#220][])
-
-[3.4.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.4.0...v3.4.1
-[#220]: https://github.com/yannickcr/eslint-plugin-react/issues/220
-
-## [3.4.0] - 2015-09-16
-### Added
-* Add namespaced JSX support to [`jsx-no-undef`][] ([#219][] @zertosh)
-* Add option to [`jsx-closing-bracket-location`][] to configure different styles for self-closing and non-empty tags ([#208][] @evocateur)
-
-### Deprecated
-* Deprecate `jsx-quotes` rule, will now trigger a warning if used ([#217][])
-
-[3.4.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.3.2...v3.4.0
-[#219]: https://github.com/yannickcr/eslint-plugin-react/pull/219
-[#208]: https://github.com/yannickcr/eslint-plugin-react/pull/208
-[#217]: https://github.com/yannickcr/eslint-plugin-react/issues/217
-
-## [3.3.2] - 2015-09-10
-### Changed
-* Add `state` in lifecycle methods for [`sort-comp`][] rule ([#197][] @mathieudutour)
-* Treat component with render which returns `createElement` as valid ([#206][] @epmatsw)
-
-### Fixed
-* Fix allowed methods on arrayOf in [`prop-types`][] ([#146][])
-* Fix default configuration for [`jsx-boolean-value`][] ([#210][])
-
-[3.3.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.3.1...v3.3.2
-[#146]: https://github.com/yannickcr/eslint-plugin-react/issues/146
-[#197]: https://github.com/yannickcr/eslint-plugin-react/pull/197
-[#206]: https://github.com/yannickcr/eslint-plugin-react/pull/206
-[#210]: https://github.com/yannickcr/eslint-plugin-react/issues/210
-
-## [3.3.1] - 2015-09-01
-### Changed
-* Update dependencies
-* Update changelog to follow the Keep a CHANGELOG standards
-* Documentation improvements ([#198][] @lencioni)
-
-### Fixed
-* Fix [`jsx-closing-bracket-location`][] for multiline props ([#199][])
-
-[3.3.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.3.0...v3.3.1
-[#198]: https://github.com/yannickcr/eslint-plugin-react/pull/198
-[#199]: https://github.com/yannickcr/eslint-plugin-react/issues/199
-
-## [3.3.0] - 2015-08-26
-### Added
-* Add [`jsx-indent-props`][] rule ([#15][], [#181][])
-* Add `no-set-state rule` ([#197][] @markdalgleish)
-* Add [`jsx-closing-bracket-location`][] rule ([#14][], [#64][])
-
-### Changed
-* Update dependencies
-
-### Fixed
-* Fix crash on propTypes declarations with an empty body ([#193][] @mattyod)
-
-[3.3.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.2.3...v3.3.0
-[#15]: https://github.com/yannickcr/eslint-plugin-react/issues/15
-[#181]: https://github.com/yannickcr/eslint-plugin-react/issues/181
-[#197]: https://github.com/yannickcr/eslint-plugin-react/pull/197
-[#14]: https://github.com/yannickcr/eslint-plugin-react/issues/14
-[#64]: https://github.com/yannickcr/eslint-plugin-react/issues/64
-[#193]: https://github.com/yannickcr/eslint-plugin-react/pull/193
-
-## [3.2.3] - 2015-08-16
-### Changed
-* Update dependencies
-
-### Fixed
-* Fix object rest/spread handling ([#187][] @xjamundx, [#189][] @Morantron)
-
-[3.2.3]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.2.2...v3.2.3
-[#187]: https://github.com/yannickcr/eslint-plugin-react/pull/187
-[#189]: https://github.com/yannickcr/eslint-plugin-react/pull/189
-
-## [3.2.2] - 2015-08-11
-### Changed
-* Remove peerDependencies ([#178][])
-
-[3.2.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.2.1...v3.2.2
-[#178]: https://github.com/yannickcr/eslint-plugin-react/issues/178
-
-## [3.2.1] - 2015-08-08
-### Fixed
-* Fix crash when propTypes don't have any parent ([#182][])
-* Fix jsx-no-literals reporting errors outside JSX ([#183][] @CalebMorris)
-
-[3.2.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.2.0...v3.2.1
-[#182]: https://github.com/yannickcr/eslint-plugin-react/issues/182
-[#183]: https://github.com/yannickcr/eslint-plugin-react/pull/183
-
-## [3.2.0] - 2015-08-04
-### Added
-* Add [`jsx-max-props-per-line`][] rule ([#13][])
-* Add [`jsx-no-literals`][] rule ([#176][] @CalebMorris)
-
-### Changed
-* Update dependencies
-
-### Fixed
-* Fix object access in [`jsx-no-undef`][] ([#172][])
-
-[3.2.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.1.0...v3.2.0
-[#13]: https://github.com/yannickcr/eslint-plugin-react/issues/13
-[#176]: https://github.com/yannickcr/eslint-plugin-react/pull/176
-[#172]: https://github.com/yannickcr/eslint-plugin-react/issues/172
-
-## [3.1.0] - 2015-07-28
-### Added
-* Add event handlers to [`no-unknown-property`][] ([#164][] @mkenyon)
-* Add customValidators option to [`prop-types`][] ([#145][] @CalebMorris)
-
-### Changed
-* Update dependencies
-* Documentation improvements ([#167][] @ngbrown)
-
-### Fixed
-* Fix comment handling in [`jsx-curly-spacing`][] ([#165][])
-
-[3.1.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v3.0.0...v3.1.0
-[#164]: https://github.com/yannickcr/eslint-plugin-react/pull/164
-[#145]: https://github.com/yannickcr/eslint-plugin-react/issues/145
-[#165]: https://github.com/yannickcr/eslint-plugin-react/issues/165
-[#167]: https://github.com/yannickcr/eslint-plugin-react/pull/167
-
-## [3.0.0] - 2015-07-21
-### Added
-* Add jsx-no-duplicate-props rule ([#161][] @hummlas)
-* Add allowMultiline option to the [`jsx-curly-spacing`][] rule ([#156][] @mathieumg)
-
-### Breaking
-* In [`jsx-curly-spacing`][] braces spanning multiple lines are now allowed with `never` option ([#156][] @mathieumg)
-
-### Fixed
-* Fix multiple var and destructuring handling in [`prop-types`][] ([#159][])
-* Fix crash when retrieving propType name ([#163][])
-
-[3.0.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.7.1...v3.0.0
-[#161]: https://github.com/yannickcr/eslint-plugin-react/pull/161
-[#156]: https://github.com/yannickcr/eslint-plugin-react/pull/156
-[#159]: https://github.com/yannickcr/eslint-plugin-react/issues/159
-[#163]: https://github.com/yannickcr/eslint-plugin-react/issues/163
-
-## [2.7.1] - 2015-07-16
-### Changed
-* Update peerDependencies requirements ([#154][])
-* Update codebase for ESLint v1.0.0
-* Change oneOfType to actually keep the child types ([#148][] @CalebMorris)
-* Documentation improvements ([#147][] @lencioni)
-
-[2.7.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.7.0...v2.7.1
-[#154]: https://github.com/yannickcr/eslint-plugin-react/issues/154
-[#148]: https://github.com/yannickcr/eslint-plugin-react/issues/148
-[#147]: https://github.com/yannickcr/eslint-plugin-react/pull/147
-
-## [2.7.0] - 2015-07-11
-### Added
-* Add [`no-danger`][] rule ([#138][] @scothis)
-* Add [`jsx-curly-spacing`][] rule ([#142][])
-
-### Fixed
-* Fix properties limitations on propTypes ([#139][])
-* Fix component detection ([#144][])
-
-[2.7.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.6.4...v2.7.0
-[#138]: https://github.com/yannickcr/eslint-plugin-react/pull/138
-[#142]: https://github.com/yannickcr/eslint-plugin-react/issues/142
-[#139]: https://github.com/yannickcr/eslint-plugin-react/issues/139
-[#144]: https://github.com/yannickcr/eslint-plugin-react/issues/144
-
-## [2.6.4] - 2015-07-02
-### Fixed
-* Fix simple destructuring handling ([#137][])
-
-[2.6.4]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.6.3...v2.6.4
-[#137]: https://github.com/yannickcr/eslint-plugin-react/issues/137
-
-## [2.6.3] - 2015-06-30
-### Fixed
-* Fix ignore option for [`prop-types`][] rule ([#135][])
-* Fix nested props destructuring ([#136][])
-
-[2.6.3]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.6.2...v2.6.3
-[#135]: https://github.com/yannickcr/eslint-plugin-react/issues/135
-[#136]: https://github.com/yannickcr/eslint-plugin-react/issues/136
-
-## [2.6.2] - 2015-06-28
-### Fixed
-* Fix props validation when using a prop as an object key ([#132][])
-
-[2.6.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.6.1...v2.6.2
-[#132]: https://github.com/yannickcr/eslint-plugin-react/issues/132
-
-## [2.6.1] - 2015-06-28
-### Fixed
-* Fix crash in [`prop-types`][] when encountering an empty variable declaration ([#130][])
-
-[2.6.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.6.0...v2.6.1
-[#130]: https://github.com/yannickcr/eslint-plugin-react/issues/130
-
-## [2.6.0] - 2015-06-28
-### Added
-* Add support for nested propTypes ([#62][] [#105][] @Cellule)
-* Add [`require-extension`][] rule ([#117][] @scothis)
-* Add support for computed string format in [`prop-types`][] ([#127][] @Cellule)
-* Add ES6 methods to [`sort-comp`][] default configuration ([#97][] [#122][])
-* Add support for props destructuring directly on the this keyword
-* Add `acceptTranspilerName` option to [`display-name`][] rule ([#75][])
-* Add schema to validate rules options
-
-### Changed
-* Update dependencies
-
-### Fixed
-* Fix test command for Windows ([#114][] @Cellule)
-* Fix detection of missing displayName and propTypes when `ecmaFeatures.jsx` is false ([#119][] @rpl)
-* Fix propTypes destructuring with properties as string ([#118][] @Cellule)
-* Fix [`jsx-sort-prop-types`][] support for keys as string ([#123][] @Cellule)
-* Fix crash if a ClassProperty has only one token ([#125][])
-* Fix invalid class property handling in [`jsx-sort-prop-types`][] ([#129][])
-
-[2.6.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.5.2...v2.6.0
-[#62]: https://github.com/yannickcr/eslint-plugin-react/issues/62
-[#105]: https://github.com/yannickcr/eslint-plugin-react/issues/105
-[#114]: https://github.com/yannickcr/eslint-plugin-react/pull/114
-[#117]: https://github.com/yannickcr/eslint-plugin-react/pull/117
-[#119]: https://github.com/yannickcr/eslint-plugin-react/pull/119
-[#118]: https://github.com/yannickcr/eslint-plugin-react/issues/118
-[#123]: https://github.com/yannickcr/eslint-plugin-react/pull/123
-[#125]: https://github.com/yannickcr/eslint-plugin-react/issues/125
-[#127]: https://github.com/yannickcr/eslint-plugin-react/pull/127
-[#97]: https://github.com/yannickcr/eslint-plugin-react/issues/97
-[#122]: https://github.com/yannickcr/eslint-plugin-react/issues/122
-[#129]: https://github.com/yannickcr/eslint-plugin-react/issues/129
-[#75]: https://github.com/yannickcr/eslint-plugin-react/issues/75
-
-## [2.5.2] - 2015-06-14
-### Fixed
-* Fix regression in [`jsx-uses-vars`][] with `babel-eslint` ([#110][])
-
-[2.5.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.5.1...v2.5.2
-[#110]: https://github.com/yannickcr/eslint-plugin-react/issues/110
-
-## [2.5.1] - 2015-06-14
-### Changed
-* Update dependencies
-* Documentation improvements ([#99][] @morenoh149)
-
-### Fixed
-* Fix [`prop-types`][] crash when propTypes definition is invalid ([#95][])
-* Fix [`jsx-uses-vars`][] for ES6 classes ([#96][])
-* Fix hasOwnProperty that is taken for a prop ([#102][])
-
-[2.5.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.5.0...v2.5.1
-[#95]: https://github.com/yannickcr/eslint-plugin-react/issues/95
-[#96]: https://github.com/yannickcr/eslint-plugin-react/issues/96
-[#102]: https://github.com/yannickcr/eslint-plugin-react/issues/102
-[#99]: https://github.com/yannickcr/eslint-plugin-react/pull/99
-
-## [2.5.0] - 2015-06-04
-### Added
-* Add option to make [`wrap-multilines`][] more granular ([#94][] @PiPeep)
-
-### Changed
-* Update dependencies
-* Documentation improvements ([#92][] [#93][] @lencioni)
-
-[2.5.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.4.0...v2.5.0
-[#94]: https://github.com/yannickcr/eslint-plugin-react/pull/94
-[#92]: https://github.com/yannickcr/eslint-plugin-react/pull/92
-[#93]: https://github.com/yannickcr/eslint-plugin-react/pull/93
-
-## [2.4.0] - 2015-05-30
-### Added
-* Add pragma option to [`jsx-uses-react`][] ([#82][] @dominicbarnes)
-* Add context props to [`sort-comp`][] ([#89][] @zertosh)
-
-### Changed
-* Update dependencies
-* Documentation improvement ([#91][] @matthewwithanm)
-
-### Fixed
-* Fix itemID in [`no-unknown-property`][] rule ([#85][] @cody)
-* Fix license field in package.json ([#90][] @zertosh)
-* Fix usage of contructor in [`sort-comp`][] options ([#88][])
-
-[2.4.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.3.0...v2.4.0
-[#82]: https://github.com/yannickcr/eslint-plugin-react/pull/82
-[#89]: https://github.com/yannickcr/eslint-plugin-react/pull/89
-[#85]: https://github.com/yannickcr/eslint-plugin-react/pull/85
-[#90]: https://github.com/yannickcr/eslint-plugin-react/pull/90
-[#88]: https://github.com/yannickcr/eslint-plugin-react/issues/88
-[#91]: https://github.com/yannickcr/eslint-plugin-react/pull/91
-
-## [2.3.0] - 2015-05-14
-### Added
-* Add [`sort-comp`][] rule ([#39][])
-* Add `allow-in-func` option to [`no-did-mount-set-state`][] ([#56][])
-
-### Changed
-* Update dependencies
-* Improve errors locations for `prop-types`
-
-### Fixed
-* Fix quoted propTypes in ES6 ([#77][])
-
-[2.3.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.2.0...v2.3.0
-[#39]: https://github.com/yannickcr/eslint-plugin-react/issues/39
-[#77]: https://github.com/yannickcr/eslint-plugin-react/issues/77
-[#56]: https://github.com/yannickcr/eslint-plugin-react/issues/56
-
-## [2.2.0] - 2015-04-22
-### Added
-* Add [`jsx-sort-prop-types`][] rule ([#38][] @AlexKVal)
-
-### Changed
-* Documentation improvements ([#71][] @AlexKVal)
-
-### Fixed
-* Fix variables marked as used when a prop has the same name ([#69][] @burnnat)
-
-[2.2.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.1.1...v2.2.0
-[#38]: https://github.com/yannickcr/eslint-plugin-react/issues/38
-[#69]: https://github.com/yannickcr/eslint-plugin-react/pull/69
-[#71]: https://github.com/yannickcr/eslint-plugin-react/pull/71
-
-## [2.1.1] - 2015-04-17
-### Added
-* Add support for classes static properties ([#43][])
-* Add tests for the `babel-eslint` parser
-* Add ESLint as peerDependency ([#63][] @AlexKVal)
-
-### Changed
-* Documentation improvements ([#55][] @AlexKVal, [#60][] @chriscalo)
-
-[2.1.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.1.0...v2.1.1
-[#43]: https://github.com/yannickcr/eslint-plugin-react/issues/43
-[#63]: https://github.com/yannickcr/eslint-plugin-react/pull/63
-[#55]: https://github.com/yannickcr/eslint-plugin-react/pull/55
-[#60]: https://github.com/yannickcr/eslint-plugin-react/pull/60
-
-## [2.1.0] - 2015-04-06
-### Added
-* Add [`jsx-boolean-value`][] rule ([#11][])
-* Add support for static methods in [`display-name`][] and [`prop-types`][] ([#48][])
-
-### Changed
-* Update [`jsx-sort-props`][] to reset the alphabetical verification on spread ([#47][] @zertosh)
-* Update [`jsx-uses-vars`][] to be enabled by default ([#49][] @banderson)
-
-### Fixed
-* Fix describing comment for hasSpreadOperator() method ([#53][] @AlexKVal)
-
-[2.1.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.0.2...v2.1.0
-[#47]: https://github.com/yannickcr/eslint-plugin-react/pull/47
-[#49]: https://github.com/yannickcr/eslint-plugin-react/pull/49
-[#11]: https://github.com/yannickcr/eslint-plugin-react/issues/11
-[#48]: https://github.com/yannickcr/eslint-plugin-react/issues/48
-[#53]: https://github.com/yannickcr/eslint-plugin-react/pull/53
-
-## [2.0.2] - 2015-03-31
-### Fixed
-* Fix ignore rest spread when destructuring props ([#46][])
-* Fix component detection in [`prop-types`][] and [`display-name`][] ([#45][])
-* Fix spread handling in [`jsx-sort-props`][] ([#42][] @zertosh)
-
-[2.0.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.0.1...v2.0.2
-[#46]: https://github.com/yannickcr/eslint-plugin-react/issues/46
-[#45]: https://github.com/yannickcr/eslint-plugin-react/issues/45
-[#42]: https://github.com/yannickcr/eslint-plugin-react/pull/42
-
-## [2.0.1] - 2015-03-30
-### Fixed
-* Fix props detection when used in an object ([#41][])
-
-[2.0.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v2.0.0...v2.0.1
-[#41]: https://github.com/yannickcr/eslint-plugin-react/issues/41
-
-## [2.0.0] - 2015-03-29
-### Added
-* Add [`jsx-sort-props`][] rule ([#16][])
-* Add [`no-unknown-property`][] rule ([#28][])
-* Add ignore option to [`prop-types`][] rule
-
-### Changed
-* Update dependencies
-
-### Breaking
-* In [`prop-types`][] the children prop is no longer ignored
-
-### Fixed
-* Fix components are now detected when using ES6 classes ([#24][])
-* Fix [`prop-types`][] now return the right line/column ([#33][])
-* Fix props are now detected when destructuring ([#27][])
-* Fix only check for computed property names in [`prop-types`][] ([#36][] @burnnat)
-
-[2.0.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v1.6.1...v2.0.0
-[#16]: https://github.com/yannickcr/eslint-plugin-react/issues/16
-[#28]: https://github.com/yannickcr/eslint-plugin-react/issues/28
-[#24]: https://github.com/yannickcr/eslint-plugin-react/issues/24
-[#33]: https://github.com/yannickcr/eslint-plugin-react/issues/33
-[#27]: https://github.com/yannickcr/eslint-plugin-react/issues/27
-[#36]: https://github.com/yannickcr/eslint-plugin-react/pull/36
-
-## [1.6.1] - 2015-03-25
-### Changed
-* Update `jsx-quotes` documentation
-
-### Fixed
-* Fix [`jsx-no-undef`][] with `babel-eslint` ([#30][])
-* Fix `jsx-quotes` on Literal childs ([#29][])
-
-[1.6.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v1.6.0...v1.6.1
-[#30]: https://github.com/yannickcr/eslint-plugin-react/issues/30
-[#29]: https://github.com/yannickcr/eslint-plugin-react/issues/29
-
-## [1.6.0] - 2015-03-22
-### Added
-* Add [`jsx-no-undef`][] rule
-* Add `jsx-quotes` rule ([#12][])
-* Add `@jsx` pragma support ([#23][])
-
-### Changed
-* Allow `this.getState` references (not calls) in lifecycle methods ([#22][] @benmosher)
-* Update dependencies
-
-### Fixed
-* Fix [`react-in-jsx-scope`][] in Node.js env
-* Fix usage of propTypes with an external object ([#9][])
-
-[1.6.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v1.5.0...v1.6.0
-[#12]: https://github.com/yannickcr/eslint-plugin-react/issues/12
-[#23]: https://github.com/yannickcr/eslint-plugin-react/issues/23
-[#9]: https://github.com/yannickcr/eslint-plugin-react/issues/9
-[#22]: https://github.com/yannickcr/eslint-plugin-react/pull/22
-
-## [1.5.0] - 2015-03-14
-### Added
-* Add [`jsx-uses-vars`][] rule
-
-### Fixed
-* Fix [`jsx-uses-react`][] for ESLint 0.17.0
-
-[1.5.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v1.4.1...v1.5.0
-
-## [1.4.1] - 2015-03-03
-### Fixed
-* Fix `this.props.children` marked as missing in props validation ([#7][])
-* Fix usage of `this.props` without property ([#8][])
-
-[1.4.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v1.4.0...v1.4.1
-[#7]: https://github.com/yannickcr/eslint-plugin-react/issues/7
-[#8]: https://github.com/yannickcr/eslint-plugin-react/issues/8
-
-## [1.4.0] - 2015-02-24
-### Added
-* Add [`react-in-jsx-scope`][] rule ([#5][] @glenjamin)
-* Add [`jsx-uses-react`][] rule ([#6][] @glenjamin)
-
-### Changed
-* Update [`prop-types`][] to check props usage insead of propTypes presence ([#4][])
-
-[1.4.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v1.3.0...v1.4.0
-[#4]: https://github.com/yannickcr/eslint-plugin-react/issues/4
-[#5]: https://github.com/yannickcr/eslint-plugin-react/pull/5
-[#6]: https://github.com/yannickcr/eslint-plugin-react/pull/6
-
-## [1.3.0] - 2015-02-24
-### Added
-* Add [`no-did-mount-set-state`][] rule
-* Add [`no-did-update-set-state`][] rule
-
-### Changed
-* Update dependencies
-
-[1.3.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v1.2.2...v1.3.0
-
-## [1.2.2] - 2015-02-09
-### Changed
-* Update dependencies
-
-### Fixed
-* Fix childs detection in [`self-closing-comp`][] ([#3][])
-
-[1.2.2]: https://github.com/yannickcr/eslint-plugin-react/compare/v1.2.1...v1.2.2
-[#3]: https://github.com/yannickcr/eslint-plugin-react/issues/3
-
-## [1.2.1] - 2015-01-29
-### Changed
-* Update Readme
-* Update dependencies
-* Update [`wrap-multilines`][] and [`self-closing-comp`][] rules for ESLint 0.13.0
-
-[1.2.1]: https://github.com/yannickcr/eslint-plugin-react/compare/v1.2.0...v1.2.1
-
-## [1.2.0] - 2014-12-29
-### Added
-* Add [`self-closing-comp`][] rule
-
-### Fixed
-* Fix [`display-name`][] and [`prop-types`][] rules
-
-[1.2.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v1.1.0...v1.2.0
-
-## [1.1.0] - 2014-12-28
-### Added
- * Add [`display-name`][] rule
- * Add [`wrap-multilines`][] rule
- * Add rules documentation
- * Add rules tests
-
-[1.1.0]: https://github.com/yannickcr/eslint-plugin-react/compare/v1.0.0...v1.1.0
-
-## 1.0.0 - 2014-12-16
-### Added
- * First revision
-
-[`display-name`]: docs/rules/display-name.md
-[`forbid-component-props`]: docs/rules/forbid-component-props.md
-[`forbid-elements`]: docs/rules/forbid-elements.md
-[`forbid-foreign-prop-types`]: docs/rules/forbid-foreign-prop-types.md
-[`forbid-prop-types`]: docs/rules/forbid-prop-types.md
-[`no-array-index-key`]: docs/rules/no-array-index-key.md
-[`no-children-prop`]: docs/rules/no-children-prop.md
-[`no-danger`]: docs/rules/no-danger.md
-[`no-danger-with-children`]: docs/rules/no-danger-with-children.md
-[`no-deprecated`]: docs/rules/no-deprecated.md
-[`no-did-mount-set-state`]: docs/rules/no-did-mount-set-state.md
-[`no-did-update-set-state`]: docs/rules/no-did-update-set-state.md
-[`no-direct-mutation-state`]: docs/rules/no-direct-mutation-state.md
-[`no-find-dom-node`]: docs/rules/no-find-dom-node.md
-[`no-is-mounted`]: docs/rules/no-is-mounted.md
-[`no-multi-comp`]: docs/rules/no-multi-comp.md
-[`no-render-return-value`]: docs/rules/no-render-return-value.md
-[`no-set-state`]: docs/rules/no-set-state.md
-[`no-string-refs`]: docs/rules/no-string-refs.md
-[`no-unescaped-entities`]: docs/rules/no-unescaped-entities.md
-[`no-unknown-property`]: docs/rules/no-unknown-property.md
-[`no-unused-prop-types`]: docs/rules/no-unused-prop-types.md
-[`no-will-update-set-state`]: docs/rules/no-will-update-set-state.md
-[`prefer-es6-class`]: docs/rules/prefer-es6-class.md
-[`prefer-stateless-function`]: docs/rules/prefer-stateless-function.md
-[`prop-types`]: docs/rules/prop-types.md
-[`react-in-jsx-scope`]: docs/rules/react-in-jsx-scope.md
-[`require-optimization`]: docs/rules/require-optimization.md
-[`require-render-return`]: docs/rules/require-render-return.md
-[`self-closing-comp`]: docs/rules/self-closing-comp.md
-[`sort-comp`]: docs/rules/sort-comp.md
-[`sort-prop-types`]: docs/rules/sort-prop-types.md
-[`style-prop-object`]: docs/rules/style-prop-object.md
-[`jsx-boolean-value`]: docs/rules/jsx-boolean-value.md
-[`jsx-closing-bracket-location`]: docs/rules/jsx-closing-bracket-location.md
-[`jsx-curly-spacing`]: docs/rules/jsx-curly-spacing.md
-[`jsx-equals-spacing`]: docs/rules/jsx-equals-spacing.md
-[`jsx-filename-extension`]: docs/rules/jsx-filename-extension.md
-[`jsx-first-prop-new-line`]: docs/rules/jsx-first-prop-new-line.md
-[`jsx-handler-names`]: docs/rules/jsx-handler-names.md
-[`jsx-indent`]: docs/rules/jsx-indent.md
-[`jsx-indent-props`]: docs/rules/jsx-indent-props.md
-[`jsx-key`]: docs/rules/jsx-key.md
-[`jsx-max-props-per-line`]: docs/rules/jsx-max-props-per-line.md
-[`jsx-no-bind`]: docs/rules/jsx-no-bind.md
-[`jsx-no-comment-textnodes`]: docs/rules/jsx-no-comment-textnodes.md
-[`jsx-no-duplicate-props`]: docs/rules/jsx-no-duplicate-props.md
-[`jsx-no-literals`]: docs/rules/jsx-no-literals.md
-[`jsx-no-target-blank`]: docs/rules/jsx-no-target-blank.md
-[`jsx-no-undef`]: docs/rules/jsx-no-undef.md
-[`jsx-pascal-case`]: docs/rules/jsx-pascal-case.md
-[`require-default-props`]: docs/rules/require-default-props.md
-[`jsx-sort-props`]: docs/rules/jsx-sort-props.md
-[`jsx-space-before-closing`]: docs/rules/jsx-space-before-closing.md
-[`jsx-tag-spacing`]: docs/rules/jsx-tag-spacing.md
-[`jsx-uses-react`]: docs/rules/jsx-uses-react.md
-[`jsx-uses-vars`]: docs/rules/jsx-uses-vars.md
-[`jsx-wrap-multilines`]: docs/rules/jsx-wrap-multilines.md
-[`void-dom-elements-no-children`]: docs/rules/void-dom-elements-no-children.md
-[`default-props-match-prop-types`]: docs/rules/default-props-match-prop-types.md
-[`no-redundant-should-component-update`]: docs/rules/no-redundant-should-component-update.md
-[`jsx-closing-tag-location`]: docs/rules/jsx-closing-tag-location.md
-[`no-unused-state`]: docs/rules/no-unused-state.md
-[`boolean-prop-naming`]: docs/rules/boolean-prop-naming.md
-[`no-typos`]: docs/rules/no-typos.md
-[`jsx-sort-prop-types`]: docs/rules/sort-prop-types.md
-[`require-extension`]: docs/rules/require-extension.md
-[`no-comment-textnodes`]: docs/rules/jsx-no-comment-textnodes.md
-[`wrap-multilines`]: docs/rules/jsx-wrap-multilines.md
-[`jsx-curly-brace-presence`]: docs/rules/jsx-curly-brace-presence.md
-[`jsx-one-expression-per-line`]: docs/rules/jsx-one-expression-per-line.md
-[`destructuring-assignment`]: docs/rules/destructuring-assignment.md
-[`no-access-state-in-setstate`]: docs/rules/no-access-state-in-setstate.md
-[`button-has-type`]: docs/rules/button-has-type.md
-[`forbid-dom-props`]: docs/rules/forbid-dom-props.md
-[`jsx-child-element-spacing`]: docs/rules/jsx-child-element-spacing.md
-[`no-this-in-sfc`]: docs/rules/no-this-in-sfc.md
-[`jsx-sort-default-props`]: docs/rules/jsx-sort-default-props.md
-[`jsx-max-depth`]: docs/rules/jsx-max-depth.md
-[`jsx-props-no-multi-spaces`]: docs/rules/jsx-props-no-multi-spaces.md
-[`no-unsafe`]: docs/rules/no-unsafe.md
-[`jsx-fragments`]: docs/rules/jsx-fragments.md
-[`jsx-props-no-spreading`]: docs/rules/jsx-props-no-spreading.md
-[`prefer-read-only-props`]: docs/rules/prefer-read-only-props.md
-[`state-in-constructor`]: docs/rules/state-in-constructor.md
-[`jsx-props-no-spreading`]: docs/rules/jsx-props-no-spreading.md
-[`static-property-placement`]: docs/rules/static-property-placement.md
-[`jsx-curly-newline`]: docs/rules/jsx-curly-newline.md
-[`jsx-no-useless-fragment`]: docs/rules/jsx-no-useless-fragment.md
-[`jsx-no-script-url`]: docs/rules/jsx-no-script-url.md
-[`no-adjacent-inline-elements`]: docs/rules/no-adjacent-inline-elements.md
-[`function-component-definition`]: docs/rules/function-component-definition.md
diff --git a/node_modules/eslint-plugin-react/LICENSE b/node_modules/eslint-plugin-react/LICENSE
deleted file mode 100644
index 6b5a43e..0000000
--- a/node_modules/eslint-plugin-react/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Yannick Croissant
-
-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/node_modules/eslint-plugin-react/README.md b/node_modules/eslint-plugin-react/README.md
deleted file mode 100644
index 011504b..0000000
--- a/node_modules/eslint-plugin-react/README.md
+++ /dev/null
@@ -1,280 +0,0 @@
-ESLint-plugin-React
-===================
-
-[![Maintenance Status][status-image]][status-url] [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][deps-image]][deps-url] [![Coverage Status][coverage-image]][coverage-url] [![Code Climate][climate-image]][climate-url] [![Tidelift][tidelift-image]][tidelift-url]
-
-React specific linting rules for ESLint
-
-# Installation
-
-Install [ESLint](https://www.github.com/eslint/eslint) either locally or globally. (Note that locally, per project, is strongly preferred)
-
-```sh
-$ npm install eslint --save-dev
-```
-
-If you installed `ESLint` globally, you have to install React plugin globally too. Otherwise, install it locally.
-
-```sh
-$ npm install eslint-plugin-react --save-dev
-```
-
-# Configuration
-
-Use [our preset](#recommended) to get reasonable defaults:
-
-```json
-  "extends": [
-    "eslint:recommended",
-    "plugin:react/recommended"
-  ]
-```
-
-You should also specify settings that will be shared across all the plugin rules. ([More about eslint shared settings](https://eslint.org/docs/user-guide/configuring#adding-shared-settings))
-
-```json5
-{
-  "settings": {
-    "react": {
-      "createClass": "createReactClass", // Regex for Component Factory to use,
-                                         // default to "createReactClass"
-      "pragma": "React",  // Pragma to use, default to "React"
-      "version": "detect", // React version. "detect" automatically picks the version you have installed.
-                           // You can also use `16.0`, `16.3`, etc, if you want to override the detected value.
-                           // default to latest and warns if missing
-                           // It will default to "detect" in the future
-      "flowVersion": "0.53" // Flow version
-    },
-    "propWrapperFunctions": [
-        // The names of any function used to wrap propTypes, e.g. `forbidExtraProps`. If this isn't set, any propTypes wrapped in a function will be skipped.
-        "forbidExtraProps",
-        {"property": "freeze", "object": "Object"},
-        {"property": "myFavoriteWrapper"}
-    ],
-    "linkComponents": [
-      // Components used as alternatives to <a> for linking, eg. <Link to={ url } />
-      "Hyperlink",
-      {"name": "Link", "linkAttribute": "to"}
-    ]
-  }
-}
-```
-
-If you do not use a preset you will need to specify individual rules and add extra configuration.
-
-Add "react" to the plugins section.
-
-```json
-{
-  "plugins": [
-    "react"
-  ]
-}
-```
-
-Enable JSX support.
-
-With ESLint 2+
-
-```json
-{
-  "parserOptions": {
-    "ecmaFeatures": {
-      "jsx": true
-    }
-  }
-}
-```
-
-Enable the rules that you would like to use.
-
-```json
-  "rules": {
-    "react/jsx-uses-react": "error",
-    "react/jsx-uses-vars": "error",
-  }
-```
-
-# List of supported rules
-
-<!-- AUTO-GENERATED-CONTENT:START (BASIC_RULES) -->
-* [react/boolean-prop-naming](docs/rules/boolean-prop-naming.md): Enforces consistent naming for boolean props
-* [react/button-has-type](docs/rules/button-has-type.md): Forbid "button" element without an explicit "type" attribute
-* [react/default-props-match-prop-types](docs/rules/default-props-match-prop-types.md): Enforce all defaultProps are defined and not "required" in propTypes.
-* [react/destructuring-assignment](docs/rules/destructuring-assignment.md): Enforce consistent usage of destructuring assignment of props, state, and context
-* [react/display-name](docs/rules/display-name.md): Prevent missing displayName in a React component definition
-* [react/forbid-component-props](docs/rules/forbid-component-props.md): Forbid certain props on components
-* [react/forbid-dom-props](docs/rules/forbid-dom-props.md): Forbid certain props on DOM Nodes
-* [react/forbid-elements](docs/rules/forbid-elements.md): Forbid certain elements
-* [react/forbid-foreign-prop-types](docs/rules/forbid-foreign-prop-types.md): Forbid using another component's propTypes
-* [react/forbid-prop-types](docs/rules/forbid-prop-types.md): Forbid certain propTypes
-* [react/function-component-definition](docs/rules/function-component-definition.md): Standardize the way function component get defined (fixable)
-* [react/no-access-state-in-setstate](docs/rules/no-access-state-in-setstate.md): Reports when this.state is accessed within setState
-* [react/no-adjacent-inline-elements](docs/rules/no-adjacent-inline-elements.md): Prevent adjacent inline elements not separated by whitespace.
-* [react/no-array-index-key](docs/rules/no-array-index-key.md): Prevent usage of Array index in keys
-* [react/no-children-prop](docs/rules/no-children-prop.md): Prevent passing of children as props.
-* [react/no-danger](docs/rules/no-danger.md): Prevent usage of dangerous JSX props
-* [react/no-danger-with-children](docs/rules/no-danger-with-children.md): Report when a DOM element is using both children and dangerouslySetInnerHTML
-* [react/no-deprecated](docs/rules/no-deprecated.md): Prevent usage of deprecated methods
-* [react/no-did-mount-set-state](docs/rules/no-did-mount-set-state.md): Prevent usage of setState in componentDidMount
-* [react/no-did-update-set-state](docs/rules/no-did-update-set-state.md): Prevent usage of setState in componentDidUpdate
-* [react/no-direct-mutation-state](docs/rules/no-direct-mutation-state.md): Prevent direct mutation of this.state
-* [react/no-find-dom-node](docs/rules/no-find-dom-node.md): Prevent usage of findDOMNode
-* [react/no-is-mounted](docs/rules/no-is-mounted.md): Prevent usage of isMounted
-* [react/no-multi-comp](docs/rules/no-multi-comp.md): Prevent multiple component definition per file
-* [react/no-redundant-should-component-update](docs/rules/no-redundant-should-component-update.md): Flag shouldComponentUpdate when extending PureComponent
-* [react/no-render-return-value](docs/rules/no-render-return-value.md): Prevent usage of the return value of React.render
-* [react/no-set-state](docs/rules/no-set-state.md): Prevent usage of setState
-* [react/no-string-refs](docs/rules/no-string-refs.md): Prevent string definitions for references and prevent referencing this.refs
-* [react/no-this-in-sfc](docs/rules/no-this-in-sfc.md): Report "this" being used in stateless components
-* [react/no-typos](docs/rules/no-typos.md): Prevent common typos
-* [react/no-unescaped-entities](docs/rules/no-unescaped-entities.md): Detect unescaped HTML entities, which might represent malformed tags
-* [react/no-unknown-property](docs/rules/no-unknown-property.md): Prevent usage of unknown DOM property (fixable)
-* [react/no-unsafe](docs/rules/no-unsafe.md): Prevent usage of unsafe lifecycle methods
-* [react/no-unused-prop-types](docs/rules/no-unused-prop-types.md): Prevent definitions of unused prop types
-* [react/no-unused-state](docs/rules/no-unused-state.md): Prevent definition of unused state fields
-* [react/no-will-update-set-state](docs/rules/no-will-update-set-state.md): Prevent usage of setState in componentWillUpdate
-* [react/prefer-es6-class](docs/rules/prefer-es6-class.md): Enforce ES5 or ES6 class for React Components
-* [react/prefer-read-only-props](docs/rules/prefer-read-only-props.md): Require read-only props. (fixable)
-* [react/prefer-stateless-function](docs/rules/prefer-stateless-function.md): Enforce stateless components to be written as a pure function
-* [react/prop-types](docs/rules/prop-types.md): Prevent missing props validation in a React component definition
-* [react/react-in-jsx-scope](docs/rules/react-in-jsx-scope.md): Prevent missing React when using JSX
-* [react/require-default-props](docs/rules/require-default-props.md): Enforce a defaultProps definition for every prop that is not a required prop.
-* [react/require-optimization](docs/rules/require-optimization.md): Enforce React components to have a shouldComponentUpdate method
-* [react/require-render-return](docs/rules/require-render-return.md): Enforce ES5 or ES6 class for returning value in render function
-* [react/self-closing-comp](docs/rules/self-closing-comp.md): Prevent extra closing tags for components without children (fixable)
-* [react/sort-comp](docs/rules/sort-comp.md): Enforce component methods order
-* [react/sort-prop-types](docs/rules/sort-prop-types.md): Enforce propTypes declarations alphabetical sorting
-* [react/state-in-constructor](docs/rules/state-in-constructor.md): State initialization in an ES6 class component should be in a constructor
-* [react/static-property-placement](docs/rules/static-property-placement.md): Defines where React component static properties should be positioned.
-* [react/style-prop-object](docs/rules/style-prop-object.md): Enforce style prop value is an object
-* [react/void-dom-elements-no-children](docs/rules/void-dom-elements-no-children.md): Prevent passing of children to void DOM elements (e.g. `<br />`).
-<!-- AUTO-GENERATED-CONTENT:END -->
-
-## JSX-specific rules
-
-<!-- AUTO-GENERATED-CONTENT:START (JSX_RULES) -->
-* [react/jsx-boolean-value](docs/rules/jsx-boolean-value.md): Enforce boolean attributes notation in JSX (fixable)
-* [react/jsx-child-element-spacing](docs/rules/jsx-child-element-spacing.md): Ensures inline tags are not rendered without spaces between them
-* [react/jsx-closing-bracket-location](docs/rules/jsx-closing-bracket-location.md): Validate closing bracket location in JSX (fixable)
-* [react/jsx-closing-tag-location](docs/rules/jsx-closing-tag-location.md): Validate closing tag location for multiline JSX (fixable)
-* [react/jsx-curly-brace-presence](docs/rules/jsx-curly-brace-presence.md): Disallow unnecessary JSX expressions when literals alone are sufficient or enfore JSX expressions on literals in JSX children or attributes (fixable)
-* [react/jsx-curly-newline](docs/rules/jsx-curly-newline.md): Enforce consistent line breaks inside jsx curly (fixable)
-* [react/jsx-curly-spacing](docs/rules/jsx-curly-spacing.md): Enforce or disallow spaces inside of curly braces in JSX attributes (fixable)
-* [react/jsx-equals-spacing](docs/rules/jsx-equals-spacing.md): Disallow or enforce spaces around equal signs in JSX attributes (fixable)
-* [react/jsx-filename-extension](docs/rules/jsx-filename-extension.md): Restrict file extensions that may contain JSX
-* [react/jsx-first-prop-new-line](docs/rules/jsx-first-prop-new-line.md): Ensure proper position of the first property in JSX (fixable)
-* [react/jsx-fragments](docs/rules/jsx-fragments.md): Enforce shorthand or standard form for React fragments (fixable)
-* [react/jsx-handler-names](docs/rules/jsx-handler-names.md): Enforce event handler naming conventions in JSX
-* [react/jsx-indent](docs/rules/jsx-indent.md): Validate JSX indentation (fixable)
-* [react/jsx-indent-props](docs/rules/jsx-indent-props.md): Validate props indentation in JSX (fixable)
-* [react/jsx-key](docs/rules/jsx-key.md): Report missing `key` props in iterators/collection literals
-* [react/jsx-max-depth](docs/rules/jsx-max-depth.md): Validate JSX maximum depth
-* [react/jsx-max-props-per-line](docs/rules/jsx-max-props-per-line.md): Limit maximum of props on a single line in JSX (fixable)
-* [react/jsx-no-bind](docs/rules/jsx-no-bind.md): Prevents usage of Function.prototype.bind and arrow functions in React component props
-* [react/jsx-no-comment-textnodes](docs/rules/jsx-no-comment-textnodes.md): Comments inside children section of tag should be placed inside braces
-* [react/jsx-no-duplicate-props](docs/rules/jsx-no-duplicate-props.md): Enforce no duplicate props
-* [react/jsx-no-literals](docs/rules/jsx-no-literals.md): Prevent using string literals in React component definition
-* [react/jsx-no-script-url](docs/rules/jsx-no-script-url.md): Forbid `javascript:` URLs
-* [react/jsx-no-target-blank](docs/rules/jsx-no-target-blank.md): Forbid target="_blank" attribute without rel="noopener noreferrer"
-* [react/jsx-no-undef](docs/rules/jsx-no-undef.md): Disallow undeclared variables in JSX
-* [react/jsx-no-useless-fragment](docs/rules/jsx-no-useless-fragment.md): Disallow unnecessary fragments (fixable)
-* [react/jsx-one-expression-per-line](docs/rules/jsx-one-expression-per-line.md): Limit to one expression per line in JSX (fixable)
-* [react/jsx-pascal-case](docs/rules/jsx-pascal-case.md): Enforce PascalCase for user-defined JSX components
-* [react/jsx-props-no-multi-spaces](docs/rules/jsx-props-no-multi-spaces.md): Disallow multiple spaces between inline JSX props (fixable)
-* [react/jsx-props-no-spreading](docs/rules/jsx-props-no-spreading.md): Prevent JSX prop spreading
-* [react/jsx-sort-default-props](docs/rules/jsx-sort-default-props.md): Enforce default props alphabetical sorting
-* [react/jsx-sort-props](docs/rules/jsx-sort-props.md): Enforce props alphabetical sorting (fixable)
-* [react/jsx-space-before-closing](docs/rules/jsx-space-before-closing.md): Validate spacing before closing bracket in JSX (fixable)
-* [react/jsx-tag-spacing](docs/rules/jsx-tag-spacing.md): Validate whitespace in and around the JSX opening and closing brackets (fixable)
-* [react/jsx-uses-react](docs/rules/jsx-uses-react.md): Prevent React to be marked as unused
-* [react/jsx-uses-vars](docs/rules/jsx-uses-vars.md): Prevent variables used in JSX to be marked as unused
-* [react/jsx-wrap-multilines](docs/rules/jsx-wrap-multilines.md): Prevent missing parentheses around multilines JSX (fixable)
-<!-- AUTO-GENERATED-CONTENT:END -->
-
-## Other useful plugins
-
-- JSX accessibility: [eslint-plugin-jsx-a11y](https://github.com/evcohen/eslint-plugin-jsx-a11y)
-- React Native: [eslint-plugin-react-native](https://github.com/Intellicode/eslint-plugin-react-native)
-
-# Shareable configurations
-
-## Recommended
-
-This plugin exports a `recommended` configuration that enforces React good practices.
-
-To enable this configuration use the `extends` property in your `.eslintrc` config file:
-
-```json
-{
-  "extends": ["eslint:recommended", "plugin:react/recommended"]
-}
-```
-
-See [ESLint documentation](http://eslint.org/docs/user-guide/configuring#extending-configuration-files) for more information about extending configuration files.
-
-The rules enabled in this configuration are:
-
-* [react/display-name](docs/rules/display-name.md)
-* [react/jsx-key](docs/rules/jsx-key.md)
-* [react/jsx-no-comment-textnodes](docs/rules/jsx-no-comment-textnodes.md)
-* [react/jsx-no-duplicate-props](docs/rules/jsx-no-duplicate-props.md)
-* [react/jsx-no-target-blank](docs/rules/jsx-no-target-blank.md)
-* [react/jsx-no-undef](docs/rules/jsx-no-undef.md)
-* [react/jsx-uses-react](docs/rules/jsx-uses-react.md)
-* [react/jsx-uses-vars](docs/rules/jsx-uses-vars.md)
-* [react/no-children-prop](docs/rules/no-children-prop.md)
-* [react/no-danger-with-children](docs/rules/no-danger-with-children.md)
-* [react/no-deprecated](docs/rules/no-deprecated.md)
-* [react/no-direct-mutation-state](docs/rules/no-direct-mutation-state.md)
-* [react/no-find-dom-node](docs/rules/no-find-dom-node.md)
-* [react/no-is-mounted](docs/rules/no-is-mounted.md)
-* [react/no-render-return-value](docs/rules/no-render-return-value.md)
-* [react/no-string-refs](docs/rules/no-string-refs.md)
-* [react/no-unescaped-entities](docs/rules/no-unescaped-entities.md)
-* [react/no-unknown-property](docs/rules/no-unknown-property.md)
-* [react/prop-types](docs/rules/prop-types.md)
-* [react/react-in-jsx-scope](docs/rules/react-in-jsx-scope.md)
-* [react/require-render-return](docs/rules/require-render-return.md)
-
-## All
-
-This plugin also exports an `all` configuration that includes every available rule.
-This pairs well with the `eslint:all` rule.
-
-```json
-{
-  "plugins": [
-    "react"
-  ],
-  "extends": ["eslint:all", "plugin:react/all"]
-}
-```
-
-**Note**: These configurations will import `eslint-plugin-react` and enable JSX in [parser options](http://eslint.org/docs/user-guide/configuring#specifying-parser-options).
-
-# License
-
-ESLint-plugin-React is licensed under the [MIT License](http://www.opensource.org/licenses/mit-license.php).
-
-
-[npm-url]: https://npmjs.org/package/eslint-plugin-react
-[npm-image]: https://img.shields.io/npm/v/eslint-plugin-react.svg
-
-[travis-url]: https://travis-ci.org/yannickcr/eslint-plugin-react
-[travis-image]: https://img.shields.io/travis/yannickcr/eslint-plugin-react/master.svg
-
-[deps-url]: https://david-dm.org/yannickcr/eslint-plugin-react
-[deps-image]: https://img.shields.io/david/dev/yannickcr/eslint-plugin-react.svg
-
-[coverage-url]: https://coveralls.io/r/yannickcr/eslint-plugin-react?branch=master
-[coverage-image]: https://img.shields.io/coveralls/yannickcr/eslint-plugin-react/master.svg
-
-[climate-url]: https://codeclimate.com/github/yannickcr/eslint-plugin-react
-[climate-image]: https://img.shields.io/codeclimate/maintainability/yannickcr/eslint-plugin-react.svg
-
-[status-url]: https://github.com/yannickcr/eslint-plugin-react/pulse
-[status-image]: https://img.shields.io/github/last-commit/yannickcr/eslint-plugin-react.svg
-
-[tidelift-url]: https://tidelift.com/subscription/pkg/npm-eslint-plugin-react?utm_source=npm-eslint-plugin-react&utm_medium=referral&utm_campaign=readme
-[tidelift-image]: https://tidelift.com/badges/github/yannickcr/eslint-plugin-react?style=flat
diff --git a/node_modules/eslint-plugin-react/index.js b/node_modules/eslint-plugin-react/index.js
deleted file mode 100644
index 53b5023..0000000
--- a/node_modules/eslint-plugin-react/index.js
+++ /dev/null
@@ -1,161 +0,0 @@
-'use strict';
-
-const fromEntries = require('object.fromentries');
-const entries = require('object.entries');
-
-/* eslint-disable global-require */
-const allRules = {
-  'boolean-prop-naming': require('./lib/rules/boolean-prop-naming'),
-  'button-has-type': require('./lib/rules/button-has-type'),
-  'default-props-match-prop-types': require('./lib/rules/default-props-match-prop-types'),
-  'destructuring-assignment': require('./lib/rules/destructuring-assignment'),
-  'display-name': require('./lib/rules/display-name'),
-  'forbid-component-props': require('./lib/rules/forbid-component-props'),
-  'forbid-dom-props': require('./lib/rules/forbid-dom-props'),
-  'forbid-elements': require('./lib/rules/forbid-elements'),
-  'forbid-foreign-prop-types': require('./lib/rules/forbid-foreign-prop-types'),
-  'forbid-prop-types': require('./lib/rules/forbid-prop-types'),
-  'function-component-definition': require('./lib/rules/function-component-definition'),
-  'jsx-boolean-value': require('./lib/rules/jsx-boolean-value'),
-  'jsx-child-element-spacing': require('./lib/rules/jsx-child-element-spacing'),
-  'jsx-closing-bracket-location': require('./lib/rules/jsx-closing-bracket-location'),
-  'jsx-closing-tag-location': require('./lib/rules/jsx-closing-tag-location'),
-  'jsx-curly-spacing': require('./lib/rules/jsx-curly-spacing'),
-  'jsx-curly-newline': require('./lib/rules/jsx-curly-newline'),
-  'jsx-equals-spacing': require('./lib/rules/jsx-equals-spacing'),
-  'jsx-filename-extension': require('./lib/rules/jsx-filename-extension'),
-  'jsx-first-prop-new-line': require('./lib/rules/jsx-first-prop-new-line'),
-  'jsx-handler-names': require('./lib/rules/jsx-handler-names'),
-  'jsx-indent': require('./lib/rules/jsx-indent'),
-  'jsx-indent-props': require('./lib/rules/jsx-indent-props'),
-  'jsx-key': require('./lib/rules/jsx-key'),
-  'jsx-max-depth': require('./lib/rules/jsx-max-depth'),
-  'jsx-max-props-per-line': require('./lib/rules/jsx-max-props-per-line'),
-  'jsx-no-bind': require('./lib/rules/jsx-no-bind'),
-  'jsx-no-comment-textnodes': require('./lib/rules/jsx-no-comment-textnodes'),
-  'jsx-no-duplicate-props': require('./lib/rules/jsx-no-duplicate-props'),
-  'jsx-no-literals': require('./lib/rules/jsx-no-literals'),
-  'jsx-no-script-url': require('./lib/rules/jsx-no-script-url'),
-  'jsx-no-target-blank': require('./lib/rules/jsx-no-target-blank'),
-  'jsx-no-useless-fragment': require('./lib/rules/jsx-no-useless-fragment'),
-  'jsx-one-expression-per-line': require('./lib/rules/jsx-one-expression-per-line'),
-  'jsx-no-undef': require('./lib/rules/jsx-no-undef'),
-  'jsx-curly-brace-presence': require('./lib/rules/jsx-curly-brace-presence'),
-  'jsx-pascal-case': require('./lib/rules/jsx-pascal-case'),
-  'jsx-fragments': require('./lib/rules/jsx-fragments'),
-  'jsx-props-no-multi-spaces': require('./lib/rules/jsx-props-no-multi-spaces'),
-  'jsx-props-no-spreading': require('./lib/rules/jsx-props-no-spreading'),
-  'jsx-sort-default-props': require('./lib/rules/jsx-sort-default-props'),
-  'jsx-sort-props': require('./lib/rules/jsx-sort-props'),
-  'jsx-space-before-closing': require('./lib/rules/jsx-space-before-closing'),
-  'jsx-tag-spacing': require('./lib/rules/jsx-tag-spacing'),
-  'jsx-uses-react': require('./lib/rules/jsx-uses-react'),
-  'jsx-uses-vars': require('./lib/rules/jsx-uses-vars'),
-  'jsx-wrap-multilines': require('./lib/rules/jsx-wrap-multilines'),
-  'no-access-state-in-setstate': require('./lib/rules/no-access-state-in-setstate'),
-  'no-adjacent-inline-elements': require('./lib/rules/no-adjacent-inline-elements'),
-  'no-array-index-key': require('./lib/rules/no-array-index-key'),
-  'no-children-prop': require('./lib/rules/no-children-prop'),
-  'no-danger': require('./lib/rules/no-danger'),
-  'no-danger-with-children': require('./lib/rules/no-danger-with-children'),
-  'no-deprecated': require('./lib/rules/no-deprecated'),
-  'no-did-mount-set-state': require('./lib/rules/no-did-mount-set-state'),
-  'no-did-update-set-state': require('./lib/rules/no-did-update-set-state'),
-  'no-direct-mutation-state': require('./lib/rules/no-direct-mutation-state'),
-  'no-find-dom-node': require('./lib/rules/no-find-dom-node'),
-  'no-is-mounted': require('./lib/rules/no-is-mounted'),
-  'no-multi-comp': require('./lib/rules/no-multi-comp'),
-  'no-set-state': require('./lib/rules/no-set-state'),
-  'no-string-refs': require('./lib/rules/no-string-refs'),
-  'no-redundant-should-component-update': require('./lib/rules/no-redundant-should-component-update'),
-  'no-render-return-value': require('./lib/rules/no-render-return-value'),
-  'no-this-in-sfc': require('./lib/rules/no-this-in-sfc'),
-  'no-typos': require('./lib/rules/no-typos'),
-  'no-unescaped-entities': require('./lib/rules/no-unescaped-entities'),
-  'no-unknown-property': require('./lib/rules/no-unknown-property'),
-  'no-unsafe': require('./lib/rules/no-unsafe'),
-  'no-unused-prop-types': require('./lib/rules/no-unused-prop-types'),
-  'no-unused-state': require('./lib/rules/no-unused-state'),
-  'no-will-update-set-state': require('./lib/rules/no-will-update-set-state'),
-  'prefer-es6-class': require('./lib/rules/prefer-es6-class'),
-  'prefer-read-only-props': require('./lib/rules/prefer-read-only-props'),
-  'prefer-stateless-function': require('./lib/rules/prefer-stateless-function'),
-  'prop-types': require('./lib/rules/prop-types'),
-  'react-in-jsx-scope': require('./lib/rules/react-in-jsx-scope'),
-  'require-default-props': require('./lib/rules/require-default-props'),
-  'require-optimization': require('./lib/rules/require-optimization'),
-  'require-render-return': require('./lib/rules/require-render-return'),
-  'self-closing-comp': require('./lib/rules/self-closing-comp'),
-  'sort-comp': require('./lib/rules/sort-comp'),
-  'sort-prop-types': require('./lib/rules/sort-prop-types'),
-  'state-in-constructor': require('./lib/rules/state-in-constructor'),
-  'static-property-placement': require('./lib/rules/static-property-placement'),
-  'style-prop-object': require('./lib/rules/style-prop-object'),
-  'void-dom-elements-no-children': require('./lib/rules/void-dom-elements-no-children')
-};
-/* eslint-enable */
-
-function filterRules(rules, predicate) {
-  return fromEntries(entries(rules).filter(entry => predicate(entry[1])));
-}
-
-function configureAsError(rules) {
-  return fromEntries(Object.keys(rules).map(key => [`react/${key}`, 2]));
-}
-
-const activeRules = filterRules(allRules, rule => !rule.meta.deprecated);
-const activeRulesConfig = configureAsError(activeRules);
-
-const deprecatedRules = filterRules(allRules, rule => rule.meta.deprecated);
-
-module.exports = {
-  deprecatedRules,
-  rules: allRules,
-  configs: {
-    recommended: {
-      plugins: [
-        'react'
-      ],
-      parserOptions: {
-        ecmaFeatures: {
-          jsx: true
-        }
-      },
-      rules: {
-        'react/display-name': 2,
-        'react/jsx-key': 2,
-        'react/jsx-no-comment-textnodes': 2,
-        'react/jsx-no-duplicate-props': 2,
-        'react/jsx-no-target-blank': 2,
-        'react/jsx-no-undef': 2,
-        'react/jsx-uses-react': 2,
-        'react/jsx-uses-vars': 2,
-        'react/no-children-prop': 2,
-        'react/no-danger-with-children': 2,
-        'react/no-deprecated': 2,
-        'react/no-direct-mutation-state': 2,
-        'react/no-find-dom-node': 2,
-        'react/no-is-mounted': 2,
-        'react/no-render-return-value': 2,
-        'react/no-string-refs': 2,
-        'react/no-unescaped-entities': 2,
-        'react/no-unknown-property': 2,
-        'react/no-unsafe': 0,
-        'react/prop-types': 2,
-        'react/react-in-jsx-scope': 2,
-        'react/require-render-return': 2
-      }
-    },
-    all: {
-      plugins: [
-        'react'
-      ],
-      parserOptions: {
-        ecmaFeatures: {
-          jsx: true
-        }
-      },
-      rules: activeRulesConfig
-    }
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/boolean-prop-naming.js b/node_modules/eslint-plugin-react/lib/rules/boolean-prop-naming.js
deleted file mode 100644
index e319df8..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/boolean-prop-naming.js
+++ /dev/null
@@ -1,324 +0,0 @@
-/**
- * @fileoverview Enforces consistent naming for boolean props
- * @author Ev Haus
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const propsUtil = require('../util/props');
-const docsUrl = require('../util/docsUrl');
-const propWrapperUtil = require('../util/propWrapper');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      category: 'Stylistic Issues',
-      description: 'Enforces consistent naming for boolean props',
-      recommended: false,
-      url: docsUrl('boolean-prop-naming')
-    },
-
-    schema: [{
-      additionalProperties: false,
-      properties: {
-        propTypeNames: {
-          items: {
-            type: 'string'
-          },
-          minItems: 1,
-          type: 'array',
-          uniqueItems: true
-        },
-        rule: {
-          default: '^(is|has)[A-Z]([A-Za-z0-9]?)+',
-          minLength: 1,
-          type: 'string'
-        },
-        message: {
-          minLength: 1,
-          type: 'string'
-        },
-        validateNested: {
-          default: false,
-          type: 'boolean'
-        }
-      },
-      type: 'object'
-    }]
-  },
-
-  create: Components.detect((context, components, utils) => {
-    const config = context.options[0] || {};
-    const rule = config.rule ? new RegExp(config.rule) : null;
-    const propTypeNames = config.propTypeNames || ['bool'];
-
-    // Remembers all Flowtype object definitions
-    const objectTypeAnnotations = new Map();
-
-    /**
-     * Returns the prop key to ensure we handle the following cases:
-     * propTypes: {
-     *   full: React.PropTypes.bool,
-     *   short: PropTypes.bool,
-     *   direct: bool,
-     *   required: PropTypes.bool.isRequired
-     * }
-     * @param {Object} node The node we're getting the name of
-     * @returns {string | null}
-     */
-    function getPropKey(node) {
-      // Check for `ExperimentalSpreadProperty` (ESLint 3/4) and `SpreadElement` (ESLint 5)
-      // so we can skip validation of those fields.
-      // Otherwise it will look for `node.value.property` which doesn't exist and breaks ESLint.
-      if (node.type === 'ExperimentalSpreadProperty' || node.type === 'SpreadElement') {
-        return null;
-      }
-      if (node.value.property) {
-        const name = node.value.property.name;
-        if (name === 'isRequired') {
-          if (node.value.object && node.value.object.property) {
-            return node.value.object.property.name;
-          }
-          return null;
-        }
-        return name;
-      }
-      if (node.value.type === 'Identifier') {
-        return node.value.name;
-      }
-      return null;
-    }
-
-    /**
-     * Returns the name of the given node (prop)
-     * @param {Object} node The node we're getting the name of
-     * @returns {string}
-     */
-    function getPropName(node) {
-      // Due to this bug https://github.com/babel/babel-eslint/issues/307
-      // we can't get the name of the Flow object key name. So we have
-      // to hack around it for now.
-      if (node.type === 'ObjectTypeProperty') {
-        return context.getSourceCode().getFirstToken(node).value;
-      }
-
-      return node.key.name;
-    }
-
-    /**
-     * Checks if prop is declared in flow way
-     * @param {Object} prop Property object, single prop type declaration
-     * @returns {Boolean}
-     */
-    function flowCheck(prop) {
-      return (
-        prop.type === 'ObjectTypeProperty' &&
-        prop.value.type === 'BooleanTypeAnnotation' &&
-        rule.test(getPropName(prop)) === false
-      );
-    }
-
-    /**
-     * Checks if prop is declared in regular way
-     * @param {Object} prop Property object, single prop type declaration
-     * @returns {Boolean}
-     */
-    function regularCheck(prop) {
-      const propKey = getPropKey(prop);
-      return (
-        propKey &&
-        propTypeNames.indexOf(propKey) >= 0 &&
-        rule.test(getPropName(prop)) === false
-      );
-    }
-
-    /**
-     * Checks if prop is nested
-     * @param {Object} prop Property object, single prop type declaration
-     * @returns {Boolean}
-     */
-    function nestedPropTypes(prop) {
-      return (
-        prop.type === 'Property' &&
-        prop.value.type === 'CallExpression'
-      );
-    }
-
-    /**
-     * Runs recursive check on all proptypes
-     * @param {Array} proptypes A list of Property object (for each proptype defined)
-     * @param {Function} addInvalidProp callback to run for each error
-     */
-    function runCheck(proptypes, addInvalidProp) {
-      proptypes = proptypes || [];
-
-      proptypes.forEach((prop) => {
-        if (config.validateNested && nestedPropTypes(prop)) {
-          runCheck(prop.value.arguments[0].properties, addInvalidProp);
-          return;
-        }
-        if (flowCheck(prop) || regularCheck(prop)) {
-          addInvalidProp(prop);
-        }
-      });
-    }
-
-    /**
-     * Checks and mark props with invalid naming
-     * @param {Object} node The component node we're testing
-     * @param {Array} proptypes A list of Property object (for each proptype defined)
-     */
-    function validatePropNaming(node, proptypes) {
-      const component = components.get(node) || node;
-      const invalidProps = component.invalidProps || [];
-
-      runCheck(proptypes, (prop) => {
-        invalidProps.push(prop);
-      });
-
-      components.set(node, {
-        invalidProps
-      });
-    }
-
-    /**
-     * Reports invalid prop naming
-     * @param {Object} component The component to process
-     */
-    function reportInvalidNaming(component) {
-      component.invalidProps.forEach((propNode) => {
-        const propName = getPropName(propNode);
-        context.report({
-          node: propNode,
-          message: config.message || 'Prop name ({{ propName }}) doesn\'t match rule ({{ pattern }})',
-          data: {
-            component: propName,
-            propName,
-            pattern: config.rule
-          }
-        });
-      });
-    }
-
-    function checkPropWrapperArguments(node, args) {
-      if (!node || !Array.isArray(args)) {
-        return;
-      }
-      args.filter(arg => arg.type === 'ObjectExpression').forEach(object => validatePropNaming(node, object.properties));
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      ClassProperty(node) {
-        if (!rule || !propsUtil.isPropTypesDeclaration(node)) {
-          return;
-        }
-        if (
-          node.value &&
-          node.value.type === 'CallExpression' &&
-          propWrapperUtil.isPropWrapperFunction(
-            context,
-            context.getSourceCode().getText(node.value.callee)
-          )
-        ) {
-          checkPropWrapperArguments(node, node.value.arguments);
-        }
-        if (node.value && node.value.properties) {
-          validatePropNaming(node, node.value.properties);
-        }
-        if (node.typeAnnotation && node.typeAnnotation.typeAnnotation) {
-          validatePropNaming(node, node.typeAnnotation.typeAnnotation.properties);
-        }
-      },
-
-      MemberExpression(node) {
-        if (!rule || !propsUtil.isPropTypesDeclaration(node)) {
-          return;
-        }
-        const component = utils.getRelatedComponent(node);
-        if (!component || !node.parent.right) {
-          return;
-        }
-        const right = node.parent.right;
-        if (
-          right.type === 'CallExpression' &&
-          propWrapperUtil.isPropWrapperFunction(
-            context,
-            context.getSourceCode().getText(right.callee)
-          )
-        ) {
-          checkPropWrapperArguments(component.node, right.arguments);
-          return;
-        }
-        validatePropNaming(component.node, node.parent.right.properties);
-      },
-
-      ObjectExpression(node) {
-        if (!rule) {
-          return;
-        }
-
-        // Search for the proptypes declaration
-        node.properties.forEach((property) => {
-          if (!propsUtil.isPropTypesDeclaration(property)) {
-            return;
-          }
-          validatePropNaming(node, property.value.properties);
-        });
-      },
-
-      TypeAlias(node) {
-        // Cache all ObjectType annotations, we will check them at the end
-        if (node.right.type === 'ObjectTypeAnnotation') {
-          objectTypeAnnotations.set(node.id.name, node.right);
-        }
-      },
-
-      // eslint-disable-next-line object-shorthand
-      'Program:exit'() {
-        if (!rule) {
-          return;
-        }
-
-        const list = components.list();
-        Object.keys(list).forEach((component) => {
-          // If this is a functional component that uses a global type, check it
-          if (
-            list[component].node.type === 'FunctionDeclaration' &&
-            list[component].node.params &&
-            list[component].node.params.length &&
-            list[component].node.params[0].typeAnnotation
-          ) {
-            const typeNode = list[component].node.params[0].typeAnnotation;
-            const annotation = typeNode.typeAnnotation;
-
-            let propType;
-            if (annotation.type === 'GenericTypeAnnotation') {
-              propType = objectTypeAnnotations.get(annotation.id.name);
-            } else if (annotation.type === 'ObjectTypeAnnotation') {
-              propType = annotation;
-            }
-            if (propType) {
-              validatePropNaming(list[component].node, propType.properties);
-            }
-          }
-
-          if (list[component].invalidProps && list[component].invalidProps.length > 0) {
-            reportInvalidNaming(list[component]);
-          }
-        });
-
-        // Reset cache
-        objectTypeAnnotations.clear();
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/button-has-type.js b/node_modules/eslint-plugin-react/lib/rules/button-has-type.js
deleted file mode 100644
index a7d4694..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/button-has-type.js
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * @fileoverview Forbid "button" element without an explicit "type" attribute
- * @author Filipp Riabchun
- */
-
-'use strict';
-
-const getProp = require('jsx-ast-utils/getProp');
-const getLiteralPropValue = require('jsx-ast-utils/getLiteralPropValue');
-const docsUrl = require('../util/docsUrl');
-const pragmaUtil = require('../util/pragma');
-
-// ------------------------------------------------------------------------------
-// Helpers
-// ------------------------------------------------------------------------------
-
-function isCreateElement(node, context) {
-  const pragma = pragmaUtil.getFromContext(context);
-  return node.callee &&
-    node.callee.type === 'MemberExpression' &&
-    node.callee.property.name === 'createElement' &&
-    node.callee.object &&
-    node.callee.object.name === pragma &&
-    node.arguments.length > 0;
-}
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-const optionDefaults = {
-  button: true,
-  submit: true,
-  reset: true
-};
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Forbid "button" element without an explicit "type" attribute',
-      category: 'Possible Errors',
-      recommended: false,
-      url: docsUrl('button-has-type')
-    },
-    schema: [{
-      type: 'object',
-      properties: {
-        button: {
-          default: optionDefaults.button,
-          type: 'boolean'
-        },
-        submit: {
-          default: optionDefaults.submit,
-          type: 'boolean'
-        },
-        reset: {
-          default: optionDefaults.reset,
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    const configuration = Object.assign({}, optionDefaults, context.options[0]);
-
-    function reportMissing(node) {
-      context.report({
-        node,
-        message: 'Missing an explicit type attribute for button'
-      });
-    }
-
-    function checkValue(node, value, quoteFn) {
-      const q = quoteFn || (x => `"${x}"`);
-      if (!(value in configuration)) {
-        context.report({
-          node,
-          message: `${q(value)} is an invalid value for button type attribute`
-        });
-      } else if (!configuration[value]) {
-        context.report({
-          node,
-          message: `${q(value)} is a forbidden value for button type attribute`
-        });
-      }
-    }
-
-    return {
-      JSXElement(node) {
-        if (node.openingElement.name.name !== 'button') {
-          return;
-        }
-
-        const typeProp = getProp(node.openingElement.attributes, 'type');
-
-        if (!typeProp) {
-          reportMissing(node);
-          return;
-        }
-
-        const propValue = getLiteralPropValue(typeProp);
-        if (!propValue && typeProp.value && typeProp.value.expression) {
-          checkValue(node, typeProp.value.expression.name, x => `\`${x}\``);
-        } else {
-          checkValue(node, propValue);
-        }
-      },
-      CallExpression(node) {
-        if (!isCreateElement(node, context)) {
-          return;
-        }
-
-        if (node.arguments[0].type !== 'Literal' || node.arguments[0].value !== 'button') {
-          return;
-        }
-
-        if (!node.arguments[1] || node.arguments[1].type !== 'ObjectExpression') {
-          reportMissing(node);
-          return;
-        }
-
-        const props = node.arguments[1].properties;
-        const typeProp = props.find(prop => prop.key && prop.key.name === 'type');
-
-        if (!typeProp || typeProp.value.type !== 'Literal') {
-          reportMissing(node);
-          return;
-        }
-
-        checkValue(node, typeProp.value.value);
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/default-props-match-prop-types.js b/node_modules/eslint-plugin-react/lib/rules/default-props-match-prop-types.js
deleted file mode 100644
index 988949b..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/default-props-match-prop-types.js
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * @fileOverview Enforce all defaultProps are defined in propTypes
- * @author Vitor Balocco
- * @author Roy Sutton
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce all defaultProps are defined and not "required" in propTypes.',
-      category: 'Best Practices',
-      url: docsUrl('default-props-match-prop-types')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        allowRequiredDefaults: {
-          default: false,
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create: Components.detect((context, components) => {
-    const configuration = context.options[0] || {};
-    const allowRequiredDefaults = configuration.allowRequiredDefaults || false;
-
-    /**
-     * Reports all defaultProps passed in that don't have an appropriate propTypes counterpart.
-     * @param  {Object[]} propTypes    Array of propTypes to check.
-     * @param  {Object}   defaultProps Object of defaultProps to check. Keys are the props names.
-     * @return {void}
-     */
-    function reportInvalidDefaultProps(propTypes, defaultProps) {
-      // If this defaultProps is "unresolved" or the propTypes is undefined, then we should ignore
-      // this component and not report any errors for it, to avoid false-positives with e.g.
-      // external defaultProps/propTypes declarations or spread operators.
-      if (defaultProps === 'unresolved' || !propTypes || Object.keys(propTypes).length === 0) {
-        return;
-      }
-
-      Object.keys(defaultProps).forEach((defaultPropName) => {
-        const defaultProp = defaultProps[defaultPropName];
-        const prop = propTypes[defaultPropName];
-
-        if (prop && (allowRequiredDefaults || !prop.isRequired)) {
-          return;
-        }
-
-        if (prop) {
-          context.report({
-            node: defaultProp.node,
-            message: 'defaultProp "{{name}}" defined for isRequired propType.',
-            data: {name: defaultPropName}
-          });
-        } else {
-          context.report({
-            node: defaultProp.node,
-            message: 'defaultProp "{{name}}" has no corresponding propTypes declaration.',
-            data: {name: defaultPropName}
-          });
-        }
-      });
-    }
-
-    // --------------------------------------------------------------------------
-    // Public API
-    // --------------------------------------------------------------------------
-
-    return {
-      'Program:exit'() {
-        const list = components.list();
-
-        // If no defaultProps could be found, we don't report anything.
-        Object.keys(list).filter(component => list[component].defaultProps).forEach((component) => {
-          reportInvalidDefaultProps(
-            list[component].declaredPropTypes,
-            list[component].defaultProps || {}
-          );
-        });
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/destructuring-assignment.js b/node_modules/eslint-plugin-react/lib/rules/destructuring-assignment.js
deleted file mode 100644
index 0299911..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/destructuring-assignment.js
+++ /dev/null
@@ -1,154 +0,0 @@
-/**
- * @fileoverview Enforce consistent usage of destructuring assignment of props, state, and context.
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-const isAssignmentLHS = require('../util/ast').isAssignmentLHS;
-
-const DEFAULT_OPTION = 'always';
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce consistent usage of destructuring assignment of props, state, and context',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('destructuring-assignment')
-    },
-    schema: [{
-      type: 'string',
-      enum: [
-        'always',
-        'never'
-      ]
-    }, {
-      type: 'object',
-      properties: {
-        ignoreClassFields: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create: Components.detect((context, components, utils) => {
-    const configuration = context.options[0] || DEFAULT_OPTION;
-    const ignoreClassFields = context.options[1] && context.options[1].ignoreClassFields === true || false;
-
-    /**
-     * @param {ASTNode} node We expect either an ArrowFunctionExpression,
-     *   FunctionDeclaration, or FunctionExpression
-     */
-    function handleStatelessComponent(node) {
-      const destructuringProps = node.params && node.params[0] && node.params[0].type === 'ObjectPattern';
-      const destructuringContext = node.params && node.params[1] && node.params[1].type === 'ObjectPattern';
-
-      if (destructuringProps && components.get(node) && configuration === 'never') {
-        context.report({
-          node,
-          message: 'Must never use destructuring props assignment in SFC argument'
-        });
-      } else if (destructuringContext && components.get(node) && configuration === 'never') {
-        context.report({
-          node,
-          message: 'Must never use destructuring context assignment in SFC argument'
-        });
-      }
-    }
-
-    function handleSFCUsage(node) {
-      // props.aProp || context.aProp
-      const isPropUsed = (node.object.name === 'props' || node.object.name === 'context') && !isAssignmentLHS(node);
-      if (isPropUsed && configuration === 'always') {
-        context.report({
-          node,
-          message: `Must use destructuring ${node.object.name} assignment`
-        });
-      }
-    }
-
-    function isInClassProperty(node) {
-      let curNode = node.parent;
-      while (curNode) {
-        if (curNode.type === 'ClassProperty') {
-          return true;
-        }
-        curNode = curNode.parent;
-      }
-      return false;
-    }
-
-    function handleClassUsage(node) {
-      // this.props.Aprop || this.context.aProp || this.state.aState
-      const isPropUsed = (
-        node.object.type === 'MemberExpression' && node.object.object.type === 'ThisExpression' &&
-        (node.object.property.name === 'props' || node.object.property.name === 'context' || node.object.property.name === 'state') &&
-        !isAssignmentLHS(node)
-      );
-
-      if (
-        isPropUsed && configuration === 'always' &&
-        !(ignoreClassFields && isInClassProperty(node))
-      ) {
-        context.report({
-          node,
-          message: `Must use destructuring ${node.object.property.name} assignment`
-        });
-      }
-    }
-
-    return {
-
-      FunctionDeclaration: handleStatelessComponent,
-
-      ArrowFunctionExpression: handleStatelessComponent,
-
-      FunctionExpression: handleStatelessComponent,
-
-      MemberExpression(node) {
-        const SFCComponent = components.get(context.getScope(node).block);
-        const classComponent = utils.getParentComponent(node);
-        if (SFCComponent) {
-          handleSFCUsage(node);
-        }
-        if (classComponent) {
-          handleClassUsage(node);
-        }
-      },
-
-      VariableDeclarator(node) {
-        const classComponent = utils.getParentComponent(node);
-        const SFCComponent = components.get(context.getScope(node).block);
-
-        const destructuring = (node.init && node.id && node.id.type === 'ObjectPattern');
-        // let {foo} = props;
-        const destructuringSFC = destructuring && (node.init.name === 'props' || node.init.name === 'context');
-        // let {foo} = this.props;
-        const destructuringClass = destructuring && node.init.object && node.init.object.type === 'ThisExpression' && (
-          node.init.property.name === 'props' || node.init.property.name === 'context' || node.init.property.name === 'state'
-        );
-
-        if (SFCComponent && destructuringSFC && configuration === 'never') {
-          context.report({
-            node,
-            message: `Must never use destructuring ${node.init.name} assignment`
-          });
-        }
-
-        if (
-          classComponent && destructuringClass && configuration === 'never' &&
-          !(ignoreClassFields && node.parent.type === 'ClassProperty')
-        ) {
-          context.report({
-            node,
-            message: `Must never use destructuring ${node.init.property.name} assignment`
-          });
-        }
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/display-name.js b/node_modules/eslint-plugin-react/lib/rules/display-name.js
deleted file mode 100644
index 0e0b4e7..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/display-name.js
+++ /dev/null
@@ -1,239 +0,0 @@
-/**
- * @fileoverview Prevent missing displayName in a React component definition
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const astUtil = require('../util/ast');
-const docsUrl = require('../util/docsUrl');
-const propsUtil = require('../util/props');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent missing displayName in a React component definition',
-      category: 'Best Practices',
-      recommended: true,
-      url: docsUrl('display-name')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        ignoreTranspilerName: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create: Components.detect((context, components, utils) => {
-    const config = context.options[0] || {};
-    const ignoreTranspilerName = config.ignoreTranspilerName || false;
-
-    const MISSING_MESSAGE = 'Component definition is missing display name';
-
-    /**
-     * Mark a prop type as declared
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function markDisplayNameAsDeclared(node) {
-      components.set(node, {
-        hasDisplayName: true
-      });
-    }
-
-    /**
-     * Reports missing display name for a given component
-     * @param {Object} component The component to process
-     */
-    function reportMissingDisplayName(component) {
-      context.report({
-        node: component.node,
-        message: MISSING_MESSAGE,
-        data: {
-          component: component.name
-        }
-      });
-    }
-
-    /**
-     * Checks if the component have a name set by the transpiler
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if component has a name, false if not.
-     */
-    function hasTranspilerName(node) {
-      const namedObjectAssignment = (
-        node.type === 'ObjectExpression' &&
-        node.parent &&
-        node.parent.parent &&
-        node.parent.parent.type === 'AssignmentExpression' &&
-        (
-          !node.parent.parent.left.object ||
-          node.parent.parent.left.object.name !== 'module' ||
-          node.parent.parent.left.property.name !== 'exports'
-        )
-      );
-      const namedObjectDeclaration = (
-        node.type === 'ObjectExpression' &&
-        node.parent &&
-        node.parent.parent &&
-        node.parent.parent.type === 'VariableDeclarator'
-      );
-      const namedClass = (
-        (node.type === 'ClassDeclaration' || node.type === 'ClassExpression') &&
-        node.id &&
-        !!node.id.name
-      );
-
-      const namedFunctionDeclaration = (
-        (node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression') &&
-        node.id &&
-        !!node.id.name
-      );
-
-      const namedFunctionExpression = (
-        astUtil.isFunctionLikeExpression(node) &&
-        node.parent &&
-        (node.parent.type === 'VariableDeclarator' || node.parent.method === true) &&
-        (!node.parent.parent || !utils.isES5Component(node.parent.parent))
-      );
-
-      if (
-        namedObjectAssignment || namedObjectDeclaration ||
-        namedClass ||
-        namedFunctionDeclaration || namedFunctionExpression
-      ) {
-        return true;
-      }
-      return false;
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-
-      ClassProperty(node) {
-        if (!propsUtil.isDisplayNameDeclaration(node)) {
-          return;
-        }
-        markDisplayNameAsDeclared(node);
-      },
-
-      MemberExpression(node) {
-        if (!propsUtil.isDisplayNameDeclaration(node.property)) {
-          return;
-        }
-        const component = utils.getRelatedComponent(node);
-        if (!component) {
-          return;
-        }
-        markDisplayNameAsDeclared(component.node);
-      },
-
-      FunctionExpression(node) {
-        if (ignoreTranspilerName || !hasTranspilerName(node)) {
-          return;
-        }
-        if (components.get(node)) {
-          markDisplayNameAsDeclared(node);
-        }
-      },
-
-      FunctionDeclaration(node) {
-        if (ignoreTranspilerName || !hasTranspilerName(node)) {
-          return;
-        }
-        if (components.get(node)) {
-          markDisplayNameAsDeclared(node);
-        }
-      },
-
-      ArrowFunctionExpression(node) {
-        if (ignoreTranspilerName || !hasTranspilerName(node)) {
-          return;
-        }
-        if (components.get(node)) {
-          markDisplayNameAsDeclared(node);
-        }
-      },
-
-      MethodDefinition(node) {
-        if (!propsUtil.isDisplayNameDeclaration(node.key)) {
-          return;
-        }
-        markDisplayNameAsDeclared(node);
-      },
-
-      ClassExpression(node) {
-        if (ignoreTranspilerName || !hasTranspilerName(node)) {
-          return;
-        }
-        markDisplayNameAsDeclared(node);
-      },
-
-      ClassDeclaration(node) {
-        if (ignoreTranspilerName || !hasTranspilerName(node)) {
-          return;
-        }
-        markDisplayNameAsDeclared(node);
-      },
-
-      ObjectExpression(node) {
-        if (ignoreTranspilerName || !hasTranspilerName(node)) {
-          // Search for the displayName declaration
-          node.properties.forEach((property) => {
-            if (!property.key || !propsUtil.isDisplayNameDeclaration(property.key)) {
-              return;
-            }
-            markDisplayNameAsDeclared(node);
-          });
-          return;
-        }
-        markDisplayNameAsDeclared(node);
-      },
-
-      CallExpression(node) {
-        if (!utils.isPragmaComponentWrapper(node)) {
-          return;
-        }
-
-        if (node.arguments.length > 0 && astUtil.isFunctionLikeExpression(node.arguments[0])) {
-          // Skip over React.forwardRef declarations that are embeded within
-          // a React.memo i.e. React.memo(React.forwardRef(/* ... */))
-          // This means that we raise a single error for the call to React.memo
-          // instead of one for React.memo and one for React.forwardRef
-          const isWrappedInAnotherPragma = utils.getPragmaComponentWrapper(node);
-
-          if (
-            !isWrappedInAnotherPragma &&
-            (ignoreTranspilerName || !hasTranspilerName(node.arguments[0]))
-          ) {
-            return;
-          }
-
-          if (components.get(node)) {
-            markDisplayNameAsDeclared(node);
-          }
-        }
-      },
-
-      'Program:exit'() {
-        const list = components.list();
-        // Report missing display name for all components
-        Object.keys(list).filter(component => !list[component].hasDisplayName).forEach((component) => {
-          reportMissingDisplayName(list[component]);
-        });
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/forbid-component-props.js b/node_modules/eslint-plugin-react/lib/rules/forbid-component-props.js
deleted file mode 100644
index 6c11687..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/forbid-component-props.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * @fileoverview Forbid certain props on components
- * @author Joe Lencioni
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-const DEFAULTS = ['className', 'style'];
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Forbid certain props on components',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('forbid-component-props')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        forbid: {
-          type: 'array',
-          items: {
-            oneOf: [{
-              type: 'string'
-            }, {
-              type: 'object',
-              properties: {
-                propName: {
-                  type: 'string'
-                },
-                allowedFor: {
-                  type: 'array',
-                  uniqueItems: true,
-                  items: {
-                    type: 'string'
-                  }
-                }
-              }
-            }]
-          }
-        }
-      }
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || {};
-    const forbid = new Map((configuration.forbid || DEFAULTS).map((value) => {
-      const propName = typeof value === 'string' ? value : value.propName;
-      const whitelist = typeof value === 'string' ? [] : (value.allowedFor || []);
-      return [propName, whitelist];
-    }));
-
-    function isForbidden(prop, tagName) {
-      const whitelist = forbid.get(prop);
-      // if the tagName is undefined (`<this.something>`), we assume it's a forbidden element
-      return typeof whitelist !== 'undefined' && (typeof tagName === 'undefined' || whitelist.indexOf(tagName) === -1);
-    }
-
-    return {
-      JSXAttribute(node) {
-        const tag = node.parent.name.name;
-        if (tag && tag[0] !== tag[0].toUpperCase()) {
-          // This is a DOM node, not a Component, so exit.
-          return;
-        }
-
-        const prop = node.name.name;
-
-        if (!isForbidden(prop, tag)) {
-          return;
-        }
-
-        context.report({
-          node,
-          message: `Prop \`${prop}\` is forbidden on Components`
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/forbid-dom-props.js b/node_modules/eslint-plugin-react/lib/rules/forbid-dom-props.js
deleted file mode 100644
index 08853a4..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/forbid-dom-props.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * @fileoverview Forbid certain props on DOM Nodes
- * @author David Vázquez
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-const DEFAULTS = [];
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Forbid certain props on DOM Nodes',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('forbid-dom-props')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        forbid: {
-          type: 'array',
-          items: {
-            type: 'string',
-            minLength: 1
-          },
-          uniqueItems: true
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    function isForbidden(prop) {
-      const configuration = context.options[0] || {};
-
-      const forbid = configuration.forbid || DEFAULTS;
-      return forbid.indexOf(prop) >= 0;
-    }
-
-    return {
-      JSXAttribute(node) {
-        const tag = node.parent.name.name;
-        if (!(tag && tag[0] !== tag[0].toUpperCase())) {
-          // This is a Component, not  a DOM node, so exit.
-          return;
-        }
-
-        const prop = node.name.name;
-
-        if (!isForbidden(prop)) {
-          return;
-        }
-
-        context.report({
-          node,
-          message: `Prop \`${prop}\` is forbidden on DOM Nodes`
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/forbid-elements.js b/node_modules/eslint-plugin-react/lib/rules/forbid-elements.js
deleted file mode 100644
index bb00517..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/forbid-elements.js
+++ /dev/null
@@ -1,114 +0,0 @@
-/**
- * @fileoverview Forbid certain elements
- * @author Kenneth Chung
- */
-
-'use strict';
-
-const has = require('has');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Forbid certain elements',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('forbid-elements')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        forbid: {
-          type: 'array',
-          items: {
-            anyOf: [
-              {type: 'string'},
-              {
-                type: 'object',
-                properties: {
-                  element: {type: 'string'},
-                  message: {type: 'string'}
-                },
-                required: ['element'],
-                additionalProperties: false
-              }
-            ]
-          }
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || {};
-    const forbidConfiguration = configuration.forbid || [];
-
-    const indexedForbidConfigs = {};
-
-    forbidConfiguration.forEach((item) => {
-      if (typeof item === 'string') {
-        indexedForbidConfigs[item] = {element: item};
-      } else {
-        indexedForbidConfigs[item.element] = item;
-      }
-    });
-
-    function errorMessageForElement(name) {
-      const message = `<${name}> is forbidden`;
-      const additionalMessage = indexedForbidConfigs[name].message;
-
-      if (additionalMessage) {
-        return `${message}, ${additionalMessage}`;
-      }
-
-      return message;
-    }
-
-    function isValidCreateElement(node) {
-      return node.callee &&
-        node.callee.type === 'MemberExpression' &&
-        node.callee.object.name === 'React' &&
-        node.callee.property.name === 'createElement' &&
-        node.arguments.length > 0;
-    }
-
-    function reportIfForbidden(element, node) {
-      if (has(indexedForbidConfigs, element)) {
-        context.report({
-          node,
-          message: errorMessageForElement(element)
-        });
-      }
-    }
-
-    return {
-      JSXOpeningElement(node) {
-        reportIfForbidden(context.getSourceCode().getText(node.name), node.name);
-      },
-
-      CallExpression(node) {
-        if (!isValidCreateElement(node)) {
-          return;
-        }
-
-        const argument = node.arguments[0];
-        const argType = argument.type;
-
-        if (argType === 'Identifier' && /^[A-Z_]/.test(argument.name)) {
-          reportIfForbidden(argument.name, argument);
-        } else if (argType === 'Literal' && /^[a-z][^.]*$/.test(argument.value)) {
-          reportIfForbidden(argument.value, argument);
-        } else if (argType === 'MemberExpression') {
-          reportIfForbidden(context.getSourceCode().getText(argument), argument);
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/forbid-foreign-prop-types.js b/node_modules/eslint-plugin-react/lib/rules/forbid-foreign-prop-types.js
deleted file mode 100644
index ad23d50..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/forbid-foreign-prop-types.js
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * @fileoverview Forbid using another component's propTypes
- * @author Ian Christian Myers
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-const ast = require('../util/ast');
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Forbid using another component\'s propTypes',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('forbid-foreign-prop-types')
-    },
-
-    schema: [
-      {
-        type: 'object',
-        properties: {
-          allowInPropTypes: {
-            type: 'boolean'
-          }
-        },
-        additionalProperties: false
-      }
-    ]
-  },
-
-  create(context) {
-    const config = context.options[0] || {};
-    const allowInPropTypes = config.allowInPropTypes || false;
-
-    // --------------------------------------------------------------------------
-    // Helpers
-    // --------------------------------------------------------------------------
-
-    function findParentAssignmentExpression(node) {
-      let parent = node.parent;
-
-      while (parent && parent.type !== 'Program') {
-        if (parent.type === 'AssignmentExpression') {
-          return parent;
-        }
-        parent = parent.parent;
-      }
-      return null;
-    }
-
-    function findParentClassProperty(node) {
-      let parent = node.parent;
-
-      while (parent && parent.type !== 'Program') {
-        if (parent.type === 'ClassProperty') {
-          return parent;
-        }
-        parent = parent.parent;
-      }
-      return null;
-    }
-
-    function isAllowedAssignment(node) {
-      if (!allowInPropTypes) {
-        return false;
-      }
-
-      const assignmentExpression = findParentAssignmentExpression(node);
-
-      if (
-        assignmentExpression &&
-        assignmentExpression.left &&
-        assignmentExpression.left.property &&
-        assignmentExpression.left.property.name === 'propTypes'
-      ) {
-        return true;
-      }
-
-      const classProperty = findParentClassProperty(node);
-
-      if (
-        classProperty &&
-        classProperty.key &&
-        classProperty.key.name === 'propTypes'
-      ) {
-        return true;
-      }
-      return false;
-    }
-
-    return {
-      MemberExpression(node) {
-        if (
-          node.property &&
-          (
-            !node.computed &&
-            node.property.type === 'Identifier' &&
-            node.property.name === 'propTypes' &&
-            !ast.isAssignmentLHS(node) &&
-            !isAllowedAssignment(node)
-          ) || (
-            (node.property.type === 'Literal' || node.property.type === 'JSXText') &&
-            node.property.value === 'propTypes' &&
-            !ast.isAssignmentLHS(node) &&
-            !isAllowedAssignment(node)
-          )
-        ) {
-          context.report({
-            node: node.property,
-            message: 'Using propTypes from another component is not safe because they may be removed in production builds'
-          });
-        }
-      },
-
-      ObjectPattern(node) {
-        const propTypesNode = node.properties.find(property => property.type === 'Property' && property.key.name === 'propTypes');
-
-        if (propTypesNode) {
-          context.report({
-            node: propTypesNode,
-            message: 'Using propTypes from another component is not safe because they may be removed in production builds'
-          });
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/forbid-prop-types.js b/node_modules/eslint-plugin-react/lib/rules/forbid-prop-types.js
deleted file mode 100644
index 04b61bf..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/forbid-prop-types.js
+++ /dev/null
@@ -1,201 +0,0 @@
-/**
- * @fileoverview Forbid certain propTypes
- */
-
-'use strict';
-
-const variableUtil = require('../util/variable');
-const propsUtil = require('../util/props');
-const astUtil = require('../util/ast');
-const docsUrl = require('../util/docsUrl');
-const propWrapperUtil = require('../util/propWrapper');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-const DEFAULTS = ['any', 'array', 'object'];
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Forbid certain propTypes',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('forbid-prop-types')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        forbid: {
-          type: 'array',
-          items: {
-            type: 'string'
-          }
-        },
-        checkContextTypes: {
-          type: 'boolean'
-        },
-        checkChildContextTypes: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: true
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || {};
-    const checkContextTypes = configuration.checkContextTypes || false;
-    const checkChildContextTypes = configuration.checkChildContextTypes || false;
-
-    function isForbidden(type) {
-      const forbid = configuration.forbid || DEFAULTS;
-      return forbid.indexOf(type) >= 0;
-    }
-
-    function shouldCheckContextTypes(node) {
-      if (checkContextTypes && propsUtil.isContextTypesDeclaration(node)) {
-        return true;
-      }
-      return false;
-    }
-
-    function shouldCheckChildContextTypes(node) {
-      if (checkChildContextTypes && propsUtil.isChildContextTypesDeclaration(node)) {
-        return true;
-      }
-      return false;
-    }
-
-    /**
-     * Checks if propTypes declarations are forbidden
-     * @param {Array} declarations The array of AST nodes being checked.
-     * @returns {void}
-     */
-    function checkProperties(declarations) {
-      declarations.forEach((declaration) => {
-        if (declaration.type !== 'Property') {
-          return;
-        }
-        let target;
-        let value = declaration.value;
-        if (
-          value.type === 'MemberExpression' &&
-          value.property &&
-          value.property.name &&
-          value.property.name === 'isRequired'
-        ) {
-          value = value.object;
-        }
-        if (
-          value.type === 'CallExpression' &&
-          value.callee.type === 'MemberExpression'
-        ) {
-          value = value.callee;
-        }
-        if (value.property) {
-          target = value.property.name;
-        } else if (value.type === 'Identifier') {
-          target = value.name;
-        }
-        if (isForbidden(target)) {
-          context.report({
-            node: declaration,
-            message: `Prop type \`${target}\` is forbidden`
-          });
-        }
-      });
-    }
-
-    function checkNode(node) {
-      switch (node && node.type) {
-        case 'ObjectExpression':
-          checkProperties(node.properties);
-          break;
-        case 'Identifier': {
-          const propTypesObject = variableUtil.findVariableByName(context, node.name);
-          if (propTypesObject && propTypesObject.properties) {
-            checkProperties(propTypesObject.properties);
-          }
-          break;
-        }
-        case 'CallExpression': {
-          const innerNode = node.arguments && node.arguments[0];
-          if (propWrapperUtil.isPropWrapperFunction(context, context.getSource(node.callee)) && innerNode) {
-            checkNode(innerNode);
-          }
-          break;
-        }
-        default:
-          break;
-      }
-    }
-
-    return {
-      ClassProperty(node) {
-        if (
-          !propsUtil.isPropTypesDeclaration(node) &&
-          !shouldCheckContextTypes(node) &&
-          !shouldCheckChildContextTypes(node)
-        ) {
-          return;
-        }
-        checkNode(node.value);
-      },
-
-      MemberExpression(node) {
-        if (
-          !propsUtil.isPropTypesDeclaration(node) &&
-          !shouldCheckContextTypes(node) &&
-          !shouldCheckChildContextTypes(node)
-        ) {
-          return;
-        }
-
-        checkNode(node.parent.right);
-      },
-
-      MethodDefinition(node) {
-        if (
-          !propsUtil.isPropTypesDeclaration(node) &&
-          !shouldCheckContextTypes(node) &&
-          !shouldCheckChildContextTypes(node)
-        ) {
-          return;
-        }
-
-        const returnStatement = astUtil.findReturnStatement(node);
-
-        if (returnStatement && returnStatement.argument) {
-          checkNode(returnStatement.argument);
-        }
-      },
-
-      ObjectExpression(node) {
-        node.properties.forEach((property) => {
-          if (!property.key) {
-            return;
-          }
-
-          if (
-            !propsUtil.isPropTypesDeclaration(property) &&
-            !shouldCheckContextTypes(property) &&
-            !shouldCheckChildContextTypes(property)
-          ) {
-            return;
-          }
-          if (property.value.type === 'ObjectExpression') {
-            checkProperties(property.value.properties);
-          }
-        });
-      }
-
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/function-component-definition.js b/node_modules/eslint-plugin-react/lib/rules/function-component-definition.js
deleted file mode 100644
index e582dc4..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/function-component-definition.js
+++ /dev/null
@@ -1,193 +0,0 @@
-/**
- * @fileoverview Standardize the way function component get defined
- * @author Stefan Wullems
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-function buildFunction(template, parts) {
-  return Object.keys(parts)
-    .reduce((acc, key) => acc.replace(`{${key}}`, parts[key] || ''), template);
-}
-
-const NAMED_FUNCTION_TEMPLATES = {
-  'function-declaration': 'function {name}{typeParams}({params}){returnType} {body}',
-  'arrow-function': 'var {name}{typeAnnotation} = {typeParams}({params}){returnType} => {body}',
-  'function-expression': 'var {name}{typeAnnotation} = function{typeParams}({params}){returnType} {body}'
-};
-
-const UNNAMED_FUNCTION_TEMPLATES = {
-  'function-expression': 'function{typeParams}({params}){returnType} {body}',
-  'arrow-function': '{typeParams}({params}){returnType} => {body}'
-};
-
-const ERROR_MESSAGES = {
-  'function-declaration': 'Function component is not a function declaration',
-  'function-expression': 'Function component is not a function expression',
-  'arrow-function': 'Function component is not an arrow function'
-};
-
-function hasOneUnconstrainedTypeParam(node) {
-  if (node.typeParameters) {
-    return node.typeParameters.params.length === 1 && !node.typeParameters.params[0].constraint;
-  }
-
-  return false;
-}
-
-function hasName(node) {
-  return node.type === 'FunctionDeclaration' || node.parent.type === 'VariableDeclarator';
-}
-
-function getNodeText(prop, source) {
-  if (!prop) return null;
-  return source.slice(prop.range[0], prop.range[1]);
-}
-
-function getName(node) {
-  if (node.type === 'FunctionDeclaration') {
-    return node.id.name;
-  }
-
-  if (node.type === 'ArrowFunctionExpression' || node.type === 'FunctionExpression') {
-    return hasName(node) && node.parent.id.name;
-  }
-}
-
-function getParams(node, source) {
-  if (node.params.length === 0) return null;
-  return source.slice(node.params[0].range[0], node.params[node.params.length - 1].range[1]);
-}
-
-function getBody(node, source) {
-  const range = node.body.range;
-
-  if (node.body.type !== 'BlockStatement') {
-    return [
-      '{',
-      `  return ${source.slice(range[0], range[1])}`,
-      '}'
-    ].join('\n');
-  }
-
-  return source.slice(range[0], range[1]);
-}
-
-function getTypeAnnotation(node, source) {
-  if (!hasName(node) || node.type === 'FunctionDeclaration') return;
-
-  if (node.type === 'ArrowFunctionExpression' || node.type === 'FunctionExpression') {
-    return getNodeText(node.parent.id.typeAnnotation, source);
-  }
-}
-
-function isUnfixableBecauseOfExport(node) {
-  return node.type === 'FunctionDeclaration' && node.parent && node.parent.type === 'ExportDefaultDeclaration';
-}
-
-function isFunctionExpressionWithName(node) {
-  return node.type === 'FunctionExpression' && node.id && node.id.name;
-}
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Standardize the way function component get defined',
-      category: 'Stylistic issues',
-      recommended: false,
-      url: docsUrl('function-component-definition')
-    },
-    fixable: 'code',
-
-    schema: [{
-      type: 'object',
-      properties: {
-        namedComponents: {
-          enum: ['function-declaration', 'arrow-function', 'function-expression']
-        },
-        unnamedComponents: {
-          enum: ['arrow-function', 'function-expression']
-        }
-      }
-    }]
-  },
-
-  create: Components.detect((context, components) => {
-    const configuration = context.options[0] || {};
-
-    const namedConfig = configuration.namedComponents || 'function-declaration';
-    const unnamedConfig = configuration.unnamedComponents || 'function-expression';
-
-    function getFixer(node, options) {
-      const sourceCode = context.getSourceCode();
-      const source = sourceCode.getText();
-
-      const typeAnnotation = getTypeAnnotation(node, source);
-
-      if (options.type === 'function-declaration' && typeAnnotation) return;
-      if (options.type === 'arrow-function' && hasOneUnconstrainedTypeParam(node)) return;
-      if (isUnfixableBecauseOfExport(node)) return;
-      if (isFunctionExpressionWithName(node)) return;
-
-      return fixer => fixer.replaceTextRange(options.range, buildFunction(options.template, {
-        typeAnnotation,
-        typeParams: getNodeText(node.typeParameters, source),
-        params: getParams(node, source),
-        returnType: getNodeText(node.returnType, source),
-        body: getBody(node, source),
-        name: getName(node)
-      }));
-    }
-
-    function report(node, options) {
-      context.report({
-        node,
-        message: options.message,
-        fix: getFixer(node, options.fixerOptions)
-      });
-    }
-
-    function validate(node, functionType) {
-      if (!components.get(node)) return;
-      if (hasName(node) && namedConfig !== functionType) {
-        report(node, {
-          message: ERROR_MESSAGES[namedConfig],
-          fixerOptions: {
-            type: namedConfig,
-            template: NAMED_FUNCTION_TEMPLATES[namedConfig],
-            range: node.type === 'FunctionDeclaration' ?
-              node.range :
-              node.parent.parent.range
-          }
-        });
-      }
-      if (!hasName(node) && unnamedConfig !== functionType) {
-        report(node, {
-          message: ERROR_MESSAGES[unnamedConfig],
-          fixerOptions: {
-            type: unnamedConfig,
-            template: UNNAMED_FUNCTION_TEMPLATES[unnamedConfig],
-            range: node.range
-          }
-        });
-      }
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      FunctionDeclaration(node) { validate(node, 'function-declaration'); },
-      ArrowFunctionExpression(node) { validate(node, 'arrow-function'); },
-      FunctionExpression(node) { validate(node, 'function-expression'); }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-boolean-value.js b/node_modules/eslint-plugin-react/lib/rules/jsx-boolean-value.js
deleted file mode 100644
index 50768b5..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-boolean-value.js
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- * @fileoverview Enforce boolean attributes notation in JSX
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-const exceptionsSchema = {
-  type: 'array',
-  items: {type: 'string', minLength: 1},
-  uniqueItems: true
-};
-
-const ALWAYS = 'always';
-const NEVER = 'never';
-
-const errorData = new WeakMap();
-function getErrorData(exceptions) {
-  if (!errorData.has(exceptions)) {
-    const exceptionProps = Array.from(exceptions, name => `\`${name}\``).join(', ');
-    const exceptionsMessage = exceptions.size > 0 ? ` for the following props: ${exceptionProps}` : '';
-    errorData.set(exceptions, {exceptionsMessage});
-  }
-  return errorData.get(exceptions);
-}
-
-function isAlways(configuration, exceptions, propName) {
-  const isException = exceptions.has(propName);
-  if (configuration === ALWAYS) {
-    return !isException;
-  }
-  return isException;
-}
-
-function isNever(configuration, exceptions, propName) {
-  const isException = exceptions.has(propName);
-  if (configuration === NEVER) {
-    return !isException;
-  }
-  return isException;
-}
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce boolean attributes notation in JSX',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-boolean-value')
-    },
-    fixable: 'code',
-
-    schema: {
-      anyOf: [{
-        type: 'array',
-        items: [{enum: [ALWAYS, NEVER]}],
-        additionalItems: false
-      }, {
-        type: 'array',
-        items: [{
-          enum: [ALWAYS]
-        }, {
-          type: 'object',
-          additionalProperties: false,
-          properties: {
-            [NEVER]: exceptionsSchema
-          }
-        }],
-        additionalItems: false
-      }, {
-        type: 'array',
-        items: [{
-          enum: [NEVER]
-        }, {
-          type: 'object',
-          additionalProperties: false,
-          properties: {
-            [ALWAYS]: exceptionsSchema
-          }
-        }],
-        additionalItems: false
-      }]
-    }
-  },
-
-  create(context) {
-    const configuration = context.options[0] || NEVER;
-    const configObject = context.options[1] || {};
-    const exceptions = new Set((configuration === ALWAYS ? configObject[NEVER] : configObject[ALWAYS]) || []);
-
-    const NEVER_MESSAGE = 'Value must be omitted for boolean attributes{{exceptionsMessage}}';
-    const ALWAYS_MESSAGE = 'Value must be set for boolean attributes{{exceptionsMessage}}';
-
-    return {
-      JSXAttribute(node) {
-        const propName = node.name && node.name.name;
-        const value = node.value;
-
-        if (isAlways(configuration, exceptions, propName) && value === null) {
-          const data = getErrorData(exceptions);
-          context.report({
-            node,
-            message: ALWAYS_MESSAGE,
-            data,
-            fix(fixer) {
-              return fixer.insertTextAfter(node, '={true}');
-            }
-          });
-        }
-        if (isNever(configuration, exceptions, propName) && value && value.type === 'JSXExpressionContainer' && value.expression.value === true) {
-          const data = getErrorData(exceptions);
-          context.report({
-            node,
-            message: NEVER_MESSAGE,
-            data,
-            fix(fixer) {
-              return fixer.removeRange([node.name.range[1], value.range[1]]);
-            }
-          });
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-child-element-spacing.js b/node_modules/eslint-plugin-react/lib/rules/jsx-child-element-spacing.js
deleted file mode 100644
index 6c78257..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-child-element-spacing.js
+++ /dev/null
@@ -1,109 +0,0 @@
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// This list is taken from https://developer.mozilla.org/en-US/docs/Web/HTML/Inline_elements
-const INLINE_ELEMENTS = new Set([
-  'a',
-  'abbr',
-  'acronym',
-  'b',
-  'bdo',
-  'big',
-  'br',
-  'button',
-  'cite',
-  'code',
-  'dfn',
-  'em',
-  'i',
-  'img',
-  'input',
-  'kbd',
-  'label',
-  'map',
-  'object',
-  'q',
-  'samp',
-  'script',
-  'select',
-  'small',
-  'span',
-  'strong',
-  'sub',
-  'sup',
-  'textarea',
-  'tt',
-  'var'
-]);
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Ensures inline tags are not rendered without spaces between them',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-child-element-spacing')
-    },
-    fixable: null,
-    schema: [
-      {
-        type: 'object',
-        properties: {},
-        default: {},
-        additionalProperties: false
-      }
-    ]
-  },
-  create(context) {
-    const TEXT_FOLLOWING_ELEMENT_PATTERN = /^\s*\n\s*\S/;
-    const TEXT_PRECEDING_ELEMENT_PATTERN = /\S\s*\n\s*$/;
-
-    const elementName = node => (
-      node.openingElement &&
-      node.openingElement.name &&
-      node.openingElement.name.type === 'JSXIdentifier' &&
-      node.openingElement.name.name
-    );
-
-    const isInlineElement = node => (
-      node.type === 'JSXElement' &&
-      INLINE_ELEMENTS.has(elementName(node))
-    );
-
-    const handleJSX = (node) => {
-      let lastChild = null;
-      let child = null;
-      (node.children.concat([null])).forEach((nextChild) => {
-        if (
-          (lastChild || nextChild) &&
-          (!lastChild || isInlineElement(lastChild)) &&
-          (child && (child.type === 'Literal' || child.type === 'JSXText')) &&
-          (!nextChild || isInlineElement(nextChild)) &&
-          true
-        ) {
-          if (lastChild && child.value.match(TEXT_FOLLOWING_ELEMENT_PATTERN)) {
-            context.report({
-              node: lastChild,
-              loc: lastChild.loc.end,
-              message: `Ambiguous spacing after previous element ${elementName(lastChild)}`
-            });
-          } else if (nextChild && child.value.match(TEXT_PRECEDING_ELEMENT_PATTERN)) {
-            context.report({
-              node: nextChild,
-              loc: nextChild.loc.start,
-              message: `Ambiguous spacing before next element ${elementName(nextChild)}`
-            });
-          }
-        }
-        lastChild = child;
-        child = nextChild;
-      });
-    };
-
-    return {
-      JSXElement: handleJSX,
-      JSXFragment: handleJSX
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-closing-bracket-location.js b/node_modules/eslint-plugin-react/lib/rules/jsx-closing-bracket-location.js
deleted file mode 100644
index e0863f9..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-closing-bracket-location.js
+++ /dev/null
@@ -1,290 +0,0 @@
-/**
- * @fileoverview Validate closing bracket location in JSX
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const has = require('has');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Validate closing bracket location in JSX',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-closing-bracket-location')
-    },
-    fixable: 'code',
-
-    schema: [{
-      oneOf: [
-        {
-          enum: ['after-props', 'props-aligned', 'tag-aligned', 'line-aligned']
-        },
-        {
-          type: 'object',
-          properties: {
-            location: {
-              enum: ['after-props', 'props-aligned', 'tag-aligned', 'line-aligned']
-            }
-          },
-          additionalProperties: false
-        }, {
-          type: 'object',
-          properties: {
-            nonEmpty: {
-              enum: ['after-props', 'props-aligned', 'tag-aligned', 'line-aligned', false]
-            },
-            selfClosing: {
-              enum: ['after-props', 'props-aligned', 'tag-aligned', 'line-aligned', false]
-            }
-          },
-          additionalProperties: false
-        }
-      ]
-    }]
-  },
-
-  create(context) {
-    const MESSAGE = 'The closing bracket must be {{location}}{{details}}';
-    const MESSAGE_LOCATION = {
-      'after-props': 'placed after the last prop',
-      'after-tag': 'placed after the opening tag',
-      'props-aligned': 'aligned with the last prop',
-      'tag-aligned': 'aligned with the opening tag',
-      'line-aligned': 'aligned with the line containing the opening tag'
-    };
-    const DEFAULT_LOCATION = 'tag-aligned';
-
-    const config = context.options[0];
-    const options = {
-      nonEmpty: DEFAULT_LOCATION,
-      selfClosing: DEFAULT_LOCATION
-    };
-
-    if (typeof config === 'string') {
-      // simple shorthand [1, 'something']
-      options.nonEmpty = config;
-      options.selfClosing = config;
-    } else if (typeof config === 'object') {
-      // [1, {location: 'something'}] (back-compat)
-      if (has(config, 'location')) {
-        options.nonEmpty = config.location;
-        options.selfClosing = config.location;
-      }
-      // [1, {nonEmpty: 'something'}]
-      if (has(config, 'nonEmpty')) {
-        options.nonEmpty = config.nonEmpty;
-      }
-      // [1, {selfClosing: 'something'}]
-      if (has(config, 'selfClosing')) {
-        options.selfClosing = config.selfClosing;
-      }
-    }
-
-    /**
-     * Get expected location for the closing bracket
-     * @param {Object} tokens Locations of the opening bracket, closing bracket and last prop
-     * @return {String} Expected location for the closing bracket
-     */
-    function getExpectedLocation(tokens) {
-      let location;
-      // Is always after the opening tag if there is no props
-      if (typeof tokens.lastProp === 'undefined') {
-        location = 'after-tag';
-      // Is always after the last prop if this one is on the same line as the opening bracket
-      } else if (tokens.opening.line === tokens.lastProp.lastLine) {
-        location = 'after-props';
-      // Else use configuration dependent on selfClosing property
-      } else {
-        location = tokens.selfClosing ? options.selfClosing : options.nonEmpty;
-      }
-      return location;
-    }
-
-    /**
-     * Get the correct 0-indexed column for the closing bracket, given the
-     * expected location.
-     * @param {Object} tokens Locations of the opening bracket, closing bracket and last prop
-     * @param {String} expectedLocation Expected location for the closing bracket
-     * @return {?Number} The correct column for the closing bracket, or null
-     */
-    function getCorrectColumn(tokens, expectedLocation) {
-      switch (expectedLocation) {
-        case 'props-aligned':
-          return tokens.lastProp.column;
-        case 'tag-aligned':
-          return tokens.opening.column;
-        case 'line-aligned':
-          return tokens.openingStartOfLine.column;
-        default:
-          return null;
-      }
-    }
-
-    /**
-     * Check if the closing bracket is correctly located
-     * @param {Object} tokens Locations of the opening bracket, closing bracket and last prop
-     * @param {String} expectedLocation Expected location for the closing bracket
-     * @return {Boolean} True if the closing bracket is correctly located, false if not
-     */
-    function hasCorrectLocation(tokens, expectedLocation) {
-      switch (expectedLocation) {
-        case 'after-tag':
-          return tokens.tag.line === tokens.closing.line;
-        case 'after-props':
-          return tokens.lastProp.lastLine === tokens.closing.line;
-        case 'props-aligned':
-        case 'tag-aligned':
-        case 'line-aligned': {
-          const correctColumn = getCorrectColumn(tokens, expectedLocation);
-          return correctColumn === tokens.closing.column;
-        }
-        default:
-          return true;
-      }
-    }
-
-    /**
-     * Get the characters used for indentation on the line to be matched
-     * @param {Object} tokens Locations of the opening bracket, closing bracket and last prop
-     * @param {String} expectedLocation Expected location for the closing bracket
-     * @param {Number} [correctColumn] Expected column for the closing bracket. Default to 0
-     * @return {String} The characters used for indentation
-     */
-    function getIndentation(tokens, expectedLocation, correctColumn) {
-      correctColumn = correctColumn || 0;
-      let indentation;
-      let spaces = [];
-      switch (expectedLocation) {
-        case 'props-aligned':
-          indentation = /^\s*/.exec(context.getSourceCode().lines[tokens.lastProp.firstLine - 1])[0];
-          break;
-        case 'tag-aligned':
-        case 'line-aligned':
-          indentation = /^\s*/.exec(context.getSourceCode().lines[tokens.opening.line - 1])[0];
-          break;
-        default:
-          indentation = '';
-      }
-      if (indentation.length + 1 < correctColumn) {
-        // Non-whitespace characters were included in the column offset
-        spaces = new Array(+correctColumn + 1 - indentation.length);
-      }
-      return indentation + spaces.join(' ');
-    }
-
-    /**
-     * Get the locations of the opening bracket, closing bracket, last prop, and
-     * start of opening line.
-     * @param {ASTNode} node The node to check
-     * @return {Object} Locations of the opening bracket, closing bracket, last
-     * prop and start of opening line.
-     */
-    function getTokensLocations(node) {
-      const sourceCode = context.getSourceCode();
-      const opening = sourceCode.getFirstToken(node).loc.start;
-      const closing = sourceCode.getLastTokens(node, node.selfClosing ? 2 : 1)[0].loc.start;
-      const tag = sourceCode.getFirstToken(node.name).loc.start;
-      let lastProp;
-      if (node.attributes.length) {
-        lastProp = node.attributes[node.attributes.length - 1];
-        lastProp = {
-          column: sourceCode.getFirstToken(lastProp).loc.start.column,
-          firstLine: sourceCode.getFirstToken(lastProp).loc.start.line,
-          lastLine: sourceCode.getLastToken(lastProp).loc.end.line
-        };
-      }
-      const openingLine = sourceCode.lines[opening.line - 1];
-      const openingStartOfLine = {
-        column: /^\s*/.exec(openingLine)[0].length,
-        line: opening.line
-      };
-      return {
-        tag,
-        opening,
-        closing,
-        lastProp,
-        selfClosing: node.selfClosing,
-        openingStartOfLine
-      };
-    }
-
-    /**
-     * Get an unique ID for a given JSXOpeningElement
-     *
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {String} Unique ID (based on its range)
-     */
-    function getOpeningElementId(node) {
-      return node.range.join(':');
-    }
-
-    const lastAttributeNode = {};
-
-    return {
-      JSXAttribute(node) {
-        lastAttributeNode[getOpeningElementId(node.parent)] = node;
-      },
-
-      JSXSpreadAttribute(node) {
-        lastAttributeNode[getOpeningElementId(node.parent)] = node;
-      },
-
-      'JSXOpeningElement:exit'(node) {
-        const attributeNode = lastAttributeNode[getOpeningElementId(node)];
-        const cachedLastAttributeEndPos = attributeNode ? attributeNode.range[1] : null;
-        let expectedNextLine;
-        const tokens = getTokensLocations(node);
-        const expectedLocation = getExpectedLocation(tokens);
-
-        if (hasCorrectLocation(tokens, expectedLocation)) {
-          return;
-        }
-
-        const data = {location: MESSAGE_LOCATION[expectedLocation], details: ''};
-        const correctColumn = getCorrectColumn(tokens, expectedLocation);
-
-        if (correctColumn !== null) {
-          expectedNextLine = tokens.lastProp &&
-            (tokens.lastProp.lastLine === tokens.closing.line);
-          data.details = ` (expected column ${correctColumn + 1}${expectedNextLine ? ' on the next line)' : ')'}`;
-        }
-
-        context.report({
-          node,
-          loc: tokens.closing,
-          message: MESSAGE,
-          data,
-          fix(fixer) {
-            const closingTag = tokens.selfClosing ? '/>' : '>';
-            switch (expectedLocation) {
-              case 'after-tag':
-                if (cachedLastAttributeEndPos) {
-                  return fixer.replaceTextRange([cachedLastAttributeEndPos, node.range[1]],
-                    (expectedNextLine ? '\n' : '') + closingTag);
-                }
-                return fixer.replaceTextRange([node.name.range[1], node.range[1]],
-                  (expectedNextLine ? '\n' : ' ') + closingTag);
-              case 'after-props':
-                return fixer.replaceTextRange([cachedLastAttributeEndPos, node.range[1]],
-                  (expectedNextLine ? '\n' : '') + closingTag);
-              case 'props-aligned':
-              case 'tag-aligned':
-              case 'line-aligned':
-                return fixer.replaceTextRange([cachedLastAttributeEndPos, node.range[1]],
-                  `\n${getIndentation(tokens, expectedLocation, correctColumn)}${closingTag}`);
-              default:
-                return true;
-            }
-          }
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-closing-tag-location.js b/node_modules/eslint-plugin-react/lib/rules/jsx-closing-tag-location.js
deleted file mode 100644
index d4bf10e..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-closing-tag-location.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * @fileoverview Validate closing tag location in JSX
- * @author Ross Solomon
- */
-
-'use strict';
-
-const astUtil = require('../util/ast');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Validate closing tag location for multiline JSX',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-closing-tag-location')
-    },
-    fixable: 'whitespace'
-  },
-
-  create(context) {
-    function handleClosingElement(node) {
-      if (!node.parent) {
-        return;
-      }
-
-      const opening = node.parent.openingElement || node.parent.openingFragment;
-      if (opening.loc.start.line === node.loc.start.line) {
-        return;
-      }
-
-      if (opening.loc.start.column === node.loc.start.column) {
-        return;
-      }
-
-      let message;
-      if (!astUtil.isNodeFirstInLine(context, node)) {
-        message = 'Closing tag of a multiline JSX expression must be on its own line.';
-      } else {
-        message = 'Expected closing tag to match indentation of opening.';
-      }
-
-      context.report({
-        node,
-        loc: node.loc,
-        message,
-        fix(fixer) {
-          const indent = Array(opening.loc.start.column + 1).join(' ');
-          if (astUtil.isNodeFirstInLine(context, node)) {
-            return fixer.replaceTextRange(
-              [node.range[0] - node.loc.start.column, node.range[0]],
-              indent
-            );
-          }
-
-          return fixer.insertTextBefore(node, `\n${indent}`);
-        }
-      });
-    }
-
-    return {
-      JSXClosingElement: handleClosingElement,
-      JSXClosingFragment: handleClosingElement
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-curly-brace-presence.js b/node_modules/eslint-plugin-react/lib/rules/jsx-curly-brace-presence.js
deleted file mode 100755
index deeda0b..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-curly-brace-presence.js
+++ /dev/null
@@ -1,380 +0,0 @@
-/**
- * @fileoverview Enforce curly braces or disallow unnecessary curly brace in JSX
- * @author Jacky Ho
- * @author Simon Lydell
- */
-
-'use strict';
-
-const arrayIncludes = require('array-includes');
-
-const docsUrl = require('../util/docsUrl');
-const jsxUtil = require('../util/jsx');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-const OPTION_ALWAYS = 'always';
-const OPTION_NEVER = 'never';
-const OPTION_IGNORE = 'ignore';
-
-const OPTION_VALUES = [
-  OPTION_ALWAYS,
-  OPTION_NEVER,
-  OPTION_IGNORE
-];
-const DEFAULT_CONFIG = {props: OPTION_NEVER, children: OPTION_NEVER};
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description:
-        'Disallow unnecessary JSX expressions when literals alone are sufficient ' +
-          'or enfore JSX expressions on literals in JSX children or attributes',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-curly-brace-presence')
-    },
-    fixable: 'code',
-
-    schema: [
-      {
-        oneOf: [
-          {
-            type: 'object',
-            properties: {
-              props: {enum: OPTION_VALUES},
-              children: {enum: OPTION_VALUES}
-            },
-            additionalProperties: false
-          },
-          {
-            enum: OPTION_VALUES
-          }
-        ]
-      }
-    ]
-  },
-
-  create(context) {
-    const HTML_ENTITY_REGEX = () => /&[A-Za-z\d#]+;/g;
-    const ruleOptions = context.options[0];
-    const userConfig = typeof ruleOptions === 'string' ?
-      {props: ruleOptions, children: ruleOptions} :
-      Object.assign({}, DEFAULT_CONFIG, ruleOptions);
-
-    function containsLineTerminators(rawStringValue) {
-      return /[\n\r\u2028\u2029]/.test(rawStringValue);
-    }
-
-    function containsBackslash(rawStringValue) {
-      return arrayIncludes(rawStringValue, '\\');
-    }
-
-    function containsHTMLEntity(rawStringValue) {
-      return HTML_ENTITY_REGEX().test(rawStringValue);
-    }
-
-    function containsOnlyHtmlEntities(rawStringValue) {
-      return rawStringValue.replace(HTML_ENTITY_REGEX(), '').trim() === '';
-    }
-
-    function containsDisallowedJSXTextChars(rawStringValue) {
-      return /[{<>}]/.test(rawStringValue);
-    }
-
-    function containsQuoteCharacters(value) {
-      return /['"]/.test(value);
-    }
-
-    function escapeDoubleQuotes(rawStringValue) {
-      return rawStringValue.replace(/\\"/g, '"').replace(/"/g, '\\"');
-    }
-
-    function escapeBackslashes(rawStringValue) {
-      return rawStringValue.replace(/\\/g, '\\\\');
-    }
-
-    function needToEscapeCharacterForJSX(raw) {
-      return (
-        containsBackslash(raw) ||
-        containsHTMLEntity(raw) ||
-        containsDisallowedJSXTextChars(raw)
-      );
-    }
-
-    function containsWhitespaceExpression(child) {
-      if (child.type === 'JSXExpressionContainer') {
-        const value = child.expression.value;
-        return value ? jsxUtil.isWhiteSpaces(value) : false;
-      }
-      return false;
-    }
-
-    function isLineBreak(text) {
-      return containsLineTerminators(text) && text.trim() === '';
-    }
-
-    function wrapNonHTMLEntities(text) {
-      const HTML_ENTITY = '<HTML_ENTITY>';
-      const withCurlyBraces = text.split(HTML_ENTITY_REGEX()).map(word => (
-        word === '' ? '' : `{${JSON.stringify(word)}}`
-      )).join(HTML_ENTITY);
-
-      const htmlEntities = text.match(HTML_ENTITY_REGEX());
-      return htmlEntities.reduce((acc, htmlEntitiy) => (
-        acc.replace(HTML_ENTITY, htmlEntitiy)
-      ), withCurlyBraces);
-    }
-
-    function wrapWithCurlyBraces(rawText) {
-      if (!containsLineTerminators(rawText)) {
-        return `{${JSON.stringify(rawText)}}`;
-      }
-
-      return rawText.split('\n').map((line) => {
-        if (line.trim() === '') {
-          return line;
-        }
-        const firstCharIndex = line.search(/[^\s]/);
-        const leftWhitespace = line.slice(0, firstCharIndex);
-        const text = line.slice(firstCharIndex);
-
-        if (containsHTMLEntity(line)) {
-          return `${leftWhitespace}${wrapNonHTMLEntities(text)}`;
-        }
-        return `${leftWhitespace}{${JSON.stringify(text)}}`;
-      }).join('\n');
-    }
-
-    /**
-     * Report and fix an unnecessary curly brace violation on a node
-     * @param {ASTNode} JSXExpressionNode - The AST node with an unnecessary JSX expression
-     */
-    function reportUnnecessaryCurly(JSXExpressionNode) {
-      context.report({
-        node: JSXExpressionNode,
-        message: 'Curly braces are unnecessary here.',
-        fix(fixer) {
-          const expression = JSXExpressionNode.expression;
-          const expressionType = expression.type;
-          const parentType = JSXExpressionNode.parent.type;
-
-          let textToReplace;
-          if (parentType === 'JSXAttribute') {
-            textToReplace = `"${expressionType === 'TemplateLiteral' ?
-              expression.quasis[0].value.raw :
-              expression.raw.substring(1, expression.raw.length - 1)
-            }"`;
-          } else if (jsxUtil.isJSX(expression)) {
-            const sourceCode = context.getSourceCode();
-
-            textToReplace = sourceCode.getText(expression);
-          } else {
-            textToReplace = expressionType === 'TemplateLiteral' ?
-              expression.quasis[0].value.cooked : expression.value;
-          }
-
-          return fixer.replaceText(JSXExpressionNode, textToReplace);
-        }
-      });
-    }
-
-    function reportMissingCurly(literalNode) {
-      context.report({
-        node: literalNode,
-        message: 'Need to wrap this literal in a JSX expression.',
-        fix(fixer) {
-          // If a HTML entity name is found, bail out because it can be fixed
-          // by either using the real character or the unicode equivalent.
-          // If it contains any line terminator character, bail out as well.
-          if (
-            containsOnlyHtmlEntities(literalNode.raw) ||
-            (literalNode.parent.type === 'JSXAttribute' && containsLineTerminators(literalNode.raw)) ||
-            isLineBreak(literalNode.raw)
-          ) {
-            return null;
-          }
-
-          const expression = literalNode.parent.type === 'JSXAttribute' ?
-            `{"${escapeDoubleQuotes(escapeBackslashes(
-              literalNode.raw.substring(1, literalNode.raw.length - 1)
-            ))}"}` :
-            wrapWithCurlyBraces(literalNode.raw);
-
-          return fixer.replaceText(literalNode, expression);
-        }
-      });
-    }
-
-    function isWhiteSpaceLiteral(node) {
-      return node.type && node.type === 'Literal' && node.value && jsxUtil.isWhiteSpaces(node.value);
-    }
-
-    function isStringWithTrailingWhiteSpaces(value) {
-      return /^\s|\s$/.test(value);
-    }
-
-    function isLiteralWithTrailingWhiteSpaces(node) {
-      return node.type && node.type === 'Literal' && node.value && isStringWithTrailingWhiteSpaces(node.value);
-    }
-
-    // Bail out if there is any character that needs to be escaped in JSX
-    // because escaping decreases readiblity and the original code may be more
-    // readible anyway or intentional for other specific reasons
-    function lintUnnecessaryCurly(JSXExpressionNode) {
-      const expression = JSXExpressionNode.expression;
-      const expressionType = expression.type;
-
-      if (
-        (expressionType === 'Literal' || expressionType === 'JSXText') &&
-          typeof expression.value === 'string' &&
-          (
-            (JSXExpressionNode.parent.type === 'JSXAttribute' && !isWhiteSpaceLiteral(expression)) ||
-            !isLiteralWithTrailingWhiteSpaces(expression)
-          ) &&
-          !needToEscapeCharacterForJSX(expression.raw) && (
-          jsxUtil.isJSX(JSXExpressionNode.parent) ||
-          !containsQuoteCharacters(expression.value)
-        )
-      ) {
-        reportUnnecessaryCurly(JSXExpressionNode);
-      } else if (
-        expressionType === 'TemplateLiteral' &&
-          expression.expressions.length === 0 &&
-          expression.quasis[0].value.raw.indexOf('\n') === -1 &&
-          !isStringWithTrailingWhiteSpaces(expression.quasis[0].value.raw) &&
-          !needToEscapeCharacterForJSX(expression.quasis[0].value.raw) && (
-          jsxUtil.isJSX(JSXExpressionNode.parent) ||
-          !containsQuoteCharacters(expression.quasis[0].value.cooked)
-        )
-      ) {
-        reportUnnecessaryCurly(JSXExpressionNode);
-      } else if (jsxUtil.isJSX(expression)) {
-        reportUnnecessaryCurly(JSXExpressionNode);
-      }
-    }
-
-    function areRuleConditionsSatisfied(parent, config, ruleCondition) {
-      return (
-        parent.type === 'JSXAttribute' &&
-          typeof config.props === 'string' &&
-          config.props === ruleCondition
-      ) || (
-        jsxUtil.isJSX(parent) &&
-          typeof config.children === 'string' &&
-          config.children === ruleCondition
-      );
-    }
-
-    function getAdjacentSiblings(node, children) {
-      for (let i = 1; i < children.length - 1; i++) {
-        const child = children[i];
-        if (node === child) {
-          return [children[i - 1], children[i + 1]];
-        }
-      }
-      if (node === children[0] && children[1]) {
-        return [children[1]];
-      }
-      if (node === children[children.length - 1] && children[children.length - 2]) {
-        return [children[children.length - 2]];
-      }
-      return [];
-    }
-
-    function hasAdjacentJsxExpressionContainers(node, children) {
-      if (!children) {
-        return false;
-      }
-      const childrenExcludingWhitespaceLiteral = children.filter(child => !isWhiteSpaceLiteral(child));
-      const adjSiblings = getAdjacentSiblings(node, childrenExcludingWhitespaceLiteral);
-
-      return adjSiblings.some(x => x.type && x.type === 'JSXExpressionContainer');
-    }
-    function hasAdjacentJsx(node, children) {
-      if (!children) {
-        return false;
-      }
-      const childrenExcludingWhitespaceLiteral = children.filter(child => !isWhiteSpaceLiteral(child));
-      const adjSiblings = getAdjacentSiblings(node, childrenExcludingWhitespaceLiteral);
-
-      return adjSiblings.some(x => x.type && arrayIncludes(['JSXExpressionContainer', 'JSXElement'], x.type));
-    }
-    function shouldCheckForUnnecessaryCurly(parent, node, config) {
-      // Bail out if the parent is a JSXAttribute & its contents aren't
-      // StringLiteral or TemplateLiteral since e.g
-      // <App prop1={<CustomEl />} prop2={<CustomEl>...</CustomEl>} />
-
-      if (
-        parent.type && parent.type === 'JSXAttribute' &&
-        (node.expression && node.expression.type &&
-          node.expression.type !== 'Literal' &&
-          node.expression.type !== 'StringLiteral' &&
-          node.expression.type !== 'TemplateLiteral')
-      ) {
-        return false;
-      }
-
-      // If there are adjacent `JsxExpressionContainer` then there is no need,
-      // to check for unnecessary curly braces.
-      if (jsxUtil.isJSX(parent) && hasAdjacentJsxExpressionContainers(node, parent.children)) {
-        return false;
-      }
-      if (containsWhitespaceExpression(node) && hasAdjacentJsx(node, parent.children)) {
-        return false;
-      }
-      if (
-        parent.children &&
-        parent.children.length === 1 &&
-        containsWhitespaceExpression(node)
-      ) {
-        return false;
-      }
-
-      return areRuleConditionsSatisfied(parent, config, OPTION_NEVER);
-    }
-
-    function shouldCheckForMissingCurly(node, config) {
-      if (
-        isLineBreak(node.raw) ||
-        containsOnlyHtmlEntities(node.raw)
-      ) {
-        return false;
-      }
-      const parent = node.parent;
-      if (
-        parent.children &&
-        parent.children.length === 1 &&
-        containsWhitespaceExpression(parent.children[0])
-      ) {
-        return false;
-      }
-
-      return areRuleConditionsSatisfied(parent, config, OPTION_ALWAYS);
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      JSXExpressionContainer: (node) => {
-        if (shouldCheckForUnnecessaryCurly(node.parent, node, userConfig)) {
-          lintUnnecessaryCurly(node);
-        }
-      },
-
-      'Literal, JSXText': (node) => {
-        if (shouldCheckForMissingCurly(node, userConfig)) {
-          reportMissingCurly(node);
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-curly-newline.js b/node_modules/eslint-plugin-react/lib/rules/jsx-curly-newline.js
deleted file mode 100644
index 62823e2..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-curly-newline.js
+++ /dev/null
@@ -1,187 +0,0 @@
-/**
- * @fileoverview enforce consistent line breaks inside jsx curly
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-function getNormalizedOption(context) {
-  const rawOption = context.options[0] || 'consistent';
-
-  if (rawOption === 'consistent') {
-    return {
-      multiline: 'consistent',
-      singleline: 'consistent'
-    };
-  }
-
-  if (rawOption === 'never') {
-    return {
-      multiline: 'forbid',
-      singleline: 'forbid'
-    };
-  }
-
-  return {
-    multiline: rawOption.multiline || 'consistent',
-    singleline: rawOption.singleline || 'consistent'
-  };
-}
-
-module.exports = {
-  meta: {
-    type: 'layout',
-
-    docs: {
-      description: 'Enforce consistent line breaks inside jsx curly',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-curly-newline')
-    },
-
-    fixable: 'whitespace',
-
-    schema: [
-      {
-        oneOf: [
-          {
-            enum: ['consistent', 'never']
-          },
-          {
-            type: 'object',
-            properties: {
-              singleline: {enum: ['consistent', 'require', 'forbid']},
-              multiline: {enum: ['consistent', 'require', 'forbid']}
-            },
-            additionalProperties: false
-          }
-        ]
-      }
-    ],
-
-
-    messages: {
-      expectedBefore: 'Expected newline before \'}\'.',
-      expectedAfter: 'Expected newline after \'{\'.',
-      unexpectedBefore: 'Unexpected newline before \'{\'.',
-      unexpectedAfter: 'Unexpected newline after \'}\'.'
-    }
-  },
-
-  create(context) {
-    const sourceCode = context.getSourceCode();
-    const option = getNormalizedOption(context);
-
-    // ----------------------------------------------------------------------
-    // Helpers
-    // ----------------------------------------------------------------------
-
-    /**
-     * Determines whether two adjacent tokens are on the same line.
-     * @param {Object} left - The left token object.
-     * @param {Object} right - The right token object.
-     * @returns {boolean} Whether or not the tokens are on the same line.
-     */
-    function isTokenOnSameLine(left, right) {
-      return left.loc.end.line === right.loc.start.line;
-    }
-
-    /**
-     * Determines whether there should be newlines inside curlys
-     * @param {ASTNode} expression The expression contained in the curlys
-     * @param {boolean} hasLeftNewline `true` if the left curly has a newline in the current code.
-     * @returns {boolean} `true` if there should be newlines inside the function curlys
-     */
-    function shouldHaveNewlines(expression, hasLeftNewline) {
-      const isMultiline = expression.loc.start.line !== expression.loc.end.line;
-
-      switch (isMultiline ? option.multiline : option.singleline) {
-        case 'forbid': return false;
-        case 'require': return true;
-        case 'consistent':
-        default: return hasLeftNewline;
-      }
-    }
-
-    /**
-     * Validates curlys
-     * @param {Object} curlys An object with keys `leftParen` for the left paren token, and `rightParen` for the right paren token
-     * @param {ASTNode} expression The expression inside the curly
-     * @returns {void}
-     */
-    function validateCurlys(curlys, expression) {
-      const leftCurly = curlys.leftCurly;
-      const rightCurly = curlys.rightCurly;
-      const tokenAfterLeftCurly = sourceCode.getTokenAfter(leftCurly);
-      const tokenBeforeRightCurly = sourceCode.getTokenBefore(rightCurly);
-      const hasLeftNewline = !isTokenOnSameLine(leftCurly, tokenAfterLeftCurly);
-      const hasRightNewline = !isTokenOnSameLine(tokenBeforeRightCurly, rightCurly);
-      const needsNewlines = shouldHaveNewlines(expression, hasLeftNewline);
-
-      if (hasLeftNewline && !needsNewlines) {
-        context.report({
-          node: leftCurly,
-          messageId: 'unexpectedAfter',
-          fix(fixer) {
-            return sourceCode
-              .getText()
-              .slice(leftCurly.range[1], tokenAfterLeftCurly.range[0])
-              .trim() ?
-              null : // If there is a comment between the { and the first element, don't do a fix.
-              fixer.removeRange([leftCurly.range[1], tokenAfterLeftCurly.range[0]]);
-          }
-        });
-      } else if (!hasLeftNewline && needsNewlines) {
-        context.report({
-          node: leftCurly,
-          messageId: 'expectedAfter',
-          fix: fixer => fixer.insertTextAfter(leftCurly, '\n')
-        });
-      }
-
-      if (hasRightNewline && !needsNewlines) {
-        context.report({
-          node: rightCurly,
-          messageId: 'unexpectedBefore',
-          fix(fixer) {
-            return sourceCode
-              .getText()
-              .slice(tokenBeforeRightCurly.range[1], rightCurly.range[0])
-              .trim() ?
-              null : // If there is a comment between the last element and the }, don't do a fix.
-              fixer.removeRange([
-                tokenBeforeRightCurly.range[1],
-                rightCurly.range[0]
-              ]);
-          }
-        });
-      } else if (!hasRightNewline && needsNewlines) {
-        context.report({
-          node: rightCurly,
-          messageId: 'expectedBefore',
-          fix: fixer => fixer.insertTextBefore(rightCurly, '\n')
-        });
-      }
-    }
-
-
-    // ----------------------------------------------------------------------
-    // Public
-    // ----------------------------------------------------------------------
-
-    return {
-      JSXExpressionContainer(node) {
-        const curlyTokens = {
-          leftCurly: sourceCode.getFirstToken(node),
-          rightCurly: sourceCode.getLastToken(node)
-        };
-        validateCurlys(curlyTokens, node.expression);
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-curly-spacing.js b/node_modules/eslint-plugin-react/lib/rules/jsx-curly-spacing.js
deleted file mode 100644
index a53f24a..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-curly-spacing.js
+++ /dev/null
@@ -1,406 +0,0 @@
-/**
- * @fileoverview Enforce or disallow spaces inside of curly braces in JSX attributes.
- * @author Jamund Ferguson
- * @author Brandyn Bennett
- * @author Michael Ficarra
- * @author Vignesh Anand
- * @author Jamund Ferguson
- * @author Yannick Croissant
- * @author Erik Wendel
- */
-
-'use strict';
-
-const has = require('has');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-const SPACING = {
-  always: 'always',
-  never: 'never'
-};
-const SPACING_VALUES = [SPACING.always, SPACING.never];
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce or disallow spaces inside of curly braces in JSX attributes',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-curly-spacing')
-    },
-    fixable: 'code',
-
-    schema: {
-      definitions: {
-        basicConfig: {
-          type: 'object',
-          properties: {
-            when: {
-              enum: SPACING_VALUES
-            },
-            allowMultiline: {
-              type: 'boolean'
-            },
-            spacing: {
-              type: 'object',
-              properties: {
-                objectLiterals: {
-                  enum: SPACING_VALUES
-                }
-              }
-            }
-          }
-        },
-        basicConfigOrBoolean: {
-          oneOf: [{
-            $ref: '#/definitions/basicConfig'
-          }, {
-            type: 'boolean'
-          }]
-        }
-      },
-      type: 'array',
-      items: [{
-        oneOf: [{
-          allOf: [{
-            $ref: '#/definitions/basicConfig'
-          }, {
-            type: 'object',
-            properties: {
-              attributes: {
-                $ref: '#/definitions/basicConfigOrBoolean'
-              },
-              children: {
-                $ref: '#/definitions/basicConfigOrBoolean'
-              }
-            }
-          }]
-        }, {
-          enum: SPACING_VALUES
-        }]
-      }, {
-        type: 'object',
-        properties: {
-          allowMultiline: {
-            type: 'boolean'
-          },
-          spacing: {
-            type: 'object',
-            properties: {
-              objectLiterals: {
-                enum: SPACING_VALUES
-              }
-            }
-          }
-        },
-        additionalProperties: false
-      }]
-    }
-  },
-
-  create(context) {
-    function normalizeConfig(configOrTrue, defaults, lastPass) {
-      const config = configOrTrue === true ? {} : configOrTrue;
-      const when = config.when || defaults.when;
-      const allowMultiline = has(config, 'allowMultiline') ? config.allowMultiline : defaults.allowMultiline;
-      const spacing = config.spacing || {};
-      let objectLiteralSpaces = spacing.objectLiterals || defaults.objectLiteralSpaces;
-      if (lastPass) {
-        // On the final pass assign the values that should be derived from others if they are still undefined
-        objectLiteralSpaces = objectLiteralSpaces || when;
-      }
-
-      return {
-        when,
-        allowMultiline,
-        objectLiteralSpaces
-      };
-    }
-
-    const DEFAULT_WHEN = SPACING.never;
-    const DEFAULT_ALLOW_MULTILINE = true;
-    const DEFAULT_ATTRIBUTES = true;
-    const DEFAULT_CHILDREN = false;
-
-    let originalConfig = context.options[0] || {};
-    if (SPACING_VALUES.indexOf(originalConfig) !== -1) {
-      originalConfig = Object.assign({when: context.options[0]}, context.options[1]);
-    }
-    const defaultConfig = normalizeConfig(originalConfig, {
-      when: DEFAULT_WHEN,
-      allowMultiline: DEFAULT_ALLOW_MULTILINE
-    });
-    const attributes = has(originalConfig, 'attributes') ? originalConfig.attributes : DEFAULT_ATTRIBUTES;
-    const attributesConfig = attributes ? normalizeConfig(attributes, defaultConfig, true) : null;
-    const children = has(originalConfig, 'children') ? originalConfig.children : DEFAULT_CHILDREN;
-    const childrenConfig = children ? normalizeConfig(children, defaultConfig, true) : null;
-
-    // --------------------------------------------------------------------------
-    // Helpers
-    // --------------------------------------------------------------------------
-
-    /**
-     * Determines whether two adjacent tokens have a newline between them.
-     * @param {Object} left - The left token object.
-     * @param {Object} right - The right token object.
-     * @returns {boolean} Whether or not there is a newline between the tokens.
-     */
-    function isMultiline(left, right) {
-      return left.loc.end.line !== right.loc.start.line;
-    }
-
-    /**
-     * Trims text of whitespace between two ranges
-     * @param {Fixer} fixer - the eslint fixer object
-     * @param {number} fromLoc - the start location
-     * @param {number} toLoc - the end location
-     * @param {string} mode - either 'start' or 'end'
-     * @param {string=} spacing - a spacing value that will optionally add a space to the removed text
-     * @returns {Object|*|{range, text}}
-     */
-    function fixByTrimmingWhitespace(fixer, fromLoc, toLoc, mode, spacing) {
-      let replacementText = context.getSourceCode().text.slice(fromLoc, toLoc);
-      if (mode === 'start') {
-        replacementText = replacementText.replace(/^\s+/gm, '');
-      } else {
-        replacementText = replacementText.replace(/\s+$/gm, '');
-      }
-      if (spacing === SPACING.always) {
-        if (mode === 'start') {
-          replacementText += ' ';
-        } else {
-          replacementText = ` ${replacementText}`;
-        }
-      }
-      return fixer.replaceTextRange([fromLoc, toLoc], replacementText);
-    }
-
-    /**
-    * Reports that there shouldn't be a newline after the first token
-    * @param {ASTNode} node - The node to report in the event of an error.
-    * @param {Token} token - The token to use for the report.
-    * @param {string} spacing
-    * @returns {void}
-    */
-    function reportNoBeginningNewline(node, token, spacing) {
-      context.report({
-        node,
-        loc: token.loc.start,
-        message: `There should be no newline after '${token.value}'`,
-        fix(fixer) {
-          const nextToken = context.getSourceCode().getTokenAfter(token);
-          return fixByTrimmingWhitespace(fixer, token.range[1], nextToken.range[0], 'start', spacing);
-        }
-      });
-    }
-
-    /**
-    * Reports that there shouldn't be a newline before the last token
-    * @param {ASTNode} node - The node to report in the event of an error.
-    * @param {Token} token - The token to use for the report.
-    * @param {string} spacing
-    * @returns {void}
-    */
-    function reportNoEndingNewline(node, token, spacing) {
-      context.report({
-        node,
-        loc: token.loc.start,
-        message: `There should be no newline before '${token.value}'`,
-        fix(fixer) {
-          const previousToken = context.getSourceCode().getTokenBefore(token);
-          return fixByTrimmingWhitespace(fixer, previousToken.range[1], token.range[0], 'end', spacing);
-        }
-      });
-    }
-
-    /**
-    * Reports that there shouldn't be a space after the first token
-    * @param {ASTNode} node - The node to report in the event of an error.
-    * @param {Token} token - The token to use for the report.
-    * @returns {void}
-    */
-    function reportNoBeginningSpace(node, token) {
-      context.report({
-        node,
-        loc: token.loc.start,
-        message: `There should be no space after '${token.value}'`,
-        fix(fixer) {
-          const sourceCode = context.getSourceCode();
-          const nextToken = sourceCode.getTokenAfter(token);
-          let nextComment;
-
-          // ESLint >=4.x
-          if (sourceCode.getCommentsAfter) {
-            nextComment = sourceCode.getCommentsAfter(token);
-          // ESLint 3.x
-          } else {
-            const potentialComment = sourceCode.getTokenAfter(token, {includeComments: true});
-            nextComment = nextToken === potentialComment ? [] : [potentialComment];
-          }
-
-          // Take comments into consideration to narrow the fix range to what is actually affected. (See #1414)
-          if (nextComment.length > 0) {
-            return fixByTrimmingWhitespace(fixer, token.range[1], Math.min(nextToken.range[0], nextComment[0].start), 'start');
-          }
-
-          return fixByTrimmingWhitespace(fixer, token.range[1], nextToken.range[0], 'start');
-        }
-      });
-    }
-
-    /**
-    * Reports that there shouldn't be a space before the last token
-    * @param {ASTNode} node - The node to report in the event of an error.
-    * @param {Token} token - The token to use for the report.
-    * @returns {void}
-    */
-    function reportNoEndingSpace(node, token) {
-      context.report({
-        node,
-        loc: token.loc.start,
-        message: `There should be no space before '${token.value}'`,
-        fix(fixer) {
-          const sourceCode = context.getSourceCode();
-          const previousToken = sourceCode.getTokenBefore(token);
-          let previousComment;
-
-          // ESLint >=4.x
-          if (sourceCode.getCommentsBefore) {
-            previousComment = sourceCode.getCommentsBefore(token);
-          // ESLint 3.x
-          } else {
-            const potentialComment = sourceCode.getTokenBefore(token, {includeComments: true});
-            previousComment = previousToken === potentialComment ? [] : [potentialComment];
-          }
-
-          // Take comments into consideration to narrow the fix range to what is actually affected. (See #1414)
-          if (previousComment.length > 0) {
-            return fixByTrimmingWhitespace(fixer, Math.max(previousToken.range[1], previousComment[0].end), token.range[0], 'end');
-          }
-
-          return fixByTrimmingWhitespace(fixer, previousToken.range[1], token.range[0], 'end');
-        }
-      });
-    }
-
-    /**
-    * Reports that there should be a space after the first token
-    * @param {ASTNode} node - The node to report in the event of an error.
-    * @param {Token} token - The token to use for the report.
-    * @returns {void}
-    */
-    function reportRequiredBeginningSpace(node, token) {
-      context.report({
-        node,
-        loc: token.loc.start,
-        message: `A space is required after '${token.value}'`,
-        fix(fixer) {
-          return fixer.insertTextAfter(token, ' ');
-        }
-      });
-    }
-
-    /**
-    * Reports that there should be a space before the last token
-    * @param {ASTNode} node - The node to report in the event of an error.
-    * @param {Token} token - The token to use for the report.
-    * @returns {void}
-    */
-    function reportRequiredEndingSpace(node, token) {
-      context.report({
-        node,
-        loc: token.loc.start,
-        message: `A space is required before '${token.value}'`,
-        fix(fixer) {
-          return fixer.insertTextBefore(token, ' ');
-        }
-      });
-    }
-
-    /**
-     * Determines if spacing in curly braces is valid.
-     * @param {ASTNode} node The AST node to check.
-     * @returns {void}
-     */
-    function validateBraceSpacing(node) {
-      let config;
-      switch (node.parent.type) {
-        case 'JSXAttribute':
-        case 'JSXOpeningElement':
-          config = attributesConfig;
-          break;
-
-        case 'JSXElement':
-        case 'JSXFragment':
-          config = childrenConfig;
-          break;
-
-        default:
-          return;
-      }
-      if (config === null) {
-        return;
-      }
-
-      const sourceCode = context.getSourceCode();
-      const first = context.getFirstToken(node);
-      const last = sourceCode.getLastToken(node);
-      let second = context.getTokenAfter(first, {includeComments: true});
-      let penultimate = sourceCode.getTokenBefore(last, {includeComments: true});
-
-      if (!second) {
-        second = context.getTokenAfter(first);
-        const leadingComments = sourceCode.getNodeByRangeIndex(second.range[0]).leadingComments;
-        second = leadingComments ? leadingComments[0] : second;
-      }
-      if (!penultimate) {
-        penultimate = sourceCode.getTokenBefore(last);
-        const trailingComments = sourceCode.getNodeByRangeIndex(penultimate.range[0]).trailingComments;
-        penultimate = trailingComments ? trailingComments[trailingComments.length - 1] : penultimate;
-      }
-
-      const isObjectLiteral = first.value === second.value;
-      const spacing = isObjectLiteral ? config.objectLiteralSpaces : config.when;
-      if (spacing === SPACING.always) {
-        if (!sourceCode.isSpaceBetweenTokens(first, second)) {
-          reportRequiredBeginningSpace(node, first);
-        } else if (!config.allowMultiline && isMultiline(first, second)) {
-          reportNoBeginningNewline(node, first, spacing);
-        }
-        if (!sourceCode.isSpaceBetweenTokens(penultimate, last)) {
-          reportRequiredEndingSpace(node, last);
-        } else if (!config.allowMultiline && isMultiline(penultimate, last)) {
-          reportNoEndingNewline(node, last, spacing);
-        }
-      } else if (spacing === SPACING.never) {
-        if (isMultiline(first, second)) {
-          if (!config.allowMultiline) {
-            reportNoBeginningNewline(node, first, spacing);
-          }
-        } else if (sourceCode.isSpaceBetweenTokens(first, second)) {
-          reportNoBeginningSpace(node, first);
-        }
-        if (isMultiline(penultimate, last)) {
-          if (!config.allowMultiline) {
-            reportNoEndingNewline(node, last, spacing);
-          }
-        } else if (sourceCode.isSpaceBetweenTokens(penultimate, last)) {
-          reportNoEndingSpace(node, last);
-        }
-      }
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      JSXExpressionContainer: validateBraceSpacing,
-      JSXSpreadAttribute: validateBraceSpacing
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-equals-spacing.js b/node_modules/eslint-plugin-react/lib/rules/jsx-equals-spacing.js
deleted file mode 100644
index 27f0bec..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-equals-spacing.js
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * @fileoverview Disallow or enforce spaces around equal signs in JSX attributes.
- * @author ryym
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Disallow or enforce spaces around equal signs in JSX attributes',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-equals-spacing')
-    },
-    fixable: 'code',
-
-    schema: [{
-      enum: ['always', 'never']
-    }]
-  },
-
-  create(context) {
-    const config = context.options[0];
-
-    /**
-     * Determines a given attribute node has an equal sign.
-     * @param {ASTNode} attrNode - The attribute node.
-     * @returns {boolean} Whether or not the attriute node has an equal sign.
-     */
-    function hasEqual(attrNode) {
-      return attrNode.type !== 'JSXSpreadAttribute' && attrNode.value !== null;
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      JSXOpeningElement(node) {
-        node.attributes.forEach((attrNode) => {
-          if (!hasEqual(attrNode)) {
-            return;
-          }
-
-          const sourceCode = context.getSourceCode();
-          const equalToken = sourceCode.getTokenAfter(attrNode.name);
-          const spacedBefore = sourceCode.isSpaceBetweenTokens(attrNode.name, equalToken);
-          const spacedAfter = sourceCode.isSpaceBetweenTokens(equalToken, attrNode.value);
-
-          switch (config) {
-            default:
-            case 'never':
-              if (spacedBefore) {
-                context.report({
-                  node: attrNode,
-                  loc: equalToken.loc.start,
-                  message: 'There should be no space before \'=\'',
-                  fix(fixer) {
-                    return fixer.removeRange([attrNode.name.range[1], equalToken.range[0]]);
-                  }
-                });
-              }
-              if (spacedAfter) {
-                context.report({
-                  node: attrNode,
-                  loc: equalToken.loc.start,
-                  message: 'There should be no space after \'=\'',
-                  fix(fixer) {
-                    return fixer.removeRange([equalToken.range[1], attrNode.value.range[0]]);
-                  }
-                });
-              }
-              break;
-            case 'always':
-              if (!spacedBefore) {
-                context.report({
-                  node: attrNode,
-                  loc: equalToken.loc.start,
-                  message: 'A space is required before \'=\'',
-                  fix(fixer) {
-                    return fixer.insertTextBefore(equalToken, ' ');
-                  }
-                });
-              }
-              if (!spacedAfter) {
-                context.report({
-                  node: attrNode,
-                  loc: equalToken.loc.start,
-                  message: 'A space is required after \'=\'',
-                  fix(fixer) {
-                    return fixer.insertTextAfter(equalToken, ' ');
-                  }
-                });
-              }
-              break;
-          }
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-filename-extension.js b/node_modules/eslint-plugin-react/lib/rules/jsx-filename-extension.js
deleted file mode 100644
index 3d23cb4..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-filename-extension.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * @fileoverview Restrict file extensions that may contain JSX
- * @author Joe Lencioni
- */
-
-'use strict';
-
-const path = require('path');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-const DEFAULTS = {
-  extensions: ['.jsx']
-};
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Restrict file extensions that may contain JSX',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-filename-extension')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        extensions: {
-          type: 'array',
-          items: {
-            type: 'string'
-          }
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    let invalidExtension;
-    let invalidNode;
-
-    function getExtensionsConfig() {
-      return context.options[0] && context.options[0].extensions || DEFAULTS.extensions;
-    }
-
-    function handleJSX(node) {
-      const filename = context.getFilename();
-      if (filename === '<text>') {
-        return;
-      }
-
-      if (invalidNode) {
-        return;
-      }
-
-      const allowedExtensions = getExtensionsConfig();
-      const isAllowedExtension = allowedExtensions.some(extension => filename.slice(-extension.length) === extension);
-
-      if (isAllowedExtension) {
-        return;
-      }
-
-      invalidNode = node;
-      invalidExtension = path.extname(filename);
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      JSXElement: handleJSX,
-      JSXFragment: handleJSX,
-
-      'Program:exit'() {
-        if (!invalidNode) {
-          return;
-        }
-
-        context.report({
-          node: invalidNode,
-          message: `JSX not allowed in files with extension '${invalidExtension}'`
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-first-prop-new-line.js b/node_modules/eslint-plugin-react/lib/rules/jsx-first-prop-new-line.js
deleted file mode 100644
index 30b4a57..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-first-prop-new-line.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * @fileoverview Ensure proper position of the first property in JSX
- * @author Joachim Seminck
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Ensure proper position of the first property in JSX',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-first-prop-new-line')
-    },
-    fixable: 'code',
-
-    schema: [{
-      enum: ['always', 'never', 'multiline', 'multiline-multiprop']
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || 'multiline-multiprop';
-
-    function isMultilineJSX(jsxNode) {
-      return jsxNode.loc.start.line < jsxNode.loc.end.line;
-    }
-
-    return {
-      JSXOpeningElement(node) {
-        if (
-          (configuration === 'multiline' && isMultilineJSX(node)) ||
-          (configuration === 'multiline-multiprop' && isMultilineJSX(node) && node.attributes.length > 1) ||
-          (configuration === 'always')
-        ) {
-          node.attributes.some((decl) => {
-            if (decl.loc.start.line === node.loc.start.line) {
-              context.report({
-                node: decl,
-                message: 'Property should be placed on a new line',
-                fix(fixer) {
-                  return fixer.replaceTextRange([node.name.range[1], decl.range[0]], '\n');
-                }
-              });
-            }
-            return true;
-          });
-        } else if (configuration === 'never' && node.attributes.length > 0) {
-          const firstNode = node.attributes[0];
-          if (node.loc.start.line < firstNode.loc.start.line) {
-            context.report({
-              node: firstNode,
-              message: 'Property should be placed on the same line as the component declaration',
-              fix(fixer) {
-                return fixer.replaceTextRange([node.name.range[1], firstNode.range[0]], ' ');
-              }
-            });
-          }
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-fragments.js b/node_modules/eslint-plugin-react/lib/rules/jsx-fragments.js
deleted file mode 100644
index d2ec3ab..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-fragments.js
+++ /dev/null
@@ -1,190 +0,0 @@
-/**
- * @fileoverview Enforce shorthand or standard form for React fragments.
- * @author Alex Zherdev
- */
-
-'use strict';
-
-const elementType = require('jsx-ast-utils/elementType');
-const pragmaUtil = require('../util/pragma');
-const variableUtil = require('../util/variable');
-const versionUtil = require('../util/version');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-function replaceNode(source, node, text) {
-  return `${source.slice(0, node.range[0])}${text}${source.slice(node.range[1])}`;
-}
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce shorthand or standard form for React fragments',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-fragments')
-    },
-    fixable: 'code',
-
-    schema: [{
-      enum: ['syntax', 'element']
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || 'syntax';
-    const reactPragma = pragmaUtil.getFromContext(context);
-    const fragmentPragma = pragmaUtil.getFragmentFromContext(context);
-    const openFragShort = '<>';
-    const closeFragShort = '</>';
-    const openFragLong = `<${reactPragma}.${fragmentPragma}>`;
-    const closeFragLong = `</${reactPragma}.${fragmentPragma}>`;
-
-    function reportOnReactVersion(node) {
-      if (!versionUtil.testReactVersion(context, '16.2.0')) {
-        context.report({
-          node,
-          message: 'Fragments are only supported starting from React v16.2. ' +
-            'Please disable the `react/jsx-fragments` rule in ESLint settings or upgrade your version of React.'
-        });
-        return true;
-      }
-
-      return false;
-    }
-
-    function getFixerToLong(jsxFragment) {
-      const sourceCode = context.getSourceCode();
-      return function fix(fixer) {
-        let source = sourceCode.getText();
-        source = replaceNode(source, jsxFragment.closingFragment, closeFragLong);
-        source = replaceNode(source, jsxFragment.openingFragment, openFragLong);
-        const lengthDiff = openFragLong.length - sourceCode.getText(jsxFragment.openingFragment).length +
-          closeFragLong.length - sourceCode.getText(jsxFragment.closingFragment).length;
-        const range = jsxFragment.range;
-        return fixer.replaceTextRange(range, source.slice(range[0], range[1] + lengthDiff));
-      };
-    }
-
-    function getFixerToShort(jsxElement) {
-      const sourceCode = context.getSourceCode();
-      return function fix(fixer) {
-        let source = sourceCode.getText();
-        let lengthDiff;
-        if (jsxElement.closingElement) {
-          source = replaceNode(source, jsxElement.closingElement, closeFragShort);
-          source = replaceNode(source, jsxElement.openingElement, openFragShort);
-          lengthDiff = sourceCode.getText(jsxElement.openingElement).length - openFragShort.length +
-            sourceCode.getText(jsxElement.closingElement).length - closeFragShort.length;
-        } else {
-          source = replaceNode(source, jsxElement.openingElement, `${openFragShort}${closeFragShort}`);
-          lengthDiff = sourceCode.getText(jsxElement.openingElement).length - openFragShort.length -
-            closeFragShort.length;
-        }
-
-        const range = jsxElement.range;
-        return fixer.replaceTextRange(range, source.slice(range[0], range[1] - lengthDiff));
-      };
-    }
-
-    function refersToReactFragment(name) {
-      const variableInit = variableUtil.findVariableByName(context, name);
-      if (!variableInit) {
-        return false;
-      }
-
-      // const { Fragment } = React;
-      if (variableInit.type === 'Identifier' && variableInit.name === reactPragma) {
-        return true;
-      }
-
-      // const Fragment = React.Fragment;
-      if (
-        variableInit.type === 'MemberExpression' &&
-        variableInit.object.type === 'Identifier' &&
-        variableInit.object.name === reactPragma &&
-        variableInit.property.type === 'Identifier' &&
-        variableInit.property.name === fragmentPragma
-      ) {
-        return true;
-      }
-
-      // const { Fragment } = require('react');
-      if (
-        variableInit.callee &&
-        variableInit.callee.name === 'require' &&
-        variableInit.arguments &&
-        variableInit.arguments[0] &&
-        variableInit.arguments[0].value === 'react'
-      ) {
-        return true;
-      }
-
-      return false;
-    }
-
-    const jsxElements = [];
-    const fragmentNames = new Set([`${reactPragma}.${fragmentPragma}`]);
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      JSXElement(node) {
-        jsxElements.push(node);
-      },
-
-      JSXFragment(node) {
-        if (reportOnReactVersion(node)) {
-          return;
-        }
-
-        if (configuration === 'element') {
-          context.report({
-            node,
-            message: `Prefer ${reactPragma}.${fragmentPragma} over fragment shorthand`,
-            fix: getFixerToLong(node)
-          });
-        }
-      },
-
-      ImportDeclaration(node) {
-        if (node.source && node.source.value === 'react') {
-          node.specifiers.forEach((spec) => {
-            if (spec.imported && spec.imported.name === fragmentPragma) {
-              if (spec.local) {
-                fragmentNames.add(spec.local.name);
-              }
-            }
-          });
-        }
-      },
-
-      'Program:exit'() {
-        jsxElements.forEach((node) => {
-          const openingEl = node.openingElement;
-          const elName = elementType(openingEl);
-
-          if (fragmentNames.has(elName) || refersToReactFragment(elName)) {
-            if (reportOnReactVersion(node)) {
-              return;
-            }
-
-            const attrs = openingEl.attributes;
-            if (configuration === 'syntax' && !(attrs && attrs.length > 0)) {
-              context.report({
-                node,
-                message: `Prefer fragment shorthand over ${reactPragma}.${fragmentPragma}`,
-                fix: getFixerToShort(node)
-              });
-            }
-          }
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-handler-names.js b/node_modules/eslint-plugin-react/lib/rules/jsx-handler-names.js
deleted file mode 100644
index 7c2b34a..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-handler-names.js
+++ /dev/null
@@ -1,127 +0,0 @@
-/**
- * @fileoverview Enforce event handler naming conventions in JSX
- * @author Jake Marsh
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce event handler naming conventions in JSX',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-handler-names')
-    },
-
-    schema: [{
-      anyOf: [
-        {
-          type: 'object',
-          properties: {
-            eventHandlerPrefix: {type: 'string'},
-            eventHandlerPropPrefix: {type: 'string'},
-            checkLocalVariables: {type: 'boolean'}
-          },
-          additionalProperties: false
-        }, {
-          type: 'object',
-          properties: {
-            eventHandlerPrefix: {type: 'string'},
-            eventHandlerPropPrefix: {
-              type: 'boolean',
-              enum: [false]
-            },
-            checkLocalVariables: {type: 'boolean'}
-          },
-          additionalProperties: false
-        }, {
-          type: 'object',
-          properties: {
-            eventHandlerPrefix: {
-              type: 'boolean',
-              enum: [false]
-            },
-            eventHandlerPropPrefix: {type: 'string'},
-            checkLocalVariables: {type: 'boolean'}
-          },
-          additionalProperties: false
-        }, {
-          type: 'object',
-          properties: {
-            checkLocalVariables: {type: 'boolean'}
-          },
-          additionalProperties: false
-        }
-      ]
-    }]
-  },
-
-  create(context) {
-    function isPrefixDisabled(prefix) {
-      return prefix === false;
-    }
-
-    const configuration = context.options[0] || {};
-
-    const eventHandlerPrefix = isPrefixDisabled(configuration.eventHandlerPrefix) ?
-      null :
-      configuration.eventHandlerPrefix || 'handle';
-    const eventHandlerPropPrefix = isPrefixDisabled(configuration.eventHandlerPropPrefix) ?
-      null :
-      configuration.eventHandlerPropPrefix || 'on';
-
-    const EVENT_HANDLER_REGEX = !eventHandlerPrefix ?
-      null :
-      new RegExp(`^((props\\.${eventHandlerPropPrefix || ''})|((.*\\.)?${eventHandlerPrefix}))[A-Z].*$`);
-    const PROP_EVENT_HANDLER_REGEX = !eventHandlerPropPrefix ?
-      null :
-      new RegExp(`^(${eventHandlerPropPrefix}[A-Z].*|ref)$`);
-
-    const checkLocal = !!configuration.checkLocalVariables;
-
-    return {
-      JSXAttribute(node) {
-        if (!node.value || !node.value.expression || (!checkLocal && !node.value.expression.object)) {
-          return;
-        }
-
-        const propKey = typeof node.name === 'object' ? node.name.name : node.name;
-        const propValue = context.getSourceCode().getText(node.value.expression).replace(/^this\.|.*::/, '');
-
-        if (propKey === 'ref') {
-          return;
-        }
-
-        const propIsEventHandler = PROP_EVENT_HANDLER_REGEX && PROP_EVENT_HANDLER_REGEX.test(propKey);
-        const propFnIsNamedCorrectly = EVENT_HANDLER_REGEX && EVENT_HANDLER_REGEX.test(propValue);
-
-        if (
-          propIsEventHandler &&
-          propFnIsNamedCorrectly !== null &&
-          !propFnIsNamedCorrectly
-        ) {
-          context.report({
-            node,
-            message: `Handler function for ${propKey} prop key must begin with '${eventHandlerPrefix}'`
-          });
-        } else if (
-          propFnIsNamedCorrectly &&
-          propIsEventHandler !== null &&
-          !propIsEventHandler
-        ) {
-          context.report({
-            node,
-            message: `Prop key for ${propValue} must begin with '${eventHandlerPropPrefix}'`
-          });
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-indent-props.js b/node_modules/eslint-plugin-react/lib/rules/jsx-indent-props.js
deleted file mode 100644
index c2bbe51..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-indent-props.js
+++ /dev/null
@@ -1,159 +0,0 @@
-/**
- * @fileoverview Validate props indentation in JSX
- * @author Yannick Croissant
-
- * This rule has been ported and modified from eslint and nodeca.
- * @author Vitaly Puzrin
- * @author Gyandeep Singh
- * @copyright 2015 Vitaly Puzrin. All rights reserved.
- * @copyright 2015 Gyandeep Singh. All rights reserved.
- Copyright (C) 2014 by Vitaly Puzrin
-
- 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.
- */
-
-'use strict';
-
-const astUtil = require('../util/ast');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Validate props indentation in JSX',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-indent-props')
-    },
-    fixable: 'code',
-
-    schema: [{
-      oneOf: [{
-        enum: ['tab', 'first']
-      }, {
-        type: 'integer'
-      }]
-    }]
-  },
-
-  create(context) {
-    const MESSAGE = 'Expected indentation of {{needed}} {{type}} {{characters}} but found {{gotten}}.';
-
-    const extraColumnStart = 0;
-    let indentType = 'space';
-    /** @type {number|'first'} */
-    let indentSize = 4;
-
-    if (context.options.length) {
-      if (context.options[0] === 'first') {
-        indentSize = 'first';
-        indentType = 'space';
-      } else if (context.options[0] === 'tab') {
-        indentSize = 1;
-        indentType = 'tab';
-      } else if (typeof context.options[0] === 'number') {
-        indentSize = context.options[0];
-        indentType = 'space';
-      }
-    }
-
-    /**
-     * Reports a given indent violation and properly pluralizes the message
-     * @param {ASTNode} node Node violating the indent rule
-     * @param {Number} needed Expected indentation character count
-     * @param {Number} gotten Indentation character count in the actual node/code
-     */
-    function report(node, needed, gotten) {
-      const msgContext = {
-        needed,
-        type: indentType,
-        characters: needed === 1 ? 'character' : 'characters',
-        gotten
-      };
-
-      context.report({
-        node,
-        message: MESSAGE,
-        data: msgContext,
-        fix(fixer) {
-          return fixer.replaceTextRange([node.range[0] - node.loc.start.column, node.range[0]],
-            Array(needed + 1).join(indentType === 'space' ? ' ' : '\t'));
-        }
-      });
-    }
-
-    /**
-     * Get node indent
-     * @param {ASTNode} node Node to examine
-     * @return {Number} Indent
-     */
-    function getNodeIndent(node) {
-      let src = context.getSourceCode().getText(node, node.loc.start.column + extraColumnStart);
-      const lines = src.split('\n');
-      src = lines[0];
-
-      let regExp;
-      if (indentType === 'space') {
-        regExp = /^[ ]+/;
-      } else {
-        regExp = /^[\t]+/;
-      }
-
-      const indent = regExp.exec(src);
-      return indent ? indent[0].length : 0;
-    }
-
-    /**
-     * Check indent for nodes list
-     * @param {ASTNode[]} nodes list of node objects
-     * @param {Number} indent needed indent
-     */
-    function checkNodesIndent(nodes, indent) {
-      nodes.forEach((node) => {
-        const nodeIndent = getNodeIndent(node);
-        if (
-          node.type !== 'ArrayExpression' && node.type !== 'ObjectExpression' &&
-          nodeIndent !== indent && astUtil.isNodeFirstInLine(context, node)
-        ) {
-          report(node, indent, nodeIndent);
-        }
-      });
-    }
-
-    return {
-      JSXOpeningElement(node) {
-        if (!node.attributes.length) {
-          return;
-        }
-        let propIndent;
-        if (indentSize === 'first') {
-          const firstPropNode = node.attributes[0];
-          propIndent = firstPropNode.loc.start.column;
-        } else {
-          const elementIndent = getNodeIndent(node);
-          propIndent = elementIndent + indentSize;
-        }
-        checkNodesIndent(node.attributes, propIndent);
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-indent.js b/node_modules/eslint-plugin-react/lib/rules/jsx-indent.js
deleted file mode 100644
index a7c4de1..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-indent.js
+++ /dev/null
@@ -1,401 +0,0 @@
-/**
- * @fileoverview Validate JSX indentation
- * @author Yannick Croissant
-
- * This rule has been ported and modified from eslint and nodeca.
- * @author Vitaly Puzrin
- * @author Gyandeep Singh
- * @copyright 2015 Vitaly Puzrin. All rights reserved.
- * @copyright 2015 Gyandeep Singh. All rights reserved.
- Copyright (C) 2014 by Vitaly Puzrin
-
- 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.
- */
-
-'use strict';
-
-const matchAll = require('string.prototype.matchall');
-
-const astUtil = require('../util/ast');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Validate JSX indentation',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-indent')
-    },
-    fixable: 'whitespace',
-    schema: [{
-      oneOf: [{
-        enum: ['tab']
-      }, {
-        type: 'integer'
-      }]
-    }, {
-      type: 'object',
-      properties: {
-        checkAttributes: {
-          type: 'boolean'
-        },
-        indentLogicalExpressions: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    const MESSAGE = 'Expected indentation of {{needed}} {{type}} {{characters}} but found {{gotten}}.';
-
-    const extraColumnStart = 0;
-    let indentType = 'space';
-    let indentSize = 4;
-
-    if (context.options.length) {
-      if (context.options[0] === 'tab') {
-        indentSize = 1;
-        indentType = 'tab';
-      } else if (typeof context.options[0] === 'number') {
-        indentSize = context.options[0];
-        indentType = 'space';
-      }
-    }
-
-    const indentChar = indentType === 'space' ? ' ' : '\t';
-    const options = context.options[1] || {};
-    const checkAttributes = options.checkAttributes || false;
-    const indentLogicalExpressions = options.indentLogicalExpressions || false;
-
-    /**
-     * Responsible for fixing the indentation issue fix
-     * @param {ASTNode} node Node violating the indent rule
-     * @param {Number} needed Expected indentation character count
-     * @returns {Function} function to be executed by the fixer
-     * @private
-     */
-    function getFixerFunction(node, needed) {
-      return function fix(fixer) {
-        const indent = Array(needed + 1).join(indentChar);
-        if (node.type === 'JSXText' || node.type === 'Literal') {
-          const regExp = /\n[\t ]*(\S)/g;
-          const fixedText = node.raw.replace(regExp, (match, p1) => `\n${indent}${p1}`);
-          return fixer.replaceText(node, fixedText);
-        }
-        return fixer.replaceTextRange(
-          [node.range[0] - node.loc.start.column, node.range[0]],
-          indent
-        );
-      };
-    }
-
-    /**
-     * Reports a given indent violation and properly pluralizes the message
-     * @param {ASTNode} node Node violating the indent rule
-     * @param {Number} needed Expected indentation character count
-     * @param {Number} gotten Indentation character count in the actual node/code
-     * @param {Object} [loc] Error line and column location
-     */
-    function report(node, needed, gotten, loc) {
-      const msgContext = {
-        needed,
-        type: indentType,
-        characters: needed === 1 ? 'character' : 'characters',
-        gotten
-      };
-
-      if (loc) {
-        context.report({
-          node,
-          loc,
-          message: MESSAGE,
-          data: msgContext,
-          fix: getFixerFunction(node, needed)
-        });
-      } else {
-        context.report({
-          node,
-          message: MESSAGE,
-          data: msgContext,
-          fix: getFixerFunction(node, needed)
-        });
-      }
-    }
-
-    /**
-     * Get node indent
-     * @param {ASTNode} node Node to examine
-     * @param {Boolean} [byLastLine] get indent of node's last line
-     * @param {Boolean} [excludeCommas] skip comma on start of line
-     * @return {Number} Indent
-     */
-    function getNodeIndent(node, byLastLine, excludeCommas) {
-      byLastLine = byLastLine || false;
-      excludeCommas = excludeCommas || false;
-
-      let src = context.getSourceCode().getText(node, node.loc.start.column + extraColumnStart);
-      const lines = src.split('\n');
-      if (byLastLine) {
-        src = lines[lines.length - 1];
-      } else {
-        src = lines[0];
-      }
-
-      const skip = excludeCommas ? ',' : '';
-
-      let regExp;
-      if (indentType === 'space') {
-        regExp = new RegExp(`^[ ${skip}]+`);
-      } else {
-        regExp = new RegExp(`^[\t${skip}]+`);
-      }
-
-      const indent = regExp.exec(src);
-      return indent ? indent[0].length : 0;
-    }
-
-    /**
-     * Check if the node is the right member of a logical expression
-     * @param {ASTNode} node The node to check
-     * @return {Boolean} true if its the case, false if not
-     */
-    function isRightInLogicalExp(node) {
-      return (
-        node.parent &&
-        node.parent.parent &&
-        node.parent.parent.type === 'LogicalExpression' &&
-        node.parent.parent.right === node.parent &&
-        !indentLogicalExpressions
-      );
-    }
-
-    /**
-     * Check if the node is the alternate member of a conditional expression
-     * @param {ASTNode} node The node to check
-     * @return {Boolean} true if its the case, false if not
-     */
-    function isAlternateInConditionalExp(node) {
-      return (
-        node.parent &&
-        node.parent.parent &&
-        node.parent.parent.type === 'ConditionalExpression' &&
-        node.parent.parent.alternate === node.parent &&
-        context.getSourceCode().getTokenBefore(node).value !== '('
-      );
-    }
-
-    /**
-     * Check if the node is within a DoExpression block but not the first expression (which need to be indented)
-     * @param {ASTNode} node The node to check
-     * @return {Boolean} true if its the case, false if not
-     */
-    function isSecondOrSubsequentExpWithinDoExp(node) {
-      /*
-        It returns true when node.parent.parent.parent.parent matches:
-
-        DoExpression({
-          ...,
-          body: BlockStatement({
-            ...,
-            body: [
-              ...,  // 1-n times
-              ExpressionStatement({
-                ...,
-                expression: JSXElement({
-                  ...,
-                  openingElement: JSXOpeningElement()  // the node
-                })
-              }),
-              ...  // 0-n times
-            ]
-          })
-        })
-
-        except:
-
-        DoExpression({
-          ...,
-          body: BlockStatement({
-            ...,
-            body: [
-              ExpressionStatement({
-                ...,
-                expression: JSXElement({
-                  ...,
-                  openingElement: JSXOpeningElement()  // the node
-                })
-              }),
-              ...  // 0-n times
-            ]
-          })
-        })
-      */
-      const isInExpStmt = (
-        node.parent &&
-        node.parent.parent &&
-        node.parent.parent.type === 'ExpressionStatement'
-      );
-      if (!isInExpStmt) {
-        return false;
-      }
-
-      const expStmt = node.parent.parent;
-      const isInBlockStmtWithinDoExp = (
-        expStmt.parent &&
-        expStmt.parent.type === 'BlockStatement' &&
-        expStmt.parent.parent &&
-        expStmt.parent.parent.type === 'DoExpression'
-      );
-      if (!isInBlockStmtWithinDoExp) {
-        return false;
-      }
-
-      const blockStmt = expStmt.parent;
-      const blockStmtFirstExp = blockStmt.body[0];
-      return !(blockStmtFirstExp === expStmt);
-    }
-
-    /**
-     * Check indent for nodes list
-     * @param {ASTNode} node The node to check
-     * @param {Number} indent needed indent
-     * @param {Boolean} [excludeCommas] skip comma on start of line
-     */
-    function checkNodesIndent(node, indent, excludeCommas) {
-      const nodeIndent = getNodeIndent(node, false, excludeCommas);
-      const isCorrectRightInLogicalExp = isRightInLogicalExp(node) && (nodeIndent - indent) === indentSize;
-      const isCorrectAlternateInCondExp = isAlternateInConditionalExp(node) && (nodeIndent - indent) === 0;
-      if (
-        nodeIndent !== indent &&
-        astUtil.isNodeFirstInLine(context, node) &&
-        !isCorrectRightInLogicalExp &&
-        !isCorrectAlternateInCondExp
-      ) {
-        report(node, indent, nodeIndent);
-      }
-    }
-
-    /**
-     * Check indent for Literal Node or JSXText Node
-     * @param {ASTNode} node The node to check
-     * @param {Number} indent needed indent
-     */
-    function checkLiteralNodeIndent(node, indent) {
-      const value = node.value;
-      const regExp = indentType === 'space' ? /\n( *)[\t ]*\S/g : /\n(\t*)[\t ]*\S/g;
-      const nodeIndentsPerLine = Array.from(
-        matchAll(String(value), regExp),
-        match => (match[1] ? match[1].length : 0)
-      );
-      const hasFirstInLineNode = nodeIndentsPerLine.length > 0;
-      if (
-        hasFirstInLineNode &&
-        !nodeIndentsPerLine.every(actualIndent => actualIndent === indent)
-      ) {
-        nodeIndentsPerLine.forEach((nodeIndent) => {
-          report(node, indent, nodeIndent);
-        });
-      }
-    }
-
-    function handleOpeningElement(node) {
-      const sourceCode = context.getSourceCode();
-      let prevToken = sourceCode.getTokenBefore(node);
-      if (!prevToken) {
-        return;
-      }
-      // Use the parent in a list or an array
-      if (prevToken.type === 'JSXText' || prevToken.type === 'Punctuator' && prevToken.value === ',') {
-        prevToken = sourceCode.getNodeByRangeIndex(prevToken.range[0]);
-        prevToken = prevToken.type === 'Literal' || prevToken.type === 'JSXText' ? prevToken.parent : prevToken;
-      // Use the first non-punctuator token in a conditional expression
-      } else if (prevToken.type === 'Punctuator' && prevToken.value === ':') {
-        do {
-          prevToken = sourceCode.getTokenBefore(prevToken);
-        } while (prevToken.type === 'Punctuator' && prevToken.value !== '/');
-        prevToken = sourceCode.getNodeByRangeIndex(prevToken.range[0]);
-        while (prevToken.parent && prevToken.parent.type !== 'ConditionalExpression') {
-          prevToken = prevToken.parent;
-        }
-      }
-      prevToken = prevToken.type === 'JSXExpressionContainer' ? prevToken.expression : prevToken;
-      const parentElementIndent = getNodeIndent(prevToken);
-      const indent = (
-        prevToken.loc.start.line === node.loc.start.line ||
-        isRightInLogicalExp(node) ||
-        isAlternateInConditionalExp(node) ||
-        isSecondOrSubsequentExpWithinDoExp(node)
-      ) ? 0 : indentSize;
-      checkNodesIndent(node, parentElementIndent + indent);
-    }
-
-    function handleClosingElement(node) {
-      if (!node.parent) {
-        return;
-      }
-      const peerElementIndent = getNodeIndent(node.parent.openingElement || node.parent.openingFragment);
-      checkNodesIndent(node, peerElementIndent);
-    }
-
-    function handleAttribute(node) {
-      if (!checkAttributes || (!node.value || node.value.type !== 'JSXExpressionContainer')) {
-        return;
-      }
-      const nameIndent = getNodeIndent(node.name);
-      const lastToken = context.getSourceCode().getLastToken(node.value);
-      const firstInLine = astUtil.getFirstNodeInLine(context, lastToken);
-      const indent = node.name.loc.start.line === firstInLine.loc.start.line ? 0 : nameIndent;
-      checkNodesIndent(firstInLine, indent);
-    }
-
-    function handleLiteral(node) {
-      if (!node.parent) {
-        return;
-      }
-      if (node.parent.type !== 'JSXElement' && node.parent.type !== 'JSXFragment') {
-        return;
-      }
-      const parentNodeIndent = getNodeIndent(node.parent);
-      checkLiteralNodeIndent(node, parentNodeIndent + indentSize);
-    }
-
-    return {
-      JSXOpeningElement: handleOpeningElement,
-      JSXOpeningFragment: handleOpeningElement,
-      JSXClosingElement: handleClosingElement,
-      JSXClosingFragment: handleClosingElement,
-      JSXAttribute: handleAttribute,
-      JSXExpressionContainer(node) {
-        if (!node.parent) {
-          return;
-        }
-        const parentNodeIndent = getNodeIndent(node.parent);
-        checkNodesIndent(node, parentNodeIndent + indentSize);
-      },
-      Literal: handleLiteral,
-      JSXText: handleLiteral
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-key.js b/node_modules/eslint-plugin-react/lib/rules/jsx-key.js
deleted file mode 100644
index 8daeebf..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-key.js
+++ /dev/null
@@ -1,121 +0,0 @@
-/**
- * @fileoverview Report missing `key` props in iterators/collection literals.
- * @author Ben Mosher
- */
-
-'use strict';
-
-const hasProp = require('jsx-ast-utils/hasProp');
-const docsUrl = require('../util/docsUrl');
-const pragmaUtil = require('../util/pragma');
-
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-const defaultOptions = {
-  checkFragmentShorthand: false
-};
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Report missing `key` props in iterators/collection literals',
-      category: 'Possible Errors',
-      recommended: true,
-      url: docsUrl('jsx-key')
-    },
-    schema: [{
-      type: 'object',
-      properties: {
-        checkFragmentShorthand: {
-          type: 'boolean',
-          default: defaultOptions.checkFragmentShorthand
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    const options = Object.assign({}, defaultOptions, context.options[0]);
-    const checkFragmentShorthand = options.checkFragmentShorthand;
-    const reactPragma = pragmaUtil.getFromContext(context);
-    const fragmentPragma = pragmaUtil.getFragmentFromContext(context);
-
-    function checkIteratorElement(node) {
-      if (node.type === 'JSXElement' && !hasProp(node.openingElement.attributes, 'key')) {
-        context.report({
-          node,
-          message: 'Missing "key" prop for element in iterator'
-        });
-      } else if (checkFragmentShorthand && node.type === 'JSXFragment') {
-        context.report({
-          node,
-          message: `Missing "key" prop for element in iterator. Shorthand fragment syntax does not support providing keys. Use ${reactPragma}.${fragmentPragma} instead`
-        });
-      }
-    }
-
-    function getReturnStatement(body) {
-      return body.filter(item => item.type === 'ReturnStatement')[0];
-    }
-
-    return {
-      JSXElement(node) {
-        if (hasProp(node.openingElement.attributes, 'key')) {
-          return;
-        }
-
-        if (node.parent.type === 'ArrayExpression') {
-          context.report({
-            node,
-            message: 'Missing "key" prop for element in array'
-          });
-        }
-      },
-
-      JSXFragment(node) {
-        if (!checkFragmentShorthand) {
-          return;
-        }
-
-        if (node.parent.type === 'ArrayExpression') {
-          context.report({
-            node,
-            message: `Missing "key" prop for element in array. Shorthand fragment syntax does not support providing keys. Use ${reactPragma}.${fragmentPragma} instead`
-          });
-        }
-      },
-
-      // Array.prototype.map
-      CallExpression(node) {
-        if (node.callee && node.callee.type !== 'MemberExpression') {
-          return;
-        }
-
-        if (node.callee && node.callee.property && node.callee.property.name !== 'map') {
-          return;
-        }
-
-        const fn = node.arguments[0];
-        const isFn = fn && fn.type === 'FunctionExpression';
-        const isArrFn = fn && fn.type === 'ArrowFunctionExpression';
-
-        if (isArrFn && (fn.body.type === 'JSXElement' || fn.body.type === 'JSXFragment')) {
-          checkIteratorElement(fn.body);
-        }
-
-        if (isFn || isArrFn) {
-          if (fn.body.type === 'BlockStatement') {
-            const returnStatement = getReturnStatement(fn.body.body);
-            if (returnStatement && returnStatement.argument) {
-              checkIteratorElement(returnStatement.argument);
-            }
-          }
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-max-depth.js b/node_modules/eslint-plugin-react/lib/rules/jsx-max-depth.js
deleted file mode 100644
index 1e0edd5..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-max-depth.js
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
- * @fileoverview Validate JSX maximum depth
- * @author Chris<wfsr@foxmail.com>
- */
-
-'use strict';
-
-const has = require('has');
-const variableUtil = require('../util/variable');
-const jsxUtil = require('../util/jsx');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Validate JSX maximum depth',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-max-depth')
-    },
-    schema: [
-      {
-        type: 'object',
-        properties: {
-          max: {
-            type: 'integer',
-            minimum: 0
-          }
-        },
-        additionalProperties: false
-      }
-    ]
-  },
-  create(context) {
-    const MESSAGE = 'Expected the depth of nested jsx elements to be <= {{needed}}, but found {{found}}.';
-    const DEFAULT_DEPTH = 2;
-
-    const option = context.options[0] || {};
-    const maxDepth = has(option, 'max') ? option.max : DEFAULT_DEPTH;
-
-    function isExpression(node) {
-      return node.type === 'JSXExpressionContainer';
-    }
-
-    function hasJSX(node) {
-      return jsxUtil.isJSX(node) || isExpression(node) && jsxUtil.isJSX(node.expression);
-    }
-
-    function isLeaf(node) {
-      const children = node.children;
-
-      return !children.length || !children.some(hasJSX);
-    }
-
-    function getDepth(node) {
-      let count = 0;
-
-      while (jsxUtil.isJSX(node.parent) || isExpression(node.parent)) {
-        node = node.parent;
-        if (jsxUtil.isJSX(node)) {
-          count++;
-        }
-      }
-
-      return count;
-    }
-
-
-    function report(node, depth) {
-      context.report({
-        node,
-        message: MESSAGE,
-        data: {
-          found: depth,
-          needed: maxDepth
-        }
-      });
-    }
-
-    function findJSXElementOrFragment(variables, name) {
-      function find(refs) {
-        let i = refs.length;
-
-        while (--i >= 0) {
-          if (has(refs[i], 'writeExpr')) {
-            const writeExpr = refs[i].writeExpr;
-
-            return jsxUtil.isJSX(writeExpr) &&
-              writeExpr ||
-              (writeExpr && writeExpr.type === 'Identifier') &&
-              findJSXElementOrFragment(variables, writeExpr.name);
-          }
-        }
-
-        return null;
-      }
-
-      const variable = variableUtil.getVariable(variables, name);
-      return variable && variable.references && find(variable.references);
-    }
-
-    function checkDescendant(baseDepth, children) {
-      baseDepth++;
-      (children || []).forEach((node) => {
-        if (!hasJSX(node)) {
-          return;
-        }
-
-        if (baseDepth > maxDepth) {
-          report(node, baseDepth);
-        } else if (!isLeaf(node)) {
-          checkDescendant(baseDepth, node.children);
-        }
-      });
-    }
-
-    function handleJSX(node) {
-      if (!isLeaf(node)) {
-        return;
-      }
-
-      const depth = getDepth(node);
-      if (depth > maxDepth) {
-        report(node, depth);
-      }
-    }
-
-    return {
-      JSXElement: handleJSX,
-      JSXFragment: handleJSX,
-
-      JSXExpressionContainer(node) {
-        if (node.expression.type !== 'Identifier') {
-          return;
-        }
-
-        const variables = variableUtil.variablesInScope(context);
-        const element = findJSXElementOrFragment(variables, node.expression.name);
-
-        if (element) {
-          const baseDepth = getDepth(node);
-          checkDescendant(baseDepth, element.children);
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-max-props-per-line.js b/node_modules/eslint-plugin-react/lib/rules/jsx-max-props-per-line.js
deleted file mode 100644
index 387a9ff..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-max-props-per-line.js
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
- * @fileoverview Limit maximum of props on a single line in JSX
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Limit maximum of props on a single line in JSX',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-max-props-per-line')
-    },
-    fixable: 'code',
-    schema: [{
-      type: 'object',
-      properties: {
-        maximum: {
-          type: 'integer',
-          minimum: 1
-        },
-        when: {
-          type: 'string',
-          enum: ['always', 'multiline']
-        }
-      }
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || {};
-    const maximum = configuration.maximum || 1;
-    const when = configuration.when || 'always';
-
-    function getPropName(propNode) {
-      if (propNode.type === 'JSXSpreadAttribute') {
-        return context.getSourceCode().getText(propNode.argument);
-      }
-      return propNode.name.name;
-    }
-
-    function generateFixFunction(line, max) {
-      const sourceCode = context.getSourceCode();
-      const output = [];
-      const front = line[0].range[0];
-      const back = line[line.length - 1].range[1];
-      for (let i = 0; i < line.length; i += max) {
-        const nodes = line.slice(i, i + max);
-        output.push(nodes.reduce((prev, curr) => {
-          if (prev === '') {
-            return sourceCode.getText(curr);
-          }
-          return `${prev} ${sourceCode.getText(curr)}`;
-        }, ''));
-      }
-      const code = output.join('\n');
-      return function fix(fixer) {
-        return fixer.replaceTextRange([front, back], code);
-      };
-    }
-
-    return {
-      JSXOpeningElement(node) {
-        if (!node.attributes.length) {
-          return;
-        }
-
-        if (when === 'multiline' && node.loc.start.line === node.loc.end.line) {
-          return;
-        }
-
-        const firstProp = node.attributes[0];
-        const linePartitionedProps = [[firstProp]];
-
-        node.attributes.reduce((last, decl) => {
-          if (last.loc.end.line === decl.loc.start.line) {
-            linePartitionedProps[linePartitionedProps.length - 1].push(decl);
-          } else {
-            linePartitionedProps.push([decl]);
-          }
-          return decl;
-        });
-
-        linePartitionedProps.forEach((propsInLine) => {
-          if (propsInLine.length > maximum) {
-            const name = getPropName(propsInLine[maximum]);
-            context.report({
-              node: propsInLine[maximum],
-              message: `Prop \`${name}\` must be placed on a new line`,
-              fix: generateFixFunction(propsInLine, maximum)
-            });
-          }
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-no-bind.js b/node_modules/eslint-plugin-react/lib/rules/jsx-no-bind.js
deleted file mode 100644
index 612f492..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-no-bind.js
+++ /dev/null
@@ -1,185 +0,0 @@
-/**
- * @fileoverview Prevents usage of Function.prototype.bind and arrow functions
- *               in React component props.
- * @author Daniel Lo Nigro <dan.cx>
- * @author Jacky Ho
- */
-
-'use strict';
-
-const propName = require('jsx-ast-utils/propName');
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-const jsxUtil = require('../util/jsx');
-
-// -----------------------------------------------------------------------------
-// Rule Definition
-// -----------------------------------------------------------------------------
-
-const violationMessageStore = {
-  bindCall: 'JSX props should not use .bind()',
-  arrowFunc: 'JSX props should not use arrow functions',
-  bindExpression: 'JSX props should not use ::',
-  func: 'JSX props should not use functions'
-};
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevents usage of Function.prototype.bind and arrow functions in React component props',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('jsx-no-bind')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        allowArrowFunctions: {
-          default: false,
-          type: 'boolean'
-        },
-        allowBind: {
-          default: false,
-          type: 'boolean'
-        },
-        allowFunctions: {
-          default: false,
-          type: 'boolean'
-        },
-        ignoreRefs: {
-          default: false,
-          type: 'boolean'
-        },
-        ignoreDOMComponents: {
-          default: false,
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create: Components.detect((context) => {
-    const configuration = context.options[0] || {};
-
-    // Keep track of all the variable names pointing to a bind call,
-    // bind expression or an arrow function in different block statements
-    const blockVariableNameSets = {};
-
-    function setBlockVariableNameSet(blockStart) {
-      blockVariableNameSets[blockStart] = {
-        arrowFunc: new Set(),
-        bindCall: new Set(),
-        bindExpression: new Set(),
-        func: new Set()
-      };
-    }
-
-    function getNodeViolationType(node) {
-      const nodeType = node.type;
-
-      if (
-        !configuration.allowBind &&
-        nodeType === 'CallExpression' &&
-        node.callee.type === 'MemberExpression' &&
-        node.callee.property.type === 'Identifier' &&
-        node.callee.property.name === 'bind'
-      ) {
-        return 'bindCall';
-      }
-      if (nodeType === 'ConditionalExpression') {
-        return getNodeViolationType(node.test) ||
-               getNodeViolationType(node.consequent) ||
-               getNodeViolationType(node.alternate);
-      }
-      if (!configuration.allowArrowFunctions && nodeType === 'ArrowFunctionExpression') {
-        return 'arrowFunc';
-      }
-      if (!configuration.allowFunctions && nodeType === 'FunctionExpression') {
-        return 'func';
-      }
-      if (!configuration.allowBind && nodeType === 'BindExpression') {
-        return 'bindExpression';
-      }
-
-      return null;
-    }
-
-    function addVariableNameToSet(violationType, variableName, blockStart) {
-      blockVariableNameSets[blockStart][violationType].add(variableName);
-    }
-
-    function getBlockStatementAncestors(node) {
-      return context.getAncestors(node).reverse().filter(
-        ancestor => ancestor.type === 'BlockStatement'
-      );
-    }
-
-    function reportVariableViolation(node, name, blockStart) {
-      const blockSets = blockVariableNameSets[blockStart];
-      const violationTypes = Object.keys(blockSets);
-
-      return violationTypes.find((type) => {
-        if (blockSets[type].has(name)) {
-          context.report({node, message: violationMessageStore[type]});
-          return true;
-        }
-
-        return false;
-      });
-    }
-
-    function findVariableViolation(node, name) {
-      getBlockStatementAncestors(node).find(
-        block => reportVariableViolation(node, name, block.start)
-      );
-    }
-
-    return {
-      BlockStatement(node) {
-        setBlockVariableNameSet(node.start);
-      },
-
-      VariableDeclarator(node) {
-        if (!node.init) {
-          return;
-        }
-        const blockAncestors = getBlockStatementAncestors(node);
-        const variableViolationType = getNodeViolationType(node.init);
-
-        if (
-          blockAncestors.length > 0 &&
-          variableViolationType &&
-          node.parent.kind === 'const' // only support const right now
-        ) {
-          addVariableNameToSet(
-            variableViolationType, node.id.name, blockAncestors[0].start
-          );
-        }
-      },
-
-      JSXAttribute(node) {
-        const isRef = configuration.ignoreRefs && propName(node) === 'ref';
-        if (isRef || !node.value || !node.value.expression) {
-          return;
-        }
-        const isDOMComponent = jsxUtil.isDOMComponent(node.parent);
-        if (configuration.ignoreDOMComponents && isDOMComponent) {
-          return;
-        }
-        const valueNode = node.value.expression;
-        const valueNodeType = valueNode.type;
-        const nodeViolationType = getNodeViolationType(valueNode);
-
-        if (valueNodeType === 'Identifier') {
-          findVariableViolation(node, valueNode.name);
-        } else if (nodeViolationType) {
-          context.report({
-            node, message: violationMessageStore[nodeViolationType]
-          });
-        }
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-no-comment-textnodes.js b/node_modules/eslint-plugin-react/lib/rules/jsx-no-comment-textnodes.js
deleted file mode 100644
index e245d11..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-no-comment-textnodes.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * @fileoverview Comments inside children section of tag should be placed inside braces.
- * @author Ben Vinegar
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Comments inside children section of tag should be placed inside braces',
-      category: 'Possible Errors',
-      recommended: true,
-      url: docsUrl('jsx-no-comment-textnodes')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {},
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    function reportLiteralNode(node) {
-      context.report({
-        node,
-        message: 'Comments inside children section of tag should be placed inside braces'
-      });
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      Literal(node) {
-        // since babel-eslint has the wrong node.raw, we'll get the source text
-        const rawValue = context.getSourceCode().getText(node);
-        if (/^\s*\/(\/|\*)/m.test(rawValue)) {
-          // inside component, e.g. <div>literal</div>
-          if (node.parent.type !== 'JSXAttribute' &&
-              node.parent.type !== 'JSXExpressionContainer' &&
-              node.parent.type.indexOf('JSX') !== -1) {
-            reportLiteralNode(node);
-          }
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-no-duplicate-props.js b/node_modules/eslint-plugin-react/lib/rules/jsx-no-duplicate-props.js
deleted file mode 100644
index 7d9e006..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-no-duplicate-props.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * @fileoverview Enforce no duplicate props
- * @author Markus Ånöstam
- */
-
-'use strict';
-
-const has = require('has');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce no duplicate props',
-      category: 'Possible Errors',
-      recommended: true,
-      url: docsUrl('jsx-no-duplicate-props')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        ignoreCase: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || {};
-    const ignoreCase = configuration.ignoreCase || false;
-
-    return {
-      JSXOpeningElement(node) {
-        const props = {};
-
-        node.attributes.forEach((decl) => {
-          if (decl.type === 'JSXSpreadAttribute') {
-            return;
-          }
-
-          let name = decl.name.name;
-
-          if (typeof name !== 'string') {
-            return;
-          }
-
-          if (ignoreCase) {
-            name = name.toLowerCase();
-          }
-
-          if (has(props, name)) {
-            context.report({
-              node: decl,
-              message: 'No duplicate props allowed'
-            });
-          } else {
-            props[name] = 1;
-          }
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-no-literals.js b/node_modules/eslint-plugin-react/lib/rules/jsx-no-literals.js
deleted file mode 100644
index f2bb83d..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-no-literals.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * @fileoverview Prevent using string literals in React component definition
- * @author Caleb Morris
- * @author David Buchan-Swanson
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent using string literals in React component definition',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-no-literals')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        noStrings: {
-          type: 'boolean'
-        },
-        allowedStrings: {
-          type: 'array',
-          uniqueItems: true,
-          items: {
-            type: 'string'
-          }
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    function trimIfString(val) {
-      return typeof val === 'string' ? val.trim() : val;
-    }
-
-    const defaults = {noStrings: false, allowedStrings: []};
-    const config = Object.assign({}, defaults, context.options[0] || {});
-    config.allowedStrings = new Set(config.allowedStrings.map(trimIfString));
-
-    const message = config.noStrings ?
-      'Strings not allowed in JSX files' :
-      'Missing JSX expression container around literal string';
-
-    function reportLiteralNode(node) {
-      context.report({
-        node,
-        message: `${message}: “${context.getSourceCode().getText(node).trim()}”`
-      });
-    }
-
-    function getParentIgnoringBinaryExpressions(node) {
-      let current = node;
-      while (current.parent.type === 'BinaryExpression') {
-        current = current.parent;
-      }
-      return current.parent;
-    }
-
-    function getValidation(node) {
-      if (config.allowedStrings.has(trimIfString(node.value))) {
-        return false;
-      }
-      const parent = getParentIgnoringBinaryExpressions(node);
-      const standard = !/^[\s]+$/.test(node.value) &&
-          typeof node.value === 'string' &&
-          parent.type.indexOf('JSX') !== -1 &&
-          parent.type !== 'JSXAttribute';
-      if (config.noStrings) {
-        return standard;
-      }
-      return standard && parent.type !== 'JSXExpressionContainer';
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-
-      Literal(node) {
-        if (getValidation(node)) {
-          reportLiteralNode(node);
-        }
-      },
-
-      JSXText(node) {
-        if (getValidation(node)) {
-          reportLiteralNode(node);
-        }
-      },
-
-      TemplateLiteral(node) {
-        const parent = getParentIgnoringBinaryExpressions(node);
-        if (config.noStrings && parent.type === 'JSXExpressionContainer') {
-          reportLiteralNode(node);
-        }
-      }
-
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-no-script-url.js b/node_modules/eslint-plugin-react/lib/rules/jsx-no-script-url.js
deleted file mode 100644
index 63cf7dd..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-no-script-url.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * @fileoverview Prevent usage of `javascript:` URLs
- * @author Sergei Startsev
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-// https://github.com/facebook/react/blob/d0ebde77f6d1232cefc0da184d731943d78e86f2/packages/react-dom/src/shared/sanitizeURL.js#L30
-/* eslint-disable-next-line max-len, no-control-regex */
-const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i;
-
-function hasJavaScriptProtocol(attr) {
-  return attr.value.type === 'Literal' &&
-    isJavaScriptProtocol.test(attr.value.value);
-}
-
-function shouldVerifyElement(node, config) {
-  const name = node.name && node.name.name;
-  return name === 'a' || config.find(i => i.name === name);
-}
-
-function shouldVerifyProp(node, config) {
-  const name = node.name && node.name.name;
-  const parentName = node.parent.name && node.parent.name.name;
-
-  if (parentName === 'a' && name === 'href') {
-    return true;
-  }
-
-  const el = config.find(i => i.name === parentName);
-  if (!el) {
-    return false;
-  }
-
-  const props = el.props || [];
-  return node.name && props.indexOf(name) !== -1;
-}
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Forbid `javascript:` URLs',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('jsx-no-script-url')
-    },
-    schema: [{
-      type: 'array',
-      uniqueItems: true,
-      items: {
-        type: 'object',
-        properties: {
-          name: {
-            type: 'string'
-          },
-          props: {
-            type: 'array',
-            items: {
-              type: 'string',
-              uniqueItems: true
-            }
-          }
-        },
-        required: ['name', 'props'],
-        additionalProperties: false
-      }
-    }]
-  },
-
-  create(context) {
-    const config = context.options[0] || [];
-    return {
-      JSXAttribute(node) {
-        const parent = node.parent;
-        if (shouldVerifyElement(parent, config) && shouldVerifyProp(node, config) && hasJavaScriptProtocol(node)) {
-          context.report({
-            node,
-            message: 'A future version of React will block javascript: URLs as a security precaution. ' +
-              'Use event handlers instead if you can. If you need to generate unsafe HTML, try using dangerouslySetInnerHTML instead.'
-          });
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-no-target-blank.js b/node_modules/eslint-plugin-react/lib/rules/jsx-no-target-blank.js
deleted file mode 100644
index 41b3de4..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-no-target-blank.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * @fileoverview Forbid target='_blank' attribute
- * @author Kevin Miller
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-const linkComponentsUtil = require('../util/linkComponents');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-function isTargetBlank(attr) {
-  return attr.name &&
-    attr.name.name === 'target' &&
-    attr.value &&
-    ((
-      attr.value.type === 'Literal' &&
-      attr.value.value.toLowerCase() === '_blank'
-    ) || (
-      attr.value.type === 'JSXExpressionContainer' &&
-      attr.value.expression &&
-      attr.value.expression.value &&
-      attr.value.expression.value.toLowerCase() === '_blank'
-    ));
-}
-
-function hasExternalLink(element, linkAttribute) {
-  return element.attributes.some(attr => attr.name &&
-      attr.name.name === linkAttribute &&
-      attr.value.type === 'Literal' &&
-      /^(?:\w+:|\/\/)/.test(attr.value.value));
-}
-
-function hasDynamicLink(element, linkAttribute) {
-  return element.attributes.some(attr => attr.name &&
-    attr.name.name === linkAttribute &&
-    attr.value.type === 'JSXExpressionContainer');
-}
-
-function hasSecureRel(element, allowReferrer) {
-  return element.attributes.find((attr) => {
-    if (attr.type === 'JSXAttribute' && attr.name.name === 'rel') {
-      const value = attr.value &&
-        ((
-          attr.value.type === 'Literal' &&
-          attr.value.value
-        ) || (
-          attr.value.type === 'JSXExpressionContainer' &&
-          attr.value.expression &&
-          attr.value.expression.value
-        ));
-      const tags = value && value.toLowerCase && value.toLowerCase().split(' ');
-      return tags && tags.indexOf('noopener') >= 0 && (allowReferrer || tags.indexOf('noreferrer') >= 0);
-    }
-    return false;
-  });
-}
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Forbid target="_blank" attribute without rel="noopener noreferrer"',
-      category: 'Best Practices',
-      recommended: true,
-      url: docsUrl('jsx-no-target-blank')
-    },
-    schema: [{
-      type: 'object',
-      properties: {
-        allowReferrer: {
-          type: 'boolean'
-        },
-        enforceDynamicLinks: {
-          enum: ['always', 'never']
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || {};
-    const allowReferrer = configuration.allowReferrer || false;
-    const enforceDynamicLinks = configuration.enforceDynamicLinks || 'always';
-    const components = linkComponentsUtil.getLinkComponents(context);
-
-    return {
-      JSXAttribute(node) {
-        if (
-          !components.has(node.parent.name.name) ||
-          !isTargetBlank(node) ||
-          hasSecureRel(node.parent, allowReferrer)
-        ) {
-          return;
-        }
-
-        const linkAttribute = components.get(node.parent.name.name);
-
-        if (hasExternalLink(node.parent, linkAttribute) || (enforceDynamicLinks === 'always' && hasDynamicLink(node.parent, linkAttribute))) {
-          context.report({
-            node,
-            message: 'Using target="_blank" without rel="noopener noreferrer" ' +
-              'is a security risk: see https://mathiasbynens.github.io/rel-noopener'
-          });
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-no-undef.js b/node_modules/eslint-plugin-react/lib/rules/jsx-no-undef.js
deleted file mode 100644
index a887e48..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-no-undef.js
+++ /dev/null
@@ -1,110 +0,0 @@
-/**
- * @fileoverview Disallow undeclared variables in JSX
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-const jsxUtil = require('../util/jsx');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Disallow undeclared variables in JSX',
-      category: 'Possible Errors',
-      recommended: true,
-      url: docsUrl('jsx-no-undef')
-    },
-    schema: [{
-      type: 'object',
-      properties: {
-        allowGlobals: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    const config = context.options[0] || {};
-    const allowGlobals = config.allowGlobals || false;
-
-    /**
-     * Compare an identifier with the variables declared in the scope
-     * @param {ASTNode} node - Identifier or JSXIdentifier node
-     * @returns {void}
-     */
-    function checkIdentifierInJSX(node) {
-      let scope = context.getScope();
-      const sourceCode = context.getSourceCode();
-      const sourceType = sourceCode.ast.sourceType;
-      let variables = scope.variables;
-      let scopeType = 'global';
-      let i;
-      let len;
-
-      // Ignore 'this' keyword (also maked as JSXIdentifier when used in JSX)
-      if (node.name === 'this') {
-        return;
-      }
-
-      if (!allowGlobals && sourceType === 'module') {
-        scopeType = 'module';
-      }
-
-      while (scope.type !== scopeType) {
-        scope = scope.upper;
-        variables = scope.variables.concat(variables);
-      }
-      if (scope.childScopes.length) {
-        variables = scope.childScopes[0].variables.concat(variables);
-        // Temporary fix for babel-eslint
-        if (scope.childScopes[0].childScopes.length) {
-          variables = scope.childScopes[0].childScopes[0].variables.concat(variables);
-        }
-      }
-
-      for (i = 0, len = variables.length; i < len; i++) {
-        if (variables[i].name === node.name) {
-          return;
-        }
-      }
-
-      context.report({
-        node,
-        message: `'${node.name}' is not defined.`
-      });
-    }
-
-    return {
-      JSXOpeningElement(node) {
-        switch (node.name.type) {
-          case 'JSXIdentifier':
-            if (jsxUtil.isDOMComponent(node)) {
-              return;
-            }
-            node = node.name;
-            break;
-          case 'JSXMemberExpression':
-            node = node.name;
-            do {
-              node = node.object;
-            } while (node && node.type !== 'JSXIdentifier');
-            break;
-          case 'JSXNamespacedName':
-            node = node.name.namespace;
-            break;
-          default:
-            break;
-        }
-        checkIdentifierInJSX(node);
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-no-useless-fragment.js b/node_modules/eslint-plugin-react/lib/rules/jsx-no-useless-fragment.js
deleted file mode 100644
index 7ff30c2..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-no-useless-fragment.js
+++ /dev/null
@@ -1,212 +0,0 @@
-/**
- * @fileoverview Disallow useless fragments
- */
-
-'use strict';
-
-const arrayIncludes = require('array-includes');
-
-const pragmaUtil = require('../util/pragma');
-const jsxUtil = require('../util/jsx');
-const docsUrl = require('../util/docsUrl');
-
-function isJSXText(node) {
-  return !!node && (node.type === 'JSXText' || node.type === 'Literal');
-}
-
-/**
- * @param {string} text
- * @returns {boolean}
- */
-function isOnlyWhitespace(text) {
-  return text.trim().length === 0;
-}
-
-/**
- * @param {ASTNode} node
- * @returns {boolean}
- */
-function isNonspaceJSXTextOrJSXCurly(node) {
-  return (isJSXText(node) && !isOnlyWhitespace(node.raw)) || node.type === 'JSXExpressionContainer';
-}
-
-/**
- * Somehow fragment like this is useful: <Foo content={<>ee eeee eeee ...</>} />
- * @param {ASTNode} node
- * @returns {boolean}
- */
-function isFragmentWithOnlyTextAndIsNotChild(node) {
-  return node.children.length === 1 &&
-    isJSXText(node.children[0]) &&
-    !(node.parent.type === 'JSXElement' || node.parent.type === 'JSXFragment');
-}
-
-/**
- * @param {string} text
- * @returns {string}
- */
-function trimLikeReact(text) {
-  const leadingSpaces = /^\s*/.exec(text)[0];
-  const trailingSpaces = /\s*$/.exec(text)[0];
-
-  const start = arrayIncludes(leadingSpaces, '\n') ? leadingSpaces.length : 0;
-  const end = arrayIncludes(trailingSpaces, '\n') ? text.length - trailingSpaces.length : text.length;
-
-  return text.slice(start, end);
-}
-
-/**
- * Test if node is like `<Fragment key={_}>_</Fragment>`
- * @param {JSXElement} node
- * @returns {boolean}
- */
-function isKeyedElement(node) {
-  return node.type === 'JSXElement' &&
-    node.openingElement.attributes &&
-    node.openingElement.attributes.some(jsxUtil.isJSXAttributeKey);
-}
-
-module.exports = {
-  meta: {
-    type: 'suggestion',
-    fixable: 'code',
-    docs: {
-      description: 'Disallow unnecessary fragments',
-      category: 'Possible Errors',
-      recommended: false,
-      url: docsUrl('jsx-no-useless-fragment')
-    },
-    messages: {
-      NeedsMoreChidren: 'Fragments should contain more than one child - otherwise, there‘s no need for a Fragment at all.',
-      ChildOfHtmlElement: 'Passing a fragment to an HTML element is useless.'
-    }
-  },
-
-  create(context) {
-    const reactPragma = pragmaUtil.getFromContext(context);
-    const fragmentPragma = pragmaUtil.getFragmentFromContext(context);
-
-    /**
-     * Test whether a node is an padding spaces trimmed by react runtime.
-     * @param {ASTNode} node
-     * @returns {boolean}
-     */
-    function isPaddingSpaces(node) {
-      return isJSXText(node) &&
-        isOnlyWhitespace(node.raw) &&
-        arrayIncludes(node.raw, '\n');
-    }
-
-    /**
-     * Test whether a JSXElement has less than two children, excluding paddings spaces.
-     * @param {JSXElement|JSXFragment} node
-     * @returns {boolean}
-     */
-    function hasLessThanTwoChildren(node) {
-      if (!node || !node.children || node.children.length < 2) {
-        return true;
-      }
-
-      return (
-        node.children.length -
-        (+isPaddingSpaces(node.children[0])) -
-        (+isPaddingSpaces(node.children[node.children.length - 1]))
-      ) < 2;
-    }
-
-    /**
-     * @param {JSXElement|JSXFragment} node
-     * @returns {boolean}
-     */
-    function isChildOfHtmlElement(node) {
-      return node.parent.type === 'JSXElement' &&
-        node.parent.openingElement.name.type === 'JSXIdentifier' &&
-        /^[a-z]+$/.test(node.parent.openingElement.name.name);
-    }
-
-    /**
-     * @param {JSXElement|JSXFragment} node
-     * @return {boolean}
-     */
-    function isChildOfComponentElement(node) {
-      return node.parent.type === 'JSXElement' &&
-        !isChildOfHtmlElement(node) &&
-        !jsxUtil.isFragment(node.parent, reactPragma, fragmentPragma);
-    }
-
-    /**
-     * @param {ASTNode} node
-     * @returns {boolean}
-     */
-    function canFix(node) {
-      // Not safe to fix fragments without a jsx parent.
-      if (!(node.parent.type === 'JSXElement' || node.parent.type === 'JSXFragment')) {
-        // const a = <></>
-        if (node.children.length === 0) {
-          return false;
-        }
-
-        // const a = <>cat {meow}</>
-        if (node.children.some(isNonspaceJSXTextOrJSXCurly)) {
-          return false;
-        }
-      }
-
-      // Not safe to fix `<Eeee><>foo</></Eeee>` because `Eeee` might require its children be a ReactElement.
-      if (isChildOfComponentElement(node)) {
-        return false;
-      }
-
-      return true;
-    }
-
-    /**
-     * @param {ASTNode} node
-     * @returns {Function | undefined}
-     */
-    function getFix(node) {
-      if (!canFix(node)) {
-        return undefined;
-      }
-
-      return function fix(fixer) {
-        const opener = node.type === 'JSXFragment' ? node.openingFragment : node.openingElement;
-        const closer = node.type === 'JSXFragment' ? node.closingFragment : node.closingElement;
-        const childrenText = context.getSourceCode().getText().slice(opener.range[1], closer.range[0]);
-
-        return fixer.replaceText(node, trimLikeReact(childrenText));
-      };
-    }
-
-    function checkNode(node) {
-      if (isKeyedElement(node)) {
-        return;
-      }
-
-      if (hasLessThanTwoChildren(node) && !isFragmentWithOnlyTextAndIsNotChild(node)) {
-        context.report({
-          node,
-          messageId: 'NeedsMoreChidren',
-          fix: getFix(node)
-        });
-      }
-
-      if (isChildOfHtmlElement(node)) {
-        context.report({
-          node,
-          messageId: 'ChildOfHtmlElement',
-          fix: getFix(node)
-        });
-      }
-    }
-
-    return {
-      JSXElement(node) {
-        if (jsxUtil.isFragment(node, reactPragma, fragmentPragma)) {
-          checkNode(node);
-        }
-      },
-      JSXFragment: checkNode
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-one-expression-per-line.js b/node_modules/eslint-plugin-react/lib/rules/jsx-one-expression-per-line.js
deleted file mode 100644
index 093969d..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-one-expression-per-line.js
+++ /dev/null
@@ -1,223 +0,0 @@
-/**
- * @fileoverview Limit to one expression per line in JSX
- * @author Mark Ivan Allen <Vydia.com>
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-const jsxUtil = require('../util/jsx');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-const optionDefaults = {
-  allow: 'none'
-};
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Limit to one expression per line in JSX',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-one-expression-per-line')
-    },
-    fixable: 'whitespace',
-    schema: [
-      {
-        type: 'object',
-        properties: {
-          allow: {
-            enum: ['none', 'literal', 'single-child']
-          }
-        },
-        default: optionDefaults,
-        additionalProperties: false
-      }
-    ]
-  },
-
-  create(context) {
-    const options = Object.assign({}, optionDefaults, context.options[0]);
-
-    function nodeKey(node) {
-      return `${node.loc.start.line},${node.loc.start.column}`;
-    }
-
-    function nodeDescriptor(n) {
-      return n.openingElement ? n.openingElement.name.name : context.getSourceCode().getText(n).replace(/\n/g, '');
-    }
-
-    function handleJSX(node) {
-      const children = node.children;
-
-      if (!children || !children.length) {
-        return;
-      }
-
-      const openingElement = node.openingElement || node.openingFragment;
-      const closingElement = node.closingElement || node.closingFragment;
-      const openingElementStartLine = openingElement.loc.start.line;
-      const openingElementEndLine = openingElement.loc.end.line;
-      const closingElementStartLine = closingElement.loc.start.line;
-      const closingElementEndLine = closingElement.loc.end.line;
-
-      if (children.length === 1) {
-        const child = children[0];
-        if (
-          openingElementStartLine === openingElementEndLine &&
-          openingElementEndLine === closingElementStartLine &&
-          closingElementStartLine === closingElementEndLine &&
-          closingElementEndLine === child.loc.start.line &&
-          child.loc.start.line === child.loc.end.line
-        ) {
-          if (
-            options.allow === 'single-child' ||
-            options.allow === 'literal' && (child.type === 'Literal' || child.type === 'JSXText')
-          ) {
-            return;
-          }
-        }
-      }
-
-      const childrenGroupedByLine = {};
-      const fixDetailsByNode = {};
-
-      children.forEach((child) => {
-        let countNewLinesBeforeContent = 0;
-        let countNewLinesAfterContent = 0;
-
-        if (child.type === 'Literal' || child.type === 'JSXText') {
-          if (jsxUtil.isWhiteSpaces(child.raw)) {
-            return;
-          }
-
-          countNewLinesBeforeContent = (child.raw.match(/^\s*\n/g) || []).length;
-          countNewLinesAfterContent = (child.raw.match(/\n\s*$/g) || []).length;
-        }
-
-        const startLine = child.loc.start.line + countNewLinesBeforeContent;
-        const endLine = child.loc.end.line - countNewLinesAfterContent;
-
-        if (startLine === endLine) {
-          if (!childrenGroupedByLine[startLine]) {
-            childrenGroupedByLine[startLine] = [];
-          }
-          childrenGroupedByLine[startLine].push(child);
-        } else {
-          if (!childrenGroupedByLine[startLine]) {
-            childrenGroupedByLine[startLine] = [];
-          }
-          childrenGroupedByLine[startLine].push(child);
-          if (!childrenGroupedByLine[endLine]) {
-            childrenGroupedByLine[endLine] = [];
-          }
-          childrenGroupedByLine[endLine].push(child);
-        }
-      });
-
-      Object.keys(childrenGroupedByLine).forEach((_line) => {
-        const line = parseInt(_line, 10);
-        const firstIndex = 0;
-        const lastIndex = childrenGroupedByLine[line].length - 1;
-
-        childrenGroupedByLine[line].forEach((child, i) => {
-          let prevChild;
-          let nextChild;
-
-          if (i === firstIndex) {
-            if (line === openingElementEndLine) {
-              prevChild = openingElement;
-            }
-          } else {
-            prevChild = childrenGroupedByLine[line][i - 1];
-          }
-
-          if (i === lastIndex) {
-            if (line === closingElementStartLine) {
-              nextChild = closingElement;
-            }
-          } else {
-            // We don't need to append a trailing because the next child will prepend a leading.
-            // nextChild = childrenGroupedByLine[line][i + 1];
-          }
-
-          function spaceBetweenPrev() {
-            return ((prevChild.type === 'Literal' || prevChild.type === 'JSXText') && / $/.test(prevChild.raw)) ||
-              ((child.type === 'Literal' || child.type === 'JSXText') && /^ /.test(child.raw)) ||
-              context.getSourceCode().isSpaceBetweenTokens(prevChild, child);
-          }
-
-          function spaceBetweenNext() {
-            return ((nextChild.type === 'Literal' || nextChild.type === 'JSXText') && /^ /.test(nextChild.raw)) ||
-              ((child.type === 'Literal' || child.type === 'JSXText') && / $/.test(child.raw)) ||
-              context.getSourceCode().isSpaceBetweenTokens(child, nextChild);
-          }
-
-          if (!prevChild && !nextChild) {
-            return;
-          }
-
-          const source = context.getSourceCode().getText(child);
-          const leadingSpace = !!(prevChild && spaceBetweenPrev());
-          const trailingSpace = !!(nextChild && spaceBetweenNext());
-          const leadingNewLine = !!prevChild;
-          const trailingNewLine = !!nextChild;
-
-          const key = nodeKey(child);
-
-          if (!fixDetailsByNode[key]) {
-            fixDetailsByNode[key] = {
-              node: child,
-              source,
-              descriptor: nodeDescriptor(child)
-            };
-          }
-
-          if (leadingSpace) {
-            fixDetailsByNode[key].leadingSpace = true;
-          }
-          if (leadingNewLine) {
-            fixDetailsByNode[key].leadingNewLine = true;
-          }
-          if (trailingNewLine) {
-            fixDetailsByNode[key].trailingNewLine = true;
-          }
-          if (trailingSpace) {
-            fixDetailsByNode[key].trailingSpace = true;
-          }
-        });
-      });
-
-      Object.keys(fixDetailsByNode).forEach((key) => {
-        const details = fixDetailsByNode[key];
-
-        const nodeToReport = details.node;
-        const descriptor = details.descriptor;
-        const source = details.source.replace(/(^ +| +(?=\n)*$)/g, '');
-
-        const leadingSpaceString = details.leadingSpace ? '\n{\' \'}' : '';
-        const trailingSpaceString = details.trailingSpace ? '{\' \'}\n' : '';
-        const leadingNewLineString = details.leadingNewLine ? '\n' : '';
-        const trailingNewLineString = details.trailingNewLine ? '\n' : '';
-
-        const replaceText = `${leadingSpaceString}${leadingNewLineString}${source}${trailingNewLineString}${trailingSpaceString}`;
-
-        context.report({
-          node: nodeToReport,
-          message: `\`${descriptor}\` must be placed on a new line`,
-          fix(fixer) {
-            return fixer.replaceText(nodeToReport, replaceText);
-          }
-        });
-      });
-    }
-
-    return {
-      JSXElement: handleJSX,
-      JSXFragment: handleJSX
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-pascal-case.js b/node_modules/eslint-plugin-react/lib/rules/jsx-pascal-case.js
deleted file mode 100644
index e6e1339..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-pascal-case.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * @fileoverview Enforce PascalCase for user-defined JSX components
- * @author Jake Marsh
- */
-
-'use strict';
-
-const elementType = require('jsx-ast-utils/elementType');
-const XRegExp = require('xregexp');
-const docsUrl = require('../util/docsUrl');
-const jsxUtil = require('../util/jsx');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-// eslint-disable-next-line no-new
-const hasU = (function hasU() { try { new RegExp('o', 'u'); return true; } catch (e) { return false; } }());
-
-const PASCAL_CASE_REGEX = XRegExp('^(.*[.])*([\\p{Lu}]|[\\p{Lu}]+[\\p{Ll}0-9]+(?:[\\p{Lu}0-9]+[\\p{Ll}0-9]*)*)$', hasU ? 'u' : '');
-const ALL_CAPS_TAG_REGEX = XRegExp('^[\\p{Lu}0-9]+([\\p{Lu}0-9_]*[\\p{Lu}0-9]+)?$', hasU ? 'u' : '');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce PascalCase for user-defined JSX components',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-pascal-case')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        allowAllCaps: {
-          type: 'boolean'
-        },
-        ignore: {
-          type: 'array'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || {};
-    const allowAllCaps = configuration.allowAllCaps || false;
-    const ignore = configuration.ignore || [];
-
-    return {
-      JSXOpeningElement(node) {
-        let name = elementType(node);
-        if (name.length === 1) return undefined;
-
-        // Get namespace if the type is JSXNamespacedName or JSXMemberExpression
-        if (name.indexOf(':') > -1) {
-          name = name.substring(0, name.indexOf(':'));
-        } else if (name.indexOf('.') > -1) {
-          name = name.substring(0, name.indexOf('.'));
-        }
-
-        const isPascalCase = PASCAL_CASE_REGEX.test(name);
-        const isCompatTag = jsxUtil.isDOMComponent(node);
-        const isAllowedAllCaps = allowAllCaps && ALL_CAPS_TAG_REGEX.test(name);
-        const isIgnored = ignore.indexOf(name) !== -1;
-
-        if (!isPascalCase && !isCompatTag && !isAllowedAllCaps && !isIgnored) {
-          let message = `Imported JSX component ${name} must be in PascalCase`;
-
-          if (allowAllCaps) {
-            message += ' or SCREAMING_SNAKE_CASE';
-          }
-
-          context.report({node, message});
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-props-no-multi-spaces.js b/node_modules/eslint-plugin-react/lib/rules/jsx-props-no-multi-spaces.js
deleted file mode 100644
index a44494e..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-props-no-multi-spaces.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * @fileoverview Disallow multiple spaces between inline JSX props
- * @author Adrian Moennich
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Disallow multiple spaces between inline JSX props',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-props-no-multi-spaces')
-    },
-    fixable: 'code',
-    schema: []
-  },
-
-  create(context) {
-    function getPropName(propNode) {
-      switch (propNode.type) {
-        case 'JSXSpreadAttribute':
-          return context.getSourceCode().getText(propNode.argument);
-        case 'JSXIdentifier':
-          return propNode.name;
-        case 'JSXMemberExpression':
-          return `${getPropName(propNode.object)}.${propNode.property.name}`;
-        default:
-          return propNode.name.name;
-      }
-    }
-
-    function checkSpacing(prev, node) {
-      if (prev.loc.end.line !== node.loc.end.line) {
-        return;
-      }
-      const between = context.getSourceCode().text.slice(prev.range[1], node.range[0]);
-      if (between !== ' ') {
-        context.report({
-          node,
-          message: `Expected only one space between "${getPropName(prev)}" and "${getPropName(node)}"`,
-          fix(fixer) {
-            return fixer.replaceTextRange([prev.range[1], node.range[0]], ' ');
-          }
-        });
-      }
-    }
-
-    function containsGenericType(node) {
-      const containsTypeParams = typeof node.typeParameters !== 'undefined';
-      return containsTypeParams && node.typeParameters.type === 'TSTypeParameterInstantiation';
-    }
-
-    function getGenericNode(node) {
-      const name = node.name;
-      if (containsGenericType(node)) {
-        const type = node.typeParameters;
-
-        return Object.assign(
-          {},
-          node,
-          {
-            range: [
-              name.range[0],
-              type.range[1]
-            ]
-          }
-        );
-      }
-
-      return name;
-    }
-
-    return {
-      JSXOpeningElement(node) {
-        node.attributes.reduce((prev, prop) => {
-          checkSpacing(prev, prop);
-          return prop;
-        }, getGenericNode(node));
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-props-no-spreading.js b/node_modules/eslint-plugin-react/lib/rules/jsx-props-no-spreading.js
deleted file mode 100644
index 76e5b0b..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-props-no-spreading.js
+++ /dev/null
@@ -1,127 +0,0 @@
-/**
- * @fileoverview Prevent JSX prop spreading
- * @author Ashish Gambhir
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-const OPTIONS = {ignore: 'ignore', enforce: 'enforce'};
-const DEFAULTS = {
-  html: OPTIONS.enforce,
-  custom: OPTIONS.enforce,
-  explicitSpread: OPTIONS.enforce,
-  exceptions: []
-};
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent JSX prop spreading',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('jsx-props-no-spreading')
-    },
-    schema: [{
-      allOf: [{
-        type: 'object',
-        properties: {
-          html: {
-            enum: [OPTIONS.enforce, OPTIONS.ignore]
-          },
-          custom: {
-            enum: [OPTIONS.enforce, OPTIONS.ignore]
-          },
-          exceptions: {
-            type: 'array',
-            items: {
-              type: 'string',
-              uniqueItems: true
-            }
-          }
-        }
-      }, {
-        not: {
-          type: 'object',
-          required: ['html', 'custom'],
-          properties: {
-            html: {
-              enum: [OPTIONS.ignore]
-            },
-            custom: {
-              enum: [OPTIONS.ignore]
-            },
-            exceptions: {
-              type: 'array',
-              minItems: 0,
-              maxItems: 0
-            }
-          }
-        }
-      }]
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || {};
-    const ignoreHtmlTags = (configuration.html || DEFAULTS.html) === OPTIONS.ignore;
-    const ignoreCustomTags = (configuration.custom || DEFAULTS.custom) === OPTIONS.ignore;
-    const ignoreExplicitSpread = (configuration.explicitSpread || DEFAULTS.explicitSpread) === OPTIONS.ignore;
-    const exceptions = configuration.exceptions || DEFAULTS.exceptions;
-    const isException = (tag, allExceptions) => allExceptions.indexOf(tag) !== -1;
-    const isProperty = property => property.type === 'Property';
-    const getTagNameFromMemberExpression = node => `${node.property.parent.object.name}.${node.property.name}`;
-    return {
-      JSXSpreadAttribute(node) {
-        const jsxOpeningElement = node.parent.name;
-        const type = jsxOpeningElement.type;
-
-        let tagName;
-        if (type === 'JSXIdentifier') {
-          tagName = jsxOpeningElement.name;
-        } else if (type === 'JSXMemberExpression') {
-          tagName = getTagNameFromMemberExpression(jsxOpeningElement);
-        } else {
-          tagName = undefined;
-        }
-
-        const isHTMLTag = tagName && tagName[0] !== tagName[0].toUpperCase();
-        const isCustomTag = tagName && (tagName[0] === tagName[0].toUpperCase() || tagName.includes('.'));
-        if (
-          isHTMLTag &&
-          ((ignoreHtmlTags && !isException(tagName, exceptions)) ||
-          (!ignoreHtmlTags && isException(tagName, exceptions)))
-        ) {
-          return;
-        }
-        if (
-          isCustomTag &&
-          ((ignoreCustomTags && !isException(tagName, exceptions)) ||
-          (!ignoreCustomTags && isException(tagName, exceptions)))
-        ) {
-          return;
-        }
-        if (
-          ignoreExplicitSpread &&
-          node.argument.type === 'ObjectExpression' &&
-          node.argument.properties.every(isProperty)
-        ) {
-          return;
-        }
-        context.report({
-          node,
-          message: 'Prop spreading is forbidden'
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-sort-default-props.js b/node_modules/eslint-plugin-react/lib/rules/jsx-sort-default-props.js
deleted file mode 100644
index 88f230a..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-sort-default-props.js
+++ /dev/null
@@ -1,180 +0,0 @@
-/**
- * @fileoverview Enforce default props alphabetical sorting
- * @author Vladimir Kattsov
- */
-
-'use strict';
-
-const variableUtil = require('../util/variable');
-const docsUrl = require('../util/docsUrl');
-const propWrapperUtil = require('../util/propWrapper');
-// const propTypesSortUtil = require('../util/propTypesSort');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce default props alphabetical sorting',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-sort-default-props')
-    },
-
-    // fixable: 'code',
-
-    schema: [{
-      type: 'object',
-      properties: {
-        ignoreCase: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || {};
-    const ignoreCase = configuration.ignoreCase || false;
-
-    /**
-     * Get properties name
-     * @param {Object} node - Property.
-     * @returns {String} Property name.
-     */
-    function getPropertyName(node) {
-      if (node.key || ['MethodDefinition', 'Property'].indexOf(node.type) !== -1) {
-        return node.key.name;
-      }
-      if (node.type === 'MemberExpression') {
-        return node.property.name;
-      // Special case for class properties
-      // (babel-eslint@5 does not expose property name so we have to rely on tokens)
-      }
-      if (node.type === 'ClassProperty') {
-        const tokens = context.getFirstTokens(node, 2);
-        return tokens[1] && tokens[1].type === 'Identifier' ? tokens[1].value : tokens[0].value;
-      }
-      return '';
-    }
-
-    /**
-     * Checks if the Identifier node passed in looks like a defaultProps declaration.
-     * @param   {ASTNode}  node The node to check. Must be an Identifier node.
-     * @returns {Boolean}       `true` if the node is a defaultProps declaration, `false` if not
-     */
-    function isDefaultPropsDeclaration(node) {
-      const propName = getPropertyName(node);
-      return (propName === 'defaultProps' || propName === 'getDefaultProps');
-    }
-
-    function getKey(node) {
-      return context.getSourceCode().getText(node.key || node.argument);
-    }
-
-    /**
-     * Find a variable by name in the current scope.
-     * @param  {string} name Name of the variable to look for.
-     * @returns {ASTNode|null} Return null if the variable could not be found, ASTNode otherwise.
-     */
-    function findVariableByName(name) {
-      const variable = variableUtil.variablesInScope(context).find(item => item.name === name);
-
-      if (!variable || !variable.defs[0] || !variable.defs[0].node) {
-        return null;
-      }
-
-      if (variable.defs[0].node.type === 'TypeAlias') {
-        return variable.defs[0].node.right;
-      }
-
-      return variable.defs[0].node.init;
-    }
-
-    /**
-     * Checks if defaultProps declarations are sorted
-     * @param {Array} declarations The array of AST nodes being checked.
-     * @returns {void}
-     */
-    function checkSorted(declarations) {
-      // function fix(fixer) {
-      //   return propTypesSortUtil.fixPropTypesSort(fixer, context, declarations, ignoreCase);
-      // }
-
-      declarations.reduce((prev, curr, idx, decls) => {
-        if (/Spread(?:Property|Element)$/.test(curr.type)) {
-          return decls[idx + 1];
-        }
-
-        let prevPropName = getKey(prev);
-        let currentPropName = getKey(curr);
-
-        if (ignoreCase) {
-          prevPropName = prevPropName.toLowerCase();
-          currentPropName = currentPropName.toLowerCase();
-        }
-
-        if (currentPropName < prevPropName) {
-          context.report({
-            node: curr,
-            message: 'Default prop types declarations should be sorted alphabetically'
-            // fix
-          });
-
-          return prev;
-        }
-
-        return curr;
-      }, declarations[0]);
-    }
-
-    function checkNode(node) {
-      switch (node && node.type) {
-        case 'ObjectExpression':
-          checkSorted(node.properties);
-          break;
-        case 'Identifier': {
-          const propTypesObject = findVariableByName(node.name);
-          if (propTypesObject && propTypesObject.properties) {
-            checkSorted(propTypesObject.properties);
-          }
-          break;
-        }
-        case 'CallExpression': {
-          const innerNode = node.arguments && node.arguments[0];
-          if (propWrapperUtil.isPropWrapperFunction(context, node.callee.name) && innerNode) {
-            checkNode(innerNode);
-          }
-          break;
-        }
-        default:
-          break;
-      }
-    }
-
-    // --------------------------------------------------------------------------
-    // Public API
-    // --------------------------------------------------------------------------
-
-    return {
-      ClassProperty(node) {
-        if (!isDefaultPropsDeclaration(node)) {
-          return;
-        }
-
-        checkNode(node.value);
-      },
-
-      MemberExpression(node) {
-        if (!isDefaultPropsDeclaration(node)) {
-          return;
-        }
-
-        checkNode(node.parent.right);
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-sort-props.js b/node_modules/eslint-plugin-react/lib/rules/jsx-sort-props.js
deleted file mode 100644
index 5b6265a..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-sort-props.js
+++ /dev/null
@@ -1,359 +0,0 @@
-/**
- * @fileoverview Enforce props alphabetical sorting
- * @author Ilya Volodin, Yannick Croissant
- */
-
-'use strict';
-
-const propName = require('jsx-ast-utils/propName');
-const docsUrl = require('../util/docsUrl');
-const jsxUtil = require('../util/jsx');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-function isCallbackPropName(name) {
-  return /^on[A-Z]/.test(name);
-}
-
-const RESERVED_PROPS_LIST = [
-  'children',
-  'dangerouslySetInnerHTML',
-  'key',
-  'ref'
-];
-
-function isReservedPropName(name, list) {
-  return list.indexOf(name) >= 0;
-}
-
-function contextCompare(a, b, options) {
-  let aProp = propName(a);
-  let bProp = propName(b);
-
-  if (options.reservedFirst) {
-    const aIsReserved = isReservedPropName(aProp, options.reservedList);
-    const bIsReserved = isReservedPropName(bProp, options.reservedList);
-    if (aIsReserved && !bIsReserved) {
-      return -1;
-    }
-    if (!aIsReserved && bIsReserved) {
-      return 1;
-    }
-  }
-
-  if (options.callbacksLast) {
-    const aIsCallback = isCallbackPropName(aProp);
-    const bIsCallback = isCallbackPropName(bProp);
-    if (aIsCallback && !bIsCallback) {
-      return 1;
-    }
-    if (!aIsCallback && bIsCallback) {
-      return -1;
-    }
-  }
-
-  if (options.shorthandFirst || options.shorthandLast) {
-    const shorthandSign = options.shorthandFirst ? -1 : 1;
-    if (!a.value && b.value) {
-      return shorthandSign;
-    }
-    if (a.value && !b.value) {
-      return -shorthandSign;
-    }
-  }
-
-  if (options.noSortAlphabetically) {
-    return 0;
-  }
-
-  if (options.ignoreCase) {
-    aProp = aProp.toLowerCase();
-    bProp = bProp.toLowerCase();
-  }
-  return aProp.localeCompare(bProp);
-}
-
-/**
- * Create an array of arrays where each subarray is composed of attributes
- * that are considered sortable.
- * @param {Array<JSXSpreadAttribute|JSXAttribute>} attributes
- * @return {Array<Array<JSXAttribute>>}
- */
-function getGroupsOfSortableAttributes(attributes) {
-  const sortableAttributeGroups = [];
-  let groupCount = 0;
-  for (let i = 0; i < attributes.length; i++) {
-    const lastAttr = attributes[i - 1];
-    // If we have no groups or if the last attribute was JSXSpreadAttribute
-    // then we start a new group. Append attributes to the group until we
-    // come across another JSXSpreadAttribute or exhaust the array.
-    if (
-      !lastAttr ||
-      (lastAttr.type === 'JSXSpreadAttribute' &&
-        attributes[i].type !== 'JSXSpreadAttribute')
-    ) {
-      groupCount++;
-      sortableAttributeGroups[groupCount - 1] = [];
-    }
-    if (attributes[i].type !== 'JSXSpreadAttribute') {
-      sortableAttributeGroups[groupCount - 1].push(attributes[i]);
-    }
-  }
-  return sortableAttributeGroups;
-}
-
-const generateFixerFunction = (node, context, reservedList) => {
-  const sourceCode = context.getSourceCode();
-  const attributes = node.attributes.slice(0);
-  const configuration = context.options[0] || {};
-  const ignoreCase = configuration.ignoreCase || false;
-  const callbacksLast = configuration.callbacksLast || false;
-  const shorthandFirst = configuration.shorthandFirst || false;
-  const shorthandLast = configuration.shorthandLast || false;
-  const noSortAlphabetically = configuration.noSortAlphabetically || false;
-  const reservedFirst = configuration.reservedFirst || false;
-
-  // Sort props according to the context. Only supports ignoreCase.
-  // Since we cannot safely move JSXSpreadAttribute (due to potential variable overrides),
-  // we only consider groups of sortable attributes.
-  const options = {
-    ignoreCase,
-    callbacksLast,
-    shorthandFirst,
-    shorthandLast,
-    noSortAlphabetically,
-    reservedFirst,
-    reservedList
-  };
-  const sortableAttributeGroups = getGroupsOfSortableAttributes(attributes);
-  const sortedAttributeGroups = sortableAttributeGroups
-    .slice(0)
-    .map(group => group.slice(0).sort((a, b) => contextCompare(a, b, options)));
-
-  return function fixFunction(fixer) {
-    const fixers = [];
-    let source = sourceCode.getText();
-
-    // Replace each unsorted attribute with the sorted one.
-    sortableAttributeGroups.forEach((sortableGroup, ii) => {
-      sortableGroup.forEach((attr, jj) => {
-        const sortedAttr = sortedAttributeGroups[ii][jj];
-        const sortedAttrText = sourceCode.getText(sortedAttr);
-        fixers.push({
-          range: [attr.range[0], attr.range[1]],
-          text: sortedAttrText
-        });
-      });
-    });
-
-    fixers.sort((a, b) => b.range[0] - a.range[0]);
-
-    const rangeStart = fixers[fixers.length - 1].range[0];
-    const rangeEnd = fixers[0].range[1];
-
-    fixers.forEach((fix) => {
-      source = `${source.substr(0, fix.range[0])}${fix.text}${source.substr(fix.range[1])}`;
-    });
-
-    return fixer.replaceTextRange([rangeStart, rangeEnd], source.substr(rangeStart, rangeEnd - rangeStart));
-  };
-};
-
-/**
- * Checks if the `reservedFirst` option is valid
- * @param {Object} context The context of the rule
- * @param {Boolean|Array<String>} reservedFirst The `reservedFirst` option
- * @return {Function|undefined} If an error is detected, a function to generate the error message, otherwise, `undefined`
- */
-// eslint-disable-next-line consistent-return
-function validateReservedFirstConfig(context, reservedFirst) {
-  if (reservedFirst) {
-    if (Array.isArray(reservedFirst)) {
-      // Only allow a subset of reserved words in customized lists
-      const nonReservedWords = reservedFirst.filter(word => !isReservedPropName(
-        word,
-        RESERVED_PROPS_LIST
-      ));
-
-      if (reservedFirst.length === 0) {
-        return function report(decl) {
-          context.report({
-            node: decl,
-            message: 'A customized reserved first list must not be empty'
-          });
-        };
-      }
-      if (nonReservedWords.length > 0) {
-        return function report(decl) {
-          context.report({
-            node: decl,
-            message: 'A customized reserved first list must only contain a subset of React reserved props.' +
-              ' Remove: {{ nonReservedWords }}',
-            data: {
-              nonReservedWords: nonReservedWords.toString()
-            }
-          });
-        };
-      }
-    }
-  }
-}
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce props alphabetical sorting',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-sort-props')
-    },
-    fixable: 'code',
-    schema: [{
-      type: 'object',
-      properties: {
-        // Whether callbacks (prefixed with "on") should be listed at the very end,
-        // after all other props. Supersedes shorthandLast.
-        callbacksLast: {
-          type: 'boolean'
-        },
-        // Whether shorthand properties (without a value) should be listed first
-        shorthandFirst: {
-          type: 'boolean'
-        },
-        // Whether shorthand properties (without a value) should be listed last
-        shorthandLast: {
-          type: 'boolean'
-        },
-        ignoreCase: {
-          type: 'boolean'
-        },
-        // Whether alphabetical sorting should be enforced
-        noSortAlphabetically: {
-          type: 'boolean'
-        },
-        reservedFirst: {
-          type: ['array', 'boolean']
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || {};
-    const ignoreCase = configuration.ignoreCase || false;
-    const callbacksLast = configuration.callbacksLast || false;
-    const shorthandFirst = configuration.shorthandFirst || false;
-    const shorthandLast = configuration.shorthandLast || false;
-    const noSortAlphabetically = configuration.noSortAlphabetically || false;
-    const reservedFirst = configuration.reservedFirst || false;
-    const reservedFirstError = validateReservedFirstConfig(context, reservedFirst);
-    let reservedList = Array.isArray(reservedFirst) ? reservedFirst : RESERVED_PROPS_LIST;
-
-    return {
-      JSXOpeningElement(node) {
-        // `dangerouslySetInnerHTML` is only "reserved" on DOM components
-        if (reservedFirst && !jsxUtil.isDOMComponent(node)) {
-          reservedList = reservedList.filter(prop => prop !== 'dangerouslySetInnerHTML');
-        }
-
-        node.attributes.reduce((memo, decl, idx, attrs) => {
-          if (decl.type === 'JSXSpreadAttribute') {
-            return attrs[idx + 1];
-          }
-
-          let previousPropName = propName(memo);
-          let currentPropName = propName(decl);
-          const previousValue = memo.value;
-          const currentValue = decl.value;
-          const previousIsCallback = isCallbackPropName(previousPropName);
-          const currentIsCallback = isCallbackPropName(currentPropName);
-
-          if (ignoreCase) {
-            previousPropName = previousPropName.toLowerCase();
-            currentPropName = currentPropName.toLowerCase();
-          }
-
-          if (reservedFirst) {
-            if (reservedFirstError) {
-              reservedFirstError(decl);
-              return memo;
-            }
-
-            const previousIsReserved = isReservedPropName(previousPropName, reservedList);
-            const currentIsReserved = isReservedPropName(currentPropName, reservedList);
-
-            if (previousIsReserved && !currentIsReserved) {
-              return decl;
-            }
-            if (!previousIsReserved && currentIsReserved) {
-              context.report({
-                node: decl.name,
-                message: 'Reserved props must be listed before all other props',
-                fix: generateFixerFunction(node, context, reservedList)
-              });
-              return memo;
-            }
-          }
-
-          if (callbacksLast) {
-            if (!previousIsCallback && currentIsCallback) {
-              // Entering the callback prop section
-              return decl;
-            }
-            if (previousIsCallback && !currentIsCallback) {
-              // Encountered a non-callback prop after a callback prop
-              context.report({
-                node: memo.name,
-                message: 'Callbacks must be listed after all other props',
-                fix: generateFixerFunction(node, context, reservedList)
-              });
-              return memo;
-            }
-          }
-
-          if (shorthandFirst) {
-            if (currentValue && !previousValue) {
-              return decl;
-            }
-            if (!currentValue && previousValue) {
-              context.report({
-                node: memo.name,
-                message: 'Shorthand props must be listed before all other props',
-                fix: generateFixerFunction(node, context, reservedList)
-              });
-              return memo;
-            }
-          }
-
-          if (shorthandLast) {
-            if (!currentValue && previousValue) {
-              return decl;
-            }
-            if (currentValue && !previousValue) {
-              context.report({
-                node: memo.name,
-                message: 'Shorthand props must be listed after all other props',
-                fix: generateFixerFunction(node, context, reservedList)
-              });
-              return memo;
-            }
-          }
-
-          if (!noSortAlphabetically && previousPropName.localeCompare(currentPropName) > 0) {
-            context.report({
-              node: decl.name,
-              message: 'Props should be sorted alphabetically',
-              fix: generateFixerFunction(node, context, reservedList)
-            });
-            return memo;
-          }
-
-          return decl;
-        }, node.attributes[0]);
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-space-before-closing.js b/node_modules/eslint-plugin-react/lib/rules/jsx-space-before-closing.js
deleted file mode 100644
index 284aa06..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-space-before-closing.js
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * @fileoverview Validate spacing before closing bracket in JSX.
- * @author ryym
- * @deprecated
- */
-
-'use strict';
-
-const getTokenBeforeClosingBracket = require('../util/getTokenBeforeClosingBracket');
-const docsUrl = require('../util/docsUrl');
-const log = require('../util/log');
-
-let isWarnedForDeprecation = false;
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    deprecated: true,
-    docs: {
-      description: 'Validate spacing before closing bracket in JSX',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-space-before-closing')
-    },
-    fixable: 'code',
-
-    schema: [{
-      enum: ['always', 'never']
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || 'always';
-
-    const NEVER_MESSAGE = 'A space is forbidden before closing bracket';
-    const ALWAYS_MESSAGE = 'A space is required before closing bracket';
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      JSXOpeningElement(node) {
-        if (!node.selfClosing) {
-          return;
-        }
-
-        const sourceCode = context.getSourceCode();
-
-        const leftToken = getTokenBeforeClosingBracket(node);
-        const closingSlash = sourceCode.getTokenAfter(leftToken);
-
-        if (leftToken.loc.end.line !== closingSlash.loc.start.line) {
-          return;
-        }
-
-        if (configuration === 'always' && !sourceCode.isSpaceBetweenTokens(leftToken, closingSlash)) {
-          context.report({
-            loc: closingSlash.loc.start,
-            message: ALWAYS_MESSAGE,
-            fix(fixer) {
-              return fixer.insertTextBefore(closingSlash, ' ');
-            }
-          });
-        } else if (configuration === 'never' && sourceCode.isSpaceBetweenTokens(leftToken, closingSlash)) {
-          context.report({
-            loc: closingSlash.loc.start,
-            message: NEVER_MESSAGE,
-            fix(fixer) {
-              const previousToken = sourceCode.getTokenBefore(closingSlash);
-              return fixer.removeRange([previousToken.range[1], closingSlash.range[0]]);
-            }
-          });
-        }
-      },
-
-      Program() {
-        if (isWarnedForDeprecation) {
-          return;
-        }
-
-        log('The react/jsx-space-before-closing rule is deprecated. ' +
-            'Please use the react/jsx-tag-spacing rule with the ' +
-            '"beforeSelfClosing" option instead.');
-        isWarnedForDeprecation = true;
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-tag-spacing.js b/node_modules/eslint-plugin-react/lib/rules/jsx-tag-spacing.js
deleted file mode 100644
index 9568672..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-tag-spacing.js
+++ /dev/null
@@ -1,291 +0,0 @@
-/**
- * @fileoverview Validates whitespace in and around the JSX opening and closing brackets
- * @author Diogo Franco (Kovensky)
- */
-
-'use strict';
-
-const getTokenBeforeClosingBracket = require('../util/getTokenBeforeClosingBracket');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Validators
-// ------------------------------------------------------------------------------
-
-function validateClosingSlash(context, node, option) {
-  const sourceCode = context.getSourceCode();
-
-  const SELF_CLOSING_NEVER_MESSAGE = 'Whitespace is forbidden between `/` and `>`; write `/>`';
-  const SELF_CLOSING_ALWAYS_MESSAGE = 'Whitespace is required between `/` and `>`; write `/ >`';
-  const NEVER_MESSAGE = 'Whitespace is forbidden between `<` and `/`; write `</`';
-  const ALWAYS_MESSAGE = 'Whitespace is required between `<` and `/`; write `< /`';
-
-  let adjacent;
-
-  if (node.selfClosing) {
-    const lastTokens = sourceCode.getLastTokens(node, 2);
-
-    adjacent = !sourceCode.isSpaceBetweenTokens(lastTokens[0], lastTokens[1]);
-
-    if (option === 'never') {
-      if (!adjacent) {
-        context.report({
-          node,
-          loc: {
-            start: lastTokens[0].loc.start,
-            end: lastTokens[1].loc.end
-          },
-          message: SELF_CLOSING_NEVER_MESSAGE,
-          fix(fixer) {
-            return fixer.removeRange([lastTokens[0].range[1], lastTokens[1].range[0]]);
-          }
-        });
-      }
-    } else if (option === 'always' && adjacent) {
-      context.report({
-        node,
-        loc: {
-          start: lastTokens[0].loc.start,
-          end: lastTokens[1].loc.end
-        },
-        message: SELF_CLOSING_ALWAYS_MESSAGE,
-        fix(fixer) {
-          return fixer.insertTextBefore(lastTokens[1], ' ');
-        }
-      });
-    }
-  } else {
-    const firstTokens = sourceCode.getFirstTokens(node, 2);
-
-    adjacent = !sourceCode.isSpaceBetweenTokens(firstTokens[0], firstTokens[1]);
-
-    if (option === 'never') {
-      if (!adjacent) {
-        context.report({
-          node,
-          loc: {
-            start: firstTokens[0].loc.start,
-            end: firstTokens[1].loc.end
-          },
-          message: NEVER_MESSAGE,
-          fix(fixer) {
-            return fixer.removeRange([firstTokens[0].range[1], firstTokens[1].range[0]]);
-          }
-        });
-      }
-    } else if (option === 'always' && adjacent) {
-      context.report({
-        node,
-        loc: {
-          start: firstTokens[0].loc.start,
-          end: firstTokens[1].loc.end
-        },
-        message: ALWAYS_MESSAGE,
-        fix(fixer) {
-          return fixer.insertTextBefore(firstTokens[1], ' ');
-        }
-      });
-    }
-  }
-}
-
-function validateBeforeSelfClosing(context, node, option) {
-  const sourceCode = context.getSourceCode();
-
-  const NEVER_MESSAGE = 'A space is forbidden before closing bracket';
-  const ALWAYS_MESSAGE = 'A space is required before closing bracket';
-
-  const leftToken = getTokenBeforeClosingBracket(node);
-  const closingSlash = sourceCode.getTokenAfter(leftToken);
-
-  if (leftToken.loc.end.line !== closingSlash.loc.start.line) {
-    return;
-  }
-
-  if (option === 'always' && !sourceCode.isSpaceBetweenTokens(leftToken, closingSlash)) {
-    context.report({
-      node,
-      loc: closingSlash.loc.start,
-      message: ALWAYS_MESSAGE,
-      fix(fixer) {
-        return fixer.insertTextBefore(closingSlash, ' ');
-      }
-    });
-  } else if (option === 'never' && sourceCode.isSpaceBetweenTokens(leftToken, closingSlash)) {
-    context.report({
-      node,
-      loc: closingSlash.loc.start,
-      message: NEVER_MESSAGE,
-      fix(fixer) {
-        const previousToken = sourceCode.getTokenBefore(closingSlash);
-        return fixer.removeRange([previousToken.range[1], closingSlash.range[0]]);
-      }
-    });
-  }
-}
-
-function validateAfterOpening(context, node, option) {
-  const sourceCode = context.getSourceCode();
-
-  const NEVER_MESSAGE = 'A space is forbidden after opening bracket';
-  const ALWAYS_MESSAGE = 'A space is required after opening bracket';
-
-  const openingToken = sourceCode.getTokenBefore(node.name);
-
-  if (option === 'allow-multiline') {
-    if (openingToken.loc.start.line !== node.name.loc.start.line) {
-      return;
-    }
-  }
-
-  const adjacent = !sourceCode.isSpaceBetweenTokens(openingToken, node.name);
-
-  if (option === 'never' || option === 'allow-multiline') {
-    if (!adjacent) {
-      context.report({
-        node,
-        loc: {
-          start: openingToken.loc.start,
-          end: node.name.loc.start
-        },
-        message: NEVER_MESSAGE,
-        fix(fixer) {
-          return fixer.removeRange([openingToken.range[1], node.name.range[0]]);
-        }
-      });
-    }
-  } else if (option === 'always' && adjacent) {
-    context.report({
-      node,
-      loc: {
-        start: openingToken.loc.start,
-        end: node.name.loc.start
-      },
-      message: ALWAYS_MESSAGE,
-      fix(fixer) {
-        return fixer.insertTextBefore(node.name, ' ');
-      }
-    });
-  }
-}
-
-function validateBeforeClosing(context, node, option) {
-  // Don't enforce this rule for self closing tags
-  if (!node.selfClosing) {
-    const sourceCode = context.getSourceCode();
-
-    const NEVER_MESSAGE = 'A space is forbidden before closing bracket';
-    const ALWAYS_MESSAGE = 'Whitespace is required before closing bracket';
-
-    const lastTokens = sourceCode.getLastTokens(node, 2);
-    const closingToken = lastTokens[1];
-    const leftToken = lastTokens[0];
-
-    if (leftToken.loc.start.line !== closingToken.loc.start.line) {
-      return;
-    }
-
-    const adjacent = !sourceCode.isSpaceBetweenTokens(leftToken, closingToken);
-
-    if (option === 'never' && !adjacent) {
-      context.report({
-        node,
-        loc: {
-          start: leftToken.loc.end,
-          end: closingToken.loc.start
-        },
-        message: NEVER_MESSAGE,
-        fix(fixer) {
-          return fixer.removeRange([leftToken.range[1], closingToken.range[0]]);
-        }
-      });
-    } else if (option === 'always' && adjacent) {
-      context.report({
-        node,
-        loc: {
-          start: leftToken.loc.end,
-          end: closingToken.loc.start
-        },
-        message: ALWAYS_MESSAGE,
-        fix(fixer) {
-          return fixer.insertTextBefore(closingToken, ' ');
-        }
-      });
-    }
-  }
-}
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-const optionDefaults = {
-  closingSlash: 'never',
-  beforeSelfClosing: 'always',
-  afterOpening: 'never',
-  beforeClosing: 'allow'
-};
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Validate whitespace in and around the JSX opening and closing brackets',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-tag-spacing')
-    },
-    fixable: 'whitespace',
-    schema: [
-      {
-        type: 'object',
-        properties: {
-          closingSlash: {
-            enum: ['always', 'never', 'allow']
-          },
-          beforeSelfClosing: {
-            enum: ['always', 'never', 'allow']
-          },
-          afterOpening: {
-            enum: ['always', 'allow-multiline', 'never', 'allow']
-          },
-          beforeClosing: {
-            enum: ['always', 'never', 'allow']
-          }
-        },
-        default: optionDefaults,
-        additionalProperties: false
-      }
-    ]
-  },
-  create(context) {
-    const options = Object.assign({}, optionDefaults, context.options[0]);
-
-    return {
-      JSXOpeningElement(node) {
-        if (options.closingSlash !== 'allow' && node.selfClosing) {
-          validateClosingSlash(context, node, options.closingSlash);
-        }
-        if (options.afterOpening !== 'allow') {
-          validateAfterOpening(context, node, options.afterOpening);
-        }
-        if (options.beforeSelfClosing !== 'allow' && node.selfClosing) {
-          validateBeforeSelfClosing(context, node, options.beforeSelfClosing);
-        }
-        if (options.beforeClosing !== 'allow') {
-          validateBeforeClosing(context, node, options.beforeClosing);
-        }
-      },
-      JSXClosingElement(node) {
-        if (options.afterOpening !== 'allow') {
-          validateAfterOpening(context, node, options.afterOpening);
-        }
-        if (options.closingSlash !== 'allow') {
-          validateClosingSlash(context, node, options.closingSlash);
-        }
-        if (options.beforeClosing !== 'allow') {
-          validateBeforeClosing(context, node, options.beforeClosing);
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-uses-react.js b/node_modules/eslint-plugin-react/lib/rules/jsx-uses-react.js
deleted file mode 100644
index bebcdf3..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-uses-react.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * @fileoverview Prevent React to be marked as unused
- * @author Glen Mailer
- */
-
-'use strict';
-
-const pragmaUtil = require('../util/pragma');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent React to be marked as unused',
-      category: 'Best Practices',
-      recommended: true,
-      url: docsUrl('jsx-uses-react')
-    },
-    schema: []
-  },
-
-  create(context) {
-    const pragma = pragmaUtil.getFromContext(context);
-
-    function handleOpeningElement() {
-      context.markVariableAsUsed(pragma);
-    }
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      JSXOpeningElement: handleOpeningElement,
-      JSXOpeningFragment: handleOpeningElement
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-uses-vars.js b/node_modules/eslint-plugin-react/lib/rules/jsx-uses-vars.js
deleted file mode 100644
index 86a32f1..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-uses-vars.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * @fileoverview Prevent variables used in JSX to be marked as unused
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent variables used in JSX to be marked as unused',
-      category: 'Best Practices',
-      recommended: true,
-      url: docsUrl('jsx-uses-vars')
-    },
-    schema: []
-  },
-
-  create(context) {
-    return {
-      JSXOpeningElement(node) {
-        let name;
-        if (node.name.namespace && node.name.namespace.name) {
-          // <Foo:Bar>
-          name = node.name.namespace.name;
-        } else if (node.name.name) {
-          // <Foo>
-          name = node.name.name;
-        } else if (node.name.object) {
-          // <Foo...Bar>
-          let parent = node.name.object;
-          while (parent.object) {
-            parent = parent.object;
-          }
-          name = parent.name;
-        } else {
-          return;
-        }
-
-        context.markVariableAsUsed(name);
-      }
-
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/jsx-wrap-multilines.js b/node_modules/eslint-plugin-react/lib/rules/jsx-wrap-multilines.js
deleted file mode 100644
index 2980a76..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/jsx-wrap-multilines.js
+++ /dev/null
@@ -1,264 +0,0 @@
-/**
- * @fileoverview Prevent missing parentheses around multilines JSX
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const has = require('has');
-const docsUrl = require('../util/docsUrl');
-const jsxUtil = require('../util/jsx');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-const DEFAULTS = {
-  declaration: 'parens',
-  assignment: 'parens',
-  return: 'parens',
-  arrow: 'parens',
-  condition: 'ignore',
-  logical: 'ignore',
-  prop: 'ignore'
-};
-
-const MISSING_PARENS = 'Missing parentheses around multilines JSX';
-const PARENS_NEW_LINES = 'Parentheses around JSX should be on separate lines';
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent missing parentheses around multilines JSX',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('jsx-wrap-multilines')
-    },
-    fixable: 'code',
-
-    schema: [{
-      type: 'object',
-      // true/false are for backwards compatibility
-      properties: {
-        declaration: {
-          enum: [true, false, 'ignore', 'parens', 'parens-new-line']
-        },
-        assignment: {
-          enum: [true, false, 'ignore', 'parens', 'parens-new-line']
-        },
-        return: {
-          enum: [true, false, 'ignore', 'parens', 'parens-new-line']
-        },
-        arrow: {
-          enum: [true, false, 'ignore', 'parens', 'parens-new-line']
-        },
-        condition: {
-          enum: [true, false, 'ignore', 'parens', 'parens-new-line']
-        },
-        logical: {
-          enum: [true, false, 'ignore', 'parens', 'parens-new-line']
-        },
-        prop: {
-          enum: [true, false, 'ignore', 'parens', 'parens-new-line']
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    function getOption(type) {
-      const userOptions = context.options[0] || {};
-      if (has(userOptions, type)) {
-        return userOptions[type];
-      }
-      return DEFAULTS[type];
-    }
-
-    function isEnabled(type) {
-      const option = getOption(type);
-      return option && option !== 'ignore';
-    }
-
-    function isParenthesised(node) {
-      const sourceCode = context.getSourceCode();
-      const previousToken = sourceCode.getTokenBefore(node);
-      const nextToken = sourceCode.getTokenAfter(node);
-
-      return previousToken && nextToken &&
-        previousToken.value === '(' && previousToken.range[1] <= node.range[0] &&
-        nextToken.value === ')' && nextToken.range[0] >= node.range[1];
-    }
-
-    function needsOpeningNewLine(node) {
-      const previousToken = context.getSourceCode().getTokenBefore(node);
-
-      if (!isParenthesised(node)) {
-        return false;
-      }
-
-      if (previousToken.loc.end.line === node.loc.start.line) {
-        return true;
-      }
-
-      return false;
-    }
-
-    function needsClosingNewLine(node) {
-      const nextToken = context.getSourceCode().getTokenAfter(node);
-
-      if (!isParenthesised(node)) {
-        return false;
-      }
-
-      if (node.loc.end.line === nextToken.loc.end.line) {
-        return true;
-      }
-
-      return false;
-    }
-
-    function isMultilines(node) {
-      return node.loc.start.line !== node.loc.end.line;
-    }
-
-    function report(node, message, fix) {
-      context.report({
-        node,
-        message,
-        fix
-      });
-    }
-
-    function trimTokenBeforeNewline(node, tokenBefore) {
-      // if the token before the jsx is a bracket or curly brace
-      // we don't want a space between the opening parentheses and the multiline jsx
-      const isBracket = tokenBefore.value === '{' || tokenBefore.value === '[';
-      return `${tokenBefore.value.trim()}${isBracket ? '' : ' '}`;
-    }
-
-    function check(node, type) {
-      if (!node || !jsxUtil.isJSX(node)) {
-        return;
-      }
-
-      const sourceCode = context.getSourceCode();
-      const option = getOption(type);
-
-      if ((option === true || option === 'parens') && !isParenthesised(node) && isMultilines(node)) {
-        report(node, MISSING_PARENS, fixer => fixer.replaceText(node, `(${sourceCode.getText(node)})`));
-      }
-
-      if (option === 'parens-new-line' && isMultilines(node)) {
-        if (!isParenthesised(node)) {
-          const tokenBefore = sourceCode.getTokenBefore(node, {includeComments: true});
-          const tokenAfter = sourceCode.getTokenAfter(node, {includeComments: true});
-          if (tokenBefore.loc.end.line < node.loc.start.line) {
-            // Strip newline after operator if parens newline is specified
-            report(
-              node,
-              MISSING_PARENS,
-              fixer => fixer.replaceTextRange(
-                [tokenBefore.range[0], tokenAfter && (tokenAfter.value === ';' || tokenAfter.value === '}') ? tokenAfter.range[0] : node.range[1]],
-                `${trimTokenBeforeNewline(node, tokenBefore)}(\n${' '.repeat(node.loc.start.column)}${sourceCode.getText(node)}\n${' '.repeat(node.loc.start.column - 2)})`
-              )
-            );
-          } else {
-            report(node, MISSING_PARENS, fixer => fixer.replaceText(node, `(\n${sourceCode.getText(node)}\n)`));
-          }
-        } else {
-          const needsOpening = needsOpeningNewLine(node);
-          const needsClosing = needsClosingNewLine(node);
-          if (needsOpening || needsClosing) {
-            report(node, PARENS_NEW_LINES, (fixer) => {
-              const text = sourceCode.getText(node);
-              let fixed = text;
-              if (needsOpening) {
-                fixed = `\n${fixed}`;
-              }
-              if (needsClosing) {
-                fixed = `${fixed}\n`;
-              }
-              return fixer.replaceText(node, fixed);
-            });
-          }
-        }
-      }
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-
-      VariableDeclarator(node) {
-        const type = 'declaration';
-        if (!isEnabled(type)) {
-          return;
-        }
-        if (!isEnabled('condition') && node.init && node.init.type === 'ConditionalExpression') {
-          check(node.init.consequent, type);
-          check(node.init.alternate, type);
-          return;
-        }
-        check(node.init, type);
-      },
-
-      AssignmentExpression(node) {
-        const type = 'assignment';
-        if (!isEnabled(type)) {
-          return;
-        }
-        if (!isEnabled('condition') && node.right.type === 'ConditionalExpression') {
-          check(node.right.consequent, type);
-          check(node.right.alternate, type);
-          return;
-        }
-        check(node.right, type);
-      },
-
-      ReturnStatement(node) {
-        const type = 'return';
-        if (isEnabled(type)) {
-          check(node.argument, type);
-        }
-      },
-
-      'ArrowFunctionExpression:exit': (node) => {
-        const arrowBody = node.body;
-        const type = 'arrow';
-
-        if (isEnabled(type) && arrowBody.type !== 'BlockStatement') {
-          check(arrowBody, type);
-        }
-      },
-
-      ConditionalExpression(node) {
-        const type = 'condition';
-        if (isEnabled(type)) {
-          check(node.consequent, type);
-          check(node.alternate, type);
-        }
-      },
-
-      LogicalExpression(node) {
-        const type = 'logical';
-        if (isEnabled(type)) {
-          check(node.right, type);
-        }
-      },
-
-      JSXAttribute(node) {
-        const type = 'prop';
-        if (isEnabled(type) && node.value && node.value.type === 'JSXExpressionContainer') {
-          check(node.value.expression, type);
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-access-state-in-setstate.js b/node_modules/eslint-plugin-react/lib/rules/no-access-state-in-setstate.js
deleted file mode 100644
index 9a0af61..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-access-state-in-setstate.js
+++ /dev/null
@@ -1,174 +0,0 @@
-/**
- * @fileoverview Prevent usage of this.state within setState
- * @author Rolf Erik Lekang, Jørgen Aaberg
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Reports when this.state is accessed within setState',
-      category: 'Possible Errors',
-      recommended: false,
-      url: docsUrl('no-access-state-in-setstate')
-    }
-  },
-
-  create(context) {
-    function isSetStateCall(node) {
-      return node.type === 'CallExpression' &&
-        node.callee.property &&
-        node.callee.property.name === 'setState' &&
-        node.callee.object.type === 'ThisExpression';
-    }
-
-    function isFirstArgumentInSetStateCall(current, node) {
-      if (!isSetStateCall(current)) {
-        return false;
-      }
-      while (node && node.parent !== current) {
-        node = node.parent;
-      }
-      return current.arguments[0] === node;
-    }
-
-    // The methods array contains all methods or functions that are using this.state
-    // or that are calling another method or function using this.state
-    const methods = [];
-    // The vars array contains all variables that contains this.state
-    const vars = [];
-    return {
-      CallExpression(node) {
-        // Appends all the methods that are calling another
-        // method containing this.state to the methods array
-        methods.forEach((method) => {
-          if (node.callee.name === method.methodName) {
-            let current = node.parent;
-            while (current.type !== 'Program') {
-              if (current.type === 'MethodDefinition') {
-                methods.push({
-                  methodName: current.key.name,
-                  node: method.node
-                });
-                break;
-              }
-              current = current.parent;
-            }
-          }
-        });
-
-        // Finding all CallExpressions that is inside a setState
-        // to further check if they contains this.state
-        let current = node.parent;
-        while (current.type !== 'Program') {
-          if (isFirstArgumentInSetStateCall(current, node)) {
-            const methodName = node.callee.name;
-            methods.forEach((method) => {
-              if (method.methodName === methodName) {
-                context.report({
-                  node: method.node,
-                  message: 'Use callback in setState when referencing the previous state.'
-                });
-              }
-            });
-
-            break;
-          }
-          current = current.parent;
-        }
-      },
-
-      MemberExpression(node) {
-        if (
-          node.property.name === 'state' &&
-          node.object.type === 'ThisExpression'
-        ) {
-          let current = node;
-          while (current.type !== 'Program') {
-            // Reporting if this.state is directly within this.setState
-            if (isFirstArgumentInSetStateCall(current, node)) {
-              context.report({
-                node,
-                message: 'Use callback in setState when referencing the previous state.'
-              });
-              break;
-            }
-
-            // Storing all functions and methods that contains this.state
-            if (current.type === 'MethodDefinition') {
-              methods.push({
-                methodName: current.key.name,
-                node
-              });
-              break;
-            } else if (current.type === 'FunctionExpression' && current.parent.key) {
-              methods.push({
-                methodName: current.parent.key.name,
-                node
-              });
-              break;
-            }
-
-            // Storing all variables containg this.state
-            if (current.type === 'VariableDeclarator') {
-              vars.push({
-                node,
-                scope: context.getScope(),
-                variableName: current.id.name
-              });
-              break;
-            }
-
-            current = current.parent;
-          }
-        }
-      },
-
-      Identifier(node) {
-        // Checks if the identifier is a variable within an object
-        let current = node;
-        while (current.parent.type === 'BinaryExpression') {
-          current = current.parent;
-        }
-        if (
-          current.parent.value === current ||
-          current.parent.object === current
-        ) {
-          while (current.type !== 'Program') {
-            if (isFirstArgumentInSetStateCall(current, node)) {
-              vars
-                .filter(v => v.scope === context.getScope() && v.variableName === node.name)
-                .forEach((v) => {
-                  context.report({
-                    node: v.node,
-                    message: 'Use callback in setState when referencing the previous state.'
-                  });
-                });
-            }
-            current = current.parent;
-          }
-        }
-      },
-
-      ObjectPattern(node) {
-        const isDerivedFromThis = node.parent.init && node.parent.init.type === 'ThisExpression';
-        node.properties.forEach((property) => {
-          if (property && property.key && property.key.name === 'state' && isDerivedFromThis) {
-            vars.push({
-              node: property.key,
-              scope: context.getScope(),
-              variableName: property.key.name
-            });
-          }
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-adjacent-inline-elements.js b/node_modules/eslint-plugin-react/lib/rules/no-adjacent-inline-elements.js
deleted file mode 100644
index 28abeef..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-adjacent-inline-elements.js
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * @fileoverview Prevent adjacent inline elements not separated by whitespace.
- * @author Sean Hayes
- */
-
-'use strict';
-
-// ------------------------------------------------------------------------------
-// Helpers
-// ------------------------------------------------------------------------------
-
-// https://developer.mozilla.org/en-US/docs/Web/HTML/Inline_elements
-const inlineNames = [
-  'a',
-  'b',
-  'big',
-  'i',
-  'small',
-  'tt',
-  'abbr',
-  'acronym',
-  'cite',
-  'code',
-  'dfn',
-  'em',
-  'kbd',
-  'strong',
-  'samp',
-  'time',
-  'var',
-  'bdo',
-  'br',
-  'img',
-  'map',
-  'object',
-  'q',
-  'script',
-  'span',
-  'sub',
-  'sup',
-  'button',
-  'input',
-  'label',
-  'select',
-  'textarea'
-];
-// Note: raw &nbsp; will be transformed into \u00a0.
-const whitespaceRegex = /(?:^\s|\s$)/;
-
-function isInline(node) {
-  if (node.type === 'Literal') {
-    // Regular whitespace will be removed.
-    const value = node.value;
-    // To properly separate inline elements, each end of the literal will need
-    // whitespace.
-    return !whitespaceRegex.test(value);
-  }
-  if (node.type === 'JSXElement' && inlineNames.indexOf(node.openingElement.name.name) > -1) {
-    return true;
-  }
-  if (node.type === 'CallExpression' && inlineNames.indexOf(node.arguments[0].value) > -1) {
-    return true;
-  }
-  return false;
-}
-
-const ERROR = 'Child elements which render as inline HTML elements should be separated by a space or wrapped in block level elements.';
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  ERROR,
-  meta: {
-    docs: {
-      description: 'Prevent adjacent inline elements not separated by whitespace.',
-      category: 'Best Practices',
-      recommended: false
-    },
-    schema: []
-  },
-  create(context) {
-    function validate(node, children) {
-      let currentIsInline = false;
-      let previousIsInline = false;
-      for (let i = 0; i < children.length; i++) {
-        currentIsInline = isInline(children[i]);
-        if (previousIsInline && currentIsInline) {
-          context.report({
-            node,
-            message: ERROR
-          });
-          return;
-        }
-        previousIsInline = currentIsInline;
-      }
-    }
-    return {
-      JSXElement(node) {
-        validate(node, node.children);
-      },
-      CallExpression(node) {
-        if (!node.callee || node.callee.type !== 'MemberExpression' || node.callee.property.name !== 'createElement') {
-          return;
-        }
-        if (node.arguments.length < 2 || !node.arguments[2]) {
-          return;
-        }
-        const children = node.arguments[2].elements;
-        validate(node, children);
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-array-index-key.js b/node_modules/eslint-plugin-react/lib/rules/no-array-index-key.js
deleted file mode 100644
index 0a81bc8..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-array-index-key.js
+++ /dev/null
@@ -1,226 +0,0 @@
-/**
- * @fileoverview Prevent usage of Array index in keys
- * @author Joe Lencioni
- */
-
-'use strict';
-
-const has = require('has');
-const astUtil = require('../util/ast');
-const docsUrl = require('../util/docsUrl');
-const pragma = require('../util/pragma');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent usage of Array index in keys',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('no-array-index-key')
-    },
-
-    schema: []
-  },
-
-  create(context) {
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-    const indexParamNames = [];
-    const iteratorFunctionsToIndexParamPosition = {
-      every: 1,
-      filter: 1,
-      find: 1,
-      findIndex: 1,
-      forEach: 1,
-      map: 1,
-      reduce: 2,
-      reduceRight: 2,
-      some: 1
-    };
-    const ERROR_MESSAGE = 'Do not use Array index in keys';
-
-    function isArrayIndex(node) {
-      return node.type === 'Identifier' &&
-        indexParamNames.indexOf(node.name) !== -1;
-    }
-
-    function isUsingReactChildren(node) {
-      const callee = node.callee;
-      if (
-        !callee ||
-        !callee.property ||
-        !callee.object
-      ) {
-        return null;
-      }
-
-      const isReactChildMethod = ['map', 'forEach'].indexOf(callee.property.name) > -1;
-      if (!isReactChildMethod) {
-        return null;
-      }
-
-      const obj = callee.object;
-      if (obj && obj.name === 'Children') {
-        return true;
-      }
-      if (obj && obj.object && obj.object.name === pragma.getFromContext(context)) {
-        return true;
-      }
-
-      return false;
-    }
-
-    function getMapIndexParamName(node) {
-      const callee = node.callee;
-      if (callee.type !== 'MemberExpression') {
-        return null;
-      }
-      if (callee.property.type !== 'Identifier') {
-        return null;
-      }
-      if (!has(iteratorFunctionsToIndexParamPosition, callee.property.name)) {
-        return null;
-      }
-
-      const callbackArg = isUsingReactChildren(node) ?
-        node.arguments[1] :
-        node.arguments[0];
-
-      if (!callbackArg) {
-        return null;
-      }
-
-      if (!astUtil.isFunctionLikeExpression(callbackArg)) {
-        return null;
-      }
-
-      const params = callbackArg.params;
-
-      const indexParamPosition = iteratorFunctionsToIndexParamPosition[callee.property.name];
-      if (params.length < indexParamPosition + 1) {
-        return null;
-      }
-
-      return params[indexParamPosition].name;
-    }
-
-    function getIdentifiersFromBinaryExpression(side) {
-      if (side.type === 'Identifier') {
-        return side;
-      }
-
-      if (side.type === 'BinaryExpression') {
-        // recurse
-        const left = getIdentifiersFromBinaryExpression(side.left);
-        const right = getIdentifiersFromBinaryExpression(side.right);
-        return [].concat(left, right).filter(Boolean);
-      }
-
-      return null;
-    }
-
-    function checkPropValue(node) {
-      if (isArrayIndex(node)) {
-        // key={bar}
-        context.report({
-          node,
-          message: ERROR_MESSAGE
-        });
-        return;
-      }
-
-      if (node.type === 'TemplateLiteral') {
-        // key={`foo-${bar}`}
-        node.expressions.filter(isArrayIndex).forEach(() => {
-          context.report({node, message: ERROR_MESSAGE});
-        });
-
-        return;
-      }
-
-      if (node.type === 'BinaryExpression') {
-        // key={'foo' + bar}
-        const identifiers = getIdentifiersFromBinaryExpression(node);
-
-        identifiers.filter(isArrayIndex).forEach(() => {
-          context.report({node, message: ERROR_MESSAGE});
-        });
-      }
-    }
-
-    return {
-      CallExpression(node) {
-        if (
-          node.callee &&
-          node.callee.type === 'MemberExpression' &&
-          ['createElement', 'cloneElement'].indexOf(node.callee.property.name) !== -1 &&
-          node.arguments.length > 1
-        ) {
-          // React.createElement
-          if (!indexParamNames.length) {
-            return;
-          }
-
-          const props = node.arguments[1];
-
-          if (props.type !== 'ObjectExpression') {
-            return;
-          }
-
-          props.properties.forEach((prop) => {
-            if (!prop.key || prop.key.name !== 'key') {
-              // { ...foo }
-              // { foo: bar }
-              return;
-            }
-
-            checkPropValue(prop.value);
-          });
-
-          return;
-        }
-
-        const mapIndexParamName = getMapIndexParamName(node);
-        if (!mapIndexParamName) {
-          return;
-        }
-
-        indexParamNames.push(mapIndexParamName);
-      },
-
-      JSXAttribute(node) {
-        if (node.name.name !== 'key') {
-          // foo={bar}
-          return;
-        }
-
-        if (!indexParamNames.length) {
-          // Not inside a call expression that we think has an index param.
-          return;
-        }
-
-        const value = node.value;
-        if (!value || value.type !== 'JSXExpressionContainer') {
-          // key='foo' or just simply 'key'
-          return;
-        }
-
-        checkPropValue(value.expression);
-      },
-
-      'CallExpression:exit'(node) {
-        const mapIndexParamName = getMapIndexParamName(node);
-        if (!mapIndexParamName) {
-          return;
-        }
-
-        indexParamNames.pop();
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-children-prop.js b/node_modules/eslint-plugin-react/lib/rules/no-children-prop.js
deleted file mode 100644
index 0e9e011..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-children-prop.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * @fileoverview Prevent passing of children as props
- * @author Benjamin Stepp
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Helpers
-// ------------------------------------------------------------------------------
-
-/**
- * Checks if the node is a createElement call with a props literal.
- * @param {ASTNode} node - The AST node being checked.
- * @returns {Boolean} - True if node is a createElement call with a props
- * object literal, False if not.
-*/
-function isCreateElementWithProps(node) {
-  return node.callee &&
-    node.callee.type === 'MemberExpression' &&
-    node.callee.property.name === 'createElement' &&
-    node.arguments.length > 1 &&
-    node.arguments[1].type === 'ObjectExpression';
-}
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent passing of children as props.',
-      category: 'Best Practices',
-      recommended: true,
-      url: docsUrl('no-children-prop')
-    },
-    schema: []
-  },
-  create(context) {
-    return {
-      JSXAttribute(node) {
-        if (node.name.name !== 'children') {
-          return;
-        }
-
-        context.report({
-          node,
-          message: 'Do not pass children as props. Instead, nest children between the opening and closing tags.'
-        });
-      },
-      CallExpression(node) {
-        if (!isCreateElementWithProps(node)) {
-          return;
-        }
-
-        const props = node.arguments[1].properties;
-        const childrenProp = props.find(prop => prop.key && prop.key.name === 'children');
-
-        if (childrenProp) {
-          context.report({
-            node,
-            message: 'Do not pass children as props. Instead, pass them as additional arguments to React.createElement.'
-          });
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-danger-with-children.js b/node_modules/eslint-plugin-react/lib/rules/no-danger-with-children.js
deleted file mode 100644
index 66eb7f7..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-danger-with-children.js
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * @fileoverview Report when a DOM element is using both children and dangerouslySetInnerHTML
- * @author David Petersen
- */
-
-'use strict';
-
-const variableUtil = require('../util/variable');
-const jsxUtil = require('../util/jsx');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Report when a DOM element is using both children and dangerouslySetInnerHTML',
-      category: '',
-      recommended: true,
-      url: docsUrl('no-danger-with-children')
-    },
-    schema: [] // no options
-  },
-  create(context) {
-    function findSpreadVariable(name) {
-      return variableUtil.variablesInScope(context).find(item => item.name === name);
-    }
-    /**
-     * Takes a ObjectExpression and returns the value of the prop if it has it
-     * @param {object} node - ObjectExpression node
-     * @param {string} propName - name of the prop to look for
-     * @param {string[]} seenProps
-     * @returns {object | boolean}
-     */
-    function findObjectProp(node, propName, seenProps) {
-      if (!node.properties) {
-        return false;
-      }
-      return node.properties.find((prop) => {
-        if (prop.type === 'Property') {
-          return prop.key.name === propName;
-        }
-        if (prop.type === 'ExperimentalSpreadProperty' || prop.type === 'SpreadElement') {
-          const variable = findSpreadVariable(prop.argument.name);
-          if (variable && variable.defs.length && variable.defs[0].node.init) {
-            if (seenProps.indexOf(prop.argument.name) > -1) {
-              return false;
-            }
-            const newSeenProps = seenProps.concat(prop.argument.name || []);
-            return findObjectProp(variable.defs[0].node.init, propName, newSeenProps);
-          }
-        }
-        return false;
-      });
-    }
-
-    /**
-     * Takes a JSXElement and returns the value of the prop if it has it
-     * @param {object} node - JSXElement node
-     * @param {string} propName - name of the prop to look for
-     * @returns {object | boolean}
-     */
-    function findJsxProp(node, propName) {
-      const attributes = node.openingElement.attributes;
-      return attributes.find((attribute) => {
-        if (attribute.type === 'JSXSpreadAttribute') {
-          const variable = findSpreadVariable(attribute.argument.name);
-          if (variable && variable.defs.length && variable.defs[0].node.init) {
-            return findObjectProp(variable.defs[0].node.init, propName, []);
-          }
-        }
-        return attribute.name && attribute.name.name === propName;
-      });
-    }
-
-    /**
-     * Checks to see if a node is a line break
-     * @param {ASTNode} node The AST node being checked
-     * @returns {Boolean} True if node is a line break, false if not
-     */
-    function isLineBreak(node) {
-      const isLiteral = node.type === 'Literal' || node.type === 'JSXText';
-      const isMultiline = node.loc.start.line !== node.loc.end.line;
-      const isWhiteSpaces = jsxUtil.isWhiteSpaces(node.value);
-
-      return isLiteral && isMultiline && isWhiteSpaces;
-    }
-
-    return {
-      JSXElement(node) {
-        let hasChildren = false;
-
-        if (node.children.length && !isLineBreak(node.children[0])) {
-          hasChildren = true;
-        } else if (findJsxProp(node, 'children')) {
-          hasChildren = true;
-        }
-
-        if (
-          node.openingElement.attributes &&
-          hasChildren &&
-          findJsxProp(node, 'dangerouslySetInnerHTML')
-        ) {
-          context.report({
-            node,
-            message: 'Only set one of `children` or `props.dangerouslySetInnerHTML`'
-          });
-        }
-      },
-      CallExpression(node) {
-        if (
-          node.callee &&
-          node.callee.type === 'MemberExpression' &&
-          node.callee.property.name === 'createElement' &&
-          node.arguments.length > 1
-        ) {
-          let hasChildren = false;
-
-          let props = node.arguments[1];
-
-          if (props.type === 'Identifier') {
-            const variable = variableUtil.variablesInScope(context).find(item => item.name === props.name);
-            if (variable && variable.defs.length && variable.defs[0].node.init) {
-              props = variable.defs[0].node.init;
-            }
-          }
-
-          const dangerously = findObjectProp(props, 'dangerouslySetInnerHTML', []);
-
-          if (node.arguments.length === 2) {
-            if (findObjectProp(props, 'children', [])) {
-              hasChildren = true;
-            }
-          } else {
-            hasChildren = true;
-          }
-
-          if (dangerously && hasChildren) {
-            context.report({
-              node,
-              message: 'Only set one of `children` or `props.dangerouslySetInnerHTML`'
-            });
-          }
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-danger.js b/node_modules/eslint-plugin-react/lib/rules/no-danger.js
deleted file mode 100644
index 9322c09..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-danger.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * @fileoverview Prevent usage of dangerous JSX props
- * @author Scott Andrews
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-const jsxUtil = require('../util/jsx');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-const DANGEROUS_MESSAGE = 'Dangerous property \'{{name}}\' found';
-
-const DANGEROUS_PROPERTY_NAMES = [
-  'dangerouslySetInnerHTML'
-];
-
-const DANGEROUS_PROPERTIES = DANGEROUS_PROPERTY_NAMES.reduce((props, prop) => {
-  props[prop] = prop;
-  return props;
-}, Object.create(null));
-
-// ------------------------------------------------------------------------------
-// Helpers
-// ------------------------------------------------------------------------------
-
-/**
- * Checks if a JSX attribute is dangerous.
- * @param {String} name - Name of the attribute to check.
- * @returns {boolean} Whether or not the attribute is dnagerous.
- */
-function isDangerous(name) {
-  return name in DANGEROUS_PROPERTIES;
-}
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent usage of dangerous JSX props',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('no-danger')
-    },
-    schema: []
-  },
-
-  create(context) {
-    return {
-
-      JSXAttribute(node) {
-        if (jsxUtil.isDOMComponent(node.parent) && isDangerous(node.name.name)) {
-          context.report({
-            node,
-            message: DANGEROUS_MESSAGE,
-            data: {
-              name: node.name.name
-            }
-          });
-        }
-      }
-
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-deprecated.js b/node_modules/eslint-plugin-react/lib/rules/no-deprecated.js
deleted file mode 100644
index da354eb..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-deprecated.js
+++ /dev/null
@@ -1,220 +0,0 @@
-/**
- * @fileoverview Prevent usage of deprecated methods
- * @author Yannick Croissant
- * @author Scott Feeney
- * @author Sergei Startsev
- */
-
-'use strict';
-
-const values = require('object.values');
-
-const Components = require('../util/Components');
-const astUtil = require('../util/ast');
-const docsUrl = require('../util/docsUrl');
-const pragmaUtil = require('../util/pragma');
-const versionUtil = require('../util/version');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-const MODULES = {
-  react: ['React'],
-  'react-addons-perf': ['ReactPerf', 'Perf']
-};
-
-const DEPRECATED_MESSAGE = '{{oldMethod}} is deprecated since React {{version}}{{newMethod}}{{refs}}';
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent usage of deprecated methods',
-      category: 'Best Practices',
-      recommended: true,
-      url: docsUrl('no-deprecated')
-    },
-    schema: []
-  },
-
-  create: Components.detect((context, components, utils) => {
-    const pragma = pragmaUtil.getFromContext(context);
-
-    function getDeprecated() {
-      const deprecated = {};
-      // 0.12.0
-      deprecated[`${pragma}.renderComponent`] = ['0.12.0', `${pragma}.render`];
-      deprecated[`${pragma}.renderComponentToString`] = ['0.12.0', `${pragma}.renderToString`];
-      deprecated[`${pragma}.renderComponentToStaticMarkup`] = ['0.12.0', `${pragma}.renderToStaticMarkup`];
-      deprecated[`${pragma}.isValidComponent`] = ['0.12.0', `${pragma}.isValidElement`];
-      deprecated[`${pragma}.PropTypes.component`] = ['0.12.0', `${pragma}.PropTypes.element`];
-      deprecated[`${pragma}.PropTypes.renderable`] = ['0.12.0', `${pragma}.PropTypes.node`];
-      deprecated[`${pragma}.isValidClass`] = ['0.12.0'];
-      deprecated['this.transferPropsTo'] = ['0.12.0', 'spread operator ({...})'];
-      // 0.13.0
-      deprecated[`${pragma}.addons.classSet`] = ['0.13.0', 'the npm module classnames'];
-      deprecated[`${pragma}.addons.cloneWithProps`] = ['0.13.0', `${pragma}.cloneElement`];
-      // 0.14.0
-      deprecated[`${pragma}.render`] = ['0.14.0', 'ReactDOM.render'];
-      deprecated[`${pragma}.unmountComponentAtNode`] = ['0.14.0', 'ReactDOM.unmountComponentAtNode'];
-      deprecated[`${pragma}.findDOMNode`] = ['0.14.0', 'ReactDOM.findDOMNode'];
-      deprecated[`${pragma}.renderToString`] = ['0.14.0', 'ReactDOMServer.renderToString'];
-      deprecated[`${pragma}.renderToStaticMarkup`] = ['0.14.0', 'ReactDOMServer.renderToStaticMarkup'];
-      // 15.0.0
-      deprecated[`${pragma}.addons.LinkedStateMixin`] = ['15.0.0'];
-      deprecated['ReactPerf.printDOM'] = ['15.0.0', 'ReactPerf.printOperations'];
-      deprecated['Perf.printDOM'] = ['15.0.0', 'Perf.printOperations'];
-      deprecated['ReactPerf.getMeasurementsSummaryMap'] = ['15.0.0', 'ReactPerf.getWasted'];
-      deprecated['Perf.getMeasurementsSummaryMap'] = ['15.0.0', 'Perf.getWasted'];
-      // 15.5.0
-      deprecated[`${pragma}.createClass`] = ['15.5.0', 'the npm module create-react-class'];
-      deprecated[`${pragma}.addons.TestUtils`] = ['15.5.0', 'ReactDOM.TestUtils'];
-      deprecated[`${pragma}.PropTypes`] = ['15.5.0', 'the npm module prop-types'];
-      // 15.6.0
-      deprecated[`${pragma}.DOM`] = ['15.6.0', 'the npm module react-dom-factories'];
-      // 16.9.0
-      // For now the following life-cycle methods are just legacy, not deprecated:
-      // `componentWillMount`, `componentWillReceiveProps`, `componentWillUpdate`
-      // https://github.com/yannickcr/eslint-plugin-react/pull/1750#issuecomment-425975934
-      deprecated.componentWillMount = [
-        '16.9.0',
-        'UNSAFE_componentWillMount',
-        'https://reactjs.org/docs/react-component.html#unsafe_componentwillmount. ' +
-        'Use https://github.com/reactjs/react-codemod#rename-unsafe-lifecycles to automatically update your components.'
-      ];
-      deprecated.componentWillReceiveProps = [
-        '16.9.0',
-        'UNSAFE_componentWillReceiveProps',
-        'https://reactjs.org/docs/react-component.html#unsafe_componentwillreceiveprops. ' +
-        'Use https://github.com/reactjs/react-codemod#rename-unsafe-lifecycles to automatically update your components.'
-      ];
-      deprecated.componentWillUpdate = [
-        '16.9.0',
-        'UNSAFE_componentWillUpdate',
-        'https://reactjs.org/docs/react-component.html#unsafe_componentwillupdate. ' +
-        'Use https://github.com/reactjs/react-codemod#rename-unsafe-lifecycles to automatically update your components.'
-      ];
-      return deprecated;
-    }
-
-    function isDeprecated(method) {
-      const deprecated = getDeprecated();
-
-      return (
-        deprecated &&
-        deprecated[method] &&
-        deprecated[method][0] &&
-        versionUtil.testReactVersion(context, deprecated[method][0])
-      );
-    }
-
-    function checkDeprecation(node, methodName, methodNode) {
-      if (!isDeprecated(methodName)) {
-        return;
-      }
-      const deprecated = getDeprecated();
-      const version = deprecated[methodName][0];
-      const newMethod = deprecated[methodName][1];
-      const refs = deprecated[methodName][2];
-      context.report({
-        node: methodNode || node,
-        message: DEPRECATED_MESSAGE,
-        data: {
-          oldMethod: methodName,
-          version,
-          newMethod: newMethod ? `, use ${newMethod} instead` : '',
-          refs: refs ? `, see ${refs}` : ''
-        }
-      });
-    }
-
-    function getReactModuleName(node) {
-      let moduleName = false;
-      if (!node.init) {
-        return moduleName;
-      }
-
-      values(MODULES).some((moduleNames) => {
-        moduleName = moduleNames.find(name => name === node.init.name);
-        return moduleName;
-      });
-
-      return moduleName;
-    }
-
-    /**
-     * Returns life cycle methods if available
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Array} The array of methods.
-     */
-    function getLifeCycleMethods(node) {
-      const properties = astUtil.getComponentProperties(node);
-      return properties.map(property => ({
-        name: astUtil.getPropertyName(property),
-        node: astUtil.getPropertyNameNode(property)
-      }));
-    }
-
-    /**
-     * Checks life cycle methods
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function checkLifeCycleMethods(node) {
-      if (utils.isES5Component(node) || utils.isES6Component(node)) {
-        const methods = getLifeCycleMethods(node);
-        methods.forEach(method => checkDeprecation(node, method.name, method.node));
-      }
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      MemberExpression(node) {
-        checkDeprecation(node, context.getSourceCode().getText(node));
-      },
-
-      ImportDeclaration(node) {
-        const isReactImport = typeof MODULES[node.source.value] !== 'undefined';
-        if (!isReactImport) {
-          return;
-        }
-        node.specifiers.forEach((specifier) => {
-          if (!specifier.imported) {
-            return;
-          }
-          checkDeprecation(node, `${MODULES[node.source.value][0]}.${specifier.imported.name}`);
-        });
-      },
-
-      VariableDeclarator(node) {
-        const reactModuleName = getReactModuleName(node);
-        const isRequire = node.init && node.init.callee && node.init.callee.name === 'require';
-        const isReactRequire = node.init &&
-          node.init.arguments &&
-          node.init.arguments.length &&
-          typeof MODULES[node.init.arguments[0].value] !== 'undefined';
-        const isDestructuring = node.id && node.id.type === 'ObjectPattern';
-
-        if (
-          !(isDestructuring && reactModuleName) &&
-          !(isDestructuring && isRequire && isReactRequire)
-        ) {
-          return;
-        }
-        node.id.properties.forEach((property) => {
-          checkDeprecation(node, `${reactModuleName || pragma}.${property.key.name}`);
-        });
-      },
-
-      ClassDeclaration: checkLifeCycleMethods,
-      ClassExpression: checkLifeCycleMethods,
-      ObjectExpression: checkLifeCycleMethods
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-did-mount-set-state.js b/node_modules/eslint-plugin-react/lib/rules/no-did-mount-set-state.js
deleted file mode 100644
index a5705ef..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-did-mount-set-state.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * @fileoverview Prevent usage of setState in componentDidMount
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const makeNoMethodSetStateRule = require('../util/makeNoMethodSetStateRule');
-
-module.exports = makeNoMethodSetStateRule('componentDidMount');
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-did-update-set-state.js b/node_modules/eslint-plugin-react/lib/rules/no-did-update-set-state.js
deleted file mode 100644
index 5c76a1f..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-did-update-set-state.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * @fileoverview Prevent usage of setState in componentDidUpdate
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const makeNoMethodSetStateRule = require('../util/makeNoMethodSetStateRule');
-
-module.exports = makeNoMethodSetStateRule('componentDidUpdate');
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-direct-mutation-state.js b/node_modules/eslint-plugin-react/lib/rules/no-direct-mutation-state.js
deleted file mode 100644
index 816fbeb..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-direct-mutation-state.js
+++ /dev/null
@@ -1,147 +0,0 @@
-/**
- * @fileoverview Prevent direct mutation of this.state
- * @author David Petersen
- * @author Nicolas Fernandez <@burabure>
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent direct mutation of this.state',
-      category: 'Possible Errors',
-      recommended: true,
-      url: docsUrl('no-direct-mutation-state')
-    }
-  },
-
-  create: Components.detect((context, components, utils) => {
-    /**
-     * Checks if the component is valid
-     * @param {Object} component The component to process
-     * @returns {Boolean} True if the component is valid, false if not.
-     */
-    function isValid(component) {
-      return Boolean(component && !component.mutateSetState);
-    }
-
-    /**
-     * Reports undeclared proptypes for a given component
-     * @param {Object} component The component to process
-     */
-    function reportMutations(component) {
-      let mutation;
-      for (let i = 0, j = component.mutations.length; i < j; i++) {
-        mutation = component.mutations[i];
-        context.report({
-          node: mutation,
-          message: 'Do not mutate state directly. Use setState().'
-        });
-      }
-    }
-
-    /**
-     * Walks throughs the MemberExpression to the top-most property.
-     * @param {Object} node The node to process
-     * @returns {Object} The outer-most MemberExpression
-     */
-    function getOuterMemberExpression(node) {
-      while (node.object && node.object.property) {
-        node = node.object;
-      }
-      return node;
-    }
-
-    /**
-     * Determine if we should currently ignore assignments in this component.
-     * @param {?Object} component The component to process
-     * @returns {Boolean} True if we should skip assignment checks.
-     */
-    function shouldIgnoreComponent(component) {
-      return !component || (component.inConstructor && !component.inCallExpression);
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-    return {
-      MethodDefinition(node) {
-        if (node.kind === 'constructor') {
-          components.set(node, {
-            inConstructor: true
-          });
-        }
-      },
-
-      CallExpression(node) {
-        components.set(node, {
-          inCallExpression: true
-        });
-      },
-
-      AssignmentExpression(node) {
-        const component = components.get(utils.getParentComponent());
-        if (shouldIgnoreComponent(component) || !node.left || !node.left.object) {
-          return;
-        }
-        const item = getOuterMemberExpression(node.left);
-        if (utils.isStateMemberExpression(item)) {
-          const mutations = (component && component.mutations) || [];
-          mutations.push(node.left.object);
-          components.set(node, {
-            mutateSetState: true,
-            mutations
-          });
-        }
-      },
-
-      UpdateExpression(node) {
-        const component = components.get(utils.getParentComponent());
-        if (shouldIgnoreComponent(component) || node.argument.type !== 'MemberExpression') {
-          return;
-        }
-        const item = getOuterMemberExpression(node.argument);
-        if (utils.isStateMemberExpression(item)) {
-          const mutations = (component && component.mutations) || [];
-          mutations.push(item);
-          components.set(node, {
-            mutateSetState: true,
-            mutations
-          });
-        }
-      },
-
-      'CallExpression:exit'(node) {
-        components.set(node, {
-          inCallExpression: false
-        });
-      },
-
-      'MethodDefinition:exit'(node) {
-        if (node.kind === 'constructor') {
-          components.set(node, {
-            inConstructor: false
-          });
-        }
-      },
-
-      'Program:exit'() {
-        const list = components.list();
-
-        Object.keys(list).forEach((key) => {
-          if (!isValid(list[key])) {
-            reportMutations(list[key]);
-          }
-        });
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-find-dom-node.js b/node_modules/eslint-plugin-react/lib/rules/no-find-dom-node.js
deleted file mode 100644
index f62e821..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-find-dom-node.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * @fileoverview Prevent usage of findDOMNode
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent usage of findDOMNode',
-      category: 'Best Practices',
-      recommended: true,
-      url: docsUrl('no-find-dom-node')
-    },
-    schema: []
-  },
-
-  create(context) {
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-
-      CallExpression(node) {
-        const callee = node.callee;
-
-        const isfindDOMNode = (callee.name === 'findDOMNode') ||
-          (callee.property && callee.property.name === 'findDOMNode');
-        if (!isfindDOMNode) {
-          return;
-        }
-
-        context.report({
-          node: callee,
-          message: 'Do not use findDOMNode'
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-is-mounted.js b/node_modules/eslint-plugin-react/lib/rules/no-is-mounted.js
deleted file mode 100644
index 3132079..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-is-mounted.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * @fileoverview Prevent usage of isMounted
- * @author Joe Lencioni
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent usage of isMounted',
-      category: 'Best Practices',
-      recommended: true,
-      url: docsUrl('no-is-mounted')
-    },
-    schema: []
-  },
-
-  create(context) {
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-
-      CallExpression(node) {
-        const callee = node.callee;
-        if (callee.type !== 'MemberExpression') {
-          return;
-        }
-        if (callee.object.type !== 'ThisExpression' || callee.property.name !== 'isMounted') {
-          return;
-        }
-        const ancestors = context.getAncestors(callee);
-        for (let i = 0, j = ancestors.length; i < j; i++) {
-          if (ancestors[i].type === 'Property' || ancestors[i].type === 'MethodDefinition') {
-            context.report({
-              node: callee,
-              message: 'Do not use isMounted'
-            });
-            break;
-          }
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-multi-comp.js b/node_modules/eslint-plugin-react/lib/rules/no-multi-comp.js
deleted file mode 100644
index 12c5bf8..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-multi-comp.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * @fileoverview Prevent multiple component definition per file
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent multiple component definition per file',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('no-multi-comp')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        ignoreStateless: {
-          default: false,
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create: Components.detect((context, components, utils) => {
-    const configuration = context.options[0] || {};
-    const ignoreStateless = configuration.ignoreStateless || false;
-
-    const MULTI_COMP_MESSAGE = 'Declare only one React component per file';
-
-    /**
-     * Checks if the component is ignored
-     * @param {Object} component The component being checked.
-     * @returns {Boolean} True if the component is ignored, false if not.
-     */
-    function isIgnored(component) {
-      return (
-        ignoreStateless && (
-          /Function/.test(component.node.type) ||
-          utils.isPragmaComponentWrapper(component.node)
-        )
-      );
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      'Program:exit'() {
-        if (components.length() <= 1) {
-          return;
-        }
-
-        const list = components.list();
-
-        Object.keys(list).filter(component => !isIgnored(list[component])).forEach((component, i) => {
-          if (i >= 1) {
-            context.report({
-              node: list[component].node,
-              message: MULTI_COMP_MESSAGE
-            });
-          }
-        });
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-redundant-should-component-update.js b/node_modules/eslint-plugin-react/lib/rules/no-redundant-should-component-update.js
deleted file mode 100644
index 3321dff..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-redundant-should-component-update.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * @fileoverview Flag shouldComponentUpdate when extending PureComponent
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const astUtil = require('../util/ast');
-const docsUrl = require('../util/docsUrl');
-
-function errorMessage(node) {
-  return `${node} does not need shouldComponentUpdate when extending React.PureComponent.`;
-}
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Flag shouldComponentUpdate when extending PureComponent',
-      category: 'Possible Errors',
-      recommended: false,
-      url: docsUrl('no-redundant-should-component-update')
-    },
-    schema: []
-  },
-
-  create: Components.detect((context, components, utils) => {
-    /**
-     * Checks for shouldComponentUpdate property
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} Whether or not the property exists.
-     */
-    function hasShouldComponentUpdate(node) {
-      const properties = astUtil.getComponentProperties(node);
-      return properties.some((property) => {
-        const name = astUtil.getPropertyName(property);
-        return name === 'shouldComponentUpdate';
-      });
-    }
-
-    /**
-     * Get name of node if available
-     * @param {ASTNode} node The AST node being checked.
-     * @return {String} The name of the node
-     */
-    function getNodeName(node) {
-      if (node.id) {
-        return node.id.name;
-      }
-      if (node.parent && node.parent.id) {
-        return node.parent.id.name;
-      }
-      return '';
-    }
-
-    /**
-     * Checks for violation of rule
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function checkForViolation(node) {
-      if (utils.isPureComponent(node)) {
-        const hasScu = hasShouldComponentUpdate(node);
-        if (hasScu) {
-          const className = getNodeName(node);
-          context.report({
-            node,
-            message: errorMessage(className)
-          });
-        }
-      }
-    }
-
-    return {
-      ClassDeclaration: checkForViolation,
-      ClassExpression: checkForViolation
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-render-return-value.js b/node_modules/eslint-plugin-react/lib/rules/no-render-return-value.js
deleted file mode 100644
index 103887d..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-render-return-value.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * @fileoverview Prevent usage of the return value of React.render
- * @author Dustan Kasten
- */
-
-'use strict';
-
-const versionUtil = require('../util/version');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent usage of the return value of React.render',
-      category: 'Best Practices',
-      recommended: true,
-      url: docsUrl('no-render-return-value')
-    },
-    schema: []
-  },
-
-  create(context) {
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    let calleeObjectName = /^ReactDOM$/;
-    if (versionUtil.testReactVersion(context, '15.0.0')) {
-      calleeObjectName = /^ReactDOM$/;
-    } else if (versionUtil.testReactVersion(context, '0.14.0')) {
-      calleeObjectName = /^React(DOM)?$/;
-    } else if (versionUtil.testReactVersion(context, '0.13.0')) {
-      calleeObjectName = /^React$/;
-    }
-
-    return {
-
-      CallExpression(node) {
-        const callee = node.callee;
-        const parent = node.parent;
-        if (callee.type !== 'MemberExpression') {
-          return;
-        }
-
-        if (
-          callee.object.type !== 'Identifier' ||
-          !calleeObjectName.test(callee.object.name) ||
-          callee.property.name !== 'render'
-        ) {
-          return;
-        }
-
-        if (
-          parent.type === 'VariableDeclarator' ||
-          parent.type === 'Property' ||
-          parent.type === 'ReturnStatement' ||
-          parent.type === 'ArrowFunctionExpression' ||
-          parent.type === 'AssignmentExpression'
-        ) {
-          context.report({
-            node: callee,
-            message: `Do not depend on the return value from ${callee.object.name}.render`
-          });
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-set-state.js b/node_modules/eslint-plugin-react/lib/rules/no-set-state.js
deleted file mode 100644
index 7e0c67f..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-set-state.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * @fileoverview Prevent usage of setState
- * @author Mark Dalgleish
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent usage of setState',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('no-set-state')
-    },
-    schema: []
-  },
-
-  create: Components.detect((context, components, utils) => {
-    /**
-     * Checks if the component is valid
-     * @param {Object} component The component to process
-     * @returns {Boolean} True if the component is valid, false if not.
-     */
-    function isValid(component) {
-      return Boolean(component && !component.useSetState);
-    }
-
-    /**
-     * Reports usages of setState for a given component
-     * @param {Object} component The component to process
-     */
-    function reportSetStateUsages(component) {
-      let setStateUsage;
-      for (let i = 0, j = component.setStateUsages.length; i < j; i++) {
-        setStateUsage = component.setStateUsages[i];
-        context.report({
-          node: setStateUsage,
-          message: 'Do not use setState'
-        });
-      }
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-
-      CallExpression(node) {
-        const callee = node.callee;
-        if (
-          callee.type !== 'MemberExpression' ||
-          callee.object.type !== 'ThisExpression' ||
-          callee.property.name !== 'setState'
-        ) {
-          return;
-        }
-        const component = components.get(utils.getParentComponent());
-        const setStateUsages = component && component.setStateUsages || [];
-        setStateUsages.push(callee);
-        components.set(node, {
-          useSetState: true,
-          setStateUsages
-        });
-      },
-
-      'Program:exit'() {
-        const list = components.list();
-        Object.keys(list).filter(component => !isValid(list[component])).forEach((component) => {
-          reportSetStateUsages(list[component]);
-        });
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-string-refs.js b/node_modules/eslint-plugin-react/lib/rules/no-string-refs.js
deleted file mode 100644
index 96ebc2e..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-string-refs.js
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * @fileoverview Prevent string definitions for references and prevent referencing this.refs
- * @author Tom Hastjarjanto
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent string definitions for references and prevent referencing this.refs',
-      category: 'Best Practices',
-      recommended: true,
-      url: docsUrl('no-string-refs')
-    },
-    schema: [{
-      type: 'object',
-      properties: {
-        noTemplateLiterals: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create: Components.detect((context, components, utils) => {
-    const detectTemplateLiterals = context.options[0] ? context.options[0].noTemplateLiterals : false;
-    /**
-     * Checks if we are using refs
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if we are using refs, false if not.
-     */
-    function isRefsUsage(node) {
-      return Boolean(
-        (
-          utils.getParentES6Component() ||
-          utils.getParentES5Component()
-        ) &&
-        node.object.type === 'ThisExpression' &&
-        node.property.name === 'refs'
-      );
-    }
-
-    /**
-     * Checks if we are using a ref attribute
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if we are using a ref attribute, false if not.
-     */
-    function isRefAttribute(node) {
-      return Boolean(
-        node.type === 'JSXAttribute' &&
-        node.name &&
-        node.name.name === 'ref'
-      );
-    }
-
-    /**
-     * Checks if a node contains a string value
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if the node contains a string value, false if not.
-     */
-    function containsStringLiteral(node) {
-      return Boolean(
-        node.value &&
-        node.value.type === 'Literal' &&
-        typeof node.value.value === 'string'
-      );
-    }
-
-    /**
-     * Checks if a node contains a string value within a jsx expression
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if the node contains a string value within a jsx expression, false if not.
-     */
-    function containsStringExpressionContainer(node) {
-      return Boolean(
-        node.value &&
-        node.value.type === 'JSXExpressionContainer' &&
-        node.value.expression &&
-        ((node.value.expression.type === 'Literal' && typeof node.value.expression.value === 'string') ||
-        (node.value.expression.type === 'TemplateLiteral' && detectTemplateLiterals))
-      );
-    }
-
-    return {
-      MemberExpression(node) {
-        if (isRefsUsage(node)) {
-          context.report({
-            node,
-            message: 'Using this.refs is deprecated.'
-          });
-        }
-      },
-      JSXAttribute(node) {
-        if (
-          isRefAttribute(node) &&
-          (containsStringLiteral(node) || containsStringExpressionContainer(node))
-        ) {
-          context.report({
-            node,
-            message: 'Using string literals in ref attributes is deprecated.'
-          });
-        }
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-this-in-sfc.js b/node_modules/eslint-plugin-react/lib/rules/no-this-in-sfc.js
deleted file mode 100644
index df86ba5..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-this-in-sfc.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * @fileoverview Report "this" being used in stateless functional components.
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-const ERROR_MESSAGE = 'Stateless functional components should not use this';
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Report "this" being used in stateless components',
-      category: 'Possible Errors',
-      recommended: false,
-      url: docsUrl('no-this-in-sfc')
-    },
-    schema: []
-  },
-
-  create: Components.detect((context, components, utils) => ({
-    MemberExpression(node) {
-      if (node.object.type === 'ThisExpression') {
-        const component = components.get(utils.getParentStatelessComponent());
-        if (!component || component.node && component.node.parent && component.node.parent.type === 'Property') {
-          return;
-        }
-        context.report({
-          node,
-          message: ERROR_MESSAGE
-        });
-      }
-    }
-  }))
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-typos.js b/node_modules/eslint-plugin-react/lib/rules/no-typos.js
deleted file mode 100644
index ec1d6a2..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-typos.js
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
- * @fileoverview Prevent common casing typos
- */
-
-'use strict';
-
-const PROP_TYPES = Object.keys(require('prop-types'));
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-const STATIC_CLASS_PROPERTIES = ['propTypes', 'contextTypes', 'childContextTypes', 'defaultProps'];
-const STATIC_LIFECYCLE_METHODS = ['getDerivedStateFromProps'];
-const LIFECYCLE_METHODS = [
-  'getDerivedStateFromProps',
-  'componentWillMount',
-  'UNSAFE_componentWillMount',
-  'componentDidMount',
-  'componentWillReceiveProps',
-  'UNSAFE_componentWillReceiveProps',
-  'shouldComponentUpdate',
-  'componentWillUpdate',
-  'UNSAFE_componentWillUpdate',
-  'getSnapshotBeforeUpdate',
-  'componentDidUpdate',
-  'componentDidCatch',
-  'componentWillUnmount',
-  'render'
-];
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent common typos',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('no-typos')
-    },
-    schema: []
-  },
-
-  create: Components.detect((context, components, utils) => {
-    let propTypesPackageName = null;
-    let reactPackageName = null;
-
-    function checkValidPropTypeQualifier(node) {
-      if (node.name !== 'isRequired') {
-        context.report({
-          node,
-          message: 'Typo in prop type chain qualifier: {{name}}',
-          data: {name: node.name}
-        });
-      }
-    }
-
-    function checkValidPropType(node) {
-      if (node.name && !PROP_TYPES.some(propTypeName => propTypeName === node.name)) {
-        context.report({
-          node,
-          message: 'Typo in declared prop type: {{name}}',
-          data: {name: node.name}
-        });
-      }
-    }
-
-    function isPropTypesPackage(node) {
-      return (
-        node.type === 'Identifier' &&
-        node.name === propTypesPackageName
-      ) || (
-        node.type === 'MemberExpression' &&
-        node.property.name === 'PropTypes' &&
-        node.object.name === reactPackageName
-      );
-    }
-
-    /* eslint-disable no-use-before-define */
-
-    function checkValidCallExpression(node) {
-      const callee = node.callee;
-      if (callee.type === 'MemberExpression' && callee.property.name === 'shape') {
-        checkValidPropObject(node.arguments[0]);
-      } else if (callee.type === 'MemberExpression' && callee.property.name === 'oneOfType') {
-        const args = node.arguments[0];
-        if (args && args.type === 'ArrayExpression') {
-          args.elements.forEach((el) => {
-            checkValidProp(el);
-          });
-        }
-      }
-    }
-
-    function checkValidProp(node) {
-      if ((!propTypesPackageName && !reactPackageName) || !node) {
-        return;
-      }
-
-      if (node.type === 'MemberExpression') {
-        if (
-          node.object.type === 'MemberExpression' &&
-          isPropTypesPackage(node.object.object)
-        ) { // PropTypes.myProp.isRequired
-          checkValidPropType(node.object.property);
-          checkValidPropTypeQualifier(node.property);
-        } else if (
-          isPropTypesPackage(node.object) &&
-          node.property.name !== 'isRequired'
-        ) { // PropTypes.myProp
-          checkValidPropType(node.property);
-        } else if (node.object.type === 'CallExpression') {
-          checkValidPropTypeQualifier(node.property);
-          checkValidCallExpression(node.object);
-        }
-      } else if (node.type === 'CallExpression') {
-        checkValidCallExpression(node);
-      }
-    }
-
-    /* eslint-enable no-use-before-define */
-
-    function checkValidPropObject(node) {
-      if (node && node.type === 'ObjectExpression') {
-        node.properties.forEach(prop => checkValidProp(prop.value));
-      }
-    }
-
-    function reportErrorIfPropertyCasingTypo(propertyValue, propertyKey, isClassProperty) {
-      const propertyName = propertyKey.name;
-      if (propertyName === 'propTypes' || propertyName === 'contextTypes' || propertyName === 'childContextTypes') {
-        checkValidPropObject(propertyValue);
-      }
-      STATIC_CLASS_PROPERTIES.forEach((CLASS_PROP) => {
-        if (propertyName && CLASS_PROP.toLowerCase() === propertyName.toLowerCase() && CLASS_PROP !== propertyName) {
-          const message = isClassProperty ?
-            'Typo in static class property declaration' :
-            'Typo in property declaration';
-          context.report({
-            node: propertyKey,
-            message
-          });
-        }
-      });
-    }
-
-    function reportErrorIfLifecycleMethodCasingTypo(node) {
-      let nodeKeyName = node.key.name;
-      if (node.key.type === 'Literal') {
-        nodeKeyName = node.key.value;
-      }
-
-      STATIC_LIFECYCLE_METHODS.forEach((method) => {
-        if (!node.static && nodeKeyName.toLowerCase() === method.toLowerCase()) {
-          context.report({
-            node,
-            message: `Lifecycle method should be static: ${nodeKeyName}`
-          });
-        }
-      });
-
-      LIFECYCLE_METHODS.forEach((method) => {
-        if (method.toLowerCase() === nodeKeyName.toLowerCase() && method !== nodeKeyName) {
-          context.report({
-            node,
-            message: 'Typo in component lifecycle method declaration: {{actual}} should be {{expected}}',
-            data: {actual: nodeKeyName, expected: method}
-          });
-        }
-      });
-    }
-
-    return {
-      ImportDeclaration(node) {
-        if (node.source && node.source.value === 'prop-types') { // import PropType from "prop-types"
-          propTypesPackageName = node.specifiers[0].local.name;
-        } else if (node.source && node.source.value === 'react') { // import { PropTypes } from "react"
-          if (node.specifiers.length > 0) {
-            reactPackageName = node.specifiers[0].local.name; // guard against accidental anonymous `import "react"`
-          }
-          if (node.specifiers.length >= 1) {
-            const propTypesSpecifier = node.specifiers.find(specifier => (
-              specifier.imported && specifier.imported.name === 'PropTypes'
-            ));
-            if (propTypesSpecifier) {
-              propTypesPackageName = propTypesSpecifier.local.name;
-            }
-          }
-        }
-      },
-
-      ClassProperty(node) {
-        if (!node.static || !utils.isES6Component(node.parent.parent)) {
-          return;
-        }
-
-        reportErrorIfPropertyCasingTypo(node.value, node.key, true);
-      },
-
-      MemberExpression(node) {
-        const propertyName = node.property.name;
-
-        if (
-          !propertyName ||
-          STATIC_CLASS_PROPERTIES.map(prop => prop.toLocaleLowerCase()).indexOf(propertyName.toLowerCase()) === -1
-        ) {
-          return;
-        }
-
-        const relatedComponent = utils.getRelatedComponent(node);
-
-        if (
-          relatedComponent &&
-          (utils.isES6Component(relatedComponent.node) || utils.isReturningJSX(relatedComponent.node)) &&
-          (node.parent && node.parent.type === 'AssignmentExpression' && node.parent.right)
-        ) {
-          reportErrorIfPropertyCasingTypo(node.parent.right, node.property, true);
-        }
-      },
-
-      MethodDefinition(node) {
-        if (!utils.isES6Component(node.parent.parent)) {
-          return;
-        }
-
-        reportErrorIfLifecycleMethodCasingTypo(node);
-      },
-
-      ObjectExpression(node) {
-        const component = utils.isES5Component(node) && components.get(node);
-
-        if (!component) {
-          return;
-        }
-
-        node.properties.forEach((property) => {
-          reportErrorIfPropertyCasingTypo(property.value, property.key, false);
-          reportErrorIfLifecycleMethodCasingTypo(property);
-        });
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-unescaped-entities.js b/node_modules/eslint-plugin-react/lib/rules/no-unescaped-entities.js
deleted file mode 100644
index e42e140..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-unescaped-entities.js
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- * @fileoverview HTML special characters should be escaped.
- * @author Patrick Hayes
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-const jsxUtil = require('../util/jsx');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-// NOTE: '<' and '{' are also problematic characters, but they do not need
-// to be included here because it is a syntax error when these characters are
-// included accidentally.
-const DEFAULTS = [{
-  char: '>',
-  alternatives: ['&gt;']
-}, {
-  char: '"',
-  alternatives: ['&quot;', '&ldquo;', '&#34;', '&rdquo;']
-}, {
-  char: '\'',
-  alternatives: ['&apos;', '&lsquo;', '&#39;', '&rsquo;']
-}, {
-  char: '}',
-  alternatives: ['&#125;']
-}];
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Detect unescaped HTML entities, which might represent malformed tags',
-      category: 'Possible Errors',
-      recommended: true,
-      url: docsUrl('no-unescaped-entities')
-    },
-    schema: [{
-      type: 'object',
-      properties: {
-        forbid: {
-          type: 'array',
-          items: {
-            oneOf: [{
-              type: 'string'
-            }, {
-              type: 'object',
-              properties: {
-                char: {
-                  type: 'string'
-                },
-                alternatives: {
-                  type: 'array',
-                  uniqueItems: true,
-                  items: {
-                    type: 'string'
-                  }
-                }
-              }
-            }]
-          }
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    function reportInvalidEntity(node) {
-      const configuration = context.options[0] || {};
-      const entities = configuration.forbid || DEFAULTS;
-
-      // HTML entites are already escaped in node.value (as well as node.raw),
-      // so pull the raw text from context.getSourceCode()
-      for (let i = node.loc.start.line; i <= node.loc.end.line; i++) {
-        let rawLine = context.getSourceCode().lines[i - 1];
-        let start = 0;
-        let end = rawLine.length;
-        if (i === node.loc.start.line) {
-          start = node.loc.start.column;
-        }
-        if (i === node.loc.end.line) {
-          end = node.loc.end.column;
-        }
-        rawLine = rawLine.substring(start, end);
-        for (let j = 0; j < entities.length; j++) {
-          for (let index = 0; index < rawLine.length; index++) {
-            const c = rawLine[index];
-            if (typeof entities[j] === 'string') {
-              if (c === entities[j]) {
-                context.report({
-                  loc: {line: i, column: start + index},
-                  message: `HTML entity, \`${entities[j]}\` , must be escaped.`,
-                  node
-                });
-              }
-            } else if (c === entities[j].char) {
-              context.report({
-                loc: {line: i, column: start + index},
-                message: `\`${entities[j].char}\` can be escaped with ${entities[j].alternatives.map(alt => `\`${alt}\``).join(', ')}.`,
-                node
-              });
-            }
-          }
-        }
-      }
-    }
-
-    return {
-      'Literal, JSXText'(node) {
-        if (jsxUtil.isJSX(node.parent)) {
-          reportInvalidEntity(node);
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-unknown-property.js b/node_modules/eslint-plugin-react/lib/rules/no-unknown-property.js
deleted file mode 100644
index 9152f5e..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-unknown-property.js
+++ /dev/null
@@ -1,293 +0,0 @@
-/**
- * @fileoverview Prevent usage of unknown DOM property
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-const versionUtil = require('../util/version');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-const DEFAULTS = {
-  ignore: []
-};
-
-const UNKNOWN_MESSAGE = 'Unknown property \'{{name}}\' found, use \'{{standardName}}\' instead';
-const WRONG_TAG_MESSAGE = 'Invalid property \'{{name}}\' found on tag \'{{tagName}}\', but it is only allowed on: {{allowedTags}}';
-
-const DOM_ATTRIBUTE_NAMES = {
-  'accept-charset': 'acceptCharset',
-  class: 'className',
-  for: 'htmlFor',
-  'http-equiv': 'httpEquiv',
-  crossorigin: 'crossOrigin'
-};
-
-const ATTRIBUTE_TAGS_MAP = {
-  crossOrigin: ['script', 'img', 'video', 'audio', 'link']
-};
-
-const SVGDOM_ATTRIBUTE_NAMES = {
-  'accent-height': 'accentHeight',
-  'alignment-baseline': 'alignmentBaseline',
-  'arabic-form': 'arabicForm',
-  'baseline-shift': 'baselineShift',
-  'cap-height': 'capHeight',
-  'clip-path': 'clipPath',
-  'clip-rule': 'clipRule',
-  'color-interpolation': 'colorInterpolation',
-  'color-interpolation-filters': 'colorInterpolationFilters',
-  'color-profile': 'colorProfile',
-  'color-rendering': 'colorRendering',
-  'dominant-baseline': 'dominantBaseline',
-  'enable-background': 'enableBackground',
-  'fill-opacity': 'fillOpacity',
-  'fill-rule': 'fillRule',
-  'flood-color': 'floodColor',
-  'flood-opacity': 'floodOpacity',
-  'font-family': 'fontFamily',
-  'font-size': 'fontSize',
-  'font-size-adjust': 'fontSizeAdjust',
-  'font-stretch': 'fontStretch',
-  'font-style': 'fontStyle',
-  'font-variant': 'fontVariant',
-  'font-weight': 'fontWeight',
-  'glyph-name': 'glyphName',
-  'glyph-orientation-horizontal': 'glyphOrientationHorizontal',
-  'glyph-orientation-vertical': 'glyphOrientationVertical',
-  'horiz-adv-x': 'horizAdvX',
-  'horiz-origin-x': 'horizOriginX',
-  'image-rendering': 'imageRendering',
-  'letter-spacing': 'letterSpacing',
-  'lighting-color': 'lightingColor',
-  'marker-end': 'markerEnd',
-  'marker-mid': 'markerMid',
-  'marker-start': 'markerStart',
-  'overline-position': 'overlinePosition',
-  'overline-thickness': 'overlineThickness',
-  'paint-order': 'paintOrder',
-  'panose-1': 'panose1',
-  'pointer-events': 'pointerEvents',
-  'rendering-intent': 'renderingIntent',
-  'shape-rendering': 'shapeRendering',
-  'stop-color': 'stopColor',
-  'stop-opacity': 'stopOpacity',
-  'strikethrough-position': 'strikethroughPosition',
-  'strikethrough-thickness': 'strikethroughThickness',
-  'stroke-dasharray': 'strokeDasharray',
-  'stroke-dashoffset': 'strokeDashoffset',
-  'stroke-linecap': 'strokeLinecap',
-  'stroke-linejoin': 'strokeLinejoin',
-  'stroke-miterlimit': 'strokeMiterlimit',
-  'stroke-opacity': 'strokeOpacity',
-  'stroke-width': 'strokeWidth',
-  'text-anchor': 'textAnchor',
-  'text-decoration': 'textDecoration',
-  'text-rendering': 'textRendering',
-  'underline-position': 'underlinePosition',
-  'underline-thickness': 'underlineThickness',
-  'unicode-bidi': 'unicodeBidi',
-  'unicode-range': 'unicodeRange',
-  'units-per-em': 'unitsPerEm',
-  'v-alphabetic': 'vAlphabetic',
-  'v-hanging': 'vHanging',
-  'v-ideographic': 'vIdeographic',
-  'v-mathematical': 'vMathematical',
-  'vector-effect': 'vectorEffect',
-  'vert-adv-y': 'vertAdvY',
-  'vert-origin-x': 'vertOriginX',
-  'vert-origin-y': 'vertOriginY',
-  'word-spacing': 'wordSpacing',
-  'writing-mode': 'writingMode',
-  'x-height': 'xHeight',
-  'xlink:actuate': 'xlinkActuate',
-  'xlink:arcrole': 'xlinkArcrole',
-  'xlink:href': 'xlinkHref',
-  'xlink:role': 'xlinkRole',
-  'xlink:show': 'xlinkShow',
-  'xlink:title': 'xlinkTitle',
-  'xlink:type': 'xlinkType',
-  'xml:base': 'xmlBase',
-  'xml:lang': 'xmlLang',
-  'xml:space': 'xmlSpace'
-};
-
-const DOM_PROPERTY_NAMES = [
-  // Standard
-  'acceptCharset', 'accessKey', 'allowFullScreen', 'autoComplete', 'autoFocus', 'autoPlay',
-  'cellPadding', 'cellSpacing', 'classID', 'className', 'colSpan', 'contentEditable', 'contextMenu',
-  'dateTime', 'encType', 'formAction', 'formEncType', 'formMethod', 'formNoValidate', 'formTarget',
-  'frameBorder', 'hrefLang', 'htmlFor', 'httpEquiv', 'inputMode', 'keyParams', 'keyType', 'marginHeight', 'marginWidth',
-  'maxLength', 'mediaGroup', 'minLength', 'noValidate', 'onAnimationEnd', 'onAnimationIteration', 'onAnimationStart',
-  'onBlur', 'onChange', 'onClick', 'onContextMenu', 'onCopy', 'onCompositionEnd', 'onCompositionStart',
-  'onCompositionUpdate', 'onCut', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragExit', 'onDragLeave',
-  'onError', 'onFocus', 'onInput', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onLoad', 'onWheel', 'onDragOver',
-  'onDragStart', 'onDrop', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver',
-  'onMouseUp', 'onPaste', 'onScroll', 'onSelect', 'onSubmit', 'onTransitionEnd', 'radioGroup', 'readOnly', 'rowSpan',
-  'spellCheck', 'srcDoc', 'srcLang', 'srcSet', 'tabIndex', 'useMap',
-  // Non standard
-  'autoCapitalize', 'autoCorrect',
-  'autoSave',
-  'itemProp', 'itemScope', 'itemType', 'itemRef', 'itemID'
-];
-function getDOMPropertyNames(context) {
-  // this was removed in React v16.1+, see https://github.com/facebook/react/pull/10823
-  if (!versionUtil.testReactVersion(context, '16.1.0')) {
-    return ['allowTransparency'].concat(DOM_PROPERTY_NAMES);
-  }
-  return DOM_PROPERTY_NAMES;
-}
-
-// ------------------------------------------------------------------------------
-// Helpers
-// ------------------------------------------------------------------------------
-
-/**
- * Checks if a node matches the JSX tag convention.
- * @param {Object} node - JSX element being tested.
- * @returns {boolean} Whether or not the node name match the JSX tag convention.
- */
-const tagConvention = /^[a-z][^-]*$/;
-function isTagName(node) {
-  if (tagConvention.test(node.parent.name.name)) {
-    // http://www.w3.org/TR/custom-elements/#type-extension-semantics
-    return !node.parent.attributes.some(attrNode => (
-      attrNode.type === 'JSXAttribute' &&
-        attrNode.name.type === 'JSXIdentifier' &&
-        attrNode.name.name === 'is'
-    ));
-  }
-  return false;
-}
-
-/**
- * Extracts the tag name for the JSXAttribute
- * @param {JSXAttribute} node - JSXAttribute being tested.
- * @returns {String|null} tag name
- */
-function getTagName(node) {
-  if (node && node.parent && node.parent.name && node.parent.name) {
-    return node.parent.name.name;
-  }
-  return null;
-}
-
-/**
- * Test wether the tag name for the JSXAttribute is
- * something like <Foo.bar />
- * @param {JSXAttribute} node - JSXAttribute being tested.
- * @returns {Boolean} result
- */
-function tagNameHasDot(node) {
-  return !!(
-    node.parent &&
-    node.parent.name &&
-    node.parent.name.type === 'JSXMemberExpression'
-  );
-}
-
-/**
- * Get the standard name of the attribute.
- * @param {String} name - Name of the attribute.
- * @param {String} context - eslint context
- * @returns {String} The standard name of the attribute.
- */
-function getStandardName(name, context) {
-  if (DOM_ATTRIBUTE_NAMES[name]) {
-    return DOM_ATTRIBUTE_NAMES[name];
-  }
-  if (SVGDOM_ATTRIBUTE_NAMES[name]) {
-    return SVGDOM_ATTRIBUTE_NAMES[name];
-  }
-  let i = -1;
-  const names = getDOMPropertyNames(context);
-  const found = names.some((element, index) => {
-    i = index;
-    return element.toLowerCase() === name;
-  });
-  return found ? names[i] : null;
-}
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent usage of unknown DOM property',
-      category: 'Possible Errors',
-      recommended: true,
-      url: docsUrl('no-unknown-property')
-    },
-    fixable: 'code',
-
-    schema: [{
-      type: 'object',
-      properties: {
-        ignore: {
-          type: 'array',
-          items: {
-            type: 'string'
-          }
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    function getIgnoreConfig() {
-      return context.options[0] && context.options[0].ignore || DEFAULTS.ignore;
-    }
-
-    return {
-      JSXAttribute(node) {
-        const ignoreNames = getIgnoreConfig();
-        const name = context.getSourceCode().getText(node.name);
-        if (ignoreNames.indexOf(name) >= 0) {
-          return;
-        }
-
-        // Ignore tags like <Foo.bar />
-        if (tagNameHasDot(node)) {
-          return;
-        }
-
-        const tagName = getTagName(node);
-        const allowedTags = ATTRIBUTE_TAGS_MAP[name];
-        if (tagName && allowedTags && /[^A-Z]/.test(tagName.charAt(0)) && allowedTags.indexOf(tagName) === -1) {
-          context.report({
-            node,
-            message: WRONG_TAG_MESSAGE,
-            data: {
-              name,
-              tagName,
-              allowedTags: allowedTags.join(', ')
-            }
-          });
-        }
-
-        const standardName = getStandardName(name, context);
-        if (!isTagName(node) || !standardName) {
-          return;
-        }
-        context.report({
-          node,
-          message: UNKNOWN_MESSAGE,
-          data: {
-            name,
-            standardName
-          },
-          fix(fixer) {
-            return fixer.replaceText(node.name, standardName);
-          }
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-unsafe.js b/node_modules/eslint-plugin-react/lib/rules/no-unsafe.js
deleted file mode 100644
index 59b691b..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-unsafe.js
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * @fileoverview Prevent usage of unsafe lifecycle methods
- * @author Sergei Startsev
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const astUtil = require('../util/ast');
-const docsUrl = require('../util/docsUrl');
-const versionUtil = require('../util/version');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent usage of unsafe lifecycle methods',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('no-unsafe')
-    },
-    schema: [
-      {
-        type: 'object',
-        properties: {
-          checkAliases: {
-            default: false,
-            type: 'boolean'
-          }
-        },
-        additionalProperties: false
-      }
-    ]
-  },
-
-  create: Components.detect((context, components, utils) => {
-    const config = context.options[0] || {};
-    const checkAliases = config.checkAliases || false;
-
-    const isApplicable = versionUtil.testReactVersion(context, '16.3.0');
-    if (!isApplicable) {
-      return {};
-    }
-
-    const unsafe = {
-      UNSAFE_componentWillMount: {
-        newMethod: 'componentDidMount',
-        details:
-          'See https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html.'
-      },
-      UNSAFE_componentWillReceiveProps: {
-        newMethod: 'getDerivedStateFromProps',
-        details:
-          'See https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html.'
-      },
-      UNSAFE_componentWillUpdate: {
-        newMethod: 'componentDidUpdate',
-        details:
-          'See https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html.'
-      }
-    };
-    if (checkAliases) {
-      unsafe.componentWillMount = unsafe.UNSAFE_componentWillMount;
-      unsafe.componentWillReceiveProps = unsafe.UNSAFE_componentWillReceiveProps;
-      unsafe.componentWillUpdate = unsafe.UNSAFE_componentWillUpdate;
-    }
-
-    /**
-     * Returns a list of unsafe methods
-     * @returns {Array} A list of unsafe methods
-     */
-    function getUnsafeMethods() {
-      return Object.keys(unsafe);
-    }
-
-    /**
-     * Checks if a passed method is unsafe
-     * @param {string} method Life cycle method
-     * @returns {boolean} Returns true for unsafe methods, otherwise returns false
-     */
-    function isUnsafe(method) {
-      const unsafeMethods = getUnsafeMethods();
-      return unsafeMethods.indexOf(method) !== -1;
-    }
-
-    /**
-     * Reports the error for an unsafe method
-     * @param {ASTNode} node The AST node being checked
-     * @param {string} method Life cycle method
-     */
-    function checkUnsafe(node, method) {
-      if (!isUnsafe(method)) {
-        return;
-      }
-
-      const meta = unsafe[method];
-      const newMethod = meta.newMethod;
-      const details = meta.details;
-
-      context.report({
-        node,
-        message: `${method} is unsafe for use in async rendering. Update the component to use ${newMethod} instead. ${details}`
-      });
-    }
-
-    /**
-     * Returns life cycle methods if available
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Array} The array of methods.
-     */
-    function getLifeCycleMethods(node) {
-      const properties = astUtil.getComponentProperties(node);
-      return properties.map(property => astUtil.getPropertyName(property));
-    }
-
-    /**
-     * Checks life cycle methods
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function checkLifeCycleMethods(node) {
-      if (utils.isES5Component(node) || utils.isES6Component(node)) {
-        const methods = getLifeCycleMethods(node);
-        methods.forEach(method => checkUnsafe(node, method));
-      }
-    }
-
-    return {
-      ClassDeclaration: checkLifeCycleMethods,
-      ClassExpression: checkLifeCycleMethods,
-      ObjectExpression: checkLifeCycleMethods
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-unused-prop-types.js b/node_modules/eslint-plugin-react/lib/rules/no-unused-prop-types.js
deleted file mode 100644
index 2fcda62..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-unused-prop-types.js
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * @fileoverview Prevent definitions of unused prop types
- * @author Evgueni Naverniouk
- */
-
-'use strict';
-
-// As for exceptions for props.children or props.className (and alike) look at
-// https://github.com/yannickcr/eslint-plugin-react/issues/7
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent definitions of unused prop types',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('no-unused-prop-types')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        customValidators: {
-          type: 'array',
-          items: {
-            type: 'string'
-          }
-        },
-        skipShapeProps: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create: Components.detect((context, components) => {
-    const defaults = {skipShapeProps: true, customValidators: []};
-    const configuration = Object.assign({}, defaults, context.options[0] || {});
-    const UNUSED_MESSAGE = '\'{{name}}\' PropType is defined but prop is never used';
-
-    /**
-     * Checks if the component must be validated
-     * @param {Object} component The component to process
-     * @returns {Boolean} True if the component must be validated, false if not.
-     */
-    function mustBeValidated(component) {
-      return Boolean(
-        component &&
-        !component.ignoreUnusedPropTypesValidation
-      );
-    }
-
-    /**
-     * Checks if a prop is used
-     * @param {ASTNode} node The AST node being checked.
-     * @param {Object} prop Declared prop object
-     * @returns {Boolean} True if the prop is used, false if not.
-     */
-    function isPropUsed(node, prop) {
-      const usedPropTypes = node.usedPropTypes || [];
-      for (let i = 0, l = usedPropTypes.length; i < l; i++) {
-        const usedProp = usedPropTypes[i];
-        if (
-          prop.type === 'shape' ||
-          prop.name === '__ANY_KEY__' ||
-          usedProp.name === prop.name
-        ) {
-          return true;
-        }
-      }
-
-      return false;
-    }
-
-    /**
-     * Used to recursively loop through each declared prop type
-     * @param {Object} component The component to process
-     * @param {ASTNode[]|true} props List of props to validate
-     */
-    function reportUnusedPropType(component, props) {
-      // Skip props that check instances
-      if (props === true) {
-        return;
-      }
-
-      Object.keys(props || {}).forEach((key) => {
-        const prop = props[key];
-        // Skip props that check instances
-        if (prop === true) {
-          return;
-        }
-
-        if (prop.type === 'shape' && configuration.skipShapeProps) {
-          return;
-        }
-
-        if (prop.node && !isPropUsed(component, prop)) {
-          context.report({
-            node: prop.node.key || prop.node,
-            message: UNUSED_MESSAGE,
-            data: {
-              name: prop.fullName
-            }
-          });
-        }
-
-        if (prop.children) {
-          reportUnusedPropType(component, prop.children);
-        }
-      });
-    }
-
-    /**
-     * Reports unused proptypes for a given component
-     * @param {Object} component The component to process
-     */
-    function reportUnusedPropTypes(component) {
-      reportUnusedPropType(component, component.declaredPropTypes);
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      'Program:exit'() {
-        const list = components.list();
-        // Report undeclared proptypes for all classes
-        Object.keys(list).filter(component => mustBeValidated(list[component])).forEach((component) => {
-          if (!mustBeValidated(list[component])) {
-            return;
-          }
-          reportUnusedPropTypes(list[component]);
-        });
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-unused-state.js b/node_modules/eslint-plugin-react/lib/rules/no-unused-state.js
deleted file mode 100644
index 05bc08b..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-unused-state.js
+++ /dev/null
@@ -1,449 +0,0 @@
-/**
- * @fileoverview  Attempts to discover all state fields in a React component and
- * warn if any of them are never read.
- *
- * State field definitions are collected from `this.state = {}` assignments in
- * the constructor, objects passed to `this.setState()`, and `state = {}` class
- * property assignments.
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-const ast = require('../util/ast');
-
-// Descend through all wrapping TypeCastExpressions and return the expression
-// that was cast.
-function uncast(node) {
-  while (node.type === 'TypeCastExpression') {
-    node = node.expression;
-  }
-  return node;
-}
-
-// Return the name of an identifier or the string value of a literal. Useful
-// anywhere that a literal may be used as a key (e.g., member expressions,
-// method definitions, ObjectExpression property keys).
-function getName(node) {
-  node = uncast(node);
-  const type = node.type;
-
-  if (type === 'Identifier') {
-    return node.name;
-  }
-  if (type === 'Literal') {
-    return String(node.value);
-  }
-  if (type === 'TemplateLiteral' && node.expressions.length === 0) {
-    return node.quasis[0].value.raw;
-  }
-  return null;
-}
-
-function isThisExpression(node) {
-  return ast.unwrapTSAsExpression(uncast(node)).type === 'ThisExpression';
-}
-
-function getInitialClassInfo() {
-  return {
-    // Set of nodes where state fields were defined.
-    stateFields: new Set(),
-
-    // Set of names of state fields that we've seen used.
-    usedStateFields: new Set(),
-
-    // Names of local variables that may be pointing to this.state. To
-    // track this properly, we would need to keep track of all locals,
-    // shadowing, assignments, etc. To keep things simple, we only
-    // maintain one set of aliases per method and accept that it will
-    // produce some false negatives.
-    aliases: null
-  };
-}
-
-function isSetStateCall(node) {
-  const unwrappedCalleeNode = ast.unwrapTSAsExpression(node.callee);
-
-  return (
-    unwrappedCalleeNode.type === 'MemberExpression' &&
-    isThisExpression(unwrappedCalleeNode.object) &&
-    getName(unwrappedCalleeNode.property) === 'setState'
-  );
-}
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent definition of unused state fields',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('no-unused-state')
-    },
-    schema: []
-  },
-
-  create: Components.detect((context, components, utils) => {
-    // Non-null when we are inside a React component ClassDeclaration and we have
-    // not yet encountered any use of this.state which we have chosen not to
-    // analyze. If we encounter any such usage (like this.state being spread as
-    // JSX attributes), then this is again set to null.
-    let classInfo = null;
-
-    function isStateParameterReference(node) {
-      const classMethods = [
-        'shouldComponentUpdate',
-        'componentWillUpdate',
-        'UNSAFE_componentWillUpdate',
-        'getSnapshotBeforeUpdate',
-        'componentDidUpdate'
-      ];
-
-      let scope = context.getScope();
-      while (scope) {
-        const parent = scope.block && scope.block.parent;
-        if (
-          parent &&
-          parent.type === 'MethodDefinition' && (
-            parent.static && parent.key.name === 'getDerivedStateFromProps' ||
-            classMethods.indexOf(parent.key.name) !== -1
-          ) &&
-          parent.value.type === 'FunctionExpression' &&
-          parent.value.params[1] &&
-          parent.value.params[1].name === node.name
-        ) {
-          return true;
-        }
-        scope = scope.upper;
-      }
-
-      return false;
-    }
-
-    // Returns true if the given node is possibly a reference to `this.state` or the state parameter of
-    // a lifecycle method.
-    function isStateReference(node) {
-      node = uncast(node);
-
-      const isDirectStateReference = node.type === 'MemberExpression' &&
-        isThisExpression(node.object) &&
-        node.property.name === 'state';
-
-      const isAliasedStateReference = node.type === 'Identifier' &&
-        classInfo.aliases &&
-        classInfo.aliases.has(node.name);
-
-      return isDirectStateReference || isAliasedStateReference || isStateParameterReference(node);
-    }
-
-    // Takes an ObjectExpression node and adds all named Property nodes to the
-    // current set of state fields.
-    function addStateFields(node) {
-      for (const prop of node.properties) {
-        const key = prop.key;
-
-        if (
-          prop.type === 'Property' &&
-          (key.type === 'Literal' ||
-          (key.type === 'TemplateLiteral' && key.expressions.length === 0) ||
-          (prop.computed === false && key.type === 'Identifier')) &&
-          getName(prop.key) !== null
-        ) {
-          classInfo.stateFields.add(prop);
-        }
-      }
-    }
-
-    // Adds the name of the given node as a used state field if the node is an
-    // Identifier or a Literal. Other node types are ignored.
-    function addUsedStateField(node) {
-      const name = getName(node);
-      if (name) {
-        classInfo.usedStateFields.add(name);
-      }
-    }
-
-    // Records used state fields and new aliases for an ObjectPattern which
-    // destructures `this.state`.
-    function handleStateDestructuring(node) {
-      for (const prop of node.properties) {
-        if (prop.type === 'Property') {
-          addUsedStateField(prop.key);
-        } else if (
-          (prop.type === 'ExperimentalRestProperty' || prop.type === 'RestElement') &&
-          classInfo.aliases
-        ) {
-          classInfo.aliases.add(getName(prop.argument));
-        }
-      }
-    }
-
-    // Used to record used state fields and new aliases for both
-    // AssignmentExpressions and VariableDeclarators.
-    function handleAssignment(left, right) {
-      const unwrappedRight = ast.unwrapTSAsExpression(right);
-
-      switch (left.type) {
-        case 'Identifier':
-          if (isStateReference(unwrappedRight) && classInfo.aliases) {
-            classInfo.aliases.add(left.name);
-          }
-          break;
-        case 'ObjectPattern':
-          if (isStateReference(unwrappedRight)) {
-            handleStateDestructuring(left);
-          } else if (isThisExpression(unwrappedRight) && classInfo.aliases) {
-            for (const prop of left.properties) {
-              if (prop.type === 'Property' && getName(prop.key) === 'state') {
-                const name = getName(prop.value);
-                if (name) {
-                  classInfo.aliases.add(name);
-                } else if (prop.value.type === 'ObjectPattern') {
-                  handleStateDestructuring(prop.value);
-                }
-              }
-            }
-          }
-          break;
-        default:
-        // pass
-      }
-    }
-
-    function reportUnusedFields() {
-      // Report all unused state fields.
-      for (const node of classInfo.stateFields) {
-        const name = getName(node.key);
-        if (!classInfo.usedStateFields.has(name)) {
-          context.report({
-            node,
-            message: `Unused state field: '${name}'`
-          });
-        }
-      }
-    }
-
-    return {
-      ClassDeclaration(node) {
-        if (utils.isES6Component(node)) {
-          classInfo = getInitialClassInfo();
-        }
-      },
-
-      ObjectExpression(node) {
-        if (utils.isES5Component(node)) {
-          classInfo = getInitialClassInfo();
-        }
-      },
-
-      'ObjectExpression:exit'(node) {
-        if (!classInfo) {
-          return;
-        }
-
-        if (utils.isES5Component(node)) {
-          reportUnusedFields();
-          classInfo = null;
-        }
-      },
-
-      'ClassDeclaration:exit'() {
-        if (!classInfo) {
-          return;
-        }
-        reportUnusedFields();
-        classInfo = null;
-      },
-
-      CallExpression(node) {
-        if (!classInfo) {
-          return;
-        }
-
-        const unwrappedNode = ast.unwrapTSAsExpression(node);
-        const unwrappedArgumentNode = ast.unwrapTSAsExpression(unwrappedNode.arguments[0]);
-
-        // If we're looking at a `this.setState({})` invocation, record all the
-        // properties as state fields.
-        if (
-          isSetStateCall(unwrappedNode) &&
-          unwrappedNode.arguments.length > 0 &&
-          unwrappedArgumentNode.type === 'ObjectExpression'
-        ) {
-          addStateFields(unwrappedArgumentNode);
-        } else if (
-          isSetStateCall(unwrappedNode) &&
-          unwrappedNode.arguments.length > 0 &&
-          unwrappedArgumentNode.type === 'ArrowFunctionExpression'
-        ) {
-          const unwrappedBodyNode = ast.unwrapTSAsExpression(unwrappedArgumentNode.body);
-
-          if (unwrappedBodyNode.type === 'ObjectExpression') {
-            addStateFields(unwrappedBodyNode);
-          }
-          if (unwrappedArgumentNode.params.length > 0 && classInfo.aliases) {
-            const firstParam = unwrappedArgumentNode.params[0];
-            if (firstParam.type === 'ObjectPattern') {
-              handleStateDestructuring(firstParam);
-            } else {
-              classInfo.aliases.add(getName(firstParam));
-            }
-          }
-        }
-      },
-
-      ClassProperty(node) {
-        if (!classInfo) {
-          return;
-        }
-        // If we see state being assigned as a class property using an object
-        // expression, record all the fields of that object as state fields.
-        const unwrappedValueNode = ast.unwrapTSAsExpression(node.value);
-
-        if (
-          getName(node.key) === 'state' &&
-          !node.static &&
-          unwrappedValueNode &&
-          unwrappedValueNode.type === 'ObjectExpression'
-        ) {
-          addStateFields(unwrappedValueNode);
-        }
-
-        if (
-          !node.static &&
-          unwrappedValueNode &&
-          unwrappedValueNode.type === 'ArrowFunctionExpression'
-        ) {
-          // Create a new set for this.state aliases local to this method.
-          classInfo.aliases = new Set();
-        }
-      },
-
-      'ClassProperty:exit'(node) {
-        if (
-          classInfo &&
-          !node.static &&
-          node.value &&
-          node.value.type === 'ArrowFunctionExpression'
-        ) {
-          // Forget our set of local aliases.
-          classInfo.aliases = null;
-        }
-      },
-
-      MethodDefinition() {
-        if (!classInfo) {
-          return;
-        }
-        // Create a new set for this.state aliases local to this method.
-        classInfo.aliases = new Set();
-      },
-
-      'MethodDefinition:exit'() {
-        if (!classInfo) {
-          return;
-        }
-        // Forget our set of local aliases.
-        classInfo.aliases = null;
-      },
-
-      FunctionExpression(node) {
-        if (!classInfo) {
-          return;
-        }
-
-        const parent = node.parent;
-        if (!utils.isES5Component(parent.parent)) {
-          return;
-        }
-
-        if (parent.key.name === 'getInitialState') {
-          const body = node.body.body;
-          const lastBodyNode = body[body.length - 1];
-
-          if (
-            lastBodyNode.type === 'ReturnStatement' &&
-            lastBodyNode.argument.type === 'ObjectExpression'
-          ) {
-            addStateFields(lastBodyNode.argument);
-          }
-        } else {
-          // Create a new set for this.state aliases local to this method.
-          classInfo.aliases = new Set();
-        }
-      },
-
-      AssignmentExpression(node) {
-        if (!classInfo) {
-          return;
-        }
-
-        const unwrappedLeft = ast.unwrapTSAsExpression(node.left);
-        const unwrappedRight = ast.unwrapTSAsExpression(node.right);
-
-        // Check for assignments like `this.state = {}`
-        if (
-          unwrappedLeft.type === 'MemberExpression' &&
-          isThisExpression(unwrappedLeft.object) &&
-          getName(unwrappedLeft.property) === 'state' &&
-          unwrappedRight.type === 'ObjectExpression'
-        ) {
-          // Find the nearest function expression containing this assignment.
-          let fn = node;
-          while (fn.type !== 'FunctionExpression' && fn.parent) {
-            fn = fn.parent;
-          }
-          // If the nearest containing function is the constructor, then we want
-          // to record all the assigned properties as state fields.
-          if (
-            fn.parent &&
-            fn.parent.type === 'MethodDefinition' &&
-            fn.parent.kind === 'constructor'
-          ) {
-            addStateFields(unwrappedRight);
-          }
-        } else {
-          // Check for assignments like `alias = this.state` and record the alias.
-          handleAssignment(unwrappedLeft, unwrappedRight);
-        }
-      },
-
-      VariableDeclarator(node) {
-        if (!classInfo || !node.init) {
-          return;
-        }
-        handleAssignment(node.id, node.init);
-      },
-
-      MemberExpression(node) {
-        if (!classInfo) {
-          return;
-        }
-        if (isStateReference(ast.unwrapTSAsExpression(node.object))) {
-          // If we see this.state[foo] access, give up.
-          if (node.computed && node.property.type !== 'Literal') {
-            classInfo = null;
-            return;
-          }
-          // Otherwise, record that we saw this property being accessed.
-          addUsedStateField(node.property);
-        // If we see a `this.state` access in a CallExpression, give up.
-        } else if (isStateReference(node) && node.parent.type === 'CallExpression') {
-          classInfo = null;
-        }
-      },
-
-      JSXSpreadAttribute(node) {
-        if (classInfo && isStateReference(node.argument)) {
-          classInfo = null;
-        }
-      },
-
-      'ExperimentalSpreadProperty, SpreadElement'(node) {
-        if (classInfo && isStateReference(node.argument)) {
-          classInfo = null;
-        }
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/no-will-update-set-state.js b/node_modules/eslint-plugin-react/lib/rules/no-will-update-set-state.js
deleted file mode 100644
index 0267227..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/no-will-update-set-state.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * @fileoverview Prevent usage of setState in componentWillUpdate
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const makeNoMethodSetStateRule = require('../util/makeNoMethodSetStateRule');
-const versionUtil = require('../util/version');
-
-module.exports = makeNoMethodSetStateRule(
-  'componentWillUpdate',
-  context => versionUtil.testReactVersion(context, '16.3.0')
-);
diff --git a/node_modules/eslint-plugin-react/lib/rules/prefer-es6-class.js b/node_modules/eslint-plugin-react/lib/rules/prefer-es6-class.js
deleted file mode 100644
index b35a85b..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/prefer-es6-class.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * @fileoverview Enforce ES5 or ES6 class for React Components
- * @author Dan Hamilton
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce ES5 or ES6 class for React Components',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('prefer-es6-class')
-    },
-
-    schema: [{
-      enum: ['always', 'never']
-    }]
-  },
-
-  create: Components.detect((context, components, utils) => {
-    const configuration = context.options[0] || 'always';
-
-    return {
-      ObjectExpression(node) {
-        if (utils.isES5Component(node) && configuration === 'always') {
-          context.report({
-            node,
-            message: 'Component should use es6 class instead of createClass'
-          });
-        }
-      },
-      ClassDeclaration(node) {
-        if (utils.isES6Component(node) && configuration === 'never') {
-          context.report({
-            node,
-            message: 'Component should use createClass instead of es6 class'
-          });
-        }
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/prefer-read-only-props.js b/node_modules/eslint-plugin-react/lib/rules/prefer-read-only-props.js
deleted file mode 100644
index 8349435..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/prefer-read-only-props.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * @fileoverview Require component props to be typed as read-only.
- * @author Luke Zapart
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-function isFlowPropertyType(node) {
-  return node.type === 'ObjectTypeProperty';
-}
-
-function isCovariant(node) {
-  return node.variance && node.variance.kind === 'plus';
-}
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Require read-only props.',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('prefer-read-only-props')
-    },
-    fixable: 'code',
-    schema: []
-  },
-
-  create: Components.detect((context, components) => ({
-    'Program:exit'() {
-      const list = components.list();
-
-      Object.keys(list).forEach((key) => {
-        const component = list[key];
-
-        if (!component.declaredPropTypes) {
-          return;
-        }
-
-        Object.keys(component.declaredPropTypes).forEach((propName) => {
-          const prop = component.declaredPropTypes[propName];
-
-          if (!isFlowPropertyType(prop.node)) {
-            return;
-          }
-
-          if (!isCovariant(prop.node)) {
-            context.report({
-              node: prop.node,
-              message: 'Prop \'{{propName}}\' should be read-only.',
-              data: {
-                propName
-              },
-              fix: (fixer) => {
-                if (!prop.node.variance) {
-                  // Insert covariance
-                  return fixer.insertTextBefore(prop.node, '+');
-                }
-
-                // Replace contravariance with covariance
-                return fixer.replaceText(prop.node.variance, '+');
-              }
-            });
-          }
-        });
-      });
-    }
-  }))
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/prefer-stateless-function.js b/node_modules/eslint-plugin-react/lib/rules/prefer-stateless-function.js
deleted file mode 100644
index e128b2d..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/prefer-stateless-function.js
+++ /dev/null
@@ -1,381 +0,0 @@
-/**
- * @fileoverview Enforce stateless components to be written as a pure function
- * @author Yannick Croissant
- * @author Alberto Rodríguez
- * @copyright 2015 Alberto Rodríguez. All rights reserved.
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const versionUtil = require('../util/version');
-const astUtil = require('../util/ast');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce stateless components to be written as a pure function',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('prefer-stateless-function')
-    },
-    schema: [{
-      type: 'object',
-      properties: {
-        ignorePureComponents: {
-          default: false,
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create: Components.detect((context, components, utils) => {
-    const configuration = context.options[0] || {};
-    const ignorePureComponents = configuration.ignorePureComponents || false;
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    /**
-     * Checks whether a given array of statements is a single call of `super`.
-     * @see ESLint no-useless-constructor rule
-     * @param {ASTNode[]} body - An array of statements to check.
-     * @returns {boolean} `true` if the body is a single call of `super`.
-     */
-    function isSingleSuperCall(body) {
-      return (
-        body.length === 1 &&
-        body[0].type === 'ExpressionStatement' &&
-        body[0].expression.type === 'CallExpression' &&
-        body[0].expression.callee.type === 'Super'
-      );
-    }
-
-    /**
-     * Checks whether a given node is a pattern which doesn't have any side effects.
-     * Default parameters and Destructuring parameters can have side effects.
-     * @see ESLint no-useless-constructor rule
-     * @param {ASTNode} node - A pattern node.
-     * @returns {boolean} `true` if the node doesn't have any side effects.
-     */
-    function isSimple(node) {
-      return node.type === 'Identifier' || node.type === 'RestElement';
-    }
-
-    /**
-     * Checks whether a given array of expressions is `...arguments` or not.
-     * `super(...arguments)` passes all arguments through.
-     * @see ESLint no-useless-constructor rule
-     * @param {ASTNode[]} superArgs - An array of expressions to check.
-     * @returns {boolean} `true` if the superArgs is `...arguments`.
-     */
-    function isSpreadArguments(superArgs) {
-      return (
-        superArgs.length === 1 &&
-        superArgs[0].type === 'SpreadElement' &&
-        superArgs[0].argument.type === 'Identifier' &&
-        superArgs[0].argument.name === 'arguments'
-      );
-    }
-
-    /**
-     * Checks whether given 2 nodes are identifiers which have the same name or not.
-     * @see ESLint no-useless-constructor rule
-     * @param {ASTNode} ctorParam - A node to check.
-     * @param {ASTNode} superArg - A node to check.
-     * @returns {boolean} `true` if the nodes are identifiers which have the same
-     *      name.
-     */
-    function isValidIdentifierPair(ctorParam, superArg) {
-      return (
-        ctorParam.type === 'Identifier' &&
-        superArg.type === 'Identifier' &&
-        ctorParam.name === superArg.name
-      );
-    }
-
-    /**
-     * Checks whether given 2 nodes are a rest/spread pair which has the same values.
-     * @see ESLint no-useless-constructor rule
-     * @param {ASTNode} ctorParam - A node to check.
-     * @param {ASTNode} superArg - A node to check.
-     * @returns {boolean} `true` if the nodes are a rest/spread pair which has the
-     *      same values.
-     */
-    function isValidRestSpreadPair(ctorParam, superArg) {
-      return (
-        ctorParam.type === 'RestElement' &&
-        superArg.type === 'SpreadElement' &&
-        isValidIdentifierPair(ctorParam.argument, superArg.argument)
-      );
-    }
-
-    /**
-     * Checks whether given 2 nodes have the same value or not.
-     * @see ESLint no-useless-constructor rule
-     * @param {ASTNode} ctorParam - A node to check.
-     * @param {ASTNode} superArg - A node to check.
-     * @returns {boolean} `true` if the nodes have the same value or not.
-     */
-    function isValidPair(ctorParam, superArg) {
-      return (
-        isValidIdentifierPair(ctorParam, superArg) ||
-        isValidRestSpreadPair(ctorParam, superArg)
-      );
-    }
-
-    /**
-     * Checks whether the parameters of a constructor and the arguments of `super()`
-     * have the same values or not.
-     * @see ESLint no-useless-constructor rule
-     * @param {ASTNode[]} ctorParams - The parameters of a constructor to check.
-     * @param {ASTNode} superArgs - The arguments of `super()` to check.
-     * @returns {boolean} `true` if those have the same values.
-     */
-    function isPassingThrough(ctorParams, superArgs) {
-      if (ctorParams.length !== superArgs.length) {
-        return false;
-      }
-
-      for (let i = 0; i < ctorParams.length; ++i) {
-        if (!isValidPair(ctorParams[i], superArgs[i])) {
-          return false;
-        }
-      }
-
-      return true;
-    }
-
-    /**
-     * Checks whether the constructor body is a redundant super call.
-     * @see ESLint no-useless-constructor rule
-     * @param {Array} body - constructor body content.
-     * @param {Array} ctorParams - The params to check against super call.
-     * @returns {boolean} true if the construtor body is redundant
-     */
-    function isRedundantSuperCall(body, ctorParams) {
-      return (
-        isSingleSuperCall(body) &&
-        ctorParams.every(isSimple) &&
-        (
-          isSpreadArguments(body[0].expression.arguments) ||
-          isPassingThrough(ctorParams, body[0].expression.arguments)
-        )
-      );
-    }
-
-    /**
-     * Check if a given AST node have any other properties the ones available in stateless components
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if the node has at least one other property, false if not.
-     */
-    function hasOtherProperties(node) {
-      const properties = astUtil.getComponentProperties(node);
-      return properties.some((property) => {
-        const name = astUtil.getPropertyName(property);
-        const isDisplayName = name === 'displayName';
-        const isPropTypes = name === 'propTypes' || name === 'props' && property.typeAnnotation;
-        const contextTypes = name === 'contextTypes';
-        const defaultProps = name === 'defaultProps';
-        const isUselessConstructor = property.kind === 'constructor' &&
-          !!property.value.body &&
-          isRedundantSuperCall(property.value.body.body, property.value.params);
-        const isRender = name === 'render';
-        return !isDisplayName && !isPropTypes && !contextTypes && !defaultProps && !isUselessConstructor && !isRender;
-      });
-    }
-
-    /**
-     * Mark component as pure as declared
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function markSCUAsDeclared(node) {
-      components.set(node, {
-        hasSCU: true
-      });
-    }
-
-    /**
-     * Mark childContextTypes as declared
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function markChildContextTypesAsDeclared(node) {
-      components.set(node, {
-        hasChildContextTypes: true
-      });
-    }
-
-    /**
-     * Mark a setState as used
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function markThisAsUsed(node) {
-      components.set(node, {
-        useThis: true
-      });
-    }
-
-    /**
-     * Mark a props or context as used
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function markPropsOrContextAsUsed(node) {
-      components.set(node, {
-        usePropsOrContext: true
-      });
-    }
-
-    /**
-     * Mark a ref as used
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function markRefAsUsed(node) {
-      components.set(node, {
-        useRef: true
-      });
-    }
-
-    /**
-     * Mark return as invalid
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function markReturnAsInvalid(node) {
-      components.set(node, {
-        invalidReturn: true
-      });
-    }
-
-    /**
-     * Mark a ClassDeclaration as having used decorators
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function markDecoratorsAsUsed(node) {
-      components.set(node, {
-        useDecorators: true
-      });
-    }
-
-    function visitClass(node) {
-      if (ignorePureComponents && utils.isPureComponent(node)) {
-        markSCUAsDeclared(node);
-      }
-
-      if (node.decorators && node.decorators.length) {
-        markDecoratorsAsUsed(node);
-      }
-    }
-
-    return {
-      ClassDeclaration: visitClass,
-      ClassExpression: visitClass,
-
-      // Mark `this` destructuring as a usage of `this`
-      VariableDeclarator(node) {
-        // Ignore destructuring on other than `this`
-        if (!node.id || node.id.type !== 'ObjectPattern' || !node.init || node.init.type !== 'ThisExpression') {
-          return;
-        }
-        // Ignore `props` and `context`
-        const useThis = node.id.properties.some((property) => {
-          const name = astUtil.getPropertyName(property);
-          return name !== 'props' && name !== 'context';
-        });
-        if (!useThis) {
-          markPropsOrContextAsUsed(node);
-          return;
-        }
-        markThisAsUsed(node);
-      },
-
-      // Mark `this` usage
-      MemberExpression(node) {
-        if (node.object.type !== 'ThisExpression') {
-          if (node.property && node.property.name === 'childContextTypes') {
-            const component = utils.getRelatedComponent(node);
-            if (!component) {
-              return;
-            }
-            markChildContextTypesAsDeclared(component.node);
-          }
-          return;
-        // Ignore calls to `this.props` and `this.context`
-        }
-        if (
-          (node.property.name || node.property.value) === 'props' ||
-          (node.property.name || node.property.value) === 'context'
-        ) {
-          markPropsOrContextAsUsed(node);
-          return;
-        }
-        markThisAsUsed(node);
-      },
-
-      // Mark `ref` usage
-      JSXAttribute(node) {
-        const name = context.getSourceCode().getText(node.name);
-        if (name !== 'ref') {
-          return;
-        }
-        markRefAsUsed(node);
-      },
-
-      // Mark `render` that do not return some JSX
-      ReturnStatement(node) {
-        let blockNode;
-        let scope = context.getScope();
-        while (scope) {
-          blockNode = scope.block && scope.block.parent;
-          if (blockNode && (blockNode.type === 'MethodDefinition' || blockNode.type === 'Property')) {
-            break;
-          }
-          scope = scope.upper;
-        }
-        const isRender = blockNode && blockNode.key && blockNode.key.name === 'render';
-        const allowNull = versionUtil.testReactVersion(context, '15.0.0'); // Stateless components can return null since React 15
-        const isReturningJSX = utils.isReturningJSX(node, !allowNull);
-        const isReturningNull = node.argument && (node.argument.value === null || node.argument.value === false);
-        if (
-          !isRender ||
-          (allowNull && (isReturningJSX || isReturningNull)) ||
-          (!allowNull && isReturningJSX)
-        ) {
-          return;
-        }
-        markReturnAsInvalid(node);
-      },
-
-      'Program:exit'() {
-        const list = components.list();
-        Object.keys(list).forEach((component) => {
-          if (
-            hasOtherProperties(list[component].node) ||
-            list[component].useThis ||
-            list[component].useRef ||
-            list[component].invalidReturn ||
-            list[component].hasChildContextTypes ||
-            list[component].useDecorators ||
-            (!utils.isES5Component(list[component].node) && !utils.isES6Component(list[component].node))
-          ) {
-            return;
-          }
-
-          if (list[component].hasSCU) {
-            return;
-          }
-          context.report({
-            node: list[component].node,
-            message: 'Component should be written as a pure function'
-          });
-        });
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/prop-types.js b/node_modules/eslint-plugin-react/lib/rules/prop-types.js
deleted file mode 100644
index a974833..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/prop-types.js
+++ /dev/null
@@ -1,195 +0,0 @@
-/**
- * @fileoverview Prevent missing props validation in a React component definition
- * @author Yannick Croissant
- */
-
-'use strict';
-
-// As for exceptions for props.children or props.className (and alike) look at
-// https://github.com/yannickcr/eslint-plugin-react/issues/7
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent missing props validation in a React component definition',
-      category: 'Best Practices',
-      recommended: true,
-      url: docsUrl('prop-types')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        ignore: {
-          type: 'array',
-          items: {
-            type: 'string'
-          }
-        },
-        customValidators: {
-          type: 'array',
-          items: {
-            type: 'string'
-          }
-        },
-        skipUndeclared: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create: Components.detect((context, components) => {
-    const configuration = context.options[0] || {};
-    const ignored = configuration.ignore || [];
-    const skipUndeclared = configuration.skipUndeclared || false;
-
-    const MISSING_MESSAGE = '\'{{name}}\' is missing in props validation';
-
-    /**
-     * Checks if the prop is ignored
-     * @param {String} name Name of the prop to check.
-     * @returns {Boolean} True if the prop is ignored, false if not.
-     */
-    function isIgnored(name) {
-      return ignored.indexOf(name) !== -1;
-    }
-
-    /**
-     * Checks if the component must be validated
-     * @param {Object} component The component to process
-     * @returns {Boolean} True if the component must be validated, false if not.
-     */
-    function mustBeValidated(component) {
-      const isSkippedByConfig = skipUndeclared && typeof component.declaredPropTypes === 'undefined';
-      return Boolean(
-        component &&
-        component.usedPropTypes &&
-        !component.ignorePropsValidation &&
-        !isSkippedByConfig
-      );
-    }
-
-    /**
-     * Internal: Checks if the prop is declared
-     * @param {Object} declaredPropTypes Description of propTypes declared in the current component
-     * @param {String[]} keyList Dot separated name of the prop to check.
-     * @returns {Boolean} True if the prop is declared, false if not.
-     */
-    function internalIsDeclaredInComponent(declaredPropTypes, keyList) {
-      for (let i = 0, j = keyList.length; i < j; i++) {
-        const key = keyList[i];
-        const propType = (
-          declaredPropTypes && (
-            // Check if this key is declared
-            (declaredPropTypes[key] || // If not, check if this type accepts any key
-            declaredPropTypes.__ANY_KEY__) // eslint-disable-line no-underscore-dangle
-          )
-        );
-
-        if (!propType) {
-          // If it's a computed property, we can't make any further analysis, but is valid
-          return key === '__COMPUTED_PROP__';
-        }
-        if (typeof propType === 'object' && !propType.type) {
-          return true;
-        }
-        // Consider every children as declared
-        if (propType.children === true || propType.containsUnresolvedSpread || propType.containsIndexers) {
-          return true;
-        }
-        if (propType.acceptedProperties) {
-          return key in propType.acceptedProperties;
-        }
-        if (propType.type === 'union') {
-          // If we fall in this case, we know there is at least one complex type in the union
-          if (i + 1 >= j) {
-            // this is the last key, accept everything
-            return true;
-          }
-          // non trivial, check all of them
-          const unionTypes = propType.children;
-          const unionPropType = {};
-          for (let k = 0, z = unionTypes.length; k < z; k++) {
-            unionPropType[key] = unionTypes[k];
-            const isValid = internalIsDeclaredInComponent(
-              unionPropType,
-              keyList.slice(i)
-            );
-            if (isValid) {
-              return true;
-            }
-          }
-
-          // every possible union were invalid
-          return false;
-        }
-        declaredPropTypes = propType.children;
-      }
-      return true;
-    }
-
-    /**
-     * Checks if the prop is declared
-     * @param {ASTNode} node The AST node being checked.
-     * @param {String[]} names List of names of the prop to check.
-     * @returns {Boolean} True if the prop is declared, false if not.
-     */
-    function isDeclaredInComponent(node, names) {
-      while (node) {
-        const component = components.get(node);
-
-        const isDeclared = component && component.confidence === 2 &&
-          internalIsDeclaredInComponent(component.declaredPropTypes || {}, names);
-        if (isDeclared) {
-          return true;
-        }
-        node = node.parent;
-      }
-      return false;
-    }
-
-    /**
-     * Reports undeclared proptypes for a given component
-     * @param {Object} component The component to process
-     */
-    function reportUndeclaredPropTypes(component) {
-      const undeclareds = component.usedPropTypes.filter(propType => (
-        propType.node &&
-        !isIgnored(propType.allNames[0]) &&
-        !isDeclaredInComponent(component.node, propType.allNames)
-      ));
-      undeclareds.forEach((propType) => {
-        context.report({
-          node: propType.node,
-          message: MISSING_MESSAGE,
-          data: {
-            name: propType.allNames.join('.').replace(/\.__COMPUTED_PROP__/g, '[]')
-          }
-        });
-      });
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-      'Program:exit'() {
-        const list = components.list();
-        // Report undeclared proptypes for all classes
-        Object.keys(list).filter(component => mustBeValidated(list[component])).forEach((component) => {
-          reportUndeclaredPropTypes(list[component]);
-        });
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/react-in-jsx-scope.js b/node_modules/eslint-plugin-react/lib/rules/react-in-jsx-scope.js
deleted file mode 100644
index 9df35da..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/react-in-jsx-scope.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * @fileoverview Prevent missing React when using JSX
- * @author Glen Mailer
- */
-
-'use strict';
-
-const variableUtil = require('../util/variable');
-const pragmaUtil = require('../util/pragma');
-const docsUrl = require('../util/docsUrl');
-
-// -----------------------------------------------------------------------------
-// Rule Definition
-// -----------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent missing React when using JSX',
-      category: 'Possible Errors',
-      recommended: true,
-      url: docsUrl('react-in-jsx-scope')
-    },
-    schema: []
-  },
-
-  create(context) {
-    const pragma = pragmaUtil.getFromContext(context);
-    const NOT_DEFINED_MESSAGE = '\'{{name}}\' must be in scope when using JSX';
-
-    function checkIfReactIsInScope(node) {
-      const variables = variableUtil.variablesInScope(context);
-      if (variableUtil.findVariable(variables, pragma)) {
-        return;
-      }
-      context.report({
-        node,
-        message: NOT_DEFINED_MESSAGE,
-        data: {
-          name: pragma
-        }
-      });
-    }
-
-    return {
-      JSXOpeningElement: checkIfReactIsInScope,
-      JSXOpeningFragment: checkIfReactIsInScope
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/require-default-props.js b/node_modules/eslint-plugin-react/lib/rules/require-default-props.js
deleted file mode 100644
index e744f05..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/require-default-props.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/**
- * @fileOverview Enforce a defaultProps definition for every prop that is not a required prop.
- * @author Vitor Balocco
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-const astUtil = require('../util/ast');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce a defaultProps definition for every prop that is not a required prop.',
-      category: 'Best Practices',
-      url: docsUrl('require-default-props')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        forbidDefaultForRequired: {
-          type: 'boolean'
-        },
-        ignoreFunctionalComponents: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create: Components.detect((context, components) => {
-    const configuration = context.options[0] || {};
-    const forbidDefaultForRequired = configuration.forbidDefaultForRequired || false;
-    const ignoreFunctionalComponents = configuration.ignoreFunctionalComponents || false;
-
-    /**
-     * Reports all propTypes passed in that don't have a defaultProps counterpart.
-     * @param  {Object[]} propTypes    List of propTypes to check.
-     * @param  {Object}   defaultProps Object of defaultProps to check. Keys are the props names.
-     * @return {void}
-     */
-    function reportPropTypesWithoutDefault(propTypes, defaultProps) {
-      // If this defaultProps is "unresolved", then we should ignore this component and not report
-      // any errors for it, to avoid false-positives with e.g. external defaultProps declarations or spread operators.
-      if (defaultProps === 'unresolved') {
-        return;
-      }
-
-      Object.keys(propTypes).forEach((propName) => {
-        const prop = propTypes[propName];
-        if (prop.isRequired) {
-          if (forbidDefaultForRequired && defaultProps[propName]) {
-            context.report({
-              node: prop.node,
-              message: 'propType "{{name}}" is required and should not have a defaultProps declaration.',
-              data: {name: propName}
-            });
-          }
-          return;
-        }
-
-        if (defaultProps[propName]) {
-          return;
-        }
-
-        context.report({
-          node: prop.node,
-          message: 'propType "{{name}}" is not required, but has no corresponding defaultProps declaration.',
-          data: {name: propName}
-        });
-      });
-    }
-
-    // --------------------------------------------------------------------------
-    // Public API
-    // --------------------------------------------------------------------------
-
-    return {
-      'Program:exit'() {
-        const list = components.list();
-
-        Object.keys(list).filter((component) => {
-          if (ignoreFunctionalComponents &&
-            (astUtil.isFunction(list[component].node) || astUtil.isFunctionLikeExpression(list[component].node))) {
-            return false;
-          }
-          return list[component].declaredPropTypes;
-        }).forEach((component) => {
-          reportPropTypesWithoutDefault(
-            list[component].declaredPropTypes,
-            list[component].defaultProps || {}
-          );
-        });
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/require-optimization.js b/node_modules/eslint-plugin-react/lib/rules/require-optimization.js
deleted file mode 100644
index ee56e82..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/require-optimization.js
+++ /dev/null
@@ -1,230 +0,0 @@
-/**
- * @fileoverview Enforce React components to have a shouldComponentUpdate method
- * @author Evgueni Naverniouk
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce React components to have a shouldComponentUpdate method',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('require-optimization')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        allowDecorators: {
-          type: 'array',
-          items: {
-            type: 'string'
-          }
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create: Components.detect((context, components, utils) => {
-    const MISSING_MESSAGE = 'Component is not optimized. Please add a shouldComponentUpdate method.';
-    const configuration = context.options[0] || {};
-    const allowDecorators = configuration.allowDecorators || [];
-
-    /**
-     * Checks to see if our component is decorated by PureRenderMixin via reactMixin
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if node is decorated with a PureRenderMixin, false if not.
-     */
-    function hasPureRenderDecorator(node) {
-      if (node.decorators && node.decorators.length) {
-        for (let i = 0, l = node.decorators.length; i < l; i++) {
-          if (
-            node.decorators[i].expression &&
-            node.decorators[i].expression.callee &&
-            node.decorators[i].expression.callee.object &&
-            node.decorators[i].expression.callee.object.name === 'reactMixin' &&
-            node.decorators[i].expression.callee.property &&
-            node.decorators[i].expression.callee.property.name === 'decorate' &&
-            node.decorators[i].expression.arguments &&
-            node.decorators[i].expression.arguments.length &&
-            node.decorators[i].expression.arguments[0].name === 'PureRenderMixin'
-          ) {
-            return true;
-          }
-        }
-      }
-
-      return false;
-    }
-
-    /**
-     * Checks to see if our component is custom decorated
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if node is decorated name with a custom decorated, false if not.
-     */
-    function hasCustomDecorator(node) {
-      const allowLength = allowDecorators.length;
-
-      if (allowLength && node.decorators && node.decorators.length) {
-        for (let i = 0; i < allowLength; i++) {
-          for (let j = 0, l = node.decorators.length; j < l; j++) {
-            if (
-              node.decorators[j].expression &&
-              node.decorators[j].expression.name === allowDecorators[i]
-            ) {
-              return true;
-            }
-          }
-        }
-      }
-
-      return false;
-    }
-
-    /**
-     * Checks if we are declaring a shouldComponentUpdate method
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if we are declaring a shouldComponentUpdate method, false if not.
-     */
-    function isSCUDeclared(node) {
-      return Boolean(
-        node &&
-        node.name === 'shouldComponentUpdate'
-      );
-    }
-
-    /**
-     * Checks if we are declaring a PureRenderMixin mixin
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if we are declaring a PureRenderMixin method, false if not.
-     */
-    function isPureRenderDeclared(node) {
-      let hasPR = false;
-      if (node.value && node.value.elements) {
-        for (let i = 0, l = node.value.elements.length; i < l; i++) {
-          if (node.value.elements[i] && node.value.elements[i].name === 'PureRenderMixin') {
-            hasPR = true;
-            break;
-          }
-        }
-      }
-
-      return Boolean(
-        node &&
-        node.key.name === 'mixins' &&
-        hasPR
-      );
-    }
-
-    /**
-     * Mark shouldComponentUpdate as declared
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function markSCUAsDeclared(node) {
-      components.set(node, {
-        hasSCU: true
-      });
-    }
-
-    /**
-     * Reports missing optimization for a given component
-     * @param {Object} component The component to process
-     */
-    function reportMissingOptimization(component) {
-      context.report({
-        node: component.node,
-        message: MISSING_MESSAGE,
-        data: {
-          component: component.name
-        }
-      });
-    }
-
-    /**
-     * Checks if we are declaring function in class
-     * @returns {Boolean} True if we are declaring function in class, false if not.
-     */
-    function isFunctionInClass() {
-      let blockNode;
-      let scope = context.getScope();
-      while (scope) {
-        blockNode = scope.block;
-        if (blockNode && blockNode.type === 'ClassDeclaration') {
-          return true;
-        }
-        scope = scope.upper;
-      }
-
-      return false;
-    }
-
-    return {
-      ArrowFunctionExpression(node) {
-        // Skip if the function is declared in the class
-        if (isFunctionInClass()) {
-          return;
-        }
-        // Stateless Functional Components cannot be optimized (yet)
-        markSCUAsDeclared(node);
-      },
-
-      ClassDeclaration(node) {
-        if (!(hasPureRenderDecorator(node) || hasCustomDecorator(node) || utils.isPureComponent(node))) {
-          return;
-        }
-        markSCUAsDeclared(node);
-      },
-
-      FunctionDeclaration(node) {
-        // Skip if the function is declared in the class
-        if (isFunctionInClass()) {
-          return;
-        }
-        // Stateless Functional Components cannot be optimized (yet)
-        markSCUAsDeclared(node);
-      },
-
-      FunctionExpression(node) {
-        // Skip if the function is declared in the class
-        if (isFunctionInClass()) {
-          return;
-        }
-        // Stateless Functional Components cannot be optimized (yet)
-        markSCUAsDeclared(node);
-      },
-
-      MethodDefinition(node) {
-        if (!isSCUDeclared(node.key)) {
-          return;
-        }
-        markSCUAsDeclared(node);
-      },
-
-      ObjectExpression(node) {
-        // Search for the shouldComponentUpdate declaration
-        const found = node.properties.some(property => (
-          property.key &&
-          (isSCUDeclared(property.key) || isPureRenderDeclared(property))
-        ));
-        if (found) {
-          markSCUAsDeclared(node);
-        }
-      },
-
-      'Program:exit'() {
-        const list = components.list();
-
-        // Report missing shouldComponentUpdate for all components
-        Object.keys(list).filter(component => !list[component].hasSCU).forEach((component) => {
-          reportMissingOptimization(list[component]);
-        });
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/require-render-return.js b/node_modules/eslint-plugin-react/lib/rules/require-render-return.js
deleted file mode 100644
index 72a2249..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/require-render-return.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * @fileoverview Enforce ES5 or ES6 class for returning value in render function.
- * @author Mark Orel
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const astUtil = require('../util/ast');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce ES5 or ES6 class for returning value in render function',
-      category: 'Possible Errors',
-      recommended: true,
-      url: docsUrl('require-render-return')
-    },
-    schema: [{}]
-  },
-
-  create: Components.detect((context, components, utils) => {
-    /**
-     * Mark a return statement as present
-     * @param {ASTNode} node The AST node being checked.
-     */
-    function markReturnStatementPresent(node) {
-      components.set(node, {
-        hasReturnStatement: true
-      });
-    }
-
-    /**
-     * Find render method in a given AST node
-     * @param {ASTNode} node The component to find render method.
-     * @returns {ASTNode} Method node if found, undefined if not.
-     */
-    function findRenderMethod(node) {
-      const properties = astUtil.getComponentProperties(node);
-      return properties
-        .filter(property => astUtil.getPropertyName(property) === 'render' && property.value)
-        .find(property => astUtil.isFunctionLikeExpression(property.value));
-    }
-
-    return {
-      ReturnStatement(node) {
-        const ancestors = context.getAncestors(node).reverse();
-        let depth = 0;
-        ancestors.forEach((ancestor) => {
-          if (/Function(Expression|Declaration)$/.test(ancestor.type)) {
-            depth++;
-          }
-          if (
-            /(MethodDefinition|(Class)?Property)$/.test(ancestor.type) &&
-            astUtil.getPropertyName(ancestor) === 'render' &&
-            depth <= 1
-          ) {
-            markReturnStatementPresent(node);
-          }
-        });
-      },
-
-      ArrowFunctionExpression(node) {
-        if (node.expression === false || astUtil.getPropertyName(node.parent) !== 'render') {
-          return;
-        }
-        markReturnStatementPresent(node);
-      },
-
-      'Program:exit'() {
-        const list = components.list();
-        Object.keys(list).forEach((component) => {
-          if (
-            !findRenderMethod(list[component].node) ||
-            list[component].hasReturnStatement ||
-            (!utils.isES5Component(list[component].node) && !utils.isES6Component(list[component].node))
-          ) {
-            return;
-          }
-          context.report({
-            node: findRenderMethod(list[component].node),
-            message: 'Your render method should have return statement'
-          });
-        });
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/self-closing-comp.js b/node_modules/eslint-plugin-react/lib/rules/self-closing-comp.js
deleted file mode 100644
index 3e51509..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/self-closing-comp.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * @fileoverview Prevent extra closing tags for components without children
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const docsUrl = require('../util/docsUrl');
-const jsxUtil = require('../util/jsx');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-const optionDefaults = {component: true, html: true};
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent extra closing tags for components without children',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('self-closing-comp')
-    },
-    fixable: 'code',
-
-    schema: [{
-      type: 'object',
-      properties: {
-        component: {
-          default: optionDefaults.component,
-          type: 'boolean'
-        },
-        html: {
-          default: optionDefaults.html,
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    function isComponent(node) {
-      return (
-        node.name &&
-        (node.name.type === 'JSXIdentifier' || node.name.type === 'JSXMemberExpression') &&
-        !jsxUtil.isDOMComponent(node)
-      );
-    }
-
-    function childrenIsEmpty(node) {
-      return node.parent.children.length === 0;
-    }
-
-    function childrenIsMultilineSpaces(node) {
-      const childrens = node.parent.children;
-
-      return (
-        childrens.length === 1 &&
-        (childrens[0].type === 'Literal' || childrens[0].type === 'JSXText') &&
-        childrens[0].value.indexOf('\n') !== -1 &&
-        childrens[0].value.replace(/(?!\xA0)\s/g, '') === ''
-      );
-    }
-
-    function isShouldBeSelfClosed(node) {
-      const configuration = Object.assign({}, optionDefaults, context.options[0]);
-      return (
-        configuration.component && isComponent(node) ||
-        configuration.html && jsxUtil.isDOMComponent(node)
-      ) && !node.selfClosing && (childrenIsEmpty(node) || childrenIsMultilineSpaces(node));
-    }
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    return {
-
-      JSXOpeningElement(node) {
-        if (!isShouldBeSelfClosed(node)) {
-          return;
-        }
-        context.report({
-          node,
-          message: 'Empty components are self-closing',
-          fix(fixer) {
-            // Represents the last character of the JSXOpeningElement, the '>' character
-            const openingElementEnding = node.range[1] - 1;
-            // Represents the last character of the JSXClosingElement, the '>' character
-            const closingElementEnding = node.parent.closingElement.range[1];
-
-            // Replace />.*<\/.*>/ with '/>'
-            const range = [openingElementEnding, closingElementEnding];
-            return fixer.replaceTextRange(range, ' />');
-          }
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/sort-comp.js b/node_modules/eslint-plugin-react/lib/rules/sort-comp.js
deleted file mode 100644
index c946701..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/sort-comp.js
+++ /dev/null
@@ -1,443 +0,0 @@
-/**
- * @fileoverview Enforce component methods order
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const has = require('has');
-const entries = require('object.entries');
-const arrayIncludes = require('array-includes');
-
-const Components = require('../util/Components');
-const astUtil = require('../util/ast');
-const docsUrl = require('../util/docsUrl');
-
-const defaultConfig = {
-  order: [
-    'static-methods',
-    'lifecycle',
-    'everything-else',
-    'render'
-  ],
-  groups: {
-    lifecycle: [
-      'displayName',
-      'propTypes',
-      'contextTypes',
-      'childContextTypes',
-      'mixins',
-      'statics',
-      'defaultProps',
-      'constructor',
-      'getDefaultProps',
-      'state',
-      'getInitialState',
-      'getChildContext',
-      'getDerivedStateFromProps',
-      'componentWillMount',
-      'UNSAFE_componentWillMount',
-      'componentDidMount',
-      'componentWillReceiveProps',
-      'UNSAFE_componentWillReceiveProps',
-      'shouldComponentUpdate',
-      'componentWillUpdate',
-      'UNSAFE_componentWillUpdate',
-      'getSnapshotBeforeUpdate',
-      'componentDidUpdate',
-      'componentDidCatch',
-      'componentWillUnmount'
-    ]
-  }
-};
-
-/**
- * Get the methods order from the default config and the user config
- * @param {Object} userConfig The user configuration.
- * @returns {Array} Methods order
- */
-function getMethodsOrder(userConfig) {
-  userConfig = userConfig || {};
-
-  const groups = Object.assign({}, defaultConfig.groups, userConfig.groups);
-  const order = userConfig.order || defaultConfig.order;
-
-  let config = [];
-  let entry;
-  for (let i = 0, j = order.length; i < j; i++) {
-    entry = order[i];
-    if (has(groups, entry)) {
-      config = config.concat(groups[entry]);
-    } else {
-      config.push(entry);
-    }
-  }
-
-  return config;
-}
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce component methods order',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('sort-comp')
-    },
-
-    schema: [{
-      type: 'object',
-      properties: {
-        order: {
-          type: 'array',
-          items: {
-            type: 'string'
-          }
-        },
-        groups: {
-          type: 'object',
-          patternProperties: {
-            '^.*$': {
-              type: 'array',
-              items: {
-                type: 'string'
-              }
-            }
-          }
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create: Components.detect((context, components) => {
-    const errors = {};
-
-    const MISPOSITION_MESSAGE = '{{propA}} should be placed {{position}} {{propB}}';
-
-    const methodsOrder = getMethodsOrder(context.options[0]);
-
-    // --------------------------------------------------------------------------
-    // Public
-    // --------------------------------------------------------------------------
-
-    const regExpRegExp = /\/(.*)\/([gimsuy]*)/;
-
-    /**
-     * Get indexes of the matching patterns in methods order configuration
-     * @param {Object} method - Method metadata.
-     * @returns {Array} The matching patterns indexes. Return [Infinity] if there is no match.
-     */
-    function getRefPropIndexes(method) {
-      const methodGroupIndexes = [];
-
-      methodsOrder.forEach((currentGroup, groupIndex) => {
-        if (currentGroup === 'getters') {
-          if (method.getter) {
-            methodGroupIndexes.push(groupIndex);
-          }
-        } else if (currentGroup === 'setters') {
-          if (method.setter) {
-            methodGroupIndexes.push(groupIndex);
-          }
-        } else if (currentGroup === 'type-annotations') {
-          if (method.typeAnnotation) {
-            methodGroupIndexes.push(groupIndex);
-          }
-        } else if (currentGroup === 'static-variables') {
-          if (method.staticVariable) {
-            methodGroupIndexes.push(groupIndex);
-          }
-        } else if (currentGroup === 'static-methods') {
-          if (method.staticMethod) {
-            methodGroupIndexes.push(groupIndex);
-          }
-        } else if (currentGroup === 'instance-variables') {
-          if (method.instanceVariable) {
-            methodGroupIndexes.push(groupIndex);
-          }
-        } else if (currentGroup === 'instance-methods') {
-          if (method.instanceMethod) {
-            methodGroupIndexes.push(groupIndex);
-          }
-        } else if (arrayIncludes([
-          'displayName',
-          'propTypes',
-          'contextTypes',
-          'childContextTypes',
-          'mixins',
-          'statics',
-          'defaultProps',
-          'constructor',
-          'getDefaultProps',
-          'state',
-          'getInitialState',
-          'getChildContext',
-          'getDerivedStateFromProps',
-          'componentWillMount',
-          'UNSAFE_componentWillMount',
-          'componentDidMount',
-          'componentWillReceiveProps',
-          'UNSAFE_componentWillReceiveProps',
-          'shouldComponentUpdate',
-          'componentWillUpdate',
-          'UNSAFE_componentWillUpdate',
-          'getSnapshotBeforeUpdate',
-          'componentDidUpdate',
-          'componentDidCatch',
-          'componentWillUnmount',
-          'render'
-        ], currentGroup)) {
-          if (currentGroup === method.name) {
-            methodGroupIndexes.push(groupIndex);
-          }
-        } else {
-          // Is the group a regex?
-          const isRegExp = currentGroup.match(regExpRegExp);
-          if (isRegExp) {
-            const isMatching = new RegExp(isRegExp[1], isRegExp[2]).test(method.name);
-            if (isMatching) {
-              methodGroupIndexes.push(groupIndex);
-            }
-          } else if (currentGroup === method.name) {
-            methodGroupIndexes.push(groupIndex);
-          }
-        }
-      });
-
-      // No matching pattern, return 'everything-else' index
-      if (methodGroupIndexes.length === 0) {
-        const everythingElseIndex = methodsOrder.indexOf('everything-else');
-
-        if (everythingElseIndex !== -1) {
-          methodGroupIndexes.push(everythingElseIndex);
-        } else {
-          // No matching pattern and no 'everything-else' group
-          methodGroupIndexes.push(Infinity);
-        }
-      }
-
-      return methodGroupIndexes;
-    }
-
-    /**
-     * Get properties name
-     * @param {Object} node - Property.
-     * @returns {String} Property name.
-     */
-    function getPropertyName(node) {
-      if (node.kind === 'get') {
-        return 'getter functions';
-      }
-
-      if (node.kind === 'set') {
-        return 'setter functions';
-      }
-
-      return astUtil.getPropertyName(node);
-    }
-
-    /**
-     * Store a new error in the error list
-     * @param {Object} propA - Mispositioned property.
-     * @param {Object} propB - Reference property.
-     */
-    function storeError(propA, propB) {
-      // Initialize the error object if needed
-      if (!errors[propA.index]) {
-        errors[propA.index] = {
-          node: propA.node,
-          score: 0,
-          closest: {
-            distance: Infinity,
-            ref: {
-              node: null,
-              index: 0
-            }
-          }
-        };
-      }
-      // Increment the prop score
-      errors[propA.index].score++;
-      // Stop here if we already have pushed another node at this position
-      if (getPropertyName(errors[propA.index].node) !== getPropertyName(propA.node)) {
-        return;
-      }
-      // Stop here if we already have a closer reference
-      if (Math.abs(propA.index - propB.index) > errors[propA.index].closest.distance) {
-        return;
-      }
-      // Update the closest reference
-      errors[propA.index].closest.distance = Math.abs(propA.index - propB.index);
-      errors[propA.index].closest.ref.node = propB.node;
-      errors[propA.index].closest.ref.index = propB.index;
-    }
-
-    /**
-     * Dedupe errors, only keep the ones with the highest score and delete the others
-     */
-    function dedupeErrors() {
-      for (const i in errors) {
-        if (has(errors, i)) {
-          const index = errors[i].closest.ref.index;
-          if (errors[index]) {
-            if (errors[i].score > errors[index].score) {
-              delete errors[index];
-            } else {
-              delete errors[i];
-            }
-          }
-        }
-      }
-    }
-
-    /**
-     * Report errors
-     */
-    function reportErrors() {
-      dedupeErrors();
-
-      entries(errors).forEach((entry) => {
-        const nodeA = entry[1].node;
-        const nodeB = entry[1].closest.ref.node;
-        const indexA = entry[0];
-        const indexB = entry[1].closest.ref.index;
-
-        context.report({
-          node: nodeA,
-          message: MISPOSITION_MESSAGE,
-          data: {
-            propA: getPropertyName(nodeA),
-            propB: getPropertyName(nodeB),
-            position: indexA < indexB ? 'before' : 'after'
-          }
-        });
-      });
-    }
-
-    /**
-     * Compare two properties and find out if they are in the right order
-     * @param {Array} propertiesInfos Array containing all the properties metadata.
-     * @param {Object} propA First property name and metadata
-     * @param {Object} propB Second property name.
-     * @returns {Object} Object containing a correct true/false flag and the correct indexes for the two properties.
-     */
-    function comparePropsOrder(propertiesInfos, propA, propB) {
-      let i;
-      let j;
-      let k;
-      let l;
-      let refIndexA;
-      let refIndexB;
-
-      // Get references indexes (the correct position) for given properties
-      const refIndexesA = getRefPropIndexes(propA);
-      const refIndexesB = getRefPropIndexes(propB);
-
-      // Get current indexes for given properties
-      const classIndexA = propertiesInfos.indexOf(propA);
-      const classIndexB = propertiesInfos.indexOf(propB);
-
-      // Loop around the references indexes for the 1st property
-      for (i = 0, j = refIndexesA.length; i < j; i++) {
-        refIndexA = refIndexesA[i];
-
-        // Loop around the properties for the 2nd property (for comparison)
-        for (k = 0, l = refIndexesB.length; k < l; k++) {
-          refIndexB = refIndexesB[k];
-
-          if (
-            // Comparing the same properties
-            refIndexA === refIndexB ||
-            // 1st property is placed before the 2nd one in reference and in current component
-            refIndexA < refIndexB && classIndexA < classIndexB ||
-            // 1st property is placed after the 2nd one in reference and in current component
-            refIndexA > refIndexB && classIndexA > classIndexB
-          ) {
-            return {
-              correct: true,
-              indexA: classIndexA,
-              indexB: classIndexB
-            };
-          }
-        }
-      }
-
-      // We did not find any correct match between reference and current component
-      return {
-        correct: false,
-        indexA: refIndexA,
-        indexB: refIndexB
-      };
-    }
-
-    /**
-     * Check properties order from a properties list and store the eventual errors
-     * @param {Array} properties Array containing all the properties.
-     */
-    function checkPropsOrder(properties) {
-      const propertiesInfos = properties.map(node => ({
-        name: getPropertyName(node),
-        getter: node.kind === 'get',
-        setter: node.kind === 'set',
-        staticVariable: node.static &&
-          node.type === 'ClassProperty' &&
-          (!node.value || !astUtil.isFunctionLikeExpression(node.value)),
-        staticMethod: node.static &&
-          (node.type === 'ClassProperty' || node.type === 'MethodDefinition') &&
-          node.value &&
-          (astUtil.isFunctionLikeExpression(node.value)),
-        instanceVariable: !node.static &&
-          node.type === 'ClassProperty' &&
-          (!node.value || !astUtil.isFunctionLikeExpression(node.value)),
-        instanceMethod: !node.static &&
-          node.type === 'ClassProperty' &&
-          node.value &&
-          (astUtil.isFunctionLikeExpression(node.value)),
-        typeAnnotation: !!node.typeAnnotation && node.value === null
-      }));
-
-      // Loop around the properties
-      propertiesInfos.forEach((propA, i) => {
-        // Loop around the properties a second time (for comparison)
-        propertiesInfos.forEach((propB, k) => {
-          if (i === k) {
-            return;
-          }
-
-          // Compare the properties order
-          const order = comparePropsOrder(propertiesInfos, propA, propB);
-
-          if (!order.correct) {
-            // Store an error if the order is incorrect
-            storeError({
-              node: properties[i],
-              index: order.indexA
-            }, {
-              node: properties[k],
-              index: order.indexB
-            });
-          }
-        });
-      });
-    }
-
-    return {
-      'Program:exit'() {
-        const list = components.list();
-        Object.keys(list).forEach((component) => {
-          const properties = astUtil.getComponentProperties(list[component].node);
-          checkPropsOrder(properties);
-        });
-
-        reportErrors();
-      }
-    };
-  }),
-
-  defaultConfig
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/sort-prop-types.js b/node_modules/eslint-plugin-react/lib/rules/sort-prop-types.js
deleted file mode 100644
index 9dbf13a..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/sort-prop-types.js
+++ /dev/null
@@ -1,248 +0,0 @@
-/**
- * @fileoverview Enforce propTypes declarations alphabetical sorting
- */
-
-'use strict';
-
-const variableUtil = require('../util/variable');
-const propsUtil = require('../util/props');
-const docsUrl = require('../util/docsUrl');
-const propWrapperUtil = require('../util/propWrapper');
-// const propTypesSortUtil = require('../util/propTypesSort');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce propTypes declarations alphabetical sorting',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('sort-prop-types')
-    },
-
-    // fixable: 'code',
-
-    schema: [{
-      type: 'object',
-      properties: {
-        requiredFirst: {
-          type: 'boolean'
-        },
-        callbacksLast: {
-          type: 'boolean'
-        },
-        ignoreCase: {
-          type: 'boolean'
-        },
-        // Whether alphabetical sorting should be enforced
-        noSortAlphabetically: {
-          type: 'boolean'
-        },
-        sortShapeProp: {
-          type: 'boolean'
-        }
-      },
-      additionalProperties: false
-    }]
-  },
-
-  create(context) {
-    const configuration = context.options[0] || {};
-    const requiredFirst = configuration.requiredFirst || false;
-    const callbacksLast = configuration.callbacksLast || false;
-    const ignoreCase = configuration.ignoreCase || false;
-    const noSortAlphabetically = configuration.noSortAlphabetically || false;
-    const sortShapeProp = configuration.sortShapeProp || false;
-
-    function getKey(node) {
-      if (node.key && node.key.value) {
-        return node.key.value;
-      }
-      return context.getSourceCode().getText(node.key || node.argument);
-    }
-
-    function getValueName(node) {
-      return node.type === 'Property' && node.value.property && node.value.property.name;
-    }
-
-    function isCallbackPropName(propName) {
-      return /^on[A-Z]/.test(propName);
-    }
-
-    function isRequiredProp(node) {
-      return getValueName(node) === 'isRequired';
-    }
-
-    function isShapeProp(node) {
-      return Boolean(
-        node && node.callee && node.callee.property && node.callee.property.name === 'shape'
-      );
-    }
-
-    function toLowerCase(item) {
-      return String(item).toLowerCase();
-    }
-
-    /**
-     * Checks if propTypes declarations are sorted
-     * @param {Array} declarations The array of AST nodes being checked.
-     * @returns {void}
-     */
-    function checkSorted(declarations) {
-      // Declarations will be `undefined` if the `shape` is not a literal. For
-      // example, if it is a propType imported from another file.
-      if (!declarations) {
-        return;
-      }
-
-      // function fix(fixer) {
-      //   return propTypesSortUtil.fixPropTypesSort(
-      //     fixer,
-      //     context,
-      //     declarations,
-      //     ignoreCase,
-      //     requiredFirst,
-      //     callbacksLast,
-      //     sortShapeProp
-      //   );
-      // }
-
-      declarations.reduce((prev, curr, idx, decls) => {
-        if (curr.type === 'ExperimentalSpreadProperty' || curr.type === 'SpreadElement') {
-          return decls[idx + 1];
-        }
-
-        let prevPropName = getKey(prev);
-        let currentPropName = getKey(curr);
-        const previousIsRequired = isRequiredProp(prev);
-        const currentIsRequired = isRequiredProp(curr);
-        const previousIsCallback = isCallbackPropName(prevPropName);
-        const currentIsCallback = isCallbackPropName(currentPropName);
-
-        if (ignoreCase) {
-          prevPropName = toLowerCase(prevPropName);
-          currentPropName = toLowerCase(currentPropName);
-        }
-
-        if (requiredFirst) {
-          if (previousIsRequired && !currentIsRequired) {
-            // Transition between required and non-required. Don't compare for alphabetical.
-            return curr;
-          }
-          if (!previousIsRequired && currentIsRequired) {
-            // Encountered a non-required prop after a required prop
-            context.report({
-              node: curr,
-              message: 'Required prop types must be listed before all other prop types'
-            //  fix
-            });
-            return curr;
-          }
-        }
-
-        if (callbacksLast) {
-          if (!previousIsCallback && currentIsCallback) {
-            // Entering the callback prop section
-            return curr;
-          }
-          if (previousIsCallback && !currentIsCallback) {
-            // Encountered a non-callback prop after a callback prop
-            context.report({
-              node: prev,
-              message: 'Callback prop types must be listed after all other prop types'
-              // fix
-            });
-            return prev;
-          }
-        }
-
-        if (!noSortAlphabetically && currentPropName < prevPropName) {
-          context.report({
-            node: curr,
-            message: 'Prop types declarations should be sorted alphabetically'
-            // fix
-          });
-          return prev;
-        }
-
-        return curr;
-      }, declarations[0]);
-    }
-
-    function checkNode(node) {
-      switch (node && node.type) {
-        case 'ObjectExpression':
-          checkSorted(node.properties);
-          break;
-        case 'Identifier': {
-          const propTypesObject = variableUtil.findVariableByName(context, node.name);
-          if (propTypesObject && propTypesObject.properties) {
-            checkSorted(propTypesObject.properties);
-          }
-          break;
-        }
-        case 'CallExpression': {
-          const innerNode = node.arguments && node.arguments[0];
-          if (propWrapperUtil.isPropWrapperFunction(context, node.callee.name) && innerNode) {
-            checkNode(innerNode);
-          }
-          break;
-        }
-        default:
-          break;
-      }
-    }
-
-    return {
-      CallExpression(node) {
-        if (!sortShapeProp || !isShapeProp(node) || !(node.arguments && node.arguments[0])) {
-          return;
-        }
-
-        const firstArg = node.arguments[0];
-        if (firstArg.properties) {
-          checkSorted(firstArg.properties);
-        } else if (firstArg.type === 'Identifier') {
-          const variable = variableUtil.findVariableByName(context, firstArg.name);
-          if (variable && variable.properties) {
-            checkSorted(variable.properties);
-          }
-        }
-      },
-
-      ClassProperty(node) {
-        if (!propsUtil.isPropTypesDeclaration(node)) {
-          return;
-        }
-        checkNode(node.value);
-      },
-
-      MemberExpression(node) {
-        if (!propsUtil.isPropTypesDeclaration(node)) {
-          return;
-        }
-
-        checkNode(node.parent.right);
-      },
-
-      ObjectExpression(node) {
-        node.properties.forEach((property) => {
-          if (!property.key) {
-            return;
-          }
-
-          if (!propsUtil.isPropTypesDeclaration(property)) {
-            return;
-          }
-          if (property.value.type === 'ObjectExpression') {
-            checkSorted(property.value.properties);
-          }
-        });
-      }
-
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/state-in-constructor.js b/node_modules/eslint-plugin-react/lib/rules/state-in-constructor.js
deleted file mode 100644
index 91a5d5d..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/state-in-constructor.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * @fileoverview Enforce the state initialization style to be either in a constructor or with a class property
- * @author Kanitkorn Sujautra
- */
-
-'use strict';
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'State initialization in an ES6 class component should be in a constructor',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('state-in-constructor')
-    },
-    schema: [{
-      enum: ['always', 'never']
-    }]
-  },
-
-  create: Components.detect((context, components, utils) => {
-    const option = context.options[0] || 'always';
-    return {
-      ClassProperty(node) {
-        if (
-          option === 'always' &&
-          !node.static &&
-          node.key.name === 'state' &&
-          utils.getParentES6Component()
-        ) {
-          context.report({
-            node,
-            message: 'State initialization should be in a constructor'
-          });
-        }
-      },
-      AssignmentExpression(node) {
-        if (
-          option === 'never' &&
-          utils.isStateMemberExpression(node.left) &&
-          utils.inConstructor() &&
-          utils.getParentES6Component()
-        ) {
-          context.report({
-            node,
-            message: 'State initialization should be in a class property'
-          });
-        }
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/static-property-placement.js b/node_modules/eslint-plugin-react/lib/rules/static-property-placement.js
deleted file mode 100644
index 8e2a89a..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/static-property-placement.js
+++ /dev/null
@@ -1,165 +0,0 @@
-/**
- * @fileoverview Defines where React component static properties should be positioned.
- * @author Daniel Mason
- */
-
-'use strict';
-
-const fromEntries = require('object.fromentries');
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-const astUtil = require('../util/ast');
-const propsUtil = require('../util/props');
-
-// ------------------------------------------------------------------------------
-// Positioning Options
-// ------------------------------------------------------------------------------
-const STATIC_PUBLIC_FIELD = 'static public field';
-const STATIC_GETTER = 'static getter';
-const PROPERTY_ASSIGNMENT = 'property assignment';
-const POSITION_SETTINGS = [STATIC_PUBLIC_FIELD, STATIC_GETTER, PROPERTY_ASSIGNMENT];
-
-// ------------------------------------------------------------------------------
-// Rule messages
-// ------------------------------------------------------------------------------
-const ERROR_MESSAGES = {
-  [STATIC_PUBLIC_FIELD]: '\'{{name}}\' should be declared as a static class property.',
-  [STATIC_GETTER]: '\'{{name}}\' should be declared as a static getter class function.',
-  [PROPERTY_ASSIGNMENT]: '\'{{name}}\' should be declared outside the class body.'
-};
-
-// ------------------------------------------------------------------------------
-// Properties to check
-// ------------------------------------------------------------------------------
-const propertiesToCheck = {
-  propTypes: propsUtil.isPropTypesDeclaration,
-  defaultProps: propsUtil.isDefaultPropsDeclaration,
-  childContextTypes: propsUtil.isChildContextTypesDeclaration,
-  contextTypes: propsUtil.isContextTypesDeclaration,
-  contextType: propsUtil.isContextTypeDeclaration,
-  displayName: node => propsUtil.isDisplayNameDeclaration(astUtil.getPropertyNameNode(node))
-};
-
-const classProperties = Object.keys(propertiesToCheck);
-const schemaProperties = fromEntries(classProperties.map(property => [property, {enum: POSITION_SETTINGS}]));
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Defines where React component static properties should be positioned.',
-      category: 'Stylistic Issues',
-      recommended: false,
-      url: docsUrl('static-property-placement')
-    },
-    fixable: null, // or 'code' or 'whitespace'
-    schema: [
-      {enum: POSITION_SETTINGS},
-      {
-        type: 'object',
-        properties: schemaProperties,
-        additionalProperties: false
-      }
-    ]
-  },
-
-  create: Components.detect((context, components, utils) => {
-    // variables should be defined here
-    const options = context.options;
-    const defaultCheckType = options[0] || STATIC_PUBLIC_FIELD;
-    const hasAdditionalConfig = options.length > 1;
-    const additionalConfig = hasAdditionalConfig ? options[1] : {};
-
-    // Set config
-    const config = fromEntries(classProperties.map(property => [
-      property,
-      additionalConfig[property] || defaultCheckType
-    ]));
-
-    // ----------------------------------------------------------------------
-    // Helpers
-    // ----------------------------------------------------------------------
-
-    /**
-      * Checks if we are declaring context in class
-      * @returns {Boolean} True if we are declaring context in class, false if not.
-     */
-    function isContextInClass() {
-      let blockNode;
-      let scope = context.getScope();
-      while (scope) {
-        blockNode = scope.block;
-        if (blockNode && blockNode.type === 'ClassDeclaration') {
-          return true;
-        }
-        scope = scope.upper;
-      }
-
-      return false;
-    }
-
-    /**
-     * Check if we should report this property node
-     * @param {ASTNode} node
-     * @param {string} expectedRule
-     */
-    function reportNodeIncorrectlyPositioned(node, expectedRule) {
-      // Detect if this node is an expected property declaration adn return the property name
-      const name = classProperties.find((propertyName) => {
-        if (propertiesToCheck[propertyName](node)) {
-          return !!propertyName;
-        }
-
-        return false;
-      });
-
-      // If name is set but the configured rule does not match expected then report error
-      if (name && config[name] !== expectedRule) {
-        // Report the error
-        context.report({
-          node,
-          message: ERROR_MESSAGES[config[name]],
-          data: {name}
-        });
-      }
-    }
-
-    // ----------------------------------------------------------------------
-    // Public
-    // ----------------------------------------------------------------------
-    return {
-      ClassProperty: node => reportNodeIncorrectlyPositioned(node, STATIC_PUBLIC_FIELD),
-
-      MemberExpression: (node) => {
-        // If definition type is undefined then it must not be a defining expression or if the definition is inside a
-        // class body then skip this node.
-        const right = node.parent.right;
-        if (!right || right.type === 'undefined' || isContextInClass()) {
-          return;
-        }
-
-        // Get the related component
-        const relatedComponent = utils.getRelatedComponent(node);
-
-        // If the related component is not an ES6 component then skip this node
-        if (!relatedComponent || !utils.isES6Component(relatedComponent.node)) {
-          return;
-        }
-
-        // Report if needed
-        reportNodeIncorrectlyPositioned(node, PROPERTY_ASSIGNMENT);
-      },
-
-      MethodDefinition: (node) => {
-        // If the function is inside a class and is static getter then check if correctly positioned
-        if (isContextInClass() && node.static && node.kind === 'get') {
-          // Report error if needed
-          reportNodeIncorrectlyPositioned(node, STATIC_GETTER);
-        }
-      }
-    };
-  })
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/style-prop-object.js b/node_modules/eslint-plugin-react/lib/rules/style-prop-object.js
deleted file mode 100644
index 5061aa0..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/style-prop-object.js
+++ /dev/null
@@ -1,133 +0,0 @@
-/**
- * @fileoverview Enforce style prop value is an object
- * @author David Petersen
- */
-
-'use strict';
-
-const variableUtil = require('../util/variable');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Enforce style prop value is an object',
-      category: '',
-      recommended: false,
-      url: docsUrl('style-prop-object')
-    },
-    schema: [
-      {
-        type: 'object',
-        properties: {
-          allow: {
-            type: 'array',
-            items: {
-              type: 'string'
-            },
-            additionalItems: false,
-            uniqueItems: true
-          }
-        }
-      }
-    ]
-  },
-
-  create(context) {
-    const allowed = new Set(context.options.length > 0 && context.options[0].allow || []);
-
-    /**
-     * @param {ASTNode} expression An Identifier node
-     * @returns {boolean}
-     */
-    function isNonNullaryLiteral(expression) {
-      return expression.type === 'Literal' && expression.value !== null;
-    }
-
-    /**
-     * @param {object} node A Identifier node
-     */
-    function checkIdentifiers(node) {
-      const variable = variableUtil.variablesInScope(context).find(item => item.name === node.name);
-
-      if (!variable || !variable.defs[0] || !variable.defs[0].node.init) {
-        return;
-      }
-
-      if (isNonNullaryLiteral(variable.defs[0].node.init)) {
-        context.report({
-          node,
-          message: 'Style prop value must be an object'
-        });
-      }
-    }
-
-    return {
-      CallExpression(node) {
-        if (
-          node.callee &&
-          node.callee.type === 'MemberExpression' &&
-          node.callee.property.name === 'createElement' &&
-          node.arguments.length > 1
-        ) {
-          if (node.arguments[0].name) {
-            // store name of component
-            const componentName = node.arguments[0].name;
-
-            // allowed list contains the name
-            if (allowed.has(componentName)) {
-              // abort operation
-              return;
-            }
-          }
-          if (node.arguments[1].type === 'ObjectExpression') {
-            const style = node.arguments[1].properties.find(property => property.key && property.key.name === 'style' && !property.computed);
-            if (style) {
-              if (style.value.type === 'Identifier') {
-                checkIdentifiers(style.value);
-              } else if (isNonNullaryLiteral(style.value)) {
-                context.report({
-                  node: style.value,
-                  message: 'Style prop value must be an object'
-                });
-              }
-            }
-          }
-        }
-      },
-
-      JSXAttribute(node) {
-        if (!node.value || node.name.name !== 'style') {
-          return;
-        }
-        // store parent element
-        const parentElement = node.parent;
-
-        // parent element is a JSXOpeningElement
-        if (parentElement && parentElement.type === 'JSXOpeningElement') {
-          // get the name of the JSX element
-          const name = parentElement.name && parentElement.name.name;
-
-          // allowed list contains the name
-          if (allowed.has(name)) {
-            // abort operation
-            return;
-          }
-        }
-
-        if (node.value.type !== 'JSXExpressionContainer' || isNonNullaryLiteral(node.value.expression)) {
-          context.report({
-            node,
-            message: 'Style prop value must be an object'
-          });
-        } else if (node.value.expression.type === 'Identifier') {
-          checkIdentifiers(node.value.expression);
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-react/lib/rules/void-dom-elements-no-children.js b/node_modules/eslint-plugin-react/lib/rules/void-dom-elements-no-children.js
deleted file mode 100644
index d25cc49..0000000
--- a/node_modules/eslint-plugin-react/lib/rules/void-dom-elements-no-children.js
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * @fileoverview Prevent void elements (e.g. <img />, <br />) from receiving
- *   children
- * @author Joe Lencioni
- */
-
-'use strict';
-
-const has = require('has');
-
-const Components = require('../util/Components');
-const docsUrl = require('../util/docsUrl');
-
-// ------------------------------------------------------------------------------
-// Helpers
-// ------------------------------------------------------------------------------
-
-// Using an object here to avoid array scan. We should switch to Set once
-// support is good enough.
-const VOID_DOM_ELEMENTS = {
-  area: true,
-  base: true,
-  br: true,
-  col: true,
-  embed: true,
-  hr: true,
-  img: true,
-  input: true,
-  keygen: true,
-  link: true,
-  menuitem: true,
-  meta: true,
-  param: true,
-  source: true,
-  track: true,
-  wbr: true
-};
-
-function isVoidDOMElement(elementName) {
-  return has(VOID_DOM_ELEMENTS, elementName);
-}
-
-function errorMessage(elementName) {
-  return `Void DOM element <${elementName} /> cannot receive children.`;
-}
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Prevent passing of children to void DOM elements (e.g. `<br />`).',
-      category: 'Best Practices',
-      recommended: false,
-      url: docsUrl('void-dom-elements-no-children')
-    },
-    schema: []
-  },
-
-  create: Components.detect((context, components, utils) => ({
-    JSXElement(node) {
-      const elementName = node.openingElement.name.name;
-
-      if (!isVoidDOMElement(elementName)) {
-        // e.g. <div />
-        return;
-      }
-
-      if (node.children.length > 0) {
-        // e.g. <br>Foo</br>
-        context.report({
-          node,
-          message: errorMessage(elementName)
-        });
-      }
-
-      const attributes = node.openingElement.attributes;
-
-      const hasChildrenAttributeOrDanger = attributes.some((attribute) => {
-        if (!attribute.name) {
-          return false;
-        }
-
-        return attribute.name.name === 'children' || attribute.name.name === 'dangerouslySetInnerHTML';
-      });
-
-      if (hasChildrenAttributeOrDanger) {
-        // e.g. <br children="Foo" />
-        context.report({
-          node,
-          message: errorMessage(elementName)
-        });
-      }
-    },
-
-    CallExpression(node) {
-      if (node.callee.type !== 'MemberExpression' && node.callee.type !== 'Identifier') {
-        return;
-      }
-
-      if (!utils.isCreateElement(node)) {
-        return;
-      }
-
-      const args = node.arguments;
-
-      if (args.length < 1) {
-        // React.createElement() should not crash linter
-        return;
-      }
-
-      const elementName = args[0].value;
-
-      if (!isVoidDOMElement(elementName)) {
-        // e.g. React.createElement('div');
-        return;
-      }
-
-      if (args.length < 2 || args[1].type !== 'ObjectExpression') {
-        return;
-      }
-
-      const firstChild = args[2];
-      if (firstChild) {
-        // e.g. React.createElement('br', undefined, 'Foo')
-        context.report({
-          node,
-          message: errorMessage(elementName)
-        });
-      }
-
-      const props = args[1].properties;
-
-      const hasChildrenPropOrDanger = props.some((prop) => {
-        if (!prop.key) {
-          return false;
-        }
-
-        return prop.key.name === 'children' || prop.key.name === 'dangerouslySetInnerHTML';
-      });
-
-      if (hasChildrenPropOrDanger) {
-        // e.g. React.createElement('br', { children: 'Foo' })
-        context.report({
-          node,
-          message: errorMessage(elementName)
-        });
-      }
-    }
-  }))
-};
diff --git a/node_modules/eslint-plugin-react/lib/types.d.ts b/node_modules/eslint-plugin-react/lib/types.d.ts
deleted file mode 100644
index 7e22f27..0000000
--- a/node_modules/eslint-plugin-react/lib/types.d.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import eslint from 'eslint';
-import estree from 'estree';
-
-declare global {
-  interface ASTNode extends estree.BaseNode {
-    [_: string]: any; // TODO: fixme
-  }
-  type Scope = eslint.Scope.Scope;
-  type Token = eslint.AST.Token;
-  type Fixer = eslint.Rule.RuleFixer;
-  type JSXAttribute = ASTNode;
-  type JSXElement = ASTNode;
-  type JSXFragment = ASTNode;
-  type JSXSpreadAttribute = ASTNode;
-
-  interface Context extends eslint.SourceCode {
-    getFirstTokens(node: estree.Node | ASTNode, options?: eslint.SourceCode.CursorWithCountOptions): eslint.AST.Token[];
-  }
-
-  type TypeDeclarationBuilder = (annotation: ASTNode, parentName: string, seen: Set<typeof annotation>) => object;
-
-  type TypeDeclarationBuilders = {
-    [k in string]: TypeDeclarationBuilder;
-  };
-
-  type UnionTypeDefinition = {
-    type: 'union' | 'shape';
-    children: unknown[];
-  };
-}
diff --git a/node_modules/eslint-plugin-react/lib/util/Components.js b/node_modules/eslint-plugin-react/lib/util/Components.js
deleted file mode 100644
index 515a39d..0000000
--- a/node_modules/eslint-plugin-react/lib/util/Components.js
+++ /dev/null
@@ -1,922 +0,0 @@
-/**
- * @fileoverview Utility class and functions for React components detection
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const doctrine = require('doctrine');
-const arrayIncludes = require('array-includes');
-const values = require('object.values');
-
-const variableUtil = require('./variable');
-const pragmaUtil = require('./pragma');
-const astUtil = require('./ast');
-const propTypesUtil = require('./propTypes');
-const jsxUtil = require('./jsx');
-const usedPropTypesUtil = require('./usedPropTypes');
-const defaultPropsUtil = require('./defaultProps');
-
-function getId(node) {
-  return node && node.range.join(':');
-}
-
-function usedPropTypesAreEquivalent(propA, propB) {
-  if (propA.name === propB.name) {
-    if (!propA.allNames && !propB.allNames) {
-      return true;
-    }
-    if (Array.isArray(propA.allNames) && Array.isArray(propB.allNames) && propA.allNames.join('') === propB.allNames.join('')) {
-      return true;
-    }
-    return false;
-  }
-  return false;
-}
-
-function mergeUsedPropTypes(propsList, newPropsList) {
-  const propsToAdd = [];
-  newPropsList.forEach((newProp) => {
-    const newPropisAlreadyInTheList = propsList.some(prop => usedPropTypesAreEquivalent(prop, newProp));
-    if (!newPropisAlreadyInTheList) {
-      propsToAdd.push(newProp);
-    }
-  });
-
-  return propsList.concat(propsToAdd);
-}
-
-function isReturnsConditionalJSX(node, property, strict) {
-  const returnsConditionalJSXConsequent = node[property] &&
-    node[property].type === 'ConditionalExpression' &&
-    jsxUtil.isJSX(node[property].consequent);
-  const returnsConditionalJSXAlternate = node[property] &&
-    node[property].type === 'ConditionalExpression' &&
-    jsxUtil.isJSX(node[property].alternate);
-  return strict ?
-    (returnsConditionalJSXConsequent && returnsConditionalJSXAlternate) :
-    (returnsConditionalJSXConsequent || returnsConditionalJSXAlternate);
-}
-
-function isReturnsLogicalJSX(node, property, strict) {
-  const returnsLogicalJSXLeft = node[property] &&
-    node[property].type === 'LogicalExpression' &&
-    jsxUtil.isJSX(node[property].left);
-  const returnsLogicalJSXRight = node[property] &&
-    node[property].type === 'LogicalExpression' &&
-    jsxUtil.isJSX(node[property].right);
-  return strict ?
-    (returnsLogicalJSXLeft && returnsLogicalJSXRight) :
-    (returnsLogicalJSXLeft || returnsLogicalJSXRight);
-}
-
-const Lists = new WeakMap();
-
-/**
- * Components
- */
-class Components {
-  constructor() {
-    Lists.set(this, {});
-  }
-
-  /**
-   * Add a node to the components list, or update it if it's already in the list
-   *
-   * @param {ASTNode} node The AST node being added.
-   * @param {Number} confidence Confidence in the component detection (0=banned, 1=maybe, 2=yes)
-   * @returns {Object} Added component object
-   */
-  add(node, confidence) {
-    const id = getId(node);
-    const list = Lists.get(this);
-    if (list[id]) {
-      if (confidence === 0 || list[id].confidence === 0) {
-        list[id].confidence = 0;
-      } else {
-        list[id].confidence = Math.max(list[id].confidence, confidence);
-      }
-      return list[id];
-    }
-    list[id] = {
-      node,
-      confidence
-    };
-    return list[id];
-  }
-
-  /**
-   * Find a component in the list using its node
-   *
-   * @param {ASTNode} node The AST node being searched.
-   * @returns {Object} Component object, undefined if the component is not found or has confidence value of 0.
-   */
-  get(node) {
-    const id = getId(node);
-    const item = Lists.get(this)[id];
-    if (item && item.confidence >= 1) {
-      return item;
-    }
-    return null;
-  }
-
-  /**
-   * Update a component in the list
-   *
-   * @param {ASTNode} node The AST node being updated.
-   * @param {Object} props Additional properties to add to the component.
-   */
-  set(node, props) {
-    const list = Lists.get(this);
-    let component = list[getId(node)];
-    while (!component) {
-      node = node.parent;
-      if (!node) {
-        return;
-      }
-      component = list[getId(node)];
-    }
-
-    Object.assign(
-      component,
-      props,
-      {
-        usedPropTypes: mergeUsedPropTypes(
-          component.usedPropTypes || [],
-          props.usedPropTypes || []
-        )
-      }
-    );
-  }
-
-  /**
-   * Return the components list
-   * Components for which we are not confident are not returned
-   *
-   * @returns {Object} Components list
-   */
-  list() {
-    const thisList = Lists.get(this);
-    const list = {};
-    const usedPropTypes = {};
-
-    // Find props used in components for which we are not confident
-    Object.keys(thisList).filter(i => thisList[i].confidence < 2).forEach((i) => {
-      let component = null;
-      let node = null;
-      node = thisList[i].node;
-      while (!component && node.parent) {
-        node = node.parent;
-        // Stop moving up if we reach a decorator
-        if (node.type === 'Decorator') {
-          break;
-        }
-        component = this.get(node);
-      }
-      if (component) {
-        const newUsedProps = (thisList[i].usedPropTypes || []).filter(propType => !propType.node || propType.node.kind !== 'init');
-
-        const componentId = getId(component.node);
-
-        usedPropTypes[componentId] = mergeUsedPropTypes(usedPropTypes[componentId] || [], newUsedProps);
-      }
-    });
-
-    // Assign used props in not confident components to the parent component
-    Object.keys(thisList).filter(j => thisList[j].confidence >= 2).forEach((j) => {
-      const id = getId(thisList[j].node);
-      list[j] = thisList[j];
-      if (usedPropTypes[id]) {
-        list[j].usedPropTypes = mergeUsedPropTypes(list[j].usedPropTypes || [], usedPropTypes[id]);
-      }
-    });
-    return list;
-  }
-
-  /**
-   * Return the length of the components list
-   * Components for which we are not confident are not counted
-   *
-   * @returns {Number} Components list length
-   */
-  length() {
-    const list = Lists.get(this);
-    return Object.keys(list).filter(i => list[i].confidence >= 2).length;
-  }
-}
-
-function componentRule(rule, context) {
-  const createClass = pragmaUtil.getCreateClassFromContext(context);
-  const pragma = pragmaUtil.getFromContext(context);
-  const sourceCode = context.getSourceCode();
-  const components = new Components();
-
-  // Utilities for component detection
-  const utils = {
-
-    /**
-     * Check if the node is a React ES5 component
-     *
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if the node is a React ES5 component, false if not
-     */
-    isES5Component(node) {
-      if (!node.parent) {
-        return false;
-      }
-      return new RegExp(`^(${pragma}\\.)?${createClass}$`).test(sourceCode.getText(node.parent.callee));
-    },
-
-    /**
-     * Check if the node is a React ES6 component
-     *
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if the node is a React ES6 component, false if not
-     */
-    isES6Component(node) {
-      if (utils.isExplicitComponent(node)) {
-        return true;
-      }
-
-      if (!node.superClass) {
-        return false;
-      }
-      return new RegExp(`^(${pragma}\\.)?(Pure)?Component$`).test(sourceCode.getText(node.superClass));
-    },
-
-    /**
-     * Check if the node is explicitly declared as a descendant of a React Component
-     *
-     * @param {ASTNode} node The AST node being checked (can be a ReturnStatement or an ArrowFunctionExpression).
-     * @returns {Boolean} True if the node is explicitly declared as a descendant of a React Component, false if not
-     */
-    isExplicitComponent(node) {
-      let comment;
-      // Sometimes the passed node may not have been parsed yet by eslint, and this function call crashes.
-      // Can be removed when eslint sets "parent" property for all nodes on initial AST traversal: https://github.com/eslint/eslint-scope/issues/27
-      // eslint-disable-next-line no-warning-comments
-      // FIXME: Remove try/catch when https://github.com/eslint/eslint-scope/issues/27 is implemented.
-      try {
-        comment = sourceCode.getJSDocComment(node);
-      } catch (e) {
-        comment = null;
-      }
-
-      if (comment === null) {
-        return false;
-      }
-
-      const commentAst = doctrine.parse(comment.value, {
-        unwrap: true,
-        tags: ['extends', 'augments']
-      });
-
-      const relevantTags = commentAst.tags.filter(tag => tag.name === 'React.Component' || tag.name === 'React.PureComponent');
-
-      return relevantTags.length > 0;
-    },
-
-    /**
-     * Checks to see if our component extends React.PureComponent
-     *
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if node extends React.PureComponent, false if not
-     */
-    isPureComponent(node) {
-      if (node.superClass) {
-        return new RegExp(`^(${pragma}\\.)?PureComponent$`).test(sourceCode.getText(node.superClass));
-      }
-      return false;
-    },
-
-    /**
-     * Check if variable is destructured from pragma import
-     *
-     * @param {string} variable The variable name to check
-     * @returns {Boolean} True if createElement is destructured from the pragma
-     */
-    isDestructuredFromPragmaImport(variable) {
-      const variables = variableUtil.variablesInScope(context);
-      const variableInScope = variableUtil.getVariable(variables, variable);
-      if (variableInScope) {
-        const map = variableInScope.scope.set;
-        return map.has(pragma);
-      }
-      return false;
-    },
-
-    /**
-     * Checks to see if node is called within createElement from pragma
-     *
-     * @param {ASTNode} node The AST node being checked.
-     * @returns {Boolean} True if createElement called from pragma
-     */
-    isCreateElement(node) {
-      const calledOnPragma = (
-        node &&
-        node.callee &&
-        node.callee.object &&
-        node.callee.object.name === pragma &&
-        node.callee.property &&
-        node.callee.property.name === 'createElement'
-      );
-
-      const calledDirectly = (
-        node &&
-        node.callee &&
-        node.callee.name === 'createElement'
-      );
-
-      if (this.isDestructuredFromPragmaImport('createElement')) {
-        return calledDirectly || calledOnPragma;
-      }
-      return calledOnPragma;
-    },
-
-    /**
-     * Check if we are in a class constructor
-     * @return {boolean} true if we are in a class constructor, false if not
-     */
-    inConstructor() {
-      let scope = context.getScope();
-      while (scope) {
-        if (scope.block && scope.block.parent && scope.block.parent.kind === 'constructor') {
-          return true;
-        }
-        scope = scope.upper;
-      }
-      return false;
-    },
-
-    /**
-     * Determine if the node is MemberExpression of `this.state`
-     * @param {Object} node The node to process
-     * @returns {Boolean}
-     */
-    isStateMemberExpression(node) {
-      return node.type === 'MemberExpression' && node.object.type === 'ThisExpression' && node.property.name === 'state';
-    },
-
-    getReturnPropertyAndNode(ASTnode) {
-      let property;
-      let node = ASTnode;
-      switch (node.type) {
-        case 'ReturnStatement':
-          property = 'argument';
-          break;
-        case 'ArrowFunctionExpression':
-          property = 'body';
-          if (node[property] && node[property].type === 'BlockStatement') {
-            node = utils.findReturnStatement(node);
-            property = 'argument';
-          }
-          break;
-        default:
-          node = utils.findReturnStatement(node);
-          property = 'argument';
-      }
-      return {
-        node,
-        property
-      };
-    },
-
-    /**
-     * Check if the node is returning JSX
-     *
-     * @param {ASTNode} ASTnode The AST node being checked
-     * @param {Boolean} [strict] If true, in a ternary condition the node must return JSX in both cases
-     * @returns {Boolean} True if the node is returning JSX, false if not
-     */
-    isReturningJSX(ASTnode, strict) {
-      const nodeAndProperty = utils.getReturnPropertyAndNode(ASTnode);
-      const node = nodeAndProperty.node;
-      const property = nodeAndProperty.property;
-
-      if (!node) {
-        return false;
-      }
-
-      const returnsConditionalJSX = isReturnsConditionalJSX(node, property, strict);
-      const returnsLogicalJSX = isReturnsLogicalJSX(node, property, strict);
-
-      const returnsJSX = node[property] && jsxUtil.isJSX(node[property]);
-      const returnsPragmaCreateElement = this.isCreateElement(node[property]);
-
-      return !!(
-        returnsConditionalJSX ||
-        returnsLogicalJSX ||
-        returnsJSX ||
-        returnsPragmaCreateElement
-      );
-    },
-
-    /**
-     * Check if the node is returning null
-     *
-     * @param {ASTNode} ASTnode The AST node being checked
-     * @returns {Boolean} True if the node is returning null, false if not
-     */
-    isReturningNull(ASTnode) {
-      const nodeAndProperty = utils.getReturnPropertyAndNode(ASTnode);
-      const property = nodeAndProperty.property;
-      const node = nodeAndProperty.node;
-
-      if (!node) {
-        return false;
-      }
-
-      return node[property] && node[property].value === null;
-    },
-
-    /**
-     * Check if the node is returning JSX or null
-     *
-     * @param {ASTNode} ASTNode The AST node being checked
-     * @param {Boolean} [strict] If true, in a ternary condition the node must return JSX in both cases
-     * @returns {Boolean} True if the node is returning JSX or null, false if not
-     */
-    isReturningJSXOrNull(ASTNode, strict) {
-      return utils.isReturningJSX(ASTNode, strict) || utils.isReturningNull(ASTNode);
-    },
-
-    getPragmaComponentWrapper(node) {
-      let isPragmaComponentWrapper;
-      let currentNode = node;
-      let prevNode;
-      do {
-        currentNode = currentNode.parent;
-        isPragmaComponentWrapper = this.isPragmaComponentWrapper(currentNode);
-        if (isPragmaComponentWrapper) {
-          prevNode = currentNode;
-        }
-      } while (isPragmaComponentWrapper);
-
-      return prevNode;
-    },
-
-    getComponentNameFromJSXElement(node) {
-      if (node.type !== 'JSXElement') {
-        return null;
-      }
-      if (node.openingElement && node.openingElement.name && node.openingElement.name.name) {
-        return node.openingElement.name.name;
-      }
-      return null;
-    },
-
-    /**
-     * Getting the first JSX element's name.
-     * @param {object} node
-     * @returns {string | null}
-     */
-    getNameOfWrappedComponent(node) {
-      if (node.length < 1) {
-        return null;
-      }
-      const body = node[0].body;
-      if (!body) {
-        return null;
-      }
-      if (body.type === 'JSXElement') {
-        return this.getComponentNameFromJSXElement(body);
-      }
-      if (body.type === 'BlockStatement') {
-        const jsxElement = body.body.find(item => item.type === 'ReturnStatement');
-        return jsxElement && this.getComponentNameFromJSXElement(jsxElement.argument);
-      }
-      return null;
-    },
-
-    /**
-     * Get the list of names of components created till now
-     * @returns {string | boolean}
-     */
-    getDetectedComponents() {
-      const list = components.list();
-      return values(list).filter((val) => {
-        if (val.node.type === 'ClassDeclaration') {
-          return true;
-        }
-        if (
-          val.node.type === 'ArrowFunctionExpression' &&
-          val.node.parent &&
-          val.node.parent.type === 'VariableDeclarator' &&
-          val.node.parent.id
-        ) {
-          return true;
-        }
-        return false;
-      }).map((val) => {
-        if (val.node.type === 'ArrowFunctionExpression') return val.node.parent.id.name;
-        return val.node.id.name;
-      });
-    },
-
-    /**
-     * It will check wheater memo/forwardRef is wrapping existing component or
-     * creating a new one.
-     * @param {object} node
-     * @returns {boolean}
-     */
-    nodeWrapsComponent(node) {
-      const childComponent = this.getNameOfWrappedComponent(node.arguments);
-      const componentList = this.getDetectedComponents();
-      return !!childComponent && arrayIncludes(componentList, childComponent);
-    },
-
-    isPragmaComponentWrapper(node) {
-      if (!node || node.type !== 'CallExpression') {
-        return false;
-      }
-      const propertyNames = ['forwardRef', 'memo'];
-      const calleeObject = node.callee.object;
-      if (calleeObject && node.callee.property) {
-        return arrayIncludes(propertyNames, node.callee.property.name) &&
-          calleeObject.name === pragma &&
-          !this.nodeWrapsComponent(node);
-      }
-      return arrayIncludes(propertyNames, node.callee.name) && this.isDestructuredFromPragmaImport(node.callee.name);
-    },
-
-    /**
-     * Find a return statment in the current node
-     *
-     * @param {ASTNode} ASTnode The AST node being checked
-     */
-    findReturnStatement: astUtil.findReturnStatement,
-
-    /**
-     * Get the parent component node from the current scope
-     *
-     * @returns {ASTNode} component node, null if we are not in a component
-     */
-    getParentComponent() {
-      return (
-        utils.getParentES6Component() ||
-        utils.getParentES5Component() ||
-        utils.getParentStatelessComponent()
-      );
-    },
-
-    /**
-     * Get the parent ES5 component node from the current scope
-     *
-     * @returns {ASTNode} component node, null if we are not in a component
-     */
-    getParentES5Component() {
-      let scope = context.getScope();
-      while (scope) {
-        const node = scope.block && scope.block.parent && scope.block.parent.parent;
-        if (node && utils.isES5Component(node)) {
-          return node;
-        }
-        scope = scope.upper;
-      }
-      return null;
-    },
-
-    /**
-     * Get the parent ES6 component node from the current scope
-     *
-     * @returns {ASTNode} component node, null if we are not in a component
-     */
-    getParentES6Component() {
-      let scope = context.getScope();
-      while (scope && scope.type !== 'class') {
-        scope = scope.upper;
-      }
-      const node = scope && scope.block;
-      if (!node || !utils.isES6Component(node)) {
-        return null;
-      }
-      return node;
-    },
-
-    /**
-     * @param {ASTNode} node
-     * @returns {boolean}
-     */
-    isInAllowedPositionForComponent(node) {
-      switch (node.parent.type) {
-        case 'VariableDeclarator':
-        case 'AssignmentExpression':
-        case 'Property':
-        case 'ReturnStatement':
-        case 'ExportDefaultDeclaration': {
-          return true;
-        }
-        case 'SequenceExpression': {
-          return utils.isInAllowedPositionForComponent(node.parent) &&
-            node === node.parent.expressions[node.parent.expressions.length - 1];
-        }
-        default:
-          return false;
-      }
-    },
-
-    /**
-     * Get node if node is a stateless component, or node.parent in cases like
-     * `React.memo` or `React.forwardRef`. Otherwise returns `undefined`.
-     * @param {ASTNode} node
-     * @returns {ASTNode | undefined}
-     */
-    getStatelessComponent(node) {
-      if (node.type === 'FunctionDeclaration') {
-        if (utils.isReturningJSXOrNull(node)) {
-          return node;
-        }
-      }
-
-      if (node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression') {
-        if (utils.isInAllowedPositionForComponent(node) && utils.isReturningJSXOrNull(node)) {
-          return node;
-        }
-
-        // Case like `React.memo(() => <></>)` or `React.forwardRef(...)`
-        const pragmaComponentWrapper = utils.getPragmaComponentWrapper(node);
-        if (pragmaComponentWrapper) {
-          return pragmaComponentWrapper;
-        }
-      }
-
-      return undefined;
-    },
-
-    /**
-     * Get the parent stateless component node from the current scope
-     *
-     * @returns {ASTNode} component node, null if we are not in a component
-     */
-    getParentStatelessComponent() {
-      let scope = context.getScope();
-      while (scope) {
-        const node = scope.block;
-        const statelessComponent = utils.getStatelessComponent(node);
-        if (statelessComponent) {
-          return statelessComponent;
-        }
-        scope = scope.upper;
-      }
-      return null;
-    },
-
-    /**
-     * Get the related component from a node
-     *
-     * @param {ASTNode} node The AST node being checked (must be a MemberExpression).
-     * @returns {ASTNode} component node, null if we cannot find the component
-     */
-    getRelatedComponent(node) {
-      let i;
-      let j;
-      let k;
-      let l;
-      let componentNode;
-      // Get the component path
-      const componentPath = [];
-      while (node) {
-        if (node.property && node.property.type === 'Identifier') {
-          componentPath.push(node.property.name);
-        }
-        if (node.object && node.object.type === 'Identifier') {
-          componentPath.push(node.object.name);
-        }
-        node = node.object;
-      }
-      componentPath.reverse();
-      const componentName = componentPath.slice(0, componentPath.length - 1).join('.');
-
-      // Find the variable in the current scope
-      const variableName = componentPath.shift();
-      if (!variableName) {
-        return null;
-      }
-      let variableInScope;
-      const variables = variableUtil.variablesInScope(context);
-      for (i = 0, j = variables.length; i < j; i++) {
-        if (variables[i].name === variableName) {
-          variableInScope = variables[i];
-          break;
-        }
-      }
-      if (!variableInScope) {
-        return null;
-      }
-
-      // Try to find the component using variable references
-      const refs = variableInScope.references;
-      refs.some((ref) => {
-        let refId = ref.identifier;
-        if (refId.parent && refId.parent.type === 'MemberExpression') {
-          refId = refId.parent;
-        }
-        if (sourceCode.getText(refId) !== componentName) {
-          return false;
-        }
-        if (refId.type === 'MemberExpression') {
-          componentNode = refId.parent.right;
-        } else if (
-          refId.parent &&
-          refId.parent.type === 'VariableDeclarator' &&
-          refId.parent.init &&
-          refId.parent.init.type !== 'Identifier'
-        ) {
-          componentNode = refId.parent.init;
-        }
-        return true;
-      });
-
-      if (componentNode) {
-        // Return the component
-        return components.add(componentNode, 1);
-      }
-
-      // Try to find the component using variable declarations
-      const defs = variableInScope.defs;
-      const defInScope = defs.find(def => (
-        def.type === 'ClassName' ||
-        def.type === 'FunctionName' ||
-        def.type === 'Variable'
-      ));
-      if (!defInScope || !defInScope.node) {
-        return null;
-      }
-      componentNode = defInScope.node.init || defInScope.node;
-
-      // Traverse the node properties to the component declaration
-      for (i = 0, j = componentPath.length; i < j; i++) {
-        if (!componentNode.properties) {
-          continue; // eslint-disable-line no-continue
-        }
-        for (k = 0, l = componentNode.properties.length; k < l; k++) {
-          if (componentNode.properties[k].key && componentNode.properties[k].key.name === componentPath[i]) {
-            componentNode = componentNode.properties[k];
-            break;
-          }
-        }
-        if (!componentNode || !componentNode.value) {
-          return null;
-        }
-        componentNode = componentNode.value;
-      }
-
-      // Return the component
-      return components.add(componentNode, 1);
-    }
-  };
-
-  // Component detection instructions
-  const detectionInstructions = {
-    CallExpression(node) {
-      if (!utils.isPragmaComponentWrapper(node)) {
-        return;
-      }
-      if (node.arguments.length > 0 && astUtil.isFunctionLikeExpression(node.arguments[0])) {
-        components.add(node, 2);
-      }
-    },
-
-    ClassExpression(node) {
-      if (!utils.isES6Component(node)) {
-        return;
-      }
-      components.add(node, 2);
-    },
-
-    ClassDeclaration(node) {
-      if (!utils.isES6Component(node)) {
-        return;
-      }
-      components.add(node, 2);
-    },
-
-    ClassProperty(node) {
-      node = utils.getParentComponent();
-      if (!node) {
-        return;
-      }
-      components.add(node, 2);
-    },
-
-    ObjectExpression(node) {
-      if (!utils.isES5Component(node)) {
-        return;
-      }
-      components.add(node, 2);
-    },
-
-    FunctionExpression(node) {
-      if (node.async) {
-        components.add(node, 0);
-        return;
-      }
-      const component = utils.getParentComponent();
-      if (
-        !component ||
-        (component.parent && component.parent.type === 'JSXExpressionContainer')
-      ) {
-        // Ban the node if we cannot find a parent component
-        components.add(node, 0);
-        return;
-      }
-      components.add(component, 1);
-    },
-
-    FunctionDeclaration(node) {
-      if (node.async) {
-        components.add(node, 0);
-        return;
-      }
-      node = utils.getParentComponent();
-      if (!node) {
-        return;
-      }
-      components.add(node, 1);
-    },
-
-    ArrowFunctionExpression(node) {
-      if (node.async) {
-        components.add(node, 0);
-        return;
-      }
-      const component = utils.getParentComponent();
-      if (
-        !component ||
-        (component.parent && component.parent.type === 'JSXExpressionContainer')
-      ) {
-        // Ban the node if we cannot find a parent component
-        components.add(node, 0);
-        return;
-      }
-      if (component.expression && utils.isReturningJSX(component)) {
-        components.add(component, 2);
-      } else {
-        components.add(component, 1);
-      }
-    },
-
-    ThisExpression(node) {
-      const component = utils.getParentComponent();
-      if (!component || !/Function/.test(component.type) || !node.parent.property) {
-        return;
-      }
-      // Ban functions accessing a property on a ThisExpression
-      components.add(node, 0);
-    },
-
-    ReturnStatement(node) {
-      if (!utils.isReturningJSX(node)) {
-        return;
-      }
-      node = utils.getParentComponent();
-      if (!node) {
-        const scope = context.getScope();
-        components.add(scope.block, 1);
-        return;
-      }
-      components.add(node, 2);
-    }
-  };
-
-  // Update the provided rule instructions to add the component detection
-  const ruleInstructions = rule(context, components, utils);
-  const updatedRuleInstructions = Object.assign({}, ruleInstructions);
-  const propTypesInstructions = propTypesUtil(context, components, utils);
-  const usedPropTypesInstructions = usedPropTypesUtil(context, components, utils);
-  const defaultPropsInstructions = defaultPropsUtil(context, components, utils);
-  const allKeys = new Set(Object.keys(detectionInstructions).concat(
-    Object.keys(propTypesInstructions),
-    Object.keys(usedPropTypesInstructions),
-    Object.keys(defaultPropsInstructions)
-  ));
-
-  allKeys.forEach((instruction) => {
-    updatedRuleInstructions[instruction] = (node) => {
-      if (instruction in detectionInstructions) {
-        detectionInstructions[instruction](node);
-      }
-      if (instruction in propTypesInstructions) {
-        propTypesInstructions[instruction](node);
-      }
-      if (instruction in usedPropTypesInstructions) {
-        usedPropTypesInstructions[instruction](node);
-      }
-      if (instruction in defaultPropsInstructions) {
-        defaultPropsInstructions[instruction](node);
-      }
-      if (ruleInstructions[instruction]) {
-        return ruleInstructions[instruction](node);
-      }
-    };
-  });
-
-  // Return the updated rule instructions
-  return updatedRuleInstructions;
-}
-
-module.exports = Object.assign(Components, {
-  detect(rule) {
-    return componentRule.bind(this, rule);
-  }
-});
diff --git a/node_modules/eslint-plugin-react/lib/util/annotations.js b/node_modules/eslint-plugin-react/lib/util/annotations.js
deleted file mode 100644
index d52fb21..0000000
--- a/node_modules/eslint-plugin-react/lib/util/annotations.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * @fileoverview Utility functions for type annotation detection.
- * @author Yannick Croissant
- * @author Vitor Balocco
- */
-
-'use strict';
-
-/**
- * Checks if we are declaring a `props` argument with a flow type annotation.
- * @param {ASTNode} node The AST node being checked.
- * @param {Object} context
- * @returns {Boolean} True if the node is a type annotated props declaration, false if not.
- */
-function isAnnotatedFunctionPropsDeclaration(node, context) {
-  if (!node || !node.params || !node.params.length) {
-    return false;
-  }
-
-  const typeNode = node.params[0].type === 'AssignmentPattern' ? node.params[0].left : node.params[0];
-
-  const tokens = context.getFirstTokens(typeNode, 2);
-  const isAnnotated = typeNode.typeAnnotation;
-  const isDestructuredProps = typeNode.type === 'ObjectPattern';
-  const isProps = tokens[0].value === 'props' || (tokens[1] && tokens[1].value === 'props');
-
-  return (isAnnotated && (isDestructuredProps || isProps));
-}
-
-module.exports = {
-  isAnnotatedFunctionPropsDeclaration
-};
diff --git a/node_modules/eslint-plugin-react/lib/util/ast.js b/node_modules/eslint-plugin-react/lib/util/ast.js
deleted file mode 100644
index 731a273..0000000
--- a/node_modules/eslint-plugin-react/lib/util/ast.js
+++ /dev/null
@@ -1,215 +0,0 @@
-/**
- * @fileoverview Utility functions for AST
- */
-
-'use strict';
-
-/**
- * Find a return statment in the current node
- *
- * @param {ASTNode} node The AST node being checked
- * @returns {ASTNode | false}
- */
-function findReturnStatement(node) {
-  if (
-    (!node.value || !node.value.body || !node.value.body.body) &&
-    (!node.body || !node.body.body)
-  ) {
-    return false;
-  }
-
-  const bodyNodes = (node.value ? node.value.body.body : node.body.body);
-
-  return (function loopNodes(nodes) {
-    let i = nodes.length - 1;
-    for (; i >= 0; i--) {
-      if (nodes[i].type === 'ReturnStatement') {
-        return nodes[i];
-      }
-      if (nodes[i].type === 'SwitchStatement') {
-        let j = nodes[i].cases.length - 1;
-        for (; j >= 0; j--) {
-          return loopNodes(nodes[i].cases[j].consequent);
-        }
-      }
-    }
-    return false;
-  }(bodyNodes));
-}
-
-/**
- * Get node with property's name
- * @param {Object} node - Property.
- * @returns {Object} Property name node.
- */
-function getPropertyNameNode(node) {
-  if (node.key || ['MethodDefinition', 'Property'].indexOf(node.type) !== -1) {
-    return node.key;
-  }
-  if (node.type === 'MemberExpression') {
-    return node.property;
-  }
-  return null;
-}
-
-/**
- * Get properties name
- * @param {Object} node - Property.
- * @returns {String} Property name.
- */
-function getPropertyName(node) {
-  const nameNode = getPropertyNameNode(node);
-  return nameNode ? nameNode.name : '';
-}
-
-/**
- * Get properties for a given AST node
- * @param {ASTNode} node The AST node being checked.
- * @returns {Array} Properties array.
- */
-function getComponentProperties(node) {
-  switch (node.type) {
-    case 'ClassDeclaration':
-    case 'ClassExpression':
-      return node.body.body;
-    case 'ObjectExpression':
-      return node.properties;
-    default:
-      return [];
-  }
-}
-
-
-/**
- * Gets the first node in a line from the initial node, excluding whitespace.
- * @param {Object} context The node to check
- * @param {ASTNode} node The node to check
- * @return {ASTNode} the first node in the line
- */
-function getFirstNodeInLine(context, node) {
-  const sourceCode = context.getSourceCode();
-  let token = node;
-  let lines;
-  do {
-    token = sourceCode.getTokenBefore(token);
-    lines = token.type === 'JSXText' ?
-      token.value.split('\n') :
-      null;
-  } while (
-    token.type === 'JSXText' &&
-        /^\s*$/.test(lines[lines.length - 1])
-  );
-  return token;
-}
-
-/**
- * Checks if the node is the first in its line, excluding whitespace.
- * @param {Object} context The node to check
- * @param {ASTNode} node The node to check
- * @return {Boolean} true if it's the first node in its line
- */
-function isNodeFirstInLine(context, node) {
-  const token = getFirstNodeInLine(context, node);
-  const startLine = node.loc.start.line;
-  const endLine = token ? token.loc.end.line : -1;
-  return startLine !== endLine;
-}
-
-/**
- * Checks if the node is a function or arrow function expression.
- * @param {ASTNode} node The node to check
- * @return {Boolean} true if it's a function-like expression
- */
-function isFunctionLikeExpression(node) {
-  return node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression';
-}
-
-/**
- * Checks if the node is a function.
- * @param {ASTNode} node The node to check
- * @return {Boolean} true if it's a function
- */
-function isFunction(node) {
-  return node.type === 'FunctionExpression' || node.type === 'FunctionDeclaration';
-}
-
-/**
- * Checks if the node is a class.
- * @param {ASTNode} node The node to check
- * @return {Boolean} true if it's a class
- */
-function isClass(node) {
-  return node.type === 'ClassDeclaration' || node.type === 'ClassExpression';
-}
-
-/**
- * Removes quotes from around an identifier.
- * @param {string} string the identifier to strip
- * @returns {string}
- */
-function stripQuotes(string) {
-  return string.replace(/^'|'$/g, '');
-}
-
-/**
- * Retrieve the name of a key node
- * @param {Context} context The AST node with the key.
- * @param {ASTNode} node The AST node with the key.
- * @return {string} the name of the key
- */
-function getKeyValue(context, node) {
-  if (node.type === 'ObjectTypeProperty') {
-    const tokens = context.getFirstTokens(node, 2);
-    return (tokens[0].value === '+' || tokens[0].value === '-' ?
-      tokens[1].value :
-      stripQuotes(tokens[0].value)
-    );
-  }
-  if (node.type === 'GenericTypeAnnotation') {
-    return node.id.name;
-  }
-  if (node.type === 'ObjectTypeAnnotation') {
-    return;
-  }
-  const key = node.key || node.argument;
-  return key.type === 'Identifier' ? key.name : key.value;
-}
-
-/**
- * Checks if a node is being assigned a value: props.bar = 'bar'
- * @param {ASTNode} node The AST node being checked.
- * @returns {Boolean}
- */
-function isAssignmentLHS(node) {
-  return (
-    node.parent &&
-    node.parent.type === 'AssignmentExpression' &&
-    node.parent.left === node
-  );
-}
-
-/**
- * Extracts the expression node that is wrapped inside a TS type assertion
- *
- * @param {ASTNode} node - potential TS node
- * @returns {ASTNode} - unwrapped expression node
- */
-function unwrapTSAsExpression(node) {
-  if (node && node.type === 'TSAsExpression') return node.expression;
-  return node;
-}
-
-module.exports = {
-  findReturnStatement,
-  getFirstNodeInLine,
-  getPropertyName,
-  getPropertyNameNode,
-  getComponentProperties,
-  getKeyValue,
-  isAssignmentLHS,
-  isClass,
-  isFunction,
-  isFunctionLikeExpression,
-  isNodeFirstInLine,
-  unwrapTSAsExpression
-};
diff --git a/node_modules/eslint-plugin-react/lib/util/defaultProps.js b/node_modules/eslint-plugin-react/lib/util/defaultProps.js
deleted file mode 100644
index cf8ab46..0000000
--- a/node_modules/eslint-plugin-react/lib/util/defaultProps.js
+++ /dev/null
@@ -1,267 +0,0 @@
-/**
- * @fileoverview Common defaultProps detection functionality.
- */
-
-'use strict';
-
-const fromEntries = require('object.fromentries');
-const astUtil = require('./ast');
-const propsUtil = require('./props');
-const variableUtil = require('./variable');
-const propWrapperUtil = require('../util/propWrapper');
-
-const QUOTES_REGEX = /^["']|["']$/g;
-
-module.exports = function defaultPropsInstructions(context, components, utils) {
-  const sourceCode = context.getSourceCode();
-
-  /**
-   * Try to resolve the node passed in to a variable in the current scope. If the node passed in is not
-   * an Identifier, then the node is simply returned.
-   * @param   {ASTNode} node The node to resolve.
-   * @returns {ASTNode|null} Return null if the value could not be resolved, ASTNode otherwise.
-   */
-  function resolveNodeValue(node) {
-    if (node.type === 'Identifier') {
-      return variableUtil.findVariableByName(context, node.name);
-    }
-    if (
-      node.type === 'CallExpression' &&
-      propWrapperUtil.isPropWrapperFunction(context, node.callee.name) &&
-      node.arguments && node.arguments[0]
-    ) {
-      return resolveNodeValue(node.arguments[0]);
-    }
-    return node;
-  }
-
-  /**
-   * Extracts a DefaultProp from an ObjectExpression node.
-   * @param   {ASTNode} objectExpression ObjectExpression node.
-   * @returns {Object|string}            Object representation of a defaultProp, to be consumed by
-   *                                     `addDefaultPropsToComponent`, or string "unresolved", if the defaultProps
-   *                                     from this ObjectExpression can't be resolved.
-   */
-  function getDefaultPropsFromObjectExpression(objectExpression) {
-    const hasSpread = objectExpression.properties.find(property => property.type === 'ExperimentalSpreadProperty' || property.type === 'SpreadElement');
-
-    if (hasSpread) {
-      return 'unresolved';
-    }
-
-    return objectExpression.properties.map(defaultProp => ({
-      name: sourceCode.getText(defaultProp.key).replace(QUOTES_REGEX, ''),
-      node: defaultProp
-    }));
-  }
-
-  /**
-   * Marks a component's DefaultProps declaration as "unresolved". A component's DefaultProps is
-   * marked as "unresolved" if we cannot safely infer the values of its defaultProps declarations
-   * without risking false negatives.
-   * @param   {Object} component The component to mark.
-   * @returns {void}
-   */
-  function markDefaultPropsAsUnresolved(component) {
-    components.set(component.node, {
-      defaultProps: 'unresolved'
-    });
-  }
-
-  /**
-   * Adds defaultProps to the component passed in.
-   * @param   {ASTNode}         component    The component to add the defaultProps to.
-   * @param   {Object[]|'unresolved'} defaultProps defaultProps to add to the component or the string "unresolved"
-   *                                         if this component has defaultProps that can't be resolved.
-   * @returns {void}
-   */
-  function addDefaultPropsToComponent(component, defaultProps) {
-    // Early return if this component's defaultProps is already marked as "unresolved".
-    if (component.defaultProps === 'unresolved') {
-      return;
-    }
-
-    if (defaultProps === 'unresolved') {
-      markDefaultPropsAsUnresolved(component);
-      return;
-    }
-
-    const defaults = component.defaultProps || {};
-    const newDefaultProps = Object.assign(
-      {},
-      defaults,
-      fromEntries(defaultProps.map(prop => [prop.name, prop]))
-    );
-
-    components.set(component.node, {
-      defaultProps: newDefaultProps
-    });
-  }
-
-  return {
-    MemberExpression(node) {
-      const isDefaultProp = propsUtil.isDefaultPropsDeclaration(node);
-
-      if (!isDefaultProp) {
-        return;
-      }
-
-      // find component this defaultProps belongs to
-      const component = utils.getRelatedComponent(node);
-      if (!component) {
-        return;
-      }
-
-      // e.g.:
-      // MyComponent.propTypes = {
-      //   foo: React.PropTypes.string.isRequired,
-      //   bar: React.PropTypes.string
-      // };
-      //
-      // or:
-      //
-      // MyComponent.propTypes = myPropTypes;
-      if (node.parent.type === 'AssignmentExpression') {
-        const expression = resolveNodeValue(node.parent.right);
-        if (!expression || expression.type !== 'ObjectExpression') {
-          // If a value can't be found, we mark the defaultProps declaration as "unresolved", because
-          // we should ignore this component and not report any errors for it, to avoid false-positives
-          // with e.g. external defaultProps declarations.
-          if (isDefaultProp) {
-            markDefaultPropsAsUnresolved(component);
-          }
-
-          return;
-        }
-
-        addDefaultPropsToComponent(component, getDefaultPropsFromObjectExpression(expression));
-
-        return;
-      }
-
-      // e.g.:
-      // MyComponent.propTypes.baz = React.PropTypes.string;
-      if (node.parent.type === 'MemberExpression' && node.parent.parent &&
-        node.parent.parent.type === 'AssignmentExpression') {
-        addDefaultPropsToComponent(component, [{
-          name: node.parent.property.name,
-          node: node.parent.parent
-        }]);
-      }
-    },
-
-    // e.g.:
-    // class Hello extends React.Component {
-    //   static get defaultProps() {
-    //     return {
-    //       name: 'Dean'
-    //     };
-    //   }
-    //   render() {
-    //     return <div>Hello {this.props.name}</div>;
-    //   }
-    // }
-    MethodDefinition(node) {
-      if (!node.static || node.kind !== 'get') {
-        return;
-      }
-
-      if (!propsUtil.isDefaultPropsDeclaration(node)) {
-        return;
-      }
-
-      // find component this propTypes/defaultProps belongs to
-      const component = components.get(utils.getParentES6Component());
-      if (!component) {
-        return;
-      }
-
-      const returnStatement = utils.findReturnStatement(node);
-      if (!returnStatement) {
-        return;
-      }
-
-      const expression = resolveNodeValue(returnStatement.argument);
-      if (!expression || expression.type !== 'ObjectExpression') {
-        return;
-      }
-
-      addDefaultPropsToComponent(component, getDefaultPropsFromObjectExpression(expression));
-    },
-
-    // e.g.:
-    // class Greeting extends React.Component {
-    //   render() {
-    //     return (
-    //       <h1>Hello, {this.props.foo} {this.props.bar}</h1>
-    //     );
-    //   }
-    //   static defaultProps = {
-    //     foo: 'bar',
-    //     bar: 'baz'
-    //   };
-    // }
-    ClassProperty(node) {
-      if (!(node.static && node.value)) {
-        return;
-      }
-
-      const propName = astUtil.getPropertyName(node);
-      const isDefaultProp = propName === 'defaultProps' || propName === 'getDefaultProps';
-
-      if (!isDefaultProp) {
-        return;
-      }
-
-      // find component this propTypes/defaultProps belongs to
-      const component = components.get(utils.getParentES6Component());
-      if (!component) {
-        return;
-      }
-
-      const expression = resolveNodeValue(node.value);
-      if (!expression || expression.type !== 'ObjectExpression') {
-        return;
-      }
-
-      addDefaultPropsToComponent(component, getDefaultPropsFromObjectExpression(expression));
-    },
-
-    // e.g.:
-    // React.createClass({
-    //   render: function() {
-    //     return <div>{this.props.foo}</div>;
-    //   },
-    //   getDefaultProps: function() {
-    //     return {
-    //       foo: 'default'
-    //     };
-    //   }
-    // });
-    ObjectExpression(node) {
-      // find component this propTypes/defaultProps belongs to
-      const component = utils.isES5Component(node) && components.get(node);
-      if (!component) {
-        return;
-      }
-
-      // Search for the proptypes declaration
-      node.properties.forEach((property) => {
-        if (property.type === 'ExperimentalSpreadProperty' || property.type === 'SpreadElement') {
-          return;
-        }
-
-        const isDefaultProp = propsUtil.isDefaultPropsDeclaration(property);
-
-        if (isDefaultProp && property.value.type === 'FunctionExpression') {
-          const returnStatement = utils.findReturnStatement(property);
-          if (!returnStatement || returnStatement.argument.type !== 'ObjectExpression') {
-            return;
-          }
-
-          addDefaultPropsToComponent(component, getDefaultPropsFromObjectExpression(returnStatement.argument));
-        }
-      });
-    }
-  };
-};
diff --git a/node_modules/eslint-plugin-react/lib/util/docsUrl.js b/node_modules/eslint-plugin-react/lib/util/docsUrl.js
deleted file mode 100644
index f579409..0000000
--- a/node_modules/eslint-plugin-react/lib/util/docsUrl.js
+++ /dev/null
@@ -1,7 +0,0 @@
-'use strict';
-
-function docsUrl(ruleName) {
-  return `https://github.com/yannickcr/eslint-plugin-react/tree/master/docs/rules/${ruleName}.md`;
-}
-
-module.exports = docsUrl;
diff --git a/node_modules/eslint-plugin-react/lib/util/error.js b/node_modules/eslint-plugin-react/lib/util/error.js
deleted file mode 100644
index bbfc3d6..0000000
--- a/node_modules/eslint-plugin-react/lib/util/error.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-
-/**
- * Logs out a message if there is no format option set.
- * @param {String} message - Message to log.
- */
-function error(message) {
-  if (!/=-(f|-format)=/.test(process.argv.join('='))) {
-    // eslint-disable-next-line no-console
-    console.error(message);
-  }
-}
-
-module.exports = error;
diff --git a/node_modules/eslint-plugin-react/lib/util/getTokenBeforeClosingBracket.js b/node_modules/eslint-plugin-react/lib/util/getTokenBeforeClosingBracket.js
deleted file mode 100644
index a727c1a..0000000
--- a/node_modules/eslint-plugin-react/lib/util/getTokenBeforeClosingBracket.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-
-/**
- * Find the token before the closing bracket.
- * @param {ASTNode} node - The JSX element node.
- * @returns {Token} The token before the closing bracket.
- */
-function getTokenBeforeClosingBracket(node) {
-  const attributes = node.attributes;
-  if (attributes.length === 0) {
-    return node.name;
-  }
-  return attributes[attributes.length - 1];
-}
-
-module.exports = getTokenBeforeClosingBracket;
diff --git a/node_modules/eslint-plugin-react/lib/util/jsx.js b/node_modules/eslint-plugin-react/lib/util/jsx.js
deleted file mode 100644
index e3bcc23..0000000
--- a/node_modules/eslint-plugin-react/lib/util/jsx.js
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * @fileoverview Utility functions for JSX
- */
-
-'use strict';
-
-const elementType = require('jsx-ast-utils/elementType');
-
-const COMPAT_TAG_REGEX = /^[a-z]|-/;
-
-/**
- * Checks if a node represents a DOM element.
- * @param {object} node - JSXOpeningElement to check.
- * @returns {boolean} Whether or not the node corresponds to a DOM element.
- */
-function isDOMComponent(node) {
-  let name = elementType(node);
-
-  // Get namespace if the type is JSXNamespacedName or JSXMemberExpression
-  if (name.indexOf(':') > -1) {
-    name = name.slice(0, name.indexOf(':'));
-  } else if (name.indexOf('.') > -1) {
-    name = name.slice(0, name.indexOf('.'));
-  }
-
-  return COMPAT_TAG_REGEX.test(name);
-}
-
-/**
- * Test whether a JSXElement is a fragment
- * @param {JSXElement} node
- * @param {string} reactPragma
- * @param {string} fragmentPragma
- * @returns {boolean}
- */
-function isFragment(node, reactPragma, fragmentPragma) {
-  const name = node.openingElement.name;
-
-  // <Fragment>
-  if (name.type === 'JSXIdentifier' && name.name === fragmentPragma) {
-    return true;
-  }
-
-  // <React.Fragment>
-  if (
-    name.type === 'JSXMemberExpression' &&
-    name.object.type === 'JSXIdentifier' &&
-    name.object.name === reactPragma &&
-    name.property.type === 'JSXIdentifier' &&
-    name.property.name === fragmentPragma
-  ) {
-    return true;
-  }
-
-  return false;
-}
-
-/**
- * Checks if a node represents a JSX element or fragment.
- * @param {object} node - node to check.
- * @returns {boolean} Whether or not the node if a JSX element or fragment.
- */
-function isJSX(node) {
-  return node && ['JSXElement', 'JSXFragment'].indexOf(node.type) >= 0;
-}
-
-/**
- * Check if node is like `key={...}` as in `<Foo key={...} />`
- * @param {ASTNode} node
- * @returns {boolean}
- */
-function isJSXAttributeKey(node) {
-  return node.type === 'JSXAttribute' &&
-    node.name &&
-    node.name.type === 'JSXIdentifier' &&
-    node.name.name === 'key';
-}
-
-/**
- * Check if value has only whitespaces
- * @param {string} value
- * @returns {boolean}
- */
-function isWhiteSpaces(value) {
-  return typeof value === 'string' ? /^\s*$/.test(value) : false;
-}
-
-module.exports = {
-  isDOMComponent,
-  isFragment,
-  isJSX,
-  isJSXAttributeKey,
-  isWhiteSpaces
-};
diff --git a/node_modules/eslint-plugin-react/lib/util/linkComponents.js b/node_modules/eslint-plugin-react/lib/util/linkComponents.js
deleted file mode 100644
index 066b2ea..0000000
--- a/node_modules/eslint-plugin-react/lib/util/linkComponents.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * @fileoverview Utility functions for propWrapperFunctions setting
- */
-
-'use strict';
-
-/** TODO: type {(string | { name: string, linkAttribute: string })[]} */
-/** @type {any} */
-const DEFAULT_LINK_COMPONENTS = ['a'];
-const DEFAULT_LINK_ATTRIBUTE = 'href';
-
-function getLinkComponents(context) {
-  const settings = context.settings || {};
-  const linkComponents = /** @type {typeof DEFAULT_LINK_COMPONENTS} */ (
-    DEFAULT_LINK_COMPONENTS.concat(settings.linkComponents || [])
-  );
-  return new Map(linkComponents.map((value) => {
-    if (typeof value === 'string') {
-      return [value, DEFAULT_LINK_ATTRIBUTE];
-    }
-    return [value.name, value.linkAttribute];
-  }));
-}
-
-module.exports = {
-  getLinkComponents
-};
diff --git a/node_modules/eslint-plugin-react/lib/util/log.js b/node_modules/eslint-plugin-react/lib/util/log.js
deleted file mode 100644
index 9782b21..0000000
--- a/node_modules/eslint-plugin-react/lib/util/log.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-
-/**
- * Logs out a message if there is no format option set.
- * @param {String} message - Message to log.
- */
-function log(message) {
-  if (!/=-(f|-format)=/.test(process.argv.join('='))) {
-    // eslint-disable-next-line no-console
-    console.log(message);
-  }
-}
-
-module.exports = log;
diff --git a/node_modules/eslint-plugin-react/lib/util/makeNoMethodSetStateRule.js b/node_modules/eslint-plugin-react/lib/util/makeNoMethodSetStateRule.js
deleted file mode 100644
index 3a46b5e..0000000
--- a/node_modules/eslint-plugin-react/lib/util/makeNoMethodSetStateRule.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * @fileoverview Prevent usage of setState in lifecycle methods
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const docsUrl = require('./docsUrl');
-
-// ------------------------------------------------------------------------------
-// Rule Definition
-// ------------------------------------------------------------------------------
-
-function mapTitle(methodName) {
-  const map = {
-    componentDidMount: 'did-mount',
-    componentDidUpdate: 'did-update',
-    componentWillUpdate: 'will-update'
-  };
-  const title = map[methodName];
-  if (!title) {
-    throw Error(`No docsUrl for '${methodName}'`);
-  }
-  return `no-${title}-set-state`;
-}
-
-function makeNoMethodSetStateRule(methodName, shouldCheckUnsafeCb) {
-  return {
-    meta: {
-      docs: {
-        description: `Prevent usage of setState in ${methodName}`,
-        category: 'Best Practices',
-        recommended: false,
-        url: docsUrl(mapTitle(methodName))
-      },
-
-      schema: [{
-        enum: ['disallow-in-func']
-      }]
-    },
-
-    create(context) {
-      const mode = context.options[0] || 'allow-in-func';
-
-      function nameMatches(name) {
-        if (name === methodName) {
-          return true;
-        }
-
-        if (typeof shouldCheckUnsafeCb === 'function' && shouldCheckUnsafeCb(context)) {
-          return name === `UNSAFE_${methodName}`;
-        }
-
-        return false;
-      }
-
-      // --------------------------------------------------------------------------
-      // Public
-      // --------------------------------------------------------------------------
-
-      return {
-
-        CallExpression(node) {
-          const callee = node.callee;
-          if (
-            callee.type !== 'MemberExpression' ||
-            callee.object.type !== 'ThisExpression' ||
-            callee.property.name !== 'setState'
-          ) {
-            return;
-          }
-          const ancestors = context.getAncestors(callee).reverse();
-          let depth = 0;
-          ancestors.some((ancestor) => {
-            if (/Function(Expression|Declaration)$/.test(ancestor.type)) {
-              depth++;
-            }
-            if (
-              (ancestor.type !== 'Property' && ancestor.type !== 'MethodDefinition' && ancestor.type !== 'ClassProperty') ||
-              !nameMatches(ancestor.key.name) ||
-              (mode !== 'disallow-in-func' && depth > 1)
-            ) {
-              return false;
-            }
-            context.report({
-              node: callee,
-              message: `Do not use setState in ${ancestor.key.name}`
-            });
-            return true;
-          });
-        }
-      };
-    }
-  };
-}
-
-module.exports = makeNoMethodSetStateRule;
diff --git a/node_modules/eslint-plugin-react/lib/util/pragma.js b/node_modules/eslint-plugin-react/lib/util/pragma.js
deleted file mode 100644
index 4768284..0000000
--- a/node_modules/eslint-plugin-react/lib/util/pragma.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * @fileoverview Utility functions for React pragma configuration
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const JSX_ANNOTATION_REGEX = /^\*\s*@jsx\s+([^\s]+)/;
-// Does not check for reserved keywords or unicode characters
-const JS_IDENTIFIER_REGEX = /^[_$a-zA-Z][_$a-zA-Z0-9]*$/;
-
-
-function getCreateClassFromContext(context) {
-  let pragma = 'createReactClass';
-  // .eslintrc shared settings (http://eslint.org/docs/user-guide/configuring#adding-shared-settings)
-  if (context.settings.react && context.settings.react.createClass) {
-    pragma = context.settings.react.createClass;
-  }
-  if (!JS_IDENTIFIER_REGEX.test(pragma)) {
-    throw new Error(`createClass pragma ${pragma} is not a valid function name`);
-  }
-  return pragma;
-}
-
-function getFragmentFromContext(context) {
-  let pragma = 'Fragment';
-  // .eslintrc shared settings (http://eslint.org/docs/user-guide/configuring#adding-shared-settings)
-  if (context.settings.react && context.settings.react.fragment) {
-    pragma = context.settings.react.fragment;
-  }
-  if (!JS_IDENTIFIER_REGEX.test(pragma)) {
-    throw new Error(`Fragment pragma ${pragma} is not a valid identifier`);
-  }
-  return pragma;
-}
-
-function getFromContext(context) {
-  let pragma = 'React';
-
-  const sourceCode = context.getSourceCode();
-  const pragmaNode = sourceCode.getAllComments().find(node => JSX_ANNOTATION_REGEX.test(node.value));
-
-  if (pragmaNode) {
-    const matches = JSX_ANNOTATION_REGEX.exec(pragmaNode.value);
-    pragma = matches[1].split('.')[0];
-  // .eslintrc shared settings (http://eslint.org/docs/user-guide/configuring#adding-shared-settings)
-  } else if (context.settings.react && context.settings.react.pragma) {
-    pragma = context.settings.react.pragma;
-  }
-
-  if (!JS_IDENTIFIER_REGEX.test(pragma)) {
-    throw new Error(`React pragma ${pragma} is not a valid identifier`);
-  }
-  return pragma;
-}
-
-module.exports = {
-  getCreateClassFromContext,
-  getFragmentFromContext,
-  getFromContext
-};
diff --git a/node_modules/eslint-plugin-react/lib/util/propTypes.js b/node_modules/eslint-plugin-react/lib/util/propTypes.js
deleted file mode 100644
index 9c2b956..0000000
--- a/node_modules/eslint-plugin-react/lib/util/propTypes.js
+++ /dev/null
@@ -1,740 +0,0 @@
-/**
- * @fileoverview Common propTypes detection functionality.
- */
-
-'use strict';
-
-const annotations = require('./annotations');
-const propsUtil = require('./props');
-const variableUtil = require('./variable');
-const versionUtil = require('./version');
-const propWrapperUtil = require('./propWrapper');
-const getKeyValue = require('./ast').getKeyValue;
-
-/**
- * Checks if we are declaring a props as a generic type in a flow-annotated class.
- *
- * @param {ASTNode} node  the AST node being checked.
- * @returns {Boolean} True if the node is a class with generic prop types, false if not.
- */
-function isSuperTypeParameterPropsDeclaration(node) {
-  if (node && (node.type === 'ClassDeclaration' || node.type === 'ClassExpression')) {
-    if (node.superTypeParameters && node.superTypeParameters.params.length > 0) {
-      return true;
-    }
-  }
-  return false;
-}
-
-/**
- * Iterates through a properties node, like a customized forEach.
- * @param {Object} context Array of properties to iterate.
- * @param {Object[]} properties Array of properties to iterate.
- * @param {Function} fn Function to call on each property, receives property key
-    and property value. (key, value) => void
-  * @param {Function} [handleSpreadFn] Function to call on each ObjectTypeSpreadProperty, receives the
-    argument
- */
-function iterateProperties(context, properties, fn, handleSpreadFn) {
-  if (properties && properties.length && typeof fn === 'function') {
-    for (let i = 0, j = properties.length; i < j; i++) {
-      const node = properties[i];
-      const key = getKeyValue(context, node);
-
-      if (node.type === 'ObjectTypeSpreadProperty' && typeof handleSpreadFn === 'function') {
-        handleSpreadFn(node.argument);
-      }
-
-      const value = node.value;
-      fn(key, value, node);
-    }
-  }
-}
-
-/**
- * Checks if a node is inside a class body.
- *
- * @param {ASTNode} node  the AST node being checked.
- * @returns {Boolean} True if the node has a ClassBody ancestor, false if not.
- */
-function isInsideClassBody(node) {
-  let parent = node.parent;
-  while (parent) {
-    if (parent.type === 'ClassBody') {
-      return true;
-    }
-    parent = parent.parent;
-  }
-
-  return false;
-}
-
-module.exports = function propTypesInstructions(context, components, utils) {
-  // Used to track the type annotations in scope.
-  // Necessary because babel's scopes do not track type annotations.
-  let stack = null;
-
-  const classExpressions = [];
-  const defaults = {customValidators: []};
-  const configuration = Object.assign({}, defaults, context.options[0] || {});
-  const customValidators = configuration.customValidators;
-
-  /**
-   * Returns the full scope.
-   * @returns {Object} The whole scope.
-   */
-  function typeScope() {
-    return stack[stack.length - 1];
-  }
-
-  /**
-   * Gets a node from the scope.
-   * @param {string} key The name of the identifier to access.
-   * @returns {ASTNode} The ASTNode associated with the given identifier.
-   */
-  function getInTypeScope(key) {
-    return stack[stack.length - 1][key];
-  }
-
-  /**
-   * Sets the new value in the scope.
-   * @param {string} key The name of the identifier to access
-   * @param {ASTNode} value The new value for the identifier.
-   * @returns {ASTNode} The ASTNode associated with the given identifier.
-   */
-  function setInTypeScope(key, value) {
-    stack[stack.length - 1][key] = value;
-    return value;
-  }
-
-  /**
-   * Checks if prop should be validated by plugin-react-proptypes
-   * @param {String} validator Name of validator to check.
-   * @returns {Boolean} True if validator should be checked by custom validator.
-   */
-  function hasCustomValidator(validator) {
-    return customValidators.indexOf(validator) !== -1;
-  }
-
-  /* eslint-disable no-use-before-define */
-  /** @type {TypeDeclarationBuilders} */
-  const typeDeclarationBuilders = {
-    GenericTypeAnnotation(annotation, parentName, seen) {
-      if (getInTypeScope(annotation.id.name)) {
-        return buildTypeAnnotationDeclarationTypes(getInTypeScope(annotation.id.name), parentName, seen);
-      }
-      return {};
-    },
-
-    ObjectTypeAnnotation(annotation, parentName, seen) {
-      let containsUnresolvedObjectTypeSpread = false;
-      let containsSpread = false;
-      const containsIndexers = Boolean(annotation.indexers && annotation.indexers.length);
-      const shapeTypeDefinition = {
-        type: 'shape',
-        children: {}
-      };
-      iterateProperties(context, annotation.properties, (childKey, childValue, propNode) => {
-        const fullName = [parentName, childKey].join('.');
-        if (childKey || childValue) {
-          const types = buildTypeAnnotationDeclarationTypes(childValue, fullName, seen);
-          types.fullName = fullName;
-          types.name = childKey;
-          types.node = propNode;
-          types.isRequired = !childValue.optional;
-          shapeTypeDefinition.children[childKey] = types;
-        }
-      },
-      (spreadNode) => {
-        const key = getKeyValue(context, spreadNode);
-        const types = buildTypeAnnotationDeclarationTypes(spreadNode, key, seen);
-        if (!types.children) {
-          containsUnresolvedObjectTypeSpread = true;
-        } else {
-          Object.assign(shapeTypeDefinition, types.children);
-        }
-        containsSpread = true;
-      });
-
-      // Mark if this shape has spread or an indexer. We will know to consider all props from this shape as having propTypes,
-      // but still have the ability to detect unused children of this shape.
-      shapeTypeDefinition.containsUnresolvedSpread = containsUnresolvedObjectTypeSpread;
-      shapeTypeDefinition.containsIndexers = containsIndexers;
-      // Deprecated: containsSpread is not used anymore in the codebase, ensure to keep API backward compatibility
-      shapeTypeDefinition.containsSpread = containsSpread;
-
-      return shapeTypeDefinition;
-    },
-
-    UnionTypeAnnotation(annotation, parentName, seen) {
-      /** @type {UnionTypeDefinition} */
-      const unionTypeDefinition = {
-        type: 'union',
-        children: annotation.types.map(type => buildTypeAnnotationDeclarationTypes(type, parentName, seen))
-      };
-      if (unionTypeDefinition.children.length === 0) {
-        // no complex type found, simply accept everything
-        return {};
-      }
-      return unionTypeDefinition;
-    },
-
-    ArrayTypeAnnotation(annotation, parentName, seen) {
-      const fullName = [parentName, '*'].join('.');
-      const child = buildTypeAnnotationDeclarationTypes(annotation.elementType, fullName, seen);
-      child.fullName = fullName;
-      child.name = '__ANY_KEY__';
-      child.node = annotation;
-      return {
-        type: 'object',
-        children: {
-          __ANY_KEY__: child
-        }
-      };
-    }
-  };
-  /* eslint-enable no-use-before-define */
-
-  /**
-   * Resolve the type annotation for a given node.
-   * Flow annotations are sometimes wrapped in outer `TypeAnnotation`
-   * and `NullableTypeAnnotation` nodes which obscure the annotation we're
-   * interested in.
-   * This method also resolves type aliases where possible.
-   *
-   * @param {ASTNode} node The annotation or a node containing the type annotation.
-   * @returns {ASTNode} The resolved type annotation for the node.
-   */
-  function resolveTypeAnnotation(node) {
-    let annotation = (node.left && node.left.typeAnnotation) || node.typeAnnotation || node;
-    while (annotation && (annotation.type === 'TypeAnnotation' || annotation.type === 'NullableTypeAnnotation')) {
-      annotation = annotation.typeAnnotation;
-    }
-    if (annotation.type === 'GenericTypeAnnotation' && getInTypeScope(annotation.id.name)) {
-      return getInTypeScope(annotation.id.name);
-    }
-
-    return annotation;
-  }
-
-  /**
-   * Creates the representation of the React props type annotation for the component.
-   * The representation is used to verify nested used properties.
-   * @param {ASTNode} annotation Type annotation for the props class property.
-   * @param {String} parentName
-   * @param {Set<ASTNode>} [seen]
-   * @return {Object} The representation of the declaration, empty object means
-   *    the property is declared without the need for further analysis.
-   */
-  function buildTypeAnnotationDeclarationTypes(annotation, parentName, seen) {
-    if (typeof seen === 'undefined') {
-      // Keeps track of annotations we've already seen to
-      // prevent problems with recursive types.
-      seen = new Set();
-    }
-    if (seen.has(annotation)) {
-      // This must be a recursive type annotation, so just accept anything.
-      return {};
-    }
-    seen.add(annotation);
-
-    if (annotation.type in typeDeclarationBuilders) {
-      return typeDeclarationBuilders[annotation.type](annotation, parentName, seen);
-    }
-    return {};
-  }
-
-  /**
-   * Marks all props found inside ObjectTypeAnnotation as declared.
-   *
-   * Modifies the declaredProperties object
-   * @param {ASTNode} propTypes
-   * @param {Object} declaredPropTypes
-   * @returns {Boolean} True if propTypes should be ignored (e.g. when a type can't be resolved, when it is imported)
-   */
-  function declarePropTypesForObjectTypeAnnotation(propTypes, declaredPropTypes) {
-    let ignorePropsValidation = false;
-
-    iterateProperties(context, propTypes.properties, (key, value, propNode) => {
-      if (!value) {
-        ignorePropsValidation = ignorePropsValidation || propNode.type !== 'ObjectTypeSpreadProperty';
-        return;
-      }
-
-      const types = buildTypeAnnotationDeclarationTypes(value, key);
-      types.fullName = key;
-      types.name = key;
-      types.node = propNode;
-      types.isRequired = !propNode.optional;
-      declaredPropTypes[key] = types;
-    }, (spreadNode) => {
-      const key = getKeyValue(context, spreadNode);
-      const spreadAnnotation = getInTypeScope(key);
-      if (!spreadAnnotation) {
-        ignorePropsValidation = true;
-      } else {
-        const spreadIgnoreValidation = declarePropTypesForObjectTypeAnnotation(spreadAnnotation, declaredPropTypes);
-        ignorePropsValidation = ignorePropsValidation || spreadIgnoreValidation;
-      }
-    });
-
-    return ignorePropsValidation;
-  }
-
-  /**
-   * Marks all props found inside IntersectionTypeAnnotation as declared.
-   * Since InterSectionTypeAnnotations can be nested, this handles recursively.
-   *
-   * Modifies the declaredPropTypes object
-   * @param {ASTNode} propTypes
-   * @param {Object} declaredPropTypes
-   * @returns {Boolean} True if propTypes should be ignored (e.g. when a type can't be resolved, when it is imported)
-   */
-  function declarePropTypesForIntersectionTypeAnnotation(propTypes, declaredPropTypes) {
-    return propTypes.types.some((annotation) => {
-      if (annotation.type === 'ObjectTypeAnnotation') {
-        return declarePropTypesForObjectTypeAnnotation(annotation, declaredPropTypes);
-      }
-
-      if (annotation.type === 'UnionTypeAnnotation') {
-        return true;
-      }
-
-      // Type can't be resolved
-      if (!annotation.id) {
-        return true;
-      }
-
-      const typeNode = getInTypeScope(annotation.id.name);
-
-      if (!typeNode) {
-        return true;
-      }
-      if (typeNode.type === 'IntersectionTypeAnnotation') {
-        return declarePropTypesForIntersectionTypeAnnotation(typeNode, declaredPropTypes);
-      }
-
-      return declarePropTypesForObjectTypeAnnotation(typeNode, declaredPropTypes);
-    });
-  }
-
-  /**
-   * Creates the representation of the React propTypes for the component.
-   * The representation is used to verify nested used properties.
-   * @param {ASTNode} value Node of the PropTypes for the desired property
-   * @param {string} parentName
-   * @return {Object} The representation of the declaration, empty object means
-   *    the property is declared without the need for further analysis.
-   */
-  function buildReactDeclarationTypes(value, parentName) {
-    if (
-      value &&
-      value.callee &&
-      value.callee.object &&
-      hasCustomValidator(value.callee.object.name)
-    ) {
-      return {};
-    }
-
-    if (
-      value &&
-      value.type === 'MemberExpression' &&
-      value.property &&
-      value.property.name &&
-      value.property.name === 'isRequired'
-    ) {
-      value = value.object;
-    }
-
-    // Verify PropTypes that are functions
-    if (
-      value &&
-      value.type === 'CallExpression' &&
-      value.callee &&
-      value.callee.property &&
-      value.callee.property.name &&
-      value.arguments &&
-      value.arguments.length > 0
-    ) {
-      const callName = value.callee.property.name;
-      const argument = value.arguments[0];
-      switch (callName) {
-        case 'shape': {
-          if (argument.type !== 'ObjectExpression') {
-            // Invalid proptype or cannot analyse statically
-            return {};
-          }
-          const shapeTypeDefinition = {
-            type: 'shape',
-            children: {}
-          };
-          iterateProperties(context, argument.properties, (childKey, childValue, propNode) => {
-            if (childValue) { // skip spread propTypes
-              const fullName = [parentName, childKey].join('.');
-              const types = buildReactDeclarationTypes(childValue, fullName);
-              types.fullName = fullName;
-              types.name = childKey;
-              types.node = propNode;
-              shapeTypeDefinition.children[childKey] = types;
-            }
-          });
-          return shapeTypeDefinition;
-        }
-        case 'arrayOf':
-        case 'objectOf': {
-          const fullName = [parentName, '*'].join('.');
-          const child = buildReactDeclarationTypes(argument, fullName);
-          child.fullName = fullName;
-          child.name = '__ANY_KEY__';
-          child.node = argument;
-          return {
-            type: 'object',
-            children: {
-              __ANY_KEY__: child
-            }
-          };
-        }
-        case 'oneOfType': {
-          if (
-            !argument.elements ||
-            !argument.elements.length
-          ) {
-            // Invalid proptype or cannot analyse statically
-            return {};
-          }
-
-          /** @type {UnionTypeDefinition} */
-          const unionTypeDefinition = {
-            type: 'union',
-            children: argument.elements.map(element => buildReactDeclarationTypes(element, parentName))
-          };
-          if (unionTypeDefinition.children.length === 0) {
-            // no complex type found, simply accept everything
-            return {};
-          }
-          return unionTypeDefinition;
-        }
-        default:
-          return {};
-      }
-    }
-    // Unknown property or accepts everything (any, object, ...)
-    return {};
-  }
-
-
-  /**
-   * Mark a prop type as declared
-   * @param {ASTNode} node The AST node being checked.
-   * @param {ASTNode} propTypes The AST node containing the proptypes
-   */
-  function markPropTypesAsDeclared(node, propTypes) {
-    let componentNode = node;
-    while (componentNode && !components.get(componentNode)) {
-      componentNode = componentNode.parent;
-    }
-    const component = components.get(componentNode);
-    const declaredPropTypes = component && component.declaredPropTypes || {};
-    let ignorePropsValidation = component && component.ignorePropsValidation || false;
-    switch (propTypes && propTypes.type) {
-      case 'ObjectTypeAnnotation':
-        ignorePropsValidation = declarePropTypesForObjectTypeAnnotation(propTypes, declaredPropTypes);
-        break;
-      case 'ObjectExpression':
-        iterateProperties(context, propTypes.properties, (key, value, propNode) => {
-          if (!value) {
-            ignorePropsValidation = true;
-            return;
-          }
-          const types = buildReactDeclarationTypes(value, key);
-          types.fullName = key;
-          types.name = key;
-          types.node = propNode;
-          types.isRequired = propsUtil.isRequiredPropType(value);
-          declaredPropTypes[key] = types;
-        });
-        break;
-      case 'MemberExpression': {
-        let curDeclaredPropTypes = declaredPropTypes;
-        // Walk the list of properties, until we reach the assignment
-        // ie: ClassX.propTypes.a.b.c = ...
-        while (
-          propTypes &&
-          propTypes.parent &&
-          propTypes.parent.type !== 'AssignmentExpression' &&
-          propTypes.property &&
-          curDeclaredPropTypes
-        ) {
-          const propName = propTypes.property.name;
-          if (propName in curDeclaredPropTypes) {
-            curDeclaredPropTypes = curDeclaredPropTypes[propName].children;
-            propTypes = propTypes.parent;
-          } else {
-            // This will crash at runtime because we haven't seen this key before
-            // stop this and do not declare it
-            propTypes = null;
-          }
-        }
-        if (propTypes && propTypes.parent && propTypes.property) {
-          if (!(propTypes === propTypes.parent.left && propTypes.parent.left.object)) {
-            ignorePropsValidation = true;
-            break;
-          }
-          const parentProp = context.getSource(propTypes.parent.left.object).replace(/^.*\.propTypes\./, '');
-          const types = buildReactDeclarationTypes(
-            propTypes.parent.right,
-            parentProp
-          );
-
-          types.name = propTypes.property.name;
-          types.fullName = [parentProp, propTypes.property.name].join('.');
-          types.node = propTypes.parent;
-          types.isRequired = propsUtil.isRequiredPropType(propTypes.parent.right);
-          curDeclaredPropTypes[propTypes.property.name] = types;
-        } else {
-          let isUsedInPropTypes = false;
-          let n = propTypes;
-          while (n) {
-            if (n.type === 'AssignmentExpression' && propsUtil.isPropTypesDeclaration(n.left) ||
-              (n.type === 'ClassProperty' || n.type === 'Property') && propsUtil.isPropTypesDeclaration(n)) {
-              // Found a propType used inside of another propType. This is not considered usage, we'll still validate
-              // this component.
-              isUsedInPropTypes = true;
-              break;
-            }
-            n = n.parent;
-          }
-          if (!isUsedInPropTypes) {
-            ignorePropsValidation = true;
-          }
-        }
-        break;
-      }
-      case 'Identifier': {
-        const variablesInScope = variableUtil.variablesInScope(context);
-        const firstMatchingVariable = variablesInScope
-          .find(variableInScope => variableInScope.name === propTypes.name);
-        if (firstMatchingVariable) {
-          const defInScope = firstMatchingVariable.defs[firstMatchingVariable.defs.length - 1];
-          markPropTypesAsDeclared(node, defInScope.node && defInScope.node.init);
-          return;
-        }
-        ignorePropsValidation = true;
-        break;
-      }
-      case 'CallExpression': {
-        if (
-          propWrapperUtil.isPropWrapperFunction(
-            context,
-            context.getSourceCode().getText(propTypes.callee)
-          ) &&
-          propTypes.arguments && propTypes.arguments[0]
-        ) {
-          markPropTypesAsDeclared(node, propTypes.arguments[0]);
-          return;
-        }
-        break;
-      }
-      case 'IntersectionTypeAnnotation':
-        ignorePropsValidation = declarePropTypesForIntersectionTypeAnnotation(propTypes, declaredPropTypes);
-        break;
-      case 'GenericTypeAnnotation':
-        if (propTypes.id.name === '$ReadOnly') {
-          ignorePropsValidation = declarePropTypesForObjectTypeAnnotation(
-            propTypes.typeParameters.params[0],
-            declaredPropTypes
-          );
-        } else {
-          ignorePropsValidation = true;
-        }
-        break;
-      case null:
-        break;
-      default:
-        ignorePropsValidation = true;
-        break;
-    }
-
-    components.set(node, {
-      declaredPropTypes,
-      ignorePropsValidation
-    });
-  }
-
-  /**
-   * @param {ASTNode} node We expect either an ArrowFunctionExpression,
-   *   FunctionDeclaration, or FunctionExpression
-   */
-  function markAnnotatedFunctionArgumentsAsDeclared(node) {
-    if (!node.params || !node.params.length || !annotations.isAnnotatedFunctionPropsDeclaration(node, context)) {
-      return;
-    }
-
-    if (isInsideClassBody(node)) {
-      return;
-    }
-
-    const param = node.params[0];
-    if (param.typeAnnotation && param.typeAnnotation.typeAnnotation && param.typeAnnotation.typeAnnotation.type === 'UnionTypeAnnotation') {
-      param.typeAnnotation.typeAnnotation.types.forEach((annotation) => {
-        if (annotation.type === 'GenericTypeAnnotation') {
-          markPropTypesAsDeclared(node, resolveTypeAnnotation(annotation));
-        } else {
-          markPropTypesAsDeclared(node, annotation);
-        }
-      });
-    } else {
-      markPropTypesAsDeclared(node, resolveTypeAnnotation(param));
-    }
-  }
-
-  /**
-   * Resolve the type annotation for a given class declaration node with superTypeParameters.
-   *
-   * @param {ASTNode} node The annotation or a node containing the type annotation.
-   * @returns {ASTNode} The resolved type annotation for the node.
-   */
-  function resolveSuperParameterPropsType(node) {
-    let propsParameterPosition;
-    try {
-      // Flow <=0.52 had 3 required TypedParameters of which the second one is the Props.
-      // Flow >=0.53 has 2 optional TypedParameters of which the first one is the Props.
-      propsParameterPosition = versionUtil.testFlowVersion(context, '0.53.0') ? 0 : 1;
-    } catch (e) {
-      // In case there is no flow version defined, we can safely assume that when there are 3 Props we are dealing with version <= 0.52
-      propsParameterPosition = node.superTypeParameters.params.length <= 2 ? 0 : 1;
-    }
-
-    let annotation = node.superTypeParameters.params[propsParameterPosition];
-    while (annotation && (annotation.type === 'TypeAnnotation' || annotation.type === 'NullableTypeAnnotation')) {
-      annotation = annotation.typeAnnotation;
-    }
-
-    if (annotation && annotation.type === 'GenericTypeAnnotation' && getInTypeScope(annotation.id.name)) {
-      return getInTypeScope(annotation.id.name);
-    }
-    return annotation;
-  }
-
-  /**
-   * Checks if we are declaring a `props` class property with a flow type annotation.
-   * @param {ASTNode} node The AST node being checked.
-   * @returns {Boolean} True if the node is a type annotated props declaration, false if not.
-   */
-  function isAnnotatedClassPropsDeclaration(node) {
-    if (node && node.type === 'ClassProperty') {
-      const tokens = context.getFirstTokens(node, 2);
-      if (
-        node.typeAnnotation && (
-          tokens[0].value === 'props' ||
-          (tokens[1] && tokens[1].value === 'props')
-        )
-      ) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  return {
-    ClassExpression(node) {
-      // TypeParameterDeclaration need to be added to typeScope in order to handle ClassExpressions.
-      // This visitor is executed before TypeParameterDeclaration are scoped, therefore we postpone
-      // processing class expressions until when the program exists.
-      classExpressions.push(node);
-    },
-
-    ClassDeclaration(node) {
-      if (isSuperTypeParameterPropsDeclaration(node)) {
-        markPropTypesAsDeclared(node, resolveSuperParameterPropsType(node));
-      }
-    },
-
-    ClassProperty(node) {
-      if (isAnnotatedClassPropsDeclaration(node)) {
-        markPropTypesAsDeclared(node, resolveTypeAnnotation(node));
-      } else if (propsUtil.isPropTypesDeclaration(node)) {
-        markPropTypesAsDeclared(node, node.value);
-      }
-    },
-
-    ObjectExpression(node) {
-      // Search for the proptypes declaration
-      node.properties.forEach((property) => {
-        if (!propsUtil.isPropTypesDeclaration(property)) {
-          return;
-        }
-        markPropTypesAsDeclared(node, property.value);
-      });
-    },
-
-    FunctionExpression(node) {
-      if (node.parent.type !== 'MethodDefinition') {
-        markAnnotatedFunctionArgumentsAsDeclared(node);
-      }
-    },
-
-    FunctionDeclaration: markAnnotatedFunctionArgumentsAsDeclared,
-
-    ArrowFunctionExpression: markAnnotatedFunctionArgumentsAsDeclared,
-
-    MemberExpression(node) {
-      if (propsUtil.isPropTypesDeclaration(node)) {
-        const component = utils.getRelatedComponent(node);
-        if (!component) {
-          return;
-        }
-        markPropTypesAsDeclared(component.node, node.parent.right || node.parent);
-      }
-    },
-
-    MethodDefinition(node) {
-      if (!node.static || node.kind !== 'get' || !propsUtil.isPropTypesDeclaration(node)) {
-        return;
-      }
-
-      let i = node.value.body.body.length - 1;
-      for (; i >= 0; i--) {
-        if (node.value.body.body[i].type === 'ReturnStatement') {
-          break;
-        }
-      }
-
-      if (i >= 0) {
-        markPropTypesAsDeclared(node, node.value.body.body[i].argument);
-      }
-    },
-
-    TypeAlias(node) {
-      setInTypeScope(node.id.name, node.right);
-    },
-
-    TypeParameterDeclaration(node) {
-      const identifier = node.params[0];
-
-      if (identifier.typeAnnotation) {
-        setInTypeScope(identifier.name, identifier.typeAnnotation.typeAnnotation);
-      }
-    },
-
-    Program() {
-      stack = [{}];
-    },
-
-    BlockStatement() {
-      stack.push(Object.create(typeScope()));
-    },
-
-    'BlockStatement:exit'() {
-      stack.pop();
-    },
-
-    'Program:exit'() {
-      classExpressions.forEach((node) => {
-        if (isSuperTypeParameterPropsDeclaration(node)) {
-          markPropTypesAsDeclared(node, resolveSuperParameterPropsType(node));
-        }
-      });
-    }
-  };
-};
diff --git a/node_modules/eslint-plugin-react/lib/util/propTypesSort.js b/node_modules/eslint-plugin-react/lib/util/propTypesSort.js
deleted file mode 100644
index badcf79..0000000
--- a/node_modules/eslint-plugin-react/lib/util/propTypesSort.js
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- * @fileoverview Common propTypes sorting functionality.
- */
-
-'use strict';
-
-const astUtil = require('./ast');
-
-/**
- * Returns the value name of a node.
- *
- * @param {ASTNode} node the node to check.
- * @returns {String} The name of the node.
- */
-function getValueName(node) {
-  return node.type === 'Property' && node.value.property && node.value.property.name;
-}
-
-/**
- * Checks if the prop is required or not.
- *
- * @param {ASTNode} node the prop to check.
- * @returns {Boolean} true if the prop is required.
- */
-function isRequiredProp(node) {
-  return getValueName(node) === 'isRequired';
-}
-
-/**
- * Checks if the proptype is a callback by checking if it starts with 'on'.
- *
- * @param {String} propName the name of the proptype to check.
- * @returns {Boolean} true if the proptype is a callback.
- */
-function isCallbackPropName(propName) {
-  return /^on[A-Z]/.test(propName);
-}
-
-/**
- * Checks if the prop is PropTypes.shape.
- *
- * @param {ASTNode} node the prop to check.
- * @returns {Boolean} true if the prop is PropTypes.shape.
- */
-function isShapeProp(node) {
-  return Boolean(
-    node && node.callee && node.callee.property && node.callee.property.name === 'shape'
-  );
-}
-
-/**
- * Returns the properties of a PropTypes.shape.
- *
- * @param {ASTNode} node the prop to check.
- * @returns {Array} the properties of the PropTypes.shape node.
- */
-function getShapeProperties(node) {
-  return node.arguments && node.arguments[0] && node.arguments[0].properties;
-}
-
-/**
- * Compares two elements.
- *
- * @param {ASTNode} a the first element to compare.
- * @param {ASTNode} b the second element to compare.
- * @param {Context} context The context of the two nodes.
- * @param {Boolean=} ignoreCase whether or not to ignore case when comparing the two elements.
- * @param {Boolean=} requiredFirst whether or not to sort required elements first.
- * @param {Boolean=} callbacksLast whether or not to sort callbacks after everyting else.
- * @returns {Number} the sort order of the two elements.
- */
-function sorter(a, b, context, ignoreCase, requiredFirst, callbacksLast) {
-  const aKey = String(astUtil.getKeyValue(context, a));
-  const bKey = String(astUtil.getKeyValue(context, b));
-
-  if (requiredFirst) {
-    if (isRequiredProp(a) && !isRequiredProp(b)) {
-      return -1;
-    }
-    if (!isRequiredProp(a) && isRequiredProp(b)) {
-      return 1;
-    }
-  }
-
-  if (callbacksLast) {
-    if (isCallbackPropName(aKey) && !isCallbackPropName(bKey)) {
-      return 1;
-    }
-    if (!isCallbackPropName(aKey) && isCallbackPropName(bKey)) {
-      return -1;
-    }
-  }
-
-  if (ignoreCase) {
-    return aKey.localeCompare(bKey);
-  }
-
-  if (aKey < bKey) {
-    return -1;
-  }
-  if (aKey > bKey) {
-    return 1;
-  }
-  return 0;
-}
-
-/**
- * Fixes sort order of prop types.
- *
- * @param {Fixer} fixer the first element to compare.
- * @param {Object} context the second element to compare.
- * @param {Array} declarations The context of the two nodes.
- * @param {Boolean=} ignoreCase whether or not to ignore case when comparing the two elements.
- * @param {Boolean=} requiredFirst whether or not to sort required elements first.
- * @param {Boolean=} callbacksLast whether or not to sort callbacks after everyting else.
- * @param {Boolean=} sortShapeProp whether or not to sort propTypes defined in PropTypes.shape.
- * @returns {Object|*|{range, text}} the sort order of the two elements.
- */
-function fixPropTypesSort(fixer, context, declarations, ignoreCase, requiredFirst, callbacksLast, sortShapeProp) {
-  function sortInSource(allNodes, source) {
-    const originalSource = source;
-    const nodeGroups = allNodes.reduce((acc, curr) => {
-      if (curr.type === 'ExperimentalSpreadProperty' || curr.type === 'SpreadElement') {
-        acc.push([]);
-      } else {
-        acc[acc.length - 1].push(curr);
-      }
-      return acc;
-    }, [[]]);
-
-    nodeGroups.forEach((nodes) => {
-      const sortedAttributes = nodes
-        .slice()
-        .sort((a, b) => sorter(a, b, context, ignoreCase, requiredFirst, callbacksLast));
-
-      source = nodes.reduceRight((acc, attr, index) => {
-        const sortedAttr = sortedAttributes[index];
-        let sortedAttrText = context.getSourceCode().getText(sortedAttr);
-        if (sortShapeProp && isShapeProp(sortedAttr.value)) {
-          const shape = getShapeProperties(sortedAttr.value);
-          if (shape) {
-            const attrSource = sortInSource(
-              shape,
-              originalSource
-            );
-            sortedAttrText = attrSource.slice(sortedAttr.range[0], sortedAttr.range[1]);
-          }
-        }
-        return `${acc.slice(0, attr.range[0])}${sortedAttrText}${acc.slice(attr.range[1])}`;
-      }, source);
-    });
-    return source;
-  }
-
-  const source = sortInSource(declarations, context.getSourceCode().getText());
-
-  const rangeStart = declarations[0].range[0];
-  const rangeEnd = declarations[declarations.length - 1].range[1];
-  return fixer.replaceTextRange([rangeStart, rangeEnd], source.slice(rangeStart, rangeEnd));
-}
-
-module.exports = {
-  fixPropTypesSort
-};
diff --git a/node_modules/eslint-plugin-react/lib/util/propWrapper.js b/node_modules/eslint-plugin-react/lib/util/propWrapper.js
deleted file mode 100644
index 7202b13..0000000
--- a/node_modules/eslint-plugin-react/lib/util/propWrapper.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * @fileoverview Utility functions for propWrapperFunctions setting
- */
-
-'use strict';
-
-function getPropWrapperFunctions(context) {
-  return new Set(context.settings.propWrapperFunctions || []);
-}
-
-function isPropWrapperFunction(context, name) {
-  if (typeof name !== 'string') {
-    return false;
-  }
-  const propWrapperFunctions = getPropWrapperFunctions(context);
-  const splitName = name.split('.');
-  return Array.from(propWrapperFunctions).some((func) => {
-    if (splitName.length === 2 && func.object === splitName[0] && func.property === splitName[1]) {
-      return true;
-    }
-    return name === func || func.property === name;
-  });
-}
-
-module.exports = {
-  getPropWrapperFunctions,
-  isPropWrapperFunction
-};
diff --git a/node_modules/eslint-plugin-react/lib/util/props.js b/node_modules/eslint-plugin-react/lib/util/props.js
deleted file mode 100644
index 1177200..0000000
--- a/node_modules/eslint-plugin-react/lib/util/props.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * @fileoverview Utility functions for props
- */
-
-'use strict';
-
-const astUtil = require('./ast');
-
-/**
- * Checks if the Identifier node passed in looks like a propTypes declaration.
- * @param {ASTNode} node The node to check. Must be an Identifier node.
- * @returns {Boolean} `true` if the node is a propTypes declaration, `false` if not
- */
-function isPropTypesDeclaration(node) {
-  if (node && node.type === 'ClassProperty') {
-    // Flow support
-    if (node.typeAnnotation && node.key.name === 'props') {
-      return true;
-    }
-  }
-  return astUtil.getPropertyName(node) === 'propTypes';
-}
-
-/**
- * Checks if the node passed in looks like a contextTypes declaration.
- * @param {ASTNode} node The node to check.
- * @returns {Boolean} `true` if the node is a contextTypes declaration, `false` if not
- */
-function isContextTypesDeclaration(node) {
-  if (node && node.type === 'ClassProperty') {
-    // Flow support
-    if (node.typeAnnotation && node.key.name === 'context') {
-      return true;
-    }
-  }
-  return astUtil.getPropertyName(node) === 'contextTypes';
-}
-
-/**
- * Checks if the node passed in looks like a contextType declaration.
- * @param {ASTNode} node The node to check.
- * @returns {Boolean} `true` if the node is a contextType declaration, `false` if not
- */
-function isContextTypeDeclaration(node) {
-  return astUtil.getPropertyName(node) === 'contextType';
-}
-
-/**
- * Checks if the node passed in looks like a childContextTypes declaration.
- * @param {ASTNode} node The node to check.
- * @returns {Boolean} `true` if the node is a childContextTypes declaration, `false` if not
- */
-function isChildContextTypesDeclaration(node) {
-  return astUtil.getPropertyName(node) === 'childContextTypes';
-}
-
-/**
- * Checks if the Identifier node passed in looks like a defaultProps declaration.
- * @param {ASTNode} node The node to check. Must be an Identifier node.
- * @returns {Boolean} `true` if the node is a defaultProps declaration, `false` if not
- */
-function isDefaultPropsDeclaration(node) {
-  const propName = astUtil.getPropertyName(node);
-  return (propName === 'defaultProps' || propName === 'getDefaultProps');
-}
-
-/**
- * Checks if we are declaring a display name
- * @param {ASTNode} node The AST node being checked.
- * @returns {Boolean} True if we are declaring a display name, false if not.
- */
-function isDisplayNameDeclaration(node) {
-  switch (node.type) {
-    case 'ClassProperty':
-      return node.key && node.key.name === 'displayName';
-    case 'Identifier':
-      return node.name === 'displayName';
-    case 'Literal':
-      return node.value === 'displayName';
-    default:
-      return false;
-  }
-}
-
-/**
- * Checks if the PropTypes MemberExpression node passed in declares a required propType.
- * @param {ASTNode} propTypeExpression node to check. Must be a `PropTypes` MemberExpression.
- * @returns {Boolean} `true` if this PropType is required, `false` if not.
- */
-function isRequiredPropType(propTypeExpression) {
-  return propTypeExpression.type === 'MemberExpression' && propTypeExpression.property.name === 'isRequired';
-}
-
-module.exports = {
-  isPropTypesDeclaration,
-  isContextTypesDeclaration,
-  isContextTypeDeclaration,
-  isChildContextTypesDeclaration,
-  isDefaultPropsDeclaration,
-  isDisplayNameDeclaration,
-  isRequiredPropType
-};
diff --git a/node_modules/eslint-plugin-react/lib/util/usedPropTypes.js b/node_modules/eslint-plugin-react/lib/util/usedPropTypes.js
deleted file mode 100755
index f1ac146..0000000
--- a/node_modules/eslint-plugin-react/lib/util/usedPropTypes.js
+++ /dev/null
@@ -1,552 +0,0 @@
-/**
- * @fileoverview Common used propTypes detection functionality.
- */
-
-'use strict';
-
-const astUtil = require('./ast');
-const versionUtil = require('./version');
-const ast = require('./ast');
-
-// ------------------------------------------------------------------------------
-// Constants
-// ------------------------------------------------------------------------------
-
-const LIFE_CYCLE_METHODS = ['componentWillReceiveProps', 'shouldComponentUpdate', 'componentWillUpdate', 'componentDidUpdate'];
-const ASYNC_SAFE_LIFE_CYCLE_METHODS = ['getDerivedStateFromProps', 'getSnapshotBeforeUpdate', 'UNSAFE_componentWillReceiveProps', 'UNSAFE_componentWillUpdate'];
-
-function createPropVariables() {
-  /** @type {Map<string, string[]>} Maps the variable to its definition. `props.a.b` is stored as `['a', 'b']` */
-  let propVariables = new Map();
-  let hasBeenWritten = false;
-  const stack = [{propVariables, hasBeenWritten}];
-  return {
-    pushScope() {
-      // popVariables is not copied until first write.
-      stack.push({propVariables, hasBeenWritten: false});
-    },
-    popScope() {
-      stack.pop();
-      propVariables = stack[stack.length - 1].propVariables;
-      hasBeenWritten = stack[stack.length - 1].hasBeenWritten;
-    },
-    /**
-     * Add a variable name to the current scope
-     * @param {string} name
-     * @param {string[]} allNames Example: `props.a.b` should be formatted as `['a', 'b']`
-     * @returns {Map<string, string[]>}
-     */
-    set(name, allNames) {
-      if (!hasBeenWritten) {
-        // copy on write
-        propVariables = new Map(propVariables);
-        Object.assign(stack[stack.length - 1], {propVariables, hasBeenWritten: true});
-        stack[stack.length - 1].hasBeenWritten = true;
-      }
-      return propVariables.set(name, allNames);
-    },
-    /**
-     * Get the definition of a variable.
-     * @param {string} name
-     * @returns {string[]} Example: `props.a.b` is represented by `['a', 'b']`
-     */
-    get(name) {
-      return propVariables.get(name);
-    }
-  };
-}
-
-/**
- * Checks if the string is one of `props`, `nextProps`, or `prevProps`
- * @param {string} name The AST node being checked.
- * @returns {Boolean} True if the prop name matches
- */
-function isCommonVariableNameForProps(name) {
-  return name === 'props' || name === 'nextProps' || name === 'prevProps';
-}
-
-/**
- * Checks if the component must be validated
- * @param {Object} component The component to process
- * @returns {Boolean} True if the component must be validated, false if not.
- */
-function mustBeValidated(component) {
-  return !!(component && !component.ignorePropsValidation);
-}
-
-/**
- * Check if we are in a lifecycle method
- * @param {object} context
- * @param {boolean} checkAsyncSafeLifeCycles
- * @return {boolean} true if we are in a class constructor, false if not
- */
-function inLifeCycleMethod(context, checkAsyncSafeLifeCycles) {
-  let scope = context.getScope();
-  while (scope) {
-    if (scope.block && scope.block.parent && scope.block.parent.key) {
-      const name = scope.block.parent.key.name;
-
-      if (LIFE_CYCLE_METHODS.indexOf(name) >= 0) {
-        return true;
-      }
-      if (checkAsyncSafeLifeCycles && ASYNC_SAFE_LIFE_CYCLE_METHODS.indexOf(name) >= 0) {
-        return true;
-      }
-    }
-    scope = scope.upper;
-  }
-  return false;
-}
-
-/**
- * Returns true if the given node is a React Component lifecycle method
- * @param {ASTNode} node The AST node being checked.
- * @param {boolean} checkAsyncSafeLifeCycles
- * @return {Boolean} True if the node is a lifecycle method
- */
-function isNodeALifeCycleMethod(node, checkAsyncSafeLifeCycles) {
-  const nodeKeyName = (node.key || /** @type {ASTNode} */ ({})).name;
-
-  if (node.kind === 'constructor') {
-    return true;
-  }
-  if (LIFE_CYCLE_METHODS.indexOf(nodeKeyName) >= 0) {
-    return true;
-  }
-  if (checkAsyncSafeLifeCycles && ASYNC_SAFE_LIFE_CYCLE_METHODS.indexOf(nodeKeyName) >= 0) {
-    return true;
-  }
-
-  return false;
-}
-
-/**
- * Returns true if the given node is inside a React Component lifecycle
- * method.
- * @param {ASTNode} node The AST node being checked.
- * @param {boolean} checkAsyncSafeLifeCycles
- * @return {Boolean} True if the node is inside a lifecycle method
- */
-function isInLifeCycleMethod(node, checkAsyncSafeLifeCycles) {
-  if ((node.type === 'MethodDefinition' || node.type === 'Property') && isNodeALifeCycleMethod(node, checkAsyncSafeLifeCycles)) {
-    return true;
-  }
-
-  if (node.parent) {
-    return isInLifeCycleMethod(node.parent, checkAsyncSafeLifeCycles);
-  }
-
-  return false;
-}
-
-/**
- * Check if a function node is a setState updater
- * @param {ASTNode} node a function node
- * @return {boolean}
- */
-function isSetStateUpdater(node) {
-  const unwrappedParentCalleeNode = node.parent.type === 'CallExpression' &&
-    ast.unwrapTSAsExpression(node.parent.callee);
-
-  return unwrappedParentCalleeNode &&
-    unwrappedParentCalleeNode.property &&
-    unwrappedParentCalleeNode.property.name === 'setState' &&
-    // Make sure we are in the updater not the callback
-    node.parent.arguments[0] === node;
-}
-
-function isPropArgumentInSetStateUpdater(context, name) {
-  if (typeof name !== 'string') {
-    return;
-  }
-  let scope = context.getScope();
-  while (scope) {
-    const unwrappedParentCalleeNode =
-      scope.block && scope.block.parent &&
-      scope.block.parent.type === 'CallExpression' &&
-      ast.unwrapTSAsExpression(scope.block.parent.callee);
-    if (
-      unwrappedParentCalleeNode &&
-      unwrappedParentCalleeNode.property &&
-      unwrappedParentCalleeNode.property.name === 'setState' &&
-      // Make sure we are in the updater not the callback
-      scope.block.parent.arguments[0].start === scope.block.start &&
-      scope.block.parent.arguments[0].params &&
-      scope.block.parent.arguments[0].params.length > 1
-    ) {
-      return scope.block.parent.arguments[0].params[1].name === name;
-    }
-    scope = scope.upper;
-  }
-  return false;
-}
-
-function isInClassComponent(utils) {
-  return utils.getParentES6Component() || utils.getParentES5Component();
-}
-
-/**
- * Checks if the node is `this.props`
- * @param {ASTNode|undefined} node
- * @returns {boolean}
- */
-function isThisDotProps(node) {
-  return !!node &&
-    node.type === 'MemberExpression' &&
-    ast.unwrapTSAsExpression(node.object).type === 'ThisExpression' &&
-    node.property.name === 'props';
-}
-
-/**
- * Checks if the prop has spread operator.
- * @param {object} context
- * @param {ASTNode} node The AST node being marked.
- * @returns {Boolean} True if the prop has spread operator, false if not.
- */
-function hasSpreadOperator(context, node) {
-  const tokens = context.getSourceCode().getTokens(node);
-  return tokens.length && tokens[0].value === '...';
-}
-
-/**
- * Retrieve the name of a property node
- * @param {ASTNode} node The AST node with the property.
- * @return {string|undefined} the name of the property or undefined if not found
- */
-function getPropertyName(node) {
-  const property = node.property;
-  if (property) {
-    switch (property.type) {
-      case 'Identifier':
-        if (node.computed) {
-          return '__COMPUTED_PROP__';
-        }
-        return property.name;
-      case 'MemberExpression':
-        return;
-      case 'Literal':
-        // Accept computed properties that are literal strings
-        if (typeof property.value === 'string') {
-          return property.value;
-        }
-        // falls through
-      default:
-        if (node.computed) {
-          return '__COMPUTED_PROP__';
-        }
-        break;
-    }
-  }
-}
-
-/**
- * Checks if the node is a propTypes usage of the form `this.props.*`, `props.*`, `prevProps.*`, or `nextProps.*`.
- * @param {ASTNode} node
- * @param {Context} context
- * @param {Object} utils
- * @param {boolean} checkAsyncSafeLifeCycles
- * @returns {boolean}
- */
-function isPropTypesUsageByMemberExpression(node, context, utils, checkAsyncSafeLifeCycles) {
-  const unwrappedObjectNode = ast.unwrapTSAsExpression(node.object);
-
-  if (isInClassComponent(utils)) {
-    // this.props.*
-    if (isThisDotProps(unwrappedObjectNode)) {
-      return true;
-    }
-    // props.* or prevProps.* or nextProps.*
-    if (
-      isCommonVariableNameForProps(unwrappedObjectNode.name) &&
-      (inLifeCycleMethod(context, checkAsyncSafeLifeCycles) || utils.inConstructor())
-    ) {
-      return true;
-    }
-    // this.setState((_, props) => props.*))
-    if (isPropArgumentInSetStateUpdater(context, unwrappedObjectNode.name)) {
-      return true;
-    }
-    return false;
-  }
-  // props.* in function component
-  return unwrappedObjectNode.name === 'props' && !ast.isAssignmentLHS(node);
-}
-
-module.exports = function usedPropTypesInstructions(context, components, utils) {
-  const checkAsyncSafeLifeCycles = versionUtil.testReactVersion(context, '16.3.0');
-
-  const propVariables = createPropVariables();
-  const pushScope = propVariables.pushScope;
-  const popScope = propVariables.popScope;
-
-  /**
-   * Mark a prop type as used
-   * @param {ASTNode} node The AST node being marked.
-   * @param {string[]} [parentNames]
-   */
-  function markPropTypesAsUsed(node, parentNames) {
-    parentNames = parentNames || [];
-    let type;
-    let name;
-    let allNames;
-    let properties;
-    switch (node.type) {
-      case 'MemberExpression':
-        name = getPropertyName(node);
-        if (name) {
-          allNames = parentNames.concat(name);
-          if (
-            // Match props.foo.bar, don't match bar[props.foo]
-            node.parent.type === 'MemberExpression' &&
-            node.parent.object === node
-          ) {
-            markPropTypesAsUsed(node.parent, allNames);
-          }
-          // Handle the destructuring part of `const {foo} = props.a.b`
-          if (
-            node.parent.type === 'VariableDeclarator' &&
-            node.parent.id.type === 'ObjectPattern'
-          ) {
-            node.parent.id.parent = node.parent; // patch for bug in eslint@4 in which ObjectPattern has no parent
-            markPropTypesAsUsed(node.parent.id, allNames);
-          }
-
-          // const a = props.a
-          if (
-            node.parent.type === 'VariableDeclarator' &&
-            node.parent.id.type === 'Identifier'
-          ) {
-            propVariables.set(node.parent.id.name, allNames);
-          }
-          // Do not mark computed props as used.
-          type = name !== '__COMPUTED_PROP__' ? 'direct' : null;
-        }
-        break;
-      case 'ArrowFunctionExpression':
-      case 'FunctionDeclaration':
-      case 'FunctionExpression': {
-        if (node.params.length === 0) {
-          break;
-        }
-        type = 'destructuring';
-        const propParam = isSetStateUpdater(node) ? node.params[1] : node.params[0];
-        properties = propParam.type === 'AssignmentPattern' ?
-          propParam.left.properties :
-          propParam.properties;
-        break;
-      }
-      case 'ObjectPattern':
-        type = 'destructuring';
-        properties = node.properties;
-        break;
-      case 'TSEmptyBodyFunctionExpression':
-        break;
-      default:
-        throw new Error(`${node.type} ASTNodes are not handled by markPropTypesAsUsed`);
-    }
-
-    const component = components.get(utils.getParentComponent());
-    const usedPropTypes = component && component.usedPropTypes || [];
-    let ignoreUnusedPropTypesValidation = component && component.ignoreUnusedPropTypesValidation || false;
-
-    switch (type) {
-      case 'direct': {
-        // Ignore Object methods
-        if (name in Object.prototype) {
-          break;
-        }
-
-        const reportedNode = node.property;
-        usedPropTypes.push({
-          name,
-          allNames,
-          node: reportedNode
-        });
-        break;
-      }
-      case 'destructuring': {
-        for (let k = 0, l = (properties || []).length; k < l; k++) {
-          if (hasSpreadOperator(context, properties[k]) || properties[k].computed) {
-            ignoreUnusedPropTypesValidation = true;
-            break;
-          }
-          const propName = ast.getKeyValue(context, properties[k]);
-
-          if (!propName || properties[k].type !== 'Property') {
-            break;
-          }
-
-          usedPropTypes.push({
-            allNames: parentNames.concat([propName]),
-            name: propName,
-            node: properties[k]
-          });
-
-          if (properties[k].value.type === 'ObjectPattern') {
-            markPropTypesAsUsed(properties[k].value, parentNames.concat([propName]));
-          } else if (properties[k].value.type === 'Identifier') {
-            propVariables.set(propName, parentNames.concat(propName));
-          }
-        }
-        break;
-      }
-      default:
-        break;
-    }
-
-    components.set(component ? component.node : node, {
-      usedPropTypes,
-      ignoreUnusedPropTypesValidation
-    });
-  }
-
-  /**
-   * @param {ASTNode} node We expect either an ArrowFunctionExpression,
-   *   FunctionDeclaration, or FunctionExpression
-   */
-  function markDestructuredFunctionArgumentsAsUsed(node) {
-    const param = node.params && isSetStateUpdater(node) ? node.params[1] : node.params[0];
-
-    const destructuring = param && (
-      param.type === 'ObjectPattern' ||
-      param.type === 'AssignmentPattern' && param.left.type === 'ObjectPattern'
-    );
-
-    if (destructuring && (components.get(node) || components.get(node.parent))) {
-      markPropTypesAsUsed(node);
-    }
-  }
-
-  function handleSetStateUpdater(node) {
-    if (!node.params || node.params.length < 2 || !isSetStateUpdater(node)) {
-      return;
-    }
-    markPropTypesAsUsed(node);
-  }
-
-  /**
-   * Handle both stateless functions and setState updater functions.
-   * @param {ASTNode} node We expect either an ArrowFunctionExpression,
-   *   FunctionDeclaration, or FunctionExpression
-   */
-  function handleFunctionLikeExpressions(node) {
-    pushScope();
-    handleSetStateUpdater(node);
-    markDestructuredFunctionArgumentsAsUsed(node);
-  }
-
-  function handleCustomValidators(component) {
-    const propTypes = component.declaredPropTypes;
-    if (!propTypes) {
-      return;
-    }
-
-    Object.keys(propTypes).forEach((key) => {
-      const node = propTypes[key].node;
-
-      if (node.value && astUtil.isFunctionLikeExpression(node.value)) {
-        markPropTypesAsUsed(node.value);
-      }
-    });
-  }
-
-  return {
-    VariableDeclarator(node) {
-      const unwrappedInitNode = ast.unwrapTSAsExpression(node.init);
-
-      // let props = this.props
-      if (isThisDotProps(unwrappedInitNode) && isInClassComponent(utils) && node.id.type === 'Identifier') {
-        propVariables.set(node.id.name, []);
-      }
-
-      // Only handles destructuring
-      if (node.id.type !== 'ObjectPattern' || !unwrappedInitNode) {
-        return;
-      }
-
-      // let {props: {firstname}} = this
-      const propsProperty = node.id.properties.find(property => (
-        property.key &&
-        (property.key.name === 'props' || property.key.value === 'props')
-      ));
-
-      if (unwrappedInitNode.type === 'ThisExpression' && propsProperty && propsProperty.value.type === 'ObjectPattern') {
-        markPropTypesAsUsed(propsProperty.value);
-        return;
-      }
-
-      // let {props} = this
-      if (unwrappedInitNode.type === 'ThisExpression' && propsProperty && propsProperty.value.name === 'props') {
-        propVariables.set('props', []);
-        return;
-      }
-
-      // let {firstname} = props
-      if (
-        isCommonVariableNameForProps(unwrappedInitNode.name) &&
-        (utils.getParentStatelessComponent() || isInLifeCycleMethod(node, checkAsyncSafeLifeCycles))
-      ) {
-        markPropTypesAsUsed(node.id);
-        return;
-      }
-
-      // let {firstname} = this.props
-      if (isThisDotProps(unwrappedInitNode) && isInClassComponent(utils)) {
-        markPropTypesAsUsed(node.id);
-        return;
-      }
-
-      // let {firstname} = thing, where thing is defined by const thing = this.props.**.*
-      if (propVariables.get(unwrappedInitNode.name)) {
-        markPropTypesAsUsed(node.id, propVariables.get(unwrappedInitNode.name));
-      }
-    },
-
-    FunctionDeclaration: handleFunctionLikeExpressions,
-
-    ArrowFunctionExpression: handleFunctionLikeExpressions,
-
-    FunctionExpression: handleFunctionLikeExpressions,
-
-    'FunctionDeclaration:exit': popScope,
-
-    'ArrowFunctionExpression:exit': popScope,
-
-    'FunctionExpression:exit': popScope,
-
-    JSXSpreadAttribute(node) {
-      const component = components.get(utils.getParentComponent());
-      components.set(component ? component.node : node, {
-        ignoreUnusedPropTypesValidation: true
-      });
-    },
-
-    MemberExpression(node) {
-      if (isPropTypesUsageByMemberExpression(node, context, utils, checkAsyncSafeLifeCycles)) {
-        markPropTypesAsUsed(node);
-        return;
-      }
-
-      const propVariable = propVariables.get(ast.unwrapTSAsExpression(node.object).name);
-      if (propVariable) {
-        markPropTypesAsUsed(node, propVariable);
-      }
-    },
-
-    ObjectPattern(node) {
-      // If the object pattern is a destructured props object in a lifecycle
-      // method -- mark it for used props.
-      if (isNodeALifeCycleMethod(node.parent.parent, checkAsyncSafeLifeCycles) && node.properties.length > 0) {
-        markPropTypesAsUsed(node.parent);
-      }
-    },
-
-    'Program:exit'() {
-      const list = components.list();
-
-      Object.keys(list).filter(component => mustBeValidated(list[component])).forEach((component) => {
-        handleCustomValidators(list[component]);
-      });
-    }
-  };
-};
diff --git a/node_modules/eslint-plugin-react/lib/util/variable.js b/node_modules/eslint-plugin-react/lib/util/variable.js
deleted file mode 100644
index cbc30f4..0000000
--- a/node_modules/eslint-plugin-react/lib/util/variable.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * @fileoverview Utility functions for React components detection
- * @author Yannick Croissant
- */
-
-'use strict';
-
-/**
- * Search a particular variable in a list
- * @param {Array} variables The variables list.
- * @param {string} name The name of the variable to search.
- * @returns {Boolean} True if the variable was found, false if not.
- */
-function findVariable(variables, name) {
-  return variables.some(variable => variable.name === name);
-}
-
-/**
- * Find and return a particular variable in a list
- * @param {Array} variables The variables list.
- * @param {string} name The name of the variable to search.
- * @returns {Object} Variable if the variable was found, null if not.
- */
-function getVariable(variables, name) {
-  return variables.find(variable => variable.name === name);
-}
-
-/**
- * List all variable in a given scope
- *
- * Contain a patch for babel-eslint to avoid https://github.com/babel/babel-eslint/issues/21
- *
- * @param {Object} context The current rule context.
- * @returns {Array} The variables list
- */
-function variablesInScope(context) {
-  let scope = context.getScope();
-  let variables = scope.variables;
-
-  while (scope.type !== 'global') {
-    scope = scope.upper;
-    variables = scope.variables.concat(variables);
-  }
-  if (scope.childScopes.length) {
-    variables = scope.childScopes[0].variables.concat(variables);
-    if (scope.childScopes[0].childScopes.length) {
-      variables = scope.childScopes[0].childScopes[0].variables.concat(variables);
-    }
-  }
-  variables.reverse();
-
-  return variables;
-}
-
-/**
- * Find a variable by name in the current scope.
- * @param {Object} context The current rule context.
- * @param  {string} name Name of the variable to look for.
- * @returns {ASTNode|null} Return null if the variable could not be found, ASTNode otherwise.
- */
-function findVariableByName(context, name) {
-  const variable = getVariable(variablesInScope(context), name);
-
-  if (!variable || !variable.defs[0] || !variable.defs[0].node) {
-    return null;
-  }
-
-  if (variable.defs[0].node.type === 'TypeAlias') {
-    return variable.defs[0].node.right;
-  }
-
-  return variable.defs[0].node.init;
-}
-
-module.exports = {
-  findVariable,
-  findVariableByName,
-  getVariable,
-  variablesInScope
-};
diff --git a/node_modules/eslint-plugin-react/lib/util/version.js b/node_modules/eslint-plugin-react/lib/util/version.js
deleted file mode 100644
index ff7397c..0000000
--- a/node_modules/eslint-plugin-react/lib/util/version.js
+++ /dev/null
@@ -1,120 +0,0 @@
-/**
- * @fileoverview Utility functions for React and Flow version configuration
- * @author Yannick Croissant
- */
-
-'use strict';
-
-const resolve = require('resolve');
-const error = require('./error');
-
-let warnedForMissingVersion = false;
-
-function resetWarningFlag() {
-  warnedForMissingVersion = false;
-}
-
-function detectReactVersion() {
-  try {
-    const reactPath = resolve.sync('react', {basedir: process.cwd()});
-    const react = require(reactPath); // eslint-disable-line global-require, import/no-dynamic-require
-    return react.version;
-  } catch (e) {
-    if (e.code === 'MODULE_NOT_FOUND') {
-      if (!warnedForMissingVersion) {
-        error('Warning: React version was set to "detect" in eslint-plugin-react settings, ' +
-        'but the "react" package is not installed. Assuming latest React version for linting.');
-        warnedForMissingVersion = true;
-      }
-      return '999.999.999';
-    }
-    throw e;
-  }
-}
-
-function getReactVersionFromContext(context) {
-  let confVer = '999.999.999';
-  // .eslintrc shared settings (http://eslint.org/docs/user-guide/configuring#adding-shared-settings)
-  if (context.settings && context.settings.react && context.settings.react.version) {
-    let settingsVersion = context.settings.react.version;
-    if (settingsVersion === 'detect') {
-      settingsVersion = detectReactVersion();
-    }
-    if (typeof settingsVersion !== 'string') {
-      error('Warning: React version specified in eslint-plugin-react-settings must be a string; ' +
-        `got “${typeof settingsVersion}”`);
-    }
-    confVer = String(settingsVersion);
-  } else if (!warnedForMissingVersion) {
-    error('Warning: React version not specified in eslint-plugin-react settings. ' +
-      'See https://github.com/yannickcr/eslint-plugin-react#configuration .');
-    warnedForMissingVersion = true;
-  }
-  confVer = /^[0-9]+\.[0-9]+$/.test(confVer) ? `${confVer}.0` : confVer;
-  return confVer.split('.').map(part => Number(part));
-}
-
-function detectFlowVersion() {
-  try {
-    const flowPackageJsonPath = resolve.sync('flow-bin/package.json', {basedir: process.cwd()});
-    const flowPackageJson = require(flowPackageJsonPath); // eslint-disable-line global-require, import/no-dynamic-require
-    return flowPackageJson.version;
-  } catch (e) {
-    if (e.code === 'MODULE_NOT_FOUND') {
-      error('Warning: Flow version was set to "detect" in eslint-plugin-react settings, ' +
-        'but the "flow-bin" package is not installed. Assuming latest Flow version for linting.');
-      return '999.999.999';
-    }
-    throw e;
-  }
-}
-
-function getFlowVersionFromContext(context) {
-  let confVer = '999.999.999';
-  // .eslintrc shared settings (http://eslint.org/docs/user-guide/configuring#adding-shared-settings)
-  if (context.settings.react && context.settings.react.flowVersion) {
-    let flowVersion = context.settings.react.flowVersion;
-    if (flowVersion === 'detect') {
-      flowVersion = detectFlowVersion();
-    }
-    if (typeof flowVersion !== 'string') {
-      error('Warning: Flow version specified in eslint-plugin-react-settings must be a string; ' +
-        `got “${typeof flowVersion}”`);
-    }
-    confVer = String(flowVersion);
-  } else {
-    throw 'Could not retrieve flowVersion from settings'; // eslint-disable-line no-throw-literal
-  }
-  confVer = /^[0-9]+\.[0-9]+$/.test(confVer) ? `${confVer}.0` : confVer;
-  return confVer.split('.').map(part => Number(part));
-}
-
-function normalizeParts(parts) {
-  return Array.from({length: 3}, (_, i) => (parts[i] || 0));
-}
-
-function test(context, methodVer, confVer) {
-  const methodVers = normalizeParts(String(methodVer || '').split('.').map(part => Number(part)));
-  const confVers = normalizeParts(confVer);
-  const higherMajor = methodVers[0] < confVers[0];
-  const higherMinor = methodVers[0] === confVers[0] && methodVers[1] < confVers[1];
-  const higherOrEqualPatch = methodVers[0] === confVers[0] &&
-    methodVers[1] === confVers[1] &&
-    methodVers[2] <= confVers[2];
-
-  return higherMajor || higherMinor || higherOrEqualPatch;
-}
-
-function testReactVersion(context, methodVer) {
-  return test(context, methodVer, getReactVersionFromContext(context));
-}
-
-function testFlowVersion(context, methodVer) {
-  return test(context, methodVer, getFlowVersionFromContext(context));
-}
-
-module.exports = {
-  testReactVersion,
-  testFlowVersion,
-  resetWarningFlag
-};
diff --git a/node_modules/eslint-plugin-react/node_modules/.bin/semver b/node_modules/eslint-plugin-react/node_modules/.bin/semver
deleted file mode 120000
index c3277a7..0000000
--- a/node_modules/eslint-plugin-react/node_modules/.bin/semver
+++ /dev/null
@@ -1 +0,0 @@
-../../../semver/bin/semver.js
\ No newline at end of file
diff --git a/node_modules/eslint-plugin-react/node_modules/doctrine/CHANGELOG.md b/node_modules/eslint-plugin-react/node_modules/doctrine/CHANGELOG.md
deleted file mode 100644
index 57140d0..0000000
--- a/node_modules/eslint-plugin-react/node_modules/doctrine/CHANGELOG.md
+++ /dev/null
@@ -1,94 +0,0 @@
-v2.1.0 - January 6, 2018
-
-* 827f314 Update: support node ranges (fixes #89) (#190) (Teddy Katz)
-
-v2.0.2 - November 25, 2017
-
-* 5049ee3 Fix: Remove redundant LICENSE/README names from files (#203) (Kevin Partington)
-
-v2.0.1 - November 10, 2017
-
-* 009f33d Fix: Making sure union type stringification respects compact flag (#199) (Mitermayer Reis)
-* 19da935 Use native String.prototype.trim instead of a custom implementation. (#201) (Rouven Weßling)
-* e3a011b chore: add mocha.opts to restore custom mocha config (Jason Kurian)
-* d888200 chore: adds nyc and a newer version of mocha to accurately report coverage (Jason Kurian)
-* 6b210a8 fix: support type expression for @this tag (fixes #181) (#182) (Frédéric Junod)
-* 1c4a4c7 fix: Allow array indexes in names (#193) (Tom MacWright)
-* 9aed54d Fix incorrect behavior when arrow functions are used as default values (#189) (Gaurab Paul)
-* 9efb6ca Upgrade: Use Array.isArray instead of isarray package (#195) (medanat)
-
-v2.0.0 - November 15, 2016
-
-* 7d7c5f1 Breaking: Re-license to Apache 2 (fixes #176) (#178) (Nicholas C. Zakas)
-* 5496132 Docs: Update license copyright (Nicholas C. Zakas)
-
-v1.5.0 - October 13, 2016
-
-* e33c6bb Update: Add support for BooleanLiteralType (#173) (Erik Arvidsson)
-
-v1.4.0 - September 13, 2016
-
-* d7426e5 Update: add ability to parse optional properties in typedefs (refs #5) (#174) (ikokostya)
-
-v1.3.0 - August 22, 2016
-
-* 12c7ad9 Update: Add support for numeric and string literal types (fixes #156) (#172) (Andrew Walter)
-
-v1.2.3 - August 16, 2016
-
-* b96a884 Build: Add CI release script (Nicholas C. Zakas)
-* 8d9b3c7 Upgrade: Upgrade esutils to v2.0.2 (fixes #170) (#171) (Emeegeemee)
-
-v1.2.2 - May 19, 2016
-
-* ebe0b08 Fix: Support case insensitive tags (fixes #163) (#164) (alberto)
-* 8e6d81e Chore: Remove copyright and license from headers (Nicholas C. Zakas)
-* 79035c6 Chore: Include jQuery Foundation copyright (Nicholas C. Zakas)
-* 06910a7 Fix: Preserve whitespace in default param string values (fixes #157) (Kai Cataldo)
-
-v1.2.1 - March 29, 2016
-
-* 1f54014 Fix: allow hyphens in names (fixes #116) (Kai Cataldo)
-* bbee469 Docs: Add issue template (Nicholas C. Zakas)
-
-v1.2.0 - February 19, 2016
-
-* 18136c5 Build: Cleanup build system (Nicholas C. Zakas)
-* b082f85 Update: Add support for slash in namepaths (fixes #100) (Ryan Duffy)
-* def53a2 Docs: Fix typo in option lineNumbers (Daniel Tschinder)
-* e2cbbc5 Update: Bump isarray to v1.0.0 (Shinnosuke Watanabe)
-* ae07aa8 Fix: Allow whitespace in optional param with default value (fixes #141) (chris)
-
-v1.1.0 - January 6, 2016
-
-* Build: Switch to Makefile.js (Nicholas C. Zakas)
-* New: support name expression for @this tag (fixes #143) (Tim Schaub)
-* Build: Update ESLint settings (Nicholas C. Zakas)
-
-v1.0.0 - December 21, 2015
-
-* New: parse caption tags in examples into separate property. (fixes #131) (Tom MacWright)
-
-v0.7.2 - November 27, 2015
-
-* Fix: Line numbers for some tags (fixes #138) Fixing issue where input was not consumed via advance() but was skipped when parsing tags resulting in sometimes incorrect reported lineNumber. (TEHEK)
-* Build: Add missing linefix package (Nicholas C. Zakas)
-
-v0.7.1 - November 13, 2015
-
-* Update: Begin switch to Makefile.js (Nicholas C. Zakas)
-* Fix: permit return tag without type (fixes #136) (Tom MacWright)
-* Fix: package.json homepage field (Bogdan Chadkin)
-* Fix: Parse array default syntax. Fixes #133 (Tom MacWright)
-* Fix: Last tag always has \n in the description (fixes #87) (Burak Yigit Kaya)
-* Docs: Add changelog (Nicholas C. Zakas)
-
-v0.7.0 - September 21, 2015
-
-* Docs: Update README with new info (fixes #127) (Nicholas C. Zakas)
-* Fix: Parsing fix for param with arrays and properties (fixes #111) (Gyandeep Singh)
-* Build: Add travis build (fixes #123) (Gyandeep Singh)
-* Fix: Parsing of parameter name without a type (fixes #120) (Gyandeep Singh)
-* New: added preserveWhitespace option (Aleks Totic)
-* New: Add "files" entry to only deploy select files (Rob Loach)
-* New: Add support and tests for typedefs. Refs #5 (Tom MacWright)
diff --git a/node_modules/eslint-plugin-react/node_modules/doctrine/LICENSE b/node_modules/eslint-plugin-react/node_modules/doctrine/LICENSE
deleted file mode 100644
index 3e8ba72..0000000
--- a/node_modules/eslint-plugin-react/node_modules/doctrine/LICENSE
+++ /dev/null
@@ -1,177 +0,0 @@
-
-                             Apache License
-                       Version 2.0, January 2004
-                    http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-  "License" shall mean the terms and conditions for use, reproduction,
-  and distribution as defined by Sections 1 through 9 of this document.
-
-  "Licensor" shall mean the copyright owner or entity authorized by
-  the copyright owner that is granting the License.
-
-  "Legal Entity" shall mean the union of the acting entity and all
-  other entities that control, are controlled by, or are under common
-  control with that entity. For the purposes of this definition,
-  "control" means (i) the power, direct or indirect, to cause the
-  direction or management of such entity, whether by contract or
-  otherwise, or (ii) ownership of fifty percent (50%) or more of the
-  outstanding shares, or (iii) beneficial ownership of such entity.
-
-  "You" (or "Your") shall mean an individual or Legal Entity
-  exercising permissions granted by this License.
-
-  "Source" form shall mean the preferred form for making modifications,
-  including but not limited to software source code, documentation
-  source, and configuration files.
-
-  "Object" form shall mean any form resulting from mechanical
-  transformation or translation of a Source form, including but
-  not limited to compiled object code, generated documentation,
-  and conversions to other media types.
-
-  "Work" shall mean the work of authorship, whether in Source or
-  Object form, made available under the License, as indicated by a
-  copyright notice that is included in or attached to the work
-  (an example is provided in the Appendix below).
-
-  "Derivative Works" shall mean any work, whether in Source or Object
-  form, that is based on (or derived from) the Work and for which the
-  editorial revisions, annotations, elaborations, or other modifications
-  represent, as a whole, an original work of authorship. For the purposes
-  of this License, Derivative Works shall not include works that remain
-  separable from, or merely link (or bind by name) to the interfaces of,
-  the Work and Derivative Works thereof.
-
-  "Contribution" shall mean any work of authorship, including
-  the original version of the Work and any modifications or additions
-  to that Work or Derivative Works thereof, that is intentionally
-  submitted to Licensor for inclusion in the Work by the copyright owner
-  or by an individual or Legal Entity authorized to submit on behalf of
-  the copyright owner. For the purposes of this definition, "submitted"
-  means any form of electronic, verbal, or written communication sent
-  to the Licensor or its representatives, including but not limited to
-  communication on electronic mailing lists, source code control systems,
-  and issue tracking systems that are managed by, or on behalf of, the
-  Licensor for the purpose of discussing and improving the Work, but
-  excluding communication that is conspicuously marked or otherwise
-  designated in writing by the copyright owner as "Not a Contribution."
-
-  "Contributor" shall mean Licensor and any individual or Legal Entity
-  on behalf of whom a Contribution has been received by Licensor and
-  subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-  this License, each Contributor hereby grants to You a perpetual,
-  worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-  copyright license to reproduce, prepare Derivative Works of,
-  publicly display, publicly perform, sublicense, and distribute the
-  Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-  this License, each Contributor hereby grants to You a perpetual,
-  worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-  (except as stated in this section) patent license to make, have made,
-  use, offer to sell, sell, import, and otherwise transfer the Work,
-  where such license applies only to those patent claims licensable
-  by such Contributor that are necessarily infringed by their
-  Contribution(s) alone or by combination of their Contribution(s)
-  with the Work to which such Contribution(s) was submitted. If You
-  institute patent litigation against any entity (including a
-  cross-claim or counterclaim in a lawsuit) alleging that the Work
-  or a Contribution incorporated within the Work constitutes direct
-  or contributory patent infringement, then any patent licenses
-  granted to You under this License for that Work shall terminate
-  as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-  Work or Derivative Works thereof in any medium, with or without
-  modifications, and in Source or Object form, provided that You
-  meet the following conditions:
-
-  (a) You must give any other recipients of the Work or
-      Derivative Works a copy of this License; and
-
-  (b) You must cause any modified files to carry prominent notices
-      stating that You changed the files; and
-
-  (c) You must retain, in the Source form of any Derivative Works
-      that You distribute, all copyright, patent, trademark, and
-      attribution notices from the Source form of the Work,
-      excluding those notices that do not pertain to any part of
-      the Derivative Works; and
-
-  (d) If the Work includes a "NOTICE" text file as part of its
-      distribution, then any Derivative Works that You distribute must
-      include a readable copy of the attribution notices contained
-      within such NOTICE file, excluding those notices that do not
-      pertain to any part of the Derivative Works, in at least one
-      of the following places: within a NOTICE text file distributed
-      as part of the Derivative Works; within the Source form or
-      documentation, if provided along with the Derivative Works; or,
-      within a display generated by the Derivative Works, if and
-      wherever such third-party notices normally appear. The contents
-      of the NOTICE file are for informational purposes only and
-      do not modify the License. You may add Your own attribution
-      notices within Derivative Works that You distribute, alongside
-      or as an addendum to the NOTICE text from the Work, provided
-      that such additional attribution notices cannot be construed
-      as modifying the License.
-
-  You may add Your own copyright statement to Your modifications and
-  may provide additional or different license terms and conditions
-  for use, reproduction, or distribution of Your modifications, or
-  for any such Derivative Works as a whole, provided Your use,
-  reproduction, and distribution of the Work otherwise complies with
-  the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-  any Contribution intentionally submitted for inclusion in the Work
-  by You to the Licensor shall be under the terms and conditions of
-  this License, without any additional terms or conditions.
-  Notwithstanding the above, nothing herein shall supersede or modify
-  the terms of any separate license agreement you may have executed
-  with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-  names, trademarks, service marks, or product names of the Licensor,
-  except as required for reasonable and customary use in describing the
-  origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-  agreed to in writing, Licensor provides the Work (and each
-  Contributor provides its Contributions) on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-  implied, including, without limitation, any warranties or conditions
-  of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-  PARTICULAR PURPOSE. You are solely responsible for determining the
-  appropriateness of using or redistributing the Work and assume any
-  risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-  whether in tort (including negligence), contract, or otherwise,
-  unless required by applicable law (such as deliberate and grossly
-  negligent acts) or agreed to in writing, shall any Contributor be
-  liable to You for damages, including any direct, indirect, special,
-  incidental, or consequential damages of any character arising as a
-  result of this License or out of the use or inability to use the
-  Work (including but not limited to damages for loss of goodwill,
-  work stoppage, computer failure or malfunction, or any and all
-  other commercial damages or losses), even if such Contributor
-  has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-  the Work or Derivative Works thereof, You may choose to offer,
-  and charge a fee for, acceptance of support, warranty, indemnity,
-  or other liability obligations and/or rights consistent with this
-  License. However, in accepting such obligations, You may act only
-  on Your own behalf and on Your sole responsibility, not on behalf
-  of any other Contributor, and only if You agree to indemnify,
-  defend, and hold each Contributor harmless for any liability
-  incurred by, or claims asserted against, such Contributor by reason
-  of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
diff --git a/node_modules/eslint-plugin-react/node_modules/doctrine/LICENSE.closure-compiler b/node_modules/eslint-plugin-react/node_modules/doctrine/LICENSE.closure-compiler
deleted file mode 100644
index d645695..0000000
--- a/node_modules/eslint-plugin-react/node_modules/doctrine/LICENSE.closure-compiler
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/node_modules/eslint-plugin-react/node_modules/doctrine/README.md b/node_modules/eslint-plugin-react/node_modules/doctrine/README.md
deleted file mode 100644
index 26fad18..0000000
--- a/node_modules/eslint-plugin-react/node_modules/doctrine/README.md
+++ /dev/null
@@ -1,165 +0,0 @@
-[![NPM version][npm-image]][npm-url]
-[![build status][travis-image]][travis-url]
-[![Test coverage][coveralls-image]][coveralls-url]
-[![Downloads][downloads-image]][downloads-url]
-[![Join the chat at https://gitter.im/eslint/doctrine](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/eslint/doctrine?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-# Doctrine
-
-Doctrine is a [JSDoc](http://usejsdoc.org) parser that parses documentation comments from JavaScript (you need to pass in the comment, not a whole JavaScript file).
-
-## Installation
-
-You can install Doctrine using [npm](https://npmjs.com):
-
-```
-$ npm install doctrine --save-dev
-```
-
-Doctrine can also be used in web browsers using [Browserify](http://browserify.org).
-
-## Usage
-
-Require doctrine inside of your JavaScript:
-
-```js
-var doctrine = require("doctrine");
-```
-
-### parse()
-
-The primary method is `parse()`, which accepts two arguments: the JSDoc comment to parse and an optional options object. The available options are:
-
-* `unwrap` - set to `true` to delete the leading `/**`, any `*` that begins a line, and the trailing `*/` from the source text. Default: `false`.
-* `tags` - an array of tags to return. When specified, Doctrine returns only tags in this array. For example, if `tags` is `["param"]`, then only `@param` tags will be returned. Default: `null`.
-* `recoverable` - set to `true` to keep parsing even when syntax errors occur. Default: `false`.
-* `sloppy` - set to `true` to allow optional parameters to be specified in brackets (`@param {string} [foo]`). Default: `false`.
-* `lineNumbers` - set to `true` to add `lineNumber` to each node, specifying the line on which the node is found in the source. Default: `false`.
-* `range` - set to `true` to add `range` to each node, specifying the start and end index of the node in the original comment. Default: `false`.
-
-Here's a simple example:
-
-```js
-var ast = doctrine.parse(
-    [
-        "/**",
-        " * This function comment is parsed by doctrine",
-        " * @param {{ok:String}} userName",
-        "*/"
-    ].join('\n'), { unwrap: true });
-```
-
-This example returns the following AST:
-
-    {
-        "description": "This function comment is parsed by doctrine",
-        "tags": [
-            {
-                "title": "param",
-                "description": null,
-                "type": {
-                    "type": "RecordType",
-                    "fields": [
-                        {
-                            "type": "FieldType",
-                            "key": "ok",
-                            "value": {
-                                "type": "NameExpression",
-                                "name": "String"
-                            }
-                        }
-                    ]
-                },
-                "name": "userName"
-            }
-        ]
-    }
-
-See the [demo page](http://eslint.org/doctrine/demo/) more detail.
-
-## Team
-
-These folks keep the project moving and are resources for help:
-
-* Nicholas C. Zakas ([@nzakas](https://github.com/nzakas)) - project lead
-* Yusuke Suzuki ([@constellation](https://github.com/constellation)) - reviewer
-
-## Contributing
-
-Issues and pull requests will be triaged and responded to as quickly as possible. We operate under the [ESLint Contributor Guidelines](http://eslint.org/docs/developer-guide/contributing), so please be sure to read them before contributing. If you're not sure where to dig in, check out the [issues](https://github.com/eslint/doctrine/issues).
-
-## Frequently Asked Questions
-
-### Can I pass a whole JavaScript file to Doctrine?
-
-No. Doctrine can only parse JSDoc comments, so you'll need to pass just the JSDoc comment to Doctrine in order to work.
-
-
-### License
-
-#### doctrine
-
-Copyright JS Foundation and other contributors, https://js.foundation
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-#### esprima
-
-some of functions is derived from esprima
-
-Copyright (C) 2012, 2011 [Ariya Hidayat](http://ariya.ofilabs.com/about)
- (twitter: [@ariyahidayat](http://twitter.com/ariyahidayat)) and other contributors.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-  * Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-
-  * Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-#### closure-compiler
-
-some of extensions is derived from closure-compiler
-
-Apache License
-Version 2.0, January 2004
-http://www.apache.org/licenses/
-
-
-### Where to ask for help?
-
-Join our [Chatroom](https://gitter.im/eslint/doctrine)
-
-[npm-image]: https://img.shields.io/npm/v/doctrine.svg?style=flat-square
-[npm-url]: https://www.npmjs.com/package/doctrine
-[travis-image]: https://img.shields.io/travis/eslint/doctrine/master.svg?style=flat-square
-[travis-url]: https://travis-ci.org/eslint/doctrine
-[coveralls-image]: https://img.shields.io/coveralls/eslint/doctrine/master.svg?style=flat-square
-[coveralls-url]: https://coveralls.io/r/eslint/doctrine?branch=master
-[downloads-image]: http://img.shields.io/npm/dm/doctrine.svg?style=flat-square
-[downloads-url]: https://www.npmjs.com/package/doctrine
diff --git a/node_modules/eslint-plugin-react/node_modules/doctrine/lib/doctrine.js b/node_modules/eslint-plugin-react/node_modules/doctrine/lib/doctrine.js
deleted file mode 100644
index 1665afe..0000000
--- a/node_modules/eslint-plugin-react/node_modules/doctrine/lib/doctrine.js
+++ /dev/null
@@ -1,899 +0,0 @@
-/*
- * @fileoverview Main Doctrine object
- * @author Yusuke Suzuki <utatane.tea@gmail.com>
- * @author Dan Tao <daniel.tao@gmail.com>
- * @author Andrew Eisenberg <andrew@eisenberg.as>
- */
-
-(function () {
-    'use strict';
-
-    var typed,
-        utility,
-        jsdoc,
-        esutils,
-        hasOwnProperty;
-
-    esutils = require('esutils');
-    typed = require('./typed');
-    utility = require('./utility');
-
-    function sliceSource(source, index, last) {
-        return source.slice(index, last);
-    }
-
-    hasOwnProperty = (function () {
-        var func = Object.prototype.hasOwnProperty;
-        return function hasOwnProperty(obj, name) {
-            return func.call(obj, name);
-        };
-    }());
-
-    function shallowCopy(obj) {
-        var ret = {}, key;
-        for (key in obj) {
-            if (obj.hasOwnProperty(key)) {
-                ret[key] = obj[key];
-            }
-        }
-        return ret;
-    }
-
-    function isASCIIAlphanumeric(ch) {
-        return (ch >= 0x61  /* 'a' */ && ch <= 0x7A  /* 'z' */) ||
-            (ch >= 0x41  /* 'A' */ && ch <= 0x5A  /* 'Z' */) ||
-            (ch >= 0x30  /* '0' */ && ch <= 0x39  /* '9' */);
-    }
-
-    function isParamTitle(title) {
-        return title === 'param' || title === 'argument' || title === 'arg';
-    }
-
-    function isReturnTitle(title) {
-        return title === 'return' || title === 'returns';
-    }
-
-    function isProperty(title) {
-        return title === 'property' || title === 'prop';
-    }
-
-    function isNameParameterRequired(title) {
-        return isParamTitle(title) || isProperty(title) ||
-            title === 'alias' || title === 'this' || title === 'mixes' || title === 'requires';
-    }
-
-    function isAllowedName(title) {
-        return isNameParameterRequired(title) || title === 'const' || title === 'constant';
-    }
-
-    function isAllowedNested(title) {
-        return isProperty(title) || isParamTitle(title);
-    }
-
-    function isAllowedOptional(title) {
-        return isProperty(title) || isParamTitle(title);
-    }
-
-    function isTypeParameterRequired(title) {
-        return isParamTitle(title) || isReturnTitle(title) ||
-            title === 'define' || title === 'enum' ||
-            title === 'implements' || title === 'this' ||
-            title === 'type' || title === 'typedef' || isProperty(title);
-    }
-
-    // Consider deprecation instead using 'isTypeParameterRequired' and 'Rules' declaration to pick when a type is optional/required
-    // This would require changes to 'parseType'
-    function isAllowedType(title) {
-        return isTypeParameterRequired(title) || title === 'throws' || title === 'const' || title === 'constant' ||
-            title === 'namespace' || title === 'member' || title === 'var' || title === 'module' ||
-            title === 'constructor' || title === 'class' || title === 'extends' || title === 'augments' ||
-            title === 'public' || title === 'private' || title === 'protected';
-    }
-
-    // A regex character class that contains all whitespace except linebreak characters (\r, \n, \u2028, \u2029)
-    var WHITESPACE = '[ \\f\\t\\v\\u00a0\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]';
-
-    var STAR_MATCHER = '(' + WHITESPACE + '*(?:\\*' + WHITESPACE + '?)?)(.+|[\r\n\u2028\u2029])';
-
-    function unwrapComment(doc) {
-        // JSDoc comment is following form
-        //   /**
-        //    * .......
-        //    */
-
-        return doc.
-            // remove /**
-            replace(/^\/\*\*?/, '').
-            // remove */
-            replace(/\*\/$/, '').
-            // remove ' * ' at the beginning of a line
-            replace(new RegExp(STAR_MATCHER, 'g'), '$2').
-            // remove trailing whitespace
-            replace(/\s*$/, '');
-    }
-
-    /**
-     * Converts an index in an "unwrapped" JSDoc comment to the corresponding index in the original "wrapped" version
-     * @param {string} originalSource The original wrapped comment
-     * @param {number} unwrappedIndex The index of a character in the unwrapped string
-     * @returns {number} The index of the corresponding character in the original wrapped string
-     */
-    function convertUnwrappedCommentIndex(originalSource, unwrappedIndex) {
-        var replacedSource = originalSource.replace(/^\/\*\*?/, '');
-        var numSkippedChars = 0;
-        var matcher = new RegExp(STAR_MATCHER, 'g');
-        var match;
-
-        while ((match = matcher.exec(replacedSource))) {
-            numSkippedChars += match[1].length;
-
-            if (match.index + match[0].length > unwrappedIndex + numSkippedChars) {
-                return unwrappedIndex + numSkippedChars + originalSource.length - replacedSource.length;
-            }
-        }
-
-        return originalSource.replace(/\*\/$/, '').replace(/\s*$/, '').length;
-    }
-
-    // JSDoc Tag Parser
-
-    (function (exports) {
-        var Rules,
-            index,
-            lineNumber,
-            length,
-            source,
-            originalSource,
-            recoverable,
-            sloppy,
-            strict;
-
-        function advance() {
-            var ch = source.charCodeAt(index);
-            index += 1;
-            if (esutils.code.isLineTerminator(ch) && !(ch === 0x0D  /* '\r' */ && source.charCodeAt(index) === 0x0A  /* '\n' */)) {
-                lineNumber += 1;
-            }
-            return String.fromCharCode(ch);
-        }
-
-        function scanTitle() {
-            var title = '';
-            // waste '@'
-            advance();
-
-            while (index < length && isASCIIAlphanumeric(source.charCodeAt(index))) {
-                title += advance();
-            }
-
-            return title;
-        }
-
-        function seekContent() {
-            var ch, waiting, last = index;
-
-            waiting = false;
-            while (last < length) {
-                ch = source.charCodeAt(last);
-                if (esutils.code.isLineTerminator(ch) && !(ch === 0x0D  /* '\r' */ && source.charCodeAt(last + 1) === 0x0A  /* '\n' */)) {
-                    waiting = true;
-                } else if (waiting) {
-                    if (ch === 0x40  /* '@' */) {
-                        break;
-                    }
-                    if (!esutils.code.isWhiteSpace(ch)) {
-                        waiting = false;
-                    }
-                }
-                last += 1;
-            }
-            return last;
-        }
-
-        // type expression may have nest brace, such as,
-        // { { ok: string } }
-        //
-        // therefore, scanning type expression with balancing braces.
-        function parseType(title, last, addRange) {
-            var ch, brace, type, startIndex, direct = false;
-
-
-            // search '{'
-            while (index < last) {
-                ch = source.charCodeAt(index);
-                if (esutils.code.isWhiteSpace(ch)) {
-                    advance();
-                } else if (ch === 0x7B  /* '{' */) {
-                    advance();
-                    break;
-                } else {
-                    // this is direct pattern
-                    direct = true;
-                    break;
-                }
-            }
-
-
-            if (direct) {
-                return null;
-            }
-
-            // type expression { is found
-            brace = 1;
-            type = '';
-            while (index < last) {
-                ch = source.charCodeAt(index);
-                if (esutils.code.isLineTerminator(ch)) {
-                    advance();
-                } else {
-                    if (ch === 0x7D  /* '}' */) {
-                        brace -= 1;
-                        if (brace === 0) {
-                            advance();
-                            break;
-                        }
-                    } else if (ch === 0x7B  /* '{' */) {
-                        brace += 1;
-                    }
-                    if (type === '') {
-                        startIndex = index;
-                    }
-                    type += advance();
-                }
-            }
-
-            if (brace !== 0) {
-                // braces is not balanced
-                return utility.throwError('Braces are not balanced');
-            }
-
-            if (isAllowedOptional(title)) {
-                return typed.parseParamType(type, {startIndex: convertIndex(startIndex), range: addRange});
-            }
-
-            return typed.parseType(type, {startIndex: convertIndex(startIndex), range: addRange});
-        }
-
-        function scanIdentifier(last) {
-            var identifier;
-            if (!esutils.code.isIdentifierStartES5(source.charCodeAt(index)) && !source[index].match(/[0-9]/)) {
-                return null;
-            }
-            identifier = advance();
-            while (index < last && esutils.code.isIdentifierPartES5(source.charCodeAt(index))) {
-                identifier += advance();
-            }
-            return identifier;
-        }
-
-        function skipWhiteSpace(last) {
-            while (index < last && (esutils.code.isWhiteSpace(source.charCodeAt(index)) || esutils.code.isLineTerminator(source.charCodeAt(index)))) {
-                advance();
-            }
-        }
-
-        function parseName(last, allowBrackets, allowNestedParams) {
-            var name = '',
-                useBrackets,
-                insideString;
-
-
-            skipWhiteSpace(last);
-
-            if (index >= last) {
-                return null;
-            }
-
-            if (source.charCodeAt(index) === 0x5B  /* '[' */) {
-                if (allowBrackets) {
-                    useBrackets = true;
-                    name = advance();
-                } else {
-                    return null;
-                }
-            }
-
-            name += scanIdentifier(last);
-
-            if (allowNestedParams) {
-                if (source.charCodeAt(index) === 0x3A /* ':' */ && (
-                        name === 'module' ||
-                        name === 'external' ||
-                        name === 'event')) {
-                    name += advance();
-                    name += scanIdentifier(last);
-
-                }
-                if(source.charCodeAt(index) === 0x5B  /* '[' */ && source.charCodeAt(index + 1) === 0x5D  /* ']' */){
-                    name += advance();
-                    name += advance();
-                }
-                while (source.charCodeAt(index) === 0x2E  /* '.' */ ||
-                        source.charCodeAt(index) === 0x2F  /* '/' */ ||
-                        source.charCodeAt(index) === 0x23  /* '#' */ ||
-                        source.charCodeAt(index) === 0x2D  /* '-' */ ||
-                        source.charCodeAt(index) === 0x7E  /* '~' */) {
-                    name += advance();
-                    name += scanIdentifier(last);
-                }
-            }
-
-            if (useBrackets) {
-                skipWhiteSpace(last);
-                // do we have a default value for this?
-                if (source.charCodeAt(index) === 0x3D  /* '=' */) {
-                    // consume the '='' symbol
-                    name += advance();
-                    skipWhiteSpace(last);
-
-                    var ch;
-                    var bracketDepth = 1;
-
-                    // scan in the default value
-                    while (index < last) {
-                        ch = source.charCodeAt(index);
-
-                        if (esutils.code.isWhiteSpace(ch)) {
-                            if (!insideString) {
-                                skipWhiteSpace(last);
-                                ch = source.charCodeAt(index);
-                            }
-                        }
-
-                        if (ch === 0x27 /* ''' */) {
-                            if (!insideString) {
-                                insideString = '\'';
-                            } else {
-                                if (insideString === '\'') {
-                                    insideString = '';
-                                }
-                            }
-                        }
-
-                        if (ch === 0x22 /* '"' */) {
-                            if (!insideString) {
-                                insideString = '"';
-                            } else {
-                                if (insideString === '"') {
-                                    insideString = '';
-                                }
-                            }
-                        }
-
-                        if (ch === 0x5B /* '[' */) {
-                            bracketDepth++;
-                        } else if (ch === 0x5D  /* ']' */ &&
-                            --bracketDepth === 0) {
-                            break;
-                        }
-
-                        name += advance();
-                    }
-                }
-
-                skipWhiteSpace(last);
-
-                if (index >= last || source.charCodeAt(index) !== 0x5D  /* ']' */) {
-                    // we never found a closing ']'
-                    return null;
-                }
-
-                // collect the last ']'
-                name += advance();
-            }
-
-            return name;
-        }
-
-        function skipToTag() {
-            while (index < length && source.charCodeAt(index) !== 0x40  /* '@' */) {
-                advance();
-            }
-            if (index >= length) {
-                return false;
-            }
-            utility.assert(source.charCodeAt(index) === 0x40  /* '@' */);
-            return true;
-        }
-
-        function convertIndex(rangeIndex) {
-            if (source === originalSource) {
-                return rangeIndex;
-            }
-            return convertUnwrappedCommentIndex(originalSource, rangeIndex);
-        }
-
-        function TagParser(options, title) {
-            this._options = options;
-            this._title = title.toLowerCase();
-            this._tag = {
-                title: title,
-                description: null
-            };
-            if (this._options.lineNumbers) {
-                this._tag.lineNumber = lineNumber;
-            }
-            this._first = index - title.length - 1;
-            this._last = 0;
-            // space to save special information for title parsers.
-            this._extra = { };
-        }
-
-        // addError(err, ...)
-        TagParser.prototype.addError = function addError(errorText) {
-            var args = Array.prototype.slice.call(arguments, 1),
-                msg = errorText.replace(
-                    /%(\d)/g,
-                    function (whole, index) {
-                        utility.assert(index < args.length, 'Message reference must be in range');
-                        return args[index];
-                    }
-                );
-
-            if (!this._tag.errors) {
-                this._tag.errors = [];
-            }
-            if (strict) {
-                utility.throwError(msg);
-            }
-            this._tag.errors.push(msg);
-            return recoverable;
-        };
-
-        TagParser.prototype.parseType = function () {
-            // type required titles
-            if (isTypeParameterRequired(this._title)) {
-                try {
-                    this._tag.type = parseType(this._title, this._last, this._options.range);
-                    if (!this._tag.type) {
-                        if (!isParamTitle(this._title) && !isReturnTitle(this._title)) {
-                            if (!this.addError('Missing or invalid tag type')) {
-                                return false;
-                            }
-                        }
-                    }
-                } catch (error) {
-                    this._tag.type = null;
-                    if (!this.addError(error.message)) {
-                        return false;
-                    }
-                }
-            } else if (isAllowedType(this._title)) {
-                // optional types
-                try {
-                    this._tag.type = parseType(this._title, this._last, this._options.range);
-                } catch (e) {
-                    //For optional types, lets drop the thrown error when we hit the end of the file
-                }
-            }
-            return true;
-        };
-
-        TagParser.prototype._parseNamePath = function (optional) {
-            var name;
-            name = parseName(this._last, sloppy && isAllowedOptional(this._title), true);
-            if (!name) {
-                if (!optional) {
-                    if (!this.addError('Missing or invalid tag name')) {
-                        return false;
-                    }
-                }
-            }
-            this._tag.name = name;
-            return true;
-        };
-
-        TagParser.prototype.parseNamePath = function () {
-            return this._parseNamePath(false);
-        };
-
-        TagParser.prototype.parseNamePathOptional = function () {
-            return this._parseNamePath(true);
-        };
-
-
-        TagParser.prototype.parseName = function () {
-            var assign, name;
-
-            // param, property requires name
-            if (isAllowedName(this._title)) {
-                this._tag.name = parseName(this._last, sloppy && isAllowedOptional(this._title), isAllowedNested(this._title));
-                if (!this._tag.name) {
-                    if (!isNameParameterRequired(this._title)) {
-                        return true;
-                    }
-
-                    // it's possible the name has already been parsed but interpreted as a type
-                    // it's also possible this is a sloppy declaration, in which case it will be
-                    // fixed at the end
-                    if (isParamTitle(this._title) && this._tag.type && this._tag.type.name) {
-                        this._extra.name = this._tag.type;
-                        this._tag.name = this._tag.type.name;
-                        this._tag.type = null;
-                    } else {
-                        if (!this.addError('Missing or invalid tag name')) {
-                            return false;
-                        }
-                    }
-                } else {
-                    name = this._tag.name;
-                    if (name.charAt(0) === '[' && name.charAt(name.length - 1) === ']') {
-                        // extract the default value if there is one
-                        // example: @param {string} [somebody=John Doe] description
-                        assign = name.substring(1, name.length - 1).split('=');
-                        if (assign.length > 1) {
-                            this._tag['default'] = assign.slice(1).join('=');
-                        }
-                        this._tag.name = assign[0];
-
-                        // convert to an optional type
-                        if (this._tag.type && this._tag.type.type !== 'OptionalType') {
-                            this._tag.type = {
-                                type: 'OptionalType',
-                                expression: this._tag.type
-                            };
-                        }
-                    }
-                }
-            }
-
-
-            return true;
-        };
-
-        TagParser.prototype.parseDescription = function parseDescription() {
-            var description = sliceSource(source, index, this._last).trim();
-            if (description) {
-                if ((/^-\s+/).test(description)) {
-                    description = description.substring(2);
-                }
-                this._tag.description = description;
-            }
-            return true;
-        };
-
-        TagParser.prototype.parseCaption = function parseDescription() {
-            var description = sliceSource(source, index, this._last).trim();
-            var captionStartTag = '<caption>';
-            var captionEndTag = '</caption>';
-            var captionStart = description.indexOf(captionStartTag);
-            var captionEnd = description.indexOf(captionEndTag);
-            if (captionStart >= 0 && captionEnd >= 0) {
-                this._tag.caption = description.substring(
-                    captionStart + captionStartTag.length, captionEnd).trim();
-                this._tag.description = description.substring(captionEnd + captionEndTag.length).trim();
-            } else {
-                this._tag.description = description;
-            }
-            return true;
-        };
-
-        TagParser.prototype.parseKind = function parseKind() {
-            var kind, kinds;
-            kinds = {
-                'class': true,
-                'constant': true,
-                'event': true,
-                'external': true,
-                'file': true,
-                'function': true,
-                'member': true,
-                'mixin': true,
-                'module': true,
-                'namespace': true,
-                'typedef': true
-            };
-            kind = sliceSource(source, index, this._last).trim();
-            this._tag.kind = kind;
-            if (!hasOwnProperty(kinds, kind)) {
-                if (!this.addError('Invalid kind name \'%0\'', kind)) {
-                    return false;
-                }
-            }
-            return true;
-        };
-
-        TagParser.prototype.parseAccess = function parseAccess() {
-            var access;
-            access = sliceSource(source, index, this._last).trim();
-            this._tag.access = access;
-            if (access !== 'private' && access !== 'protected' && access !== 'public') {
-                if (!this.addError('Invalid access name \'%0\'', access)) {
-                    return false;
-                }
-            }
-            return true;
-        };
-
-        TagParser.prototype.parseThis = function parseThis() {
-            // this name may be a name expression (e.g. {foo.bar}),
-            // an union (e.g. {foo.bar|foo.baz}) or a name path (e.g. foo.bar)
-            var value = sliceSource(source, index, this._last).trim();
-            if (value && value.charAt(0) === '{') {
-                var gotType = this.parseType();
-                if (gotType && this._tag.type.type === 'NameExpression' || this._tag.type.type === 'UnionType') {
-                    this._tag.name = this._tag.type.name;
-                    return true;
-                } else {
-                    return this.addError('Invalid name for this');
-                }
-            } else {
-                return this.parseNamePath();
-            }
-        };
-
-        TagParser.prototype.parseVariation = function parseVariation() {
-            var variation, text;
-            text = sliceSource(source, index, this._last).trim();
-            variation = parseFloat(text, 10);
-            this._tag.variation = variation;
-            if (isNaN(variation)) {
-                if (!this.addError('Invalid variation \'%0\'', text)) {
-                    return false;
-                }
-            }
-            return true;
-        };
-
-        TagParser.prototype.ensureEnd = function () {
-            var shouldBeEmpty = sliceSource(source, index, this._last).trim();
-            if (shouldBeEmpty) {
-                if (!this.addError('Unknown content \'%0\'', shouldBeEmpty)) {
-                    return false;
-                }
-            }
-            return true;
-        };
-
-        TagParser.prototype.epilogue = function epilogue() {
-            var description;
-
-            description = this._tag.description;
-            // un-fix potentially sloppy declaration
-            if (isAllowedOptional(this._title) && !this._tag.type && description && description.charAt(0) === '[') {
-                this._tag.type = this._extra.name;
-                if (!this._tag.name) {
-                    this._tag.name = undefined;
-                }
-
-                if (!sloppy) {
-                    if (!this.addError('Missing or invalid tag name')) {
-                        return false;
-                    }
-                }
-            }
-
-            return true;
-        };
-
-        Rules = {
-            // http://usejsdoc.org/tags-access.html
-            'access': ['parseAccess'],
-            // http://usejsdoc.org/tags-alias.html
-            'alias': ['parseNamePath', 'ensureEnd'],
-            // http://usejsdoc.org/tags-augments.html
-            'augments': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
-            // http://usejsdoc.org/tags-constructor.html
-            'constructor': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
-            // Synonym: http://usejsdoc.org/tags-constructor.html
-            'class': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
-            // Synonym: http://usejsdoc.org/tags-extends.html
-            'extends': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
-            // http://usejsdoc.org/tags-example.html
-            'example': ['parseCaption'],
-            // http://usejsdoc.org/tags-deprecated.html
-            'deprecated': ['parseDescription'],
-            // http://usejsdoc.org/tags-global.html
-            'global': ['ensureEnd'],
-            // http://usejsdoc.org/tags-inner.html
-            'inner': ['ensureEnd'],
-            // http://usejsdoc.org/tags-instance.html
-            'instance': ['ensureEnd'],
-            // http://usejsdoc.org/tags-kind.html
-            'kind': ['parseKind'],
-            // http://usejsdoc.org/tags-mixes.html
-            'mixes': ['parseNamePath', 'ensureEnd'],
-            // http://usejsdoc.org/tags-mixin.html
-            'mixin': ['parseNamePathOptional', 'ensureEnd'],
-            // http://usejsdoc.org/tags-member.html
-            'member': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
-            // http://usejsdoc.org/tags-method.html
-            'method': ['parseNamePathOptional', 'ensureEnd'],
-            // http://usejsdoc.org/tags-module.html
-            'module': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
-            // Synonym: http://usejsdoc.org/tags-method.html
-            'func': ['parseNamePathOptional', 'ensureEnd'],
-            // Synonym: http://usejsdoc.org/tags-method.html
-            'function': ['parseNamePathOptional', 'ensureEnd'],
-            // Synonym: http://usejsdoc.org/tags-member.html
-            'var': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
-            // http://usejsdoc.org/tags-name.html
-            'name': ['parseNamePath', 'ensureEnd'],
-            // http://usejsdoc.org/tags-namespace.html
-            'namespace': ['parseType', 'parseNamePathOptional', 'ensureEnd'],
-            // http://usejsdoc.org/tags-private.html
-            'private': ['parseType', 'parseDescription'],
-            // http://usejsdoc.org/tags-protected.html
-            'protected': ['parseType', 'parseDescription'],
-            // http://usejsdoc.org/tags-public.html
-            'public': ['parseType', 'parseDescription'],
-            // http://usejsdoc.org/tags-readonly.html
-            'readonly': ['ensureEnd'],
-            // http://usejsdoc.org/tags-requires.html
-            'requires': ['parseNamePath', 'ensureEnd'],
-            // http://usejsdoc.org/tags-since.html
-            'since': ['parseDescription'],
-            // http://usejsdoc.org/tags-static.html
-            'static': ['ensureEnd'],
-            // http://usejsdoc.org/tags-summary.html
-            'summary': ['parseDescription'],
-            // http://usejsdoc.org/tags-this.html
-            'this': ['parseThis', 'ensureEnd'],
-            // http://usejsdoc.org/tags-todo.html
-            'todo': ['parseDescription'],
-            // http://usejsdoc.org/tags-typedef.html
-            'typedef': ['parseType', 'parseNamePathOptional'],
-            // http://usejsdoc.org/tags-variation.html
-            'variation': ['parseVariation'],
-            // http://usejsdoc.org/tags-version.html
-            'version': ['parseDescription']
-        };
-
-        TagParser.prototype.parse = function parse() {
-            var i, iz, sequences, method;
-
-
-            // empty title
-            if (!this._title) {
-                if (!this.addError('Missing or invalid title')) {
-                    return null;
-                }
-            }
-
-            // Seek to content last index.
-            this._last = seekContent(this._title);
-
-            if (this._options.range) {
-                this._tag.range = [this._first, source.slice(0, this._last).replace(/\s*$/, '').length].map(convertIndex);
-            }
-
-            if (hasOwnProperty(Rules, this._title)) {
-                sequences = Rules[this._title];
-            } else {
-                // default sequences
-                sequences = ['parseType', 'parseName', 'parseDescription', 'epilogue'];
-            }
-
-            for (i = 0, iz = sequences.length; i < iz; ++i) {
-                method = sequences[i];
-                if (!this[method]()) {
-                    return null;
-                }
-            }
-
-            return this._tag;
-        };
-
-        function parseTag(options) {
-            var title, parser, tag;
-
-            // skip to tag
-            if (!skipToTag()) {
-                return null;
-            }
-
-            // scan title
-            title = scanTitle();
-
-            // construct tag parser
-            parser = new TagParser(options, title);
-            tag = parser.parse();
-
-            // Seek global index to end of this tag.
-            while (index < parser._last) {
-                advance();
-            }
-
-            return tag;
-        }
-
-        //
-        // Parse JSDoc
-        //
-
-        function scanJSDocDescription(preserveWhitespace) {
-            var description = '', ch, atAllowed;
-
-            atAllowed = true;
-            while (index < length) {
-                ch = source.charCodeAt(index);
-
-                if (atAllowed && ch === 0x40  /* '@' */) {
-                    break;
-                }
-
-                if (esutils.code.isLineTerminator(ch)) {
-                    atAllowed = true;
-                } else if (atAllowed && !esutils.code.isWhiteSpace(ch)) {
-                    atAllowed = false;
-                }
-
-                description += advance();
-            }
-
-            return preserveWhitespace ? description : description.trim();
-        }
-
-        function parse(comment, options) {
-            var tags = [], tag, description, interestingTags, i, iz;
-
-            if (options === undefined) {
-                options = {};
-            }
-
-            if (typeof options.unwrap === 'boolean' && options.unwrap) {
-                source = unwrapComment(comment);
-            } else {
-                source = comment;
-            }
-
-            originalSource = comment;
-
-            // array of relevant tags
-            if (options.tags) {
-                if (Array.isArray(options.tags)) {
-                    interestingTags = { };
-                    for (i = 0, iz = options.tags.length; i < iz; i++) {
-                        if (typeof options.tags[i] === 'string') {
-                            interestingTags[options.tags[i]] = true;
-                        } else {
-                            utility.throwError('Invalid "tags" parameter: ' + options.tags);
-                        }
-                    }
-                } else {
-                    utility.throwError('Invalid "tags" parameter: ' + options.tags);
-                }
-            }
-
-            length = source.length;
-            index = 0;
-            lineNumber = 0;
-            recoverable = options.recoverable;
-            sloppy = options.sloppy;
-            strict = options.strict;
-
-            description = scanJSDocDescription(options.preserveWhitespace);
-
-            while (true) {
-                tag = parseTag(options);
-                if (!tag) {
-                    break;
-                }
-                if (!interestingTags || interestingTags.hasOwnProperty(tag.title)) {
-                    tags.push(tag);
-                }
-            }
-
-            return {
-                description: description,
-                tags: tags
-            };
-        }
-        exports.parse = parse;
-    }(jsdoc = {}));
-
-    exports.version = utility.VERSION;
-    exports.parse = jsdoc.parse;
-    exports.parseType = typed.parseType;
-    exports.parseParamType = typed.parseParamType;
-    exports.unwrapComment = unwrapComment;
-    exports.Syntax = shallowCopy(typed.Syntax);
-    exports.Error = utility.DoctrineError;
-    exports.type = {
-        Syntax: exports.Syntax,
-        parseType: typed.parseType,
-        parseParamType: typed.parseParamType,
-        stringify: typed.stringify
-    };
-}());
-/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/eslint-plugin-react/node_modules/doctrine/lib/typed.js b/node_modules/eslint-plugin-react/node_modules/doctrine/lib/typed.js
deleted file mode 100644
index bdd3c39..0000000
--- a/node_modules/eslint-plugin-react/node_modules/doctrine/lib/typed.js
+++ /dev/null
@@ -1,1305 +0,0 @@
-/*
- * @fileoverview Type expression parser.
- * @author Yusuke Suzuki <utatane.tea@gmail.com>
- * @author Dan Tao <daniel.tao@gmail.com>
- * @author Andrew Eisenberg <andrew@eisenberg.as>
- */
-
-// "typed", the Type Expression Parser for doctrine.
-
-(function () {
-    'use strict';
-
-    var Syntax,
-        Token,
-        source,
-        length,
-        index,
-        previous,
-        token,
-        value,
-        esutils,
-        utility,
-        rangeOffset,
-        addRange;
-
-    esutils = require('esutils');
-    utility = require('./utility');
-
-    Syntax = {
-        NullableLiteral: 'NullableLiteral',
-        AllLiteral: 'AllLiteral',
-        NullLiteral: 'NullLiteral',
-        UndefinedLiteral: 'UndefinedLiteral',
-        VoidLiteral: 'VoidLiteral',
-        UnionType: 'UnionType',
-        ArrayType: 'ArrayType',
-        RecordType: 'RecordType',
-        FieldType: 'FieldType',
-        FunctionType: 'FunctionType',
-        ParameterType: 'ParameterType',
-        RestType: 'RestType',
-        NonNullableType: 'NonNullableType',
-        OptionalType: 'OptionalType',
-        NullableType: 'NullableType',
-        NameExpression: 'NameExpression',
-        TypeApplication: 'TypeApplication',
-        StringLiteralType: 'StringLiteralType',
-        NumericLiteralType: 'NumericLiteralType',
-        BooleanLiteralType: 'BooleanLiteralType'
-    };
-
-    Token = {
-        ILLEGAL: 0,    // ILLEGAL
-        DOT_LT: 1,     // .<
-        REST: 2,       // ...
-        LT: 3,         // <
-        GT: 4,         // >
-        LPAREN: 5,     // (
-        RPAREN: 6,     // )
-        LBRACE: 7,     // {
-        RBRACE: 8,     // }
-        LBRACK: 9,    // [
-        RBRACK: 10,    // ]
-        COMMA: 11,     // ,
-        COLON: 12,     // :
-        STAR: 13,      // *
-        PIPE: 14,      // |
-        QUESTION: 15,  // ?
-        BANG: 16,      // !
-        EQUAL: 17,     // =
-        NAME: 18,      // name token
-        STRING: 19,    // string
-        NUMBER: 20,    // number
-        EOF: 21
-    };
-
-    function isTypeName(ch) {
-        return '><(){}[],:*|?!='.indexOf(String.fromCharCode(ch)) === -1 && !esutils.code.isWhiteSpace(ch) && !esutils.code.isLineTerminator(ch);
-    }
-
-    function Context(previous, index, token, value) {
-        this._previous = previous;
-        this._index = index;
-        this._token = token;
-        this._value = value;
-    }
-
-    Context.prototype.restore = function () {
-        previous = this._previous;
-        index = this._index;
-        token = this._token;
-        value = this._value;
-    };
-
-    Context.save = function () {
-        return new Context(previous, index, token, value);
-    };
-
-    function maybeAddRange(node, range) {
-        if (addRange) {
-            node.range = [range[0] + rangeOffset, range[1] + rangeOffset];
-        }
-        return node;
-    }
-
-    function advance() {
-        var ch = source.charAt(index);
-        index += 1;
-        return ch;
-    }
-
-    function scanHexEscape(prefix) {
-        var i, len, ch, code = 0;
-
-        len = (prefix === 'u') ? 4 : 2;
-        for (i = 0; i < len; ++i) {
-            if (index < length && esutils.code.isHexDigit(source.charCodeAt(index))) {
-                ch = advance();
-                code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());
-            } else {
-                return '';
-            }
-        }
-        return String.fromCharCode(code);
-    }
-
-    function scanString() {
-        var str = '', quote, ch, code, unescaped, restore; //TODO review removal octal = false
-        quote = source.charAt(index);
-        ++index;
-
-        while (index < length) {
-            ch = advance();
-
-            if (ch === quote) {
-                quote = '';
-                break;
-            } else if (ch === '\\') {
-                ch = advance();
-                if (!esutils.code.isLineTerminator(ch.charCodeAt(0))) {
-                    switch (ch) {
-                    case 'n':
-                        str += '\n';
-                        break;
-                    case 'r':
-                        str += '\r';
-                        break;
-                    case 't':
-                        str += '\t';
-                        break;
-                    case 'u':
-                    case 'x':
-                        restore = index;
-                        unescaped = scanHexEscape(ch);
-                        if (unescaped) {
-                            str += unescaped;
-                        } else {
-                            index = restore;
-                            str += ch;
-                        }
-                        break;
-                    case 'b':
-                        str += '\b';
-                        break;
-                    case 'f':
-                        str += '\f';
-                        break;
-                    case 'v':
-                        str += '\v';
-                        break;
-
-                    default:
-                        if (esutils.code.isOctalDigit(ch.charCodeAt(0))) {
-                            code = '01234567'.indexOf(ch);
-
-                            // \0 is not octal escape sequence
-                            // Deprecating unused code. TODO review removal
-                            //if (code !== 0) {
-                            //    octal = true;
-                            //}
-
-                            if (index < length && esutils.code.isOctalDigit(source.charCodeAt(index))) {
-                                //TODO Review Removal octal = true;
-                                code = code * 8 + '01234567'.indexOf(advance());
-
-                                // 3 digits are only allowed when string starts
-                                // with 0, 1, 2, 3
-                                if ('0123'.indexOf(ch) >= 0 &&
-                                        index < length &&
-                                        esutils.code.isOctalDigit(source.charCodeAt(index))) {
-                                    code = code * 8 + '01234567'.indexOf(advance());
-                                }
-                            }
-                            str += String.fromCharCode(code);
-                        } else {
-                            str += ch;
-                        }
-                        break;
-                    }
-                } else {
-                    if (ch ===  '\r' && source.charCodeAt(index) === 0x0A  /* '\n' */) {
-                        ++index;
-                    }
-                }
-            } else if (esutils.code.isLineTerminator(ch.charCodeAt(0))) {
-                break;
-            } else {
-                str += ch;
-            }
-        }
-
-        if (quote !== '') {
-            utility.throwError('unexpected quote');
-        }
-
-        value = str;
-        return Token.STRING;
-    }
-
-    function scanNumber() {
-        var number, ch;
-
-        number = '';
-        ch = source.charCodeAt(index);
-
-        if (ch !== 0x2E  /* '.' */) {
-            number = advance();
-            ch = source.charCodeAt(index);
-
-            if (number === '0') {
-                if (ch === 0x78  /* 'x' */ || ch === 0x58  /* 'X' */) {
-                    number += advance();
-                    while (index < length) {
-                        ch = source.charCodeAt(index);
-                        if (!esutils.code.isHexDigit(ch)) {
-                            break;
-                        }
-                        number += advance();
-                    }
-
-                    if (number.length <= 2) {
-                        // only 0x
-                        utility.throwError('unexpected token');
-                    }
-
-                    if (index < length) {
-                        ch = source.charCodeAt(index);
-                        if (esutils.code.isIdentifierStartES5(ch)) {
-                            utility.throwError('unexpected token');
-                        }
-                    }
-                    value = parseInt(number, 16);
-                    return Token.NUMBER;
-                }
-
-                if (esutils.code.isOctalDigit(ch)) {
-                    number += advance();
-                    while (index < length) {
-                        ch = source.charCodeAt(index);
-                        if (!esutils.code.isOctalDigit(ch)) {
-                            break;
-                        }
-                        number += advance();
-                    }
-
-                    if (index < length) {
-                        ch = source.charCodeAt(index);
-                        if (esutils.code.isIdentifierStartES5(ch) || esutils.code.isDecimalDigit(ch)) {
-                            utility.throwError('unexpected token');
-                        }
-                    }
-                    value = parseInt(number, 8);
-                    return Token.NUMBER;
-                }
-
-                if (esutils.code.isDecimalDigit(ch)) {
-                    utility.throwError('unexpected token');
-                }
-            }
-
-            while (index < length) {
-                ch = source.charCodeAt(index);
-                if (!esutils.code.isDecimalDigit(ch)) {
-                    break;
-                }
-                number += advance();
-            }
-        }
-
-        if (ch === 0x2E  /* '.' */) {
-            number += advance();
-            while (index < length) {
-                ch = source.charCodeAt(index);
-                if (!esutils.code.isDecimalDigit(ch)) {
-                    break;
-                }
-                number += advance();
-            }
-        }
-
-        if (ch === 0x65  /* 'e' */ || ch === 0x45  /* 'E' */) {
-            number += advance();
-
-            ch = source.charCodeAt(index);
-            if (ch === 0x2B  /* '+' */ || ch === 0x2D  /* '-' */) {
-                number += advance();
-            }
-
-            ch = source.charCodeAt(index);
-            if (esutils.code.isDecimalDigit(ch)) {
-                number += advance();
-                while (index < length) {
-                    ch = source.charCodeAt(index);
-                    if (!esutils.code.isDecimalDigit(ch)) {
-                        break;
-                    }
-                    number += advance();
-                }
-            } else {
-                utility.throwError('unexpected token');
-            }
-        }
-
-        if (index < length) {
-            ch = source.charCodeAt(index);
-            if (esutils.code.isIdentifierStartES5(ch)) {
-                utility.throwError('unexpected token');
-            }
-        }
-
-        value = parseFloat(number);
-        return Token.NUMBER;
-    }
-
-
-    function scanTypeName() {
-        var ch, ch2;
-
-        value = advance();
-        while (index < length && isTypeName(source.charCodeAt(index))) {
-            ch = source.charCodeAt(index);
-            if (ch === 0x2E  /* '.' */) {
-                if ((index + 1) >= length) {
-                    return Token.ILLEGAL;
-                }
-                ch2 = source.charCodeAt(index + 1);
-                if (ch2 === 0x3C  /* '<' */) {
-                    break;
-                }
-            }
-            value += advance();
-        }
-        return Token.NAME;
-    }
-
-    function next() {
-        var ch;
-
-        previous = index;
-
-        while (index < length && esutils.code.isWhiteSpace(source.charCodeAt(index))) {
-            advance();
-        }
-        if (index >= length) {
-            token = Token.EOF;
-            return token;
-        }
-
-        ch = source.charCodeAt(index);
-        switch (ch) {
-        case 0x27:  /* ''' */
-        case 0x22:  /* '"' */
-            token = scanString();
-            return token;
-
-        case 0x3A:  /* ':' */
-            advance();
-            token = Token.COLON;
-            return token;
-
-        case 0x2C:  /* ',' */
-            advance();
-            token = Token.COMMA;
-            return token;
-
-        case 0x28:  /* '(' */
-            advance();
-            token = Token.LPAREN;
-            return token;
-
-        case 0x29:  /* ')' */
-            advance();
-            token = Token.RPAREN;
-            return token;
-
-        case 0x5B:  /* '[' */
-            advance();
-            token = Token.LBRACK;
-            return token;
-
-        case 0x5D:  /* ']' */
-            advance();
-            token = Token.RBRACK;
-            return token;
-
-        case 0x7B:  /* '{' */
-            advance();
-            token = Token.LBRACE;
-            return token;
-
-        case 0x7D:  /* '}' */
-            advance();
-            token = Token.RBRACE;
-            return token;
-
-        case 0x2E:  /* '.' */
-            if (index + 1 < length) {
-                ch = source.charCodeAt(index + 1);
-                if (ch === 0x3C  /* '<' */) {
-                    advance();  // '.'
-                    advance();  // '<'
-                    token = Token.DOT_LT;
-                    return token;
-                }
-
-                if (ch === 0x2E  /* '.' */ && index + 2 < length && source.charCodeAt(index + 2) === 0x2E  /* '.' */) {
-                    advance();  // '.'
-                    advance();  // '.'
-                    advance();  // '.'
-                    token = Token.REST;
-                    return token;
-                }
-
-                if (esutils.code.isDecimalDigit(ch)) {
-                    token = scanNumber();
-                    return token;
-                }
-            }
-            token = Token.ILLEGAL;
-            return token;
-
-        case 0x3C:  /* '<' */
-            advance();
-            token = Token.LT;
-            return token;
-
-        case 0x3E:  /* '>' */
-            advance();
-            token = Token.GT;
-            return token;
-
-        case 0x2A:  /* '*' */
-            advance();
-            token = Token.STAR;
-            return token;
-
-        case 0x7C:  /* '|' */
-            advance();
-            token = Token.PIPE;
-            return token;
-
-        case 0x3F:  /* '?' */
-            advance();
-            token = Token.QUESTION;
-            return token;
-
-        case 0x21:  /* '!' */
-            advance();
-            token = Token.BANG;
-            return token;
-
-        case 0x3D:  /* '=' */
-            advance();
-            token = Token.EQUAL;
-            return token;
-
-        case 0x2D: /* '-' */
-            token = scanNumber();
-            return token;
-
-        default:
-            if (esutils.code.isDecimalDigit(ch)) {
-                token = scanNumber();
-                return token;
-            }
-
-            // type string permits following case,
-            //
-            // namespace.module.MyClass
-            //
-            // this reduced 1 token TK_NAME
-            utility.assert(isTypeName(ch));
-            token = scanTypeName();
-            return token;
-        }
-    }
-
-    function consume(target, text) {
-        utility.assert(token === target, text || 'consumed token not matched');
-        next();
-    }
-
-    function expect(target, message) {
-        if (token !== target) {
-            utility.throwError(message || 'unexpected token');
-        }
-        next();
-    }
-
-    // UnionType := '(' TypeUnionList ')'
-    //
-    // TypeUnionList :=
-    //     <<empty>>
-    //   | NonemptyTypeUnionList
-    //
-    // NonemptyTypeUnionList :=
-    //     TypeExpression
-    //   | TypeExpression '|' NonemptyTypeUnionList
-    function parseUnionType() {
-        var elements, startIndex = index - 1;
-        consume(Token.LPAREN, 'UnionType should start with (');
-        elements = [];
-        if (token !== Token.RPAREN) {
-            while (true) {
-                elements.push(parseTypeExpression());
-                if (token === Token.RPAREN) {
-                    break;
-                }
-                expect(Token.PIPE);
-            }
-        }
-        consume(Token.RPAREN, 'UnionType should end with )');
-        return maybeAddRange({
-            type: Syntax.UnionType,
-            elements: elements
-        }, [startIndex, previous]);
-    }
-
-    // ArrayType := '[' ElementTypeList ']'
-    //
-    // ElementTypeList :=
-    //     <<empty>>
-    //  | TypeExpression
-    //  | '...' TypeExpression
-    //  | TypeExpression ',' ElementTypeList
-    function parseArrayType() {
-        var elements, startIndex = index - 1, restStartIndex;
-        consume(Token.LBRACK, 'ArrayType should start with [');
-        elements = [];
-        while (token !== Token.RBRACK) {
-            if (token === Token.REST) {
-                restStartIndex = index - 3;
-                consume(Token.REST);
-                elements.push(maybeAddRange({
-                    type: Syntax.RestType,
-                    expression: parseTypeExpression()
-                }, [restStartIndex, previous]));
-                break;
-            } else {
-                elements.push(parseTypeExpression());
-            }
-            if (token !== Token.RBRACK) {
-                expect(Token.COMMA);
-            }
-        }
-        expect(Token.RBRACK);
-        return maybeAddRange({
-            type: Syntax.ArrayType,
-            elements: elements
-        }, [startIndex, previous]);
-    }
-
-    function parseFieldName() {
-        var v = value;
-        if (token === Token.NAME || token === Token.STRING) {
-            next();
-            return v;
-        }
-
-        if (token === Token.NUMBER) {
-            consume(Token.NUMBER);
-            return String(v);
-        }
-
-        utility.throwError('unexpected token');
-    }
-
-    // FieldType :=
-    //     FieldName
-    //   | FieldName ':' TypeExpression
-    //
-    // FieldName :=
-    //     NameExpression
-    //   | StringLiteral
-    //   | NumberLiteral
-    //   | ReservedIdentifier
-    function parseFieldType() {
-        var key, rangeStart = previous;
-
-        key = parseFieldName();
-        if (token === Token.COLON) {
-            consume(Token.COLON);
-            return maybeAddRange({
-                type: Syntax.FieldType,
-                key: key,
-                value: parseTypeExpression()
-            }, [rangeStart, previous]);
-        }
-        return maybeAddRange({
-            type: Syntax.FieldType,
-            key: key,
-            value: null
-        }, [rangeStart, previous]);
-    }
-
-    // RecordType := '{' FieldTypeList '}'
-    //
-    // FieldTypeList :=
-    //     <<empty>>
-    //   | FieldType
-    //   | FieldType ',' FieldTypeList
-    function parseRecordType() {
-        var fields, rangeStart = index - 1, rangeEnd;
-
-        consume(Token.LBRACE, 'RecordType should start with {');
-        fields = [];
-        if (token === Token.COMMA) {
-            consume(Token.COMMA);
-        } else {
-            while (token !== Token.RBRACE) {
-                fields.push(parseFieldType());
-                if (token !== Token.RBRACE) {
-                    expect(Token.COMMA);
-                }
-            }
-        }
-        rangeEnd = index;
-        expect(Token.RBRACE);
-        return maybeAddRange({
-            type: Syntax.RecordType,
-            fields: fields
-        }, [rangeStart, rangeEnd]);
-    }
-
-    // NameExpression :=
-    //    Identifier
-    //  | TagIdentifier ':' Identifier
-    //
-    // Tag identifier is one of "module", "external" or "event"
-    // Identifier is the same as Token.NAME, including any dots, something like
-    // namespace.module.MyClass
-    function parseNameExpression() {
-        var name = value, rangeStart = index - name.length;
-        expect(Token.NAME);
-
-        if (token === Token.COLON && (
-                name === 'module' ||
-                name === 'external' ||
-                name === 'event')) {
-            consume(Token.COLON);
-            name += ':' + value;
-            expect(Token.NAME);
-        }
-
-        return maybeAddRange({
-            type: Syntax.NameExpression,
-            name: name
-        }, [rangeStart, previous]);
-    }
-
-    // TypeExpressionList :=
-    //     TopLevelTypeExpression
-    //   | TopLevelTypeExpression ',' TypeExpressionList
-    function parseTypeExpressionList() {
-        var elements = [];
-
-        elements.push(parseTop());
-        while (token === Token.COMMA) {
-            consume(Token.COMMA);
-            elements.push(parseTop());
-        }
-        return elements;
-    }
-
-    // TypeName :=
-    //     NameExpression
-    //   | NameExpression TypeApplication
-    //
-    // TypeApplication :=
-    //     '.<' TypeExpressionList '>'
-    //   | '<' TypeExpressionList '>'   // this is extension of doctrine
-    function parseTypeName() {
-        var expr, applications, startIndex = index - value.length;
-
-        expr = parseNameExpression();
-        if (token === Token.DOT_LT || token === Token.LT) {
-            next();
-            applications = parseTypeExpressionList();
-            expect(Token.GT);
-            return maybeAddRange({
-                type: Syntax.TypeApplication,
-                expression: expr,
-                applications: applications
-            }, [startIndex, previous]);
-        }
-        return expr;
-    }
-
-    // ResultType :=
-    //     <<empty>>
-    //   | ':' void
-    //   | ':' TypeExpression
-    //
-    // BNF is above
-    // but, we remove <<empty>> pattern, so token is always TypeToken::COLON
-    function parseResultType() {
-        consume(Token.COLON, 'ResultType should start with :');
-        if (token === Token.NAME && value === 'void') {
-            consume(Token.NAME);
-            return {
-                type: Syntax.VoidLiteral
-            };
-        }
-        return parseTypeExpression();
-    }
-
-    // ParametersType :=
-    //     RestParameterType
-    //   | NonRestParametersType
-    //   | NonRestParametersType ',' RestParameterType
-    //
-    // RestParameterType :=
-    //     '...'
-    //     '...' Identifier
-    //
-    // NonRestParametersType :=
-    //     ParameterType ',' NonRestParametersType
-    //   | ParameterType
-    //   | OptionalParametersType
-    //
-    // OptionalParametersType :=
-    //     OptionalParameterType
-    //   | OptionalParameterType, OptionalParametersType
-    //
-    // OptionalParameterType := ParameterType=
-    //
-    // ParameterType := TypeExpression | Identifier ':' TypeExpression
-    //
-    // Identifier is "new" or "this"
-    function parseParametersType() {
-        var params = [], optionalSequence = false, expr, rest = false, startIndex, restStartIndex = index - 3, nameStartIndex;
-
-        while (token !== Token.RPAREN) {
-            if (token === Token.REST) {
-                // RestParameterType
-                consume(Token.REST);
-                rest = true;
-            }
-
-            startIndex = previous;
-
-            expr = parseTypeExpression();
-            if (expr.type === Syntax.NameExpression && token === Token.COLON) {
-                nameStartIndex = previous - expr.name.length;
-                // Identifier ':' TypeExpression
-                consume(Token.COLON);
-                expr = maybeAddRange({
-                    type: Syntax.ParameterType,
-                    name: expr.name,
-                    expression: parseTypeExpression()
-                }, [nameStartIndex, previous]);
-            }
-            if (token === Token.EQUAL) {
-                consume(Token.EQUAL);
-                expr = maybeAddRange({
-                    type: Syntax.OptionalType,
-                    expression: expr
-                }, [startIndex, previous]);
-                optionalSequence = true;
-            } else {
-                if (optionalSequence) {
-                    utility.throwError('unexpected token');
-                }
-            }
-            if (rest) {
-                expr = maybeAddRange({
-                    type: Syntax.RestType,
-                    expression: expr
-                }, [restStartIndex, previous]);
-            }
-            params.push(expr);
-            if (token !== Token.RPAREN) {
-                expect(Token.COMMA);
-            }
-        }
-        return params;
-    }
-
-    // FunctionType := 'function' FunctionSignatureType
-    //
-    // FunctionSignatureType :=
-    //   | TypeParameters '(' ')' ResultType
-    //   | TypeParameters '(' ParametersType ')' ResultType
-    //   | TypeParameters '(' 'this' ':' TypeName ')' ResultType
-    //   | TypeParameters '(' 'this' ':' TypeName ',' ParametersType ')' ResultType
-    function parseFunctionType() {
-        var isNew, thisBinding, params, result, fnType, startIndex = index - value.length;
-        utility.assert(token === Token.NAME && value === 'function', 'FunctionType should start with \'function\'');
-        consume(Token.NAME);
-
-        // Google Closure Compiler is not implementing TypeParameters.
-        // So we do not. if we don't get '(', we see it as error.
-        expect(Token.LPAREN);
-
-        isNew = false;
-        params = [];
-        thisBinding = null;
-        if (token !== Token.RPAREN) {
-            // ParametersType or 'this'
-            if (token === Token.NAME &&
-                    (value === 'this' || value === 'new')) {
-                // 'this' or 'new'
-                // 'new' is Closure Compiler extension
-                isNew = value === 'new';
-                consume(Token.NAME);
-                expect(Token.COLON);
-                thisBinding = parseTypeName();
-                if (token === Token.COMMA) {
-                    consume(Token.COMMA);
-                    params = parseParametersType();
-                }
-            } else {
-                params = parseParametersType();
-            }
-        }
-
-        expect(Token.RPAREN);
-
-        result = null;
-        if (token === Token.COLON) {
-            result = parseResultType();
-        }
-
-        fnType = maybeAddRange({
-            type: Syntax.FunctionType,
-            params: params,
-            result: result
-        }, [startIndex, previous]);
-        if (thisBinding) {
-            // avoid adding null 'new' and 'this' properties
-            fnType['this'] = thisBinding;
-            if (isNew) {
-                fnType['new'] = true;
-            }
-        }
-        return fnType;
-    }
-
-    // BasicTypeExpression :=
-    //     '*'
-    //   | 'null'
-    //   | 'undefined'
-    //   | TypeName
-    //   | FunctionType
-    //   | UnionType
-    //   | RecordType
-    //   | ArrayType
-    function parseBasicTypeExpression() {
-        var context, startIndex;
-        switch (token) {
-        case Token.STAR:
-            consume(Token.STAR);
-            return maybeAddRange({
-                type: Syntax.AllLiteral
-            }, [previous - 1, previous]);
-
-        case Token.LPAREN:
-            return parseUnionType();
-
-        case Token.LBRACK:
-            return parseArrayType();
-
-        case Token.LBRACE:
-            return parseRecordType();
-
-        case Token.NAME:
-            startIndex = index - value.length;
-
-            if (value === 'null') {
-                consume(Token.NAME);
-                return maybeAddRange({
-                    type: Syntax.NullLiteral
-                }, [startIndex, previous]);
-            }
-
-            if (value === 'undefined') {
-                consume(Token.NAME);
-                return maybeAddRange({
-                    type: Syntax.UndefinedLiteral
-                }, [startIndex, previous]);
-            }
-
-            if (value === 'true' || value === 'false') {
-                consume(Token.NAME);
-                return maybeAddRange({
-                    type: Syntax.BooleanLiteralType,
-                    value: value === 'true'
-                }, [startIndex, previous]);
-            }
-
-            context = Context.save();
-            if (value === 'function') {
-                try {
-                    return parseFunctionType();
-                } catch (e) {
-                    context.restore();
-                }
-            }
-
-            return parseTypeName();
-
-        case Token.STRING:
-            next();
-            return maybeAddRange({
-                type: Syntax.StringLiteralType,
-                value: value
-            }, [previous - value.length - 2, previous]);
-
-        case Token.NUMBER:
-            next();
-            return maybeAddRange({
-                type: Syntax.NumericLiteralType,
-                value: value
-            }, [previous - String(value).length, previous]);
-
-        default:
-            utility.throwError('unexpected token');
-        }
-    }
-
-    // TypeExpression :=
-    //     BasicTypeExpression
-    //   | '?' BasicTypeExpression
-    //   | '!' BasicTypeExpression
-    //   | BasicTypeExpression '?'
-    //   | BasicTypeExpression '!'
-    //   | '?'
-    //   | BasicTypeExpression '[]'
-    function parseTypeExpression() {
-        var expr, rangeStart;
-
-        if (token === Token.QUESTION) {
-            rangeStart = index - 1;
-            consume(Token.QUESTION);
-            if (token === Token.COMMA || token === Token.EQUAL || token === Token.RBRACE ||
-                    token === Token.RPAREN || token === Token.PIPE || token === Token.EOF ||
-                    token === Token.RBRACK || token === Token.GT) {
-                return maybeAddRange({
-                    type: Syntax.NullableLiteral
-                }, [rangeStart, previous]);
-            }
-            return maybeAddRange({
-                type: Syntax.NullableType,
-                expression: parseBasicTypeExpression(),
-                prefix: true
-            }, [rangeStart, previous]);
-        } else if (token === Token.BANG) {
-            rangeStart = index - 1;
-            consume(Token.BANG);
-            return maybeAddRange({
-                type: Syntax.NonNullableType,
-                expression: parseBasicTypeExpression(),
-                prefix: true
-            }, [rangeStart, previous]);
-        } else {
-            rangeStart = previous;
-        }
-
-        expr = parseBasicTypeExpression();
-        if (token === Token.BANG) {
-            consume(Token.BANG);
-            return maybeAddRange({
-                type: Syntax.NonNullableType,
-                expression: expr,
-                prefix: false
-            }, [rangeStart, previous]);
-        }
-
-        if (token === Token.QUESTION) {
-            consume(Token.QUESTION);
-            return maybeAddRange({
-                type: Syntax.NullableType,
-                expression: expr,
-                prefix: false
-            }, [rangeStart, previous]);
-        }
-
-        if (token === Token.LBRACK) {
-            consume(Token.LBRACK);
-            expect(Token.RBRACK, 'expected an array-style type declaration (' + value + '[])');
-            return maybeAddRange({
-                type: Syntax.TypeApplication,
-                expression: maybeAddRange({
-                    type: Syntax.NameExpression,
-                    name: 'Array'
-                }, [rangeStart, previous]),
-                applications: [expr]
-            }, [rangeStart, previous]);
-        }
-
-        return expr;
-    }
-
-    // TopLevelTypeExpression :=
-    //      TypeExpression
-    //    | TypeUnionList
-    //
-    // This rule is Google Closure Compiler extension, not ES4
-    // like,
-    //   { number | string }
-    // If strict to ES4, we should write it as
-    //   { (number|string) }
-    function parseTop() {
-        var expr, elements;
-
-        expr = parseTypeExpression();
-        if (token !== Token.PIPE) {
-            return expr;
-        }
-
-        elements = [expr];
-        consume(Token.PIPE);
-        while (true) {
-            elements.push(parseTypeExpression());
-            if (token !== Token.PIPE) {
-                break;
-            }
-            consume(Token.PIPE);
-        }
-
-        return maybeAddRange({
-            type: Syntax.UnionType,
-            elements: elements
-        }, [0, index]);
-    }
-
-    function parseTopParamType() {
-        var expr;
-
-        if (token === Token.REST) {
-            consume(Token.REST);
-            return maybeAddRange({
-                type: Syntax.RestType,
-                expression: parseTop()
-            }, [0, index]);
-        }
-
-        expr = parseTop();
-        if (token === Token.EQUAL) {
-            consume(Token.EQUAL);
-            return maybeAddRange({
-                type: Syntax.OptionalType,
-                expression: expr
-            }, [0, index]);
-        }
-
-        return expr;
-    }
-
-    function parseType(src, opt) {
-        var expr;
-
-        source = src;
-        length = source.length;
-        index = 0;
-        previous = 0;
-        addRange = opt && opt.range;
-        rangeOffset = opt && opt.startIndex || 0;
-
-        next();
-        expr = parseTop();
-
-        if (opt && opt.midstream) {
-            return {
-                expression: expr,
-                index: previous
-            };
-        }
-
-        if (token !== Token.EOF) {
-            utility.throwError('not reach to EOF');
-        }
-
-        return expr;
-    }
-
-    function parseParamType(src, opt) {
-        var expr;
-
-        source = src;
-        length = source.length;
-        index = 0;
-        previous = 0;
-        addRange = opt && opt.range;
-        rangeOffset = opt && opt.startIndex || 0;
-
-        next();
-        expr = parseTopParamType();
-
-        if (opt && opt.midstream) {
-            return {
-                expression: expr,
-                index: previous
-            };
-        }
-
-        if (token !== Token.EOF) {
-            utility.throwError('not reach to EOF');
-        }
-
-        return expr;
-    }
-
-    function stringifyImpl(node, compact, topLevel) {
-        var result, i, iz;
-
-        switch (node.type) {
-        case Syntax.NullableLiteral:
-            result = '?';
-            break;
-
-        case Syntax.AllLiteral:
-            result = '*';
-            break;
-
-        case Syntax.NullLiteral:
-            result = 'null';
-            break;
-
-        case Syntax.UndefinedLiteral:
-            result = 'undefined';
-            break;
-
-        case Syntax.VoidLiteral:
-            result = 'void';
-            break;
-
-        case Syntax.UnionType:
-            if (!topLevel) {
-                result = '(';
-            } else {
-                result = '';
-            }
-
-            for (i = 0, iz = node.elements.length; i < iz; ++i) {
-                result += stringifyImpl(node.elements[i], compact);
-                if ((i + 1) !== iz) {
-                    result += compact ? '|' : ' | ';
-                }
-            }
-
-            if (!topLevel) {
-                result += ')';
-            }
-            break;
-
-        case Syntax.ArrayType:
-            result = '[';
-            for (i = 0, iz = node.elements.length; i < iz; ++i) {
-                result += stringifyImpl(node.elements[i], compact);
-                if ((i + 1) !== iz) {
-                    result += compact ? ',' : ', ';
-                }
-            }
-            result += ']';
-            break;
-
-        case Syntax.RecordType:
-            result = '{';
-            for (i = 0, iz = node.fields.length; i < iz; ++i) {
-                result += stringifyImpl(node.fields[i], compact);
-                if ((i + 1) !== iz) {
-                    result += compact ? ',' : ', ';
-                }
-            }
-            result += '}';
-            break;
-
-        case Syntax.FieldType:
-            if (node.value) {
-                result = node.key + (compact ? ':' : ': ') + stringifyImpl(node.value, compact);
-            } else {
-                result = node.key;
-            }
-            break;
-
-        case Syntax.FunctionType:
-            result = compact ? 'function(' : 'function (';
-
-            if (node['this']) {
-                if (node['new']) {
-                    result += (compact ? 'new:' : 'new: ');
-                } else {
-                    result += (compact ? 'this:' : 'this: ');
-                }
-
-                result += stringifyImpl(node['this'], compact);
-
-                if (node.params.length !== 0) {
-                    result += compact ? ',' : ', ';
-                }
-            }
-
-            for (i = 0, iz = node.params.length; i < iz; ++i) {
-                result += stringifyImpl(node.params[i], compact);
-                if ((i + 1) !== iz) {
-                    result += compact ? ',' : ', ';
-                }
-            }
-
-            result += ')';
-
-            if (node.result) {
-                result += (compact ? ':' : ': ') + stringifyImpl(node.result, compact);
-            }
-            break;
-
-        case Syntax.ParameterType:
-            result = node.name + (compact ? ':' : ': ') + stringifyImpl(node.expression, compact);
-            break;
-
-        case Syntax.RestType:
-            result = '...';
-            if (node.expression) {
-                result += stringifyImpl(node.expression, compact);
-            }
-            break;
-
-        case Syntax.NonNullableType:
-            if (node.prefix) {
-                result = '!' + stringifyImpl(node.expression, compact);
-            } else {
-                result = stringifyImpl(node.expression, compact) + '!';
-            }
-            break;
-
-        case Syntax.OptionalType:
-            result = stringifyImpl(node.expression, compact) + '=';
-            break;
-
-        case Syntax.NullableType:
-            if (node.prefix) {
-                result = '?' + stringifyImpl(node.expression, compact);
-            } else {
-                result = stringifyImpl(node.expression, compact) + '?';
-            }
-            break;
-
-        case Syntax.NameExpression:
-            result = node.name;
-            break;
-
-        case Syntax.TypeApplication:
-            result = stringifyImpl(node.expression, compact) + '.<';
-            for (i = 0, iz = node.applications.length; i < iz; ++i) {
-                result += stringifyImpl(node.applications[i], compact);
-                if ((i + 1) !== iz) {
-                    result += compact ? ',' : ', ';
-                }
-            }
-            result += '>';
-            break;
-
-        case Syntax.StringLiteralType:
-            result = '"' + node.value + '"';
-            break;
-
-        case Syntax.NumericLiteralType:
-            result = String(node.value);
-            break;
-
-        case Syntax.BooleanLiteralType:
-            result = String(node.value);
-            break;
-
-        default:
-            utility.throwError('Unknown type ' + node.type);
-        }
-
-        return result;
-    }
-
-    function stringify(node, options) {
-        if (options == null) {
-            options = {};
-        }
-        return stringifyImpl(node, options.compact, options.topLevel);
-    }
-
-    exports.parseType = parseType;
-    exports.parseParamType = parseParamType;
-    exports.stringify = stringify;
-    exports.Syntax = Syntax;
-}());
-/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/eslint-plugin-react/node_modules/doctrine/lib/utility.js b/node_modules/eslint-plugin-react/node_modules/doctrine/lib/utility.js
deleted file mode 100644
index 381580e..0000000
--- a/node_modules/eslint-plugin-react/node_modules/doctrine/lib/utility.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * @fileoverview Utilities for Doctrine
- * @author Yusuke Suzuki <utatane.tea@gmail.com>
- */
-
-
-(function () {
-    'use strict';
-
-    var VERSION;
-
-    VERSION = require('../package.json').version;
-    exports.VERSION = VERSION;
-
-    function DoctrineError(message) {
-        this.name = 'DoctrineError';
-        this.message = message;
-    }
-    DoctrineError.prototype = (function () {
-        var Middle = function () { };
-        Middle.prototype = Error.prototype;
-        return new Middle();
-    }());
-    DoctrineError.prototype.constructor = DoctrineError;
-    exports.DoctrineError = DoctrineError;
-
-    function throwError(message) {
-        throw new DoctrineError(message);
-    }
-    exports.throwError = throwError;
-
-    exports.assert = require('assert');
-}());
-
-/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/eslint-plugin-react/node_modules/doctrine/package.json b/node_modules/eslint-plugin-react/node_modules/doctrine/package.json
deleted file mode 100644
index 92667d3..0000000
--- a/node_modules/eslint-plugin-react/node_modules/doctrine/package.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
-  "name": "doctrine",
-  "description": "JSDoc parser",
-  "homepage": "https://github.com/eslint/doctrine",
-  "main": "lib/doctrine.js",
-  "version": "2.1.0",
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "directories": {
-    "lib": "./lib"
-  },
-  "files": [
-    "lib"
-  ],
-  "maintainers": [
-    {
-      "name": "Nicholas C. Zakas",
-      "email": "nicholas+npm@nczconsulting.com",
-      "web": "https://www.nczonline.net"
-    },
-    {
-      "name": "Yusuke Suzuki",
-      "email": "utatane.tea@gmail.com",
-      "web": "https://github.com/Constellation"
-    }
-  ],
-  "repository": "eslint/doctrine",
-  "devDependencies": {
-    "coveralls": "^2.11.2",
-    "dateformat": "^1.0.11",
-    "eslint": "^1.10.3",
-    "eslint-release": "^0.10.0",
-    "linefix": "^0.1.1",
-    "mocha": "^3.4.2",
-    "npm-license": "^0.3.1",
-    "nyc": "^10.3.2",
-    "semver": "^5.0.3",
-    "shelljs": "^0.5.3",
-    "shelljs-nodecli": "^0.1.1",
-    "should": "^5.0.1"
-  },
-  "license": "Apache-2.0",
-  "scripts": {
-    "pretest": "npm run lint",
-    "test": "nyc mocha",
-    "coveralls": "nyc report --reporter=text-lcov | coveralls",
-    "lint": "eslint lib/",
-    "release": "eslint-release",
-    "ci-release": "eslint-ci-release",
-    "alpharelease": "eslint-prerelease alpha",
-    "betarelease": "eslint-prerelease beta"
-  },
-  "dependencies": {
-    "esutils": "^2.0.2"
-  }
-}
diff --git a/node_modules/eslint-plugin-react/package.json b/node_modules/eslint-plugin-react/package.json
deleted file mode 100644
index 8b64193..0000000
--- a/node_modules/eslint-plugin-react/package.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
-  "name": "eslint-plugin-react",
-  "version": "7.19.0",
-  "author": "Yannick Croissant <yannick.croissant+npm@gmail.com>",
-  "description": "React specific linting rules for ESLint",
-  "main": "index.js",
-  "scripts": {
-    "coveralls": "cat ./coverage/lcov.info | coveralls",
-    "lint": "eslint ./",
-    "postlint": "npm run type-check",
-    "pretest": "npm run lint",
-    "test": "npm run unit-test",
-    "type-check": "tsc",
-    "unit-test": "istanbul cover node_modules/mocha/bin/_mocha tests/lib/**/*.js tests/util/**/*.js tests/index.js",
-    "generate-list-of-rules": "md-magic --path README.md",
-    "generate-list-of-rules:check": "npm run generate-list-of-rules && git diff --exit-code README.md"
-  },
-  "files": [
-    "LICENSE",
-    "README.md",
-    "index.js",
-    "lib"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/yannickcr/eslint-plugin-react"
-  },
-  "homepage": "https://github.com/yannickcr/eslint-plugin-react",
-  "bugs": "https://github.com/yannickcr/eslint-plugin-react/issues",
-  "dependencies": {
-    "array-includes": "^3.1.1",
-    "doctrine": "^2.1.0",
-    "has": "^1.0.3",
-    "jsx-ast-utils": "^2.2.3",
-    "object.entries": "^1.1.1",
-    "object.fromentries": "^2.0.2",
-    "object.values": "^1.1.1",
-    "prop-types": "^15.7.2",
-    "resolve": "^1.15.1",
-    "semver": "^6.3.0",
-    "string.prototype.matchall": "^4.0.2",
-    "xregexp": "^4.3.0"
-  },
-  "devDependencies": {
-    "@types/eslint": "^6.1.8",
-    "@types/estree": "0.0.42",
-    "@types/node": "^13.7.4",
-    "babel-eslint": "^8.2.6",
-    "coveralls": "^3.0.9",
-    "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0",
-    "eslint-config-airbnb-base": "^13.2.0",
-    "eslint-plugin-eslint-plugin": "^2.2.1",
-    "eslint-plugin-import": "^2.20.1",
-    "istanbul": "^0.4.5",
-    "markdown-magic": "^1.0.0",
-    "mocha": "^5.2.0",
-    "sinon": "^7.5.0",
-    "typescript": "^3.8.2",
-    "typescript-eslint-parser": "^20.1.1"
-  },
-  "peerDependencies": {
-    "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0"
-  },
-  "engines": {
-    "node": ">=4"
-  },
-  "keywords": [
-    "eslint",
-    "eslint-plugin",
-    "eslintplugin",
-    "react"
-  ],
-  "license": "MIT",
-  "greenkeeper": {
-    "ignore": [
-      "semver"
-    ]
-  }
-}
diff --git a/node_modules/eslint-plugin-relay/LICENSE b/node_modules/eslint-plugin-relay/LICENSE
deleted file mode 100644
index b96dcb0..0000000
--- a/node_modules/eslint-plugin-relay/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) Facebook, Inc. and its affiliates.
-
-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/node_modules/eslint-plugin-relay/README.md b/node_modules/eslint-plugin-relay/README.md
deleted file mode 100644
index e0ed3ab..0000000
--- a/node_modules/eslint-plugin-relay/README.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# eslint-plugin-relay [![Build Status](https://travis-ci.org/relayjs/eslint-plugin-relay.svg?branch=master)](https://travis-ci.org/relayjs/eslint-plugin-relay) [![npm version](https://badge.fury.io/js/eslint-plugin-relay.svg)](http://badge.fury.io/js/eslint-plugin-relay)
-
-`eslint-plugin-relay` is a plugin for [ESLint](http://eslint.org/) to catch common problems in code using [Relay](https://facebook.github.io/relay/) early.
-
-## Install
-
-`npm i --save-dev eslint-plugin-relay`
-
-## How To Use
-
-1.  Add `"relay"` to your eslint `plugins` section.
-2.  Add the relay rules such as `"relay/graphql-syntax": "error"` to your eslint `rules` section, see the example for all rules.
-
-Example .eslintrc.js:
-
-```js
-module.exports = {
-  // Other eslint properties here
-  rules: {
-    'relay/graphql-syntax': 'error',
-    'relay/compat-uses-vars': 'warn',
-    'relay/graphql-naming': 'error',
-    'relay/generated-flow-types': 'warn',
-    'relay/no-future-added-value': 'warn',
-    'relay/unused-fields': 'warn'
-  },
-  plugins: ['relay']
-};
-```
-
-You can also enable all the recommended or strict rules at once.
-Add `plugin:relay/recommended` or `plugin:relay/strict` in `extends`:
-
-```js
-{
-  "extends": [
-    "plugin:relay/recommended"
-  ]
-}
-```
-
-## Contribute
-
-We actively welcome pull requests, learn how to [contribute](./CONTRIBUTING.md).
-
-## License
-
-`eslint-plugin-relay` is [MIT licensed](./LICENSE).
diff --git a/node_modules/eslint-plugin-relay/eslint-plugin-relay.js b/node_modules/eslint-plugin-relay/eslint-plugin-relay.js
deleted file mode 100644
index 41962ba..0000000
--- a/node_modules/eslint-plugin-relay/eslint-plugin-relay.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-module.exports = {
-  rules: {
-    'graphql-syntax': require('./src/rule-graphql-syntax'),
-    'compat-uses-vars': require('./src/rule-compat-uses-vars'),
-    'graphql-naming': require('./src/rule-graphql-naming'),
-    'generated-flow-types': require('./src/rule-generated-flow-types'),
-    'no-future-added-value': require('./src/rule-no-future-added-value'),
-    'unused-fields': require('./src/rule-unused-fields'),
-    'hook-required-argument': require('./src/rule-hook-required-argument')
-  },
-  configs: {
-    recommended: {
-      rules: {
-        'relay/graphql-syntax': 'error',
-        'relay/compat-uses-vars': 'warn',
-        'relay/graphql-naming': 'error',
-        'relay/generated-flow-types': 'warn',
-        'relay/no-future-added-value': 'warn',
-        'relay/unused-fields': 'warn',
-        'relay/hook-required-argument': 'warn'
-      }
-    },
-    strict: {
-      rules: {
-        'relay/graphql-syntax': 'error',
-        'relay/compat-uses-vars': 'error',
-        'relay/graphql-naming': 'error',
-        'relay/generated-flow-types': 'error',
-        'relay/no-future-added-value': 'error',
-        'relay/unused-fields': 'error',
-        'relay/hook-required-argument': 'error'
-      }
-    }
-  }
-};
diff --git a/node_modules/eslint-plugin-relay/package.json b/node_modules/eslint-plugin-relay/package.json
deleted file mode 100644
index d0adb1c..0000000
--- a/node_modules/eslint-plugin-relay/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "name": "eslint-plugin-relay",
-  "version": "1.7.0",
-  "description": "ESLint plugin for Relay.",
-  "main": "eslint-plugin-relay",
-  "repository": "relayjs/eslint-plugin-relay",
-  "license": "MIT",
-  "scripts": {
-    "lint": "eslint eslint-plugin-relay.js src",
-    "test": "mocha",
-    "test-watch": "mocha --watch",
-    "prettier": "prettier --write '**/*.js'"
-  },
-  "files": [
-    "eslint-plugin-relay.js",
-    "src/",
-    "LICENSE"
-  ],
-  "dependencies": {
-    "graphql": "^14.0.0 | ^15.0.0-rc.1"
-  },
-  "devDependencies": {
-    "babel-eslint": "^10.0.1",
-    "eslint": "^5.15.1",
-    "eslint-config-prettier": "^4.1.0",
-    "eslint-plugin-prettier": "^3.0.1",
-    "mocha": "^6.0.2",
-    "prettier": "^1.19.1"
-  }
-}
diff --git a/node_modules/eslint-plugin-relay/src/rule-compat-uses-vars.js b/node_modules/eslint-plugin-relay/src/rule-compat-uses-vars.js
deleted file mode 100644
index 21f6a29..0000000
--- a/node_modules/eslint-plugin-relay/src/rule-compat-uses-vars.js
+++ /dev/null
@@ -1,144 +0,0 @@
-/**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-const utils = require('./utils');
-const shouldLint = utils.shouldLint;
-const getGraphQLAST = utils.getGraphQLAST;
-const getModuleName = utils.getModuleName;
-const getLoc = utils.getLoc;
-
-const graphql = require('graphql');
-const visit = graphql.visit;
-
-function validateInlineDirective(spreadNode) {
-  return !!spreadNode.directives
-    .filter(directive => directive.name.value === 'relay')
-    .find(
-      directive =>
-        !!directive.arguments.find(argument => argument.name.value === 'mask')
-    );
-}
-
-module.exports = {
-  meta: {
-    docs: {
-      description:
-        'Relay Compat transforms fragment spreads from ' +
-        "`...Container_foo` to `Container.getFragment('foo')`. This " +
-        'makes ESLint aware of this.'
-    }
-  },
-  create(context) {
-    if (!shouldLint(context)) {
-      return {};
-    }
-    if (!/react-relay\/compat|RelayCompat/.test(context.getSourceCode().text)) {
-      // Only run in for compat mode files
-      return {};
-    }
-    function isInScope(name) {
-      var scope = context.getScope();
-      var variables = scope.variables;
-
-      while (scope.type !== 'global') {
-        scope = scope.upper;
-        variables = scope.variables.concat(variables);
-      }
-      if (scope.childScopes.length) {
-        variables = scope.childScopes[0].variables.concat(variables);
-        // Temporary fix for babel-eslint
-        if (scope.childScopes[0].childScopes.length) {
-          variables = scope.childScopes[0].childScopes[0].variables.concat(
-            variables
-          );
-        }
-      }
-
-      for (var i = 0, len = variables.length; i < len; i++) {
-        if (variables[i].name === name) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    return {
-      TaggedTemplateExpression(taggedTemplateExpression) {
-        const ast = getGraphQLAST(taggedTemplateExpression);
-        if (!ast) {
-          return;
-        }
-        visit(ast, {
-          FragmentSpread(spreadNode) {
-            const m =
-              spreadNode.name &&
-              spreadNode.name.value.match(/^([a-z0-9]+)_([a-z0-9_]+)/i);
-            if (!m) {
-              return;
-            }
-            const componentName = m[1];
-            const propName = m[2];
-            const loc = getLoc(
-              context,
-              taggedTemplateExpression,
-              spreadNode.name
-            );
-            if (isInScope(componentName)) {
-              // if this variable is defined, mark it as used
-              context.markVariableAsUsed(componentName);
-            } else if (componentName === getModuleName(context.getFilename())) {
-              if (!validateInlineDirective(spreadNode)) {
-                context.report({
-                  message:
-                    'It looks like you are trying to spread the locally defined fragment `{{fragmentName}}`. ' +
-                    'In compat mode, Relay only supports that for `@relay(mask: false)` directive. ' +
-                    'If you intend to do that, please add the directive to the fragment spread `{{fragmentName}}` ' +
-                    'and make sure that it is bound to a local variable named `{{propName}}`.',
-                  data: {
-                    fragmentName: spreadNode.name.value,
-                    propName: propName
-                  },
-                  loc: loc
-                });
-                return;
-              }
-
-              if (!isInScope(propName)) {
-                context.report({
-                  message:
-                    'When you are unmasking the locally defined fragment spread `{{fragmentName}}`, please make sure ' +
-                    'the fragment is bound to a variable named `{{propName}}`.',
-                  data: {
-                    fragmentName: spreadNode.name.value,
-                    propName: propName
-                  },
-                  loc: loc
-                });
-              }
-              context.markVariableAsUsed(propName);
-            } else {
-              // otherwise, yell about this needed to be defined
-              context.report({
-                message:
-                  'In compat mode, Relay expects the component that has ' +
-                  'the `{{fragmentName}}` fragment to be imported with ' +
-                  'the variable name `{{varName}}`.',
-                data: {
-                  fragmentName: spreadNode.name.value,
-                  varName: componentName
-                },
-                loc: loc
-              });
-            }
-          }
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-relay/src/rule-generated-flow-types.js b/node_modules/eslint-plugin-relay/src/rule-generated-flow-types.js
deleted file mode 100644
index 84fa00e..0000000
--- a/node_modules/eslint-plugin-relay/src/rule-generated-flow-types.js
+++ /dev/null
@@ -1,951 +0,0 @@
-/**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-const utils = require('./utils');
-const shouldLint = utils.shouldLint;
-const getGraphQLAST = utils.getGraphQLAST;
-
-const DEFAULT_FLOW_TYPES_OPTIONS = {
-  fix: false,
-  haste: false
-};
-
-function getOptions(optionValue) {
-  if (optionValue) {
-    return {
-      fix: optionValue.fix || DEFAULT_FLOW_TYPES_OPTIONS.fix,
-      haste: optionValue.haste || DEFAULT_FLOW_TYPES_OPTIONS.haste
-    };
-  }
-  return DEFAULT_FLOW_TYPES_OPTIONS;
-}
-
-function getTypeImportName(node) {
-  return (node.specifiers[0].local || node.specifiers[0].imported).name;
-}
-
-function genImportFixRange(type, imports, requires) {
-  const typeImports = imports.filter(node => node.importKind === 'type');
-  const alreadyHasImport = typeImports.some(node =>
-    node.specifiers.some(
-      specifier => (specifier.imported || specifier.local).name === type
-    )
-  );
-  if (alreadyHasImport) {
-    return null;
-  }
-  if (typeImports.length > 0) {
-    let precedingImportIndex = 0;
-    while (
-      typeImports[precedingImportIndex + 1] &&
-      getTypeImportName(typeImports[precedingImportIndex + 1]) < type
-    ) {
-      precedingImportIndex++;
-    }
-    return typeImports[precedingImportIndex].range;
-  }
-  if (imports.length > 0) {
-    return imports[imports.length - 1].range;
-  }
-  if (requires.length > 0) {
-    return requires[requires.length - 1].range;
-  }
-  // start of file
-  return [0, 0];
-}
-
-function genImportFixer(fixer, importFixRange, type, haste, whitespace) {
-  if (!importFixRange) {
-    // HACK: insert nothing
-    return fixer.replaceTextRange([0, 0], '');
-  }
-  if (haste) {
-    return fixer.insertTextAfterRange(
-      importFixRange,
-      `\n${whitespace}import type {${type}} from '${type}.graphql'`
-    );
-  } else {
-    return fixer.insertTextAfterRange(
-      importFixRange,
-      `\n${whitespace}import type {${type}} from './__generated__/${type}.graphql'`
-    );
-  }
-}
-
-function getPropTypeProperty(
-  context,
-  typeAliasMap,
-  propType,
-  propName,
-  visitedProps = new Set()
-) {
-  if (propType == null || visitedProps.has(propType)) {
-    return null;
-  }
-  visitedProps.add(propType);
-  const spreadsToVisit = [];
-  if (propType.type === 'GenericTypeAnnotation') {
-    return getPropTypeProperty(
-      context,
-      typeAliasMap,
-      extractReadOnlyType(resolveTypeAlias(propType, typeAliasMap)),
-      propName,
-      visitedProps
-    );
-  }
-  if (propType.type !== 'ObjectTypeAnnotation') {
-    return null;
-  }
-  for (const property of propType.properties) {
-    if (property.type === 'ObjectTypeSpreadProperty') {
-      spreadsToVisit.push(property);
-    } else {
-      // HACK: Type annotations don't currently expose a 'key' property:
-      // https://github.com/babel/babel-eslint/issues/307
-
-      let tokenIndex = 0;
-      if (property.static) {
-        tokenIndex++;
-      }
-      if (property.variance) {
-        tokenIndex++;
-      }
-
-      if (
-        context.getSourceCode().getFirstToken(property, tokenIndex).value ===
-        propName
-      ) {
-        return property;
-      }
-    }
-  }
-  for (const property of spreadsToVisit) {
-    if (
-      property.argument &&
-      property.argument.id &&
-      property.argument.id.name
-    ) {
-      const nextPropType = typeAliasMap[property.argument.id.name];
-      const result = getPropTypeProperty(
-        context,
-        typeAliasMap,
-        nextPropType,
-        propName,
-        visitedProps
-      );
-      if (result) {
-        return result;
-      }
-    }
-  }
-  return null;
-}
-
-function validateObjectTypeAnnotation(
-  context,
-  Component,
-  type,
-  propName,
-  propType,
-  importFixRange,
-  typeAliasMap,
-  onlyVerify
-) {
-  const options = getOptions(context.options[0]);
-  const propTypeProperty = getPropTypeProperty(
-    context,
-    typeAliasMap,
-    propType,
-    propName
-  );
-
-  const atleastOnePropertyExists = !!propType.properties[0];
-
-  if (!propTypeProperty) {
-    if (onlyVerify) {
-      return false;
-    }
-    context.report({
-      message:
-        '`{{prop}}` is not declared in the `props` of the React component or it is not marked with the ' +
-        'generated flow type `{{type}}`. See ' +
-        'https://facebook.github.io/relay/docs/en/graphql-in-relay.html#importing-generated-definitions',
-      data: {
-        prop: propName,
-        type
-      },
-      fix: options.fix
-        ? fixer => {
-            const whitespace = ' '.repeat(Component.parent.loc.start.column);
-            const fixes = [
-              genImportFixer(
-                fixer,
-                importFixRange,
-                type,
-                options.haste,
-                whitespace
-              )
-            ];
-            if (atleastOnePropertyExists) {
-              fixes.push(
-                fixer.insertTextBefore(
-                  propType.properties[0],
-                  `${propName}: ${type}, `
-                )
-              );
-            } else {
-              fixes.push(fixer.replaceText(propType, `{${propName}: ${type}}`));
-            }
-            return fixes;
-          }
-        : null,
-      loc: Component.loc
-    });
-    return false;
-  }
-  if (
-    propTypeProperty.value.type === 'NullableTypeAnnotation' &&
-    propTypeProperty.value.typeAnnotation.type === 'GenericTypeAnnotation' &&
-    propTypeProperty.value.typeAnnotation.id.name === type
-  ) {
-    return true;
-  }
-  if (
-    propTypeProperty.value.type !== 'GenericTypeAnnotation' ||
-    propTypeProperty.value.id.name !== type
-  ) {
-    if (onlyVerify) {
-      return false;
-    }
-    context.report({
-      message:
-        'Component property `{{prop}}` expects to use the generated ' +
-        '`{{type}}` flow type. See https://facebook.github.io/relay/docs/en/graphql-in-relay.html#importing-generated-definitions',
-      data: {
-        prop: propName,
-        type
-      },
-      fix: options.fix
-        ? fixer => {
-            const whitespace = ' '.repeat(Component.parent.loc.start.column);
-            return [
-              genImportFixer(
-                fixer,
-                importFixRange,
-                type,
-                options.haste,
-                whitespace
-              ),
-              fixer.replaceText(propTypeProperty.value, type)
-            ];
-          }
-        : null,
-      loc: Component.loc
-    });
-    return false;
-  }
-  return true;
-}
-
-function extractReadOnlyType(genericType) {
-  let currentType = genericType;
-  while (
-    currentType != null &&
-    currentType.type === 'GenericTypeAnnotation' &&
-    currentType.id.name === '$ReadOnly' &&
-    currentType.typeParameters &&
-    currentType.typeParameters.type === 'TypeParameterInstantiation' &&
-    Array.isArray(currentType.typeParameters.params) &&
-    currentType.typeParameters.params.length === 1
-  ) {
-    currentType = currentType.typeParameters.params[0];
-  }
-  return currentType;
-}
-
-function resolveTypeAlias(genericType, typeAliasMap) {
-  let currentType = genericType;
-  while (
-    currentType != null &&
-    currentType.type === 'GenericTypeAnnotation' &&
-    typeAliasMap[currentType.id.name] != null
-  ) {
-    currentType = typeAliasMap[currentType.id.name];
-  }
-  return currentType;
-}
-
-module.exports = {
-  meta: {
-    fixable: 'code',
-    docs: {
-      description: 'Validates usage of RelayModern generated flow types'
-    },
-    schema: [
-      {
-        type: 'object',
-        properties: {
-          fix: {
-            type: 'boolean'
-          },
-          haste: {
-            type: 'boolean'
-          }
-        },
-        additionalProperties: false
-      }
-    ]
-  },
-  create(context) {
-    if (!shouldLint(context)) {
-      return {};
-    }
-    const options = getOptions(context.options[0]);
-    const componentMap = {};
-    const expectedTypes = [];
-    const imports = [];
-    const requires = [];
-    const typeAliasMap = {};
-    const useFragmentInstances = [];
-
-    /**
-     * Tries to find a GraphQL definition node for a given argument.
-     * Supports a graphql`...` literal inline and follows variable definitions.
-     */
-    function getDefinition(arg) {
-      if (arg == null) {
-        return null;
-      }
-      if (arg.type === 'Identifier') {
-        const name = arg.name;
-        let scope = context.getScope();
-        while (scope && scope.type != 'global') {
-          for (const variable of scope.variables) {
-            if (variable.name === name) {
-              const definition = variable.defs.find(
-                def => def.node && def.node.type === 'VariableDeclarator'
-              );
-              return definition ? getDefinition(definition.node.init) : null;
-            }
-          }
-          scope = scope.upper;
-        }
-        return null;
-      }
-      if (arg.type !== 'TaggedTemplateExpression') {
-        return null;
-      }
-      return getGraphQLAST(arg);
-    }
-
-    function getDefinitionName(arg) {
-      const ast = getDefinition(arg);
-      if (ast == null || ast.definitions.length === 0) {
-        return null;
-      }
-      return ast.definitions[0].name.value;
-    }
-
-    function getRefetchableQueryName(arg) {
-      const ast = getDefinition(arg);
-      if (ast == null || ast.definitions.length === 0) {
-        return null;
-      }
-      const refetchable = ast.definitions[0].directives.find(
-        d => d.name.value === 'refetchable'
-      );
-      if (!refetchable) {
-        return null;
-      }
-      const nameArg = refetchable.arguments.find(
-        a => a.name.value === 'queryName'
-      );
-      return nameArg && nameArg.value && nameArg.value.value
-        ? nameArg.value.value
-        : null;
-    }
-
-    function trackHookCall(node, hookName) {
-      const firstArg = node.arguments[0];
-      if (firstArg == null) {
-        return;
-      }
-      const fragmentName = getDefinitionName(firstArg);
-      if (fragmentName == null) {
-        return;
-      }
-      useFragmentInstances.push({
-        fragmentName: fragmentName,
-        node: node,
-        hookName: hookName
-      });
-    }
-
-    function createTypeImportFixer(node, operationName, typeText) {
-      return fixer => {
-        const importFixRange = genImportFixRange(
-          operationName,
-          imports,
-          requires
-        );
-        return [
-          genImportFixer(
-            fixer,
-            importFixRange,
-            operationName,
-            options.haste,
-            ''
-          ),
-          fixer.insertTextAfter(node.callee, `<${typeText}>`)
-        ];
-      };
-    }
-
-    function reportAndFixRefetchableType(node, hookName, defaultQueryName) {
-      const queryName = getRefetchableQueryName(node.arguments[0]);
-      context.report({
-        node: node,
-        message: `The \`${hookName}\` hook should be used with an explicit generated Flow type, e.g.: ${hookName}<{{queryName}}, _>(...)`,
-        data: {
-          queryName: queryName || defaultQueryName
-        },
-        fix:
-          queryName != null && options.fix
-            ? createTypeImportFixer(node, queryName, `${queryName}, _`)
-            : null
-      });
-    }
-
-    return {
-      ImportDeclaration(node) {
-        imports.push(node);
-      },
-      VariableDeclarator(node) {
-        if (
-          node.init &&
-          node.init.type === 'CallExpression' &&
-          node.init.callee.name === 'require'
-        ) {
-          requires.push(node);
-        }
-      },
-      TypeAlias(node) {
-        typeAliasMap[node.id.name] = node.right;
-      },
-
-      /**
-       * Find useQuery() calls without type arguments.
-       */
-      'CallExpression[callee.name=useQuery]:not([typeArguments])'(node) {
-        const firstArg = node.arguments[0];
-        if (firstArg == null) {
-          return;
-        }
-        const queryName = getDefinitionName(firstArg);
-        context.report({
-          node: node,
-          message:
-            'The `useQuery` hook should be used with an explicit generated Flow type, e.g.: useQuery<{{queryName}}>(...)',
-          data: {
-            queryName: queryName || 'ExampleQuery'
-          },
-          fix:
-            queryName != null && options.fix
-              ? createTypeImportFixer(node, queryName, queryName)
-              : null
-        });
-      },
-
-      /**
-       * Find useLazyLoadQuery() calls without type arguments.
-       */
-      'CallExpression[callee.name=useLazyLoadQuery]:not([typeArguments])'(
-        node
-      ) {
-        const firstArg = node.arguments[0];
-        if (firstArg == null) {
-          return;
-        }
-        const queryName = getDefinitionName(firstArg);
-        context.report({
-          node: node,
-          message:
-            'The `useLazyLoadQuery` hook should be used with an explicit generated Flow type, e.g.: useLazyLoadQuery<{{queryName}}>(...)',
-          data: {
-            queryName: queryName || 'ExampleQuery'
-          },
-          fix:
-            queryName != null && options.fix
-              ? createTypeImportFixer(node, queryName, queryName)
-              : null
-        });
-      },
-
-      /**
-       * Find commitMutation() calls without type arguments.
-       */
-      'CallExpression[callee.name=commitMutation]:not([typeArguments])'(node) {
-        // Get mutation config. It should be second argument of the `commitMutation`
-        const mutationConfig = node.arguments && node.arguments[1];
-        if (
-          mutationConfig == null ||
-          mutationConfig.type !== 'ObjectExpression'
-        ) {
-          return;
-        }
-        // Find `mutation` property on the `mutationConfig`
-        const mutationNameProperty = mutationConfig.properties.find(
-          prop => prop.key != null && prop.key.name === 'mutation'
-        );
-        if (
-          mutationNameProperty == null ||
-          mutationNameProperty.value == null
-        ) {
-          return;
-        }
-        const mutationName = getDefinitionName(mutationNameProperty.value);
-        context.report({
-          node: node,
-          message:
-            'The `commitMutation` must be used with an explicit generated Flow type, e.g.: commitMutation<{{mutationName}}>(...)',
-          data: {
-            mutationName: mutationName || 'ExampleMutation'
-          },
-          fix:
-            mutationName != null && options.fix
-              ? createTypeImportFixer(node, mutationName, mutationName)
-              : null
-        });
-      },
-
-      /**
-       * Find requestSubscription() calls without type arguments.
-       */
-      'CallExpression[callee.name=requestSubscription]:not([typeArguments])'(
-        node
-      ) {
-        const subscriptionConfig = node.arguments && node.arguments[1];
-        if (
-          subscriptionConfig == null ||
-          subscriptionConfig.type !== 'ObjectExpression'
-        ) {
-          return;
-        }
-        const subscriptionNameProperty = subscriptionConfig.properties.find(
-          prop => prop.key != null && prop.key.name === 'subscription'
-        );
-
-        if (
-          subscriptionNameProperty == null ||
-          subscriptionNameProperty.value == null
-        ) {
-          return;
-        }
-        const subscriptionName = getDefinitionName(
-          subscriptionNameProperty.value
-        );
-        context.report({
-          node: node,
-          message:
-            'The `requestSubscription` must be used with an explicit generated Flow type, e.g.: requestSubscription<{{subscriptionName}}>(...)',
-          data: {
-            subscriptionName: subscriptionName || 'ExampleSubscription'
-          },
-          fix:
-            subscriptionName != null && options.fix
-              ? createTypeImportFixer(node, subscriptionName, subscriptionName)
-              : null
-        });
-      },
-
-      /**
-       * Find usePaginationFragment() calls without type arguments.
-       */
-      'CallExpression[callee.name=usePaginationFragment]:not([typeArguments])'(
-        node
-      ) {
-        reportAndFixRefetchableType(
-          node,
-          'usePaginationFragment',
-          'PaginationQuery'
-        );
-      },
-
-      /**
-       * Find useBlockingPaginationFragment() calls without type arguments.
-       */
-      'CallExpression[callee.name=useBlockingPaginationFragment]:not([typeArguments])'(
-        node
-      ) {
-        reportAndFixRefetchableType(
-          node,
-          'useBlockingPaginationFragment',
-          'PaginationQuery'
-        );
-      },
-
-      /**
-       * Find useLegacyPaginationFragment() calls without type arguments.
-       */
-      'CallExpression[callee.name=useLegacyPaginationFragment]:not([typeArguments])'(
-        node
-      ) {
-        reportAndFixRefetchableType(
-          node,
-          'useLegacyPaginationFragment',
-          'PaginationQuery'
-        );
-      },
-
-      /**
-       * Find useRefetchableFragment() calls without type arguments.
-       */
-      'CallExpression[callee.name=useRefetchableFragment]:not([typeArguments])'(
-        node
-      ) {
-        reportAndFixRefetchableType(
-          node,
-          'useRefetchableFragment',
-          'RefetchableQuery'
-        );
-      },
-
-      /**
-       * useFragment() calls
-       */
-      'CallExpression[callee.name=useFragment]'(node) {
-        trackHookCall(node, 'useFragment');
-      },
-
-      /**
-       * usePaginationFragment() calls
-       */
-      'CallExpression[callee.name=usePaginationFragment]'(node) {
-        trackHookCall(node, 'usePaginationFragment');
-      },
-
-      /**
-       * useBlockingPaginationFragment() calls
-       */
-      'CallExpression[callee.name=useBlockingPaginationFragment]'(node) {
-        trackHookCall(node, 'useBlockingPaginationFragment');
-      },
-
-      /**
-       * useLegacyPaginationFragment() calls
-       */
-      'CallExpression[callee.name=useLegacyPaginationFragment]'(node) {
-        trackHookCall(node, 'useLegacyPaginationFragment');
-      },
-
-      /**
-       * useRefetchableFragment() calls
-       */
-      'CallExpression[callee.name=useRefetchableFragment]'(node) {
-        trackHookCall(node, 'useRefetchableFragment');
-      },
-
-      ClassDeclaration(node) {
-        const componentName = node.id.name;
-        componentMap[componentName] = {
-          Component: node.id
-        };
-        // new style React.Component accepts 'props' as the first parameter
-        if (node.superTypeParameters && node.superTypeParameters.params[0]) {
-          componentMap[componentName].propType =
-            node.superTypeParameters.params[0];
-        }
-      },
-      TaggedTemplateExpression(node) {
-        const ast = getGraphQLAST(node);
-        if (!ast) {
-          return;
-        }
-        ast.definitions.forEach(def => {
-          if (!def.name) {
-            // no name, covered by graphql-naming/TaggedTemplateExpression
-            return;
-          }
-          if (def.kind === 'FragmentDefinition') {
-            expectedTypes.push(def.name.value);
-          }
-        });
-      },
-      'Program:exit': function(_node) {
-        useFragmentInstances.forEach(useFragmentInstance => {
-          const fragmentName = useFragmentInstance.fragmentName;
-          const hookName = useFragmentInstance.hookName;
-          const node = useFragmentInstance.node;
-          const foundImport = imports.some(importDeclaration => {
-            const importedFromModuleName = importDeclaration.source.value;
-            // `includes()` to allow a suffix like `.js` or path prefixes
-            if (!importedFromModuleName.includes(fragmentName + '.graphql')) {
-              return false;
-            }
-            // import type {...} from '...';
-            if (importDeclaration.importKind === 'type') {
-              return importDeclaration.specifiers.some(
-                specifier =>
-                  specifier.type === 'ImportSpecifier' &&
-                  specifier.imported.name === fragmentName + '$key'
-              );
-            }
-            // import {type xyz} from '...';
-            if (importDeclaration.importKind === 'value') {
-              return importDeclaration.specifiers.some(
-                specifier =>
-                  specifier.type === 'ImportSpecifier' &&
-                  specifier.importKind === 'type' &&
-                  specifier.imported.name === fragmentName + '$key'
-              );
-            }
-            return false;
-          });
-
-          if (foundImport) {
-            return;
-          }
-
-          // Check if the fragment ref that we're passing to the hook
-          // comes from a previous useFragment (or variants) hook call.
-          const fragmentRefArgName =
-            node.arguments[1] != null ? node.arguments[1].name : null;
-          const foundFragmentRefDeclaration = useFragmentInstances.some(
-            _useFragmentInstance => {
-              if (_useFragmentInstance === useFragmentInstance) {
-                return false;
-              }
-              const variableDeclaratorNode = _useFragmentInstance.node.parent;
-              if (
-                !variableDeclaratorNode ||
-                !variableDeclaratorNode.id ||
-                !variableDeclaratorNode.id.type
-              ) {
-                return false;
-              }
-              if (variableDeclaratorNode.id.type === 'Identifier') {
-                return (
-                  fragmentRefArgName != null &&
-                  variableDeclaratorNode.id.name === fragmentRefArgName
-                );
-              }
-              if (
-                variableDeclaratorNode.id.type === 'ObjectPattern' &&
-                variableDeclaratorNode.id.properties != null
-              ) {
-                return variableDeclaratorNode.id.properties.some(prop => {
-                  return (
-                    fragmentRefArgName != null &&
-                    prop &&
-                    prop.value &&
-                    prop.value.name === fragmentRefArgName
-                  );
-                });
-              }
-              return false;
-            }
-          );
-
-          if (foundFragmentRefDeclaration) {
-            return;
-          }
-
-          context.report({
-            node: node,
-            message:
-              'The prop passed to {{hookName}}() should be typed with the ' +
-              "type '{{name}}$key' imported from '{{name}}.graphql', " +
-              'e.g.:\n' +
-              '\n' +
-              "  import type {{{name}}$key} from '{{name}}.graphql';",
-            data: {
-              name: fragmentName,
-              hookName: hookName
-            }
-          });
-        });
-        expectedTypes.forEach(type => {
-          const componentName = type.split('_')[0];
-          const propName = type
-            .split('_')
-            .slice(1)
-            .join('_');
-          if (!componentName || !propName || !componentMap[componentName]) {
-            // incorrect name, covered by graphql-naming/CallExpression
-            return;
-          }
-          const Component = componentMap[componentName].Component;
-          const propType = componentMap[componentName].propType;
-
-          // resolve local type alias
-          const importedPropType = imports.reduce((acc, node) => {
-            if (node.specifiers) {
-              const typeSpecifier = node.specifiers.find(specifier => {
-                if (specifier.type !== 'ImportSpecifier') {
-                  return false;
-                }
-                return specifier.imported.name === type;
-              });
-              if (typeSpecifier) {
-                return typeSpecifier.local.name;
-              }
-            }
-            return acc;
-          }, type);
-
-          const importFixRange = genImportFixRange(
-            importedPropType,
-            imports,
-            requires
-          );
-
-          if (propType) {
-            // There exists a prop typeAnnotation. Let's look at how it's
-            // structured
-            switch (propType.type) {
-              case 'ObjectTypeAnnotation': {
-                validateObjectTypeAnnotation(
-                  context,
-                  Component,
-                  importedPropType,
-                  propName,
-                  propType,
-                  importFixRange,
-                  typeAliasMap
-                );
-                break;
-              }
-              case 'GenericTypeAnnotation': {
-                const aliasedObjectType = extractReadOnlyType(
-                  resolveTypeAlias(propType, typeAliasMap)
-                );
-                if (!aliasedObjectType) {
-                  // The type Alias doesn't exist, is invalid, or is being
-                  // imported. Can't do anything.
-                  break;
-                }
-                switch (aliasedObjectType.type) {
-                  case 'ObjectTypeAnnotation': {
-                    validateObjectTypeAnnotation(
-                      context,
-                      Component,
-                      importedPropType,
-                      propName,
-                      aliasedObjectType,
-                      importFixRange,
-                      typeAliasMap
-                    );
-                    break;
-                  }
-                  case 'IntersectionTypeAnnotation': {
-                    const objectTypes = aliasedObjectType.types
-                      .map(intersectedType => {
-                        if (intersectedType.type === 'GenericTypeAnnotation') {
-                          return extractReadOnlyType(
-                            resolveTypeAlias(intersectedType, typeAliasMap)
-                          );
-                        }
-                        if (intersectedType.type === 'ObjectTypeAnnotation') {
-                          return intersectedType;
-                        }
-                      })
-                      .filter(maybeObjectType => {
-                        // GenericTypeAnnotation may not map to an object type
-                        return (
-                          maybeObjectType &&
-                          maybeObjectType.type === 'ObjectTypeAnnotation'
-                        );
-                      });
-                    if (!objectTypes.length) {
-                      // The type Alias is likely being imported.
-                      // Can't do anything.
-                      break;
-                    }
-                    for (const objectType of objectTypes) {
-                      const isValid = validateObjectTypeAnnotation(
-                        context,
-                        Component,
-                        importedPropType,
-                        propName,
-                        objectType,
-                        importFixRange,
-                        typeAliasMap,
-                        true // Return false if invalid instead of reporting
-                      );
-                      if (isValid) {
-                        break;
-                      }
-                    }
-                    // otherwise report an error at the first object
-                    validateObjectTypeAnnotation(
-                      context,
-                      Component,
-                      importedPropType,
-                      propName,
-                      objectTypes[0],
-                      importFixRange,
-                      typeAliasMap
-                    );
-                    break;
-                  }
-                }
-                break;
-              }
-            }
-          } else {
-            context.report({
-              message:
-                'Component property `{{prop}}` expects to use the ' +
-                'generated `{{type}}` flow type. See https://facebook.github.io/relay/docs/en/graphql-in-relay.html#importing-generated-definitions',
-              data: {
-                prop: propName,
-                type: importedPropType
-              },
-              fix: options.fix
-                ? fixer => {
-                    const classBodyStart = Component.parent.body.body[0];
-                    if (!classBodyStart) {
-                      // HACK: There's nothing in the body. Let's not do anything
-                      // When something is added to the body, we'll have a fix
-                      return;
-                    }
-                    const aliasWhitespace = ' '.repeat(
-                      Component.parent.loc.start.column
-                    );
-                    const propsWhitespace = ' '.repeat(
-                      classBodyStart.loc.start.column
-                    );
-                    return [
-                      genImportFixer(
-                        fixer,
-                        importFixRange,
-                        importedPropType,
-                        options.haste,
-                        aliasWhitespace
-                      ),
-                      fixer.insertTextBefore(
-                        Component.parent,
-                        `type Props = {${propName}: ` +
-                          `${importedPropType}};\n\n${aliasWhitespace}`
-                      ),
-                      fixer.insertTextBefore(
-                        classBodyStart,
-                        `props: Props;\n\n${propsWhitespace}`
-                      )
-                    ];
-                  }
-                : null,
-              loc: Component.loc
-            });
-          }
-        });
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-relay/src/rule-graphql-naming.js b/node_modules/eslint-plugin-relay/src/rule-graphql-naming.js
deleted file mode 100644
index 69cde13..0000000
--- a/node_modules/eslint-plugin-relay/src/rule-graphql-naming.js
+++ /dev/null
@@ -1,183 +0,0 @@
-/**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-const utils = require('./utils');
-const getGraphQLAST = utils.getGraphQLAST;
-const getLoc = utils.getLoc;
-const getModuleName = utils.getModuleName;
-const getRange = utils.getRange;
-const isGraphQLTag = utils.isGraphQLTag;
-const isGraphQLDeprecatedTag = utils.isGraphQLDeprecatedTag;
-const shouldLint = utils.shouldLint;
-
-const CREATE_CONTAINER_FUNCTIONS = new Set([
-  'createFragmentContainer',
-  'createPaginationContainer',
-  'createRefetchContainer'
-]);
-
-function isCreateContainerCall(node) {
-  const callee = node.callee;
-  // prettier-ignore
-  return (
-    callee.type === 'Identifier' &&
-    CREATE_CONTAINER_FUNCTIONS.has(callee.name)
-  ) || (
-    callee.kind === 'MemberExpression' &&
-    callee.object.type === 'Identifier' &&
-    // Relay, relay, RelayCompat, etc.
-    /relay/i.test(callee.object.value) &&
-    callee.property.type === 'Identifier' &&
-    CREATE_CONTAINER_FUNCTIONS.has(callee.property.name)
-  );
-}
-
-function calleeToString(callee) {
-  if (callee.type) {
-    return callee.name;
-  }
-  if (
-    callee.kind === 'MemberExpression' &&
-    callee.object.type === 'Identifier' &&
-    callee.property.type === 'Identifier'
-  ) {
-    return callee.object.value + '.' + callee.property.name;
-  }
-  return null;
-}
-
-function validateTemplate(context, taggedTemplateExpression, keyName) {
-  const ast = getGraphQLAST(taggedTemplateExpression);
-  if (!ast) {
-    return;
-  }
-  const moduleName = getModuleName(context.getFilename());
-  ast.definitions.forEach(def => {
-    if (!def.name) {
-      // no name, covered by graphql-naming/TaggedTemplateExpression
-      return;
-    }
-    const definitionName = def.name.value;
-    if (def.kind === 'FragmentDefinition') {
-      if (keyName) {
-        const expectedName = moduleName + '_' + keyName;
-        if (definitionName !== expectedName) {
-          context.report({
-            loc: getLoc(context, taggedTemplateExpression, def.name),
-            message:
-              'Container fragment names must be `<ModuleName>_<propName>`. ' +
-              'Got `{{actual}}`, expected `{{expected}}`.',
-            data: {
-              actual: definitionName,
-              expected: expectedName
-            },
-            fix: fixer =>
-              fixer.replaceTextRange(
-                getRange(context, taggedTemplateExpression, def.name),
-                expectedName
-              )
-          });
-        }
-      }
-    }
-  });
-}
-
-module.exports = {
-  meta: {
-    fixable: 'code',
-    docs: {
-      description: 'Validates naming conventions of graphql tags'
-    }
-  },
-  create(context) {
-    if (!shouldLint(context)) {
-      return {};
-    }
-    return {
-      TaggedTemplateExpression(node) {
-        const ast = getGraphQLAST(node);
-        if (!ast) {
-          return;
-        }
-
-        ast.definitions.forEach(definition => {
-          switch (definition.kind) {
-            case 'OperationDefinition': {
-              const moduleName = getModuleName(context.getFilename());
-              const name = definition.name;
-              if (!name) {
-                return;
-              }
-              const operationName = name.value;
-
-              if (operationName.indexOf(moduleName) !== 0) {
-                context.report({
-                  message:
-                    'Operations should start with the module name. ' +
-                    'Expected prefix `{{expected}}`, got `{{actual}}`.',
-                  data: {
-                    expected: moduleName,
-                    actual: operationName
-                  },
-                  loc: getLoc(context, node, name)
-                });
-              }
-              break;
-            }
-            default:
-          }
-        });
-      },
-      CallExpression(node) {
-        if (!isCreateContainerCall(node)) {
-          return;
-        }
-        const fragments = node.arguments[1];
-        if (fragments.type === 'ObjectExpression') {
-          fragments.properties.forEach(property => {
-            if (
-              property.type === 'Property' &&
-              property.key.type === 'Identifier' &&
-              property.computed === false &&
-              property.value.type === 'TaggedTemplateExpression'
-            ) {
-              if (
-                !isGraphQLTag(property.value.tag) &&
-                !isGraphQLDeprecatedTag(property.value.tag)
-              ) {
-                context.report({
-                  node: property.value.tag,
-                  message:
-                    '`{{callee}}` expects GraphQL to be tagged with ' +
-                    'graphql`...`.',
-                  data: {
-                    callee: calleeToString(node.callee)
-                  }
-                });
-                return;
-              }
-              validateTemplate(context, property.value, property.key.name);
-            } else {
-              context.report({
-                node: property,
-                message:
-                  '`{{callee}}` expects fragment definitions to be ' +
-                  '`key: graphql`.',
-                data: {
-                  callee: calleeToString(node.callee)
-                }
-              });
-            }
-          });
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-relay/src/rule-graphql-syntax.js b/node_modules/eslint-plugin-relay/src/rule-graphql-syntax.js
deleted file mode 100644
index 8c758a5..0000000
--- a/node_modules/eslint-plugin-relay/src/rule-graphql-syntax.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-const path = require('path');
-
-const utils = require('./utils');
-const getLoc = utils.getLoc;
-const isGraphQLTag = utils.isGraphQLTag;
-const shouldLint = utils.shouldLint;
-
-const graphql = require('graphql');
-const parse = graphql.parse;
-const Source = graphql.Source;
-
-module.exports = {
-  meta: {
-    docs: {
-      description: 'Validates the syntax of graphql`...` templates.'
-    }
-  },
-  create(context) {
-    if (!shouldLint(context)) {
-      return {};
-    }
-    return {
-      TaggedTemplateExpression(node) {
-        if (!isGraphQLTag(node.tag)) {
-          return;
-        }
-        const quasi = node.quasi.quasis[0];
-        if (node.quasi.quasis.length !== 1) {
-          context.report({
-            node: node,
-            message:
-              'graphql tagged templates do not support ${...} substitutions.'
-          });
-          return;
-        }
-        try {
-          const filename = path.basename(context.getFilename());
-          const ast = parse(new Source(quasi.value.cooked, filename));
-          if (ast.definitions.length !== 1) {
-            context.report({
-              node: node,
-              message:
-                'graphql tagged templates can only contain a single definition.'
-            });
-          } else if (!ast.definitions[0].name) {
-            context.report({
-              message: 'Operations in graphql tags require a name.',
-              loc: getLoc(context, node, ast.definitions[0])
-            });
-          }
-        } catch (error) {
-          context.report({
-            node: node,
-            message: '{{message}}',
-            data: {message: error.message}
-          });
-        }
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-relay/src/rule-hook-required-argument.js b/node_modules/eslint-plugin-relay/src/rule-hook-required-argument.js
deleted file mode 100644
index b4e8eff..0000000
--- a/node_modules/eslint-plugin-relay/src/rule-hook-required-argument.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-const utils = require('./utils');
-const shouldLint = utils.shouldLint;
-
-function reportMissingKeyArgument(node, context, hookName) {
-  context.report({
-    node: node,
-    message: `A fragment reference should be passed to the \`${hookName}\` hook`
-  });
-}
-
-module.exports = {
-  meta: {
-    docs: {
-      description:
-        'Validates that the second argument is passed to relay hooks.'
-    }
-  },
-  create(context) {
-    if (!shouldLint(context)) {
-      return {};
-    }
-
-    return {
-      'CallExpression[callee.name=useFragment][arguments.length < 2]'(node) {
-        reportMissingKeyArgument(node, context, 'useFragment');
-      },
-      'CallExpression[callee.name=usePaginationFragment][arguments.length < 2]'(
-        node
-      ) {
-        reportMissingKeyArgument(node, context, 'usePaginationFragment');
-      },
-
-      'CallExpression[callee.name=useBlockingPaginationFragment][arguments.length < 2]'(
-        node
-      ) {
-        reportMissingKeyArgument(
-          node,
-          context,
-          'useBlockingPaginationFragment'
-        );
-      },
-
-      'CallExpression[callee.name=useLegacyPaginationFragment][arguments.length < 2]'(
-        node
-      ) {
-        reportMissingKeyArgument(node, context, 'useLegacyPaginationFragment');
-      },
-
-      'CallExpression[callee.name=useRefetchableFragment][arguments.length < 2]'(
-        node
-      ) {
-        reportMissingKeyArgument(node, context, 'useRefetchableFragment');
-      }
-    };
-  }
-};
diff --git a/node_modules/eslint-plugin-relay/src/rule-no-future-added-value.js b/node_modules/eslint-plugin-relay/src/rule-no-future-added-value.js
deleted file mode 100644
index ca25f7b..0000000
--- a/node_modules/eslint-plugin-relay/src/rule-no-future-added-value.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-module.exports = context => {
-  function validateValue(node) {
-    context.report(
-      node,
-      "Do not use `'%future added value'`. It represents any potential " +
-        'value that the server might return in the future that the code ' +
-        'should handle.'
-    );
-  }
-  return {
-    "Literal[value='%future added value']": validateValue,
-
-    // StringLiteralTypeAnnotations that are not children of a default case
-    ":not(SwitchCase[test=null] StringLiteralTypeAnnotation)StringLiteralTypeAnnotation[value='%future added value']": validateValue
-  };
-};
diff --git a/node_modules/eslint-plugin-relay/src/rule-unused-fields.js b/node_modules/eslint-plugin-relay/src/rule-unused-fields.js
deleted file mode 100644
index 71b0cc0..0000000
--- a/node_modules/eslint-plugin-relay/src/rule-unused-fields.js
+++ /dev/null
@@ -1,197 +0,0 @@
-/**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-const utils = require('./utils');
-
-const getGraphQLAST = utils.getGraphQLAST;
-
-function getGraphQLFieldNames(graphQLAst) {
-  const fieldNames = {};
-
-  function walkAST(node, ignoreLevel) {
-    if (node.kind === 'Field' && !ignoreLevel) {
-      const nameNode = node.alias || node.name;
-      fieldNames[nameNode.value] = nameNode;
-    }
-    if (node.kind === 'OperationDefinition') {
-      if (node.operation === 'mutation' || node.operation === 'subscription') {
-        return;
-      }
-      // Ignore fields that are direct children of query as used in mutation
-      // or query definitions.
-      node.selectionSet.selections.forEach(selection => {
-        walkAST(selection, true);
-      });
-      return;
-    }
-    for (const prop in node) {
-      const value = node[prop];
-      if (prop === 'loc') {
-        continue;
-      }
-      if (value && typeof value === 'object') {
-        walkAST(value);
-      } else if (Array.isArray(value)) {
-        value.forEach(child => {
-          walkAST(child);
-        });
-      }
-    }
-  }
-
-  walkAST(graphQLAst);
-  return fieldNames;
-}
-
-function isGraphQLTemplate(node) {
-  return (
-    node.tag.type === 'Identifier' &&
-    node.tag.name === 'graphql' &&
-    node.quasi.quasis.length === 1
-  );
-}
-
-function isStringNode(node) {
-  return (
-    node != null && node.type === 'Literal' && typeof node.value === 'string'
-  );
-}
-
-function isPageInfoField(field) {
-  switch (field) {
-    case 'pageInfo':
-    case 'page_info':
-    case 'hasNextPage':
-    case 'has_next_page':
-    case 'hasPreviousPage':
-    case 'has_previous_page':
-    case 'startCursor':
-    case 'start_cursor':
-    case 'endCursor':
-    case 'end_cursor':
-      return true;
-    default:
-      return false;
-  }
-}
-
-function rule(context) {
-  let currentMethod = [];
-  let foundMemberAccesses = {};
-  let templateLiterals = [];
-
-  function visitGetByPathCall(node) {
-    // The `getByPath` utility accesses nested fields in the form
-    // `getByPath(thing, ['field', 'nestedField'])`.
-    const pathArg = node.arguments[1];
-    if (!pathArg || pathArg.type !== 'ArrayExpression') {
-      return;
-    }
-    pathArg.elements.forEach(element => {
-      if (isStringNode(element)) {
-        foundMemberAccesses[element.value] = true;
-      }
-    });
-  }
-
-  function visitDotAccessCall(node) {
-    // The `dotAccess` utility accesses nested fields in the form
-    // `dotAccess(thing, 'field.nestedField')`.
-    const pathArg = node.arguments[1];
-    if (isStringNode(pathArg)) {
-      pathArg.value.split('.').forEach(element => {
-        foundMemberAccesses[element] = true;
-      });
-    }
-  }
-
-  function visitMemberExpression(node) {
-    if (node.property.type === 'Identifier') {
-      foundMemberAccesses[node.property.name] = true;
-    }
-  }
-
-  return {
-    Program(_node) {
-      currentMethod = [];
-      foundMemberAccesses = {};
-      templateLiterals = [];
-    },
-    'Program:exit'(_node) {
-      templateLiterals.forEach(templateLiteral => {
-        const graphQLAst = getGraphQLAST(templateLiteral);
-        if (!graphQLAst) {
-          // ignore nodes with syntax errors, they're handled by rule-graphql-syntax
-          return;
-        }
-
-        const queriedFields = getGraphQLFieldNames(graphQLAst);
-        for (const field in queriedFields) {
-          if (
-            !foundMemberAccesses[field] &&
-            !isPageInfoField(field) &&
-            // Do not warn for unused __typename which can be a workaround
-            // when only interested in existence of an object.
-            field !== '__typename'
-          ) {
-            context.report({
-              node: templateLiteral,
-              loc: utils.getLoc(context, templateLiteral, queriedFields[field]),
-              message:
-                `This queries for the field \`${field}\` but this file does ` +
-                'not seem to use it directly. If a different file needs this ' +
-                'information that file should export a fragment and colocate ' +
-                'the query for the data with the usage.\n' +
-                'If only interested in the existence of a record, __typename ' +
-                'can be used without this warning.'
-            });
-          }
-        }
-      });
-    },
-    CallExpression(node) {
-      if (node.callee.type !== 'Identifier') {
-        return;
-      }
-      switch (node.callee.name) {
-        case 'getByPath':
-          visitGetByPathCall(node);
-          break;
-        case 'dotAccess':
-          visitDotAccessCall(node);
-          break;
-      }
-    },
-    TaggedTemplateExpression(node) {
-      if (currentMethod[0] === 'getConfigs') {
-        return;
-      }
-      if (isGraphQLTemplate(node)) {
-        templateLiterals.push(node);
-      }
-    },
-    MemberExpression: visitMemberExpression,
-    OptionalMemberExpression: visitMemberExpression,
-    ObjectPattern(node) {
-      node.properties.forEach(node => {
-        if (node.type === 'Property' && !node.computed) {
-          foundMemberAccesses[node.key.name] = true;
-        }
-      });
-    },
-    MethodDefinition(node) {
-      currentMethod.unshift(node.key.name);
-    },
-    'MethodDefinition:exit'(_node) {
-      currentMethod.shift();
-    }
-  };
-}
-
-module.exports = rule;
diff --git a/node_modules/eslint-plugin-relay/src/utils.js b/node_modules/eslint-plugin-relay/src/utils.js
deleted file mode 100644
index e9ad7d5..0000000
--- a/node_modules/eslint-plugin-relay/src/utils.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-const path = require('path');
-
-const graphql = require('graphql');
-const parse = graphql.parse;
-
-function getGraphQLAST(taggedTemplateExpression) {
-  if (!isGraphQLTag(taggedTemplateExpression.tag)) {
-    return null;
-  }
-  if (taggedTemplateExpression.quasi.quasis.length !== 1) {
-    // has substitutions, covered by graphql-syntax rule
-    return null;
-  }
-  const quasi = taggedTemplateExpression.quasi.quasis[0];
-  try {
-    return parse(quasi.value.cooked);
-  } catch (error) {
-    // Invalid syntax, covered by graphql-syntax rule
-    return null;
-  }
-}
-
-/**
- * Returns a loc object for error reporting.
- */
-function getLoc(context, templateNode, graphQLNode) {
-  const startAndEnd = getRange(context, templateNode, graphQLNode);
-  const start = startAndEnd[0];
-  const end = startAndEnd[1];
-  return {
-    start: getLocFromIndex(context.getSourceCode(), start),
-    end: getLocFromIndex(context.getSourceCode(), end)
-  };
-}
-
-// TODO remove after we no longer have to support ESLint 3.5.0
-function getLocFromIndex(sourceCode, index) {
-  if (sourceCode.getSourceCode) {
-    return sourceCode.getSourceCode(index);
-  }
-  let pos = 0;
-  for (let line = 0; line < sourceCode.lines.length; line++) {
-    const lineLength = sourceCode.lines[line].length;
-    if (index <= pos + lineLength) {
-      return {line: line + 1, column: index - pos};
-    }
-    pos += lineLength + 1;
-  }
-  return null;
-}
-
-// Copied directly from Relay
-function getModuleName(filePath) {
-  // index.js -> index
-  // index.js.flow -> index.js
-  let filename = path.basename(filePath, path.extname(filePath));
-
-  // index.js -> index (when extension has multiple segments)
-  // index.react -> index (when extension has multiple segments)
-  filename = filename.replace(/(\.(?!ios|android)[_a-zA-Z0-9\\-]+)+/g, '');
-
-  // /path/to/button/index.js -> button
-  let moduleName =
-    filename === 'index' ? path.basename(path.dirname(filePath)) : filename;
-
-  // foo-bar -> fooBar
-  // Relay compatibility mode splits on _, so we can't use that here.
-  moduleName = moduleName.replace(/[^a-zA-Z0-9]+(\w?)/g, (match, next) =>
-    next.toUpperCase()
-  );
-
-  return moduleName;
-}
-
-/**
- * Returns a range object for auto fixers.
- */
-function getRange(context, templateNode, graphQLNode) {
-  const graphQLStart = templateNode.quasi.quasis[0].start;
-  return [
-    graphQLStart + graphQLNode.loc.start,
-    graphQLStart + graphQLNode.loc.end
-  ];
-}
-
-function isGraphQLTag(tag) {
-  return tag.type === 'Identifier' && tag.name === 'graphql';
-}
-
-function isGraphQLDeprecatedTag(tag) {
-  return tag.type === 'Identifier' && tag.name === 'graphql_DEPRECATED';
-}
-
-function shouldLint(context) {
-  return /graphql|relay/i.test(context.getSourceCode().text);
-}
-
-module.exports = {
-  getGraphQLAST: getGraphQLAST,
-  getLoc: getLoc,
-  getLocFromIndex: getLocFromIndex,
-  getModuleName: getModuleName,
-  getRange: getRange,
-  isGraphQLTag: isGraphQLTag,
-  isGraphQLDeprecatedTag: isGraphQLDeprecatedTag,
-  shouldLint: shouldLint
-};
diff --git a/node_modules/eslint-scope/CHANGELOG.md b/node_modules/eslint-scope/CHANGELOG.md
index 5372ac4..cc07de0 100644
--- a/node_modules/eslint-scope/CHANGELOG.md
+++ b/node_modules/eslint-scope/CHANGELOG.md
@@ -1,3 +1,9 @@
+v5.1.1 - September 12, 2020
+
+* [`9b528d7`](https://github.com/eslint/eslint-scope/commit/9b528d778c381718c12dabfb7f1c0e0dc6b36e49) Upgrade: esrecurse version to ^4.3.0 (#64) (Timofey Kachalov)
+* [`f758bbc`](https://github.com/eslint/eslint-scope/commit/f758bbc3d49b9b9ea2289a5d6a6bba8dcf2c4903) Chore: fix definiton -> definition typo in comments (#63) (Kevin Kirsche)
+* [`7513734`](https://github.com/eslint/eslint-scope/commit/751373473375b3f2edc4eaf1c8d2763d8435bb72) Chore: move to GitHub Actions (#62) (Kai Cataldo)
+
 v5.1.0 - June 4, 2020
 
 * [`d4a3764`](https://github.com/eslint/eslint-scope/commit/d4a376434b16289c1a428d7e304576e997520873) Update: support new export syntax (#56) (Toru Nagashima)
diff --git a/node_modules/eslint-scope/lib/scope.js b/node_modules/eslint-scope/lib/scope.js
index 5c4c967..bdb5f63 100644
--- a/node_modules/eslint-scope/lib/scope.js
+++ b/node_modules/eslint-scope/lib/scope.js
@@ -37,7 +37,7 @@
  * Test if scope is struct
  * @param {Scope} scope - scope
  * @param {Block} block - block
- * @param {boolean} isMethodDefinition - is method definiton
+ * @param {boolean} isMethodDefinition - is method definition
  * @param {boolean} useDirective - use directive
  * @returns {boolean} is strict scope
  */
diff --git a/node_modules/eslint-scope/package.json b/node_modules/eslint-scope/package.json
index a19fd8c..b700b92 100644
--- a/node_modules/eslint-scope/package.json
+++ b/node_modules/eslint-scope/package.json
@@ -3,7 +3,7 @@
   "description": "ECMAScript scope analyzer for ESLint",
   "homepage": "http://github.com/eslint/eslint-scope",
   "main": "lib/index.js",
-  "version": "5.1.0",
+  "version": "5.1.1",
   "engines": {
     "node": ">=8.0.0"
   },
@@ -27,7 +27,7 @@
     "lib"
   ],
   "dependencies": {
-    "esrecurse": "^4.1.0",
+    "esrecurse": "^4.3.0",
     "estraverse": "^4.1.1"
   },
   "devDependencies": {
diff --git a/node_modules/eslint/CHANGELOG.md b/node_modules/eslint/CHANGELOG.md
index 2898526..6b6919d 100644
--- a/node_modules/eslint/CHANGELOG.md
+++ b/node_modules/eslint/CHANGELOG.md
@@ -1,3 +1,34 @@
+v7.11.0 - October 9, 2020
+
+* [`23e966f`](https://github.com/eslint/eslint/commit/23e966f6cf2a6c6b699dff5d6950ece3cc396498) Chore: Refactor CLIEngine tests (refs #13481) (#13709) (Nicholas C. Zakas)
+* [`fa9429a`](https://github.com/eslint/eslint/commit/fa9429aac0ffed505f3f02e8fc75f646c69f5c61) Fix: don't count line after EOF in max-lines (#13735) (Milos Djermanovic)
+* [`d973675`](https://github.com/eslint/eslint/commit/d973675a5c06a2bd4f8ce640c78b67842cfebfd4) Docs: Update anchor links to use existing linkrefs (refs #13715) (#13741) (Brandon Mills)
+* [`2c6d774`](https://github.com/eslint/eslint/commit/2c6d774c89dcd14f386bd9d73d451fa2a892c3ef) Docs: Fix typos (#13730) (Frieder Bluemle)
+* [`cc468c0`](https://github.com/eslint/eslint/commit/cc468c01021385a028de727eefcd442e7f34875c) Upgrade: eslint-visitor-keys@2.0.0 (#13732) (Milos Djermanovic)
+* [`ab0ac6c`](https://github.com/eslint/eslint/commit/ab0ac6c532fb7b7d49779c8913146244d680743b) Docs: Fix anchor links (#13715) (Gary Moore)
+* [`27f0de6`](https://github.com/eslint/eslint/commit/27f0de62e6281c28043be38ef051818c9edc15cd) Fix: account for linebreaks before postfix `++`/`--` in no-extra-parens (#13731) (Milos Djermanovic)
+* [`da78fa1`](https://github.com/eslint/eslint/commit/da78fa11632a2908db4ac494012a16f5d5a88a64) Update: support async arrow fn in function-paren-newline (fixes #13728) (#13729) (Michal Dziekonski)
+* [`fe301b8`](https://github.com/eslint/eslint/commit/fe301b8cc0762d7f4edd59603ca51ed0ec0c2a43) Docs: Add configuration comments in examples (#13738) (YeonJuan)
+* [`504408c`](https://github.com/eslint/eslint/commit/504408cd65e9d8827b2b8bbeb8f589df90eee523) Sponsors: Sync README with website (ESLint Jenkins)
+* [`3900659`](https://github.com/eslint/eslint/commit/390065985b2289ad4412a83598e3e833c382d27e) Sponsors: Sync README with website (ESLint Jenkins)
+* [`c1974b3`](https://github.com/eslint/eslint/commit/c1974b3f7169a8e5fab7007df92d02d8c1a8d5a3) Sponsors: Sync README with website (ESLint Jenkins)
+* [`6f4abe5`](https://github.com/eslint/eslint/commit/6f4abe5d5ade2711cc4c21bc8485af952763c2d3) Sponsors: Sync README with website (ESLint Jenkins)
+
+v7.10.0 - September 26, 2020
+
+* [`6919fbb`](https://github.com/eslint/eslint/commit/6919fbb83f86552b0f49ae749da866e4edc7c46a) Docs: Clarify that ignorePattern should be a string (refs #13029) (#13718) (Brandon Mills)
+* [`07d9bea`](https://github.com/eslint/eslint/commit/07d9bea7c6f953e8f754afffc9752edcee799431) Update: Add ignorePattern to no-inline-comments (#13029) (Edie Lemoine)
+* [`d79bbe9`](https://github.com/eslint/eslint/commit/d79bbe982930b53358d34ad91cc6e5eaac8ddede) Docs: fix typo (#13717) (Alexander Liu)
+* [`9b8490e`](https://github.com/eslint/eslint/commit/9b8490ee6391c986b1314540a92b71d8c1e0efc4) Docs: grammatical error (#13687) (rajdeep)
+* [`cb44e93`](https://github.com/eslint/eslint/commit/cb44e93f4780e925a75a68ce2f7f6d065b5f756c) Fix: prefer-destructuring invalid autofix with computed property access (#13704) (Milos Djermanovic)
+* [`46c73b1`](https://github.com/eslint/eslint/commit/46c73b159a5ceed2f7f26f254fd97e459fb0e81a) Upgrade: eslint-scope@5.1.1 (#13716) (Milos Djermanovic)
+* [`b7b12ba`](https://github.com/eslint/eslint/commit/b7b12ba0bd4e9c66883f11e97de8ed84b600cdaa) Chore: Move comment to make tests more organized (#13707) (Yusuke Tanaka)
+* [`51674a4`](https://github.com/eslint/eslint/commit/51674a4113a1ca877094606bbf4938ab06cc1aad) Docs: Add missing quotes (#13714) (Lucio Paiva)
+* [`7c34a98`](https://github.com/eslint/eslint/commit/7c34a982aaf93a02348f56c9ce887c7dcf51b5bd) Chore: remove mistakenly added file (#13710) (Milos Djermanovic)
+* [`30b76c9`](https://github.com/eslint/eslint/commit/30b76c9a13fae3dff59f7db406d6c66f11152973) Docs: Clarify package.json requirement in Getting Started (refs #13549) (#13696) (Nicholas C. Zakas)
+* [`044560d`](https://github.com/eslint/eslint/commit/044560dcc74db98b28e293da2e2f3b41ecbf5884) Sponsors: Sync README with website (ESLint Jenkins)
+* [`54000d1`](https://github.com/eslint/eslint/commit/54000d13f27d5255851b5ac0606ad027e2b8d331) Sponsors: Sync README with website (ESLint Jenkins)
+
 v7.9.0 - September 12, 2020
 
 * [`3ca2700`](https://github.com/eslint/eslint/commit/3ca27004ece5016ba7aed775f01ad13bc9282296) Fix: Corrected notice for invalid (:) plugin names (#13473) (Josh Goldberg)
diff --git a/node_modules/eslint/README.md b/node_modules/eslint/README.md
index f5081d2..4d527e8 100644
--- a/node_modules/eslint/README.md
+++ b/node_modules/eslint/README.md
@@ -1,4 +1,4 @@
-[![NPM version](https://img.shields.io/npm/v/eslint.svg)](https://www.npmjs.com/package/eslint)
+[![npm version](https://img.shields.io/npm/v/eslint.svg)](https://www.npmjs.com/package/eslint)
 [![Downloads](https://img.shields.io/npm/dm/eslint.svg)](https://www.npmjs.com/package/eslint)
 [![Build Status](https://github.com/eslint/eslint/workflows/CI/badge.svg)](https://github.com/eslint/eslint/actions)
 [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Feslint%2Feslint.svg?type=shield)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Feslint%2Feslint?ref=badge_shield)
@@ -266,7 +266,7 @@
 <h3>Gold Sponsors</h3>
 <p><a href="https://www.salesforce.com"><img src="https://images.opencollective.com/salesforce/ca8f997/logo.png" alt="Salesforce" height="96"></a> <a href="https://www.airbnb.com/"><img src="https://images.opencollective.com/airbnb/d327d66/logo.png" alt="Airbnb" height="96"></a> <a href="https://aka.ms/microsoftfossfund"><img src="https://avatars1.githubusercontent.com/u/67931232?u=7fddc652a464d7151b97e8f108392af7d54fa3e8&v=4" alt="Microsoft FOSS Fund Sponsorships" height="96"></a></p><h3>Silver Sponsors</h3>
 <p><a href="https://liftoff.io/"><img src="https://images.opencollective.com/liftoff/5c4fa84/logo.png" alt="Liftoff" height="64"></a> <a href="https://www.ampproject.org/"><img src="https://images.opencollective.com/amp/c8a3b25/logo.png" alt="AMP Project" height="64"></a></p><h3>Bronze Sponsors</h3>
-<p><a href="https://buy.fineproxy.org/eng/"><img src="https://images.opencollective.com/buy-fineproxy-org/2002c40/logo.png" alt="Buy.Fineproxy.Org" height="32"></a> <a href="https://www.veikkaajat.com"><img src="https://images.opencollective.com/veikkaajat/b92b427/logo.png" alt="Veikkaajat.com" height="32"></a> <a href="https://www.nettikasinot.media/"><img src="https://images.opencollective.com/nettikasinot-media/2dba7da/logo.png" alt="Nettikasinot.media" height="32"></a> <a href="https://mytruemedia.com/"><img src="https://images.opencollective.com/my-true-media/03e2168/logo.png" alt="My True Media" height="32"></a> <a href="https://www.norgekasino.com"><img src="https://images.opencollective.com/norgekasino/ecfd57a/logo.png" alt="Norgekasino" height="32"></a> <a href="https://www.japanesecasino.com/"><img src="https://images.opencollective.com/japanesecasino/b0ffe3c/logo.png" alt="Japanesecasino" height="32"></a> <a href="https://www.casinotop.com/"><img src="https://images.opencollective.com/casinotop-com/10fd95b/logo.png" alt="CasinoTop.com" height="32"></a> <a href="https://www.casinotopp.net/"><img src="https://images.opencollective.com/casino-topp/1dd399a/logo.png" alt="Casino Topp" height="32"></a> <a href="https://www.crosswordsolver.org/anagram-solver/"><img src="https://images.opencollective.com/anagram-solver/2666271/logo.png" alt="Anagram Solver" height="32"></a> <a href="https://www.kasinot.fi"><img src="https://images.opencollective.com/kasinot-fi/e09aa2e/logo.png" alt="Kasinot.fi" height="32"></a> <a href="https://www.pelisivut.com"><img src="https://images.opencollective.com/pelisivut/04f08f2/logo.png" alt="Pelisivut" height="32"></a> <a href="https://www.nettikasinot.org"><img src="https://images.opencollective.com/nettikasinot-org/53a4b44/logo.png" alt="Nettikasinot.org" height="32"></a> <a href="https://www.bonus.com.de/freispiele"><img src="https://images.opencollective.com/bonusfinder-deutschland/646169e/logo.png" alt="BonusFinder Deutschland" height="32"></a> <a href="null"><img src="https://images.opencollective.com/bugsnag-stability-monitoring/c2cef36/logo.png" alt="Bugsnag Stability Monitoring" height="32"></a> <a href="https://mixpanel.com"><img src="https://images.opencollective.com/mixpanel/cd682f7/logo.png" alt="Mixpanel" height="32"></a> <a href="https://www.vpsserver.com"><img src="https://images.opencollective.com/vpsservercom/logo.png" alt="VPS Server" height="32"></a> <a href="https://icons8.com"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8: free icons, photos, illustrations, and music" height="32"></a> <a href="https://discordapp.com"><img src="https://images.opencollective.com/discordapp/7e3d9a9/logo.png" alt="Discord" height="32"></a> <a href="https://themeisle.com"><img src="https://images.opencollective.com/themeisle/d5592fe/logo.png" alt="ThemeIsle" height="32"></a> <a href="https://www.marfeel.com/"><img src="https://images.opencollective.com/marfeel/4b88e30/logo.png" alt="Marfeel" height="32"></a> <a href="https://www.firesticktricks.com"><img src="https://images.opencollective.com/fire-stick-tricks/b8fbe2c/logo.png" alt="Fire Stick Tricks" height="32"></a></p>
+<p><a href="https://writersperhour.com/write-my-essay"><img src="https://images.opencollective.com/writersperhour/5787d4b/logo.png" alt="Writers Per Hour" height="32"></a> <a href="https://www.betacalendars.com/printable-calendar"><img src="https://images.opencollective.com/betacalendars/9334b33/logo.png" alt="2021 calendar" height="32"></a> <a href="https://buy.fineproxy.org/eng/"><img src="https://images.opencollective.com/buy-fineproxy-org/2002c40/logo.png" alt="Buy.Fineproxy.Org" height="32"></a> <a href="https://www.veikkaajat.com"><img src="https://images.opencollective.com/veikkaajat/b92b427/logo.png" alt="Veikkaajat.com" height="32"></a> <a href="https://www.nettikasinot.media/"><img src="https://images.opencollective.com/nettikasinot-media/2dba7da/logo.png" alt="Nettikasinot.media" height="32"></a> <a href="https://www.norgekasino.com"><img src="https://images.opencollective.com/norgekasino/ecfd57a/logo.png" alt="Norgekasino" height="32"></a> <a href="https://www.japanesecasino.com/"><img src="https://images.opencollective.com/japanesecasino/b0ffe3c/logo.png" alt="Japanesecasino" height="32"></a> <a href="https://www.casinotop.com/"><img src="https://images.opencollective.com/casinotop-com/10fd95b/logo.png" alt="CasinoTop.com" height="32"></a> <a href="https://www.casinotopp.net/"><img src="https://images.opencollective.com/casino-topp/1dd399a/logo.png" alt="Casino Topp" height="32"></a> <a href="https://www.crosswordsolver.org/anagram-solver/"><img src="https://images.opencollective.com/anagram-solver/2666271/logo.png" alt="Anagram Solver" height="32"></a> <a href="https://www.kasinot.fi"><img src="https://images.opencollective.com/kasinot-fi/e09aa2e/logo.png" alt="Kasinot.fi" height="32"></a> <a href="https://www.pelisivut.com"><img src="https://images.opencollective.com/pelisivut/04f08f2/logo.png" alt="Pelisivut" height="32"></a> <a href="https://www.nettikasinot.org"><img src="https://images.opencollective.com/nettikasinot-org/53a4b44/logo.png" alt="Nettikasinot.org" height="32"></a> <a href="https://www.bonus.com.de/freispiele"><img src="https://images.opencollective.com/bonusfinder-deutschland/646169e/logo.png" alt="BonusFinder Deutschland" height="32"></a> <a href="null"><img src="https://images.opencollective.com/bugsnag-stability-monitoring/c2cef36/logo.png" alt="Bugsnag Stability Monitoring" height="32"></a> <a href="https://mixpanel.com"><img src="https://images.opencollective.com/mixpanel/cd682f7/logo.png" alt="Mixpanel" height="32"></a> <a href="https://www.vpsserver.com"><img src="https://images.opencollective.com/vpsservercom/logo.png" alt="VPS Server" height="32"></a> <a href="https://icons8.com"><img src="https://images.opencollective.com/icons8/7fa1641/logo.png" alt="Icons8: free icons, photos, illustrations, and music" height="32"></a> <a href="https://discordapp.com"><img src="https://images.opencollective.com/discordapp/7e3d9a9/logo.png" alt="Discord" height="32"></a> <a href="https://themeisle.com"><img src="https://images.opencollective.com/themeisle/d5592fe/logo.png" alt="ThemeIsle" height="32"></a> <a href="https://www.marfeel.com/"><img src="https://images.opencollective.com/marfeel/4b88e30/logo.png" alt="Marfeel" height="32"></a> <a href="https://www.firesticktricks.com"><img src="https://images.opencollective.com/fire-stick-tricks/b8fbe2c/logo.png" alt="Fire Stick Tricks" height="32"></a></p>
 <!--sponsorsend-->
 
 ## <a name="technology-sponsors"></a>Technology Sponsors
diff --git a/node_modules/eslint/lib/rules/function-paren-newline.js b/node_modules/eslint/lib/rules/function-paren-newline.js
index 894c8e3..9d8d67b 100644
--- a/node_modules/eslint/lib/rules/function-paren-newline.js
+++ b/node_modules/eslint/lib/rules/function-paren-newline.js
@@ -218,7 +218,7 @@
                 }
 
                 case "ArrowFunctionExpression": {
-                    const firstToken = sourceCode.getFirstToken(node);
+                    const firstToken = sourceCode.getFirstToken(node, { skip: (node.async ? 1 : 0) });
 
                     if (!astUtils.isOpeningParenToken(firstToken)) {
 
diff --git a/node_modules/eslint/lib/rules/max-lines.js b/node_modules/eslint/lib/rules/max-lines.js
index f33adbd..0c7e761 100644
--- a/node_modules/eslint/lib/rules/max-lines.js
+++ b/node_modules/eslint/lib/rules/max-lines.js
@@ -131,6 +131,14 @@
                     text
                 }));
 
+                /*
+                 * If file ends with a linebreak, `sourceCode.lines` will have one extra empty line at the end.
+                 * That isn't a real line, so we shouldn't count it.
+                 */
+                if (lines.length > 1 && lodash.last(lines).text === "") {
+                    lines.pop();
+                }
+
                 if (skipBlankLines) {
                     lines = lines.filter(l => l.text.trim() !== "");
                 }
diff --git a/node_modules/eslint/lib/rules/no-extra-parens.js b/node_modules/eslint/lib/rules/no-extra-parens.js
index e9d394c..7afe762 100644
--- a/node_modules/eslint/lib/rules/no-extra-parens.js
+++ b/node_modules/eslint/lib/rules/no-extra-parens.js
@@ -1109,7 +1109,22 @@
             },
 
             UnaryExpression: checkArgumentWithPrecedence,
-            UpdateExpression: checkArgumentWithPrecedence,
+            UpdateExpression(node) {
+                if (node.prefix) {
+                    checkArgumentWithPrecedence(node);
+                } else {
+                    const { argument } = node;
+                    const operatorToken = sourceCode.getLastToken(node);
+
+                    if (argument.loc.end.line === operatorToken.loc.start.line) {
+                        checkArgumentWithPrecedence(node);
+                    } else {
+                        if (hasDoubleExcessParens(argument)) {
+                            report(argument);
+                        }
+                    }
+                }
+            },
             AwaitExpression: checkArgumentWithPrecedence,
 
             VariableDeclarator(node) {
diff --git a/node_modules/eslint/lib/rules/no-inline-comments.js b/node_modules/eslint/lib/rules/no-inline-comments.js
index 41b0f1e..dec2786 100644
--- a/node_modules/eslint/lib/rules/no-inline-comments.js
+++ b/node_modules/eslint/lib/rules/no-inline-comments.js
@@ -21,7 +21,17 @@
             url: "https://eslint.org/docs/rules/no-inline-comments"
         },
 
-        schema: [],
+        schema: [
+            {
+                type: "object",
+                properties: {
+                    ignorePattern: {
+                        type: "string"
+                    }
+                },
+                additionalProperties: false
+            }
+        ],
 
         messages: {
             unexpectedInlineComment: "Unexpected comment inline with code."
@@ -30,6 +40,12 @@
 
     create(context) {
         const sourceCode = context.getSourceCode();
+        const options = context.options[0];
+        let customIgnoreRegExp;
+
+        if (options && options.ignorePattern) {
+            customIgnoreRegExp = new RegExp(options.ignorePattern, "u");
+        }
 
         /**
          * Will check that comments are not on lines starting with or ending with code
@@ -51,6 +67,11 @@
                 return;
             }
 
+            // Matches the ignore pattern
+            if (customIgnoreRegExp && customIgnoreRegExp.test(node.value)) {
+                return;
+            }
+
             // JSX Exception
             if (
                 (isPreambleEmpty || preamble === "{") &&
@@ -80,9 +101,9 @@
 
         return {
             Program() {
-                const comments = sourceCode.getAllComments();
-
-                comments.filter(token => token.type !== "Shebang").forEach(testCodeAroundComment);
+                sourceCode.getAllComments()
+                    .filter(token => token.type !== "Shebang")
+                    .forEach(testCodeAroundComment);
             }
         };
     }
diff --git a/node_modules/eslint/lib/rules/prefer-destructuring.js b/node_modules/eslint/lib/rules/prefer-destructuring.js
index d3314dc..66e412f 100644
--- a/node_modules/eslint/lib/rules/prefer-destructuring.js
+++ b/node_modules/eslint/lib/rules/prefer-destructuring.js
@@ -163,6 +163,8 @@
             return node.type === "VariableDeclarator" &&
                 node.id.type === "Identifier" &&
                 node.init.type === "MemberExpression" &&
+                !node.init.computed &&
+                node.init.property.type === "Identifier" &&
                 node.id.name === node.init.property.name;
         }
 
diff --git a/node_modules/eslint/node_modules/.bin/semver b/node_modules/eslint/node_modules/.bin/semver
index 5aaadf4..20a3df4 120000
--- a/node_modules/eslint/node_modules/.bin/semver
+++ b/node_modules/eslint/node_modules/.bin/semver
@@ -1 +1 @@
-../semver/bin/semver.js
\ No newline at end of file
+../../../jest-circus/node_modules/semver/bin/semver.js
\ No newline at end of file
diff --git a/node_modules/eslint/node_modules/eslint-visitor-keys/CHANGELOG.md b/node_modules/eslint/node_modules/eslint-visitor-keys/CHANGELOG.md
new file mode 100644
index 0000000..a980b62
--- /dev/null
+++ b/node_modules/eslint/node_modules/eslint-visitor-keys/CHANGELOG.md
@@ -0,0 +1,30 @@
+v2.0.0 - August 14, 2020
+
+* [`fb86ca3`](https://github.com/eslint/eslint-visitor-keys/commit/fb86ca315daafc84e23ed9005db40b0892b972a6) Breaking: drop support for Node <10 (#13) (Kai Cataldo)
+* [`69383b3`](https://github.com/eslint/eslint-visitor-keys/commit/69383b372915e33ada094880ecc6b6e8f8c7ca4e) Chore: move to GitHub Actions (#14) (Kai Cataldo)
+
+v1.3.0 - June 19, 2020
+
+* [`c92dd7f`](https://github.com/eslint/eslint-visitor-keys/commit/c92dd7ff96f0044dba12d681406a025b92b4c437) Update: add `ChainExpression` node (#12) (Toru Nagashima)
+
+v1.2.0 - June 4, 2020
+
+* [`21f28bf`](https://github.com/eslint/eslint-visitor-keys/commit/21f28bf11be5329d740a8bf6bdbcd0ef13bbf1a2) Update: added exported in exportAllDeclaration key (#10) (Anix)
+
+v1.1.0 - August 13, 2019
+
+* [`9331cc0`](https://github.com/eslint/eslint-visitor-keys/commit/9331cc09e756e65b9044c9186445a474b037fac6) Update: add ImportExpression (#8) (Toru Nagashima)
+* [`5967f58`](https://github.com/eslint/eslint-visitor-keys/commit/5967f583b04f17fba9226aaa394e45d476d2b8af) Chore: add supported Node.js versions to CI (#7) (Kai Cataldo)
+* [`6f7c60f`](https://github.com/eslint/eslint-visitor-keys/commit/6f7c60fef2ceec9f6323202df718321cec45cab0) Upgrade: eslint-release@1.0.0 (#5) (Teddy Katz)
+
+v1.0.0 - December 18, 2017
+
+* 1f6bd38 Breaking: update keys (#4) (Toru Nagashima)
+
+v0.1.0 - November 17, 2017
+
+* 17b4a88 Chore: update `repository` field in package.json (#3) (Toru Nagashima)
+* a5a026b New: eslint-visitor-keys (#1) (Toru Nagashima)
+* a1a48b8 Update: Change license to Apache 2 (#2) (Ilya Volodin)
+* 2204715 Initial commit (Toru Nagashima)
+
diff --git a/node_modules/eslint/node_modules/eslint-visitor-keys/LICENSE b/node_modules/eslint/node_modules/eslint-visitor-keys/LICENSE
new file mode 100644
index 0000000..17a2553
--- /dev/null
+++ b/node_modules/eslint/node_modules/eslint-visitor-keys/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright contributors
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/node_modules/eslint/node_modules/eslint-visitor-keys/README.md b/node_modules/eslint/node_modules/eslint-visitor-keys/README.md
new file mode 100644
index 0000000..250f5fa
--- /dev/null
+++ b/node_modules/eslint/node_modules/eslint-visitor-keys/README.md
@@ -0,0 +1,98 @@
+# eslint-visitor-keys
+
+[![npm version](https://img.shields.io/npm/v/eslint-visitor-keys.svg)](https://www.npmjs.com/package/eslint-visitor-keys)
+[![Downloads/month](https://img.shields.io/npm/dm/eslint-visitor-keys.svg)](http://www.npmtrends.com/eslint-visitor-keys)
+[![Build Status](https://travis-ci.org/eslint/eslint-visitor-keys.svg?branch=master)](https://travis-ci.org/eslint/eslint-visitor-keys)
+[![Dependency Status](https://david-dm.org/eslint/eslint-visitor-keys.svg)](https://david-dm.org/eslint/eslint-visitor-keys)
+
+Constants and utilities about visitor keys to traverse AST.
+
+## 💿 Installation
+
+Use [npm] to install.
+
+```bash
+$ npm install eslint-visitor-keys
+```
+
+### Requirements
+
+- [Node.js] 4.0.0 or later.
+
+## 📖 Usage
+
+```js
+const evk = require("eslint-visitor-keys")
+```
+
+### evk.KEYS
+
+> type: `{ [type: string]: string[] | undefined }`
+
+Visitor keys. This keys are frozen.
+
+This is an object. Keys are the type of [ESTree] nodes. Their values are an array of property names which have child nodes.
+
+For example:
+
+```
+console.log(evk.KEYS.AssignmentExpression) // → ["left", "right"]
+```
+
+### evk.getKeys(node)
+
+> type: `(node: object) => string[]`
+
+Get the visitor keys of a given AST node.
+
+This is similar to `Object.keys(node)` of ES Standard, but some keys are excluded: `parent`, `leadingComments`, `trailingComments`, and names which start with `_`.
+
+This will be used to traverse unknown nodes.
+
+For example:
+
+```
+const node = {
+    type: "AssignmentExpression",
+    left: { type: "Identifier", name: "foo" },
+    right: { type: "Literal", value: 0 }
+}
+console.log(evk.getKeys(node)) // → ["type", "left", "right"]
+```
+
+### evk.unionWith(additionalKeys)
+
+> type: `(additionalKeys: object) => { [type: string]: string[] | undefined }`
+
+Make the union set with `evk.KEYS` and the given keys.
+
+- The order of keys is, `additionalKeys` is at first, then `evk.KEYS` is concatenated after that.
+- It removes duplicated keys as keeping the first one.
+
+For example:
+
+```
+console.log(evk.unionWith({
+    MethodDefinition: ["decorators"]
+})) // → { ..., MethodDefinition: ["decorators", "key", "value"], ... }
+```
+
+## 📰 Change log
+
+See [GitHub releases](https://github.com/eslint/eslint-visitor-keys/releases).
+
+## 🍻 Contributing
+
+Welcome. See [ESLint contribution guidelines](https://eslint.org/docs/developer-guide/contributing/).
+
+### Development commands
+
+- `npm test` runs tests and measures code coverage.
+- `npm run lint` checks source codes with ESLint.
+- `npm run coverage` opens the code coverage report of the previous test with your default browser.
+- `npm run release` publishes this package to [npm] registory.
+
+
+[npm]: https://www.npmjs.com/
+[Node.js]: https://nodejs.org/en/
+[ESTree]: https://github.com/estree/estree
diff --git a/node_modules/eslint/node_modules/eslint-visitor-keys/lib/index.js b/node_modules/eslint/node_modules/eslint-visitor-keys/lib/index.js
new file mode 100644
index 0000000..cd8a326
--- /dev/null
+++ b/node_modules/eslint/node_modules/eslint-visitor-keys/lib/index.js
@@ -0,0 +1,81 @@
+/**
+ * @author Toru Nagashima <https://github.com/mysticatea>
+ * See LICENSE file in root directory for full license.
+ */
+"use strict";
+
+const KEYS = require("./visitor-keys.json");
+
+// Types.
+const NODE_TYPES = Object.freeze(Object.keys(KEYS));
+
+// Freeze the keys.
+for (const type of NODE_TYPES) {
+    Object.freeze(KEYS[type]);
+}
+Object.freeze(KEYS);
+
+// List to ignore keys.
+const KEY_BLACKLIST = new Set([
+    "parent",
+    "leadingComments",
+    "trailingComments"
+]);
+
+/**
+ * Check whether a given key should be used or not.
+ * @param {string} key The key to check.
+ * @returns {boolean} `true` if the key should be used.
+ */
+function filterKey(key) {
+    return !KEY_BLACKLIST.has(key) && key[0] !== "_";
+}
+
+//------------------------------------------------------------------------------
+// Public interfaces
+//------------------------------------------------------------------------------
+
+module.exports = Object.freeze({
+
+    /**
+     * Visitor keys.
+     * @type {{ [type: string]: string[] | undefined }}
+     */
+    KEYS,
+
+    /**
+     * Get visitor keys of a given node.
+     * @param {Object} node The AST node to get keys.
+     * @returns {string[]} Visitor keys of the node.
+     */
+    getKeys(node) {
+        return Object.keys(node).filter(filterKey);
+    },
+
+    // Disable valid-jsdoc rule because it reports syntax error on the type of @returns.
+    // eslint-disable-next-line valid-jsdoc
+    /**
+     * Make the union set with `KEYS` and given keys.
+     * @param {Object} additionalKeys The additional keys.
+     * @returns {{ [type: string]: string[] | undefined }} The union set.
+     */
+    unionWith(additionalKeys) {
+        const retv = Object.assign({}, KEYS);
+
+        for (const type of Object.keys(additionalKeys)) {
+            if (retv.hasOwnProperty(type)) {
+                const keys = new Set(additionalKeys[type]);
+
+                for (const key of retv[type]) {
+                    keys.add(key);
+                }
+
+                retv[type] = Object.freeze(Array.from(keys));
+            } else {
+                retv[type] = Object.freeze(Array.from(additionalKeys[type]));
+            }
+        }
+
+        return Object.freeze(retv);
+    }
+});
diff --git a/node_modules/eslint/node_modules/eslint-visitor-keys/lib/visitor-keys.json b/node_modules/eslint/node_modules/eslint-visitor-keys/lib/visitor-keys.json
new file mode 100644
index 0000000..a33bbc6
--- /dev/null
+++ b/node_modules/eslint/node_modules/eslint-visitor-keys/lib/visitor-keys.json
@@ -0,0 +1,284 @@
+{
+    "AssignmentExpression": [
+        "left",
+        "right"
+    ],
+    "AssignmentPattern": [
+        "left",
+        "right"
+    ],
+    "ArrayExpression": [
+        "elements"
+    ],
+    "ArrayPattern": [
+        "elements"
+    ],
+    "ArrowFunctionExpression": [
+        "params",
+        "body"
+    ],
+    "AwaitExpression": [
+        "argument"
+    ],
+    "BlockStatement": [
+        "body"
+    ],
+    "BinaryExpression": [
+        "left",
+        "right"
+    ],
+    "BreakStatement": [
+        "label"
+    ],
+    "CallExpression": [
+        "callee",
+        "arguments"
+    ],
+    "CatchClause": [
+        "param",
+        "body"
+    ],
+    "ChainExpression": [
+        "expression"
+    ],
+    "ClassBody": [
+        "body"
+    ],
+    "ClassDeclaration": [
+        "id",
+        "superClass",
+        "body"
+    ],
+    "ClassExpression": [
+        "id",
+        "superClass",
+        "body"
+    ],
+    "ConditionalExpression": [
+        "test",
+        "consequent",
+        "alternate"
+    ],
+    "ContinueStatement": [
+        "label"
+    ],
+    "DebuggerStatement": [],
+    "DoWhileStatement": [
+        "body",
+        "test"
+    ],
+    "EmptyStatement": [],
+    "ExportAllDeclaration": [
+        "exported",
+        "source"
+    ],
+    "ExportDefaultDeclaration": [
+        "declaration"
+    ],
+    "ExportNamedDeclaration": [
+        "declaration",
+        "specifiers",
+        "source"
+    ],
+    "ExportSpecifier": [
+        "exported",
+        "local"
+    ],
+    "ExpressionStatement": [
+        "expression"
+    ],
+    "ExperimentalRestProperty": [
+        "argument"
+    ],
+    "ExperimentalSpreadProperty": [
+        "argument"
+    ],
+    "ForStatement": [
+        "init",
+        "test",
+        "update",
+        "body"
+    ],
+    "ForInStatement": [
+        "left",
+        "right",
+        "body"
+    ],
+    "ForOfStatement": [
+        "left",
+        "right",
+        "body"
+    ],
+    "FunctionDeclaration": [
+        "id",
+        "params",
+        "body"
+    ],
+    "FunctionExpression": [
+        "id",
+        "params",
+        "body"
+    ],
+    "Identifier": [],
+    "IfStatement": [
+        "test",
+        "consequent",
+        "alternate"
+    ],
+    "ImportDeclaration": [
+        "specifiers",
+        "source"
+    ],
+    "ImportDefaultSpecifier": [
+        "local"
+    ],
+    "ImportExpression": [
+        "source"
+    ],
+    "ImportNamespaceSpecifier": [
+        "local"
+    ],
+    "ImportSpecifier": [
+        "imported",
+        "local"
+    ],
+    "JSXAttribute": [
+        "name",
+        "value"
+    ],
+    "JSXClosingElement": [
+        "name"
+    ],
+    "JSXElement": [
+        "openingElement",
+        "children",
+        "closingElement"
+    ],
+    "JSXEmptyExpression": [],
+    "JSXExpressionContainer": [
+        "expression"
+    ],
+    "JSXIdentifier": [],
+    "JSXMemberExpression": [
+        "object",
+        "property"
+    ],
+    "JSXNamespacedName": [
+        "namespace",
+        "name"
+    ],
+    "JSXOpeningElement": [
+        "name",
+        "attributes"
+    ],
+    "JSXSpreadAttribute": [
+        "argument"
+    ],
+    "JSXText": [],
+    "JSXFragment": [
+        "openingFragment",
+        "children",
+        "closingFragment"
+    ],
+    "Literal": [],
+    "LabeledStatement": [
+        "label",
+        "body"
+    ],
+    "LogicalExpression": [
+        "left",
+        "right"
+    ],
+    "MemberExpression": [
+        "object",
+        "property"
+    ],
+    "MetaProperty": [
+        "meta",
+        "property"
+    ],
+    "MethodDefinition": [
+        "key",
+        "value"
+    ],
+    "NewExpression": [
+        "callee",
+        "arguments"
+    ],
+    "ObjectExpression": [
+        "properties"
+    ],
+    "ObjectPattern": [
+        "properties"
+    ],
+    "Program": [
+        "body"
+    ],
+    "Property": [
+        "key",
+        "value"
+    ],
+    "RestElement": [
+        "argument"
+    ],
+    "ReturnStatement": [
+        "argument"
+    ],
+    "SequenceExpression": [
+        "expressions"
+    ],
+    "SpreadElement": [
+        "argument"
+    ],
+    "Super": [],
+    "SwitchStatement": [
+        "discriminant",
+        "cases"
+    ],
+    "SwitchCase": [
+        "test",
+        "consequent"
+    ],
+    "TaggedTemplateExpression": [
+        "tag",
+        "quasi"
+    ],
+    "TemplateElement": [],
+    "TemplateLiteral": [
+        "quasis",
+        "expressions"
+    ],
+    "ThisExpression": [],
+    "ThrowStatement": [
+        "argument"
+    ],
+    "TryStatement": [
+        "block",
+        "handler",
+        "finalizer"
+    ],
+    "UnaryExpression": [
+        "argument"
+    ],
+    "UpdateExpression": [
+        "argument"
+    ],
+    "VariableDeclaration": [
+        "declarations"
+    ],
+    "VariableDeclarator": [
+        "id",
+        "init"
+    ],
+    "WhileStatement": [
+        "test",
+        "body"
+    ],
+    "WithStatement": [
+        "object",
+        "body"
+    ],
+    "YieldExpression": [
+        "argument"
+    ]
+}
diff --git a/node_modules/eslint/node_modules/eslint-visitor-keys/package.json b/node_modules/eslint/node_modules/eslint-visitor-keys/package.json
new file mode 100644
index 0000000..a3b8dd6
--- /dev/null
+++ b/node_modules/eslint/node_modules/eslint-visitor-keys/package.json
@@ -0,0 +1,39 @@
+{
+  "name": "eslint-visitor-keys",
+  "version": "2.0.0",
+  "description": "Constants and utilities about visitor keys to traverse AST.",
+  "main": "lib/index.js",
+  "files": [
+    "lib"
+  ],
+  "engines": {
+    "node": ">=10"
+  },
+  "dependencies": {},
+  "devDependencies": {
+    "eslint": "^4.7.2",
+    "eslint-config-eslint": "^4.0.0",
+    "eslint-release": "^1.0.0",
+    "mocha": "^3.5.3",
+    "nyc": "^11.2.1",
+    "opener": "^1.4.3"
+  },
+  "scripts": {
+    "lint": "eslint lib tests/lib",
+    "test": "nyc mocha tests/lib",
+    "coverage": "nyc report --reporter lcov && opener coverage/lcov-report/index.html",
+    "generate-release": "eslint-generate-release",
+    "generate-alpharelease": "eslint-generate-prerelease alpha",
+    "generate-betarelease": "eslint-generate-prerelease beta",
+    "generate-rcrelease": "eslint-generate-prerelease rc",
+    "publish-release": "eslint-publish-release"
+  },
+  "repository": "eslint/eslint-visitor-keys",
+  "keywords": [],
+  "author": "Toru Nagashima (https://github.com/mysticatea)",
+  "license": "Apache-2.0",
+  "bugs": {
+    "url": "https://github.com/eslint/eslint-visitor-keys/issues"
+  },
+  "homepage": "https://github.com/eslint/eslint-visitor-keys#readme"
+}
diff --git a/node_modules/eslint/package.json b/node_modules/eslint/package.json
index 0ec47ad..e6930f5 100644
--- a/node_modules/eslint/package.json
+++ b/node_modules/eslint/package.json
@@ -1,6 +1,6 @@
 {
   "name": "eslint",
-  "version": "7.9.0",
+  "version": "7.11.0",
   "author": "Nicholas C. Zakas <nicholas+npm@nczconsulting.com>",
   "description": "An AST-based pattern checker for JavaScript.",
   "bin": {
@@ -54,9 +54,9 @@
     "debug": "^4.0.1",
     "doctrine": "^3.0.0",
     "enquirer": "^2.3.5",
-    "eslint-scope": "^5.1.0",
+    "eslint-scope": "^5.1.1",
     "eslint-utils": "^2.1.0",
-    "eslint-visitor-keys": "^1.3.0",
+    "eslint-visitor-keys": "^2.0.0",
     "espree": "^7.3.0",
     "esquery": "^1.2.0",
     "esutils": "^2.0.2",
@@ -105,6 +105,7 @@
     "eslint-release": "^2.0.0",
     "eslump": "^2.0.0",
     "esprima": "^4.0.1",
+    "fs-teardown": "^0.1.0",
     "glob": "^7.1.6",
     "jsdoc": "^3.5.5",
     "karma": "^4.0.1",
diff --git a/node_modules/esrecurse/node_modules/estraverse/.jshintrc b/node_modules/esrecurse/node_modules/estraverse/.jshintrc
new file mode 100644
index 0000000..f642dae
--- /dev/null
+++ b/node_modules/esrecurse/node_modules/estraverse/.jshintrc
@@ -0,0 +1,16 @@
+{
+  "curly": true,
+  "eqeqeq": true,
+  "immed": true,
+  "eqnull": true,
+  "latedef": true,
+  "noarg": true,
+  "noempty": true,
+  "quotmark": "single",
+  "undef": true,
+  "unused": true,
+  "strict": true,
+  "trailing": true,
+
+  "node": true
+}
diff --git a/node_modules/eslint-plugin-react/node_modules/doctrine/LICENSE.esprima b/node_modules/esrecurse/node_modules/estraverse/LICENSE.BSD
similarity index 100%
rename from node_modules/eslint-plugin-react/node_modules/doctrine/LICENSE.esprima
rename to node_modules/esrecurse/node_modules/estraverse/LICENSE.BSD
diff --git a/node_modules/esrecurse/node_modules/estraverse/README.md b/node_modules/esrecurse/node_modules/estraverse/README.md
new file mode 100644
index 0000000..ccd3377
--- /dev/null
+++ b/node_modules/esrecurse/node_modules/estraverse/README.md
@@ -0,0 +1,153 @@
+### Estraverse [![Build Status](https://secure.travis-ci.org/estools/estraverse.svg)](http://travis-ci.org/estools/estraverse)
+
+Estraverse ([estraverse](http://github.com/estools/estraverse)) is
+[ECMAScript](http://www.ecma-international.org/publications/standards/Ecma-262.htm)
+traversal functions from [esmangle project](http://github.com/estools/esmangle).
+
+### Documentation
+
+You can find usage docs at [wiki page](https://github.com/estools/estraverse/wiki/Usage).
+
+### Example Usage
+
+The following code will output all variables declared at the root of a file.
+
+```javascript
+estraverse.traverse(ast, {
+    enter: function (node, parent) {
+        if (node.type == 'FunctionExpression' || node.type == 'FunctionDeclaration')
+            return estraverse.VisitorOption.Skip;
+    },
+    leave: function (node, parent) {
+        if (node.type == 'VariableDeclarator')
+          console.log(node.id.name);
+    }
+});
+```
+
+We can use `this.skip`, `this.remove` and `this.break` functions instead of using Skip, Remove and Break.
+
+```javascript
+estraverse.traverse(ast, {
+    enter: function (node) {
+        this.break();
+    }
+});
+```
+
+And estraverse provides `estraverse.replace` function. When returning node from `enter`/`leave`, current node is replaced with it.
+
+```javascript
+result = estraverse.replace(tree, {
+    enter: function (node) {
+        // Replace it with replaced.
+        if (node.type === 'Literal')
+            return replaced;
+    }
+});
+```
+
+By passing `visitor.keys` mapping, we can extend estraverse traversing functionality.
+
+```javascript
+// This tree contains a user-defined `TestExpression` node.
+var tree = {
+    type: 'TestExpression',
+
+    // This 'argument' is the property containing the other **node**.
+    argument: {
+        type: 'Literal',
+        value: 20
+    },
+
+    // This 'extended' is the property not containing the other **node**.
+    extended: true
+};
+estraverse.traverse(tree, {
+    enter: function (node) { },
+
+    // Extending the existing traversing rules.
+    keys: {
+        // TargetNodeName: [ 'keys', 'containing', 'the', 'other', '**node**' ]
+        TestExpression: ['argument']
+    }
+});
+```
+
+By passing `visitor.fallback` option, we can control the behavior when encountering unknown nodes.
+
+```javascript
+// This tree contains a user-defined `TestExpression` node.
+var tree = {
+    type: 'TestExpression',
+
+    // This 'argument' is the property containing the other **node**.
+    argument: {
+        type: 'Literal',
+        value: 20
+    },
+
+    // This 'extended' is the property not containing the other **node**.
+    extended: true
+};
+estraverse.traverse(tree, {
+    enter: function (node) { },
+
+    // Iterating the child **nodes** of unknown nodes.
+    fallback: 'iteration'
+});
+```
+
+When `visitor.fallback` is a function, we can determine which keys to visit on each node.
+
+```javascript
+// This tree contains a user-defined `TestExpression` node.
+var tree = {
+    type: 'TestExpression',
+
+    // This 'argument' is the property containing the other **node**.
+    argument: {
+        type: 'Literal',
+        value: 20
+    },
+
+    // This 'extended' is the property not containing the other **node**.
+    extended: true
+};
+estraverse.traverse(tree, {
+    enter: function (node) { },
+
+    // Skip the `argument` property of each node
+    fallback: function(node) {
+        return Object.keys(node).filter(function(key) {
+            return key !== 'argument';
+        });
+    }
+});
+```
+
+### License
+
+Copyright (C) 2012-2016 [Yusuke Suzuki](http://github.com/Constellation)
+ (twitter: [@Constellation](http://twitter.com/Constellation)) and other contributors.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/esrecurse/node_modules/estraverse/estraverse.js b/node_modules/esrecurse/node_modules/estraverse/estraverse.js
new file mode 100644
index 0000000..93225bb
--- /dev/null
+++ b/node_modules/esrecurse/node_modules/estraverse/estraverse.js
@@ -0,0 +1,801 @@
+/*
+  Copyright (C) 2012-2013 Yusuke Suzuki <utatane.tea@gmail.com>
+  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*jslint vars:false, bitwise:true*/
+/*jshint indent:4*/
+/*global exports:true*/
+(function clone(exports) {
+    'use strict';
+
+    var Syntax,
+        VisitorOption,
+        VisitorKeys,
+        BREAK,
+        SKIP,
+        REMOVE;
+
+    function deepCopy(obj) {
+        var ret = {}, key, val;
+        for (key in obj) {
+            if (obj.hasOwnProperty(key)) {
+                val = obj[key];
+                if (typeof val === 'object' && val !== null) {
+                    ret[key] = deepCopy(val);
+                } else {
+                    ret[key] = val;
+                }
+            }
+        }
+        return ret;
+    }
+
+    // based on LLVM libc++ upper_bound / lower_bound
+    // MIT License
+
+    function upperBound(array, func) {
+        var diff, len, i, current;
+
+        len = array.length;
+        i = 0;
+
+        while (len) {
+            diff = len >>> 1;
+            current = i + diff;
+            if (func(array[current])) {
+                len = diff;
+            } else {
+                i = current + 1;
+                len -= diff + 1;
+            }
+        }
+        return i;
+    }
+
+    Syntax = {
+        AssignmentExpression: 'AssignmentExpression',
+        AssignmentPattern: 'AssignmentPattern',
+        ArrayExpression: 'ArrayExpression',
+        ArrayPattern: 'ArrayPattern',
+        ArrowFunctionExpression: 'ArrowFunctionExpression',
+        AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7.
+        BlockStatement: 'BlockStatement',
+        BinaryExpression: 'BinaryExpression',
+        BreakStatement: 'BreakStatement',
+        CallExpression: 'CallExpression',
+        CatchClause: 'CatchClause',
+        ChainExpression: 'ChainExpression',
+        ClassBody: 'ClassBody',
+        ClassDeclaration: 'ClassDeclaration',
+        ClassExpression: 'ClassExpression',
+        ComprehensionBlock: 'ComprehensionBlock',  // CAUTION: It's deferred to ES7.
+        ComprehensionExpression: 'ComprehensionExpression',  // CAUTION: It's deferred to ES7.
+        ConditionalExpression: 'ConditionalExpression',
+        ContinueStatement: 'ContinueStatement',
+        DebuggerStatement: 'DebuggerStatement',
+        DirectiveStatement: 'DirectiveStatement',
+        DoWhileStatement: 'DoWhileStatement',
+        EmptyStatement: 'EmptyStatement',
+        ExportAllDeclaration: 'ExportAllDeclaration',
+        ExportDefaultDeclaration: 'ExportDefaultDeclaration',
+        ExportNamedDeclaration: 'ExportNamedDeclaration',
+        ExportSpecifier: 'ExportSpecifier',
+        ExpressionStatement: 'ExpressionStatement',
+        ForStatement: 'ForStatement',
+        ForInStatement: 'ForInStatement',
+        ForOfStatement: 'ForOfStatement',
+        FunctionDeclaration: 'FunctionDeclaration',
+        FunctionExpression: 'FunctionExpression',
+        GeneratorExpression: 'GeneratorExpression',  // CAUTION: It's deferred to ES7.
+        Identifier: 'Identifier',
+        IfStatement: 'IfStatement',
+        ImportExpression: 'ImportExpression',
+        ImportDeclaration: 'ImportDeclaration',
+        ImportDefaultSpecifier: 'ImportDefaultSpecifier',
+        ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
+        ImportSpecifier: 'ImportSpecifier',
+        Literal: 'Literal',
+        LabeledStatement: 'LabeledStatement',
+        LogicalExpression: 'LogicalExpression',
+        MemberExpression: 'MemberExpression',
+        MetaProperty: 'MetaProperty',
+        MethodDefinition: 'MethodDefinition',
+        ModuleSpecifier: 'ModuleSpecifier',
+        NewExpression: 'NewExpression',
+        ObjectExpression: 'ObjectExpression',
+        ObjectPattern: 'ObjectPattern',
+        Program: 'Program',
+        Property: 'Property',
+        RestElement: 'RestElement',
+        ReturnStatement: 'ReturnStatement',
+        SequenceExpression: 'SequenceExpression',
+        SpreadElement: 'SpreadElement',
+        Super: 'Super',
+        SwitchStatement: 'SwitchStatement',
+        SwitchCase: 'SwitchCase',
+        TaggedTemplateExpression: 'TaggedTemplateExpression',
+        TemplateElement: 'TemplateElement',
+        TemplateLiteral: 'TemplateLiteral',
+        ThisExpression: 'ThisExpression',
+        ThrowStatement: 'ThrowStatement',
+        TryStatement: 'TryStatement',
+        UnaryExpression: 'UnaryExpression',
+        UpdateExpression: 'UpdateExpression',
+        VariableDeclaration: 'VariableDeclaration',
+        VariableDeclarator: 'VariableDeclarator',
+        WhileStatement: 'WhileStatement',
+        WithStatement: 'WithStatement',
+        YieldExpression: 'YieldExpression'
+    };
+
+    VisitorKeys = {
+        AssignmentExpression: ['left', 'right'],
+        AssignmentPattern: ['left', 'right'],
+        ArrayExpression: ['elements'],
+        ArrayPattern: ['elements'],
+        ArrowFunctionExpression: ['params', 'body'],
+        AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7.
+        BlockStatement: ['body'],
+        BinaryExpression: ['left', 'right'],
+        BreakStatement: ['label'],
+        CallExpression: ['callee', 'arguments'],
+        CatchClause: ['param', 'body'],
+        ChainExpression: ['expression'],
+        ClassBody: ['body'],
+        ClassDeclaration: ['id', 'superClass', 'body'],
+        ClassExpression: ['id', 'superClass', 'body'],
+        ComprehensionBlock: ['left', 'right'],  // CAUTION: It's deferred to ES7.
+        ComprehensionExpression: ['blocks', 'filter', 'body'],  // CAUTION: It's deferred to ES7.
+        ConditionalExpression: ['test', 'consequent', 'alternate'],
+        ContinueStatement: ['label'],
+        DebuggerStatement: [],
+        DirectiveStatement: [],
+        DoWhileStatement: ['body', 'test'],
+        EmptyStatement: [],
+        ExportAllDeclaration: ['source'],
+        ExportDefaultDeclaration: ['declaration'],
+        ExportNamedDeclaration: ['declaration', 'specifiers', 'source'],
+        ExportSpecifier: ['exported', 'local'],
+        ExpressionStatement: ['expression'],
+        ForStatement: ['init', 'test', 'update', 'body'],
+        ForInStatement: ['left', 'right', 'body'],
+        ForOfStatement: ['left', 'right', 'body'],
+        FunctionDeclaration: ['id', 'params', 'body'],
+        FunctionExpression: ['id', 'params', 'body'],
+        GeneratorExpression: ['blocks', 'filter', 'body'],  // CAUTION: It's deferred to ES7.
+        Identifier: [],
+        IfStatement: ['test', 'consequent', 'alternate'],
+        ImportExpression: ['source'],
+        ImportDeclaration: ['specifiers', 'source'],
+        ImportDefaultSpecifier: ['local'],
+        ImportNamespaceSpecifier: ['local'],
+        ImportSpecifier: ['imported', 'local'],
+        Literal: [],
+        LabeledStatement: ['label', 'body'],
+        LogicalExpression: ['left', 'right'],
+        MemberExpression: ['object', 'property'],
+        MetaProperty: ['meta', 'property'],
+        MethodDefinition: ['key', 'value'],
+        ModuleSpecifier: [],
+        NewExpression: ['callee', 'arguments'],
+        ObjectExpression: ['properties'],
+        ObjectPattern: ['properties'],
+        Program: ['body'],
+        Property: ['key', 'value'],
+        RestElement: [ 'argument' ],
+        ReturnStatement: ['argument'],
+        SequenceExpression: ['expressions'],
+        SpreadElement: ['argument'],
+        Super: [],
+        SwitchStatement: ['discriminant', 'cases'],
+        SwitchCase: ['test', 'consequent'],
+        TaggedTemplateExpression: ['tag', 'quasi'],
+        TemplateElement: [],
+        TemplateLiteral: ['quasis', 'expressions'],
+        ThisExpression: [],
+        ThrowStatement: ['argument'],
+        TryStatement: ['block', 'handler', 'finalizer'],
+        UnaryExpression: ['argument'],
+        UpdateExpression: ['argument'],
+        VariableDeclaration: ['declarations'],
+        VariableDeclarator: ['id', 'init'],
+        WhileStatement: ['test', 'body'],
+        WithStatement: ['object', 'body'],
+        YieldExpression: ['argument']
+    };
+
+    // unique id
+    BREAK = {};
+    SKIP = {};
+    REMOVE = {};
+
+    VisitorOption = {
+        Break: BREAK,
+        Skip: SKIP,
+        Remove: REMOVE
+    };
+
+    function Reference(parent, key) {
+        this.parent = parent;
+        this.key = key;
+    }
+
+    Reference.prototype.replace = function replace(node) {
+        this.parent[this.key] = node;
+    };
+
+    Reference.prototype.remove = function remove() {
+        if (Array.isArray(this.parent)) {
+            this.parent.splice(this.key, 1);
+            return true;
+        } else {
+            this.replace(null);
+            return false;
+        }
+    };
+
+    function Element(node, path, wrap, ref) {
+        this.node = node;
+        this.path = path;
+        this.wrap = wrap;
+        this.ref = ref;
+    }
+
+    function Controller() { }
+
+    // API:
+    // return property path array from root to current node
+    Controller.prototype.path = function path() {
+        var i, iz, j, jz, result, element;
+
+        function addToPath(result, path) {
+            if (Array.isArray(path)) {
+                for (j = 0, jz = path.length; j < jz; ++j) {
+                    result.push(path[j]);
+                }
+            } else {
+                result.push(path);
+            }
+        }
+
+        // root node
+        if (!this.__current.path) {
+            return null;
+        }
+
+        // first node is sentinel, second node is root element
+        result = [];
+        for (i = 2, iz = this.__leavelist.length; i < iz; ++i) {
+            element = this.__leavelist[i];
+            addToPath(result, element.path);
+        }
+        addToPath(result, this.__current.path);
+        return result;
+    };
+
+    // API:
+    // return type of current node
+    Controller.prototype.type = function () {
+        var node = this.current();
+        return node.type || this.__current.wrap;
+    };
+
+    // API:
+    // return array of parent elements
+    Controller.prototype.parents = function parents() {
+        var i, iz, result;
+
+        // first node is sentinel
+        result = [];
+        for (i = 1, iz = this.__leavelist.length; i < iz; ++i) {
+            result.push(this.__leavelist[i].node);
+        }
+
+        return result;
+    };
+
+    // API:
+    // return current node
+    Controller.prototype.current = function current() {
+        return this.__current.node;
+    };
+
+    Controller.prototype.__execute = function __execute(callback, element) {
+        var previous, result;
+
+        result = undefined;
+
+        previous  = this.__current;
+        this.__current = element;
+        this.__state = null;
+        if (callback) {
+            result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node);
+        }
+        this.__current = previous;
+
+        return result;
+    };
+
+    // API:
+    // notify control skip / break
+    Controller.prototype.notify = function notify(flag) {
+        this.__state = flag;
+    };
+
+    // API:
+    // skip child nodes of current node
+    Controller.prototype.skip = function () {
+        this.notify(SKIP);
+    };
+
+    // API:
+    // break traversals
+    Controller.prototype['break'] = function () {
+        this.notify(BREAK);
+    };
+
+    // API:
+    // remove node
+    Controller.prototype.remove = function () {
+        this.notify(REMOVE);
+    };
+
+    Controller.prototype.__initialize = function(root, visitor) {
+        this.visitor = visitor;
+        this.root = root;
+        this.__worklist = [];
+        this.__leavelist = [];
+        this.__current = null;
+        this.__state = null;
+        this.__fallback = null;
+        if (visitor.fallback === 'iteration') {
+            this.__fallback = Object.keys;
+        } else if (typeof visitor.fallback === 'function') {
+            this.__fallback = visitor.fallback;
+        }
+
+        this.__keys = VisitorKeys;
+        if (visitor.keys) {
+            this.__keys = Object.assign(Object.create(this.__keys), visitor.keys);
+        }
+    };
+
+    function isNode(node) {
+        if (node == null) {
+            return false;
+        }
+        return typeof node === 'object' && typeof node.type === 'string';
+    }
+
+    function isProperty(nodeType, key) {
+        return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key;
+    }
+  
+    function candidateExistsInLeaveList(leavelist, candidate) {
+        for (var i = leavelist.length - 1; i >= 0; --i) {
+            if (leavelist[i].node === candidate) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    Controller.prototype.traverse = function traverse(root, visitor) {
+        var worklist,
+            leavelist,
+            element,
+            node,
+            nodeType,
+            ret,
+            key,
+            current,
+            current2,
+            candidates,
+            candidate,
+            sentinel;
+
+        this.__initialize(root, visitor);
+
+        sentinel = {};
+
+        // reference
+        worklist = this.__worklist;
+        leavelist = this.__leavelist;
+
+        // initialize
+        worklist.push(new Element(root, null, null, null));
+        leavelist.push(new Element(null, null, null, null));
+
+        while (worklist.length) {
+            element = worklist.pop();
+
+            if (element === sentinel) {
+                element = leavelist.pop();
+
+                ret = this.__execute(visitor.leave, element);
+
+                if (this.__state === BREAK || ret === BREAK) {
+                    return;
+                }
+                continue;
+            }
+
+            if (element.node) {
+
+                ret = this.__execute(visitor.enter, element);
+
+                if (this.__state === BREAK || ret === BREAK) {
+                    return;
+                }
+
+                worklist.push(sentinel);
+                leavelist.push(element);
+
+                if (this.__state === SKIP || ret === SKIP) {
+                    continue;
+                }
+
+                node = element.node;
+                nodeType = node.type || element.wrap;
+                candidates = this.__keys[nodeType];
+                if (!candidates) {
+                    if (this.__fallback) {
+                        candidates = this.__fallback(node);
+                    } else {
+                        throw new Error('Unknown node type ' + nodeType + '.');
+                    }
+                }
+
+                current = candidates.length;
+                while ((current -= 1) >= 0) {
+                    key = candidates[current];
+                    candidate = node[key];
+                    if (!candidate) {
+                        continue;
+                    }
+
+                    if (Array.isArray(candidate)) {
+                        current2 = candidate.length;
+                        while ((current2 -= 1) >= 0) {
+                            if (!candidate[current2]) {
+                                continue;
+                            }
+
+                            if (candidateExistsInLeaveList(leavelist, candidate[current2])) {
+                              continue;
+                            }
+
+                            if (isProperty(nodeType, candidates[current])) {
+                                element = new Element(candidate[current2], [key, current2], 'Property', null);
+                            } else if (isNode(candidate[current2])) {
+                                element = new Element(candidate[current2], [key, current2], null, null);
+                            } else {
+                                continue;
+                            }
+                            worklist.push(element);
+                        }
+                    } else if (isNode(candidate)) {
+                        if (candidateExistsInLeaveList(leavelist, candidate)) {
+                          continue;
+                        }
+
+                        worklist.push(new Element(candidate, key, null, null));
+                    }
+                }
+            }
+        }
+    };
+
+    Controller.prototype.replace = function replace(root, visitor) {
+        var worklist,
+            leavelist,
+            node,
+            nodeType,
+            target,
+            element,
+            current,
+            current2,
+            candidates,
+            candidate,
+            sentinel,
+            outer,
+            key;
+
+        function removeElem(element) {
+            var i,
+                key,
+                nextElem,
+                parent;
+
+            if (element.ref.remove()) {
+                // When the reference is an element of an array.
+                key = element.ref.key;
+                parent = element.ref.parent;
+
+                // If removed from array, then decrease following items' keys.
+                i = worklist.length;
+                while (i--) {
+                    nextElem = worklist[i];
+                    if (nextElem.ref && nextElem.ref.parent === parent) {
+                        if  (nextElem.ref.key < key) {
+                            break;
+                        }
+                        --nextElem.ref.key;
+                    }
+                }
+            }
+        }
+
+        this.__initialize(root, visitor);
+
+        sentinel = {};
+
+        // reference
+        worklist = this.__worklist;
+        leavelist = this.__leavelist;
+
+        // initialize
+        outer = {
+            root: root
+        };
+        element = new Element(root, null, null, new Reference(outer, 'root'));
+        worklist.push(element);
+        leavelist.push(element);
+
+        while (worklist.length) {
+            element = worklist.pop();
+
+            if (element === sentinel) {
+                element = leavelist.pop();
+
+                target = this.__execute(visitor.leave, element);
+
+                // node may be replaced with null,
+                // so distinguish between undefined and null in this place
+                if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
+                    // replace
+                    element.ref.replace(target);
+                }
+
+                if (this.__state === REMOVE || target === REMOVE) {
+                    removeElem(element);
+                }
+
+                if (this.__state === BREAK || target === BREAK) {
+                    return outer.root;
+                }
+                continue;
+            }
+
+            target = this.__execute(visitor.enter, element);
+
+            // node may be replaced with null,
+            // so distinguish between undefined and null in this place
+            if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
+                // replace
+                element.ref.replace(target);
+                element.node = target;
+            }
+
+            if (this.__state === REMOVE || target === REMOVE) {
+                removeElem(element);
+                element.node = null;
+            }
+
+            if (this.__state === BREAK || target === BREAK) {
+                return outer.root;
+            }
+
+            // node may be null
+            node = element.node;
+            if (!node) {
+                continue;
+            }
+
+            worklist.push(sentinel);
+            leavelist.push(element);
+
+            if (this.__state === SKIP || target === SKIP) {
+                continue;
+            }
+
+            nodeType = node.type || element.wrap;
+            candidates = this.__keys[nodeType];
+            if (!candidates) {
+                if (this.__fallback) {
+                    candidates = this.__fallback(node);
+                } else {
+                    throw new Error('Unknown node type ' + nodeType + '.');
+                }
+            }
+
+            current = candidates.length;
+            while ((current -= 1) >= 0) {
+                key = candidates[current];
+                candidate = node[key];
+                if (!candidate) {
+                    continue;
+                }
+
+                if (Array.isArray(candidate)) {
+                    current2 = candidate.length;
+                    while ((current2 -= 1) >= 0) {
+                        if (!candidate[current2]) {
+                            continue;
+                        }
+                        if (isProperty(nodeType, candidates[current])) {
+                            element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2));
+                        } else if (isNode(candidate[current2])) {
+                            element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2));
+                        } else {
+                            continue;
+                        }
+                        worklist.push(element);
+                    }
+                } else if (isNode(candidate)) {
+                    worklist.push(new Element(candidate, key, null, new Reference(node, key)));
+                }
+            }
+        }
+
+        return outer.root;
+    };
+
+    function traverse(root, visitor) {
+        var controller = new Controller();
+        return controller.traverse(root, visitor);
+    }
+
+    function replace(root, visitor) {
+        var controller = new Controller();
+        return controller.replace(root, visitor);
+    }
+
+    function extendCommentRange(comment, tokens) {
+        var target;
+
+        target = upperBound(tokens, function search(token) {
+            return token.range[0] > comment.range[0];
+        });
+
+        comment.extendedRange = [comment.range[0], comment.range[1]];
+
+        if (target !== tokens.length) {
+            comment.extendedRange[1] = tokens[target].range[0];
+        }
+
+        target -= 1;
+        if (target >= 0) {
+            comment.extendedRange[0] = tokens[target].range[1];
+        }
+
+        return comment;
+    }
+
+    function attachComments(tree, providedComments, tokens) {
+        // At first, we should calculate extended comment ranges.
+        var comments = [], comment, len, i, cursor;
+
+        if (!tree.range) {
+            throw new Error('attachComments needs range information');
+        }
+
+        // tokens array is empty, we attach comments to tree as 'leadingComments'
+        if (!tokens.length) {
+            if (providedComments.length) {
+                for (i = 0, len = providedComments.length; i < len; i += 1) {
+                    comment = deepCopy(providedComments[i]);
+                    comment.extendedRange = [0, tree.range[0]];
+                    comments.push(comment);
+                }
+                tree.leadingComments = comments;
+            }
+            return tree;
+        }
+
+        for (i = 0, len = providedComments.length; i < len; i += 1) {
+            comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens));
+        }
+
+        // This is based on John Freeman's implementation.
+        cursor = 0;
+        traverse(tree, {
+            enter: function (node) {
+                var comment;
+
+                while (cursor < comments.length) {
+                    comment = comments[cursor];
+                    if (comment.extendedRange[1] > node.range[0]) {
+                        break;
+                    }
+
+                    if (comment.extendedRange[1] === node.range[0]) {
+                        if (!node.leadingComments) {
+                            node.leadingComments = [];
+                        }
+                        node.leadingComments.push(comment);
+                        comments.splice(cursor, 1);
+                    } else {
+                        cursor += 1;
+                    }
+                }
+
+                // already out of owned node
+                if (cursor === comments.length) {
+                    return VisitorOption.Break;
+                }
+
+                if (comments[cursor].extendedRange[0] > node.range[1]) {
+                    return VisitorOption.Skip;
+                }
+            }
+        });
+
+        cursor = 0;
+        traverse(tree, {
+            leave: function (node) {
+                var comment;
+
+                while (cursor < comments.length) {
+                    comment = comments[cursor];
+                    if (node.range[1] < comment.extendedRange[0]) {
+                        break;
+                    }
+
+                    if (node.range[1] === comment.extendedRange[0]) {
+                        if (!node.trailingComments) {
+                            node.trailingComments = [];
+                        }
+                        node.trailingComments.push(comment);
+                        comments.splice(cursor, 1);
+                    } else {
+                        cursor += 1;
+                    }
+                }
+
+                // already out of owned node
+                if (cursor === comments.length) {
+                    return VisitorOption.Break;
+                }
+
+                if (comments[cursor].extendedRange[0] > node.range[1]) {
+                    return VisitorOption.Skip;
+                }
+            }
+        });
+
+        return tree;
+    }
+
+    exports.Syntax = Syntax;
+    exports.traverse = traverse;
+    exports.replace = replace;
+    exports.attachComments = attachComments;
+    exports.VisitorKeys = VisitorKeys;
+    exports.VisitorOption = VisitorOption;
+    exports.Controller = Controller;
+    exports.cloneEnvironment = function () { return clone({}); };
+
+    return exports;
+}(exports));
+/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/esrecurse/node_modules/estraverse/gulpfile.js b/node_modules/esrecurse/node_modules/estraverse/gulpfile.js
new file mode 100644
index 0000000..8772bbc
--- /dev/null
+++ b/node_modules/esrecurse/node_modules/estraverse/gulpfile.js
@@ -0,0 +1,70 @@
+/*
+  Copyright (C) 2014 Yusuke Suzuki <utatane.tea@gmail.com>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+'use strict';
+
+var gulp = require('gulp'),
+    git = require('gulp-git'),
+    bump = require('gulp-bump'),
+    filter = require('gulp-filter'),
+    tagVersion = require('gulp-tag-version');
+
+var TEST = [ 'test/*.js' ];
+var POWERED = [ 'powered-test/*.js' ];
+var SOURCE = [ 'src/**/*.js' ];
+
+/**
+ * Bumping version number and tagging the repository with it.
+ * Please read http://semver.org/
+ *
+ * You can use the commands
+ *
+ *     gulp patch     # makes v0.1.0 -> v0.1.1
+ *     gulp feature   # makes v0.1.1 -> v0.2.0
+ *     gulp release   # makes v0.2.1 -> v1.0.0
+ *
+ * To bump the version numbers accordingly after you did a patch,
+ * introduced a feature or made a backwards-incompatible release.
+ */
+
+function inc(importance) {
+    // get all the files to bump version in
+    return gulp.src(['./package.json'])
+        // bump the version number in those files
+        .pipe(bump({type: importance}))
+        // save it back to filesystem
+        .pipe(gulp.dest('./'))
+        // commit the changed version number
+        .pipe(git.commit('Bumps package version'))
+        // read only one file to get the version number
+        .pipe(filter('package.json'))
+        // **tag it in the repository**
+        .pipe(tagVersion({
+            prefix: ''
+        }));
+}
+
+gulp.task('patch', [ ], function () { return inc('patch'); })
+gulp.task('minor', [ ], function () { return inc('minor'); })
+gulp.task('major', [ ], function () { return inc('major'); })
diff --git a/node_modules/esrecurse/node_modules/estraverse/package.json b/node_modules/esrecurse/node_modules/estraverse/package.json
new file mode 100644
index 0000000..bc99e7c
--- /dev/null
+++ b/node_modules/esrecurse/node_modules/estraverse/package.json
@@ -0,0 +1,40 @@
+{
+  "name": "estraverse",
+  "description": "ECMAScript JS AST traversal functions",
+  "homepage": "https://github.com/estools/estraverse",
+  "main": "estraverse.js",
+  "version": "5.2.0",
+  "engines": {
+    "node": ">=4.0"
+  },
+  "maintainers": [
+    {
+      "name": "Yusuke Suzuki",
+      "email": "utatane.tea@gmail.com",
+      "web": "http://github.com/Constellation"
+    }
+  ],
+  "repository": {
+    "type": "git",
+    "url": "http://github.com/estools/estraverse.git"
+  },
+  "devDependencies": {
+    "babel-preset-env": "^1.6.1",
+    "babel-register": "^6.3.13",
+    "chai": "^2.1.1",
+    "espree": "^1.11.0",
+    "gulp": "^3.8.10",
+    "gulp-bump": "^0.2.2",
+    "gulp-filter": "^2.0.0",
+    "gulp-git": "^1.0.1",
+    "gulp-tag-version": "^1.3.0",
+    "jshint": "^2.5.6",
+    "mocha": "^2.1.0"
+  },
+  "license": "BSD-2-Clause",
+  "scripts": {
+    "test": "npm run-script lint && npm run-script unit-test",
+    "lint": "jshint estraverse.js",
+    "unit-test": "mocha --compilers js:babel-register"
+  }
+}
diff --git a/node_modules/esrecurse/package.json b/node_modules/esrecurse/package.json
index 13dee2e..dec5b1b 100755
--- a/node_modules/esrecurse/package.json
+++ b/node_modules/esrecurse/package.json
@@ -3,7 +3,7 @@
   "description": "ECMAScript AST recursive visitor",
   "homepage": "https://github.com/estools/esrecurse",
   "main": "esrecurse.js",
-  "version": "4.2.1",
+  "version": "4.3.0",
   "engines": {
     "node": ">=4.0"
   },
@@ -19,7 +19,7 @@
     "url": "https://github.com/estools/esrecurse.git"
   },
   "dependencies": {
-    "estraverse": "^4.1.0"
+    "estraverse": "^5.2.0"
   },
   "devDependencies": {
     "babel-cli": "^6.24.1",
diff --git a/node_modules/execa/node_modules/cross-spawn/node_modules/.bin/semver b/node_modules/execa/node_modules/cross-spawn/node_modules/.bin/semver
index b3ca603..b892cab 120000
--- a/node_modules/execa/node_modules/cross-spawn/node_modules/.bin/semver
+++ b/node_modules/execa/node_modules/cross-spawn/node_modules/.bin/semver
@@ -1 +1 @@
-../../../semver/bin/semver
\ No newline at end of file
+../../../../../normalize-package-data/node_modules/semver/bin/semver
\ No newline at end of file
diff --git a/node_modules/expect/build/asymmetricMatchers.d.ts b/node_modules/expect/build/asymmetricMatchers.d.ts
index 4d97395..e8b9f68 100644
--- a/node_modules/expect/build/asymmetricMatchers.d.ts
+++ b/node_modules/expect/build/asymmetricMatchers.d.ts
@@ -29,8 +29,8 @@
     toString(): string;
     getExpectedType(): string;
 }
-declare class ObjectContaining extends AsymmetricMatcher<Record<string, any>> {
-    constructor(sample: Record<string, any>, inverse?: boolean);
+declare class ObjectContaining extends AsymmetricMatcher<Record<string, unknown>> {
+    constructor(sample: Record<string, unknown>, inverse?: boolean);
     asymmetricMatch(other: any): boolean;
     toString(): string;
     getExpectedType(): string;
@@ -51,8 +51,8 @@
 export declare const anything: () => Anything;
 export declare const arrayContaining: (sample: Array<unknown>) => ArrayContaining;
 export declare const arrayNotContaining: (sample: Array<unknown>) => ArrayContaining;
-export declare const objectContaining: (sample: Record<string, any>) => ObjectContaining;
-export declare const objectNotContaining: (sample: Record<string, any>) => ObjectContaining;
+export declare const objectContaining: (sample: Record<string, unknown>) => ObjectContaining;
+export declare const objectNotContaining: (sample: Record<string, unknown>) => ObjectContaining;
 export declare const stringContaining: (expected: string) => StringContaining;
 export declare const stringNotContaining: (expected: string) => StringContaining;
 export declare const stringMatching: (expected: string | RegExp) => StringMatching;
diff --git a/node_modules/expect/build/extractExpectedAssertionsErrors.d.ts b/node_modules/expect/build/extractExpectedAssertionsErrors.d.ts
index 42acc95..03ccd3e 100644
--- a/node_modules/expect/build/extractExpectedAssertionsErrors.d.ts
+++ b/node_modules/expect/build/extractExpectedAssertionsErrors.d.ts
@@ -5,10 +5,6 @@
  * LICENSE file in the root directory of this source tree.
  *
  */
-declare type AssertionsErrors = Array<{
-    actual: string;
-    error: string;
-    expected: string | number;
-}>;
-declare const extractExpectedAssertionsErrors: () => AssertionsErrors;
+import type { Expect } from './types';
+declare const extractExpectedAssertionsErrors: Expect['extractExpectedAssertionsErrors'];
 export default extractExpectedAssertionsErrors;
diff --git a/node_modules/expect/build/extractExpectedAssertionsErrors.js b/node_modules/expect/build/extractExpectedAssertionsErrors.js
index a1bb1af..b3dcbdd 100644
--- a/node_modules/expect/build/extractExpectedAssertionsErrors.js
+++ b/node_modules/expect/build/extractExpectedAssertionsErrors.js
@@ -22,10 +22,9 @@
     expectedAssertionsNumber: null,
     isExpectingAssertions: false
   });
-};
-
-// Create and format all errors related to the mismatched number of `expect`
+}; // Create and format all errors related to the mismatched number of `expect`
 // calls and reset the matcher's state.
+
 const extractExpectedAssertionsErrors = () => {
   const result = [];
   const {
@@ -60,9 +59,9 @@
       ) +
       '.';
     result.push({
-      actual: assertionCalls,
+      actual: assertionCalls.toString(),
       error: expectedAssertionsNumberError,
-      expected: expectedAssertionsNumber
+      expected: expectedAssertionsNumber.toString()
     });
   }
 
diff --git a/node_modules/expect/build/fakeChalk.d.ts b/node_modules/expect/build/fakeChalk.d.ts
deleted file mode 100644
index 604059f..0000000
--- a/node_modules/expect/build/fakeChalk.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-declare const allColorsAsFunc: {
-    [x: string]: (str: string) => string;
-};
-export = allColorsAsFunc;
diff --git a/node_modules/expect/build/fakeChalk.js b/node_modules/expect/build/fakeChalk.js
deleted file mode 100644
index 4e896b3..0000000
--- a/node_modules/expect/build/fakeChalk.js
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict';
-
-var _ansiStyles = _interopRequireDefault(require('ansi-styles'));
-
-function _interopRequireDefault(obj) {
-  return obj && obj.__esModule ? obj : {default: obj};
-}
-
-/**
- * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-const returnInput = str => str;
-
-const allColorsAsFunc = Object.keys(_ansiStyles.default)
-  .map(style => ({
-    [style]: returnInput
-  }))
-  .reduce((acc, cur) => Object.assign(acc, cur));
-Object.keys(allColorsAsFunc)
-  .map(color => allColorsAsFunc[color])
-  .forEach(style => {
-    Object.assign(style, allColorsAsFunc);
-    Object.assign(returnInput, style);
-  });
-module.exports = allColorsAsFunc;
diff --git a/node_modules/expect/build/index.js b/node_modules/expect/build/index.js
index 75ff176..7db6799 100644
--- a/node_modules/expect/build/index.js
+++ b/node_modules/expect/build/index.js
@@ -431,6 +431,5 @@
 expect.setState = _jestMatchersObject.setState;
 expect.extractExpectedAssertionsErrors =
   _extractExpectedAssertionsErrors.default;
-const expectExport = expect; // eslint-disable-next-line no-redeclare
-
+const expectExport = expect;
 module.exports = expectExport;
diff --git a/node_modules/expect/build/jestMatchersObject.d.ts b/node_modules/expect/build/jestMatchersObject.d.ts
index a73cc80..9d72277 100644
--- a/node_modules/expect/build/jestMatchersObject.d.ts
+++ b/node_modules/expect/build/jestMatchersObject.d.ts
@@ -5,9 +5,9 @@
  * LICENSE file in the root directory of this source tree.
  *
  */
-import type { Expect, MatchersObject } from './types';
+import type { Expect, MatcherState, MatchersObject } from './types';
 export declare const INTERNAL_MATCHER_FLAG: unique symbol;
-export declare const getState: () => any;
-export declare const setState: (state: object) => void;
+export declare const getState: () => MatcherState;
+export declare const setState: (state: Partial<MatcherState>) => void;
 export declare const getMatchers: () => MatchersObject;
 export declare const setMatchers: (matchers: MatchersObject, isInternal: boolean, expect: Expect) => void;
diff --git a/node_modules/expect/build/jestMatchersObject.js b/node_modules/expect/build/jestMatchersObject.js
index 378106b..782151c 100644
--- a/node_modules/expect/build/jestMatchersObject.js
+++ b/node_modules/expect/build/jestMatchersObject.js
@@ -17,15 +17,16 @@
 exports.INTERNAL_MATCHER_FLAG = INTERNAL_MATCHER_FLAG;
 
 if (!global.hasOwnProperty(JEST_MATCHERS_OBJECT)) {
+  const defaultState = {
+    assertionCalls: 0,
+    expectedAssertionsNumber: null,
+    isExpectingAssertions: false,
+    suppressedErrors: [] // errors that are not thrown immediately.
+  };
   Object.defineProperty(global, JEST_MATCHERS_OBJECT, {
     value: {
       matchers: Object.create(null),
-      state: {
-        assertionCalls: 0,
-        expectedAssertionsNumber: null,
-        isExpectingAssertions: false,
-        suppressedErrors: [] // errors that are not thrown immediately.
-      }
+      state: defaultState
     }
   });
 }
diff --git a/node_modules/expect/build/matchers.js b/node_modules/expect/build/matchers.js
index 05bcdcc..bab9557 100644
--- a/node_modules/expect/build/matchers.js
+++ b/node_modules/expect/build/matchers.js
@@ -26,6 +26,8 @@
  * LICENSE file in the root directory of this source tree.
  *
  */
+
+/* eslint-disable local/ban-types-eventually */
 // Omit colon and one or more spaces, so can call getLabelPrinter.
 const EXPECTED_LABEL = 'Expected';
 const RECEIVED_LABEL = 'Received';
diff --git a/node_modules/expect/build/print.js b/node_modules/expect/build/print.js
index 1b09b68..4312de4 100644
--- a/node_modules/expect/build/print.js
+++ b/node_modules/expect/build/print.js
@@ -14,6 +14,8 @@
  * LICENSE file in the root directory of this source tree.
  *
  */
+
+/* eslint-disable local/ban-types-eventually */
 // Format substring but do not enclose in double quote marks.
 // The replacement is compatible with pretty-format package.
 const printSubstring = val => val.replace(/"|\\/g, '\\$&');
diff --git a/node_modules/expect/build/toThrowMatchers.js b/node_modules/expect/build/toThrowMatchers.js
index 27ff7f9..52457b3 100644
--- a/node_modules/expect/build/toThrowMatchers.js
+++ b/node_modules/expect/build/toThrowMatchers.js
@@ -20,6 +20,8 @@
  * LICENSE file in the root directory of this source tree.
  *
  */
+
+/* eslint-disable local/ban-types-eventually */
 const DID_NOT_THROW = 'Received function did not throw';
 
 const getThrown = e => {
@@ -43,10 +45,7 @@
   };
 };
 
-const createMatcher = (
-  matcherName,
-  fromPromise // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
-) =>
+const createMatcher = (matcherName, fromPromise) =>
   function (received, expected) {
     const options = {
       isNot: this.isNot,
diff --git a/node_modules/expect/build/types.d.ts b/node_modules/expect/build/types.d.ts
index 164c16a..dd30632 100644
--- a/node_modules/expect/build/types.d.ts
+++ b/node_modules/expect/build/types.d.ts
@@ -28,8 +28,10 @@
     error?: Error;
     equals: (a: unknown, b: unknown, customTesters?: Array<Tester>, strictCheck?: boolean) => boolean;
     expand?: boolean;
-    expectedAssertionsNumber?: number;
+    expectedAssertionsNumber?: number | null;
+    expectedAssertionsNumberError?: Error;
     isExpectingAssertions?: boolean;
+    isExpectingAssertionsError?: Error;
     isNot: boolean;
     promise: string;
     suppressedErrors: Array<Error>;
@@ -43,19 +45,20 @@
 export declare type MatchersObject = {
     [id: string]: RawMatcherFn;
 };
+export declare type ExpectedAssertionsErrors = Array<{
+    actual: string | number;
+    error: Error;
+    expected: string;
+}>;
 export declare type Expect = {
     <T = unknown>(actual: T): Matchers<T>;
     addSnapshotSerializer(arg0: any): void;
     assertions(arg0: number): void;
     extend(arg0: any): void;
-    extractExpectedAssertionsErrors: () => Array<{
-        actual: string | number;
-        error: Error;
-        expected: string;
-    }>;
+    extractExpectedAssertionsErrors: () => ExpectedAssertionsErrors;
     getState(): MatcherState;
     hasAssertions(): void;
-    setState(arg0: any): void;
+    setState(state: Partial<MatcherState>): void;
     any(expectedObject: any): AsymmetricMatcher;
     anything(): AsymmetricMatcher;
     arrayContaining(sample: Array<unknown>): AsymmetricMatcher;
diff --git a/node_modules/expect/build/utils.d.ts b/node_modules/expect/build/utils.d.ts
index 1d87ba5..fcb5252 100644
--- a/node_modules/expect/build/utils.d.ts
+++ b/node_modules/expect/build/utils.d.ts
@@ -14,11 +14,11 @@
 export declare const getPath: (object: Record<string, any>, propertyPath: string | Array<string>) => GetPath;
 export declare const getObjectSubset: (object: any, subset: any, seenReferences?: WeakMap<object, boolean>) => any;
 export declare const iterableEquality: (a: any, b: any, aStack?: Array<any>, bStack?: Array<any>) => boolean | undefined;
-export declare const subsetEquality: (object: any, subset: any) => boolean | undefined;
+export declare const subsetEquality: (object: unknown, subset: unknown) => boolean | undefined;
 export declare const typeEquality: (a: any, b: any) => boolean | undefined;
 export declare const sparseArrayEquality: (a: unknown, b: unknown) => boolean | undefined;
 export declare const partition: <T>(items: T[], predicate: (arg: T) => boolean) => [T[], T[]];
 export declare const isError: (value: unknown) => value is Error;
-export declare function emptyObject(obj: any): boolean;
+export declare function emptyObject(obj: unknown): boolean;
 export declare const isOneline: (expected: unknown, received: unknown) => boolean;
 export {};
diff --git a/node_modules/expect/build/utils.js b/node_modules/expect/build/utils.js
index 9622fac..134476c 100644
--- a/node_modules/expect/build/utils.js
+++ b/node_modules/expect/build/utils.js
@@ -81,11 +81,13 @@
   };
 }; // Strip properties from object that are not present in the subset. Useful for
 // printing the diff for toMatchObject() without adding unrelated noise.
-// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
+
+/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
 
 exports.getPath = getPath;
 
 const getObjectSubset = (object, subset, seenReferences = new WeakMap()) => {
+  /* eslint-enable @typescript-eslint/explicit-module-boundary-types */
   if (Array.isArray(object)) {
     if (Array.isArray(subset) && subset.length === object.length) {
       // The map method returns correct subclass of subset.
@@ -125,9 +127,16 @@
 exports.getObjectSubset = getObjectSubset;
 const IteratorSymbol = Symbol.iterator;
 
-const hasIterator = object => !!(object != null && object[IteratorSymbol]); // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
+const hasIterator = object => !!(object != null && object[IteratorSymbol]);
+/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
 
-const iterableEquality = (a, b, aStack = [], bStack = []) => {
+const iterableEquality = (
+  a,
+  b,
+  /* eslint-enable @typescript-eslint/explicit-module-boundary-types */
+  aStack = [],
+  bStack = []
+) => {
   if (
     typeof a !== 'object' ||
     typeof b !== 'object' ||
@@ -271,7 +280,7 @@
   isObject(a) &&
   !(a instanceof Error) &&
   !(a instanceof Array) &&
-  !(a instanceof Date); // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
+  !(a instanceof Date);
 
 const subsetEquality = (object, subset) => {
   // subsetEquality needs to keep track of the references
@@ -365,7 +374,7 @@
     default:
       return value instanceof Error;
   }
-}; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
+};
 
 exports.isError = isError;
 
diff --git a/node_modules/expect/node_modules/@jest/types/build/Circus.d.ts b/node_modules/expect/node_modules/@jest/types/build/Circus.d.ts
index e6ad88d..417a5fe 100644
--- a/node_modules/expect/node_modules/@jest/types/build/Circus.d.ts
+++ b/node_modules/expect/node_modules/@jest/types/build/Circus.d.ts
@@ -18,7 +18,7 @@
 export declare type AsyncFn = TestFn | HookFn;
 export declare type SharedHookType = 'afterAll' | 'beforeAll';
 export declare type HookType = SharedHookType | 'afterEach' | 'beforeEach';
-export declare type TestContext = Record<string, any>;
+export declare type TestContext = Record<string, unknown>;
 export declare type Exception = any;
 export declare type FormattedError = string;
 export declare type Hook = {
@@ -33,6 +33,9 @@
     (event: SyncEvent, state: State): void;
 }
 export declare type Event = SyncEvent | AsyncEvent;
+interface JestGlobals extends Global.TestFrameworkGlobals {
+    expect: unknown;
+}
 export declare type SyncEvent = {
     asyncError: Error;
     mode: BlockMode;
@@ -62,6 +65,7 @@
 export declare type AsyncEvent = {
     name: 'setup';
     testNamePattern?: string;
+    runtimeGlobals: JestGlobals;
     parentProcess: Process;
 } | {
     name: 'include_test_location_in_result';
@@ -143,7 +147,7 @@
 export declare type TestResults = Array<TestResult>;
 export declare type GlobalErrorHandlers = {
     uncaughtException: Array<(exception: Exception) => void>;
-    unhandledRejection: Array<(exception: Exception, promise: Promise<any>) => void>;
+    unhandledRejection: Array<(exception: Exception, promise: Promise<unknown>) => void>;
 };
 export declare type State = {
     currentDescribeBlock: DescribeBlock;
diff --git a/node_modules/expect/node_modules/@jest/types/build/Config.d.ts b/node_modules/expect/node_modules/@jest/types/build/Config.d.ts
index f280c29..5f94989 100644
--- a/node_modules/expect/node_modules/@jest/types/build/Config.d.ts
+++ b/node_modules/expect/node_modules/@jest/types/build/Config.d.ts
@@ -42,6 +42,7 @@
     forceCoverageMatch: Array<Glob>;
     globals: ConfigGlobals;
     haste: HasteConfig;
+    injectGlobals: boolean;
     maxConcurrency: number;
     maxWorkers: number | string;
     moduleDirectories: Array<string>;
@@ -64,7 +65,7 @@
     slowTestThreshold: number;
     snapshotSerializers: Array<Path>;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testFailureExitCode: string | number;
     testLocationInResults: boolean;
     testMatch: Array<Glob>;
@@ -122,6 +123,7 @@
     globalSetup: string | null | undefined;
     globalTeardown: string | null | undefined;
     haste: HasteConfig;
+    injectGlobals: boolean;
     reporters: Array<string | ReporterConfig>;
     logHeapUsage: boolean;
     lastCommit: boolean;
@@ -169,7 +171,7 @@
     snapshotSerializers: Array<Path>;
     errorOnDeprecated: boolean;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testFailureExitCode: string | number;
     testLocationInResults: boolean;
     testMatch: Array<Glob>;
@@ -195,7 +197,7 @@
     watch: boolean;
     watchAll: boolean;
     watchman: boolean;
-    watchPlugins: Array<string | [string, Record<string, any>]>;
+    watchPlugins: Array<string | [string, Record<string, unknown>]>;
 }>;
 export declare type SnapshotUpdateState = 'all' | 'new' | 'none';
 declare type NotifyMode = 'always' | 'failure' | 'success' | 'change' | 'success-change' | 'failure-change';
@@ -273,7 +275,7 @@
     watchman: boolean;
     watchPlugins?: Array<{
         path: string;
-        config: Record<string, any>;
+        config: Record<string, unknown>;
     }> | null;
 };
 export declare type ProjectConfig = {
@@ -295,6 +297,7 @@
     globalTeardown?: string;
     globals: ConfigGlobals;
     haste: HasteConfig;
+    injectGlobals: boolean;
     moduleDirectories: Array<string>;
     moduleFileExtensions: Array<string>;
     moduleLoader?: Path;
@@ -318,7 +321,7 @@
     snapshotResolver?: Path;
     snapshotSerializers: Array<Path>;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testMatch: Array<Glob>;
     testLocationInResults: boolean;
     testPathIgnorePatterns: Array<string>;
@@ -363,6 +366,7 @@
     globalTeardown: string | null | undefined;
     haste: string;
     init: boolean;
+    injectGlobals: boolean;
     json: boolean;
     lastCommit: boolean;
     logHeapUsage: boolean;
diff --git a/node_modules/expect/node_modules/@jest/types/build/Global.d.ts b/node_modules/expect/node_modules/@jest/types/build/Global.d.ts
index c1d541b..8670a49 100644
--- a/node_modules/expect/node_modules/@jest/types/build/Global.d.ts
+++ b/node_modules/expect/node_modules/@jest/types/build/Global.d.ts
@@ -24,9 +24,12 @@
 export declare type EachTestFn<EachCallback extends TestCallback> = (...args: Array<any>) => ReturnType<EachCallback>;
 declare type Jasmine = {
     _DEFAULT_TIMEOUT_INTERVAL?: number;
-    addMatchers: Function;
+    addMatchers: (matchers: Record<string, unknown>) => void;
 };
-declare type Each<EachCallback extends TestCallback> = ((table: EachTable, ...taggedTemplateData: Array<unknown>) => (title: string, test: EachTestFn<EachCallback>, timeout?: number) => void) | (() => void);
+declare type Each<EachCallback extends TestCallback> = ((table: EachTable, ...taggedTemplateData: Array<unknown>) => (title: string, test: EachTestFn<EachCallback>, timeout?: number) => void) | (() => () => void);
+export interface HookBase {
+    (fn: HookFn, timeout?: number): void;
+}
 export interface ItBase {
     (testName: TestName, fn: TestFn, timeout?: number): void;
     each: Each<TestFn>;
@@ -34,7 +37,7 @@
 export interface It extends ItBase {
     only: ItBase;
     skip: ItBase;
-    todo: (testName: TestName, ...rest: Array<any>) => void;
+    todo: (testName: TestName) => void;
 }
 export interface ItConcurrentBase {
     (testName: string, testFn: ConcurrentTestFn, timeout?: number): void;
@@ -66,10 +69,10 @@
     describe: Describe;
     xdescribe: DescribeBase;
     fdescribe: DescribeBase;
-    beforeAll: HookFn;
-    beforeEach: HookFn;
-    afterEach: HookFn;
-    afterAll: HookFn;
+    beforeAll: HookBase;
+    beforeEach: HookBase;
+    afterEach: HookBase;
+    afterAll: HookBase;
 }
 export interface GlobalAdditions extends TestFrameworkGlobals {
     __coverage__: CoverageMapData;
@@ -80,6 +83,6 @@
     spyOnProperty: () => void;
 }
 export interface Global extends GlobalAdditions, Omit<NodeJS.Global, keyof GlobalAdditions> {
-    [extras: string]: any;
+    [extras: string]: unknown;
 }
 export {};
diff --git a/node_modules/expect/node_modules/@jest/types/package.json b/node_modules/expect/node_modules/@jest/types/package.json
index 772dfac..c8aa07c 100644
--- a/node_modules/expect/node_modules/@jest/types/package.json
+++ b/node_modules/expect/node_modules/@jest/types/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/types",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -22,5 +22,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/expect/node_modules/@types/stack-utils/LICENSE b/node_modules/expect/node_modules/@types/stack-utils/LICENSE
new file mode 100644
index 0000000..9e841e7
--- /dev/null
+++ b/node_modules/expect/node_modules/@types/stack-utils/LICENSE
@@ -0,0 +1,21 @@
+    MIT License
+
+    Copyright (c) Microsoft Corporation.
+
+    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/node_modules/expect/node_modules/@types/stack-utils/README.md b/node_modules/expect/node_modules/@types/stack-utils/README.md
new file mode 100644
index 0000000..92a34de
--- /dev/null
+++ b/node_modules/expect/node_modules/@types/stack-utils/README.md
@@ -0,0 +1,16 @@
+# Installation
+> `npm install --save @types/stack-utils`
+
+# Summary
+This package contains type definitions for stack-utils (https://github.com/tapjs/stack-utils#readme).
+
+# Details
+Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/stack-utils.
+
+### Additional Details
+ * Last updated: Tue, 22 Sep 2020 00:22:28 GMT
+ * Dependencies: none
+ * Global values: none
+
+# Credits
+These definitions were written by [BendingBender](https://github.com/BendingBender).
diff --git a/node_modules/expect/node_modules/@types/stack-utils/index.d.ts b/node_modules/expect/node_modules/@types/stack-utils/index.d.ts
new file mode 100644
index 0000000..3427e35
--- /dev/null
+++ b/node_modules/expect/node_modules/@types/stack-utils/index.d.ts
@@ -0,0 +1,65 @@
+// Type definitions for stack-utils 2.0
+// Project: https://github.com/tapjs/stack-utils#readme
+// Definitions by: BendingBender <https://github.com/BendingBender>
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+// TypeScript Version: 2.2
+
+export = StackUtils;
+
+declare class StackUtils {
+    static nodeInternals(): RegExp[];
+    constructor(options?: StackUtils.Options);
+    clean(stack: string | string[]): string;
+    capture(limit?: number, startStackFunction?: Function): StackUtils.CallSite[];
+    capture(startStackFunction: Function): StackUtils.CallSite[];
+    captureString(limit?: number, startStackFunction?: Function): string;
+    captureString(startStackFunction: Function): string;
+    at(startStackFunction?: Function): StackUtils.CallSiteLike;
+    parseLine(line: string): StackUtils.StackLineData | null;
+}
+
+declare namespace StackUtils {
+    interface Options {
+        internals?: RegExp[];
+        ignoredPackages?: string[];
+        cwd?: string;
+        wrapCallSite?(callSite: CallSite): CallSite;
+    }
+
+    interface CallSite {
+        getThis(): object | undefined;
+        getTypeName(): string;
+        getFunction(): Function | undefined;
+        getFunctionName(): string;
+        getMethodName(): string | null;
+        getFileName(): string | undefined;
+        getLineNumber(): number;
+        getColumnNumber(): number;
+        getEvalOrigin(): CallSite | string;
+        isToplevel(): boolean;
+        isEval(): boolean;
+        isNative(): boolean;
+        isConstructor(): boolean;
+    }
+
+    interface CallSiteLike extends StackData {
+        type?: string;
+    }
+
+    interface StackLineData extends StackData {
+        evalLine?: number;
+        evalColumn?: number;
+        evalFile?: string;
+    }
+
+    interface StackData {
+        line?: number;
+        column?: number;
+        file?: string;
+        constructor?: boolean;
+        evalOrigin?: string;
+        native?: boolean;
+        function?: string;
+        method?: string;
+    }
+}
diff --git a/node_modules/expect/node_modules/@types/stack-utils/package.json b/node_modules/expect/node_modules/@types/stack-utils/package.json
new file mode 100644
index 0000000..1f9393a
--- /dev/null
+++ b/node_modules/expect/node_modules/@types/stack-utils/package.json
@@ -0,0 +1,24 @@
+{
+    "name": "@types/stack-utils",
+    "version": "2.0.0",
+    "description": "TypeScript definitions for stack-utils",
+    "license": "MIT",
+    "contributors": [
+        {
+            "name": "BendingBender",
+            "url": "https://github.com/BendingBender",
+            "githubUsername": "BendingBender"
+        }
+    ],
+    "main": "",
+    "types": "index.d.ts",
+    "repository": {
+        "type": "git",
+        "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
+        "directory": "types/stack-utils"
+    },
+    "scripts": {},
+    "dependencies": {},
+    "typesPublisherContentHash": "53c84779043276d5e313653eabfc4fedae5b103c7dc645555065fdc3b4b0a982",
+    "typeScriptVersion": "3.2"
+}
\ No newline at end of file
diff --git a/node_modules/expect/node_modules/jest-message-util/package.json b/node_modules/expect/node_modules/jest-message-util/package.json
index 6f8b6c4..2bbf224 100644
--- a/node_modules/expect/node_modules/jest-message-util/package.json
+++ b/node_modules/expect/node_modules/jest-message-util/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-message-util",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -14,8 +14,8 @@
   "types": "build/index.d.ts",
   "dependencies": {
     "@babel/code-frame": "^7.0.0",
-    "@jest/types": "^26.3.0",
-    "@types/stack-utils": "^1.0.1",
+    "@jest/types": "^26.5.2",
+    "@types/stack-utils": "^2.0.0",
     "chalk": "^4.0.0",
     "graceful-fs": "^4.2.4",
     "micromatch": "^4.0.2",
@@ -30,5 +30,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/expect/package.json b/node_modules/expect/package.json
index 73d98d3..710badb 100644
--- a/node_modules/expect/package.json
+++ b/node_modules/expect/package.json
@@ -1,6 +1,6 @@
 {
   "name": "expect",
-  "version": "26.4.2",
+  "version": "26.5.3",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,15 +10,15 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "ansi-styles": "^4.0.0",
     "jest-get-type": "^26.3.0",
-    "jest-matcher-utils": "^26.4.2",
-    "jest-message-util": "^26.3.0",
+    "jest-matcher-utils": "^26.5.2",
+    "jest-message-util": "^26.5.2",
     "jest-regex-util": "^26.0.0"
   },
   "devDependencies": {
-    "@jest/test-utils": "^26.3.0",
+    "@jest/test-utils": "^26.5.0",
     "chalk": "^4.0.0",
     "fast-check": "^2.0.0",
     "immutable": "^4.0.0-rc.12"
@@ -29,5 +29,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "71152afbbda76fd09ddb2527b54c365d753f42aa"
 }
diff --git a/node_modules/external-editor/LICENSE b/node_modules/external-editor/LICENSE
deleted file mode 100644
index f5f6185..0000000
--- a/node_modules/external-editor/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 Kevin Gravier
-
-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/node_modules/external-editor/README.md b/node_modules/external-editor/README.md
deleted file mode 100644
index 53a8e70..0000000
--- a/node_modules/external-editor/README.md
+++ /dev/null
@@ -1,171 +0,0 @@
-# External Editor
-
-[![ExternalEditor on Travis CI](https://img.shields.io/travis/mrkmg/node-external-editor.svg?style=flat-square)](https://travis-ci.org/mrkmg/node-external-editor/branches)
-[![ExternalEditor on NPM](https://img.shields.io/npm/v/external-editor.svg?style=flat-square)](https://www.npmjs.com/package/external-editor)
-[![ExternalEditor uses the MIT](https://img.shields.io/npm/l/external-editor.svg?style=flat-square)](https://opensource.org/licenses/MIT)
-
-
-A node module to edit a string with a users preferred text editor using $VISUAL or $ENVIRONMENT.
-
-Version: 3.1.0
-
-As of version 3.0.0, the minimum version of node supported is 4.
-
-## Install
-
-`npm install external-editor --save`
-
-## Usage
-
-A simple example using the `.edit` convenience method
-
-    import {edit} from "external-editor";
-    const data = edit('\n\n# Please write your text above');
-    console.log(data);
-
-A full featured example
-
-    import {ExternalEditor, CreateFileError, ReadFileError, RemoveFileError} from "external-editor"
-    
-    try {
-        const editor = new ExternalEditor();
-        const text = editor.run() // the text is also available in editor.text
-        
-        if (editor.last_exit_status !== 0) {
-            console.log("The editor exited with a non-zero code");
-        }
-    } catch (err) {
-        if (err instanceOf CreateFileError) {
-            console.log('Failed to create the temporary file');
-        } else if (err instanceOf ReadFileError) {
-            console.log('Failed to read the temporary file');
-        } else if (err instanceOf LaunchEditorError) {
-            console.log('Failed to launch your editor');
-        } else {
-            throw err;
-        }
-    }
-    
-    // Do things with the text
-    
-    // Eventually call the cleanup to remove the temporary file
-    try {
-        editor.cleanup();   
-    } catch (err) {
-         if (err instanceOf RemoveFileError) {
-             console.log('Failed to remove the temporary file');
-         } else {
-            throw err
-        }
-    }
-    
-    
-#### API
-**Convenience Methods**
-
-- `edit(text, config)`
-    - `text` (string) *Optional* Defaults to empty string
-    - `config` (Config) *Optional* Options for temporary file creation
-    - **Returns** (string) The contents of the file
-    - Could throw `CreateFileError`, `ReadFileError`, or `LaunchEditorError`, or `RemoveFileError`
-- `editAsync(text, callback, config)`
-    - `text` (string) *Optional* Defaults to empty string
-    - `callback` (function (error, text))
-        - `error` could be of type `CreateFileError`, `ReadFileError`, or `LaunchEditorError`, or `RemoveFileError`
-        - `text`(string) The contents of the file
-    - `config` (Config) *Optional* Options for temporary file creation
-
-
-**Errors**
-
-- `CreateFileError` Error thrown if the temporary file could not be created. 
-- `ReadFileError` Error thrown if the temporary file could not be read.
-- `RemoveFileError` Error thrown if the temporary file could not be removed during cleanup.
-- `LaunchEditorError` Error thrown if the editor could not be launched.
-
-**External Editor Public Methods**
-
-- `new ExternalEditor(text, config)`
-    - `text` (string) *Optional* Defaults to empty string
-    - `config` (Config) *Optional* Options for temporary file creation
-    - Could throw `CreateFileError`
-- `run()` Launches the editor.
-    - **Returns** (string) The contents of the file
-    - Could throw `LaunchEditorError` or `ReadFileError`
-- `runAsync(callback)` Launches the editor in an async way
-    - `callback` (function (error, text))
-        - `error` could be of type `ReadFileError` or `LaunchEditorError`
-        - `text`(string) The contents of the file
-- `cleanup()`  Removes the temporary file.
-    - Could throw `RemoveFileError`
-    
-**External Editor Public Properties**
-
-- `text` (string) *readonly* The text in the temporary file.
-- `editor.bin` (string) The editor determined from the environment.
-- `editor.args` (array) Default arguments for the bin
-- `tempFile` (string) Path to temporary file. Can be changed, but be careful as the temporary file probably already 
-    exists and would need be removed manually.
-- `lastExitStatus` (number) The last exit code emitted from the editor.
-    
-**Config Options**
-
-- `prefix` (string) *Optional* A prefix for the file name.
-- `postfix` (string; *Optional* A postfix for the file name. Useful if you want to provide an extension.
-- `mode` (number) *Optional* Which mode to create the file with. e.g. 644
-- `template` (string) *Optional* A template for the filename. See [tmp](https://www.npmjs.com/package/tmp).
-- `dir` (string) *Optional* Which path to store the file.
-    
-## Errors
-
-All errors have a simple message explaining what went wrong. They all also have an `originalError` property containing
-the original error thrown for debugging purposes.
-    
-## Why Synchronous?
- 
-Everything is synchronous to make sure the editor has complete control of the stdin and stdout. Testing has shown 
-async launching of the editor can lead to issues when using readline or other packages which try to read from stdin or 
-write to stdout. Seeing as this will be used in an interactive CLI environment, I made the decision to force the package
-to be synchronous. If you know a reliable way to force all stdin and stdout to be limited only to the child_process,
-please submit a PR.
-
-If async is really needed, you can use `editAsync` or `runAsync`. If you are using readline or have anything else
-listening to the stdin or you write to stdout, you will most likely have problem, so make sure to remove any other 
-listeners on stdin, stdout, or stderr.
-
-## Demo
-
-[![asciicast](https://asciinema.org/a/a1qh9lypbe65mj0ivfuoslz2s.png)](https://asciinema.org/a/a1qh9lypbe65mj0ivfuoslz2s)
-
-## Breaking Changes from v2 to v3
-
-- NodeJS 0.12 support dropped.
-- Switched to named imports.
-- All "snake_cased" variables and properties are now "camelCased".
-    - `ExternalEditor.temp_file` is now `ExternalEditor.tempFile`.
-    - `ExternalEditor.last_exit_status` is now `ExternalEditor.lastExitStatus`.
-    - `Error.original_error` is now `Error.originalError`.
-    
-## License
-
-The MIT License (MIT)
-
-Copyright (c) 2016-2018 Kevin Gravier
-
-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/node_modules/external-editor/example_async.js b/node_modules/external-editor/example_async.js
deleted file mode 100644
index 0526166..0000000
--- a/node_modules/external-editor/example_async.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var ExternalEditor = require('./main').ExternalEditor;
-var readline = require('readline');
-
-var rl = readline.createInterface({
-  input: process.stdin,
-  output: null
-});
-
-var message = '\n\n# Please Write a message\n# Any line starting with # is ignored';
-
-process.stdout.write('Please write a message. (press enter to launch your preferred editor)');
-
-editor = new ExternalEditor(message);
-
-rl.on('line', function () {
-  try {
-    rl.pause();
-    editor.runAsync(function (error, response)
-    {
-      if (error) {
-        process.stdout.write(error.message);
-        process.exit(1);
-      }
-      if (response.length === 0) {
-        readline.moveCursor(process.stdout, 0, -1);
-        process.stdout.write('Your message was empty, please try again. (press enter to launch your preferred editor)');
-        rl.resume();
-      } else {
-        process.stdout.write('Your Message:\n');
-        process.stdout.write(response);
-        process.stdout.write('\n');
-        rl.close();
-      }
-    });
-  } catch (err) {
-    process.stderr.write(err.message);
-    process.stdout.write('\n');
-    rl.close();
-  }
-});
diff --git a/node_modules/external-editor/example_sync.js b/node_modules/external-editor/example_sync.js
deleted file mode 100644
index 4ebee95..0000000
--- a/node_modules/external-editor/example_sync.js
+++ /dev/null
@@ -1,38 +0,0 @@
-var ExternalEditor = require('./main').ExternalEditor;
-var readline = require('readline');
-
-var rl = readline.createInterface({
-  input: process.stdin,
-  output: null
-});
-
-var message = '\n\n# Please Write a message\n# Any line starting with # is ignored';
-
-process.stdout.write('Please write a message. (press enter to launch your preferred editor)');
-
-editor = new ExternalEditor(message);
-
-rl.on('line', function () {
-  try {
-    // Get response, remove all lines starting with #, remove any trailing newlines.
-    var response = editor.run().replace(/^#.*\n?/gm, '').replace(/\n+$/g, '').trim();
-
-    if (editor.lastExitStatus !== 0) {
-      process.stderr.write("WARN: The editor exited with a non-zero status\n\n")
-    }
-
-    if (response.length === 0) {
-      readline.moveCursor(process.stdout, 0, -1);
-      process.stdout.write('Your message was empty, please try again. (press enter to launch your preferred editor)');
-    } else {
-      process.stdout.write('Your Message:\n');
-      process.stdout.write(response);
-      process.stdout.write('\n');
-      rl.close();
-    }
-  } catch (err) {
-    process.stderr.write(err.message);
-    process.stdout.write('\n');
-    rl.close();
-  }
-});
diff --git a/node_modules/external-editor/main/errors/CreateFileError.d.ts b/node_modules/external-editor/main/errors/CreateFileError.d.ts
deleted file mode 100644
index 0df1b3d..0000000
--- a/node_modules/external-editor/main/errors/CreateFileError.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-/***
- * Node External Editor
- *
- * Kevin Gravier <kevin@mrkmg.com>
- * MIT 2018
- */
-export declare class CreateFileError extends Error {
-    originalError: Error;
-    constructor(originalError: Error);
-}
diff --git a/node_modules/external-editor/main/errors/CreateFileError.js b/node_modules/external-editor/main/errors/CreateFileError.js
deleted file mode 100644
index 7faa34c..0000000
--- a/node_modules/external-editor/main/errors/CreateFileError.js
+++ /dev/null
@@ -1,39 +0,0 @@
-"use strict";
-/***
- * Node External Editor
- *
- * Kevin Gravier <kevin@mrkmg.com>
- * MIT 2018
- */
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var CreateFileError = /** @class */ (function (_super) {
-    __extends(CreateFileError, _super);
-    function CreateFileError(originalError) {
-        var _newTarget = this.constructor;
-        var _this = _super.call(this, "Failed to create temporary file for editor") || this;
-        _this.originalError = originalError;
-        var proto = _newTarget.prototype;
-        if (Object.setPrototypeOf) {
-            Object.setPrototypeOf(_this, proto);
-        }
-        else {
-            _this.__proto__ = _newTarget.prototype;
-        }
-        return _this;
-    }
-    return CreateFileError;
-}(Error));
-exports.CreateFileError = CreateFileError;
diff --git a/node_modules/external-editor/main/errors/LaunchEditorError.d.ts b/node_modules/external-editor/main/errors/LaunchEditorError.d.ts
deleted file mode 100644
index 105077c..0000000
--- a/node_modules/external-editor/main/errors/LaunchEditorError.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-/***
- * Node External Editor
- *
- * Kevin Gravier <kevin@mrkmg.com>
- * MIT 2018
- */
-export declare class LaunchEditorError extends Error {
-    originalError: Error;
-    constructor(originalError: Error);
-}
diff --git a/node_modules/external-editor/main/errors/LaunchEditorError.js b/node_modules/external-editor/main/errors/LaunchEditorError.js
deleted file mode 100644
index 85a164e..0000000
--- a/node_modules/external-editor/main/errors/LaunchEditorError.js
+++ /dev/null
@@ -1,39 +0,0 @@
-"use strict";
-/***
- * Node External Editor
- *
- * Kevin Gravier <kevin@mrkmg.com>
- * MIT 2018
- */
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var LaunchEditorError = /** @class */ (function (_super) {
-    __extends(LaunchEditorError, _super);
-    function LaunchEditorError(originalError) {
-        var _newTarget = this.constructor;
-        var _this = _super.call(this, "Failed launch editor") || this;
-        _this.originalError = originalError;
-        var proto = _newTarget.prototype;
-        if (Object.setPrototypeOf) {
-            Object.setPrototypeOf(_this, proto);
-        }
-        else {
-            _this.__proto__ = _newTarget.prototype;
-        }
-        return _this;
-    }
-    return LaunchEditorError;
-}(Error));
-exports.LaunchEditorError = LaunchEditorError;
diff --git a/node_modules/external-editor/main/errors/ReadFileError.d.ts b/node_modules/external-editor/main/errors/ReadFileError.d.ts
deleted file mode 100644
index 438eae1..0000000
--- a/node_modules/external-editor/main/errors/ReadFileError.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-/***
- * Node External Editor
- *
- * Kevin Gravier <kevin@mrkmg.com>
- * MIT 2018
- */
-export declare class ReadFileError extends Error {
-    originalError: Error;
-    constructor(originalError: Error);
-}
diff --git a/node_modules/external-editor/main/errors/ReadFileError.js b/node_modules/external-editor/main/errors/ReadFileError.js
deleted file mode 100644
index 69e0513..0000000
--- a/node_modules/external-editor/main/errors/ReadFileError.js
+++ /dev/null
@@ -1,39 +0,0 @@
-"use strict";
-/***
- * Node External Editor
- *
- * Kevin Gravier <kevin@mrkmg.com>
- * MIT 2018
- */
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var ReadFileError = /** @class */ (function (_super) {
-    __extends(ReadFileError, _super);
-    function ReadFileError(originalError) {
-        var _newTarget = this.constructor;
-        var _this = _super.call(this, "Failed to read temporary file") || this;
-        _this.originalError = originalError;
-        var proto = _newTarget.prototype;
-        if (Object.setPrototypeOf) {
-            Object.setPrototypeOf(_this, proto);
-        }
-        else {
-            _this.__proto__ = _newTarget.prototype;
-        }
-        return _this;
-    }
-    return ReadFileError;
-}(Error));
-exports.ReadFileError = ReadFileError;
diff --git a/node_modules/external-editor/main/errors/RemoveFileError.d.ts b/node_modules/external-editor/main/errors/RemoveFileError.d.ts
deleted file mode 100644
index a6402e4..0000000
--- a/node_modules/external-editor/main/errors/RemoveFileError.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-/***
- * Node External Editor
- *
- * Kevin Gravier <kevin@mrkmg.com>
- * MIT 2018
- */
-export declare class RemoveFileError extends Error {
-    originalError: Error;
-    constructor(originalError: Error);
-}
diff --git a/node_modules/external-editor/main/errors/RemoveFileError.js b/node_modules/external-editor/main/errors/RemoveFileError.js
deleted file mode 100644
index 23d266f..0000000
--- a/node_modules/external-editor/main/errors/RemoveFileError.js
+++ /dev/null
@@ -1,39 +0,0 @@
-"use strict";
-/***
- * Node External Editor
- *
- * Kevin Gravier <kevin@mrkmg.com>
- * MIT 2018
- */
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var RemoveFileError = /** @class */ (function (_super) {
-    __extends(RemoveFileError, _super);
-    function RemoveFileError(originalError) {
-        var _newTarget = this.constructor;
-        var _this = _super.call(this, "Failed to cleanup temporary file") || this;
-        _this.originalError = originalError;
-        var proto = _newTarget.prototype;
-        if (Object.setPrototypeOf) {
-            Object.setPrototypeOf(_this, proto);
-        }
-        else {
-            _this.__proto__ = _newTarget.prototype;
-        }
-        return _this;
-    }
-    return RemoveFileError;
-}(Error));
-exports.RemoveFileError = RemoveFileError;
diff --git a/node_modules/external-editor/main/index.d.ts b/node_modules/external-editor/main/index.d.ts
deleted file mode 100644
index d1e2730..0000000
--- a/node_modules/external-editor/main/index.d.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-/***
- * Node External Editor
- *
- * Kevin Gravier <kevin@mrkmg.com>
- * MIT 2019
- */
-import { CreateFileError } from "./errors/CreateFileError";
-import { LaunchEditorError } from "./errors/LaunchEditorError";
-import { ReadFileError } from "./errors/ReadFileError";
-import { RemoveFileError } from "./errors/RemoveFileError";
-export interface IEditorParams {
-    args: string[];
-    bin: string;
-}
-export interface IFileOptions {
-    prefix?: string;
-    postfix?: string;
-    mode?: number;
-    template?: string;
-    dir?: string;
-}
-export declare type StringCallback = (err: Error, result: string) => void;
-export declare type VoidCallback = () => void;
-export { CreateFileError, LaunchEditorError, ReadFileError, RemoveFileError };
-export declare function edit(text?: string, fileOptions?: IFileOptions): string;
-export declare function editAsync(text: string, callback: StringCallback, fileOptions?: IFileOptions): void;
-export declare class ExternalEditor {
-    private static splitStringBySpace;
-    text: string;
-    tempFile: string;
-    editor: IEditorParams;
-    lastExitStatus: number;
-    private fileOptions;
-    readonly temp_file: string;
-    readonly last_exit_status: number;
-    constructor(text?: string, fileOptions?: IFileOptions);
-    run(): string;
-    runAsync(callback: StringCallback): void;
-    cleanup(): void;
-    private determineEditor;
-    private createTemporaryFile;
-    private readTemporaryFile;
-    private removeTemporaryFile;
-    private launchEditor;
-    private launchEditorAsync;
-}
diff --git a/node_modules/external-editor/main/index.js b/node_modules/external-editor/main/index.js
deleted file mode 100644
index 258f319..0000000
--- a/node_modules/external-editor/main/index.js
+++ /dev/null
@@ -1,193 +0,0 @@
-"use strict";
-/***
- * Node External Editor
- *
- * Kevin Gravier <kevin@mrkmg.com>
- * MIT 2019
- */
-Object.defineProperty(exports, "__esModule", { value: true });
-var chardet_1 = require("chardet");
-var child_process_1 = require("child_process");
-var fs_1 = require("fs");
-var iconv_lite_1 = require("iconv-lite");
-var tmp_1 = require("tmp");
-var CreateFileError_1 = require("./errors/CreateFileError");
-exports.CreateFileError = CreateFileError_1.CreateFileError;
-var LaunchEditorError_1 = require("./errors/LaunchEditorError");
-exports.LaunchEditorError = LaunchEditorError_1.LaunchEditorError;
-var ReadFileError_1 = require("./errors/ReadFileError");
-exports.ReadFileError = ReadFileError_1.ReadFileError;
-var RemoveFileError_1 = require("./errors/RemoveFileError");
-exports.RemoveFileError = RemoveFileError_1.RemoveFileError;
-function edit(text, fileOptions) {
-    if (text === void 0) { text = ""; }
-    var editor = new ExternalEditor(text, fileOptions);
-    editor.run();
-    editor.cleanup();
-    return editor.text;
-}
-exports.edit = edit;
-function editAsync(text, callback, fileOptions) {
-    if (text === void 0) { text = ""; }
-    var editor = new ExternalEditor(text, fileOptions);
-    editor.runAsync(function (err, result) {
-        if (err) {
-            setImmediate(callback, err, null);
-        }
-        else {
-            try {
-                editor.cleanup();
-                setImmediate(callback, null, result);
-            }
-            catch (cleanupError) {
-                setImmediate(callback, cleanupError, null);
-            }
-        }
-    });
-}
-exports.editAsync = editAsync;
-var ExternalEditor = /** @class */ (function () {
-    function ExternalEditor(text, fileOptions) {
-        if (text === void 0) { text = ""; }
-        this.text = "";
-        this.fileOptions = {};
-        this.text = text;
-        if (fileOptions) {
-            this.fileOptions = fileOptions;
-        }
-        this.determineEditor();
-        this.createTemporaryFile();
-    }
-    ExternalEditor.splitStringBySpace = function (str) {
-        var pieces = [];
-        var currentString = "";
-        for (var strIndex = 0; strIndex < str.length; strIndex++) {
-            var currentLetter = str[strIndex];
-            if (strIndex > 0 && currentLetter === " " && str[strIndex - 1] !== "\\" && currentString.length > 0) {
-                pieces.push(currentString);
-                currentString = "";
-            }
-            else {
-                currentString += currentLetter;
-            }
-        }
-        if (currentString.length > 0) {
-            pieces.push(currentString);
-        }
-        return pieces;
-    };
-    Object.defineProperty(ExternalEditor.prototype, "temp_file", {
-        get: function () {
-            console.log("DEPRECATED: temp_file. Use tempFile moving forward.");
-            return this.tempFile;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ExternalEditor.prototype, "last_exit_status", {
-        get: function () {
-            console.log("DEPRECATED: last_exit_status. Use lastExitStatus moving forward.");
-            return this.lastExitStatus;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    ExternalEditor.prototype.run = function () {
-        this.launchEditor();
-        this.readTemporaryFile();
-        return this.text;
-    };
-    ExternalEditor.prototype.runAsync = function (callback) {
-        var _this = this;
-        try {
-            this.launchEditorAsync(function () {
-                try {
-                    _this.readTemporaryFile();
-                    setImmediate(callback, null, _this.text);
-                }
-                catch (readError) {
-                    setImmediate(callback, readError, null);
-                }
-            });
-        }
-        catch (launchError) {
-            setImmediate(callback, launchError, null);
-        }
-    };
-    ExternalEditor.prototype.cleanup = function () {
-        this.removeTemporaryFile();
-    };
-    ExternalEditor.prototype.determineEditor = function () {
-        var editor = process.env.VISUAL ? process.env.VISUAL :
-            process.env.EDITOR ? process.env.EDITOR :
-                /^win/.test(process.platform) ? "notepad" :
-                    "vim";
-        var editorOpts = ExternalEditor.splitStringBySpace(editor).map(function (piece) { return piece.replace("\\ ", " "); });
-        var bin = editorOpts.shift();
-        this.editor = { args: editorOpts, bin: bin };
-    };
-    ExternalEditor.prototype.createTemporaryFile = function () {
-        try {
-            this.tempFile = tmp_1.tmpNameSync(this.fileOptions);
-            var opt = { encoding: "utf8" };
-            if (this.fileOptions.hasOwnProperty("mode")) {
-                opt.mode = this.fileOptions.mode;
-            }
-            fs_1.writeFileSync(this.tempFile, this.text, opt);
-        }
-        catch (createFileError) {
-            throw new CreateFileError_1.CreateFileError(createFileError);
-        }
-    };
-    ExternalEditor.prototype.readTemporaryFile = function () {
-        try {
-            var tempFileBuffer = fs_1.readFileSync(this.tempFile);
-            if (tempFileBuffer.length === 0) {
-                this.text = "";
-            }
-            else {
-                var encoding = chardet_1.detect(tempFileBuffer).toString();
-                if (!iconv_lite_1.encodingExists(encoding)) {
-                    // Probably a bad idea, but will at least prevent crashing
-                    encoding = "utf8";
-                }
-                this.text = iconv_lite_1.decode(tempFileBuffer, encoding);
-            }
-        }
-        catch (readFileError) {
-            throw new ReadFileError_1.ReadFileError(readFileError);
-        }
-    };
-    ExternalEditor.prototype.removeTemporaryFile = function () {
-        try {
-            fs_1.unlinkSync(this.tempFile);
-        }
-        catch (removeFileError) {
-            throw new RemoveFileError_1.RemoveFileError(removeFileError);
-        }
-    };
-    ExternalEditor.prototype.launchEditor = function () {
-        try {
-            var editorProcess = child_process_1.spawnSync(this.editor.bin, this.editor.args.concat([this.tempFile]), { stdio: "inherit" });
-            this.lastExitStatus = editorProcess.status;
-        }
-        catch (launchError) {
-            throw new LaunchEditorError_1.LaunchEditorError(launchError);
-        }
-    };
-    ExternalEditor.prototype.launchEditorAsync = function (callback) {
-        var _this = this;
-        try {
-            var editorProcess = child_process_1.spawn(this.editor.bin, this.editor.args.concat([this.tempFile]), { stdio: "inherit" });
-            editorProcess.on("exit", function (code) {
-                _this.lastExitStatus = code;
-                setImmediate(callback);
-            });
-        }
-        catch (launchError) {
-            throw new LaunchEditorError_1.LaunchEditorError(launchError);
-        }
-    };
-    return ExternalEditor;
-}());
-exports.ExternalEditor = ExternalEditor;
diff --git a/node_modules/external-editor/package.json b/node_modules/external-editor/package.json
deleted file mode 100644
index b0e2474..0000000
--- a/node_modules/external-editor/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "name": "external-editor",
-  "version": "3.1.0",
-  "description": "Edit a string with the users preferred text editor using $VISUAL or $ENVIRONMENT",
-  "main": "main/index.js",
-  "types": "main/index.d.ts",
-  "scripts": {
-    "test": "mocha --recursive --require ts-node/register --timeout 10000 ./test/spec 'test/spec/**/*.ts'",
-    "compile": "tsc -p tsconfig.json",
-    "lint": "tslint './src/**/*.ts' './test/**/*.ts'"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/mrkmg/node-external-editor.git"
-  },
-  "keywords": [
-    "editor",
-    "external",
-    "user",
-    "visual"
-  ],
-  "author": "Kevin Gravier <kevin@mrkmg.com> (https://mrkmg.com)",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/mrkmg/node-external-editor/issues"
-  },
-  "homepage": "https://github.com/mrkmg/node-external-editor#readme",
-  "dependencies": {
-    "chardet": "^0.7.0",
-    "iconv-lite": "^0.4.24",
-    "tmp": "^0.0.33"
-  },
-  "engines": {
-    "node": ">=4"
-  },
-  "devDependencies": {
-    "@types/chai": "^4.1.4",
-    "@types/chardet": "^0.5.0",
-    "@types/mocha": "^5.2.5",
-    "@types/node": "^10.14.12",
-    "@types/tmp": "0.0.33",
-    "chai": "^4.0.0",
-    "es6-shim": "^0.35.3",
-    "mocha": "^5.2.0",
-    "ts-node": "^7.0.1",
-    "tslint": "^5.18.0",
-    "typescript": "^3.5.2"
-  },
-  "files": [
-    "main",
-    "example_sync.js",
-    "example_async.js"
-  ],
-  "config": {
-    "ndt": {
-      "versions": [
-        "major"
-      ]
-    }
-  }
-}
diff --git a/node_modules/figures/index.d.ts b/node_modules/figures/index.d.ts
deleted file mode 100644
index e770ef3..0000000
--- a/node_modules/figures/index.d.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-declare const figureSet: {
-	readonly tick: string;
-	readonly cross: string;
-	readonly star: string;
-	readonly square: string;
-	readonly squareSmall: string;
-	readonly squareSmallFilled: string;
-	readonly play: string;
-	readonly circle: string;
-	readonly circleFilled: string;
-	readonly circleDotted: string;
-	readonly circleDouble: string;
-	readonly circleCircle: string;
-	readonly circleCross: string;
-	readonly circlePipe: string;
-	readonly circleQuestionMark: string;
-	readonly bullet: string;
-	readonly dot: string;
-	readonly line: string;
-	readonly ellipsis: string;
-	readonly pointer: string;
-	readonly pointerSmall: string;
-	readonly info: string;
-	readonly warning: string;
-	readonly hamburger: string;
-	readonly smiley: string;
-	readonly mustache: string;
-	readonly heart: string;
-	readonly nodejs: string;
-	readonly arrowUp: string;
-	readonly arrowDown: string;
-	readonly arrowLeft: string;
-	readonly arrowRight: string;
-	readonly radioOn: string;
-	readonly radioOff: string;
-	readonly checkboxOn: string;
-	readonly checkboxOff: string;
-	readonly checkboxCircleOn: string;
-	readonly checkboxCircleOff: string;
-	readonly questionMarkPrefix: string;
-	readonly oneHalf: string;
-	readonly oneThird: string;
-	readonly oneQuarter: string;
-	readonly oneFifth: string;
-	readonly oneSixth: string;
-	readonly oneSeventh: string;
-	readonly oneEighth: string;
-	readonly oneNinth: string;
-	readonly oneTenth: string;
-	readonly twoThirds: string;
-	readonly twoFifths: string;
-	readonly threeQuarters: string;
-	readonly threeFifths: string;
-	readonly threeEighths: string;
-	readonly fourFifths: string;
-	readonly fiveSixths: string;
-	readonly fiveEighths: string;
-	readonly sevenEighth: string;
-}
-
-type FigureSet = typeof figureSet
-
-declare const figures: {
-	/**
-	Replace Unicode symbols depending on the OS.
-
-	@param string - String where the Unicode symbols will be replaced with fallback symbols depending on the OS.
-	@returns The input with replaced fallback Unicode symbols on Windows.
-
-	@example
-	```
-	import figures = require('figures');
-
-	console.log(figures('✔︎ check'));
-	// On non-Windows OSes:  ✔︎ check
-	// On Windows:           √ check
-
-	console.log(figures.tick);
-	// On non-Windows OSes:  ✔︎
-	// On Windows:           √
-	```
-	*/
-	(string: string): string;
-
-	/**
-	Symbols to use when not running on Windows.
-	*/
-	readonly main: FigureSet;
-
-	/**
-	Symbols to use when running on Windows.
-	*/
-	readonly windows: FigureSet;
-} & FigureSet;
-
-export = figures;
diff --git a/node_modules/figures/index.js b/node_modules/figures/index.js
deleted file mode 100644
index 2cbe2db..0000000
--- a/node_modules/figures/index.js
+++ /dev/null
@@ -1,151 +0,0 @@
-'use strict';
-const escapeStringRegexp = require('escape-string-regexp');
-
-const {platform} = process;
-
-const main = {
-	tick: '✔',
-	cross: '✖',
-	star: '★',
-	square: '▇',
-	squareSmall: '◻',
-	squareSmallFilled: '◼',
-	play: '▶',
-	circle: '◯',
-	circleFilled: '◉',
-	circleDotted: '◌',
-	circleDouble: '◎',
-	circleCircle: 'ⓞ',
-	circleCross: 'ⓧ',
-	circlePipe: 'Ⓘ',
-	circleQuestionMark: '?⃝',
-	bullet: '●',
-	dot: '․',
-	line: '─',
-	ellipsis: '…',
-	pointer: '❯',
-	pointerSmall: '›',
-	info: 'ℹ',
-	warning: '⚠',
-	hamburger: '☰',
-	smiley: '㋡',
-	mustache: '෴',
-	heart: '♥',
-	nodejs: '⬢',
-	arrowUp: '↑',
-	arrowDown: '↓',
-	arrowLeft: '←',
-	arrowRight: '→',
-	radioOn: '◉',
-	radioOff: '◯',
-	checkboxOn: '☒',
-	checkboxOff: '☐',
-	checkboxCircleOn: 'ⓧ',
-	checkboxCircleOff: 'Ⓘ',
-	questionMarkPrefix: '?⃝',
-	oneHalf: '½',
-	oneThird: '⅓',
-	oneQuarter: '¼',
-	oneFifth: '⅕',
-	oneSixth: '⅙',
-	oneSeventh: '⅐',
-	oneEighth: '⅛',
-	oneNinth: '⅑',
-	oneTenth: '⅒',
-	twoThirds: '⅔',
-	twoFifths: '⅖',
-	threeQuarters: '¾',
-	threeFifths: '⅗',
-	threeEighths: '⅜',
-	fourFifths: '⅘',
-	fiveSixths: '⅚',
-	fiveEighths: '⅝',
-	sevenEighths: '⅞'
-};
-
-const windows = {
-	tick: '√',
-	cross: '×',
-	star: '*',
-	square: '█',
-	squareSmall: '[ ]',
-	squareSmallFilled: '[█]',
-	play: '►',
-	circle: '( )',
-	circleFilled: '(*)',
-	circleDotted: '( )',
-	circleDouble: '( )',
-	circleCircle: '(○)',
-	circleCross: '(×)',
-	circlePipe: '(│)',
-	circleQuestionMark: '(?)',
-	bullet: '*',
-	dot: '.',
-	line: '─',
-	ellipsis: '...',
-	pointer: '>',
-	pointerSmall: '»',
-	info: 'i',
-	warning: '‼',
-	hamburger: '≡',
-	smiley: '☺',
-	mustache: '┌─┐',
-	heart: main.heart,
-	nodejs: '♦',
-	arrowUp: main.arrowUp,
-	arrowDown: main.arrowDown,
-	arrowLeft: main.arrowLeft,
-	arrowRight: main.arrowRight,
-	radioOn: '(*)',
-	radioOff: '( )',
-	checkboxOn: '[×]',
-	checkboxOff: '[ ]',
-	checkboxCircleOn: '(×)',
-	checkboxCircleOff: '( )',
-	questionMarkPrefix: '？',
-	oneHalf: '1/2',
-	oneThird: '1/3',
-	oneQuarter: '1/4',
-	oneFifth: '1/5',
-	oneSixth: '1/6',
-	oneSeventh: '1/7',
-	oneEighth: '1/8',
-	oneNinth: '1/9',
-	oneTenth: '1/10',
-	twoThirds: '2/3',
-	twoFifths: '2/5',
-	threeQuarters: '3/4',
-	threeFifths: '3/5',
-	threeEighths: '3/8',
-	fourFifths: '4/5',
-	fiveSixths: '5/6',
-	fiveEighths: '5/8',
-	sevenEighths: '7/8'
-};
-
-if (platform === 'linux') {
-	// The main one doesn't look that good on Ubuntu.
-	main.questionMarkPrefix = '?';
-}
-
-const figures = platform === 'win32' ? windows : main;
-
-const fn = string => {
-	if (figures === main) {
-		return string;
-	}
-
-	for (const [key, value] of Object.entries(main)) {
-		if (value === figures[key]) {
-			continue;
-		}
-
-		string = string.replace(new RegExp(escapeStringRegexp(value), 'g'), figures[key]);
-	}
-
-	return string;
-};
-
-module.exports = Object.assign(fn, figures);
-module.exports.main = main;
-module.exports.windows = windows;
diff --git a/node_modules/figures/license b/node_modules/figures/license
deleted file mode 100644
index fa7ceba..0000000
--- a/node_modules/figures/license
+++ /dev/null
@@ -1,9 +0,0 @@
-MIT License
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
-
-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/node_modules/figures/package.json b/node_modules/figures/package.json
deleted file mode 100644
index ee3b3df..0000000
--- a/node_modules/figures/package.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
-	"name": "figures",
-	"version": "3.2.0",
-	"description": "Unicode symbols with Windows CMD fallbacks",
-	"license": "MIT",
-	"repository": "sindresorhus/figures",
-	"funding": "https://github.com/sponsors/sindresorhus",
-	"author": {
-		"name": "Sindre Sorhus",
-		"email": "sindresorhus@gmail.com",
-		"url": "https://sindresorhus.com"
-	},
-	"engines": {
-		"node": ">=8"
-	},
-	"scripts": {
-		"test": "xo && ava && tsd",
-		"make": "./makefile.js"
-	},
-	"files": [
-		"index.js",
-		"index.d.ts"
-	],
-	"keywords": [
-		"unicode",
-		"cli",
-		"cmd",
-		"command-line",
-		"characters",
-		"symbol",
-		"symbols",
-		"figure",
-		"figures",
-		"fallback"
-	],
-	"dependencies": {
-		"escape-string-regexp": "^1.0.5"
-	},
-	"devDependencies": {
-		"ava": "^1.4.1",
-		"markdown-table": "^1.1.2",
-		"tsd": "^0.7.2",
-		"xo": "^0.24.0"
-	}
-}
diff --git a/node_modules/figures/readme.md b/node_modules/figures/readme.md
deleted file mode 100644
index 22d3620..0000000
--- a/node_modules/figures/readme.md
+++ /dev/null
@@ -1,139 +0,0 @@
-# figures [![Build Status](https://travis-ci.org/sindresorhus/figures.svg?branch=master)](https://travis-ci.org/sindresorhus/figures)
-
-> Unicode symbols with Windows CMD fallbacks
-
-[![](screenshot.png)](index.js)
-
-[*and more...*](index.js)
-
-Windows CMD only supports a [limited character set](http://en.wikipedia.org/wiki/Code_page_437).
-
-## Install
-
-```
-$ npm install figures
-```
-
-## Usage
-
-See the [source](index.js) for supported symbols.
-
-```js
-const figures = require('figures');
-
-console.log(figures('✔︎ check'));
-// On non-Windows OSes:  ✔︎ check
-// On Windows:           √ check
-
-console.log(figures.tick);
-// On non-Windows OSes:  ✔︎
-// On Windows:           √
-
-console.log(figures.main.tick);
-// On all OSes:  ✔︎
-
-console.log(figures.windows.tick);
-// On all OSes:  √
-```
-
-## API
-
-### figures(string)
-
-Returns the input with replaced fallback Unicode symbols on Windows.
-
-All the below [figures](#figures) are attached to the main export as shown in the example above.
-
-#### string
-
-Type: `string`
-
-String where the Unicode symbols will be replaced with fallback symbols depending on the OS.
-
-### figures.main
-
-Symbols to use when not running on Windows.
-
-### figures.windows
-
-Symbols to use when running on Windows.
-
-
-## Figures
-
-| Name               | Non-Windows | Windows |
-| ------------------ | :---------: | :-----: |
-| tick               |      ✔      |    √    |
-| cross              |      ✖      |    ×    |
-| star               |      ★      |    *    |
-| square             |      ▇      |    █    |
-| squareSmall        |      ◻      |   [ ]   |
-| squareSmallFilled  |      ◼      |   [█]   |
-| play               |      ▶      |    ►    |
-| circle             |      ◯      |   ( )   |
-| circleFilled       |      ◉      |   (*)   |
-| circleDotted       |      ◌      |   ( )   |
-| circleDouble       |      ◎      |   ( )   |
-| circleCircle       |      ⓞ      |   (○)   |
-| circleCross        |      ⓧ      |   (×)   |
-| circlePipe         |      Ⓘ      |   (│)   |
-| circleQuestionMark |      ?⃝     |   (?)   |
-| bullet             |      ●      |    *    |
-| dot                |      ․      |    .    |
-| line               |      ─      |    ─    |
-| ellipsis           |      …      |   ...   |
-| pointer            |      ❯      |    >    |
-| pointerSmall       |      ›      |    »    |
-| info               |      ℹ      |    i    |
-| warning            |      ⚠      |    ‼    |
-| hamburger          |      ☰      |    ≡    |
-| smiley             |      ㋡      |    ☺    |
-| mustache           |      ෴      |   ┌─┐   |
-| heart              |      ♥      |    ♥    |
-| nodejs             |      ⬢      |    ♦    |
-| arrowUp            |      ↑      |    ↑    |
-| arrowDown          |      ↓      |    ↓    |
-| arrowLeft          |      ←      |    ←    |
-| arrowRight         |      →      |    →    |
-| radioOn            |      ◉      |   (*)   |
-| radioOff           |      ◯      |   ( )   |
-| checkboxOn         |      ☒      |   [×]   |
-| checkboxOff        |      ☐      |   [ ]   |
-| checkboxCircleOn   |      ⓧ      |   (×)   |
-| checkboxCircleOff  |      Ⓘ      |   ( )   |
-| questionMarkPrefix |      ?⃝     |    ？    |
-| oneHalf            |      ½      |   1/2   |
-| oneThird           |      ⅓      |   1/3   |
-| oneQuarter         |      ¼      |   1/4   |
-| oneFifth           |      ⅕      |   1/5   |
-| oneSixth           |      ⅙      |   1/6   |
-| oneSeventh         |      ⅐      |   1/7   |
-| oneEighth          |      ⅛      |   1/8   |
-| oneNinth           |      ⅑      |   1/9   |
-| oneTenth           |      ⅒      |   1/10  |
-| twoThirds          |      ⅔      |   2/3   |
-| twoFifths          |      ⅖      |   2/5   |
-| threeQuarters      |      ¾      |   3/4   |
-| threeFifths        |      ⅗      |   3/5   |
-| threeEighths       |      ⅜      |   3/8   |
-| fourFifths         |      ⅘      |   4/5   |
-| fiveSixths         |      ⅚      |   5/6   |
-| fiveEighths        |      ⅝      |   5/8   |
-| sevenEighths       |      ⅞      |   7/8   |
-
-
-## Related
-
-- [log-symbols](https://github.com/sindresorhus/log-symbols) - Colored symbols for various log levels
-
----
-
-<div align="center">
-	<b>
-		<a href="https://tidelift.com/subscription/pkg/npm-figures?utm_source=npm-figures&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
-	</b>
-	<br>
-	<sub>
-		Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
-	</sub>
-</div>
diff --git a/node_modules/graphql-config/LICENSE b/node_modules/graphql-config/LICENSE
deleted file mode 100644
index 1fd1cea..0000000
--- a/node_modules/graphql-config/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 Graphcool
-
-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/node_modules/graphql-config/README.md b/node_modules/graphql-config/README.md
deleted file mode 100644
index 1c206fc..0000000
--- a/node_modules/graphql-config/README.md
+++ /dev/null
@@ -1,192 +0,0 @@
-# graphql-config
-
-[![Build Status](https://travis-ci.org/prisma/graphql-config.svg?branch=master)](https://travis-ci.org/prisma/graphql-config) [![npm version](https://badge.fury.io/js/graphql-config.svg)](https://badge.fury.io/js/graphql-config)
-
-> The README reflects the new [graphql-config protocol](specification.md).
-> Old graphql-config-parser documentation [can be found here](https://github.com/graphcool/graphql-config/tree/graphql-config-parser)
-
-The easiest way to configure your development environment with your GraphQL schema (supported by most tools, editors &amp; IDEs)
-
-## Supported by...
-
-### Language Services
-* [graphql-language-service](https://github.com/graphql/graphql-language-service) - An interface for building GraphQL language services for IDEs (_pending_)
-
-### Editors
-* [js-graphql-intellij-plugin](https://github.com/jimkyndemeyer/js-graphql-intellij-plugin) - GraphQL language support for IntelliJ IDEA and WebStorm, including Relay.QL tagged templates in JavaScript and TypeScript (_pending_)
-* [atom-language-graphql](https://github.com/rmosolgo/language-graphql) - GraphQL support for Atom text editor (_pending_)
-* [vscode-graphql](https://github.com/stephen/vscode-graphql) - GraphQL support for VSCode text editor
-
-### Tools
-
-* [babel-plugin-react-relay](https://github.com/graphcool/babel-plugin-react-relay) - Babel compile step to process your `Relay.QL` queries (_pending_)
-* [babel-plugin-transform-relay-hot](https://github.com/nodkz/babel-plugin-transform-relay-hot) - Wrapper under BabelRelayPlugin with hot reload (_pending_)
-* [eslint-plugin-graphql](https://github.com/apollostack/eslint-plugin-graphql) - An ESLint plugin that checks tagged template strings against a GraphQL schema (_pending_)
-* [webpack-plugin-graphql-schema-hot](https://github.com/nodkz/webpack-plugin-graphql-schema-hot) - Webpack plugin which tracks changes in your schema and generates its introspection in `json` and `txt` formats (_pending_)
-
-> Did we forget a tool/editor? Please [add it here](https://github.com/graphcool/graphql-config/issues/new).
-
-**[Go to `graphql-config` library docs](#graphql-config-api)**
-
-## Usage
-
-**tl;dr**
-
-Install [`graphql-cli`](https://github.com/graphcool/graphql-cli) and run `graphql init`. Answer a few simple questions and you are set up!
-
-You can either configure your GraphQL endpoint via a configuration file `.graphqlconfig`
-(or `.graphqlconfig.yaml`) which should be put into the root of your project
-
-### Simplest use case
-
-The simplest config specifies only `schemaPath` which is path to the file with introspection
-results or corresponding SDL document
-
-```json
-{
-  "schemaPath": "schema.graphql"
-}
-```
-
-or
-
-```json
-{
-  "schemaPath": "schema.json"
-}
-```
-
-### Specifying includes/excludes files
-
-You can specify which files are included/excluded using the corresponding options:
-
-```json
-{
-  "schemaPath": "schema.graphql",
-  "includes": ["*.graphql"],
-  "excludes": ["temp/**"]
-}
-```
-
-> Note: `excludes` and `includes` fields are globs that should match filename.
-> So, just `temp` or `temp/` won't match all files inside the directory.
-> That's why the example uses `temp/**`
-
-#### Specifying endpoint info
-
-You may specify your endpoints info in `.graphqlconfig` which may be used by some tools.
-The simplest case:
-
-```json
-{
-  "schemaPath": "schema.graphql",
-  "extensions": {
-    "endpoints": {
-      "dev": "https://example.com/graphql"
-    }
-  }
-}
-```
-
-In case you need provide additional information, for example headers to authenticate your GraphQL endpoint or
-an endpoint for subscription, you can use expanded version:
-
-```json
-{
-  "schemaPath": "schema.graphql",
-  "extensions": {
-    "endpoints": {
-      "dev": {
-        "url": "https://example.com/graphql",
-        "headers": {
-          "Authorization": "Bearer ${env:AUTH_TOKEN_ENV}"
-        },
-        "subscription": {
-          "url": "ws://example.com/graphql",
-          "connectionParams": {
-            "Token": "${env:YOUR_APP_TOKEN}"
-          }
-        }
-      }
-    }
-  }
-}
-```
-
-> Note: do not save secure information in .graphqlconfig file. Use [Environment variables](specification.md#referencing-environment-variables) for that like in the example above.
-
-In case if you have multiple endpoints use the following syntax:
-
-```json
-{
-  "schemaPath": "schema.graphql",
-  "extensions": {
-    "endpoints": {
-      "prod": {
-        "url": "https://your-app.com/graphql",
-        "subscription": {
-          "url": "wss://subscriptions.graph.cool/v1/instagram"
-        }
-      },
-      "dev": {
-        "url": "http://localhost:3000/graphql",
-        "subscription": {
-          "url": "ws://localhost:3001"
-        }
-      }
-    }
-  }
-}
-```
-
-### Multi-project configuration (advanced)
-> TBD
-
-__Refer to [specification use-cases](specification.md#use-cases) for details__
-
-## How it works
-
-This project aims to be provide a unifying configuration file format to configure your GraphQL schema in your development environment.
-
-Additional to the format specification, it provides the [`graphql-config`](#graphql-config-api) library, which is used by [all supported tools and editor plugins](#supported-by). The library reads your provided configuration and passes the actual GraphQL schema along to the tool which called it.
-
-
-## `graphql-config` API
-
-Here are very basic examples of how to use `graphql-config` library.
-
-You can find **[the detailed documentation here](docs/)**
-
-### getGraphQLProjectConfig
-
-**NOTE:** if your tool works on per-file basis (e.g. editor plugin, linter, etc) use
-[`getGraphQLConfig`](#getGraphQLConfig) function
-
-`getGraphQLProjectConfig` should be used by tools that do not work on per-file basis
-
-```js
-import { getGraphQLProjectConfig } from 'graphql-config'
-
-const config = getGraphQLProjectConfig('./optionalProjectDir', 'optionalProjectName')
-const schema = config.getSchema()
-// use schema for your tool/plugin
-```
-
-### getGraphQLConfig
-
-`getGraphQLConfig` should be used by tools that work on per-file basis (editor plugins,
-linters, etc.)
-
-```js
-import { getGraphQLConfig } from 'graphql-config'
-
-const config = getGraphQLConfig('./optionalProjectDir')
-const schema = config.getConfigForFile(filename).getSchema()
-// use schema for your tool/plugin
-```
-
-## Help & Community [![Slack Status](https://slack.graph.cool/badge.svg)](https://slack.graph.cool)
-
-Join our [Slack community](http://slack.graph.cool/) if you run into issues or have questions. We love talking to you!
-
-![](http://i.imgur.com/5RHR6Ku.png)
diff --git a/node_modules/graphql-config/lib/GraphQLConfig.d.ts b/node_modules/graphql-config/lib/GraphQLConfig.d.ts
deleted file mode 100644
index 8a74339..0000000
--- a/node_modules/graphql-config/lib/GraphQLConfig.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { GraphQLConfigData } from './types';
-import { GraphQLProjectConfig } from './GraphQLProjectConfig';
-export declare class GraphQLConfig {
-    config: GraphQLConfigData;
-    configPath: string;
-    constructor(config: GraphQLConfigData, configPath: string);
-    readonly configDir: string;
-    getProjectConfig(projectName?: string): GraphQLProjectConfig;
-    getConfigForFile(filePath: string): GraphQLProjectConfig | undefined;
-    getProjectNameForFile(filePath: string): string | undefined;
-    getProjects(): {
-        [name: string]: GraphQLProjectConfig;
-    } | undefined;
-    saveConfig(newConfig: GraphQLConfigData, projectName?: string): void;
-}
diff --git a/node_modules/graphql-config/lib/GraphQLConfig.js b/node_modules/graphql-config/lib/GraphQLConfig.js
deleted file mode 100644
index fb1b487..0000000
--- a/node_modules/graphql-config/lib/GraphQLConfig.js
+++ /dev/null
@@ -1,60 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var path_1 = require("path");
-var utils_1 = require("./utils");
-var lodash_1 = require("lodash");
-var GraphQLProjectConfig_1 = require("./GraphQLProjectConfig");
-var GraphQLConfig = /** @class */ (function () {
-    function GraphQLConfig(config, configPath) {
-        utils_1.validateConfig(config);
-        this.config = config;
-        this.configPath = configPath;
-    }
-    Object.defineProperty(GraphQLConfig.prototype, "configDir", {
-        get: function () {
-            return path_1.dirname(this.configPath);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    GraphQLConfig.prototype.getProjectConfig = function (projectName) {
-        return new GraphQLProjectConfig_1.GraphQLProjectConfig(this.config, this.configPath, projectName);
-    };
-    GraphQLConfig.prototype.getConfigForFile = function (filePath) {
-        var projects = this.config.projects;
-        if (!projects || Object.keys(projects).length === 0) {
-            var config = new GraphQLProjectConfig_1.GraphQLProjectConfig(this.config, this.configPath, undefined);
-            return config.includesFile(filePath) ? config : undefined;
-        }
-        return lodash_1.values(this.getProjects()).find(function (project) { return project.includesFile(filePath); }) || undefined;
-    };
-    GraphQLConfig.prototype.getProjectNameForFile = function (filePath) {
-        var proj = this.getConfigForFile(filePath);
-        return proj && proj.projectName || undefined;
-    };
-    GraphQLConfig.prototype.getProjects = function () {
-        var result = {};
-        for (var projectName in (this.config.projects || {})) {
-            result[projectName] = this.getProjectConfig(projectName);
-        }
-        if (Object.keys(result).length === 0) {
-            return undefined;
-        }
-        return result;
-    };
-    GraphQLConfig.prototype.saveConfig = function (newConfig, projectName) {
-        var config;
-        if (projectName) {
-            config = this.config;
-            config.projects = config.projects || {};
-            config.projects[projectName] = config.projects[projectName] || {};
-            config.projects[projectName] = newConfig;
-        }
-        else {
-            config = newConfig;
-        }
-        utils_1.writeConfig(this.configPath, config);
-    };
-    return GraphQLConfig;
-}());
-exports.GraphQLConfig = GraphQLConfig;
diff --git a/node_modules/graphql-config/lib/GraphQLProjectConfig.d.ts b/node_modules/graphql-config/lib/GraphQLProjectConfig.d.ts
deleted file mode 100644
index 709c404..0000000
--- a/node_modules/graphql-config/lib/GraphQLProjectConfig.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { GraphQLSchema } from 'graphql';
-import { IntrospectionResult, GraphQLResolvedConfigData, GraphQLConfigData, GraphQLConfigExtensions } from './types';
-import { GraphQLEndpointsExtension } from './extensions';
-export declare class GraphQLProjectConfig {
-    config: GraphQLResolvedConfigData;
-    configPath: string;
-    projectName?: string;
-    constructor(config: GraphQLConfigData, configPath: string, projectName?: string);
-    resolveConfigPath(relativePath: string): string;
-    includesFile(fileUri: string): boolean;
-    getSchema(): GraphQLSchema;
-    resolveIntrospection(): Promise<IntrospectionResult>;
-    getSchemaSDL(): string;
-    readonly configDir: string;
-    readonly schemaPath: string | null;
-    readonly includes: string[];
-    readonly excludes: string[];
-    readonly extensions: GraphQLConfigExtensions;
-    readonly endpointsExtension: GraphQLEndpointsExtension | null;
-}
diff --git a/node_modules/graphql-config/lib/GraphQLProjectConfig.js b/node_modules/graphql-config/lib/GraphQLProjectConfig.js
deleted file mode 100644
index 74b7722..0000000
--- a/node_modules/graphql-config/lib/GraphQLProjectConfig.js
+++ /dev/null
@@ -1,163 +0,0 @@
-"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __generator = (this && this.__generator) || function (thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (_) try {
-            if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [0, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-};
-var __rest = (this && this.__rest) || function (s, e) {
-    var t = {};
-    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
-        t[p] = s[p];
-    if (s != null && typeof Object.getOwnPropertySymbols === "function")
-        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
-            t[p[i]] = s[p[i]];
-    return t;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var path_1 = require("path");
-var graphql_1 = require("graphql");
-var utils_1 = require("./utils");
-var extensions_1 = require("./extensions");
-/*
- * this class can be used for simple usecases where there is no need in per-file API
- */
-var GraphQLProjectConfig = /** @class */ (function () {
-    function GraphQLProjectConfig(config, configPath, projectName) {
-        utils_1.validateConfig(config);
-        this.config = loadProjectConfig(config, projectName);
-        this.configPath = configPath;
-        this.projectName = projectName;
-    }
-    GraphQLProjectConfig.prototype.resolveConfigPath = function (relativePath) {
-        return path_1.resolve(this.configDir, relativePath);
-    };
-    GraphQLProjectConfig.prototype.includesFile = function (fileUri) {
-        var filePath = fileUri.startsWith('file://') ?
-            fileUri.substr(7) : fileUri;
-        var fullFilePath = filePath.startsWith(this.configDir) ?
-            filePath : path_1.resolve(path_1.join(this.configDir, filePath));
-        var relativePath = path_1.relative(this.configDir, fullFilePath);
-        return ((!this.config.includes ||
-            utils_1.matchesGlobs(relativePath, this.configDir, this.includes)) && !utils_1.matchesGlobs(relativePath, this.configDir, this.excludes));
-    };
-    GraphQLProjectConfig.prototype.getSchema = function () {
-        if (this.schemaPath) {
-            return utils_1.readSchema(this.resolveConfigPath(this.schemaPath));
-        }
-        throw new Error("\"schemaPath\" is required but not provided in " + this.configPath);
-    };
-    GraphQLProjectConfig.prototype.resolveIntrospection = function () {
-        return __awaiter(this, void 0, void 0, function () {
-            return __generator(this, function (_a) {
-                return [2 /*return*/, utils_1.schemaToIntrospection(this.getSchema())];
-            });
-        });
-    };
-    GraphQLProjectConfig.prototype.getSchemaSDL = function () {
-        return graphql_1.printSchema(this.getSchema());
-    };
-    Object.defineProperty(GraphQLProjectConfig.prototype, "configDir", {
-        // Getters
-        get: function () {
-            return path_1.dirname(this.configPath);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(GraphQLProjectConfig.prototype, "schemaPath", {
-        get: function () {
-            return this.config.schemaPath ? this.resolveConfigPath(this.config.schemaPath) : null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(GraphQLProjectConfig.prototype, "includes", {
-        get: function () {
-            return (this.config.includes || []).map(utils_1.normalizeGlob);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(GraphQLProjectConfig.prototype, "excludes", {
-        get: function () {
-            return (this.config.excludes || []).map(utils_1.normalizeGlob);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(GraphQLProjectConfig.prototype, "extensions", {
-        get: function () {
-            return this.config.extensions || {};
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(GraphQLProjectConfig.prototype, "endpointsExtension", {
-        /*
-         extension related helper functions
-        */
-        get: function () {
-            if (!this.extensions.endpoints) {
-                return null;
-            }
-            var endpoints = this.extensions.endpoints;
-            if (typeof endpoints !== 'object' || Array.isArray(endpoints)) {
-                throw new Error(this.configPath + ": \"endpoints\" should be an object");
-            }
-            if (Object.keys(endpoints).length === 0) {
-                return null;
-            }
-            return new extensions_1.GraphQLEndpointsExtension(this.extensions.endpoints, this.configPath);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return GraphQLProjectConfig;
-}());
-exports.GraphQLProjectConfig = GraphQLProjectConfig;
-function loadProjectConfig(config, projectName) {
-    var projects = config.projects, configBase = __rest(config, ["projects"]);
-    if (projects == null || !Object.keys(projects).length) {
-        return config;
-    }
-    if (!projectName) {
-        throw new Error("Project name must be specified for multiproject config. " +
-            ("Valid project names: " + Object.keys(projects).join(', ')));
-    }
-    var projectConfig = projects[projectName];
-    if (!projectConfig) {
-        throw new Error("\"" + projectName + "\" is not a valid project name. " +
-            ("Valid project names: " + Object.keys(projects).join(', ')));
-    }
-    return utils_1.mergeConfigs(configBase, projectConfig);
-}
diff --git a/node_modules/graphql-config/lib/__tests__/basic/findGraphQLConfigFile.d.ts b/node_modules/graphql-config/lib/__tests__/basic/findGraphQLConfigFile.d.ts
deleted file mode 100644
index cb0ff5c..0000000
--- a/node_modules/graphql-config/lib/__tests__/basic/findGraphQLConfigFile.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/node_modules/graphql-config/lib/__tests__/basic/findGraphQLConfigFile.js b/node_modules/graphql-config/lib/__tests__/basic/findGraphQLConfigFile.js
deleted file mode 100644
index 47aae34..0000000
--- a/node_modules/graphql-config/lib/__tests__/basic/findGraphQLConfigFile.js
+++ /dev/null
@@ -1,19 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ava_1 = require("ava");
-var path_1 = require("path");
-var fs_1 = require("fs");
-var os_1 = require("os");
-var _1 = require("../../");
-ava_1.default('returns a correct config filename', function (t) {
-    var configFile = _1.findGraphQLConfigFile(__dirname);
-    t.deepEqual(configFile, path_1.join(__dirname, '.graphqlconfig'));
-});
-ava_1.default('returns a correct config filename for 1st level of sub directories', function (t) {
-    var configFile = _1.findGraphQLConfigFile(__dirname + "/../sub-directory-config");
-    t.deepEqual(configFile, path_1.join(__dirname + "/../sub-directory-config/sub-directory-2", '.graphqlconfig'));
-});
-ava_1.default('throws GraphQLConfigNotFoundError when config is not found', function (t) {
-    var tempDir = fs_1.mkdtempSync(path_1.join(os_1.tmpdir(), 'graphql-config'));
-    t.throws(function () { return _1.findGraphQLConfigFile(tempDir); }, _1.ConfigNotFoundError);
-});
diff --git a/node_modules/graphql-config/lib/__tests__/basic/getGraphQLConfig.d.ts b/node_modules/graphql-config/lib/__tests__/basic/getGraphQLConfig.d.ts
deleted file mode 100644
index cb0ff5c..0000000
--- a/node_modules/graphql-config/lib/__tests__/basic/getGraphQLConfig.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/node_modules/graphql-config/lib/__tests__/basic/getGraphQLConfig.js b/node_modules/graphql-config/lib/__tests__/basic/getGraphQLConfig.js
deleted file mode 100644
index 24aa51b..0000000
--- a/node_modules/graphql-config/lib/__tests__/basic/getGraphQLConfig.js
+++ /dev/null
@@ -1,39 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ava_1 = require("ava");
-var path_1 = require("path");
-var graphql_1 = require("graphql");
-var _1 = require("../../");
-var CONFIG_DIR = path_1.join(__dirname, 'config');
-var config;
-ava_1.default.beforeEach(function () {
-    config = _1.getGraphQLConfig(CONFIG_DIR);
-});
-ava_1.default('returns a correct name', function (t) {
-    var testWithSchemaConfig = config.getProjectConfig('testWithSchema');
-    t.deepEqual(testWithSchemaConfig.projectName, 'testWithSchema');
-});
-ava_1.default('returns config for file', function (t) {
-    var testWithSchemaConfig = config.getConfigForFile(path_1.resolve('./config/schema-a.graphql'));
-    if (testWithSchemaConfig) {
-        t.deepEqual(testWithSchemaConfig.projectName, 'testWithSchema');
-    }
-    else {
-        t.fail();
-    }
-});
-ava_1.default('returns a correct root dir', function (t) {
-    t.deepEqual(config.configDir, CONFIG_DIR);
-});
-ava_1.default('returns a correct schema path', function (t) {
-    t.deepEqual(config.getProjectConfig('testWithSchema').schemaPath, path_1.join(CONFIG_DIR, '__schema__/StarWarsSchema.graphql'));
-    t.deepEqual(config.getProjectConfig('testWithoutSchema').schemaPath, null);
-});
-ava_1.default('reads single schema', function (t) {
-    var typeDefs = "type Query {\n  hello: String!\n}\n";
-    t.is(graphql_1.printSchema(config.getProjectConfig('testSchemaA').getSchema()), typeDefs);
-});
-ava_1.default('reads imported schema', function (t) {
-    var typeDefs = "type Query {\n  hello: String!\n  user: User!\n}\n\ntype User {\n  name: String\n}\n";
-    t.is(graphql_1.printSchema(config.getProjectConfig('testSchemaB').getSchema()), typeDefs);
-});
diff --git a/node_modules/graphql-config/lib/__tests__/basic/getGraphQLProjectConfig.d.ts b/node_modules/graphql-config/lib/__tests__/basic/getGraphQLProjectConfig.d.ts
deleted file mode 100644
index cb0ff5c..0000000
--- a/node_modules/graphql-config/lib/__tests__/basic/getGraphQLProjectConfig.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/node_modules/graphql-config/lib/__tests__/basic/getGraphQLProjectConfig.js b/node_modules/graphql-config/lib/__tests__/basic/getGraphQLProjectConfig.js
deleted file mode 100644
index 4183dbe..0000000
--- a/node_modules/graphql-config/lib/__tests__/basic/getGraphQLProjectConfig.js
+++ /dev/null
@@ -1,54 +0,0 @@
-"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __generator = (this && this.__generator) || function (thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (_) try {
-            if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [0, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-};
-var _this = this;
-Object.defineProperty(exports, "__esModule", { value: true });
-var ava_1 = require("ava");
-var _1 = require("../../");
-ava_1.default('resolves schema from file', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var config, resolvedSchema;
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0:
-                config = _1.getGraphQLProjectConfig(__dirname);
-                return [4 /*yield*/, config.resolveIntrospection()];
-            case 1:
-                resolvedSchema = _a.sent();
-                t.snapshot(resolvedSchema);
-                return [2 /*return*/];
-        }
-    });
-}); });
diff --git a/node_modules/graphql-config/lib/__tests__/endpoint-extension/resolve.d.ts b/node_modules/graphql-config/lib/__tests__/endpoint-extension/resolve.d.ts
deleted file mode 100644
index cb0ff5c..0000000
--- a/node_modules/graphql-config/lib/__tests__/endpoint-extension/resolve.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/node_modules/graphql-config/lib/__tests__/endpoint-extension/resolve.js b/node_modules/graphql-config/lib/__tests__/endpoint-extension/resolve.js
deleted file mode 100644
index b985800..0000000
--- a/node_modules/graphql-config/lib/__tests__/endpoint-extension/resolve.js
+++ /dev/null
@@ -1,180 +0,0 @@
-"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __generator = (this && this.__generator) || function (thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (_) try {
-            if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [0, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-};
-var _this = this;
-Object.defineProperty(exports, "__esModule", { value: true });
-var ava_1 = require("ava");
-var graphql_1 = require("graphql");
-var _1 = require("../../");
-var utils_1 = require("../utils");
-ava_1.default.before(function (t) { return __awaiter(_this, void 0, void 0, function () {
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0: return [4 /*yield*/, utils_1.serveSchema()];
-            case 1: return [2 /*return*/, _a.sent()];
-        }
-    });
-}); });
-var confPath = __dirname + "/.graphqlconfig";
-ava_1.default('getEndpointsMap when endpoint is string url', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var configData, config, endpoints;
-    return __generator(this, function (_a) {
-        configData = {
-            schemaPath: '../schema.json',
-            extensions: {
-                endpoints: {
-                    dev: 'http://default',
-                },
-            },
-        };
-        config = new _1.GraphQLProjectConfig(configData, confPath);
-        endpoints = config.endpointsExtension;
-        t.deepEqual(endpoints && endpoints.getRawEndpointsMap(), {
-            dev: { url: 'http://default' },
-        });
-        return [2 /*return*/];
-    });
-}); });
-ava_1.default('getEndpointsMap when endpoint is single endpoint config', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var configData, config, endpoint;
-    return __generator(this, function (_a) {
-        configData = {
-            schemaPath: '../schema.json',
-            extensions: {
-                endpoints: {
-                    dev: {
-                        url: 'http://default',
-                        subscription: {
-                            url: 'ws://test',
-                        },
-                    },
-                },
-            },
-        };
-        config = new _1.GraphQLProjectConfig(configData, confPath, undefined);
-        endpoint = config.endpointsExtension;
-        t.deepEqual(endpoint && endpoint.getRawEndpointsMap(), {
-            dev: configData.extensions.endpoints.dev,
-        });
-        return [2 /*return*/];
-    });
-}); });
-ava_1.default('getEndpointsMap when endpoint is endpoints map', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var configData, config, endpoint;
-    return __generator(this, function (_a) {
-        configData = {
-            schemaPath: '../schema.json',
-            extensions: {
-                endpoints: {
-                    dev: 'http://dev',
-                    prod: {
-                        url: 'http://prod',
-                        subscription: {
-                            url: 'ws://prod',
-                        },
-                    },
-                },
-            },
-        };
-        config = new _1.GraphQLProjectConfig(configData, confPath, undefined);
-        endpoint = config.endpointsExtension;
-        t.deepEqual(endpoint && endpoint.getRawEndpointsMap(), {
-            dev: {
-                url: 'http://dev',
-            },
-            prod: {
-                url: 'http://prod',
-                subscription: {
-                    url: 'ws://prod',
-                },
-            },
-        });
-        return [2 /*return*/];
-    });
-}); });
-ava_1.default('resolveSchemaFromEndpoint should throw if non-existing endpoint is specified', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var configData, config, error, endpoint;
-    return __generator(this, function (_a) {
-        configData = {
-            schemaPath: '../schema.json',
-            extensions: {
-                endpoints: {
-                    dev: {
-                        url: 'http://dev',
-                        subscription: {
-                            url: 'ws://dev',
-                        },
-                    },
-                },
-            },
-        };
-        config = new _1.GraphQLProjectConfig(configData, confPath, undefined);
-        endpoint = config.endpointsExtension;
-        error = t.throws(function () { return endpoint && endpoint.getEndpoint('prod').resolveSchema(); });
-        t.regex(error.message, /"prod" is not valid endpoint name. Valid endpoint names: dev/);
-        return [2 /*return*/];
-    });
-}); });
-ava_1.default('resolveSchemaFromEndpoint HTTP', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var configData, config, schema, resolvedIntrospection;
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0:
-                configData = {
-                    schemaPath: '../schema.json',
-                    extensions: {
-                        endpoints: {
-                            dev: 'http://127.0.0.1:33333',
-                        },
-                    },
-                };
-                config = new _1.GraphQLProjectConfig(configData, confPath, undefined);
-                if (!config.endpointsExtension) {
-                    throw 'endpointExtension can\'t be empty';
-                }
-                return [4 /*yield*/, config.endpointsExtension
-                        .getEndpoint('dev')
-                        .resolveSchema()];
-            case 1:
-                schema = _a.sent();
-                return [4 /*yield*/, graphql_1.graphql(schema, graphql_1.introspectionQuery)];
-            case 2:
-                resolvedIntrospection = _a.sent();
-                t.snapshot(resolvedIntrospection);
-                return [2 /*return*/];
-        }
-    });
-}); });
diff --git a/node_modules/graphql-config/lib/__tests__/endpoint-extension/string-refs.d.ts b/node_modules/graphql-config/lib/__tests__/endpoint-extension/string-refs.d.ts
deleted file mode 100644
index cb0ff5c..0000000
--- a/node_modules/graphql-config/lib/__tests__/endpoint-extension/string-refs.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/node_modules/graphql-config/lib/__tests__/endpoint-extension/string-refs.js b/node_modules/graphql-config/lib/__tests__/endpoint-extension/string-refs.js
deleted file mode 100644
index 17cbba6..0000000
--- a/node_modules/graphql-config/lib/__tests__/endpoint-extension/string-refs.js
+++ /dev/null
@@ -1,113 +0,0 @@
-"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __generator = (this && this.__generator) || function (thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (_) try {
-            if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [0, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-};
-var _this = this;
-Object.defineProperty(exports, "__esModule", { value: true });
-var ava_1 = require("ava");
-var _1 = require("../../");
-var utils_1 = require("../utils");
-var endpoints;
-ava_1.default.beforeEach(function () {
-    endpoints = _1.getGraphQLProjectConfig(__dirname)
-        .endpointsExtension;
-});
-ava_1.default('getEndpointsMap', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    return __generator(this, function (_a) {
-        t.deepEqual(endpoints.getRawEndpointsMap(), {
-            default: {
-                url: '${env:TEST_ENDPOINT_URL}',
-            },
-        });
-        return [2 /*return*/];
-    });
-}); });
-ava_1.default('getEndpointEnvVars should returns null for undefined env var', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    return __generator(this, function (_a) {
-        t.deepEqual(endpoints.getEnvVarsForEndpoint('default'), {
-            TEST_ENDPOINT_URL: null,
-        });
-        return [2 /*return*/];
-    });
-}); });
-ava_1.default('getEndpointEnvVars should returns value for defined env var', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var testURL;
-    return __generator(this, function (_a) {
-        testURL = 'http://test.com';
-        process.env['TEST_ENDPOINT_URL'] = testURL;
-        t.deepEqual(endpoints.getEnvVarsForEndpoint('default'), {
-            TEST_ENDPOINT_URL: testURL,
-        });
-        delete process.env['TEST_ENDPOINT_URL'];
-        return [2 /*return*/];
-    });
-}); });
-ava_1.default('resolveSchemaFromEndpoint should throw when not all env variables are set', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    return __generator(this, function (_a) {
-        t.throws(function () { return endpoints.getEndpoint('default').resolveSchema(); });
-        return [2 /*return*/];
-    });
-}); });
-ava_1.default('ability to pass external values as env vars to resolveSchemaFromEndpoint', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0: return [4 /*yield*/, utils_1.serveSchema()];
-            case 1:
-                _a.sent();
-                t.notThrows(function () {
-                    return endpoints
-                        .getEndpoint('default', { TEST_ENDPOINT_URL: 'http://127.0.0.1:33333' })
-                        .resolveSchema();
-                });
-                return [2 /*return*/];
-        }
-    });
-}); });
-ava_1.default('getUsedEnvs', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var configData, envs;
-    return __generator(this, function (_a) {
-        configData = {
-            schemaPath: '../schema.json',
-            extensions: {
-                endpoints: {
-                    dev: 'http://127.0.0.1:${env:EXTENSION_TEST_PORT}',
-                },
-            },
-        };
-        envs = _1.getUsedEnvs(configData);
-        t.is(Object.keys(envs)[0], 'EXTENSION_TEST_PORT');
-        return [2 /*return*/];
-    });
-}); });
diff --git a/node_modules/graphql-config/lib/__tests__/introspection-query/getSchema.d.ts b/node_modules/graphql-config/lib/__tests__/introspection-query/getSchema.d.ts
deleted file mode 100644
index cb0ff5c..0000000
--- a/node_modules/graphql-config/lib/__tests__/introspection-query/getSchema.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/node_modules/graphql-config/lib/__tests__/introspection-query/getSchema.js b/node_modules/graphql-config/lib/__tests__/introspection-query/getSchema.js
deleted file mode 100644
index ffaeec1..0000000
--- a/node_modules/graphql-config/lib/__tests__/introspection-query/getSchema.js
+++ /dev/null
@@ -1,10 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ava_1 = require("ava");
-var graphql_1 = require("graphql");
-var _1 = require("../../");
-ava_1.default('reads single schema', function (t) {
-    var config = _1.getGraphQLConfig(__dirname);
-    var typeDefs = "schema {\n  query: RootQueryType\n}\n\ntype Bar {\n  widgets: [Widget]\n}\n\ntype RootQueryType {\n  foo: String\n  bar: Bar\n}\n\ntype Widget {\n  count: Int\n}\n";
-    t.is(graphql_1.printSchema(config.getProjectConfig('testSchemaA').getSchema()), typeDefs);
-});
diff --git a/node_modules/graphql-config/lib/__tests__/utils.d.ts b/node_modules/graphql-config/lib/__tests__/utils.d.ts
deleted file mode 100644
index e4c7b67..0000000
--- a/node_modules/graphql-config/lib/__tests__/utils.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare function serveSchema(port?: number): Promise<any>;
diff --git a/node_modules/graphql-config/lib/__tests__/utils.js b/node_modules/graphql-config/lib/__tests__/utils.js
deleted file mode 100644
index 2d07cf3..0000000
--- a/node_modules/graphql-config/lib/__tests__/utils.js
+++ /dev/null
@@ -1,16 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var schema = require('./schema.json');
-var http_1 = require("http");
-function serveSchema(port) {
-    if (port === void 0) { port = 33333; }
-    var handleRequest = function (request, response) {
-        response.writeHead(200, { 'Content-Type': 'application/json' });
-        response.end(JSON.stringify(schema));
-    };
-    var server = http_1.createServer(handleRequest);
-    return new Promise(function (resolve) {
-        server.listen(port, resolve);
-    });
-}
-exports.serveSchema = serveSchema;
diff --git a/node_modules/graphql-config/lib/__tests__/yaml/test.d.ts b/node_modules/graphql-config/lib/__tests__/yaml/test.d.ts
deleted file mode 100644
index cb0ff5c..0000000
--- a/node_modules/graphql-config/lib/__tests__/yaml/test.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/node_modules/graphql-config/lib/__tests__/yaml/test.js b/node_modules/graphql-config/lib/__tests__/yaml/test.js
deleted file mode 100644
index 7705826..0000000
--- a/node_modules/graphql-config/lib/__tests__/yaml/test.js
+++ /dev/null
@@ -1,54 +0,0 @@
-"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __generator = (this && this.__generator) || function (thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (_) try {
-            if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [0, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-};
-var _this = this;
-Object.defineProperty(exports, "__esModule", { value: true });
-var ava_1 = require("ava");
-var _1 = require("../../");
-ava_1.default(function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var config, resolvedSchema;
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0:
-                config = _1.getGraphQLProjectConfig(__dirname);
-                return [4 /*yield*/, config.resolveIntrospection()];
-            case 1:
-                resolvedSchema = _a.sent();
-                t.snapshot(resolvedSchema);
-                return [2 /*return*/];
-        }
-    });
-}); });
diff --git a/node_modules/graphql-config/lib/errors.d.ts b/node_modules/graphql-config/lib/errors.d.ts
deleted file mode 100644
index 2210784..0000000
--- a/node_modules/graphql-config/lib/errors.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-declare const ConfigNotFoundError_base: ErrorConstructor;
-export declare class ConfigNotFoundError extends ConfigNotFoundError_base {
-    constructor(message: string);
-}
diff --git a/node_modules/graphql-config/lib/errors.js b/node_modules/graphql-config/lib/errors.js
deleted file mode 100644
index ff761ba..0000000
--- a/node_modules/graphql-config/lib/errors.js
+++ /dev/null
@@ -1,31 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-function ExtendableBuiltin(cls) {
-    function ExtendableBuiltin() {
-        cls.apply(this, arguments);
-    }
-    ExtendableBuiltin.prototype = Object.create(cls.prototype);
-    Object.setPrototypeOf(ExtendableBuiltin, cls);
-    return ExtendableBuiltin;
-}
-var ConfigNotFoundError = /** @class */ (function (_super) {
-    __extends(ConfigNotFoundError, _super);
-    function ConfigNotFoundError(message) {
-        var _this = _super.call(this, message) || this;
-        _this.name = _this.constructor.name;
-        _this.message = message;
-        return _this;
-    }
-    return ConfigNotFoundError;
-}(ExtendableBuiltin(Error)));
-exports.ConfigNotFoundError = ConfigNotFoundError;
diff --git a/node_modules/graphql-config/lib/extensions/endpoints/EndpointsExtension.d.ts b/node_modules/graphql-config/lib/extensions/endpoints/EndpointsExtension.d.ts
deleted file mode 100644
index 782fadc..0000000
--- a/node_modules/graphql-config/lib/extensions/endpoints/EndpointsExtension.d.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { GraphQLClient } from 'graphql-request';
-import { GraphQLSchema } from 'graphql';
-import { IntrospectionResult } from '../../types';
-export declare type GraphQLConfigEnpointsSubscription = {
-    url: string;
-    connectionParams?: {
-        [name: string]: string | undefined;
-    };
-};
-export declare type GraphQLConfigEnpointConfig = {
-    url: string;
-    headers?: {
-        [name: string]: string;
-    };
-    subscription?: GraphQLConfigEnpointsSubscription;
-};
-export declare type GraphQLConfigEnpointsMapData = {
-    [env: string]: GraphQLConfigEnpointConfig | string;
-};
-export declare type GraphQLConfigEnpointsMap = {
-    [env: string]: GraphQLConfigEnpointConfig | GraphQLEndpoint;
-};
-export declare type GraphQLConfigEnpointsData = GraphQLConfigEnpointsMapData;
-export declare class GraphQLEndpointsExtension {
-    raw: GraphQLConfigEnpointsMapData;
-    private configPath;
-    constructor(endpointConfig: GraphQLConfigEnpointsMapData, configPath: string);
-    getRawEndpointsMap(): GraphQLConfigEnpointsMap;
-    getEnvVarsForEndpoint(endpointName: string): {
-        [name: string]: string | null;
-    };
-    getEndpoint(endpointName: string, env?: {
-        [name: string]: string | undefined;
-    }): GraphQLEndpoint;
-    private getRawEndpoint(endpointName?);
-}
-export declare class GraphQLEndpoint {
-    url: string;
-    headers: {
-        [name: string]: string;
-    };
-    subscription: GraphQLConfigEnpointsSubscription;
-    constructor(resolvedConfig: GraphQLConfigEnpointConfig);
-    getClient(clientOptions?: any): GraphQLClient;
-    resolveIntrospection(): Promise<IntrospectionResult>;
-    resolveSchema(): Promise<GraphQLSchema>;
-    resolveSchemaSDL(): Promise<string>;
-}
diff --git a/node_modules/graphql-config/lib/extensions/endpoints/EndpointsExtension.js b/node_modules/graphql-config/lib/extensions/endpoints/EndpointsExtension.js
deleted file mode 100644
index f8df2e3..0000000
--- a/node_modules/graphql-config/lib/extensions/endpoints/EndpointsExtension.js
+++ /dev/null
@@ -1,165 +0,0 @@
-"use strict";
-var __assign = (this && this.__assign) || Object.assign || function(t) {
-    for (var s, i = 1, n = arguments.length; i < n; i++) {
-        s = arguments[i];
-        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
-            t[p] = s[p];
-    }
-    return t;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __generator = (this && this.__generator) || function (thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (_) try {
-            if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [0, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var graphql_request_1 = require("graphql-request");
-var graphql_1 = require("graphql");
-var resolveRefString_1 = require("./resolveRefString");
-var GraphQLEndpointsExtension = /** @class */ (function () {
-    function GraphQLEndpointsExtension(endpointConfig, configPath) {
-        this.raw = endpointConfig;
-        this.configPath = configPath;
-    }
-    GraphQLEndpointsExtension.prototype.getRawEndpointsMap = function () {
-        var endpoints = {};
-        for (var name_1 in this.raw) {
-            var rawEndpoint = this.raw[name_1];
-            if (typeof rawEndpoint === 'string') {
-                endpoints[name_1] = { url: rawEndpoint };
-            }
-            else {
-                endpoints[name_1] = rawEndpoint;
-            }
-        }
-        return endpoints;
-    };
-    GraphQLEndpointsExtension.prototype.getEnvVarsForEndpoint = function (endpointName) {
-        return resolveRefString_1.getUsedEnvs(this.getRawEndpoint(endpointName));
-    };
-    GraphQLEndpointsExtension.prototype.getEndpoint = function (endpointName, env) {
-        if (env === void 0) { env = process.env; }
-        var endpoint = this.getRawEndpoint(endpointName);
-        try {
-            var resolved = resolveRefString_1.resolveEnvsInValues(endpoint, env);
-            // graphql-config extensions might have already instantiated a GraphQLEndpoint
-            // or derived class from the GraphQLConfigEndpointConfig data. In that case,
-            // getRawEndpoint will already return a GraphQLEndpoint and it should not be overwritten.
-            if (!(resolved instanceof GraphQLEndpoint)) {
-                return new GraphQLEndpoint(resolved);
-            }
-            return resolved;
-        }
-        catch (e) {
-            e.message = this.configPath + ": " + e.message;
-            throw e;
-        }
-    };
-    GraphQLEndpointsExtension.prototype.getRawEndpoint = function (endpointName) {
-        if (endpointName === void 0) { endpointName = process.env.GRAPHQL_CONFIG_ENDPOINT_NAME; }
-        var rawEndpointsMap = this.getRawEndpointsMap();
-        var endpointNames = Object.keys(rawEndpointsMap);
-        if (endpointName == null) {
-            if (endpointNames.length === 1) {
-                endpointName = endpointNames[0];
-            }
-            else {
-                throw new Error('You have to specify endpoint name or define GRAPHQL_CONFIG_ENDPOINT_NAME environment variable');
-            }
-        }
-        var endpoint = rawEndpointsMap[endpointName];
-        if (!endpoint) {
-            throw new Error(this.configPath + ": \"" + endpointName + "\" is not valid endpoint name. " +
-                ("Valid endpoint names: " + endpointNames.join(', ')));
-        }
-        if (!endpoint.url && !(endpoint instanceof GraphQLEndpoint)) {
-            throw new Error(this
-                .configPath + ": \"url\" is required but is not specified for \"" + endpointName + "\" endpoint");
-        }
-        return endpoint;
-    };
-    return GraphQLEndpointsExtension;
-}());
-exports.GraphQLEndpointsExtension = GraphQLEndpointsExtension;
-var GraphQLEndpoint = /** @class */ (function () {
-    function GraphQLEndpoint(resolvedConfig) {
-        Object.assign(this, resolvedConfig);
-    }
-    GraphQLEndpoint.prototype.getClient = function (clientOptions) {
-        if (clientOptions === void 0) { clientOptions = {}; }
-        return new graphql_request_1.GraphQLClient(this.url, __assign({}, clientOptions, { headers: this.headers }));
-    };
-    GraphQLEndpoint.prototype.resolveIntrospection = function () {
-        return __awaiter(this, void 0, void 0, function () {
-            var client, data;
-            return __generator(this, function (_a) {
-                switch (_a.label) {
-                    case 0:
-                        client = this.getClient();
-                        return [4 /*yield*/, client.request(graphql_1.introspectionQuery)];
-                    case 1:
-                        data = _a.sent();
-                        return [2 /*return*/, { data: data }];
-                }
-            });
-        });
-    };
-    GraphQLEndpoint.prototype.resolveSchema = function () {
-        return __awaiter(this, void 0, void 0, function () {
-            var introspection;
-            return __generator(this, function (_a) {
-                switch (_a.label) {
-                    case 0: return [4 /*yield*/, this.resolveIntrospection()];
-                    case 1:
-                        introspection = _a.sent();
-                        return [2 /*return*/, graphql_1.buildClientSchema(introspection.data)];
-                }
-            });
-        });
-    };
-    GraphQLEndpoint.prototype.resolveSchemaSDL = function () {
-        return __awaiter(this, void 0, void 0, function () {
-            var schema;
-            return __generator(this, function (_a) {
-                switch (_a.label) {
-                    case 0: return [4 /*yield*/, this.resolveSchema()];
-                    case 1:
-                        schema = _a.sent();
-                        return [2 /*return*/, graphql_1.printSchema(schema)];
-                }
-            });
-        });
-    };
-    return GraphQLEndpoint;
-}());
-exports.GraphQLEndpoint = GraphQLEndpoint;
diff --git a/node_modules/graphql-config/lib/extensions/endpoints/index.d.ts b/node_modules/graphql-config/lib/extensions/endpoints/index.d.ts
deleted file mode 100644
index fc9045b..0000000
--- a/node_modules/graphql-config/lib/extensions/endpoints/index.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './EndpointsExtension';
-export * from './resolveRefString';
diff --git a/node_modules/graphql-config/lib/extensions/endpoints/index.js b/node_modules/graphql-config/lib/extensions/endpoints/index.js
deleted file mode 100644
index 6c8c9d8..0000000
--- a/node_modules/graphql-config/lib/extensions/endpoints/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("./EndpointsExtension"));
-__export(require("./resolveRefString"));
diff --git a/node_modules/graphql-config/lib/extensions/endpoints/resolveRefString.d.ts b/node_modules/graphql-config/lib/extensions/endpoints/resolveRefString.d.ts
deleted file mode 100644
index 7c75917..0000000
--- a/node_modules/graphql-config/lib/extensions/endpoints/resolveRefString.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-export declare function resolveRefString(str: string, values?: object): string;
-export declare function resolveEnvsInValues<T extends {
-    [key: string]: any;
-}>(config: T, env: {
-    [name: string]: string | undefined;
-}): T;
-export declare function getUsedEnvs(config: any): {
-    [name: string]: string;
-};
diff --git a/node_modules/graphql-config/lib/extensions/endpoints/resolveRefString.js b/node_modules/graphql-config/lib/extensions/endpoints/resolveRefString.js
deleted file mode 100644
index abdb0b0..0000000
--- a/node_modules/graphql-config/lib/extensions/endpoints/resolveRefString.js
+++ /dev/null
@@ -1,93 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function resolveRefString(str, values) {
-    var _a = parse(str), strings = _a.strings, rawRefs = _a.rawRefs;
-    var refValues = rawRefs.map(function (ref) { return resolveRef(ref, values); });
-    var res = '';
-    for (var i = 0; i < refValues.length; i++) {
-        res += strings[i];
-        res += refValues[i];
-    }
-    res += strings.pop();
-    return res;
-}
-exports.resolveRefString = resolveRefString;
-function resolveEnvsInValues(config, env) {
-    for (var key in config) {
-        var value = config[key];
-        if (typeof value === 'string') {
-            config[key] = resolveRefString(value, { env: env });
-        }
-        else if (typeof value === 'object') {
-            config[key] = resolveEnvsInValues(value, env);
-        }
-    }
-    return config;
-}
-exports.resolveEnvsInValues = resolveEnvsInValues;
-function getUsedEnvs(config) {
-    var result = {};
-    var traverse = function (val) {
-        if (typeof val === 'string') {
-            var rawRefs = parse(val).rawRefs;
-            for (var _i = 0, rawRefs_1 = rawRefs; _i < rawRefs_1.length; _i++) {
-                var ref = rawRefs_1[_i];
-                result[parseRef(ref).ref] = resolveRef(ref, {}, false);
-            }
-        }
-        else if (typeof val === 'object') {
-            for (var key in val) {
-                traverse(val[key]);
-            }
-        }
-    };
-    traverse(config);
-    return result;
-}
-exports.getUsedEnvs = getUsedEnvs;
-function parseRef(rawRef) {
-    var _a = rawRef.split(/\s*:\s*/), type = _a[0], ref = _a[1];
-    return { type: type, ref: ref };
-}
-function resolveRef(rawRef, values, throwIfUndef) {
-    if (values === void 0) { values = {}; }
-    if (throwIfUndef === void 0) { throwIfUndef = true; }
-    var _a = parseRef(rawRef), type = _a.type, ref = _a.ref;
-    if (type === 'env') {
-        if (!ref) {
-            throw new Error("Reference value is not present for " + type + ": " + rawRef);
-        }
-        var refValue = (values.env && values.env[ref]) || process.env[ref];
-        if (!refValue) {
-            if (throwIfUndef) {
-                throw new Error("Environment variable " + ref + " is not set");
-            }
-            else {
-                return null;
-            }
-        }
-        return refValue;
-    }
-    else {
-        // support only 'env' for now
-        throw new Error('Undefined reference type ${refType}. Only "env" is supported');
-    }
-}
-function parse(str) {
-    var regex = /\${([^}]*)}/g;
-    var strings = [];
-    var rawRefs = [];
-    var prevIdx = 0;
-    var match;
-    // tslint:disable-next-line:no-conditional-assignment
-    while ((match = regex.exec(str)) !== null) {
-        if (match.index > 0 && str[match.index - 1] === '\\') {
-            continue;
-        }
-        strings.push(str.substring(prevIdx, match.index));
-        rawRefs.push(match[1]);
-        prevIdx = match.index + match[0].length;
-    }
-    strings.push(str.substring(prevIdx));
-    return { strings: strings, rawRefs: rawRefs };
-}
diff --git a/node_modules/graphql-config/lib/extensions/index.d.ts b/node_modules/graphql-config/lib/extensions/index.d.ts
deleted file mode 100644
index 2a5d186..0000000
--- a/node_modules/graphql-config/lib/extensions/index.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './endpoints/';
diff --git a/node_modules/graphql-config/lib/extensions/index.js b/node_modules/graphql-config/lib/extensions/index.js
deleted file mode 100644
index 4a853fe..0000000
--- a/node_modules/graphql-config/lib/extensions/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("./endpoints/"));
diff --git a/node_modules/graphql-config/lib/findGraphQLConfigFile.d.ts b/node_modules/graphql-config/lib/findGraphQLConfigFile.d.ts
deleted file mode 100644
index 0e871ee..0000000
--- a/node_modules/graphql-config/lib/findGraphQLConfigFile.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export declare const GRAPHQL_CONFIG_NAME = ".graphqlconfig";
-export declare const GRAPHQL_CONFIG_YAML_NAME = ".graphqlconfig.yaml";
-export declare const GRAPHQL_CONFIG_YML_NAME = ".graphqlconfig.yml";
-export declare function findGraphQLConfigFile(filePath: string): string;
diff --git a/node_modules/graphql-config/lib/findGraphQLConfigFile.js b/node_modules/graphql-config/lib/findGraphQLConfigFile.js
deleted file mode 100644
index 835f993..0000000
--- a/node_modules/graphql-config/lib/findGraphQLConfigFile.js
+++ /dev/null
@@ -1,61 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var path_1 = require("path");
-var fs_1 = require("fs");
-var errors_1 = require("./errors");
-exports.GRAPHQL_CONFIG_NAME = '.graphqlconfig';
-exports.GRAPHQL_CONFIG_YAML_NAME = '.graphqlconfig.yaml';
-exports.GRAPHQL_CONFIG_YML_NAME = '.graphqlconfig.yml';
-function isRootDir(path) {
-    return path_1.dirname(path) === path;
-}
-function findGraphQLConfigFile(filePath) {
-    filePath = path_1.resolve(filePath);
-    if (filePath.endsWith(exports.GRAPHQL_CONFIG_NAME) ||
-        filePath.endsWith(exports.GRAPHQL_CONFIG_YAML_NAME) ||
-        filePath.endsWith(exports.GRAPHQL_CONFIG_YML_NAME)) {
-        return filePath;
-    }
-    var currentDir = filePath;
-    while (!isRootDir(currentDir)) {
-        var configPath = path_1.join(currentDir, exports.GRAPHQL_CONFIG_NAME);
-        if (fs_1.existsSync(configPath)) {
-            return configPath;
-        }
-        if (fs_1.existsSync(configPath + '.yaml')) {
-            return configPath + '.yaml';
-        }
-        if (fs_1.existsSync(configPath + '.yml')) {
-            return configPath + '.yml';
-        }
-        currentDir = path_1.dirname(currentDir);
-    }
-    // Try to find GraphQL config in first level of sub-directories.
-    var subDirectories = fs_1.readdirSync(filePath).map(function (dir) { return path_1.join(filePath, dir); }).filter(function (dir) {
-        return (fs_1.lstatSync(dir).isDirectory());
-    });
-    var subDirectoriesWithGraphQLConfig = subDirectories.map(function (subDirectory) {
-        var subDirectoryFiles = fs_1.readdirSync(subDirectory)
-            .filter(function (file) {
-            return !(fs_1.lstatSync(path_1.join(subDirectory, file)).isDirectory());
-        })
-            .map(function (file) {
-            return path_1.basename(path_1.join(subDirectory, file));
-        });
-        if (subDirectoryFiles.includes(exports.GRAPHQL_CONFIG_NAME)) {
-            return subDirectory + "/" + exports.GRAPHQL_CONFIG_NAME;
-        }
-        if (subDirectoryFiles.includes(exports.GRAPHQL_CONFIG_NAME + ".yml")) {
-            return subDirectory + "/" + exports.GRAPHQL_CONFIG_NAME + ".yml";
-        }
-        if (subDirectoryFiles.includes(exports.GRAPHQL_CONFIG_NAME + ".yaml")) {
-            return subDirectory + "/" + exports.GRAPHQL_CONFIG_NAME + ".yaml";
-        }
-    }).filter(function (subDirectory) { return Boolean(subDirectory); });
-    if (subDirectoriesWithGraphQLConfig.length > 0) {
-        return subDirectoriesWithGraphQLConfig[0];
-    }
-    throw new errors_1.ConfigNotFoundError("\"" + exports.GRAPHQL_CONFIG_NAME + "\" file is not available in the provided config " +
-        ("directory: " + filePath + "\nPlease check the config directory."));
-}
-exports.findGraphQLConfigFile = findGraphQLConfigFile;
diff --git a/node_modules/graphql-config/lib/getGraphQLConfig.d.ts b/node_modules/graphql-config/lib/getGraphQLConfig.d.ts
deleted file mode 100644
index 167ce97..0000000
--- a/node_modules/graphql-config/lib/getGraphQLConfig.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { GraphQLConfig } from './GraphQLConfig';
-import { GraphQLProjectConfig } from './GraphQLProjectConfig';
-export declare function getGraphQLConfig(rootDir?: string): GraphQLConfig;
-export declare function getGraphQLProjectConfig(rootDir?: string, projectName?: string | undefined): GraphQLProjectConfig;
diff --git a/node_modules/graphql-config/lib/getGraphQLConfig.js b/node_modules/graphql-config/lib/getGraphQLConfig.js
deleted file mode 100644
index 22ff6b7..0000000
--- a/node_modules/graphql-config/lib/getGraphQLConfig.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var utils_1 = require("./utils");
-var findGraphQLConfigFile_1 = require("./findGraphQLConfigFile");
-var GraphQLConfig_1 = require("./GraphQLConfig");
-function getGraphQLConfig(rootDir) {
-    if (rootDir === void 0) { rootDir = process.cwd(); }
-    var configPath = findGraphQLConfigFile_1.findGraphQLConfigFile(rootDir);
-    var config = utils_1.readConfig(configPath);
-    utils_1.validateConfig(config);
-    return new GraphQLConfig_1.GraphQLConfig(config, configPath);
-}
-exports.getGraphQLConfig = getGraphQLConfig;
-function getGraphQLProjectConfig(rootDir, projectName) {
-    if (projectName === void 0) { projectName = process.env.GRAPHQL_CONFIG_PROJECT; }
-    return getGraphQLConfig(rootDir).getProjectConfig(projectName);
-}
-exports.getGraphQLProjectConfig = getGraphQLProjectConfig;
diff --git a/node_modules/graphql-config/lib/index.d.ts b/node_modules/graphql-config/lib/index.d.ts
deleted file mode 100644
index 1e7cc15..0000000
--- a/node_modules/graphql-config/lib/index.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export { getGraphQLConfig, getGraphQLProjectConfig } from './getGraphQLConfig';
-export { GRAPHQL_CONFIG_NAME, GRAPHQL_CONFIG_YAML_NAME, findGraphQLConfigFile } from './findGraphQLConfigFile';
-export { writeSchema, validateConfig, getSchemaExtensions } from './utils';
-export * from './errors';
-export * from './extensions/';
-export { GraphQLConfig } from './GraphQLConfig';
-export { GraphQLProjectConfig } from './GraphQLProjectConfig';
-export * from './types';
diff --git a/node_modules/graphql-config/lib/index.js b/node_modules/graphql-config/lib/index.js
deleted file mode 100644
index 3cf5fea..0000000
--- a/node_modules/graphql-config/lib/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-var getGraphQLConfig_1 = require("./getGraphQLConfig");
-exports.getGraphQLConfig = getGraphQLConfig_1.getGraphQLConfig;
-exports.getGraphQLProjectConfig = getGraphQLConfig_1.getGraphQLProjectConfig;
-var findGraphQLConfigFile_1 = require("./findGraphQLConfigFile");
-exports.GRAPHQL_CONFIG_NAME = findGraphQLConfigFile_1.GRAPHQL_CONFIG_NAME;
-exports.GRAPHQL_CONFIG_YAML_NAME = findGraphQLConfigFile_1.GRAPHQL_CONFIG_YAML_NAME;
-exports.findGraphQLConfigFile = findGraphQLConfigFile_1.findGraphQLConfigFile;
-var utils_1 = require("./utils");
-exports.writeSchema = utils_1.writeSchema;
-exports.validateConfig = utils_1.validateConfig;
-exports.getSchemaExtensions = utils_1.getSchemaExtensions;
-__export(require("./errors"));
-__export(require("./extensions/"));
-var GraphQLConfig_1 = require("./GraphQLConfig");
-exports.GraphQLConfig = GraphQLConfig_1.GraphQLConfig;
-var GraphQLProjectConfig_1 = require("./GraphQLProjectConfig");
-exports.GraphQLProjectConfig = GraphQLProjectConfig_1.GraphQLProjectConfig;
diff --git a/node_modules/graphql-config/lib/types.d.ts b/node_modules/graphql-config/lib/types.d.ts
deleted file mode 100644
index 62475cd..0000000
--- a/node_modules/graphql-config/lib/types.d.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { IntrospectionQuery } from 'graphql';
-import { GraphQLConfigEnpointsData } from './extensions/';
-export declare type IntrospectionResult = {
-    data: IntrospectionQuery;
-    extensions?: Object;
-    errors?: any;
-};
-export declare type GraphQLConfigExtensions = {
-    endpoints?: GraphQLConfigEnpointsData;
-    [name: string]: any;
-};
-export declare type GraphQLResolvedConfigData = {
-    schemaPath: string;
-    includes?: Array<string>;
-    excludes?: Array<string>;
-    extensions?: GraphQLConfigExtensions;
-};
-export declare type GraphQLConfigData = GraphQLResolvedConfigData & {
-    projects?: {
-        [projectName: string]: GraphQLResolvedConfigData;
-    };
-};
diff --git a/node_modules/graphql-config/lib/types.js b/node_modules/graphql-config/lib/types.js
deleted file mode 100644
index c8ad2e5..0000000
--- a/node_modules/graphql-config/lib/types.js
+++ /dev/null
@@ -1,2 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/graphql-config/lib/utils.d.ts b/node_modules/graphql-config/lib/utils.d.ts
deleted file mode 100644
index 220bd56..0000000
--- a/node_modules/graphql-config/lib/utils.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { GraphQLSchema, IntrospectionQuery } from 'graphql';
-import { GraphQLConfigData, IntrospectionResult } from './types';
-export declare function readConfig(configPath: string): GraphQLConfigData;
-export declare function writeConfig(configPath: string, config: GraphQLConfigData): void;
-export declare function normalizeGlob(glob: string): string;
-export declare function matchesGlobs(filePath: string, configDir: string, globs?: string[]): boolean;
-export declare function validateConfig(config: GraphQLConfigData): void;
-export declare function mergeConfigs(dest: GraphQLConfigData, src: GraphQLConfigData): GraphQLConfigData;
-export declare function schemaToIntrospection(schema: GraphQLSchema): Promise<IntrospectionResult>;
-export declare function introspectionToSchema(introspection: IntrospectionResult | (IntrospectionQuery & {
-    errors: undefined;
-    data: undefined;
-})): GraphQLSchema;
-export declare function readSchema(path: any): GraphQLSchema;
-export declare function writeSchema(path: string, schema: GraphQLSchema, schemaExtensions?: {
-    [name: string]: string;
-}): Promise<void>;
-export declare function getSchemaExtensions(path: string): {
-    [name: string]: string;
-};
diff --git a/node_modules/graphql-config/lib/utils.js b/node_modules/graphql-config/lib/utils.js
deleted file mode 100644
index 1bb4941..0000000
--- a/node_modules/graphql-config/lib/utils.js
+++ /dev/null
@@ -1,227 +0,0 @@
-"use strict";
-var __assign = (this && this.__assign) || Object.assign || function(t) {
-    for (var s, i = 1, n = arguments.length; i < n; i++) {
-        s = arguments[i];
-        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
-            t[p] = s[p];
-    }
-    return t;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __generator = (this && this.__generator) || function (thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (_) try {
-            if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [0, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var fs_1 = require("fs");
-var path_1 = require("path");
-var graphql_import_1 = require("graphql-import");
-var minimatch = require("minimatch");
-var yaml = require("js-yaml");
-var graphql_1 = require("graphql");
-function readConfig(configPath) {
-    var config;
-    try {
-        var rawConfig = fs_1.readFileSync(configPath, 'utf-8');
-        if (configPath.endsWith('.yaml') || configPath.endsWith('.yml')) {
-            config = yaml.safeLoad(rawConfig);
-        }
-        else {
-            config = JSON.parse(rawConfig);
-        }
-    }
-    catch (error) {
-        error.message = "Parsing " + configPath + " file has failed.\n" + error.message;
-        throw error;
-    }
-    return config;
-}
-exports.readConfig = readConfig;
-function writeConfig(configPath, config) {
-    var configContents;
-    if (configPath.endsWith('.yaml') || configPath.endsWith('.yml')) {
-        configContents = yaml.safeDump(config);
-    }
-    else {
-        configContents = JSON.stringify(config);
-    }
-    fs_1.writeFileSync(configPath, configContents, 'utf-8');
-}
-exports.writeConfig = writeConfig;
-function normalizeGlob(glob) {
-    if (glob.startsWith('./')) {
-        return glob.substr(2);
-    }
-    return glob;
-}
-exports.normalizeGlob = normalizeGlob;
-function matchesGlobs(filePath, configDir, globs) {
-    return (globs || []).some(function (glob) {
-        try {
-            var globStat = fs_1.lstatSync(path_1.join(configDir, glob));
-            var newGlob = glob.length === 0 ? '.' : glob;
-            var globToMatch = globStat.isDirectory() ? glob + "/**" : glob;
-            return minimatch(filePath, globToMatch, { matchBase: true });
-        }
-        catch (error) {
-            // Out of errors that lstat provides, EACCES and ENOENT are the
-            // most likely. For both cases, run the match with the raw glob
-            // and return the result.
-            return minimatch(filePath, glob, { matchBase: true });
-        }
-    });
-}
-exports.matchesGlobs = matchesGlobs;
-function validateConfig(config) {
-    // FIXME: implement
-}
-exports.validateConfig = validateConfig;
-function mergeConfigs(dest, src) {
-    var result = __assign({}, dest, src);
-    if (dest.extensions && src.extensions) {
-        result.extensions = __assign({}, dest.extensions, src.extensions);
-    }
-    if (dest.projects && src.projects) {
-        result.projects = __assign({}, dest.projects, src.projects);
-    }
-    return result;
-}
-exports.mergeConfigs = mergeConfigs;
-function schemaToIntrospection(schema) {
-    return graphql_1.graphql(schema, graphql_1.introspectionQuery);
-}
-exports.schemaToIntrospection = schemaToIntrospection;
-// Predicate for errors/data can be removed after typescript 2.7.
-// See: https://github.com/Microsoft/TypeScript/pull/19513
-function introspectionToSchema(introspection) {
-    if (introspection.errors != null) {
-        throw new Error('Introspection result contains errors');
-    }
-    return graphql_1.buildClientSchema(introspection.data ? introspection.data : introspection);
-}
-exports.introspectionToSchema = introspectionToSchema;
-function readSchema(path) {
-    // FIXME: prefix error
-    switch (path_1.extname(path)) {
-        case '.graphql':
-            return valueToSchema(graphql_import_1.importSchema(path));
-        case '.json':
-            var data = fs_1.readFileSync(path, { encoding: 'utf-8' });
-            var introspection = JSON.parse(data);
-            return valueToSchema(introspection);
-        default:
-            throw new Error('Unsupported schema file extention. Only ".graphql" and ".json" are supported');
-    }
-}
-exports.readSchema = readSchema;
-function valueToSchema(schema) {
-    if (schema instanceof graphql_1.GraphQLSchema) {
-        return schema;
-    }
-    else if (typeof schema === 'string') {
-        return graphql_1.buildSchema(schema);
-    }
-    else if (schema instanceof graphql_1.Source) {
-        return graphql_1.buildSchema(schema);
-    }
-    else if (typeof schema === 'object' && !Array.isArray(schema)) {
-        return introspectionToSchema(schema);
-    }
-    throw new Error('Can not convert data to a schema');
-}
-function writeSchema(path, schema, schemaExtensions) {
-    return __awaiter(this, void 0, void 0, function () {
-        var data, _a, name_1, introspection, _b;
-        return __generator(this, function (_c) {
-            switch (_c.label) {
-                case 0:
-                    schema = valueToSchema(schema);
-                    _a = path_1.extname(path);
-                    switch (_a) {
-                        case '.graphql': return [3 /*break*/, 1];
-                        case '.json': return [3 /*break*/, 2];
-                    }
-                    return [3 /*break*/, 4];
-                case 1:
-                    data = '';
-                    if (schemaExtensions) {
-                        for (name_1 in schemaExtensions) {
-                            data += "# " + name_1 + ": " + schemaExtensions[name_1] + "\n";
-                        }
-                        data += '\n';
-                    }
-                    data += graphql_1.printSchema(schema);
-                    return [3 /*break*/, 5];
-                case 2: return [4 /*yield*/, schemaToIntrospection(schema)];
-                case 3:
-                    introspection = _c.sent();
-                    introspection.extensions = (_b = {},
-                        _b['graphql-config'] = schemaExtensions,
-                        _b);
-                    data = JSON.stringify(introspection, null, 2);
-                    return [3 /*break*/, 5];
-                case 4: throw new Error('Unsupported schema file extention. Only ".graphql" and ".json" are supported');
-                case 5:
-                    fs_1.writeFileSync(path, data, 'utf-8');
-                    return [2 /*return*/];
-            }
-        });
-    });
-}
-exports.writeSchema = writeSchema;
-function getSchemaExtensions(path) {
-    var data = fs_1.readFileSync(path, 'utf-8');
-    switch (path_1.extname(path)) {
-        case '.graphql':
-            var extensions = {};
-            for (var _i = 0, _a = data.split('\n'); _i < _a.length; _i++) {
-                var line = _a[_i];
-                var result = /# ([^:]+): (.+)$/.exec(line);
-                if (result == null) {
-                    break;
-                }
-                var _ = result[0], key = result[1], value = result[2];
-                extensions[key] = value;
-            }
-            return extensions;
-        case '.json':
-            var introspection = JSON.parse(data);
-            if (!introspection.extentions) {
-                return {};
-            }
-            return introspection.extensions['graphql-config'] || {};
-        default:
-            throw new Error('Unsupported schema file extention. Only ".graphql" and ".json" are supported');
-    }
-}
-exports.getSchemaExtensions = getSchemaExtensions;
diff --git a/node_modules/graphql-config/node_modules/.bin/js-yaml b/node_modules/graphql-config/node_modules/.bin/js-yaml
deleted file mode 120000
index daf9f11..0000000
--- a/node_modules/graphql-config/node_modules/.bin/js-yaml
+++ /dev/null
@@ -1 +0,0 @@
-../../../js-yaml/bin/js-yaml.js
\ No newline at end of file
diff --git a/node_modules/graphql-config/package.json b/node_modules/graphql-config/package.json
deleted file mode 100644
index cc8eb58..0000000
--- a/node_modules/graphql-config/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "name": "graphql-config",
-  "version": "2.2.1",
-  "description": "The easiest way to configure your development environment with your GraphQL schema (supported by most tools, editors & IDEs)",
-  "engines": {
-    "node": ">= 6.0.0"
-  },
-  "main": "lib/index.js",
-  "types": "lib/index.d.ts",
-  "files": [
-    "LICENSE",
-    "README.md",
-    "lib/"
-  ],
-  "scripts": {
-    "prepublish": "npm run build",
-    "clean": "rimraf lib",
-    "build": "npm run clean && tsc",
-    "copy-test-assets": "cpx \"src/**/{.graphqlconfig*,*.graphql,*.json}\" lib",
-    "test-only": "npm run build && npm run copy-test-assets && ava --verbose lib/__tests__/**/*.js --serial",
-    "test": "tslint src/**/*.ts && npm run test-only"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/graphcool/graphql-config.git"
-  },
-  "keywords": [
-    "graphql",
-    "config",
-    "relay",
-    "apollo"
-  ],
-  "author": "Johannes Schickling <johannes@graph.cool>",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/graphcool/graphql-config/issues"
-  },
-  "homepage": "https://github.com/graphcool/graphql-config#readme",
-  "devDependencies": {
-    "@types/graphql": "0.13.3",
-    "@types/node": "9.4.6",
-    "@types/node-fetch": "1.6.7",
-    "ava": "0.25.0",
-    "cpx": "1.5.0",
-    "graphql": "14.0.2",
-    "rimraf": "2.6.2",
-    "tslint": "5.9.1",
-    "tslint-config-standard": "7.0.0",
-    "typescript": "2.7.2"
-  },
-  "dependencies": {
-    "graphql-import": "^0.7.1",
-    "graphql-request": "^1.5.0",
-    "js-yaml": "^3.10.0",
-    "lodash": "^4.17.4",
-    "minimatch": "^3.0.4"
-  },
-  "peerDependencies": {
-    "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0"
-  }
-}
diff --git a/node_modules/graphql-import/LICENSE b/node_modules/graphql-import/LICENSE
deleted file mode 100644
index 3e74b15..0000000
--- a/node_modules/graphql-import/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2017 Graphcool
-
-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/node_modules/graphql-import/README.md b/node_modules/graphql-import/README.md
deleted file mode 100644
index fef849e..0000000
--- a/node_modules/graphql-import/README.md
+++ /dev/null
@@ -1,98 +0,0 @@
-# graphql-import
-
-[![CircleCI](https://circleci.com/gh/prisma/graphql-import.svg?style=shield)](https://circleci.com/gh/prisma/graphql-import) [![npm version](https://badge.fury.io/js/graphql-import.svg)](https://badge.fury.io/js/graphql-import)
-
-Import &amp; export definitions in GraphQL SDL (also refered to as GraphQL modules)
-
-> There is also a [`graphql-import-loader`](https://github.com/prisma/graphql-import-loader) for Webpack available.
-
-## Install
-
-```sh
-yarn add graphql-import
-```
-
-## Usage
-
-```ts
-import { importSchema } from 'graphql-import'
-import { makeExecutableSchema } from 'graphql-tools'
-
-const typeDefs = importSchema('schema.graphql')
-const resolvers = {}
-
-const schema = makeExecutableSchema({ typeDefs, resolvers })
-```
-
-Assume the following directory structure:
-
-```
-.
-├── schema.graphql
-├── posts.graphql
-└── comments.graphql
-```
-
-`schema.graphql`
-
-```graphql
-# import Post from "posts.graphql"
-
-type Query {
-  posts: [Post]
-}
-```
-
-`posts.graphql`
-
-```graphql
-# import Comment from 'comments.graphql'
-
-type Post {
-  comments: [Comment]
-  id: ID!
-  text: String!
-  tags: [String]
-}
-```
-
-`comments.graphql`
-
-```graphql
-type Comment {
-  id: ID!
-  text: String!
-}
-```
-
-Running `console.log(importSchema('schema.graphql'))` produces the following output:
-
-```graphql
-type Query {
-  posts: [Post]
-}
-
-type Post {
-  comments: [Comment]
-  id: ID!
-  text: String!
-  tags: [String]
-}
-
-type Comment {
-  id: ID!
-  text: String!
-}
-```
-
-## [Full documentation](https://oss.prisma.io/content/graphql-import/overview)
-
-## Related topics & next steps
-
-- Static import step as build time
-- Namespaces
-- Support importing from HTTP endpoints (or [Links](https://github.com/apollographql/apollo-link))
-- Create RFC to add import syntax to GraphQL spec
-
-<p align="center"><a href="https://oss.prisma.io"><img src="https://imgur.com/IMU2ERq.png" alt="Prisma" height="170px"></a></p>
-
diff --git a/node_modules/graphql-import/dist/definition.d.ts b/node_modules/graphql-import/dist/definition.d.ts
deleted file mode 100644
index bc6d342..0000000
--- a/node_modules/graphql-import/dist/definition.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { TypeDefinitionNode, DirectiveDefinitionNode } from 'graphql';
-export declare type ValidDefinitionNode = DirectiveDefinitionNode | TypeDefinitionNode;
-export interface DefinitionMap {
-    [key: string]: ValidDefinitionNode;
-}
-/**
- * Post processing of all imported type definitions. Loops over each of the
- * imported type definitions, and processes it using collectNewTypeDefinitions.
- *
- * @param allDefinitions All definitions from all schemas
- * @param definitionPool Current definitions (from first schema)
- * @param newTypeDefinitions All imported definitions
- * @returns Final collection of type definitions for the resulting schema
- */
-export declare function completeDefinitionPool(allDefinitions: ValidDefinitionNode[], definitionPool: ValidDefinitionNode[], newTypeDefinitions: ValidDefinitionNode[]): ValidDefinitionNode[];
diff --git a/node_modules/graphql-import/dist/definition.js b/node_modules/graphql-import/dist/definition.js
deleted file mode 100644
index 19129c0..0000000
--- a/node_modules/graphql-import/dist/definition.js
+++ /dev/null
@@ -1,134 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var lodash_1 = require("lodash");
-var builtinTypes = ['String', 'Float', 'Int', 'Boolean', 'ID'];
-var builtinDirectives = ['deprecated', 'skip', 'include'];
-/**
- * Post processing of all imported type definitions. Loops over each of the
- * imported type definitions, and processes it using collectNewTypeDefinitions.
- *
- * @param allDefinitions All definitions from all schemas
- * @param definitionPool Current definitions (from first schema)
- * @param newTypeDefinitions All imported definitions
- * @returns Final collection of type definitions for the resulting schema
- */
-function completeDefinitionPool(allDefinitions, definitionPool, newTypeDefinitions) {
-    var visitedDefinitions = {};
-    while (newTypeDefinitions.length > 0) {
-        var schemaMap = lodash_1.keyBy(allDefinitions, function (d) { return d.name.value; });
-        var newDefinition = newTypeDefinitions.shift();
-        if (visitedDefinitions[newDefinition.name.value]) {
-            continue;
-        }
-        var collectedTypedDefinitions = collectNewTypeDefinitions(allDefinitions, definitionPool, newDefinition, schemaMap);
-        newTypeDefinitions.push.apply(newTypeDefinitions, collectedTypedDefinitions);
-        definitionPool.push.apply(definitionPool, collectedTypedDefinitions);
-        visitedDefinitions[newDefinition.name.value] = true;
-    }
-    return lodash_1.uniqBy(definitionPool, 'name.value');
-}
-exports.completeDefinitionPool = completeDefinitionPool;
-/**
- * Processes a single type definition, and performs a number of checks:
- * - Add missing interface implementations
- * - Add missing referenced types
- * - Remove unused type definitions
- *
- * @param allDefinitions All definitions from all schemas
- * (only used to find missing interface implementations)
- * @param definitionPool Resulting definitions
- * @param newDefinition All imported definitions
- * @param schemaMap Map of all definitions for easy lookup
- * @returns All relevant type definitions to add to the final schema
- */
-function collectNewTypeDefinitions(allDefinitions, definitionPool, newDefinition, schemaMap) {
-    var newTypeDefinitions = [];
-    if (newDefinition.kind !== 'DirectiveDefinition') {
-        newDefinition.directives.forEach(collectDirective);
-    }
-    if (newDefinition.kind === 'InputObjectTypeDefinition') {
-        newDefinition.fields.forEach(collectNode);
-    }
-    if (newDefinition.kind === 'InterfaceTypeDefinition') {
-        var interfaceName_1 = newDefinition.name.value;
-        newDefinition.fields.forEach(collectNode);
-        var interfaceImplementations = allDefinitions.filter(function (d) {
-            return d.kind === 'ObjectTypeDefinition' &&
-                d.interfaces.some(function (i) { return i.name.value === interfaceName_1; });
-        });
-        newTypeDefinitions.push.apply(newTypeDefinitions, interfaceImplementations);
-    }
-    if (newDefinition.kind === 'UnionTypeDefinition') {
-        newDefinition.types.forEach(function (type) {
-            if (!definitionPool.some(function (d) { return d.name.value === type.name.value; })) {
-                var typeName = type.name.value;
-                var typeMatch = schemaMap[typeName];
-                if (!typeMatch) {
-                    throw new Error("Couldn't find type " + typeName + " in any of the schemas.");
-                }
-                newTypeDefinitions.push(schemaMap[type.name.value]);
-            }
-        });
-    }
-    if (newDefinition.kind === 'ObjectTypeDefinition') {
-        // collect missing interfaces
-        newDefinition.interfaces.forEach(function (int) {
-            if (!definitionPool.some(function (d) { return d.name.value === int.name.value; })) {
-                var interfaceName = int.name.value;
-                var interfaceMatch = schemaMap[interfaceName];
-                if (!interfaceMatch) {
-                    throw new Error("Couldn't find interface " + interfaceName + " in any of the schemas.");
-                }
-                newTypeDefinitions.push(schemaMap[int.name.value]);
-            }
-        });
-        // iterate over all fields
-        newDefinition.fields.forEach(function (field) {
-            collectNode(field);
-            // collect missing argument input types
-            field.arguments.forEach(collectNode);
-        });
-    }
-    return newTypeDefinitions;
-    function collectNode(node) {
-        var nodeType = getNamedType(node.type);
-        var nodeTypeName = nodeType.name.value;
-        // collect missing argument input types
-        if (!definitionPool.some(function (d) { return d.name.value === nodeTypeName; }) &&
-            !lodash_1.includes(builtinTypes, nodeTypeName)) {
-            var argTypeMatch = schemaMap[nodeTypeName];
-            if (!argTypeMatch) {
-                throw new Error("Field " + node.name.value + ": Couldn't find type " + nodeTypeName + " in any of the schemas.");
-            }
-            newTypeDefinitions.push(argTypeMatch);
-        }
-        node.directives.forEach(collectDirective);
-    }
-    function collectDirective(directive) {
-        var directiveName = directive.name.value;
-        if (!definitionPool.some(function (d) { return d.name.value === directiveName; }) &&
-            !lodash_1.includes(builtinDirectives, directiveName)) {
-            var directive_1 = schemaMap[directiveName];
-            if (!directive_1) {
-                throw new Error("Directive " + directiveName + ": Couldn't find type " + directiveName + " in any of the schemas.");
-            }
-            directive_1.arguments.forEach(collectNode);
-            newTypeDefinitions.push(directive_1);
-        }
-    }
-}
-/**
- * Nested visitor for a type node to get to the final NamedType
- *
- * @param {TypeNode} type Type node to get NamedTypeNode for
- * @returns {NamedTypeNode} The found NamedTypeNode
- */
-function getNamedType(type) {
-    if (type.kind === 'NamedType') {
-        return type;
-    }
-    else {
-        return getNamedType(type.type);
-    }
-}
-//# sourceMappingURL=definition.js.map
\ No newline at end of file
diff --git a/node_modules/graphql-import/dist/definition.js.map b/node_modules/graphql-import/dist/definition.js.map
deleted file mode 100644
index 950de03..0000000
--- a/node_modules/graphql-import/dist/definition.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"definition.js","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/graphql-import/dist/index.d.ts b/node_modules/graphql-import/dist/index.d.ts
deleted file mode 100644
index debc9e6..0000000
--- a/node_modules/graphql-import/dist/index.d.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Describes the information from a single import line
- *
- */
-export interface RawModule {
-    imports: string[];
-    from: string;
-}
-/**
- * Parse a single import line and extract imported types and schema filename
- *
- * @param importLine Import line
- * @returns Processed import line
- */
-export declare function parseImportLine(importLine: string): RawModule;
-/**
- * Parse a schema and analyze all import lines
- *
- * @param sdl Schema to parse
- * @returns Array with collection of imports per import line (file)
- */
-export declare function parseSDL(sdl: string): RawModule[];
-/**
- * Main entry point. Recursively process all import statement in a schema
- *
- * @param filePath File path to the initial schema file
- * @returns Single bundled schema with all imported types
- */
-export declare function importSchema(schema: string, schemas?: {
-    [key: string]: string;
-}): string;
diff --git a/node_modules/graphql-import/dist/index.js b/node_modules/graphql-import/dist/index.js
deleted file mode 100644
index df0d6ac..0000000
--- a/node_modules/graphql-import/dist/index.js
+++ /dev/null
@@ -1,258 +0,0 @@
-"use strict";
-var __assign = (this && this.__assign) || function () {
-    __assign = Object.assign || function(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
-                t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var fs = require("fs");
-var graphql_1 = require("graphql");
-var lodash_1 = require("lodash");
-var path = require("path");
-var resolveFrom = require("resolve-from");
-var definition_1 = require("./definition");
-var rootFields = ['Query', 'Mutation', 'Subscription'];
-var read = function (schema, schemas) {
-    if (isFile(schema)) {
-        return fs.readFileSync(schema, { encoding: 'utf8' });
-    }
-    return schemas ? schemas[schema] : schema;
-};
-var isFile = function (f) { return f.endsWith('.graphql'); };
-/**
- * Parse a single import line and extract imported types and schema filename
- *
- * @param importLine Import line
- * @returns Processed import line
- */
-function parseImportLine(importLine) {
-    // Apply regex to import line
-    var matches = importLine.match(/^import (\*|(.*)) from ('|")(.*)('|");?$/);
-    if (!matches || matches.length !== 6 || !matches[4]) {
-        throw new Error("Too few regex matches: " + matches);
-    }
-    // Extract matches into named variables
-    var wildcard = matches[1], importsString = matches[2], from = matches[4];
-    // Extract imported types
-    var imports = wildcard === '*' ? ['*'] : importsString.split(',').map(function (d) { return d.trim(); });
-    // Return information about the import line
-    return { imports: imports, from: from };
-}
-exports.parseImportLine = parseImportLine;
-/**
- * Parse a schema and analyze all import lines
- *
- * @param sdl Schema to parse
- * @returns Array with collection of imports per import line (file)
- */
-function parseSDL(sdl) {
-    return sdl
-        .split('\n')
-        .map(function (l) { return l.trim(); })
-        .filter(function (l) { return l.startsWith('# import ') || l.startsWith('#import '); })
-        .map(function (l) { return l.replace('#', '').trim(); })
-        .map(parseImportLine);
-}
-exports.parseSDL = parseSDL;
-/**
- * Main entry point. Recursively process all import statement in a schema
- *
- * @param filePath File path to the initial schema file
- * @returns Single bundled schema with all imported types
- */
-function importSchema(schema, schemas) {
-    var sdl = read(schema, schemas) || schema;
-    var document = getDocumentFromSDL(sdl);
-    // Recursively process the imports, starting by importing all types from the initial schema
-    var _a = collectDefinitions(['*'], sdl, schema, schemas), allDefinitions = _a.allDefinitions, typeDefinitions = _a.typeDefinitions;
-    // Post processing of the final schema (missing types, unused types, etc.)
-    // Query, Mutation and Subscription should be merged
-    // And should always be in the first set, to make sure they
-    // are not filtered out.
-    var firstTypes = lodash_1.flatten(typeDefinitions).filter(function (d) {
-        return lodash_1.includes(rootFields, d.name.value);
-    });
-    var otherFirstTypes = typeDefinitions[0].filter(function (d) { return !lodash_1.includes(rootFields, d.name.value); });
-    var firstSet = firstTypes.concat(otherFirstTypes);
-    var processedTypeNames = [];
-    var mergedFirstTypes = [];
-    var _loop_1 = function (type) {
-        if (!lodash_1.includes(processedTypeNames, type.name.value)) {
-            processedTypeNames.push(type.name.value);
-            mergedFirstTypes.push(type);
-        }
-        else {
-            var existingType = mergedFirstTypes.find(function (t) { return t.name.value === type.name.value; });
-            existingType.fields = existingType.fields.concat(type.fields);
-        }
-    };
-    for (var _i = 0, firstSet_1 = firstSet; _i < firstSet_1.length; _i++) {
-        var type = firstSet_1[_i];
-        _loop_1(type);
-    }
-    document = __assign({}, document, { definitions: definition_1.completeDefinitionPool(lodash_1.flatten(allDefinitions), firstSet, lodash_1.flatten(typeDefinitions)) });
-    // Return the schema as string
-    return graphql_1.print(document);
-}
-exports.importSchema = importSchema;
-/**
- * Parses a schema into a graphql DocumentNode.
- * If the schema is empty a DocumentNode with empty definitions will be created.
- *
- * @param sdl Schema to parse
- * @returns A graphql DocumentNode with definitions of the parsed sdl.
- */
-function getDocumentFromSDL(sdl) {
-    if (isEmptySDL(sdl)) {
-        return {
-            kind: graphql_1.Kind.DOCUMENT,
-            definitions: [],
-        };
-    }
-    else {
-        return graphql_1.parse(sdl, { noLocation: true });
-    }
-}
-/**
- * Check if a schema contains any type definitions at all.
- *
- * @param sdl Schema to parse
- * @returns True if SDL only contains comments and/or whitespaces
- */
-function isEmptySDL(sdl) {
-    return (sdl
-        .split('\n')
-        .map(function (l) { return l.trim(); })
-        .filter(function (l) { return !(l.length === 0 || l.startsWith('#')); }).length === 0);
-}
-/**
- * Resolve the path of an import.
- * First it will try to find a file relative from the file the import is in, if that fails it will try to resolve it as a module so imports from packages work correctly.
- *
- * @param filePath Path the import was made from
- * @param importFrom Path given for the import
- * @returns Full resolved path to a file
- */
-function resolveModuleFilePath(filePath, importFrom) {
-    var dirname = path.dirname(filePath);
-    if (isFile(filePath) && isFile(importFrom)) {
-        try {
-            return fs.realpathSync(path.join(dirname, importFrom));
-        }
-        catch (e) {
-            if (e.code === 'ENOENT') {
-                return resolveFrom(dirname, importFrom);
-            }
-        }
-    }
-    return importFrom;
-}
-/**
- * Recursively process all schema files. Keeps track of both the filtered
- * type definitions, and all type definitions, because they might be needed
- * in post-processing (to add missing types)
- *
- * @param imports Types specified in the import statement
- * @param sdl Current schema
- * @param filePath File location for current schema
- * @param Tracking of processed schemas (for circular dependencies)
- * @param Tracking of imported type definitions per schema
- * @param Tracking of all type definitions per schema
- * @returns Both the collection of all type definitions, and the collection of imported type definitions
- */
-function collectDefinitions(imports, sdl, filePath, schemas, processedFiles, typeDefinitions, allDefinitions) {
-    if (processedFiles === void 0) { processedFiles = new Map(); }
-    if (typeDefinitions === void 0) { typeDefinitions = []; }
-    if (allDefinitions === void 0) { allDefinitions = []; }
-    var key = isFile(filePath) ? path.resolve(filePath) : filePath;
-    // Get TypeDefinitionNodes from current schema
-    var document = getDocumentFromSDL(sdl);
-    // Add all definitions to running total
-    allDefinitions.push(filterTypeDefinitions(document.definitions));
-    // Filter TypeDefinitionNodes by type and defined imports
-    var currentTypeDefinitions = filterImportedDefinitions(imports, document.definitions, allDefinitions);
-    // Add typedefinitions to running total
-    typeDefinitions.push(currentTypeDefinitions);
-    // Read imports from current file
-    var rawModules = parseSDL(sdl);
-    // Process each file (recursively)
-    rawModules.forEach(function (m) {
-        // If it was not yet processed (in case of circular dependencies)
-        var moduleFilePath = resolveModuleFilePath(filePath, m.from);
-        var processedFile = processedFiles.get(key);
-        if (!processedFile || !processedFile.find(function (rModule) { return lodash_1.isEqual(rModule, m); })) {
-            // Mark this specific import line as processed for this file (for cicular dependency cases)
-            processedFiles.set(key, processedFile ? processedFile.concat(m) : [m]);
-            collectDefinitions(m.imports, read(moduleFilePath, schemas), moduleFilePath, schemas, processedFiles, typeDefinitions, allDefinitions);
-        }
-    });
-    // Return the maps of type definitions from each file
-    return { allDefinitions: allDefinitions, typeDefinitions: typeDefinitions };
-}
-/**
- * Filter the types loaded from a schema, first by relevant types,
- * then by the types specified in the import statement.
- *
- * @param imports Types specified in the import statement
- * @param typeDefinitions All definitions from a schema
- * @returns Filtered collection of type definitions
- */
-function filterImportedDefinitions(imports, typeDefinitions, allDefinitions) {
-    // This should do something smart with fields
-    if (allDefinitions === void 0) { allDefinitions = []; }
-    var filteredDefinitions = filterTypeDefinitions(typeDefinitions);
-    if (lodash_1.includes(imports, '*')) {
-        if (imports.length === 1 &&
-            imports[0] === '*' &&
-            allDefinitions.length > 1) {
-            var previousTypeDefinitions_1 = lodash_1.keyBy(lodash_1.flatten(allDefinitions.slice(0, allDefinitions.length - 1)).filter(function (def) { return !lodash_1.includes(rootFields, def.name.value); }), function (def) { return def.name.value; });
-            return typeDefinitions.filter(function (typeDef) {
-                return typeDef.kind === 'ObjectTypeDefinition' &&
-                    previousTypeDefinitions_1[typeDef.name.value];
-            });
-        }
-        return filteredDefinitions;
-    }
-    else {
-        var result = filteredDefinitions.filter(function (d) {
-            return lodash_1.includes(imports.map(function (i) { return i.split('.')[0]; }), d.name.value);
-        });
-        var fieldImports = imports.filter(function (i) { return i.split('.').length > 1; });
-        var groupedFieldImports = lodash_1.groupBy(fieldImports, function (x) { return x.split('.')[0]; });
-        var _loop_2 = function (rootType) {
-            var fields = groupedFieldImports[rootType].map(function (x) { return x.split('.')[1]; });
-            filteredDefinitions.find(function (def) { return def.name.value === rootType; }).fields = filteredDefinitions.find(function (def) { return def.name.value === rootType; }).fields.filter(function (f) { return lodash_1.includes(fields, f.name.value) || lodash_1.includes(fields, '*'); });
-        };
-        for (var rootType in groupedFieldImports) {
-            _loop_2(rootType);
-        }
-        return result;
-    }
-}
-/**
- * Filter relevant definitions from schema
- *
- * @param definitions All definitions from a schema
- * @returns Relevant type definitions
- */
-function filterTypeDefinitions(definitions) {
-    var validKinds = [
-        'DirectiveDefinition',
-        'ScalarTypeDefinition',
-        'ObjectTypeDefinition',
-        'InterfaceTypeDefinition',
-        'EnumTypeDefinition',
-        'UnionTypeDefinition',
-        'InputObjectTypeDefinition',
-    ];
-    return definitions
-        .filter(function (d) { return lodash_1.includes(validKinds, d.kind); })
-        .map(function (d) { return d; });
-}
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/graphql-import/dist/index.js.map b/node_modules/graphql-import/dist/index.js.map
deleted file mode 100644
index 02e8680..0000000
--- a/node_modules/graphql-import/dist/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/graphql-import/dist/index.test.d.ts b/node_modules/graphql-import/dist/index.test.d.ts
deleted file mode 100644
index cb0ff5c..0000000
--- a/node_modules/graphql-import/dist/index.test.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/node_modules/graphql-import/dist/index.test.js b/node_modules/graphql-import/dist/index.test.js
deleted file mode 100644
index e7bdf6d..0000000
--- a/node_modules/graphql-import/dist/index.test.js
+++ /dev/null
@@ -1,239 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ava_1 = require("ava");
-var fs = require("fs");
-var _1 = require(".");
-ava_1.default('parseImportLine: parse single import', function (t) {
-    t.deepEqual(_1.parseImportLine("import A from \"schema.graphql\""), {
-        imports: ['A'],
-        from: 'schema.graphql',
-    });
-});
-ava_1.default('parseImportLine: optional semicolon', function (t) {
-    t.deepEqual(_1.parseImportLine("import A from \"schema.graphql\";"), {
-        imports: ['A'],
-        from: 'schema.graphql',
-    });
-});
-ava_1.default('parseImportLine: invalid', function (t) {
-    t.throws(function () { return _1.parseImportLine("import from \"schema.graphql\""); }, Error);
-});
-ava_1.default('parseImportLine: invalid 2', function (t) {
-    t.throws(function () { return _1.parseImportLine("import A from \"\""); }, Error);
-});
-ava_1.default('parseImportLine: parse multi import', function (t) {
-    t.deepEqual(_1.parseImportLine("import A, B from \"schema.graphql\""), {
-        imports: ['A', 'B'],
-        from: 'schema.graphql',
-    });
-});
-ava_1.default('parseImportLine: parse multi import (weird spacing)', function (t) {
-    t.deepEqual(_1.parseImportLine("import  A  ,B   from \"schema.graphql\""), {
-        imports: ['A', 'B'],
-        from: 'schema.graphql',
-    });
-});
-ava_1.default('parseImportLine: different path', function (t) {
-    t.deepEqual(_1.parseImportLine("import A from \"../new/schema.graphql\""), {
-        imports: ['A'],
-        from: '../new/schema.graphql',
-    });
-});
-ava_1.default('parseImportLine: module in node_modules', function (t) {
-    t.deepEqual(_1.parseImportLine("import A from \"module-name\""), {
-        imports: ['A'],
-        from: 'module-name',
-    });
-});
-ava_1.default('parseSDL: non-import comment', function (t) {
-    t.deepEqual(_1.parseSDL("#importent: comment"), []);
-});
-ava_1.default('parse: multi line import', function (t) {
-    var sdl = "# import A from \"a.graphql\"\n# import * from \"b.graphql\"\n  ";
-    t.deepEqual(_1.parseSDL(sdl), [
-        {
-            imports: ['A'],
-            from: 'a.graphql',
-        },
-        {
-            imports: ['*'],
-            from: 'b.graphql',
-        },
-    ]);
-});
-ava_1.default('Module in node_modules', function (t) {
-    var b = "# import lower from './lower.graphql'\ntype B {\n  id: ID!\n  nickname: String! @lower\n}\n";
-    var lower = "directive @lower on FIELD_DEFINITION\n";
-    var expectedSDL = "type A {\n  id: ID!\n  author: B!\n}\n\ntype B {\n  id: ID!\n  nickname: String! @lower\n}\n\ndirective @lower on FIELD_DEFINITION\n";
-    var moduleDir = 'node_modules/graphql-import-test';
-    if (!fs.existsSync(moduleDir)) {
-        fs.mkdirSync(moduleDir);
-    }
-    fs.writeFileSync(moduleDir + '/b.graphql', b);
-    fs.writeFileSync(moduleDir + '/lower.graphql', lower);
-    t.is(_1.importSchema('fixtures/import-module/a.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: imports only', function (t) {
-    var expectedSDL = "type Query {\n  first: String\n  second: Float\n  third: String\n}\n";
-    t.is(_1.importSchema('fixtures/imports-only/all.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: import duplicate', function (t) {
-    var expectedSDL = "type Query {\n  first: String\n  second: Float\n  third: String\n}\n";
-    t.is(_1.importSchema('fixtures/import-duplicate/all.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: import nested', function (t) {
-    var expectedSDL = "type Query {\n  first: String\n  second: Float\n  third: String\n}\n";
-    t.is(_1.importSchema('fixtures/import-nested/all.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: field types', function (t) {
-    var expectedSDL = "type A {\n  first: String\n  second: Float\n  b: B\n}\n\ntype B {\n  c: C\n  hello: String!\n}\n\ntype C {\n  id: ID!\n}\n";
-    t.is(_1.importSchema('fixtures/field-types/a.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: enums', function (t) {
-    var expectedSDL = "type A {\n  first: String\n  second: Float\n  b: B\n}\n\nenum B {\n  B1\n  B2\n  B3\n}\n";
-    t.is(_1.importSchema('fixtures/enums/a.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: import all', function (t) {
-    var expectedSDL = "type A {\n  first: String\n  second: Float\n  b: B\n}\n\ntype B {\n  hello: String!\n  c1: C1\n  c2: C2\n}\n\ntype C1 {\n  id: ID!\n}\n\ntype C2 {\n  id: ID!\n}\n";
-    t.is(_1.importSchema('fixtures/import-all/a.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: import all from objects', function (t) {
-    var schemaC = "\n    type C1 {\n      id: ID!\n    }\n\n    type C2 {\n      id: ID!\n    }\n\n    type C3 {\n      id: ID!\n    }";
-    var schemaB = "\n    # import * from 'schemaC'\n\n    type B {\n      hello: String!\n      c1: C1\n      c2: C2\n    }";
-    var schemaA = "\n    # import B from 'schemaB'\n\n    type A {\n      # test 1\n      first: String\n      second: Float\n      b: B\n    }";
-    var schemas = {
-        schemaA: schemaA,
-        schemaB: schemaB,
-        schemaC: schemaC,
-    };
-    var expectedSDL = "type A {\n  first: String\n  second: Float\n  b: B\n}\n\ntype B {\n  hello: String!\n  c1: C1\n  c2: C2\n}\n\ntype C1 {\n  id: ID!\n}\n\ntype C2 {\n  id: ID!\n}\n";
-    t.is(_1.importSchema(schemaA, schemas), expectedSDL);
-});
-ava_1.default("importSchema: single object schema", function (t) {
-    var schemaA = "\n    type A {\n      field: String\n    }";
-    var expectedSDL = "type A {\n  field: String\n}\n";
-    t.is(_1.importSchema(schemaA), expectedSDL);
-});
-ava_1.default("importSchema: import all mix 'n match", function (t) {
-    var schemaB = "\n    # import C1, C2 from 'fixtures/import-all/c.graphql'\n\n    type B {\n      hello: String!\n      c1: C1\n      c2: C2\n    }";
-    var schemaA = "\n    # import * from \"schemaB\"\n\n    type A {\n      # test 1\n      first: String\n      second: Float\n      b: B\n    }";
-    var schemas = {
-        schemaB: schemaB,
-    };
-    var expectedSDL = "type A {\n  first: String\n  second: Float\n  b: B\n}\n\ntype B {\n  hello: String!\n  c1: C1\n  c2: C2\n}\n\ntype C1 {\n  id: ID!\n}\n\ntype C2 {\n  id: ID!\n}\n";
-    t.is(_1.importSchema(schemaA, schemas), expectedSDL);
-});
-ava_1.default("importSchema: import all mix 'n match 2", function (t) {
-    var schemaA = "\n    # import * from \"fixtures/import-all/b.graphql\"\n\n    type A {\n      # test 1\n      first: String\n      second: Float\n      b: B\n    }";
-    var expectedSDL = "type A {\n  first: String\n  second: Float\n  b: B\n}\n\ntype B {\n  hello: String!\n  c1: C1\n  c2: C2\n}\n\ntype C1 {\n  id: ID!\n}\n\ntype C2 {\n  id: ID!\n}\n";
-    t.is(_1.importSchema(schemaA), expectedSDL);
-});
-ava_1.default("importSchema: import all - exclude Query/Mutation/Subscription type", function (t) {
-    var schemaC = "\n    type C1 {\n      id: ID!\n    }\n\n    type C2 {\n      id: ID!\n    }\n\n    type C3 {\n      id: ID!\n    }\n\n    type Query {\n      hello: String!\n    }\n\n    type Mutation {\n      hello: String!\n    }\n\n    type Subscription {\n      hello: String!\n    }\n    ";
-    var schemaB = "\n    # import * from 'schemaC'\n\n    type B {\n      hello: String!\n      c1: C1\n      c2: C2\n    }";
-    var schemaA = "\n    # import B from 'schemaB'\n\n    type Query {\n      greet: String!\n    }\n\n    type A {\n      # test 1\n      first: String\n      second: Float\n      b: B\n    }";
-    var schemas = {
-        schemaA: schemaA,
-        schemaB: schemaB,
-        schemaC: schemaC,
-    };
-    var expectedSDL = "type Query {\n  greet: String!\n}\n\ntype A {\n  first: String\n  second: Float\n  b: B\n}\n\ntype B {\n  hello: String!\n  c1: C1\n  c2: C2\n}\n\ntype C1 {\n  id: ID!\n}\n\ntype C2 {\n  id: ID!\n}\n";
-    t.is(_1.importSchema(schemaA, schemas), expectedSDL);
-});
-ava_1.default('importSchema: scalar', function (t) {
-    var expectedSDL = "type A {\n  b: B\n}\n\nscalar B\n";
-    t.is(_1.importSchema('fixtures/scalar/a.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: directive', function (t) {
-    var expectedSDL = "type A {\n  first: String @upper\n  second: String @withB @deprecated\n}\n\ndirective @upper on FIELD_DEFINITION\n\nscalar B\n\ndirective @withB(argB: B) on FIELD_DEFINITION\n";
-    t.is(_1.importSchema('fixtures/directive/a.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: interfaces', function (t) {
-    var expectedSDL = "type A implements B {\n  first: String\n  second: Float\n}\n\ninterface B {\n  second: Float\n  c: [C!]!\n}\n\ntype C {\n  c: ID!\n}\n";
-    t.is(_1.importSchema('fixtures/interfaces/a.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: interfaces-many', function (t) {
-    var expectedSDL = "type A implements B {\n  first: String\n  second: Float\n}\n\ninterface B {\n  second: Float\n  c: [C!]!\n}\n\ntype C implements D1 & D2 {\n  c: ID!\n}\n\ninterface D1 {\n  d1: ID!\n}\n\ninterface D2 {\n  d2: ID!\n}\n";
-    t.is(_1.importSchema('fixtures/interfaces-many/a.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: interfaces-implements', function (t) {
-    var expectedSDL = "type A implements B {\n  id: ID!\n}\n\ninterface B {\n  id: ID!\n}\n\ntype B1 implements B {\n  id: ID!\n}\n";
-    t.is(_1.importSchema('fixtures/interfaces-implements/a.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: interfaces-implements-many', function (t) {
-    var expectedSDL = "type A implements B {\n  id: ID!\n}\n\ninterface B {\n  id: ID!\n}\n\ntype B1 implements B {\n  id: ID!\n}\n\ntype B2 implements B {\n  id: ID!\n}\n";
-    t.is(_1.importSchema('fixtures/interfaces-implements-many/a.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: input types', function (t) {
-    var expectedSDL = "type A {\n  first(b: B): String\n  second: Float\n}\n\ninput B {\n  hello: [C!]!\n}\n\ninput C {\n  id: ID!\n}\n";
-    t.is(_1.importSchema('fixtures/input-types/a.graphql'), expectedSDL);
-});
-ava_1.default('importSchema: complex test', function (t) {
-    t.notThrows(function () {
-        _1.importSchema('fixtures/complex/a.graphql');
-    });
-});
-ava_1.default('circular imports', function (t) {
-    var expectedSDL = "type A {\n  first: String\n  second: Float\n  b: B\n}\n\ntype B {\n  hello: String!\n  c1: C1\n  c2: C2\n  a: A\n}\n\ntype C1 {\n  id: ID!\n}\n\ntype C2 {\n  id: ID!\n}\n";
-    var actualSDL = _1.importSchema('fixtures/circular/a.graphql');
-    t.is(actualSDL, expectedSDL);
-});
-ava_1.default('related types', function (t) {
-    var expectedSDL = "type A {\n  first: String\n  second: Float\n  b: B\n}\n\ntype B {\n  hello: String!\n  c1: C\n}\n\ntype C {\n  field: String\n}\n";
-    var actualSDL = _1.importSchema('fixtures/related-types/a.graphql');
-    t.is(actualSDL, expectedSDL);
-});
-ava_1.default('relative paths', function (t) {
-    var expectedSDL = "type Query {\n  feed: [Post!]!\n}\n\ntype Mutation {\n  createDraft(title: String!, text: String): Post\n  publish(id: ID!): Post\n}\n\ntype Post implements Node {\n  id: ID!\n  isPublished: Boolean!\n  title: String!\n  text: String!\n}\n\ninterface Node {\n  id: ID!\n}\n";
-    var actualSDL = _1.importSchema('fixtures/relative-paths/src/schema.graphql');
-    t.is(actualSDL, expectedSDL);
-});
-ava_1.default('root field imports', function (t) {
-    var expectedSDL = "type Query {\n  posts(filter: PostFilter): [Post]\n}\n\ntype Dummy {\n  field: String\n}\n\ntype Post {\n  field1: String\n}\n\ninput PostFilter {\n  field3: Int\n}\n";
-    var actualSDL = _1.importSchema('fixtures/root-fields/a.graphql');
-    t.is(actualSDL, expectedSDL);
-});
-ava_1.default('merged root field imports', function (t) {
-    var expectedSDL = "type Query {\n  helloA: String\n  posts(filter: PostFilter): [Post]\n  hello: String\n}\n\ntype Dummy {\n  field: String\n}\n\ntype Post {\n  field1: String\n}\n\ninput PostFilter {\n  field3: Int\n}\n";
-    var actualSDL = _1.importSchema('fixtures/merged-root-fields/a.graphql');
-    t.is(actualSDL, expectedSDL);
-});
-ava_1.default('global schema modules', function (t) {
-    var shared = "\n    type Shared {\n      first: String\n    }\n  ";
-    var expectedSDL = "type A {\n  first: String\n  second: Shared\n}\n\ntype Shared {\n  first: String\n}\n";
-    t.is(_1.importSchema('fixtures/global/a.graphql', { shared: shared }), expectedSDL);
-});
-ava_1.default('missing type on type', function (t) {
-    var err = t.throws(function () { return _1.importSchema('fixtures/type-not-found/a.graphql'); }, Error);
-    t.is(err.message, "Field test: Couldn't find type Post in any of the schemas.");
-});
-ava_1.default('missing type on interface', function (t) {
-    var err = t.throws(function () { return _1.importSchema('fixtures/type-not-found/b.graphql'); }, Error);
-    t.is(err.message, "Field test: Couldn't find type Post in any of the schemas.");
-});
-ava_1.default('missing type on input type', function (t) {
-    var err = t.throws(function () { return _1.importSchema('fixtures/type-not-found/c.graphql'); }, Error);
-    t.is(err.message, "Field post: Couldn't find type Post in any of the schemas.");
-});
-ava_1.default('missing interface type', function (t) {
-    var err = t.throws(function () { return _1.importSchema('fixtures/type-not-found/d.graphql'); }, Error);
-    t.is(err.message, "Couldn't find interface MyInterface in any of the schemas.");
-});
-ava_1.default('missing union type', function (t) {
-    var err = t.throws(function () { return _1.importSchema('fixtures/type-not-found/e.graphql'); }, Error);
-    t.is(err.message, "Couldn't find type C in any of the schemas.");
-});
-ava_1.default('missing type on input type', function (t) {
-    var err = t.throws(function () { return _1.importSchema('fixtures/type-not-found/f.graphql'); }, Error);
-    t.is(err.message, "Field myfield: Couldn't find type Post in any of the schemas.");
-});
-ava_1.default('missing type on directive', function (t) {
-    var err = t.throws(function () { return _1.importSchema('fixtures/type-not-found/g.graphql'); }, Error);
-    t.is(err.message, "Directive first: Couldn't find type first in any of the schemas.");
-});
-ava_1.default('import with collision', function (t) {
-    // Local type gets preference over imported type
-    var expectedSDL = "type User {\n  id: ID!\n  name: String!\n}\n";
-    t.is(_1.importSchema('fixtures/collision/a.graphql'), expectedSDL);
-});
-//# sourceMappingURL=index.test.js.map
\ No newline at end of file
diff --git a/node_modules/graphql-import/dist/index.test.js.map b/node_modules/graphql-import/dist/index.test.js.map
deleted file mode 100644
index 274f98e..0000000
--- a/node_modules/graphql-import/dist/index.test.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/graphql-import/package.json b/node_modules/graphql-import/package.json
deleted file mode 100644
index 50d44a2..0000000
--- a/node_modules/graphql-import/package.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
-  "name": "graphql-import",
-  "version": "0.7.1",
-  "engines": {
-    "node": ">=4.0.0"
-  },
-  "license": "MIT",
-  "repository": "git@github.com:graphcool/graphql-import.git",
-  "files": [
-    "dist"
-  ],
-  "main": "dist/index.js",
-  "typings": "dist/index.d.ts",
-  "typescript": {
-    "definition": "dist/index.d.ts"
-  },
-  "nyc": {
-    "extension": [
-      ".ts"
-    ],
-    "require": [
-      "ts-node/register"
-    ],
-    "include": [
-      "src/**/*.ts"
-    ],
-    "exclude": [
-      "**/*.d.ts",
-      "**/*.test.ts"
-    ],
-    "all": true,
-    "sourceMap": true,
-    "instrument": true
-  },
-  "scripts": {
-    "prepare": "npm run build",
-    "build": "rm -rf dist && tsc -d",
-    "testlocal": "npm run build && nyc --reporter lcov --reporter text ava-ts -u --verbose src/**/*.test.ts",
-    "test-only": "npm run build && mkdir -p ~/reports && nyc --reporter lcov ava-ts --verbose src/**/*.test.ts --tap | tap-xunit > ~/reports/ava.xml",
-    "test": "tslint src/**/*.ts && npm run test-only",
-    "docs": "typedoc --out docs src/index.ts --hideGenerator --exclude **/*.test.ts",
-    "docs:publish": "cp ./now.json ./docs && cd docs && now --public -f && now alias && now rm --yes --safe graphql-import & cd .."
-  },
-  "peerDependencies": {
-    "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0"
-  },
-  "devDependencies": {
-    "@types/graphql": "14.0.0",
-    "@types/lodash": "4.14.116",
-    "@types/resolve-from": "0.0.18",
-    "@types/node": "9.6.31",
-    "ava": "0.25.0",
-    "ava-ts": "0.25.1",
-    "graphql": "14.0.2",
-    "nyc": "11.8.0",
-    "tap-xunit": "2.3.0",
-    "ts-node": "7.0.1",
-    "tslint": "5.11.0",
-    "tslint-config-standard": "7.0.0",
-    "typedoc": "0.11.1",
-    "typescript": "3.0.1"
-  },
-  "dependencies": {
-    "lodash": "^4.17.4",
-    "resolve-from": "^4.0.0"
-  }
-}
diff --git a/node_modules/graphql-request/LICENSE b/node_modules/graphql-request/LICENSE
deleted file mode 100644
index 3e74b15..0000000
--- a/node_modules/graphql-request/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2017 Graphcool
-
-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/node_modules/graphql-request/README.md b/node_modules/graphql-request/README.md
deleted file mode 100644
index eb2893a..0000000
--- a/node_modules/graphql-request/README.md
+++ /dev/null
@@ -1,223 +0,0 @@
-# graphql-request
-
-[![CircleCI](https://circleci.com/gh/prismagraphql/graphql-request.svg?style=shield)](https://circleci.com/gh/prismagraphql/graphql-request) [![npm version](https://badge.fury.io/js/graphql-request.svg)](https://badge.fury.io/js/graphql-request)
-
-📡 Minimal GraphQL client supporting Node and browsers for scripts or simple apps
-
-## Features
-
-* Most **simple and lightweight** GraphQL client
-* Promise-based API (works with `async` / `await`)
-* Typescript support (Flow coming soon)
-
-
-## Install
-
-```sh
-npm install graphql-request
-```
-
-## Quickstart
-
-Send a GraphQL query with a single line of code. ▶️ [Try it out](https://runkit.com/593130bdfad7120012472003/593130bdfad7120012472004).
-
-```js
-import { request } from 'graphql-request'
-
-const query = `{
-  Movie(title: "Inception") {
-    releaseDate
-    actors {
-      name
-    }
-  }
-}`
-
-request('https://api.graph.cool/simple/v1/movies', query).then(data => console.log(data))
-```
-
-## Usage
-
-```js
-import { request, GraphQLClient } from 'graphql-request'
-
-// Run GraphQL queries/mutations using a static function
-request(endpoint, query, variables).then(data => console.log(data))
-
-// ... or create a GraphQL client instance to send requests
-const client = new GraphQLClient(endpoint, { headers: {} })
-client.request(query, variables).then(data => console.log(data))
-```
-
-## Examples
-
-### Authentication via HTTP header
-
-```js
-import { GraphQLClient } from 'graphql-request'
-
-const client = new GraphQLClient('my-endpoint', {
-  headers: {
-    Authorization: 'Bearer my-jwt-token',
-  },
-})
-
-const query = `{
-  Movie(title: "Inception") {
-    releaseDate
-    actors {
-      name
-    }
-  }
-}`
-
-client.request(query).then(data => console.log(data))
-```
-
-### Passing more options to fetch
-
-```js
-import { GraphQLClient } from 'graphql-request'
-
-const client = new GraphQLClient('my-endpoint', {
- credentials: 'include',
- mode: 'cors'
-})
-
-const query = `{
-  Movie(title: "Inception") {
-    releaseDate
-    actors {
-      name
-    }
-  }
-}`
-
-client.request(query).then(data => console.log(data))
-```
-
-### Using variables
-
-```js
-import { request } from 'graphql-request'
-
-const query = `query getMovie($title: String!) {
-  Movie(title: $title) {
-    releaseDate
-    actors {
-      name
-    }
-  }
-}`
-
-const variables = {
-  title: 'Inception',
-}
-
-request('my-endpoint', query, variables).then(data => console.log(data))
-```
-
-### Error handling
-
-```js
-import { request } from 'graphql-request'
-
-const wrongQuery = `{
-  some random stuff
-}`
-
-request('my-endpoint', query)
-  .then(data => console.log(data))
-  .catch(err => {
-    console.log(err.response.errors) // GraphQL response errors
-    console.log(err.response.data) // Response data if available
-  })
-```
-
-### Using `require` instead of `import`
-
-```js
-const { request } = require('graphql-request')
-
-const query = `{
-  Movie(title: "Inception") {
-    releaseDate
-    actors {
-      name
-    }
-  }
-}`
-
-request('my-endpoint', query).then(data => console.log(data))
-```
-
-### Cookie support for `node`
-
-```sh
-npm install fetch-cookie/node-fetch
-```
-
-```js
-import { GraphQLClient } from 'graphql-request'
-
-// use this instead for cookie support
-global['fetch'] = require('fetch-cookie/node-fetch')(require('node-fetch'))
-
-const client = new GraphQLClient('my-endpoint')
-
-const query = `{
-  Movie(title: "Inception") {
-    releaseDate
-    actors {
-      name
-    }
-  }
-}`
-
-client.request(query).then(data => console.log(data))
-```
-
-### Receiving a raw response
-
-The `request` method will return the `data` or `errors` key from the response.
-If you need to access the `extensions` key you can use the `rawRequest` method:
-
-```js
-import { rawRequest } from 'graphql-request'
-
-const query = `{
-  Movie(title: "Inception") {
-    releaseDate
-    actors {
-      name
-    }
-  }
-}`
-
-rawRequest('my-endpoint', query).then(({data, extensions}) => console.log(data, extensions))
-```
-
-### More examples coming soon...
-
-* Fragments
-* Using [`graphql-tag`](https://github.com/apollographql/graphql-tag)
-* Typed Typescript return values
-
-## FAQ
-
-### What's the difference between `graphql-request`, Apollo and Relay?
-
-`graphql-request` is the most minimal and simplest to use GraphQL client. It's perfect for small scripts or simple apps.
-
-Compared to GraphQL clients like Apollo or Relay, `graphql-request` doesn't have a built-in cache and has no integrations for frontend frameworks. The goal is to keep the package and API as minimal as possible.
-
-### So what about Lokka?
-
-Lokka is great but it still requires [a lot of setup code](https://github.com/kadirahq/lokka-transport-http) to be able to send a simple GraphQL query. `graphql-request` does less work compared to Lokka but is a lot simpler to use.
-
-
-## Help & Community [![Slack Status](https://slack.prisma.io/badge.svg)](https://slack.prisma.io)
-
-Join our [Slack community](http://slack.prisma.io/) if you run into issues or have questions. We love talking to you!
-
-<p align="center"><a href="https://oss.prisma.io"><img src="https://imgur.com/IMU2ERq.png" alt="Prisma" height="170px"></a></p>
diff --git a/node_modules/graphql-request/dist/src/index.d.ts b/node_modules/graphql-request/dist/src/index.d.ts
deleted file mode 100644
index 7a892b5..0000000
--- a/node_modules/graphql-request/dist/src/index.d.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { GraphQLError, Headers as HttpHeaders, Options, Variables } from './types';
-export { ClientError } from './types';
-import 'cross-fetch/polyfill';
-export declare class GraphQLClient {
-    private url;
-    private options;
-    constructor(url: string, options?: Options);
-    rawRequest<T extends any>(query: string, variables?: Variables): Promise<{
-        data?: T;
-        extensions?: any;
-        headers: Headers;
-        status: number;
-        errors?: GraphQLError[];
-    }>;
-    request<T extends any>(query: string, variables?: Variables): Promise<T>;
-    setHeaders(headers: HttpHeaders): GraphQLClient;
-    setHeader(key: string, value: string): GraphQLClient;
-}
-export declare function rawRequest<T extends any>(url: string, query: string, variables?: Variables): Promise<{
-    data?: T;
-    extensions?: any;
-    headers: Headers;
-    status: number;
-    errors?: GraphQLError[];
-}>;
-export declare function request<T extends any>(url: string, query: string, variables?: Variables): Promise<T>;
-export default request;
diff --git a/node_modules/graphql-request/dist/src/index.js b/node_modules/graphql-request/dist/src/index.js
deleted file mode 100644
index 2925cf2..0000000
--- a/node_modules/graphql-request/dist/src/index.js
+++ /dev/null
@@ -1,177 +0,0 @@
-"use strict";
-var __assign = (this && this.__assign) || Object.assign || function(t) {
-    for (var s, i = 1, n = arguments.length; i < n; i++) {
-        s = arguments[i];
-        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
-            t[p] = s[p];
-    }
-    return t;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __generator = (this && this.__generator) || function (thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (_) try {
-            if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [0, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-};
-var __rest = (this && this.__rest) || function (s, e) {
-    var t = {};
-    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
-        t[p] = s[p];
-    if (s != null && typeof Object.getOwnPropertySymbols === "function")
-        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
-            t[p[i]] = s[p[i]];
-    return t;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var types_1 = require("./types");
-var types_2 = require("./types");
-exports.ClientError = types_2.ClientError;
-require("cross-fetch/polyfill");
-var GraphQLClient = /** @class */ (function () {
-    function GraphQLClient(url, options) {
-        this.url = url;
-        this.options = options || {};
-    }
-    GraphQLClient.prototype.rawRequest = function (query, variables) {
-        return __awaiter(this, void 0, void 0, function () {
-            var _a, headers, others, body, response, result, headers_1, status_1, errorResult;
-            return __generator(this, function (_b) {
-                switch (_b.label) {
-                    case 0:
-                        _a = this.options, headers = _a.headers, others = __rest(_a, ["headers"]);
-                        body = JSON.stringify({
-                            query: query,
-                            variables: variables ? variables : undefined,
-                        });
-                        return [4 /*yield*/, fetch(this.url, __assign({ method: 'POST', headers: Object.assign({ 'Content-Type': 'application/json' }, headers), body: body }, others))];
-                    case 1:
-                        response = _b.sent();
-                        return [4 /*yield*/, getResult(response)];
-                    case 2:
-                        result = _b.sent();
-                        if (response.ok && !result.errors && result.data) {
-                            headers_1 = response.headers, status_1 = response.status;
-                            return [2 /*return*/, __assign({}, result, { headers: headers_1, status: status_1 })];
-                        }
-                        else {
-                            errorResult = typeof result === 'string' ? { error: result } : result;
-                            throw new types_1.ClientError(__assign({}, errorResult, { status: response.status, headers: response.headers }), { query: query, variables: variables });
-                        }
-                        return [2 /*return*/];
-                }
-            });
-        });
-    };
-    GraphQLClient.prototype.request = function (query, variables) {
-        return __awaiter(this, void 0, void 0, function () {
-            var _a, headers, others, body, response, result, errorResult;
-            return __generator(this, function (_b) {
-                switch (_b.label) {
-                    case 0:
-                        _a = this.options, headers = _a.headers, others = __rest(_a, ["headers"]);
-                        body = JSON.stringify({
-                            query: query,
-                            variables: variables ? variables : undefined,
-                        });
-                        return [4 /*yield*/, fetch(this.url, __assign({ method: 'POST', headers: Object.assign({ 'Content-Type': 'application/json' }, headers), body: body }, others))];
-                    case 1:
-                        response = _b.sent();
-                        return [4 /*yield*/, getResult(response)];
-                    case 2:
-                        result = _b.sent();
-                        if (response.ok && !result.errors && result.data) {
-                            return [2 /*return*/, result.data];
-                        }
-                        else {
-                            errorResult = typeof result === 'string' ? { error: result } : result;
-                            throw new types_1.ClientError(__assign({}, errorResult, { status: response.status }), { query: query, variables: variables });
-                        }
-                        return [2 /*return*/];
-                }
-            });
-        });
-    };
-    GraphQLClient.prototype.setHeaders = function (headers) {
-        this.options.headers = headers;
-        return this;
-    };
-    GraphQLClient.prototype.setHeader = function (key, value) {
-        var headers = this.options.headers;
-        if (headers) {
-            headers[key] = value;
-        }
-        else {
-            this.options.headers = (_a = {}, _a[key] = value, _a);
-        }
-        return this;
-        var _a;
-    };
-    return GraphQLClient;
-}());
-exports.GraphQLClient = GraphQLClient;
-function rawRequest(url, query, variables) {
-    return __awaiter(this, void 0, void 0, function () {
-        var client;
-        return __generator(this, function (_a) {
-            client = new GraphQLClient(url);
-            return [2 /*return*/, client.rawRequest(query, variables)];
-        });
-    });
-}
-exports.rawRequest = rawRequest;
-function request(url, query, variables) {
-    return __awaiter(this, void 0, void 0, function () {
-        var client;
-        return __generator(this, function (_a) {
-            client = new GraphQLClient(url);
-            return [2 /*return*/, client.request(query, variables)];
-        });
-    });
-}
-exports.request = request;
-exports.default = request;
-function getResult(response) {
-    return __awaiter(this, void 0, void 0, function () {
-        var contentType;
-        return __generator(this, function (_a) {
-            contentType = response.headers.get('Content-Type');
-            if (contentType && contentType.startsWith('application/json')) {
-                return [2 /*return*/, response.json()];
-            }
-            else {
-                return [2 /*return*/, response.text()];
-            }
-            return [2 /*return*/];
-        });
-    });
-}
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/graphql-request/dist/src/index.js.map b/node_modules/graphql-request/dist/src/index.js.map
deleted file mode 100644
index a817b39..0000000
--- a/node_modules/graphql-request/dist/src/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/graphql-request/dist/src/types.d.ts b/node_modules/graphql-request/dist/src/types.d.ts
deleted file mode 100644
index f3ab8fc..0000000
--- a/node_modules/graphql-request/dist/src/types.d.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-export declare type Variables = {
-    [key: string]: any;
-};
-export interface Headers {
-    [key: string]: string;
-}
-export interface Options {
-    method?: RequestInit['method'];
-    headers?: Headers;
-    mode?: RequestInit['mode'];
-    credentials?: RequestInit['credentials'];
-    cache?: RequestInit['cache'];
-    redirect?: RequestInit['redirect'];
-    referrer?: RequestInit['referrer'];
-    referrerPolicy?: RequestInit['referrerPolicy'];
-    integrity?: RequestInit['integrity'];
-}
-export interface GraphQLError {
-    message: string;
-    locations: {
-        line: number;
-        column: number;
-    }[];
-    path: string[];
-}
-export interface GraphQLResponse {
-    data?: any;
-    errors?: GraphQLError[];
-    extensions?: any;
-    status: number;
-    [key: string]: any;
-}
-export interface GraphQLRequestContext {
-    query: string;
-    variables?: Variables;
-}
-export declare class ClientError extends Error {
-    response: GraphQLResponse;
-    request: GraphQLRequestContext;
-    constructor(response: GraphQLResponse, request: GraphQLRequestContext);
-    private static extractMessage(response);
-}
diff --git a/node_modules/graphql-request/dist/src/types.js b/node_modules/graphql-request/dist/src/types.js
deleted file mode 100644
index c9a7a95..0000000
--- a/node_modules/graphql-request/dist/src/types.js
+++ /dev/null
@@ -1,39 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var ClientError = /** @class */ (function (_super) {
-    __extends(ClientError, _super);
-    function ClientError(response, request) {
-        var _this = this;
-        var message = ClientError.extractMessage(response) + ": " + JSON.stringify({ response: response, request: request });
-        _this = _super.call(this, message) || this;
-        _this.response = response;
-        _this.request = request;
-        // this is needed as Safari doesn't support .captureStackTrace
-        /* tslint:disable-next-line */
-        if (typeof Error.captureStackTrace === 'function') {
-            Error.captureStackTrace(_this, ClientError);
-        }
-        return _this;
-    }
-    ClientError.extractMessage = function (response) {
-        try {
-            return response.errors[0].message;
-        }
-        catch (e) {
-            return "GraphQL Error (Code: " + response.status + ")";
-        }
-    };
-    return ClientError;
-}(Error));
-exports.ClientError = ClientError;
-//# sourceMappingURL=types.js.map
\ No newline at end of file
diff --git a/node_modules/graphql-request/dist/src/types.js.map b/node_modules/graphql-request/dist/src/types.js.map
deleted file mode 100644
index 0b6a7c5..0000000
--- a/node_modules/graphql-request/dist/src/types.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";;;;;;;;;;;;AAqCA;IAAiC,+BAAK;IAKpC,qBAAa,QAAyB,EAAE,OAA8B;QAAtE,iBAaC;QAZC,IAAM,OAAO,GAAM,WAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAK,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,UAAA,EAAE,OAAO,SAAA,EAAE,CAAG,CAAA;QAEnG,QAAA,kBAAM,OAAO,CAAC,SAAA;QAEd,KAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,KAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAEtB,8DAA8D;QAC9D,8BAA8B;QAC9B,EAAE,CAAC,CAAC,OAAO,KAAK,CAAC,iBAAiB,KAAK,UAAU,CAAC,CAAC,CAAC;YAClD,KAAK,CAAC,iBAAiB,CAAC,KAAI,EAAE,WAAW,CAAC,CAAA;QAC5C,CAAC;;IACH,CAAC;IAEc,0BAAc,GAA7B,UAA+B,QAAyB;QACtD,IAAI,CAAC;YACH,MAAM,CAAC,QAAQ,CAAC,MAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;QACpC,CAAC;QAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACX,MAAM,CAAC,0BAAwB,QAAQ,CAAC,MAAM,MAAG,CAAA;QACnD,CAAC;IACH,CAAC;IACH,kBAAC;AAAD,CAAC,AA3BD,CAAiC,KAAK,GA2BrC;AA3BY,kCAAW"}
\ No newline at end of file
diff --git a/node_modules/graphql-request/dist/tests/index.test.d.ts b/node_modules/graphql-request/dist/tests/index.test.d.ts
deleted file mode 100644
index cb0ff5c..0000000
--- a/node_modules/graphql-request/dist/tests/index.test.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/node_modules/graphql-request/dist/tests/index.test.js b/node_modules/graphql-request/dist/tests/index.test.js
deleted file mode 100644
index 26260e1..0000000
--- a/node_modules/graphql-request/dist/tests/index.test.js
+++ /dev/null
@@ -1,313 +0,0 @@
-"use strict";
-var __assign = (this && this.__assign) || Object.assign || function(t) {
-    for (var s, i = 1, n = arguments.length; i < n; i++) {
-        s = arguments[i];
-        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
-            t[p] = s[p];
-    }
-    return t;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __generator = (this && this.__generator) || function (thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (_) try {
-            if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [0, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-};
-var __rest = (this && this.__rest) || function (s, e) {
-    var t = {};
-    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
-        t[p] = s[p];
-    if (s != null && typeof Object.getOwnPropertySymbols === "function")
-        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
-            t[p[i]] = s[p[i]];
-    return t;
-};
-var _this = this;
-Object.defineProperty(exports, "__esModule", { value: true });
-var ava_1 = require("ava");
-var fetchMock = require("fetch-mock");
-var index_1 = require("../src/index");
-ava_1.default('minimal query', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var _this = this;
-    var data;
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0:
-                data = {
-                    viewer: {
-                        id: 'some-id',
-                    },
-                };
-                return [4 /*yield*/, mock({ body: { data: data } }, function () { return __awaiter(_this, void 0, void 0, function () {
-                        var _a, _b;
-                        return __generator(this, function (_c) {
-                            switch (_c.label) {
-                                case 0:
-                                    _b = (_a = t).deepEqual;
-                                    return [4 /*yield*/, index_1.request('https://mock-api.com/graphql', "{ viewer { id } }")];
-                                case 1:
-                                    _b.apply(_a, [_c.sent(), data]);
-                                    return [2 /*return*/];
-                            }
-                        });
-                    }); })];
-            case 1:
-                _a.sent();
-                return [2 /*return*/];
-        }
-    });
-}); });
-ava_1.default('minimal raw query', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var _this = this;
-    var data, extensions;
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0:
-                data = {
-                    viewer: {
-                        id: 'some-id',
-                    },
-                };
-                extensions = {
-                    version: '1',
-                };
-                return [4 /*yield*/, mock({ body: { data: data, extensions: extensions } }, function () { return __awaiter(_this, void 0, void 0, function () {
-                        var _a, headers, result;
-                        return __generator(this, function (_b) {
-                            switch (_b.label) {
-                                case 0: return [4 /*yield*/, index_1.rawRequest('https://mock-api.com/graphql', "{ viewer { id } }")];
-                                case 1:
-                                    _a = _b.sent(), headers = _a.headers, result = __rest(_a, ["headers"]);
-                                    t.deepEqual(result, { data: data, extensions: extensions, status: 200 });
-                                    return [2 /*return*/];
-                            }
-                        });
-                    }); })];
-            case 1:
-                _a.sent();
-                return [2 /*return*/];
-        }
-    });
-}); });
-ava_1.default('minimal raw query with response headers', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var _this = this;
-    var data, extensions, reqHeaders;
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0:
-                data = {
-                    viewer: {
-                        id: 'some-id',
-                    },
-                };
-                extensions = {
-                    version: '1',
-                };
-                reqHeaders = {
-                    'Content-Type': 'application/json',
-                    'X-Custom-Header': 'test-custom-header',
-                };
-                return [4 /*yield*/, mock({ headers: reqHeaders, body: { data: data, extensions: extensions } }, function () { return __awaiter(_this, void 0, void 0, function () {
-                        var _a, headers, result;
-                        return __generator(this, function (_b) {
-                            switch (_b.label) {
-                                case 0: return [4 /*yield*/, index_1.rawRequest('https://mock-api.com/graphql', "{ viewer { id } }")];
-                                case 1:
-                                    _a = _b.sent(), headers = _a.headers, result = __rest(_a, ["headers"]);
-                                    t.deepEqual(result, { data: data, extensions: extensions, status: 200 });
-                                    t.deepEqual(headers.get('X-Custom-Header'), reqHeaders['X-Custom-Header']);
-                                    return [2 /*return*/];
-                            }
-                        });
-                    }); })];
-            case 1:
-                _a.sent();
-                return [2 /*return*/];
-        }
-    });
-}); });
-ava_1.default('basic error', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var _this = this;
-    var errors;
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0:
-                errors = {
-                    message: "Syntax Error GraphQL request (1:1) Unexpected Name \"x\"\n\n1: x\n   ^\n",
-                    locations: [
-                        {
-                            line: 1,
-                            column: 1
-                        }
-                    ]
-                };
-                return [4 /*yield*/, mock({ body: { errors: errors } }, function () { return __awaiter(_this, void 0, void 0, function () {
-                        var err;
-                        return __generator(this, function (_a) {
-                            switch (_a.label) {
-                                case 0: return [4 /*yield*/, t.throws(index_1.request('https://mock-api.com/graphql', "x"))];
-                                case 1:
-                                    err = _a.sent();
-                                    t.deepEqual(err.response.errors, errors);
-                                    return [2 /*return*/];
-                            }
-                        });
-                    }); })];
-            case 1:
-                _a.sent();
-                return [2 /*return*/];
-        }
-    });
-}); });
-ava_1.default('raw request error', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var _this = this;
-    var errors;
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0:
-                errors = {
-                    message: "Syntax Error GraphQL request (1:1) Unexpected Name \"x\"\n\n1: x\n   ^\n",
-                    locations: [
-                        {
-                            line: 1,
-                            column: 1
-                        }
-                    ]
-                };
-                return [4 /*yield*/, mock({ body: { errors: errors } }, function () { return __awaiter(_this, void 0, void 0, function () {
-                        var err;
-                        return __generator(this, function (_a) {
-                            switch (_a.label) {
-                                case 0: return [4 /*yield*/, t.throws(index_1.rawRequest('https://mock-api.com/graphql', "x"))];
-                                case 1:
-                                    err = _a.sent();
-                                    t.deepEqual(err.response.errors, errors);
-                                    return [2 /*return*/];
-                            }
-                        });
-                    }); })];
-            case 1:
-                _a.sent();
-                return [2 /*return*/];
-        }
-    });
-}); });
-ava_1.default('content-type with charset', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var _this = this;
-    var data;
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0:
-                data = {
-                    viewer: {
-                        id: 'some-id',
-                    },
-                };
-                return [4 /*yield*/, mock({
-                        headers: { 'Content-Type': 'application/json; charset=utf-8' },
-                        body: { data: data }
-                    }, function () { return __awaiter(_this, void 0, void 0, function () {
-                        var _a, _b;
-                        return __generator(this, function (_c) {
-                            switch (_c.label) {
-                                case 0:
-                                    _b = (_a = t).deepEqual;
-                                    return [4 /*yield*/, index_1.request('https://mock-api.com/graphql', "{ viewer { id } }")];
-                                case 1:
-                                    _b.apply(_a, [_c.sent(), data]);
-                                    return [2 /*return*/];
-                            }
-                        });
-                    }); })];
-            case 1:
-                _a.sent();
-                return [2 /*return*/];
-        }
-    });
-}); });
-ava_1.default('extra fetch options', function (t) { return __awaiter(_this, void 0, void 0, function () {
-    var _this = this;
-    var options, client;
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0:
-                options = {
-                    credentials: 'include',
-                    mode: 'cors',
-                    cache: 'reload',
-                };
-                client = new index_1.GraphQLClient('https://mock-api.com/graphql', options);
-                return [4 /*yield*/, mock({
-                        body: { data: { test: 'test' } }
-                    }, function () { return __awaiter(_this, void 0, void 0, function () {
-                        var actualOptions, name_1;
-                        return __generator(this, function (_a) {
-                            switch (_a.label) {
-                                case 0: return [4 /*yield*/, client.request('{ test }')];
-                                case 1:
-                                    _a.sent();
-                                    actualOptions = fetchMock.lastCall()[1];
-                                    for (name_1 in options) {
-                                        t.deepEqual(actualOptions[name_1], options[name_1]);
-                                    }
-                                    return [2 /*return*/];
-                            }
-                        });
-                    }); })];
-            case 1:
-                _a.sent();
-                return [2 /*return*/];
-        }
-    });
-}); });
-function mock(response, testFn) {
-    return __awaiter(this, void 0, void 0, function () {
-        return __generator(this, function (_a) {
-            switch (_a.label) {
-                case 0:
-                    fetchMock.mock({
-                        matcher: '*',
-                        response: {
-                            headers: __assign({ 'Content-Type': 'application/json' }, response.headers),
-                            body: JSON.stringify(response.body),
-                        },
-                    });
-                    return [4 /*yield*/, testFn()];
-                case 1:
-                    _a.sent();
-                    fetchMock.restore();
-                    return [2 /*return*/];
-            }
-        });
-    });
-}
-//# sourceMappingURL=index.test.js.map
\ No newline at end of file
diff --git a/node_modules/graphql-request/dist/tests/index.test.js.map b/node_modules/graphql-request/dist/tests/index.test.js.map
deleted file mode 100644
index 1baa500..0000000
--- a/node_modules/graphql-request/dist/tests/index.test.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../tests/index.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iBA8IA;;AA9IA,2BAAsB;AACtB,sCAAuC;AACvC,sCAA8E;AAG9E,aAAI,CAAC,eAAe,EAAE,UAAO,CAAC;;;;;;gBACtB,IAAI,GAAG;oBACX,MAAM,EAAE;wBACN,EAAE,EAAE,SAAS;qBACd;iBACF,CAAA;gBAED,qBAAM,IAAI,CAAC,EAAC,IAAI,EAAE,EAAC,IAAI,MAAA,EAAC,EAAC,EAAE;;;;;oCACzB,KAAA,CAAA,KAAA,CAAC,CAAA,CAAC,SAAS,CAAA;oCAAC,qBAAM,eAAO,CAAC,8BAA8B,EAAE,mBAAmB,CAAC,EAAA;;oCAA9E,cAAY,SAAkE,EAAE,IAAI,EAAC,CAAA;;;;yBACtF,CAAC,EAAA;;gBAFF,SAEE,CAAA;;;;KACH,CAAC,CAAA;AAEF,aAAI,CAAC,mBAAmB,EAAE,UAAO,CAAC;;;;;;gBAC1B,IAAI,GAAG;oBACX,MAAM,EAAE;wBACN,EAAE,EAAE,SAAS;qBACd;iBACF,CAAA;gBAEK,UAAU,GAAG;oBACjB,OAAO,EAAE,GAAG;iBACb,CAAA;gBAED,qBAAM,IAAI,CAAC,EAAC,IAAI,EAAE,EAAC,IAAI,MAAA,EAAE,UAAU,YAAA,EAAC,EAAC,EAAE;;;;wCACN,qBAAM,kBAAU,CAAC,8BAA8B,EAAE,mBAAmB,CAAC,EAAA;;oCAA9F,KAAyB,SAAqE,EAA5F,OAAO,aAAA,EAAK,MAAM,cAApB,WAAsB,CAAF;oCAC1B,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,EAAC,IAAI,MAAA,EAAE,UAAU,YAAA,EAAE,MAAM,EAAE,GAAG,EAAC,CAAC,CAAA;;;;yBACrD,CAAC,EAAA;;gBAHF,SAGE,CAAA;;;;KACH,CAAC,CAAA;AAEF,aAAI,CAAC,yCAAyC,EAAE,UAAO,CAAC;;;;;;gBAChD,IAAI,GAAG;oBACX,MAAM,EAAE;wBACN,EAAE,EAAE,SAAS;qBACd;iBACF,CAAA;gBAEK,UAAU,GAAG;oBACjB,OAAO,EAAE,GAAG;iBACb,CAAA;gBAEK,UAAU,GAAG;oBACjB,cAAc,EAAE,kBAAkB;oBAClC,iBAAiB,EAAE,oBAAoB;iBACxC,CAAA;gBAED,qBAAM,IAAI,CAAC,EAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,EAAC,IAAI,MAAA,EAAE,UAAU,YAAA,EAAC,EAAC,EAAE;;;;wCAC3B,qBAAM,kBAAU,CAAC,8BAA8B,EAAE,mBAAmB,CAAC,EAAA;;oCAA9F,KAAyB,SAAqE,EAA5F,OAAO,aAAA,EAAK,MAAM,cAApB,WAAsB,CAAF;oCAC1B,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,EAAC,IAAI,MAAA,EAAE,UAAU,YAAA,EAAE,MAAM,EAAE,GAAG,EAAC,CAAC,CAAA;oCACpD,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAA;;;;yBAC3E,CAAC,EAAA;;gBAJF,SAIE,CAAA;;;;KACH,CAAC,CAAA;AAEF,aAAI,CAAC,aAAa,EAAE,UAAO,CAAC;;;;;;gBACpB,MAAM,GAAG;oBACb,OAAO,EAAE,0EAA0E;oBACnF,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,CAAC;4BACP,MAAM,EAAE,CAAC;yBACV;qBACF;iBACF,CAAA;gBAED,qBAAM,IAAI,CAAC,EAAC,IAAI,EAAE,EAAC,MAAM,QAAA,EAAC,EAAC,EAAE;;;;wCACF,qBAAM,CAAC,CAAC,MAAM,CAAC,eAAO,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC,EAAA;;oCAA/E,GAAG,GAAgB,SAA4D;oCACrF,CAAC,CAAC,SAAS,CAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;;;;yBAC9C,CAAC,EAAA;;gBAHF,SAGE,CAAA;;;;KACH,CAAC,CAAA;AAEF,aAAI,CAAC,mBAAmB,EAAE,UAAO,CAAC;;;;;;gBAC1B,MAAM,GAAG;oBACb,OAAO,EAAE,0EAA0E;oBACnF,SAAS,EAAE;wBACT;4BACE,IAAI,EAAE,CAAC;4BACP,MAAM,EAAE,CAAC;yBACV;qBACF;iBACF,CAAA;gBAED,qBAAM,IAAI,CAAC,EAAC,IAAI,EAAE,EAAC,MAAM,QAAA,EAAC,EAAC,EAAE;;;;wCACF,qBAAM,CAAC,CAAC,MAAM,CAAC,kBAAU,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC,EAAA;;oCAAlF,GAAG,GAAgB,SAA+D;oCACxF,CAAC,CAAC,SAAS,CAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;;;;yBAC9C,CAAC,EAAA;;gBAHF,SAGE,CAAA;;;;KACH,CAAC,CAAA;AAEF,aAAI,CAAC,2BAA2B,EAAE,UAAO,CAAC;;;;;;gBAClC,IAAI,GAAG;oBACX,MAAM,EAAE;wBACN,EAAE,EAAE,SAAS;qBACd;iBACF,CAAA;gBAED,qBAAM,IAAI,CAAC;wBACT,OAAO,EAAE,EAAC,cAAc,EAAE,iCAAiC,EAAC;wBAC5D,IAAI,EAAE,EAAC,IAAI,MAAA,EAAC;qBACb,EAAE;;;;;oCACD,KAAA,CAAA,KAAA,CAAC,CAAA,CAAC,SAAS,CAAA;oCAAC,qBAAM,eAAO,CAAC,8BAA8B,EAAE,mBAAmB,CAAC,EAAA;;oCAA9E,cAAY,SAAkE,EAAE,IAAI,EAAC,CAAA;;;;yBACtF,CAAC,EAAA;;gBALF,SAKE,CAAA;;;;KACH,CAAC,CAAA;AAGF,aAAI,CAAC,qBAAqB,EAAE,UAAO,CAAC;;;;;;gBAC5B,OAAO,GAAY;oBACvB,WAAW,EAAE,SAAS;oBACtB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,QAAQ;iBAChB,CAAA;gBAEK,MAAM,GAAG,IAAI,qBAAa,CAAC,8BAA8B,EAAE,OAAO,CAAC,CAAA;gBACzE,qBAAM,IAAI,CAAC;wBACT,IAAI,EAAE,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,MAAM,EAAC,EAAE;qBAC/B,EAAE;;;;wCACD,qBAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAA;;oCAAhC,SAAgC,CAAA;oCAC1B,aAAa,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAA;oCAC7C,GAAG,CAAC,CAAK,MAAI,IAAI,OAAO,CAAC,CAAC,CAAC;wCACzB,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,MAAI,CAAC,EAAE,OAAO,CAAC,MAAI,CAAC,CAAC,CAAA;oCACjD,CAAC;;;;yBACF,CAAC,EAAA;;gBARF,SAQE,CAAA;;;;KACH,CAAC,CAAA;AAEF,cAAoB,QAAa,EAAE,MAA2B;;;;;oBAC5D,SAAS,CAAC,IAAI,CAAC;wBACb,OAAO,EAAE,GAAG;wBACZ,QAAQ,EAAE;4BACR,OAAO,aACL,cAAc,EAAE,kBAAkB,IAC/B,QAAQ,CAAC,OAAO,CACpB;4BACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;yBACpC;qBACF,CAAC,CAAA;oBAEF,qBAAM,MAAM,EAAE,EAAA;;oBAAd,SAAc,CAAA;oBAEd,SAAS,CAAC,OAAO,EAAE,CAAA;;;;;CACpB"}
\ No newline at end of file
diff --git a/node_modules/graphql-request/package.json b/node_modules/graphql-request/package.json
deleted file mode 100644
index 465420d..0000000
--- a/node_modules/graphql-request/package.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-  "name": "graphql-request",
-  "version": "1.8.2",
-  "main": "dist/src/index.js",
-  "typings": "./dist/src/index.d.ts",
-  "files": [
-    "dist"
-  ],
-  "bundlesize": [
-    {
-      "path": "./dist/src/index.js",
-      "maxSize": "15 kB"
-    }
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/graphcool/graphql-request.git"
-  },
-  "keywords": [
-    "graphql",
-    "request",
-    "fetch",
-    "graphql-client",
-    "apollo"
-  ],
-  "author": "Johannes Schickling <johannes@graph.cool>",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/graphcool/graphql-request/issues"
-  },
-  "homepage": "https://github.com/graphcool/graphql-request",
-  "scripts": {
-    "prepublish": "npm run build",
-    "build": "rm -rf dist && tsc -d",
-    "lint": "tslint --type-check --project tsconfig.json {src,test}/**/*.ts",
-    "test": "npm run lint && npm run build && ava --serial && npm run size",
-    "size": "bundlesize"
-  },
-  "devDependencies": {
-    "@types/fetch-mock": "5.12.2",
-    "@types/node": "8.5.5",
-    "ava": "0.25.0",
-    "bundlesize": "0.17.0",
-    "fetch-mock": "5.13.1",
-    "tslint": "5.9.1",
-    "tslint-config-standard": "7.0.0",
-    "typescript": "2.7.2"
-  },
-  "dependencies": {
-    "cross-fetch": "2.2.2"
-  }
-}
diff --git a/node_modules/graphql/LICENSE b/node_modules/graphql/LICENSE
deleted file mode 100644
index cd2262e..0000000
--- a/node_modules/graphql/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2019 GraphQL Contributors
-
-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/node_modules/graphql/README.md b/node_modules/graphql/README.md
deleted file mode 100644
index 54200e2..0000000
--- a/node_modules/graphql/README.md
+++ /dev/null
@@ -1,169 +0,0 @@
-# GraphQL.js
-
-The JavaScript reference implementation for GraphQL, a query language for APIs created by Facebook.
-
-[![npm version](https://badge.fury.io/js/graphql.svg)](https://badge.fury.io/js/graphql)
-[![Build Status](https://travis-ci.org/graphql/graphql-js.svg?branch=master)](https://travis-ci.org/graphql/graphql-js?branch=master)
-[![Coverage Status](https://codecov.io/gh/graphql/graphql-js/branch/master/graph/badge.svg)](https://codecov.io/gh/graphql/graphql-js)
-
-See more complete documentation at https://graphql.org/ and
-https://graphql.org/graphql-js/.
-
-Looking for help? Find resources [from the community](https://graphql.org/community/).
-
-## Getting Started
-
-An overview of GraphQL in general is available in the
-[README](https://github.com/graphql/graphql-spec/blob/master/README.md) for the
-[Specification for GraphQL](https://github.com/graphql/graphql-spec). That overview
-describes a simple set of GraphQL examples that exist as [tests](src/__tests__)
-in this repository. A good way to get started with this repository is to walk
-through that README and the corresponding tests in parallel.
-
-### Using GraphQL.js
-
-Install GraphQL.js from npm
-
-With yarn:
-
-```sh
-yarn add graphql
-```
-
-or alternatively using npm:
-
-```sh
-npm install --save graphql
-```
-
-GraphQL.js provides two important capabilities: building a type schema, and
-serving queries against that type schema.
-
-First, build a GraphQL type schema which maps to your code base.
-
-```js
-import {
-  graphql,
-  GraphQLSchema,
-  GraphQLObjectType,
-  GraphQLString,
-} from 'graphql';
-
-var schema = new GraphQLSchema({
-  query: new GraphQLObjectType({
-    name: 'RootQueryType',
-    fields: {
-      hello: {
-        type: GraphQLString,
-        resolve() {
-          return 'world';
-        },
-      },
-    },
-  }),
-});
-```
-
-This defines a simple schema with one type and one field, that resolves
-to a fixed value. The `resolve` function can return a value, a promise,
-or an array of promises. A more complex example is included in the top
-level [tests](src/__tests__) directory.
-
-Then, serve the result of a query against that type schema.
-
-```js
-var query = '{ hello }';
-
-graphql(schema, query).then(result => {
-  // Prints
-  // {
-  //   data: { hello: "world" }
-  // }
-  console.log(result);
-});
-```
-
-This runs a query fetching the one field defined. The `graphql` function will
-first ensure the query is syntactically and semantically valid before executing
-it, reporting errors otherwise.
-
-```js
-var query = '{ BoyHowdy }';
-
-graphql(schema, query).then(result => {
-  // Prints
-  // {
-  //   errors: [
-  //     { message: 'Cannot query field BoyHowdy on RootQueryType',
-  //       locations: [ { line: 1, column: 3 } ] }
-  //   ]
-  // }
-  console.log(result);
-});
-```
-
-**Note**: Please don't forget to set `NODE_ENV=production` if you are running a production server it will disable some checks that can be useful during development but will significantly improve performance.
-
-### Want to ride the bleeding edge?
-
-The `npm` branch in this repository is automatically maintained to be the last
-commit to `master` to pass all tests, in the same form found on npm. It is
-recommended to use builds deployed to npm for many reasons, but if you want to use
-the latest not-yet-released version of graphql-js, you can do so by depending
-directly on this branch:
-
-```
-npm install graphql@git://github.com/graphql/graphql-js.git#npm
-```
-
-### Using in a Browser
-
-GraphQL.js is a general purpose library and can be used both in a Node server
-and in the browser. As an example, the [GraphiQL](https://github.com/graphql/graphiql/)
-tool is built with GraphQL.js!
-
-Building a project using GraphQL.js with [webpack](https://webpack.js.org) or
-[rollup](https://github.com/rollup/rollup) should just work and only include
-the portions of the library you use. This works because GraphQL.js is distributed
-with both CommonJS (`require()`) and ESModule (`import`) files. Ensure that any
-custom build configurations look for `.mjs` files!
-
-### Contributing
-
-We actively welcome pull requests, learn how to
-[contribute](https://github.com/graphql/graphql-js/blob/master/.github/CONTRIBUTING.md).
-
-### Changelog
-
-Changes are tracked as [GitHub releases](https://github.com/graphql/graphql-js/releases).
-
-### License
-
-GraphQL.js is [MIT-licensed](https://github.com/graphql/graphql-js/blob/master/LICENSE).
-
-### Credits
-
-The `*.d.ts` files in this project are based on [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/54712a7e28090c5b1253b746d1878003c954f3ff/types/graphql) definitions written by:
-
-<!--- spell-checker:disable -->
-
-- TonyYang https://github.com/TonyPythoneer
-- Caleb Meredith https://github.com/calebmer
-- Dominic Watson https://github.com/intellix
-- Firede https://github.com/firede
-- Kepennar https://github.com/kepennar
-- Mikhail Novikov https://github.com/freiksenet
-- Ivan Goncharov https://github.com/IvanGoncharov
-- Hagai Cohen https://github.com/DxCx
-- Ricardo Portugal https://github.com/rportugal
-- Tim Griesser https://github.com/tgriesser
-- Dylan Stewart https://github.com/dyst5422
-- Alessio Dionisi https://github.com/adnsio
-- Divyendu Singh https://github.com/divyenduz
-- Brad Zacher https://github.com/bradzacher
-- Curtis Layne https://github.com/clayne11
-- Jonathan Cardoso https://github.com/JCMais
-- Pavel Lang https://github.com/langpavel
-- Mark Caudill https://github.com/mc0
-- Martijn Walraven https://github.com/martijnwalraven
-- Jed Mao https://github.com/jedmao
diff --git a/node_modules/graphql/error/GraphQLError.d.ts b/node_modules/graphql/error/GraphQLError.d.ts
deleted file mode 100644
index d8886a1..0000000
--- a/node_modules/graphql/error/GraphQLError.d.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-
-import { ASTNode } from '../language/ast';
-import { Source } from '../language/source';
-import { SourceLocation } from '../language/location';
-
-/**
- * A GraphQLError describes an Error found during the parse, validate, or
- * execute phases of performing a GraphQL operation. In addition to a message
- * and stack trace, it also includes information about the locations in a
- * GraphQL document and/or execution result that correspond to the Error.
- */
-export class GraphQLError extends Error {
-  constructor(
-    message: string,
-    nodes?: ReadonlyArray<ASTNode> | ASTNode | undefined,
-    source?: Maybe<Source>,
-    positions?: Maybe<ReadonlyArray<number>>,
-    path?: Maybe<ReadonlyArray<string | number>>,
-    originalError?: Maybe<Error>,
-    extensions?: Maybe<{ [key: string]: any }>,
-  );
-
-  /**
-   * A message describing the Error for debugging purposes.
-   *
-   * Enumerable, and appears in the result of JSON.stringify().
-   *
-   * Note: should be treated as readonly, despite invariant usage.
-   */
-  message: string;
-
-  /**
-   * An array of { line, column } locations within the source GraphQL document
-   * which correspond to this error.
-   *
-   * Errors during validation often contain multiple locations, for example to
-   * point out two things with the same name. Errors during execution include a
-   * single location, the field which produced the error.
-   *
-   * Enumerable, and appears in the result of JSON.stringify().
-   */
-  readonly locations: ReadonlyArray<SourceLocation> | undefined;
-
-  /**
-   * An array describing the JSON-path into the execution response which
-   * corresponds to this error. Only included for errors during execution.
-   *
-   * Enumerable, and appears in the result of JSON.stringify().
-   */
-  readonly path: ReadonlyArray<string | number> | undefined;
-
-  /**
-   * An array of GraphQL AST Nodes corresponding to this error.
-   */
-  readonly nodes: ReadonlyArray<ASTNode> | undefined;
-
-  /**
-   * The source GraphQL document corresponding to this error.
-   *
-   * Note that if this Error represents more than one node, the source may not
-   * represent nodes after the first node.
-   */
-  readonly source: Source | undefined;
-
-  /**
-   * An array of character offsets within the source GraphQL document
-   * which correspond to this error.
-   */
-  readonly positions: ReadonlyArray<number> | undefined;
-
-  /**
-   * The original error thrown from a field resolver during execution.
-   */
-  readonly originalError: Maybe<Error>;
-
-  /**
-   * Extension fields to add to the formatted error.
-   */
-  readonly extensions: { [key: string]: any } | undefined;
-}
-
-/**
- * Prints a GraphQLError to a string, representing useful location information
- * about the error's position in the source.
- */
-export function printError(error: GraphQLError): string;
diff --git a/node_modules/graphql/error/GraphQLError.js b/node_modules/graphql/error/GraphQLError.js
deleted file mode 100644
index 9264aa8..0000000
--- a/node_modules/graphql/error/GraphQLError.js
+++ /dev/null
@@ -1,287 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.printError = printError;
-exports.GraphQLError = void 0;
-
-var _isObjectLike = _interopRequireDefault(require("../jsutils/isObjectLike"));
-
-var _symbols = require("../polyfills/symbols");
-
-var _location = require("../language/location");
-
-var _printLocation = require("../language/printLocation");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }
-
-function isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
-
-function _construct(Parent, args, Class) { if (isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }
-
-function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-/**
- * A GraphQLError describes an Error found during the parse, validate, or
- * execute phases of performing a GraphQL operation. In addition to a message
- * and stack trace, it also includes information about the locations in a
- * GraphQL document and/or execution result that correspond to the Error.
- */
-var GraphQLError =
-/*#__PURE__*/
-function (_Error) {
-  _inherits(GraphQLError, _Error);
-
-  /**
-   * A message describing the Error for debugging purposes.
-   *
-   * Enumerable, and appears in the result of JSON.stringify().
-   *
-   * Note: should be treated as readonly, despite invariant usage.
-   */
-
-  /**
-   * An array of { line, column } locations within the source GraphQL document
-   * which correspond to this error.
-   *
-   * Errors during validation often contain multiple locations, for example to
-   * point out two things with the same name. Errors during execution include a
-   * single location, the field which produced the error.
-   *
-   * Enumerable, and appears in the result of JSON.stringify().
-   */
-
-  /**
-   * An array describing the JSON-path into the execution response which
-   * corresponds to this error. Only included for errors during execution.
-   *
-   * Enumerable, and appears in the result of JSON.stringify().
-   */
-
-  /**
-   * An array of GraphQL AST Nodes corresponding to this error.
-   */
-
-  /**
-   * The source GraphQL document for the first location of this error.
-   *
-   * Note that if this Error represents more than one node, the source may not
-   * represent nodes after the first node.
-   */
-
-  /**
-   * An array of character offsets within the source GraphQL document
-   * which correspond to this error.
-   */
-
-  /**
-   * The original error thrown from a field resolver during execution.
-   */
-
-  /**
-   * Extension fields to add to the formatted error.
-   */
-  function GraphQLError(message, nodes, source, positions, path, originalError, extensions) {
-    var _locations2, _source2, _positions2, _extensions2;
-
-    var _this;
-
-    _classCallCheck(this, GraphQLError);
-
-    _this = _possibleConstructorReturn(this, _getPrototypeOf(GraphQLError).call(this, message)); // Compute list of blame nodes.
-
-    var _nodes = Array.isArray(nodes) ? nodes.length !== 0 ? nodes : undefined : nodes ? [nodes] : undefined; // Compute locations in the source for the given nodes/positions.
-
-
-    var _source = source;
-
-    if (!_source && _nodes) {
-      var _nodes$0$loc;
-
-      _source = (_nodes$0$loc = _nodes[0].loc) === null || _nodes$0$loc === void 0 ? void 0 : _nodes$0$loc.source;
-    }
-
-    var _positions = positions;
-
-    if (!_positions && _nodes) {
-      _positions = _nodes.reduce(function (list, node) {
-        if (node.loc) {
-          list.push(node.loc.start);
-        }
-
-        return list;
-      }, []);
-    }
-
-    if (_positions && _positions.length === 0) {
-      _positions = undefined;
-    }
-
-    var _locations;
-
-    if (positions && source) {
-      _locations = positions.map(function (pos) {
-        return (0, _location.getLocation)(source, pos);
-      });
-    } else if (_nodes) {
-      _locations = _nodes.reduce(function (list, node) {
-        if (node.loc) {
-          list.push((0, _location.getLocation)(node.loc.source, node.loc.start));
-        }
-
-        return list;
-      }, []);
-    }
-
-    var _extensions = extensions;
-
-    if (_extensions == null && originalError != null) {
-      var originalExtensions = originalError.extensions;
-
-      if ((0, _isObjectLike.default)(originalExtensions)) {
-        _extensions = originalExtensions;
-      }
-    }
-
-    Object.defineProperties(_assertThisInitialized(_this), {
-      name: {
-        value: 'GraphQLError'
-      },
-      message: {
-        value: message,
-        // By being enumerable, JSON.stringify will include `message` in the
-        // resulting output. This ensures that the simplest possible GraphQL
-        // service adheres to the spec.
-        enumerable: true,
-        writable: true
-      },
-      locations: {
-        // Coercing falsy values to undefined ensures they will not be included
-        // in JSON.stringify() when not provided.
-        value: (_locations2 = _locations) !== null && _locations2 !== void 0 ? _locations2 : undefined,
-        // By being enumerable, JSON.stringify will include `locations` in the
-        // resulting output. This ensures that the simplest possible GraphQL
-        // service adheres to the spec.
-        enumerable: _locations != null
-      },
-      path: {
-        // Coercing falsy values to undefined ensures they will not be included
-        // in JSON.stringify() when not provided.
-        value: path !== null && path !== void 0 ? path : undefined,
-        // By being enumerable, JSON.stringify will include `path` in the
-        // resulting output. This ensures that the simplest possible GraphQL
-        // service adheres to the spec.
-        enumerable: path != null
-      },
-      nodes: {
-        value: _nodes !== null && _nodes !== void 0 ? _nodes : undefined
-      },
-      source: {
-        value: (_source2 = _source) !== null && _source2 !== void 0 ? _source2 : undefined
-      },
-      positions: {
-        value: (_positions2 = _positions) !== null && _positions2 !== void 0 ? _positions2 : undefined
-      },
-      originalError: {
-        value: originalError
-      },
-      extensions: {
-        // Coercing falsy values to undefined ensures they will not be included
-        // in JSON.stringify() when not provided.
-        value: (_extensions2 = _extensions) !== null && _extensions2 !== void 0 ? _extensions2 : undefined,
-        // By being enumerable, JSON.stringify will include `path` in the
-        // resulting output. This ensures that the simplest possible GraphQL
-        // service adheres to the spec.
-        enumerable: _extensions != null
-      }
-    }); // Include (non-enumerable) stack trace.
-
-    if (originalError === null || originalError === void 0 ? void 0 : originalError.stack) {
-      Object.defineProperty(_assertThisInitialized(_this), 'stack', {
-        value: originalError.stack,
-        writable: true,
-        configurable: true
-      });
-      return _possibleConstructorReturn(_this);
-    }
-    /* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-
-
-    if (Error.captureStackTrace) {
-      Error.captureStackTrace(_assertThisInitialized(_this), GraphQLError);
-    } else {
-      Object.defineProperty(_assertThisInitialized(_this), 'stack', {
-        value: Error().stack,
-        writable: true,
-        configurable: true
-      });
-    }
-
-    return _this;
-  }
-
-  _createClass(GraphQLError, [{
-    key: "toString",
-    value: function toString() {
-      return printError(this);
-    } // FIXME: workaround to not break chai comparisons, should be remove in v16
-    // $FlowFixMe Flow doesn't support computed properties yet
-
-  }, {
-    key: _symbols.SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'Object';
-    }
-  }]);
-
-  return GraphQLError;
-}(_wrapNativeSuper(Error));
-/**
- * Prints a GraphQLError to a string, representing useful location information
- * about the error's position in the source.
- */
-
-
-exports.GraphQLError = GraphQLError;
-
-function printError(error) {
-  var output = error.message;
-
-  if (error.nodes) {
-    for (var _i2 = 0, _error$nodes2 = error.nodes; _i2 < _error$nodes2.length; _i2++) {
-      var node = _error$nodes2[_i2];
-
-      if (node.loc) {
-        output += '\n\n' + (0, _printLocation.printLocation)(node.loc);
-      }
-    }
-  } else if (error.source && error.locations) {
-    for (var _i4 = 0, _error$locations2 = error.locations; _i4 < _error$locations2.length; _i4++) {
-      var location = _error$locations2[_i4];
-      output += '\n\n' + (0, _printLocation.printSourceLocation)(error.source, location);
-    }
-  }
-
-  return output;
-}
diff --git a/node_modules/graphql/error/GraphQLError.js.flow b/node_modules/graphql/error/GraphQLError.js.flow
deleted file mode 100644
index b847f42..0000000
--- a/node_modules/graphql/error/GraphQLError.js.flow
+++ /dev/null
@@ -1,242 +0,0 @@
-// @flow strict
-
-// FIXME:
-// flowlint uninitialized-instance-property:off
-
-import isObjectLike from '../jsutils/isObjectLike';
-import { SYMBOL_TO_STRING_TAG } from '../polyfills/symbols';
-
-import { type ASTNode } from '../language/ast';
-import { type Source } from '../language/source';
-import { type SourceLocation, getLocation } from '../language/location';
-import { printLocation, printSourceLocation } from '../language/printLocation';
-
-/**
- * A GraphQLError describes an Error found during the parse, validate, or
- * execute phases of performing a GraphQL operation. In addition to a message
- * and stack trace, it also includes information about the locations in a
- * GraphQL document and/or execution result that correspond to the Error.
- */
-export class GraphQLError extends Error {
-  /**
-   * A message describing the Error for debugging purposes.
-   *
-   * Enumerable, and appears in the result of JSON.stringify().
-   *
-   * Note: should be treated as readonly, despite invariant usage.
-   */
-  message: string;
-
-  /**
-   * An array of { line, column } locations within the source GraphQL document
-   * which correspond to this error.
-   *
-   * Errors during validation often contain multiple locations, for example to
-   * point out two things with the same name. Errors during execution include a
-   * single location, the field which produced the error.
-   *
-   * Enumerable, and appears in the result of JSON.stringify().
-   */
-  +locations: $ReadOnlyArray<SourceLocation> | void;
-
-  /**
-   * An array describing the JSON-path into the execution response which
-   * corresponds to this error. Only included for errors during execution.
-   *
-   * Enumerable, and appears in the result of JSON.stringify().
-   */
-  +path: $ReadOnlyArray<string | number> | void;
-
-  /**
-   * An array of GraphQL AST Nodes corresponding to this error.
-   */
-  +nodes: $ReadOnlyArray<ASTNode> | void;
-
-  /**
-   * The source GraphQL document for the first location of this error.
-   *
-   * Note that if this Error represents more than one node, the source may not
-   * represent nodes after the first node.
-   */
-  +source: Source | void;
-
-  /**
-   * An array of character offsets within the source GraphQL document
-   * which correspond to this error.
-   */
-  +positions: $ReadOnlyArray<number> | void;
-
-  /**
-   * The original error thrown from a field resolver during execution.
-   */
-  +originalError: ?Error;
-
-  /**
-   * Extension fields to add to the formatted error.
-   */
-  +extensions: { [key: string]: mixed, ... } | void;
-
-  constructor(
-    message: string,
-    nodes?: $ReadOnlyArray<ASTNode> | ASTNode | void | null,
-    source?: ?Source,
-    positions?: ?$ReadOnlyArray<number>,
-    path?: ?$ReadOnlyArray<string | number>,
-    originalError?: ?(Error & { +extensions?: mixed, ... }),
-    extensions?: ?{ [key: string]: mixed, ... },
-  ): void {
-    super(message);
-
-    // Compute list of blame nodes.
-    const _nodes = Array.isArray(nodes)
-      ? nodes.length !== 0
-        ? nodes
-        : undefined
-      : nodes
-      ? [nodes]
-      : undefined;
-
-    // Compute locations in the source for the given nodes/positions.
-    let _source = source;
-    if (!_source && _nodes) {
-      _source = _nodes[0].loc?.source;
-    }
-
-    let _positions = positions;
-    if (!_positions && _nodes) {
-      _positions = _nodes.reduce((list, node) => {
-        if (node.loc) {
-          list.push(node.loc.start);
-        }
-        return list;
-      }, []);
-    }
-    if (_positions && _positions.length === 0) {
-      _positions = undefined;
-    }
-
-    let _locations;
-    if (positions && source) {
-      _locations = positions.map(pos => getLocation(source, pos));
-    } else if (_nodes) {
-      _locations = _nodes.reduce((list, node) => {
-        if (node.loc) {
-          list.push(getLocation(node.loc.source, node.loc.start));
-        }
-        return list;
-      }, []);
-    }
-
-    let _extensions = extensions;
-    if (_extensions == null && originalError != null) {
-      const originalExtensions = originalError.extensions;
-      if (isObjectLike(originalExtensions)) {
-        _extensions = originalExtensions;
-      }
-    }
-
-    Object.defineProperties((this: any), {
-      name: { value: 'GraphQLError' },
-      message: {
-        value: message,
-        // By being enumerable, JSON.stringify will include `message` in the
-        // resulting output. This ensures that the simplest possible GraphQL
-        // service adheres to the spec.
-        enumerable: true,
-        writable: true,
-      },
-      locations: {
-        // Coercing falsy values to undefined ensures they will not be included
-        // in JSON.stringify() when not provided.
-        value: _locations ?? undefined,
-        // By being enumerable, JSON.stringify will include `locations` in the
-        // resulting output. This ensures that the simplest possible GraphQL
-        // service adheres to the spec.
-        enumerable: _locations != null,
-      },
-      path: {
-        // Coercing falsy values to undefined ensures they will not be included
-        // in JSON.stringify() when not provided.
-        value: path ?? undefined,
-        // By being enumerable, JSON.stringify will include `path` in the
-        // resulting output. This ensures that the simplest possible GraphQL
-        // service adheres to the spec.
-        enumerable: path != null,
-      },
-      nodes: {
-        value: _nodes ?? undefined,
-      },
-      source: {
-        value: _source ?? undefined,
-      },
-      positions: {
-        value: _positions ?? undefined,
-      },
-      originalError: {
-        value: originalError,
-      },
-      extensions: {
-        // Coercing falsy values to undefined ensures they will not be included
-        // in JSON.stringify() when not provided.
-        value: _extensions ?? undefined,
-        // By being enumerable, JSON.stringify will include `path` in the
-        // resulting output. This ensures that the simplest possible GraphQL
-        // service adheres to the spec.
-        enumerable: _extensions != null,
-      },
-    });
-
-    // Include (non-enumerable) stack trace.
-    if (originalError?.stack) {
-      Object.defineProperty(this, 'stack', {
-        value: originalError.stack,
-        writable: true,
-        configurable: true,
-      });
-      return;
-    }
-
-    /* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-    if (Error.captureStackTrace) {
-      Error.captureStackTrace(this, GraphQLError);
-    } else {
-      Object.defineProperty(this, 'stack', {
-        value: Error().stack,
-        writable: true,
-        configurable: true,
-      });
-    }
-  }
-
-  toString(): string {
-    return printError(this);
-  }
-
-  // FIXME: workaround to not break chai comparisons, should be remove in v16
-  // $FlowFixMe Flow doesn't support computed properties yet
-  get [SYMBOL_TO_STRING_TAG](): string {
-    return 'Object';
-  }
-}
-
-/**
- * Prints a GraphQLError to a string, representing useful location information
- * about the error's position in the source.
- */
-export function printError(error: GraphQLError): string {
-  let output = error.message;
-
-  if (error.nodes) {
-    for (const node of error.nodes) {
-      if (node.loc) {
-        output += '\n\n' + printLocation(node.loc);
-      }
-    }
-  } else if (error.source && error.locations) {
-    for (const location of error.locations) {
-      output += '\n\n' + printSourceLocation(error.source, location);
-    }
-  }
-
-  return output;
-}
diff --git a/node_modules/graphql/error/GraphQLError.mjs b/node_modules/graphql/error/GraphQLError.mjs
deleted file mode 100644
index 892ccdc..0000000
--- a/node_modules/graphql/error/GraphQLError.mjs
+++ /dev/null
@@ -1,273 +0,0 @@
-function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }
-
-function isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
-
-function _construct(Parent, args, Class) { if (isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }
-
-function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-// FIXME:
-// flowlint uninitialized-instance-property:off
-import isObjectLike from "../jsutils/isObjectLike.mjs";
-import { SYMBOL_TO_STRING_TAG } from "../polyfills/symbols.mjs";
-import { getLocation } from "../language/location.mjs";
-import { printLocation, printSourceLocation } from "../language/printLocation.mjs";
-/**
- * A GraphQLError describes an Error found during the parse, validate, or
- * execute phases of performing a GraphQL operation. In addition to a message
- * and stack trace, it also includes information about the locations in a
- * GraphQL document and/or execution result that correspond to the Error.
- */
-
-export var GraphQLError =
-/*#__PURE__*/
-function (_Error) {
-  _inherits(GraphQLError, _Error);
-
-  /**
-   * A message describing the Error for debugging purposes.
-   *
-   * Enumerable, and appears in the result of JSON.stringify().
-   *
-   * Note: should be treated as readonly, despite invariant usage.
-   */
-
-  /**
-   * An array of { line, column } locations within the source GraphQL document
-   * which correspond to this error.
-   *
-   * Errors during validation often contain multiple locations, for example to
-   * point out two things with the same name. Errors during execution include a
-   * single location, the field which produced the error.
-   *
-   * Enumerable, and appears in the result of JSON.stringify().
-   */
-
-  /**
-   * An array describing the JSON-path into the execution response which
-   * corresponds to this error. Only included for errors during execution.
-   *
-   * Enumerable, and appears in the result of JSON.stringify().
-   */
-
-  /**
-   * An array of GraphQL AST Nodes corresponding to this error.
-   */
-
-  /**
-   * The source GraphQL document for the first location of this error.
-   *
-   * Note that if this Error represents more than one node, the source may not
-   * represent nodes after the first node.
-   */
-
-  /**
-   * An array of character offsets within the source GraphQL document
-   * which correspond to this error.
-   */
-
-  /**
-   * The original error thrown from a field resolver during execution.
-   */
-
-  /**
-   * Extension fields to add to the formatted error.
-   */
-  function GraphQLError(message, nodes, source, positions, path, originalError, extensions) {
-    var _locations2, _source2, _positions2, _extensions2;
-
-    var _this;
-
-    _classCallCheck(this, GraphQLError);
-
-    _this = _possibleConstructorReturn(this, _getPrototypeOf(GraphQLError).call(this, message)); // Compute list of blame nodes.
-
-    var _nodes = Array.isArray(nodes) ? nodes.length !== 0 ? nodes : undefined : nodes ? [nodes] : undefined; // Compute locations in the source for the given nodes/positions.
-
-
-    var _source = source;
-
-    if (!_source && _nodes) {
-      var _nodes$0$loc;
-
-      _source = (_nodes$0$loc = _nodes[0].loc) === null || _nodes$0$loc === void 0 ? void 0 : _nodes$0$loc.source;
-    }
-
-    var _positions = positions;
-
-    if (!_positions && _nodes) {
-      _positions = _nodes.reduce(function (list, node) {
-        if (node.loc) {
-          list.push(node.loc.start);
-        }
-
-        return list;
-      }, []);
-    }
-
-    if (_positions && _positions.length === 0) {
-      _positions = undefined;
-    }
-
-    var _locations;
-
-    if (positions && source) {
-      _locations = positions.map(function (pos) {
-        return getLocation(source, pos);
-      });
-    } else if (_nodes) {
-      _locations = _nodes.reduce(function (list, node) {
-        if (node.loc) {
-          list.push(getLocation(node.loc.source, node.loc.start));
-        }
-
-        return list;
-      }, []);
-    }
-
-    var _extensions = extensions;
-
-    if (_extensions == null && originalError != null) {
-      var originalExtensions = originalError.extensions;
-
-      if (isObjectLike(originalExtensions)) {
-        _extensions = originalExtensions;
-      }
-    }
-
-    Object.defineProperties(_assertThisInitialized(_this), {
-      name: {
-        value: 'GraphQLError'
-      },
-      message: {
-        value: message,
-        // By being enumerable, JSON.stringify will include `message` in the
-        // resulting output. This ensures that the simplest possible GraphQL
-        // service adheres to the spec.
-        enumerable: true,
-        writable: true
-      },
-      locations: {
-        // Coercing falsy values to undefined ensures they will not be included
-        // in JSON.stringify() when not provided.
-        value: (_locations2 = _locations) !== null && _locations2 !== void 0 ? _locations2 : undefined,
-        // By being enumerable, JSON.stringify will include `locations` in the
-        // resulting output. This ensures that the simplest possible GraphQL
-        // service adheres to the spec.
-        enumerable: _locations != null
-      },
-      path: {
-        // Coercing falsy values to undefined ensures they will not be included
-        // in JSON.stringify() when not provided.
-        value: path !== null && path !== void 0 ? path : undefined,
-        // By being enumerable, JSON.stringify will include `path` in the
-        // resulting output. This ensures that the simplest possible GraphQL
-        // service adheres to the spec.
-        enumerable: path != null
-      },
-      nodes: {
-        value: _nodes !== null && _nodes !== void 0 ? _nodes : undefined
-      },
-      source: {
-        value: (_source2 = _source) !== null && _source2 !== void 0 ? _source2 : undefined
-      },
-      positions: {
-        value: (_positions2 = _positions) !== null && _positions2 !== void 0 ? _positions2 : undefined
-      },
-      originalError: {
-        value: originalError
-      },
-      extensions: {
-        // Coercing falsy values to undefined ensures they will not be included
-        // in JSON.stringify() when not provided.
-        value: (_extensions2 = _extensions) !== null && _extensions2 !== void 0 ? _extensions2 : undefined,
-        // By being enumerable, JSON.stringify will include `path` in the
-        // resulting output. This ensures that the simplest possible GraphQL
-        // service adheres to the spec.
-        enumerable: _extensions != null
-      }
-    }); // Include (non-enumerable) stack trace.
-
-    if (originalError === null || originalError === void 0 ? void 0 : originalError.stack) {
-      Object.defineProperty(_assertThisInitialized(_this), 'stack', {
-        value: originalError.stack,
-        writable: true,
-        configurable: true
-      });
-      return _possibleConstructorReturn(_this);
-    }
-    /* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-
-
-    if (Error.captureStackTrace) {
-      Error.captureStackTrace(_assertThisInitialized(_this), GraphQLError);
-    } else {
-      Object.defineProperty(_assertThisInitialized(_this), 'stack', {
-        value: Error().stack,
-        writable: true,
-        configurable: true
-      });
-    }
-
-    return _this;
-  }
-
-  _createClass(GraphQLError, [{
-    key: "toString",
-    value: function toString() {
-      return printError(this);
-    } // FIXME: workaround to not break chai comparisons, should be remove in v16
-    // $FlowFixMe Flow doesn't support computed properties yet
-
-  }, {
-    key: SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'Object';
-    }
-  }]);
-
-  return GraphQLError;
-}(_wrapNativeSuper(Error));
-/**
- * Prints a GraphQLError to a string, representing useful location information
- * about the error's position in the source.
- */
-
-export function printError(error) {
-  var output = error.message;
-
-  if (error.nodes) {
-    for (var _i2 = 0, _error$nodes2 = error.nodes; _i2 < _error$nodes2.length; _i2++) {
-      var node = _error$nodes2[_i2];
-
-      if (node.loc) {
-        output += '\n\n' + printLocation(node.loc);
-      }
-    }
-  } else if (error.source && error.locations) {
-    for (var _i4 = 0, _error$locations2 = error.locations; _i4 < _error$locations2.length; _i4++) {
-      var location = _error$locations2[_i4];
-      output += '\n\n' + printSourceLocation(error.source, location);
-    }
-  }
-
-  return output;
-}
diff --git a/node_modules/graphql/error/formatError.d.ts b/node_modules/graphql/error/formatError.d.ts
deleted file mode 100644
index fb3451b..0000000
--- a/node_modules/graphql/error/formatError.d.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { SourceLocation } from '../language/location';
-
-import { GraphQLError } from './GraphQLError';
-
-/**
- * Given a GraphQLError, format it according to the rules described by the
- * Response Format, Errors section of the GraphQL Specification.
- */
-export function formatError(error: GraphQLError): GraphQLFormattedError;
-
-/**
- * @see https://github.com/graphql/graphql-spec/blob/master/spec/Section%207%20--%20Response.md#errors
- */
-export interface GraphQLFormattedError<
-  TExtensions extends Record<string, any> = Record<string, any>
-> {
-  /**
-   * A short, human-readable summary of the problem that **SHOULD NOT** change
-   * from occurrence to occurrence of the problem, except for purposes of
-   * localization.
-   */
-  readonly message: string;
-  /**
-   * If an error can be associated to a particular point in the requested
-   * GraphQL document, it should contain a list of locations.
-   */
-  readonly locations?: ReadonlyArray<SourceLocation>;
-  /**
-   * If an error can be associated to a particular field in the GraphQL result,
-   * it _must_ contain an entry with the key `path` that details the path of
-   * the response field which experienced the error. This allows clients to
-   * identify whether a null result is intentional or caused by a runtime error.
-   */
-  readonly path?: ReadonlyArray<string | number>;
-  /**
-   * Reserved for implementors to extend the protocol however they see fit,
-   * and hence there are no additional restrictions on its contents.
-   */
-  readonly extensions?: TExtensions;
-}
diff --git a/node_modules/graphql/error/formatError.js b/node_modules/graphql/error/formatError.js
deleted file mode 100644
index 689f468..0000000
--- a/node_modules/graphql/error/formatError.js
+++ /dev/null
@@ -1,37 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.formatError = formatError;
-
-var _devAssert = _interopRequireDefault(require("../jsutils/devAssert"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Given a GraphQLError, format it according to the rules described by the
- * Response Format, Errors section of the GraphQL Specification.
- */
-function formatError(error) {
-  var _error$message;
-
-  error || (0, _devAssert.default)(0, 'Received null or undefined error.');
-  var message = (_error$message = error.message) !== null && _error$message !== void 0 ? _error$message : 'An unknown error occurred.';
-  var locations = error.locations;
-  var path = error.path;
-  var extensions = error.extensions;
-  return extensions ? {
-    message: message,
-    locations: locations,
-    path: path,
-    extensions: extensions
-  } : {
-    message: message,
-    locations: locations,
-    path: path
-  };
-}
-/**
- * @see https://github.com/graphql/graphql-spec/blob/master/spec/Section%207%20--%20Response.md#errors
- */
diff --git a/node_modules/graphql/error/formatError.js.flow b/node_modules/graphql/error/formatError.js.flow
deleted file mode 100644
index 8bb4c5b..0000000
--- a/node_modules/graphql/error/formatError.js.flow
+++ /dev/null
@@ -1,52 +0,0 @@
-// @flow strict
-
-import devAssert from '../jsutils/devAssert';
-
-import { type SourceLocation } from '../language/location';
-
-import { type GraphQLError } from './GraphQLError';
-
-/**
- * Given a GraphQLError, format it according to the rules described by the
- * Response Format, Errors section of the GraphQL Specification.
- */
-export function formatError(error: GraphQLError): GraphQLFormattedError {
-  devAssert(error, 'Received null or undefined error.');
-  const message = error.message ?? 'An unknown error occurred.';
-  const locations = error.locations;
-  const path = error.path;
-  const extensions = error.extensions;
-
-  return extensions
-    ? { message, locations, path, extensions }
-    : { message, locations, path };
-}
-
-/**
- * @see https://github.com/graphql/graphql-spec/blob/master/spec/Section%207%20--%20Response.md#errors
- */
-export type GraphQLFormattedError = {|
-  /**
-   * A short, human-readable summary of the problem that **SHOULD NOT** change
-   * from occurrence to occurrence of the problem, except for purposes of
-   * localization.
-   */
-  +message: string,
-  /**
-   * If an error can be associated to a particular point in the requested
-   * GraphQL document, it should contain a list of locations.
-   */
-  +locations: $ReadOnlyArray<SourceLocation> | void,
-  /**
-   * If an error can be associated to a particular field in the GraphQL result,
-   * it _must_ contain an entry with the key `path` that details the path of
-   * the response field which experienced the error. This allows clients to
-   * identify whether a null result is intentional or caused by a runtime error.
-   */
-  +path: $ReadOnlyArray<string | number> | void,
-  /**
-   * Reserved for implementors to extend the protocol however they see fit,
-   * and hence there are no additional restrictions on its contents.
-   */
-  +extensions?: { [key: string]: mixed, ... },
-|};
diff --git a/node_modules/graphql/error/formatError.mjs b/node_modules/graphql/error/formatError.mjs
deleted file mode 100644
index 3f80411..0000000
--- a/node_modules/graphql/error/formatError.mjs
+++ /dev/null
@@ -1,28 +0,0 @@
-import devAssert from "../jsutils/devAssert.mjs";
-
-/**
- * Given a GraphQLError, format it according to the rules described by the
- * Response Format, Errors section of the GraphQL Specification.
- */
-export function formatError(error) {
-  var _error$message;
-
-  error || devAssert(0, 'Received null or undefined error.');
-  var message = (_error$message = error.message) !== null && _error$message !== void 0 ? _error$message : 'An unknown error occurred.';
-  var locations = error.locations;
-  var path = error.path;
-  var extensions = error.extensions;
-  return extensions ? {
-    message: message,
-    locations: locations,
-    path: path,
-    extensions: extensions
-  } : {
-    message: message,
-    locations: locations,
-    path: path
-  };
-}
-/**
- * @see https://github.com/graphql/graphql-spec/blob/master/spec/Section%207%20--%20Response.md#errors
- */
diff --git a/node_modules/graphql/error/index.d.ts b/node_modules/graphql/error/index.d.ts
deleted file mode 100644
index 9373b71..0000000
--- a/node_modules/graphql/error/index.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export { GraphQLError, printError } from './GraphQLError';
-export { syntaxError } from './syntaxError';
-export { locatedError } from './locatedError';
-export { formatError, GraphQLFormattedError } from './formatError';
diff --git a/node_modules/graphql/error/index.js b/node_modules/graphql/error/index.js
deleted file mode 100644
index e71a994..0000000
--- a/node_modules/graphql/error/index.js
+++ /dev/null
@@ -1,43 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "GraphQLError", {
-  enumerable: true,
-  get: function get() {
-    return _GraphQLError.GraphQLError;
-  }
-});
-Object.defineProperty(exports, "printError", {
-  enumerable: true,
-  get: function get() {
-    return _GraphQLError.printError;
-  }
-});
-Object.defineProperty(exports, "syntaxError", {
-  enumerable: true,
-  get: function get() {
-    return _syntaxError.syntaxError;
-  }
-});
-Object.defineProperty(exports, "locatedError", {
-  enumerable: true,
-  get: function get() {
-    return _locatedError.locatedError;
-  }
-});
-Object.defineProperty(exports, "formatError", {
-  enumerable: true,
-  get: function get() {
-    return _formatError.formatError;
-  }
-});
-
-var _GraphQLError = require("./GraphQLError");
-
-var _syntaxError = require("./syntaxError");
-
-var _locatedError = require("./locatedError");
-
-var _formatError = require("./formatError");
diff --git a/node_modules/graphql/error/index.js.flow b/node_modules/graphql/error/index.js.flow
deleted file mode 100644
index c920bfc..0000000
--- a/node_modules/graphql/error/index.js.flow
+++ /dev/null
@@ -1,10 +0,0 @@
-// @flow strict
-
-export { GraphQLError, printError } from './GraphQLError';
-
-export { syntaxError } from './syntaxError';
-
-export { locatedError } from './locatedError';
-
-export { formatError } from './formatError';
-export type { GraphQLFormattedError } from './formatError';
diff --git a/node_modules/graphql/error/index.mjs b/node_modules/graphql/error/index.mjs
deleted file mode 100644
index 5ac29d1..0000000
--- a/node_modules/graphql/error/index.mjs
+++ /dev/null
@@ -1,4 +0,0 @@
-export { GraphQLError, printError } from "./GraphQLError.mjs";
-export { syntaxError } from "./syntaxError.mjs";
-export { locatedError } from "./locatedError.mjs";
-export { formatError } from "./formatError.mjs";
diff --git a/node_modules/graphql/error/locatedError.d.ts b/node_modules/graphql/error/locatedError.d.ts
deleted file mode 100644
index 5e9d02d..0000000
--- a/node_modules/graphql/error/locatedError.d.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-
-import { ASTNode } from '../language/ast';
-
-import { GraphQLError } from './GraphQLError';
-
-/**
- * Given an arbitrary Error, presumably thrown while attempting to execute a
- * GraphQL operation, produce a new GraphQLError aware of the location in the
- * document responsible for the original Error.
- */
-export function locatedError(
-  originalError: Error | GraphQLError,
-  nodes: ASTNode | ReadonlyArray<ASTNode> | undefined,
-  path?: Maybe<ReadonlyArray<string | number>>,
-): GraphQLError;
diff --git a/node_modules/graphql/error/locatedError.js b/node_modules/graphql/error/locatedError.js
deleted file mode 100644
index 002c010..0000000
--- a/node_modules/graphql/error/locatedError.js
+++ /dev/null
@@ -1,25 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.locatedError = locatedError;
-
-var _GraphQLError = require("./GraphQLError");
-
-/**
- * Given an arbitrary Error, presumably thrown while attempting to execute a
- * GraphQL operation, produce a new GraphQLError aware of the location in the
- * document responsible for the original Error.
- */
-function locatedError(originalError, nodes, path) {
-  var _nodes;
-
-  // Note: this uses a brand-check to support GraphQL errors originating from
-  // other contexts.
-  if (Array.isArray(originalError.path)) {
-    return originalError;
-  }
-
-  return new _GraphQLError.GraphQLError(originalError.message, (_nodes = originalError.nodes) !== null && _nodes !== void 0 ? _nodes : nodes, originalError.source, originalError.positions, path, originalError);
-}
diff --git a/node_modules/graphql/error/locatedError.js.flow b/node_modules/graphql/error/locatedError.js.flow
deleted file mode 100644
index ceb5426..0000000
--- a/node_modules/graphql/error/locatedError.js.flow
+++ /dev/null
@@ -1,31 +0,0 @@
-// @flow strict
-
-import { type ASTNode } from '../language/ast';
-
-import { GraphQLError } from './GraphQLError';
-
-/**
- * Given an arbitrary Error, presumably thrown while attempting to execute a
- * GraphQL operation, produce a new GraphQLError aware of the location in the
- * document responsible for the original Error.
- */
-export function locatedError(
-  originalError: Error | GraphQLError,
-  nodes: ASTNode | $ReadOnlyArray<ASTNode> | void | null,
-  path?: ?$ReadOnlyArray<string | number>,
-): GraphQLError {
-  // Note: this uses a brand-check to support GraphQL errors originating from
-  // other contexts.
-  if (Array.isArray(originalError.path)) {
-    return (originalError: any);
-  }
-
-  return new GraphQLError(
-    originalError.message,
-    (originalError: any).nodes ?? nodes,
-    (originalError: any).source,
-    (originalError: any).positions,
-    path,
-    originalError,
-  );
-}
diff --git a/node_modules/graphql/error/locatedError.mjs b/node_modules/graphql/error/locatedError.mjs
deleted file mode 100644
index 737f674..0000000
--- a/node_modules/graphql/error/locatedError.mjs
+++ /dev/null
@@ -1,18 +0,0 @@
-import { GraphQLError } from "./GraphQLError.mjs";
-/**
- * Given an arbitrary Error, presumably thrown while attempting to execute a
- * GraphQL operation, produce a new GraphQLError aware of the location in the
- * document responsible for the original Error.
- */
-
-export function locatedError(originalError, nodes, path) {
-  var _nodes;
-
-  // Note: this uses a brand-check to support GraphQL errors originating from
-  // other contexts.
-  if (Array.isArray(originalError.path)) {
-    return originalError;
-  }
-
-  return new GraphQLError(originalError.message, (_nodes = originalError.nodes) !== null && _nodes !== void 0 ? _nodes : nodes, originalError.source, originalError.positions, path, originalError);
-}
diff --git a/node_modules/graphql/error/syntaxError.d.ts b/node_modules/graphql/error/syntaxError.d.ts
deleted file mode 100644
index 1c5413c..0000000
--- a/node_modules/graphql/error/syntaxError.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Source } from '../language/source';
-
-import { GraphQLError } from './GraphQLError';
-
-/**
- * Produces a GraphQLError representing a syntax error, containing useful
- * descriptive information about the syntax error's position in the source.
- */
-export function syntaxError(
-  source: Source,
-  position: number,
-  description: string,
-): GraphQLError;
diff --git a/node_modules/graphql/error/syntaxError.js b/node_modules/graphql/error/syntaxError.js
deleted file mode 100644
index 6e3ceec..0000000
--- a/node_modules/graphql/error/syntaxError.js
+++ /dev/null
@@ -1,16 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.syntaxError = syntaxError;
-
-var _GraphQLError = require("./GraphQLError");
-
-/**
- * Produces a GraphQLError representing a syntax error, containing useful
- * descriptive information about the syntax error's position in the source.
- */
-function syntaxError(source, position, description) {
-  return new _GraphQLError.GraphQLError("Syntax Error: ".concat(description), undefined, source, [position]);
-}
diff --git a/node_modules/graphql/error/syntaxError.js.flow b/node_modules/graphql/error/syntaxError.js.flow
deleted file mode 100644
index c5eeb1d..0000000
--- a/node_modules/graphql/error/syntaxError.js.flow
+++ /dev/null
@@ -1,19 +0,0 @@
-// @flow strict
-
-import { type Source } from '../language/source';
-
-import { GraphQLError } from './GraphQLError';
-
-/**
- * Produces a GraphQLError representing a syntax error, containing useful
- * descriptive information about the syntax error's position in the source.
- */
-export function syntaxError(
-  source: Source,
-  position: number,
-  description: string,
-): GraphQLError {
-  return new GraphQLError(`Syntax Error: ${description}`, undefined, source, [
-    position,
-  ]);
-}
diff --git a/node_modules/graphql/error/syntaxError.mjs b/node_modules/graphql/error/syntaxError.mjs
deleted file mode 100644
index 33aae5a..0000000
--- a/node_modules/graphql/error/syntaxError.mjs
+++ /dev/null
@@ -1,9 +0,0 @@
-import { GraphQLError } from "./GraphQLError.mjs";
-/**
- * Produces a GraphQLError representing a syntax error, containing useful
- * descriptive information about the syntax error's position in the source.
- */
-
-export function syntaxError(source, position, description) {
-  return new GraphQLError("Syntax Error: ".concat(description), undefined, source, [position]);
-}
diff --git a/node_modules/graphql/execution/execute.d.ts b/node_modules/graphql/execution/execute.d.ts
deleted file mode 100644
index 3514e46..0000000
--- a/node_modules/graphql/execution/execute.d.ts
+++ /dev/null
@@ -1,189 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-import { PromiseOrValue } from '../jsutils/PromiseOrValue';
-import { Path } from '../jsutils/Path';
-
-import { GraphQLError } from '../error/GraphQLError';
-
-import {
-  DocumentNode,
-  OperationDefinitionNode,
-  SelectionSetNode,
-  FieldNode,
-  FragmentDefinitionNode,
-} from '../language/ast';
-import { GraphQLSchema } from '../type/schema';
-import {
-  GraphQLField,
-  GraphQLFieldResolver,
-  GraphQLResolveInfo,
-  GraphQLTypeResolver,
-  GraphQLObjectType,
-} from '../type/definition';
-
-/**
- * Data that must be available at all points during query execution.
- *
- * Namely, schema of the type system that is currently executing,
- * and the fragments defined in the query document
- */
-export interface ExecutionContext {
-  schema: GraphQLSchema;
-  fragments: { [key: string]: FragmentDefinitionNode };
-  rootValue: any;
-  contextValue: any;
-  operation: OperationDefinitionNode;
-  variableValues: { [key: string]: any };
-  fieldResolver: GraphQLFieldResolver<any, any>;
-  errors: Array<GraphQLError>;
-}
-
-export interface ExecutionResultDataDefault {
-  [key: string]: any;
-}
-
-/**
- * The result of GraphQL execution.
- *
- *   - `errors` is included when any errors occurred as a non-empty array.
- *   - `data` is the result of a successful execution of the query.
- */
-// TS_SPECIFIC: TData and ExecutionResultDataDefault
-export interface ExecutionResult<TData = ExecutionResultDataDefault> {
-  errors?: ReadonlyArray<GraphQLError>;
-  data?: TData | null;
-}
-
-export type ExecutionArgs = {
-  schema: GraphQLSchema;
-  document: DocumentNode;
-  rootValue?: any;
-  contextValue?: any;
-  variableValues?: Maybe<{ [key: string]: any }>;
-  operationName?: Maybe<string>;
-  fieldResolver?: Maybe<GraphQLFieldResolver<any, any>>;
-  typeResolver?: Maybe<GraphQLTypeResolver<any, any>>;
-};
-
-/**
- * Implements the "Evaluating requests" section of the GraphQL specification.
- *
- * Returns either a synchronous ExecutionResult (if all encountered resolvers
- * are synchronous), or a Promise of an ExecutionResult that will eventually be
- * resolved and never rejected.
- *
- * If the arguments to this function do not result in a legal execution context,
- * a GraphQLError will be thrown immediately explaining the invalid input.
- *
- * Accepts either an object with named arguments, or individual arguments.
- */
-export function execute<TData = ExecutionResultDataDefault>(
-  args: ExecutionArgs,
-): PromiseOrValue<ExecutionResult<TData>>;
-export function execute<TData = ExecutionResultDataDefault>(
-  schema: GraphQLSchema,
-  document: DocumentNode,
-  rootValue?: any,
-  contextValue?: any,
-  variableValues?: Maybe<{ [key: string]: any }>,
-  operationName?: Maybe<string>,
-  fieldResolver?: Maybe<GraphQLFieldResolver<any, any>>,
-  typeResolver?: Maybe<GraphQLTypeResolver<any, any>>,
-): PromiseOrValue<ExecutionResult<TData>>;
-
-/**
- * Essential assertions before executing to provide developer feedback for
- * improper use of the GraphQL library.
- */
-export function assertValidExecutionArguments(
-  schema: GraphQLSchema,
-  document: DocumentNode,
-  rawVariableValues: Maybe<{ [key: string]: any }>,
-): void;
-
-/**
- * Constructs a ExecutionContext object from the arguments passed to
- * execute, which we will pass throughout the other execution methods.
- *
- * Throws a GraphQLError if a valid execution context cannot be created.
- */
-export function buildExecutionContext(
-  schema: GraphQLSchema,
-  document: DocumentNode,
-  rootValue: any,
-  contextValue: any,
-  rawVariableValues: Maybe<{ [key: string]: any }>,
-  operationName: Maybe<string>,
-  fieldResolver: Maybe<GraphQLFieldResolver<any, any>>,
-  typeResolver?: Maybe<GraphQLTypeResolver<any, any>>,
-): ReadonlyArray<GraphQLError> | ExecutionContext;
-
-/**
- * Given a selectionSet, adds all of the fields in that selection to
- * the passed in map of fields, and returns it at the end.
- *
- * CollectFields requires the "runtime type" of an object. For a field which
- * returns an Interface or Union type, the "runtime type" will be the actual
- * Object type returned by that field.
- */
-export function collectFields(
-  exeContext: ExecutionContext,
-  runtimeType: GraphQLObjectType,
-  selectionSet: SelectionSetNode,
-  fields: { [key: string]: Array<FieldNode> },
-  visitedFragmentNames: { [key: string]: boolean },
-): { [key: string]: Array<FieldNode> };
-
-export function buildResolveInfo(
-  exeContext: ExecutionContext,
-  fieldDef: GraphQLField<any, any>,
-  fieldNodes: ReadonlyArray<FieldNode>,
-  parentType: GraphQLObjectType,
-  path: Path,
-): GraphQLResolveInfo;
-
-// Isolates the "ReturnOrAbrupt" behavior to not de-opt the `resolveField`
-// function. Returns the result of resolveFn or the abrupt-return Error object.
-// TS_SPECIFIC: TSource
-export function resolveFieldValueOrError<TSource>(
-  exeContext: ExecutionContext,
-  fieldDef: GraphQLField<TSource, any>,
-  fieldNodes: ReadonlyArray<FieldNode>,
-  resolveFn: GraphQLFieldResolver<TSource, any>,
-  source: TSource,
-  info: GraphQLResolveInfo,
-): Error | any;
-
-/**
- * If a resolveType function is not given, then a default resolve behavior is
- * used which attempts two strategies:
- *
- * First, See if the provided value has a `__typename` field defined, if so, use
- * that value as name of the resolved type.
- *
- * Otherwise, test each possible type for the abstract type by calling
- * isTypeOf for the object being coerced, returning the first type that matches.
- */
-export const defaultTypeResolver: GraphQLTypeResolver<any, any>;
-
-/**
- * If a resolve function is not given, then a default resolve behavior is used
- * which takes the property of the source object of the same name as the field
- * and returns it as the result, or if it's a function, returns the result
- * of calling that function while passing along args and context.
- */
-export const defaultFieldResolver: GraphQLFieldResolver<any, any>;
-
-/**
- * This method looks up the field on the given type definition.
- * It has special casing for the two introspection fields, __schema
- * and __typename. __typename is special because it can always be
- * queried as a field, even in situations where no other fields
- * are allowed, like on a Union. __schema could get automatically
- * added to the query type, but that would require mutating type
- * definitions, which would cause issues.
- */
-export function getFieldDef(
-  schema: GraphQLSchema,
-  parentType: GraphQLObjectType,
-  fieldName: string,
-): Maybe<GraphQLField<any, any>>;
diff --git a/node_modules/graphql/execution/execute.js b/node_modules/graphql/execution/execute.js
deleted file mode 100644
index 859adbe..0000000
--- a/node_modules/graphql/execution/execute.js
+++ /dev/null
@@ -1,851 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.execute = execute;
-exports.assertValidExecutionArguments = assertValidExecutionArguments;
-exports.buildExecutionContext = buildExecutionContext;
-exports.collectFields = collectFields;
-exports.buildResolveInfo = buildResolveInfo;
-exports.resolveFieldValueOrError = resolveFieldValueOrError;
-exports.getFieldDef = getFieldDef;
-exports.defaultFieldResolver = exports.defaultTypeResolver = void 0;
-
-var _arrayFrom = _interopRequireDefault(require("../polyfills/arrayFrom"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _memoize = _interopRequireDefault(require("../jsutils/memoize3"));
-
-var _invariant = _interopRequireDefault(require("../jsutils/invariant"));
-
-var _devAssert = _interopRequireDefault(require("../jsutils/devAssert"));
-
-var _isPromise = _interopRequireDefault(require("../jsutils/isPromise"));
-
-var _isObjectLike = _interopRequireDefault(require("../jsutils/isObjectLike"));
-
-var _isCollection = _interopRequireDefault(require("../jsutils/isCollection"));
-
-var _promiseReduce = _interopRequireDefault(require("../jsutils/promiseReduce"));
-
-var _promiseForObject = _interopRequireDefault(require("../jsutils/promiseForObject"));
-
-var _Path = require("../jsutils/Path");
-
-var _GraphQLError = require("../error/GraphQLError");
-
-var _locatedError = require("../error/locatedError");
-
-var _kinds = require("../language/kinds");
-
-var _validate = require("../type/validate");
-
-var _introspection = require("../type/introspection");
-
-var _directives = require("../type/directives");
-
-var _definition = require("../type/definition");
-
-var _typeFromAST = require("../utilities/typeFromAST");
-
-var _getOperationRootType = require("../utilities/getOperationRootType");
-
-var _values = require("./values");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function execute(argsOrSchema, document, rootValue, contextValue, variableValues, operationName, fieldResolver, typeResolver) {
-  /* eslint-enable no-redeclare */
-  // Extract arguments from object args if provided.
-  return arguments.length === 1 ? executeImpl(argsOrSchema) : executeImpl({
-    schema: argsOrSchema,
-    document: document,
-    rootValue: rootValue,
-    contextValue: contextValue,
-    variableValues: variableValues,
-    operationName: operationName,
-    fieldResolver: fieldResolver,
-    typeResolver: typeResolver
-  });
-}
-
-function executeImpl(args) {
-  var schema = args.schema,
-      document = args.document,
-      rootValue = args.rootValue,
-      contextValue = args.contextValue,
-      variableValues = args.variableValues,
-      operationName = args.operationName,
-      fieldResolver = args.fieldResolver,
-      typeResolver = args.typeResolver; // If arguments are missing or incorrect, throw an error.
-
-  assertValidExecutionArguments(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments,
-  // a "Response" with only errors is returned.
-
-  var exeContext = buildExecutionContext(schema, document, rootValue, contextValue, variableValues, operationName, fieldResolver, typeResolver); // Return early errors if execution context failed.
-
-  if (Array.isArray(exeContext)) {
-    return {
-      errors: exeContext
-    };
-  } // Return a Promise that will eventually resolve to the data described by
-  // The "Response" section of the GraphQL specification.
-  //
-  // If errors are encountered while executing a GraphQL field, only that
-  // field and its descendants will be omitted, and sibling fields will still
-  // be executed. An execution which encounters errors will still result in a
-  // resolved Promise.
-
-
-  var data = executeOperation(exeContext, exeContext.operation, rootValue);
-  return buildResponse(exeContext, data);
-}
-/**
- * Given a completed execution context and data, build the { errors, data }
- * response defined by the "Response" section of the GraphQL specification.
- */
-
-
-function buildResponse(exeContext, data) {
-  if ((0, _isPromise.default)(data)) {
-    return data.then(function (resolved) {
-      return buildResponse(exeContext, resolved);
-    });
-  }
-
-  return exeContext.errors.length === 0 ? {
-    data: data
-  } : {
-    errors: exeContext.errors,
-    data: data
-  };
-}
-/**
- * Essential assertions before executing to provide developer feedback for
- * improper use of the GraphQL library.
- *
- * @internal
- */
-
-
-function assertValidExecutionArguments(schema, document, rawVariableValues) {
-  document || (0, _devAssert.default)(0, 'Must provide document.'); // If the schema used for execution is invalid, throw an error.
-
-  (0, _validate.assertValidSchema)(schema); // Variables, if provided, must be an object.
-
-  rawVariableValues == null || (0, _isObjectLike.default)(rawVariableValues) || (0, _devAssert.default)(0, 'Variables must be provided as an Object where each property is a variable value. Perhaps look to see if an unparsed JSON string was provided.');
-}
-/**
- * Constructs a ExecutionContext object from the arguments passed to
- * execute, which we will pass throughout the other execution methods.
- *
- * Throws a GraphQLError if a valid execution context cannot be created.
- *
- * @internal
- */
-
-
-function buildExecutionContext(schema, document, rootValue, contextValue, rawVariableValues, operationName, fieldResolver, typeResolver) {
-  var _definition$name, _operation$variableDe;
-
-  var operation;
-  var fragments = Object.create(null);
-
-  for (var _i2 = 0, _document$definitions2 = document.definitions; _i2 < _document$definitions2.length; _i2++) {
-    var definition = _document$definitions2[_i2];
-
-    switch (definition.kind) {
-      case _kinds.Kind.OPERATION_DEFINITION:
-        if (operationName == null) {
-          if (operation !== undefined) {
-            return [new _GraphQLError.GraphQLError('Must provide operation name if query contains multiple operations.')];
-          }
-
-          operation = definition;
-        } else if (((_definition$name = definition.name) === null || _definition$name === void 0 ? void 0 : _definition$name.value) === operationName) {
-          operation = definition;
-        }
-
-        break;
-
-      case _kinds.Kind.FRAGMENT_DEFINITION:
-        fragments[definition.name.value] = definition;
-        break;
-    }
-  }
-
-  if (!operation) {
-    if (operationName != null) {
-      return [new _GraphQLError.GraphQLError("Unknown operation named \"".concat(operationName, "\"."))];
-    }
-
-    return [new _GraphQLError.GraphQLError('Must provide an operation.')];
-  }
-  /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-
-  var variableDefinitions = (_operation$variableDe = operation.variableDefinitions) !== null && _operation$variableDe !== void 0 ? _operation$variableDe : [];
-  var coercedVariableValues = (0, _values.getVariableValues)(schema, variableDefinitions, rawVariableValues !== null && rawVariableValues !== void 0 ? rawVariableValues : {}, {
-    maxErrors: 50
-  });
-
-  if (coercedVariableValues.errors) {
-    return coercedVariableValues.errors;
-  }
-
-  return {
-    schema: schema,
-    fragments: fragments,
-    rootValue: rootValue,
-    contextValue: contextValue,
-    operation: operation,
-    variableValues: coercedVariableValues.coerced,
-    fieldResolver: fieldResolver !== null && fieldResolver !== void 0 ? fieldResolver : defaultFieldResolver,
-    typeResolver: typeResolver !== null && typeResolver !== void 0 ? typeResolver : defaultTypeResolver,
-    errors: []
-  };
-}
-/**
- * Implements the "Evaluating operations" section of the spec.
- */
-
-
-function executeOperation(exeContext, operation, rootValue) {
-  var type = (0, _getOperationRootType.getOperationRootType)(exeContext.schema, operation);
-  var fields = collectFields(exeContext, type, operation.selectionSet, Object.create(null), Object.create(null));
-  var path = undefined; // Errors from sub-fields of a NonNull type may propagate to the top level,
-  // at which point we still log the error and null the parent field, which
-  // in this case is the entire response.
-  //
-  // Similar to completeValueCatchingError.
-
-  try {
-    var result = operation.operation === 'mutation' ? executeFieldsSerially(exeContext, type, rootValue, path, fields) : executeFields(exeContext, type, rootValue, path, fields);
-
-    if ((0, _isPromise.default)(result)) {
-      return result.then(undefined, function (error) {
-        exeContext.errors.push(error);
-        return Promise.resolve(null);
-      });
-    }
-
-    return result;
-  } catch (error) {
-    exeContext.errors.push(error);
-    return null;
-  }
-}
-/**
- * Implements the "Evaluating selection sets" section of the spec
- * for "write" mode.
- */
-
-
-function executeFieldsSerially(exeContext, parentType, sourceValue, path, fields) {
-  return (0, _promiseReduce.default)(Object.keys(fields), function (results, responseName) {
-    var fieldNodes = fields[responseName];
-    var fieldPath = (0, _Path.addPath)(path, responseName);
-    var result = resolveField(exeContext, parentType, sourceValue, fieldNodes, fieldPath);
-
-    if (result === undefined) {
-      return results;
-    }
-
-    if ((0, _isPromise.default)(result)) {
-      return result.then(function (resolvedResult) {
-        results[responseName] = resolvedResult;
-        return results;
-      });
-    }
-
-    results[responseName] = result;
-    return results;
-  }, Object.create(null));
-}
-/**
- * Implements the "Evaluating selection sets" section of the spec
- * for "read" mode.
- */
-
-
-function executeFields(exeContext, parentType, sourceValue, path, fields) {
-  var results = Object.create(null);
-  var containsPromise = false;
-
-  for (var _i4 = 0, _Object$keys2 = Object.keys(fields); _i4 < _Object$keys2.length; _i4++) {
-    var responseName = _Object$keys2[_i4];
-    var fieldNodes = fields[responseName];
-    var fieldPath = (0, _Path.addPath)(path, responseName);
-    var result = resolveField(exeContext, parentType, sourceValue, fieldNodes, fieldPath);
-
-    if (result !== undefined) {
-      results[responseName] = result;
-
-      if (!containsPromise && (0, _isPromise.default)(result)) {
-        containsPromise = true;
-      }
-    }
-  } // If there are no promises, we can just return the object
-
-
-  if (!containsPromise) {
-    return results;
-  } // Otherwise, results is a map from field name to the result of resolving that
-  // field, which is possibly a promise. Return a promise that will return this
-  // same map, but with any promises replaced with the values they resolved to.
-
-
-  return (0, _promiseForObject.default)(results);
-}
-/**
- * Given a selectionSet, adds all of the fields in that selection to
- * the passed in map of fields, and returns it at the end.
- *
- * CollectFields requires the "runtime type" of an object. For a field which
- * returns an Interface or Union type, the "runtime type" will be the actual
- * Object type returned by that field.
- *
- * @internal
- */
-
-
-function collectFields(exeContext, runtimeType, selectionSet, fields, visitedFragmentNames) {
-  for (var _i6 = 0, _selectionSet$selecti2 = selectionSet.selections; _i6 < _selectionSet$selecti2.length; _i6++) {
-    var selection = _selectionSet$selecti2[_i6];
-
-    switch (selection.kind) {
-      case _kinds.Kind.FIELD:
-        {
-          if (!shouldIncludeNode(exeContext, selection)) {
-            continue;
-          }
-
-          var name = getFieldEntryKey(selection);
-
-          if (!fields[name]) {
-            fields[name] = [];
-          }
-
-          fields[name].push(selection);
-          break;
-        }
-
-      case _kinds.Kind.INLINE_FRAGMENT:
-        {
-          if (!shouldIncludeNode(exeContext, selection) || !doesFragmentConditionMatch(exeContext, selection, runtimeType)) {
-            continue;
-          }
-
-          collectFields(exeContext, runtimeType, selection.selectionSet, fields, visitedFragmentNames);
-          break;
-        }
-
-      case _kinds.Kind.FRAGMENT_SPREAD:
-        {
-          var fragName = selection.name.value;
-
-          if (visitedFragmentNames[fragName] || !shouldIncludeNode(exeContext, selection)) {
-            continue;
-          }
-
-          visitedFragmentNames[fragName] = true;
-          var fragment = exeContext.fragments[fragName];
-
-          if (!fragment || !doesFragmentConditionMatch(exeContext, fragment, runtimeType)) {
-            continue;
-          }
-
-          collectFields(exeContext, runtimeType, fragment.selectionSet, fields, visitedFragmentNames);
-          break;
-        }
-    }
-  }
-
-  return fields;
-}
-/**
- * Determines if a field should be included based on the @include and @skip
- * directives, where @skip has higher precedence than @include.
- */
-
-
-function shouldIncludeNode(exeContext, node) {
-  var skip = (0, _values.getDirectiveValues)(_directives.GraphQLSkipDirective, node, exeContext.variableValues);
-
-  if ((skip === null || skip === void 0 ? void 0 : skip.if) === true) {
-    return false;
-  }
-
-  var include = (0, _values.getDirectiveValues)(_directives.GraphQLIncludeDirective, node, exeContext.variableValues);
-
-  if ((include === null || include === void 0 ? void 0 : include.if) === false) {
-    return false;
-  }
-
-  return true;
-}
-/**
- * Determines if a fragment is applicable to the given type.
- */
-
-
-function doesFragmentConditionMatch(exeContext, fragment, type) {
-  var typeConditionNode = fragment.typeCondition;
-
-  if (!typeConditionNode) {
-    return true;
-  }
-
-  var conditionalType = (0, _typeFromAST.typeFromAST)(exeContext.schema, typeConditionNode);
-
-  if (conditionalType === type) {
-    return true;
-  }
-
-  if ((0, _definition.isAbstractType)(conditionalType)) {
-    return exeContext.schema.isSubType(conditionalType, type);
-  }
-
-  return false;
-}
-/**
- * Implements the logic to compute the key of a given field's entry
- */
-
-
-function getFieldEntryKey(node) {
-  return node.alias ? node.alias.value : node.name.value;
-}
-/**
- * Resolves the field on the given source object. In particular, this
- * figures out the value that the field returns by calling its resolve function,
- * then calls completeValue to complete promises, serialize scalars, or execute
- * the sub-selection-set for objects.
- */
-
-
-function resolveField(exeContext, parentType, source, fieldNodes, path) {
-  var _fieldDef$resolve;
-
-  var fieldNode = fieldNodes[0];
-  var fieldName = fieldNode.name.value;
-  var fieldDef = getFieldDef(exeContext.schema, parentType, fieldName);
-
-  if (!fieldDef) {
-    return;
-  }
-
-  var resolveFn = (_fieldDef$resolve = fieldDef.resolve) !== null && _fieldDef$resolve !== void 0 ? _fieldDef$resolve : exeContext.fieldResolver;
-  var info = buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path); // Get the resolve function, regardless of if its result is normal
-  // or abrupt (error).
-
-  var result = resolveFieldValueOrError(exeContext, fieldDef, fieldNodes, resolveFn, source, info);
-  return completeValueCatchingError(exeContext, fieldDef.type, fieldNodes, info, path, result);
-}
-/**
- * @internal
- */
-
-
-function buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path) {
-  // The resolve function's optional fourth argument is a collection of
-  // information about the current execution state.
-  return {
-    fieldName: fieldDef.name,
-    fieldNodes: fieldNodes,
-    returnType: fieldDef.type,
-    parentType: parentType,
-    path: path,
-    schema: exeContext.schema,
-    fragments: exeContext.fragments,
-    rootValue: exeContext.rootValue,
-    operation: exeContext.operation,
-    variableValues: exeContext.variableValues
-  };
-}
-/**
- * Isolates the "ReturnOrAbrupt" behavior to not de-opt the `resolveField`
- * function. Returns the result of resolveFn or the abrupt-return Error object.
- *
- * @internal
- */
-
-
-function resolveFieldValueOrError(exeContext, fieldDef, fieldNodes, resolveFn, source, info) {
-  try {
-    // Build a JS object of arguments from the field.arguments AST, using the
-    // variables scope to fulfill any variable references.
-    // TODO: find a way to memoize, in case this field is within a List type.
-    var args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], exeContext.variableValues); // The resolve function's optional third argument is a context value that
-    // is provided to every resolve function within an execution. It is commonly
-    // used to represent an authenticated user, or request-specific caches.
-
-    var _contextValue = exeContext.contextValue;
-    var result = resolveFn(source, args, _contextValue, info);
-    return (0, _isPromise.default)(result) ? result.then(undefined, asErrorInstance) : result;
-  } catch (error) {
-    return asErrorInstance(error);
-  }
-} // Sometimes a non-error is thrown, wrap it as an Error instance to ensure a
-// consistent Error interface.
-
-
-function asErrorInstance(error) {
-  if (error instanceof Error) {
-    return error;
-  }
-
-  return new Error('Unexpected error value: ' + (0, _inspect.default)(error));
-} // This is a small wrapper around completeValue which detects and logs errors
-// in the execution context.
-
-
-function completeValueCatchingError(exeContext, returnType, fieldNodes, info, path, result) {
-  try {
-    var completed;
-
-    if ((0, _isPromise.default)(result)) {
-      completed = result.then(function (resolved) {
-        return completeValue(exeContext, returnType, fieldNodes, info, path, resolved);
-      });
-    } else {
-      completed = completeValue(exeContext, returnType, fieldNodes, info, path, result);
-    }
-
-    if ((0, _isPromise.default)(completed)) {
-      // Note: we don't rely on a `catch` method, but we do expect "thenable"
-      // to take a second callback for the error case.
-      return completed.then(undefined, function (error) {
-        return handleFieldError(error, fieldNodes, path, returnType, exeContext);
-      });
-    }
-
-    return completed;
-  } catch (error) {
-    return handleFieldError(error, fieldNodes, path, returnType, exeContext);
-  }
-}
-
-function handleFieldError(rawError, fieldNodes, path, returnType, exeContext) {
-  var error = (0, _locatedError.locatedError)(asErrorInstance(rawError), fieldNodes, (0, _Path.pathToArray)(path)); // If the field type is non-nullable, then it is resolved without any
-  // protection from errors, however it still properly locates the error.
-
-  if ((0, _definition.isNonNullType)(returnType)) {
-    throw error;
-  } // Otherwise, error protection is applied, logging the error and resolving
-  // a null value for this field if one is encountered.
-
-
-  exeContext.errors.push(error);
-  return null;
-}
-/**
- * Implements the instructions for completeValue as defined in the
- * "Field entries" section of the spec.
- *
- * If the field type is Non-Null, then this recursively completes the value
- * for the inner type. It throws a field error if that completion returns null,
- * as per the "Nullability" section of the spec.
- *
- * If the field type is a List, then this recursively completes the value
- * for the inner type on each item in the list.
- *
- * If the field type is a Scalar or Enum, ensures the completed value is a legal
- * value of the type by calling the `serialize` method of GraphQL type
- * definition.
- *
- * If the field is an abstract type, determine the runtime type of the value
- * and then complete based on that type
- *
- * Otherwise, the field type expects a sub-selection set, and will complete the
- * value by evaluating all sub-selections.
- */
-
-
-function completeValue(exeContext, returnType, fieldNodes, info, path, result) {
-  // If result is an Error, throw a located error.
-  if (result instanceof Error) {
-    throw result;
-  } // If field type is NonNull, complete for inner type, and throw field error
-  // if result is null.
-
-
-  if ((0, _definition.isNonNullType)(returnType)) {
-    var completed = completeValue(exeContext, returnType.ofType, fieldNodes, info, path, result);
-
-    if (completed === null) {
-      throw new Error("Cannot return null for non-nullable field ".concat(info.parentType.name, ".").concat(info.fieldName, "."));
-    }
-
-    return completed;
-  } // If result value is null or undefined then return null.
-
-
-  if (result == null) {
-    return null;
-  } // If field type is List, complete each item in the list with the inner type
-
-
-  if ((0, _definition.isListType)(returnType)) {
-    return completeListValue(exeContext, returnType, fieldNodes, info, path, result);
-  } // If field type is a leaf type, Scalar or Enum, serialize to a valid value,
-  // returning null if serialization is not possible.
-
-
-  if ((0, _definition.isLeafType)(returnType)) {
-    return completeLeafValue(returnType, result);
-  } // If field type is an abstract type, Interface or Union, determine the
-  // runtime Object type and complete for that type.
-
-
-  if ((0, _definition.isAbstractType)(returnType)) {
-    return completeAbstractValue(exeContext, returnType, fieldNodes, info, path, result);
-  } // If field type is Object, execute and complete all sub-selections.
-
-
-  /* istanbul ignore else */
-  if ((0, _definition.isObjectType)(returnType)) {
-    return completeObjectValue(exeContext, returnType, fieldNodes, info, path, result);
-  } // Not reachable. All possible output types have been considered.
-
-
-  /* istanbul ignore next */
-  (0, _invariant.default)(false, 'Cannot complete value of unexpected output type: ' + (0, _inspect.default)(returnType));
-}
-/**
- * Complete a list value by completing each item in the list with the
- * inner type
- */
-
-
-function completeListValue(exeContext, returnType, fieldNodes, info, path, result) {
-  if (!(0, _isCollection.default)(result)) {
-    throw new _GraphQLError.GraphQLError("Expected Iterable, but did not find one for field \"".concat(info.parentType.name, ".").concat(info.fieldName, "\"."));
-  } // This is specified as a simple map, however we're optimizing the path
-  // where the list contains no Promises by avoiding creating another Promise.
-
-
-  var itemType = returnType.ofType;
-  var containsPromise = false;
-  var completedResults = (0, _arrayFrom.default)(result, function (item, index) {
-    // No need to modify the info object containing the path,
-    // since from here on it is not ever accessed by resolver functions.
-    var fieldPath = (0, _Path.addPath)(path, index);
-    var completedItem = completeValueCatchingError(exeContext, itemType, fieldNodes, info, fieldPath, item);
-
-    if (!containsPromise && (0, _isPromise.default)(completedItem)) {
-      containsPromise = true;
-    }
-
-    return completedItem;
-  });
-  return containsPromise ? Promise.all(completedResults) : completedResults;
-}
-/**
- * Complete a Scalar or Enum by serializing to a valid value, returning
- * null if serialization is not possible.
- */
-
-
-function completeLeafValue(returnType, result) {
-  var serializedResult = returnType.serialize(result);
-
-  if (serializedResult === undefined) {
-    throw new Error("Expected a value of type \"".concat((0, _inspect.default)(returnType), "\" but ") + "received: ".concat((0, _inspect.default)(result)));
-  }
-
-  return serializedResult;
-}
-/**
- * Complete a value of an abstract type by determining the runtime object type
- * of that value, then complete the value for that type.
- */
-
-
-function completeAbstractValue(exeContext, returnType, fieldNodes, info, path, result) {
-  var _returnType$resolveTy;
-
-  var resolveTypeFn = (_returnType$resolveTy = returnType.resolveType) !== null && _returnType$resolveTy !== void 0 ? _returnType$resolveTy : exeContext.typeResolver;
-  var contextValue = exeContext.contextValue;
-  var runtimeType = resolveTypeFn(result, contextValue, info, returnType);
-
-  if ((0, _isPromise.default)(runtimeType)) {
-    return runtimeType.then(function (resolvedRuntimeType) {
-      return completeObjectValue(exeContext, ensureValidRuntimeType(resolvedRuntimeType, exeContext, returnType, fieldNodes, info, result), fieldNodes, info, path, result);
-    });
-  }
-
-  return completeObjectValue(exeContext, ensureValidRuntimeType(runtimeType, exeContext, returnType, fieldNodes, info, result), fieldNodes, info, path, result);
-}
-
-function ensureValidRuntimeType(runtimeTypeOrName, exeContext, returnType, fieldNodes, info, result) {
-  var runtimeType = typeof runtimeTypeOrName === 'string' ? exeContext.schema.getType(runtimeTypeOrName) : runtimeTypeOrName;
-
-  if (!(0, _definition.isObjectType)(runtimeType)) {
-    throw new _GraphQLError.GraphQLError("Abstract type \"".concat(returnType.name, "\" must resolve to an Object type at runtime for field \"").concat(info.parentType.name, ".").concat(info.fieldName, "\" with ") + "value ".concat((0, _inspect.default)(result), ", received \"").concat((0, _inspect.default)(runtimeType), "\". ") + "Either the \"".concat(returnType.name, "\" type should provide a \"resolveType\" function or each possible type should provide an \"isTypeOf\" function."), fieldNodes);
-  }
-
-  if (!exeContext.schema.isSubType(returnType, runtimeType)) {
-    throw new _GraphQLError.GraphQLError("Runtime Object type \"".concat(runtimeType.name, "\" is not a possible type for \"").concat(returnType.name, "\"."), fieldNodes);
-  }
-
-  return runtimeType;
-}
-/**
- * Complete an Object value by executing all sub-selections.
- */
-
-
-function completeObjectValue(exeContext, returnType, fieldNodes, info, path, result) {
-  // If there is an isTypeOf predicate function, call it with the
-  // current result. If isTypeOf returns false, then raise an error rather
-  // than continuing execution.
-  if (returnType.isTypeOf) {
-    var isTypeOf = returnType.isTypeOf(result, exeContext.contextValue, info);
-
-    if ((0, _isPromise.default)(isTypeOf)) {
-      return isTypeOf.then(function (resolvedIsTypeOf) {
-        if (!resolvedIsTypeOf) {
-          throw invalidReturnTypeError(returnType, result, fieldNodes);
-        }
-
-        return collectAndExecuteSubfields(exeContext, returnType, fieldNodes, path, result);
-      });
-    }
-
-    if (!isTypeOf) {
-      throw invalidReturnTypeError(returnType, result, fieldNodes);
-    }
-  }
-
-  return collectAndExecuteSubfields(exeContext, returnType, fieldNodes, path, result);
-}
-
-function invalidReturnTypeError(returnType, result, fieldNodes) {
-  return new _GraphQLError.GraphQLError("Expected value of type \"".concat(returnType.name, "\" but got: ").concat((0, _inspect.default)(result), "."), fieldNodes);
-}
-
-function collectAndExecuteSubfields(exeContext, returnType, fieldNodes, path, result) {
-  // Collect sub-fields to execute to complete this value.
-  var subFieldNodes = collectSubfields(exeContext, returnType, fieldNodes);
-  return executeFields(exeContext, returnType, result, path, subFieldNodes);
-}
-/**
- * A memoized collection of relevant subfields with regard to the return
- * type. Memoizing ensures the subfields are not repeatedly calculated, which
- * saves overhead when resolving lists of values.
- */
-
-
-var collectSubfields = (0, _memoize.default)(_collectSubfields);
-
-function _collectSubfields(exeContext, returnType, fieldNodes) {
-  var subFieldNodes = Object.create(null);
-  var visitedFragmentNames = Object.create(null);
-
-  for (var _i8 = 0; _i8 < fieldNodes.length; _i8++) {
-    var node = fieldNodes[_i8];
-
-    if (node.selectionSet) {
-      subFieldNodes = collectFields(exeContext, returnType, node.selectionSet, subFieldNodes, visitedFragmentNames);
-    }
-  }
-
-  return subFieldNodes;
-}
-/**
- * If a resolveType function is not given, then a default resolve behavior is
- * used which attempts two strategies:
- *
- * First, See if the provided value has a `__typename` field defined, if so, use
- * that value as name of the resolved type.
- *
- * Otherwise, test each possible type for the abstract type by calling
- * isTypeOf for the object being coerced, returning the first type that matches.
- */
-
-
-var defaultTypeResolver = function defaultTypeResolver(value, contextValue, info, abstractType) {
-  // First, look for `__typename`.
-  if ((0, _isObjectLike.default)(value) && typeof value.__typename === 'string') {
-    return value.__typename;
-  } // Otherwise, test each possible type.
-
-
-  var possibleTypes = info.schema.getPossibleTypes(abstractType);
-  var promisedIsTypeOfResults = [];
-
-  for (var i = 0; i < possibleTypes.length; i++) {
-    var type = possibleTypes[i];
-
-    if (type.isTypeOf) {
-      var isTypeOfResult = type.isTypeOf(value, contextValue, info);
-
-      if ((0, _isPromise.default)(isTypeOfResult)) {
-        promisedIsTypeOfResults[i] = isTypeOfResult;
-      } else if (isTypeOfResult) {
-        return type;
-      }
-    }
-  }
-
-  if (promisedIsTypeOfResults.length) {
-    return Promise.all(promisedIsTypeOfResults).then(function (isTypeOfResults) {
-      for (var _i9 = 0; _i9 < isTypeOfResults.length; _i9++) {
-        if (isTypeOfResults[_i9]) {
-          return possibleTypes[_i9];
-        }
-      }
-    });
-  }
-};
-/**
- * If a resolve function is not given, then a default resolve behavior is used
- * which takes the property of the source object of the same name as the field
- * and returns it as the result, or if it's a function, returns the result
- * of calling that function while passing along args and context value.
- */
-
-
-exports.defaultTypeResolver = defaultTypeResolver;
-
-var defaultFieldResolver = function defaultFieldResolver(source, args, contextValue, info) {
-  // ensure source is a value for which property access is acceptable.
-  if ((0, _isObjectLike.default)(source) || typeof source === 'function') {
-    var property = source[info.fieldName];
-
-    if (typeof property === 'function') {
-      return source[info.fieldName](args, contextValue, info);
-    }
-
-    return property;
-  }
-};
-/**
- * This method looks up the field on the given type definition.
- * It has special casing for the two introspection fields, __schema
- * and __typename. __typename is special because it can always be
- * queried as a field, even in situations where no other fields
- * are allowed, like on a Union. __schema could get automatically
- * added to the query type, but that would require mutating type
- * definitions, which would cause issues.
- *
- * @internal
- */
-
-
-exports.defaultFieldResolver = defaultFieldResolver;
-
-function getFieldDef(schema, parentType, fieldName) {
-  if (fieldName === _introspection.SchemaMetaFieldDef.name && schema.getQueryType() === parentType) {
-    return _introspection.SchemaMetaFieldDef;
-  } else if (fieldName === _introspection.TypeMetaFieldDef.name && schema.getQueryType() === parentType) {
-    return _introspection.TypeMetaFieldDef;
-  } else if (fieldName === _introspection.TypeNameMetaFieldDef.name) {
-    return _introspection.TypeNameMetaFieldDef;
-  }
-
-  return parentType.getFields()[fieldName];
-}
diff --git a/node_modules/graphql/execution/execute.js.flow b/node_modules/graphql/execution/execute.js.flow
deleted file mode 100644
index 970e644..0000000
--- a/node_modules/graphql/execution/execute.js.flow
+++ /dev/null
@@ -1,1231 +0,0 @@
-// @flow strict
-
-import arrayFrom from '../polyfills/arrayFrom';
-
-import inspect from '../jsutils/inspect';
-import memoize3 from '../jsutils/memoize3';
-import invariant from '../jsutils/invariant';
-import devAssert from '../jsutils/devAssert';
-import isPromise from '../jsutils/isPromise';
-import { type ObjMap } from '../jsutils/ObjMap';
-import isObjectLike from '../jsutils/isObjectLike';
-import isCollection from '../jsutils/isCollection';
-import promiseReduce from '../jsutils/promiseReduce';
-import promiseForObject from '../jsutils/promiseForObject';
-import { type PromiseOrValue } from '../jsutils/PromiseOrValue';
-import { type Path, addPath, pathToArray } from '../jsutils/Path';
-
-import { GraphQLError } from '../error/GraphQLError';
-import { locatedError } from '../error/locatedError';
-
-import { Kind } from '../language/kinds';
-import {
-  type DocumentNode,
-  type OperationDefinitionNode,
-  type SelectionSetNode,
-  type FieldNode,
-  type FragmentSpreadNode,
-  type InlineFragmentNode,
-  type FragmentDefinitionNode,
-} from '../language/ast';
-
-import { assertValidSchema } from '../type/validate';
-import { type GraphQLSchema } from '../type/schema';
-import {
-  SchemaMetaFieldDef,
-  TypeMetaFieldDef,
-  TypeNameMetaFieldDef,
-} from '../type/introspection';
-import {
-  GraphQLIncludeDirective,
-  GraphQLSkipDirective,
-} from '../type/directives';
-import {
-  type GraphQLObjectType,
-  type GraphQLOutputType,
-  type GraphQLLeafType,
-  type GraphQLAbstractType,
-  type GraphQLField,
-  type GraphQLFieldResolver,
-  type GraphQLResolveInfo,
-  type GraphQLTypeResolver,
-  type GraphQLList,
-  isObjectType,
-  isAbstractType,
-  isLeafType,
-  isListType,
-  isNonNullType,
-} from '../type/definition';
-
-import { typeFromAST } from '../utilities/typeFromAST';
-import { getOperationRootType } from '../utilities/getOperationRootType';
-
-import {
-  getVariableValues,
-  getArgumentValues,
-  getDirectiveValues,
-} from './values';
-
-/**
- * Terminology
- *
- * "Definitions" are the generic name for top-level statements in the document.
- * Examples of this include:
- * 1) Operations (such as a query)
- * 2) Fragments
- *
- * "Operations" are a generic name for requests in the document.
- * Examples of this include:
- * 1) query,
- * 2) mutation
- *
- * "Selections" are the definitions that can appear legally and at
- * single level of the query. These include:
- * 1) field references e.g "a"
- * 2) fragment "spreads" e.g. "...c"
- * 3) inline fragment "spreads" e.g. "...on Type { a }"
- */
-
-/**
- * Data that must be available at all points during query execution.
- *
- * Namely, schema of the type system that is currently executing,
- * and the fragments defined in the query document
- */
-export type ExecutionContext = {|
-  schema: GraphQLSchema,
-  fragments: ObjMap<FragmentDefinitionNode>,
-  rootValue: mixed,
-  contextValue: mixed,
-  operation: OperationDefinitionNode,
-  variableValues: { [variable: string]: mixed, ... },
-  fieldResolver: GraphQLFieldResolver<any, any>,
-  typeResolver: GraphQLTypeResolver<any, any>,
-  errors: Array<GraphQLError>,
-|};
-
-/**
- * The result of GraphQL execution.
- *
- *   - `errors` is included when any errors occurred as a non-empty array.
- *   - `data` is the result of a successful execution of the query.
- */
-export type ExecutionResult = {|
-  errors?: $ReadOnlyArray<GraphQLError>,
-  data?: ObjMap<mixed> | null,
-|};
-
-export type ExecutionArgs = {|
-  schema: GraphQLSchema,
-  document: DocumentNode,
-  rootValue?: mixed,
-  contextValue?: mixed,
-  variableValues?: ?{ +[variable: string]: mixed, ... },
-  operationName?: ?string,
-  fieldResolver?: ?GraphQLFieldResolver<any, any>,
-  typeResolver?: ?GraphQLTypeResolver<any, any>,
-|};
-
-/**
- * Implements the "Evaluating requests" section of the GraphQL specification.
- *
- * Returns either a synchronous ExecutionResult (if all encountered resolvers
- * are synchronous), or a Promise of an ExecutionResult that will eventually be
- * resolved and never rejected.
- *
- * If the arguments to this function do not result in a legal execution context,
- * a GraphQLError will be thrown immediately explaining the invalid input.
- *
- * Accepts either an object with named arguments, or individual arguments.
- */
-declare function execute(
-  ExecutionArgs,
-  ..._: []
-): PromiseOrValue<ExecutionResult>;
-/* eslint-disable no-redeclare */
-declare function execute(
-  schema: GraphQLSchema,
-  document: DocumentNode,
-  rootValue?: mixed,
-  contextValue?: mixed,
-  variableValues?: ?{ +[variable: string]: mixed, ... },
-  operationName?: ?string,
-  fieldResolver?: ?GraphQLFieldResolver<any, any>,
-  typeResolver?: ?GraphQLTypeResolver<any, any>,
-): PromiseOrValue<ExecutionResult>;
-export function execute(
-  argsOrSchema,
-  document,
-  rootValue,
-  contextValue,
-  variableValues,
-  operationName,
-  fieldResolver,
-  typeResolver,
-) {
-  /* eslint-enable no-redeclare */
-  // Extract arguments from object args if provided.
-  return arguments.length === 1
-    ? executeImpl(argsOrSchema)
-    : executeImpl({
-        schema: argsOrSchema,
-        document,
-        rootValue,
-        contextValue,
-        variableValues,
-        operationName,
-        fieldResolver,
-        typeResolver,
-      });
-}
-
-function executeImpl(args: ExecutionArgs): PromiseOrValue<ExecutionResult> {
-  const {
-    schema,
-    document,
-    rootValue,
-    contextValue,
-    variableValues,
-    operationName,
-    fieldResolver,
-    typeResolver,
-  } = args;
-
-  // If arguments are missing or incorrect, throw an error.
-  assertValidExecutionArguments(schema, document, variableValues);
-
-  // If a valid execution context cannot be created due to incorrect arguments,
-  // a "Response" with only errors is returned.
-  const exeContext = buildExecutionContext(
-    schema,
-    document,
-    rootValue,
-    contextValue,
-    variableValues,
-    operationName,
-    fieldResolver,
-    typeResolver,
-  );
-
-  // Return early errors if execution context failed.
-  if (Array.isArray(exeContext)) {
-    return { errors: exeContext };
-  }
-
-  // Return a Promise that will eventually resolve to the data described by
-  // The "Response" section of the GraphQL specification.
-  //
-  // If errors are encountered while executing a GraphQL field, only that
-  // field and its descendants will be omitted, and sibling fields will still
-  // be executed. An execution which encounters errors will still result in a
-  // resolved Promise.
-  const data = executeOperation(exeContext, exeContext.operation, rootValue);
-  return buildResponse(exeContext, data);
-}
-
-/**
- * Given a completed execution context and data, build the { errors, data }
- * response defined by the "Response" section of the GraphQL specification.
- */
-function buildResponse(
-  exeContext: ExecutionContext,
-  data: PromiseOrValue<ObjMap<mixed> | null>,
-): PromiseOrValue<ExecutionResult> {
-  if (isPromise(data)) {
-    return data.then(resolved => buildResponse(exeContext, resolved));
-  }
-  return exeContext.errors.length === 0
-    ? { data }
-    : { errors: exeContext.errors, data };
-}
-
-/**
- * Essential assertions before executing to provide developer feedback for
- * improper use of the GraphQL library.
- *
- * @internal
- */
-export function assertValidExecutionArguments(
-  schema: GraphQLSchema,
-  document: DocumentNode,
-  rawVariableValues: ?{ +[variable: string]: mixed, ... },
-): void {
-  devAssert(document, 'Must provide document.');
-
-  // If the schema used for execution is invalid, throw an error.
-  assertValidSchema(schema);
-
-  // Variables, if provided, must be an object.
-  devAssert(
-    rawVariableValues == null || isObjectLike(rawVariableValues),
-    'Variables must be provided as an Object where each property is a variable value. Perhaps look to see if an unparsed JSON string was provided.',
-  );
-}
-
-/**
- * Constructs a ExecutionContext object from the arguments passed to
- * execute, which we will pass throughout the other execution methods.
- *
- * Throws a GraphQLError if a valid execution context cannot be created.
- *
- * @internal
- */
-export function buildExecutionContext(
-  schema: GraphQLSchema,
-  document: DocumentNode,
-  rootValue: mixed,
-  contextValue: mixed,
-  rawVariableValues: ?{ +[variable: string]: mixed, ... },
-  operationName: ?string,
-  fieldResolver: ?GraphQLFieldResolver<mixed, mixed>,
-  typeResolver?: ?GraphQLTypeResolver<mixed, mixed>,
-): $ReadOnlyArray<GraphQLError> | ExecutionContext {
-  let operation: OperationDefinitionNode | void;
-  const fragments: ObjMap<FragmentDefinitionNode> = Object.create(null);
-  for (const definition of document.definitions) {
-    switch (definition.kind) {
-      case Kind.OPERATION_DEFINITION:
-        if (operationName == null) {
-          if (operation !== undefined) {
-            return [
-              new GraphQLError(
-                'Must provide operation name if query contains multiple operations.',
-              ),
-            ];
-          }
-          operation = definition;
-        } else if (definition.name?.value === operationName) {
-          operation = definition;
-        }
-        break;
-      case Kind.FRAGMENT_DEFINITION:
-        fragments[definition.name.value] = definition;
-        break;
-    }
-  }
-
-  if (!operation) {
-    if (operationName != null) {
-      return [new GraphQLError(`Unknown operation named "${operationName}".`)];
-    }
-    return [new GraphQLError('Must provide an operation.')];
-  }
-
-  /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-  const variableDefinitions = operation.variableDefinitions ?? [];
-
-  const coercedVariableValues = getVariableValues(
-    schema,
-    variableDefinitions,
-    rawVariableValues ?? {},
-    { maxErrors: 50 },
-  );
-
-  if (coercedVariableValues.errors) {
-    return coercedVariableValues.errors;
-  }
-
-  return {
-    schema,
-    fragments,
-    rootValue,
-    contextValue,
-    operation,
-    variableValues: coercedVariableValues.coerced,
-    fieldResolver: fieldResolver ?? defaultFieldResolver,
-    typeResolver: typeResolver ?? defaultTypeResolver,
-    errors: [],
-  };
-}
-
-/**
- * Implements the "Evaluating operations" section of the spec.
- */
-function executeOperation(
-  exeContext: ExecutionContext,
-  operation: OperationDefinitionNode,
-  rootValue: mixed,
-): PromiseOrValue<ObjMap<mixed> | null> {
-  const type = getOperationRootType(exeContext.schema, operation);
-  const fields = collectFields(
-    exeContext,
-    type,
-    operation.selectionSet,
-    Object.create(null),
-    Object.create(null),
-  );
-
-  const path = undefined;
-
-  // Errors from sub-fields of a NonNull type may propagate to the top level,
-  // at which point we still log the error and null the parent field, which
-  // in this case is the entire response.
-  //
-  // Similar to completeValueCatchingError.
-  try {
-    const result =
-      operation.operation === 'mutation'
-        ? executeFieldsSerially(exeContext, type, rootValue, path, fields)
-        : executeFields(exeContext, type, rootValue, path, fields);
-    if (isPromise(result)) {
-      return result.then(undefined, error => {
-        exeContext.errors.push(error);
-        return Promise.resolve(null);
-      });
-    }
-    return result;
-  } catch (error) {
-    exeContext.errors.push(error);
-    return null;
-  }
-}
-
-/**
- * Implements the "Evaluating selection sets" section of the spec
- * for "write" mode.
- */
-function executeFieldsSerially(
-  exeContext: ExecutionContext,
-  parentType: GraphQLObjectType,
-  sourceValue: mixed,
-  path: Path | void,
-  fields: ObjMap<Array<FieldNode>>,
-): PromiseOrValue<ObjMap<mixed>> {
-  return promiseReduce(
-    Object.keys(fields),
-    (results, responseName) => {
-      const fieldNodes = fields[responseName];
-      const fieldPath = addPath(path, responseName);
-      const result = resolveField(
-        exeContext,
-        parentType,
-        sourceValue,
-        fieldNodes,
-        fieldPath,
-      );
-      if (result === undefined) {
-        return results;
-      }
-      if (isPromise(result)) {
-        return result.then(resolvedResult => {
-          results[responseName] = resolvedResult;
-          return results;
-        });
-      }
-      results[responseName] = result;
-      return results;
-    },
-    Object.create(null),
-  );
-}
-
-/**
- * Implements the "Evaluating selection sets" section of the spec
- * for "read" mode.
- */
-function executeFields(
-  exeContext: ExecutionContext,
-  parentType: GraphQLObjectType,
-  sourceValue: mixed,
-  path: Path | void,
-  fields: ObjMap<Array<FieldNode>>,
-): PromiseOrValue<ObjMap<mixed>> {
-  const results = Object.create(null);
-  let containsPromise = false;
-
-  for (const responseName of Object.keys(fields)) {
-    const fieldNodes = fields[responseName];
-    const fieldPath = addPath(path, responseName);
-    const result = resolveField(
-      exeContext,
-      parentType,
-      sourceValue,
-      fieldNodes,
-      fieldPath,
-    );
-
-    if (result !== undefined) {
-      results[responseName] = result;
-      if (!containsPromise && isPromise(result)) {
-        containsPromise = true;
-      }
-    }
-  }
-
-  // If there are no promises, we can just return the object
-  if (!containsPromise) {
-    return results;
-  }
-
-  // Otherwise, results is a map from field name to the result of resolving that
-  // field, which is possibly a promise. Return a promise that will return this
-  // same map, but with any promises replaced with the values they resolved to.
-  return promiseForObject(results);
-}
-
-/**
- * Given a selectionSet, adds all of the fields in that selection to
- * the passed in map of fields, and returns it at the end.
- *
- * CollectFields requires the "runtime type" of an object. For a field which
- * returns an Interface or Union type, the "runtime type" will be the actual
- * Object type returned by that field.
- *
- * @internal
- */
-export function collectFields(
-  exeContext: ExecutionContext,
-  runtimeType: GraphQLObjectType,
-  selectionSet: SelectionSetNode,
-  fields: ObjMap<Array<FieldNode>>,
-  visitedFragmentNames: ObjMap<boolean>,
-): ObjMap<Array<FieldNode>> {
-  for (const selection of selectionSet.selections) {
-    switch (selection.kind) {
-      case Kind.FIELD: {
-        if (!shouldIncludeNode(exeContext, selection)) {
-          continue;
-        }
-        const name = getFieldEntryKey(selection);
-        if (!fields[name]) {
-          fields[name] = [];
-        }
-        fields[name].push(selection);
-        break;
-      }
-      case Kind.INLINE_FRAGMENT: {
-        if (
-          !shouldIncludeNode(exeContext, selection) ||
-          !doesFragmentConditionMatch(exeContext, selection, runtimeType)
-        ) {
-          continue;
-        }
-        collectFields(
-          exeContext,
-          runtimeType,
-          selection.selectionSet,
-          fields,
-          visitedFragmentNames,
-        );
-        break;
-      }
-      case Kind.FRAGMENT_SPREAD: {
-        const fragName = selection.name.value;
-        if (
-          visitedFragmentNames[fragName] ||
-          !shouldIncludeNode(exeContext, selection)
-        ) {
-          continue;
-        }
-        visitedFragmentNames[fragName] = true;
-        const fragment = exeContext.fragments[fragName];
-        if (
-          !fragment ||
-          !doesFragmentConditionMatch(exeContext, fragment, runtimeType)
-        ) {
-          continue;
-        }
-        collectFields(
-          exeContext,
-          runtimeType,
-          fragment.selectionSet,
-          fields,
-          visitedFragmentNames,
-        );
-        break;
-      }
-    }
-  }
-  return fields;
-}
-
-/**
- * Determines if a field should be included based on the @include and @skip
- * directives, where @skip has higher precedence than @include.
- */
-function shouldIncludeNode(
-  exeContext: ExecutionContext,
-  node: FragmentSpreadNode | FieldNode | InlineFragmentNode,
-): boolean {
-  const skip = getDirectiveValues(
-    GraphQLSkipDirective,
-    node,
-    exeContext.variableValues,
-  );
-  if (skip?.if === true) {
-    return false;
-  }
-
-  const include = getDirectiveValues(
-    GraphQLIncludeDirective,
-    node,
-    exeContext.variableValues,
-  );
-  if (include?.if === false) {
-    return false;
-  }
-  return true;
-}
-
-/**
- * Determines if a fragment is applicable to the given type.
- */
-function doesFragmentConditionMatch(
-  exeContext: ExecutionContext,
-  fragment: FragmentDefinitionNode | InlineFragmentNode,
-  type: GraphQLObjectType,
-): boolean {
-  const typeConditionNode = fragment.typeCondition;
-  if (!typeConditionNode) {
-    return true;
-  }
-  const conditionalType = typeFromAST(exeContext.schema, typeConditionNode);
-  if (conditionalType === type) {
-    return true;
-  }
-  if (isAbstractType(conditionalType)) {
-    return exeContext.schema.isSubType(conditionalType, type);
-  }
-  return false;
-}
-
-/**
- * Implements the logic to compute the key of a given field's entry
- */
-function getFieldEntryKey(node: FieldNode): string {
-  return node.alias ? node.alias.value : node.name.value;
-}
-
-/**
- * Resolves the field on the given source object. In particular, this
- * figures out the value that the field returns by calling its resolve function,
- * then calls completeValue to complete promises, serialize scalars, or execute
- * the sub-selection-set for objects.
- */
-function resolveField(
-  exeContext: ExecutionContext,
-  parentType: GraphQLObjectType,
-  source: mixed,
-  fieldNodes: $ReadOnlyArray<FieldNode>,
-  path: Path,
-): PromiseOrValue<mixed> {
-  const fieldNode = fieldNodes[0];
-  const fieldName = fieldNode.name.value;
-
-  const fieldDef = getFieldDef(exeContext.schema, parentType, fieldName);
-  if (!fieldDef) {
-    return;
-  }
-
-  const resolveFn = fieldDef.resolve ?? exeContext.fieldResolver;
-
-  const info = buildResolveInfo(
-    exeContext,
-    fieldDef,
-    fieldNodes,
-    parentType,
-    path,
-  );
-
-  // Get the resolve function, regardless of if its result is normal
-  // or abrupt (error).
-  const result = resolveFieldValueOrError(
-    exeContext,
-    fieldDef,
-    fieldNodes,
-    resolveFn,
-    source,
-    info,
-  );
-
-  return completeValueCatchingError(
-    exeContext,
-    fieldDef.type,
-    fieldNodes,
-    info,
-    path,
-    result,
-  );
-}
-
-/**
- * @internal
- */
-export function buildResolveInfo(
-  exeContext: ExecutionContext,
-  fieldDef: GraphQLField<mixed, mixed>,
-  fieldNodes: $ReadOnlyArray<FieldNode>,
-  parentType: GraphQLObjectType,
-  path: Path,
-): GraphQLResolveInfo {
-  // The resolve function's optional fourth argument is a collection of
-  // information about the current execution state.
-  return {
-    fieldName: fieldDef.name,
-    fieldNodes,
-    returnType: fieldDef.type,
-    parentType,
-    path,
-    schema: exeContext.schema,
-    fragments: exeContext.fragments,
-    rootValue: exeContext.rootValue,
-    operation: exeContext.operation,
-    variableValues: exeContext.variableValues,
-  };
-}
-
-/**
- * Isolates the "ReturnOrAbrupt" behavior to not de-opt the `resolveField`
- * function. Returns the result of resolveFn or the abrupt-return Error object.
- *
- * @internal
- */
-export function resolveFieldValueOrError(
-  exeContext: ExecutionContext,
-  fieldDef: GraphQLField<mixed, mixed>,
-  fieldNodes: $ReadOnlyArray<FieldNode>,
-  resolveFn: GraphQLFieldResolver<mixed, mixed>,
-  source: mixed,
-  info: GraphQLResolveInfo,
-): Error | mixed {
-  try {
-    // Build a JS object of arguments from the field.arguments AST, using the
-    // variables scope to fulfill any variable references.
-    // TODO: find a way to memoize, in case this field is within a List type.
-    const args = getArgumentValues(
-      fieldDef,
-      fieldNodes[0],
-      exeContext.variableValues,
-    );
-
-    // The resolve function's optional third argument is a context value that
-    // is provided to every resolve function within an execution. It is commonly
-    // used to represent an authenticated user, or request-specific caches.
-    const contextValue = exeContext.contextValue;
-
-    const result = resolveFn(source, args, contextValue, info);
-    return isPromise(result) ? result.then(undefined, asErrorInstance) : result;
-  } catch (error) {
-    return asErrorInstance(error);
-  }
-}
-
-// Sometimes a non-error is thrown, wrap it as an Error instance to ensure a
-// consistent Error interface.
-function asErrorInstance(error: mixed): Error {
-  if (error instanceof Error) {
-    return error;
-  }
-  return new Error('Unexpected error value: ' + inspect(error));
-}
-
-// This is a small wrapper around completeValue which detects and logs errors
-// in the execution context.
-function completeValueCatchingError(
-  exeContext: ExecutionContext,
-  returnType: GraphQLOutputType,
-  fieldNodes: $ReadOnlyArray<FieldNode>,
-  info: GraphQLResolveInfo,
-  path: Path,
-  result: mixed,
-): PromiseOrValue<mixed> {
-  try {
-    let completed;
-    if (isPromise(result)) {
-      completed = result.then(resolved =>
-        completeValue(exeContext, returnType, fieldNodes, info, path, resolved),
-      );
-    } else {
-      completed = completeValue(
-        exeContext,
-        returnType,
-        fieldNodes,
-        info,
-        path,
-        result,
-      );
-    }
-
-    if (isPromise(completed)) {
-      // Note: we don't rely on a `catch` method, but we do expect "thenable"
-      // to take a second callback for the error case.
-      return completed.then(undefined, error =>
-        handleFieldError(error, fieldNodes, path, returnType, exeContext),
-      );
-    }
-    return completed;
-  } catch (error) {
-    return handleFieldError(error, fieldNodes, path, returnType, exeContext);
-  }
-}
-
-function handleFieldError(rawError, fieldNodes, path, returnType, exeContext) {
-  const error = locatedError(
-    asErrorInstance(rawError),
-    fieldNodes,
-    pathToArray(path),
-  );
-
-  // If the field type is non-nullable, then it is resolved without any
-  // protection from errors, however it still properly locates the error.
-  if (isNonNullType(returnType)) {
-    throw error;
-  }
-
-  // Otherwise, error protection is applied, logging the error and resolving
-  // a null value for this field if one is encountered.
-  exeContext.errors.push(error);
-  return null;
-}
-
-/**
- * Implements the instructions for completeValue as defined in the
- * "Field entries" section of the spec.
- *
- * If the field type is Non-Null, then this recursively completes the value
- * for the inner type. It throws a field error if that completion returns null,
- * as per the "Nullability" section of the spec.
- *
- * If the field type is a List, then this recursively completes the value
- * for the inner type on each item in the list.
- *
- * If the field type is a Scalar or Enum, ensures the completed value is a legal
- * value of the type by calling the `serialize` method of GraphQL type
- * definition.
- *
- * If the field is an abstract type, determine the runtime type of the value
- * and then complete based on that type
- *
- * Otherwise, the field type expects a sub-selection set, and will complete the
- * value by evaluating all sub-selections.
- */
-function completeValue(
-  exeContext: ExecutionContext,
-  returnType: GraphQLOutputType,
-  fieldNodes: $ReadOnlyArray<FieldNode>,
-  info: GraphQLResolveInfo,
-  path: Path,
-  result: mixed,
-): PromiseOrValue<mixed> {
-  // If result is an Error, throw a located error.
-  if (result instanceof Error) {
-    throw result;
-  }
-
-  // If field type is NonNull, complete for inner type, and throw field error
-  // if result is null.
-  if (isNonNullType(returnType)) {
-    const completed = completeValue(
-      exeContext,
-      returnType.ofType,
-      fieldNodes,
-      info,
-      path,
-      result,
-    );
-    if (completed === null) {
-      throw new Error(
-        `Cannot return null for non-nullable field ${info.parentType.name}.${info.fieldName}.`,
-      );
-    }
-    return completed;
-  }
-
-  // If result value is null or undefined then return null.
-  if (result == null) {
-    return null;
-  }
-
-  // If field type is List, complete each item in the list with the inner type
-  if (isListType(returnType)) {
-    return completeListValue(
-      exeContext,
-      returnType,
-      fieldNodes,
-      info,
-      path,
-      result,
-    );
-  }
-
-  // If field type is a leaf type, Scalar or Enum, serialize to a valid value,
-  // returning null if serialization is not possible.
-  if (isLeafType(returnType)) {
-    return completeLeafValue(returnType, result);
-  }
-
-  // If field type is an abstract type, Interface or Union, determine the
-  // runtime Object type and complete for that type.
-  if (isAbstractType(returnType)) {
-    return completeAbstractValue(
-      exeContext,
-      returnType,
-      fieldNodes,
-      info,
-      path,
-      result,
-    );
-  }
-
-  // If field type is Object, execute and complete all sub-selections.
-  if (isObjectType(returnType)) {
-    return completeObjectValue(
-      exeContext,
-      returnType,
-      fieldNodes,
-      info,
-      path,
-      result,
-    );
-  }
-
-  // Not reachable. All possible output types have been considered.
-  invariant(
-    false,
-    'Cannot complete value of unexpected output type: ' +
-      inspect((returnType: empty)),
-  );
-}
-
-/**
- * Complete a list value by completing each item in the list with the
- * inner type
- */
-function completeListValue(
-  exeContext: ExecutionContext,
-  returnType: GraphQLList<GraphQLOutputType>,
-  fieldNodes: $ReadOnlyArray<FieldNode>,
-  info: GraphQLResolveInfo,
-  path: Path,
-  result: mixed,
-): PromiseOrValue<$ReadOnlyArray<mixed>> {
-  if (!isCollection(result)) {
-    throw new GraphQLError(
-      `Expected Iterable, but did not find one for field "${info.parentType.name}.${info.fieldName}".`,
-    );
-  }
-
-  // This is specified as a simple map, however we're optimizing the path
-  // where the list contains no Promises by avoiding creating another Promise.
-  const itemType = returnType.ofType;
-  let containsPromise = false;
-  const completedResults = arrayFrom(result, (item, index) => {
-    // No need to modify the info object containing the path,
-    // since from here on it is not ever accessed by resolver functions.
-    const fieldPath = addPath(path, index);
-    const completedItem = completeValueCatchingError(
-      exeContext,
-      itemType,
-      fieldNodes,
-      info,
-      fieldPath,
-      item,
-    );
-
-    if (!containsPromise && isPromise(completedItem)) {
-      containsPromise = true;
-    }
-
-    return completedItem;
-  });
-
-  return containsPromise ? Promise.all(completedResults) : completedResults;
-}
-
-/**
- * Complete a Scalar or Enum by serializing to a valid value, returning
- * null if serialization is not possible.
- */
-function completeLeafValue(returnType: GraphQLLeafType, result: mixed): mixed {
-  const serializedResult = returnType.serialize(result);
-  if (serializedResult === undefined) {
-    throw new Error(
-      `Expected a value of type "${inspect(returnType)}" but ` +
-        `received: ${inspect(result)}`,
-    );
-  }
-  return serializedResult;
-}
-
-/**
- * Complete a value of an abstract type by determining the runtime object type
- * of that value, then complete the value for that type.
- */
-function completeAbstractValue(
-  exeContext: ExecutionContext,
-  returnType: GraphQLAbstractType,
-  fieldNodes: $ReadOnlyArray<FieldNode>,
-  info: GraphQLResolveInfo,
-  path: Path,
-  result: mixed,
-): PromiseOrValue<ObjMap<mixed>> {
-  const resolveTypeFn = returnType.resolveType ?? exeContext.typeResolver;
-  const contextValue = exeContext.contextValue;
-  const runtimeType = resolveTypeFn(result, contextValue, info, returnType);
-
-  if (isPromise(runtimeType)) {
-    return runtimeType.then(resolvedRuntimeType =>
-      completeObjectValue(
-        exeContext,
-        ensureValidRuntimeType(
-          resolvedRuntimeType,
-          exeContext,
-          returnType,
-          fieldNodes,
-          info,
-          result,
-        ),
-        fieldNodes,
-        info,
-        path,
-        result,
-      ),
-    );
-  }
-
-  return completeObjectValue(
-    exeContext,
-    ensureValidRuntimeType(
-      runtimeType,
-      exeContext,
-      returnType,
-      fieldNodes,
-      info,
-      result,
-    ),
-    fieldNodes,
-    info,
-    path,
-    result,
-  );
-}
-
-function ensureValidRuntimeType(
-  runtimeTypeOrName: ?GraphQLObjectType | string,
-  exeContext: ExecutionContext,
-  returnType: GraphQLAbstractType,
-  fieldNodes: $ReadOnlyArray<FieldNode>,
-  info: GraphQLResolveInfo,
-  result: mixed,
-): GraphQLObjectType {
-  const runtimeType =
-    typeof runtimeTypeOrName === 'string'
-      ? exeContext.schema.getType(runtimeTypeOrName)
-      : runtimeTypeOrName;
-
-  if (!isObjectType(runtimeType)) {
-    throw new GraphQLError(
-      `Abstract type "${returnType.name}" must resolve to an Object type at runtime for field "${info.parentType.name}.${info.fieldName}" with ` +
-        `value ${inspect(result)}, received "${inspect(runtimeType)}". ` +
-        `Either the "${returnType.name}" type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.`,
-      fieldNodes,
-    );
-  }
-
-  if (!exeContext.schema.isSubType(returnType, runtimeType)) {
-    throw new GraphQLError(
-      `Runtime Object type "${runtimeType.name}" is not a possible type for "${returnType.name}".`,
-      fieldNodes,
-    );
-  }
-
-  return runtimeType;
-}
-
-/**
- * Complete an Object value by executing all sub-selections.
- */
-function completeObjectValue(
-  exeContext: ExecutionContext,
-  returnType: GraphQLObjectType,
-  fieldNodes: $ReadOnlyArray<FieldNode>,
-  info: GraphQLResolveInfo,
-  path: Path,
-  result: mixed,
-): PromiseOrValue<ObjMap<mixed>> {
-  // If there is an isTypeOf predicate function, call it with the
-  // current result. If isTypeOf returns false, then raise an error rather
-  // than continuing execution.
-  if (returnType.isTypeOf) {
-    const isTypeOf = returnType.isTypeOf(result, exeContext.contextValue, info);
-
-    if (isPromise(isTypeOf)) {
-      return isTypeOf.then(resolvedIsTypeOf => {
-        if (!resolvedIsTypeOf) {
-          throw invalidReturnTypeError(returnType, result, fieldNodes);
-        }
-        return collectAndExecuteSubfields(
-          exeContext,
-          returnType,
-          fieldNodes,
-          path,
-          result,
-        );
-      });
-    }
-
-    if (!isTypeOf) {
-      throw invalidReturnTypeError(returnType, result, fieldNodes);
-    }
-  }
-
-  return collectAndExecuteSubfields(
-    exeContext,
-    returnType,
-    fieldNodes,
-    path,
-    result,
-  );
-}
-
-function invalidReturnTypeError(
-  returnType: GraphQLObjectType,
-  result: mixed,
-  fieldNodes: $ReadOnlyArray<FieldNode>,
-): GraphQLError {
-  return new GraphQLError(
-    `Expected value of type "${returnType.name}" but got: ${inspect(result)}.`,
-    fieldNodes,
-  );
-}
-
-function collectAndExecuteSubfields(
-  exeContext: ExecutionContext,
-  returnType: GraphQLObjectType,
-  fieldNodes: $ReadOnlyArray<FieldNode>,
-  path: Path,
-  result: mixed,
-): PromiseOrValue<ObjMap<mixed>> {
-  // Collect sub-fields to execute to complete this value.
-  const subFieldNodes = collectSubfields(exeContext, returnType, fieldNodes);
-  return executeFields(exeContext, returnType, result, path, subFieldNodes);
-}
-
-/**
- * A memoized collection of relevant subfields with regard to the return
- * type. Memoizing ensures the subfields are not repeatedly calculated, which
- * saves overhead when resolving lists of values.
- */
-const collectSubfields = memoize3(_collectSubfields);
-function _collectSubfields(
-  exeContext: ExecutionContext,
-  returnType: GraphQLObjectType,
-  fieldNodes: $ReadOnlyArray<FieldNode>,
-): ObjMap<Array<FieldNode>> {
-  let subFieldNodes = Object.create(null);
-  const visitedFragmentNames = Object.create(null);
-  for (const node of fieldNodes) {
-    if (node.selectionSet) {
-      subFieldNodes = collectFields(
-        exeContext,
-        returnType,
-        node.selectionSet,
-        subFieldNodes,
-        visitedFragmentNames,
-      );
-    }
-  }
-  return subFieldNodes;
-}
-
-/**
- * If a resolveType function is not given, then a default resolve behavior is
- * used which attempts two strategies:
- *
- * First, See if the provided value has a `__typename` field defined, if so, use
- * that value as name of the resolved type.
- *
- * Otherwise, test each possible type for the abstract type by calling
- * isTypeOf for the object being coerced, returning the first type that matches.
- */
-export const defaultTypeResolver: GraphQLTypeResolver<mixed, mixed> = function(
-  value,
-  contextValue,
-  info,
-  abstractType,
-) {
-  // First, look for `__typename`.
-  if (isObjectLike(value) && typeof value.__typename === 'string') {
-    return value.__typename;
-  }
-
-  // Otherwise, test each possible type.
-  const possibleTypes = info.schema.getPossibleTypes(abstractType);
-  const promisedIsTypeOfResults = [];
-
-  for (let i = 0; i < possibleTypes.length; i++) {
-    const type = possibleTypes[i];
-
-    if (type.isTypeOf) {
-      const isTypeOfResult = type.isTypeOf(value, contextValue, info);
-
-      if (isPromise(isTypeOfResult)) {
-        promisedIsTypeOfResults[i] = isTypeOfResult;
-      } else if (isTypeOfResult) {
-        return type;
-      }
-    }
-  }
-
-  if (promisedIsTypeOfResults.length) {
-    return Promise.all(promisedIsTypeOfResults).then(isTypeOfResults => {
-      for (let i = 0; i < isTypeOfResults.length; i++) {
-        if (isTypeOfResults[i]) {
-          return possibleTypes[i];
-        }
-      }
-    });
-  }
-};
-
-/**
- * If a resolve function is not given, then a default resolve behavior is used
- * which takes the property of the source object of the same name as the field
- * and returns it as the result, or if it's a function, returns the result
- * of calling that function while passing along args and context value.
- */
-export const defaultFieldResolver: GraphQLFieldResolver<
-  mixed,
-  mixed,
-> = function(source: any, args, contextValue, info) {
-  // ensure source is a value for which property access is acceptable.
-  if (isObjectLike(source) || typeof source === 'function') {
-    const property = source[info.fieldName];
-    if (typeof property === 'function') {
-      return source[info.fieldName](args, contextValue, info);
-    }
-    return property;
-  }
-};
-
-/**
- * This method looks up the field on the given type definition.
- * It has special casing for the two introspection fields, __schema
- * and __typename. __typename is special because it can always be
- * queried as a field, even in situations where no other fields
- * are allowed, like on a Union. __schema could get automatically
- * added to the query type, but that would require mutating type
- * definitions, which would cause issues.
- *
- * @internal
- */
-export function getFieldDef(
-  schema: GraphQLSchema,
-  parentType: GraphQLObjectType,
-  fieldName: string,
-): ?GraphQLField<mixed, mixed> {
-  if (
-    fieldName === SchemaMetaFieldDef.name &&
-    schema.getQueryType() === parentType
-  ) {
-    return SchemaMetaFieldDef;
-  } else if (
-    fieldName === TypeMetaFieldDef.name &&
-    schema.getQueryType() === parentType
-  ) {
-    return TypeMetaFieldDef;
-  } else if (fieldName === TypeNameMetaFieldDef.name) {
-    return TypeNameMetaFieldDef;
-  }
-  return parentType.getFields()[fieldName];
-}
diff --git a/node_modules/graphql/execution/execute.mjs b/node_modules/graphql/execution/execute.mjs
deleted file mode 100644
index 50cc538..0000000
--- a/node_modules/graphql/execution/execute.mjs
+++ /dev/null
@@ -1,830 +0,0 @@
-import arrayFrom from "../polyfills/arrayFrom.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import memoize3 from "../jsutils/memoize3.mjs";
-import invariant from "../jsutils/invariant.mjs";
-import devAssert from "../jsutils/devAssert.mjs";
-import isPromise from "../jsutils/isPromise.mjs";
-import isObjectLike from "../jsutils/isObjectLike.mjs";
-import isCollection from "../jsutils/isCollection.mjs";
-import promiseReduce from "../jsutils/promiseReduce.mjs";
-import promiseForObject from "../jsutils/promiseForObject.mjs";
-import { addPath, pathToArray } from "../jsutils/Path.mjs";
-import { GraphQLError } from "../error/GraphQLError.mjs";
-import { locatedError } from "../error/locatedError.mjs";
-import { Kind } from "../language/kinds.mjs";
-import { assertValidSchema } from "../type/validate.mjs";
-import { SchemaMetaFieldDef, TypeMetaFieldDef, TypeNameMetaFieldDef } from "../type/introspection.mjs";
-import { GraphQLIncludeDirective, GraphQLSkipDirective } from "../type/directives.mjs";
-import { isObjectType, isAbstractType, isLeafType, isListType, isNonNullType } from "../type/definition.mjs";
-import { typeFromAST } from "../utilities/typeFromAST.mjs";
-import { getOperationRootType } from "../utilities/getOperationRootType.mjs";
-import { getVariableValues, getArgumentValues, getDirectiveValues } from "./values.mjs";
-/**
- * Terminology
- *
- * "Definitions" are the generic name for top-level statements in the document.
- * Examples of this include:
- * 1) Operations (such as a query)
- * 2) Fragments
- *
- * "Operations" are a generic name for requests in the document.
- * Examples of this include:
- * 1) query,
- * 2) mutation
- *
- * "Selections" are the definitions that can appear legally and at
- * single level of the query. These include:
- * 1) field references e.g "a"
- * 2) fragment "spreads" e.g. "...c"
- * 3) inline fragment "spreads" e.g. "...on Type { a }"
- */
-
-/**
- * Data that must be available at all points during query execution.
- *
- * Namely, schema of the type system that is currently executing,
- * and the fragments defined in the query document
- */
-
-export function execute(argsOrSchema, document, rootValue, contextValue, variableValues, operationName, fieldResolver, typeResolver) {
-  /* eslint-enable no-redeclare */
-  // Extract arguments from object args if provided.
-  return arguments.length === 1 ? executeImpl(argsOrSchema) : executeImpl({
-    schema: argsOrSchema,
-    document: document,
-    rootValue: rootValue,
-    contextValue: contextValue,
-    variableValues: variableValues,
-    operationName: operationName,
-    fieldResolver: fieldResolver,
-    typeResolver: typeResolver
-  });
-}
-
-function executeImpl(args) {
-  var schema = args.schema,
-      document = args.document,
-      rootValue = args.rootValue,
-      contextValue = args.contextValue,
-      variableValues = args.variableValues,
-      operationName = args.operationName,
-      fieldResolver = args.fieldResolver,
-      typeResolver = args.typeResolver; // If arguments are missing or incorrect, throw an error.
-
-  assertValidExecutionArguments(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments,
-  // a "Response" with only errors is returned.
-
-  var exeContext = buildExecutionContext(schema, document, rootValue, contextValue, variableValues, operationName, fieldResolver, typeResolver); // Return early errors if execution context failed.
-
-  if (Array.isArray(exeContext)) {
-    return {
-      errors: exeContext
-    };
-  } // Return a Promise that will eventually resolve to the data described by
-  // The "Response" section of the GraphQL specification.
-  //
-  // If errors are encountered while executing a GraphQL field, only that
-  // field and its descendants will be omitted, and sibling fields will still
-  // be executed. An execution which encounters errors will still result in a
-  // resolved Promise.
-
-
-  var data = executeOperation(exeContext, exeContext.operation, rootValue);
-  return buildResponse(exeContext, data);
-}
-/**
- * Given a completed execution context and data, build the { errors, data }
- * response defined by the "Response" section of the GraphQL specification.
- */
-
-
-function buildResponse(exeContext, data) {
-  if (isPromise(data)) {
-    return data.then(function (resolved) {
-      return buildResponse(exeContext, resolved);
-    });
-  }
-
-  return exeContext.errors.length === 0 ? {
-    data: data
-  } : {
-    errors: exeContext.errors,
-    data: data
-  };
-}
-/**
- * Essential assertions before executing to provide developer feedback for
- * improper use of the GraphQL library.
- *
- * @internal
- */
-
-
-export function assertValidExecutionArguments(schema, document, rawVariableValues) {
-  document || devAssert(0, 'Must provide document.'); // If the schema used for execution is invalid, throw an error.
-
-  assertValidSchema(schema); // Variables, if provided, must be an object.
-
-  rawVariableValues == null || isObjectLike(rawVariableValues) || devAssert(0, 'Variables must be provided as an Object where each property is a variable value. Perhaps look to see if an unparsed JSON string was provided.');
-}
-/**
- * Constructs a ExecutionContext object from the arguments passed to
- * execute, which we will pass throughout the other execution methods.
- *
- * Throws a GraphQLError if a valid execution context cannot be created.
- *
- * @internal
- */
-
-export function buildExecutionContext(schema, document, rootValue, contextValue, rawVariableValues, operationName, fieldResolver, typeResolver) {
-  var _definition$name, _operation$variableDe;
-
-  var operation;
-  var fragments = Object.create(null);
-
-  for (var _i2 = 0, _document$definitions2 = document.definitions; _i2 < _document$definitions2.length; _i2++) {
-    var definition = _document$definitions2[_i2];
-
-    switch (definition.kind) {
-      case Kind.OPERATION_DEFINITION:
-        if (operationName == null) {
-          if (operation !== undefined) {
-            return [new GraphQLError('Must provide operation name if query contains multiple operations.')];
-          }
-
-          operation = definition;
-        } else if (((_definition$name = definition.name) === null || _definition$name === void 0 ? void 0 : _definition$name.value) === operationName) {
-          operation = definition;
-        }
-
-        break;
-
-      case Kind.FRAGMENT_DEFINITION:
-        fragments[definition.name.value] = definition;
-        break;
-    }
-  }
-
-  if (!operation) {
-    if (operationName != null) {
-      return [new GraphQLError("Unknown operation named \"".concat(operationName, "\"."))];
-    }
-
-    return [new GraphQLError('Must provide an operation.')];
-  }
-  /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-
-  var variableDefinitions = (_operation$variableDe = operation.variableDefinitions) !== null && _operation$variableDe !== void 0 ? _operation$variableDe : [];
-  var coercedVariableValues = getVariableValues(schema, variableDefinitions, rawVariableValues !== null && rawVariableValues !== void 0 ? rawVariableValues : {}, {
-    maxErrors: 50
-  });
-
-  if (coercedVariableValues.errors) {
-    return coercedVariableValues.errors;
-  }
-
-  return {
-    schema: schema,
-    fragments: fragments,
-    rootValue: rootValue,
-    contextValue: contextValue,
-    operation: operation,
-    variableValues: coercedVariableValues.coerced,
-    fieldResolver: fieldResolver !== null && fieldResolver !== void 0 ? fieldResolver : defaultFieldResolver,
-    typeResolver: typeResolver !== null && typeResolver !== void 0 ? typeResolver : defaultTypeResolver,
-    errors: []
-  };
-}
-/**
- * Implements the "Evaluating operations" section of the spec.
- */
-
-function executeOperation(exeContext, operation, rootValue) {
-  var type = getOperationRootType(exeContext.schema, operation);
-  var fields = collectFields(exeContext, type, operation.selectionSet, Object.create(null), Object.create(null));
-  var path = undefined; // Errors from sub-fields of a NonNull type may propagate to the top level,
-  // at which point we still log the error and null the parent field, which
-  // in this case is the entire response.
-  //
-  // Similar to completeValueCatchingError.
-
-  try {
-    var result = operation.operation === 'mutation' ? executeFieldsSerially(exeContext, type, rootValue, path, fields) : executeFields(exeContext, type, rootValue, path, fields);
-
-    if (isPromise(result)) {
-      return result.then(undefined, function (error) {
-        exeContext.errors.push(error);
-        return Promise.resolve(null);
-      });
-    }
-
-    return result;
-  } catch (error) {
-    exeContext.errors.push(error);
-    return null;
-  }
-}
-/**
- * Implements the "Evaluating selection sets" section of the spec
- * for "write" mode.
- */
-
-
-function executeFieldsSerially(exeContext, parentType, sourceValue, path, fields) {
-  return promiseReduce(Object.keys(fields), function (results, responseName) {
-    var fieldNodes = fields[responseName];
-    var fieldPath = addPath(path, responseName);
-    var result = resolveField(exeContext, parentType, sourceValue, fieldNodes, fieldPath);
-
-    if (result === undefined) {
-      return results;
-    }
-
-    if (isPromise(result)) {
-      return result.then(function (resolvedResult) {
-        results[responseName] = resolvedResult;
-        return results;
-      });
-    }
-
-    results[responseName] = result;
-    return results;
-  }, Object.create(null));
-}
-/**
- * Implements the "Evaluating selection sets" section of the spec
- * for "read" mode.
- */
-
-
-function executeFields(exeContext, parentType, sourceValue, path, fields) {
-  var results = Object.create(null);
-  var containsPromise = false;
-
-  for (var _i4 = 0, _Object$keys2 = Object.keys(fields); _i4 < _Object$keys2.length; _i4++) {
-    var responseName = _Object$keys2[_i4];
-    var fieldNodes = fields[responseName];
-    var fieldPath = addPath(path, responseName);
-    var result = resolveField(exeContext, parentType, sourceValue, fieldNodes, fieldPath);
-
-    if (result !== undefined) {
-      results[responseName] = result;
-
-      if (!containsPromise && isPromise(result)) {
-        containsPromise = true;
-      }
-    }
-  } // If there are no promises, we can just return the object
-
-
-  if (!containsPromise) {
-    return results;
-  } // Otherwise, results is a map from field name to the result of resolving that
-  // field, which is possibly a promise. Return a promise that will return this
-  // same map, but with any promises replaced with the values they resolved to.
-
-
-  return promiseForObject(results);
-}
-/**
- * Given a selectionSet, adds all of the fields in that selection to
- * the passed in map of fields, and returns it at the end.
- *
- * CollectFields requires the "runtime type" of an object. For a field which
- * returns an Interface or Union type, the "runtime type" will be the actual
- * Object type returned by that field.
- *
- * @internal
- */
-
-
-export function collectFields(exeContext, runtimeType, selectionSet, fields, visitedFragmentNames) {
-  for (var _i6 = 0, _selectionSet$selecti2 = selectionSet.selections; _i6 < _selectionSet$selecti2.length; _i6++) {
-    var selection = _selectionSet$selecti2[_i6];
-
-    switch (selection.kind) {
-      case Kind.FIELD:
-        {
-          if (!shouldIncludeNode(exeContext, selection)) {
-            continue;
-          }
-
-          var name = getFieldEntryKey(selection);
-
-          if (!fields[name]) {
-            fields[name] = [];
-          }
-
-          fields[name].push(selection);
-          break;
-        }
-
-      case Kind.INLINE_FRAGMENT:
-        {
-          if (!shouldIncludeNode(exeContext, selection) || !doesFragmentConditionMatch(exeContext, selection, runtimeType)) {
-            continue;
-          }
-
-          collectFields(exeContext, runtimeType, selection.selectionSet, fields, visitedFragmentNames);
-          break;
-        }
-
-      case Kind.FRAGMENT_SPREAD:
-        {
-          var fragName = selection.name.value;
-
-          if (visitedFragmentNames[fragName] || !shouldIncludeNode(exeContext, selection)) {
-            continue;
-          }
-
-          visitedFragmentNames[fragName] = true;
-          var fragment = exeContext.fragments[fragName];
-
-          if (!fragment || !doesFragmentConditionMatch(exeContext, fragment, runtimeType)) {
-            continue;
-          }
-
-          collectFields(exeContext, runtimeType, fragment.selectionSet, fields, visitedFragmentNames);
-          break;
-        }
-    }
-  }
-
-  return fields;
-}
-/**
- * Determines if a field should be included based on the @include and @skip
- * directives, where @skip has higher precedence than @include.
- */
-
-function shouldIncludeNode(exeContext, node) {
-  var skip = getDirectiveValues(GraphQLSkipDirective, node, exeContext.variableValues);
-
-  if ((skip === null || skip === void 0 ? void 0 : skip.if) === true) {
-    return false;
-  }
-
-  var include = getDirectiveValues(GraphQLIncludeDirective, node, exeContext.variableValues);
-
-  if ((include === null || include === void 0 ? void 0 : include.if) === false) {
-    return false;
-  }
-
-  return true;
-}
-/**
- * Determines if a fragment is applicable to the given type.
- */
-
-
-function doesFragmentConditionMatch(exeContext, fragment, type) {
-  var typeConditionNode = fragment.typeCondition;
-
-  if (!typeConditionNode) {
-    return true;
-  }
-
-  var conditionalType = typeFromAST(exeContext.schema, typeConditionNode);
-
-  if (conditionalType === type) {
-    return true;
-  }
-
-  if (isAbstractType(conditionalType)) {
-    return exeContext.schema.isSubType(conditionalType, type);
-  }
-
-  return false;
-}
-/**
- * Implements the logic to compute the key of a given field's entry
- */
-
-
-function getFieldEntryKey(node) {
-  return node.alias ? node.alias.value : node.name.value;
-}
-/**
- * Resolves the field on the given source object. In particular, this
- * figures out the value that the field returns by calling its resolve function,
- * then calls completeValue to complete promises, serialize scalars, or execute
- * the sub-selection-set for objects.
- */
-
-
-function resolveField(exeContext, parentType, source, fieldNodes, path) {
-  var _fieldDef$resolve;
-
-  var fieldNode = fieldNodes[0];
-  var fieldName = fieldNode.name.value;
-  var fieldDef = getFieldDef(exeContext.schema, parentType, fieldName);
-
-  if (!fieldDef) {
-    return;
-  }
-
-  var resolveFn = (_fieldDef$resolve = fieldDef.resolve) !== null && _fieldDef$resolve !== void 0 ? _fieldDef$resolve : exeContext.fieldResolver;
-  var info = buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path); // Get the resolve function, regardless of if its result is normal
-  // or abrupt (error).
-
-  var result = resolveFieldValueOrError(exeContext, fieldDef, fieldNodes, resolveFn, source, info);
-  return completeValueCatchingError(exeContext, fieldDef.type, fieldNodes, info, path, result);
-}
-/**
- * @internal
- */
-
-
-export function buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path) {
-  // The resolve function's optional fourth argument is a collection of
-  // information about the current execution state.
-  return {
-    fieldName: fieldDef.name,
-    fieldNodes: fieldNodes,
-    returnType: fieldDef.type,
-    parentType: parentType,
-    path: path,
-    schema: exeContext.schema,
-    fragments: exeContext.fragments,
-    rootValue: exeContext.rootValue,
-    operation: exeContext.operation,
-    variableValues: exeContext.variableValues
-  };
-}
-/**
- * Isolates the "ReturnOrAbrupt" behavior to not de-opt the `resolveField`
- * function. Returns the result of resolveFn or the abrupt-return Error object.
- *
- * @internal
- */
-
-export function resolveFieldValueOrError(exeContext, fieldDef, fieldNodes, resolveFn, source, info) {
-  try {
-    // Build a JS object of arguments from the field.arguments AST, using the
-    // variables scope to fulfill any variable references.
-    // TODO: find a way to memoize, in case this field is within a List type.
-    var args = getArgumentValues(fieldDef, fieldNodes[0], exeContext.variableValues); // The resolve function's optional third argument is a context value that
-    // is provided to every resolve function within an execution. It is commonly
-    // used to represent an authenticated user, or request-specific caches.
-
-    var _contextValue = exeContext.contextValue;
-    var result = resolveFn(source, args, _contextValue, info);
-    return isPromise(result) ? result.then(undefined, asErrorInstance) : result;
-  } catch (error) {
-    return asErrorInstance(error);
-  }
-} // Sometimes a non-error is thrown, wrap it as an Error instance to ensure a
-// consistent Error interface.
-
-function asErrorInstance(error) {
-  if (error instanceof Error) {
-    return error;
-  }
-
-  return new Error('Unexpected error value: ' + inspect(error));
-} // This is a small wrapper around completeValue which detects and logs errors
-// in the execution context.
-
-
-function completeValueCatchingError(exeContext, returnType, fieldNodes, info, path, result) {
-  try {
-    var completed;
-
-    if (isPromise(result)) {
-      completed = result.then(function (resolved) {
-        return completeValue(exeContext, returnType, fieldNodes, info, path, resolved);
-      });
-    } else {
-      completed = completeValue(exeContext, returnType, fieldNodes, info, path, result);
-    }
-
-    if (isPromise(completed)) {
-      // Note: we don't rely on a `catch` method, but we do expect "thenable"
-      // to take a second callback for the error case.
-      return completed.then(undefined, function (error) {
-        return handleFieldError(error, fieldNodes, path, returnType, exeContext);
-      });
-    }
-
-    return completed;
-  } catch (error) {
-    return handleFieldError(error, fieldNodes, path, returnType, exeContext);
-  }
-}
-
-function handleFieldError(rawError, fieldNodes, path, returnType, exeContext) {
-  var error = locatedError(asErrorInstance(rawError), fieldNodes, pathToArray(path)); // If the field type is non-nullable, then it is resolved without any
-  // protection from errors, however it still properly locates the error.
-
-  if (isNonNullType(returnType)) {
-    throw error;
-  } // Otherwise, error protection is applied, logging the error and resolving
-  // a null value for this field if one is encountered.
-
-
-  exeContext.errors.push(error);
-  return null;
-}
-/**
- * Implements the instructions for completeValue as defined in the
- * "Field entries" section of the spec.
- *
- * If the field type is Non-Null, then this recursively completes the value
- * for the inner type. It throws a field error if that completion returns null,
- * as per the "Nullability" section of the spec.
- *
- * If the field type is a List, then this recursively completes the value
- * for the inner type on each item in the list.
- *
- * If the field type is a Scalar or Enum, ensures the completed value is a legal
- * value of the type by calling the `serialize` method of GraphQL type
- * definition.
- *
- * If the field is an abstract type, determine the runtime type of the value
- * and then complete based on that type
- *
- * Otherwise, the field type expects a sub-selection set, and will complete the
- * value by evaluating all sub-selections.
- */
-
-
-function completeValue(exeContext, returnType, fieldNodes, info, path, result) {
-  // If result is an Error, throw a located error.
-  if (result instanceof Error) {
-    throw result;
-  } // If field type is NonNull, complete for inner type, and throw field error
-  // if result is null.
-
-
-  if (isNonNullType(returnType)) {
-    var completed = completeValue(exeContext, returnType.ofType, fieldNodes, info, path, result);
-
-    if (completed === null) {
-      throw new Error("Cannot return null for non-nullable field ".concat(info.parentType.name, ".").concat(info.fieldName, "."));
-    }
-
-    return completed;
-  } // If result value is null or undefined then return null.
-
-
-  if (result == null) {
-    return null;
-  } // If field type is List, complete each item in the list with the inner type
-
-
-  if (isListType(returnType)) {
-    return completeListValue(exeContext, returnType, fieldNodes, info, path, result);
-  } // If field type is a leaf type, Scalar or Enum, serialize to a valid value,
-  // returning null if serialization is not possible.
-
-
-  if (isLeafType(returnType)) {
-    return completeLeafValue(returnType, result);
-  } // If field type is an abstract type, Interface or Union, determine the
-  // runtime Object type and complete for that type.
-
-
-  if (isAbstractType(returnType)) {
-    return completeAbstractValue(exeContext, returnType, fieldNodes, info, path, result);
-  } // If field type is Object, execute and complete all sub-selections.
-
-
-  /* istanbul ignore else */
-  if (isObjectType(returnType)) {
-    return completeObjectValue(exeContext, returnType, fieldNodes, info, path, result);
-  } // Not reachable. All possible output types have been considered.
-
-
-  /* istanbul ignore next */
-  invariant(false, 'Cannot complete value of unexpected output type: ' + inspect(returnType));
-}
-/**
- * Complete a list value by completing each item in the list with the
- * inner type
- */
-
-
-function completeListValue(exeContext, returnType, fieldNodes, info, path, result) {
-  if (!isCollection(result)) {
-    throw new GraphQLError("Expected Iterable, but did not find one for field \"".concat(info.parentType.name, ".").concat(info.fieldName, "\"."));
-  } // This is specified as a simple map, however we're optimizing the path
-  // where the list contains no Promises by avoiding creating another Promise.
-
-
-  var itemType = returnType.ofType;
-  var containsPromise = false;
-  var completedResults = arrayFrom(result, function (item, index) {
-    // No need to modify the info object containing the path,
-    // since from here on it is not ever accessed by resolver functions.
-    var fieldPath = addPath(path, index);
-    var completedItem = completeValueCatchingError(exeContext, itemType, fieldNodes, info, fieldPath, item);
-
-    if (!containsPromise && isPromise(completedItem)) {
-      containsPromise = true;
-    }
-
-    return completedItem;
-  });
-  return containsPromise ? Promise.all(completedResults) : completedResults;
-}
-/**
- * Complete a Scalar or Enum by serializing to a valid value, returning
- * null if serialization is not possible.
- */
-
-
-function completeLeafValue(returnType, result) {
-  var serializedResult = returnType.serialize(result);
-
-  if (serializedResult === undefined) {
-    throw new Error("Expected a value of type \"".concat(inspect(returnType), "\" but ") + "received: ".concat(inspect(result)));
-  }
-
-  return serializedResult;
-}
-/**
- * Complete a value of an abstract type by determining the runtime object type
- * of that value, then complete the value for that type.
- */
-
-
-function completeAbstractValue(exeContext, returnType, fieldNodes, info, path, result) {
-  var _returnType$resolveTy;
-
-  var resolveTypeFn = (_returnType$resolveTy = returnType.resolveType) !== null && _returnType$resolveTy !== void 0 ? _returnType$resolveTy : exeContext.typeResolver;
-  var contextValue = exeContext.contextValue;
-  var runtimeType = resolveTypeFn(result, contextValue, info, returnType);
-
-  if (isPromise(runtimeType)) {
-    return runtimeType.then(function (resolvedRuntimeType) {
-      return completeObjectValue(exeContext, ensureValidRuntimeType(resolvedRuntimeType, exeContext, returnType, fieldNodes, info, result), fieldNodes, info, path, result);
-    });
-  }
-
-  return completeObjectValue(exeContext, ensureValidRuntimeType(runtimeType, exeContext, returnType, fieldNodes, info, result), fieldNodes, info, path, result);
-}
-
-function ensureValidRuntimeType(runtimeTypeOrName, exeContext, returnType, fieldNodes, info, result) {
-  var runtimeType = typeof runtimeTypeOrName === 'string' ? exeContext.schema.getType(runtimeTypeOrName) : runtimeTypeOrName;
-
-  if (!isObjectType(runtimeType)) {
-    throw new GraphQLError("Abstract type \"".concat(returnType.name, "\" must resolve to an Object type at runtime for field \"").concat(info.parentType.name, ".").concat(info.fieldName, "\" with ") + "value ".concat(inspect(result), ", received \"").concat(inspect(runtimeType), "\". ") + "Either the \"".concat(returnType.name, "\" type should provide a \"resolveType\" function or each possible type should provide an \"isTypeOf\" function."), fieldNodes);
-  }
-
-  if (!exeContext.schema.isSubType(returnType, runtimeType)) {
-    throw new GraphQLError("Runtime Object type \"".concat(runtimeType.name, "\" is not a possible type for \"").concat(returnType.name, "\"."), fieldNodes);
-  }
-
-  return runtimeType;
-}
-/**
- * Complete an Object value by executing all sub-selections.
- */
-
-
-function completeObjectValue(exeContext, returnType, fieldNodes, info, path, result) {
-  // If there is an isTypeOf predicate function, call it with the
-  // current result. If isTypeOf returns false, then raise an error rather
-  // than continuing execution.
-  if (returnType.isTypeOf) {
-    var isTypeOf = returnType.isTypeOf(result, exeContext.contextValue, info);
-
-    if (isPromise(isTypeOf)) {
-      return isTypeOf.then(function (resolvedIsTypeOf) {
-        if (!resolvedIsTypeOf) {
-          throw invalidReturnTypeError(returnType, result, fieldNodes);
-        }
-
-        return collectAndExecuteSubfields(exeContext, returnType, fieldNodes, path, result);
-      });
-    }
-
-    if (!isTypeOf) {
-      throw invalidReturnTypeError(returnType, result, fieldNodes);
-    }
-  }
-
-  return collectAndExecuteSubfields(exeContext, returnType, fieldNodes, path, result);
-}
-
-function invalidReturnTypeError(returnType, result, fieldNodes) {
-  return new GraphQLError("Expected value of type \"".concat(returnType.name, "\" but got: ").concat(inspect(result), "."), fieldNodes);
-}
-
-function collectAndExecuteSubfields(exeContext, returnType, fieldNodes, path, result) {
-  // Collect sub-fields to execute to complete this value.
-  var subFieldNodes = collectSubfields(exeContext, returnType, fieldNodes);
-  return executeFields(exeContext, returnType, result, path, subFieldNodes);
-}
-/**
- * A memoized collection of relevant subfields with regard to the return
- * type. Memoizing ensures the subfields are not repeatedly calculated, which
- * saves overhead when resolving lists of values.
- */
-
-
-var collectSubfields = memoize3(_collectSubfields);
-
-function _collectSubfields(exeContext, returnType, fieldNodes) {
-  var subFieldNodes = Object.create(null);
-  var visitedFragmentNames = Object.create(null);
-
-  for (var _i8 = 0; _i8 < fieldNodes.length; _i8++) {
-    var node = fieldNodes[_i8];
-
-    if (node.selectionSet) {
-      subFieldNodes = collectFields(exeContext, returnType, node.selectionSet, subFieldNodes, visitedFragmentNames);
-    }
-  }
-
-  return subFieldNodes;
-}
-/**
- * If a resolveType function is not given, then a default resolve behavior is
- * used which attempts two strategies:
- *
- * First, See if the provided value has a `__typename` field defined, if so, use
- * that value as name of the resolved type.
- *
- * Otherwise, test each possible type for the abstract type by calling
- * isTypeOf for the object being coerced, returning the first type that matches.
- */
-
-
-export var defaultTypeResolver = function defaultTypeResolver(value, contextValue, info, abstractType) {
-  // First, look for `__typename`.
-  if (isObjectLike(value) && typeof value.__typename === 'string') {
-    return value.__typename;
-  } // Otherwise, test each possible type.
-
-
-  var possibleTypes = info.schema.getPossibleTypes(abstractType);
-  var promisedIsTypeOfResults = [];
-
-  for (var i = 0; i < possibleTypes.length; i++) {
-    var type = possibleTypes[i];
-
-    if (type.isTypeOf) {
-      var isTypeOfResult = type.isTypeOf(value, contextValue, info);
-
-      if (isPromise(isTypeOfResult)) {
-        promisedIsTypeOfResults[i] = isTypeOfResult;
-      } else if (isTypeOfResult) {
-        return type;
-      }
-    }
-  }
-
-  if (promisedIsTypeOfResults.length) {
-    return Promise.all(promisedIsTypeOfResults).then(function (isTypeOfResults) {
-      for (var _i9 = 0; _i9 < isTypeOfResults.length; _i9++) {
-        if (isTypeOfResults[_i9]) {
-          return possibleTypes[_i9];
-        }
-      }
-    });
-  }
-};
-/**
- * If a resolve function is not given, then a default resolve behavior is used
- * which takes the property of the source object of the same name as the field
- * and returns it as the result, or if it's a function, returns the result
- * of calling that function while passing along args and context value.
- */
-
-export var defaultFieldResolver = function defaultFieldResolver(source, args, contextValue, info) {
-  // ensure source is a value for which property access is acceptable.
-  if (isObjectLike(source) || typeof source === 'function') {
-    var property = source[info.fieldName];
-
-    if (typeof property === 'function') {
-      return source[info.fieldName](args, contextValue, info);
-    }
-
-    return property;
-  }
-};
-/**
- * This method looks up the field on the given type definition.
- * It has special casing for the two introspection fields, __schema
- * and __typename. __typename is special because it can always be
- * queried as a field, even in situations where no other fields
- * are allowed, like on a Union. __schema could get automatically
- * added to the query type, but that would require mutating type
- * definitions, which would cause issues.
- *
- * @internal
- */
-
-export function getFieldDef(schema, parentType, fieldName) {
-  if (fieldName === SchemaMetaFieldDef.name && schema.getQueryType() === parentType) {
-    return SchemaMetaFieldDef;
-  } else if (fieldName === TypeMetaFieldDef.name && schema.getQueryType() === parentType) {
-    return TypeMetaFieldDef;
-  } else if (fieldName === TypeNameMetaFieldDef.name) {
-    return TypeNameMetaFieldDef;
-  }
-
-  return parentType.getFields()[fieldName];
-}
diff --git a/node_modules/graphql/execution/index.d.ts b/node_modules/graphql/execution/index.d.ts
deleted file mode 100644
index ed0f8f1..0000000
--- a/node_modules/graphql/execution/index.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export { pathToArray as responsePathAsArray } from '../jsutils/Path';
-
-export {
-  execute,
-  defaultFieldResolver,
-  defaultTypeResolver,
-  ExecutionArgs,
-  ExecutionResult,
-} from './execute';
-
-export { getDirectiveValues } from './values';
diff --git a/node_modules/graphql/execution/index.js b/node_modules/graphql/execution/index.js
deleted file mode 100644
index 1dfb5a3..0000000
--- a/node_modules/graphql/execution/index.js
+++ /dev/null
@@ -1,41 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "responsePathAsArray", {
-  enumerable: true,
-  get: function get() {
-    return _Path.pathToArray;
-  }
-});
-Object.defineProperty(exports, "execute", {
-  enumerable: true,
-  get: function get() {
-    return _execute.execute;
-  }
-});
-Object.defineProperty(exports, "defaultFieldResolver", {
-  enumerable: true,
-  get: function get() {
-    return _execute.defaultFieldResolver;
-  }
-});
-Object.defineProperty(exports, "defaultTypeResolver", {
-  enumerable: true,
-  get: function get() {
-    return _execute.defaultTypeResolver;
-  }
-});
-Object.defineProperty(exports, "getDirectiveValues", {
-  enumerable: true,
-  get: function get() {
-    return _values.getDirectiveValues;
-  }
-});
-
-var _Path = require("../jsutils/Path");
-
-var _execute = require("./execute");
-
-var _values = require("./values");
diff --git a/node_modules/graphql/execution/index.js.flow b/node_modules/graphql/execution/index.js.flow
deleted file mode 100644
index c7ffa5c..0000000
--- a/node_modules/graphql/execution/index.js.flow
+++ /dev/null
@@ -1,8 +0,0 @@
-// @flow strict
-
-export { pathToArray as responsePathAsArray } from '../jsutils/Path';
-
-export { execute, defaultFieldResolver, defaultTypeResolver } from './execute';
-export type { ExecutionArgs, ExecutionResult } from './execute';
-
-export { getDirectiveValues } from './values';
diff --git a/node_modules/graphql/execution/index.mjs b/node_modules/graphql/execution/index.mjs
deleted file mode 100644
index ff4a47e..0000000
--- a/node_modules/graphql/execution/index.mjs
+++ /dev/null
@@ -1,3 +0,0 @@
-export { pathToArray as responsePathAsArray } from "../jsutils/Path.mjs";
-export { execute, defaultFieldResolver, defaultTypeResolver } from "./execute.mjs";
-export { getDirectiveValues } from "./values.mjs";
diff --git a/node_modules/graphql/execution/values.d.ts b/node_modules/graphql/execution/values.d.ts
deleted file mode 100644
index 82e2ce8..0000000
--- a/node_modules/graphql/execution/values.d.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-import { GraphQLError } from '../error/GraphQLError';
-import {
-  FieldNode,
-  DirectiveNode,
-  VariableDefinitionNode,
-} from '../language/ast';
-
-import { GraphQLDirective } from '../type/directives';
-import { GraphQLSchema } from '../type/schema';
-import { GraphQLField } from '../type/definition';
-
-type CoercedVariableValues =
-  | { errors: ReadonlyArray<GraphQLError>; coerced?: never }
-  | { errors?: never; coerced: { [key: string]: any } };
-
-/**
- * Prepares an object map of variableValues of the correct type based on the
- * provided variable definitions and arbitrary input. If the input cannot be
- * parsed to match the variable definitions, a GraphQLError will be thrown.
- *
- * Note: The returned value is a plain Object with a prototype, since it is
- * exposed to user code. Care should be taken to not pull values from the
- * Object prototype.
- */
-export function getVariableValues(
-  schema: GraphQLSchema,
-  varDefNodes: ReadonlyArray<VariableDefinitionNode>,
-  inputs: { [key: string]: any },
-  options?: { maxErrors?: number },
-): CoercedVariableValues;
-
-/**
- * Prepares an object map of argument values given a list of argument
- * definitions and list of argument AST nodes.
- *
- * Note: The returned value is a plain Object with a prototype, since it is
- * exposed to user code. Care should be taken to not pull values from the
- * Object prototype.
- */
-export function getArgumentValues(
-  def: GraphQLField<any, any> | GraphQLDirective,
-  node: FieldNode | DirectiveNode,
-  variableValues?: Maybe<{ [key: string]: any }>,
-): { [key: string]: any };
-
-/**
- * Prepares an object map of argument values given a directive definition
- * and a AST node which may contain directives. Optionally also accepts a map
- * of variable values.
- *
- * If the directive does not exist on the node, returns undefined.
- *
- * Note: The returned value is a plain Object with a prototype, since it is
- * exposed to user code. Care should be taken to not pull values from the
- * Object prototype.
- */
-export function getDirectiveValues(
-  directiveDef: GraphQLDirective,
-  node: {
-    readonly directives?: ReadonlyArray<DirectiveNode>;
-  },
-  variableValues?: Maybe<{ [key: string]: any }>,
-): undefined | { [key: string]: any };
diff --git a/node_modules/graphql/execution/values.js b/node_modules/graphql/execution/values.js
deleted file mode 100644
index e626a04..0000000
--- a/node_modules/graphql/execution/values.js
+++ /dev/null
@@ -1,229 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getVariableValues = getVariableValues;
-exports.getArgumentValues = getArgumentValues;
-exports.getDirectiveValues = getDirectiveValues;
-
-var _find = _interopRequireDefault(require("../polyfills/find"));
-
-var _keyMap = _interopRequireDefault(require("../jsutils/keyMap"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _printPathArray = _interopRequireDefault(require("../jsutils/printPathArray"));
-
-var _GraphQLError = require("../error/GraphQLError");
-
-var _kinds = require("../language/kinds");
-
-var _printer = require("../language/printer");
-
-var _definition = require("../type/definition");
-
-var _typeFromAST = require("../utilities/typeFromAST");
-
-var _valueFromAST = require("../utilities/valueFromAST");
-
-var _coerceInputValue = require("../utilities/coerceInputValue");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Prepares an object map of variableValues of the correct type based on the
- * provided variable definitions and arbitrary input. If the input cannot be
- * parsed to match the variable definitions, a GraphQLError will be thrown.
- *
- * Note: The returned value is a plain Object with a prototype, since it is
- * exposed to user code. Care should be taken to not pull values from the
- * Object prototype.
- *
- * @internal
- */
-function getVariableValues(schema, varDefNodes, inputs, options) {
-  var errors = [];
-  var maxErrors = options === null || options === void 0 ? void 0 : options.maxErrors;
-
-  try {
-    var coerced = coerceVariableValues(schema, varDefNodes, inputs, function (error) {
-      if (maxErrors != null && errors.length >= maxErrors) {
-        throw new _GraphQLError.GraphQLError('Too many errors processing variables, error limit reached. Execution aborted.');
-      }
-
-      errors.push(error);
-    });
-
-    if (errors.length === 0) {
-      return {
-        coerced: coerced
-      };
-    }
-  } catch (error) {
-    errors.push(error);
-  }
-
-  return {
-    errors: errors
-  };
-}
-
-function coerceVariableValues(schema, varDefNodes, inputs, onError) {
-  var coercedValues = {};
-
-  var _loop = function _loop(_i2) {
-    var varDefNode = varDefNodes[_i2];
-    var varName = varDefNode.variable.name.value;
-    var varType = (0, _typeFromAST.typeFromAST)(schema, varDefNode.type);
-
-    if (!(0, _definition.isInputType)(varType)) {
-      // Must use input types for variables. This should be caught during
-      // validation, however is checked again here for safety.
-      var varTypeStr = (0, _printer.print)(varDefNode.type);
-      onError(new _GraphQLError.GraphQLError("Variable \"$".concat(varName, "\" expected value of type \"").concat(varTypeStr, "\" which cannot be used as an input type."), varDefNode.type));
-      return "continue";
-    }
-
-    if (!hasOwnProperty(inputs, varName)) {
-      if (varDefNode.defaultValue) {
-        coercedValues[varName] = (0, _valueFromAST.valueFromAST)(varDefNode.defaultValue, varType);
-      } else if ((0, _definition.isNonNullType)(varType)) {
-        var _varTypeStr = (0, _inspect.default)(varType);
-
-        onError(new _GraphQLError.GraphQLError("Variable \"$".concat(varName, "\" of required type \"").concat(_varTypeStr, "\" was not provided."), varDefNode));
-      }
-
-      return "continue";
-    }
-
-    var value = inputs[varName];
-
-    if (value === null && (0, _definition.isNonNullType)(varType)) {
-      var _varTypeStr2 = (0, _inspect.default)(varType);
-
-      onError(new _GraphQLError.GraphQLError("Variable \"$".concat(varName, "\" of non-null type \"").concat(_varTypeStr2, "\" must not be null."), varDefNode));
-      return "continue";
-    }
-
-    coercedValues[varName] = (0, _coerceInputValue.coerceInputValue)(value, varType, function (path, invalidValue, error) {
-      var prefix = "Variable \"$".concat(varName, "\" got invalid value ") + (0, _inspect.default)(invalidValue);
-
-      if (path.length > 0) {
-        prefix += " at \"".concat(varName).concat((0, _printPathArray.default)(path), "\"");
-      }
-
-      onError(new _GraphQLError.GraphQLError(prefix + '; ' + error.message, varDefNode, undefined, undefined, undefined, error.originalError));
-    });
-  };
-
-  for (var _i2 = 0; _i2 < varDefNodes.length; _i2++) {
-    var _ret = _loop(_i2);
-
-    if (_ret === "continue") continue;
-  }
-
-  return coercedValues;
-}
-/**
- * Prepares an object map of argument values given a list of argument
- * definitions and list of argument AST nodes.
- *
- * Note: The returned value is a plain Object with a prototype, since it is
- * exposed to user code. Care should be taken to not pull values from the
- * Object prototype.
- *
- * @internal
- */
-
-
-function getArgumentValues(def, node, variableValues) {
-  var _node$arguments;
-
-  var coercedValues = {};
-  /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-  var argumentNodes = (_node$arguments = node.arguments) !== null && _node$arguments !== void 0 ? _node$arguments : [];
-  var argNodeMap = (0, _keyMap.default)(argumentNodes, function (arg) {
-    return arg.name.value;
-  });
-
-  for (var _i4 = 0, _def$args2 = def.args; _i4 < _def$args2.length; _i4++) {
-    var argDef = _def$args2[_i4];
-    var name = argDef.name;
-    var argType = argDef.type;
-    var argumentNode = argNodeMap[name];
-
-    if (!argumentNode) {
-      if (argDef.defaultValue !== undefined) {
-        coercedValues[name] = argDef.defaultValue;
-      } else if ((0, _definition.isNonNullType)(argType)) {
-        throw new _GraphQLError.GraphQLError("Argument \"".concat(name, "\" of required type \"").concat((0, _inspect.default)(argType), "\" ") + 'was not provided.', node);
-      }
-
-      continue;
-    }
-
-    var valueNode = argumentNode.value;
-    var isNull = valueNode.kind === _kinds.Kind.NULL;
-
-    if (valueNode.kind === _kinds.Kind.VARIABLE) {
-      var variableName = valueNode.name.value;
-
-      if (variableValues == null || !hasOwnProperty(variableValues, variableName)) {
-        if (argDef.defaultValue !== undefined) {
-          coercedValues[name] = argDef.defaultValue;
-        } else if ((0, _definition.isNonNullType)(argType)) {
-          throw new _GraphQLError.GraphQLError("Argument \"".concat(name, "\" of required type \"").concat((0, _inspect.default)(argType), "\" ") + "was provided the variable \"$".concat(variableName, "\" which was not provided a runtime value."), valueNode);
-        }
-
-        continue;
-      }
-
-      isNull = variableValues[variableName] == null;
-    }
-
-    if (isNull && (0, _definition.isNonNullType)(argType)) {
-      throw new _GraphQLError.GraphQLError("Argument \"".concat(name, "\" of non-null type \"").concat((0, _inspect.default)(argType), "\" ") + 'must not be null.', valueNode);
-    }
-
-    var coercedValue = (0, _valueFromAST.valueFromAST)(valueNode, argType, variableValues);
-
-    if (coercedValue === undefined) {
-      // Note: ValuesOfCorrectTypeRule validation should catch this before
-      // execution. This is a runtime check to ensure execution does not
-      // continue with an invalid argument value.
-      throw new _GraphQLError.GraphQLError("Argument \"".concat(name, "\" has invalid value ").concat((0, _printer.print)(valueNode), "."), valueNode);
-    }
-
-    coercedValues[name] = coercedValue;
-  }
-
-  return coercedValues;
-}
-/**
- * Prepares an object map of argument values given a directive definition
- * and a AST node which may contain directives. Optionally also accepts a map
- * of variable values.
- *
- * If the directive does not exist on the node, returns undefined.
- *
- * Note: The returned value is a plain Object with a prototype, since it is
- * exposed to user code. Care should be taken to not pull values from the
- * Object prototype.
- */
-
-
-function getDirectiveValues(directiveDef, node, variableValues) {
-  var directiveNode = node.directives && (0, _find.default)(node.directives, function (directive) {
-    return directive.name.value === directiveDef.name;
-  });
-
-  if (directiveNode) {
-    return getArgumentValues(directiveDef, directiveNode, variableValues);
-  }
-}
-
-function hasOwnProperty(obj, prop) {
-  return Object.prototype.hasOwnProperty.call(obj, prop);
-}
diff --git a/node_modules/graphql/execution/values.js.flow b/node_modules/graphql/execution/values.js.flow
deleted file mode 100644
index 44c5149..0000000
--- a/node_modules/graphql/execution/values.js.flow
+++ /dev/null
@@ -1,266 +0,0 @@
-// @flow strict
-
-import find from '../polyfills/find';
-
-import keyMap from '../jsutils/keyMap';
-import inspect from '../jsutils/inspect';
-import { type ObjMap } from '../jsutils/ObjMap';
-import printPathArray from '../jsutils/printPathArray';
-
-import { GraphQLError } from '../error/GraphQLError';
-
-import { Kind } from '../language/kinds';
-import { print } from '../language/printer';
-import {
-  type FieldNode,
-  type DirectiveNode,
-  type VariableDefinitionNode,
-} from '../language/ast';
-
-import { type GraphQLSchema } from '../type/schema';
-import { type GraphQLDirective } from '../type/directives';
-import {
-  type GraphQLField,
-  isInputType,
-  isNonNullType,
-} from '../type/definition';
-
-import { typeFromAST } from '../utilities/typeFromAST';
-import { valueFromAST } from '../utilities/valueFromAST';
-import { coerceInputValue } from '../utilities/coerceInputValue';
-
-type CoercedVariableValues =
-  | {| errors: $ReadOnlyArray<GraphQLError> |}
-  | {| coerced: { [variable: string]: mixed, ... } |};
-
-/**
- * Prepares an object map of variableValues of the correct type based on the
- * provided variable definitions and arbitrary input. If the input cannot be
- * parsed to match the variable definitions, a GraphQLError will be thrown.
- *
- * Note: The returned value is a plain Object with a prototype, since it is
- * exposed to user code. Care should be taken to not pull values from the
- * Object prototype.
- *
- * @internal
- */
-export function getVariableValues(
-  schema: GraphQLSchema,
-  varDefNodes: $ReadOnlyArray<VariableDefinitionNode>,
-  inputs: { +[variable: string]: mixed, ... },
-  options?: {| maxErrors?: number |},
-): CoercedVariableValues {
-  const errors = [];
-  const maxErrors = options?.maxErrors;
-  try {
-    const coerced = coerceVariableValues(schema, varDefNodes, inputs, error => {
-      if (maxErrors != null && errors.length >= maxErrors) {
-        throw new GraphQLError(
-          'Too many errors processing variables, error limit reached. Execution aborted.',
-        );
-      }
-      errors.push(error);
-    });
-
-    if (errors.length === 0) {
-      return { coerced };
-    }
-  } catch (error) {
-    errors.push(error);
-  }
-
-  return { errors };
-}
-
-function coerceVariableValues(
-  schema: GraphQLSchema,
-  varDefNodes: $ReadOnlyArray<VariableDefinitionNode>,
-  inputs: { +[variable: string]: mixed, ... },
-  onError: GraphQLError => void,
-): { [variable: string]: mixed, ... } {
-  const coercedValues = {};
-  for (const varDefNode of varDefNodes) {
-    const varName = varDefNode.variable.name.value;
-    const varType = typeFromAST(schema, varDefNode.type);
-    if (!isInputType(varType)) {
-      // Must use input types for variables. This should be caught during
-      // validation, however is checked again here for safety.
-      const varTypeStr = print(varDefNode.type);
-      onError(
-        new GraphQLError(
-          `Variable "$${varName}" expected value of type "${varTypeStr}" which cannot be used as an input type.`,
-          varDefNode.type,
-        ),
-      );
-      continue;
-    }
-
-    if (!hasOwnProperty(inputs, varName)) {
-      if (varDefNode.defaultValue) {
-        coercedValues[varName] = valueFromAST(varDefNode.defaultValue, varType);
-      } else if (isNonNullType(varType)) {
-        const varTypeStr = inspect(varType);
-        onError(
-          new GraphQLError(
-            `Variable "$${varName}" of required type "${varTypeStr}" was not provided.`,
-            varDefNode,
-          ),
-        );
-      }
-      continue;
-    }
-
-    const value = inputs[varName];
-    if (value === null && isNonNullType(varType)) {
-      const varTypeStr = inspect(varType);
-      onError(
-        new GraphQLError(
-          `Variable "$${varName}" of non-null type "${varTypeStr}" must not be null.`,
-          varDefNode,
-        ),
-      );
-      continue;
-    }
-
-    coercedValues[varName] = coerceInputValue(
-      value,
-      varType,
-      (path, invalidValue, error) => {
-        let prefix =
-          `Variable "$${varName}" got invalid value ` + inspect(invalidValue);
-        if (path.length > 0) {
-          prefix += ` at "${varName}${printPathArray(path)}"`;
-        }
-        onError(
-          new GraphQLError(
-            prefix + '; ' + error.message,
-            varDefNode,
-            undefined,
-            undefined,
-            undefined,
-            error.originalError,
-          ),
-        );
-      },
-    );
-  }
-
-  return coercedValues;
-}
-
-/**
- * Prepares an object map of argument values given a list of argument
- * definitions and list of argument AST nodes.
- *
- * Note: The returned value is a plain Object with a prototype, since it is
- * exposed to user code. Care should be taken to not pull values from the
- * Object prototype.
- *
- * @internal
- */
-export function getArgumentValues(
-  def: GraphQLField<mixed, mixed> | GraphQLDirective,
-  node: FieldNode | DirectiveNode,
-  variableValues?: ?ObjMap<mixed>,
-): { [argument: string]: mixed, ... } {
-  const coercedValues = {};
-
-  /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-  const argumentNodes = node.arguments ?? [];
-  const argNodeMap = keyMap(argumentNodes, arg => arg.name.value);
-
-  for (const argDef of def.args) {
-    const name = argDef.name;
-    const argType = argDef.type;
-    const argumentNode = argNodeMap[name];
-
-    if (!argumentNode) {
-      if (argDef.defaultValue !== undefined) {
-        coercedValues[name] = argDef.defaultValue;
-      } else if (isNonNullType(argType)) {
-        throw new GraphQLError(
-          `Argument "${name}" of required type "${inspect(argType)}" ` +
-            'was not provided.',
-          node,
-        );
-      }
-      continue;
-    }
-
-    const valueNode = argumentNode.value;
-    let isNull = valueNode.kind === Kind.NULL;
-
-    if (valueNode.kind === Kind.VARIABLE) {
-      const variableName = valueNode.name.value;
-      if (
-        variableValues == null ||
-        !hasOwnProperty(variableValues, variableName)
-      ) {
-        if (argDef.defaultValue !== undefined) {
-          coercedValues[name] = argDef.defaultValue;
-        } else if (isNonNullType(argType)) {
-          throw new GraphQLError(
-            `Argument "${name}" of required type "${inspect(argType)}" ` +
-              `was provided the variable "$${variableName}" which was not provided a runtime value.`,
-            valueNode,
-          );
-        }
-        continue;
-      }
-      isNull = variableValues[variableName] == null;
-    }
-
-    if (isNull && isNonNullType(argType)) {
-      throw new GraphQLError(
-        `Argument "${name}" of non-null type "${inspect(argType)}" ` +
-          'must not be null.',
-        valueNode,
-      );
-    }
-
-    const coercedValue = valueFromAST(valueNode, argType, variableValues);
-    if (coercedValue === undefined) {
-      // Note: ValuesOfCorrectTypeRule validation should catch this before
-      // execution. This is a runtime check to ensure execution does not
-      // continue with an invalid argument value.
-      throw new GraphQLError(
-        `Argument "${name}" has invalid value ${print(valueNode)}.`,
-        valueNode,
-      );
-    }
-    coercedValues[name] = coercedValue;
-  }
-  return coercedValues;
-}
-
-/**
- * Prepares an object map of argument values given a directive definition
- * and a AST node which may contain directives. Optionally also accepts a map
- * of variable values.
- *
- * If the directive does not exist on the node, returns undefined.
- *
- * Note: The returned value is a plain Object with a prototype, since it is
- * exposed to user code. Care should be taken to not pull values from the
- * Object prototype.
- */
-export function getDirectiveValues(
-  directiveDef: GraphQLDirective,
-  node: { +directives?: $ReadOnlyArray<DirectiveNode>, ... },
-  variableValues?: ?ObjMap<mixed>,
-): void | { [argument: string]: mixed, ... } {
-  const directiveNode =
-    node.directives &&
-    find(
-      node.directives,
-      directive => directive.name.value === directiveDef.name,
-    );
-
-  if (directiveNode) {
-    return getArgumentValues(directiveDef, directiveNode, variableValues);
-  }
-}
-
-function hasOwnProperty(obj: mixed, prop: string): boolean {
-  return Object.prototype.hasOwnProperty.call(obj, prop);
-}
diff --git a/node_modules/graphql/execution/values.mjs b/node_modules/graphql/execution/values.mjs
deleted file mode 100644
index 7fc668e..0000000
--- a/node_modules/graphql/execution/values.mjs
+++ /dev/null
@@ -1,207 +0,0 @@
-import find from "../polyfills/find.mjs";
-import keyMap from "../jsutils/keyMap.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import printPathArray from "../jsutils/printPathArray.mjs";
-import { GraphQLError } from "../error/GraphQLError.mjs";
-import { Kind } from "../language/kinds.mjs";
-import { print } from "../language/printer.mjs";
-import { isInputType, isNonNullType } from "../type/definition.mjs";
-import { typeFromAST } from "../utilities/typeFromAST.mjs";
-import { valueFromAST } from "../utilities/valueFromAST.mjs";
-import { coerceInputValue } from "../utilities/coerceInputValue.mjs";
-
-/**
- * Prepares an object map of variableValues of the correct type based on the
- * provided variable definitions and arbitrary input. If the input cannot be
- * parsed to match the variable definitions, a GraphQLError will be thrown.
- *
- * Note: The returned value is a plain Object with a prototype, since it is
- * exposed to user code. Care should be taken to not pull values from the
- * Object prototype.
- *
- * @internal
- */
-export function getVariableValues(schema, varDefNodes, inputs, options) {
-  var errors = [];
-  var maxErrors = options === null || options === void 0 ? void 0 : options.maxErrors;
-
-  try {
-    var coerced = coerceVariableValues(schema, varDefNodes, inputs, function (error) {
-      if (maxErrors != null && errors.length >= maxErrors) {
-        throw new GraphQLError('Too many errors processing variables, error limit reached. Execution aborted.');
-      }
-
-      errors.push(error);
-    });
-
-    if (errors.length === 0) {
-      return {
-        coerced: coerced
-      };
-    }
-  } catch (error) {
-    errors.push(error);
-  }
-
-  return {
-    errors: errors
-  };
-}
-
-function coerceVariableValues(schema, varDefNodes, inputs, onError) {
-  var coercedValues = {};
-
-  var _loop = function _loop(_i2) {
-    var varDefNode = varDefNodes[_i2];
-    var varName = varDefNode.variable.name.value;
-    var varType = typeFromAST(schema, varDefNode.type);
-
-    if (!isInputType(varType)) {
-      // Must use input types for variables. This should be caught during
-      // validation, however is checked again here for safety.
-      var varTypeStr = print(varDefNode.type);
-      onError(new GraphQLError("Variable \"$".concat(varName, "\" expected value of type \"").concat(varTypeStr, "\" which cannot be used as an input type."), varDefNode.type));
-      return "continue";
-    }
-
-    if (!hasOwnProperty(inputs, varName)) {
-      if (varDefNode.defaultValue) {
-        coercedValues[varName] = valueFromAST(varDefNode.defaultValue, varType);
-      } else if (isNonNullType(varType)) {
-        var _varTypeStr = inspect(varType);
-
-        onError(new GraphQLError("Variable \"$".concat(varName, "\" of required type \"").concat(_varTypeStr, "\" was not provided."), varDefNode));
-      }
-
-      return "continue";
-    }
-
-    var value = inputs[varName];
-
-    if (value === null && isNonNullType(varType)) {
-      var _varTypeStr2 = inspect(varType);
-
-      onError(new GraphQLError("Variable \"$".concat(varName, "\" of non-null type \"").concat(_varTypeStr2, "\" must not be null."), varDefNode));
-      return "continue";
-    }
-
-    coercedValues[varName] = coerceInputValue(value, varType, function (path, invalidValue, error) {
-      var prefix = "Variable \"$".concat(varName, "\" got invalid value ") + inspect(invalidValue);
-
-      if (path.length > 0) {
-        prefix += " at \"".concat(varName).concat(printPathArray(path), "\"");
-      }
-
-      onError(new GraphQLError(prefix + '; ' + error.message, varDefNode, undefined, undefined, undefined, error.originalError));
-    });
-  };
-
-  for (var _i2 = 0; _i2 < varDefNodes.length; _i2++) {
-    var _ret = _loop(_i2);
-
-    if (_ret === "continue") continue;
-  }
-
-  return coercedValues;
-}
-/**
- * Prepares an object map of argument values given a list of argument
- * definitions and list of argument AST nodes.
- *
- * Note: The returned value is a plain Object with a prototype, since it is
- * exposed to user code. Care should be taken to not pull values from the
- * Object prototype.
- *
- * @internal
- */
-
-
-export function getArgumentValues(def, node, variableValues) {
-  var _node$arguments;
-
-  var coercedValues = {};
-  /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-  var argumentNodes = (_node$arguments = node.arguments) !== null && _node$arguments !== void 0 ? _node$arguments : [];
-  var argNodeMap = keyMap(argumentNodes, function (arg) {
-    return arg.name.value;
-  });
-
-  for (var _i4 = 0, _def$args2 = def.args; _i4 < _def$args2.length; _i4++) {
-    var argDef = _def$args2[_i4];
-    var name = argDef.name;
-    var argType = argDef.type;
-    var argumentNode = argNodeMap[name];
-
-    if (!argumentNode) {
-      if (argDef.defaultValue !== undefined) {
-        coercedValues[name] = argDef.defaultValue;
-      } else if (isNonNullType(argType)) {
-        throw new GraphQLError("Argument \"".concat(name, "\" of required type \"").concat(inspect(argType), "\" ") + 'was not provided.', node);
-      }
-
-      continue;
-    }
-
-    var valueNode = argumentNode.value;
-    var isNull = valueNode.kind === Kind.NULL;
-
-    if (valueNode.kind === Kind.VARIABLE) {
-      var variableName = valueNode.name.value;
-
-      if (variableValues == null || !hasOwnProperty(variableValues, variableName)) {
-        if (argDef.defaultValue !== undefined) {
-          coercedValues[name] = argDef.defaultValue;
-        } else if (isNonNullType(argType)) {
-          throw new GraphQLError("Argument \"".concat(name, "\" of required type \"").concat(inspect(argType), "\" ") + "was provided the variable \"$".concat(variableName, "\" which was not provided a runtime value."), valueNode);
-        }
-
-        continue;
-      }
-
-      isNull = variableValues[variableName] == null;
-    }
-
-    if (isNull && isNonNullType(argType)) {
-      throw new GraphQLError("Argument \"".concat(name, "\" of non-null type \"").concat(inspect(argType), "\" ") + 'must not be null.', valueNode);
-    }
-
-    var coercedValue = valueFromAST(valueNode, argType, variableValues);
-
-    if (coercedValue === undefined) {
-      // Note: ValuesOfCorrectTypeRule validation should catch this before
-      // execution. This is a runtime check to ensure execution does not
-      // continue with an invalid argument value.
-      throw new GraphQLError("Argument \"".concat(name, "\" has invalid value ").concat(print(valueNode), "."), valueNode);
-    }
-
-    coercedValues[name] = coercedValue;
-  }
-
-  return coercedValues;
-}
-/**
- * Prepares an object map of argument values given a directive definition
- * and a AST node which may contain directives. Optionally also accepts a map
- * of variable values.
- *
- * If the directive does not exist on the node, returns undefined.
- *
- * Note: The returned value is a plain Object with a prototype, since it is
- * exposed to user code. Care should be taken to not pull values from the
- * Object prototype.
- */
-
-export function getDirectiveValues(directiveDef, node, variableValues) {
-  var directiveNode = node.directives && find(node.directives, function (directive) {
-    return directive.name.value === directiveDef.name;
-  });
-
-  if (directiveNode) {
-    return getArgumentValues(directiveDef, directiveNode, variableValues);
-  }
-}
-
-function hasOwnProperty(obj, prop) {
-  return Object.prototype.hasOwnProperty.call(obj, prop);
-}
diff --git a/node_modules/graphql/graphql.d.ts b/node_modules/graphql/graphql.d.ts
deleted file mode 100644
index 90b29c9..0000000
--- a/node_modules/graphql/graphql.d.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import Maybe from './tsutils/Maybe';
-import { Source } from './language/source';
-import { GraphQLSchema } from './type/schema';
-import { GraphQLFieldResolver, GraphQLTypeResolver } from './type/definition';
-import {
-  ExecutionResult,
-  ExecutionResultDataDefault,
-} from './execution/execute';
-
-/**
- * This is the primary entry point function for fulfilling GraphQL operations
- * by parsing, validating, and executing a GraphQL document along side a
- * GraphQL schema.
- *
- * More sophisticated GraphQL servers, such as those which persist queries,
- * may wish to separate the validation and execution phases to a static time
- * tooling step, and a server runtime step.
- *
- * Accepts either an object with named arguments, or individual arguments:
- *
- * schema:
- *    The GraphQL type system to use when validating and executing a query.
- * source:
- *    A GraphQL language formatted string representing the requested operation.
- * rootValue:
- *    The value provided as the first argument to resolver functions on the top
- *    level type (e.g. the query object type).
- * contextValue:
- *    The context value is provided as an argument to resolver functions after
- *    field arguments. It is used to pass shared information useful at any point
- *    during executing this query, for example the currently logged in user and
- *    connections to databases or other services.
- * variableValues:
- *    A mapping of variable name to runtime value to use for all variables
- *    defined in the requestString.
- * operationName:
- *    The name of the operation to use if requestString contains multiple
- *    possible operations. Can be omitted if requestString contains only
- *    one operation.
- * fieldResolver:
- *    A resolver function to use when one is not provided by the schema.
- *    If not provided, the default field resolver is used (which looks for a
- *    value or method on the source value with the field's name).
- */
-export interface GraphQLArgs {
-  schema: GraphQLSchema;
-  source: string | Source;
-  rootValue?: any;
-  contextValue?: any;
-  variableValues?: Maybe<{ [key: string]: any }>;
-  operationName?: Maybe<string>;
-  fieldResolver?: Maybe<GraphQLFieldResolver<any, any>>;
-  typeResolver?: Maybe<GraphQLTypeResolver<any, any>>;
-}
-
-export function graphql<TData = ExecutionResultDataDefault>(
-  args: GraphQLArgs,
-): Promise<ExecutionResult<TData>>;
-export function graphql<TData = ExecutionResultDataDefault>(
-  schema: GraphQLSchema,
-  source: Source | string,
-  rootValue?: any,
-  contextValue?: any,
-  variableValues?: Maybe<{ [key: string]: any }>,
-  operationName?: Maybe<string>,
-  fieldResolver?: Maybe<GraphQLFieldResolver<any, any>>,
-  typeResolver?: Maybe<GraphQLTypeResolver<any, any>>,
-): Promise<ExecutionResult<TData>>;
-
-/**
- * The graphqlSync function also fulfills GraphQL operations by parsing,
- * validating, and executing a GraphQL document along side a GraphQL schema.
- * However, it guarantees to complete synchronously (or throw an error) assuming
- * that all field resolvers are also synchronous.
- */
-export function graphqlSync<TData = ExecutionResultDataDefault>(
-  args: GraphQLArgs,
-): ExecutionResult<TData>;
-export function graphqlSync<TData = ExecutionResultDataDefault>(
-  schema: GraphQLSchema,
-  source: Source | string,
-  rootValue?: any,
-  contextValue?: any,
-  variableValues?: Maybe<{ [key: string]: any }>,
-  operationName?: Maybe<string>,
-  fieldResolver?: Maybe<GraphQLFieldResolver<any, any>>,
-  typeResolver?: Maybe<GraphQLTypeResolver<any, any>>,
-): ExecutionResult<TData>;
diff --git a/node_modules/graphql/graphql.js b/node_modules/graphql/graphql.js
deleted file mode 100644
index 6cc8c55..0000000
--- a/node_modules/graphql/graphql.js
+++ /dev/null
@@ -1,118 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.graphql = graphql;
-exports.graphqlSync = graphqlSync;
-
-var _isPromise = _interopRequireDefault(require("./jsutils/isPromise"));
-
-var _parser = require("./language/parser");
-
-var _validate = require("./validation/validate");
-
-var _validate2 = require("./type/validate");
-
-var _execute = require("./execution/execute");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function graphql(argsOrSchema, source, rootValue, contextValue, variableValues, operationName, fieldResolver, typeResolver) {
-  var _arguments = arguments;
-
-  /* eslint-enable no-redeclare */
-  // Always return a Promise for a consistent API.
-  return new Promise(function (resolve) {
-    return resolve( // Extract arguments from object args if provided.
-    _arguments.length === 1 ? graphqlImpl(argsOrSchema) : graphqlImpl({
-      schema: argsOrSchema,
-      source: source,
-      rootValue: rootValue,
-      contextValue: contextValue,
-      variableValues: variableValues,
-      operationName: operationName,
-      fieldResolver: fieldResolver,
-      typeResolver: typeResolver
-    }));
-  });
-}
-/**
- * The graphqlSync function also fulfills GraphQL operations by parsing,
- * validating, and executing a GraphQL document along side a GraphQL schema.
- * However, it guarantees to complete synchronously (or throw an error) assuming
- * that all field resolvers are also synchronous.
- */
-
-
-function graphqlSync(argsOrSchema, source, rootValue, contextValue, variableValues, operationName, fieldResolver, typeResolver) {
-  /* eslint-enable no-redeclare */
-  // Extract arguments from object args if provided.
-  var result = arguments.length === 1 ? graphqlImpl(argsOrSchema) : graphqlImpl({
-    schema: argsOrSchema,
-    source: source,
-    rootValue: rootValue,
-    contextValue: contextValue,
-    variableValues: variableValues,
-    operationName: operationName,
-    fieldResolver: fieldResolver,
-    typeResolver: typeResolver
-  }); // Assert that the execution was synchronous.
-
-  if ((0, _isPromise.default)(result)) {
-    throw new Error('GraphQL execution failed to complete synchronously.');
-  }
-
-  return result;
-}
-
-function graphqlImpl(args) {
-  var schema = args.schema,
-      source = args.source,
-      rootValue = args.rootValue,
-      contextValue = args.contextValue,
-      variableValues = args.variableValues,
-      operationName = args.operationName,
-      fieldResolver = args.fieldResolver,
-      typeResolver = args.typeResolver; // Validate Schema
-
-  var schemaValidationErrors = (0, _validate2.validateSchema)(schema);
-
-  if (schemaValidationErrors.length > 0) {
-    return {
-      errors: schemaValidationErrors
-    };
-  } // Parse
-
-
-  var document;
-
-  try {
-    document = (0, _parser.parse)(source);
-  } catch (syntaxError) {
-    return {
-      errors: [syntaxError]
-    };
-  } // Validate
-
-
-  var validationErrors = (0, _validate.validate)(schema, document);
-
-  if (validationErrors.length > 0) {
-    return {
-      errors: validationErrors
-    };
-  } // Execute
-
-
-  return (0, _execute.execute)({
-    schema: schema,
-    document: document,
-    rootValue: rootValue,
-    contextValue: contextValue,
-    variableValues: variableValues,
-    operationName: operationName,
-    fieldResolver: fieldResolver,
-    typeResolver: typeResolver
-  });
-}
diff --git a/node_modules/graphql/graphql.js.flow b/node_modules/graphql/graphql.js.flow
deleted file mode 100644
index a49f032..0000000
--- a/node_modules/graphql/graphql.js.flow
+++ /dev/null
@@ -1,207 +0,0 @@
-// @flow strict
-
-import isPromise from './jsutils/isPromise';
-import { type PromiseOrValue } from './jsutils/PromiseOrValue';
-
-import { parse } from './language/parser';
-import { type Source } from './language/source';
-
-import { validate } from './validation/validate';
-
-import { validateSchema } from './type/validate';
-import { type GraphQLSchema } from './type/schema';
-import {
-  type GraphQLFieldResolver,
-  type GraphQLTypeResolver,
-} from './type/definition';
-
-import { type ExecutionResult, execute } from './execution/execute';
-
-/**
- * This is the primary entry point function for fulfilling GraphQL operations
- * by parsing, validating, and executing a GraphQL document along side a
- * GraphQL schema.
- *
- * More sophisticated GraphQL servers, such as those which persist queries,
- * may wish to separate the validation and execution phases to a static time
- * tooling step, and a server runtime step.
- *
- * Accepts either an object with named arguments, or individual arguments:
- *
- * schema:
- *    The GraphQL type system to use when validating and executing a query.
- * source:
- *    A GraphQL language formatted string representing the requested operation.
- * rootValue:
- *    The value provided as the first argument to resolver functions on the top
- *    level type (e.g. the query object type).
- * contextValue:
- *    The context value is provided as an argument to resolver functions after
- *    field arguments. It is used to pass shared information useful at any point
- *    during executing this query, for example the currently logged in user and
- *    connections to databases or other services.
- * variableValues:
- *    A mapping of variable name to runtime value to use for all variables
- *    defined in the requestString.
- * operationName:
- *    The name of the operation to use if requestString contains multiple
- *    possible operations. Can be omitted if requestString contains only
- *    one operation.
- * fieldResolver:
- *    A resolver function to use when one is not provided by the schema.
- *    If not provided, the default field resolver is used (which looks for a
- *    value or method on the source value with the field's name).
- * typeResolver:
- *    A type resolver function to use when none is provided by the schema.
- *    If not provided, the default type resolver is used (which looks for a
- *    `__typename` field or alternatively calls the `isTypeOf` method).
- */
-export type GraphQLArgs = {|
-  schema: GraphQLSchema,
-  source: string | Source,
-  rootValue?: mixed,
-  contextValue?: mixed,
-  variableValues?: ?{ +[variable: string]: mixed, ... },
-  operationName?: ?string,
-  fieldResolver?: ?GraphQLFieldResolver<any, any>,
-  typeResolver?: ?GraphQLTypeResolver<any, any>,
-|};
-declare function graphql(GraphQLArgs, ..._: []): Promise<ExecutionResult>;
-/* eslint-disable no-redeclare */
-declare function graphql(
-  schema: GraphQLSchema,
-  source: Source | string,
-  rootValue?: mixed,
-  contextValue?: mixed,
-  variableValues?: ?{ +[variable: string]: mixed, ... },
-  operationName?: ?string,
-  fieldResolver?: ?GraphQLFieldResolver<any, any>,
-  typeResolver?: ?GraphQLTypeResolver<any, any>,
-): Promise<ExecutionResult>;
-export function graphql(
-  argsOrSchema,
-  source,
-  rootValue,
-  contextValue,
-  variableValues,
-  operationName,
-  fieldResolver,
-  typeResolver,
-) {
-  /* eslint-enable no-redeclare */
-  // Always return a Promise for a consistent API.
-  return new Promise(resolve =>
-    resolve(
-      // Extract arguments from object args if provided.
-      arguments.length === 1
-        ? graphqlImpl(argsOrSchema)
-        : graphqlImpl({
-            schema: argsOrSchema,
-            source,
-            rootValue,
-            contextValue,
-            variableValues,
-            operationName,
-            fieldResolver,
-            typeResolver,
-          }),
-    ),
-  );
-}
-
-/**
- * The graphqlSync function also fulfills GraphQL operations by parsing,
- * validating, and executing a GraphQL document along side a GraphQL schema.
- * However, it guarantees to complete synchronously (or throw an error) assuming
- * that all field resolvers are also synchronous.
- */
-declare function graphqlSync(GraphQLArgs, ..._: []): ExecutionResult;
-/* eslint-disable no-redeclare */
-declare function graphqlSync(
-  schema: GraphQLSchema,
-  source: Source | string,
-  rootValue?: mixed,
-  contextValue?: mixed,
-  variableValues?: ?{ +[variable: string]: mixed, ... },
-  operationName?: ?string,
-  fieldResolver?: ?GraphQLFieldResolver<any, any>,
-  typeResolver?: ?GraphQLTypeResolver<any, any>,
-): ExecutionResult;
-export function graphqlSync(
-  argsOrSchema,
-  source,
-  rootValue,
-  contextValue,
-  variableValues,
-  operationName,
-  fieldResolver,
-  typeResolver,
-) {
-  /* eslint-enable no-redeclare */
-  // Extract arguments from object args if provided.
-  const result =
-    arguments.length === 1
-      ? graphqlImpl(argsOrSchema)
-      : graphqlImpl({
-          schema: argsOrSchema,
-          source,
-          rootValue,
-          contextValue,
-          variableValues,
-          operationName,
-          fieldResolver,
-          typeResolver,
-        });
-
-  // Assert that the execution was synchronous.
-  if (isPromise(result)) {
-    throw new Error('GraphQL execution failed to complete synchronously.');
-  }
-
-  return result;
-}
-
-function graphqlImpl(args: GraphQLArgs): PromiseOrValue<ExecutionResult> {
-  const {
-    schema,
-    source,
-    rootValue,
-    contextValue,
-    variableValues,
-    operationName,
-    fieldResolver,
-    typeResolver,
-  } = args;
-
-  // Validate Schema
-  const schemaValidationErrors = validateSchema(schema);
-  if (schemaValidationErrors.length > 0) {
-    return { errors: schemaValidationErrors };
-  }
-
-  // Parse
-  let document;
-  try {
-    document = parse(source);
-  } catch (syntaxError) {
-    return { errors: [syntaxError] };
-  }
-
-  // Validate
-  const validationErrors = validate(schema, document);
-  if (validationErrors.length > 0) {
-    return { errors: validationErrors };
-  }
-
-  // Execute
-  return execute({
-    schema,
-    document,
-    rootValue,
-    contextValue,
-    variableValues,
-    operationName,
-    fieldResolver,
-    typeResolver,
-  });
-}
diff --git a/node_modules/graphql/graphql.mjs b/node_modules/graphql/graphql.mjs
deleted file mode 100644
index aa3cb91..0000000
--- a/node_modules/graphql/graphql.mjs
+++ /dev/null
@@ -1,142 +0,0 @@
-import isPromise from "./jsutils/isPromise.mjs";
-import { parse } from "./language/parser.mjs";
-import { validate } from "./validation/validate.mjs";
-import { validateSchema } from "./type/validate.mjs";
-import { execute } from "./execution/execute.mjs";
-/**
- * This is the primary entry point function for fulfilling GraphQL operations
- * by parsing, validating, and executing a GraphQL document along side a
- * GraphQL schema.
- *
- * More sophisticated GraphQL servers, such as those which persist queries,
- * may wish to separate the validation and execution phases to a static time
- * tooling step, and a server runtime step.
- *
- * Accepts either an object with named arguments, or individual arguments:
- *
- * schema:
- *    The GraphQL type system to use when validating and executing a query.
- * source:
- *    A GraphQL language formatted string representing the requested operation.
- * rootValue:
- *    The value provided as the first argument to resolver functions on the top
- *    level type (e.g. the query object type).
- * contextValue:
- *    The context value is provided as an argument to resolver functions after
- *    field arguments. It is used to pass shared information useful at any point
- *    during executing this query, for example the currently logged in user and
- *    connections to databases or other services.
- * variableValues:
- *    A mapping of variable name to runtime value to use for all variables
- *    defined in the requestString.
- * operationName:
- *    The name of the operation to use if requestString contains multiple
- *    possible operations. Can be omitted if requestString contains only
- *    one operation.
- * fieldResolver:
- *    A resolver function to use when one is not provided by the schema.
- *    If not provided, the default field resolver is used (which looks for a
- *    value or method on the source value with the field's name).
- * typeResolver:
- *    A type resolver function to use when none is provided by the schema.
- *    If not provided, the default type resolver is used (which looks for a
- *    `__typename` field or alternatively calls the `isTypeOf` method).
- */
-
-export function graphql(argsOrSchema, source, rootValue, contextValue, variableValues, operationName, fieldResolver, typeResolver) {
-  var _arguments = arguments;
-
-  /* eslint-enable no-redeclare */
-  // Always return a Promise for a consistent API.
-  return new Promise(function (resolve) {
-    return resolve( // Extract arguments from object args if provided.
-    _arguments.length === 1 ? graphqlImpl(argsOrSchema) : graphqlImpl({
-      schema: argsOrSchema,
-      source: source,
-      rootValue: rootValue,
-      contextValue: contextValue,
-      variableValues: variableValues,
-      operationName: operationName,
-      fieldResolver: fieldResolver,
-      typeResolver: typeResolver
-    }));
-  });
-}
-/**
- * The graphqlSync function also fulfills GraphQL operations by parsing,
- * validating, and executing a GraphQL document along side a GraphQL schema.
- * However, it guarantees to complete synchronously (or throw an error) assuming
- * that all field resolvers are also synchronous.
- */
-
-export function graphqlSync(argsOrSchema, source, rootValue, contextValue, variableValues, operationName, fieldResolver, typeResolver) {
-  /* eslint-enable no-redeclare */
-  // Extract arguments from object args if provided.
-  var result = arguments.length === 1 ? graphqlImpl(argsOrSchema) : graphqlImpl({
-    schema: argsOrSchema,
-    source: source,
-    rootValue: rootValue,
-    contextValue: contextValue,
-    variableValues: variableValues,
-    operationName: operationName,
-    fieldResolver: fieldResolver,
-    typeResolver: typeResolver
-  }); // Assert that the execution was synchronous.
-
-  if (isPromise(result)) {
-    throw new Error('GraphQL execution failed to complete synchronously.');
-  }
-
-  return result;
-}
-
-function graphqlImpl(args) {
-  var schema = args.schema,
-      source = args.source,
-      rootValue = args.rootValue,
-      contextValue = args.contextValue,
-      variableValues = args.variableValues,
-      operationName = args.operationName,
-      fieldResolver = args.fieldResolver,
-      typeResolver = args.typeResolver; // Validate Schema
-
-  var schemaValidationErrors = validateSchema(schema);
-
-  if (schemaValidationErrors.length > 0) {
-    return {
-      errors: schemaValidationErrors
-    };
-  } // Parse
-
-
-  var document;
-
-  try {
-    document = parse(source);
-  } catch (syntaxError) {
-    return {
-      errors: [syntaxError]
-    };
-  } // Validate
-
-
-  var validationErrors = validate(schema, document);
-
-  if (validationErrors.length > 0) {
-    return {
-      errors: validationErrors
-    };
-  } // Execute
-
-
-  return execute({
-    schema: schema,
-    document: document,
-    rootValue: rootValue,
-    contextValue: contextValue,
-    variableValues: variableValues,
-    operationName: operationName,
-    fieldResolver: fieldResolver,
-    typeResolver: typeResolver
-  });
-}
diff --git a/node_modules/graphql/index.d.ts b/node_modules/graphql/index.d.ts
deleted file mode 100644
index f318172..0000000
--- a/node_modules/graphql/index.d.ts
+++ /dev/null
@@ -1,446 +0,0 @@
-// Minimum TypeScript Version: 2.6
-
-/**
- * GraphQL.js provides a reference implementation for the GraphQL specification
- * but is also a useful utility for operating on GraphQL files and building
- * sophisticated tools.
- *
- * This primary module exports a general purpose function for fulfilling all
- * steps of the GraphQL specification in a single operation, but also includes
- * utilities for every part of the GraphQL specification:
- *
- *   - Parsing the GraphQL language.
- *   - Building a GraphQL type schema.
- *   - Validating a GraphQL request against a type schema.
- *   - Executing a GraphQL request against a type schema.
- *
- * This also includes utility functions for operating on GraphQL types and
- * GraphQL documents to facilitate building tools.
- *
- * You may also import from each sub-directory directly. For example, the
- * following two import statements are equivalent:
- *
- *     import { parse } from 'graphql';
- *     import { parse } from 'graphql/language';
- */
-
-// The GraphQL.js version info.
-export { version, versionInfo } from './version';
-
-// The primary entry point into fulfilling a GraphQL request.
-export { GraphQLArgs, graphql, graphqlSync } from './graphql';
-
-// Create and operate on GraphQL type definitions and schema.
-export {
-  // Definitions
-  GraphQLSchema,
-  GraphQLDirective,
-  GraphQLScalarType,
-  GraphQLObjectType,
-  GraphQLInterfaceType,
-  GraphQLUnionType,
-  GraphQLEnumType,
-  GraphQLInputObjectType,
-  GraphQLList,
-  GraphQLNonNull,
-  // Standard GraphQL Scalars
-  specifiedScalarTypes,
-  GraphQLInt,
-  GraphQLFloat,
-  GraphQLString,
-  GraphQLBoolean,
-  GraphQLID,
-  // Built-in Directives defined by the Spec
-  specifiedDirectives,
-  GraphQLIncludeDirective,
-  GraphQLSkipDirective,
-  GraphQLDeprecatedDirective,
-  // "Enum" of Type Kinds
-  TypeKind,
-  // Constant Deprecation Reason
-  DEFAULT_DEPRECATION_REASON,
-  // GraphQL Types for introspection.
-  introspectionTypes,
-  __Schema,
-  __Directive,
-  __DirectiveLocation,
-  __Type,
-  __Field,
-  __InputValue,
-  __EnumValue,
-  __TypeKind,
-  // Meta-field definitions.
-  SchemaMetaFieldDef,
-  TypeMetaFieldDef,
-  TypeNameMetaFieldDef,
-  // Predicates
-  isSchema,
-  isDirective,
-  isType,
-  isScalarType,
-  isObjectType,
-  isInterfaceType,
-  isUnionType,
-  isEnumType,
-  isInputObjectType,
-  isListType,
-  isNonNullType,
-  isInputType,
-  isOutputType,
-  isLeafType,
-  isCompositeType,
-  isAbstractType,
-  isWrappingType,
-  isNullableType,
-  isNamedType,
-  isRequiredArgument,
-  isRequiredInputField,
-  isSpecifiedScalarType,
-  isIntrospectionType,
-  isSpecifiedDirective,
-  // Assertions
-  assertSchema,
-  assertDirective,
-  assertType,
-  assertScalarType,
-  assertObjectType,
-  assertInterfaceType,
-  assertUnionType,
-  assertEnumType,
-  assertInputObjectType,
-  assertListType,
-  assertNonNullType,
-  assertInputType,
-  assertOutputType,
-  assertLeafType,
-  assertCompositeType,
-  assertAbstractType,
-  assertWrappingType,
-  assertNullableType,
-  assertNamedType,
-  // Un-modifiers
-  getNullableType,
-  getNamedType,
-  // Validate GraphQL schema.
-  validateSchema,
-  assertValidSchema,
-} from './type/index';
-
-export {
-  GraphQLType,
-  GraphQLInputType,
-  GraphQLOutputType,
-  GraphQLLeafType,
-  GraphQLCompositeType,
-  GraphQLAbstractType,
-  GraphQLWrappingType,
-  GraphQLNullableType,
-  GraphQLNamedType,
-  Thunk,
-  GraphQLSchemaConfig,
-  GraphQLDirectiveConfig,
-  GraphQLArgument,
-  GraphQLArgumentConfig,
-  GraphQLEnumTypeConfig,
-  GraphQLEnumValue,
-  GraphQLEnumValueConfig,
-  GraphQLEnumValueConfigMap,
-  GraphQLField,
-  GraphQLFieldConfig,
-  GraphQLFieldConfigArgumentMap,
-  GraphQLFieldConfigMap,
-  GraphQLFieldMap,
-  GraphQLFieldResolver,
-  GraphQLInputField,
-  GraphQLInputFieldConfig,
-  GraphQLInputFieldConfigMap,
-  GraphQLInputFieldMap,
-  GraphQLInputObjectTypeConfig,
-  GraphQLInterfaceTypeConfig,
-  GraphQLIsTypeOfFn,
-  GraphQLObjectTypeConfig,
-  GraphQLResolveInfo,
-  ResponsePath,
-  GraphQLScalarTypeConfig,
-  GraphQLTypeResolver,
-  GraphQLUnionTypeConfig,
-  GraphQLScalarSerializer,
-  GraphQLScalarValueParser,
-  GraphQLScalarLiteralParser,
-} from './type/index';
-
-// Parse and operate on GraphQL language source files.
-export {
-  Source,
-  getLocation,
-  // Print source location
-  printLocation,
-  printSourceLocation,
-  // Lex
-  Lexer,
-  TokenKind,
-  // Parse
-  parse,
-  parseValue,
-  parseType,
-  // Print
-  print,
-  // Visit
-  visit,
-  visitInParallel,
-  getVisitFn,
-  BREAK,
-  Kind,
-  DirectiveLocation,
-  // Predicates
-  isDefinitionNode,
-  isExecutableDefinitionNode,
-  isSelectionNode,
-  isValueNode,
-  isTypeNode,
-  isTypeSystemDefinitionNode,
-  isTypeDefinitionNode,
-  isTypeSystemExtensionNode,
-  isTypeExtensionNode,
-} from './language/index';
-
-export {
-  ParseOptions,
-  SourceLocation,
-  Location,
-  Token,
-  TokenKindEnum,
-  KindEnum,
-  DirectiveLocationEnum,
-  // Visitor utilities
-  ASTVisitor,
-  Visitor,
-  VisitFn,
-  VisitorKeyMap,
-  // AST nodes
-  ASTNode,
-  ASTKindToNode,
-  // Each kind of AST node
-  NameNode,
-  DocumentNode,
-  DefinitionNode,
-  ExecutableDefinitionNode,
-  OperationDefinitionNode,
-  OperationTypeNode,
-  VariableDefinitionNode,
-  VariableNode,
-  SelectionSetNode,
-  SelectionNode,
-  FieldNode,
-  ArgumentNode,
-  FragmentSpreadNode,
-  InlineFragmentNode,
-  FragmentDefinitionNode,
-  ValueNode,
-  IntValueNode,
-  FloatValueNode,
-  StringValueNode,
-  BooleanValueNode,
-  NullValueNode,
-  EnumValueNode,
-  ListValueNode,
-  ObjectValueNode,
-  ObjectFieldNode,
-  DirectiveNode,
-  TypeNode,
-  NamedTypeNode,
-  ListTypeNode,
-  NonNullTypeNode,
-  TypeSystemDefinitionNode,
-  SchemaDefinitionNode,
-  OperationTypeDefinitionNode,
-  TypeDefinitionNode,
-  ScalarTypeDefinitionNode,
-  ObjectTypeDefinitionNode,
-  FieldDefinitionNode,
-  InputValueDefinitionNode,
-  InterfaceTypeDefinitionNode,
-  UnionTypeDefinitionNode,
-  EnumTypeDefinitionNode,
-  EnumValueDefinitionNode,
-  InputObjectTypeDefinitionNode,
-  DirectiveDefinitionNode,
-  TypeSystemExtensionNode,
-  SchemaExtensionNode,
-  TypeExtensionNode,
-  ScalarTypeExtensionNode,
-  ObjectTypeExtensionNode,
-  InterfaceTypeExtensionNode,
-  UnionTypeExtensionNode,
-  EnumTypeExtensionNode,
-  InputObjectTypeExtensionNode,
-} from './language/index';
-
-// Execute GraphQL queries.
-export {
-  execute,
-  defaultFieldResolver,
-  defaultTypeResolver,
-  responsePathAsArray,
-  getDirectiveValues,
-  ExecutionArgs,
-  ExecutionResult,
-} from './execution/index';
-
-export {
-  subscribe,
-  createSourceEventStream,
-  SubscriptionArgs,
-} from './subscription/index';
-
-// Validate GraphQL documents.
-export {
-  validate,
-  ValidationContext,
-  // All validation rules in the GraphQL Specification.
-  specifiedRules,
-  // Individual validation rules.
-  ExecutableDefinitionsRule,
-  FieldsOnCorrectTypeRule,
-  FragmentsOnCompositeTypesRule,
-  KnownArgumentNamesRule,
-  KnownDirectivesRule,
-  KnownFragmentNamesRule,
-  KnownTypeNamesRule,
-  LoneAnonymousOperationRule,
-  NoFragmentCyclesRule,
-  NoUndefinedVariablesRule,
-  NoUnusedFragmentsRule,
-  NoUnusedVariablesRule,
-  OverlappingFieldsCanBeMergedRule,
-  PossibleFragmentSpreadsRule,
-  ProvidedRequiredArgumentsRule,
-  ScalarLeafsRule,
-  SingleFieldSubscriptionsRule,
-  UniqueArgumentNamesRule,
-  UniqueDirectivesPerLocationRule,
-  UniqueFragmentNamesRule,
-  UniqueInputFieldNamesRule,
-  UniqueOperationNamesRule,
-  UniqueVariableNamesRule,
-  ValuesOfCorrectTypeRule,
-  VariablesAreInputTypesRule,
-  VariablesInAllowedPositionRule,
-  // SDL-specific validation rules
-  LoneSchemaDefinitionRule,
-  UniqueOperationTypesRule,
-  UniqueTypeNamesRule,
-  UniqueEnumValueNamesRule,
-  UniqueFieldDefinitionNamesRule,
-  UniqueDirectiveNamesRule,
-  PossibleTypeExtensionsRule,
-  ValidationRule,
-} from './validation/index';
-
-// Create, format, and print GraphQL errors.
-export {
-  GraphQLError,
-  syntaxError,
-  locatedError,
-  printError,
-  formatError,
-  GraphQLFormattedError,
-} from './error/index';
-
-// Utilities for operating on GraphQL type schema and parsed sources.
-export {
-  // Produce the GraphQL query recommended for a full schema introspection.
-  // Accepts optional IntrospectionOptions.
-  getIntrospectionQuery,
-  // Gets the target Operation from a Document.
-  getOperationAST,
-  // Gets the Type for the target Operation AST.
-  getOperationRootType,
-  // Convert a GraphQLSchema to an IntrospectionQuery.
-  introspectionFromSchema,
-  // Build a GraphQLSchema from an introspection result.
-  buildClientSchema,
-  // Build a GraphQLSchema from a parsed GraphQL Schema language AST.
-  buildASTSchema,
-  // Build a GraphQLSchema from a GraphQL schema language document.
-  buildSchema,
-  // @deprecated: Get the description from a schema AST node and supports legacy
-  // syntax for specifying descriptions - will be removed in v16.
-  getDescription,
-  // Extends an existing GraphQLSchema from a parsed GraphQL Schema
-  // language AST.
-  extendSchema,
-  // Sort a GraphQLSchema.
-  lexicographicSortSchema,
-  // Print a GraphQLSchema to GraphQL Schema language.
-  printSchema,
-  // Print a GraphQLType to GraphQL Schema language.
-  printType,
-  // Prints the built-in introspection schema in the Schema Language
-  // format.
-  printIntrospectionSchema,
-  // Create a GraphQLType from a GraphQL language AST.
-  typeFromAST,
-  // Create a JavaScript value from a GraphQL language AST with a Type.
-  valueFromAST,
-  // Create a JavaScript value from a GraphQL language AST without a Type.
-  valueFromASTUntyped,
-  // Create a GraphQL language AST from a JavaScript value.
-  astFromValue,
-  // A helper to use within recursive-descent visitors which need to be aware of
-  // the GraphQL type system.
-  TypeInfo,
-  visitWithTypeInfo,
-  // Coerces a JavaScript value to a GraphQL type, or produces errors.
-  coerceInputValue,
-  // Concatenates multiple AST together.
-  concatAST,
-  // Separates an AST into an AST per Operation.
-  separateOperations,
-  // Strips characters that are not significant to the validity or execution
-  // of a GraphQL document.
-  stripIgnoredCharacters,
-  // Comparators for types
-  isEqualType,
-  isTypeSubTypeOf,
-  doTypesOverlap,
-  // Asserts a string is a valid GraphQL name.
-  assertValidName,
-  // Determine if a string is a valid GraphQL name.
-  isValidNameError,
-  // Compares two GraphQLSchemas and detects breaking changes.
-  BreakingChangeType,
-  DangerousChangeType,
-  findBreakingChanges,
-  findDangerousChanges,
-  // Report all deprecated usage within a GraphQL document.
-  findDeprecatedUsages,
-} from './utilities/index';
-
-export {
-  IntrospectionOptions,
-  IntrospectionQuery,
-  IntrospectionSchema,
-  IntrospectionType,
-  IntrospectionInputType,
-  IntrospectionOutputType,
-  IntrospectionScalarType,
-  IntrospectionObjectType,
-  IntrospectionInterfaceType,
-  IntrospectionUnionType,
-  IntrospectionEnumType,
-  IntrospectionInputObjectType,
-  IntrospectionTypeRef,
-  IntrospectionInputTypeRef,
-  IntrospectionOutputTypeRef,
-  IntrospectionNamedTypeRef,
-  IntrospectionListTypeRef,
-  IntrospectionNonNullTypeRef,
-  IntrospectionField,
-  IntrospectionInputValue,
-  IntrospectionEnumValue,
-  IntrospectionDirective,
-  BuildSchemaOptions,
-  BreakingChange,
-  DangerousChange,
-} from './utilities/index';
diff --git a/node_modules/graphql/index.js b/node_modules/graphql/index.js
deleted file mode 100644
index 0d3d256..0000000
--- a/node_modules/graphql/index.js
+++ /dev/null
@@ -1,1169 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "version", {
-  enumerable: true,
-  get: function get() {
-    return _version.version;
-  }
-});
-Object.defineProperty(exports, "versionInfo", {
-  enumerable: true,
-  get: function get() {
-    return _version.versionInfo;
-  }
-});
-Object.defineProperty(exports, "graphql", {
-  enumerable: true,
-  get: function get() {
-    return _graphql.graphql;
-  }
-});
-Object.defineProperty(exports, "graphqlSync", {
-  enumerable: true,
-  get: function get() {
-    return _graphql.graphqlSync;
-  }
-});
-Object.defineProperty(exports, "GraphQLSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLSchema;
-  }
-});
-Object.defineProperty(exports, "GraphQLDirective", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLDirective;
-  }
-});
-Object.defineProperty(exports, "GraphQLScalarType", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLScalarType;
-  }
-});
-Object.defineProperty(exports, "GraphQLObjectType", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLObjectType;
-  }
-});
-Object.defineProperty(exports, "GraphQLInterfaceType", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLInterfaceType;
-  }
-});
-Object.defineProperty(exports, "GraphQLUnionType", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLUnionType;
-  }
-});
-Object.defineProperty(exports, "GraphQLEnumType", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLEnumType;
-  }
-});
-Object.defineProperty(exports, "GraphQLInputObjectType", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLInputObjectType;
-  }
-});
-Object.defineProperty(exports, "GraphQLList", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLList;
-  }
-});
-Object.defineProperty(exports, "GraphQLNonNull", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLNonNull;
-  }
-});
-Object.defineProperty(exports, "specifiedScalarTypes", {
-  enumerable: true,
-  get: function get() {
-    return _index.specifiedScalarTypes;
-  }
-});
-Object.defineProperty(exports, "GraphQLInt", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLInt;
-  }
-});
-Object.defineProperty(exports, "GraphQLFloat", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLFloat;
-  }
-});
-Object.defineProperty(exports, "GraphQLString", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLString;
-  }
-});
-Object.defineProperty(exports, "GraphQLBoolean", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLBoolean;
-  }
-});
-Object.defineProperty(exports, "GraphQLID", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLID;
-  }
-});
-Object.defineProperty(exports, "specifiedDirectives", {
-  enumerable: true,
-  get: function get() {
-    return _index.specifiedDirectives;
-  }
-});
-Object.defineProperty(exports, "GraphQLIncludeDirective", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLIncludeDirective;
-  }
-});
-Object.defineProperty(exports, "GraphQLSkipDirective", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLSkipDirective;
-  }
-});
-Object.defineProperty(exports, "GraphQLDeprecatedDirective", {
-  enumerable: true,
-  get: function get() {
-    return _index.GraphQLDeprecatedDirective;
-  }
-});
-Object.defineProperty(exports, "TypeKind", {
-  enumerable: true,
-  get: function get() {
-    return _index.TypeKind;
-  }
-});
-Object.defineProperty(exports, "DEFAULT_DEPRECATION_REASON", {
-  enumerable: true,
-  get: function get() {
-    return _index.DEFAULT_DEPRECATION_REASON;
-  }
-});
-Object.defineProperty(exports, "introspectionTypes", {
-  enumerable: true,
-  get: function get() {
-    return _index.introspectionTypes;
-  }
-});
-Object.defineProperty(exports, "__Schema", {
-  enumerable: true,
-  get: function get() {
-    return _index.__Schema;
-  }
-});
-Object.defineProperty(exports, "__Directive", {
-  enumerable: true,
-  get: function get() {
-    return _index.__Directive;
-  }
-});
-Object.defineProperty(exports, "__DirectiveLocation", {
-  enumerable: true,
-  get: function get() {
-    return _index.__DirectiveLocation;
-  }
-});
-Object.defineProperty(exports, "__Type", {
-  enumerable: true,
-  get: function get() {
-    return _index.__Type;
-  }
-});
-Object.defineProperty(exports, "__Field", {
-  enumerable: true,
-  get: function get() {
-    return _index.__Field;
-  }
-});
-Object.defineProperty(exports, "__InputValue", {
-  enumerable: true,
-  get: function get() {
-    return _index.__InputValue;
-  }
-});
-Object.defineProperty(exports, "__EnumValue", {
-  enumerable: true,
-  get: function get() {
-    return _index.__EnumValue;
-  }
-});
-Object.defineProperty(exports, "__TypeKind", {
-  enumerable: true,
-  get: function get() {
-    return _index.__TypeKind;
-  }
-});
-Object.defineProperty(exports, "SchemaMetaFieldDef", {
-  enumerable: true,
-  get: function get() {
-    return _index.SchemaMetaFieldDef;
-  }
-});
-Object.defineProperty(exports, "TypeMetaFieldDef", {
-  enumerable: true,
-  get: function get() {
-    return _index.TypeMetaFieldDef;
-  }
-});
-Object.defineProperty(exports, "TypeNameMetaFieldDef", {
-  enumerable: true,
-  get: function get() {
-    return _index.TypeNameMetaFieldDef;
-  }
-});
-Object.defineProperty(exports, "isSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index.isSchema;
-  }
-});
-Object.defineProperty(exports, "isDirective", {
-  enumerable: true,
-  get: function get() {
-    return _index.isDirective;
-  }
-});
-Object.defineProperty(exports, "isType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isType;
-  }
-});
-Object.defineProperty(exports, "isScalarType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isScalarType;
-  }
-});
-Object.defineProperty(exports, "isObjectType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isObjectType;
-  }
-});
-Object.defineProperty(exports, "isInterfaceType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isInterfaceType;
-  }
-});
-Object.defineProperty(exports, "isUnionType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isUnionType;
-  }
-});
-Object.defineProperty(exports, "isEnumType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isEnumType;
-  }
-});
-Object.defineProperty(exports, "isInputObjectType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isInputObjectType;
-  }
-});
-Object.defineProperty(exports, "isListType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isListType;
-  }
-});
-Object.defineProperty(exports, "isNonNullType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isNonNullType;
-  }
-});
-Object.defineProperty(exports, "isInputType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isInputType;
-  }
-});
-Object.defineProperty(exports, "isOutputType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isOutputType;
-  }
-});
-Object.defineProperty(exports, "isLeafType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isLeafType;
-  }
-});
-Object.defineProperty(exports, "isCompositeType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isCompositeType;
-  }
-});
-Object.defineProperty(exports, "isAbstractType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isAbstractType;
-  }
-});
-Object.defineProperty(exports, "isWrappingType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isWrappingType;
-  }
-});
-Object.defineProperty(exports, "isNullableType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isNullableType;
-  }
-});
-Object.defineProperty(exports, "isNamedType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isNamedType;
-  }
-});
-Object.defineProperty(exports, "isRequiredArgument", {
-  enumerable: true,
-  get: function get() {
-    return _index.isRequiredArgument;
-  }
-});
-Object.defineProperty(exports, "isRequiredInputField", {
-  enumerable: true,
-  get: function get() {
-    return _index.isRequiredInputField;
-  }
-});
-Object.defineProperty(exports, "isSpecifiedScalarType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isSpecifiedScalarType;
-  }
-});
-Object.defineProperty(exports, "isIntrospectionType", {
-  enumerable: true,
-  get: function get() {
-    return _index.isIntrospectionType;
-  }
-});
-Object.defineProperty(exports, "isSpecifiedDirective", {
-  enumerable: true,
-  get: function get() {
-    return _index.isSpecifiedDirective;
-  }
-});
-Object.defineProperty(exports, "assertSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertSchema;
-  }
-});
-Object.defineProperty(exports, "assertDirective", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertDirective;
-  }
-});
-Object.defineProperty(exports, "assertType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertType;
-  }
-});
-Object.defineProperty(exports, "assertScalarType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertScalarType;
-  }
-});
-Object.defineProperty(exports, "assertObjectType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertObjectType;
-  }
-});
-Object.defineProperty(exports, "assertInterfaceType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertInterfaceType;
-  }
-});
-Object.defineProperty(exports, "assertUnionType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertUnionType;
-  }
-});
-Object.defineProperty(exports, "assertEnumType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertEnumType;
-  }
-});
-Object.defineProperty(exports, "assertInputObjectType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertInputObjectType;
-  }
-});
-Object.defineProperty(exports, "assertListType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertListType;
-  }
-});
-Object.defineProperty(exports, "assertNonNullType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertNonNullType;
-  }
-});
-Object.defineProperty(exports, "assertInputType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertInputType;
-  }
-});
-Object.defineProperty(exports, "assertOutputType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertOutputType;
-  }
-});
-Object.defineProperty(exports, "assertLeafType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertLeafType;
-  }
-});
-Object.defineProperty(exports, "assertCompositeType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertCompositeType;
-  }
-});
-Object.defineProperty(exports, "assertAbstractType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertAbstractType;
-  }
-});
-Object.defineProperty(exports, "assertWrappingType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertWrappingType;
-  }
-});
-Object.defineProperty(exports, "assertNullableType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertNullableType;
-  }
-});
-Object.defineProperty(exports, "assertNamedType", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertNamedType;
-  }
-});
-Object.defineProperty(exports, "getNullableType", {
-  enumerable: true,
-  get: function get() {
-    return _index.getNullableType;
-  }
-});
-Object.defineProperty(exports, "getNamedType", {
-  enumerable: true,
-  get: function get() {
-    return _index.getNamedType;
-  }
-});
-Object.defineProperty(exports, "validateSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index.validateSchema;
-  }
-});
-Object.defineProperty(exports, "assertValidSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index.assertValidSchema;
-  }
-});
-Object.defineProperty(exports, "Source", {
-  enumerable: true,
-  get: function get() {
-    return _index2.Source;
-  }
-});
-Object.defineProperty(exports, "getLocation", {
-  enumerable: true,
-  get: function get() {
-    return _index2.getLocation;
-  }
-});
-Object.defineProperty(exports, "printLocation", {
-  enumerable: true,
-  get: function get() {
-    return _index2.printLocation;
-  }
-});
-Object.defineProperty(exports, "printSourceLocation", {
-  enumerable: true,
-  get: function get() {
-    return _index2.printSourceLocation;
-  }
-});
-Object.defineProperty(exports, "Lexer", {
-  enumerable: true,
-  get: function get() {
-    return _index2.Lexer;
-  }
-});
-Object.defineProperty(exports, "TokenKind", {
-  enumerable: true,
-  get: function get() {
-    return _index2.TokenKind;
-  }
-});
-Object.defineProperty(exports, "parse", {
-  enumerable: true,
-  get: function get() {
-    return _index2.parse;
-  }
-});
-Object.defineProperty(exports, "parseValue", {
-  enumerable: true,
-  get: function get() {
-    return _index2.parseValue;
-  }
-});
-Object.defineProperty(exports, "parseType", {
-  enumerable: true,
-  get: function get() {
-    return _index2.parseType;
-  }
-});
-Object.defineProperty(exports, "print", {
-  enumerable: true,
-  get: function get() {
-    return _index2.print;
-  }
-});
-Object.defineProperty(exports, "visit", {
-  enumerable: true,
-  get: function get() {
-    return _index2.visit;
-  }
-});
-Object.defineProperty(exports, "visitInParallel", {
-  enumerable: true,
-  get: function get() {
-    return _index2.visitInParallel;
-  }
-});
-Object.defineProperty(exports, "getVisitFn", {
-  enumerable: true,
-  get: function get() {
-    return _index2.getVisitFn;
-  }
-});
-Object.defineProperty(exports, "BREAK", {
-  enumerable: true,
-  get: function get() {
-    return _index2.BREAK;
-  }
-});
-Object.defineProperty(exports, "Kind", {
-  enumerable: true,
-  get: function get() {
-    return _index2.Kind;
-  }
-});
-Object.defineProperty(exports, "DirectiveLocation", {
-  enumerable: true,
-  get: function get() {
-    return _index2.DirectiveLocation;
-  }
-});
-Object.defineProperty(exports, "isDefinitionNode", {
-  enumerable: true,
-  get: function get() {
-    return _index2.isDefinitionNode;
-  }
-});
-Object.defineProperty(exports, "isExecutableDefinitionNode", {
-  enumerable: true,
-  get: function get() {
-    return _index2.isExecutableDefinitionNode;
-  }
-});
-Object.defineProperty(exports, "isSelectionNode", {
-  enumerable: true,
-  get: function get() {
-    return _index2.isSelectionNode;
-  }
-});
-Object.defineProperty(exports, "isValueNode", {
-  enumerable: true,
-  get: function get() {
-    return _index2.isValueNode;
-  }
-});
-Object.defineProperty(exports, "isTypeNode", {
-  enumerable: true,
-  get: function get() {
-    return _index2.isTypeNode;
-  }
-});
-Object.defineProperty(exports, "isTypeSystemDefinitionNode", {
-  enumerable: true,
-  get: function get() {
-    return _index2.isTypeSystemDefinitionNode;
-  }
-});
-Object.defineProperty(exports, "isTypeDefinitionNode", {
-  enumerable: true,
-  get: function get() {
-    return _index2.isTypeDefinitionNode;
-  }
-});
-Object.defineProperty(exports, "isTypeSystemExtensionNode", {
-  enumerable: true,
-  get: function get() {
-    return _index2.isTypeSystemExtensionNode;
-  }
-});
-Object.defineProperty(exports, "isTypeExtensionNode", {
-  enumerable: true,
-  get: function get() {
-    return _index2.isTypeExtensionNode;
-  }
-});
-Object.defineProperty(exports, "execute", {
-  enumerable: true,
-  get: function get() {
-    return _index3.execute;
-  }
-});
-Object.defineProperty(exports, "defaultFieldResolver", {
-  enumerable: true,
-  get: function get() {
-    return _index3.defaultFieldResolver;
-  }
-});
-Object.defineProperty(exports, "defaultTypeResolver", {
-  enumerable: true,
-  get: function get() {
-    return _index3.defaultTypeResolver;
-  }
-});
-Object.defineProperty(exports, "responsePathAsArray", {
-  enumerable: true,
-  get: function get() {
-    return _index3.responsePathAsArray;
-  }
-});
-Object.defineProperty(exports, "getDirectiveValues", {
-  enumerable: true,
-  get: function get() {
-    return _index3.getDirectiveValues;
-  }
-});
-Object.defineProperty(exports, "subscribe", {
-  enumerable: true,
-  get: function get() {
-    return _index4.subscribe;
-  }
-});
-Object.defineProperty(exports, "createSourceEventStream", {
-  enumerable: true,
-  get: function get() {
-    return _index4.createSourceEventStream;
-  }
-});
-Object.defineProperty(exports, "validate", {
-  enumerable: true,
-  get: function get() {
-    return _index5.validate;
-  }
-});
-Object.defineProperty(exports, "ValidationContext", {
-  enumerable: true,
-  get: function get() {
-    return _index5.ValidationContext;
-  }
-});
-Object.defineProperty(exports, "specifiedRules", {
-  enumerable: true,
-  get: function get() {
-    return _index5.specifiedRules;
-  }
-});
-Object.defineProperty(exports, "ExecutableDefinitionsRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.ExecutableDefinitionsRule;
-  }
-});
-Object.defineProperty(exports, "FieldsOnCorrectTypeRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.FieldsOnCorrectTypeRule;
-  }
-});
-Object.defineProperty(exports, "FragmentsOnCompositeTypesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.FragmentsOnCompositeTypesRule;
-  }
-});
-Object.defineProperty(exports, "KnownArgumentNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.KnownArgumentNamesRule;
-  }
-});
-Object.defineProperty(exports, "KnownDirectivesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.KnownDirectivesRule;
-  }
-});
-Object.defineProperty(exports, "KnownFragmentNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.KnownFragmentNamesRule;
-  }
-});
-Object.defineProperty(exports, "KnownTypeNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.KnownTypeNamesRule;
-  }
-});
-Object.defineProperty(exports, "LoneAnonymousOperationRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.LoneAnonymousOperationRule;
-  }
-});
-Object.defineProperty(exports, "NoFragmentCyclesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.NoFragmentCyclesRule;
-  }
-});
-Object.defineProperty(exports, "NoUndefinedVariablesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.NoUndefinedVariablesRule;
-  }
-});
-Object.defineProperty(exports, "NoUnusedFragmentsRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.NoUnusedFragmentsRule;
-  }
-});
-Object.defineProperty(exports, "NoUnusedVariablesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.NoUnusedVariablesRule;
-  }
-});
-Object.defineProperty(exports, "OverlappingFieldsCanBeMergedRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.OverlappingFieldsCanBeMergedRule;
-  }
-});
-Object.defineProperty(exports, "PossibleFragmentSpreadsRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.PossibleFragmentSpreadsRule;
-  }
-});
-Object.defineProperty(exports, "ProvidedRequiredArgumentsRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.ProvidedRequiredArgumentsRule;
-  }
-});
-Object.defineProperty(exports, "ScalarLeafsRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.ScalarLeafsRule;
-  }
-});
-Object.defineProperty(exports, "SingleFieldSubscriptionsRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.SingleFieldSubscriptionsRule;
-  }
-});
-Object.defineProperty(exports, "UniqueArgumentNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.UniqueArgumentNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueDirectivesPerLocationRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.UniqueDirectivesPerLocationRule;
-  }
-});
-Object.defineProperty(exports, "UniqueFragmentNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.UniqueFragmentNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueInputFieldNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.UniqueInputFieldNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueOperationNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.UniqueOperationNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueVariableNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.UniqueVariableNamesRule;
-  }
-});
-Object.defineProperty(exports, "ValuesOfCorrectTypeRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.ValuesOfCorrectTypeRule;
-  }
-});
-Object.defineProperty(exports, "VariablesAreInputTypesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.VariablesAreInputTypesRule;
-  }
-});
-Object.defineProperty(exports, "VariablesInAllowedPositionRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.VariablesInAllowedPositionRule;
-  }
-});
-Object.defineProperty(exports, "LoneSchemaDefinitionRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.LoneSchemaDefinitionRule;
-  }
-});
-Object.defineProperty(exports, "UniqueOperationTypesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.UniqueOperationTypesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueTypeNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.UniqueTypeNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueEnumValueNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.UniqueEnumValueNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueFieldDefinitionNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.UniqueFieldDefinitionNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueDirectiveNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.UniqueDirectiveNamesRule;
-  }
-});
-Object.defineProperty(exports, "PossibleTypeExtensionsRule", {
-  enumerable: true,
-  get: function get() {
-    return _index5.PossibleTypeExtensionsRule;
-  }
-});
-Object.defineProperty(exports, "GraphQLError", {
-  enumerable: true,
-  get: function get() {
-    return _index6.GraphQLError;
-  }
-});
-Object.defineProperty(exports, "syntaxError", {
-  enumerable: true,
-  get: function get() {
-    return _index6.syntaxError;
-  }
-});
-Object.defineProperty(exports, "locatedError", {
-  enumerable: true,
-  get: function get() {
-    return _index6.locatedError;
-  }
-});
-Object.defineProperty(exports, "printError", {
-  enumerable: true,
-  get: function get() {
-    return _index6.printError;
-  }
-});
-Object.defineProperty(exports, "formatError", {
-  enumerable: true,
-  get: function get() {
-    return _index6.formatError;
-  }
-});
-Object.defineProperty(exports, "getIntrospectionQuery", {
-  enumerable: true,
-  get: function get() {
-    return _index7.getIntrospectionQuery;
-  }
-});
-Object.defineProperty(exports, "getOperationAST", {
-  enumerable: true,
-  get: function get() {
-    return _index7.getOperationAST;
-  }
-});
-Object.defineProperty(exports, "getOperationRootType", {
-  enumerable: true,
-  get: function get() {
-    return _index7.getOperationRootType;
-  }
-});
-Object.defineProperty(exports, "introspectionFromSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index7.introspectionFromSchema;
-  }
-});
-Object.defineProperty(exports, "buildClientSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index7.buildClientSchema;
-  }
-});
-Object.defineProperty(exports, "buildASTSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index7.buildASTSchema;
-  }
-});
-Object.defineProperty(exports, "buildSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index7.buildSchema;
-  }
-});
-Object.defineProperty(exports, "getDescription", {
-  enumerable: true,
-  get: function get() {
-    return _index7.getDescription;
-  }
-});
-Object.defineProperty(exports, "extendSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index7.extendSchema;
-  }
-});
-Object.defineProperty(exports, "lexicographicSortSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index7.lexicographicSortSchema;
-  }
-});
-Object.defineProperty(exports, "printSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index7.printSchema;
-  }
-});
-Object.defineProperty(exports, "printType", {
-  enumerable: true,
-  get: function get() {
-    return _index7.printType;
-  }
-});
-Object.defineProperty(exports, "printIntrospectionSchema", {
-  enumerable: true,
-  get: function get() {
-    return _index7.printIntrospectionSchema;
-  }
-});
-Object.defineProperty(exports, "typeFromAST", {
-  enumerable: true,
-  get: function get() {
-    return _index7.typeFromAST;
-  }
-});
-Object.defineProperty(exports, "valueFromAST", {
-  enumerable: true,
-  get: function get() {
-    return _index7.valueFromAST;
-  }
-});
-Object.defineProperty(exports, "valueFromASTUntyped", {
-  enumerable: true,
-  get: function get() {
-    return _index7.valueFromASTUntyped;
-  }
-});
-Object.defineProperty(exports, "astFromValue", {
-  enumerable: true,
-  get: function get() {
-    return _index7.astFromValue;
-  }
-});
-Object.defineProperty(exports, "TypeInfo", {
-  enumerable: true,
-  get: function get() {
-    return _index7.TypeInfo;
-  }
-});
-Object.defineProperty(exports, "visitWithTypeInfo", {
-  enumerable: true,
-  get: function get() {
-    return _index7.visitWithTypeInfo;
-  }
-});
-Object.defineProperty(exports, "coerceInputValue", {
-  enumerable: true,
-  get: function get() {
-    return _index7.coerceInputValue;
-  }
-});
-Object.defineProperty(exports, "concatAST", {
-  enumerable: true,
-  get: function get() {
-    return _index7.concatAST;
-  }
-});
-Object.defineProperty(exports, "separateOperations", {
-  enumerable: true,
-  get: function get() {
-    return _index7.separateOperations;
-  }
-});
-Object.defineProperty(exports, "stripIgnoredCharacters", {
-  enumerable: true,
-  get: function get() {
-    return _index7.stripIgnoredCharacters;
-  }
-});
-Object.defineProperty(exports, "isEqualType", {
-  enumerable: true,
-  get: function get() {
-    return _index7.isEqualType;
-  }
-});
-Object.defineProperty(exports, "isTypeSubTypeOf", {
-  enumerable: true,
-  get: function get() {
-    return _index7.isTypeSubTypeOf;
-  }
-});
-Object.defineProperty(exports, "doTypesOverlap", {
-  enumerable: true,
-  get: function get() {
-    return _index7.doTypesOverlap;
-  }
-});
-Object.defineProperty(exports, "assertValidName", {
-  enumerable: true,
-  get: function get() {
-    return _index7.assertValidName;
-  }
-});
-Object.defineProperty(exports, "isValidNameError", {
-  enumerable: true,
-  get: function get() {
-    return _index7.isValidNameError;
-  }
-});
-Object.defineProperty(exports, "BreakingChangeType", {
-  enumerable: true,
-  get: function get() {
-    return _index7.BreakingChangeType;
-  }
-});
-Object.defineProperty(exports, "DangerousChangeType", {
-  enumerable: true,
-  get: function get() {
-    return _index7.DangerousChangeType;
-  }
-});
-Object.defineProperty(exports, "findBreakingChanges", {
-  enumerable: true,
-  get: function get() {
-    return _index7.findBreakingChanges;
-  }
-});
-Object.defineProperty(exports, "findDangerousChanges", {
-  enumerable: true,
-  get: function get() {
-    return _index7.findDangerousChanges;
-  }
-});
-Object.defineProperty(exports, "findDeprecatedUsages", {
-  enumerable: true,
-  get: function get() {
-    return _index7.findDeprecatedUsages;
-  }
-});
-
-var _version = require("./version");
-
-var _graphql = require("./graphql");
-
-var _index = require("./type/index");
-
-var _index2 = require("./language/index");
-
-var _index3 = require("./execution/index");
-
-var _index4 = require("./subscription/index");
-
-var _index5 = require("./validation/index");
-
-var _index6 = require("./error/index");
-
-var _index7 = require("./utilities/index");
diff --git a/node_modules/graphql/index.js.flow b/node_modules/graphql/index.js.flow
deleted file mode 100644
index e92c936..0000000
--- a/node_modules/graphql/index.js.flow
+++ /dev/null
@@ -1,446 +0,0 @@
-// @flow strict
-
-/**
- * GraphQL.js provides a reference implementation for the GraphQL specification
- * but is also a useful utility for operating on GraphQL files and building
- * sophisticated tools.
- *
- * This primary module exports a general purpose function for fulfilling all
- * steps of the GraphQL specification in a single operation, but also includes
- * utilities for every part of the GraphQL specification:
- *
- *   - Parsing the GraphQL language.
- *   - Building a GraphQL type schema.
- *   - Validating a GraphQL request against a type schema.
- *   - Executing a GraphQL request against a type schema.
- *
- * This also includes utility functions for operating on GraphQL types and
- * GraphQL documents to facilitate building tools.
- *
- * You may also import from each sub-directory directly. For example, the
- * following two import statements are equivalent:
- *
- *     import { parse } from 'graphql';
- *     import { parse } from 'graphql/language';
- */
-
-// The GraphQL.js version info.
-export { version, versionInfo } from './version';
-
-// The primary entry point into fulfilling a GraphQL request.
-export type { GraphQLArgs } from './graphql';
-export { graphql, graphqlSync } from './graphql';
-
-// Create and operate on GraphQL type definitions and schema.
-export {
-  // Definitions
-  GraphQLSchema,
-  GraphQLDirective,
-  GraphQLScalarType,
-  GraphQLObjectType,
-  GraphQLInterfaceType,
-  GraphQLUnionType,
-  GraphQLEnumType,
-  GraphQLInputObjectType,
-  GraphQLList,
-  GraphQLNonNull,
-  // Standard GraphQL Scalars
-  specifiedScalarTypes,
-  GraphQLInt,
-  GraphQLFloat,
-  GraphQLString,
-  GraphQLBoolean,
-  GraphQLID,
-  // Built-in Directives defined by the Spec
-  specifiedDirectives,
-  GraphQLIncludeDirective,
-  GraphQLSkipDirective,
-  GraphQLDeprecatedDirective,
-  // "Enum" of Type Kinds
-  TypeKind,
-  // Constant Deprecation Reason
-  DEFAULT_DEPRECATION_REASON,
-  // GraphQL Types for introspection.
-  introspectionTypes,
-  __Schema,
-  __Directive,
-  __DirectiveLocation,
-  __Type,
-  __Field,
-  __InputValue,
-  __EnumValue,
-  __TypeKind,
-  // Meta-field definitions.
-  SchemaMetaFieldDef,
-  TypeMetaFieldDef,
-  TypeNameMetaFieldDef,
-  // Predicates
-  isSchema,
-  isDirective,
-  isType,
-  isScalarType,
-  isObjectType,
-  isInterfaceType,
-  isUnionType,
-  isEnumType,
-  isInputObjectType,
-  isListType,
-  isNonNullType,
-  isInputType,
-  isOutputType,
-  isLeafType,
-  isCompositeType,
-  isAbstractType,
-  isWrappingType,
-  isNullableType,
-  isNamedType,
-  isRequiredArgument,
-  isRequiredInputField,
-  isSpecifiedScalarType,
-  isIntrospectionType,
-  isSpecifiedDirective,
-  // Assertions
-  assertSchema,
-  assertDirective,
-  assertType,
-  assertScalarType,
-  assertObjectType,
-  assertInterfaceType,
-  assertUnionType,
-  assertEnumType,
-  assertInputObjectType,
-  assertListType,
-  assertNonNullType,
-  assertInputType,
-  assertOutputType,
-  assertLeafType,
-  assertCompositeType,
-  assertAbstractType,
-  assertWrappingType,
-  assertNullableType,
-  assertNamedType,
-  // Un-modifiers
-  getNullableType,
-  getNamedType,
-  // Validate GraphQL schema.
-  validateSchema,
-  assertValidSchema,
-} from './type/index';
-
-export type {
-  GraphQLType,
-  GraphQLInputType,
-  GraphQLOutputType,
-  GraphQLLeafType,
-  GraphQLCompositeType,
-  GraphQLAbstractType,
-  GraphQLWrappingType,
-  GraphQLNullableType,
-  GraphQLNamedType,
-  Thunk,
-  GraphQLSchemaConfig,
-  GraphQLDirectiveConfig,
-  GraphQLArgument,
-  GraphQLArgumentConfig,
-  GraphQLEnumTypeConfig,
-  GraphQLEnumValue,
-  GraphQLEnumValueConfig,
-  GraphQLEnumValueConfigMap,
-  GraphQLField,
-  GraphQLFieldConfig,
-  GraphQLFieldConfigArgumentMap,
-  GraphQLFieldConfigMap,
-  GraphQLFieldMap,
-  GraphQLFieldResolver,
-  GraphQLInputField,
-  GraphQLInputFieldConfig,
-  GraphQLInputFieldConfigMap,
-  GraphQLInputFieldMap,
-  GraphQLInputObjectTypeConfig,
-  GraphQLInterfaceTypeConfig,
-  GraphQLIsTypeOfFn,
-  GraphQLObjectTypeConfig,
-  GraphQLResolveInfo,
-  ResponsePath,
-  GraphQLScalarTypeConfig,
-  GraphQLTypeResolver,
-  GraphQLUnionTypeConfig,
-  GraphQLScalarSerializer,
-  GraphQLScalarValueParser,
-  GraphQLScalarLiteralParser,
-} from './type/index';
-
-// Parse and operate on GraphQL language source files.
-export {
-  Source,
-  getLocation,
-  // Print source location
-  printLocation,
-  printSourceLocation,
-  // Lex
-  Lexer,
-  TokenKind,
-  // Parse
-  parse,
-  parseValue,
-  parseType,
-  // Print
-  print,
-  // Visit
-  visit,
-  visitInParallel,
-  getVisitFn,
-  BREAK,
-  Kind,
-  DirectiveLocation,
-  // Predicates
-  isDefinitionNode,
-  isExecutableDefinitionNode,
-  isSelectionNode,
-  isValueNode,
-  isTypeNode,
-  isTypeSystemDefinitionNode,
-  isTypeDefinitionNode,
-  isTypeSystemExtensionNode,
-  isTypeExtensionNode,
-} from './language/index';
-
-export type {
-  ParseOptions,
-  SourceLocation,
-  Location,
-  Token,
-  TokenKindEnum,
-  KindEnum,
-  DirectiveLocationEnum,
-  // Visitor utilities
-  ASTVisitor,
-  Visitor,
-  VisitFn,
-  VisitorKeyMap,
-  // AST nodes
-  ASTNode,
-  ASTKindToNode,
-  // Each kind of AST node
-  NameNode,
-  DocumentNode,
-  DefinitionNode,
-  ExecutableDefinitionNode,
-  OperationDefinitionNode,
-  OperationTypeNode,
-  VariableDefinitionNode,
-  VariableNode,
-  SelectionSetNode,
-  SelectionNode,
-  FieldNode,
-  ArgumentNode,
-  FragmentSpreadNode,
-  InlineFragmentNode,
-  FragmentDefinitionNode,
-  ValueNode,
-  IntValueNode,
-  FloatValueNode,
-  StringValueNode,
-  BooleanValueNode,
-  NullValueNode,
-  EnumValueNode,
-  ListValueNode,
-  ObjectValueNode,
-  ObjectFieldNode,
-  DirectiveNode,
-  TypeNode,
-  NamedTypeNode,
-  ListTypeNode,
-  NonNullTypeNode,
-  TypeSystemDefinitionNode,
-  SchemaDefinitionNode,
-  OperationTypeDefinitionNode,
-  TypeDefinitionNode,
-  ScalarTypeDefinitionNode,
-  ObjectTypeDefinitionNode,
-  FieldDefinitionNode,
-  InputValueDefinitionNode,
-  InterfaceTypeDefinitionNode,
-  UnionTypeDefinitionNode,
-  EnumTypeDefinitionNode,
-  EnumValueDefinitionNode,
-  InputObjectTypeDefinitionNode,
-  DirectiveDefinitionNode,
-  TypeSystemExtensionNode,
-  SchemaExtensionNode,
-  TypeExtensionNode,
-  ScalarTypeExtensionNode,
-  ObjectTypeExtensionNode,
-  InterfaceTypeExtensionNode,
-  UnionTypeExtensionNode,
-  EnumTypeExtensionNode,
-  InputObjectTypeExtensionNode,
-} from './language/index';
-
-// Execute GraphQL queries.
-export {
-  execute,
-  defaultFieldResolver,
-  defaultTypeResolver,
-  responsePathAsArray,
-  getDirectiveValues,
-} from './execution/index';
-
-export type { ExecutionArgs, ExecutionResult } from './execution/index';
-
-export { subscribe, createSourceEventStream } from './subscription/index';
-export type { SubscriptionArgs } from './subscription/index';
-
-// Validate GraphQL documents.
-export {
-  validate,
-  ValidationContext,
-  // All validation rules in the GraphQL Specification.
-  specifiedRules,
-  // Individual validation rules.
-  ExecutableDefinitionsRule,
-  FieldsOnCorrectTypeRule,
-  FragmentsOnCompositeTypesRule,
-  KnownArgumentNamesRule,
-  KnownDirectivesRule,
-  KnownFragmentNamesRule,
-  KnownTypeNamesRule,
-  LoneAnonymousOperationRule,
-  NoFragmentCyclesRule,
-  NoUndefinedVariablesRule,
-  NoUnusedFragmentsRule,
-  NoUnusedVariablesRule,
-  OverlappingFieldsCanBeMergedRule,
-  PossibleFragmentSpreadsRule,
-  ProvidedRequiredArgumentsRule,
-  ScalarLeafsRule,
-  SingleFieldSubscriptionsRule,
-  UniqueArgumentNamesRule,
-  UniqueDirectivesPerLocationRule,
-  UniqueFragmentNamesRule,
-  UniqueInputFieldNamesRule,
-  UniqueOperationNamesRule,
-  UniqueVariableNamesRule,
-  ValuesOfCorrectTypeRule,
-  VariablesAreInputTypesRule,
-  VariablesInAllowedPositionRule,
-  // SDL-specific validation rules
-  LoneSchemaDefinitionRule,
-  UniqueOperationTypesRule,
-  UniqueTypeNamesRule,
-  UniqueEnumValueNamesRule,
-  UniqueFieldDefinitionNamesRule,
-  UniqueDirectiveNamesRule,
-  PossibleTypeExtensionsRule,
-} from './validation/index';
-
-export type { ValidationRule } from './validation/index';
-
-// Create, format, and print GraphQL errors.
-export {
-  GraphQLError,
-  syntaxError,
-  locatedError,
-  printError,
-  formatError,
-} from './error/index';
-
-export type { GraphQLFormattedError } from './error/index';
-
-// Utilities for operating on GraphQL type schema and parsed sources.
-export {
-  // Produce the GraphQL query recommended for a full schema introspection.
-  // Accepts optional IntrospectionOptions.
-  getIntrospectionQuery,
-  // Gets the target Operation from a Document.
-  getOperationAST,
-  // Gets the Type for the target Operation AST.
-  getOperationRootType,
-  // Convert a GraphQLSchema to an IntrospectionQuery.
-  introspectionFromSchema,
-  // Build a GraphQLSchema from an introspection result.
-  buildClientSchema,
-  // Build a GraphQLSchema from a parsed GraphQL Schema language AST.
-  buildASTSchema,
-  // Build a GraphQLSchema from a GraphQL schema language document.
-  buildSchema,
-  // @deprecated: Get the description from a schema AST node and supports legacy
-  // syntax for specifying descriptions - will be removed in v16.
-  getDescription,
-  // Extends an existing GraphQLSchema from a parsed GraphQL Schema
-  // language AST.
-  extendSchema,
-  // Sort a GraphQLSchema.
-  lexicographicSortSchema,
-  // Print a GraphQLSchema to GraphQL Schema language.
-  printSchema,
-  // Print a GraphQLType to GraphQL Schema language.
-  printType,
-  // Prints the built-in introspection schema in the Schema Language
-  // format.
-  printIntrospectionSchema,
-  // Create a GraphQLType from a GraphQL language AST.
-  typeFromAST,
-  // Create a JavaScript value from a GraphQL language AST with a Type.
-  valueFromAST,
-  // Create a JavaScript value from a GraphQL language AST without a Type.
-  valueFromASTUntyped,
-  // Create a GraphQL language AST from a JavaScript value.
-  astFromValue,
-  // A helper to use within recursive-descent visitors which need to be aware of
-  // the GraphQL type system.
-  TypeInfo,
-  visitWithTypeInfo,
-  // Coerces a JavaScript value to a GraphQL type, or produces errors.
-  coerceInputValue,
-  // Concatenates multiple AST together.
-  concatAST,
-  // Separates an AST into an AST per Operation.
-  separateOperations,
-  // Strips characters that are not significant to the validity or execution
-  // of a GraphQL document.
-  stripIgnoredCharacters,
-  // Comparators for types
-  isEqualType,
-  isTypeSubTypeOf,
-  doTypesOverlap,
-  // Asserts a string is a valid GraphQL name.
-  assertValidName,
-  // Determine if a string is a valid GraphQL name.
-  isValidNameError,
-  // Compares two GraphQLSchemas and detects breaking changes.
-  BreakingChangeType,
-  DangerousChangeType,
-  findBreakingChanges,
-  findDangerousChanges,
-  // Report all deprecated usage within a GraphQL document.
-  findDeprecatedUsages,
-} from './utilities/index';
-
-export type {
-  IntrospectionOptions,
-  IntrospectionQuery,
-  IntrospectionSchema,
-  IntrospectionType,
-  IntrospectionInputType,
-  IntrospectionOutputType,
-  IntrospectionScalarType,
-  IntrospectionObjectType,
-  IntrospectionInterfaceType,
-  IntrospectionUnionType,
-  IntrospectionEnumType,
-  IntrospectionInputObjectType,
-  IntrospectionTypeRef,
-  IntrospectionInputTypeRef,
-  IntrospectionOutputTypeRef,
-  IntrospectionNamedTypeRef,
-  IntrospectionListTypeRef,
-  IntrospectionNonNullTypeRef,
-  IntrospectionField,
-  IntrospectionInputValue,
-  IntrospectionEnumValue,
-  IntrospectionDirective,
-  BuildSchemaOptions,
-  BreakingChange,
-  DangerousChange,
-} from './utilities/index';
diff --git a/node_modules/graphql/index.mjs b/node_modules/graphql/index.mjs
deleted file mode 100644
index a949c7c..0000000
--- a/node_modules/graphql/index.mjs
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * GraphQL.js provides a reference implementation for the GraphQL specification
- * but is also a useful utility for operating on GraphQL files and building
- * sophisticated tools.
- *
- * This primary module exports a general purpose function for fulfilling all
- * steps of the GraphQL specification in a single operation, but also includes
- * utilities for every part of the GraphQL specification:
- *
- *   - Parsing the GraphQL language.
- *   - Building a GraphQL type schema.
- *   - Validating a GraphQL request against a type schema.
- *   - Executing a GraphQL request against a type schema.
- *
- * This also includes utility functions for operating on GraphQL types and
- * GraphQL documents to facilitate building tools.
- *
- * You may also import from each sub-directory directly. For example, the
- * following two import statements are equivalent:
- *
- *     import { parse } from 'graphql';
- *     import { parse } from 'graphql/language';
- */
-// The GraphQL.js version info.
-export { version, versionInfo } from "./version.mjs"; // The primary entry point into fulfilling a GraphQL request.
-
-export { graphql, graphqlSync } from "./graphql.mjs"; // Create and operate on GraphQL type definitions and schema.
-
-export { // Definitions
-GraphQLSchema, GraphQLDirective, GraphQLScalarType, GraphQLObjectType, GraphQLInterfaceType, GraphQLUnionType, GraphQLEnumType, GraphQLInputObjectType, GraphQLList, GraphQLNonNull // Standard GraphQL Scalars
-, specifiedScalarTypes, GraphQLInt, GraphQLFloat, GraphQLString, GraphQLBoolean, GraphQLID // Built-in Directives defined by the Spec
-, specifiedDirectives, GraphQLIncludeDirective, GraphQLSkipDirective, GraphQLDeprecatedDirective // "Enum" of Type Kinds
-, TypeKind // Constant Deprecation Reason
-, DEFAULT_DEPRECATION_REASON // GraphQL Types for introspection.
-, introspectionTypes, __Schema, __Directive, __DirectiveLocation, __Type, __Field, __InputValue, __EnumValue, __TypeKind // Meta-field definitions.
-, SchemaMetaFieldDef, TypeMetaFieldDef, TypeNameMetaFieldDef // Predicates
-, isSchema, isDirective, isType, isScalarType, isObjectType, isInterfaceType, isUnionType, isEnumType, isInputObjectType, isListType, isNonNullType, isInputType, isOutputType, isLeafType, isCompositeType, isAbstractType, isWrappingType, isNullableType, isNamedType, isRequiredArgument, isRequiredInputField, isSpecifiedScalarType, isIntrospectionType, isSpecifiedDirective // Assertions
-, assertSchema, assertDirective, assertType, assertScalarType, assertObjectType, assertInterfaceType, assertUnionType, assertEnumType, assertInputObjectType, assertListType, assertNonNullType, assertInputType, assertOutputType, assertLeafType, assertCompositeType, assertAbstractType, assertWrappingType, assertNullableType, assertNamedType // Un-modifiers
-, getNullableType, getNamedType // Validate GraphQL schema.
-, validateSchema, assertValidSchema } from "./type/index.mjs";
-// Parse and operate on GraphQL language source files.
-export { Source, getLocation // Print source location
-, printLocation, printSourceLocation // Lex
-, Lexer, TokenKind // Parse
-, parse, parseValue, parseType // Print
-, print // Visit
-, visit, visitInParallel, getVisitFn, BREAK, Kind, DirectiveLocation // Predicates
-, isDefinitionNode, isExecutableDefinitionNode, isSelectionNode, isValueNode, isTypeNode, isTypeSystemDefinitionNode, isTypeDefinitionNode, isTypeSystemExtensionNode, isTypeExtensionNode } from "./language/index.mjs";
-// Execute GraphQL queries.
-export { execute, defaultFieldResolver, defaultTypeResolver, responsePathAsArray, getDirectiveValues } from "./execution/index.mjs";
-export { subscribe, createSourceEventStream } from "./subscription/index.mjs";
-// Validate GraphQL documents.
-export { validate, ValidationContext // All validation rules in the GraphQL Specification.
-, specifiedRules // Individual validation rules.
-, ExecutableDefinitionsRule, FieldsOnCorrectTypeRule, FragmentsOnCompositeTypesRule, KnownArgumentNamesRule, KnownDirectivesRule, KnownFragmentNamesRule, KnownTypeNamesRule, LoneAnonymousOperationRule, NoFragmentCyclesRule, NoUndefinedVariablesRule, NoUnusedFragmentsRule, NoUnusedVariablesRule, OverlappingFieldsCanBeMergedRule, PossibleFragmentSpreadsRule, ProvidedRequiredArgumentsRule, ScalarLeafsRule, SingleFieldSubscriptionsRule, UniqueArgumentNamesRule, UniqueDirectivesPerLocationRule, UniqueFragmentNamesRule, UniqueInputFieldNamesRule, UniqueOperationNamesRule, UniqueVariableNamesRule, ValuesOfCorrectTypeRule, VariablesAreInputTypesRule, VariablesInAllowedPositionRule // SDL-specific validation rules
-, LoneSchemaDefinitionRule, UniqueOperationTypesRule, UniqueTypeNamesRule, UniqueEnumValueNamesRule, UniqueFieldDefinitionNamesRule, UniqueDirectiveNamesRule, PossibleTypeExtensionsRule } from "./validation/index.mjs";
-// Create, format, and print GraphQL errors.
-export { GraphQLError, syntaxError, locatedError, printError, formatError } from "./error/index.mjs";
-// Utilities for operating on GraphQL type schema and parsed sources.
-export { // Produce the GraphQL query recommended for a full schema introspection.
-// Accepts optional IntrospectionOptions.
-getIntrospectionQuery // Gets the target Operation from a Document.
-, getOperationAST // Gets the Type for the target Operation AST.
-, getOperationRootType // Convert a GraphQLSchema to an IntrospectionQuery.
-, introspectionFromSchema // Build a GraphQLSchema from an introspection result.
-, buildClientSchema // Build a GraphQLSchema from a parsed GraphQL Schema language AST.
-, buildASTSchema // Build a GraphQLSchema from a GraphQL schema language document.
-, buildSchema // @deprecated: Get the description from a schema AST node and supports legacy
-// syntax for specifying descriptions - will be removed in v16.
-, getDescription // Extends an existing GraphQLSchema from a parsed GraphQL Schema
-// language AST.
-, extendSchema // Sort a GraphQLSchema.
-, lexicographicSortSchema // Print a GraphQLSchema to GraphQL Schema language.
-, printSchema // Print a GraphQLType to GraphQL Schema language.
-, printType // Prints the built-in introspection schema in the Schema Language
-// format.
-, printIntrospectionSchema // Create a GraphQLType from a GraphQL language AST.
-, typeFromAST // Create a JavaScript value from a GraphQL language AST with a Type.
-, valueFromAST // Create a JavaScript value from a GraphQL language AST without a Type.
-, valueFromASTUntyped // Create a GraphQL language AST from a JavaScript value.
-, astFromValue // A helper to use within recursive-descent visitors which need to be aware of
-// the GraphQL type system.
-, TypeInfo, visitWithTypeInfo // Coerces a JavaScript value to a GraphQL type, or produces errors.
-, coerceInputValue // Concatenates multiple AST together.
-, concatAST // Separates an AST into an AST per Operation.
-, separateOperations // Strips characters that are not significant to the validity or execution
-// of a GraphQL document.
-, stripIgnoredCharacters // Comparators for types
-, isEqualType, isTypeSubTypeOf, doTypesOverlap // Asserts a string is a valid GraphQL name.
-, assertValidName // Determine if a string is a valid GraphQL name.
-, isValidNameError // Compares two GraphQLSchemas and detects breaking changes.
-, BreakingChangeType, DangerousChangeType, findBreakingChanges, findDangerousChanges // Report all deprecated usage within a GraphQL document.
-, findDeprecatedUsages } from "./utilities/index.mjs";
diff --git a/node_modules/graphql/jsutils/ObjMap.js b/node_modules/graphql/jsutils/ObjMap.js
deleted file mode 100644
index 3918c74..0000000
--- a/node_modules/graphql/jsutils/ObjMap.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";
diff --git a/node_modules/graphql/jsutils/ObjMap.js.flow b/node_modules/graphql/jsutils/ObjMap.js.flow
deleted file mode 100644
index 63a8251..0000000
--- a/node_modules/graphql/jsutils/ObjMap.js.flow
+++ /dev/null
@@ -1,9 +0,0 @@
-// @flow strict
-
-export type ObjMap<T> = { [key: string]: T, __proto__: null, ... };
-export type ObjMapLike<T> = ObjMap<T> | { [key: string]: T, ... };
-
-export type ReadOnlyObjMap<T> = { +[key: string]: T, __proto__: null, ... };
-export type ReadOnlyObjMapLike<T> =
-  | ReadOnlyObjMap<T>
-  | { +[key: string]: T, ... };
diff --git a/node_modules/graphql/jsutils/Path.d.ts b/node_modules/graphql/jsutils/Path.d.ts
deleted file mode 100644
index ef8f10a..0000000
--- a/node_modules/graphql/jsutils/Path.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-export type Path = {
-  prev: Path | undefined;
-  key: string | number;
-};
-
-/**
- * Given a Path and a key, return a new Path containing the new key.
- */
-export function addPath(prev: Path | undefined, key: string | number): Path;
-
-/**
- * Given a Path, return an Array of the path keys.
- */
-export function pathToArray(path: Path): Array<string | number>;
diff --git a/node_modules/graphql/jsutils/Path.js b/node_modules/graphql/jsutils/Path.js
deleted file mode 100644
index 18eaa60..0000000
--- a/node_modules/graphql/jsutils/Path.js
+++ /dev/null
@@ -1,33 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.addPath = addPath;
-exports.pathToArray = pathToArray;
-
-/**
- * Given a Path and a key, return a new Path containing the new key.
- */
-function addPath(prev, key) {
-  return {
-    prev: prev,
-    key: key
-  };
-}
-/**
- * Given a Path, return an Array of the path keys.
- */
-
-
-function pathToArray(path) {
-  var flattened = [];
-  var curr = path;
-
-  while (curr) {
-    flattened.push(curr.key);
-    curr = curr.prev;
-  }
-
-  return flattened.reverse();
-}
diff --git a/node_modules/graphql/jsutils/Path.js.flow b/node_modules/graphql/jsutils/Path.js.flow
deleted file mode 100644
index f477354..0000000
--- a/node_modules/graphql/jsutils/Path.js.flow
+++ /dev/null
@@ -1,29 +0,0 @@
-// @flow strict
-
-export type Path = {|
-  +prev: Path | void,
-  +key: string | number,
-|};
-
-/**
- * Given a Path and a key, return a new Path containing the new key.
- */
-export function addPath(
-  prev: $ReadOnly<Path> | void,
-  key: string | number,
-): Path {
-  return { prev, key };
-}
-
-/**
- * Given a Path, return an Array of the path keys.
- */
-export function pathToArray(path: ?$ReadOnly<Path>): Array<string | number> {
-  const flattened = [];
-  let curr = path;
-  while (curr) {
-    flattened.push(curr.key);
-    curr = curr.prev;
-  }
-  return flattened.reverse();
-}
diff --git a/node_modules/graphql/jsutils/Path.mjs b/node_modules/graphql/jsutils/Path.mjs
deleted file mode 100644
index c511493..0000000
--- a/node_modules/graphql/jsutils/Path.mjs
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Given a Path and a key, return a new Path containing the new key.
- */
-export function addPath(prev, key) {
-  return {
-    prev: prev,
-    key: key
-  };
-}
-/**
- * Given a Path, return an Array of the path keys.
- */
-
-export function pathToArray(path) {
-  var flattened = [];
-  var curr = path;
-
-  while (curr) {
-    flattened.push(curr.key);
-    curr = curr.prev;
-  }
-
-  return flattened.reverse();
-}
diff --git a/node_modules/graphql/jsutils/PromiseOrValue.d.ts b/node_modules/graphql/jsutils/PromiseOrValue.d.ts
deleted file mode 100644
index 6b2517e..0000000
--- a/node_modules/graphql/jsutils/PromiseOrValue.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export type PromiseOrValue<T> = Promise<T> | T;
diff --git a/node_modules/graphql/jsutils/PromiseOrValue.js b/node_modules/graphql/jsutils/PromiseOrValue.js
deleted file mode 100644
index 3918c74..0000000
--- a/node_modules/graphql/jsutils/PromiseOrValue.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";
diff --git a/node_modules/graphql/jsutils/PromiseOrValue.js.flow b/node_modules/graphql/jsutils/PromiseOrValue.js.flow
deleted file mode 100644
index 2d37412..0000000
--- a/node_modules/graphql/jsutils/PromiseOrValue.js.flow
+++ /dev/null
@@ -1,3 +0,0 @@
-// @flow strict
-
-export type PromiseOrValue<+T> = Promise<T> | T;
diff --git a/node_modules/graphql/jsutils/PromiseOrValue.mjs b/node_modules/graphql/jsutils/PromiseOrValue.mjs
deleted file mode 100644
index 8b13789..0000000
--- a/node_modules/graphql/jsutils/PromiseOrValue.mjs
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/node_modules/graphql/jsutils/dedent.js b/node_modules/graphql/jsutils/dedent.js
deleted file mode 100644
index a0206dc..0000000
--- a/node_modules/graphql/jsutils/dedent.js
+++ /dev/null
@@ -1,50 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = dedent;
-
-/**
- * An ES6 string tag that fixes indentation. Also removes leading newlines
- * and trailing spaces and tabs, but keeps trailing newlines.
- *
- * Example usage:
- * const str = dedent`
- *   {
- *     test
- *   }
- * `;
- * str === "{\n  test\n}\n";
- */
-function dedent(strings) {
-  var str = '';
-
-  for (var i = 0; i < strings.length; ++i) {
-    str += strings[i];
-
-    if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) {
-      /* istanbul ignore next (ignore else inside Babel generated code) */
-      var value = i + 1 < 1 || arguments.length <= i + 1 ? undefined : arguments[i + 1];
-      str += value; // interpolation
-    }
-  }
-
-  var trimmedStr = str.replace(/^\n*/m, '') //  remove leading newline
-  .replace(/[ \t]*$/, ''); // remove trailing spaces and tabs
-  // fixes indentation by removing leading spaces and tabs from each line
-
-  var indent = '';
-
-  for (var _i2 = 0; _i2 < trimmedStr.length; _i2++) {
-    var char = trimmedStr[_i2];
-
-    if (char !== ' ' && char !== '\t') {
-      break;
-    }
-
-    indent += char;
-  }
-
-  return trimmedStr.replace(RegExp('^' + indent, 'mg'), ''); // remove indent
-}
diff --git a/node_modules/graphql/jsutils/dedent.js.flow b/node_modules/graphql/jsutils/dedent.js.flow
deleted file mode 100644
index a34a23a..0000000
--- a/node_modules/graphql/jsutils/dedent.js.flow
+++ /dev/null
@@ -1,44 +0,0 @@
-// @flow strict
-
-/**
- * An ES6 string tag that fixes indentation. Also removes leading newlines
- * and trailing spaces and tabs, but keeps trailing newlines.
- *
- * Example usage:
- * const str = dedent`
- *   {
- *     test
- *   }
- * `;
- * str === "{\n  test\n}\n";
- */
-export default function dedent(
-  strings: $ReadOnlyArray<string>,
-  ...values: $ReadOnlyArray<string>
-): string {
-  let str = '';
-
-  for (let i = 0; i < strings.length; ++i) {
-    str += strings[i];
-    if (i < values.length) {
-      /* istanbul ignore next (ignore else inside Babel generated code) */
-      const value = values[i];
-
-      str += value; // interpolation
-    }
-  }
-
-  const trimmedStr = str
-    .replace(/^\n*/m, '') //  remove leading newline
-    .replace(/[ \t]*$/, ''); // remove trailing spaces and tabs
-
-  // fixes indentation by removing leading spaces and tabs from each line
-  let indent = '';
-  for (const char of trimmedStr) {
-    if (char !== ' ' && char !== '\t') {
-      break;
-    }
-    indent += char;
-  }
-  return trimmedStr.replace(RegExp('^' + indent, 'mg'), ''); // remove indent
-}
diff --git a/node_modules/graphql/jsutils/dedent.mjs b/node_modules/graphql/jsutils/dedent.mjs
deleted file mode 100644
index d49841d..0000000
--- a/node_modules/graphql/jsutils/dedent.mjs
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * An ES6 string tag that fixes indentation. Also removes leading newlines
- * and trailing spaces and tabs, but keeps trailing newlines.
- *
- * Example usage:
- * const str = dedent`
- *   {
- *     test
- *   }
- * `;
- * str === "{\n  test\n}\n";
- */
-export default function dedent(strings) {
-  var str = '';
-
-  for (var i = 0; i < strings.length; ++i) {
-    str += strings[i];
-
-    if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) {
-      /* istanbul ignore next (ignore else inside Babel generated code) */
-      var value = i + 1 < 1 || arguments.length <= i + 1 ? undefined : arguments[i + 1];
-      str += value; // interpolation
-    }
-  }
-
-  var trimmedStr = str.replace(/^\n*/m, '') //  remove leading newline
-  .replace(/[ \t]*$/, ''); // remove trailing spaces and tabs
-  // fixes indentation by removing leading spaces and tabs from each line
-
-  var indent = '';
-
-  for (var _i2 = 0; _i2 < trimmedStr.length; _i2++) {
-    var char = trimmedStr[_i2];
-
-    if (char !== ' ' && char !== '\t') {
-      break;
-    }
-
-    indent += char;
-  }
-
-  return trimmedStr.replace(RegExp('^' + indent, 'mg'), ''); // remove indent
-}
diff --git a/node_modules/graphql/jsutils/defineToJSON.js b/node_modules/graphql/jsutils/defineToJSON.js
deleted file mode 100644
index 514e2c6..0000000
--- a/node_modules/graphql/jsutils/defineToJSON.js
+++ /dev/null
@@ -1,25 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = defineToJSON;
-
-var _nodejsCustomInspectSymbol = _interopRequireDefault(require("./nodejsCustomInspectSymbol"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * The `defineToJSON()` function defines toJSON() and inspect() prototype
- * methods, if no function provided they become aliases for toString().
- */
-function defineToJSON(classObject) {
-  var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : classObject.prototype.toString;
-  classObject.prototype.toJSON = fn;
-  classObject.prototype.inspect = fn;
-  /* istanbul ignore else (See: https://github.com/graphql/graphql-js/issues/2317) */
-
-  if (_nodejsCustomInspectSymbol.default) {
-    classObject.prototype[_nodejsCustomInspectSymbol.default] = fn;
-  }
-}
diff --git a/node_modules/graphql/jsutils/defineToJSON.js.flow b/node_modules/graphql/jsutils/defineToJSON.js.flow
deleted file mode 100644
index 76d6f75..0000000
--- a/node_modules/graphql/jsutils/defineToJSON.js.flow
+++ /dev/null
@@ -1,20 +0,0 @@
-// @flow strict
-
-import nodejsCustomInspectSymbol from './nodejsCustomInspectSymbol';
-
-/**
- * The `defineToJSON()` function defines toJSON() and inspect() prototype
- * methods, if no function provided they become aliases for toString().
- */
-export default function defineToJSON(
-  classObject: Class<any> | ((...args: Array<any>) => mixed),
-  fn?: () => mixed = classObject.prototype.toString,
-): void {
-  classObject.prototype.toJSON = fn;
-  classObject.prototype.inspect = fn;
-
-  /* istanbul ignore else (See: https://github.com/graphql/graphql-js/issues/2317) */
-  if (nodejsCustomInspectSymbol) {
-    classObject.prototype[nodejsCustomInspectSymbol] = fn;
-  }
-}
diff --git a/node_modules/graphql/jsutils/defineToJSON.mjs b/node_modules/graphql/jsutils/defineToJSON.mjs
deleted file mode 100644
index 9820bc2..0000000
--- a/node_modules/graphql/jsutils/defineToJSON.mjs
+++ /dev/null
@@ -1,16 +0,0 @@
-import nodejsCustomInspectSymbol from "./nodejsCustomInspectSymbol.mjs";
-/**
- * The `defineToJSON()` function defines toJSON() and inspect() prototype
- * methods, if no function provided they become aliases for toString().
- */
-
-export default function defineToJSON(classObject) {
-  var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : classObject.prototype.toString;
-  classObject.prototype.toJSON = fn;
-  classObject.prototype.inspect = fn;
-  /* istanbul ignore else (See: https://github.com/graphql/graphql-js/issues/2317) */
-
-  if (nodejsCustomInspectSymbol) {
-    classObject.prototype[nodejsCustomInspectSymbol] = fn;
-  }
-}
diff --git a/node_modules/graphql/jsutils/devAssert.js b/node_modules/graphql/jsutils/devAssert.js
deleted file mode 100644
index 623c0f2..0000000
--- a/node_modules/graphql/jsutils/devAssert.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = devAssert;
-
-function devAssert(condition, message) {
-  var booleanCondition = Boolean(condition);
-  /* istanbul ignore else (see transformation done in './resources/inlineInvariant.js') */
-
-  if (!booleanCondition) {
-    throw new Error(message);
-  }
-}
diff --git a/node_modules/graphql/jsutils/devAssert.js.flow b/node_modules/graphql/jsutils/devAssert.js.flow
deleted file mode 100644
index 4d465c4..0000000
--- a/node_modules/graphql/jsutils/devAssert.js.flow
+++ /dev/null
@@ -1,9 +0,0 @@
-// @flow strict
-
-export default function devAssert(condition: mixed, message: string): void {
-  const booleanCondition = Boolean(condition);
-  /* istanbul ignore else (see transformation done in './resources/inlineInvariant.js') */
-  if (!booleanCondition) {
-    throw new Error(message);
-  }
-}
diff --git a/node_modules/graphql/jsutils/devAssert.mjs b/node_modules/graphql/jsutils/devAssert.mjs
deleted file mode 100644
index f91e13b..0000000
--- a/node_modules/graphql/jsutils/devAssert.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-export default function devAssert(condition, message) {
-  var booleanCondition = Boolean(condition);
-  /* istanbul ignore else (see transformation done in './resources/inlineInvariant.js') */
-
-  if (!booleanCondition) {
-    throw new Error(message);
-  }
-}
diff --git a/node_modules/graphql/jsutils/didYouMean.js b/node_modules/graphql/jsutils/didYouMean.js
deleted file mode 100644
index d6b0d90..0000000
--- a/node_modules/graphql/jsutils/didYouMean.js
+++ /dev/null
@@ -1,42 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = didYouMean;
-var MAX_SUGGESTIONS = 5;
-/**
- * Given [ A, B, C ] return ' Did you mean A, B, or C?'.
- */
-
-// eslint-disable-next-line no-redeclare
-function didYouMean(firstArg, secondArg) {
-  var _ref = typeof firstArg === 'string' ? [firstArg, secondArg] : [undefined, firstArg],
-      subMessage = _ref[0],
-      suggestionsArg = _ref[1];
-
-  var message = ' Did you mean ';
-
-  if (subMessage) {
-    message += subMessage + ' ';
-  }
-
-  var suggestions = suggestionsArg.map(function (x) {
-    return "\"".concat(x, "\"");
-  });
-
-  switch (suggestions.length) {
-    case 0:
-      return '';
-
-    case 1:
-      return message + suggestions[0] + '?';
-
-    case 2:
-      return message + suggestions[0] + ' or ' + suggestions[1] + '?';
-  }
-
-  var selected = suggestions.slice(0, MAX_SUGGESTIONS);
-  var lastItem = selected.pop();
-  return message + selected.join(', ') + ', or ' + lastItem + '?';
-}
diff --git a/node_modules/graphql/jsutils/didYouMean.js.flow b/node_modules/graphql/jsutils/didYouMean.js.flow
deleted file mode 100644
index 6c9bc3d..0000000
--- a/node_modules/graphql/jsutils/didYouMean.js.flow
+++ /dev/null
@@ -1,40 +0,0 @@
-// @flow strict
-
-const MAX_SUGGESTIONS = 5;
-
-/**
- * Given [ A, B, C ] return ' Did you mean A, B, or C?'.
- */
-declare function didYouMean(suggestions: $ReadOnlyArray<string>): string;
-// eslint-disable-next-line no-redeclare
-declare function didYouMean(
-  subMessage: string,
-  suggestions: $ReadOnlyArray<string>,
-): string;
-
-// eslint-disable-next-line no-redeclare
-export default function didYouMean(firstArg, secondArg) {
-  const [subMessage, suggestionsArg] =
-    typeof firstArg === 'string'
-      ? [firstArg, secondArg]
-      : [undefined, firstArg];
-
-  let message = ' Did you mean ';
-  if (subMessage) {
-    message += subMessage + ' ';
-  }
-
-  const suggestions = suggestionsArg.map(x => `"${x}"`);
-  switch (suggestions.length) {
-    case 0:
-      return '';
-    case 1:
-      return message + suggestions[0] + '?';
-    case 2:
-      return message + suggestions[0] + ' or ' + suggestions[1] + '?';
-  }
-
-  const selected = suggestions.slice(0, MAX_SUGGESTIONS);
-  const lastItem = selected.pop();
-  return message + selected.join(', ') + ', or ' + lastItem + '?';
-}
diff --git a/node_modules/graphql/jsutils/didYouMean.mjs b/node_modules/graphql/jsutils/didYouMean.mjs
deleted file mode 100644
index 19e26cc..0000000
--- a/node_modules/graphql/jsutils/didYouMean.mjs
+++ /dev/null
@@ -1,36 +0,0 @@
-var MAX_SUGGESTIONS = 5;
-/**
- * Given [ A, B, C ] return ' Did you mean A, B, or C?'.
- */
-
-// eslint-disable-next-line no-redeclare
-export default function didYouMean(firstArg, secondArg) {
-  var _ref = typeof firstArg === 'string' ? [firstArg, secondArg] : [undefined, firstArg],
-      subMessage = _ref[0],
-      suggestionsArg = _ref[1];
-
-  var message = ' Did you mean ';
-
-  if (subMessage) {
-    message += subMessage + ' ';
-  }
-
-  var suggestions = suggestionsArg.map(function (x) {
-    return "\"".concat(x, "\"");
-  });
-
-  switch (suggestions.length) {
-    case 0:
-      return '';
-
-    case 1:
-      return message + suggestions[0] + '?';
-
-    case 2:
-      return message + suggestions[0] + ' or ' + suggestions[1] + '?';
-  }
-
-  var selected = suggestions.slice(0, MAX_SUGGESTIONS);
-  var lastItem = selected.pop();
-  return message + selected.join(', ') + ', or ' + lastItem + '?';
-}
diff --git a/node_modules/graphql/jsutils/identityFunc.js b/node_modules/graphql/jsutils/identityFunc.js
deleted file mode 100644
index 630772f..0000000
--- a/node_modules/graphql/jsutils/identityFunc.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = identityFunc;
-
-/**
- * Returns the first argument it receives.
- */
-function identityFunc(x) {
-  return x;
-}
diff --git a/node_modules/graphql/jsutils/identityFunc.js.flow b/node_modules/graphql/jsutils/identityFunc.js.flow
deleted file mode 100644
index 5cf7c4c..0000000
--- a/node_modules/graphql/jsutils/identityFunc.js.flow
+++ /dev/null
@@ -1,8 +0,0 @@
-// @flow strict
-
-/**
- * Returns the first argument it receives.
- */
-export default function identityFunc<T>(x: T): T {
-  return x;
-}
diff --git a/node_modules/graphql/jsutils/identityFunc.mjs b/node_modules/graphql/jsutils/identityFunc.mjs
deleted file mode 100644
index daf2391..0000000
--- a/node_modules/graphql/jsutils/identityFunc.mjs
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * Returns the first argument it receives.
- */
-export default function identityFunc(x) {
-  return x;
-}
diff --git a/node_modules/graphql/jsutils/inspect.js b/node_modules/graphql/jsutils/inspect.js
deleted file mode 100644
index 9a22f42..0000000
--- a/node_modules/graphql/jsutils/inspect.js
+++ /dev/null
@@ -1,134 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = inspect;
-
-var _nodejsCustomInspectSymbol = _interopRequireDefault(require("./nodejsCustomInspectSymbol"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-var MAX_ARRAY_LENGTH = 10;
-var MAX_RECURSIVE_DEPTH = 2;
-/**
- * Used to print values in error messages.
- */
-
-function inspect(value) {
-  return formatValue(value, []);
-}
-
-function formatValue(value, seenValues) {
-  switch (_typeof(value)) {
-    case 'string':
-      return JSON.stringify(value);
-
-    case 'function':
-      return value.name ? "[function ".concat(value.name, "]") : '[function]';
-
-    case 'object':
-      if (value === null) {
-        return 'null';
-      }
-
-      return formatObjectValue(value, seenValues);
-
-    default:
-      return String(value);
-  }
-}
-
-function formatObjectValue(value, previouslySeenValues) {
-  if (previouslySeenValues.indexOf(value) !== -1) {
-    return '[Circular]';
-  }
-
-  var seenValues = [].concat(previouslySeenValues, [value]);
-  var customInspectFn = getCustomFn(value);
-
-  if (customInspectFn !== undefined) {
-    // $FlowFixMe(>=0.90.0)
-    var customValue = customInspectFn.call(value); // check for infinite recursion
-
-    if (customValue !== value) {
-      return typeof customValue === 'string' ? customValue : formatValue(customValue, seenValues);
-    }
-  } else if (Array.isArray(value)) {
-    return formatArray(value, seenValues);
-  }
-
-  return formatObject(value, seenValues);
-}
-
-function formatObject(object, seenValues) {
-  var keys = Object.keys(object);
-
-  if (keys.length === 0) {
-    return '{}';
-  }
-
-  if (seenValues.length > MAX_RECURSIVE_DEPTH) {
-    return '[' + getObjectTag(object) + ']';
-  }
-
-  var properties = keys.map(function (key) {
-    var value = formatValue(object[key], seenValues);
-    return key + ': ' + value;
-  });
-  return '{ ' + properties.join(', ') + ' }';
-}
-
-function formatArray(array, seenValues) {
-  if (array.length === 0) {
-    return '[]';
-  }
-
-  if (seenValues.length > MAX_RECURSIVE_DEPTH) {
-    return '[Array]';
-  }
-
-  var len = Math.min(MAX_ARRAY_LENGTH, array.length);
-  var remaining = array.length - len;
-  var items = [];
-
-  for (var i = 0; i < len; ++i) {
-    items.push(formatValue(array[i], seenValues));
-  }
-
-  if (remaining === 1) {
-    items.push('... 1 more item');
-  } else if (remaining > 1) {
-    items.push("... ".concat(remaining, " more items"));
-  }
-
-  return '[' + items.join(', ') + ']';
-}
-
-function getCustomFn(object) {
-  var customInspectFn = object[String(_nodejsCustomInspectSymbol.default)];
-
-  if (typeof customInspectFn === 'function') {
-    return customInspectFn;
-  }
-
-  if (typeof object.inspect === 'function') {
-    return object.inspect;
-  }
-}
-
-function getObjectTag(object) {
-  var tag = Object.prototype.toString.call(object).replace(/^\[object /, '').replace(/]$/, '');
-
-  if (tag === 'Object' && typeof object.constructor === 'function') {
-    var name = object.constructor.name;
-
-    if (typeof name === 'string' && name !== '') {
-      return name;
-    }
-  }
-
-  return tag;
-}
diff --git a/node_modules/graphql/jsutils/inspect.js.flow b/node_modules/graphql/jsutils/inspect.js.flow
deleted file mode 100644
index 49e0d8b..0000000
--- a/node_modules/graphql/jsutils/inspect.js.flow
+++ /dev/null
@@ -1,126 +0,0 @@
-// @flow strict
-
-import nodejsCustomInspectSymbol from './nodejsCustomInspectSymbol';
-
-const MAX_ARRAY_LENGTH = 10;
-const MAX_RECURSIVE_DEPTH = 2;
-
-/**
- * Used to print values in error messages.
- */
-export default function inspect(value: mixed): string {
-  return formatValue(value, []);
-}
-
-function formatValue(value, seenValues) {
-  switch (typeof value) {
-    case 'string':
-      return JSON.stringify(value);
-    case 'function':
-      return value.name ? `[function ${value.name}]` : '[function]';
-    case 'object':
-      if (value === null) {
-        return 'null';
-      }
-      return formatObjectValue(value, seenValues);
-    default:
-      return String(value);
-  }
-}
-
-function formatObjectValue(value, previouslySeenValues) {
-  if (previouslySeenValues.indexOf(value) !== -1) {
-    return '[Circular]';
-  }
-
-  const seenValues = [...previouslySeenValues, value];
-  const customInspectFn = getCustomFn(value);
-
-  if (customInspectFn !== undefined) {
-    // $FlowFixMe(>=0.90.0)
-    const customValue = customInspectFn.call(value);
-
-    // check for infinite recursion
-    if (customValue !== value) {
-      return typeof customValue === 'string'
-        ? customValue
-        : formatValue(customValue, seenValues);
-    }
-  } else if (Array.isArray(value)) {
-    return formatArray(value, seenValues);
-  }
-
-  return formatObject(value, seenValues);
-}
-
-function formatObject(object, seenValues) {
-  const keys = Object.keys(object);
-  if (keys.length === 0) {
-    return '{}';
-  }
-
-  if (seenValues.length > MAX_RECURSIVE_DEPTH) {
-    return '[' + getObjectTag(object) + ']';
-  }
-
-  const properties = keys.map(key => {
-    const value = formatValue(object[key], seenValues);
-    return key + ': ' + value;
-  });
-
-  return '{ ' + properties.join(', ') + ' }';
-}
-
-function formatArray(array, seenValues) {
-  if (array.length === 0) {
-    return '[]';
-  }
-
-  if (seenValues.length > MAX_RECURSIVE_DEPTH) {
-    return '[Array]';
-  }
-
-  const len = Math.min(MAX_ARRAY_LENGTH, array.length);
-  const remaining = array.length - len;
-  const items = [];
-
-  for (let i = 0; i < len; ++i) {
-    items.push(formatValue(array[i], seenValues));
-  }
-
-  if (remaining === 1) {
-    items.push('... 1 more item');
-  } else if (remaining > 1) {
-    items.push(`... ${remaining} more items`);
-  }
-
-  return '[' + items.join(', ') + ']';
-}
-
-function getCustomFn(object) {
-  const customInspectFn = object[String(nodejsCustomInspectSymbol)];
-
-  if (typeof customInspectFn === 'function') {
-    return customInspectFn;
-  }
-
-  if (typeof object.inspect === 'function') {
-    return object.inspect;
-  }
-}
-
-function getObjectTag(object) {
-  const tag = Object.prototype.toString
-    .call(object)
-    .replace(/^\[object /, '')
-    .replace(/]$/, '');
-
-  if (tag === 'Object' && typeof object.constructor === 'function') {
-    const name = object.constructor.name;
-    if (typeof name === 'string' && name !== '') {
-      return name;
-    }
-  }
-
-  return tag;
-}
diff --git a/node_modules/graphql/jsutils/inspect.mjs b/node_modules/graphql/jsutils/inspect.mjs
deleted file mode 100644
index 9d93e91..0000000
--- a/node_modules/graphql/jsutils/inspect.mjs
+++ /dev/null
@@ -1,124 +0,0 @@
-function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-import nodejsCustomInspectSymbol from "./nodejsCustomInspectSymbol.mjs";
-var MAX_ARRAY_LENGTH = 10;
-var MAX_RECURSIVE_DEPTH = 2;
-/**
- * Used to print values in error messages.
- */
-
-export default function inspect(value) {
-  return formatValue(value, []);
-}
-
-function formatValue(value, seenValues) {
-  switch (_typeof(value)) {
-    case 'string':
-      return JSON.stringify(value);
-
-    case 'function':
-      return value.name ? "[function ".concat(value.name, "]") : '[function]';
-
-    case 'object':
-      if (value === null) {
-        return 'null';
-      }
-
-      return formatObjectValue(value, seenValues);
-
-    default:
-      return String(value);
-  }
-}
-
-function formatObjectValue(value, previouslySeenValues) {
-  if (previouslySeenValues.indexOf(value) !== -1) {
-    return '[Circular]';
-  }
-
-  var seenValues = [].concat(previouslySeenValues, [value]);
-  var customInspectFn = getCustomFn(value);
-
-  if (customInspectFn !== undefined) {
-    // $FlowFixMe(>=0.90.0)
-    var customValue = customInspectFn.call(value); // check for infinite recursion
-
-    if (customValue !== value) {
-      return typeof customValue === 'string' ? customValue : formatValue(customValue, seenValues);
-    }
-  } else if (Array.isArray(value)) {
-    return formatArray(value, seenValues);
-  }
-
-  return formatObject(value, seenValues);
-}
-
-function formatObject(object, seenValues) {
-  var keys = Object.keys(object);
-
-  if (keys.length === 0) {
-    return '{}';
-  }
-
-  if (seenValues.length > MAX_RECURSIVE_DEPTH) {
-    return '[' + getObjectTag(object) + ']';
-  }
-
-  var properties = keys.map(function (key) {
-    var value = formatValue(object[key], seenValues);
-    return key + ': ' + value;
-  });
-  return '{ ' + properties.join(', ') + ' }';
-}
-
-function formatArray(array, seenValues) {
-  if (array.length === 0) {
-    return '[]';
-  }
-
-  if (seenValues.length > MAX_RECURSIVE_DEPTH) {
-    return '[Array]';
-  }
-
-  var len = Math.min(MAX_ARRAY_LENGTH, array.length);
-  var remaining = array.length - len;
-  var items = [];
-
-  for (var i = 0; i < len; ++i) {
-    items.push(formatValue(array[i], seenValues));
-  }
-
-  if (remaining === 1) {
-    items.push('... 1 more item');
-  } else if (remaining > 1) {
-    items.push("... ".concat(remaining, " more items"));
-  }
-
-  return '[' + items.join(', ') + ']';
-}
-
-function getCustomFn(object) {
-  var customInspectFn = object[String(nodejsCustomInspectSymbol)];
-
-  if (typeof customInspectFn === 'function') {
-    return customInspectFn;
-  }
-
-  if (typeof object.inspect === 'function') {
-    return object.inspect;
-  }
-}
-
-function getObjectTag(object) {
-  var tag = Object.prototype.toString.call(object).replace(/^\[object /, '').replace(/]$/, '');
-
-  if (tag === 'Object' && typeof object.constructor === 'function') {
-    var name = object.constructor.name;
-
-    if (typeof name === 'string' && name !== '') {
-      return name;
-    }
-  }
-
-  return tag;
-}
diff --git a/node_modules/graphql/jsutils/instanceOf.js b/node_modules/graphql/jsutils/instanceOf.js
deleted file mode 100644
index 87e50db..0000000
--- a/node_modules/graphql/jsutils/instanceOf.js
+++ /dev/null
@@ -1,37 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-/**
- * A replacement for instanceof which includes an error warning when multi-realm
- * constructors are detected.
- */
-// See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production
-// See: https://webpack.js.org/guides/production/
-var _default = process.env.NODE_ENV === 'production' ?
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-// eslint-disable-next-line no-shadow
-function instanceOf(value, constructor) {
-  return value instanceof constructor;
-} : // eslint-disable-next-line no-shadow
-function instanceOf(value, constructor) {
-  if (value instanceof constructor) {
-    return true;
-  }
-
-  if (value) {
-    var valueClass = value.constructor;
-    var className = constructor.name;
-
-    if (className && valueClass && valueClass.name === className) {
-      throw new Error("Cannot use ".concat(className, " \"").concat(value, "\" from another module or realm.\n\nEnsure that there is only one instance of \"graphql\" in the node_modules\ndirectory. If different versions of \"graphql\" are the dependencies of other\nrelied on modules, use \"resolutions\" to ensure only one version is installed.\n\nhttps://yarnpkg.com/en/docs/selective-version-resolutions\n\nDuplicate \"graphql\" modules cannot be used at the same time since different\nversions may have different capabilities and behavior. The data from one\nversion used in the function from another could produce confusing and\nspurious results."));
-    }
-  }
-
-  return false;
-};
-
-exports.default = _default;
diff --git a/node_modules/graphql/jsutils/instanceOf.js.flow b/node_modules/graphql/jsutils/instanceOf.js.flow
deleted file mode 100644
index e944809..0000000
--- a/node_modules/graphql/jsutils/instanceOf.js.flow
+++ /dev/null
@@ -1,46 +0,0 @@
-// @flow strict
-
-/**
- * A replacement for instanceof which includes an error warning when multi-realm
- * constructors are detected.
- */
-declare function instanceOf(
-  value: mixed,
-  constructor: mixed,
-): boolean %checks(value instanceof constructor);
-
-// See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production
-// See: https://webpack.js.org/guides/production/
-export default process.env.NODE_ENV === 'production'
-  ? /* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-    // eslint-disable-next-line no-shadow
-    function instanceOf(value: mixed, constructor: mixed) {
-      return value instanceof constructor;
-    }
-  : // eslint-disable-next-line no-shadow
-    function instanceOf(value: any, constructor: any) {
-      if (value instanceof constructor) {
-        return true;
-      }
-      if (value) {
-        const valueClass = value.constructor;
-        const className = constructor.name;
-        if (className && valueClass && valueClass.name === className) {
-          throw new Error(
-            `Cannot use ${className} "${value}" from another module or realm.
-
-Ensure that there is only one instance of "graphql" in the node_modules
-directory. If different versions of "graphql" are the dependencies of other
-relied on modules, use "resolutions" to ensure only one version is installed.
-
-https://yarnpkg.com/en/docs/selective-version-resolutions
-
-Duplicate "graphql" modules cannot be used at the same time since different
-versions may have different capabilities and behavior. The data from one
-version used in the function from another could produce confusing and
-spurious results.`,
-          );
-        }
-      }
-      return false;
-    };
diff --git a/node_modules/graphql/jsutils/instanceOf.mjs b/node_modules/graphql/jsutils/instanceOf.mjs
deleted file mode 100644
index 2c33297..0000000
--- a/node_modules/graphql/jsutils/instanceOf.mjs
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * A replacement for instanceof which includes an error warning when multi-realm
- * constructors are detected.
- */
-// See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production
-// See: https://webpack.js.org/guides/production/
-export default process.env.NODE_ENV === 'production' ?
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-// eslint-disable-next-line no-shadow
-function instanceOf(value, constructor) {
-  return value instanceof constructor;
-} : // eslint-disable-next-line no-shadow
-function instanceOf(value, constructor) {
-  if (value instanceof constructor) {
-    return true;
-  }
-
-  if (value) {
-    var valueClass = value.constructor;
-    var className = constructor.name;
-
-    if (className && valueClass && valueClass.name === className) {
-      throw new Error("Cannot use ".concat(className, " \"").concat(value, "\" from another module or realm.\n\nEnsure that there is only one instance of \"graphql\" in the node_modules\ndirectory. If different versions of \"graphql\" are the dependencies of other\nrelied on modules, use \"resolutions\" to ensure only one version is installed.\n\nhttps://yarnpkg.com/en/docs/selective-version-resolutions\n\nDuplicate \"graphql\" modules cannot be used at the same time since different\nversions may have different capabilities and behavior. The data from one\nversion used in the function from another could produce confusing and\nspurious results."));
-    }
-  }
-
-  return false;
-};
diff --git a/node_modules/graphql/jsutils/invariant.js b/node_modules/graphql/jsutils/invariant.js
deleted file mode 100644
index df40814..0000000
--- a/node_modules/graphql/jsutils/invariant.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = invariant;
-
-function invariant(condition, message) {
-  var booleanCondition = Boolean(condition);
-  /* istanbul ignore else (see transformation done in './resources/inlineInvariant.js') */
-
-  if (!booleanCondition) {
-    throw new Error(message != null ? message : 'Unexpected invariant triggered.');
-  }
-}
diff --git a/node_modules/graphql/jsutils/invariant.js.flow b/node_modules/graphql/jsutils/invariant.js.flow
deleted file mode 100644
index f3af549..0000000
--- a/node_modules/graphql/jsutils/invariant.js.flow
+++ /dev/null
@@ -1,11 +0,0 @@
-// @flow strict
-
-export default function invariant(condition: mixed, message?: string): void {
-  const booleanCondition = Boolean(condition);
-  /* istanbul ignore else (see transformation done in './resources/inlineInvariant.js') */
-  if (!booleanCondition) {
-    throw new Error(
-      message != null ? message : 'Unexpected invariant triggered.',
-    );
-  }
-}
diff --git a/node_modules/graphql/jsutils/invariant.mjs b/node_modules/graphql/jsutils/invariant.mjs
deleted file mode 100644
index 8ad1c77..0000000
--- a/node_modules/graphql/jsutils/invariant.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-export default function invariant(condition, message) {
-  var booleanCondition = Boolean(condition);
-  /* istanbul ignore else (see transformation done in './resources/inlineInvariant.js') */
-
-  if (!booleanCondition) {
-    throw new Error(message != null ? message : 'Unexpected invariant triggered.');
-  }
-}
diff --git a/node_modules/graphql/jsutils/isCollection.js b/node_modules/graphql/jsutils/isCollection.js
deleted file mode 100644
index 046d3da..0000000
--- a/node_modules/graphql/jsutils/isCollection.js
+++ /dev/null
@@ -1,47 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = isCollection;
-
-var _symbols = require("../polyfills/symbols");
-
-function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-/**
- * Returns true if the provided object is an Object (i.e. not a string literal)
- * and is either Iterable or Array-like.
- *
- * This may be used in place of [Array.isArray()][isArray] to determine if an
- * object should be iterated-over. It always excludes string literals and
- * includes Arrays (regardless of if it is Iterable). It also includes other
- * Array-like objects such as NodeList, TypedArray, and Buffer.
- *
- * @example
- *
- * isCollection([ 1, 2, 3 ]) // true
- * isCollection('ABC') // false
- * isCollection({ length: 1, 0: 'Alpha' }) // true
- * isCollection({ key: 'value' }) // false
- * isCollection(new Map()) // true
- *
- * @param obj
- *   An Object value which might implement the Iterable or Array-like protocols.
- * @return {boolean} true if Iterable or Array-like Object.
- */
-function isCollection(obj) {
-  if (obj == null || _typeof(obj) !== 'object') {
-    return false;
-  } // Is Array like?
-
-
-  var length = obj.length;
-
-  if (typeof length === 'number' && length >= 0 && length % 1 === 0) {
-    return true;
-  } // Is Iterable?
-
-
-  return typeof obj[_symbols.SYMBOL_ITERATOR] === 'function';
-}
diff --git a/node_modules/graphql/jsutils/isCollection.js.flow b/node_modules/graphql/jsutils/isCollection.js.flow
deleted file mode 100644
index e5ff8e9..0000000
--- a/node_modules/graphql/jsutils/isCollection.js.flow
+++ /dev/null
@@ -1,39 +0,0 @@
-// @flow strict
-
-import { SYMBOL_ITERATOR } from '../polyfills/symbols';
-
-/**
- * Returns true if the provided object is an Object (i.e. not a string literal)
- * and is either Iterable or Array-like.
- *
- * This may be used in place of [Array.isArray()][isArray] to determine if an
- * object should be iterated-over. It always excludes string literals and
- * includes Arrays (regardless of if it is Iterable). It also includes other
- * Array-like objects such as NodeList, TypedArray, and Buffer.
- *
- * @example
- *
- * isCollection([ 1, 2, 3 ]) // true
- * isCollection('ABC') // false
- * isCollection({ length: 1, 0: 'Alpha' }) // true
- * isCollection({ key: 'value' }) // false
- * isCollection(new Map()) // true
- *
- * @param obj
- *   An Object value which might implement the Iterable or Array-like protocols.
- * @return {boolean} true if Iterable or Array-like Object.
- */
-export default function isCollection(obj: mixed): boolean {
-  if (obj == null || typeof obj !== 'object') {
-    return false;
-  }
-
-  // Is Array like?
-  const length = obj.length;
-  if (typeof length === 'number' && length >= 0 && length % 1 === 0) {
-    return true;
-  }
-
-  // Is Iterable?
-  return typeof obj[SYMBOL_ITERATOR] === 'function';
-}
diff --git a/node_modules/graphql/jsutils/isCollection.mjs b/node_modules/graphql/jsutils/isCollection.mjs
deleted file mode 100644
index 43c1d25..0000000
--- a/node_modules/graphql/jsutils/isCollection.mjs
+++ /dev/null
@@ -1,40 +0,0 @@
-function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-import { SYMBOL_ITERATOR } from "../polyfills/symbols.mjs";
-/**
- * Returns true if the provided object is an Object (i.e. not a string literal)
- * and is either Iterable or Array-like.
- *
- * This may be used in place of [Array.isArray()][isArray] to determine if an
- * object should be iterated-over. It always excludes string literals and
- * includes Arrays (regardless of if it is Iterable). It also includes other
- * Array-like objects such as NodeList, TypedArray, and Buffer.
- *
- * @example
- *
- * isCollection([ 1, 2, 3 ]) // true
- * isCollection('ABC') // false
- * isCollection({ length: 1, 0: 'Alpha' }) // true
- * isCollection({ key: 'value' }) // false
- * isCollection(new Map()) // true
- *
- * @param obj
- *   An Object value which might implement the Iterable or Array-like protocols.
- * @return {boolean} true if Iterable or Array-like Object.
- */
-
-export default function isCollection(obj) {
-  if (obj == null || _typeof(obj) !== 'object') {
-    return false;
-  } // Is Array like?
-
-
-  var length = obj.length;
-
-  if (typeof length === 'number' && length >= 0 && length % 1 === 0) {
-    return true;
-  } // Is Iterable?
-
-
-  return typeof obj[SYMBOL_ITERATOR] === 'function';
-}
diff --git a/node_modules/graphql/jsutils/isObjectLike.js b/node_modules/graphql/jsutils/isObjectLike.js
deleted file mode 100644
index 19c9a89..0000000
--- a/node_modules/graphql/jsutils/isObjectLike.js
+++ /dev/null
@@ -1,16 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = isObjectLike;
-
-function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-/**
- * Return true if `value` is object-like. A value is object-like if it's not
- * `null` and has a `typeof` result of "object".
- */
-function isObjectLike(value) {
-  return _typeof(value) == 'object' && value !== null;
-}
diff --git a/node_modules/graphql/jsutils/isObjectLike.js.flow b/node_modules/graphql/jsutils/isObjectLike.js.flow
deleted file mode 100644
index 45d29f6..0000000
--- a/node_modules/graphql/jsutils/isObjectLike.js.flow
+++ /dev/null
@@ -1,9 +0,0 @@
-// @flow strict
-
-/**
- * Return true if `value` is object-like. A value is object-like if it's not
- * `null` and has a `typeof` result of "object".
- */
-export default function isObjectLike(value: mixed): boolean %checks {
-  return typeof value == 'object' && value !== null;
-}
diff --git a/node_modules/graphql/jsutils/isObjectLike.mjs b/node_modules/graphql/jsutils/isObjectLike.mjs
deleted file mode 100644
index 41dc3cd..0000000
--- a/node_modules/graphql/jsutils/isObjectLike.mjs
+++ /dev/null
@@ -1,9 +0,0 @@
-function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-/**
- * Return true if `value` is object-like. A value is object-like if it's not
- * `null` and has a `typeof` result of "object".
- */
-export default function isObjectLike(value) {
-  return _typeof(value) == 'object' && value !== null;
-}
diff --git a/node_modules/graphql/jsutils/isPromise.js b/node_modules/graphql/jsutils/isPromise.js
deleted file mode 100644
index bca6ccc..0000000
--- a/node_modules/graphql/jsutils/isPromise.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = isPromise;
-
-/**
- * Returns true if the value acts like a Promise, i.e. has a "then" function,
- * otherwise returns false.
- */
-// eslint-disable-next-line no-redeclare
-function isPromise(value) {
-  return typeof (value === null || value === void 0 ? void 0 : value.then) === 'function';
-}
diff --git a/node_modules/graphql/jsutils/isPromise.js.flow b/node_modules/graphql/jsutils/isPromise.js.flow
deleted file mode 100644
index d6ef817..0000000
--- a/node_modules/graphql/jsutils/isPromise.js.flow
+++ /dev/null
@@ -1,13 +0,0 @@
-// @flow strict
-
-/**
- * Returns true if the value acts like a Promise, i.e. has a "then" function,
- * otherwise returns false.
- */
-declare function isPromise(value: mixed): boolean %checks(value instanceof
-  Promise);
-
-// eslint-disable-next-line no-redeclare
-export default function isPromise(value) {
-  return typeof value?.then === 'function';
-}
diff --git a/node_modules/graphql/jsutils/isPromise.mjs b/node_modules/graphql/jsutils/isPromise.mjs
deleted file mode 100644
index 2d9079b..0000000
--- a/node_modules/graphql/jsutils/isPromise.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Returns true if the value acts like a Promise, i.e. has a "then" function,
- * otherwise returns false.
- */
-// eslint-disable-next-line no-redeclare
-export default function isPromise(value) {
-  return typeof (value === null || value === void 0 ? void 0 : value.then) === 'function';
-}
diff --git a/node_modules/graphql/jsutils/keyMap.js b/node_modules/graphql/jsutils/keyMap.js
deleted file mode 100644
index c067210..0000000
--- a/node_modules/graphql/jsutils/keyMap.js
+++ /dev/null
@@ -1,36 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = keyMap;
-
-/**
- * Creates a keyed JS object from an array, given a function to produce the keys
- * for each value in the array.
- *
- * This provides a convenient lookup for the array items if the key function
- * produces unique results.
- *
- *     const phoneBook = [
- *       { name: 'Jon', num: '555-1234' },
- *       { name: 'Jenny', num: '867-5309' }
- *     ]
- *
- *     // { Jon: { name: 'Jon', num: '555-1234' },
- *     //   Jenny: { name: 'Jenny', num: '867-5309' } }
- *     const entriesByName = keyMap(
- *       phoneBook,
- *       entry => entry.name
- *     )
- *
- *     // { name: 'Jenny', num: '857-6309' }
- *     const jennyEntry = entriesByName['Jenny']
- *
- */
-function keyMap(list, keyFn) {
-  return list.reduce(function (map, item) {
-    map[keyFn(item)] = item;
-    return map;
-  }, Object.create(null));
-}
diff --git a/node_modules/graphql/jsutils/keyMap.js.flow b/node_modules/graphql/jsutils/keyMap.js.flow
deleted file mode 100644
index 410dad4..0000000
--- a/node_modules/graphql/jsutils/keyMap.js.flow
+++ /dev/null
@@ -1,36 +0,0 @@
-// @flow strict
-
-import { type ObjMap } from './ObjMap';
-
-/**
- * Creates a keyed JS object from an array, given a function to produce the keys
- * for each value in the array.
- *
- * This provides a convenient lookup for the array items if the key function
- * produces unique results.
- *
- *     const phoneBook = [
- *       { name: 'Jon', num: '555-1234' },
- *       { name: 'Jenny', num: '867-5309' }
- *     ]
- *
- *     // { Jon: { name: 'Jon', num: '555-1234' },
- *     //   Jenny: { name: 'Jenny', num: '867-5309' } }
- *     const entriesByName = keyMap(
- *       phoneBook,
- *       entry => entry.name
- *     )
- *
- *     // { name: 'Jenny', num: '857-6309' }
- *     const jennyEntry = entriesByName['Jenny']
- *
- */
-export default function keyMap<T>(
-  list: $ReadOnlyArray<T>,
-  keyFn: (item: T) => string,
-): ObjMap<T> {
-  return list.reduce((map, item) => {
-    map[keyFn(item)] = item;
-    return map;
-  }, Object.create(null));
-}
diff --git a/node_modules/graphql/jsutils/keyMap.mjs b/node_modules/graphql/jsutils/keyMap.mjs
deleted file mode 100644
index 567dd86..0000000
--- a/node_modules/graphql/jsutils/keyMap.mjs
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Creates a keyed JS object from an array, given a function to produce the keys
- * for each value in the array.
- *
- * This provides a convenient lookup for the array items if the key function
- * produces unique results.
- *
- *     const phoneBook = [
- *       { name: 'Jon', num: '555-1234' },
- *       { name: 'Jenny', num: '867-5309' }
- *     ]
- *
- *     // { Jon: { name: 'Jon', num: '555-1234' },
- *     //   Jenny: { name: 'Jenny', num: '867-5309' } }
- *     const entriesByName = keyMap(
- *       phoneBook,
- *       entry => entry.name
- *     )
- *
- *     // { name: 'Jenny', num: '857-6309' }
- *     const jennyEntry = entriesByName['Jenny']
- *
- */
-export default function keyMap(list, keyFn) {
-  return list.reduce(function (map, item) {
-    map[keyFn(item)] = item;
-    return map;
-  }, Object.create(null));
-}
diff --git a/node_modules/graphql/jsutils/keyValMap.js b/node_modules/graphql/jsutils/keyValMap.js
deleted file mode 100644
index 0b2dab5..0000000
--- a/node_modules/graphql/jsutils/keyValMap.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = keyValMap;
-
-/**
- * Creates a keyed JS object from an array, given a function to produce the keys
- * and a function to produce the values from each item in the array.
- *
- *     const phoneBook = [
- *       { name: 'Jon', num: '555-1234' },
- *       { name: 'Jenny', num: '867-5309' }
- *     ]
- *
- *     // { Jon: '555-1234', Jenny: '867-5309' }
- *     const phonesByName = keyValMap(
- *       phoneBook,
- *       entry => entry.name,
- *       entry => entry.num
- *     )
- *
- */
-function keyValMap(list, keyFn, valFn) {
-  return list.reduce(function (map, item) {
-    map[keyFn(item)] = valFn(item);
-    return map;
-  }, Object.create(null));
-}
diff --git a/node_modules/graphql/jsutils/keyValMap.js.flow b/node_modules/graphql/jsutils/keyValMap.js.flow
deleted file mode 100644
index 6f6e703..0000000
--- a/node_modules/graphql/jsutils/keyValMap.js.flow
+++ /dev/null
@@ -1,31 +0,0 @@
-// @flow strict
-
-import { type ObjMap } from './ObjMap';
-
-/**
- * Creates a keyed JS object from an array, given a function to produce the keys
- * and a function to produce the values from each item in the array.
- *
- *     const phoneBook = [
- *       { name: 'Jon', num: '555-1234' },
- *       { name: 'Jenny', num: '867-5309' }
- *     ]
- *
- *     // { Jon: '555-1234', Jenny: '867-5309' }
- *     const phonesByName = keyValMap(
- *       phoneBook,
- *       entry => entry.name,
- *       entry => entry.num
- *     )
- *
- */
-export default function keyValMap<T, V>(
-  list: $ReadOnlyArray<T>,
-  keyFn: (item: T) => string,
-  valFn: (item: T) => V,
-): ObjMap<V> {
-  return list.reduce((map, item) => {
-    map[keyFn(item)] = valFn(item);
-    return map;
-  }, Object.create(null));
-}
diff --git a/node_modules/graphql/jsutils/keyValMap.mjs b/node_modules/graphql/jsutils/keyValMap.mjs
deleted file mode 100644
index 5061c66..0000000
--- a/node_modules/graphql/jsutils/keyValMap.mjs
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Creates a keyed JS object from an array, given a function to produce the keys
- * and a function to produce the values from each item in the array.
- *
- *     const phoneBook = [
- *       { name: 'Jon', num: '555-1234' },
- *       { name: 'Jenny', num: '867-5309' }
- *     ]
- *
- *     // { Jon: '555-1234', Jenny: '867-5309' }
- *     const phonesByName = keyValMap(
- *       phoneBook,
- *       entry => entry.name,
- *       entry => entry.num
- *     )
- *
- */
-export default function keyValMap(list, keyFn, valFn) {
-  return list.reduce(function (map, item) {
-    map[keyFn(item)] = valFn(item);
-    return map;
-  }, Object.create(null));
-}
diff --git a/node_modules/graphql/jsutils/mapValue.js b/node_modules/graphql/jsutils/mapValue.js
deleted file mode 100644
index f9827da..0000000
--- a/node_modules/graphql/jsutils/mapValue.js
+++ /dev/null
@@ -1,27 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = mapValue;
-
-var _objectEntries3 = _interopRequireDefault(require("../polyfills/objectEntries"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Creates an object map with the same keys as `map` and values generated by
- * running each value of `map` thru `fn`.
- */
-function mapValue(map, fn) {
-  var result = Object.create(null);
-
-  for (var _i2 = 0, _objectEntries2 = (0, _objectEntries3.default)(map); _i2 < _objectEntries2.length; _i2++) {
-    var _ref2 = _objectEntries2[_i2];
-    var _key = _ref2[0];
-    var _value = _ref2[1];
-    result[_key] = fn(_value, _key);
-  }
-
-  return result;
-}
diff --git a/node_modules/graphql/jsutils/mapValue.js.flow b/node_modules/graphql/jsutils/mapValue.js.flow
deleted file mode 100644
index 4390b4f..0000000
--- a/node_modules/graphql/jsutils/mapValue.js.flow
+++ /dev/null
@@ -1,21 +0,0 @@
-// @flow strict
-
-import objectEntries from '../polyfills/objectEntries';
-
-import { type ObjMap } from './ObjMap';
-
-/**
- * Creates an object map with the same keys as `map` and values generated by
- * running each value of `map` thru `fn`.
- */
-export default function mapValue<T, V>(
-  map: ObjMap<T>,
-  fn: (value: T, key: string) => V,
-): ObjMap<V> {
-  const result = Object.create(null);
-
-  for (const [key, value] of objectEntries(map)) {
-    result[key] = fn(value, key);
-  }
-  return result;
-}
diff --git a/node_modules/graphql/jsutils/mapValue.mjs b/node_modules/graphql/jsutils/mapValue.mjs
deleted file mode 100644
index 7992abb..0000000
--- a/node_modules/graphql/jsutils/mapValue.mjs
+++ /dev/null
@@ -1,18 +0,0 @@
-import objectEntries from "../polyfills/objectEntries.mjs";
-
-/**
- * Creates an object map with the same keys as `map` and values generated by
- * running each value of `map` thru `fn`.
- */
-export default function mapValue(map, fn) {
-  var result = Object.create(null);
-
-  for (var _i2 = 0, _objectEntries2 = objectEntries(map); _i2 < _objectEntries2.length; _i2++) {
-    var _ref2 = _objectEntries2[_i2];
-    var _key = _ref2[0];
-    var _value = _ref2[1];
-    result[_key] = fn(_value, _key);
-  }
-
-  return result;
-}
diff --git a/node_modules/graphql/jsutils/memoize3.js b/node_modules/graphql/jsutils/memoize3.js
deleted file mode 100644
index 05bef37..0000000
--- a/node_modules/graphql/jsutils/memoize3.js
+++ /dev/null
@@ -1,48 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = memoize3;
-
-/**
- * Memoizes the provided three-argument function.
- */
-function memoize3(fn) {
-  var cache0;
-
-  function memoized(a1, a2, a3) {
-    if (!cache0) {
-      cache0 = new WeakMap();
-    }
-
-    var cache1 = cache0.get(a1);
-    var cache2;
-
-    if (cache1) {
-      cache2 = cache1.get(a2);
-
-      if (cache2) {
-        var cachedValue = cache2.get(a3);
-
-        if (cachedValue !== undefined) {
-          return cachedValue;
-        }
-      }
-    } else {
-      cache1 = new WeakMap();
-      cache0.set(a1, cache1);
-    }
-
-    if (!cache2) {
-      cache2 = new WeakMap();
-      cache1.set(a2, cache2);
-    }
-
-    var newValue = fn(a1, a2, a3);
-    cache2.set(a3, newValue);
-    return newValue;
-  }
-
-  return memoized;
-}
diff --git a/node_modules/graphql/jsutils/memoize3.js.flow b/node_modules/graphql/jsutils/memoize3.js.flow
deleted file mode 100644
index 2d5707c..0000000
--- a/node_modules/graphql/jsutils/memoize3.js.flow
+++ /dev/null
@@ -1,42 +0,0 @@
-// @flow strict
-
-/**
- * Memoizes the provided three-argument function.
- */
-export default function memoize3<
-  A1: { ... } | $ReadOnlyArray<mixed>,
-  A2: { ... } | $ReadOnlyArray<mixed>,
-  A3: { ... } | $ReadOnlyArray<mixed>,
-  R: mixed,
->(fn: (A1, A2, A3) => R): (A1, A2, A3) => R {
-  let cache0;
-
-  function memoized(a1, a2, a3) {
-    if (!cache0) {
-      cache0 = new WeakMap();
-    }
-    let cache1 = cache0.get(a1);
-    let cache2;
-    if (cache1) {
-      cache2 = cache1.get(a2);
-      if (cache2) {
-        const cachedValue = cache2.get(a3);
-        if (cachedValue !== undefined) {
-          return cachedValue;
-        }
-      }
-    } else {
-      cache1 = new WeakMap();
-      cache0.set(a1, cache1);
-    }
-    if (!cache2) {
-      cache2 = new WeakMap();
-      cache1.set(a2, cache2);
-    }
-    const newValue = fn(a1, a2, a3);
-    cache2.set(a3, newValue);
-    return newValue;
-  }
-
-  return memoized;
-}
diff --git a/node_modules/graphql/jsutils/memoize3.mjs b/node_modules/graphql/jsutils/memoize3.mjs
deleted file mode 100644
index 3c31e86..0000000
--- a/node_modules/graphql/jsutils/memoize3.mjs
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * Memoizes the provided three-argument function.
- */
-export default function memoize3(fn) {
-  var cache0;
-
-  function memoized(a1, a2, a3) {
-    if (!cache0) {
-      cache0 = new WeakMap();
-    }
-
-    var cache1 = cache0.get(a1);
-    var cache2;
-
-    if (cache1) {
-      cache2 = cache1.get(a2);
-
-      if (cache2) {
-        var cachedValue = cache2.get(a3);
-
-        if (cachedValue !== undefined) {
-          return cachedValue;
-        }
-      }
-    } else {
-      cache1 = new WeakMap();
-      cache0.set(a1, cache1);
-    }
-
-    if (!cache2) {
-      cache2 = new WeakMap();
-      cache1.set(a2, cache2);
-    }
-
-    var newValue = fn(a1, a2, a3);
-    cache2.set(a3, newValue);
-    return newValue;
-  }
-
-  return memoized;
-}
diff --git a/node_modules/graphql/jsutils/nodejsCustomInspectSymbol.js b/node_modules/graphql/jsutils/nodejsCustomInspectSymbol.js
deleted file mode 100644
index 22fd2dd..0000000
--- a/node_modules/graphql/jsutils/nodejsCustomInspectSymbol.js
+++ /dev/null
@@ -1,11 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-var nodejsCustomInspectSymbol = typeof Symbol === 'function' && typeof Symbol.for === 'function' ? Symbol.for('nodejs.util.inspect.custom') : undefined;
-var _default = nodejsCustomInspectSymbol;
-exports.default = _default;
diff --git a/node_modules/graphql/jsutils/nodejsCustomInspectSymbol.js.flow b/node_modules/graphql/jsutils/nodejsCustomInspectSymbol.js.flow
deleted file mode 100644
index a884a47..0000000
--- a/node_modules/graphql/jsutils/nodejsCustomInspectSymbol.js.flow
+++ /dev/null
@@ -1,9 +0,0 @@
-// @flow strict
-
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-const nodejsCustomInspectSymbol =
-  typeof Symbol === 'function' && typeof Symbol.for === 'function'
-    ? Symbol.for('nodejs.util.inspect.custom')
-    : undefined;
-
-export default nodejsCustomInspectSymbol;
diff --git a/node_modules/graphql/jsutils/nodejsCustomInspectSymbol.mjs b/node_modules/graphql/jsutils/nodejsCustomInspectSymbol.mjs
deleted file mode 100644
index 5437923..0000000
--- a/node_modules/graphql/jsutils/nodejsCustomInspectSymbol.mjs
+++ /dev/null
@@ -1,3 +0,0 @@
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-var nodejsCustomInspectSymbol = typeof Symbol === 'function' && typeof Symbol.for === 'function' ? Symbol.for('nodejs.util.inspect.custom') : undefined;
-export default nodejsCustomInspectSymbol;
diff --git a/node_modules/graphql/jsutils/printPathArray.js b/node_modules/graphql/jsutils/printPathArray.js
deleted file mode 100644
index 31224eb..0000000
--- a/node_modules/graphql/jsutils/printPathArray.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = printPathArray;
-
-/**
- * Build a string describing the path.
- */
-function printPathArray(path) {
-  return path.map(function (key) {
-    return typeof key === 'number' ? '[' + key.toString() + ']' : '.' + key;
-  }).join('');
-}
diff --git a/node_modules/graphql/jsutils/printPathArray.js.flow b/node_modules/graphql/jsutils/printPathArray.js.flow
deleted file mode 100644
index f850c5e..0000000
--- a/node_modules/graphql/jsutils/printPathArray.js.flow
+++ /dev/null
@@ -1,14 +0,0 @@
-// @flow strict
-
-/**
- * Build a string describing the path.
- */
-export default function printPathArray(
-  path: $ReadOnlyArray<string | number>,
-): string {
-  return path
-    .map(key =>
-      typeof key === 'number' ? '[' + key.toString() + ']' : '.' + key,
-    )
-    .join('');
-}
diff --git a/node_modules/graphql/jsutils/printPathArray.mjs b/node_modules/graphql/jsutils/printPathArray.mjs
deleted file mode 100644
index 6bf077a..0000000
--- a/node_modules/graphql/jsutils/printPathArray.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Build a string describing the path.
- */
-export default function printPathArray(path) {
-  return path.map(function (key) {
-    return typeof key === 'number' ? '[' + key.toString() + ']' : '.' + key;
-  }).join('');
-}
diff --git a/node_modules/graphql/jsutils/promiseForObject.js b/node_modules/graphql/jsutils/promiseForObject.js
deleted file mode 100644
index f291f9b..0000000
--- a/node_modules/graphql/jsutils/promiseForObject.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = promiseForObject;
-
-/**
- * This function transforms a JS object `ObjMap<Promise<T>>` into
- * a `Promise<ObjMap<T>>`
- *
- * This is akin to bluebird's `Promise.props`, but implemented only using
- * `Promise.all` so it will work with any implementation of ES6 promises.
- */
-function promiseForObject(object) {
-  var keys = Object.keys(object);
-  var valuesAndPromises = keys.map(function (name) {
-    return object[name];
-  });
-  return Promise.all(valuesAndPromises).then(function (values) {
-    return values.reduce(function (resolvedObject, value, i) {
-      resolvedObject[keys[i]] = value;
-      return resolvedObject;
-    }, Object.create(null));
-  });
-}
diff --git a/node_modules/graphql/jsutils/promiseForObject.js.flow b/node_modules/graphql/jsutils/promiseForObject.js.flow
deleted file mode 100644
index b0afd8b..0000000
--- a/node_modules/graphql/jsutils/promiseForObject.js.flow
+++ /dev/null
@@ -1,23 +0,0 @@
-// @flow strict
-
-import { type ObjMap } from './ObjMap';
-
-/**
- * This function transforms a JS object `ObjMap<Promise<T>>` into
- * a `Promise<ObjMap<T>>`
- *
- * This is akin to bluebird's `Promise.props`, but implemented only using
- * `Promise.all` so it will work with any implementation of ES6 promises.
- */
-export default function promiseForObject<T>(
-  object: ObjMap<Promise<T>>,
-): Promise<ObjMap<T>> {
-  const keys = Object.keys(object);
-  const valuesAndPromises = keys.map(name => object[name]);
-  return Promise.all(valuesAndPromises).then(values =>
-    values.reduce((resolvedObject, value, i) => {
-      resolvedObject[keys[i]] = value;
-      return resolvedObject;
-    }, Object.create(null)),
-  );
-}
diff --git a/node_modules/graphql/jsutils/promiseForObject.mjs b/node_modules/graphql/jsutils/promiseForObject.mjs
deleted file mode 100644
index ee36ed4..0000000
--- a/node_modules/graphql/jsutils/promiseForObject.mjs
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * This function transforms a JS object `ObjMap<Promise<T>>` into
- * a `Promise<ObjMap<T>>`
- *
- * This is akin to bluebird's `Promise.props`, but implemented only using
- * `Promise.all` so it will work with any implementation of ES6 promises.
- */
-export default function promiseForObject(object) {
-  var keys = Object.keys(object);
-  var valuesAndPromises = keys.map(function (name) {
-    return object[name];
-  });
-  return Promise.all(valuesAndPromises).then(function (values) {
-    return values.reduce(function (resolvedObject, value, i) {
-      resolvedObject[keys[i]] = value;
-      return resolvedObject;
-    }, Object.create(null));
-  });
-}
diff --git a/node_modules/graphql/jsutils/promiseReduce.js b/node_modules/graphql/jsutils/promiseReduce.js
deleted file mode 100644
index 836296a..0000000
--- a/node_modules/graphql/jsutils/promiseReduce.js
+++ /dev/null
@@ -1,25 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = promiseReduce;
-
-var _isPromise = _interopRequireDefault(require("./isPromise"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Similar to Array.prototype.reduce(), however the reducing callback may return
- * a Promise, in which case reduction will continue after each promise resolves.
- *
- * If the callback does not return a Promise, then this function will also not
- * return a Promise.
- */
-function promiseReduce(values, callback, initialValue) {
-  return values.reduce(function (previous, value) {
-    return (0, _isPromise.default)(previous) ? previous.then(function (resolved) {
-      return callback(resolved, value);
-    }) : callback(previous, value);
-  }, initialValue);
-}
diff --git a/node_modules/graphql/jsutils/promiseReduce.js.flow b/node_modules/graphql/jsutils/promiseReduce.js.flow
deleted file mode 100644
index 22abbd5..0000000
--- a/node_modules/graphql/jsutils/promiseReduce.js.flow
+++ /dev/null
@@ -1,25 +0,0 @@
-// @flow strict
-
-import isPromise from './isPromise';
-import { type PromiseOrValue } from './PromiseOrValue';
-
-/**
- * Similar to Array.prototype.reduce(), however the reducing callback may return
- * a Promise, in which case reduction will continue after each promise resolves.
- *
- * If the callback does not return a Promise, then this function will also not
- * return a Promise.
- */
-export default function promiseReduce<T, U>(
-  values: $ReadOnlyArray<T>,
-  callback: (U, T) => PromiseOrValue<U>,
-  initialValue: PromiseOrValue<U>,
-): PromiseOrValue<U> {
-  return values.reduce(
-    (previous, value) =>
-      isPromise(previous)
-        ? previous.then(resolved => callback(resolved, value))
-        : callback(previous, value),
-    initialValue,
-  );
-}
diff --git a/node_modules/graphql/jsutils/promiseReduce.mjs b/node_modules/graphql/jsutils/promiseReduce.mjs
deleted file mode 100644
index 324268f..0000000
--- a/node_modules/graphql/jsutils/promiseReduce.mjs
+++ /dev/null
@@ -1,16 +0,0 @@
-import isPromise from "./isPromise.mjs";
-
-/**
- * Similar to Array.prototype.reduce(), however the reducing callback may return
- * a Promise, in which case reduction will continue after each promise resolves.
- *
- * If the callback does not return a Promise, then this function will also not
- * return a Promise.
- */
-export default function promiseReduce(values, callback, initialValue) {
-  return values.reduce(function (previous, value) {
-    return isPromise(previous) ? previous.then(function (resolved) {
-      return callback(resolved, value);
-    }) : callback(previous, value);
-  }, initialValue);
-}
diff --git a/node_modules/graphql/jsutils/suggestionList.js b/node_modules/graphql/jsutils/suggestionList.js
deleted file mode 100644
index ffc0f8c..0000000
--- a/node_modules/graphql/jsutils/suggestionList.js
+++ /dev/null
@@ -1,86 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = suggestionList;
-
-/**
- * Given an invalid input string and a list of valid options, returns a filtered
- * list of valid options sorted based on their similarity with the input.
- */
-function suggestionList(input, options) {
-  var optionsByDistance = Object.create(null);
-  var inputThreshold = input.length / 2;
-
-  for (var _i2 = 0; _i2 < options.length; _i2++) {
-    var option = options[_i2];
-    var distance = lexicalDistance(input, option);
-    var threshold = Math.max(inputThreshold, option.length / 2, 1);
-
-    if (distance <= threshold) {
-      optionsByDistance[option] = distance;
-    }
-  }
-
-  return Object.keys(optionsByDistance).sort(function (a, b) {
-    var distanceDiff = optionsByDistance[a] - optionsByDistance[b];
-    return distanceDiff !== 0 ? distanceDiff : a.localeCompare(b);
-  });
-}
-/**
- * Computes the lexical distance between strings A and B.
- *
- * The "distance" between two strings is given by counting the minimum number
- * of edits needed to transform string A into string B. An edit can be an
- * insertion, deletion, or substitution of a single character, or a swap of two
- * adjacent characters.
- *
- * Includes a custom alteration from Damerau-Levenshtein to treat case changes
- * as a single edit which helps identify mis-cased values with an edit distance
- * of 1.
- *
- * This distance can be useful for detecting typos in input or sorting
- *
- * @param {string} a
- * @param {string} b
- * @return {int} distance in number of edits
- */
-
-
-function lexicalDistance(aStr, bStr) {
-  if (aStr === bStr) {
-    return 0;
-  }
-
-  var d = [];
-  var a = aStr.toLowerCase();
-  var b = bStr.toLowerCase();
-  var aLength = a.length;
-  var bLength = b.length; // Any case change counts as a single edit
-
-  if (a === b) {
-    return 1;
-  }
-
-  for (var i = 0; i <= aLength; i++) {
-    d[i] = [i];
-  }
-
-  for (var j = 1; j <= bLength; j++) {
-    d[0][j] = j;
-  }
-
-  for (var _i3 = 1; _i3 <= aLength; _i3++) {
-    for (var _j = 1; _j <= bLength; _j++) {
-      var cost = a[_i3 - 1] === b[_j - 1] ? 0 : 1;
-      d[_i3][_j] = Math.min(d[_i3 - 1][_j] + 1, d[_i3][_j - 1] + 1, d[_i3 - 1][_j - 1] + cost);
-
-      if (_i3 > 1 && _j > 1 && a[_i3 - 1] === b[_j - 2] && a[_i3 - 2] === b[_j - 1]) {
-        d[_i3][_j] = Math.min(d[_i3][_j], d[_i3 - 2][_j - 2] + cost);
-      }
-    }
-  }
-
-  return d[aLength][bLength];
-}
diff --git a/node_modules/graphql/jsutils/suggestionList.js.flow b/node_modules/graphql/jsutils/suggestionList.js.flow
deleted file mode 100644
index 90ae4b5..0000000
--- a/node_modules/graphql/jsutils/suggestionList.js.flow
+++ /dev/null
@@ -1,85 +0,0 @@
-// @flow strict
-
-/**
- * Given an invalid input string and a list of valid options, returns a filtered
- * list of valid options sorted based on their similarity with the input.
- */
-export default function suggestionList(
-  input: string,
-  options: $ReadOnlyArray<string>,
-): Array<string> {
-  const optionsByDistance = Object.create(null);
-  const inputThreshold = input.length / 2;
-  for (const option of options) {
-    const distance = lexicalDistance(input, option);
-    const threshold = Math.max(inputThreshold, option.length / 2, 1);
-    if (distance <= threshold) {
-      optionsByDistance[option] = distance;
-    }
-  }
-  return Object.keys(optionsByDistance).sort((a, b) => {
-    const distanceDiff = optionsByDistance[a] - optionsByDistance[b];
-    return distanceDiff !== 0 ? distanceDiff : a.localeCompare(b);
-  });
-}
-
-/**
- * Computes the lexical distance between strings A and B.
- *
- * The "distance" between two strings is given by counting the minimum number
- * of edits needed to transform string A into string B. An edit can be an
- * insertion, deletion, or substitution of a single character, or a swap of two
- * adjacent characters.
- *
- * Includes a custom alteration from Damerau-Levenshtein to treat case changes
- * as a single edit which helps identify mis-cased values with an edit distance
- * of 1.
- *
- * This distance can be useful for detecting typos in input or sorting
- *
- * @param {string} a
- * @param {string} b
- * @return {int} distance in number of edits
- */
-function lexicalDistance(aStr, bStr) {
-  if (aStr === bStr) {
-    return 0;
-  }
-
-  const d = [];
-  const a = aStr.toLowerCase();
-  const b = bStr.toLowerCase();
-  const aLength = a.length;
-  const bLength = b.length;
-
-  // Any case change counts as a single edit
-  if (a === b) {
-    return 1;
-  }
-
-  for (let i = 0; i <= aLength; i++) {
-    d[i] = [i];
-  }
-
-  for (let j = 1; j <= bLength; j++) {
-    d[0][j] = j;
-  }
-
-  for (let i = 1; i <= aLength; i++) {
-    for (let j = 1; j <= bLength; j++) {
-      const cost = a[i - 1] === b[j - 1] ? 0 : 1;
-
-      d[i][j] = Math.min(
-        d[i - 1][j] + 1,
-        d[i][j - 1] + 1,
-        d[i - 1][j - 1] + cost,
-      );
-
-      if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {
-        d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost);
-      }
-    }
-  }
-
-  return d[aLength][bLength];
-}
diff --git a/node_modules/graphql/jsutils/suggestionList.mjs b/node_modules/graphql/jsutils/suggestionList.mjs
deleted file mode 100644
index fd2bd5e..0000000
--- a/node_modules/graphql/jsutils/suggestionList.mjs
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Given an invalid input string and a list of valid options, returns a filtered
- * list of valid options sorted based on their similarity with the input.
- */
-export default function suggestionList(input, options) {
-  var optionsByDistance = Object.create(null);
-  var inputThreshold = input.length / 2;
-
-  for (var _i2 = 0; _i2 < options.length; _i2++) {
-    var option = options[_i2];
-    var distance = lexicalDistance(input, option);
-    var threshold = Math.max(inputThreshold, option.length / 2, 1);
-
-    if (distance <= threshold) {
-      optionsByDistance[option] = distance;
-    }
-  }
-
-  return Object.keys(optionsByDistance).sort(function (a, b) {
-    var distanceDiff = optionsByDistance[a] - optionsByDistance[b];
-    return distanceDiff !== 0 ? distanceDiff : a.localeCompare(b);
-  });
-}
-/**
- * Computes the lexical distance between strings A and B.
- *
- * The "distance" between two strings is given by counting the minimum number
- * of edits needed to transform string A into string B. An edit can be an
- * insertion, deletion, or substitution of a single character, or a swap of two
- * adjacent characters.
- *
- * Includes a custom alteration from Damerau-Levenshtein to treat case changes
- * as a single edit which helps identify mis-cased values with an edit distance
- * of 1.
- *
- * This distance can be useful for detecting typos in input or sorting
- *
- * @param {string} a
- * @param {string} b
- * @return {int} distance in number of edits
- */
-
-function lexicalDistance(aStr, bStr) {
-  if (aStr === bStr) {
-    return 0;
-  }
-
-  var d = [];
-  var a = aStr.toLowerCase();
-  var b = bStr.toLowerCase();
-  var aLength = a.length;
-  var bLength = b.length; // Any case change counts as a single edit
-
-  if (a === b) {
-    return 1;
-  }
-
-  for (var i = 0; i <= aLength; i++) {
-    d[i] = [i];
-  }
-
-  for (var j = 1; j <= bLength; j++) {
-    d[0][j] = j;
-  }
-
-  for (var _i3 = 1; _i3 <= aLength; _i3++) {
-    for (var _j = 1; _j <= bLength; _j++) {
-      var cost = a[_i3 - 1] === b[_j - 1] ? 0 : 1;
-      d[_i3][_j] = Math.min(d[_i3 - 1][_j] + 1, d[_i3][_j - 1] + 1, d[_i3 - 1][_j - 1] + cost);
-
-      if (_i3 > 1 && _j > 1 && a[_i3 - 1] === b[_j - 2] && a[_i3 - 2] === b[_j - 1]) {
-        d[_i3][_j] = Math.min(d[_i3][_j], d[_i3 - 2][_j - 2] + cost);
-      }
-    }
-  }
-
-  return d[aLength][bLength];
-}
diff --git a/node_modules/graphql/jsutils/toObjMap.js b/node_modules/graphql/jsutils/toObjMap.js
deleted file mode 100644
index 894edef..0000000
--- a/node_modules/graphql/jsutils/toObjMap.js
+++ /dev/null
@@ -1,28 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = toObjMap;
-
-var _objectEntries3 = _interopRequireDefault(require("../polyfills/objectEntries"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function toObjMap(obj) {
-  /* eslint-enable no-redeclare */
-  if (Object.getPrototypeOf(obj) === null) {
-    return obj;
-  }
-
-  var map = Object.create(null);
-
-  for (var _i2 = 0, _objectEntries2 = (0, _objectEntries3.default)(obj); _i2 < _objectEntries2.length; _i2++) {
-    var _ref2 = _objectEntries2[_i2];
-    var key = _ref2[0];
-    var value = _ref2[1];
-    map[key] = value;
-  }
-
-  return map;
-}
diff --git a/node_modules/graphql/jsutils/toObjMap.js.flow b/node_modules/graphql/jsutils/toObjMap.js.flow
deleted file mode 100644
index cf0da8f..0000000
--- a/node_modules/graphql/jsutils/toObjMap.js.flow
+++ /dev/null
@@ -1,27 +0,0 @@
-// @flow strict
-
-import objectEntries from '../polyfills/objectEntries';
-
-import {
-  type ObjMap,
-  type ObjMapLike,
-  type ReadOnlyObjMap,
-  type ReadOnlyObjMapLike,
-} from './ObjMap';
-
-/* eslint-disable no-redeclare */
-declare function toObjMap<T>(obj: ObjMapLike<T>): ObjMap<T>;
-declare function toObjMap<T>(obj: ReadOnlyObjMapLike<T>): ReadOnlyObjMap<T>;
-
-export default function toObjMap(obj) {
-  /* eslint-enable no-redeclare */
-  if (Object.getPrototypeOf(obj) === null) {
-    return obj;
-  }
-
-  const map = Object.create(null);
-  for (const [key, value] of objectEntries(obj)) {
-    map[key] = value;
-  }
-  return map;
-}
diff --git a/node_modules/graphql/jsutils/toObjMap.mjs b/node_modules/graphql/jsutils/toObjMap.mjs
deleted file mode 100644
index b0ddf05..0000000
--- a/node_modules/graphql/jsutils/toObjMap.mjs
+++ /dev/null
@@ -1,18 +0,0 @@
-import objectEntries from "../polyfills/objectEntries.mjs";
-export default function toObjMap(obj) {
-  /* eslint-enable no-redeclare */
-  if (Object.getPrototypeOf(obj) === null) {
-    return obj;
-  }
-
-  var map = Object.create(null);
-
-  for (var _i2 = 0, _objectEntries2 = objectEntries(obj); _i2 < _objectEntries2.length; _i2++) {
-    var _ref2 = _objectEntries2[_i2];
-    var key = _ref2[0];
-    var value = _ref2[1];
-    map[key] = value;
-  }
-
-  return map;
-}
diff --git a/node_modules/graphql/language/ast.d.ts b/node_modules/graphql/language/ast.d.ts
deleted file mode 100644
index 576db47..0000000
--- a/node_modules/graphql/language/ast.d.ts
+++ /dev/null
@@ -1,593 +0,0 @@
-import { Source } from './source';
-import { TokenKindEnum } from './tokenKind';
-
-/**
- * Contains a range of UTF-8 character offsets and token references that
- * identify the region of the source from which the AST derived.
- */
-export class Location {
-  /**
-   * The character offset at which this Node begins.
-   */
-  readonly start: number;
-
-  /**
-   * The character offset at which this Node ends.
-   */
-  readonly end: number;
-
-  /**
-   * The Token at which this Node begins.
-   */
-  readonly startToken: Token;
-
-  /**
-   * The Token at which this Node ends.
-   */
-  readonly endToken: Token;
-
-  /**
-   * The Source document the AST represents.
-   */
-  readonly source: Source;
-
-  constructor(startToken: Token, endToken: Token, source: Source);
-}
-
-/**
- * Represents a range of characters represented by a lexical token
- * within a Source.
- */
-export class Token {
-  /**
-   * The kind of Token.
-   */
-  readonly kind: TokenKindEnum;
-
-  /**
-   * The character offset at which this Node begins.
-   */
-  readonly start: number;
-
-  /**
-   * The character offset at which this Node ends.
-   */
-  readonly end: number;
-
-  /**
-   * The 1-indexed line number on which this Token appears.
-   */
-  readonly line: number;
-
-  /**
-   * The 1-indexed column number at which this Token begins.
-   */
-  readonly column: number;
-
-  /**
-   * For non-punctuation tokens, represents the interpreted value of the token.
-   */
-  readonly value: string | undefined;
-
-  /**
-   * Tokens exist as nodes in a double-linked-list amongst all tokens
-   * including ignored tokens. <SOF> is always the first node and <EOF>
-   * the last.
-   */
-  readonly prev: Token | null;
-  readonly next: Token | null;
-
-  constructor(
-    kind: TokenKindEnum,
-    start: number,
-    end: number,
-    line: number,
-    column: number,
-    prev: Token | null,
-    value?: string,
-  );
-}
-
-/**
- * @internal
- */
-export function isNode(maybeNode: any): maybeNode is ASTNode;
-
-/**
- * The list of all possible AST node types.
- */
-export type ASTNode =
-  | NameNode
-  | DocumentNode
-  | OperationDefinitionNode
-  | VariableDefinitionNode
-  | VariableNode
-  | SelectionSetNode
-  | FieldNode
-  | ArgumentNode
-  | FragmentSpreadNode
-  | InlineFragmentNode
-  | FragmentDefinitionNode
-  | IntValueNode
-  | FloatValueNode
-  | StringValueNode
-  | BooleanValueNode
-  | NullValueNode
-  | EnumValueNode
-  | ListValueNode
-  | ObjectValueNode
-  | ObjectFieldNode
-  | DirectiveNode
-  | NamedTypeNode
-  | ListTypeNode
-  | NonNullTypeNode
-  | SchemaDefinitionNode
-  | OperationTypeDefinitionNode
-  | ScalarTypeDefinitionNode
-  | ObjectTypeDefinitionNode
-  | FieldDefinitionNode
-  | InputValueDefinitionNode
-  | InterfaceTypeDefinitionNode
-  | UnionTypeDefinitionNode
-  | EnumTypeDefinitionNode
-  | EnumValueDefinitionNode
-  | InputObjectTypeDefinitionNode
-  | DirectiveDefinitionNode
-  | SchemaExtensionNode
-  | ScalarTypeExtensionNode
-  | ObjectTypeExtensionNode
-  | InterfaceTypeExtensionNode
-  | UnionTypeExtensionNode
-  | EnumTypeExtensionNode
-  | InputObjectTypeExtensionNode;
-
-/**
- * Utility type listing all nodes indexed by their kind.
- */
-export interface ASTKindToNode {
-  Name: NameNode;
-  Document: DocumentNode;
-  OperationDefinition: OperationDefinitionNode;
-  VariableDefinition: VariableDefinitionNode;
-  Variable: VariableNode;
-  SelectionSet: SelectionSetNode;
-  Field: FieldNode;
-  Argument: ArgumentNode;
-  FragmentSpread: FragmentSpreadNode;
-  InlineFragment: InlineFragmentNode;
-  FragmentDefinition: FragmentDefinitionNode;
-  IntValue: IntValueNode;
-  FloatValue: FloatValueNode;
-  StringValue: StringValueNode;
-  BooleanValue: BooleanValueNode;
-  NullValue: NullValueNode;
-  EnumValue: EnumValueNode;
-  ListValue: ListValueNode;
-  ObjectValue: ObjectValueNode;
-  ObjectField: ObjectFieldNode;
-  Directive: DirectiveNode;
-  NamedType: NamedTypeNode;
-  ListType: ListTypeNode;
-  NonNullType: NonNullTypeNode;
-  SchemaDefinition: SchemaDefinitionNode;
-  OperationTypeDefinition: OperationTypeDefinitionNode;
-  ScalarTypeDefinition: ScalarTypeDefinitionNode;
-  ObjectTypeDefinition: ObjectTypeDefinitionNode;
-  FieldDefinition: FieldDefinitionNode;
-  InputValueDefinition: InputValueDefinitionNode;
-  InterfaceTypeDefinition: InterfaceTypeDefinitionNode;
-  UnionTypeDefinition: UnionTypeDefinitionNode;
-  EnumTypeDefinition: EnumTypeDefinitionNode;
-  EnumValueDefinition: EnumValueDefinitionNode;
-  InputObjectTypeDefinition: InputObjectTypeDefinitionNode;
-  DirectiveDefinition: DirectiveDefinitionNode;
-  SchemaExtension: SchemaExtensionNode;
-  ScalarTypeExtension: ScalarTypeExtensionNode;
-  ObjectTypeExtension: ObjectTypeExtensionNode;
-  InterfaceTypeExtension: InterfaceTypeExtensionNode;
-  UnionTypeExtension: UnionTypeExtensionNode;
-  EnumTypeExtension: EnumTypeExtensionNode;
-  InputObjectTypeExtension: InputObjectTypeExtensionNode;
-}
-
-// Name
-
-export interface NameNode {
-  readonly kind: 'Name';
-  readonly loc?: Location;
-  readonly value: string;
-}
-
-// Document
-
-export interface DocumentNode {
-  readonly kind: 'Document';
-  readonly loc?: Location;
-  readonly definitions: ReadonlyArray<DefinitionNode>;
-}
-
-export type DefinitionNode =
-  | ExecutableDefinitionNode
-  | TypeSystemDefinitionNode
-  | TypeSystemExtensionNode;
-
-export type ExecutableDefinitionNode =
-  | OperationDefinitionNode
-  | FragmentDefinitionNode;
-
-export interface OperationDefinitionNode {
-  readonly kind: 'OperationDefinition';
-  readonly loc?: Location;
-  readonly operation: OperationTypeNode;
-  readonly name?: NameNode;
-  readonly variableDefinitions?: ReadonlyArray<VariableDefinitionNode>;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly selectionSet: SelectionSetNode;
-}
-
-export type OperationTypeNode = 'query' | 'mutation' | 'subscription';
-
-export interface VariableDefinitionNode {
-  readonly kind: 'VariableDefinition';
-  readonly loc?: Location;
-  readonly variable: VariableNode;
-  readonly type: TypeNode;
-  readonly defaultValue?: ValueNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-}
-
-export interface VariableNode {
-  readonly kind: 'Variable';
-  readonly loc?: Location;
-  readonly name: NameNode;
-}
-
-export interface SelectionSetNode {
-  kind: 'SelectionSet';
-  loc?: Location;
-  selections: ReadonlyArray<SelectionNode>;
-}
-
-export type SelectionNode = FieldNode | FragmentSpreadNode | InlineFragmentNode;
-
-export interface FieldNode {
-  readonly kind: 'Field';
-  readonly loc?: Location;
-  readonly alias?: NameNode;
-  readonly name: NameNode;
-  readonly arguments?: ReadonlyArray<ArgumentNode>;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly selectionSet?: SelectionSetNode;
-}
-
-export interface ArgumentNode {
-  readonly kind: 'Argument';
-  readonly loc?: Location;
-  readonly name: NameNode;
-  readonly value: ValueNode;
-}
-
-// Fragments
-
-export interface FragmentSpreadNode {
-  readonly kind: 'FragmentSpread';
-  readonly loc?: Location;
-  readonly name: NameNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-}
-
-export interface InlineFragmentNode {
-  readonly kind: 'InlineFragment';
-  readonly loc?: Location;
-  readonly typeCondition?: NamedTypeNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly selectionSet: SelectionSetNode;
-}
-
-export interface FragmentDefinitionNode {
-  readonly kind: 'FragmentDefinition';
-  readonly loc?: Location;
-  readonly name: NameNode;
-  // Note: fragment variable definitions are experimental and may be changed
-  // or removed in the future.
-  readonly variableDefinitions?: ReadonlyArray<VariableDefinitionNode>;
-  readonly typeCondition: NamedTypeNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly selectionSet: SelectionSetNode;
-}
-
-// Values
-
-export type ValueNode =
-  | VariableNode
-  | IntValueNode
-  | FloatValueNode
-  | StringValueNode
-  | BooleanValueNode
-  | NullValueNode
-  | EnumValueNode
-  | ListValueNode
-  | ObjectValueNode;
-
-export interface IntValueNode {
-  readonly kind: 'IntValue';
-  readonly loc?: Location;
-  readonly value: string;
-}
-
-export interface FloatValueNode {
-  readonly kind: 'FloatValue';
-  readonly loc?: Location;
-  readonly value: string;
-}
-
-export interface StringValueNode {
-  readonly kind: 'StringValue';
-  readonly loc?: Location;
-  readonly value: string;
-  readonly block?: boolean;
-}
-
-export interface BooleanValueNode {
-  readonly kind: 'BooleanValue';
-  readonly loc?: Location;
-  readonly value: boolean;
-}
-
-export interface NullValueNode {
-  readonly kind: 'NullValue';
-  readonly loc?: Location;
-}
-
-export interface EnumValueNode {
-  readonly kind: 'EnumValue';
-  readonly loc?: Location;
-  readonly value: string;
-}
-
-export interface ListValueNode {
-  readonly kind: 'ListValue';
-  readonly loc?: Location;
-  readonly values: ReadonlyArray<ValueNode>;
-}
-
-export interface ObjectValueNode {
-  readonly kind: 'ObjectValue';
-  readonly loc?: Location;
-  readonly fields: ReadonlyArray<ObjectFieldNode>;
-}
-
-export interface ObjectFieldNode {
-  readonly kind: 'ObjectField';
-  readonly loc?: Location;
-  readonly name: NameNode;
-  readonly value: ValueNode;
-}
-
-// Directives
-
-export interface DirectiveNode {
-  readonly kind: 'Directive';
-  readonly loc?: Location;
-  readonly name: NameNode;
-  readonly arguments?: ReadonlyArray<ArgumentNode>;
-}
-
-// Type Reference
-
-export type TypeNode = NamedTypeNode | ListTypeNode | NonNullTypeNode;
-
-export interface NamedTypeNode {
-  readonly kind: 'NamedType';
-  readonly loc?: Location;
-  readonly name: NameNode;
-}
-
-export interface ListTypeNode {
-  readonly kind: 'ListType';
-  readonly loc?: Location;
-  readonly type: TypeNode;
-}
-
-export interface NonNullTypeNode {
-  readonly kind: 'NonNullType';
-  readonly loc?: Location;
-  readonly type: NamedTypeNode | ListTypeNode;
-}
-
-// Type System Definition
-
-export type TypeSystemDefinitionNode =
-  | SchemaDefinitionNode
-  | TypeDefinitionNode
-  | DirectiveDefinitionNode;
-
-export interface SchemaDefinitionNode {
-  readonly kind: 'SchemaDefinition';
-  readonly loc?: Location;
-  readonly description?: StringValueNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly operationTypes: ReadonlyArray<OperationTypeDefinitionNode>;
-}
-
-export interface OperationTypeDefinitionNode {
-  readonly kind: 'OperationTypeDefinition';
-  readonly loc?: Location;
-  readonly operation: OperationTypeNode;
-  readonly type: NamedTypeNode;
-}
-
-// Type Definition
-
-export type TypeDefinitionNode =
-  | ScalarTypeDefinitionNode
-  | ObjectTypeDefinitionNode
-  | InterfaceTypeDefinitionNode
-  | UnionTypeDefinitionNode
-  | EnumTypeDefinitionNode
-  | InputObjectTypeDefinitionNode;
-
-export interface ScalarTypeDefinitionNode {
-  readonly kind: 'ScalarTypeDefinition';
-  readonly loc?: Location;
-  readonly description?: StringValueNode;
-  readonly name: NameNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-}
-
-export interface ObjectTypeDefinitionNode {
-  readonly kind: 'ObjectTypeDefinition';
-  readonly loc?: Location;
-  readonly description?: StringValueNode;
-  readonly name: NameNode;
-  readonly interfaces?: ReadonlyArray<NamedTypeNode>;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly fields?: ReadonlyArray<FieldDefinitionNode>;
-}
-
-export interface FieldDefinitionNode {
-  readonly kind: 'FieldDefinition';
-  readonly loc?: Location;
-  readonly description?: StringValueNode;
-  readonly name: NameNode;
-  readonly arguments?: ReadonlyArray<InputValueDefinitionNode>;
-  readonly type: TypeNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-}
-
-export interface InputValueDefinitionNode {
-  readonly kind: 'InputValueDefinition';
-  readonly loc?: Location;
-  readonly description?: StringValueNode;
-  readonly name: NameNode;
-  readonly type: TypeNode;
-  readonly defaultValue?: ValueNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-}
-
-export interface InterfaceTypeDefinitionNode {
-  readonly kind: 'InterfaceTypeDefinition';
-  readonly loc?: Location;
-  readonly description?: StringValueNode;
-  readonly name: NameNode;
-  readonly interfaces?: ReadonlyArray<NamedTypeNode>;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly fields?: ReadonlyArray<FieldDefinitionNode>;
-}
-
-export interface UnionTypeDefinitionNode {
-  readonly kind: 'UnionTypeDefinition';
-  readonly loc?: Location;
-  readonly description?: StringValueNode;
-  readonly name: NameNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly types?: ReadonlyArray<NamedTypeNode>;
-}
-
-export interface EnumTypeDefinitionNode {
-  readonly kind: 'EnumTypeDefinition';
-  readonly loc?: Location;
-  readonly description?: StringValueNode;
-  readonly name: NameNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly values?: ReadonlyArray<EnumValueDefinitionNode>;
-}
-
-export interface EnumValueDefinitionNode {
-  readonly kind: 'EnumValueDefinition';
-  readonly loc?: Location;
-  readonly description?: StringValueNode;
-  readonly name: NameNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-}
-
-export interface InputObjectTypeDefinitionNode {
-  readonly kind: 'InputObjectTypeDefinition';
-  readonly loc?: Location;
-  readonly description?: StringValueNode;
-  readonly name: NameNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly fields?: ReadonlyArray<InputValueDefinitionNode>;
-}
-
-// Directive Definitions
-
-export interface DirectiveDefinitionNode {
-  readonly kind: 'DirectiveDefinition';
-  readonly loc?: Location;
-  readonly description?: StringValueNode;
-  readonly name: NameNode;
-  readonly arguments?: ReadonlyArray<InputValueDefinitionNode>;
-  readonly repeatable: boolean;
-  readonly locations: ReadonlyArray<NameNode>;
-}
-
-// Type System Extensions
-
-export type TypeSystemExtensionNode = SchemaExtensionNode | TypeExtensionNode;
-
-export type SchemaExtensionNode = {
-  readonly kind: 'SchemaExtension';
-  readonly loc?: Location;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly operationTypes?: ReadonlyArray<OperationTypeDefinitionNode>;
-};
-
-// Type Extensions
-
-export type TypeExtensionNode =
-  | ScalarTypeExtensionNode
-  | ObjectTypeExtensionNode
-  | InterfaceTypeExtensionNode
-  | UnionTypeExtensionNode
-  | EnumTypeExtensionNode
-  | InputObjectTypeExtensionNode;
-
-export interface ScalarTypeExtensionNode {
-  readonly kind: 'ScalarTypeExtension';
-  readonly loc?: Location;
-  readonly name: NameNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-}
-
-export interface ObjectTypeExtensionNode {
-  readonly kind: 'ObjectTypeExtension';
-  readonly loc?: Location;
-  readonly name: NameNode;
-  readonly interfaces?: ReadonlyArray<NamedTypeNode>;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly fields?: ReadonlyArray<FieldDefinitionNode>;
-}
-
-export interface InterfaceTypeExtensionNode {
-  readonly kind: 'InterfaceTypeExtension';
-  readonly loc?: Location;
-  readonly name: NameNode;
-  readonly interfaces?: ReadonlyArray<NamedTypeNode>;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly fields?: ReadonlyArray<FieldDefinitionNode>;
-}
-
-export interface UnionTypeExtensionNode {
-  readonly kind: 'UnionTypeExtension';
-  readonly loc?: Location;
-  readonly name: NameNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly types?: ReadonlyArray<NamedTypeNode>;
-}
-
-export interface EnumTypeExtensionNode {
-  readonly kind: 'EnumTypeExtension';
-  readonly loc?: Location;
-  readonly name: NameNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly values?: ReadonlyArray<EnumValueDefinitionNode>;
-}
-
-export interface InputObjectTypeExtensionNode {
-  readonly kind: 'InputObjectTypeExtension';
-  readonly loc?: Location;
-  readonly name: NameNode;
-  readonly directives?: ReadonlyArray<DirectiveNode>;
-  readonly fields?: ReadonlyArray<InputValueDefinitionNode>;
-}
diff --git a/node_modules/graphql/language/ast.js b/node_modules/graphql/language/ast.js
deleted file mode 100644
index 41d43b4..0000000
--- a/node_modules/graphql/language/ast.js
+++ /dev/null
@@ -1,118 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.isNode = isNode;
-exports.Token = exports.Location = void 0;
-
-var _defineToJSON = _interopRequireDefault(require("../jsutils/defineToJSON"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Contains a range of UTF-8 character offsets and token references that
- * identify the region of the source from which the AST derived.
- */
-var Location =
-/**
- * The character offset at which this Node begins.
- */
-
-/**
- * The character offset at which this Node ends.
- */
-
-/**
- * The Token at which this Node begins.
- */
-
-/**
- * The Token at which this Node ends.
- */
-
-/**
- * The Source document the AST represents.
- */
-function Location(startToken, endToken, source) {
-  this.start = startToken.start;
-  this.end = endToken.end;
-  this.startToken = startToken;
-  this.endToken = endToken;
-  this.source = source;
-}; // Print a simplified form when appearing in JSON/util.inspect.
-
-
-exports.Location = Location;
-(0, _defineToJSON.default)(Location, function () {
-  return {
-    start: this.start,
-    end: this.end
-  };
-});
-/**
- * Represents a range of characters represented by a lexical token
- * within a Source.
- */
-
-var Token =
-/**
- * The kind of Token.
- */
-
-/**
- * The character offset at which this Node begins.
- */
-
-/**
- * The character offset at which this Node ends.
- */
-
-/**
- * The 1-indexed line number on which this Token appears.
- */
-
-/**
- * The 1-indexed column number at which this Token begins.
- */
-
-/**
- * For non-punctuation tokens, represents the interpreted value of the token.
- */
-
-/**
- * Tokens exist as nodes in a double-linked-list amongst all tokens
- * including ignored tokens. <SOF> is always the first node and <EOF>
- * the last.
- */
-function Token(kind, start, end, line, column, prev, value) {
-  this.kind = kind;
-  this.start = start;
-  this.end = end;
-  this.line = line;
-  this.column = column;
-  this.value = value;
-  this.prev = prev;
-  this.next = null;
-}; // Print a simplified form when appearing in JSON/util.inspect.
-
-
-exports.Token = Token;
-(0, _defineToJSON.default)(Token, function () {
-  return {
-    kind: this.kind,
-    value: this.value,
-    line: this.line,
-    column: this.column
-  };
-});
-/**
- * @internal
- */
-
-function isNode(maybeNode) {
-  return maybeNode != null && typeof maybeNode.kind === 'string';
-}
-/**
- * The list of all possible AST node types.
- */
diff --git a/node_modules/graphql/language/ast.js.flow b/node_modules/graphql/language/ast.js.flow
deleted file mode 100644
index 9d5df64..0000000
--- a/node_modules/graphql/language/ast.js.flow
+++ /dev/null
@@ -1,629 +0,0 @@
-// @flow strict
-
-import defineToJSON from '../jsutils/defineToJSON';
-
-import { type Source } from './source';
-import { type TokenKindEnum } from './tokenKind';
-
-/**
- * Contains a range of UTF-8 character offsets and token references that
- * identify the region of the source from which the AST derived.
- */
-export class Location {
-  /**
-   * The character offset at which this Node begins.
-   */
-  +start: number;
-
-  /**
-   * The character offset at which this Node ends.
-   */
-  +end: number;
-
-  /**
-   * The Token at which this Node begins.
-   */
-  +startToken: Token;
-
-  /**
-   * The Token at which this Node ends.
-   */
-  +endToken: Token;
-
-  /**
-   * The Source document the AST represents.
-   */
-  +source: Source;
-
-  constructor(startToken: Token, endToken: Token, source: Source) {
-    this.start = startToken.start;
-    this.end = endToken.end;
-    this.startToken = startToken;
-    this.endToken = endToken;
-    this.source = source;
-  }
-}
-
-// Print a simplified form when appearing in JSON/util.inspect.
-defineToJSON(Location, function() {
-  return { start: this.start, end: this.end };
-});
-
-/**
- * Represents a range of characters represented by a lexical token
- * within a Source.
- */
-export class Token {
-  /**
-   * The kind of Token.
-   */
-  +kind: TokenKindEnum;
-
-  /**
-   * The character offset at which this Node begins.
-   */
-  +start: number;
-
-  /**
-   * The character offset at which this Node ends.
-   */
-  +end: number;
-
-  /**
-   * The 1-indexed line number on which this Token appears.
-   */
-  +line: number;
-
-  /**
-   * The 1-indexed column number at which this Token begins.
-   */
-  +column: number;
-
-  /**
-   * For non-punctuation tokens, represents the interpreted value of the token.
-   */
-  +value: string | void;
-
-  /**
-   * Tokens exist as nodes in a double-linked-list amongst all tokens
-   * including ignored tokens. <SOF> is always the first node and <EOF>
-   * the last.
-   */
-  +prev: Token | null;
-  +next: Token | null;
-
-  constructor(
-    kind: TokenKindEnum,
-    start: number,
-    end: number,
-    line: number,
-    column: number,
-    prev: Token | null,
-    value?: string,
-  ) {
-    this.kind = kind;
-    this.start = start;
-    this.end = end;
-    this.line = line;
-    this.column = column;
-    this.value = value;
-    this.prev = prev;
-    this.next = null;
-  }
-}
-
-// Print a simplified form when appearing in JSON/util.inspect.
-defineToJSON(Token, function() {
-  return {
-    kind: this.kind,
-    value: this.value,
-    line: this.line,
-    column: this.column,
-  };
-});
-
-/**
- * @internal
- */
-export function isNode(maybeNode: mixed): boolean %checks {
-  return maybeNode != null && typeof maybeNode.kind === 'string';
-}
-
-/**
- * The list of all possible AST node types.
- */
-export type ASTNode =
-  | NameNode
-  | DocumentNode
-  | OperationDefinitionNode
-  | VariableDefinitionNode
-  | VariableNode
-  | SelectionSetNode
-  | FieldNode
-  | ArgumentNode
-  | FragmentSpreadNode
-  | InlineFragmentNode
-  | FragmentDefinitionNode
-  | IntValueNode
-  | FloatValueNode
-  | StringValueNode
-  | BooleanValueNode
-  | NullValueNode
-  | EnumValueNode
-  | ListValueNode
-  | ObjectValueNode
-  | ObjectFieldNode
-  | DirectiveNode
-  | NamedTypeNode
-  | ListTypeNode
-  | NonNullTypeNode
-  | SchemaDefinitionNode
-  | OperationTypeDefinitionNode
-  | ScalarTypeDefinitionNode
-  | ObjectTypeDefinitionNode
-  | FieldDefinitionNode
-  | InputValueDefinitionNode
-  | InterfaceTypeDefinitionNode
-  | UnionTypeDefinitionNode
-  | EnumTypeDefinitionNode
-  | EnumValueDefinitionNode
-  | InputObjectTypeDefinitionNode
-  | DirectiveDefinitionNode
-  | SchemaExtensionNode
-  | ScalarTypeExtensionNode
-  | ObjectTypeExtensionNode
-  | InterfaceTypeExtensionNode
-  | UnionTypeExtensionNode
-  | EnumTypeExtensionNode
-  | InputObjectTypeExtensionNode;
-
-/**
- * Utility type listing all nodes indexed by their kind.
- */
-export type ASTKindToNode = {|
-  Name: NameNode,
-  Document: DocumentNode,
-  OperationDefinition: OperationDefinitionNode,
-  VariableDefinition: VariableDefinitionNode,
-  Variable: VariableNode,
-  SelectionSet: SelectionSetNode,
-  Field: FieldNode,
-  Argument: ArgumentNode,
-  FragmentSpread: FragmentSpreadNode,
-  InlineFragment: InlineFragmentNode,
-  FragmentDefinition: FragmentDefinitionNode,
-  IntValue: IntValueNode,
-  FloatValue: FloatValueNode,
-  StringValue: StringValueNode,
-  BooleanValue: BooleanValueNode,
-  NullValue: NullValueNode,
-  EnumValue: EnumValueNode,
-  ListValue: ListValueNode,
-  ObjectValue: ObjectValueNode,
-  ObjectField: ObjectFieldNode,
-  Directive: DirectiveNode,
-  NamedType: NamedTypeNode,
-  ListType: ListTypeNode,
-  NonNullType: NonNullTypeNode,
-  SchemaDefinition: SchemaDefinitionNode,
-  OperationTypeDefinition: OperationTypeDefinitionNode,
-  ScalarTypeDefinition: ScalarTypeDefinitionNode,
-  ObjectTypeDefinition: ObjectTypeDefinitionNode,
-  FieldDefinition: FieldDefinitionNode,
-  InputValueDefinition: InputValueDefinitionNode,
-  InterfaceTypeDefinition: InterfaceTypeDefinitionNode,
-  UnionTypeDefinition: UnionTypeDefinitionNode,
-  EnumTypeDefinition: EnumTypeDefinitionNode,
-  EnumValueDefinition: EnumValueDefinitionNode,
-  InputObjectTypeDefinition: InputObjectTypeDefinitionNode,
-  DirectiveDefinition: DirectiveDefinitionNode,
-  SchemaExtension: SchemaExtensionNode,
-  ScalarTypeExtension: ScalarTypeExtensionNode,
-  ObjectTypeExtension: ObjectTypeExtensionNode,
-  InterfaceTypeExtension: InterfaceTypeExtensionNode,
-  UnionTypeExtension: UnionTypeExtensionNode,
-  EnumTypeExtension: EnumTypeExtensionNode,
-  InputObjectTypeExtension: InputObjectTypeExtensionNode,
-|};
-
-// Name
-
-export type NameNode = {|
-  +kind: 'Name',
-  +loc?: Location,
-  +value: string,
-|};
-
-// Document
-
-export type DocumentNode = {|
-  +kind: 'Document',
-  +loc?: Location,
-  +definitions: $ReadOnlyArray<DefinitionNode>,
-|};
-
-export type DefinitionNode =
-  | ExecutableDefinitionNode
-  | TypeSystemDefinitionNode
-  | TypeSystemExtensionNode;
-
-export type ExecutableDefinitionNode =
-  | OperationDefinitionNode
-  | FragmentDefinitionNode;
-
-export type OperationDefinitionNode = {|
-  +kind: 'OperationDefinition',
-  +loc?: Location,
-  +operation: OperationTypeNode,
-  +name?: NameNode,
-  +variableDefinitions?: $ReadOnlyArray<VariableDefinitionNode>,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +selectionSet: SelectionSetNode,
-|};
-
-export type OperationTypeNode = 'query' | 'mutation' | 'subscription';
-
-export type VariableDefinitionNode = {|
-  +kind: 'VariableDefinition',
-  +loc?: Location,
-  +variable: VariableNode,
-  +type: TypeNode,
-  +defaultValue?: ValueNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-|};
-
-export type VariableNode = {|
-  +kind: 'Variable',
-  +loc?: Location,
-  +name: NameNode,
-|};
-
-export type SelectionSetNode = {|
-  kind: 'SelectionSet',
-  loc?: Location,
-  selections: $ReadOnlyArray<SelectionNode>,
-|};
-
-export type SelectionNode = FieldNode | FragmentSpreadNode | InlineFragmentNode;
-
-export type FieldNode = {|
-  +kind: 'Field',
-  +loc?: Location,
-  +alias?: NameNode,
-  +name: NameNode,
-  +arguments?: $ReadOnlyArray<ArgumentNode>,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +selectionSet?: SelectionSetNode,
-|};
-
-export type ArgumentNode = {|
-  +kind: 'Argument',
-  +loc?: Location,
-  +name: NameNode,
-  +value: ValueNode,
-|};
-
-// Fragments
-
-export type FragmentSpreadNode = {|
-  +kind: 'FragmentSpread',
-  +loc?: Location,
-  +name: NameNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-|};
-
-export type InlineFragmentNode = {|
-  +kind: 'InlineFragment',
-  +loc?: Location,
-  +typeCondition?: NamedTypeNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +selectionSet: SelectionSetNode,
-|};
-
-export type FragmentDefinitionNode = {|
-  +kind: 'FragmentDefinition',
-  +loc?: Location,
-  +name: NameNode,
-  // Note: fragment variable definitions are experimental and may be changed
-  // or removed in the future.
-  +variableDefinitions?: $ReadOnlyArray<VariableDefinitionNode>,
-  +typeCondition: NamedTypeNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +selectionSet: SelectionSetNode,
-|};
-
-// Values
-
-export type ValueNode =
-  | VariableNode
-  | IntValueNode
-  | FloatValueNode
-  | StringValueNode
-  | BooleanValueNode
-  | NullValueNode
-  | EnumValueNode
-  | ListValueNode
-  | ObjectValueNode;
-
-export type IntValueNode = {|
-  +kind: 'IntValue',
-  +loc?: Location,
-  +value: string,
-|};
-
-export type FloatValueNode = {|
-  +kind: 'FloatValue',
-  +loc?: Location,
-  +value: string,
-|};
-
-export type StringValueNode = {|
-  +kind: 'StringValue',
-  +loc?: Location,
-  +value: string,
-  +block?: boolean,
-|};
-
-export type BooleanValueNode = {|
-  +kind: 'BooleanValue',
-  +loc?: Location,
-  +value: boolean,
-|};
-
-export type NullValueNode = {|
-  +kind: 'NullValue',
-  +loc?: Location,
-|};
-
-export type EnumValueNode = {|
-  +kind: 'EnumValue',
-  +loc?: Location,
-  +value: string,
-|};
-
-export type ListValueNode = {|
-  +kind: 'ListValue',
-  +loc?: Location,
-  +values: $ReadOnlyArray<ValueNode>,
-|};
-
-export type ObjectValueNode = {|
-  +kind: 'ObjectValue',
-  +loc?: Location,
-  +fields: $ReadOnlyArray<ObjectFieldNode>,
-|};
-
-export type ObjectFieldNode = {|
-  +kind: 'ObjectField',
-  +loc?: Location,
-  +name: NameNode,
-  +value: ValueNode,
-|};
-
-// Directives
-
-export type DirectiveNode = {|
-  +kind: 'Directive',
-  +loc?: Location,
-  +name: NameNode,
-  +arguments?: $ReadOnlyArray<ArgumentNode>,
-|};
-
-// Type Reference
-
-export type TypeNode = NamedTypeNode | ListTypeNode | NonNullTypeNode;
-
-export type NamedTypeNode = {|
-  +kind: 'NamedType',
-  +loc?: Location,
-  +name: NameNode,
-|};
-
-export type ListTypeNode = {|
-  +kind: 'ListType',
-  +loc?: Location,
-  +type: TypeNode,
-|};
-
-export type NonNullTypeNode = {|
-  +kind: 'NonNullType',
-  +loc?: Location,
-  +type: NamedTypeNode | ListTypeNode,
-|};
-
-// Type System Definition
-
-export type TypeSystemDefinitionNode =
-  | SchemaDefinitionNode
-  | TypeDefinitionNode
-  | DirectiveDefinitionNode;
-
-export type SchemaDefinitionNode = {|
-  +kind: 'SchemaDefinition',
-  +loc?: Location,
-  +description?: StringValueNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +operationTypes: $ReadOnlyArray<OperationTypeDefinitionNode>,
-|};
-
-export type OperationTypeDefinitionNode = {|
-  +kind: 'OperationTypeDefinition',
-  +loc?: Location,
-  +operation: OperationTypeNode,
-  +type: NamedTypeNode,
-|};
-
-// Type Definition
-
-export type TypeDefinitionNode =
-  | ScalarTypeDefinitionNode
-  | ObjectTypeDefinitionNode
-  | InterfaceTypeDefinitionNode
-  | UnionTypeDefinitionNode
-  | EnumTypeDefinitionNode
-  | InputObjectTypeDefinitionNode;
-
-export type ScalarTypeDefinitionNode = {|
-  +kind: 'ScalarTypeDefinition',
-  +loc?: Location,
-  +description?: StringValueNode,
-  +name: NameNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-|};
-
-export type ObjectTypeDefinitionNode = {|
-  +kind: 'ObjectTypeDefinition',
-  +loc?: Location,
-  +description?: StringValueNode,
-  +name: NameNode,
-  +interfaces?: $ReadOnlyArray<NamedTypeNode>,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +fields?: $ReadOnlyArray<FieldDefinitionNode>,
-|};
-
-export type FieldDefinitionNode = {|
-  +kind: 'FieldDefinition',
-  +loc?: Location,
-  +description?: StringValueNode,
-  +name: NameNode,
-  +arguments?: $ReadOnlyArray<InputValueDefinitionNode>,
-  +type: TypeNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-|};
-
-export type InputValueDefinitionNode = {|
-  +kind: 'InputValueDefinition',
-  +loc?: Location,
-  +description?: StringValueNode,
-  +name: NameNode,
-  +type: TypeNode,
-  +defaultValue?: ValueNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-|};
-
-export type InterfaceTypeDefinitionNode = {|
-  +kind: 'InterfaceTypeDefinition',
-  +loc?: Location,
-  +description?: StringValueNode,
-  +name: NameNode,
-  +interfaces?: $ReadOnlyArray<NamedTypeNode>,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +fields?: $ReadOnlyArray<FieldDefinitionNode>,
-|};
-
-export type UnionTypeDefinitionNode = {|
-  +kind: 'UnionTypeDefinition',
-  +loc?: Location,
-  +description?: StringValueNode,
-  +name: NameNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +types?: $ReadOnlyArray<NamedTypeNode>,
-|};
-
-export type EnumTypeDefinitionNode = {|
-  +kind: 'EnumTypeDefinition',
-  +loc?: Location,
-  +description?: StringValueNode,
-  +name: NameNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +values?: $ReadOnlyArray<EnumValueDefinitionNode>,
-|};
-
-export type EnumValueDefinitionNode = {|
-  +kind: 'EnumValueDefinition',
-  +loc?: Location,
-  +description?: StringValueNode,
-  +name: NameNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-|};
-
-export type InputObjectTypeDefinitionNode = {|
-  +kind: 'InputObjectTypeDefinition',
-  +loc?: Location,
-  +description?: StringValueNode,
-  +name: NameNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +fields?: $ReadOnlyArray<InputValueDefinitionNode>,
-|};
-
-// Directive Definitions
-
-export type DirectiveDefinitionNode = {|
-  +kind: 'DirectiveDefinition',
-  +loc?: Location,
-  +description?: StringValueNode,
-  +name: NameNode,
-  +arguments?: $ReadOnlyArray<InputValueDefinitionNode>,
-  +repeatable: boolean,
-  +locations: $ReadOnlyArray<NameNode>,
-|};
-
-// Type System Extensions
-
-export type TypeSystemExtensionNode = SchemaExtensionNode | TypeExtensionNode;
-
-export type SchemaExtensionNode = {|
-  +kind: 'SchemaExtension',
-  +loc?: Location,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +operationTypes?: $ReadOnlyArray<OperationTypeDefinitionNode>,
-|};
-
-// Type Extensions
-
-export type TypeExtensionNode =
-  | ScalarTypeExtensionNode
-  | ObjectTypeExtensionNode
-  | InterfaceTypeExtensionNode
-  | UnionTypeExtensionNode
-  | EnumTypeExtensionNode
-  | InputObjectTypeExtensionNode;
-
-export type ScalarTypeExtensionNode = {|
-  +kind: 'ScalarTypeExtension',
-  +loc?: Location,
-  +name: NameNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-|};
-
-export type ObjectTypeExtensionNode = {|
-  +kind: 'ObjectTypeExtension',
-  +loc?: Location,
-  +name: NameNode,
-  +interfaces?: $ReadOnlyArray<NamedTypeNode>,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +fields?: $ReadOnlyArray<FieldDefinitionNode>,
-|};
-
-export type InterfaceTypeExtensionNode = {|
-  +kind: 'InterfaceTypeExtension',
-  +loc?: Location,
-  +name: NameNode,
-  +interfaces?: $ReadOnlyArray<NamedTypeNode>,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +fields?: $ReadOnlyArray<FieldDefinitionNode>,
-|};
-
-export type UnionTypeExtensionNode = {|
-  +kind: 'UnionTypeExtension',
-  +loc?: Location,
-  +name: NameNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +types?: $ReadOnlyArray<NamedTypeNode>,
-|};
-
-export type EnumTypeExtensionNode = {|
-  +kind: 'EnumTypeExtension',
-  +loc?: Location,
-  +name: NameNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +values?: $ReadOnlyArray<EnumValueDefinitionNode>,
-|};
-
-export type InputObjectTypeExtensionNode = {|
-  +kind: 'InputObjectTypeExtension',
-  +loc?: Location,
-  +name: NameNode,
-  +directives?: $ReadOnlyArray<DirectiveNode>,
-  +fields?: $ReadOnlyArray<InputValueDefinitionNode>,
-|};
diff --git a/node_modules/graphql/language/ast.mjs b/node_modules/graphql/language/ast.mjs
deleted file mode 100644
index 9635962..0000000
--- a/node_modules/graphql/language/ast.mjs
+++ /dev/null
@@ -1,104 +0,0 @@
-import defineToJSON from "../jsutils/defineToJSON.mjs";
-
-/**
- * Contains a range of UTF-8 character offsets and token references that
- * identify the region of the source from which the AST derived.
- */
-export var Location =
-/**
- * The character offset at which this Node begins.
- */
-
-/**
- * The character offset at which this Node ends.
- */
-
-/**
- * The Token at which this Node begins.
- */
-
-/**
- * The Token at which this Node ends.
- */
-
-/**
- * The Source document the AST represents.
- */
-function Location(startToken, endToken, source) {
-  this.start = startToken.start;
-  this.end = endToken.end;
-  this.startToken = startToken;
-  this.endToken = endToken;
-  this.source = source;
-}; // Print a simplified form when appearing in JSON/util.inspect.
-
-defineToJSON(Location, function () {
-  return {
-    start: this.start,
-    end: this.end
-  };
-});
-/**
- * Represents a range of characters represented by a lexical token
- * within a Source.
- */
-
-export var Token =
-/**
- * The kind of Token.
- */
-
-/**
- * The character offset at which this Node begins.
- */
-
-/**
- * The character offset at which this Node ends.
- */
-
-/**
- * The 1-indexed line number on which this Token appears.
- */
-
-/**
- * The 1-indexed column number at which this Token begins.
- */
-
-/**
- * For non-punctuation tokens, represents the interpreted value of the token.
- */
-
-/**
- * Tokens exist as nodes in a double-linked-list amongst all tokens
- * including ignored tokens. <SOF> is always the first node and <EOF>
- * the last.
- */
-function Token(kind, start, end, line, column, prev, value) {
-  this.kind = kind;
-  this.start = start;
-  this.end = end;
-  this.line = line;
-  this.column = column;
-  this.value = value;
-  this.prev = prev;
-  this.next = null;
-}; // Print a simplified form when appearing in JSON/util.inspect.
-
-defineToJSON(Token, function () {
-  return {
-    kind: this.kind,
-    value: this.value,
-    line: this.line,
-    column: this.column
-  };
-});
-/**
- * @internal
- */
-
-export function isNode(maybeNode) {
-  return maybeNode != null && typeof maybeNode.kind === 'string';
-}
-/**
- * The list of all possible AST node types.
- */
diff --git a/node_modules/graphql/language/blockString.d.ts b/node_modules/graphql/language/blockString.d.ts
deleted file mode 100644
index fe997b4..0000000
--- a/node_modules/graphql/language/blockString.d.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Produces the value of a block string from its parsed raw value, similar to
- * CoffeeScript's block string, Python's docstring trim or Ruby's strip_heredoc.
- *
- * This implements the GraphQL spec's BlockStringValue() static algorithm.
- */
-export function dedentBlockStringValue(rawString: string): string;
-
-/**
- * @internal
- */
-export function getBlockStringIndentation(lines: ReadonlyArray<string>): number;
-
-/**
- * Print a block string in the indented block form by adding a leading and
- * trailing blank line. However, if a block string starts with whitespace and is
- * a single-line, adding a leading blank line would strip that whitespace.
- */
-export function printBlockString(
-  value: string,
-  indentation?: string,
-  preferMultipleLines?: boolean,
-): string;
diff --git a/node_modules/graphql/language/blockString.js b/node_modules/graphql/language/blockString.js
deleted file mode 100644
index 1a227ff..0000000
--- a/node_modules/graphql/language/blockString.js
+++ /dev/null
@@ -1,112 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.dedentBlockStringValue = dedentBlockStringValue;
-exports.getBlockStringIndentation = getBlockStringIndentation;
-exports.printBlockString = printBlockString;
-
-/**
- * Produces the value of a block string from its parsed raw value, similar to
- * CoffeeScript's block string, Python's docstring trim or Ruby's strip_heredoc.
- *
- * This implements the GraphQL spec's BlockStringValue() static algorithm.
- *
- * @internal
- */
-function dedentBlockStringValue(rawString) {
-  // Expand a block string's raw value into independent lines.
-  var lines = rawString.split(/\r\n|[\n\r]/g); // Remove common indentation from all lines but first.
-
-  var commonIndent = getBlockStringIndentation(lines);
-
-  if (commonIndent !== 0) {
-    for (var i = 1; i < lines.length; i++) {
-      lines[i] = lines[i].slice(commonIndent);
-    }
-  } // Remove leading and trailing blank lines.
-
-
-  while (lines.length > 0 && isBlank(lines[0])) {
-    lines.shift();
-  }
-
-  while (lines.length > 0 && isBlank(lines[lines.length - 1])) {
-    lines.pop();
-  } // Return a string of the lines joined with U+000A.
-
-
-  return lines.join('\n');
-}
-/**
- * @internal
- */
-
-
-function getBlockStringIndentation(lines) {
-  var commonIndent = null;
-
-  for (var i = 1; i < lines.length; i++) {
-    var line = lines[i];
-    var indent = leadingWhitespace(line);
-
-    if (indent === line.length) {
-      continue; // skip empty lines
-    }
-
-    if (commonIndent === null || indent < commonIndent) {
-      commonIndent = indent;
-
-      if (commonIndent === 0) {
-        break;
-      }
-    }
-  }
-
-  return commonIndent === null ? 0 : commonIndent;
-}
-
-function leadingWhitespace(str) {
-  var i = 0;
-
-  while (i < str.length && (str[i] === ' ' || str[i] === '\t')) {
-    i++;
-  }
-
-  return i;
-}
-
-function isBlank(str) {
-  return leadingWhitespace(str) === str.length;
-}
-/**
- * Print a block string in the indented block form by adding a leading and
- * trailing blank line. However, if a block string starts with whitespace and is
- * a single-line, adding a leading blank line would strip that whitespace.
- *
- * @internal
- */
-
-
-function printBlockString(value) {
-  var indentation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
-  var preferMultipleLines = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-  var isSingleLine = value.indexOf('\n') === -1;
-  var hasLeadingSpace = value[0] === ' ' || value[0] === '\t';
-  var hasTrailingQuote = value[value.length - 1] === '"';
-  var printAsMultipleLines = !isSingleLine || hasTrailingQuote || preferMultipleLines;
-  var result = ''; // Format a multi-line block quote to account for leading space.
-
-  if (printAsMultipleLines && !(isSingleLine && hasLeadingSpace)) {
-    result += '\n' + indentation;
-  }
-
-  result += indentation ? value.replace(/\n/g, '\n' + indentation) : value;
-
-  if (printAsMultipleLines) {
-    result += '\n';
-  }
-
-  return '"""' + result.replace(/"""/g, '\\"""') + '"""';
-}
diff --git a/node_modules/graphql/language/blockString.js.flow b/node_modules/graphql/language/blockString.js.flow
deleted file mode 100644
index dba151a..0000000
--- a/node_modules/graphql/language/blockString.js.flow
+++ /dev/null
@@ -1,102 +0,0 @@
-// @flow strict
-
-/**
- * Produces the value of a block string from its parsed raw value, similar to
- * CoffeeScript's block string, Python's docstring trim or Ruby's strip_heredoc.
- *
- * This implements the GraphQL spec's BlockStringValue() static algorithm.
- *
- * @internal
- */
-export function dedentBlockStringValue(rawString: string): string {
-  // Expand a block string's raw value into independent lines.
-  const lines = rawString.split(/\r\n|[\n\r]/g);
-
-  // Remove common indentation from all lines but first.
-  const commonIndent = getBlockStringIndentation(lines);
-
-  if (commonIndent !== 0) {
-    for (let i = 1; i < lines.length; i++) {
-      lines[i] = lines[i].slice(commonIndent);
-    }
-  }
-
-  // Remove leading and trailing blank lines.
-  while (lines.length > 0 && isBlank(lines[0])) {
-    lines.shift();
-  }
-  while (lines.length > 0 && isBlank(lines[lines.length - 1])) {
-    lines.pop();
-  }
-
-  // Return a string of the lines joined with U+000A.
-  return lines.join('\n');
-}
-/**
- * @internal
- */
-export function getBlockStringIndentation(
-  lines: $ReadOnlyArray<string>,
-): number {
-  let commonIndent = null;
-
-  for (let i = 1; i < lines.length; i++) {
-    const line = lines[i];
-    const indent = leadingWhitespace(line);
-    if (indent === line.length) {
-      continue; // skip empty lines
-    }
-
-    if (commonIndent === null || indent < commonIndent) {
-      commonIndent = indent;
-      if (commonIndent === 0) {
-        break;
-      }
-    }
-  }
-
-  return commonIndent === null ? 0 : commonIndent;
-}
-
-function leadingWhitespace(str) {
-  let i = 0;
-  while (i < str.length && (str[i] === ' ' || str[i] === '\t')) {
-    i++;
-  }
-  return i;
-}
-
-function isBlank(str) {
-  return leadingWhitespace(str) === str.length;
-}
-
-/**
- * Print a block string in the indented block form by adding a leading and
- * trailing blank line. However, if a block string starts with whitespace and is
- * a single-line, adding a leading blank line would strip that whitespace.
- *
- * @internal
- */
-export function printBlockString(
-  value: string,
-  indentation?: string = '',
-  preferMultipleLines?: boolean = false,
-): string {
-  const isSingleLine = value.indexOf('\n') === -1;
-  const hasLeadingSpace = value[0] === ' ' || value[0] === '\t';
-  const hasTrailingQuote = value[value.length - 1] === '"';
-  const printAsMultipleLines =
-    !isSingleLine || hasTrailingQuote || preferMultipleLines;
-
-  let result = '';
-  // Format a multi-line block quote to account for leading space.
-  if (printAsMultipleLines && !(isSingleLine && hasLeadingSpace)) {
-    result += '\n' + indentation;
-  }
-  result += indentation ? value.replace(/\n/g, '\n' + indentation) : value;
-  if (printAsMultipleLines) {
-    result += '\n';
-  }
-
-  return '"""' + result.replace(/"""/g, '\\"""') + '"""';
-}
diff --git a/node_modules/graphql/language/blockString.mjs b/node_modules/graphql/language/blockString.mjs
deleted file mode 100644
index bc8f3cf..0000000
--- a/node_modules/graphql/language/blockString.mjs
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Produces the value of a block string from its parsed raw value, similar to
- * CoffeeScript's block string, Python's docstring trim or Ruby's strip_heredoc.
- *
- * This implements the GraphQL spec's BlockStringValue() static algorithm.
- *
- * @internal
- */
-export function dedentBlockStringValue(rawString) {
-  // Expand a block string's raw value into independent lines.
-  var lines = rawString.split(/\r\n|[\n\r]/g); // Remove common indentation from all lines but first.
-
-  var commonIndent = getBlockStringIndentation(lines);
-
-  if (commonIndent !== 0) {
-    for (var i = 1; i < lines.length; i++) {
-      lines[i] = lines[i].slice(commonIndent);
-    }
-  } // Remove leading and trailing blank lines.
-
-
-  while (lines.length > 0 && isBlank(lines[0])) {
-    lines.shift();
-  }
-
-  while (lines.length > 0 && isBlank(lines[lines.length - 1])) {
-    lines.pop();
-  } // Return a string of the lines joined with U+000A.
-
-
-  return lines.join('\n');
-}
-/**
- * @internal
- */
-
-export function getBlockStringIndentation(lines) {
-  var commonIndent = null;
-
-  for (var i = 1; i < lines.length; i++) {
-    var line = lines[i];
-    var indent = leadingWhitespace(line);
-
-    if (indent === line.length) {
-      continue; // skip empty lines
-    }
-
-    if (commonIndent === null || indent < commonIndent) {
-      commonIndent = indent;
-
-      if (commonIndent === 0) {
-        break;
-      }
-    }
-  }
-
-  return commonIndent === null ? 0 : commonIndent;
-}
-
-function leadingWhitespace(str) {
-  var i = 0;
-
-  while (i < str.length && (str[i] === ' ' || str[i] === '\t')) {
-    i++;
-  }
-
-  return i;
-}
-
-function isBlank(str) {
-  return leadingWhitespace(str) === str.length;
-}
-/**
- * Print a block string in the indented block form by adding a leading and
- * trailing blank line. However, if a block string starts with whitespace and is
- * a single-line, adding a leading blank line would strip that whitespace.
- *
- * @internal
- */
-
-
-export function printBlockString(value) {
-  var indentation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
-  var preferMultipleLines = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-  var isSingleLine = value.indexOf('\n') === -1;
-  var hasLeadingSpace = value[0] === ' ' || value[0] === '\t';
-  var hasTrailingQuote = value[value.length - 1] === '"';
-  var printAsMultipleLines = !isSingleLine || hasTrailingQuote || preferMultipleLines;
-  var result = ''; // Format a multi-line block quote to account for leading space.
-
-  if (printAsMultipleLines && !(isSingleLine && hasLeadingSpace)) {
-    result += '\n' + indentation;
-  }
-
-  result += indentation ? value.replace(/\n/g, '\n' + indentation) : value;
-
-  if (printAsMultipleLines) {
-    result += '\n';
-  }
-
-  return '"""' + result.replace(/"""/g, '\\"""') + '"""';
-}
diff --git a/node_modules/graphql/language/directiveLocation.d.ts b/node_modules/graphql/language/directiveLocation.d.ts
deleted file mode 100644
index 31365f5..0000000
--- a/node_modules/graphql/language/directiveLocation.d.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * The set of allowed directive location values.
- */
-export const DirectiveLocation: _DirectiveLocation;
-
-/**
- * @internal
- */
-type _DirectiveLocation = {
-  // Request Definitions
-  QUERY: 'QUERY';
-  MUTATION: 'MUTATION';
-  SUBSCRIPTION: 'SUBSCRIPTION';
-  FIELD: 'FIELD';
-  FRAGMENT_DEFINITION: 'FRAGMENT_DEFINITION';
-  FRAGMENT_SPREAD: 'FRAGMENT_SPREAD';
-  INLINE_FRAGMENT: 'INLINE_FRAGMENT';
-  VARIABLE_DEFINITION: 'VARIABLE_DEFINITION';
-
-  // Type System Definitions
-  SCHEMA: 'SCHEMA';
-  SCALAR: 'SCALAR';
-  OBJECT: 'OBJECT';
-  FIELD_DEFINITION: 'FIELD_DEFINITION';
-  ARGUMENT_DEFINITION: 'ARGUMENT_DEFINITION';
-  INTERFACE: 'INTERFACE';
-  UNION: 'UNION';
-  ENUM: 'ENUM';
-  ENUM_VALUE: 'ENUM_VALUE';
-  INPUT_OBJECT: 'INPUT_OBJECT';
-  INPUT_FIELD_DEFINITION: 'INPUT_FIELD_DEFINITION';
-};
-
-/**
- * The enum type representing the directive location values.
- */
-export type DirectiveLocationEnum = _DirectiveLocation[keyof _DirectiveLocation];
diff --git a/node_modules/graphql/language/directiveLocation.js b/node_modules/graphql/language/directiveLocation.js
deleted file mode 100644
index 57bb417..0000000
--- a/node_modules/graphql/language/directiveLocation.js
+++ /dev/null
@@ -1,38 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.DirectiveLocation = void 0;
-
-/**
- * The set of allowed directive location values.
- */
-var DirectiveLocation = Object.freeze({
-  // Request Definitions
-  QUERY: 'QUERY',
-  MUTATION: 'MUTATION',
-  SUBSCRIPTION: 'SUBSCRIPTION',
-  FIELD: 'FIELD',
-  FRAGMENT_DEFINITION: 'FRAGMENT_DEFINITION',
-  FRAGMENT_SPREAD: 'FRAGMENT_SPREAD',
-  INLINE_FRAGMENT: 'INLINE_FRAGMENT',
-  VARIABLE_DEFINITION: 'VARIABLE_DEFINITION',
-  // Type System Definitions
-  SCHEMA: 'SCHEMA',
-  SCALAR: 'SCALAR',
-  OBJECT: 'OBJECT',
-  FIELD_DEFINITION: 'FIELD_DEFINITION',
-  ARGUMENT_DEFINITION: 'ARGUMENT_DEFINITION',
-  INTERFACE: 'INTERFACE',
-  UNION: 'UNION',
-  ENUM: 'ENUM',
-  ENUM_VALUE: 'ENUM_VALUE',
-  INPUT_OBJECT: 'INPUT_OBJECT',
-  INPUT_FIELD_DEFINITION: 'INPUT_FIELD_DEFINITION'
-});
-/**
- * The enum type representing the directive location values.
- */
-
-exports.DirectiveLocation = DirectiveLocation;
diff --git a/node_modules/graphql/language/directiveLocation.js.flow b/node_modules/graphql/language/directiveLocation.js.flow
deleted file mode 100644
index 6529898..0000000
--- a/node_modules/graphql/language/directiveLocation.js.flow
+++ /dev/null
@@ -1,33 +0,0 @@
-// @flow strict
-
-/**
- * The set of allowed directive location values.
- */
-export const DirectiveLocation = Object.freeze({
-  // Request Definitions
-  QUERY: 'QUERY',
-  MUTATION: 'MUTATION',
-  SUBSCRIPTION: 'SUBSCRIPTION',
-  FIELD: 'FIELD',
-  FRAGMENT_DEFINITION: 'FRAGMENT_DEFINITION',
-  FRAGMENT_SPREAD: 'FRAGMENT_SPREAD',
-  INLINE_FRAGMENT: 'INLINE_FRAGMENT',
-  VARIABLE_DEFINITION: 'VARIABLE_DEFINITION',
-  // Type System Definitions
-  SCHEMA: 'SCHEMA',
-  SCALAR: 'SCALAR',
-  OBJECT: 'OBJECT',
-  FIELD_DEFINITION: 'FIELD_DEFINITION',
-  ARGUMENT_DEFINITION: 'ARGUMENT_DEFINITION',
-  INTERFACE: 'INTERFACE',
-  UNION: 'UNION',
-  ENUM: 'ENUM',
-  ENUM_VALUE: 'ENUM_VALUE',
-  INPUT_OBJECT: 'INPUT_OBJECT',
-  INPUT_FIELD_DEFINITION: 'INPUT_FIELD_DEFINITION',
-});
-
-/**
- * The enum type representing the directive location values.
- */
-export type DirectiveLocationEnum = $Values<typeof DirectiveLocation>;
diff --git a/node_modules/graphql/language/directiveLocation.mjs b/node_modules/graphql/language/directiveLocation.mjs
deleted file mode 100644
index 82823b7..0000000
--- a/node_modules/graphql/language/directiveLocation.mjs
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * The set of allowed directive location values.
- */
-export var DirectiveLocation = Object.freeze({
-  // Request Definitions
-  QUERY: 'QUERY',
-  MUTATION: 'MUTATION',
-  SUBSCRIPTION: 'SUBSCRIPTION',
-  FIELD: 'FIELD',
-  FRAGMENT_DEFINITION: 'FRAGMENT_DEFINITION',
-  FRAGMENT_SPREAD: 'FRAGMENT_SPREAD',
-  INLINE_FRAGMENT: 'INLINE_FRAGMENT',
-  VARIABLE_DEFINITION: 'VARIABLE_DEFINITION',
-  // Type System Definitions
-  SCHEMA: 'SCHEMA',
-  SCALAR: 'SCALAR',
-  OBJECT: 'OBJECT',
-  FIELD_DEFINITION: 'FIELD_DEFINITION',
-  ARGUMENT_DEFINITION: 'ARGUMENT_DEFINITION',
-  INTERFACE: 'INTERFACE',
-  UNION: 'UNION',
-  ENUM: 'ENUM',
-  ENUM_VALUE: 'ENUM_VALUE',
-  INPUT_OBJECT: 'INPUT_OBJECT',
-  INPUT_FIELD_DEFINITION: 'INPUT_FIELD_DEFINITION'
-});
-/**
- * The enum type representing the directive location values.
- */
diff --git a/node_modules/graphql/language/index.d.ts b/node_modules/graphql/language/index.d.ts
deleted file mode 100644
index ce96538..0000000
--- a/node_modules/graphql/language/index.d.ts
+++ /dev/null
@@ -1,95 +0,0 @@
-export { Source } from './source';
-export { getLocation, SourceLocation } from './location';
-
-export { printLocation, printSourceLocation } from './printLocation';
-
-export { Kind, KindEnum } from './kinds';
-export { TokenKind, TokenKindEnum } from './tokenKind';
-export { Lexer } from './lexer';
-export { parse, parseValue, parseType, ParseOptions } from './parser';
-export { print } from './printer';
-export {
-  visit,
-  visitInParallel,
-  getVisitFn,
-  BREAK,
-  ASTVisitor,
-  Visitor,
-  VisitFn,
-  VisitorKeyMap,
-} from './visitor';
-
-export {
-  Location,
-  Token,
-  ASTNode,
-  ASTKindToNode,
-  // Each kind of AST node
-  NameNode,
-  DocumentNode,
-  DefinitionNode,
-  ExecutableDefinitionNode,
-  OperationDefinitionNode,
-  OperationTypeNode,
-  VariableDefinitionNode,
-  VariableNode,
-  SelectionSetNode,
-  SelectionNode,
-  FieldNode,
-  ArgumentNode,
-  FragmentSpreadNode,
-  InlineFragmentNode,
-  FragmentDefinitionNode,
-  ValueNode,
-  IntValueNode,
-  FloatValueNode,
-  StringValueNode,
-  BooleanValueNode,
-  NullValueNode,
-  EnumValueNode,
-  ListValueNode,
-  ObjectValueNode,
-  ObjectFieldNode,
-  DirectiveNode,
-  TypeNode,
-  NamedTypeNode,
-  ListTypeNode,
-  NonNullTypeNode,
-  TypeSystemDefinitionNode,
-  SchemaDefinitionNode,
-  OperationTypeDefinitionNode,
-  TypeDefinitionNode,
-  ScalarTypeDefinitionNode,
-  ObjectTypeDefinitionNode,
-  FieldDefinitionNode,
-  InputValueDefinitionNode,
-  InterfaceTypeDefinitionNode,
-  UnionTypeDefinitionNode,
-  EnumTypeDefinitionNode,
-  EnumValueDefinitionNode,
-  InputObjectTypeDefinitionNode,
-  DirectiveDefinitionNode,
-  TypeSystemExtensionNode,
-  SchemaExtensionNode,
-  TypeExtensionNode,
-  ScalarTypeExtensionNode,
-  ObjectTypeExtensionNode,
-  InterfaceTypeExtensionNode,
-  UnionTypeExtensionNode,
-  EnumTypeExtensionNode,
-  InputObjectTypeExtensionNode,
-} from './ast';
-
-export {
-  isDefinitionNode,
-  isExecutableDefinitionNode,
-  isSelectionNode,
-  isValueNode,
-  isTypeNode,
-  isTypeSystemDefinitionNode,
-  isTypeDefinitionNode,
-  isTypeSystemExtensionNode,
-  isTypeExtensionNode,
-} from './predicates';
-
-export { DirectiveLocation, DirectiveLocationEnum } from './directiveLocation';
diff --git a/node_modules/graphql/language/index.js b/node_modules/graphql/language/index.js
deleted file mode 100644
index f577778..0000000
--- a/node_modules/graphql/language/index.js
+++ /dev/null
@@ -1,177 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "Source", {
-  enumerable: true,
-  get: function get() {
-    return _source.Source;
-  }
-});
-Object.defineProperty(exports, "getLocation", {
-  enumerable: true,
-  get: function get() {
-    return _location.getLocation;
-  }
-});
-Object.defineProperty(exports, "printLocation", {
-  enumerable: true,
-  get: function get() {
-    return _printLocation.printLocation;
-  }
-});
-Object.defineProperty(exports, "printSourceLocation", {
-  enumerable: true,
-  get: function get() {
-    return _printLocation.printSourceLocation;
-  }
-});
-Object.defineProperty(exports, "Kind", {
-  enumerable: true,
-  get: function get() {
-    return _kinds.Kind;
-  }
-});
-Object.defineProperty(exports, "TokenKind", {
-  enumerable: true,
-  get: function get() {
-    return _tokenKind.TokenKind;
-  }
-});
-Object.defineProperty(exports, "Lexer", {
-  enumerable: true,
-  get: function get() {
-    return _lexer.Lexer;
-  }
-});
-Object.defineProperty(exports, "parse", {
-  enumerable: true,
-  get: function get() {
-    return _parser.parse;
-  }
-});
-Object.defineProperty(exports, "parseValue", {
-  enumerable: true,
-  get: function get() {
-    return _parser.parseValue;
-  }
-});
-Object.defineProperty(exports, "parseType", {
-  enumerable: true,
-  get: function get() {
-    return _parser.parseType;
-  }
-});
-Object.defineProperty(exports, "print", {
-  enumerable: true,
-  get: function get() {
-    return _printer.print;
-  }
-});
-Object.defineProperty(exports, "visit", {
-  enumerable: true,
-  get: function get() {
-    return _visitor.visit;
-  }
-});
-Object.defineProperty(exports, "visitInParallel", {
-  enumerable: true,
-  get: function get() {
-    return _visitor.visitInParallel;
-  }
-});
-Object.defineProperty(exports, "getVisitFn", {
-  enumerable: true,
-  get: function get() {
-    return _visitor.getVisitFn;
-  }
-});
-Object.defineProperty(exports, "BREAK", {
-  enumerable: true,
-  get: function get() {
-    return _visitor.BREAK;
-  }
-});
-Object.defineProperty(exports, "isDefinitionNode", {
-  enumerable: true,
-  get: function get() {
-    return _predicates.isDefinitionNode;
-  }
-});
-Object.defineProperty(exports, "isExecutableDefinitionNode", {
-  enumerable: true,
-  get: function get() {
-    return _predicates.isExecutableDefinitionNode;
-  }
-});
-Object.defineProperty(exports, "isSelectionNode", {
-  enumerable: true,
-  get: function get() {
-    return _predicates.isSelectionNode;
-  }
-});
-Object.defineProperty(exports, "isValueNode", {
-  enumerable: true,
-  get: function get() {
-    return _predicates.isValueNode;
-  }
-});
-Object.defineProperty(exports, "isTypeNode", {
-  enumerable: true,
-  get: function get() {
-    return _predicates.isTypeNode;
-  }
-});
-Object.defineProperty(exports, "isTypeSystemDefinitionNode", {
-  enumerable: true,
-  get: function get() {
-    return _predicates.isTypeSystemDefinitionNode;
-  }
-});
-Object.defineProperty(exports, "isTypeDefinitionNode", {
-  enumerable: true,
-  get: function get() {
-    return _predicates.isTypeDefinitionNode;
-  }
-});
-Object.defineProperty(exports, "isTypeSystemExtensionNode", {
-  enumerable: true,
-  get: function get() {
-    return _predicates.isTypeSystemExtensionNode;
-  }
-});
-Object.defineProperty(exports, "isTypeExtensionNode", {
-  enumerable: true,
-  get: function get() {
-    return _predicates.isTypeExtensionNode;
-  }
-});
-Object.defineProperty(exports, "DirectiveLocation", {
-  enumerable: true,
-  get: function get() {
-    return _directiveLocation.DirectiveLocation;
-  }
-});
-
-var _source = require("./source");
-
-var _location = require("./location");
-
-var _printLocation = require("./printLocation");
-
-var _kinds = require("./kinds");
-
-var _tokenKind = require("./tokenKind");
-
-var _lexer = require("./lexer");
-
-var _parser = require("./parser");
-
-var _printer = require("./printer");
-
-var _visitor = require("./visitor");
-
-var _predicates = require("./predicates");
-
-var _directiveLocation = require("./directiveLocation");
diff --git a/node_modules/graphql/language/index.js.flow b/node_modules/graphql/language/index.js.flow
deleted file mode 100644
index 0ce8ff6..0000000
--- a/node_modules/graphql/language/index.js.flow
+++ /dev/null
@@ -1,100 +0,0 @@
-// @flow strict
-
-export { Source } from './source';
-
-export { getLocation } from './location';
-export type { SourceLocation } from './location';
-
-export { printLocation, printSourceLocation } from './printLocation';
-
-export { Kind } from './kinds';
-export type { KindEnum } from './kinds';
-
-export { TokenKind } from './tokenKind';
-export type { TokenKindEnum } from './tokenKind';
-
-export { Lexer } from './lexer';
-
-export { parse, parseValue, parseType } from './parser';
-export type { ParseOptions } from './parser';
-
-export { print } from './printer';
-
-export { visit, visitInParallel, getVisitFn, BREAK } from './visitor';
-export type { ASTVisitor, Visitor, VisitFn, VisitorKeyMap } from './visitor';
-
-export type {
-  Location,
-  Token,
-  ASTNode,
-  ASTKindToNode,
-  // Each kind of AST node
-  NameNode,
-  DocumentNode,
-  DefinitionNode,
-  ExecutableDefinitionNode,
-  OperationDefinitionNode,
-  OperationTypeNode,
-  VariableDefinitionNode,
-  VariableNode,
-  SelectionSetNode,
-  SelectionNode,
-  FieldNode,
-  ArgumentNode,
-  FragmentSpreadNode,
-  InlineFragmentNode,
-  FragmentDefinitionNode,
-  ValueNode,
-  IntValueNode,
-  FloatValueNode,
-  StringValueNode,
-  BooleanValueNode,
-  NullValueNode,
-  EnumValueNode,
-  ListValueNode,
-  ObjectValueNode,
-  ObjectFieldNode,
-  DirectiveNode,
-  TypeNode,
-  NamedTypeNode,
-  ListTypeNode,
-  NonNullTypeNode,
-  TypeSystemDefinitionNode,
-  SchemaDefinitionNode,
-  OperationTypeDefinitionNode,
-  TypeDefinitionNode,
-  ScalarTypeDefinitionNode,
-  ObjectTypeDefinitionNode,
-  FieldDefinitionNode,
-  InputValueDefinitionNode,
-  InterfaceTypeDefinitionNode,
-  UnionTypeDefinitionNode,
-  EnumTypeDefinitionNode,
-  EnumValueDefinitionNode,
-  InputObjectTypeDefinitionNode,
-  DirectiveDefinitionNode,
-  TypeSystemExtensionNode,
-  SchemaExtensionNode,
-  TypeExtensionNode,
-  ScalarTypeExtensionNode,
-  ObjectTypeExtensionNode,
-  InterfaceTypeExtensionNode,
-  UnionTypeExtensionNode,
-  EnumTypeExtensionNode,
-  InputObjectTypeExtensionNode,
-} from './ast';
-
-export {
-  isDefinitionNode,
-  isExecutableDefinitionNode,
-  isSelectionNode,
-  isValueNode,
-  isTypeNode,
-  isTypeSystemDefinitionNode,
-  isTypeDefinitionNode,
-  isTypeSystemExtensionNode,
-  isTypeExtensionNode,
-} from './predicates';
-
-export { DirectiveLocation } from './directiveLocation';
-export type { DirectiveLocationEnum } from './directiveLocation';
diff --git a/node_modules/graphql/language/index.mjs b/node_modules/graphql/language/index.mjs
deleted file mode 100644
index d46ef87..0000000
--- a/node_modules/graphql/language/index.mjs
+++ /dev/null
@@ -1,11 +0,0 @@
-export { Source } from "./source.mjs";
-export { getLocation } from "./location.mjs";
-export { printLocation, printSourceLocation } from "./printLocation.mjs";
-export { Kind } from "./kinds.mjs";
-export { TokenKind } from "./tokenKind.mjs";
-export { Lexer } from "./lexer.mjs";
-export { parse, parseValue, parseType } from "./parser.mjs";
-export { print } from "./printer.mjs";
-export { visit, visitInParallel, getVisitFn, BREAK } from "./visitor.mjs";
-export { isDefinitionNode, isExecutableDefinitionNode, isSelectionNode, isValueNode, isTypeNode, isTypeSystemDefinitionNode, isTypeDefinitionNode, isTypeSystemExtensionNode, isTypeExtensionNode } from "./predicates.mjs";
-export { DirectiveLocation } from "./directiveLocation.mjs";
diff --git a/node_modules/graphql/language/kinds.d.ts b/node_modules/graphql/language/kinds.d.ts
deleted file mode 100644
index e655af0..0000000
--- a/node_modules/graphql/language/kinds.d.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * The set of allowed kind values for AST nodes.
- */
-export const Kind: _Kind;
-
-/**
- * @internal
- */
-type _Kind = {
-  // Name
-  NAME: 'Name';
-
-  // Document
-  DOCUMENT: 'Document';
-  OPERATION_DEFINITION: 'OperationDefinition';
-  VARIABLE_DEFINITION: 'VariableDefinition';
-  SELECTION_SET: 'SelectionSet';
-  FIELD: 'Field';
-  ARGUMENT: 'Argument';
-
-  // Fragments
-  FRAGMENT_SPREAD: 'FragmentSpread';
-  INLINE_FRAGMENT: 'InlineFragment';
-  FRAGMENT_DEFINITION: 'FragmentDefinition';
-
-  // Values
-  VARIABLE: 'Variable';
-  INT: 'IntValue';
-  FLOAT: 'FloatValue';
-  STRING: 'StringValue';
-  BOOLEAN: 'BooleanValue';
-  NULL: 'NullValue';
-  ENUM: 'EnumValue';
-  LIST: 'ListValue';
-  OBJECT: 'ObjectValue';
-  OBJECT_FIELD: 'ObjectField';
-
-  // Directives
-  DIRECTIVE: 'Directive';
-
-  // Types
-  NAMED_TYPE: 'NamedType';
-  LIST_TYPE: 'ListType';
-  NON_NULL_TYPE: 'NonNullType';
-
-  // Type System Definitions
-  SCHEMA_DEFINITION: 'SchemaDefinition';
-  OPERATION_TYPE_DEFINITION: 'OperationTypeDefinition';
-
-  // Type Definitions
-  SCALAR_TYPE_DEFINITION: 'ScalarTypeDefinition';
-  OBJECT_TYPE_DEFINITION: 'ObjectTypeDefinition';
-  FIELD_DEFINITION: 'FieldDefinition';
-  INPUT_VALUE_DEFINITION: 'InputValueDefinition';
-  INTERFACE_TYPE_DEFINITION: 'InterfaceTypeDefinition';
-  UNION_TYPE_DEFINITION: 'UnionTypeDefinition';
-  ENUM_TYPE_DEFINITION: 'EnumTypeDefinition';
-  ENUM_VALUE_DEFINITION: 'EnumValueDefinition';
-  INPUT_OBJECT_TYPE_DEFINITION: 'InputObjectTypeDefinition';
-
-  // Directive Definitions
-  DIRECTIVE_DEFINITION: 'DirectiveDefinition';
-
-  // Type System Extensions
-  SCHEMA_EXTENSION: 'SchemaExtension';
-
-  // Type Extensions
-  SCALAR_TYPE_EXTENSION: 'ScalarTypeExtension';
-  OBJECT_TYPE_EXTENSION: 'ObjectTypeExtension';
-  INTERFACE_TYPE_EXTENSION: 'InterfaceTypeExtension';
-  UNION_TYPE_EXTENSION: 'UnionTypeExtension';
-  ENUM_TYPE_EXTENSION: 'EnumTypeExtension';
-  INPUT_OBJECT_TYPE_EXTENSION: 'InputObjectTypeExtension';
-};
-
-/**
- * The enum type representing the possible kind values of AST nodes.
- */
-export type KindEnum = _Kind[keyof _Kind];
diff --git a/node_modules/graphql/language/kinds.js b/node_modules/graphql/language/kinds.js
deleted file mode 100644
index 32b90c4..0000000
--- a/node_modules/graphql/language/kinds.js
+++ /dev/null
@@ -1,71 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.Kind = void 0;
-
-/**
- * The set of allowed kind values for AST nodes.
- */
-var Kind = Object.freeze({
-  // Name
-  NAME: 'Name',
-  // Document
-  DOCUMENT: 'Document',
-  OPERATION_DEFINITION: 'OperationDefinition',
-  VARIABLE_DEFINITION: 'VariableDefinition',
-  SELECTION_SET: 'SelectionSet',
-  FIELD: 'Field',
-  ARGUMENT: 'Argument',
-  // Fragments
-  FRAGMENT_SPREAD: 'FragmentSpread',
-  INLINE_FRAGMENT: 'InlineFragment',
-  FRAGMENT_DEFINITION: 'FragmentDefinition',
-  // Values
-  VARIABLE: 'Variable',
-  INT: 'IntValue',
-  FLOAT: 'FloatValue',
-  STRING: 'StringValue',
-  BOOLEAN: 'BooleanValue',
-  NULL: 'NullValue',
-  ENUM: 'EnumValue',
-  LIST: 'ListValue',
-  OBJECT: 'ObjectValue',
-  OBJECT_FIELD: 'ObjectField',
-  // Directives
-  DIRECTIVE: 'Directive',
-  // Types
-  NAMED_TYPE: 'NamedType',
-  LIST_TYPE: 'ListType',
-  NON_NULL_TYPE: 'NonNullType',
-  // Type System Definitions
-  SCHEMA_DEFINITION: 'SchemaDefinition',
-  OPERATION_TYPE_DEFINITION: 'OperationTypeDefinition',
-  // Type Definitions
-  SCALAR_TYPE_DEFINITION: 'ScalarTypeDefinition',
-  OBJECT_TYPE_DEFINITION: 'ObjectTypeDefinition',
-  FIELD_DEFINITION: 'FieldDefinition',
-  INPUT_VALUE_DEFINITION: 'InputValueDefinition',
-  INTERFACE_TYPE_DEFINITION: 'InterfaceTypeDefinition',
-  UNION_TYPE_DEFINITION: 'UnionTypeDefinition',
-  ENUM_TYPE_DEFINITION: 'EnumTypeDefinition',
-  ENUM_VALUE_DEFINITION: 'EnumValueDefinition',
-  INPUT_OBJECT_TYPE_DEFINITION: 'InputObjectTypeDefinition',
-  // Directive Definitions
-  DIRECTIVE_DEFINITION: 'DirectiveDefinition',
-  // Type System Extensions
-  SCHEMA_EXTENSION: 'SchemaExtension',
-  // Type Extensions
-  SCALAR_TYPE_EXTENSION: 'ScalarTypeExtension',
-  OBJECT_TYPE_EXTENSION: 'ObjectTypeExtension',
-  INTERFACE_TYPE_EXTENSION: 'InterfaceTypeExtension',
-  UNION_TYPE_EXTENSION: 'UnionTypeExtension',
-  ENUM_TYPE_EXTENSION: 'EnumTypeExtension',
-  INPUT_OBJECT_TYPE_EXTENSION: 'InputObjectTypeExtension'
-});
-/**
- * The enum type representing the possible kind values of AST nodes.
- */
-
-exports.Kind = Kind;
diff --git a/node_modules/graphql/language/kinds.js.flow b/node_modules/graphql/language/kinds.js.flow
deleted file mode 100644
index d3292b2..0000000
--- a/node_modules/graphql/language/kinds.js.flow
+++ /dev/null
@@ -1,76 +0,0 @@
-// @flow strict
-
-/**
- * The set of allowed kind values for AST nodes.
- */
-export const Kind = Object.freeze({
-  // Name
-  NAME: 'Name',
-
-  // Document
-  DOCUMENT: 'Document',
-  OPERATION_DEFINITION: 'OperationDefinition',
-  VARIABLE_DEFINITION: 'VariableDefinition',
-  SELECTION_SET: 'SelectionSet',
-  FIELD: 'Field',
-  ARGUMENT: 'Argument',
-
-  // Fragments
-  FRAGMENT_SPREAD: 'FragmentSpread',
-  INLINE_FRAGMENT: 'InlineFragment',
-  FRAGMENT_DEFINITION: 'FragmentDefinition',
-
-  // Values
-  VARIABLE: 'Variable',
-  INT: 'IntValue',
-  FLOAT: 'FloatValue',
-  STRING: 'StringValue',
-  BOOLEAN: 'BooleanValue',
-  NULL: 'NullValue',
-  ENUM: 'EnumValue',
-  LIST: 'ListValue',
-  OBJECT: 'ObjectValue',
-  OBJECT_FIELD: 'ObjectField',
-
-  // Directives
-  DIRECTIVE: 'Directive',
-
-  // Types
-  NAMED_TYPE: 'NamedType',
-  LIST_TYPE: 'ListType',
-  NON_NULL_TYPE: 'NonNullType',
-
-  // Type System Definitions
-  SCHEMA_DEFINITION: 'SchemaDefinition',
-  OPERATION_TYPE_DEFINITION: 'OperationTypeDefinition',
-
-  // Type Definitions
-  SCALAR_TYPE_DEFINITION: 'ScalarTypeDefinition',
-  OBJECT_TYPE_DEFINITION: 'ObjectTypeDefinition',
-  FIELD_DEFINITION: 'FieldDefinition',
-  INPUT_VALUE_DEFINITION: 'InputValueDefinition',
-  INTERFACE_TYPE_DEFINITION: 'InterfaceTypeDefinition',
-  UNION_TYPE_DEFINITION: 'UnionTypeDefinition',
-  ENUM_TYPE_DEFINITION: 'EnumTypeDefinition',
-  ENUM_VALUE_DEFINITION: 'EnumValueDefinition',
-  INPUT_OBJECT_TYPE_DEFINITION: 'InputObjectTypeDefinition',
-
-  // Directive Definitions
-  DIRECTIVE_DEFINITION: 'DirectiveDefinition',
-
-  // Type System Extensions
-  SCHEMA_EXTENSION: 'SchemaExtension',
-
-  // Type Extensions
-  SCALAR_TYPE_EXTENSION: 'ScalarTypeExtension',
-  OBJECT_TYPE_EXTENSION: 'ObjectTypeExtension',
-  INTERFACE_TYPE_EXTENSION: 'InterfaceTypeExtension',
-  UNION_TYPE_EXTENSION: 'UnionTypeExtension',
-  ENUM_TYPE_EXTENSION: 'EnumTypeExtension',
-  INPUT_OBJECT_TYPE_EXTENSION: 'InputObjectTypeExtension',
-});
-
-/**
- * The enum type representing the possible kind values of AST nodes.
- */
-export type KindEnum = $Values<typeof Kind>;
diff --git a/node_modules/graphql/language/kinds.mjs b/node_modules/graphql/language/kinds.mjs
deleted file mode 100644
index b439c71..0000000
--- a/node_modules/graphql/language/kinds.mjs
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * The set of allowed kind values for AST nodes.
- */
-export var Kind = Object.freeze({
-  // Name
-  NAME: 'Name',
-  // Document
-  DOCUMENT: 'Document',
-  OPERATION_DEFINITION: 'OperationDefinition',
-  VARIABLE_DEFINITION: 'VariableDefinition',
-  SELECTION_SET: 'SelectionSet',
-  FIELD: 'Field',
-  ARGUMENT: 'Argument',
-  // Fragments
-  FRAGMENT_SPREAD: 'FragmentSpread',
-  INLINE_FRAGMENT: 'InlineFragment',
-  FRAGMENT_DEFINITION: 'FragmentDefinition',
-  // Values
-  VARIABLE: 'Variable',
-  INT: 'IntValue',
-  FLOAT: 'FloatValue',
-  STRING: 'StringValue',
-  BOOLEAN: 'BooleanValue',
-  NULL: 'NullValue',
-  ENUM: 'EnumValue',
-  LIST: 'ListValue',
-  OBJECT: 'ObjectValue',
-  OBJECT_FIELD: 'ObjectField',
-  // Directives
-  DIRECTIVE: 'Directive',
-  // Types
-  NAMED_TYPE: 'NamedType',
-  LIST_TYPE: 'ListType',
-  NON_NULL_TYPE: 'NonNullType',
-  // Type System Definitions
-  SCHEMA_DEFINITION: 'SchemaDefinition',
-  OPERATION_TYPE_DEFINITION: 'OperationTypeDefinition',
-  // Type Definitions
-  SCALAR_TYPE_DEFINITION: 'ScalarTypeDefinition',
-  OBJECT_TYPE_DEFINITION: 'ObjectTypeDefinition',
-  FIELD_DEFINITION: 'FieldDefinition',
-  INPUT_VALUE_DEFINITION: 'InputValueDefinition',
-  INTERFACE_TYPE_DEFINITION: 'InterfaceTypeDefinition',
-  UNION_TYPE_DEFINITION: 'UnionTypeDefinition',
-  ENUM_TYPE_DEFINITION: 'EnumTypeDefinition',
-  ENUM_VALUE_DEFINITION: 'EnumValueDefinition',
-  INPUT_OBJECT_TYPE_DEFINITION: 'InputObjectTypeDefinition',
-  // Directive Definitions
-  DIRECTIVE_DEFINITION: 'DirectiveDefinition',
-  // Type System Extensions
-  SCHEMA_EXTENSION: 'SchemaExtension',
-  // Type Extensions
-  SCALAR_TYPE_EXTENSION: 'ScalarTypeExtension',
-  OBJECT_TYPE_EXTENSION: 'ObjectTypeExtension',
-  INTERFACE_TYPE_EXTENSION: 'InterfaceTypeExtension',
-  UNION_TYPE_EXTENSION: 'UnionTypeExtension',
-  ENUM_TYPE_EXTENSION: 'EnumTypeExtension',
-  INPUT_OBJECT_TYPE_EXTENSION: 'InputObjectTypeExtension'
-});
-/**
- * The enum type representing the possible kind values of AST nodes.
- */
diff --git a/node_modules/graphql/language/lexer.d.ts b/node_modules/graphql/language/lexer.d.ts
deleted file mode 100644
index 92484b6..0000000
--- a/node_modules/graphql/language/lexer.d.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { Token } from './ast';
-import { Source } from './source';
-
-/**
- * Given a Source object, this returns a Lexer for that source.
- * A Lexer is a stateful stream generator in that every time
- * it is advanced, it returns the next token in the Source. Assuming the
- * source lexes, the final Token emitted by the lexer will be of kind
- * EOF, after which the lexer will repeatedly return the same EOF token
- * whenever called.
- */
-export class Lexer {
-  source: Source;
-
-  /**
-   * The previously focused non-ignored token.
-   */
-  lastToken: Token;
-
-  /**
-   * The currently focused non-ignored token.
-   */
-  token: Token;
-
-  /**
-   * The (1-indexed) line containing the current token.
-   */
-  line: number;
-
-  /**
-   * The character offset at which the current line begins.
-   */
-  lineStart: number;
-
-  constructor(source: Source);
-
-  /**
-   * Advances the token stream to the next non-ignored token.
-   */
-  advance(): Token;
-
-  /**
-   * Looks ahead and returns the next non-ignored token, but does not change
-   * the state of Lexer.
-   */
-  lookahead(): Token;
-}
-
-/**
- * @internal
- */
-export function isPunctuatorToken(token: Token): boolean;
diff --git a/node_modules/graphql/language/lexer.js b/node_modules/graphql/language/lexer.js
deleted file mode 100644
index 02e6277..0000000
--- a/node_modules/graphql/language/lexer.js
+++ /dev/null
@@ -1,633 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.isPunctuatorTokenKind = isPunctuatorTokenKind;
-exports.Lexer = void 0;
-
-var _syntaxError = require("../error/syntaxError");
-
-var _ast = require("./ast");
-
-var _blockString = require("./blockString");
-
-var _tokenKind = require("./tokenKind");
-
-/**
- * Given a Source object, creates a Lexer for that source.
- * A Lexer is a stateful stream generator in that every time
- * it is advanced, it returns the next token in the Source. Assuming the
- * source lexes, the final Token emitted by the lexer will be of kind
- * EOF, after which the lexer will repeatedly return the same EOF token
- * whenever called.
- */
-var Lexer =
-/*#__PURE__*/
-function () {
-  /**
-   * The previously focused non-ignored token.
-   */
-
-  /**
-   * The currently focused non-ignored token.
-   */
-
-  /**
-   * The (1-indexed) line containing the current token.
-   */
-
-  /**
-   * The character offset at which the current line begins.
-   */
-  function Lexer(source) {
-    var startOfFileToken = new _ast.Token(_tokenKind.TokenKind.SOF, 0, 0, 0, 0, null);
-    this.source = source;
-    this.lastToken = startOfFileToken;
-    this.token = startOfFileToken;
-    this.line = 1;
-    this.lineStart = 0;
-  }
-  /**
-   * Advances the token stream to the next non-ignored token.
-   */
-
-
-  var _proto = Lexer.prototype;
-
-  _proto.advance = function advance() {
-    this.lastToken = this.token;
-    var token = this.token = this.lookahead();
-    return token;
-  }
-  /**
-   * Looks ahead and returns the next non-ignored token, but does not change
-   * the state of Lexer.
-   */
-  ;
-
-  _proto.lookahead = function lookahead() {
-    var token = this.token;
-
-    if (token.kind !== _tokenKind.TokenKind.EOF) {
-      do {
-        var _token$next;
-
-        // Note: next is only mutable during parsing, so we cast to allow this.
-        token = (_token$next = token.next) !== null && _token$next !== void 0 ? _token$next : token.next = readToken(this, token);
-      } while (token.kind === _tokenKind.TokenKind.COMMENT);
-    }
-
-    return token;
-  };
-
-  return Lexer;
-}();
-/**
- * @internal
- */
-
-
-exports.Lexer = Lexer;
-
-function isPunctuatorTokenKind(kind) {
-  return kind === _tokenKind.TokenKind.BANG || kind === _tokenKind.TokenKind.DOLLAR || kind === _tokenKind.TokenKind.AMP || kind === _tokenKind.TokenKind.PAREN_L || kind === _tokenKind.TokenKind.PAREN_R || kind === _tokenKind.TokenKind.SPREAD || kind === _tokenKind.TokenKind.COLON || kind === _tokenKind.TokenKind.EQUALS || kind === _tokenKind.TokenKind.AT || kind === _tokenKind.TokenKind.BRACKET_L || kind === _tokenKind.TokenKind.BRACKET_R || kind === _tokenKind.TokenKind.BRACE_L || kind === _tokenKind.TokenKind.PIPE || kind === _tokenKind.TokenKind.BRACE_R;
-}
-
-function printCharCode(code) {
-  return (// NaN/undefined represents access beyond the end of the file.
-    isNaN(code) ? _tokenKind.TokenKind.EOF : // Trust JSON for ASCII.
-    code < 0x007f ? JSON.stringify(String.fromCharCode(code)) : // Otherwise print the escaped form.
-    "\"\\u".concat(('00' + code.toString(16).toUpperCase()).slice(-4), "\"")
-  );
-}
-/**
- * Gets the next token from the source starting at the given position.
- *
- * This skips over whitespace until it finds the next lexable token, then lexes
- * punctuators immediately or calls the appropriate helper function for more
- * complicated tokens.
- */
-
-
-function readToken(lexer, prev) {
-  var source = lexer.source;
-  var body = source.body;
-  var bodyLength = body.length;
-  var pos = positionAfterWhitespace(body, prev.end, lexer);
-  var line = lexer.line;
-  var col = 1 + pos - lexer.lineStart;
-
-  if (pos >= bodyLength) {
-    return new _ast.Token(_tokenKind.TokenKind.EOF, bodyLength, bodyLength, line, col, prev);
-  }
-
-  var code = body.charCodeAt(pos); // SourceCharacter
-
-  switch (code) {
-    // !
-    case 33:
-      return new _ast.Token(_tokenKind.TokenKind.BANG, pos, pos + 1, line, col, prev);
-    // #
-
-    case 35:
-      return readComment(source, pos, line, col, prev);
-    // $
-
-    case 36:
-      return new _ast.Token(_tokenKind.TokenKind.DOLLAR, pos, pos + 1, line, col, prev);
-    // &
-
-    case 38:
-      return new _ast.Token(_tokenKind.TokenKind.AMP, pos, pos + 1, line, col, prev);
-    // (
-
-    case 40:
-      return new _ast.Token(_tokenKind.TokenKind.PAREN_L, pos, pos + 1, line, col, prev);
-    // )
-
-    case 41:
-      return new _ast.Token(_tokenKind.TokenKind.PAREN_R, pos, pos + 1, line, col, prev);
-    // .
-
-    case 46:
-      if (body.charCodeAt(pos + 1) === 46 && body.charCodeAt(pos + 2) === 46) {
-        return new _ast.Token(_tokenKind.TokenKind.SPREAD, pos, pos + 3, line, col, prev);
-      }
-
-      break;
-    // :
-
-    case 58:
-      return new _ast.Token(_tokenKind.TokenKind.COLON, pos, pos + 1, line, col, prev);
-    // =
-
-    case 61:
-      return new _ast.Token(_tokenKind.TokenKind.EQUALS, pos, pos + 1, line, col, prev);
-    // @
-
-    case 64:
-      return new _ast.Token(_tokenKind.TokenKind.AT, pos, pos + 1, line, col, prev);
-    // [
-
-    case 91:
-      return new _ast.Token(_tokenKind.TokenKind.BRACKET_L, pos, pos + 1, line, col, prev);
-    // ]
-
-    case 93:
-      return new _ast.Token(_tokenKind.TokenKind.BRACKET_R, pos, pos + 1, line, col, prev);
-    // {
-
-    case 123:
-      return new _ast.Token(_tokenKind.TokenKind.BRACE_L, pos, pos + 1, line, col, prev);
-    // |
-
-    case 124:
-      return new _ast.Token(_tokenKind.TokenKind.PIPE, pos, pos + 1, line, col, prev);
-    // }
-
-    case 125:
-      return new _ast.Token(_tokenKind.TokenKind.BRACE_R, pos, pos + 1, line, col, prev);
-    // A-Z _ a-z
-
-    case 65:
-    case 66:
-    case 67:
-    case 68:
-    case 69:
-    case 70:
-    case 71:
-    case 72:
-    case 73:
-    case 74:
-    case 75:
-    case 76:
-    case 77:
-    case 78:
-    case 79:
-    case 80:
-    case 81:
-    case 82:
-    case 83:
-    case 84:
-    case 85:
-    case 86:
-    case 87:
-    case 88:
-    case 89:
-    case 90:
-    case 95:
-    case 97:
-    case 98:
-    case 99:
-    case 100:
-    case 101:
-    case 102:
-    case 103:
-    case 104:
-    case 105:
-    case 106:
-    case 107:
-    case 108:
-    case 109:
-    case 110:
-    case 111:
-    case 112:
-    case 113:
-    case 114:
-    case 115:
-    case 116:
-    case 117:
-    case 118:
-    case 119:
-    case 120:
-    case 121:
-    case 122:
-      return readName(source, pos, line, col, prev);
-    // - 0-9
-
-    case 45:
-    case 48:
-    case 49:
-    case 50:
-    case 51:
-    case 52:
-    case 53:
-    case 54:
-    case 55:
-    case 56:
-    case 57:
-      return readNumber(source, pos, code, line, col, prev);
-    // "
-
-    case 34:
-      if (body.charCodeAt(pos + 1) === 34 && body.charCodeAt(pos + 2) === 34) {
-        return readBlockString(source, pos, line, col, prev, lexer);
-      }
-
-      return readString(source, pos, line, col, prev);
-  }
-
-  throw (0, _syntaxError.syntaxError)(source, pos, unexpectedCharacterMessage(code));
-}
-/**
- * Report a message that an unexpected character was encountered.
- */
-
-
-function unexpectedCharacterMessage(code) {
-  if (code < 0x0020 && code !== 0x0009 && code !== 0x000a && code !== 0x000d) {
-    return "Cannot contain the invalid character ".concat(printCharCode(code), ".");
-  }
-
-  if (code === 39) {
-    // '
-    return 'Unexpected single quote character (\'), did you mean to use a double quote (")?';
-  }
-
-  return "Cannot parse the unexpected character ".concat(printCharCode(code), ".");
-}
-/**
- * Reads from body starting at startPosition until it finds a non-whitespace
- * character, then returns the position of that character for lexing.
- */
-
-
-function positionAfterWhitespace(body, startPosition, lexer) {
-  var bodyLength = body.length;
-  var position = startPosition;
-
-  while (position < bodyLength) {
-    var code = body.charCodeAt(position); // tab | space | comma | BOM
-
-    if (code === 9 || code === 32 || code === 44 || code === 0xfeff) {
-      ++position;
-    } else if (code === 10) {
-      // new line
-      ++position;
-      ++lexer.line;
-      lexer.lineStart = position;
-    } else if (code === 13) {
-      // carriage return
-      if (body.charCodeAt(position + 1) === 10) {
-        position += 2;
-      } else {
-        ++position;
-      }
-
-      ++lexer.line;
-      lexer.lineStart = position;
-    } else {
-      break;
-    }
-  }
-
-  return position;
-}
-/**
- * Reads a comment token from the source file.
- *
- * #[\u0009\u0020-\uFFFF]*
- */
-
-
-function readComment(source, start, line, col, prev) {
-  var body = source.body;
-  var code;
-  var position = start;
-
-  do {
-    code = body.charCodeAt(++position);
-  } while (!isNaN(code) && ( // SourceCharacter but not LineTerminator
-  code > 0x001f || code === 0x0009));
-
-  return new _ast.Token(_tokenKind.TokenKind.COMMENT, start, position, line, col, prev, body.slice(start + 1, position));
-}
-/**
- * Reads a number token from the source file, either a float
- * or an int depending on whether a decimal point appears.
- *
- * Int:   -?(0|[1-9][0-9]*)
- * Float: -?(0|[1-9][0-9]*)(\.[0-9]+)?((E|e)(+|-)?[0-9]+)?
- */
-
-
-function readNumber(source, start, firstCode, line, col, prev) {
-  var body = source.body;
-  var code = firstCode;
-  var position = start;
-  var isFloat = false;
-
-  if (code === 45) {
-    // -
-    code = body.charCodeAt(++position);
-  }
-
-  if (code === 48) {
-    // 0
-    code = body.charCodeAt(++position);
-
-    if (code >= 48 && code <= 57) {
-      throw (0, _syntaxError.syntaxError)(source, position, "Invalid number, unexpected digit after 0: ".concat(printCharCode(code), "."));
-    }
-  } else {
-    position = readDigits(source, position, code);
-    code = body.charCodeAt(position);
-  }
-
-  if (code === 46) {
-    // .
-    isFloat = true;
-    code = body.charCodeAt(++position);
-    position = readDigits(source, position, code);
-    code = body.charCodeAt(position);
-  }
-
-  if (code === 69 || code === 101) {
-    // E e
-    isFloat = true;
-    code = body.charCodeAt(++position);
-
-    if (code === 43 || code === 45) {
-      // + -
-      code = body.charCodeAt(++position);
-    }
-
-    position = readDigits(source, position, code);
-    code = body.charCodeAt(position);
-  } // Numbers cannot be followed by . or NameStart
-
-
-  if (code === 46 || isNameStart(code)) {
-    throw (0, _syntaxError.syntaxError)(source, position, "Invalid number, expected digit but got: ".concat(printCharCode(code), "."));
-  }
-
-  return new _ast.Token(isFloat ? _tokenKind.TokenKind.FLOAT : _tokenKind.TokenKind.INT, start, position, line, col, prev, body.slice(start, position));
-}
-/**
- * Returns the new position in the source after reading digits.
- */
-
-
-function readDigits(source, start, firstCode) {
-  var body = source.body;
-  var position = start;
-  var code = firstCode;
-
-  if (code >= 48 && code <= 57) {
-    // 0 - 9
-    do {
-      code = body.charCodeAt(++position);
-    } while (code >= 48 && code <= 57); // 0 - 9
-
-
-    return position;
-  }
-
-  throw (0, _syntaxError.syntaxError)(source, position, "Invalid number, expected digit but got: ".concat(printCharCode(code), "."));
-}
-/**
- * Reads a string token from the source file.
- *
- * "([^"\\\u000A\u000D]|(\\(u[0-9a-fA-F]{4}|["\\/bfnrt])))*"
- */
-
-
-function readString(source, start, line, col, prev) {
-  var body = source.body;
-  var position = start + 1;
-  var chunkStart = position;
-  var code = 0;
-  var value = '';
-
-  while (position < body.length && !isNaN(code = body.charCodeAt(position)) && // not LineTerminator
-  code !== 0x000a && code !== 0x000d) {
-    // Closing Quote (")
-    if (code === 34) {
-      value += body.slice(chunkStart, position);
-      return new _ast.Token(_tokenKind.TokenKind.STRING, start, position + 1, line, col, prev, value);
-    } // SourceCharacter
-
-
-    if (code < 0x0020 && code !== 0x0009) {
-      throw (0, _syntaxError.syntaxError)(source, position, "Invalid character within String: ".concat(printCharCode(code), "."));
-    }
-
-    ++position;
-
-    if (code === 92) {
-      // \
-      value += body.slice(chunkStart, position - 1);
-      code = body.charCodeAt(position);
-
-      switch (code) {
-        case 34:
-          value += '"';
-          break;
-
-        case 47:
-          value += '/';
-          break;
-
-        case 92:
-          value += '\\';
-          break;
-
-        case 98:
-          value += '\b';
-          break;
-
-        case 102:
-          value += '\f';
-          break;
-
-        case 110:
-          value += '\n';
-          break;
-
-        case 114:
-          value += '\r';
-          break;
-
-        case 116:
-          value += '\t';
-          break;
-
-        case 117:
-          {
-            // uXXXX
-            var charCode = uniCharCode(body.charCodeAt(position + 1), body.charCodeAt(position + 2), body.charCodeAt(position + 3), body.charCodeAt(position + 4));
-
-            if (charCode < 0) {
-              var invalidSequence = body.slice(position + 1, position + 5);
-              throw (0, _syntaxError.syntaxError)(source, position, "Invalid character escape sequence: \\u".concat(invalidSequence, "."));
-            }
-
-            value += String.fromCharCode(charCode);
-            position += 4;
-            break;
-          }
-
-        default:
-          throw (0, _syntaxError.syntaxError)(source, position, "Invalid character escape sequence: \\".concat(String.fromCharCode(code), "."));
-      }
-
-      ++position;
-      chunkStart = position;
-    }
-  }
-
-  throw (0, _syntaxError.syntaxError)(source, position, 'Unterminated string.');
-}
-/**
- * Reads a block string token from the source file.
- *
- * """("?"?(\\"""|\\(?!=""")|[^"\\]))*"""
- */
-
-
-function readBlockString(source, start, line, col, prev, lexer) {
-  var body = source.body;
-  var position = start + 3;
-  var chunkStart = position;
-  var code = 0;
-  var rawValue = '';
-
-  while (position < body.length && !isNaN(code = body.charCodeAt(position))) {
-    // Closing Triple-Quote (""")
-    if (code === 34 && body.charCodeAt(position + 1) === 34 && body.charCodeAt(position + 2) === 34) {
-      rawValue += body.slice(chunkStart, position);
-      return new _ast.Token(_tokenKind.TokenKind.BLOCK_STRING, start, position + 3, line, col, prev, (0, _blockString.dedentBlockStringValue)(rawValue));
-    } // SourceCharacter
-
-
-    if (code < 0x0020 && code !== 0x0009 && code !== 0x000a && code !== 0x000d) {
-      throw (0, _syntaxError.syntaxError)(source, position, "Invalid character within String: ".concat(printCharCode(code), "."));
-    }
-
-    if (code === 10) {
-      // new line
-      ++position;
-      ++lexer.line;
-      lexer.lineStart = position;
-    } else if (code === 13) {
-      // carriage return
-      if (body.charCodeAt(position + 1) === 10) {
-        position += 2;
-      } else {
-        ++position;
-      }
-
-      ++lexer.line;
-      lexer.lineStart = position;
-    } else if ( // Escape Triple-Quote (\""")
-    code === 92 && body.charCodeAt(position + 1) === 34 && body.charCodeAt(position + 2) === 34 && body.charCodeAt(position + 3) === 34) {
-      rawValue += body.slice(chunkStart, position) + '"""';
-      position += 4;
-      chunkStart = position;
-    } else {
-      ++position;
-    }
-  }
-
-  throw (0, _syntaxError.syntaxError)(source, position, 'Unterminated string.');
-}
-/**
- * Converts four hexadecimal chars to the integer that the
- * string represents. For example, uniCharCode('0','0','0','f')
- * will return 15, and uniCharCode('0','0','f','f') returns 255.
- *
- * Returns a negative number on error, if a char was invalid.
- *
- * This is implemented by noting that char2hex() returns -1 on error,
- * which means the result of ORing the char2hex() will also be negative.
- */
-
-
-function uniCharCode(a, b, c, d) {
-  return char2hex(a) << 12 | char2hex(b) << 8 | char2hex(c) << 4 | char2hex(d);
-}
-/**
- * Converts a hex character to its integer value.
- * '0' becomes 0, '9' becomes 9
- * 'A' becomes 10, 'F' becomes 15
- * 'a' becomes 10, 'f' becomes 15
- *
- * Returns -1 on error.
- */
-
-
-function char2hex(a) {
-  return a >= 48 && a <= 57 ? a - 48 // 0-9
-  : a >= 65 && a <= 70 ? a - 55 // A-F
-  : a >= 97 && a <= 102 ? a - 87 // a-f
-  : -1;
-}
-/**
- * Reads an alphanumeric + underscore name from the source.
- *
- * [_A-Za-z][_0-9A-Za-z]*
- */
-
-
-function readName(source, start, line, col, prev) {
-  var body = source.body;
-  var bodyLength = body.length;
-  var position = start + 1;
-  var code = 0;
-
-  while (position !== bodyLength && !isNaN(code = body.charCodeAt(position)) && (code === 95 || // _
-  code >= 48 && code <= 57 || // 0-9
-  code >= 65 && code <= 90 || // A-Z
-  code >= 97 && code <= 122) // a-z
-  ) {
-    ++position;
-  }
-
-  return new _ast.Token(_tokenKind.TokenKind.NAME, start, position, line, col, prev, body.slice(start, position));
-} // _ A-Z a-z
-
-
-function isNameStart(code) {
-  return code === 95 || code >= 65 && code <= 90 || code >= 97 && code <= 122;
-}
diff --git a/node_modules/graphql/language/lexer.js.flow b/node_modules/graphql/language/lexer.js.flow
deleted file mode 100644
index b6ab501..0000000
--- a/node_modules/graphql/language/lexer.js.flow
+++ /dev/null
@@ -1,696 +0,0 @@
-// @flow strict
-
-import { syntaxError } from '../error/syntaxError';
-
-import { Token } from './ast';
-import { type Source } from './source';
-import { dedentBlockStringValue } from './blockString';
-import { type TokenKindEnum, TokenKind } from './tokenKind';
-
-/**
- * Given a Source object, creates a Lexer for that source.
- * A Lexer is a stateful stream generator in that every time
- * it is advanced, it returns the next token in the Source. Assuming the
- * source lexes, the final Token emitted by the lexer will be of kind
- * EOF, after which the lexer will repeatedly return the same EOF token
- * whenever called.
- */
-export class Lexer {
-  source: Source;
-
-  /**
-   * The previously focused non-ignored token.
-   */
-  lastToken: Token;
-
-  /**
-   * The currently focused non-ignored token.
-   */
-  token: Token;
-
-  /**
-   * The (1-indexed) line containing the current token.
-   */
-  line: number;
-
-  /**
-   * The character offset at which the current line begins.
-   */
-  lineStart: number;
-
-  constructor(source: Source) {
-    const startOfFileToken = new Token(TokenKind.SOF, 0, 0, 0, 0, null);
-
-    this.source = source;
-    this.lastToken = startOfFileToken;
-    this.token = startOfFileToken;
-    this.line = 1;
-    this.lineStart = 0;
-  }
-
-  /**
-   * Advances the token stream to the next non-ignored token.
-   */
-  advance(): Token {
-    this.lastToken = this.token;
-    const token = (this.token = this.lookahead());
-    return token;
-  }
-
-  /**
-   * Looks ahead and returns the next non-ignored token, but does not change
-   * the state of Lexer.
-   */
-  lookahead(): Token {
-    let token = this.token;
-    if (token.kind !== TokenKind.EOF) {
-      do {
-        // Note: next is only mutable during parsing, so we cast to allow this.
-        token = token.next ?? ((token: any).next = readToken(this, token));
-      } while (token.kind === TokenKind.COMMENT);
-    }
-    return token;
-  }
-}
-
-/**
- * @internal
- */
-export function isPunctuatorTokenKind(kind: TokenKindEnum): boolean %checks {
-  return (
-    kind === TokenKind.BANG ||
-    kind === TokenKind.DOLLAR ||
-    kind === TokenKind.AMP ||
-    kind === TokenKind.PAREN_L ||
-    kind === TokenKind.PAREN_R ||
-    kind === TokenKind.SPREAD ||
-    kind === TokenKind.COLON ||
-    kind === TokenKind.EQUALS ||
-    kind === TokenKind.AT ||
-    kind === TokenKind.BRACKET_L ||
-    kind === TokenKind.BRACKET_R ||
-    kind === TokenKind.BRACE_L ||
-    kind === TokenKind.PIPE ||
-    kind === TokenKind.BRACE_R
-  );
-}
-
-function printCharCode(code) {
-  return (
-    // NaN/undefined represents access beyond the end of the file.
-    isNaN(code)
-      ? TokenKind.EOF
-      : // Trust JSON for ASCII.
-      code < 0x007f
-      ? JSON.stringify(String.fromCharCode(code))
-      : // Otherwise print the escaped form.
-        `"\\u${('00' + code.toString(16).toUpperCase()).slice(-4)}"`
-  );
-}
-
-/**
- * Gets the next token from the source starting at the given position.
- *
- * This skips over whitespace until it finds the next lexable token, then lexes
- * punctuators immediately or calls the appropriate helper function for more
- * complicated tokens.
- */
-function readToken(lexer: Lexer, prev: Token): Token {
-  const source = lexer.source;
-  const body = source.body;
-  const bodyLength = body.length;
-
-  const pos = positionAfterWhitespace(body, prev.end, lexer);
-  const line = lexer.line;
-  const col = 1 + pos - lexer.lineStart;
-
-  if (pos >= bodyLength) {
-    return new Token(TokenKind.EOF, bodyLength, bodyLength, line, col, prev);
-  }
-
-  const code = body.charCodeAt(pos);
-
-  // SourceCharacter
-  switch (code) {
-    // !
-    case 33:
-      return new Token(TokenKind.BANG, pos, pos + 1, line, col, prev);
-    // #
-    case 35:
-      return readComment(source, pos, line, col, prev);
-    // $
-    case 36:
-      return new Token(TokenKind.DOLLAR, pos, pos + 1, line, col, prev);
-    // &
-    case 38:
-      return new Token(TokenKind.AMP, pos, pos + 1, line, col, prev);
-    // (
-    case 40:
-      return new Token(TokenKind.PAREN_L, pos, pos + 1, line, col, prev);
-    // )
-    case 41:
-      return new Token(TokenKind.PAREN_R, pos, pos + 1, line, col, prev);
-    // .
-    case 46:
-      if (body.charCodeAt(pos + 1) === 46 && body.charCodeAt(pos + 2) === 46) {
-        return new Token(TokenKind.SPREAD, pos, pos + 3, line, col, prev);
-      }
-      break;
-    // :
-    case 58:
-      return new Token(TokenKind.COLON, pos, pos + 1, line, col, prev);
-    // =
-    case 61:
-      return new Token(TokenKind.EQUALS, pos, pos + 1, line, col, prev);
-    // @
-    case 64:
-      return new Token(TokenKind.AT, pos, pos + 1, line, col, prev);
-    // [
-    case 91:
-      return new Token(TokenKind.BRACKET_L, pos, pos + 1, line, col, prev);
-    // ]
-    case 93:
-      return new Token(TokenKind.BRACKET_R, pos, pos + 1, line, col, prev);
-    // {
-    case 123:
-      return new Token(TokenKind.BRACE_L, pos, pos + 1, line, col, prev);
-    // |
-    case 124:
-      return new Token(TokenKind.PIPE, pos, pos + 1, line, col, prev);
-    // }
-    case 125:
-      return new Token(TokenKind.BRACE_R, pos, pos + 1, line, col, prev);
-    // A-Z _ a-z
-    case 65:
-    case 66:
-    case 67:
-    case 68:
-    case 69:
-    case 70:
-    case 71:
-    case 72:
-    case 73:
-    case 74:
-    case 75:
-    case 76:
-    case 77:
-    case 78:
-    case 79:
-    case 80:
-    case 81:
-    case 82:
-    case 83:
-    case 84:
-    case 85:
-    case 86:
-    case 87:
-    case 88:
-    case 89:
-    case 90:
-    case 95:
-    case 97:
-    case 98:
-    case 99:
-    case 100:
-    case 101:
-    case 102:
-    case 103:
-    case 104:
-    case 105:
-    case 106:
-    case 107:
-    case 108:
-    case 109:
-    case 110:
-    case 111:
-    case 112:
-    case 113:
-    case 114:
-    case 115:
-    case 116:
-    case 117:
-    case 118:
-    case 119:
-    case 120:
-    case 121:
-    case 122:
-      return readName(source, pos, line, col, prev);
-    // - 0-9
-    case 45:
-    case 48:
-    case 49:
-    case 50:
-    case 51:
-    case 52:
-    case 53:
-    case 54:
-    case 55:
-    case 56:
-    case 57:
-      return readNumber(source, pos, code, line, col, prev);
-    // "
-    case 34:
-      if (body.charCodeAt(pos + 1) === 34 && body.charCodeAt(pos + 2) === 34) {
-        return readBlockString(source, pos, line, col, prev, lexer);
-      }
-      return readString(source, pos, line, col, prev);
-  }
-
-  throw syntaxError(source, pos, unexpectedCharacterMessage(code));
-}
-
-/**
- * Report a message that an unexpected character was encountered.
- */
-function unexpectedCharacterMessage(code) {
-  if (code < 0x0020 && code !== 0x0009 && code !== 0x000a && code !== 0x000d) {
-    return `Cannot contain the invalid character ${printCharCode(code)}.`;
-  }
-
-  if (code === 39) {
-    // '
-    return 'Unexpected single quote character (\'), did you mean to use a double quote (")?';
-  }
-
-  return `Cannot parse the unexpected character ${printCharCode(code)}.`;
-}
-
-/**
- * Reads from body starting at startPosition until it finds a non-whitespace
- * character, then returns the position of that character for lexing.
- */
-function positionAfterWhitespace(
-  body: string,
-  startPosition: number,
-  lexer: Lexer,
-): number {
-  const bodyLength = body.length;
-  let position = startPosition;
-  while (position < bodyLength) {
-    const code = body.charCodeAt(position);
-    // tab | space | comma | BOM
-    if (code === 9 || code === 32 || code === 44 || code === 0xfeff) {
-      ++position;
-    } else if (code === 10) {
-      // new line
-      ++position;
-      ++lexer.line;
-      lexer.lineStart = position;
-    } else if (code === 13) {
-      // carriage return
-      if (body.charCodeAt(position + 1) === 10) {
-        position += 2;
-      } else {
-        ++position;
-      }
-      ++lexer.line;
-      lexer.lineStart = position;
-    } else {
-      break;
-    }
-  }
-  return position;
-}
-
-/**
- * Reads a comment token from the source file.
- *
- * #[\u0009\u0020-\uFFFF]*
- */
-function readComment(source, start, line, col, prev): Token {
-  const body = source.body;
-  let code;
-  let position = start;
-
-  do {
-    code = body.charCodeAt(++position);
-  } while (
-    !isNaN(code) &&
-    // SourceCharacter but not LineTerminator
-    (code > 0x001f || code === 0x0009)
-  );
-
-  return new Token(
-    TokenKind.COMMENT,
-    start,
-    position,
-    line,
-    col,
-    prev,
-    body.slice(start + 1, position),
-  );
-}
-
-/**
- * Reads a number token from the source file, either a float
- * or an int depending on whether a decimal point appears.
- *
- * Int:   -?(0|[1-9][0-9]*)
- * Float: -?(0|[1-9][0-9]*)(\.[0-9]+)?((E|e)(+|-)?[0-9]+)?
- */
-function readNumber(source, start, firstCode, line, col, prev): Token {
-  const body = source.body;
-  let code = firstCode;
-  let position = start;
-  let isFloat = false;
-
-  if (code === 45) {
-    // -
-    code = body.charCodeAt(++position);
-  }
-
-  if (code === 48) {
-    // 0
-    code = body.charCodeAt(++position);
-    if (code >= 48 && code <= 57) {
-      throw syntaxError(
-        source,
-        position,
-        `Invalid number, unexpected digit after 0: ${printCharCode(code)}.`,
-      );
-    }
-  } else {
-    position = readDigits(source, position, code);
-    code = body.charCodeAt(position);
-  }
-
-  if (code === 46) {
-    // .
-    isFloat = true;
-
-    code = body.charCodeAt(++position);
-    position = readDigits(source, position, code);
-    code = body.charCodeAt(position);
-  }
-
-  if (code === 69 || code === 101) {
-    // E e
-    isFloat = true;
-
-    code = body.charCodeAt(++position);
-    if (code === 43 || code === 45) {
-      // + -
-      code = body.charCodeAt(++position);
-    }
-    position = readDigits(source, position, code);
-    code = body.charCodeAt(position);
-  }
-
-  // Numbers cannot be followed by . or NameStart
-  if (code === 46 || isNameStart(code)) {
-    throw syntaxError(
-      source,
-      position,
-      `Invalid number, expected digit but got: ${printCharCode(code)}.`,
-    );
-  }
-
-  return new Token(
-    isFloat ? TokenKind.FLOAT : TokenKind.INT,
-    start,
-    position,
-    line,
-    col,
-    prev,
-    body.slice(start, position),
-  );
-}
-
-/**
- * Returns the new position in the source after reading digits.
- */
-function readDigits(source, start, firstCode) {
-  const body = source.body;
-  let position = start;
-  let code = firstCode;
-  if (code >= 48 && code <= 57) {
-    // 0 - 9
-    do {
-      code = body.charCodeAt(++position);
-    } while (code >= 48 && code <= 57); // 0 - 9
-    return position;
-  }
-  throw syntaxError(
-    source,
-    position,
-    `Invalid number, expected digit but got: ${printCharCode(code)}.`,
-  );
-}
-
-/**
- * Reads a string token from the source file.
- *
- * "([^"\\\u000A\u000D]|(\\(u[0-9a-fA-F]{4}|["\\/bfnrt])))*"
- */
-function readString(source, start, line, col, prev): Token {
-  const body = source.body;
-  let position = start + 1;
-  let chunkStart = position;
-  let code = 0;
-  let value = '';
-
-  while (
-    position < body.length &&
-    !isNaN((code = body.charCodeAt(position))) &&
-    // not LineTerminator
-    code !== 0x000a &&
-    code !== 0x000d
-  ) {
-    // Closing Quote (")
-    if (code === 34) {
-      value += body.slice(chunkStart, position);
-      return new Token(
-        TokenKind.STRING,
-        start,
-        position + 1,
-        line,
-        col,
-        prev,
-        value,
-      );
-    }
-
-    // SourceCharacter
-    if (code < 0x0020 && code !== 0x0009) {
-      throw syntaxError(
-        source,
-        position,
-        `Invalid character within String: ${printCharCode(code)}.`,
-      );
-    }
-
-    ++position;
-    if (code === 92) {
-      // \
-      value += body.slice(chunkStart, position - 1);
-      code = body.charCodeAt(position);
-      switch (code) {
-        case 34:
-          value += '"';
-          break;
-        case 47:
-          value += '/';
-          break;
-        case 92:
-          value += '\\';
-          break;
-        case 98:
-          value += '\b';
-          break;
-        case 102:
-          value += '\f';
-          break;
-        case 110:
-          value += '\n';
-          break;
-        case 114:
-          value += '\r';
-          break;
-        case 116:
-          value += '\t';
-          break;
-        case 117: {
-          // uXXXX
-          const charCode = uniCharCode(
-            body.charCodeAt(position + 1),
-            body.charCodeAt(position + 2),
-            body.charCodeAt(position + 3),
-            body.charCodeAt(position + 4),
-          );
-          if (charCode < 0) {
-            const invalidSequence = body.slice(position + 1, position + 5);
-            throw syntaxError(
-              source,
-              position,
-              `Invalid character escape sequence: \\u${invalidSequence}.`,
-            );
-          }
-          value += String.fromCharCode(charCode);
-          position += 4;
-          break;
-        }
-        default:
-          throw syntaxError(
-            source,
-            position,
-            `Invalid character escape sequence: \\${String.fromCharCode(
-              code,
-            )}.`,
-          );
-      }
-      ++position;
-      chunkStart = position;
-    }
-  }
-
-  throw syntaxError(source, position, 'Unterminated string.');
-}
-
-/**
- * Reads a block string token from the source file.
- *
- * """("?"?(\\"""|\\(?!=""")|[^"\\]))*"""
- */
-function readBlockString(source, start, line, col, prev, lexer): Token {
-  const body = source.body;
-  let position = start + 3;
-  let chunkStart = position;
-  let code = 0;
-  let rawValue = '';
-
-  while (position < body.length && !isNaN((code = body.charCodeAt(position)))) {
-    // Closing Triple-Quote (""")
-    if (
-      code === 34 &&
-      body.charCodeAt(position + 1) === 34 &&
-      body.charCodeAt(position + 2) === 34
-    ) {
-      rawValue += body.slice(chunkStart, position);
-      return new Token(
-        TokenKind.BLOCK_STRING,
-        start,
-        position + 3,
-        line,
-        col,
-        prev,
-        dedentBlockStringValue(rawValue),
-      );
-    }
-
-    // SourceCharacter
-    if (
-      code < 0x0020 &&
-      code !== 0x0009 &&
-      code !== 0x000a &&
-      code !== 0x000d
-    ) {
-      throw syntaxError(
-        source,
-        position,
-        `Invalid character within String: ${printCharCode(code)}.`,
-      );
-    }
-
-    if (code === 10) {
-      // new line
-      ++position;
-      ++lexer.line;
-      lexer.lineStart = position;
-    } else if (code === 13) {
-      // carriage return
-      if (body.charCodeAt(position + 1) === 10) {
-        position += 2;
-      } else {
-        ++position;
-      }
-      ++lexer.line;
-      lexer.lineStart = position;
-    } else if (
-      // Escape Triple-Quote (\""")
-      code === 92 &&
-      body.charCodeAt(position + 1) === 34 &&
-      body.charCodeAt(position + 2) === 34 &&
-      body.charCodeAt(position + 3) === 34
-    ) {
-      rawValue += body.slice(chunkStart, position) + '"""';
-      position += 4;
-      chunkStart = position;
-    } else {
-      ++position;
-    }
-  }
-
-  throw syntaxError(source, position, 'Unterminated string.');
-}
-
-/**
- * Converts four hexadecimal chars to the integer that the
- * string represents. For example, uniCharCode('0','0','0','f')
- * will return 15, and uniCharCode('0','0','f','f') returns 255.
- *
- * Returns a negative number on error, if a char was invalid.
- *
- * This is implemented by noting that char2hex() returns -1 on error,
- * which means the result of ORing the char2hex() will also be negative.
- */
-function uniCharCode(a, b, c, d) {
-  return (
-    (char2hex(a) << 12) | (char2hex(b) << 8) | (char2hex(c) << 4) | char2hex(d)
-  );
-}
-
-/**
- * Converts a hex character to its integer value.
- * '0' becomes 0, '9' becomes 9
- * 'A' becomes 10, 'F' becomes 15
- * 'a' becomes 10, 'f' becomes 15
- *
- * Returns -1 on error.
- */
-function char2hex(a) {
-  return a >= 48 && a <= 57
-    ? a - 48 // 0-9
-    : a >= 65 && a <= 70
-    ? a - 55 // A-F
-    : a >= 97 && a <= 102
-    ? a - 87 // a-f
-    : -1;
-}
-
-/**
- * Reads an alphanumeric + underscore name from the source.
- *
- * [_A-Za-z][_0-9A-Za-z]*
- */
-function readName(source, start, line, col, prev): Token {
-  const body = source.body;
-  const bodyLength = body.length;
-  let position = start + 1;
-  let code = 0;
-  while (
-    position !== bodyLength &&
-    !isNaN((code = body.charCodeAt(position))) &&
-    (code === 95 || // _
-    (code >= 48 && code <= 57) || // 0-9
-    (code >= 65 && code <= 90) || // A-Z
-      (code >= 97 && code <= 122)) // a-z
-  ) {
-    ++position;
-  }
-  return new Token(
-    TokenKind.NAME,
-    start,
-    position,
-    line,
-    col,
-    prev,
-    body.slice(start, position),
-  );
-}
-
-// _ A-Z a-z
-function isNameStart(code): boolean {
-  return (
-    code === 95 || (code >= 65 && code <= 90) || (code >= 97 && code <= 122)
-  );
-}
diff --git a/node_modules/graphql/language/lexer.mjs b/node_modules/graphql/language/lexer.mjs
deleted file mode 100644
index 4d23a31..0000000
--- a/node_modules/graphql/language/lexer.mjs
+++ /dev/null
@@ -1,619 +0,0 @@
-import { syntaxError } from "../error/syntaxError.mjs";
-import { Token } from "./ast.mjs";
-import { dedentBlockStringValue } from "./blockString.mjs";
-import { TokenKind } from "./tokenKind.mjs";
-/**
- * Given a Source object, creates a Lexer for that source.
- * A Lexer is a stateful stream generator in that every time
- * it is advanced, it returns the next token in the Source. Assuming the
- * source lexes, the final Token emitted by the lexer will be of kind
- * EOF, after which the lexer will repeatedly return the same EOF token
- * whenever called.
- */
-
-export var Lexer =
-/*#__PURE__*/
-function () {
-  /**
-   * The previously focused non-ignored token.
-   */
-
-  /**
-   * The currently focused non-ignored token.
-   */
-
-  /**
-   * The (1-indexed) line containing the current token.
-   */
-
-  /**
-   * The character offset at which the current line begins.
-   */
-  function Lexer(source) {
-    var startOfFileToken = new Token(TokenKind.SOF, 0, 0, 0, 0, null);
-    this.source = source;
-    this.lastToken = startOfFileToken;
-    this.token = startOfFileToken;
-    this.line = 1;
-    this.lineStart = 0;
-  }
-  /**
-   * Advances the token stream to the next non-ignored token.
-   */
-
-
-  var _proto = Lexer.prototype;
-
-  _proto.advance = function advance() {
-    this.lastToken = this.token;
-    var token = this.token = this.lookahead();
-    return token;
-  }
-  /**
-   * Looks ahead and returns the next non-ignored token, but does not change
-   * the state of Lexer.
-   */
-  ;
-
-  _proto.lookahead = function lookahead() {
-    var token = this.token;
-
-    if (token.kind !== TokenKind.EOF) {
-      do {
-        var _token$next;
-
-        // Note: next is only mutable during parsing, so we cast to allow this.
-        token = (_token$next = token.next) !== null && _token$next !== void 0 ? _token$next : token.next = readToken(this, token);
-      } while (token.kind === TokenKind.COMMENT);
-    }
-
-    return token;
-  };
-
-  return Lexer;
-}();
-/**
- * @internal
- */
-
-export function isPunctuatorTokenKind(kind) {
-  return kind === TokenKind.BANG || kind === TokenKind.DOLLAR || kind === TokenKind.AMP || kind === TokenKind.PAREN_L || kind === TokenKind.PAREN_R || kind === TokenKind.SPREAD || kind === TokenKind.COLON || kind === TokenKind.EQUALS || kind === TokenKind.AT || kind === TokenKind.BRACKET_L || kind === TokenKind.BRACKET_R || kind === TokenKind.BRACE_L || kind === TokenKind.PIPE || kind === TokenKind.BRACE_R;
-}
-
-function printCharCode(code) {
-  return (// NaN/undefined represents access beyond the end of the file.
-    isNaN(code) ? TokenKind.EOF : // Trust JSON for ASCII.
-    code < 0x007f ? JSON.stringify(String.fromCharCode(code)) : // Otherwise print the escaped form.
-    "\"\\u".concat(('00' + code.toString(16).toUpperCase()).slice(-4), "\"")
-  );
-}
-/**
- * Gets the next token from the source starting at the given position.
- *
- * This skips over whitespace until it finds the next lexable token, then lexes
- * punctuators immediately or calls the appropriate helper function for more
- * complicated tokens.
- */
-
-
-function readToken(lexer, prev) {
-  var source = lexer.source;
-  var body = source.body;
-  var bodyLength = body.length;
-  var pos = positionAfterWhitespace(body, prev.end, lexer);
-  var line = lexer.line;
-  var col = 1 + pos - lexer.lineStart;
-
-  if (pos >= bodyLength) {
-    return new Token(TokenKind.EOF, bodyLength, bodyLength, line, col, prev);
-  }
-
-  var code = body.charCodeAt(pos); // SourceCharacter
-
-  switch (code) {
-    // !
-    case 33:
-      return new Token(TokenKind.BANG, pos, pos + 1, line, col, prev);
-    // #
-
-    case 35:
-      return readComment(source, pos, line, col, prev);
-    // $
-
-    case 36:
-      return new Token(TokenKind.DOLLAR, pos, pos + 1, line, col, prev);
-    // &
-
-    case 38:
-      return new Token(TokenKind.AMP, pos, pos + 1, line, col, prev);
-    // (
-
-    case 40:
-      return new Token(TokenKind.PAREN_L, pos, pos + 1, line, col, prev);
-    // )
-
-    case 41:
-      return new Token(TokenKind.PAREN_R, pos, pos + 1, line, col, prev);
-    // .
-
-    case 46:
-      if (body.charCodeAt(pos + 1) === 46 && body.charCodeAt(pos + 2) === 46) {
-        return new Token(TokenKind.SPREAD, pos, pos + 3, line, col, prev);
-      }
-
-      break;
-    // :
-
-    case 58:
-      return new Token(TokenKind.COLON, pos, pos + 1, line, col, prev);
-    // =
-
-    case 61:
-      return new Token(TokenKind.EQUALS, pos, pos + 1, line, col, prev);
-    // @
-
-    case 64:
-      return new Token(TokenKind.AT, pos, pos + 1, line, col, prev);
-    // [
-
-    case 91:
-      return new Token(TokenKind.BRACKET_L, pos, pos + 1, line, col, prev);
-    // ]
-
-    case 93:
-      return new Token(TokenKind.BRACKET_R, pos, pos + 1, line, col, prev);
-    // {
-
-    case 123:
-      return new Token(TokenKind.BRACE_L, pos, pos + 1, line, col, prev);
-    // |
-
-    case 124:
-      return new Token(TokenKind.PIPE, pos, pos + 1, line, col, prev);
-    // }
-
-    case 125:
-      return new Token(TokenKind.BRACE_R, pos, pos + 1, line, col, prev);
-    // A-Z _ a-z
-
-    case 65:
-    case 66:
-    case 67:
-    case 68:
-    case 69:
-    case 70:
-    case 71:
-    case 72:
-    case 73:
-    case 74:
-    case 75:
-    case 76:
-    case 77:
-    case 78:
-    case 79:
-    case 80:
-    case 81:
-    case 82:
-    case 83:
-    case 84:
-    case 85:
-    case 86:
-    case 87:
-    case 88:
-    case 89:
-    case 90:
-    case 95:
-    case 97:
-    case 98:
-    case 99:
-    case 100:
-    case 101:
-    case 102:
-    case 103:
-    case 104:
-    case 105:
-    case 106:
-    case 107:
-    case 108:
-    case 109:
-    case 110:
-    case 111:
-    case 112:
-    case 113:
-    case 114:
-    case 115:
-    case 116:
-    case 117:
-    case 118:
-    case 119:
-    case 120:
-    case 121:
-    case 122:
-      return readName(source, pos, line, col, prev);
-    // - 0-9
-
-    case 45:
-    case 48:
-    case 49:
-    case 50:
-    case 51:
-    case 52:
-    case 53:
-    case 54:
-    case 55:
-    case 56:
-    case 57:
-      return readNumber(source, pos, code, line, col, prev);
-    // "
-
-    case 34:
-      if (body.charCodeAt(pos + 1) === 34 && body.charCodeAt(pos + 2) === 34) {
-        return readBlockString(source, pos, line, col, prev, lexer);
-      }
-
-      return readString(source, pos, line, col, prev);
-  }
-
-  throw syntaxError(source, pos, unexpectedCharacterMessage(code));
-}
-/**
- * Report a message that an unexpected character was encountered.
- */
-
-
-function unexpectedCharacterMessage(code) {
-  if (code < 0x0020 && code !== 0x0009 && code !== 0x000a && code !== 0x000d) {
-    return "Cannot contain the invalid character ".concat(printCharCode(code), ".");
-  }
-
-  if (code === 39) {
-    // '
-    return 'Unexpected single quote character (\'), did you mean to use a double quote (")?';
-  }
-
-  return "Cannot parse the unexpected character ".concat(printCharCode(code), ".");
-}
-/**
- * Reads from body starting at startPosition until it finds a non-whitespace
- * character, then returns the position of that character for lexing.
- */
-
-
-function positionAfterWhitespace(body, startPosition, lexer) {
-  var bodyLength = body.length;
-  var position = startPosition;
-
-  while (position < bodyLength) {
-    var code = body.charCodeAt(position); // tab | space | comma | BOM
-
-    if (code === 9 || code === 32 || code === 44 || code === 0xfeff) {
-      ++position;
-    } else if (code === 10) {
-      // new line
-      ++position;
-      ++lexer.line;
-      lexer.lineStart = position;
-    } else if (code === 13) {
-      // carriage return
-      if (body.charCodeAt(position + 1) === 10) {
-        position += 2;
-      } else {
-        ++position;
-      }
-
-      ++lexer.line;
-      lexer.lineStart = position;
-    } else {
-      break;
-    }
-  }
-
-  return position;
-}
-/**
- * Reads a comment token from the source file.
- *
- * #[\u0009\u0020-\uFFFF]*
- */
-
-
-function readComment(source, start, line, col, prev) {
-  var body = source.body;
-  var code;
-  var position = start;
-
-  do {
-    code = body.charCodeAt(++position);
-  } while (!isNaN(code) && ( // SourceCharacter but not LineTerminator
-  code > 0x001f || code === 0x0009));
-
-  return new Token(TokenKind.COMMENT, start, position, line, col, prev, body.slice(start + 1, position));
-}
-/**
- * Reads a number token from the source file, either a float
- * or an int depending on whether a decimal point appears.
- *
- * Int:   -?(0|[1-9][0-9]*)
- * Float: -?(0|[1-9][0-9]*)(\.[0-9]+)?((E|e)(+|-)?[0-9]+)?
- */
-
-
-function readNumber(source, start, firstCode, line, col, prev) {
-  var body = source.body;
-  var code = firstCode;
-  var position = start;
-  var isFloat = false;
-
-  if (code === 45) {
-    // -
-    code = body.charCodeAt(++position);
-  }
-
-  if (code === 48) {
-    // 0
-    code = body.charCodeAt(++position);
-
-    if (code >= 48 && code <= 57) {
-      throw syntaxError(source, position, "Invalid number, unexpected digit after 0: ".concat(printCharCode(code), "."));
-    }
-  } else {
-    position = readDigits(source, position, code);
-    code = body.charCodeAt(position);
-  }
-
-  if (code === 46) {
-    // .
-    isFloat = true;
-    code = body.charCodeAt(++position);
-    position = readDigits(source, position, code);
-    code = body.charCodeAt(position);
-  }
-
-  if (code === 69 || code === 101) {
-    // E e
-    isFloat = true;
-    code = body.charCodeAt(++position);
-
-    if (code === 43 || code === 45) {
-      // + -
-      code = body.charCodeAt(++position);
-    }
-
-    position = readDigits(source, position, code);
-    code = body.charCodeAt(position);
-  } // Numbers cannot be followed by . or NameStart
-
-
-  if (code === 46 || isNameStart(code)) {
-    throw syntaxError(source, position, "Invalid number, expected digit but got: ".concat(printCharCode(code), "."));
-  }
-
-  return new Token(isFloat ? TokenKind.FLOAT : TokenKind.INT, start, position, line, col, prev, body.slice(start, position));
-}
-/**
- * Returns the new position in the source after reading digits.
- */
-
-
-function readDigits(source, start, firstCode) {
-  var body = source.body;
-  var position = start;
-  var code = firstCode;
-
-  if (code >= 48 && code <= 57) {
-    // 0 - 9
-    do {
-      code = body.charCodeAt(++position);
-    } while (code >= 48 && code <= 57); // 0 - 9
-
-
-    return position;
-  }
-
-  throw syntaxError(source, position, "Invalid number, expected digit but got: ".concat(printCharCode(code), "."));
-}
-/**
- * Reads a string token from the source file.
- *
- * "([^"\\\u000A\u000D]|(\\(u[0-9a-fA-F]{4}|["\\/bfnrt])))*"
- */
-
-
-function readString(source, start, line, col, prev) {
-  var body = source.body;
-  var position = start + 1;
-  var chunkStart = position;
-  var code = 0;
-  var value = '';
-
-  while (position < body.length && !isNaN(code = body.charCodeAt(position)) && // not LineTerminator
-  code !== 0x000a && code !== 0x000d) {
-    // Closing Quote (")
-    if (code === 34) {
-      value += body.slice(chunkStart, position);
-      return new Token(TokenKind.STRING, start, position + 1, line, col, prev, value);
-    } // SourceCharacter
-
-
-    if (code < 0x0020 && code !== 0x0009) {
-      throw syntaxError(source, position, "Invalid character within String: ".concat(printCharCode(code), "."));
-    }
-
-    ++position;
-
-    if (code === 92) {
-      // \
-      value += body.slice(chunkStart, position - 1);
-      code = body.charCodeAt(position);
-
-      switch (code) {
-        case 34:
-          value += '"';
-          break;
-
-        case 47:
-          value += '/';
-          break;
-
-        case 92:
-          value += '\\';
-          break;
-
-        case 98:
-          value += '\b';
-          break;
-
-        case 102:
-          value += '\f';
-          break;
-
-        case 110:
-          value += '\n';
-          break;
-
-        case 114:
-          value += '\r';
-          break;
-
-        case 116:
-          value += '\t';
-          break;
-
-        case 117:
-          {
-            // uXXXX
-            var charCode = uniCharCode(body.charCodeAt(position + 1), body.charCodeAt(position + 2), body.charCodeAt(position + 3), body.charCodeAt(position + 4));
-
-            if (charCode < 0) {
-              var invalidSequence = body.slice(position + 1, position + 5);
-              throw syntaxError(source, position, "Invalid character escape sequence: \\u".concat(invalidSequence, "."));
-            }
-
-            value += String.fromCharCode(charCode);
-            position += 4;
-            break;
-          }
-
-        default:
-          throw syntaxError(source, position, "Invalid character escape sequence: \\".concat(String.fromCharCode(code), "."));
-      }
-
-      ++position;
-      chunkStart = position;
-    }
-  }
-
-  throw syntaxError(source, position, 'Unterminated string.');
-}
-/**
- * Reads a block string token from the source file.
- *
- * """("?"?(\\"""|\\(?!=""")|[^"\\]))*"""
- */
-
-
-function readBlockString(source, start, line, col, prev, lexer) {
-  var body = source.body;
-  var position = start + 3;
-  var chunkStart = position;
-  var code = 0;
-  var rawValue = '';
-
-  while (position < body.length && !isNaN(code = body.charCodeAt(position))) {
-    // Closing Triple-Quote (""")
-    if (code === 34 && body.charCodeAt(position + 1) === 34 && body.charCodeAt(position + 2) === 34) {
-      rawValue += body.slice(chunkStart, position);
-      return new Token(TokenKind.BLOCK_STRING, start, position + 3, line, col, prev, dedentBlockStringValue(rawValue));
-    } // SourceCharacter
-
-
-    if (code < 0x0020 && code !== 0x0009 && code !== 0x000a && code !== 0x000d) {
-      throw syntaxError(source, position, "Invalid character within String: ".concat(printCharCode(code), "."));
-    }
-
-    if (code === 10) {
-      // new line
-      ++position;
-      ++lexer.line;
-      lexer.lineStart = position;
-    } else if (code === 13) {
-      // carriage return
-      if (body.charCodeAt(position + 1) === 10) {
-        position += 2;
-      } else {
-        ++position;
-      }
-
-      ++lexer.line;
-      lexer.lineStart = position;
-    } else if ( // Escape Triple-Quote (\""")
-    code === 92 && body.charCodeAt(position + 1) === 34 && body.charCodeAt(position + 2) === 34 && body.charCodeAt(position + 3) === 34) {
-      rawValue += body.slice(chunkStart, position) + '"""';
-      position += 4;
-      chunkStart = position;
-    } else {
-      ++position;
-    }
-  }
-
-  throw syntaxError(source, position, 'Unterminated string.');
-}
-/**
- * Converts four hexadecimal chars to the integer that the
- * string represents. For example, uniCharCode('0','0','0','f')
- * will return 15, and uniCharCode('0','0','f','f') returns 255.
- *
- * Returns a negative number on error, if a char was invalid.
- *
- * This is implemented by noting that char2hex() returns -1 on error,
- * which means the result of ORing the char2hex() will also be negative.
- */
-
-
-function uniCharCode(a, b, c, d) {
-  return char2hex(a) << 12 | char2hex(b) << 8 | char2hex(c) << 4 | char2hex(d);
-}
-/**
- * Converts a hex character to its integer value.
- * '0' becomes 0, '9' becomes 9
- * 'A' becomes 10, 'F' becomes 15
- * 'a' becomes 10, 'f' becomes 15
- *
- * Returns -1 on error.
- */
-
-
-function char2hex(a) {
-  return a >= 48 && a <= 57 ? a - 48 // 0-9
-  : a >= 65 && a <= 70 ? a - 55 // A-F
-  : a >= 97 && a <= 102 ? a - 87 // a-f
-  : -1;
-}
-/**
- * Reads an alphanumeric + underscore name from the source.
- *
- * [_A-Za-z][_0-9A-Za-z]*
- */
-
-
-function readName(source, start, line, col, prev) {
-  var body = source.body;
-  var bodyLength = body.length;
-  var position = start + 1;
-  var code = 0;
-
-  while (position !== bodyLength && !isNaN(code = body.charCodeAt(position)) && (code === 95 || // _
-  code >= 48 && code <= 57 || // 0-9
-  code >= 65 && code <= 90 || // A-Z
-  code >= 97 && code <= 122) // a-z
-  ) {
-    ++position;
-  }
-
-  return new Token(TokenKind.NAME, start, position, line, col, prev, body.slice(start, position));
-} // _ A-Z a-z
-
-
-function isNameStart(code) {
-  return code === 95 || code >= 65 && code <= 90 || code >= 97 && code <= 122;
-}
diff --git a/node_modules/graphql/language/location.d.ts b/node_modules/graphql/language/location.d.ts
deleted file mode 100644
index a41e82f..0000000
--- a/node_modules/graphql/language/location.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Source } from './source';
-
-/**
- * Represents a location in a Source.
- */
-export interface SourceLocation {
-  readonly line: number;
-  readonly column: number;
-}
-
-/**
- * Takes a Source and a UTF-8 character offset, and returns the corresponding
- * line and column as a SourceLocation.
- */
-export function getLocation(source: Source, position: number): SourceLocation;
diff --git a/node_modules/graphql/language/location.js b/node_modules/graphql/language/location.js
deleted file mode 100644
index 27d87c3..0000000
--- a/node_modules/graphql/language/location.js
+++ /dev/null
@@ -1,31 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getLocation = getLocation;
-
-/**
- * Represents a location in a Source.
- */
-
-/**
- * Takes a Source and a UTF-8 character offset, and returns the corresponding
- * line and column as a SourceLocation.
- */
-function getLocation(source, position) {
-  var lineRegexp = /\r\n|[\n\r]/g;
-  var line = 1;
-  var column = position + 1;
-  var match;
-
-  while ((match = lineRegexp.exec(source.body)) && match.index < position) {
-    line += 1;
-    column = position + 1 - (match.index + match[0].length);
-  }
-
-  return {
-    line: line,
-    column: column
-  };
-}
diff --git a/node_modules/graphql/language/location.js.flow b/node_modules/graphql/language/location.js.flow
deleted file mode 100644
index 3918513..0000000
--- a/node_modules/graphql/language/location.js.flow
+++ /dev/null
@@ -1,27 +0,0 @@
-// @flow strict
-
-import { type Source } from './source';
-
-/**
- * Represents a location in a Source.
- */
-export type SourceLocation = {|
-  +line: number,
-  +column: number,
-|};
-
-/**
- * Takes a Source and a UTF-8 character offset, and returns the corresponding
- * line and column as a SourceLocation.
- */
-export function getLocation(source: Source, position: number): SourceLocation {
-  const lineRegexp = /\r\n|[\n\r]/g;
-  let line = 1;
-  let column = position + 1;
-  let match;
-  while ((match = lineRegexp.exec(source.body)) && match.index < position) {
-    line += 1;
-    column = position + 1 - (match.index + match[0].length);
-  }
-  return { line, column };
-}
diff --git a/node_modules/graphql/language/location.mjs b/node_modules/graphql/language/location.mjs
deleted file mode 100644
index e578ef0..0000000
--- a/node_modules/graphql/language/location.mjs
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Represents a location in a Source.
- */
-
-/**
- * Takes a Source and a UTF-8 character offset, and returns the corresponding
- * line and column as a SourceLocation.
- */
-export function getLocation(source, position) {
-  var lineRegexp = /\r\n|[\n\r]/g;
-  var line = 1;
-  var column = position + 1;
-  var match;
-
-  while ((match = lineRegexp.exec(source.body)) && match.index < position) {
-    line += 1;
-    column = position + 1 - (match.index + match[0].length);
-  }
-
-  return {
-    line: line,
-    column: column
-  };
-}
diff --git a/node_modules/graphql/language/parser.d.ts b/node_modules/graphql/language/parser.d.ts
deleted file mode 100644
index 368c6f8..0000000
--- a/node_modules/graphql/language/parser.d.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import { Source } from './source';
-import { TypeNode, ValueNode, DocumentNode } from './ast';
-
-/**
- * Configuration options to control parser behavior
- */
-export interface ParseOptions {
-  /**
-   * By default, the parser creates AST nodes that know the location
-   * in the source that they correspond to. This configuration flag
-   * disables that behavior for performance or testing.
-   */
-  noLocation?: boolean;
-
-  /**
-   * If enabled, the parser will parse empty fields sets in the Schema
-   * Definition Language. Otherwise, the parser will follow the current
-   * specification.
-   *
-   * This option is provided to ease adoption of the final SDL specification
-   * and will be removed in v16.
-   */
-  allowLegacySDLEmptyFields?: boolean;
-
-  /**
-   * If enabled, the parser will parse implemented interfaces with no `&`
-   * character between each interface. Otherwise, the parser will follow the
-   * current specification.
-   *
-   * This option is provided to ease adoption of the final SDL specification
-   * and will be removed in v16.
-   */
-  allowLegacySDLImplementsInterfaces?: boolean;
-
-  /**
-   * EXPERIMENTAL:
-   *
-   * If enabled, the parser will understand and parse variable definitions
-   * contained in a fragment definition. They'll be represented in the
-   * `variableDefinitions` field of the FragmentDefinitionNode.
-   *
-   * The syntax is identical to normal, query-defined variables. For example:
-   *
-   *   fragment A($var: Boolean = false) on T  {
-   *     ...
-   *   }
-   *
-   * Note: this feature is experimental and may change or be removed in the
-   * future.
-   */
-  experimentalFragmentVariables?: boolean;
-}
-
-/**
- * Given a GraphQL source, parses it into a Document.
- * Throws GraphQLError if a syntax error is encountered.
- */
-export function parse(
-  source: string | Source,
-  options?: ParseOptions,
-): DocumentNode;
-
-/**
- * Given a string containing a GraphQL value, parse the AST for that value.
- * Throws GraphQLError if a syntax error is encountered.
- *
- * This is useful within tools that operate upon GraphQL Values directly and
- * in isolation of complete GraphQL documents.
- */
-export function parseValue(
-  source: string | Source,
-  options?: ParseOptions,
-): ValueNode;
-
-/**
- * Given a string containing a GraphQL Type (ex. `[Int!]`), parse the AST for
- * that type.
- * Throws GraphQLError if a syntax error is encountered.
- *
- * This is useful within tools that operate upon GraphQL Types directly and
- * in isolation of complete GraphQL documents.
- *
- * Consider providing the results to the utility function: typeFromAST().
- */
-export function parseType(
-  source: string | Source,
-  options?: ParseOptions,
-): TypeNode;
diff --git a/node_modules/graphql/language/parser.js b/node_modules/graphql/language/parser.js
deleted file mode 100644
index c66dad4..0000000
--- a/node_modules/graphql/language/parser.js
+++ /dev/null
@@ -1,1563 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.parse = parse;
-exports.parseValue = parseValue;
-exports.parseType = parseType;
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _devAssert = _interopRequireDefault(require("../jsutils/devAssert"));
-
-var _syntaxError = require("../error/syntaxError");
-
-var _kinds = require("./kinds");
-
-var _source = require("./source");
-
-var _directiveLocation = require("./directiveLocation");
-
-var _tokenKind = require("./tokenKind");
-
-var _lexer = require("./lexer");
-
-var _ast = require("./ast");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Given a GraphQL source, parses it into a Document.
- * Throws GraphQLError if a syntax error is encountered.
- */
-function parse(source, options) {
-  var parser = new Parser(source, options);
-  return parser.parseDocument();
-}
-/**
- * Given a string containing a GraphQL value (ex. `[42]`), parse the AST for
- * that value.
- * Throws GraphQLError if a syntax error is encountered.
- *
- * This is useful within tools that operate upon GraphQL Values directly and
- * in isolation of complete GraphQL documents.
- *
- * Consider providing the results to the utility function: valueFromAST().
- */
-
-
-function parseValue(source, options) {
-  var parser = new Parser(source, options);
-  parser.expectToken(_tokenKind.TokenKind.SOF);
-  var value = parser.parseValueLiteral(false);
-  parser.expectToken(_tokenKind.TokenKind.EOF);
-  return value;
-}
-/**
- * Given a string containing a GraphQL Type (ex. `[Int!]`), parse the AST for
- * that type.
- * Throws GraphQLError if a syntax error is encountered.
- *
- * This is useful within tools that operate upon GraphQL Types directly and
- * in isolation of complete GraphQL documents.
- *
- * Consider providing the results to the utility function: typeFromAST().
- */
-
-
-function parseType(source, options) {
-  var parser = new Parser(source, options);
-  parser.expectToken(_tokenKind.TokenKind.SOF);
-  var type = parser.parseTypeReference();
-  parser.expectToken(_tokenKind.TokenKind.EOF);
-  return type;
-}
-
-var Parser =
-/*#__PURE__*/
-function () {
-  function Parser(source, options) {
-    var sourceObj = typeof source === 'string' ? new _source.Source(source) : source;
-    sourceObj instanceof _source.Source || (0, _devAssert.default)(0, "Must provide Source. Received: ".concat((0, _inspect.default)(sourceObj), "."));
-    this._lexer = new _lexer.Lexer(sourceObj);
-    this._options = options;
-  }
-  /**
-   * Converts a name lex token into a name parse node.
-   */
-
-
-  var _proto = Parser.prototype;
-
-  _proto.parseName = function parseName() {
-    var token = this.expectToken(_tokenKind.TokenKind.NAME);
-    return {
-      kind: _kinds.Kind.NAME,
-      value: token.value,
-      loc: this.loc(token)
-    };
-  } // Implements the parsing rules in the Document section.
-
-  /**
-   * Document : Definition+
-   */
-  ;
-
-  _proto.parseDocument = function parseDocument() {
-    var start = this._lexer.token;
-    return {
-      kind: _kinds.Kind.DOCUMENT,
-      definitions: this.many(_tokenKind.TokenKind.SOF, this.parseDefinition, _tokenKind.TokenKind.EOF),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * Definition :
-   *   - ExecutableDefinition
-   *   - TypeSystemDefinition
-   *   - TypeSystemExtension
-   *
-   * ExecutableDefinition :
-   *   - OperationDefinition
-   *   - FragmentDefinition
-   */
-  ;
-
-  _proto.parseDefinition = function parseDefinition() {
-    if (this.peek(_tokenKind.TokenKind.NAME)) {
-      switch (this._lexer.token.value) {
-        case 'query':
-        case 'mutation':
-        case 'subscription':
-          return this.parseOperationDefinition();
-
-        case 'fragment':
-          return this.parseFragmentDefinition();
-
-        case 'schema':
-        case 'scalar':
-        case 'type':
-        case 'interface':
-        case 'union':
-        case 'enum':
-        case 'input':
-        case 'directive':
-          return this.parseTypeSystemDefinition();
-
-        case 'extend':
-          return this.parseTypeSystemExtension();
-      }
-    } else if (this.peek(_tokenKind.TokenKind.BRACE_L)) {
-      return this.parseOperationDefinition();
-    } else if (this.peekDescription()) {
-      return this.parseTypeSystemDefinition();
-    }
-
-    throw this.unexpected();
-  } // Implements the parsing rules in the Operations section.
-
-  /**
-   * OperationDefinition :
-   *  - SelectionSet
-   *  - OperationType Name? VariableDefinitions? Directives? SelectionSet
-   */
-  ;
-
-  _proto.parseOperationDefinition = function parseOperationDefinition() {
-    var start = this._lexer.token;
-
-    if (this.peek(_tokenKind.TokenKind.BRACE_L)) {
-      return {
-        kind: _kinds.Kind.OPERATION_DEFINITION,
-        operation: 'query',
-        name: undefined,
-        variableDefinitions: [],
-        directives: [],
-        selectionSet: this.parseSelectionSet(),
-        loc: this.loc(start)
-      };
-    }
-
-    var operation = this.parseOperationType();
-    var name;
-
-    if (this.peek(_tokenKind.TokenKind.NAME)) {
-      name = this.parseName();
-    }
-
-    return {
-      kind: _kinds.Kind.OPERATION_DEFINITION,
-      operation: operation,
-      name: name,
-      variableDefinitions: this.parseVariableDefinitions(),
-      directives: this.parseDirectives(false),
-      selectionSet: this.parseSelectionSet(),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * OperationType : one of query mutation subscription
-   */
-  ;
-
-  _proto.parseOperationType = function parseOperationType() {
-    var operationToken = this.expectToken(_tokenKind.TokenKind.NAME);
-
-    switch (operationToken.value) {
-      case 'query':
-        return 'query';
-
-      case 'mutation':
-        return 'mutation';
-
-      case 'subscription':
-        return 'subscription';
-    }
-
-    throw this.unexpected(operationToken);
-  }
-  /**
-   * VariableDefinitions : ( VariableDefinition+ )
-   */
-  ;
-
-  _proto.parseVariableDefinitions = function parseVariableDefinitions() {
-    return this.optionalMany(_tokenKind.TokenKind.PAREN_L, this.parseVariableDefinition, _tokenKind.TokenKind.PAREN_R);
-  }
-  /**
-   * VariableDefinition : Variable : Type DefaultValue? Directives[Const]?
-   */
-  ;
-
-  _proto.parseVariableDefinition = function parseVariableDefinition() {
-    var start = this._lexer.token;
-    return {
-      kind: _kinds.Kind.VARIABLE_DEFINITION,
-      variable: this.parseVariable(),
-      type: (this.expectToken(_tokenKind.TokenKind.COLON), this.parseTypeReference()),
-      defaultValue: this.expectOptionalToken(_tokenKind.TokenKind.EQUALS) ? this.parseValueLiteral(true) : undefined,
-      directives: this.parseDirectives(true),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * Variable : $ Name
-   */
-  ;
-
-  _proto.parseVariable = function parseVariable() {
-    var start = this._lexer.token;
-    this.expectToken(_tokenKind.TokenKind.DOLLAR);
-    return {
-      kind: _kinds.Kind.VARIABLE,
-      name: this.parseName(),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * SelectionSet : { Selection+ }
-   */
-  ;
-
-  _proto.parseSelectionSet = function parseSelectionSet() {
-    var start = this._lexer.token;
-    return {
-      kind: _kinds.Kind.SELECTION_SET,
-      selections: this.many(_tokenKind.TokenKind.BRACE_L, this.parseSelection, _tokenKind.TokenKind.BRACE_R),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * Selection :
-   *   - Field
-   *   - FragmentSpread
-   *   - InlineFragment
-   */
-  ;
-
-  _proto.parseSelection = function parseSelection() {
-    return this.peek(_tokenKind.TokenKind.SPREAD) ? this.parseFragment() : this.parseField();
-  }
-  /**
-   * Field : Alias? Name Arguments? Directives? SelectionSet?
-   *
-   * Alias : Name :
-   */
-  ;
-
-  _proto.parseField = function parseField() {
-    var start = this._lexer.token;
-    var nameOrAlias = this.parseName();
-    var alias;
-    var name;
-
-    if (this.expectOptionalToken(_tokenKind.TokenKind.COLON)) {
-      alias = nameOrAlias;
-      name = this.parseName();
-    } else {
-      name = nameOrAlias;
-    }
-
-    return {
-      kind: _kinds.Kind.FIELD,
-      alias: alias,
-      name: name,
-      arguments: this.parseArguments(false),
-      directives: this.parseDirectives(false),
-      selectionSet: this.peek(_tokenKind.TokenKind.BRACE_L) ? this.parseSelectionSet() : undefined,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * Arguments[Const] : ( Argument[?Const]+ )
-   */
-  ;
-
-  _proto.parseArguments = function parseArguments(isConst) {
-    var item = isConst ? this.parseConstArgument : this.parseArgument;
-    return this.optionalMany(_tokenKind.TokenKind.PAREN_L, item, _tokenKind.TokenKind.PAREN_R);
-  }
-  /**
-   * Argument[Const] : Name : Value[?Const]
-   */
-  ;
-
-  _proto.parseArgument = function parseArgument() {
-    var start = this._lexer.token;
-    var name = this.parseName();
-    this.expectToken(_tokenKind.TokenKind.COLON);
-    return {
-      kind: _kinds.Kind.ARGUMENT,
-      name: name,
-      value: this.parseValueLiteral(false),
-      loc: this.loc(start)
-    };
-  };
-
-  _proto.parseConstArgument = function parseConstArgument() {
-    var start = this._lexer.token;
-    return {
-      kind: _kinds.Kind.ARGUMENT,
-      name: this.parseName(),
-      value: (this.expectToken(_tokenKind.TokenKind.COLON), this.parseValueLiteral(true)),
-      loc: this.loc(start)
-    };
-  } // Implements the parsing rules in the Fragments section.
-
-  /**
-   * Corresponds to both FragmentSpread and InlineFragment in the spec.
-   *
-   * FragmentSpread : ... FragmentName Directives?
-   *
-   * InlineFragment : ... TypeCondition? Directives? SelectionSet
-   */
-  ;
-
-  _proto.parseFragment = function parseFragment() {
-    var start = this._lexer.token;
-    this.expectToken(_tokenKind.TokenKind.SPREAD);
-    var hasTypeCondition = this.expectOptionalKeyword('on');
-
-    if (!hasTypeCondition && this.peek(_tokenKind.TokenKind.NAME)) {
-      return {
-        kind: _kinds.Kind.FRAGMENT_SPREAD,
-        name: this.parseFragmentName(),
-        directives: this.parseDirectives(false),
-        loc: this.loc(start)
-      };
-    }
-
-    return {
-      kind: _kinds.Kind.INLINE_FRAGMENT,
-      typeCondition: hasTypeCondition ? this.parseNamedType() : undefined,
-      directives: this.parseDirectives(false),
-      selectionSet: this.parseSelectionSet(),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * FragmentDefinition :
-   *   - fragment FragmentName on TypeCondition Directives? SelectionSet
-   *
-   * TypeCondition : NamedType
-   */
-  ;
-
-  _proto.parseFragmentDefinition = function parseFragmentDefinition() {
-    var _this$_options;
-
-    var start = this._lexer.token;
-    this.expectKeyword('fragment'); // Experimental support for defining variables within fragments changes
-    // the grammar of FragmentDefinition:
-    //   - fragment FragmentName VariableDefinitions? on TypeCondition Directives? SelectionSet
-
-    if (((_this$_options = this._options) === null || _this$_options === void 0 ? void 0 : _this$_options.experimentalFragmentVariables) === true) {
-      return {
-        kind: _kinds.Kind.FRAGMENT_DEFINITION,
-        name: this.parseFragmentName(),
-        variableDefinitions: this.parseVariableDefinitions(),
-        typeCondition: (this.expectKeyword('on'), this.parseNamedType()),
-        directives: this.parseDirectives(false),
-        selectionSet: this.parseSelectionSet(),
-        loc: this.loc(start)
-      };
-    }
-
-    return {
-      kind: _kinds.Kind.FRAGMENT_DEFINITION,
-      name: this.parseFragmentName(),
-      typeCondition: (this.expectKeyword('on'), this.parseNamedType()),
-      directives: this.parseDirectives(false),
-      selectionSet: this.parseSelectionSet(),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * FragmentName : Name but not `on`
-   */
-  ;
-
-  _proto.parseFragmentName = function parseFragmentName() {
-    if (this._lexer.token.value === 'on') {
-      throw this.unexpected();
-    }
-
-    return this.parseName();
-  } // Implements the parsing rules in the Values section.
-
-  /**
-   * Value[Const] :
-   *   - [~Const] Variable
-   *   - IntValue
-   *   - FloatValue
-   *   - StringValue
-   *   - BooleanValue
-   *   - NullValue
-   *   - EnumValue
-   *   - ListValue[?Const]
-   *   - ObjectValue[?Const]
-   *
-   * BooleanValue : one of `true` `false`
-   *
-   * NullValue : `null`
-   *
-   * EnumValue : Name but not `true`, `false` or `null`
-   */
-  ;
-
-  _proto.parseValueLiteral = function parseValueLiteral(isConst) {
-    var token = this._lexer.token;
-
-    switch (token.kind) {
-      case _tokenKind.TokenKind.BRACKET_L:
-        return this.parseList(isConst);
-
-      case _tokenKind.TokenKind.BRACE_L:
-        return this.parseObject(isConst);
-
-      case _tokenKind.TokenKind.INT:
-        this._lexer.advance();
-
-        return {
-          kind: _kinds.Kind.INT,
-          value: token.value,
-          loc: this.loc(token)
-        };
-
-      case _tokenKind.TokenKind.FLOAT:
-        this._lexer.advance();
-
-        return {
-          kind: _kinds.Kind.FLOAT,
-          value: token.value,
-          loc: this.loc(token)
-        };
-
-      case _tokenKind.TokenKind.STRING:
-      case _tokenKind.TokenKind.BLOCK_STRING:
-        return this.parseStringLiteral();
-
-      case _tokenKind.TokenKind.NAME:
-        this._lexer.advance();
-
-        switch (token.value) {
-          case 'true':
-            return {
-              kind: _kinds.Kind.BOOLEAN,
-              value: true,
-              loc: this.loc(token)
-            };
-
-          case 'false':
-            return {
-              kind: _kinds.Kind.BOOLEAN,
-              value: false,
-              loc: this.loc(token)
-            };
-
-          case 'null':
-            return {
-              kind: _kinds.Kind.NULL,
-              loc: this.loc(token)
-            };
-
-          default:
-            return {
-              kind: _kinds.Kind.ENUM,
-              value: token.value,
-              loc: this.loc(token)
-            };
-        }
-
-      case _tokenKind.TokenKind.DOLLAR:
-        if (!isConst) {
-          return this.parseVariable();
-        }
-
-        break;
-    }
-
-    throw this.unexpected();
-  };
-
-  _proto.parseStringLiteral = function parseStringLiteral() {
-    var token = this._lexer.token;
-
-    this._lexer.advance();
-
-    return {
-      kind: _kinds.Kind.STRING,
-      value: token.value,
-      block: token.kind === _tokenKind.TokenKind.BLOCK_STRING,
-      loc: this.loc(token)
-    };
-  }
-  /**
-   * ListValue[Const] :
-   *   - [ ]
-   *   - [ Value[?Const]+ ]
-   */
-  ;
-
-  _proto.parseList = function parseList(isConst) {
-    var _this = this;
-
-    var start = this._lexer.token;
-
-    var item = function item() {
-      return _this.parseValueLiteral(isConst);
-    };
-
-    return {
-      kind: _kinds.Kind.LIST,
-      values: this.any(_tokenKind.TokenKind.BRACKET_L, item, _tokenKind.TokenKind.BRACKET_R),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ObjectValue[Const] :
-   *   - { }
-   *   - { ObjectField[?Const]+ }
-   */
-  ;
-
-  _proto.parseObject = function parseObject(isConst) {
-    var _this2 = this;
-
-    var start = this._lexer.token;
-
-    var item = function item() {
-      return _this2.parseObjectField(isConst);
-    };
-
-    return {
-      kind: _kinds.Kind.OBJECT,
-      fields: this.any(_tokenKind.TokenKind.BRACE_L, item, _tokenKind.TokenKind.BRACE_R),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ObjectField[Const] : Name : Value[?Const]
-   */
-  ;
-
-  _proto.parseObjectField = function parseObjectField(isConst) {
-    var start = this._lexer.token;
-    var name = this.parseName();
-    this.expectToken(_tokenKind.TokenKind.COLON);
-    return {
-      kind: _kinds.Kind.OBJECT_FIELD,
-      name: name,
-      value: this.parseValueLiteral(isConst),
-      loc: this.loc(start)
-    };
-  } // Implements the parsing rules in the Directives section.
-
-  /**
-   * Directives[Const] : Directive[?Const]+
-   */
-  ;
-
-  _proto.parseDirectives = function parseDirectives(isConst) {
-    var directives = [];
-
-    while (this.peek(_tokenKind.TokenKind.AT)) {
-      directives.push(this.parseDirective(isConst));
-    }
-
-    return directives;
-  }
-  /**
-   * Directive[Const] : @ Name Arguments[?Const]?
-   */
-  ;
-
-  _proto.parseDirective = function parseDirective(isConst) {
-    var start = this._lexer.token;
-    this.expectToken(_tokenKind.TokenKind.AT);
-    return {
-      kind: _kinds.Kind.DIRECTIVE,
-      name: this.parseName(),
-      arguments: this.parseArguments(isConst),
-      loc: this.loc(start)
-    };
-  } // Implements the parsing rules in the Types section.
-
-  /**
-   * Type :
-   *   - NamedType
-   *   - ListType
-   *   - NonNullType
-   */
-  ;
-
-  _proto.parseTypeReference = function parseTypeReference() {
-    var start = this._lexer.token;
-    var type;
-
-    if (this.expectOptionalToken(_tokenKind.TokenKind.BRACKET_L)) {
-      type = this.parseTypeReference();
-      this.expectToken(_tokenKind.TokenKind.BRACKET_R);
-      type = {
-        kind: _kinds.Kind.LIST_TYPE,
-        type: type,
-        loc: this.loc(start)
-      };
-    } else {
-      type = this.parseNamedType();
-    }
-
-    if (this.expectOptionalToken(_tokenKind.TokenKind.BANG)) {
-      return {
-        kind: _kinds.Kind.NON_NULL_TYPE,
-        type: type,
-        loc: this.loc(start)
-      };
-    }
-
-    return type;
-  }
-  /**
-   * NamedType : Name
-   */
-  ;
-
-  _proto.parseNamedType = function parseNamedType() {
-    var start = this._lexer.token;
-    return {
-      kind: _kinds.Kind.NAMED_TYPE,
-      name: this.parseName(),
-      loc: this.loc(start)
-    };
-  } // Implements the parsing rules in the Type Definition section.
-
-  /**
-   * TypeSystemDefinition :
-   *   - SchemaDefinition
-   *   - TypeDefinition
-   *   - DirectiveDefinition
-   *
-   * TypeDefinition :
-   *   - ScalarTypeDefinition
-   *   - ObjectTypeDefinition
-   *   - InterfaceTypeDefinition
-   *   - UnionTypeDefinition
-   *   - EnumTypeDefinition
-   *   - InputObjectTypeDefinition
-   */
-  ;
-
-  _proto.parseTypeSystemDefinition = function parseTypeSystemDefinition() {
-    // Many definitions begin with a description and require a lookahead.
-    var keywordToken = this.peekDescription() ? this._lexer.lookahead() : this._lexer.token;
-
-    if (keywordToken.kind === _tokenKind.TokenKind.NAME) {
-      switch (keywordToken.value) {
-        case 'schema':
-          return this.parseSchemaDefinition();
-
-        case 'scalar':
-          return this.parseScalarTypeDefinition();
-
-        case 'type':
-          return this.parseObjectTypeDefinition();
-
-        case 'interface':
-          return this.parseInterfaceTypeDefinition();
-
-        case 'union':
-          return this.parseUnionTypeDefinition();
-
-        case 'enum':
-          return this.parseEnumTypeDefinition();
-
-        case 'input':
-          return this.parseInputObjectTypeDefinition();
-
-        case 'directive':
-          return this.parseDirectiveDefinition();
-      }
-    }
-
-    throw this.unexpected(keywordToken);
-  };
-
-  _proto.peekDescription = function peekDescription() {
-    return this.peek(_tokenKind.TokenKind.STRING) || this.peek(_tokenKind.TokenKind.BLOCK_STRING);
-  }
-  /**
-   * Description : StringValue
-   */
-  ;
-
-  _proto.parseDescription = function parseDescription() {
-    if (this.peekDescription()) {
-      return this.parseStringLiteral();
-    }
-  }
-  /**
-   * SchemaDefinition : Description? schema Directives[Const]? { OperationTypeDefinition+ }
-   */
-  ;
-
-  _proto.parseSchemaDefinition = function parseSchemaDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('schema');
-    var directives = this.parseDirectives(true);
-    var operationTypes = this.many(_tokenKind.TokenKind.BRACE_L, this.parseOperationTypeDefinition, _tokenKind.TokenKind.BRACE_R);
-    return {
-      kind: _kinds.Kind.SCHEMA_DEFINITION,
-      description: description,
-      directives: directives,
-      operationTypes: operationTypes,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * OperationTypeDefinition : OperationType : NamedType
-   */
-  ;
-
-  _proto.parseOperationTypeDefinition = function parseOperationTypeDefinition() {
-    var start = this._lexer.token;
-    var operation = this.parseOperationType();
-    this.expectToken(_tokenKind.TokenKind.COLON);
-    var type = this.parseNamedType();
-    return {
-      kind: _kinds.Kind.OPERATION_TYPE_DEFINITION,
-      operation: operation,
-      type: type,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ScalarTypeDefinition : Description? scalar Name Directives[Const]?
-   */
-  ;
-
-  _proto.parseScalarTypeDefinition = function parseScalarTypeDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('scalar');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    return {
-      kind: _kinds.Kind.SCALAR_TYPE_DEFINITION,
-      description: description,
-      name: name,
-      directives: directives,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ObjectTypeDefinition :
-   *   Description?
-   *   type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition?
-   */
-  ;
-
-  _proto.parseObjectTypeDefinition = function parseObjectTypeDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('type');
-    var name = this.parseName();
-    var interfaces = this.parseImplementsInterfaces();
-    var directives = this.parseDirectives(true);
-    var fields = this.parseFieldsDefinition();
-    return {
-      kind: _kinds.Kind.OBJECT_TYPE_DEFINITION,
-      description: description,
-      name: name,
-      interfaces: interfaces,
-      directives: directives,
-      fields: fields,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ImplementsInterfaces :
-   *   - implements `&`? NamedType
-   *   - ImplementsInterfaces & NamedType
-   */
-  ;
-
-  _proto.parseImplementsInterfaces = function parseImplementsInterfaces() {
-    var types = [];
-
-    if (this.expectOptionalKeyword('implements')) {
-      // Optional leading ampersand
-      this.expectOptionalToken(_tokenKind.TokenKind.AMP);
-
-      do {
-        var _this$_options2;
-
-        types.push(this.parseNamedType());
-      } while (this.expectOptionalToken(_tokenKind.TokenKind.AMP) || // Legacy support for the SDL?
-      ((_this$_options2 = this._options) === null || _this$_options2 === void 0 ? void 0 : _this$_options2.allowLegacySDLImplementsInterfaces) === true && this.peek(_tokenKind.TokenKind.NAME));
-    }
-
-    return types;
-  }
-  /**
-   * FieldsDefinition : { FieldDefinition+ }
-   */
-  ;
-
-  _proto.parseFieldsDefinition = function parseFieldsDefinition() {
-    var _this$_options3;
-
-    // Legacy support for the SDL?
-    if (((_this$_options3 = this._options) === null || _this$_options3 === void 0 ? void 0 : _this$_options3.allowLegacySDLEmptyFields) === true && this.peek(_tokenKind.TokenKind.BRACE_L) && this._lexer.lookahead().kind === _tokenKind.TokenKind.BRACE_R) {
-      this._lexer.advance();
-
-      this._lexer.advance();
-
-      return [];
-    }
-
-    return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseFieldDefinition, _tokenKind.TokenKind.BRACE_R);
-  }
-  /**
-   * FieldDefinition :
-   *   - Description? Name ArgumentsDefinition? : Type Directives[Const]?
-   */
-  ;
-
-  _proto.parseFieldDefinition = function parseFieldDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    var name = this.parseName();
-    var args = this.parseArgumentDefs();
-    this.expectToken(_tokenKind.TokenKind.COLON);
-    var type = this.parseTypeReference();
-    var directives = this.parseDirectives(true);
-    return {
-      kind: _kinds.Kind.FIELD_DEFINITION,
-      description: description,
-      name: name,
-      arguments: args,
-      type: type,
-      directives: directives,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ArgumentsDefinition : ( InputValueDefinition+ )
-   */
-  ;
-
-  _proto.parseArgumentDefs = function parseArgumentDefs() {
-    return this.optionalMany(_tokenKind.TokenKind.PAREN_L, this.parseInputValueDef, _tokenKind.TokenKind.PAREN_R);
-  }
-  /**
-   * InputValueDefinition :
-   *   - Description? Name : Type DefaultValue? Directives[Const]?
-   */
-  ;
-
-  _proto.parseInputValueDef = function parseInputValueDef() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    var name = this.parseName();
-    this.expectToken(_tokenKind.TokenKind.COLON);
-    var type = this.parseTypeReference();
-    var defaultValue;
-
-    if (this.expectOptionalToken(_tokenKind.TokenKind.EQUALS)) {
-      defaultValue = this.parseValueLiteral(true);
-    }
-
-    var directives = this.parseDirectives(true);
-    return {
-      kind: _kinds.Kind.INPUT_VALUE_DEFINITION,
-      description: description,
-      name: name,
-      type: type,
-      defaultValue: defaultValue,
-      directives: directives,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * InterfaceTypeDefinition :
-   *   - Description? interface Name Directives[Const]? FieldsDefinition?
-   */
-  ;
-
-  _proto.parseInterfaceTypeDefinition = function parseInterfaceTypeDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('interface');
-    var name = this.parseName();
-    var interfaces = this.parseImplementsInterfaces();
-    var directives = this.parseDirectives(true);
-    var fields = this.parseFieldsDefinition();
-    return {
-      kind: _kinds.Kind.INTERFACE_TYPE_DEFINITION,
-      description: description,
-      name: name,
-      interfaces: interfaces,
-      directives: directives,
-      fields: fields,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * UnionTypeDefinition :
-   *   - Description? union Name Directives[Const]? UnionMemberTypes?
-   */
-  ;
-
-  _proto.parseUnionTypeDefinition = function parseUnionTypeDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('union');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    var types = this.parseUnionMemberTypes();
-    return {
-      kind: _kinds.Kind.UNION_TYPE_DEFINITION,
-      description: description,
-      name: name,
-      directives: directives,
-      types: types,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * UnionMemberTypes :
-   *   - = `|`? NamedType
-   *   - UnionMemberTypes | NamedType
-   */
-  ;
-
-  _proto.parseUnionMemberTypes = function parseUnionMemberTypes() {
-    var types = [];
-
-    if (this.expectOptionalToken(_tokenKind.TokenKind.EQUALS)) {
-      // Optional leading pipe
-      this.expectOptionalToken(_tokenKind.TokenKind.PIPE);
-
-      do {
-        types.push(this.parseNamedType());
-      } while (this.expectOptionalToken(_tokenKind.TokenKind.PIPE));
-    }
-
-    return types;
-  }
-  /**
-   * EnumTypeDefinition :
-   *   - Description? enum Name Directives[Const]? EnumValuesDefinition?
-   */
-  ;
-
-  _proto.parseEnumTypeDefinition = function parseEnumTypeDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('enum');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    var values = this.parseEnumValuesDefinition();
-    return {
-      kind: _kinds.Kind.ENUM_TYPE_DEFINITION,
-      description: description,
-      name: name,
-      directives: directives,
-      values: values,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * EnumValuesDefinition : { EnumValueDefinition+ }
-   */
-  ;
-
-  _proto.parseEnumValuesDefinition = function parseEnumValuesDefinition() {
-    return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseEnumValueDefinition, _tokenKind.TokenKind.BRACE_R);
-  }
-  /**
-   * EnumValueDefinition : Description? EnumValue Directives[Const]?
-   *
-   * EnumValue : Name
-   */
-  ;
-
-  _proto.parseEnumValueDefinition = function parseEnumValueDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    return {
-      kind: _kinds.Kind.ENUM_VALUE_DEFINITION,
-      description: description,
-      name: name,
-      directives: directives,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * InputObjectTypeDefinition :
-   *   - Description? input Name Directives[Const]? InputFieldsDefinition?
-   */
-  ;
-
-  _proto.parseInputObjectTypeDefinition = function parseInputObjectTypeDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('input');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    var fields = this.parseInputFieldsDefinition();
-    return {
-      kind: _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION,
-      description: description,
-      name: name,
-      directives: directives,
-      fields: fields,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * InputFieldsDefinition : { InputValueDefinition+ }
-   */
-  ;
-
-  _proto.parseInputFieldsDefinition = function parseInputFieldsDefinition() {
-    return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseInputValueDef, _tokenKind.TokenKind.BRACE_R);
-  }
-  /**
-   * TypeSystemExtension :
-   *   - SchemaExtension
-   *   - TypeExtension
-   *
-   * TypeExtension :
-   *   - ScalarTypeExtension
-   *   - ObjectTypeExtension
-   *   - InterfaceTypeExtension
-   *   - UnionTypeExtension
-   *   - EnumTypeExtension
-   *   - InputObjectTypeDefinition
-   */
-  ;
-
-  _proto.parseTypeSystemExtension = function parseTypeSystemExtension() {
-    var keywordToken = this._lexer.lookahead();
-
-    if (keywordToken.kind === _tokenKind.TokenKind.NAME) {
-      switch (keywordToken.value) {
-        case 'schema':
-          return this.parseSchemaExtension();
-
-        case 'scalar':
-          return this.parseScalarTypeExtension();
-
-        case 'type':
-          return this.parseObjectTypeExtension();
-
-        case 'interface':
-          return this.parseInterfaceTypeExtension();
-
-        case 'union':
-          return this.parseUnionTypeExtension();
-
-        case 'enum':
-          return this.parseEnumTypeExtension();
-
-        case 'input':
-          return this.parseInputObjectTypeExtension();
-      }
-    }
-
-    throw this.unexpected(keywordToken);
-  }
-  /**
-   * SchemaExtension :
-   *  - extend schema Directives[Const]? { OperationTypeDefinition+ }
-   *  - extend schema Directives[Const]
-   */
-  ;
-
-  _proto.parseSchemaExtension = function parseSchemaExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('schema');
-    var directives = this.parseDirectives(true);
-    var operationTypes = this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseOperationTypeDefinition, _tokenKind.TokenKind.BRACE_R);
-
-    if (directives.length === 0 && operationTypes.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: _kinds.Kind.SCHEMA_EXTENSION,
-      directives: directives,
-      operationTypes: operationTypes,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ScalarTypeExtension :
-   *   - extend scalar Name Directives[Const]
-   */
-  ;
-
-  _proto.parseScalarTypeExtension = function parseScalarTypeExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('scalar');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-
-    if (directives.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: _kinds.Kind.SCALAR_TYPE_EXTENSION,
-      name: name,
-      directives: directives,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ObjectTypeExtension :
-   *  - extend type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition
-   *  - extend type Name ImplementsInterfaces? Directives[Const]
-   *  - extend type Name ImplementsInterfaces
-   */
-  ;
-
-  _proto.parseObjectTypeExtension = function parseObjectTypeExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('type');
-    var name = this.parseName();
-    var interfaces = this.parseImplementsInterfaces();
-    var directives = this.parseDirectives(true);
-    var fields = this.parseFieldsDefinition();
-
-    if (interfaces.length === 0 && directives.length === 0 && fields.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: _kinds.Kind.OBJECT_TYPE_EXTENSION,
-      name: name,
-      interfaces: interfaces,
-      directives: directives,
-      fields: fields,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * InterfaceTypeExtension :
-   *  - extend interface Name ImplementsInterfaces? Directives[Const]? FieldsDefinition
-   *  - extend interface Name ImplementsInterfaces? Directives[Const]
-   *  - extend interface Name ImplementsInterfaces
-   */
-  ;
-
-  _proto.parseInterfaceTypeExtension = function parseInterfaceTypeExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('interface');
-    var name = this.parseName();
-    var interfaces = this.parseImplementsInterfaces();
-    var directives = this.parseDirectives(true);
-    var fields = this.parseFieldsDefinition();
-
-    if (interfaces.length === 0 && directives.length === 0 && fields.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: _kinds.Kind.INTERFACE_TYPE_EXTENSION,
-      name: name,
-      interfaces: interfaces,
-      directives: directives,
-      fields: fields,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * UnionTypeExtension :
-   *   - extend union Name Directives[Const]? UnionMemberTypes
-   *   - extend union Name Directives[Const]
-   */
-  ;
-
-  _proto.parseUnionTypeExtension = function parseUnionTypeExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('union');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    var types = this.parseUnionMemberTypes();
-
-    if (directives.length === 0 && types.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: _kinds.Kind.UNION_TYPE_EXTENSION,
-      name: name,
-      directives: directives,
-      types: types,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * EnumTypeExtension :
-   *   - extend enum Name Directives[Const]? EnumValuesDefinition
-   *   - extend enum Name Directives[Const]
-   */
-  ;
-
-  _proto.parseEnumTypeExtension = function parseEnumTypeExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('enum');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    var values = this.parseEnumValuesDefinition();
-
-    if (directives.length === 0 && values.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: _kinds.Kind.ENUM_TYPE_EXTENSION,
-      name: name,
-      directives: directives,
-      values: values,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * InputObjectTypeExtension :
-   *   - extend input Name Directives[Const]? InputFieldsDefinition
-   *   - extend input Name Directives[Const]
-   */
-  ;
-
-  _proto.parseInputObjectTypeExtension = function parseInputObjectTypeExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('input');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    var fields = this.parseInputFieldsDefinition();
-
-    if (directives.length === 0 && fields.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION,
-      name: name,
-      directives: directives,
-      fields: fields,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * DirectiveDefinition :
-   *   - Description? directive @ Name ArgumentsDefinition? `repeatable`? on DirectiveLocations
-   */
-  ;
-
-  _proto.parseDirectiveDefinition = function parseDirectiveDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('directive');
-    this.expectToken(_tokenKind.TokenKind.AT);
-    var name = this.parseName();
-    var args = this.parseArgumentDefs();
-    var repeatable = this.expectOptionalKeyword('repeatable');
-    this.expectKeyword('on');
-    var locations = this.parseDirectiveLocations();
-    return {
-      kind: _kinds.Kind.DIRECTIVE_DEFINITION,
-      description: description,
-      name: name,
-      arguments: args,
-      repeatable: repeatable,
-      locations: locations,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * DirectiveLocations :
-   *   - `|`? DirectiveLocation
-   *   - DirectiveLocations | DirectiveLocation
-   */
-  ;
-
-  _proto.parseDirectiveLocations = function parseDirectiveLocations() {
-    // Optional leading pipe
-    this.expectOptionalToken(_tokenKind.TokenKind.PIPE);
-    var locations = [];
-
-    do {
-      locations.push(this.parseDirectiveLocation());
-    } while (this.expectOptionalToken(_tokenKind.TokenKind.PIPE));
-
-    return locations;
-  }
-  /*
-   * DirectiveLocation :
-   *   - ExecutableDirectiveLocation
-   *   - TypeSystemDirectiveLocation
-   *
-   * ExecutableDirectiveLocation : one of
-   *   `QUERY`
-   *   `MUTATION`
-   *   `SUBSCRIPTION`
-   *   `FIELD`
-   *   `FRAGMENT_DEFINITION`
-   *   `FRAGMENT_SPREAD`
-   *   `INLINE_FRAGMENT`
-   *
-   * TypeSystemDirectiveLocation : one of
-   *   `SCHEMA`
-   *   `SCALAR`
-   *   `OBJECT`
-   *   `FIELD_DEFINITION`
-   *   `ARGUMENT_DEFINITION`
-   *   `INTERFACE`
-   *   `UNION`
-   *   `ENUM`
-   *   `ENUM_VALUE`
-   *   `INPUT_OBJECT`
-   *   `INPUT_FIELD_DEFINITION`
-   */
-  ;
-
-  _proto.parseDirectiveLocation = function parseDirectiveLocation() {
-    var start = this._lexer.token;
-    var name = this.parseName();
-
-    if (_directiveLocation.DirectiveLocation[name.value] !== undefined) {
-      return name;
-    }
-
-    throw this.unexpected(start);
-  } // Core parsing utility functions
-
-  /**
-   * Returns a location object, used to identify the place in
-   * the source that created a given parsed object.
-   */
-  ;
-
-  _proto.loc = function loc(startToken) {
-    var _this$_options4;
-
-    if (((_this$_options4 = this._options) === null || _this$_options4 === void 0 ? void 0 : _this$_options4.noLocation) !== true) {
-      return new _ast.Location(startToken, this._lexer.lastToken, this._lexer.source);
-    }
-  }
-  /**
-   * Determines if the next token is of a given kind
-   */
-  ;
-
-  _proto.peek = function peek(kind) {
-    return this._lexer.token.kind === kind;
-  }
-  /**
-   * If the next token is of the given kind, return that token after advancing
-   * the lexer. Otherwise, do not change the parser state and throw an error.
-   */
-  ;
-
-  _proto.expectToken = function expectToken(kind) {
-    var token = this._lexer.token;
-
-    if (token.kind === kind) {
-      this._lexer.advance();
-
-      return token;
-    }
-
-    throw (0, _syntaxError.syntaxError)(this._lexer.source, token.start, "Expected ".concat(getTokenKindDesc(kind), ", found ").concat(getTokenDesc(token), "."));
-  }
-  /**
-   * If the next token is of the given kind, return that token after advancing
-   * the lexer. Otherwise, do not change the parser state and return undefined.
-   */
-  ;
-
-  _proto.expectOptionalToken = function expectOptionalToken(kind) {
-    var token = this._lexer.token;
-
-    if (token.kind === kind) {
-      this._lexer.advance();
-
-      return token;
-    }
-
-    return undefined;
-  }
-  /**
-   * If the next token is a given keyword, advance the lexer.
-   * Otherwise, do not change the parser state and throw an error.
-   */
-  ;
-
-  _proto.expectKeyword = function expectKeyword(value) {
-    var token = this._lexer.token;
-
-    if (token.kind === _tokenKind.TokenKind.NAME && token.value === value) {
-      this._lexer.advance();
-    } else {
-      throw (0, _syntaxError.syntaxError)(this._lexer.source, token.start, "Expected \"".concat(value, "\", found ").concat(getTokenDesc(token), "."));
-    }
-  }
-  /**
-   * If the next token is a given keyword, return "true" after advancing
-   * the lexer. Otherwise, do not change the parser state and return "false".
-   */
-  ;
-
-  _proto.expectOptionalKeyword = function expectOptionalKeyword(value) {
-    var token = this._lexer.token;
-
-    if (token.kind === _tokenKind.TokenKind.NAME && token.value === value) {
-      this._lexer.advance();
-
-      return true;
-    }
-
-    return false;
-  }
-  /**
-   * Helper function for creating an error when an unexpected lexed token
-   * is encountered.
-   */
-  ;
-
-  _proto.unexpected = function unexpected(atToken) {
-    var token = atToken !== null && atToken !== void 0 ? atToken : this._lexer.token;
-    return (0, _syntaxError.syntaxError)(this._lexer.source, token.start, "Unexpected ".concat(getTokenDesc(token), "."));
-  }
-  /**
-   * Returns a possibly empty list of parse nodes, determined by
-   * the parseFn. This list begins with a lex token of openKind
-   * and ends with a lex token of closeKind. Advances the parser
-   * to the next lex token after the closing token.
-   */
-  ;
-
-  _proto.any = function any(openKind, parseFn, closeKind) {
-    this.expectToken(openKind);
-    var nodes = [];
-
-    while (!this.expectOptionalToken(closeKind)) {
-      nodes.push(parseFn.call(this));
-    }
-
-    return nodes;
-  }
-  /**
-   * Returns a list of parse nodes, determined by the parseFn.
-   * It can be empty only if open token is missing otherwise it will always
-   * return non-empty list that begins with a lex token of openKind and ends
-   * with a lex token of closeKind. Advances the parser to the next lex token
-   * after the closing token.
-   */
-  ;
-
-  _proto.optionalMany = function optionalMany(openKind, parseFn, closeKind) {
-    if (this.expectOptionalToken(openKind)) {
-      var nodes = [];
-
-      do {
-        nodes.push(parseFn.call(this));
-      } while (!this.expectOptionalToken(closeKind));
-
-      return nodes;
-    }
-
-    return [];
-  }
-  /**
-   * Returns a non-empty list of parse nodes, determined by
-   * the parseFn. This list begins with a lex token of openKind
-   * and ends with a lex token of closeKind. Advances the parser
-   * to the next lex token after the closing token.
-   */
-  ;
-
-  _proto.many = function many(openKind, parseFn, closeKind) {
-    this.expectToken(openKind);
-    var nodes = [];
-
-    do {
-      nodes.push(parseFn.call(this));
-    } while (!this.expectOptionalToken(closeKind));
-
-    return nodes;
-  };
-
-  return Parser;
-}();
-/**
- * A helper function to describe a token as a string for debugging
- */
-
-
-function getTokenDesc(token) {
-  var value = token.value;
-  return getTokenKindDesc(token.kind) + (value != null ? " \"".concat(value, "\"") : '');
-}
-/**
- * A helper function to describe a token kind as a string for debugging
- */
-
-
-function getTokenKindDesc(kind) {
-  return (0, _lexer.isPunctuatorTokenKind)(kind) ? "\"".concat(kind, "\"") : kind;
-}
diff --git a/node_modules/graphql/language/parser.js.flow b/node_modules/graphql/language/parser.js.flow
deleted file mode 100644
index 2fdcdc6..0000000
--- a/node_modules/graphql/language/parser.js.flow
+++ /dev/null
@@ -1,1562 +0,0 @@
-// @flow strict
-
-import inspect from '../jsutils/inspect';
-import devAssert from '../jsutils/devAssert';
-
-import { syntaxError } from '../error/syntaxError';
-import { type GraphQLError } from '../error/GraphQLError';
-
-import { Kind } from './kinds';
-import { Source } from './source';
-import { DirectiveLocation } from './directiveLocation';
-import { type TokenKindEnum, TokenKind } from './tokenKind';
-import { Lexer, isPunctuatorTokenKind } from './lexer';
-import {
-  Location,
-  type Token,
-  type NameNode,
-  type VariableNode,
-  type DocumentNode,
-  type DefinitionNode,
-  type OperationDefinitionNode,
-  type OperationTypeNode,
-  type VariableDefinitionNode,
-  type SelectionSetNode,
-  type SelectionNode,
-  type FieldNode,
-  type ArgumentNode,
-  type FragmentSpreadNode,
-  type InlineFragmentNode,
-  type FragmentDefinitionNode,
-  type ValueNode,
-  type StringValueNode,
-  type ListValueNode,
-  type ObjectValueNode,
-  type ObjectFieldNode,
-  type DirectiveNode,
-  type TypeNode,
-  type NamedTypeNode,
-  type TypeSystemDefinitionNode,
-  type SchemaDefinitionNode,
-  type OperationTypeDefinitionNode,
-  type ScalarTypeDefinitionNode,
-  type ObjectTypeDefinitionNode,
-  type FieldDefinitionNode,
-  type InputValueDefinitionNode,
-  type InterfaceTypeDefinitionNode,
-  type UnionTypeDefinitionNode,
-  type EnumTypeDefinitionNode,
-  type EnumValueDefinitionNode,
-  type InputObjectTypeDefinitionNode,
-  type DirectiveDefinitionNode,
-  type TypeSystemExtensionNode,
-  type SchemaExtensionNode,
-  type ScalarTypeExtensionNode,
-  type ObjectTypeExtensionNode,
-  type InterfaceTypeExtensionNode,
-  type UnionTypeExtensionNode,
-  type EnumTypeExtensionNode,
-  type InputObjectTypeExtensionNode,
-} from './ast';
-
-/**
- * Configuration options to control parser behavior
- */
-export type ParseOptions = {|
-  /**
-   * By default, the parser creates AST nodes that know the location
-   * in the source that they correspond to. This configuration flag
-   * disables that behavior for performance or testing.
-   */
-  noLocation?: boolean,
-
-  /**
-   * If enabled, the parser will parse empty fields sets in the Schema
-   * Definition Language. Otherwise, the parser will follow the current
-   * specification.
-   *
-   * This option is provided to ease adoption of the final SDL specification
-   * and will be removed in v16.
-   */
-  allowLegacySDLEmptyFields?: boolean,
-
-  /**
-   * If enabled, the parser will parse implemented interfaces with no `&`
-   * character between each interface. Otherwise, the parser will follow the
-   * current specification.
-   *
-   * This option is provided to ease adoption of the final SDL specification
-   * and will be removed in v16.
-   */
-  allowLegacySDLImplementsInterfaces?: boolean,
-
-  /**
-   * EXPERIMENTAL:
-   *
-   * If enabled, the parser will understand and parse variable definitions
-   * contained in a fragment definition. They'll be represented in the
-   * `variableDefinitions` field of the FragmentDefinitionNode.
-   *
-   * The syntax is identical to normal, query-defined variables. For example:
-   *
-   *   fragment A($var: Boolean = false) on T  {
-   *     ...
-   *   }
-   *
-   * Note: this feature is experimental and may change or be removed in the
-   * future.
-   */
-  experimentalFragmentVariables?: boolean,
-|};
-
-/**
- * Given a GraphQL source, parses it into a Document.
- * Throws GraphQLError if a syntax error is encountered.
- */
-export function parse(
-  source: string | Source,
-  options?: ParseOptions,
-): DocumentNode {
-  const parser = new Parser(source, options);
-  return parser.parseDocument();
-}
-
-/**
- * Given a string containing a GraphQL value (ex. `[42]`), parse the AST for
- * that value.
- * Throws GraphQLError if a syntax error is encountered.
- *
- * This is useful within tools that operate upon GraphQL Values directly and
- * in isolation of complete GraphQL documents.
- *
- * Consider providing the results to the utility function: valueFromAST().
- */
-export function parseValue(
-  source: string | Source,
-  options?: ParseOptions,
-): ValueNode {
-  const parser = new Parser(source, options);
-  parser.expectToken(TokenKind.SOF);
-  const value = parser.parseValueLiteral(false);
-  parser.expectToken(TokenKind.EOF);
-  return value;
-}
-
-/**
- * Given a string containing a GraphQL Type (ex. `[Int!]`), parse the AST for
- * that type.
- * Throws GraphQLError if a syntax error is encountered.
- *
- * This is useful within tools that operate upon GraphQL Types directly and
- * in isolation of complete GraphQL documents.
- *
- * Consider providing the results to the utility function: typeFromAST().
- */
-export function parseType(
-  source: string | Source,
-  options?: ParseOptions,
-): TypeNode {
-  const parser = new Parser(source, options);
-  parser.expectToken(TokenKind.SOF);
-  const type = parser.parseTypeReference();
-  parser.expectToken(TokenKind.EOF);
-  return type;
-}
-
-class Parser {
-  _options: ?ParseOptions;
-  _lexer: Lexer;
-
-  constructor(source: string | Source, options?: ParseOptions) {
-    const sourceObj = typeof source === 'string' ? new Source(source) : source;
-    devAssert(
-      sourceObj instanceof Source,
-      `Must provide Source. Received: ${inspect(sourceObj)}.`,
-    );
-
-    this._lexer = new Lexer(sourceObj);
-    this._options = options;
-  }
-
-  /**
-   * Converts a name lex token into a name parse node.
-   */
-  parseName(): NameNode {
-    const token = this.expectToken(TokenKind.NAME);
-    return {
-      kind: Kind.NAME,
-      value: ((token.value: any): string),
-      loc: this.loc(token),
-    };
-  }
-
-  // Implements the parsing rules in the Document section.
-
-  /**
-   * Document : Definition+
-   */
-  parseDocument(): DocumentNode {
-    const start = this._lexer.token;
-    return {
-      kind: Kind.DOCUMENT,
-      definitions: this.many(
-        TokenKind.SOF,
-        this.parseDefinition,
-        TokenKind.EOF,
-      ),
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * Definition :
-   *   - ExecutableDefinition
-   *   - TypeSystemDefinition
-   *   - TypeSystemExtension
-   *
-   * ExecutableDefinition :
-   *   - OperationDefinition
-   *   - FragmentDefinition
-   */
-  parseDefinition(): DefinitionNode {
-    if (this.peek(TokenKind.NAME)) {
-      switch (this._lexer.token.value) {
-        case 'query':
-        case 'mutation':
-        case 'subscription':
-          return this.parseOperationDefinition();
-        case 'fragment':
-          return this.parseFragmentDefinition();
-        case 'schema':
-        case 'scalar':
-        case 'type':
-        case 'interface':
-        case 'union':
-        case 'enum':
-        case 'input':
-        case 'directive':
-          return this.parseTypeSystemDefinition();
-        case 'extend':
-          return this.parseTypeSystemExtension();
-      }
-    } else if (this.peek(TokenKind.BRACE_L)) {
-      return this.parseOperationDefinition();
-    } else if (this.peekDescription()) {
-      return this.parseTypeSystemDefinition();
-    }
-
-    throw this.unexpected();
-  }
-
-  // Implements the parsing rules in the Operations section.
-
-  /**
-   * OperationDefinition :
-   *  - SelectionSet
-   *  - OperationType Name? VariableDefinitions? Directives? SelectionSet
-   */
-  parseOperationDefinition(): OperationDefinitionNode {
-    const start = this._lexer.token;
-    if (this.peek(TokenKind.BRACE_L)) {
-      return {
-        kind: Kind.OPERATION_DEFINITION,
-        operation: 'query',
-        name: undefined,
-        variableDefinitions: [],
-        directives: [],
-        selectionSet: this.parseSelectionSet(),
-        loc: this.loc(start),
-      };
-    }
-    const operation = this.parseOperationType();
-    let name;
-    if (this.peek(TokenKind.NAME)) {
-      name = this.parseName();
-    }
-    return {
-      kind: Kind.OPERATION_DEFINITION,
-      operation,
-      name,
-      variableDefinitions: this.parseVariableDefinitions(),
-      directives: this.parseDirectives(false),
-      selectionSet: this.parseSelectionSet(),
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * OperationType : one of query mutation subscription
-   */
-  parseOperationType(): OperationTypeNode {
-    const operationToken = this.expectToken(TokenKind.NAME);
-    switch (operationToken.value) {
-      case 'query':
-        return 'query';
-      case 'mutation':
-        return 'mutation';
-      case 'subscription':
-        return 'subscription';
-    }
-
-    throw this.unexpected(operationToken);
-  }
-
-  /**
-   * VariableDefinitions : ( VariableDefinition+ )
-   */
-  parseVariableDefinitions(): Array<VariableDefinitionNode> {
-    return this.optionalMany(
-      TokenKind.PAREN_L,
-      this.parseVariableDefinition,
-      TokenKind.PAREN_R,
-    );
-  }
-
-  /**
-   * VariableDefinition : Variable : Type DefaultValue? Directives[Const]?
-   */
-  parseVariableDefinition(): VariableDefinitionNode {
-    const start = this._lexer.token;
-    return {
-      kind: Kind.VARIABLE_DEFINITION,
-      variable: this.parseVariable(),
-      type: (this.expectToken(TokenKind.COLON), this.parseTypeReference()),
-      defaultValue: this.expectOptionalToken(TokenKind.EQUALS)
-        ? this.parseValueLiteral(true)
-        : undefined,
-      directives: this.parseDirectives(true),
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * Variable : $ Name
-   */
-  parseVariable(): VariableNode {
-    const start = this._lexer.token;
-    this.expectToken(TokenKind.DOLLAR);
-    return {
-      kind: Kind.VARIABLE,
-      name: this.parseName(),
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * SelectionSet : { Selection+ }
-   */
-  parseSelectionSet(): SelectionSetNode {
-    const start = this._lexer.token;
-    return {
-      kind: Kind.SELECTION_SET,
-      selections: this.many(
-        TokenKind.BRACE_L,
-        this.parseSelection,
-        TokenKind.BRACE_R,
-      ),
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * Selection :
-   *   - Field
-   *   - FragmentSpread
-   *   - InlineFragment
-   */
-  parseSelection(): SelectionNode {
-    return this.peek(TokenKind.SPREAD)
-      ? this.parseFragment()
-      : this.parseField();
-  }
-
-  /**
-   * Field : Alias? Name Arguments? Directives? SelectionSet?
-   *
-   * Alias : Name :
-   */
-  parseField(): FieldNode {
-    const start = this._lexer.token;
-
-    const nameOrAlias = this.parseName();
-    let alias;
-    let name;
-    if (this.expectOptionalToken(TokenKind.COLON)) {
-      alias = nameOrAlias;
-      name = this.parseName();
-    } else {
-      name = nameOrAlias;
-    }
-
-    return {
-      kind: Kind.FIELD,
-      alias,
-      name,
-      arguments: this.parseArguments(false),
-      directives: this.parseDirectives(false),
-      selectionSet: this.peek(TokenKind.BRACE_L)
-        ? this.parseSelectionSet()
-        : undefined,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * Arguments[Const] : ( Argument[?Const]+ )
-   */
-  parseArguments(isConst: boolean): Array<ArgumentNode> {
-    const item = isConst ? this.parseConstArgument : this.parseArgument;
-    return this.optionalMany(TokenKind.PAREN_L, item, TokenKind.PAREN_R);
-  }
-
-  /**
-   * Argument[Const] : Name : Value[?Const]
-   */
-  parseArgument(): ArgumentNode {
-    const start = this._lexer.token;
-    const name = this.parseName();
-
-    this.expectToken(TokenKind.COLON);
-    return {
-      kind: Kind.ARGUMENT,
-      name,
-      value: this.parseValueLiteral(false),
-      loc: this.loc(start),
-    };
-  }
-
-  parseConstArgument(): ArgumentNode {
-    const start = this._lexer.token;
-    return {
-      kind: Kind.ARGUMENT,
-      name: this.parseName(),
-      value: (this.expectToken(TokenKind.COLON), this.parseValueLiteral(true)),
-      loc: this.loc(start),
-    };
-  }
-
-  // Implements the parsing rules in the Fragments section.
-
-  /**
-   * Corresponds to both FragmentSpread and InlineFragment in the spec.
-   *
-   * FragmentSpread : ... FragmentName Directives?
-   *
-   * InlineFragment : ... TypeCondition? Directives? SelectionSet
-   */
-  parseFragment(): FragmentSpreadNode | InlineFragmentNode {
-    const start = this._lexer.token;
-    this.expectToken(TokenKind.SPREAD);
-
-    const hasTypeCondition = this.expectOptionalKeyword('on');
-    if (!hasTypeCondition && this.peek(TokenKind.NAME)) {
-      return {
-        kind: Kind.FRAGMENT_SPREAD,
-        name: this.parseFragmentName(),
-        directives: this.parseDirectives(false),
-        loc: this.loc(start),
-      };
-    }
-    return {
-      kind: Kind.INLINE_FRAGMENT,
-      typeCondition: hasTypeCondition ? this.parseNamedType() : undefined,
-      directives: this.parseDirectives(false),
-      selectionSet: this.parseSelectionSet(),
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * FragmentDefinition :
-   *   - fragment FragmentName on TypeCondition Directives? SelectionSet
-   *
-   * TypeCondition : NamedType
-   */
-  parseFragmentDefinition(): FragmentDefinitionNode {
-    const start = this._lexer.token;
-    this.expectKeyword('fragment');
-    // Experimental support for defining variables within fragments changes
-    // the grammar of FragmentDefinition:
-    //   - fragment FragmentName VariableDefinitions? on TypeCondition Directives? SelectionSet
-    if (this._options?.experimentalFragmentVariables === true) {
-      return {
-        kind: Kind.FRAGMENT_DEFINITION,
-        name: this.parseFragmentName(),
-        variableDefinitions: this.parseVariableDefinitions(),
-        typeCondition: (this.expectKeyword('on'), this.parseNamedType()),
-        directives: this.parseDirectives(false),
-        selectionSet: this.parseSelectionSet(),
-        loc: this.loc(start),
-      };
-    }
-    return {
-      kind: Kind.FRAGMENT_DEFINITION,
-      name: this.parseFragmentName(),
-      typeCondition: (this.expectKeyword('on'), this.parseNamedType()),
-      directives: this.parseDirectives(false),
-      selectionSet: this.parseSelectionSet(),
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * FragmentName : Name but not `on`
-   */
-  parseFragmentName(): NameNode {
-    if (this._lexer.token.value === 'on') {
-      throw this.unexpected();
-    }
-    return this.parseName();
-  }
-
-  // Implements the parsing rules in the Values section.
-
-  /**
-   * Value[Const] :
-   *   - [~Const] Variable
-   *   - IntValue
-   *   - FloatValue
-   *   - StringValue
-   *   - BooleanValue
-   *   - NullValue
-   *   - EnumValue
-   *   - ListValue[?Const]
-   *   - ObjectValue[?Const]
-   *
-   * BooleanValue : one of `true` `false`
-   *
-   * NullValue : `null`
-   *
-   * EnumValue : Name but not `true`, `false` or `null`
-   */
-  parseValueLiteral(isConst: boolean): ValueNode {
-    const token = this._lexer.token;
-    switch (token.kind) {
-      case TokenKind.BRACKET_L:
-        return this.parseList(isConst);
-      case TokenKind.BRACE_L:
-        return this.parseObject(isConst);
-      case TokenKind.INT:
-        this._lexer.advance();
-        return {
-          kind: Kind.INT,
-          value: ((token.value: any): string),
-          loc: this.loc(token),
-        };
-      case TokenKind.FLOAT:
-        this._lexer.advance();
-        return {
-          kind: Kind.FLOAT,
-          value: ((token.value: any): string),
-          loc: this.loc(token),
-        };
-      case TokenKind.STRING:
-      case TokenKind.BLOCK_STRING:
-        return this.parseStringLiteral();
-      case TokenKind.NAME:
-        this._lexer.advance();
-        switch (token.value) {
-          case 'true':
-            return { kind: Kind.BOOLEAN, value: true, loc: this.loc(token) };
-          case 'false':
-            return { kind: Kind.BOOLEAN, value: false, loc: this.loc(token) };
-          case 'null':
-            return { kind: Kind.NULL, loc: this.loc(token) };
-          default:
-            return {
-              kind: Kind.ENUM,
-              value: ((token.value: any): string),
-              loc: this.loc(token),
-            };
-        }
-      case TokenKind.DOLLAR:
-        if (!isConst) {
-          return this.parseVariable();
-        }
-        break;
-    }
-    throw this.unexpected();
-  }
-
-  parseStringLiteral(): StringValueNode {
-    const token = this._lexer.token;
-    this._lexer.advance();
-    return {
-      kind: Kind.STRING,
-      value: ((token.value: any): string),
-      block: token.kind === TokenKind.BLOCK_STRING,
-      loc: this.loc(token),
-    };
-  }
-
-  /**
-   * ListValue[Const] :
-   *   - [ ]
-   *   - [ Value[?Const]+ ]
-   */
-  parseList(isConst: boolean): ListValueNode {
-    const start = this._lexer.token;
-    const item = () => this.parseValueLiteral(isConst);
-    return {
-      kind: Kind.LIST,
-      values: this.any(TokenKind.BRACKET_L, item, TokenKind.BRACKET_R),
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * ObjectValue[Const] :
-   *   - { }
-   *   - { ObjectField[?Const]+ }
-   */
-  parseObject(isConst: boolean): ObjectValueNode {
-    const start = this._lexer.token;
-    const item = () => this.parseObjectField(isConst);
-    return {
-      kind: Kind.OBJECT,
-      fields: this.any(TokenKind.BRACE_L, item, TokenKind.BRACE_R),
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * ObjectField[Const] : Name : Value[?Const]
-   */
-  parseObjectField(isConst: boolean): ObjectFieldNode {
-    const start = this._lexer.token;
-    const name = this.parseName();
-    this.expectToken(TokenKind.COLON);
-
-    return {
-      kind: Kind.OBJECT_FIELD,
-      name,
-      value: this.parseValueLiteral(isConst),
-      loc: this.loc(start),
-    };
-  }
-
-  // Implements the parsing rules in the Directives section.
-
-  /**
-   * Directives[Const] : Directive[?Const]+
-   */
-  parseDirectives(isConst: boolean): Array<DirectiveNode> {
-    const directives = [];
-    while (this.peek(TokenKind.AT)) {
-      directives.push(this.parseDirective(isConst));
-    }
-    return directives;
-  }
-
-  /**
-   * Directive[Const] : @ Name Arguments[?Const]?
-   */
-  parseDirective(isConst: boolean): DirectiveNode {
-    const start = this._lexer.token;
-    this.expectToken(TokenKind.AT);
-    return {
-      kind: Kind.DIRECTIVE,
-      name: this.parseName(),
-      arguments: this.parseArguments(isConst),
-      loc: this.loc(start),
-    };
-  }
-
-  // Implements the parsing rules in the Types section.
-
-  /**
-   * Type :
-   *   - NamedType
-   *   - ListType
-   *   - NonNullType
-   */
-  parseTypeReference(): TypeNode {
-    const start = this._lexer.token;
-    let type;
-    if (this.expectOptionalToken(TokenKind.BRACKET_L)) {
-      type = this.parseTypeReference();
-      this.expectToken(TokenKind.BRACKET_R);
-      type = {
-        kind: Kind.LIST_TYPE,
-        type,
-        loc: this.loc(start),
-      };
-    } else {
-      type = this.parseNamedType();
-    }
-
-    if (this.expectOptionalToken(TokenKind.BANG)) {
-      return {
-        kind: Kind.NON_NULL_TYPE,
-        type,
-        loc: this.loc(start),
-      };
-    }
-    return type;
-  }
-
-  /**
-   * NamedType : Name
-   */
-  parseNamedType(): NamedTypeNode {
-    const start = this._lexer.token;
-    return {
-      kind: Kind.NAMED_TYPE,
-      name: this.parseName(),
-      loc: this.loc(start),
-    };
-  }
-
-  // Implements the parsing rules in the Type Definition section.
-
-  /**
-   * TypeSystemDefinition :
-   *   - SchemaDefinition
-   *   - TypeDefinition
-   *   - DirectiveDefinition
-   *
-   * TypeDefinition :
-   *   - ScalarTypeDefinition
-   *   - ObjectTypeDefinition
-   *   - InterfaceTypeDefinition
-   *   - UnionTypeDefinition
-   *   - EnumTypeDefinition
-   *   - InputObjectTypeDefinition
-   */
-  parseTypeSystemDefinition(): TypeSystemDefinitionNode {
-    // Many definitions begin with a description and require a lookahead.
-    const keywordToken = this.peekDescription()
-      ? this._lexer.lookahead()
-      : this._lexer.token;
-
-    if (keywordToken.kind === TokenKind.NAME) {
-      switch (keywordToken.value) {
-        case 'schema':
-          return this.parseSchemaDefinition();
-        case 'scalar':
-          return this.parseScalarTypeDefinition();
-        case 'type':
-          return this.parseObjectTypeDefinition();
-        case 'interface':
-          return this.parseInterfaceTypeDefinition();
-        case 'union':
-          return this.parseUnionTypeDefinition();
-        case 'enum':
-          return this.parseEnumTypeDefinition();
-        case 'input':
-          return this.parseInputObjectTypeDefinition();
-        case 'directive':
-          return this.parseDirectiveDefinition();
-      }
-    }
-
-    throw this.unexpected(keywordToken);
-  }
-
-  peekDescription(): boolean {
-    return this.peek(TokenKind.STRING) || this.peek(TokenKind.BLOCK_STRING);
-  }
-
-  /**
-   * Description : StringValue
-   */
-  parseDescription(): void | StringValueNode {
-    if (this.peekDescription()) {
-      return this.parseStringLiteral();
-    }
-  }
-
-  /**
-   * SchemaDefinition : Description? schema Directives[Const]? { OperationTypeDefinition+ }
-   */
-  parseSchemaDefinition(): SchemaDefinitionNode {
-    const start = this._lexer.token;
-    const description = this.parseDescription();
-    this.expectKeyword('schema');
-    const directives = this.parseDirectives(true);
-    const operationTypes = this.many(
-      TokenKind.BRACE_L,
-      this.parseOperationTypeDefinition,
-      TokenKind.BRACE_R,
-    );
-    return {
-      kind: Kind.SCHEMA_DEFINITION,
-      description,
-      directives,
-      operationTypes,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * OperationTypeDefinition : OperationType : NamedType
-   */
-  parseOperationTypeDefinition(): OperationTypeDefinitionNode {
-    const start = this._lexer.token;
-    const operation = this.parseOperationType();
-    this.expectToken(TokenKind.COLON);
-    const type = this.parseNamedType();
-    return {
-      kind: Kind.OPERATION_TYPE_DEFINITION,
-      operation,
-      type,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * ScalarTypeDefinition : Description? scalar Name Directives[Const]?
-   */
-  parseScalarTypeDefinition(): ScalarTypeDefinitionNode {
-    const start = this._lexer.token;
-    const description = this.parseDescription();
-    this.expectKeyword('scalar');
-    const name = this.parseName();
-    const directives = this.parseDirectives(true);
-    return {
-      kind: Kind.SCALAR_TYPE_DEFINITION,
-      description,
-      name,
-      directives,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * ObjectTypeDefinition :
-   *   Description?
-   *   type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition?
-   */
-  parseObjectTypeDefinition(): ObjectTypeDefinitionNode {
-    const start = this._lexer.token;
-    const description = this.parseDescription();
-    this.expectKeyword('type');
-    const name = this.parseName();
-    const interfaces = this.parseImplementsInterfaces();
-    const directives = this.parseDirectives(true);
-    const fields = this.parseFieldsDefinition();
-    return {
-      kind: Kind.OBJECT_TYPE_DEFINITION,
-      description,
-      name,
-      interfaces,
-      directives,
-      fields,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * ImplementsInterfaces :
-   *   - implements `&`? NamedType
-   *   - ImplementsInterfaces & NamedType
-   */
-  parseImplementsInterfaces(): Array<NamedTypeNode> {
-    const types = [];
-    if (this.expectOptionalKeyword('implements')) {
-      // Optional leading ampersand
-      this.expectOptionalToken(TokenKind.AMP);
-      do {
-        types.push(this.parseNamedType());
-      } while (
-        this.expectOptionalToken(TokenKind.AMP) ||
-        // Legacy support for the SDL?
-        (this._options?.allowLegacySDLImplementsInterfaces === true &&
-          this.peek(TokenKind.NAME))
-      );
-    }
-    return types;
-  }
-
-  /**
-   * FieldsDefinition : { FieldDefinition+ }
-   */
-  parseFieldsDefinition(): Array<FieldDefinitionNode> {
-    // Legacy support for the SDL?
-    if (
-      this._options?.allowLegacySDLEmptyFields === true &&
-      this.peek(TokenKind.BRACE_L) &&
-      this._lexer.lookahead().kind === TokenKind.BRACE_R
-    ) {
-      this._lexer.advance();
-      this._lexer.advance();
-      return [];
-    }
-    return this.optionalMany(
-      TokenKind.BRACE_L,
-      this.parseFieldDefinition,
-      TokenKind.BRACE_R,
-    );
-  }
-
-  /**
-   * FieldDefinition :
-   *   - Description? Name ArgumentsDefinition? : Type Directives[Const]?
-   */
-  parseFieldDefinition(): FieldDefinitionNode {
-    const start = this._lexer.token;
-    const description = this.parseDescription();
-    const name = this.parseName();
-    const args = this.parseArgumentDefs();
-    this.expectToken(TokenKind.COLON);
-    const type = this.parseTypeReference();
-    const directives = this.parseDirectives(true);
-    return {
-      kind: Kind.FIELD_DEFINITION,
-      description,
-      name,
-      arguments: args,
-      type,
-      directives,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * ArgumentsDefinition : ( InputValueDefinition+ )
-   */
-  parseArgumentDefs(): Array<InputValueDefinitionNode> {
-    return this.optionalMany(
-      TokenKind.PAREN_L,
-      this.parseInputValueDef,
-      TokenKind.PAREN_R,
-    );
-  }
-
-  /**
-   * InputValueDefinition :
-   *   - Description? Name : Type DefaultValue? Directives[Const]?
-   */
-  parseInputValueDef(): InputValueDefinitionNode {
-    const start = this._lexer.token;
-    const description = this.parseDescription();
-    const name = this.parseName();
-    this.expectToken(TokenKind.COLON);
-    const type = this.parseTypeReference();
-    let defaultValue;
-    if (this.expectOptionalToken(TokenKind.EQUALS)) {
-      defaultValue = this.parseValueLiteral(true);
-    }
-    const directives = this.parseDirectives(true);
-    return {
-      kind: Kind.INPUT_VALUE_DEFINITION,
-      description,
-      name,
-      type,
-      defaultValue,
-      directives,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * InterfaceTypeDefinition :
-   *   - Description? interface Name Directives[Const]? FieldsDefinition?
-   */
-  parseInterfaceTypeDefinition(): InterfaceTypeDefinitionNode {
-    const start = this._lexer.token;
-    const description = this.parseDescription();
-    this.expectKeyword('interface');
-    const name = this.parseName();
-    const interfaces = this.parseImplementsInterfaces();
-    const directives = this.parseDirectives(true);
-    const fields = this.parseFieldsDefinition();
-    return {
-      kind: Kind.INTERFACE_TYPE_DEFINITION,
-      description,
-      name,
-      interfaces,
-      directives,
-      fields,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * UnionTypeDefinition :
-   *   - Description? union Name Directives[Const]? UnionMemberTypes?
-   */
-  parseUnionTypeDefinition(): UnionTypeDefinitionNode {
-    const start = this._lexer.token;
-    const description = this.parseDescription();
-    this.expectKeyword('union');
-    const name = this.parseName();
-    const directives = this.parseDirectives(true);
-    const types = this.parseUnionMemberTypes();
-    return {
-      kind: Kind.UNION_TYPE_DEFINITION,
-      description,
-      name,
-      directives,
-      types,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * UnionMemberTypes :
-   *   - = `|`? NamedType
-   *   - UnionMemberTypes | NamedType
-   */
-  parseUnionMemberTypes(): Array<NamedTypeNode> {
-    const types = [];
-    if (this.expectOptionalToken(TokenKind.EQUALS)) {
-      // Optional leading pipe
-      this.expectOptionalToken(TokenKind.PIPE);
-      do {
-        types.push(this.parseNamedType());
-      } while (this.expectOptionalToken(TokenKind.PIPE));
-    }
-    return types;
-  }
-
-  /**
-   * EnumTypeDefinition :
-   *   - Description? enum Name Directives[Const]? EnumValuesDefinition?
-   */
-  parseEnumTypeDefinition(): EnumTypeDefinitionNode {
-    const start = this._lexer.token;
-    const description = this.parseDescription();
-    this.expectKeyword('enum');
-    const name = this.parseName();
-    const directives = this.parseDirectives(true);
-    const values = this.parseEnumValuesDefinition();
-    return {
-      kind: Kind.ENUM_TYPE_DEFINITION,
-      description,
-      name,
-      directives,
-      values,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * EnumValuesDefinition : { EnumValueDefinition+ }
-   */
-  parseEnumValuesDefinition(): Array<EnumValueDefinitionNode> {
-    return this.optionalMany(
-      TokenKind.BRACE_L,
-      this.parseEnumValueDefinition,
-      TokenKind.BRACE_R,
-    );
-  }
-
-  /**
-   * EnumValueDefinition : Description? EnumValue Directives[Const]?
-   *
-   * EnumValue : Name
-   */
-  parseEnumValueDefinition(): EnumValueDefinitionNode {
-    const start = this._lexer.token;
-    const description = this.parseDescription();
-    const name = this.parseName();
-    const directives = this.parseDirectives(true);
-    return {
-      kind: Kind.ENUM_VALUE_DEFINITION,
-      description,
-      name,
-      directives,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * InputObjectTypeDefinition :
-   *   - Description? input Name Directives[Const]? InputFieldsDefinition?
-   */
-  parseInputObjectTypeDefinition(): InputObjectTypeDefinitionNode {
-    const start = this._lexer.token;
-    const description = this.parseDescription();
-    this.expectKeyword('input');
-    const name = this.parseName();
-    const directives = this.parseDirectives(true);
-    const fields = this.parseInputFieldsDefinition();
-    return {
-      kind: Kind.INPUT_OBJECT_TYPE_DEFINITION,
-      description,
-      name,
-      directives,
-      fields,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * InputFieldsDefinition : { InputValueDefinition+ }
-   */
-  parseInputFieldsDefinition(): Array<InputValueDefinitionNode> {
-    return this.optionalMany(
-      TokenKind.BRACE_L,
-      this.parseInputValueDef,
-      TokenKind.BRACE_R,
-    );
-  }
-
-  /**
-   * TypeSystemExtension :
-   *   - SchemaExtension
-   *   - TypeExtension
-   *
-   * TypeExtension :
-   *   - ScalarTypeExtension
-   *   - ObjectTypeExtension
-   *   - InterfaceTypeExtension
-   *   - UnionTypeExtension
-   *   - EnumTypeExtension
-   *   - InputObjectTypeDefinition
-   */
-  parseTypeSystemExtension(): TypeSystemExtensionNode {
-    const keywordToken = this._lexer.lookahead();
-
-    if (keywordToken.kind === TokenKind.NAME) {
-      switch (keywordToken.value) {
-        case 'schema':
-          return this.parseSchemaExtension();
-        case 'scalar':
-          return this.parseScalarTypeExtension();
-        case 'type':
-          return this.parseObjectTypeExtension();
-        case 'interface':
-          return this.parseInterfaceTypeExtension();
-        case 'union':
-          return this.parseUnionTypeExtension();
-        case 'enum':
-          return this.parseEnumTypeExtension();
-        case 'input':
-          return this.parseInputObjectTypeExtension();
-      }
-    }
-
-    throw this.unexpected(keywordToken);
-  }
-
-  /**
-   * SchemaExtension :
-   *  - extend schema Directives[Const]? { OperationTypeDefinition+ }
-   *  - extend schema Directives[Const]
-   */
-  parseSchemaExtension(): SchemaExtensionNode {
-    const start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('schema');
-    const directives = this.parseDirectives(true);
-    const operationTypes = this.optionalMany(
-      TokenKind.BRACE_L,
-      this.parseOperationTypeDefinition,
-      TokenKind.BRACE_R,
-    );
-    if (directives.length === 0 && operationTypes.length === 0) {
-      throw this.unexpected();
-    }
-    return {
-      kind: Kind.SCHEMA_EXTENSION,
-      directives,
-      operationTypes,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * ScalarTypeExtension :
-   *   - extend scalar Name Directives[Const]
-   */
-  parseScalarTypeExtension(): ScalarTypeExtensionNode {
-    const start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('scalar');
-    const name = this.parseName();
-    const directives = this.parseDirectives(true);
-    if (directives.length === 0) {
-      throw this.unexpected();
-    }
-    return {
-      kind: Kind.SCALAR_TYPE_EXTENSION,
-      name,
-      directives,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * ObjectTypeExtension :
-   *  - extend type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition
-   *  - extend type Name ImplementsInterfaces? Directives[Const]
-   *  - extend type Name ImplementsInterfaces
-   */
-  parseObjectTypeExtension(): ObjectTypeExtensionNode {
-    const start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('type');
-    const name = this.parseName();
-    const interfaces = this.parseImplementsInterfaces();
-    const directives = this.parseDirectives(true);
-    const fields = this.parseFieldsDefinition();
-    if (
-      interfaces.length === 0 &&
-      directives.length === 0 &&
-      fields.length === 0
-    ) {
-      throw this.unexpected();
-    }
-    return {
-      kind: Kind.OBJECT_TYPE_EXTENSION,
-      name,
-      interfaces,
-      directives,
-      fields,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * InterfaceTypeExtension :
-   *  - extend interface Name ImplementsInterfaces? Directives[Const]? FieldsDefinition
-   *  - extend interface Name ImplementsInterfaces? Directives[Const]
-   *  - extend interface Name ImplementsInterfaces
-   */
-  parseInterfaceTypeExtension(): InterfaceTypeExtensionNode {
-    const start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('interface');
-    const name = this.parseName();
-    const interfaces = this.parseImplementsInterfaces();
-    const directives = this.parseDirectives(true);
-    const fields = this.parseFieldsDefinition();
-    if (
-      interfaces.length === 0 &&
-      directives.length === 0 &&
-      fields.length === 0
-    ) {
-      throw this.unexpected();
-    }
-    return {
-      kind: Kind.INTERFACE_TYPE_EXTENSION,
-      name,
-      interfaces,
-      directives,
-      fields,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * UnionTypeExtension :
-   *   - extend union Name Directives[Const]? UnionMemberTypes
-   *   - extend union Name Directives[Const]
-   */
-  parseUnionTypeExtension(): UnionTypeExtensionNode {
-    const start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('union');
-    const name = this.parseName();
-    const directives = this.parseDirectives(true);
-    const types = this.parseUnionMemberTypes();
-    if (directives.length === 0 && types.length === 0) {
-      throw this.unexpected();
-    }
-    return {
-      kind: Kind.UNION_TYPE_EXTENSION,
-      name,
-      directives,
-      types,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * EnumTypeExtension :
-   *   - extend enum Name Directives[Const]? EnumValuesDefinition
-   *   - extend enum Name Directives[Const]
-   */
-  parseEnumTypeExtension(): EnumTypeExtensionNode {
-    const start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('enum');
-    const name = this.parseName();
-    const directives = this.parseDirectives(true);
-    const values = this.parseEnumValuesDefinition();
-    if (directives.length === 0 && values.length === 0) {
-      throw this.unexpected();
-    }
-    return {
-      kind: Kind.ENUM_TYPE_EXTENSION,
-      name,
-      directives,
-      values,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * InputObjectTypeExtension :
-   *   - extend input Name Directives[Const]? InputFieldsDefinition
-   *   - extend input Name Directives[Const]
-   */
-  parseInputObjectTypeExtension(): InputObjectTypeExtensionNode {
-    const start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('input');
-    const name = this.parseName();
-    const directives = this.parseDirectives(true);
-    const fields = this.parseInputFieldsDefinition();
-    if (directives.length === 0 && fields.length === 0) {
-      throw this.unexpected();
-    }
-    return {
-      kind: Kind.INPUT_OBJECT_TYPE_EXTENSION,
-      name,
-      directives,
-      fields,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * DirectiveDefinition :
-   *   - Description? directive @ Name ArgumentsDefinition? `repeatable`? on DirectiveLocations
-   */
-  parseDirectiveDefinition(): DirectiveDefinitionNode {
-    const start = this._lexer.token;
-    const description = this.parseDescription();
-    this.expectKeyword('directive');
-    this.expectToken(TokenKind.AT);
-    const name = this.parseName();
-    const args = this.parseArgumentDefs();
-    const repeatable = this.expectOptionalKeyword('repeatable');
-    this.expectKeyword('on');
-    const locations = this.parseDirectiveLocations();
-    return {
-      kind: Kind.DIRECTIVE_DEFINITION,
-      description,
-      name,
-      arguments: args,
-      repeatable,
-      locations,
-      loc: this.loc(start),
-    };
-  }
-
-  /**
-   * DirectiveLocations :
-   *   - `|`? DirectiveLocation
-   *   - DirectiveLocations | DirectiveLocation
-   */
-  parseDirectiveLocations(): Array<NameNode> {
-    // Optional leading pipe
-    this.expectOptionalToken(TokenKind.PIPE);
-    const locations = [];
-    do {
-      locations.push(this.parseDirectiveLocation());
-    } while (this.expectOptionalToken(TokenKind.PIPE));
-    return locations;
-  }
-
-  /*
-   * DirectiveLocation :
-   *   - ExecutableDirectiveLocation
-   *   - TypeSystemDirectiveLocation
-   *
-   * ExecutableDirectiveLocation : one of
-   *   `QUERY`
-   *   `MUTATION`
-   *   `SUBSCRIPTION`
-   *   `FIELD`
-   *   `FRAGMENT_DEFINITION`
-   *   `FRAGMENT_SPREAD`
-   *   `INLINE_FRAGMENT`
-   *
-   * TypeSystemDirectiveLocation : one of
-   *   `SCHEMA`
-   *   `SCALAR`
-   *   `OBJECT`
-   *   `FIELD_DEFINITION`
-   *   `ARGUMENT_DEFINITION`
-   *   `INTERFACE`
-   *   `UNION`
-   *   `ENUM`
-   *   `ENUM_VALUE`
-   *   `INPUT_OBJECT`
-   *   `INPUT_FIELD_DEFINITION`
-   */
-  parseDirectiveLocation(): NameNode {
-    const start = this._lexer.token;
-    const name = this.parseName();
-    if (DirectiveLocation[name.value] !== undefined) {
-      return name;
-    }
-    throw this.unexpected(start);
-  }
-
-  // Core parsing utility functions
-
-  /**
-   * Returns a location object, used to identify the place in
-   * the source that created a given parsed object.
-   */
-  loc(startToken: Token): Location | void {
-    if (this._options?.noLocation !== true) {
-      return new Location(
-        startToken,
-        this._lexer.lastToken,
-        this._lexer.source,
-      );
-    }
-  }
-
-  /**
-   * Determines if the next token is of a given kind
-   */
-  peek(kind: TokenKindEnum): boolean {
-    return this._lexer.token.kind === kind;
-  }
-
-  /**
-   * If the next token is of the given kind, return that token after advancing
-   * the lexer. Otherwise, do not change the parser state and throw an error.
-   */
-  expectToken(kind: TokenKindEnum): Token {
-    const token = this._lexer.token;
-    if (token.kind === kind) {
-      this._lexer.advance();
-      return token;
-    }
-
-    throw syntaxError(
-      this._lexer.source,
-      token.start,
-      `Expected ${getTokenKindDesc(kind)}, found ${getTokenDesc(token)}.`,
-    );
-  }
-
-  /**
-   * If the next token is of the given kind, return that token after advancing
-   * the lexer. Otherwise, do not change the parser state and return undefined.
-   */
-  expectOptionalToken(kind: TokenKindEnum): ?Token {
-    const token = this._lexer.token;
-    if (token.kind === kind) {
-      this._lexer.advance();
-      return token;
-    }
-    return undefined;
-  }
-
-  /**
-   * If the next token is a given keyword, advance the lexer.
-   * Otherwise, do not change the parser state and throw an error.
-   */
-  expectKeyword(value: string) {
-    const token = this._lexer.token;
-    if (token.kind === TokenKind.NAME && token.value === value) {
-      this._lexer.advance();
-    } else {
-      throw syntaxError(
-        this._lexer.source,
-        token.start,
-        `Expected "${value}", found ${getTokenDesc(token)}.`,
-      );
-    }
-  }
-
-  /**
-   * If the next token is a given keyword, return "true" after advancing
-   * the lexer. Otherwise, do not change the parser state and return "false".
-   */
-  expectOptionalKeyword(value: string): boolean {
-    const token = this._lexer.token;
-    if (token.kind === TokenKind.NAME && token.value === value) {
-      this._lexer.advance();
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Helper function for creating an error when an unexpected lexed token
-   * is encountered.
-   */
-  unexpected(atToken?: ?Token): GraphQLError {
-    const token = atToken ?? this._lexer.token;
-    return syntaxError(
-      this._lexer.source,
-      token.start,
-      `Unexpected ${getTokenDesc(token)}.`,
-    );
-  }
-
-  /**
-   * Returns a possibly empty list of parse nodes, determined by
-   * the parseFn. This list begins with a lex token of openKind
-   * and ends with a lex token of closeKind. Advances the parser
-   * to the next lex token after the closing token.
-   */
-  any<T>(
-    openKind: TokenKindEnum,
-    parseFn: () => T,
-    closeKind: TokenKindEnum,
-  ): Array<T> {
-    this.expectToken(openKind);
-    const nodes = [];
-    while (!this.expectOptionalToken(closeKind)) {
-      nodes.push(parseFn.call(this));
-    }
-    return nodes;
-  }
-
-  /**
-   * Returns a list of parse nodes, determined by the parseFn.
-   * It can be empty only if open token is missing otherwise it will always
-   * return non-empty list that begins with a lex token of openKind and ends
-   * with a lex token of closeKind. Advances the parser to the next lex token
-   * after the closing token.
-   */
-  optionalMany<T>(
-    openKind: TokenKindEnum,
-    parseFn: () => T,
-    closeKind: TokenKindEnum,
-  ): Array<T> {
-    if (this.expectOptionalToken(openKind)) {
-      const nodes = [];
-      do {
-        nodes.push(parseFn.call(this));
-      } while (!this.expectOptionalToken(closeKind));
-      return nodes;
-    }
-    return [];
-  }
-
-  /**
-   * Returns a non-empty list of parse nodes, determined by
-   * the parseFn. This list begins with a lex token of openKind
-   * and ends with a lex token of closeKind. Advances the parser
-   * to the next lex token after the closing token.
-   */
-  many<T>(
-    openKind: TokenKindEnum,
-    parseFn: () => T,
-    closeKind: TokenKindEnum,
-  ): Array<T> {
-    this.expectToken(openKind);
-    const nodes = [];
-    do {
-      nodes.push(parseFn.call(this));
-    } while (!this.expectOptionalToken(closeKind));
-    return nodes;
-  }
-}
-
-/**
- * A helper function to describe a token as a string for debugging
- */
-function getTokenDesc(token: Token): string {
-  const value = token.value;
-  return getTokenKindDesc(token.kind) + (value != null ? ` "${value}"` : '');
-}
-
-/**
- * A helper function to describe a token kind as a string for debugging
- */
-function getTokenKindDesc(kind: TokenKindEnum): string {
-  return isPunctuatorTokenKind(kind) ? `"${kind}"` : kind;
-}
diff --git a/node_modules/graphql/language/parser.mjs b/node_modules/graphql/language/parser.mjs
deleted file mode 100644
index 4d97983..0000000
--- a/node_modules/graphql/language/parser.mjs
+++ /dev/null
@@ -1,1545 +0,0 @@
-import inspect from "../jsutils/inspect.mjs";
-import devAssert from "../jsutils/devAssert.mjs";
-import { syntaxError } from "../error/syntaxError.mjs";
-import { Kind } from "./kinds.mjs";
-import { Source } from "./source.mjs";
-import { DirectiveLocation } from "./directiveLocation.mjs";
-import { TokenKind } from "./tokenKind.mjs";
-import { Lexer, isPunctuatorTokenKind } from "./lexer.mjs";
-import { Location } from "./ast.mjs";
-/**
- * Configuration options to control parser behavior
- */
-
-/**
- * Given a GraphQL source, parses it into a Document.
- * Throws GraphQLError if a syntax error is encountered.
- */
-export function parse(source, options) {
-  var parser = new Parser(source, options);
-  return parser.parseDocument();
-}
-/**
- * Given a string containing a GraphQL value (ex. `[42]`), parse the AST for
- * that value.
- * Throws GraphQLError if a syntax error is encountered.
- *
- * This is useful within tools that operate upon GraphQL Values directly and
- * in isolation of complete GraphQL documents.
- *
- * Consider providing the results to the utility function: valueFromAST().
- */
-
-export function parseValue(source, options) {
-  var parser = new Parser(source, options);
-  parser.expectToken(TokenKind.SOF);
-  var value = parser.parseValueLiteral(false);
-  parser.expectToken(TokenKind.EOF);
-  return value;
-}
-/**
- * Given a string containing a GraphQL Type (ex. `[Int!]`), parse the AST for
- * that type.
- * Throws GraphQLError if a syntax error is encountered.
- *
- * This is useful within tools that operate upon GraphQL Types directly and
- * in isolation of complete GraphQL documents.
- *
- * Consider providing the results to the utility function: typeFromAST().
- */
-
-export function parseType(source, options) {
-  var parser = new Parser(source, options);
-  parser.expectToken(TokenKind.SOF);
-  var type = parser.parseTypeReference();
-  parser.expectToken(TokenKind.EOF);
-  return type;
-}
-
-var Parser =
-/*#__PURE__*/
-function () {
-  function Parser(source, options) {
-    var sourceObj = typeof source === 'string' ? new Source(source) : source;
-    sourceObj instanceof Source || devAssert(0, "Must provide Source. Received: ".concat(inspect(sourceObj), "."));
-    this._lexer = new Lexer(sourceObj);
-    this._options = options;
-  }
-  /**
-   * Converts a name lex token into a name parse node.
-   */
-
-
-  var _proto = Parser.prototype;
-
-  _proto.parseName = function parseName() {
-    var token = this.expectToken(TokenKind.NAME);
-    return {
-      kind: Kind.NAME,
-      value: token.value,
-      loc: this.loc(token)
-    };
-  } // Implements the parsing rules in the Document section.
-
-  /**
-   * Document : Definition+
-   */
-  ;
-
-  _proto.parseDocument = function parseDocument() {
-    var start = this._lexer.token;
-    return {
-      kind: Kind.DOCUMENT,
-      definitions: this.many(TokenKind.SOF, this.parseDefinition, TokenKind.EOF),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * Definition :
-   *   - ExecutableDefinition
-   *   - TypeSystemDefinition
-   *   - TypeSystemExtension
-   *
-   * ExecutableDefinition :
-   *   - OperationDefinition
-   *   - FragmentDefinition
-   */
-  ;
-
-  _proto.parseDefinition = function parseDefinition() {
-    if (this.peek(TokenKind.NAME)) {
-      switch (this._lexer.token.value) {
-        case 'query':
-        case 'mutation':
-        case 'subscription':
-          return this.parseOperationDefinition();
-
-        case 'fragment':
-          return this.parseFragmentDefinition();
-
-        case 'schema':
-        case 'scalar':
-        case 'type':
-        case 'interface':
-        case 'union':
-        case 'enum':
-        case 'input':
-        case 'directive':
-          return this.parseTypeSystemDefinition();
-
-        case 'extend':
-          return this.parseTypeSystemExtension();
-      }
-    } else if (this.peek(TokenKind.BRACE_L)) {
-      return this.parseOperationDefinition();
-    } else if (this.peekDescription()) {
-      return this.parseTypeSystemDefinition();
-    }
-
-    throw this.unexpected();
-  } // Implements the parsing rules in the Operations section.
-
-  /**
-   * OperationDefinition :
-   *  - SelectionSet
-   *  - OperationType Name? VariableDefinitions? Directives? SelectionSet
-   */
-  ;
-
-  _proto.parseOperationDefinition = function parseOperationDefinition() {
-    var start = this._lexer.token;
-
-    if (this.peek(TokenKind.BRACE_L)) {
-      return {
-        kind: Kind.OPERATION_DEFINITION,
-        operation: 'query',
-        name: undefined,
-        variableDefinitions: [],
-        directives: [],
-        selectionSet: this.parseSelectionSet(),
-        loc: this.loc(start)
-      };
-    }
-
-    var operation = this.parseOperationType();
-    var name;
-
-    if (this.peek(TokenKind.NAME)) {
-      name = this.parseName();
-    }
-
-    return {
-      kind: Kind.OPERATION_DEFINITION,
-      operation: operation,
-      name: name,
-      variableDefinitions: this.parseVariableDefinitions(),
-      directives: this.parseDirectives(false),
-      selectionSet: this.parseSelectionSet(),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * OperationType : one of query mutation subscription
-   */
-  ;
-
-  _proto.parseOperationType = function parseOperationType() {
-    var operationToken = this.expectToken(TokenKind.NAME);
-
-    switch (operationToken.value) {
-      case 'query':
-        return 'query';
-
-      case 'mutation':
-        return 'mutation';
-
-      case 'subscription':
-        return 'subscription';
-    }
-
-    throw this.unexpected(operationToken);
-  }
-  /**
-   * VariableDefinitions : ( VariableDefinition+ )
-   */
-  ;
-
-  _proto.parseVariableDefinitions = function parseVariableDefinitions() {
-    return this.optionalMany(TokenKind.PAREN_L, this.parseVariableDefinition, TokenKind.PAREN_R);
-  }
-  /**
-   * VariableDefinition : Variable : Type DefaultValue? Directives[Const]?
-   */
-  ;
-
-  _proto.parseVariableDefinition = function parseVariableDefinition() {
-    var start = this._lexer.token;
-    return {
-      kind: Kind.VARIABLE_DEFINITION,
-      variable: this.parseVariable(),
-      type: (this.expectToken(TokenKind.COLON), this.parseTypeReference()),
-      defaultValue: this.expectOptionalToken(TokenKind.EQUALS) ? this.parseValueLiteral(true) : undefined,
-      directives: this.parseDirectives(true),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * Variable : $ Name
-   */
-  ;
-
-  _proto.parseVariable = function parseVariable() {
-    var start = this._lexer.token;
-    this.expectToken(TokenKind.DOLLAR);
-    return {
-      kind: Kind.VARIABLE,
-      name: this.parseName(),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * SelectionSet : { Selection+ }
-   */
-  ;
-
-  _proto.parseSelectionSet = function parseSelectionSet() {
-    var start = this._lexer.token;
-    return {
-      kind: Kind.SELECTION_SET,
-      selections: this.many(TokenKind.BRACE_L, this.parseSelection, TokenKind.BRACE_R),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * Selection :
-   *   - Field
-   *   - FragmentSpread
-   *   - InlineFragment
-   */
-  ;
-
-  _proto.parseSelection = function parseSelection() {
-    return this.peek(TokenKind.SPREAD) ? this.parseFragment() : this.parseField();
-  }
-  /**
-   * Field : Alias? Name Arguments? Directives? SelectionSet?
-   *
-   * Alias : Name :
-   */
-  ;
-
-  _proto.parseField = function parseField() {
-    var start = this._lexer.token;
-    var nameOrAlias = this.parseName();
-    var alias;
-    var name;
-
-    if (this.expectOptionalToken(TokenKind.COLON)) {
-      alias = nameOrAlias;
-      name = this.parseName();
-    } else {
-      name = nameOrAlias;
-    }
-
-    return {
-      kind: Kind.FIELD,
-      alias: alias,
-      name: name,
-      arguments: this.parseArguments(false),
-      directives: this.parseDirectives(false),
-      selectionSet: this.peek(TokenKind.BRACE_L) ? this.parseSelectionSet() : undefined,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * Arguments[Const] : ( Argument[?Const]+ )
-   */
-  ;
-
-  _proto.parseArguments = function parseArguments(isConst) {
-    var item = isConst ? this.parseConstArgument : this.parseArgument;
-    return this.optionalMany(TokenKind.PAREN_L, item, TokenKind.PAREN_R);
-  }
-  /**
-   * Argument[Const] : Name : Value[?Const]
-   */
-  ;
-
-  _proto.parseArgument = function parseArgument() {
-    var start = this._lexer.token;
-    var name = this.parseName();
-    this.expectToken(TokenKind.COLON);
-    return {
-      kind: Kind.ARGUMENT,
-      name: name,
-      value: this.parseValueLiteral(false),
-      loc: this.loc(start)
-    };
-  };
-
-  _proto.parseConstArgument = function parseConstArgument() {
-    var start = this._lexer.token;
-    return {
-      kind: Kind.ARGUMENT,
-      name: this.parseName(),
-      value: (this.expectToken(TokenKind.COLON), this.parseValueLiteral(true)),
-      loc: this.loc(start)
-    };
-  } // Implements the parsing rules in the Fragments section.
-
-  /**
-   * Corresponds to both FragmentSpread and InlineFragment in the spec.
-   *
-   * FragmentSpread : ... FragmentName Directives?
-   *
-   * InlineFragment : ... TypeCondition? Directives? SelectionSet
-   */
-  ;
-
-  _proto.parseFragment = function parseFragment() {
-    var start = this._lexer.token;
-    this.expectToken(TokenKind.SPREAD);
-    var hasTypeCondition = this.expectOptionalKeyword('on');
-
-    if (!hasTypeCondition && this.peek(TokenKind.NAME)) {
-      return {
-        kind: Kind.FRAGMENT_SPREAD,
-        name: this.parseFragmentName(),
-        directives: this.parseDirectives(false),
-        loc: this.loc(start)
-      };
-    }
-
-    return {
-      kind: Kind.INLINE_FRAGMENT,
-      typeCondition: hasTypeCondition ? this.parseNamedType() : undefined,
-      directives: this.parseDirectives(false),
-      selectionSet: this.parseSelectionSet(),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * FragmentDefinition :
-   *   - fragment FragmentName on TypeCondition Directives? SelectionSet
-   *
-   * TypeCondition : NamedType
-   */
-  ;
-
-  _proto.parseFragmentDefinition = function parseFragmentDefinition() {
-    var _this$_options;
-
-    var start = this._lexer.token;
-    this.expectKeyword('fragment'); // Experimental support for defining variables within fragments changes
-    // the grammar of FragmentDefinition:
-    //   - fragment FragmentName VariableDefinitions? on TypeCondition Directives? SelectionSet
-
-    if (((_this$_options = this._options) === null || _this$_options === void 0 ? void 0 : _this$_options.experimentalFragmentVariables) === true) {
-      return {
-        kind: Kind.FRAGMENT_DEFINITION,
-        name: this.parseFragmentName(),
-        variableDefinitions: this.parseVariableDefinitions(),
-        typeCondition: (this.expectKeyword('on'), this.parseNamedType()),
-        directives: this.parseDirectives(false),
-        selectionSet: this.parseSelectionSet(),
-        loc: this.loc(start)
-      };
-    }
-
-    return {
-      kind: Kind.FRAGMENT_DEFINITION,
-      name: this.parseFragmentName(),
-      typeCondition: (this.expectKeyword('on'), this.parseNamedType()),
-      directives: this.parseDirectives(false),
-      selectionSet: this.parseSelectionSet(),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * FragmentName : Name but not `on`
-   */
-  ;
-
-  _proto.parseFragmentName = function parseFragmentName() {
-    if (this._lexer.token.value === 'on') {
-      throw this.unexpected();
-    }
-
-    return this.parseName();
-  } // Implements the parsing rules in the Values section.
-
-  /**
-   * Value[Const] :
-   *   - [~Const] Variable
-   *   - IntValue
-   *   - FloatValue
-   *   - StringValue
-   *   - BooleanValue
-   *   - NullValue
-   *   - EnumValue
-   *   - ListValue[?Const]
-   *   - ObjectValue[?Const]
-   *
-   * BooleanValue : one of `true` `false`
-   *
-   * NullValue : `null`
-   *
-   * EnumValue : Name but not `true`, `false` or `null`
-   */
-  ;
-
-  _proto.parseValueLiteral = function parseValueLiteral(isConst) {
-    var token = this._lexer.token;
-
-    switch (token.kind) {
-      case TokenKind.BRACKET_L:
-        return this.parseList(isConst);
-
-      case TokenKind.BRACE_L:
-        return this.parseObject(isConst);
-
-      case TokenKind.INT:
-        this._lexer.advance();
-
-        return {
-          kind: Kind.INT,
-          value: token.value,
-          loc: this.loc(token)
-        };
-
-      case TokenKind.FLOAT:
-        this._lexer.advance();
-
-        return {
-          kind: Kind.FLOAT,
-          value: token.value,
-          loc: this.loc(token)
-        };
-
-      case TokenKind.STRING:
-      case TokenKind.BLOCK_STRING:
-        return this.parseStringLiteral();
-
-      case TokenKind.NAME:
-        this._lexer.advance();
-
-        switch (token.value) {
-          case 'true':
-            return {
-              kind: Kind.BOOLEAN,
-              value: true,
-              loc: this.loc(token)
-            };
-
-          case 'false':
-            return {
-              kind: Kind.BOOLEAN,
-              value: false,
-              loc: this.loc(token)
-            };
-
-          case 'null':
-            return {
-              kind: Kind.NULL,
-              loc: this.loc(token)
-            };
-
-          default:
-            return {
-              kind: Kind.ENUM,
-              value: token.value,
-              loc: this.loc(token)
-            };
-        }
-
-      case TokenKind.DOLLAR:
-        if (!isConst) {
-          return this.parseVariable();
-        }
-
-        break;
-    }
-
-    throw this.unexpected();
-  };
-
-  _proto.parseStringLiteral = function parseStringLiteral() {
-    var token = this._lexer.token;
-
-    this._lexer.advance();
-
-    return {
-      kind: Kind.STRING,
-      value: token.value,
-      block: token.kind === TokenKind.BLOCK_STRING,
-      loc: this.loc(token)
-    };
-  }
-  /**
-   * ListValue[Const] :
-   *   - [ ]
-   *   - [ Value[?Const]+ ]
-   */
-  ;
-
-  _proto.parseList = function parseList(isConst) {
-    var _this = this;
-
-    var start = this._lexer.token;
-
-    var item = function item() {
-      return _this.parseValueLiteral(isConst);
-    };
-
-    return {
-      kind: Kind.LIST,
-      values: this.any(TokenKind.BRACKET_L, item, TokenKind.BRACKET_R),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ObjectValue[Const] :
-   *   - { }
-   *   - { ObjectField[?Const]+ }
-   */
-  ;
-
-  _proto.parseObject = function parseObject(isConst) {
-    var _this2 = this;
-
-    var start = this._lexer.token;
-
-    var item = function item() {
-      return _this2.parseObjectField(isConst);
-    };
-
-    return {
-      kind: Kind.OBJECT,
-      fields: this.any(TokenKind.BRACE_L, item, TokenKind.BRACE_R),
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ObjectField[Const] : Name : Value[?Const]
-   */
-  ;
-
-  _proto.parseObjectField = function parseObjectField(isConst) {
-    var start = this._lexer.token;
-    var name = this.parseName();
-    this.expectToken(TokenKind.COLON);
-    return {
-      kind: Kind.OBJECT_FIELD,
-      name: name,
-      value: this.parseValueLiteral(isConst),
-      loc: this.loc(start)
-    };
-  } // Implements the parsing rules in the Directives section.
-
-  /**
-   * Directives[Const] : Directive[?Const]+
-   */
-  ;
-
-  _proto.parseDirectives = function parseDirectives(isConst) {
-    var directives = [];
-
-    while (this.peek(TokenKind.AT)) {
-      directives.push(this.parseDirective(isConst));
-    }
-
-    return directives;
-  }
-  /**
-   * Directive[Const] : @ Name Arguments[?Const]?
-   */
-  ;
-
-  _proto.parseDirective = function parseDirective(isConst) {
-    var start = this._lexer.token;
-    this.expectToken(TokenKind.AT);
-    return {
-      kind: Kind.DIRECTIVE,
-      name: this.parseName(),
-      arguments: this.parseArguments(isConst),
-      loc: this.loc(start)
-    };
-  } // Implements the parsing rules in the Types section.
-
-  /**
-   * Type :
-   *   - NamedType
-   *   - ListType
-   *   - NonNullType
-   */
-  ;
-
-  _proto.parseTypeReference = function parseTypeReference() {
-    var start = this._lexer.token;
-    var type;
-
-    if (this.expectOptionalToken(TokenKind.BRACKET_L)) {
-      type = this.parseTypeReference();
-      this.expectToken(TokenKind.BRACKET_R);
-      type = {
-        kind: Kind.LIST_TYPE,
-        type: type,
-        loc: this.loc(start)
-      };
-    } else {
-      type = this.parseNamedType();
-    }
-
-    if (this.expectOptionalToken(TokenKind.BANG)) {
-      return {
-        kind: Kind.NON_NULL_TYPE,
-        type: type,
-        loc: this.loc(start)
-      };
-    }
-
-    return type;
-  }
-  /**
-   * NamedType : Name
-   */
-  ;
-
-  _proto.parseNamedType = function parseNamedType() {
-    var start = this._lexer.token;
-    return {
-      kind: Kind.NAMED_TYPE,
-      name: this.parseName(),
-      loc: this.loc(start)
-    };
-  } // Implements the parsing rules in the Type Definition section.
-
-  /**
-   * TypeSystemDefinition :
-   *   - SchemaDefinition
-   *   - TypeDefinition
-   *   - DirectiveDefinition
-   *
-   * TypeDefinition :
-   *   - ScalarTypeDefinition
-   *   - ObjectTypeDefinition
-   *   - InterfaceTypeDefinition
-   *   - UnionTypeDefinition
-   *   - EnumTypeDefinition
-   *   - InputObjectTypeDefinition
-   */
-  ;
-
-  _proto.parseTypeSystemDefinition = function parseTypeSystemDefinition() {
-    // Many definitions begin with a description and require a lookahead.
-    var keywordToken = this.peekDescription() ? this._lexer.lookahead() : this._lexer.token;
-
-    if (keywordToken.kind === TokenKind.NAME) {
-      switch (keywordToken.value) {
-        case 'schema':
-          return this.parseSchemaDefinition();
-
-        case 'scalar':
-          return this.parseScalarTypeDefinition();
-
-        case 'type':
-          return this.parseObjectTypeDefinition();
-
-        case 'interface':
-          return this.parseInterfaceTypeDefinition();
-
-        case 'union':
-          return this.parseUnionTypeDefinition();
-
-        case 'enum':
-          return this.parseEnumTypeDefinition();
-
-        case 'input':
-          return this.parseInputObjectTypeDefinition();
-
-        case 'directive':
-          return this.parseDirectiveDefinition();
-      }
-    }
-
-    throw this.unexpected(keywordToken);
-  };
-
-  _proto.peekDescription = function peekDescription() {
-    return this.peek(TokenKind.STRING) || this.peek(TokenKind.BLOCK_STRING);
-  }
-  /**
-   * Description : StringValue
-   */
-  ;
-
-  _proto.parseDescription = function parseDescription() {
-    if (this.peekDescription()) {
-      return this.parseStringLiteral();
-    }
-  }
-  /**
-   * SchemaDefinition : Description? schema Directives[Const]? { OperationTypeDefinition+ }
-   */
-  ;
-
-  _proto.parseSchemaDefinition = function parseSchemaDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('schema');
-    var directives = this.parseDirectives(true);
-    var operationTypes = this.many(TokenKind.BRACE_L, this.parseOperationTypeDefinition, TokenKind.BRACE_R);
-    return {
-      kind: Kind.SCHEMA_DEFINITION,
-      description: description,
-      directives: directives,
-      operationTypes: operationTypes,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * OperationTypeDefinition : OperationType : NamedType
-   */
-  ;
-
-  _proto.parseOperationTypeDefinition = function parseOperationTypeDefinition() {
-    var start = this._lexer.token;
-    var operation = this.parseOperationType();
-    this.expectToken(TokenKind.COLON);
-    var type = this.parseNamedType();
-    return {
-      kind: Kind.OPERATION_TYPE_DEFINITION,
-      operation: operation,
-      type: type,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ScalarTypeDefinition : Description? scalar Name Directives[Const]?
-   */
-  ;
-
-  _proto.parseScalarTypeDefinition = function parseScalarTypeDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('scalar');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    return {
-      kind: Kind.SCALAR_TYPE_DEFINITION,
-      description: description,
-      name: name,
-      directives: directives,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ObjectTypeDefinition :
-   *   Description?
-   *   type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition?
-   */
-  ;
-
-  _proto.parseObjectTypeDefinition = function parseObjectTypeDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('type');
-    var name = this.parseName();
-    var interfaces = this.parseImplementsInterfaces();
-    var directives = this.parseDirectives(true);
-    var fields = this.parseFieldsDefinition();
-    return {
-      kind: Kind.OBJECT_TYPE_DEFINITION,
-      description: description,
-      name: name,
-      interfaces: interfaces,
-      directives: directives,
-      fields: fields,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ImplementsInterfaces :
-   *   - implements `&`? NamedType
-   *   - ImplementsInterfaces & NamedType
-   */
-  ;
-
-  _proto.parseImplementsInterfaces = function parseImplementsInterfaces() {
-    var types = [];
-
-    if (this.expectOptionalKeyword('implements')) {
-      // Optional leading ampersand
-      this.expectOptionalToken(TokenKind.AMP);
-
-      do {
-        var _this$_options2;
-
-        types.push(this.parseNamedType());
-      } while (this.expectOptionalToken(TokenKind.AMP) || // Legacy support for the SDL?
-      ((_this$_options2 = this._options) === null || _this$_options2 === void 0 ? void 0 : _this$_options2.allowLegacySDLImplementsInterfaces) === true && this.peek(TokenKind.NAME));
-    }
-
-    return types;
-  }
-  /**
-   * FieldsDefinition : { FieldDefinition+ }
-   */
-  ;
-
-  _proto.parseFieldsDefinition = function parseFieldsDefinition() {
-    var _this$_options3;
-
-    // Legacy support for the SDL?
-    if (((_this$_options3 = this._options) === null || _this$_options3 === void 0 ? void 0 : _this$_options3.allowLegacySDLEmptyFields) === true && this.peek(TokenKind.BRACE_L) && this._lexer.lookahead().kind === TokenKind.BRACE_R) {
-      this._lexer.advance();
-
-      this._lexer.advance();
-
-      return [];
-    }
-
-    return this.optionalMany(TokenKind.BRACE_L, this.parseFieldDefinition, TokenKind.BRACE_R);
-  }
-  /**
-   * FieldDefinition :
-   *   - Description? Name ArgumentsDefinition? : Type Directives[Const]?
-   */
-  ;
-
-  _proto.parseFieldDefinition = function parseFieldDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    var name = this.parseName();
-    var args = this.parseArgumentDefs();
-    this.expectToken(TokenKind.COLON);
-    var type = this.parseTypeReference();
-    var directives = this.parseDirectives(true);
-    return {
-      kind: Kind.FIELD_DEFINITION,
-      description: description,
-      name: name,
-      arguments: args,
-      type: type,
-      directives: directives,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ArgumentsDefinition : ( InputValueDefinition+ )
-   */
-  ;
-
-  _proto.parseArgumentDefs = function parseArgumentDefs() {
-    return this.optionalMany(TokenKind.PAREN_L, this.parseInputValueDef, TokenKind.PAREN_R);
-  }
-  /**
-   * InputValueDefinition :
-   *   - Description? Name : Type DefaultValue? Directives[Const]?
-   */
-  ;
-
-  _proto.parseInputValueDef = function parseInputValueDef() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    var name = this.parseName();
-    this.expectToken(TokenKind.COLON);
-    var type = this.parseTypeReference();
-    var defaultValue;
-
-    if (this.expectOptionalToken(TokenKind.EQUALS)) {
-      defaultValue = this.parseValueLiteral(true);
-    }
-
-    var directives = this.parseDirectives(true);
-    return {
-      kind: Kind.INPUT_VALUE_DEFINITION,
-      description: description,
-      name: name,
-      type: type,
-      defaultValue: defaultValue,
-      directives: directives,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * InterfaceTypeDefinition :
-   *   - Description? interface Name Directives[Const]? FieldsDefinition?
-   */
-  ;
-
-  _proto.parseInterfaceTypeDefinition = function parseInterfaceTypeDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('interface');
-    var name = this.parseName();
-    var interfaces = this.parseImplementsInterfaces();
-    var directives = this.parseDirectives(true);
-    var fields = this.parseFieldsDefinition();
-    return {
-      kind: Kind.INTERFACE_TYPE_DEFINITION,
-      description: description,
-      name: name,
-      interfaces: interfaces,
-      directives: directives,
-      fields: fields,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * UnionTypeDefinition :
-   *   - Description? union Name Directives[Const]? UnionMemberTypes?
-   */
-  ;
-
-  _proto.parseUnionTypeDefinition = function parseUnionTypeDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('union');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    var types = this.parseUnionMemberTypes();
-    return {
-      kind: Kind.UNION_TYPE_DEFINITION,
-      description: description,
-      name: name,
-      directives: directives,
-      types: types,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * UnionMemberTypes :
-   *   - = `|`? NamedType
-   *   - UnionMemberTypes | NamedType
-   */
-  ;
-
-  _proto.parseUnionMemberTypes = function parseUnionMemberTypes() {
-    var types = [];
-
-    if (this.expectOptionalToken(TokenKind.EQUALS)) {
-      // Optional leading pipe
-      this.expectOptionalToken(TokenKind.PIPE);
-
-      do {
-        types.push(this.parseNamedType());
-      } while (this.expectOptionalToken(TokenKind.PIPE));
-    }
-
-    return types;
-  }
-  /**
-   * EnumTypeDefinition :
-   *   - Description? enum Name Directives[Const]? EnumValuesDefinition?
-   */
-  ;
-
-  _proto.parseEnumTypeDefinition = function parseEnumTypeDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('enum');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    var values = this.parseEnumValuesDefinition();
-    return {
-      kind: Kind.ENUM_TYPE_DEFINITION,
-      description: description,
-      name: name,
-      directives: directives,
-      values: values,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * EnumValuesDefinition : { EnumValueDefinition+ }
-   */
-  ;
-
-  _proto.parseEnumValuesDefinition = function parseEnumValuesDefinition() {
-    return this.optionalMany(TokenKind.BRACE_L, this.parseEnumValueDefinition, TokenKind.BRACE_R);
-  }
-  /**
-   * EnumValueDefinition : Description? EnumValue Directives[Const]?
-   *
-   * EnumValue : Name
-   */
-  ;
-
-  _proto.parseEnumValueDefinition = function parseEnumValueDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    return {
-      kind: Kind.ENUM_VALUE_DEFINITION,
-      description: description,
-      name: name,
-      directives: directives,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * InputObjectTypeDefinition :
-   *   - Description? input Name Directives[Const]? InputFieldsDefinition?
-   */
-  ;
-
-  _proto.parseInputObjectTypeDefinition = function parseInputObjectTypeDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('input');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    var fields = this.parseInputFieldsDefinition();
-    return {
-      kind: Kind.INPUT_OBJECT_TYPE_DEFINITION,
-      description: description,
-      name: name,
-      directives: directives,
-      fields: fields,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * InputFieldsDefinition : { InputValueDefinition+ }
-   */
-  ;
-
-  _proto.parseInputFieldsDefinition = function parseInputFieldsDefinition() {
-    return this.optionalMany(TokenKind.BRACE_L, this.parseInputValueDef, TokenKind.BRACE_R);
-  }
-  /**
-   * TypeSystemExtension :
-   *   - SchemaExtension
-   *   - TypeExtension
-   *
-   * TypeExtension :
-   *   - ScalarTypeExtension
-   *   - ObjectTypeExtension
-   *   - InterfaceTypeExtension
-   *   - UnionTypeExtension
-   *   - EnumTypeExtension
-   *   - InputObjectTypeDefinition
-   */
-  ;
-
-  _proto.parseTypeSystemExtension = function parseTypeSystemExtension() {
-    var keywordToken = this._lexer.lookahead();
-
-    if (keywordToken.kind === TokenKind.NAME) {
-      switch (keywordToken.value) {
-        case 'schema':
-          return this.parseSchemaExtension();
-
-        case 'scalar':
-          return this.parseScalarTypeExtension();
-
-        case 'type':
-          return this.parseObjectTypeExtension();
-
-        case 'interface':
-          return this.parseInterfaceTypeExtension();
-
-        case 'union':
-          return this.parseUnionTypeExtension();
-
-        case 'enum':
-          return this.parseEnumTypeExtension();
-
-        case 'input':
-          return this.parseInputObjectTypeExtension();
-      }
-    }
-
-    throw this.unexpected(keywordToken);
-  }
-  /**
-   * SchemaExtension :
-   *  - extend schema Directives[Const]? { OperationTypeDefinition+ }
-   *  - extend schema Directives[Const]
-   */
-  ;
-
-  _proto.parseSchemaExtension = function parseSchemaExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('schema');
-    var directives = this.parseDirectives(true);
-    var operationTypes = this.optionalMany(TokenKind.BRACE_L, this.parseOperationTypeDefinition, TokenKind.BRACE_R);
-
-    if (directives.length === 0 && operationTypes.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: Kind.SCHEMA_EXTENSION,
-      directives: directives,
-      operationTypes: operationTypes,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ScalarTypeExtension :
-   *   - extend scalar Name Directives[Const]
-   */
-  ;
-
-  _proto.parseScalarTypeExtension = function parseScalarTypeExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('scalar');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-
-    if (directives.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: Kind.SCALAR_TYPE_EXTENSION,
-      name: name,
-      directives: directives,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * ObjectTypeExtension :
-   *  - extend type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition
-   *  - extend type Name ImplementsInterfaces? Directives[Const]
-   *  - extend type Name ImplementsInterfaces
-   */
-  ;
-
-  _proto.parseObjectTypeExtension = function parseObjectTypeExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('type');
-    var name = this.parseName();
-    var interfaces = this.parseImplementsInterfaces();
-    var directives = this.parseDirectives(true);
-    var fields = this.parseFieldsDefinition();
-
-    if (interfaces.length === 0 && directives.length === 0 && fields.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: Kind.OBJECT_TYPE_EXTENSION,
-      name: name,
-      interfaces: interfaces,
-      directives: directives,
-      fields: fields,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * InterfaceTypeExtension :
-   *  - extend interface Name ImplementsInterfaces? Directives[Const]? FieldsDefinition
-   *  - extend interface Name ImplementsInterfaces? Directives[Const]
-   *  - extend interface Name ImplementsInterfaces
-   */
-  ;
-
-  _proto.parseInterfaceTypeExtension = function parseInterfaceTypeExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('interface');
-    var name = this.parseName();
-    var interfaces = this.parseImplementsInterfaces();
-    var directives = this.parseDirectives(true);
-    var fields = this.parseFieldsDefinition();
-
-    if (interfaces.length === 0 && directives.length === 0 && fields.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: Kind.INTERFACE_TYPE_EXTENSION,
-      name: name,
-      interfaces: interfaces,
-      directives: directives,
-      fields: fields,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * UnionTypeExtension :
-   *   - extend union Name Directives[Const]? UnionMemberTypes
-   *   - extend union Name Directives[Const]
-   */
-  ;
-
-  _proto.parseUnionTypeExtension = function parseUnionTypeExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('union');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    var types = this.parseUnionMemberTypes();
-
-    if (directives.length === 0 && types.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: Kind.UNION_TYPE_EXTENSION,
-      name: name,
-      directives: directives,
-      types: types,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * EnumTypeExtension :
-   *   - extend enum Name Directives[Const]? EnumValuesDefinition
-   *   - extend enum Name Directives[Const]
-   */
-  ;
-
-  _proto.parseEnumTypeExtension = function parseEnumTypeExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('enum');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    var values = this.parseEnumValuesDefinition();
-
-    if (directives.length === 0 && values.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: Kind.ENUM_TYPE_EXTENSION,
-      name: name,
-      directives: directives,
-      values: values,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * InputObjectTypeExtension :
-   *   - extend input Name Directives[Const]? InputFieldsDefinition
-   *   - extend input Name Directives[Const]
-   */
-  ;
-
-  _proto.parseInputObjectTypeExtension = function parseInputObjectTypeExtension() {
-    var start = this._lexer.token;
-    this.expectKeyword('extend');
-    this.expectKeyword('input');
-    var name = this.parseName();
-    var directives = this.parseDirectives(true);
-    var fields = this.parseInputFieldsDefinition();
-
-    if (directives.length === 0 && fields.length === 0) {
-      throw this.unexpected();
-    }
-
-    return {
-      kind: Kind.INPUT_OBJECT_TYPE_EXTENSION,
-      name: name,
-      directives: directives,
-      fields: fields,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * DirectiveDefinition :
-   *   - Description? directive @ Name ArgumentsDefinition? `repeatable`? on DirectiveLocations
-   */
-  ;
-
-  _proto.parseDirectiveDefinition = function parseDirectiveDefinition() {
-    var start = this._lexer.token;
-    var description = this.parseDescription();
-    this.expectKeyword('directive');
-    this.expectToken(TokenKind.AT);
-    var name = this.parseName();
-    var args = this.parseArgumentDefs();
-    var repeatable = this.expectOptionalKeyword('repeatable');
-    this.expectKeyword('on');
-    var locations = this.parseDirectiveLocations();
-    return {
-      kind: Kind.DIRECTIVE_DEFINITION,
-      description: description,
-      name: name,
-      arguments: args,
-      repeatable: repeatable,
-      locations: locations,
-      loc: this.loc(start)
-    };
-  }
-  /**
-   * DirectiveLocations :
-   *   - `|`? DirectiveLocation
-   *   - DirectiveLocations | DirectiveLocation
-   */
-  ;
-
-  _proto.parseDirectiveLocations = function parseDirectiveLocations() {
-    // Optional leading pipe
-    this.expectOptionalToken(TokenKind.PIPE);
-    var locations = [];
-
-    do {
-      locations.push(this.parseDirectiveLocation());
-    } while (this.expectOptionalToken(TokenKind.PIPE));
-
-    return locations;
-  }
-  /*
-   * DirectiveLocation :
-   *   - ExecutableDirectiveLocation
-   *   - TypeSystemDirectiveLocation
-   *
-   * ExecutableDirectiveLocation : one of
-   *   `QUERY`
-   *   `MUTATION`
-   *   `SUBSCRIPTION`
-   *   `FIELD`
-   *   `FRAGMENT_DEFINITION`
-   *   `FRAGMENT_SPREAD`
-   *   `INLINE_FRAGMENT`
-   *
-   * TypeSystemDirectiveLocation : one of
-   *   `SCHEMA`
-   *   `SCALAR`
-   *   `OBJECT`
-   *   `FIELD_DEFINITION`
-   *   `ARGUMENT_DEFINITION`
-   *   `INTERFACE`
-   *   `UNION`
-   *   `ENUM`
-   *   `ENUM_VALUE`
-   *   `INPUT_OBJECT`
-   *   `INPUT_FIELD_DEFINITION`
-   */
-  ;
-
-  _proto.parseDirectiveLocation = function parseDirectiveLocation() {
-    var start = this._lexer.token;
-    var name = this.parseName();
-
-    if (DirectiveLocation[name.value] !== undefined) {
-      return name;
-    }
-
-    throw this.unexpected(start);
-  } // Core parsing utility functions
-
-  /**
-   * Returns a location object, used to identify the place in
-   * the source that created a given parsed object.
-   */
-  ;
-
-  _proto.loc = function loc(startToken) {
-    var _this$_options4;
-
-    if (((_this$_options4 = this._options) === null || _this$_options4 === void 0 ? void 0 : _this$_options4.noLocation) !== true) {
-      return new Location(startToken, this._lexer.lastToken, this._lexer.source);
-    }
-  }
-  /**
-   * Determines if the next token is of a given kind
-   */
-  ;
-
-  _proto.peek = function peek(kind) {
-    return this._lexer.token.kind === kind;
-  }
-  /**
-   * If the next token is of the given kind, return that token after advancing
-   * the lexer. Otherwise, do not change the parser state and throw an error.
-   */
-  ;
-
-  _proto.expectToken = function expectToken(kind) {
-    var token = this._lexer.token;
-
-    if (token.kind === kind) {
-      this._lexer.advance();
-
-      return token;
-    }
-
-    throw syntaxError(this._lexer.source, token.start, "Expected ".concat(getTokenKindDesc(kind), ", found ").concat(getTokenDesc(token), "."));
-  }
-  /**
-   * If the next token is of the given kind, return that token after advancing
-   * the lexer. Otherwise, do not change the parser state and return undefined.
-   */
-  ;
-
-  _proto.expectOptionalToken = function expectOptionalToken(kind) {
-    var token = this._lexer.token;
-
-    if (token.kind === kind) {
-      this._lexer.advance();
-
-      return token;
-    }
-
-    return undefined;
-  }
-  /**
-   * If the next token is a given keyword, advance the lexer.
-   * Otherwise, do not change the parser state and throw an error.
-   */
-  ;
-
-  _proto.expectKeyword = function expectKeyword(value) {
-    var token = this._lexer.token;
-
-    if (token.kind === TokenKind.NAME && token.value === value) {
-      this._lexer.advance();
-    } else {
-      throw syntaxError(this._lexer.source, token.start, "Expected \"".concat(value, "\", found ").concat(getTokenDesc(token), "."));
-    }
-  }
-  /**
-   * If the next token is a given keyword, return "true" after advancing
-   * the lexer. Otherwise, do not change the parser state and return "false".
-   */
-  ;
-
-  _proto.expectOptionalKeyword = function expectOptionalKeyword(value) {
-    var token = this._lexer.token;
-
-    if (token.kind === TokenKind.NAME && token.value === value) {
-      this._lexer.advance();
-
-      return true;
-    }
-
-    return false;
-  }
-  /**
-   * Helper function for creating an error when an unexpected lexed token
-   * is encountered.
-   */
-  ;
-
-  _proto.unexpected = function unexpected(atToken) {
-    var token = atToken !== null && atToken !== void 0 ? atToken : this._lexer.token;
-    return syntaxError(this._lexer.source, token.start, "Unexpected ".concat(getTokenDesc(token), "."));
-  }
-  /**
-   * Returns a possibly empty list of parse nodes, determined by
-   * the parseFn. This list begins with a lex token of openKind
-   * and ends with a lex token of closeKind. Advances the parser
-   * to the next lex token after the closing token.
-   */
-  ;
-
-  _proto.any = function any(openKind, parseFn, closeKind) {
-    this.expectToken(openKind);
-    var nodes = [];
-
-    while (!this.expectOptionalToken(closeKind)) {
-      nodes.push(parseFn.call(this));
-    }
-
-    return nodes;
-  }
-  /**
-   * Returns a list of parse nodes, determined by the parseFn.
-   * It can be empty only if open token is missing otherwise it will always
-   * return non-empty list that begins with a lex token of openKind and ends
-   * with a lex token of closeKind. Advances the parser to the next lex token
-   * after the closing token.
-   */
-  ;
-
-  _proto.optionalMany = function optionalMany(openKind, parseFn, closeKind) {
-    if (this.expectOptionalToken(openKind)) {
-      var nodes = [];
-
-      do {
-        nodes.push(parseFn.call(this));
-      } while (!this.expectOptionalToken(closeKind));
-
-      return nodes;
-    }
-
-    return [];
-  }
-  /**
-   * Returns a non-empty list of parse nodes, determined by
-   * the parseFn. This list begins with a lex token of openKind
-   * and ends with a lex token of closeKind. Advances the parser
-   * to the next lex token after the closing token.
-   */
-  ;
-
-  _proto.many = function many(openKind, parseFn, closeKind) {
-    this.expectToken(openKind);
-    var nodes = [];
-
-    do {
-      nodes.push(parseFn.call(this));
-    } while (!this.expectOptionalToken(closeKind));
-
-    return nodes;
-  };
-
-  return Parser;
-}();
-/**
- * A helper function to describe a token as a string for debugging
- */
-
-
-function getTokenDesc(token) {
-  var value = token.value;
-  return getTokenKindDesc(token.kind) + (value != null ? " \"".concat(value, "\"") : '');
-}
-/**
- * A helper function to describe a token kind as a string for debugging
- */
-
-
-function getTokenKindDesc(kind) {
-  return isPunctuatorTokenKind(kind) ? "\"".concat(kind, "\"") : kind;
-}
diff --git a/node_modules/graphql/language/predicates.d.ts b/node_modules/graphql/language/predicates.d.ts
deleted file mode 100644
index cdbe1f9..0000000
--- a/node_modules/graphql/language/predicates.d.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import {
-  ASTNode,
-  DefinitionNode,
-  ExecutableDefinitionNode,
-  SelectionNode,
-  ValueNode,
-  TypeNode,
-  TypeSystemDefinitionNode,
-  TypeDefinitionNode,
-  TypeSystemExtensionNode,
-  TypeExtensionNode,
-} from './ast';
-
-export function isDefinitionNode(node: ASTNode): node is DefinitionNode;
-
-export function isExecutableDefinitionNode(
-  node: ASTNode,
-): node is ExecutableDefinitionNode;
-
-export function isSelectionNode(node: ASTNode): node is SelectionNode;
-
-export function isValueNode(node: ASTNode): node is ValueNode;
-
-export function isTypeNode(node: ASTNode): node is TypeNode;
-
-export function isTypeSystemDefinitionNode(
-  node: ASTNode,
-): node is TypeSystemDefinitionNode;
-
-export function isTypeDefinitionNode(node: ASTNode): node is TypeDefinitionNode;
-
-export function isTypeSystemExtensionNode(
-  node: ASTNode,
-): node is TypeSystemExtensionNode;
-
-export function isTypeExtensionNode(node: ASTNode): node is TypeExtensionNode;
diff --git a/node_modules/graphql/language/predicates.js b/node_modules/graphql/language/predicates.js
deleted file mode 100644
index f17a94c..0000000
--- a/node_modules/graphql/language/predicates.js
+++ /dev/null
@@ -1,52 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.isDefinitionNode = isDefinitionNode;
-exports.isExecutableDefinitionNode = isExecutableDefinitionNode;
-exports.isSelectionNode = isSelectionNode;
-exports.isValueNode = isValueNode;
-exports.isTypeNode = isTypeNode;
-exports.isTypeSystemDefinitionNode = isTypeSystemDefinitionNode;
-exports.isTypeDefinitionNode = isTypeDefinitionNode;
-exports.isTypeSystemExtensionNode = isTypeSystemExtensionNode;
-exports.isTypeExtensionNode = isTypeExtensionNode;
-
-var _kinds = require("./kinds");
-
-function isDefinitionNode(node) {
-  return isExecutableDefinitionNode(node) || isTypeSystemDefinitionNode(node) || isTypeSystemExtensionNode(node);
-}
-
-function isExecutableDefinitionNode(node) {
-  return node.kind === _kinds.Kind.OPERATION_DEFINITION || node.kind === _kinds.Kind.FRAGMENT_DEFINITION;
-}
-
-function isSelectionNode(node) {
-  return node.kind === _kinds.Kind.FIELD || node.kind === _kinds.Kind.FRAGMENT_SPREAD || node.kind === _kinds.Kind.INLINE_FRAGMENT;
-}
-
-function isValueNode(node) {
-  return node.kind === _kinds.Kind.VARIABLE || node.kind === _kinds.Kind.INT || node.kind === _kinds.Kind.FLOAT || node.kind === _kinds.Kind.STRING || node.kind === _kinds.Kind.BOOLEAN || node.kind === _kinds.Kind.NULL || node.kind === _kinds.Kind.ENUM || node.kind === _kinds.Kind.LIST || node.kind === _kinds.Kind.OBJECT;
-}
-
-function isTypeNode(node) {
-  return node.kind === _kinds.Kind.NAMED_TYPE || node.kind === _kinds.Kind.LIST_TYPE || node.kind === _kinds.Kind.NON_NULL_TYPE;
-}
-
-function isTypeSystemDefinitionNode(node) {
-  return node.kind === _kinds.Kind.SCHEMA_DEFINITION || isTypeDefinitionNode(node) || node.kind === _kinds.Kind.DIRECTIVE_DEFINITION;
-}
-
-function isTypeDefinitionNode(node) {
-  return node.kind === _kinds.Kind.SCALAR_TYPE_DEFINITION || node.kind === _kinds.Kind.OBJECT_TYPE_DEFINITION || node.kind === _kinds.Kind.INTERFACE_TYPE_DEFINITION || node.kind === _kinds.Kind.UNION_TYPE_DEFINITION || node.kind === _kinds.Kind.ENUM_TYPE_DEFINITION || node.kind === _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION;
-}
-
-function isTypeSystemExtensionNode(node) {
-  return node.kind === _kinds.Kind.SCHEMA_EXTENSION || isTypeExtensionNode(node);
-}
-
-function isTypeExtensionNode(node) {
-  return node.kind === _kinds.Kind.SCALAR_TYPE_EXTENSION || node.kind === _kinds.Kind.OBJECT_TYPE_EXTENSION || node.kind === _kinds.Kind.INTERFACE_TYPE_EXTENSION || node.kind === _kinds.Kind.UNION_TYPE_EXTENSION || node.kind === _kinds.Kind.ENUM_TYPE_EXTENSION || node.kind === _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION;
-}
diff --git a/node_modules/graphql/language/predicates.js.flow b/node_modules/graphql/language/predicates.js.flow
deleted file mode 100644
index 9cdef3d..0000000
--- a/node_modules/graphql/language/predicates.js.flow
+++ /dev/null
@@ -1,83 +0,0 @@
-// @flow strict
-
-import { Kind } from './kinds';
-import { type ASTNode } from './ast';
-
-export function isDefinitionNode(node: ASTNode): boolean %checks {
-  return (
-    isExecutableDefinitionNode(node) ||
-    isTypeSystemDefinitionNode(node) ||
-    isTypeSystemExtensionNode(node)
-  );
-}
-
-export function isExecutableDefinitionNode(node: ASTNode): boolean %checks {
-  return (
-    node.kind === Kind.OPERATION_DEFINITION ||
-    node.kind === Kind.FRAGMENT_DEFINITION
-  );
-}
-
-export function isSelectionNode(node: ASTNode): boolean %checks {
-  return (
-    node.kind === Kind.FIELD ||
-    node.kind === Kind.FRAGMENT_SPREAD ||
-    node.kind === Kind.INLINE_FRAGMENT
-  );
-}
-
-export function isValueNode(node: ASTNode): boolean %checks {
-  return (
-    node.kind === Kind.VARIABLE ||
-    node.kind === Kind.INT ||
-    node.kind === Kind.FLOAT ||
-    node.kind === Kind.STRING ||
-    node.kind === Kind.BOOLEAN ||
-    node.kind === Kind.NULL ||
-    node.kind === Kind.ENUM ||
-    node.kind === Kind.LIST ||
-    node.kind === Kind.OBJECT
-  );
-}
-
-export function isTypeNode(node: ASTNode): boolean %checks {
-  return (
-    node.kind === Kind.NAMED_TYPE ||
-    node.kind === Kind.LIST_TYPE ||
-    node.kind === Kind.NON_NULL_TYPE
-  );
-}
-
-export function isTypeSystemDefinitionNode(node: ASTNode): boolean %checks {
-  return (
-    node.kind === Kind.SCHEMA_DEFINITION ||
-    isTypeDefinitionNode(node) ||
-    node.kind === Kind.DIRECTIVE_DEFINITION
-  );
-}
-
-export function isTypeDefinitionNode(node: ASTNode): boolean %checks {
-  return (
-    node.kind === Kind.SCALAR_TYPE_DEFINITION ||
-    node.kind === Kind.OBJECT_TYPE_DEFINITION ||
-    node.kind === Kind.INTERFACE_TYPE_DEFINITION ||
-    node.kind === Kind.UNION_TYPE_DEFINITION ||
-    node.kind === Kind.ENUM_TYPE_DEFINITION ||
-    node.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION
-  );
-}
-
-export function isTypeSystemExtensionNode(node: ASTNode): boolean %checks {
-  return node.kind === Kind.SCHEMA_EXTENSION || isTypeExtensionNode(node);
-}
-
-export function isTypeExtensionNode(node: ASTNode): boolean %checks {
-  return (
-    node.kind === Kind.SCALAR_TYPE_EXTENSION ||
-    node.kind === Kind.OBJECT_TYPE_EXTENSION ||
-    node.kind === Kind.INTERFACE_TYPE_EXTENSION ||
-    node.kind === Kind.UNION_TYPE_EXTENSION ||
-    node.kind === Kind.ENUM_TYPE_EXTENSION ||
-    node.kind === Kind.INPUT_OBJECT_TYPE_EXTENSION
-  );
-}
diff --git a/node_modules/graphql/language/predicates.mjs b/node_modules/graphql/language/predicates.mjs
deleted file mode 100644
index 7a066f7..0000000
--- a/node_modules/graphql/language/predicates.mjs
+++ /dev/null
@@ -1,28 +0,0 @@
-import { Kind } from "./kinds.mjs";
-export function isDefinitionNode(node) {
-  return isExecutableDefinitionNode(node) || isTypeSystemDefinitionNode(node) || isTypeSystemExtensionNode(node);
-}
-export function isExecutableDefinitionNode(node) {
-  return node.kind === Kind.OPERATION_DEFINITION || node.kind === Kind.FRAGMENT_DEFINITION;
-}
-export function isSelectionNode(node) {
-  return node.kind === Kind.FIELD || node.kind === Kind.FRAGMENT_SPREAD || node.kind === Kind.INLINE_FRAGMENT;
-}
-export function isValueNode(node) {
-  return node.kind === Kind.VARIABLE || node.kind === Kind.INT || node.kind === Kind.FLOAT || node.kind === Kind.STRING || node.kind === Kind.BOOLEAN || node.kind === Kind.NULL || node.kind === Kind.ENUM || node.kind === Kind.LIST || node.kind === Kind.OBJECT;
-}
-export function isTypeNode(node) {
-  return node.kind === Kind.NAMED_TYPE || node.kind === Kind.LIST_TYPE || node.kind === Kind.NON_NULL_TYPE;
-}
-export function isTypeSystemDefinitionNode(node) {
-  return node.kind === Kind.SCHEMA_DEFINITION || isTypeDefinitionNode(node) || node.kind === Kind.DIRECTIVE_DEFINITION;
-}
-export function isTypeDefinitionNode(node) {
-  return node.kind === Kind.SCALAR_TYPE_DEFINITION || node.kind === Kind.OBJECT_TYPE_DEFINITION || node.kind === Kind.INTERFACE_TYPE_DEFINITION || node.kind === Kind.UNION_TYPE_DEFINITION || node.kind === Kind.ENUM_TYPE_DEFINITION || node.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION;
-}
-export function isTypeSystemExtensionNode(node) {
-  return node.kind === Kind.SCHEMA_EXTENSION || isTypeExtensionNode(node);
-}
-export function isTypeExtensionNode(node) {
-  return node.kind === Kind.SCALAR_TYPE_EXTENSION || node.kind === Kind.OBJECT_TYPE_EXTENSION || node.kind === Kind.INTERFACE_TYPE_EXTENSION || node.kind === Kind.UNION_TYPE_EXTENSION || node.kind === Kind.ENUM_TYPE_EXTENSION || node.kind === Kind.INPUT_OBJECT_TYPE_EXTENSION;
-}
diff --git a/node_modules/graphql/language/printLocation.d.ts b/node_modules/graphql/language/printLocation.d.ts
deleted file mode 100644
index 7d0c347..0000000
--- a/node_modules/graphql/language/printLocation.d.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Location } from './ast';
-import { Source } from './source';
-import { SourceLocation } from './location';
-
-/**
- * Render a helpful description of the location in the GraphQL Source document.
- */
-export function printLocation(location: Location): string;
-
-/**
- * Render a helpful description of the location in the GraphQL Source document.
- */
-export function printSourceLocation(
-  source: Source,
-  sourceLocation: SourceLocation,
-): string;
diff --git a/node_modules/graphql/language/printLocation.js b/node_modules/graphql/language/printLocation.js
deleted file mode 100644
index 6f8d526..0000000
--- a/node_modules/graphql/language/printLocation.js
+++ /dev/null
@@ -1,75 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.printLocation = printLocation;
-exports.printSourceLocation = printSourceLocation;
-
-var _location = require("./location");
-
-/**
- * Render a helpful description of the location in the GraphQL Source document.
- */
-function printLocation(location) {
-  return printSourceLocation(location.source, (0, _location.getLocation)(location.source, location.start));
-}
-/**
- * Render a helpful description of the location in the GraphQL Source document.
- */
-
-
-function printSourceLocation(source, sourceLocation) {
-  var firstLineColumnOffset = source.locationOffset.column - 1;
-  var body = whitespace(firstLineColumnOffset) + source.body;
-  var lineIndex = sourceLocation.line - 1;
-  var lineOffset = source.locationOffset.line - 1;
-  var lineNum = sourceLocation.line + lineOffset;
-  var columnOffset = sourceLocation.line === 1 ? firstLineColumnOffset : 0;
-  var columnNum = sourceLocation.column + columnOffset;
-  var locationStr = "".concat(source.name, ":").concat(lineNum, ":").concat(columnNum, "\n");
-  var lines = body.split(/\r\n|[\n\r]/g);
-  var locationLine = lines[lineIndex]; // Special case for minified documents
-
-  if (locationLine.length > 120) {
-    var subLineIndex = Math.floor(columnNum / 80);
-    var subLineColumnNum = columnNum % 80;
-    var subLines = [];
-
-    for (var i = 0; i < locationLine.length; i += 80) {
-      subLines.push(locationLine.slice(i, i + 80));
-    }
-
-    return locationStr + printPrefixedLines([["".concat(lineNum), subLines[0]]].concat(subLines.slice(1, subLineIndex + 1).map(function (subLine) {
-      return ['', subLine];
-    }), [[' ', whitespace(subLineColumnNum - 1) + '^'], ['', subLines[subLineIndex + 1]]]));
-  }
-
-  return locationStr + printPrefixedLines([// Lines specified like this: ["prefix", "string"],
-  ["".concat(lineNum - 1), lines[lineIndex - 1]], ["".concat(lineNum), locationLine], ['', whitespace(columnNum - 1) + '^'], ["".concat(lineNum + 1), lines[lineIndex + 1]]]);
-}
-
-function printPrefixedLines(lines) {
-  var existingLines = lines.filter(function (_ref) {
-    var _ = _ref[0],
-        line = _ref[1];
-    return line !== undefined;
-  });
-  var padLen = Math.max.apply(Math, existingLines.map(function (_ref2) {
-    var prefix = _ref2[0];
-    return prefix.length;
-  }));
-  return existingLines.map(function (_ref3) {
-    var prefix = _ref3[0],
-        line = _ref3[1];
-    return leftPad(padLen, prefix) + (line ? ' | ' + line : ' |');
-  }).join('\n');
-}
-
-function whitespace(len) {
-  return Array(len + 1).join(' ');
-}
-
-function leftPad(len, str) {
-  return whitespace(len - str.length) + str;
-}
diff --git a/node_modules/graphql/language/printLocation.js.flow b/node_modules/graphql/language/printLocation.js.flow
deleted file mode 100644
index 536d5ab..0000000
--- a/node_modules/graphql/language/printLocation.js.flow
+++ /dev/null
@@ -1,88 +0,0 @@
-// @flow strict
-
-import { type Location } from './ast';
-import { type Source } from './source';
-import { type SourceLocation, getLocation } from './location';
-
-/**
- * Render a helpful description of the location in the GraphQL Source document.
- */
-export function printLocation(location: Location): string {
-  return printSourceLocation(
-    location.source,
-    getLocation(location.source, location.start),
-  );
-}
-
-/**
- * Render a helpful description of the location in the GraphQL Source document.
- */
-export function printSourceLocation(
-  source: Source,
-  sourceLocation: SourceLocation,
-): string {
-  const firstLineColumnOffset = source.locationOffset.column - 1;
-  const body = whitespace(firstLineColumnOffset) + source.body;
-
-  const lineIndex = sourceLocation.line - 1;
-  const lineOffset = source.locationOffset.line - 1;
-  const lineNum = sourceLocation.line + lineOffset;
-
-  const columnOffset = sourceLocation.line === 1 ? firstLineColumnOffset : 0;
-  const columnNum = sourceLocation.column + columnOffset;
-  const locationStr = `${source.name}:${lineNum}:${columnNum}\n`;
-
-  const lines = body.split(/\r\n|[\n\r]/g);
-  const locationLine = lines[lineIndex];
-
-  // Special case for minified documents
-  if (locationLine.length > 120) {
-    const subLineIndex = Math.floor(columnNum / 80);
-    const subLineColumnNum = columnNum % 80;
-    const subLines = [];
-    for (let i = 0; i < locationLine.length; i += 80) {
-      subLines.push(locationLine.slice(i, i + 80));
-    }
-
-    return (
-      locationStr +
-      printPrefixedLines([
-        [`${lineNum}`, subLines[0]],
-        ...subLines.slice(1, subLineIndex + 1).map(subLine => ['', subLine]),
-        [' ', whitespace(subLineColumnNum - 1) + '^'],
-        ['', subLines[subLineIndex + 1]],
-      ])
-    );
-  }
-
-  return (
-    locationStr +
-    printPrefixedLines([
-      // Lines specified like this: ["prefix", "string"],
-      [`${lineNum - 1}`, lines[lineIndex - 1]],
-      [`${lineNum}`, locationLine],
-      ['', whitespace(columnNum - 1) + '^'],
-      [`${lineNum + 1}`, lines[lineIndex + 1]],
-    ])
-  );
-}
-
-function printPrefixedLines(lines: $ReadOnlyArray<[string, string]>): string {
-  const existingLines = lines.filter(([_, line]) => line !== undefined);
-
-  const padLen = Math.max(...existingLines.map(([prefix]) => prefix.length));
-  return existingLines
-    .map(
-      ([prefix, line]) =>
-        leftPad(padLen, prefix) + (line ? ' | ' + line : ' |'),
-    )
-    .join('\n');
-}
-
-function whitespace(len: number): string {
-  return Array(len + 1).join(' ');
-}
-
-function leftPad(len: number, str: string): string {
-  return whitespace(len - str.length) + str;
-}
diff --git a/node_modules/graphql/language/printLocation.mjs b/node_modules/graphql/language/printLocation.mjs
deleted file mode 100644
index c683f26..0000000
--- a/node_modules/graphql/language/printLocation.mjs
+++ /dev/null
@@ -1,66 +0,0 @@
-import { getLocation } from "./location.mjs";
-/**
- * Render a helpful description of the location in the GraphQL Source document.
- */
-
-export function printLocation(location) {
-  return printSourceLocation(location.source, getLocation(location.source, location.start));
-}
-/**
- * Render a helpful description of the location in the GraphQL Source document.
- */
-
-export function printSourceLocation(source, sourceLocation) {
-  var firstLineColumnOffset = source.locationOffset.column - 1;
-  var body = whitespace(firstLineColumnOffset) + source.body;
-  var lineIndex = sourceLocation.line - 1;
-  var lineOffset = source.locationOffset.line - 1;
-  var lineNum = sourceLocation.line + lineOffset;
-  var columnOffset = sourceLocation.line === 1 ? firstLineColumnOffset : 0;
-  var columnNum = sourceLocation.column + columnOffset;
-  var locationStr = "".concat(source.name, ":").concat(lineNum, ":").concat(columnNum, "\n");
-  var lines = body.split(/\r\n|[\n\r]/g);
-  var locationLine = lines[lineIndex]; // Special case for minified documents
-
-  if (locationLine.length > 120) {
-    var subLineIndex = Math.floor(columnNum / 80);
-    var subLineColumnNum = columnNum % 80;
-    var subLines = [];
-
-    for (var i = 0; i < locationLine.length; i += 80) {
-      subLines.push(locationLine.slice(i, i + 80));
-    }
-
-    return locationStr + printPrefixedLines([["".concat(lineNum), subLines[0]]].concat(subLines.slice(1, subLineIndex + 1).map(function (subLine) {
-      return ['', subLine];
-    }), [[' ', whitespace(subLineColumnNum - 1) + '^'], ['', subLines[subLineIndex + 1]]]));
-  }
-
-  return locationStr + printPrefixedLines([// Lines specified like this: ["prefix", "string"],
-  ["".concat(lineNum - 1), lines[lineIndex - 1]], ["".concat(lineNum), locationLine], ['', whitespace(columnNum - 1) + '^'], ["".concat(lineNum + 1), lines[lineIndex + 1]]]);
-}
-
-function printPrefixedLines(lines) {
-  var existingLines = lines.filter(function (_ref) {
-    var _ = _ref[0],
-        line = _ref[1];
-    return line !== undefined;
-  });
-  var padLen = Math.max.apply(Math, existingLines.map(function (_ref2) {
-    var prefix = _ref2[0];
-    return prefix.length;
-  }));
-  return existingLines.map(function (_ref3) {
-    var prefix = _ref3[0],
-        line = _ref3[1];
-    return leftPad(padLen, prefix) + (line ? ' | ' + line : ' |');
-  }).join('\n');
-}
-
-function whitespace(len) {
-  return Array(len + 1).join(' ');
-}
-
-function leftPad(len, str) {
-  return whitespace(len - str.length) + str;
-}
diff --git a/node_modules/graphql/language/printer.d.ts b/node_modules/graphql/language/printer.d.ts
deleted file mode 100644
index 9329b45..0000000
--- a/node_modules/graphql/language/printer.d.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { ASTNode } from './ast';
-
-/**
- * Converts an AST into a string, using one set of reasonable
- * formatting rules.
- */
-export function print(ast: ASTNode): string;
diff --git a/node_modules/graphql/language/printer.js b/node_modules/graphql/language/printer.js
deleted file mode 100644
index 4f14e14..0000000
--- a/node_modules/graphql/language/printer.js
+++ /dev/null
@@ -1,315 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.print = print;
-
-var _visitor = require("./visitor");
-
-var _blockString = require("./blockString");
-
-/**
- * Converts an AST into a string, using one set of reasonable
- * formatting rules.
- */
-function print(ast) {
-  return (0, _visitor.visit)(ast, {
-    leave: printDocASTReducer
-  });
-} // TODO: provide better type coverage in future
-
-
-var printDocASTReducer = {
-  Name: function Name(node) {
-    return node.value;
-  },
-  Variable: function Variable(node) {
-    return '$' + node.name;
-  },
-  // Document
-  Document: function Document(node) {
-    return join(node.definitions, '\n\n') + '\n';
-  },
-  OperationDefinition: function OperationDefinition(node) {
-    var op = node.operation;
-    var name = node.name;
-    var varDefs = wrap('(', join(node.variableDefinitions, ', '), ')');
-    var directives = join(node.directives, ' ');
-    var selectionSet = node.selectionSet; // Anonymous queries with no directives or variable definitions can use
-    // the query short form.
-
-    return !name && !directives && !varDefs && op === 'query' ? selectionSet : join([op, join([name, varDefs]), directives, selectionSet], ' ');
-  },
-  VariableDefinition: function VariableDefinition(_ref) {
-    var variable = _ref.variable,
-        type = _ref.type,
-        defaultValue = _ref.defaultValue,
-        directives = _ref.directives;
-    return variable + ': ' + type + wrap(' = ', defaultValue) + wrap(' ', join(directives, ' '));
-  },
-  SelectionSet: function SelectionSet(_ref2) {
-    var selections = _ref2.selections;
-    return block(selections);
-  },
-  Field: function Field(_ref3) {
-    var alias = _ref3.alias,
-        name = _ref3.name,
-        args = _ref3.arguments,
-        directives = _ref3.directives,
-        selectionSet = _ref3.selectionSet;
-    return join([wrap('', alias, ': ') + name + wrap('(', join(args, ', '), ')'), join(directives, ' '), selectionSet], ' ');
-  },
-  Argument: function Argument(_ref4) {
-    var name = _ref4.name,
-        value = _ref4.value;
-    return name + ': ' + value;
-  },
-  // Fragments
-  FragmentSpread: function FragmentSpread(_ref5) {
-    var name = _ref5.name,
-        directives = _ref5.directives;
-    return '...' + name + wrap(' ', join(directives, ' '));
-  },
-  InlineFragment: function InlineFragment(_ref6) {
-    var typeCondition = _ref6.typeCondition,
-        directives = _ref6.directives,
-        selectionSet = _ref6.selectionSet;
-    return join(['...', wrap('on ', typeCondition), join(directives, ' '), selectionSet], ' ');
-  },
-  FragmentDefinition: function FragmentDefinition(_ref7) {
-    var name = _ref7.name,
-        typeCondition = _ref7.typeCondition,
-        variableDefinitions = _ref7.variableDefinitions,
-        directives = _ref7.directives,
-        selectionSet = _ref7.selectionSet;
-    return (// Note: fragment variable definitions are experimental and may be changed
-      // or removed in the future.
-      "fragment ".concat(name).concat(wrap('(', join(variableDefinitions, ', '), ')'), " ") + "on ".concat(typeCondition, " ").concat(wrap('', join(directives, ' '), ' ')) + selectionSet
-    );
-  },
-  // Value
-  IntValue: function IntValue(_ref8) {
-    var value = _ref8.value;
-    return value;
-  },
-  FloatValue: function FloatValue(_ref9) {
-    var value = _ref9.value;
-    return value;
-  },
-  StringValue: function StringValue(_ref10, key) {
-    var value = _ref10.value,
-        isBlockString = _ref10.block;
-    return isBlockString ? (0, _blockString.printBlockString)(value, key === 'description' ? '' : '  ') : JSON.stringify(value);
-  },
-  BooleanValue: function BooleanValue(_ref11) {
-    var value = _ref11.value;
-    return value ? 'true' : 'false';
-  },
-  NullValue: function NullValue() {
-    return 'null';
-  },
-  EnumValue: function EnumValue(_ref12) {
-    var value = _ref12.value;
-    return value;
-  },
-  ListValue: function ListValue(_ref13) {
-    var values = _ref13.values;
-    return '[' + join(values, ', ') + ']';
-  },
-  ObjectValue: function ObjectValue(_ref14) {
-    var fields = _ref14.fields;
-    return '{' + join(fields, ', ') + '}';
-  },
-  ObjectField: function ObjectField(_ref15) {
-    var name = _ref15.name,
-        value = _ref15.value;
-    return name + ': ' + value;
-  },
-  // Directive
-  Directive: function Directive(_ref16) {
-    var name = _ref16.name,
-        args = _ref16.arguments;
-    return '@' + name + wrap('(', join(args, ', '), ')');
-  },
-  // Type
-  NamedType: function NamedType(_ref17) {
-    var name = _ref17.name;
-    return name;
-  },
-  ListType: function ListType(_ref18) {
-    var type = _ref18.type;
-    return '[' + type + ']';
-  },
-  NonNullType: function NonNullType(_ref19) {
-    var type = _ref19.type;
-    return type + '!';
-  },
-  // Type System Definitions
-  SchemaDefinition: addDescription(function (_ref20) {
-    var directives = _ref20.directives,
-        operationTypes = _ref20.operationTypes;
-    return join(['schema', join(directives, ' '), block(operationTypes)], ' ');
-  }),
-  OperationTypeDefinition: function OperationTypeDefinition(_ref21) {
-    var operation = _ref21.operation,
-        type = _ref21.type;
-    return operation + ': ' + type;
-  },
-  ScalarTypeDefinition: addDescription(function (_ref22) {
-    var name = _ref22.name,
-        directives = _ref22.directives;
-    return join(['scalar', name, join(directives, ' ')], ' ');
-  }),
-  ObjectTypeDefinition: addDescription(function (_ref23) {
-    var name = _ref23.name,
-        interfaces = _ref23.interfaces,
-        directives = _ref23.directives,
-        fields = _ref23.fields;
-    return join(['type', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ');
-  }),
-  FieldDefinition: addDescription(function (_ref24) {
-    var name = _ref24.name,
-        args = _ref24.arguments,
-        type = _ref24.type,
-        directives = _ref24.directives;
-    return name + (hasMultilineItems(args) ? wrap('(\n', indent(join(args, '\n')), '\n)') : wrap('(', join(args, ', '), ')')) + ': ' + type + wrap(' ', join(directives, ' '));
-  }),
-  InputValueDefinition: addDescription(function (_ref25) {
-    var name = _ref25.name,
-        type = _ref25.type,
-        defaultValue = _ref25.defaultValue,
-        directives = _ref25.directives;
-    return join([name + ': ' + type, wrap('= ', defaultValue), join(directives, ' ')], ' ');
-  }),
-  InterfaceTypeDefinition: addDescription(function (_ref26) {
-    var name = _ref26.name,
-        interfaces = _ref26.interfaces,
-        directives = _ref26.directives,
-        fields = _ref26.fields;
-    return join(['interface', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ');
-  }),
-  UnionTypeDefinition: addDescription(function (_ref27) {
-    var name = _ref27.name,
-        directives = _ref27.directives,
-        types = _ref27.types;
-    return join(['union', name, join(directives, ' '), types && types.length !== 0 ? '= ' + join(types, ' | ') : ''], ' ');
-  }),
-  EnumTypeDefinition: addDescription(function (_ref28) {
-    var name = _ref28.name,
-        directives = _ref28.directives,
-        values = _ref28.values;
-    return join(['enum', name, join(directives, ' '), block(values)], ' ');
-  }),
-  EnumValueDefinition: addDescription(function (_ref29) {
-    var name = _ref29.name,
-        directives = _ref29.directives;
-    return join([name, join(directives, ' ')], ' ');
-  }),
-  InputObjectTypeDefinition: addDescription(function (_ref30) {
-    var name = _ref30.name,
-        directives = _ref30.directives,
-        fields = _ref30.fields;
-    return join(['input', name, join(directives, ' '), block(fields)], ' ');
-  }),
-  DirectiveDefinition: addDescription(function (_ref31) {
-    var name = _ref31.name,
-        args = _ref31.arguments,
-        repeatable = _ref31.repeatable,
-        locations = _ref31.locations;
-    return 'directive @' + name + (hasMultilineItems(args) ? wrap('(\n', indent(join(args, '\n')), '\n)') : wrap('(', join(args, ', '), ')')) + (repeatable ? ' repeatable' : '') + ' on ' + join(locations, ' | ');
-  }),
-  SchemaExtension: function SchemaExtension(_ref32) {
-    var directives = _ref32.directives,
-        operationTypes = _ref32.operationTypes;
-    return join(['extend schema', join(directives, ' '), block(operationTypes)], ' ');
-  },
-  ScalarTypeExtension: function ScalarTypeExtension(_ref33) {
-    var name = _ref33.name,
-        directives = _ref33.directives;
-    return join(['extend scalar', name, join(directives, ' ')], ' ');
-  },
-  ObjectTypeExtension: function ObjectTypeExtension(_ref34) {
-    var name = _ref34.name,
-        interfaces = _ref34.interfaces,
-        directives = _ref34.directives,
-        fields = _ref34.fields;
-    return join(['extend type', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ');
-  },
-  InterfaceTypeExtension: function InterfaceTypeExtension(_ref35) {
-    var name = _ref35.name,
-        interfaces = _ref35.interfaces,
-        directives = _ref35.directives,
-        fields = _ref35.fields;
-    return join(['extend interface', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ');
-  },
-  UnionTypeExtension: function UnionTypeExtension(_ref36) {
-    var name = _ref36.name,
-        directives = _ref36.directives,
-        types = _ref36.types;
-    return join(['extend union', name, join(directives, ' '), types && types.length !== 0 ? '= ' + join(types, ' | ') : ''], ' ');
-  },
-  EnumTypeExtension: function EnumTypeExtension(_ref37) {
-    var name = _ref37.name,
-        directives = _ref37.directives,
-        values = _ref37.values;
-    return join(['extend enum', name, join(directives, ' '), block(values)], ' ');
-  },
-  InputObjectTypeExtension: function InputObjectTypeExtension(_ref38) {
-    var name = _ref38.name,
-        directives = _ref38.directives,
-        fields = _ref38.fields;
-    return join(['extend input', name, join(directives, ' '), block(fields)], ' ');
-  }
-};
-
-function addDescription(cb) {
-  return function (node) {
-    return join([node.description, cb(node)], '\n');
-  };
-}
-/**
- * Given maybeArray, print an empty string if it is null or empty, otherwise
- * print all items together separated by separator if provided
- */
-
-
-function join(maybeArray) {
-  var _ref39;
-
-  var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
-  return (_ref39 = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.filter(function (x) {
-    return x;
-  }).join(separator)) !== null && _ref39 !== void 0 ? _ref39 : '';
-}
-/**
- * Given array, print each item on its own line, wrapped in an
- * indented "{ }" block.
- */
-
-
-function block(array) {
-  return array && array.length !== 0 ? '{\n' + indent(join(array, '\n')) + '\n}' : '';
-}
-/**
- * If maybeString is not null or empty, then wrap with start and end, otherwise
- * print an empty string.
- */
-
-
-function wrap(start, maybeString) {
-  var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
-  return maybeString ? start + maybeString + end : '';
-}
-
-function indent(maybeString) {
-  return maybeString && '  ' + maybeString.replace(/\n/g, '\n  ');
-}
-
-function isMultiline(string) {
-  return string.indexOf('\n') !== -1;
-}
-
-function hasMultilineItems(maybeArray) {
-  return maybeArray && maybeArray.some(isMultiline);
-}
diff --git a/node_modules/graphql/language/printer.js.flow b/node_modules/graphql/language/printer.js.flow
deleted file mode 100644
index aeff16b..0000000
--- a/node_modules/graphql/language/printer.js.flow
+++ /dev/null
@@ -1,290 +0,0 @@
-// @flow strict
-
-import { visit } from './visitor';
-import { type ASTNode } from './ast';
-import { printBlockString } from './blockString';
-
-/**
- * Converts an AST into a string, using one set of reasonable
- * formatting rules.
- */
-export function print(ast: ASTNode): string {
-  return visit(ast, { leave: printDocASTReducer });
-}
-
-// TODO: provide better type coverage in future
-const printDocASTReducer: any = {
-  Name: node => node.value,
-  Variable: node => '$' + node.name,
-
-  // Document
-
-  Document: node => join(node.definitions, '\n\n') + '\n',
-
-  OperationDefinition(node) {
-    const op = node.operation;
-    const name = node.name;
-    const varDefs = wrap('(', join(node.variableDefinitions, ', '), ')');
-    const directives = join(node.directives, ' ');
-    const selectionSet = node.selectionSet;
-    // Anonymous queries with no directives or variable definitions can use
-    // the query short form.
-    return !name && !directives && !varDefs && op === 'query'
-      ? selectionSet
-      : join([op, join([name, varDefs]), directives, selectionSet], ' ');
-  },
-
-  VariableDefinition: ({ variable, type, defaultValue, directives }) =>
-    variable +
-    ': ' +
-    type +
-    wrap(' = ', defaultValue) +
-    wrap(' ', join(directives, ' ')),
-  SelectionSet: ({ selections }) => block(selections),
-
-  Field: ({ alias, name, arguments: args, directives, selectionSet }) =>
-    join(
-      [
-        wrap('', alias, ': ') + name + wrap('(', join(args, ', '), ')'),
-        join(directives, ' '),
-        selectionSet,
-      ],
-      ' ',
-    ),
-
-  Argument: ({ name, value }) => name + ': ' + value,
-
-  // Fragments
-
-  FragmentSpread: ({ name, directives }) =>
-    '...' + name + wrap(' ', join(directives, ' ')),
-
-  InlineFragment: ({ typeCondition, directives, selectionSet }) =>
-    join(
-      ['...', wrap('on ', typeCondition), join(directives, ' '), selectionSet],
-      ' ',
-    ),
-
-  FragmentDefinition: ({
-    name,
-    typeCondition,
-    variableDefinitions,
-    directives,
-    selectionSet,
-  }) =>
-    // Note: fragment variable definitions are experimental and may be changed
-    // or removed in the future.
-    `fragment ${name}${wrap('(', join(variableDefinitions, ', '), ')')} ` +
-    `on ${typeCondition} ${wrap('', join(directives, ' '), ' ')}` +
-    selectionSet,
-
-  // Value
-
-  IntValue: ({ value }) => value,
-  FloatValue: ({ value }) => value,
-  StringValue: ({ value, block: isBlockString }, key) =>
-    isBlockString
-      ? printBlockString(value, key === 'description' ? '' : '  ')
-      : JSON.stringify(value),
-  BooleanValue: ({ value }) => (value ? 'true' : 'false'),
-  NullValue: () => 'null',
-  EnumValue: ({ value }) => value,
-  ListValue: ({ values }) => '[' + join(values, ', ') + ']',
-  ObjectValue: ({ fields }) => '{' + join(fields, ', ') + '}',
-  ObjectField: ({ name, value }) => name + ': ' + value,
-
-  // Directive
-
-  Directive: ({ name, arguments: args }) =>
-    '@' + name + wrap('(', join(args, ', '), ')'),
-
-  // Type
-
-  NamedType: ({ name }) => name,
-  ListType: ({ type }) => '[' + type + ']',
-  NonNullType: ({ type }) => type + '!',
-
-  // Type System Definitions
-
-  SchemaDefinition: addDescription(({ directives, operationTypes }) =>
-    join(['schema', join(directives, ' '), block(operationTypes)], ' '),
-  ),
-
-  OperationTypeDefinition: ({ operation, type }) => operation + ': ' + type,
-
-  ScalarTypeDefinition: addDescription(({ name, directives }) =>
-    join(['scalar', name, join(directives, ' ')], ' '),
-  ),
-
-  ObjectTypeDefinition: addDescription(
-    ({ name, interfaces, directives, fields }) =>
-      join(
-        [
-          'type',
-          name,
-          wrap('implements ', join(interfaces, ' & ')),
-          join(directives, ' '),
-          block(fields),
-        ],
-        ' ',
-      ),
-  ),
-
-  FieldDefinition: addDescription(
-    ({ name, arguments: args, type, directives }) =>
-      name +
-      (hasMultilineItems(args)
-        ? wrap('(\n', indent(join(args, '\n')), '\n)')
-        : wrap('(', join(args, ', '), ')')) +
-      ': ' +
-      type +
-      wrap(' ', join(directives, ' ')),
-  ),
-
-  InputValueDefinition: addDescription(
-    ({ name, type, defaultValue, directives }) =>
-      join(
-        [name + ': ' + type, wrap('= ', defaultValue), join(directives, ' ')],
-        ' ',
-      ),
-  ),
-
-  InterfaceTypeDefinition: addDescription(
-    ({ name, interfaces, directives, fields }) =>
-      join(
-        [
-          'interface',
-          name,
-          wrap('implements ', join(interfaces, ' & ')),
-          join(directives, ' '),
-          block(fields),
-        ],
-        ' ',
-      ),
-  ),
-
-  UnionTypeDefinition: addDescription(({ name, directives, types }) =>
-    join(
-      [
-        'union',
-        name,
-        join(directives, ' '),
-        types && types.length !== 0 ? '= ' + join(types, ' | ') : '',
-      ],
-      ' ',
-    ),
-  ),
-
-  EnumTypeDefinition: addDescription(({ name, directives, values }) =>
-    join(['enum', name, join(directives, ' '), block(values)], ' '),
-  ),
-
-  EnumValueDefinition: addDescription(({ name, directives }) =>
-    join([name, join(directives, ' ')], ' '),
-  ),
-
-  InputObjectTypeDefinition: addDescription(({ name, directives, fields }) =>
-    join(['input', name, join(directives, ' '), block(fields)], ' '),
-  ),
-
-  DirectiveDefinition: addDescription(
-    ({ name, arguments: args, repeatable, locations }) =>
-      'directive @' +
-      name +
-      (hasMultilineItems(args)
-        ? wrap('(\n', indent(join(args, '\n')), '\n)')
-        : wrap('(', join(args, ', '), ')')) +
-      (repeatable ? ' repeatable' : '') +
-      ' on ' +
-      join(locations, ' | '),
-  ),
-
-  SchemaExtension: ({ directives, operationTypes }) =>
-    join(['extend schema', join(directives, ' '), block(operationTypes)], ' '),
-
-  ScalarTypeExtension: ({ name, directives }) =>
-    join(['extend scalar', name, join(directives, ' ')], ' '),
-
-  ObjectTypeExtension: ({ name, interfaces, directives, fields }) =>
-    join(
-      [
-        'extend type',
-        name,
-        wrap('implements ', join(interfaces, ' & ')),
-        join(directives, ' '),
-        block(fields),
-      ],
-      ' ',
-    ),
-
-  InterfaceTypeExtension: ({ name, interfaces, directives, fields }) =>
-    join(
-      [
-        'extend interface',
-        name,
-        wrap('implements ', join(interfaces, ' & ')),
-        join(directives, ' '),
-        block(fields),
-      ],
-      ' ',
-    ),
-
-  UnionTypeExtension: ({ name, directives, types }) =>
-    join(
-      [
-        'extend union',
-        name,
-        join(directives, ' '),
-        types && types.length !== 0 ? '= ' + join(types, ' | ') : '',
-      ],
-      ' ',
-    ),
-
-  EnumTypeExtension: ({ name, directives, values }) =>
-    join(['extend enum', name, join(directives, ' '), block(values)], ' '),
-
-  InputObjectTypeExtension: ({ name, directives, fields }) =>
-    join(['extend input', name, join(directives, ' '), block(fields)], ' '),
-};
-
-function addDescription(cb) {
-  return node => join([node.description, cb(node)], '\n');
-}
-
-/**
- * Given maybeArray, print an empty string if it is null or empty, otherwise
- * print all items together separated by separator if provided
- */
-function join(maybeArray: ?Array<string>, separator = '') {
-  return maybeArray?.filter(x => x).join(separator) ?? '';
-}
-
-/**
- * Given array, print each item on its own line, wrapped in an
- * indented "{ }" block.
- */
-function block(array) {
-  return array && array.length !== 0
-    ? '{\n' + indent(join(array, '\n')) + '\n}'
-    : '';
-}
-
-/**
- * If maybeString is not null or empty, then wrap with start and end, otherwise
- * print an empty string.
- */
-function wrap(start, maybeString, end = '') {
-  return maybeString ? start + maybeString + end : '';
-}
-
-function indent(maybeString) {
-  return maybeString && '  ' + maybeString.replace(/\n/g, '\n  ');
-}
-
-function isMultiline(string) {
-  return string.indexOf('\n') !== -1;
-}
-
-function hasMultilineItems(maybeArray) {
-  return maybeArray && maybeArray.some(isMultiline);
-}
diff --git a/node_modules/graphql/language/printer.mjs b/node_modules/graphql/language/printer.mjs
deleted file mode 100644
index 60135e8..0000000
--- a/node_modules/graphql/language/printer.mjs
+++ /dev/null
@@ -1,306 +0,0 @@
-import { visit } from "./visitor.mjs";
-import { printBlockString } from "./blockString.mjs";
-/**
- * Converts an AST into a string, using one set of reasonable
- * formatting rules.
- */
-
-export function print(ast) {
-  return visit(ast, {
-    leave: printDocASTReducer
-  });
-} // TODO: provide better type coverage in future
-
-var printDocASTReducer = {
-  Name: function Name(node) {
-    return node.value;
-  },
-  Variable: function Variable(node) {
-    return '$' + node.name;
-  },
-  // Document
-  Document: function Document(node) {
-    return join(node.definitions, '\n\n') + '\n';
-  },
-  OperationDefinition: function OperationDefinition(node) {
-    var op = node.operation;
-    var name = node.name;
-    var varDefs = wrap('(', join(node.variableDefinitions, ', '), ')');
-    var directives = join(node.directives, ' ');
-    var selectionSet = node.selectionSet; // Anonymous queries with no directives or variable definitions can use
-    // the query short form.
-
-    return !name && !directives && !varDefs && op === 'query' ? selectionSet : join([op, join([name, varDefs]), directives, selectionSet], ' ');
-  },
-  VariableDefinition: function VariableDefinition(_ref) {
-    var variable = _ref.variable,
-        type = _ref.type,
-        defaultValue = _ref.defaultValue,
-        directives = _ref.directives;
-    return variable + ': ' + type + wrap(' = ', defaultValue) + wrap(' ', join(directives, ' '));
-  },
-  SelectionSet: function SelectionSet(_ref2) {
-    var selections = _ref2.selections;
-    return block(selections);
-  },
-  Field: function Field(_ref3) {
-    var alias = _ref3.alias,
-        name = _ref3.name,
-        args = _ref3.arguments,
-        directives = _ref3.directives,
-        selectionSet = _ref3.selectionSet;
-    return join([wrap('', alias, ': ') + name + wrap('(', join(args, ', '), ')'), join(directives, ' '), selectionSet], ' ');
-  },
-  Argument: function Argument(_ref4) {
-    var name = _ref4.name,
-        value = _ref4.value;
-    return name + ': ' + value;
-  },
-  // Fragments
-  FragmentSpread: function FragmentSpread(_ref5) {
-    var name = _ref5.name,
-        directives = _ref5.directives;
-    return '...' + name + wrap(' ', join(directives, ' '));
-  },
-  InlineFragment: function InlineFragment(_ref6) {
-    var typeCondition = _ref6.typeCondition,
-        directives = _ref6.directives,
-        selectionSet = _ref6.selectionSet;
-    return join(['...', wrap('on ', typeCondition), join(directives, ' '), selectionSet], ' ');
-  },
-  FragmentDefinition: function FragmentDefinition(_ref7) {
-    var name = _ref7.name,
-        typeCondition = _ref7.typeCondition,
-        variableDefinitions = _ref7.variableDefinitions,
-        directives = _ref7.directives,
-        selectionSet = _ref7.selectionSet;
-    return (// Note: fragment variable definitions are experimental and may be changed
-      // or removed in the future.
-      "fragment ".concat(name).concat(wrap('(', join(variableDefinitions, ', '), ')'), " ") + "on ".concat(typeCondition, " ").concat(wrap('', join(directives, ' '), ' ')) + selectionSet
-    );
-  },
-  // Value
-  IntValue: function IntValue(_ref8) {
-    var value = _ref8.value;
-    return value;
-  },
-  FloatValue: function FloatValue(_ref9) {
-    var value = _ref9.value;
-    return value;
-  },
-  StringValue: function StringValue(_ref10, key) {
-    var value = _ref10.value,
-        isBlockString = _ref10.block;
-    return isBlockString ? printBlockString(value, key === 'description' ? '' : '  ') : JSON.stringify(value);
-  },
-  BooleanValue: function BooleanValue(_ref11) {
-    var value = _ref11.value;
-    return value ? 'true' : 'false';
-  },
-  NullValue: function NullValue() {
-    return 'null';
-  },
-  EnumValue: function EnumValue(_ref12) {
-    var value = _ref12.value;
-    return value;
-  },
-  ListValue: function ListValue(_ref13) {
-    var values = _ref13.values;
-    return '[' + join(values, ', ') + ']';
-  },
-  ObjectValue: function ObjectValue(_ref14) {
-    var fields = _ref14.fields;
-    return '{' + join(fields, ', ') + '}';
-  },
-  ObjectField: function ObjectField(_ref15) {
-    var name = _ref15.name,
-        value = _ref15.value;
-    return name + ': ' + value;
-  },
-  // Directive
-  Directive: function Directive(_ref16) {
-    var name = _ref16.name,
-        args = _ref16.arguments;
-    return '@' + name + wrap('(', join(args, ', '), ')');
-  },
-  // Type
-  NamedType: function NamedType(_ref17) {
-    var name = _ref17.name;
-    return name;
-  },
-  ListType: function ListType(_ref18) {
-    var type = _ref18.type;
-    return '[' + type + ']';
-  },
-  NonNullType: function NonNullType(_ref19) {
-    var type = _ref19.type;
-    return type + '!';
-  },
-  // Type System Definitions
-  SchemaDefinition: addDescription(function (_ref20) {
-    var directives = _ref20.directives,
-        operationTypes = _ref20.operationTypes;
-    return join(['schema', join(directives, ' '), block(operationTypes)], ' ');
-  }),
-  OperationTypeDefinition: function OperationTypeDefinition(_ref21) {
-    var operation = _ref21.operation,
-        type = _ref21.type;
-    return operation + ': ' + type;
-  },
-  ScalarTypeDefinition: addDescription(function (_ref22) {
-    var name = _ref22.name,
-        directives = _ref22.directives;
-    return join(['scalar', name, join(directives, ' ')], ' ');
-  }),
-  ObjectTypeDefinition: addDescription(function (_ref23) {
-    var name = _ref23.name,
-        interfaces = _ref23.interfaces,
-        directives = _ref23.directives,
-        fields = _ref23.fields;
-    return join(['type', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ');
-  }),
-  FieldDefinition: addDescription(function (_ref24) {
-    var name = _ref24.name,
-        args = _ref24.arguments,
-        type = _ref24.type,
-        directives = _ref24.directives;
-    return name + (hasMultilineItems(args) ? wrap('(\n', indent(join(args, '\n')), '\n)') : wrap('(', join(args, ', '), ')')) + ': ' + type + wrap(' ', join(directives, ' '));
-  }),
-  InputValueDefinition: addDescription(function (_ref25) {
-    var name = _ref25.name,
-        type = _ref25.type,
-        defaultValue = _ref25.defaultValue,
-        directives = _ref25.directives;
-    return join([name + ': ' + type, wrap('= ', defaultValue), join(directives, ' ')], ' ');
-  }),
-  InterfaceTypeDefinition: addDescription(function (_ref26) {
-    var name = _ref26.name,
-        interfaces = _ref26.interfaces,
-        directives = _ref26.directives,
-        fields = _ref26.fields;
-    return join(['interface', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ');
-  }),
-  UnionTypeDefinition: addDescription(function (_ref27) {
-    var name = _ref27.name,
-        directives = _ref27.directives,
-        types = _ref27.types;
-    return join(['union', name, join(directives, ' '), types && types.length !== 0 ? '= ' + join(types, ' | ') : ''], ' ');
-  }),
-  EnumTypeDefinition: addDescription(function (_ref28) {
-    var name = _ref28.name,
-        directives = _ref28.directives,
-        values = _ref28.values;
-    return join(['enum', name, join(directives, ' '), block(values)], ' ');
-  }),
-  EnumValueDefinition: addDescription(function (_ref29) {
-    var name = _ref29.name,
-        directives = _ref29.directives;
-    return join([name, join(directives, ' ')], ' ');
-  }),
-  InputObjectTypeDefinition: addDescription(function (_ref30) {
-    var name = _ref30.name,
-        directives = _ref30.directives,
-        fields = _ref30.fields;
-    return join(['input', name, join(directives, ' '), block(fields)], ' ');
-  }),
-  DirectiveDefinition: addDescription(function (_ref31) {
-    var name = _ref31.name,
-        args = _ref31.arguments,
-        repeatable = _ref31.repeatable,
-        locations = _ref31.locations;
-    return 'directive @' + name + (hasMultilineItems(args) ? wrap('(\n', indent(join(args, '\n')), '\n)') : wrap('(', join(args, ', '), ')')) + (repeatable ? ' repeatable' : '') + ' on ' + join(locations, ' | ');
-  }),
-  SchemaExtension: function SchemaExtension(_ref32) {
-    var directives = _ref32.directives,
-        operationTypes = _ref32.operationTypes;
-    return join(['extend schema', join(directives, ' '), block(operationTypes)], ' ');
-  },
-  ScalarTypeExtension: function ScalarTypeExtension(_ref33) {
-    var name = _ref33.name,
-        directives = _ref33.directives;
-    return join(['extend scalar', name, join(directives, ' ')], ' ');
-  },
-  ObjectTypeExtension: function ObjectTypeExtension(_ref34) {
-    var name = _ref34.name,
-        interfaces = _ref34.interfaces,
-        directives = _ref34.directives,
-        fields = _ref34.fields;
-    return join(['extend type', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ');
-  },
-  InterfaceTypeExtension: function InterfaceTypeExtension(_ref35) {
-    var name = _ref35.name,
-        interfaces = _ref35.interfaces,
-        directives = _ref35.directives,
-        fields = _ref35.fields;
-    return join(['extend interface', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ');
-  },
-  UnionTypeExtension: function UnionTypeExtension(_ref36) {
-    var name = _ref36.name,
-        directives = _ref36.directives,
-        types = _ref36.types;
-    return join(['extend union', name, join(directives, ' '), types && types.length !== 0 ? '= ' + join(types, ' | ') : ''], ' ');
-  },
-  EnumTypeExtension: function EnumTypeExtension(_ref37) {
-    var name = _ref37.name,
-        directives = _ref37.directives,
-        values = _ref37.values;
-    return join(['extend enum', name, join(directives, ' '), block(values)], ' ');
-  },
-  InputObjectTypeExtension: function InputObjectTypeExtension(_ref38) {
-    var name = _ref38.name,
-        directives = _ref38.directives,
-        fields = _ref38.fields;
-    return join(['extend input', name, join(directives, ' '), block(fields)], ' ');
-  }
-};
-
-function addDescription(cb) {
-  return function (node) {
-    return join([node.description, cb(node)], '\n');
-  };
-}
-/**
- * Given maybeArray, print an empty string if it is null or empty, otherwise
- * print all items together separated by separator if provided
- */
-
-
-function join(maybeArray) {
-  var _ref39;
-
-  var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
-  return (_ref39 = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.filter(function (x) {
-    return x;
-  }).join(separator)) !== null && _ref39 !== void 0 ? _ref39 : '';
-}
-/**
- * Given array, print each item on its own line, wrapped in an
- * indented "{ }" block.
- */
-
-
-function block(array) {
-  return array && array.length !== 0 ? '{\n' + indent(join(array, '\n')) + '\n}' : '';
-}
-/**
- * If maybeString is not null or empty, then wrap with start and end, otherwise
- * print an empty string.
- */
-
-
-function wrap(start, maybeString) {
-  var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
-  return maybeString ? start + maybeString + end : '';
-}
-
-function indent(maybeString) {
-  return maybeString && '  ' + maybeString.replace(/\n/g, '\n  ');
-}
-
-function isMultiline(string) {
-  return string.indexOf('\n') !== -1;
-}
-
-function hasMultilineItems(maybeArray) {
-  return maybeArray && maybeArray.some(isMultiline);
-}
diff --git a/node_modules/graphql/language/source.d.ts b/node_modules/graphql/language/source.d.ts
deleted file mode 100644
index 4517784..0000000
--- a/node_modules/graphql/language/source.d.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-interface Location {
-  line: number;
-  column: number;
-}
-
-/**
- * A representation of source input to GraphQL.
- * `name` and `locationOffset` are optional. They are useful for clients who
- * store GraphQL documents in source files; for example, if the GraphQL input
- * starts at line 40 in a file named Foo.graphql, it might be useful for name to
- * be "Foo.graphql" and location to be `{ line: 40, column: 0 }`.
- * line and column in locationOffset are 1-indexed
- */
-export class Source {
-  body: string;
-  name: string;
-  locationOffset: Location;
-  constructor(body: string, name?: string, locationOffset?: Location);
-}
diff --git a/node_modules/graphql/language/source.js b/node_modules/graphql/language/source.js
deleted file mode 100644
index ce77a82..0000000
--- a/node_modules/graphql/language/source.js
+++ /dev/null
@@ -1,53 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.Source = void 0;
-
-var _symbols = require("../polyfills/symbols");
-
-var _devAssert = _interopRequireDefault(require("../jsutils/devAssert"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-/**
- * A representation of source input to GraphQL.
- * `name` and `locationOffset` are optional. They are useful for clients who
- * store GraphQL documents in source files; for example, if the GraphQL input
- * starts at line 40 in a file named Foo.graphql, it might be useful for name to
- * be "Foo.graphql" and location to be `{ line: 40, column: 0 }`.
- * line and column in locationOffset are 1-indexed
- */
-var Source =
-/*#__PURE__*/
-function () {
-  function Source(body) {
-    var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'GraphQL request';
-    var locationOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
-      line: 1,
-      column: 1
-    };
-    this.body = body;
-    this.name = name;
-    this.locationOffset = locationOffset;
-    this.locationOffset.line > 0 || (0, _devAssert.default)(0, 'line in locationOffset is 1-indexed and must be positive.');
-    this.locationOffset.column > 0 || (0, _devAssert.default)(0, 'column in locationOffset is 1-indexed and must be positive.');
-  } // $FlowFixMe Flow doesn't support computed properties yet
-
-
-  _createClass(Source, [{
-    key: _symbols.SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'Source';
-    }
-  }]);
-
-  return Source;
-}();
-
-exports.Source = Source;
diff --git a/node_modules/graphql/language/source.js.flow b/node_modules/graphql/language/source.js.flow
deleted file mode 100644
index 961205a..0000000
--- a/node_modules/graphql/language/source.js.flow
+++ /dev/null
@@ -1,47 +0,0 @@
-// @flow strict
-
-import { SYMBOL_TO_STRING_TAG } from '../polyfills/symbols';
-
-import devAssert from '../jsutils/devAssert';
-
-type Location = {|
-  line: number,
-  column: number,
-|};
-
-/**
- * A representation of source input to GraphQL.
- * `name` and `locationOffset` are optional. They are useful for clients who
- * store GraphQL documents in source files; for example, if the GraphQL input
- * starts at line 40 in a file named Foo.graphql, it might be useful for name to
- * be "Foo.graphql" and location to be `{ line: 40, column: 0 }`.
- * line and column in locationOffset are 1-indexed
- */
-export class Source {
-  body: string;
-  name: string;
-  locationOffset: Location;
-
-  constructor(
-    body: string,
-    name: string = 'GraphQL request',
-    locationOffset: Location = { line: 1, column: 1 },
-  ): void {
-    this.body = body;
-    this.name = name;
-    this.locationOffset = locationOffset;
-    devAssert(
-      this.locationOffset.line > 0,
-      'line in locationOffset is 1-indexed and must be positive.',
-    );
-    devAssert(
-      this.locationOffset.column > 0,
-      'column in locationOffset is 1-indexed and must be positive.',
-    );
-  }
-
-  // $FlowFixMe Flow doesn't support computed properties yet
-  get [SYMBOL_TO_STRING_TAG]() {
-    return 'Source';
-  }
-}
diff --git a/node_modules/graphql/language/source.mjs b/node_modules/graphql/language/source.mjs
deleted file mode 100644
index 35f3750..0000000
--- a/node_modules/graphql/language/source.mjs
+++ /dev/null
@@ -1,41 +0,0 @@
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-import { SYMBOL_TO_STRING_TAG } from "../polyfills/symbols.mjs";
-import devAssert from "../jsutils/devAssert.mjs";
-
-/**
- * A representation of source input to GraphQL.
- * `name` and `locationOffset` are optional. They are useful for clients who
- * store GraphQL documents in source files; for example, if the GraphQL input
- * starts at line 40 in a file named Foo.graphql, it might be useful for name to
- * be "Foo.graphql" and location to be `{ line: 40, column: 0 }`.
- * line and column in locationOffset are 1-indexed
- */
-export var Source =
-/*#__PURE__*/
-function () {
-  function Source(body) {
-    var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'GraphQL request';
-    var locationOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
-      line: 1,
-      column: 1
-    };
-    this.body = body;
-    this.name = name;
-    this.locationOffset = locationOffset;
-    this.locationOffset.line > 0 || devAssert(0, 'line in locationOffset is 1-indexed and must be positive.');
-    this.locationOffset.column > 0 || devAssert(0, 'column in locationOffset is 1-indexed and must be positive.');
-  } // $FlowFixMe Flow doesn't support computed properties yet
-
-
-  _createClass(Source, [{
-    key: SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'Source';
-    }
-  }]);
-
-  return Source;
-}();
diff --git a/node_modules/graphql/language/tokenKind.d.ts b/node_modules/graphql/language/tokenKind.d.ts
deleted file mode 100644
index 9919487..0000000
--- a/node_modules/graphql/language/tokenKind.d.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * An exported enum describing the different kinds of tokens that the
- * lexer emits.
- */
-export const TokenKind: _TokenKind;
-
-type _TokenKind = {
-  SOF: '<SOF>';
-  EOF: '<EOF>';
-  BANG: '!';
-  DOLLAR: '$';
-  AMP: '&';
-  PAREN_L: '(';
-  PAREN_R: ')';
-  SPREAD: '...';
-  COLON: ':';
-  EQUALS: '=';
-  AT: '@';
-  BRACKET_L: '[';
-  BRACKET_R: ']';
-  BRACE_L: '{';
-  PIPE: '|';
-  BRACE_R: '}';
-  NAME: 'Name';
-  INT: 'Int';
-  FLOAT: 'Float';
-  STRING: 'String';
-  BLOCK_STRING: 'BlockString';
-  COMMENT: 'Comment';
-};
-
-/**
- * The enum type representing the token kinds values.
- */
-export type TokenKindEnum = _TokenKind[keyof _TokenKind];
diff --git a/node_modules/graphql/language/tokenKind.js b/node_modules/graphql/language/tokenKind.js
deleted file mode 100644
index 3d5532d..0000000
--- a/node_modules/graphql/language/tokenKind.js
+++ /dev/null
@@ -1,40 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.TokenKind = void 0;
-
-/**
- * An exported enum describing the different kinds of tokens that the
- * lexer emits.
- */
-var TokenKind = Object.freeze({
-  SOF: '<SOF>',
-  EOF: '<EOF>',
-  BANG: '!',
-  DOLLAR: '$',
-  AMP: '&',
-  PAREN_L: '(',
-  PAREN_R: ')',
-  SPREAD: '...',
-  COLON: ':',
-  EQUALS: '=',
-  AT: '@',
-  BRACKET_L: '[',
-  BRACKET_R: ']',
-  BRACE_L: '{',
-  PIPE: '|',
-  BRACE_R: '}',
-  NAME: 'Name',
-  INT: 'Int',
-  FLOAT: 'Float',
-  STRING: 'String',
-  BLOCK_STRING: 'BlockString',
-  COMMENT: 'Comment'
-});
-/**
- * The enum type representing the token kinds values.
- */
-
-exports.TokenKind = TokenKind;
diff --git a/node_modules/graphql/language/tokenKind.js.flow b/node_modules/graphql/language/tokenKind.js.flow
deleted file mode 100644
index 0dd0afc..0000000
--- a/node_modules/graphql/language/tokenKind.js.flow
+++ /dev/null
@@ -1,35 +0,0 @@
-// @flow strict
-
-/**
- * An exported enum describing the different kinds of tokens that the
- * lexer emits.
- */
-export const TokenKind = Object.freeze({
-  SOF: '<SOF>',
-  EOF: '<EOF>',
-  BANG: '!',
-  DOLLAR: '$',
-  AMP: '&',
-  PAREN_L: '(',
-  PAREN_R: ')',
-  SPREAD: '...',
-  COLON: ':',
-  EQUALS: '=',
-  AT: '@',
-  BRACKET_L: '[',
-  BRACKET_R: ']',
-  BRACE_L: '{',
-  PIPE: '|',
-  BRACE_R: '}',
-  NAME: 'Name',
-  INT: 'Int',
-  FLOAT: 'Float',
-  STRING: 'String',
-  BLOCK_STRING: 'BlockString',
-  COMMENT: 'Comment',
-});
-
-/**
- * The enum type representing the token kinds values.
- */
-export type TokenKindEnum = $Values<typeof TokenKind>;
diff --git a/node_modules/graphql/language/tokenKind.mjs b/node_modules/graphql/language/tokenKind.mjs
deleted file mode 100644
index f100b99..0000000
--- a/node_modules/graphql/language/tokenKind.mjs
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * An exported enum describing the different kinds of tokens that the
- * lexer emits.
- */
-export var TokenKind = Object.freeze({
-  SOF: '<SOF>',
-  EOF: '<EOF>',
-  BANG: '!',
-  DOLLAR: '$',
-  AMP: '&',
-  PAREN_L: '(',
-  PAREN_R: ')',
-  SPREAD: '...',
-  COLON: ':',
-  EQUALS: '=',
-  AT: '@',
-  BRACKET_L: '[',
-  BRACKET_R: ']',
-  BRACE_L: '{',
-  PIPE: '|',
-  BRACE_R: '}',
-  NAME: 'Name',
-  INT: 'Int',
-  FLOAT: 'Float',
-  STRING: 'String',
-  BLOCK_STRING: 'BlockString',
-  COMMENT: 'Comment'
-});
-/**
- * The enum type representing the token kinds values.
- */
diff --git a/node_modules/graphql/language/visitor.d.ts b/node_modules/graphql/language/visitor.d.ts
deleted file mode 100644
index d5b4618..0000000
--- a/node_modules/graphql/language/visitor.d.ts
+++ /dev/null
@@ -1,262 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-
-import { ASTNode, ASTKindToNode } from './ast';
-
-/**
- * A visitor is provided to visit, it contains the collection of
- * relevant functions to be called during the visitor's traversal.
- */
-export type ASTVisitor = Visitor<ASTKindToNode>;
-export type Visitor<KindToNode, Nodes = KindToNode[keyof KindToNode]> =
-  | EnterLeaveVisitor<KindToNode, Nodes>
-  | ShapeMapVisitor<KindToNode, Nodes>;
-
-interface EnterLeave<T> {
-  readonly enter?: T;
-  readonly leave?: T;
-}
-
-type EnterLeaveVisitor<KindToNode, Nodes> = EnterLeave<
-  VisitFn<Nodes> | { [K in keyof KindToNode]?: VisitFn<Nodes, KindToNode[K]> }
->;
-
-type ShapeMapVisitor<KindToNode, Nodes> = {
-  [K in keyof KindToNode]?:
-    | VisitFn<Nodes, KindToNode[K]>
-    | EnterLeave<VisitFn<Nodes, KindToNode[K]>>;
-};
-
-/**
- * A visitor is comprised of visit functions, which are called on each node
- * during the visitor's traversal.
- */
-export type VisitFn<TAnyNode, TVisitedNode = TAnyNode> = (
-  /** The current node being visiting.*/
-  node: TVisitedNode,
-  /** The index or key to this node from the parent node or Array. */
-  key: string | number | undefined,
-  /** The parent immediately above this node, which may be an Array. */
-  parent: TAnyNode | ReadonlyArray<TAnyNode> | undefined,
-  /** The key path to get to this node from the root node. */
-  path: ReadonlyArray<string | number>,
-  /** All nodes and Arrays visited before reaching parent of this node.
-   * These correspond to array indices in `path`.
-   * Note: ancestors includes arrays which contain the parent of visited node.
-   */
-  ancestors: ReadonlyArray<TAnyNode | ReadonlyArray<TAnyNode>>,
-) => any;
-
-/**
- * A KeyMap describes each the traversable properties of each kind of node.
- */
-export type VisitorKeyMap<T> = { [P in keyof T]: ReadonlyArray<keyof T[P]> };
-
-// TODO: Should be `[]`, but that requires TypeScript@3
-type EmptyTuple = Array<never>;
-
-export const QueryDocumentKeys: {
-  Name: EmptyTuple;
-
-  Document: ['definitions'];
-  // Prettier forces trailing commas, but TS pre 3.2 doesn't allow them.
-  // prettier-ignore
-  OperationDefinition: [
-    'name',
-    'variableDefinitions',
-    'directives',
-    'selectionSet'
-  ];
-  VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'];
-  Variable: ['name'];
-  SelectionSet: ['selections'];
-  Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet'];
-  Argument: ['name', 'value'];
-
-  FragmentSpread: ['name', 'directives'];
-  InlineFragment: ['typeCondition', 'directives', 'selectionSet'];
-  // prettier-ignore
-  FragmentDefinition: [
-    'name',
-    // Note: fragment variable definitions are experimental and may be changed
-    // or removed in the future.
-    'variableDefinitions',
-    'typeCondition',
-    'directives',
-    'selectionSet'
-  ];
-
-  IntValue: EmptyTuple;
-  FloatValue: EmptyTuple;
-  StringValue: EmptyTuple;
-  BooleanValue: EmptyTuple;
-  NullValue: EmptyTuple;
-  EnumValue: EmptyTuple;
-  ListValue: ['values'];
-  ObjectValue: ['fields'];
-  ObjectField: ['name', 'value'];
-
-  Directive: ['name', 'arguments'];
-
-  NamedType: ['name'];
-  ListType: ['type'];
-  NonNullType: ['type'];
-
-  SchemaDefinition: ['description', 'directives', 'operationTypes'];
-  OperationTypeDefinition: ['type'];
-
-  ScalarTypeDefinition: ['description', 'name', 'directives'];
-  // prettier-ignore
-  ObjectTypeDefinition: [
-    'description',
-    'name',
-    'interfaces',
-    'directives',
-    'fields'
-  ];
-  FieldDefinition: ['description', 'name', 'arguments', 'type', 'directives'];
-  // prettier-ignore
-  InputValueDefinition: [
-    'description',
-    'name',
-    'type',
-    'defaultValue',
-    'directives'
-  ];
-  // prettier-ignore
-  InterfaceTypeDefinition: [
-    'description',
-    'name',
-    'interfaces',
-    'directives',
-    'fields'
-  ];
-  UnionTypeDefinition: ['description', 'name', 'directives', 'types'];
-  EnumTypeDefinition: ['description', 'name', 'directives', 'values'];
-  EnumValueDefinition: ['description', 'name', 'directives'];
-  InputObjectTypeDefinition: ['description', 'name', 'directives', 'fields'];
-
-  DirectiveDefinition: ['description', 'name', 'arguments', 'locations'];
-
-  SchemaExtension: ['directives', 'operationTypes'];
-
-  ScalarTypeExtension: ['name', 'directives'];
-  ObjectTypeExtension: ['name', 'interfaces', 'directives', 'fields'];
-  InterfaceTypeExtension: ['name', 'interfaces', 'directives', 'fields'];
-  UnionTypeExtension: ['name', 'directives', 'types'];
-  EnumTypeExtension: ['name', 'directives', 'values'];
-  InputObjectTypeExtension: ['name', 'directives', 'fields'];
-};
-
-export const BREAK: any;
-
-/**
- * visit() will walk through an AST using a depth first traversal, calling
- * the visitor's enter function at each node in the traversal, and calling the
- * leave function after visiting that node and all of its child nodes.
- *
- * By returning different values from the enter and leave functions, the
- * behavior of the visitor can be altered, including skipping over a sub-tree of
- * the AST (by returning false), editing the AST by returning a value or null
- * to remove the value, or to stop the whole traversal by returning BREAK.
- *
- * When using visit() to edit an AST, the original AST will not be modified, and
- * a new version of the AST with the changes applied will be returned from the
- * visit function.
- *
- *     const editedAST = visit(ast, {
- *       enter(node, key, parent, path, ancestors) {
- *         // @return
- *         //   undefined: no action
- *         //   false: skip visiting this node
- *         //   visitor.BREAK: stop visiting altogether
- *         //   null: delete this node
- *         //   any value: replace this node with the returned value
- *       },
- *       leave(node, key, parent, path, ancestors) {
- *         // @return
- *         //   undefined: no action
- *         //   false: no action
- *         //   visitor.BREAK: stop visiting altogether
- *         //   null: delete this node
- *         //   any value: replace this node with the returned value
- *       }
- *     });
- *
- * Alternatively to providing enter() and leave() functions, a visitor can
- * instead provide functions named the same as the kinds of AST nodes, or
- * enter/leave visitors at a named key, leading to four permutations of
- * visitor API:
- *
- * 1) Named visitors triggered when entering a node a specific kind.
- *
- *     visit(ast, {
- *       Kind(node) {
- *         // enter the "Kind" node
- *       }
- *     })
- *
- * 2) Named visitors that trigger upon entering and leaving a node of
- *    a specific kind.
- *
- *     visit(ast, {
- *       Kind: {
- *         enter(node) {
- *           // enter the "Kind" node
- *         }
- *         leave(node) {
- *           // leave the "Kind" node
- *         }
- *       }
- *     })
- *
- * 3) Generic visitors that trigger upon entering and leaving any node.
- *
- *     visit(ast, {
- *       enter(node) {
- *         // enter any node
- *       },
- *       leave(node) {
- *         // leave any node
- *       }
- *     })
- *
- * 4) Parallel visitors for entering and leaving nodes of a specific kind.
- *
- *     visit(ast, {
- *       enter: {
- *         Kind(node) {
- *           // enter the "Kind" node
- *         }
- *       },
- *       leave: {
- *         Kind(node) {
- *           // leave the "Kind" node
- *         }
- *       }
- *     })
- */
-export function visit(
-  root: ASTNode,
-  visitor: Visitor<ASTKindToNode>,
-  visitorKeys?: VisitorKeyMap<ASTKindToNode>, // default: QueryDocumentKeys
-): any;
-
-/**
- * Creates a new visitor instance which delegates to many visitors to run in
- * parallel. Each visitor will be visited for each node before moving on.
- *
- * If a prior visitor edits a node, no following visitors will see that node.
- */
-export function visitInParallel(
-  visitors: ReadonlyArray<Visitor<ASTKindToNode>>,
-): Visitor<ASTKindToNode>;
-
-/**
- * Given a visitor instance, if it is leaving or not, and a node kind, return
- * the function the visitor runtime should call.
- */
-export function getVisitFn(
-  visitor: Visitor<any>,
-  kind: string,
-  isLeaving: boolean,
-): Maybe<VisitFn<any>>;
diff --git a/node_modules/graphql/language/visitor.js b/node_modules/graphql/language/visitor.js
deleted file mode 100644
index 4f2ea71..0000000
--- a/node_modules/graphql/language/visitor.js
+++ /dev/null
@@ -1,397 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.visit = visit;
-exports.visitInParallel = visitInParallel;
-exports.getVisitFn = getVisitFn;
-exports.BREAK = exports.QueryDocumentKeys = void 0;
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _ast = require("./ast");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var QueryDocumentKeys = {
-  Name: [],
-  Document: ['definitions'],
-  OperationDefinition: ['name', 'variableDefinitions', 'directives', 'selectionSet'],
-  VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'],
-  Variable: ['name'],
-  SelectionSet: ['selections'],
-  Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet'],
-  Argument: ['name', 'value'],
-  FragmentSpread: ['name', 'directives'],
-  InlineFragment: ['typeCondition', 'directives', 'selectionSet'],
-  FragmentDefinition: ['name', // Note: fragment variable definitions are experimental and may be changed
-  // or removed in the future.
-  'variableDefinitions', 'typeCondition', 'directives', 'selectionSet'],
-  IntValue: [],
-  FloatValue: [],
-  StringValue: [],
-  BooleanValue: [],
-  NullValue: [],
-  EnumValue: [],
-  ListValue: ['values'],
-  ObjectValue: ['fields'],
-  ObjectField: ['name', 'value'],
-  Directive: ['name', 'arguments'],
-  NamedType: ['name'],
-  ListType: ['type'],
-  NonNullType: ['type'],
-  SchemaDefinition: ['description', 'directives', 'operationTypes'],
-  OperationTypeDefinition: ['type'],
-  ScalarTypeDefinition: ['description', 'name', 'directives'],
-  ObjectTypeDefinition: ['description', 'name', 'interfaces', 'directives', 'fields'],
-  FieldDefinition: ['description', 'name', 'arguments', 'type', 'directives'],
-  InputValueDefinition: ['description', 'name', 'type', 'defaultValue', 'directives'],
-  InterfaceTypeDefinition: ['description', 'name', 'interfaces', 'directives', 'fields'],
-  UnionTypeDefinition: ['description', 'name', 'directives', 'types'],
-  EnumTypeDefinition: ['description', 'name', 'directives', 'values'],
-  EnumValueDefinition: ['description', 'name', 'directives'],
-  InputObjectTypeDefinition: ['description', 'name', 'directives', 'fields'],
-  DirectiveDefinition: ['description', 'name', 'arguments', 'locations'],
-  SchemaExtension: ['directives', 'operationTypes'],
-  ScalarTypeExtension: ['name', 'directives'],
-  ObjectTypeExtension: ['name', 'interfaces', 'directives', 'fields'],
-  InterfaceTypeExtension: ['name', 'interfaces', 'directives', 'fields'],
-  UnionTypeExtension: ['name', 'directives', 'types'],
-  EnumTypeExtension: ['name', 'directives', 'values'],
-  InputObjectTypeExtension: ['name', 'directives', 'fields']
-};
-exports.QueryDocumentKeys = QueryDocumentKeys;
-var BREAK = Object.freeze({});
-/**
- * visit() will walk through an AST using a depth first traversal, calling
- * the visitor's enter function at each node in the traversal, and calling the
- * leave function after visiting that node and all of its child nodes.
- *
- * By returning different values from the enter and leave functions, the
- * behavior of the visitor can be altered, including skipping over a sub-tree of
- * the AST (by returning false), editing the AST by returning a value or null
- * to remove the value, or to stop the whole traversal by returning BREAK.
- *
- * When using visit() to edit an AST, the original AST will not be modified, and
- * a new version of the AST with the changes applied will be returned from the
- * visit function.
- *
- *     const editedAST = visit(ast, {
- *       enter(node, key, parent, path, ancestors) {
- *         // @return
- *         //   undefined: no action
- *         //   false: skip visiting this node
- *         //   visitor.BREAK: stop visiting altogether
- *         //   null: delete this node
- *         //   any value: replace this node with the returned value
- *       },
- *       leave(node, key, parent, path, ancestors) {
- *         // @return
- *         //   undefined: no action
- *         //   false: no action
- *         //   visitor.BREAK: stop visiting altogether
- *         //   null: delete this node
- *         //   any value: replace this node with the returned value
- *       }
- *     });
- *
- * Alternatively to providing enter() and leave() functions, a visitor can
- * instead provide functions named the same as the kinds of AST nodes, or
- * enter/leave visitors at a named key, leading to four permutations of
- * visitor API:
- *
- * 1) Named visitors triggered when entering a node a specific kind.
- *
- *     visit(ast, {
- *       Kind(node) {
- *         // enter the "Kind" node
- *       }
- *     })
- *
- * 2) Named visitors that trigger upon entering and leaving a node of
- *    a specific kind.
- *
- *     visit(ast, {
- *       Kind: {
- *         enter(node) {
- *           // enter the "Kind" node
- *         }
- *         leave(node) {
- *           // leave the "Kind" node
- *         }
- *       }
- *     })
- *
- * 3) Generic visitors that trigger upon entering and leaving any node.
- *
- *     visit(ast, {
- *       enter(node) {
- *         // enter any node
- *       },
- *       leave(node) {
- *         // leave any node
- *       }
- *     })
- *
- * 4) Parallel visitors for entering and leaving nodes of a specific kind.
- *
- *     visit(ast, {
- *       enter: {
- *         Kind(node) {
- *           // enter the "Kind" node
- *         }
- *       },
- *       leave: {
- *         Kind(node) {
- *           // leave the "Kind" node
- *         }
- *       }
- *     })
- */
-
-exports.BREAK = BREAK;
-
-function visit(root, visitor) {
-  var visitorKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : QueryDocumentKeys;
-
-  /* eslint-disable no-undef-init */
-  var stack = undefined;
-  var inArray = Array.isArray(root);
-  var keys = [root];
-  var index = -1;
-  var edits = [];
-  var node = undefined;
-  var key = undefined;
-  var parent = undefined;
-  var path = [];
-  var ancestors = [];
-  var newRoot = root;
-  /* eslint-enable no-undef-init */
-
-  do {
-    index++;
-    var isLeaving = index === keys.length;
-    var isEdited = isLeaving && edits.length !== 0;
-
-    if (isLeaving) {
-      key = ancestors.length === 0 ? undefined : path[path.length - 1];
-      node = parent;
-      parent = ancestors.pop();
-
-      if (isEdited) {
-        if (inArray) {
-          node = node.slice();
-        } else {
-          var clone = {};
-
-          for (var _i2 = 0, _Object$keys2 = Object.keys(node); _i2 < _Object$keys2.length; _i2++) {
-            var k = _Object$keys2[_i2];
-            clone[k] = node[k];
-          }
-
-          node = clone;
-        }
-
-        var editOffset = 0;
-
-        for (var ii = 0; ii < edits.length; ii++) {
-          var editKey = edits[ii][0];
-          var editValue = edits[ii][1];
-
-          if (inArray) {
-            editKey -= editOffset;
-          }
-
-          if (inArray && editValue === null) {
-            node.splice(editKey, 1);
-            editOffset++;
-          } else {
-            node[editKey] = editValue;
-          }
-        }
-      }
-
-      index = stack.index;
-      keys = stack.keys;
-      edits = stack.edits;
-      inArray = stack.inArray;
-      stack = stack.prev;
-    } else {
-      key = parent ? inArray ? index : keys[index] : undefined;
-      node = parent ? parent[key] : newRoot;
-
-      if (node === null || node === undefined) {
-        continue;
-      }
-
-      if (parent) {
-        path.push(key);
-      }
-    }
-
-    var result = void 0;
-
-    if (!Array.isArray(node)) {
-      if (!(0, _ast.isNode)(node)) {
-        throw new Error("Invalid AST Node: ".concat((0, _inspect.default)(node), "."));
-      }
-
-      var visitFn = getVisitFn(visitor, node.kind, isLeaving);
-
-      if (visitFn) {
-        result = visitFn.call(visitor, node, key, parent, path, ancestors);
-
-        if (result === BREAK) {
-          break;
-        }
-
-        if (result === false) {
-          if (!isLeaving) {
-            path.pop();
-            continue;
-          }
-        } else if (result !== undefined) {
-          edits.push([key, result]);
-
-          if (!isLeaving) {
-            if ((0, _ast.isNode)(result)) {
-              node = result;
-            } else {
-              path.pop();
-              continue;
-            }
-          }
-        }
-      }
-    }
-
-    if (result === undefined && isEdited) {
-      edits.push([key, node]);
-    }
-
-    if (isLeaving) {
-      path.pop();
-    } else {
-      var _visitorKeys$node$kin;
-
-      stack = {
-        inArray: inArray,
-        index: index,
-        keys: keys,
-        edits: edits,
-        prev: stack
-      };
-      inArray = Array.isArray(node);
-      keys = inArray ? node : (_visitorKeys$node$kin = visitorKeys[node.kind]) !== null && _visitorKeys$node$kin !== void 0 ? _visitorKeys$node$kin : [];
-      index = -1;
-      edits = [];
-
-      if (parent) {
-        ancestors.push(parent);
-      }
-
-      parent = node;
-    }
-  } while (stack !== undefined);
-
-  if (edits.length !== 0) {
-    newRoot = edits[edits.length - 1][1];
-  }
-
-  return newRoot;
-}
-/**
- * Creates a new visitor instance which delegates to many visitors to run in
- * parallel. Each visitor will be visited for each node before moving on.
- *
- * If a prior visitor edits a node, no following visitors will see that node.
- */
-
-
-function visitInParallel(visitors) {
-  var skipping = new Array(visitors.length);
-  return {
-    enter: function enter(node) {
-      for (var i = 0; i < visitors.length; i++) {
-        if (skipping[i] == null) {
-          var fn = getVisitFn(visitors[i], node.kind,
-          /* isLeaving */
-          false);
-
-          if (fn) {
-            var result = fn.apply(visitors[i], arguments);
-
-            if (result === false) {
-              skipping[i] = node;
-            } else if (result === BREAK) {
-              skipping[i] = BREAK;
-            } else if (result !== undefined) {
-              return result;
-            }
-          }
-        }
-      }
-    },
-    leave: function leave(node) {
-      for (var i = 0; i < visitors.length; i++) {
-        if (skipping[i] == null) {
-          var fn = getVisitFn(visitors[i], node.kind,
-          /* isLeaving */
-          true);
-
-          if (fn) {
-            var result = fn.apply(visitors[i], arguments);
-
-            if (result === BREAK) {
-              skipping[i] = BREAK;
-            } else if (result !== undefined && result !== false) {
-              return result;
-            }
-          }
-        } else if (skipping[i] === node) {
-          skipping[i] = null;
-        }
-      }
-    }
-  };
-}
-/**
- * Given a visitor instance, if it is leaving or not, and a node kind, return
- * the function the visitor runtime should call.
- */
-
-
-function getVisitFn(visitor, kind, isLeaving) {
-  var kindVisitor = visitor[kind];
-
-  if (kindVisitor) {
-    if (!isLeaving && typeof kindVisitor === 'function') {
-      // { Kind() {} }
-      return kindVisitor;
-    }
-
-    var kindSpecificVisitor = isLeaving ? kindVisitor.leave : kindVisitor.enter;
-
-    if (typeof kindSpecificVisitor === 'function') {
-      // { Kind: { enter() {}, leave() {} } }
-      return kindSpecificVisitor;
-    }
-  } else {
-    var specificVisitor = isLeaving ? visitor.leave : visitor.enter;
-
-    if (specificVisitor) {
-      if (typeof specificVisitor === 'function') {
-        // { enter() {}, leave() {} }
-        return specificVisitor;
-      }
-
-      var specificKindVisitor = specificVisitor[kind];
-
-      if (typeof specificKindVisitor === 'function') {
-        // { enter: { Kind() {} }, leave: { Kind() {} } }
-        return specificKindVisitor;
-      }
-    }
-  }
-}
diff --git a/node_modules/graphql/language/visitor.js.flow b/node_modules/graphql/language/visitor.js.flow
deleted file mode 100644
index e310ecd..0000000
--- a/node_modules/graphql/language/visitor.js.flow
+++ /dev/null
@@ -1,437 +0,0 @@
-// @flow strict
-
-import inspect from '../jsutils/inspect';
-
-import { type ASTNode, type ASTKindToNode, isNode } from './ast';
-
-/**
- * A visitor is provided to visit, it contains the collection of
- * relevant functions to be called during the visitor's traversal.
- */
-export type ASTVisitor = Visitor<ASTKindToNode>;
-export type Visitor<KindToNode, Nodes = $Values<KindToNode>> =
-  | EnterLeave<
-      | VisitFn<Nodes>
-      | ShapeMap<KindToNode, <Node>(Node) => VisitFn<Nodes, Node>>,
-    >
-  | ShapeMap<
-      KindToNode,
-      <Node>(Node) => VisitFn<Nodes, Node> | EnterLeave<VisitFn<Nodes, Node>>,
-    >;
-type EnterLeave<T> = {| +enter?: T, +leave?: T |};
-type ShapeMap<O, F> = $Shape<$ObjMap<O, F>>;
-
-/**
- * A visitor is comprised of visit functions, which are called on each node
- * during the visitor's traversal.
- */
-export type VisitFn<TAnyNode, TVisitedNode: TAnyNode = TAnyNode> = (
-  // The current node being visiting.
-  node: TVisitedNode,
-  // The index or key to this node from the parent node or Array.
-  key: string | number | void,
-  // The parent immediately above this node, which may be an Array.
-  parent: TAnyNode | $ReadOnlyArray<TAnyNode> | void,
-  // The key path to get to this node from the root node.
-  path: $ReadOnlyArray<string | number>,
-  // All nodes and Arrays visited before reaching parent of this node.
-  // These correspond to array indices in `path`.
-  // Note: ancestors includes arrays which contain the parent of visited node.
-  ancestors: $ReadOnlyArray<TAnyNode | $ReadOnlyArray<TAnyNode>>,
-) => any;
-
-/**
- * A KeyMap describes each the traversable properties of each kind of node.
- */
-export type VisitorKeyMap<KindToNode> = $ObjMap<
-  KindToNode,
-  <T>(T) => $ReadOnlyArray<$Keys<T>>,
->;
-
-export const QueryDocumentKeys: VisitorKeyMap<ASTKindToNode> = {
-  Name: [],
-
-  Document: ['definitions'],
-  OperationDefinition: [
-    'name',
-    'variableDefinitions',
-    'directives',
-    'selectionSet',
-  ],
-  VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'],
-  Variable: ['name'],
-  SelectionSet: ['selections'],
-  Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet'],
-  Argument: ['name', 'value'],
-
-  FragmentSpread: ['name', 'directives'],
-  InlineFragment: ['typeCondition', 'directives', 'selectionSet'],
-  FragmentDefinition: [
-    'name',
-    // Note: fragment variable definitions are experimental and may be changed
-    // or removed in the future.
-    'variableDefinitions',
-    'typeCondition',
-    'directives',
-    'selectionSet',
-  ],
-
-  IntValue: [],
-  FloatValue: [],
-  StringValue: [],
-  BooleanValue: [],
-  NullValue: [],
-  EnumValue: [],
-  ListValue: ['values'],
-  ObjectValue: ['fields'],
-  ObjectField: ['name', 'value'],
-
-  Directive: ['name', 'arguments'],
-
-  NamedType: ['name'],
-  ListType: ['type'],
-  NonNullType: ['type'],
-
-  SchemaDefinition: ['description', 'directives', 'operationTypes'],
-  OperationTypeDefinition: ['type'],
-
-  ScalarTypeDefinition: ['description', 'name', 'directives'],
-  ObjectTypeDefinition: [
-    'description',
-    'name',
-    'interfaces',
-    'directives',
-    'fields',
-  ],
-  FieldDefinition: ['description', 'name', 'arguments', 'type', 'directives'],
-  InputValueDefinition: [
-    'description',
-    'name',
-    'type',
-    'defaultValue',
-    'directives',
-  ],
-  InterfaceTypeDefinition: [
-    'description',
-    'name',
-    'interfaces',
-    'directives',
-    'fields',
-  ],
-  UnionTypeDefinition: ['description', 'name', 'directives', 'types'],
-  EnumTypeDefinition: ['description', 'name', 'directives', 'values'],
-  EnumValueDefinition: ['description', 'name', 'directives'],
-  InputObjectTypeDefinition: ['description', 'name', 'directives', 'fields'],
-
-  DirectiveDefinition: ['description', 'name', 'arguments', 'locations'],
-
-  SchemaExtension: ['directives', 'operationTypes'],
-
-  ScalarTypeExtension: ['name', 'directives'],
-  ObjectTypeExtension: ['name', 'interfaces', 'directives', 'fields'],
-  InterfaceTypeExtension: ['name', 'interfaces', 'directives', 'fields'],
-  UnionTypeExtension: ['name', 'directives', 'types'],
-  EnumTypeExtension: ['name', 'directives', 'values'],
-  InputObjectTypeExtension: ['name', 'directives', 'fields'],
-};
-
-export const BREAK: { ... } = Object.freeze({});
-
-/**
- * visit() will walk through an AST using a depth first traversal, calling
- * the visitor's enter function at each node in the traversal, and calling the
- * leave function after visiting that node and all of its child nodes.
- *
- * By returning different values from the enter and leave functions, the
- * behavior of the visitor can be altered, including skipping over a sub-tree of
- * the AST (by returning false), editing the AST by returning a value or null
- * to remove the value, or to stop the whole traversal by returning BREAK.
- *
- * When using visit() to edit an AST, the original AST will not be modified, and
- * a new version of the AST with the changes applied will be returned from the
- * visit function.
- *
- *     const editedAST = visit(ast, {
- *       enter(node, key, parent, path, ancestors) {
- *         // @return
- *         //   undefined: no action
- *         //   false: skip visiting this node
- *         //   visitor.BREAK: stop visiting altogether
- *         //   null: delete this node
- *         //   any value: replace this node with the returned value
- *       },
- *       leave(node, key, parent, path, ancestors) {
- *         // @return
- *         //   undefined: no action
- *         //   false: no action
- *         //   visitor.BREAK: stop visiting altogether
- *         //   null: delete this node
- *         //   any value: replace this node with the returned value
- *       }
- *     });
- *
- * Alternatively to providing enter() and leave() functions, a visitor can
- * instead provide functions named the same as the kinds of AST nodes, or
- * enter/leave visitors at a named key, leading to four permutations of
- * visitor API:
- *
- * 1) Named visitors triggered when entering a node a specific kind.
- *
- *     visit(ast, {
- *       Kind(node) {
- *         // enter the "Kind" node
- *       }
- *     })
- *
- * 2) Named visitors that trigger upon entering and leaving a node of
- *    a specific kind.
- *
- *     visit(ast, {
- *       Kind: {
- *         enter(node) {
- *           // enter the "Kind" node
- *         }
- *         leave(node) {
- *           // leave the "Kind" node
- *         }
- *       }
- *     })
- *
- * 3) Generic visitors that trigger upon entering and leaving any node.
- *
- *     visit(ast, {
- *       enter(node) {
- *         // enter any node
- *       },
- *       leave(node) {
- *         // leave any node
- *       }
- *     })
- *
- * 4) Parallel visitors for entering and leaving nodes of a specific kind.
- *
- *     visit(ast, {
- *       enter: {
- *         Kind(node) {
- *           // enter the "Kind" node
- *         }
- *       },
- *       leave: {
- *         Kind(node) {
- *           // leave the "Kind" node
- *         }
- *       }
- *     })
- */
-export function visit(
-  root: ASTNode,
-  visitor: Visitor<ASTKindToNode>,
-  visitorKeys: VisitorKeyMap<ASTKindToNode> = QueryDocumentKeys,
-): any {
-  /* eslint-disable no-undef-init */
-  let stack: any = undefined;
-  let inArray = Array.isArray(root);
-  let keys: any = [root];
-  let index = -1;
-  let edits = [];
-  let node: any = undefined;
-  let key: any = undefined;
-  let parent: any = undefined;
-  const path: any = [];
-  const ancestors = [];
-  let newRoot = root;
-  /* eslint-enable no-undef-init */
-
-  do {
-    index++;
-    const isLeaving = index === keys.length;
-    const isEdited = isLeaving && edits.length !== 0;
-    if (isLeaving) {
-      key = ancestors.length === 0 ? undefined : path[path.length - 1];
-      node = parent;
-      parent = ancestors.pop();
-      if (isEdited) {
-        if (inArray) {
-          node = node.slice();
-        } else {
-          const clone = {};
-          for (const k of Object.keys(node)) {
-            clone[k] = node[k];
-          }
-          node = clone;
-        }
-        let editOffset = 0;
-        for (let ii = 0; ii < edits.length; ii++) {
-          let editKey: any = edits[ii][0];
-          const editValue = edits[ii][1];
-          if (inArray) {
-            editKey -= editOffset;
-          }
-          if (inArray && editValue === null) {
-            node.splice(editKey, 1);
-            editOffset++;
-          } else {
-            node[editKey] = editValue;
-          }
-        }
-      }
-      index = stack.index;
-      keys = stack.keys;
-      edits = stack.edits;
-      inArray = stack.inArray;
-      stack = stack.prev;
-    } else {
-      key = parent ? (inArray ? index : keys[index]) : undefined;
-      node = parent ? parent[key] : newRoot;
-      if (node === null || node === undefined) {
-        continue;
-      }
-      if (parent) {
-        path.push(key);
-      }
-    }
-
-    let result;
-    if (!Array.isArray(node)) {
-      if (!isNode(node)) {
-        throw new Error(`Invalid AST Node: ${inspect(node)}.`);
-      }
-      const visitFn = getVisitFn(visitor, node.kind, isLeaving);
-      if (visitFn) {
-        result = visitFn.call(visitor, node, key, parent, path, ancestors);
-
-        if (result === BREAK) {
-          break;
-        }
-
-        if (result === false) {
-          if (!isLeaving) {
-            path.pop();
-            continue;
-          }
-        } else if (result !== undefined) {
-          edits.push([key, result]);
-          if (!isLeaving) {
-            if (isNode(result)) {
-              node = result;
-            } else {
-              path.pop();
-              continue;
-            }
-          }
-        }
-      }
-    }
-
-    if (result === undefined && isEdited) {
-      edits.push([key, node]);
-    }
-
-    if (isLeaving) {
-      path.pop();
-    } else {
-      stack = { inArray, index, keys, edits, prev: stack };
-      inArray = Array.isArray(node);
-      keys = inArray ? node : visitorKeys[node.kind] ?? [];
-      index = -1;
-      edits = [];
-      if (parent) {
-        ancestors.push(parent);
-      }
-      parent = node;
-    }
-  } while (stack !== undefined);
-
-  if (edits.length !== 0) {
-    newRoot = edits[edits.length - 1][1];
-  }
-
-  return newRoot;
-}
-
-/**
- * Creates a new visitor instance which delegates to many visitors to run in
- * parallel. Each visitor will be visited for each node before moving on.
- *
- * If a prior visitor edits a node, no following visitors will see that node.
- */
-export function visitInParallel(
-  visitors: $ReadOnlyArray<Visitor<ASTKindToNode>>,
-): Visitor<ASTKindToNode> {
-  const skipping = new Array(visitors.length);
-
-  return {
-    enter(node) {
-      for (let i = 0; i < visitors.length; i++) {
-        if (skipping[i] == null) {
-          const fn = getVisitFn(visitors[i], node.kind, /* isLeaving */ false);
-          if (fn) {
-            const result = fn.apply(visitors[i], arguments);
-            if (result === false) {
-              skipping[i] = node;
-            } else if (result === BREAK) {
-              skipping[i] = BREAK;
-            } else if (result !== undefined) {
-              return result;
-            }
-          }
-        }
-      }
-    },
-    leave(node) {
-      for (let i = 0; i < visitors.length; i++) {
-        if (skipping[i] == null) {
-          const fn = getVisitFn(visitors[i], node.kind, /* isLeaving */ true);
-          if (fn) {
-            const result = fn.apply(visitors[i], arguments);
-            if (result === BREAK) {
-              skipping[i] = BREAK;
-            } else if (result !== undefined && result !== false) {
-              return result;
-            }
-          }
-        } else if (skipping[i] === node) {
-          skipping[i] = null;
-        }
-      }
-    },
-  };
-}
-
-/**
- * Given a visitor instance, if it is leaving or not, and a node kind, return
- * the function the visitor runtime should call.
- */
-export function getVisitFn(
-  visitor: Visitor<any>,
-  kind: string,
-  isLeaving: boolean,
-): ?VisitFn<any> {
-  const kindVisitor = visitor[kind];
-  if (kindVisitor) {
-    if (!isLeaving && typeof kindVisitor === 'function') {
-      // { Kind() {} }
-      return kindVisitor;
-    }
-    const kindSpecificVisitor = isLeaving
-      ? kindVisitor.leave
-      : kindVisitor.enter;
-    if (typeof kindSpecificVisitor === 'function') {
-      // { Kind: { enter() {}, leave() {} } }
-      return kindSpecificVisitor;
-    }
-  } else {
-    const specificVisitor = isLeaving ? visitor.leave : visitor.enter;
-    if (specificVisitor) {
-      if (typeof specificVisitor === 'function') {
-        // { enter() {}, leave() {} }
-        return specificVisitor;
-      }
-      const specificKindVisitor = specificVisitor[kind];
-      if (typeof specificKindVisitor === 'function') {
-        // { enter: { Kind() {} }, leave: { Kind() {} } }
-        return specificKindVisitor;
-      }
-    }
-  }
-}
diff --git a/node_modules/graphql/language/visitor.mjs b/node_modules/graphql/language/visitor.mjs
deleted file mode 100644
index f58d5c2..0000000
--- a/node_modules/graphql/language/visitor.mjs
+++ /dev/null
@@ -1,383 +0,0 @@
-import inspect from "../jsutils/inspect.mjs";
-import { isNode } from "./ast.mjs";
-/**
- * A visitor is provided to visit, it contains the collection of
- * relevant functions to be called during the visitor's traversal.
- */
-
-export var QueryDocumentKeys = {
-  Name: [],
-  Document: ['definitions'],
-  OperationDefinition: ['name', 'variableDefinitions', 'directives', 'selectionSet'],
-  VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'],
-  Variable: ['name'],
-  SelectionSet: ['selections'],
-  Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet'],
-  Argument: ['name', 'value'],
-  FragmentSpread: ['name', 'directives'],
-  InlineFragment: ['typeCondition', 'directives', 'selectionSet'],
-  FragmentDefinition: ['name', // Note: fragment variable definitions are experimental and may be changed
-  // or removed in the future.
-  'variableDefinitions', 'typeCondition', 'directives', 'selectionSet'],
-  IntValue: [],
-  FloatValue: [],
-  StringValue: [],
-  BooleanValue: [],
-  NullValue: [],
-  EnumValue: [],
-  ListValue: ['values'],
-  ObjectValue: ['fields'],
-  ObjectField: ['name', 'value'],
-  Directive: ['name', 'arguments'],
-  NamedType: ['name'],
-  ListType: ['type'],
-  NonNullType: ['type'],
-  SchemaDefinition: ['description', 'directives', 'operationTypes'],
-  OperationTypeDefinition: ['type'],
-  ScalarTypeDefinition: ['description', 'name', 'directives'],
-  ObjectTypeDefinition: ['description', 'name', 'interfaces', 'directives', 'fields'],
-  FieldDefinition: ['description', 'name', 'arguments', 'type', 'directives'],
-  InputValueDefinition: ['description', 'name', 'type', 'defaultValue', 'directives'],
-  InterfaceTypeDefinition: ['description', 'name', 'interfaces', 'directives', 'fields'],
-  UnionTypeDefinition: ['description', 'name', 'directives', 'types'],
-  EnumTypeDefinition: ['description', 'name', 'directives', 'values'],
-  EnumValueDefinition: ['description', 'name', 'directives'],
-  InputObjectTypeDefinition: ['description', 'name', 'directives', 'fields'],
-  DirectiveDefinition: ['description', 'name', 'arguments', 'locations'],
-  SchemaExtension: ['directives', 'operationTypes'],
-  ScalarTypeExtension: ['name', 'directives'],
-  ObjectTypeExtension: ['name', 'interfaces', 'directives', 'fields'],
-  InterfaceTypeExtension: ['name', 'interfaces', 'directives', 'fields'],
-  UnionTypeExtension: ['name', 'directives', 'types'],
-  EnumTypeExtension: ['name', 'directives', 'values'],
-  InputObjectTypeExtension: ['name', 'directives', 'fields']
-};
-export var BREAK = Object.freeze({});
-/**
- * visit() will walk through an AST using a depth first traversal, calling
- * the visitor's enter function at each node in the traversal, and calling the
- * leave function after visiting that node and all of its child nodes.
- *
- * By returning different values from the enter and leave functions, the
- * behavior of the visitor can be altered, including skipping over a sub-tree of
- * the AST (by returning false), editing the AST by returning a value or null
- * to remove the value, or to stop the whole traversal by returning BREAK.
- *
- * When using visit() to edit an AST, the original AST will not be modified, and
- * a new version of the AST with the changes applied will be returned from the
- * visit function.
- *
- *     const editedAST = visit(ast, {
- *       enter(node, key, parent, path, ancestors) {
- *         // @return
- *         //   undefined: no action
- *         //   false: skip visiting this node
- *         //   visitor.BREAK: stop visiting altogether
- *         //   null: delete this node
- *         //   any value: replace this node with the returned value
- *       },
- *       leave(node, key, parent, path, ancestors) {
- *         // @return
- *         //   undefined: no action
- *         //   false: no action
- *         //   visitor.BREAK: stop visiting altogether
- *         //   null: delete this node
- *         //   any value: replace this node with the returned value
- *       }
- *     });
- *
- * Alternatively to providing enter() and leave() functions, a visitor can
- * instead provide functions named the same as the kinds of AST nodes, or
- * enter/leave visitors at a named key, leading to four permutations of
- * visitor API:
- *
- * 1) Named visitors triggered when entering a node a specific kind.
- *
- *     visit(ast, {
- *       Kind(node) {
- *         // enter the "Kind" node
- *       }
- *     })
- *
- * 2) Named visitors that trigger upon entering and leaving a node of
- *    a specific kind.
- *
- *     visit(ast, {
- *       Kind: {
- *         enter(node) {
- *           // enter the "Kind" node
- *         }
- *         leave(node) {
- *           // leave the "Kind" node
- *         }
- *       }
- *     })
- *
- * 3) Generic visitors that trigger upon entering and leaving any node.
- *
- *     visit(ast, {
- *       enter(node) {
- *         // enter any node
- *       },
- *       leave(node) {
- *         // leave any node
- *       }
- *     })
- *
- * 4) Parallel visitors for entering and leaving nodes of a specific kind.
- *
- *     visit(ast, {
- *       enter: {
- *         Kind(node) {
- *           // enter the "Kind" node
- *         }
- *       },
- *       leave: {
- *         Kind(node) {
- *           // leave the "Kind" node
- *         }
- *       }
- *     })
- */
-
-export function visit(root, visitor) {
-  var visitorKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : QueryDocumentKeys;
-
-  /* eslint-disable no-undef-init */
-  var stack = undefined;
-  var inArray = Array.isArray(root);
-  var keys = [root];
-  var index = -1;
-  var edits = [];
-  var node = undefined;
-  var key = undefined;
-  var parent = undefined;
-  var path = [];
-  var ancestors = [];
-  var newRoot = root;
-  /* eslint-enable no-undef-init */
-
-  do {
-    index++;
-    var isLeaving = index === keys.length;
-    var isEdited = isLeaving && edits.length !== 0;
-
-    if (isLeaving) {
-      key = ancestors.length === 0 ? undefined : path[path.length - 1];
-      node = parent;
-      parent = ancestors.pop();
-
-      if (isEdited) {
-        if (inArray) {
-          node = node.slice();
-        } else {
-          var clone = {};
-
-          for (var _i2 = 0, _Object$keys2 = Object.keys(node); _i2 < _Object$keys2.length; _i2++) {
-            var k = _Object$keys2[_i2];
-            clone[k] = node[k];
-          }
-
-          node = clone;
-        }
-
-        var editOffset = 0;
-
-        for (var ii = 0; ii < edits.length; ii++) {
-          var editKey = edits[ii][0];
-          var editValue = edits[ii][1];
-
-          if (inArray) {
-            editKey -= editOffset;
-          }
-
-          if (inArray && editValue === null) {
-            node.splice(editKey, 1);
-            editOffset++;
-          } else {
-            node[editKey] = editValue;
-          }
-        }
-      }
-
-      index = stack.index;
-      keys = stack.keys;
-      edits = stack.edits;
-      inArray = stack.inArray;
-      stack = stack.prev;
-    } else {
-      key = parent ? inArray ? index : keys[index] : undefined;
-      node = parent ? parent[key] : newRoot;
-
-      if (node === null || node === undefined) {
-        continue;
-      }
-
-      if (parent) {
-        path.push(key);
-      }
-    }
-
-    var result = void 0;
-
-    if (!Array.isArray(node)) {
-      if (!isNode(node)) {
-        throw new Error("Invalid AST Node: ".concat(inspect(node), "."));
-      }
-
-      var visitFn = getVisitFn(visitor, node.kind, isLeaving);
-
-      if (visitFn) {
-        result = visitFn.call(visitor, node, key, parent, path, ancestors);
-
-        if (result === BREAK) {
-          break;
-        }
-
-        if (result === false) {
-          if (!isLeaving) {
-            path.pop();
-            continue;
-          }
-        } else if (result !== undefined) {
-          edits.push([key, result]);
-
-          if (!isLeaving) {
-            if (isNode(result)) {
-              node = result;
-            } else {
-              path.pop();
-              continue;
-            }
-          }
-        }
-      }
-    }
-
-    if (result === undefined && isEdited) {
-      edits.push([key, node]);
-    }
-
-    if (isLeaving) {
-      path.pop();
-    } else {
-      var _visitorKeys$node$kin;
-
-      stack = {
-        inArray: inArray,
-        index: index,
-        keys: keys,
-        edits: edits,
-        prev: stack
-      };
-      inArray = Array.isArray(node);
-      keys = inArray ? node : (_visitorKeys$node$kin = visitorKeys[node.kind]) !== null && _visitorKeys$node$kin !== void 0 ? _visitorKeys$node$kin : [];
-      index = -1;
-      edits = [];
-
-      if (parent) {
-        ancestors.push(parent);
-      }
-
-      parent = node;
-    }
-  } while (stack !== undefined);
-
-  if (edits.length !== 0) {
-    newRoot = edits[edits.length - 1][1];
-  }
-
-  return newRoot;
-}
-/**
- * Creates a new visitor instance which delegates to many visitors to run in
- * parallel. Each visitor will be visited for each node before moving on.
- *
- * If a prior visitor edits a node, no following visitors will see that node.
- */
-
-export function visitInParallel(visitors) {
-  var skipping = new Array(visitors.length);
-  return {
-    enter: function enter(node) {
-      for (var i = 0; i < visitors.length; i++) {
-        if (skipping[i] == null) {
-          var fn = getVisitFn(visitors[i], node.kind,
-          /* isLeaving */
-          false);
-
-          if (fn) {
-            var result = fn.apply(visitors[i], arguments);
-
-            if (result === false) {
-              skipping[i] = node;
-            } else if (result === BREAK) {
-              skipping[i] = BREAK;
-            } else if (result !== undefined) {
-              return result;
-            }
-          }
-        }
-      }
-    },
-    leave: function leave(node) {
-      for (var i = 0; i < visitors.length; i++) {
-        if (skipping[i] == null) {
-          var fn = getVisitFn(visitors[i], node.kind,
-          /* isLeaving */
-          true);
-
-          if (fn) {
-            var result = fn.apply(visitors[i], arguments);
-
-            if (result === BREAK) {
-              skipping[i] = BREAK;
-            } else if (result !== undefined && result !== false) {
-              return result;
-            }
-          }
-        } else if (skipping[i] === node) {
-          skipping[i] = null;
-        }
-      }
-    }
-  };
-}
-/**
- * Given a visitor instance, if it is leaving or not, and a node kind, return
- * the function the visitor runtime should call.
- */
-
-export function getVisitFn(visitor, kind, isLeaving) {
-  var kindVisitor = visitor[kind];
-
-  if (kindVisitor) {
-    if (!isLeaving && typeof kindVisitor === 'function') {
-      // { Kind() {} }
-      return kindVisitor;
-    }
-
-    var kindSpecificVisitor = isLeaving ? kindVisitor.leave : kindVisitor.enter;
-
-    if (typeof kindSpecificVisitor === 'function') {
-      // { Kind: { enter() {}, leave() {} } }
-      return kindSpecificVisitor;
-    }
-  } else {
-    var specificVisitor = isLeaving ? visitor.leave : visitor.enter;
-
-    if (specificVisitor) {
-      if (typeof specificVisitor === 'function') {
-        // { enter() {}, leave() {} }
-        return specificVisitor;
-      }
-
-      var specificKindVisitor = specificVisitor[kind];
-
-      if (typeof specificKindVisitor === 'function') {
-        // { enter: { Kind() {} }, leave: { Kind() {} } }
-        return specificKindVisitor;
-      }
-    }
-  }
-}
diff --git a/node_modules/graphql/package.json b/node_modules/graphql/package.json
deleted file mode 100644
index 7151c95..0000000
--- a/node_modules/graphql/package.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  "name": "graphql",
-  "version": "15.0.0-rc.2",
-  "description": "A Query Language and Runtime which can target any service.",
-  "license": "MIT",
-  "main": "index",
-  "module": "index.mjs",
-  "types": "index.d.ts",
-  "sideEffects": false,
-  "homepage": "https://github.com/graphql/graphql-js",
-  "bugs": {
-    "url": "https://github.com/graphql/graphql-js/issues"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/graphql/graphql-js.git"
-  },
-  "keywords": [
-    "graphql",
-    "graphql-js"
-  ],
-  "engines": {
-    "node": ">= 10.x"
-  },
-  "dependencies": {},
-  "publishConfig": {
-    "tag": "rc"
-  }
-}
diff --git a/node_modules/graphql/polyfills/arrayFrom.js b/node_modules/graphql/polyfills/arrayFrom.js
deleted file mode 100644
index 2f0a12d..0000000
--- a/node_modules/graphql/polyfills/arrayFrom.js
+++ /dev/null
@@ -1,58 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-var _symbols = require("./symbols");
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe
-var arrayFrom = Array.from || function (obj, mapFn, thisArg) {
-  if (obj == null) {
-    throw new TypeError('Array.from requires an array-like object - not null or undefined');
-  } // Is Iterable?
-
-
-  var iteratorMethod = obj[_symbols.SYMBOL_ITERATOR];
-
-  if (typeof iteratorMethod === 'function') {
-    var iterator = iteratorMethod.call(obj);
-    var result = [];
-    var step;
-
-    for (var i = 0; !(step = iterator.next()).done; ++i) {
-      result.push(mapFn.call(thisArg, step.value, i)); // Infinite Iterators could cause forEach to run forever.
-      // After a very large number of iterations, produce an error.
-
-      /* istanbul ignore if */
-
-      if (i > 9999999) {
-        throw new TypeError('Near-infinite iteration.');
-      }
-    }
-
-    return result;
-  } // Is Array like?
-
-
-  var length = obj.length;
-
-  if (typeof length === 'number' && length >= 0 && length % 1 === 0) {
-    var _result = [];
-
-    for (var _i = 0; _i < length; ++_i) {
-      if (Object.prototype.hasOwnProperty.call(obj, _i)) {
-        _result.push(mapFn.call(thisArg, obj[_i], _i));
-      }
-    }
-
-    return _result;
-  }
-
-  return [];
-};
-
-var _default = arrayFrom;
-exports.default = _default;
diff --git a/node_modules/graphql/polyfills/arrayFrom.js.flow b/node_modules/graphql/polyfills/arrayFrom.js.flow
deleted file mode 100644
index ab7ad40..0000000
--- a/node_modules/graphql/polyfills/arrayFrom.js.flow
+++ /dev/null
@@ -1,59 +0,0 @@
-// @flow strict
-
-import { SYMBOL_ITERATOR } from './symbols';
-
-declare function arrayFrom<T>(arrayLike: Iterable<T>): Array<T>;
-// eslint-disable-next-line no-redeclare
-declare function arrayFrom<T: mixed>(
-  arrayLike: mixed,
-  mapFn?: (elem: mixed, index: number) => T,
-  thisArg?: mixed,
-): Array<T>;
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe
-const arrayFrom =
-  Array.from ||
-  function(obj, mapFn, thisArg) {
-    if (obj == null) {
-      throw new TypeError(
-        'Array.from requires an array-like object - not null or undefined',
-      );
-    }
-
-    // Is Iterable?
-    const iteratorMethod = obj[SYMBOL_ITERATOR];
-    if (typeof iteratorMethod === 'function') {
-      const iterator = iteratorMethod.call(obj);
-      const result = [];
-      let step;
-
-      for (let i = 0; !(step = iterator.next()).done; ++i) {
-        result.push(mapFn.call(thisArg, step.value, i));
-        // Infinite Iterators could cause forEach to run forever.
-        // After a very large number of iterations, produce an error.
-        /* istanbul ignore if */
-        if (i > 9999999) {
-          throw new TypeError('Near-infinite iteration.');
-        }
-      }
-      return result;
-    }
-
-    // Is Array like?
-    const length = obj.length;
-    if (typeof length === 'number' && length >= 0 && length % 1 === 0) {
-      const result = [];
-
-      for (let i = 0; i < length; ++i) {
-        if (Object.prototype.hasOwnProperty.call(obj, i)) {
-          result.push(mapFn.call(thisArg, obj[i], i));
-        }
-      }
-      return result;
-    }
-
-    return [];
-  };
-
-export default arrayFrom;
diff --git a/node_modules/graphql/polyfills/arrayFrom.mjs b/node_modules/graphql/polyfills/arrayFrom.mjs
deleted file mode 100644
index eb8b4cf..0000000
--- a/node_modules/graphql/polyfills/arrayFrom.mjs
+++ /dev/null
@@ -1,50 +0,0 @@
-import { SYMBOL_ITERATOR } from "./symbols.mjs";
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe
-var arrayFrom = Array.from || function (obj, mapFn, thisArg) {
-  if (obj == null) {
-    throw new TypeError('Array.from requires an array-like object - not null or undefined');
-  } // Is Iterable?
-
-
-  var iteratorMethod = obj[SYMBOL_ITERATOR];
-
-  if (typeof iteratorMethod === 'function') {
-    var iterator = iteratorMethod.call(obj);
-    var result = [];
-    var step;
-
-    for (var i = 0; !(step = iterator.next()).done; ++i) {
-      result.push(mapFn.call(thisArg, step.value, i)); // Infinite Iterators could cause forEach to run forever.
-      // After a very large number of iterations, produce an error.
-
-      /* istanbul ignore if */
-
-      if (i > 9999999) {
-        throw new TypeError('Near-infinite iteration.');
-      }
-    }
-
-    return result;
-  } // Is Array like?
-
-
-  var length = obj.length;
-
-  if (typeof length === 'number' && length >= 0 && length % 1 === 0) {
-    var _result = [];
-
-    for (var _i = 0; _i < length; ++_i) {
-      if (Object.prototype.hasOwnProperty.call(obj, _i)) {
-        _result.push(mapFn.call(thisArg, obj[_i], _i));
-      }
-    }
-
-    return _result;
-  }
-
-  return [];
-};
-
-export default arrayFrom;
diff --git a/node_modules/graphql/polyfills/find.js b/node_modules/graphql/polyfills/find.js
deleted file mode 100644
index 0ddcdab..0000000
--- a/node_modules/graphql/polyfills/find.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe
-var find = Array.prototype.find ? function (list, predicate) {
-  return Array.prototype.find.call(list, predicate);
-} : function (list, predicate) {
-  for (var _i2 = 0; _i2 < list.length; _i2++) {
-    var value = list[_i2];
-
-    if (predicate(value)) {
-      return value;
-    }
-  }
-};
-var _default = find;
-exports.default = _default;
diff --git a/node_modules/graphql/polyfills/find.js.flow b/node_modules/graphql/polyfills/find.js.flow
deleted file mode 100644
index 2243c2a..0000000
--- a/node_modules/graphql/polyfills/find.js.flow
+++ /dev/null
@@ -1,21 +0,0 @@
-// @flow strict
-
-declare function find<T>(
-  list: $ReadOnlyArray<T>,
-  predicate: (item: T) => boolean,
-): T | void;
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe
-const find = Array.prototype.find
-  ? function(list, predicate) {
-      return Array.prototype.find.call(list, predicate);
-    }
-  : function(list, predicate) {
-      for (const value of list) {
-        if (predicate(value)) {
-          return value;
-        }
-      }
-    };
-export default find;
diff --git a/node_modules/graphql/polyfills/find.mjs b/node_modules/graphql/polyfills/find.mjs
deleted file mode 100644
index 6e45b1b..0000000
--- a/node_modules/graphql/polyfills/find.mjs
+++ /dev/null
@@ -1,14 +0,0 @@
-/* eslint-disable no-redeclare */
-// $FlowFixMe
-var find = Array.prototype.find ? function (list, predicate) {
-  return Array.prototype.find.call(list, predicate);
-} : function (list, predicate) {
-  for (var _i2 = 0; _i2 < list.length; _i2++) {
-    var value = list[_i2];
-
-    if (predicate(value)) {
-      return value;
-    }
-  }
-};
-export default find;
diff --git a/node_modules/graphql/polyfills/flatMap.js b/node_modules/graphql/polyfills/flatMap.js
deleted file mode 100644
index 95bbcdd..0000000
--- a/node_modules/graphql/polyfills/flatMap.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-var flatMapMethod = Array.prototype.flatMap;
-/* eslint-disable no-redeclare */
-// $FlowFixMe
-
-var flatMap = flatMapMethod ? function (list, fn) {
-  return flatMapMethod.call(list, fn);
-} : function (list, fn) {
-  var result = [];
-
-  for (var _i2 = 0; _i2 < list.length; _i2++) {
-    var _item = list[_i2];
-    var value = fn(_item);
-
-    if (Array.isArray(value)) {
-      result = result.concat(value);
-    } else {
-      result.push(value);
-    }
-  }
-
-  return result;
-};
-var _default = flatMap;
-exports.default = _default;
diff --git a/node_modules/graphql/polyfills/flatMap.js.flow b/node_modules/graphql/polyfills/flatMap.js.flow
deleted file mode 100644
index 4152b16..0000000
--- a/node_modules/graphql/polyfills/flatMap.js.flow
+++ /dev/null
@@ -1,28 +0,0 @@
-// @flow strict
-
-declare function flatMap<T, U>(
-  list: $ReadOnlyArray<T>,
-  fn: (item: T, index: number) => $ReadOnlyArray<U> | U,
-): Array<U>;
-
-const flatMapMethod = Array.prototype.flatMap;
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe
-const flatMap = flatMapMethod
-  ? function(list, fn) {
-      return flatMapMethod.call(list, fn);
-    }
-  : function(list, fn) {
-      let result = [];
-      for (const item of list) {
-        const value = fn(item);
-        if (Array.isArray(value)) {
-          result = result.concat(value);
-        } else {
-          result.push(value);
-        }
-      }
-      return result;
-    };
-export default flatMap;
diff --git a/node_modules/graphql/polyfills/flatMap.mjs b/node_modules/graphql/polyfills/flatMap.mjs
deleted file mode 100644
index fa98621..0000000
--- a/node_modules/graphql/polyfills/flatMap.mjs
+++ /dev/null
@@ -1,23 +0,0 @@
-var flatMapMethod = Array.prototype.flatMap;
-/* eslint-disable no-redeclare */
-// $FlowFixMe
-
-var flatMap = flatMapMethod ? function (list, fn) {
-  return flatMapMethod.call(list, fn);
-} : function (list, fn) {
-  var result = [];
-
-  for (var _i2 = 0; _i2 < list.length; _i2++) {
-    var _item = list[_i2];
-    var value = fn(_item);
-
-    if (Array.isArray(value)) {
-      result = result.concat(value);
-    } else {
-      result.push(value);
-    }
-  }
-
-  return result;
-};
-export default flatMap;
diff --git a/node_modules/graphql/polyfills/isFinite.js b/node_modules/graphql/polyfills/isFinite.js
deleted file mode 100644
index 04946c0..0000000
--- a/node_modules/graphql/polyfills/isFinite.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe workaround for: https://github.com/facebook/flow/issues/4441
-var isFinitePolyfill = Number.isFinite || function (value) {
-  return typeof value === 'number' && isFinite(value);
-};
-
-var _default = isFinitePolyfill;
-exports.default = _default;
diff --git a/node_modules/graphql/polyfills/isFinite.js.flow b/node_modules/graphql/polyfills/isFinite.js.flow
deleted file mode 100644
index 9156126..0000000
--- a/node_modules/graphql/polyfills/isFinite.js.flow
+++ /dev/null
@@ -1,14 +0,0 @@
-// @flow strict
-
-declare function isFinitePolyfill(
-  value: mixed,
-): boolean %checks(typeof value === 'number');
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe workaround for: https://github.com/facebook/flow/issues/4441
-const isFinitePolyfill =
-  Number.isFinite ||
-  function(value) {
-    return typeof value === 'number' && isFinite(value);
-  };
-export default isFinitePolyfill;
diff --git a/node_modules/graphql/polyfills/isFinite.mjs b/node_modules/graphql/polyfills/isFinite.mjs
deleted file mode 100644
index 5a39aef..0000000
--- a/node_modules/graphql/polyfills/isFinite.mjs
+++ /dev/null
@@ -1,7 +0,0 @@
-/* eslint-disable no-redeclare */
-// $FlowFixMe workaround for: https://github.com/facebook/flow/issues/4441
-var isFinitePolyfill = Number.isFinite || function (value) {
-  return typeof value === 'number' && isFinite(value);
-};
-
-export default isFinitePolyfill;
diff --git a/node_modules/graphql/polyfills/isInteger.js b/node_modules/graphql/polyfills/isInteger.js
deleted file mode 100644
index 3e90e1c..0000000
--- a/node_modules/graphql/polyfills/isInteger.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe workaround for: https://github.com/facebook/flow/issues/4441
-var isInteger = Number.isInteger || function (value) {
-  return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
-};
-
-var _default = isInteger;
-exports.default = _default;
diff --git a/node_modules/graphql/polyfills/isInteger.js.flow b/node_modules/graphql/polyfills/isInteger.js.flow
deleted file mode 100644
index f4c4639..0000000
--- a/node_modules/graphql/polyfills/isInteger.js.flow
+++ /dev/null
@@ -1,17 +0,0 @@
-// @flow strict
-
-declare function isInteger(value: mixed): boolean %checks(typeof value ===
-  'number');
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe workaround for: https://github.com/facebook/flow/issues/4441
-const isInteger =
-  Number.isInteger ||
-  function(value) {
-    return (
-      typeof value === 'number' &&
-      isFinite(value) &&
-      Math.floor(value) === value
-    );
-  };
-export default isInteger;
diff --git a/node_modules/graphql/polyfills/isInteger.mjs b/node_modules/graphql/polyfills/isInteger.mjs
deleted file mode 100644
index 6c8033d..0000000
--- a/node_modules/graphql/polyfills/isInteger.mjs
+++ /dev/null
@@ -1,7 +0,0 @@
-/* eslint-disable no-redeclare */
-// $FlowFixMe workaround for: https://github.com/facebook/flow/issues/4441
-var isInteger = Number.isInteger || function (value) {
-  return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
-};
-
-export default isInteger;
diff --git a/node_modules/graphql/polyfills/objectEntries.js b/node_modules/graphql/polyfills/objectEntries.js
deleted file mode 100644
index 856dba3..0000000
--- a/node_modules/graphql/polyfills/objectEntries.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe workaround for: https://github.com/facebook/flow/issues/5838
-var objectEntries = Object.entries || function (obj) {
-  return Object.keys(obj).map(function (key) {
-    return [key, obj[key]];
-  });
-};
-
-var _default = objectEntries;
-exports.default = _default;
diff --git a/node_modules/graphql/polyfills/objectEntries.js.flow b/node_modules/graphql/polyfills/objectEntries.js.flow
deleted file mode 100644
index ba4f5e1..0000000
--- a/node_modules/graphql/polyfills/objectEntries.js.flow
+++ /dev/null
@@ -1,12 +0,0 @@
-// @flow strict
-
-import { type ObjMap } from '../jsutils/ObjMap';
-
-declare function objectEntries<T>(obj: ObjMap<T>): Array<[string, T]>;
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe workaround for: https://github.com/facebook/flow/issues/5838
-const objectEntries =
-  Object.entries || (obj => Object.keys(obj).map(key => [key, obj[key]]));
-
-export default objectEntries;
diff --git a/node_modules/graphql/polyfills/objectEntries.mjs b/node_modules/graphql/polyfills/objectEntries.mjs
deleted file mode 100644
index a4767a5..0000000
--- a/node_modules/graphql/polyfills/objectEntries.mjs
+++ /dev/null
@@ -1,9 +0,0 @@
-/* eslint-disable no-redeclare */
-// $FlowFixMe workaround for: https://github.com/facebook/flow/issues/5838
-var objectEntries = Object.entries || function (obj) {
-  return Object.keys(obj).map(function (key) {
-    return [key, obj[key]];
-  });
-};
-
-export default objectEntries;
diff --git a/node_modules/graphql/polyfills/objectValues.js b/node_modules/graphql/polyfills/objectValues.js
deleted file mode 100644
index 28282c4..0000000
--- a/node_modules/graphql/polyfills/objectValues.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = void 0;
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe workaround for: https://github.com/facebook/flow/issues/2221
-var objectValues = Object.values || function (obj) {
-  return Object.keys(obj).map(function (key) {
-    return obj[key];
-  });
-};
-
-var _default = objectValues;
-exports.default = _default;
diff --git a/node_modules/graphql/polyfills/objectValues.js.flow b/node_modules/graphql/polyfills/objectValues.js.flow
deleted file mode 100644
index 8f1d65f..0000000
--- a/node_modules/graphql/polyfills/objectValues.js.flow
+++ /dev/null
@@ -1,11 +0,0 @@
-// @flow strict
-
-import { type ObjMap } from '../jsutils/ObjMap';
-
-declare function objectValues<T>(obj: ObjMap<T>): Array<T>;
-
-/* eslint-disable no-redeclare */
-// $FlowFixMe workaround for: https://github.com/facebook/flow/issues/2221
-const objectValues =
-  Object.values || (obj => Object.keys(obj).map(key => obj[key]));
-export default objectValues;
diff --git a/node_modules/graphql/polyfills/objectValues.mjs b/node_modules/graphql/polyfills/objectValues.mjs
deleted file mode 100644
index 49092b4..0000000
--- a/node_modules/graphql/polyfills/objectValues.mjs
+++ /dev/null
@@ -1,9 +0,0 @@
-/* eslint-disable no-redeclare */
-// $FlowFixMe workaround for: https://github.com/facebook/flow/issues/2221
-var objectValues = Object.values || function (obj) {
-  return Object.keys(obj).map(function (key) {
-    return obj[key];
-  });
-};
-
-export default objectValues;
diff --git a/node_modules/graphql/polyfills/symbols.js b/node_modules/graphql/polyfills/symbols.js
deleted file mode 100644
index d31280c..0000000
--- a/node_modules/graphql/polyfills/symbols.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.SYMBOL_TO_STRING_TAG = exports.SYMBOL_ASYNC_ITERATOR = exports.SYMBOL_ITERATOR = void 0;
-// In ES2015 (or a polyfilled) environment, this will be Symbol.iterator
-
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-var SYMBOL_ITERATOR = typeof Symbol === 'function' ? Symbol.iterator : '@@iterator'; // In ES2017 (or a polyfilled) environment, this will be Symbol.asyncIterator
-
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-
-exports.SYMBOL_ITERATOR = SYMBOL_ITERATOR;
-var SYMBOL_ASYNC_ITERATOR = // $FlowFixMe Flow doesn't define `Symbol.asyncIterator` yet
-typeof Symbol === 'function' ? Symbol.asyncIterator : '@@asyncIterator';
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-
-exports.SYMBOL_ASYNC_ITERATOR = SYMBOL_ASYNC_ITERATOR;
-var SYMBOL_TO_STRING_TAG = // $FlowFixMe Flow doesn't define `Symbol.toStringTag` yet
-typeof Symbol === 'function' ? Symbol.toStringTag : '@@toStringTag';
-exports.SYMBOL_TO_STRING_TAG = SYMBOL_TO_STRING_TAG;
diff --git a/node_modules/graphql/polyfills/symbols.js.flow b/node_modules/graphql/polyfills/symbols.js.flow
deleted file mode 100644
index af2d267..0000000
--- a/node_modules/graphql/polyfills/symbols.js.flow
+++ /dev/null
@@ -1,17 +0,0 @@
-// @flow strict
-
-// In ES2015 (or a polyfilled) environment, this will be Symbol.iterator
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-export const SYMBOL_ITERATOR: string =
-  typeof Symbol === 'function' ? Symbol.iterator : '@@iterator';
-
-// In ES2017 (or a polyfilled) environment, this will be Symbol.asyncIterator
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-export const SYMBOL_ASYNC_ITERATOR: string =
-  // $FlowFixMe Flow doesn't define `Symbol.asyncIterator` yet
-  typeof Symbol === 'function' ? Symbol.asyncIterator : '@@asyncIterator';
-
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-export const SYMBOL_TO_STRING_TAG: string =
-  // $FlowFixMe Flow doesn't define `Symbol.toStringTag` yet
-  typeof Symbol === 'function' ? Symbol.toStringTag : '@@toStringTag';
diff --git a/node_modules/graphql/polyfills/symbols.mjs b/node_modules/graphql/polyfills/symbols.mjs
deleted file mode 100644
index 5b2a071..0000000
--- a/node_modules/graphql/polyfills/symbols.mjs
+++ /dev/null
@@ -1,13 +0,0 @@
-// In ES2015 (or a polyfilled) environment, this will be Symbol.iterator
-
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-export var SYMBOL_ITERATOR = typeof Symbol === 'function' ? Symbol.iterator : '@@iterator'; // In ES2017 (or a polyfilled) environment, this will be Symbol.asyncIterator
-
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-
-export var SYMBOL_ASYNC_ITERATOR = // $FlowFixMe Flow doesn't define `Symbol.asyncIterator` yet
-typeof Symbol === 'function' ? Symbol.asyncIterator : '@@asyncIterator';
-/* istanbul ignore next (See: https://github.com/graphql/graphql-js/issues/2317) */
-
-export var SYMBOL_TO_STRING_TAG = // $FlowFixMe Flow doesn't define `Symbol.toStringTag` yet
-typeof Symbol === 'function' ? Symbol.toStringTag : '@@toStringTag';
diff --git a/node_modules/graphql/subscription/index.d.ts b/node_modules/graphql/subscription/index.d.ts
deleted file mode 100644
index ba8835f..0000000
--- a/node_modules/graphql/subscription/index.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export {
-  subscribe,
-  createSourceEventStream,
-  SubscriptionArgs,
-} from './subscribe';
diff --git a/node_modules/graphql/subscription/index.js b/node_modules/graphql/subscription/index.js
deleted file mode 100644
index ec052a6..0000000
--- a/node_modules/graphql/subscription/index.js
+++ /dev/null
@@ -1,19 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "subscribe", {
-  enumerable: true,
-  get: function get() {
-    return _subscribe.subscribe;
-  }
-});
-Object.defineProperty(exports, "createSourceEventStream", {
-  enumerable: true,
-  get: function get() {
-    return _subscribe.createSourceEventStream;
-  }
-});
-
-var _subscribe = require("./subscribe");
diff --git a/node_modules/graphql/subscription/index.js.flow b/node_modules/graphql/subscription/index.js.flow
deleted file mode 100644
index 45645ed..0000000
--- a/node_modules/graphql/subscription/index.js.flow
+++ /dev/null
@@ -1,4 +0,0 @@
-// @flow strict
-
-export { subscribe, createSourceEventStream } from './subscribe';
-export type { SubscriptionArgs } from './subscribe';
diff --git a/node_modules/graphql/subscription/index.mjs b/node_modules/graphql/subscription/index.mjs
deleted file mode 100644
index 8983f84..0000000
--- a/node_modules/graphql/subscription/index.mjs
+++ /dev/null
@@ -1 +0,0 @@
-export { subscribe, createSourceEventStream } from "./subscribe.mjs";
diff --git a/node_modules/graphql/subscription/mapAsyncIterator.d.ts b/node_modules/graphql/subscription/mapAsyncIterator.d.ts
deleted file mode 100644
index 22e8a34..0000000
--- a/node_modules/graphql/subscription/mapAsyncIterator.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { PromiseOrValue } from '../jsutils/PromiseOrValue';
-
-/**
- * Given an AsyncIterable and a callback function, return an AsyncIterator
- * which produces values mapped via calling the callback function.
- */
-export default function mapAsyncIterator<T, U>(
-  iterable: AsyncIterable<T>,
-  callback: (arg: T) => PromiseOrValue<U>,
-  rejectCallback?: (arg: any) => PromiseOrValue<U>,
-): any; // TS_SPECIFIC: AsyncGenerator requires typescript@3.6
diff --git a/node_modules/graphql/subscription/mapAsyncIterator.js b/node_modules/graphql/subscription/mapAsyncIterator.js
deleted file mode 100644
index c776a5b..0000000
--- a/node_modules/graphql/subscription/mapAsyncIterator.js
+++ /dev/null
@@ -1,87 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = mapAsyncIterator;
-
-var _symbols = require("../polyfills/symbols");
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-/**
- * Given an AsyncIterable and a callback function, return an AsyncIterator
- * which produces values mapped via calling the callback function.
- */
-function mapAsyncIterator(iterable, callback, rejectCallback) {
-  // $FlowFixMe
-  var iteratorMethod = iterable[_symbols.SYMBOL_ASYNC_ITERATOR];
-  var iterator = iteratorMethod.call(iterable);
-  var $return;
-  var abruptClose; // $FlowFixMe(>=0.68.0)
-
-  if (typeof iterator.return === 'function') {
-    $return = iterator.return;
-
-    abruptClose = function abruptClose(error) {
-      var rethrow = function rethrow() {
-        return Promise.reject(error);
-      };
-
-      return $return.call(iterator).then(rethrow, rethrow);
-    };
-  }
-
-  function mapResult(result) {
-    return result.done ? result : asyncMapValue(result.value, callback).then(iteratorResult, abruptClose);
-  }
-
-  var mapReject;
-
-  if (rejectCallback) {
-    // Capture rejectCallback to ensure it cannot be null.
-    var reject = rejectCallback;
-
-    mapReject = function mapReject(error) {
-      return asyncMapValue(error, reject).then(iteratorResult, abruptClose);
-    };
-  }
-  /* TODO: Flow doesn't support symbols as keys:
-     https://github.com/facebook/flow/issues/3258 */
-
-
-  return _defineProperty({
-    next: function next() {
-      return iterator.next().then(mapResult, mapReject);
-    },
-    return: function _return() {
-      return $return ? $return.call(iterator).then(mapResult, mapReject) : Promise.resolve({
-        value: undefined,
-        done: true
-      });
-    },
-    throw: function _throw(error) {
-      // $FlowFixMe(>=0.68.0)
-      if (typeof iterator.throw === 'function') {
-        return iterator.throw(error).then(mapResult, mapReject);
-      }
-
-      return Promise.reject(error).catch(abruptClose);
-    }
-  }, _symbols.SYMBOL_ASYNC_ITERATOR, function () {
-    return this;
-  });
-}
-
-function asyncMapValue(value, callback) {
-  return new Promise(function (resolve) {
-    return resolve(callback(value));
-  });
-}
-
-function iteratorResult(value) {
-  return {
-    value: value,
-    done: false
-  };
-}
diff --git a/node_modules/graphql/subscription/mapAsyncIterator.js.flow b/node_modules/graphql/subscription/mapAsyncIterator.js.flow
deleted file mode 100644
index 46dc8d7..0000000
--- a/node_modules/graphql/subscription/mapAsyncIterator.js.flow
+++ /dev/null
@@ -1,77 +0,0 @@
-// @flow strict
-
-import { SYMBOL_ASYNC_ITERATOR } from '../polyfills/symbols';
-
-import { type PromiseOrValue } from '../jsutils/PromiseOrValue';
-
-/**
- * Given an AsyncIterable and a callback function, return an AsyncIterator
- * which produces values mapped via calling the callback function.
- */
-export default function mapAsyncIterator<T, U>(
-  iterable: AsyncIterable<T>,
-  callback: T => PromiseOrValue<U>,
-  rejectCallback?: any => PromiseOrValue<U>,
-): AsyncGenerator<U, void, void> {
-  // $FlowFixMe
-  const iteratorMethod = iterable[SYMBOL_ASYNC_ITERATOR];
-  const iterator: AsyncIterator<T> = iteratorMethod.call(iterable);
-  let $return;
-  let abruptClose;
-  // $FlowFixMe(>=0.68.0)
-  if (typeof iterator.return === 'function') {
-    $return = iterator.return;
-    abruptClose = error => {
-      const rethrow = () => Promise.reject(error);
-      return $return.call(iterator).then(rethrow, rethrow);
-    };
-  }
-
-  function mapResult(result) {
-    return result.done
-      ? result
-      : asyncMapValue(result.value, callback).then(iteratorResult, abruptClose);
-  }
-
-  let mapReject;
-  if (rejectCallback) {
-    // Capture rejectCallback to ensure it cannot be null.
-    const reject = rejectCallback;
-    mapReject = error =>
-      asyncMapValue(error, reject).then(iteratorResult, abruptClose);
-  }
-
-  /* TODO: Flow doesn't support symbols as keys:
-     https://github.com/facebook/flow/issues/3258 */
-  return ({
-    next() {
-      return iterator.next().then(mapResult, mapReject);
-    },
-    return() {
-      return $return
-        ? $return.call(iterator).then(mapResult, mapReject)
-        : Promise.resolve({ value: undefined, done: true });
-    },
-    throw(error) {
-      // $FlowFixMe(>=0.68.0)
-      if (typeof iterator.throw === 'function') {
-        return iterator.throw(error).then(mapResult, mapReject);
-      }
-      return Promise.reject(error).catch(abruptClose);
-    },
-    [SYMBOL_ASYNC_ITERATOR]() {
-      return this;
-    },
-  }: any);
-}
-
-function asyncMapValue<T, U>(
-  value: T,
-  callback: T => PromiseOrValue<U>,
-): Promise<U> {
-  return new Promise(resolve => resolve(callback(value)));
-}
-
-function iteratorResult<T>(value: T): IteratorResult<T, void> {
-  return { value, done: false };
-}
diff --git a/node_modules/graphql/subscription/mapAsyncIterator.mjs b/node_modules/graphql/subscription/mapAsyncIterator.mjs
deleted file mode 100644
index 371e356..0000000
--- a/node_modules/graphql/subscription/mapAsyncIterator.mjs
+++ /dev/null
@@ -1,80 +0,0 @@
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-import { SYMBOL_ASYNC_ITERATOR } from "../polyfills/symbols.mjs";
-
-/**
- * Given an AsyncIterable and a callback function, return an AsyncIterator
- * which produces values mapped via calling the callback function.
- */
-export default function mapAsyncIterator(iterable, callback, rejectCallback) {
-  // $FlowFixMe
-  var iteratorMethod = iterable[SYMBOL_ASYNC_ITERATOR];
-  var iterator = iteratorMethod.call(iterable);
-  var $return;
-  var abruptClose; // $FlowFixMe(>=0.68.0)
-
-  if (typeof iterator.return === 'function') {
-    $return = iterator.return;
-
-    abruptClose = function abruptClose(error) {
-      var rethrow = function rethrow() {
-        return Promise.reject(error);
-      };
-
-      return $return.call(iterator).then(rethrow, rethrow);
-    };
-  }
-
-  function mapResult(result) {
-    return result.done ? result : asyncMapValue(result.value, callback).then(iteratorResult, abruptClose);
-  }
-
-  var mapReject;
-
-  if (rejectCallback) {
-    // Capture rejectCallback to ensure it cannot be null.
-    var reject = rejectCallback;
-
-    mapReject = function mapReject(error) {
-      return asyncMapValue(error, reject).then(iteratorResult, abruptClose);
-    };
-  }
-  /* TODO: Flow doesn't support symbols as keys:
-     https://github.com/facebook/flow/issues/3258 */
-
-
-  return _defineProperty({
-    next: function next() {
-      return iterator.next().then(mapResult, mapReject);
-    },
-    return: function _return() {
-      return $return ? $return.call(iterator).then(mapResult, mapReject) : Promise.resolve({
-        value: undefined,
-        done: true
-      });
-    },
-    throw: function _throw(error) {
-      // $FlowFixMe(>=0.68.0)
-      if (typeof iterator.throw === 'function') {
-        return iterator.throw(error).then(mapResult, mapReject);
-      }
-
-      return Promise.reject(error).catch(abruptClose);
-    }
-  }, SYMBOL_ASYNC_ITERATOR, function () {
-    return this;
-  });
-}
-
-function asyncMapValue(value, callback) {
-  return new Promise(function (resolve) {
-    return resolve(callback(value));
-  });
-}
-
-function iteratorResult(value) {
-  return {
-    value: value,
-    done: false
-  };
-}
diff --git a/node_modules/graphql/subscription/subscribe.d.ts b/node_modules/graphql/subscription/subscribe.d.ts
deleted file mode 100644
index a2a2d08..0000000
--- a/node_modules/graphql/subscription/subscribe.d.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-import { DocumentNode } from '../language/ast';
-import {
-  ExecutionResult,
-  ExecutionResultDataDefault,
-} from '../execution/execute';
-import { GraphQLSchema } from '../type/schema';
-import { GraphQLFieldResolver } from '../type/definition';
-
-export interface SubscriptionArgs {
-  schema: GraphQLSchema;
-  document: DocumentNode;
-  rootValue?: any;
-  contextValue?: any;
-  variableValues?: Maybe<Record<string, any>>;
-  operationName?: Maybe<string>;
-  fieldResolver?: Maybe<GraphQLFieldResolver<any, any>>;
-  subscribeFieldResolver?: Maybe<GraphQLFieldResolver<any, any>>;
-}
-
-/**
- * Implements the "Subscribe" algorithm described in the GraphQL specification.
- *
- * Returns a Promise which resolves to either an AsyncIterator (if successful)
- * or an ExecutionResult (client error). The promise will be rejected if a
- * server error occurs.
- *
- * If the client-provided arguments to this function do not result in a
- * compliant subscription, a GraphQL Response (ExecutionResult) with
- * descriptive errors and no data will be returned.
- *
- * If the the source stream could not be created due to faulty subscription
- * resolver logic or underlying systems, the promise will resolve to a single
- * ExecutionResult containing `errors` and no `data`.
- *
- * If the operation succeeded, the promise resolves to an AsyncIterator, which
- * yields a stream of ExecutionResults representing the response stream.
- *
- * Accepts either an object with named arguments, or individual arguments.
- */
-export function subscribe<TData = ExecutionResultDataDefault>(
-  args: SubscriptionArgs,
-): Promise<
-  AsyncIterableIterator<ExecutionResult<TData>> | ExecutionResult<TData>
->;
-
-export function subscribe<TData = ExecutionResultDataDefault>(
-  schema: GraphQLSchema,
-  document: DocumentNode,
-  rootValue?: any,
-  contextValue?: any,
-  variableValues?: Maybe<{ [key: string]: any }>,
-  operationName?: Maybe<string>,
-  fieldResolver?: Maybe<GraphQLFieldResolver<any, any>>,
-  subscribeFieldResolver?: Maybe<GraphQLFieldResolver<any, any>>,
-): Promise<
-  AsyncIterableIterator<ExecutionResult<TData>> | ExecutionResult<TData>
->;
-
-/**
- * Implements the "CreateSourceEventStream" algorithm described in the
- * GraphQL specification, resolving the subscription source event stream.
- *
- * Returns a Promise<AsyncIterable>.
- *
- * If the client-provided invalid arguments, the source stream could not be
- * created, or the resolver did not return an AsyncIterable, this function will
- * will throw an error, which should be caught and handled by the caller.
- *
- * A Source Event Stream represents a sequence of events, each of which triggers
- * a GraphQL execution for that event.
- *
- * This may be useful when hosting the stateful subscription service in a
- * different process or machine than the stateless GraphQL execution engine,
- * or otherwise separating these two steps. For more on this, see the
- * "Supporting Subscriptions at Scale" information in the GraphQL specification.
- */
-export function createSourceEventStream<TData = ExecutionResultDataDefault>(
-  schema: GraphQLSchema,
-  document: DocumentNode,
-  rootValue?: any,
-  contextValue?: any,
-  variableValues?: { [key: string]: any },
-  operationName?: Maybe<string>,
-  fieldResolver?: Maybe<GraphQLFieldResolver<any, any>>,
-): Promise<AsyncIterable<any> | ExecutionResult<TData>>;
diff --git a/node_modules/graphql/subscription/subscribe.js b/node_modules/graphql/subscription/subscribe.js
deleted file mode 100644
index 40a44f1..0000000
--- a/node_modules/graphql/subscription/subscribe.js
+++ /dev/null
@@ -1,204 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.subscribe = subscribe;
-exports.createSourceEventStream = createSourceEventStream;
-
-var _symbols = require("../polyfills/symbols");
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _Path = require("../jsutils/Path");
-
-var _GraphQLError = require("../error/GraphQLError");
-
-var _locatedError = require("../error/locatedError");
-
-var _execute = require("../execution/execute");
-
-var _getOperationRootType = require("../utilities/getOperationRootType");
-
-var _mapAsyncIterator = _interopRequireDefault(require("./mapAsyncIterator"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-function subscribe(argsOrSchema, document, rootValue, contextValue, variableValues, operationName, fieldResolver, subscribeFieldResolver) {
-  /* eslint-enable no-redeclare */
-  // Extract arguments from object args if provided.
-  return arguments.length === 1 ? subscribeImpl(argsOrSchema) : subscribeImpl({
-    schema: argsOrSchema,
-    document: document,
-    rootValue: rootValue,
-    contextValue: contextValue,
-    variableValues: variableValues,
-    operationName: operationName,
-    fieldResolver: fieldResolver,
-    subscribeFieldResolver: subscribeFieldResolver
-  });
-}
-/**
- * This function checks if the error is a GraphQLError. If it is, report it as
- * an ExecutionResult, containing only errors and no data. Otherwise treat the
- * error as a system-class error and re-throw it.
- */
-
-
-function reportGraphQLError(error) {
-  if (error instanceof _GraphQLError.GraphQLError) {
-    return {
-      errors: [error]
-    };
-  }
-
-  throw error;
-}
-
-function subscribeImpl(args) {
-  var schema = args.schema,
-      document = args.document,
-      rootValue = args.rootValue,
-      contextValue = args.contextValue,
-      variableValues = args.variableValues,
-      operationName = args.operationName,
-      fieldResolver = args.fieldResolver,
-      subscribeFieldResolver = args.subscribeFieldResolver;
-  var sourcePromise = createSourceEventStream(schema, document, rootValue, contextValue, variableValues, operationName, subscribeFieldResolver); // For each payload yielded from a subscription, map it over the normal
-  // GraphQL `execute` function, with `payload` as the rootValue.
-  // This implements the "MapSourceToResponseEvent" algorithm described in
-  // the GraphQL specification. The `execute` function provides the
-  // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the
-  // "ExecuteQuery" algorithm, for which `execute` is also used.
-
-  var mapSourceToResponse = function mapSourceToResponse(payload) {
-    return (0, _execute.execute)({
-      schema: schema,
-      document: document,
-      rootValue: payload,
-      contextValue: contextValue,
-      variableValues: variableValues,
-      operationName: operationName,
-      fieldResolver: fieldResolver
-    });
-  }; // Resolve the Source Stream, then map every source value to a
-  // ExecutionResult value as described above.
-
-
-  return sourcePromise.then(function (resultOrStream) {
-    return (// Note: Flow can't refine isAsyncIterable, so explicit casts are used.
-      isAsyncIterable(resultOrStream) ? (0, _mapAsyncIterator.default)(resultOrStream, mapSourceToResponse, reportGraphQLError) : resultOrStream
-    );
-  });
-}
-/**
- * Implements the "CreateSourceEventStream" algorithm described in the
- * GraphQL specification, resolving the subscription source event stream.
- *
- * Returns a Promise which resolves to either an AsyncIterable (if successful)
- * or an ExecutionResult (error). The promise will be rejected if the schema or
- * other arguments to this function are invalid, or if the resolved event stream
- * is not an async iterable.
- *
- * If the client-provided arguments to this function do not result in a
- * compliant subscription, a GraphQL Response (ExecutionResult) with
- * descriptive errors and no data will be returned.
- *
- * If the the source stream could not be created due to faulty subscription
- * resolver logic or underlying systems, the promise will resolve to a single
- * ExecutionResult containing `errors` and no `data`.
- *
- * If the operation succeeded, the promise resolves to the AsyncIterable for the
- * event stream returned by the resolver.
- *
- * A Source Event Stream represents a sequence of events, each of which triggers
- * a GraphQL execution for that event.
- *
- * This may be useful when hosting the stateful subscription service in a
- * different process or machine than the stateless GraphQL execution engine,
- * or otherwise separating these two steps. For more on this, see the
- * "Supporting Subscriptions at Scale" information in the GraphQL specification.
- */
-
-
-function createSourceEventStream(schema, document, rootValue, contextValue, variableValues, operationName, fieldResolver) {
-  // If arguments are missing or incorrectly typed, this is an internal
-  // developer mistake which should throw an early error.
-  (0, _execute.assertValidExecutionArguments)(schema, document, variableValues);
-
-  try {
-    var _fieldDef$subscribe;
-
-    // If a valid context cannot be created due to incorrect arguments,
-    // this will throw an error.
-    var exeContext = (0, _execute.buildExecutionContext)(schema, document, rootValue, contextValue, variableValues, operationName, fieldResolver); // Return early errors if execution context failed.
-
-    if (Array.isArray(exeContext)) {
-      return Promise.resolve({
-        errors: exeContext
-      });
-    }
-
-    var type = (0, _getOperationRootType.getOperationRootType)(schema, exeContext.operation);
-    var fields = (0, _execute.collectFields)(exeContext, type, exeContext.operation.selectionSet, Object.create(null), Object.create(null));
-    var responseNames = Object.keys(fields);
-    var responseName = responseNames[0];
-    var fieldNodes = fields[responseName];
-    var fieldNode = fieldNodes[0];
-    var fieldName = fieldNode.name.value;
-    var fieldDef = (0, _execute.getFieldDef)(schema, type, fieldName);
-
-    if (!fieldDef) {
-      throw new _GraphQLError.GraphQLError("The subscription field \"".concat(fieldName, "\" is not defined."), fieldNodes);
-    } // Call the `subscribe()` resolver or the default resolver to produce an
-    // AsyncIterable yielding raw payloads.
-
-
-    var resolveFn = (_fieldDef$subscribe = fieldDef.subscribe) !== null && _fieldDef$subscribe !== void 0 ? _fieldDef$subscribe : exeContext.fieldResolver;
-    var path = (0, _Path.addPath)(undefined, responseName);
-    var info = (0, _execute.buildResolveInfo)(exeContext, fieldDef, fieldNodes, type, path); // resolveFieldValueOrError implements the "ResolveFieldEventStream"
-    // algorithm from GraphQL specification. It differs from
-    // "ResolveFieldValue" due to providing a different `resolveFn`.
-
-    var result = (0, _execute.resolveFieldValueOrError)(exeContext, fieldDef, fieldNodes, resolveFn, rootValue, info); // Coerce to Promise for easier error handling and consistent return type.
-
-    return Promise.resolve(result).then(function (eventStream) {
-      // If eventStream is an Error, rethrow a located error.
-      if (eventStream instanceof Error) {
-        return {
-          errors: [(0, _locatedError.locatedError)(eventStream, fieldNodes, (0, _Path.pathToArray)(path))]
-        };
-      } // Assert field returned an event stream, otherwise yield an error.
-
-
-      if (isAsyncIterable(eventStream)) {
-        // Note: isAsyncIterable above ensures this will be correct.
-        return eventStream;
-      }
-
-      throw new Error('Subscription field must return Async Iterable. ' + "Received: ".concat((0, _inspect.default)(eventStream), "."));
-    });
-  } catch (error) {
-    // As with reportGraphQLError above, if the error is a GraphQLError, report
-    // it as an ExecutionResult; otherwise treat it as a system-class error and
-    // re-throw it.
-    return error instanceof _GraphQLError.GraphQLError ? Promise.resolve({
-      errors: [error]
-    }) : Promise.reject(error);
-  }
-}
-/**
- * Returns true if the provided object implements the AsyncIterator protocol via
- * either implementing a `Symbol.asyncIterator` or `"@@asyncIterator"` method.
- */
-
-
-function isAsyncIterable(maybeAsyncIterable) {
-  if (maybeAsyncIterable == null || _typeof(maybeAsyncIterable) !== 'object') {
-    return false;
-  }
-
-  return typeof maybeAsyncIterable[_symbols.SYMBOL_ASYNC_ITERATOR] === 'function';
-}
diff --git a/node_modules/graphql/subscription/subscribe.js.flow b/node_modules/graphql/subscription/subscribe.js.flow
deleted file mode 100644
index 1b17080..0000000
--- a/node_modules/graphql/subscription/subscribe.js.flow
+++ /dev/null
@@ -1,312 +0,0 @@
-// @flow strict
-
-import { SYMBOL_ASYNC_ITERATOR } from '../polyfills/symbols';
-
-import inspect from '../jsutils/inspect';
-import { addPath, pathToArray } from '../jsutils/Path';
-
-import { GraphQLError } from '../error/GraphQLError';
-import { locatedError } from '../error/locatedError';
-
-import { type DocumentNode } from '../language/ast';
-
-import {
-  type ExecutionResult,
-  assertValidExecutionArguments,
-  buildExecutionContext,
-  buildResolveInfo,
-  collectFields,
-  execute,
-  getFieldDef,
-  resolveFieldValueOrError,
-} from '../execution/execute';
-
-import { type GraphQLSchema } from '../type/schema';
-import { type GraphQLFieldResolver } from '../type/definition';
-
-import { getOperationRootType } from '../utilities/getOperationRootType';
-
-import mapAsyncIterator from './mapAsyncIterator';
-
-export type SubscriptionArgs = {|
-  schema: GraphQLSchema,
-  document: DocumentNode,
-  rootValue?: mixed,
-  contextValue?: mixed,
-  variableValues?: ?{ +[variable: string]: mixed, ... },
-  operationName?: ?string,
-  fieldResolver?: ?GraphQLFieldResolver<any, any>,
-  subscribeFieldResolver?: ?GraphQLFieldResolver<any, any>,
-|};
-
-/**
- * Implements the "Subscribe" algorithm described in the GraphQL specification.
- *
- * Returns a Promise which resolves to either an AsyncIterator (if successful)
- * or an ExecutionResult (error). The promise will be rejected if the schema or
- * other arguments to this function are invalid, or if the resolved event stream
- * is not an async iterable.
- *
- * If the client-provided arguments to this function do not result in a
- * compliant subscription, a GraphQL Response (ExecutionResult) with
- * descriptive errors and no data will be returned.
- *
- * If the source stream could not be created due to faulty subscription
- * resolver logic or underlying systems, the promise will resolve to a single
- * ExecutionResult containing `errors` and no `data`.
- *
- * If the operation succeeded, the promise resolves to an AsyncIterator, which
- * yields a stream of ExecutionResults representing the response stream.
- *
- * Accepts either an object with named arguments, or individual arguments.
- */
-declare function subscribe(
-  SubscriptionArgs,
-  ..._: []
-): Promise<AsyncIterator<ExecutionResult> | ExecutionResult>;
-/* eslint-disable no-redeclare */
-declare function subscribe(
-  schema: GraphQLSchema,
-  document: DocumentNode,
-  rootValue?: mixed,
-  contextValue?: mixed,
-  variableValues?: ?{ +[variable: string]: mixed, ... },
-  operationName?: ?string,
-  fieldResolver?: ?GraphQLFieldResolver<any, any>,
-  subscribeFieldResolver?: ?GraphQLFieldResolver<any, any>,
-): Promise<AsyncIterator<ExecutionResult> | ExecutionResult>;
-export function subscribe(
-  argsOrSchema,
-  document,
-  rootValue,
-  contextValue,
-  variableValues,
-  operationName,
-  fieldResolver,
-  subscribeFieldResolver,
-) {
-  /* eslint-enable no-redeclare */
-  // Extract arguments from object args if provided.
-  return arguments.length === 1
-    ? subscribeImpl(argsOrSchema)
-    : subscribeImpl({
-        schema: argsOrSchema,
-        document,
-        rootValue,
-        contextValue,
-        variableValues,
-        operationName,
-        fieldResolver,
-        subscribeFieldResolver,
-      });
-}
-
-/**
- * This function checks if the error is a GraphQLError. If it is, report it as
- * an ExecutionResult, containing only errors and no data. Otherwise treat the
- * error as a system-class error and re-throw it.
- */
-function reportGraphQLError(error) {
-  if (error instanceof GraphQLError) {
-    return { errors: [error] };
-  }
-  throw error;
-}
-
-function subscribeImpl(
-  args: SubscriptionArgs,
-): Promise<AsyncIterator<ExecutionResult> | ExecutionResult> {
-  const {
-    schema,
-    document,
-    rootValue,
-    contextValue,
-    variableValues,
-    operationName,
-    fieldResolver,
-    subscribeFieldResolver,
-  } = args;
-
-  const sourcePromise = createSourceEventStream(
-    schema,
-    document,
-    rootValue,
-    contextValue,
-    variableValues,
-    operationName,
-    subscribeFieldResolver,
-  );
-
-  // For each payload yielded from a subscription, map it over the normal
-  // GraphQL `execute` function, with `payload` as the rootValue.
-  // This implements the "MapSourceToResponseEvent" algorithm described in
-  // the GraphQL specification. The `execute` function provides the
-  // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the
-  // "ExecuteQuery" algorithm, for which `execute` is also used.
-  const mapSourceToResponse = payload =>
-    execute({
-      schema,
-      document,
-      rootValue: payload,
-      contextValue,
-      variableValues,
-      operationName,
-      fieldResolver,
-    });
-
-  // Resolve the Source Stream, then map every source value to a
-  // ExecutionResult value as described above.
-  return sourcePromise.then(resultOrStream =>
-    // Note: Flow can't refine isAsyncIterable, so explicit casts are used.
-    isAsyncIterable(resultOrStream)
-      ? mapAsyncIterator(
-          ((resultOrStream: any): AsyncIterable<mixed>),
-          mapSourceToResponse,
-          reportGraphQLError,
-        )
-      : ((resultOrStream: any): ExecutionResult),
-  );
-}
-
-/**
- * Implements the "CreateSourceEventStream" algorithm described in the
- * GraphQL specification, resolving the subscription source event stream.
- *
- * Returns a Promise which resolves to either an AsyncIterable (if successful)
- * or an ExecutionResult (error). The promise will be rejected if the schema or
- * other arguments to this function are invalid, or if the resolved event stream
- * is not an async iterable.
- *
- * If the client-provided arguments to this function do not result in a
- * compliant subscription, a GraphQL Response (ExecutionResult) with
- * descriptive errors and no data will be returned.
- *
- * If the the source stream could not be created due to faulty subscription
- * resolver logic or underlying systems, the promise will resolve to a single
- * ExecutionResult containing `errors` and no `data`.
- *
- * If the operation succeeded, the promise resolves to the AsyncIterable for the
- * event stream returned by the resolver.
- *
- * A Source Event Stream represents a sequence of events, each of which triggers
- * a GraphQL execution for that event.
- *
- * This may be useful when hosting the stateful subscription service in a
- * different process or machine than the stateless GraphQL execution engine,
- * or otherwise separating these two steps. For more on this, see the
- * "Supporting Subscriptions at Scale" information in the GraphQL specification.
- */
-export function createSourceEventStream(
-  schema: GraphQLSchema,
-  document: DocumentNode,
-  rootValue?: mixed,
-  contextValue?: mixed,
-  variableValues?: ?{ +[variable: string]: mixed, ... },
-  operationName?: ?string,
-  fieldResolver?: ?GraphQLFieldResolver<any, any>,
-): Promise<AsyncIterable<mixed> | ExecutionResult> {
-  // If arguments are missing or incorrectly typed, this is an internal
-  // developer mistake which should throw an early error.
-  assertValidExecutionArguments(schema, document, variableValues);
-
-  try {
-    // If a valid context cannot be created due to incorrect arguments,
-    // this will throw an error.
-    const exeContext = buildExecutionContext(
-      schema,
-      document,
-      rootValue,
-      contextValue,
-      variableValues,
-      operationName,
-      fieldResolver,
-    );
-
-    // Return early errors if execution context failed.
-    if (Array.isArray(exeContext)) {
-      return Promise.resolve({ errors: exeContext });
-    }
-
-    const type = getOperationRootType(schema, exeContext.operation);
-    const fields = collectFields(
-      exeContext,
-      type,
-      exeContext.operation.selectionSet,
-      Object.create(null),
-      Object.create(null),
-    );
-    const responseNames = Object.keys(fields);
-    const responseName = responseNames[0];
-    const fieldNodes = fields[responseName];
-    const fieldNode = fieldNodes[0];
-    const fieldName = fieldNode.name.value;
-    const fieldDef = getFieldDef(schema, type, fieldName);
-
-    if (!fieldDef) {
-      throw new GraphQLError(
-        `The subscription field "${fieldName}" is not defined.`,
-        fieldNodes,
-      );
-    }
-
-    // Call the `subscribe()` resolver or the default resolver to produce an
-    // AsyncIterable yielding raw payloads.
-    const resolveFn = fieldDef.subscribe ?? exeContext.fieldResolver;
-
-    const path = addPath(undefined, responseName);
-
-    const info = buildResolveInfo(exeContext, fieldDef, fieldNodes, type, path);
-
-    // resolveFieldValueOrError implements the "ResolveFieldEventStream"
-    // algorithm from GraphQL specification. It differs from
-    // "ResolveFieldValue" due to providing a different `resolveFn`.
-    const result = resolveFieldValueOrError(
-      exeContext,
-      fieldDef,
-      fieldNodes,
-      resolveFn,
-      rootValue,
-      info,
-    );
-
-    // Coerce to Promise for easier error handling and consistent return type.
-    return Promise.resolve(result).then(eventStream => {
-      // If eventStream is an Error, rethrow a located error.
-      if (eventStream instanceof Error) {
-        return {
-          errors: [locatedError(eventStream, fieldNodes, pathToArray(path))],
-        };
-      }
-
-      // Assert field returned an event stream, otherwise yield an error.
-      if (isAsyncIterable(eventStream)) {
-        // Note: isAsyncIterable above ensures this will be correct.
-        return ((eventStream: any): AsyncIterable<mixed>);
-      }
-
-      throw new Error(
-        'Subscription field must return Async Iterable. ' +
-          `Received: ${inspect(eventStream)}.`,
-      );
-    });
-  } catch (error) {
-    // As with reportGraphQLError above, if the error is a GraphQLError, report
-    // it as an ExecutionResult; otherwise treat it as a system-class error and
-    // re-throw it.
-    return error instanceof GraphQLError
-      ? Promise.resolve({ errors: [error] })
-      : Promise.reject(error);
-  }
-}
-
-/**
- * Returns true if the provided object implements the AsyncIterator protocol via
- * either implementing a `Symbol.asyncIterator` or `"@@asyncIterator"` method.
- */
-function isAsyncIterable(maybeAsyncIterable: mixed): boolean {
-  if (maybeAsyncIterable == null || typeof maybeAsyncIterable !== 'object') {
-    return false;
-  }
-
-  return typeof maybeAsyncIterable[SYMBOL_ASYNC_ITERATOR] === 'function';
-}
diff --git a/node_modules/graphql/subscription/subscribe.mjs b/node_modules/graphql/subscription/subscribe.mjs
deleted file mode 100644
index c0ff84d..0000000
--- a/node_modules/graphql/subscription/subscribe.mjs
+++ /dev/null
@@ -1,184 +0,0 @@
-function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-import { SYMBOL_ASYNC_ITERATOR } from "../polyfills/symbols.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import { addPath, pathToArray } from "../jsutils/Path.mjs";
-import { GraphQLError } from "../error/GraphQLError.mjs";
-import { locatedError } from "../error/locatedError.mjs";
-import { assertValidExecutionArguments, buildExecutionContext, buildResolveInfo, collectFields, execute, getFieldDef, resolveFieldValueOrError } from "../execution/execute.mjs";
-import { getOperationRootType } from "../utilities/getOperationRootType.mjs";
-import mapAsyncIterator from "./mapAsyncIterator.mjs";
-export function subscribe(argsOrSchema, document, rootValue, contextValue, variableValues, operationName, fieldResolver, subscribeFieldResolver) {
-  /* eslint-enable no-redeclare */
-  // Extract arguments from object args if provided.
-  return arguments.length === 1 ? subscribeImpl(argsOrSchema) : subscribeImpl({
-    schema: argsOrSchema,
-    document: document,
-    rootValue: rootValue,
-    contextValue: contextValue,
-    variableValues: variableValues,
-    operationName: operationName,
-    fieldResolver: fieldResolver,
-    subscribeFieldResolver: subscribeFieldResolver
-  });
-}
-/**
- * This function checks if the error is a GraphQLError. If it is, report it as
- * an ExecutionResult, containing only errors and no data. Otherwise treat the
- * error as a system-class error and re-throw it.
- */
-
-function reportGraphQLError(error) {
-  if (error instanceof GraphQLError) {
-    return {
-      errors: [error]
-    };
-  }
-
-  throw error;
-}
-
-function subscribeImpl(args) {
-  var schema = args.schema,
-      document = args.document,
-      rootValue = args.rootValue,
-      contextValue = args.contextValue,
-      variableValues = args.variableValues,
-      operationName = args.operationName,
-      fieldResolver = args.fieldResolver,
-      subscribeFieldResolver = args.subscribeFieldResolver;
-  var sourcePromise = createSourceEventStream(schema, document, rootValue, contextValue, variableValues, operationName, subscribeFieldResolver); // For each payload yielded from a subscription, map it over the normal
-  // GraphQL `execute` function, with `payload` as the rootValue.
-  // This implements the "MapSourceToResponseEvent" algorithm described in
-  // the GraphQL specification. The `execute` function provides the
-  // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the
-  // "ExecuteQuery" algorithm, for which `execute` is also used.
-
-  var mapSourceToResponse = function mapSourceToResponse(payload) {
-    return execute({
-      schema: schema,
-      document: document,
-      rootValue: payload,
-      contextValue: contextValue,
-      variableValues: variableValues,
-      operationName: operationName,
-      fieldResolver: fieldResolver
-    });
-  }; // Resolve the Source Stream, then map every source value to a
-  // ExecutionResult value as described above.
-
-
-  return sourcePromise.then(function (resultOrStream) {
-    return (// Note: Flow can't refine isAsyncIterable, so explicit casts are used.
-      isAsyncIterable(resultOrStream) ? mapAsyncIterator(resultOrStream, mapSourceToResponse, reportGraphQLError) : resultOrStream
-    );
-  });
-}
-/**
- * Implements the "CreateSourceEventStream" algorithm described in the
- * GraphQL specification, resolving the subscription source event stream.
- *
- * Returns a Promise which resolves to either an AsyncIterable (if successful)
- * or an ExecutionResult (error). The promise will be rejected if the schema or
- * other arguments to this function are invalid, or if the resolved event stream
- * is not an async iterable.
- *
- * If the client-provided arguments to this function do not result in a
- * compliant subscription, a GraphQL Response (ExecutionResult) with
- * descriptive errors and no data will be returned.
- *
- * If the the source stream could not be created due to faulty subscription
- * resolver logic or underlying systems, the promise will resolve to a single
- * ExecutionResult containing `errors` and no `data`.
- *
- * If the operation succeeded, the promise resolves to the AsyncIterable for the
- * event stream returned by the resolver.
- *
- * A Source Event Stream represents a sequence of events, each of which triggers
- * a GraphQL execution for that event.
- *
- * This may be useful when hosting the stateful subscription service in a
- * different process or machine than the stateless GraphQL execution engine,
- * or otherwise separating these two steps. For more on this, see the
- * "Supporting Subscriptions at Scale" information in the GraphQL specification.
- */
-
-
-export function createSourceEventStream(schema, document, rootValue, contextValue, variableValues, operationName, fieldResolver) {
-  // If arguments are missing or incorrectly typed, this is an internal
-  // developer mistake which should throw an early error.
-  assertValidExecutionArguments(schema, document, variableValues);
-
-  try {
-    var _fieldDef$subscribe;
-
-    // If a valid context cannot be created due to incorrect arguments,
-    // this will throw an error.
-    var exeContext = buildExecutionContext(schema, document, rootValue, contextValue, variableValues, operationName, fieldResolver); // Return early errors if execution context failed.
-
-    if (Array.isArray(exeContext)) {
-      return Promise.resolve({
-        errors: exeContext
-      });
-    }
-
-    var type = getOperationRootType(schema, exeContext.operation);
-    var fields = collectFields(exeContext, type, exeContext.operation.selectionSet, Object.create(null), Object.create(null));
-    var responseNames = Object.keys(fields);
-    var responseName = responseNames[0];
-    var fieldNodes = fields[responseName];
-    var fieldNode = fieldNodes[0];
-    var fieldName = fieldNode.name.value;
-    var fieldDef = getFieldDef(schema, type, fieldName);
-
-    if (!fieldDef) {
-      throw new GraphQLError("The subscription field \"".concat(fieldName, "\" is not defined."), fieldNodes);
-    } // Call the `subscribe()` resolver or the default resolver to produce an
-    // AsyncIterable yielding raw payloads.
-
-
-    var resolveFn = (_fieldDef$subscribe = fieldDef.subscribe) !== null && _fieldDef$subscribe !== void 0 ? _fieldDef$subscribe : exeContext.fieldResolver;
-    var path = addPath(undefined, responseName);
-    var info = buildResolveInfo(exeContext, fieldDef, fieldNodes, type, path); // resolveFieldValueOrError implements the "ResolveFieldEventStream"
-    // algorithm from GraphQL specification. It differs from
-    // "ResolveFieldValue" due to providing a different `resolveFn`.
-
-    var result = resolveFieldValueOrError(exeContext, fieldDef, fieldNodes, resolveFn, rootValue, info); // Coerce to Promise for easier error handling and consistent return type.
-
-    return Promise.resolve(result).then(function (eventStream) {
-      // If eventStream is an Error, rethrow a located error.
-      if (eventStream instanceof Error) {
-        return {
-          errors: [locatedError(eventStream, fieldNodes, pathToArray(path))]
-        };
-      } // Assert field returned an event stream, otherwise yield an error.
-
-
-      if (isAsyncIterable(eventStream)) {
-        // Note: isAsyncIterable above ensures this will be correct.
-        return eventStream;
-      }
-
-      throw new Error('Subscription field must return Async Iterable. ' + "Received: ".concat(inspect(eventStream), "."));
-    });
-  } catch (error) {
-    // As with reportGraphQLError above, if the error is a GraphQLError, report
-    // it as an ExecutionResult; otherwise treat it as a system-class error and
-    // re-throw it.
-    return error instanceof GraphQLError ? Promise.resolve({
-      errors: [error]
-    }) : Promise.reject(error);
-  }
-}
-/**
- * Returns true if the provided object implements the AsyncIterator protocol via
- * either implementing a `Symbol.asyncIterator` or `"@@asyncIterator"` method.
- */
-
-function isAsyncIterable(maybeAsyncIterable) {
-  if (maybeAsyncIterable == null || _typeof(maybeAsyncIterable) !== 'object') {
-    return false;
-  }
-
-  return typeof maybeAsyncIterable[SYMBOL_ASYNC_ITERATOR] === 'function';
-}
diff --git a/node_modules/graphql/tsutils/Maybe.d.ts b/node_modules/graphql/tsutils/Maybe.d.ts
deleted file mode 100644
index eb9563a..0000000
--- a/node_modules/graphql/tsutils/Maybe.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-// Conveniently represents flow's "Maybe" type https://flow.org/en/docs/types/maybe/
-type Maybe<T> = null | undefined | T;
-
-// See https://github.com/typescript-eslint/typescript-eslint/issues/131
-// eslint-disable-next-line no-undef
-export default Maybe;
diff --git a/node_modules/graphql/type/definition.d.ts b/node_modules/graphql/type/definition.d.ts
deleted file mode 100644
index 2f07ff9..0000000
--- a/node_modules/graphql/type/definition.d.ts
+++ /dev/null
@@ -1,816 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-import { PromiseOrValue } from '../jsutils/PromiseOrValue';
-import { Path } from '../jsutils/Path';
-
-import {
-  ScalarTypeDefinitionNode,
-  ObjectTypeDefinitionNode,
-  FieldDefinitionNode,
-  InputValueDefinitionNode,
-  InterfaceTypeDefinitionNode,
-  UnionTypeDefinitionNode,
-  EnumTypeDefinitionNode,
-  EnumValueDefinitionNode,
-  InputObjectTypeDefinitionNode,
-  ObjectTypeExtensionNode,
-  InterfaceTypeExtensionNode,
-  OperationDefinitionNode,
-  FieldNode,
-  FragmentDefinitionNode,
-  ValueNode,
-  ScalarTypeExtensionNode,
-  UnionTypeExtensionNode,
-  EnumTypeExtensionNode,
-  InputObjectTypeExtensionNode,
-} from '../language/ast';
-
-import { GraphQLSchema } from './schema';
-
-/**
- * These are all of the possible kinds of types.
- */
-export type GraphQLType =
-  | GraphQLScalarType
-  | GraphQLObjectType
-  | GraphQLInterfaceType
-  | GraphQLUnionType
-  | GraphQLEnumType
-  | GraphQLInputObjectType
-  | GraphQLList<any>
-  | GraphQLNonNull<any>;
-
-export function isType(type: any): type is GraphQLType;
-
-export function assertType(type: any): GraphQLType;
-
-export function isScalarType(type: any): type is GraphQLScalarType;
-
-export function assertScalarType(type: any): GraphQLScalarType;
-
-export function isObjectType(type: any): type is GraphQLObjectType;
-
-export function assertObjectType(type: any): GraphQLObjectType;
-
-export function isInterfaceType(type: any): type is GraphQLInterfaceType;
-
-export function assertInterfaceType(type: any): GraphQLInterfaceType;
-
-export function isUnionType(type: any): type is GraphQLUnionType;
-
-export function assertUnionType(type: any): GraphQLUnionType;
-
-export function isEnumType(type: any): type is GraphQLEnumType;
-
-export function assertEnumType(type: any): GraphQLEnumType;
-
-export function isInputObjectType(type: any): type is GraphQLInputObjectType;
-
-export function assertInputObjectType(type: any): GraphQLInputObjectType;
-
-export function isListType(type: any): type is GraphQLList<any>;
-
-export function assertListType(type: any): GraphQLList<any>;
-
-export function isNonNullType(type: any): type is GraphQLNonNull<any>;
-
-export function assertNonNullType(type: any): GraphQLNonNull<any>;
-
-/**
- * These types may be used as input types for arguments and directives.
- */
-// TS_SPECIFIC: TS does not allow recursive type definitions, hence the `any`s
-export type GraphQLInputType =
-  | GraphQLScalarType
-  | GraphQLEnumType
-  | GraphQLInputObjectType
-  | GraphQLList<any>
-  | GraphQLNonNull<
-      | GraphQLScalarType
-      | GraphQLEnumType
-      | GraphQLInputObjectType
-      | GraphQLList<any>
-    >;
-
-export function isInputType(type: any): type is GraphQLInputType;
-
-export function assertInputType(type: any): GraphQLInputType;
-
-/**
- * These types may be used as output types as the result of fields.
- */
-// TS_SPECIFIC: TS does not allow recursive type definitions, hence the `any`s
-export type GraphQLOutputType =
-  | GraphQLScalarType
-  | GraphQLObjectType
-  | GraphQLInterfaceType
-  | GraphQLUnionType
-  | GraphQLEnumType
-  | GraphQLList<any>
-  | GraphQLNonNull<
-      | GraphQLScalarType
-      | GraphQLObjectType
-      | GraphQLInterfaceType
-      | GraphQLUnionType
-      | GraphQLEnumType
-      | GraphQLList<any>
-    >;
-
-export function isOutputType(type: any): type is GraphQLOutputType;
-
-export function assertOutputType(type: any): GraphQLOutputType;
-
-/**
- * These types may describe types which may be leaf values.
- */
-export type GraphQLLeafType = GraphQLScalarType | GraphQLEnumType;
-
-export function isLeafType(type: any): type is GraphQLLeafType;
-
-export function assertLeafType(type: any): GraphQLLeafType;
-
-/**
- * These types may describe the parent context of a selection set.
- */
-export type GraphQLCompositeType =
-  | GraphQLObjectType
-  | GraphQLInterfaceType
-  | GraphQLUnionType;
-
-export function isCompositeType(type: any): type is GraphQLCompositeType;
-
-export function assertCompositeType(type: any): GraphQLCompositeType;
-
-/**
- * These types may describe the parent context of a selection set.
- */
-export type GraphQLAbstractType = GraphQLInterfaceType | GraphQLUnionType;
-
-export function isAbstractType(type: any): type is GraphQLAbstractType;
-
-export function assertAbstractType(type: any): GraphQLAbstractType;
-
-/**
- * List Modifier
- *
- * A list is a kind of type marker, a wrapping type which points to another
- * type. Lists are often created within the context of defining the fields
- * of an object type.
- *
- * Example:
- *
- *     const PersonType = new GraphQLObjectType({
- *       name: 'Person',
- *       fields: () => ({
- *         parents: { type: new GraphQLList(Person) },
- *         children: { type: new GraphQLList(Person) },
- *       })
- *     })
- *
- */
-interface GraphQLList<T extends GraphQLType> {
-  readonly ofType: T;
-  toString(): string;
-  toJSON(): string;
-  inspect(): string;
-}
-
-interface _GraphQLList<T extends GraphQLType> {
-  (type: T): GraphQLList<T>;
-  new (type: T): GraphQLList<T>;
-}
-
-export const GraphQLList: _GraphQLList<GraphQLType>;
-
-/**
- * Non-Null Modifier
- *
- * A non-null is a kind of type marker, a wrapping type which points to another
- * type. Non-null types enforce that their values are never null and can ensure
- * an error is raised if this ever occurs during a request. It is useful for
- * fields which you can make a strong guarantee on non-nullability, for example
- * usually the id field of a database row will never be null.
- *
- * Example:
- *
- *     const RowType = new GraphQLObjectType({
- *       name: 'Row',
- *       fields: () => ({
- *         id: { type: new GraphQLNonNull(GraphQLString) },
- *       })
- *     })
- *
- * Note: the enforcement of non-nullability occurs within the executor.
- */
-interface GraphQLNonNull<T extends GraphQLNullableType> {
-  readonly ofType: T;
-  toString(): string;
-  toJSON(): string;
-  inspect(): string;
-}
-
-interface _GraphQLNonNull<T extends GraphQLNullableType> {
-  (type: T): GraphQLNonNull<T>;
-  new (type: T): GraphQLNonNull<T>;
-}
-
-export const GraphQLNonNull: _GraphQLNonNull<GraphQLNullableType>;
-
-export type GraphQLWrappingType = GraphQLList<any> | GraphQLNonNull<any>;
-
-export function isWrappingType(type: any): type is GraphQLWrappingType;
-
-export function assertWrappingType(type: any): GraphQLWrappingType;
-
-/**
- * These types can all accept null as a value.
- */
-export type GraphQLNullableType =
-  | GraphQLScalarType
-  | GraphQLObjectType
-  | GraphQLInterfaceType
-  | GraphQLUnionType
-  | GraphQLEnumType
-  | GraphQLInputObjectType
-  | GraphQLList<any>;
-
-export function isNullableType(type: any): type is GraphQLNullableType;
-
-export function assertNullableType(type: any): GraphQLNullableType;
-
-export function getNullableType(type: void): undefined;
-export function getNullableType<T extends GraphQLNullableType>(
-  type: GraphQLNonNull<T> | T,
-): T;
-
-/**
- * These named types do not include modifiers like List or NonNull.
- */
-export type GraphQLNamedType =
-  | GraphQLScalarType
-  | GraphQLObjectType
-  | GraphQLInterfaceType
-  | GraphQLUnionType
-  | GraphQLEnumType
-  | GraphQLInputObjectType;
-
-export function isNamedType(type: any): type is GraphQLNamedType;
-
-export function assertNamedType(type: any): GraphQLNamedType;
-
-export function getNamedType(type: void): undefined;
-export function getNamedType(type: GraphQLType): GraphQLNamedType;
-
-/**
- * Used while defining GraphQL types to allow for circular references in
- * otherwise immutable type definitions.
- */
-export type Thunk<T> = (() => T) | T;
-
-/**
- * Scalar Type Definition
- *
- * The leaf values of any request and input values to arguments are
- * Scalars (or Enums) and are defined with a name and a series of functions
- * used to parse input from ast or variables and to ensure validity.
- *
- * Example:
- *
- *     const OddType = new GraphQLScalarType({
- *       name: 'Odd',
- *       serialize(value) {
- *         return value % 2 === 1 ? value : null;
- *       }
- *     });
- *
- */
-export class GraphQLScalarType {
-  name: string;
-  description: Maybe<string>;
-  serialize: GraphQLScalarSerializer<any>;
-  parseValue: GraphQLScalarValueParser<any>;
-  parseLiteral: GraphQLScalarLiteralParser<any>;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  astNode: Maybe<ScalarTypeDefinitionNode>;
-  extensionASTNodes: Maybe<ReadonlyArray<ScalarTypeExtensionNode>>;
-
-  constructor(config: Readonly<GraphQLScalarTypeConfig<any, any>>);
-
-  toConfig(): GraphQLScalarTypeConfig<any, any> & {
-    serialize: GraphQLScalarSerializer<any>;
-    parseValue: GraphQLScalarValueParser<any>;
-    parseLiteral: GraphQLScalarLiteralParser<any>;
-    extensions: Maybe<Readonly<Record<string, any>>>;
-    extensionASTNodes: ReadonlyArray<ScalarTypeExtensionNode>;
-  };
-
-  toString(): string;
-  toJSON(): string;
-  inspect(): string;
-}
-
-export type GraphQLScalarSerializer<TExternal> = (
-  value: any,
-) => Maybe<TExternal>;
-export type GraphQLScalarValueParser<TInternal> = (
-  value: any,
-) => Maybe<TInternal>;
-export type GraphQLScalarLiteralParser<TInternal> = (
-  valueNode: ValueNode,
-  variables: Maybe<{ [key: string]: any }>,
-) => Maybe<TInternal>;
-
-export interface GraphQLScalarTypeConfig<TInternal, TExternal> {
-  name: string;
-  description?: Maybe<string>;
-  // Serializes an internal value to include in a response.
-  serialize: GraphQLScalarSerializer<TExternal>;
-  // Parses an externally provided value to use as an input.
-  parseValue?: GraphQLScalarValueParser<TInternal>;
-  // Parses an externally provided literal value to use as an input.
-  parseLiteral?: GraphQLScalarLiteralParser<TInternal>;
-  extensions?: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<ScalarTypeDefinitionNode>;
-  extensionASTNodes?: Maybe<ReadonlyArray<ScalarTypeExtensionNode>>;
-}
-
-/**
- * Object Type Definition
- *
- * Almost all of the GraphQL types you define will be object types. Object types
- * have a name, but most importantly describe their fields.
- *
- * Example:
- *
- *     const AddressType = new GraphQLObjectType({
- *       name: 'Address',
- *       fields: {
- *         street: { type: GraphQLString },
- *         number: { type: GraphQLInt },
- *         formatted: {
- *           type: GraphQLString,
- *           resolve(obj) {
- *             return obj.number + ' ' + obj.street
- *           }
- *         }
- *       }
- *     });
- *
- * When two types need to refer to each other, or a type needs to refer to
- * itself in a field, you can use a function expression (aka a closure or a
- * thunk) to supply the fields lazily.
- *
- * Example:
- *
- *     const PersonType = new GraphQLObjectType({
- *       name: 'Person',
- *       fields: () => ({
- *         name: { type: GraphQLString },
- *         bestFriend: { type: PersonType },
- *       })
- *     });
- *
- */
-export class GraphQLObjectType<
-  TSource = any,
-  TContext = any,
-  TArgs = { [key: string]: any }
-> {
-  name: string;
-  description: Maybe<string>;
-  isTypeOf: Maybe<GraphQLIsTypeOfFn<TSource, TContext>>;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  astNode: Maybe<ObjectTypeDefinitionNode>;
-  extensionASTNodes: Maybe<ReadonlyArray<ObjectTypeExtensionNode>>;
-
-  constructor(
-    config: Readonly<GraphQLObjectTypeConfig<TSource, TContext, TArgs>>,
-  );
-
-  getFields(): GraphQLFieldMap<any, TContext, TArgs>;
-  getInterfaces(): Array<GraphQLInterfaceType>;
-
-  toConfig(): GraphQLObjectTypeConfig<any, any> & {
-    interfaces: Array<GraphQLInterfaceType>;
-    fields: GraphQLFieldConfigMap<any, any>;
-    extensions: Maybe<Readonly<Record<string, any>>>;
-    extensionASTNodes: ReadonlyArray<ObjectTypeExtensionNode>;
-  };
-
-  toString(): string;
-  toJSON(): string;
-  inspect(): string;
-}
-
-export function argsToArgsConfig(
-  args: ReadonlyArray<GraphQLArgument>,
-): GraphQLFieldConfigArgumentMap;
-
-// TS_SPECIFIC: TArgs
-export interface GraphQLObjectTypeConfig<
-  TSource,
-  TContext,
-  TArgs = { [key: string]: any }
-> {
-  name: string;
-  description?: Maybe<string>;
-  interfaces?: Thunk<Maybe<Array<GraphQLInterfaceType>>>;
-  fields: Thunk<GraphQLFieldConfigMap<TSource, TContext, TArgs>>;
-  isTypeOf?: Maybe<GraphQLIsTypeOfFn<TSource, TContext>>;
-  extensions?: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<ObjectTypeDefinitionNode>;
-  extensionASTNodes?: Maybe<ReadonlyArray<ObjectTypeExtensionNode>>;
-}
-
-// TS_SPECIFIC: TArgs
-export type GraphQLTypeResolver<
-  TSource,
-  TContext,
-  TArgs = { [key: string]: any }
-> = (
-  value: TSource,
-  context: TContext,
-  info: GraphQLResolveInfo,
-  abstractType: GraphQLAbstractType,
-) => PromiseOrValue<
-  Maybe<GraphQLObjectType<TSource, TContext, TArgs> | string>
->;
-
-export type GraphQLIsTypeOfFn<TSource, TContext> = (
-  source: TSource,
-  context: TContext,
-  info: GraphQLResolveInfo,
-) => PromiseOrValue<boolean>;
-
-export type GraphQLFieldResolver<
-  TSource,
-  TContext,
-  TArgs = { [argName: string]: any }
-> = (
-  source: TSource,
-  args: TArgs,
-  context: TContext,
-  info: GraphQLResolveInfo,
-) => any;
-
-export interface GraphQLResolveInfo {
-  readonly fieldName: string;
-  readonly fieldNodes: ReadonlyArray<FieldNode>;
-  readonly returnType: GraphQLOutputType;
-  readonly parentType: GraphQLObjectType;
-  readonly path: Path;
-  readonly schema: GraphQLSchema;
-  readonly fragments: { [key: string]: FragmentDefinitionNode };
-  readonly rootValue: any;
-  readonly operation: OperationDefinitionNode;
-  readonly variableValues: { [variableName: string]: any };
-}
-
-export interface GraphQLFieldConfig<
-  TSource,
-  TContext,
-  TArgs = { [argName: string]: any }
-> {
-  description?: Maybe<string>;
-  type: GraphQLOutputType;
-  args?: GraphQLFieldConfigArgumentMap;
-  resolve?: GraphQLFieldResolver<TSource, TContext, TArgs>;
-  subscribe?: GraphQLFieldResolver<TSource, TContext, TArgs>;
-  deprecationReason?: Maybe<string>;
-  extensions?: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<FieldDefinitionNode>;
-}
-
-export type GraphQLFieldConfigArgumentMap = {
-  [key: string]: GraphQLArgumentConfig;
-};
-
-export interface GraphQLArgumentConfig {
-  description?: Maybe<string>;
-  type: GraphQLInputType;
-  defaultValue?: any;
-  extensions?: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<InputValueDefinitionNode>;
-}
-
-// TS_SPECIFIC: TArgs
-export type GraphQLFieldConfigMap<
-  TSource,
-  TContext,
-  TArgs = { [key: string]: any }
-> = {
-  [key: string]: GraphQLFieldConfig<TSource, TContext, TArgs>;
-};
-
-export interface GraphQLField<
-  TSource,
-  TContext,
-  TArgs = { [key: string]: any }
-> {
-  name: string;
-  description: Maybe<string>;
-  type: GraphQLOutputType;
-  args: Array<GraphQLArgument>;
-  resolve?: GraphQLFieldResolver<TSource, TContext, TArgs>;
-  subscribe?: GraphQLFieldResolver<TSource, TContext, TArgs>;
-  isDeprecated?: boolean;
-  deprecationReason?: Maybe<string>;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<FieldDefinitionNode>;
-}
-
-export interface GraphQLArgument {
-  name: string;
-  description: Maybe<string>;
-  type: GraphQLInputType;
-  defaultValue: any;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  astNode: Maybe<InputValueDefinitionNode>;
-}
-
-export function isRequiredArgument(arg: GraphQLArgument): boolean;
-
-// TS_SPECIFIC: TArgs
-export type GraphQLFieldMap<
-  TSource,
-  TContext,
-  TArgs = { [key: string]: any }
-> = {
-  [key: string]: GraphQLField<TSource, TContext, TArgs>;
-};
-
-/**
- * Interface Type Definition
- *
- * When a field can return one of a heterogeneous set of types, a Interface type
- * is used to describe what types are possible, what fields are in common across
- * all types, as well as a function to determine which type is actually used
- * when the field is resolved.
- *
- * Example:
- *
- *     const EntityType = new GraphQLInterfaceType({
- *       name: 'Entity',
- *       fields: {
- *         name: { type: GraphQLString }
- *       }
- *     });
- *
- */
-export class GraphQLInterfaceType {
-  name: string;
-  description: Maybe<string>;
-  resolveType: Maybe<GraphQLTypeResolver<any, any>>;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<InterfaceTypeDefinitionNode>;
-  extensionASTNodes: Maybe<ReadonlyArray<InterfaceTypeExtensionNode>>;
-
-  constructor(config: Readonly<GraphQLInterfaceTypeConfig<any, any>>);
-  getFields(): GraphQLFieldMap<any, any>;
-  getInterfaces(): Array<GraphQLInterfaceType>;
-
-  toConfig(): GraphQLInterfaceTypeConfig<any, any> & {
-    interfaces: Array<GraphQLInterfaceType>;
-    fields: GraphQLFieldConfigMap<any, any>;
-    extensions: Maybe<Readonly<Record<string, any>>>;
-    extensionASTNodes: ReadonlyArray<InterfaceTypeExtensionNode>;
-  };
-
-  toString(): string;
-  toJSON(): string;
-  inspect(): string;
-}
-
-// TS_SPECIFIC: TArgs
-export interface GraphQLInterfaceTypeConfig<
-  TSource,
-  TContext,
-  TArgs = { [key: string]: any }
-> {
-  name: string;
-  description?: Maybe<string>;
-  interfaces?: Thunk<Maybe<Array<GraphQLInterfaceType>>>;
-  fields: Thunk<GraphQLFieldConfigMap<TSource, TContext, TArgs>>;
-  /**
-   * Optionally provide a custom type resolver function. If one is not provided,
-   * the default implementation will call `isTypeOf` on each implementing
-   * Object type.
-   */
-  resolveType?: Maybe<GraphQLTypeResolver<TSource, TContext, TArgs>>;
-  extensions?: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<InterfaceTypeDefinitionNode>;
-  extensionASTNodes?: Maybe<ReadonlyArray<InterfaceTypeExtensionNode>>;
-}
-
-/**
- * Union Type Definition
- *
- * When a field can return one of a heterogeneous set of types, a Union type
- * is used to describe what types are possible as well as providing a function
- * to determine which type is actually used when the field is resolved.
- *
- * Example:
- *
- *     const PetType = new GraphQLUnionType({
- *       name: 'Pet',
- *       types: [ DogType, CatType ],
- *       resolveType(value) {
- *         if (value instanceof Dog) {
- *           return DogType;
- *         }
- *         if (value instanceof Cat) {
- *           return CatType;
- *         }
- *       }
- *     });
- *
- */
-export class GraphQLUnionType {
-  name: string;
-  description: Maybe<string>;
-  resolveType: Maybe<GraphQLTypeResolver<any, any>>;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  astNode: Maybe<UnionTypeDefinitionNode>;
-  extensionASTNodes: Maybe<ReadonlyArray<UnionTypeExtensionNode>>;
-
-  constructor(config: Readonly<GraphQLUnionTypeConfig<any, any>>);
-  getTypes(): Array<GraphQLObjectType>;
-
-  toConfig(): GraphQLUnionTypeConfig<any, any> & {
-    types: Array<GraphQLObjectType>;
-    extensions: Maybe<Readonly<Record<string, any>>>;
-    extensionASTNodes: ReadonlyArray<UnionTypeExtensionNode>;
-  };
-
-  toString(): string;
-  toJSON(): string;
-  inspect(): string;
-}
-
-export interface GraphQLUnionTypeConfig<TSource, TContext> {
-  name: string;
-  description?: Maybe<string>;
-  types: Thunk<Array<GraphQLObjectType>>;
-  /**
-   * Optionally provide a custom type resolver function. If one is not provided,
-   * the default implementation will call `isTypeOf` on each implementing
-   * Object type.
-   */
-  resolveType?: Maybe<GraphQLTypeResolver<TSource, TContext>>;
-  extensions?: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<UnionTypeDefinitionNode>;
-  extensionASTNodes?: Maybe<ReadonlyArray<UnionTypeExtensionNode>>;
-}
-
-/**
- * Enum Type Definition
- *
- * Some leaf values of requests and input values are Enums. GraphQL serializes
- * Enum values as strings, however internally Enums can be represented by any
- * kind of type, often integers.
- *
- * Example:
- *
- *     const RGBType = new GraphQLEnumType({
- *       name: 'RGB',
- *       values: {
- *         RED: { value: 0 },
- *         GREEN: { value: 1 },
- *         BLUE: { value: 2 }
- *       }
- *     });
- *
- * Note: If a value is not provided in a definition, the name of the enum value
- * will be used as its internal value.
- */
-export class GraphQLEnumType {
-  name: string;
-  description: Maybe<string>;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  astNode: Maybe<EnumTypeDefinitionNode>;
-  extensionASTNodes: Maybe<ReadonlyArray<EnumTypeExtensionNode>>;
-
-  constructor(config: Readonly<GraphQLEnumTypeConfig>);
-  getValues(): Array<GraphQLEnumValue>;
-  getValue(name: string): Maybe<GraphQLEnumValue>;
-  serialize(value: any): Maybe<string>;
-  parseValue(value: any): Maybe<any>;
-  parseLiteral(
-    valueNode: ValueNode,
-    _variables: Maybe<{ [key: string]: any }>,
-  ): Maybe<any>;
-
-  toConfig(): GraphQLEnumTypeConfig & {
-    extensions: Maybe<Readonly<Record<string, any>>>;
-    extensionASTNodes: ReadonlyArray<EnumTypeExtensionNode>;
-  };
-
-  toString(): string;
-  toJSON(): string;
-  inspect(): string;
-}
-
-export interface GraphQLEnumTypeConfig {
-  name: string;
-  description?: Maybe<string>;
-  values: GraphQLEnumValueConfigMap;
-  extensions?: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<EnumTypeDefinitionNode>;
-  extensionASTNodes?: Maybe<ReadonlyArray<EnumTypeExtensionNode>>;
-}
-
-export type GraphQLEnumValueConfigMap = {
-  [key: string]: GraphQLEnumValueConfig;
-};
-
-export interface GraphQLEnumValueConfig {
-  description?: Maybe<string>;
-  value?: any;
-  deprecationReason?: Maybe<string>;
-  extensions?: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<EnumValueDefinitionNode>;
-}
-
-export interface GraphQLEnumValue {
-  name: string;
-  description: Maybe<string>;
-  value: any;
-  isDeprecated?: boolean;
-  deprecationReason: Maybe<string>;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<EnumValueDefinitionNode>;
-}
-
-/**
- * Input Object Type Definition
- *
- * An input object defines a structured collection of fields which may be
- * supplied to a field argument.
- *
- * Using `NonNull` will ensure that a value must be provided by the query
- *
- * Example:
- *
- *     const GeoPoint = new GraphQLInputObjectType({
- *       name: 'GeoPoint',
- *       fields: {
- *         lat: { type: new GraphQLNonNull(GraphQLFloat) },
- *         lon: { type: new GraphQLNonNull(GraphQLFloat) },
- *         alt: { type: GraphQLFloat, defaultValue: 0 },
- *       }
- *     });
- *
- */
-export class GraphQLInputObjectType {
-  name: string;
-  description: Maybe<string>;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  astNode: Maybe<InputObjectTypeDefinitionNode>;
-  extensionASTNodes: Maybe<ReadonlyArray<InputObjectTypeExtensionNode>>;
-
-  constructor(config: Readonly<GraphQLInputObjectTypeConfig>);
-  getFields(): GraphQLInputFieldMap;
-
-  toConfig(): GraphQLInputObjectTypeConfig & {
-    fields: GraphQLInputFieldConfigMap;
-    extensions: Maybe<Readonly<Record<string, any>>>;
-    extensionASTNodes: ReadonlyArray<InputObjectTypeExtensionNode>;
-  };
-
-  toString(): string;
-  toJSON(): string;
-  inspect(): string;
-}
-
-export interface GraphQLInputObjectTypeConfig {
-  name: string;
-  description?: Maybe<string>;
-  fields: Thunk<GraphQLInputFieldConfigMap>;
-  extensions?: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<InputObjectTypeDefinitionNode>;
-  extensionASTNodes?: Maybe<ReadonlyArray<InputObjectTypeExtensionNode>>;
-}
-
-export interface GraphQLInputFieldConfig {
-  description?: Maybe<string>;
-  type: GraphQLInputType;
-  defaultValue?: any;
-  extensions?: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<InputValueDefinitionNode>;
-}
-
-export type GraphQLInputFieldConfigMap = {
-  [key: string]: GraphQLInputFieldConfig;
-};
-
-export interface GraphQLInputField {
-  name: string;
-  description?: Maybe<string>;
-  type: GraphQLInputType;
-  defaultValue?: any;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<InputValueDefinitionNode>;
-}
-
-export function isRequiredInputField(field: GraphQLInputField): boolean;
-
-export type GraphQLInputFieldMap = { [key: string]: GraphQLInputField };
diff --git a/node_modules/graphql/type/definition.js b/node_modules/graphql/type/definition.js
deleted file mode 100644
index a125853..0000000
--- a/node_modules/graphql/type/definition.js
+++ /dev/null
@@ -1,1189 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.isType = isType;
-exports.assertType = assertType;
-exports.isScalarType = isScalarType;
-exports.assertScalarType = assertScalarType;
-exports.isObjectType = isObjectType;
-exports.assertObjectType = assertObjectType;
-exports.isInterfaceType = isInterfaceType;
-exports.assertInterfaceType = assertInterfaceType;
-exports.isUnionType = isUnionType;
-exports.assertUnionType = assertUnionType;
-exports.isEnumType = isEnumType;
-exports.assertEnumType = assertEnumType;
-exports.isInputObjectType = isInputObjectType;
-exports.assertInputObjectType = assertInputObjectType;
-exports.isListType = isListType;
-exports.assertListType = assertListType;
-exports.isNonNullType = isNonNullType;
-exports.assertNonNullType = assertNonNullType;
-exports.isInputType = isInputType;
-exports.assertInputType = assertInputType;
-exports.isOutputType = isOutputType;
-exports.assertOutputType = assertOutputType;
-exports.isLeafType = isLeafType;
-exports.assertLeafType = assertLeafType;
-exports.isCompositeType = isCompositeType;
-exports.assertCompositeType = assertCompositeType;
-exports.isAbstractType = isAbstractType;
-exports.assertAbstractType = assertAbstractType;
-exports.GraphQLList = GraphQLList;
-exports.GraphQLNonNull = GraphQLNonNull;
-exports.isWrappingType = isWrappingType;
-exports.assertWrappingType = assertWrappingType;
-exports.isNullableType = isNullableType;
-exports.assertNullableType = assertNullableType;
-exports.getNullableType = getNullableType;
-exports.isNamedType = isNamedType;
-exports.assertNamedType = assertNamedType;
-exports.getNamedType = getNamedType;
-exports.argsToArgsConfig = argsToArgsConfig;
-exports.isRequiredArgument = isRequiredArgument;
-exports.isRequiredInputField = isRequiredInputField;
-exports.GraphQLInputObjectType = exports.GraphQLEnumType = exports.GraphQLUnionType = exports.GraphQLInterfaceType = exports.GraphQLObjectType = exports.GraphQLScalarType = void 0;
-
-var _objectEntries = _interopRequireDefault(require("../polyfills/objectEntries"));
-
-var _symbols = require("../polyfills/symbols");
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _keyMap = _interopRequireDefault(require("../jsutils/keyMap"));
-
-var _mapValue = _interopRequireDefault(require("../jsutils/mapValue"));
-
-var _toObjMap = _interopRequireDefault(require("../jsutils/toObjMap"));
-
-var _devAssert = _interopRequireDefault(require("../jsutils/devAssert"));
-
-var _keyValMap = _interopRequireDefault(require("../jsutils/keyValMap"));
-
-var _instanceOf = _interopRequireDefault(require("../jsutils/instanceOf"));
-
-var _didYouMean = _interopRequireDefault(require("../jsutils/didYouMean"));
-
-var _isObjectLike = _interopRequireDefault(require("../jsutils/isObjectLike"));
-
-var _identityFunc = _interopRequireDefault(require("../jsutils/identityFunc"));
-
-var _defineToJSON = _interopRequireDefault(require("../jsutils/defineToJSON"));
-
-var _suggestionList = _interopRequireDefault(require("../jsutils/suggestionList"));
-
-var _kinds = require("../language/kinds");
-
-var _printer = require("../language/printer");
-
-var _GraphQLError = require("../error/GraphQLError");
-
-var _valueFromASTUntyped = require("../utilities/valueFromASTUntyped");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-function isType(type) {
-  return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isInputObjectType(type) || isListType(type) || isNonNullType(type);
-}
-
-function assertType(type) {
-  if (!isType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL type."));
-  }
-
-  return type;
-}
-/**
- * There are predicates for each kind of GraphQL type.
- */
-
-
-// eslint-disable-next-line no-redeclare
-function isScalarType(type) {
-  return (0, _instanceOf.default)(type, GraphQLScalarType);
-}
-
-function assertScalarType(type) {
-  if (!isScalarType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL Scalar type."));
-  }
-
-  return type;
-}
-
-// eslint-disable-next-line no-redeclare
-function isObjectType(type) {
-  return (0, _instanceOf.default)(type, GraphQLObjectType);
-}
-
-function assertObjectType(type) {
-  if (!isObjectType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL Object type."));
-  }
-
-  return type;
-}
-
-// eslint-disable-next-line no-redeclare
-function isInterfaceType(type) {
-  return (0, _instanceOf.default)(type, GraphQLInterfaceType);
-}
-
-function assertInterfaceType(type) {
-  if (!isInterfaceType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL Interface type."));
-  }
-
-  return type;
-}
-
-// eslint-disable-next-line no-redeclare
-function isUnionType(type) {
-  return (0, _instanceOf.default)(type, GraphQLUnionType);
-}
-
-function assertUnionType(type) {
-  if (!isUnionType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL Union type."));
-  }
-
-  return type;
-}
-
-// eslint-disable-next-line no-redeclare
-function isEnumType(type) {
-  return (0, _instanceOf.default)(type, GraphQLEnumType);
-}
-
-function assertEnumType(type) {
-  if (!isEnumType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL Enum type."));
-  }
-
-  return type;
-}
-
-// eslint-disable-next-line no-redeclare
-function isInputObjectType(type) {
-  return (0, _instanceOf.default)(type, GraphQLInputObjectType);
-}
-
-function assertInputObjectType(type) {
-  if (!isInputObjectType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL Input Object type."));
-  }
-
-  return type;
-}
-
-// eslint-disable-next-line no-redeclare
-function isListType(type) {
-  return (0, _instanceOf.default)(type, GraphQLList);
-}
-
-function assertListType(type) {
-  if (!isListType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL List type."));
-  }
-
-  return type;
-}
-
-// eslint-disable-next-line no-redeclare
-function isNonNullType(type) {
-  return (0, _instanceOf.default)(type, GraphQLNonNull);
-}
-
-function assertNonNullType(type) {
-  if (!isNonNullType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL Non-Null type."));
-  }
-
-  return type;
-}
-/**
- * These types may be used as input types for arguments and directives.
- */
-
-
-function isInputType(type) {
-  return isScalarType(type) || isEnumType(type) || isInputObjectType(type) || isWrappingType(type) && isInputType(type.ofType);
-}
-
-function assertInputType(type) {
-  if (!isInputType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL input type."));
-  }
-
-  return type;
-}
-/**
- * These types may be used as output types as the result of fields.
- */
-
-
-function isOutputType(type) {
-  return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isWrappingType(type) && isOutputType(type.ofType);
-}
-
-function assertOutputType(type) {
-  if (!isOutputType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL output type."));
-  }
-
-  return type;
-}
-/**
- * These types may describe types which may be leaf values.
- */
-
-
-function isLeafType(type) {
-  return isScalarType(type) || isEnumType(type);
-}
-
-function assertLeafType(type) {
-  if (!isLeafType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL leaf type."));
-  }
-
-  return type;
-}
-/**
- * These types may describe the parent context of a selection set.
- */
-
-
-function isCompositeType(type) {
-  return isObjectType(type) || isInterfaceType(type) || isUnionType(type);
-}
-
-function assertCompositeType(type) {
-  if (!isCompositeType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL composite type."));
-  }
-
-  return type;
-}
-/**
- * These types may describe the parent context of a selection set.
- */
-
-
-function isAbstractType(type) {
-  return isInterfaceType(type) || isUnionType(type);
-}
-
-function assertAbstractType(type) {
-  if (!isAbstractType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL abstract type."));
-  }
-
-  return type;
-}
-/**
- * List Type Wrapper
- *
- * A list is a wrapping type which points to another type.
- * Lists are often created within the context of defining the fields of
- * an object type.
- *
- * Example:
- *
- *     const PersonType = new GraphQLObjectType({
- *       name: 'Person',
- *       fields: () => ({
- *         parents: { type: GraphQLList(PersonType) },
- *         children: { type: GraphQLList(PersonType) },
- *       })
- *     })
- *
- */
-// FIXME: workaround to fix issue with Babel parser
-
-/* ::
-declare class GraphQLList<+T: GraphQLType> {
-  +ofType: T;
-  static <T>(ofType: T): GraphQLList<T>;
-  // Note: constructors cannot be used for covariant types. Drop the "new".
-  constructor(ofType: GraphQLType): void;
-}
-*/
-
-
-function GraphQLList(ofType) {
-  if (this instanceof GraphQLList) {
-    this.ofType = assertType(ofType);
-  } else {
-    return new GraphQLList(ofType);
-  }
-} // Need to cast through any to alter the prototype.
-
-
-GraphQLList.prototype.toString = function toString() {
-  return '[' + String(this.ofType) + ']';
-};
-
-Object.defineProperty(GraphQLList.prototype, _symbols.SYMBOL_TO_STRING_TAG, {
-  get: function get() {
-    return 'GraphQLList';
-  }
-});
-(0, _defineToJSON.default)(GraphQLList);
-/**
- * Non-Null Type Wrapper
- *
- * A non-null is a wrapping type which points to another type.
- * Non-null types enforce that their values are never null and can ensure
- * an error is raised if this ever occurs during a request. It is useful for
- * fields which you can make a strong guarantee on non-nullability, for example
- * usually the id field of a database row will never be null.
- *
- * Example:
- *
- *     const RowType = new GraphQLObjectType({
- *       name: 'Row',
- *       fields: () => ({
- *         id: { type: GraphQLNonNull(GraphQLString) },
- *       })
- *     })
- *
- * Note: the enforcement of non-nullability occurs within the executor.
- */
-// FIXME: workaround to fix issue with Babel parser
-
-/* ::
-declare class GraphQLNonNull<+T: GraphQLNullableType> {
-  +ofType: T;
-  static <T>(ofType: T): GraphQLNonNull<T>;
-  // Note: constructors cannot be used for covariant types. Drop the "new".
-  constructor(ofType: GraphQLType): void;
-}
-*/
-
-function GraphQLNonNull(ofType) {
-  if (this instanceof GraphQLNonNull) {
-    this.ofType = assertNullableType(ofType);
-  } else {
-    return new GraphQLNonNull(ofType);
-  }
-} // Need to cast through any to alter the prototype.
-
-
-GraphQLNonNull.prototype.toString = function toString() {
-  return String(this.ofType) + '!';
-};
-
-Object.defineProperty(GraphQLNonNull.prototype, _symbols.SYMBOL_TO_STRING_TAG, {
-  get: function get() {
-    return 'GraphQLNonNull';
-  }
-});
-(0, _defineToJSON.default)(GraphQLNonNull);
-/**
- * These types wrap and modify other types
- */
-
-function isWrappingType(type) {
-  return isListType(type) || isNonNullType(type);
-}
-
-function assertWrappingType(type) {
-  if (!isWrappingType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL wrapping type."));
-  }
-
-  return type;
-}
-/**
- * These types can all accept null as a value.
- */
-
-
-function isNullableType(type) {
-  return isType(type) && !isNonNullType(type);
-}
-
-function assertNullableType(type) {
-  if (!isNullableType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL nullable type."));
-  }
-
-  return type;
-}
-/* eslint-disable no-redeclare */
-
-
-function getNullableType(type) {
-  /* eslint-enable no-redeclare */
-  if (type) {
-    return isNonNullType(type) ? type.ofType : type;
-  }
-}
-/**
- * These named types do not include modifiers like List or NonNull.
- */
-
-
-function isNamedType(type) {
-  return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isInputObjectType(type);
-}
-
-function assertNamedType(type) {
-  if (!isNamedType(type)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(type), " to be a GraphQL named type."));
-  }
-
-  return type;
-}
-/* eslint-disable no-redeclare */
-
-
-function getNamedType(type) {
-  /* eslint-enable no-redeclare */
-  if (type) {
-    var unwrappedType = type;
-
-    while (isWrappingType(unwrappedType)) {
-      unwrappedType = unwrappedType.ofType;
-    }
-
-    return unwrappedType;
-  }
-}
-/**
- * Used while defining GraphQL types to allow for circular references in
- * otherwise immutable type definitions.
- */
-
-
-function resolveThunk(thunk) {
-  // $FlowFixMe(>=0.90.0)
-  return typeof thunk === 'function' ? thunk() : thunk;
-}
-
-function undefineIfEmpty(arr) {
-  return arr && arr.length > 0 ? arr : undefined;
-}
-/**
- * Scalar Type Definition
- *
- * The leaf values of any request and input values to arguments are
- * Scalars (or Enums) and are defined with a name and a series of functions
- * used to parse input from ast or variables and to ensure validity.
- *
- * If a type's serialize function does not return a value (i.e. it returns
- * `undefined`) then an error will be raised and a `null` value will be returned
- * in the response. If the serialize function returns `null`, then no error will
- * be included in the response.
- *
- * Example:
- *
- *     const OddType = new GraphQLScalarType({
- *       name: 'Odd',
- *       serialize(value) {
- *         if (value % 2 === 1) {
- *           return value;
- *         }
- *       }
- *     });
- *
- */
-
-
-var GraphQLScalarType =
-/*#__PURE__*/
-function () {
-  function GraphQLScalarType(config) {
-    var _config$parseValue, _config$serialize, _config$parseLiteral;
-
-    var parseValue = (_config$parseValue = config.parseValue) !== null && _config$parseValue !== void 0 ? _config$parseValue : _identityFunc.default;
-    this.name = config.name;
-    this.description = config.description;
-    this.serialize = (_config$serialize = config.serialize) !== null && _config$serialize !== void 0 ? _config$serialize : _identityFunc.default;
-    this.parseValue = parseValue;
-    this.parseLiteral = (_config$parseLiteral = config.parseLiteral) !== null && _config$parseLiteral !== void 0 ? _config$parseLiteral : function (node) {
-      return parseValue((0, _valueFromASTUntyped.valueFromASTUntyped)(node));
-    };
-    this.extensions = config.extensions && (0, _toObjMap.default)(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-    typeof config.name === 'string' || (0, _devAssert.default)(0, 'Must provide name.');
-    config.serialize == null || typeof config.serialize === 'function' || (0, _devAssert.default)(0, "".concat(this.name, " must provide \"serialize\" function. If this custom Scalar is also used as an input type, ensure \"parseValue\" and \"parseLiteral\" functions are also provided."));
-
-    if (config.parseLiteral) {
-      typeof config.parseValue === 'function' && typeof config.parseLiteral === 'function' || (0, _devAssert.default)(0, "".concat(this.name, " must provide both \"parseValue\" and \"parseLiteral\" functions."));
-    }
-  }
-
-  var _proto = GraphQLScalarType.prototype;
-
-  _proto.toConfig = function toConfig() {
-    var _this$extensionASTNod;
-
-    return {
-      name: this.name,
-      description: this.description,
-      serialize: this.serialize,
-      parseValue: this.parseValue,
-      parseLiteral: this.parseLiteral,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: (_this$extensionASTNod = this.extensionASTNodes) !== null && _this$extensionASTNod !== void 0 ? _this$extensionASTNod : []
-    };
-  };
-
-  _proto.toString = function toString() {
-    return this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLScalarType, [{
-    key: _symbols.SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLScalarType';
-    }
-  }]);
-
-  return GraphQLScalarType;
-}();
-
-exports.GraphQLScalarType = GraphQLScalarType;
-(0, _defineToJSON.default)(GraphQLScalarType);
-
-/**
- * Object Type Definition
- *
- * Almost all of the GraphQL types you define will be object types. Object types
- * have a name, but most importantly describe their fields.
- *
- * Example:
- *
- *     const AddressType = new GraphQLObjectType({
- *       name: 'Address',
- *       fields: {
- *         street: { type: GraphQLString },
- *         number: { type: GraphQLInt },
- *         formatted: {
- *           type: GraphQLString,
- *           resolve(obj) {
- *             return obj.number + ' ' + obj.street
- *           }
- *         }
- *       }
- *     });
- *
- * When two types need to refer to each other, or a type needs to refer to
- * itself in a field, you can use a function expression (aka a closure or a
- * thunk) to supply the fields lazily.
- *
- * Example:
- *
- *     const PersonType = new GraphQLObjectType({
- *       name: 'Person',
- *       fields: () => ({
- *         name: { type: GraphQLString },
- *         bestFriend: { type: PersonType },
- *       })
- *     });
- *
- */
-var GraphQLObjectType =
-/*#__PURE__*/
-function () {
-  function GraphQLObjectType(config) {
-    this.name = config.name;
-    this.description = config.description;
-    this.isTypeOf = config.isTypeOf;
-    this.extensions = config.extensions && (0, _toObjMap.default)(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-    this._fields = defineFieldMap.bind(undefined, config);
-    this._interfaces = defineInterfaces.bind(undefined, config);
-    typeof config.name === 'string' || (0, _devAssert.default)(0, 'Must provide name.');
-    config.isTypeOf == null || typeof config.isTypeOf === 'function' || (0, _devAssert.default)(0, "".concat(this.name, " must provide \"isTypeOf\" as a function, ") + "but got: ".concat((0, _inspect.default)(config.isTypeOf), "."));
-  }
-
-  var _proto2 = GraphQLObjectType.prototype;
-
-  _proto2.getFields = function getFields() {
-    if (typeof this._fields === 'function') {
-      this._fields = this._fields();
-    }
-
-    return this._fields;
-  };
-
-  _proto2.getInterfaces = function getInterfaces() {
-    if (typeof this._interfaces === 'function') {
-      this._interfaces = this._interfaces();
-    }
-
-    return this._interfaces;
-  };
-
-  _proto2.toConfig = function toConfig() {
-    return {
-      name: this.name,
-      description: this.description,
-      interfaces: this.getInterfaces(),
-      fields: fieldsToFieldsConfig(this.getFields()),
-      isTypeOf: this.isTypeOf,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: this.extensionASTNodes || []
-    };
-  };
-
-  _proto2.toString = function toString() {
-    return this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLObjectType, [{
-    key: _symbols.SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLObjectType';
-    }
-  }]);
-
-  return GraphQLObjectType;
-}();
-
-exports.GraphQLObjectType = GraphQLObjectType;
-(0, _defineToJSON.default)(GraphQLObjectType);
-
-function defineInterfaces(config) {
-  var _resolveThunk;
-
-  var interfaces = (_resolveThunk = resolveThunk(config.interfaces)) !== null && _resolveThunk !== void 0 ? _resolveThunk : [];
-  Array.isArray(interfaces) || (0, _devAssert.default)(0, "".concat(config.name, " interfaces must be an Array or a function which returns an Array."));
-  return interfaces;
-}
-
-function defineFieldMap(config) {
-  var fieldMap = resolveThunk(config.fields);
-  isPlainObj(fieldMap) || (0, _devAssert.default)(0, "".concat(config.name, " fields must be an object with field names as keys or a function which returns such an object."));
-  return (0, _mapValue.default)(fieldMap, function (fieldConfig, fieldName) {
-    var _fieldConfig$args;
-
-    isPlainObj(fieldConfig) || (0, _devAssert.default)(0, "".concat(config.name, ".").concat(fieldName, " field config must be an object."));
-    !('isDeprecated' in fieldConfig) || (0, _devAssert.default)(0, "".concat(config.name, ".").concat(fieldName, " should provide \"deprecationReason\" instead of \"isDeprecated\"."));
-    fieldConfig.resolve == null || typeof fieldConfig.resolve === 'function' || (0, _devAssert.default)(0, "".concat(config.name, ".").concat(fieldName, " field resolver must be a function if ") + "provided, but got: ".concat((0, _inspect.default)(fieldConfig.resolve), "."));
-    var argsConfig = (_fieldConfig$args = fieldConfig.args) !== null && _fieldConfig$args !== void 0 ? _fieldConfig$args : {};
-    isPlainObj(argsConfig) || (0, _devAssert.default)(0, "".concat(config.name, ".").concat(fieldName, " args must be an object with argument names as keys."));
-    var args = (0, _objectEntries.default)(argsConfig).map(function (_ref) {
-      var argName = _ref[0],
-          argConfig = _ref[1];
-      return {
-        name: argName,
-        description: argConfig.description,
-        type: argConfig.type,
-        defaultValue: argConfig.defaultValue,
-        extensions: argConfig.extensions && (0, _toObjMap.default)(argConfig.extensions),
-        astNode: argConfig.astNode
-      };
-    });
-    return {
-      name: fieldName,
-      description: fieldConfig.description,
-      type: fieldConfig.type,
-      args: args,
-      resolve: fieldConfig.resolve,
-      subscribe: fieldConfig.subscribe,
-      isDeprecated: fieldConfig.deprecationReason != null,
-      deprecationReason: fieldConfig.deprecationReason,
-      extensions: fieldConfig.extensions && (0, _toObjMap.default)(fieldConfig.extensions),
-      astNode: fieldConfig.astNode
-    };
-  });
-}
-
-function isPlainObj(obj) {
-  return (0, _isObjectLike.default)(obj) && !Array.isArray(obj);
-}
-
-function fieldsToFieldsConfig(fields) {
-  return (0, _mapValue.default)(fields, function (field) {
-    return {
-      description: field.description,
-      type: field.type,
-      args: argsToArgsConfig(field.args),
-      resolve: field.resolve,
-      subscribe: field.subscribe,
-      deprecationReason: field.deprecationReason,
-      extensions: field.extensions,
-      astNode: field.astNode
-    };
-  });
-}
-/**
- * @internal
- */
-
-
-function argsToArgsConfig(args) {
-  return (0, _keyValMap.default)(args, function (arg) {
-    return arg.name;
-  }, function (arg) {
-    return {
-      description: arg.description,
-      type: arg.type,
-      defaultValue: arg.defaultValue,
-      extensions: arg.extensions,
-      astNode: arg.astNode
-    };
-  });
-}
-
-function isRequiredArgument(arg) {
-  return isNonNullType(arg.type) && arg.defaultValue === undefined;
-}
-
-/**
- * Interface Type Definition
- *
- * When a field can return one of a heterogeneous set of types, a Interface type
- * is used to describe what types are possible, what fields are in common across
- * all types, as well as a function to determine which type is actually used
- * when the field is resolved.
- *
- * Example:
- *
- *     const EntityType = new GraphQLInterfaceType({
- *       name: 'Entity',
- *       fields: {
- *         name: { type: GraphQLString }
- *       }
- *     });
- *
- */
-var GraphQLInterfaceType =
-/*#__PURE__*/
-function () {
-  function GraphQLInterfaceType(config) {
-    this.name = config.name;
-    this.description = config.description;
-    this.resolveType = config.resolveType;
-    this.extensions = config.extensions && (0, _toObjMap.default)(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-    this._fields = defineFieldMap.bind(undefined, config);
-    this._interfaces = defineInterfaces.bind(undefined, config);
-    typeof config.name === 'string' || (0, _devAssert.default)(0, 'Must provide name.');
-    config.resolveType == null || typeof config.resolveType === 'function' || (0, _devAssert.default)(0, "".concat(this.name, " must provide \"resolveType\" as a function, ") + "but got: ".concat((0, _inspect.default)(config.resolveType), "."));
-  }
-
-  var _proto3 = GraphQLInterfaceType.prototype;
-
-  _proto3.getFields = function getFields() {
-    if (typeof this._fields === 'function') {
-      this._fields = this._fields();
-    }
-
-    return this._fields;
-  };
-
-  _proto3.getInterfaces = function getInterfaces() {
-    if (typeof this._interfaces === 'function') {
-      this._interfaces = this._interfaces();
-    }
-
-    return this._interfaces;
-  };
-
-  _proto3.toConfig = function toConfig() {
-    var _this$extensionASTNod2;
-
-    return {
-      name: this.name,
-      description: this.description,
-      interfaces: this.getInterfaces(),
-      fields: fieldsToFieldsConfig(this.getFields()),
-      resolveType: this.resolveType,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: (_this$extensionASTNod2 = this.extensionASTNodes) !== null && _this$extensionASTNod2 !== void 0 ? _this$extensionASTNod2 : []
-    };
-  };
-
-  _proto3.toString = function toString() {
-    return this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLInterfaceType, [{
-    key: _symbols.SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLInterfaceType';
-    }
-  }]);
-
-  return GraphQLInterfaceType;
-}();
-
-exports.GraphQLInterfaceType = GraphQLInterfaceType;
-(0, _defineToJSON.default)(GraphQLInterfaceType);
-
-/**
- * Union Type Definition
- *
- * When a field can return one of a heterogeneous set of types, a Union type
- * is used to describe what types are possible as well as providing a function
- * to determine which type is actually used when the field is resolved.
- *
- * Example:
- *
- *     const PetType = new GraphQLUnionType({
- *       name: 'Pet',
- *       types: [ DogType, CatType ],
- *       resolveType(value) {
- *         if (value instanceof Dog) {
- *           return DogType;
- *         }
- *         if (value instanceof Cat) {
- *           return CatType;
- *         }
- *       }
- *     });
- *
- */
-var GraphQLUnionType =
-/*#__PURE__*/
-function () {
-  function GraphQLUnionType(config) {
-    this.name = config.name;
-    this.description = config.description;
-    this.resolveType = config.resolveType;
-    this.extensions = config.extensions && (0, _toObjMap.default)(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-    this._types = defineTypes.bind(undefined, config);
-    typeof config.name === 'string' || (0, _devAssert.default)(0, 'Must provide name.');
-    config.resolveType == null || typeof config.resolveType === 'function' || (0, _devAssert.default)(0, "".concat(this.name, " must provide \"resolveType\" as a function, ") + "but got: ".concat((0, _inspect.default)(config.resolveType), "."));
-  }
-
-  var _proto4 = GraphQLUnionType.prototype;
-
-  _proto4.getTypes = function getTypes() {
-    if (typeof this._types === 'function') {
-      this._types = this._types();
-    }
-
-    return this._types;
-  };
-
-  _proto4.toConfig = function toConfig() {
-    var _this$extensionASTNod3;
-
-    return {
-      name: this.name,
-      description: this.description,
-      types: this.getTypes(),
-      resolveType: this.resolveType,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: (_this$extensionASTNod3 = this.extensionASTNodes) !== null && _this$extensionASTNod3 !== void 0 ? _this$extensionASTNod3 : []
-    };
-  };
-
-  _proto4.toString = function toString() {
-    return this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLUnionType, [{
-    key: _symbols.SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLUnionType';
-    }
-  }]);
-
-  return GraphQLUnionType;
-}();
-
-exports.GraphQLUnionType = GraphQLUnionType;
-(0, _defineToJSON.default)(GraphQLUnionType);
-
-function defineTypes(config) {
-  var types = resolveThunk(config.types);
-  Array.isArray(types) || (0, _devAssert.default)(0, "Must provide Array of types or a function which returns such an array for Union ".concat(config.name, "."));
-  return types;
-}
-
-/**
- * Enum Type Definition
- *
- * Some leaf values of requests and input values are Enums. GraphQL serializes
- * Enum values as strings, however internally Enums can be represented by any
- * kind of type, often integers.
- *
- * Example:
- *
- *     const RGBType = new GraphQLEnumType({
- *       name: 'RGB',
- *       values: {
- *         RED: { value: 0 },
- *         GREEN: { value: 1 },
- *         BLUE: { value: 2 }
- *       }
- *     });
- *
- * Note: If a value is not provided in a definition, the name of the enum value
- * will be used as its internal value.
- */
-var GraphQLEnumType
-/* <T> */
-=
-/*#__PURE__*/
-function () {
-  function GraphQLEnumType(config) {
-    this.name = config.name;
-    this.description = config.description;
-    this.extensions = config.extensions && (0, _toObjMap.default)(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-    this._values = defineEnumValues(this.name, config.values);
-    this._valueLookup = new Map(this._values.map(function (enumValue) {
-      return [enumValue.value, enumValue];
-    }));
-    this._nameLookup = (0, _keyMap.default)(this._values, function (value) {
-      return value.name;
-    });
-    typeof config.name === 'string' || (0, _devAssert.default)(0, 'Must provide name.');
-  }
-
-  var _proto5 = GraphQLEnumType.prototype;
-
-  _proto5.getValues = function getValues() {
-    return this._values;
-  };
-
-  _proto5.getValue = function getValue(name) {
-    return this._nameLookup[name];
-  };
-
-  _proto5.serialize = function serialize(outputValue) {
-    var enumValue = this._valueLookup.get(outputValue);
-
-    if (enumValue === undefined) {
-      throw new _GraphQLError.GraphQLError("Enum \"".concat(this.name, "\" cannot represent value: ").concat((0, _inspect.default)(outputValue)));
-    }
-
-    return enumValue.name;
-  };
-
-  _proto5.parseValue = function parseValue(inputValue)
-  /* T */
-  {
-    if (typeof inputValue !== 'string') {
-      var valueStr = (0, _inspect.default)(inputValue);
-      throw new _GraphQLError.GraphQLError("Enum \"".concat(this.name, "\" cannot represent non-string value: ").concat(valueStr, ".") + didYouMeanEnumValue(this, valueStr));
-    }
-
-    var enumValue = this.getValue(inputValue);
-
-    if (enumValue == null) {
-      throw new _GraphQLError.GraphQLError("Value \"".concat(inputValue, "\" does not exist in \"").concat(this.name, "\" enum.") + didYouMeanEnumValue(this, inputValue));
-    }
-
-    return enumValue.value;
-  };
-
-  _proto5.parseLiteral = function parseLiteral(valueNode, _variables)
-  /* T */
-  {
-    // Note: variables will be resolved to a value before calling this function.
-    if (valueNode.kind !== _kinds.Kind.ENUM) {
-      var valueStr = (0, _printer.print)(valueNode);
-      throw new _GraphQLError.GraphQLError("Enum \"".concat(this.name, "\" cannot represent non-enum value: ").concat(valueStr, ".") + didYouMeanEnumValue(this, valueStr), valueNode);
-    }
-
-    var enumValue = this.getValue(valueNode.value);
-
-    if (enumValue == null) {
-      var _valueStr = (0, _printer.print)(valueNode);
-
-      throw new _GraphQLError.GraphQLError("Value \"".concat(_valueStr, "\" does not exist in \"").concat(this.name, "\" enum.") + didYouMeanEnumValue(this, _valueStr), valueNode);
-    }
-
-    return enumValue.value;
-  };
-
-  _proto5.toConfig = function toConfig() {
-    var _this$extensionASTNod4;
-
-    var values = (0, _keyValMap.default)(this.getValues(), function (value) {
-      return value.name;
-    }, function (value) {
-      return {
-        description: value.description,
-        value: value.value,
-        deprecationReason: value.deprecationReason,
-        extensions: value.extensions,
-        astNode: value.astNode
-      };
-    });
-    return {
-      name: this.name,
-      description: this.description,
-      values: values,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: (_this$extensionASTNod4 = this.extensionASTNodes) !== null && _this$extensionASTNod4 !== void 0 ? _this$extensionASTNod4 : []
-    };
-  };
-
-  _proto5.toString = function toString() {
-    return this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLEnumType, [{
-    key: _symbols.SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLEnumType';
-    }
-  }]);
-
-  return GraphQLEnumType;
-}();
-
-exports.GraphQLEnumType = GraphQLEnumType;
-(0, _defineToJSON.default)(GraphQLEnumType);
-
-function didYouMeanEnumValue(enumType, unknownValueStr) {
-  var allNames = enumType.getValues().map(function (value) {
-    return value.name;
-  });
-  var suggestedValues = (0, _suggestionList.default)(unknownValueStr, allNames);
-  return (0, _didYouMean.default)('the enum value', suggestedValues);
-}
-
-function defineEnumValues(typeName, valueMap) {
-  isPlainObj(valueMap) || (0, _devAssert.default)(0, "".concat(typeName, " values must be an object with value names as keys."));
-  return (0, _objectEntries.default)(valueMap).map(function (_ref2) {
-    var valueName = _ref2[0],
-        valueConfig = _ref2[1];
-    isPlainObj(valueConfig) || (0, _devAssert.default)(0, "".concat(typeName, ".").concat(valueName, " must refer to an object with a \"value\" key ") + "representing an internal value but got: ".concat((0, _inspect.default)(valueConfig), "."));
-    !('isDeprecated' in valueConfig) || (0, _devAssert.default)(0, "".concat(typeName, ".").concat(valueName, " should provide \"deprecationReason\" instead of \"isDeprecated\"."));
-    return {
-      name: valueName,
-      description: valueConfig.description,
-      value: valueConfig.value !== undefined ? valueConfig.value : valueName,
-      isDeprecated: valueConfig.deprecationReason != null,
-      deprecationReason: valueConfig.deprecationReason,
-      extensions: valueConfig.extensions && (0, _toObjMap.default)(valueConfig.extensions),
-      astNode: valueConfig.astNode
-    };
-  });
-}
-
-/**
- * Input Object Type Definition
- *
- * An input object defines a structured collection of fields which may be
- * supplied to a field argument.
- *
- * Using `NonNull` will ensure that a value must be provided by the query
- *
- * Example:
- *
- *     const GeoPoint = new GraphQLInputObjectType({
- *       name: 'GeoPoint',
- *       fields: {
- *         lat: { type: GraphQLNonNull(GraphQLFloat) },
- *         lon: { type: GraphQLNonNull(GraphQLFloat) },
- *         alt: { type: GraphQLFloat, defaultValue: 0 },
- *       }
- *     });
- *
- */
-var GraphQLInputObjectType =
-/*#__PURE__*/
-function () {
-  function GraphQLInputObjectType(config) {
-    this.name = config.name;
-    this.description = config.description;
-    this.extensions = config.extensions && (0, _toObjMap.default)(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-    this._fields = defineInputFieldMap.bind(undefined, config);
-    typeof config.name === 'string' || (0, _devAssert.default)(0, 'Must provide name.');
-  }
-
-  var _proto6 = GraphQLInputObjectType.prototype;
-
-  _proto6.getFields = function getFields() {
-    if (typeof this._fields === 'function') {
-      this._fields = this._fields();
-    }
-
-    return this._fields;
-  };
-
-  _proto6.toConfig = function toConfig() {
-    var _this$extensionASTNod5;
-
-    var fields = (0, _mapValue.default)(this.getFields(), function (field) {
-      return {
-        description: field.description,
-        type: field.type,
-        defaultValue: field.defaultValue,
-        extensions: field.extensions,
-        astNode: field.astNode
-      };
-    });
-    return {
-      name: this.name,
-      description: this.description,
-      fields: fields,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: (_this$extensionASTNod5 = this.extensionASTNodes) !== null && _this$extensionASTNod5 !== void 0 ? _this$extensionASTNod5 : []
-    };
-  };
-
-  _proto6.toString = function toString() {
-    return this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLInputObjectType, [{
-    key: _symbols.SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLInputObjectType';
-    }
-  }]);
-
-  return GraphQLInputObjectType;
-}();
-
-exports.GraphQLInputObjectType = GraphQLInputObjectType;
-(0, _defineToJSON.default)(GraphQLInputObjectType);
-
-function defineInputFieldMap(config) {
-  var fieldMap = resolveThunk(config.fields);
-  isPlainObj(fieldMap) || (0, _devAssert.default)(0, "".concat(config.name, " fields must be an object with field names as keys or a function which returns such an object."));
-  return (0, _mapValue.default)(fieldMap, function (fieldConfig, fieldName) {
-    !('resolve' in fieldConfig) || (0, _devAssert.default)(0, "".concat(config.name, ".").concat(fieldName, " field has a resolve property, but Input Types cannot define resolvers."));
-    return {
-      name: fieldName,
-      description: fieldConfig.description,
-      type: fieldConfig.type,
-      defaultValue: fieldConfig.defaultValue,
-      extensions: fieldConfig.extensions && (0, _toObjMap.default)(fieldConfig.extensions),
-      astNode: fieldConfig.astNode
-    };
-  });
-}
-
-function isRequiredInputField(field) {
-  return isNonNullType(field.type) && field.defaultValue === undefined;
-}
diff --git a/node_modules/graphql/type/definition.js.flow b/node_modules/graphql/type/definition.js.flow
deleted file mode 100644
index 739732c..0000000
--- a/node_modules/graphql/type/definition.js.flow
+++ /dev/null
@@ -1,1570 +0,0 @@
-// @flow strict
-
-// FIXME
-/* eslint-disable import/no-cycle */
-
-import objectEntries from '../polyfills/objectEntries';
-import { SYMBOL_TO_STRING_TAG } from '../polyfills/symbols';
-
-import inspect from '../jsutils/inspect';
-import keyMap from '../jsutils/keyMap';
-import mapValue from '../jsutils/mapValue';
-import toObjMap from '../jsutils/toObjMap';
-import { type Path } from '../jsutils/Path';
-import devAssert from '../jsutils/devAssert';
-import keyValMap from '../jsutils/keyValMap';
-import instanceOf from '../jsutils/instanceOf';
-import didYouMean from '../jsutils/didYouMean';
-import isObjectLike from '../jsutils/isObjectLike';
-import identityFunc from '../jsutils/identityFunc';
-import defineToJSON from '../jsutils/defineToJSON';
-import suggestionList from '../jsutils/suggestionList';
-import { type PromiseOrValue } from '../jsutils/PromiseOrValue';
-import {
-  type ObjMap,
-  type ReadOnlyObjMap,
-  type ReadOnlyObjMapLike,
-} from '../jsutils/ObjMap';
-
-import { Kind } from '../language/kinds';
-import { print } from '../language/printer';
-import {
-  type ScalarTypeDefinitionNode,
-  type ObjectTypeDefinitionNode,
-  type FieldDefinitionNode,
-  type InputValueDefinitionNode,
-  type InterfaceTypeDefinitionNode,
-  type UnionTypeDefinitionNode,
-  type EnumTypeDefinitionNode,
-  type EnumValueDefinitionNode,
-  type InputObjectTypeDefinitionNode,
-  type ScalarTypeExtensionNode,
-  type ObjectTypeExtensionNode,
-  type InterfaceTypeExtensionNode,
-  type UnionTypeExtensionNode,
-  type EnumTypeExtensionNode,
-  type InputObjectTypeExtensionNode,
-  type OperationDefinitionNode,
-  type FieldNode,
-  type FragmentDefinitionNode,
-  type ValueNode,
-} from '../language/ast';
-
-import { GraphQLError } from '../error/GraphQLError';
-
-import { valueFromASTUntyped } from '../utilities/valueFromASTUntyped';
-
-import { type GraphQLSchema } from './schema';
-
-// Predicates & Assertions
-
-/**
- * These are all of the possible kinds of types.
- */
-export type GraphQLType =
-  | GraphQLScalarType
-  | GraphQLObjectType
-  | GraphQLInterfaceType
-  | GraphQLUnionType
-  | GraphQLEnumType
-  | GraphQLInputObjectType
-  | GraphQLList<any>
-  | GraphQLNonNull<any>;
-
-export function isType(type: mixed): boolean %checks {
-  return (
-    isScalarType(type) ||
-    isObjectType(type) ||
-    isInterfaceType(type) ||
-    isUnionType(type) ||
-    isEnumType(type) ||
-    isInputObjectType(type) ||
-    isListType(type) ||
-    isNonNullType(type)
-  );
-}
-
-export function assertType(type: mixed): GraphQLType {
-  if (!isType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL type.`);
-  }
-  return type;
-}
-
-/**
- * There are predicates for each kind of GraphQL type.
- */
-
-declare function isScalarType(type: mixed): boolean %checks(type instanceof
-  GraphQLScalarType);
-// eslint-disable-next-line no-redeclare
-export function isScalarType(type) {
-  return instanceOf(type, GraphQLScalarType);
-}
-
-export function assertScalarType(type: mixed): GraphQLScalarType {
-  if (!isScalarType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL Scalar type.`);
-  }
-  return type;
-}
-
-declare function isObjectType(type: mixed): boolean %checks(type instanceof
-  GraphQLObjectType);
-// eslint-disable-next-line no-redeclare
-export function isObjectType(type) {
-  return instanceOf(type, GraphQLObjectType);
-}
-
-export function assertObjectType(type: mixed): GraphQLObjectType {
-  if (!isObjectType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL Object type.`);
-  }
-  return type;
-}
-
-declare function isInterfaceType(type: mixed): boolean %checks(type instanceof
-  GraphQLInterfaceType);
-// eslint-disable-next-line no-redeclare
-export function isInterfaceType(type) {
-  return instanceOf(type, GraphQLInterfaceType);
-}
-
-export function assertInterfaceType(type: mixed): GraphQLInterfaceType {
-  if (!isInterfaceType(type)) {
-    throw new Error(
-      `Expected ${inspect(type)} to be a GraphQL Interface type.`,
-    );
-  }
-  return type;
-}
-
-declare function isUnionType(type: mixed): boolean %checks(type instanceof
-  GraphQLUnionType);
-// eslint-disable-next-line no-redeclare
-export function isUnionType(type) {
-  return instanceOf(type, GraphQLUnionType);
-}
-
-export function assertUnionType(type: mixed): GraphQLUnionType {
-  if (!isUnionType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL Union type.`);
-  }
-  return type;
-}
-
-declare function isEnumType(type: mixed): boolean %checks(type instanceof
-  GraphQLEnumType);
-// eslint-disable-next-line no-redeclare
-export function isEnumType(type) {
-  return instanceOf(type, GraphQLEnumType);
-}
-
-export function assertEnumType(type: mixed): GraphQLEnumType {
-  if (!isEnumType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL Enum type.`);
-  }
-  return type;
-}
-
-declare function isInputObjectType(type: mixed): boolean %checks(type instanceof
-  GraphQLInputObjectType);
-// eslint-disable-next-line no-redeclare
-export function isInputObjectType(type) {
-  return instanceOf(type, GraphQLInputObjectType);
-}
-
-export function assertInputObjectType(type: mixed): GraphQLInputObjectType {
-  if (!isInputObjectType(type)) {
-    throw new Error(
-      `Expected ${inspect(type)} to be a GraphQL Input Object type.`,
-    );
-  }
-  return type;
-}
-
-declare function isListType(type: mixed): boolean %checks(type instanceof
-  GraphQLList);
-// eslint-disable-next-line no-redeclare
-export function isListType(type) {
-  return instanceOf(type, GraphQLList);
-}
-
-export function assertListType(type: mixed): GraphQLList<any> {
-  if (!isListType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL List type.`);
-  }
-  return type;
-}
-
-declare function isNonNullType(type: mixed): boolean %checks(type instanceof
-  GraphQLNonNull);
-// eslint-disable-next-line no-redeclare
-export function isNonNullType(type) {
-  return instanceOf(type, GraphQLNonNull);
-}
-
-export function assertNonNullType(type: mixed): GraphQLNonNull<any> {
-  if (!isNonNullType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL Non-Null type.`);
-  }
-  return type;
-}
-
-/**
- * These types may be used as input types for arguments and directives.
- */
-export type GraphQLInputType =
-  | GraphQLScalarType
-  | GraphQLEnumType
-  | GraphQLInputObjectType
-  | GraphQLList<GraphQLInputType>
-  | GraphQLNonNull<
-      | GraphQLScalarType
-      | GraphQLEnumType
-      | GraphQLInputObjectType
-      | GraphQLList<GraphQLInputType>,
-    >;
-
-export function isInputType(type: mixed): boolean %checks {
-  return (
-    isScalarType(type) ||
-    isEnumType(type) ||
-    isInputObjectType(type) ||
-    (isWrappingType(type) && isInputType(type.ofType))
-  );
-}
-
-export function assertInputType(type: mixed): GraphQLInputType {
-  if (!isInputType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL input type.`);
-  }
-  return type;
-}
-
-/**
- * These types may be used as output types as the result of fields.
- */
-export type GraphQLOutputType =
-  | GraphQLScalarType
-  | GraphQLObjectType
-  | GraphQLInterfaceType
-  | GraphQLUnionType
-  | GraphQLEnumType
-  | GraphQLList<GraphQLOutputType>
-  | GraphQLNonNull<
-      | GraphQLScalarType
-      | GraphQLObjectType
-      | GraphQLInterfaceType
-      | GraphQLUnionType
-      | GraphQLEnumType
-      | GraphQLList<GraphQLOutputType>,
-    >;
-
-export function isOutputType(type: mixed): boolean %checks {
-  return (
-    isScalarType(type) ||
-    isObjectType(type) ||
-    isInterfaceType(type) ||
-    isUnionType(type) ||
-    isEnumType(type) ||
-    (isWrappingType(type) && isOutputType(type.ofType))
-  );
-}
-
-export function assertOutputType(type: mixed): GraphQLOutputType {
-  if (!isOutputType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL output type.`);
-  }
-  return type;
-}
-
-/**
- * These types may describe types which may be leaf values.
- */
-export type GraphQLLeafType = GraphQLScalarType | GraphQLEnumType;
-
-export function isLeafType(type: mixed): boolean %checks {
-  return isScalarType(type) || isEnumType(type);
-}
-
-export function assertLeafType(type: mixed): GraphQLLeafType {
-  if (!isLeafType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL leaf type.`);
-  }
-  return type;
-}
-
-/**
- * These types may describe the parent context of a selection set.
- */
-export type GraphQLCompositeType =
-  | GraphQLObjectType
-  | GraphQLInterfaceType
-  | GraphQLUnionType;
-
-export function isCompositeType(type: mixed): boolean %checks {
-  return isObjectType(type) || isInterfaceType(type) || isUnionType(type);
-}
-
-export function assertCompositeType(type: mixed): GraphQLCompositeType {
-  if (!isCompositeType(type)) {
-    throw new Error(
-      `Expected ${inspect(type)} to be a GraphQL composite type.`,
-    );
-  }
-  return type;
-}
-
-/**
- * These types may describe the parent context of a selection set.
- */
-export type GraphQLAbstractType = GraphQLInterfaceType | GraphQLUnionType;
-
-export function isAbstractType(type: mixed): boolean %checks {
-  return isInterfaceType(type) || isUnionType(type);
-}
-
-export function assertAbstractType(type: mixed): GraphQLAbstractType {
-  if (!isAbstractType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL abstract type.`);
-  }
-  return type;
-}
-
-/**
- * List Type Wrapper
- *
- * A list is a wrapping type which points to another type.
- * Lists are often created within the context of defining the fields of
- * an object type.
- *
- * Example:
- *
- *     const PersonType = new GraphQLObjectType({
- *       name: 'Person',
- *       fields: () => ({
- *         parents: { type: GraphQLList(PersonType) },
- *         children: { type: GraphQLList(PersonType) },
- *       })
- *     })
- *
- */
-// FIXME: workaround to fix issue with Babel parser
-/* ::
-declare class GraphQLList<+T: GraphQLType> {
-  +ofType: T;
-  static <T>(ofType: T): GraphQLList<T>;
-  // Note: constructors cannot be used for covariant types. Drop the "new".
-  constructor(ofType: GraphQLType): void;
-}
-*/
-
-export function GraphQLList(ofType) {
-  if (this instanceof GraphQLList) {
-    this.ofType = assertType(ofType);
-  } else {
-    return new GraphQLList(ofType);
-  }
-}
-
-// Need to cast through any to alter the prototype.
-(GraphQLList.prototype: any).toString = function toString() {
-  return '[' + String(this.ofType) + ']';
-};
-
-Object.defineProperty(GraphQLList.prototype, SYMBOL_TO_STRING_TAG, {
-  get() {
-    return 'GraphQLList';
-  },
-});
-
-defineToJSON(GraphQLList);
-
-/**
- * Non-Null Type Wrapper
- *
- * A non-null is a wrapping type which points to another type.
- * Non-null types enforce that their values are never null and can ensure
- * an error is raised if this ever occurs during a request. It is useful for
- * fields which you can make a strong guarantee on non-nullability, for example
- * usually the id field of a database row will never be null.
- *
- * Example:
- *
- *     const RowType = new GraphQLObjectType({
- *       name: 'Row',
- *       fields: () => ({
- *         id: { type: GraphQLNonNull(GraphQLString) },
- *       })
- *     })
- *
- * Note: the enforcement of non-nullability occurs within the executor.
- */
-// FIXME: workaround to fix issue with Babel parser
-/* ::
-declare class GraphQLNonNull<+T: GraphQLNullableType> {
-  +ofType: T;
-  static <T>(ofType: T): GraphQLNonNull<T>;
-  // Note: constructors cannot be used for covariant types. Drop the "new".
-  constructor(ofType: GraphQLType): void;
-}
-*/
-
-export function GraphQLNonNull(ofType) {
-  if (this instanceof GraphQLNonNull) {
-    this.ofType = assertNullableType(ofType);
-  } else {
-    return new GraphQLNonNull(ofType);
-  }
-}
-
-// Need to cast through any to alter the prototype.
-(GraphQLNonNull.prototype: any).toString = function toString() {
-  return String(this.ofType) + '!';
-};
-
-Object.defineProperty(GraphQLNonNull.prototype, SYMBOL_TO_STRING_TAG, {
-  get() {
-    return 'GraphQLNonNull';
-  },
-});
-
-defineToJSON(GraphQLNonNull);
-
-/**
- * These types wrap and modify other types
- */
-
-export type GraphQLWrappingType = GraphQLList<any> | GraphQLNonNull<any>;
-
-export function isWrappingType(type: mixed): boolean %checks {
-  return isListType(type) || isNonNullType(type);
-}
-
-export function assertWrappingType(type: mixed): GraphQLWrappingType {
-  if (!isWrappingType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL wrapping type.`);
-  }
-  return type;
-}
-
-/**
- * These types can all accept null as a value.
- */
-export type GraphQLNullableType =
-  | GraphQLScalarType
-  | GraphQLObjectType
-  | GraphQLInterfaceType
-  | GraphQLUnionType
-  | GraphQLEnumType
-  | GraphQLInputObjectType
-  | GraphQLList<any>;
-
-export function isNullableType(type: mixed): boolean %checks {
-  return isType(type) && !isNonNullType(type);
-}
-
-export function assertNullableType(type: mixed): GraphQLNullableType {
-  if (!isNullableType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL nullable type.`);
-  }
-  return type;
-}
-
-/* eslint-disable no-redeclare */
-declare function getNullableType(type: void | null): void;
-declare function getNullableType<T>(type: GraphQLNonNull<T> | T): T;
-export function getNullableType(type) {
-  /* eslint-enable no-redeclare */
-  if (type) {
-    return isNonNullType(type) ? type.ofType : type;
-  }
-}
-
-/**
- * These named types do not include modifiers like List or NonNull.
- */
-export type GraphQLNamedType =
-  | GraphQLScalarType
-  | GraphQLObjectType
-  | GraphQLInterfaceType
-  | GraphQLUnionType
-  | GraphQLEnumType
-  | GraphQLInputObjectType;
-
-export function isNamedType(type: mixed): boolean %checks {
-  return (
-    isScalarType(type) ||
-    isObjectType(type) ||
-    isInterfaceType(type) ||
-    isUnionType(type) ||
-    isEnumType(type) ||
-    isInputObjectType(type)
-  );
-}
-
-export function assertNamedType(type: mixed): GraphQLNamedType {
-  if (!isNamedType(type)) {
-    throw new Error(`Expected ${inspect(type)} to be a GraphQL named type.`);
-  }
-  return type;
-}
-
-/* eslint-disable no-redeclare */
-declare function getNamedType(type: void | null): void;
-declare function getNamedType(type: GraphQLType): GraphQLNamedType;
-export function getNamedType(type) {
-  /* eslint-enable no-redeclare */
-  if (type) {
-    let unwrappedType = type;
-    while (isWrappingType(unwrappedType)) {
-      unwrappedType = unwrappedType.ofType;
-    }
-    return unwrappedType;
-  }
-}
-
-/**
- * Used while defining GraphQL types to allow for circular references in
- * otherwise immutable type definitions.
- */
-export type Thunk<+T> = (() => T) | T;
-
-function resolveThunk<+T>(thunk: Thunk<T>): T {
-  // $FlowFixMe(>=0.90.0)
-  return typeof thunk === 'function' ? thunk() : thunk;
-}
-
-function undefineIfEmpty<T>(arr: ?$ReadOnlyArray<T>): ?$ReadOnlyArray<T> {
-  return arr && arr.length > 0 ? arr : undefined;
-}
-
-/**
- * Scalar Type Definition
- *
- * The leaf values of any request and input values to arguments are
- * Scalars (or Enums) and are defined with a name and a series of functions
- * used to parse input from ast or variables and to ensure validity.
- *
- * If a type's serialize function does not return a value (i.e. it returns
- * `undefined`) then an error will be raised and a `null` value will be returned
- * in the response. If the serialize function returns `null`, then no error will
- * be included in the response.
- *
- * Example:
- *
- *     const OddType = new GraphQLScalarType({
- *       name: 'Odd',
- *       serialize(value) {
- *         if (value % 2 === 1) {
- *           return value;
- *         }
- *       }
- *     });
- *
- */
-export class GraphQLScalarType {
-  name: string;
-  description: ?string;
-  serialize: GraphQLScalarSerializer<mixed>;
-  parseValue: GraphQLScalarValueParser<mixed>;
-  parseLiteral: GraphQLScalarLiteralParser<mixed>;
-  extensions: ?ReadOnlyObjMap<mixed>;
-  astNode: ?ScalarTypeDefinitionNode;
-  extensionASTNodes: ?$ReadOnlyArray<ScalarTypeExtensionNode>;
-
-  constructor(config: $ReadOnly<GraphQLScalarTypeConfig<mixed, mixed>>): void {
-    const parseValue = config.parseValue ?? identityFunc;
-    this.name = config.name;
-    this.description = config.description;
-    this.serialize = config.serialize ?? identityFunc;
-    this.parseValue = parseValue;
-    this.parseLiteral =
-      config.parseLiteral ?? (node => parseValue(valueFromASTUntyped(node)));
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-
-    devAssert(typeof config.name === 'string', 'Must provide name.');
-    devAssert(
-      config.serialize == null || typeof config.serialize === 'function',
-      `${this.name} must provide "serialize" function. If this custom Scalar is also used as an input type, ensure "parseValue" and "parseLiteral" functions are also provided.`,
-    );
-
-    if (config.parseLiteral) {
-      devAssert(
-        typeof config.parseValue === 'function' &&
-          typeof config.parseLiteral === 'function',
-        `${this.name} must provide both "parseValue" and "parseLiteral" functions.`,
-      );
-    }
-  }
-
-  toConfig(): {|
-    ...GraphQLScalarTypeConfig<mixed, mixed>,
-    serialize: GraphQLScalarSerializer<mixed>,
-    parseValue: GraphQLScalarValueParser<mixed>,
-    parseLiteral: GraphQLScalarLiteralParser<mixed>,
-    extensions: ?ReadOnlyObjMap<mixed>,
-    extensionASTNodes: $ReadOnlyArray<ScalarTypeExtensionNode>,
-  |} {
-    return {
-      name: this.name,
-      description: this.description,
-      serialize: this.serialize,
-      parseValue: this.parseValue,
-      parseLiteral: this.parseLiteral,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: this.extensionASTNodes ?? [],
-    };
-  }
-
-  toString(): string {
-    return this.name;
-  }
-
-  // $FlowFixMe Flow doesn't support computed properties yet
-  get [SYMBOL_TO_STRING_TAG]() {
-    return 'GraphQLScalarType';
-  }
-}
-
-defineToJSON(GraphQLScalarType);
-
-export type GraphQLScalarSerializer<TExternal> = (
-  outputValue: mixed,
-) => ?TExternal;
-
-export type GraphQLScalarValueParser<TInternal> = (
-  inputValue: mixed,
-) => ?TInternal;
-
-export type GraphQLScalarLiteralParser<TInternal> = (
-  valueNode: ValueNode,
-  variables: ?ObjMap<mixed>,
-) => ?TInternal;
-
-export type GraphQLScalarTypeConfig<TInternal, TExternal> = {|
-  name: string,
-  description?: ?string,
-  // Serializes an internal value to include in a response.
-  serialize?: GraphQLScalarSerializer<TExternal>,
-  // Parses an externally provided value to use as an input.
-  parseValue?: GraphQLScalarValueParser<TInternal>,
-  // Parses an externally provided literal value to use as an input.
-  parseLiteral?: GraphQLScalarLiteralParser<TInternal>,
-  extensions?: ?ReadOnlyObjMapLike<mixed>,
-  astNode?: ?ScalarTypeDefinitionNode,
-  extensionASTNodes?: ?$ReadOnlyArray<ScalarTypeExtensionNode>,
-|};
-
-/**
- * Object Type Definition
- *
- * Almost all of the GraphQL types you define will be object types. Object types
- * have a name, but most importantly describe their fields.
- *
- * Example:
- *
- *     const AddressType = new GraphQLObjectType({
- *       name: 'Address',
- *       fields: {
- *         street: { type: GraphQLString },
- *         number: { type: GraphQLInt },
- *         formatted: {
- *           type: GraphQLString,
- *           resolve(obj) {
- *             return obj.number + ' ' + obj.street
- *           }
- *         }
- *       }
- *     });
- *
- * When two types need to refer to each other, or a type needs to refer to
- * itself in a field, you can use a function expression (aka a closure or a
- * thunk) to supply the fields lazily.
- *
- * Example:
- *
- *     const PersonType = new GraphQLObjectType({
- *       name: 'Person',
- *       fields: () => ({
- *         name: { type: GraphQLString },
- *         bestFriend: { type: PersonType },
- *       })
- *     });
- *
- */
-export class GraphQLObjectType {
-  name: string;
-  description: ?string;
-  isTypeOf: ?GraphQLIsTypeOfFn<any, any>;
-  extensions: ?ReadOnlyObjMap<mixed>;
-  astNode: ?ObjectTypeDefinitionNode;
-  extensionASTNodes: ?$ReadOnlyArray<ObjectTypeExtensionNode>;
-
-  _fields: Thunk<GraphQLFieldMap<any, any>>;
-  _interfaces: Thunk<Array<GraphQLInterfaceType>>;
-
-  constructor(config: $ReadOnly<GraphQLObjectTypeConfig<any, any>>): void {
-    this.name = config.name;
-    this.description = config.description;
-    this.isTypeOf = config.isTypeOf;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-
-    this._fields = defineFieldMap.bind(undefined, config);
-    this._interfaces = defineInterfaces.bind(undefined, config);
-    devAssert(typeof config.name === 'string', 'Must provide name.');
-    devAssert(
-      config.isTypeOf == null || typeof config.isTypeOf === 'function',
-      `${this.name} must provide "isTypeOf" as a function, ` +
-        `but got: ${inspect(config.isTypeOf)}.`,
-    );
-  }
-
-  getFields(): GraphQLFieldMap<any, any> {
-    if (typeof this._fields === 'function') {
-      this._fields = this._fields();
-    }
-    return this._fields;
-  }
-
-  getInterfaces(): Array<GraphQLInterfaceType> {
-    if (typeof this._interfaces === 'function') {
-      this._interfaces = this._interfaces();
-    }
-    return this._interfaces;
-  }
-
-  toConfig(): {|
-    ...GraphQLObjectTypeConfig<any, any>,
-    interfaces: Array<GraphQLInterfaceType>,
-    fields: GraphQLFieldConfigMap<any, any>,
-    extensions: ?ReadOnlyObjMap<mixed>,
-    extensionASTNodes: $ReadOnlyArray<ObjectTypeExtensionNode>,
-  |} {
-    return {
-      name: this.name,
-      description: this.description,
-      interfaces: this.getInterfaces(),
-      fields: fieldsToFieldsConfig(this.getFields()),
-      isTypeOf: this.isTypeOf,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: this.extensionASTNodes || [],
-    };
-  }
-
-  toString(): string {
-    return this.name;
-  }
-
-  // $FlowFixMe Flow doesn't support computed properties yet
-  get [SYMBOL_TO_STRING_TAG]() {
-    return 'GraphQLObjectType';
-  }
-}
-
-defineToJSON(GraphQLObjectType);
-
-function defineInterfaces(
-  config: $ReadOnly<
-    | GraphQLObjectTypeConfig<mixed, mixed>
-    | GraphQLInterfaceTypeConfig<mixed, mixed>,
-  >,
-): Array<GraphQLInterfaceType> {
-  const interfaces = resolveThunk(config.interfaces) ?? [];
-  devAssert(
-    Array.isArray(interfaces),
-    `${config.name} interfaces must be an Array or a function which returns an Array.`,
-  );
-  return interfaces;
-}
-
-function defineFieldMap<TSource, TContext>(
-  config: $ReadOnly<
-    | GraphQLObjectTypeConfig<TSource, TContext>
-    | GraphQLInterfaceTypeConfig<TSource, TContext>,
-  >,
-): GraphQLFieldMap<TSource, TContext> {
-  const fieldMap = resolveThunk(config.fields);
-  devAssert(
-    isPlainObj(fieldMap),
-    `${config.name} fields must be an object with field names as keys or a function which returns such an object.`,
-  );
-
-  return mapValue(fieldMap, (fieldConfig, fieldName) => {
-    devAssert(
-      isPlainObj(fieldConfig),
-      `${config.name}.${fieldName} field config must be an object.`,
-    );
-    devAssert(
-      !('isDeprecated' in fieldConfig),
-      `${config.name}.${fieldName} should provide "deprecationReason" instead of "isDeprecated".`,
-    );
-    devAssert(
-      fieldConfig.resolve == null || typeof fieldConfig.resolve === 'function',
-      `${config.name}.${fieldName} field resolver must be a function if ` +
-        `provided, but got: ${inspect(fieldConfig.resolve)}.`,
-    );
-
-    const argsConfig = fieldConfig.args ?? {};
-    devAssert(
-      isPlainObj(argsConfig),
-      `${config.name}.${fieldName} args must be an object with argument names as keys.`,
-    );
-
-    const args = objectEntries(argsConfig).map(([argName, argConfig]) => ({
-      name: argName,
-      description: argConfig.description,
-      type: argConfig.type,
-      defaultValue: argConfig.defaultValue,
-      extensions: argConfig.extensions && toObjMap(argConfig.extensions),
-      astNode: argConfig.astNode,
-    }));
-
-    return {
-      name: fieldName,
-      description: fieldConfig.description,
-      type: fieldConfig.type,
-      args,
-      resolve: fieldConfig.resolve,
-      subscribe: fieldConfig.subscribe,
-      isDeprecated: fieldConfig.deprecationReason != null,
-      deprecationReason: fieldConfig.deprecationReason,
-      extensions: fieldConfig.extensions && toObjMap(fieldConfig.extensions),
-      astNode: fieldConfig.astNode,
-    };
-  });
-}
-
-function isPlainObj(obj) {
-  return isObjectLike(obj) && !Array.isArray(obj);
-}
-
-function fieldsToFieldsConfig(fields) {
-  return mapValue(fields, field => ({
-    description: field.description,
-    type: field.type,
-    args: argsToArgsConfig(field.args),
-    resolve: field.resolve,
-    subscribe: field.subscribe,
-    deprecationReason: field.deprecationReason,
-    extensions: field.extensions,
-    astNode: field.astNode,
-  }));
-}
-
-/**
- * @internal
- */
-export function argsToArgsConfig(
-  args: $ReadOnlyArray<GraphQLArgument>,
-): GraphQLFieldConfigArgumentMap {
-  return keyValMap(
-    args,
-    arg => arg.name,
-    arg => ({
-      description: arg.description,
-      type: arg.type,
-      defaultValue: arg.defaultValue,
-      extensions: arg.extensions,
-      astNode: arg.astNode,
-    }),
-  );
-}
-
-export type GraphQLObjectTypeConfig<TSource, TContext> = {|
-  name: string,
-  description?: ?string,
-  interfaces?: Thunk<?Array<GraphQLInterfaceType>>,
-  fields: Thunk<GraphQLFieldConfigMap<TSource, TContext>>,
-  isTypeOf?: ?GraphQLIsTypeOfFn<TSource, TContext>,
-  extensions?: ?ReadOnlyObjMapLike<mixed>,
-  astNode?: ?ObjectTypeDefinitionNode,
-  extensionASTNodes?: ?$ReadOnlyArray<ObjectTypeExtensionNode>,
-|};
-
-export type GraphQLTypeResolver<TSource, TContext> = (
-  value: TSource,
-  context: TContext,
-  info: GraphQLResolveInfo,
-  abstractType: GraphQLAbstractType,
-) => PromiseOrValue<?GraphQLObjectType | string>;
-
-export type GraphQLIsTypeOfFn<TSource, TContext> = (
-  source: TSource,
-  context: TContext,
-  info: GraphQLResolveInfo,
-) => PromiseOrValue<boolean>;
-
-export type GraphQLFieldResolver<
-  TSource,
-  TContext,
-  TArgs = { [argument: string]: any, ... },
-> = (
-  source: TSource,
-  args: TArgs,
-  context: TContext,
-  info: GraphQLResolveInfo,
-) => mixed;
-
-export type GraphQLResolveInfo = {|
-  +fieldName: string,
-  +fieldNodes: $ReadOnlyArray<FieldNode>,
-  +returnType: GraphQLOutputType,
-  +parentType: GraphQLObjectType,
-  +path: Path,
-  +schema: GraphQLSchema,
-  +fragments: ObjMap<FragmentDefinitionNode>,
-  +rootValue: mixed,
-  +operation: OperationDefinitionNode,
-  +variableValues: { [variable: string]: mixed, ... },
-|};
-
-export type GraphQLFieldConfig<
-  TSource,
-  TContext,
-  TArgs = { [argument: string]: any, ... },
-> = {|
-  description?: ?string,
-  type: GraphQLOutputType,
-  args?: GraphQLFieldConfigArgumentMap,
-  resolve?: GraphQLFieldResolver<TSource, TContext, TArgs>,
-  subscribe?: GraphQLFieldResolver<TSource, TContext, TArgs>,
-  deprecationReason?: ?string,
-  extensions?: ?ReadOnlyObjMapLike<mixed>,
-  astNode?: ?FieldDefinitionNode,
-|};
-
-export type GraphQLFieldConfigArgumentMap = ObjMap<GraphQLArgumentConfig>;
-
-export type GraphQLArgumentConfig = {|
-  description?: ?string,
-  type: GraphQLInputType,
-  defaultValue?: mixed,
-  extensions?: ?ReadOnlyObjMapLike<mixed>,
-  astNode?: ?InputValueDefinitionNode,
-|};
-
-export type GraphQLFieldConfigMap<TSource, TContext> = ObjMap<
-  GraphQLFieldConfig<TSource, TContext>,
->;
-
-export type GraphQLField<
-  TSource,
-  TContext,
-  TArgs = { [argument: string]: any, ... },
-> = {|
-  name: string,
-  description: ?string,
-  type: GraphQLOutputType,
-  args: Array<GraphQLArgument>,
-  resolve?: GraphQLFieldResolver<TSource, TContext, TArgs>,
-  subscribe?: GraphQLFieldResolver<TSource, TContext, TArgs>,
-  isDeprecated?: boolean,
-  deprecationReason: ?string,
-  extensions: ?ReadOnlyObjMap<mixed>,
-  astNode: ?FieldDefinitionNode,
-|};
-
-export type GraphQLArgument = {|
-  name: string,
-  description: ?string,
-  type: GraphQLInputType,
-  defaultValue: mixed,
-  extensions: ?ReadOnlyObjMap<mixed>,
-  astNode: ?InputValueDefinitionNode,
-|};
-
-export function isRequiredArgument(arg: GraphQLArgument): boolean %checks {
-  return isNonNullType(arg.type) && arg.defaultValue === undefined;
-}
-
-export type GraphQLFieldMap<TSource, TContext> = ObjMap<
-  GraphQLField<TSource, TContext>,
->;
-
-/**
- * Interface Type Definition
- *
- * When a field can return one of a heterogeneous set of types, a Interface type
- * is used to describe what types are possible, what fields are in common across
- * all types, as well as a function to determine which type is actually used
- * when the field is resolved.
- *
- * Example:
- *
- *     const EntityType = new GraphQLInterfaceType({
- *       name: 'Entity',
- *       fields: {
- *         name: { type: GraphQLString }
- *       }
- *     });
- *
- */
-export class GraphQLInterfaceType {
-  name: string;
-  description: ?string;
-  resolveType: ?GraphQLTypeResolver<any, any>;
-  extensions: ?ReadOnlyObjMap<mixed>;
-  astNode: ?InterfaceTypeDefinitionNode;
-  extensionASTNodes: ?$ReadOnlyArray<InterfaceTypeExtensionNode>;
-
-  _fields: Thunk<GraphQLFieldMap<any, any>>;
-  _interfaces: Thunk<Array<GraphQLInterfaceType>>;
-
-  constructor(config: $ReadOnly<GraphQLInterfaceTypeConfig<any, any>>): void {
-    this.name = config.name;
-    this.description = config.description;
-    this.resolveType = config.resolveType;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-
-    this._fields = defineFieldMap.bind(undefined, config);
-    this._interfaces = defineInterfaces.bind(undefined, config);
-    devAssert(typeof config.name === 'string', 'Must provide name.');
-    devAssert(
-      config.resolveType == null || typeof config.resolveType === 'function',
-      `${this.name} must provide "resolveType" as a function, ` +
-        `but got: ${inspect(config.resolveType)}.`,
-    );
-  }
-
-  getFields(): GraphQLFieldMap<any, any> {
-    if (typeof this._fields === 'function') {
-      this._fields = this._fields();
-    }
-    return this._fields;
-  }
-
-  getInterfaces(): Array<GraphQLInterfaceType> {
-    if (typeof this._interfaces === 'function') {
-      this._interfaces = this._interfaces();
-    }
-    return this._interfaces;
-  }
-
-  toConfig(): {|
-    ...GraphQLInterfaceTypeConfig<any, any>,
-    interfaces: Array<GraphQLInterfaceType>,
-    fields: GraphQLFieldConfigMap<any, any>,
-    extensions: ?ReadOnlyObjMap<mixed>,
-    extensionASTNodes: $ReadOnlyArray<InterfaceTypeExtensionNode>,
-  |} {
-    return {
-      name: this.name,
-      description: this.description,
-      interfaces: this.getInterfaces(),
-      fields: fieldsToFieldsConfig(this.getFields()),
-      resolveType: this.resolveType,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: this.extensionASTNodes ?? [],
-    };
-  }
-
-  toString(): string {
-    return this.name;
-  }
-
-  // $FlowFixMe Flow doesn't support computed properties yet
-  get [SYMBOL_TO_STRING_TAG]() {
-    return 'GraphQLInterfaceType';
-  }
-}
-
-defineToJSON(GraphQLInterfaceType);
-
-export type GraphQLInterfaceTypeConfig<TSource, TContext> = {|
-  name: string,
-  description?: ?string,
-  interfaces?: Thunk<?Array<GraphQLInterfaceType>>,
-  fields: Thunk<GraphQLFieldConfigMap<TSource, TContext>>,
-  /**
-   * Optionally provide a custom type resolver function. If one is not provided,
-   * the default implementation will call `isTypeOf` on each implementing
-   * Object type.
-   */
-  resolveType?: ?GraphQLTypeResolver<TSource, TContext>,
-  extensions?: ?ReadOnlyObjMapLike<mixed>,
-  astNode?: ?InterfaceTypeDefinitionNode,
-  extensionASTNodes?: ?$ReadOnlyArray<InterfaceTypeExtensionNode>,
-|};
-
-/**
- * Union Type Definition
- *
- * When a field can return one of a heterogeneous set of types, a Union type
- * is used to describe what types are possible as well as providing a function
- * to determine which type is actually used when the field is resolved.
- *
- * Example:
- *
- *     const PetType = new GraphQLUnionType({
- *       name: 'Pet',
- *       types: [ DogType, CatType ],
- *       resolveType(value) {
- *         if (value instanceof Dog) {
- *           return DogType;
- *         }
- *         if (value instanceof Cat) {
- *           return CatType;
- *         }
- *       }
- *     });
- *
- */
-export class GraphQLUnionType {
-  name: string;
-  description: ?string;
-  resolveType: ?GraphQLTypeResolver<any, any>;
-  extensions: ?ReadOnlyObjMap<mixed>;
-  astNode: ?UnionTypeDefinitionNode;
-  extensionASTNodes: ?$ReadOnlyArray<UnionTypeExtensionNode>;
-
-  _types: Thunk<Array<GraphQLObjectType>>;
-
-  constructor(config: $ReadOnly<GraphQLUnionTypeConfig<any, any>>): void {
-    this.name = config.name;
-    this.description = config.description;
-    this.resolveType = config.resolveType;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-
-    this._types = defineTypes.bind(undefined, config);
-    devAssert(typeof config.name === 'string', 'Must provide name.');
-    devAssert(
-      config.resolveType == null || typeof config.resolveType === 'function',
-      `${this.name} must provide "resolveType" as a function, ` +
-        `but got: ${inspect(config.resolveType)}.`,
-    );
-  }
-
-  getTypes(): Array<GraphQLObjectType> {
-    if (typeof this._types === 'function') {
-      this._types = this._types();
-    }
-    return this._types;
-  }
-
-  toConfig(): {|
-    ...GraphQLUnionTypeConfig<any, any>,
-    types: Array<GraphQLObjectType>,
-    extensions: ?ReadOnlyObjMap<mixed>,
-    extensionASTNodes: $ReadOnlyArray<UnionTypeExtensionNode>,
-  |} {
-    return {
-      name: this.name,
-      description: this.description,
-      types: this.getTypes(),
-      resolveType: this.resolveType,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: this.extensionASTNodes ?? [],
-    };
-  }
-
-  toString(): string {
-    return this.name;
-  }
-
-  // $FlowFixMe Flow doesn't support computed properties yet
-  get [SYMBOL_TO_STRING_TAG]() {
-    return 'GraphQLUnionType';
-  }
-}
-
-defineToJSON(GraphQLUnionType);
-
-function defineTypes(
-  config: $ReadOnly<GraphQLUnionTypeConfig<mixed, mixed>>,
-): Array<GraphQLObjectType> {
-  const types = resolveThunk(config.types);
-  devAssert(
-    Array.isArray(types),
-    `Must provide Array of types or a function which returns such an array for Union ${config.name}.`,
-  );
-  return types;
-}
-
-export type GraphQLUnionTypeConfig<TSource, TContext> = {|
-  name: string,
-  description?: ?string,
-  types: Thunk<Array<GraphQLObjectType>>,
-  /**
-   * Optionally provide a custom type resolver function. If one is not provided,
-   * the default implementation will call `isTypeOf` on each implementing
-   * Object type.
-   */
-  resolveType?: ?GraphQLTypeResolver<TSource, TContext>,
-  extensions?: ?ReadOnlyObjMapLike<mixed>,
-  astNode?: ?UnionTypeDefinitionNode,
-  extensionASTNodes?: ?$ReadOnlyArray<UnionTypeExtensionNode>,
-|};
-
-/**
- * Enum Type Definition
- *
- * Some leaf values of requests and input values are Enums. GraphQL serializes
- * Enum values as strings, however internally Enums can be represented by any
- * kind of type, often integers.
- *
- * Example:
- *
- *     const RGBType = new GraphQLEnumType({
- *       name: 'RGB',
- *       values: {
- *         RED: { value: 0 },
- *         GREEN: { value: 1 },
- *         BLUE: { value: 2 }
- *       }
- *     });
- *
- * Note: If a value is not provided in a definition, the name of the enum value
- * will be used as its internal value.
- */
-export class GraphQLEnumType /* <T> */ {
-  name: string;
-  description: ?string;
-  extensions: ?ReadOnlyObjMap<mixed>;
-  astNode: ?EnumTypeDefinitionNode;
-  extensionASTNodes: ?$ReadOnlyArray<EnumTypeExtensionNode>;
-
-  _values: Array<GraphQLEnumValue /* <T> */>;
-  _valueLookup: Map<any /* T */, GraphQLEnumValue>;
-  _nameLookup: ObjMap<GraphQLEnumValue>;
-
-  constructor(config: $ReadOnly<GraphQLEnumTypeConfig /* <T> */>): void {
-    this.name = config.name;
-    this.description = config.description;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-
-    this._values = defineEnumValues(this.name, config.values);
-    this._valueLookup = new Map(
-      this._values.map(enumValue => [enumValue.value, enumValue]),
-    );
-    this._nameLookup = keyMap(this._values, value => value.name);
-
-    devAssert(typeof config.name === 'string', 'Must provide name.');
-  }
-
-  getValues(): Array<GraphQLEnumValue /* <T> */> {
-    return this._values;
-  }
-
-  getValue(name: string): ?GraphQLEnumValue {
-    return this._nameLookup[name];
-  }
-
-  serialize(outputValue: mixed /* T */): ?string {
-    const enumValue = this._valueLookup.get(outputValue);
-    if (enumValue === undefined) {
-      throw new GraphQLError(
-        `Enum "${this.name}" cannot represent value: ${inspect(outputValue)}`,
-      );
-    }
-    return enumValue.name;
-  }
-
-  parseValue(inputValue: mixed): ?any /* T */ {
-    if (typeof inputValue !== 'string') {
-      const valueStr = inspect(inputValue);
-      throw new GraphQLError(
-        `Enum "${this.name}" cannot represent non-string value: ${valueStr}.` +
-          didYouMeanEnumValue(this, valueStr),
-      );
-    }
-
-    const enumValue = this.getValue(inputValue);
-    if (enumValue == null) {
-      throw new GraphQLError(
-        `Value "${inputValue}" does not exist in "${this.name}" enum.` +
-          didYouMeanEnumValue(this, inputValue),
-      );
-    }
-    return enumValue.value;
-  }
-
-  parseLiteral(valueNode: ValueNode, _variables: ?ObjMap<mixed>): ?any /* T */ {
-    // Note: variables will be resolved to a value before calling this function.
-    if (valueNode.kind !== Kind.ENUM) {
-      const valueStr = print(valueNode);
-      throw new GraphQLError(
-        `Enum "${this.name}" cannot represent non-enum value: ${valueStr}.` +
-          didYouMeanEnumValue(this, valueStr),
-        valueNode,
-      );
-    }
-
-    const enumValue = this.getValue(valueNode.value);
-    if (enumValue == null) {
-      const valueStr = print(valueNode);
-      throw new GraphQLError(
-        `Value "${valueStr}" does not exist in "${this.name}" enum.` +
-          didYouMeanEnumValue(this, valueStr),
-        valueNode,
-      );
-    }
-    return enumValue.value;
-  }
-
-  toConfig(): {|
-    ...GraphQLEnumTypeConfig,
-    extensions: ?ReadOnlyObjMap<mixed>,
-    extensionASTNodes: $ReadOnlyArray<EnumTypeExtensionNode>,
-  |} {
-    const values = keyValMap(
-      this.getValues(),
-      value => value.name,
-      value => ({
-        description: value.description,
-        value: value.value,
-        deprecationReason: value.deprecationReason,
-        extensions: value.extensions,
-        astNode: value.astNode,
-      }),
-    );
-
-    return {
-      name: this.name,
-      description: this.description,
-      values,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: this.extensionASTNodes ?? [],
-    };
-  }
-
-  toString(): string {
-    return this.name;
-  }
-
-  // $FlowFixMe Flow doesn't support computed properties yet
-  get [SYMBOL_TO_STRING_TAG]() {
-    return 'GraphQLEnumType';
-  }
-}
-
-defineToJSON(GraphQLEnumType);
-
-function didYouMeanEnumValue(
-  enumType: GraphQLEnumType,
-  unknownValueStr: string,
-): string {
-  const allNames = enumType.getValues().map(value => value.name);
-  const suggestedValues = suggestionList(unknownValueStr, allNames);
-
-  return didYouMean('the enum value', suggestedValues);
-}
-
-function defineEnumValues(
-  typeName: string,
-  valueMap: GraphQLEnumValueConfigMap /* <T> */,
-): Array<GraphQLEnumValue /* <T> */> {
-  devAssert(
-    isPlainObj(valueMap),
-    `${typeName} values must be an object with value names as keys.`,
-  );
-  return objectEntries(valueMap).map(([valueName, valueConfig]) => {
-    devAssert(
-      isPlainObj(valueConfig),
-      `${typeName}.${valueName} must refer to an object with a "value" key ` +
-        `representing an internal value but got: ${inspect(valueConfig)}.`,
-    );
-    devAssert(
-      !('isDeprecated' in valueConfig),
-      `${typeName}.${valueName} should provide "deprecationReason" instead of "isDeprecated".`,
-    );
-    return {
-      name: valueName,
-      description: valueConfig.description,
-      value: valueConfig.value !== undefined ? valueConfig.value : valueName,
-      isDeprecated: valueConfig.deprecationReason != null,
-      deprecationReason: valueConfig.deprecationReason,
-      extensions: valueConfig.extensions && toObjMap(valueConfig.extensions),
-      astNode: valueConfig.astNode,
-    };
-  });
-}
-
-export type GraphQLEnumTypeConfig /* <T> */ = {|
-  name: string,
-  description?: ?string,
-  values: GraphQLEnumValueConfigMap /* <T> */,
-  extensions?: ?ReadOnlyObjMapLike<mixed>,
-  astNode?: ?EnumTypeDefinitionNode,
-  extensionASTNodes?: ?$ReadOnlyArray<EnumTypeExtensionNode>,
-|};
-
-export type GraphQLEnumValueConfigMap /* <T> */ = ObjMap<GraphQLEnumValueConfig /* <T> */>;
-
-export type GraphQLEnumValueConfig /* <T> */ = {|
-  description?: ?string,
-  value?: any /* T */,
-  deprecationReason?: ?string,
-  extensions?: ?ReadOnlyObjMapLike<mixed>,
-  astNode?: ?EnumValueDefinitionNode,
-|};
-
-export type GraphQLEnumValue /* <T> */ = {|
-  name: string,
-  description: ?string,
-  value: any /* T */,
-  isDeprecated: boolean,
-  deprecationReason: ?string,
-  extensions: ?ReadOnlyObjMap<mixed>,
-  astNode: ?EnumValueDefinitionNode,
-|};
-
-/**
- * Input Object Type Definition
- *
- * An input object defines a structured collection of fields which may be
- * supplied to a field argument.
- *
- * Using `NonNull` will ensure that a value must be provided by the query
- *
- * Example:
- *
- *     const GeoPoint = new GraphQLInputObjectType({
- *       name: 'GeoPoint',
- *       fields: {
- *         lat: { type: GraphQLNonNull(GraphQLFloat) },
- *         lon: { type: GraphQLNonNull(GraphQLFloat) },
- *         alt: { type: GraphQLFloat, defaultValue: 0 },
- *       }
- *     });
- *
- */
-export class GraphQLInputObjectType {
-  name: string;
-  description: ?string;
-  extensions: ?ReadOnlyObjMap<mixed>;
-  astNode: ?InputObjectTypeDefinitionNode;
-  extensionASTNodes: ?$ReadOnlyArray<InputObjectTypeExtensionNode>;
-
-  _fields: Thunk<GraphQLInputFieldMap>;
-
-  constructor(config: $ReadOnly<GraphQLInputObjectTypeConfig>): void {
-    this.name = config.name;
-    this.description = config.description;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-
-    this._fields = defineInputFieldMap.bind(undefined, config);
-    devAssert(typeof config.name === 'string', 'Must provide name.');
-  }
-
-  getFields(): GraphQLInputFieldMap {
-    if (typeof this._fields === 'function') {
-      this._fields = this._fields();
-    }
-    return this._fields;
-  }
-
-  toConfig(): {|
-    ...GraphQLInputObjectTypeConfig,
-    fields: GraphQLInputFieldConfigMap,
-    extensions: ?ReadOnlyObjMap<mixed>,
-    extensionASTNodes: $ReadOnlyArray<InputObjectTypeExtensionNode>,
-  |} {
-    const fields = mapValue(this.getFields(), field => ({
-      description: field.description,
-      type: field.type,
-      defaultValue: field.defaultValue,
-      extensions: field.extensions,
-      astNode: field.astNode,
-    }));
-
-    return {
-      name: this.name,
-      description: this.description,
-      fields,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: this.extensionASTNodes ?? [],
-    };
-  }
-
-  toString(): string {
-    return this.name;
-  }
-
-  // $FlowFixMe Flow doesn't support computed properties yet
-  get [SYMBOL_TO_STRING_TAG]() {
-    return 'GraphQLInputObjectType';
-  }
-}
-
-defineToJSON(GraphQLInputObjectType);
-
-function defineInputFieldMap(
-  config: $ReadOnly<GraphQLInputObjectTypeConfig>,
-): GraphQLInputFieldMap {
-  const fieldMap = resolveThunk(config.fields);
-  devAssert(
-    isPlainObj(fieldMap),
-    `${config.name} fields must be an object with field names as keys or a function which returns such an object.`,
-  );
-  return mapValue(fieldMap, (fieldConfig, fieldName) => {
-    devAssert(
-      !('resolve' in fieldConfig),
-      `${config.name}.${fieldName} field has a resolve property, but Input Types cannot define resolvers.`,
-    );
-
-    return {
-      name: fieldName,
-      description: fieldConfig.description,
-      type: fieldConfig.type,
-      defaultValue: fieldConfig.defaultValue,
-      extensions: fieldConfig.extensions && toObjMap(fieldConfig.extensions),
-      astNode: fieldConfig.astNode,
-    };
-  });
-}
-
-export type GraphQLInputObjectTypeConfig = {|
-  name: string,
-  description?: ?string,
-  fields: Thunk<GraphQLInputFieldConfigMap>,
-  extensions?: ?ReadOnlyObjMapLike<mixed>,
-  astNode?: ?InputObjectTypeDefinitionNode,
-  extensionASTNodes?: ?$ReadOnlyArray<InputObjectTypeExtensionNode>,
-|};
-
-export type GraphQLInputFieldConfig = {|
-  description?: ?string,
-  type: GraphQLInputType,
-  defaultValue?: mixed,
-  extensions?: ?ReadOnlyObjMapLike<mixed>,
-  astNode?: ?InputValueDefinitionNode,
-|};
-
-export type GraphQLInputFieldConfigMap = ObjMap<GraphQLInputFieldConfig>;
-
-export type GraphQLInputField = {|
-  name: string,
-  description: ?string,
-  type: GraphQLInputType,
-  defaultValue: mixed,
-  extensions: ?ReadOnlyObjMap<mixed>,
-  astNode: ?InputValueDefinitionNode,
-|};
-
-export function isRequiredInputField(
-  field: GraphQLInputField,
-): boolean %checks {
-  return isNonNullType(field.type) && field.defaultValue === undefined;
-}
-
-export type GraphQLInputFieldMap = ObjMap<GraphQLInputField>;
diff --git a/node_modules/graphql/type/definition.mjs b/node_modules/graphql/type/definition.mjs
deleted file mode 100644
index 00d7807..0000000
--- a/node_modules/graphql/type/definition.mjs
+++ /dev/null
@@ -1,1073 +0,0 @@
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-// FIXME
-
-/* eslint-disable import/no-cycle */
-import objectEntries from "../polyfills/objectEntries.mjs";
-import { SYMBOL_TO_STRING_TAG } from "../polyfills/symbols.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import keyMap from "../jsutils/keyMap.mjs";
-import mapValue from "../jsutils/mapValue.mjs";
-import toObjMap from "../jsutils/toObjMap.mjs";
-import devAssert from "../jsutils/devAssert.mjs";
-import keyValMap from "../jsutils/keyValMap.mjs";
-import instanceOf from "../jsutils/instanceOf.mjs";
-import didYouMean from "../jsutils/didYouMean.mjs";
-import isObjectLike from "../jsutils/isObjectLike.mjs";
-import identityFunc from "../jsutils/identityFunc.mjs";
-import defineToJSON from "../jsutils/defineToJSON.mjs";
-import suggestionList from "../jsutils/suggestionList.mjs";
-import { Kind } from "../language/kinds.mjs";
-import { print } from "../language/printer.mjs";
-import { GraphQLError } from "../error/GraphQLError.mjs";
-import { valueFromASTUntyped } from "../utilities/valueFromASTUntyped.mjs";
-export function isType(type) {
-  return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isInputObjectType(type) || isListType(type) || isNonNullType(type);
-}
-export function assertType(type) {
-  if (!isType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL type."));
-  }
-
-  return type;
-}
-/**
- * There are predicates for each kind of GraphQL type.
- */
-
-// eslint-disable-next-line no-redeclare
-export function isScalarType(type) {
-  return instanceOf(type, GraphQLScalarType);
-}
-export function assertScalarType(type) {
-  if (!isScalarType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL Scalar type."));
-  }
-
-  return type;
-}
-// eslint-disable-next-line no-redeclare
-export function isObjectType(type) {
-  return instanceOf(type, GraphQLObjectType);
-}
-export function assertObjectType(type) {
-  if (!isObjectType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL Object type."));
-  }
-
-  return type;
-}
-// eslint-disable-next-line no-redeclare
-export function isInterfaceType(type) {
-  return instanceOf(type, GraphQLInterfaceType);
-}
-export function assertInterfaceType(type) {
-  if (!isInterfaceType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL Interface type."));
-  }
-
-  return type;
-}
-// eslint-disable-next-line no-redeclare
-export function isUnionType(type) {
-  return instanceOf(type, GraphQLUnionType);
-}
-export function assertUnionType(type) {
-  if (!isUnionType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL Union type."));
-  }
-
-  return type;
-}
-// eslint-disable-next-line no-redeclare
-export function isEnumType(type) {
-  return instanceOf(type, GraphQLEnumType);
-}
-export function assertEnumType(type) {
-  if (!isEnumType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL Enum type."));
-  }
-
-  return type;
-}
-// eslint-disable-next-line no-redeclare
-export function isInputObjectType(type) {
-  return instanceOf(type, GraphQLInputObjectType);
-}
-export function assertInputObjectType(type) {
-  if (!isInputObjectType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL Input Object type."));
-  }
-
-  return type;
-}
-// eslint-disable-next-line no-redeclare
-export function isListType(type) {
-  return instanceOf(type, GraphQLList);
-}
-export function assertListType(type) {
-  if (!isListType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL List type."));
-  }
-
-  return type;
-}
-// eslint-disable-next-line no-redeclare
-export function isNonNullType(type) {
-  return instanceOf(type, GraphQLNonNull);
-}
-export function assertNonNullType(type) {
-  if (!isNonNullType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL Non-Null type."));
-  }
-
-  return type;
-}
-/**
- * These types may be used as input types for arguments and directives.
- */
-
-export function isInputType(type) {
-  return isScalarType(type) || isEnumType(type) || isInputObjectType(type) || isWrappingType(type) && isInputType(type.ofType);
-}
-export function assertInputType(type) {
-  if (!isInputType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL input type."));
-  }
-
-  return type;
-}
-/**
- * These types may be used as output types as the result of fields.
- */
-
-export function isOutputType(type) {
-  return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isWrappingType(type) && isOutputType(type.ofType);
-}
-export function assertOutputType(type) {
-  if (!isOutputType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL output type."));
-  }
-
-  return type;
-}
-/**
- * These types may describe types which may be leaf values.
- */
-
-export function isLeafType(type) {
-  return isScalarType(type) || isEnumType(type);
-}
-export function assertLeafType(type) {
-  if (!isLeafType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL leaf type."));
-  }
-
-  return type;
-}
-/**
- * These types may describe the parent context of a selection set.
- */
-
-export function isCompositeType(type) {
-  return isObjectType(type) || isInterfaceType(type) || isUnionType(type);
-}
-export function assertCompositeType(type) {
-  if (!isCompositeType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL composite type."));
-  }
-
-  return type;
-}
-/**
- * These types may describe the parent context of a selection set.
- */
-
-export function isAbstractType(type) {
-  return isInterfaceType(type) || isUnionType(type);
-}
-export function assertAbstractType(type) {
-  if (!isAbstractType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL abstract type."));
-  }
-
-  return type;
-}
-/**
- * List Type Wrapper
- *
- * A list is a wrapping type which points to another type.
- * Lists are often created within the context of defining the fields of
- * an object type.
- *
- * Example:
- *
- *     const PersonType = new GraphQLObjectType({
- *       name: 'Person',
- *       fields: () => ({
- *         parents: { type: GraphQLList(PersonType) },
- *         children: { type: GraphQLList(PersonType) },
- *       })
- *     })
- *
- */
-// FIXME: workaround to fix issue with Babel parser
-
-/* ::
-declare class GraphQLList<+T: GraphQLType> {
-  +ofType: T;
-  static <T>(ofType: T): GraphQLList<T>;
-  // Note: constructors cannot be used for covariant types. Drop the "new".
-  constructor(ofType: GraphQLType): void;
-}
-*/
-
-export function GraphQLList(ofType) {
-  if (this instanceof GraphQLList) {
-    this.ofType = assertType(ofType);
-  } else {
-    return new GraphQLList(ofType);
-  }
-} // Need to cast through any to alter the prototype.
-
-GraphQLList.prototype.toString = function toString() {
-  return '[' + String(this.ofType) + ']';
-};
-
-Object.defineProperty(GraphQLList.prototype, SYMBOL_TO_STRING_TAG, {
-  get: function get() {
-    return 'GraphQLList';
-  }
-});
-defineToJSON(GraphQLList);
-/**
- * Non-Null Type Wrapper
- *
- * A non-null is a wrapping type which points to another type.
- * Non-null types enforce that their values are never null and can ensure
- * an error is raised if this ever occurs during a request. It is useful for
- * fields which you can make a strong guarantee on non-nullability, for example
- * usually the id field of a database row will never be null.
- *
- * Example:
- *
- *     const RowType = new GraphQLObjectType({
- *       name: 'Row',
- *       fields: () => ({
- *         id: { type: GraphQLNonNull(GraphQLString) },
- *       })
- *     })
- *
- * Note: the enforcement of non-nullability occurs within the executor.
- */
-// FIXME: workaround to fix issue with Babel parser
-
-/* ::
-declare class GraphQLNonNull<+T: GraphQLNullableType> {
-  +ofType: T;
-  static <T>(ofType: T): GraphQLNonNull<T>;
-  // Note: constructors cannot be used for covariant types. Drop the "new".
-  constructor(ofType: GraphQLType): void;
-}
-*/
-
-export function GraphQLNonNull(ofType) {
-  if (this instanceof GraphQLNonNull) {
-    this.ofType = assertNullableType(ofType);
-  } else {
-    return new GraphQLNonNull(ofType);
-  }
-} // Need to cast through any to alter the prototype.
-
-GraphQLNonNull.prototype.toString = function toString() {
-  return String(this.ofType) + '!';
-};
-
-Object.defineProperty(GraphQLNonNull.prototype, SYMBOL_TO_STRING_TAG, {
-  get: function get() {
-    return 'GraphQLNonNull';
-  }
-});
-defineToJSON(GraphQLNonNull);
-/**
- * These types wrap and modify other types
- */
-
-export function isWrappingType(type) {
-  return isListType(type) || isNonNullType(type);
-}
-export function assertWrappingType(type) {
-  if (!isWrappingType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL wrapping type."));
-  }
-
-  return type;
-}
-/**
- * These types can all accept null as a value.
- */
-
-export function isNullableType(type) {
-  return isType(type) && !isNonNullType(type);
-}
-export function assertNullableType(type) {
-  if (!isNullableType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL nullable type."));
-  }
-
-  return type;
-}
-/* eslint-disable no-redeclare */
-
-export function getNullableType(type) {
-  /* eslint-enable no-redeclare */
-  if (type) {
-    return isNonNullType(type) ? type.ofType : type;
-  }
-}
-/**
- * These named types do not include modifiers like List or NonNull.
- */
-
-export function isNamedType(type) {
-  return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isInputObjectType(type);
-}
-export function assertNamedType(type) {
-  if (!isNamedType(type)) {
-    throw new Error("Expected ".concat(inspect(type), " to be a GraphQL named type."));
-  }
-
-  return type;
-}
-/* eslint-disable no-redeclare */
-
-export function getNamedType(type) {
-  /* eslint-enable no-redeclare */
-  if (type) {
-    var unwrappedType = type;
-
-    while (isWrappingType(unwrappedType)) {
-      unwrappedType = unwrappedType.ofType;
-    }
-
-    return unwrappedType;
-  }
-}
-/**
- * Used while defining GraphQL types to allow for circular references in
- * otherwise immutable type definitions.
- */
-
-function resolveThunk(thunk) {
-  // $FlowFixMe(>=0.90.0)
-  return typeof thunk === 'function' ? thunk() : thunk;
-}
-
-function undefineIfEmpty(arr) {
-  return arr && arr.length > 0 ? arr : undefined;
-}
-/**
- * Scalar Type Definition
- *
- * The leaf values of any request and input values to arguments are
- * Scalars (or Enums) and are defined with a name and a series of functions
- * used to parse input from ast or variables and to ensure validity.
- *
- * If a type's serialize function does not return a value (i.e. it returns
- * `undefined`) then an error will be raised and a `null` value will be returned
- * in the response. If the serialize function returns `null`, then no error will
- * be included in the response.
- *
- * Example:
- *
- *     const OddType = new GraphQLScalarType({
- *       name: 'Odd',
- *       serialize(value) {
- *         if (value % 2 === 1) {
- *           return value;
- *         }
- *       }
- *     });
- *
- */
-
-
-export var GraphQLScalarType =
-/*#__PURE__*/
-function () {
-  function GraphQLScalarType(config) {
-    var _config$parseValue, _config$serialize, _config$parseLiteral;
-
-    var parseValue = (_config$parseValue = config.parseValue) !== null && _config$parseValue !== void 0 ? _config$parseValue : identityFunc;
-    this.name = config.name;
-    this.description = config.description;
-    this.serialize = (_config$serialize = config.serialize) !== null && _config$serialize !== void 0 ? _config$serialize : identityFunc;
-    this.parseValue = parseValue;
-    this.parseLiteral = (_config$parseLiteral = config.parseLiteral) !== null && _config$parseLiteral !== void 0 ? _config$parseLiteral : function (node) {
-      return parseValue(valueFromASTUntyped(node));
-    };
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-    typeof config.name === 'string' || devAssert(0, 'Must provide name.');
-    config.serialize == null || typeof config.serialize === 'function' || devAssert(0, "".concat(this.name, " must provide \"serialize\" function. If this custom Scalar is also used as an input type, ensure \"parseValue\" and \"parseLiteral\" functions are also provided."));
-
-    if (config.parseLiteral) {
-      typeof config.parseValue === 'function' && typeof config.parseLiteral === 'function' || devAssert(0, "".concat(this.name, " must provide both \"parseValue\" and \"parseLiteral\" functions."));
-    }
-  }
-
-  var _proto = GraphQLScalarType.prototype;
-
-  _proto.toConfig = function toConfig() {
-    var _this$extensionASTNod;
-
-    return {
-      name: this.name,
-      description: this.description,
-      serialize: this.serialize,
-      parseValue: this.parseValue,
-      parseLiteral: this.parseLiteral,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: (_this$extensionASTNod = this.extensionASTNodes) !== null && _this$extensionASTNod !== void 0 ? _this$extensionASTNod : []
-    };
-  };
-
-  _proto.toString = function toString() {
-    return this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLScalarType, [{
-    key: SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLScalarType';
-    }
-  }]);
-
-  return GraphQLScalarType;
-}();
-defineToJSON(GraphQLScalarType);
-
-/**
- * Object Type Definition
- *
- * Almost all of the GraphQL types you define will be object types. Object types
- * have a name, but most importantly describe their fields.
- *
- * Example:
- *
- *     const AddressType = new GraphQLObjectType({
- *       name: 'Address',
- *       fields: {
- *         street: { type: GraphQLString },
- *         number: { type: GraphQLInt },
- *         formatted: {
- *           type: GraphQLString,
- *           resolve(obj) {
- *             return obj.number + ' ' + obj.street
- *           }
- *         }
- *       }
- *     });
- *
- * When two types need to refer to each other, or a type needs to refer to
- * itself in a field, you can use a function expression (aka a closure or a
- * thunk) to supply the fields lazily.
- *
- * Example:
- *
- *     const PersonType = new GraphQLObjectType({
- *       name: 'Person',
- *       fields: () => ({
- *         name: { type: GraphQLString },
- *         bestFriend: { type: PersonType },
- *       })
- *     });
- *
- */
-export var GraphQLObjectType =
-/*#__PURE__*/
-function () {
-  function GraphQLObjectType(config) {
-    this.name = config.name;
-    this.description = config.description;
-    this.isTypeOf = config.isTypeOf;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-    this._fields = defineFieldMap.bind(undefined, config);
-    this._interfaces = defineInterfaces.bind(undefined, config);
-    typeof config.name === 'string' || devAssert(0, 'Must provide name.');
-    config.isTypeOf == null || typeof config.isTypeOf === 'function' || devAssert(0, "".concat(this.name, " must provide \"isTypeOf\" as a function, ") + "but got: ".concat(inspect(config.isTypeOf), "."));
-  }
-
-  var _proto2 = GraphQLObjectType.prototype;
-
-  _proto2.getFields = function getFields() {
-    if (typeof this._fields === 'function') {
-      this._fields = this._fields();
-    }
-
-    return this._fields;
-  };
-
-  _proto2.getInterfaces = function getInterfaces() {
-    if (typeof this._interfaces === 'function') {
-      this._interfaces = this._interfaces();
-    }
-
-    return this._interfaces;
-  };
-
-  _proto2.toConfig = function toConfig() {
-    return {
-      name: this.name,
-      description: this.description,
-      interfaces: this.getInterfaces(),
-      fields: fieldsToFieldsConfig(this.getFields()),
-      isTypeOf: this.isTypeOf,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: this.extensionASTNodes || []
-    };
-  };
-
-  _proto2.toString = function toString() {
-    return this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLObjectType, [{
-    key: SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLObjectType';
-    }
-  }]);
-
-  return GraphQLObjectType;
-}();
-defineToJSON(GraphQLObjectType);
-
-function defineInterfaces(config) {
-  var _resolveThunk;
-
-  var interfaces = (_resolveThunk = resolveThunk(config.interfaces)) !== null && _resolveThunk !== void 0 ? _resolveThunk : [];
-  Array.isArray(interfaces) || devAssert(0, "".concat(config.name, " interfaces must be an Array or a function which returns an Array."));
-  return interfaces;
-}
-
-function defineFieldMap(config) {
-  var fieldMap = resolveThunk(config.fields);
-  isPlainObj(fieldMap) || devAssert(0, "".concat(config.name, " fields must be an object with field names as keys or a function which returns such an object."));
-  return mapValue(fieldMap, function (fieldConfig, fieldName) {
-    var _fieldConfig$args;
-
-    isPlainObj(fieldConfig) || devAssert(0, "".concat(config.name, ".").concat(fieldName, " field config must be an object."));
-    !('isDeprecated' in fieldConfig) || devAssert(0, "".concat(config.name, ".").concat(fieldName, " should provide \"deprecationReason\" instead of \"isDeprecated\"."));
-    fieldConfig.resolve == null || typeof fieldConfig.resolve === 'function' || devAssert(0, "".concat(config.name, ".").concat(fieldName, " field resolver must be a function if ") + "provided, but got: ".concat(inspect(fieldConfig.resolve), "."));
-    var argsConfig = (_fieldConfig$args = fieldConfig.args) !== null && _fieldConfig$args !== void 0 ? _fieldConfig$args : {};
-    isPlainObj(argsConfig) || devAssert(0, "".concat(config.name, ".").concat(fieldName, " args must be an object with argument names as keys."));
-    var args = objectEntries(argsConfig).map(function (_ref) {
-      var argName = _ref[0],
-          argConfig = _ref[1];
-      return {
-        name: argName,
-        description: argConfig.description,
-        type: argConfig.type,
-        defaultValue: argConfig.defaultValue,
-        extensions: argConfig.extensions && toObjMap(argConfig.extensions),
-        astNode: argConfig.astNode
-      };
-    });
-    return {
-      name: fieldName,
-      description: fieldConfig.description,
-      type: fieldConfig.type,
-      args: args,
-      resolve: fieldConfig.resolve,
-      subscribe: fieldConfig.subscribe,
-      isDeprecated: fieldConfig.deprecationReason != null,
-      deprecationReason: fieldConfig.deprecationReason,
-      extensions: fieldConfig.extensions && toObjMap(fieldConfig.extensions),
-      astNode: fieldConfig.astNode
-    };
-  });
-}
-
-function isPlainObj(obj) {
-  return isObjectLike(obj) && !Array.isArray(obj);
-}
-
-function fieldsToFieldsConfig(fields) {
-  return mapValue(fields, function (field) {
-    return {
-      description: field.description,
-      type: field.type,
-      args: argsToArgsConfig(field.args),
-      resolve: field.resolve,
-      subscribe: field.subscribe,
-      deprecationReason: field.deprecationReason,
-      extensions: field.extensions,
-      astNode: field.astNode
-    };
-  });
-}
-/**
- * @internal
- */
-
-
-export function argsToArgsConfig(args) {
-  return keyValMap(args, function (arg) {
-    return arg.name;
-  }, function (arg) {
-    return {
-      description: arg.description,
-      type: arg.type,
-      defaultValue: arg.defaultValue,
-      extensions: arg.extensions,
-      astNode: arg.astNode
-    };
-  });
-}
-export function isRequiredArgument(arg) {
-  return isNonNullType(arg.type) && arg.defaultValue === undefined;
-}
-
-/**
- * Interface Type Definition
- *
- * When a field can return one of a heterogeneous set of types, a Interface type
- * is used to describe what types are possible, what fields are in common across
- * all types, as well as a function to determine which type is actually used
- * when the field is resolved.
- *
- * Example:
- *
- *     const EntityType = new GraphQLInterfaceType({
- *       name: 'Entity',
- *       fields: {
- *         name: { type: GraphQLString }
- *       }
- *     });
- *
- */
-export var GraphQLInterfaceType =
-/*#__PURE__*/
-function () {
-  function GraphQLInterfaceType(config) {
-    this.name = config.name;
-    this.description = config.description;
-    this.resolveType = config.resolveType;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-    this._fields = defineFieldMap.bind(undefined, config);
-    this._interfaces = defineInterfaces.bind(undefined, config);
-    typeof config.name === 'string' || devAssert(0, 'Must provide name.');
-    config.resolveType == null || typeof config.resolveType === 'function' || devAssert(0, "".concat(this.name, " must provide \"resolveType\" as a function, ") + "but got: ".concat(inspect(config.resolveType), "."));
-  }
-
-  var _proto3 = GraphQLInterfaceType.prototype;
-
-  _proto3.getFields = function getFields() {
-    if (typeof this._fields === 'function') {
-      this._fields = this._fields();
-    }
-
-    return this._fields;
-  };
-
-  _proto3.getInterfaces = function getInterfaces() {
-    if (typeof this._interfaces === 'function') {
-      this._interfaces = this._interfaces();
-    }
-
-    return this._interfaces;
-  };
-
-  _proto3.toConfig = function toConfig() {
-    var _this$extensionASTNod2;
-
-    return {
-      name: this.name,
-      description: this.description,
-      interfaces: this.getInterfaces(),
-      fields: fieldsToFieldsConfig(this.getFields()),
-      resolveType: this.resolveType,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: (_this$extensionASTNod2 = this.extensionASTNodes) !== null && _this$extensionASTNod2 !== void 0 ? _this$extensionASTNod2 : []
-    };
-  };
-
-  _proto3.toString = function toString() {
-    return this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLInterfaceType, [{
-    key: SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLInterfaceType';
-    }
-  }]);
-
-  return GraphQLInterfaceType;
-}();
-defineToJSON(GraphQLInterfaceType);
-
-/**
- * Union Type Definition
- *
- * When a field can return one of a heterogeneous set of types, a Union type
- * is used to describe what types are possible as well as providing a function
- * to determine which type is actually used when the field is resolved.
- *
- * Example:
- *
- *     const PetType = new GraphQLUnionType({
- *       name: 'Pet',
- *       types: [ DogType, CatType ],
- *       resolveType(value) {
- *         if (value instanceof Dog) {
- *           return DogType;
- *         }
- *         if (value instanceof Cat) {
- *           return CatType;
- *         }
- *       }
- *     });
- *
- */
-export var GraphQLUnionType =
-/*#__PURE__*/
-function () {
-  function GraphQLUnionType(config) {
-    this.name = config.name;
-    this.description = config.description;
-    this.resolveType = config.resolveType;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-    this._types = defineTypes.bind(undefined, config);
-    typeof config.name === 'string' || devAssert(0, 'Must provide name.');
-    config.resolveType == null || typeof config.resolveType === 'function' || devAssert(0, "".concat(this.name, " must provide \"resolveType\" as a function, ") + "but got: ".concat(inspect(config.resolveType), "."));
-  }
-
-  var _proto4 = GraphQLUnionType.prototype;
-
-  _proto4.getTypes = function getTypes() {
-    if (typeof this._types === 'function') {
-      this._types = this._types();
-    }
-
-    return this._types;
-  };
-
-  _proto4.toConfig = function toConfig() {
-    var _this$extensionASTNod3;
-
-    return {
-      name: this.name,
-      description: this.description,
-      types: this.getTypes(),
-      resolveType: this.resolveType,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: (_this$extensionASTNod3 = this.extensionASTNodes) !== null && _this$extensionASTNod3 !== void 0 ? _this$extensionASTNod3 : []
-    };
-  };
-
-  _proto4.toString = function toString() {
-    return this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLUnionType, [{
-    key: SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLUnionType';
-    }
-  }]);
-
-  return GraphQLUnionType;
-}();
-defineToJSON(GraphQLUnionType);
-
-function defineTypes(config) {
-  var types = resolveThunk(config.types);
-  Array.isArray(types) || devAssert(0, "Must provide Array of types or a function which returns such an array for Union ".concat(config.name, "."));
-  return types;
-}
-
-/**
- * Enum Type Definition
- *
- * Some leaf values of requests and input values are Enums. GraphQL serializes
- * Enum values as strings, however internally Enums can be represented by any
- * kind of type, often integers.
- *
- * Example:
- *
- *     const RGBType = new GraphQLEnumType({
- *       name: 'RGB',
- *       values: {
- *         RED: { value: 0 },
- *         GREEN: { value: 1 },
- *         BLUE: { value: 2 }
- *       }
- *     });
- *
- * Note: If a value is not provided in a definition, the name of the enum value
- * will be used as its internal value.
- */
-export var GraphQLEnumType
-/* <T> */
-=
-/*#__PURE__*/
-function () {
-  function GraphQLEnumType(config) {
-    this.name = config.name;
-    this.description = config.description;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-    this._values = defineEnumValues(this.name, config.values);
-    this._valueLookup = new Map(this._values.map(function (enumValue) {
-      return [enumValue.value, enumValue];
-    }));
-    this._nameLookup = keyMap(this._values, function (value) {
-      return value.name;
-    });
-    typeof config.name === 'string' || devAssert(0, 'Must provide name.');
-  }
-
-  var _proto5 = GraphQLEnumType.prototype;
-
-  _proto5.getValues = function getValues() {
-    return this._values;
-  };
-
-  _proto5.getValue = function getValue(name) {
-    return this._nameLookup[name];
-  };
-
-  _proto5.serialize = function serialize(outputValue) {
-    var enumValue = this._valueLookup.get(outputValue);
-
-    if (enumValue === undefined) {
-      throw new GraphQLError("Enum \"".concat(this.name, "\" cannot represent value: ").concat(inspect(outputValue)));
-    }
-
-    return enumValue.name;
-  };
-
-  _proto5.parseValue = function parseValue(inputValue)
-  /* T */
-  {
-    if (typeof inputValue !== 'string') {
-      var valueStr = inspect(inputValue);
-      throw new GraphQLError("Enum \"".concat(this.name, "\" cannot represent non-string value: ").concat(valueStr, ".") + didYouMeanEnumValue(this, valueStr));
-    }
-
-    var enumValue = this.getValue(inputValue);
-
-    if (enumValue == null) {
-      throw new GraphQLError("Value \"".concat(inputValue, "\" does not exist in \"").concat(this.name, "\" enum.") + didYouMeanEnumValue(this, inputValue));
-    }
-
-    return enumValue.value;
-  };
-
-  _proto5.parseLiteral = function parseLiteral(valueNode, _variables)
-  /* T */
-  {
-    // Note: variables will be resolved to a value before calling this function.
-    if (valueNode.kind !== Kind.ENUM) {
-      var valueStr = print(valueNode);
-      throw new GraphQLError("Enum \"".concat(this.name, "\" cannot represent non-enum value: ").concat(valueStr, ".") + didYouMeanEnumValue(this, valueStr), valueNode);
-    }
-
-    var enumValue = this.getValue(valueNode.value);
-
-    if (enumValue == null) {
-      var _valueStr = print(valueNode);
-
-      throw new GraphQLError("Value \"".concat(_valueStr, "\" does not exist in \"").concat(this.name, "\" enum.") + didYouMeanEnumValue(this, _valueStr), valueNode);
-    }
-
-    return enumValue.value;
-  };
-
-  _proto5.toConfig = function toConfig() {
-    var _this$extensionASTNod4;
-
-    var values = keyValMap(this.getValues(), function (value) {
-      return value.name;
-    }, function (value) {
-      return {
-        description: value.description,
-        value: value.value,
-        deprecationReason: value.deprecationReason,
-        extensions: value.extensions,
-        astNode: value.astNode
-      };
-    });
-    return {
-      name: this.name,
-      description: this.description,
-      values: values,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: (_this$extensionASTNod4 = this.extensionASTNodes) !== null && _this$extensionASTNod4 !== void 0 ? _this$extensionASTNod4 : []
-    };
-  };
-
-  _proto5.toString = function toString() {
-    return this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLEnumType, [{
-    key: SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLEnumType';
-    }
-  }]);
-
-  return GraphQLEnumType;
-}();
-defineToJSON(GraphQLEnumType);
-
-function didYouMeanEnumValue(enumType, unknownValueStr) {
-  var allNames = enumType.getValues().map(function (value) {
-    return value.name;
-  });
-  var suggestedValues = suggestionList(unknownValueStr, allNames);
-  return didYouMean('the enum value', suggestedValues);
-}
-
-function defineEnumValues(typeName, valueMap) {
-  isPlainObj(valueMap) || devAssert(0, "".concat(typeName, " values must be an object with value names as keys."));
-  return objectEntries(valueMap).map(function (_ref2) {
-    var valueName = _ref2[0],
-        valueConfig = _ref2[1];
-    isPlainObj(valueConfig) || devAssert(0, "".concat(typeName, ".").concat(valueName, " must refer to an object with a \"value\" key ") + "representing an internal value but got: ".concat(inspect(valueConfig), "."));
-    !('isDeprecated' in valueConfig) || devAssert(0, "".concat(typeName, ".").concat(valueName, " should provide \"deprecationReason\" instead of \"isDeprecated\"."));
-    return {
-      name: valueName,
-      description: valueConfig.description,
-      value: valueConfig.value !== undefined ? valueConfig.value : valueName,
-      isDeprecated: valueConfig.deprecationReason != null,
-      deprecationReason: valueConfig.deprecationReason,
-      extensions: valueConfig.extensions && toObjMap(valueConfig.extensions),
-      astNode: valueConfig.astNode
-    };
-  });
-}
-
-/**
- * Input Object Type Definition
- *
- * An input object defines a structured collection of fields which may be
- * supplied to a field argument.
- *
- * Using `NonNull` will ensure that a value must be provided by the query
- *
- * Example:
- *
- *     const GeoPoint = new GraphQLInputObjectType({
- *       name: 'GeoPoint',
- *       fields: {
- *         lat: { type: GraphQLNonNull(GraphQLFloat) },
- *         lon: { type: GraphQLNonNull(GraphQLFloat) },
- *         alt: { type: GraphQLFloat, defaultValue: 0 },
- *       }
- *     });
- *
- */
-export var GraphQLInputObjectType =
-/*#__PURE__*/
-function () {
-  function GraphQLInputObjectType(config) {
-    this.name = config.name;
-    this.description = config.description;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = undefineIfEmpty(config.extensionASTNodes);
-    this._fields = defineInputFieldMap.bind(undefined, config);
-    typeof config.name === 'string' || devAssert(0, 'Must provide name.');
-  }
-
-  var _proto6 = GraphQLInputObjectType.prototype;
-
-  _proto6.getFields = function getFields() {
-    if (typeof this._fields === 'function') {
-      this._fields = this._fields();
-    }
-
-    return this._fields;
-  };
-
-  _proto6.toConfig = function toConfig() {
-    var _this$extensionASTNod5;
-
-    var fields = mapValue(this.getFields(), function (field) {
-      return {
-        description: field.description,
-        type: field.type,
-        defaultValue: field.defaultValue,
-        extensions: field.extensions,
-        astNode: field.astNode
-      };
-    });
-    return {
-      name: this.name,
-      description: this.description,
-      fields: fields,
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: (_this$extensionASTNod5 = this.extensionASTNodes) !== null && _this$extensionASTNod5 !== void 0 ? _this$extensionASTNod5 : []
-    };
-  };
-
-  _proto6.toString = function toString() {
-    return this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLInputObjectType, [{
-    key: SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLInputObjectType';
-    }
-  }]);
-
-  return GraphQLInputObjectType;
-}();
-defineToJSON(GraphQLInputObjectType);
-
-function defineInputFieldMap(config) {
-  var fieldMap = resolveThunk(config.fields);
-  isPlainObj(fieldMap) || devAssert(0, "".concat(config.name, " fields must be an object with field names as keys or a function which returns such an object."));
-  return mapValue(fieldMap, function (fieldConfig, fieldName) {
-    !('resolve' in fieldConfig) || devAssert(0, "".concat(config.name, ".").concat(fieldName, " field has a resolve property, but Input Types cannot define resolvers."));
-    return {
-      name: fieldName,
-      description: fieldConfig.description,
-      type: fieldConfig.type,
-      defaultValue: fieldConfig.defaultValue,
-      extensions: fieldConfig.extensions && toObjMap(fieldConfig.extensions),
-      astNode: fieldConfig.astNode
-    };
-  });
-}
-
-export function isRequiredInputField(field) {
-  return isNonNullType(field.type) && field.defaultValue === undefined;
-}
diff --git a/node_modules/graphql/type/directives.d.ts b/node_modules/graphql/type/directives.d.ts
deleted file mode 100644
index 28c70c5..0000000
--- a/node_modules/graphql/type/directives.d.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-
-import { DirectiveDefinitionNode } from '../language/ast';
-import { DirectiveLocationEnum } from '../language/directiveLocation';
-
-import { GraphQLFieldConfigArgumentMap, GraphQLArgument } from './definition';
-
-/**
- * Test if the given value is a GraphQL directive.
- */
-export function isDirective(directive: any): directive is GraphQLDirective;
-export function assertDirective(directive: any): GraphQLDirective;
-/**
- * Directives are used by the GraphQL runtime as a way of modifying execution
- * behavior. Type system creators will usually not create these directly.
- */
-export class GraphQLDirective {
-  name: string;
-  description: Maybe<string>;
-  locations: Array<DirectiveLocationEnum>;
-  isRepeatable: boolean;
-  args: Array<GraphQLArgument>;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  astNode: Maybe<DirectiveDefinitionNode>;
-
-  constructor(config: Readonly<GraphQLDirectiveConfig>);
-
-  toConfig(): GraphQLDirectiveConfig & {
-    args: GraphQLFieldConfigArgumentMap;
-    isRepeatable: boolean;
-    extensions: Maybe<Readonly<Record<string, any>>>;
-  };
-
-  toString(): string;
-  toJSON(): string;
-  inspect(): string;
-}
-
-export interface GraphQLDirectiveConfig {
-  name: string;
-  description?: Maybe<string>;
-  locations: Array<DirectiveLocationEnum>;
-  args?: Maybe<GraphQLFieldConfigArgumentMap>;
-  isRepeatable?: Maybe<boolean>;
-  extensions?: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<DirectiveDefinitionNode>;
-}
-
-/**
- * Used to conditionally include fields or fragments.
- */
-export const GraphQLIncludeDirective: GraphQLDirective;
-
-/**
- * Used to conditionally skip (exclude) fields or fragments.
- */
-export const GraphQLSkipDirective: GraphQLDirective;
-
-/**
- * Constant string used for default reason for a deprecation.
- */
-export const DEFAULT_DEPRECATION_REASON: 'No longer supported';
-
-/**
- * Used to declare element of a GraphQL schema as deprecated.
- */
-export const GraphQLDeprecatedDirective: GraphQLDirective;
-
-/**
- * The full list of specified directives.
- */
-export const specifiedDirectives: ReadonlyArray<GraphQLDirective>;
-
-export function isSpecifiedDirective(directive: GraphQLDirective): boolean;
diff --git a/node_modules/graphql/type/directives.js b/node_modules/graphql/type/directives.js
deleted file mode 100644
index c839a22..0000000
--- a/node_modules/graphql/type/directives.js
+++ /dev/null
@@ -1,185 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.isDirective = isDirective;
-exports.assertDirective = assertDirective;
-exports.isSpecifiedDirective = isSpecifiedDirective;
-exports.specifiedDirectives = exports.GraphQLDeprecatedDirective = exports.DEFAULT_DEPRECATION_REASON = exports.GraphQLSkipDirective = exports.GraphQLIncludeDirective = exports.GraphQLDirective = void 0;
-
-var _objectEntries = _interopRequireDefault(require("../polyfills/objectEntries"));
-
-var _symbols = require("../polyfills/symbols");
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _toObjMap = _interopRequireDefault(require("../jsutils/toObjMap"));
-
-var _devAssert = _interopRequireDefault(require("../jsutils/devAssert"));
-
-var _instanceOf = _interopRequireDefault(require("../jsutils/instanceOf"));
-
-var _defineToJSON = _interopRequireDefault(require("../jsutils/defineToJSON"));
-
-var _isObjectLike = _interopRequireDefault(require("../jsutils/isObjectLike"));
-
-var _directiveLocation = require("../language/directiveLocation");
-
-var _scalars = require("./scalars");
-
-var _definition = require("./definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-// eslint-disable-next-line no-redeclare
-function isDirective(directive) {
-  return (0, _instanceOf.default)(directive, GraphQLDirective);
-}
-
-function assertDirective(directive) {
-  if (!isDirective(directive)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(directive), " to be a GraphQL directive."));
-  }
-
-  return directive;
-}
-/**
- * Directives are used by the GraphQL runtime as a way of modifying execution
- * behavior. Type system creators will usually not create these directly.
- */
-
-
-var GraphQLDirective =
-/*#__PURE__*/
-function () {
-  function GraphQLDirective(config) {
-    var _config$isRepeatable, _config$args;
-
-    this.name = config.name;
-    this.description = config.description;
-    this.locations = config.locations;
-    this.isRepeatable = (_config$isRepeatable = config.isRepeatable) !== null && _config$isRepeatable !== void 0 ? _config$isRepeatable : false;
-    this.extensions = config.extensions && (0, _toObjMap.default)(config.extensions);
-    this.astNode = config.astNode;
-    config.name || (0, _devAssert.default)(0, 'Directive must be named.');
-    Array.isArray(config.locations) || (0, _devAssert.default)(0, "@".concat(config.name, " locations must be an Array."));
-    var args = (_config$args = config.args) !== null && _config$args !== void 0 ? _config$args : {};
-    (0, _isObjectLike.default)(args) && !Array.isArray(args) || (0, _devAssert.default)(0, "@".concat(config.name, " args must be an object with argument names as keys."));
-    this.args = (0, _objectEntries.default)(args).map(function (_ref) {
-      var argName = _ref[0],
-          argConfig = _ref[1];
-      return {
-        name: argName,
-        description: argConfig.description,
-        type: argConfig.type,
-        defaultValue: argConfig.defaultValue,
-        extensions: argConfig.extensions && (0, _toObjMap.default)(argConfig.extensions),
-        astNode: argConfig.astNode
-      };
-    });
-  }
-
-  var _proto = GraphQLDirective.prototype;
-
-  _proto.toConfig = function toConfig() {
-    return {
-      name: this.name,
-      description: this.description,
-      locations: this.locations,
-      args: (0, _definition.argsToArgsConfig)(this.args),
-      isRepeatable: this.isRepeatable,
-      extensions: this.extensions,
-      astNode: this.astNode
-    };
-  };
-
-  _proto.toString = function toString() {
-    return '@' + this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLDirective, [{
-    key: _symbols.SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLDirective';
-    }
-  }]);
-
-  return GraphQLDirective;
-}();
-
-exports.GraphQLDirective = GraphQLDirective;
-(0, _defineToJSON.default)(GraphQLDirective);
-
-/**
- * Used to conditionally include fields or fragments.
- */
-var GraphQLIncludeDirective = new GraphQLDirective({
-  name: 'include',
-  description: 'Directs the executor to include this field or fragment only when the `if` argument is true.',
-  locations: [_directiveLocation.DirectiveLocation.FIELD, _directiveLocation.DirectiveLocation.FRAGMENT_SPREAD, _directiveLocation.DirectiveLocation.INLINE_FRAGMENT],
-  args: {
-    if: {
-      type: (0, _definition.GraphQLNonNull)(_scalars.GraphQLBoolean),
-      description: 'Included when true.'
-    }
-  }
-});
-/**
- * Used to conditionally skip (exclude) fields or fragments.
- */
-
-exports.GraphQLIncludeDirective = GraphQLIncludeDirective;
-var GraphQLSkipDirective = new GraphQLDirective({
-  name: 'skip',
-  description: 'Directs the executor to skip this field or fragment when the `if` argument is true.',
-  locations: [_directiveLocation.DirectiveLocation.FIELD, _directiveLocation.DirectiveLocation.FRAGMENT_SPREAD, _directiveLocation.DirectiveLocation.INLINE_FRAGMENT],
-  args: {
-    if: {
-      type: (0, _definition.GraphQLNonNull)(_scalars.GraphQLBoolean),
-      description: 'Skipped when true.'
-    }
-  }
-});
-/**
- * Constant string used for default reason for a deprecation.
- */
-
-exports.GraphQLSkipDirective = GraphQLSkipDirective;
-var DEFAULT_DEPRECATION_REASON = 'No longer supported';
-/**
- * Used to declare element of a GraphQL schema as deprecated.
- */
-
-exports.DEFAULT_DEPRECATION_REASON = DEFAULT_DEPRECATION_REASON;
-var GraphQLDeprecatedDirective = new GraphQLDirective({
-  name: 'deprecated',
-  description: 'Marks an element of a GraphQL schema as no longer supported.',
-  locations: [_directiveLocation.DirectiveLocation.FIELD_DEFINITION, _directiveLocation.DirectiveLocation.ENUM_VALUE],
-  args: {
-    reason: {
-      type: _scalars.GraphQLString,
-      description: 'Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).',
-      defaultValue: DEFAULT_DEPRECATION_REASON
-    }
-  }
-});
-/**
- * The full list of specified directives.
- */
-
-exports.GraphQLDeprecatedDirective = GraphQLDeprecatedDirective;
-var specifiedDirectives = Object.freeze([GraphQLIncludeDirective, GraphQLSkipDirective, GraphQLDeprecatedDirective]);
-exports.specifiedDirectives = specifiedDirectives;
-
-function isSpecifiedDirective(directive) {
-  return specifiedDirectives.some(function (_ref2) {
-    var name = _ref2.name;
-    return name === directive.name;
-  });
-}
diff --git a/node_modules/graphql/type/directives.js.flow b/node_modules/graphql/type/directives.js.flow
deleted file mode 100644
index d3ed6fd..0000000
--- a/node_modules/graphql/type/directives.js.flow
+++ /dev/null
@@ -1,208 +0,0 @@
-// @flow strict
-
-import objectEntries from '../polyfills/objectEntries';
-import { SYMBOL_TO_STRING_TAG } from '../polyfills/symbols';
-
-import inspect from '../jsutils/inspect';
-import toObjMap from '../jsutils/toObjMap';
-import devAssert from '../jsutils/devAssert';
-import instanceOf from '../jsutils/instanceOf';
-import defineToJSON from '../jsutils/defineToJSON';
-import isObjectLike from '../jsutils/isObjectLike';
-import {
-  type ReadOnlyObjMap,
-  type ReadOnlyObjMapLike,
-} from '../jsutils/ObjMap';
-
-import { type DirectiveDefinitionNode } from '../language/ast';
-import {
-  DirectiveLocation,
-  type DirectiveLocationEnum,
-} from '../language/directiveLocation';
-
-import { GraphQLString, GraphQLBoolean } from './scalars';
-import {
-  type GraphQLFieldConfigArgumentMap,
-  type GraphQLArgument,
-  argsToArgsConfig,
-  GraphQLNonNull,
-} from './definition';
-
-/**
- * Test if the given value is a GraphQL directive.
- */
-declare function isDirective(
-  directive: mixed,
-): boolean %checks(directive instanceof GraphQLDirective);
-// eslint-disable-next-line no-redeclare
-export function isDirective(directive) {
-  return instanceOf(directive, GraphQLDirective);
-}
-
-export function assertDirective(directive: mixed): GraphQLDirective {
-  if (!isDirective(directive)) {
-    throw new Error(
-      `Expected ${inspect(directive)} to be a GraphQL directive.`,
-    );
-  }
-  return directive;
-}
-
-/**
- * Directives are used by the GraphQL runtime as a way of modifying execution
- * behavior. Type system creators will usually not create these directly.
- */
-export class GraphQLDirective {
-  name: string;
-  description: ?string;
-  locations: Array<DirectiveLocationEnum>;
-  args: Array<GraphQLArgument>;
-  isRepeatable: boolean;
-  extensions: ?ReadOnlyObjMap<mixed>;
-  astNode: ?DirectiveDefinitionNode;
-
-  constructor(config: $ReadOnly<GraphQLDirectiveConfig>): void {
-    this.name = config.name;
-    this.description = config.description;
-    this.locations = config.locations;
-    this.isRepeatable = config.isRepeatable ?? false;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-
-    devAssert(config.name, 'Directive must be named.');
-    devAssert(
-      Array.isArray(config.locations),
-      `@${config.name} locations must be an Array.`,
-    );
-
-    const args = config.args ?? {};
-    devAssert(
-      isObjectLike(args) && !Array.isArray(args),
-      `@${config.name} args must be an object with argument names as keys.`,
-    );
-
-    this.args = objectEntries(args).map(([argName, argConfig]) => ({
-      name: argName,
-      description: argConfig.description,
-      type: argConfig.type,
-      defaultValue: argConfig.defaultValue,
-      extensions: argConfig.extensions && toObjMap(argConfig.extensions),
-      astNode: argConfig.astNode,
-    }));
-  }
-
-  toConfig(): {|
-    ...GraphQLDirectiveConfig,
-    args: GraphQLFieldConfigArgumentMap,
-    isRepeatable: boolean,
-    extensions: ?ReadOnlyObjMap<mixed>,
-  |} {
-    return {
-      name: this.name,
-      description: this.description,
-      locations: this.locations,
-      args: argsToArgsConfig(this.args),
-      isRepeatable: this.isRepeatable,
-      extensions: this.extensions,
-      astNode: this.astNode,
-    };
-  }
-
-  toString(): string {
-    return '@' + this.name;
-  }
-
-  // $FlowFixMe Flow doesn't support computed properties yet
-  get [SYMBOL_TO_STRING_TAG]() {
-    return 'GraphQLDirective';
-  }
-}
-
-defineToJSON(GraphQLDirective);
-
-export type GraphQLDirectiveConfig = {|
-  name: string,
-  description?: ?string,
-  locations: Array<DirectiveLocationEnum>,
-  args?: ?GraphQLFieldConfigArgumentMap,
-  isRepeatable?: ?boolean,
-  extensions?: ?ReadOnlyObjMapLike<mixed>,
-  astNode?: ?DirectiveDefinitionNode,
-|};
-
-/**
- * Used to conditionally include fields or fragments.
- */
-export const GraphQLIncludeDirective = new GraphQLDirective({
-  name: 'include',
-  description:
-    'Directs the executor to include this field or fragment only when the `if` argument is true.',
-  locations: [
-    DirectiveLocation.FIELD,
-    DirectiveLocation.FRAGMENT_SPREAD,
-    DirectiveLocation.INLINE_FRAGMENT,
-  ],
-  args: {
-    if: {
-      type: GraphQLNonNull(GraphQLBoolean),
-      description: 'Included when true.',
-    },
-  },
-});
-
-/**
- * Used to conditionally skip (exclude) fields or fragments.
- */
-export const GraphQLSkipDirective = new GraphQLDirective({
-  name: 'skip',
-  description:
-    'Directs the executor to skip this field or fragment when the `if` argument is true.',
-  locations: [
-    DirectiveLocation.FIELD,
-    DirectiveLocation.FRAGMENT_SPREAD,
-    DirectiveLocation.INLINE_FRAGMENT,
-  ],
-  args: {
-    if: {
-      type: GraphQLNonNull(GraphQLBoolean),
-      description: 'Skipped when true.',
-    },
-  },
-});
-
-/**
- * Constant string used for default reason for a deprecation.
- */
-export const DEFAULT_DEPRECATION_REASON = 'No longer supported';
-
-/**
- * Used to declare element of a GraphQL schema as deprecated.
- */
-export const GraphQLDeprecatedDirective = new GraphQLDirective({
-  name: 'deprecated',
-  description: 'Marks an element of a GraphQL schema as no longer supported.',
-  locations: [DirectiveLocation.FIELD_DEFINITION, DirectiveLocation.ENUM_VALUE],
-  args: {
-    reason: {
-      type: GraphQLString,
-      description:
-        'Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).',
-      defaultValue: DEFAULT_DEPRECATION_REASON,
-    },
-  },
-});
-
-/**
- * The full list of specified directives.
- */
-export const specifiedDirectives = Object.freeze([
-  GraphQLIncludeDirective,
-  GraphQLSkipDirective,
-  GraphQLDeprecatedDirective,
-]);
-
-export function isSpecifiedDirective(
-  directive: GraphQLDirective,
-): boolean %checks {
-  return specifiedDirectives.some(({ name }) => name === directive.name);
-}
diff --git a/node_modules/graphql/type/directives.mjs b/node_modules/graphql/type/directives.mjs
deleted file mode 100644
index 6461270..0000000
--- a/node_modules/graphql/type/directives.mjs
+++ /dev/null
@@ -1,156 +0,0 @@
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-import objectEntries from "../polyfills/objectEntries.mjs";
-import { SYMBOL_TO_STRING_TAG } from "../polyfills/symbols.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import toObjMap from "../jsutils/toObjMap.mjs";
-import devAssert from "../jsutils/devAssert.mjs";
-import instanceOf from "../jsutils/instanceOf.mjs";
-import defineToJSON from "../jsutils/defineToJSON.mjs";
-import isObjectLike from "../jsutils/isObjectLike.mjs";
-import { DirectiveLocation } from "../language/directiveLocation.mjs";
-import { GraphQLString, GraphQLBoolean } from "./scalars.mjs";
-import { argsToArgsConfig, GraphQLNonNull } from "./definition.mjs";
-/**
- * Test if the given value is a GraphQL directive.
- */
-
-// eslint-disable-next-line no-redeclare
-export function isDirective(directive) {
-  return instanceOf(directive, GraphQLDirective);
-}
-export function assertDirective(directive) {
-  if (!isDirective(directive)) {
-    throw new Error("Expected ".concat(inspect(directive), " to be a GraphQL directive."));
-  }
-
-  return directive;
-}
-/**
- * Directives are used by the GraphQL runtime as a way of modifying execution
- * behavior. Type system creators will usually not create these directly.
- */
-
-export var GraphQLDirective =
-/*#__PURE__*/
-function () {
-  function GraphQLDirective(config) {
-    var _config$isRepeatable, _config$args;
-
-    this.name = config.name;
-    this.description = config.description;
-    this.locations = config.locations;
-    this.isRepeatable = (_config$isRepeatable = config.isRepeatable) !== null && _config$isRepeatable !== void 0 ? _config$isRepeatable : false;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    config.name || devAssert(0, 'Directive must be named.');
-    Array.isArray(config.locations) || devAssert(0, "@".concat(config.name, " locations must be an Array."));
-    var args = (_config$args = config.args) !== null && _config$args !== void 0 ? _config$args : {};
-    isObjectLike(args) && !Array.isArray(args) || devAssert(0, "@".concat(config.name, " args must be an object with argument names as keys."));
-    this.args = objectEntries(args).map(function (_ref) {
-      var argName = _ref[0],
-          argConfig = _ref[1];
-      return {
-        name: argName,
-        description: argConfig.description,
-        type: argConfig.type,
-        defaultValue: argConfig.defaultValue,
-        extensions: argConfig.extensions && toObjMap(argConfig.extensions),
-        astNode: argConfig.astNode
-      };
-    });
-  }
-
-  var _proto = GraphQLDirective.prototype;
-
-  _proto.toConfig = function toConfig() {
-    return {
-      name: this.name,
-      description: this.description,
-      locations: this.locations,
-      args: argsToArgsConfig(this.args),
-      isRepeatable: this.isRepeatable,
-      extensions: this.extensions,
-      astNode: this.astNode
-    };
-  };
-
-  _proto.toString = function toString() {
-    return '@' + this.name;
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLDirective, [{
-    key: SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLDirective';
-    }
-  }]);
-
-  return GraphQLDirective;
-}();
-defineToJSON(GraphQLDirective);
-
-/**
- * Used to conditionally include fields or fragments.
- */
-export var GraphQLIncludeDirective = new GraphQLDirective({
-  name: 'include',
-  description: 'Directs the executor to include this field or fragment only when the `if` argument is true.',
-  locations: [DirectiveLocation.FIELD, DirectiveLocation.FRAGMENT_SPREAD, DirectiveLocation.INLINE_FRAGMENT],
-  args: {
-    if: {
-      type: GraphQLNonNull(GraphQLBoolean),
-      description: 'Included when true.'
-    }
-  }
-});
-/**
- * Used to conditionally skip (exclude) fields or fragments.
- */
-
-export var GraphQLSkipDirective = new GraphQLDirective({
-  name: 'skip',
-  description: 'Directs the executor to skip this field or fragment when the `if` argument is true.',
-  locations: [DirectiveLocation.FIELD, DirectiveLocation.FRAGMENT_SPREAD, DirectiveLocation.INLINE_FRAGMENT],
-  args: {
-    if: {
-      type: GraphQLNonNull(GraphQLBoolean),
-      description: 'Skipped when true.'
-    }
-  }
-});
-/**
- * Constant string used for default reason for a deprecation.
- */
-
-export var DEFAULT_DEPRECATION_REASON = 'No longer supported';
-/**
- * Used to declare element of a GraphQL schema as deprecated.
- */
-
-export var GraphQLDeprecatedDirective = new GraphQLDirective({
-  name: 'deprecated',
-  description: 'Marks an element of a GraphQL schema as no longer supported.',
-  locations: [DirectiveLocation.FIELD_DEFINITION, DirectiveLocation.ENUM_VALUE],
-  args: {
-    reason: {
-      type: GraphQLString,
-      description: 'Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).',
-      defaultValue: DEFAULT_DEPRECATION_REASON
-    }
-  }
-});
-/**
- * The full list of specified directives.
- */
-
-export var specifiedDirectives = Object.freeze([GraphQLIncludeDirective, GraphQLSkipDirective, GraphQLDeprecatedDirective]);
-export function isSpecifiedDirective(directive) {
-  return specifiedDirectives.some(function (_ref2) {
-    var name = _ref2.name;
-    return name === directive.name;
-  });
-}
diff --git a/node_modules/graphql/type/index.d.ts b/node_modules/graphql/type/index.d.ts
deleted file mode 100644
index b6780d8..0000000
--- a/node_modules/graphql/type/index.d.ts
+++ /dev/null
@@ -1,155 +0,0 @@
-export { Path as ResponsePath } from '../jsutils/Path';
-
-export {
-  // Predicate
-  isSchema,
-  // Assertion
-  assertSchema,
-  // GraphQL Schema definition
-  GraphQLSchema,
-  GraphQLSchemaConfig,
-} from './schema';
-
-export {
-  // Predicates
-  isType,
-  isScalarType,
-  isObjectType,
-  isInterfaceType,
-  isUnionType,
-  isEnumType,
-  isInputObjectType,
-  isListType,
-  isNonNullType,
-  isInputType,
-  isOutputType,
-  isLeafType,
-  isCompositeType,
-  isAbstractType,
-  isWrappingType,
-  isNullableType,
-  isNamedType,
-  isRequiredArgument,
-  isRequiredInputField,
-  // Assertions
-  assertType,
-  assertScalarType,
-  assertObjectType,
-  assertInterfaceType,
-  assertUnionType,
-  assertEnumType,
-  assertInputObjectType,
-  assertListType,
-  assertNonNullType,
-  assertInputType,
-  assertOutputType,
-  assertLeafType,
-  assertCompositeType,
-  assertAbstractType,
-  assertWrappingType,
-  assertNullableType,
-  assertNamedType,
-  // Un-modifiers
-  getNullableType,
-  getNamedType,
-  // Definitions
-  GraphQLScalarType,
-  GraphQLObjectType,
-  GraphQLInterfaceType,
-  GraphQLUnionType,
-  GraphQLEnumType,
-  GraphQLInputObjectType,
-  // Type Wrappers
-  GraphQLList,
-  GraphQLNonNull,
-  // type
-  GraphQLType,
-  GraphQLInputType,
-  GraphQLOutputType,
-  GraphQLLeafType,
-  GraphQLCompositeType,
-  GraphQLAbstractType,
-  GraphQLWrappingType,
-  GraphQLNullableType,
-  GraphQLNamedType,
-  Thunk,
-  GraphQLArgument,
-  GraphQLArgumentConfig,
-  GraphQLEnumTypeConfig,
-  GraphQLEnumValue,
-  GraphQLEnumValueConfig,
-  GraphQLEnumValueConfigMap,
-  GraphQLField,
-  GraphQLFieldConfig,
-  GraphQLFieldConfigArgumentMap,
-  GraphQLFieldConfigMap,
-  GraphQLFieldMap,
-  GraphQLFieldResolver,
-  GraphQLInputField,
-  GraphQLInputFieldConfig,
-  GraphQLInputFieldConfigMap,
-  GraphQLInputFieldMap,
-  GraphQLInputObjectTypeConfig,
-  GraphQLInterfaceTypeConfig,
-  GraphQLIsTypeOfFn,
-  GraphQLObjectTypeConfig,
-  GraphQLResolveInfo,
-  GraphQLScalarTypeConfig,
-  GraphQLTypeResolver,
-  GraphQLUnionTypeConfig,
-  GraphQLScalarSerializer,
-  GraphQLScalarValueParser,
-  GraphQLScalarLiteralParser,
-} from './definition';
-
-export {
-  // Predicate
-  isDirective,
-  // Assertion
-  assertDirective,
-  // Directives Definition
-  GraphQLDirective,
-  // Built-in Directives defined by the Spec
-  isSpecifiedDirective,
-  specifiedDirectives,
-  GraphQLIncludeDirective,
-  GraphQLSkipDirective,
-  GraphQLDeprecatedDirective,
-  // Constant Deprecation Reason
-  DEFAULT_DEPRECATION_REASON,
-  // type
-  GraphQLDirectiveConfig,
-} from './directives';
-
-// Common built-in scalar instances.
-export {
-  isSpecifiedScalarType,
-  specifiedScalarTypes,
-  GraphQLInt,
-  GraphQLFloat,
-  GraphQLString,
-  GraphQLBoolean,
-  GraphQLID,
-} from './scalars';
-
-export {
-  // "Enum" of Type Kinds
-  TypeKind,
-  // GraphQL Types for introspection.
-  isIntrospectionType,
-  introspectionTypes,
-  __Schema,
-  __Directive,
-  __DirectiveLocation,
-  __Type,
-  __Field,
-  __InputValue,
-  __EnumValue,
-  __TypeKind,
-  // Meta-field definitions.
-  SchemaMetaFieldDef,
-  TypeMetaFieldDef,
-  TypeNameMetaFieldDef,
-} from './introspection';
-
-export { validateSchema, assertValidSchema } from './validate';
diff --git a/node_modules/graphql/type/index.js b/node_modules/graphql/type/index.js
deleted file mode 100644
index 0cc85cb..0000000
--- a/node_modules/graphql/type/index.js
+++ /dev/null
@@ -1,503 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "isSchema", {
-  enumerable: true,
-  get: function get() {
-    return _schema.isSchema;
-  }
-});
-Object.defineProperty(exports, "assertSchema", {
-  enumerable: true,
-  get: function get() {
-    return _schema.assertSchema;
-  }
-});
-Object.defineProperty(exports, "GraphQLSchema", {
-  enumerable: true,
-  get: function get() {
-    return _schema.GraphQLSchema;
-  }
-});
-Object.defineProperty(exports, "isType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isType;
-  }
-});
-Object.defineProperty(exports, "isScalarType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isScalarType;
-  }
-});
-Object.defineProperty(exports, "isObjectType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isObjectType;
-  }
-});
-Object.defineProperty(exports, "isInterfaceType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isInterfaceType;
-  }
-});
-Object.defineProperty(exports, "isUnionType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isUnionType;
-  }
-});
-Object.defineProperty(exports, "isEnumType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isEnumType;
-  }
-});
-Object.defineProperty(exports, "isInputObjectType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isInputObjectType;
-  }
-});
-Object.defineProperty(exports, "isListType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isListType;
-  }
-});
-Object.defineProperty(exports, "isNonNullType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isNonNullType;
-  }
-});
-Object.defineProperty(exports, "isInputType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isInputType;
-  }
-});
-Object.defineProperty(exports, "isOutputType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isOutputType;
-  }
-});
-Object.defineProperty(exports, "isLeafType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isLeafType;
-  }
-});
-Object.defineProperty(exports, "isCompositeType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isCompositeType;
-  }
-});
-Object.defineProperty(exports, "isAbstractType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isAbstractType;
-  }
-});
-Object.defineProperty(exports, "isWrappingType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isWrappingType;
-  }
-});
-Object.defineProperty(exports, "isNullableType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isNullableType;
-  }
-});
-Object.defineProperty(exports, "isNamedType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isNamedType;
-  }
-});
-Object.defineProperty(exports, "isRequiredArgument", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isRequiredArgument;
-  }
-});
-Object.defineProperty(exports, "isRequiredInputField", {
-  enumerable: true,
-  get: function get() {
-    return _definition.isRequiredInputField;
-  }
-});
-Object.defineProperty(exports, "assertType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertType;
-  }
-});
-Object.defineProperty(exports, "assertScalarType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertScalarType;
-  }
-});
-Object.defineProperty(exports, "assertObjectType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertObjectType;
-  }
-});
-Object.defineProperty(exports, "assertInterfaceType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertInterfaceType;
-  }
-});
-Object.defineProperty(exports, "assertUnionType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertUnionType;
-  }
-});
-Object.defineProperty(exports, "assertEnumType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertEnumType;
-  }
-});
-Object.defineProperty(exports, "assertInputObjectType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertInputObjectType;
-  }
-});
-Object.defineProperty(exports, "assertListType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertListType;
-  }
-});
-Object.defineProperty(exports, "assertNonNullType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertNonNullType;
-  }
-});
-Object.defineProperty(exports, "assertInputType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertInputType;
-  }
-});
-Object.defineProperty(exports, "assertOutputType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertOutputType;
-  }
-});
-Object.defineProperty(exports, "assertLeafType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertLeafType;
-  }
-});
-Object.defineProperty(exports, "assertCompositeType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertCompositeType;
-  }
-});
-Object.defineProperty(exports, "assertAbstractType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertAbstractType;
-  }
-});
-Object.defineProperty(exports, "assertWrappingType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertWrappingType;
-  }
-});
-Object.defineProperty(exports, "assertNullableType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertNullableType;
-  }
-});
-Object.defineProperty(exports, "assertNamedType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.assertNamedType;
-  }
-});
-Object.defineProperty(exports, "getNullableType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.getNullableType;
-  }
-});
-Object.defineProperty(exports, "getNamedType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.getNamedType;
-  }
-});
-Object.defineProperty(exports, "GraphQLScalarType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.GraphQLScalarType;
-  }
-});
-Object.defineProperty(exports, "GraphQLObjectType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.GraphQLObjectType;
-  }
-});
-Object.defineProperty(exports, "GraphQLInterfaceType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.GraphQLInterfaceType;
-  }
-});
-Object.defineProperty(exports, "GraphQLUnionType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.GraphQLUnionType;
-  }
-});
-Object.defineProperty(exports, "GraphQLEnumType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.GraphQLEnumType;
-  }
-});
-Object.defineProperty(exports, "GraphQLInputObjectType", {
-  enumerable: true,
-  get: function get() {
-    return _definition.GraphQLInputObjectType;
-  }
-});
-Object.defineProperty(exports, "GraphQLList", {
-  enumerable: true,
-  get: function get() {
-    return _definition.GraphQLList;
-  }
-});
-Object.defineProperty(exports, "GraphQLNonNull", {
-  enumerable: true,
-  get: function get() {
-    return _definition.GraphQLNonNull;
-  }
-});
-Object.defineProperty(exports, "isDirective", {
-  enumerable: true,
-  get: function get() {
-    return _directives.isDirective;
-  }
-});
-Object.defineProperty(exports, "assertDirective", {
-  enumerable: true,
-  get: function get() {
-    return _directives.assertDirective;
-  }
-});
-Object.defineProperty(exports, "GraphQLDirective", {
-  enumerable: true,
-  get: function get() {
-    return _directives.GraphQLDirective;
-  }
-});
-Object.defineProperty(exports, "isSpecifiedDirective", {
-  enumerable: true,
-  get: function get() {
-    return _directives.isSpecifiedDirective;
-  }
-});
-Object.defineProperty(exports, "specifiedDirectives", {
-  enumerable: true,
-  get: function get() {
-    return _directives.specifiedDirectives;
-  }
-});
-Object.defineProperty(exports, "GraphQLIncludeDirective", {
-  enumerable: true,
-  get: function get() {
-    return _directives.GraphQLIncludeDirective;
-  }
-});
-Object.defineProperty(exports, "GraphQLSkipDirective", {
-  enumerable: true,
-  get: function get() {
-    return _directives.GraphQLSkipDirective;
-  }
-});
-Object.defineProperty(exports, "GraphQLDeprecatedDirective", {
-  enumerable: true,
-  get: function get() {
-    return _directives.GraphQLDeprecatedDirective;
-  }
-});
-Object.defineProperty(exports, "DEFAULT_DEPRECATION_REASON", {
-  enumerable: true,
-  get: function get() {
-    return _directives.DEFAULT_DEPRECATION_REASON;
-  }
-});
-Object.defineProperty(exports, "isSpecifiedScalarType", {
-  enumerable: true,
-  get: function get() {
-    return _scalars.isSpecifiedScalarType;
-  }
-});
-Object.defineProperty(exports, "specifiedScalarTypes", {
-  enumerable: true,
-  get: function get() {
-    return _scalars.specifiedScalarTypes;
-  }
-});
-Object.defineProperty(exports, "GraphQLInt", {
-  enumerable: true,
-  get: function get() {
-    return _scalars.GraphQLInt;
-  }
-});
-Object.defineProperty(exports, "GraphQLFloat", {
-  enumerable: true,
-  get: function get() {
-    return _scalars.GraphQLFloat;
-  }
-});
-Object.defineProperty(exports, "GraphQLString", {
-  enumerable: true,
-  get: function get() {
-    return _scalars.GraphQLString;
-  }
-});
-Object.defineProperty(exports, "GraphQLBoolean", {
-  enumerable: true,
-  get: function get() {
-    return _scalars.GraphQLBoolean;
-  }
-});
-Object.defineProperty(exports, "GraphQLID", {
-  enumerable: true,
-  get: function get() {
-    return _scalars.GraphQLID;
-  }
-});
-Object.defineProperty(exports, "isIntrospectionType", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.isIntrospectionType;
-  }
-});
-Object.defineProperty(exports, "introspectionTypes", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.introspectionTypes;
-  }
-});
-Object.defineProperty(exports, "__Schema", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.__Schema;
-  }
-});
-Object.defineProperty(exports, "__Directive", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.__Directive;
-  }
-});
-Object.defineProperty(exports, "__DirectiveLocation", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.__DirectiveLocation;
-  }
-});
-Object.defineProperty(exports, "__Type", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.__Type;
-  }
-});
-Object.defineProperty(exports, "__Field", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.__Field;
-  }
-});
-Object.defineProperty(exports, "__InputValue", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.__InputValue;
-  }
-});
-Object.defineProperty(exports, "__EnumValue", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.__EnumValue;
-  }
-});
-Object.defineProperty(exports, "__TypeKind", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.__TypeKind;
-  }
-});
-Object.defineProperty(exports, "TypeKind", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.TypeKind;
-  }
-});
-Object.defineProperty(exports, "SchemaMetaFieldDef", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.SchemaMetaFieldDef;
-  }
-});
-Object.defineProperty(exports, "TypeMetaFieldDef", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.TypeMetaFieldDef;
-  }
-});
-Object.defineProperty(exports, "TypeNameMetaFieldDef", {
-  enumerable: true,
-  get: function get() {
-    return _introspection.TypeNameMetaFieldDef;
-  }
-});
-Object.defineProperty(exports, "validateSchema", {
-  enumerable: true,
-  get: function get() {
-    return _validate.validateSchema;
-  }
-});
-Object.defineProperty(exports, "assertValidSchema", {
-  enumerable: true,
-  get: function get() {
-    return _validate.assertValidSchema;
-  }
-});
-
-var _schema = require("./schema");
-
-var _definition = require("./definition");
-
-var _directives = require("./directives");
-
-var _scalars = require("./scalars");
-
-var _introspection = require("./introspection");
-
-var _validate = require("./validate");
diff --git a/node_modules/graphql/type/index.js.flow b/node_modules/graphql/type/index.js.flow
deleted file mode 100644
index ec87a1c..0000000
--- a/node_modules/graphql/type/index.js.flow
+++ /dev/null
@@ -1,163 +0,0 @@
-// @flow strict
-
-export type { Path as ResponsePath } from '../jsutils/Path';
-
-export {
-  // Predicate
-  isSchema,
-  // Assertion
-  assertSchema,
-  // GraphQL Schema definition
-  GraphQLSchema,
-} from './schema';
-export type { GraphQLSchemaConfig } from './schema';
-
-export {
-  // Predicates
-  isType,
-  isScalarType,
-  isObjectType,
-  isInterfaceType,
-  isUnionType,
-  isEnumType,
-  isInputObjectType,
-  isListType,
-  isNonNullType,
-  isInputType,
-  isOutputType,
-  isLeafType,
-  isCompositeType,
-  isAbstractType,
-  isWrappingType,
-  isNullableType,
-  isNamedType,
-  isRequiredArgument,
-  isRequiredInputField,
-  // Assertions
-  assertType,
-  assertScalarType,
-  assertObjectType,
-  assertInterfaceType,
-  assertUnionType,
-  assertEnumType,
-  assertInputObjectType,
-  assertListType,
-  assertNonNullType,
-  assertInputType,
-  assertOutputType,
-  assertLeafType,
-  assertCompositeType,
-  assertAbstractType,
-  assertWrappingType,
-  assertNullableType,
-  assertNamedType,
-  // Un-modifiers
-  getNullableType,
-  getNamedType,
-  // Definitions
-  GraphQLScalarType,
-  GraphQLObjectType,
-  GraphQLInterfaceType,
-  GraphQLUnionType,
-  GraphQLEnumType,
-  GraphQLInputObjectType,
-  // Type Wrappers
-  GraphQLList,
-  GraphQLNonNull,
-} from './definition';
-
-export {
-  // Predicate
-  isDirective,
-  // Assertion
-  assertDirective,
-  // Directives Definition
-  GraphQLDirective,
-  // Built-in Directives defined by the Spec
-  isSpecifiedDirective,
-  specifiedDirectives,
-  GraphQLIncludeDirective,
-  GraphQLSkipDirective,
-  GraphQLDeprecatedDirective,
-  // Constant Deprecation Reason
-  DEFAULT_DEPRECATION_REASON,
-} from './directives';
-
-export type { GraphQLDirectiveConfig } from './directives';
-
-// Common built-in scalar instances.
-export {
-  // Predicate
-  isSpecifiedScalarType,
-  // Standard GraphQL Scalars
-  specifiedScalarTypes,
-  GraphQLInt,
-  GraphQLFloat,
-  GraphQLString,
-  GraphQLBoolean,
-  GraphQLID,
-} from './scalars';
-
-export {
-  // Predicate
-  isIntrospectionType,
-  // GraphQL Types for introspection.
-  introspectionTypes,
-  __Schema,
-  __Directive,
-  __DirectiveLocation,
-  __Type,
-  __Field,
-  __InputValue,
-  __EnumValue,
-  __TypeKind,
-  // "Enum" of Type Kinds
-  TypeKind,
-  // Meta-field definitions.
-  SchemaMetaFieldDef,
-  TypeMetaFieldDef,
-  TypeNameMetaFieldDef,
-} from './introspection';
-
-export type {
-  GraphQLType,
-  GraphQLInputType,
-  GraphQLOutputType,
-  GraphQLLeafType,
-  GraphQLCompositeType,
-  GraphQLAbstractType,
-  GraphQLWrappingType,
-  GraphQLNullableType,
-  GraphQLNamedType,
-  Thunk,
-  GraphQLArgument,
-  GraphQLArgumentConfig,
-  GraphQLEnumTypeConfig,
-  GraphQLEnumValue,
-  GraphQLEnumValueConfig,
-  GraphQLEnumValueConfigMap,
-  GraphQLField,
-  GraphQLFieldConfig,
-  GraphQLFieldConfigArgumentMap,
-  GraphQLFieldConfigMap,
-  GraphQLFieldMap,
-  GraphQLFieldResolver,
-  GraphQLInputField,
-  GraphQLInputFieldConfig,
-  GraphQLInputFieldConfigMap,
-  GraphQLInputFieldMap,
-  GraphQLInputObjectTypeConfig,
-  GraphQLInterfaceTypeConfig,
-  GraphQLIsTypeOfFn,
-  GraphQLObjectTypeConfig,
-  GraphQLResolveInfo,
-  GraphQLScalarTypeConfig,
-  GraphQLTypeResolver,
-  GraphQLUnionTypeConfig,
-  GraphQLScalarSerializer,
-  GraphQLScalarValueParser,
-  GraphQLScalarLiteralParser,
-} from './definition';
-
-// Validate GraphQL schema.
-export { validateSchema, assertValidSchema } from './validate';
diff --git a/node_modules/graphql/type/index.mjs b/node_modules/graphql/type/index.mjs
deleted file mode 100644
index 0004f08..0000000
--- a/node_modules/graphql/type/index.mjs
+++ /dev/null
@@ -1,27 +0,0 @@
-export { // Predicate
-isSchema // Assertion
-, assertSchema // GraphQL Schema definition
-, GraphQLSchema } from "./schema.mjs";
-export { // Predicates
-isType, isScalarType, isObjectType, isInterfaceType, isUnionType, isEnumType, isInputObjectType, isListType, isNonNullType, isInputType, isOutputType, isLeafType, isCompositeType, isAbstractType, isWrappingType, isNullableType, isNamedType, isRequiredArgument, isRequiredInputField // Assertions
-, assertType, assertScalarType, assertObjectType, assertInterfaceType, assertUnionType, assertEnumType, assertInputObjectType, assertListType, assertNonNullType, assertInputType, assertOutputType, assertLeafType, assertCompositeType, assertAbstractType, assertWrappingType, assertNullableType, assertNamedType // Un-modifiers
-, getNullableType, getNamedType // Definitions
-, GraphQLScalarType, GraphQLObjectType, GraphQLInterfaceType, GraphQLUnionType, GraphQLEnumType, GraphQLInputObjectType // Type Wrappers
-, GraphQLList, GraphQLNonNull } from "./definition.mjs";
-export { // Predicate
-isDirective // Assertion
-, assertDirective // Directives Definition
-, GraphQLDirective // Built-in Directives defined by the Spec
-, isSpecifiedDirective, specifiedDirectives, GraphQLIncludeDirective, GraphQLSkipDirective, GraphQLDeprecatedDirective // Constant Deprecation Reason
-, DEFAULT_DEPRECATION_REASON } from "./directives.mjs";
-// Common built-in scalar instances.
-export { // Predicate
-isSpecifiedScalarType // Standard GraphQL Scalars
-, specifiedScalarTypes, GraphQLInt, GraphQLFloat, GraphQLString, GraphQLBoolean, GraphQLID } from "./scalars.mjs";
-export { // Predicate
-isIntrospectionType // GraphQL Types for introspection.
-, introspectionTypes, __Schema, __Directive, __DirectiveLocation, __Type, __Field, __InputValue, __EnumValue, __TypeKind // "Enum" of Type Kinds
-, TypeKind // Meta-field definitions.
-, SchemaMetaFieldDef, TypeMetaFieldDef, TypeNameMetaFieldDef } from "./introspection.mjs";
-// Validate GraphQL schema.
-export { validateSchema, assertValidSchema } from "./validate.mjs";
diff --git a/node_modules/graphql/type/introspection.d.ts b/node_modules/graphql/type/introspection.d.ts
deleted file mode 100644
index 34cefa7..0000000
--- a/node_modules/graphql/type/introspection.d.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import {
-  GraphQLObjectType,
-  GraphQLField,
-  GraphQLEnumType,
-  GraphQLNamedType,
-} from './definition';
-
-export const __Schema: GraphQLObjectType;
-export const __Directive: GraphQLObjectType;
-export const __DirectiveLocation: GraphQLEnumType;
-export const __Type: GraphQLObjectType;
-export const __Field: GraphQLObjectType;
-export const __InputValue: GraphQLObjectType;
-export const __EnumValue: GraphQLObjectType;
-
-export const TypeKind: {
-  SCALAR: 'SCALAR';
-  OBJECT: 'OBJECT';
-  INTERFACE: 'INTERFACE';
-  UNION: 'UNION';
-  ENUM: 'ENUM';
-  INPUT_OBJECT: 'INPUT_OBJECT';
-  LIST: 'LIST';
-  NON_NULL: 'NON_NULL';
-};
-
-export const __TypeKind: GraphQLEnumType;
-
-/**
- * Note that these are GraphQLField and not GraphQLFieldConfig,
- * so the format for args is different.
- */
-
-export const SchemaMetaFieldDef: GraphQLField<any, any>;
-export const TypeMetaFieldDef: GraphQLField<any, any>;
-export const TypeNameMetaFieldDef: GraphQLField<any, any>;
-
-export const introspectionTypes: ReadonlyArray<GraphQLNamedType>;
-
-export function isIntrospectionType(type: GraphQLNamedType): boolean;
diff --git a/node_modules/graphql/type/introspection.js b/node_modules/graphql/type/introspection.js
deleted file mode 100644
index 72d427f..0000000
--- a/node_modules/graphql/type/introspection.js
+++ /dev/null
@@ -1,589 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.isIntrospectionType = isIntrospectionType;
-exports.introspectionTypes = exports.TypeNameMetaFieldDef = exports.TypeMetaFieldDef = exports.SchemaMetaFieldDef = exports.__TypeKind = exports.TypeKind = exports.__EnumValue = exports.__InputValue = exports.__Field = exports.__Type = exports.__DirectiveLocation = exports.__Directive = exports.__Schema = void 0;
-
-var _objectValues = _interopRequireDefault(require("../polyfills/objectValues"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _invariant = _interopRequireDefault(require("../jsutils/invariant"));
-
-var _printer = require("../language/printer");
-
-var _directiveLocation = require("../language/directiveLocation");
-
-var _astFromValue = require("../utilities/astFromValue");
-
-var _scalars = require("./scalars");
-
-var _definition = require("./definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-// FIXME
-
-/* eslint-disable import/no-cycle */
-var __Schema = new _definition.GraphQLObjectType({
-  name: '__Schema',
-  description: 'A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.',
-  fields: function fields() {
-    return {
-      description: {
-        type: _scalars.GraphQLString,
-        resolve: function resolve(schema) {
-          return schema.description;
-        }
-      },
-      types: {
-        description: 'A list of all types supported by this server.',
-        type: (0, _definition.GraphQLNonNull)((0, _definition.GraphQLList)((0, _definition.GraphQLNonNull)(__Type))),
-        resolve: function resolve(schema) {
-          return (0, _objectValues.default)(schema.getTypeMap());
-        }
-      },
-      queryType: {
-        description: 'The type that query operations will be rooted at.',
-        type: (0, _definition.GraphQLNonNull)(__Type),
-        resolve: function resolve(schema) {
-          return schema.getQueryType();
-        }
-      },
-      mutationType: {
-        description: 'If this server supports mutation, the type that mutation operations will be rooted at.',
-        type: __Type,
-        resolve: function resolve(schema) {
-          return schema.getMutationType();
-        }
-      },
-      subscriptionType: {
-        description: 'If this server support subscription, the type that subscription operations will be rooted at.',
-        type: __Type,
-        resolve: function resolve(schema) {
-          return schema.getSubscriptionType();
-        }
-      },
-      directives: {
-        description: 'A list of all directives supported by this server.',
-        type: (0, _definition.GraphQLNonNull)((0, _definition.GraphQLList)((0, _definition.GraphQLNonNull)(__Directive))),
-        resolve: function resolve(schema) {
-          return schema.getDirectives();
-        }
-      }
-    };
-  }
-});
-
-exports.__Schema = __Schema;
-
-var __Directive = new _definition.GraphQLObjectType({
-  name: '__Directive',
-  description: "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
-  fields: function fields() {
-    return {
-      name: {
-        type: (0, _definition.GraphQLNonNull)(_scalars.GraphQLString),
-        resolve: function resolve(directive) {
-          return directive.name;
-        }
-      },
-      description: {
-        type: _scalars.GraphQLString,
-        resolve: function resolve(directive) {
-          return directive.description;
-        }
-      },
-      isRepeatable: {
-        type: (0, _definition.GraphQLNonNull)(_scalars.GraphQLBoolean),
-        resolve: function resolve(directive) {
-          return directive.isRepeatable;
-        }
-      },
-      locations: {
-        type: (0, _definition.GraphQLNonNull)((0, _definition.GraphQLList)((0, _definition.GraphQLNonNull)(__DirectiveLocation))),
-        resolve: function resolve(directive) {
-          return directive.locations;
-        }
-      },
-      args: {
-        type: (0, _definition.GraphQLNonNull)((0, _definition.GraphQLList)((0, _definition.GraphQLNonNull)(__InputValue))),
-        resolve: function resolve(directive) {
-          return directive.args;
-        }
-      }
-    };
-  }
-});
-
-exports.__Directive = __Directive;
-
-var __DirectiveLocation = new _definition.GraphQLEnumType({
-  name: '__DirectiveLocation',
-  description: 'A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.',
-  values: {
-    QUERY: {
-      value: _directiveLocation.DirectiveLocation.QUERY,
-      description: 'Location adjacent to a query operation.'
-    },
-    MUTATION: {
-      value: _directiveLocation.DirectiveLocation.MUTATION,
-      description: 'Location adjacent to a mutation operation.'
-    },
-    SUBSCRIPTION: {
-      value: _directiveLocation.DirectiveLocation.SUBSCRIPTION,
-      description: 'Location adjacent to a subscription operation.'
-    },
-    FIELD: {
-      value: _directiveLocation.DirectiveLocation.FIELD,
-      description: 'Location adjacent to a field.'
-    },
-    FRAGMENT_DEFINITION: {
-      value: _directiveLocation.DirectiveLocation.FRAGMENT_DEFINITION,
-      description: 'Location adjacent to a fragment definition.'
-    },
-    FRAGMENT_SPREAD: {
-      value: _directiveLocation.DirectiveLocation.FRAGMENT_SPREAD,
-      description: 'Location adjacent to a fragment spread.'
-    },
-    INLINE_FRAGMENT: {
-      value: _directiveLocation.DirectiveLocation.INLINE_FRAGMENT,
-      description: 'Location adjacent to an inline fragment.'
-    },
-    VARIABLE_DEFINITION: {
-      value: _directiveLocation.DirectiveLocation.VARIABLE_DEFINITION,
-      description: 'Location adjacent to a variable definition.'
-    },
-    SCHEMA: {
-      value: _directiveLocation.DirectiveLocation.SCHEMA,
-      description: 'Location adjacent to a schema definition.'
-    },
-    SCALAR: {
-      value: _directiveLocation.DirectiveLocation.SCALAR,
-      description: 'Location adjacent to a scalar definition.'
-    },
-    OBJECT: {
-      value: _directiveLocation.DirectiveLocation.OBJECT,
-      description: 'Location adjacent to an object type definition.'
-    },
-    FIELD_DEFINITION: {
-      value: _directiveLocation.DirectiveLocation.FIELD_DEFINITION,
-      description: 'Location adjacent to a field definition.'
-    },
-    ARGUMENT_DEFINITION: {
-      value: _directiveLocation.DirectiveLocation.ARGUMENT_DEFINITION,
-      description: 'Location adjacent to an argument definition.'
-    },
-    INTERFACE: {
-      value: _directiveLocation.DirectiveLocation.INTERFACE,
-      description: 'Location adjacent to an interface definition.'
-    },
-    UNION: {
-      value: _directiveLocation.DirectiveLocation.UNION,
-      description: 'Location adjacent to a union definition.'
-    },
-    ENUM: {
-      value: _directiveLocation.DirectiveLocation.ENUM,
-      description: 'Location adjacent to an enum definition.'
-    },
-    ENUM_VALUE: {
-      value: _directiveLocation.DirectiveLocation.ENUM_VALUE,
-      description: 'Location adjacent to an enum value definition.'
-    },
-    INPUT_OBJECT: {
-      value: _directiveLocation.DirectiveLocation.INPUT_OBJECT,
-      description: 'Location adjacent to an input object type definition.'
-    },
-    INPUT_FIELD_DEFINITION: {
-      value: _directiveLocation.DirectiveLocation.INPUT_FIELD_DEFINITION,
-      description: 'Location adjacent to an input object field definition.'
-    }
-  }
-});
-
-exports.__DirectiveLocation = __DirectiveLocation;
-
-var __Type = new _definition.GraphQLObjectType({
-  name: '__Type',
-  description: 'The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name and description, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.',
-  fields: function fields() {
-    return {
-      kind: {
-        type: (0, _definition.GraphQLNonNull)(__TypeKind),
-        resolve: function resolve(type) {
-          if ((0, _definition.isScalarType)(type)) {
-            return TypeKind.SCALAR;
-          }
-
-          if ((0, _definition.isObjectType)(type)) {
-            return TypeKind.OBJECT;
-          }
-
-          if ((0, _definition.isInterfaceType)(type)) {
-            return TypeKind.INTERFACE;
-          }
-
-          if ((0, _definition.isUnionType)(type)) {
-            return TypeKind.UNION;
-          }
-
-          if ((0, _definition.isEnumType)(type)) {
-            return TypeKind.ENUM;
-          }
-
-          if ((0, _definition.isInputObjectType)(type)) {
-            return TypeKind.INPUT_OBJECT;
-          }
-
-          if ((0, _definition.isListType)(type)) {
-            return TypeKind.LIST;
-          }
-
-          /* istanbul ignore else */
-          if ((0, _definition.isNonNullType)(type)) {
-            return TypeKind.NON_NULL;
-          } // Not reachable. All possible types have been considered.
-
-
-          /* istanbul ignore next */
-          (0, _invariant.default)(false, "Unexpected type: \"".concat((0, _inspect.default)(type), "\"."));
-        }
-      },
-      name: {
-        type: _scalars.GraphQLString,
-        resolve: function resolve(type) {
-          return type.name !== undefined ? type.name : undefined;
-        }
-      },
-      description: {
-        type: _scalars.GraphQLString,
-        resolve: function resolve(type) {
-          return type.description !== undefined ? type.description : undefined;
-        }
-      },
-      fields: {
-        type: (0, _definition.GraphQLList)((0, _definition.GraphQLNonNull)(__Field)),
-        args: {
-          includeDeprecated: {
-            type: _scalars.GraphQLBoolean,
-            defaultValue: false
-          }
-        },
-        resolve: function resolve(type, _ref) {
-          var includeDeprecated = _ref.includeDeprecated;
-
-          if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type)) {
-            var fields = (0, _objectValues.default)(type.getFields());
-
-            if (!includeDeprecated) {
-              fields = fields.filter(function (field) {
-                return !field.isDeprecated;
-              });
-            }
-
-            return fields;
-          }
-
-          return null;
-        }
-      },
-      interfaces: {
-        type: (0, _definition.GraphQLList)((0, _definition.GraphQLNonNull)(__Type)),
-        resolve: function resolve(type) {
-          if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type)) {
-            return type.getInterfaces();
-          }
-        }
-      },
-      possibleTypes: {
-        type: (0, _definition.GraphQLList)((0, _definition.GraphQLNonNull)(__Type)),
-        resolve: function resolve(type, _args, _context, _ref2) {
-          var schema = _ref2.schema;
-
-          if ((0, _definition.isAbstractType)(type)) {
-            return schema.getPossibleTypes(type);
-          }
-        }
-      },
-      enumValues: {
-        type: (0, _definition.GraphQLList)((0, _definition.GraphQLNonNull)(__EnumValue)),
-        args: {
-          includeDeprecated: {
-            type: _scalars.GraphQLBoolean,
-            defaultValue: false
-          }
-        },
-        resolve: function resolve(type, _ref3) {
-          var includeDeprecated = _ref3.includeDeprecated;
-
-          if ((0, _definition.isEnumType)(type)) {
-            var values = type.getValues();
-
-            if (!includeDeprecated) {
-              values = values.filter(function (value) {
-                return !value.isDeprecated;
-              });
-            }
-
-            return values;
-          }
-        }
-      },
-      inputFields: {
-        type: (0, _definition.GraphQLList)((0, _definition.GraphQLNonNull)(__InputValue)),
-        resolve: function resolve(type) {
-          if ((0, _definition.isInputObjectType)(type)) {
-            return (0, _objectValues.default)(type.getFields());
-          }
-        }
-      },
-      ofType: {
-        type: __Type,
-        resolve: function resolve(type) {
-          return type.ofType !== undefined ? type.ofType : undefined;
-        }
-      }
-    };
-  }
-});
-
-exports.__Type = __Type;
-
-var __Field = new _definition.GraphQLObjectType({
-  name: '__Field',
-  description: 'Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.',
-  fields: function fields() {
-    return {
-      name: {
-        type: (0, _definition.GraphQLNonNull)(_scalars.GraphQLString),
-        resolve: function resolve(field) {
-          return field.name;
-        }
-      },
-      description: {
-        type: _scalars.GraphQLString,
-        resolve: function resolve(field) {
-          return field.description;
-        }
-      },
-      args: {
-        type: (0, _definition.GraphQLNonNull)((0, _definition.GraphQLList)((0, _definition.GraphQLNonNull)(__InputValue))),
-        resolve: function resolve(field) {
-          return field.args;
-        }
-      },
-      type: {
-        type: (0, _definition.GraphQLNonNull)(__Type),
-        resolve: function resolve(field) {
-          return field.type;
-        }
-      },
-      isDeprecated: {
-        type: (0, _definition.GraphQLNonNull)(_scalars.GraphQLBoolean),
-        resolve: function resolve(field) {
-          return field.isDeprecated;
-        }
-      },
-      deprecationReason: {
-        type: _scalars.GraphQLString,
-        resolve: function resolve(field) {
-          return field.deprecationReason;
-        }
-      }
-    };
-  }
-});
-
-exports.__Field = __Field;
-
-var __InputValue = new _definition.GraphQLObjectType({
-  name: '__InputValue',
-  description: 'Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.',
-  fields: function fields() {
-    return {
-      name: {
-        type: (0, _definition.GraphQLNonNull)(_scalars.GraphQLString),
-        resolve: function resolve(inputValue) {
-          return inputValue.name;
-        }
-      },
-      description: {
-        type: _scalars.GraphQLString,
-        resolve: function resolve(inputValue) {
-          return inputValue.description;
-        }
-      },
-      type: {
-        type: (0, _definition.GraphQLNonNull)(__Type),
-        resolve: function resolve(inputValue) {
-          return inputValue.type;
-        }
-      },
-      defaultValue: {
-        type: _scalars.GraphQLString,
-        description: 'A GraphQL-formatted string representing the default value for this input value.',
-        resolve: function resolve(inputValue) {
-          var type = inputValue.type,
-              defaultValue = inputValue.defaultValue;
-          var valueAST = (0, _astFromValue.astFromValue)(defaultValue, type);
-          return valueAST ? (0, _printer.print)(valueAST) : null;
-        }
-      }
-    };
-  }
-});
-
-exports.__InputValue = __InputValue;
-
-var __EnumValue = new _definition.GraphQLObjectType({
-  name: '__EnumValue',
-  description: 'One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.',
-  fields: function fields() {
-    return {
-      name: {
-        type: (0, _definition.GraphQLNonNull)(_scalars.GraphQLString),
-        resolve: function resolve(enumValue) {
-          return enumValue.name;
-        }
-      },
-      description: {
-        type: _scalars.GraphQLString,
-        resolve: function resolve(enumValue) {
-          return enumValue.description;
-        }
-      },
-      isDeprecated: {
-        type: (0, _definition.GraphQLNonNull)(_scalars.GraphQLBoolean),
-        resolve: function resolve(enumValue) {
-          return enumValue.isDeprecated;
-        }
-      },
-      deprecationReason: {
-        type: _scalars.GraphQLString,
-        resolve: function resolve(enumValue) {
-          return enumValue.deprecationReason;
-        }
-      }
-    };
-  }
-});
-
-exports.__EnumValue = __EnumValue;
-var TypeKind = Object.freeze({
-  SCALAR: 'SCALAR',
-  OBJECT: 'OBJECT',
-  INTERFACE: 'INTERFACE',
-  UNION: 'UNION',
-  ENUM: 'ENUM',
-  INPUT_OBJECT: 'INPUT_OBJECT',
-  LIST: 'LIST',
-  NON_NULL: 'NON_NULL'
-});
-exports.TypeKind = TypeKind;
-
-var __TypeKind = new _definition.GraphQLEnumType({
-  name: '__TypeKind',
-  description: 'An enum describing what kind of type a given `__Type` is.',
-  values: {
-    SCALAR: {
-      value: TypeKind.SCALAR,
-      description: 'Indicates this type is a scalar.'
-    },
-    OBJECT: {
-      value: TypeKind.OBJECT,
-      description: 'Indicates this type is an object. `fields` and `interfaces` are valid fields.'
-    },
-    INTERFACE: {
-      value: TypeKind.INTERFACE,
-      description: 'Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.'
-    },
-    UNION: {
-      value: TypeKind.UNION,
-      description: 'Indicates this type is a union. `possibleTypes` is a valid field.'
-    },
-    ENUM: {
-      value: TypeKind.ENUM,
-      description: 'Indicates this type is an enum. `enumValues` is a valid field.'
-    },
-    INPUT_OBJECT: {
-      value: TypeKind.INPUT_OBJECT,
-      description: 'Indicates this type is an input object. `inputFields` is a valid field.'
-    },
-    LIST: {
-      value: TypeKind.LIST,
-      description: 'Indicates this type is a list. `ofType` is a valid field.'
-    },
-    NON_NULL: {
-      value: TypeKind.NON_NULL,
-      description: 'Indicates this type is a non-null. `ofType` is a valid field.'
-    }
-  }
-});
-/**
- * Note that these are GraphQLField and not GraphQLFieldConfig,
- * so the format for args is different.
- */
-
-
-exports.__TypeKind = __TypeKind;
-var SchemaMetaFieldDef = {
-  name: '__schema',
-  type: (0, _definition.GraphQLNonNull)(__Schema),
-  description: 'Access the current type schema of this server.',
-  args: [],
-  resolve: function resolve(_source, _args, _context, _ref4) {
-    var schema = _ref4.schema;
-    return schema;
-  },
-  deprecationReason: undefined,
-  extensions: undefined,
-  astNode: undefined
-};
-exports.SchemaMetaFieldDef = SchemaMetaFieldDef;
-var TypeMetaFieldDef = {
-  name: '__type',
-  type: __Type,
-  description: 'Request the type information of a single type.',
-  args: [{
-    name: 'name',
-    description: undefined,
-    type: (0, _definition.GraphQLNonNull)(_scalars.GraphQLString),
-    defaultValue: undefined,
-    extensions: undefined,
-    astNode: undefined
-  }],
-  resolve: function resolve(_source, _ref5, _context, _ref6) {
-    var name = _ref5.name;
-    var schema = _ref6.schema;
-    return schema.getType(name);
-  },
-  deprecationReason: undefined,
-  extensions: undefined,
-  astNode: undefined
-};
-exports.TypeMetaFieldDef = TypeMetaFieldDef;
-var TypeNameMetaFieldDef = {
-  name: '__typename',
-  type: (0, _definition.GraphQLNonNull)(_scalars.GraphQLString),
-  description: 'The name of the current Object type at runtime.',
-  args: [],
-  resolve: function resolve(_source, _args, _context, _ref7) {
-    var parentType = _ref7.parentType;
-    return parentType.name;
-  },
-  deprecationReason: undefined,
-  extensions: undefined,
-  astNode: undefined
-};
-exports.TypeNameMetaFieldDef = TypeNameMetaFieldDef;
-var introspectionTypes = Object.freeze([__Schema, __Directive, __DirectiveLocation, __Type, __Field, __InputValue, __EnumValue, __TypeKind]);
-exports.introspectionTypes = introspectionTypes;
-
-function isIntrospectionType(type) {
-  return introspectionTypes.some(function (_ref8) {
-    var name = _ref8.name;
-    return type.name === name;
-  });
-}
diff --git a/node_modules/graphql/type/introspection.js.flow b/node_modules/graphql/type/introspection.js.flow
deleted file mode 100644
index 0436854..0000000
--- a/node_modules/graphql/type/introspection.js.flow
+++ /dev/null
@@ -1,509 +0,0 @@
-// @flow strict
-
-// FIXME
-/* eslint-disable import/no-cycle */
-
-import objectValues from '../polyfills/objectValues';
-
-import inspect from '../jsutils/inspect';
-import invariant from '../jsutils/invariant';
-
-import { print } from '../language/printer';
-import { DirectiveLocation } from '../language/directiveLocation';
-import { astFromValue } from '../utilities/astFromValue';
-
-import { type GraphQLSchema } from './schema';
-import { type GraphQLDirective } from './directives';
-import { GraphQLString, GraphQLBoolean } from './scalars';
-import {
-  type GraphQLType,
-  type GraphQLNamedType,
-  type GraphQLInputField,
-  type GraphQLEnumValue,
-  type GraphQLField,
-  type GraphQLFieldConfigMap,
-  GraphQLObjectType,
-  GraphQLEnumType,
-  GraphQLList,
-  GraphQLNonNull,
-  isScalarType,
-  isObjectType,
-  isInterfaceType,
-  isUnionType,
-  isEnumType,
-  isInputObjectType,
-  isListType,
-  isNonNullType,
-  isAbstractType,
-} from './definition';
-
-export const __Schema = new GraphQLObjectType({
-  name: '__Schema',
-  description:
-    'A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.',
-  fields: () =>
-    ({
-      description: {
-        type: GraphQLString,
-        resolve: schema => schema.description,
-      },
-      types: {
-        description: 'A list of all types supported by this server.',
-        type: GraphQLNonNull(GraphQLList(GraphQLNonNull(__Type))),
-        resolve(schema) {
-          return objectValues(schema.getTypeMap());
-        },
-      },
-      queryType: {
-        description: 'The type that query operations will be rooted at.',
-        type: GraphQLNonNull(__Type),
-        resolve: schema => schema.getQueryType(),
-      },
-      mutationType: {
-        description:
-          'If this server supports mutation, the type that mutation operations will be rooted at.',
-        type: __Type,
-        resolve: schema => schema.getMutationType(),
-      },
-      subscriptionType: {
-        description:
-          'If this server support subscription, the type that subscription operations will be rooted at.',
-        type: __Type,
-        resolve: schema => schema.getSubscriptionType(),
-      },
-      directives: {
-        description: 'A list of all directives supported by this server.',
-        type: GraphQLNonNull(GraphQLList(GraphQLNonNull(__Directive))),
-        resolve: schema => schema.getDirectives(),
-      },
-    }: GraphQLFieldConfigMap<GraphQLSchema, mixed>),
-});
-
-export const __Directive = new GraphQLObjectType({
-  name: '__Directive',
-  description:
-    "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
-  fields: () =>
-    ({
-      name: {
-        type: GraphQLNonNull(GraphQLString),
-        resolve: directive => directive.name,
-      },
-      description: {
-        type: GraphQLString,
-        resolve: directive => directive.description,
-      },
-      isRepeatable: {
-        type: GraphQLNonNull(GraphQLBoolean),
-        resolve: directive => directive.isRepeatable,
-      },
-      locations: {
-        type: GraphQLNonNull(GraphQLList(GraphQLNonNull(__DirectiveLocation))),
-        resolve: directive => directive.locations,
-      },
-      args: {
-        type: GraphQLNonNull(GraphQLList(GraphQLNonNull(__InputValue))),
-        resolve: directive => directive.args,
-      },
-    }: GraphQLFieldConfigMap<GraphQLDirective, mixed>),
-});
-
-export const __DirectiveLocation = new GraphQLEnumType({
-  name: '__DirectiveLocation',
-  description:
-    'A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.',
-  values: {
-    QUERY: {
-      value: DirectiveLocation.QUERY,
-      description: 'Location adjacent to a query operation.',
-    },
-    MUTATION: {
-      value: DirectiveLocation.MUTATION,
-      description: 'Location adjacent to a mutation operation.',
-    },
-    SUBSCRIPTION: {
-      value: DirectiveLocation.SUBSCRIPTION,
-      description: 'Location adjacent to a subscription operation.',
-    },
-    FIELD: {
-      value: DirectiveLocation.FIELD,
-      description: 'Location adjacent to a field.',
-    },
-    FRAGMENT_DEFINITION: {
-      value: DirectiveLocation.FRAGMENT_DEFINITION,
-      description: 'Location adjacent to a fragment definition.',
-    },
-    FRAGMENT_SPREAD: {
-      value: DirectiveLocation.FRAGMENT_SPREAD,
-      description: 'Location adjacent to a fragment spread.',
-    },
-    INLINE_FRAGMENT: {
-      value: DirectiveLocation.INLINE_FRAGMENT,
-      description: 'Location adjacent to an inline fragment.',
-    },
-    VARIABLE_DEFINITION: {
-      value: DirectiveLocation.VARIABLE_DEFINITION,
-      description: 'Location adjacent to a variable definition.',
-    },
-    SCHEMA: {
-      value: DirectiveLocation.SCHEMA,
-      description: 'Location adjacent to a schema definition.',
-    },
-    SCALAR: {
-      value: DirectiveLocation.SCALAR,
-      description: 'Location adjacent to a scalar definition.',
-    },
-    OBJECT: {
-      value: DirectiveLocation.OBJECT,
-      description: 'Location adjacent to an object type definition.',
-    },
-    FIELD_DEFINITION: {
-      value: DirectiveLocation.FIELD_DEFINITION,
-      description: 'Location adjacent to a field definition.',
-    },
-    ARGUMENT_DEFINITION: {
-      value: DirectiveLocation.ARGUMENT_DEFINITION,
-      description: 'Location adjacent to an argument definition.',
-    },
-    INTERFACE: {
-      value: DirectiveLocation.INTERFACE,
-      description: 'Location adjacent to an interface definition.',
-    },
-    UNION: {
-      value: DirectiveLocation.UNION,
-      description: 'Location adjacent to a union definition.',
-    },
-    ENUM: {
-      value: DirectiveLocation.ENUM,
-      description: 'Location adjacent to an enum definition.',
-    },
-    ENUM_VALUE: {
-      value: DirectiveLocation.ENUM_VALUE,
-      description: 'Location adjacent to an enum value definition.',
-    },
-    INPUT_OBJECT: {
-      value: DirectiveLocation.INPUT_OBJECT,
-      description: 'Location adjacent to an input object type definition.',
-    },
-    INPUT_FIELD_DEFINITION: {
-      value: DirectiveLocation.INPUT_FIELD_DEFINITION,
-      description: 'Location adjacent to an input object field definition.',
-    },
-  },
-});
-
-export const __Type = new GraphQLObjectType({
-  name: '__Type',
-  description:
-    'The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name and description, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.',
-  fields: () =>
-    ({
-      kind: {
-        type: GraphQLNonNull(__TypeKind),
-        resolve(type) {
-          if (isScalarType(type)) {
-            return TypeKind.SCALAR;
-          }
-          if (isObjectType(type)) {
-            return TypeKind.OBJECT;
-          }
-          if (isInterfaceType(type)) {
-            return TypeKind.INTERFACE;
-          }
-          if (isUnionType(type)) {
-            return TypeKind.UNION;
-          }
-          if (isEnumType(type)) {
-            return TypeKind.ENUM;
-          }
-          if (isInputObjectType(type)) {
-            return TypeKind.INPUT_OBJECT;
-          }
-          if (isListType(type)) {
-            return TypeKind.LIST;
-          }
-          if (isNonNullType(type)) {
-            return TypeKind.NON_NULL;
-          }
-
-          // Not reachable. All possible types have been considered.
-          invariant(false, `Unexpected type: "${inspect((type: empty))}".`);
-        },
-      },
-      name: {
-        type: GraphQLString,
-        resolve: type => (type.name !== undefined ? type.name : undefined),
-      },
-      description: {
-        type: GraphQLString,
-        resolve: type =>
-          type.description !== undefined ? type.description : undefined,
-      },
-      fields: {
-        type: GraphQLList(GraphQLNonNull(__Field)),
-        args: {
-          includeDeprecated: { type: GraphQLBoolean, defaultValue: false },
-        },
-        resolve(type, { includeDeprecated }) {
-          if (isObjectType(type) || isInterfaceType(type)) {
-            let fields = objectValues(type.getFields());
-            if (!includeDeprecated) {
-              fields = fields.filter(field => !field.isDeprecated);
-            }
-            return fields;
-          }
-          return null;
-        },
-      },
-      interfaces: {
-        type: GraphQLList(GraphQLNonNull(__Type)),
-        resolve(type) {
-          if (isObjectType(type) || isInterfaceType(type)) {
-            return type.getInterfaces();
-          }
-        },
-      },
-      possibleTypes: {
-        type: GraphQLList(GraphQLNonNull(__Type)),
-        resolve(type, _args, _context, { schema }) {
-          if (isAbstractType(type)) {
-            return schema.getPossibleTypes(type);
-          }
-        },
-      },
-      enumValues: {
-        type: GraphQLList(GraphQLNonNull(__EnumValue)),
-        args: {
-          includeDeprecated: { type: GraphQLBoolean, defaultValue: false },
-        },
-        resolve(type, { includeDeprecated }) {
-          if (isEnumType(type)) {
-            let values = type.getValues();
-            if (!includeDeprecated) {
-              values = values.filter(value => !value.isDeprecated);
-            }
-            return values;
-          }
-        },
-      },
-      inputFields: {
-        type: GraphQLList(GraphQLNonNull(__InputValue)),
-        resolve(type) {
-          if (isInputObjectType(type)) {
-            return objectValues(type.getFields());
-          }
-        },
-      },
-      ofType: {
-        type: __Type,
-        resolve: type => (type.ofType !== undefined ? type.ofType : undefined),
-      },
-    }: GraphQLFieldConfigMap<GraphQLType, mixed>),
-});
-
-export const __Field = new GraphQLObjectType({
-  name: '__Field',
-  description:
-    'Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.',
-  fields: () =>
-    ({
-      name: {
-        type: GraphQLNonNull(GraphQLString),
-        resolve: field => field.name,
-      },
-      description: {
-        type: GraphQLString,
-        resolve: field => field.description,
-      },
-      args: {
-        type: GraphQLNonNull(GraphQLList(GraphQLNonNull(__InputValue))),
-        resolve: field => field.args,
-      },
-      type: {
-        type: GraphQLNonNull(__Type),
-        resolve: field => field.type,
-      },
-      isDeprecated: {
-        type: GraphQLNonNull(GraphQLBoolean),
-        resolve: field => field.isDeprecated,
-      },
-      deprecationReason: {
-        type: GraphQLString,
-        resolve: field => field.deprecationReason,
-      },
-    }: GraphQLFieldConfigMap<GraphQLField<mixed, mixed>, mixed>),
-});
-
-export const __InputValue = new GraphQLObjectType({
-  name: '__InputValue',
-  description:
-    'Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.',
-  fields: () =>
-    ({
-      name: {
-        type: GraphQLNonNull(GraphQLString),
-        resolve: inputValue => inputValue.name,
-      },
-      description: {
-        type: GraphQLString,
-        resolve: inputValue => inputValue.description,
-      },
-      type: {
-        type: GraphQLNonNull(__Type),
-        resolve: inputValue => inputValue.type,
-      },
-      defaultValue: {
-        type: GraphQLString,
-        description:
-          'A GraphQL-formatted string representing the default value for this input value.',
-        resolve(inputValue) {
-          const { type, defaultValue } = inputValue;
-          const valueAST = astFromValue(defaultValue, type);
-          return valueAST ? print(valueAST) : null;
-        },
-      },
-    }: GraphQLFieldConfigMap<GraphQLInputField, mixed>),
-});
-
-export const __EnumValue = new GraphQLObjectType({
-  name: '__EnumValue',
-  description:
-    'One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.',
-  fields: () =>
-    ({
-      name: {
-        type: GraphQLNonNull(GraphQLString),
-        resolve: enumValue => enumValue.name,
-      },
-      description: {
-        type: GraphQLString,
-        resolve: enumValue => enumValue.description,
-      },
-      isDeprecated: {
-        type: GraphQLNonNull(GraphQLBoolean),
-        resolve: enumValue => enumValue.isDeprecated,
-      },
-      deprecationReason: {
-        type: GraphQLString,
-        resolve: enumValue => enumValue.deprecationReason,
-      },
-    }: GraphQLFieldConfigMap<GraphQLEnumValue, mixed>),
-});
-
-export const TypeKind = Object.freeze({
-  SCALAR: 'SCALAR',
-  OBJECT: 'OBJECT',
-  INTERFACE: 'INTERFACE',
-  UNION: 'UNION',
-  ENUM: 'ENUM',
-  INPUT_OBJECT: 'INPUT_OBJECT',
-  LIST: 'LIST',
-  NON_NULL: 'NON_NULL',
-});
-
-export const __TypeKind = new GraphQLEnumType({
-  name: '__TypeKind',
-  description: 'An enum describing what kind of type a given `__Type` is.',
-  values: {
-    SCALAR: {
-      value: TypeKind.SCALAR,
-      description: 'Indicates this type is a scalar.',
-    },
-    OBJECT: {
-      value: TypeKind.OBJECT,
-      description:
-        'Indicates this type is an object. `fields` and `interfaces` are valid fields.',
-    },
-    INTERFACE: {
-      value: TypeKind.INTERFACE,
-      description:
-        'Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.',
-    },
-    UNION: {
-      value: TypeKind.UNION,
-      description:
-        'Indicates this type is a union. `possibleTypes` is a valid field.',
-    },
-    ENUM: {
-      value: TypeKind.ENUM,
-      description:
-        'Indicates this type is an enum. `enumValues` is a valid field.',
-    },
-    INPUT_OBJECT: {
-      value: TypeKind.INPUT_OBJECT,
-      description:
-        'Indicates this type is an input object. `inputFields` is a valid field.',
-    },
-    LIST: {
-      value: TypeKind.LIST,
-      description: 'Indicates this type is a list. `ofType` is a valid field.',
-    },
-    NON_NULL: {
-      value: TypeKind.NON_NULL,
-      description:
-        'Indicates this type is a non-null. `ofType` is a valid field.',
-    },
-  },
-});
-
-/**
- * Note that these are GraphQLField and not GraphQLFieldConfig,
- * so the format for args is different.
- */
-
-export const SchemaMetaFieldDef: GraphQLField<mixed, mixed> = {
-  name: '__schema',
-  type: GraphQLNonNull(__Schema),
-  description: 'Access the current type schema of this server.',
-  args: [],
-  resolve: (_source, _args, _context, { schema }) => schema,
-  deprecationReason: undefined,
-  extensions: undefined,
-  astNode: undefined,
-};
-
-export const TypeMetaFieldDef: GraphQLField<mixed, mixed> = {
-  name: '__type',
-  type: __Type,
-  description: 'Request the type information of a single type.',
-  args: [
-    {
-      name: 'name',
-      description: undefined,
-      type: GraphQLNonNull(GraphQLString),
-      defaultValue: undefined,
-      extensions: undefined,
-      astNode: undefined,
-    },
-  ],
-  resolve: (_source, { name }, _context, { schema }) => schema.getType(name),
-  deprecationReason: undefined,
-  extensions: undefined,
-  astNode: undefined,
-};
-
-export const TypeNameMetaFieldDef: GraphQLField<mixed, mixed> = {
-  name: '__typename',
-  type: GraphQLNonNull(GraphQLString),
-  description: 'The name of the current Object type at runtime.',
-  args: [],
-  resolve: (_source, _args, _context, { parentType }) => parentType.name,
-  deprecationReason: undefined,
-  extensions: undefined,
-  astNode: undefined,
-};
-
-export const introspectionTypes = Object.freeze([
-  __Schema,
-  __Directive,
-  __DirectiveLocation,
-  __Type,
-  __Field,
-  __InputValue,
-  __EnumValue,
-  __TypeKind,
-]);
-
-export function isIntrospectionType(type: GraphQLNamedType): boolean %checks {
-  return introspectionTypes.some(({ name }) => type.name === name);
-}
diff --git a/node_modules/graphql/type/introspection.mjs b/node_modules/graphql/type/introspection.mjs
deleted file mode 100644
index 5a46ce0..0000000
--- a/node_modules/graphql/type/introspection.mjs
+++ /dev/null
@@ -1,542 +0,0 @@
-// FIXME
-
-/* eslint-disable import/no-cycle */
-import objectValues from "../polyfills/objectValues.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import invariant from "../jsutils/invariant.mjs";
-import { print } from "../language/printer.mjs";
-import { DirectiveLocation } from "../language/directiveLocation.mjs";
-import { astFromValue } from "../utilities/astFromValue.mjs";
-import { GraphQLString, GraphQLBoolean } from "./scalars.mjs";
-import { GraphQLObjectType, GraphQLEnumType, GraphQLList, GraphQLNonNull, isScalarType, isObjectType, isInterfaceType, isUnionType, isEnumType, isInputObjectType, isListType, isNonNullType, isAbstractType } from "./definition.mjs";
-export var __Schema = new GraphQLObjectType({
-  name: '__Schema',
-  description: 'A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.',
-  fields: function fields() {
-    return {
-      description: {
-        type: GraphQLString,
-        resolve: function resolve(schema) {
-          return schema.description;
-        }
-      },
-      types: {
-        description: 'A list of all types supported by this server.',
-        type: GraphQLNonNull(GraphQLList(GraphQLNonNull(__Type))),
-        resolve: function resolve(schema) {
-          return objectValues(schema.getTypeMap());
-        }
-      },
-      queryType: {
-        description: 'The type that query operations will be rooted at.',
-        type: GraphQLNonNull(__Type),
-        resolve: function resolve(schema) {
-          return schema.getQueryType();
-        }
-      },
-      mutationType: {
-        description: 'If this server supports mutation, the type that mutation operations will be rooted at.',
-        type: __Type,
-        resolve: function resolve(schema) {
-          return schema.getMutationType();
-        }
-      },
-      subscriptionType: {
-        description: 'If this server support subscription, the type that subscription operations will be rooted at.',
-        type: __Type,
-        resolve: function resolve(schema) {
-          return schema.getSubscriptionType();
-        }
-      },
-      directives: {
-        description: 'A list of all directives supported by this server.',
-        type: GraphQLNonNull(GraphQLList(GraphQLNonNull(__Directive))),
-        resolve: function resolve(schema) {
-          return schema.getDirectives();
-        }
-      }
-    };
-  }
-});
-export var __Directive = new GraphQLObjectType({
-  name: '__Directive',
-  description: "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
-  fields: function fields() {
-    return {
-      name: {
-        type: GraphQLNonNull(GraphQLString),
-        resolve: function resolve(directive) {
-          return directive.name;
-        }
-      },
-      description: {
-        type: GraphQLString,
-        resolve: function resolve(directive) {
-          return directive.description;
-        }
-      },
-      isRepeatable: {
-        type: GraphQLNonNull(GraphQLBoolean),
-        resolve: function resolve(directive) {
-          return directive.isRepeatable;
-        }
-      },
-      locations: {
-        type: GraphQLNonNull(GraphQLList(GraphQLNonNull(__DirectiveLocation))),
-        resolve: function resolve(directive) {
-          return directive.locations;
-        }
-      },
-      args: {
-        type: GraphQLNonNull(GraphQLList(GraphQLNonNull(__InputValue))),
-        resolve: function resolve(directive) {
-          return directive.args;
-        }
-      }
-    };
-  }
-});
-export var __DirectiveLocation = new GraphQLEnumType({
-  name: '__DirectiveLocation',
-  description: 'A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.',
-  values: {
-    QUERY: {
-      value: DirectiveLocation.QUERY,
-      description: 'Location adjacent to a query operation.'
-    },
-    MUTATION: {
-      value: DirectiveLocation.MUTATION,
-      description: 'Location adjacent to a mutation operation.'
-    },
-    SUBSCRIPTION: {
-      value: DirectiveLocation.SUBSCRIPTION,
-      description: 'Location adjacent to a subscription operation.'
-    },
-    FIELD: {
-      value: DirectiveLocation.FIELD,
-      description: 'Location adjacent to a field.'
-    },
-    FRAGMENT_DEFINITION: {
-      value: DirectiveLocation.FRAGMENT_DEFINITION,
-      description: 'Location adjacent to a fragment definition.'
-    },
-    FRAGMENT_SPREAD: {
-      value: DirectiveLocation.FRAGMENT_SPREAD,
-      description: 'Location adjacent to a fragment spread.'
-    },
-    INLINE_FRAGMENT: {
-      value: DirectiveLocation.INLINE_FRAGMENT,
-      description: 'Location adjacent to an inline fragment.'
-    },
-    VARIABLE_DEFINITION: {
-      value: DirectiveLocation.VARIABLE_DEFINITION,
-      description: 'Location adjacent to a variable definition.'
-    },
-    SCHEMA: {
-      value: DirectiveLocation.SCHEMA,
-      description: 'Location adjacent to a schema definition.'
-    },
-    SCALAR: {
-      value: DirectiveLocation.SCALAR,
-      description: 'Location adjacent to a scalar definition.'
-    },
-    OBJECT: {
-      value: DirectiveLocation.OBJECT,
-      description: 'Location adjacent to an object type definition.'
-    },
-    FIELD_DEFINITION: {
-      value: DirectiveLocation.FIELD_DEFINITION,
-      description: 'Location adjacent to a field definition.'
-    },
-    ARGUMENT_DEFINITION: {
-      value: DirectiveLocation.ARGUMENT_DEFINITION,
-      description: 'Location adjacent to an argument definition.'
-    },
-    INTERFACE: {
-      value: DirectiveLocation.INTERFACE,
-      description: 'Location adjacent to an interface definition.'
-    },
-    UNION: {
-      value: DirectiveLocation.UNION,
-      description: 'Location adjacent to a union definition.'
-    },
-    ENUM: {
-      value: DirectiveLocation.ENUM,
-      description: 'Location adjacent to an enum definition.'
-    },
-    ENUM_VALUE: {
-      value: DirectiveLocation.ENUM_VALUE,
-      description: 'Location adjacent to an enum value definition.'
-    },
-    INPUT_OBJECT: {
-      value: DirectiveLocation.INPUT_OBJECT,
-      description: 'Location adjacent to an input object type definition.'
-    },
-    INPUT_FIELD_DEFINITION: {
-      value: DirectiveLocation.INPUT_FIELD_DEFINITION,
-      description: 'Location adjacent to an input object field definition.'
-    }
-  }
-});
-export var __Type = new GraphQLObjectType({
-  name: '__Type',
-  description: 'The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name and description, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.',
-  fields: function fields() {
-    return {
-      kind: {
-        type: GraphQLNonNull(__TypeKind),
-        resolve: function resolve(type) {
-          if (isScalarType(type)) {
-            return TypeKind.SCALAR;
-          }
-
-          if (isObjectType(type)) {
-            return TypeKind.OBJECT;
-          }
-
-          if (isInterfaceType(type)) {
-            return TypeKind.INTERFACE;
-          }
-
-          if (isUnionType(type)) {
-            return TypeKind.UNION;
-          }
-
-          if (isEnumType(type)) {
-            return TypeKind.ENUM;
-          }
-
-          if (isInputObjectType(type)) {
-            return TypeKind.INPUT_OBJECT;
-          }
-
-          if (isListType(type)) {
-            return TypeKind.LIST;
-          }
-
-          /* istanbul ignore else */
-          if (isNonNullType(type)) {
-            return TypeKind.NON_NULL;
-          } // Not reachable. All possible types have been considered.
-
-
-          /* istanbul ignore next */
-          invariant(false, "Unexpected type: \"".concat(inspect(type), "\"."));
-        }
-      },
-      name: {
-        type: GraphQLString,
-        resolve: function resolve(type) {
-          return type.name !== undefined ? type.name : undefined;
-        }
-      },
-      description: {
-        type: GraphQLString,
-        resolve: function resolve(type) {
-          return type.description !== undefined ? type.description : undefined;
-        }
-      },
-      fields: {
-        type: GraphQLList(GraphQLNonNull(__Field)),
-        args: {
-          includeDeprecated: {
-            type: GraphQLBoolean,
-            defaultValue: false
-          }
-        },
-        resolve: function resolve(type, _ref) {
-          var includeDeprecated = _ref.includeDeprecated;
-
-          if (isObjectType(type) || isInterfaceType(type)) {
-            var fields = objectValues(type.getFields());
-
-            if (!includeDeprecated) {
-              fields = fields.filter(function (field) {
-                return !field.isDeprecated;
-              });
-            }
-
-            return fields;
-          }
-
-          return null;
-        }
-      },
-      interfaces: {
-        type: GraphQLList(GraphQLNonNull(__Type)),
-        resolve: function resolve(type) {
-          if (isObjectType(type) || isInterfaceType(type)) {
-            return type.getInterfaces();
-          }
-        }
-      },
-      possibleTypes: {
-        type: GraphQLList(GraphQLNonNull(__Type)),
-        resolve: function resolve(type, _args, _context, _ref2) {
-          var schema = _ref2.schema;
-
-          if (isAbstractType(type)) {
-            return schema.getPossibleTypes(type);
-          }
-        }
-      },
-      enumValues: {
-        type: GraphQLList(GraphQLNonNull(__EnumValue)),
-        args: {
-          includeDeprecated: {
-            type: GraphQLBoolean,
-            defaultValue: false
-          }
-        },
-        resolve: function resolve(type, _ref3) {
-          var includeDeprecated = _ref3.includeDeprecated;
-
-          if (isEnumType(type)) {
-            var values = type.getValues();
-
-            if (!includeDeprecated) {
-              values = values.filter(function (value) {
-                return !value.isDeprecated;
-              });
-            }
-
-            return values;
-          }
-        }
-      },
-      inputFields: {
-        type: GraphQLList(GraphQLNonNull(__InputValue)),
-        resolve: function resolve(type) {
-          if (isInputObjectType(type)) {
-            return objectValues(type.getFields());
-          }
-        }
-      },
-      ofType: {
-        type: __Type,
-        resolve: function resolve(type) {
-          return type.ofType !== undefined ? type.ofType : undefined;
-        }
-      }
-    };
-  }
-});
-export var __Field = new GraphQLObjectType({
-  name: '__Field',
-  description: 'Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.',
-  fields: function fields() {
-    return {
-      name: {
-        type: GraphQLNonNull(GraphQLString),
-        resolve: function resolve(field) {
-          return field.name;
-        }
-      },
-      description: {
-        type: GraphQLString,
-        resolve: function resolve(field) {
-          return field.description;
-        }
-      },
-      args: {
-        type: GraphQLNonNull(GraphQLList(GraphQLNonNull(__InputValue))),
-        resolve: function resolve(field) {
-          return field.args;
-        }
-      },
-      type: {
-        type: GraphQLNonNull(__Type),
-        resolve: function resolve(field) {
-          return field.type;
-        }
-      },
-      isDeprecated: {
-        type: GraphQLNonNull(GraphQLBoolean),
-        resolve: function resolve(field) {
-          return field.isDeprecated;
-        }
-      },
-      deprecationReason: {
-        type: GraphQLString,
-        resolve: function resolve(field) {
-          return field.deprecationReason;
-        }
-      }
-    };
-  }
-});
-export var __InputValue = new GraphQLObjectType({
-  name: '__InputValue',
-  description: 'Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.',
-  fields: function fields() {
-    return {
-      name: {
-        type: GraphQLNonNull(GraphQLString),
-        resolve: function resolve(inputValue) {
-          return inputValue.name;
-        }
-      },
-      description: {
-        type: GraphQLString,
-        resolve: function resolve(inputValue) {
-          return inputValue.description;
-        }
-      },
-      type: {
-        type: GraphQLNonNull(__Type),
-        resolve: function resolve(inputValue) {
-          return inputValue.type;
-        }
-      },
-      defaultValue: {
-        type: GraphQLString,
-        description: 'A GraphQL-formatted string representing the default value for this input value.',
-        resolve: function resolve(inputValue) {
-          var type = inputValue.type,
-              defaultValue = inputValue.defaultValue;
-          var valueAST = astFromValue(defaultValue, type);
-          return valueAST ? print(valueAST) : null;
-        }
-      }
-    };
-  }
-});
-export var __EnumValue = new GraphQLObjectType({
-  name: '__EnumValue',
-  description: 'One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.',
-  fields: function fields() {
-    return {
-      name: {
-        type: GraphQLNonNull(GraphQLString),
-        resolve: function resolve(enumValue) {
-          return enumValue.name;
-        }
-      },
-      description: {
-        type: GraphQLString,
-        resolve: function resolve(enumValue) {
-          return enumValue.description;
-        }
-      },
-      isDeprecated: {
-        type: GraphQLNonNull(GraphQLBoolean),
-        resolve: function resolve(enumValue) {
-          return enumValue.isDeprecated;
-        }
-      },
-      deprecationReason: {
-        type: GraphQLString,
-        resolve: function resolve(enumValue) {
-          return enumValue.deprecationReason;
-        }
-      }
-    };
-  }
-});
-export var TypeKind = Object.freeze({
-  SCALAR: 'SCALAR',
-  OBJECT: 'OBJECT',
-  INTERFACE: 'INTERFACE',
-  UNION: 'UNION',
-  ENUM: 'ENUM',
-  INPUT_OBJECT: 'INPUT_OBJECT',
-  LIST: 'LIST',
-  NON_NULL: 'NON_NULL'
-});
-export var __TypeKind = new GraphQLEnumType({
-  name: '__TypeKind',
-  description: 'An enum describing what kind of type a given `__Type` is.',
-  values: {
-    SCALAR: {
-      value: TypeKind.SCALAR,
-      description: 'Indicates this type is a scalar.'
-    },
-    OBJECT: {
-      value: TypeKind.OBJECT,
-      description: 'Indicates this type is an object. `fields` and `interfaces` are valid fields.'
-    },
-    INTERFACE: {
-      value: TypeKind.INTERFACE,
-      description: 'Indicates this type is an interface. `fields`, `interfaces`, and `possibleTypes` are valid fields.'
-    },
-    UNION: {
-      value: TypeKind.UNION,
-      description: 'Indicates this type is a union. `possibleTypes` is a valid field.'
-    },
-    ENUM: {
-      value: TypeKind.ENUM,
-      description: 'Indicates this type is an enum. `enumValues` is a valid field.'
-    },
-    INPUT_OBJECT: {
-      value: TypeKind.INPUT_OBJECT,
-      description: 'Indicates this type is an input object. `inputFields` is a valid field.'
-    },
-    LIST: {
-      value: TypeKind.LIST,
-      description: 'Indicates this type is a list. `ofType` is a valid field.'
-    },
-    NON_NULL: {
-      value: TypeKind.NON_NULL,
-      description: 'Indicates this type is a non-null. `ofType` is a valid field.'
-    }
-  }
-});
-/**
- * Note that these are GraphQLField and not GraphQLFieldConfig,
- * so the format for args is different.
- */
-
-export var SchemaMetaFieldDef = {
-  name: '__schema',
-  type: GraphQLNonNull(__Schema),
-  description: 'Access the current type schema of this server.',
-  args: [],
-  resolve: function resolve(_source, _args, _context, _ref4) {
-    var schema = _ref4.schema;
-    return schema;
-  },
-  deprecationReason: undefined,
-  extensions: undefined,
-  astNode: undefined
-};
-export var TypeMetaFieldDef = {
-  name: '__type',
-  type: __Type,
-  description: 'Request the type information of a single type.',
-  args: [{
-    name: 'name',
-    description: undefined,
-    type: GraphQLNonNull(GraphQLString),
-    defaultValue: undefined,
-    extensions: undefined,
-    astNode: undefined
-  }],
-  resolve: function resolve(_source, _ref5, _context, _ref6) {
-    var name = _ref5.name;
-    var schema = _ref6.schema;
-    return schema.getType(name);
-  },
-  deprecationReason: undefined,
-  extensions: undefined,
-  astNode: undefined
-};
-export var TypeNameMetaFieldDef = {
-  name: '__typename',
-  type: GraphQLNonNull(GraphQLString),
-  description: 'The name of the current Object type at runtime.',
-  args: [],
-  resolve: function resolve(_source, _args, _context, _ref7) {
-    var parentType = _ref7.parentType;
-    return parentType.name;
-  },
-  deprecationReason: undefined,
-  extensions: undefined,
-  astNode: undefined
-};
-export var introspectionTypes = Object.freeze([__Schema, __Directive, __DirectiveLocation, __Type, __Field, __InputValue, __EnumValue, __TypeKind]);
-export function isIntrospectionType(type) {
-  return introspectionTypes.some(function (_ref8) {
-    var name = _ref8.name;
-    return type.name === name;
-  });
-}
diff --git a/node_modules/graphql/type/scalars.d.ts b/node_modules/graphql/type/scalars.d.ts
deleted file mode 100644
index 71593d1..0000000
--- a/node_modules/graphql/type/scalars.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { GraphQLScalarType, GraphQLNamedType } from './definition';
-
-export const GraphQLInt: GraphQLScalarType;
-export const GraphQLFloat: GraphQLScalarType;
-export const GraphQLString: GraphQLScalarType;
-export const GraphQLBoolean: GraphQLScalarType;
-export const GraphQLID: GraphQLScalarType;
-
-export const specifiedScalarTypes: ReadonlyArray<GraphQLScalarType>;
-
-export function isSpecifiedScalarType(type: GraphQLNamedType): boolean;
diff --git a/node_modules/graphql/type/scalars.js b/node_modules/graphql/type/scalars.js
deleted file mode 100644
index 5144266..0000000
--- a/node_modules/graphql/type/scalars.js
+++ /dev/null
@@ -1,284 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.isSpecifiedScalarType = isSpecifiedScalarType;
-exports.specifiedScalarTypes = exports.GraphQLID = exports.GraphQLBoolean = exports.GraphQLString = exports.GraphQLFloat = exports.GraphQLInt = void 0;
-
-var _isFinite = _interopRequireDefault(require("../polyfills/isFinite"));
-
-var _isInteger = _interopRequireDefault(require("../polyfills/isInteger"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _isObjectLike = _interopRequireDefault(require("../jsutils/isObjectLike"));
-
-var _kinds = require("../language/kinds");
-
-var _printer = require("../language/printer");
-
-var _GraphQLError = require("../error/GraphQLError");
-
-var _definition = require("./definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-// As per the GraphQL Spec, Integers are only treated as valid when a valid
-// 32-bit signed integer, providing the broadest support across platforms.
-//
-// n.b. JavaScript's integers are safe between -(2^53 - 1) and 2^53 - 1 because
-// they are internally represented as IEEE 754 doubles.
-var MAX_INT = 2147483647;
-var MIN_INT = -2147483648;
-
-function serializeInt(outputValue) {
-  var coercedValue = serializeObject(outputValue);
-
-  if (typeof coercedValue === 'boolean') {
-    return coercedValue ? 1 : 0;
-  }
-
-  var num = coercedValue;
-
-  if (typeof coercedValue === 'string' && coercedValue !== '') {
-    num = Number(coercedValue);
-  }
-
-  if (!(0, _isInteger.default)(num)) {
-    throw new _GraphQLError.GraphQLError("Int cannot represent non-integer value: ".concat((0, _inspect.default)(coercedValue)));
-  }
-
-  if (num > MAX_INT || num < MIN_INT) {
-    throw new _GraphQLError.GraphQLError('Int cannot represent non 32-bit signed integer value: ' + (0, _inspect.default)(coercedValue));
-  }
-
-  return num;
-}
-
-function coerceInt(inputValue) {
-  if (!(0, _isInteger.default)(inputValue)) {
-    throw new _GraphQLError.GraphQLError("Int cannot represent non-integer value: ".concat((0, _inspect.default)(inputValue)));
-  }
-
-  if (inputValue > MAX_INT || inputValue < MIN_INT) {
-    throw new _GraphQLError.GraphQLError("Int cannot represent non 32-bit signed integer value: ".concat(inputValue));
-  }
-
-  return inputValue;
-}
-
-var GraphQLInt = new _definition.GraphQLScalarType({
-  name: 'Int',
-  description: 'The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.',
-  serialize: serializeInt,
-  parseValue: coerceInt,
-  parseLiteral: function parseLiteral(valueNode) {
-    if (valueNode.kind !== _kinds.Kind.INT) {
-      throw new _GraphQLError.GraphQLError("Int cannot represent non-integer value: ".concat((0, _printer.print)(valueNode)), valueNode);
-    }
-
-    var num = parseInt(valueNode.value, 10);
-
-    if (num > MAX_INT || num < MIN_INT) {
-      throw new _GraphQLError.GraphQLError("Int cannot represent non 32-bit signed integer value: ".concat(valueNode.value), valueNode);
-    }
-
-    return num;
-  }
-});
-exports.GraphQLInt = GraphQLInt;
-
-function serializeFloat(outputValue) {
-  var coercedValue = serializeObject(outputValue);
-
-  if (typeof coercedValue === 'boolean') {
-    return coercedValue ? 1 : 0;
-  }
-
-  var num = coercedValue;
-
-  if (typeof coercedValue === 'string' && coercedValue !== '') {
-    num = Number(coercedValue);
-  }
-
-  if (!(0, _isFinite.default)(num)) {
-    throw new _GraphQLError.GraphQLError("Float cannot represent non numeric value: ".concat((0, _inspect.default)(coercedValue)));
-  }
-
-  return num;
-}
-
-function coerceFloat(inputValue) {
-  if (!(0, _isFinite.default)(inputValue)) {
-    throw new _GraphQLError.GraphQLError("Float cannot represent non numeric value: ".concat((0, _inspect.default)(inputValue)));
-  }
-
-  return inputValue;
-}
-
-var GraphQLFloat = new _definition.GraphQLScalarType({
-  name: 'Float',
-  description: 'The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).',
-  serialize: serializeFloat,
-  parseValue: coerceFloat,
-  parseLiteral: function parseLiteral(valueNode) {
-    if (valueNode.kind !== _kinds.Kind.FLOAT && valueNode.kind !== _kinds.Kind.INT) {
-      throw new _GraphQLError.GraphQLError("Float cannot represent non numeric value: ".concat((0, _printer.print)(valueNode)), valueNode);
-    }
-
-    return parseFloat(valueNode.value);
-  }
-}); // Support serializing objects with custom valueOf() or toJSON() functions -
-// a common way to represent a complex value which can be represented as
-// a string (ex: MongoDB id objects).
-
-exports.GraphQLFloat = GraphQLFloat;
-
-function serializeObject(outputValue) {
-  if ((0, _isObjectLike.default)(outputValue)) {
-    if (typeof outputValue.valueOf === 'function') {
-      var valueOfResult = outputValue.valueOf();
-
-      if (!(0, _isObjectLike.default)(valueOfResult)) {
-        return valueOfResult;
-      }
-    }
-
-    if (typeof outputValue.toJSON === 'function') {
-      // $FlowFixMe(>=0.90.0)
-      return outputValue.toJSON();
-    }
-  }
-
-  return outputValue;
-}
-
-function serializeString(outputValue) {
-  var coercedValue = serializeObject(outputValue); // Serialize string, boolean and number values to a string, but do not
-  // attempt to coerce object, function, symbol, or other types as strings.
-
-  if (typeof coercedValue === 'string') {
-    return coercedValue;
-  }
-
-  if (typeof coercedValue === 'boolean') {
-    return coercedValue ? 'true' : 'false';
-  }
-
-  if ((0, _isFinite.default)(coercedValue)) {
-    return coercedValue.toString();
-  }
-
-  throw new _GraphQLError.GraphQLError("String cannot represent value: ".concat((0, _inspect.default)(outputValue)));
-}
-
-function coerceString(inputValue) {
-  if (typeof inputValue !== 'string') {
-    throw new _GraphQLError.GraphQLError("String cannot represent a non string value: ".concat((0, _inspect.default)(inputValue)));
-  }
-
-  return inputValue;
-}
-
-var GraphQLString = new _definition.GraphQLScalarType({
-  name: 'String',
-  description: 'The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.',
-  serialize: serializeString,
-  parseValue: coerceString,
-  parseLiteral: function parseLiteral(valueNode) {
-    if (valueNode.kind !== _kinds.Kind.STRING) {
-      throw new _GraphQLError.GraphQLError("String cannot represent a non string value: ".concat((0, _printer.print)(valueNode)), valueNode);
-    }
-
-    return valueNode.value;
-  }
-});
-exports.GraphQLString = GraphQLString;
-
-function serializeBoolean(outputValue) {
-  var coercedValue = serializeObject(outputValue);
-
-  if (typeof coercedValue === 'boolean') {
-    return coercedValue;
-  }
-
-  if ((0, _isFinite.default)(coercedValue)) {
-    return coercedValue !== 0;
-  }
-
-  throw new _GraphQLError.GraphQLError("Boolean cannot represent a non boolean value: ".concat((0, _inspect.default)(coercedValue)));
-}
-
-function coerceBoolean(inputValue) {
-  if (typeof inputValue !== 'boolean') {
-    throw new _GraphQLError.GraphQLError("Boolean cannot represent a non boolean value: ".concat((0, _inspect.default)(inputValue)));
-  }
-
-  return inputValue;
-}
-
-var GraphQLBoolean = new _definition.GraphQLScalarType({
-  name: 'Boolean',
-  description: 'The `Boolean` scalar type represents `true` or `false`.',
-  serialize: serializeBoolean,
-  parseValue: coerceBoolean,
-  parseLiteral: function parseLiteral(valueNode) {
-    if (valueNode.kind !== _kinds.Kind.BOOLEAN) {
-      throw new _GraphQLError.GraphQLError("Boolean cannot represent a non boolean value: ".concat((0, _printer.print)(valueNode)), valueNode);
-    }
-
-    return valueNode.value;
-  }
-});
-exports.GraphQLBoolean = GraphQLBoolean;
-
-function serializeID(outputValue) {
-  var coercedValue = serializeObject(outputValue);
-
-  if (typeof coercedValue === 'string') {
-    return coercedValue;
-  }
-
-  if ((0, _isInteger.default)(coercedValue)) {
-    return String(coercedValue);
-  }
-
-  throw new _GraphQLError.GraphQLError("ID cannot represent value: ".concat((0, _inspect.default)(outputValue)));
-}
-
-function coerceID(inputValue) {
-  if (typeof inputValue === 'string') {
-    return inputValue;
-  }
-
-  if ((0, _isInteger.default)(inputValue)) {
-    return inputValue.toString();
-  }
-
-  throw new _GraphQLError.GraphQLError("ID cannot represent value: ".concat((0, _inspect.default)(inputValue)));
-}
-
-var GraphQLID = new _definition.GraphQLScalarType({
-  name: 'ID',
-  description: 'The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID.',
-  serialize: serializeID,
-  parseValue: coerceID,
-  parseLiteral: function parseLiteral(valueNode) {
-    if (valueNode.kind !== _kinds.Kind.STRING && valueNode.kind !== _kinds.Kind.INT) {
-      throw new _GraphQLError.GraphQLError('ID cannot represent a non-string and non-integer value: ' + (0, _printer.print)(valueNode), valueNode);
-    }
-
-    return valueNode.value;
-  }
-});
-exports.GraphQLID = GraphQLID;
-var specifiedScalarTypes = Object.freeze([GraphQLString, GraphQLInt, GraphQLFloat, GraphQLBoolean, GraphQLID]);
-exports.specifiedScalarTypes = specifiedScalarTypes;
-
-function isSpecifiedScalarType(type) {
-  return specifiedScalarTypes.some(function (_ref) {
-    var name = _ref.name;
-    return type.name === name;
-  });
-}
diff --git a/node_modules/graphql/type/scalars.js.flow b/node_modules/graphql/type/scalars.js.flow
deleted file mode 100644
index e425a17..0000000
--- a/node_modules/graphql/type/scalars.js.flow
+++ /dev/null
@@ -1,287 +0,0 @@
-// @flow strict
-
-import isFinite from '../polyfills/isFinite';
-import isInteger from '../polyfills/isInteger';
-
-import inspect from '../jsutils/inspect';
-import isObjectLike from '../jsutils/isObjectLike';
-
-import { Kind } from '../language/kinds';
-import { print } from '../language/printer';
-
-import { GraphQLError } from '../error/GraphQLError';
-
-import { type GraphQLNamedType, GraphQLScalarType } from './definition';
-
-// As per the GraphQL Spec, Integers are only treated as valid when a valid
-// 32-bit signed integer, providing the broadest support across platforms.
-//
-// n.b. JavaScript's integers are safe between -(2^53 - 1) and 2^53 - 1 because
-// they are internally represented as IEEE 754 doubles.
-const MAX_INT = 2147483647;
-const MIN_INT = -2147483648;
-
-function serializeInt(outputValue: mixed): number {
-  const coercedValue = serializeObject(outputValue);
-
-  if (typeof coercedValue === 'boolean') {
-    return coercedValue ? 1 : 0;
-  }
-
-  let num = coercedValue;
-  if (typeof coercedValue === 'string' && coercedValue !== '') {
-    num = Number(coercedValue);
-  }
-
-  if (!isInteger(num)) {
-    throw new GraphQLError(
-      `Int cannot represent non-integer value: ${inspect(coercedValue)}`,
-    );
-  }
-  if (num > MAX_INT || num < MIN_INT) {
-    throw new GraphQLError(
-      'Int cannot represent non 32-bit signed integer value: ' +
-        inspect(coercedValue),
-    );
-  }
-  return num;
-}
-
-function coerceInt(inputValue: mixed): number {
-  if (!isInteger(inputValue)) {
-    throw new GraphQLError(
-      `Int cannot represent non-integer value: ${inspect(inputValue)}`,
-    );
-  }
-  if (inputValue > MAX_INT || inputValue < MIN_INT) {
-    throw new GraphQLError(
-      `Int cannot represent non 32-bit signed integer value: ${inputValue}`,
-    );
-  }
-  return inputValue;
-}
-
-export const GraphQLInt = new GraphQLScalarType({
-  name: 'Int',
-  description:
-    'The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.',
-  serialize: serializeInt,
-  parseValue: coerceInt,
-  parseLiteral(valueNode) {
-    if (valueNode.kind !== Kind.INT) {
-      throw new GraphQLError(
-        `Int cannot represent non-integer value: ${print(valueNode)}`,
-        valueNode,
-      );
-    }
-    const num = parseInt(valueNode.value, 10);
-    if (num > MAX_INT || num < MIN_INT) {
-      throw new GraphQLError(
-        `Int cannot represent non 32-bit signed integer value: ${valueNode.value}`,
-        valueNode,
-      );
-    }
-    return num;
-  },
-});
-
-function serializeFloat(outputValue: mixed): number {
-  const coercedValue = serializeObject(outputValue);
-
-  if (typeof coercedValue === 'boolean') {
-    return coercedValue ? 1 : 0;
-  }
-
-  let num = coercedValue;
-  if (typeof coercedValue === 'string' && coercedValue !== '') {
-    num = Number(coercedValue);
-  }
-
-  if (!isFinite(num)) {
-    throw new GraphQLError(
-      `Float cannot represent non numeric value: ${inspect(coercedValue)}`,
-    );
-  }
-  return num;
-}
-
-function coerceFloat(inputValue: mixed): number {
-  if (!isFinite(inputValue)) {
-    throw new GraphQLError(
-      `Float cannot represent non numeric value: ${inspect(inputValue)}`,
-    );
-  }
-  return inputValue;
-}
-
-export const GraphQLFloat = new GraphQLScalarType({
-  name: 'Float',
-  description:
-    'The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).',
-  serialize: serializeFloat,
-  parseValue: coerceFloat,
-  parseLiteral(valueNode) {
-    if (valueNode.kind !== Kind.FLOAT && valueNode.kind !== Kind.INT) {
-      throw new GraphQLError(
-        `Float cannot represent non numeric value: ${print(valueNode)}`,
-        valueNode,
-      );
-    }
-    return parseFloat(valueNode.value);
-  },
-});
-
-// Support serializing objects with custom valueOf() or toJSON() functions -
-// a common way to represent a complex value which can be represented as
-// a string (ex: MongoDB id objects).
-function serializeObject(outputValue: mixed): mixed {
-  if (isObjectLike(outputValue)) {
-    if (typeof outputValue.valueOf === 'function') {
-      const valueOfResult = outputValue.valueOf();
-      if (!isObjectLike(valueOfResult)) {
-        return valueOfResult;
-      }
-    }
-    if (typeof outputValue.toJSON === 'function') {
-      // $FlowFixMe(>=0.90.0)
-      return outputValue.toJSON();
-    }
-  }
-  return outputValue;
-}
-
-function serializeString(outputValue: mixed): string {
-  const coercedValue = serializeObject(outputValue);
-
-  // Serialize string, boolean and number values to a string, but do not
-  // attempt to coerce object, function, symbol, or other types as strings.
-  if (typeof coercedValue === 'string') {
-    return coercedValue;
-  }
-  if (typeof coercedValue === 'boolean') {
-    return coercedValue ? 'true' : 'false';
-  }
-  if (isFinite(coercedValue)) {
-    return coercedValue.toString();
-  }
-  throw new GraphQLError(
-    `String cannot represent value: ${inspect(outputValue)}`,
-  );
-}
-
-function coerceString(inputValue: mixed): string {
-  if (typeof inputValue !== 'string') {
-    throw new GraphQLError(
-      `String cannot represent a non string value: ${inspect(inputValue)}`,
-    );
-  }
-  return inputValue;
-}
-
-export const GraphQLString = new GraphQLScalarType({
-  name: 'String',
-  description:
-    'The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.',
-  serialize: serializeString,
-  parseValue: coerceString,
-  parseLiteral(valueNode) {
-    if (valueNode.kind !== Kind.STRING) {
-      throw new GraphQLError(
-        `String cannot represent a non string value: ${print(valueNode)}`,
-        valueNode,
-      );
-    }
-    return valueNode.value;
-  },
-});
-
-function serializeBoolean(outputValue: mixed): boolean {
-  const coercedValue = serializeObject(outputValue);
-
-  if (typeof coercedValue === 'boolean') {
-    return coercedValue;
-  }
-  if (isFinite(coercedValue)) {
-    return coercedValue !== 0;
-  }
-  throw new GraphQLError(
-    `Boolean cannot represent a non boolean value: ${inspect(coercedValue)}`,
-  );
-}
-
-function coerceBoolean(inputValue: mixed): boolean {
-  if (typeof inputValue !== 'boolean') {
-    throw new GraphQLError(
-      `Boolean cannot represent a non boolean value: ${inspect(inputValue)}`,
-    );
-  }
-  return inputValue;
-}
-
-export const GraphQLBoolean = new GraphQLScalarType({
-  name: 'Boolean',
-  description: 'The `Boolean` scalar type represents `true` or `false`.',
-  serialize: serializeBoolean,
-  parseValue: coerceBoolean,
-  parseLiteral(valueNode) {
-    if (valueNode.kind !== Kind.BOOLEAN) {
-      throw new GraphQLError(
-        `Boolean cannot represent a non boolean value: ${print(valueNode)}`,
-        valueNode,
-      );
-    }
-    return valueNode.value;
-  },
-});
-
-function serializeID(outputValue: mixed): string {
-  const coercedValue = serializeObject(outputValue);
-
-  if (typeof coercedValue === 'string') {
-    return coercedValue;
-  }
-  if (isInteger(coercedValue)) {
-    return String(coercedValue);
-  }
-  throw new GraphQLError(`ID cannot represent value: ${inspect(outputValue)}`);
-}
-
-function coerceID(inputValue: mixed): string {
-  if (typeof inputValue === 'string') {
-    return inputValue;
-  }
-  if (isInteger(inputValue)) {
-    return inputValue.toString();
-  }
-  throw new GraphQLError(`ID cannot represent value: ${inspect(inputValue)}`);
-}
-
-export const GraphQLID = new GraphQLScalarType({
-  name: 'ID',
-  description:
-    'The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID.',
-  serialize: serializeID,
-  parseValue: coerceID,
-  parseLiteral(valueNode) {
-    if (valueNode.kind !== Kind.STRING && valueNode.kind !== Kind.INT) {
-      throw new GraphQLError(
-        'ID cannot represent a non-string and non-integer value: ' +
-          print(valueNode),
-        valueNode,
-      );
-    }
-    return valueNode.value;
-  },
-});
-
-export const specifiedScalarTypes = Object.freeze([
-  GraphQLString,
-  GraphQLInt,
-  GraphQLFloat,
-  GraphQLBoolean,
-  GraphQLID,
-]);
-
-export function isSpecifiedScalarType(type: GraphQLNamedType): boolean %checks {
-  return specifiedScalarTypes.some(({ name }) => type.name === name);
-}
diff --git a/node_modules/graphql/type/scalars.mjs b/node_modules/graphql/type/scalars.mjs
deleted file mode 100644
index fd64f33..0000000
--- a/node_modules/graphql/type/scalars.mjs
+++ /dev/null
@@ -1,258 +0,0 @@
-import isFinite from "../polyfills/isFinite.mjs";
-import isInteger from "../polyfills/isInteger.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import isObjectLike from "../jsutils/isObjectLike.mjs";
-import { Kind } from "../language/kinds.mjs";
-import { print } from "../language/printer.mjs";
-import { GraphQLError } from "../error/GraphQLError.mjs";
-import { GraphQLScalarType } from "./definition.mjs"; // As per the GraphQL Spec, Integers are only treated as valid when a valid
-// 32-bit signed integer, providing the broadest support across platforms.
-//
-// n.b. JavaScript's integers are safe between -(2^53 - 1) and 2^53 - 1 because
-// they are internally represented as IEEE 754 doubles.
-
-var MAX_INT = 2147483647;
-var MIN_INT = -2147483648;
-
-function serializeInt(outputValue) {
-  var coercedValue = serializeObject(outputValue);
-
-  if (typeof coercedValue === 'boolean') {
-    return coercedValue ? 1 : 0;
-  }
-
-  var num = coercedValue;
-
-  if (typeof coercedValue === 'string' && coercedValue !== '') {
-    num = Number(coercedValue);
-  }
-
-  if (!isInteger(num)) {
-    throw new GraphQLError("Int cannot represent non-integer value: ".concat(inspect(coercedValue)));
-  }
-
-  if (num > MAX_INT || num < MIN_INT) {
-    throw new GraphQLError('Int cannot represent non 32-bit signed integer value: ' + inspect(coercedValue));
-  }
-
-  return num;
-}
-
-function coerceInt(inputValue) {
-  if (!isInteger(inputValue)) {
-    throw new GraphQLError("Int cannot represent non-integer value: ".concat(inspect(inputValue)));
-  }
-
-  if (inputValue > MAX_INT || inputValue < MIN_INT) {
-    throw new GraphQLError("Int cannot represent non 32-bit signed integer value: ".concat(inputValue));
-  }
-
-  return inputValue;
-}
-
-export var GraphQLInt = new GraphQLScalarType({
-  name: 'Int',
-  description: 'The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.',
-  serialize: serializeInt,
-  parseValue: coerceInt,
-  parseLiteral: function parseLiteral(valueNode) {
-    if (valueNode.kind !== Kind.INT) {
-      throw new GraphQLError("Int cannot represent non-integer value: ".concat(print(valueNode)), valueNode);
-    }
-
-    var num = parseInt(valueNode.value, 10);
-
-    if (num > MAX_INT || num < MIN_INT) {
-      throw new GraphQLError("Int cannot represent non 32-bit signed integer value: ".concat(valueNode.value), valueNode);
-    }
-
-    return num;
-  }
-});
-
-function serializeFloat(outputValue) {
-  var coercedValue = serializeObject(outputValue);
-
-  if (typeof coercedValue === 'boolean') {
-    return coercedValue ? 1 : 0;
-  }
-
-  var num = coercedValue;
-
-  if (typeof coercedValue === 'string' && coercedValue !== '') {
-    num = Number(coercedValue);
-  }
-
-  if (!isFinite(num)) {
-    throw new GraphQLError("Float cannot represent non numeric value: ".concat(inspect(coercedValue)));
-  }
-
-  return num;
-}
-
-function coerceFloat(inputValue) {
-  if (!isFinite(inputValue)) {
-    throw new GraphQLError("Float cannot represent non numeric value: ".concat(inspect(inputValue)));
-  }
-
-  return inputValue;
-}
-
-export var GraphQLFloat = new GraphQLScalarType({
-  name: 'Float',
-  description: 'The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).',
-  serialize: serializeFloat,
-  parseValue: coerceFloat,
-  parseLiteral: function parseLiteral(valueNode) {
-    if (valueNode.kind !== Kind.FLOAT && valueNode.kind !== Kind.INT) {
-      throw new GraphQLError("Float cannot represent non numeric value: ".concat(print(valueNode)), valueNode);
-    }
-
-    return parseFloat(valueNode.value);
-  }
-}); // Support serializing objects with custom valueOf() or toJSON() functions -
-// a common way to represent a complex value which can be represented as
-// a string (ex: MongoDB id objects).
-
-function serializeObject(outputValue) {
-  if (isObjectLike(outputValue)) {
-    if (typeof outputValue.valueOf === 'function') {
-      var valueOfResult = outputValue.valueOf();
-
-      if (!isObjectLike(valueOfResult)) {
-        return valueOfResult;
-      }
-    }
-
-    if (typeof outputValue.toJSON === 'function') {
-      // $FlowFixMe(>=0.90.0)
-      return outputValue.toJSON();
-    }
-  }
-
-  return outputValue;
-}
-
-function serializeString(outputValue) {
-  var coercedValue = serializeObject(outputValue); // Serialize string, boolean and number values to a string, but do not
-  // attempt to coerce object, function, symbol, or other types as strings.
-
-  if (typeof coercedValue === 'string') {
-    return coercedValue;
-  }
-
-  if (typeof coercedValue === 'boolean') {
-    return coercedValue ? 'true' : 'false';
-  }
-
-  if (isFinite(coercedValue)) {
-    return coercedValue.toString();
-  }
-
-  throw new GraphQLError("String cannot represent value: ".concat(inspect(outputValue)));
-}
-
-function coerceString(inputValue) {
-  if (typeof inputValue !== 'string') {
-    throw new GraphQLError("String cannot represent a non string value: ".concat(inspect(inputValue)));
-  }
-
-  return inputValue;
-}
-
-export var GraphQLString = new GraphQLScalarType({
-  name: 'String',
-  description: 'The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.',
-  serialize: serializeString,
-  parseValue: coerceString,
-  parseLiteral: function parseLiteral(valueNode) {
-    if (valueNode.kind !== Kind.STRING) {
-      throw new GraphQLError("String cannot represent a non string value: ".concat(print(valueNode)), valueNode);
-    }
-
-    return valueNode.value;
-  }
-});
-
-function serializeBoolean(outputValue) {
-  var coercedValue = serializeObject(outputValue);
-
-  if (typeof coercedValue === 'boolean') {
-    return coercedValue;
-  }
-
-  if (isFinite(coercedValue)) {
-    return coercedValue !== 0;
-  }
-
-  throw new GraphQLError("Boolean cannot represent a non boolean value: ".concat(inspect(coercedValue)));
-}
-
-function coerceBoolean(inputValue) {
-  if (typeof inputValue !== 'boolean') {
-    throw new GraphQLError("Boolean cannot represent a non boolean value: ".concat(inspect(inputValue)));
-  }
-
-  return inputValue;
-}
-
-export var GraphQLBoolean = new GraphQLScalarType({
-  name: 'Boolean',
-  description: 'The `Boolean` scalar type represents `true` or `false`.',
-  serialize: serializeBoolean,
-  parseValue: coerceBoolean,
-  parseLiteral: function parseLiteral(valueNode) {
-    if (valueNode.kind !== Kind.BOOLEAN) {
-      throw new GraphQLError("Boolean cannot represent a non boolean value: ".concat(print(valueNode)), valueNode);
-    }
-
-    return valueNode.value;
-  }
-});
-
-function serializeID(outputValue) {
-  var coercedValue = serializeObject(outputValue);
-
-  if (typeof coercedValue === 'string') {
-    return coercedValue;
-  }
-
-  if (isInteger(coercedValue)) {
-    return String(coercedValue);
-  }
-
-  throw new GraphQLError("ID cannot represent value: ".concat(inspect(outputValue)));
-}
-
-function coerceID(inputValue) {
-  if (typeof inputValue === 'string') {
-    return inputValue;
-  }
-
-  if (isInteger(inputValue)) {
-    return inputValue.toString();
-  }
-
-  throw new GraphQLError("ID cannot represent value: ".concat(inspect(inputValue)));
-}
-
-export var GraphQLID = new GraphQLScalarType({
-  name: 'ID',
-  description: 'The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID.',
-  serialize: serializeID,
-  parseValue: coerceID,
-  parseLiteral: function parseLiteral(valueNode) {
-    if (valueNode.kind !== Kind.STRING && valueNode.kind !== Kind.INT) {
-      throw new GraphQLError('ID cannot represent a non-string and non-integer value: ' + print(valueNode), valueNode);
-    }
-
-    return valueNode.value;
-  }
-});
-export var specifiedScalarTypes = Object.freeze([GraphQLString, GraphQLInt, GraphQLFloat, GraphQLBoolean, GraphQLID]);
-export function isSpecifiedScalarType(type) {
-  return specifiedScalarTypes.some(function (_ref) {
-    var name = _ref.name;
-    return type.name === name;
-  });
-}
diff --git a/node_modules/graphql/type/schema.d.ts b/node_modules/graphql/type/schema.d.ts
deleted file mode 100644
index be2cfb4..0000000
--- a/node_modules/graphql/type/schema.d.ts
+++ /dev/null
@@ -1,129 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-
-import { SchemaDefinitionNode, SchemaExtensionNode } from '../language/ast';
-
-import { GraphQLDirective } from './directives';
-import {
-  GraphQLNamedType,
-  GraphQLAbstractType,
-  GraphQLObjectType,
-  GraphQLInterfaceType,
-} from './definition';
-
-/**
- * Test if the given value is a GraphQL schema.
- */
-export function isSchema(schema: any): schema is GraphQLSchema;
-export function assertSchema(schema: any): GraphQLSchema;
-
-/**
- * Schema Definition
- *
- * A Schema is created by supplying the root types of each type of operation,
- * query and mutation (optional). A schema definition is then supplied to the
- * validator and executor.
- *
- * Example:
- *
- *     const MyAppSchema = new GraphQLSchema({
- *       query: MyAppQueryRootType,
- *       mutation: MyAppMutationRootType,
- *     })
- *
- * Note: If an array of `directives` are provided to GraphQLSchema, that will be
- * the exact list of directives represented and allowed. If `directives` is not
- * provided then a default set of the specified directives (e.g. @include and
- * @skip) will be used. If you wish to provide *additional* directives to these
- * specified directives, you must explicitly declare them. Example:
- *
- *     const MyAppSchema = new GraphQLSchema({
- *       ...
- *       directives: specifiedDirectives.concat([ myCustomDirective ]),
- *     })
- *
- */
-export class GraphQLSchema {
-  description: Maybe<string>;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  astNode: Maybe<SchemaDefinitionNode>;
-  extensionASTNodes: Maybe<ReadonlyArray<SchemaExtensionNode>>;
-
-  constructor(config: Readonly<GraphQLSchemaConfig>);
-  getQueryType(): Maybe<GraphQLObjectType>;
-  getMutationType(): Maybe<GraphQLObjectType>;
-  getSubscriptionType(): Maybe<GraphQLObjectType>;
-  getTypeMap(): TypeMap;
-  getType(name: string): Maybe<GraphQLNamedType>;
-
-  getPossibleTypes(
-    abstractType: GraphQLAbstractType,
-  ): ReadonlyArray<GraphQLObjectType>;
-
-  getImplementations(
-    interfaceType: GraphQLInterfaceType,
-  ): InterfaceImplementations;
-
-  // @deprecated: use isSubType instead - will be removed in v16.
-  isPossibleType(
-    abstractType: GraphQLAbstractType,
-    possibleType: GraphQLObjectType,
-  ): boolean;
-
-  isSubType(
-    abstractType: GraphQLAbstractType,
-    maybeSubType: GraphQLNamedType,
-  ): boolean;
-
-  getDirectives(): ReadonlyArray<GraphQLDirective>;
-  getDirective(name: string): Maybe<GraphQLDirective>;
-
-  toConfig(): GraphQLSchemaConfig & {
-    types: Array<GraphQLNamedType>;
-    directives: Array<GraphQLDirective>;
-    extensions: Maybe<Readonly<Record<string, any>>>;
-    extensionASTNodes: ReadonlyArray<SchemaExtensionNode>;
-    assumeValid: boolean;
-  };
-}
-
-type TypeMap = { [key: string]: GraphQLNamedType };
-
-type InterfaceImplementations = {
-  objects: ReadonlyArray<GraphQLObjectType>;
-  interfaces: ReadonlyArray<GraphQLInterfaceType>;
-};
-
-export interface GraphQLSchemaValidationOptions {
-  /**
-   * When building a schema from a GraphQL service's introspection result, it
-   * might be safe to assume the schema is valid. Set to true to assume the
-   * produced schema is valid.
-   *
-   * Default: false
-   */
-  assumeValid?: boolean;
-}
-
-export interface GraphQLSchemaConfig extends GraphQLSchemaValidationOptions {
-  description?: Maybe<string>;
-  query: Maybe<GraphQLObjectType>;
-  mutation?: Maybe<GraphQLObjectType>;
-  subscription?: Maybe<GraphQLObjectType>;
-  types?: Maybe<Array<GraphQLNamedType>>;
-  directives?: Maybe<Array<GraphQLDirective>>;
-  extensions?: Maybe<Readonly<Record<string, any>>>;
-  astNode?: Maybe<SchemaDefinitionNode>;
-  extensionASTNodes?: Maybe<ReadonlyArray<SchemaExtensionNode>>;
-}
-
-/**
- * @internal
- */
-export interface GraphQLSchemaNormalizedConfig extends GraphQLSchemaConfig {
-  description: Maybe<string>;
-  types: Array<GraphQLNamedType>;
-  directives: Array<GraphQLDirective>;
-  extensions: Maybe<Readonly<Record<string, any>>>;
-  extensionASTNodes: Maybe<ReadonlyArray<SchemaExtensionNode>>;
-  assumeValid: boolean;
-}
diff --git a/node_modules/graphql/type/schema.js b/node_modules/graphql/type/schema.js
deleted file mode 100644
index 31584cf..0000000
--- a/node_modules/graphql/type/schema.js
+++ /dev/null
@@ -1,385 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.isSchema = isSchema;
-exports.assertSchema = assertSchema;
-exports.GraphQLSchema = void 0;
-
-var _find = _interopRequireDefault(require("../polyfills/find"));
-
-var _arrayFrom3 = _interopRequireDefault(require("../polyfills/arrayFrom"));
-
-var _objectValues5 = _interopRequireDefault(require("../polyfills/objectValues"));
-
-var _symbols = require("../polyfills/symbols");
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _toObjMap = _interopRequireDefault(require("../jsutils/toObjMap"));
-
-var _devAssert = _interopRequireDefault(require("../jsutils/devAssert"));
-
-var _instanceOf = _interopRequireDefault(require("../jsutils/instanceOf"));
-
-var _isObjectLike = _interopRequireDefault(require("../jsutils/isObjectLike"));
-
-var _introspection = require("./introspection");
-
-var _directives = require("./directives");
-
-var _definition = require("./definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-// eslint-disable-next-line no-redeclare
-function isSchema(schema) {
-  return (0, _instanceOf.default)(schema, GraphQLSchema);
-}
-
-function assertSchema(schema) {
-  if (!isSchema(schema)) {
-    throw new Error("Expected ".concat((0, _inspect.default)(schema), " to be a GraphQL schema."));
-  }
-
-  return schema;
-}
-/**
- * Schema Definition
- *
- * A Schema is created by supplying the root types of each type of operation,
- * query and mutation (optional). A schema definition is then supplied to the
- * validator and executor.
- *
- * Example:
- *
- *     const MyAppSchema = new GraphQLSchema({
- *       query: MyAppQueryRootType,
- *       mutation: MyAppMutationRootType,
- *     })
- *
- * Note: When the schema is constructed, by default only the types that are
- * reachable by traversing the root types are included, other types must be
- * explicitly referenced.
- *
- * Example:
- *
- *     const characterInterface = new GraphQLInterfaceType({
- *       name: 'Character',
- *       ...
- *     });
- *
- *     const humanType = new GraphQLObjectType({
- *       name: 'Human',
- *       interfaces: [characterInterface],
- *       ...
- *     });
- *
- *     const droidType = new GraphQLObjectType({
- *       name: 'Droid',
- *       interfaces: [characterInterface],
- *       ...
- *     });
- *
- *     const schema = new GraphQLSchema({
- *       query: new GraphQLObjectType({
- *         name: 'Query',
- *         fields: {
- *           hero: { type: characterInterface, ... },
- *         }
- *       }),
- *       ...
- *       // Since this schema references only the `Character` interface it's
- *       // necessary to explicitly list the types that implement it if
- *       // you want them to be included in the final schema.
- *       types: [humanType, droidType],
- *     })
- *
- * Note: If an array of `directives` are provided to GraphQLSchema, that will be
- * the exact list of directives represented and allowed. If `directives` is not
- * provided then a default set of the specified directives (e.g. @include and
- * @skip) will be used. If you wish to provide *additional* directives to these
- * specified directives, you must explicitly declare them. Example:
- *
- *     const MyAppSchema = new GraphQLSchema({
- *       ...
- *       directives: specifiedDirectives.concat([ myCustomDirective ]),
- *     })
- *
- */
-
-
-var GraphQLSchema =
-/*#__PURE__*/
-function () {
-  // Used as a cache for validateSchema().
-  function GraphQLSchema(config) {
-    var _config$directives;
-
-    // If this schema was built from a source known to be valid, then it may be
-    // marked with assumeValid to avoid an additional type system validation.
-    this.__validationErrors = config.assumeValid === true ? [] : undefined; // Check for common mistakes during construction to produce early errors.
-
-    (0, _isObjectLike.default)(config) || (0, _devAssert.default)(0, 'Must provide configuration object.');
-    !config.types || Array.isArray(config.types) || (0, _devAssert.default)(0, "\"types\" must be Array if provided but got: ".concat((0, _inspect.default)(config.types), "."));
-    !config.directives || Array.isArray(config.directives) || (0, _devAssert.default)(0, '"directives" must be Array if provided but got: ' + "".concat((0, _inspect.default)(config.directives), "."));
-    this.description = config.description;
-    this.extensions = config.extensions && (0, _toObjMap.default)(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = config.extensionASTNodes;
-    this._queryType = config.query;
-    this._mutationType = config.mutation;
-    this._subscriptionType = config.subscription; // Provide specified directives (e.g. @include and @skip) by default.
-
-    this._directives = (_config$directives = config.directives) !== null && _config$directives !== void 0 ? _config$directives : _directives.specifiedDirectives; // To preserve order of user-provided types, we add first to add them to
-    // the set of "collected" types, so `collectReferencedTypes` ignore them.
-
-    var allReferencedTypes = new Set(config.types);
-
-    if (config.types != null) {
-      for (var _i2 = 0, _config$types2 = config.types; _i2 < _config$types2.length; _i2++) {
-        var type = _config$types2[_i2];
-        // When we ready to process this type, we remove it from "collected" types
-        // and then add it together with all dependent types in the correct position.
-        allReferencedTypes.delete(type);
-        collectReferencedTypes(type, allReferencedTypes);
-      }
-    }
-
-    if (this._queryType != null) {
-      collectReferencedTypes(this._queryType, allReferencedTypes);
-    }
-
-    if (this._mutationType != null) {
-      collectReferencedTypes(this._mutationType, allReferencedTypes);
-    }
-
-    if (this._subscriptionType != null) {
-      collectReferencedTypes(this._subscriptionType, allReferencedTypes);
-    }
-
-    for (var _i4 = 0, _this$_directives2 = this._directives; _i4 < _this$_directives2.length; _i4++) {
-      var directive = _this$_directives2[_i4];
-
-      // Directives are not validated until validateSchema() is called.
-      if ((0, _directives.isDirective)(directive)) {
-        for (var _i6 = 0, _directive$args2 = directive.args; _i6 < _directive$args2.length; _i6++) {
-          var arg = _directive$args2[_i6];
-          collectReferencedTypes(arg.type, allReferencedTypes);
-        }
-      }
-    }
-
-    collectReferencedTypes(_introspection.__Schema, allReferencedTypes); // Storing the resulting map for reference by the schema.
-
-    this._typeMap = Object.create(null);
-    this._subTypeMap = Object.create(null); // Keep track of all implementations by interface name.
-
-    this._implementationsMap = Object.create(null);
-
-    for (var _i8 = 0, _arrayFrom2 = (0, _arrayFrom3.default)(allReferencedTypes); _i8 < _arrayFrom2.length; _i8++) {
-      var namedType = _arrayFrom2[_i8];
-
-      if (namedType == null) {
-        continue;
-      }
-
-      var typeName = namedType.name;
-
-      if (this._typeMap[typeName] !== undefined) {
-        throw new Error("Schema must contain uniquely named types but contains multiple types named \"".concat(typeName, "\"."));
-      }
-
-      this._typeMap[typeName] = namedType;
-
-      if ((0, _definition.isInterfaceType)(namedType)) {
-        // Store implementations by interface.
-        for (var _i10 = 0, _namedType$getInterfa2 = namedType.getInterfaces(); _i10 < _namedType$getInterfa2.length; _i10++) {
-          var iface = _namedType$getInterfa2[_i10];
-
-          if ((0, _definition.isInterfaceType)(iface)) {
-            var implementations = this._implementationsMap[iface.name];
-
-            if (implementations === undefined) {
-              implementations = this._implementationsMap[iface.name] = {
-                objects: [],
-                interfaces: []
-              };
-            }
-
-            implementations.interfaces.push(namedType);
-          }
-        }
-      } else if ((0, _definition.isObjectType)(namedType)) {
-        // Store implementations by objects.
-        for (var _i12 = 0, _namedType$getInterfa4 = namedType.getInterfaces(); _i12 < _namedType$getInterfa4.length; _i12++) {
-          var _iface = _namedType$getInterfa4[_i12];
-
-          if ((0, _definition.isInterfaceType)(_iface)) {
-            var _implementations = this._implementationsMap[_iface.name];
-
-            if (_implementations === undefined) {
-              _implementations = this._implementationsMap[_iface.name] = {
-                objects: [],
-                interfaces: []
-              };
-            }
-
-            _implementations.objects.push(namedType);
-          }
-        }
-      }
-    }
-  }
-
-  var _proto = GraphQLSchema.prototype;
-
-  _proto.getQueryType = function getQueryType() {
-    return this._queryType;
-  };
-
-  _proto.getMutationType = function getMutationType() {
-    return this._mutationType;
-  };
-
-  _proto.getSubscriptionType = function getSubscriptionType() {
-    return this._subscriptionType;
-  };
-
-  _proto.getTypeMap = function getTypeMap() {
-    return this._typeMap;
-  };
-
-  _proto.getType = function getType(name) {
-    return this.getTypeMap()[name];
-  };
-
-  _proto.getPossibleTypes = function getPossibleTypes(abstractType) {
-    return (0, _definition.isUnionType)(abstractType) ? abstractType.getTypes() : this.getImplementations(abstractType).objects;
-  };
-
-  _proto.getImplementations = function getImplementations(interfaceType) {
-    var implementations = this._implementationsMap[interfaceType.name];
-    return implementations !== null && implementations !== void 0 ? implementations : {
-      objects: [],
-      interfaces: []
-    };
-  } // @deprecated: use isSubType instead - will be removed in v16.
-  ;
-
-  _proto.isPossibleType = function isPossibleType(abstractType, possibleType) {
-    return this.isSubType(abstractType, possibleType);
-  };
-
-  _proto.isSubType = function isSubType(abstractType, maybeSubType) {
-    var map = this._subTypeMap[abstractType.name];
-
-    if (map === undefined) {
-      map = Object.create(null);
-
-      if ((0, _definition.isUnionType)(abstractType)) {
-        for (var _i14 = 0, _abstractType$getType2 = abstractType.getTypes(); _i14 < _abstractType$getType2.length; _i14++) {
-          var type = _abstractType$getType2[_i14];
-          map[type.name] = true;
-        }
-      } else {
-        var implementations = this.getImplementations(abstractType);
-
-        for (var _i16 = 0, _implementations$obje2 = implementations.objects; _i16 < _implementations$obje2.length; _i16++) {
-          var _type = _implementations$obje2[_i16];
-          map[_type.name] = true;
-        }
-
-        for (var _i18 = 0, _implementations$inte2 = implementations.interfaces; _i18 < _implementations$inte2.length; _i18++) {
-          var _type2 = _implementations$inte2[_i18];
-          map[_type2.name] = true;
-        }
-      }
-
-      this._subTypeMap[abstractType.name] = map;
-    }
-
-    return map[maybeSubType.name] !== undefined;
-  };
-
-  _proto.getDirectives = function getDirectives() {
-    return this._directives;
-  };
-
-  _proto.getDirective = function getDirective(name) {
-    return (0, _find.default)(this.getDirectives(), function (directive) {
-      return directive.name === name;
-    });
-  };
-
-  _proto.toConfig = function toConfig() {
-    var _this$extensionASTNod;
-
-    return {
-      description: this.description,
-      query: this.getQueryType(),
-      mutation: this.getMutationType(),
-      subscription: this.getSubscriptionType(),
-      types: (0, _objectValues5.default)(this.getTypeMap()),
-      directives: this.getDirectives().slice(),
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: (_this$extensionASTNod = this.extensionASTNodes) !== null && _this$extensionASTNod !== void 0 ? _this$extensionASTNod : [],
-      assumeValid: this.__validationErrors !== undefined
-    };
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLSchema, [{
-    key: _symbols.SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLSchema';
-    }
-  }]);
-
-  return GraphQLSchema;
-}();
-
-exports.GraphQLSchema = GraphQLSchema;
-
-function collectReferencedTypes(type, typeSet) {
-  var namedType = (0, _definition.getNamedType)(type);
-
-  if (!typeSet.has(namedType)) {
-    typeSet.add(namedType);
-
-    if ((0, _definition.isUnionType)(namedType)) {
-      for (var _i20 = 0, _namedType$getTypes2 = namedType.getTypes(); _i20 < _namedType$getTypes2.length; _i20++) {
-        var memberType = _namedType$getTypes2[_i20];
-        collectReferencedTypes(memberType, typeSet);
-      }
-    } else if ((0, _definition.isObjectType)(namedType) || (0, _definition.isInterfaceType)(namedType)) {
-      for (var _i22 = 0, _namedType$getInterfa6 = namedType.getInterfaces(); _i22 < _namedType$getInterfa6.length; _i22++) {
-        var interfaceType = _namedType$getInterfa6[_i22];
-        collectReferencedTypes(interfaceType, typeSet);
-      }
-
-      for (var _i24 = 0, _objectValues2 = (0, _objectValues5.default)(namedType.getFields()); _i24 < _objectValues2.length; _i24++) {
-        var field = _objectValues2[_i24];
-        collectReferencedTypes(field.type, typeSet);
-
-        for (var _i26 = 0, _field$args2 = field.args; _i26 < _field$args2.length; _i26++) {
-          var arg = _field$args2[_i26];
-          collectReferencedTypes(arg.type, typeSet);
-        }
-      }
-    } else if ((0, _definition.isInputObjectType)(namedType)) {
-      for (var _i28 = 0, _objectValues4 = (0, _objectValues5.default)(namedType.getFields()); _i28 < _objectValues4.length; _i28++) {
-        var _field = _objectValues4[_i28];
-        collectReferencedTypes(_field.type, typeSet);
-      }
-    }
-  }
-
-  return typeSet;
-}
diff --git a/node_modules/graphql/type/schema.js.flow b/node_modules/graphql/type/schema.js.flow
deleted file mode 100644
index 5cb5241..0000000
--- a/node_modules/graphql/type/schema.js.flow
+++ /dev/null
@@ -1,429 +0,0 @@
-// @flow strict
-
-import find from '../polyfills/find';
-import arrayFrom from '../polyfills/arrayFrom';
-import objectValues from '../polyfills/objectValues';
-import { SYMBOL_TO_STRING_TAG } from '../polyfills/symbols';
-
-import inspect from '../jsutils/inspect';
-import toObjMap from '../jsutils/toObjMap';
-import devAssert from '../jsutils/devAssert';
-import instanceOf from '../jsutils/instanceOf';
-import isObjectLike from '../jsutils/isObjectLike';
-import {
-  type ObjMap,
-  type ReadOnlyObjMap,
-  type ReadOnlyObjMapLike,
-} from '../jsutils/ObjMap';
-
-import { type GraphQLError } from '../error/GraphQLError';
-import {
-  type SchemaDefinitionNode,
-  type SchemaExtensionNode,
-} from '../language/ast';
-
-import { __Schema } from './introspection';
-import {
-  GraphQLDirective,
-  isDirective,
-  specifiedDirectives,
-} from './directives';
-import {
-  type GraphQLType,
-  type GraphQLNamedType,
-  type GraphQLAbstractType,
-  type GraphQLObjectType,
-  type GraphQLInterfaceType,
-  isObjectType,
-  isInterfaceType,
-  isUnionType,
-  isInputObjectType,
-  getNamedType,
-} from './definition';
-
-/**
- * Test if the given value is a GraphQL schema.
- */
-declare function isSchema(schema: mixed): boolean %checks(schema instanceof
-  GraphQLSchema);
-// eslint-disable-next-line no-redeclare
-export function isSchema(schema) {
-  return instanceOf(schema, GraphQLSchema);
-}
-
-export function assertSchema(schema: mixed): GraphQLSchema {
-  if (!isSchema(schema)) {
-    throw new Error(`Expected ${inspect(schema)} to be a GraphQL schema.`);
-  }
-  return schema;
-}
-
-/**
- * Schema Definition
- *
- * A Schema is created by supplying the root types of each type of operation,
- * query and mutation (optional). A schema definition is then supplied to the
- * validator and executor.
- *
- * Example:
- *
- *     const MyAppSchema = new GraphQLSchema({
- *       query: MyAppQueryRootType,
- *       mutation: MyAppMutationRootType,
- *     })
- *
- * Note: When the schema is constructed, by default only the types that are
- * reachable by traversing the root types are included, other types must be
- * explicitly referenced.
- *
- * Example:
- *
- *     const characterInterface = new GraphQLInterfaceType({
- *       name: 'Character',
- *       ...
- *     });
- *
- *     const humanType = new GraphQLObjectType({
- *       name: 'Human',
- *       interfaces: [characterInterface],
- *       ...
- *     });
- *
- *     const droidType = new GraphQLObjectType({
- *       name: 'Droid',
- *       interfaces: [characterInterface],
- *       ...
- *     });
- *
- *     const schema = new GraphQLSchema({
- *       query: new GraphQLObjectType({
- *         name: 'Query',
- *         fields: {
- *           hero: { type: characterInterface, ... },
- *         }
- *       }),
- *       ...
- *       // Since this schema references only the `Character` interface it's
- *       // necessary to explicitly list the types that implement it if
- *       // you want them to be included in the final schema.
- *       types: [humanType, droidType],
- *     })
- *
- * Note: If an array of `directives` are provided to GraphQLSchema, that will be
- * the exact list of directives represented and allowed. If `directives` is not
- * provided then a default set of the specified directives (e.g. @include and
- * @skip) will be used. If you wish to provide *additional* directives to these
- * specified directives, you must explicitly declare them. Example:
- *
- *     const MyAppSchema = new GraphQLSchema({
- *       ...
- *       directives: specifiedDirectives.concat([ myCustomDirective ]),
- *     })
- *
- */
-export class GraphQLSchema {
-  description: ?string;
-  extensions: ?ReadOnlyObjMap<mixed>;
-  astNode: ?SchemaDefinitionNode;
-  extensionASTNodes: ?$ReadOnlyArray<SchemaExtensionNode>;
-
-  _queryType: ?GraphQLObjectType;
-  _mutationType: ?GraphQLObjectType;
-  _subscriptionType: ?GraphQLObjectType;
-  _directives: $ReadOnlyArray<GraphQLDirective>;
-  _typeMap: TypeMap;
-  _subTypeMap: ObjMap<ObjMap<boolean>>;
-  _implementationsMap: ObjMap<{|
-    objects: Array<GraphQLObjectType>,
-    interfaces: Array<GraphQLInterfaceType>,
-  |}>;
-
-  // Used as a cache for validateSchema().
-  __validationErrors: ?$ReadOnlyArray<GraphQLError>;
-
-  constructor(config: $ReadOnly<GraphQLSchemaConfig>): void {
-    // If this schema was built from a source known to be valid, then it may be
-    // marked with assumeValid to avoid an additional type system validation.
-    this.__validationErrors = config.assumeValid === true ? [] : undefined;
-
-    // Check for common mistakes during construction to produce early errors.
-    devAssert(isObjectLike(config), 'Must provide configuration object.');
-    devAssert(
-      !config.types || Array.isArray(config.types),
-      `"types" must be Array if provided but got: ${inspect(config.types)}.`,
-    );
-    devAssert(
-      !config.directives || Array.isArray(config.directives),
-      '"directives" must be Array if provided but got: ' +
-        `${inspect(config.directives)}.`,
-    );
-
-    this.description = config.description;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = config.extensionASTNodes;
-
-    this._queryType = config.query;
-    this._mutationType = config.mutation;
-    this._subscriptionType = config.subscription;
-    // Provide specified directives (e.g. @include and @skip) by default.
-    this._directives = config.directives ?? specifiedDirectives;
-
-    // To preserve order of user-provided types, we add first to add them to
-    // the set of "collected" types, so `collectReferencedTypes` ignore them.
-    const allReferencedTypes: Set<GraphQLNamedType> = new Set(config.types);
-    if (config.types != null) {
-      for (const type of config.types) {
-        // When we ready to process this type, we remove it from "collected" types
-        // and then add it together with all dependent types in the correct position.
-        allReferencedTypes.delete(type);
-        collectReferencedTypes(type, allReferencedTypes);
-      }
-    }
-
-    if (this._queryType != null) {
-      collectReferencedTypes(this._queryType, allReferencedTypes);
-    }
-    if (this._mutationType != null) {
-      collectReferencedTypes(this._mutationType, allReferencedTypes);
-    }
-    if (this._subscriptionType != null) {
-      collectReferencedTypes(this._subscriptionType, allReferencedTypes);
-    }
-
-    for (const directive of this._directives) {
-      // Directives are not validated until validateSchema() is called.
-      if (isDirective(directive)) {
-        for (const arg of directive.args) {
-          collectReferencedTypes(arg.type, allReferencedTypes);
-        }
-      }
-    }
-    collectReferencedTypes(__Schema, allReferencedTypes);
-
-    // Storing the resulting map for reference by the schema.
-    this._typeMap = Object.create(null);
-    this._subTypeMap = Object.create(null);
-    // Keep track of all implementations by interface name.
-    this._implementationsMap = Object.create(null);
-
-    for (const namedType of arrayFrom(allReferencedTypes)) {
-      if (namedType == null) {
-        continue;
-      }
-
-      const typeName = namedType.name;
-      if (this._typeMap[typeName] !== undefined) {
-        throw new Error(
-          `Schema must contain uniquely named types but contains multiple types named "${typeName}".`,
-        );
-      }
-      this._typeMap[typeName] = namedType;
-
-      if (isInterfaceType(namedType)) {
-        // Store implementations by interface.
-        for (const iface of namedType.getInterfaces()) {
-          if (isInterfaceType(iface)) {
-            let implementations = this._implementationsMap[iface.name];
-            if (implementations === undefined) {
-              implementations = this._implementationsMap[iface.name] = {
-                objects: [],
-                interfaces: [],
-              };
-            }
-
-            implementations.interfaces.push(namedType);
-          }
-        }
-      } else if (isObjectType(namedType)) {
-        // Store implementations by objects.
-        for (const iface of namedType.getInterfaces()) {
-          if (isInterfaceType(iface)) {
-            let implementations = this._implementationsMap[iface.name];
-            if (implementations === undefined) {
-              implementations = this._implementationsMap[iface.name] = {
-                objects: [],
-                interfaces: [],
-              };
-            }
-
-            implementations.objects.push(namedType);
-          }
-        }
-      }
-    }
-  }
-
-  getQueryType(): ?GraphQLObjectType {
-    return this._queryType;
-  }
-
-  getMutationType(): ?GraphQLObjectType {
-    return this._mutationType;
-  }
-
-  getSubscriptionType(): ?GraphQLObjectType {
-    return this._subscriptionType;
-  }
-
-  getTypeMap(): TypeMap {
-    return this._typeMap;
-  }
-
-  getType(name: string): ?GraphQLNamedType {
-    return this.getTypeMap()[name];
-  }
-
-  getPossibleTypes(
-    abstractType: GraphQLAbstractType,
-  ): $ReadOnlyArray<GraphQLObjectType> {
-    return isUnionType(abstractType)
-      ? abstractType.getTypes()
-      : this.getImplementations(abstractType).objects;
-  }
-
-  getImplementations(
-    interfaceType: GraphQLInterfaceType,
-  ): {|
-    objects: /* $ReadOnly */ Array<GraphQLObjectType>,
-    interfaces: /* $ReadOnly */ Array<GraphQLInterfaceType>,
-  |} {
-    const implementations = this._implementationsMap[interfaceType.name];
-    return implementations ?? { objects: [], interfaces: [] };
-  }
-
-  // @deprecated: use isSubType instead - will be removed in v16.
-  isPossibleType(
-    abstractType: GraphQLAbstractType,
-    possibleType: GraphQLObjectType,
-  ): boolean {
-    return this.isSubType(abstractType, possibleType);
-  }
-
-  isSubType(
-    abstractType: GraphQLAbstractType,
-    maybeSubType: GraphQLObjectType | GraphQLInterfaceType,
-  ): boolean {
-    let map = this._subTypeMap[abstractType.name];
-    if (map === undefined) {
-      map = Object.create(null);
-
-      if (isUnionType(abstractType)) {
-        for (const type of abstractType.getTypes()) {
-          map[type.name] = true;
-        }
-      } else {
-        const implementations = this.getImplementations(abstractType);
-        for (const type of implementations.objects) {
-          map[type.name] = true;
-        }
-        for (const type of implementations.interfaces) {
-          map[type.name] = true;
-        }
-      }
-
-      this._subTypeMap[abstractType.name] = map;
-    }
-    return map[maybeSubType.name] !== undefined;
-  }
-
-  getDirectives(): $ReadOnlyArray<GraphQLDirective> {
-    return this._directives;
-  }
-
-  getDirective(name: string): ?GraphQLDirective {
-    return find(this.getDirectives(), directive => directive.name === name);
-  }
-
-  toConfig(): GraphQLSchemaNormalizedConfig {
-    return {
-      description: this.description,
-      query: this.getQueryType(),
-      mutation: this.getMutationType(),
-      subscription: this.getSubscriptionType(),
-      types: objectValues(this.getTypeMap()),
-      directives: this.getDirectives().slice(),
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: this.extensionASTNodes ?? [],
-      assumeValid: this.__validationErrors !== undefined,
-    };
-  }
-
-  // $FlowFixMe Flow doesn't support computed properties yet
-  get [SYMBOL_TO_STRING_TAG]() {
-    return 'GraphQLSchema';
-  }
-}
-
-type TypeMap = ObjMap<GraphQLNamedType>;
-
-export type GraphQLSchemaValidationOptions = {|
-  /**
-   * When building a schema from a GraphQL service's introspection result, it
-   * might be safe to assume the schema is valid. Set to true to assume the
-   * produced schema is valid.
-   *
-   * Default: false
-   */
-  assumeValid?: boolean,
-|};
-
-export type GraphQLSchemaConfig = {|
-  description?: ?string,
-  query?: ?GraphQLObjectType,
-  mutation?: ?GraphQLObjectType,
-  subscription?: ?GraphQLObjectType,
-  types?: ?Array<GraphQLNamedType>,
-  directives?: ?Array<GraphQLDirective>,
-  extensions?: ?ReadOnlyObjMapLike<mixed>,
-  astNode?: ?SchemaDefinitionNode,
-  extensionASTNodes?: ?$ReadOnlyArray<SchemaExtensionNode>,
-  ...GraphQLSchemaValidationOptions,
-|};
-
-/**
- * @internal
- */
-export type GraphQLSchemaNormalizedConfig = {|
-  ...GraphQLSchemaConfig,
-  description: ?string,
-  types: Array<GraphQLNamedType>,
-  directives: Array<GraphQLDirective>,
-  extensions: ?ReadOnlyObjMap<mixed>,
-  extensionASTNodes: $ReadOnlyArray<SchemaExtensionNode>,
-  assumeValid: boolean,
-|};
-
-function collectReferencedTypes(
-  type: GraphQLType,
-  typeSet: Set<GraphQLNamedType>,
-): Set<GraphQLNamedType> {
-  const namedType = getNamedType(type);
-
-  if (!typeSet.has(namedType)) {
-    typeSet.add(namedType);
-    if (isUnionType(namedType)) {
-      for (const memberType of namedType.getTypes()) {
-        collectReferencedTypes(memberType, typeSet);
-      }
-    } else if (isObjectType(namedType) || isInterfaceType(namedType)) {
-      for (const interfaceType of namedType.getInterfaces()) {
-        collectReferencedTypes(interfaceType, typeSet);
-      }
-
-      for (const field of objectValues(namedType.getFields())) {
-        collectReferencedTypes(field.type, typeSet);
-        for (const arg of field.args) {
-          collectReferencedTypes(arg.type, typeSet);
-        }
-      }
-    } else if (isInputObjectType(namedType)) {
-      for (const field of objectValues(namedType.getFields())) {
-        collectReferencedTypes(field.type, typeSet);
-      }
-    }
-  }
-
-  return typeSet;
-}
diff --git a/node_modules/graphql/type/schema.mjs b/node_modules/graphql/type/schema.mjs
deleted file mode 100644
index 8557cca..0000000
--- a/node_modules/graphql/type/schema.mjs
+++ /dev/null
@@ -1,362 +0,0 @@
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-import find from "../polyfills/find.mjs";
-import arrayFrom from "../polyfills/arrayFrom.mjs";
-import objectValues from "../polyfills/objectValues.mjs";
-import { SYMBOL_TO_STRING_TAG } from "../polyfills/symbols.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import toObjMap from "../jsutils/toObjMap.mjs";
-import devAssert from "../jsutils/devAssert.mjs";
-import instanceOf from "../jsutils/instanceOf.mjs";
-import isObjectLike from "../jsutils/isObjectLike.mjs";
-import { __Schema } from "./introspection.mjs";
-import { GraphQLDirective, isDirective, specifiedDirectives } from "./directives.mjs";
-import { isObjectType, isInterfaceType, isUnionType, isInputObjectType, getNamedType } from "./definition.mjs";
-/**
- * Test if the given value is a GraphQL schema.
- */
-
-// eslint-disable-next-line no-redeclare
-export function isSchema(schema) {
-  return instanceOf(schema, GraphQLSchema);
-}
-export function assertSchema(schema) {
-  if (!isSchema(schema)) {
-    throw new Error("Expected ".concat(inspect(schema), " to be a GraphQL schema."));
-  }
-
-  return schema;
-}
-/**
- * Schema Definition
- *
- * A Schema is created by supplying the root types of each type of operation,
- * query and mutation (optional). A schema definition is then supplied to the
- * validator and executor.
- *
- * Example:
- *
- *     const MyAppSchema = new GraphQLSchema({
- *       query: MyAppQueryRootType,
- *       mutation: MyAppMutationRootType,
- *     })
- *
- * Note: When the schema is constructed, by default only the types that are
- * reachable by traversing the root types are included, other types must be
- * explicitly referenced.
- *
- * Example:
- *
- *     const characterInterface = new GraphQLInterfaceType({
- *       name: 'Character',
- *       ...
- *     });
- *
- *     const humanType = new GraphQLObjectType({
- *       name: 'Human',
- *       interfaces: [characterInterface],
- *       ...
- *     });
- *
- *     const droidType = new GraphQLObjectType({
- *       name: 'Droid',
- *       interfaces: [characterInterface],
- *       ...
- *     });
- *
- *     const schema = new GraphQLSchema({
- *       query: new GraphQLObjectType({
- *         name: 'Query',
- *         fields: {
- *           hero: { type: characterInterface, ... },
- *         }
- *       }),
- *       ...
- *       // Since this schema references only the `Character` interface it's
- *       // necessary to explicitly list the types that implement it if
- *       // you want them to be included in the final schema.
- *       types: [humanType, droidType],
- *     })
- *
- * Note: If an array of `directives` are provided to GraphQLSchema, that will be
- * the exact list of directives represented and allowed. If `directives` is not
- * provided then a default set of the specified directives (e.g. @include and
- * @skip) will be used. If you wish to provide *additional* directives to these
- * specified directives, you must explicitly declare them. Example:
- *
- *     const MyAppSchema = new GraphQLSchema({
- *       ...
- *       directives: specifiedDirectives.concat([ myCustomDirective ]),
- *     })
- *
- */
-
-export var GraphQLSchema =
-/*#__PURE__*/
-function () {
-  // Used as a cache for validateSchema().
-  function GraphQLSchema(config) {
-    var _config$directives;
-
-    // If this schema was built from a source known to be valid, then it may be
-    // marked with assumeValid to avoid an additional type system validation.
-    this.__validationErrors = config.assumeValid === true ? [] : undefined; // Check for common mistakes during construction to produce early errors.
-
-    isObjectLike(config) || devAssert(0, 'Must provide configuration object.');
-    !config.types || Array.isArray(config.types) || devAssert(0, "\"types\" must be Array if provided but got: ".concat(inspect(config.types), "."));
-    !config.directives || Array.isArray(config.directives) || devAssert(0, '"directives" must be Array if provided but got: ' + "".concat(inspect(config.directives), "."));
-    this.description = config.description;
-    this.extensions = config.extensions && toObjMap(config.extensions);
-    this.astNode = config.astNode;
-    this.extensionASTNodes = config.extensionASTNodes;
-    this._queryType = config.query;
-    this._mutationType = config.mutation;
-    this._subscriptionType = config.subscription; // Provide specified directives (e.g. @include and @skip) by default.
-
-    this._directives = (_config$directives = config.directives) !== null && _config$directives !== void 0 ? _config$directives : specifiedDirectives; // To preserve order of user-provided types, we add first to add them to
-    // the set of "collected" types, so `collectReferencedTypes` ignore them.
-
-    var allReferencedTypes = new Set(config.types);
-
-    if (config.types != null) {
-      for (var _i2 = 0, _config$types2 = config.types; _i2 < _config$types2.length; _i2++) {
-        var type = _config$types2[_i2];
-        // When we ready to process this type, we remove it from "collected" types
-        // and then add it together with all dependent types in the correct position.
-        allReferencedTypes.delete(type);
-        collectReferencedTypes(type, allReferencedTypes);
-      }
-    }
-
-    if (this._queryType != null) {
-      collectReferencedTypes(this._queryType, allReferencedTypes);
-    }
-
-    if (this._mutationType != null) {
-      collectReferencedTypes(this._mutationType, allReferencedTypes);
-    }
-
-    if (this._subscriptionType != null) {
-      collectReferencedTypes(this._subscriptionType, allReferencedTypes);
-    }
-
-    for (var _i4 = 0, _this$_directives2 = this._directives; _i4 < _this$_directives2.length; _i4++) {
-      var directive = _this$_directives2[_i4];
-
-      // Directives are not validated until validateSchema() is called.
-      if (isDirective(directive)) {
-        for (var _i6 = 0, _directive$args2 = directive.args; _i6 < _directive$args2.length; _i6++) {
-          var arg = _directive$args2[_i6];
-          collectReferencedTypes(arg.type, allReferencedTypes);
-        }
-      }
-    }
-
-    collectReferencedTypes(__Schema, allReferencedTypes); // Storing the resulting map for reference by the schema.
-
-    this._typeMap = Object.create(null);
-    this._subTypeMap = Object.create(null); // Keep track of all implementations by interface name.
-
-    this._implementationsMap = Object.create(null);
-
-    for (var _i8 = 0, _arrayFrom2 = arrayFrom(allReferencedTypes); _i8 < _arrayFrom2.length; _i8++) {
-      var namedType = _arrayFrom2[_i8];
-
-      if (namedType == null) {
-        continue;
-      }
-
-      var typeName = namedType.name;
-
-      if (this._typeMap[typeName] !== undefined) {
-        throw new Error("Schema must contain uniquely named types but contains multiple types named \"".concat(typeName, "\"."));
-      }
-
-      this._typeMap[typeName] = namedType;
-
-      if (isInterfaceType(namedType)) {
-        // Store implementations by interface.
-        for (var _i10 = 0, _namedType$getInterfa2 = namedType.getInterfaces(); _i10 < _namedType$getInterfa2.length; _i10++) {
-          var iface = _namedType$getInterfa2[_i10];
-
-          if (isInterfaceType(iface)) {
-            var implementations = this._implementationsMap[iface.name];
-
-            if (implementations === undefined) {
-              implementations = this._implementationsMap[iface.name] = {
-                objects: [],
-                interfaces: []
-              };
-            }
-
-            implementations.interfaces.push(namedType);
-          }
-        }
-      } else if (isObjectType(namedType)) {
-        // Store implementations by objects.
-        for (var _i12 = 0, _namedType$getInterfa4 = namedType.getInterfaces(); _i12 < _namedType$getInterfa4.length; _i12++) {
-          var _iface = _namedType$getInterfa4[_i12];
-
-          if (isInterfaceType(_iface)) {
-            var _implementations = this._implementationsMap[_iface.name];
-
-            if (_implementations === undefined) {
-              _implementations = this._implementationsMap[_iface.name] = {
-                objects: [],
-                interfaces: []
-              };
-            }
-
-            _implementations.objects.push(namedType);
-          }
-        }
-      }
-    }
-  }
-
-  var _proto = GraphQLSchema.prototype;
-
-  _proto.getQueryType = function getQueryType() {
-    return this._queryType;
-  };
-
-  _proto.getMutationType = function getMutationType() {
-    return this._mutationType;
-  };
-
-  _proto.getSubscriptionType = function getSubscriptionType() {
-    return this._subscriptionType;
-  };
-
-  _proto.getTypeMap = function getTypeMap() {
-    return this._typeMap;
-  };
-
-  _proto.getType = function getType(name) {
-    return this.getTypeMap()[name];
-  };
-
-  _proto.getPossibleTypes = function getPossibleTypes(abstractType) {
-    return isUnionType(abstractType) ? abstractType.getTypes() : this.getImplementations(abstractType).objects;
-  };
-
-  _proto.getImplementations = function getImplementations(interfaceType) {
-    var implementations = this._implementationsMap[interfaceType.name];
-    return implementations !== null && implementations !== void 0 ? implementations : {
-      objects: [],
-      interfaces: []
-    };
-  } // @deprecated: use isSubType instead - will be removed in v16.
-  ;
-
-  _proto.isPossibleType = function isPossibleType(abstractType, possibleType) {
-    return this.isSubType(abstractType, possibleType);
-  };
-
-  _proto.isSubType = function isSubType(abstractType, maybeSubType) {
-    var map = this._subTypeMap[abstractType.name];
-
-    if (map === undefined) {
-      map = Object.create(null);
-
-      if (isUnionType(abstractType)) {
-        for (var _i14 = 0, _abstractType$getType2 = abstractType.getTypes(); _i14 < _abstractType$getType2.length; _i14++) {
-          var type = _abstractType$getType2[_i14];
-          map[type.name] = true;
-        }
-      } else {
-        var implementations = this.getImplementations(abstractType);
-
-        for (var _i16 = 0, _implementations$obje2 = implementations.objects; _i16 < _implementations$obje2.length; _i16++) {
-          var _type = _implementations$obje2[_i16];
-          map[_type.name] = true;
-        }
-
-        for (var _i18 = 0, _implementations$inte2 = implementations.interfaces; _i18 < _implementations$inte2.length; _i18++) {
-          var _type2 = _implementations$inte2[_i18];
-          map[_type2.name] = true;
-        }
-      }
-
-      this._subTypeMap[abstractType.name] = map;
-    }
-
-    return map[maybeSubType.name] !== undefined;
-  };
-
-  _proto.getDirectives = function getDirectives() {
-    return this._directives;
-  };
-
-  _proto.getDirective = function getDirective(name) {
-    return find(this.getDirectives(), function (directive) {
-      return directive.name === name;
-    });
-  };
-
-  _proto.toConfig = function toConfig() {
-    var _this$extensionASTNod;
-
-    return {
-      description: this.description,
-      query: this.getQueryType(),
-      mutation: this.getMutationType(),
-      subscription: this.getSubscriptionType(),
-      types: objectValues(this.getTypeMap()),
-      directives: this.getDirectives().slice(),
-      extensions: this.extensions,
-      astNode: this.astNode,
-      extensionASTNodes: (_this$extensionASTNod = this.extensionASTNodes) !== null && _this$extensionASTNod !== void 0 ? _this$extensionASTNod : [],
-      assumeValid: this.__validationErrors !== undefined
-    };
-  } // $FlowFixMe Flow doesn't support computed properties yet
-  ;
-
-  _createClass(GraphQLSchema, [{
-    key: SYMBOL_TO_STRING_TAG,
-    get: function get() {
-      return 'GraphQLSchema';
-    }
-  }]);
-
-  return GraphQLSchema;
-}();
-
-function collectReferencedTypes(type, typeSet) {
-  var namedType = getNamedType(type);
-
-  if (!typeSet.has(namedType)) {
-    typeSet.add(namedType);
-
-    if (isUnionType(namedType)) {
-      for (var _i20 = 0, _namedType$getTypes2 = namedType.getTypes(); _i20 < _namedType$getTypes2.length; _i20++) {
-        var memberType = _namedType$getTypes2[_i20];
-        collectReferencedTypes(memberType, typeSet);
-      }
-    } else if (isObjectType(namedType) || isInterfaceType(namedType)) {
-      for (var _i22 = 0, _namedType$getInterfa6 = namedType.getInterfaces(); _i22 < _namedType$getInterfa6.length; _i22++) {
-        var interfaceType = _namedType$getInterfa6[_i22];
-        collectReferencedTypes(interfaceType, typeSet);
-      }
-
-      for (var _i24 = 0, _objectValues2 = objectValues(namedType.getFields()); _i24 < _objectValues2.length; _i24++) {
-        var field = _objectValues2[_i24];
-        collectReferencedTypes(field.type, typeSet);
-
-        for (var _i26 = 0, _field$args2 = field.args; _i26 < _field$args2.length; _i26++) {
-          var arg = _field$args2[_i26];
-          collectReferencedTypes(arg.type, typeSet);
-        }
-      }
-    } else if (isInputObjectType(namedType)) {
-      for (var _i28 = 0, _objectValues4 = objectValues(namedType.getFields()); _i28 < _objectValues4.length; _i28++) {
-        var _field = _objectValues4[_i28];
-        collectReferencedTypes(_field.type, typeSet);
-      }
-    }
-  }
-
-  return typeSet;
-}
diff --git a/node_modules/graphql/type/validate.d.ts b/node_modules/graphql/type/validate.d.ts
deleted file mode 100644
index 98400a2..0000000
--- a/node_modules/graphql/type/validate.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { GraphQLError } from '../error/GraphQLError';
-
-import { GraphQLSchema } from './schema';
-
-/**
- * Implements the "Type Validation" sub-sections of the specification's
- * "Type System" section.
- *
- * Validation runs synchronously, returning an array of encountered errors, or
- * an empty array if no errors were encountered and the Schema is valid.
- */
-export function validateSchema(
-  schema: GraphQLSchema,
-): ReadonlyArray<GraphQLError>;
-
-/**
- * Utility function which asserts a schema is valid by throwing an error if
- * it is invalid.
- */
-export function assertValidSchema(schema: GraphQLSchema): void;
diff --git a/node_modules/graphql/type/validate.js b/node_modules/graphql/type/validate.js
deleted file mode 100644
index 13da100..0000000
--- a/node_modules/graphql/type/validate.js
+++ /dev/null
@@ -1,504 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.validateSchema = validateSchema;
-exports.assertValidSchema = assertValidSchema;
-
-var _find = _interopRequireDefault(require("../polyfills/find"));
-
-var _flatMap = _interopRequireDefault(require("../polyfills/flatMap"));
-
-var _objectValues5 = _interopRequireDefault(require("../polyfills/objectValues"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _GraphQLError = require("../error/GraphQLError");
-
-var _locatedError = require("../error/locatedError");
-
-var _assertValidName = require("../utilities/assertValidName");
-
-var _typeComparators = require("../utilities/typeComparators");
-
-var _directives = require("./directives");
-
-var _introspection = require("./introspection");
-
-var _schema = require("./schema");
-
-var _definition = require("./definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Implements the "Type Validation" sub-sections of the specification's
- * "Type System" section.
- *
- * Validation runs synchronously, returning an array of encountered errors, or
- * an empty array if no errors were encountered and the Schema is valid.
- */
-function validateSchema(schema) {
-  // First check to ensure the provided value is in fact a GraphQLSchema.
-  (0, _schema.assertSchema)(schema); // If this Schema has already been validated, return the previous results.
-
-  if (schema.__validationErrors) {
-    return schema.__validationErrors;
-  } // Validate the schema, producing a list of errors.
-
-
-  var context = new SchemaValidationContext(schema);
-  validateRootTypes(context);
-  validateDirectives(context);
-  validateTypes(context); // Persist the results of validation before returning to ensure validation
-  // does not run multiple times for this schema.
-
-  var errors = context.getErrors();
-  schema.__validationErrors = errors;
-  return errors;
-}
-/**
- * Utility function which asserts a schema is valid by throwing an error if
- * it is invalid.
- */
-
-
-function assertValidSchema(schema) {
-  var errors = validateSchema(schema);
-
-  if (errors.length !== 0) {
-    throw new Error(errors.map(function (error) {
-      return error.message;
-    }).join('\n\n'));
-  }
-}
-
-var SchemaValidationContext =
-/*#__PURE__*/
-function () {
-  function SchemaValidationContext(schema) {
-    this._errors = [];
-    this.schema = schema;
-  }
-
-  var _proto = SchemaValidationContext.prototype;
-
-  _proto.reportError = function reportError(message, nodes) {
-    var _nodes = Array.isArray(nodes) ? nodes.filter(Boolean) : nodes;
-
-    this.addError(new _GraphQLError.GraphQLError(message, _nodes));
-  };
-
-  _proto.addError = function addError(error) {
-    this._errors.push(error);
-  };
-
-  _proto.getErrors = function getErrors() {
-    return this._errors;
-  };
-
-  return SchemaValidationContext;
-}();
-
-function validateRootTypes(context) {
-  var schema = context.schema;
-  var queryType = schema.getQueryType();
-
-  if (!queryType) {
-    context.reportError('Query root type must be provided.', schema.astNode);
-  } else if (!(0, _definition.isObjectType)(queryType)) {
-    context.reportError("Query root type must be Object type, it cannot be ".concat((0, _inspect.default)(queryType), "."), getOperationTypeNode(schema, queryType, 'query'));
-  }
-
-  var mutationType = schema.getMutationType();
-
-  if (mutationType && !(0, _definition.isObjectType)(mutationType)) {
-    context.reportError('Mutation root type must be Object type if provided, it cannot be ' + "".concat((0, _inspect.default)(mutationType), "."), getOperationTypeNode(schema, mutationType, 'mutation'));
-  }
-
-  var subscriptionType = schema.getSubscriptionType();
-
-  if (subscriptionType && !(0, _definition.isObjectType)(subscriptionType)) {
-    context.reportError('Subscription root type must be Object type if provided, it cannot be ' + "".concat((0, _inspect.default)(subscriptionType), "."), getOperationTypeNode(schema, subscriptionType, 'subscription'));
-  }
-}
-
-function getOperationTypeNode(schema, type, operation) {
-  var operationNodes = getAllSubNodes(schema, function (node) {
-    return node.operationTypes;
-  });
-
-  for (var _i2 = 0; _i2 < operationNodes.length; _i2++) {
-    var node = operationNodes[_i2];
-
-    if (node.operation === operation) {
-      return node.type;
-    }
-  }
-
-  return type.astNode;
-}
-
-function validateDirectives(context) {
-  for (var _i4 = 0, _context$schema$getDi2 = context.schema.getDirectives(); _i4 < _context$schema$getDi2.length; _i4++) {
-    var directive = _context$schema$getDi2[_i4];
-
-    // Ensure all directives are in fact GraphQL directives.
-    if (!(0, _directives.isDirective)(directive)) {
-      context.reportError("Expected directive but got: ".concat((0, _inspect.default)(directive), "."), directive === null || directive === void 0 ? void 0 : directive.astNode);
-      continue;
-    } // Ensure they are named correctly.
-
-
-    validateName(context, directive); // TODO: Ensure proper locations.
-    // Ensure the arguments are valid.
-
-    for (var _i6 = 0, _directive$args2 = directive.args; _i6 < _directive$args2.length; _i6++) {
-      var arg = _directive$args2[_i6];
-      // Ensure they are named correctly.
-      validateName(context, arg); // Ensure the type is an input type.
-
-      if (!(0, _definition.isInputType)(arg.type)) {
-        context.reportError("The type of @".concat(directive.name, "(").concat(arg.name, ":) must be Input Type ") + "but got: ".concat((0, _inspect.default)(arg.type), "."), arg.astNode);
-      }
-    }
-  }
-}
-
-function validateName(context, node) {
-  // Ensure names are valid, however introspection types opt out.
-  var error = (0, _assertValidName.isValidNameError)(node.name);
-
-  if (error) {
-    context.addError((0, _locatedError.locatedError)(error, node.astNode));
-  }
-}
-
-function validateTypes(context) {
-  var validateInputObjectCircularRefs = createInputObjectCircularRefsValidator(context);
-  var typeMap = context.schema.getTypeMap();
-
-  for (var _i8 = 0, _objectValues2 = (0, _objectValues5.default)(typeMap); _i8 < _objectValues2.length; _i8++) {
-    var type = _objectValues2[_i8];
-
-    // Ensure all provided types are in fact GraphQL type.
-    if (!(0, _definition.isNamedType)(type)) {
-      context.reportError("Expected GraphQL named type but got: ".concat((0, _inspect.default)(type), "."), type.astNode);
-      continue;
-    } // Ensure it is named correctly (excluding introspection types).
-
-
-    if (!(0, _introspection.isIntrospectionType)(type)) {
-      validateName(context, type);
-    }
-
-    if ((0, _definition.isObjectType)(type)) {
-      // Ensure fields are valid
-      validateFields(context, type); // Ensure objects implement the interfaces they claim to.
-
-      validateInterfaces(context, type);
-    } else if ((0, _definition.isInterfaceType)(type)) {
-      // Ensure fields are valid.
-      validateFields(context, type); // Ensure interfaces implement the interfaces they claim to.
-
-      validateInterfaces(context, type);
-    } else if ((0, _definition.isUnionType)(type)) {
-      // Ensure Unions include valid member types.
-      validateUnionMembers(context, type);
-    } else if ((0, _definition.isEnumType)(type)) {
-      // Ensure Enums have valid values.
-      validateEnumValues(context, type);
-    } else if ((0, _definition.isInputObjectType)(type)) {
-      // Ensure Input Object fields are valid.
-      validateInputFields(context, type); // Ensure Input Objects do not contain non-nullable circular references
-
-      validateInputObjectCircularRefs(type);
-    }
-  }
-}
-
-function validateFields(context, type) {
-  var fields = (0, _objectValues5.default)(type.getFields()); // Objects and Interfaces both must define one or more fields.
-
-  if (fields.length === 0) {
-    context.reportError("Type ".concat(type.name, " must define one or more fields."), getAllNodes(type));
-  }
-
-  for (var _i10 = 0; _i10 < fields.length; _i10++) {
-    var field = fields[_i10];
-    // Ensure they are named correctly.
-    validateName(context, field); // Ensure the type is an output type
-
-    if (!(0, _definition.isOutputType)(field.type)) {
-      var _field$astNode;
-
-      context.reportError("The type of ".concat(type.name, ".").concat(field.name, " must be Output Type ") + "but got: ".concat((0, _inspect.default)(field.type), "."), (_field$astNode = field.astNode) === null || _field$astNode === void 0 ? void 0 : _field$astNode.type);
-    } // Ensure the arguments are valid
-
-
-    for (var _i12 = 0, _field$args2 = field.args; _i12 < _field$args2.length; _i12++) {
-      var arg = _field$args2[_i12];
-      var argName = arg.name; // Ensure they are named correctly.
-
-      validateName(context, arg); // Ensure the type is an input type
-
-      if (!(0, _definition.isInputType)(arg.type)) {
-        var _arg$astNode;
-
-        context.reportError("The type of ".concat(type.name, ".").concat(field.name, "(").concat(argName, ":) must be Input ") + "Type but got: ".concat((0, _inspect.default)(arg.type), "."), (_arg$astNode = arg.astNode) === null || _arg$astNode === void 0 ? void 0 : _arg$astNode.type);
-      }
-    }
-  }
-}
-
-function validateInterfaces(context, type) {
-  var ifaceTypeNames = Object.create(null);
-
-  for (var _i14 = 0, _type$getInterfaces2 = type.getInterfaces(); _i14 < _type$getInterfaces2.length; _i14++) {
-    var iface = _type$getInterfaces2[_i14];
-
-    if (!(0, _definition.isInterfaceType)(iface)) {
-      context.reportError("Type ".concat((0, _inspect.default)(type), " must only implement Interface types, ") + "it cannot implement ".concat((0, _inspect.default)(iface), "."), getAllImplementsInterfaceNodes(type, iface));
-      continue;
-    }
-
-    if (type === iface) {
-      context.reportError("Type ".concat(type.name, " cannot implement itself because it would create a circular reference."), getAllImplementsInterfaceNodes(type, iface));
-      continue;
-    }
-
-    if (ifaceTypeNames[iface.name]) {
-      context.reportError("Type ".concat(type.name, " can only implement ").concat(iface.name, " once."), getAllImplementsInterfaceNodes(type, iface));
-      continue;
-    }
-
-    ifaceTypeNames[iface.name] = true;
-    validateTypeImplementsAncestors(context, type, iface);
-    validateTypeImplementsInterface(context, type, iface);
-  }
-}
-
-function validateTypeImplementsInterface(context, type, iface) {
-  var typeFieldMap = type.getFields(); // Assert each interface field is implemented.
-
-  for (var _i16 = 0, _objectValues4 = (0, _objectValues5.default)(iface.getFields()); _i16 < _objectValues4.length; _i16++) {
-    var ifaceField = _objectValues4[_i16];
-    var fieldName = ifaceField.name;
-    var typeField = typeFieldMap[fieldName]; // Assert interface field exists on type.
-
-    if (!typeField) {
-      context.reportError("Interface field ".concat(iface.name, ".").concat(fieldName, " expected but ").concat(type.name, " does not provide it."), [ifaceField.astNode].concat(getAllNodes(type)));
-      continue;
-    } // Assert interface field type is satisfied by type field type, by being
-    // a valid subtype. (covariant)
-
-
-    if (!(0, _typeComparators.isTypeSubTypeOf)(context.schema, typeField.type, ifaceField.type)) {
-      context.reportError("Interface field ".concat(iface.name, ".").concat(fieldName, " expects type ") + "".concat((0, _inspect.default)(ifaceField.type), " but ").concat(type.name, ".").concat(fieldName, " ") + "is type ".concat((0, _inspect.default)(typeField.type), "."), [ifaceField.astNode.type, typeField.astNode.type]);
-    } // Assert each interface field arg is implemented.
-
-
-    var _loop = function _loop(_i18, _ifaceField$args2) {
-      var ifaceArg = _ifaceField$args2[_i18];
-      var argName = ifaceArg.name;
-      var typeArg = (0, _find.default)(typeField.args, function (arg) {
-        return arg.name === argName;
-      }); // Assert interface field arg exists on object field.
-
-      if (!typeArg) {
-        context.reportError("Interface field argument ".concat(iface.name, ".").concat(fieldName, "(").concat(argName, ":) expected but ").concat(type.name, ".").concat(fieldName, " does not provide it."), [ifaceArg.astNode, typeField.astNode]);
-        return "continue";
-      } // Assert interface field arg type matches object field arg type.
-      // (invariant)
-      // TODO: change to contravariant?
-
-
-      if (!(0, _typeComparators.isEqualType)(ifaceArg.type, typeArg.type)) {
-        context.reportError("Interface field argument ".concat(iface.name, ".").concat(fieldName, "(").concat(argName, ":) ") + "expects type ".concat((0, _inspect.default)(ifaceArg.type), " but ") + "".concat(type.name, ".").concat(fieldName, "(").concat(argName, ":) is type ") + "".concat((0, _inspect.default)(typeArg.type), "."), [ifaceArg.astNode.type, typeArg.astNode.type]);
-      } // TODO: validate default values?
-
-    };
-
-    for (var _i18 = 0, _ifaceField$args2 = ifaceField.args; _i18 < _ifaceField$args2.length; _i18++) {
-      var _ret = _loop(_i18, _ifaceField$args2);
-
-      if (_ret === "continue") continue;
-    } // Assert additional arguments must not be required.
-
-
-    var _loop2 = function _loop2(_i20, _typeField$args2) {
-      var typeArg = _typeField$args2[_i20];
-      var argName = typeArg.name;
-      var ifaceArg = (0, _find.default)(ifaceField.args, function (arg) {
-        return arg.name === argName;
-      });
-
-      if (!ifaceArg && (0, _definition.isRequiredArgument)(typeArg)) {
-        context.reportError("Object field ".concat(type.name, ".").concat(fieldName, " includes required argument ").concat(argName, " that is missing from the Interface field ").concat(iface.name, ".").concat(fieldName, "."), [typeArg.astNode, ifaceField.astNode]);
-      }
-    };
-
-    for (var _i20 = 0, _typeField$args2 = typeField.args; _i20 < _typeField$args2.length; _i20++) {
-      _loop2(_i20, _typeField$args2);
-    }
-  }
-}
-
-function validateTypeImplementsAncestors(context, type, iface) {
-  var ifaceInterfaces = type.getInterfaces();
-
-  for (var _i22 = 0, _iface$getInterfaces2 = iface.getInterfaces(); _i22 < _iface$getInterfaces2.length; _i22++) {
-    var transitive = _iface$getInterfaces2[_i22];
-
-    if (ifaceInterfaces.indexOf(transitive) === -1) {
-      context.reportError(transitive === type ? "Type ".concat(type.name, " cannot implement ").concat(iface.name, " because it would create a circular reference.") : "Type ".concat(type.name, " must implement ").concat(transitive.name, " because it is implemented by ").concat(iface.name, "."), [].concat(getAllImplementsInterfaceNodes(iface, transitive), getAllImplementsInterfaceNodes(type, iface)));
-    }
-  }
-}
-
-function validateUnionMembers(context, union) {
-  var memberTypes = union.getTypes();
-
-  if (memberTypes.length === 0) {
-    context.reportError("Union type ".concat(union.name, " must define one or more member types."), getAllNodes(union));
-  }
-
-  var includedTypeNames = Object.create(null);
-
-  for (var _i24 = 0; _i24 < memberTypes.length; _i24++) {
-    var memberType = memberTypes[_i24];
-
-    if (includedTypeNames[memberType.name]) {
-      context.reportError("Union type ".concat(union.name, " can only include type ").concat(memberType.name, " once."), getUnionMemberTypeNodes(union, memberType.name));
-      continue;
-    }
-
-    includedTypeNames[memberType.name] = true;
-
-    if (!(0, _definition.isObjectType)(memberType)) {
-      context.reportError("Union type ".concat(union.name, " can only include Object types, ") + "it cannot include ".concat((0, _inspect.default)(memberType), "."), getUnionMemberTypeNodes(union, String(memberType)));
-    }
-  }
-}
-
-function validateEnumValues(context, enumType) {
-  var enumValues = enumType.getValues();
-
-  if (enumValues.length === 0) {
-    context.reportError("Enum type ".concat(enumType.name, " must define one or more values."), getAllNodes(enumType));
-  }
-
-  for (var _i26 = 0; _i26 < enumValues.length; _i26++) {
-    var enumValue = enumValues[_i26];
-    var valueName = enumValue.name; // Ensure valid name.
-
-    validateName(context, enumValue);
-
-    if (valueName === 'true' || valueName === 'false' || valueName === 'null') {
-      context.reportError("Enum type ".concat(enumType.name, " cannot include value: ").concat(valueName, "."), enumValue.astNode);
-    }
-  }
-}
-
-function validateInputFields(context, inputObj) {
-  var fields = (0, _objectValues5.default)(inputObj.getFields());
-
-  if (fields.length === 0) {
-    context.reportError("Input Object type ".concat(inputObj.name, " must define one or more fields."), getAllNodes(inputObj));
-  } // Ensure the arguments are valid
-
-
-  for (var _i28 = 0; _i28 < fields.length; _i28++) {
-    var field = fields[_i28];
-    // Ensure they are named correctly.
-    validateName(context, field); // Ensure the type is an input type
-
-    if (!(0, _definition.isInputType)(field.type)) {
-      var _field$astNode2;
-
-      context.reportError("The type of ".concat(inputObj.name, ".").concat(field.name, " must be Input Type ") + "but got: ".concat((0, _inspect.default)(field.type), "."), (_field$astNode2 = field.astNode) === null || _field$astNode2 === void 0 ? void 0 : _field$astNode2.type);
-    }
-  }
-}
-
-function createInputObjectCircularRefsValidator(context) {
-  // Modified copy of algorithm from 'src/validation/rules/NoFragmentCycles.js'.
-  // Tracks already visited types to maintain O(N) and to ensure that cycles
-  // are not redundantly reported.
-  var visitedTypes = Object.create(null); // Array of types nodes used to produce meaningful errors
-
-  var fieldPath = []; // Position in the type path
-
-  var fieldPathIndexByTypeName = Object.create(null);
-  return detectCycleRecursive; // This does a straight-forward DFS to find cycles.
-  // It does not terminate when a cycle was found but continues to explore
-  // the graph to find all possible cycles.
-
-  function detectCycleRecursive(inputObj) {
-    if (visitedTypes[inputObj.name]) {
-      return;
-    }
-
-    visitedTypes[inputObj.name] = true;
-    fieldPathIndexByTypeName[inputObj.name] = fieldPath.length;
-    var fields = (0, _objectValues5.default)(inputObj.getFields());
-
-    for (var _i30 = 0; _i30 < fields.length; _i30++) {
-      var field = fields[_i30];
-
-      if ((0, _definition.isNonNullType)(field.type) && (0, _definition.isInputObjectType)(field.type.ofType)) {
-        var fieldType = field.type.ofType;
-        var cycleIndex = fieldPathIndexByTypeName[fieldType.name];
-        fieldPath.push(field);
-
-        if (cycleIndex === undefined) {
-          detectCycleRecursive(fieldType);
-        } else {
-          var cyclePath = fieldPath.slice(cycleIndex);
-          var pathStr = cyclePath.map(function (fieldObj) {
-            return fieldObj.name;
-          }).join('.');
-          context.reportError("Cannot reference Input Object \"".concat(fieldType.name, "\" within itself through a series of non-null fields: \"").concat(pathStr, "\"."), cyclePath.map(function (fieldObj) {
-            return fieldObj.astNode;
-          }));
-        }
-
-        fieldPath.pop();
-      }
-    }
-
-    fieldPathIndexByTypeName[inputObj.name] = undefined;
-  }
-}
-
-function getAllNodes(object) {
-  var astNode = object.astNode,
-      extensionASTNodes = object.extensionASTNodes;
-  return astNode ? extensionASTNodes ? [astNode].concat(extensionASTNodes) : [astNode] : extensionASTNodes !== null && extensionASTNodes !== void 0 ? extensionASTNodes : [];
-}
-
-function getAllSubNodes(object, getter) {
-  /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-  return (0, _flatMap.default)(getAllNodes(object), function (item) {
-    var _getter;
-
-    return (_getter = getter(item)) !== null && _getter !== void 0 ? _getter : [];
-  });
-}
-
-function getAllImplementsInterfaceNodes(type, iface) {
-  return getAllSubNodes(type, function (typeNode) {
-    return typeNode.interfaces;
-  }).filter(function (ifaceNode) {
-    return ifaceNode.name.value === iface.name;
-  });
-}
-
-function getUnionMemberTypeNodes(union, typeName) {
-  return getAllSubNodes(union, function (unionNode) {
-    return unionNode.types;
-  }).filter(function (typeNode) {
-    return typeNode.name.value === typeName;
-  });
-}
diff --git a/node_modules/graphql/type/validate.js.flow b/node_modules/graphql/type/validate.js.flow
deleted file mode 100644
index fc57bd1..0000000
--- a/node_modules/graphql/type/validate.js.flow
+++ /dev/null
@@ -1,609 +0,0 @@
-// @flow strict
-
-import find from '../polyfills/find';
-import flatMap from '../polyfills/flatMap';
-import objectValues from '../polyfills/objectValues';
-
-import inspect from '../jsutils/inspect';
-
-import { GraphQLError } from '../error/GraphQLError';
-import { locatedError } from '../error/locatedError';
-
-import { type ASTNode, type NamedTypeNode } from '../language/ast';
-
-import { isValidNameError } from '../utilities/assertValidName';
-import { isEqualType, isTypeSubTypeOf } from '../utilities/typeComparators';
-
-import { isDirective } from './directives';
-import { isIntrospectionType } from './introspection';
-import { type GraphQLSchema, assertSchema } from './schema';
-import {
-  type GraphQLObjectType,
-  type GraphQLInterfaceType,
-  type GraphQLUnionType,
-  type GraphQLEnumType,
-  type GraphQLInputObjectType,
-  isObjectType,
-  isInterfaceType,
-  isUnionType,
-  isEnumType,
-  isInputObjectType,
-  isNamedType,
-  isNonNullType,
-  isInputType,
-  isOutputType,
-  isRequiredArgument,
-} from './definition';
-
-/**
- * Implements the "Type Validation" sub-sections of the specification's
- * "Type System" section.
- *
- * Validation runs synchronously, returning an array of encountered errors, or
- * an empty array if no errors were encountered and the Schema is valid.
- */
-export function validateSchema(
-  schema: GraphQLSchema,
-): $ReadOnlyArray<GraphQLError> {
-  // First check to ensure the provided value is in fact a GraphQLSchema.
-  assertSchema(schema);
-
-  // If this Schema has already been validated, return the previous results.
-  if (schema.__validationErrors) {
-    return schema.__validationErrors;
-  }
-
-  // Validate the schema, producing a list of errors.
-  const context = new SchemaValidationContext(schema);
-  validateRootTypes(context);
-  validateDirectives(context);
-  validateTypes(context);
-
-  // Persist the results of validation before returning to ensure validation
-  // does not run multiple times for this schema.
-  const errors = context.getErrors();
-  schema.__validationErrors = errors;
-  return errors;
-}
-
-/**
- * Utility function which asserts a schema is valid by throwing an error if
- * it is invalid.
- */
-export function assertValidSchema(schema: GraphQLSchema): void {
-  const errors = validateSchema(schema);
-  if (errors.length !== 0) {
-    throw new Error(errors.map(error => error.message).join('\n\n'));
-  }
-}
-
-class SchemaValidationContext {
-  +_errors: Array<GraphQLError>;
-  +schema: GraphQLSchema;
-
-  constructor(schema) {
-    this._errors = [];
-    this.schema = schema;
-  }
-
-  reportError(
-    message: string,
-    nodes?: $ReadOnlyArray<?ASTNode> | ?ASTNode,
-  ): void {
-    const _nodes = Array.isArray(nodes) ? nodes.filter(Boolean) : nodes;
-    this.addError(new GraphQLError(message, _nodes));
-  }
-
-  addError(error: GraphQLError): void {
-    this._errors.push(error);
-  }
-
-  getErrors(): $ReadOnlyArray<GraphQLError> {
-    return this._errors;
-  }
-}
-
-function validateRootTypes(context) {
-  const schema = context.schema;
-  const queryType = schema.getQueryType();
-  if (!queryType) {
-    context.reportError('Query root type must be provided.', schema.astNode);
-  } else if (!isObjectType(queryType)) {
-    context.reportError(
-      `Query root type must be Object type, it cannot be ${inspect(
-        queryType,
-      )}.`,
-      getOperationTypeNode(schema, queryType, 'query'),
-    );
-  }
-
-  const mutationType = schema.getMutationType();
-  if (mutationType && !isObjectType(mutationType)) {
-    context.reportError(
-      'Mutation root type must be Object type if provided, it cannot be ' +
-        `${inspect(mutationType)}.`,
-      getOperationTypeNode(schema, mutationType, 'mutation'),
-    );
-  }
-
-  const subscriptionType = schema.getSubscriptionType();
-  if (subscriptionType && !isObjectType(subscriptionType)) {
-    context.reportError(
-      'Subscription root type must be Object type if provided, it cannot be ' +
-        `${inspect(subscriptionType)}.`,
-      getOperationTypeNode(schema, subscriptionType, 'subscription'),
-    );
-  }
-}
-
-function getOperationTypeNode(
-  schema: GraphQLSchema,
-  type: GraphQLObjectType,
-  operation: string,
-): ?ASTNode {
-  const operationNodes = getAllSubNodes(schema, node => node.operationTypes);
-  for (const node of operationNodes) {
-    if (node.operation === operation) {
-      return node.type;
-    }
-  }
-
-  return type.astNode;
-}
-
-function validateDirectives(context: SchemaValidationContext): void {
-  for (const directive of context.schema.getDirectives()) {
-    // Ensure all directives are in fact GraphQL directives.
-    if (!isDirective(directive)) {
-      context.reportError(
-        `Expected directive but got: ${inspect(directive)}.`,
-        directive?.astNode,
-      );
-      continue;
-    }
-
-    // Ensure they are named correctly.
-    validateName(context, directive);
-
-    // TODO: Ensure proper locations.
-
-    // Ensure the arguments are valid.
-    for (const arg of directive.args) {
-      // Ensure they are named correctly.
-      validateName(context, arg);
-
-      // Ensure the type is an input type.
-      if (!isInputType(arg.type)) {
-        context.reportError(
-          `The type of @${directive.name}(${arg.name}:) must be Input Type ` +
-            `but got: ${inspect(arg.type)}.`,
-          arg.astNode,
-        );
-      }
-    }
-  }
-}
-
-function validateName(
-  context: SchemaValidationContext,
-  node: { +name: string, +astNode: ?ASTNode, ... },
-): void {
-  // Ensure names are valid, however introspection types opt out.
-  const error = isValidNameError(node.name);
-  if (error) {
-    context.addError(locatedError(error, node.astNode));
-  }
-}
-
-function validateTypes(context: SchemaValidationContext): void {
-  const validateInputObjectCircularRefs = createInputObjectCircularRefsValidator(
-    context,
-  );
-  const typeMap = context.schema.getTypeMap();
-  for (const type of objectValues(typeMap)) {
-    // Ensure all provided types are in fact GraphQL type.
-    if (!isNamedType(type)) {
-      context.reportError(
-        `Expected GraphQL named type but got: ${inspect(type)}.`,
-        type.astNode,
-      );
-      continue;
-    }
-
-    // Ensure it is named correctly (excluding introspection types).
-    if (!isIntrospectionType(type)) {
-      validateName(context, type);
-    }
-
-    if (isObjectType(type)) {
-      // Ensure fields are valid
-      validateFields(context, type);
-
-      // Ensure objects implement the interfaces they claim to.
-      validateInterfaces(context, type);
-    } else if (isInterfaceType(type)) {
-      // Ensure fields are valid.
-      validateFields(context, type);
-
-      // Ensure interfaces implement the interfaces they claim to.
-      validateInterfaces(context, type);
-    } else if (isUnionType(type)) {
-      // Ensure Unions include valid member types.
-      validateUnionMembers(context, type);
-    } else if (isEnumType(type)) {
-      // Ensure Enums have valid values.
-      validateEnumValues(context, type);
-    } else if (isInputObjectType(type)) {
-      // Ensure Input Object fields are valid.
-      validateInputFields(context, type);
-
-      // Ensure Input Objects do not contain non-nullable circular references
-      validateInputObjectCircularRefs(type);
-    }
-  }
-}
-
-function validateFields(
-  context: SchemaValidationContext,
-  type: GraphQLObjectType | GraphQLInterfaceType,
-): void {
-  const fields = objectValues(type.getFields());
-
-  // Objects and Interfaces both must define one or more fields.
-  if (fields.length === 0) {
-    context.reportError(
-      `Type ${type.name} must define one or more fields.`,
-      getAllNodes(type),
-    );
-  }
-
-  for (const field of fields) {
-    // Ensure they are named correctly.
-    validateName(context, field);
-
-    // Ensure the type is an output type
-    if (!isOutputType(field.type)) {
-      context.reportError(
-        `The type of ${type.name}.${field.name} must be Output Type ` +
-          `but got: ${inspect(field.type)}.`,
-        field.astNode?.type,
-      );
-    }
-
-    // Ensure the arguments are valid
-    for (const arg of field.args) {
-      const argName = arg.name;
-
-      // Ensure they are named correctly.
-      validateName(context, arg);
-
-      // Ensure the type is an input type
-      if (!isInputType(arg.type)) {
-        context.reportError(
-          `The type of ${type.name}.${field.name}(${argName}:) must be Input ` +
-            `Type but got: ${inspect(arg.type)}.`,
-          arg.astNode?.type,
-        );
-      }
-    }
-  }
-}
-
-function validateInterfaces(
-  context: SchemaValidationContext,
-  type: GraphQLObjectType | GraphQLInterfaceType,
-): void {
-  const ifaceTypeNames = Object.create(null);
-  for (const iface of type.getInterfaces()) {
-    if (!isInterfaceType(iface)) {
-      context.reportError(
-        `Type ${inspect(type)} must only implement Interface types, ` +
-          `it cannot implement ${inspect(iface)}.`,
-        getAllImplementsInterfaceNodes(type, iface),
-      );
-      continue;
-    }
-
-    if (type === iface) {
-      context.reportError(
-        `Type ${type.name} cannot implement itself because it would create a circular reference.`,
-        getAllImplementsInterfaceNodes(type, iface),
-      );
-      continue;
-    }
-
-    if (ifaceTypeNames[iface.name]) {
-      context.reportError(
-        `Type ${type.name} can only implement ${iface.name} once.`,
-        getAllImplementsInterfaceNodes(type, iface),
-      );
-      continue;
-    }
-
-    ifaceTypeNames[iface.name] = true;
-
-    validateTypeImplementsAncestors(context, type, iface);
-    validateTypeImplementsInterface(context, type, iface);
-  }
-}
-
-function validateTypeImplementsInterface(
-  context: SchemaValidationContext,
-  type: GraphQLObjectType | GraphQLInterfaceType,
-  iface: GraphQLInterfaceType,
-): void {
-  const typeFieldMap = type.getFields();
-
-  // Assert each interface field is implemented.
-  for (const ifaceField of objectValues(iface.getFields())) {
-    const fieldName = ifaceField.name;
-    const typeField = typeFieldMap[fieldName];
-
-    // Assert interface field exists on type.
-    if (!typeField) {
-      context.reportError(
-        `Interface field ${iface.name}.${fieldName} expected but ${type.name} does not provide it.`,
-        [ifaceField.astNode, ...getAllNodes(type)],
-      );
-      continue;
-    }
-
-    // Assert interface field type is satisfied by type field type, by being
-    // a valid subtype. (covariant)
-    if (!isTypeSubTypeOf(context.schema, typeField.type, ifaceField.type)) {
-      context.reportError(
-        `Interface field ${iface.name}.${fieldName} expects type ` +
-          `${inspect(ifaceField.type)} but ${type.name}.${fieldName} ` +
-          `is type ${inspect(typeField.type)}.`,
-        [ifaceField.astNode.type, typeField.astNode.type],
-      );
-    }
-
-    // Assert each interface field arg is implemented.
-    for (const ifaceArg of ifaceField.args) {
-      const argName = ifaceArg.name;
-      const typeArg = find(typeField.args, arg => arg.name === argName);
-
-      // Assert interface field arg exists on object field.
-      if (!typeArg) {
-        context.reportError(
-          `Interface field argument ${iface.name}.${fieldName}(${argName}:) expected but ${type.name}.${fieldName} does not provide it.`,
-          [ifaceArg.astNode, typeField.astNode],
-        );
-        continue;
-      }
-
-      // Assert interface field arg type matches object field arg type.
-      // (invariant)
-      // TODO: change to contravariant?
-      if (!isEqualType(ifaceArg.type, typeArg.type)) {
-        context.reportError(
-          `Interface field argument ${iface.name}.${fieldName}(${argName}:) ` +
-            `expects type ${inspect(ifaceArg.type)} but ` +
-            `${type.name}.${fieldName}(${argName}:) is type ` +
-            `${inspect(typeArg.type)}.`,
-          [ifaceArg.astNode.type, typeArg.astNode.type],
-        );
-      }
-
-      // TODO: validate default values?
-    }
-
-    // Assert additional arguments must not be required.
-    for (const typeArg of typeField.args) {
-      const argName = typeArg.name;
-      const ifaceArg = find(ifaceField.args, arg => arg.name === argName);
-      if (!ifaceArg && isRequiredArgument(typeArg)) {
-        context.reportError(
-          `Object field ${type.name}.${fieldName} includes required argument ${argName} that is missing from the Interface field ${iface.name}.${fieldName}.`,
-          [typeArg.astNode, ifaceField.astNode],
-        );
-      }
-    }
-  }
-}
-
-function validateTypeImplementsAncestors(
-  context: SchemaValidationContext,
-  type: GraphQLObjectType | GraphQLInterfaceType,
-  iface: GraphQLInterfaceType,
-): void {
-  const ifaceInterfaces = type.getInterfaces();
-  for (const transitive of iface.getInterfaces()) {
-    if (ifaceInterfaces.indexOf(transitive) === -1) {
-      context.reportError(
-        transitive === type
-          ? `Type ${type.name} cannot implement ${iface.name} because it would create a circular reference.`
-          : `Type ${type.name} must implement ${transitive.name} because it is implemented by ${iface.name}.`,
-        [
-          ...getAllImplementsInterfaceNodes(iface, transitive),
-          ...getAllImplementsInterfaceNodes(type, iface),
-        ],
-      );
-    }
-  }
-}
-
-function validateUnionMembers(
-  context: SchemaValidationContext,
-  union: GraphQLUnionType,
-): void {
-  const memberTypes = union.getTypes();
-
-  if (memberTypes.length === 0) {
-    context.reportError(
-      `Union type ${union.name} must define one or more member types.`,
-      getAllNodes(union),
-    );
-  }
-
-  const includedTypeNames = Object.create(null);
-  for (const memberType of memberTypes) {
-    if (includedTypeNames[memberType.name]) {
-      context.reportError(
-        `Union type ${union.name} can only include type ${memberType.name} once.`,
-        getUnionMemberTypeNodes(union, memberType.name),
-      );
-      continue;
-    }
-    includedTypeNames[memberType.name] = true;
-    if (!isObjectType(memberType)) {
-      context.reportError(
-        `Union type ${union.name} can only include Object types, ` +
-          `it cannot include ${inspect(memberType)}.`,
-        getUnionMemberTypeNodes(union, String(memberType)),
-      );
-    }
-  }
-}
-
-function validateEnumValues(
-  context: SchemaValidationContext,
-  enumType: GraphQLEnumType,
-): void {
-  const enumValues = enumType.getValues();
-
-  if (enumValues.length === 0) {
-    context.reportError(
-      `Enum type ${enumType.name} must define one or more values.`,
-      getAllNodes(enumType),
-    );
-  }
-
-  for (const enumValue of enumValues) {
-    const valueName = enumValue.name;
-
-    // Ensure valid name.
-    validateName(context, enumValue);
-    if (valueName === 'true' || valueName === 'false' || valueName === 'null') {
-      context.reportError(
-        `Enum type ${enumType.name} cannot include value: ${valueName}.`,
-        enumValue.astNode,
-      );
-    }
-  }
-}
-
-function validateInputFields(
-  context: SchemaValidationContext,
-  inputObj: GraphQLInputObjectType,
-): void {
-  const fields = objectValues(inputObj.getFields());
-
-  if (fields.length === 0) {
-    context.reportError(
-      `Input Object type ${inputObj.name} must define one or more fields.`,
-      getAllNodes(inputObj),
-    );
-  }
-
-  // Ensure the arguments are valid
-  for (const field of fields) {
-    // Ensure they are named correctly.
-    validateName(context, field);
-
-    // Ensure the type is an input type
-    if (!isInputType(field.type)) {
-      context.reportError(
-        `The type of ${inputObj.name}.${field.name} must be Input Type ` +
-          `but got: ${inspect(field.type)}.`,
-        field.astNode?.type,
-      );
-    }
-  }
-}
-
-function createInputObjectCircularRefsValidator(
-  context: SchemaValidationContext,
-) {
-  // Modified copy of algorithm from 'src/validation/rules/NoFragmentCycles.js'.
-  // Tracks already visited types to maintain O(N) and to ensure that cycles
-  // are not redundantly reported.
-  const visitedTypes = Object.create(null);
-
-  // Array of types nodes used to produce meaningful errors
-  const fieldPath = [];
-
-  // Position in the type path
-  const fieldPathIndexByTypeName = Object.create(null);
-
-  return detectCycleRecursive;
-
-  // This does a straight-forward DFS to find cycles.
-  // It does not terminate when a cycle was found but continues to explore
-  // the graph to find all possible cycles.
-  function detectCycleRecursive(inputObj: GraphQLInputObjectType) {
-    if (visitedTypes[inputObj.name]) {
-      return;
-    }
-
-    visitedTypes[inputObj.name] = true;
-    fieldPathIndexByTypeName[inputObj.name] = fieldPath.length;
-
-    const fields = objectValues(inputObj.getFields());
-    for (const field of fields) {
-      if (isNonNullType(field.type) && isInputObjectType(field.type.ofType)) {
-        const fieldType = field.type.ofType;
-        const cycleIndex = fieldPathIndexByTypeName[fieldType.name];
-
-        fieldPath.push(field);
-        if (cycleIndex === undefined) {
-          detectCycleRecursive(fieldType);
-        } else {
-          const cyclePath = fieldPath.slice(cycleIndex);
-          const pathStr = cyclePath.map(fieldObj => fieldObj.name).join('.');
-          context.reportError(
-            `Cannot reference Input Object "${fieldType.name}" within itself through a series of non-null fields: "${pathStr}".`,
-            cyclePath.map(fieldObj => fieldObj.astNode),
-          );
-        }
-        fieldPath.pop();
-      }
-    }
-
-    fieldPathIndexByTypeName[inputObj.name] = undefined;
-  }
-}
-
-type SDLDefinedObject<T, K> = {
-  +astNode: ?T,
-  +extensionASTNodes?: ?$ReadOnlyArray<K>,
-  ...
-};
-
-function getAllNodes<T: ASTNode, K: ASTNode>(
-  object: SDLDefinedObject<T, K>,
-): $ReadOnlyArray<T | K> {
-  const { astNode, extensionASTNodes } = object;
-  return astNode
-    ? extensionASTNodes
-      ? [astNode].concat(extensionASTNodes)
-      : [astNode]
-    : extensionASTNodes ?? [];
-}
-
-function getAllSubNodes<T: ASTNode, K: ASTNode, L: ASTNode>(
-  object: SDLDefinedObject<T, K>,
-  getter: (T | K) => ?(L | $ReadOnlyArray<L>),
-): $ReadOnlyArray<L> {
-  /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-  return flatMap(getAllNodes(object), item => getter(item) ?? []);
-}
-
-function getAllImplementsInterfaceNodes(
-  type: GraphQLObjectType | GraphQLInterfaceType,
-  iface: GraphQLInterfaceType,
-): $ReadOnlyArray<NamedTypeNode> {
-  return getAllSubNodes(type, typeNode => typeNode.interfaces).filter(
-    ifaceNode => ifaceNode.name.value === iface.name,
-  );
-}
-
-function getUnionMemberTypeNodes(
-  union: GraphQLUnionType,
-  typeName: string,
-): ?$ReadOnlyArray<NamedTypeNode> {
-  return getAllSubNodes(union, unionNode => unionNode.types).filter(
-    typeNode => typeNode.name.value === typeName,
-  );
-}
diff --git a/node_modules/graphql/type/validate.mjs b/node_modules/graphql/type/validate.mjs
deleted file mode 100644
index 7f8e969..0000000
--- a/node_modules/graphql/type/validate.mjs
+++ /dev/null
@@ -1,482 +0,0 @@
-import find from "../polyfills/find.mjs";
-import flatMap from "../polyfills/flatMap.mjs";
-import objectValues from "../polyfills/objectValues.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import { GraphQLError } from "../error/GraphQLError.mjs";
-import { locatedError } from "../error/locatedError.mjs";
-import { isValidNameError } from "../utilities/assertValidName.mjs";
-import { isEqualType, isTypeSubTypeOf } from "../utilities/typeComparators.mjs";
-import { isDirective } from "./directives.mjs";
-import { isIntrospectionType } from "./introspection.mjs";
-import { assertSchema } from "./schema.mjs";
-import { isObjectType, isInterfaceType, isUnionType, isEnumType, isInputObjectType, isNamedType, isNonNullType, isInputType, isOutputType, isRequiredArgument } from "./definition.mjs";
-/**
- * Implements the "Type Validation" sub-sections of the specification's
- * "Type System" section.
- *
- * Validation runs synchronously, returning an array of encountered errors, or
- * an empty array if no errors were encountered and the Schema is valid.
- */
-
-export function validateSchema(schema) {
-  // First check to ensure the provided value is in fact a GraphQLSchema.
-  assertSchema(schema); // If this Schema has already been validated, return the previous results.
-
-  if (schema.__validationErrors) {
-    return schema.__validationErrors;
-  } // Validate the schema, producing a list of errors.
-
-
-  var context = new SchemaValidationContext(schema);
-  validateRootTypes(context);
-  validateDirectives(context);
-  validateTypes(context); // Persist the results of validation before returning to ensure validation
-  // does not run multiple times for this schema.
-
-  var errors = context.getErrors();
-  schema.__validationErrors = errors;
-  return errors;
-}
-/**
- * Utility function which asserts a schema is valid by throwing an error if
- * it is invalid.
- */
-
-export function assertValidSchema(schema) {
-  var errors = validateSchema(schema);
-
-  if (errors.length !== 0) {
-    throw new Error(errors.map(function (error) {
-      return error.message;
-    }).join('\n\n'));
-  }
-}
-
-var SchemaValidationContext =
-/*#__PURE__*/
-function () {
-  function SchemaValidationContext(schema) {
-    this._errors = [];
-    this.schema = schema;
-  }
-
-  var _proto = SchemaValidationContext.prototype;
-
-  _proto.reportError = function reportError(message, nodes) {
-    var _nodes = Array.isArray(nodes) ? nodes.filter(Boolean) : nodes;
-
-    this.addError(new GraphQLError(message, _nodes));
-  };
-
-  _proto.addError = function addError(error) {
-    this._errors.push(error);
-  };
-
-  _proto.getErrors = function getErrors() {
-    return this._errors;
-  };
-
-  return SchemaValidationContext;
-}();
-
-function validateRootTypes(context) {
-  var schema = context.schema;
-  var queryType = schema.getQueryType();
-
-  if (!queryType) {
-    context.reportError('Query root type must be provided.', schema.astNode);
-  } else if (!isObjectType(queryType)) {
-    context.reportError("Query root type must be Object type, it cannot be ".concat(inspect(queryType), "."), getOperationTypeNode(schema, queryType, 'query'));
-  }
-
-  var mutationType = schema.getMutationType();
-
-  if (mutationType && !isObjectType(mutationType)) {
-    context.reportError('Mutation root type must be Object type if provided, it cannot be ' + "".concat(inspect(mutationType), "."), getOperationTypeNode(schema, mutationType, 'mutation'));
-  }
-
-  var subscriptionType = schema.getSubscriptionType();
-
-  if (subscriptionType && !isObjectType(subscriptionType)) {
-    context.reportError('Subscription root type must be Object type if provided, it cannot be ' + "".concat(inspect(subscriptionType), "."), getOperationTypeNode(schema, subscriptionType, 'subscription'));
-  }
-}
-
-function getOperationTypeNode(schema, type, operation) {
-  var operationNodes = getAllSubNodes(schema, function (node) {
-    return node.operationTypes;
-  });
-
-  for (var _i2 = 0; _i2 < operationNodes.length; _i2++) {
-    var node = operationNodes[_i2];
-
-    if (node.operation === operation) {
-      return node.type;
-    }
-  }
-
-  return type.astNode;
-}
-
-function validateDirectives(context) {
-  for (var _i4 = 0, _context$schema$getDi2 = context.schema.getDirectives(); _i4 < _context$schema$getDi2.length; _i4++) {
-    var directive = _context$schema$getDi2[_i4];
-
-    // Ensure all directives are in fact GraphQL directives.
-    if (!isDirective(directive)) {
-      context.reportError("Expected directive but got: ".concat(inspect(directive), "."), directive === null || directive === void 0 ? void 0 : directive.astNode);
-      continue;
-    } // Ensure they are named correctly.
-
-
-    validateName(context, directive); // TODO: Ensure proper locations.
-    // Ensure the arguments are valid.
-
-    for (var _i6 = 0, _directive$args2 = directive.args; _i6 < _directive$args2.length; _i6++) {
-      var arg = _directive$args2[_i6];
-      // Ensure they are named correctly.
-      validateName(context, arg); // Ensure the type is an input type.
-
-      if (!isInputType(arg.type)) {
-        context.reportError("The type of @".concat(directive.name, "(").concat(arg.name, ":) must be Input Type ") + "but got: ".concat(inspect(arg.type), "."), arg.astNode);
-      }
-    }
-  }
-}
-
-function validateName(context, node) {
-  // Ensure names are valid, however introspection types opt out.
-  var error = isValidNameError(node.name);
-
-  if (error) {
-    context.addError(locatedError(error, node.astNode));
-  }
-}
-
-function validateTypes(context) {
-  var validateInputObjectCircularRefs = createInputObjectCircularRefsValidator(context);
-  var typeMap = context.schema.getTypeMap();
-
-  for (var _i8 = 0, _objectValues2 = objectValues(typeMap); _i8 < _objectValues2.length; _i8++) {
-    var type = _objectValues2[_i8];
-
-    // Ensure all provided types are in fact GraphQL type.
-    if (!isNamedType(type)) {
-      context.reportError("Expected GraphQL named type but got: ".concat(inspect(type), "."), type.astNode);
-      continue;
-    } // Ensure it is named correctly (excluding introspection types).
-
-
-    if (!isIntrospectionType(type)) {
-      validateName(context, type);
-    }
-
-    if (isObjectType(type)) {
-      // Ensure fields are valid
-      validateFields(context, type); // Ensure objects implement the interfaces they claim to.
-
-      validateInterfaces(context, type);
-    } else if (isInterfaceType(type)) {
-      // Ensure fields are valid.
-      validateFields(context, type); // Ensure interfaces implement the interfaces they claim to.
-
-      validateInterfaces(context, type);
-    } else if (isUnionType(type)) {
-      // Ensure Unions include valid member types.
-      validateUnionMembers(context, type);
-    } else if (isEnumType(type)) {
-      // Ensure Enums have valid values.
-      validateEnumValues(context, type);
-    } else if (isInputObjectType(type)) {
-      // Ensure Input Object fields are valid.
-      validateInputFields(context, type); // Ensure Input Objects do not contain non-nullable circular references
-
-      validateInputObjectCircularRefs(type);
-    }
-  }
-}
-
-function validateFields(context, type) {
-  var fields = objectValues(type.getFields()); // Objects and Interfaces both must define one or more fields.
-
-  if (fields.length === 0) {
-    context.reportError("Type ".concat(type.name, " must define one or more fields."), getAllNodes(type));
-  }
-
-  for (var _i10 = 0; _i10 < fields.length; _i10++) {
-    var field = fields[_i10];
-    // Ensure they are named correctly.
-    validateName(context, field); // Ensure the type is an output type
-
-    if (!isOutputType(field.type)) {
-      var _field$astNode;
-
-      context.reportError("The type of ".concat(type.name, ".").concat(field.name, " must be Output Type ") + "but got: ".concat(inspect(field.type), "."), (_field$astNode = field.astNode) === null || _field$astNode === void 0 ? void 0 : _field$astNode.type);
-    } // Ensure the arguments are valid
-
-
-    for (var _i12 = 0, _field$args2 = field.args; _i12 < _field$args2.length; _i12++) {
-      var arg = _field$args2[_i12];
-      var argName = arg.name; // Ensure they are named correctly.
-
-      validateName(context, arg); // Ensure the type is an input type
-
-      if (!isInputType(arg.type)) {
-        var _arg$astNode;
-
-        context.reportError("The type of ".concat(type.name, ".").concat(field.name, "(").concat(argName, ":) must be Input ") + "Type but got: ".concat(inspect(arg.type), "."), (_arg$astNode = arg.astNode) === null || _arg$astNode === void 0 ? void 0 : _arg$astNode.type);
-      }
-    }
-  }
-}
-
-function validateInterfaces(context, type) {
-  var ifaceTypeNames = Object.create(null);
-
-  for (var _i14 = 0, _type$getInterfaces2 = type.getInterfaces(); _i14 < _type$getInterfaces2.length; _i14++) {
-    var iface = _type$getInterfaces2[_i14];
-
-    if (!isInterfaceType(iface)) {
-      context.reportError("Type ".concat(inspect(type), " must only implement Interface types, ") + "it cannot implement ".concat(inspect(iface), "."), getAllImplementsInterfaceNodes(type, iface));
-      continue;
-    }
-
-    if (type === iface) {
-      context.reportError("Type ".concat(type.name, " cannot implement itself because it would create a circular reference."), getAllImplementsInterfaceNodes(type, iface));
-      continue;
-    }
-
-    if (ifaceTypeNames[iface.name]) {
-      context.reportError("Type ".concat(type.name, " can only implement ").concat(iface.name, " once."), getAllImplementsInterfaceNodes(type, iface));
-      continue;
-    }
-
-    ifaceTypeNames[iface.name] = true;
-    validateTypeImplementsAncestors(context, type, iface);
-    validateTypeImplementsInterface(context, type, iface);
-  }
-}
-
-function validateTypeImplementsInterface(context, type, iface) {
-  var typeFieldMap = type.getFields(); // Assert each interface field is implemented.
-
-  for (var _i16 = 0, _objectValues4 = objectValues(iface.getFields()); _i16 < _objectValues4.length; _i16++) {
-    var ifaceField = _objectValues4[_i16];
-    var fieldName = ifaceField.name;
-    var typeField = typeFieldMap[fieldName]; // Assert interface field exists on type.
-
-    if (!typeField) {
-      context.reportError("Interface field ".concat(iface.name, ".").concat(fieldName, " expected but ").concat(type.name, " does not provide it."), [ifaceField.astNode].concat(getAllNodes(type)));
-      continue;
-    } // Assert interface field type is satisfied by type field type, by being
-    // a valid subtype. (covariant)
-
-
-    if (!isTypeSubTypeOf(context.schema, typeField.type, ifaceField.type)) {
-      context.reportError("Interface field ".concat(iface.name, ".").concat(fieldName, " expects type ") + "".concat(inspect(ifaceField.type), " but ").concat(type.name, ".").concat(fieldName, " ") + "is type ".concat(inspect(typeField.type), "."), [ifaceField.astNode.type, typeField.astNode.type]);
-    } // Assert each interface field arg is implemented.
-
-
-    var _loop = function _loop(_i18, _ifaceField$args2) {
-      var ifaceArg = _ifaceField$args2[_i18];
-      var argName = ifaceArg.name;
-      var typeArg = find(typeField.args, function (arg) {
-        return arg.name === argName;
-      }); // Assert interface field arg exists on object field.
-
-      if (!typeArg) {
-        context.reportError("Interface field argument ".concat(iface.name, ".").concat(fieldName, "(").concat(argName, ":) expected but ").concat(type.name, ".").concat(fieldName, " does not provide it."), [ifaceArg.astNode, typeField.astNode]);
-        return "continue";
-      } // Assert interface field arg type matches object field arg type.
-      // (invariant)
-      // TODO: change to contravariant?
-
-
-      if (!isEqualType(ifaceArg.type, typeArg.type)) {
-        context.reportError("Interface field argument ".concat(iface.name, ".").concat(fieldName, "(").concat(argName, ":) ") + "expects type ".concat(inspect(ifaceArg.type), " but ") + "".concat(type.name, ".").concat(fieldName, "(").concat(argName, ":) is type ") + "".concat(inspect(typeArg.type), "."), [ifaceArg.astNode.type, typeArg.astNode.type]);
-      } // TODO: validate default values?
-
-    };
-
-    for (var _i18 = 0, _ifaceField$args2 = ifaceField.args; _i18 < _ifaceField$args2.length; _i18++) {
-      var _ret = _loop(_i18, _ifaceField$args2);
-
-      if (_ret === "continue") continue;
-    } // Assert additional arguments must not be required.
-
-
-    var _loop2 = function _loop2(_i20, _typeField$args2) {
-      var typeArg = _typeField$args2[_i20];
-      var argName = typeArg.name;
-      var ifaceArg = find(ifaceField.args, function (arg) {
-        return arg.name === argName;
-      });
-
-      if (!ifaceArg && isRequiredArgument(typeArg)) {
-        context.reportError("Object field ".concat(type.name, ".").concat(fieldName, " includes required argument ").concat(argName, " that is missing from the Interface field ").concat(iface.name, ".").concat(fieldName, "."), [typeArg.astNode, ifaceField.astNode]);
-      }
-    };
-
-    for (var _i20 = 0, _typeField$args2 = typeField.args; _i20 < _typeField$args2.length; _i20++) {
-      _loop2(_i20, _typeField$args2);
-    }
-  }
-}
-
-function validateTypeImplementsAncestors(context, type, iface) {
-  var ifaceInterfaces = type.getInterfaces();
-
-  for (var _i22 = 0, _iface$getInterfaces2 = iface.getInterfaces(); _i22 < _iface$getInterfaces2.length; _i22++) {
-    var transitive = _iface$getInterfaces2[_i22];
-
-    if (ifaceInterfaces.indexOf(transitive) === -1) {
-      context.reportError(transitive === type ? "Type ".concat(type.name, " cannot implement ").concat(iface.name, " because it would create a circular reference.") : "Type ".concat(type.name, " must implement ").concat(transitive.name, " because it is implemented by ").concat(iface.name, "."), [].concat(getAllImplementsInterfaceNodes(iface, transitive), getAllImplementsInterfaceNodes(type, iface)));
-    }
-  }
-}
-
-function validateUnionMembers(context, union) {
-  var memberTypes = union.getTypes();
-
-  if (memberTypes.length === 0) {
-    context.reportError("Union type ".concat(union.name, " must define one or more member types."), getAllNodes(union));
-  }
-
-  var includedTypeNames = Object.create(null);
-
-  for (var _i24 = 0; _i24 < memberTypes.length; _i24++) {
-    var memberType = memberTypes[_i24];
-
-    if (includedTypeNames[memberType.name]) {
-      context.reportError("Union type ".concat(union.name, " can only include type ").concat(memberType.name, " once."), getUnionMemberTypeNodes(union, memberType.name));
-      continue;
-    }
-
-    includedTypeNames[memberType.name] = true;
-
-    if (!isObjectType(memberType)) {
-      context.reportError("Union type ".concat(union.name, " can only include Object types, ") + "it cannot include ".concat(inspect(memberType), "."), getUnionMemberTypeNodes(union, String(memberType)));
-    }
-  }
-}
-
-function validateEnumValues(context, enumType) {
-  var enumValues = enumType.getValues();
-
-  if (enumValues.length === 0) {
-    context.reportError("Enum type ".concat(enumType.name, " must define one or more values."), getAllNodes(enumType));
-  }
-
-  for (var _i26 = 0; _i26 < enumValues.length; _i26++) {
-    var enumValue = enumValues[_i26];
-    var valueName = enumValue.name; // Ensure valid name.
-
-    validateName(context, enumValue);
-
-    if (valueName === 'true' || valueName === 'false' || valueName === 'null') {
-      context.reportError("Enum type ".concat(enumType.name, " cannot include value: ").concat(valueName, "."), enumValue.astNode);
-    }
-  }
-}
-
-function validateInputFields(context, inputObj) {
-  var fields = objectValues(inputObj.getFields());
-
-  if (fields.length === 0) {
-    context.reportError("Input Object type ".concat(inputObj.name, " must define one or more fields."), getAllNodes(inputObj));
-  } // Ensure the arguments are valid
-
-
-  for (var _i28 = 0; _i28 < fields.length; _i28++) {
-    var field = fields[_i28];
-    // Ensure they are named correctly.
-    validateName(context, field); // Ensure the type is an input type
-
-    if (!isInputType(field.type)) {
-      var _field$astNode2;
-
-      context.reportError("The type of ".concat(inputObj.name, ".").concat(field.name, " must be Input Type ") + "but got: ".concat(inspect(field.type), "."), (_field$astNode2 = field.astNode) === null || _field$astNode2 === void 0 ? void 0 : _field$astNode2.type);
-    }
-  }
-}
-
-function createInputObjectCircularRefsValidator(context) {
-  // Modified copy of algorithm from 'src/validation/rules/NoFragmentCycles.js'.
-  // Tracks already visited types to maintain O(N) and to ensure that cycles
-  // are not redundantly reported.
-  var visitedTypes = Object.create(null); // Array of types nodes used to produce meaningful errors
-
-  var fieldPath = []; // Position in the type path
-
-  var fieldPathIndexByTypeName = Object.create(null);
-  return detectCycleRecursive; // This does a straight-forward DFS to find cycles.
-  // It does not terminate when a cycle was found but continues to explore
-  // the graph to find all possible cycles.
-
-  function detectCycleRecursive(inputObj) {
-    if (visitedTypes[inputObj.name]) {
-      return;
-    }
-
-    visitedTypes[inputObj.name] = true;
-    fieldPathIndexByTypeName[inputObj.name] = fieldPath.length;
-    var fields = objectValues(inputObj.getFields());
-
-    for (var _i30 = 0; _i30 < fields.length; _i30++) {
-      var field = fields[_i30];
-
-      if (isNonNullType(field.type) && isInputObjectType(field.type.ofType)) {
-        var fieldType = field.type.ofType;
-        var cycleIndex = fieldPathIndexByTypeName[fieldType.name];
-        fieldPath.push(field);
-
-        if (cycleIndex === undefined) {
-          detectCycleRecursive(fieldType);
-        } else {
-          var cyclePath = fieldPath.slice(cycleIndex);
-          var pathStr = cyclePath.map(function (fieldObj) {
-            return fieldObj.name;
-          }).join('.');
-          context.reportError("Cannot reference Input Object \"".concat(fieldType.name, "\" within itself through a series of non-null fields: \"").concat(pathStr, "\"."), cyclePath.map(function (fieldObj) {
-            return fieldObj.astNode;
-          }));
-        }
-
-        fieldPath.pop();
-      }
-    }
-
-    fieldPathIndexByTypeName[inputObj.name] = undefined;
-  }
-}
-
-function getAllNodes(object) {
-  var astNode = object.astNode,
-      extensionASTNodes = object.extensionASTNodes;
-  return astNode ? extensionASTNodes ? [astNode].concat(extensionASTNodes) : [astNode] : extensionASTNodes !== null && extensionASTNodes !== void 0 ? extensionASTNodes : [];
-}
-
-function getAllSubNodes(object, getter) {
-  /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-  return flatMap(getAllNodes(object), function (item) {
-    var _getter;
-
-    return (_getter = getter(item)) !== null && _getter !== void 0 ? _getter : [];
-  });
-}
-
-function getAllImplementsInterfaceNodes(type, iface) {
-  return getAllSubNodes(type, function (typeNode) {
-    return typeNode.interfaces;
-  }).filter(function (ifaceNode) {
-    return ifaceNode.name.value === iface.name;
-  });
-}
-
-function getUnionMemberTypeNodes(union, typeName) {
-  return getAllSubNodes(union, function (unionNode) {
-    return unionNode.types;
-  }).filter(function (typeNode) {
-    return typeNode.name.value === typeName;
-  });
-}
diff --git a/node_modules/graphql/utilities/TypeInfo.d.ts b/node_modules/graphql/utilities/TypeInfo.d.ts
deleted file mode 100644
index 4f9b426..0000000
--- a/node_modules/graphql/utilities/TypeInfo.d.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-import { Visitor } from '../language/visitor';
-import { ASTNode, ASTKindToNode, FieldNode } from '../language/ast';
-import { GraphQLSchema } from '../type/schema';
-import { GraphQLDirective } from '../type/directives';
-import {
-  GraphQLType,
-  GraphQLInputType,
-  GraphQLOutputType,
-  GraphQLCompositeType,
-  GraphQLField,
-  GraphQLArgument,
-  GraphQLEnumValue,
-} from '../type/definition';
-
-/**
- * TypeInfo is a utility class which, given a GraphQL schema, can keep track
- * of the current field and type definitions at any point in a GraphQL document
- * AST during a recursive descent by calling `enter(node)` and `leave(node)`.
- */
-export class TypeInfo {
-  constructor(
-    schema: GraphQLSchema,
-    // NOTE: this experimental optional second parameter is only needed in order
-    // to support non-spec-compliant code bases. You should never need to use it.
-    // It may disappear in the future.
-    getFieldDefFn?: getFieldDef,
-    // Initial type may be provided in rare cases to facilitate traversals
-    // beginning somewhere other than documents.
-    initialType?: GraphQLType,
-  );
-
-  getType(): Maybe<GraphQLOutputType>;
-  getParentType(): Maybe<GraphQLCompositeType>;
-  getInputType(): Maybe<GraphQLInputType>;
-  getParentInputType(): Maybe<GraphQLInputType>;
-  getFieldDef(): GraphQLField<any, Maybe<any>>;
-  getDefaultValue(): Maybe<any>;
-  getDirective(): Maybe<GraphQLDirective>;
-  getArgument(): Maybe<GraphQLArgument>;
-  getEnumValue(): Maybe<GraphQLEnumValue>;
-  enter(node: ASTNode): any;
-  leave(node: ASTNode): any;
-}
-
-type getFieldDef = (
-  schema: GraphQLSchema,
-  parentType: GraphQLType,
-  fieldNode: FieldNode,
-) => Maybe<GraphQLField<any, any>>;
-
-/**
- * Creates a new visitor instance which maintains a provided TypeInfo instance
- * along with visiting visitor.
- */
-export function visitWithTypeInfo(
-  typeInfo: TypeInfo,
-  visitor: Visitor<ASTKindToNode>,
-): Visitor<ASTKindToNode>;
diff --git a/node_modules/graphql/utilities/TypeInfo.js b/node_modules/graphql/utilities/TypeInfo.js
deleted file mode 100644
index f083b7e..0000000
--- a/node_modules/graphql/utilities/TypeInfo.js
+++ /dev/null
@@ -1,399 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.visitWithTypeInfo = visitWithTypeInfo;
-exports.TypeInfo = void 0;
-
-var _find = _interopRequireDefault(require("../polyfills/find"));
-
-var _kinds = require("../language/kinds");
-
-var _visitor = require("../language/visitor");
-
-var _ast = require("../language/ast");
-
-var _definition = require("../type/definition");
-
-var _introspection = require("../type/introspection");
-
-var _typeFromAST = require("./typeFromAST");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * TypeInfo is a utility class which, given a GraphQL schema, can keep track
- * of the current field and type definitions at any point in a GraphQL document
- * AST during a recursive descent by calling `enter(node)` and `leave(node)`.
- */
-var TypeInfo =
-/*#__PURE__*/
-function () {
-  function TypeInfo(schema, // NOTE: this experimental optional second parameter is only needed in order
-  // to support non-spec-compliant code bases. You should never need to use it.
-  // It may disappear in the future.
-  getFieldDefFn, // Initial type may be provided in rare cases to facilitate traversals
-  // beginning somewhere other than documents.
-  initialType) {
-    this._schema = schema;
-    this._typeStack = [];
-    this._parentTypeStack = [];
-    this._inputTypeStack = [];
-    this._fieldDefStack = [];
-    this._defaultValueStack = [];
-    this._directive = null;
-    this._argument = null;
-    this._enumValue = null;
-    this._getFieldDef = getFieldDefFn !== null && getFieldDefFn !== void 0 ? getFieldDefFn : getFieldDef;
-
-    if (initialType) {
-      if ((0, _definition.isInputType)(initialType)) {
-        this._inputTypeStack.push(initialType);
-      }
-
-      if ((0, _definition.isCompositeType)(initialType)) {
-        this._parentTypeStack.push(initialType);
-      }
-
-      if ((0, _definition.isOutputType)(initialType)) {
-        this._typeStack.push(initialType);
-      }
-    }
-  }
-
-  var _proto = TypeInfo.prototype;
-
-  _proto.getType = function getType() {
-    if (this._typeStack.length > 0) {
-      return this._typeStack[this._typeStack.length - 1];
-    }
-  };
-
-  _proto.getParentType = function getParentType() {
-    if (this._parentTypeStack.length > 0) {
-      return this._parentTypeStack[this._parentTypeStack.length - 1];
-    }
-  };
-
-  _proto.getInputType = function getInputType() {
-    if (this._inputTypeStack.length > 0) {
-      return this._inputTypeStack[this._inputTypeStack.length - 1];
-    }
-  };
-
-  _proto.getParentInputType = function getParentInputType() {
-    if (this._inputTypeStack.length > 1) {
-      return this._inputTypeStack[this._inputTypeStack.length - 2];
-    }
-  };
-
-  _proto.getFieldDef = function getFieldDef() {
-    if (this._fieldDefStack.length > 0) {
-      return this._fieldDefStack[this._fieldDefStack.length - 1];
-    }
-  };
-
-  _proto.getDefaultValue = function getDefaultValue() {
-    if (this._defaultValueStack.length > 0) {
-      return this._defaultValueStack[this._defaultValueStack.length - 1];
-    }
-  };
-
-  _proto.getDirective = function getDirective() {
-    return this._directive;
-  };
-
-  _proto.getArgument = function getArgument() {
-    return this._argument;
-  };
-
-  _proto.getEnumValue = function getEnumValue() {
-    return this._enumValue;
-  };
-
-  _proto.enter = function enter(node) {
-    var schema = this._schema; // Note: many of the types below are explicitly typed as "mixed" to drop
-    // any assumptions of a valid schema to ensure runtime types are properly
-    // checked before continuing since TypeInfo is used as part of validation
-    // which occurs before guarantees of schema and document validity.
-
-    switch (node.kind) {
-      case _kinds.Kind.SELECTION_SET:
-        {
-          var namedType = (0, _definition.getNamedType)(this.getType());
-
-          this._parentTypeStack.push((0, _definition.isCompositeType)(namedType) ? namedType : undefined);
-
-          break;
-        }
-
-      case _kinds.Kind.FIELD:
-        {
-          var parentType = this.getParentType();
-          var fieldDef;
-          var fieldType;
-
-          if (parentType) {
-            fieldDef = this._getFieldDef(schema, parentType, node);
-
-            if (fieldDef) {
-              fieldType = fieldDef.type;
-            }
-          }
-
-          this._fieldDefStack.push(fieldDef);
-
-          this._typeStack.push((0, _definition.isOutputType)(fieldType) ? fieldType : undefined);
-
-          break;
-        }
-
-      case _kinds.Kind.DIRECTIVE:
-        this._directive = schema.getDirective(node.name.value);
-        break;
-
-      case _kinds.Kind.OPERATION_DEFINITION:
-        {
-          var type;
-
-          switch (node.operation) {
-            case 'query':
-              type = schema.getQueryType();
-              break;
-
-            case 'mutation':
-              type = schema.getMutationType();
-              break;
-
-            case 'subscription':
-              type = schema.getSubscriptionType();
-              break;
-          }
-
-          this._typeStack.push((0, _definition.isObjectType)(type) ? type : undefined);
-
-          break;
-        }
-
-      case _kinds.Kind.INLINE_FRAGMENT:
-      case _kinds.Kind.FRAGMENT_DEFINITION:
-        {
-          var typeConditionAST = node.typeCondition;
-          var outputType = typeConditionAST ? (0, _typeFromAST.typeFromAST)(schema, typeConditionAST) : (0, _definition.getNamedType)(this.getType());
-
-          this._typeStack.push((0, _definition.isOutputType)(outputType) ? outputType : undefined);
-
-          break;
-        }
-
-      case _kinds.Kind.VARIABLE_DEFINITION:
-        {
-          var inputType = (0, _typeFromAST.typeFromAST)(schema, node.type);
-
-          this._inputTypeStack.push((0, _definition.isInputType)(inputType) ? inputType : undefined);
-
-          break;
-        }
-
-      case _kinds.Kind.ARGUMENT:
-        {
-          var _this$getDirective;
-
-          var argDef;
-          var argType;
-          var fieldOrDirective = (_this$getDirective = this.getDirective()) !== null && _this$getDirective !== void 0 ? _this$getDirective : this.getFieldDef();
-
-          if (fieldOrDirective) {
-            argDef = (0, _find.default)(fieldOrDirective.args, function (arg) {
-              return arg.name === node.name.value;
-            });
-
-            if (argDef) {
-              argType = argDef.type;
-            }
-          }
-
-          this._argument = argDef;
-
-          this._defaultValueStack.push(argDef ? argDef.defaultValue : undefined);
-
-          this._inputTypeStack.push((0, _definition.isInputType)(argType) ? argType : undefined);
-
-          break;
-        }
-
-      case _kinds.Kind.LIST:
-        {
-          var listType = (0, _definition.getNullableType)(this.getInputType());
-          var itemType = (0, _definition.isListType)(listType) ? listType.ofType : listType; // List positions never have a default value.
-
-          this._defaultValueStack.push(undefined);
-
-          this._inputTypeStack.push((0, _definition.isInputType)(itemType) ? itemType : undefined);
-
-          break;
-        }
-
-      case _kinds.Kind.OBJECT_FIELD:
-        {
-          var objectType = (0, _definition.getNamedType)(this.getInputType());
-          var inputFieldType;
-          var inputField;
-
-          if ((0, _definition.isInputObjectType)(objectType)) {
-            inputField = objectType.getFields()[node.name.value];
-
-            if (inputField) {
-              inputFieldType = inputField.type;
-            }
-          }
-
-          this._defaultValueStack.push(inputField ? inputField.defaultValue : undefined);
-
-          this._inputTypeStack.push((0, _definition.isInputType)(inputFieldType) ? inputFieldType : undefined);
-
-          break;
-        }
-
-      case _kinds.Kind.ENUM:
-        {
-          var enumType = (0, _definition.getNamedType)(this.getInputType());
-          var enumValue;
-
-          if ((0, _definition.isEnumType)(enumType)) {
-            enumValue = enumType.getValue(node.value);
-          }
-
-          this._enumValue = enumValue;
-          break;
-        }
-    }
-  };
-
-  _proto.leave = function leave(node) {
-    switch (node.kind) {
-      case _kinds.Kind.SELECTION_SET:
-        this._parentTypeStack.pop();
-
-        break;
-
-      case _kinds.Kind.FIELD:
-        this._fieldDefStack.pop();
-
-        this._typeStack.pop();
-
-        break;
-
-      case _kinds.Kind.DIRECTIVE:
-        this._directive = null;
-        break;
-
-      case _kinds.Kind.OPERATION_DEFINITION:
-      case _kinds.Kind.INLINE_FRAGMENT:
-      case _kinds.Kind.FRAGMENT_DEFINITION:
-        this._typeStack.pop();
-
-        break;
-
-      case _kinds.Kind.VARIABLE_DEFINITION:
-        this._inputTypeStack.pop();
-
-        break;
-
-      case _kinds.Kind.ARGUMENT:
-        this._argument = null;
-
-        this._defaultValueStack.pop();
-
-        this._inputTypeStack.pop();
-
-        break;
-
-      case _kinds.Kind.LIST:
-      case _kinds.Kind.OBJECT_FIELD:
-        this._defaultValueStack.pop();
-
-        this._inputTypeStack.pop();
-
-        break;
-
-      case _kinds.Kind.ENUM:
-        this._enumValue = null;
-        break;
-    }
-  };
-
-  return TypeInfo;
-}();
-/**
- * Not exactly the same as the executor's definition of getFieldDef, in this
- * statically evaluated environment we do not always have an Object type,
- * and need to handle Interface and Union types.
- */
-
-
-exports.TypeInfo = TypeInfo;
-
-function getFieldDef(schema, parentType, fieldNode) {
-  var name = fieldNode.name.value;
-
-  if (name === _introspection.SchemaMetaFieldDef.name && schema.getQueryType() === parentType) {
-    return _introspection.SchemaMetaFieldDef;
-  }
-
-  if (name === _introspection.TypeMetaFieldDef.name && schema.getQueryType() === parentType) {
-    return _introspection.TypeMetaFieldDef;
-  }
-
-  if (name === _introspection.TypeNameMetaFieldDef.name && (0, _definition.isCompositeType)(parentType)) {
-    return _introspection.TypeNameMetaFieldDef;
-  }
-
-  if ((0, _definition.isObjectType)(parentType) || (0, _definition.isInterfaceType)(parentType)) {
-    return parentType.getFields()[name];
-  }
-}
-/**
- * Creates a new visitor instance which maintains a provided TypeInfo instance
- * along with visiting visitor.
- */
-
-
-function visitWithTypeInfo(typeInfo, visitor) {
-  return {
-    enter: function enter(node) {
-      typeInfo.enter(node);
-      var fn = (0, _visitor.getVisitFn)(visitor, node.kind,
-      /* isLeaving */
-      false);
-
-      if (fn) {
-        var result = fn.apply(visitor, arguments);
-
-        if (result !== undefined) {
-          typeInfo.leave(node);
-
-          if ((0, _ast.isNode)(result)) {
-            typeInfo.enter(result);
-          }
-        }
-
-        return result;
-      }
-    },
-    leave: function leave(node) {
-      var fn = (0, _visitor.getVisitFn)(visitor, node.kind,
-      /* isLeaving */
-      true);
-      var result;
-
-      if (fn) {
-        result = fn.apply(visitor, arguments);
-      }
-
-      typeInfo.leave(node);
-      return result;
-    }
-  };
-}
diff --git a/node_modules/graphql/utilities/TypeInfo.js.flow b/node_modules/graphql/utilities/TypeInfo.js.flow
deleted file mode 100644
index 5d9298d..0000000
--- a/node_modules/graphql/utilities/TypeInfo.js.flow
+++ /dev/null
@@ -1,361 +0,0 @@
-// @flow strict
-
-import find from '../polyfills/find';
-
-import { Kind } from '../language/kinds';
-import { type Visitor, getVisitFn } from '../language/visitor';
-import {
-  type ASTNode,
-  type ASTKindToNode,
-  type FieldNode,
-  isNode,
-} from '../language/ast';
-
-import { type GraphQLSchema } from '../type/schema';
-import { type GraphQLDirective } from '../type/directives';
-import {
-  type GraphQLType,
-  type GraphQLInputType,
-  type GraphQLOutputType,
-  type GraphQLCompositeType,
-  type GraphQLField,
-  type GraphQLArgument,
-  type GraphQLInputField,
-  type GraphQLEnumValue,
-  isObjectType,
-  isInterfaceType,
-  isEnumType,
-  isInputObjectType,
-  isListType,
-  isCompositeType,
-  isInputType,
-  isOutputType,
-  getNullableType,
-  getNamedType,
-} from '../type/definition';
-import {
-  SchemaMetaFieldDef,
-  TypeMetaFieldDef,
-  TypeNameMetaFieldDef,
-} from '../type/introspection';
-
-import { typeFromAST } from './typeFromAST';
-
-/**
- * TypeInfo is a utility class which, given a GraphQL schema, can keep track
- * of the current field and type definitions at any point in a GraphQL document
- * AST during a recursive descent by calling `enter(node)` and `leave(node)`.
- */
-export class TypeInfo {
-  _schema: GraphQLSchema;
-  _typeStack: Array<?GraphQLOutputType>;
-  _parentTypeStack: Array<?GraphQLCompositeType>;
-  _inputTypeStack: Array<?GraphQLInputType>;
-  _fieldDefStack: Array<?GraphQLField<mixed, mixed>>;
-  _defaultValueStack: Array<?mixed>;
-  _directive: ?GraphQLDirective;
-  _argument: ?GraphQLArgument;
-  _enumValue: ?GraphQLEnumValue;
-  _getFieldDef: typeof getFieldDef;
-
-  constructor(
-    schema: GraphQLSchema,
-    // NOTE: this experimental optional second parameter is only needed in order
-    // to support non-spec-compliant code bases. You should never need to use it.
-    // It may disappear in the future.
-    getFieldDefFn?: typeof getFieldDef,
-    // Initial type may be provided in rare cases to facilitate traversals
-    // beginning somewhere other than documents.
-    initialType?: GraphQLType,
-  ): void {
-    this._schema = schema;
-    this._typeStack = [];
-    this._parentTypeStack = [];
-    this._inputTypeStack = [];
-    this._fieldDefStack = [];
-    this._defaultValueStack = [];
-    this._directive = null;
-    this._argument = null;
-    this._enumValue = null;
-    this._getFieldDef = getFieldDefFn ?? getFieldDef;
-    if (initialType) {
-      if (isInputType(initialType)) {
-        this._inputTypeStack.push(initialType);
-      }
-      if (isCompositeType(initialType)) {
-        this._parentTypeStack.push(initialType);
-      }
-      if (isOutputType(initialType)) {
-        this._typeStack.push(initialType);
-      }
-    }
-  }
-
-  getType(): ?GraphQLOutputType {
-    if (this._typeStack.length > 0) {
-      return this._typeStack[this._typeStack.length - 1];
-    }
-  }
-
-  getParentType(): ?GraphQLCompositeType {
-    if (this._parentTypeStack.length > 0) {
-      return this._parentTypeStack[this._parentTypeStack.length - 1];
-    }
-  }
-
-  getInputType(): ?GraphQLInputType {
-    if (this._inputTypeStack.length > 0) {
-      return this._inputTypeStack[this._inputTypeStack.length - 1];
-    }
-  }
-
-  getParentInputType(): ?GraphQLInputType {
-    if (this._inputTypeStack.length > 1) {
-      return this._inputTypeStack[this._inputTypeStack.length - 2];
-    }
-  }
-
-  getFieldDef(): ?GraphQLField<mixed, mixed> {
-    if (this._fieldDefStack.length > 0) {
-      return this._fieldDefStack[this._fieldDefStack.length - 1];
-    }
-  }
-
-  getDefaultValue(): ?mixed {
-    if (this._defaultValueStack.length > 0) {
-      return this._defaultValueStack[this._defaultValueStack.length - 1];
-    }
-  }
-
-  getDirective(): ?GraphQLDirective {
-    return this._directive;
-  }
-
-  getArgument(): ?GraphQLArgument {
-    return this._argument;
-  }
-
-  getEnumValue(): ?GraphQLEnumValue {
-    return this._enumValue;
-  }
-
-  enter(node: ASTNode) {
-    const schema = this._schema;
-    // Note: many of the types below are explicitly typed as "mixed" to drop
-    // any assumptions of a valid schema to ensure runtime types are properly
-    // checked before continuing since TypeInfo is used as part of validation
-    // which occurs before guarantees of schema and document validity.
-    switch (node.kind) {
-      case Kind.SELECTION_SET: {
-        const namedType: mixed = getNamedType(this.getType());
-        this._parentTypeStack.push(
-          isCompositeType(namedType) ? namedType : undefined,
-        );
-        break;
-      }
-      case Kind.FIELD: {
-        const parentType = this.getParentType();
-        let fieldDef;
-        let fieldType: mixed;
-        if (parentType) {
-          fieldDef = this._getFieldDef(schema, parentType, node);
-          if (fieldDef) {
-            fieldType = fieldDef.type;
-          }
-        }
-        this._fieldDefStack.push(fieldDef);
-        this._typeStack.push(isOutputType(fieldType) ? fieldType : undefined);
-        break;
-      }
-      case Kind.DIRECTIVE:
-        this._directive = schema.getDirective(node.name.value);
-        break;
-      case Kind.OPERATION_DEFINITION: {
-        let type: mixed;
-        switch (node.operation) {
-          case 'query':
-            type = schema.getQueryType();
-            break;
-          case 'mutation':
-            type = schema.getMutationType();
-            break;
-          case 'subscription':
-            type = schema.getSubscriptionType();
-            break;
-        }
-        this._typeStack.push(isObjectType(type) ? type : undefined);
-        break;
-      }
-      case Kind.INLINE_FRAGMENT:
-      case Kind.FRAGMENT_DEFINITION: {
-        const typeConditionAST = node.typeCondition;
-        const outputType: mixed = typeConditionAST
-          ? typeFromAST(schema, typeConditionAST)
-          : getNamedType(this.getType());
-        this._typeStack.push(isOutputType(outputType) ? outputType : undefined);
-        break;
-      }
-      case Kind.VARIABLE_DEFINITION: {
-        const inputType: mixed = typeFromAST(schema, node.type);
-        this._inputTypeStack.push(
-          isInputType(inputType) ? inputType : undefined,
-        );
-        break;
-      }
-      case Kind.ARGUMENT: {
-        let argDef;
-        let argType: mixed;
-        const fieldOrDirective = this.getDirective() ?? this.getFieldDef();
-        if (fieldOrDirective) {
-          argDef = find(
-            fieldOrDirective.args,
-            arg => arg.name === node.name.value,
-          );
-          if (argDef) {
-            argType = argDef.type;
-          }
-        }
-        this._argument = argDef;
-        this._defaultValueStack.push(argDef ? argDef.defaultValue : undefined);
-        this._inputTypeStack.push(isInputType(argType) ? argType : undefined);
-        break;
-      }
-      case Kind.LIST: {
-        const listType: mixed = getNullableType(this.getInputType());
-        const itemType: mixed = isListType(listType)
-          ? listType.ofType
-          : listType;
-        // List positions never have a default value.
-        this._defaultValueStack.push(undefined);
-        this._inputTypeStack.push(isInputType(itemType) ? itemType : undefined);
-        break;
-      }
-      case Kind.OBJECT_FIELD: {
-        const objectType: mixed = getNamedType(this.getInputType());
-        let inputFieldType: GraphQLInputType | void;
-        let inputField: GraphQLInputField | void;
-        if (isInputObjectType(objectType)) {
-          inputField = objectType.getFields()[node.name.value];
-          if (inputField) {
-            inputFieldType = inputField.type;
-          }
-        }
-        this._defaultValueStack.push(
-          inputField ? inputField.defaultValue : undefined,
-        );
-        this._inputTypeStack.push(
-          isInputType(inputFieldType) ? inputFieldType : undefined,
-        );
-        break;
-      }
-      case Kind.ENUM: {
-        const enumType: mixed = getNamedType(this.getInputType());
-        let enumValue;
-        if (isEnumType(enumType)) {
-          enumValue = enumType.getValue(node.value);
-        }
-        this._enumValue = enumValue;
-        break;
-      }
-    }
-  }
-
-  leave(node: ASTNode) {
-    switch (node.kind) {
-      case Kind.SELECTION_SET:
-        this._parentTypeStack.pop();
-        break;
-      case Kind.FIELD:
-        this._fieldDefStack.pop();
-        this._typeStack.pop();
-        break;
-      case Kind.DIRECTIVE:
-        this._directive = null;
-        break;
-      case Kind.OPERATION_DEFINITION:
-      case Kind.INLINE_FRAGMENT:
-      case Kind.FRAGMENT_DEFINITION:
-        this._typeStack.pop();
-        break;
-      case Kind.VARIABLE_DEFINITION:
-        this._inputTypeStack.pop();
-        break;
-      case Kind.ARGUMENT:
-        this._argument = null;
-        this._defaultValueStack.pop();
-        this._inputTypeStack.pop();
-        break;
-      case Kind.LIST:
-      case Kind.OBJECT_FIELD:
-        this._defaultValueStack.pop();
-        this._inputTypeStack.pop();
-        break;
-      case Kind.ENUM:
-        this._enumValue = null;
-        break;
-    }
-  }
-}
-
-/**
- * Not exactly the same as the executor's definition of getFieldDef, in this
- * statically evaluated environment we do not always have an Object type,
- * and need to handle Interface and Union types.
- */
-function getFieldDef(
-  schema: GraphQLSchema,
-  parentType: GraphQLType,
-  fieldNode: FieldNode,
-): ?GraphQLField<mixed, mixed> {
-  const name = fieldNode.name.value;
-  if (
-    name === SchemaMetaFieldDef.name &&
-    schema.getQueryType() === parentType
-  ) {
-    return SchemaMetaFieldDef;
-  }
-  if (name === TypeMetaFieldDef.name && schema.getQueryType() === parentType) {
-    return TypeMetaFieldDef;
-  }
-  if (name === TypeNameMetaFieldDef.name && isCompositeType(parentType)) {
-    return TypeNameMetaFieldDef;
-  }
-  if (isObjectType(parentType) || isInterfaceType(parentType)) {
-    return parentType.getFields()[name];
-  }
-}
-
-/**
- * Creates a new visitor instance which maintains a provided TypeInfo instance
- * along with visiting visitor.
- */
-export function visitWithTypeInfo(
-  typeInfo: TypeInfo,
-  visitor: Visitor<ASTKindToNode>,
-): Visitor<ASTKindToNode> {
-  return {
-    enter(node) {
-      typeInfo.enter(node);
-      const fn = getVisitFn(visitor, node.kind, /* isLeaving */ false);
-      if (fn) {
-        const result = fn.apply(visitor, arguments);
-        if (result !== undefined) {
-          typeInfo.leave(node);
-          if (isNode(result)) {
-            typeInfo.enter(result);
-          }
-        }
-        return result;
-      }
-    },
-    leave(node) {
-      const fn = getVisitFn(visitor, node.kind, /* isLeaving */ true);
-      let result;
-      if (fn) {
-        result = fn.apply(visitor, arguments);
-      }
-      typeInfo.leave(node);
-      return result;
-    },
-  };
-}
diff --git a/node_modules/graphql/utilities/TypeInfo.mjs b/node_modules/graphql/utilities/TypeInfo.mjs
deleted file mode 100644
index 44d0189..0000000
--- a/node_modules/graphql/utilities/TypeInfo.mjs
+++ /dev/null
@@ -1,380 +0,0 @@
-import find from "../polyfills/find.mjs";
-import { Kind } from "../language/kinds.mjs";
-import { getVisitFn } from "../language/visitor.mjs";
-import { isNode } from "../language/ast.mjs";
-import { isObjectType, isInterfaceType, isEnumType, isInputObjectType, isListType, isCompositeType, isInputType, isOutputType, getNullableType, getNamedType } from "../type/definition.mjs";
-import { SchemaMetaFieldDef, TypeMetaFieldDef, TypeNameMetaFieldDef } from "../type/introspection.mjs";
-import { typeFromAST } from "./typeFromAST.mjs";
-/**
- * TypeInfo is a utility class which, given a GraphQL schema, can keep track
- * of the current field and type definitions at any point in a GraphQL document
- * AST during a recursive descent by calling `enter(node)` and `leave(node)`.
- */
-
-export var TypeInfo =
-/*#__PURE__*/
-function () {
-  function TypeInfo(schema, // NOTE: this experimental optional second parameter is only needed in order
-  // to support non-spec-compliant code bases. You should never need to use it.
-  // It may disappear in the future.
-  getFieldDefFn, // Initial type may be provided in rare cases to facilitate traversals
-  // beginning somewhere other than documents.
-  initialType) {
-    this._schema = schema;
-    this._typeStack = [];
-    this._parentTypeStack = [];
-    this._inputTypeStack = [];
-    this._fieldDefStack = [];
-    this._defaultValueStack = [];
-    this._directive = null;
-    this._argument = null;
-    this._enumValue = null;
-    this._getFieldDef = getFieldDefFn !== null && getFieldDefFn !== void 0 ? getFieldDefFn : getFieldDef;
-
-    if (initialType) {
-      if (isInputType(initialType)) {
-        this._inputTypeStack.push(initialType);
-      }
-
-      if (isCompositeType(initialType)) {
-        this._parentTypeStack.push(initialType);
-      }
-
-      if (isOutputType(initialType)) {
-        this._typeStack.push(initialType);
-      }
-    }
-  }
-
-  var _proto = TypeInfo.prototype;
-
-  _proto.getType = function getType() {
-    if (this._typeStack.length > 0) {
-      return this._typeStack[this._typeStack.length - 1];
-    }
-  };
-
-  _proto.getParentType = function getParentType() {
-    if (this._parentTypeStack.length > 0) {
-      return this._parentTypeStack[this._parentTypeStack.length - 1];
-    }
-  };
-
-  _proto.getInputType = function getInputType() {
-    if (this._inputTypeStack.length > 0) {
-      return this._inputTypeStack[this._inputTypeStack.length - 1];
-    }
-  };
-
-  _proto.getParentInputType = function getParentInputType() {
-    if (this._inputTypeStack.length > 1) {
-      return this._inputTypeStack[this._inputTypeStack.length - 2];
-    }
-  };
-
-  _proto.getFieldDef = function getFieldDef() {
-    if (this._fieldDefStack.length > 0) {
-      return this._fieldDefStack[this._fieldDefStack.length - 1];
-    }
-  };
-
-  _proto.getDefaultValue = function getDefaultValue() {
-    if (this._defaultValueStack.length > 0) {
-      return this._defaultValueStack[this._defaultValueStack.length - 1];
-    }
-  };
-
-  _proto.getDirective = function getDirective() {
-    return this._directive;
-  };
-
-  _proto.getArgument = function getArgument() {
-    return this._argument;
-  };
-
-  _proto.getEnumValue = function getEnumValue() {
-    return this._enumValue;
-  };
-
-  _proto.enter = function enter(node) {
-    var schema = this._schema; // Note: many of the types below are explicitly typed as "mixed" to drop
-    // any assumptions of a valid schema to ensure runtime types are properly
-    // checked before continuing since TypeInfo is used as part of validation
-    // which occurs before guarantees of schema and document validity.
-
-    switch (node.kind) {
-      case Kind.SELECTION_SET:
-        {
-          var namedType = getNamedType(this.getType());
-
-          this._parentTypeStack.push(isCompositeType(namedType) ? namedType : undefined);
-
-          break;
-        }
-
-      case Kind.FIELD:
-        {
-          var parentType = this.getParentType();
-          var fieldDef;
-          var fieldType;
-
-          if (parentType) {
-            fieldDef = this._getFieldDef(schema, parentType, node);
-
-            if (fieldDef) {
-              fieldType = fieldDef.type;
-            }
-          }
-
-          this._fieldDefStack.push(fieldDef);
-
-          this._typeStack.push(isOutputType(fieldType) ? fieldType : undefined);
-
-          break;
-        }
-
-      case Kind.DIRECTIVE:
-        this._directive = schema.getDirective(node.name.value);
-        break;
-
-      case Kind.OPERATION_DEFINITION:
-        {
-          var type;
-
-          switch (node.operation) {
-            case 'query':
-              type = schema.getQueryType();
-              break;
-
-            case 'mutation':
-              type = schema.getMutationType();
-              break;
-
-            case 'subscription':
-              type = schema.getSubscriptionType();
-              break;
-          }
-
-          this._typeStack.push(isObjectType(type) ? type : undefined);
-
-          break;
-        }
-
-      case Kind.INLINE_FRAGMENT:
-      case Kind.FRAGMENT_DEFINITION:
-        {
-          var typeConditionAST = node.typeCondition;
-          var outputType = typeConditionAST ? typeFromAST(schema, typeConditionAST) : getNamedType(this.getType());
-
-          this._typeStack.push(isOutputType(outputType) ? outputType : undefined);
-
-          break;
-        }
-
-      case Kind.VARIABLE_DEFINITION:
-        {
-          var inputType = typeFromAST(schema, node.type);
-
-          this._inputTypeStack.push(isInputType(inputType) ? inputType : undefined);
-
-          break;
-        }
-
-      case Kind.ARGUMENT:
-        {
-          var _this$getDirective;
-
-          var argDef;
-          var argType;
-          var fieldOrDirective = (_this$getDirective = this.getDirective()) !== null && _this$getDirective !== void 0 ? _this$getDirective : this.getFieldDef();
-
-          if (fieldOrDirective) {
-            argDef = find(fieldOrDirective.args, function (arg) {
-              return arg.name === node.name.value;
-            });
-
-            if (argDef) {
-              argType = argDef.type;
-            }
-          }
-
-          this._argument = argDef;
-
-          this._defaultValueStack.push(argDef ? argDef.defaultValue : undefined);
-
-          this._inputTypeStack.push(isInputType(argType) ? argType : undefined);
-
-          break;
-        }
-
-      case Kind.LIST:
-        {
-          var listType = getNullableType(this.getInputType());
-          var itemType = isListType(listType) ? listType.ofType : listType; // List positions never have a default value.
-
-          this._defaultValueStack.push(undefined);
-
-          this._inputTypeStack.push(isInputType(itemType) ? itemType : undefined);
-
-          break;
-        }
-
-      case Kind.OBJECT_FIELD:
-        {
-          var objectType = getNamedType(this.getInputType());
-          var inputFieldType;
-          var inputField;
-
-          if (isInputObjectType(objectType)) {
-            inputField = objectType.getFields()[node.name.value];
-
-            if (inputField) {
-              inputFieldType = inputField.type;
-            }
-          }
-
-          this._defaultValueStack.push(inputField ? inputField.defaultValue : undefined);
-
-          this._inputTypeStack.push(isInputType(inputFieldType) ? inputFieldType : undefined);
-
-          break;
-        }
-
-      case Kind.ENUM:
-        {
-          var enumType = getNamedType(this.getInputType());
-          var enumValue;
-
-          if (isEnumType(enumType)) {
-            enumValue = enumType.getValue(node.value);
-          }
-
-          this._enumValue = enumValue;
-          break;
-        }
-    }
-  };
-
-  _proto.leave = function leave(node) {
-    switch (node.kind) {
-      case Kind.SELECTION_SET:
-        this._parentTypeStack.pop();
-
-        break;
-
-      case Kind.FIELD:
-        this._fieldDefStack.pop();
-
-        this._typeStack.pop();
-
-        break;
-
-      case Kind.DIRECTIVE:
-        this._directive = null;
-        break;
-
-      case Kind.OPERATION_DEFINITION:
-      case Kind.INLINE_FRAGMENT:
-      case Kind.FRAGMENT_DEFINITION:
-        this._typeStack.pop();
-
-        break;
-
-      case Kind.VARIABLE_DEFINITION:
-        this._inputTypeStack.pop();
-
-        break;
-
-      case Kind.ARGUMENT:
-        this._argument = null;
-
-        this._defaultValueStack.pop();
-
-        this._inputTypeStack.pop();
-
-        break;
-
-      case Kind.LIST:
-      case Kind.OBJECT_FIELD:
-        this._defaultValueStack.pop();
-
-        this._inputTypeStack.pop();
-
-        break;
-
-      case Kind.ENUM:
-        this._enumValue = null;
-        break;
-    }
-  };
-
-  return TypeInfo;
-}();
-/**
- * Not exactly the same as the executor's definition of getFieldDef, in this
- * statically evaluated environment we do not always have an Object type,
- * and need to handle Interface and Union types.
- */
-
-function getFieldDef(schema, parentType, fieldNode) {
-  var name = fieldNode.name.value;
-
-  if (name === SchemaMetaFieldDef.name && schema.getQueryType() === parentType) {
-    return SchemaMetaFieldDef;
-  }
-
-  if (name === TypeMetaFieldDef.name && schema.getQueryType() === parentType) {
-    return TypeMetaFieldDef;
-  }
-
-  if (name === TypeNameMetaFieldDef.name && isCompositeType(parentType)) {
-    return TypeNameMetaFieldDef;
-  }
-
-  if (isObjectType(parentType) || isInterfaceType(parentType)) {
-    return parentType.getFields()[name];
-  }
-}
-/**
- * Creates a new visitor instance which maintains a provided TypeInfo instance
- * along with visiting visitor.
- */
-
-
-export function visitWithTypeInfo(typeInfo, visitor) {
-  return {
-    enter: function enter(node) {
-      typeInfo.enter(node);
-      var fn = getVisitFn(visitor, node.kind,
-      /* isLeaving */
-      false);
-
-      if (fn) {
-        var result = fn.apply(visitor, arguments);
-
-        if (result !== undefined) {
-          typeInfo.leave(node);
-
-          if (isNode(result)) {
-            typeInfo.enter(result);
-          }
-        }
-
-        return result;
-      }
-    },
-    leave: function leave(node) {
-      var fn = getVisitFn(visitor, node.kind,
-      /* isLeaving */
-      true);
-      var result;
-
-      if (fn) {
-        result = fn.apply(visitor, arguments);
-      }
-
-      typeInfo.leave(node);
-      return result;
-    }
-  };
-}
diff --git a/node_modules/graphql/utilities/assertValidName.d.ts b/node_modules/graphql/utilities/assertValidName.d.ts
deleted file mode 100644
index 5a1011e..0000000
--- a/node_modules/graphql/utilities/assertValidName.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { GraphQLError } from '../error/GraphQLError';
-
-/**
- * Upholds the spec rules about naming.
- */
-export function assertValidName(name: string): string;
-
-/**
- * Returns an Error if a name is invalid.
- */
-export function isValidNameError(name: string): GraphQLError | undefined;
diff --git a/node_modules/graphql/utilities/assertValidName.js b/node_modules/graphql/utilities/assertValidName.js
deleted file mode 100644
index 26be1e4..0000000
--- a/node_modules/graphql/utilities/assertValidName.js
+++ /dev/null
@@ -1,44 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.assertValidName = assertValidName;
-exports.isValidNameError = isValidNameError;
-
-var _devAssert = _interopRequireDefault(require("../jsutils/devAssert"));
-
-var _GraphQLError = require("../error/GraphQLError");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var NAME_RX = /^[_a-zA-Z][_a-zA-Z0-9]*$/;
-/**
- * Upholds the spec rules about naming.
- */
-
-function assertValidName(name) {
-  var error = isValidNameError(name);
-
-  if (error) {
-    throw error;
-  }
-
-  return name;
-}
-/**
- * Returns an Error if a name is invalid.
- */
-
-
-function isValidNameError(name) {
-  typeof name === 'string' || (0, _devAssert.default)(0, 'Expected name to be a string.');
-
-  if (name.length > 1 && name[0] === '_' && name[1] === '_') {
-    return new _GraphQLError.GraphQLError("Name \"".concat(name, "\" must not begin with \"__\", which is reserved by GraphQL introspection."));
-  }
-
-  if (!NAME_RX.test(name)) {
-    return new _GraphQLError.GraphQLError("Names must match /^[_a-zA-Z][_a-zA-Z0-9]*$/ but \"".concat(name, "\" does not."));
-  }
-}
diff --git a/node_modules/graphql/utilities/assertValidName.js.flow b/node_modules/graphql/utilities/assertValidName.js.flow
deleted file mode 100644
index 0d8bab7..0000000
--- a/node_modules/graphql/utilities/assertValidName.js.flow
+++ /dev/null
@@ -1,35 +0,0 @@
-// @flow strict
-
-import devAssert from '../jsutils/devAssert';
-
-import { GraphQLError } from '../error/GraphQLError';
-
-const NAME_RX = /^[_a-zA-Z][_a-zA-Z0-9]*$/;
-
-/**
- * Upholds the spec rules about naming.
- */
-export function assertValidName(name: string): string {
-  const error = isValidNameError(name);
-  if (error) {
-    throw error;
-  }
-  return name;
-}
-
-/**
- * Returns an Error if a name is invalid.
- */
-export function isValidNameError(name: string): GraphQLError | void {
-  devAssert(typeof name === 'string', 'Expected name to be a string.');
-  if (name.length > 1 && name[0] === '_' && name[1] === '_') {
-    return new GraphQLError(
-      `Name "${name}" must not begin with "__", which is reserved by GraphQL introspection.`,
-    );
-  }
-  if (!NAME_RX.test(name)) {
-    return new GraphQLError(
-      `Names must match /^[_a-zA-Z][_a-zA-Z0-9]*$/ but "${name}" does not.`,
-    );
-  }
-}
diff --git a/node_modules/graphql/utilities/assertValidName.mjs b/node_modules/graphql/utilities/assertValidName.mjs
deleted file mode 100644
index d504d22..0000000
--- a/node_modules/graphql/utilities/assertValidName.mjs
+++ /dev/null
@@ -1,31 +0,0 @@
-import devAssert from "../jsutils/devAssert.mjs";
-import { GraphQLError } from "../error/GraphQLError.mjs";
-var NAME_RX = /^[_a-zA-Z][_a-zA-Z0-9]*$/;
-/**
- * Upholds the spec rules about naming.
- */
-
-export function assertValidName(name) {
-  var error = isValidNameError(name);
-
-  if (error) {
-    throw error;
-  }
-
-  return name;
-}
-/**
- * Returns an Error if a name is invalid.
- */
-
-export function isValidNameError(name) {
-  typeof name === 'string' || devAssert(0, 'Expected name to be a string.');
-
-  if (name.length > 1 && name[0] === '_' && name[1] === '_') {
-    return new GraphQLError("Name \"".concat(name, "\" must not begin with \"__\", which is reserved by GraphQL introspection."));
-  }
-
-  if (!NAME_RX.test(name)) {
-    return new GraphQLError("Names must match /^[_a-zA-Z][_a-zA-Z0-9]*$/ but \"".concat(name, "\" does not."));
-  }
-}
diff --git a/node_modules/graphql/utilities/astFromValue.d.ts b/node_modules/graphql/utilities/astFromValue.d.ts
deleted file mode 100644
index ed84eb4..0000000
--- a/node_modules/graphql/utilities/astFromValue.d.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-import { ValueNode } from '../language/ast';
-import { GraphQLInputType } from '../type/definition';
-
-/**
- * Produces a GraphQL Value AST given a JavaScript value.
- *
- * A GraphQL type must be provided, which will be used to interpret different
- * JavaScript values.
- *
- * | JSON Value    | GraphQL Value        |
- * | ------------- | -------------------- |
- * | Object        | Input Object         |
- * | Array         | List                 |
- * | Boolean       | Boolean              |
- * | String        | String / Enum Value  |
- * | Number        | Int / Float          |
- * | Mixed         | Enum Value           |
- * | null          | NullValue            |
- *
- */
-export function astFromValue(
-  value: any,
-  type: GraphQLInputType,
-): Maybe<ValueNode>;
diff --git a/node_modules/graphql/utilities/astFromValue.js b/node_modules/graphql/utilities/astFromValue.js
deleted file mode 100644
index cfaa01f..0000000
--- a/node_modules/graphql/utilities/astFromValue.js
+++ /dev/null
@@ -1,199 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.astFromValue = astFromValue;
-
-var _isFinite = _interopRequireDefault(require("../polyfills/isFinite"));
-
-var _arrayFrom3 = _interopRequireDefault(require("../polyfills/arrayFrom"));
-
-var _objectValues3 = _interopRequireDefault(require("../polyfills/objectValues"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _invariant = _interopRequireDefault(require("../jsutils/invariant"));
-
-var _isObjectLike = _interopRequireDefault(require("../jsutils/isObjectLike"));
-
-var _isCollection = _interopRequireDefault(require("../jsutils/isCollection"));
-
-var _kinds = require("../language/kinds");
-
-var _scalars = require("../type/scalars");
-
-var _definition = require("../type/definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Produces a GraphQL Value AST given a JavaScript object.
- * Function will match JavaScript/JSON values to GraphQL AST schema format
- * by using suggested GraphQLInputType. For example:
- *
- *     astFromValue("value", GraphQLString)
- *
- * A GraphQL type must be provided, which will be used to interpret different
- * JavaScript values.
- *
- * | JSON Value    | GraphQL Value        |
- * | ------------- | -------------------- |
- * | Object        | Input Object         |
- * | Array         | List                 |
- * | Boolean       | Boolean              |
- * | String        | String / Enum Value  |
- * | Number        | Int / Float          |
- * | Mixed         | Enum Value           |
- * | null          | NullValue            |
- *
- */
-function astFromValue(value, type) {
-  if ((0, _definition.isNonNullType)(type)) {
-    var astValue = astFromValue(value, type.ofType);
-
-    if ((astValue === null || astValue === void 0 ? void 0 : astValue.kind) === _kinds.Kind.NULL) {
-      return null;
-    }
-
-    return astValue;
-  } // only explicit null, not undefined, NaN
-
-
-  if (value === null) {
-    return {
-      kind: _kinds.Kind.NULL
-    };
-  } // undefined
-
-
-  if (value === undefined) {
-    return null;
-  } // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but
-  // the value is not an array, convert the value using the list's item type.
-
-
-  if ((0, _definition.isListType)(type)) {
-    var itemType = type.ofType;
-
-    if ((0, _isCollection.default)(value)) {
-      var valuesNodes = []; // Since we transpile for-of in loose mode it doesn't support iterators
-      // and it's required to first convert iteratable into array
-
-      for (var _i2 = 0, _arrayFrom2 = (0, _arrayFrom3.default)(value); _i2 < _arrayFrom2.length; _i2++) {
-        var item = _arrayFrom2[_i2];
-        var itemNode = astFromValue(item, itemType);
-
-        if (itemNode != null) {
-          valuesNodes.push(itemNode);
-        }
-      }
-
-      return {
-        kind: _kinds.Kind.LIST,
-        values: valuesNodes
-      };
-    }
-
-    return astFromValue(value, itemType);
-  } // Populate the fields of the input object by creating ASTs from each value
-  // in the JavaScript object according to the fields in the input type.
-
-
-  if ((0, _definition.isInputObjectType)(type)) {
-    if (!(0, _isObjectLike.default)(value)) {
-      return null;
-    }
-
-    var fieldNodes = [];
-
-    for (var _i4 = 0, _objectValues2 = (0, _objectValues3.default)(type.getFields()); _i4 < _objectValues2.length; _i4++) {
-      var field = _objectValues2[_i4];
-      var fieldValue = astFromValue(value[field.name], field.type);
-
-      if (fieldValue) {
-        fieldNodes.push({
-          kind: _kinds.Kind.OBJECT_FIELD,
-          name: {
-            kind: _kinds.Kind.NAME,
-            value: field.name
-          },
-          value: fieldValue
-        });
-      }
-    }
-
-    return {
-      kind: _kinds.Kind.OBJECT,
-      fields: fieldNodes
-    };
-  }
-
-  /* istanbul ignore else */
-  if ((0, _definition.isLeafType)(type)) {
-    // Since value is an internally represented value, it must be serialized
-    // to an externally represented value before converting into an AST.
-    var serialized = type.serialize(value);
-
-    if (serialized == null) {
-      return null;
-    } // Others serialize based on their corresponding JavaScript scalar types.
-
-
-    if (typeof serialized === 'boolean') {
-      return {
-        kind: _kinds.Kind.BOOLEAN,
-        value: serialized
-      };
-    } // JavaScript numbers can be Int or Float values.
-
-
-    if (typeof serialized === 'number' && (0, _isFinite.default)(serialized)) {
-      var stringNum = String(serialized);
-      return integerStringRegExp.test(stringNum) ? {
-        kind: _kinds.Kind.INT,
-        value: stringNum
-      } : {
-        kind: _kinds.Kind.FLOAT,
-        value: stringNum
-      };
-    }
-
-    if (typeof serialized === 'string') {
-      // Enum types use Enum literals.
-      if ((0, _definition.isEnumType)(type)) {
-        return {
-          kind: _kinds.Kind.ENUM,
-          value: serialized
-        };
-      } // ID types can use Int literals.
-
-
-      if (type === _scalars.GraphQLID && integerStringRegExp.test(serialized)) {
-        return {
-          kind: _kinds.Kind.INT,
-          value: serialized
-        };
-      }
-
-      return {
-        kind: _kinds.Kind.STRING,
-        value: serialized
-      };
-    }
-
-    throw new TypeError("Cannot convert value to AST: ".concat((0, _inspect.default)(serialized), "."));
-  } // Not reachable. All possible input types have been considered.
-
-
-  /* istanbul ignore next */
-  (0, _invariant.default)(false, 'Unexpected input type: ' + (0, _inspect.default)(type));
-}
-/**
- * IntValue:
- *   - NegativeSign? 0
- *   - NegativeSign? NonZeroDigit ( Digit+ )?
- */
-
-
-var integerStringRegExp = /^-?(?:0|[1-9][0-9]*)$/;
diff --git a/node_modules/graphql/utilities/astFromValue.js.flow b/node_modules/graphql/utilities/astFromValue.js.flow
deleted file mode 100644
index d4ea450..0000000
--- a/node_modules/graphql/utilities/astFromValue.js.flow
+++ /dev/null
@@ -1,154 +0,0 @@
-// @flow strict
-
-import isFinite from '../polyfills/isFinite';
-import arrayFrom from '../polyfills/arrayFrom';
-import objectValues from '../polyfills/objectValues';
-
-import inspect from '../jsutils/inspect';
-import invariant from '../jsutils/invariant';
-import isObjectLike from '../jsutils/isObjectLike';
-import isCollection from '../jsutils/isCollection';
-
-import { Kind } from '../language/kinds';
-import { type ValueNode } from '../language/ast';
-
-import { GraphQLID } from '../type/scalars';
-import {
-  type GraphQLInputType,
-  isLeafType,
-  isEnumType,
-  isInputObjectType,
-  isListType,
-  isNonNullType,
-} from '../type/definition';
-
-/**
- * Produces a GraphQL Value AST given a JavaScript object.
- * Function will match JavaScript/JSON values to GraphQL AST schema format
- * by using suggested GraphQLInputType. For example:
- *
- *     astFromValue("value", GraphQLString)
- *
- * A GraphQL type must be provided, which will be used to interpret different
- * JavaScript values.
- *
- * | JSON Value    | GraphQL Value        |
- * | ------------- | -------------------- |
- * | Object        | Input Object         |
- * | Array         | List                 |
- * | Boolean       | Boolean              |
- * | String        | String / Enum Value  |
- * | Number        | Int / Float          |
- * | Mixed         | Enum Value           |
- * | null          | NullValue            |
- *
- */
-export function astFromValue(value: mixed, type: GraphQLInputType): ?ValueNode {
-  if (isNonNullType(type)) {
-    const astValue = astFromValue(value, type.ofType);
-    if (astValue?.kind === Kind.NULL) {
-      return null;
-    }
-    return astValue;
-  }
-
-  // only explicit null, not undefined, NaN
-  if (value === null) {
-    return { kind: Kind.NULL };
-  }
-
-  // undefined
-  if (value === undefined) {
-    return null;
-  }
-
-  // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but
-  // the value is not an array, convert the value using the list's item type.
-  if (isListType(type)) {
-    const itemType = type.ofType;
-    if (isCollection(value)) {
-      const valuesNodes = [];
-      // Since we transpile for-of in loose mode it doesn't support iterators
-      // and it's required to first convert iteratable into array
-      for (const item of arrayFrom(value)) {
-        const itemNode = astFromValue(item, itemType);
-        if (itemNode != null) {
-          valuesNodes.push(itemNode);
-        }
-      }
-      return { kind: Kind.LIST, values: valuesNodes };
-    }
-    return astFromValue(value, itemType);
-  }
-
-  // Populate the fields of the input object by creating ASTs from each value
-  // in the JavaScript object according to the fields in the input type.
-  if (isInputObjectType(type)) {
-    if (!isObjectLike(value)) {
-      return null;
-    }
-    const fieldNodes = [];
-    for (const field of objectValues(type.getFields())) {
-      const fieldValue = astFromValue(value[field.name], field.type);
-      if (fieldValue) {
-        fieldNodes.push({
-          kind: Kind.OBJECT_FIELD,
-          name: { kind: Kind.NAME, value: field.name },
-          value: fieldValue,
-        });
-      }
-    }
-    return { kind: Kind.OBJECT, fields: fieldNodes };
-  }
-
-  if (isLeafType(type)) {
-    // Since value is an internally represented value, it must be serialized
-    // to an externally represented value before converting into an AST.
-    const serialized = type.serialize(value);
-    if (serialized == null) {
-      return null;
-    }
-
-    // Others serialize based on their corresponding JavaScript scalar types.
-    if (typeof serialized === 'boolean') {
-      return { kind: Kind.BOOLEAN, value: serialized };
-    }
-
-    // JavaScript numbers can be Int or Float values.
-    if (typeof serialized === 'number' && isFinite(serialized)) {
-      const stringNum = String(serialized);
-      return integerStringRegExp.test(stringNum)
-        ? { kind: Kind.INT, value: stringNum }
-        : { kind: Kind.FLOAT, value: stringNum };
-    }
-
-    if (typeof serialized === 'string') {
-      // Enum types use Enum literals.
-      if (isEnumType(type)) {
-        return { kind: Kind.ENUM, value: serialized };
-      }
-
-      // ID types can use Int literals.
-      if (type === GraphQLID && integerStringRegExp.test(serialized)) {
-        return { kind: Kind.INT, value: serialized };
-      }
-
-      return {
-        kind: Kind.STRING,
-        value: serialized,
-      };
-    }
-
-    throw new TypeError(`Cannot convert value to AST: ${inspect(serialized)}.`);
-  }
-
-  // Not reachable. All possible input types have been considered.
-  invariant(false, 'Unexpected input type: ' + inspect((type: empty)));
-}
-
-/**
- * IntValue:
- *   - NegativeSign? 0
- *   - NegativeSign? NonZeroDigit ( Digit+ )?
- */
-const integerStringRegExp = /^-?(?:0|[1-9][0-9]*)$/;
diff --git a/node_modules/graphql/utilities/astFromValue.mjs b/node_modules/graphql/utilities/astFromValue.mjs
deleted file mode 100644
index e7d310c..0000000
--- a/node_modules/graphql/utilities/astFromValue.mjs
+++ /dev/null
@@ -1,180 +0,0 @@
-import isFinite from "../polyfills/isFinite.mjs";
-import arrayFrom from "../polyfills/arrayFrom.mjs";
-import objectValues from "../polyfills/objectValues.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import invariant from "../jsutils/invariant.mjs";
-import isObjectLike from "../jsutils/isObjectLike.mjs";
-import isCollection from "../jsutils/isCollection.mjs";
-import { Kind } from "../language/kinds.mjs";
-import { GraphQLID } from "../type/scalars.mjs";
-import { isLeafType, isEnumType, isInputObjectType, isListType, isNonNullType } from "../type/definition.mjs";
-/**
- * Produces a GraphQL Value AST given a JavaScript object.
- * Function will match JavaScript/JSON values to GraphQL AST schema format
- * by using suggested GraphQLInputType. For example:
- *
- *     astFromValue("value", GraphQLString)
- *
- * A GraphQL type must be provided, which will be used to interpret different
- * JavaScript values.
- *
- * | JSON Value    | GraphQL Value        |
- * | ------------- | -------------------- |
- * | Object        | Input Object         |
- * | Array         | List                 |
- * | Boolean       | Boolean              |
- * | String        | String / Enum Value  |
- * | Number        | Int / Float          |
- * | Mixed         | Enum Value           |
- * | null          | NullValue            |
- *
- */
-
-export function astFromValue(value, type) {
-  if (isNonNullType(type)) {
-    var astValue = astFromValue(value, type.ofType);
-
-    if ((astValue === null || astValue === void 0 ? void 0 : astValue.kind) === Kind.NULL) {
-      return null;
-    }
-
-    return astValue;
-  } // only explicit null, not undefined, NaN
-
-
-  if (value === null) {
-    return {
-      kind: Kind.NULL
-    };
-  } // undefined
-
-
-  if (value === undefined) {
-    return null;
-  } // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but
-  // the value is not an array, convert the value using the list's item type.
-
-
-  if (isListType(type)) {
-    var itemType = type.ofType;
-
-    if (isCollection(value)) {
-      var valuesNodes = []; // Since we transpile for-of in loose mode it doesn't support iterators
-      // and it's required to first convert iteratable into array
-
-      for (var _i2 = 0, _arrayFrom2 = arrayFrom(value); _i2 < _arrayFrom2.length; _i2++) {
-        var item = _arrayFrom2[_i2];
-        var itemNode = astFromValue(item, itemType);
-
-        if (itemNode != null) {
-          valuesNodes.push(itemNode);
-        }
-      }
-
-      return {
-        kind: Kind.LIST,
-        values: valuesNodes
-      };
-    }
-
-    return astFromValue(value, itemType);
-  } // Populate the fields of the input object by creating ASTs from each value
-  // in the JavaScript object according to the fields in the input type.
-
-
-  if (isInputObjectType(type)) {
-    if (!isObjectLike(value)) {
-      return null;
-    }
-
-    var fieldNodes = [];
-
-    for (var _i4 = 0, _objectValues2 = objectValues(type.getFields()); _i4 < _objectValues2.length; _i4++) {
-      var field = _objectValues2[_i4];
-      var fieldValue = astFromValue(value[field.name], field.type);
-
-      if (fieldValue) {
-        fieldNodes.push({
-          kind: Kind.OBJECT_FIELD,
-          name: {
-            kind: Kind.NAME,
-            value: field.name
-          },
-          value: fieldValue
-        });
-      }
-    }
-
-    return {
-      kind: Kind.OBJECT,
-      fields: fieldNodes
-    };
-  }
-
-  /* istanbul ignore else */
-  if (isLeafType(type)) {
-    // Since value is an internally represented value, it must be serialized
-    // to an externally represented value before converting into an AST.
-    var serialized = type.serialize(value);
-
-    if (serialized == null) {
-      return null;
-    } // Others serialize based on their corresponding JavaScript scalar types.
-
-
-    if (typeof serialized === 'boolean') {
-      return {
-        kind: Kind.BOOLEAN,
-        value: serialized
-      };
-    } // JavaScript numbers can be Int or Float values.
-
-
-    if (typeof serialized === 'number' && isFinite(serialized)) {
-      var stringNum = String(serialized);
-      return integerStringRegExp.test(stringNum) ? {
-        kind: Kind.INT,
-        value: stringNum
-      } : {
-        kind: Kind.FLOAT,
-        value: stringNum
-      };
-    }
-
-    if (typeof serialized === 'string') {
-      // Enum types use Enum literals.
-      if (isEnumType(type)) {
-        return {
-          kind: Kind.ENUM,
-          value: serialized
-        };
-      } // ID types can use Int literals.
-
-
-      if (type === GraphQLID && integerStringRegExp.test(serialized)) {
-        return {
-          kind: Kind.INT,
-          value: serialized
-        };
-      }
-
-      return {
-        kind: Kind.STRING,
-        value: serialized
-      };
-    }
-
-    throw new TypeError("Cannot convert value to AST: ".concat(inspect(serialized), "."));
-  } // Not reachable. All possible input types have been considered.
-
-
-  /* istanbul ignore next */
-  invariant(false, 'Unexpected input type: ' + inspect(type));
-}
-/**
- * IntValue:
- *   - NegativeSign? 0
- *   - NegativeSign? NonZeroDigit ( Digit+ )?
- */
-
-var integerStringRegExp = /^-?(?:0|[1-9][0-9]*)$/;
diff --git a/node_modules/graphql/utilities/buildASTSchema.d.ts b/node_modules/graphql/utilities/buildASTSchema.d.ts
deleted file mode 100644
index adb7565..0000000
--- a/node_modules/graphql/utilities/buildASTSchema.d.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { DocumentNode } from '../language/ast';
-import { Source } from '../language/source';
-import { GraphQLSchema, GraphQLSchemaValidationOptions } from '../type/schema';
-import { ParseOptions } from '../language/parser';
-
-interface BuildSchemaOptions extends GraphQLSchemaValidationOptions {
-  /**
-   * Descriptions are defined as preceding string literals, however an older
-   * experimental version of the SDL supported preceding comments as
-   * descriptions. Set to true to enable this deprecated behavior.
-   * This option is provided to ease adoption and will be removed in v16.
-   *
-   * Default: false
-   */
-  commentDescriptions?: boolean;
-
-  /**
-   * Set to true to assume the SDL is valid.
-   *
-   * Default: false
-   */
-  assumeValidSDL?: boolean;
-}
-
-/**
- * This takes the ast of a schema document produced by the parse function in
- * src/language/parser.js.
- *
- * If no schema definition is provided, then it will look for types named Query
- * and Mutation.
- *
- * Given that AST it constructs a GraphQLSchema. The resulting schema
- * has no resolve methods, so execution will use default resolvers.
- *
- * Accepts options as a second argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-export function buildASTSchema(
-  documentAST: DocumentNode,
-  options?: BuildSchemaOptions,
-): GraphQLSchema;
-
-/**
- * A helper function to build a GraphQLSchema directly from a source
- * document.
- */
-export function buildSchema(
-  source: string | Source,
-  options?: BuildSchemaOptions & ParseOptions,
-): GraphQLSchema;
diff --git a/node_modules/graphql/utilities/buildASTSchema.js b/node_modules/graphql/utilities/buildASTSchema.js
deleted file mode 100644
index 127f7ca..0000000
--- a/node_modules/graphql/utilities/buildASTSchema.js
+++ /dev/null
@@ -1,116 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.buildASTSchema = buildASTSchema;
-exports.buildSchema = buildSchema;
-
-var _devAssert = _interopRequireDefault(require("../jsutils/devAssert"));
-
-var _kinds = require("../language/kinds");
-
-var _parser = require("../language/parser");
-
-var _validate = require("../validation/validate");
-
-var _schema = require("../type/schema");
-
-var _directives = require("../type/directives");
-
-var _extendSchema = require("./extendSchema");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * This takes the ast of a schema document produced by the parse function in
- * src/language/parser.js.
- *
- * If no schema definition is provided, then it will look for types named Query
- * and Mutation.
- *
- * Given that AST it constructs a GraphQLSchema. The resulting schema
- * has no resolve methods, so execution will use default resolvers.
- *
- * Accepts options as a second argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-function buildASTSchema(documentAST, options) {
-  documentAST != null && documentAST.kind === _kinds.Kind.DOCUMENT || (0, _devAssert.default)(0, 'Must provide valid Document AST.');
-
-  if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) {
-    (0, _validate.assertValidSDL)(documentAST);
-  }
-
-  var config = (0, _extendSchema.extendSchemaImpl)(emptySchemaConfig, documentAST, options);
-
-  if (config.astNode == null) {
-    for (var _i2 = 0, _config$types2 = config.types; _i2 < _config$types2.length; _i2++) {
-      var type = _config$types2[_i2];
-
-      switch (type.name) {
-        // Note: While this could make early assertions to get the correctly
-        // typed values below, that would throw immediately while type system
-        // validation with validateSchema() will produce more actionable results.
-        case 'Query':
-          config.query = type;
-          break;
-
-        case 'Mutation':
-          config.mutation = type;
-          break;
-
-        case 'Subscription':
-          config.subscription = type;
-          break;
-      }
-    }
-  }
-
-  var directives = config.directives; // If specified directives were not explicitly declared, add them.
-
-  if (!directives.some(function (directive) {
-    return directive.name === 'skip';
-  })) {
-    directives.push(_directives.GraphQLSkipDirective);
-  }
-
-  if (!directives.some(function (directive) {
-    return directive.name === 'include';
-  })) {
-    directives.push(_directives.GraphQLIncludeDirective);
-  }
-
-  if (!directives.some(function (directive) {
-    return directive.name === 'deprecated';
-  })) {
-    directives.push(_directives.GraphQLDeprecatedDirective);
-  }
-
-  return new _schema.GraphQLSchema(config);
-}
-
-var emptySchemaConfig = new _schema.GraphQLSchema({
-  directives: []
-}).toConfig();
-/**
- * A helper function to build a GraphQLSchema directly from a source
- * document.
- */
-
-function buildSchema(source, options) {
-  var document = (0, _parser.parse)(source, {
-    noLocation: options === null || options === void 0 ? void 0 : options.noLocation,
-    allowLegacySDLEmptyFields: options === null || options === void 0 ? void 0 : options.allowLegacySDLEmptyFields,
-    allowLegacySDLImplementsInterfaces: options === null || options === void 0 ? void 0 : options.allowLegacySDLImplementsInterfaces,
-    experimentalFragmentVariables: options === null || options === void 0 ? void 0 : options.experimentalFragmentVariables
-  });
-  return buildASTSchema(document, {
-    commentDescriptions: options === null || options === void 0 ? void 0 : options.commentDescriptions,
-    assumeValidSDL: options === null || options === void 0 ? void 0 : options.assumeValidSDL,
-    assumeValid: options === null || options === void 0 ? void 0 : options.assumeValid
-  });
-}
diff --git a/node_modules/graphql/utilities/buildASTSchema.js.flow b/node_modules/graphql/utilities/buildASTSchema.js.flow
deleted file mode 100644
index f33fb7a..0000000
--- a/node_modules/graphql/utilities/buildASTSchema.js.flow
+++ /dev/null
@@ -1,135 +0,0 @@
-// @flow strict
-
-import devAssert from '../jsutils/devAssert';
-
-import { Kind } from '../language/kinds';
-import { type Source } from '../language/source';
-import { type DocumentNode } from '../language/ast';
-import { type ParseOptions, parse } from '../language/parser';
-
-import { assertValidSDL } from '../validation/validate';
-
-import {
-  type GraphQLSchemaValidationOptions,
-  GraphQLSchema,
-} from '../type/schema';
-import {
-  GraphQLSkipDirective,
-  GraphQLIncludeDirective,
-  GraphQLDeprecatedDirective,
-} from '../type/directives';
-
-import { extendSchemaImpl } from './extendSchema';
-
-export type BuildSchemaOptions = {|
-  ...GraphQLSchemaValidationOptions,
-
-  /**
-   * Descriptions are defined as preceding string literals, however an older
-   * experimental version of the SDL supported preceding comments as
-   * descriptions. Set to true to enable this deprecated behavior.
-   * This option is provided to ease adoption and will be removed in v16.
-   *
-   * Default: false
-   */
-  commentDescriptions?: boolean,
-
-  /**
-   * Set to true to assume the SDL is valid.
-   *
-   * Default: false
-   */
-  assumeValidSDL?: boolean,
-|};
-
-/**
- * This takes the ast of a schema document produced by the parse function in
- * src/language/parser.js.
- *
- * If no schema definition is provided, then it will look for types named Query
- * and Mutation.
- *
- * Given that AST it constructs a GraphQLSchema. The resulting schema
- * has no resolve methods, so execution will use default resolvers.
- *
- * Accepts options as a second argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-export function buildASTSchema(
-  documentAST: DocumentNode,
-  options?: BuildSchemaOptions,
-): GraphQLSchema {
-  devAssert(
-    documentAST != null && documentAST.kind === Kind.DOCUMENT,
-    'Must provide valid Document AST.',
-  );
-
-  if (options?.assumeValid !== true && options?.assumeValidSDL !== true) {
-    assertValidSDL(documentAST);
-  }
-
-  const config = extendSchemaImpl(emptySchemaConfig, documentAST, options);
-
-  if (config.astNode == null) {
-    for (const type of config.types) {
-      switch (type.name) {
-        // Note: While this could make early assertions to get the correctly
-        // typed values below, that would throw immediately while type system
-        // validation with validateSchema() will produce more actionable results.
-        case 'Query':
-          config.query = (type: any);
-          break;
-        case 'Mutation':
-          config.mutation = (type: any);
-          break;
-        case 'Subscription':
-          config.subscription = (type: any);
-          break;
-      }
-    }
-  }
-
-  const { directives } = config;
-  // If specified directives were not explicitly declared, add them.
-  if (!directives.some(directive => directive.name === 'skip')) {
-    directives.push(GraphQLSkipDirective);
-  }
-
-  if (!directives.some(directive => directive.name === 'include')) {
-    directives.push(GraphQLIncludeDirective);
-  }
-
-  if (!directives.some(directive => directive.name === 'deprecated')) {
-    directives.push(GraphQLDeprecatedDirective);
-  }
-
-  return new GraphQLSchema(config);
-}
-
-const emptySchemaConfig = new GraphQLSchema({ directives: [] }).toConfig();
-
-/**
- * A helper function to build a GraphQLSchema directly from a source
- * document.
- */
-export function buildSchema(
-  source: string | Source,
-  options?: {| ...BuildSchemaOptions, ...ParseOptions |},
-): GraphQLSchema {
-  const document = parse(source, {
-    noLocation: options?.noLocation,
-    allowLegacySDLEmptyFields: options?.allowLegacySDLEmptyFields,
-    allowLegacySDLImplementsInterfaces:
-      options?.allowLegacySDLImplementsInterfaces,
-    experimentalFragmentVariables: options?.experimentalFragmentVariables,
-  });
-
-  return buildASTSchema(document, {
-    commentDescriptions: options?.commentDescriptions,
-    assumeValidSDL: options?.assumeValidSDL,
-    assumeValid: options?.assumeValid,
-  });
-}
diff --git a/node_modules/graphql/utilities/buildASTSchema.mjs b/node_modules/graphql/utilities/buildASTSchema.mjs
deleted file mode 100644
index ef1be62..0000000
--- a/node_modules/graphql/utilities/buildASTSchema.mjs
+++ /dev/null
@@ -1,99 +0,0 @@
-import devAssert from "../jsutils/devAssert.mjs";
-import { Kind } from "../language/kinds.mjs";
-import { parse } from "../language/parser.mjs";
-import { assertValidSDL } from "../validation/validate.mjs";
-import { GraphQLSchema } from "../type/schema.mjs";
-import { GraphQLSkipDirective, GraphQLIncludeDirective, GraphQLDeprecatedDirective } from "../type/directives.mjs";
-import { extendSchemaImpl } from "./extendSchema.mjs";
-
-/**
- * This takes the ast of a schema document produced by the parse function in
- * src/language/parser.js.
- *
- * If no schema definition is provided, then it will look for types named Query
- * and Mutation.
- *
- * Given that AST it constructs a GraphQLSchema. The resulting schema
- * has no resolve methods, so execution will use default resolvers.
- *
- * Accepts options as a second argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-export function buildASTSchema(documentAST, options) {
-  documentAST != null && documentAST.kind === Kind.DOCUMENT || devAssert(0, 'Must provide valid Document AST.');
-
-  if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) {
-    assertValidSDL(documentAST);
-  }
-
-  var config = extendSchemaImpl(emptySchemaConfig, documentAST, options);
-
-  if (config.astNode == null) {
-    for (var _i2 = 0, _config$types2 = config.types; _i2 < _config$types2.length; _i2++) {
-      var type = _config$types2[_i2];
-
-      switch (type.name) {
-        // Note: While this could make early assertions to get the correctly
-        // typed values below, that would throw immediately while type system
-        // validation with validateSchema() will produce more actionable results.
-        case 'Query':
-          config.query = type;
-          break;
-
-        case 'Mutation':
-          config.mutation = type;
-          break;
-
-        case 'Subscription':
-          config.subscription = type;
-          break;
-      }
-    }
-  }
-
-  var directives = config.directives; // If specified directives were not explicitly declared, add them.
-
-  if (!directives.some(function (directive) {
-    return directive.name === 'skip';
-  })) {
-    directives.push(GraphQLSkipDirective);
-  }
-
-  if (!directives.some(function (directive) {
-    return directive.name === 'include';
-  })) {
-    directives.push(GraphQLIncludeDirective);
-  }
-
-  if (!directives.some(function (directive) {
-    return directive.name === 'deprecated';
-  })) {
-    directives.push(GraphQLDeprecatedDirective);
-  }
-
-  return new GraphQLSchema(config);
-}
-var emptySchemaConfig = new GraphQLSchema({
-  directives: []
-}).toConfig();
-/**
- * A helper function to build a GraphQLSchema directly from a source
- * document.
- */
-
-export function buildSchema(source, options) {
-  var document = parse(source, {
-    noLocation: options === null || options === void 0 ? void 0 : options.noLocation,
-    allowLegacySDLEmptyFields: options === null || options === void 0 ? void 0 : options.allowLegacySDLEmptyFields,
-    allowLegacySDLImplementsInterfaces: options === null || options === void 0 ? void 0 : options.allowLegacySDLImplementsInterfaces,
-    experimentalFragmentVariables: options === null || options === void 0 ? void 0 : options.experimentalFragmentVariables
-  });
-  return buildASTSchema(document, {
-    commentDescriptions: options === null || options === void 0 ? void 0 : options.commentDescriptions,
-    assumeValidSDL: options === null || options === void 0 ? void 0 : options.assumeValidSDL,
-    assumeValid: options === null || options === void 0 ? void 0 : options.assumeValid
-  });
-}
diff --git a/node_modules/graphql/utilities/buildClientSchema.d.ts b/node_modules/graphql/utilities/buildClientSchema.d.ts
deleted file mode 100644
index a541cd3..0000000
--- a/node_modules/graphql/utilities/buildClientSchema.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { GraphQLSchema, GraphQLSchemaValidationOptions } from '../type/schema';
-
-import { IntrospectionQuery } from './getIntrospectionQuery';
-
-/**
- * Build a GraphQLSchema for use by client tools.
- *
- * Given the result of a client running the introspection query, creates and
- * returns a GraphQLSchema instance which can be then used with all graphql-js
- * tools, but cannot be used to execute a query, as introspection does not
- * represent the "resolver", "parse" or "serialize" functions or any other
- * server-internal mechanisms.
- *
- * This function expects a complete introspection result. Don't forget to check
- * the "errors" field of a server response before calling this function.
- */
-export function buildClientSchema(
-  introspection: IntrospectionQuery,
-  options?: GraphQLSchemaValidationOptions,
-): GraphQLSchema;
diff --git a/node_modules/graphql/utilities/buildClientSchema.js b/node_modules/graphql/utilities/buildClientSchema.js
deleted file mode 100644
index 5ddc9d8..0000000
--- a/node_modules/graphql/utilities/buildClientSchema.js
+++ /dev/null
@@ -1,333 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.buildClientSchema = buildClientSchema;
-
-var _objectValues = _interopRequireDefault(require("../polyfills/objectValues"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _devAssert = _interopRequireDefault(require("../jsutils/devAssert"));
-
-var _keyValMap = _interopRequireDefault(require("../jsutils/keyValMap"));
-
-var _isObjectLike = _interopRequireDefault(require("../jsutils/isObjectLike"));
-
-var _parser = require("../language/parser");
-
-var _directives = require("../type/directives");
-
-var _scalars = require("../type/scalars");
-
-var _introspection = require("../type/introspection");
-
-var _schema = require("../type/schema");
-
-var _definition = require("../type/definition");
-
-var _valueFromAST = require("./valueFromAST");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Build a GraphQLSchema for use by client tools.
- *
- * Given the result of a client running the introspection query, creates and
- * returns a GraphQLSchema instance which can be then used with all graphql-js
- * tools, but cannot be used to execute a query, as introspection does not
- * represent the "resolver", "parse" or "serialize" functions or any other
- * server-internal mechanisms.
- *
- * This function expects a complete introspection result. Don't forget to check
- * the "errors" field of a server response before calling this function.
- */
-function buildClientSchema(introspection, options) {
-  (0, _isObjectLike.default)(introspection) && (0, _isObjectLike.default)(introspection.__schema) || (0, _devAssert.default)(0, "Invalid or incomplete introspection result. Ensure that you are passing \"data\" property of introspection response and no \"errors\" was returned alongside: ".concat((0, _inspect.default)(introspection), ".")); // Get the schema from the introspection result.
-
-  var schemaIntrospection = introspection.__schema; // Iterate through all types, getting the type definition for each.
-
-  var typeMap = (0, _keyValMap.default)(schemaIntrospection.types, function (typeIntrospection) {
-    return typeIntrospection.name;
-  }, function (typeIntrospection) {
-    return buildType(typeIntrospection);
-  }); // Include standard types only if they are used.
-
-  for (var _i2 = 0, _ref2 = [].concat(_scalars.specifiedScalarTypes, _introspection.introspectionTypes); _i2 < _ref2.length; _i2++) {
-    var stdType = _ref2[_i2];
-
-    if (typeMap[stdType.name]) {
-      typeMap[stdType.name] = stdType;
-    }
-  } // Get the root Query, Mutation, and Subscription types.
-
-
-  var queryType = schemaIntrospection.queryType ? getObjectType(schemaIntrospection.queryType) : null;
-  var mutationType = schemaIntrospection.mutationType ? getObjectType(schemaIntrospection.mutationType) : null;
-  var subscriptionType = schemaIntrospection.subscriptionType ? getObjectType(schemaIntrospection.subscriptionType) : null; // Get the directives supported by Introspection, assuming empty-set if
-  // directives were not queried for.
-
-  var directives = schemaIntrospection.directives ? schemaIntrospection.directives.map(buildDirective) : []; // Then produce and return a Schema with these types.
-
-  return new _schema.GraphQLSchema({
-    description: schemaIntrospection.description,
-    query: queryType,
-    mutation: mutationType,
-    subscription: subscriptionType,
-    types: (0, _objectValues.default)(typeMap),
-    directives: directives,
-    assumeValid: options === null || options === void 0 ? void 0 : options.assumeValid
-  }); // Given a type reference in introspection, return the GraphQLType instance.
-  // preferring cached instances before building new instances.
-
-  function getType(typeRef) {
-    if (typeRef.kind === _introspection.TypeKind.LIST) {
-      var itemRef = typeRef.ofType;
-
-      if (!itemRef) {
-        throw new Error('Decorated type deeper than introspection query.');
-      }
-
-      return (0, _definition.GraphQLList)(getType(itemRef));
-    }
-
-    if (typeRef.kind === _introspection.TypeKind.NON_NULL) {
-      var nullableRef = typeRef.ofType;
-
-      if (!nullableRef) {
-        throw new Error('Decorated type deeper than introspection query.');
-      }
-
-      var nullableType = getType(nullableRef);
-      return (0, _definition.GraphQLNonNull)((0, _definition.assertNullableType)(nullableType));
-    }
-
-    return getNamedType(typeRef);
-  }
-
-  function getNamedType(typeRef) {
-    var typeName = typeRef.name;
-
-    if (!typeName) {
-      throw new Error("Unknown type reference: ".concat((0, _inspect.default)(typeRef), "."));
-    }
-
-    var type = typeMap[typeName];
-
-    if (!type) {
-      throw new Error("Invalid or incomplete schema, unknown type: ".concat(typeName, ". Ensure that a full introspection query is used in order to build a client schema."));
-    }
-
-    return type;
-  }
-
-  function getObjectType(typeRef) {
-    return (0, _definition.assertObjectType)(getNamedType(typeRef));
-  }
-
-  function getInterfaceType(typeRef) {
-    return (0, _definition.assertInterfaceType)(getNamedType(typeRef));
-  } // Given a type's introspection result, construct the correct
-  // GraphQLType instance.
-
-
-  function buildType(type) {
-    if (type != null && type.name != null && type.kind != null) {
-      switch (type.kind) {
-        case _introspection.TypeKind.SCALAR:
-          return buildScalarDef(type);
-
-        case _introspection.TypeKind.OBJECT:
-          return buildObjectDef(type);
-
-        case _introspection.TypeKind.INTERFACE:
-          return buildInterfaceDef(type);
-
-        case _introspection.TypeKind.UNION:
-          return buildUnionDef(type);
-
-        case _introspection.TypeKind.ENUM:
-          return buildEnumDef(type);
-
-        case _introspection.TypeKind.INPUT_OBJECT:
-          return buildInputObjectDef(type);
-      }
-    }
-
-    var typeStr = (0, _inspect.default)(type);
-    throw new Error("Invalid or incomplete introspection result. Ensure that a full introspection query is used in order to build a client schema: ".concat(typeStr, "."));
-  }
-
-  function buildScalarDef(scalarIntrospection) {
-    return new _definition.GraphQLScalarType({
-      name: scalarIntrospection.name,
-      description: scalarIntrospection.description
-    });
-  }
-
-  function buildImplementationsList(implementingIntrospection) {
-    // TODO: Temporary workaround until GraphQL ecosystem will fully support
-    // 'interfaces' on interface types.
-    if (implementingIntrospection.interfaces === null && implementingIntrospection.kind === _introspection.TypeKind.INTERFACE) {
-      return [];
-    }
-
-    if (!implementingIntrospection.interfaces) {
-      var implementingIntrospectionStr = (0, _inspect.default)(implementingIntrospection);
-      throw new Error("Introspection result missing interfaces: ".concat(implementingIntrospectionStr, "."));
-    }
-
-    return implementingIntrospection.interfaces.map(getInterfaceType);
-  }
-
-  function buildObjectDef(objectIntrospection) {
-    return new _definition.GraphQLObjectType({
-      name: objectIntrospection.name,
-      description: objectIntrospection.description,
-      interfaces: function interfaces() {
-        return buildImplementationsList(objectIntrospection);
-      },
-      fields: function fields() {
-        return buildFieldDefMap(objectIntrospection);
-      }
-    });
-  }
-
-  function buildInterfaceDef(interfaceIntrospection) {
-    return new _definition.GraphQLInterfaceType({
-      name: interfaceIntrospection.name,
-      description: interfaceIntrospection.description,
-      interfaces: function interfaces() {
-        return buildImplementationsList(interfaceIntrospection);
-      },
-      fields: function fields() {
-        return buildFieldDefMap(interfaceIntrospection);
-      }
-    });
-  }
-
-  function buildUnionDef(unionIntrospection) {
-    if (!unionIntrospection.possibleTypes) {
-      var unionIntrospectionStr = (0, _inspect.default)(unionIntrospection);
-      throw new Error("Introspection result missing possibleTypes: ".concat(unionIntrospectionStr, "."));
-    }
-
-    return new _definition.GraphQLUnionType({
-      name: unionIntrospection.name,
-      description: unionIntrospection.description,
-      types: function types() {
-        return unionIntrospection.possibleTypes.map(getObjectType);
-      }
-    });
-  }
-
-  function buildEnumDef(enumIntrospection) {
-    if (!enumIntrospection.enumValues) {
-      var enumIntrospectionStr = (0, _inspect.default)(enumIntrospection);
-      throw new Error("Introspection result missing enumValues: ".concat(enumIntrospectionStr, "."));
-    }
-
-    return new _definition.GraphQLEnumType({
-      name: enumIntrospection.name,
-      description: enumIntrospection.description,
-      values: (0, _keyValMap.default)(enumIntrospection.enumValues, function (valueIntrospection) {
-        return valueIntrospection.name;
-      }, function (valueIntrospection) {
-        return {
-          description: valueIntrospection.description,
-          deprecationReason: valueIntrospection.deprecationReason
-        };
-      })
-    });
-  }
-
-  function buildInputObjectDef(inputObjectIntrospection) {
-    if (!inputObjectIntrospection.inputFields) {
-      var inputObjectIntrospectionStr = (0, _inspect.default)(inputObjectIntrospection);
-      throw new Error("Introspection result missing inputFields: ".concat(inputObjectIntrospectionStr, "."));
-    }
-
-    return new _definition.GraphQLInputObjectType({
-      name: inputObjectIntrospection.name,
-      description: inputObjectIntrospection.description,
-      fields: function fields() {
-        return buildInputValueDefMap(inputObjectIntrospection.inputFields);
-      }
-    });
-  }
-
-  function buildFieldDefMap(typeIntrospection) {
-    if (!typeIntrospection.fields) {
-      throw new Error("Introspection result missing fields: ".concat((0, _inspect.default)(typeIntrospection), "."));
-    }
-
-    return (0, _keyValMap.default)(typeIntrospection.fields, function (fieldIntrospection) {
-      return fieldIntrospection.name;
-    }, buildField);
-  }
-
-  function buildField(fieldIntrospection) {
-    var type = getType(fieldIntrospection.type);
-
-    if (!(0, _definition.isOutputType)(type)) {
-      var typeStr = (0, _inspect.default)(type);
-      throw new Error("Introspection must provide output type for fields, but received: ".concat(typeStr, "."));
-    }
-
-    if (!fieldIntrospection.args) {
-      var fieldIntrospectionStr = (0, _inspect.default)(fieldIntrospection);
-      throw new Error("Introspection result missing field args: ".concat(fieldIntrospectionStr, "."));
-    }
-
-    return {
-      description: fieldIntrospection.description,
-      deprecationReason: fieldIntrospection.deprecationReason,
-      type: type,
-      args: buildInputValueDefMap(fieldIntrospection.args)
-    };
-  }
-
-  function buildInputValueDefMap(inputValueIntrospections) {
-    return (0, _keyValMap.default)(inputValueIntrospections, function (inputValue) {
-      return inputValue.name;
-    }, buildInputValue);
-  }
-
-  function buildInputValue(inputValueIntrospection) {
-    var type = getType(inputValueIntrospection.type);
-
-    if (!(0, _definition.isInputType)(type)) {
-      var typeStr = (0, _inspect.default)(type);
-      throw new Error("Introspection must provide input type for arguments, but received: ".concat(typeStr, "."));
-    }
-
-    var defaultValue = inputValueIntrospection.defaultValue != null ? (0, _valueFromAST.valueFromAST)((0, _parser.parseValue)(inputValueIntrospection.defaultValue), type) : undefined;
-    return {
-      description: inputValueIntrospection.description,
-      type: type,
-      defaultValue: defaultValue
-    };
-  }
-
-  function buildDirective(directiveIntrospection) {
-    if (!directiveIntrospection.args) {
-      var directiveIntrospectionStr = (0, _inspect.default)(directiveIntrospection);
-      throw new Error("Introspection result missing directive args: ".concat(directiveIntrospectionStr, "."));
-    }
-
-    if (!directiveIntrospection.locations) {
-      var _directiveIntrospectionStr = (0, _inspect.default)(directiveIntrospection);
-
-      throw new Error("Introspection result missing directive locations: ".concat(_directiveIntrospectionStr, "."));
-    }
-
-    return new _directives.GraphQLDirective({
-      name: directiveIntrospection.name,
-      description: directiveIntrospection.description,
-      isRepeatable: directiveIntrospection.isRepeatable,
-      locations: directiveIntrospection.locations.slice(),
-      args: buildInputValueDefMap(directiveIntrospection.args)
-    });
-  }
-}
diff --git a/node_modules/graphql/utilities/buildClientSchema.js.flow b/node_modules/graphql/utilities/buildClientSchema.js.flow
deleted file mode 100644
index 788d602..0000000
--- a/node_modules/graphql/utilities/buildClientSchema.js.flow
+++ /dev/null
@@ -1,394 +0,0 @@
-// @flow strict
-
-import objectValues from '../polyfills/objectValues';
-
-import inspect from '../jsutils/inspect';
-import devAssert from '../jsutils/devAssert';
-import keyValMap from '../jsutils/keyValMap';
-import isObjectLike from '../jsutils/isObjectLike';
-
-import { parseValue } from '../language/parser';
-
-import { GraphQLDirective } from '../type/directives';
-import { specifiedScalarTypes } from '../type/scalars';
-import { introspectionTypes, TypeKind } from '../type/introspection';
-import {
-  type GraphQLSchemaValidationOptions,
-  GraphQLSchema,
-} from '../type/schema';
-import {
-  type GraphQLType,
-  type GraphQLNamedType,
-  isInputType,
-  isOutputType,
-  GraphQLScalarType,
-  GraphQLObjectType,
-  GraphQLInterfaceType,
-  GraphQLUnionType,
-  GraphQLEnumType,
-  GraphQLInputObjectType,
-  GraphQLList,
-  GraphQLNonNull,
-  assertNullableType,
-  assertObjectType,
-  assertInterfaceType,
-} from '../type/definition';
-
-import { valueFromAST } from './valueFromAST';
-import {
-  type IntrospectionQuery,
-  type IntrospectionType,
-  type IntrospectionScalarType,
-  type IntrospectionObjectType,
-  type IntrospectionInterfaceType,
-  type IntrospectionUnionType,
-  type IntrospectionEnumType,
-  type IntrospectionInputObjectType,
-  type IntrospectionTypeRef,
-  type IntrospectionNamedTypeRef,
-} from './getIntrospectionQuery';
-
-/**
- * Build a GraphQLSchema for use by client tools.
- *
- * Given the result of a client running the introspection query, creates and
- * returns a GraphQLSchema instance which can be then used with all graphql-js
- * tools, but cannot be used to execute a query, as introspection does not
- * represent the "resolver", "parse" or "serialize" functions or any other
- * server-internal mechanisms.
- *
- * This function expects a complete introspection result. Don't forget to check
- * the "errors" field of a server response before calling this function.
- */
-export function buildClientSchema(
-  introspection: IntrospectionQuery,
-  options?: GraphQLSchemaValidationOptions,
-): GraphQLSchema {
-  devAssert(
-    isObjectLike(introspection) && isObjectLike(introspection.__schema),
-    `Invalid or incomplete introspection result. Ensure that you are passing "data" property of introspection response and no "errors" was returned alongside: ${inspect(
-      introspection,
-    )}.`,
-  );
-
-  // Get the schema from the introspection result.
-  const schemaIntrospection = introspection.__schema;
-
-  // Iterate through all types, getting the type definition for each.
-  const typeMap = keyValMap(
-    schemaIntrospection.types,
-    typeIntrospection => typeIntrospection.name,
-    typeIntrospection => buildType(typeIntrospection),
-  );
-
-  // Include standard types only if they are used.
-  for (const stdType of [...specifiedScalarTypes, ...introspectionTypes]) {
-    if (typeMap[stdType.name]) {
-      typeMap[stdType.name] = stdType;
-    }
-  }
-
-  // Get the root Query, Mutation, and Subscription types.
-  const queryType = schemaIntrospection.queryType
-    ? getObjectType(schemaIntrospection.queryType)
-    : null;
-
-  const mutationType = schemaIntrospection.mutationType
-    ? getObjectType(schemaIntrospection.mutationType)
-    : null;
-
-  const subscriptionType = schemaIntrospection.subscriptionType
-    ? getObjectType(schemaIntrospection.subscriptionType)
-    : null;
-
-  // Get the directives supported by Introspection, assuming empty-set if
-  // directives were not queried for.
-  const directives = schemaIntrospection.directives
-    ? schemaIntrospection.directives.map(buildDirective)
-    : [];
-
-  // Then produce and return a Schema with these types.
-  return new GraphQLSchema({
-    description: schemaIntrospection.description,
-    query: queryType,
-    mutation: mutationType,
-    subscription: subscriptionType,
-    types: objectValues(typeMap),
-    directives,
-    assumeValid: options?.assumeValid,
-  });
-
-  // Given a type reference in introspection, return the GraphQLType instance.
-  // preferring cached instances before building new instances.
-  function getType(typeRef: IntrospectionTypeRef): GraphQLType {
-    if (typeRef.kind === TypeKind.LIST) {
-      const itemRef = typeRef.ofType;
-      if (!itemRef) {
-        throw new Error('Decorated type deeper than introspection query.');
-      }
-      return GraphQLList(getType(itemRef));
-    }
-    if (typeRef.kind === TypeKind.NON_NULL) {
-      const nullableRef = typeRef.ofType;
-      if (!nullableRef) {
-        throw new Error('Decorated type deeper than introspection query.');
-      }
-      const nullableType = getType(nullableRef);
-      return GraphQLNonNull(assertNullableType(nullableType));
-    }
-    return getNamedType(typeRef);
-  }
-
-  function getNamedType(
-    typeRef: IntrospectionNamedTypeRef<>,
-  ): GraphQLNamedType {
-    const typeName = typeRef.name;
-    if (!typeName) {
-      throw new Error(`Unknown type reference: ${inspect(typeRef)}.`);
-    }
-
-    const type = typeMap[typeName];
-    if (!type) {
-      throw new Error(
-        `Invalid or incomplete schema, unknown type: ${typeName}. Ensure that a full introspection query is used in order to build a client schema.`,
-      );
-    }
-
-    return type;
-  }
-
-  function getObjectType(
-    typeRef: IntrospectionNamedTypeRef<IntrospectionObjectType>,
-  ): GraphQLObjectType {
-    return assertObjectType(getNamedType(typeRef));
-  }
-
-  function getInterfaceType(
-    typeRef: IntrospectionNamedTypeRef<IntrospectionInterfaceType>,
-  ): GraphQLInterfaceType {
-    return assertInterfaceType(getNamedType(typeRef));
-  }
-
-  // Given a type's introspection result, construct the correct
-  // GraphQLType instance.
-  function buildType(type: IntrospectionType): GraphQLNamedType {
-    if (type != null && type.name != null && type.kind != null) {
-      switch (type.kind) {
-        case TypeKind.SCALAR:
-          return buildScalarDef(type);
-        case TypeKind.OBJECT:
-          return buildObjectDef(type);
-        case TypeKind.INTERFACE:
-          return buildInterfaceDef(type);
-        case TypeKind.UNION:
-          return buildUnionDef(type);
-        case TypeKind.ENUM:
-          return buildEnumDef(type);
-        case TypeKind.INPUT_OBJECT:
-          return buildInputObjectDef(type);
-      }
-    }
-    const typeStr = inspect(type);
-    throw new Error(
-      `Invalid or incomplete introspection result. Ensure that a full introspection query is used in order to build a client schema: ${typeStr}.`,
-    );
-  }
-
-  function buildScalarDef(
-    scalarIntrospection: IntrospectionScalarType,
-  ): GraphQLScalarType {
-    return new GraphQLScalarType({
-      name: scalarIntrospection.name,
-      description: scalarIntrospection.description,
-    });
-  }
-
-  function buildImplementationsList(
-    implementingIntrospection:
-      | IntrospectionObjectType
-      | IntrospectionInterfaceType,
-  ) {
-    // TODO: Temporary workaround until GraphQL ecosystem will fully support
-    // 'interfaces' on interface types.
-    if (
-      implementingIntrospection.interfaces === null &&
-      implementingIntrospection.kind === TypeKind.INTERFACE
-    ) {
-      return [];
-    }
-
-    if (!implementingIntrospection.interfaces) {
-      const implementingIntrospectionStr = inspect(implementingIntrospection);
-      throw new Error(
-        `Introspection result missing interfaces: ${implementingIntrospectionStr}.`,
-      );
-    }
-
-    return implementingIntrospection.interfaces.map(getInterfaceType);
-  }
-
-  function buildObjectDef(
-    objectIntrospection: IntrospectionObjectType,
-  ): GraphQLObjectType {
-    return new GraphQLObjectType({
-      name: objectIntrospection.name,
-      description: objectIntrospection.description,
-      interfaces: () => buildImplementationsList(objectIntrospection),
-      fields: () => buildFieldDefMap(objectIntrospection),
-    });
-  }
-
-  function buildInterfaceDef(
-    interfaceIntrospection: IntrospectionInterfaceType,
-  ): GraphQLInterfaceType {
-    return new GraphQLInterfaceType({
-      name: interfaceIntrospection.name,
-      description: interfaceIntrospection.description,
-      interfaces: () => buildImplementationsList(interfaceIntrospection),
-      fields: () => buildFieldDefMap(interfaceIntrospection),
-    });
-  }
-
-  function buildUnionDef(
-    unionIntrospection: IntrospectionUnionType,
-  ): GraphQLUnionType {
-    if (!unionIntrospection.possibleTypes) {
-      const unionIntrospectionStr = inspect(unionIntrospection);
-      throw new Error(
-        `Introspection result missing possibleTypes: ${unionIntrospectionStr}.`,
-      );
-    }
-    return new GraphQLUnionType({
-      name: unionIntrospection.name,
-      description: unionIntrospection.description,
-      types: () => unionIntrospection.possibleTypes.map(getObjectType),
-    });
-  }
-
-  function buildEnumDef(
-    enumIntrospection: IntrospectionEnumType,
-  ): GraphQLEnumType {
-    if (!enumIntrospection.enumValues) {
-      const enumIntrospectionStr = inspect(enumIntrospection);
-      throw new Error(
-        `Introspection result missing enumValues: ${enumIntrospectionStr}.`,
-      );
-    }
-    return new GraphQLEnumType({
-      name: enumIntrospection.name,
-      description: enumIntrospection.description,
-      values: keyValMap(
-        enumIntrospection.enumValues,
-        valueIntrospection => valueIntrospection.name,
-        valueIntrospection => ({
-          description: valueIntrospection.description,
-          deprecationReason: valueIntrospection.deprecationReason,
-        }),
-      ),
-    });
-  }
-
-  function buildInputObjectDef(
-    inputObjectIntrospection: IntrospectionInputObjectType,
-  ): GraphQLInputObjectType {
-    if (!inputObjectIntrospection.inputFields) {
-      const inputObjectIntrospectionStr = inspect(inputObjectIntrospection);
-      throw new Error(
-        `Introspection result missing inputFields: ${inputObjectIntrospectionStr}.`,
-      );
-    }
-    return new GraphQLInputObjectType({
-      name: inputObjectIntrospection.name,
-      description: inputObjectIntrospection.description,
-      fields: () => buildInputValueDefMap(inputObjectIntrospection.inputFields),
-    });
-  }
-
-  function buildFieldDefMap(typeIntrospection) {
-    if (!typeIntrospection.fields) {
-      throw new Error(
-        `Introspection result missing fields: ${inspect(typeIntrospection)}.`,
-      );
-    }
-
-    return keyValMap(
-      typeIntrospection.fields,
-      fieldIntrospection => fieldIntrospection.name,
-      buildField,
-    );
-  }
-
-  function buildField(fieldIntrospection) {
-    const type = getType(fieldIntrospection.type);
-    if (!isOutputType(type)) {
-      const typeStr = inspect(type);
-      throw new Error(
-        `Introspection must provide output type for fields, but received: ${typeStr}.`,
-      );
-    }
-
-    if (!fieldIntrospection.args) {
-      const fieldIntrospectionStr = inspect(fieldIntrospection);
-      throw new Error(
-        `Introspection result missing field args: ${fieldIntrospectionStr}.`,
-      );
-    }
-
-    return {
-      description: fieldIntrospection.description,
-      deprecationReason: fieldIntrospection.deprecationReason,
-      type,
-      args: buildInputValueDefMap(fieldIntrospection.args),
-    };
-  }
-
-  function buildInputValueDefMap(inputValueIntrospections) {
-    return keyValMap(
-      inputValueIntrospections,
-      inputValue => inputValue.name,
-      buildInputValue,
-    );
-  }
-
-  function buildInputValue(inputValueIntrospection) {
-    const type = getType(inputValueIntrospection.type);
-    if (!isInputType(type)) {
-      const typeStr = inspect(type);
-      throw new Error(
-        `Introspection must provide input type for arguments, but received: ${typeStr}.`,
-      );
-    }
-
-    const defaultValue =
-      inputValueIntrospection.defaultValue != null
-        ? valueFromAST(parseValue(inputValueIntrospection.defaultValue), type)
-        : undefined;
-    return {
-      description: inputValueIntrospection.description,
-      type,
-      defaultValue,
-    };
-  }
-
-  function buildDirective(directiveIntrospection) {
-    if (!directiveIntrospection.args) {
-      const directiveIntrospectionStr = inspect(directiveIntrospection);
-      throw new Error(
-        `Introspection result missing directive args: ${directiveIntrospectionStr}.`,
-      );
-    }
-    if (!directiveIntrospection.locations) {
-      const directiveIntrospectionStr = inspect(directiveIntrospection);
-      throw new Error(
-        `Introspection result missing directive locations: ${directiveIntrospectionStr}.`,
-      );
-    }
-    return new GraphQLDirective({
-      name: directiveIntrospection.name,
-      description: directiveIntrospection.description,
-      isRepeatable: directiveIntrospection.isRepeatable,
-      locations: directiveIntrospection.locations.slice(),
-      args: buildInputValueDefMap(directiveIntrospection.args),
-    });
-  }
-}
diff --git a/node_modules/graphql/utilities/buildClientSchema.mjs b/node_modules/graphql/utilities/buildClientSchema.mjs
deleted file mode 100644
index 01978bd..0000000
--- a/node_modules/graphql/utilities/buildClientSchema.mjs
+++ /dev/null
@@ -1,313 +0,0 @@
-import objectValues from "../polyfills/objectValues.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import devAssert from "../jsutils/devAssert.mjs";
-import keyValMap from "../jsutils/keyValMap.mjs";
-import isObjectLike from "../jsutils/isObjectLike.mjs";
-import { parseValue } from "../language/parser.mjs";
-import { GraphQLDirective } from "../type/directives.mjs";
-import { specifiedScalarTypes } from "../type/scalars.mjs";
-import { introspectionTypes, TypeKind } from "../type/introspection.mjs";
-import { GraphQLSchema } from "../type/schema.mjs";
-import { isInputType, isOutputType, GraphQLScalarType, GraphQLObjectType, GraphQLInterfaceType, GraphQLUnionType, GraphQLEnumType, GraphQLInputObjectType, GraphQLList, GraphQLNonNull, assertNullableType, assertObjectType, assertInterfaceType } from "../type/definition.mjs";
-import { valueFromAST } from "./valueFromAST.mjs";
-
-/**
- * Build a GraphQLSchema for use by client tools.
- *
- * Given the result of a client running the introspection query, creates and
- * returns a GraphQLSchema instance which can be then used with all graphql-js
- * tools, but cannot be used to execute a query, as introspection does not
- * represent the "resolver", "parse" or "serialize" functions or any other
- * server-internal mechanisms.
- *
- * This function expects a complete introspection result. Don't forget to check
- * the "errors" field of a server response before calling this function.
- */
-export function buildClientSchema(introspection, options) {
-  isObjectLike(introspection) && isObjectLike(introspection.__schema) || devAssert(0, "Invalid or incomplete introspection result. Ensure that you are passing \"data\" property of introspection response and no \"errors\" was returned alongside: ".concat(inspect(introspection), ".")); // Get the schema from the introspection result.
-
-  var schemaIntrospection = introspection.__schema; // Iterate through all types, getting the type definition for each.
-
-  var typeMap = keyValMap(schemaIntrospection.types, function (typeIntrospection) {
-    return typeIntrospection.name;
-  }, function (typeIntrospection) {
-    return buildType(typeIntrospection);
-  }); // Include standard types only if they are used.
-
-  for (var _i2 = 0, _ref2 = [].concat(specifiedScalarTypes, introspectionTypes); _i2 < _ref2.length; _i2++) {
-    var stdType = _ref2[_i2];
-
-    if (typeMap[stdType.name]) {
-      typeMap[stdType.name] = stdType;
-    }
-  } // Get the root Query, Mutation, and Subscription types.
-
-
-  var queryType = schemaIntrospection.queryType ? getObjectType(schemaIntrospection.queryType) : null;
-  var mutationType = schemaIntrospection.mutationType ? getObjectType(schemaIntrospection.mutationType) : null;
-  var subscriptionType = schemaIntrospection.subscriptionType ? getObjectType(schemaIntrospection.subscriptionType) : null; // Get the directives supported by Introspection, assuming empty-set if
-  // directives were not queried for.
-
-  var directives = schemaIntrospection.directives ? schemaIntrospection.directives.map(buildDirective) : []; // Then produce and return a Schema with these types.
-
-  return new GraphQLSchema({
-    description: schemaIntrospection.description,
-    query: queryType,
-    mutation: mutationType,
-    subscription: subscriptionType,
-    types: objectValues(typeMap),
-    directives: directives,
-    assumeValid: options === null || options === void 0 ? void 0 : options.assumeValid
-  }); // Given a type reference in introspection, return the GraphQLType instance.
-  // preferring cached instances before building new instances.
-
-  function getType(typeRef) {
-    if (typeRef.kind === TypeKind.LIST) {
-      var itemRef = typeRef.ofType;
-
-      if (!itemRef) {
-        throw new Error('Decorated type deeper than introspection query.');
-      }
-
-      return GraphQLList(getType(itemRef));
-    }
-
-    if (typeRef.kind === TypeKind.NON_NULL) {
-      var nullableRef = typeRef.ofType;
-
-      if (!nullableRef) {
-        throw new Error('Decorated type deeper than introspection query.');
-      }
-
-      var nullableType = getType(nullableRef);
-      return GraphQLNonNull(assertNullableType(nullableType));
-    }
-
-    return getNamedType(typeRef);
-  }
-
-  function getNamedType(typeRef) {
-    var typeName = typeRef.name;
-
-    if (!typeName) {
-      throw new Error("Unknown type reference: ".concat(inspect(typeRef), "."));
-    }
-
-    var type = typeMap[typeName];
-
-    if (!type) {
-      throw new Error("Invalid or incomplete schema, unknown type: ".concat(typeName, ". Ensure that a full introspection query is used in order to build a client schema."));
-    }
-
-    return type;
-  }
-
-  function getObjectType(typeRef) {
-    return assertObjectType(getNamedType(typeRef));
-  }
-
-  function getInterfaceType(typeRef) {
-    return assertInterfaceType(getNamedType(typeRef));
-  } // Given a type's introspection result, construct the correct
-  // GraphQLType instance.
-
-
-  function buildType(type) {
-    if (type != null && type.name != null && type.kind != null) {
-      switch (type.kind) {
-        case TypeKind.SCALAR:
-          return buildScalarDef(type);
-
-        case TypeKind.OBJECT:
-          return buildObjectDef(type);
-
-        case TypeKind.INTERFACE:
-          return buildInterfaceDef(type);
-
-        case TypeKind.UNION:
-          return buildUnionDef(type);
-
-        case TypeKind.ENUM:
-          return buildEnumDef(type);
-
-        case TypeKind.INPUT_OBJECT:
-          return buildInputObjectDef(type);
-      }
-    }
-
-    var typeStr = inspect(type);
-    throw new Error("Invalid or incomplete introspection result. Ensure that a full introspection query is used in order to build a client schema: ".concat(typeStr, "."));
-  }
-
-  function buildScalarDef(scalarIntrospection) {
-    return new GraphQLScalarType({
-      name: scalarIntrospection.name,
-      description: scalarIntrospection.description
-    });
-  }
-
-  function buildImplementationsList(implementingIntrospection) {
-    // TODO: Temporary workaround until GraphQL ecosystem will fully support
-    // 'interfaces' on interface types.
-    if (implementingIntrospection.interfaces === null && implementingIntrospection.kind === TypeKind.INTERFACE) {
-      return [];
-    }
-
-    if (!implementingIntrospection.interfaces) {
-      var implementingIntrospectionStr = inspect(implementingIntrospection);
-      throw new Error("Introspection result missing interfaces: ".concat(implementingIntrospectionStr, "."));
-    }
-
-    return implementingIntrospection.interfaces.map(getInterfaceType);
-  }
-
-  function buildObjectDef(objectIntrospection) {
-    return new GraphQLObjectType({
-      name: objectIntrospection.name,
-      description: objectIntrospection.description,
-      interfaces: function interfaces() {
-        return buildImplementationsList(objectIntrospection);
-      },
-      fields: function fields() {
-        return buildFieldDefMap(objectIntrospection);
-      }
-    });
-  }
-
-  function buildInterfaceDef(interfaceIntrospection) {
-    return new GraphQLInterfaceType({
-      name: interfaceIntrospection.name,
-      description: interfaceIntrospection.description,
-      interfaces: function interfaces() {
-        return buildImplementationsList(interfaceIntrospection);
-      },
-      fields: function fields() {
-        return buildFieldDefMap(interfaceIntrospection);
-      }
-    });
-  }
-
-  function buildUnionDef(unionIntrospection) {
-    if (!unionIntrospection.possibleTypes) {
-      var unionIntrospectionStr = inspect(unionIntrospection);
-      throw new Error("Introspection result missing possibleTypes: ".concat(unionIntrospectionStr, "."));
-    }
-
-    return new GraphQLUnionType({
-      name: unionIntrospection.name,
-      description: unionIntrospection.description,
-      types: function types() {
-        return unionIntrospection.possibleTypes.map(getObjectType);
-      }
-    });
-  }
-
-  function buildEnumDef(enumIntrospection) {
-    if (!enumIntrospection.enumValues) {
-      var enumIntrospectionStr = inspect(enumIntrospection);
-      throw new Error("Introspection result missing enumValues: ".concat(enumIntrospectionStr, "."));
-    }
-
-    return new GraphQLEnumType({
-      name: enumIntrospection.name,
-      description: enumIntrospection.description,
-      values: keyValMap(enumIntrospection.enumValues, function (valueIntrospection) {
-        return valueIntrospection.name;
-      }, function (valueIntrospection) {
-        return {
-          description: valueIntrospection.description,
-          deprecationReason: valueIntrospection.deprecationReason
-        };
-      })
-    });
-  }
-
-  function buildInputObjectDef(inputObjectIntrospection) {
-    if (!inputObjectIntrospection.inputFields) {
-      var inputObjectIntrospectionStr = inspect(inputObjectIntrospection);
-      throw new Error("Introspection result missing inputFields: ".concat(inputObjectIntrospectionStr, "."));
-    }
-
-    return new GraphQLInputObjectType({
-      name: inputObjectIntrospection.name,
-      description: inputObjectIntrospection.description,
-      fields: function fields() {
-        return buildInputValueDefMap(inputObjectIntrospection.inputFields);
-      }
-    });
-  }
-
-  function buildFieldDefMap(typeIntrospection) {
-    if (!typeIntrospection.fields) {
-      throw new Error("Introspection result missing fields: ".concat(inspect(typeIntrospection), "."));
-    }
-
-    return keyValMap(typeIntrospection.fields, function (fieldIntrospection) {
-      return fieldIntrospection.name;
-    }, buildField);
-  }
-
-  function buildField(fieldIntrospection) {
-    var type = getType(fieldIntrospection.type);
-
-    if (!isOutputType(type)) {
-      var typeStr = inspect(type);
-      throw new Error("Introspection must provide output type for fields, but received: ".concat(typeStr, "."));
-    }
-
-    if (!fieldIntrospection.args) {
-      var fieldIntrospectionStr = inspect(fieldIntrospection);
-      throw new Error("Introspection result missing field args: ".concat(fieldIntrospectionStr, "."));
-    }
-
-    return {
-      description: fieldIntrospection.description,
-      deprecationReason: fieldIntrospection.deprecationReason,
-      type: type,
-      args: buildInputValueDefMap(fieldIntrospection.args)
-    };
-  }
-
-  function buildInputValueDefMap(inputValueIntrospections) {
-    return keyValMap(inputValueIntrospections, function (inputValue) {
-      return inputValue.name;
-    }, buildInputValue);
-  }
-
-  function buildInputValue(inputValueIntrospection) {
-    var type = getType(inputValueIntrospection.type);
-
-    if (!isInputType(type)) {
-      var typeStr = inspect(type);
-      throw new Error("Introspection must provide input type for arguments, but received: ".concat(typeStr, "."));
-    }
-
-    var defaultValue = inputValueIntrospection.defaultValue != null ? valueFromAST(parseValue(inputValueIntrospection.defaultValue), type) : undefined;
-    return {
-      description: inputValueIntrospection.description,
-      type: type,
-      defaultValue: defaultValue
-    };
-  }
-
-  function buildDirective(directiveIntrospection) {
-    if (!directiveIntrospection.args) {
-      var directiveIntrospectionStr = inspect(directiveIntrospection);
-      throw new Error("Introspection result missing directive args: ".concat(directiveIntrospectionStr, "."));
-    }
-
-    if (!directiveIntrospection.locations) {
-      var _directiveIntrospectionStr = inspect(directiveIntrospection);
-
-      throw new Error("Introspection result missing directive locations: ".concat(_directiveIntrospectionStr, "."));
-    }
-
-    return new GraphQLDirective({
-      name: directiveIntrospection.name,
-      description: directiveIntrospection.description,
-      isRepeatable: directiveIntrospection.isRepeatable,
-      locations: directiveIntrospection.locations.slice(),
-      args: buildInputValueDefMap(directiveIntrospection.args)
-    });
-  }
-}
diff --git a/node_modules/graphql/utilities/coerceInputValue.d.ts b/node_modules/graphql/utilities/coerceInputValue.d.ts
deleted file mode 100644
index 45c70a5..0000000
--- a/node_modules/graphql/utilities/coerceInputValue.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { GraphQLInputType } from '../type/definition';
-import { GraphQLError } from '../error/GraphQLError';
-
-type OnErrorCB = (
-  path: ReadonlyArray<string | number>,
-  invalidValue: any,
-  error: GraphQLError,
-) => void;
-
-/**
- * Coerces a JavaScript value given a GraphQL Input Type.
- */
-export function coerceInputValue(
-  inputValue: any,
-  type: GraphQLInputType,
-  onError?: OnErrorCB,
-): any;
diff --git a/node_modules/graphql/utilities/coerceInputValue.js b/node_modules/graphql/utilities/coerceInputValue.js
deleted file mode 100644
index e399dab..0000000
--- a/node_modules/graphql/utilities/coerceInputValue.js
+++ /dev/null
@@ -1,150 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.coerceInputValue = coerceInputValue;
-
-var _arrayFrom = _interopRequireDefault(require("../polyfills/arrayFrom"));
-
-var _objectValues3 = _interopRequireDefault(require("../polyfills/objectValues"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _invariant = _interopRequireDefault(require("../jsutils/invariant"));
-
-var _didYouMean = _interopRequireDefault(require("../jsutils/didYouMean"));
-
-var _isObjectLike = _interopRequireDefault(require("../jsutils/isObjectLike"));
-
-var _isCollection = _interopRequireDefault(require("../jsutils/isCollection"));
-
-var _suggestionList = _interopRequireDefault(require("../jsutils/suggestionList"));
-
-var _printPathArray = _interopRequireDefault(require("../jsutils/printPathArray"));
-
-var _Path = require("../jsutils/Path");
-
-var _GraphQLError = require("../error/GraphQLError");
-
-var _definition = require("../type/definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Coerces a JavaScript value given a GraphQL Input Type.
- */
-function coerceInputValue(inputValue, type) {
-  var onError = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultOnError;
-  return coerceInputValueImpl(inputValue, type, onError);
-}
-
-function defaultOnError(path, invalidValue, error) {
-  var errorPrefix = 'Invalid value ' + (0, _inspect.default)(invalidValue);
-
-  if (path.length > 0) {
-    errorPrefix += " at \"value".concat((0, _printPathArray.default)(path), "\"");
-  }
-
-  error.message = errorPrefix + ': ' + error.message;
-  throw error;
-}
-
-function coerceInputValueImpl(inputValue, type, onError, path) {
-  if ((0, _definition.isNonNullType)(type)) {
-    if (inputValue != null) {
-      return coerceInputValueImpl(inputValue, type.ofType, onError, path);
-    }
-
-    onError((0, _Path.pathToArray)(path), inputValue, new _GraphQLError.GraphQLError("Expected non-nullable type \"".concat((0, _inspect.default)(type), "\" not to be null.")));
-    return;
-  }
-
-  if (inputValue == null) {
-    // Explicitly return the value null.
-    return null;
-  }
-
-  if ((0, _definition.isListType)(type)) {
-    var itemType = type.ofType;
-
-    if ((0, _isCollection.default)(inputValue)) {
-      return (0, _arrayFrom.default)(inputValue, function (itemValue, index) {
-        var itemPath = (0, _Path.addPath)(path, index);
-        return coerceInputValueImpl(itemValue, itemType, onError, itemPath);
-      });
-    } // Lists accept a non-list value as a list of one.
-
-
-    return [coerceInputValueImpl(inputValue, itemType, onError, path)];
-  }
-
-  if ((0, _definition.isInputObjectType)(type)) {
-    if (!(0, _isObjectLike.default)(inputValue)) {
-      onError((0, _Path.pathToArray)(path), inputValue, new _GraphQLError.GraphQLError("Expected type \"".concat(type.name, "\" to be an object.")));
-      return;
-    }
-
-    var coercedValue = {};
-    var fieldDefs = type.getFields();
-
-    for (var _i2 = 0, _objectValues2 = (0, _objectValues3.default)(fieldDefs); _i2 < _objectValues2.length; _i2++) {
-      var field = _objectValues2[_i2];
-      var fieldValue = inputValue[field.name];
-
-      if (fieldValue === undefined) {
-        if (field.defaultValue !== undefined) {
-          coercedValue[field.name] = field.defaultValue;
-        } else if ((0, _definition.isNonNullType)(field.type)) {
-          var typeStr = (0, _inspect.default)(field.type);
-          onError((0, _Path.pathToArray)(path), inputValue, new _GraphQLError.GraphQLError("Field \"".concat(field.name, "\" of required type \"").concat(typeStr, "\" was not provided.")));
-        }
-
-        continue;
-      }
-
-      coercedValue[field.name] = coerceInputValueImpl(fieldValue, field.type, onError, (0, _Path.addPath)(path, field.name));
-    } // Ensure every provided field is defined.
-
-
-    for (var _i4 = 0, _Object$keys2 = Object.keys(inputValue); _i4 < _Object$keys2.length; _i4++) {
-      var fieldName = _Object$keys2[_i4];
-
-      if (!fieldDefs[fieldName]) {
-        var suggestions = (0, _suggestionList.default)(fieldName, Object.keys(type.getFields()));
-        onError((0, _Path.pathToArray)(path), inputValue, new _GraphQLError.GraphQLError("Field \"".concat(fieldName, "\" is not defined by type \"").concat(type.name, "\".") + (0, _didYouMean.default)(suggestions)));
-      }
-    }
-
-    return coercedValue;
-  }
-
-  /* istanbul ignore else */
-  if ((0, _definition.isLeafType)(type)) {
-    var parseResult; // Scalars and Enums determine if a input value is valid via parseValue(),
-    // which can throw to indicate failure. If it throws, maintain a reference
-    // to the original error.
-
-    try {
-      parseResult = type.parseValue(inputValue);
-    } catch (error) {
-      if (error instanceof _GraphQLError.GraphQLError) {
-        onError((0, _Path.pathToArray)(path), inputValue, error);
-      } else {
-        onError((0, _Path.pathToArray)(path), inputValue, new _GraphQLError.GraphQLError("Expected type \"".concat(type.name, "\". ") + error.message, undefined, undefined, undefined, undefined, error));
-      }
-
-      return;
-    }
-
-    if (parseResult === undefined) {
-      onError((0, _Path.pathToArray)(path), inputValue, new _GraphQLError.GraphQLError("Expected type \"".concat(type.name, "\".")));
-    }
-
-    return parseResult;
-  } // Not reachable. All possible input types have been considered.
-
-
-  /* istanbul ignore next */
-  (0, _invariant.default)(false, 'Unexpected input type: ' + (0, _inspect.default)(type));
-}
diff --git a/node_modules/graphql/utilities/coerceInputValue.js.flow b/node_modules/graphql/utilities/coerceInputValue.js.flow
deleted file mode 100644
index b116d51..0000000
--- a/node_modules/graphql/utilities/coerceInputValue.js.flow
+++ /dev/null
@@ -1,190 +0,0 @@
-// @flow strict
-
-import arrayFrom from '../polyfills/arrayFrom';
-import objectValues from '../polyfills/objectValues';
-
-import inspect from '../jsutils/inspect';
-import invariant from '../jsutils/invariant';
-import didYouMean from '../jsutils/didYouMean';
-import isObjectLike from '../jsutils/isObjectLike';
-import isCollection from '../jsutils/isCollection';
-import suggestionList from '../jsutils/suggestionList';
-import printPathArray from '../jsutils/printPathArray';
-import { type Path, addPath, pathToArray } from '../jsutils/Path';
-
-import { GraphQLError } from '../error/GraphQLError';
-import {
-  type GraphQLInputType,
-  isLeafType,
-  isInputObjectType,
-  isListType,
-  isNonNullType,
-} from '../type/definition';
-
-type OnErrorCB = (
-  path: $ReadOnlyArray<string | number>,
-  invalidValue: mixed,
-  error: GraphQLError,
-) => void;
-
-/**
- * Coerces a JavaScript value given a GraphQL Input Type.
- */
-export function coerceInputValue(
-  inputValue: mixed,
-  type: GraphQLInputType,
-  onError?: OnErrorCB = defaultOnError,
-): mixed {
-  return coerceInputValueImpl(inputValue, type, onError);
-}
-
-function defaultOnError(
-  path: $ReadOnlyArray<string | number>,
-  invalidValue: mixed,
-  error: GraphQLError,
-) {
-  let errorPrefix = 'Invalid value ' + inspect(invalidValue);
-  if (path.length > 0) {
-    errorPrefix += ` at "value${printPathArray(path)}"`;
-  }
-  error.message = errorPrefix + ': ' + error.message;
-  throw error;
-}
-
-function coerceInputValueImpl(
-  inputValue: mixed,
-  type: GraphQLInputType,
-  onError: OnErrorCB,
-  path: Path | void,
-): mixed {
-  if (isNonNullType(type)) {
-    if (inputValue != null) {
-      return coerceInputValueImpl(inputValue, type.ofType, onError, path);
-    }
-    onError(
-      pathToArray(path),
-      inputValue,
-      new GraphQLError(
-        `Expected non-nullable type "${inspect(type)}" not to be null.`,
-      ),
-    );
-    return;
-  }
-
-  if (inputValue == null) {
-    // Explicitly return the value null.
-    return null;
-  }
-
-  if (isListType(type)) {
-    const itemType = type.ofType;
-    if (isCollection(inputValue)) {
-      return arrayFrom(inputValue, (itemValue, index) => {
-        const itemPath = addPath(path, index);
-        return coerceInputValueImpl(itemValue, itemType, onError, itemPath);
-      });
-    }
-    // Lists accept a non-list value as a list of one.
-    return [coerceInputValueImpl(inputValue, itemType, onError, path)];
-  }
-
-  if (isInputObjectType(type)) {
-    if (!isObjectLike(inputValue)) {
-      onError(
-        pathToArray(path),
-        inputValue,
-        new GraphQLError(`Expected type "${type.name}" to be an object.`),
-      );
-      return;
-    }
-
-    const coercedValue = {};
-    const fieldDefs = type.getFields();
-
-    for (const field of objectValues(fieldDefs)) {
-      const fieldValue = inputValue[field.name];
-
-      if (fieldValue === undefined) {
-        if (field.defaultValue !== undefined) {
-          coercedValue[field.name] = field.defaultValue;
-        } else if (isNonNullType(field.type)) {
-          const typeStr = inspect(field.type);
-          onError(
-            pathToArray(path),
-            inputValue,
-            new GraphQLError(
-              `Field "${field.name}" of required type "${typeStr}" was not provided.`,
-            ),
-          );
-        }
-        continue;
-      }
-
-      coercedValue[field.name] = coerceInputValueImpl(
-        fieldValue,
-        field.type,
-        onError,
-        addPath(path, field.name),
-      );
-    }
-
-    // Ensure every provided field is defined.
-    for (const fieldName of Object.keys(inputValue)) {
-      if (!fieldDefs[fieldName]) {
-        const suggestions = suggestionList(
-          fieldName,
-          Object.keys(type.getFields()),
-        );
-        onError(
-          pathToArray(path),
-          inputValue,
-          new GraphQLError(
-            `Field "${fieldName}" is not defined by type "${type.name}".` +
-              didYouMean(suggestions),
-          ),
-        );
-      }
-    }
-    return coercedValue;
-  }
-
-  if (isLeafType(type)) {
-    let parseResult;
-
-    // Scalars and Enums determine if a input value is valid via parseValue(),
-    // which can throw to indicate failure. If it throws, maintain a reference
-    // to the original error.
-    try {
-      parseResult = type.parseValue(inputValue);
-    } catch (error) {
-      if (error instanceof GraphQLError) {
-        onError(pathToArray(path), inputValue, error);
-      } else {
-        onError(
-          pathToArray(path),
-          inputValue,
-          new GraphQLError(
-            `Expected type "${type.name}". ` + error.message,
-            undefined,
-            undefined,
-            undefined,
-            undefined,
-            error,
-          ),
-        );
-      }
-      return;
-    }
-    if (parseResult === undefined) {
-      onError(
-        pathToArray(path),
-        inputValue,
-        new GraphQLError(`Expected type "${type.name}".`),
-      );
-    }
-    return parseResult;
-  }
-
-  // Not reachable. All possible input types have been considered.
-  invariant(false, 'Unexpected input type: ' + inspect((type: empty)));
-}
diff --git a/node_modules/graphql/utilities/coerceInputValue.mjs b/node_modules/graphql/utilities/coerceInputValue.mjs
deleted file mode 100644
index 7ca4cd7..0000000
--- a/node_modules/graphql/utilities/coerceInputValue.mjs
+++ /dev/null
@@ -1,130 +0,0 @@
-import arrayFrom from "../polyfills/arrayFrom.mjs";
-import objectValues from "../polyfills/objectValues.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import invariant from "../jsutils/invariant.mjs";
-import didYouMean from "../jsutils/didYouMean.mjs";
-import isObjectLike from "../jsutils/isObjectLike.mjs";
-import isCollection from "../jsutils/isCollection.mjs";
-import suggestionList from "../jsutils/suggestionList.mjs";
-import printPathArray from "../jsutils/printPathArray.mjs";
-import { addPath, pathToArray } from "../jsutils/Path.mjs";
-import { GraphQLError } from "../error/GraphQLError.mjs";
-import { isLeafType, isInputObjectType, isListType, isNonNullType } from "../type/definition.mjs";
-
-/**
- * Coerces a JavaScript value given a GraphQL Input Type.
- */
-export function coerceInputValue(inputValue, type) {
-  var onError = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultOnError;
-  return coerceInputValueImpl(inputValue, type, onError);
-}
-
-function defaultOnError(path, invalidValue, error) {
-  var errorPrefix = 'Invalid value ' + inspect(invalidValue);
-
-  if (path.length > 0) {
-    errorPrefix += " at \"value".concat(printPathArray(path), "\"");
-  }
-
-  error.message = errorPrefix + ': ' + error.message;
-  throw error;
-}
-
-function coerceInputValueImpl(inputValue, type, onError, path) {
-  if (isNonNullType(type)) {
-    if (inputValue != null) {
-      return coerceInputValueImpl(inputValue, type.ofType, onError, path);
-    }
-
-    onError(pathToArray(path), inputValue, new GraphQLError("Expected non-nullable type \"".concat(inspect(type), "\" not to be null.")));
-    return;
-  }
-
-  if (inputValue == null) {
-    // Explicitly return the value null.
-    return null;
-  }
-
-  if (isListType(type)) {
-    var itemType = type.ofType;
-
-    if (isCollection(inputValue)) {
-      return arrayFrom(inputValue, function (itemValue, index) {
-        var itemPath = addPath(path, index);
-        return coerceInputValueImpl(itemValue, itemType, onError, itemPath);
-      });
-    } // Lists accept a non-list value as a list of one.
-
-
-    return [coerceInputValueImpl(inputValue, itemType, onError, path)];
-  }
-
-  if (isInputObjectType(type)) {
-    if (!isObjectLike(inputValue)) {
-      onError(pathToArray(path), inputValue, new GraphQLError("Expected type \"".concat(type.name, "\" to be an object.")));
-      return;
-    }
-
-    var coercedValue = {};
-    var fieldDefs = type.getFields();
-
-    for (var _i2 = 0, _objectValues2 = objectValues(fieldDefs); _i2 < _objectValues2.length; _i2++) {
-      var field = _objectValues2[_i2];
-      var fieldValue = inputValue[field.name];
-
-      if (fieldValue === undefined) {
-        if (field.defaultValue !== undefined) {
-          coercedValue[field.name] = field.defaultValue;
-        } else if (isNonNullType(field.type)) {
-          var typeStr = inspect(field.type);
-          onError(pathToArray(path), inputValue, new GraphQLError("Field \"".concat(field.name, "\" of required type \"").concat(typeStr, "\" was not provided.")));
-        }
-
-        continue;
-      }
-
-      coercedValue[field.name] = coerceInputValueImpl(fieldValue, field.type, onError, addPath(path, field.name));
-    } // Ensure every provided field is defined.
-
-
-    for (var _i4 = 0, _Object$keys2 = Object.keys(inputValue); _i4 < _Object$keys2.length; _i4++) {
-      var fieldName = _Object$keys2[_i4];
-
-      if (!fieldDefs[fieldName]) {
-        var suggestions = suggestionList(fieldName, Object.keys(type.getFields()));
-        onError(pathToArray(path), inputValue, new GraphQLError("Field \"".concat(fieldName, "\" is not defined by type \"").concat(type.name, "\".") + didYouMean(suggestions)));
-      }
-    }
-
-    return coercedValue;
-  }
-
-  /* istanbul ignore else */
-  if (isLeafType(type)) {
-    var parseResult; // Scalars and Enums determine if a input value is valid via parseValue(),
-    // which can throw to indicate failure. If it throws, maintain a reference
-    // to the original error.
-
-    try {
-      parseResult = type.parseValue(inputValue);
-    } catch (error) {
-      if (error instanceof GraphQLError) {
-        onError(pathToArray(path), inputValue, error);
-      } else {
-        onError(pathToArray(path), inputValue, new GraphQLError("Expected type \"".concat(type.name, "\". ") + error.message, undefined, undefined, undefined, undefined, error));
-      }
-
-      return;
-    }
-
-    if (parseResult === undefined) {
-      onError(pathToArray(path), inputValue, new GraphQLError("Expected type \"".concat(type.name, "\".")));
-    }
-
-    return parseResult;
-  } // Not reachable. All possible input types have been considered.
-
-
-  /* istanbul ignore next */
-  invariant(false, 'Unexpected input type: ' + inspect(type));
-}
diff --git a/node_modules/graphql/utilities/concatAST.d.ts b/node_modules/graphql/utilities/concatAST.d.ts
deleted file mode 100644
index 03d441e..0000000
--- a/node_modules/graphql/utilities/concatAST.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { DocumentNode } from '../language/ast';
-
-/**
- * Provided a collection of ASTs, presumably each from different files,
- * concatenate the ASTs together into batched AST, useful for validating many
- * GraphQL source files which together represent one conceptual application.
- */
-export function concatAST(asts: ReadonlyArray<DocumentNode>): DocumentNode;
diff --git a/node_modules/graphql/utilities/concatAST.js b/node_modules/graphql/utilities/concatAST.js
deleted file mode 100644
index e657052..0000000
--- a/node_modules/graphql/utilities/concatAST.js
+++ /dev/null
@@ -1,24 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.concatAST = concatAST;
-
-var _flatMap = _interopRequireDefault(require("../polyfills/flatMap"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Provided a collection of ASTs, presumably each from different files,
- * concatenate the ASTs together into batched AST, useful for validating many
- * GraphQL source files which together represent one conceptual application.
- */
-function concatAST(asts) {
-  return {
-    kind: 'Document',
-    definitions: (0, _flatMap.default)(asts, function (ast) {
-      return ast.definitions;
-    })
-  };
-}
diff --git a/node_modules/graphql/utilities/concatAST.js.flow b/node_modules/graphql/utilities/concatAST.js.flow
deleted file mode 100644
index aedc27e..0000000
--- a/node_modules/graphql/utilities/concatAST.js.flow
+++ /dev/null
@@ -1,17 +0,0 @@
-// @flow strict
-
-import flatMap from '../polyfills/flatMap';
-
-import { type DocumentNode } from '../language/ast';
-
-/**
- * Provided a collection of ASTs, presumably each from different files,
- * concatenate the ASTs together into batched AST, useful for validating many
- * GraphQL source files which together represent one conceptual application.
- */
-export function concatAST(asts: $ReadOnlyArray<DocumentNode>): DocumentNode {
-  return {
-    kind: 'Document',
-    definitions: flatMap(asts, ast => ast.definitions),
-  };
-}
diff --git a/node_modules/graphql/utilities/concatAST.mjs b/node_modules/graphql/utilities/concatAST.mjs
deleted file mode 100644
index 3b38bb7..0000000
--- a/node_modules/graphql/utilities/concatAST.mjs
+++ /dev/null
@@ -1,15 +0,0 @@
-import flatMap from "../polyfills/flatMap.mjs";
-
-/**
- * Provided a collection of ASTs, presumably each from different files,
- * concatenate the ASTs together into batched AST, useful for validating many
- * GraphQL source files which together represent one conceptual application.
- */
-export function concatAST(asts) {
-  return {
-    kind: 'Document',
-    definitions: flatMap(asts, function (ast) {
-      return ast.definitions;
-    })
-  };
-}
diff --git a/node_modules/graphql/utilities/extendSchema.d.ts b/node_modules/graphql/utilities/extendSchema.d.ts
deleted file mode 100644
index a7fa97c..0000000
--- a/node_modules/graphql/utilities/extendSchema.d.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-import { Location, DocumentNode, StringValueNode } from '../language/ast';
-import {
-  GraphQLSchemaValidationOptions,
-  GraphQLSchema,
-  GraphQLSchemaNormalizedConfig,
-} from '../type/schema';
-
-interface Options extends GraphQLSchemaValidationOptions {
-  /**
-   * Descriptions are defined as preceding string literals, however an older
-   * experimental version of the SDL supported preceding comments as
-   * descriptions. Set to true to enable this deprecated behavior.
-   * This option is provided to ease adoption and will be removed in v16.
-   *
-   * Default: false
-   */
-  commentDescriptions?: boolean;
-
-  /**
-   * Set to true to assume the SDL is valid.
-   *
-   * Default: false
-   */
-  assumeValidSDL?: boolean;
-}
-
-/**
- * Produces a new schema given an existing schema and a document which may
- * contain GraphQL type extensions and definitions. The original schema will
- * remain unaltered.
- *
- * Because a schema represents a graph of references, a schema cannot be
- * extended without effectively making an entire copy. We do not know until it's
- * too late if subgraphs remain unchanged.
- *
- * This algorithm copies the provided schema, applying extensions while
- * producing the copy. The original schema remains unaltered.
- *
- * Accepts options as a third argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-export function extendSchema(
-  schema: GraphQLSchema,
-  documentAST: DocumentNode,
-  options?: Options,
-): GraphQLSchema;
-
-/**
- * @internal
- */
-export function extendSchemaImpl(
-  schemaConfig: GraphQLSchemaNormalizedConfig,
-  documentAST: DocumentNode,
-  options?: Options,
-): GraphQLSchemaNormalizedConfig;
-
-/**
- * Given an ast node, returns its string description.
- * @deprecated: provided to ease adoption and will be removed in v16.
- *
- * Accepts options as a second argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-export function getDescription(
-  node: { readonly description?: StringValueNode; readonly loc?: Location },
-  options?: Maybe<{ commentDescriptions?: boolean }>,
-): string | undefined;
diff --git a/node_modules/graphql/utilities/extendSchema.js b/node_modules/graphql/utilities/extendSchema.js
deleted file mode 100644
index 2322911..0000000
--- a/node_modules/graphql/utilities/extendSchema.js
+++ /dev/null
@@ -1,700 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.extendSchema = extendSchema;
-exports.extendSchemaImpl = extendSchemaImpl;
-exports.getDescription = getDescription;
-
-var _objectValues = _interopRequireDefault(require("../polyfills/objectValues"));
-
-var _keyMap = _interopRequireDefault(require("../jsutils/keyMap"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _mapValue = _interopRequireDefault(require("../jsutils/mapValue"));
-
-var _invariant = _interopRequireDefault(require("../jsutils/invariant"));
-
-var _devAssert = _interopRequireDefault(require("../jsutils/devAssert"));
-
-var _kinds = require("../language/kinds");
-
-var _tokenKind = require("../language/tokenKind");
-
-var _blockString = require("../language/blockString");
-
-var _predicates = require("../language/predicates");
-
-var _validate = require("../validation/validate");
-
-var _values = require("../execution/values");
-
-var _scalars = require("../type/scalars");
-
-var _introspection = require("../type/introspection");
-
-var _directives = require("../type/directives");
-
-var _schema = require("../type/schema");
-
-var _definition = require("../type/definition");
-
-var _valueFromAST = require("./valueFromAST");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-/**
- * Produces a new schema given an existing schema and a document which may
- * contain GraphQL type extensions and definitions. The original schema will
- * remain unaltered.
- *
- * Because a schema represents a graph of references, a schema cannot be
- * extended without effectively making an entire copy. We do not know until it's
- * too late if subgraphs remain unchanged.
- *
- * This algorithm copies the provided schema, applying extensions while
- * producing the copy. The original schema remains unaltered.
- *
- * Accepts options as a third argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-function extendSchema(schema, documentAST, options) {
-  (0, _schema.assertSchema)(schema);
-  documentAST != null && documentAST.kind === _kinds.Kind.DOCUMENT || (0, _devAssert.default)(0, 'Must provide valid Document AST.');
-
-  if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) {
-    (0, _validate.assertValidSDLExtension)(documentAST, schema);
-  }
-
-  var schemaConfig = schema.toConfig();
-  var extendedConfig = extendSchemaImpl(schemaConfig, documentAST, options);
-  return schemaConfig === extendedConfig ? schema : new _schema.GraphQLSchema(extendedConfig);
-}
-/**
- * @internal
- */
-
-
-function extendSchemaImpl(schemaConfig, documentAST, options) {
-  var _schemaDef, _schemaDef$descriptio, _schemaDef2, _ref;
-
-  // Collect the type definitions and extensions found in the document.
-  var typeDefs = [];
-  var typeExtensionsMap = Object.create(null); // New directives and types are separate because a directives and types can
-  // have the same name. For example, a type named "skip".
-
-  var directiveDefs = [];
-  var schemaDef; // Schema extensions are collected which may add additional operation types.
-
-  var schemaExtensions = [];
-
-  for (var _i2 = 0, _documentAST$definiti2 = documentAST.definitions; _i2 < _documentAST$definiti2.length; _i2++) {
-    var def = _documentAST$definiti2[_i2];
-
-    if (def.kind === _kinds.Kind.SCHEMA_DEFINITION) {
-      schemaDef = def;
-    } else if (def.kind === _kinds.Kind.SCHEMA_EXTENSION) {
-      schemaExtensions.push(def);
-    } else if ((0, _predicates.isTypeDefinitionNode)(def)) {
-      typeDefs.push(def);
-    } else if ((0, _predicates.isTypeExtensionNode)(def)) {
-      var extendedTypeName = def.name.value;
-      var existingTypeExtensions = typeExtensionsMap[extendedTypeName];
-      typeExtensionsMap[extendedTypeName] = existingTypeExtensions ? existingTypeExtensions.concat([def]) : [def];
-    } else if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) {
-      directiveDefs.push(def);
-    }
-  } // If this document contains no new types, extensions, or directives then
-  // return the same unmodified GraphQLSchema instance.
-
-
-  if (Object.keys(typeExtensionsMap).length === 0 && typeDefs.length === 0 && directiveDefs.length === 0 && schemaExtensions.length === 0 && schemaDef == null) {
-    return schemaConfig;
-  }
-
-  var typeMap = Object.create(null);
-
-  for (var _i4 = 0, _schemaConfig$types2 = schemaConfig.types; _i4 < _schemaConfig$types2.length; _i4++) {
-    var existingType = _schemaConfig$types2[_i4];
-    typeMap[existingType.name] = extendNamedType(existingType);
-  }
-
-  for (var _i6 = 0; _i6 < typeDefs.length; _i6++) {
-    var _stdTypeMap$name;
-
-    var typeNode = typeDefs[_i6];
-    var name = typeNode.name.value;
-    typeMap[name] = (_stdTypeMap$name = stdTypeMap[name]) !== null && _stdTypeMap$name !== void 0 ? _stdTypeMap$name : buildType(typeNode);
-  }
-
-  var operationTypes = _objectSpread({
-    // Get the extended root operation types.
-    query: schemaConfig.query && replaceNamedType(schemaConfig.query),
-    mutation: schemaConfig.mutation && replaceNamedType(schemaConfig.mutation),
-    subscription: schemaConfig.subscription && replaceNamedType(schemaConfig.subscription)
-  }, schemaDef && getOperationTypes([schemaDef]), {}, getOperationTypes(schemaExtensions)); // Then produce and return a Schema config with these types.
-
-
-  return _objectSpread({
-    description: (_schemaDef = schemaDef) === null || _schemaDef === void 0 ? void 0 : (_schemaDef$descriptio = _schemaDef.description) === null || _schemaDef$descriptio === void 0 ? void 0 : _schemaDef$descriptio.value
-  }, operationTypes, {
-    types: (0, _objectValues.default)(typeMap),
-    directives: [].concat(schemaConfig.directives.map(replaceDirective), directiveDefs.map(buildDirective)),
-    extensions: undefined,
-    astNode: (_schemaDef2 = schemaDef) !== null && _schemaDef2 !== void 0 ? _schemaDef2 : schemaConfig.astNode,
-    extensionASTNodes: schemaConfig.extensionASTNodes.concat(schemaExtensions),
-    assumeValid: (_ref = options === null || options === void 0 ? void 0 : options.assumeValid) !== null && _ref !== void 0 ? _ref : false
-  }); // Below are functions used for producing this schema that have closed over
-  // this scope and have access to the schema, cache, and newly defined types.
-
-  function replaceType(type) {
-    if ((0, _definition.isListType)(type)) {
-      return new _definition.GraphQLList(replaceType(type.ofType));
-    } else if ((0, _definition.isNonNullType)(type)) {
-      return new _definition.GraphQLNonNull(replaceType(type.ofType));
-    }
-
-    return replaceNamedType(type);
-  }
-
-  function replaceNamedType(type) {
-    // Note: While this could make early assertions to get the correctly
-    // typed values, that would throw immediately while type system
-    // validation with validateSchema() will produce more actionable results.
-    return typeMap[type.name];
-  }
-
-  function replaceDirective(directive) {
-    var config = directive.toConfig();
-    return new _directives.GraphQLDirective(_objectSpread({}, config, {
-      args: (0, _mapValue.default)(config.args, extendArg)
-    }));
-  }
-
-  function extendNamedType(type) {
-    if ((0, _introspection.isIntrospectionType)(type) || (0, _scalars.isSpecifiedScalarType)(type)) {
-      // Builtin types are not extended.
-      return type;
-    }
-
-    if ((0, _definition.isScalarType)(type)) {
-      return extendScalarType(type);
-    }
-
-    if ((0, _definition.isObjectType)(type)) {
-      return extendObjectType(type);
-    }
-
-    if ((0, _definition.isInterfaceType)(type)) {
-      return extendInterfaceType(type);
-    }
-
-    if ((0, _definition.isUnionType)(type)) {
-      return extendUnionType(type);
-    }
-
-    if ((0, _definition.isEnumType)(type)) {
-      return extendEnumType(type);
-    }
-
-    /* istanbul ignore else */
-    if ((0, _definition.isInputObjectType)(type)) {
-      return extendInputObjectType(type);
-    } // Not reachable. All possible types have been considered.
-
-
-    /* istanbul ignore next */
-    (0, _invariant.default)(false, 'Unexpected type: ' + (0, _inspect.default)(type));
-  }
-
-  function extendInputObjectType(type) {
-    var _typeExtensionsMap$co;
-
-    var config = type.toConfig();
-    var extensions = (_typeExtensionsMap$co = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co !== void 0 ? _typeExtensionsMap$co : [];
-    return new _definition.GraphQLInputObjectType(_objectSpread({}, config, {
-      fields: function fields() {
-        return _objectSpread({}, (0, _mapValue.default)(config.fields, function (field) {
-          return _objectSpread({}, field, {
-            type: replaceType(field.type)
-          });
-        }), {}, buildInputFieldMap(extensions));
-      },
-      extensionASTNodes: config.extensionASTNodes.concat(extensions)
-    }));
-  }
-
-  function extendEnumType(type) {
-    var _typeExtensionsMap$ty;
-
-    var config = type.toConfig();
-    var extensions = (_typeExtensionsMap$ty = typeExtensionsMap[type.name]) !== null && _typeExtensionsMap$ty !== void 0 ? _typeExtensionsMap$ty : [];
-    return new _definition.GraphQLEnumType(_objectSpread({}, config, {
-      values: _objectSpread({}, config.values, {}, buildEnumValueMap(extensions)),
-      extensionASTNodes: config.extensionASTNodes.concat(extensions)
-    }));
-  }
-
-  function extendScalarType(type) {
-    var _typeExtensionsMap$co2;
-
-    var config = type.toConfig();
-    var extensions = (_typeExtensionsMap$co2 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co2 !== void 0 ? _typeExtensionsMap$co2 : [];
-    return new _definition.GraphQLScalarType(_objectSpread({}, config, {
-      extensionASTNodes: config.extensionASTNodes.concat(extensions)
-    }));
-  }
-
-  function extendObjectType(type) {
-    var _typeExtensionsMap$co3;
-
-    var config = type.toConfig();
-    var extensions = (_typeExtensionsMap$co3 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co3 !== void 0 ? _typeExtensionsMap$co3 : [];
-    return new _definition.GraphQLObjectType(_objectSpread({}, config, {
-      interfaces: function interfaces() {
-        return [].concat(type.getInterfaces().map(replaceNamedType), buildInterfaces(extensions));
-      },
-      fields: function fields() {
-        return _objectSpread({}, (0, _mapValue.default)(config.fields, extendField), {}, buildFieldMap(extensions));
-      },
-      extensionASTNodes: config.extensionASTNodes.concat(extensions)
-    }));
-  }
-
-  function extendInterfaceType(type) {
-    var _typeExtensionsMap$co4;
-
-    var config = type.toConfig();
-    var extensions = (_typeExtensionsMap$co4 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co4 !== void 0 ? _typeExtensionsMap$co4 : [];
-    return new _definition.GraphQLInterfaceType(_objectSpread({}, config, {
-      interfaces: function interfaces() {
-        return [].concat(type.getInterfaces().map(replaceNamedType), buildInterfaces(extensions));
-      },
-      fields: function fields() {
-        return _objectSpread({}, (0, _mapValue.default)(config.fields, extendField), {}, buildFieldMap(extensions));
-      },
-      extensionASTNodes: config.extensionASTNodes.concat(extensions)
-    }));
-  }
-
-  function extendUnionType(type) {
-    var _typeExtensionsMap$co5;
-
-    var config = type.toConfig();
-    var extensions = (_typeExtensionsMap$co5 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co5 !== void 0 ? _typeExtensionsMap$co5 : [];
-    return new _definition.GraphQLUnionType(_objectSpread({}, config, {
-      types: function types() {
-        return [].concat(type.getTypes().map(replaceNamedType), buildUnionTypes(extensions));
-      },
-      extensionASTNodes: config.extensionASTNodes.concat(extensions)
-    }));
-  }
-
-  function extendField(field) {
-    return _objectSpread({}, field, {
-      type: replaceType(field.type),
-      args: (0, _mapValue.default)(field.args, extendArg)
-    });
-  }
-
-  function extendArg(arg) {
-    return _objectSpread({}, arg, {
-      type: replaceType(arg.type)
-    });
-  }
-
-  function getOperationTypes(nodes) {
-    var opTypes = {};
-
-    for (var _i8 = 0; _i8 < nodes.length; _i8++) {
-      var _node$operationTypes;
-
-      var node = nodes[_i8];
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var operationTypesNodes = (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : [];
-
-      for (var _i10 = 0; _i10 < operationTypesNodes.length; _i10++) {
-        var operationType = operationTypesNodes[_i10];
-        opTypes[operationType.operation] = getNamedType(operationType.type);
-      }
-    } // Note: While this could make early assertions to get the correctly
-    // typed values below, that would throw immediately while type system
-    // validation with validateSchema() will produce more actionable results.
-
-
-    return opTypes;
-  }
-
-  function getNamedType(node) {
-    var _stdTypeMap$name2;
-
-    var name = node.name.value;
-    var type = (_stdTypeMap$name2 = stdTypeMap[name]) !== null && _stdTypeMap$name2 !== void 0 ? _stdTypeMap$name2 : typeMap[name];
-
-    if (type === undefined) {
-      throw new Error("Unknown type: \"".concat(name, "\"."));
-    }
-
-    return type;
-  }
-
-  function getWrappedType(node) {
-    if (node.kind === _kinds.Kind.LIST_TYPE) {
-      return new _definition.GraphQLList(getWrappedType(node.type));
-    }
-
-    if (node.kind === _kinds.Kind.NON_NULL_TYPE) {
-      return new _definition.GraphQLNonNull(getWrappedType(node.type));
-    }
-
-    return getNamedType(node);
-  }
-
-  function buildDirective(node) {
-    var locations = node.locations.map(function (_ref2) {
-      var value = _ref2.value;
-      return value;
-    });
-    return new _directives.GraphQLDirective({
-      name: node.name.value,
-      description: getDescription(node, options),
-      locations: locations,
-      isRepeatable: node.repeatable,
-      args: buildArgumentMap(node.arguments),
-      astNode: node
-    });
-  }
-
-  function buildFieldMap(nodes) {
-    var fieldConfigMap = Object.create(null);
-
-    for (var _i12 = 0; _i12 < nodes.length; _i12++) {
-      var _node$fields;
-
-      var node = nodes[_i12];
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var nodeFields = (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : [];
-
-      for (var _i14 = 0; _i14 < nodeFields.length; _i14++) {
-        var field = nodeFields[_i14];
-        fieldConfigMap[field.name.value] = {
-          // Note: While this could make assertions to get the correctly typed
-          // value, that would throw immediately while type system validation
-          // with validateSchema() will produce more actionable results.
-          type: getWrappedType(field.type),
-          description: getDescription(field, options),
-          args: buildArgumentMap(field.arguments),
-          deprecationReason: getDeprecationReason(field),
-          astNode: field
-        };
-      }
-    }
-
-    return fieldConfigMap;
-  }
-
-  function buildArgumentMap(args) {
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-    var argsNodes = args !== null && args !== void 0 ? args : [];
-    var argConfigMap = Object.create(null);
-
-    for (var _i16 = 0; _i16 < argsNodes.length; _i16++) {
-      var arg = argsNodes[_i16];
-      // Note: While this could make assertions to get the correctly typed
-      // value, that would throw immediately while type system validation
-      // with validateSchema() will produce more actionable results.
-      var type = getWrappedType(arg.type);
-      argConfigMap[arg.name.value] = {
-        type: type,
-        description: getDescription(arg, options),
-        defaultValue: (0, _valueFromAST.valueFromAST)(arg.defaultValue, type),
-        astNode: arg
-      };
-    }
-
-    return argConfigMap;
-  }
-
-  function buildInputFieldMap(nodes) {
-    var inputFieldMap = Object.create(null);
-
-    for (var _i18 = 0; _i18 < nodes.length; _i18++) {
-      var _node$fields2;
-
-      var node = nodes[_i18];
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var fieldsNodes = (_node$fields2 = node.fields) !== null && _node$fields2 !== void 0 ? _node$fields2 : [];
-
-      for (var _i20 = 0; _i20 < fieldsNodes.length; _i20++) {
-        var field = fieldsNodes[_i20];
-        // Note: While this could make assertions to get the correctly typed
-        // value, that would throw immediately while type system validation
-        // with validateSchema() will produce more actionable results.
-        var type = getWrappedType(field.type);
-        inputFieldMap[field.name.value] = {
-          type: type,
-          description: getDescription(field, options),
-          defaultValue: (0, _valueFromAST.valueFromAST)(field.defaultValue, type),
-          astNode: field
-        };
-      }
-    }
-
-    return inputFieldMap;
-  }
-
-  function buildEnumValueMap(nodes) {
-    var enumValueMap = Object.create(null);
-
-    for (var _i22 = 0; _i22 < nodes.length; _i22++) {
-      var _node$values;
-
-      var node = nodes[_i22];
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var valuesNodes = (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : [];
-
-      for (var _i24 = 0; _i24 < valuesNodes.length; _i24++) {
-        var value = valuesNodes[_i24];
-        enumValueMap[value.name.value] = {
-          description: getDescription(value, options),
-          deprecationReason: getDeprecationReason(value),
-          astNode: value
-        };
-      }
-    }
-
-    return enumValueMap;
-  }
-
-  function buildInterfaces(nodes) {
-    var interfaces = [];
-
-    for (var _i26 = 0; _i26 < nodes.length; _i26++) {
-      var _node$interfaces;
-
-      var node = nodes[_i26];
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var interfacesNodes = (_node$interfaces = node.interfaces) !== null && _node$interfaces !== void 0 ? _node$interfaces : [];
-
-      for (var _i28 = 0; _i28 < interfacesNodes.length; _i28++) {
-        var type = interfacesNodes[_i28];
-        // Note: While this could make assertions to get the correctly typed
-        // values below, that would throw immediately while type system
-        // validation with validateSchema() will produce more actionable
-        // results.
-        interfaces.push(getNamedType(type));
-      }
-    }
-
-    return interfaces;
-  }
-
-  function buildUnionTypes(nodes) {
-    var types = [];
-
-    for (var _i30 = 0; _i30 < nodes.length; _i30++) {
-      var _node$types;
-
-      var node = nodes[_i30];
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var typeNodes = (_node$types = node.types) !== null && _node$types !== void 0 ? _node$types : [];
-
-      for (var _i32 = 0; _i32 < typeNodes.length; _i32++) {
-        var type = typeNodes[_i32];
-        // Note: While this could make assertions to get the correctly typed
-        // values below, that would throw immediately while type system
-        // validation with validateSchema() will produce more actionable
-        // results.
-        types.push(getNamedType(type));
-      }
-    }
-
-    return types;
-  }
-
-  function buildType(astNode) {
-    var _typeExtensionsMap$na;
-
-    var name = astNode.name.value;
-    var description = getDescription(astNode, options);
-    var extensionNodes = (_typeExtensionsMap$na = typeExtensionsMap[name]) !== null && _typeExtensionsMap$na !== void 0 ? _typeExtensionsMap$na : [];
-
-    switch (astNode.kind) {
-      case _kinds.Kind.OBJECT_TYPE_DEFINITION:
-        {
-          var extensionASTNodes = extensionNodes;
-          var allNodes = [astNode].concat(extensionASTNodes);
-          return new _definition.GraphQLObjectType({
-            name: name,
-            description: description,
-            interfaces: function interfaces() {
-              return buildInterfaces(allNodes);
-            },
-            fields: function fields() {
-              return buildFieldMap(allNodes);
-            },
-            astNode: astNode,
-            extensionASTNodes: extensionASTNodes
-          });
-        }
-
-      case _kinds.Kind.INTERFACE_TYPE_DEFINITION:
-        {
-          var _extensionASTNodes = extensionNodes;
-
-          var _allNodes = [astNode].concat(_extensionASTNodes);
-
-          return new _definition.GraphQLInterfaceType({
-            name: name,
-            description: description,
-            interfaces: function interfaces() {
-              return buildInterfaces(_allNodes);
-            },
-            fields: function fields() {
-              return buildFieldMap(_allNodes);
-            },
-            astNode: astNode,
-            extensionASTNodes: _extensionASTNodes
-          });
-        }
-
-      case _kinds.Kind.ENUM_TYPE_DEFINITION:
-        {
-          var _extensionASTNodes2 = extensionNodes;
-
-          var _allNodes2 = [astNode].concat(_extensionASTNodes2);
-
-          return new _definition.GraphQLEnumType({
-            name: name,
-            description: description,
-            values: buildEnumValueMap(_allNodes2),
-            astNode: astNode,
-            extensionASTNodes: _extensionASTNodes2
-          });
-        }
-
-      case _kinds.Kind.UNION_TYPE_DEFINITION:
-        {
-          var _extensionASTNodes3 = extensionNodes;
-
-          var _allNodes3 = [astNode].concat(_extensionASTNodes3);
-
-          return new _definition.GraphQLUnionType({
-            name: name,
-            description: description,
-            types: function types() {
-              return buildUnionTypes(_allNodes3);
-            },
-            astNode: astNode,
-            extensionASTNodes: _extensionASTNodes3
-          });
-        }
-
-      case _kinds.Kind.SCALAR_TYPE_DEFINITION:
-        {
-          var _extensionASTNodes4 = extensionNodes;
-          return new _definition.GraphQLScalarType({
-            name: name,
-            description: description,
-            astNode: astNode,
-            extensionASTNodes: _extensionASTNodes4
-          });
-        }
-
-      case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION:
-        {
-          var _extensionASTNodes5 = extensionNodes;
-
-          var _allNodes4 = [astNode].concat(_extensionASTNodes5);
-
-          return new _definition.GraphQLInputObjectType({
-            name: name,
-            description: description,
-            fields: function fields() {
-              return buildInputFieldMap(_allNodes4);
-            },
-            astNode: astNode,
-            extensionASTNodes: _extensionASTNodes5
-          });
-        }
-    } // Not reachable. All possible type definition nodes have been considered.
-
-
-    /* istanbul ignore next */
-    (0, _invariant.default)(false, 'Unexpected type definition node: ' + (0, _inspect.default)(astNode));
-  }
-}
-
-var stdTypeMap = (0, _keyMap.default)(_scalars.specifiedScalarTypes.concat(_introspection.introspectionTypes), function (type) {
-  return type.name;
-});
-/**
- * Given a field or enum value node, returns the string value for the
- * deprecation reason.
- */
-
-function getDeprecationReason(node) {
-  var deprecated = (0, _values.getDirectiveValues)(_directives.GraphQLDeprecatedDirective, node);
-  return deprecated === null || deprecated === void 0 ? void 0 : deprecated.reason;
-}
-/**
- * Given an ast node, returns its string description.
- * @deprecated: provided to ease adoption and will be removed in v16.
- *
- * Accepts options as a second argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-
-
-function getDescription(node, options) {
-  if (node.description) {
-    return node.description.value;
-  }
-
-  if ((options === null || options === void 0 ? void 0 : options.commentDescriptions) === true) {
-    var rawValue = getLeadingCommentBlock(node);
-
-    if (rawValue !== undefined) {
-      return (0, _blockString.dedentBlockStringValue)('\n' + rawValue);
-    }
-  }
-}
-
-function getLeadingCommentBlock(node) {
-  var loc = node.loc;
-
-  if (!loc) {
-    return;
-  }
-
-  var comments = [];
-  var token = loc.startToken.prev;
-
-  while (token != null && token.kind === _tokenKind.TokenKind.COMMENT && token.next && token.prev && token.line + 1 === token.next.line && token.line !== token.prev.line) {
-    var value = String(token.value);
-    comments.push(value);
-    token = token.prev;
-  }
-
-  return comments.length > 0 ? comments.reverse().join('\n') : undefined;
-}
diff --git a/node_modules/graphql/utilities/extendSchema.js.flow b/node_modules/graphql/utilities/extendSchema.js.flow
deleted file mode 100644
index 0246eca..0000000
--- a/node_modules/graphql/utilities/extendSchema.js.flow
+++ /dev/null
@@ -1,748 +0,0 @@
-// @flow strict
-
-import objectValues from '../polyfills/objectValues';
-
-import keyMap from '../jsutils/keyMap';
-import inspect from '../jsutils/inspect';
-import mapValue from '../jsutils/mapValue';
-import invariant from '../jsutils/invariant';
-import devAssert from '../jsutils/devAssert';
-
-import { Kind } from '../language/kinds';
-import { TokenKind } from '../language/tokenKind';
-import { dedentBlockStringValue } from '../language/blockString';
-import { type DirectiveLocationEnum } from '../language/directiveLocation';
-import {
-  isTypeDefinitionNode,
-  isTypeExtensionNode,
-} from '../language/predicates';
-import {
-  type Location,
-  type DocumentNode,
-  type StringValueNode,
-  type TypeNode,
-  type NamedTypeNode,
-  type SchemaDefinitionNode,
-  type SchemaExtensionNode,
-  type TypeDefinitionNode,
-  type InterfaceTypeDefinitionNode,
-  type InterfaceTypeExtensionNode,
-  type ObjectTypeDefinitionNode,
-  type ObjectTypeExtensionNode,
-  type UnionTypeDefinitionNode,
-  type UnionTypeExtensionNode,
-  type FieldDefinitionNode,
-  type InputObjectTypeDefinitionNode,
-  type InputObjectTypeExtensionNode,
-  type InputValueDefinitionNode,
-  type EnumTypeDefinitionNode,
-  type EnumTypeExtensionNode,
-  type EnumValueDefinitionNode,
-  type DirectiveDefinitionNode,
-} from '../language/ast';
-
-import { assertValidSDLExtension } from '../validation/validate';
-
-import { getDirectiveValues } from '../execution/values';
-
-import { specifiedScalarTypes, isSpecifiedScalarType } from '../type/scalars';
-import { introspectionTypes, isIntrospectionType } from '../type/introspection';
-import {
-  GraphQLDirective,
-  GraphQLDeprecatedDirective,
-} from '../type/directives';
-import {
-  type GraphQLSchemaValidationOptions,
-  assertSchema,
-  GraphQLSchema,
-  type GraphQLSchemaNormalizedConfig,
-} from '../type/schema';
-import {
-  type GraphQLType,
-  type GraphQLNamedType,
-  type GraphQLFieldConfigMap,
-  type GraphQLEnumValueConfigMap,
-  type GraphQLInputFieldConfigMap,
-  type GraphQLFieldConfigArgumentMap,
-  isScalarType,
-  isObjectType,
-  isInterfaceType,
-  isUnionType,
-  isListType,
-  isNonNullType,
-  isEnumType,
-  isInputObjectType,
-  GraphQLList,
-  GraphQLNonNull,
-  GraphQLScalarType,
-  GraphQLObjectType,
-  GraphQLInterfaceType,
-  GraphQLUnionType,
-  GraphQLEnumType,
-  GraphQLInputObjectType,
-} from '../type/definition';
-
-import { valueFromAST } from './valueFromAST';
-
-type Options = {|
-  ...GraphQLSchemaValidationOptions,
-
-  /**
-   * Descriptions are defined as preceding string literals, however an older
-   * experimental version of the SDL supported preceding comments as
-   * descriptions. Set to true to enable this deprecated behavior.
-   * This option is provided to ease adoption and will be removed in v16.
-   *
-   * Default: false
-   */
-  commentDescriptions?: boolean,
-
-  /**
-   * Set to true to assume the SDL is valid.
-   *
-   * Default: false
-   */
-  assumeValidSDL?: boolean,
-|};
-
-/**
- * Produces a new schema given an existing schema and a document which may
- * contain GraphQL type extensions and definitions. The original schema will
- * remain unaltered.
- *
- * Because a schema represents a graph of references, a schema cannot be
- * extended without effectively making an entire copy. We do not know until it's
- * too late if subgraphs remain unchanged.
- *
- * This algorithm copies the provided schema, applying extensions while
- * producing the copy. The original schema remains unaltered.
- *
- * Accepts options as a third argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-export function extendSchema(
-  schema: GraphQLSchema,
-  documentAST: DocumentNode,
-  options?: Options,
-): GraphQLSchema {
-  assertSchema(schema);
-
-  devAssert(
-    documentAST != null && documentAST.kind === Kind.DOCUMENT,
-    'Must provide valid Document AST.',
-  );
-
-  if (options?.assumeValid !== true && options?.assumeValidSDL !== true) {
-    assertValidSDLExtension(documentAST, schema);
-  }
-
-  const schemaConfig = schema.toConfig();
-  const extendedConfig = extendSchemaImpl(schemaConfig, documentAST, options);
-  return schemaConfig === extendedConfig
-    ? schema
-    : new GraphQLSchema(extendedConfig);
-}
-
-/**
- * @internal
- */
-export function extendSchemaImpl(
-  schemaConfig: GraphQLSchemaNormalizedConfig,
-  documentAST: DocumentNode,
-  options?: Options,
-): GraphQLSchemaNormalizedConfig {
-  // Collect the type definitions and extensions found in the document.
-  const typeDefs: Array<TypeDefinitionNode> = [];
-  const typeExtensionsMap = Object.create(null);
-
-  // New directives and types are separate because a directives and types can
-  // have the same name. For example, a type named "skip".
-  const directiveDefs: Array<DirectiveDefinitionNode> = [];
-
-  let schemaDef: ?SchemaDefinitionNode;
-  // Schema extensions are collected which may add additional operation types.
-  const schemaExtensions: Array<SchemaExtensionNode> = [];
-
-  for (const def of documentAST.definitions) {
-    if (def.kind === Kind.SCHEMA_DEFINITION) {
-      schemaDef = def;
-    } else if (def.kind === Kind.SCHEMA_EXTENSION) {
-      schemaExtensions.push(def);
-    } else if (isTypeDefinitionNode(def)) {
-      typeDefs.push(def);
-    } else if (isTypeExtensionNode(def)) {
-      const extendedTypeName = def.name.value;
-      const existingTypeExtensions = typeExtensionsMap[extendedTypeName];
-      typeExtensionsMap[extendedTypeName] = existingTypeExtensions
-        ? existingTypeExtensions.concat([def])
-        : [def];
-    } else if (def.kind === Kind.DIRECTIVE_DEFINITION) {
-      directiveDefs.push(def);
-    }
-  }
-
-  // If this document contains no new types, extensions, or directives then
-  // return the same unmodified GraphQLSchema instance.
-  if (
-    Object.keys(typeExtensionsMap).length === 0 &&
-    typeDefs.length === 0 &&
-    directiveDefs.length === 0 &&
-    schemaExtensions.length === 0 &&
-    schemaDef == null
-  ) {
-    return schemaConfig;
-  }
-
-  const typeMap = Object.create(null);
-  for (const existingType of schemaConfig.types) {
-    typeMap[existingType.name] = extendNamedType(existingType);
-  }
-
-  for (const typeNode of typeDefs) {
-    const name = typeNode.name.value;
-    typeMap[name] = stdTypeMap[name] ?? buildType(typeNode);
-  }
-
-  const operationTypes = {
-    // Get the extended root operation types.
-    query: schemaConfig.query && replaceNamedType(schemaConfig.query),
-    mutation: schemaConfig.mutation && replaceNamedType(schemaConfig.mutation),
-    subscription:
-      schemaConfig.subscription && replaceNamedType(schemaConfig.subscription),
-    // Then, incorporate schema definition and all schema extensions.
-    ...(schemaDef && getOperationTypes([schemaDef])),
-    ...getOperationTypes(schemaExtensions),
-  };
-
-  // Then produce and return a Schema config with these types.
-  return {
-    description: schemaDef?.description?.value,
-    ...operationTypes,
-    types: objectValues(typeMap),
-    directives: [
-      ...schemaConfig.directives.map(replaceDirective),
-      ...directiveDefs.map(buildDirective),
-    ],
-    extensions: undefined,
-    astNode: schemaDef ?? schemaConfig.astNode,
-    extensionASTNodes: schemaConfig.extensionASTNodes.concat(schemaExtensions),
-    assumeValid: options?.assumeValid ?? false,
-  };
-
-  // Below are functions used for producing this schema that have closed over
-  // this scope and have access to the schema, cache, and newly defined types.
-
-  function replaceType(type) {
-    if (isListType(type)) {
-      return new GraphQLList(replaceType(type.ofType));
-    } else if (isNonNullType(type)) {
-      return new GraphQLNonNull(replaceType(type.ofType));
-    }
-    return replaceNamedType(type);
-  }
-
-  function replaceNamedType<T: GraphQLNamedType>(type: T): T {
-    // Note: While this could make early assertions to get the correctly
-    // typed values, that would throw immediately while type system
-    // validation with validateSchema() will produce more actionable results.
-    return ((typeMap[type.name]: any): T);
-  }
-
-  function replaceDirective(directive: GraphQLDirective): GraphQLDirective {
-    const config = directive.toConfig();
-    return new GraphQLDirective({
-      ...config,
-      args: mapValue(config.args, extendArg),
-    });
-  }
-
-  function extendNamedType(type: GraphQLNamedType): GraphQLNamedType {
-    if (isIntrospectionType(type) || isSpecifiedScalarType(type)) {
-      // Builtin types are not extended.
-      return type;
-    }
-    if (isScalarType(type)) {
-      return extendScalarType(type);
-    }
-    if (isObjectType(type)) {
-      return extendObjectType(type);
-    }
-    if (isInterfaceType(type)) {
-      return extendInterfaceType(type);
-    }
-    if (isUnionType(type)) {
-      return extendUnionType(type);
-    }
-    if (isEnumType(type)) {
-      return extendEnumType(type);
-    }
-    if (isInputObjectType(type)) {
-      return extendInputObjectType(type);
-    }
-
-    // Not reachable. All possible types have been considered.
-    invariant(false, 'Unexpected type: ' + inspect((type: empty)));
-  }
-
-  function extendInputObjectType(
-    type: GraphQLInputObjectType,
-  ): GraphQLInputObjectType {
-    const config = type.toConfig();
-    const extensions = typeExtensionsMap[config.name] ?? [];
-
-    return new GraphQLInputObjectType({
-      ...config,
-      fields: () => ({
-        ...mapValue(config.fields, field => ({
-          ...field,
-          type: replaceType(field.type),
-        })),
-        ...buildInputFieldMap(extensions),
-      }),
-      extensionASTNodes: config.extensionASTNodes.concat(extensions),
-    });
-  }
-
-  function extendEnumType(type: GraphQLEnumType): GraphQLEnumType {
-    const config = type.toConfig();
-    const extensions = typeExtensionsMap[type.name] ?? [];
-
-    return new GraphQLEnumType({
-      ...config,
-      values: {
-        ...config.values,
-        ...buildEnumValueMap(extensions),
-      },
-      extensionASTNodes: config.extensionASTNodes.concat(extensions),
-    });
-  }
-
-  function extendScalarType(type: GraphQLScalarType): GraphQLScalarType {
-    const config = type.toConfig();
-    const extensions = typeExtensionsMap[config.name] ?? [];
-
-    return new GraphQLScalarType({
-      ...config,
-      extensionASTNodes: config.extensionASTNodes.concat(extensions),
-    });
-  }
-
-  function extendObjectType(type: GraphQLObjectType): GraphQLObjectType {
-    const config = type.toConfig();
-    const extensions = typeExtensionsMap[config.name] ?? [];
-
-    return new GraphQLObjectType({
-      ...config,
-      interfaces: () => [
-        ...type.getInterfaces().map(replaceNamedType),
-        ...buildInterfaces(extensions),
-      ],
-      fields: () => ({
-        ...mapValue(config.fields, extendField),
-        ...buildFieldMap(extensions),
-      }),
-      extensionASTNodes: config.extensionASTNodes.concat(extensions),
-    });
-  }
-
-  function extendInterfaceType(
-    type: GraphQLInterfaceType,
-  ): GraphQLInterfaceType {
-    const config = type.toConfig();
-    const extensions = typeExtensionsMap[config.name] ?? [];
-
-    return new GraphQLInterfaceType({
-      ...config,
-      interfaces: () => [
-        ...type.getInterfaces().map(replaceNamedType),
-        ...buildInterfaces(extensions),
-      ],
-      fields: () => ({
-        ...mapValue(config.fields, extendField),
-        ...buildFieldMap(extensions),
-      }),
-      extensionASTNodes: config.extensionASTNodes.concat(extensions),
-    });
-  }
-
-  function extendUnionType(type: GraphQLUnionType): GraphQLUnionType {
-    const config = type.toConfig();
-    const extensions = typeExtensionsMap[config.name] ?? [];
-
-    return new GraphQLUnionType({
-      ...config,
-      types: () => [
-        ...type.getTypes().map(replaceNamedType),
-        ...buildUnionTypes(extensions),
-      ],
-      extensionASTNodes: config.extensionASTNodes.concat(extensions),
-    });
-  }
-
-  function extendField(field) {
-    return {
-      ...field,
-      type: replaceType(field.type),
-      args: mapValue(field.args, extendArg),
-    };
-  }
-
-  function extendArg(arg) {
-    return {
-      ...arg,
-      type: replaceType(arg.type),
-    };
-  }
-
-  function getOperationTypes(
-    nodes: $ReadOnlyArray<SchemaDefinitionNode | SchemaExtensionNode>,
-  ): {|
-    query: ?GraphQLObjectType,
-    mutation: ?GraphQLObjectType,
-    subscription: ?GraphQLObjectType,
-  |} {
-    const opTypes = {};
-    for (const node of nodes) {
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      const operationTypesNodes = node.operationTypes ?? [];
-
-      for (const operationType of operationTypesNodes) {
-        opTypes[operationType.operation] = getNamedType(operationType.type);
-      }
-    }
-
-    // Note: While this could make early assertions to get the correctly
-    // typed values below, that would throw immediately while type system
-    // validation with validateSchema() will produce more actionable results.
-    return (opTypes: any);
-  }
-
-  function getNamedType(node: NamedTypeNode): GraphQLNamedType {
-    const name = node.name.value;
-    const type = stdTypeMap[name] ?? typeMap[name];
-
-    if (type === undefined) {
-      throw new Error(`Unknown type: "${name}".`);
-    }
-    return type;
-  }
-
-  function getWrappedType(node: TypeNode): GraphQLType {
-    if (node.kind === Kind.LIST_TYPE) {
-      return new GraphQLList(getWrappedType(node.type));
-    }
-    if (node.kind === Kind.NON_NULL_TYPE) {
-      return new GraphQLNonNull(getWrappedType(node.type));
-    }
-    return getNamedType(node);
-  }
-
-  function buildDirective(node: DirectiveDefinitionNode): GraphQLDirective {
-    const locations = node.locations.map(
-      ({ value }) => ((value: any): DirectiveLocationEnum),
-    );
-
-    return new GraphQLDirective({
-      name: node.name.value,
-      description: getDescription(node, options),
-      locations,
-      isRepeatable: node.repeatable,
-      args: buildArgumentMap(node.arguments),
-      astNode: node,
-    });
-  }
-
-  function buildFieldMap(
-    nodes: $ReadOnlyArray<
-      | InterfaceTypeDefinitionNode
-      | InterfaceTypeExtensionNode
-      | ObjectTypeDefinitionNode
-      | ObjectTypeExtensionNode,
-    >,
-  ): GraphQLFieldConfigMap<mixed, mixed> {
-    const fieldConfigMap = Object.create(null);
-    for (const node of nodes) {
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      const nodeFields = node.fields ?? [];
-
-      for (const field of nodeFields) {
-        fieldConfigMap[field.name.value] = {
-          // Note: While this could make assertions to get the correctly typed
-          // value, that would throw immediately while type system validation
-          // with validateSchema() will produce more actionable results.
-          type: (getWrappedType(field.type): any),
-          description: getDescription(field, options),
-          args: buildArgumentMap(field.arguments),
-          deprecationReason: getDeprecationReason(field),
-          astNode: field,
-        };
-      }
-    }
-    return fieldConfigMap;
-  }
-
-  function buildArgumentMap(
-    args: ?$ReadOnlyArray<InputValueDefinitionNode>,
-  ): GraphQLFieldConfigArgumentMap {
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-    const argsNodes = args ?? [];
-
-    const argConfigMap = Object.create(null);
-    for (const arg of argsNodes) {
-      // Note: While this could make assertions to get the correctly typed
-      // value, that would throw immediately while type system validation
-      // with validateSchema() will produce more actionable results.
-      const type: any = getWrappedType(arg.type);
-
-      argConfigMap[arg.name.value] = {
-        type,
-        description: getDescription(arg, options),
-        defaultValue: valueFromAST(arg.defaultValue, type),
-        astNode: arg,
-      };
-    }
-    return argConfigMap;
-  }
-
-  function buildInputFieldMap(
-    nodes: $ReadOnlyArray<
-      InputObjectTypeDefinitionNode | InputObjectTypeExtensionNode,
-    >,
-  ): GraphQLInputFieldConfigMap {
-    const inputFieldMap = Object.create(null);
-    for (const node of nodes) {
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      const fieldsNodes = node.fields ?? [];
-
-      for (const field of fieldsNodes) {
-        // Note: While this could make assertions to get the correctly typed
-        // value, that would throw immediately while type system validation
-        // with validateSchema() will produce more actionable results.
-        const type: any = getWrappedType(field.type);
-
-        inputFieldMap[field.name.value] = {
-          type,
-          description: getDescription(field, options),
-          defaultValue: valueFromAST(field.defaultValue, type),
-          astNode: field,
-        };
-      }
-    }
-    return inputFieldMap;
-  }
-
-  function buildEnumValueMap(
-    nodes: $ReadOnlyArray<EnumTypeDefinitionNode | EnumTypeExtensionNode>,
-  ): GraphQLEnumValueConfigMap {
-    const enumValueMap = Object.create(null);
-    for (const node of nodes) {
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      const valuesNodes = node.values ?? [];
-
-      for (const value of valuesNodes) {
-        enumValueMap[value.name.value] = {
-          description: getDescription(value, options),
-          deprecationReason: getDeprecationReason(value),
-          astNode: value,
-        };
-      }
-    }
-    return enumValueMap;
-  }
-
-  function buildInterfaces(
-    nodes: $ReadOnlyArray<
-      | InterfaceTypeDefinitionNode
-      | InterfaceTypeExtensionNode
-      | ObjectTypeDefinitionNode
-      | ObjectTypeExtensionNode,
-    >,
-  ): Array<GraphQLInterfaceType> {
-    const interfaces = [];
-    for (const node of nodes) {
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      const interfacesNodes = node.interfaces ?? [];
-
-      for (const type of interfacesNodes) {
-        // Note: While this could make assertions to get the correctly typed
-        // values below, that would throw immediately while type system
-        // validation with validateSchema() will produce more actionable
-        // results.
-        interfaces.push((getNamedType(type): any));
-      }
-    }
-    return interfaces;
-  }
-
-  function buildUnionTypes(
-    nodes: $ReadOnlyArray<UnionTypeDefinitionNode | UnionTypeExtensionNode>,
-  ): Array<GraphQLObjectType> {
-    const types = [];
-    for (const node of nodes) {
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      const typeNodes = node.types ?? [];
-
-      for (const type of typeNodes) {
-        // Note: While this could make assertions to get the correctly typed
-        // values below, that would throw immediately while type system
-        // validation with validateSchema() will produce more actionable
-        // results.
-        types.push((getNamedType(type): any));
-      }
-    }
-    return types;
-  }
-
-  function buildType(astNode: TypeDefinitionNode): GraphQLNamedType {
-    const name = astNode.name.value;
-    const description = getDescription(astNode, options);
-    const extensionNodes = typeExtensionsMap[name] ?? [];
-
-    switch (astNode.kind) {
-      case Kind.OBJECT_TYPE_DEFINITION: {
-        const extensionASTNodes = (extensionNodes: any);
-        const allNodes = [astNode, ...extensionASTNodes];
-
-        return new GraphQLObjectType({
-          name,
-          description,
-          interfaces: () => buildInterfaces(allNodes),
-          fields: () => buildFieldMap(allNodes),
-          astNode,
-          extensionASTNodes,
-        });
-      }
-      case Kind.INTERFACE_TYPE_DEFINITION: {
-        const extensionASTNodes = (extensionNodes: any);
-        const allNodes = [astNode, ...extensionASTNodes];
-
-        return new GraphQLInterfaceType({
-          name,
-          description,
-          interfaces: () => buildInterfaces(allNodes),
-          fields: () => buildFieldMap(allNodes),
-          astNode,
-          extensionASTNodes,
-        });
-      }
-      case Kind.ENUM_TYPE_DEFINITION: {
-        const extensionASTNodes = (extensionNodes: any);
-        const allNodes = [astNode, ...extensionASTNodes];
-
-        return new GraphQLEnumType({
-          name,
-          description,
-          values: buildEnumValueMap(allNodes),
-          astNode,
-          extensionASTNodes,
-        });
-      }
-      case Kind.UNION_TYPE_DEFINITION: {
-        const extensionASTNodes = (extensionNodes: any);
-        const allNodes = [astNode, ...extensionASTNodes];
-
-        return new GraphQLUnionType({
-          name,
-          description,
-          types: () => buildUnionTypes(allNodes),
-          astNode,
-          extensionASTNodes,
-        });
-      }
-      case Kind.SCALAR_TYPE_DEFINITION: {
-        const extensionASTNodes = (extensionNodes: any);
-
-        return new GraphQLScalarType({
-          name,
-          description,
-          astNode,
-          extensionASTNodes,
-        });
-      }
-      case Kind.INPUT_OBJECT_TYPE_DEFINITION: {
-        const extensionASTNodes = (extensionNodes: any);
-        const allNodes = [astNode, ...extensionASTNodes];
-
-        return new GraphQLInputObjectType({
-          name,
-          description,
-          fields: () => buildInputFieldMap(allNodes),
-          astNode,
-          extensionASTNodes,
-        });
-      }
-    }
-
-    // Not reachable. All possible type definition nodes have been considered.
-    invariant(
-      false,
-      'Unexpected type definition node: ' + inspect((astNode: empty)),
-    );
-  }
-}
-
-const stdTypeMap = keyMap(
-  specifiedScalarTypes.concat(introspectionTypes),
-  type => type.name,
-);
-
-/**
- * Given a field or enum value node, returns the string value for the
- * deprecation reason.
- */
-function getDeprecationReason(
-  node: EnumValueDefinitionNode | FieldDefinitionNode,
-): ?string {
-  const deprecated = getDirectiveValues(GraphQLDeprecatedDirective, node);
-  return (deprecated?.reason: any);
-}
-
-/**
- * Given an ast node, returns its string description.
- * @deprecated: provided to ease adoption and will be removed in v16.
- *
- * Accepts options as a second argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-export function getDescription(
-  node: { +description?: StringValueNode, +loc?: Location, ... },
-  options: ?{ commentDescriptions?: boolean, ... },
-): void | string {
-  if (node.description) {
-    return node.description.value;
-  }
-  if (options?.commentDescriptions === true) {
-    const rawValue = getLeadingCommentBlock(node);
-    if (rawValue !== undefined) {
-      return dedentBlockStringValue('\n' + rawValue);
-    }
-  }
-}
-
-function getLeadingCommentBlock(node): void | string {
-  const loc = node.loc;
-  if (!loc) {
-    return;
-  }
-  const comments = [];
-  let token = loc.startToken.prev;
-  while (
-    token != null &&
-    token.kind === TokenKind.COMMENT &&
-    token.next &&
-    token.prev &&
-    token.line + 1 === token.next.line &&
-    token.line !== token.prev.line
-  ) {
-    const value = String(token.value);
-    comments.push(value);
-    token = token.prev;
-  }
-  return comments.length > 0 ? comments.reverse().join('\n') : undefined;
-}
diff --git a/node_modules/graphql/utilities/extendSchema.mjs b/node_modules/graphql/utilities/extendSchema.mjs
deleted file mode 100644
index 39cb990..0000000
--- a/node_modules/graphql/utilities/extendSchema.mjs
+++ /dev/null
@@ -1,670 +0,0 @@
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-import objectValues from "../polyfills/objectValues.mjs";
-import keyMap from "../jsutils/keyMap.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import mapValue from "../jsutils/mapValue.mjs";
-import invariant from "../jsutils/invariant.mjs";
-import devAssert from "../jsutils/devAssert.mjs";
-import { Kind } from "../language/kinds.mjs";
-import { TokenKind } from "../language/tokenKind.mjs";
-import { dedentBlockStringValue } from "../language/blockString.mjs";
-import { isTypeDefinitionNode, isTypeExtensionNode } from "../language/predicates.mjs";
-import { assertValidSDLExtension } from "../validation/validate.mjs";
-import { getDirectiveValues } from "../execution/values.mjs";
-import { specifiedScalarTypes, isSpecifiedScalarType } from "../type/scalars.mjs";
-import { introspectionTypes, isIntrospectionType } from "../type/introspection.mjs";
-import { GraphQLDirective, GraphQLDeprecatedDirective } from "../type/directives.mjs";
-import { assertSchema, GraphQLSchema } from "../type/schema.mjs";
-import { isScalarType, isObjectType, isInterfaceType, isUnionType, isListType, isNonNullType, isEnumType, isInputObjectType, GraphQLList, GraphQLNonNull, GraphQLScalarType, GraphQLObjectType, GraphQLInterfaceType, GraphQLUnionType, GraphQLEnumType, GraphQLInputObjectType } from "../type/definition.mjs";
-import { valueFromAST } from "./valueFromAST.mjs";
-
-/**
- * Produces a new schema given an existing schema and a document which may
- * contain GraphQL type extensions and definitions. The original schema will
- * remain unaltered.
- *
- * Because a schema represents a graph of references, a schema cannot be
- * extended without effectively making an entire copy. We do not know until it's
- * too late if subgraphs remain unchanged.
- *
- * This algorithm copies the provided schema, applying extensions while
- * producing the copy. The original schema remains unaltered.
- *
- * Accepts options as a third argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-export function extendSchema(schema, documentAST, options) {
-  assertSchema(schema);
-  documentAST != null && documentAST.kind === Kind.DOCUMENT || devAssert(0, 'Must provide valid Document AST.');
-
-  if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) {
-    assertValidSDLExtension(documentAST, schema);
-  }
-
-  var schemaConfig = schema.toConfig();
-  var extendedConfig = extendSchemaImpl(schemaConfig, documentAST, options);
-  return schemaConfig === extendedConfig ? schema : new GraphQLSchema(extendedConfig);
-}
-/**
- * @internal
- */
-
-export function extendSchemaImpl(schemaConfig, documentAST, options) {
-  var _schemaDef, _schemaDef$descriptio, _schemaDef2, _ref;
-
-  // Collect the type definitions and extensions found in the document.
-  var typeDefs = [];
-  var typeExtensionsMap = Object.create(null); // New directives and types are separate because a directives and types can
-  // have the same name. For example, a type named "skip".
-
-  var directiveDefs = [];
-  var schemaDef; // Schema extensions are collected which may add additional operation types.
-
-  var schemaExtensions = [];
-
-  for (var _i2 = 0, _documentAST$definiti2 = documentAST.definitions; _i2 < _documentAST$definiti2.length; _i2++) {
-    var def = _documentAST$definiti2[_i2];
-
-    if (def.kind === Kind.SCHEMA_DEFINITION) {
-      schemaDef = def;
-    } else if (def.kind === Kind.SCHEMA_EXTENSION) {
-      schemaExtensions.push(def);
-    } else if (isTypeDefinitionNode(def)) {
-      typeDefs.push(def);
-    } else if (isTypeExtensionNode(def)) {
-      var extendedTypeName = def.name.value;
-      var existingTypeExtensions = typeExtensionsMap[extendedTypeName];
-      typeExtensionsMap[extendedTypeName] = existingTypeExtensions ? existingTypeExtensions.concat([def]) : [def];
-    } else if (def.kind === Kind.DIRECTIVE_DEFINITION) {
-      directiveDefs.push(def);
-    }
-  } // If this document contains no new types, extensions, or directives then
-  // return the same unmodified GraphQLSchema instance.
-
-
-  if (Object.keys(typeExtensionsMap).length === 0 && typeDefs.length === 0 && directiveDefs.length === 0 && schemaExtensions.length === 0 && schemaDef == null) {
-    return schemaConfig;
-  }
-
-  var typeMap = Object.create(null);
-
-  for (var _i4 = 0, _schemaConfig$types2 = schemaConfig.types; _i4 < _schemaConfig$types2.length; _i4++) {
-    var existingType = _schemaConfig$types2[_i4];
-    typeMap[existingType.name] = extendNamedType(existingType);
-  }
-
-  for (var _i6 = 0; _i6 < typeDefs.length; _i6++) {
-    var _stdTypeMap$name;
-
-    var typeNode = typeDefs[_i6];
-    var name = typeNode.name.value;
-    typeMap[name] = (_stdTypeMap$name = stdTypeMap[name]) !== null && _stdTypeMap$name !== void 0 ? _stdTypeMap$name : buildType(typeNode);
-  }
-
-  var operationTypes = _objectSpread({
-    // Get the extended root operation types.
-    query: schemaConfig.query && replaceNamedType(schemaConfig.query),
-    mutation: schemaConfig.mutation && replaceNamedType(schemaConfig.mutation),
-    subscription: schemaConfig.subscription && replaceNamedType(schemaConfig.subscription)
-  }, schemaDef && getOperationTypes([schemaDef]), {}, getOperationTypes(schemaExtensions)); // Then produce and return a Schema config with these types.
-
-
-  return _objectSpread({
-    description: (_schemaDef = schemaDef) === null || _schemaDef === void 0 ? void 0 : (_schemaDef$descriptio = _schemaDef.description) === null || _schemaDef$descriptio === void 0 ? void 0 : _schemaDef$descriptio.value
-  }, operationTypes, {
-    types: objectValues(typeMap),
-    directives: [].concat(schemaConfig.directives.map(replaceDirective), directiveDefs.map(buildDirective)),
-    extensions: undefined,
-    astNode: (_schemaDef2 = schemaDef) !== null && _schemaDef2 !== void 0 ? _schemaDef2 : schemaConfig.astNode,
-    extensionASTNodes: schemaConfig.extensionASTNodes.concat(schemaExtensions),
-    assumeValid: (_ref = options === null || options === void 0 ? void 0 : options.assumeValid) !== null && _ref !== void 0 ? _ref : false
-  }); // Below are functions used for producing this schema that have closed over
-  // this scope and have access to the schema, cache, and newly defined types.
-
-  function replaceType(type) {
-    if (isListType(type)) {
-      return new GraphQLList(replaceType(type.ofType));
-    } else if (isNonNullType(type)) {
-      return new GraphQLNonNull(replaceType(type.ofType));
-    }
-
-    return replaceNamedType(type);
-  }
-
-  function replaceNamedType(type) {
-    // Note: While this could make early assertions to get the correctly
-    // typed values, that would throw immediately while type system
-    // validation with validateSchema() will produce more actionable results.
-    return typeMap[type.name];
-  }
-
-  function replaceDirective(directive) {
-    var config = directive.toConfig();
-    return new GraphQLDirective(_objectSpread({}, config, {
-      args: mapValue(config.args, extendArg)
-    }));
-  }
-
-  function extendNamedType(type) {
-    if (isIntrospectionType(type) || isSpecifiedScalarType(type)) {
-      // Builtin types are not extended.
-      return type;
-    }
-
-    if (isScalarType(type)) {
-      return extendScalarType(type);
-    }
-
-    if (isObjectType(type)) {
-      return extendObjectType(type);
-    }
-
-    if (isInterfaceType(type)) {
-      return extendInterfaceType(type);
-    }
-
-    if (isUnionType(type)) {
-      return extendUnionType(type);
-    }
-
-    if (isEnumType(type)) {
-      return extendEnumType(type);
-    }
-
-    /* istanbul ignore else */
-    if (isInputObjectType(type)) {
-      return extendInputObjectType(type);
-    } // Not reachable. All possible types have been considered.
-
-
-    /* istanbul ignore next */
-    invariant(false, 'Unexpected type: ' + inspect(type));
-  }
-
-  function extendInputObjectType(type) {
-    var _typeExtensionsMap$co;
-
-    var config = type.toConfig();
-    var extensions = (_typeExtensionsMap$co = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co !== void 0 ? _typeExtensionsMap$co : [];
-    return new GraphQLInputObjectType(_objectSpread({}, config, {
-      fields: function fields() {
-        return _objectSpread({}, mapValue(config.fields, function (field) {
-          return _objectSpread({}, field, {
-            type: replaceType(field.type)
-          });
-        }), {}, buildInputFieldMap(extensions));
-      },
-      extensionASTNodes: config.extensionASTNodes.concat(extensions)
-    }));
-  }
-
-  function extendEnumType(type) {
-    var _typeExtensionsMap$ty;
-
-    var config = type.toConfig();
-    var extensions = (_typeExtensionsMap$ty = typeExtensionsMap[type.name]) !== null && _typeExtensionsMap$ty !== void 0 ? _typeExtensionsMap$ty : [];
-    return new GraphQLEnumType(_objectSpread({}, config, {
-      values: _objectSpread({}, config.values, {}, buildEnumValueMap(extensions)),
-      extensionASTNodes: config.extensionASTNodes.concat(extensions)
-    }));
-  }
-
-  function extendScalarType(type) {
-    var _typeExtensionsMap$co2;
-
-    var config = type.toConfig();
-    var extensions = (_typeExtensionsMap$co2 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co2 !== void 0 ? _typeExtensionsMap$co2 : [];
-    return new GraphQLScalarType(_objectSpread({}, config, {
-      extensionASTNodes: config.extensionASTNodes.concat(extensions)
-    }));
-  }
-
-  function extendObjectType(type) {
-    var _typeExtensionsMap$co3;
-
-    var config = type.toConfig();
-    var extensions = (_typeExtensionsMap$co3 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co3 !== void 0 ? _typeExtensionsMap$co3 : [];
-    return new GraphQLObjectType(_objectSpread({}, config, {
-      interfaces: function interfaces() {
-        return [].concat(type.getInterfaces().map(replaceNamedType), buildInterfaces(extensions));
-      },
-      fields: function fields() {
-        return _objectSpread({}, mapValue(config.fields, extendField), {}, buildFieldMap(extensions));
-      },
-      extensionASTNodes: config.extensionASTNodes.concat(extensions)
-    }));
-  }
-
-  function extendInterfaceType(type) {
-    var _typeExtensionsMap$co4;
-
-    var config = type.toConfig();
-    var extensions = (_typeExtensionsMap$co4 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co4 !== void 0 ? _typeExtensionsMap$co4 : [];
-    return new GraphQLInterfaceType(_objectSpread({}, config, {
-      interfaces: function interfaces() {
-        return [].concat(type.getInterfaces().map(replaceNamedType), buildInterfaces(extensions));
-      },
-      fields: function fields() {
-        return _objectSpread({}, mapValue(config.fields, extendField), {}, buildFieldMap(extensions));
-      },
-      extensionASTNodes: config.extensionASTNodes.concat(extensions)
-    }));
-  }
-
-  function extendUnionType(type) {
-    var _typeExtensionsMap$co5;
-
-    var config = type.toConfig();
-    var extensions = (_typeExtensionsMap$co5 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co5 !== void 0 ? _typeExtensionsMap$co5 : [];
-    return new GraphQLUnionType(_objectSpread({}, config, {
-      types: function types() {
-        return [].concat(type.getTypes().map(replaceNamedType), buildUnionTypes(extensions));
-      },
-      extensionASTNodes: config.extensionASTNodes.concat(extensions)
-    }));
-  }
-
-  function extendField(field) {
-    return _objectSpread({}, field, {
-      type: replaceType(field.type),
-      args: mapValue(field.args, extendArg)
-    });
-  }
-
-  function extendArg(arg) {
-    return _objectSpread({}, arg, {
-      type: replaceType(arg.type)
-    });
-  }
-
-  function getOperationTypes(nodes) {
-    var opTypes = {};
-
-    for (var _i8 = 0; _i8 < nodes.length; _i8++) {
-      var _node$operationTypes;
-
-      var node = nodes[_i8];
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var operationTypesNodes = (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : [];
-
-      for (var _i10 = 0; _i10 < operationTypesNodes.length; _i10++) {
-        var operationType = operationTypesNodes[_i10];
-        opTypes[operationType.operation] = getNamedType(operationType.type);
-      }
-    } // Note: While this could make early assertions to get the correctly
-    // typed values below, that would throw immediately while type system
-    // validation with validateSchema() will produce more actionable results.
-
-
-    return opTypes;
-  }
-
-  function getNamedType(node) {
-    var _stdTypeMap$name2;
-
-    var name = node.name.value;
-    var type = (_stdTypeMap$name2 = stdTypeMap[name]) !== null && _stdTypeMap$name2 !== void 0 ? _stdTypeMap$name2 : typeMap[name];
-
-    if (type === undefined) {
-      throw new Error("Unknown type: \"".concat(name, "\"."));
-    }
-
-    return type;
-  }
-
-  function getWrappedType(node) {
-    if (node.kind === Kind.LIST_TYPE) {
-      return new GraphQLList(getWrappedType(node.type));
-    }
-
-    if (node.kind === Kind.NON_NULL_TYPE) {
-      return new GraphQLNonNull(getWrappedType(node.type));
-    }
-
-    return getNamedType(node);
-  }
-
-  function buildDirective(node) {
-    var locations = node.locations.map(function (_ref2) {
-      var value = _ref2.value;
-      return value;
-    });
-    return new GraphQLDirective({
-      name: node.name.value,
-      description: getDescription(node, options),
-      locations: locations,
-      isRepeatable: node.repeatable,
-      args: buildArgumentMap(node.arguments),
-      astNode: node
-    });
-  }
-
-  function buildFieldMap(nodes) {
-    var fieldConfigMap = Object.create(null);
-
-    for (var _i12 = 0; _i12 < nodes.length; _i12++) {
-      var _node$fields;
-
-      var node = nodes[_i12];
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var nodeFields = (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : [];
-
-      for (var _i14 = 0; _i14 < nodeFields.length; _i14++) {
-        var field = nodeFields[_i14];
-        fieldConfigMap[field.name.value] = {
-          // Note: While this could make assertions to get the correctly typed
-          // value, that would throw immediately while type system validation
-          // with validateSchema() will produce more actionable results.
-          type: getWrappedType(field.type),
-          description: getDescription(field, options),
-          args: buildArgumentMap(field.arguments),
-          deprecationReason: getDeprecationReason(field),
-          astNode: field
-        };
-      }
-    }
-
-    return fieldConfigMap;
-  }
-
-  function buildArgumentMap(args) {
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-    var argsNodes = args !== null && args !== void 0 ? args : [];
-    var argConfigMap = Object.create(null);
-
-    for (var _i16 = 0; _i16 < argsNodes.length; _i16++) {
-      var arg = argsNodes[_i16];
-      // Note: While this could make assertions to get the correctly typed
-      // value, that would throw immediately while type system validation
-      // with validateSchema() will produce more actionable results.
-      var type = getWrappedType(arg.type);
-      argConfigMap[arg.name.value] = {
-        type: type,
-        description: getDescription(arg, options),
-        defaultValue: valueFromAST(arg.defaultValue, type),
-        astNode: arg
-      };
-    }
-
-    return argConfigMap;
-  }
-
-  function buildInputFieldMap(nodes) {
-    var inputFieldMap = Object.create(null);
-
-    for (var _i18 = 0; _i18 < nodes.length; _i18++) {
-      var _node$fields2;
-
-      var node = nodes[_i18];
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var fieldsNodes = (_node$fields2 = node.fields) !== null && _node$fields2 !== void 0 ? _node$fields2 : [];
-
-      for (var _i20 = 0; _i20 < fieldsNodes.length; _i20++) {
-        var field = fieldsNodes[_i20];
-        // Note: While this could make assertions to get the correctly typed
-        // value, that would throw immediately while type system validation
-        // with validateSchema() will produce more actionable results.
-        var type = getWrappedType(field.type);
-        inputFieldMap[field.name.value] = {
-          type: type,
-          description: getDescription(field, options),
-          defaultValue: valueFromAST(field.defaultValue, type),
-          astNode: field
-        };
-      }
-    }
-
-    return inputFieldMap;
-  }
-
-  function buildEnumValueMap(nodes) {
-    var enumValueMap = Object.create(null);
-
-    for (var _i22 = 0; _i22 < nodes.length; _i22++) {
-      var _node$values;
-
-      var node = nodes[_i22];
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var valuesNodes = (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : [];
-
-      for (var _i24 = 0; _i24 < valuesNodes.length; _i24++) {
-        var value = valuesNodes[_i24];
-        enumValueMap[value.name.value] = {
-          description: getDescription(value, options),
-          deprecationReason: getDeprecationReason(value),
-          astNode: value
-        };
-      }
-    }
-
-    return enumValueMap;
-  }
-
-  function buildInterfaces(nodes) {
-    var interfaces = [];
-
-    for (var _i26 = 0; _i26 < nodes.length; _i26++) {
-      var _node$interfaces;
-
-      var node = nodes[_i26];
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var interfacesNodes = (_node$interfaces = node.interfaces) !== null && _node$interfaces !== void 0 ? _node$interfaces : [];
-
-      for (var _i28 = 0; _i28 < interfacesNodes.length; _i28++) {
-        var type = interfacesNodes[_i28];
-        // Note: While this could make assertions to get the correctly typed
-        // values below, that would throw immediately while type system
-        // validation with validateSchema() will produce more actionable
-        // results.
-        interfaces.push(getNamedType(type));
-      }
-    }
-
-    return interfaces;
-  }
-
-  function buildUnionTypes(nodes) {
-    var types = [];
-
-    for (var _i30 = 0; _i30 < nodes.length; _i30++) {
-      var _node$types;
-
-      var node = nodes[_i30];
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var typeNodes = (_node$types = node.types) !== null && _node$types !== void 0 ? _node$types : [];
-
-      for (var _i32 = 0; _i32 < typeNodes.length; _i32++) {
-        var type = typeNodes[_i32];
-        // Note: While this could make assertions to get the correctly typed
-        // values below, that would throw immediately while type system
-        // validation with validateSchema() will produce more actionable
-        // results.
-        types.push(getNamedType(type));
-      }
-    }
-
-    return types;
-  }
-
-  function buildType(astNode) {
-    var _typeExtensionsMap$na;
-
-    var name = astNode.name.value;
-    var description = getDescription(astNode, options);
-    var extensionNodes = (_typeExtensionsMap$na = typeExtensionsMap[name]) !== null && _typeExtensionsMap$na !== void 0 ? _typeExtensionsMap$na : [];
-
-    switch (astNode.kind) {
-      case Kind.OBJECT_TYPE_DEFINITION:
-        {
-          var extensionASTNodes = extensionNodes;
-          var allNodes = [astNode].concat(extensionASTNodes);
-          return new GraphQLObjectType({
-            name: name,
-            description: description,
-            interfaces: function interfaces() {
-              return buildInterfaces(allNodes);
-            },
-            fields: function fields() {
-              return buildFieldMap(allNodes);
-            },
-            astNode: astNode,
-            extensionASTNodes: extensionASTNodes
-          });
-        }
-
-      case Kind.INTERFACE_TYPE_DEFINITION:
-        {
-          var _extensionASTNodes = extensionNodes;
-
-          var _allNodes = [astNode].concat(_extensionASTNodes);
-
-          return new GraphQLInterfaceType({
-            name: name,
-            description: description,
-            interfaces: function interfaces() {
-              return buildInterfaces(_allNodes);
-            },
-            fields: function fields() {
-              return buildFieldMap(_allNodes);
-            },
-            astNode: astNode,
-            extensionASTNodes: _extensionASTNodes
-          });
-        }
-
-      case Kind.ENUM_TYPE_DEFINITION:
-        {
-          var _extensionASTNodes2 = extensionNodes;
-
-          var _allNodes2 = [astNode].concat(_extensionASTNodes2);
-
-          return new GraphQLEnumType({
-            name: name,
-            description: description,
-            values: buildEnumValueMap(_allNodes2),
-            astNode: astNode,
-            extensionASTNodes: _extensionASTNodes2
-          });
-        }
-
-      case Kind.UNION_TYPE_DEFINITION:
-        {
-          var _extensionASTNodes3 = extensionNodes;
-
-          var _allNodes3 = [astNode].concat(_extensionASTNodes3);
-
-          return new GraphQLUnionType({
-            name: name,
-            description: description,
-            types: function types() {
-              return buildUnionTypes(_allNodes3);
-            },
-            astNode: astNode,
-            extensionASTNodes: _extensionASTNodes3
-          });
-        }
-
-      case Kind.SCALAR_TYPE_DEFINITION:
-        {
-          var _extensionASTNodes4 = extensionNodes;
-          return new GraphQLScalarType({
-            name: name,
-            description: description,
-            astNode: astNode,
-            extensionASTNodes: _extensionASTNodes4
-          });
-        }
-
-      case Kind.INPUT_OBJECT_TYPE_DEFINITION:
-        {
-          var _extensionASTNodes5 = extensionNodes;
-
-          var _allNodes4 = [astNode].concat(_extensionASTNodes5);
-
-          return new GraphQLInputObjectType({
-            name: name,
-            description: description,
-            fields: function fields() {
-              return buildInputFieldMap(_allNodes4);
-            },
-            astNode: astNode,
-            extensionASTNodes: _extensionASTNodes5
-          });
-        }
-    } // Not reachable. All possible type definition nodes have been considered.
-
-
-    /* istanbul ignore next */
-    invariant(false, 'Unexpected type definition node: ' + inspect(astNode));
-  }
-}
-var stdTypeMap = keyMap(specifiedScalarTypes.concat(introspectionTypes), function (type) {
-  return type.name;
-});
-/**
- * Given a field or enum value node, returns the string value for the
- * deprecation reason.
- */
-
-function getDeprecationReason(node) {
-  var deprecated = getDirectiveValues(GraphQLDeprecatedDirective, node);
-  return deprecated === null || deprecated === void 0 ? void 0 : deprecated.reason;
-}
-/**
- * Given an ast node, returns its string description.
- * @deprecated: provided to ease adoption and will be removed in v16.
- *
- * Accepts options as a second argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-
-
-export function getDescription(node, options) {
-  if (node.description) {
-    return node.description.value;
-  }
-
-  if ((options === null || options === void 0 ? void 0 : options.commentDescriptions) === true) {
-    var rawValue = getLeadingCommentBlock(node);
-
-    if (rawValue !== undefined) {
-      return dedentBlockStringValue('\n' + rawValue);
-    }
-  }
-}
-
-function getLeadingCommentBlock(node) {
-  var loc = node.loc;
-
-  if (!loc) {
-    return;
-  }
-
-  var comments = [];
-  var token = loc.startToken.prev;
-
-  while (token != null && token.kind === TokenKind.COMMENT && token.next && token.prev && token.line + 1 === token.next.line && token.line !== token.prev.line) {
-    var value = String(token.value);
-    comments.push(value);
-    token = token.prev;
-  }
-
-  return comments.length > 0 ? comments.reverse().join('\n') : undefined;
-}
diff --git a/node_modules/graphql/utilities/findBreakingChanges.d.ts b/node_modules/graphql/utilities/findBreakingChanges.d.ts
deleted file mode 100644
index 37297e2..0000000
--- a/node_modules/graphql/utilities/findBreakingChanges.d.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { GraphQLSchema } from '../type/schema';
-
-export const BreakingChangeType: _BreakingChangeType;
-
-/**
- * @internal
- */
-type _BreakingChangeType = {
-  TYPE_REMOVED: 'TYPE_REMOVED';
-  TYPE_CHANGED_KIND: 'TYPE_CHANGED_KIND';
-  TYPE_REMOVED_FROM_UNION: 'TYPE_REMOVED_FROM_UNION';
-  VALUE_REMOVED_FROM_ENUM: 'VALUE_REMOVED_FROM_ENUM';
-  REQUIRED_INPUT_FIELD_ADDED: 'REQUIRED_INPUT_FIELD_ADDED';
-  INTERFACE_REMOVED_FROM_OBJECT: 'INTERFACE_REMOVED_FROM_OBJECT';
-  FIELD_REMOVED: 'FIELD_REMOVED';
-  FIELD_CHANGED_KIND: 'FIELD_CHANGED_KIND';
-  REQUIRED_ARG_ADDED: 'REQUIRED_ARG_ADDED';
-  ARG_REMOVED: 'ARG_REMOVED';
-  ARG_CHANGED_KIND: 'ARG_CHANGED_KIND';
-  DIRECTIVE_REMOVED: 'DIRECTIVE_REMOVED';
-  DIRECTIVE_ARG_REMOVED: 'DIRECTIVE_ARG_REMOVED';
-  REQUIRED_DIRECTIVE_ARG_ADDED: 'REQUIRED_DIRECTIVE_ARG_ADDED';
-  DIRECTIVE_REPEATABLE_REMOVED: 'DIRECTIVE_REPEATABLE_REMOVED';
-  DIRECTIVE_LOCATION_REMOVED: 'DIRECTIVE_LOCATION_REMOVED';
-};
-
-export const DangerousChangeType: _DangerousChangeType;
-
-/**
- * @internal
- */
-type _DangerousChangeType = {
-  VALUE_ADDED_TO_ENUM: 'VALUE_ADDED_TO_ENUM';
-  TYPE_ADDED_TO_UNION: 'TYPE_ADDED_TO_UNION';
-  OPTIONAL_INPUT_FIELD_ADDED: 'OPTIONAL_INPUT_FIELD_ADDED';
-  OPTIONAL_ARG_ADDED: 'OPTIONAL_ARG_ADDED';
-  INTERFACE_ADDED_TO_OBJECT: 'INTERFACE_ADDED_TO_OBJECT';
-  ARG_DEFAULT_VALUE_CHANGE: 'ARG_DEFAULT_VALUE_CHANGE';
-};
-
-export interface BreakingChange {
-  type: keyof _BreakingChangeType;
-  description: string;
-}
-
-export interface DangerousChange {
-  type: keyof _DangerousChangeType;
-  description: string;
-}
-
-/**
- * Given two schemas, returns an Array containing descriptions of all the types
- * of breaking changes covered by the other functions down below.
- */
-export function findBreakingChanges(
-  oldSchema: GraphQLSchema,
-  newSchema: GraphQLSchema,
-): Array<BreakingChange>;
-
-/**
- * Given two schemas, returns an Array containing descriptions of all the types
- * of potentially dangerous changes covered by the other functions down below.
- */
-export function findDangerousChanges(
-  oldSchema: GraphQLSchema,
-  newSchema: GraphQLSchema,
-): Array<DangerousChange>;
diff --git a/node_modules/graphql/utilities/findBreakingChanges.js b/node_modules/graphql/utilities/findBreakingChanges.js
deleted file mode 100644
index 6f7d2b5..0000000
--- a/node_modules/graphql/utilities/findBreakingChanges.js
+++ /dev/null
@@ -1,521 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.findBreakingChanges = findBreakingChanges;
-exports.findDangerousChanges = findDangerousChanges;
-exports.DangerousChangeType = exports.BreakingChangeType = void 0;
-
-var _objectValues = _interopRequireDefault(require("../polyfills/objectValues"));
-
-var _keyMap = _interopRequireDefault(require("../jsutils/keyMap"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _invariant = _interopRequireDefault(require("../jsutils/invariant"));
-
-var _printer = require("../language/printer");
-
-var _visitor = require("../language/visitor");
-
-var _scalars = require("../type/scalars");
-
-var _definition = require("../type/definition");
-
-var _astFromValue = require("./astFromValue");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var BreakingChangeType = Object.freeze({
-  TYPE_REMOVED: 'TYPE_REMOVED',
-  TYPE_CHANGED_KIND: 'TYPE_CHANGED_KIND',
-  TYPE_REMOVED_FROM_UNION: 'TYPE_REMOVED_FROM_UNION',
-  VALUE_REMOVED_FROM_ENUM: 'VALUE_REMOVED_FROM_ENUM',
-  REQUIRED_INPUT_FIELD_ADDED: 'REQUIRED_INPUT_FIELD_ADDED',
-  IMPLEMENTED_INTERFACE_REMOVED: 'IMPLEMENTED_INTERFACE_REMOVED',
-  FIELD_REMOVED: 'FIELD_REMOVED',
-  FIELD_CHANGED_KIND: 'FIELD_CHANGED_KIND',
-  REQUIRED_ARG_ADDED: 'REQUIRED_ARG_ADDED',
-  ARG_REMOVED: 'ARG_REMOVED',
-  ARG_CHANGED_KIND: 'ARG_CHANGED_KIND',
-  DIRECTIVE_REMOVED: 'DIRECTIVE_REMOVED',
-  DIRECTIVE_ARG_REMOVED: 'DIRECTIVE_ARG_REMOVED',
-  REQUIRED_DIRECTIVE_ARG_ADDED: 'REQUIRED_DIRECTIVE_ARG_ADDED',
-  DIRECTIVE_REPEATABLE_REMOVED: 'DIRECTIVE_REPEATABLE_REMOVED',
-  DIRECTIVE_LOCATION_REMOVED: 'DIRECTIVE_LOCATION_REMOVED'
-});
-exports.BreakingChangeType = BreakingChangeType;
-var DangerousChangeType = Object.freeze({
-  VALUE_ADDED_TO_ENUM: 'VALUE_ADDED_TO_ENUM',
-  TYPE_ADDED_TO_UNION: 'TYPE_ADDED_TO_UNION',
-  OPTIONAL_INPUT_FIELD_ADDED: 'OPTIONAL_INPUT_FIELD_ADDED',
-  OPTIONAL_ARG_ADDED: 'OPTIONAL_ARG_ADDED',
-  IMPLEMENTED_INTERFACE_ADDED: 'IMPLEMENTED_INTERFACE_ADDED',
-  ARG_DEFAULT_VALUE_CHANGE: 'ARG_DEFAULT_VALUE_CHANGE'
-});
-exports.DangerousChangeType = DangerousChangeType;
-
-/**
- * Given two schemas, returns an Array containing descriptions of all the types
- * of breaking changes covered by the other functions down below.
- */
-function findBreakingChanges(oldSchema, newSchema) {
-  var breakingChanges = findSchemaChanges(oldSchema, newSchema).filter(function (change) {
-    return change.type in BreakingChangeType;
-  });
-  return breakingChanges;
-}
-/**
- * Given two schemas, returns an Array containing descriptions of all the types
- * of potentially dangerous changes covered by the other functions down below.
- */
-
-
-function findDangerousChanges(oldSchema, newSchema) {
-  var dangerousChanges = findSchemaChanges(oldSchema, newSchema).filter(function (change) {
-    return change.type in DangerousChangeType;
-  });
-  return dangerousChanges;
-}
-
-function findSchemaChanges(oldSchema, newSchema) {
-  return [].concat(findTypeChanges(oldSchema, newSchema), findDirectiveChanges(oldSchema, newSchema));
-}
-
-function findDirectiveChanges(oldSchema, newSchema) {
-  var schemaChanges = [];
-  var directivesDiff = diff(oldSchema.getDirectives(), newSchema.getDirectives());
-
-  for (var _i2 = 0, _directivesDiff$remov2 = directivesDiff.removed; _i2 < _directivesDiff$remov2.length; _i2++) {
-    var oldDirective = _directivesDiff$remov2[_i2];
-    schemaChanges.push({
-      type: BreakingChangeType.DIRECTIVE_REMOVED,
-      description: "".concat(oldDirective.name, " was removed.")
-    });
-  }
-
-  for (var _i4 = 0, _directivesDiff$persi2 = directivesDiff.persisted; _i4 < _directivesDiff$persi2.length; _i4++) {
-    var _ref2 = _directivesDiff$persi2[_i4];
-    var _oldDirective = _ref2[0];
-    var newDirective = _ref2[1];
-    var argsDiff = diff(_oldDirective.args, newDirective.args);
-
-    for (var _i6 = 0, _argsDiff$added2 = argsDiff.added; _i6 < _argsDiff$added2.length; _i6++) {
-      var newArg = _argsDiff$added2[_i6];
-
-      if ((0, _definition.isRequiredArgument)(newArg)) {
-        schemaChanges.push({
-          type: BreakingChangeType.REQUIRED_DIRECTIVE_ARG_ADDED,
-          description: "A required arg ".concat(newArg.name, " on directive ").concat(_oldDirective.name, " was added.")
-        });
-      }
-    }
-
-    for (var _i8 = 0, _argsDiff$removed2 = argsDiff.removed; _i8 < _argsDiff$removed2.length; _i8++) {
-      var oldArg = _argsDiff$removed2[_i8];
-      schemaChanges.push({
-        type: BreakingChangeType.DIRECTIVE_ARG_REMOVED,
-        description: "".concat(oldArg.name, " was removed from ").concat(_oldDirective.name, ".")
-      });
-    }
-
-    if (_oldDirective.isRepeatable && !newDirective.isRepeatable) {
-      schemaChanges.push({
-        type: BreakingChangeType.DIRECTIVE_REPEATABLE_REMOVED,
-        description: "Repeatable flag was removed from ".concat(_oldDirective.name, ".")
-      });
-    }
-
-    for (var _i10 = 0, _oldDirective$locatio2 = _oldDirective.locations; _i10 < _oldDirective$locatio2.length; _i10++) {
-      var location = _oldDirective$locatio2[_i10];
-
-      if (newDirective.locations.indexOf(location) === -1) {
-        schemaChanges.push({
-          type: BreakingChangeType.DIRECTIVE_LOCATION_REMOVED,
-          description: "".concat(location, " was removed from ").concat(_oldDirective.name, ".")
-        });
-      }
-    }
-  }
-
-  return schemaChanges;
-}
-
-function findTypeChanges(oldSchema, newSchema) {
-  var schemaChanges = [];
-  var typesDiff = diff((0, _objectValues.default)(oldSchema.getTypeMap()), (0, _objectValues.default)(newSchema.getTypeMap()));
-
-  for (var _i12 = 0, _typesDiff$removed2 = typesDiff.removed; _i12 < _typesDiff$removed2.length; _i12++) {
-    var oldType = _typesDiff$removed2[_i12];
-    schemaChanges.push({
-      type: BreakingChangeType.TYPE_REMOVED,
-      description: (0, _scalars.isSpecifiedScalarType)(oldType) ? "Standard scalar ".concat(oldType.name, " was removed because it is not referenced anymore.") : "".concat(oldType.name, " was removed.")
-    });
-  }
-
-  for (var _i14 = 0, _typesDiff$persisted2 = typesDiff.persisted; _i14 < _typesDiff$persisted2.length; _i14++) {
-    var _ref4 = _typesDiff$persisted2[_i14];
-    var _oldType = _ref4[0];
-    var newType = _ref4[1];
-
-    if ((0, _definition.isEnumType)(_oldType) && (0, _definition.isEnumType)(newType)) {
-      schemaChanges.push.apply(schemaChanges, findEnumTypeChanges(_oldType, newType));
-    } else if ((0, _definition.isUnionType)(_oldType) && (0, _definition.isUnionType)(newType)) {
-      schemaChanges.push.apply(schemaChanges, findUnionTypeChanges(_oldType, newType));
-    } else if ((0, _definition.isInputObjectType)(_oldType) && (0, _definition.isInputObjectType)(newType)) {
-      schemaChanges.push.apply(schemaChanges, findInputObjectTypeChanges(_oldType, newType));
-    } else if ((0, _definition.isObjectType)(_oldType) && (0, _definition.isObjectType)(newType)) {
-      schemaChanges.push.apply(schemaChanges, findFieldChanges(_oldType, newType).concat(findImplementedInterfacesChanges(_oldType, newType)));
-    } else if ((0, _definition.isInterfaceType)(_oldType) && (0, _definition.isInterfaceType)(newType)) {
-      schemaChanges.push.apply(schemaChanges, findFieldChanges(_oldType, newType).concat(findImplementedInterfacesChanges(_oldType, newType)));
-    } else if (_oldType.constructor !== newType.constructor) {
-      schemaChanges.push({
-        type: BreakingChangeType.TYPE_CHANGED_KIND,
-        description: "".concat(_oldType.name, " changed from ") + "".concat(typeKindName(_oldType), " to ").concat(typeKindName(newType), ".")
-      });
-    }
-  }
-
-  return schemaChanges;
-}
-
-function findInputObjectTypeChanges(oldType, newType) {
-  var schemaChanges = [];
-  var fieldsDiff = diff((0, _objectValues.default)(oldType.getFields()), (0, _objectValues.default)(newType.getFields()));
-
-  for (var _i16 = 0, _fieldsDiff$added2 = fieldsDiff.added; _i16 < _fieldsDiff$added2.length; _i16++) {
-    var newField = _fieldsDiff$added2[_i16];
-
-    if ((0, _definition.isRequiredInputField)(newField)) {
-      schemaChanges.push({
-        type: BreakingChangeType.REQUIRED_INPUT_FIELD_ADDED,
-        description: "A required field ".concat(newField.name, " on input type ").concat(oldType.name, " was added.")
-      });
-    } else {
-      schemaChanges.push({
-        type: DangerousChangeType.OPTIONAL_INPUT_FIELD_ADDED,
-        description: "An optional field ".concat(newField.name, " on input type ").concat(oldType.name, " was added.")
-      });
-    }
-  }
-
-  for (var _i18 = 0, _fieldsDiff$removed2 = fieldsDiff.removed; _i18 < _fieldsDiff$removed2.length; _i18++) {
-    var oldField = _fieldsDiff$removed2[_i18];
-    schemaChanges.push({
-      type: BreakingChangeType.FIELD_REMOVED,
-      description: "".concat(oldType.name, ".").concat(oldField.name, " was removed.")
-    });
-  }
-
-  for (var _i20 = 0, _fieldsDiff$persisted2 = fieldsDiff.persisted; _i20 < _fieldsDiff$persisted2.length; _i20++) {
-    var _ref6 = _fieldsDiff$persisted2[_i20];
-    var _oldField = _ref6[0];
-    var _newField = _ref6[1];
-    var isSafe = isChangeSafeForInputObjectFieldOrFieldArg(_oldField.type, _newField.type);
-
-    if (!isSafe) {
-      schemaChanges.push({
-        type: BreakingChangeType.FIELD_CHANGED_KIND,
-        description: "".concat(oldType.name, ".").concat(_oldField.name, " changed type from ") + "".concat(String(_oldField.type), " to ").concat(String(_newField.type), ".")
-      });
-    }
-  }
-
-  return schemaChanges;
-}
-
-function findUnionTypeChanges(oldType, newType) {
-  var schemaChanges = [];
-  var possibleTypesDiff = diff(oldType.getTypes(), newType.getTypes());
-
-  for (var _i22 = 0, _possibleTypesDiff$ad2 = possibleTypesDiff.added; _i22 < _possibleTypesDiff$ad2.length; _i22++) {
-    var newPossibleType = _possibleTypesDiff$ad2[_i22];
-    schemaChanges.push({
-      type: DangerousChangeType.TYPE_ADDED_TO_UNION,
-      description: "".concat(newPossibleType.name, " was added to union type ").concat(oldType.name, ".")
-    });
-  }
-
-  for (var _i24 = 0, _possibleTypesDiff$re2 = possibleTypesDiff.removed; _i24 < _possibleTypesDiff$re2.length; _i24++) {
-    var oldPossibleType = _possibleTypesDiff$re2[_i24];
-    schemaChanges.push({
-      type: BreakingChangeType.TYPE_REMOVED_FROM_UNION,
-      description: "".concat(oldPossibleType.name, " was removed from union type ").concat(oldType.name, ".")
-    });
-  }
-
-  return schemaChanges;
-}
-
-function findEnumTypeChanges(oldType, newType) {
-  var schemaChanges = [];
-  var valuesDiff = diff(oldType.getValues(), newType.getValues());
-
-  for (var _i26 = 0, _valuesDiff$added2 = valuesDiff.added; _i26 < _valuesDiff$added2.length; _i26++) {
-    var newValue = _valuesDiff$added2[_i26];
-    schemaChanges.push({
-      type: DangerousChangeType.VALUE_ADDED_TO_ENUM,
-      description: "".concat(newValue.name, " was added to enum type ").concat(oldType.name, ".")
-    });
-  }
-
-  for (var _i28 = 0, _valuesDiff$removed2 = valuesDiff.removed; _i28 < _valuesDiff$removed2.length; _i28++) {
-    var oldValue = _valuesDiff$removed2[_i28];
-    schemaChanges.push({
-      type: BreakingChangeType.VALUE_REMOVED_FROM_ENUM,
-      description: "".concat(oldValue.name, " was removed from enum type ").concat(oldType.name, ".")
-    });
-  }
-
-  return schemaChanges;
-}
-
-function findImplementedInterfacesChanges(oldType, newType) {
-  var schemaChanges = [];
-  var interfacesDiff = diff(oldType.getInterfaces(), newType.getInterfaces());
-
-  for (var _i30 = 0, _interfacesDiff$added2 = interfacesDiff.added; _i30 < _interfacesDiff$added2.length; _i30++) {
-    var newInterface = _interfacesDiff$added2[_i30];
-    schemaChanges.push({
-      type: DangerousChangeType.IMPLEMENTED_INTERFACE_ADDED,
-      description: "".concat(newInterface.name, " added to interfaces implemented by ").concat(oldType.name, ".")
-    });
-  }
-
-  for (var _i32 = 0, _interfacesDiff$remov2 = interfacesDiff.removed; _i32 < _interfacesDiff$remov2.length; _i32++) {
-    var oldInterface = _interfacesDiff$remov2[_i32];
-    schemaChanges.push({
-      type: BreakingChangeType.IMPLEMENTED_INTERFACE_REMOVED,
-      description: "".concat(oldType.name, " no longer implements interface ").concat(oldInterface.name, ".")
-    });
-  }
-
-  return schemaChanges;
-}
-
-function findFieldChanges(oldType, newType) {
-  var schemaChanges = [];
-  var fieldsDiff = diff((0, _objectValues.default)(oldType.getFields()), (0, _objectValues.default)(newType.getFields()));
-
-  for (var _i34 = 0, _fieldsDiff$removed4 = fieldsDiff.removed; _i34 < _fieldsDiff$removed4.length; _i34++) {
-    var oldField = _fieldsDiff$removed4[_i34];
-    schemaChanges.push({
-      type: BreakingChangeType.FIELD_REMOVED,
-      description: "".concat(oldType.name, ".").concat(oldField.name, " was removed.")
-    });
-  }
-
-  for (var _i36 = 0, _fieldsDiff$persisted4 = fieldsDiff.persisted; _i36 < _fieldsDiff$persisted4.length; _i36++) {
-    var _ref8 = _fieldsDiff$persisted4[_i36];
-    var _oldField2 = _ref8[0];
-    var newField = _ref8[1];
-    schemaChanges.push.apply(schemaChanges, findArgChanges(oldType, _oldField2, newField));
-    var isSafe = isChangeSafeForObjectOrInterfaceField(_oldField2.type, newField.type);
-
-    if (!isSafe) {
-      schemaChanges.push({
-        type: BreakingChangeType.FIELD_CHANGED_KIND,
-        description: "".concat(oldType.name, ".").concat(_oldField2.name, " changed type from ") + "".concat(String(_oldField2.type), " to ").concat(String(newField.type), ".")
-      });
-    }
-  }
-
-  return schemaChanges;
-}
-
-function findArgChanges(oldType, oldField, newField) {
-  var schemaChanges = [];
-  var argsDiff = diff(oldField.args, newField.args);
-
-  for (var _i38 = 0, _argsDiff$removed4 = argsDiff.removed; _i38 < _argsDiff$removed4.length; _i38++) {
-    var oldArg = _argsDiff$removed4[_i38];
-    schemaChanges.push({
-      type: BreakingChangeType.ARG_REMOVED,
-      description: "".concat(oldType.name, ".").concat(oldField.name, " arg ").concat(oldArg.name, " was removed.")
-    });
-  }
-
-  for (var _i40 = 0, _argsDiff$persisted2 = argsDiff.persisted; _i40 < _argsDiff$persisted2.length; _i40++) {
-    var _ref10 = _argsDiff$persisted2[_i40];
-    var _oldArg = _ref10[0];
-    var newArg = _ref10[1];
-    var isSafe = isChangeSafeForInputObjectFieldOrFieldArg(_oldArg.type, newArg.type);
-
-    if (!isSafe) {
-      schemaChanges.push({
-        type: BreakingChangeType.ARG_CHANGED_KIND,
-        description: "".concat(oldType.name, ".").concat(oldField.name, " arg ").concat(_oldArg.name, " has changed type from ") + "".concat(String(_oldArg.type), " to ").concat(String(newArg.type), ".")
-      });
-    } else if (_oldArg.defaultValue !== undefined) {
-      if (newArg.defaultValue === undefined) {
-        schemaChanges.push({
-          type: DangerousChangeType.ARG_DEFAULT_VALUE_CHANGE,
-          description: "".concat(oldType.name, ".").concat(oldField.name, " arg ").concat(_oldArg.name, " defaultValue was removed.")
-        });
-      } else {
-        // Since we looking only for client's observable changes we should
-        // compare default values in the same representation as they are
-        // represented inside introspection.
-        var oldValueStr = stringifyValue(_oldArg.defaultValue, _oldArg.type);
-        var newValueStr = stringifyValue(newArg.defaultValue, newArg.type);
-
-        if (oldValueStr !== newValueStr) {
-          schemaChanges.push({
-            type: DangerousChangeType.ARG_DEFAULT_VALUE_CHANGE,
-            description: "".concat(oldType.name, ".").concat(oldField.name, " arg ").concat(_oldArg.name, " has changed defaultValue from ").concat(oldValueStr, " to ").concat(newValueStr, ".")
-          });
-        }
-      }
-    }
-  }
-
-  for (var _i42 = 0, _argsDiff$added4 = argsDiff.added; _i42 < _argsDiff$added4.length; _i42++) {
-    var _newArg = _argsDiff$added4[_i42];
-
-    if ((0, _definition.isRequiredArgument)(_newArg)) {
-      schemaChanges.push({
-        type: BreakingChangeType.REQUIRED_ARG_ADDED,
-        description: "A required arg ".concat(_newArg.name, " on ").concat(oldType.name, ".").concat(oldField.name, " was added.")
-      });
-    } else {
-      schemaChanges.push({
-        type: DangerousChangeType.OPTIONAL_ARG_ADDED,
-        description: "An optional arg ".concat(_newArg.name, " on ").concat(oldType.name, ".").concat(oldField.name, " was added.")
-      });
-    }
-  }
-
-  return schemaChanges;
-}
-
-function isChangeSafeForObjectOrInterfaceField(oldType, newType) {
-  if ((0, _definition.isListType)(oldType)) {
-    return (// if they're both lists, make sure the underlying types are compatible
-      (0, _definition.isListType)(newType) && isChangeSafeForObjectOrInterfaceField(oldType.ofType, newType.ofType) || // moving from nullable to non-null of the same underlying type is safe
-      (0, _definition.isNonNullType)(newType) && isChangeSafeForObjectOrInterfaceField(oldType, newType.ofType)
-    );
-  }
-
-  if ((0, _definition.isNonNullType)(oldType)) {
-    // if they're both non-null, make sure the underlying types are compatible
-    return (0, _definition.isNonNullType)(newType) && isChangeSafeForObjectOrInterfaceField(oldType.ofType, newType.ofType);
-  }
-
-  return (// if they're both named types, see if their names are equivalent
-    (0, _definition.isNamedType)(newType) && oldType.name === newType.name || // moving from nullable to non-null of the same underlying type is safe
-    (0, _definition.isNonNullType)(newType) && isChangeSafeForObjectOrInterfaceField(oldType, newType.ofType)
-  );
-}
-
-function isChangeSafeForInputObjectFieldOrFieldArg(oldType, newType) {
-  if ((0, _definition.isListType)(oldType)) {
-    // if they're both lists, make sure the underlying types are compatible
-    return (0, _definition.isListType)(newType) && isChangeSafeForInputObjectFieldOrFieldArg(oldType.ofType, newType.ofType);
-  }
-
-  if ((0, _definition.isNonNullType)(oldType)) {
-    return (// if they're both non-null, make sure the underlying types are
-      // compatible
-      (0, _definition.isNonNullType)(newType) && isChangeSafeForInputObjectFieldOrFieldArg(oldType.ofType, newType.ofType) || // moving from non-null to nullable of the same underlying type is safe
-      !(0, _definition.isNonNullType)(newType) && isChangeSafeForInputObjectFieldOrFieldArg(oldType.ofType, newType)
-    );
-  } // if they're both named types, see if their names are equivalent
-
-
-  return (0, _definition.isNamedType)(newType) && oldType.name === newType.name;
-}
-
-function typeKindName(type) {
-  if ((0, _definition.isScalarType)(type)) {
-    return 'a Scalar type';
-  }
-
-  if ((0, _definition.isObjectType)(type)) {
-    return 'an Object type';
-  }
-
-  if ((0, _definition.isInterfaceType)(type)) {
-    return 'an Interface type';
-  }
-
-  if ((0, _definition.isUnionType)(type)) {
-    return 'a Union type';
-  }
-
-  if ((0, _definition.isEnumType)(type)) {
-    return 'an Enum type';
-  }
-
-  /* istanbul ignore else */
-  if ((0, _definition.isInputObjectType)(type)) {
-    return 'an Input type';
-  } // Not reachable. All possible named types have been considered.
-
-
-  /* istanbul ignore next */
-  (0, _invariant.default)(false, 'Unexpected type: ' + (0, _inspect.default)(type));
-}
-
-function stringifyValue(value, type) {
-  var ast = (0, _astFromValue.astFromValue)(value, type);
-
-  /* istanbul ignore next */
-  ast != null || (0, _invariant.default)(0);
-  var sortedAST = (0, _visitor.visit)(ast, {
-    ObjectValue: function ObjectValue(objectNode) {
-      var fields = [].concat(objectNode.fields).sort(function (fieldA, fieldB) {
-        return fieldA.name.value.localeCompare(fieldB.name.value);
-      });
-      return _objectSpread({}, objectNode, {
-        fields: fields
-      });
-    }
-  });
-  return (0, _printer.print)(sortedAST);
-}
-
-function diff(oldArray, newArray) {
-  var added = [];
-  var removed = [];
-  var persisted = [];
-  var oldMap = (0, _keyMap.default)(oldArray, function (_ref11) {
-    var name = _ref11.name;
-    return name;
-  });
-  var newMap = (0, _keyMap.default)(newArray, function (_ref12) {
-    var name = _ref12.name;
-    return name;
-  });
-
-  for (var _i44 = 0; _i44 < oldArray.length; _i44++) {
-    var oldItem = oldArray[_i44];
-    var newItem = newMap[oldItem.name];
-
-    if (newItem === undefined) {
-      removed.push(oldItem);
-    } else {
-      persisted.push([oldItem, newItem]);
-    }
-  }
-
-  for (var _i46 = 0; _i46 < newArray.length; _i46++) {
-    var _newItem = newArray[_i46];
-
-    if (oldMap[_newItem.name] === undefined) {
-      added.push(_newItem);
-    }
-  }
-
-  return {
-    added: added,
-    persisted: persisted,
-    removed: removed
-  };
-}
diff --git a/node_modules/graphql/utilities/findBreakingChanges.js.flow b/node_modules/graphql/utilities/findBreakingChanges.js.flow
deleted file mode 100644
index ab566d4..0000000
--- a/node_modules/graphql/utilities/findBreakingChanges.js.flow
+++ /dev/null
@@ -1,584 +0,0 @@
-// @flow strict
-
-import objectValues from '../polyfills/objectValues';
-
-import keyMap from '../jsutils/keyMap';
-import inspect from '../jsutils/inspect';
-import invariant from '../jsutils/invariant';
-
-import { print } from '../language/printer';
-import { visit } from '../language/visitor';
-
-import { type GraphQLSchema } from '../type/schema';
-import { isSpecifiedScalarType } from '../type/scalars';
-import {
-  type GraphQLField,
-  type GraphQLType,
-  type GraphQLInputType,
-  type GraphQLNamedType,
-  type GraphQLEnumType,
-  type GraphQLUnionType,
-  type GraphQLObjectType,
-  type GraphQLInterfaceType,
-  type GraphQLInputObjectType,
-  isScalarType,
-  isObjectType,
-  isInterfaceType,
-  isUnionType,
-  isEnumType,
-  isInputObjectType,
-  isNonNullType,
-  isListType,
-  isNamedType,
-  isRequiredArgument,
-  isRequiredInputField,
-} from '../type/definition';
-
-import { astFromValue } from './astFromValue';
-
-export const BreakingChangeType = Object.freeze({
-  TYPE_REMOVED: 'TYPE_REMOVED',
-  TYPE_CHANGED_KIND: 'TYPE_CHANGED_KIND',
-  TYPE_REMOVED_FROM_UNION: 'TYPE_REMOVED_FROM_UNION',
-  VALUE_REMOVED_FROM_ENUM: 'VALUE_REMOVED_FROM_ENUM',
-  REQUIRED_INPUT_FIELD_ADDED: 'REQUIRED_INPUT_FIELD_ADDED',
-  IMPLEMENTED_INTERFACE_REMOVED: 'IMPLEMENTED_INTERFACE_REMOVED',
-  FIELD_REMOVED: 'FIELD_REMOVED',
-  FIELD_CHANGED_KIND: 'FIELD_CHANGED_KIND',
-  REQUIRED_ARG_ADDED: 'REQUIRED_ARG_ADDED',
-  ARG_REMOVED: 'ARG_REMOVED',
-  ARG_CHANGED_KIND: 'ARG_CHANGED_KIND',
-  DIRECTIVE_REMOVED: 'DIRECTIVE_REMOVED',
-  DIRECTIVE_ARG_REMOVED: 'DIRECTIVE_ARG_REMOVED',
-  REQUIRED_DIRECTIVE_ARG_ADDED: 'REQUIRED_DIRECTIVE_ARG_ADDED',
-  DIRECTIVE_REPEATABLE_REMOVED: 'DIRECTIVE_REPEATABLE_REMOVED',
-  DIRECTIVE_LOCATION_REMOVED: 'DIRECTIVE_LOCATION_REMOVED',
-});
-
-export const DangerousChangeType = Object.freeze({
-  VALUE_ADDED_TO_ENUM: 'VALUE_ADDED_TO_ENUM',
-  TYPE_ADDED_TO_UNION: 'TYPE_ADDED_TO_UNION',
-  OPTIONAL_INPUT_FIELD_ADDED: 'OPTIONAL_INPUT_FIELD_ADDED',
-  OPTIONAL_ARG_ADDED: 'OPTIONAL_ARG_ADDED',
-  IMPLEMENTED_INTERFACE_ADDED: 'IMPLEMENTED_INTERFACE_ADDED',
-  ARG_DEFAULT_VALUE_CHANGE: 'ARG_DEFAULT_VALUE_CHANGE',
-});
-
-export type BreakingChange = {|
-  type: $Keys<typeof BreakingChangeType>,
-  description: string,
-|};
-
-export type DangerousChange = {|
-  type: $Keys<typeof DangerousChangeType>,
-  description: string,
-|};
-
-/**
- * Given two schemas, returns an Array containing descriptions of all the types
- * of breaking changes covered by the other functions down below.
- */
-export function findBreakingChanges(
-  oldSchema: GraphQLSchema,
-  newSchema: GraphQLSchema,
-): Array<BreakingChange> {
-  const breakingChanges = findSchemaChanges(oldSchema, newSchema).filter(
-    change => change.type in BreakingChangeType,
-  );
-  return ((breakingChanges: any): Array<BreakingChange>);
-}
-
-/**
- * Given two schemas, returns an Array containing descriptions of all the types
- * of potentially dangerous changes covered by the other functions down below.
- */
-export function findDangerousChanges(
-  oldSchema: GraphQLSchema,
-  newSchema: GraphQLSchema,
-): Array<DangerousChange> {
-  const dangerousChanges = findSchemaChanges(oldSchema, newSchema).filter(
-    change => change.type in DangerousChangeType,
-  );
-  return ((dangerousChanges: any): Array<DangerousChange>);
-}
-
-function findSchemaChanges(
-  oldSchema: GraphQLSchema,
-  newSchema: GraphQLSchema,
-): Array<BreakingChange | DangerousChange> {
-  return [
-    ...findTypeChanges(oldSchema, newSchema),
-    ...findDirectiveChanges(oldSchema, newSchema),
-  ];
-}
-
-function findDirectiveChanges(
-  oldSchema: GraphQLSchema,
-  newSchema: GraphQLSchema,
-): Array<BreakingChange | DangerousChange> {
-  const schemaChanges = [];
-
-  const directivesDiff = diff(
-    oldSchema.getDirectives(),
-    newSchema.getDirectives(),
-  );
-
-  for (const oldDirective of directivesDiff.removed) {
-    schemaChanges.push({
-      type: BreakingChangeType.DIRECTIVE_REMOVED,
-      description: `${oldDirective.name} was removed.`,
-    });
-  }
-
-  for (const [oldDirective, newDirective] of directivesDiff.persisted) {
-    const argsDiff = diff(oldDirective.args, newDirective.args);
-
-    for (const newArg of argsDiff.added) {
-      if (isRequiredArgument(newArg)) {
-        schemaChanges.push({
-          type: BreakingChangeType.REQUIRED_DIRECTIVE_ARG_ADDED,
-          description: `A required arg ${newArg.name} on directive ${oldDirective.name} was added.`,
-        });
-      }
-    }
-
-    for (const oldArg of argsDiff.removed) {
-      schemaChanges.push({
-        type: BreakingChangeType.DIRECTIVE_ARG_REMOVED,
-        description: `${oldArg.name} was removed from ${oldDirective.name}.`,
-      });
-    }
-
-    if (oldDirective.isRepeatable && !newDirective.isRepeatable) {
-      schemaChanges.push({
-        type: BreakingChangeType.DIRECTIVE_REPEATABLE_REMOVED,
-        description: `Repeatable flag was removed from ${oldDirective.name}.`,
-      });
-    }
-
-    for (const location of oldDirective.locations) {
-      if (newDirective.locations.indexOf(location) === -1) {
-        schemaChanges.push({
-          type: BreakingChangeType.DIRECTIVE_LOCATION_REMOVED,
-          description: `${location} was removed from ${oldDirective.name}.`,
-        });
-      }
-    }
-  }
-
-  return schemaChanges;
-}
-
-function findTypeChanges(
-  oldSchema: GraphQLSchema,
-  newSchema: GraphQLSchema,
-): Array<BreakingChange | DangerousChange> {
-  const schemaChanges = [];
-
-  const typesDiff = diff(
-    objectValues(oldSchema.getTypeMap()),
-    objectValues(newSchema.getTypeMap()),
-  );
-
-  for (const oldType of typesDiff.removed) {
-    schemaChanges.push({
-      type: BreakingChangeType.TYPE_REMOVED,
-      description: isSpecifiedScalarType(oldType)
-        ? `Standard scalar ${oldType.name} was removed because it is not referenced anymore.`
-        : `${oldType.name} was removed.`,
-    });
-  }
-
-  for (const [oldType, newType] of typesDiff.persisted) {
-    if (isEnumType(oldType) && isEnumType(newType)) {
-      schemaChanges.push(...findEnumTypeChanges(oldType, newType));
-    } else if (isUnionType(oldType) && isUnionType(newType)) {
-      schemaChanges.push(...findUnionTypeChanges(oldType, newType));
-    } else if (isInputObjectType(oldType) && isInputObjectType(newType)) {
-      schemaChanges.push(...findInputObjectTypeChanges(oldType, newType));
-    } else if (isObjectType(oldType) && isObjectType(newType)) {
-      schemaChanges.push(
-        ...findFieldChanges(oldType, newType),
-        ...findImplementedInterfacesChanges(oldType, newType),
-      );
-    } else if (isInterfaceType(oldType) && isInterfaceType(newType)) {
-      schemaChanges.push(
-        ...findFieldChanges(oldType, newType),
-        ...findImplementedInterfacesChanges(oldType, newType),
-      );
-    } else if (oldType.constructor !== newType.constructor) {
-      schemaChanges.push({
-        type: BreakingChangeType.TYPE_CHANGED_KIND,
-        description:
-          `${oldType.name} changed from ` +
-          `${typeKindName(oldType)} to ${typeKindName(newType)}.`,
-      });
-    }
-  }
-
-  return schemaChanges;
-}
-
-function findInputObjectTypeChanges(
-  oldType: GraphQLInputObjectType,
-  newType: GraphQLInputObjectType,
-): Array<BreakingChange | DangerousChange> {
-  const schemaChanges = [];
-  const fieldsDiff = diff(
-    objectValues(oldType.getFields()),
-    objectValues(newType.getFields()),
-  );
-
-  for (const newField of fieldsDiff.added) {
-    if (isRequiredInputField(newField)) {
-      schemaChanges.push({
-        type: BreakingChangeType.REQUIRED_INPUT_FIELD_ADDED,
-        description: `A required field ${newField.name} on input type ${oldType.name} was added.`,
-      });
-    } else {
-      schemaChanges.push({
-        type: DangerousChangeType.OPTIONAL_INPUT_FIELD_ADDED,
-        description: `An optional field ${newField.name} on input type ${oldType.name} was added.`,
-      });
-    }
-  }
-
-  for (const oldField of fieldsDiff.removed) {
-    schemaChanges.push({
-      type: BreakingChangeType.FIELD_REMOVED,
-      description: `${oldType.name}.${oldField.name} was removed.`,
-    });
-  }
-
-  for (const [oldField, newField] of fieldsDiff.persisted) {
-    const isSafe = isChangeSafeForInputObjectFieldOrFieldArg(
-      oldField.type,
-      newField.type,
-    );
-    if (!isSafe) {
-      schemaChanges.push({
-        type: BreakingChangeType.FIELD_CHANGED_KIND,
-        description:
-          `${oldType.name}.${oldField.name} changed type from ` +
-          `${String(oldField.type)} to ${String(newField.type)}.`,
-      });
-    }
-  }
-
-  return schemaChanges;
-}
-
-function findUnionTypeChanges(
-  oldType: GraphQLUnionType,
-  newType: GraphQLUnionType,
-): Array<BreakingChange | DangerousChange> {
-  const schemaChanges = [];
-  const possibleTypesDiff = diff(oldType.getTypes(), newType.getTypes());
-
-  for (const newPossibleType of possibleTypesDiff.added) {
-    schemaChanges.push({
-      type: DangerousChangeType.TYPE_ADDED_TO_UNION,
-      description: `${newPossibleType.name} was added to union type ${oldType.name}.`,
-    });
-  }
-
-  for (const oldPossibleType of possibleTypesDiff.removed) {
-    schemaChanges.push({
-      type: BreakingChangeType.TYPE_REMOVED_FROM_UNION,
-      description: `${oldPossibleType.name} was removed from union type ${oldType.name}.`,
-    });
-  }
-
-  return schemaChanges;
-}
-
-function findEnumTypeChanges(
-  oldType: GraphQLEnumType,
-  newType: GraphQLEnumType,
-): Array<BreakingChange | DangerousChange> {
-  const schemaChanges = [];
-  const valuesDiff = diff(oldType.getValues(), newType.getValues());
-
-  for (const newValue of valuesDiff.added) {
-    schemaChanges.push({
-      type: DangerousChangeType.VALUE_ADDED_TO_ENUM,
-      description: `${newValue.name} was added to enum type ${oldType.name}.`,
-    });
-  }
-
-  for (const oldValue of valuesDiff.removed) {
-    schemaChanges.push({
-      type: BreakingChangeType.VALUE_REMOVED_FROM_ENUM,
-      description: `${oldValue.name} was removed from enum type ${oldType.name}.`,
-    });
-  }
-
-  return schemaChanges;
-}
-
-function findImplementedInterfacesChanges(
-  oldType: GraphQLObjectType | GraphQLInterfaceType,
-  newType: GraphQLObjectType | GraphQLInterfaceType,
-): Array<BreakingChange | DangerousChange> {
-  const schemaChanges = [];
-  const interfacesDiff = diff(oldType.getInterfaces(), newType.getInterfaces());
-
-  for (const newInterface of interfacesDiff.added) {
-    schemaChanges.push({
-      type: DangerousChangeType.IMPLEMENTED_INTERFACE_ADDED,
-      description: `${newInterface.name} added to interfaces implemented by ${oldType.name}.`,
-    });
-  }
-
-  for (const oldInterface of interfacesDiff.removed) {
-    schemaChanges.push({
-      type: BreakingChangeType.IMPLEMENTED_INTERFACE_REMOVED,
-      description: `${oldType.name} no longer implements interface ${oldInterface.name}.`,
-    });
-  }
-
-  return schemaChanges;
-}
-
-function findFieldChanges(
-  oldType: GraphQLObjectType | GraphQLInterfaceType,
-  newType: GraphQLObjectType | GraphQLInterfaceType,
-): Array<BreakingChange | DangerousChange> {
-  const schemaChanges = [];
-  const fieldsDiff = diff(
-    objectValues(oldType.getFields()),
-    objectValues(newType.getFields()),
-  );
-
-  for (const oldField of fieldsDiff.removed) {
-    schemaChanges.push({
-      type: BreakingChangeType.FIELD_REMOVED,
-      description: `${oldType.name}.${oldField.name} was removed.`,
-    });
-  }
-
-  for (const [oldField, newField] of fieldsDiff.persisted) {
-    schemaChanges.push(...findArgChanges(oldType, oldField, newField));
-
-    const isSafe = isChangeSafeForObjectOrInterfaceField(
-      oldField.type,
-      newField.type,
-    );
-    if (!isSafe) {
-      schemaChanges.push({
-        type: BreakingChangeType.FIELD_CHANGED_KIND,
-        description:
-          `${oldType.name}.${oldField.name} changed type from ` +
-          `${String(oldField.type)} to ${String(newField.type)}.`,
-      });
-    }
-  }
-
-  return schemaChanges;
-}
-
-function findArgChanges(
-  oldType: GraphQLObjectType | GraphQLInterfaceType,
-  oldField: GraphQLField<mixed, mixed>,
-  newField: GraphQLField<mixed, mixed>,
-): Array<BreakingChange | DangerousChange> {
-  const schemaChanges = [];
-  const argsDiff = diff(oldField.args, newField.args);
-
-  for (const oldArg of argsDiff.removed) {
-    schemaChanges.push({
-      type: BreakingChangeType.ARG_REMOVED,
-      description: `${oldType.name}.${oldField.name} arg ${oldArg.name} was removed.`,
-    });
-  }
-
-  for (const [oldArg, newArg] of argsDiff.persisted) {
-    const isSafe = isChangeSafeForInputObjectFieldOrFieldArg(
-      oldArg.type,
-      newArg.type,
-    );
-    if (!isSafe) {
-      schemaChanges.push({
-        type: BreakingChangeType.ARG_CHANGED_KIND,
-        description:
-          `${oldType.name}.${oldField.name} arg ${oldArg.name} has changed type from ` +
-          `${String(oldArg.type)} to ${String(newArg.type)}.`,
-      });
-    } else if (oldArg.defaultValue !== undefined) {
-      if (newArg.defaultValue === undefined) {
-        schemaChanges.push({
-          type: DangerousChangeType.ARG_DEFAULT_VALUE_CHANGE,
-          description: `${oldType.name}.${oldField.name} arg ${oldArg.name} defaultValue was removed.`,
-        });
-      } else {
-        // Since we looking only for client's observable changes we should
-        // compare default values in the same representation as they are
-        // represented inside introspection.
-        const oldValueStr = stringifyValue(oldArg.defaultValue, oldArg.type);
-        const newValueStr = stringifyValue(newArg.defaultValue, newArg.type);
-
-        if (oldValueStr !== newValueStr) {
-          schemaChanges.push({
-            type: DangerousChangeType.ARG_DEFAULT_VALUE_CHANGE,
-            description: `${oldType.name}.${oldField.name} arg ${oldArg.name} has changed defaultValue from ${oldValueStr} to ${newValueStr}.`,
-          });
-        }
-      }
-    }
-  }
-
-  for (const newArg of argsDiff.added) {
-    if (isRequiredArgument(newArg)) {
-      schemaChanges.push({
-        type: BreakingChangeType.REQUIRED_ARG_ADDED,
-        description: `A required arg ${newArg.name} on ${oldType.name}.${oldField.name} was added.`,
-      });
-    } else {
-      schemaChanges.push({
-        type: DangerousChangeType.OPTIONAL_ARG_ADDED,
-        description: `An optional arg ${newArg.name} on ${oldType.name}.${oldField.name} was added.`,
-      });
-    }
-  }
-
-  return schemaChanges;
-}
-
-function isChangeSafeForObjectOrInterfaceField(
-  oldType: GraphQLType,
-  newType: GraphQLType,
-): boolean {
-  if (isListType(oldType)) {
-    return (
-      // if they're both lists, make sure the underlying types are compatible
-      (isListType(newType) &&
-        isChangeSafeForObjectOrInterfaceField(
-          oldType.ofType,
-          newType.ofType,
-        )) ||
-      // moving from nullable to non-null of the same underlying type is safe
-      (isNonNullType(newType) &&
-        isChangeSafeForObjectOrInterfaceField(oldType, newType.ofType))
-    );
-  }
-
-  if (isNonNullType(oldType)) {
-    // if they're both non-null, make sure the underlying types are compatible
-    return (
-      isNonNullType(newType) &&
-      isChangeSafeForObjectOrInterfaceField(oldType.ofType, newType.ofType)
-    );
-  }
-
-  return (
-    // if they're both named types, see if their names are equivalent
-    (isNamedType(newType) && oldType.name === newType.name) ||
-    // moving from nullable to non-null of the same underlying type is safe
-    (isNonNullType(newType) &&
-      isChangeSafeForObjectOrInterfaceField(oldType, newType.ofType))
-  );
-}
-
-function isChangeSafeForInputObjectFieldOrFieldArg(
-  oldType: GraphQLType,
-  newType: GraphQLType,
-): boolean {
-  if (isListType(oldType)) {
-    // if they're both lists, make sure the underlying types are compatible
-    return (
-      isListType(newType) &&
-      isChangeSafeForInputObjectFieldOrFieldArg(oldType.ofType, newType.ofType)
-    );
-  }
-
-  if (isNonNullType(oldType)) {
-    return (
-      // if they're both non-null, make sure the underlying types are
-      // compatible
-      (isNonNullType(newType) &&
-        isChangeSafeForInputObjectFieldOrFieldArg(
-          oldType.ofType,
-          newType.ofType,
-        )) ||
-      // moving from non-null to nullable of the same underlying type is safe
-      (!isNonNullType(newType) &&
-        isChangeSafeForInputObjectFieldOrFieldArg(oldType.ofType, newType))
-    );
-  }
-
-  // if they're both named types, see if their names are equivalent
-  return isNamedType(newType) && oldType.name === newType.name;
-}
-
-function typeKindName(type: GraphQLNamedType): string {
-  if (isScalarType(type)) {
-    return 'a Scalar type';
-  }
-  if (isObjectType(type)) {
-    return 'an Object type';
-  }
-  if (isInterfaceType(type)) {
-    return 'an Interface type';
-  }
-  if (isUnionType(type)) {
-    return 'a Union type';
-  }
-  if (isEnumType(type)) {
-    return 'an Enum type';
-  }
-  if (isInputObjectType(type)) {
-    return 'an Input type';
-  }
-
-  // Not reachable. All possible named types have been considered.
-  invariant(false, 'Unexpected type: ' + inspect((type: empty)));
-}
-
-function stringifyValue(value: mixed, type: GraphQLInputType): string {
-  const ast = astFromValue(value, type);
-  invariant(ast != null);
-
-  const sortedAST = visit(ast, {
-    ObjectValue(objectNode) {
-      const fields = [...objectNode.fields].sort((fieldA, fieldB) =>
-        fieldA.name.value.localeCompare(fieldB.name.value),
-      );
-      return { ...objectNode, fields };
-    },
-  });
-
-  return print(sortedAST);
-}
-
-function diff<T: { name: string, ... }>(
-  oldArray: $ReadOnlyArray<T>,
-  newArray: $ReadOnlyArray<T>,
-): {|
-  added: Array<T>,
-  removed: Array<T>,
-  persisted: Array<[T, T]>,
-|} {
-  const added = [];
-  const removed = [];
-  const persisted = [];
-
-  const oldMap = keyMap(oldArray, ({ name }) => name);
-  const newMap = keyMap(newArray, ({ name }) => name);
-
-  for (const oldItem of oldArray) {
-    const newItem = newMap[oldItem.name];
-    if (newItem === undefined) {
-      removed.push(oldItem);
-    } else {
-      persisted.push([oldItem, newItem]);
-    }
-  }
-
-  for (const newItem of newArray) {
-    if (oldMap[newItem.name] === undefined) {
-      added.push(newItem);
-    }
-  }
-
-  return { added, persisted, removed };
-}
diff --git a/node_modules/graphql/utilities/findBreakingChanges.mjs b/node_modules/graphql/utilities/findBreakingChanges.mjs
deleted file mode 100644
index 52b00f5..0000000
--- a/node_modules/graphql/utilities/findBreakingChanges.mjs
+++ /dev/null
@@ -1,498 +0,0 @@
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-import objectValues from "../polyfills/objectValues.mjs";
-import keyMap from "../jsutils/keyMap.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import invariant from "../jsutils/invariant.mjs";
-import { print } from "../language/printer.mjs";
-import { visit } from "../language/visitor.mjs";
-import { isSpecifiedScalarType } from "../type/scalars.mjs";
-import { isScalarType, isObjectType, isInterfaceType, isUnionType, isEnumType, isInputObjectType, isNonNullType, isListType, isNamedType, isRequiredArgument, isRequiredInputField } from "../type/definition.mjs";
-import { astFromValue } from "./astFromValue.mjs";
-export var BreakingChangeType = Object.freeze({
-  TYPE_REMOVED: 'TYPE_REMOVED',
-  TYPE_CHANGED_KIND: 'TYPE_CHANGED_KIND',
-  TYPE_REMOVED_FROM_UNION: 'TYPE_REMOVED_FROM_UNION',
-  VALUE_REMOVED_FROM_ENUM: 'VALUE_REMOVED_FROM_ENUM',
-  REQUIRED_INPUT_FIELD_ADDED: 'REQUIRED_INPUT_FIELD_ADDED',
-  IMPLEMENTED_INTERFACE_REMOVED: 'IMPLEMENTED_INTERFACE_REMOVED',
-  FIELD_REMOVED: 'FIELD_REMOVED',
-  FIELD_CHANGED_KIND: 'FIELD_CHANGED_KIND',
-  REQUIRED_ARG_ADDED: 'REQUIRED_ARG_ADDED',
-  ARG_REMOVED: 'ARG_REMOVED',
-  ARG_CHANGED_KIND: 'ARG_CHANGED_KIND',
-  DIRECTIVE_REMOVED: 'DIRECTIVE_REMOVED',
-  DIRECTIVE_ARG_REMOVED: 'DIRECTIVE_ARG_REMOVED',
-  REQUIRED_DIRECTIVE_ARG_ADDED: 'REQUIRED_DIRECTIVE_ARG_ADDED',
-  DIRECTIVE_REPEATABLE_REMOVED: 'DIRECTIVE_REPEATABLE_REMOVED',
-  DIRECTIVE_LOCATION_REMOVED: 'DIRECTIVE_LOCATION_REMOVED'
-});
-export var DangerousChangeType = Object.freeze({
-  VALUE_ADDED_TO_ENUM: 'VALUE_ADDED_TO_ENUM',
-  TYPE_ADDED_TO_UNION: 'TYPE_ADDED_TO_UNION',
-  OPTIONAL_INPUT_FIELD_ADDED: 'OPTIONAL_INPUT_FIELD_ADDED',
-  OPTIONAL_ARG_ADDED: 'OPTIONAL_ARG_ADDED',
-  IMPLEMENTED_INTERFACE_ADDED: 'IMPLEMENTED_INTERFACE_ADDED',
-  ARG_DEFAULT_VALUE_CHANGE: 'ARG_DEFAULT_VALUE_CHANGE'
-});
-
-/**
- * Given two schemas, returns an Array containing descriptions of all the types
- * of breaking changes covered by the other functions down below.
- */
-export function findBreakingChanges(oldSchema, newSchema) {
-  var breakingChanges = findSchemaChanges(oldSchema, newSchema).filter(function (change) {
-    return change.type in BreakingChangeType;
-  });
-  return breakingChanges;
-}
-/**
- * Given two schemas, returns an Array containing descriptions of all the types
- * of potentially dangerous changes covered by the other functions down below.
- */
-
-export function findDangerousChanges(oldSchema, newSchema) {
-  var dangerousChanges = findSchemaChanges(oldSchema, newSchema).filter(function (change) {
-    return change.type in DangerousChangeType;
-  });
-  return dangerousChanges;
-}
-
-function findSchemaChanges(oldSchema, newSchema) {
-  return [].concat(findTypeChanges(oldSchema, newSchema), findDirectiveChanges(oldSchema, newSchema));
-}
-
-function findDirectiveChanges(oldSchema, newSchema) {
-  var schemaChanges = [];
-  var directivesDiff = diff(oldSchema.getDirectives(), newSchema.getDirectives());
-
-  for (var _i2 = 0, _directivesDiff$remov2 = directivesDiff.removed; _i2 < _directivesDiff$remov2.length; _i2++) {
-    var oldDirective = _directivesDiff$remov2[_i2];
-    schemaChanges.push({
-      type: BreakingChangeType.DIRECTIVE_REMOVED,
-      description: "".concat(oldDirective.name, " was removed.")
-    });
-  }
-
-  for (var _i4 = 0, _directivesDiff$persi2 = directivesDiff.persisted; _i4 < _directivesDiff$persi2.length; _i4++) {
-    var _ref2 = _directivesDiff$persi2[_i4];
-    var _oldDirective = _ref2[0];
-    var newDirective = _ref2[1];
-    var argsDiff = diff(_oldDirective.args, newDirective.args);
-
-    for (var _i6 = 0, _argsDiff$added2 = argsDiff.added; _i6 < _argsDiff$added2.length; _i6++) {
-      var newArg = _argsDiff$added2[_i6];
-
-      if (isRequiredArgument(newArg)) {
-        schemaChanges.push({
-          type: BreakingChangeType.REQUIRED_DIRECTIVE_ARG_ADDED,
-          description: "A required arg ".concat(newArg.name, " on directive ").concat(_oldDirective.name, " was added.")
-        });
-      }
-    }
-
-    for (var _i8 = 0, _argsDiff$removed2 = argsDiff.removed; _i8 < _argsDiff$removed2.length; _i8++) {
-      var oldArg = _argsDiff$removed2[_i8];
-      schemaChanges.push({
-        type: BreakingChangeType.DIRECTIVE_ARG_REMOVED,
-        description: "".concat(oldArg.name, " was removed from ").concat(_oldDirective.name, ".")
-      });
-    }
-
-    if (_oldDirective.isRepeatable && !newDirective.isRepeatable) {
-      schemaChanges.push({
-        type: BreakingChangeType.DIRECTIVE_REPEATABLE_REMOVED,
-        description: "Repeatable flag was removed from ".concat(_oldDirective.name, ".")
-      });
-    }
-
-    for (var _i10 = 0, _oldDirective$locatio2 = _oldDirective.locations; _i10 < _oldDirective$locatio2.length; _i10++) {
-      var location = _oldDirective$locatio2[_i10];
-
-      if (newDirective.locations.indexOf(location) === -1) {
-        schemaChanges.push({
-          type: BreakingChangeType.DIRECTIVE_LOCATION_REMOVED,
-          description: "".concat(location, " was removed from ").concat(_oldDirective.name, ".")
-        });
-      }
-    }
-  }
-
-  return schemaChanges;
-}
-
-function findTypeChanges(oldSchema, newSchema) {
-  var schemaChanges = [];
-  var typesDiff = diff(objectValues(oldSchema.getTypeMap()), objectValues(newSchema.getTypeMap()));
-
-  for (var _i12 = 0, _typesDiff$removed2 = typesDiff.removed; _i12 < _typesDiff$removed2.length; _i12++) {
-    var oldType = _typesDiff$removed2[_i12];
-    schemaChanges.push({
-      type: BreakingChangeType.TYPE_REMOVED,
-      description: isSpecifiedScalarType(oldType) ? "Standard scalar ".concat(oldType.name, " was removed because it is not referenced anymore.") : "".concat(oldType.name, " was removed.")
-    });
-  }
-
-  for (var _i14 = 0, _typesDiff$persisted2 = typesDiff.persisted; _i14 < _typesDiff$persisted2.length; _i14++) {
-    var _ref4 = _typesDiff$persisted2[_i14];
-    var _oldType = _ref4[0];
-    var newType = _ref4[1];
-
-    if (isEnumType(_oldType) && isEnumType(newType)) {
-      schemaChanges.push.apply(schemaChanges, findEnumTypeChanges(_oldType, newType));
-    } else if (isUnionType(_oldType) && isUnionType(newType)) {
-      schemaChanges.push.apply(schemaChanges, findUnionTypeChanges(_oldType, newType));
-    } else if (isInputObjectType(_oldType) && isInputObjectType(newType)) {
-      schemaChanges.push.apply(schemaChanges, findInputObjectTypeChanges(_oldType, newType));
-    } else if (isObjectType(_oldType) && isObjectType(newType)) {
-      schemaChanges.push.apply(schemaChanges, findFieldChanges(_oldType, newType).concat(findImplementedInterfacesChanges(_oldType, newType)));
-    } else if (isInterfaceType(_oldType) && isInterfaceType(newType)) {
-      schemaChanges.push.apply(schemaChanges, findFieldChanges(_oldType, newType).concat(findImplementedInterfacesChanges(_oldType, newType)));
-    } else if (_oldType.constructor !== newType.constructor) {
-      schemaChanges.push({
-        type: BreakingChangeType.TYPE_CHANGED_KIND,
-        description: "".concat(_oldType.name, " changed from ") + "".concat(typeKindName(_oldType), " to ").concat(typeKindName(newType), ".")
-      });
-    }
-  }
-
-  return schemaChanges;
-}
-
-function findInputObjectTypeChanges(oldType, newType) {
-  var schemaChanges = [];
-  var fieldsDiff = diff(objectValues(oldType.getFields()), objectValues(newType.getFields()));
-
-  for (var _i16 = 0, _fieldsDiff$added2 = fieldsDiff.added; _i16 < _fieldsDiff$added2.length; _i16++) {
-    var newField = _fieldsDiff$added2[_i16];
-
-    if (isRequiredInputField(newField)) {
-      schemaChanges.push({
-        type: BreakingChangeType.REQUIRED_INPUT_FIELD_ADDED,
-        description: "A required field ".concat(newField.name, " on input type ").concat(oldType.name, " was added.")
-      });
-    } else {
-      schemaChanges.push({
-        type: DangerousChangeType.OPTIONAL_INPUT_FIELD_ADDED,
-        description: "An optional field ".concat(newField.name, " on input type ").concat(oldType.name, " was added.")
-      });
-    }
-  }
-
-  for (var _i18 = 0, _fieldsDiff$removed2 = fieldsDiff.removed; _i18 < _fieldsDiff$removed2.length; _i18++) {
-    var oldField = _fieldsDiff$removed2[_i18];
-    schemaChanges.push({
-      type: BreakingChangeType.FIELD_REMOVED,
-      description: "".concat(oldType.name, ".").concat(oldField.name, " was removed.")
-    });
-  }
-
-  for (var _i20 = 0, _fieldsDiff$persisted2 = fieldsDiff.persisted; _i20 < _fieldsDiff$persisted2.length; _i20++) {
-    var _ref6 = _fieldsDiff$persisted2[_i20];
-    var _oldField = _ref6[0];
-    var _newField = _ref6[1];
-    var isSafe = isChangeSafeForInputObjectFieldOrFieldArg(_oldField.type, _newField.type);
-
-    if (!isSafe) {
-      schemaChanges.push({
-        type: BreakingChangeType.FIELD_CHANGED_KIND,
-        description: "".concat(oldType.name, ".").concat(_oldField.name, " changed type from ") + "".concat(String(_oldField.type), " to ").concat(String(_newField.type), ".")
-      });
-    }
-  }
-
-  return schemaChanges;
-}
-
-function findUnionTypeChanges(oldType, newType) {
-  var schemaChanges = [];
-  var possibleTypesDiff = diff(oldType.getTypes(), newType.getTypes());
-
-  for (var _i22 = 0, _possibleTypesDiff$ad2 = possibleTypesDiff.added; _i22 < _possibleTypesDiff$ad2.length; _i22++) {
-    var newPossibleType = _possibleTypesDiff$ad2[_i22];
-    schemaChanges.push({
-      type: DangerousChangeType.TYPE_ADDED_TO_UNION,
-      description: "".concat(newPossibleType.name, " was added to union type ").concat(oldType.name, ".")
-    });
-  }
-
-  for (var _i24 = 0, _possibleTypesDiff$re2 = possibleTypesDiff.removed; _i24 < _possibleTypesDiff$re2.length; _i24++) {
-    var oldPossibleType = _possibleTypesDiff$re2[_i24];
-    schemaChanges.push({
-      type: BreakingChangeType.TYPE_REMOVED_FROM_UNION,
-      description: "".concat(oldPossibleType.name, " was removed from union type ").concat(oldType.name, ".")
-    });
-  }
-
-  return schemaChanges;
-}
-
-function findEnumTypeChanges(oldType, newType) {
-  var schemaChanges = [];
-  var valuesDiff = diff(oldType.getValues(), newType.getValues());
-
-  for (var _i26 = 0, _valuesDiff$added2 = valuesDiff.added; _i26 < _valuesDiff$added2.length; _i26++) {
-    var newValue = _valuesDiff$added2[_i26];
-    schemaChanges.push({
-      type: DangerousChangeType.VALUE_ADDED_TO_ENUM,
-      description: "".concat(newValue.name, " was added to enum type ").concat(oldType.name, ".")
-    });
-  }
-
-  for (var _i28 = 0, _valuesDiff$removed2 = valuesDiff.removed; _i28 < _valuesDiff$removed2.length; _i28++) {
-    var oldValue = _valuesDiff$removed2[_i28];
-    schemaChanges.push({
-      type: BreakingChangeType.VALUE_REMOVED_FROM_ENUM,
-      description: "".concat(oldValue.name, " was removed from enum type ").concat(oldType.name, ".")
-    });
-  }
-
-  return schemaChanges;
-}
-
-function findImplementedInterfacesChanges(oldType, newType) {
-  var schemaChanges = [];
-  var interfacesDiff = diff(oldType.getInterfaces(), newType.getInterfaces());
-
-  for (var _i30 = 0, _interfacesDiff$added2 = interfacesDiff.added; _i30 < _interfacesDiff$added2.length; _i30++) {
-    var newInterface = _interfacesDiff$added2[_i30];
-    schemaChanges.push({
-      type: DangerousChangeType.IMPLEMENTED_INTERFACE_ADDED,
-      description: "".concat(newInterface.name, " added to interfaces implemented by ").concat(oldType.name, ".")
-    });
-  }
-
-  for (var _i32 = 0, _interfacesDiff$remov2 = interfacesDiff.removed; _i32 < _interfacesDiff$remov2.length; _i32++) {
-    var oldInterface = _interfacesDiff$remov2[_i32];
-    schemaChanges.push({
-      type: BreakingChangeType.IMPLEMENTED_INTERFACE_REMOVED,
-      description: "".concat(oldType.name, " no longer implements interface ").concat(oldInterface.name, ".")
-    });
-  }
-
-  return schemaChanges;
-}
-
-function findFieldChanges(oldType, newType) {
-  var schemaChanges = [];
-  var fieldsDiff = diff(objectValues(oldType.getFields()), objectValues(newType.getFields()));
-
-  for (var _i34 = 0, _fieldsDiff$removed4 = fieldsDiff.removed; _i34 < _fieldsDiff$removed4.length; _i34++) {
-    var oldField = _fieldsDiff$removed4[_i34];
-    schemaChanges.push({
-      type: BreakingChangeType.FIELD_REMOVED,
-      description: "".concat(oldType.name, ".").concat(oldField.name, " was removed.")
-    });
-  }
-
-  for (var _i36 = 0, _fieldsDiff$persisted4 = fieldsDiff.persisted; _i36 < _fieldsDiff$persisted4.length; _i36++) {
-    var _ref8 = _fieldsDiff$persisted4[_i36];
-    var _oldField2 = _ref8[0];
-    var newField = _ref8[1];
-    schemaChanges.push.apply(schemaChanges, findArgChanges(oldType, _oldField2, newField));
-    var isSafe = isChangeSafeForObjectOrInterfaceField(_oldField2.type, newField.type);
-
-    if (!isSafe) {
-      schemaChanges.push({
-        type: BreakingChangeType.FIELD_CHANGED_KIND,
-        description: "".concat(oldType.name, ".").concat(_oldField2.name, " changed type from ") + "".concat(String(_oldField2.type), " to ").concat(String(newField.type), ".")
-      });
-    }
-  }
-
-  return schemaChanges;
-}
-
-function findArgChanges(oldType, oldField, newField) {
-  var schemaChanges = [];
-  var argsDiff = diff(oldField.args, newField.args);
-
-  for (var _i38 = 0, _argsDiff$removed4 = argsDiff.removed; _i38 < _argsDiff$removed4.length; _i38++) {
-    var oldArg = _argsDiff$removed4[_i38];
-    schemaChanges.push({
-      type: BreakingChangeType.ARG_REMOVED,
-      description: "".concat(oldType.name, ".").concat(oldField.name, " arg ").concat(oldArg.name, " was removed.")
-    });
-  }
-
-  for (var _i40 = 0, _argsDiff$persisted2 = argsDiff.persisted; _i40 < _argsDiff$persisted2.length; _i40++) {
-    var _ref10 = _argsDiff$persisted2[_i40];
-    var _oldArg = _ref10[0];
-    var newArg = _ref10[1];
-    var isSafe = isChangeSafeForInputObjectFieldOrFieldArg(_oldArg.type, newArg.type);
-
-    if (!isSafe) {
-      schemaChanges.push({
-        type: BreakingChangeType.ARG_CHANGED_KIND,
-        description: "".concat(oldType.name, ".").concat(oldField.name, " arg ").concat(_oldArg.name, " has changed type from ") + "".concat(String(_oldArg.type), " to ").concat(String(newArg.type), ".")
-      });
-    } else if (_oldArg.defaultValue !== undefined) {
-      if (newArg.defaultValue === undefined) {
-        schemaChanges.push({
-          type: DangerousChangeType.ARG_DEFAULT_VALUE_CHANGE,
-          description: "".concat(oldType.name, ".").concat(oldField.name, " arg ").concat(_oldArg.name, " defaultValue was removed.")
-        });
-      } else {
-        // Since we looking only for client's observable changes we should
-        // compare default values in the same representation as they are
-        // represented inside introspection.
-        var oldValueStr = stringifyValue(_oldArg.defaultValue, _oldArg.type);
-        var newValueStr = stringifyValue(newArg.defaultValue, newArg.type);
-
-        if (oldValueStr !== newValueStr) {
-          schemaChanges.push({
-            type: DangerousChangeType.ARG_DEFAULT_VALUE_CHANGE,
-            description: "".concat(oldType.name, ".").concat(oldField.name, " arg ").concat(_oldArg.name, " has changed defaultValue from ").concat(oldValueStr, " to ").concat(newValueStr, ".")
-          });
-        }
-      }
-    }
-  }
-
-  for (var _i42 = 0, _argsDiff$added4 = argsDiff.added; _i42 < _argsDiff$added4.length; _i42++) {
-    var _newArg = _argsDiff$added4[_i42];
-
-    if (isRequiredArgument(_newArg)) {
-      schemaChanges.push({
-        type: BreakingChangeType.REQUIRED_ARG_ADDED,
-        description: "A required arg ".concat(_newArg.name, " on ").concat(oldType.name, ".").concat(oldField.name, " was added.")
-      });
-    } else {
-      schemaChanges.push({
-        type: DangerousChangeType.OPTIONAL_ARG_ADDED,
-        description: "An optional arg ".concat(_newArg.name, " on ").concat(oldType.name, ".").concat(oldField.name, " was added.")
-      });
-    }
-  }
-
-  return schemaChanges;
-}
-
-function isChangeSafeForObjectOrInterfaceField(oldType, newType) {
-  if (isListType(oldType)) {
-    return (// if they're both lists, make sure the underlying types are compatible
-      isListType(newType) && isChangeSafeForObjectOrInterfaceField(oldType.ofType, newType.ofType) || // moving from nullable to non-null of the same underlying type is safe
-      isNonNullType(newType) && isChangeSafeForObjectOrInterfaceField(oldType, newType.ofType)
-    );
-  }
-
-  if (isNonNullType(oldType)) {
-    // if they're both non-null, make sure the underlying types are compatible
-    return isNonNullType(newType) && isChangeSafeForObjectOrInterfaceField(oldType.ofType, newType.ofType);
-  }
-
-  return (// if they're both named types, see if their names are equivalent
-    isNamedType(newType) && oldType.name === newType.name || // moving from nullable to non-null of the same underlying type is safe
-    isNonNullType(newType) && isChangeSafeForObjectOrInterfaceField(oldType, newType.ofType)
-  );
-}
-
-function isChangeSafeForInputObjectFieldOrFieldArg(oldType, newType) {
-  if (isListType(oldType)) {
-    // if they're both lists, make sure the underlying types are compatible
-    return isListType(newType) && isChangeSafeForInputObjectFieldOrFieldArg(oldType.ofType, newType.ofType);
-  }
-
-  if (isNonNullType(oldType)) {
-    return (// if they're both non-null, make sure the underlying types are
-      // compatible
-      isNonNullType(newType) && isChangeSafeForInputObjectFieldOrFieldArg(oldType.ofType, newType.ofType) || // moving from non-null to nullable of the same underlying type is safe
-      !isNonNullType(newType) && isChangeSafeForInputObjectFieldOrFieldArg(oldType.ofType, newType)
-    );
-  } // if they're both named types, see if their names are equivalent
-
-
-  return isNamedType(newType) && oldType.name === newType.name;
-}
-
-function typeKindName(type) {
-  if (isScalarType(type)) {
-    return 'a Scalar type';
-  }
-
-  if (isObjectType(type)) {
-    return 'an Object type';
-  }
-
-  if (isInterfaceType(type)) {
-    return 'an Interface type';
-  }
-
-  if (isUnionType(type)) {
-    return 'a Union type';
-  }
-
-  if (isEnumType(type)) {
-    return 'an Enum type';
-  }
-
-  /* istanbul ignore else */
-  if (isInputObjectType(type)) {
-    return 'an Input type';
-  } // Not reachable. All possible named types have been considered.
-
-
-  /* istanbul ignore next */
-  invariant(false, 'Unexpected type: ' + inspect(type));
-}
-
-function stringifyValue(value, type) {
-  var ast = astFromValue(value, type);
-
-  /* istanbul ignore next */
-  ast != null || invariant(0);
-  var sortedAST = visit(ast, {
-    ObjectValue: function ObjectValue(objectNode) {
-      var fields = [].concat(objectNode.fields).sort(function (fieldA, fieldB) {
-        return fieldA.name.value.localeCompare(fieldB.name.value);
-      });
-      return _objectSpread({}, objectNode, {
-        fields: fields
-      });
-    }
-  });
-  return print(sortedAST);
-}
-
-function diff(oldArray, newArray) {
-  var added = [];
-  var removed = [];
-  var persisted = [];
-  var oldMap = keyMap(oldArray, function (_ref11) {
-    var name = _ref11.name;
-    return name;
-  });
-  var newMap = keyMap(newArray, function (_ref12) {
-    var name = _ref12.name;
-    return name;
-  });
-
-  for (var _i44 = 0; _i44 < oldArray.length; _i44++) {
-    var oldItem = oldArray[_i44];
-    var newItem = newMap[oldItem.name];
-
-    if (newItem === undefined) {
-      removed.push(oldItem);
-    } else {
-      persisted.push([oldItem, newItem]);
-    }
-  }
-
-  for (var _i46 = 0; _i46 < newArray.length; _i46++) {
-    var _newItem = newArray[_i46];
-
-    if (oldMap[_newItem.name] === undefined) {
-      added.push(_newItem);
-    }
-  }
-
-  return {
-    added: added,
-    persisted: persisted,
-    removed: removed
-  };
-}
diff --git a/node_modules/graphql/utilities/findDeprecatedUsages.d.ts b/node_modules/graphql/utilities/findDeprecatedUsages.d.ts
deleted file mode 100644
index 6beb244..0000000
--- a/node_modules/graphql/utilities/findDeprecatedUsages.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { GraphQLError } from '../error/GraphQLError';
-import { DocumentNode } from '../language/ast';
-import { GraphQLSchema } from '../type/schema';
-
-/**
- * A validation rule which reports deprecated usages.
- *
- * Returns a list of GraphQLError instances describing each deprecated use.
- */
-export function findDeprecatedUsages(
-  schema: GraphQLSchema,
-  ast: DocumentNode,
-): Array<GraphQLError>;
diff --git a/node_modules/graphql/utilities/findDeprecatedUsages.js b/node_modules/graphql/utilities/findDeprecatedUsages.js
deleted file mode 100644
index ad8c6e5..0000000
--- a/node_modules/graphql/utilities/findDeprecatedUsages.js
+++ /dev/null
@@ -1,43 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.findDeprecatedUsages = findDeprecatedUsages;
-
-var _GraphQLError = require("../error/GraphQLError");
-
-var _visitor = require("../language/visitor");
-
-var _definition = require("../type/definition");
-
-var _TypeInfo = require("./TypeInfo");
-
-/**
- * A validation rule which reports deprecated usages.
- *
- * Returns a list of GraphQLError instances describing each deprecated use.
- */
-function findDeprecatedUsages(schema, ast) {
-  var errors = [];
-  var typeInfo = new _TypeInfo.TypeInfo(schema);
-  (0, _visitor.visit)(ast, (0, _TypeInfo.visitWithTypeInfo)(typeInfo, {
-    Field: function Field(node) {
-      var parentType = typeInfo.getParentType();
-      var fieldDef = typeInfo.getFieldDef();
-
-      if (parentType && (fieldDef === null || fieldDef === void 0 ? void 0 : fieldDef.deprecationReason) != null) {
-        errors.push(new _GraphQLError.GraphQLError("The field \"".concat(parentType.name, ".").concat(fieldDef.name, "\" is deprecated. ") + fieldDef.deprecationReason, node));
-      }
-    },
-    EnumValue: function EnumValue(node) {
-      var type = (0, _definition.getNamedType)(typeInfo.getInputType());
-      var enumVal = typeInfo.getEnumValue();
-
-      if (type && (enumVal === null || enumVal === void 0 ? void 0 : enumVal.deprecationReason) != null) {
-        errors.push(new _GraphQLError.GraphQLError("The enum value \"".concat(type.name, ".").concat(enumVal.name, "\" is deprecated. ") + enumVal.deprecationReason, node));
-      }
-    }
-  }));
-  return errors;
-}
diff --git a/node_modules/graphql/utilities/findDeprecatedUsages.js.flow b/node_modules/graphql/utilities/findDeprecatedUsages.js.flow
deleted file mode 100644
index e63003b..0000000
--- a/node_modules/graphql/utilities/findDeprecatedUsages.js.flow
+++ /dev/null
@@ -1,58 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../error/GraphQLError';
-
-import { visit } from '../language/visitor';
-import { type DocumentNode } from '../language/ast';
-
-import { getNamedType } from '../type/definition';
-import { type GraphQLSchema } from '../type/schema';
-
-import { TypeInfo, visitWithTypeInfo } from './TypeInfo';
-
-/**
- * A validation rule which reports deprecated usages.
- *
- * Returns a list of GraphQLError instances describing each deprecated use.
- */
-export function findDeprecatedUsages(
-  schema: GraphQLSchema,
-  ast: DocumentNode,
-): Array<GraphQLError> {
-  const errors = [];
-  const typeInfo = new TypeInfo(schema);
-
-  visit(
-    ast,
-    visitWithTypeInfo(typeInfo, {
-      Field(node) {
-        const parentType = typeInfo.getParentType();
-        const fieldDef = typeInfo.getFieldDef();
-        if (parentType && fieldDef?.deprecationReason != null) {
-          errors.push(
-            new GraphQLError(
-              `The field "${parentType.name}.${fieldDef.name}" is deprecated. ` +
-                fieldDef.deprecationReason,
-              node,
-            ),
-          );
-        }
-      },
-      EnumValue(node) {
-        const type = getNamedType(typeInfo.getInputType());
-        const enumVal = typeInfo.getEnumValue();
-        if (type && enumVal?.deprecationReason != null) {
-          errors.push(
-            new GraphQLError(
-              `The enum value "${type.name}.${enumVal.name}" is deprecated. ` +
-                enumVal.deprecationReason,
-              node,
-            ),
-          );
-        }
-      },
-    }),
-  );
-
-  return errors;
-}
diff --git a/node_modules/graphql/utilities/findDeprecatedUsages.mjs b/node_modules/graphql/utilities/findDeprecatedUsages.mjs
deleted file mode 100644
index 0344a0c..0000000
--- a/node_modules/graphql/utilities/findDeprecatedUsages.mjs
+++ /dev/null
@@ -1,33 +0,0 @@
-import { GraphQLError } from "../error/GraphQLError.mjs";
-import { visit } from "../language/visitor.mjs";
-import { getNamedType } from "../type/definition.mjs";
-import { TypeInfo, visitWithTypeInfo } from "./TypeInfo.mjs";
-/**
- * A validation rule which reports deprecated usages.
- *
- * Returns a list of GraphQLError instances describing each deprecated use.
- */
-
-export function findDeprecatedUsages(schema, ast) {
-  var errors = [];
-  var typeInfo = new TypeInfo(schema);
-  visit(ast, visitWithTypeInfo(typeInfo, {
-    Field: function Field(node) {
-      var parentType = typeInfo.getParentType();
-      var fieldDef = typeInfo.getFieldDef();
-
-      if (parentType && (fieldDef === null || fieldDef === void 0 ? void 0 : fieldDef.deprecationReason) != null) {
-        errors.push(new GraphQLError("The field \"".concat(parentType.name, ".").concat(fieldDef.name, "\" is deprecated. ") + fieldDef.deprecationReason, node));
-      }
-    },
-    EnumValue: function EnumValue(node) {
-      var type = getNamedType(typeInfo.getInputType());
-      var enumVal = typeInfo.getEnumValue();
-
-      if (type && (enumVal === null || enumVal === void 0 ? void 0 : enumVal.deprecationReason) != null) {
-        errors.push(new GraphQLError("The enum value \"".concat(type.name, ".").concat(enumVal.name, "\" is deprecated. ") + enumVal.deprecationReason, node));
-      }
-    }
-  }));
-  return errors;
-}
diff --git a/node_modules/graphql/utilities/getIntrospectionQuery.d.ts b/node_modules/graphql/utilities/getIntrospectionQuery.d.ts
deleted file mode 100644
index ece6b71..0000000
--- a/node_modules/graphql/utilities/getIntrospectionQuery.d.ts
+++ /dev/null
@@ -1,177 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-import { DirectiveLocationEnum } from '../language/directiveLocation';
-
-export interface IntrospectionOptions {
-  // Whether to include descriptions in the introspection result.
-  // Default: true
-  descriptions: boolean;
-
-  // Whether to include `isRepeatable` flag on directives.
-  // Default: false
-  directiveIsRepeatable?: boolean;
-}
-
-export function getIntrospectionQuery(options?: IntrospectionOptions): string;
-
-export interface IntrospectionQuery {
-  readonly __schema: IntrospectionSchema;
-}
-
-export interface IntrospectionSchema {
-  readonly queryType: IntrospectionNamedTypeRef<IntrospectionObjectType>;
-  readonly mutationType: Maybe<
-    IntrospectionNamedTypeRef<IntrospectionObjectType>
-  >;
-  readonly subscriptionType: Maybe<
-    IntrospectionNamedTypeRef<IntrospectionObjectType>
-  >;
-  readonly types: ReadonlyArray<IntrospectionType>;
-  readonly directives: ReadonlyArray<IntrospectionDirective>;
-}
-
-export type IntrospectionType =
-  | IntrospectionScalarType
-  | IntrospectionObjectType
-  | IntrospectionInterfaceType
-  | IntrospectionUnionType
-  | IntrospectionEnumType
-  | IntrospectionInputObjectType;
-
-export type IntrospectionOutputType =
-  | IntrospectionScalarType
-  | IntrospectionObjectType
-  | IntrospectionInterfaceType
-  | IntrospectionUnionType
-  | IntrospectionEnumType;
-
-export type IntrospectionInputType =
-  | IntrospectionScalarType
-  | IntrospectionEnumType
-  | IntrospectionInputObjectType;
-
-export interface IntrospectionScalarType {
-  readonly kind: 'SCALAR';
-  readonly name: string;
-  readonly description?: Maybe<string>;
-}
-
-export interface IntrospectionObjectType {
-  readonly kind: 'OBJECT';
-  readonly name: string;
-  readonly description?: Maybe<string>;
-  readonly fields: ReadonlyArray<IntrospectionField>;
-  readonly interfaces: ReadonlyArray<
-    IntrospectionNamedTypeRef<IntrospectionInterfaceType>
-  >;
-}
-
-export interface IntrospectionInterfaceType {
-  readonly kind: 'INTERFACE';
-  readonly name: string;
-  readonly description?: Maybe<string>;
-  readonly fields: ReadonlyArray<IntrospectionField>;
-  readonly interfaces: ReadonlyArray<
-    IntrospectionNamedTypeRef<IntrospectionInterfaceType>
-  >;
-  readonly possibleTypes: ReadonlyArray<
-    IntrospectionNamedTypeRef<IntrospectionObjectType>
-  >;
-}
-
-export interface IntrospectionUnionType {
-  readonly kind: 'UNION';
-  readonly name: string;
-  readonly description?: Maybe<string>;
-  readonly possibleTypes: ReadonlyArray<
-    IntrospectionNamedTypeRef<IntrospectionObjectType>
-  >;
-}
-
-export interface IntrospectionEnumType {
-  readonly kind: 'ENUM';
-  readonly name: string;
-  readonly description?: Maybe<string>;
-  readonly enumValues: ReadonlyArray<IntrospectionEnumValue>;
-}
-
-export interface IntrospectionInputObjectType {
-  readonly kind: 'INPUT_OBJECT';
-  readonly name: string;
-  readonly description?: Maybe<string>;
-  readonly inputFields: ReadonlyArray<IntrospectionInputValue>;
-}
-
-export interface IntrospectionListTypeRef<
-  T extends IntrospectionTypeRef = IntrospectionTypeRef
-> {
-  readonly kind: 'LIST';
-  readonly ofType: T;
-}
-
-export interface IntrospectionNonNullTypeRef<
-  T extends IntrospectionTypeRef = IntrospectionTypeRef
-> {
-  readonly kind: 'NON_NULL';
-  readonly ofType: T;
-}
-
-export type IntrospectionTypeRef =
-  | IntrospectionNamedTypeRef
-  | IntrospectionListTypeRef<any>
-  | IntrospectionNonNullTypeRef<
-      IntrospectionNamedTypeRef | IntrospectionListTypeRef<any>
-    >;
-
-export type IntrospectionOutputTypeRef =
-  | IntrospectionNamedTypeRef<IntrospectionOutputType>
-  | IntrospectionListTypeRef<any>
-  | IntrospectionNonNullTypeRef<
-      | IntrospectionNamedTypeRef<IntrospectionOutputType>
-      | IntrospectionListTypeRef<any>
-    >;
-
-export type IntrospectionInputTypeRef =
-  | IntrospectionNamedTypeRef<IntrospectionInputType>
-  | IntrospectionListTypeRef<any>
-  | IntrospectionNonNullTypeRef<
-      | IntrospectionNamedTypeRef<IntrospectionInputType>
-      | IntrospectionListTypeRef<any>
-    >;
-
-export interface IntrospectionNamedTypeRef<
-  T extends IntrospectionType = IntrospectionType
-> {
-  readonly kind: T['kind'];
-  readonly name: string;
-}
-
-export interface IntrospectionField {
-  readonly name: string;
-  readonly description?: Maybe<string>;
-  readonly args: ReadonlyArray<IntrospectionInputValue>;
-  readonly type: IntrospectionOutputTypeRef;
-  readonly isDeprecated: boolean;
-  readonly deprecationReason?: Maybe<string>;
-}
-
-export interface IntrospectionInputValue {
-  readonly name: string;
-  readonly description?: Maybe<string>;
-  readonly type: IntrospectionInputTypeRef;
-  readonly defaultValue?: Maybe<string>;
-}
-
-export interface IntrospectionEnumValue {
-  readonly name: string;
-  readonly description?: Maybe<string>;
-  readonly isDeprecated: boolean;
-  readonly deprecationReason?: Maybe<string>;
-}
-
-export interface IntrospectionDirective {
-  readonly name: string;
-  readonly description?: Maybe<string>;
-  readonly isRepeatable?: boolean;
-  readonly locations: ReadonlyArray<DirectiveLocationEnum>;
-  readonly args: ReadonlyArray<IntrospectionInputValue>;
-}
diff --git a/node_modules/graphql/utilities/getIntrospectionQuery.js b/node_modules/graphql/utilities/getIntrospectionQuery.js
deleted file mode 100644
index 4653703..0000000
--- a/node_modules/graphql/utilities/getIntrospectionQuery.js
+++ /dev/null
@@ -1,25 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getIntrospectionQuery = getIntrospectionQuery;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function getIntrospectionQuery(options) {
-  var optionsWithDefault = _objectSpread({
-    descriptions: true,
-    directiveIsRepeatable: false,
-    schemaDescription: false
-  }, options);
-
-  var descriptions = optionsWithDefault.descriptions ? 'description' : '';
-  var directiveIsRepeatable = optionsWithDefault.directiveIsRepeatable ? 'isRepeatable' : '';
-  var schemaDescription = optionsWithDefault.schemaDescription ? descriptions : '';
-  return "\n    query IntrospectionQuery {\n      __schema {\n        ".concat(schemaDescription, "\n        queryType { name }\n        mutationType { name }\n        subscriptionType { name }\n        types {\n          ...FullType\n        }\n        directives {\n          name\n          ").concat(descriptions, "\n          ").concat(directiveIsRepeatable, "\n          locations\n          args {\n            ...InputValue\n          }\n        }\n      }\n    }\n\n    fragment FullType on __Type {\n      kind\n      name\n      ").concat(descriptions, "\n      fields(includeDeprecated: true) {\n        name\n        ").concat(descriptions, "\n        args {\n          ...InputValue\n        }\n        type {\n          ...TypeRef\n        }\n        isDeprecated\n        deprecationReason\n      }\n      inputFields {\n        ...InputValue\n      }\n      interfaces {\n        ...TypeRef\n      }\n      enumValues(includeDeprecated: true) {\n        name\n        ").concat(descriptions, "\n        isDeprecated\n        deprecationReason\n      }\n      possibleTypes {\n        ...TypeRef\n      }\n    }\n\n    fragment InputValue on __InputValue {\n      name\n      ").concat(descriptions, "\n      type { ...TypeRef }\n      defaultValue\n    }\n\n    fragment TypeRef on __Type {\n      kind\n      name\n      ofType {\n        kind\n        name\n        ofType {\n          kind\n          name\n          ofType {\n            kind\n            name\n            ofType {\n              kind\n              name\n              ofType {\n                kind\n                name\n                ofType {\n                  kind\n                  name\n                  ofType {\n                    kind\n                    name\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  ");
-}
diff --git a/node_modules/graphql/utilities/getIntrospectionQuery.js.flow b/node_modules/graphql/utilities/getIntrospectionQuery.js.flow
deleted file mode 100644
index 8f79aac..0000000
--- a/node_modules/graphql/utilities/getIntrospectionQuery.js.flow
+++ /dev/null
@@ -1,290 +0,0 @@
-// @flow strict
-
-import { type DirectiveLocationEnum } from '../language/directiveLocation';
-
-export type IntrospectionOptions = {|
-  // Whether to include descriptions in the introspection result.
-  // Default: true
-  descriptions?: boolean,
-
-  // Whether to include `isRepeatable` field on directives.
-  // Default: false
-  directiveIsRepeatable?: boolean,
-
-  // Whether to include `description` field on schema.
-  // Default: false
-  schemaDescription?: boolean,
-|};
-
-export function getIntrospectionQuery(options?: IntrospectionOptions): string {
-  const optionsWithDefault = {
-    descriptions: true,
-    directiveIsRepeatable: false,
-    schemaDescription: false,
-    ...options,
-  };
-
-  const descriptions = optionsWithDefault.descriptions ? 'description' : '';
-  const directiveIsRepeatable = optionsWithDefault.directiveIsRepeatable
-    ? 'isRepeatable'
-    : '';
-  const schemaDescription = optionsWithDefault.schemaDescription
-    ? descriptions
-    : '';
-
-  return `
-    query IntrospectionQuery {
-      __schema {
-        ${schemaDescription}
-        queryType { name }
-        mutationType { name }
-        subscriptionType { name }
-        types {
-          ...FullType
-        }
-        directives {
-          name
-          ${descriptions}
-          ${directiveIsRepeatable}
-          locations
-          args {
-            ...InputValue
-          }
-        }
-      }
-    }
-
-    fragment FullType on __Type {
-      kind
-      name
-      ${descriptions}
-      fields(includeDeprecated: true) {
-        name
-        ${descriptions}
-        args {
-          ...InputValue
-        }
-        type {
-          ...TypeRef
-        }
-        isDeprecated
-        deprecationReason
-      }
-      inputFields {
-        ...InputValue
-      }
-      interfaces {
-        ...TypeRef
-      }
-      enumValues(includeDeprecated: true) {
-        name
-        ${descriptions}
-        isDeprecated
-        deprecationReason
-      }
-      possibleTypes {
-        ...TypeRef
-      }
-    }
-
-    fragment InputValue on __InputValue {
-      name
-      ${descriptions}
-      type { ...TypeRef }
-      defaultValue
-    }
-
-    fragment TypeRef on __Type {
-      kind
-      name
-      ofType {
-        kind
-        name
-        ofType {
-          kind
-          name
-          ofType {
-            kind
-            name
-            ofType {
-              kind
-              name
-              ofType {
-                kind
-                name
-                ofType {
-                  kind
-                  name
-                  ofType {
-                    kind
-                    name
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  `;
-}
-
-export type IntrospectionQuery = {|
-  +__schema: IntrospectionSchema,
-|};
-
-export type IntrospectionSchema = {|
-  +description?: ?string,
-  +queryType: IntrospectionNamedTypeRef<IntrospectionObjectType>,
-  +mutationType: ?IntrospectionNamedTypeRef<IntrospectionObjectType>,
-  +subscriptionType: ?IntrospectionNamedTypeRef<IntrospectionObjectType>,
-  +types: $ReadOnlyArray<IntrospectionType>,
-  +directives: $ReadOnlyArray<IntrospectionDirective>,
-|};
-
-export type IntrospectionType =
-  | IntrospectionScalarType
-  | IntrospectionObjectType
-  | IntrospectionInterfaceType
-  | IntrospectionUnionType
-  | IntrospectionEnumType
-  | IntrospectionInputObjectType;
-
-export type IntrospectionOutputType =
-  | IntrospectionScalarType
-  | IntrospectionObjectType
-  | IntrospectionInterfaceType
-  | IntrospectionUnionType
-  | IntrospectionEnumType;
-
-export type IntrospectionInputType =
-  | IntrospectionScalarType
-  | IntrospectionEnumType
-  | IntrospectionInputObjectType;
-
-export type IntrospectionScalarType = {|
-  +kind: 'SCALAR',
-  +name: string,
-  +description?: ?string,
-|};
-
-export type IntrospectionObjectType = {|
-  +kind: 'OBJECT',
-  +name: string,
-  +description?: ?string,
-  +fields: $ReadOnlyArray<IntrospectionField>,
-  +interfaces: $ReadOnlyArray<
-    IntrospectionNamedTypeRef<IntrospectionInterfaceType>,
-  >,
-|};
-
-export type IntrospectionInterfaceType = {|
-  +kind: 'INTERFACE',
-  +name: string,
-  +description?: ?string,
-  +fields: $ReadOnlyArray<IntrospectionField>,
-  +interfaces: $ReadOnlyArray<
-    IntrospectionNamedTypeRef<IntrospectionInterfaceType>,
-  >,
-  +possibleTypes: $ReadOnlyArray<
-    IntrospectionNamedTypeRef<IntrospectionObjectType>,
-  >,
-|};
-
-export type IntrospectionUnionType = {|
-  +kind: 'UNION',
-  +name: string,
-  +description?: ?string,
-  +possibleTypes: $ReadOnlyArray<
-    IntrospectionNamedTypeRef<IntrospectionObjectType>,
-  >,
-|};
-
-export type IntrospectionEnumType = {|
-  +kind: 'ENUM',
-  +name: string,
-  +description?: ?string,
-  +enumValues: $ReadOnlyArray<IntrospectionEnumValue>,
-|};
-
-export type IntrospectionInputObjectType = {|
-  +kind: 'INPUT_OBJECT',
-  +name: string,
-  +description?: ?string,
-  +inputFields: $ReadOnlyArray<IntrospectionInputValue>,
-|};
-
-export type IntrospectionListTypeRef<
-  T: IntrospectionTypeRef = IntrospectionTypeRef,
-> = {|
-  +kind: 'LIST',
-  +ofType: T,
-|};
-
-export type IntrospectionNonNullTypeRef<
-  T: IntrospectionTypeRef = IntrospectionTypeRef,
-> = {|
-  +kind: 'NON_NULL',
-  +ofType: T,
-|};
-
-export type IntrospectionTypeRef =
-  | IntrospectionNamedTypeRef<>
-  | IntrospectionListTypeRef<>
-  | IntrospectionNonNullTypeRef<
-      IntrospectionNamedTypeRef<> | IntrospectionListTypeRef<>,
-    >;
-
-export type IntrospectionOutputTypeRef =
-  | IntrospectionNamedTypeRef<IntrospectionOutputType>
-  | IntrospectionListTypeRef<IntrospectionOutputTypeRef>
-  | IntrospectionNonNullTypeRef<
-      | IntrospectionNamedTypeRef<IntrospectionOutputType>
-      | IntrospectionListTypeRef<IntrospectionOutputTypeRef>,
-    >;
-
-export type IntrospectionInputTypeRef =
-  | IntrospectionNamedTypeRef<IntrospectionInputType>
-  | IntrospectionListTypeRef<IntrospectionInputTypeRef>
-  | IntrospectionNonNullTypeRef<
-      | IntrospectionNamedTypeRef<IntrospectionInputType>
-      | IntrospectionListTypeRef<IntrospectionInputTypeRef>,
-    >;
-
-export type IntrospectionNamedTypeRef<
-  T: IntrospectionType = IntrospectionType,
-> = {|
-  +kind: $PropertyType<T, 'kind'>,
-  +name: string,
-|};
-
-export type IntrospectionField = {|
-  +name: string,
-  +description?: ?string,
-  +args: $ReadOnlyArray<IntrospectionInputValue>,
-  +type: IntrospectionOutputTypeRef,
-  +isDeprecated: boolean,
-  +deprecationReason: ?string,
-|};
-
-export type IntrospectionInputValue = {|
-  +name: string,
-  +description?: ?string,
-  +type: IntrospectionInputTypeRef,
-  +defaultValue: ?string,
-|};
-
-export type IntrospectionEnumValue = {|
-  +name: string,
-  +description?: ?string,
-  +isDeprecated: boolean,
-  +deprecationReason: ?string,
-|};
-
-export type IntrospectionDirective = {|
-  +name: string,
-  +description?: ?string,
-  +isRepeatable?: boolean,
-  +locations: $ReadOnlyArray<DirectiveLocationEnum>,
-  +args: $ReadOnlyArray<IntrospectionInputValue>,
-|};
diff --git a/node_modules/graphql/utilities/getIntrospectionQuery.mjs b/node_modules/graphql/utilities/getIntrospectionQuery.mjs
deleted file mode 100644
index 83ab080..0000000
--- a/node_modules/graphql/utilities/getIntrospectionQuery.mjs
+++ /dev/null
@@ -1,18 +0,0 @@
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-export function getIntrospectionQuery(options) {
-  var optionsWithDefault = _objectSpread({
-    descriptions: true,
-    directiveIsRepeatable: false,
-    schemaDescription: false
-  }, options);
-
-  var descriptions = optionsWithDefault.descriptions ? 'description' : '';
-  var directiveIsRepeatable = optionsWithDefault.directiveIsRepeatable ? 'isRepeatable' : '';
-  var schemaDescription = optionsWithDefault.schemaDescription ? descriptions : '';
-  return "\n    query IntrospectionQuery {\n      __schema {\n        ".concat(schemaDescription, "\n        queryType { name }\n        mutationType { name }\n        subscriptionType { name }\n        types {\n          ...FullType\n        }\n        directives {\n          name\n          ").concat(descriptions, "\n          ").concat(directiveIsRepeatable, "\n          locations\n          args {\n            ...InputValue\n          }\n        }\n      }\n    }\n\n    fragment FullType on __Type {\n      kind\n      name\n      ").concat(descriptions, "\n      fields(includeDeprecated: true) {\n        name\n        ").concat(descriptions, "\n        args {\n          ...InputValue\n        }\n        type {\n          ...TypeRef\n        }\n        isDeprecated\n        deprecationReason\n      }\n      inputFields {\n        ...InputValue\n      }\n      interfaces {\n        ...TypeRef\n      }\n      enumValues(includeDeprecated: true) {\n        name\n        ").concat(descriptions, "\n        isDeprecated\n        deprecationReason\n      }\n      possibleTypes {\n        ...TypeRef\n      }\n    }\n\n    fragment InputValue on __InputValue {\n      name\n      ").concat(descriptions, "\n      type { ...TypeRef }\n      defaultValue\n    }\n\n    fragment TypeRef on __Type {\n      kind\n      name\n      ofType {\n        kind\n        name\n        ofType {\n          kind\n          name\n          ofType {\n            kind\n            name\n            ofType {\n              kind\n              name\n              ofType {\n                kind\n                name\n                ofType {\n                  kind\n                  name\n                  ofType {\n                    kind\n                    name\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  ");
-}
diff --git a/node_modules/graphql/utilities/getOperationAST.d.ts b/node_modules/graphql/utilities/getOperationAST.d.ts
deleted file mode 100644
index 9f72b7e..0000000
--- a/node_modules/graphql/utilities/getOperationAST.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-import { DocumentNode, OperationDefinitionNode } from '../language/ast';
-
-/**
- * Returns an operation AST given a document AST and optionally an operation
- * name. If a name is not provided, an operation is only returned if only one is
- * provided in the document.
- */
-export function getOperationAST(
-  documentAST: DocumentNode,
-  operationName: Maybe<string>,
-): Maybe<OperationDefinitionNode>;
diff --git a/node_modules/graphql/utilities/getOperationAST.js b/node_modules/graphql/utilities/getOperationAST.js
deleted file mode 100644
index c284100..0000000
--- a/node_modules/graphql/utilities/getOperationAST.js
+++ /dev/null
@@ -1,40 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getOperationAST = getOperationAST;
-
-var _kinds = require("../language/kinds");
-
-/**
- * Returns an operation AST given a document AST and optionally an operation
- * name. If a name is not provided, an operation is only returned if only one is
- * provided in the document.
- */
-function getOperationAST(documentAST, operationName) {
-  var operation = null;
-
-  for (var _i2 = 0, _documentAST$definiti2 = documentAST.definitions; _i2 < _documentAST$definiti2.length; _i2++) {
-    var definition = _documentAST$definiti2[_i2];
-
-    if (definition.kind === _kinds.Kind.OPERATION_DEFINITION) {
-      var _definition$name;
-
-      if (operationName == null) {
-        // If no operation name was provided, only return an Operation if there
-        // is one defined in the document. Upon encountering the second, return
-        // null.
-        if (operation) {
-          return null;
-        }
-
-        operation = definition;
-      } else if (((_definition$name = definition.name) === null || _definition$name === void 0 ? void 0 : _definition$name.value) === operationName) {
-        return definition;
-      }
-    }
-  }
-
-  return operation;
-}
diff --git a/node_modules/graphql/utilities/getOperationAST.js.flow b/node_modules/graphql/utilities/getOperationAST.js.flow
deleted file mode 100644
index 7e3dbcb..0000000
--- a/node_modules/graphql/utilities/getOperationAST.js.flow
+++ /dev/null
@@ -1,35 +0,0 @@
-// @flow strict
-
-import { Kind } from '../language/kinds';
-import {
-  type DocumentNode,
-  type OperationDefinitionNode,
-} from '../language/ast';
-
-/**
- * Returns an operation AST given a document AST and optionally an operation
- * name. If a name is not provided, an operation is only returned if only one is
- * provided in the document.
- */
-export function getOperationAST(
-  documentAST: DocumentNode,
-  operationName: ?string,
-): ?OperationDefinitionNode {
-  let operation = null;
-  for (const definition of documentAST.definitions) {
-    if (definition.kind === Kind.OPERATION_DEFINITION) {
-      if (operationName == null) {
-        // If no operation name was provided, only return an Operation if there
-        // is one defined in the document. Upon encountering the second, return
-        // null.
-        if (operation) {
-          return null;
-        }
-        operation = definition;
-      } else if (definition.name?.value === operationName) {
-        return definition;
-      }
-    }
-  }
-  return operation;
-}
diff --git a/node_modules/graphql/utilities/getOperationAST.mjs b/node_modules/graphql/utilities/getOperationAST.mjs
deleted file mode 100644
index 078b4f1..0000000
--- a/node_modules/graphql/utilities/getOperationAST.mjs
+++ /dev/null
@@ -1,33 +0,0 @@
-import { Kind } from "../language/kinds.mjs";
-
-/**
- * Returns an operation AST given a document AST and optionally an operation
- * name. If a name is not provided, an operation is only returned if only one is
- * provided in the document.
- */
-export function getOperationAST(documentAST, operationName) {
-  var operation = null;
-
-  for (var _i2 = 0, _documentAST$definiti2 = documentAST.definitions; _i2 < _documentAST$definiti2.length; _i2++) {
-    var definition = _documentAST$definiti2[_i2];
-
-    if (definition.kind === Kind.OPERATION_DEFINITION) {
-      var _definition$name;
-
-      if (operationName == null) {
-        // If no operation name was provided, only return an Operation if there
-        // is one defined in the document. Upon encountering the second, return
-        // null.
-        if (operation) {
-          return null;
-        }
-
-        operation = definition;
-      } else if (((_definition$name = definition.name) === null || _definition$name === void 0 ? void 0 : _definition$name.value) === operationName) {
-        return definition;
-      }
-    }
-  }
-
-  return operation;
-}
diff --git a/node_modules/graphql/utilities/getOperationRootType.d.ts b/node_modules/graphql/utilities/getOperationRootType.d.ts
deleted file mode 100644
index 5adc59c..0000000
--- a/node_modules/graphql/utilities/getOperationRootType.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import {
-  OperationDefinitionNode,
-  OperationTypeDefinitionNode,
-} from '../language/ast';
-import { GraphQLSchema } from '../type/schema';
-import { GraphQLObjectType } from '../type/definition';
-
-/**
- * Extracts the root type of the operation from the schema.
- */
-export function getOperationRootType(
-  schema: GraphQLSchema,
-  operation: OperationDefinitionNode | OperationTypeDefinitionNode,
-): GraphQLObjectType;
diff --git a/node_modules/graphql/utilities/getOperationRootType.js b/node_modules/graphql/utilities/getOperationRootType.js
deleted file mode 100644
index 8e7ca1b..0000000
--- a/node_modules/graphql/utilities/getOperationRootType.js
+++ /dev/null
@@ -1,45 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.getOperationRootType = getOperationRootType;
-
-var _GraphQLError = require("../error/GraphQLError");
-
-/**
- * Extracts the root type of the operation from the schema.
- */
-function getOperationRootType(schema, operation) {
-  if (operation.operation === 'query') {
-    var queryType = schema.getQueryType();
-
-    if (!queryType) {
-      throw new _GraphQLError.GraphQLError('Schema does not define the required query root type.', operation);
-    }
-
-    return queryType;
-  }
-
-  if (operation.operation === 'mutation') {
-    var mutationType = schema.getMutationType();
-
-    if (!mutationType) {
-      throw new _GraphQLError.GraphQLError('Schema is not configured for mutations.', operation);
-    }
-
-    return mutationType;
-  }
-
-  if (operation.operation === 'subscription') {
-    var subscriptionType = schema.getSubscriptionType();
-
-    if (!subscriptionType) {
-      throw new _GraphQLError.GraphQLError('Schema is not configured for subscriptions.', operation);
-    }
-
-    return subscriptionType;
-  }
-
-  throw new _GraphQLError.GraphQLError('Can only have query, mutation and subscription operations.', operation);
-}
diff --git a/node_modules/graphql/utilities/getOperationRootType.js.flow b/node_modules/graphql/utilities/getOperationRootType.js.flow
deleted file mode 100644
index 107c6de..0000000
--- a/node_modules/graphql/utilities/getOperationRootType.js.flow
+++ /dev/null
@@ -1,57 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../error/GraphQLError';
-
-import {
-  type OperationDefinitionNode,
-  type OperationTypeDefinitionNode,
-} from '../language/ast';
-
-import { type GraphQLSchema } from '../type/schema';
-import { type GraphQLObjectType } from '../type/definition';
-
-/**
- * Extracts the root type of the operation from the schema.
- */
-export function getOperationRootType(
-  schema: GraphQLSchema,
-  operation: OperationDefinitionNode | OperationTypeDefinitionNode,
-): GraphQLObjectType {
-  if (operation.operation === 'query') {
-    const queryType = schema.getQueryType();
-    if (!queryType) {
-      throw new GraphQLError(
-        'Schema does not define the required query root type.',
-        operation,
-      );
-    }
-    return queryType;
-  }
-
-  if (operation.operation === 'mutation') {
-    const mutationType = schema.getMutationType();
-    if (!mutationType) {
-      throw new GraphQLError(
-        'Schema is not configured for mutations.',
-        operation,
-      );
-    }
-    return mutationType;
-  }
-
-  if (operation.operation === 'subscription') {
-    const subscriptionType = schema.getSubscriptionType();
-    if (!subscriptionType) {
-      throw new GraphQLError(
-        'Schema is not configured for subscriptions.',
-        operation,
-      );
-    }
-    return subscriptionType;
-  }
-
-  throw new GraphQLError(
-    'Can only have query, mutation and subscription operations.',
-    operation,
-  );
-}
diff --git a/node_modules/graphql/utilities/getOperationRootType.mjs b/node_modules/graphql/utilities/getOperationRootType.mjs
deleted file mode 100644
index e0b75d7..0000000
--- a/node_modules/graphql/utilities/getOperationRootType.mjs
+++ /dev/null
@@ -1,38 +0,0 @@
-import { GraphQLError } from "../error/GraphQLError.mjs";
-
-/**
- * Extracts the root type of the operation from the schema.
- */
-export function getOperationRootType(schema, operation) {
-  if (operation.operation === 'query') {
-    var queryType = schema.getQueryType();
-
-    if (!queryType) {
-      throw new GraphQLError('Schema does not define the required query root type.', operation);
-    }
-
-    return queryType;
-  }
-
-  if (operation.operation === 'mutation') {
-    var mutationType = schema.getMutationType();
-
-    if (!mutationType) {
-      throw new GraphQLError('Schema is not configured for mutations.', operation);
-    }
-
-    return mutationType;
-  }
-
-  if (operation.operation === 'subscription') {
-    var subscriptionType = schema.getSubscriptionType();
-
-    if (!subscriptionType) {
-      throw new GraphQLError('Schema is not configured for subscriptions.', operation);
-    }
-
-    return subscriptionType;
-  }
-
-  throw new GraphQLError('Can only have query, mutation and subscription operations.', operation);
-}
diff --git a/node_modules/graphql/utilities/index.d.ts b/node_modules/graphql/utilities/index.d.ts
deleted file mode 100644
index fadc54c..0000000
--- a/node_modules/graphql/utilities/index.d.ts
+++ /dev/null
@@ -1,116 +0,0 @@
-export {
-  // Produce the GraphQL query recommended for a full schema introspection.
-  // Accepts optional IntrospectionOptions.
-  getIntrospectionQuery,
-  IntrospectionOptions,
-  IntrospectionQuery,
-  IntrospectionSchema,
-  IntrospectionType,
-  IntrospectionInputType,
-  IntrospectionOutputType,
-  IntrospectionScalarType,
-  IntrospectionObjectType,
-  IntrospectionInterfaceType,
-  IntrospectionUnionType,
-  IntrospectionEnumType,
-  IntrospectionInputObjectType,
-  IntrospectionTypeRef,
-  IntrospectionInputTypeRef,
-  IntrospectionOutputTypeRef,
-  IntrospectionNamedTypeRef,
-  IntrospectionListTypeRef,
-  IntrospectionNonNullTypeRef,
-  IntrospectionField,
-  IntrospectionInputValue,
-  IntrospectionEnumValue,
-  IntrospectionDirective,
-} from './getIntrospectionQuery';
-
-// Gets the target Operation from a Document
-export { getOperationAST } from './getOperationAST';
-
-// Gets the Type for the target Operation AST.
-export { getOperationRootType } from './getOperationRootType';
-
-// Convert a GraphQLSchema to an IntrospectionQuery
-export { introspectionFromSchema } from './introspectionFromSchema';
-
-// Build a GraphQLSchema from an introspection result.
-export { buildClientSchema } from './buildClientSchema';
-
-// Build a GraphQLSchema from GraphQL Schema language.
-export {
-  buildASTSchema,
-  buildSchema,
-  BuildSchemaOptions,
-} from './buildASTSchema';
-
-// Extends an existing GraphQLSchema from a parsed GraphQL Schema language AST.
-export {
-  extendSchema,
-  // @deprecated: Get the description from a schema AST node and supports legacy
-  // syntax for specifying descriptions - will be removed in v16
-  getDescription,
-} from './extendSchema';
-
-// Sort a GraphQLSchema.
-export { lexicographicSortSchema } from './lexicographicSortSchema';
-
-// Print a GraphQLSchema to GraphQL Schema language.
-export {
-  printSchema,
-  printType,
-  printIntrospectionSchema,
-} from './printSchema';
-
-// Create a GraphQLType from a GraphQL language AST.
-export { typeFromAST } from './typeFromAST';
-
-// Create a JavaScript value from a GraphQL language AST with a type.
-export { valueFromAST } from './valueFromAST';
-
-// Create a JavaScript value from a GraphQL language AST without a type.
-export { valueFromASTUntyped } from './valueFromASTUntyped';
-
-// Create a GraphQL language AST from a JavaScript value.
-export { astFromValue } from './astFromValue';
-
-// A helper to use within recursive-descent visitors which need to be aware of
-// the GraphQL type system.
-export { TypeInfo, visitWithTypeInfo } from './TypeInfo';
-
-// Coerces a JavaScript value to a GraphQL type, or produces errors.
-export { coerceInputValue } from './coerceInputValue';
-
-// Concatenates multiple AST together.
-export { concatAST } from './concatAST';
-
-// Separates an AST into an AST per Operation.
-export { separateOperations } from './separateOperations';
-
-// Strips characters that are not significant to the validity or execution
-// of a GraphQL document.
-export { stripIgnoredCharacters } from './stripIgnoredCharacters';
-
-// Comparators for types
-export {
-  isEqualType,
-  isTypeSubTypeOf,
-  doTypesOverlap,
-} from './typeComparators';
-
-// Asserts that a string is a valid GraphQL name
-export { assertValidName, isValidNameError } from './assertValidName';
-
-// Compares two GraphQLSchemas and detects breaking changes.
-export {
-  BreakingChangeType,
-  DangerousChangeType,
-  findBreakingChanges,
-  findDangerousChanges,
-  BreakingChange,
-  DangerousChange,
-} from './findBreakingChanges';
-
-// Report all deprecated usage within a GraphQL document.
-export { findDeprecatedUsages } from './findDeprecatedUsages';
diff --git a/node_modules/graphql/utilities/index.js b/node_modules/graphql/utilities/index.js
deleted file mode 100644
index 0989000..0000000
--- a/node_modules/graphql/utilities/index.js
+++ /dev/null
@@ -1,247 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "getIntrospectionQuery", {
-  enumerable: true,
-  get: function get() {
-    return _getIntrospectionQuery.getIntrospectionQuery;
-  }
-});
-Object.defineProperty(exports, "getOperationAST", {
-  enumerable: true,
-  get: function get() {
-    return _getOperationAST.getOperationAST;
-  }
-});
-Object.defineProperty(exports, "getOperationRootType", {
-  enumerable: true,
-  get: function get() {
-    return _getOperationRootType.getOperationRootType;
-  }
-});
-Object.defineProperty(exports, "introspectionFromSchema", {
-  enumerable: true,
-  get: function get() {
-    return _introspectionFromSchema.introspectionFromSchema;
-  }
-});
-Object.defineProperty(exports, "buildClientSchema", {
-  enumerable: true,
-  get: function get() {
-    return _buildClientSchema.buildClientSchema;
-  }
-});
-Object.defineProperty(exports, "buildASTSchema", {
-  enumerable: true,
-  get: function get() {
-    return _buildASTSchema.buildASTSchema;
-  }
-});
-Object.defineProperty(exports, "buildSchema", {
-  enumerable: true,
-  get: function get() {
-    return _buildASTSchema.buildSchema;
-  }
-});
-Object.defineProperty(exports, "extendSchema", {
-  enumerable: true,
-  get: function get() {
-    return _extendSchema.extendSchema;
-  }
-});
-Object.defineProperty(exports, "getDescription", {
-  enumerable: true,
-  get: function get() {
-    return _extendSchema.getDescription;
-  }
-});
-Object.defineProperty(exports, "lexicographicSortSchema", {
-  enumerable: true,
-  get: function get() {
-    return _lexicographicSortSchema.lexicographicSortSchema;
-  }
-});
-Object.defineProperty(exports, "printSchema", {
-  enumerable: true,
-  get: function get() {
-    return _printSchema.printSchema;
-  }
-});
-Object.defineProperty(exports, "printType", {
-  enumerable: true,
-  get: function get() {
-    return _printSchema.printType;
-  }
-});
-Object.defineProperty(exports, "printIntrospectionSchema", {
-  enumerable: true,
-  get: function get() {
-    return _printSchema.printIntrospectionSchema;
-  }
-});
-Object.defineProperty(exports, "typeFromAST", {
-  enumerable: true,
-  get: function get() {
-    return _typeFromAST.typeFromAST;
-  }
-});
-Object.defineProperty(exports, "valueFromAST", {
-  enumerable: true,
-  get: function get() {
-    return _valueFromAST.valueFromAST;
-  }
-});
-Object.defineProperty(exports, "valueFromASTUntyped", {
-  enumerable: true,
-  get: function get() {
-    return _valueFromASTUntyped.valueFromASTUntyped;
-  }
-});
-Object.defineProperty(exports, "astFromValue", {
-  enumerable: true,
-  get: function get() {
-    return _astFromValue.astFromValue;
-  }
-});
-Object.defineProperty(exports, "TypeInfo", {
-  enumerable: true,
-  get: function get() {
-    return _TypeInfo.TypeInfo;
-  }
-});
-Object.defineProperty(exports, "visitWithTypeInfo", {
-  enumerable: true,
-  get: function get() {
-    return _TypeInfo.visitWithTypeInfo;
-  }
-});
-Object.defineProperty(exports, "coerceInputValue", {
-  enumerable: true,
-  get: function get() {
-    return _coerceInputValue.coerceInputValue;
-  }
-});
-Object.defineProperty(exports, "concatAST", {
-  enumerable: true,
-  get: function get() {
-    return _concatAST.concatAST;
-  }
-});
-Object.defineProperty(exports, "separateOperations", {
-  enumerable: true,
-  get: function get() {
-    return _separateOperations.separateOperations;
-  }
-});
-Object.defineProperty(exports, "stripIgnoredCharacters", {
-  enumerable: true,
-  get: function get() {
-    return _stripIgnoredCharacters.stripIgnoredCharacters;
-  }
-});
-Object.defineProperty(exports, "isEqualType", {
-  enumerable: true,
-  get: function get() {
-    return _typeComparators.isEqualType;
-  }
-});
-Object.defineProperty(exports, "isTypeSubTypeOf", {
-  enumerable: true,
-  get: function get() {
-    return _typeComparators.isTypeSubTypeOf;
-  }
-});
-Object.defineProperty(exports, "doTypesOverlap", {
-  enumerable: true,
-  get: function get() {
-    return _typeComparators.doTypesOverlap;
-  }
-});
-Object.defineProperty(exports, "assertValidName", {
-  enumerable: true,
-  get: function get() {
-    return _assertValidName.assertValidName;
-  }
-});
-Object.defineProperty(exports, "isValidNameError", {
-  enumerable: true,
-  get: function get() {
-    return _assertValidName.isValidNameError;
-  }
-});
-Object.defineProperty(exports, "BreakingChangeType", {
-  enumerable: true,
-  get: function get() {
-    return _findBreakingChanges.BreakingChangeType;
-  }
-});
-Object.defineProperty(exports, "DangerousChangeType", {
-  enumerable: true,
-  get: function get() {
-    return _findBreakingChanges.DangerousChangeType;
-  }
-});
-Object.defineProperty(exports, "findBreakingChanges", {
-  enumerable: true,
-  get: function get() {
-    return _findBreakingChanges.findBreakingChanges;
-  }
-});
-Object.defineProperty(exports, "findDangerousChanges", {
-  enumerable: true,
-  get: function get() {
-    return _findBreakingChanges.findDangerousChanges;
-  }
-});
-Object.defineProperty(exports, "findDeprecatedUsages", {
-  enumerable: true,
-  get: function get() {
-    return _findDeprecatedUsages.findDeprecatedUsages;
-  }
-});
-
-var _getIntrospectionQuery = require("./getIntrospectionQuery");
-
-var _getOperationAST = require("./getOperationAST");
-
-var _getOperationRootType = require("./getOperationRootType");
-
-var _introspectionFromSchema = require("./introspectionFromSchema");
-
-var _buildClientSchema = require("./buildClientSchema");
-
-var _buildASTSchema = require("./buildASTSchema");
-
-var _extendSchema = require("./extendSchema");
-
-var _lexicographicSortSchema = require("./lexicographicSortSchema");
-
-var _printSchema = require("./printSchema");
-
-var _typeFromAST = require("./typeFromAST");
-
-var _valueFromAST = require("./valueFromAST");
-
-var _valueFromASTUntyped = require("./valueFromASTUntyped");
-
-var _astFromValue = require("./astFromValue");
-
-var _TypeInfo = require("./TypeInfo");
-
-var _coerceInputValue = require("./coerceInputValue");
-
-var _concatAST = require("./concatAST");
-
-var _separateOperations = require("./separateOperations");
-
-var _stripIgnoredCharacters = require("./stripIgnoredCharacters");
-
-var _typeComparators = require("./typeComparators");
-
-var _assertValidName = require("./assertValidName");
-
-var _findBreakingChanges = require("./findBreakingChanges");
-
-var _findDeprecatedUsages = require("./findDeprecatedUsages");
diff --git a/node_modules/graphql/utilities/index.js.flow b/node_modules/graphql/utilities/index.js.flow
deleted file mode 100644
index 9949483..0000000
--- a/node_modules/graphql/utilities/index.js.flow
+++ /dev/null
@@ -1,115 +0,0 @@
-// @flow strict
-
-// Produce the GraphQL query recommended for a full schema introspection.
-// Accepts optional IntrospectionOptions.
-export { getIntrospectionQuery } from './getIntrospectionQuery';
-
-export type {
-  IntrospectionOptions,
-  IntrospectionQuery,
-  IntrospectionSchema,
-  IntrospectionType,
-  IntrospectionInputType,
-  IntrospectionOutputType,
-  IntrospectionScalarType,
-  IntrospectionObjectType,
-  IntrospectionInterfaceType,
-  IntrospectionUnionType,
-  IntrospectionEnumType,
-  IntrospectionInputObjectType,
-  IntrospectionTypeRef,
-  IntrospectionInputTypeRef,
-  IntrospectionOutputTypeRef,
-  IntrospectionNamedTypeRef,
-  IntrospectionListTypeRef,
-  IntrospectionNonNullTypeRef,
-  IntrospectionField,
-  IntrospectionInputValue,
-  IntrospectionEnumValue,
-  IntrospectionDirective,
-} from './getIntrospectionQuery';
-
-// Gets the target Operation from a Document.
-export { getOperationAST } from './getOperationAST';
-
-// Gets the Type for the target Operation AST.
-export { getOperationRootType } from './getOperationRootType';
-
-// Convert a GraphQLSchema to an IntrospectionQuery.
-export { introspectionFromSchema } from './introspectionFromSchema';
-
-// Build a GraphQLSchema from an introspection result.
-export { buildClientSchema } from './buildClientSchema';
-
-// Build a GraphQLSchema from GraphQL Schema language.
-export { buildASTSchema, buildSchema } from './buildASTSchema';
-export type { BuildSchemaOptions } from './buildASTSchema';
-
-// Extends an existing GraphQLSchema from a parsed GraphQL Schema language AST.
-export {
-  extendSchema,
-  // @deprecated: Get the description from a schema AST node and supports legacy
-  // syntax for specifying descriptions - will be removed in v16.
-  getDescription,
-} from './extendSchema';
-
-// Sort a GraphQLSchema.
-export { lexicographicSortSchema } from './lexicographicSortSchema';
-
-// Print a GraphQLSchema to GraphQL Schema language.
-export {
-  printSchema,
-  printType,
-  printIntrospectionSchema,
-} from './printSchema';
-
-// Create a GraphQLType from a GraphQL language AST.
-export { typeFromAST } from './typeFromAST';
-
-// Create a JavaScript value from a GraphQL language AST with a type.
-export { valueFromAST } from './valueFromAST';
-
-// Create a JavaScript value from a GraphQL language AST without a type.
-export { valueFromASTUntyped } from './valueFromASTUntyped';
-
-// Create a GraphQL language AST from a JavaScript value.
-export { astFromValue } from './astFromValue';
-
-// A helper to use within recursive-descent visitors which need to be aware of
-// the GraphQL type system.
-export { TypeInfo, visitWithTypeInfo } from './TypeInfo';
-
-// Coerces a JavaScript value to a GraphQL type, or produces errors.
-export { coerceInputValue } from './coerceInputValue';
-
-// Concatenates multiple AST together.
-export { concatAST } from './concatAST';
-
-// Separates an AST into an AST per Operation.
-export { separateOperations } from './separateOperations';
-
-// Strips characters that are not significant to the validity or execution
-// of a GraphQL document.
-export { stripIgnoredCharacters } from './stripIgnoredCharacters';
-
-// Comparators for types
-export {
-  isEqualType,
-  isTypeSubTypeOf,
-  doTypesOverlap,
-} from './typeComparators';
-
-// Asserts that a string is a valid GraphQL name
-export { assertValidName, isValidNameError } from './assertValidName';
-
-// Compares two GraphQLSchemas and detects breaking changes.
-export {
-  BreakingChangeType,
-  DangerousChangeType,
-  findBreakingChanges,
-  findDangerousChanges,
-} from './findBreakingChanges';
-export type { BreakingChange, DangerousChange } from './findBreakingChanges';
-
-// Report all deprecated usage within a GraphQL document.
-export { findDeprecatedUsages } from './findDeprecatedUsages';
diff --git a/node_modules/graphql/utilities/index.mjs b/node_modules/graphql/utilities/index.mjs
deleted file mode 100644
index 5e4ebde..0000000
--- a/node_modules/graphql/utilities/index.mjs
+++ /dev/null
@@ -1,49 +0,0 @@
-// Produce the GraphQL query recommended for a full schema introspection.
-// Accepts optional IntrospectionOptions.
-export { getIntrospectionQuery } from "./getIntrospectionQuery.mjs";
-// Gets the target Operation from a Document.
-export { getOperationAST } from "./getOperationAST.mjs"; // Gets the Type for the target Operation AST.
-
-export { getOperationRootType } from "./getOperationRootType.mjs"; // Convert a GraphQLSchema to an IntrospectionQuery.
-
-export { introspectionFromSchema } from "./introspectionFromSchema.mjs"; // Build a GraphQLSchema from an introspection result.
-
-export { buildClientSchema } from "./buildClientSchema.mjs"; // Build a GraphQLSchema from GraphQL Schema language.
-
-export { buildASTSchema, buildSchema } from "./buildASTSchema.mjs";
-// Extends an existing GraphQLSchema from a parsed GraphQL Schema language AST.
-export { extendSchema // @deprecated: Get the description from a schema AST node and supports legacy
-// syntax for specifying descriptions - will be removed in v16.
-, getDescription } from "./extendSchema.mjs"; // Sort a GraphQLSchema.
-
-export { lexicographicSortSchema } from "./lexicographicSortSchema.mjs"; // Print a GraphQLSchema to GraphQL Schema language.
-
-export { printSchema, printType, printIntrospectionSchema } from "./printSchema.mjs"; // Create a GraphQLType from a GraphQL language AST.
-
-export { typeFromAST } from "./typeFromAST.mjs"; // Create a JavaScript value from a GraphQL language AST with a type.
-
-export { valueFromAST } from "./valueFromAST.mjs"; // Create a JavaScript value from a GraphQL language AST without a type.
-
-export { valueFromASTUntyped } from "./valueFromASTUntyped.mjs"; // Create a GraphQL language AST from a JavaScript value.
-
-export { astFromValue } from "./astFromValue.mjs"; // A helper to use within recursive-descent visitors which need to be aware of
-// the GraphQL type system.
-
-export { TypeInfo, visitWithTypeInfo } from "./TypeInfo.mjs"; // Coerces a JavaScript value to a GraphQL type, or produces errors.
-
-export { coerceInputValue } from "./coerceInputValue.mjs"; // Concatenates multiple AST together.
-
-export { concatAST } from "./concatAST.mjs"; // Separates an AST into an AST per Operation.
-
-export { separateOperations } from "./separateOperations.mjs"; // Strips characters that are not significant to the validity or execution
-// of a GraphQL document.
-
-export { stripIgnoredCharacters } from "./stripIgnoredCharacters.mjs"; // Comparators for types
-
-export { isEqualType, isTypeSubTypeOf, doTypesOverlap } from "./typeComparators.mjs"; // Asserts that a string is a valid GraphQL name
-
-export { assertValidName, isValidNameError } from "./assertValidName.mjs"; // Compares two GraphQLSchemas and detects breaking changes.
-
-export { BreakingChangeType, DangerousChangeType, findBreakingChanges, findDangerousChanges } from "./findBreakingChanges.mjs";
-// Report all deprecated usage within a GraphQL document.
-export { findDeprecatedUsages } from "./findDeprecatedUsages.mjs";
diff --git a/node_modules/graphql/utilities/introspectionFromSchema.d.ts b/node_modules/graphql/utilities/introspectionFromSchema.d.ts
deleted file mode 100644
index ed9abf1..0000000
--- a/node_modules/graphql/utilities/introspectionFromSchema.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { GraphQLSchema } from '../type/schema';
-
-import {
-  IntrospectionQuery,
-  IntrospectionOptions,
-} from './getIntrospectionQuery';
-
-/**
- * Build an IntrospectionQuery from a GraphQLSchema
- *
- * IntrospectionQuery is useful for utilities that care about type and field
- * relationships, but do not need to traverse through those relationships.
- *
- * This is the inverse of buildClientSchema. The primary use case is outside
- * of the server context, for instance when doing schema comparisons.
- */
-export function introspectionFromSchema(
-  schema: GraphQLSchema,
-  options?: IntrospectionOptions,
-): IntrospectionQuery;
diff --git a/node_modules/graphql/utilities/introspectionFromSchema.js b/node_modules/graphql/utilities/introspectionFromSchema.js
deleted file mode 100644
index b352225..0000000
--- a/node_modules/graphql/utilities/introspectionFromSchema.js
+++ /dev/null
@@ -1,50 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.introspectionFromSchema = introspectionFromSchema;
-
-var _invariant = _interopRequireDefault(require("../jsutils/invariant"));
-
-var _isPromise = _interopRequireDefault(require("../jsutils/isPromise"));
-
-var _parser = require("../language/parser");
-
-var _execute = require("../execution/execute");
-
-var _getIntrospectionQuery = require("./getIntrospectionQuery");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-/**
- * Build an IntrospectionQuery from a GraphQLSchema
- *
- * IntrospectionQuery is useful for utilities that care about type and field
- * relationships, but do not need to traverse through those relationships.
- *
- * This is the inverse of buildClientSchema. The primary use case is outside
- * of the server context, for instance when doing schema comparisons.
- */
-function introspectionFromSchema(schema, options) {
-  var optionsWithDefaults = _objectSpread({
-    directiveIsRepeatable: true,
-    schemaDescription: true
-  }, options);
-
-  var document = (0, _parser.parse)((0, _getIntrospectionQuery.getIntrospectionQuery)(optionsWithDefaults));
-  var result = (0, _execute.execute)({
-    schema: schema,
-    document: document
-  });
-
-  /* istanbul ignore next */
-  !(0, _isPromise.default)(result) && !result.errors && result.data || (0, _invariant.default)(0);
-  return result.data;
-}
diff --git a/node_modules/graphql/utilities/introspectionFromSchema.js.flow b/node_modules/graphql/utilities/introspectionFromSchema.js.flow
deleted file mode 100644
index 7fe8dd6..0000000
--- a/node_modules/graphql/utilities/introspectionFromSchema.js.flow
+++ /dev/null
@@ -1,39 +0,0 @@
-// @flow strict
-
-import invariant from '../jsutils/invariant';
-import isPromise from '../jsutils/isPromise';
-
-import { parse } from '../language/parser';
-import { execute } from '../execution/execute';
-import { type GraphQLSchema } from '../type/schema';
-
-import {
-  type IntrospectionQuery,
-  type IntrospectionOptions,
-  getIntrospectionQuery,
-} from './getIntrospectionQuery';
-
-/**
- * Build an IntrospectionQuery from a GraphQLSchema
- *
- * IntrospectionQuery is useful for utilities that care about type and field
- * relationships, but do not need to traverse through those relationships.
- *
- * This is the inverse of buildClientSchema. The primary use case is outside
- * of the server context, for instance when doing schema comparisons.
- */
-export function introspectionFromSchema(
-  schema: GraphQLSchema,
-  options?: IntrospectionOptions,
-): IntrospectionQuery {
-  const optionsWithDefaults = {
-    directiveIsRepeatable: true,
-    schemaDescription: true,
-    ...options,
-  };
-
-  const document = parse(getIntrospectionQuery(optionsWithDefaults));
-  const result = execute({ schema, document });
-  invariant(!isPromise(result) && !result.errors && result.data);
-  return (result.data: any);
-}
diff --git a/node_modules/graphql/utilities/introspectionFromSchema.mjs b/node_modules/graphql/utilities/introspectionFromSchema.mjs
deleted file mode 100644
index 75f85b5..0000000
--- a/node_modules/graphql/utilities/introspectionFromSchema.mjs
+++ /dev/null
@@ -1,37 +0,0 @@
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-import invariant from "../jsutils/invariant.mjs";
-import isPromise from "../jsutils/isPromise.mjs";
-import { parse } from "../language/parser.mjs";
-import { execute } from "../execution/execute.mjs";
-import { getIntrospectionQuery } from "./getIntrospectionQuery.mjs";
-/**
- * Build an IntrospectionQuery from a GraphQLSchema
- *
- * IntrospectionQuery is useful for utilities that care about type and field
- * relationships, but do not need to traverse through those relationships.
- *
- * This is the inverse of buildClientSchema. The primary use case is outside
- * of the server context, for instance when doing schema comparisons.
- */
-
-export function introspectionFromSchema(schema, options) {
-  var optionsWithDefaults = _objectSpread({
-    directiveIsRepeatable: true,
-    schemaDescription: true
-  }, options);
-
-  var document = parse(getIntrospectionQuery(optionsWithDefaults));
-  var result = execute({
-    schema: schema,
-    document: document
-  });
-
-  /* istanbul ignore next */
-  !isPromise(result) && !result.errors && result.data || invariant(0);
-  return result.data;
-}
diff --git a/node_modules/graphql/utilities/lexicographicSortSchema.d.ts b/node_modules/graphql/utilities/lexicographicSortSchema.d.ts
deleted file mode 100644
index 7dfde70..0000000
--- a/node_modules/graphql/utilities/lexicographicSortSchema.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { GraphQLSchema } from '../type/schema';
-
-/**
- * Sort GraphQLSchema.
- *
- * This function returns a sorted copy of the given GraphQLSchema.
- */
-export function lexicographicSortSchema(schema: GraphQLSchema): GraphQLSchema;
diff --git a/node_modules/graphql/utilities/lexicographicSortSchema.js b/node_modules/graphql/utilities/lexicographicSortSchema.js
deleted file mode 100644
index 3d034bf..0000000
--- a/node_modules/graphql/utilities/lexicographicSortSchema.js
+++ /dev/null
@@ -1,199 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.lexicographicSortSchema = lexicographicSortSchema;
-
-var _objectValues = _interopRequireDefault(require("../polyfills/objectValues"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _invariant = _interopRequireDefault(require("../jsutils/invariant"));
-
-var _keyValMap = _interopRequireDefault(require("../jsutils/keyValMap"));
-
-var _schema = require("../type/schema");
-
-var _directives = require("../type/directives");
-
-var _introspection = require("../type/introspection");
-
-var _definition = require("../type/definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-/**
- * Sort GraphQLSchema.
- *
- * This function returns a sorted copy of the given GraphQLSchema.
- */
-function lexicographicSortSchema(schema) {
-  var schemaConfig = schema.toConfig();
-  var typeMap = (0, _keyValMap.default)(sortByName(schemaConfig.types), function (type) {
-    return type.name;
-  }, sortNamedType);
-  return new _schema.GraphQLSchema(_objectSpread({}, schemaConfig, {
-    types: (0, _objectValues.default)(typeMap),
-    directives: sortByName(schemaConfig.directives).map(sortDirective),
-    query: replaceMaybeType(schemaConfig.query),
-    mutation: replaceMaybeType(schemaConfig.mutation),
-    subscription: replaceMaybeType(schemaConfig.subscription)
-  }));
-
-  function replaceType(type) {
-    if ((0, _definition.isListType)(type)) {
-      return new _definition.GraphQLList(replaceType(type.ofType));
-    } else if ((0, _definition.isNonNullType)(type)) {
-      return new _definition.GraphQLNonNull(replaceType(type.ofType));
-    }
-
-    return replaceNamedType(type);
-  }
-
-  function replaceNamedType(type) {
-    return typeMap[type.name];
-  }
-
-  function replaceMaybeType(maybeType) {
-    return maybeType && replaceNamedType(maybeType);
-  }
-
-  function sortDirective(directive) {
-    var config = directive.toConfig();
-    return new _directives.GraphQLDirective(_objectSpread({}, config, {
-      locations: sortBy(config.locations, function (x) {
-        return x;
-      }),
-      args: sortArgs(config.args)
-    }));
-  }
-
-  function sortArgs(args) {
-    return sortObjMap(args, function (arg) {
-      return _objectSpread({}, arg, {
-        type: replaceType(arg.type)
-      });
-    });
-  }
-
-  function sortFields(fieldsMap) {
-    return sortObjMap(fieldsMap, function (field) {
-      return _objectSpread({}, field, {
-        type: replaceType(field.type),
-        args: sortArgs(field.args)
-      });
-    });
-  }
-
-  function sortInputFields(fieldsMap) {
-    return sortObjMap(fieldsMap, function (field) {
-      return _objectSpread({}, field, {
-        type: replaceType(field.type)
-      });
-    });
-  }
-
-  function sortTypes(arr) {
-    return sortByName(arr).map(replaceNamedType);
-  }
-
-  function sortNamedType(type) {
-    if ((0, _definition.isScalarType)(type) || (0, _introspection.isIntrospectionType)(type)) {
-      return type;
-    }
-
-    if ((0, _definition.isObjectType)(type)) {
-      var config = type.toConfig();
-      return new _definition.GraphQLObjectType(_objectSpread({}, config, {
-        interfaces: function interfaces() {
-          return sortTypes(config.interfaces);
-        },
-        fields: function fields() {
-          return sortFields(config.fields);
-        }
-      }));
-    }
-
-    if ((0, _definition.isInterfaceType)(type)) {
-      var _config = type.toConfig();
-
-      return new _definition.GraphQLInterfaceType(_objectSpread({}, _config, {
-        interfaces: function interfaces() {
-          return sortTypes(_config.interfaces);
-        },
-        fields: function fields() {
-          return sortFields(_config.fields);
-        }
-      }));
-    }
-
-    if ((0, _definition.isUnionType)(type)) {
-      var _config2 = type.toConfig();
-
-      return new _definition.GraphQLUnionType(_objectSpread({}, _config2, {
-        types: function types() {
-          return sortTypes(_config2.types);
-        }
-      }));
-    }
-
-    if ((0, _definition.isEnumType)(type)) {
-      var _config3 = type.toConfig();
-
-      return new _definition.GraphQLEnumType(_objectSpread({}, _config3, {
-        values: sortObjMap(_config3.values)
-      }));
-    }
-
-    /* istanbul ignore else */
-    if ((0, _definition.isInputObjectType)(type)) {
-      var _config4 = type.toConfig();
-
-      return new _definition.GraphQLInputObjectType(_objectSpread({}, _config4, {
-        fields: function fields() {
-          return sortInputFields(_config4.fields);
-        }
-      }));
-    } // Not reachable. All possible types have been considered.
-
-
-    /* istanbul ignore next */
-    (0, _invariant.default)(false, 'Unexpected type: ' + (0, _inspect.default)(type));
-  }
-}
-
-function sortObjMap(map, sortValueFn) {
-  var sortedMap = Object.create(null);
-  var sortedKeys = sortBy(Object.keys(map), function (x) {
-    return x;
-  });
-
-  for (var _i2 = 0; _i2 < sortedKeys.length; _i2++) {
-    var key = sortedKeys[_i2];
-    var value = map[key];
-    sortedMap[key] = sortValueFn ? sortValueFn(value) : value;
-  }
-
-  return sortedMap;
-}
-
-function sortByName(array) {
-  return sortBy(array, function (obj) {
-    return obj.name;
-  });
-}
-
-function sortBy(array, mapToKey) {
-  return array.slice().sort(function (obj1, obj2) {
-    var key1 = mapToKey(obj1);
-    var key2 = mapToKey(obj2);
-    return key1.localeCompare(key2);
-  });
-}
diff --git a/node_modules/graphql/utilities/lexicographicSortSchema.js.flow b/node_modules/graphql/utilities/lexicographicSortSchema.js.flow
deleted file mode 100644
index c9b932f..0000000
--- a/node_modules/graphql/utilities/lexicographicSortSchema.js.flow
+++ /dev/null
@@ -1,175 +0,0 @@
-// @flow strict
-
-import objectValues from '../polyfills/objectValues';
-
-import inspect from '../jsutils/inspect';
-import invariant from '../jsutils/invariant';
-import keyValMap from '../jsutils/keyValMap';
-import { type ObjMap } from '../jsutils/ObjMap';
-
-import { GraphQLSchema } from '../type/schema';
-import { GraphQLDirective } from '../type/directives';
-import { isIntrospectionType } from '../type/introspection';
-import {
-  type GraphQLNamedType,
-  GraphQLObjectType,
-  GraphQLInterfaceType,
-  GraphQLUnionType,
-  GraphQLEnumType,
-  GraphQLInputObjectType,
-  GraphQLList,
-  GraphQLNonNull,
-  isListType,
-  isNonNullType,
-  isScalarType,
-  isObjectType,
-  isInterfaceType,
-  isUnionType,
-  isEnumType,
-  isInputObjectType,
-} from '../type/definition';
-
-/**
- * Sort GraphQLSchema.
- *
- * This function returns a sorted copy of the given GraphQLSchema.
- */
-export function lexicographicSortSchema(schema: GraphQLSchema): GraphQLSchema {
-  const schemaConfig = schema.toConfig();
-  const typeMap = keyValMap(
-    sortByName(schemaConfig.types),
-    type => type.name,
-    sortNamedType,
-  );
-
-  return new GraphQLSchema({
-    ...schemaConfig,
-    types: objectValues(typeMap),
-    directives: sortByName(schemaConfig.directives).map(sortDirective),
-    query: replaceMaybeType(schemaConfig.query),
-    mutation: replaceMaybeType(schemaConfig.mutation),
-    subscription: replaceMaybeType(schemaConfig.subscription),
-  });
-
-  function replaceType(type) {
-    if (isListType(type)) {
-      return new GraphQLList(replaceType(type.ofType));
-    } else if (isNonNullType(type)) {
-      return new GraphQLNonNull(replaceType(type.ofType));
-    }
-    return replaceNamedType(type);
-  }
-
-  function replaceNamedType<T: GraphQLNamedType>(type: T): T {
-    return ((typeMap[type.name]: any): T);
-  }
-
-  function replaceMaybeType(maybeType) {
-    return maybeType && replaceNamedType(maybeType);
-  }
-
-  function sortDirective(directive) {
-    const config = directive.toConfig();
-    return new GraphQLDirective({
-      ...config,
-      locations: sortBy(config.locations, x => x),
-      args: sortArgs(config.args),
-    });
-  }
-
-  function sortArgs(args) {
-    return sortObjMap(args, arg => ({
-      ...arg,
-      type: replaceType(arg.type),
-    }));
-  }
-
-  function sortFields(fieldsMap) {
-    return sortObjMap(fieldsMap, field => ({
-      ...field,
-      type: replaceType(field.type),
-      args: sortArgs(field.args),
-    }));
-  }
-
-  function sortInputFields(fieldsMap) {
-    return sortObjMap(fieldsMap, field => ({
-      ...field,
-      type: replaceType(field.type),
-    }));
-  }
-
-  function sortTypes<T: GraphQLNamedType>(arr: $ReadOnlyArray<T>): Array<T> {
-    return sortByName(arr).map(replaceNamedType);
-  }
-
-  function sortNamedType(type) {
-    if (isScalarType(type) || isIntrospectionType(type)) {
-      return type;
-    }
-    if (isObjectType(type)) {
-      const config = type.toConfig();
-      return new GraphQLObjectType({
-        ...config,
-        interfaces: () => sortTypes(config.interfaces),
-        fields: () => sortFields(config.fields),
-      });
-    }
-    if (isInterfaceType(type)) {
-      const config = type.toConfig();
-      return new GraphQLInterfaceType({
-        ...config,
-        interfaces: () => sortTypes(config.interfaces),
-        fields: () => sortFields(config.fields),
-      });
-    }
-    if (isUnionType(type)) {
-      const config = type.toConfig();
-      return new GraphQLUnionType({
-        ...config,
-        types: () => sortTypes(config.types),
-      });
-    }
-    if (isEnumType(type)) {
-      const config = type.toConfig();
-      return new GraphQLEnumType({
-        ...config,
-        values: sortObjMap(config.values),
-      });
-    }
-    if (isInputObjectType(type)) {
-      const config = type.toConfig();
-      return new GraphQLInputObjectType({
-        ...config,
-        fields: () => sortInputFields(config.fields),
-      });
-    }
-
-    // Not reachable. All possible types have been considered.
-    invariant(false, 'Unexpected type: ' + inspect((type: empty)));
-  }
-}
-
-function sortObjMap<T, R>(map: ObjMap<T>, sortValueFn?: T => R): ObjMap<R> {
-  const sortedMap = Object.create(null);
-  const sortedKeys = sortBy(Object.keys(map), x => x);
-  for (const key of sortedKeys) {
-    const value = map[key];
-    sortedMap[key] = sortValueFn ? sortValueFn(value) : value;
-  }
-  return sortedMap;
-}
-
-function sortByName<T: { +name: string, ... }>(
-  array: $ReadOnlyArray<T>,
-): Array<T> {
-  return sortBy(array, obj => obj.name);
-}
-
-function sortBy<T>(array: $ReadOnlyArray<T>, mapToKey: T => string): Array<T> {
-  return array.slice().sort((obj1, obj2) => {
-    const key1 = mapToKey(obj1);
-    const key2 = mapToKey(obj2);
-    return key1.localeCompare(key2);
-  });
-}
diff --git a/node_modules/graphql/utilities/lexicographicSortSchema.mjs b/node_modules/graphql/utilities/lexicographicSortSchema.mjs
deleted file mode 100644
index 5a51c92..0000000
--- a/node_modules/graphql/utilities/lexicographicSortSchema.mjs
+++ /dev/null
@@ -1,183 +0,0 @@
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-import objectValues from "../polyfills/objectValues.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import invariant from "../jsutils/invariant.mjs";
-import keyValMap from "../jsutils/keyValMap.mjs";
-import { GraphQLSchema } from "../type/schema.mjs";
-import { GraphQLDirective } from "../type/directives.mjs";
-import { isIntrospectionType } from "../type/introspection.mjs";
-import { GraphQLObjectType, GraphQLInterfaceType, GraphQLUnionType, GraphQLEnumType, GraphQLInputObjectType, GraphQLList, GraphQLNonNull, isListType, isNonNullType, isScalarType, isObjectType, isInterfaceType, isUnionType, isEnumType, isInputObjectType } from "../type/definition.mjs";
-/**
- * Sort GraphQLSchema.
- *
- * This function returns a sorted copy of the given GraphQLSchema.
- */
-
-export function lexicographicSortSchema(schema) {
-  var schemaConfig = schema.toConfig();
-  var typeMap = keyValMap(sortByName(schemaConfig.types), function (type) {
-    return type.name;
-  }, sortNamedType);
-  return new GraphQLSchema(_objectSpread({}, schemaConfig, {
-    types: objectValues(typeMap),
-    directives: sortByName(schemaConfig.directives).map(sortDirective),
-    query: replaceMaybeType(schemaConfig.query),
-    mutation: replaceMaybeType(schemaConfig.mutation),
-    subscription: replaceMaybeType(schemaConfig.subscription)
-  }));
-
-  function replaceType(type) {
-    if (isListType(type)) {
-      return new GraphQLList(replaceType(type.ofType));
-    } else if (isNonNullType(type)) {
-      return new GraphQLNonNull(replaceType(type.ofType));
-    }
-
-    return replaceNamedType(type);
-  }
-
-  function replaceNamedType(type) {
-    return typeMap[type.name];
-  }
-
-  function replaceMaybeType(maybeType) {
-    return maybeType && replaceNamedType(maybeType);
-  }
-
-  function sortDirective(directive) {
-    var config = directive.toConfig();
-    return new GraphQLDirective(_objectSpread({}, config, {
-      locations: sortBy(config.locations, function (x) {
-        return x;
-      }),
-      args: sortArgs(config.args)
-    }));
-  }
-
-  function sortArgs(args) {
-    return sortObjMap(args, function (arg) {
-      return _objectSpread({}, arg, {
-        type: replaceType(arg.type)
-      });
-    });
-  }
-
-  function sortFields(fieldsMap) {
-    return sortObjMap(fieldsMap, function (field) {
-      return _objectSpread({}, field, {
-        type: replaceType(field.type),
-        args: sortArgs(field.args)
-      });
-    });
-  }
-
-  function sortInputFields(fieldsMap) {
-    return sortObjMap(fieldsMap, function (field) {
-      return _objectSpread({}, field, {
-        type: replaceType(field.type)
-      });
-    });
-  }
-
-  function sortTypes(arr) {
-    return sortByName(arr).map(replaceNamedType);
-  }
-
-  function sortNamedType(type) {
-    if (isScalarType(type) || isIntrospectionType(type)) {
-      return type;
-    }
-
-    if (isObjectType(type)) {
-      var config = type.toConfig();
-      return new GraphQLObjectType(_objectSpread({}, config, {
-        interfaces: function interfaces() {
-          return sortTypes(config.interfaces);
-        },
-        fields: function fields() {
-          return sortFields(config.fields);
-        }
-      }));
-    }
-
-    if (isInterfaceType(type)) {
-      var _config = type.toConfig();
-
-      return new GraphQLInterfaceType(_objectSpread({}, _config, {
-        interfaces: function interfaces() {
-          return sortTypes(_config.interfaces);
-        },
-        fields: function fields() {
-          return sortFields(_config.fields);
-        }
-      }));
-    }
-
-    if (isUnionType(type)) {
-      var _config2 = type.toConfig();
-
-      return new GraphQLUnionType(_objectSpread({}, _config2, {
-        types: function types() {
-          return sortTypes(_config2.types);
-        }
-      }));
-    }
-
-    if (isEnumType(type)) {
-      var _config3 = type.toConfig();
-
-      return new GraphQLEnumType(_objectSpread({}, _config3, {
-        values: sortObjMap(_config3.values)
-      }));
-    }
-
-    /* istanbul ignore else */
-    if (isInputObjectType(type)) {
-      var _config4 = type.toConfig();
-
-      return new GraphQLInputObjectType(_objectSpread({}, _config4, {
-        fields: function fields() {
-          return sortInputFields(_config4.fields);
-        }
-      }));
-    } // Not reachable. All possible types have been considered.
-
-
-    /* istanbul ignore next */
-    invariant(false, 'Unexpected type: ' + inspect(type));
-  }
-}
-
-function sortObjMap(map, sortValueFn) {
-  var sortedMap = Object.create(null);
-  var sortedKeys = sortBy(Object.keys(map), function (x) {
-    return x;
-  });
-
-  for (var _i2 = 0; _i2 < sortedKeys.length; _i2++) {
-    var key = sortedKeys[_i2];
-    var value = map[key];
-    sortedMap[key] = sortValueFn ? sortValueFn(value) : value;
-  }
-
-  return sortedMap;
-}
-
-function sortByName(array) {
-  return sortBy(array, function (obj) {
-    return obj.name;
-  });
-}
-
-function sortBy(array, mapToKey) {
-  return array.slice().sort(function (obj1, obj2) {
-    var key1 = mapToKey(obj1);
-    var key2 = mapToKey(obj2);
-    return key1.localeCompare(key2);
-  });
-}
diff --git a/node_modules/graphql/utilities/printSchema.d.ts b/node_modules/graphql/utilities/printSchema.d.ts
deleted file mode 100644
index 1417ee5..0000000
--- a/node_modules/graphql/utilities/printSchema.d.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { GraphQLSchema } from '../type/schema';
-import { GraphQLNamedType } from '../type/definition';
-
-export interface Options {
-  /**
-   * Descriptions are defined as preceding string literals, however an older
-   * experimental version of the SDL supported preceding comments as
-   * descriptions. Set to true to enable this deprecated behavior.
-   * This option is provided to ease adoption and will be removed in v16.
-   *
-   * Default: false
-   */
-  commentDescriptions?: boolean;
-}
-
-/**
- * Accepts options as a second argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-export function printSchema(schema: GraphQLSchema, options?: Options): string;
-
-export function printIntrospectionSchema(
-  schema: GraphQLSchema,
-  options?: Options,
-): string;
-
-export function printType(type: GraphQLNamedType, options?: Options): string;
diff --git a/node_modules/graphql/utilities/printSchema.js b/node_modules/graphql/utilities/printSchema.js
deleted file mode 100644
index 3351975..0000000
--- a/node_modules/graphql/utilities/printSchema.js
+++ /dev/null
@@ -1,280 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.printSchema = printSchema;
-exports.printIntrospectionSchema = printIntrospectionSchema;
-exports.printType = printType;
-
-var _objectValues = _interopRequireDefault(require("../polyfills/objectValues"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _invariant = _interopRequireDefault(require("../jsutils/invariant"));
-
-var _printer = require("../language/printer");
-
-var _blockString = require("../language/blockString");
-
-var _introspection = require("../type/introspection");
-
-var _scalars = require("../type/scalars");
-
-var _directives = require("../type/directives");
-
-var _definition = require("../type/definition");
-
-var _astFromValue = require("./astFromValue");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Accepts options as a second argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-function printSchema(schema, options) {
-  return printFilteredSchema(schema, function (n) {
-    return !(0, _directives.isSpecifiedDirective)(n);
-  }, isDefinedType, options);
-}
-
-function printIntrospectionSchema(schema, options) {
-  return printFilteredSchema(schema, _directives.isSpecifiedDirective, _introspection.isIntrospectionType, options);
-}
-
-function isDefinedType(type) {
-  return !(0, _scalars.isSpecifiedScalarType)(type) && !(0, _introspection.isIntrospectionType)(type);
-}
-
-function printFilteredSchema(schema, directiveFilter, typeFilter, options) {
-  var directives = schema.getDirectives().filter(directiveFilter);
-  var types = (0, _objectValues.default)(schema.getTypeMap()).filter(typeFilter);
-  return [printSchemaDefinition(schema)].concat(directives.map(function (directive) {
-    return printDirective(directive, options);
-  }), types.map(function (type) {
-    return printType(type, options);
-  })).filter(Boolean).join('\n\n') + '\n';
-}
-
-function printSchemaDefinition(schema) {
-  if (schema.description == null && isSchemaOfCommonNames(schema)) {
-    return;
-  }
-
-  var operationTypes = [];
-  var queryType = schema.getQueryType();
-
-  if (queryType) {
-    operationTypes.push("  query: ".concat(queryType.name));
-  }
-
-  var mutationType = schema.getMutationType();
-
-  if (mutationType) {
-    operationTypes.push("  mutation: ".concat(mutationType.name));
-  }
-
-  var subscriptionType = schema.getSubscriptionType();
-
-  if (subscriptionType) {
-    operationTypes.push("  subscription: ".concat(subscriptionType.name));
-  }
-
-  return printDescription({}, schema) + "schema {\n".concat(operationTypes.join('\n'), "\n}");
-}
-/**
- * GraphQL schema define root types for each type of operation. These types are
- * the same as any other type and can be named in any manner, however there is
- * a common naming convention:
- *
- *   schema {
- *     query: Query
- *     mutation: Mutation
- *   }
- *
- * When using this naming convention, the schema description can be omitted.
- */
-
-
-function isSchemaOfCommonNames(schema) {
-  var queryType = schema.getQueryType();
-
-  if (queryType && queryType.name !== 'Query') {
-    return false;
-  }
-
-  var mutationType = schema.getMutationType();
-
-  if (mutationType && mutationType.name !== 'Mutation') {
-    return false;
-  }
-
-  var subscriptionType = schema.getSubscriptionType();
-
-  if (subscriptionType && subscriptionType.name !== 'Subscription') {
-    return false;
-  }
-
-  return true;
-}
-
-function printType(type, options) {
-  if ((0, _definition.isScalarType)(type)) {
-    return printScalar(type, options);
-  }
-
-  if ((0, _definition.isObjectType)(type)) {
-    return printObject(type, options);
-  }
-
-  if ((0, _definition.isInterfaceType)(type)) {
-    return printInterface(type, options);
-  }
-
-  if ((0, _definition.isUnionType)(type)) {
-    return printUnion(type, options);
-  }
-
-  if ((0, _definition.isEnumType)(type)) {
-    return printEnum(type, options);
-  }
-
-  /* istanbul ignore else */
-  if ((0, _definition.isInputObjectType)(type)) {
-    return printInputObject(type, options);
-  } // Not reachable. All possible types have been considered.
-
-
-  /* istanbul ignore next */
-  (0, _invariant.default)(false, 'Unexpected type: ' + (0, _inspect.default)(type));
-}
-
-function printScalar(type, options) {
-  return printDescription(options, type) + "scalar ".concat(type.name);
-}
-
-function printImplementedInterfaces(type) {
-  var interfaces = type.getInterfaces();
-  return interfaces.length ? ' implements ' + interfaces.map(function (i) {
-    return i.name;
-  }).join(' & ') : '';
-}
-
-function printObject(type, options) {
-  return printDescription(options, type) + "type ".concat(type.name) + printImplementedInterfaces(type) + printFields(options, type);
-}
-
-function printInterface(type, options) {
-  return printDescription(options, type) + "interface ".concat(type.name) + printImplementedInterfaces(type) + printFields(options, type);
-}
-
-function printUnion(type, options) {
-  var types = type.getTypes();
-  var possibleTypes = types.length ? ' = ' + types.join(' | ') : '';
-  return printDescription(options, type) + 'union ' + type.name + possibleTypes;
-}
-
-function printEnum(type, options) {
-  var values = type.getValues().map(function (value, i) {
-    return printDescription(options, value, '  ', !i) + '  ' + value.name + printDeprecated(value);
-  });
-  return printDescription(options, type) + "enum ".concat(type.name) + printBlock(values);
-}
-
-function printInputObject(type, options) {
-  var fields = (0, _objectValues.default)(type.getFields()).map(function (f, i) {
-    return printDescription(options, f, '  ', !i) + '  ' + printInputValue(f);
-  });
-  return printDescription(options, type) + "input ".concat(type.name) + printBlock(fields);
-}
-
-function printFields(options, type) {
-  var fields = (0, _objectValues.default)(type.getFields()).map(function (f, i) {
-    return printDescription(options, f, '  ', !i) + '  ' + f.name + printArgs(options, f.args, '  ') + ': ' + String(f.type) + printDeprecated(f);
-  });
-  return printBlock(fields);
-}
-
-function printBlock(items) {
-  return items.length !== 0 ? ' {\n' + items.join('\n') + '\n}' : '';
-}
-
-function printArgs(options, args) {
-  var indentation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
-
-  if (args.length === 0) {
-    return '';
-  } // If every arg does not have a description, print them on one line.
-
-
-  if (args.every(function (arg) {
-    return !arg.description;
-  })) {
-    return '(' + args.map(printInputValue).join(', ') + ')';
-  }
-
-  return '(\n' + args.map(function (arg, i) {
-    return printDescription(options, arg, '  ' + indentation, !i) + '  ' + indentation + printInputValue(arg);
-  }).join('\n') + '\n' + indentation + ')';
-}
-
-function printInputValue(arg) {
-  var defaultAST = (0, _astFromValue.astFromValue)(arg.defaultValue, arg.type);
-  var argDecl = arg.name + ': ' + String(arg.type);
-
-  if (defaultAST) {
-    argDecl += " = ".concat((0, _printer.print)(defaultAST));
-  }
-
-  return argDecl;
-}
-
-function printDirective(directive, options) {
-  return printDescription(options, directive) + 'directive @' + directive.name + printArgs(options, directive.args) + (directive.isRepeatable ? ' repeatable' : '') + ' on ' + directive.locations.join(' | ');
-}
-
-function printDeprecated(fieldOrEnumVal) {
-  if (!fieldOrEnumVal.isDeprecated) {
-    return '';
-  }
-
-  var reason = fieldOrEnumVal.deprecationReason;
-  var reasonAST = (0, _astFromValue.astFromValue)(reason, _scalars.GraphQLString);
-
-  if (reasonAST && reason !== _directives.DEFAULT_DEPRECATION_REASON) {
-    return ' @deprecated(reason: ' + (0, _printer.print)(reasonAST) + ')';
-  }
-
-  return ' @deprecated';
-}
-
-function printDescription(options, def) {
-  var indentation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
-  var firstInBlock = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
-  var description = def.description;
-
-  if (description == null) {
-    return '';
-  }
-
-  if ((options === null || options === void 0 ? void 0 : options.commentDescriptions) === true) {
-    return printDescriptionWithComments(description, indentation, firstInBlock);
-  }
-
-  var preferMultipleLines = description.length > 70;
-  var blockString = (0, _blockString.printBlockString)(description, '', preferMultipleLines);
-  var prefix = indentation && !firstInBlock ? '\n' + indentation : indentation;
-  return prefix + blockString.replace(/\n/g, '\n' + indentation) + '\n';
-}
-
-function printDescriptionWithComments(description, indentation, firstInBlock) {
-  var prefix = indentation && !firstInBlock ? '\n' : '';
-  var comment = description.split('\n').map(function (line) {
-    return indentation + (line !== '' ? '# ' + line : '#');
-  }).join('\n');
-  return prefix + comment + '\n';
-}
diff --git a/node_modules/graphql/utilities/printSchema.js.flow b/node_modules/graphql/utilities/printSchema.js.flow
deleted file mode 100644
index 674d5b2..0000000
--- a/node_modules/graphql/utilities/printSchema.js.flow
+++ /dev/null
@@ -1,355 +0,0 @@
-// @flow strict
-
-import objectValues from '../polyfills/objectValues';
-
-import inspect from '../jsutils/inspect';
-import invariant from '../jsutils/invariant';
-
-import { print } from '../language/printer';
-import { printBlockString } from '../language/blockString';
-
-import { type GraphQLSchema } from '../type/schema';
-import { isIntrospectionType } from '../type/introspection';
-import { GraphQLString, isSpecifiedScalarType } from '../type/scalars';
-import {
-  GraphQLDirective,
-  DEFAULT_DEPRECATION_REASON,
-  isSpecifiedDirective,
-} from '../type/directives';
-import {
-  type GraphQLNamedType,
-  type GraphQLScalarType,
-  type GraphQLEnumType,
-  type GraphQLObjectType,
-  type GraphQLInterfaceType,
-  type GraphQLUnionType,
-  type GraphQLInputObjectType,
-  isScalarType,
-  isObjectType,
-  isInterfaceType,
-  isUnionType,
-  isEnumType,
-  isInputObjectType,
-} from '../type/definition';
-
-import { astFromValue } from './astFromValue';
-
-type Options = {|
-  /**
-   * Descriptions are defined as preceding string literals, however an older
-   * experimental version of the SDL supported preceding comments as
-   * descriptions. Set to true to enable this deprecated behavior.
-   * This option is provided to ease adoption and will be removed in v16.
-   *
-   * Default: false
-   */
-  commentDescriptions?: boolean,
-|};
-
-/**
- * Accepts options as a second argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-export function printSchema(schema: GraphQLSchema, options?: Options): string {
-  return printFilteredSchema(
-    schema,
-    n => !isSpecifiedDirective(n),
-    isDefinedType,
-    options,
-  );
-}
-
-export function printIntrospectionSchema(
-  schema: GraphQLSchema,
-  options?: Options,
-): string {
-  return printFilteredSchema(
-    schema,
-    isSpecifiedDirective,
-    isIntrospectionType,
-    options,
-  );
-}
-
-function isDefinedType(type: GraphQLNamedType): boolean {
-  return !isSpecifiedScalarType(type) && !isIntrospectionType(type);
-}
-
-function printFilteredSchema(
-  schema: GraphQLSchema,
-  directiveFilter: (type: GraphQLDirective) => boolean,
-  typeFilter: (type: GraphQLNamedType) => boolean,
-  options,
-): string {
-  const directives = schema.getDirectives().filter(directiveFilter);
-  const types = objectValues(schema.getTypeMap()).filter(typeFilter);
-
-  return (
-    [printSchemaDefinition(schema)]
-      .concat(
-        directives.map(directive => printDirective(directive, options)),
-        types.map(type => printType(type, options)),
-      )
-      .filter(Boolean)
-      .join('\n\n') + '\n'
-  );
-}
-
-function printSchemaDefinition(schema: GraphQLSchema): ?string {
-  if (schema.description == null && isSchemaOfCommonNames(schema)) {
-    return;
-  }
-
-  const operationTypes = [];
-
-  const queryType = schema.getQueryType();
-  if (queryType) {
-    operationTypes.push(`  query: ${queryType.name}`);
-  }
-
-  const mutationType = schema.getMutationType();
-  if (mutationType) {
-    operationTypes.push(`  mutation: ${mutationType.name}`);
-  }
-
-  const subscriptionType = schema.getSubscriptionType();
-  if (subscriptionType) {
-    operationTypes.push(`  subscription: ${subscriptionType.name}`);
-  }
-
-  return (
-    printDescription({}, schema) + `schema {\n${operationTypes.join('\n')}\n}`
-  );
-}
-
-/**
- * GraphQL schema define root types for each type of operation. These types are
- * the same as any other type and can be named in any manner, however there is
- * a common naming convention:
- *
- *   schema {
- *     query: Query
- *     mutation: Mutation
- *   }
- *
- * When using this naming convention, the schema description can be omitted.
- */
-function isSchemaOfCommonNames(schema: GraphQLSchema): boolean {
-  const queryType = schema.getQueryType();
-  if (queryType && queryType.name !== 'Query') {
-    return false;
-  }
-
-  const mutationType = schema.getMutationType();
-  if (mutationType && mutationType.name !== 'Mutation') {
-    return false;
-  }
-
-  const subscriptionType = schema.getSubscriptionType();
-  if (subscriptionType && subscriptionType.name !== 'Subscription') {
-    return false;
-  }
-
-  return true;
-}
-
-export function printType(type: GraphQLNamedType, options?: Options): string {
-  if (isScalarType(type)) {
-    return printScalar(type, options);
-  }
-  if (isObjectType(type)) {
-    return printObject(type, options);
-  }
-  if (isInterfaceType(type)) {
-    return printInterface(type, options);
-  }
-  if (isUnionType(type)) {
-    return printUnion(type, options);
-  }
-  if (isEnumType(type)) {
-    return printEnum(type, options);
-  }
-  if (isInputObjectType(type)) {
-    return printInputObject(type, options);
-  }
-
-  // Not reachable. All possible types have been considered.
-  invariant(false, 'Unexpected type: ' + inspect((type: empty)));
-}
-
-function printScalar(type: GraphQLScalarType, options): string {
-  return printDescription(options, type) + `scalar ${type.name}`;
-}
-
-function printImplementedInterfaces(
-  type: GraphQLObjectType | GraphQLInterfaceType,
-): string {
-  const interfaces = type.getInterfaces();
-  return interfaces.length
-    ? ' implements ' + interfaces.map(i => i.name).join(' & ')
-    : '';
-}
-
-function printObject(type: GraphQLObjectType, options): string {
-  return (
-    printDescription(options, type) +
-    `type ${type.name}` +
-    printImplementedInterfaces(type) +
-    printFields(options, type)
-  );
-}
-
-function printInterface(type: GraphQLInterfaceType, options): string {
-  return (
-    printDescription(options, type) +
-    `interface ${type.name}` +
-    printImplementedInterfaces(type) +
-    printFields(options, type)
-  );
-}
-
-function printUnion(type: GraphQLUnionType, options): string {
-  const types = type.getTypes();
-  const possibleTypes = types.length ? ' = ' + types.join(' | ') : '';
-  return printDescription(options, type) + 'union ' + type.name + possibleTypes;
-}
-
-function printEnum(type: GraphQLEnumType, options): string {
-  const values = type
-    .getValues()
-    .map(
-      (value, i) =>
-        printDescription(options, value, '  ', !i) +
-        '  ' +
-        value.name +
-        printDeprecated(value),
-    );
-
-  return (
-    printDescription(options, type) + `enum ${type.name}` + printBlock(values)
-  );
-}
-
-function printInputObject(type: GraphQLInputObjectType, options): string {
-  const fields = objectValues(type.getFields()).map(
-    (f, i) =>
-      printDescription(options, f, '  ', !i) + '  ' + printInputValue(f),
-  );
-  return (
-    printDescription(options, type) + `input ${type.name}` + printBlock(fields)
-  );
-}
-
-function printFields(options, type) {
-  const fields = objectValues(type.getFields()).map(
-    (f, i) =>
-      printDescription(options, f, '  ', !i) +
-      '  ' +
-      f.name +
-      printArgs(options, f.args, '  ') +
-      ': ' +
-      String(f.type) +
-      printDeprecated(f),
-  );
-  return printBlock(fields);
-}
-
-function printBlock(items) {
-  return items.length !== 0 ? ' {\n' + items.join('\n') + '\n}' : '';
-}
-
-function printArgs(options, args, indentation = '') {
-  if (args.length === 0) {
-    return '';
-  }
-
-  // If every arg does not have a description, print them on one line.
-  if (args.every(arg => !arg.description)) {
-    return '(' + args.map(printInputValue).join(', ') + ')';
-  }
-
-  return (
-    '(\n' +
-    args
-      .map(
-        (arg, i) =>
-          printDescription(options, arg, '  ' + indentation, !i) +
-          '  ' +
-          indentation +
-          printInputValue(arg),
-      )
-      .join('\n') +
-    '\n' +
-    indentation +
-    ')'
-  );
-}
-
-function printInputValue(arg) {
-  const defaultAST = astFromValue(arg.defaultValue, arg.type);
-  let argDecl = arg.name + ': ' + String(arg.type);
-  if (defaultAST) {
-    argDecl += ` = ${print(defaultAST)}`;
-  }
-  return argDecl;
-}
-
-function printDirective(directive, options) {
-  return (
-    printDescription(options, directive) +
-    'directive @' +
-    directive.name +
-    printArgs(options, directive.args) +
-    (directive.isRepeatable ? ' repeatable' : '') +
-    ' on ' +
-    directive.locations.join(' | ')
-  );
-}
-
-function printDeprecated(fieldOrEnumVal) {
-  if (!fieldOrEnumVal.isDeprecated) {
-    return '';
-  }
-  const reason = fieldOrEnumVal.deprecationReason;
-  const reasonAST = astFromValue(reason, GraphQLString);
-  if (reasonAST && reason !== DEFAULT_DEPRECATION_REASON) {
-    return ' @deprecated(reason: ' + print(reasonAST) + ')';
-  }
-  return ' @deprecated';
-}
-
-function printDescription(
-  options,
-  def,
-  indentation = '',
-  firstInBlock = true,
-): string {
-  const { description } = def;
-  if (description == null) {
-    return '';
-  }
-
-  if (options?.commentDescriptions === true) {
-    return printDescriptionWithComments(description, indentation, firstInBlock);
-  }
-
-  const preferMultipleLines = description.length > 70;
-  const blockString = printBlockString(description, '', preferMultipleLines);
-  const prefix =
-    indentation && !firstInBlock ? '\n' + indentation : indentation;
-
-  return prefix + blockString.replace(/\n/g, '\n' + indentation) + '\n';
-}
-
-function printDescriptionWithComments(description, indentation, firstInBlock) {
-  const prefix = indentation && !firstInBlock ? '\n' : '';
-  const comment = description
-    .split('\n')
-    .map(line => indentation + (line !== '' ? '# ' + line : '#'))
-    .join('\n');
-
-  return prefix + comment + '\n';
-}
diff --git a/node_modules/graphql/utilities/printSchema.mjs b/node_modules/graphql/utilities/printSchema.mjs
deleted file mode 100644
index 2a40720..0000000
--- a/node_modules/graphql/utilities/printSchema.mjs
+++ /dev/null
@@ -1,259 +0,0 @@
-import objectValues from "../polyfills/objectValues.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import invariant from "../jsutils/invariant.mjs";
-import { print } from "../language/printer.mjs";
-import { printBlockString } from "../language/blockString.mjs";
-import { isIntrospectionType } from "../type/introspection.mjs";
-import { GraphQLString, isSpecifiedScalarType } from "../type/scalars.mjs";
-import { GraphQLDirective, DEFAULT_DEPRECATION_REASON, isSpecifiedDirective } from "../type/directives.mjs";
-import { isScalarType, isObjectType, isInterfaceType, isUnionType, isEnumType, isInputObjectType } from "../type/definition.mjs";
-import { astFromValue } from "./astFromValue.mjs";
-
-/**
- * Accepts options as a second argument:
- *
- *    - commentDescriptions:
- *        Provide true to use preceding comments as the description.
- *
- */
-export function printSchema(schema, options) {
-  return printFilteredSchema(schema, function (n) {
-    return !isSpecifiedDirective(n);
-  }, isDefinedType, options);
-}
-export function printIntrospectionSchema(schema, options) {
-  return printFilteredSchema(schema, isSpecifiedDirective, isIntrospectionType, options);
-}
-
-function isDefinedType(type) {
-  return !isSpecifiedScalarType(type) && !isIntrospectionType(type);
-}
-
-function printFilteredSchema(schema, directiveFilter, typeFilter, options) {
-  var directives = schema.getDirectives().filter(directiveFilter);
-  var types = objectValues(schema.getTypeMap()).filter(typeFilter);
-  return [printSchemaDefinition(schema)].concat(directives.map(function (directive) {
-    return printDirective(directive, options);
-  }), types.map(function (type) {
-    return printType(type, options);
-  })).filter(Boolean).join('\n\n') + '\n';
-}
-
-function printSchemaDefinition(schema) {
-  if (schema.description == null && isSchemaOfCommonNames(schema)) {
-    return;
-  }
-
-  var operationTypes = [];
-  var queryType = schema.getQueryType();
-
-  if (queryType) {
-    operationTypes.push("  query: ".concat(queryType.name));
-  }
-
-  var mutationType = schema.getMutationType();
-
-  if (mutationType) {
-    operationTypes.push("  mutation: ".concat(mutationType.name));
-  }
-
-  var subscriptionType = schema.getSubscriptionType();
-
-  if (subscriptionType) {
-    operationTypes.push("  subscription: ".concat(subscriptionType.name));
-  }
-
-  return printDescription({}, schema) + "schema {\n".concat(operationTypes.join('\n'), "\n}");
-}
-/**
- * GraphQL schema define root types for each type of operation. These types are
- * the same as any other type and can be named in any manner, however there is
- * a common naming convention:
- *
- *   schema {
- *     query: Query
- *     mutation: Mutation
- *   }
- *
- * When using this naming convention, the schema description can be omitted.
- */
-
-
-function isSchemaOfCommonNames(schema) {
-  var queryType = schema.getQueryType();
-
-  if (queryType && queryType.name !== 'Query') {
-    return false;
-  }
-
-  var mutationType = schema.getMutationType();
-
-  if (mutationType && mutationType.name !== 'Mutation') {
-    return false;
-  }
-
-  var subscriptionType = schema.getSubscriptionType();
-
-  if (subscriptionType && subscriptionType.name !== 'Subscription') {
-    return false;
-  }
-
-  return true;
-}
-
-export function printType(type, options) {
-  if (isScalarType(type)) {
-    return printScalar(type, options);
-  }
-
-  if (isObjectType(type)) {
-    return printObject(type, options);
-  }
-
-  if (isInterfaceType(type)) {
-    return printInterface(type, options);
-  }
-
-  if (isUnionType(type)) {
-    return printUnion(type, options);
-  }
-
-  if (isEnumType(type)) {
-    return printEnum(type, options);
-  }
-
-  /* istanbul ignore else */
-  if (isInputObjectType(type)) {
-    return printInputObject(type, options);
-  } // Not reachable. All possible types have been considered.
-
-
-  /* istanbul ignore next */
-  invariant(false, 'Unexpected type: ' + inspect(type));
-}
-
-function printScalar(type, options) {
-  return printDescription(options, type) + "scalar ".concat(type.name);
-}
-
-function printImplementedInterfaces(type) {
-  var interfaces = type.getInterfaces();
-  return interfaces.length ? ' implements ' + interfaces.map(function (i) {
-    return i.name;
-  }).join(' & ') : '';
-}
-
-function printObject(type, options) {
-  return printDescription(options, type) + "type ".concat(type.name) + printImplementedInterfaces(type) + printFields(options, type);
-}
-
-function printInterface(type, options) {
-  return printDescription(options, type) + "interface ".concat(type.name) + printImplementedInterfaces(type) + printFields(options, type);
-}
-
-function printUnion(type, options) {
-  var types = type.getTypes();
-  var possibleTypes = types.length ? ' = ' + types.join(' | ') : '';
-  return printDescription(options, type) + 'union ' + type.name + possibleTypes;
-}
-
-function printEnum(type, options) {
-  var values = type.getValues().map(function (value, i) {
-    return printDescription(options, value, '  ', !i) + '  ' + value.name + printDeprecated(value);
-  });
-  return printDescription(options, type) + "enum ".concat(type.name) + printBlock(values);
-}
-
-function printInputObject(type, options) {
-  var fields = objectValues(type.getFields()).map(function (f, i) {
-    return printDescription(options, f, '  ', !i) + '  ' + printInputValue(f);
-  });
-  return printDescription(options, type) + "input ".concat(type.name) + printBlock(fields);
-}
-
-function printFields(options, type) {
-  var fields = objectValues(type.getFields()).map(function (f, i) {
-    return printDescription(options, f, '  ', !i) + '  ' + f.name + printArgs(options, f.args, '  ') + ': ' + String(f.type) + printDeprecated(f);
-  });
-  return printBlock(fields);
-}
-
-function printBlock(items) {
-  return items.length !== 0 ? ' {\n' + items.join('\n') + '\n}' : '';
-}
-
-function printArgs(options, args) {
-  var indentation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
-
-  if (args.length === 0) {
-    return '';
-  } // If every arg does not have a description, print them on one line.
-
-
-  if (args.every(function (arg) {
-    return !arg.description;
-  })) {
-    return '(' + args.map(printInputValue).join(', ') + ')';
-  }
-
-  return '(\n' + args.map(function (arg, i) {
-    return printDescription(options, arg, '  ' + indentation, !i) + '  ' + indentation + printInputValue(arg);
-  }).join('\n') + '\n' + indentation + ')';
-}
-
-function printInputValue(arg) {
-  var defaultAST = astFromValue(arg.defaultValue, arg.type);
-  var argDecl = arg.name + ': ' + String(arg.type);
-
-  if (defaultAST) {
-    argDecl += " = ".concat(print(defaultAST));
-  }
-
-  return argDecl;
-}
-
-function printDirective(directive, options) {
-  return printDescription(options, directive) + 'directive @' + directive.name + printArgs(options, directive.args) + (directive.isRepeatable ? ' repeatable' : '') + ' on ' + directive.locations.join(' | ');
-}
-
-function printDeprecated(fieldOrEnumVal) {
-  if (!fieldOrEnumVal.isDeprecated) {
-    return '';
-  }
-
-  var reason = fieldOrEnumVal.deprecationReason;
-  var reasonAST = astFromValue(reason, GraphQLString);
-
-  if (reasonAST && reason !== DEFAULT_DEPRECATION_REASON) {
-    return ' @deprecated(reason: ' + print(reasonAST) + ')';
-  }
-
-  return ' @deprecated';
-}
-
-function printDescription(options, def) {
-  var indentation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
-  var firstInBlock = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
-  var description = def.description;
-
-  if (description == null) {
-    return '';
-  }
-
-  if ((options === null || options === void 0 ? void 0 : options.commentDescriptions) === true) {
-    return printDescriptionWithComments(description, indentation, firstInBlock);
-  }
-
-  var preferMultipleLines = description.length > 70;
-  var blockString = printBlockString(description, '', preferMultipleLines);
-  var prefix = indentation && !firstInBlock ? '\n' + indentation : indentation;
-  return prefix + blockString.replace(/\n/g, '\n' + indentation) + '\n';
-}
-
-function printDescriptionWithComments(description, indentation, firstInBlock) {
-  var prefix = indentation && !firstInBlock ? '\n' : '';
-  var comment = description.split('\n').map(function (line) {
-    return indentation + (line !== '' ? '# ' + line : '#');
-  }).join('\n');
-  return prefix + comment + '\n';
-}
diff --git a/node_modules/graphql/utilities/separateOperations.d.ts b/node_modules/graphql/utilities/separateOperations.d.ts
deleted file mode 100644
index 28654fd..0000000
--- a/node_modules/graphql/utilities/separateOperations.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { DocumentNode } from '../language/ast';
-
-/**
- * separateOperations accepts a single AST document which may contain many
- * operations and fragments and returns a collection of AST documents each of
- * which contains a single operation as well the fragment definitions it
- * refers to.
- */
-export function separateOperations(
-  documentAST: DocumentNode,
-): { [key: string]: DocumentNode };
diff --git a/node_modules/graphql/utilities/separateOperations.js b/node_modules/graphql/utilities/separateOperations.js
deleted file mode 100644
index 6f92ed5..0000000
--- a/node_modules/graphql/utilities/separateOperations.js
+++ /dev/null
@@ -1,88 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.separateOperations = separateOperations;
-
-var _kinds = require("../language/kinds");
-
-var _visitor = require("../language/visitor");
-
-/**
- * separateOperations accepts a single AST document which may contain many
- * operations and fragments and returns a collection of AST documents each of
- * which contains a single operation as well the fragment definitions it
- * refers to.
- */
-function separateOperations(documentAST) {
-  var operations = [];
-  var depGraph = Object.create(null);
-  var fromName; // Populate metadata and build a dependency graph.
-
-  (0, _visitor.visit)(documentAST, {
-    OperationDefinition: function OperationDefinition(node) {
-      fromName = opName(node);
-      operations.push(node);
-    },
-    FragmentDefinition: function FragmentDefinition(node) {
-      fromName = node.name.value;
-    },
-    FragmentSpread: function FragmentSpread(node) {
-      var toName = node.name.value;
-      var dependents = depGraph[fromName];
-
-      if (dependents === undefined) {
-        dependents = depGraph[fromName] = Object.create(null);
-      }
-
-      dependents[toName] = true;
-    }
-  }); // For each operation, produce a new synthesized AST which includes only what
-  // is necessary for completing that operation.
-
-  var separatedDocumentASTs = Object.create(null);
-
-  var _loop = function _loop(_i2) {
-    var operation = operations[_i2];
-    var operationName = opName(operation);
-    var dependencies = Object.create(null);
-    collectTransitiveDependencies(dependencies, depGraph, operationName); // The list of definition nodes to be included for this operation, sorted
-    // to retain the same order as the original document.
-
-    separatedDocumentASTs[operationName] = {
-      kind: _kinds.Kind.DOCUMENT,
-      definitions: documentAST.definitions.filter(function (node) {
-        return node === operation || node.kind === _kinds.Kind.FRAGMENT_DEFINITION && dependencies[node.name.value];
-      })
-    };
-  };
-
-  for (var _i2 = 0; _i2 < operations.length; _i2++) {
-    _loop(_i2);
-  }
-
-  return separatedDocumentASTs;
-}
-
-// Provides the empty string for anonymous operations.
-function opName(operation) {
-  return operation.name ? operation.name.value : '';
-} // From a dependency graph, collects a list of transitive dependencies by
-// recursing through a dependency graph.
-
-
-function collectTransitiveDependencies(collected, depGraph, fromName) {
-  var immediateDeps = depGraph[fromName];
-
-  if (immediateDeps) {
-    for (var _i4 = 0, _Object$keys2 = Object.keys(immediateDeps); _i4 < _Object$keys2.length; _i4++) {
-      var toName = _Object$keys2[_i4];
-
-      if (!collected[toName]) {
-        collected[toName] = true;
-        collectTransitiveDependencies(collected, depGraph, toName);
-      }
-    }
-  }
-}
diff --git a/node_modules/graphql/utilities/separateOperations.js.flow b/node_modules/graphql/utilities/separateOperations.js.flow
deleted file mode 100644
index 57319ee..0000000
--- a/node_modules/graphql/utilities/separateOperations.js.flow
+++ /dev/null
@@ -1,91 +0,0 @@
-// @flow strict
-
-import { type ObjMap } from '../jsutils/ObjMap';
-
-import { Kind } from '../language/kinds';
-import { visit } from '../language/visitor';
-import {
-  type DocumentNode,
-  type OperationDefinitionNode,
-} from '../language/ast';
-
-/**
- * separateOperations accepts a single AST document which may contain many
- * operations and fragments and returns a collection of AST documents each of
- * which contains a single operation as well the fragment definitions it
- * refers to.
- */
-export function separateOperations(
-  documentAST: DocumentNode,
-): ObjMap<DocumentNode> {
-  const operations = [];
-  const depGraph: DepGraph = Object.create(null);
-  let fromName;
-
-  // Populate metadata and build a dependency graph.
-  visit(documentAST, {
-    OperationDefinition(node) {
-      fromName = opName(node);
-      operations.push(node);
-    },
-    FragmentDefinition(node) {
-      fromName = node.name.value;
-    },
-    FragmentSpread(node) {
-      const toName = node.name.value;
-      let dependents = depGraph[fromName];
-      if (dependents === undefined) {
-        dependents = depGraph[fromName] = Object.create(null);
-      }
-      dependents[toName] = true;
-    },
-  });
-
-  // For each operation, produce a new synthesized AST which includes only what
-  // is necessary for completing that operation.
-  const separatedDocumentASTs = Object.create(null);
-  for (const operation of operations) {
-    const operationName = opName(operation);
-    const dependencies = Object.create(null);
-    collectTransitiveDependencies(dependencies, depGraph, operationName);
-
-    // The list of definition nodes to be included for this operation, sorted
-    // to retain the same order as the original document.
-    separatedDocumentASTs[operationName] = {
-      kind: Kind.DOCUMENT,
-      definitions: documentAST.definitions.filter(
-        node =>
-          node === operation ||
-          (node.kind === Kind.FRAGMENT_DEFINITION &&
-            dependencies[node.name.value]),
-      ),
-    };
-  }
-
-  return separatedDocumentASTs;
-}
-
-type DepGraph = ObjMap<ObjMap<boolean>>;
-
-// Provides the empty string for anonymous operations.
-function opName(operation: OperationDefinitionNode): string {
-  return operation.name ? operation.name.value : '';
-}
-
-// From a dependency graph, collects a list of transitive dependencies by
-// recursing through a dependency graph.
-function collectTransitiveDependencies(
-  collected: ObjMap<boolean>,
-  depGraph: DepGraph,
-  fromName: string,
-): void {
-  const immediateDeps = depGraph[fromName];
-  if (immediateDeps) {
-    for (const toName of Object.keys(immediateDeps)) {
-      if (!collected[toName]) {
-        collected[toName] = true;
-        collectTransitiveDependencies(collected, depGraph, toName);
-      }
-    }
-  }
-}
diff --git a/node_modules/graphql/utilities/separateOperations.mjs b/node_modules/graphql/utilities/separateOperations.mjs
deleted file mode 100644
index da71102..0000000
--- a/node_modules/graphql/utilities/separateOperations.mjs
+++ /dev/null
@@ -1,80 +0,0 @@
-import { Kind } from "../language/kinds.mjs";
-import { visit } from "../language/visitor.mjs";
-
-/**
- * separateOperations accepts a single AST document which may contain many
- * operations and fragments and returns a collection of AST documents each of
- * which contains a single operation as well the fragment definitions it
- * refers to.
- */
-export function separateOperations(documentAST) {
-  var operations = [];
-  var depGraph = Object.create(null);
-  var fromName; // Populate metadata and build a dependency graph.
-
-  visit(documentAST, {
-    OperationDefinition: function OperationDefinition(node) {
-      fromName = opName(node);
-      operations.push(node);
-    },
-    FragmentDefinition: function FragmentDefinition(node) {
-      fromName = node.name.value;
-    },
-    FragmentSpread: function FragmentSpread(node) {
-      var toName = node.name.value;
-      var dependents = depGraph[fromName];
-
-      if (dependents === undefined) {
-        dependents = depGraph[fromName] = Object.create(null);
-      }
-
-      dependents[toName] = true;
-    }
-  }); // For each operation, produce a new synthesized AST which includes only what
-  // is necessary for completing that operation.
-
-  var separatedDocumentASTs = Object.create(null);
-
-  var _loop = function _loop(_i2) {
-    var operation = operations[_i2];
-    var operationName = opName(operation);
-    var dependencies = Object.create(null);
-    collectTransitiveDependencies(dependencies, depGraph, operationName); // The list of definition nodes to be included for this operation, sorted
-    // to retain the same order as the original document.
-
-    separatedDocumentASTs[operationName] = {
-      kind: Kind.DOCUMENT,
-      definitions: documentAST.definitions.filter(function (node) {
-        return node === operation || node.kind === Kind.FRAGMENT_DEFINITION && dependencies[node.name.value];
-      })
-    };
-  };
-
-  for (var _i2 = 0; _i2 < operations.length; _i2++) {
-    _loop(_i2);
-  }
-
-  return separatedDocumentASTs;
-}
-
-// Provides the empty string for anonymous operations.
-function opName(operation) {
-  return operation.name ? operation.name.value : '';
-} // From a dependency graph, collects a list of transitive dependencies by
-// recursing through a dependency graph.
-
-
-function collectTransitiveDependencies(collected, depGraph, fromName) {
-  var immediateDeps = depGraph[fromName];
-
-  if (immediateDeps) {
-    for (var _i4 = 0, _Object$keys2 = Object.keys(immediateDeps); _i4 < _Object$keys2.length; _i4++) {
-      var toName = _Object$keys2[_i4];
-
-      if (!collected[toName]) {
-        collected[toName] = true;
-        collectTransitiveDependencies(collected, depGraph, toName);
-      }
-    }
-  }
-}
diff --git a/node_modules/graphql/utilities/stripIgnoredCharacters.d.ts b/node_modules/graphql/utilities/stripIgnoredCharacters.d.ts
deleted file mode 100644
index a131af0..0000000
--- a/node_modules/graphql/utilities/stripIgnoredCharacters.d.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { Source } from '../language/source';
-
-/**
- * Strips characters that are not significant to the validity or execution
- * of a GraphQL document:
- *   - UnicodeBOM
- *   - WhiteSpace
- *   - LineTerminator
- *   - Comment
- *   - Comma
- *   - BlockString indentation
- *
- * Note: It is required to have a delimiter character between neighboring
- * non-punctuator tokens and this function always uses single space as delimiter.
- *
- * It is guaranteed that both input and output documents if parsed would result
- * in the exact same AST except for nodes location.
- *
- * Warning: It is guaranteed that this function will always produce stable results.
- * However, it's not guaranteed that it will stay the same between different
- * releases due to bugfixes or changes in the GraphQL specification.
- *
- * Query example:
- *
- * query SomeQuery($foo: String!, $bar: String) {
- *   someField(foo: $foo, bar: $bar) {
- *     a
- *     b {
- *       c
- *       d
- *     }
- *   }
- * }
- *
- * Becomes:
- *
- * query SomeQuery($foo:String!$bar:String){someField(foo:$foo bar:$bar){a b{c d}}}
- *
- * SDL example:
- *
- * """
- * Type description
- * """
- * type Foo {
- *   """
- *   Field description
- *   """
- *   bar: String
- * }
- *
- * Becomes:
- *
- * """Type description""" type Foo{"""Field description""" bar:String}
- */
-export function stripIgnoredCharacters(source: string | Source): string;
diff --git a/node_modules/graphql/utilities/stripIgnoredCharacters.js b/node_modules/graphql/utilities/stripIgnoredCharacters.js
deleted file mode 100644
index dca0c32..0000000
--- a/node_modules/graphql/utilities/stripIgnoredCharacters.js
+++ /dev/null
@@ -1,133 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.stripIgnoredCharacters = stripIgnoredCharacters;
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _source = require("../language/source");
-
-var _tokenKind = require("../language/tokenKind");
-
-var _lexer = require("../language/lexer");
-
-var _blockString = require("../language/blockString");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Strips characters that are not significant to the validity or execution
- * of a GraphQL document:
- *   - UnicodeBOM
- *   - WhiteSpace
- *   - LineTerminator
- *   - Comment
- *   - Comma
- *   - BlockString indentation
- *
- * Note: It is required to have a delimiter character between neighboring
- * non-punctuator tokens and this function always uses single space as delimiter.
- *
- * It is guaranteed that both input and output documents if parsed would result
- * in the exact same AST except for nodes location.
- *
- * Warning: It is guaranteed that this function will always produce stable results.
- * However, it's not guaranteed that it will stay the same between different
- * releases due to bugfixes or changes in the GraphQL specification.
- *
- * Query example:
- *
- * query SomeQuery($foo: String!, $bar: String) {
- *   someField(foo: $foo, bar: $bar) {
- *     a
- *     b {
- *       c
- *       d
- *     }
- *   }
- * }
- *
- * Becomes:
- *
- * query SomeQuery($foo:String!$bar:String){someField(foo:$foo bar:$bar){a b{c d}}}
- *
- * SDL example:
- *
- * """
- * Type description
- * """
- * type Foo {
- *   """
- *   Field description
- *   """
- *   bar: String
- * }
- *
- * Becomes:
- *
- * """Type description""" type Foo{"""Field description""" bar:String}
- */
-function stripIgnoredCharacters(source) {
-  var sourceObj = typeof source === 'string' ? new _source.Source(source) : source;
-
-  if (!(sourceObj instanceof _source.Source)) {
-    throw new TypeError("Must provide string or Source. Received: ".concat((0, _inspect.default)(sourceObj), "."));
-  }
-
-  var body = sourceObj.body;
-  var lexer = new _lexer.Lexer(sourceObj);
-  var strippedBody = '';
-  var wasLastAddedTokenNonPunctuator = false;
-
-  while (lexer.advance().kind !== _tokenKind.TokenKind.EOF) {
-    var currentToken = lexer.token;
-    var tokenKind = currentToken.kind;
-    /**
-     * Every two non-punctuator tokens should have space between them.
-     * Also prevent case of non-punctuator token following by spread resulting
-     * in invalid token (e.g. `1...` is invalid Float token).
-     */
-
-    var isNonPunctuator = !(0, _lexer.isPunctuatorTokenKind)(currentToken.kind);
-
-    if (wasLastAddedTokenNonPunctuator) {
-      if (isNonPunctuator || currentToken.kind === _tokenKind.TokenKind.SPREAD) {
-        strippedBody += ' ';
-      }
-    }
-
-    var tokenBody = body.slice(currentToken.start, currentToken.end);
-
-    if (tokenKind === _tokenKind.TokenKind.BLOCK_STRING) {
-      strippedBody += dedentBlockString(tokenBody);
-    } else {
-      strippedBody += tokenBody;
-    }
-
-    wasLastAddedTokenNonPunctuator = isNonPunctuator;
-  }
-
-  return strippedBody;
-}
-
-function dedentBlockString(blockStr) {
-  // skip leading and trailing triple quotations
-  var rawStr = blockStr.slice(3, -3);
-  var body = (0, _blockString.dedentBlockStringValue)(rawStr);
-  var lines = body.split(/\r\n|[\n\r]/g);
-
-  if ((0, _blockString.getBlockStringIndentation)(lines) > 0) {
-    body = '\n' + body;
-  }
-
-  var lastChar = body[body.length - 1];
-  var hasTrailingQuote = lastChar === '"' && body.slice(-4) !== '\\"""';
-
-  if (hasTrailingQuote || lastChar === '\\') {
-    body += '\n';
-  }
-
-  return '"""' + body + '"""';
-}
diff --git a/node_modules/graphql/utilities/stripIgnoredCharacters.js.flow b/node_modules/graphql/utilities/stripIgnoredCharacters.js.flow
deleted file mode 100644
index 2b2036b..0000000
--- a/node_modules/graphql/utilities/stripIgnoredCharacters.js.flow
+++ /dev/null
@@ -1,124 +0,0 @@
-// @flow strict
-
-import inspect from '../jsutils/inspect';
-
-import { Source } from '../language/source';
-import { TokenKind } from '../language/tokenKind';
-import { Lexer, isPunctuatorTokenKind } from '../language/lexer';
-import {
-  dedentBlockStringValue,
-  getBlockStringIndentation,
-} from '../language/blockString';
-
-/**
- * Strips characters that are not significant to the validity or execution
- * of a GraphQL document:
- *   - UnicodeBOM
- *   - WhiteSpace
- *   - LineTerminator
- *   - Comment
- *   - Comma
- *   - BlockString indentation
- *
- * Note: It is required to have a delimiter character between neighboring
- * non-punctuator tokens and this function always uses single space as delimiter.
- *
- * It is guaranteed that both input and output documents if parsed would result
- * in the exact same AST except for nodes location.
- *
- * Warning: It is guaranteed that this function will always produce stable results.
- * However, it's not guaranteed that it will stay the same between different
- * releases due to bugfixes or changes in the GraphQL specification.
- *
- * Query example:
- *
- * query SomeQuery($foo: String!, $bar: String) {
- *   someField(foo: $foo, bar: $bar) {
- *     a
- *     b {
- *       c
- *       d
- *     }
- *   }
- * }
- *
- * Becomes:
- *
- * query SomeQuery($foo:String!$bar:String){someField(foo:$foo bar:$bar){a b{c d}}}
- *
- * SDL example:
- *
- * """
- * Type description
- * """
- * type Foo {
- *   """
- *   Field description
- *   """
- *   bar: String
- * }
- *
- * Becomes:
- *
- * """Type description""" type Foo{"""Field description""" bar:String}
- */
-export function stripIgnoredCharacters(source: string | Source): string {
-  const sourceObj = typeof source === 'string' ? new Source(source) : source;
-  if (!(sourceObj instanceof Source)) {
-    throw new TypeError(
-      `Must provide string or Source. Received: ${inspect(sourceObj)}.`,
-    );
-  }
-
-  const body = sourceObj.body;
-  const lexer = new Lexer(sourceObj);
-  let strippedBody = '';
-
-  let wasLastAddedTokenNonPunctuator = false;
-  while (lexer.advance().kind !== TokenKind.EOF) {
-    const currentToken = lexer.token;
-    const tokenKind = currentToken.kind;
-
-    /**
-     * Every two non-punctuator tokens should have space between them.
-     * Also prevent case of non-punctuator token following by spread resulting
-     * in invalid token (e.g. `1...` is invalid Float token).
-     */
-    const isNonPunctuator = !isPunctuatorTokenKind(currentToken.kind);
-    if (wasLastAddedTokenNonPunctuator) {
-      if (isNonPunctuator || currentToken.kind === TokenKind.SPREAD) {
-        strippedBody += ' ';
-      }
-    }
-
-    const tokenBody = body.slice(currentToken.start, currentToken.end);
-    if (tokenKind === TokenKind.BLOCK_STRING) {
-      strippedBody += dedentBlockString(tokenBody);
-    } else {
-      strippedBody += tokenBody;
-    }
-
-    wasLastAddedTokenNonPunctuator = isNonPunctuator;
-  }
-
-  return strippedBody;
-}
-
-function dedentBlockString(blockStr) {
-  // skip leading and trailing triple quotations
-  const rawStr = blockStr.slice(3, -3);
-  let body = dedentBlockStringValue(rawStr);
-
-  const lines = body.split(/\r\n|[\n\r]/g);
-  if (getBlockStringIndentation(lines) > 0) {
-    body = '\n' + body;
-  }
-
-  const lastChar = body[body.length - 1];
-  const hasTrailingQuote = lastChar === '"' && body.slice(-4) !== '\\"""';
-  if (hasTrailingQuote || lastChar === '\\') {
-    body += '\n';
-  }
-
-  return '"""' + body + '"""';
-}
diff --git a/node_modules/graphql/utilities/stripIgnoredCharacters.mjs b/node_modules/graphql/utilities/stripIgnoredCharacters.mjs
deleted file mode 100644
index aac07be..0000000
--- a/node_modules/graphql/utilities/stripIgnoredCharacters.mjs
+++ /dev/null
@@ -1,120 +0,0 @@
-import inspect from "../jsutils/inspect.mjs";
-import { Source } from "../language/source.mjs";
-import { TokenKind } from "../language/tokenKind.mjs";
-import { Lexer, isPunctuatorTokenKind } from "../language/lexer.mjs";
-import { dedentBlockStringValue, getBlockStringIndentation } from "../language/blockString.mjs";
-/**
- * Strips characters that are not significant to the validity or execution
- * of a GraphQL document:
- *   - UnicodeBOM
- *   - WhiteSpace
- *   - LineTerminator
- *   - Comment
- *   - Comma
- *   - BlockString indentation
- *
- * Note: It is required to have a delimiter character between neighboring
- * non-punctuator tokens and this function always uses single space as delimiter.
- *
- * It is guaranteed that both input and output documents if parsed would result
- * in the exact same AST except for nodes location.
- *
- * Warning: It is guaranteed that this function will always produce stable results.
- * However, it's not guaranteed that it will stay the same between different
- * releases due to bugfixes or changes in the GraphQL specification.
- *
- * Query example:
- *
- * query SomeQuery($foo: String!, $bar: String) {
- *   someField(foo: $foo, bar: $bar) {
- *     a
- *     b {
- *       c
- *       d
- *     }
- *   }
- * }
- *
- * Becomes:
- *
- * query SomeQuery($foo:String!$bar:String){someField(foo:$foo bar:$bar){a b{c d}}}
- *
- * SDL example:
- *
- * """
- * Type description
- * """
- * type Foo {
- *   """
- *   Field description
- *   """
- *   bar: String
- * }
- *
- * Becomes:
- *
- * """Type description""" type Foo{"""Field description""" bar:String}
- */
-
-export function stripIgnoredCharacters(source) {
-  var sourceObj = typeof source === 'string' ? new Source(source) : source;
-
-  if (!(sourceObj instanceof Source)) {
-    throw new TypeError("Must provide string or Source. Received: ".concat(inspect(sourceObj), "."));
-  }
-
-  var body = sourceObj.body;
-  var lexer = new Lexer(sourceObj);
-  var strippedBody = '';
-  var wasLastAddedTokenNonPunctuator = false;
-
-  while (lexer.advance().kind !== TokenKind.EOF) {
-    var currentToken = lexer.token;
-    var tokenKind = currentToken.kind;
-    /**
-     * Every two non-punctuator tokens should have space between them.
-     * Also prevent case of non-punctuator token following by spread resulting
-     * in invalid token (e.g. `1...` is invalid Float token).
-     */
-
-    var isNonPunctuator = !isPunctuatorTokenKind(currentToken.kind);
-
-    if (wasLastAddedTokenNonPunctuator) {
-      if (isNonPunctuator || currentToken.kind === TokenKind.SPREAD) {
-        strippedBody += ' ';
-      }
-    }
-
-    var tokenBody = body.slice(currentToken.start, currentToken.end);
-
-    if (tokenKind === TokenKind.BLOCK_STRING) {
-      strippedBody += dedentBlockString(tokenBody);
-    } else {
-      strippedBody += tokenBody;
-    }
-
-    wasLastAddedTokenNonPunctuator = isNonPunctuator;
-  }
-
-  return strippedBody;
-}
-
-function dedentBlockString(blockStr) {
-  // skip leading and trailing triple quotations
-  var rawStr = blockStr.slice(3, -3);
-  var body = dedentBlockStringValue(rawStr);
-  var lines = body.split(/\r\n|[\n\r]/g);
-
-  if (getBlockStringIndentation(lines) > 0) {
-    body = '\n' + body;
-  }
-
-  var lastChar = body[body.length - 1];
-  var hasTrailingQuote = lastChar === '"' && body.slice(-4) !== '\\"""';
-
-  if (hasTrailingQuote || lastChar === '\\') {
-    body += '\n';
-  }
-
-  return '"""' + body + '"""';
-}
diff --git a/node_modules/graphql/utilities/typeComparators.d.ts b/node_modules/graphql/utilities/typeComparators.d.ts
deleted file mode 100644
index 7de3e00..0000000
--- a/node_modules/graphql/utilities/typeComparators.d.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { GraphQLSchema } from '../type/schema';
-import { GraphQLType, GraphQLCompositeType } from '../type/definition';
-
-/**
- * Provided two types, return true if the types are equal (invariant).
- */
-export function isEqualType(typeA: GraphQLType, typeB: GraphQLType): boolean;
-
-/**
- * Provided a type and a super type, return true if the first type is either
- * equal or a subset of the second super type (covariant).
- */
-export function isTypeSubTypeOf(
-  schema: GraphQLSchema,
-  maybeSubType: GraphQLType,
-  superType: GraphQLType,
-): boolean;
-
-/**
- * Provided two composite types, determine if they "overlap". Two composite
- * types overlap when the Sets of possible concrete types for each intersect.
- *
- * This is often used to determine if a fragment of a given type could possibly
- * be visited in a context of another type.
- *
- * This function is commutative.
- */
-export function doTypesOverlap(
-  schema: GraphQLSchema,
-  typeA: GraphQLCompositeType,
-  typeB: GraphQLCompositeType,
-): boolean;
diff --git a/node_modules/graphql/utilities/typeComparators.js b/node_modules/graphql/utilities/typeComparators.js
deleted file mode 100644
index fc836f8..0000000
--- a/node_modules/graphql/utilities/typeComparators.js
+++ /dev/null
@@ -1,115 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.isEqualType = isEqualType;
-exports.isTypeSubTypeOf = isTypeSubTypeOf;
-exports.doTypesOverlap = doTypesOverlap;
-
-var _definition = require("../type/definition");
-
-/**
- * Provided two types, return true if the types are equal (invariant).
- */
-function isEqualType(typeA, typeB) {
-  // Equivalent types are equal.
-  if (typeA === typeB) {
-    return true;
-  } // If either type is non-null, the other must also be non-null.
-
-
-  if ((0, _definition.isNonNullType)(typeA) && (0, _definition.isNonNullType)(typeB)) {
-    return isEqualType(typeA.ofType, typeB.ofType);
-  } // If either type is a list, the other must also be a list.
-
-
-  if ((0, _definition.isListType)(typeA) && (0, _definition.isListType)(typeB)) {
-    return isEqualType(typeA.ofType, typeB.ofType);
-  } // Otherwise the types are not equal.
-
-
-  return false;
-}
-/**
- * Provided a type and a super type, return true if the first type is either
- * equal or a subset of the second super type (covariant).
- */
-
-
-function isTypeSubTypeOf(schema, maybeSubType, superType) {
-  // Equivalent type is a valid subtype
-  if (maybeSubType === superType) {
-    return true;
-  } // If superType is non-null, maybeSubType must also be non-null.
-
-
-  if ((0, _definition.isNonNullType)(superType)) {
-    if ((0, _definition.isNonNullType)(maybeSubType)) {
-      return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType);
-    }
-
-    return false;
-  }
-
-  if ((0, _definition.isNonNullType)(maybeSubType)) {
-    // If superType is nullable, maybeSubType may be non-null or nullable.
-    return isTypeSubTypeOf(schema, maybeSubType.ofType, superType);
-  } // If superType type is a list, maybeSubType type must also be a list.
-
-
-  if ((0, _definition.isListType)(superType)) {
-    if ((0, _definition.isListType)(maybeSubType)) {
-      return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType);
-    }
-
-    return false;
-  }
-
-  if ((0, _definition.isListType)(maybeSubType)) {
-    // If superType is not a list, maybeSubType must also be not a list.
-    return false;
-  } // If superType type is an abstract type, check if it is super type of maybeSubType.
-  // Otherwise, the child type is not a valid subtype of the parent type.
-
-
-  return (0, _definition.isAbstractType)(superType) && ((0, _definition.isInterfaceType)(maybeSubType) || (0, _definition.isObjectType)(maybeSubType)) && schema.isSubType(superType, maybeSubType);
-}
-/**
- * Provided two composite types, determine if they "overlap". Two composite
- * types overlap when the Sets of possible concrete types for each intersect.
- *
- * This is often used to determine if a fragment of a given type could possibly
- * be visited in a context of another type.
- *
- * This function is commutative.
- */
-
-
-function doTypesOverlap(schema, typeA, typeB) {
-  // Equivalent types overlap
-  if (typeA === typeB) {
-    return true;
-  }
-
-  if ((0, _definition.isAbstractType)(typeA)) {
-    if ((0, _definition.isAbstractType)(typeB)) {
-      // If both types are abstract, then determine if there is any intersection
-      // between possible concrete types of each.
-      return schema.getPossibleTypes(typeA).some(function (type) {
-        return schema.isSubType(typeB, type);
-      });
-    } // Determine if the latter type is a possible concrete type of the former.
-
-
-    return schema.isSubType(typeA, typeB);
-  }
-
-  if ((0, _definition.isAbstractType)(typeB)) {
-    // Determine if the former type is a possible concrete type of the latter.
-    return schema.isSubType(typeB, typeA);
-  } // Otherwise the types do not overlap.
-
-
-  return false;
-}
diff --git a/node_modules/graphql/utilities/typeComparators.js.flow b/node_modules/graphql/utilities/typeComparators.js.flow
deleted file mode 100644
index 18e4447..0000000
--- a/node_modules/graphql/utilities/typeComparators.js.flow
+++ /dev/null
@@ -1,122 +0,0 @@
-// @flow strict
-
-import { type GraphQLSchema } from '../type/schema';
-import {
-  type GraphQLType,
-  type GraphQLCompositeType,
-  isInterfaceType,
-  isObjectType,
-  isListType,
-  isNonNullType,
-  isAbstractType,
-} from '../type/definition';
-
-/**
- * Provided two types, return true if the types are equal (invariant).
- */
-export function isEqualType(typeA: GraphQLType, typeB: GraphQLType): boolean {
-  // Equivalent types are equal.
-  if (typeA === typeB) {
-    return true;
-  }
-
-  // If either type is non-null, the other must also be non-null.
-  if (isNonNullType(typeA) && isNonNullType(typeB)) {
-    return isEqualType(typeA.ofType, typeB.ofType);
-  }
-
-  // If either type is a list, the other must also be a list.
-  if (isListType(typeA) && isListType(typeB)) {
-    return isEqualType(typeA.ofType, typeB.ofType);
-  }
-
-  // Otherwise the types are not equal.
-  return false;
-}
-
-/**
- * Provided a type and a super type, return true if the first type is either
- * equal or a subset of the second super type (covariant).
- */
-export function isTypeSubTypeOf(
-  schema: GraphQLSchema,
-  maybeSubType: GraphQLType,
-  superType: GraphQLType,
-): boolean {
-  // Equivalent type is a valid subtype
-  if (maybeSubType === superType) {
-    return true;
-  }
-
-  // If superType is non-null, maybeSubType must also be non-null.
-  if (isNonNullType(superType)) {
-    if (isNonNullType(maybeSubType)) {
-      return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType);
-    }
-    return false;
-  }
-  if (isNonNullType(maybeSubType)) {
-    // If superType is nullable, maybeSubType may be non-null or nullable.
-    return isTypeSubTypeOf(schema, maybeSubType.ofType, superType);
-  }
-
-  // If superType type is a list, maybeSubType type must also be a list.
-  if (isListType(superType)) {
-    if (isListType(maybeSubType)) {
-      return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType);
-    }
-    return false;
-  }
-  if (isListType(maybeSubType)) {
-    // If superType is not a list, maybeSubType must also be not a list.
-    return false;
-  }
-
-  // If superType type is an abstract type, check if it is super type of maybeSubType.
-  // Otherwise, the child type is not a valid subtype of the parent type.
-  return (
-    isAbstractType(superType) &&
-    (isInterfaceType(maybeSubType) || isObjectType(maybeSubType)) &&
-    schema.isSubType(superType, maybeSubType)
-  );
-}
-
-/**
- * Provided two composite types, determine if they "overlap". Two composite
- * types overlap when the Sets of possible concrete types for each intersect.
- *
- * This is often used to determine if a fragment of a given type could possibly
- * be visited in a context of another type.
- *
- * This function is commutative.
- */
-export function doTypesOverlap(
-  schema: GraphQLSchema,
-  typeA: GraphQLCompositeType,
-  typeB: GraphQLCompositeType,
-): boolean {
-  // Equivalent types overlap
-  if (typeA === typeB) {
-    return true;
-  }
-
-  if (isAbstractType(typeA)) {
-    if (isAbstractType(typeB)) {
-      // If both types are abstract, then determine if there is any intersection
-      // between possible concrete types of each.
-      return schema
-        .getPossibleTypes(typeA)
-        .some(type => schema.isSubType(typeB, type));
-    }
-    // Determine if the latter type is a possible concrete type of the former.
-    return schema.isSubType(typeA, typeB);
-  }
-
-  if (isAbstractType(typeB)) {
-    // Determine if the former type is a possible concrete type of the latter.
-    return schema.isSubType(typeB, typeA);
-  }
-
-  // Otherwise the types do not overlap.
-  return false;
-}
diff --git a/node_modules/graphql/utilities/typeComparators.mjs b/node_modules/graphql/utilities/typeComparators.mjs
deleted file mode 100644
index ad3288a..0000000
--- a/node_modules/graphql/utilities/typeComparators.mjs
+++ /dev/null
@@ -1,104 +0,0 @@
-import { isInterfaceType, isObjectType, isListType, isNonNullType, isAbstractType } from "../type/definition.mjs";
-/**
- * Provided two types, return true if the types are equal (invariant).
- */
-
-export function isEqualType(typeA, typeB) {
-  // Equivalent types are equal.
-  if (typeA === typeB) {
-    return true;
-  } // If either type is non-null, the other must also be non-null.
-
-
-  if (isNonNullType(typeA) && isNonNullType(typeB)) {
-    return isEqualType(typeA.ofType, typeB.ofType);
-  } // If either type is a list, the other must also be a list.
-
-
-  if (isListType(typeA) && isListType(typeB)) {
-    return isEqualType(typeA.ofType, typeB.ofType);
-  } // Otherwise the types are not equal.
-
-
-  return false;
-}
-/**
- * Provided a type and a super type, return true if the first type is either
- * equal or a subset of the second super type (covariant).
- */
-
-export function isTypeSubTypeOf(schema, maybeSubType, superType) {
-  // Equivalent type is a valid subtype
-  if (maybeSubType === superType) {
-    return true;
-  } // If superType is non-null, maybeSubType must also be non-null.
-
-
-  if (isNonNullType(superType)) {
-    if (isNonNullType(maybeSubType)) {
-      return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType);
-    }
-
-    return false;
-  }
-
-  if (isNonNullType(maybeSubType)) {
-    // If superType is nullable, maybeSubType may be non-null or nullable.
-    return isTypeSubTypeOf(schema, maybeSubType.ofType, superType);
-  } // If superType type is a list, maybeSubType type must also be a list.
-
-
-  if (isListType(superType)) {
-    if (isListType(maybeSubType)) {
-      return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType);
-    }
-
-    return false;
-  }
-
-  if (isListType(maybeSubType)) {
-    // If superType is not a list, maybeSubType must also be not a list.
-    return false;
-  } // If superType type is an abstract type, check if it is super type of maybeSubType.
-  // Otherwise, the child type is not a valid subtype of the parent type.
-
-
-  return isAbstractType(superType) && (isInterfaceType(maybeSubType) || isObjectType(maybeSubType)) && schema.isSubType(superType, maybeSubType);
-}
-/**
- * Provided two composite types, determine if they "overlap". Two composite
- * types overlap when the Sets of possible concrete types for each intersect.
- *
- * This is often used to determine if a fragment of a given type could possibly
- * be visited in a context of another type.
- *
- * This function is commutative.
- */
-
-export function doTypesOverlap(schema, typeA, typeB) {
-  // Equivalent types overlap
-  if (typeA === typeB) {
-    return true;
-  }
-
-  if (isAbstractType(typeA)) {
-    if (isAbstractType(typeB)) {
-      // If both types are abstract, then determine if there is any intersection
-      // between possible concrete types of each.
-      return schema.getPossibleTypes(typeA).some(function (type) {
-        return schema.isSubType(typeB, type);
-      });
-    } // Determine if the latter type is a possible concrete type of the former.
-
-
-    return schema.isSubType(typeA, typeB);
-  }
-
-  if (isAbstractType(typeB)) {
-    // Determine if the former type is a possible concrete type of the latter.
-    return schema.isSubType(typeB, typeA);
-  } // Otherwise the types do not overlap.
-
-
-  return false;
-}
diff --git a/node_modules/graphql/utilities/typeFromAST.d.ts b/node_modules/graphql/utilities/typeFromAST.d.ts
deleted file mode 100644
index cf32ac7..0000000
--- a/node_modules/graphql/utilities/typeFromAST.d.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { NamedTypeNode, ListTypeNode, NonNullTypeNode } from '../language/ast';
-import { GraphQLSchema } from '../type/schema';
-import {
-  GraphQLNamedType,
-  GraphQLList,
-  GraphQLNonNull,
-} from '../type/definition';
-
-/**
- * Given a Schema and an AST node describing a type, return a GraphQLType
- * definition which applies to that type. For example, if provided the parsed
- * AST node for `[User]`, a GraphQLList instance will be returned, containing
- * the type called "User" found in the schema. If a type called "User" is not
- * found in the schema, then undefined will be returned.
- */
-export function typeFromAST(
-  schema: GraphQLSchema,
-  typeNode: NamedTypeNode,
-): GraphQLNamedType | undefined;
-
-export function typeFromAST(
-  schema: GraphQLSchema,
-  typeNode: ListTypeNode,
-): GraphQLList<any> | undefined;
-
-export function typeFromAST(
-  schema: GraphQLSchema,
-  typeNode: NonNullTypeNode,
-): GraphQLNonNull<any> | undefined;
diff --git a/node_modules/graphql/utilities/typeFromAST.js b/node_modules/graphql/utilities/typeFromAST.js
deleted file mode 100644
index 623ad39..0000000
--- a/node_modules/graphql/utilities/typeFromAST.js
+++ /dev/null
@@ -1,40 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.typeFromAST = typeFromAST;
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _invariant = _interopRequireDefault(require("../jsutils/invariant"));
-
-var _kinds = require("../language/kinds");
-
-var _definition = require("../type/definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function typeFromAST(schema, typeNode) {
-  /* eslint-enable no-redeclare */
-  var innerType;
-
-  if (typeNode.kind === _kinds.Kind.LIST_TYPE) {
-    innerType = typeFromAST(schema, typeNode.type);
-    return innerType && (0, _definition.GraphQLList)(innerType);
-  }
-
-  if (typeNode.kind === _kinds.Kind.NON_NULL_TYPE) {
-    innerType = typeFromAST(schema, typeNode.type);
-    return innerType && (0, _definition.GraphQLNonNull)(innerType);
-  }
-
-  /* istanbul ignore else */
-  if (typeNode.kind === _kinds.Kind.NAMED_TYPE) {
-    return schema.getType(typeNode.name.value);
-  } // Not reachable. All possible type nodes have been considered.
-
-
-  /* istanbul ignore next */
-  (0, _invariant.default)(false, 'Unexpected type node: ' + (0, _inspect.default)(typeNode));
-}
diff --git a/node_modules/graphql/utilities/typeFromAST.js.flow b/node_modules/graphql/utilities/typeFromAST.js.flow
deleted file mode 100644
index c418511..0000000
--- a/node_modules/graphql/utilities/typeFromAST.js.flow
+++ /dev/null
@@ -1,57 +0,0 @@
-// @flow strict
-
-import inspect from '../jsutils/inspect';
-import invariant from '../jsutils/invariant';
-
-import { Kind } from '../language/kinds';
-import {
-  type NamedTypeNode,
-  type ListTypeNode,
-  type NonNullTypeNode,
-} from '../language/ast';
-
-import { type GraphQLSchema } from '../type/schema';
-import {
-  type GraphQLNamedType,
-  GraphQLList,
-  GraphQLNonNull,
-} from '../type/definition';
-
-/**
- * Given a Schema and an AST node describing a type, return a GraphQLType
- * definition which applies to that type. For example, if provided the parsed
- * AST node for `[User]`, a GraphQLList instance will be returned, containing
- * the type called "User" found in the schema. If a type called "User" is not
- * found in the schema, then undefined will be returned.
- */
-/* eslint-disable no-redeclare */
-declare function typeFromAST(
-  schema: GraphQLSchema,
-  typeNode: NamedTypeNode,
-): GraphQLNamedType | void;
-declare function typeFromAST(
-  schema: GraphQLSchema,
-  typeNode: ListTypeNode,
-): GraphQLList<any> | void;
-declare function typeFromAST(
-  schema: GraphQLSchema,
-  typeNode: NonNullTypeNode,
-): GraphQLNonNull<any> | void;
-export function typeFromAST(schema, typeNode) {
-  /* eslint-enable no-redeclare */
-  let innerType;
-  if (typeNode.kind === Kind.LIST_TYPE) {
-    innerType = typeFromAST(schema, typeNode.type);
-    return innerType && GraphQLList(innerType);
-  }
-  if (typeNode.kind === Kind.NON_NULL_TYPE) {
-    innerType = typeFromAST(schema, typeNode.type);
-    return innerType && GraphQLNonNull(innerType);
-  }
-  if (typeNode.kind === Kind.NAMED_TYPE) {
-    return schema.getType(typeNode.name.value);
-  }
-
-  // Not reachable. All possible type nodes have been considered.
-  invariant(false, 'Unexpected type node: ' + inspect((typeNode: empty)));
-}
diff --git a/node_modules/graphql/utilities/typeFromAST.mjs b/node_modules/graphql/utilities/typeFromAST.mjs
deleted file mode 100644
index 741df2a..0000000
--- a/node_modules/graphql/utilities/typeFromAST.mjs
+++ /dev/null
@@ -1,37 +0,0 @@
-import inspect from "../jsutils/inspect.mjs";
-import invariant from "../jsutils/invariant.mjs";
-import { Kind } from "../language/kinds.mjs";
-import { GraphQLList, GraphQLNonNull } from "../type/definition.mjs";
-/**
- * Given a Schema and an AST node describing a type, return a GraphQLType
- * definition which applies to that type. For example, if provided the parsed
- * AST node for `[User]`, a GraphQLList instance will be returned, containing
- * the type called "User" found in the schema. If a type called "User" is not
- * found in the schema, then undefined will be returned.
- */
-
-/* eslint-disable no-redeclare */
-
-export function typeFromAST(schema, typeNode) {
-  /* eslint-enable no-redeclare */
-  var innerType;
-
-  if (typeNode.kind === Kind.LIST_TYPE) {
-    innerType = typeFromAST(schema, typeNode.type);
-    return innerType && GraphQLList(innerType);
-  }
-
-  if (typeNode.kind === Kind.NON_NULL_TYPE) {
-    innerType = typeFromAST(schema, typeNode.type);
-    return innerType && GraphQLNonNull(innerType);
-  }
-
-  /* istanbul ignore else */
-  if (typeNode.kind === Kind.NAMED_TYPE) {
-    return schema.getType(typeNode.name.value);
-  } // Not reachable. All possible type nodes have been considered.
-
-
-  /* istanbul ignore next */
-  invariant(false, 'Unexpected type node: ' + inspect(typeNode));
-}
diff --git a/node_modules/graphql/utilities/valueFromAST.d.ts b/node_modules/graphql/utilities/valueFromAST.d.ts
deleted file mode 100644
index bef11b7..0000000
--- a/node_modules/graphql/utilities/valueFromAST.d.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-import { ValueNode } from '../language/ast';
-import { GraphQLInputType } from '../type/definition';
-
-/**
- * Produces a JavaScript value given a GraphQL Value AST.
- *
- * A GraphQL type must be provided, which will be used to interpret different
- * GraphQL Value literals.
- *
- * Returns `undefined` when the value could not be validly coerced according to
- * the provided type.
- *
- * | GraphQL Value        | JSON Value    |
- * | -------------------- | ------------- |
- * | Input Object         | Object        |
- * | List                 | Array         |
- * | Boolean              | Boolean       |
- * | String               | String        |
- * | Int / Float          | Number        |
- * | Enum Value           | Mixed         |
- * | NullValue            | null          |
- *
- */
-export function valueFromAST(
-  valueNode: Maybe<ValueNode>,
-  type: GraphQLInputType,
-  variables?: Maybe<{ [key: string]: any }>,
-): any;
diff --git a/node_modules/graphql/utilities/valueFromAST.js b/node_modules/graphql/utilities/valueFromAST.js
deleted file mode 100644
index 6eaac4e..0000000
--- a/node_modules/graphql/utilities/valueFromAST.js
+++ /dev/null
@@ -1,187 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.valueFromAST = valueFromAST;
-
-var _objectValues3 = _interopRequireDefault(require("../polyfills/objectValues"));
-
-var _keyMap = _interopRequireDefault(require("../jsutils/keyMap"));
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _invariant = _interopRequireDefault(require("../jsutils/invariant"));
-
-var _kinds = require("../language/kinds");
-
-var _definition = require("../type/definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Produces a JavaScript value given a GraphQL Value AST.
- *
- * A GraphQL type must be provided, which will be used to interpret different
- * GraphQL Value literals.
- *
- * Returns `undefined` when the value could not be validly coerced according to
- * the provided type.
- *
- * | GraphQL Value        | JSON Value    |
- * | -------------------- | ------------- |
- * | Input Object         | Object        |
- * | List                 | Array         |
- * | Boolean              | Boolean       |
- * | String               | String        |
- * | Int / Float          | Number        |
- * | Enum Value           | Mixed         |
- * | NullValue            | null          |
- *
- */
-function valueFromAST(valueNode, type, variables) {
-  if (!valueNode) {
-    // When there is no node, then there is also no value.
-    // Importantly, this is different from returning the value null.
-    return;
-  }
-
-  if (valueNode.kind === _kinds.Kind.VARIABLE) {
-    var variableName = valueNode.name.value;
-
-    if (variables == null || variables[variableName] === undefined) {
-      // No valid return value.
-      return;
-    }
-
-    var variableValue = variables[variableName];
-
-    if (variableValue === null && (0, _definition.isNonNullType)(type)) {
-      return; // Invalid: intentionally return no value.
-    } // Note: This does no further checking that this variable is correct.
-    // This assumes that this query has been validated and the variable
-    // usage here is of the correct type.
-
-
-    return variableValue;
-  }
-
-  if ((0, _definition.isNonNullType)(type)) {
-    if (valueNode.kind === _kinds.Kind.NULL) {
-      return; // Invalid: intentionally return no value.
-    }
-
-    return valueFromAST(valueNode, type.ofType, variables);
-  }
-
-  if (valueNode.kind === _kinds.Kind.NULL) {
-    // This is explicitly returning the value null.
-    return null;
-  }
-
-  if ((0, _definition.isListType)(type)) {
-    var itemType = type.ofType;
-
-    if (valueNode.kind === _kinds.Kind.LIST) {
-      var coercedValues = [];
-
-      for (var _i2 = 0, _valueNode$values2 = valueNode.values; _i2 < _valueNode$values2.length; _i2++) {
-        var itemNode = _valueNode$values2[_i2];
-
-        if (isMissingVariable(itemNode, variables)) {
-          // If an array contains a missing variable, it is either coerced to
-          // null or if the item type is non-null, it considered invalid.
-          if ((0, _definition.isNonNullType)(itemType)) {
-            return; // Invalid: intentionally return no value.
-          }
-
-          coercedValues.push(null);
-        } else {
-          var itemValue = valueFromAST(itemNode, itemType, variables);
-
-          if (itemValue === undefined) {
-            return; // Invalid: intentionally return no value.
-          }
-
-          coercedValues.push(itemValue);
-        }
-      }
-
-      return coercedValues;
-    }
-
-    var coercedValue = valueFromAST(valueNode, itemType, variables);
-
-    if (coercedValue === undefined) {
-      return; // Invalid: intentionally return no value.
-    }
-
-    return [coercedValue];
-  }
-
-  if ((0, _definition.isInputObjectType)(type)) {
-    if (valueNode.kind !== _kinds.Kind.OBJECT) {
-      return; // Invalid: intentionally return no value.
-    }
-
-    var coercedObj = Object.create(null);
-    var fieldNodes = (0, _keyMap.default)(valueNode.fields, function (field) {
-      return field.name.value;
-    });
-
-    for (var _i4 = 0, _objectValues2 = (0, _objectValues3.default)(type.getFields()); _i4 < _objectValues2.length; _i4++) {
-      var field = _objectValues2[_i4];
-      var fieldNode = fieldNodes[field.name];
-
-      if (!fieldNode || isMissingVariable(fieldNode.value, variables)) {
-        if (field.defaultValue !== undefined) {
-          coercedObj[field.name] = field.defaultValue;
-        } else if ((0, _definition.isNonNullType)(field.type)) {
-          return; // Invalid: intentionally return no value.
-        }
-
-        continue;
-      }
-
-      var fieldValue = valueFromAST(fieldNode.value, field.type, variables);
-
-      if (fieldValue === undefined) {
-        return; // Invalid: intentionally return no value.
-      }
-
-      coercedObj[field.name] = fieldValue;
-    }
-
-    return coercedObj;
-  }
-
-  /* istanbul ignore else */
-  if ((0, _definition.isLeafType)(type)) {
-    // Scalars and Enums fulfill parsing a literal value via parseLiteral().
-    // Invalid values represent a failure to parse correctly, in which case
-    // no value is returned.
-    var result;
-
-    try {
-      result = type.parseLiteral(valueNode, variables);
-    } catch (_error) {
-      return; // Invalid: intentionally return no value.
-    }
-
-    if (result === undefined) {
-      return; // Invalid: intentionally return no value.
-    }
-
-    return result;
-  } // Not reachable. All possible input types have been considered.
-
-
-  /* istanbul ignore next */
-  (0, _invariant.default)(false, 'Unexpected input type: ' + (0, _inspect.default)(type));
-} // Returns true if the provided valueNode is a variable which is not defined
-// in the set of variables.
-
-
-function isMissingVariable(valueNode, variables) {
-  return valueNode.kind === _kinds.Kind.VARIABLE && (variables == null || variables[valueNode.name.value] === undefined);
-}
diff --git a/node_modules/graphql/utilities/valueFromAST.js.flow b/node_modules/graphql/utilities/valueFromAST.js.flow
deleted file mode 100644
index e5abd02..0000000
--- a/node_modules/graphql/utilities/valueFromAST.js.flow
+++ /dev/null
@@ -1,161 +0,0 @@
-// @flow strict
-
-import objectValues from '../polyfills/objectValues';
-
-import keyMap from '../jsutils/keyMap';
-import inspect from '../jsutils/inspect';
-import invariant from '../jsutils/invariant';
-import { type ObjMap } from '../jsutils/ObjMap';
-
-import { Kind } from '../language/kinds';
-import { type ValueNode } from '../language/ast';
-
-import {
-  type GraphQLInputType,
-  isLeafType,
-  isInputObjectType,
-  isListType,
-  isNonNullType,
-} from '../type/definition';
-
-/**
- * Produces a JavaScript value given a GraphQL Value AST.
- *
- * A GraphQL type must be provided, which will be used to interpret different
- * GraphQL Value literals.
- *
- * Returns `undefined` when the value could not be validly coerced according to
- * the provided type.
- *
- * | GraphQL Value        | JSON Value    |
- * | -------------------- | ------------- |
- * | Input Object         | Object        |
- * | List                 | Array         |
- * | Boolean              | Boolean       |
- * | String               | String        |
- * | Int / Float          | Number        |
- * | Enum Value           | Mixed         |
- * | NullValue            | null          |
- *
- */
-export function valueFromAST(
-  valueNode: ?ValueNode,
-  type: GraphQLInputType,
-  variables?: ?ObjMap<mixed>,
-): mixed | void {
-  if (!valueNode) {
-    // When there is no node, then there is also no value.
-    // Importantly, this is different from returning the value null.
-    return;
-  }
-
-  if (valueNode.kind === Kind.VARIABLE) {
-    const variableName = valueNode.name.value;
-    if (variables == null || variables[variableName] === undefined) {
-      // No valid return value.
-      return;
-    }
-    const variableValue = variables[variableName];
-    if (variableValue === null && isNonNullType(type)) {
-      return; // Invalid: intentionally return no value.
-    }
-    // Note: This does no further checking that this variable is correct.
-    // This assumes that this query has been validated and the variable
-    // usage here is of the correct type.
-    return variableValue;
-  }
-
-  if (isNonNullType(type)) {
-    if (valueNode.kind === Kind.NULL) {
-      return; // Invalid: intentionally return no value.
-    }
-    return valueFromAST(valueNode, type.ofType, variables);
-  }
-
-  if (valueNode.kind === Kind.NULL) {
-    // This is explicitly returning the value null.
-    return null;
-  }
-
-  if (isListType(type)) {
-    const itemType = type.ofType;
-    if (valueNode.kind === Kind.LIST) {
-      const coercedValues = [];
-      for (const itemNode of valueNode.values) {
-        if (isMissingVariable(itemNode, variables)) {
-          // If an array contains a missing variable, it is either coerced to
-          // null or if the item type is non-null, it considered invalid.
-          if (isNonNullType(itemType)) {
-            return; // Invalid: intentionally return no value.
-          }
-          coercedValues.push(null);
-        } else {
-          const itemValue = valueFromAST(itemNode, itemType, variables);
-          if (itemValue === undefined) {
-            return; // Invalid: intentionally return no value.
-          }
-          coercedValues.push(itemValue);
-        }
-      }
-      return coercedValues;
-    }
-    const coercedValue = valueFromAST(valueNode, itemType, variables);
-    if (coercedValue === undefined) {
-      return; // Invalid: intentionally return no value.
-    }
-    return [coercedValue];
-  }
-
-  if (isInputObjectType(type)) {
-    if (valueNode.kind !== Kind.OBJECT) {
-      return; // Invalid: intentionally return no value.
-    }
-    const coercedObj = Object.create(null);
-    const fieldNodes = keyMap(valueNode.fields, field => field.name.value);
-    for (const field of objectValues(type.getFields())) {
-      const fieldNode = fieldNodes[field.name];
-      if (!fieldNode || isMissingVariable(fieldNode.value, variables)) {
-        if (field.defaultValue !== undefined) {
-          coercedObj[field.name] = field.defaultValue;
-        } else if (isNonNullType(field.type)) {
-          return; // Invalid: intentionally return no value.
-        }
-        continue;
-      }
-      const fieldValue = valueFromAST(fieldNode.value, field.type, variables);
-      if (fieldValue === undefined) {
-        return; // Invalid: intentionally return no value.
-      }
-      coercedObj[field.name] = fieldValue;
-    }
-    return coercedObj;
-  }
-
-  if (isLeafType(type)) {
-    // Scalars and Enums fulfill parsing a literal value via parseLiteral().
-    // Invalid values represent a failure to parse correctly, in which case
-    // no value is returned.
-    let result;
-    try {
-      result = type.parseLiteral(valueNode, variables);
-    } catch (_error) {
-      return; // Invalid: intentionally return no value.
-    }
-    if (result === undefined) {
-      return; // Invalid: intentionally return no value.
-    }
-    return result;
-  }
-
-  // Not reachable. All possible input types have been considered.
-  invariant(false, 'Unexpected input type: ' + inspect((type: empty)));
-}
-
-// Returns true if the provided valueNode is a variable which is not defined
-// in the set of variables.
-function isMissingVariable(valueNode, variables) {
-  return (
-    valueNode.kind === Kind.VARIABLE &&
-    (variables == null || variables[valueNode.name.value] === undefined)
-  );
-}
diff --git a/node_modules/graphql/utilities/valueFromAST.mjs b/node_modules/graphql/utilities/valueFromAST.mjs
deleted file mode 100644
index 0ad5197..0000000
--- a/node_modules/graphql/utilities/valueFromAST.mjs
+++ /dev/null
@@ -1,172 +0,0 @@
-import objectValues from "../polyfills/objectValues.mjs";
-import keyMap from "../jsutils/keyMap.mjs";
-import inspect from "../jsutils/inspect.mjs";
-import invariant from "../jsutils/invariant.mjs";
-import { Kind } from "../language/kinds.mjs";
-import { isLeafType, isInputObjectType, isListType, isNonNullType } from "../type/definition.mjs";
-/**
- * Produces a JavaScript value given a GraphQL Value AST.
- *
- * A GraphQL type must be provided, which will be used to interpret different
- * GraphQL Value literals.
- *
- * Returns `undefined` when the value could not be validly coerced according to
- * the provided type.
- *
- * | GraphQL Value        | JSON Value    |
- * | -------------------- | ------------- |
- * | Input Object         | Object        |
- * | List                 | Array         |
- * | Boolean              | Boolean       |
- * | String               | String        |
- * | Int / Float          | Number        |
- * | Enum Value           | Mixed         |
- * | NullValue            | null          |
- *
- */
-
-export function valueFromAST(valueNode, type, variables) {
-  if (!valueNode) {
-    // When there is no node, then there is also no value.
-    // Importantly, this is different from returning the value null.
-    return;
-  }
-
-  if (valueNode.kind === Kind.VARIABLE) {
-    var variableName = valueNode.name.value;
-
-    if (variables == null || variables[variableName] === undefined) {
-      // No valid return value.
-      return;
-    }
-
-    var variableValue = variables[variableName];
-
-    if (variableValue === null && isNonNullType(type)) {
-      return; // Invalid: intentionally return no value.
-    } // Note: This does no further checking that this variable is correct.
-    // This assumes that this query has been validated and the variable
-    // usage here is of the correct type.
-
-
-    return variableValue;
-  }
-
-  if (isNonNullType(type)) {
-    if (valueNode.kind === Kind.NULL) {
-      return; // Invalid: intentionally return no value.
-    }
-
-    return valueFromAST(valueNode, type.ofType, variables);
-  }
-
-  if (valueNode.kind === Kind.NULL) {
-    // This is explicitly returning the value null.
-    return null;
-  }
-
-  if (isListType(type)) {
-    var itemType = type.ofType;
-
-    if (valueNode.kind === Kind.LIST) {
-      var coercedValues = [];
-
-      for (var _i2 = 0, _valueNode$values2 = valueNode.values; _i2 < _valueNode$values2.length; _i2++) {
-        var itemNode = _valueNode$values2[_i2];
-
-        if (isMissingVariable(itemNode, variables)) {
-          // If an array contains a missing variable, it is either coerced to
-          // null or if the item type is non-null, it considered invalid.
-          if (isNonNullType(itemType)) {
-            return; // Invalid: intentionally return no value.
-          }
-
-          coercedValues.push(null);
-        } else {
-          var itemValue = valueFromAST(itemNode, itemType, variables);
-
-          if (itemValue === undefined) {
-            return; // Invalid: intentionally return no value.
-          }
-
-          coercedValues.push(itemValue);
-        }
-      }
-
-      return coercedValues;
-    }
-
-    var coercedValue = valueFromAST(valueNode, itemType, variables);
-
-    if (coercedValue === undefined) {
-      return; // Invalid: intentionally return no value.
-    }
-
-    return [coercedValue];
-  }
-
-  if (isInputObjectType(type)) {
-    if (valueNode.kind !== Kind.OBJECT) {
-      return; // Invalid: intentionally return no value.
-    }
-
-    var coercedObj = Object.create(null);
-    var fieldNodes = keyMap(valueNode.fields, function (field) {
-      return field.name.value;
-    });
-
-    for (var _i4 = 0, _objectValues2 = objectValues(type.getFields()); _i4 < _objectValues2.length; _i4++) {
-      var field = _objectValues2[_i4];
-      var fieldNode = fieldNodes[field.name];
-
-      if (!fieldNode || isMissingVariable(fieldNode.value, variables)) {
-        if (field.defaultValue !== undefined) {
-          coercedObj[field.name] = field.defaultValue;
-        } else if (isNonNullType(field.type)) {
-          return; // Invalid: intentionally return no value.
-        }
-
-        continue;
-      }
-
-      var fieldValue = valueFromAST(fieldNode.value, field.type, variables);
-
-      if (fieldValue === undefined) {
-        return; // Invalid: intentionally return no value.
-      }
-
-      coercedObj[field.name] = fieldValue;
-    }
-
-    return coercedObj;
-  }
-
-  /* istanbul ignore else */
-  if (isLeafType(type)) {
-    // Scalars and Enums fulfill parsing a literal value via parseLiteral().
-    // Invalid values represent a failure to parse correctly, in which case
-    // no value is returned.
-    var result;
-
-    try {
-      result = type.parseLiteral(valueNode, variables);
-    } catch (_error) {
-      return; // Invalid: intentionally return no value.
-    }
-
-    if (result === undefined) {
-      return; // Invalid: intentionally return no value.
-    }
-
-    return result;
-  } // Not reachable. All possible input types have been considered.
-
-
-  /* istanbul ignore next */
-  invariant(false, 'Unexpected input type: ' + inspect(type));
-} // Returns true if the provided valueNode is a variable which is not defined
-// in the set of variables.
-
-function isMissingVariable(valueNode, variables) {
-  return valueNode.kind === Kind.VARIABLE && (variables == null || variables[valueNode.name.value] === undefined);
-}
diff --git a/node_modules/graphql/utilities/valueFromASTUntyped.d.ts b/node_modules/graphql/utilities/valueFromASTUntyped.d.ts
deleted file mode 100644
index ab7512e..0000000
--- a/node_modules/graphql/utilities/valueFromASTUntyped.d.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-import { ValueNode } from '../language/ast';
-
-/**
- * Produces a JavaScript value given a GraphQL Value AST.
- *
- * Unlike `valueFromAST()`, no type is provided. The resulting JavaScript value
- * will reflect the provided GraphQL value AST.
- *
- * | GraphQL Value        | JavaScript Value |
- * | -------------------- | ---------------- |
- * | Input Object         | Object           |
- * | List                 | Array            |
- * | Boolean              | Boolean          |
- * | String / Enum        | String           |
- * | Int / Float          | Number           |
- * | Null                 | null             |
- *
- */
-export function valueFromASTUntyped(
-  valueNode: ValueNode,
-  variables?: Maybe<{ [key: string]: any }>,
-): any;
diff --git a/node_modules/graphql/utilities/valueFromASTUntyped.js b/node_modules/graphql/utilities/valueFromASTUntyped.js
deleted file mode 100644
index 5f005ed..0000000
--- a/node_modules/graphql/utilities/valueFromASTUntyped.js
+++ /dev/null
@@ -1,69 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.valueFromASTUntyped = valueFromASTUntyped;
-
-var _inspect = _interopRequireDefault(require("../jsutils/inspect"));
-
-var _invariant = _interopRequireDefault(require("../jsutils/invariant"));
-
-var _keyValMap = _interopRequireDefault(require("../jsutils/keyValMap"));
-
-var _kinds = require("../language/kinds");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Produces a JavaScript value given a GraphQL Value AST.
- *
- * Unlike `valueFromAST()`, no type is provided. The resulting JavaScript value
- * will reflect the provided GraphQL value AST.
- *
- * | GraphQL Value        | JavaScript Value |
- * | -------------------- | ---------------- |
- * | Input Object         | Object           |
- * | List                 | Array            |
- * | Boolean              | Boolean          |
- * | String / Enum        | String           |
- * | Int / Float          | Number           |
- * | Null                 | null             |
- *
- */
-function valueFromASTUntyped(valueNode, variables) {
-  switch (valueNode.kind) {
-    case _kinds.Kind.NULL:
-      return null;
-
-    case _kinds.Kind.INT:
-      return parseInt(valueNode.value, 10);
-
-    case _kinds.Kind.FLOAT:
-      return parseFloat(valueNode.value);
-
-    case _kinds.Kind.STRING:
-    case _kinds.Kind.ENUM:
-    case _kinds.Kind.BOOLEAN:
-      return valueNode.value;
-
-    case _kinds.Kind.LIST:
-      return valueNode.values.map(function (node) {
-        return valueFromASTUntyped(node, variables);
-      });
-
-    case _kinds.Kind.OBJECT:
-      return (0, _keyValMap.default)(valueNode.fields, function (field) {
-        return field.name.value;
-      }, function (field) {
-        return valueFromASTUntyped(field.value, variables);
-      });
-
-    case _kinds.Kind.VARIABLE:
-      return variables === null || variables === void 0 ? void 0 : variables[valueNode.name.value];
-  } // Not reachable. All possible value nodes have been considered.
-
-
-  /* istanbul ignore next */
-  (0, _invariant.default)(false, 'Unexpected value node: ' + (0, _inspect.default)(valueNode));
-}
diff --git a/node_modules/graphql/utilities/valueFromASTUntyped.js.flow b/node_modules/graphql/utilities/valueFromASTUntyped.js.flow
deleted file mode 100644
index 5957ea8..0000000
--- a/node_modules/graphql/utilities/valueFromASTUntyped.js.flow
+++ /dev/null
@@ -1,56 +0,0 @@
-// @flow strict
-
-import inspect from '../jsutils/inspect';
-import invariant from '../jsutils/invariant';
-import keyValMap from '../jsutils/keyValMap';
-import { type ObjMap } from '../jsutils/ObjMap';
-
-import { Kind } from '../language/kinds';
-import { type ValueNode } from '../language/ast';
-
-/**
- * Produces a JavaScript value given a GraphQL Value AST.
- *
- * Unlike `valueFromAST()`, no type is provided. The resulting JavaScript value
- * will reflect the provided GraphQL value AST.
- *
- * | GraphQL Value        | JavaScript Value |
- * | -------------------- | ---------------- |
- * | Input Object         | Object           |
- * | List                 | Array            |
- * | Boolean              | Boolean          |
- * | String / Enum        | String           |
- * | Int / Float          | Number           |
- * | Null                 | null             |
- *
- */
-export function valueFromASTUntyped(
-  valueNode: ValueNode,
-  variables?: ?ObjMap<mixed>,
-): mixed {
-  switch (valueNode.kind) {
-    case Kind.NULL:
-      return null;
-    case Kind.INT:
-      return parseInt(valueNode.value, 10);
-    case Kind.FLOAT:
-      return parseFloat(valueNode.value);
-    case Kind.STRING:
-    case Kind.ENUM:
-    case Kind.BOOLEAN:
-      return valueNode.value;
-    case Kind.LIST:
-      return valueNode.values.map(node => valueFromASTUntyped(node, variables));
-    case Kind.OBJECT:
-      return keyValMap(
-        valueNode.fields,
-        field => field.name.value,
-        field => valueFromASTUntyped(field.value, variables),
-      );
-    case Kind.VARIABLE:
-      return variables?.[valueNode.name.value];
-  }
-
-  // Not reachable. All possible value nodes have been considered.
-  invariant(false, 'Unexpected value node: ' + inspect((valueNode: empty)));
-}
diff --git a/node_modules/graphql/utilities/valueFromASTUntyped.mjs b/node_modules/graphql/utilities/valueFromASTUntyped.mjs
deleted file mode 100644
index 9ae45e3..0000000
--- a/node_modules/graphql/utilities/valueFromASTUntyped.mjs
+++ /dev/null
@@ -1,57 +0,0 @@
-import inspect from "../jsutils/inspect.mjs";
-import invariant from "../jsutils/invariant.mjs";
-import keyValMap from "../jsutils/keyValMap.mjs";
-import { Kind } from "../language/kinds.mjs";
-
-/**
- * Produces a JavaScript value given a GraphQL Value AST.
- *
- * Unlike `valueFromAST()`, no type is provided. The resulting JavaScript value
- * will reflect the provided GraphQL value AST.
- *
- * | GraphQL Value        | JavaScript Value |
- * | -------------------- | ---------------- |
- * | Input Object         | Object           |
- * | List                 | Array            |
- * | Boolean              | Boolean          |
- * | String / Enum        | String           |
- * | Int / Float          | Number           |
- * | Null                 | null             |
- *
- */
-export function valueFromASTUntyped(valueNode, variables) {
-  switch (valueNode.kind) {
-    case Kind.NULL:
-      return null;
-
-    case Kind.INT:
-      return parseInt(valueNode.value, 10);
-
-    case Kind.FLOAT:
-      return parseFloat(valueNode.value);
-
-    case Kind.STRING:
-    case Kind.ENUM:
-    case Kind.BOOLEAN:
-      return valueNode.value;
-
-    case Kind.LIST:
-      return valueNode.values.map(function (node) {
-        return valueFromASTUntyped(node, variables);
-      });
-
-    case Kind.OBJECT:
-      return keyValMap(valueNode.fields, function (field) {
-        return field.name.value;
-      }, function (field) {
-        return valueFromASTUntyped(field.value, variables);
-      });
-
-    case Kind.VARIABLE:
-      return variables === null || variables === void 0 ? void 0 : variables[valueNode.name.value];
-  } // Not reachable. All possible value nodes have been considered.
-
-
-  /* istanbul ignore next */
-  invariant(false, 'Unexpected value node: ' + inspect(valueNode));
-}
diff --git a/node_modules/graphql/validation/ValidationContext.d.ts b/node_modules/graphql/validation/ValidationContext.d.ts
deleted file mode 100644
index 1591a46..0000000
--- a/node_modules/graphql/validation/ValidationContext.d.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-import { GraphQLError } from '../error/GraphQLError';
-import { ASTVisitor } from '../language/visitor';
-import {
-  DocumentNode,
-  OperationDefinitionNode,
-  VariableNode,
-  SelectionSetNode,
-  FragmentSpreadNode,
-  FragmentDefinitionNode,
-} from '../language/ast';
-import { GraphQLSchema } from '../type/schema';
-import { GraphQLDirective } from '../type/directives';
-import {
-  GraphQLInputType,
-  GraphQLOutputType,
-  GraphQLCompositeType,
-  GraphQLField,
-  GraphQLArgument,
-} from '../type/definition';
-import { TypeInfo } from '../utilities/TypeInfo';
-
-type NodeWithSelectionSet = OperationDefinitionNode | FragmentDefinitionNode;
-type VariableUsage = {
-  readonly node: VariableNode;
-  readonly type: Maybe<GraphQLInputType>;
-  readonly defaultValue: Maybe<any>;
-};
-
-/**
- * An instance of this class is passed as the "this" context to all validators,
- * allowing access to commonly useful contextual information from within a
- * validation rule.
- */
-export class ASTValidationContext {
-  constructor(ast: DocumentNode, onError: (err: GraphQLError) => void);
-
-  reportError(error: GraphQLError): undefined;
-
-  getDocument(): DocumentNode;
-
-  getFragment(name: string): Maybe<FragmentDefinitionNode>;
-
-  getFragmentSpreads(node: SelectionSetNode): ReadonlyArray<FragmentSpreadNode>;
-
-  getRecursivelyReferencedFragments(
-    operation: OperationDefinitionNode,
-  ): ReadonlyArray<FragmentDefinitionNode>;
-}
-
-export class SDLValidationContext extends ASTValidationContext {
-  constructor(
-    ast: DocumentNode,
-    schema: Maybe<GraphQLSchema>,
-    onError: (err: GraphQLError) => void,
-  );
-
-  getSchema(): Maybe<GraphQLSchema>;
-}
-
-export type SDLValidationRule = (context: SDLValidationContext) => ASTVisitor;
-
-export class ValidationContext extends ASTValidationContext {
-  constructor(
-    schema: GraphQLSchema,
-    ast: DocumentNode,
-    typeInfo: TypeInfo,
-    onError: (err: GraphQLError) => void,
-  );
-
-  getSchema(): GraphQLSchema;
-
-  getVariableUsages(node: NodeWithSelectionSet): ReadonlyArray<VariableUsage>;
-
-  getRecursivelyReferencedFragments(
-    operation: OperationDefinitionNode,
-  ): ReadonlyArray<FragmentDefinitionNode>;
-
-  getType(): Maybe<GraphQLOutputType>;
-
-  getParentType(): Maybe<GraphQLCompositeType>;
-
-  getInputType(): Maybe<GraphQLInputType>;
-
-  getParentInputType(): Maybe<GraphQLInputType>;
-
-  getFieldDef(): Maybe<GraphQLField<any, any>>;
-
-  getDirective(): Maybe<GraphQLDirective>;
-
-  getArgument(): Maybe<GraphQLArgument>;
-}
-
-export type ValidationRule = (context: ValidationContext) => ASTVisitor;
diff --git a/node_modules/graphql/validation/ValidationContext.js b/node_modules/graphql/validation/ValidationContext.js
deleted file mode 100644
index 350ef06..0000000
--- a/node_modules/graphql/validation/ValidationContext.js
+++ /dev/null
@@ -1,243 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.ValidationContext = exports.SDLValidationContext = exports.ASTValidationContext = void 0;
-
-var _kinds = require("../language/kinds");
-
-var _visitor = require("../language/visitor");
-
-var _TypeInfo = require("../utilities/TypeInfo");
-
-function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
-
-/**
- * An instance of this class is passed as the "this" context to all validators,
- * allowing access to commonly useful contextual information from within a
- * validation rule.
- */
-var ASTValidationContext =
-/*#__PURE__*/
-function () {
-  function ASTValidationContext(ast, onError) {
-    this._ast = ast;
-    this._fragments = undefined;
-    this._fragmentSpreads = new Map();
-    this._recursivelyReferencedFragments = new Map();
-    this._onError = onError;
-  }
-
-  var _proto = ASTValidationContext.prototype;
-
-  _proto.reportError = function reportError(error) {
-    this._onError(error);
-  };
-
-  _proto.getDocument = function getDocument() {
-    return this._ast;
-  };
-
-  _proto.getFragment = function getFragment(name) {
-    var fragments = this._fragments;
-
-    if (!fragments) {
-      this._fragments = fragments = this.getDocument().definitions.reduce(function (frags, statement) {
-        if (statement.kind === _kinds.Kind.FRAGMENT_DEFINITION) {
-          frags[statement.name.value] = statement;
-        }
-
-        return frags;
-      }, Object.create(null));
-    }
-
-    return fragments[name];
-  };
-
-  _proto.getFragmentSpreads = function getFragmentSpreads(node) {
-    var spreads = this._fragmentSpreads.get(node);
-
-    if (!spreads) {
-      spreads = [];
-      var setsToVisit = [node];
-
-      while (setsToVisit.length !== 0) {
-        var set = setsToVisit.pop();
-
-        for (var _i2 = 0, _set$selections2 = set.selections; _i2 < _set$selections2.length; _i2++) {
-          var selection = _set$selections2[_i2];
-
-          if (selection.kind === _kinds.Kind.FRAGMENT_SPREAD) {
-            spreads.push(selection);
-          } else if (selection.selectionSet) {
-            setsToVisit.push(selection.selectionSet);
-          }
-        }
-      }
-
-      this._fragmentSpreads.set(node, spreads);
-    }
-
-    return spreads;
-  };
-
-  _proto.getRecursivelyReferencedFragments = function getRecursivelyReferencedFragments(operation) {
-    var fragments = this._recursivelyReferencedFragments.get(operation);
-
-    if (!fragments) {
-      fragments = [];
-      var collectedNames = Object.create(null);
-      var nodesToVisit = [operation.selectionSet];
-
-      while (nodesToVisit.length !== 0) {
-        var node = nodesToVisit.pop();
-
-        for (var _i4 = 0, _this$getFragmentSpre2 = this.getFragmentSpreads(node); _i4 < _this$getFragmentSpre2.length; _i4++) {
-          var spread = _this$getFragmentSpre2[_i4];
-          var fragName = spread.name.value;
-
-          if (collectedNames[fragName] !== true) {
-            collectedNames[fragName] = true;
-            var fragment = this.getFragment(fragName);
-
-            if (fragment) {
-              fragments.push(fragment);
-              nodesToVisit.push(fragment.selectionSet);
-            }
-          }
-        }
-      }
-
-      this._recursivelyReferencedFragments.set(operation, fragments);
-    }
-
-    return fragments;
-  };
-
-  return ASTValidationContext;
-}();
-
-exports.ASTValidationContext = ASTValidationContext;
-
-var SDLValidationContext =
-/*#__PURE__*/
-function (_ASTValidationContext) {
-  _inheritsLoose(SDLValidationContext, _ASTValidationContext);
-
-  function SDLValidationContext(ast, schema, onError) {
-    var _this;
-
-    _this = _ASTValidationContext.call(this, ast, onError) || this;
-    _this._schema = schema;
-    return _this;
-  }
-
-  var _proto2 = SDLValidationContext.prototype;
-
-  _proto2.getSchema = function getSchema() {
-    return this._schema;
-  };
-
-  return SDLValidationContext;
-}(ASTValidationContext);
-
-exports.SDLValidationContext = SDLValidationContext;
-
-var ValidationContext =
-/*#__PURE__*/
-function (_ASTValidationContext2) {
-  _inheritsLoose(ValidationContext, _ASTValidationContext2);
-
-  function ValidationContext(schema, ast, typeInfo, onError) {
-    var _this2;
-
-    _this2 = _ASTValidationContext2.call(this, ast, onError) || this;
-    _this2._schema = schema;
-    _this2._typeInfo = typeInfo;
-    _this2._variableUsages = new Map();
-    _this2._recursiveVariableUsages = new Map();
-    return _this2;
-  }
-
-  var _proto3 = ValidationContext.prototype;
-
-  _proto3.getSchema = function getSchema() {
-    return this._schema;
-  };
-
-  _proto3.getVariableUsages = function getVariableUsages(node) {
-    var usages = this._variableUsages.get(node);
-
-    if (!usages) {
-      var newUsages = [];
-      var typeInfo = new _TypeInfo.TypeInfo(this._schema);
-      (0, _visitor.visit)(node, (0, _TypeInfo.visitWithTypeInfo)(typeInfo, {
-        VariableDefinition: function VariableDefinition() {
-          return false;
-        },
-        Variable: function Variable(variable) {
-          newUsages.push({
-            node: variable,
-            type: typeInfo.getInputType(),
-            defaultValue: typeInfo.getDefaultValue()
-          });
-        }
-      }));
-      usages = newUsages;
-
-      this._variableUsages.set(node, usages);
-    }
-
-    return usages;
-  };
-
-  _proto3.getRecursiveVariableUsages = function getRecursiveVariableUsages(operation) {
-    var usages = this._recursiveVariableUsages.get(operation);
-
-    if (!usages) {
-      usages = this.getVariableUsages(operation);
-
-      for (var _i6 = 0, _this$getRecursivelyR2 = this.getRecursivelyReferencedFragments(operation); _i6 < _this$getRecursivelyR2.length; _i6++) {
-        var frag = _this$getRecursivelyR2[_i6];
-        usages = usages.concat(this.getVariableUsages(frag));
-      }
-
-      this._recursiveVariableUsages.set(operation, usages);
-    }
-
-    return usages;
-  };
-
-  _proto3.getType = function getType() {
-    return this._typeInfo.getType();
-  };
-
-  _proto3.getParentType = function getParentType() {
-    return this._typeInfo.getParentType();
-  };
-
-  _proto3.getInputType = function getInputType() {
-    return this._typeInfo.getInputType();
-  };
-
-  _proto3.getParentInputType = function getParentInputType() {
-    return this._typeInfo.getParentInputType();
-  };
-
-  _proto3.getFieldDef = function getFieldDef() {
-    return this._typeInfo.getFieldDef();
-  };
-
-  _proto3.getDirective = function getDirective() {
-    return this._typeInfo.getDirective();
-  };
-
-  _proto3.getArgument = function getArgument() {
-    return this._typeInfo.getArgument();
-  };
-
-  return ValidationContext;
-}(ASTValidationContext);
-
-exports.ValidationContext = ValidationContext;
diff --git a/node_modules/graphql/validation/ValidationContext.js.flow b/node_modules/graphql/validation/ValidationContext.js.flow
deleted file mode 100644
index a8f720a..0000000
--- a/node_modules/graphql/validation/ValidationContext.js.flow
+++ /dev/null
@@ -1,248 +0,0 @@
-// @flow strict
-
-import { type ObjMap } from '../jsutils/ObjMap';
-
-import { type GraphQLError } from '../error/GraphQLError';
-
-import { Kind } from '../language/kinds';
-import { type ASTVisitor, visit } from '../language/visitor';
-import {
-  type DocumentNode,
-  type OperationDefinitionNode,
-  type VariableNode,
-  type SelectionSetNode,
-  type FragmentSpreadNode,
-  type FragmentDefinitionNode,
-} from '../language/ast';
-
-import { type GraphQLSchema } from '../type/schema';
-import { type GraphQLDirective } from '../type/directives';
-import {
-  type GraphQLInputType,
-  type GraphQLOutputType,
-  type GraphQLCompositeType,
-  type GraphQLField,
-  type GraphQLArgument,
-} from '../type/definition';
-
-import { TypeInfo, visitWithTypeInfo } from '../utilities/TypeInfo';
-
-type NodeWithSelectionSet = OperationDefinitionNode | FragmentDefinitionNode;
-type VariableUsage = {|
-  +node: VariableNode,
-  +type: ?GraphQLInputType,
-  +defaultValue: ?mixed,
-|};
-
-/**
- * An instance of this class is passed as the "this" context to all validators,
- * allowing access to commonly useful contextual information from within a
- * validation rule.
- */
-export class ASTValidationContext {
-  _ast: DocumentNode;
-  _onError: (err: GraphQLError) => void;
-  _fragments: ?ObjMap<FragmentDefinitionNode>;
-  _fragmentSpreads: Map<SelectionSetNode, $ReadOnlyArray<FragmentSpreadNode>>;
-  _recursivelyReferencedFragments: Map<
-    OperationDefinitionNode,
-    $ReadOnlyArray<FragmentDefinitionNode>,
-  >;
-
-  constructor(ast: DocumentNode, onError: (err: GraphQLError) => void): void {
-    this._ast = ast;
-    this._fragments = undefined;
-    this._fragmentSpreads = new Map();
-    this._recursivelyReferencedFragments = new Map();
-    this._onError = onError;
-  }
-
-  reportError(error: GraphQLError): void {
-    this._onError(error);
-  }
-
-  getDocument(): DocumentNode {
-    return this._ast;
-  }
-
-  getFragment(name: string): ?FragmentDefinitionNode {
-    let fragments = this._fragments;
-    if (!fragments) {
-      this._fragments = fragments = this.getDocument().definitions.reduce(
-        (frags, statement) => {
-          if (statement.kind === Kind.FRAGMENT_DEFINITION) {
-            frags[statement.name.value] = statement;
-          }
-          return frags;
-        },
-        Object.create(null),
-      );
-    }
-    return fragments[name];
-  }
-
-  getFragmentSpreads(
-    node: SelectionSetNode,
-  ): $ReadOnlyArray<FragmentSpreadNode> {
-    let spreads = this._fragmentSpreads.get(node);
-    if (!spreads) {
-      spreads = [];
-      const setsToVisit: Array<SelectionSetNode> = [node];
-      while (setsToVisit.length !== 0) {
-        const set = setsToVisit.pop();
-        for (const selection of set.selections) {
-          if (selection.kind === Kind.FRAGMENT_SPREAD) {
-            spreads.push(selection);
-          } else if (selection.selectionSet) {
-            setsToVisit.push(selection.selectionSet);
-          }
-        }
-      }
-      this._fragmentSpreads.set(node, spreads);
-    }
-    return spreads;
-  }
-
-  getRecursivelyReferencedFragments(
-    operation: OperationDefinitionNode,
-  ): $ReadOnlyArray<FragmentDefinitionNode> {
-    let fragments = this._recursivelyReferencedFragments.get(operation);
-    if (!fragments) {
-      fragments = [];
-      const collectedNames = Object.create(null);
-      const nodesToVisit: Array<SelectionSetNode> = [operation.selectionSet];
-      while (nodesToVisit.length !== 0) {
-        const node = nodesToVisit.pop();
-        for (const spread of this.getFragmentSpreads(node)) {
-          const fragName = spread.name.value;
-          if (collectedNames[fragName] !== true) {
-            collectedNames[fragName] = true;
-            const fragment = this.getFragment(fragName);
-            if (fragment) {
-              fragments.push(fragment);
-              nodesToVisit.push(fragment.selectionSet);
-            }
-          }
-        }
-      }
-      this._recursivelyReferencedFragments.set(operation, fragments);
-    }
-    return fragments;
-  }
-}
-
-export type ASTValidationRule = ASTValidationContext => ASTVisitor;
-
-export class SDLValidationContext extends ASTValidationContext {
-  _schema: ?GraphQLSchema;
-
-  constructor(
-    ast: DocumentNode,
-    schema: ?GraphQLSchema,
-    onError: (err: GraphQLError) => void,
-  ): void {
-    super(ast, onError);
-    this._schema = schema;
-  }
-
-  getSchema(): ?GraphQLSchema {
-    return this._schema;
-  }
-}
-
-export type SDLValidationRule = SDLValidationContext => ASTVisitor;
-
-export class ValidationContext extends ASTValidationContext {
-  _schema: GraphQLSchema;
-  _typeInfo: TypeInfo;
-  _variableUsages: Map<NodeWithSelectionSet, $ReadOnlyArray<VariableUsage>>;
-  _recursiveVariableUsages: Map<
-    OperationDefinitionNode,
-    $ReadOnlyArray<VariableUsage>,
-  >;
-
-  constructor(
-    schema: GraphQLSchema,
-    ast: DocumentNode,
-    typeInfo: TypeInfo,
-    onError: (err: GraphQLError) => void,
-  ): void {
-    super(ast, onError);
-    this._schema = schema;
-    this._typeInfo = typeInfo;
-    this._variableUsages = new Map();
-    this._recursiveVariableUsages = new Map();
-  }
-
-  getSchema(): GraphQLSchema {
-    return this._schema;
-  }
-
-  getVariableUsages(node: NodeWithSelectionSet): $ReadOnlyArray<VariableUsage> {
-    let usages = this._variableUsages.get(node);
-    if (!usages) {
-      const newUsages = [];
-      const typeInfo = new TypeInfo(this._schema);
-      visit(
-        node,
-        visitWithTypeInfo(typeInfo, {
-          VariableDefinition: () => false,
-          Variable(variable) {
-            newUsages.push({
-              node: variable,
-              type: typeInfo.getInputType(),
-              defaultValue: typeInfo.getDefaultValue(),
-            });
-          },
-        }),
-      );
-      usages = newUsages;
-      this._variableUsages.set(node, usages);
-    }
-    return usages;
-  }
-
-  getRecursiveVariableUsages(
-    operation: OperationDefinitionNode,
-  ): $ReadOnlyArray<VariableUsage> {
-    let usages = this._recursiveVariableUsages.get(operation);
-    if (!usages) {
-      usages = this.getVariableUsages(operation);
-      for (const frag of this.getRecursivelyReferencedFragments(operation)) {
-        usages = usages.concat(this.getVariableUsages(frag));
-      }
-      this._recursiveVariableUsages.set(operation, usages);
-    }
-    return usages;
-  }
-
-  getType(): ?GraphQLOutputType {
-    return this._typeInfo.getType();
-  }
-
-  getParentType(): ?GraphQLCompositeType {
-    return this._typeInfo.getParentType();
-  }
-
-  getInputType(): ?GraphQLInputType {
-    return this._typeInfo.getInputType();
-  }
-
-  getParentInputType(): ?GraphQLInputType {
-    return this._typeInfo.getParentInputType();
-  }
-
-  getFieldDef(): ?GraphQLField<mixed, mixed> {
-    return this._typeInfo.getFieldDef();
-  }
-
-  getDirective(): ?GraphQLDirective {
-    return this._typeInfo.getDirective();
-  }
-
-  getArgument(): ?GraphQLArgument {
-    return this._typeInfo.getArgument();
-  }
-}
-
-export type ValidationRule = ValidationContext => ASTVisitor;
diff --git a/node_modules/graphql/validation/ValidationContext.mjs b/node_modules/graphql/validation/ValidationContext.mjs
deleted file mode 100644
index 44eef74..0000000
--- a/node_modules/graphql/validation/ValidationContext.mjs
+++ /dev/null
@@ -1,226 +0,0 @@
-function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
-
-import { Kind } from "../language/kinds.mjs";
-import { visit } from "../language/visitor.mjs";
-import { TypeInfo, visitWithTypeInfo } from "../utilities/TypeInfo.mjs";
-
-/**
- * An instance of this class is passed as the "this" context to all validators,
- * allowing access to commonly useful contextual information from within a
- * validation rule.
- */
-export var ASTValidationContext =
-/*#__PURE__*/
-function () {
-  function ASTValidationContext(ast, onError) {
-    this._ast = ast;
-    this._fragments = undefined;
-    this._fragmentSpreads = new Map();
-    this._recursivelyReferencedFragments = new Map();
-    this._onError = onError;
-  }
-
-  var _proto = ASTValidationContext.prototype;
-
-  _proto.reportError = function reportError(error) {
-    this._onError(error);
-  };
-
-  _proto.getDocument = function getDocument() {
-    return this._ast;
-  };
-
-  _proto.getFragment = function getFragment(name) {
-    var fragments = this._fragments;
-
-    if (!fragments) {
-      this._fragments = fragments = this.getDocument().definitions.reduce(function (frags, statement) {
-        if (statement.kind === Kind.FRAGMENT_DEFINITION) {
-          frags[statement.name.value] = statement;
-        }
-
-        return frags;
-      }, Object.create(null));
-    }
-
-    return fragments[name];
-  };
-
-  _proto.getFragmentSpreads = function getFragmentSpreads(node) {
-    var spreads = this._fragmentSpreads.get(node);
-
-    if (!spreads) {
-      spreads = [];
-      var setsToVisit = [node];
-
-      while (setsToVisit.length !== 0) {
-        var set = setsToVisit.pop();
-
-        for (var _i2 = 0, _set$selections2 = set.selections; _i2 < _set$selections2.length; _i2++) {
-          var selection = _set$selections2[_i2];
-
-          if (selection.kind === Kind.FRAGMENT_SPREAD) {
-            spreads.push(selection);
-          } else if (selection.selectionSet) {
-            setsToVisit.push(selection.selectionSet);
-          }
-        }
-      }
-
-      this._fragmentSpreads.set(node, spreads);
-    }
-
-    return spreads;
-  };
-
-  _proto.getRecursivelyReferencedFragments = function getRecursivelyReferencedFragments(operation) {
-    var fragments = this._recursivelyReferencedFragments.get(operation);
-
-    if (!fragments) {
-      fragments = [];
-      var collectedNames = Object.create(null);
-      var nodesToVisit = [operation.selectionSet];
-
-      while (nodesToVisit.length !== 0) {
-        var node = nodesToVisit.pop();
-
-        for (var _i4 = 0, _this$getFragmentSpre2 = this.getFragmentSpreads(node); _i4 < _this$getFragmentSpre2.length; _i4++) {
-          var spread = _this$getFragmentSpre2[_i4];
-          var fragName = spread.name.value;
-
-          if (collectedNames[fragName] !== true) {
-            collectedNames[fragName] = true;
-            var fragment = this.getFragment(fragName);
-
-            if (fragment) {
-              fragments.push(fragment);
-              nodesToVisit.push(fragment.selectionSet);
-            }
-          }
-        }
-      }
-
-      this._recursivelyReferencedFragments.set(operation, fragments);
-    }
-
-    return fragments;
-  };
-
-  return ASTValidationContext;
-}();
-export var SDLValidationContext =
-/*#__PURE__*/
-function (_ASTValidationContext) {
-  _inheritsLoose(SDLValidationContext, _ASTValidationContext);
-
-  function SDLValidationContext(ast, schema, onError) {
-    var _this;
-
-    _this = _ASTValidationContext.call(this, ast, onError) || this;
-    _this._schema = schema;
-    return _this;
-  }
-
-  var _proto2 = SDLValidationContext.prototype;
-
-  _proto2.getSchema = function getSchema() {
-    return this._schema;
-  };
-
-  return SDLValidationContext;
-}(ASTValidationContext);
-export var ValidationContext =
-/*#__PURE__*/
-function (_ASTValidationContext2) {
-  _inheritsLoose(ValidationContext, _ASTValidationContext2);
-
-  function ValidationContext(schema, ast, typeInfo, onError) {
-    var _this2;
-
-    _this2 = _ASTValidationContext2.call(this, ast, onError) || this;
-    _this2._schema = schema;
-    _this2._typeInfo = typeInfo;
-    _this2._variableUsages = new Map();
-    _this2._recursiveVariableUsages = new Map();
-    return _this2;
-  }
-
-  var _proto3 = ValidationContext.prototype;
-
-  _proto3.getSchema = function getSchema() {
-    return this._schema;
-  };
-
-  _proto3.getVariableUsages = function getVariableUsages(node) {
-    var usages = this._variableUsages.get(node);
-
-    if (!usages) {
-      var newUsages = [];
-      var typeInfo = new TypeInfo(this._schema);
-      visit(node, visitWithTypeInfo(typeInfo, {
-        VariableDefinition: function VariableDefinition() {
-          return false;
-        },
-        Variable: function Variable(variable) {
-          newUsages.push({
-            node: variable,
-            type: typeInfo.getInputType(),
-            defaultValue: typeInfo.getDefaultValue()
-          });
-        }
-      }));
-      usages = newUsages;
-
-      this._variableUsages.set(node, usages);
-    }
-
-    return usages;
-  };
-
-  _proto3.getRecursiveVariableUsages = function getRecursiveVariableUsages(operation) {
-    var usages = this._recursiveVariableUsages.get(operation);
-
-    if (!usages) {
-      usages = this.getVariableUsages(operation);
-
-      for (var _i6 = 0, _this$getRecursivelyR2 = this.getRecursivelyReferencedFragments(operation); _i6 < _this$getRecursivelyR2.length; _i6++) {
-        var frag = _this$getRecursivelyR2[_i6];
-        usages = usages.concat(this.getVariableUsages(frag));
-      }
-
-      this._recursiveVariableUsages.set(operation, usages);
-    }
-
-    return usages;
-  };
-
-  _proto3.getType = function getType() {
-    return this._typeInfo.getType();
-  };
-
-  _proto3.getParentType = function getParentType() {
-    return this._typeInfo.getParentType();
-  };
-
-  _proto3.getInputType = function getInputType() {
-    return this._typeInfo.getInputType();
-  };
-
-  _proto3.getParentInputType = function getParentInputType() {
-    return this._typeInfo.getParentInputType();
-  };
-
-  _proto3.getFieldDef = function getFieldDef() {
-    return this._typeInfo.getFieldDef();
-  };
-
-  _proto3.getDirective = function getDirective() {
-    return this._typeInfo.getDirective();
-  };
-
-  _proto3.getArgument = function getArgument() {
-    return this._typeInfo.getArgument();
-  };
-
-  return ValidationContext;
-}(ASTValidationContext);
diff --git a/node_modules/graphql/validation/index.d.ts b/node_modules/graphql/validation/index.d.ts
deleted file mode 100644
index 79317bf..0000000
--- a/node_modules/graphql/validation/index.d.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-export { validate } from './validate';
-
-export { ValidationContext, ValidationRule } from './ValidationContext';
-
-export { specifiedRules } from './specifiedRules';
-
-// Spec Section: "Executable Definitions"
-export { ExecutableDefinitionsRule } from './rules/ExecutableDefinitionsRule';
-
-// Spec Section: "Field Selections on Objects, Interfaces, and Unions Types"
-export { FieldsOnCorrectTypeRule } from './rules/FieldsOnCorrectTypeRule';
-
-// Spec Section: "Fragments on Composite Types"
-export { FragmentsOnCompositeTypesRule } from './rules/FragmentsOnCompositeTypesRule';
-
-// Spec Section: "Argument Names"
-export { KnownArgumentNamesRule } from './rules/KnownArgumentNamesRule';
-
-// Spec Section: "Directives Are Defined"
-export { KnownDirectivesRule } from './rules/KnownDirectivesRule';
-
-// Spec Section: "Fragment spread target defined"
-export { KnownFragmentNamesRule } from './rules/KnownFragmentNamesRule';
-
-// Spec Section: "Fragment Spread Type Existence"
-export { KnownTypeNamesRule } from './rules/KnownTypeNamesRule';
-
-// Spec Section: "Lone Anonymous Operation"
-export { LoneAnonymousOperationRule } from './rules/LoneAnonymousOperationRule';
-
-// Spec Section: "Fragments must not form cycles"
-export { NoFragmentCyclesRule } from './rules/NoFragmentCyclesRule';
-
-// Spec Section: "All Variable Used Defined"
-export { NoUndefinedVariablesRule } from './rules/NoUndefinedVariablesRule';
-
-// Spec Section: "Fragments must be used"
-export { NoUnusedFragmentsRule } from './rules/NoUnusedFragmentsRule';
-
-// Spec Section: "All Variables Used"
-export { NoUnusedVariablesRule } from './rules/NoUnusedVariablesRule';
-
-// Spec Section: "Field Selection Merging"
-export { OverlappingFieldsCanBeMergedRule } from './rules/OverlappingFieldsCanBeMergedRule';
-
-// Spec Section: "Fragment spread is possible"
-export { PossibleFragmentSpreadsRule } from './rules/PossibleFragmentSpreadsRule';
-
-// Spec Section: "Argument Optionality"
-export { ProvidedRequiredArgumentsRule } from './rules/ProvidedRequiredArgumentsRule';
-
-// Spec Section: "Leaf Field Selections"
-export { ScalarLeafsRule } from './rules/ScalarLeafsRule';
-
-// Spec Section: "Subscriptions with Single Root Field"
-export { SingleFieldSubscriptionsRule } from './rules/SingleFieldSubscriptionsRule';
-
-// Spec Section: "Argument Uniqueness"
-export { UniqueArgumentNamesRule } from './rules/UniqueArgumentNamesRule';
-
-// Spec Section: "Directives Are Unique Per Location"
-export { UniqueDirectivesPerLocationRule } from './rules/UniqueDirectivesPerLocationRule';
-
-// Spec Section: "Fragment Name Uniqueness"
-export { UniqueFragmentNamesRule } from './rules/UniqueFragmentNamesRule';
-
-// Spec Section: "Input Object Field Uniqueness"
-export { UniqueInputFieldNamesRule } from './rules/UniqueInputFieldNamesRule';
-
-// Spec Section: "Operation Name Uniqueness"
-export { UniqueOperationNamesRule } from './rules/UniqueOperationNamesRule';
-
-// Spec Section: "Variable Uniqueness"
-export { UniqueVariableNamesRule } from './rules/UniqueVariableNamesRule';
-
-// Spec Section: "Values Type Correctness"
-export { ValuesOfCorrectTypeRule } from './rules/ValuesOfCorrectTypeRule';
-
-// Spec Section: "Variables are Input Types"
-export { VariablesAreInputTypesRule } from './rules/VariablesAreInputTypesRule';
-
-// Spec Section: "All Variable Usages Are Allowed"
-export { VariablesInAllowedPositionRule } from './rules/VariablesInAllowedPositionRule';
-
-// SDL-specific validation rules
-export { LoneSchemaDefinitionRule } from './rules/LoneSchemaDefinitionRule';
-export { UniqueOperationTypesRule } from './rules/UniqueOperationTypesRule';
-export { UniqueTypeNamesRule } from './rules/UniqueTypeNamesRule';
-export { UniqueEnumValueNamesRule } from './rules/UniqueEnumValueNamesRule';
-export { UniqueFieldDefinitionNamesRule } from './rules/UniqueFieldDefinitionNamesRule';
-export { UniqueDirectiveNamesRule } from './rules/UniqueDirectiveNamesRule';
-export { PossibleTypeExtensionsRule } from './rules/PossibleTypeExtensionsRule';
diff --git a/node_modules/graphql/validation/index.js b/node_modules/graphql/validation/index.js
deleted file mode 100644
index d88fad0..0000000
--- a/node_modules/graphql/validation/index.js
+++ /dev/null
@@ -1,293 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "validate", {
-  enumerable: true,
-  get: function get() {
-    return _validate.validate;
-  }
-});
-Object.defineProperty(exports, "ValidationContext", {
-  enumerable: true,
-  get: function get() {
-    return _ValidationContext.ValidationContext;
-  }
-});
-Object.defineProperty(exports, "specifiedRules", {
-  enumerable: true,
-  get: function get() {
-    return _specifiedRules.specifiedRules;
-  }
-});
-Object.defineProperty(exports, "ExecutableDefinitionsRule", {
-  enumerable: true,
-  get: function get() {
-    return _ExecutableDefinitionsRule.ExecutableDefinitionsRule;
-  }
-});
-Object.defineProperty(exports, "FieldsOnCorrectTypeRule", {
-  enumerable: true,
-  get: function get() {
-    return _FieldsOnCorrectTypeRule.FieldsOnCorrectTypeRule;
-  }
-});
-Object.defineProperty(exports, "FragmentsOnCompositeTypesRule", {
-  enumerable: true,
-  get: function get() {
-    return _FragmentsOnCompositeTypesRule.FragmentsOnCompositeTypesRule;
-  }
-});
-Object.defineProperty(exports, "KnownArgumentNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _KnownArgumentNamesRule.KnownArgumentNamesRule;
-  }
-});
-Object.defineProperty(exports, "KnownDirectivesRule", {
-  enumerable: true,
-  get: function get() {
-    return _KnownDirectivesRule.KnownDirectivesRule;
-  }
-});
-Object.defineProperty(exports, "KnownFragmentNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _KnownFragmentNamesRule.KnownFragmentNamesRule;
-  }
-});
-Object.defineProperty(exports, "KnownTypeNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _KnownTypeNamesRule.KnownTypeNamesRule;
-  }
-});
-Object.defineProperty(exports, "LoneAnonymousOperationRule", {
-  enumerable: true,
-  get: function get() {
-    return _LoneAnonymousOperationRule.LoneAnonymousOperationRule;
-  }
-});
-Object.defineProperty(exports, "NoFragmentCyclesRule", {
-  enumerable: true,
-  get: function get() {
-    return _NoFragmentCyclesRule.NoFragmentCyclesRule;
-  }
-});
-Object.defineProperty(exports, "NoUndefinedVariablesRule", {
-  enumerable: true,
-  get: function get() {
-    return _NoUndefinedVariablesRule.NoUndefinedVariablesRule;
-  }
-});
-Object.defineProperty(exports, "NoUnusedFragmentsRule", {
-  enumerable: true,
-  get: function get() {
-    return _NoUnusedFragmentsRule.NoUnusedFragmentsRule;
-  }
-});
-Object.defineProperty(exports, "NoUnusedVariablesRule", {
-  enumerable: true,
-  get: function get() {
-    return _NoUnusedVariablesRule.NoUnusedVariablesRule;
-  }
-});
-Object.defineProperty(exports, "OverlappingFieldsCanBeMergedRule", {
-  enumerable: true,
-  get: function get() {
-    return _OverlappingFieldsCanBeMergedRule.OverlappingFieldsCanBeMergedRule;
-  }
-});
-Object.defineProperty(exports, "PossibleFragmentSpreadsRule", {
-  enumerable: true,
-  get: function get() {
-    return _PossibleFragmentSpreadsRule.PossibleFragmentSpreadsRule;
-  }
-});
-Object.defineProperty(exports, "ProvidedRequiredArgumentsRule", {
-  enumerable: true,
-  get: function get() {
-    return _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsRule;
-  }
-});
-Object.defineProperty(exports, "ScalarLeafsRule", {
-  enumerable: true,
-  get: function get() {
-    return _ScalarLeafsRule.ScalarLeafsRule;
-  }
-});
-Object.defineProperty(exports, "SingleFieldSubscriptionsRule", {
-  enumerable: true,
-  get: function get() {
-    return _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule;
-  }
-});
-Object.defineProperty(exports, "UniqueArgumentNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueArgumentNamesRule.UniqueArgumentNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueDirectivesPerLocationRule", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule;
-  }
-});
-Object.defineProperty(exports, "UniqueFragmentNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueFragmentNamesRule.UniqueFragmentNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueInputFieldNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueOperationNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueOperationNamesRule.UniqueOperationNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueVariableNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueVariableNamesRule.UniqueVariableNamesRule;
-  }
-});
-Object.defineProperty(exports, "ValuesOfCorrectTypeRule", {
-  enumerable: true,
-  get: function get() {
-    return _ValuesOfCorrectTypeRule.ValuesOfCorrectTypeRule;
-  }
-});
-Object.defineProperty(exports, "VariablesAreInputTypesRule", {
-  enumerable: true,
-  get: function get() {
-    return _VariablesAreInputTypesRule.VariablesAreInputTypesRule;
-  }
-});
-Object.defineProperty(exports, "VariablesInAllowedPositionRule", {
-  enumerable: true,
-  get: function get() {
-    return _VariablesInAllowedPositionRule.VariablesInAllowedPositionRule;
-  }
-});
-Object.defineProperty(exports, "LoneSchemaDefinitionRule", {
-  enumerable: true,
-  get: function get() {
-    return _LoneSchemaDefinitionRule.LoneSchemaDefinitionRule;
-  }
-});
-Object.defineProperty(exports, "UniqueOperationTypesRule", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueOperationTypesRule.UniqueOperationTypesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueTypeNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueTypeNamesRule.UniqueTypeNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueEnumValueNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueEnumValueNamesRule.UniqueEnumValueNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueFieldDefinitionNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueFieldDefinitionNamesRule.UniqueFieldDefinitionNamesRule;
-  }
-});
-Object.defineProperty(exports, "UniqueDirectiveNamesRule", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueDirectiveNamesRule.UniqueDirectiveNamesRule;
-  }
-});
-Object.defineProperty(exports, "PossibleTypeExtensionsRule", {
-  enumerable: true,
-  get: function get() {
-    return _PossibleTypeExtensionsRule.PossibleTypeExtensionsRule;
-  }
-});
-
-var _validate = require("./validate");
-
-var _ValidationContext = require("./ValidationContext");
-
-var _specifiedRules = require("./specifiedRules");
-
-var _ExecutableDefinitionsRule = require("./rules/ExecutableDefinitionsRule");
-
-var _FieldsOnCorrectTypeRule = require("./rules/FieldsOnCorrectTypeRule");
-
-var _FragmentsOnCompositeTypesRule = require("./rules/FragmentsOnCompositeTypesRule");
-
-var _KnownArgumentNamesRule = require("./rules/KnownArgumentNamesRule");
-
-var _KnownDirectivesRule = require("./rules/KnownDirectivesRule");
-
-var _KnownFragmentNamesRule = require("./rules/KnownFragmentNamesRule");
-
-var _KnownTypeNamesRule = require("./rules/KnownTypeNamesRule");
-
-var _LoneAnonymousOperationRule = require("./rules/LoneAnonymousOperationRule");
-
-var _NoFragmentCyclesRule = require("./rules/NoFragmentCyclesRule");
-
-var _NoUndefinedVariablesRule = require("./rules/NoUndefinedVariablesRule");
-
-var _NoUnusedFragmentsRule = require("./rules/NoUnusedFragmentsRule");
-
-var _NoUnusedVariablesRule = require("./rules/NoUnusedVariablesRule");
-
-var _OverlappingFieldsCanBeMergedRule = require("./rules/OverlappingFieldsCanBeMergedRule");
-
-var _PossibleFragmentSpreadsRule = require("./rules/PossibleFragmentSpreadsRule");
-
-var _ProvidedRequiredArgumentsRule = require("./rules/ProvidedRequiredArgumentsRule");
-
-var _ScalarLeafsRule = require("./rules/ScalarLeafsRule");
-
-var _SingleFieldSubscriptionsRule = require("./rules/SingleFieldSubscriptionsRule");
-
-var _UniqueArgumentNamesRule = require("./rules/UniqueArgumentNamesRule");
-
-var _UniqueDirectivesPerLocationRule = require("./rules/UniqueDirectivesPerLocationRule");
-
-var _UniqueFragmentNamesRule = require("./rules/UniqueFragmentNamesRule");
-
-var _UniqueInputFieldNamesRule = require("./rules/UniqueInputFieldNamesRule");
-
-var _UniqueOperationNamesRule = require("./rules/UniqueOperationNamesRule");
-
-var _UniqueVariableNamesRule = require("./rules/UniqueVariableNamesRule");
-
-var _ValuesOfCorrectTypeRule = require("./rules/ValuesOfCorrectTypeRule");
-
-var _VariablesAreInputTypesRule = require("./rules/VariablesAreInputTypesRule");
-
-var _VariablesInAllowedPositionRule = require("./rules/VariablesInAllowedPositionRule");
-
-var _LoneSchemaDefinitionRule = require("./rules/LoneSchemaDefinitionRule");
-
-var _UniqueOperationTypesRule = require("./rules/UniqueOperationTypesRule");
-
-var _UniqueTypeNamesRule = require("./rules/UniqueTypeNamesRule");
-
-var _UniqueEnumValueNamesRule = require("./rules/UniqueEnumValueNamesRule");
-
-var _UniqueFieldDefinitionNamesRule = require("./rules/UniqueFieldDefinitionNamesRule");
-
-var _UniqueDirectiveNamesRule = require("./rules/UniqueDirectiveNamesRule");
-
-var _PossibleTypeExtensionsRule = require("./rules/PossibleTypeExtensionsRule");
diff --git a/node_modules/graphql/validation/index.js.flow b/node_modules/graphql/validation/index.js.flow
deleted file mode 100644
index 906b31e..0000000
--- a/node_modules/graphql/validation/index.js.flow
+++ /dev/null
@@ -1,96 +0,0 @@
-// @flow strict
-
-export { validate } from './validate';
-
-export { ValidationContext } from './ValidationContext';
-export type { ValidationRule } from './ValidationContext';
-
-// All validation rules in the GraphQL Specification.
-export { specifiedRules } from './specifiedRules';
-
-// Spec Section: "Executable Definitions"
-export { ExecutableDefinitionsRule } from './rules/ExecutableDefinitionsRule';
-
-// Spec Section: "Field Selections on Objects, Interfaces, and Unions Types"
-export { FieldsOnCorrectTypeRule } from './rules/FieldsOnCorrectTypeRule';
-
-// Spec Section: "Fragments on Composite Types"
-export { FragmentsOnCompositeTypesRule } from './rules/FragmentsOnCompositeTypesRule';
-
-// Spec Section: "Argument Names"
-export { KnownArgumentNamesRule } from './rules/KnownArgumentNamesRule';
-
-// Spec Section: "Directives Are Defined"
-export { KnownDirectivesRule } from './rules/KnownDirectivesRule';
-
-// Spec Section: "Fragment spread target defined"
-export { KnownFragmentNamesRule } from './rules/KnownFragmentNamesRule';
-
-// Spec Section: "Fragment Spread Type Existence"
-export { KnownTypeNamesRule } from './rules/KnownTypeNamesRule';
-
-// Spec Section: "Lone Anonymous Operation"
-export { LoneAnonymousOperationRule } from './rules/LoneAnonymousOperationRule';
-
-// Spec Section: "Fragments must not form cycles"
-export { NoFragmentCyclesRule } from './rules/NoFragmentCyclesRule';
-
-// Spec Section: "All Variable Used Defined"
-export { NoUndefinedVariablesRule } from './rules/NoUndefinedVariablesRule';
-
-// Spec Section: "Fragments must be used"
-export { NoUnusedFragmentsRule } from './rules/NoUnusedFragmentsRule';
-
-// Spec Section: "All Variables Used"
-export { NoUnusedVariablesRule } from './rules/NoUnusedVariablesRule';
-
-// Spec Section: "Field Selection Merging"
-export { OverlappingFieldsCanBeMergedRule } from './rules/OverlappingFieldsCanBeMergedRule';
-
-// Spec Section: "Fragment spread is possible"
-export { PossibleFragmentSpreadsRule } from './rules/PossibleFragmentSpreadsRule';
-
-// Spec Section: "Argument Optionality"
-export { ProvidedRequiredArgumentsRule } from './rules/ProvidedRequiredArgumentsRule';
-
-// Spec Section: "Leaf Field Selections"
-export { ScalarLeafsRule } from './rules/ScalarLeafsRule';
-
-// Spec Section: "Subscriptions with Single Root Field"
-export { SingleFieldSubscriptionsRule } from './rules/SingleFieldSubscriptionsRule';
-
-// Spec Section: "Argument Uniqueness"
-export { UniqueArgumentNamesRule } from './rules/UniqueArgumentNamesRule';
-
-// Spec Section: "Directives Are Unique Per Location"
-export { UniqueDirectivesPerLocationRule } from './rules/UniqueDirectivesPerLocationRule';
-
-// Spec Section: "Fragment Name Uniqueness"
-export { UniqueFragmentNamesRule } from './rules/UniqueFragmentNamesRule';
-
-// Spec Section: "Input Object Field Uniqueness"
-export { UniqueInputFieldNamesRule } from './rules/UniqueInputFieldNamesRule';
-
-// Spec Section: "Operation Name Uniqueness"
-export { UniqueOperationNamesRule } from './rules/UniqueOperationNamesRule';
-
-// Spec Section: "Variable Uniqueness"
-export { UniqueVariableNamesRule } from './rules/UniqueVariableNamesRule';
-
-// Spec Section: "Values Type Correctness"
-export { ValuesOfCorrectTypeRule } from './rules/ValuesOfCorrectTypeRule';
-
-// Spec Section: "Variables are Input Types"
-export { VariablesAreInputTypesRule } from './rules/VariablesAreInputTypesRule';
-
-// Spec Section: "All Variable Usages Are Allowed"
-export { VariablesInAllowedPositionRule } from './rules/VariablesInAllowedPositionRule';
-
-// SDL-specific validation rules
-export { LoneSchemaDefinitionRule } from './rules/LoneSchemaDefinitionRule';
-export { UniqueOperationTypesRule } from './rules/UniqueOperationTypesRule';
-export { UniqueTypeNamesRule } from './rules/UniqueTypeNamesRule';
-export { UniqueEnumValueNamesRule } from './rules/UniqueEnumValueNamesRule';
-export { UniqueFieldDefinitionNamesRule } from './rules/UniqueFieldDefinitionNamesRule';
-export { UniqueDirectiveNamesRule } from './rules/UniqueDirectiveNamesRule';
-export { PossibleTypeExtensionsRule } from './rules/PossibleTypeExtensionsRule';
diff --git a/node_modules/graphql/validation/index.mjs b/node_modules/graphql/validation/index.mjs
deleted file mode 100644
index 4957469..0000000
--- a/node_modules/graphql/validation/index.mjs
+++ /dev/null
@@ -1,64 +0,0 @@
-export { validate } from "./validate.mjs";
-export { ValidationContext } from "./ValidationContext.mjs";
-// All validation rules in the GraphQL Specification.
-export { specifiedRules } from "./specifiedRules.mjs"; // Spec Section: "Executable Definitions"
-
-export { ExecutableDefinitionsRule } from "./rules/ExecutableDefinitionsRule.mjs"; // Spec Section: "Field Selections on Objects, Interfaces, and Unions Types"
-
-export { FieldsOnCorrectTypeRule } from "./rules/FieldsOnCorrectTypeRule.mjs"; // Spec Section: "Fragments on Composite Types"
-
-export { FragmentsOnCompositeTypesRule } from "./rules/FragmentsOnCompositeTypesRule.mjs"; // Spec Section: "Argument Names"
-
-export { KnownArgumentNamesRule } from "./rules/KnownArgumentNamesRule.mjs"; // Spec Section: "Directives Are Defined"
-
-export { KnownDirectivesRule } from "./rules/KnownDirectivesRule.mjs"; // Spec Section: "Fragment spread target defined"
-
-export { KnownFragmentNamesRule } from "./rules/KnownFragmentNamesRule.mjs"; // Spec Section: "Fragment Spread Type Existence"
-
-export { KnownTypeNamesRule } from "./rules/KnownTypeNamesRule.mjs"; // Spec Section: "Lone Anonymous Operation"
-
-export { LoneAnonymousOperationRule } from "./rules/LoneAnonymousOperationRule.mjs"; // Spec Section: "Fragments must not form cycles"
-
-export { NoFragmentCyclesRule } from "./rules/NoFragmentCyclesRule.mjs"; // Spec Section: "All Variable Used Defined"
-
-export { NoUndefinedVariablesRule } from "./rules/NoUndefinedVariablesRule.mjs"; // Spec Section: "Fragments must be used"
-
-export { NoUnusedFragmentsRule } from "./rules/NoUnusedFragmentsRule.mjs"; // Spec Section: "All Variables Used"
-
-export { NoUnusedVariablesRule } from "./rules/NoUnusedVariablesRule.mjs"; // Spec Section: "Field Selection Merging"
-
-export { OverlappingFieldsCanBeMergedRule } from "./rules/OverlappingFieldsCanBeMergedRule.mjs"; // Spec Section: "Fragment spread is possible"
-
-export { PossibleFragmentSpreadsRule } from "./rules/PossibleFragmentSpreadsRule.mjs"; // Spec Section: "Argument Optionality"
-
-export { ProvidedRequiredArgumentsRule } from "./rules/ProvidedRequiredArgumentsRule.mjs"; // Spec Section: "Leaf Field Selections"
-
-export { ScalarLeafsRule } from "./rules/ScalarLeafsRule.mjs"; // Spec Section: "Subscriptions with Single Root Field"
-
-export { SingleFieldSubscriptionsRule } from "./rules/SingleFieldSubscriptionsRule.mjs"; // Spec Section: "Argument Uniqueness"
-
-export { UniqueArgumentNamesRule } from "./rules/UniqueArgumentNamesRule.mjs"; // Spec Section: "Directives Are Unique Per Location"
-
-export { UniqueDirectivesPerLocationRule } from "./rules/UniqueDirectivesPerLocationRule.mjs"; // Spec Section: "Fragment Name Uniqueness"
-
-export { UniqueFragmentNamesRule } from "./rules/UniqueFragmentNamesRule.mjs"; // Spec Section: "Input Object Field Uniqueness"
-
-export { UniqueInputFieldNamesRule } from "./rules/UniqueInputFieldNamesRule.mjs"; // Spec Section: "Operation Name Uniqueness"
-
-export { UniqueOperationNamesRule } from "./rules/UniqueOperationNamesRule.mjs"; // Spec Section: "Variable Uniqueness"
-
-export { UniqueVariableNamesRule } from "./rules/UniqueVariableNamesRule.mjs"; // Spec Section: "Values Type Correctness"
-
-export { ValuesOfCorrectTypeRule } from "./rules/ValuesOfCorrectTypeRule.mjs"; // Spec Section: "Variables are Input Types"
-
-export { VariablesAreInputTypesRule } from "./rules/VariablesAreInputTypesRule.mjs"; // Spec Section: "All Variable Usages Are Allowed"
-
-export { VariablesInAllowedPositionRule } from "./rules/VariablesInAllowedPositionRule.mjs"; // SDL-specific validation rules
-
-export { LoneSchemaDefinitionRule } from "./rules/LoneSchemaDefinitionRule.mjs";
-export { UniqueOperationTypesRule } from "./rules/UniqueOperationTypesRule.mjs";
-export { UniqueTypeNamesRule } from "./rules/UniqueTypeNamesRule.mjs";
-export { UniqueEnumValueNamesRule } from "./rules/UniqueEnumValueNamesRule.mjs";
-export { UniqueFieldDefinitionNamesRule } from "./rules/UniqueFieldDefinitionNamesRule.mjs";
-export { UniqueDirectiveNamesRule } from "./rules/UniqueDirectiveNamesRule.mjs";
-export { PossibleTypeExtensionsRule } from "./rules/PossibleTypeExtensionsRule.mjs";
diff --git a/node_modules/graphql/validation/rules/ExecutableDefinitions.d.ts b/node_modules/graphql/validation/rules/ExecutableDefinitions.d.ts
deleted file mode 100644
index 94557ad..0000000
--- a/node_modules/graphql/validation/rules/ExecutableDefinitions.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { ExecutableDefinitionsRule } from 'graphql'
- * or
- *   import { ExecutableDefinitionsRule } from 'graphql/validation'
- */
-export { ExecutableDefinitionsRule as ExecutableDefinitions } from './ExecutableDefinitionsRule';
diff --git a/node_modules/graphql/validation/rules/ExecutableDefinitions.js b/node_modules/graphql/validation/rules/ExecutableDefinitions.js
deleted file mode 100644
index 45dac1d..0000000
--- a/node_modules/graphql/validation/rules/ExecutableDefinitions.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "ExecutableDefinitions", {
-  enumerable: true,
-  get: function get() {
-    return _ExecutableDefinitionsRule.ExecutableDefinitionsRule;
-  }
-});
-
-var _ExecutableDefinitionsRule = require("./ExecutableDefinitionsRule");
diff --git a/node_modules/graphql/validation/rules/ExecutableDefinitions.js.flow b/node_modules/graphql/validation/rules/ExecutableDefinitions.js.flow
deleted file mode 100644
index b9ee751..0000000
--- a/node_modules/graphql/validation/rules/ExecutableDefinitions.js.flow
+++ /dev/null
@@ -1,10 +0,0 @@
-// @flow strict
-
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { ExecutableDefinitionsRule } from 'graphql'
- * or
- *   import { ExecutableDefinitionsRule } from 'graphql/validation'
- */
-export { ExecutableDefinitionsRule as ExecutableDefinitions } from './ExecutableDefinitionsRule';
diff --git a/node_modules/graphql/validation/rules/ExecutableDefinitions.mjs b/node_modules/graphql/validation/rules/ExecutableDefinitions.mjs
deleted file mode 100644
index 9dc914e..0000000
--- a/node_modules/graphql/validation/rules/ExecutableDefinitions.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { ExecutableDefinitionsRule } from 'graphql'
- * or
- *   import { ExecutableDefinitionsRule } from 'graphql/validation'
- */
-export { ExecutableDefinitionsRule as ExecutableDefinitions } from "./ExecutableDefinitionsRule.mjs";
diff --git a/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.d.ts b/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.d.ts
deleted file mode 100644
index 9709256..0000000
--- a/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ASTValidationContext } from '../ValidationContext';
-
-/**
- * Executable definitions
- *
- * A GraphQL document is only valid for execution if all definitions are either
- * operation or fragment definitions.
- */
-export function ExecutableDefinitionsRule(
-  context: ASTValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.js b/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.js
deleted file mode 100644
index de6d29c..0000000
--- a/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.js
+++ /dev/null
@@ -1,35 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.ExecutableDefinitionsRule = ExecutableDefinitionsRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _kinds = require("../../language/kinds");
-
-var _predicates = require("../../language/predicates");
-
-/**
- * Executable definitions
- *
- * A GraphQL document is only valid for execution if all definitions are either
- * operation or fragment definitions.
- */
-function ExecutableDefinitionsRule(context) {
-  return {
-    Document: function Document(node) {
-      for (var _i2 = 0, _node$definitions2 = node.definitions; _i2 < _node$definitions2.length; _i2++) {
-        var definition = _node$definitions2[_i2];
-
-        if (!(0, _predicates.isExecutableDefinitionNode)(definition)) {
-          var defName = definition.kind === _kinds.Kind.SCHEMA_DEFINITION || definition.kind === _kinds.Kind.SCHEMA_EXTENSION ? 'schema' : '"' + definition.name.value + '"';
-          context.reportError(new _GraphQLError.GraphQLError("The ".concat(defName, " definition is not executable."), definition));
-        }
-      }
-
-      return false;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.js.flow b/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.js.flow
deleted file mode 100644
index 4ae128f..0000000
--- a/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.js.flow
+++ /dev/null
@@ -1,40 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { Kind } from '../../language/kinds';
-import { type ASTVisitor } from '../../language/visitor';
-import { isExecutableDefinitionNode } from '../../language/predicates';
-
-import { type ASTValidationContext } from '../ValidationContext';
-
-/**
- * Executable definitions
- *
- * A GraphQL document is only valid for execution if all definitions are either
- * operation or fragment definitions.
- */
-export function ExecutableDefinitionsRule(
-  context: ASTValidationContext,
-): ASTVisitor {
-  return {
-    Document(node) {
-      for (const definition of node.definitions) {
-        if (!isExecutableDefinitionNode(definition)) {
-          const defName =
-            definition.kind === Kind.SCHEMA_DEFINITION ||
-            definition.kind === Kind.SCHEMA_EXTENSION
-              ? 'schema'
-              : '"' + definition.name.value + '"';
-          context.reportError(
-            new GraphQLError(
-              `The ${defName} definition is not executable.`,
-              definition,
-            ),
-          );
-        }
-      }
-      return false;
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs b/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs
deleted file mode 100644
index c47b996..0000000
--- a/node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs
+++ /dev/null
@@ -1,26 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { Kind } from "../../language/kinds.mjs";
-import { isExecutableDefinitionNode } from "../../language/predicates.mjs";
-
-/**
- * Executable definitions
- *
- * A GraphQL document is only valid for execution if all definitions are either
- * operation or fragment definitions.
- */
-export function ExecutableDefinitionsRule(context) {
-  return {
-    Document: function Document(node) {
-      for (var _i2 = 0, _node$definitions2 = node.definitions; _i2 < _node$definitions2.length; _i2++) {
-        var definition = _node$definitions2[_i2];
-
-        if (!isExecutableDefinitionNode(definition)) {
-          var defName = definition.kind === Kind.SCHEMA_DEFINITION || definition.kind === Kind.SCHEMA_EXTENSION ? 'schema' : '"' + definition.name.value + '"';
-          context.reportError(new GraphQLError("The ".concat(defName, " definition is not executable."), definition));
-        }
-      }
-
-      return false;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.d.ts b/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.d.ts
deleted file mode 100644
index 6091c6c..0000000
--- a/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * Fields on correct type
- *
- * A GraphQL document is only valid if all fields selected are defined by the
- * parent type, or are an allowed meta field such as __typename.
- */
-export function FieldsOnCorrectTypeRule(context: ValidationContext): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js b/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js
deleted file mode 100644
index 9a3f8ce..0000000
--- a/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js
+++ /dev/null
@@ -1,130 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.FieldsOnCorrectTypeRule = FieldsOnCorrectTypeRule;
-
-var _arrayFrom = _interopRequireDefault(require("../../polyfills/arrayFrom"));
-
-var _didYouMean = _interopRequireDefault(require("../../jsutils/didYouMean"));
-
-var _suggestionList = _interopRequireDefault(require("../../jsutils/suggestionList"));
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _definition = require("../../type/definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Fields on correct type
- *
- * A GraphQL document is only valid if all fields selected are defined by the
- * parent type, or are an allowed meta field such as __typename.
- */
-function FieldsOnCorrectTypeRule(context) {
-  return {
-    Field: function Field(node) {
-      var type = context.getParentType();
-
-      if (type) {
-        var fieldDef = context.getFieldDef();
-
-        if (!fieldDef) {
-          // This field doesn't exist, lets look for suggestions.
-          var schema = context.getSchema();
-          var fieldName = node.name.value; // First determine if there are any suggested types to condition on.
-
-          var suggestion = (0, _didYouMean.default)('to use an inline fragment on', getSuggestedTypeNames(schema, type, fieldName)); // If there are no suggested types, then perhaps this was a typo?
-
-          if (suggestion === '') {
-            suggestion = (0, _didYouMean.default)(getSuggestedFieldNames(type, fieldName));
-          } // Report an error, including helpful suggestions.
-
-
-          context.reportError(new _GraphQLError.GraphQLError("Cannot query field \"".concat(fieldName, "\" on type \"").concat(type.name, "\".") + suggestion, node));
-        }
-      }
-    }
-  };
-}
-/**
- * Go through all of the implementations of type, as well as the interfaces that
- * they implement. If any of those types include the provided field, suggest them,
- * sorted by how often the type is referenced.
- */
-
-
-function getSuggestedTypeNames(schema, type, fieldName) {
-  if (!(0, _definition.isAbstractType)(type)) {
-    // Must be an Object type, which does not have possible fields.
-    return [];
-  }
-
-  var suggestedTypes = new Set();
-  var usageCount = Object.create(null);
-
-  for (var _i2 = 0, _schema$getPossibleTy2 = schema.getPossibleTypes(type); _i2 < _schema$getPossibleTy2.length; _i2++) {
-    var possibleType = _schema$getPossibleTy2[_i2];
-
-    if (!possibleType.getFields()[fieldName]) {
-      continue;
-    } // This object type defines this field.
-
-
-    suggestedTypes.add(possibleType);
-    usageCount[possibleType.name] = 1;
-
-    for (var _i4 = 0, _possibleType$getInte2 = possibleType.getInterfaces(); _i4 < _possibleType$getInte2.length; _i4++) {
-      var _usageCount$possibleI;
-
-      var possibleInterface = _possibleType$getInte2[_i4];
-
-      if (!possibleInterface.getFields()[fieldName]) {
-        continue;
-      } // This interface type defines this field.
-
-
-      suggestedTypes.add(possibleInterface);
-      usageCount[possibleInterface.name] = ((_usageCount$possibleI = usageCount[possibleInterface.name]) !== null && _usageCount$possibleI !== void 0 ? _usageCount$possibleI : 0) + 1;
-    }
-  }
-
-  return (0, _arrayFrom.default)(suggestedTypes).sort(function (typeA, typeB) {
-    // Suggest both interface and object types based on how common they are.
-    var usageCountDiff = usageCount[typeB.name] - usageCount[typeA.name];
-
-    if (usageCountDiff !== 0) {
-      return usageCountDiff;
-    } // Suggest super types first followed by subtypes
-
-
-    if ((0, _definition.isInterfaceType)(typeA) && schema.isSubType(typeA, typeB)) {
-      return -1;
-    }
-
-    if ((0, _definition.isInterfaceType)(typeB) && schema.isSubType(typeB, typeA)) {
-      return 1;
-    }
-
-    return typeA.name.localeCompare(typeB.name);
-  }).map(function (x) {
-    return x.name;
-  });
-}
-/**
- * For the field name provided, determine if there are any similar field names
- * that may be the result of a typo.
- */
-
-
-function getSuggestedFieldNames(type, fieldName) {
-  if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type)) {
-    var possibleFieldNames = Object.keys(type.getFields());
-    return (0, _suggestionList.default)(fieldName, possibleFieldNames);
-  } // Otherwise, must be a Union type, which does not define fields.
-
-
-  return [];
-}
diff --git a/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js.flow b/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js.flow
deleted file mode 100644
index 0e6d74d..0000000
--- a/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js.flow
+++ /dev/null
@@ -1,144 +0,0 @@
-// @flow strict
-
-import arrayFrom from '../../polyfills/arrayFrom';
-
-import didYouMean from '../../jsutils/didYouMean';
-import suggestionList from '../../jsutils/suggestionList';
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { type FieldNode } from '../../language/ast';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type GraphQLSchema } from '../../type/schema';
-import {
-  type GraphQLOutputType,
-  type GraphQLObjectType,
-  type GraphQLInterfaceType,
-  isObjectType,
-  isInterfaceType,
-  isAbstractType,
-} from '../../type/definition';
-
-import { type ValidationContext } from '../ValidationContext';
-
-/**
- * Fields on correct type
- *
- * A GraphQL document is only valid if all fields selected are defined by the
- * parent type, or are an allowed meta field such as __typename.
- */
-export function FieldsOnCorrectTypeRule(
-  context: ValidationContext,
-): ASTVisitor {
-  return {
-    Field(node: FieldNode) {
-      const type = context.getParentType();
-      if (type) {
-        const fieldDef = context.getFieldDef();
-        if (!fieldDef) {
-          // This field doesn't exist, lets look for suggestions.
-          const schema = context.getSchema();
-          const fieldName = node.name.value;
-
-          // First determine if there are any suggested types to condition on.
-          let suggestion = didYouMean(
-            'to use an inline fragment on',
-            getSuggestedTypeNames(schema, type, fieldName),
-          );
-
-          // If there are no suggested types, then perhaps this was a typo?
-          if (suggestion === '') {
-            suggestion = didYouMean(getSuggestedFieldNames(type, fieldName));
-          }
-
-          // Report an error, including helpful suggestions.
-          context.reportError(
-            new GraphQLError(
-              `Cannot query field "${fieldName}" on type "${type.name}".` +
-                suggestion,
-              node,
-            ),
-          );
-        }
-      }
-    },
-  };
-}
-
-/**
- * Go through all of the implementations of type, as well as the interfaces that
- * they implement. If any of those types include the provided field, suggest them,
- * sorted by how often the type is referenced.
- */
-function getSuggestedTypeNames(
-  schema: GraphQLSchema,
-  type: GraphQLOutputType,
-  fieldName: string,
-): Array<string> {
-  if (!isAbstractType(type)) {
-    // Must be an Object type, which does not have possible fields.
-    return [];
-  }
-
-  const suggestedTypes: Set<
-    GraphQLObjectType | GraphQLInterfaceType,
-  > = new Set();
-  const usageCount = Object.create(null);
-  for (const possibleType of schema.getPossibleTypes(type)) {
-    if (!possibleType.getFields()[fieldName]) {
-      continue;
-    }
-
-    // This object type defines this field.
-    suggestedTypes.add(possibleType);
-    usageCount[possibleType.name] = 1;
-
-    for (const possibleInterface of possibleType.getInterfaces()) {
-      if (!possibleInterface.getFields()[fieldName]) {
-        continue;
-      }
-
-      // This interface type defines this field.
-      suggestedTypes.add(possibleInterface);
-      usageCount[possibleInterface.name] =
-        (usageCount[possibleInterface.name] ?? 0) + 1;
-    }
-  }
-
-  return arrayFrom(suggestedTypes)
-    .sort((typeA, typeB) => {
-      // Suggest both interface and object types based on how common they are.
-      const usageCountDiff = usageCount[typeB.name] - usageCount[typeA.name];
-      if (usageCountDiff !== 0) {
-        return usageCountDiff;
-      }
-
-      // Suggest super types first followed by subtypes
-      if (isInterfaceType(typeA) && schema.isSubType(typeA, typeB)) {
-        return -1;
-      }
-      if (isInterfaceType(typeB) && schema.isSubType(typeB, typeA)) {
-        return 1;
-      }
-
-      return typeA.name.localeCompare(typeB.name);
-    })
-    .map(x => x.name);
-}
-
-/**
- * For the field name provided, determine if there are any similar field names
- * that may be the result of a typo.
- */
-function getSuggestedFieldNames(
-  type: GraphQLOutputType,
-  fieldName: string,
-): Array<string> {
-  if (isObjectType(type) || isInterfaceType(type)) {
-    const possibleFieldNames = Object.keys(type.getFields());
-    return suggestionList(fieldName, possibleFieldNames);
-  }
-  // Otherwise, must be a Union type, which does not define fields.
-  return [];
-}
diff --git a/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.mjs b/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.mjs
deleted file mode 100644
index 7e01058..0000000
--- a/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.mjs
+++ /dev/null
@@ -1,116 +0,0 @@
-import arrayFrom from "../../polyfills/arrayFrom.mjs";
-import didYouMean from "../../jsutils/didYouMean.mjs";
-import suggestionList from "../../jsutils/suggestionList.mjs";
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { isObjectType, isInterfaceType, isAbstractType } from "../../type/definition.mjs";
-
-/**
- * Fields on correct type
- *
- * A GraphQL document is only valid if all fields selected are defined by the
- * parent type, or are an allowed meta field such as __typename.
- */
-export function FieldsOnCorrectTypeRule(context) {
-  return {
-    Field: function Field(node) {
-      var type = context.getParentType();
-
-      if (type) {
-        var fieldDef = context.getFieldDef();
-
-        if (!fieldDef) {
-          // This field doesn't exist, lets look for suggestions.
-          var schema = context.getSchema();
-          var fieldName = node.name.value; // First determine if there are any suggested types to condition on.
-
-          var suggestion = didYouMean('to use an inline fragment on', getSuggestedTypeNames(schema, type, fieldName)); // If there are no suggested types, then perhaps this was a typo?
-
-          if (suggestion === '') {
-            suggestion = didYouMean(getSuggestedFieldNames(type, fieldName));
-          } // Report an error, including helpful suggestions.
-
-
-          context.reportError(new GraphQLError("Cannot query field \"".concat(fieldName, "\" on type \"").concat(type.name, "\".") + suggestion, node));
-        }
-      }
-    }
-  };
-}
-/**
- * Go through all of the implementations of type, as well as the interfaces that
- * they implement. If any of those types include the provided field, suggest them,
- * sorted by how often the type is referenced.
- */
-
-function getSuggestedTypeNames(schema, type, fieldName) {
-  if (!isAbstractType(type)) {
-    // Must be an Object type, which does not have possible fields.
-    return [];
-  }
-
-  var suggestedTypes = new Set();
-  var usageCount = Object.create(null);
-
-  for (var _i2 = 0, _schema$getPossibleTy2 = schema.getPossibleTypes(type); _i2 < _schema$getPossibleTy2.length; _i2++) {
-    var possibleType = _schema$getPossibleTy2[_i2];
-
-    if (!possibleType.getFields()[fieldName]) {
-      continue;
-    } // This object type defines this field.
-
-
-    suggestedTypes.add(possibleType);
-    usageCount[possibleType.name] = 1;
-
-    for (var _i4 = 0, _possibleType$getInte2 = possibleType.getInterfaces(); _i4 < _possibleType$getInte2.length; _i4++) {
-      var _usageCount$possibleI;
-
-      var possibleInterface = _possibleType$getInte2[_i4];
-
-      if (!possibleInterface.getFields()[fieldName]) {
-        continue;
-      } // This interface type defines this field.
-
-
-      suggestedTypes.add(possibleInterface);
-      usageCount[possibleInterface.name] = ((_usageCount$possibleI = usageCount[possibleInterface.name]) !== null && _usageCount$possibleI !== void 0 ? _usageCount$possibleI : 0) + 1;
-    }
-  }
-
-  return arrayFrom(suggestedTypes).sort(function (typeA, typeB) {
-    // Suggest both interface and object types based on how common they are.
-    var usageCountDiff = usageCount[typeB.name] - usageCount[typeA.name];
-
-    if (usageCountDiff !== 0) {
-      return usageCountDiff;
-    } // Suggest super types first followed by subtypes
-
-
-    if (isInterfaceType(typeA) && schema.isSubType(typeA, typeB)) {
-      return -1;
-    }
-
-    if (isInterfaceType(typeB) && schema.isSubType(typeB, typeA)) {
-      return 1;
-    }
-
-    return typeA.name.localeCompare(typeB.name);
-  }).map(function (x) {
-    return x.name;
-  });
-}
-/**
- * For the field name provided, determine if there are any similar field names
- * that may be the result of a typo.
- */
-
-
-function getSuggestedFieldNames(type, fieldName) {
-  if (isObjectType(type) || isInterfaceType(type)) {
-    var possibleFieldNames = Object.keys(type.getFields());
-    return suggestionList(fieldName, possibleFieldNames);
-  } // Otherwise, must be a Union type, which does not define fields.
-
-
-  return [];
-}
diff --git a/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.d.ts b/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.d.ts
deleted file mode 100644
index 70b9b14..0000000
--- a/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * Fragments on composite type
- *
- * Fragments use a type condition to determine if they apply, since fragments
- * can only be spread into a composite type (object, interface, or union), the
- * type condition must also be a composite type.
- */
-export function FragmentsOnCompositeTypesRule(
-  context: ValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.js b/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.js
deleted file mode 100644
index 9d6622f..0000000
--- a/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.js
+++ /dev/null
@@ -1,46 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.FragmentsOnCompositeTypesRule = FragmentsOnCompositeTypesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _printer = require("../../language/printer");
-
-var _definition = require("../../type/definition");
-
-var _typeFromAST = require("../../utilities/typeFromAST");
-
-/**
- * Fragments on composite type
- *
- * Fragments use a type condition to determine if they apply, since fragments
- * can only be spread into a composite type (object, interface, or union), the
- * type condition must also be a composite type.
- */
-function FragmentsOnCompositeTypesRule(context) {
-  return {
-    InlineFragment: function InlineFragment(node) {
-      var typeCondition = node.typeCondition;
-
-      if (typeCondition) {
-        var type = (0, _typeFromAST.typeFromAST)(context.getSchema(), typeCondition);
-
-        if (type && !(0, _definition.isCompositeType)(type)) {
-          var typeStr = (0, _printer.print)(typeCondition);
-          context.reportError(new _GraphQLError.GraphQLError("Fragment cannot condition on non composite type \"".concat(typeStr, "\"."), typeCondition));
-        }
-      }
-    },
-    FragmentDefinition: function FragmentDefinition(node) {
-      var type = (0, _typeFromAST.typeFromAST)(context.getSchema(), node.typeCondition);
-
-      if (type && !(0, _definition.isCompositeType)(type)) {
-        var typeStr = (0, _printer.print)(node.typeCondition);
-        context.reportError(new _GraphQLError.GraphQLError("Fragment \"".concat(node.name.value, "\" cannot condition on non composite type \"").concat(typeStr, "\"."), node.typeCondition));
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.js.flow b/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.js.flow
deleted file mode 100644
index 4eee719..0000000
--- a/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.js.flow
+++ /dev/null
@@ -1,53 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { print } from '../../language/printer';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { isCompositeType } from '../../type/definition';
-
-import { typeFromAST } from '../../utilities/typeFromAST';
-
-import { type ValidationContext } from '../ValidationContext';
-
-/**
- * Fragments on composite type
- *
- * Fragments use a type condition to determine if they apply, since fragments
- * can only be spread into a composite type (object, interface, or union), the
- * type condition must also be a composite type.
- */
-export function FragmentsOnCompositeTypesRule(
-  context: ValidationContext,
-): ASTVisitor {
-  return {
-    InlineFragment(node) {
-      const typeCondition = node.typeCondition;
-      if (typeCondition) {
-        const type = typeFromAST(context.getSchema(), typeCondition);
-        if (type && !isCompositeType(type)) {
-          const typeStr = print(typeCondition);
-          context.reportError(
-            new GraphQLError(
-              `Fragment cannot condition on non composite type "${typeStr}".`,
-              typeCondition,
-            ),
-          );
-        }
-      }
-    },
-    FragmentDefinition(node) {
-      const type = typeFromAST(context.getSchema(), node.typeCondition);
-      if (type && !isCompositeType(type)) {
-        const typeStr = print(node.typeCondition);
-        context.reportError(
-          new GraphQLError(
-            `Fragment "${node.name.value}" cannot condition on non composite type "${typeStr}".`,
-            node.typeCondition,
-          ),
-        );
-      }
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.mjs b/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.mjs
deleted file mode 100644
index 44aaac6..0000000
--- a/node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.mjs
+++ /dev/null
@@ -1,36 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { print } from "../../language/printer.mjs";
-import { isCompositeType } from "../../type/definition.mjs";
-import { typeFromAST } from "../../utilities/typeFromAST.mjs";
-
-/**
- * Fragments on composite type
- *
- * Fragments use a type condition to determine if they apply, since fragments
- * can only be spread into a composite type (object, interface, or union), the
- * type condition must also be a composite type.
- */
-export function FragmentsOnCompositeTypesRule(context) {
-  return {
-    InlineFragment: function InlineFragment(node) {
-      var typeCondition = node.typeCondition;
-
-      if (typeCondition) {
-        var type = typeFromAST(context.getSchema(), typeCondition);
-
-        if (type && !isCompositeType(type)) {
-          var typeStr = print(typeCondition);
-          context.reportError(new GraphQLError("Fragment cannot condition on non composite type \"".concat(typeStr, "\"."), typeCondition));
-        }
-      }
-    },
-    FragmentDefinition: function FragmentDefinition(node) {
-      var type = typeFromAST(context.getSchema(), node.typeCondition);
-
-      if (type && !isCompositeType(type)) {
-        var typeStr = print(node.typeCondition);
-        context.reportError(new GraphQLError("Fragment \"".concat(node.name.value, "\" cannot condition on non composite type \"").concat(typeStr, "\"."), node.typeCondition));
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/KnownArgumentNamesRule.d.ts b/node_modules/graphql/validation/rules/KnownArgumentNamesRule.d.ts
deleted file mode 100644
index 8c0f828..0000000
--- a/node_modules/graphql/validation/rules/KnownArgumentNamesRule.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { ValidationContext, SDLValidationContext } from '../ValidationContext';
-import { ASTVisitor } from '../../language/visitor';
-
-/**
- * Known argument names
- *
- * A GraphQL field is only valid if all supplied arguments are defined by
- * that field.
- */
-export function KnownArgumentNamesRule(context: ValidationContext): ASTVisitor;
-
-/**
- * @internal
- */
-export function KnownArgumentNamesOnDirectivesRule(
-  context: ValidationContext | SDLValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js b/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js
deleted file mode 100644
index ce0f59f..0000000
--- a/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js
+++ /dev/null
@@ -1,104 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.KnownArgumentNamesRule = KnownArgumentNamesRule;
-exports.KnownArgumentNamesOnDirectivesRule = KnownArgumentNamesOnDirectivesRule;
-
-var _didYouMean = _interopRequireDefault(require("../../jsutils/didYouMean"));
-
-var _suggestionList = _interopRequireDefault(require("../../jsutils/suggestionList"));
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _kinds = require("../../language/kinds");
-
-var _directives = require("../../type/directives");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-/**
- * Known argument names
- *
- * A GraphQL field is only valid if all supplied arguments are defined by
- * that field.
- */
-function KnownArgumentNamesRule(context) {
-  return _objectSpread({}, KnownArgumentNamesOnDirectivesRule(context), {
-    Argument: function Argument(argNode) {
-      var argDef = context.getArgument();
-      var fieldDef = context.getFieldDef();
-      var parentType = context.getParentType();
-
-      if (!argDef && fieldDef && parentType) {
-        var argName = argNode.name.value;
-        var knownArgsNames = fieldDef.args.map(function (arg) {
-          return arg.name;
-        });
-        var suggestions = (0, _suggestionList.default)(argName, knownArgsNames);
-        context.reportError(new _GraphQLError.GraphQLError("Unknown argument \"".concat(argName, "\" on field \"").concat(parentType.name, ".").concat(fieldDef.name, "\".") + (0, _didYouMean.default)(suggestions), argNode));
-      }
-    }
-  });
-}
-/**
- * @internal
- */
-
-
-function KnownArgumentNamesOnDirectivesRule(context) {
-  var directiveArgs = Object.create(null);
-  var schema = context.getSchema();
-  var definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives;
-
-  for (var _i2 = 0; _i2 < definedDirectives.length; _i2++) {
-    var directive = definedDirectives[_i2];
-    directiveArgs[directive.name] = directive.args.map(function (arg) {
-      return arg.name;
-    });
-  }
-
-  var astDefinitions = context.getDocument().definitions;
-
-  for (var _i4 = 0; _i4 < astDefinitions.length; _i4++) {
-    var def = astDefinitions[_i4];
-
-    if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) {
-      var _def$arguments;
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var argsNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : [];
-      directiveArgs[def.name.value] = argsNodes.map(function (arg) {
-        return arg.name.value;
-      });
-    }
-  }
-
-  return {
-    Directive: function Directive(directiveNode) {
-      var directiveName = directiveNode.name.value;
-      var knownArgs = directiveArgs[directiveName];
-
-      if (directiveNode.arguments && knownArgs) {
-        for (var _i6 = 0, _directiveNode$argume2 = directiveNode.arguments; _i6 < _directiveNode$argume2.length; _i6++) {
-          var argNode = _directiveNode$argume2[_i6];
-          var argName = argNode.name.value;
-
-          if (knownArgs.indexOf(argName) === -1) {
-            var suggestions = (0, _suggestionList.default)(argName, knownArgs);
-            context.reportError(new _GraphQLError.GraphQLError("Unknown argument \"".concat(argName, "\" on directive \"@").concat(directiveName, "\".") + (0, _didYouMean.default)(suggestions), argNode));
-          }
-        }
-      }
-
-      return false;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js.flow b/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js.flow
deleted file mode 100644
index fe4b4bc..0000000
--- a/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js.flow
+++ /dev/null
@@ -1,98 +0,0 @@
-// @flow strict
-
-import didYouMean from '../../jsutils/didYouMean';
-import suggestionList from '../../jsutils/suggestionList';
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { Kind } from '../../language/kinds';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { specifiedDirectives } from '../../type/directives';
-
-import {
-  type ValidationContext,
-  type SDLValidationContext,
-} from '../ValidationContext';
-
-/**
- * Known argument names
- *
- * A GraphQL field is only valid if all supplied arguments are defined by
- * that field.
- */
-export function KnownArgumentNamesRule(context: ValidationContext): ASTVisitor {
-  return {
-    ...KnownArgumentNamesOnDirectivesRule(context),
-    Argument(argNode) {
-      const argDef = context.getArgument();
-      const fieldDef = context.getFieldDef();
-      const parentType = context.getParentType();
-
-      if (!argDef && fieldDef && parentType) {
-        const argName = argNode.name.value;
-        const knownArgsNames = fieldDef.args.map(arg => arg.name);
-        const suggestions = suggestionList(argName, knownArgsNames);
-        context.reportError(
-          new GraphQLError(
-            `Unknown argument "${argName}" on field "${parentType.name}.${fieldDef.name}".` +
-              didYouMean(suggestions),
-            argNode,
-          ),
-        );
-      }
-    },
-  };
-}
-
-/**
- * @internal
- */
-export function KnownArgumentNamesOnDirectivesRule(
-  context: ValidationContext | SDLValidationContext,
-): ASTVisitor {
-  const directiveArgs = Object.create(null);
-
-  const schema = context.getSchema();
-  const definedDirectives = schema
-    ? schema.getDirectives()
-    : specifiedDirectives;
-  for (const directive of definedDirectives) {
-    directiveArgs[directive.name] = directive.args.map(arg => arg.name);
-  }
-
-  const astDefinitions = context.getDocument().definitions;
-  for (const def of astDefinitions) {
-    if (def.kind === Kind.DIRECTIVE_DEFINITION) {
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      const argsNodes = def.arguments ?? [];
-
-      directiveArgs[def.name.value] = argsNodes.map(arg => arg.name.value);
-    }
-  }
-
-  return {
-    Directive(directiveNode) {
-      const directiveName = directiveNode.name.value;
-      const knownArgs = directiveArgs[directiveName];
-
-      if (directiveNode.arguments && knownArgs) {
-        for (const argNode of directiveNode.arguments) {
-          const argName = argNode.name.value;
-          if (knownArgs.indexOf(argName) === -1) {
-            const suggestions = suggestionList(argName, knownArgs);
-            context.reportError(
-              new GraphQLError(
-                `Unknown argument "${argName}" on directive "@${directiveName}".` +
-                  didYouMean(suggestions),
-                argNode,
-              ),
-            );
-          }
-        }
-      }
-
-      return false;
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/KnownArgumentNamesRule.mjs b/node_modules/graphql/validation/rules/KnownArgumentNamesRule.mjs
deleted file mode 100644
index fa76800..0000000
--- a/node_modules/graphql/validation/rules/KnownArgumentNamesRule.mjs
+++ /dev/null
@@ -1,89 +0,0 @@
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-import didYouMean from "../../jsutils/didYouMean.mjs";
-import suggestionList from "../../jsutils/suggestionList.mjs";
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { Kind } from "../../language/kinds.mjs";
-import { specifiedDirectives } from "../../type/directives.mjs";
-
-/**
- * Known argument names
- *
- * A GraphQL field is only valid if all supplied arguments are defined by
- * that field.
- */
-export function KnownArgumentNamesRule(context) {
-  return _objectSpread({}, KnownArgumentNamesOnDirectivesRule(context), {
-    Argument: function Argument(argNode) {
-      var argDef = context.getArgument();
-      var fieldDef = context.getFieldDef();
-      var parentType = context.getParentType();
-
-      if (!argDef && fieldDef && parentType) {
-        var argName = argNode.name.value;
-        var knownArgsNames = fieldDef.args.map(function (arg) {
-          return arg.name;
-        });
-        var suggestions = suggestionList(argName, knownArgsNames);
-        context.reportError(new GraphQLError("Unknown argument \"".concat(argName, "\" on field \"").concat(parentType.name, ".").concat(fieldDef.name, "\".") + didYouMean(suggestions), argNode));
-      }
-    }
-  });
-}
-/**
- * @internal
- */
-
-export function KnownArgumentNamesOnDirectivesRule(context) {
-  var directiveArgs = Object.create(null);
-  var schema = context.getSchema();
-  var definedDirectives = schema ? schema.getDirectives() : specifiedDirectives;
-
-  for (var _i2 = 0; _i2 < definedDirectives.length; _i2++) {
-    var directive = definedDirectives[_i2];
-    directiveArgs[directive.name] = directive.args.map(function (arg) {
-      return arg.name;
-    });
-  }
-
-  var astDefinitions = context.getDocument().definitions;
-
-  for (var _i4 = 0; _i4 < astDefinitions.length; _i4++) {
-    var def = astDefinitions[_i4];
-
-    if (def.kind === Kind.DIRECTIVE_DEFINITION) {
-      var _def$arguments;
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var argsNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : [];
-      directiveArgs[def.name.value] = argsNodes.map(function (arg) {
-        return arg.name.value;
-      });
-    }
-  }
-
-  return {
-    Directive: function Directive(directiveNode) {
-      var directiveName = directiveNode.name.value;
-      var knownArgs = directiveArgs[directiveName];
-
-      if (directiveNode.arguments && knownArgs) {
-        for (var _i6 = 0, _directiveNode$argume2 = directiveNode.arguments; _i6 < _directiveNode$argume2.length; _i6++) {
-          var argNode = _directiveNode$argume2[_i6];
-          var argName = argNode.name.value;
-
-          if (knownArgs.indexOf(argName) === -1) {
-            var suggestions = suggestionList(argName, knownArgs);
-            context.reportError(new GraphQLError("Unknown argument \"".concat(argName, "\" on directive \"@").concat(directiveName, "\".") + didYouMean(suggestions), argNode));
-          }
-        }
-      }
-
-      return false;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/KnownDirectivesRule.d.ts b/node_modules/graphql/validation/rules/KnownDirectivesRule.d.ts
deleted file mode 100644
index dcb6af6..0000000
--- a/node_modules/graphql/validation/rules/KnownDirectivesRule.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext, SDLValidationContext } from '../ValidationContext';
-
-/**
- * Known directives
- *
- * A GraphQL document is only valid if all `@directives` are known by the
- * schema and legally positioned.
- */
-export function KnownDirectivesRule(
-  context: ValidationContext | SDLValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/KnownDirectivesRule.js b/node_modules/graphql/validation/rules/KnownDirectivesRule.js
deleted file mode 100644
index 3222790..0000000
--- a/node_modules/graphql/validation/rules/KnownDirectivesRule.js
+++ /dev/null
@@ -1,151 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.KnownDirectivesRule = KnownDirectivesRule;
-
-var _inspect = _interopRequireDefault(require("../../jsutils/inspect"));
-
-var _invariant = _interopRequireDefault(require("../../jsutils/invariant"));
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _kinds = require("../../language/kinds");
-
-var _directiveLocation = require("../../language/directiveLocation");
-
-var _directives = require("../../type/directives");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Known directives
- *
- * A GraphQL document is only valid if all `@directives` are known by the
- * schema and legally positioned.
- */
-function KnownDirectivesRule(context) {
-  var locationsMap = Object.create(null);
-  var schema = context.getSchema();
-  var definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives;
-
-  for (var _i2 = 0; _i2 < definedDirectives.length; _i2++) {
-    var directive = definedDirectives[_i2];
-    locationsMap[directive.name] = directive.locations;
-  }
-
-  var astDefinitions = context.getDocument().definitions;
-
-  for (var _i4 = 0; _i4 < astDefinitions.length; _i4++) {
-    var def = astDefinitions[_i4];
-
-    if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) {
-      locationsMap[def.name.value] = def.locations.map(function (name) {
-        return name.value;
-      });
-    }
-  }
-
-  return {
-    Directive: function Directive(node, _key, _parent, _path, ancestors) {
-      var name = node.name.value;
-      var locations = locationsMap[name];
-
-      if (!locations) {
-        context.reportError(new _GraphQLError.GraphQLError("Unknown directive \"@".concat(name, "\"."), node));
-        return;
-      }
-
-      var candidateLocation = getDirectiveLocationForASTPath(ancestors);
-
-      if (candidateLocation && locations.indexOf(candidateLocation) === -1) {
-        context.reportError(new _GraphQLError.GraphQLError("Directive \"@".concat(name, "\" may not be used on ").concat(candidateLocation, "."), node));
-      }
-    }
-  };
-}
-
-function getDirectiveLocationForASTPath(ancestors) {
-  var appliedTo = ancestors[ancestors.length - 1];
-
-  /* istanbul ignore next */
-  !Array.isArray(appliedTo) || (0, _invariant.default)(0);
-
-  switch (appliedTo.kind) {
-    case _kinds.Kind.OPERATION_DEFINITION:
-      return getDirectiveLocationForOperation(appliedTo.operation);
-
-    case _kinds.Kind.FIELD:
-      return _directiveLocation.DirectiveLocation.FIELD;
-
-    case _kinds.Kind.FRAGMENT_SPREAD:
-      return _directiveLocation.DirectiveLocation.FRAGMENT_SPREAD;
-
-    case _kinds.Kind.INLINE_FRAGMENT:
-      return _directiveLocation.DirectiveLocation.INLINE_FRAGMENT;
-
-    case _kinds.Kind.FRAGMENT_DEFINITION:
-      return _directiveLocation.DirectiveLocation.FRAGMENT_DEFINITION;
-
-    case _kinds.Kind.VARIABLE_DEFINITION:
-      return _directiveLocation.DirectiveLocation.VARIABLE_DEFINITION;
-
-    case _kinds.Kind.SCHEMA_DEFINITION:
-    case _kinds.Kind.SCHEMA_EXTENSION:
-      return _directiveLocation.DirectiveLocation.SCHEMA;
-
-    case _kinds.Kind.SCALAR_TYPE_DEFINITION:
-    case _kinds.Kind.SCALAR_TYPE_EXTENSION:
-      return _directiveLocation.DirectiveLocation.SCALAR;
-
-    case _kinds.Kind.OBJECT_TYPE_DEFINITION:
-    case _kinds.Kind.OBJECT_TYPE_EXTENSION:
-      return _directiveLocation.DirectiveLocation.OBJECT;
-
-    case _kinds.Kind.FIELD_DEFINITION:
-      return _directiveLocation.DirectiveLocation.FIELD_DEFINITION;
-
-    case _kinds.Kind.INTERFACE_TYPE_DEFINITION:
-    case _kinds.Kind.INTERFACE_TYPE_EXTENSION:
-      return _directiveLocation.DirectiveLocation.INTERFACE;
-
-    case _kinds.Kind.UNION_TYPE_DEFINITION:
-    case _kinds.Kind.UNION_TYPE_EXTENSION:
-      return _directiveLocation.DirectiveLocation.UNION;
-
-    case _kinds.Kind.ENUM_TYPE_DEFINITION:
-    case _kinds.Kind.ENUM_TYPE_EXTENSION:
-      return _directiveLocation.DirectiveLocation.ENUM;
-
-    case _kinds.Kind.ENUM_VALUE_DEFINITION:
-      return _directiveLocation.DirectiveLocation.ENUM_VALUE;
-
-    case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION:
-    case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION:
-      return _directiveLocation.DirectiveLocation.INPUT_OBJECT;
-
-    case _kinds.Kind.INPUT_VALUE_DEFINITION:
-      {
-        var parentNode = ancestors[ancestors.length - 3];
-        return parentNode.kind === _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION ? _directiveLocation.DirectiveLocation.INPUT_FIELD_DEFINITION : _directiveLocation.DirectiveLocation.ARGUMENT_DEFINITION;
-      }
-  }
-}
-
-function getDirectiveLocationForOperation(operation) {
-  switch (operation) {
-    case 'query':
-      return _directiveLocation.DirectiveLocation.QUERY;
-
-    case 'mutation':
-      return _directiveLocation.DirectiveLocation.MUTATION;
-
-    case 'subscription':
-      return _directiveLocation.DirectiveLocation.SUBSCRIPTION;
-  } // Not reachable. All possible types have been considered.
-
-
-  /* istanbul ignore next */
-  (0, _invariant.default)(false, 'Unexpected operation: ' + (0, _inspect.default)(operation));
-}
diff --git a/node_modules/graphql/validation/rules/KnownDirectivesRule.js.flow b/node_modules/graphql/validation/rules/KnownDirectivesRule.js.flow
deleted file mode 100644
index fc8dee2..0000000
--- a/node_modules/graphql/validation/rules/KnownDirectivesRule.js.flow
+++ /dev/null
@@ -1,139 +0,0 @@
-// @flow strict
-
-import inspect from '../../jsutils/inspect';
-import invariant from '../../jsutils/invariant';
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { Kind } from '../../language/kinds';
-import { type ASTVisitor } from '../../language/visitor';
-import { type OperationTypeNode } from '../../language/ast';
-import {
-  type DirectiveLocationEnum,
-  DirectiveLocation,
-} from '../../language/directiveLocation';
-
-import { specifiedDirectives } from '../../type/directives';
-
-import {
-  type ValidationContext,
-  type SDLValidationContext,
-} from '../ValidationContext';
-
-/**
- * Known directives
- *
- * A GraphQL document is only valid if all `@directives` are known by the
- * schema and legally positioned.
- */
-export function KnownDirectivesRule(
-  context: ValidationContext | SDLValidationContext,
-): ASTVisitor {
-  const locationsMap = Object.create(null);
-
-  const schema = context.getSchema();
-  const definedDirectives = schema
-    ? schema.getDirectives()
-    : specifiedDirectives;
-  for (const directive of definedDirectives) {
-    locationsMap[directive.name] = directive.locations;
-  }
-
-  const astDefinitions = context.getDocument().definitions;
-  for (const def of astDefinitions) {
-    if (def.kind === Kind.DIRECTIVE_DEFINITION) {
-      locationsMap[def.name.value] = def.locations.map(name => name.value);
-    }
-  }
-
-  return {
-    Directive(node, _key, _parent, _path, ancestors) {
-      const name = node.name.value;
-      const locations = locationsMap[name];
-
-      if (!locations) {
-        context.reportError(
-          new GraphQLError(`Unknown directive "@${name}".`, node),
-        );
-        return;
-      }
-
-      const candidateLocation = getDirectiveLocationForASTPath(ancestors);
-      if (candidateLocation && locations.indexOf(candidateLocation) === -1) {
-        context.reportError(
-          new GraphQLError(
-            `Directive "@${name}" may not be used on ${candidateLocation}.`,
-            node,
-          ),
-        );
-      }
-    },
-  };
-}
-
-function getDirectiveLocationForASTPath(ancestors) {
-  const appliedTo = ancestors[ancestors.length - 1];
-  invariant(!Array.isArray(appliedTo));
-
-  switch (appliedTo.kind) {
-    case Kind.OPERATION_DEFINITION:
-      return getDirectiveLocationForOperation(appliedTo.operation);
-    case Kind.FIELD:
-      return DirectiveLocation.FIELD;
-    case Kind.FRAGMENT_SPREAD:
-      return DirectiveLocation.FRAGMENT_SPREAD;
-    case Kind.INLINE_FRAGMENT:
-      return DirectiveLocation.INLINE_FRAGMENT;
-    case Kind.FRAGMENT_DEFINITION:
-      return DirectiveLocation.FRAGMENT_DEFINITION;
-    case Kind.VARIABLE_DEFINITION:
-      return DirectiveLocation.VARIABLE_DEFINITION;
-    case Kind.SCHEMA_DEFINITION:
-    case Kind.SCHEMA_EXTENSION:
-      return DirectiveLocation.SCHEMA;
-    case Kind.SCALAR_TYPE_DEFINITION:
-    case Kind.SCALAR_TYPE_EXTENSION:
-      return DirectiveLocation.SCALAR;
-    case Kind.OBJECT_TYPE_DEFINITION:
-    case Kind.OBJECT_TYPE_EXTENSION:
-      return DirectiveLocation.OBJECT;
-    case Kind.FIELD_DEFINITION:
-      return DirectiveLocation.FIELD_DEFINITION;
-    case Kind.INTERFACE_TYPE_DEFINITION:
-    case Kind.INTERFACE_TYPE_EXTENSION:
-      return DirectiveLocation.INTERFACE;
-    case Kind.UNION_TYPE_DEFINITION:
-    case Kind.UNION_TYPE_EXTENSION:
-      return DirectiveLocation.UNION;
-    case Kind.ENUM_TYPE_DEFINITION:
-    case Kind.ENUM_TYPE_EXTENSION:
-      return DirectiveLocation.ENUM;
-    case Kind.ENUM_VALUE_DEFINITION:
-      return DirectiveLocation.ENUM_VALUE;
-    case Kind.INPUT_OBJECT_TYPE_DEFINITION:
-    case Kind.INPUT_OBJECT_TYPE_EXTENSION:
-      return DirectiveLocation.INPUT_OBJECT;
-    case Kind.INPUT_VALUE_DEFINITION: {
-      const parentNode = ancestors[ancestors.length - 3];
-      return parentNode.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION
-        ? DirectiveLocation.INPUT_FIELD_DEFINITION
-        : DirectiveLocation.ARGUMENT_DEFINITION;
-    }
-  }
-}
-
-function getDirectiveLocationForOperation(
-  operation: OperationTypeNode,
-): DirectiveLocationEnum {
-  switch (operation) {
-    case 'query':
-      return DirectiveLocation.QUERY;
-    case 'mutation':
-      return DirectiveLocation.MUTATION;
-    case 'subscription':
-      return DirectiveLocation.SUBSCRIPTION;
-  }
-
-  // Not reachable. All possible types have been considered.
-  invariant(false, 'Unexpected operation: ' + inspect((operation: empty)));
-}
diff --git a/node_modules/graphql/validation/rules/KnownDirectivesRule.mjs b/node_modules/graphql/validation/rules/KnownDirectivesRule.mjs
deleted file mode 100644
index a4709bd..0000000
--- a/node_modules/graphql/validation/rules/KnownDirectivesRule.mjs
+++ /dev/null
@@ -1,137 +0,0 @@
-import inspect from "../../jsutils/inspect.mjs";
-import invariant from "../../jsutils/invariant.mjs";
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { Kind } from "../../language/kinds.mjs";
-import { DirectiveLocation } from "../../language/directiveLocation.mjs";
-import { specifiedDirectives } from "../../type/directives.mjs";
-
-/**
- * Known directives
- *
- * A GraphQL document is only valid if all `@directives` are known by the
- * schema and legally positioned.
- */
-export function KnownDirectivesRule(context) {
-  var locationsMap = Object.create(null);
-  var schema = context.getSchema();
-  var definedDirectives = schema ? schema.getDirectives() : specifiedDirectives;
-
-  for (var _i2 = 0; _i2 < definedDirectives.length; _i2++) {
-    var directive = definedDirectives[_i2];
-    locationsMap[directive.name] = directive.locations;
-  }
-
-  var astDefinitions = context.getDocument().definitions;
-
-  for (var _i4 = 0; _i4 < astDefinitions.length; _i4++) {
-    var def = astDefinitions[_i4];
-
-    if (def.kind === Kind.DIRECTIVE_DEFINITION) {
-      locationsMap[def.name.value] = def.locations.map(function (name) {
-        return name.value;
-      });
-    }
-  }
-
-  return {
-    Directive: function Directive(node, _key, _parent, _path, ancestors) {
-      var name = node.name.value;
-      var locations = locationsMap[name];
-
-      if (!locations) {
-        context.reportError(new GraphQLError("Unknown directive \"@".concat(name, "\"."), node));
-        return;
-      }
-
-      var candidateLocation = getDirectiveLocationForASTPath(ancestors);
-
-      if (candidateLocation && locations.indexOf(candidateLocation) === -1) {
-        context.reportError(new GraphQLError("Directive \"@".concat(name, "\" may not be used on ").concat(candidateLocation, "."), node));
-      }
-    }
-  };
-}
-
-function getDirectiveLocationForASTPath(ancestors) {
-  var appliedTo = ancestors[ancestors.length - 1];
-
-  /* istanbul ignore next */
-  !Array.isArray(appliedTo) || invariant(0);
-
-  switch (appliedTo.kind) {
-    case Kind.OPERATION_DEFINITION:
-      return getDirectiveLocationForOperation(appliedTo.operation);
-
-    case Kind.FIELD:
-      return DirectiveLocation.FIELD;
-
-    case Kind.FRAGMENT_SPREAD:
-      return DirectiveLocation.FRAGMENT_SPREAD;
-
-    case Kind.INLINE_FRAGMENT:
-      return DirectiveLocation.INLINE_FRAGMENT;
-
-    case Kind.FRAGMENT_DEFINITION:
-      return DirectiveLocation.FRAGMENT_DEFINITION;
-
-    case Kind.VARIABLE_DEFINITION:
-      return DirectiveLocation.VARIABLE_DEFINITION;
-
-    case Kind.SCHEMA_DEFINITION:
-    case Kind.SCHEMA_EXTENSION:
-      return DirectiveLocation.SCHEMA;
-
-    case Kind.SCALAR_TYPE_DEFINITION:
-    case Kind.SCALAR_TYPE_EXTENSION:
-      return DirectiveLocation.SCALAR;
-
-    case Kind.OBJECT_TYPE_DEFINITION:
-    case Kind.OBJECT_TYPE_EXTENSION:
-      return DirectiveLocation.OBJECT;
-
-    case Kind.FIELD_DEFINITION:
-      return DirectiveLocation.FIELD_DEFINITION;
-
-    case Kind.INTERFACE_TYPE_DEFINITION:
-    case Kind.INTERFACE_TYPE_EXTENSION:
-      return DirectiveLocation.INTERFACE;
-
-    case Kind.UNION_TYPE_DEFINITION:
-    case Kind.UNION_TYPE_EXTENSION:
-      return DirectiveLocation.UNION;
-
-    case Kind.ENUM_TYPE_DEFINITION:
-    case Kind.ENUM_TYPE_EXTENSION:
-      return DirectiveLocation.ENUM;
-
-    case Kind.ENUM_VALUE_DEFINITION:
-      return DirectiveLocation.ENUM_VALUE;
-
-    case Kind.INPUT_OBJECT_TYPE_DEFINITION:
-    case Kind.INPUT_OBJECT_TYPE_EXTENSION:
-      return DirectiveLocation.INPUT_OBJECT;
-
-    case Kind.INPUT_VALUE_DEFINITION:
-      {
-        var parentNode = ancestors[ancestors.length - 3];
-        return parentNode.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ? DirectiveLocation.INPUT_FIELD_DEFINITION : DirectiveLocation.ARGUMENT_DEFINITION;
-      }
-  }
-}
-
-function getDirectiveLocationForOperation(operation) {
-  switch (operation) {
-    case 'query':
-      return DirectiveLocation.QUERY;
-
-    case 'mutation':
-      return DirectiveLocation.MUTATION;
-
-    case 'subscription':
-      return DirectiveLocation.SUBSCRIPTION;
-  } // Not reachable. All possible types have been considered.
-
-
-  /* istanbul ignore next */
-  invariant(false, 'Unexpected operation: ' + inspect(operation));
-}
diff --git a/node_modules/graphql/validation/rules/KnownFragmentNamesRule.d.ts b/node_modules/graphql/validation/rules/KnownFragmentNamesRule.d.ts
deleted file mode 100644
index 7b594fd..0000000
--- a/node_modules/graphql/validation/rules/KnownFragmentNamesRule.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * Known fragment names
- *
- * A GraphQL document is only valid if all `...Fragment` fragment spreads refer
- * to fragments defined in the same document.
- */
-export function KnownFragmentNamesRule(context: ValidationContext): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/KnownFragmentNamesRule.js b/node_modules/graphql/validation/rules/KnownFragmentNamesRule.js
deleted file mode 100644
index 6d33788..0000000
--- a/node_modules/graphql/validation/rules/KnownFragmentNamesRule.js
+++ /dev/null
@@ -1,27 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.KnownFragmentNamesRule = KnownFragmentNamesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * Known fragment names
- *
- * A GraphQL document is only valid if all `...Fragment` fragment spreads refer
- * to fragments defined in the same document.
- */
-function KnownFragmentNamesRule(context) {
-  return {
-    FragmentSpread: function FragmentSpread(node) {
-      var fragmentName = node.name.value;
-      var fragment = context.getFragment(fragmentName);
-
-      if (!fragment) {
-        context.reportError(new _GraphQLError.GraphQLError("Unknown fragment \"".concat(fragmentName, "\"."), node.name));
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/KnownFragmentNamesRule.js.flow b/node_modules/graphql/validation/rules/KnownFragmentNamesRule.js.flow
deleted file mode 100644
index ad7cd5e..0000000
--- a/node_modules/graphql/validation/rules/KnownFragmentNamesRule.js.flow
+++ /dev/null
@@ -1,26 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type ValidationContext } from '../ValidationContext';
-
-/**
- * Known fragment names
- *
- * A GraphQL document is only valid if all `...Fragment` fragment spreads refer
- * to fragments defined in the same document.
- */
-export function KnownFragmentNamesRule(context: ValidationContext): ASTVisitor {
-  return {
-    FragmentSpread(node) {
-      const fragmentName = node.name.value;
-      const fragment = context.getFragment(fragmentName);
-      if (!fragment) {
-        context.reportError(
-          new GraphQLError(`Unknown fragment "${fragmentName}".`, node.name),
-        );
-      }
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/KnownFragmentNamesRule.mjs b/node_modules/graphql/validation/rules/KnownFragmentNamesRule.mjs
deleted file mode 100644
index 72f935d..0000000
--- a/node_modules/graphql/validation/rules/KnownFragmentNamesRule.mjs
+++ /dev/null
@@ -1,20 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * Known fragment names
- *
- * A GraphQL document is only valid if all `...Fragment` fragment spreads refer
- * to fragments defined in the same document.
- */
-export function KnownFragmentNamesRule(context) {
-  return {
-    FragmentSpread: function FragmentSpread(node) {
-      var fragmentName = node.name.value;
-      var fragment = context.getFragment(fragmentName);
-
-      if (!fragment) {
-        context.reportError(new GraphQLError("Unknown fragment \"".concat(fragmentName, "\"."), node.name));
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/KnownTypeNamesRule.d.ts b/node_modules/graphql/validation/rules/KnownTypeNamesRule.d.ts
deleted file mode 100644
index 6c4560e..0000000
--- a/node_modules/graphql/validation/rules/KnownTypeNamesRule.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * Known type names
- *
- * A GraphQL document is only valid if referenced types (specifically
- * variable definitions and fragment conditions) are defined by the type schema.
- */
-export function KnownTypeNamesRule(context: ValidationContext): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/KnownTypeNamesRule.js b/node_modules/graphql/validation/rules/KnownTypeNamesRule.js
deleted file mode 100644
index 01d0a95..0000000
--- a/node_modules/graphql/validation/rules/KnownTypeNamesRule.js
+++ /dev/null
@@ -1,71 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.KnownTypeNamesRule = KnownTypeNamesRule;
-
-var _didYouMean = _interopRequireDefault(require("../../jsutils/didYouMean"));
-
-var _suggestionList = _interopRequireDefault(require("../../jsutils/suggestionList"));
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _predicates = require("../../language/predicates");
-
-var _scalars = require("../../type/scalars");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Known type names
- *
- * A GraphQL document is only valid if referenced types (specifically
- * variable definitions and fragment conditions) are defined by the type schema.
- */
-function KnownTypeNamesRule(context) {
-  var schema = context.getSchema();
-  var existingTypesMap = schema ? schema.getTypeMap() : Object.create(null);
-  var definedTypes = Object.create(null);
-
-  for (var _i2 = 0, _context$getDocument$2 = context.getDocument().definitions; _i2 < _context$getDocument$2.length; _i2++) {
-    var def = _context$getDocument$2[_i2];
-
-    if ((0, _predicates.isTypeDefinitionNode)(def)) {
-      definedTypes[def.name.value] = true;
-    }
-  }
-
-  var typeNames = Object.keys(existingTypesMap).concat(Object.keys(definedTypes));
-  return {
-    NamedType: function NamedType(node, _1, parent, _2, ancestors) {
-      var typeName = node.name.value;
-
-      if (!existingTypesMap[typeName] && !definedTypes[typeName]) {
-        var _ancestors$;
-
-        var definitionNode = (_ancestors$ = ancestors[2]) !== null && _ancestors$ !== void 0 ? _ancestors$ : parent;
-        var isSDL = definitionNode != null && isSDLNode(definitionNode);
-
-        if (isSDL && isSpecifiedScalarName(typeName)) {
-          return;
-        }
-
-        var suggestedTypes = (0, _suggestionList.default)(typeName, isSDL ? specifiedScalarsNames.concat(typeNames) : typeNames);
-        context.reportError(new _GraphQLError.GraphQLError("Unknown type \"".concat(typeName, "\".") + (0, _didYouMean.default)(suggestedTypes), node));
-      }
-    }
-  };
-}
-
-var specifiedScalarsNames = _scalars.specifiedScalarTypes.map(function (type) {
-  return type.name;
-});
-
-function isSpecifiedScalarName(typeName) {
-  return specifiedScalarsNames.indexOf(typeName) !== -1;
-}
-
-function isSDLNode(value) {
-  return !Array.isArray(value) && ((0, _predicates.isTypeSystemDefinitionNode)(value) || (0, _predicates.isTypeSystemExtensionNode)(value));
-}
diff --git a/node_modules/graphql/validation/rules/KnownTypeNamesRule.js.flow b/node_modules/graphql/validation/rules/KnownTypeNamesRule.js.flow
deleted file mode 100644
index 2c71a38..0000000
--- a/node_modules/graphql/validation/rules/KnownTypeNamesRule.js.flow
+++ /dev/null
@@ -1,81 +0,0 @@
-// @flow strict
-
-import didYouMean from '../../jsutils/didYouMean';
-import suggestionList from '../../jsutils/suggestionList';
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { type ASTNode } from '../../language/ast';
-import { type ASTVisitor } from '../../language/visitor';
-import {
-  isTypeDefinitionNode,
-  isTypeSystemDefinitionNode,
-  isTypeSystemExtensionNode,
-} from '../../language/predicates';
-
-import { specifiedScalarTypes } from '../../type/scalars';
-
-import {
-  type ValidationContext,
-  type SDLValidationContext,
-} from '../ValidationContext';
-
-/**
- * Known type names
- *
- * A GraphQL document is only valid if referenced types (specifically
- * variable definitions and fragment conditions) are defined by the type schema.
- */
-export function KnownTypeNamesRule(
-  context: ValidationContext | SDLValidationContext,
-): ASTVisitor {
-  const schema = context.getSchema();
-  const existingTypesMap = schema ? schema.getTypeMap() : Object.create(null);
-
-  const definedTypes = Object.create(null);
-  for (const def of context.getDocument().definitions) {
-    if (isTypeDefinitionNode(def)) {
-      definedTypes[def.name.value] = true;
-    }
-  }
-
-  const typeNames = Object.keys(existingTypesMap).concat(
-    Object.keys(definedTypes),
-  );
-
-  return {
-    NamedType(node, _1, parent, _2, ancestors) {
-      const typeName = node.name.value;
-      if (!existingTypesMap[typeName] && !definedTypes[typeName]) {
-        const definitionNode = ancestors[2] ?? parent;
-        const isSDL = definitionNode != null && isSDLNode(definitionNode);
-        if (isSDL && isSpecifiedScalarName(typeName)) {
-          return;
-        }
-
-        const suggestedTypes = suggestionList(
-          typeName,
-          isSDL ? specifiedScalarsNames.concat(typeNames) : typeNames,
-        );
-        context.reportError(
-          new GraphQLError(
-            `Unknown type "${typeName}".` + didYouMean(suggestedTypes),
-            node,
-          ),
-        );
-      }
-    },
-  };
-}
-
-const specifiedScalarsNames = specifiedScalarTypes.map(type => type.name);
-function isSpecifiedScalarName(typeName) {
-  return specifiedScalarsNames.indexOf(typeName) !== -1;
-}
-
-function isSDLNode(value: ASTNode | $ReadOnlyArray<ASTNode>): boolean {
-  return (
-    !Array.isArray(value) &&
-    (isTypeSystemDefinitionNode(value) || isTypeSystemExtensionNode(value))
-  );
-}
diff --git a/node_modules/graphql/validation/rules/KnownTypeNamesRule.mjs b/node_modules/graphql/validation/rules/KnownTypeNamesRule.mjs
deleted file mode 100644
index 0216087..0000000
--- a/node_modules/graphql/validation/rules/KnownTypeNamesRule.mjs
+++ /dev/null
@@ -1,57 +0,0 @@
-import didYouMean from "../../jsutils/didYouMean.mjs";
-import suggestionList from "../../jsutils/suggestionList.mjs";
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { isTypeDefinitionNode, isTypeSystemDefinitionNode, isTypeSystemExtensionNode } from "../../language/predicates.mjs";
-import { specifiedScalarTypes } from "../../type/scalars.mjs";
-
-/**
- * Known type names
- *
- * A GraphQL document is only valid if referenced types (specifically
- * variable definitions and fragment conditions) are defined by the type schema.
- */
-export function KnownTypeNamesRule(context) {
-  var schema = context.getSchema();
-  var existingTypesMap = schema ? schema.getTypeMap() : Object.create(null);
-  var definedTypes = Object.create(null);
-
-  for (var _i2 = 0, _context$getDocument$2 = context.getDocument().definitions; _i2 < _context$getDocument$2.length; _i2++) {
-    var def = _context$getDocument$2[_i2];
-
-    if (isTypeDefinitionNode(def)) {
-      definedTypes[def.name.value] = true;
-    }
-  }
-
-  var typeNames = Object.keys(existingTypesMap).concat(Object.keys(definedTypes));
-  return {
-    NamedType: function NamedType(node, _1, parent, _2, ancestors) {
-      var typeName = node.name.value;
-
-      if (!existingTypesMap[typeName] && !definedTypes[typeName]) {
-        var _ancestors$;
-
-        var definitionNode = (_ancestors$ = ancestors[2]) !== null && _ancestors$ !== void 0 ? _ancestors$ : parent;
-        var isSDL = definitionNode != null && isSDLNode(definitionNode);
-
-        if (isSDL && isSpecifiedScalarName(typeName)) {
-          return;
-        }
-
-        var suggestedTypes = suggestionList(typeName, isSDL ? specifiedScalarsNames.concat(typeNames) : typeNames);
-        context.reportError(new GraphQLError("Unknown type \"".concat(typeName, "\".") + didYouMean(suggestedTypes), node));
-      }
-    }
-  };
-}
-var specifiedScalarsNames = specifiedScalarTypes.map(function (type) {
-  return type.name;
-});
-
-function isSpecifiedScalarName(typeName) {
-  return specifiedScalarsNames.indexOf(typeName) !== -1;
-}
-
-function isSDLNode(value) {
-  return !Array.isArray(value) && (isTypeSystemDefinitionNode(value) || isTypeSystemExtensionNode(value));
-}
diff --git a/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.d.ts b/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.d.ts
deleted file mode 100644
index 1ac19ef..0000000
--- a/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ASTValidationContext } from '../ValidationContext';
-
-/**
- * Lone anonymous operation
- *
- * A GraphQL document is only valid if when it contains an anonymous operation
- * (the query short-hand) that it contains only that one operation definition.
- */
-export function LoneAnonymousOperationRule(
-  context: ASTValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.js b/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.js
deleted file mode 100644
index 4a656db..0000000
--- a/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.js
+++ /dev/null
@@ -1,32 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.LoneAnonymousOperationRule = LoneAnonymousOperationRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _kinds = require("../../language/kinds");
-
-/**
- * Lone anonymous operation
- *
- * A GraphQL document is only valid if when it contains an anonymous operation
- * (the query short-hand) that it contains only that one operation definition.
- */
-function LoneAnonymousOperationRule(context) {
-  var operationCount = 0;
-  return {
-    Document: function Document(node) {
-      operationCount = node.definitions.filter(function (definition) {
-        return definition.kind === _kinds.Kind.OPERATION_DEFINITION;
-      }).length;
-    },
-    OperationDefinition: function OperationDefinition(node) {
-      if (!node.name && operationCount > 1) {
-        context.reportError(new _GraphQLError.GraphQLError('This anonymous operation must be the only defined operation.', node));
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.js.flow b/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.js.flow
deleted file mode 100644
index 0ca8c7f..0000000
--- a/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.js.flow
+++ /dev/null
@@ -1,37 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { Kind } from '../../language/kinds';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type ASTValidationContext } from '../ValidationContext';
-
-/**
- * Lone anonymous operation
- *
- * A GraphQL document is only valid if when it contains an anonymous operation
- * (the query short-hand) that it contains only that one operation definition.
- */
-export function LoneAnonymousOperationRule(
-  context: ASTValidationContext,
-): ASTVisitor {
-  let operationCount = 0;
-  return {
-    Document(node) {
-      operationCount = node.definitions.filter(
-        definition => definition.kind === Kind.OPERATION_DEFINITION,
-      ).length;
-    },
-    OperationDefinition(node) {
-      if (!node.name && operationCount > 1) {
-        context.reportError(
-          new GraphQLError(
-            'This anonymous operation must be the only defined operation.',
-            node,
-          ),
-        );
-      }
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.mjs b/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.mjs
deleted file mode 100644
index 134322d..0000000
--- a/node_modules/graphql/validation/rules/LoneAnonymousOperationRule.mjs
+++ /dev/null
@@ -1,24 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { Kind } from "../../language/kinds.mjs";
-
-/**
- * Lone anonymous operation
- *
- * A GraphQL document is only valid if when it contains an anonymous operation
- * (the query short-hand) that it contains only that one operation definition.
- */
-export function LoneAnonymousOperationRule(context) {
-  var operationCount = 0;
-  return {
-    Document: function Document(node) {
-      operationCount = node.definitions.filter(function (definition) {
-        return definition.kind === Kind.OPERATION_DEFINITION;
-      }).length;
-    },
-    OperationDefinition: function OperationDefinition(node) {
-      if (!node.name && operationCount > 1) {
-        context.reportError(new GraphQLError('This anonymous operation must be the only defined operation.', node));
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/LoneSchemaDefinition.d.ts b/node_modules/graphql/validation/rules/LoneSchemaDefinition.d.ts
deleted file mode 100644
index a38ad06..0000000
--- a/node_modules/graphql/validation/rules/LoneSchemaDefinition.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { LoneSchemaDefinitionRule } from 'graphql'
- * or
- *   import { LoneSchemaDefinitionRule } from 'graphql/validation'
- */
-export { LoneSchemaDefinitionRule as LoneSchemaDefinition } from './LoneSchemaDefinitionRule';
diff --git a/node_modules/graphql/validation/rules/LoneSchemaDefinition.js b/node_modules/graphql/validation/rules/LoneSchemaDefinition.js
deleted file mode 100644
index 034367e..0000000
--- a/node_modules/graphql/validation/rules/LoneSchemaDefinition.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "LoneSchemaDefinition", {
-  enumerable: true,
-  get: function get() {
-    return _LoneSchemaDefinitionRule.LoneSchemaDefinitionRule;
-  }
-});
-
-var _LoneSchemaDefinitionRule = require("./LoneSchemaDefinitionRule");
diff --git a/node_modules/graphql/validation/rules/LoneSchemaDefinition.js.flow b/node_modules/graphql/validation/rules/LoneSchemaDefinition.js.flow
deleted file mode 100644
index d5acb84..0000000
--- a/node_modules/graphql/validation/rules/LoneSchemaDefinition.js.flow
+++ /dev/null
@@ -1,10 +0,0 @@
-// @flow strict
-
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { LoneSchemaDefinitionRule } from 'graphql'
- * or
- *   import { LoneSchemaDefinitionRule } from 'graphql/validation'
- */
-export { LoneSchemaDefinitionRule as LoneSchemaDefinition } from './LoneSchemaDefinitionRule';
diff --git a/node_modules/graphql/validation/rules/LoneSchemaDefinition.mjs b/node_modules/graphql/validation/rules/LoneSchemaDefinition.mjs
deleted file mode 100644
index 5485db0..0000000
--- a/node_modules/graphql/validation/rules/LoneSchemaDefinition.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { LoneSchemaDefinitionRule } from 'graphql'
- * or
- *   import { LoneSchemaDefinitionRule } from 'graphql/validation'
- */
-export { LoneSchemaDefinitionRule as LoneSchemaDefinition } from "./LoneSchemaDefinitionRule.mjs";
diff --git a/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.d.ts b/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.d.ts
deleted file mode 100644
index 5075e74..0000000
--- a/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { SDLValidationContext } from '../ValidationContext';
-
-/**
- * Lone Schema definition
- *
- * A GraphQL document is only valid if it contains only one schema definition.
- */
-export function LoneSchemaDefinitionRule(
-  context: SDLValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.js b/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.js
deleted file mode 100644
index f4ced67..0000000
--- a/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.js
+++ /dev/null
@@ -1,35 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.LoneSchemaDefinitionRule = LoneSchemaDefinitionRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * Lone Schema definition
- *
- * A GraphQL document is only valid if it contains only one schema definition.
- */
-function LoneSchemaDefinitionRule(context) {
-  var _ref, _ref2, _ref3;
-
-  var oldSchema = context.getSchema();
-  var alreadyDefined = (_ref = (_ref2 = (_ref3 = oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.astNode) !== null && _ref3 !== void 0 ? _ref3 : oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.getQueryType()) !== null && _ref2 !== void 0 ? _ref2 : oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.getMutationType()) !== null && _ref !== void 0 ? _ref : oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.getSubscriptionType();
-  var schemaDefinitionsCount = 0;
-  return {
-    SchemaDefinition: function SchemaDefinition(node) {
-      if (alreadyDefined) {
-        context.reportError(new _GraphQLError.GraphQLError('Cannot define a new schema within a schema extension.', node));
-        return;
-      }
-
-      if (schemaDefinitionsCount > 0) {
-        context.reportError(new _GraphQLError.GraphQLError('Must provide only one schema definition.', node));
-      }
-
-      ++schemaDefinitionsCount;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.js.flow b/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.js.flow
deleted file mode 100644
index cd0ff8b..0000000
--- a/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.js.flow
+++ /dev/null
@@ -1,44 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type SDLValidationContext } from '../ValidationContext';
-
-/**
- * Lone Schema definition
- *
- * A GraphQL document is only valid if it contains only one schema definition.
- */
-export function LoneSchemaDefinitionRule(
-  context: SDLValidationContext,
-): ASTVisitor {
-  const oldSchema = context.getSchema();
-  const alreadyDefined =
-    oldSchema?.astNode ??
-    oldSchema?.getQueryType() ??
-    oldSchema?.getMutationType() ??
-    oldSchema?.getSubscriptionType();
-
-  let schemaDefinitionsCount = 0;
-  return {
-    SchemaDefinition(node) {
-      if (alreadyDefined) {
-        context.reportError(
-          new GraphQLError(
-            'Cannot define a new schema within a schema extension.',
-            node,
-          ),
-        );
-        return;
-      }
-
-      if (schemaDefinitionsCount > 0) {
-        context.reportError(
-          new GraphQLError('Must provide only one schema definition.', node),
-        );
-      }
-      ++schemaDefinitionsCount;
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.mjs b/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.mjs
deleted file mode 100644
index 9254e13..0000000
--- a/node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.mjs
+++ /dev/null
@@ -1,28 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * Lone Schema definition
- *
- * A GraphQL document is only valid if it contains only one schema definition.
- */
-export function LoneSchemaDefinitionRule(context) {
-  var _ref, _ref2, _ref3;
-
-  var oldSchema = context.getSchema();
-  var alreadyDefined = (_ref = (_ref2 = (_ref3 = oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.astNode) !== null && _ref3 !== void 0 ? _ref3 : oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.getQueryType()) !== null && _ref2 !== void 0 ? _ref2 : oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.getMutationType()) !== null && _ref !== void 0 ? _ref : oldSchema === null || oldSchema === void 0 ? void 0 : oldSchema.getSubscriptionType();
-  var schemaDefinitionsCount = 0;
-  return {
-    SchemaDefinition: function SchemaDefinition(node) {
-      if (alreadyDefined) {
-        context.reportError(new GraphQLError('Cannot define a new schema within a schema extension.', node));
-        return;
-      }
-
-      if (schemaDefinitionsCount > 0) {
-        context.reportError(new GraphQLError('Must provide only one schema definition.', node));
-      }
-
-      ++schemaDefinitionsCount;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/NoFragmentCyclesRule.d.ts b/node_modules/graphql/validation/rules/NoFragmentCyclesRule.d.ts
deleted file mode 100644
index 85b2b10..0000000
--- a/node_modules/graphql/validation/rules/NoFragmentCyclesRule.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-export function NoFragmentCyclesRule(context: ValidationContext): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/NoFragmentCyclesRule.js b/node_modules/graphql/validation/rules/NoFragmentCyclesRule.js
deleted file mode 100644
index b3b0815..0000000
--- a/node_modules/graphql/validation/rules/NoFragmentCyclesRule.js
+++ /dev/null
@@ -1,70 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.NoFragmentCyclesRule = NoFragmentCyclesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-function NoFragmentCyclesRule(context) {
-  // Tracks already visited fragments to maintain O(N) and to ensure that cycles
-  // are not redundantly reported.
-  var visitedFrags = Object.create(null); // Array of AST nodes used to produce meaningful errors
-
-  var spreadPath = []; // Position in the spread path
-
-  var spreadPathIndexByName = Object.create(null);
-  return {
-    OperationDefinition: function OperationDefinition() {
-      return false;
-    },
-    FragmentDefinition: function FragmentDefinition(node) {
-      detectCycleRecursive(node);
-      return false;
-    }
-  }; // This does a straight-forward DFS to find cycles.
-  // It does not terminate when a cycle was found but continues to explore
-  // the graph to find all possible cycles.
-
-  function detectCycleRecursive(fragment) {
-    if (visitedFrags[fragment.name.value]) {
-      return;
-    }
-
-    var fragmentName = fragment.name.value;
-    visitedFrags[fragmentName] = true;
-    var spreadNodes = context.getFragmentSpreads(fragment.selectionSet);
-
-    if (spreadNodes.length === 0) {
-      return;
-    }
-
-    spreadPathIndexByName[fragmentName] = spreadPath.length;
-
-    for (var _i2 = 0; _i2 < spreadNodes.length; _i2++) {
-      var spreadNode = spreadNodes[_i2];
-      var spreadName = spreadNode.name.value;
-      var cycleIndex = spreadPathIndexByName[spreadName];
-      spreadPath.push(spreadNode);
-
-      if (cycleIndex === undefined) {
-        var spreadFragment = context.getFragment(spreadName);
-
-        if (spreadFragment) {
-          detectCycleRecursive(spreadFragment);
-        }
-      } else {
-        var cyclePath = spreadPath.slice(cycleIndex);
-        var viaPath = cyclePath.slice(0, -1).map(function (s) {
-          return '"' + s.name.value + '"';
-        }).join(', ');
-        context.reportError(new _GraphQLError.GraphQLError("Cannot spread fragment \"".concat(spreadName, "\" within itself") + (viaPath !== '' ? " via ".concat(viaPath, ".") : '.'), cyclePath));
-      }
-
-      spreadPath.pop();
-    }
-
-    spreadPathIndexByName[fragmentName] = undefined;
-  }
-}
diff --git a/node_modules/graphql/validation/rules/NoFragmentCyclesRule.js.flow b/node_modules/graphql/validation/rules/NoFragmentCyclesRule.js.flow
deleted file mode 100644
index bb6f605..0000000
--- a/node_modules/graphql/validation/rules/NoFragmentCyclesRule.js.flow
+++ /dev/null
@@ -1,79 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { type ASTVisitor } from '../../language/visitor';
-import { type FragmentDefinitionNode } from '../../language/ast';
-
-import { type ASTValidationContext } from '../ValidationContext';
-
-export function NoFragmentCyclesRule(
-  context: ASTValidationContext,
-): ASTVisitor {
-  // Tracks already visited fragments to maintain O(N) and to ensure that cycles
-  // are not redundantly reported.
-  const visitedFrags = Object.create(null);
-
-  // Array of AST nodes used to produce meaningful errors
-  const spreadPath = [];
-
-  // Position in the spread path
-  const spreadPathIndexByName = Object.create(null);
-
-  return {
-    OperationDefinition: () => false,
-    FragmentDefinition(node) {
-      detectCycleRecursive(node);
-      return false;
-    },
-  };
-
-  // This does a straight-forward DFS to find cycles.
-  // It does not terminate when a cycle was found but continues to explore
-  // the graph to find all possible cycles.
-  function detectCycleRecursive(fragment: FragmentDefinitionNode) {
-    if (visitedFrags[fragment.name.value]) {
-      return;
-    }
-
-    const fragmentName = fragment.name.value;
-    visitedFrags[fragmentName] = true;
-
-    const spreadNodes = context.getFragmentSpreads(fragment.selectionSet);
-    if (spreadNodes.length === 0) {
-      return;
-    }
-
-    spreadPathIndexByName[fragmentName] = spreadPath.length;
-
-    for (const spreadNode of spreadNodes) {
-      const spreadName = spreadNode.name.value;
-      const cycleIndex = spreadPathIndexByName[spreadName];
-
-      spreadPath.push(spreadNode);
-      if (cycleIndex === undefined) {
-        const spreadFragment = context.getFragment(spreadName);
-        if (spreadFragment) {
-          detectCycleRecursive(spreadFragment);
-        }
-      } else {
-        const cyclePath = spreadPath.slice(cycleIndex);
-        const viaPath = cyclePath
-          .slice(0, -1)
-          .map(s => '"' + s.name.value + '"')
-          .join(', ');
-
-        context.reportError(
-          new GraphQLError(
-            `Cannot spread fragment "${spreadName}" within itself` +
-              (viaPath !== '' ? ` via ${viaPath}.` : '.'),
-            cyclePath,
-          ),
-        );
-      }
-      spreadPath.pop();
-    }
-
-    spreadPathIndexByName[fragmentName] = undefined;
-  }
-}
diff --git a/node_modules/graphql/validation/rules/NoFragmentCyclesRule.mjs b/node_modules/graphql/validation/rules/NoFragmentCyclesRule.mjs
deleted file mode 100644
index 8d7618e..0000000
--- a/node_modules/graphql/validation/rules/NoFragmentCyclesRule.mjs
+++ /dev/null
@@ -1,62 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-export function NoFragmentCyclesRule(context) {
-  // Tracks already visited fragments to maintain O(N) and to ensure that cycles
-  // are not redundantly reported.
-  var visitedFrags = Object.create(null); // Array of AST nodes used to produce meaningful errors
-
-  var spreadPath = []; // Position in the spread path
-
-  var spreadPathIndexByName = Object.create(null);
-  return {
-    OperationDefinition: function OperationDefinition() {
-      return false;
-    },
-    FragmentDefinition: function FragmentDefinition(node) {
-      detectCycleRecursive(node);
-      return false;
-    }
-  }; // This does a straight-forward DFS to find cycles.
-  // It does not terminate when a cycle was found but continues to explore
-  // the graph to find all possible cycles.
-
-  function detectCycleRecursive(fragment) {
-    if (visitedFrags[fragment.name.value]) {
-      return;
-    }
-
-    var fragmentName = fragment.name.value;
-    visitedFrags[fragmentName] = true;
-    var spreadNodes = context.getFragmentSpreads(fragment.selectionSet);
-
-    if (spreadNodes.length === 0) {
-      return;
-    }
-
-    spreadPathIndexByName[fragmentName] = spreadPath.length;
-
-    for (var _i2 = 0; _i2 < spreadNodes.length; _i2++) {
-      var spreadNode = spreadNodes[_i2];
-      var spreadName = spreadNode.name.value;
-      var cycleIndex = spreadPathIndexByName[spreadName];
-      spreadPath.push(spreadNode);
-
-      if (cycleIndex === undefined) {
-        var spreadFragment = context.getFragment(spreadName);
-
-        if (spreadFragment) {
-          detectCycleRecursive(spreadFragment);
-        }
-      } else {
-        var cyclePath = spreadPath.slice(cycleIndex);
-        var viaPath = cyclePath.slice(0, -1).map(function (s) {
-          return '"' + s.name.value + '"';
-        }).join(', ');
-        context.reportError(new GraphQLError("Cannot spread fragment \"".concat(spreadName, "\" within itself") + (viaPath !== '' ? " via ".concat(viaPath, ".") : '.'), cyclePath));
-      }
-
-      spreadPath.pop();
-    }
-
-    spreadPathIndexByName[fragmentName] = undefined;
-  }
-}
diff --git a/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.d.ts b/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.d.ts
deleted file mode 100644
index d1a0806..0000000
--- a/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * No undefined variables
- *
- * A GraphQL operation is only valid if all variables encountered, both directly
- * and via fragment spreads, are defined by that operation.
- */
-export function NoUndefinedVariablesRule(
-  context: ValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.js b/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.js
deleted file mode 100644
index 5488816..0000000
--- a/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.js
+++ /dev/null
@@ -1,41 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.NoUndefinedVariablesRule = NoUndefinedVariablesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * No undefined variables
- *
- * A GraphQL operation is only valid if all variables encountered, both directly
- * and via fragment spreads, are defined by that operation.
- */
-function NoUndefinedVariablesRule(context) {
-  var variableNameDefined = Object.create(null);
-  return {
-    OperationDefinition: {
-      enter: function enter() {
-        variableNameDefined = Object.create(null);
-      },
-      leave: function leave(operation) {
-        var usages = context.getRecursiveVariableUsages(operation);
-
-        for (var _i2 = 0; _i2 < usages.length; _i2++) {
-          var _ref2 = usages[_i2];
-          var node = _ref2.node;
-          var varName = node.name.value;
-
-          if (variableNameDefined[varName] !== true) {
-            context.reportError(new _GraphQLError.GraphQLError(operation.name ? "Variable \"$".concat(varName, "\" is not defined by operation \"").concat(operation.name.value, "\".") : "Variable \"$".concat(varName, "\" is not defined."), [node, operation]));
-          }
-        }
-      }
-    },
-    VariableDefinition: function VariableDefinition(node) {
-      variableNameDefined[node.variable.name.value] = true;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.js.flow b/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.js.flow
deleted file mode 100644
index be99da0..0000000
--- a/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.js.flow
+++ /dev/null
@@ -1,46 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type ValidationContext } from '../ValidationContext';
-
-/**
- * No undefined variables
- *
- * A GraphQL operation is only valid if all variables encountered, both directly
- * and via fragment spreads, are defined by that operation.
- */
-export function NoUndefinedVariablesRule(
-  context: ValidationContext,
-): ASTVisitor {
-  let variableNameDefined = Object.create(null);
-
-  return {
-    OperationDefinition: {
-      enter() {
-        variableNameDefined = Object.create(null);
-      },
-      leave(operation) {
-        const usages = context.getRecursiveVariableUsages(operation);
-
-        for (const { node } of usages) {
-          const varName = node.name.value;
-          if (variableNameDefined[varName] !== true) {
-            context.reportError(
-              new GraphQLError(
-                operation.name
-                  ? `Variable "$${varName}" is not defined by operation "${operation.name.value}".`
-                  : `Variable "$${varName}" is not defined.`,
-                [node, operation],
-              ),
-            );
-          }
-        }
-      },
-    },
-    VariableDefinition(node) {
-      variableNameDefined[node.variable.name.value] = true;
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.mjs b/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.mjs
deleted file mode 100644
index 004059f..0000000
--- a/node_modules/graphql/validation/rules/NoUndefinedVariablesRule.mjs
+++ /dev/null
@@ -1,34 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * No undefined variables
- *
- * A GraphQL operation is only valid if all variables encountered, both directly
- * and via fragment spreads, are defined by that operation.
- */
-export function NoUndefinedVariablesRule(context) {
-  var variableNameDefined = Object.create(null);
-  return {
-    OperationDefinition: {
-      enter: function enter() {
-        variableNameDefined = Object.create(null);
-      },
-      leave: function leave(operation) {
-        var usages = context.getRecursiveVariableUsages(operation);
-
-        for (var _i2 = 0; _i2 < usages.length; _i2++) {
-          var _ref2 = usages[_i2];
-          var node = _ref2.node;
-          var varName = node.name.value;
-
-          if (variableNameDefined[varName] !== true) {
-            context.reportError(new GraphQLError(operation.name ? "Variable \"$".concat(varName, "\" is not defined by operation \"").concat(operation.name.value, "\".") : "Variable \"$".concat(varName, "\" is not defined."), [node, operation]));
-          }
-        }
-      }
-    },
-    VariableDefinition: function VariableDefinition(node) {
-      variableNameDefined[node.variable.name.value] = true;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.d.ts b/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.d.ts
deleted file mode 100644
index 8435bab..0000000
--- a/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * No unused fragments
- *
- * A GraphQL document is only valid if all fragment definitions are spread
- * within operations, or spread within other fragments spread within operations.
- */
-export function NoUnusedFragmentsRule(context: ValidationContext): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.js b/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.js
deleted file mode 100644
index c5d5ac9..0000000
--- a/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.js
+++ /dev/null
@@ -1,52 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.NoUnusedFragmentsRule = NoUnusedFragmentsRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * No unused fragments
- *
- * A GraphQL document is only valid if all fragment definitions are spread
- * within operations, or spread within other fragments spread within operations.
- */
-function NoUnusedFragmentsRule(context) {
-  var operationDefs = [];
-  var fragmentDefs = [];
-  return {
-    OperationDefinition: function OperationDefinition(node) {
-      operationDefs.push(node);
-      return false;
-    },
-    FragmentDefinition: function FragmentDefinition(node) {
-      fragmentDefs.push(node);
-      return false;
-    },
-    Document: {
-      leave: function leave() {
-        var fragmentNameUsed = Object.create(null);
-
-        for (var _i2 = 0; _i2 < operationDefs.length; _i2++) {
-          var operation = operationDefs[_i2];
-
-          for (var _i4 = 0, _context$getRecursive2 = context.getRecursivelyReferencedFragments(operation); _i4 < _context$getRecursive2.length; _i4++) {
-            var fragment = _context$getRecursive2[_i4];
-            fragmentNameUsed[fragment.name.value] = true;
-          }
-        }
-
-        for (var _i6 = 0; _i6 < fragmentDefs.length; _i6++) {
-          var fragmentDef = fragmentDefs[_i6];
-          var fragName = fragmentDef.name.value;
-
-          if (fragmentNameUsed[fragName] !== true) {
-            context.reportError(new _GraphQLError.GraphQLError("Fragment \"".concat(fragName, "\" is never used."), fragmentDef));
-          }
-        }
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.js.flow b/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.js.flow
deleted file mode 100644
index f9772e4..0000000
--- a/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.js.flow
+++ /dev/null
@@ -1,54 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type ASTValidationContext } from '../ValidationContext';
-
-/**
- * No unused fragments
- *
- * A GraphQL document is only valid if all fragment definitions are spread
- * within operations, or spread within other fragments spread within operations.
- */
-export function NoUnusedFragmentsRule(
-  context: ASTValidationContext,
-): ASTVisitor {
-  const operationDefs = [];
-  const fragmentDefs = [];
-
-  return {
-    OperationDefinition(node) {
-      operationDefs.push(node);
-      return false;
-    },
-    FragmentDefinition(node) {
-      fragmentDefs.push(node);
-      return false;
-    },
-    Document: {
-      leave() {
-        const fragmentNameUsed = Object.create(null);
-        for (const operation of operationDefs) {
-          for (const fragment of context.getRecursivelyReferencedFragments(
-            operation,
-          )) {
-            fragmentNameUsed[fragment.name.value] = true;
-          }
-        }
-
-        for (const fragmentDef of fragmentDefs) {
-          const fragName = fragmentDef.name.value;
-          if (fragmentNameUsed[fragName] !== true) {
-            context.reportError(
-              new GraphQLError(
-                `Fragment "${fragName}" is never used.`,
-                fragmentDef,
-              ),
-            );
-          }
-        }
-      },
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.mjs b/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.mjs
deleted file mode 100644
index 1f5f816..0000000
--- a/node_modules/graphql/validation/rules/NoUnusedFragmentsRule.mjs
+++ /dev/null
@@ -1,45 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * No unused fragments
- *
- * A GraphQL document is only valid if all fragment definitions are spread
- * within operations, or spread within other fragments spread within operations.
- */
-export function NoUnusedFragmentsRule(context) {
-  var operationDefs = [];
-  var fragmentDefs = [];
-  return {
-    OperationDefinition: function OperationDefinition(node) {
-      operationDefs.push(node);
-      return false;
-    },
-    FragmentDefinition: function FragmentDefinition(node) {
-      fragmentDefs.push(node);
-      return false;
-    },
-    Document: {
-      leave: function leave() {
-        var fragmentNameUsed = Object.create(null);
-
-        for (var _i2 = 0; _i2 < operationDefs.length; _i2++) {
-          var operation = operationDefs[_i2];
-
-          for (var _i4 = 0, _context$getRecursive2 = context.getRecursivelyReferencedFragments(operation); _i4 < _context$getRecursive2.length; _i4++) {
-            var fragment = _context$getRecursive2[_i4];
-            fragmentNameUsed[fragment.name.value] = true;
-          }
-        }
-
-        for (var _i6 = 0; _i6 < fragmentDefs.length; _i6++) {
-          var fragmentDef = fragmentDefs[_i6];
-          var fragName = fragmentDef.name.value;
-
-          if (fragmentNameUsed[fragName] !== true) {
-            context.reportError(new GraphQLError("Fragment \"".concat(fragName, "\" is never used."), fragmentDef));
-          }
-        }
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/NoUnusedVariablesRule.d.ts b/node_modules/graphql/validation/rules/NoUnusedVariablesRule.d.ts
deleted file mode 100644
index 351449d..0000000
--- a/node_modules/graphql/validation/rules/NoUnusedVariablesRule.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * No unused variables
- *
- * A GraphQL operation is only valid if all variables defined by an operation
- * are used, either directly or within a spread fragment.
- */
-export function NoUnusedVariablesRule(context: ValidationContext): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/NoUnusedVariablesRule.js b/node_modules/graphql/validation/rules/NoUnusedVariablesRule.js
deleted file mode 100644
index 4046648..0000000
--- a/node_modules/graphql/validation/rules/NoUnusedVariablesRule.js
+++ /dev/null
@@ -1,47 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.NoUnusedVariablesRule = NoUnusedVariablesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * No unused variables
- *
- * A GraphQL operation is only valid if all variables defined by an operation
- * are used, either directly or within a spread fragment.
- */
-function NoUnusedVariablesRule(context) {
-  var variableDefs = [];
-  return {
-    OperationDefinition: {
-      enter: function enter() {
-        variableDefs = [];
-      },
-      leave: function leave(operation) {
-        var variableNameUsed = Object.create(null);
-        var usages = context.getRecursiveVariableUsages(operation);
-
-        for (var _i2 = 0; _i2 < usages.length; _i2++) {
-          var _ref2 = usages[_i2];
-          var node = _ref2.node;
-          variableNameUsed[node.name.value] = true;
-        }
-
-        for (var _i4 = 0, _variableDefs2 = variableDefs; _i4 < _variableDefs2.length; _i4++) {
-          var variableDef = _variableDefs2[_i4];
-          var variableName = variableDef.variable.name.value;
-
-          if (variableNameUsed[variableName] !== true) {
-            context.reportError(new _GraphQLError.GraphQLError(operation.name ? "Variable \"$".concat(variableName, "\" is never used in operation \"").concat(operation.name.value, "\".") : "Variable \"$".concat(variableName, "\" is never used."), variableDef));
-          }
-        }
-      }
-    },
-    VariableDefinition: function VariableDefinition(def) {
-      variableDefs.push(def);
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/NoUnusedVariablesRule.js.flow b/node_modules/graphql/validation/rules/NoUnusedVariablesRule.js.flow
deleted file mode 100644
index d24164e..0000000
--- a/node_modules/graphql/validation/rules/NoUnusedVariablesRule.js.flow
+++ /dev/null
@@ -1,49 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type ValidationContext } from '../ValidationContext';
-
-/**
- * No unused variables
- *
- * A GraphQL operation is only valid if all variables defined by an operation
- * are used, either directly or within a spread fragment.
- */
-export function NoUnusedVariablesRule(context: ValidationContext): ASTVisitor {
-  let variableDefs = [];
-
-  return {
-    OperationDefinition: {
-      enter() {
-        variableDefs = [];
-      },
-      leave(operation) {
-        const variableNameUsed = Object.create(null);
-        const usages = context.getRecursiveVariableUsages(operation);
-
-        for (const { node } of usages) {
-          variableNameUsed[node.name.value] = true;
-        }
-
-        for (const variableDef of variableDefs) {
-          const variableName = variableDef.variable.name.value;
-          if (variableNameUsed[variableName] !== true) {
-            context.reportError(
-              new GraphQLError(
-                operation.name
-                  ? `Variable "$${variableName}" is never used in operation "${operation.name.value}".`
-                  : `Variable "$${variableName}" is never used.`,
-                variableDef,
-              ),
-            );
-          }
-        }
-      },
-    },
-    VariableDefinition(def) {
-      variableDefs.push(def);
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/NoUnusedVariablesRule.mjs b/node_modules/graphql/validation/rules/NoUnusedVariablesRule.mjs
deleted file mode 100644
index df62472..0000000
--- a/node_modules/graphql/validation/rules/NoUnusedVariablesRule.mjs
+++ /dev/null
@@ -1,40 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * No unused variables
- *
- * A GraphQL operation is only valid if all variables defined by an operation
- * are used, either directly or within a spread fragment.
- */
-export function NoUnusedVariablesRule(context) {
-  var variableDefs = [];
-  return {
-    OperationDefinition: {
-      enter: function enter() {
-        variableDefs = [];
-      },
-      leave: function leave(operation) {
-        var variableNameUsed = Object.create(null);
-        var usages = context.getRecursiveVariableUsages(operation);
-
-        for (var _i2 = 0; _i2 < usages.length; _i2++) {
-          var _ref2 = usages[_i2];
-          var node = _ref2.node;
-          variableNameUsed[node.name.value] = true;
-        }
-
-        for (var _i4 = 0, _variableDefs2 = variableDefs; _i4 < _variableDefs2.length; _i4++) {
-          var variableDef = _variableDefs2[_i4];
-          var variableName = variableDef.variable.name.value;
-
-          if (variableNameUsed[variableName] !== true) {
-            context.reportError(new GraphQLError(operation.name ? "Variable \"$".concat(variableName, "\" is never used in operation \"").concat(operation.name.value, "\".") : "Variable \"$".concat(variableName, "\" is never used."), variableDef));
-          }
-        }
-      }
-    },
-    VariableDefinition: function VariableDefinition(def) {
-      variableDefs.push(def);
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.d.ts b/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.d.ts
deleted file mode 100644
index c1671c2..0000000
--- a/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * Overlapping fields can be merged
- *
- * A selection set is only valid if all fields (including spreading any
- * fragments) either correspond to distinct response names or can be merged
- * without ambiguity.
- */
-export function OverlappingFieldsCanBeMergedRule(
-  context: ValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.js b/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.js
deleted file mode 100644
index 29e7a58..0000000
--- a/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.js
+++ /dev/null
@@ -1,588 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.OverlappingFieldsCanBeMergedRule = OverlappingFieldsCanBeMergedRule;
-
-var _find = _interopRequireDefault(require("../../polyfills/find"));
-
-var _objectEntries3 = _interopRequireDefault(require("../../polyfills/objectEntries"));
-
-var _inspect = _interopRequireDefault(require("../../jsutils/inspect"));
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _kinds = require("../../language/kinds");
-
-var _printer = require("../../language/printer");
-
-var _definition = require("../../type/definition");
-
-var _typeFromAST = require("../../utilities/typeFromAST");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function reasonMessage(reason) {
-  if (Array.isArray(reason)) {
-    return reason.map(function (_ref) {
-      var responseName = _ref[0],
-          subReason = _ref[1];
-      return "subfields \"".concat(responseName, "\" conflict because ") + reasonMessage(subReason);
-    }).join(' and ');
-  }
-
-  return reason;
-}
-/**
- * Overlapping fields can be merged
- *
- * A selection set is only valid if all fields (including spreading any
- * fragments) either correspond to distinct response names or can be merged
- * without ambiguity.
- */
-
-
-function OverlappingFieldsCanBeMergedRule(context) {
-  // A memoization for when two fragments are compared "between" each other for
-  // conflicts. Two fragments may be compared many times, so memoizing this can
-  // dramatically improve the performance of this validator.
-  var comparedFragmentPairs = new PairSet(); // A cache for the "field map" and list of fragment names found in any given
-  // selection set. Selection sets may be asked for this information multiple
-  // times, so this improves the performance of this validator.
-
-  var cachedFieldsAndFragmentNames = new Map();
-  return {
-    SelectionSet: function SelectionSet(selectionSet) {
-      var conflicts = findConflictsWithinSelectionSet(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, context.getParentType(), selectionSet);
-
-      for (var _i2 = 0; _i2 < conflicts.length; _i2++) {
-        var _ref3 = conflicts[_i2];
-        var _ref2$ = _ref3[0];
-        var responseName = _ref2$[0];
-        var reason = _ref2$[1];
-        var fields1 = _ref3[1];
-        var fields2 = _ref3[2];
-        var reasonMsg = reasonMessage(reason);
-        context.reportError(new _GraphQLError.GraphQLError("Fields \"".concat(responseName, "\" conflict because ").concat(reasonMsg, ". Use different aliases on the fields to fetch both if this was intentional."), fields1.concat(fields2)));
-      }
-    }
-  };
-}
-
-/**
- * Algorithm:
- *
- * Conflicts occur when two fields exist in a query which will produce the same
- * response name, but represent differing values, thus creating a conflict.
- * The algorithm below finds all conflicts via making a series of comparisons
- * between fields. In order to compare as few fields as possible, this makes
- * a series of comparisons "within" sets of fields and "between" sets of fields.
- *
- * Given any selection set, a collection produces both a set of fields by
- * also including all inline fragments, as well as a list of fragments
- * referenced by fragment spreads.
- *
- * A) Each selection set represented in the document first compares "within" its
- * collected set of fields, finding any conflicts between every pair of
- * overlapping fields.
- * Note: This is the *only time* that a the fields "within" a set are compared
- * to each other. After this only fields "between" sets are compared.
- *
- * B) Also, if any fragment is referenced in a selection set, then a
- * comparison is made "between" the original set of fields and the
- * referenced fragment.
- *
- * C) Also, if multiple fragments are referenced, then comparisons
- * are made "between" each referenced fragment.
- *
- * D) When comparing "between" a set of fields and a referenced fragment, first
- * a comparison is made between each field in the original set of fields and
- * each field in the the referenced set of fields.
- *
- * E) Also, if any fragment is referenced in the referenced selection set,
- * then a comparison is made "between" the original set of fields and the
- * referenced fragment (recursively referring to step D).
- *
- * F) When comparing "between" two fragments, first a comparison is made between
- * each field in the first referenced set of fields and each field in the the
- * second referenced set of fields.
- *
- * G) Also, any fragments referenced by the first must be compared to the
- * second, and any fragments referenced by the second must be compared to the
- * first (recursively referring to step F).
- *
- * H) When comparing two fields, if both have selection sets, then a comparison
- * is made "between" both selection sets, first comparing the set of fields in
- * the first selection set with the set of fields in the second.
- *
- * I) Also, if any fragment is referenced in either selection set, then a
- * comparison is made "between" the other set of fields and the
- * referenced fragment.
- *
- * J) Also, if two fragments are referenced in both selection sets, then a
- * comparison is made "between" the two fragments.
- *
- */
-// Find all conflicts found "within" a selection set, including those found
-// via spreading in fragments. Called when visiting each SelectionSet in the
-// GraphQL Document.
-function findConflictsWithinSelectionSet(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentType, selectionSet) {
-  var conflicts = [];
-
-  var _getFieldsAndFragment = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet),
-      fieldMap = _getFieldsAndFragment[0],
-      fragmentNames = _getFieldsAndFragment[1]; // (A) Find find all conflicts "within" the fields of this selection set.
-  // Note: this is the *only place* `collectConflictsWithin` is called.
-
-
-  collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap);
-
-  if (fragmentNames.length !== 0) {
-    // (B) Then collect conflicts between these fields and those represented by
-    // each spread fragment name found.
-    for (var i = 0; i < fragmentNames.length; i++) {
-      collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fieldMap, fragmentNames[i]); // (C) Then compare this fragment with all other fragments found in this
-      // selection set to collect conflicts between fragments spread together.
-      // This compares each item in the list of fragment names to every other
-      // item in that same list (except for itself).
-
-      for (var j = i + 1; j < fragmentNames.length; j++) {
-        collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fragmentNames[i], fragmentNames[j]);
-      }
-    }
-  }
-
-  return conflicts;
-} // Collect all conflicts found between a set of fields and a fragment reference
-// including via spreading in any nested fragments.
-
-
-function collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fragmentName) {
-  var fragment = context.getFragment(fragmentName);
-
-  if (!fragment) {
-    return;
-  }
-
-  var _getReferencedFieldsA = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment),
-      fieldMap2 = _getReferencedFieldsA[0],
-      fragmentNames2 = _getReferencedFieldsA[1]; // Do not compare a fragment's fieldMap to itself.
-
-
-  if (fieldMap === fieldMap2) {
-    return;
-  } // (D) First collect any conflicts between the provided collection of fields
-  // and the collection of fields represented by the given fragment.
-
-
-  collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fieldMap2); // (E) Then collect any conflicts between the provided collection of fields
-  // and any fragment names found in the given fragment.
-
-  for (var i = 0; i < fragmentNames2.length; i++) {
-    collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fragmentNames2[i]);
-  }
-} // Collect all conflicts found between two fragments, including via spreading in
-// any nested fragments.
-
-
-function collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2) {
-  // No need to compare a fragment to itself.
-  if (fragmentName1 === fragmentName2) {
-    return;
-  } // Memoize so two fragments are not compared for conflicts more than once.
-
-
-  if (comparedFragmentPairs.has(fragmentName1, fragmentName2, areMutuallyExclusive)) {
-    return;
-  }
-
-  comparedFragmentPairs.add(fragmentName1, fragmentName2, areMutuallyExclusive);
-  var fragment1 = context.getFragment(fragmentName1);
-  var fragment2 = context.getFragment(fragmentName2);
-
-  if (!fragment1 || !fragment2) {
-    return;
-  }
-
-  var _getReferencedFieldsA2 = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment1),
-      fieldMap1 = _getReferencedFieldsA2[0],
-      fragmentNames1 = _getReferencedFieldsA2[1];
-
-  var _getReferencedFieldsA3 = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment2),
-      fieldMap2 = _getReferencedFieldsA3[0],
-      fragmentNames2 = _getReferencedFieldsA3[1]; // (F) First, collect all conflicts between these two collections of fields
-  // (not including any nested fragments).
-
-
-  collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (G) Then collect conflicts between the first fragment and any nested
-  // fragments spread in the second fragment.
-
-  for (var j = 0; j < fragmentNames2.length; j++) {
-    collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentNames2[j]);
-  } // (G) Then collect conflicts between the second fragment and any nested
-  // fragments spread in the first fragment.
-
-
-  for (var i = 0; i < fragmentNames1.length; i++) {
-    collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentNames1[i], fragmentName2);
-  }
-} // Find all conflicts found between two selection sets, including those found
-// via spreading in fragments. Called when determining if conflicts exist
-// between the sub-fields of two overlapping fields.
-
-
-function findConflictsBetweenSubSelectionSets(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, parentType1, selectionSet1, parentType2, selectionSet2) {
-  var conflicts = [];
-
-  var _getFieldsAndFragment2 = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType1, selectionSet1),
-      fieldMap1 = _getFieldsAndFragment2[0],
-      fragmentNames1 = _getFieldsAndFragment2[1];
-
-  var _getFieldsAndFragment3 = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType2, selectionSet2),
-      fieldMap2 = _getFieldsAndFragment3[0],
-      fragmentNames2 = _getFieldsAndFragment3[1]; // (H) First, collect all conflicts between these two collections of field.
-
-
-  collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (I) Then collect conflicts between the first collection of fields and
-  // those referenced by each fragment name associated with the second.
-
-  if (fragmentNames2.length !== 0) {
-    for (var j = 0; j < fragmentNames2.length; j++) {
-      collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fragmentNames2[j]);
-    }
-  } // (I) Then collect conflicts between the second collection of fields and
-  // those referenced by each fragment name associated with the first.
-
-
-  if (fragmentNames1.length !== 0) {
-    for (var i = 0; i < fragmentNames1.length; i++) {
-      collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap2, fragmentNames1[i]);
-    }
-  } // (J) Also collect conflicts between any fragment names by the first and
-  // fragment names by the second. This compares each item in the first set of
-  // names to each item in the second set of names.
-
-
-  for (var _i3 = 0; _i3 < fragmentNames1.length; _i3++) {
-    for (var _j = 0; _j < fragmentNames2.length; _j++) {
-      collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentNames1[_i3], fragmentNames2[_j]);
-    }
-  }
-
-  return conflicts;
-} // Collect all Conflicts "within" one collection of fields.
-
-
-function collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap) {
-  // A field map is a keyed collection, where each key represents a response
-  // name and the value at that key is a list of all fields which provide that
-  // response name. For every response name, if there are multiple fields, they
-  // must be compared to find a potential conflict.
-  for (var _i5 = 0, _objectEntries2 = (0, _objectEntries3.default)(fieldMap); _i5 < _objectEntries2.length; _i5++) {
-    var _ref5 = _objectEntries2[_i5];
-    var responseName = _ref5[0];
-    var fields = _ref5[1];
-
-    // This compares every field in the list to every other field in this list
-    // (except to itself). If the list only has one item, nothing needs to
-    // be compared.
-    if (fields.length > 1) {
-      for (var i = 0; i < fields.length; i++) {
-        for (var j = i + 1; j < fields.length; j++) {
-          var conflict = findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, // within one collection is never mutually exclusive
-          responseName, fields[i], fields[j]);
-
-          if (conflict) {
-            conflicts.push(conflict);
-          }
-        }
-      }
-    }
-  }
-} // Collect all Conflicts between two collections of fields. This is similar to,
-// but different from the `collectConflictsWithin` function above. This check
-// assumes that `collectConflictsWithin` has already been called on each
-// provided collection of fields. This is true because this validator traverses
-// each individual selection set.
-
-
-function collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, fieldMap1, fieldMap2) {
-  // A field map is a keyed collection, where each key represents a response
-  // name and the value at that key is a list of all fields which provide that
-  // response name. For any response name which appears in both provided field
-  // maps, each field from the first field map must be compared to every field
-  // in the second field map to find potential conflicts.
-  for (var _i7 = 0, _Object$keys2 = Object.keys(fieldMap1); _i7 < _Object$keys2.length; _i7++) {
-    var responseName = _Object$keys2[_i7];
-    var fields2 = fieldMap2[responseName];
-
-    if (fields2) {
-      var fields1 = fieldMap1[responseName];
-
-      for (var i = 0; i < fields1.length; i++) {
-        for (var j = 0; j < fields2.length; j++) {
-          var conflict = findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, fields1[i], fields2[j]);
-
-          if (conflict) {
-            conflicts.push(conflict);
-          }
-        }
-      }
-    }
-  }
-} // Determines if there is a conflict between two particular fields, including
-// comparing their sub-fields.
-
-
-function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2) {
-  var parentType1 = field1[0],
-      node1 = field1[1],
-      def1 = field1[2];
-  var parentType2 = field2[0],
-      node2 = field2[1],
-      def2 = field2[2]; // If it is known that two fields could not possibly apply at the same
-  // time, due to the parent types, then it is safe to permit them to diverge
-  // in aliased field or arguments used as they will not present any ambiguity
-  // by differing.
-  // It is known that two parent types could never overlap if they are
-  // different Object types. Interface or Union types might overlap - if not
-  // in the current state of the schema, then perhaps in some future version,
-  // thus may not safely diverge.
-
-  var areMutuallyExclusive = parentFieldsAreMutuallyExclusive || parentType1 !== parentType2 && (0, _definition.isObjectType)(parentType1) && (0, _definition.isObjectType)(parentType2);
-
-  if (!areMutuallyExclusive) {
-    var _node1$arguments, _node2$arguments;
-
-    // Two aliases must refer to the same field.
-    var name1 = node1.name.value;
-    var name2 = node2.name.value;
-
-    if (name1 !== name2) {
-      return [[responseName, "\"".concat(name1, "\" and \"").concat(name2, "\" are different fields")], [node1], [node2]];
-    }
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-
-    var args1 = (_node1$arguments = node1.arguments) !== null && _node1$arguments !== void 0 ? _node1$arguments : [];
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-    var args2 = (_node2$arguments = node2.arguments) !== null && _node2$arguments !== void 0 ? _node2$arguments : []; // Two field calls must have the same arguments.
-
-    if (!sameArguments(args1, args2)) {
-      return [[responseName, 'they have differing arguments'], [node1], [node2]];
-    }
-  } // The return type for each field.
-
-
-  var type1 = def1 === null || def1 === void 0 ? void 0 : def1.type;
-  var type2 = def2 === null || def2 === void 0 ? void 0 : def2.type;
-
-  if (type1 && type2 && doTypesConflict(type1, type2)) {
-    return [[responseName, "they return conflicting types \"".concat((0, _inspect.default)(type1), "\" and \"").concat((0, _inspect.default)(type2), "\"")], [node1], [node2]];
-  } // Collect and compare sub-fields. Use the same "visited fragment names" list
-  // for both collections so fields in a fragment reference are never
-  // compared to themselves.
-
-
-  var selectionSet1 = node1.selectionSet;
-  var selectionSet2 = node2.selectionSet;
-
-  if (selectionSet1 && selectionSet2) {
-    var conflicts = findConflictsBetweenSubSelectionSets(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, (0, _definition.getNamedType)(type1), selectionSet1, (0, _definition.getNamedType)(type2), selectionSet2);
-    return subfieldConflicts(conflicts, responseName, node1, node2);
-  }
-}
-
-function sameArguments(arguments1, arguments2) {
-  if (arguments1.length !== arguments2.length) {
-    return false;
-  }
-
-  return arguments1.every(function (argument1) {
-    var argument2 = (0, _find.default)(arguments2, function (argument) {
-      return argument.name.value === argument1.name.value;
-    });
-
-    if (!argument2) {
-      return false;
-    }
-
-    return sameValue(argument1.value, argument2.value);
-  });
-}
-
-function sameValue(value1, value2) {
-  return (0, _printer.print)(value1) === (0, _printer.print)(value2);
-} // Two types conflict if both types could not apply to a value simultaneously.
-// Composite types are ignored as their individual field types will be compared
-// later recursively. However List and Non-Null types must match.
-
-
-function doTypesConflict(type1, type2) {
-  if ((0, _definition.isListType)(type1)) {
-    return (0, _definition.isListType)(type2) ? doTypesConflict(type1.ofType, type2.ofType) : true;
-  }
-
-  if ((0, _definition.isListType)(type2)) {
-    return true;
-  }
-
-  if ((0, _definition.isNonNullType)(type1)) {
-    return (0, _definition.isNonNullType)(type2) ? doTypesConflict(type1.ofType, type2.ofType) : true;
-  }
-
-  if ((0, _definition.isNonNullType)(type2)) {
-    return true;
-  }
-
-  if ((0, _definition.isLeafType)(type1) || (0, _definition.isLeafType)(type2)) {
-    return type1 !== type2;
-  }
-
-  return false;
-} // Given a selection set, return the collection of fields (a mapping of response
-// name to field nodes and definitions) as well as a list of fragment names
-// referenced via fragment spreads.
-
-
-function getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet) {
-  var cached = cachedFieldsAndFragmentNames.get(selectionSet);
-
-  if (!cached) {
-    var nodeAndDefs = Object.create(null);
-    var fragmentNames = Object.create(null);
-
-    _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeAndDefs, fragmentNames);
-
-    cached = [nodeAndDefs, Object.keys(fragmentNames)];
-    cachedFieldsAndFragmentNames.set(selectionSet, cached);
-  }
-
-  return cached;
-} // Given a reference to a fragment, return the represented collection of fields
-// as well as a list of nested fragment names referenced via fragment spreads.
-
-
-function getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment) {
-  // Short-circuit building a type from the node if possible.
-  var cached = cachedFieldsAndFragmentNames.get(fragment.selectionSet);
-
-  if (cached) {
-    return cached;
-  }
-
-  var fragmentType = (0, _typeFromAST.typeFromAST)(context.getSchema(), fragment.typeCondition);
-  return getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragmentType, fragment.selectionSet);
-}
-
-function _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeAndDefs, fragmentNames) {
-  for (var _i9 = 0, _selectionSet$selecti2 = selectionSet.selections; _i9 < _selectionSet$selecti2.length; _i9++) {
-    var selection = _selectionSet$selecti2[_i9];
-
-    switch (selection.kind) {
-      case _kinds.Kind.FIELD:
-        {
-          var fieldName = selection.name.value;
-          var fieldDef = void 0;
-
-          if ((0, _definition.isObjectType)(parentType) || (0, _definition.isInterfaceType)(parentType)) {
-            fieldDef = parentType.getFields()[fieldName];
-          }
-
-          var responseName = selection.alias ? selection.alias.value : fieldName;
-
-          if (!nodeAndDefs[responseName]) {
-            nodeAndDefs[responseName] = [];
-          }
-
-          nodeAndDefs[responseName].push([parentType, selection, fieldDef]);
-          break;
-        }
-
-      case _kinds.Kind.FRAGMENT_SPREAD:
-        fragmentNames[selection.name.value] = true;
-        break;
-
-      case _kinds.Kind.INLINE_FRAGMENT:
-        {
-          var typeCondition = selection.typeCondition;
-          var inlineFragmentType = typeCondition ? (0, _typeFromAST.typeFromAST)(context.getSchema(), typeCondition) : parentType;
-
-          _collectFieldsAndFragmentNames(context, inlineFragmentType, selection.selectionSet, nodeAndDefs, fragmentNames);
-
-          break;
-        }
-    }
-  }
-} // Given a series of Conflicts which occurred between two sub-fields, generate
-// a single Conflict.
-
-
-function subfieldConflicts(conflicts, responseName, node1, node2) {
-  if (conflicts.length > 0) {
-    return [[responseName, conflicts.map(function (_ref6) {
-      var reason = _ref6[0];
-      return reason;
-    })], conflicts.reduce(function (allFields, _ref7) {
-      var fields1 = _ref7[1];
-      return allFields.concat(fields1);
-    }, [node1]), conflicts.reduce(function (allFields, _ref8) {
-      var fields2 = _ref8[2];
-      return allFields.concat(fields2);
-    }, [node2])];
-  }
-}
-/**
- * A way to keep track of pairs of things when the ordering of the pair does
- * not matter. We do this by maintaining a sort of double adjacency sets.
- */
-
-
-var PairSet =
-/*#__PURE__*/
-function () {
-  function PairSet() {
-    this._data = Object.create(null);
-  }
-
-  var _proto = PairSet.prototype;
-
-  _proto.has = function has(a, b, areMutuallyExclusive) {
-    var first = this._data[a];
-    var result = first && first[b];
-
-    if (result === undefined) {
-      return false;
-    } // areMutuallyExclusive being false is a superset of being true,
-    // hence if we want to know if this PairSet "has" these two with no
-    // exclusivity, we have to ensure it was added as such.
-
-
-    if (areMutuallyExclusive === false) {
-      return result === false;
-    }
-
-    return true;
-  };
-
-  _proto.add = function add(a, b, areMutuallyExclusive) {
-    _pairSetAdd(this._data, a, b, areMutuallyExclusive);
-
-    _pairSetAdd(this._data, b, a, areMutuallyExclusive);
-  };
-
-  return PairSet;
-}();
-
-function _pairSetAdd(data, a, b, areMutuallyExclusive) {
-  var map = data[a];
-
-  if (!map) {
-    map = Object.create(null);
-    data[a] = map;
-  }
-
-  map[b] = areMutuallyExclusive;
-}
diff --git a/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.js.flow b/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.js.flow
deleted file mode 100644
index 15a6f7b..0000000
--- a/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.js.flow
+++ /dev/null
@@ -1,831 +0,0 @@
-// @flow strict
-
-import find from '../../polyfills/find';
-import objectEntries from '../../polyfills/objectEntries';
-
-import inspect from '../../jsutils/inspect';
-import { type ObjMap } from '../../jsutils/ObjMap';
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { Kind } from '../../language/kinds';
-import { print } from '../../language/printer';
-import { type ASTVisitor } from '../../language/visitor';
-import {
-  type SelectionSetNode,
-  type FieldNode,
-  type ArgumentNode,
-  type FragmentDefinitionNode,
-} from '../../language/ast';
-
-import {
-  type GraphQLNamedType,
-  type GraphQLOutputType,
-  type GraphQLCompositeType,
-  type GraphQLField,
-  getNamedType,
-  isNonNullType,
-  isLeafType,
-  isObjectType,
-  isListType,
-  isInterfaceType,
-} from '../../type/definition';
-
-import { typeFromAST } from '../../utilities/typeFromAST';
-
-import { type ValidationContext } from '../ValidationContext';
-
-function reasonMessage(reason: ConflictReasonMessage): string {
-  if (Array.isArray(reason)) {
-    return reason
-      .map(
-        ([responseName, subReason]) =>
-          `subfields "${responseName}" conflict because ` +
-          reasonMessage(subReason),
-      )
-      .join(' and ');
-  }
-  return reason;
-}
-
-/**
- * Overlapping fields can be merged
- *
- * A selection set is only valid if all fields (including spreading any
- * fragments) either correspond to distinct response names or can be merged
- * without ambiguity.
- */
-export function OverlappingFieldsCanBeMergedRule(
-  context: ValidationContext,
-): ASTVisitor {
-  // A memoization for when two fragments are compared "between" each other for
-  // conflicts. Two fragments may be compared many times, so memoizing this can
-  // dramatically improve the performance of this validator.
-  const comparedFragmentPairs = new PairSet();
-
-  // A cache for the "field map" and list of fragment names found in any given
-  // selection set. Selection sets may be asked for this information multiple
-  // times, so this improves the performance of this validator.
-  const cachedFieldsAndFragmentNames = new Map();
-
-  return {
-    SelectionSet(selectionSet) {
-      const conflicts = findConflictsWithinSelectionSet(
-        context,
-        cachedFieldsAndFragmentNames,
-        comparedFragmentPairs,
-        context.getParentType(),
-        selectionSet,
-      );
-      for (const [[responseName, reason], fields1, fields2] of conflicts) {
-        const reasonMsg = reasonMessage(reason);
-        context.reportError(
-          new GraphQLError(
-            `Fields "${responseName}" conflict because ${reasonMsg}. Use different aliases on the fields to fetch both if this was intentional.`,
-            fields1.concat(fields2),
-          ),
-        );
-      }
-    },
-  };
-}
-
-type Conflict = [ConflictReason, Array<FieldNode>, Array<FieldNode>];
-// Field name and reason.
-type ConflictReason = [string, ConflictReasonMessage];
-// Reason is a string, or a nested list of conflicts.
-type ConflictReasonMessage = string | Array<ConflictReason>;
-// Tuple defining a field node in a context.
-type NodeAndDef = [
-  GraphQLCompositeType,
-  FieldNode,
-  ?GraphQLField<mixed, mixed>,
-];
-// Map of array of those.
-type NodeAndDefCollection = ObjMap<Array<NodeAndDef>>;
-
-/**
- * Algorithm:
- *
- * Conflicts occur when two fields exist in a query which will produce the same
- * response name, but represent differing values, thus creating a conflict.
- * The algorithm below finds all conflicts via making a series of comparisons
- * between fields. In order to compare as few fields as possible, this makes
- * a series of comparisons "within" sets of fields and "between" sets of fields.
- *
- * Given any selection set, a collection produces both a set of fields by
- * also including all inline fragments, as well as a list of fragments
- * referenced by fragment spreads.
- *
- * A) Each selection set represented in the document first compares "within" its
- * collected set of fields, finding any conflicts between every pair of
- * overlapping fields.
- * Note: This is the *only time* that a the fields "within" a set are compared
- * to each other. After this only fields "between" sets are compared.
- *
- * B) Also, if any fragment is referenced in a selection set, then a
- * comparison is made "between" the original set of fields and the
- * referenced fragment.
- *
- * C) Also, if multiple fragments are referenced, then comparisons
- * are made "between" each referenced fragment.
- *
- * D) When comparing "between" a set of fields and a referenced fragment, first
- * a comparison is made between each field in the original set of fields and
- * each field in the the referenced set of fields.
- *
- * E) Also, if any fragment is referenced in the referenced selection set,
- * then a comparison is made "between" the original set of fields and the
- * referenced fragment (recursively referring to step D).
- *
- * F) When comparing "between" two fragments, first a comparison is made between
- * each field in the first referenced set of fields and each field in the the
- * second referenced set of fields.
- *
- * G) Also, any fragments referenced by the first must be compared to the
- * second, and any fragments referenced by the second must be compared to the
- * first (recursively referring to step F).
- *
- * H) When comparing two fields, if both have selection sets, then a comparison
- * is made "between" both selection sets, first comparing the set of fields in
- * the first selection set with the set of fields in the second.
- *
- * I) Also, if any fragment is referenced in either selection set, then a
- * comparison is made "between" the other set of fields and the
- * referenced fragment.
- *
- * J) Also, if two fragments are referenced in both selection sets, then a
- * comparison is made "between" the two fragments.
- *
- */
-
-// Find all conflicts found "within" a selection set, including those found
-// via spreading in fragments. Called when visiting each SelectionSet in the
-// GraphQL Document.
-function findConflictsWithinSelectionSet(
-  context: ValidationContext,
-  cachedFieldsAndFragmentNames,
-  comparedFragmentPairs: PairSet,
-  parentType: ?GraphQLNamedType,
-  selectionSet: SelectionSetNode,
-): Array<Conflict> {
-  const conflicts = [];
-
-  const [fieldMap, fragmentNames] = getFieldsAndFragmentNames(
-    context,
-    cachedFieldsAndFragmentNames,
-    parentType,
-    selectionSet,
-  );
-
-  // (A) Find find all conflicts "within" the fields of this selection set.
-  // Note: this is the *only place* `collectConflictsWithin` is called.
-  collectConflictsWithin(
-    context,
-    conflicts,
-    cachedFieldsAndFragmentNames,
-    comparedFragmentPairs,
-    fieldMap,
-  );
-
-  if (fragmentNames.length !== 0) {
-    // (B) Then collect conflicts between these fields and those represented by
-    // each spread fragment name found.
-    for (let i = 0; i < fragmentNames.length; i++) {
-      collectConflictsBetweenFieldsAndFragment(
-        context,
-        conflicts,
-        cachedFieldsAndFragmentNames,
-        comparedFragmentPairs,
-        false,
-        fieldMap,
-        fragmentNames[i],
-      );
-      // (C) Then compare this fragment with all other fragments found in this
-      // selection set to collect conflicts between fragments spread together.
-      // This compares each item in the list of fragment names to every other
-      // item in that same list (except for itself).
-      for (let j = i + 1; j < fragmentNames.length; j++) {
-        collectConflictsBetweenFragments(
-          context,
-          conflicts,
-          cachedFieldsAndFragmentNames,
-          comparedFragmentPairs,
-          false,
-          fragmentNames[i],
-          fragmentNames[j],
-        );
-      }
-    }
-  }
-  return conflicts;
-}
-
-// Collect all conflicts found between a set of fields and a fragment reference
-// including via spreading in any nested fragments.
-function collectConflictsBetweenFieldsAndFragment(
-  context: ValidationContext,
-  conflicts: Array<Conflict>,
-  cachedFieldsAndFragmentNames,
-  comparedFragmentPairs: PairSet,
-  areMutuallyExclusive: boolean,
-  fieldMap: NodeAndDefCollection,
-  fragmentName: string,
-): void {
-  const fragment = context.getFragment(fragmentName);
-  if (!fragment) {
-    return;
-  }
-
-  const [fieldMap2, fragmentNames2] = getReferencedFieldsAndFragmentNames(
-    context,
-    cachedFieldsAndFragmentNames,
-    fragment,
-  );
-
-  // Do not compare a fragment's fieldMap to itself.
-  if (fieldMap === fieldMap2) {
-    return;
-  }
-
-  // (D) First collect any conflicts between the provided collection of fields
-  // and the collection of fields represented by the given fragment.
-  collectConflictsBetween(
-    context,
-    conflicts,
-    cachedFieldsAndFragmentNames,
-    comparedFragmentPairs,
-    areMutuallyExclusive,
-    fieldMap,
-    fieldMap2,
-  );
-
-  // (E) Then collect any conflicts between the provided collection of fields
-  // and any fragment names found in the given fragment.
-  for (let i = 0; i < fragmentNames2.length; i++) {
-    collectConflictsBetweenFieldsAndFragment(
-      context,
-      conflicts,
-      cachedFieldsAndFragmentNames,
-      comparedFragmentPairs,
-      areMutuallyExclusive,
-      fieldMap,
-      fragmentNames2[i],
-    );
-  }
-}
-
-// Collect all conflicts found between two fragments, including via spreading in
-// any nested fragments.
-function collectConflictsBetweenFragments(
-  context: ValidationContext,
-  conflicts: Array<Conflict>,
-  cachedFieldsAndFragmentNames,
-  comparedFragmentPairs: PairSet,
-  areMutuallyExclusive: boolean,
-  fragmentName1: string,
-  fragmentName2: string,
-): void {
-  // No need to compare a fragment to itself.
-  if (fragmentName1 === fragmentName2) {
-    return;
-  }
-
-  // Memoize so two fragments are not compared for conflicts more than once.
-  if (
-    comparedFragmentPairs.has(
-      fragmentName1,
-      fragmentName2,
-      areMutuallyExclusive,
-    )
-  ) {
-    return;
-  }
-  comparedFragmentPairs.add(fragmentName1, fragmentName2, areMutuallyExclusive);
-
-  const fragment1 = context.getFragment(fragmentName1);
-  const fragment2 = context.getFragment(fragmentName2);
-  if (!fragment1 || !fragment2) {
-    return;
-  }
-
-  const [fieldMap1, fragmentNames1] = getReferencedFieldsAndFragmentNames(
-    context,
-    cachedFieldsAndFragmentNames,
-    fragment1,
-  );
-  const [fieldMap2, fragmentNames2] = getReferencedFieldsAndFragmentNames(
-    context,
-    cachedFieldsAndFragmentNames,
-    fragment2,
-  );
-
-  // (F) First, collect all conflicts between these two collections of fields
-  // (not including any nested fragments).
-  collectConflictsBetween(
-    context,
-    conflicts,
-    cachedFieldsAndFragmentNames,
-    comparedFragmentPairs,
-    areMutuallyExclusive,
-    fieldMap1,
-    fieldMap2,
-  );
-
-  // (G) Then collect conflicts between the first fragment and any nested
-  // fragments spread in the second fragment.
-  for (let j = 0; j < fragmentNames2.length; j++) {
-    collectConflictsBetweenFragments(
-      context,
-      conflicts,
-      cachedFieldsAndFragmentNames,
-      comparedFragmentPairs,
-      areMutuallyExclusive,
-      fragmentName1,
-      fragmentNames2[j],
-    );
-  }
-
-  // (G) Then collect conflicts between the second fragment and any nested
-  // fragments spread in the first fragment.
-  for (let i = 0; i < fragmentNames1.length; i++) {
-    collectConflictsBetweenFragments(
-      context,
-      conflicts,
-      cachedFieldsAndFragmentNames,
-      comparedFragmentPairs,
-      areMutuallyExclusive,
-      fragmentNames1[i],
-      fragmentName2,
-    );
-  }
-}
-
-// Find all conflicts found between two selection sets, including those found
-// via spreading in fragments. Called when determining if conflicts exist
-// between the sub-fields of two overlapping fields.
-function findConflictsBetweenSubSelectionSets(
-  context: ValidationContext,
-  cachedFieldsAndFragmentNames,
-  comparedFragmentPairs: PairSet,
-  areMutuallyExclusive: boolean,
-  parentType1: ?GraphQLNamedType,
-  selectionSet1: SelectionSetNode,
-  parentType2: ?GraphQLNamedType,
-  selectionSet2: SelectionSetNode,
-): Array<Conflict> {
-  const conflicts = [];
-
-  const [fieldMap1, fragmentNames1] = getFieldsAndFragmentNames(
-    context,
-    cachedFieldsAndFragmentNames,
-    parentType1,
-    selectionSet1,
-  );
-  const [fieldMap2, fragmentNames2] = getFieldsAndFragmentNames(
-    context,
-    cachedFieldsAndFragmentNames,
-    parentType2,
-    selectionSet2,
-  );
-
-  // (H) First, collect all conflicts between these two collections of field.
-  collectConflictsBetween(
-    context,
-    conflicts,
-    cachedFieldsAndFragmentNames,
-    comparedFragmentPairs,
-    areMutuallyExclusive,
-    fieldMap1,
-    fieldMap2,
-  );
-
-  // (I) Then collect conflicts between the first collection of fields and
-  // those referenced by each fragment name associated with the second.
-  if (fragmentNames2.length !== 0) {
-    for (let j = 0; j < fragmentNames2.length; j++) {
-      collectConflictsBetweenFieldsAndFragment(
-        context,
-        conflicts,
-        cachedFieldsAndFragmentNames,
-        comparedFragmentPairs,
-        areMutuallyExclusive,
-        fieldMap1,
-        fragmentNames2[j],
-      );
-    }
-  }
-
-  // (I) Then collect conflicts between the second collection of fields and
-  // those referenced by each fragment name associated with the first.
-  if (fragmentNames1.length !== 0) {
-    for (let i = 0; i < fragmentNames1.length; i++) {
-      collectConflictsBetweenFieldsAndFragment(
-        context,
-        conflicts,
-        cachedFieldsAndFragmentNames,
-        comparedFragmentPairs,
-        areMutuallyExclusive,
-        fieldMap2,
-        fragmentNames1[i],
-      );
-    }
-  }
-
-  // (J) Also collect conflicts between any fragment names by the first and
-  // fragment names by the second. This compares each item in the first set of
-  // names to each item in the second set of names.
-  for (let i = 0; i < fragmentNames1.length; i++) {
-    for (let j = 0; j < fragmentNames2.length; j++) {
-      collectConflictsBetweenFragments(
-        context,
-        conflicts,
-        cachedFieldsAndFragmentNames,
-        comparedFragmentPairs,
-        areMutuallyExclusive,
-        fragmentNames1[i],
-        fragmentNames2[j],
-      );
-    }
-  }
-  return conflicts;
-}
-
-// Collect all Conflicts "within" one collection of fields.
-function collectConflictsWithin(
-  context: ValidationContext,
-  conflicts: Array<Conflict>,
-  cachedFieldsAndFragmentNames,
-  comparedFragmentPairs: PairSet,
-  fieldMap: NodeAndDefCollection,
-): void {
-  // A field map is a keyed collection, where each key represents a response
-  // name and the value at that key is a list of all fields which provide that
-  // response name. For every response name, if there are multiple fields, they
-  // must be compared to find a potential conflict.
-  for (const [responseName, fields] of objectEntries(fieldMap)) {
-    // This compares every field in the list to every other field in this list
-    // (except to itself). If the list only has one item, nothing needs to
-    // be compared.
-    if (fields.length > 1) {
-      for (let i = 0; i < fields.length; i++) {
-        for (let j = i + 1; j < fields.length; j++) {
-          const conflict = findConflict(
-            context,
-            cachedFieldsAndFragmentNames,
-            comparedFragmentPairs,
-            false, // within one collection is never mutually exclusive
-            responseName,
-            fields[i],
-            fields[j],
-          );
-          if (conflict) {
-            conflicts.push(conflict);
-          }
-        }
-      }
-    }
-  }
-}
-
-// Collect all Conflicts between two collections of fields. This is similar to,
-// but different from the `collectConflictsWithin` function above. This check
-// assumes that `collectConflictsWithin` has already been called on each
-// provided collection of fields. This is true because this validator traverses
-// each individual selection set.
-function collectConflictsBetween(
-  context: ValidationContext,
-  conflicts: Array<Conflict>,
-  cachedFieldsAndFragmentNames,
-  comparedFragmentPairs: PairSet,
-  parentFieldsAreMutuallyExclusive: boolean,
-  fieldMap1: NodeAndDefCollection,
-  fieldMap2: NodeAndDefCollection,
-): void {
-  // A field map is a keyed collection, where each key represents a response
-  // name and the value at that key is a list of all fields which provide that
-  // response name. For any response name which appears in both provided field
-  // maps, each field from the first field map must be compared to every field
-  // in the second field map to find potential conflicts.
-  for (const responseName of Object.keys(fieldMap1)) {
-    const fields2 = fieldMap2[responseName];
-    if (fields2) {
-      const fields1 = fieldMap1[responseName];
-      for (let i = 0; i < fields1.length; i++) {
-        for (let j = 0; j < fields2.length; j++) {
-          const conflict = findConflict(
-            context,
-            cachedFieldsAndFragmentNames,
-            comparedFragmentPairs,
-            parentFieldsAreMutuallyExclusive,
-            responseName,
-            fields1[i],
-            fields2[j],
-          );
-          if (conflict) {
-            conflicts.push(conflict);
-          }
-        }
-      }
-    }
-  }
-}
-
-// Determines if there is a conflict between two particular fields, including
-// comparing their sub-fields.
-function findConflict(
-  context: ValidationContext,
-  cachedFieldsAndFragmentNames,
-  comparedFragmentPairs: PairSet,
-  parentFieldsAreMutuallyExclusive: boolean,
-  responseName: string,
-  field1: NodeAndDef,
-  field2: NodeAndDef,
-): ?Conflict {
-  const [parentType1, node1, def1] = field1;
-  const [parentType2, node2, def2] = field2;
-
-  // If it is known that two fields could not possibly apply at the same
-  // time, due to the parent types, then it is safe to permit them to diverge
-  // in aliased field or arguments used as they will not present any ambiguity
-  // by differing.
-  // It is known that two parent types could never overlap if they are
-  // different Object types. Interface or Union types might overlap - if not
-  // in the current state of the schema, then perhaps in some future version,
-  // thus may not safely diverge.
-  const areMutuallyExclusive =
-    parentFieldsAreMutuallyExclusive ||
-    (parentType1 !== parentType2 &&
-      isObjectType(parentType1) &&
-      isObjectType(parentType2));
-
-  if (!areMutuallyExclusive) {
-    // Two aliases must refer to the same field.
-    const name1 = node1.name.value;
-    const name2 = node2.name.value;
-    if (name1 !== name2) {
-      return [
-        [responseName, `"${name1}" and "${name2}" are different fields`],
-        [node1],
-        [node2],
-      ];
-    }
-
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-    const args1 = node1.arguments ?? [];
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-    const args2 = node2.arguments ?? [];
-    // Two field calls must have the same arguments.
-    if (!sameArguments(args1, args2)) {
-      return [
-        [responseName, 'they have differing arguments'],
-        [node1],
-        [node2],
-      ];
-    }
-  }
-
-  // The return type for each field.
-  const type1 = def1?.type;
-  const type2 = def2?.type;
-
-  if (type1 && type2 && doTypesConflict(type1, type2)) {
-    return [
-      [
-        responseName,
-        `they return conflicting types "${inspect(type1)}" and "${inspect(
-          type2,
-        )}"`,
-      ],
-      [node1],
-      [node2],
-    ];
-  }
-
-  // Collect and compare sub-fields. Use the same "visited fragment names" list
-  // for both collections so fields in a fragment reference are never
-  // compared to themselves.
-  const selectionSet1 = node1.selectionSet;
-  const selectionSet2 = node2.selectionSet;
-  if (selectionSet1 && selectionSet2) {
-    const conflicts = findConflictsBetweenSubSelectionSets(
-      context,
-      cachedFieldsAndFragmentNames,
-      comparedFragmentPairs,
-      areMutuallyExclusive,
-      getNamedType(type1),
-      selectionSet1,
-      getNamedType(type2),
-      selectionSet2,
-    );
-    return subfieldConflicts(conflicts, responseName, node1, node2);
-  }
-}
-
-function sameArguments(
-  arguments1: $ReadOnlyArray<ArgumentNode>,
-  arguments2: $ReadOnlyArray<ArgumentNode>,
-): boolean {
-  if (arguments1.length !== arguments2.length) {
-    return false;
-  }
-  return arguments1.every(argument1 => {
-    const argument2 = find(
-      arguments2,
-      argument => argument.name.value === argument1.name.value,
-    );
-    if (!argument2) {
-      return false;
-    }
-    return sameValue(argument1.value, argument2.value);
-  });
-}
-
-function sameValue(value1, value2) {
-  return print(value1) === print(value2);
-}
-
-// Two types conflict if both types could not apply to a value simultaneously.
-// Composite types are ignored as their individual field types will be compared
-// later recursively. However List and Non-Null types must match.
-function doTypesConflict(
-  type1: GraphQLOutputType,
-  type2: GraphQLOutputType,
-): boolean {
-  if (isListType(type1)) {
-    return isListType(type2)
-      ? doTypesConflict(type1.ofType, type2.ofType)
-      : true;
-  }
-  if (isListType(type2)) {
-    return true;
-  }
-  if (isNonNullType(type1)) {
-    return isNonNullType(type2)
-      ? doTypesConflict(type1.ofType, type2.ofType)
-      : true;
-  }
-  if (isNonNullType(type2)) {
-    return true;
-  }
-  if (isLeafType(type1) || isLeafType(type2)) {
-    return type1 !== type2;
-  }
-  return false;
-}
-
-// Given a selection set, return the collection of fields (a mapping of response
-// name to field nodes and definitions) as well as a list of fragment names
-// referenced via fragment spreads.
-function getFieldsAndFragmentNames(
-  context: ValidationContext,
-  cachedFieldsAndFragmentNames,
-  parentType: ?GraphQLNamedType,
-  selectionSet: SelectionSetNode,
-): [NodeAndDefCollection, Array<string>] {
-  let cached = cachedFieldsAndFragmentNames.get(selectionSet);
-  if (!cached) {
-    const nodeAndDefs = Object.create(null);
-    const fragmentNames = Object.create(null);
-    _collectFieldsAndFragmentNames(
-      context,
-      parentType,
-      selectionSet,
-      nodeAndDefs,
-      fragmentNames,
-    );
-    cached = [nodeAndDefs, Object.keys(fragmentNames)];
-    cachedFieldsAndFragmentNames.set(selectionSet, cached);
-  }
-  return cached;
-}
-
-// Given a reference to a fragment, return the represented collection of fields
-// as well as a list of nested fragment names referenced via fragment spreads.
-function getReferencedFieldsAndFragmentNames(
-  context: ValidationContext,
-  cachedFieldsAndFragmentNames,
-  fragment: FragmentDefinitionNode,
-) {
-  // Short-circuit building a type from the node if possible.
-  const cached = cachedFieldsAndFragmentNames.get(fragment.selectionSet);
-  if (cached) {
-    return cached;
-  }
-
-  const fragmentType = typeFromAST(context.getSchema(), fragment.typeCondition);
-  return getFieldsAndFragmentNames(
-    context,
-    cachedFieldsAndFragmentNames,
-    fragmentType,
-    fragment.selectionSet,
-  );
-}
-
-function _collectFieldsAndFragmentNames(
-  context: ValidationContext,
-  parentType: ?GraphQLNamedType,
-  selectionSet: SelectionSetNode,
-  nodeAndDefs,
-  fragmentNames,
-): void {
-  for (const selection of selectionSet.selections) {
-    switch (selection.kind) {
-      case Kind.FIELD: {
-        const fieldName = selection.name.value;
-        let fieldDef;
-        if (isObjectType(parentType) || isInterfaceType(parentType)) {
-          fieldDef = parentType.getFields()[fieldName];
-        }
-        const responseName = selection.alias
-          ? selection.alias.value
-          : fieldName;
-        if (!nodeAndDefs[responseName]) {
-          nodeAndDefs[responseName] = [];
-        }
-        nodeAndDefs[responseName].push([parentType, selection, fieldDef]);
-        break;
-      }
-      case Kind.FRAGMENT_SPREAD:
-        fragmentNames[selection.name.value] = true;
-        break;
-      case Kind.INLINE_FRAGMENT: {
-        const typeCondition = selection.typeCondition;
-        const inlineFragmentType = typeCondition
-          ? typeFromAST(context.getSchema(), typeCondition)
-          : parentType;
-        _collectFieldsAndFragmentNames(
-          context,
-          inlineFragmentType,
-          selection.selectionSet,
-          nodeAndDefs,
-          fragmentNames,
-        );
-        break;
-      }
-    }
-  }
-}
-
-// Given a series of Conflicts which occurred between two sub-fields, generate
-// a single Conflict.
-function subfieldConflicts(
-  conflicts: $ReadOnlyArray<Conflict>,
-  responseName: string,
-  node1: FieldNode,
-  node2: FieldNode,
-): ?Conflict {
-  if (conflicts.length > 0) {
-    return [
-      [responseName, conflicts.map(([reason]) => reason)],
-      conflicts.reduce((allFields, [, fields1]) => allFields.concat(fields1), [
-        node1,
-      ]),
-      conflicts.reduce(
-        (allFields, [, , fields2]) => allFields.concat(fields2),
-        [node2],
-      ),
-    ];
-  }
-}
-
-/**
- * A way to keep track of pairs of things when the ordering of the pair does
- * not matter. We do this by maintaining a sort of double adjacency sets.
- */
-class PairSet {
-  _data: ObjMap<ObjMap<boolean>>;
-
-  constructor(): void {
-    this._data = Object.create(null);
-  }
-
-  has(a: string, b: string, areMutuallyExclusive: boolean) {
-    const first = this._data[a];
-    const result = first && first[b];
-    if (result === undefined) {
-      return false;
-    }
-    // areMutuallyExclusive being false is a superset of being true,
-    // hence if we want to know if this PairSet "has" these two with no
-    // exclusivity, we have to ensure it was added as such.
-    if (areMutuallyExclusive === false) {
-      return result === false;
-    }
-    return true;
-  }
-
-  add(a: string, b: string, areMutuallyExclusive: boolean) {
-    _pairSetAdd(this._data, a, b, areMutuallyExclusive);
-    _pairSetAdd(this._data, b, a, areMutuallyExclusive);
-  }
-}
-
-function _pairSetAdd(data, a, b, areMutuallyExclusive) {
-  let map = data[a];
-  if (!map) {
-    map = Object.create(null);
-    data[a] = map;
-  }
-  map[b] = areMutuallyExclusive;
-}
diff --git a/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.mjs b/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.mjs
deleted file mode 100644
index 02cfdde..0000000
--- a/node_modules/graphql/validation/rules/OverlappingFieldsCanBeMergedRule.mjs
+++ /dev/null
@@ -1,572 +0,0 @@
-import find from "../../polyfills/find.mjs";
-import objectEntries from "../../polyfills/objectEntries.mjs";
-import inspect from "../../jsutils/inspect.mjs";
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { Kind } from "../../language/kinds.mjs";
-import { print } from "../../language/printer.mjs";
-import { getNamedType, isNonNullType, isLeafType, isObjectType, isListType, isInterfaceType } from "../../type/definition.mjs";
-import { typeFromAST } from "../../utilities/typeFromAST.mjs";
-
-function reasonMessage(reason) {
-  if (Array.isArray(reason)) {
-    return reason.map(function (_ref) {
-      var responseName = _ref[0],
-          subReason = _ref[1];
-      return "subfields \"".concat(responseName, "\" conflict because ") + reasonMessage(subReason);
-    }).join(' and ');
-  }
-
-  return reason;
-}
-/**
- * Overlapping fields can be merged
- *
- * A selection set is only valid if all fields (including spreading any
- * fragments) either correspond to distinct response names or can be merged
- * without ambiguity.
- */
-
-
-export function OverlappingFieldsCanBeMergedRule(context) {
-  // A memoization for when two fragments are compared "between" each other for
-  // conflicts. Two fragments may be compared many times, so memoizing this can
-  // dramatically improve the performance of this validator.
-  var comparedFragmentPairs = new PairSet(); // A cache for the "field map" and list of fragment names found in any given
-  // selection set. Selection sets may be asked for this information multiple
-  // times, so this improves the performance of this validator.
-
-  var cachedFieldsAndFragmentNames = new Map();
-  return {
-    SelectionSet: function SelectionSet(selectionSet) {
-      var conflicts = findConflictsWithinSelectionSet(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, context.getParentType(), selectionSet);
-
-      for (var _i2 = 0; _i2 < conflicts.length; _i2++) {
-        var _ref3 = conflicts[_i2];
-        var _ref2$ = _ref3[0];
-        var responseName = _ref2$[0];
-        var reason = _ref2$[1];
-        var fields1 = _ref3[1];
-        var fields2 = _ref3[2];
-        var reasonMsg = reasonMessage(reason);
-        context.reportError(new GraphQLError("Fields \"".concat(responseName, "\" conflict because ").concat(reasonMsg, ". Use different aliases on the fields to fetch both if this was intentional."), fields1.concat(fields2)));
-      }
-    }
-  };
-}
-
-/**
- * Algorithm:
- *
- * Conflicts occur when two fields exist in a query which will produce the same
- * response name, but represent differing values, thus creating a conflict.
- * The algorithm below finds all conflicts via making a series of comparisons
- * between fields. In order to compare as few fields as possible, this makes
- * a series of comparisons "within" sets of fields and "between" sets of fields.
- *
- * Given any selection set, a collection produces both a set of fields by
- * also including all inline fragments, as well as a list of fragments
- * referenced by fragment spreads.
- *
- * A) Each selection set represented in the document first compares "within" its
- * collected set of fields, finding any conflicts between every pair of
- * overlapping fields.
- * Note: This is the *only time* that a the fields "within" a set are compared
- * to each other. After this only fields "between" sets are compared.
- *
- * B) Also, if any fragment is referenced in a selection set, then a
- * comparison is made "between" the original set of fields and the
- * referenced fragment.
- *
- * C) Also, if multiple fragments are referenced, then comparisons
- * are made "between" each referenced fragment.
- *
- * D) When comparing "between" a set of fields and a referenced fragment, first
- * a comparison is made between each field in the original set of fields and
- * each field in the the referenced set of fields.
- *
- * E) Also, if any fragment is referenced in the referenced selection set,
- * then a comparison is made "between" the original set of fields and the
- * referenced fragment (recursively referring to step D).
- *
- * F) When comparing "between" two fragments, first a comparison is made between
- * each field in the first referenced set of fields and each field in the the
- * second referenced set of fields.
- *
- * G) Also, any fragments referenced by the first must be compared to the
- * second, and any fragments referenced by the second must be compared to the
- * first (recursively referring to step F).
- *
- * H) When comparing two fields, if both have selection sets, then a comparison
- * is made "between" both selection sets, first comparing the set of fields in
- * the first selection set with the set of fields in the second.
- *
- * I) Also, if any fragment is referenced in either selection set, then a
- * comparison is made "between" the other set of fields and the
- * referenced fragment.
- *
- * J) Also, if two fragments are referenced in both selection sets, then a
- * comparison is made "between" the two fragments.
- *
- */
-// Find all conflicts found "within" a selection set, including those found
-// via spreading in fragments. Called when visiting each SelectionSet in the
-// GraphQL Document.
-function findConflictsWithinSelectionSet(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentType, selectionSet) {
-  var conflicts = [];
-
-  var _getFieldsAndFragment = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet),
-      fieldMap = _getFieldsAndFragment[0],
-      fragmentNames = _getFieldsAndFragment[1]; // (A) Find find all conflicts "within" the fields of this selection set.
-  // Note: this is the *only place* `collectConflictsWithin` is called.
-
-
-  collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap);
-
-  if (fragmentNames.length !== 0) {
-    // (B) Then collect conflicts between these fields and those represented by
-    // each spread fragment name found.
-    for (var i = 0; i < fragmentNames.length; i++) {
-      collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fieldMap, fragmentNames[i]); // (C) Then compare this fragment with all other fragments found in this
-      // selection set to collect conflicts between fragments spread together.
-      // This compares each item in the list of fragment names to every other
-      // item in that same list (except for itself).
-
-      for (var j = i + 1; j < fragmentNames.length; j++) {
-        collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fragmentNames[i], fragmentNames[j]);
-      }
-    }
-  }
-
-  return conflicts;
-} // Collect all conflicts found between a set of fields and a fragment reference
-// including via spreading in any nested fragments.
-
-
-function collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fragmentName) {
-  var fragment = context.getFragment(fragmentName);
-
-  if (!fragment) {
-    return;
-  }
-
-  var _getReferencedFieldsA = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment),
-      fieldMap2 = _getReferencedFieldsA[0],
-      fragmentNames2 = _getReferencedFieldsA[1]; // Do not compare a fragment's fieldMap to itself.
-
-
-  if (fieldMap === fieldMap2) {
-    return;
-  } // (D) First collect any conflicts between the provided collection of fields
-  // and the collection of fields represented by the given fragment.
-
-
-  collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fieldMap2); // (E) Then collect any conflicts between the provided collection of fields
-  // and any fragment names found in the given fragment.
-
-  for (var i = 0; i < fragmentNames2.length; i++) {
-    collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fragmentNames2[i]);
-  }
-} // Collect all conflicts found between two fragments, including via spreading in
-// any nested fragments.
-
-
-function collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2) {
-  // No need to compare a fragment to itself.
-  if (fragmentName1 === fragmentName2) {
-    return;
-  } // Memoize so two fragments are not compared for conflicts more than once.
-
-
-  if (comparedFragmentPairs.has(fragmentName1, fragmentName2, areMutuallyExclusive)) {
-    return;
-  }
-
-  comparedFragmentPairs.add(fragmentName1, fragmentName2, areMutuallyExclusive);
-  var fragment1 = context.getFragment(fragmentName1);
-  var fragment2 = context.getFragment(fragmentName2);
-
-  if (!fragment1 || !fragment2) {
-    return;
-  }
-
-  var _getReferencedFieldsA2 = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment1),
-      fieldMap1 = _getReferencedFieldsA2[0],
-      fragmentNames1 = _getReferencedFieldsA2[1];
-
-  var _getReferencedFieldsA3 = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment2),
-      fieldMap2 = _getReferencedFieldsA3[0],
-      fragmentNames2 = _getReferencedFieldsA3[1]; // (F) First, collect all conflicts between these two collections of fields
-  // (not including any nested fragments).
-
-
-  collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (G) Then collect conflicts between the first fragment and any nested
-  // fragments spread in the second fragment.
-
-  for (var j = 0; j < fragmentNames2.length; j++) {
-    collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentNames2[j]);
-  } // (G) Then collect conflicts between the second fragment and any nested
-  // fragments spread in the first fragment.
-
-
-  for (var i = 0; i < fragmentNames1.length; i++) {
-    collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentNames1[i], fragmentName2);
-  }
-} // Find all conflicts found between two selection sets, including those found
-// via spreading in fragments. Called when determining if conflicts exist
-// between the sub-fields of two overlapping fields.
-
-
-function findConflictsBetweenSubSelectionSets(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, parentType1, selectionSet1, parentType2, selectionSet2) {
-  var conflicts = [];
-
-  var _getFieldsAndFragment2 = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType1, selectionSet1),
-      fieldMap1 = _getFieldsAndFragment2[0],
-      fragmentNames1 = _getFieldsAndFragment2[1];
-
-  var _getFieldsAndFragment3 = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType2, selectionSet2),
-      fieldMap2 = _getFieldsAndFragment3[0],
-      fragmentNames2 = _getFieldsAndFragment3[1]; // (H) First, collect all conflicts between these two collections of field.
-
-
-  collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (I) Then collect conflicts between the first collection of fields and
-  // those referenced by each fragment name associated with the second.
-
-  if (fragmentNames2.length !== 0) {
-    for (var j = 0; j < fragmentNames2.length; j++) {
-      collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fragmentNames2[j]);
-    }
-  } // (I) Then collect conflicts between the second collection of fields and
-  // those referenced by each fragment name associated with the first.
-
-
-  if (fragmentNames1.length !== 0) {
-    for (var i = 0; i < fragmentNames1.length; i++) {
-      collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap2, fragmentNames1[i]);
-    }
-  } // (J) Also collect conflicts between any fragment names by the first and
-  // fragment names by the second. This compares each item in the first set of
-  // names to each item in the second set of names.
-
-
-  for (var _i3 = 0; _i3 < fragmentNames1.length; _i3++) {
-    for (var _j = 0; _j < fragmentNames2.length; _j++) {
-      collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentNames1[_i3], fragmentNames2[_j]);
-    }
-  }
-
-  return conflicts;
-} // Collect all Conflicts "within" one collection of fields.
-
-
-function collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap) {
-  // A field map is a keyed collection, where each key represents a response
-  // name and the value at that key is a list of all fields which provide that
-  // response name. For every response name, if there are multiple fields, they
-  // must be compared to find a potential conflict.
-  for (var _i5 = 0, _objectEntries2 = objectEntries(fieldMap); _i5 < _objectEntries2.length; _i5++) {
-    var _ref5 = _objectEntries2[_i5];
-    var responseName = _ref5[0];
-    var fields = _ref5[1];
-
-    // This compares every field in the list to every other field in this list
-    // (except to itself). If the list only has one item, nothing needs to
-    // be compared.
-    if (fields.length > 1) {
-      for (var i = 0; i < fields.length; i++) {
-        for (var j = i + 1; j < fields.length; j++) {
-          var conflict = findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, // within one collection is never mutually exclusive
-          responseName, fields[i], fields[j]);
-
-          if (conflict) {
-            conflicts.push(conflict);
-          }
-        }
-      }
-    }
-  }
-} // Collect all Conflicts between two collections of fields. This is similar to,
-// but different from the `collectConflictsWithin` function above. This check
-// assumes that `collectConflictsWithin` has already been called on each
-// provided collection of fields. This is true because this validator traverses
-// each individual selection set.
-
-
-function collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, fieldMap1, fieldMap2) {
-  // A field map is a keyed collection, where each key represents a response
-  // name and the value at that key is a list of all fields which provide that
-  // response name. For any response name which appears in both provided field
-  // maps, each field from the first field map must be compared to every field
-  // in the second field map to find potential conflicts.
-  for (var _i7 = 0, _Object$keys2 = Object.keys(fieldMap1); _i7 < _Object$keys2.length; _i7++) {
-    var responseName = _Object$keys2[_i7];
-    var fields2 = fieldMap2[responseName];
-
-    if (fields2) {
-      var fields1 = fieldMap1[responseName];
-
-      for (var i = 0; i < fields1.length; i++) {
-        for (var j = 0; j < fields2.length; j++) {
-          var conflict = findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, fields1[i], fields2[j]);
-
-          if (conflict) {
-            conflicts.push(conflict);
-          }
-        }
-      }
-    }
-  }
-} // Determines if there is a conflict between two particular fields, including
-// comparing their sub-fields.
-
-
-function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2) {
-  var parentType1 = field1[0],
-      node1 = field1[1],
-      def1 = field1[2];
-  var parentType2 = field2[0],
-      node2 = field2[1],
-      def2 = field2[2]; // If it is known that two fields could not possibly apply at the same
-  // time, due to the parent types, then it is safe to permit them to diverge
-  // in aliased field or arguments used as they will not present any ambiguity
-  // by differing.
-  // It is known that two parent types could never overlap if they are
-  // different Object types. Interface or Union types might overlap - if not
-  // in the current state of the schema, then perhaps in some future version,
-  // thus may not safely diverge.
-
-  var areMutuallyExclusive = parentFieldsAreMutuallyExclusive || parentType1 !== parentType2 && isObjectType(parentType1) && isObjectType(parentType2);
-
-  if (!areMutuallyExclusive) {
-    var _node1$arguments, _node2$arguments;
-
-    // Two aliases must refer to the same field.
-    var name1 = node1.name.value;
-    var name2 = node2.name.value;
-
-    if (name1 !== name2) {
-      return [[responseName, "\"".concat(name1, "\" and \"").concat(name2, "\" are different fields")], [node1], [node2]];
-    }
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-
-    var args1 = (_node1$arguments = node1.arguments) !== null && _node1$arguments !== void 0 ? _node1$arguments : [];
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-    var args2 = (_node2$arguments = node2.arguments) !== null && _node2$arguments !== void 0 ? _node2$arguments : []; // Two field calls must have the same arguments.
-
-    if (!sameArguments(args1, args2)) {
-      return [[responseName, 'they have differing arguments'], [node1], [node2]];
-    }
-  } // The return type for each field.
-
-
-  var type1 = def1 === null || def1 === void 0 ? void 0 : def1.type;
-  var type2 = def2 === null || def2 === void 0 ? void 0 : def2.type;
-
-  if (type1 && type2 && doTypesConflict(type1, type2)) {
-    return [[responseName, "they return conflicting types \"".concat(inspect(type1), "\" and \"").concat(inspect(type2), "\"")], [node1], [node2]];
-  } // Collect and compare sub-fields. Use the same "visited fragment names" list
-  // for both collections so fields in a fragment reference are never
-  // compared to themselves.
-
-
-  var selectionSet1 = node1.selectionSet;
-  var selectionSet2 = node2.selectionSet;
-
-  if (selectionSet1 && selectionSet2) {
-    var conflicts = findConflictsBetweenSubSelectionSets(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, getNamedType(type1), selectionSet1, getNamedType(type2), selectionSet2);
-    return subfieldConflicts(conflicts, responseName, node1, node2);
-  }
-}
-
-function sameArguments(arguments1, arguments2) {
-  if (arguments1.length !== arguments2.length) {
-    return false;
-  }
-
-  return arguments1.every(function (argument1) {
-    var argument2 = find(arguments2, function (argument) {
-      return argument.name.value === argument1.name.value;
-    });
-
-    if (!argument2) {
-      return false;
-    }
-
-    return sameValue(argument1.value, argument2.value);
-  });
-}
-
-function sameValue(value1, value2) {
-  return print(value1) === print(value2);
-} // Two types conflict if both types could not apply to a value simultaneously.
-// Composite types are ignored as their individual field types will be compared
-// later recursively. However List and Non-Null types must match.
-
-
-function doTypesConflict(type1, type2) {
-  if (isListType(type1)) {
-    return isListType(type2) ? doTypesConflict(type1.ofType, type2.ofType) : true;
-  }
-
-  if (isListType(type2)) {
-    return true;
-  }
-
-  if (isNonNullType(type1)) {
-    return isNonNullType(type2) ? doTypesConflict(type1.ofType, type2.ofType) : true;
-  }
-
-  if (isNonNullType(type2)) {
-    return true;
-  }
-
-  if (isLeafType(type1) || isLeafType(type2)) {
-    return type1 !== type2;
-  }
-
-  return false;
-} // Given a selection set, return the collection of fields (a mapping of response
-// name to field nodes and definitions) as well as a list of fragment names
-// referenced via fragment spreads.
-
-
-function getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet) {
-  var cached = cachedFieldsAndFragmentNames.get(selectionSet);
-
-  if (!cached) {
-    var nodeAndDefs = Object.create(null);
-    var fragmentNames = Object.create(null);
-
-    _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeAndDefs, fragmentNames);
-
-    cached = [nodeAndDefs, Object.keys(fragmentNames)];
-    cachedFieldsAndFragmentNames.set(selectionSet, cached);
-  }
-
-  return cached;
-} // Given a reference to a fragment, return the represented collection of fields
-// as well as a list of nested fragment names referenced via fragment spreads.
-
-
-function getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment) {
-  // Short-circuit building a type from the node if possible.
-  var cached = cachedFieldsAndFragmentNames.get(fragment.selectionSet);
-
-  if (cached) {
-    return cached;
-  }
-
-  var fragmentType = typeFromAST(context.getSchema(), fragment.typeCondition);
-  return getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragmentType, fragment.selectionSet);
-}
-
-function _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeAndDefs, fragmentNames) {
-  for (var _i9 = 0, _selectionSet$selecti2 = selectionSet.selections; _i9 < _selectionSet$selecti2.length; _i9++) {
-    var selection = _selectionSet$selecti2[_i9];
-
-    switch (selection.kind) {
-      case Kind.FIELD:
-        {
-          var fieldName = selection.name.value;
-          var fieldDef = void 0;
-
-          if (isObjectType(parentType) || isInterfaceType(parentType)) {
-            fieldDef = parentType.getFields()[fieldName];
-          }
-
-          var responseName = selection.alias ? selection.alias.value : fieldName;
-
-          if (!nodeAndDefs[responseName]) {
-            nodeAndDefs[responseName] = [];
-          }
-
-          nodeAndDefs[responseName].push([parentType, selection, fieldDef]);
-          break;
-        }
-
-      case Kind.FRAGMENT_SPREAD:
-        fragmentNames[selection.name.value] = true;
-        break;
-
-      case Kind.INLINE_FRAGMENT:
-        {
-          var typeCondition = selection.typeCondition;
-          var inlineFragmentType = typeCondition ? typeFromAST(context.getSchema(), typeCondition) : parentType;
-
-          _collectFieldsAndFragmentNames(context, inlineFragmentType, selection.selectionSet, nodeAndDefs, fragmentNames);
-
-          break;
-        }
-    }
-  }
-} // Given a series of Conflicts which occurred between two sub-fields, generate
-// a single Conflict.
-
-
-function subfieldConflicts(conflicts, responseName, node1, node2) {
-  if (conflicts.length > 0) {
-    return [[responseName, conflicts.map(function (_ref6) {
-      var reason = _ref6[0];
-      return reason;
-    })], conflicts.reduce(function (allFields, _ref7) {
-      var fields1 = _ref7[1];
-      return allFields.concat(fields1);
-    }, [node1]), conflicts.reduce(function (allFields, _ref8) {
-      var fields2 = _ref8[2];
-      return allFields.concat(fields2);
-    }, [node2])];
-  }
-}
-/**
- * A way to keep track of pairs of things when the ordering of the pair does
- * not matter. We do this by maintaining a sort of double adjacency sets.
- */
-
-
-var PairSet =
-/*#__PURE__*/
-function () {
-  function PairSet() {
-    this._data = Object.create(null);
-  }
-
-  var _proto = PairSet.prototype;
-
-  _proto.has = function has(a, b, areMutuallyExclusive) {
-    var first = this._data[a];
-    var result = first && first[b];
-
-    if (result === undefined) {
-      return false;
-    } // areMutuallyExclusive being false is a superset of being true,
-    // hence if we want to know if this PairSet "has" these two with no
-    // exclusivity, we have to ensure it was added as such.
-
-
-    if (areMutuallyExclusive === false) {
-      return result === false;
-    }
-
-    return true;
-  };
-
-  _proto.add = function add(a, b, areMutuallyExclusive) {
-    _pairSetAdd(this._data, a, b, areMutuallyExclusive);
-
-    _pairSetAdd(this._data, b, a, areMutuallyExclusive);
-  };
-
-  return PairSet;
-}();
-
-function _pairSetAdd(data, a, b, areMutuallyExclusive) {
-  var map = data[a];
-
-  if (!map) {
-    map = Object.create(null);
-    data[a] = map;
-  }
-
-  map[b] = areMutuallyExclusive;
-}
diff --git a/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.d.ts b/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.d.ts
deleted file mode 100644
index 36f551d..0000000
--- a/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * Possible fragment spread
- *
- * A fragment spread is only valid if the type condition could ever possibly
- * be true: if there is a non-empty intersection of the possible parent types,
- * and possible types which pass the type condition.
- */
-export function PossibleFragmentSpreadsRule(
-  context: ValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.js b/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.js
deleted file mode 100644
index 3be930f..0000000
--- a/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.js
+++ /dev/null
@@ -1,63 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.PossibleFragmentSpreadsRule = PossibleFragmentSpreadsRule;
-
-var _inspect = _interopRequireDefault(require("../../jsutils/inspect"));
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _definition = require("../../type/definition");
-
-var _typeFromAST = require("../../utilities/typeFromAST");
-
-var _typeComparators = require("../../utilities/typeComparators");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Possible fragment spread
- *
- * A fragment spread is only valid if the type condition could ever possibly
- * be true: if there is a non-empty intersection of the possible parent types,
- * and possible types which pass the type condition.
- */
-function PossibleFragmentSpreadsRule(context) {
-  return {
-    InlineFragment: function InlineFragment(node) {
-      var fragType = context.getType();
-      var parentType = context.getParentType();
-
-      if ((0, _definition.isCompositeType)(fragType) && (0, _definition.isCompositeType)(parentType) && !(0, _typeComparators.doTypesOverlap)(context.getSchema(), fragType, parentType)) {
-        var parentTypeStr = (0, _inspect.default)(parentType);
-        var fragTypeStr = (0, _inspect.default)(fragType);
-        context.reportError(new _GraphQLError.GraphQLError("Fragment cannot be spread here as objects of type \"".concat(parentTypeStr, "\" can never be of type \"").concat(fragTypeStr, "\"."), node));
-      }
-    },
-    FragmentSpread: function FragmentSpread(node) {
-      var fragName = node.name.value;
-      var fragType = getFragmentType(context, fragName);
-      var parentType = context.getParentType();
-
-      if (fragType && parentType && !(0, _typeComparators.doTypesOverlap)(context.getSchema(), fragType, parentType)) {
-        var parentTypeStr = (0, _inspect.default)(parentType);
-        var fragTypeStr = (0, _inspect.default)(fragType);
-        context.reportError(new _GraphQLError.GraphQLError("Fragment \"".concat(fragName, "\" cannot be spread here as objects of type \"").concat(parentTypeStr, "\" can never be of type \"").concat(fragTypeStr, "\"."), node));
-      }
-    }
-  };
-}
-
-function getFragmentType(context, name) {
-  var frag = context.getFragment(name);
-
-  if (frag) {
-    var type = (0, _typeFromAST.typeFromAST)(context.getSchema(), frag.typeCondition);
-
-    if ((0, _definition.isCompositeType)(type)) {
-      return type;
-    }
-  }
-}
diff --git a/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.js.flow b/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.js.flow
deleted file mode 100644
index e374d59..0000000
--- a/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.js.flow
+++ /dev/null
@@ -1,75 +0,0 @@
-// @flow strict
-
-import inspect from '../../jsutils/inspect';
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { type ASTVisitor } from '../../language/visitor';
-
-import { isCompositeType } from '../../type/definition';
-
-import { typeFromAST } from '../../utilities/typeFromAST';
-import { doTypesOverlap } from '../../utilities/typeComparators';
-
-import { type ValidationContext } from '../ValidationContext';
-
-/**
- * Possible fragment spread
- *
- * A fragment spread is only valid if the type condition could ever possibly
- * be true: if there is a non-empty intersection of the possible parent types,
- * and possible types which pass the type condition.
- */
-export function PossibleFragmentSpreadsRule(
-  context: ValidationContext,
-): ASTVisitor {
-  return {
-    InlineFragment(node) {
-      const fragType = context.getType();
-      const parentType = context.getParentType();
-      if (
-        isCompositeType(fragType) &&
-        isCompositeType(parentType) &&
-        !doTypesOverlap(context.getSchema(), fragType, parentType)
-      ) {
-        const parentTypeStr = inspect(parentType);
-        const fragTypeStr = inspect(fragType);
-        context.reportError(
-          new GraphQLError(
-            `Fragment cannot be spread here as objects of type "${parentTypeStr}" can never be of type "${fragTypeStr}".`,
-            node,
-          ),
-        );
-      }
-    },
-    FragmentSpread(node) {
-      const fragName = node.name.value;
-      const fragType = getFragmentType(context, fragName);
-      const parentType = context.getParentType();
-      if (
-        fragType &&
-        parentType &&
-        !doTypesOverlap(context.getSchema(), fragType, parentType)
-      ) {
-        const parentTypeStr = inspect(parentType);
-        const fragTypeStr = inspect(fragType);
-        context.reportError(
-          new GraphQLError(
-            `Fragment "${fragName}" cannot be spread here as objects of type "${parentTypeStr}" can never be of type "${fragTypeStr}".`,
-            node,
-          ),
-        );
-      }
-    },
-  };
-}
-
-function getFragmentType(context, name) {
-  const frag = context.getFragment(name);
-  if (frag) {
-    const type = typeFromAST(context.getSchema(), frag.typeCondition);
-    if (isCompositeType(type)) {
-      return type;
-    }
-  }
-}
diff --git a/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.mjs b/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.mjs
deleted file mode 100644
index da45925..0000000
--- a/node_modules/graphql/validation/rules/PossibleFragmentSpreadsRule.mjs
+++ /dev/null
@@ -1,50 +0,0 @@
-import inspect from "../../jsutils/inspect.mjs";
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { isCompositeType } from "../../type/definition.mjs";
-import { typeFromAST } from "../../utilities/typeFromAST.mjs";
-import { doTypesOverlap } from "../../utilities/typeComparators.mjs";
-
-/**
- * Possible fragment spread
- *
- * A fragment spread is only valid if the type condition could ever possibly
- * be true: if there is a non-empty intersection of the possible parent types,
- * and possible types which pass the type condition.
- */
-export function PossibleFragmentSpreadsRule(context) {
-  return {
-    InlineFragment: function InlineFragment(node) {
-      var fragType = context.getType();
-      var parentType = context.getParentType();
-
-      if (isCompositeType(fragType) && isCompositeType(parentType) && !doTypesOverlap(context.getSchema(), fragType, parentType)) {
-        var parentTypeStr = inspect(parentType);
-        var fragTypeStr = inspect(fragType);
-        context.reportError(new GraphQLError("Fragment cannot be spread here as objects of type \"".concat(parentTypeStr, "\" can never be of type \"").concat(fragTypeStr, "\"."), node));
-      }
-    },
-    FragmentSpread: function FragmentSpread(node) {
-      var fragName = node.name.value;
-      var fragType = getFragmentType(context, fragName);
-      var parentType = context.getParentType();
-
-      if (fragType && parentType && !doTypesOverlap(context.getSchema(), fragType, parentType)) {
-        var parentTypeStr = inspect(parentType);
-        var fragTypeStr = inspect(fragType);
-        context.reportError(new GraphQLError("Fragment \"".concat(fragName, "\" cannot be spread here as objects of type \"").concat(parentTypeStr, "\" can never be of type \"").concat(fragTypeStr, "\"."), node));
-      }
-    }
-  };
-}
-
-function getFragmentType(context, name) {
-  var frag = context.getFragment(name);
-
-  if (frag) {
-    var type = typeFromAST(context.getSchema(), frag.typeCondition);
-
-    if (isCompositeType(type)) {
-      return type;
-    }
-  }
-}
diff --git a/node_modules/graphql/validation/rules/PossibleTypeExtensions.d.ts b/node_modules/graphql/validation/rules/PossibleTypeExtensions.d.ts
deleted file mode 100644
index 7573375..0000000
--- a/node_modules/graphql/validation/rules/PossibleTypeExtensions.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { PossibleTypeExtensionsRule } from 'graphql'
- * or
- *   import { PossibleTypeExtensionsRule } from 'graphql/validation'
- */
-export { PossibleTypeExtensionsRule as PossibleTypeExtensions } from './PossibleTypeExtensionsRule';
diff --git a/node_modules/graphql/validation/rules/PossibleTypeExtensions.js b/node_modules/graphql/validation/rules/PossibleTypeExtensions.js
deleted file mode 100644
index 17257ac..0000000
--- a/node_modules/graphql/validation/rules/PossibleTypeExtensions.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "PossibleTypeExtensions", {
-  enumerable: true,
-  get: function get() {
-    return _PossibleTypeExtensionsRule.PossibleTypeExtensionsRule;
-  }
-});
-
-var _PossibleTypeExtensionsRule = require("./PossibleTypeExtensionsRule");
diff --git a/node_modules/graphql/validation/rules/PossibleTypeExtensions.js.flow b/node_modules/graphql/validation/rules/PossibleTypeExtensions.js.flow
deleted file mode 100644
index 0e80b89..0000000
--- a/node_modules/graphql/validation/rules/PossibleTypeExtensions.js.flow
+++ /dev/null
@@ -1,10 +0,0 @@
-// @flow strict
-
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { PossibleTypeExtensionsRule } from 'graphql'
- * or
- *   import { PossibleTypeExtensionsRule } from 'graphql/validation'
- */
-export { PossibleTypeExtensionsRule as PossibleTypeExtensions } from './PossibleTypeExtensionsRule';
diff --git a/node_modules/graphql/validation/rules/PossibleTypeExtensions.mjs b/node_modules/graphql/validation/rules/PossibleTypeExtensions.mjs
deleted file mode 100644
index 99796c8..0000000
--- a/node_modules/graphql/validation/rules/PossibleTypeExtensions.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { PossibleTypeExtensionsRule } from 'graphql'
- * or
- *   import { PossibleTypeExtensionsRule } from 'graphql/validation'
- */
-export { PossibleTypeExtensionsRule as PossibleTypeExtensions } from "./PossibleTypeExtensionsRule.mjs";
diff --git a/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.d.ts b/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.d.ts
deleted file mode 100644
index 8337dc5..0000000
--- a/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { SDLValidationContext } from '../ValidationContext';
-
-/**
- * Possible type extension
- *
- * A type extension is only valid if the type is defined and has the same kind.
- */
-export function PossibleTypeExtensionsRule(
-  context: SDLValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.js b/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.js
deleted file mode 100644
index 1c375d1..0000000
--- a/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.js
+++ /dev/null
@@ -1,143 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.PossibleTypeExtensionsRule = PossibleTypeExtensionsRule;
-
-var _inspect = _interopRequireDefault(require("../../jsutils/inspect"));
-
-var _invariant = _interopRequireDefault(require("../../jsutils/invariant"));
-
-var _didYouMean = _interopRequireDefault(require("../../jsutils/didYouMean"));
-
-var _suggestionList = _interopRequireDefault(require("../../jsutils/suggestionList"));
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _kinds = require("../../language/kinds");
-
-var _predicates = require("../../language/predicates");
-
-var _definition = require("../../type/definition");
-
-var _defKindToExtKind;
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-/**
- * Possible type extension
- *
- * A type extension is only valid if the type is defined and has the same kind.
- */
-function PossibleTypeExtensionsRule(context) {
-  var schema = context.getSchema();
-  var definedTypes = Object.create(null);
-
-  for (var _i2 = 0, _context$getDocument$2 = context.getDocument().definitions; _i2 < _context$getDocument$2.length; _i2++) {
-    var def = _context$getDocument$2[_i2];
-
-    if ((0, _predicates.isTypeDefinitionNode)(def)) {
-      definedTypes[def.name.value] = def;
-    }
-  }
-
-  return {
-    ScalarTypeExtension: checkExtension,
-    ObjectTypeExtension: checkExtension,
-    InterfaceTypeExtension: checkExtension,
-    UnionTypeExtension: checkExtension,
-    EnumTypeExtension: checkExtension,
-    InputObjectTypeExtension: checkExtension
-  };
-
-  function checkExtension(node) {
-    var typeName = node.name.value;
-    var defNode = definedTypes[typeName];
-    var existingType = schema === null || schema === void 0 ? void 0 : schema.getType(typeName);
-    var expectedKind;
-
-    if (defNode) {
-      expectedKind = defKindToExtKind[defNode.kind];
-    } else if (existingType) {
-      expectedKind = typeToExtKind(existingType);
-    }
-
-    if (expectedKind) {
-      if (expectedKind !== node.kind) {
-        var kindStr = extensionKindToTypeName(node.kind);
-        context.reportError(new _GraphQLError.GraphQLError("Cannot extend non-".concat(kindStr, " type \"").concat(typeName, "\"."), defNode ? [defNode, node] : node));
-      }
-    } else {
-      var allTypeNames = Object.keys(definedTypes);
-
-      if (schema) {
-        allTypeNames = allTypeNames.concat(Object.keys(schema.getTypeMap()));
-      }
-
-      var suggestedTypes = (0, _suggestionList.default)(typeName, allTypeNames);
-      context.reportError(new _GraphQLError.GraphQLError("Cannot extend type \"".concat(typeName, "\" because it is not defined.") + (0, _didYouMean.default)(suggestedTypes), node.name));
-    }
-  }
-}
-
-var defKindToExtKind = (_defKindToExtKind = {}, _defineProperty(_defKindToExtKind, _kinds.Kind.SCALAR_TYPE_DEFINITION, _kinds.Kind.SCALAR_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, _kinds.Kind.OBJECT_TYPE_DEFINITION, _kinds.Kind.OBJECT_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, _kinds.Kind.INTERFACE_TYPE_DEFINITION, _kinds.Kind.INTERFACE_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, _kinds.Kind.UNION_TYPE_DEFINITION, _kinds.Kind.UNION_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, _kinds.Kind.ENUM_TYPE_DEFINITION, _kinds.Kind.ENUM_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION, _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION), _defKindToExtKind);
-
-function typeToExtKind(type) {
-  if ((0, _definition.isScalarType)(type)) {
-    return _kinds.Kind.SCALAR_TYPE_EXTENSION;
-  }
-
-  if ((0, _definition.isObjectType)(type)) {
-    return _kinds.Kind.OBJECT_TYPE_EXTENSION;
-  }
-
-  if ((0, _definition.isInterfaceType)(type)) {
-    return _kinds.Kind.INTERFACE_TYPE_EXTENSION;
-  }
-
-  if ((0, _definition.isUnionType)(type)) {
-    return _kinds.Kind.UNION_TYPE_EXTENSION;
-  }
-
-  if ((0, _definition.isEnumType)(type)) {
-    return _kinds.Kind.ENUM_TYPE_EXTENSION;
-  }
-
-  /* istanbul ignore else */
-  if ((0, _definition.isInputObjectType)(type)) {
-    return _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION;
-  } // Not reachable. All possible types have been considered.
-
-
-  /* istanbul ignore next */
-  (0, _invariant.default)(false, 'Unexpected type: ' + (0, _inspect.default)(type));
-}
-
-function extensionKindToTypeName(kind) {
-  switch (kind) {
-    case _kinds.Kind.SCALAR_TYPE_EXTENSION:
-      return 'scalar';
-
-    case _kinds.Kind.OBJECT_TYPE_EXTENSION:
-      return 'object';
-
-    case _kinds.Kind.INTERFACE_TYPE_EXTENSION:
-      return 'interface';
-
-    case _kinds.Kind.UNION_TYPE_EXTENSION:
-      return 'union';
-
-    case _kinds.Kind.ENUM_TYPE_EXTENSION:
-      return 'enum';
-
-    case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION:
-      return 'input object';
-  } // Not reachable. All possible types have been considered.
-
-
-  /* istanbul ignore next */
-  (0, _invariant.default)(false, 'Unexpected kind: ' + (0, _inspect.default)(kind));
-}
diff --git a/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.js.flow b/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.js.flow
deleted file mode 100644
index 1d0db90..0000000
--- a/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.js.flow
+++ /dev/null
@@ -1,142 +0,0 @@
-// @flow strict
-
-import inspect from '../../jsutils/inspect';
-import invariant from '../../jsutils/invariant';
-import didYouMean from '../../jsutils/didYouMean';
-import suggestionList from '../../jsutils/suggestionList';
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { Kind } from '../../language/kinds';
-import { type ASTVisitor } from '../../language/visitor';
-import { isTypeDefinitionNode } from '../../language/predicates';
-
-import {
-  isScalarType,
-  isObjectType,
-  isInterfaceType,
-  isUnionType,
-  isEnumType,
-  isInputObjectType,
-} from '../../type/definition';
-
-import { type SDLValidationContext } from '../ValidationContext';
-
-/**
- * Possible type extension
- *
- * A type extension is only valid if the type is defined and has the same kind.
- */
-export function PossibleTypeExtensionsRule(
-  context: SDLValidationContext,
-): ASTVisitor {
-  const schema = context.getSchema();
-  const definedTypes = Object.create(null);
-
-  for (const def of context.getDocument().definitions) {
-    if (isTypeDefinitionNode(def)) {
-      definedTypes[def.name.value] = def;
-    }
-  }
-
-  return {
-    ScalarTypeExtension: checkExtension,
-    ObjectTypeExtension: checkExtension,
-    InterfaceTypeExtension: checkExtension,
-    UnionTypeExtension: checkExtension,
-    EnumTypeExtension: checkExtension,
-    InputObjectTypeExtension: checkExtension,
-  };
-
-  function checkExtension(node) {
-    const typeName = node.name.value;
-    const defNode = definedTypes[typeName];
-    const existingType = schema?.getType(typeName);
-
-    let expectedKind;
-    if (defNode) {
-      expectedKind = defKindToExtKind[defNode.kind];
-    } else if (existingType) {
-      expectedKind = typeToExtKind(existingType);
-    }
-
-    if (expectedKind) {
-      if (expectedKind !== node.kind) {
-        const kindStr = extensionKindToTypeName(node.kind);
-        context.reportError(
-          new GraphQLError(
-            `Cannot extend non-${kindStr} type "${typeName}".`,
-            defNode ? [defNode, node] : node,
-          ),
-        );
-      }
-    } else {
-      let allTypeNames = Object.keys(definedTypes);
-      if (schema) {
-        allTypeNames = allTypeNames.concat(Object.keys(schema.getTypeMap()));
-      }
-
-      const suggestedTypes = suggestionList(typeName, allTypeNames);
-      context.reportError(
-        new GraphQLError(
-          `Cannot extend type "${typeName}" because it is not defined.` +
-            didYouMean(suggestedTypes),
-          node.name,
-        ),
-      );
-    }
-  }
-}
-
-const defKindToExtKind = {
-  [Kind.SCALAR_TYPE_DEFINITION]: Kind.SCALAR_TYPE_EXTENSION,
-  [Kind.OBJECT_TYPE_DEFINITION]: Kind.OBJECT_TYPE_EXTENSION,
-  [Kind.INTERFACE_TYPE_DEFINITION]: Kind.INTERFACE_TYPE_EXTENSION,
-  [Kind.UNION_TYPE_DEFINITION]: Kind.UNION_TYPE_EXTENSION,
-  [Kind.ENUM_TYPE_DEFINITION]: Kind.ENUM_TYPE_EXTENSION,
-  [Kind.INPUT_OBJECT_TYPE_DEFINITION]: Kind.INPUT_OBJECT_TYPE_EXTENSION,
-};
-
-function typeToExtKind(type) {
-  if (isScalarType(type)) {
-    return Kind.SCALAR_TYPE_EXTENSION;
-  }
-  if (isObjectType(type)) {
-    return Kind.OBJECT_TYPE_EXTENSION;
-  }
-  if (isInterfaceType(type)) {
-    return Kind.INTERFACE_TYPE_EXTENSION;
-  }
-  if (isUnionType(type)) {
-    return Kind.UNION_TYPE_EXTENSION;
-  }
-  if (isEnumType(type)) {
-    return Kind.ENUM_TYPE_EXTENSION;
-  }
-  if (isInputObjectType(type)) {
-    return Kind.INPUT_OBJECT_TYPE_EXTENSION;
-  }
-
-  // Not reachable. All possible types have been considered.
-  invariant(false, 'Unexpected type: ' + inspect((type: empty)));
-}
-
-function extensionKindToTypeName(kind) {
-  switch (kind) {
-    case Kind.SCALAR_TYPE_EXTENSION:
-      return 'scalar';
-    case Kind.OBJECT_TYPE_EXTENSION:
-      return 'object';
-    case Kind.INTERFACE_TYPE_EXTENSION:
-      return 'interface';
-    case Kind.UNION_TYPE_EXTENSION:
-      return 'union';
-    case Kind.ENUM_TYPE_EXTENSION:
-      return 'enum';
-    case Kind.INPUT_OBJECT_TYPE_EXTENSION:
-      return 'input object';
-  }
-
-  // Not reachable. All possible types have been considered.
-  invariant(false, 'Unexpected kind: ' + inspect(kind));
-}
diff --git a/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.mjs b/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.mjs
deleted file mode 100644
index 2699594..0000000
--- a/node_modules/graphql/validation/rules/PossibleTypeExtensionsRule.mjs
+++ /dev/null
@@ -1,126 +0,0 @@
-var _defKindToExtKind;
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-import inspect from "../../jsutils/inspect.mjs";
-import invariant from "../../jsutils/invariant.mjs";
-import didYouMean from "../../jsutils/didYouMean.mjs";
-import suggestionList from "../../jsutils/suggestionList.mjs";
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { Kind } from "../../language/kinds.mjs";
-import { isTypeDefinitionNode } from "../../language/predicates.mjs";
-import { isScalarType, isObjectType, isInterfaceType, isUnionType, isEnumType, isInputObjectType } from "../../type/definition.mjs";
-
-/**
- * Possible type extension
- *
- * A type extension is only valid if the type is defined and has the same kind.
- */
-export function PossibleTypeExtensionsRule(context) {
-  var schema = context.getSchema();
-  var definedTypes = Object.create(null);
-
-  for (var _i2 = 0, _context$getDocument$2 = context.getDocument().definitions; _i2 < _context$getDocument$2.length; _i2++) {
-    var def = _context$getDocument$2[_i2];
-
-    if (isTypeDefinitionNode(def)) {
-      definedTypes[def.name.value] = def;
-    }
-  }
-
-  return {
-    ScalarTypeExtension: checkExtension,
-    ObjectTypeExtension: checkExtension,
-    InterfaceTypeExtension: checkExtension,
-    UnionTypeExtension: checkExtension,
-    EnumTypeExtension: checkExtension,
-    InputObjectTypeExtension: checkExtension
-  };
-
-  function checkExtension(node) {
-    var typeName = node.name.value;
-    var defNode = definedTypes[typeName];
-    var existingType = schema === null || schema === void 0 ? void 0 : schema.getType(typeName);
-    var expectedKind;
-
-    if (defNode) {
-      expectedKind = defKindToExtKind[defNode.kind];
-    } else if (existingType) {
-      expectedKind = typeToExtKind(existingType);
-    }
-
-    if (expectedKind) {
-      if (expectedKind !== node.kind) {
-        var kindStr = extensionKindToTypeName(node.kind);
-        context.reportError(new GraphQLError("Cannot extend non-".concat(kindStr, " type \"").concat(typeName, "\"."), defNode ? [defNode, node] : node));
-      }
-    } else {
-      var allTypeNames = Object.keys(definedTypes);
-
-      if (schema) {
-        allTypeNames = allTypeNames.concat(Object.keys(schema.getTypeMap()));
-      }
-
-      var suggestedTypes = suggestionList(typeName, allTypeNames);
-      context.reportError(new GraphQLError("Cannot extend type \"".concat(typeName, "\" because it is not defined.") + didYouMean(suggestedTypes), node.name));
-    }
-  }
-}
-var defKindToExtKind = (_defKindToExtKind = {}, _defineProperty(_defKindToExtKind, Kind.SCALAR_TYPE_DEFINITION, Kind.SCALAR_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, Kind.OBJECT_TYPE_DEFINITION, Kind.OBJECT_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, Kind.INTERFACE_TYPE_DEFINITION, Kind.INTERFACE_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, Kind.UNION_TYPE_DEFINITION, Kind.UNION_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, Kind.ENUM_TYPE_DEFINITION, Kind.ENUM_TYPE_EXTENSION), _defineProperty(_defKindToExtKind, Kind.INPUT_OBJECT_TYPE_DEFINITION, Kind.INPUT_OBJECT_TYPE_EXTENSION), _defKindToExtKind);
-
-function typeToExtKind(type) {
-  if (isScalarType(type)) {
-    return Kind.SCALAR_TYPE_EXTENSION;
-  }
-
-  if (isObjectType(type)) {
-    return Kind.OBJECT_TYPE_EXTENSION;
-  }
-
-  if (isInterfaceType(type)) {
-    return Kind.INTERFACE_TYPE_EXTENSION;
-  }
-
-  if (isUnionType(type)) {
-    return Kind.UNION_TYPE_EXTENSION;
-  }
-
-  if (isEnumType(type)) {
-    return Kind.ENUM_TYPE_EXTENSION;
-  }
-
-  /* istanbul ignore else */
-  if (isInputObjectType(type)) {
-    return Kind.INPUT_OBJECT_TYPE_EXTENSION;
-  } // Not reachable. All possible types have been considered.
-
-
-  /* istanbul ignore next */
-  invariant(false, 'Unexpected type: ' + inspect(type));
-}
-
-function extensionKindToTypeName(kind) {
-  switch (kind) {
-    case Kind.SCALAR_TYPE_EXTENSION:
-      return 'scalar';
-
-    case Kind.OBJECT_TYPE_EXTENSION:
-      return 'object';
-
-    case Kind.INTERFACE_TYPE_EXTENSION:
-      return 'interface';
-
-    case Kind.UNION_TYPE_EXTENSION:
-      return 'union';
-
-    case Kind.ENUM_TYPE_EXTENSION:
-      return 'enum';
-
-    case Kind.INPUT_OBJECT_TYPE_EXTENSION:
-      return 'input object';
-  } // Not reachable. All possible types have been considered.
-
-
-  /* istanbul ignore next */
-  invariant(false, 'Unexpected kind: ' + inspect(kind));
-}
diff --git a/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.d.ts b/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.d.ts
deleted file mode 100644
index 116069c..0000000
--- a/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.d.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext, SDLValidationContext } from '../ValidationContext';
-
-/**
- * Provided required arguments
- *
- * A field or directive is only valid if all required (non-null without a
- * default value) field arguments have been provided.
- */
-export function ProvidedRequiredArgumentsRule(
-  context: ValidationContext,
-): ASTVisitor;
-
-/**
- * @internal
- */
-export function ProvidedRequiredArgumentsOnDirectivesRule(
-  context: ValidationContext | SDLValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.js b/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.js
deleted file mode 100644
index 548e870..0000000
--- a/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.js
+++ /dev/null
@@ -1,137 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.ProvidedRequiredArgumentsRule = ProvidedRequiredArgumentsRule;
-exports.ProvidedRequiredArgumentsOnDirectivesRule = ProvidedRequiredArgumentsOnDirectivesRule;
-
-var _inspect = _interopRequireDefault(require("../../jsutils/inspect"));
-
-var _keyMap = _interopRequireDefault(require("../../jsutils/keyMap"));
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _kinds = require("../../language/kinds");
-
-var _printer = require("../../language/printer");
-
-var _directives = require("../../type/directives");
-
-var _definition = require("../../type/definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-/**
- * Provided required arguments
- *
- * A field or directive is only valid if all required (non-null without a
- * default value) field arguments have been provided.
- */
-function ProvidedRequiredArgumentsRule(context) {
-  return _objectSpread({}, ProvidedRequiredArgumentsOnDirectivesRule(context), {
-    Field: {
-      // Validate on leave to allow for deeper errors to appear first.
-      leave: function leave(fieldNode) {
-        var _fieldNode$arguments;
-
-        var fieldDef = context.getFieldDef();
-
-        if (!fieldDef) {
-          return false;
-        }
-        /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-
-        var argNodes = (_fieldNode$arguments = fieldNode.arguments) !== null && _fieldNode$arguments !== void 0 ? _fieldNode$arguments : [];
-        var argNodeMap = (0, _keyMap.default)(argNodes, function (arg) {
-          return arg.name.value;
-        });
-
-        for (var _i2 = 0, _fieldDef$args2 = fieldDef.args; _i2 < _fieldDef$args2.length; _i2++) {
-          var argDef = _fieldDef$args2[_i2];
-          var argNode = argNodeMap[argDef.name];
-
-          if (!argNode && (0, _definition.isRequiredArgument)(argDef)) {
-            var argTypeStr = (0, _inspect.default)(argDef.type);
-            context.reportError(new _GraphQLError.GraphQLError("Field \"".concat(fieldDef.name, "\" argument \"").concat(argDef.name, "\" of type \"").concat(argTypeStr, "\" is required, but it was not provided."), fieldNode));
-          }
-        }
-      }
-    }
-  });
-}
-/**
- * @internal
- */
-
-
-function ProvidedRequiredArgumentsOnDirectivesRule(context) {
-  var requiredArgsMap = Object.create(null);
-  var schema = context.getSchema();
-  var definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives;
-
-  for (var _i4 = 0; _i4 < definedDirectives.length; _i4++) {
-    var directive = definedDirectives[_i4];
-    requiredArgsMap[directive.name] = (0, _keyMap.default)(directive.args.filter(_definition.isRequiredArgument), function (arg) {
-      return arg.name;
-    });
-  }
-
-  var astDefinitions = context.getDocument().definitions;
-
-  for (var _i6 = 0; _i6 < astDefinitions.length; _i6++) {
-    var def = astDefinitions[_i6];
-
-    if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) {
-      var _def$arguments;
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var argNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : [];
-      requiredArgsMap[def.name.value] = (0, _keyMap.default)(argNodes.filter(isRequiredArgumentNode), function (arg) {
-        return arg.name.value;
-      });
-    }
-  }
-
-  return {
-    Directive: {
-      // Validate on leave to allow for deeper errors to appear first.
-      leave: function leave(directiveNode) {
-        var directiveName = directiveNode.name.value;
-        var requiredArgs = requiredArgsMap[directiveName];
-
-        if (requiredArgs) {
-          var _directiveNode$argume;
-
-          /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-          var _argNodes = (_directiveNode$argume = directiveNode.arguments) !== null && _directiveNode$argume !== void 0 ? _directiveNode$argume : [];
-
-          var argNodeMap = (0, _keyMap.default)(_argNodes, function (arg) {
-            return arg.name.value;
-          });
-
-          for (var _i8 = 0, _Object$keys2 = Object.keys(requiredArgs); _i8 < _Object$keys2.length; _i8++) {
-            var argName = _Object$keys2[_i8];
-
-            if (!argNodeMap[argName]) {
-              var argType = requiredArgs[argName].type;
-              var argTypeStr = (0, _definition.isType)(argType) ? (0, _inspect.default)(argType) : (0, _printer.print)(argType);
-              context.reportError(new _GraphQLError.GraphQLError("Directive \"@".concat(directiveName, "\" argument \"").concat(argName, "\" of type \"").concat(argTypeStr, "\" is required, but it was not provided."), directiveNode));
-            }
-          }
-        }
-      }
-    }
-  };
-}
-
-function isRequiredArgumentNode(arg) {
-  return arg.type.kind === _kinds.Kind.NON_NULL_TYPE && arg.defaultValue == null;
-}
diff --git a/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.js.flow b/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.js.flow
deleted file mode 100644
index 8e08233..0000000
--- a/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.js.flow
+++ /dev/null
@@ -1,124 +0,0 @@
-// @flow strict
-
-import inspect from '../../jsutils/inspect';
-import keyMap from '../../jsutils/keyMap';
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { Kind } from '../../language/kinds';
-import { print } from '../../language/printer';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { specifiedDirectives } from '../../type/directives';
-import { isType, isRequiredArgument } from '../../type/definition';
-
-import {
-  type ValidationContext,
-  type SDLValidationContext,
-} from '../ValidationContext';
-
-/**
- * Provided required arguments
- *
- * A field or directive is only valid if all required (non-null without a
- * default value) field arguments have been provided.
- */
-export function ProvidedRequiredArgumentsRule(
-  context: ValidationContext,
-): ASTVisitor {
-  return {
-    ...ProvidedRequiredArgumentsOnDirectivesRule(context),
-    Field: {
-      // Validate on leave to allow for deeper errors to appear first.
-      leave(fieldNode) {
-        const fieldDef = context.getFieldDef();
-        if (!fieldDef) {
-          return false;
-        }
-
-        /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-        const argNodes = fieldNode.arguments ?? [];
-        const argNodeMap = keyMap(argNodes, arg => arg.name.value);
-        for (const argDef of fieldDef.args) {
-          const argNode = argNodeMap[argDef.name];
-          if (!argNode && isRequiredArgument(argDef)) {
-            const argTypeStr = inspect(argDef.type);
-            context.reportError(
-              new GraphQLError(
-                `Field "${fieldDef.name}" argument "${argDef.name}" of type "${argTypeStr}" is required, but it was not provided.`,
-                fieldNode,
-              ),
-            );
-          }
-        }
-      },
-    },
-  };
-}
-
-/**
- * @internal
- */
-export function ProvidedRequiredArgumentsOnDirectivesRule(
-  context: ValidationContext | SDLValidationContext,
-): ASTVisitor {
-  const requiredArgsMap = Object.create(null);
-
-  const schema = context.getSchema();
-  const definedDirectives = schema
-    ? schema.getDirectives()
-    : specifiedDirectives;
-  for (const directive of definedDirectives) {
-    requiredArgsMap[directive.name] = keyMap(
-      directive.args.filter(isRequiredArgument),
-      arg => arg.name,
-    );
-  }
-
-  const astDefinitions = context.getDocument().definitions;
-  for (const def of astDefinitions) {
-    if (def.kind === Kind.DIRECTIVE_DEFINITION) {
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      const argNodes = def.arguments ?? [];
-
-      requiredArgsMap[def.name.value] = keyMap(
-        argNodes.filter(isRequiredArgumentNode),
-        arg => arg.name.value,
-      );
-    }
-  }
-
-  return {
-    Directive: {
-      // Validate on leave to allow for deeper errors to appear first.
-      leave(directiveNode) {
-        const directiveName = directiveNode.name.value;
-        const requiredArgs = requiredArgsMap[directiveName];
-        if (requiredArgs) {
-          /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-          const argNodes = directiveNode.arguments ?? [];
-          const argNodeMap = keyMap(argNodes, arg => arg.name.value);
-          for (const argName of Object.keys(requiredArgs)) {
-            if (!argNodeMap[argName]) {
-              const argType = requiredArgs[argName].type;
-              const argTypeStr = isType(argType)
-                ? inspect(argType)
-                : print(argType);
-
-              context.reportError(
-                new GraphQLError(
-                  `Directive "@${directiveName}" argument "${argName}" of type "${argTypeStr}" is required, but it was not provided.`,
-                  directiveNode,
-                ),
-              );
-            }
-          }
-        }
-      },
-    },
-  };
-}
-
-function isRequiredArgumentNode(arg) {
-  return arg.type.kind === Kind.NON_NULL_TYPE && arg.defaultValue == null;
-}
diff --git a/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.mjs b/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.mjs
deleted file mode 100644
index 3163a60..0000000
--- a/node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.mjs
+++ /dev/null
@@ -1,120 +0,0 @@
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-import inspect from "../../jsutils/inspect.mjs";
-import keyMap from "../../jsutils/keyMap.mjs";
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { Kind } from "../../language/kinds.mjs";
-import { print } from "../../language/printer.mjs";
-import { specifiedDirectives } from "../../type/directives.mjs";
-import { isType, isRequiredArgument } from "../../type/definition.mjs";
-
-/**
- * Provided required arguments
- *
- * A field or directive is only valid if all required (non-null without a
- * default value) field arguments have been provided.
- */
-export function ProvidedRequiredArgumentsRule(context) {
-  return _objectSpread({}, ProvidedRequiredArgumentsOnDirectivesRule(context), {
-    Field: {
-      // Validate on leave to allow for deeper errors to appear first.
-      leave: function leave(fieldNode) {
-        var _fieldNode$arguments;
-
-        var fieldDef = context.getFieldDef();
-
-        if (!fieldDef) {
-          return false;
-        }
-        /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-
-        var argNodes = (_fieldNode$arguments = fieldNode.arguments) !== null && _fieldNode$arguments !== void 0 ? _fieldNode$arguments : [];
-        var argNodeMap = keyMap(argNodes, function (arg) {
-          return arg.name.value;
-        });
-
-        for (var _i2 = 0, _fieldDef$args2 = fieldDef.args; _i2 < _fieldDef$args2.length; _i2++) {
-          var argDef = _fieldDef$args2[_i2];
-          var argNode = argNodeMap[argDef.name];
-
-          if (!argNode && isRequiredArgument(argDef)) {
-            var argTypeStr = inspect(argDef.type);
-            context.reportError(new GraphQLError("Field \"".concat(fieldDef.name, "\" argument \"").concat(argDef.name, "\" of type \"").concat(argTypeStr, "\" is required, but it was not provided."), fieldNode));
-          }
-        }
-      }
-    }
-  });
-}
-/**
- * @internal
- */
-
-export function ProvidedRequiredArgumentsOnDirectivesRule(context) {
-  var requiredArgsMap = Object.create(null);
-  var schema = context.getSchema();
-  var definedDirectives = schema ? schema.getDirectives() : specifiedDirectives;
-
-  for (var _i4 = 0; _i4 < definedDirectives.length; _i4++) {
-    var directive = definedDirectives[_i4];
-    requiredArgsMap[directive.name] = keyMap(directive.args.filter(isRequiredArgument), function (arg) {
-      return arg.name;
-    });
-  }
-
-  var astDefinitions = context.getDocument().definitions;
-
-  for (var _i6 = 0; _i6 < astDefinitions.length; _i6++) {
-    var def = astDefinitions[_i6];
-
-    if (def.kind === Kind.DIRECTIVE_DEFINITION) {
-      var _def$arguments;
-
-      /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-      var argNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : [];
-      requiredArgsMap[def.name.value] = keyMap(argNodes.filter(isRequiredArgumentNode), function (arg) {
-        return arg.name.value;
-      });
-    }
-  }
-
-  return {
-    Directive: {
-      // Validate on leave to allow for deeper errors to appear first.
-      leave: function leave(directiveNode) {
-        var directiveName = directiveNode.name.value;
-        var requiredArgs = requiredArgsMap[directiveName];
-
-        if (requiredArgs) {
-          var _directiveNode$argume;
-
-          /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-          var _argNodes = (_directiveNode$argume = directiveNode.arguments) !== null && _directiveNode$argume !== void 0 ? _directiveNode$argume : [];
-
-          var argNodeMap = keyMap(_argNodes, function (arg) {
-            return arg.name.value;
-          });
-
-          for (var _i8 = 0, _Object$keys2 = Object.keys(requiredArgs); _i8 < _Object$keys2.length; _i8++) {
-            var argName = _Object$keys2[_i8];
-
-            if (!argNodeMap[argName]) {
-              var argType = requiredArgs[argName].type;
-              var argTypeStr = isType(argType) ? inspect(argType) : print(argType);
-              context.reportError(new GraphQLError("Directive \"@".concat(directiveName, "\" argument \"").concat(argName, "\" of type \"").concat(argTypeStr, "\" is required, but it was not provided."), directiveNode));
-            }
-          }
-        }
-      }
-    }
-  };
-}
-
-function isRequiredArgumentNode(arg) {
-  return arg.type.kind === Kind.NON_NULL_TYPE && arg.defaultValue == null;
-}
diff --git a/node_modules/graphql/validation/rules/ScalarLeafsRule.d.ts b/node_modules/graphql/validation/rules/ScalarLeafsRule.d.ts
deleted file mode 100644
index ae956ef..0000000
--- a/node_modules/graphql/validation/rules/ScalarLeafsRule.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * Scalar leafs
- *
- * A GraphQL document is valid only if all leaf fields (fields without
- * sub selections) are of scalar or enum types.
- */
-export function ScalarLeafsRule(context: ValidationContext): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/ScalarLeafsRule.js b/node_modules/graphql/validation/rules/ScalarLeafsRule.js
deleted file mode 100644
index 08a51f0..0000000
--- a/node_modules/graphql/validation/rules/ScalarLeafsRule.js
+++ /dev/null
@@ -1,45 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.ScalarLeafsRule = ScalarLeafsRule;
-
-var _inspect = _interopRequireDefault(require("../../jsutils/inspect"));
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _definition = require("../../type/definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Scalar leafs
- *
- * A GraphQL document is valid only if all leaf fields (fields without
- * sub selections) are of scalar or enum types.
- */
-function ScalarLeafsRule(context) {
-  return {
-    Field: function Field(node) {
-      var type = context.getType();
-      var selectionSet = node.selectionSet;
-
-      if (type) {
-        if ((0, _definition.isLeafType)((0, _definition.getNamedType)(type))) {
-          if (selectionSet) {
-            var fieldName = node.name.value;
-            var typeStr = (0, _inspect.default)(type);
-            context.reportError(new _GraphQLError.GraphQLError("Field \"".concat(fieldName, "\" must not have a selection since type \"").concat(typeStr, "\" has no subfields."), selectionSet));
-          }
-        } else if (!selectionSet) {
-          var _fieldName = node.name.value;
-
-          var _typeStr = (0, _inspect.default)(type);
-
-          context.reportError(new _GraphQLError.GraphQLError("Field \"".concat(_fieldName, "\" of type \"").concat(_typeStr, "\" must have a selection of subfields. Did you mean \"").concat(_fieldName, " { ... }\"?"), node));
-        }
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/ScalarLeafsRule.js.flow b/node_modules/graphql/validation/rules/ScalarLeafsRule.js.flow
deleted file mode 100644
index abc4355..0000000
--- a/node_modules/graphql/validation/rules/ScalarLeafsRule.js.flow
+++ /dev/null
@@ -1,50 +0,0 @@
-// @flow strict
-
-import inspect from '../../jsutils/inspect';
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { type FieldNode } from '../../language/ast';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { getNamedType, isLeafType } from '../../type/definition';
-
-import { type ValidationContext } from '../ValidationContext';
-
-/**
- * Scalar leafs
- *
- * A GraphQL document is valid only if all leaf fields (fields without
- * sub selections) are of scalar or enum types.
- */
-export function ScalarLeafsRule(context: ValidationContext): ASTVisitor {
-  return {
-    Field(node: FieldNode) {
-      const type = context.getType();
-      const selectionSet = node.selectionSet;
-      if (type) {
-        if (isLeafType(getNamedType(type))) {
-          if (selectionSet) {
-            const fieldName = node.name.value;
-            const typeStr = inspect(type);
-            context.reportError(
-              new GraphQLError(
-                `Field "${fieldName}" must not have a selection since type "${typeStr}" has no subfields.`,
-                selectionSet,
-              ),
-            );
-          }
-        } else if (!selectionSet) {
-          const fieldName = node.name.value;
-          const typeStr = inspect(type);
-          context.reportError(
-            new GraphQLError(
-              `Field "${fieldName}" of type "${typeStr}" must have a selection of subfields. Did you mean "${fieldName} { ... }"?`,
-              node,
-            ),
-          );
-        }
-      }
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/ScalarLeafsRule.mjs b/node_modules/graphql/validation/rules/ScalarLeafsRule.mjs
deleted file mode 100644
index 8a5111d..0000000
--- a/node_modules/graphql/validation/rules/ScalarLeafsRule.mjs
+++ /dev/null
@@ -1,34 +0,0 @@
-import inspect from "../../jsutils/inspect.mjs";
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { getNamedType, isLeafType } from "../../type/definition.mjs";
-
-/**
- * Scalar leafs
- *
- * A GraphQL document is valid only if all leaf fields (fields without
- * sub selections) are of scalar or enum types.
- */
-export function ScalarLeafsRule(context) {
-  return {
-    Field: function Field(node) {
-      var type = context.getType();
-      var selectionSet = node.selectionSet;
-
-      if (type) {
-        if (isLeafType(getNamedType(type))) {
-          if (selectionSet) {
-            var fieldName = node.name.value;
-            var typeStr = inspect(type);
-            context.reportError(new GraphQLError("Field \"".concat(fieldName, "\" must not have a selection since type \"").concat(typeStr, "\" has no subfields."), selectionSet));
-          }
-        } else if (!selectionSet) {
-          var _fieldName = node.name.value;
-
-          var _typeStr = inspect(type);
-
-          context.reportError(new GraphQLError("Field \"".concat(_fieldName, "\" of type \"").concat(_typeStr, "\" must have a selection of subfields. Did you mean \"").concat(_fieldName, " { ... }\"?"), node));
-        }
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.d.ts b/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.d.ts
deleted file mode 100644
index d56c4fd..0000000
--- a/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ASTValidationContext } from '../ValidationContext';
-
-/**
- * Subscriptions must only include one field.
- *
- * A GraphQL subscription is valid only if it contains a single root field.
- */
-export function SingleFieldSubscriptionsRule(
-  context: ASTValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.js b/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.js
deleted file mode 100644
index 1ad9dc3..0000000
--- a/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.js
+++ /dev/null
@@ -1,25 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.SingleFieldSubscriptionsRule = SingleFieldSubscriptionsRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * Subscriptions must only include one field.
- *
- * A GraphQL subscription is valid only if it contains a single root field.
- */
-function SingleFieldSubscriptionsRule(context) {
-  return {
-    OperationDefinition: function OperationDefinition(node) {
-      if (node.operation === 'subscription') {
-        if (node.selectionSet.selections.length !== 1) {
-          context.reportError(new _GraphQLError.GraphQLError(node.name ? "Subscription \"".concat(node.name.value, "\" must select only one top level field.") : 'Anonymous Subscription must select only one top level field.', node.selectionSet.selections.slice(1)));
-        }
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.js.flow b/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.js.flow
deleted file mode 100644
index 7773467..0000000
--- a/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.js.flow
+++ /dev/null
@@ -1,34 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { type ASTVisitor } from '../../language/visitor';
-import { type OperationDefinitionNode } from '../../language/ast';
-
-import { type ASTValidationContext } from '../ValidationContext';
-
-/**
- * Subscriptions must only include one field.
- *
- * A GraphQL subscription is valid only if it contains a single root field.
- */
-export function SingleFieldSubscriptionsRule(
-  context: ASTValidationContext,
-): ASTVisitor {
-  return {
-    OperationDefinition(node: OperationDefinitionNode) {
-      if (node.operation === 'subscription') {
-        if (node.selectionSet.selections.length !== 1) {
-          context.reportError(
-            new GraphQLError(
-              node.name
-                ? `Subscription "${node.name.value}" must select only one top level field.`
-                : 'Anonymous Subscription must select only one top level field.',
-              node.selectionSet.selections.slice(1),
-            ),
-          );
-        }
-      }
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.mjs b/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.mjs
deleted file mode 100644
index 0dd5351..0000000
--- a/node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.mjs
+++ /dev/null
@@ -1,18 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * Subscriptions must only include one field.
- *
- * A GraphQL subscription is valid only if it contains a single root field.
- */
-export function SingleFieldSubscriptionsRule(context) {
-  return {
-    OperationDefinition: function OperationDefinition(node) {
-      if (node.operation === 'subscription') {
-        if (node.selectionSet.selections.length !== 1) {
-          context.reportError(new GraphQLError(node.name ? "Subscription \"".concat(node.name.value, "\" must select only one top level field.") : 'Anonymous Subscription must select only one top level field.', node.selectionSet.selections.slice(1)));
-        }
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.d.ts b/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.d.ts
deleted file mode 100644
index 1d0d4f4..0000000
--- a/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ASTValidationContext } from '../ValidationContext';
-
-/**
- * Unique argument names
- *
- * A GraphQL field or directive is only valid if all supplied arguments are
- * uniquely named.
- */
-export function UniqueArgumentNamesRule(
-  context: ASTValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.js b/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.js
deleted file mode 100644
index 6bbdc60..0000000
--- a/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.js
+++ /dev/null
@@ -1,37 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.UniqueArgumentNamesRule = UniqueArgumentNamesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * Unique argument names
- *
- * A GraphQL field or directive is only valid if all supplied arguments are
- * uniquely named.
- */
-function UniqueArgumentNamesRule(context) {
-  var knownArgNames = Object.create(null);
-  return {
-    Field: function Field() {
-      knownArgNames = Object.create(null);
-    },
-    Directive: function Directive() {
-      knownArgNames = Object.create(null);
-    },
-    Argument: function Argument(node) {
-      var argName = node.name.value;
-
-      if (knownArgNames[argName]) {
-        context.reportError(new _GraphQLError.GraphQLError("There can be only one argument named \"".concat(argName, "\"."), [knownArgNames[argName], node.name]));
-      } else {
-        knownArgNames[argName] = node.name;
-      }
-
-      return false;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.js.flow b/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.js.flow
deleted file mode 100644
index 2792070..0000000
--- a/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.js.flow
+++ /dev/null
@@ -1,40 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type ASTValidationContext } from '../ValidationContext';
-
-/**
- * Unique argument names
- *
- * A GraphQL field or directive is only valid if all supplied arguments are
- * uniquely named.
- */
-export function UniqueArgumentNamesRule(
-  context: ASTValidationContext,
-): ASTVisitor {
-  let knownArgNames = Object.create(null);
-  return {
-    Field() {
-      knownArgNames = Object.create(null);
-    },
-    Directive() {
-      knownArgNames = Object.create(null);
-    },
-    Argument(node) {
-      const argName = node.name.value;
-      if (knownArgNames[argName]) {
-        context.reportError(
-          new GraphQLError(
-            `There can be only one argument named "${argName}".`,
-            [knownArgNames[argName], node.name],
-          ),
-        );
-      } else {
-        knownArgNames[argName] = node.name;
-      }
-      return false;
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.mjs b/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.mjs
deleted file mode 100644
index 5359d08..0000000
--- a/node_modules/graphql/validation/rules/UniqueArgumentNamesRule.mjs
+++ /dev/null
@@ -1,30 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * Unique argument names
- *
- * A GraphQL field or directive is only valid if all supplied arguments are
- * uniquely named.
- */
-export function UniqueArgumentNamesRule(context) {
-  var knownArgNames = Object.create(null);
-  return {
-    Field: function Field() {
-      knownArgNames = Object.create(null);
-    },
-    Directive: function Directive() {
-      knownArgNames = Object.create(null);
-    },
-    Argument: function Argument(node) {
-      var argName = node.name.value;
-
-      if (knownArgNames[argName]) {
-        context.reportError(new GraphQLError("There can be only one argument named \"".concat(argName, "\"."), [knownArgNames[argName], node.name]));
-      } else {
-        knownArgNames[argName] = node.name;
-      }
-
-      return false;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueDirectiveNames.d.ts b/node_modules/graphql/validation/rules/UniqueDirectiveNames.d.ts
deleted file mode 100644
index c197e87..0000000
--- a/node_modules/graphql/validation/rules/UniqueDirectiveNames.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueDirectiveNamesRule } from 'graphql'
- * or
- *   import { UniqueDirectiveNamesRule } from 'graphql/validation'
- */
-export { UniqueDirectiveNamesRule as UniqueDirectiveNames } from './UniqueDirectiveNamesRule';
diff --git a/node_modules/graphql/validation/rules/UniqueDirectiveNames.js b/node_modules/graphql/validation/rules/UniqueDirectiveNames.js
deleted file mode 100644
index d7d6116..0000000
--- a/node_modules/graphql/validation/rules/UniqueDirectiveNames.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "UniqueDirectiveNames", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueDirectiveNamesRule.UniqueDirectiveNamesRule;
-  }
-});
-
-var _UniqueDirectiveNamesRule = require("./UniqueDirectiveNamesRule");
diff --git a/node_modules/graphql/validation/rules/UniqueDirectiveNames.js.flow b/node_modules/graphql/validation/rules/UniqueDirectiveNames.js.flow
deleted file mode 100644
index fbbd6fc..0000000
--- a/node_modules/graphql/validation/rules/UniqueDirectiveNames.js.flow
+++ /dev/null
@@ -1,10 +0,0 @@
-// @flow strict
-
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueDirectiveNamesRule } from 'graphql'
- * or
- *   import { UniqueDirectiveNamesRule } from 'graphql/validation'
- */
-export { UniqueDirectiveNamesRule as UniqueDirectiveNames } from './UniqueDirectiveNamesRule';
diff --git a/node_modules/graphql/validation/rules/UniqueDirectiveNames.mjs b/node_modules/graphql/validation/rules/UniqueDirectiveNames.mjs
deleted file mode 100644
index 24f4e39..0000000
--- a/node_modules/graphql/validation/rules/UniqueDirectiveNames.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueDirectiveNamesRule } from 'graphql'
- * or
- *   import { UniqueDirectiveNamesRule } from 'graphql/validation'
- */
-export { UniqueDirectiveNamesRule as UniqueDirectiveNames } from "./UniqueDirectiveNamesRule.mjs";
diff --git a/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.d.ts b/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.d.ts
deleted file mode 100644
index a4dd841..0000000
--- a/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { SDLValidationContext } from '../ValidationContext';
-
-/**
- * Unique directive names
- *
- * A GraphQL document is only valid if all defined directives have unique names.
- */
-export function UniqueDirectiveNamesRule(
-  context: SDLValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.js b/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.js
deleted file mode 100644
index 96eaf0b..0000000
--- a/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.js
+++ /dev/null
@@ -1,36 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.UniqueDirectiveNamesRule = UniqueDirectiveNamesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * Unique directive names
- *
- * A GraphQL document is only valid if all defined directives have unique names.
- */
-function UniqueDirectiveNamesRule(context) {
-  var knownDirectiveNames = Object.create(null);
-  var schema = context.getSchema();
-  return {
-    DirectiveDefinition: function DirectiveDefinition(node) {
-      var directiveName = node.name.value;
-
-      if (schema === null || schema === void 0 ? void 0 : schema.getDirective(directiveName)) {
-        context.reportError(new _GraphQLError.GraphQLError("Directive \"@".concat(directiveName, "\" already exists in the schema. It cannot be redefined."), node.name));
-        return;
-      }
-
-      if (knownDirectiveNames[directiveName]) {
-        context.reportError(new _GraphQLError.GraphQLError("There can be only one directive named \"@".concat(directiveName, "\"."), [knownDirectiveNames[directiveName], node.name]));
-      } else {
-        knownDirectiveNames[directiveName] = node.name;
-      }
-
-      return false;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.js.flow b/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.js.flow
deleted file mode 100644
index bad5ca5..0000000
--- a/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.js.flow
+++ /dev/null
@@ -1,47 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type SDLValidationContext } from '../ValidationContext';
-
-/**
- * Unique directive names
- *
- * A GraphQL document is only valid if all defined directives have unique names.
- */
-export function UniqueDirectiveNamesRule(
-  context: SDLValidationContext,
-): ASTVisitor {
-  const knownDirectiveNames = Object.create(null);
-  const schema = context.getSchema();
-
-  return {
-    DirectiveDefinition(node) {
-      const directiveName = node.name.value;
-
-      if (schema?.getDirective(directiveName)) {
-        context.reportError(
-          new GraphQLError(
-            `Directive "@${directiveName}" already exists in the schema. It cannot be redefined.`,
-            node.name,
-          ),
-        );
-        return;
-      }
-
-      if (knownDirectiveNames[directiveName]) {
-        context.reportError(
-          new GraphQLError(
-            `There can be only one directive named "@${directiveName}".`,
-            [knownDirectiveNames[directiveName], node.name],
-          ),
-        );
-      } else {
-        knownDirectiveNames[directiveName] = node.name;
-      }
-
-      return false;
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.mjs b/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.mjs
deleted file mode 100644
index b77197a..0000000
--- a/node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.mjs
+++ /dev/null
@@ -1,29 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * Unique directive names
- *
- * A GraphQL document is only valid if all defined directives have unique names.
- */
-export function UniqueDirectiveNamesRule(context) {
-  var knownDirectiveNames = Object.create(null);
-  var schema = context.getSchema();
-  return {
-    DirectiveDefinition: function DirectiveDefinition(node) {
-      var directiveName = node.name.value;
-
-      if (schema === null || schema === void 0 ? void 0 : schema.getDirective(directiveName)) {
-        context.reportError(new GraphQLError("Directive \"@".concat(directiveName, "\" already exists in the schema. It cannot be redefined."), node.name));
-        return;
-      }
-
-      if (knownDirectiveNames[directiveName]) {
-        context.reportError(new GraphQLError("There can be only one directive named \"@".concat(directiveName, "\"."), [knownDirectiveNames[directiveName], node.name]));
-      } else {
-        knownDirectiveNames[directiveName] = node.name;
-      }
-
-      return false;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.d.ts b/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.d.ts
deleted file mode 100644
index d059446..0000000
--- a/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ASTValidationContext } from '../ValidationContext';
-
-/**
- * Unique directive names per location
- *
- * A GraphQL document is only valid if all directives at a given location
- * are uniquely named.
- */
-export function UniqueDirectivesPerLocationRule(
-  context: ASTValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.js b/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.js
deleted file mode 100644
index 0a16139..0000000
--- a/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.js
+++ /dev/null
@@ -1,82 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.UniqueDirectivesPerLocationRule = UniqueDirectivesPerLocationRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _kinds = require("../../language/kinds");
-
-var _predicates = require("../../language/predicates");
-
-var _directives = require("../../type/directives");
-
-/**
- * Unique directive names per location
- *
- * A GraphQL document is only valid if all non-repeatable directives at
- * a given location are uniquely named.
- */
-function UniqueDirectivesPerLocationRule(context) {
-  var uniqueDirectiveMap = Object.create(null);
-  var schema = context.getSchema();
-  var definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives;
-
-  for (var _i2 = 0; _i2 < definedDirectives.length; _i2++) {
-    var directive = definedDirectives[_i2];
-    uniqueDirectiveMap[directive.name] = !directive.isRepeatable;
-  }
-
-  var astDefinitions = context.getDocument().definitions;
-
-  for (var _i4 = 0; _i4 < astDefinitions.length; _i4++) {
-    var def = astDefinitions[_i4];
-
-    if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) {
-      uniqueDirectiveMap[def.name.value] = !def.repeatable;
-    }
-  }
-
-  var schemaDirectives = Object.create(null);
-  var typeDirectivesMap = Object.create(null);
-  return {
-    // Many different AST nodes may contain directives. Rather than listing
-    // them all, just listen for entering any node, and check to see if it
-    // defines any directives.
-    enter: function enter(node) {
-      if (node.directives == null) {
-        return;
-      }
-
-      var seenDirectives;
-
-      if (node.kind === _kinds.Kind.SCHEMA_DEFINITION || node.kind === _kinds.Kind.SCHEMA_EXTENSION) {
-        seenDirectives = schemaDirectives;
-      } else if ((0, _predicates.isTypeDefinitionNode)(node) || (0, _predicates.isTypeExtensionNode)(node)) {
-        var typeName = node.name.value;
-        seenDirectives = typeDirectivesMap[typeName];
-
-        if (seenDirectives === undefined) {
-          typeDirectivesMap[typeName] = seenDirectives = Object.create(null);
-        }
-      } else {
-        seenDirectives = Object.create(null);
-      }
-
-      for (var _i6 = 0, _node$directives2 = node.directives; _i6 < _node$directives2.length; _i6++) {
-        var _directive = _node$directives2[_i6];
-        var directiveName = _directive.name.value;
-
-        if (uniqueDirectiveMap[directiveName]) {
-          if (seenDirectives[directiveName]) {
-            context.reportError(new _GraphQLError.GraphQLError("The directive \"@".concat(directiveName, "\" can only be used once at this location."), [seenDirectives[directiveName], _directive]));
-          } else {
-            seenDirectives[directiveName] = _directive;
-          }
-        }
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.js.flow b/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.js.flow
deleted file mode 100644
index 4f74d0f..0000000
--- a/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.js.flow
+++ /dev/null
@@ -1,91 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { Kind } from '../../language/kinds';
-import { type ASTVisitor } from '../../language/visitor';
-import {
-  isTypeDefinitionNode,
-  isTypeExtensionNode,
-} from '../../language/predicates';
-
-import { specifiedDirectives } from '../../type/directives';
-
-import {
-  type SDLValidationContext,
-  type ValidationContext,
-} from '../ValidationContext';
-
-/**
- * Unique directive names per location
- *
- * A GraphQL document is only valid if all non-repeatable directives at
- * a given location are uniquely named.
- */
-export function UniqueDirectivesPerLocationRule(
-  context: ValidationContext | SDLValidationContext,
-): ASTVisitor {
-  const uniqueDirectiveMap = Object.create(null);
-
-  const schema = context.getSchema();
-  const definedDirectives = schema
-    ? schema.getDirectives()
-    : specifiedDirectives;
-  for (const directive of definedDirectives) {
-    uniqueDirectiveMap[directive.name] = !directive.isRepeatable;
-  }
-
-  const astDefinitions = context.getDocument().definitions;
-  for (const def of astDefinitions) {
-    if (def.kind === Kind.DIRECTIVE_DEFINITION) {
-      uniqueDirectiveMap[def.name.value] = !def.repeatable;
-    }
-  }
-
-  const schemaDirectives = Object.create(null);
-  const typeDirectivesMap = Object.create(null);
-
-  return {
-    // Many different AST nodes may contain directives. Rather than listing
-    // them all, just listen for entering any node, and check to see if it
-    // defines any directives.
-    enter(node) {
-      if (node.directives == null) {
-        return;
-      }
-
-      let seenDirectives;
-      if (
-        node.kind === Kind.SCHEMA_DEFINITION ||
-        node.kind === Kind.SCHEMA_EXTENSION
-      ) {
-        seenDirectives = schemaDirectives;
-      } else if (isTypeDefinitionNode(node) || isTypeExtensionNode(node)) {
-        const typeName = node.name.value;
-        seenDirectives = typeDirectivesMap[typeName];
-        if (seenDirectives === undefined) {
-          typeDirectivesMap[typeName] = seenDirectives = Object.create(null);
-        }
-      } else {
-        seenDirectives = Object.create(null);
-      }
-
-      for (const directive of node.directives) {
-        const directiveName = directive.name.value;
-
-        if (uniqueDirectiveMap[directiveName]) {
-          if (seenDirectives[directiveName]) {
-            context.reportError(
-              new GraphQLError(
-                `The directive "@${directiveName}" can only be used once at this location.`,
-                [seenDirectives[directiveName], directive],
-              ),
-            );
-          } else {
-            seenDirectives[directiveName] = directive;
-          }
-        }
-      }
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.mjs b/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.mjs
deleted file mode 100644
index 9a3951a..0000000
--- a/node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.mjs
+++ /dev/null
@@ -1,72 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { Kind } from "../../language/kinds.mjs";
-import { isTypeDefinitionNode, isTypeExtensionNode } from "../../language/predicates.mjs";
-import { specifiedDirectives } from "../../type/directives.mjs";
-
-/**
- * Unique directive names per location
- *
- * A GraphQL document is only valid if all non-repeatable directives at
- * a given location are uniquely named.
- */
-export function UniqueDirectivesPerLocationRule(context) {
-  var uniqueDirectiveMap = Object.create(null);
-  var schema = context.getSchema();
-  var definedDirectives = schema ? schema.getDirectives() : specifiedDirectives;
-
-  for (var _i2 = 0; _i2 < definedDirectives.length; _i2++) {
-    var directive = definedDirectives[_i2];
-    uniqueDirectiveMap[directive.name] = !directive.isRepeatable;
-  }
-
-  var astDefinitions = context.getDocument().definitions;
-
-  for (var _i4 = 0; _i4 < astDefinitions.length; _i4++) {
-    var def = astDefinitions[_i4];
-
-    if (def.kind === Kind.DIRECTIVE_DEFINITION) {
-      uniqueDirectiveMap[def.name.value] = !def.repeatable;
-    }
-  }
-
-  var schemaDirectives = Object.create(null);
-  var typeDirectivesMap = Object.create(null);
-  return {
-    // Many different AST nodes may contain directives. Rather than listing
-    // them all, just listen for entering any node, and check to see if it
-    // defines any directives.
-    enter: function enter(node) {
-      if (node.directives == null) {
-        return;
-      }
-
-      var seenDirectives;
-
-      if (node.kind === Kind.SCHEMA_DEFINITION || node.kind === Kind.SCHEMA_EXTENSION) {
-        seenDirectives = schemaDirectives;
-      } else if (isTypeDefinitionNode(node) || isTypeExtensionNode(node)) {
-        var typeName = node.name.value;
-        seenDirectives = typeDirectivesMap[typeName];
-
-        if (seenDirectives === undefined) {
-          typeDirectivesMap[typeName] = seenDirectives = Object.create(null);
-        }
-      } else {
-        seenDirectives = Object.create(null);
-      }
-
-      for (var _i6 = 0, _node$directives2 = node.directives; _i6 < _node$directives2.length; _i6++) {
-        var _directive = _node$directives2[_i6];
-        var directiveName = _directive.name.value;
-
-        if (uniqueDirectiveMap[directiveName]) {
-          if (seenDirectives[directiveName]) {
-            context.reportError(new GraphQLError("The directive \"@".concat(directiveName, "\" can only be used once at this location."), [seenDirectives[directiveName], _directive]));
-          } else {
-            seenDirectives[directiveName] = _directive;
-          }
-        }
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueEnumValueNames.d.ts b/node_modules/graphql/validation/rules/UniqueEnumValueNames.d.ts
deleted file mode 100644
index 96d9b78..0000000
--- a/node_modules/graphql/validation/rules/UniqueEnumValueNames.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueEnumValueNamesRule } from 'graphql'
- * or
- *   import { UniqueEnumValueNamesRule } from 'graphql/validation'
- */
-export { UniqueEnumValueNamesRule as UniqueEnumValueNames } from './UniqueEnumValueNamesRule';
diff --git a/node_modules/graphql/validation/rules/UniqueEnumValueNames.js b/node_modules/graphql/validation/rules/UniqueEnumValueNames.js
deleted file mode 100644
index 3f5ea51..0000000
--- a/node_modules/graphql/validation/rules/UniqueEnumValueNames.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "UniqueEnumValueNames", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueEnumValueNamesRule.UniqueEnumValueNamesRule;
-  }
-});
-
-var _UniqueEnumValueNamesRule = require("./UniqueEnumValueNamesRule");
diff --git a/node_modules/graphql/validation/rules/UniqueEnumValueNames.js.flow b/node_modules/graphql/validation/rules/UniqueEnumValueNames.js.flow
deleted file mode 100644
index bf40bb2..0000000
--- a/node_modules/graphql/validation/rules/UniqueEnumValueNames.js.flow
+++ /dev/null
@@ -1,10 +0,0 @@
-// @flow strict
-
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueEnumValueNamesRule } from 'graphql'
- * or
- *   import { UniqueEnumValueNamesRule } from 'graphql/validation'
- */
-export { UniqueEnumValueNamesRule as UniqueEnumValueNames } from './UniqueEnumValueNamesRule';
diff --git a/node_modules/graphql/validation/rules/UniqueEnumValueNames.mjs b/node_modules/graphql/validation/rules/UniqueEnumValueNames.mjs
deleted file mode 100644
index 05f361a..0000000
--- a/node_modules/graphql/validation/rules/UniqueEnumValueNames.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueEnumValueNamesRule } from 'graphql'
- * or
- *   import { UniqueEnumValueNamesRule } from 'graphql/validation'
- */
-export { UniqueEnumValueNamesRule as UniqueEnumValueNames } from "./UniqueEnumValueNamesRule.mjs";
diff --git a/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.d.ts b/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.d.ts
deleted file mode 100644
index 9c5ff50..0000000
--- a/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { SDLValidationContext } from '../ValidationContext';
-
-/**
- * Unique enum value names
- *
- * A GraphQL enum type is only valid if all its values are uniquely named.
- */
-export function UniqueEnumValueNamesRule(
-  context: SDLValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js b/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js
deleted file mode 100644
index 41d7e9e..0000000
--- a/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js
+++ /dev/null
@@ -1,56 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.UniqueEnumValueNamesRule = UniqueEnumValueNamesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _definition = require("../../type/definition");
-
-/**
- * Unique enum value names
- *
- * A GraphQL enum type is only valid if all its values are uniquely named.
- */
-function UniqueEnumValueNamesRule(context) {
-  var schema = context.getSchema();
-  var existingTypeMap = schema ? schema.getTypeMap() : Object.create(null);
-  var knownValueNames = Object.create(null);
-  return {
-    EnumTypeDefinition: checkValueUniqueness,
-    EnumTypeExtension: checkValueUniqueness
-  };
-
-  function checkValueUniqueness(node) {
-    var _node$values;
-
-    var typeName = node.name.value;
-
-    if (!knownValueNames[typeName]) {
-      knownValueNames[typeName] = Object.create(null);
-    }
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-
-    var valueNodes = (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : [];
-    var valueNames = knownValueNames[typeName];
-
-    for (var _i2 = 0; _i2 < valueNodes.length; _i2++) {
-      var valueDef = valueNodes[_i2];
-      var valueName = valueDef.name.value;
-      var existingType = existingTypeMap[typeName];
-
-      if ((0, _definition.isEnumType)(existingType) && existingType.getValue(valueName)) {
-        context.reportError(new _GraphQLError.GraphQLError("Enum value \"".concat(typeName, ".").concat(valueName, "\" already exists in the schema. It cannot also be defined in this type extension."), valueDef.name));
-      } else if (valueNames[valueName]) {
-        context.reportError(new _GraphQLError.GraphQLError("Enum value \"".concat(typeName, ".").concat(valueName, "\" can only be defined once."), [valueNames[valueName], valueDef.name]));
-      } else {
-        valueNames[valueName] = valueDef.name;
-      }
-    }
-
-    return false;
-  }
-}
diff --git a/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow b/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow
deleted file mode 100644
index dac1939..0000000
--- a/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.js.flow
+++ /dev/null
@@ -1,62 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-import { isEnumType } from '../../type/definition';
-
-import { type SDLValidationContext } from '../ValidationContext';
-
-/**
- * Unique enum value names
- *
- * A GraphQL enum type is only valid if all its values are uniquely named.
- */
-export function UniqueEnumValueNamesRule(
-  context: SDLValidationContext,
-): ASTVisitor {
-  const schema = context.getSchema();
-  const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null);
-  const knownValueNames = Object.create(null);
-
-  return {
-    EnumTypeDefinition: checkValueUniqueness,
-    EnumTypeExtension: checkValueUniqueness,
-  };
-
-  function checkValueUniqueness(node) {
-    const typeName = node.name.value;
-
-    if (!knownValueNames[typeName]) {
-      knownValueNames[typeName] = Object.create(null);
-    }
-
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-    const valueNodes = node.values ?? [];
-    const valueNames = knownValueNames[typeName];
-
-    for (const valueDef of valueNodes) {
-      const valueName = valueDef.name.value;
-
-      const existingType = existingTypeMap[typeName];
-      if (isEnumType(existingType) && existingType.getValue(valueName)) {
-        context.reportError(
-          new GraphQLError(
-            `Enum value "${typeName}.${valueName}" already exists in the schema. It cannot also be defined in this type extension.`,
-            valueDef.name,
-          ),
-        );
-      } else if (valueNames[valueName]) {
-        context.reportError(
-          new GraphQLError(
-            `Enum value "${typeName}.${valueName}" can only be defined once.`,
-            [valueNames[valueName], valueDef.name],
-          ),
-        );
-      } else {
-        valueNames[valueName] = valueDef.name;
-      }
-    }
-
-    return false;
-  }
-}
diff --git a/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.mjs b/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.mjs
deleted file mode 100644
index 23c979b..0000000
--- a/node_modules/graphql/validation/rules/UniqueEnumValueNamesRule.mjs
+++ /dev/null
@@ -1,48 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { isEnumType } from "../../type/definition.mjs";
-
-/**
- * Unique enum value names
- *
- * A GraphQL enum type is only valid if all its values are uniquely named.
- */
-export function UniqueEnumValueNamesRule(context) {
-  var schema = context.getSchema();
-  var existingTypeMap = schema ? schema.getTypeMap() : Object.create(null);
-  var knownValueNames = Object.create(null);
-  return {
-    EnumTypeDefinition: checkValueUniqueness,
-    EnumTypeExtension: checkValueUniqueness
-  };
-
-  function checkValueUniqueness(node) {
-    var _node$values;
-
-    var typeName = node.name.value;
-
-    if (!knownValueNames[typeName]) {
-      knownValueNames[typeName] = Object.create(null);
-    }
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-
-    var valueNodes = (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : [];
-    var valueNames = knownValueNames[typeName];
-
-    for (var _i2 = 0; _i2 < valueNodes.length; _i2++) {
-      var valueDef = valueNodes[_i2];
-      var valueName = valueDef.name.value;
-      var existingType = existingTypeMap[typeName];
-
-      if (isEnumType(existingType) && existingType.getValue(valueName)) {
-        context.reportError(new GraphQLError("Enum value \"".concat(typeName, ".").concat(valueName, "\" already exists in the schema. It cannot also be defined in this type extension."), valueDef.name));
-      } else if (valueNames[valueName]) {
-        context.reportError(new GraphQLError("Enum value \"".concat(typeName, ".").concat(valueName, "\" can only be defined once."), [valueNames[valueName], valueDef.name]));
-      } else {
-        valueNames[valueName] = valueDef.name;
-      }
-    }
-
-    return false;
-  }
-}
diff --git a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNames.d.ts b/node_modules/graphql/validation/rules/UniqueFieldDefinitionNames.d.ts
deleted file mode 100644
index 26ebb06..0000000
--- a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNames.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueFieldDefinitionNamesRule } from 'graphql'
- * or
- *   import { UniqueFieldDefinitionNamesRule } from 'graphql/validation'
- */
-export { UniqueFieldDefinitionNamesRule as UniqueFieldDefinitionNames } from './UniqueFieldDefinitionNamesRule';
diff --git a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNames.js b/node_modules/graphql/validation/rules/UniqueFieldDefinitionNames.js
deleted file mode 100644
index b47ef36..0000000
--- a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNames.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "UniqueFieldDefinitionNames", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueFieldDefinitionNamesRule.UniqueFieldDefinitionNamesRule;
-  }
-});
-
-var _UniqueFieldDefinitionNamesRule = require("./UniqueFieldDefinitionNamesRule");
diff --git a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNames.js.flow b/node_modules/graphql/validation/rules/UniqueFieldDefinitionNames.js.flow
deleted file mode 100644
index 2efdf02..0000000
--- a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNames.js.flow
+++ /dev/null
@@ -1,10 +0,0 @@
-// @flow strict
-
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueFieldDefinitionNamesRule } from 'graphql'
- * or
- *   import { UniqueFieldDefinitionNamesRule } from 'graphql/validation'
- */
-export { UniqueFieldDefinitionNamesRule as UniqueFieldDefinitionNames } from './UniqueFieldDefinitionNamesRule';
diff --git a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNames.mjs b/node_modules/graphql/validation/rules/UniqueFieldDefinitionNames.mjs
deleted file mode 100644
index c2a3add..0000000
--- a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNames.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueFieldDefinitionNamesRule } from 'graphql'
- * or
- *   import { UniqueFieldDefinitionNamesRule } from 'graphql/validation'
- */
-export { UniqueFieldDefinitionNamesRule as UniqueFieldDefinitionNames } from "./UniqueFieldDefinitionNamesRule.mjs";
diff --git a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.d.ts b/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.d.ts
deleted file mode 100644
index 6f356ed..0000000
--- a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { SDLValidationContext } from '../ValidationContext';
-
-/**
- * Unique field definition names
- *
- * A GraphQL complex type is only valid if all its fields are uniquely named.
- */
-export function UniqueFieldDefinitionNamesRule(
-  context: SDLValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js b/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js
deleted file mode 100644
index 133585b..0000000
--- a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js
+++ /dev/null
@@ -1,67 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.UniqueFieldDefinitionNamesRule = UniqueFieldDefinitionNamesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _definition = require("../../type/definition");
-
-/**
- * Unique field definition names
- *
- * A GraphQL complex type is only valid if all its fields are uniquely named.
- */
-function UniqueFieldDefinitionNamesRule(context) {
-  var schema = context.getSchema();
-  var existingTypeMap = schema ? schema.getTypeMap() : Object.create(null);
-  var knownFieldNames = Object.create(null);
-  return {
-    InputObjectTypeDefinition: checkFieldUniqueness,
-    InputObjectTypeExtension: checkFieldUniqueness,
-    InterfaceTypeDefinition: checkFieldUniqueness,
-    InterfaceTypeExtension: checkFieldUniqueness,
-    ObjectTypeDefinition: checkFieldUniqueness,
-    ObjectTypeExtension: checkFieldUniqueness
-  };
-
-  function checkFieldUniqueness(node) {
-    var _node$fields;
-
-    var typeName = node.name.value;
-
-    if (!knownFieldNames[typeName]) {
-      knownFieldNames[typeName] = Object.create(null);
-    }
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-
-    var fieldNodes = (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : [];
-    var fieldNames = knownFieldNames[typeName];
-
-    for (var _i2 = 0; _i2 < fieldNodes.length; _i2++) {
-      var fieldDef = fieldNodes[_i2];
-      var fieldName = fieldDef.name.value;
-
-      if (hasField(existingTypeMap[typeName], fieldName)) {
-        context.reportError(new _GraphQLError.GraphQLError("Field \"".concat(typeName, ".").concat(fieldName, "\" already exists in the schema. It cannot also be defined in this type extension."), fieldDef.name));
-      } else if (fieldNames[fieldName]) {
-        context.reportError(new _GraphQLError.GraphQLError("Field \"".concat(typeName, ".").concat(fieldName, "\" can only be defined once."), [fieldNames[fieldName], fieldDef.name]));
-      } else {
-        fieldNames[fieldName] = fieldDef.name;
-      }
-    }
-
-    return false;
-  }
-}
-
-function hasField(type, fieldName) {
-  if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type) || (0, _definition.isInputObjectType)(type)) {
-    return type.getFields()[fieldName];
-  }
-
-  return false;
-}
diff --git a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js.flow b/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js.flow
deleted file mode 100644
index 2a75e5b..0000000
--- a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.js.flow
+++ /dev/null
@@ -1,76 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-import {
-  isObjectType,
-  isInterfaceType,
-  isInputObjectType,
-} from '../../type/definition';
-
-import { type SDLValidationContext } from '../ValidationContext';
-
-/**
- * Unique field definition names
- *
- * A GraphQL complex type is only valid if all its fields are uniquely named.
- */
-export function UniqueFieldDefinitionNamesRule(
-  context: SDLValidationContext,
-): ASTVisitor {
-  const schema = context.getSchema();
-  const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null);
-  const knownFieldNames = Object.create(null);
-
-  return {
-    InputObjectTypeDefinition: checkFieldUniqueness,
-    InputObjectTypeExtension: checkFieldUniqueness,
-    InterfaceTypeDefinition: checkFieldUniqueness,
-    InterfaceTypeExtension: checkFieldUniqueness,
-    ObjectTypeDefinition: checkFieldUniqueness,
-    ObjectTypeExtension: checkFieldUniqueness,
-  };
-
-  function checkFieldUniqueness(node) {
-    const typeName = node.name.value;
-
-    if (!knownFieldNames[typeName]) {
-      knownFieldNames[typeName] = Object.create(null);
-    }
-
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-    const fieldNodes = node.fields ?? [];
-    const fieldNames = knownFieldNames[typeName];
-
-    for (const fieldDef of fieldNodes) {
-      const fieldName = fieldDef.name.value;
-
-      if (hasField(existingTypeMap[typeName], fieldName)) {
-        context.reportError(
-          new GraphQLError(
-            `Field "${typeName}.${fieldName}" already exists in the schema. It cannot also be defined in this type extension.`,
-            fieldDef.name,
-          ),
-        );
-      } else if (fieldNames[fieldName]) {
-        context.reportError(
-          new GraphQLError(
-            `Field "${typeName}.${fieldName}" can only be defined once.`,
-            [fieldNames[fieldName], fieldDef.name],
-          ),
-        );
-      } else {
-        fieldNames[fieldName] = fieldDef.name;
-      }
-    }
-
-    return false;
-  }
-}
-
-function hasField(type, fieldName) {
-  if (isObjectType(type) || isInterfaceType(type) || isInputObjectType(type)) {
-    return type.getFields()[fieldName];
-  }
-  return false;
-}
diff --git a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.mjs b/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.mjs
deleted file mode 100644
index 0697264..0000000
--- a/node_modules/graphql/validation/rules/UniqueFieldDefinitionNamesRule.mjs
+++ /dev/null
@@ -1,59 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { isObjectType, isInterfaceType, isInputObjectType } from "../../type/definition.mjs";
-
-/**
- * Unique field definition names
- *
- * A GraphQL complex type is only valid if all its fields are uniquely named.
- */
-export function UniqueFieldDefinitionNamesRule(context) {
-  var schema = context.getSchema();
-  var existingTypeMap = schema ? schema.getTypeMap() : Object.create(null);
-  var knownFieldNames = Object.create(null);
-  return {
-    InputObjectTypeDefinition: checkFieldUniqueness,
-    InputObjectTypeExtension: checkFieldUniqueness,
-    InterfaceTypeDefinition: checkFieldUniqueness,
-    InterfaceTypeExtension: checkFieldUniqueness,
-    ObjectTypeDefinition: checkFieldUniqueness,
-    ObjectTypeExtension: checkFieldUniqueness
-  };
-
-  function checkFieldUniqueness(node) {
-    var _node$fields;
-
-    var typeName = node.name.value;
-
-    if (!knownFieldNames[typeName]) {
-      knownFieldNames[typeName] = Object.create(null);
-    }
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-
-
-    var fieldNodes = (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : [];
-    var fieldNames = knownFieldNames[typeName];
-
-    for (var _i2 = 0; _i2 < fieldNodes.length; _i2++) {
-      var fieldDef = fieldNodes[_i2];
-      var fieldName = fieldDef.name.value;
-
-      if (hasField(existingTypeMap[typeName], fieldName)) {
-        context.reportError(new GraphQLError("Field \"".concat(typeName, ".").concat(fieldName, "\" already exists in the schema. It cannot also be defined in this type extension."), fieldDef.name));
-      } else if (fieldNames[fieldName]) {
-        context.reportError(new GraphQLError("Field \"".concat(typeName, ".").concat(fieldName, "\" can only be defined once."), [fieldNames[fieldName], fieldDef.name]));
-      } else {
-        fieldNames[fieldName] = fieldDef.name;
-      }
-    }
-
-    return false;
-  }
-}
-
-function hasField(type, fieldName) {
-  if (isObjectType(type) || isInterfaceType(type) || isInputObjectType(type)) {
-    return type.getFields()[fieldName];
-  }
-
-  return false;
-}
diff --git a/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.d.ts b/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.d.ts
deleted file mode 100644
index 6154158..0000000
--- a/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ASTValidationContext } from '../ValidationContext';
-
-/**
- * Unique fragment names
- *
- * A GraphQL document is only valid if all defined fragments have unique names.
- */
-export function UniqueFragmentNamesRule(
-  context: ASTValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.js b/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.js
deleted file mode 100644
index b19e151..0000000
--- a/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.js
+++ /dev/null
@@ -1,33 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.UniqueFragmentNamesRule = UniqueFragmentNamesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * Unique fragment names
- *
- * A GraphQL document is only valid if all defined fragments have unique names.
- */
-function UniqueFragmentNamesRule(context) {
-  var knownFragmentNames = Object.create(null);
-  return {
-    OperationDefinition: function OperationDefinition() {
-      return false;
-    },
-    FragmentDefinition: function FragmentDefinition(node) {
-      var fragmentName = node.name.value;
-
-      if (knownFragmentNames[fragmentName]) {
-        context.reportError(new _GraphQLError.GraphQLError("There can be only one fragment named \"".concat(fragmentName, "\"."), [knownFragmentNames[fragmentName], node.name]));
-      } else {
-        knownFragmentNames[fragmentName] = node.name;
-      }
-
-      return false;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.js.flow b/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.js.flow
deleted file mode 100644
index 3150ab6..0000000
--- a/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.js.flow
+++ /dev/null
@@ -1,34 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type ASTValidationContext } from '../ValidationContext';
-
-/**
- * Unique fragment names
- *
- * A GraphQL document is only valid if all defined fragments have unique names.
- */
-export function UniqueFragmentNamesRule(
-  context: ASTValidationContext,
-): ASTVisitor {
-  const knownFragmentNames = Object.create(null);
-  return {
-    OperationDefinition: () => false,
-    FragmentDefinition(node) {
-      const fragmentName = node.name.value;
-      if (knownFragmentNames[fragmentName]) {
-        context.reportError(
-          new GraphQLError(
-            `There can be only one fragment named "${fragmentName}".`,
-            [knownFragmentNames[fragmentName], node.name],
-          ),
-        );
-      } else {
-        knownFragmentNames[fragmentName] = node.name;
-      }
-      return false;
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.mjs b/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.mjs
deleted file mode 100644
index d9b0ef3..0000000
--- a/node_modules/graphql/validation/rules/UniqueFragmentNamesRule.mjs
+++ /dev/null
@@ -1,26 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * Unique fragment names
- *
- * A GraphQL document is only valid if all defined fragments have unique names.
- */
-export function UniqueFragmentNamesRule(context) {
-  var knownFragmentNames = Object.create(null);
-  return {
-    OperationDefinition: function OperationDefinition() {
-      return false;
-    },
-    FragmentDefinition: function FragmentDefinition(node) {
-      var fragmentName = node.name.value;
-
-      if (knownFragmentNames[fragmentName]) {
-        context.reportError(new GraphQLError("There can be only one fragment named \"".concat(fragmentName, "\"."), [knownFragmentNames[fragmentName], node.name]));
-      } else {
-        knownFragmentNames[fragmentName] = node.name;
-      }
-
-      return false;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.d.ts b/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.d.ts
deleted file mode 100644
index c66d65f..0000000
--- a/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ASTValidationContext } from '../ValidationContext';
-
-/**
- * Unique input field names
- *
- * A GraphQL input object value is only valid if all supplied fields are
- * uniquely named.
- */
-export function UniqueInputFieldNamesRule(
-  context: ASTValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.js b/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.js
deleted file mode 100644
index 00e6ccf..0000000
--- a/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.js
+++ /dev/null
@@ -1,39 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.UniqueInputFieldNamesRule = UniqueInputFieldNamesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * Unique input field names
- *
- * A GraphQL input object value is only valid if all supplied fields are
- * uniquely named.
- */
-function UniqueInputFieldNamesRule(context) {
-  var knownNameStack = [];
-  var knownNames = Object.create(null);
-  return {
-    ObjectValue: {
-      enter: function enter() {
-        knownNameStack.push(knownNames);
-        knownNames = Object.create(null);
-      },
-      leave: function leave() {
-        knownNames = knownNameStack.pop();
-      }
-    },
-    ObjectField: function ObjectField(node) {
-      var fieldName = node.name.value;
-
-      if (knownNames[fieldName]) {
-        context.reportError(new _GraphQLError.GraphQLError("There can be only one input field named \"".concat(fieldName, "\"."), [knownNames[fieldName], node.name]));
-      } else {
-        knownNames[fieldName] = node.name;
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.js.flow b/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.js.flow
deleted file mode 100644
index 9041bdd..0000000
--- a/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.js.flow
+++ /dev/null
@@ -1,44 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type ASTValidationContext } from '../ValidationContext';
-
-/**
- * Unique input field names
- *
- * A GraphQL input object value is only valid if all supplied fields are
- * uniquely named.
- */
-export function UniqueInputFieldNamesRule(
-  context: ASTValidationContext,
-): ASTVisitor {
-  const knownNameStack = [];
-  let knownNames = Object.create(null);
-
-  return {
-    ObjectValue: {
-      enter() {
-        knownNameStack.push(knownNames);
-        knownNames = Object.create(null);
-      },
-      leave() {
-        knownNames = knownNameStack.pop();
-      },
-    },
-    ObjectField(node) {
-      const fieldName = node.name.value;
-      if (knownNames[fieldName]) {
-        context.reportError(
-          new GraphQLError(
-            `There can be only one input field named "${fieldName}".`,
-            [knownNames[fieldName], node.name],
-          ),
-        );
-      } else {
-        knownNames[fieldName] = node.name;
-      }
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.mjs b/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.mjs
deleted file mode 100644
index ae0c884..0000000
--- a/node_modules/graphql/validation/rules/UniqueInputFieldNamesRule.mjs
+++ /dev/null
@@ -1,32 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * Unique input field names
- *
- * A GraphQL input object value is only valid if all supplied fields are
- * uniquely named.
- */
-export function UniqueInputFieldNamesRule(context) {
-  var knownNameStack = [];
-  var knownNames = Object.create(null);
-  return {
-    ObjectValue: {
-      enter: function enter() {
-        knownNameStack.push(knownNames);
-        knownNames = Object.create(null);
-      },
-      leave: function leave() {
-        knownNames = knownNameStack.pop();
-      }
-    },
-    ObjectField: function ObjectField(node) {
-      var fieldName = node.name.value;
-
-      if (knownNames[fieldName]) {
-        context.reportError(new GraphQLError("There can be only one input field named \"".concat(fieldName, "\"."), [knownNames[fieldName], node.name]));
-      } else {
-        knownNames[fieldName] = node.name;
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueOperationNamesRule.d.ts b/node_modules/graphql/validation/rules/UniqueOperationNamesRule.d.ts
deleted file mode 100644
index aa2d06a..0000000
--- a/node_modules/graphql/validation/rules/UniqueOperationNamesRule.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ASTValidationContext } from '../ValidationContext';
-
-/**
- * Unique operation names
- *
- * A GraphQL document is only valid if all defined operations have unique names.
- */
-export function UniqueOperationNamesRule(
-  context: ASTValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/UniqueOperationNamesRule.js b/node_modules/graphql/validation/rules/UniqueOperationNamesRule.js
deleted file mode 100644
index d87c169..0000000
--- a/node_modules/graphql/validation/rules/UniqueOperationNamesRule.js
+++ /dev/null
@@ -1,35 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.UniqueOperationNamesRule = UniqueOperationNamesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * Unique operation names
- *
- * A GraphQL document is only valid if all defined operations have unique names.
- */
-function UniqueOperationNamesRule(context) {
-  var knownOperationNames = Object.create(null);
-  return {
-    OperationDefinition: function OperationDefinition(node) {
-      var operationName = node.name;
-
-      if (operationName) {
-        if (knownOperationNames[operationName.value]) {
-          context.reportError(new _GraphQLError.GraphQLError("There can be only one operation named \"".concat(operationName.value, "\"."), [knownOperationNames[operationName.value], operationName]));
-        } else {
-          knownOperationNames[operationName.value] = operationName;
-        }
-      }
-
-      return false;
-    },
-    FragmentDefinition: function FragmentDefinition() {
-      return false;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueOperationNamesRule.js.flow b/node_modules/graphql/validation/rules/UniqueOperationNamesRule.js.flow
deleted file mode 100644
index 3a0e40d..0000000
--- a/node_modules/graphql/validation/rules/UniqueOperationNamesRule.js.flow
+++ /dev/null
@@ -1,36 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type ASTValidationContext } from '../ValidationContext';
-
-/**
- * Unique operation names
- *
- * A GraphQL document is only valid if all defined operations have unique names.
- */
-export function UniqueOperationNamesRule(
-  context: ASTValidationContext,
-): ASTVisitor {
-  const knownOperationNames = Object.create(null);
-  return {
-    OperationDefinition(node) {
-      const operationName = node.name;
-      if (operationName) {
-        if (knownOperationNames[operationName.value]) {
-          context.reportError(
-            new GraphQLError(
-              `There can be only one operation named "${operationName.value}".`,
-              [knownOperationNames[operationName.value], operationName],
-            ),
-          );
-        } else {
-          knownOperationNames[operationName.value] = operationName;
-        }
-      }
-      return false;
-    },
-    FragmentDefinition: () => false,
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueOperationNamesRule.mjs b/node_modules/graphql/validation/rules/UniqueOperationNamesRule.mjs
deleted file mode 100644
index 28190c5..0000000
--- a/node_modules/graphql/validation/rules/UniqueOperationNamesRule.mjs
+++ /dev/null
@@ -1,28 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * Unique operation names
- *
- * A GraphQL document is only valid if all defined operations have unique names.
- */
-export function UniqueOperationNamesRule(context) {
-  var knownOperationNames = Object.create(null);
-  return {
-    OperationDefinition: function OperationDefinition(node) {
-      var operationName = node.name;
-
-      if (operationName) {
-        if (knownOperationNames[operationName.value]) {
-          context.reportError(new GraphQLError("There can be only one operation named \"".concat(operationName.value, "\"."), [knownOperationNames[operationName.value], operationName]));
-        } else {
-          knownOperationNames[operationName.value] = operationName;
-        }
-      }
-
-      return false;
-    },
-    FragmentDefinition: function FragmentDefinition() {
-      return false;
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueOperationTypes.d.ts b/node_modules/graphql/validation/rules/UniqueOperationTypes.d.ts
deleted file mode 100644
index 423932d..0000000
--- a/node_modules/graphql/validation/rules/UniqueOperationTypes.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueOperationTypesRule } from 'graphql'
- * or
- *   import { UniqueOperationTypesRule } from 'graphql/validation'
- */
-export { UniqueOperationTypesRule as UniqueOperationTypes } from './UniqueOperationTypesRule';
diff --git a/node_modules/graphql/validation/rules/UniqueOperationTypes.js b/node_modules/graphql/validation/rules/UniqueOperationTypes.js
deleted file mode 100644
index d73f60d..0000000
--- a/node_modules/graphql/validation/rules/UniqueOperationTypes.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "UniqueOperationTypes", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueOperationTypesRule.UniqueOperationTypesRule;
-  }
-});
-
-var _UniqueOperationTypesRule = require("./UniqueOperationTypesRule");
diff --git a/node_modules/graphql/validation/rules/UniqueOperationTypes.js.flow b/node_modules/graphql/validation/rules/UniqueOperationTypes.js.flow
deleted file mode 100644
index bb3d541..0000000
--- a/node_modules/graphql/validation/rules/UniqueOperationTypes.js.flow
+++ /dev/null
@@ -1,10 +0,0 @@
-// @flow strict
-
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueOperationTypesRule } from 'graphql'
- * or
- *   import { UniqueOperationTypesRule } from 'graphql/validation'
- */
-export { UniqueOperationTypesRule as UniqueOperationTypes } from './UniqueOperationTypesRule';
diff --git a/node_modules/graphql/validation/rules/UniqueOperationTypes.mjs b/node_modules/graphql/validation/rules/UniqueOperationTypes.mjs
deleted file mode 100644
index 4cd53b3..0000000
--- a/node_modules/graphql/validation/rules/UniqueOperationTypes.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueOperationTypesRule } from 'graphql'
- * or
- *   import { UniqueOperationTypesRule } from 'graphql/validation'
- */
-export { UniqueOperationTypesRule as UniqueOperationTypes } from "./UniqueOperationTypesRule.mjs";
diff --git a/node_modules/graphql/validation/rules/UniqueOperationTypesRule.d.ts b/node_modules/graphql/validation/rules/UniqueOperationTypesRule.d.ts
deleted file mode 100644
index a0d6441..0000000
--- a/node_modules/graphql/validation/rules/UniqueOperationTypesRule.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { SDLValidationContext } from '../ValidationContext';
-
-/**
- * Unique operation types
- *
- * A GraphQL document is only valid if it has only one type per operation.
- */
-export function UniqueOperationTypesRule(
-  context: SDLValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/UniqueOperationTypesRule.js b/node_modules/graphql/validation/rules/UniqueOperationTypesRule.js
deleted file mode 100644
index 8fc9e8a..0000000
--- a/node_modules/graphql/validation/rules/UniqueOperationTypesRule.js
+++ /dev/null
@@ -1,50 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.UniqueOperationTypesRule = UniqueOperationTypesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * Unique operation types
- *
- * A GraphQL document is only valid if it has only one type per operation.
- */
-function UniqueOperationTypesRule(context) {
-  var schema = context.getSchema();
-  var definedOperationTypes = Object.create(null);
-  var existingOperationTypes = schema ? {
-    query: schema.getQueryType(),
-    mutation: schema.getMutationType(),
-    subscription: schema.getSubscriptionType()
-  } : {};
-  return {
-    SchemaDefinition: checkOperationTypes,
-    SchemaExtension: checkOperationTypes
-  };
-
-  function checkOperationTypes(node) {
-    var _node$operationTypes;
-
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-    var operationTypesNodes = (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : [];
-
-    for (var _i2 = 0; _i2 < operationTypesNodes.length; _i2++) {
-      var operationType = operationTypesNodes[_i2];
-      var operation = operationType.operation;
-      var alreadyDefinedOperationType = definedOperationTypes[operation];
-
-      if (existingOperationTypes[operation]) {
-        context.reportError(new _GraphQLError.GraphQLError("Type for ".concat(operation, " already defined in the schema. It cannot be redefined."), operationType));
-      } else if (alreadyDefinedOperationType) {
-        context.reportError(new _GraphQLError.GraphQLError("There can be only one ".concat(operation, " type in schema."), [alreadyDefinedOperationType, operationType]));
-      } else {
-        definedOperationTypes[operation] = operationType;
-      }
-    }
-
-    return false;
-  }
-}
diff --git a/node_modules/graphql/validation/rules/UniqueOperationTypesRule.js.flow b/node_modules/graphql/validation/rules/UniqueOperationTypesRule.js.flow
deleted file mode 100644
index 2cd40fc..0000000
--- a/node_modules/graphql/validation/rules/UniqueOperationTypesRule.js.flow
+++ /dev/null
@@ -1,60 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type SDLValidationContext } from '../ValidationContext';
-
-/**
- * Unique operation types
- *
- * A GraphQL document is only valid if it has only one type per operation.
- */
-export function UniqueOperationTypesRule(
-  context: SDLValidationContext,
-): ASTVisitor {
-  const schema = context.getSchema();
-  const definedOperationTypes = Object.create(null);
-  const existingOperationTypes = schema
-    ? {
-        query: schema.getQueryType(),
-        mutation: schema.getMutationType(),
-        subscription: schema.getSubscriptionType(),
-      }
-    : {};
-
-  return {
-    SchemaDefinition: checkOperationTypes,
-    SchemaExtension: checkOperationTypes,
-  };
-
-  function checkOperationTypes(node) {
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-    const operationTypesNodes = node.operationTypes ?? [];
-
-    for (const operationType of operationTypesNodes) {
-      const operation = operationType.operation;
-      const alreadyDefinedOperationType = definedOperationTypes[operation];
-
-      if (existingOperationTypes[operation]) {
-        context.reportError(
-          new GraphQLError(
-            `Type for ${operation} already defined in the schema. It cannot be redefined.`,
-            operationType,
-          ),
-        );
-      } else if (alreadyDefinedOperationType) {
-        context.reportError(
-          new GraphQLError(
-            `There can be only one ${operation} type in schema.`,
-            [alreadyDefinedOperationType, operationType],
-          ),
-        );
-      } else {
-        definedOperationTypes[operation] = operationType;
-      }
-    }
-
-    return false;
-  }
-}
diff --git a/node_modules/graphql/validation/rules/UniqueOperationTypesRule.mjs b/node_modules/graphql/validation/rules/UniqueOperationTypesRule.mjs
deleted file mode 100644
index af01655..0000000
--- a/node_modules/graphql/validation/rules/UniqueOperationTypesRule.mjs
+++ /dev/null
@@ -1,43 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * Unique operation types
- *
- * A GraphQL document is only valid if it has only one type per operation.
- */
-export function UniqueOperationTypesRule(context) {
-  var schema = context.getSchema();
-  var definedOperationTypes = Object.create(null);
-  var existingOperationTypes = schema ? {
-    query: schema.getQueryType(),
-    mutation: schema.getMutationType(),
-    subscription: schema.getSubscriptionType()
-  } : {};
-  return {
-    SchemaDefinition: checkOperationTypes,
-    SchemaExtension: checkOperationTypes
-  };
-
-  function checkOperationTypes(node) {
-    var _node$operationTypes;
-
-    /* istanbul ignore next (See https://github.com/graphql/graphql-js/issues/2203) */
-    var operationTypesNodes = (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : [];
-
-    for (var _i2 = 0; _i2 < operationTypesNodes.length; _i2++) {
-      var operationType = operationTypesNodes[_i2];
-      var operation = operationType.operation;
-      var alreadyDefinedOperationType = definedOperationTypes[operation];
-
-      if (existingOperationTypes[operation]) {
-        context.reportError(new GraphQLError("Type for ".concat(operation, " already defined in the schema. It cannot be redefined."), operationType));
-      } else if (alreadyDefinedOperationType) {
-        context.reportError(new GraphQLError("There can be only one ".concat(operation, " type in schema."), [alreadyDefinedOperationType, operationType]));
-      } else {
-        definedOperationTypes[operation] = operationType;
-      }
-    }
-
-    return false;
-  }
-}
diff --git a/node_modules/graphql/validation/rules/UniqueTypeNames.d.ts b/node_modules/graphql/validation/rules/UniqueTypeNames.d.ts
deleted file mode 100644
index 1740eef..0000000
--- a/node_modules/graphql/validation/rules/UniqueTypeNames.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueTypeNamesRule } from 'graphql'
- * or
- *   import { UniqueTypeNamesRule } from 'graphql/validation'
- */
-export { UniqueTypeNamesRule as UniqueTypeNames } from './UniqueTypeNamesRule';
diff --git a/node_modules/graphql/validation/rules/UniqueTypeNames.js b/node_modules/graphql/validation/rules/UniqueTypeNames.js
deleted file mode 100644
index 362855c..0000000
--- a/node_modules/graphql/validation/rules/UniqueTypeNames.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-Object.defineProperty(exports, "UniqueTypeNames", {
-  enumerable: true,
-  get: function get() {
-    return _UniqueTypeNamesRule.UniqueTypeNamesRule;
-  }
-});
-
-var _UniqueTypeNamesRule = require("./UniqueTypeNamesRule");
diff --git a/node_modules/graphql/validation/rules/UniqueTypeNames.js.flow b/node_modules/graphql/validation/rules/UniqueTypeNames.js.flow
deleted file mode 100644
index ea708b2..0000000
--- a/node_modules/graphql/validation/rules/UniqueTypeNames.js.flow
+++ /dev/null
@@ -1,10 +0,0 @@
-// @flow strict
-
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueTypeNamesRule } from 'graphql'
- * or
- *   import { UniqueTypeNamesRule } from 'graphql/validation'
- */
-export { UniqueTypeNamesRule as UniqueTypeNames } from './UniqueTypeNamesRule';
diff --git a/node_modules/graphql/validation/rules/UniqueTypeNames.mjs b/node_modules/graphql/validation/rules/UniqueTypeNames.mjs
deleted file mode 100644
index ea0c5bf..0000000
--- a/node_modules/graphql/validation/rules/UniqueTypeNames.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * @deprecated and will be removed in v16
- * Please use either:
- *   import { UniqueTypeNamesRule } from 'graphql'
- * or
- *   import { UniqueTypeNamesRule } from 'graphql/validation'
- */
-export { UniqueTypeNamesRule as UniqueTypeNames } from "./UniqueTypeNamesRule.mjs";
diff --git a/node_modules/graphql/validation/rules/UniqueTypeNamesRule.d.ts b/node_modules/graphql/validation/rules/UniqueTypeNamesRule.d.ts
deleted file mode 100644
index e2b3759..0000000
--- a/node_modules/graphql/validation/rules/UniqueTypeNamesRule.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { SDLValidationContext } from '../ValidationContext';
-
-/**
- * Unique type names
- *
- * A GraphQL document is only valid if all defined types have unique names.
- */
-export function UniqueTypeNamesRule(context: SDLValidationContext): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/UniqueTypeNamesRule.js b/node_modules/graphql/validation/rules/UniqueTypeNamesRule.js
deleted file mode 100644
index 9474f9d..0000000
--- a/node_modules/graphql/validation/rules/UniqueTypeNamesRule.js
+++ /dev/null
@@ -1,43 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.UniqueTypeNamesRule = UniqueTypeNamesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * Unique type names
- *
- * A GraphQL document is only valid if all defined types have unique names.
- */
-function UniqueTypeNamesRule(context) {
-  var knownTypeNames = Object.create(null);
-  var schema = context.getSchema();
-  return {
-    ScalarTypeDefinition: checkTypeName,
-    ObjectTypeDefinition: checkTypeName,
-    InterfaceTypeDefinition: checkTypeName,
-    UnionTypeDefinition: checkTypeName,
-    EnumTypeDefinition: checkTypeName,
-    InputObjectTypeDefinition: checkTypeName
-  };
-
-  function checkTypeName(node) {
-    var typeName = node.name.value;
-
-    if (schema === null || schema === void 0 ? void 0 : schema.getType(typeName)) {
-      context.reportError(new _GraphQLError.GraphQLError("Type \"".concat(typeName, "\" already exists in the schema. It cannot also be defined in this type definition."), node.name));
-      return;
-    }
-
-    if (knownTypeNames[typeName]) {
-      context.reportError(new _GraphQLError.GraphQLError("There can be only one type named \"".concat(typeName, "\"."), [knownTypeNames[typeName], node.name]));
-    } else {
-      knownTypeNames[typeName] = node.name;
-    }
-
-    return false;
-  }
-}
diff --git a/node_modules/graphql/validation/rules/UniqueTypeNamesRule.js.flow b/node_modules/graphql/validation/rules/UniqueTypeNamesRule.js.flow
deleted file mode 100644
index a20cde0..0000000
--- a/node_modules/graphql/validation/rules/UniqueTypeNamesRule.js.flow
+++ /dev/null
@@ -1,54 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { type ASTVisitor } from '../../language/visitor';
-import { type TypeDefinitionNode } from '../../language/ast';
-
-import { type SDLValidationContext } from '../ValidationContext';
-
-/**
- * Unique type names
- *
- * A GraphQL document is only valid if all defined types have unique names.
- */
-export function UniqueTypeNamesRule(context: SDLValidationContext): ASTVisitor {
-  const knownTypeNames = Object.create(null);
-  const schema = context.getSchema();
-
-  return {
-    ScalarTypeDefinition: checkTypeName,
-    ObjectTypeDefinition: checkTypeName,
-    InterfaceTypeDefinition: checkTypeName,
-    UnionTypeDefinition: checkTypeName,
-    EnumTypeDefinition: checkTypeName,
-    InputObjectTypeDefinition: checkTypeName,
-  };
-
-  function checkTypeName(node: TypeDefinitionNode) {
-    const typeName = node.name.value;
-
-    if (schema?.getType(typeName)) {
-      context.reportError(
-        new GraphQLError(
-          `Type "${typeName}" already exists in the schema. It cannot also be defined in this type definition.`,
-          node.name,
-        ),
-      );
-      return;
-    }
-
-    if (knownTypeNames[typeName]) {
-      context.reportError(
-        new GraphQLError(`There can be only one type named "${typeName}".`, [
-          knownTypeNames[typeName],
-          node.name,
-        ]),
-      );
-    } else {
-      knownTypeNames[typeName] = node.name;
-    }
-
-    return false;
-  }
-}
diff --git a/node_modules/graphql/validation/rules/UniqueTypeNamesRule.mjs b/node_modules/graphql/validation/rules/UniqueTypeNamesRule.mjs
deleted file mode 100644
index 8e854ce..0000000
--- a/node_modules/graphql/validation/rules/UniqueTypeNamesRule.mjs
+++ /dev/null
@@ -1,36 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * Unique type names
- *
- * A GraphQL document is only valid if all defined types have unique names.
- */
-export function UniqueTypeNamesRule(context) {
-  var knownTypeNames = Object.create(null);
-  var schema = context.getSchema();
-  return {
-    ScalarTypeDefinition: checkTypeName,
-    ObjectTypeDefinition: checkTypeName,
-    InterfaceTypeDefinition: checkTypeName,
-    UnionTypeDefinition: checkTypeName,
-    EnumTypeDefinition: checkTypeName,
-    InputObjectTypeDefinition: checkTypeName
-  };
-
-  function checkTypeName(node) {
-    var typeName = node.name.value;
-
-    if (schema === null || schema === void 0 ? void 0 : schema.getType(typeName)) {
-      context.reportError(new GraphQLError("Type \"".concat(typeName, "\" already exists in the schema. It cannot also be defined in this type definition."), node.name));
-      return;
-    }
-
-    if (knownTypeNames[typeName]) {
-      context.reportError(new GraphQLError("There can be only one type named \"".concat(typeName, "\"."), [knownTypeNames[typeName], node.name]));
-    } else {
-      knownTypeNames[typeName] = node.name;
-    }
-
-    return false;
-  }
-}
diff --git a/node_modules/graphql/validation/rules/UniqueVariableNamesRule.d.ts b/node_modules/graphql/validation/rules/UniqueVariableNamesRule.d.ts
deleted file mode 100644
index 6f15764..0000000
--- a/node_modules/graphql/validation/rules/UniqueVariableNamesRule.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ASTValidationContext } from '../ValidationContext';
-
-/**
- * Unique variable names
- *
- * A GraphQL operation is only valid if all its variables are uniquely named.
- */
-export function UniqueVariableNamesRule(
-  context: ASTValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/UniqueVariableNamesRule.js b/node_modules/graphql/validation/rules/UniqueVariableNamesRule.js
deleted file mode 100644
index 89917ec..0000000
--- a/node_modules/graphql/validation/rules/UniqueVariableNamesRule.js
+++ /dev/null
@@ -1,31 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.UniqueVariableNamesRule = UniqueVariableNamesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-/**
- * Unique variable names
- *
- * A GraphQL operation is only valid if all its variables are uniquely named.
- */
-function UniqueVariableNamesRule(context) {
-  var knownVariableNames = Object.create(null);
-  return {
-    OperationDefinition: function OperationDefinition() {
-      knownVariableNames = Object.create(null);
-    },
-    VariableDefinition: function VariableDefinition(node) {
-      var variableName = node.variable.name.value;
-
-      if (knownVariableNames[variableName]) {
-        context.reportError(new _GraphQLError.GraphQLError("There can be only one variable named \"$".concat(variableName, "\"."), [knownVariableNames[variableName], node.variable.name]));
-      } else {
-        knownVariableNames[variableName] = node.variable.name;
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueVariableNamesRule.js.flow b/node_modules/graphql/validation/rules/UniqueVariableNamesRule.js.flow
deleted file mode 100644
index 26a4dad..0000000
--- a/node_modules/graphql/validation/rules/UniqueVariableNamesRule.js.flow
+++ /dev/null
@@ -1,37 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { type ASTVisitor } from '../../language/visitor';
-import { type VariableDefinitionNode } from '../../language/ast';
-
-import { type ASTValidationContext } from '../ValidationContext';
-
-/**
- * Unique variable names
- *
- * A GraphQL operation is only valid if all its variables are uniquely named.
- */
-export function UniqueVariableNamesRule(
-  context: ASTValidationContext,
-): ASTVisitor {
-  let knownVariableNames = Object.create(null);
-  return {
-    OperationDefinition() {
-      knownVariableNames = Object.create(null);
-    },
-    VariableDefinition(node: VariableDefinitionNode) {
-      const variableName = node.variable.name.value;
-      if (knownVariableNames[variableName]) {
-        context.reportError(
-          new GraphQLError(
-            `There can be only one variable named "$${variableName}".`,
-            [knownVariableNames[variableName], node.variable.name],
-          ),
-        );
-      } else {
-        knownVariableNames[variableName] = node.variable.name;
-      }
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/UniqueVariableNamesRule.mjs b/node_modules/graphql/validation/rules/UniqueVariableNamesRule.mjs
deleted file mode 100644
index 3b650a4..0000000
--- a/node_modules/graphql/validation/rules/UniqueVariableNamesRule.mjs
+++ /dev/null
@@ -1,24 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-
-/**
- * Unique variable names
- *
- * A GraphQL operation is only valid if all its variables are uniquely named.
- */
-export function UniqueVariableNamesRule(context) {
-  var knownVariableNames = Object.create(null);
-  return {
-    OperationDefinition: function OperationDefinition() {
-      knownVariableNames = Object.create(null);
-    },
-    VariableDefinition: function VariableDefinition(node) {
-      var variableName = node.variable.name.value;
-
-      if (knownVariableNames[variableName]) {
-        context.reportError(new GraphQLError("There can be only one variable named \"$".concat(variableName, "\"."), [knownVariableNames[variableName], node.variable.name]));
-      } else {
-        knownVariableNames[variableName] = node.variable.name;
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.d.ts b/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.d.ts
deleted file mode 100644
index 98ff7a7..0000000
--- a/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * Value literals of correct type
- *
- * A GraphQL document is only valid if all value literals are of the type
- * expected at their position.
- */
-export function ValuesOfCorrectTypeRule(context: ValidationContext): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.js b/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.js
deleted file mode 100644
index 5db1e11..0000000
--- a/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.js
+++ /dev/null
@@ -1,143 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.ValuesOfCorrectTypeRule = ValuesOfCorrectTypeRule;
-
-var _objectValues3 = _interopRequireDefault(require("../../polyfills/objectValues"));
-
-var _keyMap = _interopRequireDefault(require("../../jsutils/keyMap"));
-
-var _inspect = _interopRequireDefault(require("../../jsutils/inspect"));
-
-var _didYouMean = _interopRequireDefault(require("../../jsutils/didYouMean"));
-
-var _suggestionList = _interopRequireDefault(require("../../jsutils/suggestionList"));
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _printer = require("../../language/printer");
-
-var _definition = require("../../type/definition");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Value literals of correct type
- *
- * A GraphQL document is only valid if all value literals are of the type
- * expected at their position.
- */
-function ValuesOfCorrectTypeRule(context) {
-  return {
-    ListValue: function ListValue(node) {
-      // Note: TypeInfo will traverse into a list's item type, so look to the
-      // parent input type to check if it is a list.
-      var type = (0, _definition.getNullableType)(context.getParentInputType());
-
-      if (!(0, _definition.isListType)(type)) {
-        isValidValueNode(context, node);
-        return false; // Don't traverse further.
-      }
-    },
-    ObjectValue: function ObjectValue(node) {
-      var type = (0, _definition.getNamedType)(context.getInputType());
-
-      if (!(0, _definition.isInputObjectType)(type)) {
-        isValidValueNode(context, node);
-        return false; // Don't traverse further.
-      } // Ensure every required field exists.
-
-
-      var fieldNodeMap = (0, _keyMap.default)(node.fields, function (field) {
-        return field.name.value;
-      });
-
-      for (var _i2 = 0, _objectValues2 = (0, _objectValues3.default)(type.getFields()); _i2 < _objectValues2.length; _i2++) {
-        var fieldDef = _objectValues2[_i2];
-        var fieldNode = fieldNodeMap[fieldDef.name];
-
-        if (!fieldNode && (0, _definition.isRequiredInputField)(fieldDef)) {
-          var typeStr = (0, _inspect.default)(fieldDef.type);
-          context.reportError(new _GraphQLError.GraphQLError("Field \"".concat(type.name, ".").concat(fieldDef.name, "\" of required type \"").concat(typeStr, "\" was not provided."), node));
-        }
-      }
-    },
-    ObjectField: function ObjectField(node) {
-      var parentType = (0, _definition.getNamedType)(context.getParentInputType());
-      var fieldType = context.getInputType();
-
-      if (!fieldType && (0, _definition.isInputObjectType)(parentType)) {
-        var suggestions = (0, _suggestionList.default)(node.name.value, Object.keys(parentType.getFields()));
-        context.reportError(new _GraphQLError.GraphQLError("Field \"".concat(node.name.value, "\" is not defined by type \"").concat(parentType.name, "\".") + (0, _didYouMean.default)(suggestions), node));
-      }
-    },
-    NullValue: function NullValue(node) {
-      var type = context.getInputType();
-
-      if ((0, _definition.isNonNullType)(type)) {
-        context.reportError(new _GraphQLError.GraphQLError("Expected value of type \"".concat((0, _inspect.default)(type), "\", found ").concat((0, _printer.print)(node), "."), node));
-      }
-    },
-    EnumValue: function EnumValue(node) {
-      return isValidValueNode(context, node);
-    },
-    IntValue: function IntValue(node) {
-      return isValidValueNode(context, node);
-    },
-    FloatValue: function FloatValue(node) {
-      return isValidValueNode(context, node);
-    },
-    StringValue: function StringValue(node) {
-      return isValidValueNode(context, node);
-    },
-    BooleanValue: function BooleanValue(node) {
-      return isValidValueNode(context, node);
-    }
-  };
-}
-/**
- * Any value literal may be a valid representation of a Scalar, depending on
- * that scalar type.
- */
-
-
-function isValidValueNode(context, node) {
-  // Report any error at the full type expected by the location.
-  var locationType = context.getInputType();
-
-  if (!locationType) {
-    return;
-  }
-
-  var type = (0, _definition.getNamedType)(locationType);
-
-  if (!(0, _definition.isLeafType)(type)) {
-    var typeStr = (0, _inspect.default)(locationType);
-    context.reportError(new _GraphQLError.GraphQLError("Expected value of type \"".concat(typeStr, "\", found ").concat((0, _printer.print)(node), "."), node));
-    return;
-  } // Scalars and Enums determine if a literal value is valid via parseLiteral(),
-  // which may throw or return an invalid value to indicate failure.
-
-
-  try {
-    var parseResult = type.parseLiteral(node, undefined
-    /* variables */
-    );
-
-    if (parseResult === undefined) {
-      var _typeStr = (0, _inspect.default)(locationType);
-
-      context.reportError(new _GraphQLError.GraphQLError("Expected value of type \"".concat(_typeStr, "\", found ").concat((0, _printer.print)(node), "."), node));
-    }
-  } catch (error) {
-    var _typeStr2 = (0, _inspect.default)(locationType);
-
-    if (error instanceof _GraphQLError.GraphQLError) {
-      context.reportError(error);
-    } else {
-      context.reportError(new _GraphQLError.GraphQLError("Expected value of type \"".concat(_typeStr2, "\", found ").concat((0, _printer.print)(node), "; ") + error.message, node, undefined, undefined, undefined, error));
-    }
-  }
-}
diff --git a/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.js.flow b/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.js.flow
deleted file mode 100644
index 8681e46..0000000
--- a/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.js.flow
+++ /dev/null
@@ -1,159 +0,0 @@
-// @flow strict
-
-import objectValues from '../../polyfills/objectValues';
-
-import keyMap from '../../jsutils/keyMap';
-import inspect from '../../jsutils/inspect';
-import didYouMean from '../../jsutils/didYouMean';
-import suggestionList from '../../jsutils/suggestionList';
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { print } from '../../language/printer';
-import { type ValueNode } from '../../language/ast';
-import { type ASTVisitor } from '../../language/visitor';
-
-import {
-  isLeafType,
-  isInputObjectType,
-  isListType,
-  isNonNullType,
-  isRequiredInputField,
-  getNullableType,
-  getNamedType,
-} from '../../type/definition';
-
-import { type ValidationContext } from '../ValidationContext';
-
-/**
- * Value literals of correct type
- *
- * A GraphQL document is only valid if all value literals are of the type
- * expected at their position.
- */
-export function ValuesOfCorrectTypeRule(
-  context: ValidationContext,
-): ASTVisitor {
-  return {
-    ListValue(node) {
-      // Note: TypeInfo will traverse into a list's item type, so look to the
-      // parent input type to check if it is a list.
-      const type = getNullableType(context.getParentInputType());
-      if (!isListType(type)) {
-        isValidValueNode(context, node);
-        return false; // Don't traverse further.
-      }
-    },
-    ObjectValue(node) {
-      const type = getNamedType(context.getInputType());
-      if (!isInputObjectType(type)) {
-        isValidValueNode(context, node);
-        return false; // Don't traverse further.
-      }
-      // Ensure every required field exists.
-      const fieldNodeMap = keyMap(node.fields, field => field.name.value);
-      for (const fieldDef of objectValues(type.getFields())) {
-        const fieldNode = fieldNodeMap[fieldDef.name];
-        if (!fieldNode && isRequiredInputField(fieldDef)) {
-          const typeStr = inspect(fieldDef.type);
-          context.reportError(
-            new GraphQLError(
-              `Field "${type.name}.${fieldDef.name}" of required type "${typeStr}" was not provided.`,
-              node,
-            ),
-          );
-        }
-      }
-    },
-    ObjectField(node) {
-      const parentType = getNamedType(context.getParentInputType());
-      const fieldType = context.getInputType();
-      if (!fieldType && isInputObjectType(parentType)) {
-        const suggestions = suggestionList(
-          node.name.value,
-          Object.keys(parentType.getFields()),
-        );
-        context.reportError(
-          new GraphQLError(
-            `Field "${node.name.value}" is not defined by type "${parentType.name}".` +
-              didYouMean(suggestions),
-            node,
-          ),
-        );
-      }
-    },
-    NullValue(node) {
-      const type = context.getInputType();
-      if (isNonNullType(type)) {
-        context.reportError(
-          new GraphQLError(
-            `Expected value of type "${inspect(type)}", found ${print(node)}.`,
-            node,
-          ),
-        );
-      }
-    },
-    EnumValue: node => isValidValueNode(context, node),
-    IntValue: node => isValidValueNode(context, node),
-    FloatValue: node => isValidValueNode(context, node),
-    StringValue: node => isValidValueNode(context, node),
-    BooleanValue: node => isValidValueNode(context, node),
-  };
-}
-
-/**
- * Any value literal may be a valid representation of a Scalar, depending on
- * that scalar type.
- */
-function isValidValueNode(context: ValidationContext, node: ValueNode): void {
-  // Report any error at the full type expected by the location.
-  const locationType = context.getInputType();
-  if (!locationType) {
-    return;
-  }
-
-  const type = getNamedType(locationType);
-
-  if (!isLeafType(type)) {
-    const typeStr = inspect(locationType);
-    context.reportError(
-      new GraphQLError(
-        `Expected value of type "${typeStr}", found ${print(node)}.`,
-        node,
-      ),
-    );
-    return;
-  }
-
-  // Scalars and Enums determine if a literal value is valid via parseLiteral(),
-  // which may throw or return an invalid value to indicate failure.
-  try {
-    const parseResult = type.parseLiteral(node, undefined /* variables */);
-    if (parseResult === undefined) {
-      const typeStr = inspect(locationType);
-      context.reportError(
-        new GraphQLError(
-          `Expected value of type "${typeStr}", found ${print(node)}.`,
-          node,
-        ),
-      );
-    }
-  } catch (error) {
-    const typeStr = inspect(locationType);
-    if (error instanceof GraphQLError) {
-      context.reportError(error);
-    } else {
-      context.reportError(
-        new GraphQLError(
-          `Expected value of type "${typeStr}", found ${print(node)}; ` +
-            error.message,
-          node,
-          undefined,
-          undefined,
-          undefined,
-          error, // Ensure a reference to the original error is maintained.
-        ),
-      );
-    }
-  }
-}
diff --git a/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.mjs b/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.mjs
deleted file mode 100644
index 01c8967..0000000
--- a/node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.mjs
+++ /dev/null
@@ -1,126 +0,0 @@
-import objectValues from "../../polyfills/objectValues.mjs";
-import keyMap from "../../jsutils/keyMap.mjs";
-import inspect from "../../jsutils/inspect.mjs";
-import didYouMean from "../../jsutils/didYouMean.mjs";
-import suggestionList from "../../jsutils/suggestionList.mjs";
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { print } from "../../language/printer.mjs";
-import { isLeafType, isInputObjectType, isListType, isNonNullType, isRequiredInputField, getNullableType, getNamedType } from "../../type/definition.mjs";
-
-/**
- * Value literals of correct type
- *
- * A GraphQL document is only valid if all value literals are of the type
- * expected at their position.
- */
-export function ValuesOfCorrectTypeRule(context) {
-  return {
-    ListValue: function ListValue(node) {
-      // Note: TypeInfo will traverse into a list's item type, so look to the
-      // parent input type to check if it is a list.
-      var type = getNullableType(context.getParentInputType());
-
-      if (!isListType(type)) {
-        isValidValueNode(context, node);
-        return false; // Don't traverse further.
-      }
-    },
-    ObjectValue: function ObjectValue(node) {
-      var type = getNamedType(context.getInputType());
-
-      if (!isInputObjectType(type)) {
-        isValidValueNode(context, node);
-        return false; // Don't traverse further.
-      } // Ensure every required field exists.
-
-
-      var fieldNodeMap = keyMap(node.fields, function (field) {
-        return field.name.value;
-      });
-
-      for (var _i2 = 0, _objectValues2 = objectValues(type.getFields()); _i2 < _objectValues2.length; _i2++) {
-        var fieldDef = _objectValues2[_i2];
-        var fieldNode = fieldNodeMap[fieldDef.name];
-
-        if (!fieldNode && isRequiredInputField(fieldDef)) {
-          var typeStr = inspect(fieldDef.type);
-          context.reportError(new GraphQLError("Field \"".concat(type.name, ".").concat(fieldDef.name, "\" of required type \"").concat(typeStr, "\" was not provided."), node));
-        }
-      }
-    },
-    ObjectField: function ObjectField(node) {
-      var parentType = getNamedType(context.getParentInputType());
-      var fieldType = context.getInputType();
-
-      if (!fieldType && isInputObjectType(parentType)) {
-        var suggestions = suggestionList(node.name.value, Object.keys(parentType.getFields()));
-        context.reportError(new GraphQLError("Field \"".concat(node.name.value, "\" is not defined by type \"").concat(parentType.name, "\".") + didYouMean(suggestions), node));
-      }
-    },
-    NullValue: function NullValue(node) {
-      var type = context.getInputType();
-
-      if (isNonNullType(type)) {
-        context.reportError(new GraphQLError("Expected value of type \"".concat(inspect(type), "\", found ").concat(print(node), "."), node));
-      }
-    },
-    EnumValue: function EnumValue(node) {
-      return isValidValueNode(context, node);
-    },
-    IntValue: function IntValue(node) {
-      return isValidValueNode(context, node);
-    },
-    FloatValue: function FloatValue(node) {
-      return isValidValueNode(context, node);
-    },
-    StringValue: function StringValue(node) {
-      return isValidValueNode(context, node);
-    },
-    BooleanValue: function BooleanValue(node) {
-      return isValidValueNode(context, node);
-    }
-  };
-}
-/**
- * Any value literal may be a valid representation of a Scalar, depending on
- * that scalar type.
- */
-
-function isValidValueNode(context, node) {
-  // Report any error at the full type expected by the location.
-  var locationType = context.getInputType();
-
-  if (!locationType) {
-    return;
-  }
-
-  var type = getNamedType(locationType);
-
-  if (!isLeafType(type)) {
-    var typeStr = inspect(locationType);
-    context.reportError(new GraphQLError("Expected value of type \"".concat(typeStr, "\", found ").concat(print(node), "."), node));
-    return;
-  } // Scalars and Enums determine if a literal value is valid via parseLiteral(),
-  // which may throw or return an invalid value to indicate failure.
-
-
-  try {
-    var parseResult = type.parseLiteral(node, undefined
-    /* variables */
-    );
-
-    if (parseResult === undefined) {
-      var _typeStr = inspect(locationType);
-
-      context.reportError(new GraphQLError("Expected value of type \"".concat(_typeStr, "\", found ").concat(print(node), "."), node));
-    }
-  } catch (error) {
-    var _typeStr2 = inspect(locationType);
-
-    if (error instanceof GraphQLError) {
-      context.reportError(error);
-    } else {
-      context.reportError(new GraphQLError("Expected value of type \"".concat(_typeStr2, "\", found ").concat(print(node), "; ") + error.message, node, undefined, undefined, undefined, error));
-    }
-  }
-}
diff --git a/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.d.ts b/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.d.ts
deleted file mode 100644
index c82229c..0000000
--- a/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * Variables are input types
- *
- * A GraphQL operation is only valid if all the variables it defines are of
- * input types (scalar, enum, or input object).
- */
-export function VariablesAreInputTypesRule(
-  context: ValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.js b/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.js
deleted file mode 100644
index c7aaf29..0000000
--- a/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.js
+++ /dev/null
@@ -1,34 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.VariablesAreInputTypesRule = VariablesAreInputTypesRule;
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _printer = require("../../language/printer");
-
-var _definition = require("../../type/definition");
-
-var _typeFromAST = require("../../utilities/typeFromAST");
-
-/**
- * Variables are input types
- *
- * A GraphQL operation is only valid if all the variables it defines are of
- * input types (scalar, enum, or input object).
- */
-function VariablesAreInputTypesRule(context) {
-  return {
-    VariableDefinition: function VariableDefinition(node) {
-      var type = (0, _typeFromAST.typeFromAST)(context.getSchema(), node.type);
-
-      if (type && !(0, _definition.isInputType)(type)) {
-        var variableName = node.variable.name.value;
-        var typeName = (0, _printer.print)(node.type);
-        context.reportError(new _GraphQLError.GraphQLError("Variable \"$".concat(variableName, "\" cannot be non-input type \"").concat(typeName, "\"."), node.type));
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.js.flow b/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.js.flow
deleted file mode 100644
index 05d7d20..0000000
--- a/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.js.flow
+++ /dev/null
@@ -1,41 +0,0 @@
-// @flow strict
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { print } from '../../language/printer';
-import { type ASTVisitor } from '../../language/visitor';
-import { type VariableDefinitionNode } from '../../language/ast';
-
-import { isInputType } from '../../type/definition';
-
-import { typeFromAST } from '../../utilities/typeFromAST';
-
-import { type ValidationContext } from '../ValidationContext';
-
-/**
- * Variables are input types
- *
- * A GraphQL operation is only valid if all the variables it defines are of
- * input types (scalar, enum, or input object).
- */
-export function VariablesAreInputTypesRule(
-  context: ValidationContext,
-): ASTVisitor {
-  return {
-    VariableDefinition(node: VariableDefinitionNode): ?GraphQLError {
-      const type = typeFromAST(context.getSchema(), node.type);
-
-      if (type && !isInputType(type)) {
-        const variableName = node.variable.name.value;
-        const typeName = print(node.type);
-
-        context.reportError(
-          new GraphQLError(
-            `Variable "$${variableName}" cannot be non-input type "${typeName}".`,
-            node.type,
-          ),
-        );
-      }
-    },
-  };
-}
diff --git a/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.mjs b/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.mjs
deleted file mode 100644
index f6e5d11..0000000
--- a/node_modules/graphql/validation/rules/VariablesAreInputTypesRule.mjs
+++ /dev/null
@@ -1,24 +0,0 @@
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { print } from "../../language/printer.mjs";
-import { isInputType } from "../../type/definition.mjs";
-import { typeFromAST } from "../../utilities/typeFromAST.mjs";
-
-/**
- * Variables are input types
- *
- * A GraphQL operation is only valid if all the variables it defines are of
- * input types (scalar, enum, or input object).
- */
-export function VariablesAreInputTypesRule(context) {
-  return {
-    VariableDefinition: function VariableDefinition(node) {
-      var type = typeFromAST(context.getSchema(), node.type);
-
-      if (type && !isInputType(type)) {
-        var variableName = node.variable.name.value;
-        var typeName = print(node.type);
-        context.reportError(new GraphQLError("Variable \"$".concat(variableName, "\" cannot be non-input type \"").concat(typeName, "\"."), node.type));
-      }
-    }
-  };
-}
diff --git a/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.d.ts b/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.d.ts
deleted file mode 100644
index 6ee5737..0000000
--- a/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { ASTVisitor } from '../../language/visitor';
-import { ValidationContext } from '../ValidationContext';
-
-/**
- * Variables passed to field arguments conform to type
- */
-export function VariablesInAllowedPositionRule(
-  context: ValidationContext,
-): ASTVisitor;
diff --git a/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.js b/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.js
deleted file mode 100644
index c2e8c18..0000000
--- a/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.js
+++ /dev/null
@@ -1,87 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.VariablesInAllowedPositionRule = VariablesInAllowedPositionRule;
-
-var _inspect = _interopRequireDefault(require("../../jsutils/inspect"));
-
-var _GraphQLError = require("../../error/GraphQLError");
-
-var _kinds = require("../../language/kinds");
-
-var _definition = require("../../type/definition");
-
-var _typeFromAST = require("../../utilities/typeFromAST");
-
-var _typeComparators = require("../../utilities/typeComparators");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Variables passed to field arguments conform to type
- */
-function VariablesInAllowedPositionRule(context) {
-  var varDefMap = Object.create(null);
-  return {
-    OperationDefinition: {
-      enter: function enter() {
-        varDefMap = Object.create(null);
-      },
-      leave: function leave(operation) {
-        var usages = context.getRecursiveVariableUsages(operation);
-
-        for (var _i2 = 0; _i2 < usages.length; _i2++) {
-          var _ref2 = usages[_i2];
-          var node = _ref2.node;
-          var type = _ref2.type;
-          var defaultValue = _ref2.defaultValue;
-          var varName = node.name.value;
-          var varDef = varDefMap[varName];
-
-          if (varDef && type) {
-            // A var type is allowed if it is the same or more strict (e.g. is
-            // a subtype of) than the expected type. It can be more strict if
-            // the variable type is non-null when the expected type is nullable.
-            // If both are list types, the variable item type can be more strict
-            // than the expected item type (contravariant).
-            var schema = context.getSchema();
-            var varType = (0, _typeFromAST.typeFromAST)(schema, varDef.type);
-
-            if (varType && !allowedVariableUsage(schema, varType, varDef.defaultValue, type, defaultValue)) {
-              var varTypeStr = (0, _inspect.default)(varType);
-              var typeStr = (0, _inspect.default)(type);
-              context.reportError(new _GraphQLError.GraphQLError("Variable \"$".concat(varName, "\" of type \"").concat(varTypeStr, "\" used in position expecting type \"").concat(typeStr, "\"."), [varDef, node]));
-            }
-          }
-        }
-      }
-    },
-    VariableDefinition: function VariableDefinition(node) {
-      varDefMap[node.variable.name.value] = node;
-    }
-  };
-}
-/**
- * Returns true if the variable is allowed in the location it was found,
- * which includes considering if default values exist for either the variable
- * or the location at which it is located.
- */
-
-
-function allowedVariableUsage(schema, varType, varDefaultValue, locationType, locationDefaultValue) {
-  if ((0, _definition.isNonNullType)(locationType) && !(0, _definition.isNonNullType)(varType)) {
-    var hasNonNullVariableDefaultValue = varDefaultValue != null && varDefaultValue.kind !== _kinds.Kind.NULL;
-    var hasLocationDefaultValue = locationDefaultValue !== undefined;
-
-    if (!hasNonNullVariableDefaultValue && !hasLocationDefaultValue) {
-      return false;
-    }
-
-    var nullableLocationType = locationType.ofType;
-    return (0, _typeComparators.isTypeSubTypeOf)(schema, varType, nullableLocationType);
-  }
-
-  return (0, _typeComparators.isTypeSubTypeOf)(schema, varType, locationType);
-}
diff --git a/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.js.flow b/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.js.flow
deleted file mode 100644
index bba589a..0000000
--- a/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.js.flow
+++ /dev/null
@@ -1,98 +0,0 @@
-// @flow strict
-
-import inspect from '../../jsutils/inspect';
-
-import { GraphQLError } from '../../error/GraphQLError';
-
-import { Kind } from '../../language/kinds';
-import { type ValueNode } from '../../language/ast';
-import { type ASTVisitor } from '../../language/visitor';
-
-import { type GraphQLSchema } from '../../type/schema';
-import { type GraphQLType, isNonNullType } from '../../type/definition';
-
-import { typeFromAST } from '../../utilities/typeFromAST';
-import { isTypeSubTypeOf } from '../../utilities/typeComparators';
-
-import { type ValidationContext } from '../ValidationContext';
-
-/**
- * Variables passed to field arguments conform to type
- */
-export function VariablesInAllowedPositionRule(
-  context: ValidationContext,
-): ASTVisitor {
-  let varDefMap = Object.create(null);
-
-  return {
-    OperationDefinition: {
-      enter() {
-        varDefMap = Object.create(null);
-      },
-      leave(operation) {
-        const usages = context.getRecursiveVariableUsages(operation);
-
-        for (const { node, type, defaultValue } of usages) {
-          const varName = node.name.value;
-          const varDef = varDefMap[varName];
-          if (varDef && type) {
-            // A var type is allowed if it is the same or more strict (e.g. is
-            // a subtype of) than the expected type. It can be more strict if
-            // the variable type is non-null when the expected type is nullable.
-            // If both are list types, the variable item type can be more strict
-            // than the expected item type (contravariant).
-            const schema = context.getSchema();
-            const varType = typeFromAST(schema, varDef.type);
-            if (
-              varType &&
-              !allowedVariableUsage(
-                schema,
-                varType,
-                varDef.defaultValue,
-                type,
-                defaultValue,
-              )
-            ) {
-              const varTypeStr = inspect(varType);
-              const typeStr = inspect(type);
-              context.reportError(
-                new GraphQLError(
-                  `Variable "$${varName}" of type "${varTypeStr}" used in position expecting type "${typeStr}".`,
-                  [varDef, node],
-                ),
-              );
-            }
-          }
-        }
-      },
-    },
-    VariableDefinition(node) {
-      varDefMap[node.variable.name.value] = node;
-    },
-  };
-}
-
-/**
- * Returns true if the variable is allowed in the location it was found,
- * which includes considering if default values exist for either the variable
- * or the location at which it is located.
- */
-function allowedVariableUsage(
-  schema: GraphQLSchema,
-  varType: GraphQLType,
-  varDefaultValue: ?ValueNode,
-  locationType: GraphQLType,
-  locationDefaultValue: ?mixed,
-): boolean {
-  if (isNonNullType(locationType) && !isNonNullType(varType)) {
-    const hasNonNullVariableDefaultValue =
-      varDefaultValue != null && varDefaultValue.kind !== Kind.NULL;
-    const hasLocationDefaultValue = locationDefaultValue !== undefined;
-    if (!hasNonNullVariableDefaultValue && !hasLocationDefaultValue) {
-      return false;
-    }
-    const nullableLocationType = locationType.ofType;
-    return isTypeSubTypeOf(schema, varType, nullableLocationType);
-  }
-  return isTypeSubTypeOf(schema, varType, locationType);
-}
diff --git a/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.mjs b/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.mjs
deleted file mode 100644
index bdddb2f..0000000
--- a/node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.mjs
+++ /dev/null
@@ -1,72 +0,0 @@
-import inspect from "../../jsutils/inspect.mjs";
-import { GraphQLError } from "../../error/GraphQLError.mjs";
-import { Kind } from "../../language/kinds.mjs";
-import { isNonNullType } from "../../type/definition.mjs";
-import { typeFromAST } from "../../utilities/typeFromAST.mjs";
-import { isTypeSubTypeOf } from "../../utilities/typeComparators.mjs";
-
-/**
- * Variables passed to field arguments conform to type
- */
-export function VariablesInAllowedPositionRule(context) {
-  var varDefMap = Object.create(null);
-  return {
-    OperationDefinition: {
-      enter: function enter() {
-        varDefMap = Object.create(null);
-      },
-      leave: function leave(operation) {
-        var usages = context.getRecursiveVariableUsages(operation);
-
-        for (var _i2 = 0; _i2 < usages.length; _i2++) {
-          var _ref2 = usages[_i2];
-          var node = _ref2.node;
-          var type = _ref2.type;
-          var defaultValue = _ref2.defaultValue;
-          var varName = node.name.value;
-          var varDef = varDefMap[varName];
-
-          if (varDef && type) {
-            // A var type is allowed if it is the same or more strict (e.g. is
-            // a subtype of) than the expected type. It can be more strict if
-            // the variable type is non-null when the expected type is nullable.
-            // If both are list types, the variable item type can be more strict
-            // than the expected item type (contravariant).
-            var schema = context.getSchema();
-            var varType = typeFromAST(schema, varDef.type);
-
-            if (varType && !allowedVariableUsage(schema, varType, varDef.defaultValue, type, defaultValue)) {
-              var varTypeStr = inspect(varType);
-              var typeStr = inspect(type);
-              context.reportError(new GraphQLError("Variable \"$".concat(varName, "\" of type \"").concat(varTypeStr, "\" used in position expecting type \"").concat(typeStr, "\"."), [varDef, node]));
-            }
-          }
-        }
-      }
-    },
-    VariableDefinition: function VariableDefinition(node) {
-      varDefMap[node.variable.name.value] = node;
-    }
-  };
-}
-/**
- * Returns true if the variable is allowed in the location it was found,
- * which includes considering if default values exist for either the variable
- * or the location at which it is located.
- */
-
-function allowedVariableUsage(schema, varType, varDefaultValue, locationType, locationDefaultValue) {
-  if (isNonNullType(locationType) && !isNonNullType(varType)) {
-    var hasNonNullVariableDefaultValue = varDefaultValue != null && varDefaultValue.kind !== Kind.NULL;
-    var hasLocationDefaultValue = locationDefaultValue !== undefined;
-
-    if (!hasNonNullVariableDefaultValue && !hasLocationDefaultValue) {
-      return false;
-    }
-
-    var nullableLocationType = locationType.ofType;
-    return isTypeSubTypeOf(schema, varType, nullableLocationType);
-  }
-
-  return isTypeSubTypeOf(schema, varType, locationType);
-}
diff --git a/node_modules/graphql/validation/specifiedRules.d.ts b/node_modules/graphql/validation/specifiedRules.d.ts
deleted file mode 100644
index ffb5570..0000000
--- a/node_modules/graphql/validation/specifiedRules.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { ValidationRule, SDLValidationRule } from './ValidationContext';
-
-/**
- * This set includes all validation rules defined by the GraphQL spec.
- *
- * The order of the rules in this list has been adjusted to lead to the
- * most clear output when encountering multiple validation errors.
- */
-export const specifiedRules: ReadonlyArray<ValidationRule>;
-
-/**
- * @internal
- */
-export const specifiedSDLRules: ReadonlyArray<SDLValidationRule>;
diff --git a/node_modules/graphql/validation/specifiedRules.js b/node_modules/graphql/validation/specifiedRules.js
deleted file mode 100644
index 0f93fb3..0000000
--- a/node_modules/graphql/validation/specifiedRules.js
+++ /dev/null
@@ -1,115 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.specifiedSDLRules = exports.specifiedRules = void 0;
-
-var _ExecutableDefinitionsRule = require("./rules/ExecutableDefinitionsRule");
-
-var _UniqueOperationNamesRule = require("./rules/UniqueOperationNamesRule");
-
-var _LoneAnonymousOperationRule = require("./rules/LoneAnonymousOperationRule");
-
-var _SingleFieldSubscriptionsRule = require("./rules/SingleFieldSubscriptionsRule");
-
-var _KnownTypeNamesRule = require("./rules/KnownTypeNamesRule");
-
-var _FragmentsOnCompositeTypesRule = require("./rules/FragmentsOnCompositeTypesRule");
-
-var _VariablesAreInputTypesRule = require("./rules/VariablesAreInputTypesRule");
-
-var _ScalarLeafsRule = require("./rules/ScalarLeafsRule");
-
-var _FieldsOnCorrectTypeRule = require("./rules/FieldsOnCorrectTypeRule");
-
-var _UniqueFragmentNamesRule = require("./rules/UniqueFragmentNamesRule");
-
-var _KnownFragmentNamesRule = require("./rules/KnownFragmentNamesRule");
-
-var _NoUnusedFragmentsRule = require("./rules/NoUnusedFragmentsRule");
-
-var _PossibleFragmentSpreadsRule = require("./rules/PossibleFragmentSpreadsRule");
-
-var _NoFragmentCyclesRule = require("./rules/NoFragmentCyclesRule");
-
-var _UniqueVariableNamesRule = require("./rules/UniqueVariableNamesRule");
-
-var _NoUndefinedVariablesRule = require("./rules/NoUndefinedVariablesRule");
-
-var _NoUnusedVariablesRule = require("./rules/NoUnusedVariablesRule");
-
-var _KnownDirectivesRule = require("./rules/KnownDirectivesRule");
-
-var _UniqueDirectivesPerLocationRule = require("./rules/UniqueDirectivesPerLocationRule");
-
-var _KnownArgumentNamesRule = require("./rules/KnownArgumentNamesRule");
-
-var _UniqueArgumentNamesRule = require("./rules/UniqueArgumentNamesRule");
-
-var _ValuesOfCorrectTypeRule = require("./rules/ValuesOfCorrectTypeRule");
-
-var _ProvidedRequiredArgumentsRule = require("./rules/ProvidedRequiredArgumentsRule");
-
-var _VariablesInAllowedPositionRule = require("./rules/VariablesInAllowedPositionRule");
-
-var _OverlappingFieldsCanBeMergedRule = require("./rules/OverlappingFieldsCanBeMergedRule");
-
-var _UniqueInputFieldNamesRule = require("./rules/UniqueInputFieldNamesRule");
-
-var _LoneSchemaDefinitionRule = require("./rules/LoneSchemaDefinitionRule");
-
-var _UniqueOperationTypesRule = require("./rules/UniqueOperationTypesRule");
-
-var _UniqueTypeNamesRule = require("./rules/UniqueTypeNamesRule");
-
-var _UniqueEnumValueNamesRule = require("./rules/UniqueEnumValueNamesRule");
-
-var _UniqueFieldDefinitionNamesRule = require("./rules/UniqueFieldDefinitionNamesRule");
-
-var _UniqueDirectiveNamesRule = require("./rules/UniqueDirectiveNamesRule");
-
-var _PossibleTypeExtensionsRule = require("./rules/PossibleTypeExtensionsRule");
-
-// Spec Section: "Executable Definitions"
-// Spec Section: "Operation Name Uniqueness"
-// Spec Section: "Lone Anonymous Operation"
-// Spec Section: "Subscriptions with Single Root Field"
-// Spec Section: "Fragment Spread Type Existence"
-// Spec Section: "Fragments on Composite Types"
-// Spec Section: "Variables are Input Types"
-// Spec Section: "Leaf Field Selections"
-// Spec Section: "Field Selections on Objects, Interfaces, and Unions Types"
-// Spec Section: "Fragment Name Uniqueness"
-// Spec Section: "Fragment spread target defined"
-// Spec Section: "Fragments must be used"
-// Spec Section: "Fragment spread is possible"
-// Spec Section: "Fragments must not form cycles"
-// Spec Section: "Variable Uniqueness"
-// Spec Section: "All Variable Used Defined"
-// Spec Section: "All Variables Used"
-// Spec Section: "Directives Are Defined"
-// Spec Section: "Directives Are Unique Per Location"
-// Spec Section: "Argument Names"
-// Spec Section: "Argument Uniqueness"
-// Spec Section: "Value Type Correctness"
-// Spec Section: "Argument Optionality"
-// Spec Section: "All Variable Usages Are Allowed"
-// Spec Section: "Field Selection Merging"
-// Spec Section: "Input Object Field Uniqueness"
-// SDL-specific validation rules
-
-/**
- * This set includes all validation rules defined by the GraphQL spec.
- *
- * The order of the rules in this list has been adjusted to lead to the
- * most clear output when encountering multiple validation errors.
- */
-var specifiedRules = Object.freeze([_ExecutableDefinitionsRule.ExecutableDefinitionsRule, _UniqueOperationNamesRule.UniqueOperationNamesRule, _LoneAnonymousOperationRule.LoneAnonymousOperationRule, _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule, _KnownTypeNamesRule.KnownTypeNamesRule, _FragmentsOnCompositeTypesRule.FragmentsOnCompositeTypesRule, _VariablesAreInputTypesRule.VariablesAreInputTypesRule, _ScalarLeafsRule.ScalarLeafsRule, _FieldsOnCorrectTypeRule.FieldsOnCorrectTypeRule, _UniqueFragmentNamesRule.UniqueFragmentNamesRule, _KnownFragmentNamesRule.KnownFragmentNamesRule, _NoUnusedFragmentsRule.NoUnusedFragmentsRule, _PossibleFragmentSpreadsRule.PossibleFragmentSpreadsRule, _NoFragmentCyclesRule.NoFragmentCyclesRule, _UniqueVariableNamesRule.UniqueVariableNamesRule, _NoUndefinedVariablesRule.NoUndefinedVariablesRule, _NoUnusedVariablesRule.NoUnusedVariablesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _KnownArgumentNamesRule.KnownArgumentNamesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _ValuesOfCorrectTypeRule.ValuesOfCorrectTypeRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsRule, _VariablesInAllowedPositionRule.VariablesInAllowedPositionRule, _OverlappingFieldsCanBeMergedRule.OverlappingFieldsCanBeMergedRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule]);
-/**
- * @internal
- */
-
-exports.specifiedRules = specifiedRules;
-var specifiedSDLRules = Object.freeze([_LoneSchemaDefinitionRule.LoneSchemaDefinitionRule, _UniqueOperationTypesRule.UniqueOperationTypesRule, _UniqueTypeNamesRule.UniqueTypeNamesRule, _UniqueEnumValueNamesRule.UniqueEnumValueNamesRule, _UniqueFieldDefinitionNamesRule.UniqueFieldDefinitionNamesRule, _UniqueDirectiveNamesRule.UniqueDirectiveNamesRule, _KnownTypeNamesRule.KnownTypeNamesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _PossibleTypeExtensionsRule.PossibleTypeExtensionsRule, _KnownArgumentNamesRule.KnownArgumentNamesOnDirectivesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsOnDirectivesRule]);
-exports.specifiedSDLRules = specifiedSDLRules;
diff --git a/node_modules/graphql/validation/specifiedRules.js.flow b/node_modules/graphql/validation/specifiedRules.js.flow
deleted file mode 100644
index 54bbf84..0000000
--- a/node_modules/graphql/validation/specifiedRules.js.flow
+++ /dev/null
@@ -1,149 +0,0 @@
-// @flow strict
-
-// Spec Section: "Executable Definitions"
-import { ExecutableDefinitionsRule } from './rules/ExecutableDefinitionsRule';
-
-// Spec Section: "Operation Name Uniqueness"
-import { UniqueOperationNamesRule } from './rules/UniqueOperationNamesRule';
-
-// Spec Section: "Lone Anonymous Operation"
-import { LoneAnonymousOperationRule } from './rules/LoneAnonymousOperationRule';
-
-// Spec Section: "Subscriptions with Single Root Field"
-import { SingleFieldSubscriptionsRule } from './rules/SingleFieldSubscriptionsRule';
-
-// Spec Section: "Fragment Spread Type Existence"
-import { KnownTypeNamesRule } from './rules/KnownTypeNamesRule';
-
-// Spec Section: "Fragments on Composite Types"
-import { FragmentsOnCompositeTypesRule } from './rules/FragmentsOnCompositeTypesRule';
-
-// Spec Section: "Variables are Input Types"
-import { VariablesAreInputTypesRule } from './rules/VariablesAreInputTypesRule';
-
-// Spec Section: "Leaf Field Selections"
-import { ScalarLeafsRule } from './rules/ScalarLeafsRule';
-
-// Spec Section: "Field Selections on Objects, Interfaces, and Unions Types"
-import { FieldsOnCorrectTypeRule } from './rules/FieldsOnCorrectTypeRule';
-
-// Spec Section: "Fragment Name Uniqueness"
-import { UniqueFragmentNamesRule } from './rules/UniqueFragmentNamesRule';
-
-// Spec Section: "Fragment spread target defined"
-import { KnownFragmentNamesRule } from './rules/KnownFragmentNamesRule';
-
-// Spec Section: "Fragments must be used"
-import { NoUnusedFragmentsRule } from './rules/NoUnusedFragmentsRule';
-
-// Spec Section: "Fragment spread is possible"
-import { PossibleFragmentSpreadsRule } from './rules/PossibleFragmentSpreadsRule';
-
-// Spec Section: "Fragments must not form cycles"
-import { NoFragmentCyclesRule } from './rules/NoFragmentCyclesRule';
-
-// Spec Section: "Variable Uniqueness"
-import { UniqueVariableNamesRule } from './rules/UniqueVariableNamesRule';
-
-// Spec Section: "All Variable Used Defined"
-import { NoUndefinedVariablesRule } from './rules/NoUndefinedVariablesRule';
-
-// Spec Section: "All Variables Used"
-import { NoUnusedVariablesRule } from './rules/NoUnusedVariablesRule';
-
-// Spec Section: "Directives Are Defined"
-import { KnownDirectivesRule } from './rules/KnownDirectivesRule';
-
-// Spec Section: "Directives Are Unique Per Location"
-import { UniqueDirectivesPerLocationRule } from './rules/UniqueDirectivesPerLocationRule';
-
-// Spec Section: "Argument Names"
-import {
-  KnownArgumentNamesRule,
-  KnownArgumentNamesOnDirectivesRule,
-} from './rules/KnownArgumentNamesRule';
-
-// Spec Section: "Argument Uniqueness"
-import { UniqueArgumentNamesRule } from './rules/UniqueArgumentNamesRule';
-
-// Spec Section: "Value Type Correctness"
-import { ValuesOfCorrectTypeRule } from './rules/ValuesOfCorrectTypeRule';
-
-// Spec Section: "Argument Optionality"
-import {
-  ProvidedRequiredArgumentsRule,
-  ProvidedRequiredArgumentsOnDirectivesRule,
-} from './rules/ProvidedRequiredArgumentsRule';
-
-// Spec Section: "All Variable Usages Are Allowed"
-import { VariablesInAllowedPositionRule } from './rules/VariablesInAllowedPositionRule';
-
-// Spec Section: "Field Selection Merging"
-import { OverlappingFieldsCanBeMergedRule } from './rules/OverlappingFieldsCanBeMergedRule';
-
-// Spec Section: "Input Object Field Uniqueness"
-import { UniqueInputFieldNamesRule } from './rules/UniqueInputFieldNamesRule';
-
-// SDL-specific validation rules
-import { LoneSchemaDefinitionRule } from './rules/LoneSchemaDefinitionRule';
-import { UniqueOperationTypesRule } from './rules/UniqueOperationTypesRule';
-import { UniqueTypeNamesRule } from './rules/UniqueTypeNamesRule';
-import { UniqueEnumValueNamesRule } from './rules/UniqueEnumValueNamesRule';
-import { UniqueFieldDefinitionNamesRule } from './rules/UniqueFieldDefinitionNamesRule';
-import { UniqueDirectiveNamesRule } from './rules/UniqueDirectiveNamesRule';
-import { PossibleTypeExtensionsRule } from './rules/PossibleTypeExtensionsRule';
-
-/**
- * This set includes all validation rules defined by the GraphQL spec.
- *
- * The order of the rules in this list has been adjusted to lead to the
- * most clear output when encountering multiple validation errors.
- */
-export const specifiedRules = Object.freeze([
-  ExecutableDefinitionsRule,
-  UniqueOperationNamesRule,
-  LoneAnonymousOperationRule,
-  SingleFieldSubscriptionsRule,
-  KnownTypeNamesRule,
-  FragmentsOnCompositeTypesRule,
-  VariablesAreInputTypesRule,
-  ScalarLeafsRule,
-  FieldsOnCorrectTypeRule,
-  UniqueFragmentNamesRule,
-  KnownFragmentNamesRule,
-  NoUnusedFragmentsRule,
-  PossibleFragmentSpreadsRule,
-  NoFragmentCyclesRule,
-  UniqueVariableNamesRule,
-  NoUndefinedVariablesRule,
-  NoUnusedVariablesRule,
-  KnownDirectivesRule,
-  UniqueDirectivesPerLocationRule,
-  KnownArgumentNamesRule,
-  UniqueArgumentNamesRule,
-  ValuesOfCorrectTypeRule,
-  ProvidedRequiredArgumentsRule,
-  VariablesInAllowedPositionRule,
-  OverlappingFieldsCanBeMergedRule,
-  UniqueInputFieldNamesRule,
-]);
-
-/**
- * @internal
- */
-export const specifiedSDLRules = Object.freeze([
-  LoneSchemaDefinitionRule,
-  UniqueOperationTypesRule,
-  UniqueTypeNamesRule,
-  UniqueEnumValueNamesRule,
-  UniqueFieldDefinitionNamesRule,
-  UniqueDirectiveNamesRule,
-  KnownTypeNamesRule,
-  KnownDirectivesRule,
-  UniqueDirectivesPerLocationRule,
-  PossibleTypeExtensionsRule,
-  KnownArgumentNamesOnDirectivesRule,
-  UniqueArgumentNamesRule,
-  UniqueInputFieldNamesRule,
-  ProvidedRequiredArgumentsOnDirectivesRule,
-]);
diff --git a/node_modules/graphql/validation/specifiedRules.mjs b/node_modules/graphql/validation/specifiedRules.mjs
deleted file mode 100644
index 97f4664..0000000
--- a/node_modules/graphql/validation/specifiedRules.mjs
+++ /dev/null
@@ -1,73 +0,0 @@
-// Spec Section: "Executable Definitions"
-import { ExecutableDefinitionsRule } from "./rules/ExecutableDefinitionsRule.mjs"; // Spec Section: "Operation Name Uniqueness"
-
-import { UniqueOperationNamesRule } from "./rules/UniqueOperationNamesRule.mjs"; // Spec Section: "Lone Anonymous Operation"
-
-import { LoneAnonymousOperationRule } from "./rules/LoneAnonymousOperationRule.mjs"; // Spec Section: "Subscriptions with Single Root Field"
-
-import { SingleFieldSubscriptionsRule } from "./rules/SingleFieldSubscriptionsRule.mjs"; // Spec Section: "Fragment Spread Type Existence"
-
-import { KnownTypeNamesRule } from "./rules/KnownTypeNamesRule.mjs"; // Spec Section: "Fragments on Composite Types"
-
-import { FragmentsOnCompositeTypesRule } from "./rules/FragmentsOnCompositeTypesRule.mjs"; // Spec Section: "Variables are Input Types"
-
-import { VariablesAreInputTypesRule } from "./rules/VariablesAreInputTypesRule.mjs"; // Spec Section: "Leaf Field Selections"
-
-import { ScalarLeafsRule } from "./rules/ScalarLeafsRule.mjs"; // Spec Section: "Field Selections on Objects, Interfaces, and Unions Types"
-
-import { FieldsOnCorrectTypeRule } from "./rules/FieldsOnCorrectTypeRule.mjs"; // Spec Section: "Fragment Name Uniqueness"
-
-import { UniqueFragmentNamesRule } from "./rules/UniqueFragmentNamesRule.mjs"; // Spec Section: "Fragment spread target defined"
-
-import { KnownFragmentNamesRule } from "./rules/KnownFragmentNamesRule.mjs"; // Spec Section: "Fragments must be used"
-
-import { NoUnusedFragmentsRule } from "./rules/NoUnusedFragmentsRule.mjs"; // Spec Section: "Fragment spread is possible"
-
-import { PossibleFragmentSpreadsRule } from "./rules/PossibleFragmentSpreadsRule.mjs"; // Spec Section: "Fragments must not form cycles"
-
-import { NoFragmentCyclesRule } from "./rules/NoFragmentCyclesRule.mjs"; // Spec Section: "Variable Uniqueness"
-
-import { UniqueVariableNamesRule } from "./rules/UniqueVariableNamesRule.mjs"; // Spec Section: "All Variable Used Defined"
-
-import { NoUndefinedVariablesRule } from "./rules/NoUndefinedVariablesRule.mjs"; // Spec Section: "All Variables Used"
-
-import { NoUnusedVariablesRule } from "./rules/NoUnusedVariablesRule.mjs"; // Spec Section: "Directives Are Defined"
-
-import { KnownDirectivesRule } from "./rules/KnownDirectivesRule.mjs"; // Spec Section: "Directives Are Unique Per Location"
-
-import { UniqueDirectivesPerLocationRule } from "./rules/UniqueDirectivesPerLocationRule.mjs"; // Spec Section: "Argument Names"
-
-import { KnownArgumentNamesRule, KnownArgumentNamesOnDirectivesRule } from "./rules/KnownArgumentNamesRule.mjs"; // Spec Section: "Argument Uniqueness"
-
-import { UniqueArgumentNamesRule } from "./rules/UniqueArgumentNamesRule.mjs"; // Spec Section: "Value Type Correctness"
-
-import { ValuesOfCorrectTypeRule } from "./rules/ValuesOfCorrectTypeRule.mjs"; // Spec Section: "Argument Optionality"
-
-import { ProvidedRequiredArgumentsRule, ProvidedRequiredArgumentsOnDirectivesRule } from "./rules/ProvidedRequiredArgumentsRule.mjs"; // Spec Section: "All Variable Usages Are Allowed"
-
-import { VariablesInAllowedPositionRule } from "./rules/VariablesInAllowedPositionRule.mjs"; // Spec Section: "Field Selection Merging"
-
-import { OverlappingFieldsCanBeMergedRule } from "./rules/OverlappingFieldsCanBeMergedRule.mjs"; // Spec Section: "Input Object Field Uniqueness"
-
-import { UniqueInputFieldNamesRule } from "./rules/UniqueInputFieldNamesRule.mjs"; // SDL-specific validation rules
-
-import { LoneSchemaDefinitionRule } from "./rules/LoneSchemaDefinitionRule.mjs";
-import { UniqueOperationTypesRule } from "./rules/UniqueOperationTypesRule.mjs";
-import { UniqueTypeNamesRule } from "./rules/UniqueTypeNamesRule.mjs";
-import { UniqueEnumValueNamesRule } from "./rules/UniqueEnumValueNamesRule.mjs";
-import { UniqueFieldDefinitionNamesRule } from "./rules/UniqueFieldDefinitionNamesRule.mjs";
-import { UniqueDirectiveNamesRule } from "./rules/UniqueDirectiveNamesRule.mjs";
-import { PossibleTypeExtensionsRule } from "./rules/PossibleTypeExtensionsRule.mjs";
-/**
- * This set includes all validation rules defined by the GraphQL spec.
- *
- * The order of the rules in this list has been adjusted to lead to the
- * most clear output when encountering multiple validation errors.
- */
-
-export var specifiedRules = Object.freeze([ExecutableDefinitionsRule, UniqueOperationNamesRule, LoneAnonymousOperationRule, SingleFieldSubscriptionsRule, KnownTypeNamesRule, FragmentsOnCompositeTypesRule, VariablesAreInputTypesRule, ScalarLeafsRule, FieldsOnCorrectTypeRule, UniqueFragmentNamesRule, KnownFragmentNamesRule, NoUnusedFragmentsRule, PossibleFragmentSpreadsRule, NoFragmentCyclesRule, UniqueVariableNamesRule, NoUndefinedVariablesRule, NoUnusedVariablesRule, KnownDirectivesRule, UniqueDirectivesPerLocationRule, KnownArgumentNamesRule, UniqueArgumentNamesRule, ValuesOfCorrectTypeRule, ProvidedRequiredArgumentsRule, VariablesInAllowedPositionRule, OverlappingFieldsCanBeMergedRule, UniqueInputFieldNamesRule]);
-/**
- * @internal
- */
-
-export var specifiedSDLRules = Object.freeze([LoneSchemaDefinitionRule, UniqueOperationTypesRule, UniqueTypeNamesRule, UniqueEnumValueNamesRule, UniqueFieldDefinitionNamesRule, UniqueDirectiveNamesRule, KnownTypeNamesRule, KnownDirectivesRule, UniqueDirectivesPerLocationRule, PossibleTypeExtensionsRule, KnownArgumentNamesOnDirectivesRule, UniqueArgumentNamesRule, UniqueInputFieldNamesRule, ProvidedRequiredArgumentsOnDirectivesRule]);
diff --git a/node_modules/graphql/validation/validate.d.ts b/node_modules/graphql/validation/validate.d.ts
deleted file mode 100644
index 9230c52..0000000
--- a/node_modules/graphql/validation/validate.d.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import Maybe from '../tsutils/Maybe';
-
-import { GraphQLError } from '../error/GraphQLError';
-
-import { DocumentNode } from '../language/ast';
-
-import { GraphQLSchema } from '../type/schema';
-
-import { TypeInfo } from '../utilities/TypeInfo';
-
-import { ValidationRule, SDLValidationRule } from './ValidationContext';
-
-/**
- * Implements the "Validation" section of the spec.
- *
- * Validation runs synchronously, returning an array of encountered errors, or
- * an empty array if no errors were encountered and the document is valid.
- *
- * A list of specific validation rules may be provided. If not provided, the
- * default list of rules defined by the GraphQL specification will be used.
- *
- * Each validation rules is a function which returns a visitor
- * (see the language/visitor API). Visitor methods are expected to return
- * GraphQLErrors, or Arrays of GraphQLErrors when invalid.
- *
- * Optionally a custom TypeInfo instance may be provided. If not provided, one
- * will be created from the provided schema.
- */
-export function validate(
-  schema: GraphQLSchema,
-  documentAST: DocumentNode,
-  rules?: ReadonlyArray<ValidationRule>,
-  typeInfo?: TypeInfo,
-  options?: { maxErrors?: number },
-): ReadonlyArray<GraphQLError>;
-
-/**
- * @internal
- */
-export function validateSDL(
-  documentAST: DocumentNode,
-  schemaToExtend?: Maybe<GraphQLSchema>,
-  rules?: ReadonlyArray<SDLValidationRule>,
-): Array<GraphQLError>;
-
-/**
- * Utility function which asserts a SDL document is valid by throwing an error
- * if it is invalid.
- *
- * @internal
- */
-export function assertValidSDL(documentAST: DocumentNode): undefined;
-
-/**
- * Utility function which asserts a SDL document is valid by throwing an error
- * if it is invalid.
- *
- * @internal
- */
-export function assertValidSDLExtension(
-  documentAST: DocumentNode,
-  schema: GraphQLSchema,
-): undefined;
diff --git a/node_modules/graphql/validation/validate.js b/node_modules/graphql/validation/validate.js
deleted file mode 100644
index 0a207e4..0000000
--- a/node_modules/graphql/validation/validate.js
+++ /dev/null
@@ -1,128 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.validate = validate;
-exports.validateSDL = validateSDL;
-exports.assertValidSDL = assertValidSDL;
-exports.assertValidSDLExtension = assertValidSDLExtension;
-
-var _devAssert = _interopRequireDefault(require("../jsutils/devAssert"));
-
-var _GraphQLError = require("../error/GraphQLError");
-
-var _visitor = require("../language/visitor");
-
-var _validate = require("../type/validate");
-
-var _TypeInfo = require("../utilities/TypeInfo");
-
-var _specifiedRules = require("./specifiedRules");
-
-var _ValidationContext = require("./ValidationContext");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Implements the "Validation" section of the spec.
- *
- * Validation runs synchronously, returning an array of encountered errors, or
- * an empty array if no errors were encountered and the document is valid.
- *
- * A list of specific validation rules may be provided. If not provided, the
- * default list of rules defined by the GraphQL specification will be used.
- *
- * Each validation rules is a function which returns a visitor
- * (see the language/visitor API). Visitor methods are expected to return
- * GraphQLErrors, or Arrays of GraphQLErrors when invalid.
- *
- * Optionally a custom TypeInfo instance may be provided. If not provided, one
- * will be created from the provided schema.
- */
-function validate(schema, documentAST) {
-  var rules = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _specifiedRules.specifiedRules;
-  var typeInfo = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new _TypeInfo.TypeInfo(schema);
-  var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {
-    maxErrors: undefined
-  };
-  documentAST || (0, _devAssert.default)(0, 'Must provide document.'); // If the schema used for validation is invalid, throw an error.
-
-  (0, _validate.assertValidSchema)(schema);
-  var abortObj = Object.freeze({});
-  var errors = [];
-  var context = new _ValidationContext.ValidationContext(schema, documentAST, typeInfo, function (error) {
-    if (options.maxErrors != null && errors.length >= options.maxErrors) {
-      errors.push(new _GraphQLError.GraphQLError('Too many validation errors, error limit reached. Validation aborted.'));
-      throw abortObj;
-    }
-
-    errors.push(error);
-  }); // This uses a specialized visitor which runs multiple visitors in parallel,
-  // while maintaining the visitor skip and break API.
-
-  var visitor = (0, _visitor.visitInParallel)(rules.map(function (rule) {
-    return rule(context);
-  })); // Visit the whole document with each instance of all provided rules.
-
-  try {
-    (0, _visitor.visit)(documentAST, (0, _TypeInfo.visitWithTypeInfo)(typeInfo, visitor));
-  } catch (e) {
-    if (e !== abortObj) {
-      throw e;
-    }
-  }
-
-  return errors;
-}
-/**
- * @internal
- */
-
-
-function validateSDL(documentAST, schemaToExtend) {
-  var rules = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _specifiedRules.specifiedSDLRules;
-  var errors = [];
-  var context = new _ValidationContext.SDLValidationContext(documentAST, schemaToExtend, function (error) {
-    errors.push(error);
-  });
-  var visitors = rules.map(function (rule) {
-    return rule(context);
-  });
-  (0, _visitor.visit)(documentAST, (0, _visitor.visitInParallel)(visitors));
-  return errors;
-}
-/**
- * Utility function which asserts a SDL document is valid by throwing an error
- * if it is invalid.
- *
- * @internal
- */
-
-
-function assertValidSDL(documentAST) {
-  var errors = validateSDL(documentAST);
-
-  if (errors.length !== 0) {
-    throw new Error(errors.map(function (error) {
-      return error.message;
-    }).join('\n\n'));
-  }
-}
-/**
- * Utility function which asserts a SDL document is valid by throwing an error
- * if it is invalid.
- *
- * @internal
- */
-
-
-function assertValidSDLExtension(documentAST, schema) {
-  var errors = validateSDL(documentAST, schema);
-
-  if (errors.length !== 0) {
-    throw new Error(errors.map(function (error) {
-      return error.message;
-    }).join('\n\n'));
-  }
-}
diff --git a/node_modules/graphql/validation/validate.js.flow b/node_modules/graphql/validation/validate.js.flow
deleted file mode 100644
index 63361e9..0000000
--- a/node_modules/graphql/validation/validate.js.flow
+++ /dev/null
@@ -1,133 +0,0 @@
-// @flow strict
-
-import devAssert from '../jsutils/devAssert';
-
-import { GraphQLError } from '../error/GraphQLError';
-
-import { type DocumentNode } from '../language/ast';
-import { visit, visitInParallel } from '../language/visitor';
-
-import { type GraphQLSchema } from '../type/schema';
-import { assertValidSchema } from '../type/validate';
-
-import { TypeInfo, visitWithTypeInfo } from '../utilities/TypeInfo';
-
-import { specifiedRules, specifiedSDLRules } from './specifiedRules';
-import {
-  type SDLValidationRule,
-  type ValidationRule,
-  SDLValidationContext,
-  ValidationContext,
-} from './ValidationContext';
-
-/**
- * Implements the "Validation" section of the spec.
- *
- * Validation runs synchronously, returning an array of encountered errors, or
- * an empty array if no errors were encountered and the document is valid.
- *
- * A list of specific validation rules may be provided. If not provided, the
- * default list of rules defined by the GraphQL specification will be used.
- *
- * Each validation rules is a function which returns a visitor
- * (see the language/visitor API). Visitor methods are expected to return
- * GraphQLErrors, or Arrays of GraphQLErrors when invalid.
- *
- * Optionally a custom TypeInfo instance may be provided. If not provided, one
- * will be created from the provided schema.
- */
-export function validate(
-  schema: GraphQLSchema,
-  documentAST: DocumentNode,
-  rules?: $ReadOnlyArray<ValidationRule> = specifiedRules,
-  typeInfo?: TypeInfo = new TypeInfo(schema),
-  options?: {| maxErrors?: number |} = { maxErrors: undefined },
-): $ReadOnlyArray<GraphQLError> {
-  devAssert(documentAST, 'Must provide document.');
-  // If the schema used for validation is invalid, throw an error.
-  assertValidSchema(schema);
-
-  const abortObj = Object.freeze({});
-  const errors = [];
-  const context = new ValidationContext(
-    schema,
-    documentAST,
-    typeInfo,
-    error => {
-      if (options.maxErrors != null && errors.length >= options.maxErrors) {
-        errors.push(
-          new GraphQLError(
-            'Too many validation errors, error limit reached. Validation aborted.',
-          ),
-        );
-        throw abortObj;
-      }
-      errors.push(error);
-    },
-  );
-
-  // This uses a specialized visitor which runs multiple visitors in parallel,
-  // while maintaining the visitor skip and break API.
-  const visitor = visitInParallel(rules.map(rule => rule(context)));
-
-  // Visit the whole document with each instance of all provided rules.
-  try {
-    visit(documentAST, visitWithTypeInfo(typeInfo, visitor));
-  } catch (e) {
-    if (e !== abortObj) {
-      throw e;
-    }
-  }
-  return errors;
-}
-
-/**
- * @internal
- */
-export function validateSDL(
-  documentAST: DocumentNode,
-  schemaToExtend?: ?GraphQLSchema,
-  rules?: $ReadOnlyArray<SDLValidationRule> = specifiedSDLRules,
-): $ReadOnlyArray<GraphQLError> {
-  const errors = [];
-  const context = new SDLValidationContext(
-    documentAST,
-    schemaToExtend,
-    error => {
-      errors.push(error);
-    },
-  );
-
-  const visitors = rules.map(rule => rule(context));
-  visit(documentAST, visitInParallel(visitors));
-  return errors;
-}
-
-/**
- * Utility function which asserts a SDL document is valid by throwing an error
- * if it is invalid.
- *
- * @internal
- */
-export function assertValidSDL(documentAST: DocumentNode): void {
-  const errors = validateSDL(documentAST);
-  if (errors.length !== 0) {
-    throw new Error(errors.map(error => error.message).join('\n\n'));
-  }
-}
-
-/**
- * Utility function which asserts a SDL document is valid by throwing an error
- * if it is invalid.
- *
- * @internal
- */
-export function assertValidSDLExtension(
-  documentAST: DocumentNode,
-  schema: GraphQLSchema,
-): void {
-  const errors = validateSDL(documentAST, schema);
-  if (errors.length !== 0) {
-    throw new Error(errors.map(error => error.message).join('\n\n'));
-  }
-}
diff --git a/node_modules/graphql/validation/validate.mjs b/node_modules/graphql/validation/validate.mjs
deleted file mode 100644
index 2ae71e7..0000000
--- a/node_modules/graphql/validation/validate.mjs
+++ /dev/null
@@ -1,107 +0,0 @@
-import devAssert from "../jsutils/devAssert.mjs";
-import { GraphQLError } from "../error/GraphQLError.mjs";
-import { visit, visitInParallel } from "../language/visitor.mjs";
-import { assertValidSchema } from "../type/validate.mjs";
-import { TypeInfo, visitWithTypeInfo } from "../utilities/TypeInfo.mjs";
-import { specifiedRules, specifiedSDLRules } from "./specifiedRules.mjs";
-import { SDLValidationContext, ValidationContext } from "./ValidationContext.mjs";
-/**
- * Implements the "Validation" section of the spec.
- *
- * Validation runs synchronously, returning an array of encountered errors, or
- * an empty array if no errors were encountered and the document is valid.
- *
- * A list of specific validation rules may be provided. If not provided, the
- * default list of rules defined by the GraphQL specification will be used.
- *
- * Each validation rules is a function which returns a visitor
- * (see the language/visitor API). Visitor methods are expected to return
- * GraphQLErrors, or Arrays of GraphQLErrors when invalid.
- *
- * Optionally a custom TypeInfo instance may be provided. If not provided, one
- * will be created from the provided schema.
- */
-
-export function validate(schema, documentAST) {
-  var rules = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : specifiedRules;
-  var typeInfo = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new TypeInfo(schema);
-  var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {
-    maxErrors: undefined
-  };
-  documentAST || devAssert(0, 'Must provide document.'); // If the schema used for validation is invalid, throw an error.
-
-  assertValidSchema(schema);
-  var abortObj = Object.freeze({});
-  var errors = [];
-  var context = new ValidationContext(schema, documentAST, typeInfo, function (error) {
-    if (options.maxErrors != null && errors.length >= options.maxErrors) {
-      errors.push(new GraphQLError('Too many validation errors, error limit reached. Validation aborted.'));
-      throw abortObj;
-    }
-
-    errors.push(error);
-  }); // This uses a specialized visitor which runs multiple visitors in parallel,
-  // while maintaining the visitor skip and break API.
-
-  var visitor = visitInParallel(rules.map(function (rule) {
-    return rule(context);
-  })); // Visit the whole document with each instance of all provided rules.
-
-  try {
-    visit(documentAST, visitWithTypeInfo(typeInfo, visitor));
-  } catch (e) {
-    if (e !== abortObj) {
-      throw e;
-    }
-  }
-
-  return errors;
-}
-/**
- * @internal
- */
-
-export function validateSDL(documentAST, schemaToExtend) {
-  var rules = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : specifiedSDLRules;
-  var errors = [];
-  var context = new SDLValidationContext(documentAST, schemaToExtend, function (error) {
-    errors.push(error);
-  });
-  var visitors = rules.map(function (rule) {
-    return rule(context);
-  });
-  visit(documentAST, visitInParallel(visitors));
-  return errors;
-}
-/**
- * Utility function which asserts a SDL document is valid by throwing an error
- * if it is invalid.
- *
- * @internal
- */
-
-export function assertValidSDL(documentAST) {
-  var errors = validateSDL(documentAST);
-
-  if (errors.length !== 0) {
-    throw new Error(errors.map(function (error) {
-      return error.message;
-    }).join('\n\n'));
-  }
-}
-/**
- * Utility function which asserts a SDL document is valid by throwing an error
- * if it is invalid.
- *
- * @internal
- */
-
-export function assertValidSDLExtension(documentAST, schema) {
-  var errors = validateSDL(documentAST, schema);
-
-  if (errors.length !== 0) {
-    throw new Error(errors.map(function (error) {
-      return error.message;
-    }).join('\n\n'));
-  }
-}
diff --git a/node_modules/graphql/version.d.ts b/node_modules/graphql/version.d.ts
deleted file mode 100644
index 765329b..0000000
--- a/node_modules/graphql/version.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * A string containing the version of the GraphQL.js library
- */
-export const version: string;
-
-/**
- * An object containing the components of the GraphQL.js version string
- */
-export const versionInfo: {
-  major: number;
-  minor: number;
-  patch: number;
-  preReleaseTag: number | null;
-};
diff --git a/node_modules/graphql/version.js b/node_modules/graphql/version.js
deleted file mode 100644
index 0770687..0000000
--- a/node_modules/graphql/version.js
+++ /dev/null
@@ -1,28 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.versionInfo = exports.version = void 0;
-
-/**
- * Note: This file is autogenerated using "resources/gen-version.js" script and
- * automatically updated by "yarn version" command.
- */
-
-/**
- * A string containing the version of the GraphQL.js library
- */
-var version = '15.0.0-rc.2';
-/**
- * An object containing the components of the GraphQL.js version string
- */
-
-exports.version = version;
-var versionInfo = Object.freeze({
-  major: 15,
-  minor: 0,
-  patch: 0,
-  preReleaseTag: 'rc.2'
-});
-exports.versionInfo = versionInfo;
diff --git a/node_modules/graphql/version.js.flow b/node_modules/graphql/version.js.flow
deleted file mode 100644
index fa19a5f..0000000
--- a/node_modules/graphql/version.js.flow
+++ /dev/null
@@ -1,21 +0,0 @@
-// @flow strict
-
-/**
- * Note: This file is autogenerated using "resources/gen-version.js" script and
- * automatically updated by "yarn version" command.
- */
-
-/**
- * A string containing the version of the GraphQL.js library
- */
-export const version = '15.0.0-rc.2';
-
-/**
- * An object containing the components of the GraphQL.js version string
- */
-export const versionInfo = Object.freeze({
-  major: 15,
-  minor: 0,
-  patch: 0,
-  preReleaseTag: 'rc.2',
-});
diff --git a/node_modules/graphql/version.mjs b/node_modules/graphql/version.mjs
deleted file mode 100644
index a7998c6..0000000
--- a/node_modules/graphql/version.mjs
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Note: This file is autogenerated using "resources/gen-version.js" script and
- * automatically updated by "yarn version" command.
- */
-
-/**
- * A string containing the version of the GraphQL.js library
- */
-export var version = '15.0.0-rc.2';
-/**
- * An object containing the components of the GraphQL.js version string
- */
-
-export var versionInfo = Object.freeze({
-  major: 15,
-  minor: 0,
-  patch: 0,
-  preReleaseTag: 'rc.2'
-});
diff --git a/node_modules/import-fresh/node_modules/resolve-from/index.js b/node_modules/import-fresh/node_modules/resolve-from/index.js
new file mode 100644
index 0000000..d092447
--- /dev/null
+++ b/node_modules/import-fresh/node_modules/resolve-from/index.js
@@ -0,0 +1,47 @@
+'use strict';
+const path = require('path');
+const Module = require('module');
+const fs = require('fs');
+
+const resolveFrom = (fromDir, moduleId, silent) => {
+	if (typeof fromDir !== 'string') {
+		throw new TypeError(`Expected \`fromDir\` to be of type \`string\`, got \`${typeof fromDir}\``);
+	}
+
+	if (typeof moduleId !== 'string') {
+		throw new TypeError(`Expected \`moduleId\` to be of type \`string\`, got \`${typeof moduleId}\``);
+	}
+
+	try {
+		fromDir = fs.realpathSync(fromDir);
+	} catch (err) {
+		if (err.code === 'ENOENT') {
+			fromDir = path.resolve(fromDir);
+		} else if (silent) {
+			return null;
+		} else {
+			throw err;
+		}
+	}
+
+	const fromFile = path.join(fromDir, 'noop.js');
+
+	const resolveFileName = () => Module._resolveFilename(moduleId, {
+		id: fromFile,
+		filename: fromFile,
+		paths: Module._nodeModulePaths(fromDir)
+	});
+
+	if (silent) {
+		try {
+			return resolveFileName();
+		} catch (err) {
+			return null;
+		}
+	}
+
+	return resolveFileName();
+};
+
+module.exports = (fromDir, moduleId) => resolveFrom(fromDir, moduleId);
+module.exports.silent = (fromDir, moduleId) => resolveFrom(fromDir, moduleId, true);
diff --git a/node_modules/resolve-cwd/node_modules/resolve-from/license b/node_modules/import-fresh/node_modules/resolve-from/license
similarity index 100%
rename from node_modules/resolve-cwd/node_modules/resolve-from/license
rename to node_modules/import-fresh/node_modules/resolve-from/license
diff --git a/node_modules/import-fresh/node_modules/resolve-from/package.json b/node_modules/import-fresh/node_modules/resolve-from/package.json
new file mode 100644
index 0000000..96bade5
--- /dev/null
+++ b/node_modules/import-fresh/node_modules/resolve-from/package.json
@@ -0,0 +1,34 @@
+{
+	"name": "resolve-from",
+	"version": "4.0.0",
+	"description": "Resolve the path of a module like `require.resolve()` but from a given path",
+	"license": "MIT",
+	"repository": "sindresorhus/resolve-from",
+	"author": {
+		"name": "Sindre Sorhus",
+		"email": "sindresorhus@gmail.com",
+		"url": "sindresorhus.com"
+	},
+	"engines": {
+		"node": ">=4"
+	},
+	"scripts": {
+		"test": "xo && ava"
+	},
+	"files": [
+		"index.js"
+	],
+	"keywords": [
+		"require",
+		"resolve",
+		"path",
+		"module",
+		"from",
+		"like",
+		"import"
+	],
+	"devDependencies": {
+		"ava": "*",
+		"xo": "*"
+	}
+}
diff --git a/node_modules/import-fresh/node_modules/resolve-from/readme.md b/node_modules/import-fresh/node_modules/resolve-from/readme.md
new file mode 100644
index 0000000..e539f85
--- /dev/null
+++ b/node_modules/import-fresh/node_modules/resolve-from/readme.md
@@ -0,0 +1,72 @@
+# resolve-from [![Build Status](https://travis-ci.org/sindresorhus/resolve-from.svg?branch=master)](https://travis-ci.org/sindresorhus/resolve-from)
+
+> Resolve the path of a module like [`require.resolve()`](https://nodejs.org/api/globals.html#globals_require_resolve) but from a given path
+
+
+## Install
+
+```
+$ npm install resolve-from
+```
+
+
+## Usage
+
+```js
+const resolveFrom = require('resolve-from');
+
+// There is a file at `./foo/bar.js`
+
+resolveFrom('foo', './bar');
+//=> '/Users/sindresorhus/dev/test/foo/bar.js'
+```
+
+
+## API
+
+### resolveFrom(fromDir, moduleId)
+
+Like `require()`, throws when the module can't be found.
+
+### resolveFrom.silent(fromDir, moduleId)
+
+Returns `null` instead of throwing when the module can't be found.
+
+#### fromDir
+
+Type: `string`
+
+Directory to resolve from.
+
+#### moduleId
+
+Type: `string`
+
+What you would use in `require()`.
+
+
+## Tip
+
+Create a partial using a bound function if you want to resolve from the same `fromDir` multiple times:
+
+```js
+const resolveFromFoo = resolveFrom.bind(null, 'foo');
+
+resolveFromFoo('./bar');
+resolveFromFoo('./baz');
+```
+
+
+## Related
+
+- [resolve-cwd](https://github.com/sindresorhus/resolve-cwd) - Resolve the path of a module from the current working directory
+- [import-from](https://github.com/sindresorhus/import-from) - Import a module from a given path
+- [import-cwd](https://github.com/sindresorhus/import-cwd) - Import a module from the current working directory
+- [resolve-pkg](https://github.com/sindresorhus/resolve-pkg) - Resolve the path of a package regardless of it having an entry point
+- [import-lazy](https://github.com/sindresorhus/import-lazy) - Import a module lazily
+- [resolve-global](https://github.com/sindresorhus/resolve-global) - Resolve the path of a globally installed module
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/inquirer/LICENSE b/node_modules/inquirer/LICENSE
deleted file mode 100644
index 8aae090..0000000
--- a/node_modules/inquirer/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2012 Simon Boudrias
-
-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.
\ No newline at end of file
diff --git a/node_modules/inquirer/README.md b/node_modules/inquirer/README.md
deleted file mode 100644
index 7fa5119..0000000
--- a/node_modules/inquirer/README.md
+++ /dev/null
@@ -1,476 +0,0 @@
-<img width="75px" height="75px" align="right" alt="Inquirer Logo" src="https://raw.githubusercontent.com/SBoudrias/Inquirer.js/master/assets/inquirer_readme.svg?sanitize=true" title="Inquirer.js"/>
-
-# Inquirer.js
-
-[![npm](https://badge.fury.io/js/inquirer.svg)](http://badge.fury.io/js/inquirer)
-[![tests](https://travis-ci.org/SBoudrias/Inquirer.js.svg?branch=master)](http://travis-ci.org/SBoudrias/Inquirer.js)
-[![Coverage Status](https://codecov.io/gh/SBoudrias/Inquirer.js/branch/master/graph/badge.svg)](https://codecov.io/gh/SBoudrias/Inquirer.js)
-[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FSBoudrias%2FInquirer.js.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2FSBoudrias%2FInquirer.js?ref=badge_shield)
-
-A collection of common interactive command line user interfaces.
-
-## Table of Contents
-
-1.  [Documentation](#documentation)
-    1.  [Installation](#installation)
-    2.  [Examples](#examples)
-    3.  [Methods](#methods)
-    4.  [Objects](#objects)
-    5.  [Questions](#questions)
-    6.  [Answers](#answers)
-    7.  [Separator](#separator)
-    8.  [Prompt Types](#prompt)
-2.  [User Interfaces and Layouts](#layouts)
-    1.  [Reactive Interface](#reactive)
-3.  [Support](#support)
-4.  [Known issues](#issues)
-4.  [News](#news)
-5.  [Contributing](#contributing)
-6.  [License](#license)
-7.  [Plugins](#plugins)
-
-## Goal and Philosophy
-
-**`Inquirer.js`** strives to be an easily embeddable and beautiful command line interface for [Node.js](https://nodejs.org/) (and perhaps the "CLI [Xanadu](https://en.wikipedia.org/wiki/Citizen_Kane)").
-
-**`Inquirer.js`** should ease the process of
-
-- providing _error feedback_
-- _asking questions_
-- _parsing_ input
-- _validating_ answers
-- managing _hierarchical prompts_
-
-> **Note:** **`Inquirer.js`** provides the user interface and the inquiry session flow. If you're searching for a full blown command line program utility, then check out [commander](https://github.com/visionmedia/commander.js), [vorpal](https://github.com/dthree/vorpal) or [args](https://github.com/leo/args).
-
-## [Documentation](#documentation)
-
-<a name="documentation"></a>
-
-### Installation
-
-<a name="installation"></a>
-
-```shell
-npm install inquirer
-```
-
-```javascript
-var inquirer = require('inquirer');
-inquirer
-  .prompt([
-    /* Pass your questions in here */
-  ])
-  .then(answers => {
-    // Use user feedback for... whatever!!
-  })
-  .catch(error => {
-    if(error.isTtyError) {
-      // Prompt couldn't be rendered in the current environment
-    } else {
-      // Something else when wrong
-    }
-  });
-```
-
-<a name="examples"></a>
-
-### Examples (Run it and see it)
-
-Check out the [`packages/inquirer/examples/`](https://github.com/SBoudrias/Inquirer.js/tree/master/packages/inquirer/examples) folder for code and interface examples.
-
-```shell
-node packages/inquirer/examples/pizza.js
-node packages/inquirer/examples/checkbox.js
-# etc...
-```
-
-### Methods
-
-<a name="methods"></a>
-
-#### `inquirer.prompt(questions) -> promise`
-
-Launch the prompt interface (inquiry session)
-
-- **questions** (Array) containing [Question Object](#question) (using the [reactive interface](#reactive-interface), you can also pass a `Rx.Observable` instance)
-- returns a **Promise**
-
-#### `inquirer.registerPrompt(name, prompt)`
-
-Register prompt plugins under `name`.
-
-- **name** (string) name of the this new prompt. (used for question `type`)
-- **prompt** (object) the prompt object itself (the plugin)
-
-#### `inquirer.createPromptModule() -> prompt function`
-
-Create a self contained inquirer module. If you don't want to affect other libraries that also rely on inquirer when you overwrite or add new prompt types.
-
-```js
-var prompt = inquirer.createPromptModule();
-
-prompt(questions).then(/* ... */);
-```
-
-### Objects
-
-<a name="objects"></a>
-
-#### Question
-
-<a name="questions"></a>
-A question object is a `hash` containing question related values:
-
-- **type**: (String) Type of the prompt. Defaults: `input` - Possible values: `input`, `number`, `confirm`,
-  `list`, `rawlist`, `expand`, `checkbox`, `password`, `editor`
-- **name**: (String) The name to use when storing the answer in the answers hash. If the name contains periods, it will define a path in the answers hash.
-- **message**: (String|Function) The question to print. If defined as a function, the first parameter will be the current inquirer session answers. Defaults to the value of `name` (followed by a colon).
-- **default**: (String|Number|Boolean|Array|Function) Default value(s) to use if nothing is entered, or a function that returns the default value(s). If defined as a function, the first parameter will be the current inquirer session answers.
-- **choices**: (Array|Function) Choices array or a function returning a choices array. If defined as a function, the first parameter will be the current inquirer session answers.
-  Array values can be simple `numbers`, `strings`, or `objects` containing a `name` (to display in list), a `value` (to save in the answers hash) and a `short` (to display after selection) properties. The choices array can also contain [a `Separator`](#separator).
-- **validate**: (Function) Receive the user input and answers hash. Should return `true` if the value is valid, and an error message (`String`) otherwise. If `false` is returned, a default error message is provided.
-- **filter**: (Function) Receive the user input and return the filtered value to be used inside the program. The value returned will be added to the _Answers_ hash.
-- **transformer**: (Function) Receive the user input, answers hash and option flags, and return a transformed value to display to the user. The transformation only impacts what is shown while editing. It does not modify the answers hash.
-- **when**: (Function, Boolean) Receive the current user answers hash and should return `true` or `false` depending on whether or not this question should be asked. The value can also be a simple boolean.
-- **pageSize**: (Number) Change the number of lines that will be rendered when using `list`, `rawList`, `expand` or `checkbox`.
-- **prefix**: (String) Change the default _prefix_ message.
-- **suffix**: (String) Change the default _suffix_ message.
-- **askAnswered**: (Boolean) Force to prompt the question if the answer already exists.
-
-`default`, `choices`(if defined as functions), `validate`, `filter` and `when` functions can be called asynchronously. Either return a promise or use `this.async()` to get a callback you'll call with the final value.
-
-```javascript
-{
-  /* Preferred way: with promise */
-  filter() {
-    return new Promise(/* etc... */);
-  },
-
-  /* Legacy way: with this.async */
-  validate: function (input) {
-    // Declare function as asynchronous, and save the done callback
-    var done = this.async();
-
-    // Do async stuff
-    setTimeout(function() {
-      if (typeof input !== 'number') {
-        // Pass the return value in the done callback
-        done('You need to provide a number');
-        return;
-      }
-      // Pass the return value in the done callback
-      done(null, true);
-    }, 3000);
-  }
-}
-```
-
-### Answers
-
-<a name="answers"></a>
-A key/value hash containing the client answers in each prompt.
-
-- **Key** The `name` property of the _question_ object
-- **Value** (Depends on the prompt)
-  - `confirm`: (Boolean)
-  - `input` : User input (filtered if `filter` is defined) (String)
-  - `number`: User input (filtered if `filter` is defined) (Number)
-  - `rawlist`, `list` : Selected choice value (or name if no value specified) (String)
-
-### Separator
-
-<a name="separator"></a>
-A separator can be added to any `choices` array:
-
-```
-// In the question object
-choices: [ "Choice A", new inquirer.Separator(), "choice B" ]
-
-// Which'll be displayed this way
-[?] What do you want to do?
- > Order a pizza
-   Make a reservation
-   --------
-   Ask opening hours
-   Talk to the receptionist
-```
-
-The constructor takes a facultative `String` value that'll be use as the separator. If omitted, the separator will be `--------`.
-
-Separator instances have a property `type` equal to `separator`. This should allow tools façading Inquirer interface from detecting separator types in lists.
-
-<a name="prompt"></a>
-
-### Prompt types
-
----
-
-> **Note:**: _allowed options written inside square brackets (`[]`) are optional. Others are required._
-
-#### List - `{type: 'list'}`
-
-Take `type`, `name`, `message`, `choices`[, `default`, `filter`] properties. (Note that
-default must be the choice `index` in the array or a choice `value`)
-
-![List prompt](https://cdn.rawgit.com/SBoudrias/Inquirer.js/28ae8337ba51d93e359ef4f7ee24e79b69898962/assets/screenshots/list.svg)
-
----
-
-#### Raw List - `{type: 'rawlist'}`
-
-Take `type`, `name`, `message`, `choices`[, `default`, `filter`] properties. (Note that
-default must be the choice `index` in the array)
-
-![Raw list prompt](https://cdn.rawgit.com/SBoudrias/Inquirer.js/28ae8337ba51d93e359ef4f7ee24e79b69898962/assets/screenshots/rawlist.svg)
-
----
-
-#### Expand - `{type: 'expand'}`
-
-Take `type`, `name`, `message`, `choices`[, `default`] properties. (Note that
-default must be the choice `index` in the array. If `default` key not provided, then `help` will be used as default choice)
-
-Note that the `choices` object will take an extra parameter called `key` for the `expand` prompt. This parameter must be a single (lowercased) character. The `h` option is added by the prompt and shouldn't be defined by the user.
-
-See `examples/expand.js` for a running example.
-
-![Expand prompt closed](https://cdn.rawgit.com/SBoudrias/Inquirer.js/28ae8337ba51d93e359ef4f7ee24e79b69898962/assets/screenshots/expand-y.svg)
-![Expand prompt expanded](https://cdn.rawgit.com/SBoudrias/Inquirer.js/28ae8337ba51d93e359ef4f7ee24e79b69898962/assets/screenshots/expand-d.svg)
-
----
-
-#### Checkbox - `{type: 'checkbox'}`
-
-Take `type`, `name`, `message`, `choices`[, `filter`, `validate`, `default`] properties. `default` is expected to be an Array of the checked choices value.
-
-Choices marked as `{checked: true}` will be checked by default.
-
-Choices whose property `disabled` is truthy will be unselectable. If `disabled` is a string, then the string will be outputted next to the disabled choice, otherwise it'll default to `"Disabled"`. The `disabled` property can also be a synchronous function receiving the current answers as argument and returning a boolean or a string.
-
-![Checkbox prompt](https://cdn.rawgit.com/SBoudrias/Inquirer.js/28ae8337ba51d93e359ef4f7ee24e79b69898962/assets/screenshots/checkbox.svg)
-
----
-
-#### Confirm - `{type: 'confirm'}`
-
-Take `type`, `name`, `message`, [`default`] properties. `default` is expected to be a boolean if used.
-
-![Confirm prompt](https://cdn.rawgit.com/SBoudrias/Inquirer.js/28ae8337ba51d93e359ef4f7ee24e79b69898962/assets/screenshots/confirm.svg)
-
----
-
-#### Input - `{type: 'input'}`
-
-Take `type`, `name`, `message`[, `default`, `filter`, `validate`, `transformer`] properties.
-
-![Input prompt](https://cdn.rawgit.com/SBoudrias/Inquirer.js/28ae8337ba51d93e359ef4f7ee24e79b69898962/assets/screenshots/input.svg)
-
----
-
-#### Input - `{type: 'number'}`
-
-Take `type`, `name`, `message`[, `default`, `filter`, `validate`, `transformer`] properties.
-
----
-
-#### Password - `{type: 'password'}`
-
-Take `type`, `name`, `message`, `mask`,[, `default`, `filter`, `validate`] properties.
-
-![Password prompt](https://cdn.rawgit.com/SBoudrias/Inquirer.js/28ae8337ba51d93e359ef4f7ee24e79b69898962/assets/screenshots/password.svg)
-
----
-
-Note that `mask` is required to hide the actual user input.
-
-#### Editor - `{type: 'editor'}`
-
-Take `type`, `name`, `message`[, `default`, `filter`, `validate`] properties
-
-Launches an instance of the users preferred editor on a temporary file. Once the user exits their editor, the contents of the temporary file are read in as the result. The editor to use is determined by reading the $VISUAL or $EDITOR environment variables. If neither of those are present, notepad (on Windows) or vim (Linux or Mac) is used.
-
-<a name="layouts"></a>
-
-### Use in Non-Interactive Environments
-`prompt()` requires that it is run in an interactive environment. (I.e. [One where `process.stdin.isTTY` is `true`](https://nodejs.org/docs/latest-v12.x/api/process.html#process_a_note_on_process_i_o)). If `prompt()` is invoked outside of such an environment, then `prompt()` will return a rejected promise with an error. For convenience, the error will have a `isTtyError` property to programmatically indicate the cause.
-
-
-## User Interfaces and layouts
-
-Along with the prompts, Inquirer offers some basic text UI.
-
-#### Bottom Bar - `inquirer.ui.BottomBar`
-
-This UI present a fixed text at the bottom of a free text zone. This is useful to keep a message to the bottom of the screen while outputting command outputs on the higher section.
-
-```javascript
-var ui = new inquirer.ui.BottomBar();
-
-// pipe a Stream to the log zone
-outputStream.pipe(ui.log);
-
-// Or simply write output
-ui.log.write('something just happened.');
-ui.log.write('Almost over, standby!');
-
-// During processing, update the bottom bar content to display a loader
-// or output a progress bar, etc
-ui.updateBottomBar('new bottom bar content');
-```
-
-<a name="reactive"></a>
-
-## Reactive interface
-
-Internally, Inquirer uses the [JS reactive extension](https://github.com/ReactiveX/rxjs) to handle events and async flows.
-
-This mean you can take advantage of this feature to provide more advanced flows. For example, you can dynamically add questions to be asked:
-
-```js
-var prompts = new Rx.Subject();
-inquirer.prompt(prompts);
-
-// At some point in the future, push new questions
-prompts.next({
-  /* question... */
-});
-prompts.next({
-  /* question... */
-});
-
-// When you're done
-prompts.complete();
-```
-
-And using the return value `process` property, you can access more fine grained callbacks:
-
-```js
-inquirer.prompt(prompts).ui.process.subscribe(onEachAnswer, onError, onComplete);
-```
-
-## Support (OS Terminals)
-
-<a name="support"></a>
-
-You should expect mostly good support for the CLI below. This does not mean we won't
-look at issues found on other command line - feel free to report any!
-
-- **Mac OS**:
-  - Terminal.app
-  - iTerm
-- **Windows ([Known issues](#issues))**:
-  - [ConEmu](https://conemu.github.io/)
-  - cmd.exe
-  - Powershell
-  - Cygwin
-- **Linux (Ubuntu, openSUSE, Arch Linux, etc)**:
-  - gnome-terminal (Terminal GNOME)
-  - konsole
-
-## Know issues
-
-<a name="issues"></a>
-
-Running Inquirer together with network streams in Windows platform inside some terminals can result in process hang.
-Workaround: run inside another terminal.
-Please refer to the https://github.com/nodejs/node/issues/21771
-
-## News on the march (Release notes)
-
-<a name="news"></a>
-
-Please refer to the [GitHub releases section for the changelog](https://github.com/SBoudrias/Inquirer.js/releases)
-
-## Contributing
-
-<a name="contributing"></a>
-
-**Unit test**
-Unit test are written in [Mocha](https://mochajs.org/). Please add a unit test for every new feature or bug fix. `npm test` to run the test suite.
-
-**Documentation**
-Add documentation for every API change. Feel free to send typo fixes and better docs!
-
-We're looking to offer good support for multiple prompts and environments. If you want to
-help, we'd like to keep a list of testers for each terminal/OS so we can contact you and
-get feedback before release. Let us know if you want to be added to the list (just tweet
-to [@vaxilart](https://twitter.com/Vaxilart)) or just add your name to [the wiki](https://github.com/SBoudrias/Inquirer.js/wiki/Testers)
-
-## License
-
-<a name="license"></a>
-
-Copyright (c) 2016 Simon Boudrias (twitter: [@vaxilart](https://twitter.com/Vaxilart))
-Licensed under the MIT license.
-
-## Plugins
-
-<a name="plugins"></a>
-
-### Prompts
-
-[**autocomplete**](https://github.com/mokkabonna/inquirer-autocomplete-prompt)<br>
-Presents a list of options as the user types, compatible with other packages such as fuzzy (for search)<br>
-<br>
-![autocomplete prompt](https://github.com/mokkabonna/inquirer-autocomplete-prompt/raw/master/inquirer.gif)
-
-[**checkbox-plus**](https://github.com/faressoft/inquirer-checkbox-plus-prompt)<br>
-Checkbox list with autocomplete and other additions<br>
-<br>
-![checkbox-plus](https://github.com/faressoft/inquirer-checkbox-plus-prompt/raw/master/demo.gif)
-
-[**datetime**](https://github.com/DerekTBrown/inquirer-datepicker-prompt)<br>
-Customizable date/time selector using both number pad and arrow keys<br>
-<br>
-![Datetime Prompt](https://github.com/DerekTBrown/inquirer-datepicker-prompt/raw/master/example/datetime-prompt.png)
-
-[**inquirer-select-line**](https://github.com/adam-golab/inquirer-select-line)<br>
-Prompt for selecting index in array where add new element<br>
-<br>
-![inquirer-select-line gif](https://media.giphy.com/media/xUA7b1MxpngddUvdHW/giphy.gif)
-
-[**command**](https://github.com/sullof/inquirer-command-prompt)<br>
-<br>
-Simple prompt with command history and dynamic autocomplete
-
-[**inquirer-fuzzy-path**](https://github.com/adelsz/inquirer-fuzzy-path)<br>
-Prompt for fuzzy file/directory selection.<br>
-<br>
-![inquirer-fuzzy-path](https://raw.githubusercontent.com/adelsz/inquirer-fuzzy-path/master/recording.gif)
-
-[**inquirer-emoji**](https://github.com/tannerntannern/inquirer-emoji)<br>
-Prompt for inputting emojis.<br>
-<br>
-![inquirer-emoji](https://github.com/tannerntannern/inquirer-emoji/raw/master/demo.gif)
-
-[**inquirer-chalk-pipe**](https://github.com/LitoMore/inquirer-chalk-pipe)<br>
-Prompt for input chalk-pipe style strings<br>
-<br>
-![inquirer-chalk-pipe](https://github.com/LitoMore/inquirer-chalk-pipe/raw/master/screenshot.gif)
-
-[**inquirer-search-checkbox**](https://github.com/clinyong/inquirer-search-checkbox)<br>
-Searchable Inquirer checkbox<br>
-
-[**inquirer-prompt-suggest**](https://github.com/olistic/inquirer-prompt-suggest)<br>
-Inquirer prompt for your less creative users.
-
-![inquirer-prompt-suggest](https://user-images.githubusercontent.com/5600126/40391192-d4f3d6d0-5ded-11e8-932f-4b75b642c09e.gif)
-
-[**inquirer-s3**](https://github.com/HQarroum/inquirer-s3)<br>
-An S3 object selector for Inquirer.
-
-![inquirer-s3](https://github.com/HQarroum/inquirer-s3/raw/master/docs/inquirer-screenshot.png)
-
-[**inquirer-autosubmit-prompt**](https://github.com/yaodingyd/inquirer-autosubmit-prompt)<br>
-Auto submit based on your current input, saving one extra enter
-
-[**inquirer-file-tree-selection-prompt**](https://github.com/anc95/inquirer-file-tree-selection)<br>
-Inquirer prompt for to select a file or directory in file tree
-
-![inquirer-file-tree-selection-prompt](https://github.com/anc95/inquirer-file-tree-selection/blob/master/example/screenshot.gif)
-
-[**inquirer-table-prompt**](https://github.com/eduardoboucas/inquirer-table-prompt)<br>
-A table-like prompt for Inquirer.
-
-![inquirer-table-prompt](https://raw.githubusercontent.com/eduardoboucas/inquirer-table-prompt/master/screen-capture.gif)
diff --git a/node_modules/inquirer/lib/inquirer.js b/node_modules/inquirer/lib/inquirer.js
deleted file mode 100644
index aa8b2a1..0000000
--- a/node_modules/inquirer/lib/inquirer.js
+++ /dev/null
@@ -1,93 +0,0 @@
-'use strict';
-/**
- * Inquirer.js
- * A collection of common interactive command line user interfaces.
- */
-
-var inquirer = module.exports;
-
-/**
- * Client interfaces
- */
-
-inquirer.prompts = {};
-
-inquirer.Separator = require('./objects/separator');
-
-inquirer.ui = {
-  BottomBar: require('./ui/bottom-bar'),
-  Prompt: require('./ui/prompt')
-};
-
-/**
- * Create a new self-contained prompt module.
- */
-inquirer.createPromptModule = function(opt) {
-  var promptModule = function(questions, answers) {
-    var ui;
-    try {
-      ui = new inquirer.ui.Prompt(promptModule.prompts, opt);
-    } catch (error) {
-      return Promise.reject(error);
-    }
-    var promise = ui.run(questions, answers);
-
-    // Monkey patch the UI on the promise object so
-    // that it remains publicly accessible.
-    promise.ui = ui;
-
-    return promise;
-  };
-
-  promptModule.prompts = {};
-
-  /**
-   * Register a prompt type
-   * @param {String} name     Prompt type name
-   * @param {Function} prompt Prompt constructor
-   * @return {inquirer}
-   */
-
-  promptModule.registerPrompt = function(name, prompt) {
-    promptModule.prompts[name] = prompt;
-    return this;
-  };
-
-  /**
-   * Register the defaults provider prompts
-   */
-
-  promptModule.restoreDefaultPrompts = function() {
-    this.registerPrompt('list', require('./prompts/list'));
-    this.registerPrompt('input', require('./prompts/input'));
-    this.registerPrompt('number', require('./prompts/number'));
-    this.registerPrompt('confirm', require('./prompts/confirm'));
-    this.registerPrompt('rawlist', require('./prompts/rawlist'));
-    this.registerPrompt('expand', require('./prompts/expand'));
-    this.registerPrompt('checkbox', require('./prompts/checkbox'));
-    this.registerPrompt('password', require('./prompts/password'));
-    this.registerPrompt('editor', require('./prompts/editor'));
-  };
-
-  promptModule.restoreDefaultPrompts();
-
-  return promptModule;
-};
-
-/**
- * Public CLI helper interface
- * @param  {Array|Object|Rx.Observable} questions - Questions settings array
- * @param  {Function} cb - Callback being passed the user answers
- * @return {inquirer.ui.Prompt}
- */
-
-inquirer.prompt = inquirer.createPromptModule();
-
-// Expose helper functions on the top level for easiest usage by common users
-inquirer.registerPrompt = function(name, prompt) {
-  inquirer.prompt.registerPrompt(name, prompt);
-};
-
-inquirer.restoreDefaultPrompts = function() {
-  inquirer.prompt.restoreDefaultPrompts();
-};
diff --git a/node_modules/inquirer/lib/objects/choice.js b/node_modules/inquirer/lib/objects/choice.js
deleted file mode 100644
index 1bc1acd..0000000
--- a/node_modules/inquirer/lib/objects/choice.js
+++ /dev/null
@@ -1,38 +0,0 @@
-'use strict';
-var _ = require('lodash');
-
-/**
- * Choice object
- * Normalize input as choice object
- * @constructor
- * @param {Number|String|Object} val  Choice value. If an object is passed, it should contains
- *                                    at least one of `value` or `name` property
- */
-
-module.exports = class Choice {
-  constructor(val, answers) {
-    // Don't process Choice and Separator object
-    if (val instanceof Choice || val.type === 'separator') {
-      // eslint-disable-next-line no-constructor-return
-      return val;
-    }
-
-    if (_.isString(val) || _.isNumber(val)) {
-      this.name = String(val);
-      this.value = val;
-      this.short = String(val);
-    } else {
-      _.extend(this, val, {
-        name: val.name || val.value,
-        value: 'value' in val ? val.value : val.name,
-        short: val.short || val.name || val.value
-      });
-    }
-
-    if (_.isFunction(val.disabled)) {
-      this.disabled = val.disabled(answers);
-    } else {
-      this.disabled = val.disabled;
-    }
-  }
-};
diff --git a/node_modules/inquirer/lib/objects/choices.js b/node_modules/inquirer/lib/objects/choices.js
deleted file mode 100644
index e3c16d0..0000000
--- a/node_modules/inquirer/lib/objects/choices.js
+++ /dev/null
@@ -1,118 +0,0 @@
-'use strict';
-var assert = require('assert');
-var _ = require('lodash');
-var Separator = require('./separator');
-var Choice = require('./choice');
-
-/**
- * Choices collection
- * Collection of multiple `choice` object
- * @constructor
- * @param {Array} choices  All `choice` to keep in the collection
- */
-
-module.exports = class Choices {
-  constructor(choices, answers) {
-    this.choices = choices.map(val => {
-      if (val.type === 'separator') {
-        if (!(val instanceof Separator)) {
-          val = new Separator(val.line);
-        }
-
-        return val;
-      }
-
-      return new Choice(val, answers);
-    });
-
-    this.realChoices = this.choices
-      .filter(Separator.exclude)
-      .filter(item => !item.disabled);
-
-    Object.defineProperty(this, 'length', {
-      get() {
-        return this.choices.length;
-      },
-      set(val) {
-        this.choices.length = val;
-      }
-    });
-
-    Object.defineProperty(this, 'realLength', {
-      get() {
-        return this.realChoices.length;
-      },
-      set() {
-        throw new Error('Cannot set `realLength` of a Choices collection');
-      }
-    });
-  }
-
-  /**
-   * Get a valid choice from the collection
-   * @param  {Number} selector  The selected choice index
-   * @return {Choice|Undefined} Return the matched choice or undefined
-   */
-
-  getChoice(selector) {
-    assert(_.isNumber(selector));
-    return this.realChoices[selector];
-  }
-
-  /**
-   * Get a raw element from the collection
-   * @param  {Number} selector  The selected index value
-   * @return {Choice|Undefined} Return the matched choice or undefined
-   */
-
-  get(selector) {
-    assert(_.isNumber(selector));
-    return this.choices[selector];
-  }
-
-  /**
-   * Match the valid choices against a where clause
-   * @param  {Object} whereClause Lodash `where` clause
-   * @return {Array}              Matching choices or empty array
-   */
-
-  where(whereClause) {
-    return _.filter(this.realChoices, whereClause);
-  }
-
-  /**
-   * Pluck a particular key from the choices
-   * @param  {String} propertyName Property name to select
-   * @return {Array}               Selected properties
-   */
-
-  pluck(propertyName) {
-    return _.map(this.realChoices, propertyName);
-  }
-
-  // Expose usual Array methods
-  indexOf() {
-    return this.choices.indexOf.apply(this.choices, arguments);
-  }
-
-  forEach() {
-    return this.choices.forEach.apply(this.choices, arguments);
-  }
-
-  filter() {
-    return this.choices.filter.apply(this.choices, arguments);
-  }
-
-  find(func) {
-    return _.find(this.choices, func);
-  }
-
-  push() {
-    var objs = _.map(arguments, val => new Choice(val));
-    this.choices.push.apply(this.choices, objs);
-    this.realChoices = this.choices
-      .filter(Separator.exclude)
-      .filter(item => !item.disabled);
-    return this.choices;
-  }
-};
diff --git a/node_modules/inquirer/lib/objects/separator.js b/node_modules/inquirer/lib/objects/separator.js
deleted file mode 100644
index e4beb7a..0000000
--- a/node_modules/inquirer/lib/objects/separator.js
+++ /dev/null
@@ -1,37 +0,0 @@
-'use strict';
-var chalk = require('chalk');
-var figures = require('figures');
-
-/**
- * Separator object
- * Used to space/separate choices group
- * @constructor
- * @param {String} line   Separation line content (facultative)
- */
-
-class Separator {
-  constructor(line) {
-    this.type = 'separator';
-    this.line = chalk.dim(line || new Array(15).join(figures.line));
-  }
-
-  /**
-   * Stringify separator
-   * @return {String} the separator display string
-   */
-  toString() {
-    return this.line;
-  }
-}
-
-/**
- * Helper function returning false if object is a separator
- * @param  {Object} obj object to test against
- * @return {Boolean}    `false` if object is a separator
- */
-
-Separator.exclude = function(obj) {
-  return obj.type !== 'separator';
-};
-
-module.exports = Separator;
diff --git a/node_modules/inquirer/lib/prompts/base.js b/node_modules/inquirer/lib/prompts/base.js
deleted file mode 100644
index 6a7b19d..0000000
--- a/node_modules/inquirer/lib/prompts/base.js
+++ /dev/null
@@ -1,148 +0,0 @@
-'use strict';
-/**
- * Base prompt implementation
- * Should be extended by prompt types.
- */
-
-var _ = require('lodash');
-var chalk = require('chalk');
-var runAsync = require('run-async');
-var { filter, flatMap, share, take, takeUntil } = require('rxjs/operators');
-var Choices = require('../objects/choices');
-var ScreenManager = require('../utils/screen-manager');
-
-class Prompt {
-  constructor(question, rl, answers) {
-    // Setup instance defaults property
-    _.assign(this, {
-      answers: answers,
-      status: 'pending'
-    });
-
-    // Set defaults prompt options
-    this.opt = _.defaults(_.clone(question), {
-      validate: () => true,
-      filter: val => val,
-      when: () => true,
-      suffix: '',
-      prefix: chalk.green('?')
-    });
-
-    // Make sure name is present
-    if (!this.opt.name) {
-      this.throwParamError('name');
-    }
-
-    // Set default message if no message defined
-    if (!this.opt.message) {
-      this.opt.message = this.opt.name + ':';
-    }
-
-    // Normalize choices
-    if (Array.isArray(this.opt.choices)) {
-      this.opt.choices = new Choices(this.opt.choices, answers);
-    }
-
-    this.rl = rl;
-    this.screen = new ScreenManager(this.rl);
-  }
-
-  /**
-   * Start the Inquiry session and manage output value filtering
-   * @return {Promise}
-   */
-
-  run() {
-    return new Promise(resolve => {
-      this._run(value => resolve(value));
-    });
-  }
-
-  // Default noop (this one should be overwritten in prompts)
-  _run(cb) {
-    cb();
-  }
-
-  /**
-   * Throw an error telling a required parameter is missing
-   * @param  {String} name Name of the missing param
-   * @return {Throw Error}
-   */
-
-  throwParamError(name) {
-    throw new Error('You must provide a `' + name + '` parameter');
-  }
-
-  /**
-   * Called when the UI closes. Override to do any specific cleanup necessary
-   */
-  close() {
-    this.screen.releaseCursor();
-  }
-
-  /**
-   * Run the provided validation method each time a submit event occur.
-   * @param  {Rx.Observable} submit - submit event flow
-   * @return {Object}        Object containing two observables: `success` and `error`
-   */
-  handleSubmitEvents(submit) {
-    var self = this;
-    var validate = runAsync(this.opt.validate);
-    var asyncFilter = runAsync(this.opt.filter);
-    var validation = submit.pipe(
-      flatMap(value =>
-        asyncFilter(value, self.answers).then(
-          filteredValue =>
-            validate(filteredValue, self.answers).then(
-              isValid => ({ isValid: isValid, value: filteredValue }),
-              err => ({ isValid: err, value: filteredValue })
-            ),
-          err => ({ isValid: err })
-        )
-      ),
-      share()
-    );
-
-    var success = validation.pipe(
-      filter(state => state.isValid === true),
-      take(1)
-    );
-    var error = validation.pipe(
-      filter(state => state.isValid !== true),
-      takeUntil(success)
-    );
-
-    return {
-      success: success,
-      error: error
-    };
-  }
-
-  /**
-   * Generate the prompt question string
-   * @return {String} prompt question string
-   */
-
-  getQuestion() {
-    var message =
-      this.opt.prefix +
-      ' ' +
-      chalk.bold(this.opt.message) +
-      this.opt.suffix +
-      chalk.reset(' ');
-
-    // Append the default if available, and if question isn't answered
-    if (this.opt.default != null && this.status !== 'answered') {
-      // If default password is supplied, hide it
-      if (this.opt.type === 'password') {
-        message += chalk.italic.dim('[hidden] ');
-      } else {
-        message += chalk.dim('(' + this.opt.default + ') ');
-      }
-    }
-
-    return message;
-  }
-}
-
-module.exports = Prompt;
diff --git a/node_modules/inquirer/lib/prompts/checkbox.js b/node_modules/inquirer/lib/prompts/checkbox.js
deleted file mode 100644
index 1fee1d2..0000000
--- a/node_modules/inquirer/lib/prompts/checkbox.js
+++ /dev/null
@@ -1,254 +0,0 @@
-'use strict';
-/**
- * `list` type prompt
- */
-
-var _ = require('lodash');
-var chalk = require('chalk');
-var cliCursor = require('cli-cursor');
-var figures = require('figures');
-var { map, takeUntil } = require('rxjs/operators');
-var Base = require('./base');
-var observe = require('../utils/events');
-var Paginator = require('../utils/paginator');
-
-class CheckboxPrompt extends Base {
-  constructor(questions, rl, answers) {
-    super(questions, rl, answers);
-
-    if (!this.opt.choices) {
-      this.throwParamError('choices');
-    }
-
-    if (_.isArray(this.opt.default)) {
-      this.opt.choices.forEach(function(choice) {
-        if (this.opt.default.indexOf(choice.value) >= 0) {
-          choice.checked = true;
-        }
-      }, this);
-    }
-
-    this.pointer = 0;
-
-    // Make sure no default is set (so it won't be printed)
-    this.opt.default = null;
-
-    this.paginator = new Paginator(this.screen);
-  }
-
-  /**
-   * Start the Inquiry session
-   * @param  {Function} cb      Callback when prompt is done
-   * @return {this}
-   */
-
-  _run(cb) {
-    this.done = cb;
-
-    var events = observe(this.rl);
-
-    var validation = this.handleSubmitEvents(
-      events.line.pipe(map(this.getCurrentValue.bind(this)))
-    );
-    validation.success.forEach(this.onEnd.bind(this));
-    validation.error.forEach(this.onError.bind(this));
-
-    events.normalizedUpKey
-      .pipe(takeUntil(validation.success))
-      .forEach(this.onUpKey.bind(this));
-    events.normalizedDownKey
-      .pipe(takeUntil(validation.success))
-      .forEach(this.onDownKey.bind(this));
-    events.numberKey
-      .pipe(takeUntil(validation.success))
-      .forEach(this.onNumberKey.bind(this));
-    events.spaceKey
-      .pipe(takeUntil(validation.success))
-      .forEach(this.onSpaceKey.bind(this));
-    events.aKey.pipe(takeUntil(validation.success)).forEach(this.onAllKey.bind(this));
-    events.iKey.pipe(takeUntil(validation.success)).forEach(this.onInverseKey.bind(this));
-
-    // Init the prompt
-    cliCursor.hide();
-    this.render();
-    this.firstRender = false;
-
-    return this;
-  }
-
-  /**
-   * Render the prompt to screen
-   * @return {CheckboxPrompt} self
-   */
-
-  render(error) {
-    // Render question
-    var message = this.getQuestion();
-    var bottomContent = '';
-
-    if (!this.spaceKeyPressed) {
-      message +=
-        '(Press ' +
-        chalk.cyan.bold('<space>') +
-        ' to select, ' +
-        chalk.cyan.bold('<a>') +
-        ' to toggle all, ' +
-        chalk.cyan.bold('<i>') +
-        ' to invert selection)';
-    }
-
-    // Render choices or answer depending on the state
-    if (this.status === 'answered') {
-      message += chalk.cyan(this.selection.join(', '));
-    } else {
-      var choicesStr = renderChoices(this.opt.choices, this.pointer);
-      var indexPosition = this.opt.choices.indexOf(
-        this.opt.choices.getChoice(this.pointer)
-      );
-      message +=
-        '\n' + this.paginator.paginate(choicesStr, indexPosition, this.opt.pageSize);
-    }
-
-    if (error) {
-      bottomContent = chalk.red('>> ') + error;
-    }
-
-    this.screen.render(message, bottomContent);
-  }
-
-  /**
-   * When user press `enter` key
-   */
-
-  onEnd(state) {
-    this.status = 'answered';
-    this.spaceKeyPressed = true;
-    // Rerender prompt (and clean subline error)
-    this.render();
-
-    this.screen.done();
-    cliCursor.show();
-    this.done(state.value);
-  }
-
-  onError(state) {
-    this.render(state.isValid);
-  }
-
-  getCurrentValue() {
-    var choices = this.opt.choices.filter(function(choice) {
-      return Boolean(choice.checked) && !choice.disabled;
-    });
-
-    this.selection = _.map(choices, 'short');
-    return _.map(choices, 'value');
-  }
-
-  onUpKey() {
-    var len = this.opt.choices.realLength;
-    this.pointer = this.pointer > 0 ? this.pointer - 1 : len - 1;
-    this.render();
-  }
-
-  onDownKey() {
-    var len = this.opt.choices.realLength;
-    this.pointer = this.pointer < len - 1 ? this.pointer + 1 : 0;
-    this.render();
-  }
-
-  onNumberKey(input) {
-    if (input <= this.opt.choices.realLength) {
-      this.pointer = input - 1;
-      this.toggleChoice(this.pointer);
-    }
-
-    this.render();
-  }
-
-  onSpaceKey() {
-    this.spaceKeyPressed = true;
-    this.toggleChoice(this.pointer);
-    this.render();
-  }
-
-  onAllKey() {
-    var shouldBeChecked = Boolean(
-      this.opt.choices.find(function(choice) {
-        return choice.type !== 'separator' && !choice.checked;
-      })
-    );
-
-    this.opt.choices.forEach(function(choice) {
-      if (choice.type !== 'separator') {
-        choice.checked = shouldBeChecked;
-      }
-    });
-
-    this.render();
-  }
-
-  onInverseKey() {
-    this.opt.choices.forEach(function(choice) {
-      if (choice.type !== 'separator') {
-        choice.checked = !choice.checked;
-      }
-    });
-
-    this.render();
-  }
-
-  toggleChoice(index) {
-    var item = this.opt.choices.getChoice(index);
-    if (item !== undefined) {
-      this.opt.choices.getChoice(index).checked = !item.checked;
-    }
-  }
-}
-
-/**
- * Function for rendering checkbox choices
- * @param  {Number} pointer Position of the pointer
- * @return {String}         Rendered content
- */
-
-function renderChoices(choices, pointer) {
-  var output = '';
-  var separatorOffset = 0;
-
-  choices.forEach(function(choice, i) {
-    if (choice.type === 'separator') {
-      separatorOffset++;
-      output += ' ' + choice + '\n';
-      return;
-    }
-
-    if (choice.disabled) {
-      separatorOffset++;
-      output += ' - ' + choice.name;
-      output += ' (' + (_.isString(choice.disabled) ? choice.disabled : 'Disabled') + ')';
-    } else {
-      var line = getCheckbox(choice.checked) + ' ' + choice.name;
-      if (i - separatorOffset === pointer) {
-        output += chalk.cyan(figures.pointer + line);
-      } else {
-        output += ' ' + line;
-      }
-    }
-
-    output += '\n';
-  });
-
-  return output.replace(/\n$/, '');
-}
-
-/**
- * Get the checkbox
- * @param  {Boolean} checked - add a X or not to the checkbox
- * @return {String} Composited checkbox string
- */
-
-function getCheckbox(checked) {
-  return checked ? chalk.green(figures.radioOn) : figures.radioOff;
-}
-
-module.exports = CheckboxPrompt;
diff --git a/node_modules/inquirer/lib/prompts/confirm.js b/node_modules/inquirer/lib/prompts/confirm.js
deleted file mode 100644
index 1ede6b8..0000000
--- a/node_modules/inquirer/lib/prompts/confirm.js
+++ /dev/null
@@ -1,99 +0,0 @@
-'use strict';
-/**
- * `confirm` type prompt
- */
-
-var _ = require('lodash');
-var chalk = require('chalk');
-var { take, takeUntil } = require('rxjs/operators');
-var Base = require('./base');
-var observe = require('../utils/events');
-
-class ConfirmPrompt extends Base {
-  constructor(questions, rl, answers) {
-    super(questions, rl, answers);
-
-    var rawDefault = true;
-
-    _.extend(this.opt, {
-      filter: function(input) {
-        var value = rawDefault;
-        if (input != null && input !== '') {
-          value = /^y(es)?/i.test(input);
-        }
-
-        return value;
-      }
-    });
-
-    if (_.isBoolean(this.opt.default)) {
-      rawDefault = this.opt.default;
-    }
-
-    this.opt.default = rawDefault ? 'Y/n' : 'y/N';
-  }
-
-  /**
-   * Start the Inquiry session
-   * @param  {Function} cb   Callback when prompt is done
-   * @return {this}
-   */
-
-  _run(cb) {
-    this.done = cb;
-
-    // Once user confirm (enter key)
-    var events = observe(this.rl);
-    events.keypress.pipe(takeUntil(events.line)).forEach(this.onKeypress.bind(this));
-
-    events.line.pipe(take(1)).forEach(this.onEnd.bind(this));
-
-    // Init
-    this.render();
-
-    return this;
-  }
-
-  /**
-   * Render the prompt to screen
-   * @return {ConfirmPrompt} self
-   */
-
-  render(answer) {
-    var message = this.getQuestion();
-
-    if (typeof answer === 'boolean') {
-      message += chalk.cyan(answer ? 'Yes' : 'No');
-    } else {
-      message += this.rl.line;
-    }
-
-    this.screen.render(message);
-
-    return this;
-  }
-
-  /**
-   * When user press `enter` key
-   */
-
-  onEnd(input) {
-    this.status = 'answered';
-
-    var output = this.opt.filter(input);
-    this.render(output);
-
-    this.screen.done();
-    this.done(output);
-  }
-
-  /**
-   * When user press a key
-   */
-
-  onKeypress() {
-    this.render();
-  }
-}
-
-module.exports = ConfirmPrompt;
diff --git a/node_modules/inquirer/lib/prompts/editor.js b/node_modules/inquirer/lib/prompts/editor.js
deleted file mode 100644
index 121cda8..0000000
--- a/node_modules/inquirer/lib/prompts/editor.js
+++ /dev/null
@@ -1,100 +0,0 @@
-'use strict';
-/**
- * `editor` type prompt
- */
-
-var chalk = require('chalk');
-var editAsync = require('external-editor').editAsync;
-var Base = require('./base');
-var observe = require('../utils/events');
-var { Subject } = require('rxjs');
-
-class EditorPrompt extends Base {
-  /**
-   * Start the Inquiry session
-   * @param  {Function} cb      Callback when prompt is done
-   * @return {this}
-   */
-
-  _run(cb) {
-    this.done = cb;
-
-    this.editorResult = new Subject();
-
-    // Open Editor on "line" (Enter Key)
-    var events = observe(this.rl);
-    this.lineSubscription = events.line.subscribe(this.startExternalEditor.bind(this));
-
-    // Trigger Validation when editor closes
-    var validation = this.handleSubmitEvents(this.editorResult);
-    validation.success.forEach(this.onEnd.bind(this));
-    validation.error.forEach(this.onError.bind(this));
-
-    // Prevents default from being printed on screen (can look weird with multiple lines)
-    this.currentText = this.opt.default;
-    this.opt.default = null;
-
-    // Init
-    this.render();
-
-    return this;
-  }
-
-  /**
-   * Render the prompt to screen
-   * @return {EditorPrompt} self
-   */
-
-  render(error) {
-    var bottomContent = '';
-    var message = this.getQuestion();
-
-    if (this.status === 'answered') {
-      message += chalk.dim('Received');
-    } else {
-      message += chalk.dim('Press <enter> to launch your preferred editor.');
-    }
-
-    if (error) {
-      bottomContent = chalk.red('>> ') + error;
-    }
-
-    this.screen.render(message, bottomContent);
-  }
-
-  /**
-   * Launch $EDITOR on user press enter
-   */
-
-  startExternalEditor() {
-    // Pause Readline to prevent stdin and stdout from being modified while the editor is showing
-    this.rl.pause();
-    editAsync(this.currentText, this.endExternalEditor.bind(this));
-  }
-
-  endExternalEditor(error, result) {
-    this.rl.resume();
-    if (error) {
-      this.editorResult.error(error);
-    } else {
-      this.editorResult.next(result);
-    }
-  }
-
-  onEnd(state) {
-    this.editorResult.unsubscribe();
-    this.lineSubscription.unsubscribe();
-    this.answer = state.value;
-    this.status = 'answered';
-    // Re-render prompt
-    this.render();
-    this.screen.done();
-    this.done(this.answer);
-  }
-
-  onError(state) {
-    this.render(state.isValid);
-  }
-}
-
-module.exports = EditorPrompt;
diff --git a/node_modules/inquirer/lib/prompts/expand.js b/node_modules/inquirer/lib/prompts/expand.js
deleted file mode 100644
index 5534a39..0000000
--- a/node_modules/inquirer/lib/prompts/expand.js
+++ /dev/null
@@ -1,276 +0,0 @@
-'use strict';
-/**
- * `rawlist` type prompt
- */
-
-var _ = require('lodash');
-var chalk = require('chalk');
-var { map, takeUntil } = require('rxjs/operators');
-var Base = require('./base');
-var Separator = require('../objects/separator');
-var observe = require('../utils/events');
-var Paginator = require('../utils/paginator');
-
-class ExpandPrompt extends Base {
-  constructor(questions, rl, answers) {
-    super(questions, rl, answers);
-
-    if (!this.opt.choices) {
-      this.throwParamError('choices');
-    }
-
-    this.validateChoices(this.opt.choices);
-
-    // Add the default `help` (/expand) option
-    this.opt.choices.push({
-      key: 'h',
-      name: 'Help, list all options',
-      value: 'help'
-    });
-
-    this.opt.validate = choice => {
-      if (choice == null) {
-        return 'Please enter a valid command';
-      }
-
-      return choice !== 'help';
-    };
-
-    // Setup the default string (capitalize the default key)
-    this.opt.default = this.generateChoicesString(this.opt.choices, this.opt.default);
-
-    this.paginator = new Paginator(this.screen);
-  }
-
-  /**
-   * Start the Inquiry session
-   * @param  {Function} cb      Callback when prompt is done
-   * @return {this}
-   */
-
-  _run(cb) {
-    this.done = cb;
-
-    // Save user answer and update prompt to show selected option.
-    var events = observe(this.rl);
-    var validation = this.handleSubmitEvents(
-      events.line.pipe(map(this.getCurrentValue.bind(this)))
-    );
-    validation.success.forEach(this.onSubmit.bind(this));
-    validation.error.forEach(this.onError.bind(this));
-    this.keypressObs = events.keypress
-      .pipe(takeUntil(validation.success))
-      .forEach(this.onKeypress.bind(this));
-
-    // Init the prompt
-    this.render();
-
-    return this;
-  }
-
-  /**
-   * Render the prompt to screen
-   * @return {ExpandPrompt} self
-   */
-
-  render(error, hint) {
-    var message = this.getQuestion();
-    var bottomContent = '';
-
-    if (this.status === 'answered') {
-      message += chalk.cyan(this.answer);
-    } else if (this.status === 'expanded') {
-      var choicesStr = renderChoices(this.opt.choices, this.selectedKey);
-      message += this.paginator.paginate(choicesStr, this.selectedKey, this.opt.pageSize);
-      message += '\n  Answer: ';
-    }
-
-    message += this.rl.line;
-
-    if (error) {
-      bottomContent = chalk.red('>> ') + error;
-    }
-
-    if (hint) {
-      bottomContent = chalk.cyan('>> ') + hint;
-    }
-
-    this.screen.render(message, bottomContent);
-  }
-
-  getCurrentValue(input) {
-    if (!input) {
-      input = this.rawDefault;
-    }
-
-    var selected = this.opt.choices.where({ key: input.toLowerCase().trim() })[0];
-    if (!selected) {
-      return null;
-    }
-
-    return selected.value;
-  }
-
-  /**
-   * Generate the prompt choices string
-   * @return {String}  Choices string
-   */
-
-  getChoices() {
-    var output = '';
-
-    this.opt.choices.forEach(choice => {
-      output += '\n  ';
-
-      if (choice.type === 'separator') {
-        output += ' ' + choice;
-        return;
-      }
-
-      var choiceStr = choice.key + ') ' + choice.name;
-      if (this.selectedKey === choice.key) {
-        choiceStr = chalk.cyan(choiceStr);
-      }
-
-      output += choiceStr;
-    });
-
-    return output;
-  }
-
-  onError(state) {
-    if (state.value === 'help') {
-      this.selectedKey = '';
-      this.status = 'expanded';
-      this.render();
-      return;
-    }
-
-    this.render(state.isValid);
-  }
-
-  /**
-   * When user press `enter` key
-   */
-
-  onSubmit(state) {
-    this.status = 'answered';
-    var choice = this.opt.choices.where({ value: state.value })[0];
-    this.answer = choice.short || choice.name;
-
-    // Re-render prompt
-    this.render();
-    this.screen.done();
-    this.done(state.value);
-  }
-
-  /**
-   * When user press a key
-   */
-
-  onKeypress() {
-    this.selectedKey = this.rl.line.toLowerCase();
-    var selected = this.opt.choices.where({ key: this.selectedKey })[0];
-    if (this.status === 'expanded') {
-      this.render();
-    } else {
-      this.render(null, selected ? selected.name : null);
-    }
-  }
-
-  /**
-   * Validate the choices
-   * @param {Array} choices
-   */
-
-  validateChoices(choices) {
-    var formatError;
-    var errors = [];
-    var keymap = {};
-    choices.filter(Separator.exclude).forEach(choice => {
-      if (!choice.key || choice.key.length !== 1) {
-        formatError = true;
-      }
-
-      if (keymap[choice.key]) {
-        errors.push(choice.key);
-      }
-
-      keymap[choice.key] = true;
-      choice.key = String(choice.key).toLowerCase();
-    });
-
-    if (formatError) {
-      throw new Error(
-        'Format error: `key` param must be a single letter and is required.'
-      );
-    }
-
-    if (keymap.h) {
-      throw new Error(
-        'Reserved key error: `key` param cannot be `h` - this value is reserved.'
-      );
-    }
-
-    if (errors.length) {
-      throw new Error(
-        'Duplicate key error: `key` param must be unique. Duplicates: ' +
-          _.uniq(errors).join(', ')
-      );
-    }
-  }
-
-  /**
-   * Generate a string out of the choices keys
-   * @param  {Array}  choices
-   * @param  {Number|String} default - the choice index or name to capitalize
-   * @return {String} The rendered choices key string
-   */
-  generateChoicesString(choices, defaultChoice) {
-    var defIndex = choices.realLength - 1;
-    if (_.isNumber(defaultChoice) && this.opt.choices.getChoice(defaultChoice)) {
-      defIndex = defaultChoice;
-    } else if (_.isString(defaultChoice)) {
-      let index = _.findIndex(
-        choices.realChoices,
-        ({ value }) => value === defaultChoice
-      );
-      defIndex = index === -1 ? defIndex : index;
-    }
-
-    var defStr = this.opt.choices.pluck('key');
-    this.rawDefault = defStr[defIndex];
-    defStr[defIndex] = String(defStr[defIndex]).toUpperCase();
-    return defStr.join('');
-  }
-}
-
-/**
- * Function for rendering checkbox choices
- * @param  {String} pointer Selected key
- * @return {String}         Rendered content
- */
-
-function renderChoices(choices, pointer) {
-  var output = '';
-
-  choices.forEach(choice => {
-    output += '\n  ';
-
-    if (choice.type === 'separator') {
-      output += ' ' + choice;
-      return;
-    }
-
-    var choiceStr = choice.key + ') ' + choice.name;
-    if (pointer === choice.key) {
-      choiceStr = chalk.cyan(choiceStr);
-    }
-
-    output += choiceStr;
-  });
-
-  return output;
-}
-
-module.exports = ExpandPrompt;
diff --git a/node_modules/inquirer/lib/prompts/input.js b/node_modules/inquirer/lib/prompts/input.js
deleted file mode 100644
index 2b886ef..0000000
--- a/node_modules/inquirer/lib/prompts/input.js
+++ /dev/null
@@ -1,113 +0,0 @@
-'use strict';
-/**
- * `input` type prompt
- */
-
-var chalk = require('chalk');
-var { map, takeUntil } = require('rxjs/operators');
-var Base = require('./base');
-var observe = require('../utils/events');
-
-class InputPrompt extends Base {
-  /**
-   * Start the Inquiry session
-   * @param  {Function} cb      Callback when prompt is done
-   * @return {this}
-   */
-
-  _run(cb) {
-    this.done = cb;
-
-    // Once user confirm (enter key)
-    var events = observe(this.rl);
-    var submit = events.line.pipe(map(this.filterInput.bind(this)));
-
-    var validation = this.handleSubmitEvents(submit);
-    validation.success.forEach(this.onEnd.bind(this));
-    validation.error.forEach(this.onError.bind(this));
-
-    events.keypress
-      .pipe(takeUntil(validation.success))
-      .forEach(this.onKeypress.bind(this));
-
-    // Init
-    this.render();
-
-    return this;
-  }
-
-  /**
-   * Render the prompt to screen
-   * @return {InputPrompt} self
-   */
-
-  render(error) {
-    var bottomContent = '';
-    var appendContent = '';
-    var message = this.getQuestion();
-    var transformer = this.opt.transformer;
-    var isFinal = this.status === 'answered';
-
-    if (isFinal) {
-      appendContent = this.answer;
-    } else {
-      appendContent = this.rl.line;
-    }
-
-    if (transformer) {
-      message += transformer(appendContent, this.answers, { isFinal });
-    } else {
-      message += isFinal ? chalk.cyan(appendContent) : appendContent;
-    }
-
-    if (error) {
-      bottomContent = chalk.red('>> ') + error;
-    }
-
-    this.screen.render(message, bottomContent);
-  }
-
-  /**
-   * When user press `enter` key
-   */
-
-  filterInput(input) {
-    if (!input) {
-      return this.opt.default == null ? '' : this.opt.default;
-    }
-
-    return input;
-  }
-
-  onEnd(state) {
-    this.answer = state.value;
-    this.status = 'answered';
-
-    // Re-render prompt
-    this.render();
-
-    this.screen.done();
-    this.done(state.value);
-  }
-
-  onError({ value = '', isValid }) {
-    this.rl.line += value;
-    this.rl.cursor += value.length;
-    this.render(isValid);
-  }
-
-  /**
-   * When user press a key
-   */
-
-  onKeypress() {
-    // If user press a key, just clear the default value
-    if (this.opt.default) {
-      this.opt.default = undefined;
-    }
-
-    this.render();
-  }
-}
-
-module.exports = InputPrompt;
diff --git a/node_modules/inquirer/lib/prompts/list.js b/node_modules/inquirer/lib/prompts/list.js
deleted file mode 100644
index 8e3c5a2..0000000
--- a/node_modules/inquirer/lib/prompts/list.js
+++ /dev/null
@@ -1,184 +0,0 @@
-'use strict';
-/**
- * `list` type prompt
- */
-
-var _ = require('lodash');
-var chalk = require('chalk');
-var figures = require('figures');
-var cliCursor = require('cli-cursor');
-var runAsync = require('run-async');
-var { flatMap, map, take, takeUntil } = require('rxjs/operators');
-var Base = require('./base');
-var observe = require('../utils/events');
-var Paginator = require('../utils/paginator');
-
-class ListPrompt extends Base {
-  constructor(questions, rl, answers) {
-    super(questions, rl, answers);
-
-    if (!this.opt.choices) {
-      this.throwParamError('choices');
-    }
-
-    this.firstRender = true;
-    this.selected = 0;
-
-    var def = this.opt.default;
-
-    // If def is a Number, then use as index. Otherwise, check for value.
-    if (_.isNumber(def) && def >= 0 && def < this.opt.choices.realLength) {
-      this.selected = def;
-    } else if (!_.isNumber(def) && def != null) {
-      let index = _.findIndex(this.opt.choices.realChoices, ({ value }) => value === def);
-      this.selected = Math.max(index, 0);
-    }
-
-    // Make sure no default is set (so it won't be printed)
-    this.opt.default = null;
-
-    this.paginator = new Paginator(this.screen);
-  }
-
-  /**
-   * Start the Inquiry session
-   * @param  {Function} cb      Callback when prompt is done
-   * @return {this}
-   */
-
-  _run(cb) {
-    this.done = cb;
-
-    var self = this;
-
-    var events = observe(this.rl);
-    events.normalizedUpKey.pipe(takeUntil(events.line)).forEach(this.onUpKey.bind(this));
-    events.normalizedDownKey
-      .pipe(takeUntil(events.line))
-      .forEach(this.onDownKey.bind(this));
-    events.numberKey.pipe(takeUntil(events.line)).forEach(this.onNumberKey.bind(this));
-    events.line
-      .pipe(
-        take(1),
-        map(this.getCurrentValue.bind(this)),
-        flatMap(value => runAsync(self.opt.filter)(value).catch(err => err))
-      )
-      .forEach(this.onSubmit.bind(this));
-
-    // Init the prompt
-    cliCursor.hide();
-    this.render();
-
-    return this;
-  }
-
-  /**
-   * Render the prompt to screen
-   * @return {ListPrompt} self
-   */
-
-  render() {
-    // Render question
-    var message = this.getQuestion();
-
-    if (this.firstRender) {
-      message += chalk.dim('(Use arrow keys)');
-    }
-
-    // Render choices or answer depending on the state
-    if (this.status === 'answered') {
-      message += chalk.cyan(this.opt.choices.getChoice(this.selected).short);
-    } else {
-      var choicesStr = listRender(this.opt.choices, this.selected);
-      var indexPosition = this.opt.choices.indexOf(
-        this.opt.choices.getChoice(this.selected)
-      );
-      message +=
-        '\n' + this.paginator.paginate(choicesStr, indexPosition, this.opt.pageSize);
-    }
-
-    this.firstRender = false;
-
-    this.screen.render(message);
-  }
-
-  /**
-   * When user press `enter` key
-   */
-
-  onSubmit(value) {
-    this.status = 'answered';
-
-    // Rerender prompt
-    this.render();
-
-    this.screen.done();
-    cliCursor.show();
-    this.done(value);
-  }
-
-  getCurrentValue() {
-    return this.opt.choices.getChoice(this.selected).value;
-  }
-
-  /**
-   * When user press a key
-   */
-  onUpKey() {
-    var len = this.opt.choices.realLength;
-    this.selected = this.selected > 0 ? this.selected - 1 : len - 1;
-    this.render();
-  }
-
-  onDownKey() {
-    var len = this.opt.choices.realLength;
-    this.selected = this.selected < len - 1 ? this.selected + 1 : 0;
-    this.render();
-  }
-
-  onNumberKey(input) {
-    if (input <= this.opt.choices.realLength) {
-      this.selected = input - 1;
-    }
-
-    this.render();
-  }
-}
-
-/**
- * Function for rendering list choices
- * @param  {Number} pointer Position of the pointer
- * @return {String}         Rendered content
- */
-function listRender(choices, pointer) {
-  var output = '';
-  var separatorOffset = 0;
-
-  choices.forEach((choice, i) => {
-    if (choice.type === 'separator') {
-      separatorOffset++;
-      output += '  ' + choice + '\n';
-      return;
-    }
-
-    if (choice.disabled) {
-      separatorOffset++;
-      output += '  - ' + choice.name;
-      output += ' (' + (_.isString(choice.disabled) ? choice.disabled : 'Disabled') + ')';
-      output += '\n';
-      return;
-    }
-
-    var isSelected = i - separatorOffset === pointer;
-    var line = (isSelected ? figures.pointer + ' ' : '  ') + choice.name;
-    if (isSelected) {
-      line = chalk.cyan(line);
-    }
-
-    output += line + ' \n';
-  });
-
-  return output.replace(/\n$/, '');
-}
-
-module.exports = ListPrompt;
diff --git a/node_modules/inquirer/lib/prompts/number.js b/node_modules/inquirer/lib/prompts/number.js
deleted file mode 100644
index 6640751..0000000
--- a/node_modules/inquirer/lib/prompts/number.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-/**
- * `input` type prompt
- */
-
-var Input = require('./input');
-
-/**
- * Extention of the Input prompt specifically for use with number inputs.
- */
-
-class NumberPrompt extends Input {
-  filterInput(input) {
-    if (input && typeof input === 'string') {
-      input = input.trim();
-      // Match a number in the input
-      let numberMatch = input.match(/(^-?\d+|^\d+\.\d*|^\d*\.\d+)(e\d+)?$/);
-      // If a number is found, return that input.
-      if (numberMatch) {
-        return Number(numberMatch[0]);
-      }
-    }
-
-    // If the input was invalid return the default value.
-    return this.opt.default == null ? NaN : this.opt.default;
-  }
-}
-
-module.exports = NumberPrompt;
diff --git a/node_modules/inquirer/lib/prompts/password.js b/node_modules/inquirer/lib/prompts/password.js
deleted file mode 100644
index d5343b3..0000000
--- a/node_modules/inquirer/lib/prompts/password.js
+++ /dev/null
@@ -1,113 +0,0 @@
-'use strict';
-/**
- * `password` type prompt
- */
-
-var chalk = require('chalk');
-var { map, takeUntil } = require('rxjs/operators');
-var Base = require('./base');
-var observe = require('../utils/events');
-
-function mask(input, maskChar) {
-  input = String(input);
-  maskChar = typeof maskChar === 'string' ? maskChar : '*';
-  if (input.length === 0) {
-    return '';
-  }
-
-  return new Array(input.length + 1).join(maskChar);
-}
-
-class PasswordPrompt extends Base {
-  /**
-   * Start the Inquiry session
-   * @param  {Function} cb      Callback when prompt is done
-   * @return {this}
-   */
-
-  _run(cb) {
-    this.done = cb;
-
-    var events = observe(this.rl);
-
-    // Once user confirm (enter key)
-    var submit = events.line.pipe(map(this.filterInput.bind(this)));
-
-    var validation = this.handleSubmitEvents(submit);
-    validation.success.forEach(this.onEnd.bind(this));
-    validation.error.forEach(this.onError.bind(this));
-
-    events.keypress
-      .pipe(takeUntil(validation.success))
-      .forEach(this.onKeypress.bind(this));
-
-    // Init
-    this.render();
-
-    return this;
-  }
-
-  /**
-   * Render the prompt to screen
-   * @return {PasswordPrompt} self
-   */
-
-  render(error) {
-    var message = this.getQuestion();
-    var bottomContent = '';
-
-    if (this.status === 'answered') {
-      message += this.opt.mask
-        ? chalk.cyan(mask(this.answer, this.opt.mask))
-        : chalk.italic.dim('[hidden]');
-    } else if (this.opt.mask) {
-      message += mask(this.rl.line || '', this.opt.mask);
-    } else {
-      message += chalk.italic.dim('[input is hidden] ');
-    }
-
-    if (error) {
-      bottomContent = '\n' + chalk.red('>> ') + error;
-    }
-
-    this.screen.render(message, bottomContent);
-  }
-
-  /**
-   * When user press `enter` key
-   */
-
-  filterInput(input) {
-    if (!input) {
-      return this.opt.default == null ? '' : this.opt.default;
-    }
-
-    return input;
-  }
-
-  onEnd(state) {
-    this.status = 'answered';
-    this.answer = state.value;
-
-    // Re-render prompt
-    this.render();
-
-    this.screen.done();
-    this.done(state.value);
-  }
-
-  onError(state) {
-    this.render(state.isValid);
-  }
-
-  onKeypress() {
-    // If user press a key, just clear the default value
-    if (this.opt.default) {
-      this.opt.default = undefined;
-    }
-
-    this.render();
-  }
-}
-
-module.exports = PasswordPrompt;
diff --git a/node_modules/inquirer/lib/prompts/rawlist.js b/node_modules/inquirer/lib/prompts/rawlist.js
deleted file mode 100644
index 418114b..0000000
--- a/node_modules/inquirer/lib/prompts/rawlist.js
+++ /dev/null
@@ -1,216 +0,0 @@
-'use strict';
-/**
- * `rawlist` type prompt
- */
-
-var _ = require('lodash');
-var chalk = require('chalk');
-var { map, takeUntil } = require('rxjs/operators');
-var Base = require('./base');
-var Separator = require('../objects/separator');
-var observe = require('../utils/events');
-var Paginator = require('../utils/paginator');
-
-class RawListPrompt extends Base {
-  constructor(questions, rl, answers) {
-    super(questions, rl, answers);
-
-    if (!this.opt.choices) {
-      this.throwParamError('choices');
-    }
-
-    this.opt.validChoices = this.opt.choices.filter(Separator.exclude);
-
-    this.selected = 0;
-    this.rawDefault = 0;
-
-    _.extend(this.opt, {
-      validate: function(val) {
-        return val != null;
-      }
-    });
-
-    var def = this.opt.default;
-    if (_.isNumber(def) && def >= 0 && def < this.opt.choices.realLength) {
-      this.selected = def;
-      this.rawDefault = def;
-    } else if (!_.isNumber(def) && def != null) {
-      let index = _.findIndex(this.opt.choices.realChoices, ({ value }) => value === def);
-      let safeIndex = Math.max(index, 0);
-      this.selected = safeIndex;
-      this.rawDefault = safeIndex;
-    }
-
-    // Make sure no default is set (so it won't be printed)
-    this.opt.default = null;
-
-    this.paginator = new Paginator();
-  }
-
-  /**
-   * Start the Inquiry session
-   * @param  {Function} cb      Callback when prompt is done
-   * @return {this}
-   */
-
-  _run(cb) {
-    this.done = cb;
-
-    // Once user confirm (enter key)
-    var events = observe(this.rl);
-    var submit = events.line.pipe(map(this.getCurrentValue.bind(this)));
-
-    var validation = this.handleSubmitEvents(submit);
-    validation.success.forEach(this.onEnd.bind(this));
-    validation.error.forEach(this.onError.bind(this));
-
-    events.normalizedUpKey.pipe(takeUntil(events.line)).forEach(this.onUpKey.bind(this));
-    events.normalizedDownKey
-      .pipe(takeUntil(events.line))
-      .forEach(this.onDownKey.bind(this));
-    events.keypress
-      .pipe(takeUntil(validation.success))
-      .forEach(this.onKeypress.bind(this));
-    // Init the prompt
-    this.render();
-
-    return this;
-  }
-
-  /**
-   * Render the prompt to screen
-   * @return {RawListPrompt} self
-   */
-
-  render(error) {
-    // Render question
-    var message = this.getQuestion();
-    var bottomContent = '';
-
-    if (this.status === 'answered') {
-      message += chalk.cyan(this.answer);
-    } else {
-      var choicesStr = renderChoices(this.opt.choices, this.selected);
-      message +=
-        '\n' + this.paginator.paginate(choicesStr, this.selected, this.opt.pageSize);
-      message += '\n  Answer: ';
-    }
-    message += this.rl.line;
-
-    if (error) {
-      bottomContent = '\n' + chalk.red('>> ') + error;
-    }
-
-    this.screen.render(message, bottomContent);
-  }
-
-  /**
-   * When user press `enter` key
-   */
-
-  getCurrentValue(index) {
-    if (index == null) {
-      index = this.rawDefault;
-    } else if (index === '') {
-      index = this.selected;
-    } else {
-      index -= 1;
-    }
-
-    var choice = this.opt.choices.getChoice(index);
-    return choice ? choice.value : null;
-  }
-
-  onEnd(state) {
-    this.status = 'answered';
-    this.answer = state.value;
-
-    // Re-render prompt
-    this.render();
-
-    this.screen.done();
-    this.done(state.value);
-  }
-
-  onError() {
-    this.render('Please enter a valid index');
-  }
-
-  /**
-   * When user press a key
-   */
-
-  onKeypress() {
-    var index = this.rl.line.length ? Number(this.rl.line) - 1 : 0;
-
-    if (this.opt.choices.getChoice(index)) {
-      this.selected = index;
-    } else {
-      this.selected = undefined;
-    }
-    this.render();
-  }
-
-  /**
-   * When user press up key
-   */
-
-  onUpKey() {
-    this.onArrowKey('up');
-  }
-
-  /**
-   * When user press down key
-   */
-
-  onDownKey() {
-    this.onArrowKey('down');
-  }
-
-  /**
-   * When user press up or down key
-   * @param {String} type Arrow type: up or down
-   */
-
-  onArrowKey(type) {
-    var len = this.opt.choices.realLength;
-
-    if (type === 'up') this.selected = this.selected > 0 ? this.selected - 1 : len - 1;
-    else this.selected = this.selected < len - 1 ? this.selected + 1 : 0;
-
-    this.rl.line = String(this.selected + 1);
-  }
-}
-
-/**
- * Function for rendering list choices
- * @param  {Number} pointer Position of the pointer
- * @return {String}         Rendered content
- */
-
-function renderChoices(choices, pointer) {
-  var output = '';
-  var separatorOffset = 0;
-
-  choices.forEach(function(choice, i) {
-    output += '\n  ';
-
-    if (choice.type === 'separator') {
-      separatorOffset++;
-      output += ' ' + choice;
-      return;
-    }
-
-    var index = i - separatorOffset;
-    var display = index + 1 + ') ' + choice.name;
-    if (index === pointer) {
-      display = chalk.cyan(display);
-    }
-
-    output += display;
-  });
-
-  return output;
-}
-
-module.exports = RawListPrompt;
diff --git a/node_modules/inquirer/lib/ui/baseUI.js b/node_modules/inquirer/lib/ui/baseUI.js
deleted file mode 100644
index 45248ef..0000000
--- a/node_modules/inquirer/lib/ui/baseUI.js
+++ /dev/null
@@ -1,96 +0,0 @@
-'use strict';
-var _ = require('lodash');
-var MuteStream = require('mute-stream');
-var readline = require('readline');
-
-/**
- * Base interface class other can inherits from
- */
-
-class UI {
-  constructor(opt) {
-    // Instantiate the Readline interface
-    // @Note: Don't reassign if already present (allow test to override the Stream)
-    if (!this.rl) {
-      this.rl = readline.createInterface(setupReadlineOptions(opt));
-    }
-
-    this.rl.resume();
-
-    this.onForceClose = this.onForceClose.bind(this);
-
-    // Make sure new prompt start on a newline when closing
-    process.on('exit', this.onForceClose);
-
-    // Terminate process on SIGINT (which will call process.on('exit') in return)
-    this.rl.on('SIGINT', this.onForceClose);
-  }
-
-  /**
-   * Handle the ^C exit
-   * @return {null}
-   */
-
-  onForceClose() {
-    this.close();
-    process.kill(process.pid, 'SIGINT');
-    console.log('');
-  }
-
-  /**
-   * Close the interface and cleanup listeners
-   */
-
-  close() {
-    // Remove events listeners
-    this.rl.removeListener('SIGINT', this.onForceClose);
-    process.removeListener('exit', this.onForceClose);
-
-    this.rl.output.unmute();
-
-    if (this.activePrompt && typeof this.activePrompt.close === 'function') {
-      this.activePrompt.close();
-    }
-
-    // Close the readline
-    this.rl.output.end();
-    this.rl.pause();
-    this.rl.close();
-  }
-}
-
-function setupReadlineOptions(opt) {
-  opt = opt || {};
-  // Inquirer 8.x:
-  // opt.skipTTYChecks = opt.skipTTYChecks === undefined ? opt.input !== undefined : opt.skipTTYChecks;
-  opt.skipTTYChecks = opt.skipTTYChecks === undefined ? true : opt.skipTTYChecks;
-
-  // Default `input` to stdin
-  var input = opt.input || process.stdin;
-
-  // Check if prompt is being called in TTY environment
-  // If it isn't return a failed promise
-  if (!opt.skipTTYChecks && !input.isTTY) {
-    const nonTtyError = new Error(
-      'Prompts can not be meaningfully rendered in non-TTY environments'
-    );
-    nonTtyError.isTtyError = true;
-    throw nonTtyError;
-  }
-
-  // Add mute capabilities to the output
-  var ms = new MuteStream();
-  ms.pipe(opt.output || process.stdout);
-  var output = ms;
-
-  return _.extend(
-    {
-      terminal: true,
-      input: input,
-      output: output
-    },
-    _.omit(opt, ['input', 'output'])
-  );
-}
-
-module.exports = UI;
diff --git a/node_modules/inquirer/lib/ui/bottom-bar.js b/node_modules/inquirer/lib/ui/bottom-bar.js
deleted file mode 100644
index b56d6d7..0000000
--- a/node_modules/inquirer/lib/ui/bottom-bar.js
+++ /dev/null
@@ -1,100 +0,0 @@
-'use strict';
-/**
- * Sticky bottom bar user interface
- */
-
-var through = require('through');
-var Base = require('./baseUI');
-var rlUtils = require('../utils/readline');
-var _ = require('lodash');
-
-class BottomBar extends Base {
-  constructor(opt) {
-    opt = opt || {};
-
-    super(opt);
-
-    this.log = through(this.writeLog.bind(this));
-    this.bottomBar = opt.bottomBar || '';
-    this.render();
-  }
-
-  /**
-   * Render the prompt to screen
-   * @return {BottomBar} self
-   */
-
-  render() {
-    this.write(this.bottomBar);
-    return this;
-  }
-
-  clean() {
-    rlUtils.clearLine(this.rl, this.bottomBar.split('\n').length);
-    return this;
-  }
-
-  /**
-   * Update the bottom bar content and rerender
-   * @param  {String} bottomBar Bottom bar content
-   * @return {BottomBar}           self
-   */
-
-  updateBottomBar(bottomBar) {
-    rlUtils.clearLine(this.rl, 1);
-    this.rl.output.unmute();
-    this.clean();
-    this.bottomBar = bottomBar;
-    this.render();
-    this.rl.output.mute();
-    return this;
-  }
-
-  /**
-   * Write out log data
-   * @param {String} data - The log data to be output
-   * @return {BottomBar} self
-   */
-
-  writeLog(data) {
-    this.rl.output.unmute();
-    this.clean();
-    this.rl.output.write(this.enforceLF(data.toString()));
-    this.render();
-    this.rl.output.mute();
-    return this;
-  }
-
-  /**
-   * Make sure line end on a line feed
-   * @param  {String} str Input string
-   * @return {String}     The input string with a final line feed
-   */
-
-  enforceLF(str) {
-    return str.match(/[\r\n]$/) ? str : str + '\n';
-  }
-
-  /**
-   * Helper for writing message in Prompt
-   * @param {BottomBar} prompt  - The Prompt object that extends tty
-   * @param {String} message - The message to be output
-   */
-  write(message) {
-    var msgLines = message.split(/\n/);
-    this.height = msgLines.length;
-
-    // Write message to screen and setPrompt to control backspace
-    this.rl.setPrompt(_.last(msgLines));
-
-    if (this.rl.output.rows === 0 && this.rl.output.columns === 0) {
-      /* When it's a tty through serial port there's no terminal info and the render will malfunction,
-         so we need enforce the cursor to locate to the leftmost position for rendering. */
-      rlUtils.left(this.rl, message.length + this.rl.line.length);
-    }
-
-    this.rl.output.write(message);
-  }
-}
-
-module.exports = BottomBar;
diff --git a/node_modules/inquirer/lib/ui/prompt.js b/node_modules/inquirer/lib/ui/prompt.js
deleted file mode 100644
index 9735c99..0000000
--- a/node_modules/inquirer/lib/ui/prompt.js
+++ /dev/null
@@ -1,132 +0,0 @@
-'use strict';
-var _ = require('lodash');
-var { defer, empty, from, of } = require('rxjs');
-var { concatMap, filter, publish, reduce } = require('rxjs/operators');
-var runAsync = require('run-async');
-var utils = require('../utils/utils');
-var Base = require('./baseUI');
-
-/**
- * Base interface class other can inherits from
- */
-
-class PromptUI extends Base {
-  constructor(prompts, opt) {
-    super(opt);
-    this.prompts = prompts;
-  }
-
-  run(questions, answers) {
-    // Keep global reference to the answers
-    if (_.isPlainObject(answers)) {
-      this.answers = _.clone(answers);
-    } else {
-      this.answers = {};
-    }
-
-    // Make sure questions is an array.
-    if (_.isPlainObject(questions)) {
-      questions = [questions];
-    }
-
-    // Create an observable, unless we received one as parameter.
-    // Note: As this is a public interface, we cannot do an instanceof check as we won't
-    // be using the exact same object in memory.
-    var obs = _.isArray(questions) ? from(questions) : questions;
-
-    this.process = obs.pipe(
-      concatMap(this.processQuestion.bind(this)),
-      publish() // Creates a hot Observable. It prevents duplicating prompts.
-    );
-
-    this.process.connect();
-
-    return this.process
-      .pipe(
-        reduce((answers, answer) => {
-          _.set(answers, answer.name, answer.answer);
-          return answers;
-        }, this.answers)
-      )
-      .toPromise(Promise)
-      .then(this.onCompletion.bind(this));
-  }
-
-  /**
-   * Once all prompt are over
-   */
-
-  onCompletion() {
-    this.close();
-
-    return this.answers;
-  }
-
-  processQuestion(question) {
-    question = _.clone(question);
-    return defer(() => {
-      var obs = of(question);
-
-      return obs.pipe(
-        concatMap(this.setDefaultType.bind(this)),
-        concatMap(this.filterIfRunnable.bind(this)),
-        concatMap(() =>
-          utils.fetchAsyncQuestionProperty(question, 'message', this.answers)
-        ),
-        concatMap(() =>
-          utils.fetchAsyncQuestionProperty(question, 'default', this.answers)
-        ),
-        concatMap(() =>
-          utils.fetchAsyncQuestionProperty(question, 'choices', this.answers)
-        ),
-        concatMap(this.fetchAnswer.bind(this))
-      );
-    });
-  }
-
-  fetchAnswer(question) {
-    var Prompt = this.prompts[question.type];
-    this.activePrompt = new Prompt(question, this.rl, this.answers);
-    return defer(() =>
-      from(
-        this.activePrompt.run().then(answer => ({ name: question.name, answer: answer }))
-      )
-    );
-  }
-
-  setDefaultType(question) {
-    // Default type to input
-    if (!this.prompts[question.type]) {
-      question.type = 'input';
-    }
-
-    return defer(() => of(question));
-  }
-
-  filterIfRunnable(question) {
-    if (question.askAnswered !== true && this.answers[question.name] !== undefined) {
-      return empty();
-    }
-
-    if (question.when === false) {
-      return empty();
-    }
-
-    if (!_.isFunction(question.when)) {
-      return of(question);
-    }
-
-    var answers = this.answers;
-    return defer(() =>
-      from(
-        runAsync(question.when)(answers).then(shouldRun => {
-          if (shouldRun) {
-            return question;
-          }
-        })
-      ).pipe(filter(val => val != null))
-    );
-  }
-}
-
-module.exports = PromptUI;
diff --git a/node_modules/inquirer/lib/utils/events.js b/node_modules/inquirer/lib/utils/events.js
deleted file mode 100644
index 966d146..0000000
--- a/node_modules/inquirer/lib/utils/events.js
+++ /dev/null
@@ -1,54 +0,0 @@
-'use strict';
-var { fromEvent } = require('rxjs');
-var { filter, map, share, takeUntil } = require('rxjs/operators');
-
-function normalizeKeypressEvents(value, key) {
-  return { value: value, key: key || {} };
-}
-
-module.exports = function(rl) {
-  var keypress = fromEvent(rl.input, 'keypress', normalizeKeypressEvents)
-    .pipe(takeUntil(fromEvent(rl, 'close')))
-    // Ignore `enter` key. On the readline, we only care about the `line` event.
-    .pipe(filter(({ key }) => key.name !== 'enter' && key.name !== 'return'));
-
-  return {
-    line: fromEvent(rl, 'line'),
-    keypress: keypress,
-
-    normalizedUpKey: keypress.pipe(
-      filter(
-        ({ key }) =>
-          key.name === 'up' || key.name === 'k' || (key.name === 'p' && key.ctrl)
-      ),
-      share()
-    ),
-
-    normalizedDownKey: keypress.pipe(
-      filter(
-        ({ key }) =>
-          key.name === 'down' || key.name === 'j' || (key.name === 'n' && key.ctrl)
-      ),
-      share()
-    ),
-
-    numberKey: keypress.pipe(
-      filter(e => e.value && '123456789'.indexOf(e.value) >= 0),
-      map(e => Number(e.value)),
-      share()
-    ),
-
-    spaceKey: keypress.pipe(
-      filter(({ key }) => key && key.name === 'space'),
-      share()
-    ),
-    aKey: keypress.pipe(
-      filter(({ key }) => key && key.name === 'a'),
-      share()
-    ),
-    iKey: keypress.pipe(
-      filter(({ key }) => key && key.name === 'i'),
-      share()
-    )
-  };
-};
diff --git a/node_modules/inquirer/lib/utils/paginator.js b/node_modules/inquirer/lib/utils/paginator.js
deleted file mode 100644
index 272d104..0000000
--- a/node_modules/inquirer/lib/utils/paginator.js
+++ /dev/null
@@ -1,54 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-var chalk = require('chalk');
-
-/**
- * The paginator keeps track of a pointer index in a list and returns
- * a subset of the choices if the list is too long.
- */
-
-class Paginator {
-  constructor(screen) {
-    this.pointer = 0;
-    this.lastIndex = 0;
-    this.screen = screen;
-  }
-
-  paginate(output, active, pageSize) {
-    pageSize = pageSize || 7;
-    var middleOfList = Math.floor(pageSize / 2);
-    var lines = output.split('\n');
-
-    if (this.screen) {
-      lines = this.screen.breakLines(lines);
-      active = _.sum(lines.map(lineParts => lineParts.length).splice(0, active));
-      lines = _.flatten(lines);
-    }
-
-    // Make sure there's enough lines to paginate
-    if (lines.length <= pageSize) {
-      return output;
-    }
-
-    // Move the pointer only when the user go down and limit it to the middle of the list
-    if (
-      this.pointer < middleOfList &&
-      this.lastIndex < active &&
-      active - this.lastIndex < pageSize
-    ) {
-      this.pointer = Math.min(middleOfList, this.pointer + active - this.lastIndex);
-    }
-
-    this.lastIndex = active;
-
-    // Duplicate the lines so it give an infinite list look
-    var infinite = _.flatten([lines, lines, lines]);
-    var topIndex = Math.max(0, active + lines.length - this.pointer);
-
-    var section = infinite.splice(topIndex, pageSize).join('\n');
-    return section + '\n' + chalk.dim('(Move up and down to reveal more choices)');
-  }
-}
-
-module.exports = Paginator;
diff --git a/node_modules/inquirer/lib/utils/readline.js b/node_modules/inquirer/lib/utils/readline.js
deleted file mode 100644
index 929b672..0000000
--- a/node_modules/inquirer/lib/utils/readline.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict';
-var ansiEscapes = require('ansi-escapes');
-
-/**
- * Move cursor left by `x`
- * @param  {Readline} rl - Readline instance
- * @param  {Number}   x  - How far to go left (default to 1)
- */
-
-exports.left = function(rl, x) {
-  rl.output.write(ansiEscapes.cursorBackward(x));
-};
-
-/**
- * Move cursor right by `x`
- * @param  {Readline} rl - Readline instance
- * @param  {Number}   x  - How far to go left (default to 1)
- */
-
-exports.right = function(rl, x) {
-  rl.output.write(ansiEscapes.cursorForward(x));
-};
-
-/**
- * Move cursor up by `x`
- * @param  {Readline} rl - Readline instance
- * @param  {Number}   x  - How far to go up (default to 1)
- */
-
-exports.up = function(rl, x) {
-  rl.output.write(ansiEscapes.cursorUp(x));
-};
-
-/**
- * Move cursor down by `x`
- * @param  {Readline} rl - Readline instance
- * @param  {Number}   x  - How far to go down (default to 1)
- */
-
-exports.down = function(rl, x) {
-  rl.output.write(ansiEscapes.cursorDown(x));
-};
-
-/**
- * Clear current line
- * @param  {Readline} rl  - Readline instance
- * @param  {Number}   len - number of line to delete
- */
-exports.clearLine = function(rl, len) {
-  rl.output.write(ansiEscapes.eraseLines(len));
-};
diff --git a/node_modules/inquirer/lib/utils/screen-manager.js b/node_modules/inquirer/lib/utils/screen-manager.js
deleted file mode 100644
index 6b8f669..0000000
--- a/node_modules/inquirer/lib/utils/screen-manager.js
+++ /dev/null
@@ -1,142 +0,0 @@
-'use strict';
-var _ = require('lodash');
-var util = require('./readline');
-var cliWidth = require('cli-width');
-var stripAnsi = require('strip-ansi');
-var stringWidth = require('string-width');
-
-function height(content) {
-  return content.split('\n').length;
-}
-
-function lastLine(content) {
-  return _.last(content.split('\n'));
-}
-
-class ScreenManager {
-  constructor(rl) {
-    // These variables are keeping information to allow correct prompt re-rendering
-    this.height = 0;
-    this.extraLinesUnderPrompt = 0;
-
-    this.rl = rl;
-  }
-
-  render(content, bottomContent) {
-    this.rl.output.unmute();
-    this.clean(this.extraLinesUnderPrompt);
-
-    /**
-     * Write message to screen and setPrompt to control backspace
-     */
-
-    var promptLine = lastLine(content);
-    var rawPromptLine = stripAnsi(promptLine);
-
-    // Remove the rl.line from our prompt. We can't rely on the content of
-    // rl.line (mainly because of the password prompt), so just rely on it's
-    // length.
-    var prompt = rawPromptLine;
-    if (this.rl.line.length) {
-      prompt = prompt.slice(0, -this.rl.line.length);
-    }
-
-    this.rl.setPrompt(prompt);
-
-    // SetPrompt will change cursor position, now we can get correct value
-    var cursorPos = this.rl._getCursorPos();
-    var width = this.normalizedCliWidth();
-
-    content = this.forceLineReturn(content, width);
-    if (bottomContent) {
-      bottomContent = this.forceLineReturn(bottomContent, width);
-    }
-
-    // Manually insert an extra line if we're at the end of the line.
-    // This prevent the cursor from appearing at the beginning of the
-    // current line.
-    if (rawPromptLine.length % width === 0) {
-      content += '\n';
-    }
-
-    var fullContent = content + (bottomContent ? '\n' + bottomContent : '');
-    this.rl.output.write(fullContent);
-
-    /**
-     * Re-adjust the cursor at the correct position.
-     */
-
-    // We need to consider parts of the prompt under the cursor as part of the bottom
-    // content in order to correctly cleanup and re-render.
-    var promptLineUpDiff = Math.floor(rawPromptLine.length / width) - cursorPos.rows;
-    var bottomContentHeight =
-      promptLineUpDiff + (bottomContent ? height(bottomContent) : 0);
-    if (bottomContentHeight > 0) {
-      util.up(this.rl, bottomContentHeight);
-    }
-
-    // Reset cursor at the beginning of the line
-    util.left(this.rl, stringWidth(lastLine(fullContent)));
-
-    // Adjust cursor on the right
-    if (cursorPos.cols > 0) {
-      util.right(this.rl, cursorPos.cols);
-    }
-
-    /**
-     * Set up state for next re-rendering
-     */
-    this.extraLinesUnderPrompt = bottomContentHeight;
-    this.height = height(fullContent);
-
-    this.rl.output.mute();
-  }
-
-  clean(extraLines) {
-    if (extraLines > 0) {
-      util.down(this.rl, extraLines);
-    }
-
-    util.clearLine(this.rl, this.height);
-  }
-
-  done() {
-    this.rl.setPrompt('');
-    this.rl.output.unmute();
-    this.rl.output.write('\n');
-  }
-
-  releaseCursor() {
-    if (this.extraLinesUnderPrompt > 0) {
-      util.down(this.rl, this.extraLinesUnderPrompt);
-    }
-  }
-
-  normalizedCliWidth() {
-    var width = cliWidth({
-      defaultWidth: 80,
-      output: this.rl.output
-    });
-    return width;
-  }
-
-  breakLines(lines, width) {
-    // Break lines who're longer than the cli width so we can normalize the natural line
-    // returns behavior across terminals.
-    width = width || this.normalizedCliWidth();
-    var regex = new RegExp('(?:(?:\\033[[0-9;]*m)*.?){1,' + width + '}', 'g');
-    return lines.map(line => {
-      var chunk = line.match(regex);
-      // Last match is always empty
-      chunk.pop();
-      return chunk || '';
-    });
-  }
-
-  forceLineReturn(content, width) {
-    width = width || this.normalizedCliWidth();
-    return _.flatten(this.breakLines(content.split('\n'), width)).join('\n');
-  }
-}
-
-module.exports = ScreenManager;
diff --git a/node_modules/inquirer/lib/utils/utils.js b/node_modules/inquirer/lib/utils/utils.js
deleted file mode 100644
index 942b35c..0000000
--- a/node_modules/inquirer/lib/utils/utils.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-var _ = require('lodash');
-var { from, of } = require('rxjs');
-var runAsync = require('run-async');
-
-/**
- * Resolve a question property value if it is passed as a function.
- * This method will overwrite the property on the question object with the received value.
- * @param  {Object} question - Question object
- * @param  {String} prop     - Property to fetch name
- * @param  {Object} answers  - Answers object
- * @return {Rx.Observable}   - Observable emitting once value is known
- */
-
-exports.fetchAsyncQuestionProperty = function(question, prop, answers) {
-  if (!_.isFunction(question[prop])) {
-    return of(question);
-  }
-
-  return from(
-    runAsync(question[prop])(answers).then(value => {
-      question[prop] = value;
-      return question;
-    })
-  );
-};
diff --git a/node_modules/inquirer/package.json b/node_modules/inquirer/package.json
deleted file mode 100644
index bc8e431..0000000
--- a/node_modules/inquirer/package.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-  "name": "inquirer",
-  "version": "7.1.0",
-  "description": "A collection of common interactive command line user interfaces.",
-  "author": "Simon Boudrias <admin@simonboudrias.com>",
-  "files": [
-    "lib",
-    "README.md"
-  ],
-  "main": "lib/inquirer.js",
-  "keywords": [
-    "command",
-    "prompt",
-    "stdin",
-    "cli",
-    "tty",
-    "menu"
-  ],
-  "engines": {
-    "node": ">=6.0.0"
-  },
-  "devDependencies": {
-    "chai": "^4.2.0",
-    "chalk-pipe": "^3.0.0",
-    "cmdify": "^0.0.4",
-    "mocha": "^7.1.0",
-    "mockery": "^2.1.0",
-    "nyc": "^15.0.0",
-    "sinon": "^9.0.0"
-  },
-  "scripts": {
-    "test": "nyc mocha test/**/* -r ./test/before",
-    "posttest": "nyc report --reporter=text-lcov > ../../coverage/nyc-report.lcov",
-    "prepublishOnly": "cp ../../README.md .",
-    "postpublish": "rm -f README.md"
-  },
-  "repository": "SBoudrias/Inquirer.js",
-  "license": "MIT",
-  "dependencies": {
-    "ansi-escapes": "^4.2.1",
-    "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.4.0",
-    "rxjs": "^6.5.3",
-    "string-width": "^4.1.0",
-    "strip-ansi": "^6.0.0",
-    "through": "^2.3.6"
-  },
-  "gitHead": "cdce9828f5f27b89e5743b1826876b9042db410a"
-}
diff --git a/node_modules/internal-slot/.eslintrc b/node_modules/internal-slot/.eslintrc
deleted file mode 100644
index cab5bd0..0000000
--- a/node_modules/internal-slot/.eslintrc
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"max-params": [2, 3],
-		"new-cap": [2, { "capIsNewExceptions": ["GetIntrinsic"] }],
-		"no-magic-numbers": 0,
-		"operator-linebreak": [2, "before"],
-	},
-}
diff --git a/node_modules/internal-slot/.github/FUNDING.yml b/node_modules/internal-slot/.github/FUNDING.yml
deleted file mode 100644
index 8dc96e2..0000000
--- a/node_modules/internal-slot/.github/FUNDING.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# These are supported funding model platforms
-
-github: [ljharb]
-patreon: # Replace with a single Patreon username
-open_collective: # Replace with a single Open Collective username
-ko_fi: # Replace with a single Ko-fi username
-tidelift: npm/internal-slot
-community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
-liberapay: # Replace with a single Liberapay username
-issuehunt: # Replace with a single IssueHunt username
-otechie: # Replace with a single Otechie username
-custom: # Replace with a single custom sponsorship URL
diff --git a/node_modules/internal-slot/.github/workflows/rebase.yml b/node_modules/internal-slot/.github/workflows/rebase.yml
deleted file mode 100644
index 436cb79..0000000
--- a/node_modules/internal-slot/.github/workflows/rebase.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: Automatic Rebase
-
-on: [pull_request]
-
-jobs:
-  _:
-    name: "Automatic Rebase"
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v1
-    - uses: ljharb/rebase@master
-      env:
-        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/node_modules/internal-slot/.travis.yml b/node_modules/internal-slot/.travis.yml
deleted file mode 100644
index 0b5d834..0000000
--- a/node_modules/internal-slot/.travis.yml
+++ /dev/null
@@ -1,319 +0,0 @@
-language: node_js
-os:
- - linux
-node_js:
-  - "12.12"
-  - "11.15"
-  - "10.16"
-  - "9.11"
-  - "8.16"
-  - "7.10"
-  - "6.17"
-  - "5.12"
-  - "4.9"
-  - "iojs-v3.3"
-  - "iojs-v2.5"
-  - "iojs-v1.8"
-  - "0.12"
-  - "0.10"
-  - "0.8"
-before_install:
-  - 'case "${TRAVIS_NODE_VERSION}" in 0.*) export NPM_CONFIG_STRICT_SSL=false ;; esac'
-  - 'nvm install-latest-npm'
-install:
-  - 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ] || [ "${TRAVIS_NODE_VERSION}" = "0.9" ]; then nvm install --latest-npm 0.8 && npm install && nvm use "${TRAVIS_NODE_VERSION}"; else npm install; fi;'
-script:
-  - 'if [ -n "${PRETEST-}" ]; then npm run pretest ; fi'
-  - 'if [ -n "${POSTTEST-}" ]; then npm run posttest ; fi'
-  - 'if [ -n "${COVERAGE-}" ]; then npm run coverage ; fi'
-  - 'if [ -n "${TEST-}" ]; then npm run tests-only ; fi'
-sudo: false
-env:
-  - TEST=true
-matrix:
-  fast_finish: true
-  include:
-    - node_js: "lts/*"
-      env: PRETEST=true
-    - node_js: "lts/*"
-      env: POSTTEST=true
-    - node_js: "12.11"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "12.10"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "12.9"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "12.8"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "12.7"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "12.6"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "12.5"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "12.4"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "12.3"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "12.2"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "12.1"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "12.0"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.14"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.13"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.12"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.11"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.10"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.9"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.8"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.7"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.6"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.5"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.4"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.3"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.2"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.1"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "11.0"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.15"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.14"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.13"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.12"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.11"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.10"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.9"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.8"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.7"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.6"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.5"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.4"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.3"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.2"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.1"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "10.0"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "9.10"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "9.9"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "9.8"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "9.7"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "9.6"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "9.5"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "9.4"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "9.3"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "9.2"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "9.1"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "9.0"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.15"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.14"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.13"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.12"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.11"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.10"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.9"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.8"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.7"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.6"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.5"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.4"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.3"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.2"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.1"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "8.0"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "7.9"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "7.8"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "7.7"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "7.6"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "7.5"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "7.4"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "7.3"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "7.2"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "7.1"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "7.0"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.16"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.15"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.14"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.13"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.12"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.11"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.10"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.9"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.8"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.7"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.6"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.5"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.4"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.3"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.2"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.1"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "6.0"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "5.11"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "5.10"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "5.9"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "5.8"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "5.7"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "5.6"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "5.5"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "5.4"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "5.3"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "5.2"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "5.1"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "5.0"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "4.8"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "4.7"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "4.6"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "4.5"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "4.4"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "4.3"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "4.2"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "4.1"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "4.0"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v3.2"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v3.1"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v3.0"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v2.4"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v2.3"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v2.2"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v2.1"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v2.0"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v1.7"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v1.6"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v1.5"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v1.4"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v1.3"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v1.2"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v1.1"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "iojs-v1.0"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "0.11"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "0.9"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "0.6"
-      env: TEST=true ALLOW_FAILURE=true
-    - node_js: "0.4"
-      env: TEST=true ALLOW_FAILURE=true
-  allow_failures:
-    - os: osx
-    - env: TEST=true ALLOW_FAILURE=true
-    - env: COVERAGE=true
diff --git a/node_modules/internal-slot/CHANGELOG.md b/node_modules/internal-slot/CHANGELOG.md
deleted file mode 100644
index 11c57b1..0000000
--- a/node_modules/internal-slot/CHANGELOG.md
+++ /dev/null
@@ -1,35 +0,0 @@
-### Changelog
-
-All notable changes to this project will be documented in this file. Dates are displayed in UTC.
-
-Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
-
-#### [v1.0.2](https://github.com/ljharb/internal-slot/compare/v1.0.1...v1.0.2)
-
-> 20 December 2019
-
-- [Deps] update `es-abstract`, `side-channel` [`5c9df03`](https://github.com/ljharb/internal-slot/commit/5c9df03a25518f5c482cff4e1447a26fa071df9a)
-- [Dev Deps] update `@ljharb/eslint-config`, `tape` [`7820f98`](https://github.com/ljharb/internal-slot/commit/7820f984e523a64ddf3068c4e5631abf61eb1ea4)
-
-#### [v1.0.1](https://github.com/ljharb/internal-slot/compare/v1.0.0...v1.0.1)
-
-> 2 December 2019
-
-- [Refactor] use `side-channel` package [`d38639f`](https://github.com/ljharb/internal-slot/commit/d38639f0a3cdb5090711179d0e78df857ecbd5d3)
-- [actions] add automatic rebasing / merge commit blocking [`74267e6`](https://github.com/ljharb/internal-slot/commit/74267e6e591e18ba39186cb99139d3fd7a757c9f)
-- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `auto-changelog`, `object-inspect`, `safe-publish-latest` [`b042eef`](https://github.com/ljharb/internal-slot/commit/b042eefc067b830bbd370833f7f21754e802b0b2)
-- [Deps] update `es-abstract` [`98cf4e8`](https://github.com/ljharb/internal-slot/commit/98cf4e86c1bfe99eda7b11a8ea70394368f33e4f)
-
-#### v1.0.0
-
-> 21 October 2019
-
-- Tests [`b50fa41`](https://github.com/ljharb/internal-slot/commit/b50fa41b6f47aba39ac4cb733658580974a0b00a)
-- implementation [`c5a59f3`](https://github.com/ljharb/internal-slot/commit/c5a59f3753677f81aa12a0226d3b1187846d06dd)
-- Initial commit [`15ebe4d`](https://github.com/ljharb/internal-slot/commit/15ebe4dc6d46885f67969d64c9c3e705780963f8)
-- readme [`382a3f5`](https://github.com/ljharb/internal-slot/commit/382a3f53d8975e6488373a0fc2abcdc7c4c44247)
-- npm init [`d5e7c97`](https://github.com/ljharb/internal-slot/commit/d5e7c977ef694e89c245fd11165f63c06a7a5040)
-- [meta] add FUNDING.yml [`685b608`](https://github.com/ljharb/internal-slot/commit/685b6087613f6735f4411a558500d92f8a3ec3f2)
-- [meta] add `auto-changelog`, `safe-publish-latest` [`f8fdf1c`](https://github.com/ljharb/internal-slot/commit/f8fdf1c3f0c592f71746da6d7f8bea18f8946dda)
-- [Tests] add `npm run lint` [`baaaa09`](https://github.com/ljharb/internal-slot/commit/baaaa09ab6e5bc5fcc0e7c76e10c55aa18f4ca7e)
-- Only apps should have lockfiles [`dfa7efa`](https://github.com/ljharb/internal-slot/commit/dfa7efa3d5cd23261cb75c2adab6ee3c06790fee)
diff --git a/node_modules/internal-slot/LICENSE b/node_modules/internal-slot/LICENSE
deleted file mode 100644
index 3900dd7..0000000
--- a/node_modules/internal-slot/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2019 Jordan Harband
-
-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/node_modules/internal-slot/README.md b/node_modules/internal-slot/README.md
deleted file mode 100644
index 17d3f6e..0000000
--- a/node_modules/internal-slot/README.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# internal-slot <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
-
-[![Build Status][travis-svg]][travis-url]
-[![dependency status][deps-svg]][deps-url]
-[![dev dependency status][dev-deps-svg]][dev-deps-url]
-[![License][license-image]][license-url]
-[![Downloads][downloads-image]][downloads-url]
-
-[![npm badge][npm-badge-png]][package-url]
-
-Truly private storage, akin to the JS spec’s concept of internal slots.
-
-Uses a WeakMap when available; a Map when not; and a regular object in even older engines. Performance and garbage collection behavior will reflect the environment’s capabilities accordingly.
-
-## Example
-
-```js
-var SLOT = require('internal-slot');
-var assert = require('assert');
-
-var o = {};
-
-assert.throws(function () { SLOT.assert(o, 'foo'); });
-
-assert.equal(SLOT.has(o, 'foo'), false);
-assert.equal(SLOT.get(o, 'foo'), undefined);
-
-SLOT.set(o, 'foo', 42);
-
-assert.equal(SLOT.has(o, 'foo'), true);
-assert.equal(SLOT.get(o, 'foo'), 42);
-
-assert.doesNotThrow(function () { SLOT.assert(o, 'foo'); });
-```
-
-## Tests
-Simply clone the repo, `npm install`, and run `npm test`
-
-## Security
-
-Please email [@ljharb](https://github.com/ljharb) or see https://tidelift.com/security if you have a potential security vulnerability to report.
-
-[package-url]: https://npmjs.org/package/internal-slot
-[npm-version-svg]: http://versionbadg.es/ljharb/internal-slot.svg
-[travis-svg]: https://travis-ci.org/ljharb/internal-slot.svg
-[travis-url]: https://travis-ci.org/ljharb/internal-slot
-[deps-svg]: https://david-dm.org/ljharb/internal-slot.svg
-[deps-url]: https://david-dm.org/ljharb/internal-slot
-[dev-deps-svg]: https://david-dm.org/ljharb/internal-slot/dev-status.svg
-[dev-deps-url]: https://david-dm.org/ljharb/internal-slot#info=devDependencies
-[npm-badge-png]: https://nodei.co/npm/internal-slot.png?downloads=true&stars=true
-[license-image]: https://img.shields.io/npm/l/internal-slot.svg
-[license-url]: LICENSE
-[downloads-image]: https://img.shields.io/npm/dm/internal-slot.svg
-[downloads-url]: https://npm-stat.com/charts.html?package=internal-slot
diff --git a/node_modules/internal-slot/index.js b/node_modules/internal-slot/index.js
deleted file mode 100644
index b32aa83..0000000
--- a/node_modules/internal-slot/index.js
+++ /dev/null
@@ -1,59 +0,0 @@
-'use strict';
-
-var GetIntrinsic = require('es-abstract/GetIntrinsic');
-var has = require('has');
-var channel = require('side-channel')();
-
-var $TypeError = GetIntrinsic('%TypeError%');
-
-var SLOT = {
-	assert: function (O, slot) {
-		if (!O || (typeof O !== 'object' && typeof O !== 'function')) {
-			throw new $TypeError('`O` is not an object');
-		}
-		if (typeof slot !== 'string') {
-			throw new $TypeError('`slot` must be a string');
-		}
-		channel.assert(O);
-	},
-	get: function (O, slot) {
-		if (!O || (typeof O !== 'object' && typeof O !== 'function')) {
-			throw new $TypeError('`O` is not an object');
-		}
-		if (typeof slot !== 'string') {
-			throw new $TypeError('`slot` must be a string');
-		}
-		var slots = channel.get(O);
-		return slots && slots['$' + slot];
-	},
-	has: function (O, slot) {
-		if (!O || (typeof O !== 'object' && typeof O !== 'function')) {
-			throw new $TypeError('`O` is not an object');
-		}
-		if (typeof slot !== 'string') {
-			throw new $TypeError('`slot` must be a string');
-		}
-		var slots = channel.get(O);
-		return !!slots && has(slots, '$' + slot);
-	},
-	set: function (O, slot, V) {
-		if (!O || (typeof O !== 'object' && typeof O !== 'function')) {
-			throw new $TypeError('`O` is not an object');
-		}
-		if (typeof slot !== 'string') {
-			throw new $TypeError('`slot` must be a string');
-		}
-		var slots = channel.get(O);
-		if (!slots) {
-			slots = {};
-			channel.set(O, slots);
-		}
-		slots['$' + slot] = V;
-	}
-};
-
-if (Object.freeze) {
-	Object.freeze(SLOT);
-}
-
-module.exports = SLOT;
diff --git a/node_modules/internal-slot/package.json b/node_modules/internal-slot/package.json
deleted file mode 100644
index c59cc32..0000000
--- a/node_modules/internal-slot/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-	"name": "internal-slot",
-	"version": "1.0.2",
-	"description": "ES spec-like internal slots",
-	"main": "index.js",
-	"scripts": {
-		"prepublish": "safe-publish-latest",
-		"version": "auto-changelog && git add CHANGELOG.md",
-		"postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\"",
-		"pretest": "npm run lint",
-		"lint": "eslint .",
-		"tests-only": "node test",
-		"test": "npm run tests-only",
-		"posttest": "npx aud"
-	},
-	"repository": {
-		"type": "git",
-		"url": "git+https://github.com/ljharb/internal-slot.git"
-	},
-	"keywords": [
-		"internal",
-		"slot",
-		"internal slot",
-		"ecmascript",
-		"es",
-		"spec",
-		"private",
-		"data",
-		"private data",
-		"weakmap"
-	],
-	"author": "Jordan Harband <ljharb@gmail.com>",
-	"license": "MIT",
-	"bugs": {
-		"url": "https://github.com/ljharb/internal-slot/issues"
-	},
-	"homepage": "https://github.com/ljharb/internal-slot#readme",
-	"engines": {
-		"node": ">= 0.4"
-	},
-	"devDependencies": {
-		"@ljharb/eslint-config": "^15.1.0",
-		"auto-changelog": "^1.16.2",
-		"eslint": "^6.7.2",
-		"foreach": "^2.0.5",
-		"object-inspect": "^1.7.0",
-		"safe-publish-latest": "^1.1.4",
-		"tape": "^4.12.0"
-	},
-	"dependencies": {
-		"es-abstract": "^1.17.0-next.1",
-		"has": "^1.0.3",
-		"side-channel": "^1.0.2"
-	},
-	"auto-changelog": {
-		"output": "CHANGELOG.md",
-		"unreleased": false,
-		"commitLimit": false,
-		"backfillLimit": false
-	}
-}
diff --git a/node_modules/internal-slot/test/index.js b/node_modules/internal-slot/test/index.js
deleted file mode 100644
index de65d45..0000000
--- a/node_modules/internal-slot/test/index.js
+++ /dev/null
@@ -1,120 +0,0 @@
-'use strict';
-
-var test = require('tape');
-var inspect = require('object-inspect');
-var forEach = require('foreach');
-
-var SLOT = require('../');
-
-test('assert', function (t) {
-	forEach([null, undefined, true, false, 'foo', '', 42, 0], function (primitive) {
-		t['throws'](
-			function () { SLOT.assert(primitive, ''); },
-			TypeError,
-			inspect(primitive) + ' is not an Object'
-		);
-	});
-
-	forEach([null, undefined, true, false, 42, 0, {}, [], function () {}, /a/g], function (nonString) {
-		t['throws'](
-			function () { SLOT.assert({}, nonString); },
-			TypeError,
-			inspect(nonString) + ' is not a String'
-		);
-	});
-
-	t['throws'](
-		function () { SLOT.assert({}, 'whatever'); },
-		TypeError,
-		'nonexistent slot throws'
-	);
-
-	var o = {};
-	SLOT.set(o, 'x');
-	t.doesNotThrow(function () { SLOT.assert(o, 'x'); }, 'existent slot noops');
-
-	t.end();
-});
-
-test('has', function (t) {
-	forEach([null, undefined, true, false, 'foo', '', 42, 0], function (primitive) {
-		t['throws'](
-			function () { SLOT.has(primitive, ''); },
-			TypeError,
-			inspect(primitive) + ' is not an Object'
-		);
-	});
-
-	forEach([null, undefined, true, false, 42, 0, {}, [], function () {}, /a/g], function (nonString) {
-		t['throws'](
-			function () { SLOT.has({}, nonString); },
-			TypeError,
-			inspect(nonString) + ' is not a String'
-		);
-	});
-
-	var o = {};
-
-	t.equal(SLOT.has(o, 'nonexistent'), false, 'nonexistent slot yields false');
-
-	SLOT.set(o, 'foo');
-	t.equal(SLOT.has(o, 'foo'), true, 'existent slot yields true');
-
-	t.end();
-});
-
-test('get', function (t) {
-	forEach([null, undefined, true, false, 'foo', '', 42, 0], function (primitive) {
-		t['throws'](
-			function () { SLOT.get(primitive, ''); },
-			TypeError,
-			inspect(primitive) + ' is not an Object'
-		);
-	});
-
-	forEach([null, undefined, true, false, 42, 0, {}, [], function () {}, /a/g], function (nonString) {
-		t['throws'](
-			function () { SLOT.get({}, nonString); },
-			TypeError,
-			inspect(nonString) + ' is not a String'
-		);
-	});
-
-	var o = {};
-	t.equal(SLOT.get(o, 'nonexistent'), undefined, 'nonexistent slot is undefined');
-
-	var v = {};
-	SLOT.set(o, 'f', v);
-	t.equal(SLOT.get(o, 'f'), v, '"get" retrieves value set by "set"');
-
-	t.end();
-});
-
-test('set', function (t) {
-	forEach([null, undefined, true, false, 'foo', '', 42, 0], function (primitive) {
-		t['throws'](
-			function () { SLOT.set(primitive, ''); },
-			TypeError,
-			inspect(primitive) + ' is not an Object'
-		);
-	});
-
-	forEach([null, undefined, true, false, 42, 0, {}, [], function () {}, /a/g], function (nonString) {
-		t['throws'](
-			function () { SLOT.set({}, nonString); },
-			TypeError,
-			inspect(nonString) + ' is not a String'
-		);
-	});
-
-	var o = function () {};
-	t.equal(SLOT.get(o, 'f'), undefined, 'slot not set');
-
-	SLOT.set(o, 'f', 42);
-	t.equal(SLOT.get(o, 'f'), 42, 'slot was set');
-
-	SLOT.set(o, 'f', Infinity);
-	t.equal(SLOT.get(o, 'f'), Infinity, 'slot was set again');
-
-	t.end();
-});
diff --git a/node_modules/is-promise/.npmignore b/node_modules/is-promise/.npmignore
deleted file mode 100644
index aeb7b45..0000000
--- a/node_modules/is-promise/.npmignore
+++ /dev/null
@@ -1,6 +0,0 @@
-component
-build
-node_modules
-test.js
-component.json
-.gitignore
\ No newline at end of file
diff --git a/node_modules/is-promise/.travis.yml b/node_modules/is-promise/.travis.yml
deleted file mode 100644
index 87f8cd9..0000000
--- a/node_modules/is-promise/.travis.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-language: node_js
-node_js:
-  - "0.10"
\ No newline at end of file
diff --git a/node_modules/is-promise/LICENSE b/node_modules/is-promise/LICENSE
deleted file mode 100644
index 27cc9f3..0000000
--- a/node_modules/is-promise/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2014 Forbes Lindesay
-
-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.
\ No newline at end of file
diff --git a/node_modules/is-promise/index.js b/node_modules/is-promise/index.js
deleted file mode 100644
index ca2444c..0000000
--- a/node_modules/is-promise/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = isPromise;
-
-function isPromise(obj) {
-  return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
-}
diff --git a/node_modules/is-promise/package.json b/node_modules/is-promise/package.json
deleted file mode 100644
index cd8dae9..0000000
--- a/node_modules/is-promise/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "is-promise",
-  "version": "2.1.0",
-  "description": "Test whether an object looks like a promises-a+ promise",
-  "main": "index.js",
-  "scripts": {
-    "test": "mocha -R spec"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/then/is-promise.git"
-  },
-  "author": "ForbesLindesay",
-  "license": "MIT",
-  "devDependencies": {
-    "better-assert": "~0.1.0",
-    "mocha": "~1.7.4"
-  }
-}
diff --git a/node_modules/is-promise/readme.md b/node_modules/is-promise/readme.md
deleted file mode 100644
index 50d5d98..0000000
--- a/node_modules/is-promise/readme.md
+++ /dev/null
@@ -1,29 +0,0 @@
-<a href="http://promises-aplus.github.com/promises-spec"><img src="http://promises-aplus.github.com/promises-spec/assets/logo-small.png" align="right" /></a>
-# is-promise
-
-  Test whether an object looks like a promises-a+ promise
-
- [![Build Status](https://img.shields.io/travis/then/is-promise/master.svg)](https://travis-ci.org/then/is-promise)
- [![Dependency Status](https://img.shields.io/gemnasium/then/is-promise.svg)](https://gemnasium.com/then/is-promise)
- [![NPM version](https://img.shields.io/npm/v/is-promise.svg)](https://www.npmjs.org/package/is-promise)
-
-## Installation
-
-    $ npm install is-promise
-
-You can also use it client side via npm.
-
-## API
-
-```javascript
-var isPromise = require('is-promise');
-
-isPromise({then:function () {...}});//=>true
-isPromise(null);//=>false
-isPromise({});//=>false
-isPromise({then: true})//=>false
-```
-
-## License
-
-  MIT
diff --git a/node_modules/istanbul-lib-instrument/node_modules/@babel/core/node_modules/.bin/semver b/node_modules/istanbul-lib-instrument/node_modules/@babel/core/node_modules/.bin/semver
index 317eb29..3bf1206 120000
--- a/node_modules/istanbul-lib-instrument/node_modules/@babel/core/node_modules/.bin/semver
+++ b/node_modules/istanbul-lib-instrument/node_modules/@babel/core/node_modules/.bin/semver
@@ -1 +1 @@
-../semver/bin/semver
\ No newline at end of file
+../../../../../../normalize-package-data/node_modules/semver/bin/semver
\ No newline at end of file
diff --git a/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js b/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js
index 2824719..b23f688 100644
--- a/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js
+++ b/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js
@@ -1,59 +1,14 @@
 'use strict';
 
-var path = _interopRequireWildcard(require('path'));
-
 var _jestUtil = require('jest-util');
 
-function _getRequireWildcardCache() {
-  if (typeof WeakMap !== 'function') return null;
-  var cache = new WeakMap();
-  _getRequireWildcardCache = function () {
-    return cache;
-  };
-  return cache;
-}
-
-function _interopRequireWildcard(obj) {
-  if (obj && obj.__esModule) {
-    return obj;
-  }
-  if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
-    return {default: obj};
-  }
-  var cache = _getRequireWildcardCache();
-  if (cache && cache.has(obj)) {
-    return cache.get(obj);
-  }
-  var newObj = {};
-  var hasPropertyDescriptor =
-    Object.defineProperty && Object.getOwnPropertyDescriptor;
-  for (var key in obj) {
-    if (Object.prototype.hasOwnProperty.call(obj, key)) {
-      var desc = hasPropertyDescriptor
-        ? Object.getOwnPropertyDescriptor(obj, key)
-        : null;
-      if (desc && (desc.get || desc.set)) {
-        Object.defineProperty(newObj, key, desc);
-      } else {
-        newObj[key] = obj[key];
-      }
-    }
-  }
-  newObj.default = obj;
-  if (cache) {
-    cache.set(obj, newObj);
-  }
-  return newObj;
-}
-
 /**
  * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
  *
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
-const FRAMEWORK_INITIALIZER = path.resolve(__dirname, './jestAdapterInit.js');
-const EXPECT_INITIALIZER = path.resolve(__dirname, './jestExpect.js');
+const FRAMEWORK_INITIALIZER = require.resolve('./jestAdapterInit');
 
 const jestAdapter = async (
   globalConfig,
@@ -63,15 +18,12 @@
   testPath,
   sendMessageToJest
 ) => {
-  var _runtime$unstable_sho2;
+  var _runtime$setGlobalsFo, _runtime$unstable_sho2;
 
   const {
     initialize,
     runAndTransformResultsToJestFormat
   } = runtime.requireInternalModule(FRAMEWORK_INITIALIZER);
-  runtime.requireInternalModule(EXPECT_INITIALIZER).default({
-    expand: globalConfig.expand
-  });
 
   const getPrettier = () =>
     config.prettierPath ? require(config.prettierPath) : null;
@@ -87,6 +39,11 @@
     localRequire: runtime.requireModule.bind(runtime),
     parentProcess: process,
     sendMessageToJest,
+    setGlobalsForRuntime:
+      (_runtime$setGlobalsFo = runtime.setGlobalsForRuntime) === null ||
+      _runtime$setGlobalsFo === void 0
+        ? void 0
+        : _runtime$setGlobalsFo.bind(runtime),
     testPath
   });
 
diff --git a/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.d.ts b/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.d.ts
index b76bf67..8105128 100644
--- a/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.d.ts
+++ b/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.d.ts
@@ -5,43 +5,32 @@
  * LICENSE file in the root directory of this source tree.
  */
 /// <reference types="node" />
+import type BabelTraverse from '@babel/traverse';
 import type { Config, Global } from '@jest/types';
 import type { JestEnvironment } from '@jest/environment';
 import { TestResult } from '@jest/test-result';
 import type { TestFileEvent } from 'jest-runner';
+import { SnapshotStateType } from 'jest-snapshot';
+import globals from '..';
+import { Expect } from './jestExpect';
 declare type Process = NodeJS.Process;
-export declare const initialize: ({ config, environment, getPrettier, getBabelTraverse, globalConfig, localRequire, parentProcess, testPath, sendMessageToJest, }: {
+interface JestGlobals extends Global.TestFrameworkGlobals {
+    expect: Expect;
+}
+export declare const initialize: ({ config, environment, getPrettier, getBabelTraverse, globalConfig, localRequire, parentProcess, sendMessageToJest, setGlobalsForRuntime, testPath, }: {
     config: Config.ProjectConfig;
     environment: JestEnvironment;
     getPrettier: () => null | any;
-    getBabelTraverse: () => Function;
+    getBabelTraverse: () => typeof BabelTraverse;
     globalConfig: Config.GlobalConfig;
-    localRequire: (path: Config.Path) => any;
+    localRequire: <T = unknown>(path: Config.Path) => T;
     testPath: Config.Path;
     parentProcess: Process;
     sendMessageToJest?: import("jest-runner/build/types").TestFileEvent<"test-file-start" | "test-file-success" | "test-file-failure" | "test-case-result"> | undefined;
+    setGlobalsForRuntime?: ((globals: JestGlobals) => void) | undefined;
 }) => Promise<{
-    globals: {
-        afterAll: (fn: Global.TestFn, timeout?: number | undefined) => void;
-        afterEach: (fn: Global.TestFn, timeout?: number | undefined) => void;
-        beforeAll: (fn: Global.TestFn, timeout?: number | undefined) => void;
-        beforeEach: (fn: Global.TestFn, timeout?: number | undefined) => void;
-        describe: {
-            (blockName: string, blockFn: Global.BlockFn): void;
-            each: (table: Global.EachTable, ...taggedTemplateData: Global.TemplateData) => (title: string, test: Global.EachTestFn<Global.TestCallback>, timeout?: number | undefined) => void;
-            only: {
-                (blockName: string, blockFn: Global.BlockFn): void;
-                each: (table: Global.EachTable, ...taggedTemplateData: Global.TemplateData) => (title: string, test: Global.EachTestFn<Global.TestCallback>, timeout?: number | undefined) => void;
-            };
-            skip: {
-                (blockName: string, blockFn: Global.BlockFn): void;
-                each: (table: Global.EachTable, ...taggedTemplateData: Global.TemplateData) => (title: string, test: Global.EachTestFn<Global.TestCallback>, timeout?: number | undefined) => void;
-            };
-        };
-        it: Global.It;
-        test: Global.It;
-    };
-    snapshotState: import("jest-snapshot/build/State").default;
+    globals: Global.TestFrameworkGlobals;
+    snapshotState: SnapshotStateType;
 }>;
 export declare const runAndTransformResultsToJestFormat: ({ config, globalConfig, testPath, }: {
     config: Config.ProjectConfig;
diff --git a/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js b/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js
index c560d19..76f3ba8 100644
--- a/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js
+++ b/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js
@@ -29,6 +29,8 @@
 
 var _ = _interopRequireDefault(require('..'));
 
+var _jestExpect = _interopRequireDefault(require('./jestExpect'));
+
 function _interopRequireDefault(obj) {
   return obj && obj.__esModule ? obj : {default: obj};
 }
@@ -39,8 +41,6 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
-// TODO: hard to type
-// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
 const initialize = async ({
   config,
   environment,
@@ -49,32 +49,37 @@
   globalConfig,
   localRequire,
   parentProcess,
-  testPath,
-  sendMessageToJest
+  sendMessageToJest,
+  setGlobalsForRuntime,
+  testPath
 }) => {
+  var _config$injectGlobals;
+
   if (globalConfig.testTimeout) {
     (0, _state.getState)().testTimeout = globalConfig.testTimeout;
   }
 
-  const mutex = (0, _throat.default)(globalConfig.maxConcurrency);
-  const nodeGlobal = global;
-  Object.assign(nodeGlobal, _.default);
-  nodeGlobal.xit = nodeGlobal.it.skip;
-  nodeGlobal.xtest = nodeGlobal.it.skip;
-  nodeGlobal.xdescribe = nodeGlobal.describe.skip;
-  nodeGlobal.fit = nodeGlobal.it.only;
-  nodeGlobal.fdescribe = nodeGlobal.describe.only;
+  const mutex = (0, _throat.default)(globalConfig.maxConcurrency); // @ts-expect-error
 
-  nodeGlobal.test.concurrent = (test => {
+  const globalsObject = {
+    ..._.default,
+    fdescribe: _.default.describe.only,
+    fit: _.default.it.only,
+    xdescribe: _.default.describe.skip,
+    xit: _.default.it.skip,
+    xtest: _.default.it.skip
+  };
+
+  globalsObject.test.concurrent = (test => {
     const concurrent = (testName, testFn, timeout) => {
       // For concurrent tests we first run the function that returns promise, and then register a
-      // nomral test that will be waiting on the returned promise (when we start the test, the promise
+      // normal test that will be waiting on the returned promise (when we start the test, the promise
       // will already be in the process of execution).
       // Unfortunately at this stage there's no way to know if there are any `.only` tests in the suite
       // that will result in this test to be skipped, so we'll be executing the promise function anyway,
       // even if it ends up being skipped.
       const promise = mutex(() => testFn());
-      nodeGlobal.test(testName, () => promise, timeout);
+      globalsObject.test(testName, () => promise, timeout);
     };
 
     const only = (testName, testFn, timeout) => {
@@ -89,7 +94,7 @@
     concurrent.skip.each = (0, _jestEach.bind)(test.skip, false);
     only.each = (0, _jestEach.bind)(test.only, false);
     return concurrent;
-  })(nodeGlobal.test);
+  })(globalsObject.test);
 
   (0, _state.addEventHandler)(eventHandler);
 
@@ -97,9 +102,28 @@
     (0, _state.addEventHandler)(environment.handleTestEvent.bind(environment));
   }
 
+  const runtimeGlobals = {
+    ...globalsObject,
+    expect: (0, _jestExpect.default)(globalConfig)
+  }; // TODO: `jest-circus` might be newer than `jest-runtime` - remove `?.` for Jest 27
+
+  setGlobalsForRuntime === null || setGlobalsForRuntime === void 0
+    ? void 0
+    : setGlobalsForRuntime(runtimeGlobals); // TODO: `jest-circus` might be newer than `jest-config` - remove `??` for Jest 27
+
+  if (
+    (_config$injectGlobals = config.injectGlobals) !== null &&
+    _config$injectGlobals !== void 0
+      ? _config$injectGlobals
+      : true
+  ) {
+    Object.assign(environment.global, runtimeGlobals);
+  }
+
   await (0, _state.dispatch)({
     name: 'setup',
     parentProcess,
+    runtimeGlobals,
     testNamePattern: globalConfig.testNamePattern
   });
 
@@ -113,9 +137,7 @@
   config.snapshotSerializers
     .concat()
     .reverse()
-    .forEach(path => {
-      (0, _jestSnapshot.addSerializer)(localRequire(path));
-    });
+    .forEach(path => (0, _jestSnapshot.addSerializer)(localRequire(path)));
   const {expand, updateSnapshot} = globalConfig;
   const snapshotResolver = (0, _jestSnapshot.buildSnapshotResolver)(config);
   const snapshotPath = snapshotResolver.resolveSnapshotPath(testPath);
@@ -124,7 +146,8 @@
     getBabelTraverse,
     getPrettier,
     updateSnapshot
-  });
+  }); // @ts-expect-error: snapshotState is a jest extension of `expect`
+
   (0, _expect.setState)({
     snapshotState,
     testPath
@@ -138,7 +161,7 @@
   } // Return it back to the outer scope (test runner outside the VM).
 
   return {
-    globals: _.default,
+    globals: globalsObject,
     snapshotState
   };
 };
diff --git a/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestExpect.d.ts b/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestExpect.d.ts
index 0557578..4bdcb51 100644
--- a/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestExpect.d.ts
+++ b/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestExpect.d.ts
@@ -4,7 +4,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
-declare const _default: (config: {
-    expand: boolean;
-}) => void;
+import type { Config } from '@jest/types';
+import expect = require('expect');
+export declare type Expect = typeof expect;
+declare const _default: (config: Pick<Config.GlobalConfig, 'expand'>) => Expect;
 export default _default;
diff --git a/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestExpect.js b/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestExpect.js
index eb7a48f..a4cd100 100644
--- a/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestExpect.js
+++ b/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestExpect.js
@@ -20,8 +20,6 @@
  * LICENSE file in the root directory of this source tree.
  */
 var _default = config => {
-  global.expect = _expect.default;
-
   _expect.default.setState({
     expand: config.expand
   });
@@ -35,6 +33,7 @@
   });
 
   _expect.default.addSnapshotSerializer = _jestSnapshot.addSerializer;
+  return _expect.default;
 };
 
 exports.default = _default;
diff --git a/node_modules/jest-circus/build/utils.d.ts b/node_modules/jest-circus/build/utils.d.ts
index 2bd4ea2..f7d9ef4 100644
--- a/node_modules/jest-circus/build/utils.d.ts
+++ b/node_modules/jest-circus/build/utils.d.ts
@@ -22,7 +22,7 @@
 export declare const callAsyncCircusFn: (fn: Circus.AsyncFn, testContext: Circus.TestContext | undefined, asyncError: Circus.Exception, { isHook, timeout }: {
     isHook?: boolean | null | undefined;
     timeout: number;
-}) => Promise<any>;
+}) => Promise<unknown>;
 export declare const getTestDuration: (test: Circus.TestEntry) => number | null;
 export declare const makeRunResult: (describeBlock: Circus.DescribeBlock, unhandledErrors: Array<Error>) => Circus.RunResult;
 export declare const makeSingleTestResult: (test: Circus.TestEntry) => Circus.TestResult;
diff --git a/node_modules/jest-circus/build/utils.js b/node_modules/jest-circus/build/utils.js
index cf02824..5371ae0 100644
--- a/node_modules/jest-circus/build/utils.js
+++ b/node_modules/jest-circus/build/utils.js
@@ -6,6 +6,8 @@
 exports.invariant = invariant;
 exports.parseSingleTestResult = exports.addErrorToEachTestUnderDescribe = exports.getTestID = exports.makeSingleTestResult = exports.makeRunResult = exports.getTestDuration = exports.callAsyncCircusFn = exports.describeBlockHasTests = exports.getEachHooksForTest = exports.getAllHooksForDescribe = exports.makeTest = exports.makeDescribe = void 0;
 
+var path = _interopRequireWildcard(require('path'));
+
 var _jestUtil = require('jest-util');
 
 var _isGeneratorFn = _interopRequireDefault(require('is-generator-fn'));
@@ -24,6 +26,48 @@
   return obj && obj.__esModule ? obj : {default: obj};
 }
 
+function _getRequireWildcardCache() {
+  if (typeof WeakMap !== 'function') return null;
+  var cache = new WeakMap();
+  _getRequireWildcardCache = function () {
+    return cache;
+  };
+  return cache;
+}
+
+function _interopRequireWildcard(obj) {
+  if (obj && obj.__esModule) {
+    return obj;
+  }
+  if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
+    return {default: obj};
+  }
+  var cache = _getRequireWildcardCache();
+  if (cache && cache.has(obj)) {
+    return cache.get(obj);
+  }
+  var newObj = {};
+  var hasPropertyDescriptor =
+    Object.defineProperty && Object.getOwnPropertyDescriptor;
+  for (var key in obj) {
+    if (Object.prototype.hasOwnProperty.call(obj, key)) {
+      var desc = hasPropertyDescriptor
+        ? Object.getOwnPropertyDescriptor(obj, key)
+        : null;
+      if (desc && (desc.get || desc.set)) {
+        Object.defineProperty(newObj, key, desc);
+      } else {
+        newObj[key] = obj[key];
+      }
+    }
+  }
+  newObj.default = obj;
+  if (cache) {
+    cache.set(obj, newObj);
+  }
+  return newObj;
+}
+
 var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;
 var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol;
 var jestNow = global[Symbol.for('jest-native-now')] || global.Date.now;
@@ -32,6 +76,7 @@
 const stackUtils = new _stackUtils.default({
   cwd: 'A path that does not exist'
 });
+const jestEachBuildDir = path.dirname(require.resolve('jest-each'));
 
 const makeDescribe = (name, parent, mode) => {
   let _mode = mode;
@@ -304,8 +349,23 @@
   let location = null;
 
   if (includeTestLocationInResult) {
-    const stackLine = test.asyncError.stack.split('\n')[1];
-    const parsedLine = stackUtils.parseLine(stackLine);
+    var _parsedLine, _parsedLine$file;
+
+    const stackLines = test.asyncError.stack.split('\n');
+    const stackLine = stackLines[1];
+    let parsedLine = stackUtils.parseLine(stackLine);
+
+    if (
+      (_parsedLine = parsedLine) === null || _parsedLine === void 0
+        ? void 0
+        : (_parsedLine$file = _parsedLine.file) === null ||
+          _parsedLine$file === void 0
+        ? void 0
+        : _parsedLine$file.startsWith(jestEachBuildDir)
+    ) {
+      const stackLine = stackLines[4];
+      parsedLine = stackUtils.parseLine(stackLine);
+    }
 
     if (
       parsedLine &&
diff --git a/node_modules/jest-circus/node_modules/@babel/parser/CHANGELOG.md b/node_modules/jest-circus/node_modules/@babel/parser/CHANGELOG.md
deleted file mode 100644
index 8a43406..0000000
--- a/node_modules/jest-circus/node_modules/@babel/parser/CHANGELOG.md
+++ /dev/null
@@ -1,1073 +0,0 @@
-# Changelog
-
-> **Tags:**
-> - :boom:       [Breaking Change]
-> - :eyeglasses: [Spec Compliance]
-> - :rocket:     [New Feature]
-> - :bug:        [Bug Fix]
-> - :memo:       [Documentation]
-> - :house:      [Internal]
-> - :nail_care:  [Polish]
-
-> Semver Policy: https://github.com/babel/babel/tree/master/packages/babel-parser#semver
-
-_Note: Gaps between patch versions are faulty, broken or test releases._
-
-See the [Babel Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) for the pre-6.8.0 version Changelog.
-
-## 6.17.1 (2017-05-10)
-
-### :bug: Bug Fix
- * Fix typo in flow spread operator error (Brian Ng)
- * Fixed invalid number literal parsing ([#473](https://github.com/babel/babylon/pull/473)) (Alex Kuzmenko)
- * Fix number parser ([#433](https://github.com/babel/babylon/pull/433)) (Alex Kuzmenko)
- * Ensure non pattern shorthand props are checked for reserved words ([#479](https://github.com/babel/babylon/pull/479)) (Brian Ng)
- * Remove jsx context when parsing arrow functions ([#475](https://github.com/babel/babylon/pull/475)) (Brian Ng)
- * Allow super in class properties ([#499](https://github.com/babel/babylon/pull/499)) (Brian Ng)
- * Allow flow class field to be named constructor ([#510](https://github.com/babel/babylon/pull/510)) (Brian Ng)
-
-## 6.17.0 (2017-04-20)
-
-### :bug: Bug Fix
- * Cherry-pick #418 to 6.x ([#476](https://github.com/babel/babylon/pull/476)) (Sebastian McKenzie)
- * Add support for invalid escapes in tagged templates ([#274](https://github.com/babel/babylon/pull/274)) (Kevin Gibbons)
- * Throw error if new.target is used outside of a function ([#402](https://github.com/babel/babylon/pull/402)) (Brian Ng)
- * Fix parsing of class properties ([#351](https://github.com/babel/babylon/pull/351)) (Kevin Gibbons)
- * Fix parsing yield with dynamicImport ([#383](https://github.com/babel/babylon/pull/383)) (Brian Ng)
- * Ensure consistent start args for parseParenItem ([#386](https://github.com/babel/babylon/pull/386)) (Brian Ng)
-
-## 7.0.0-beta.8 (2017-04-04)
-
-### New Feature
-* Add support for flow type spread (#418) (Conrad Buck)
-* Allow statics in flow interfaces (#427) (Brian Ng)
-
-### Bug Fix
-* Fix predicate attachment to match flow parser (#428) (Brian Ng)
-* Add extra.raw back to JSXText and JSXAttribute (#344) (Alex Rattray)
-* Fix rest parameters with array and objects (#424) (Brian Ng)
-* Fix number parser (#433) (Alex Kuzmenko)
-
-### Docs
-* Fix CONTRIBUTING.md [skip ci] (#432) (Alex Kuzmenko)
-
-### Internal
-* Use babel-register script when running babel smoke tests (#442) (Brian Ng)
-
-## 7.0.0-beta.7 (2017-03-22)
-
-### Spec Compliance
-* Remove babylon plugin for template revision since it's stage-4 (#426) (Henry Zhu)
-
-### Bug Fix
-
-* Fix push-pop logic in flow (#405) (Daniel Tschinder)
-
-## 7.0.0-beta.6 (2017-03-21)
-
-### New Feature
-* Add support for invalid escapes in tagged templates (#274) (Kevin Gibbons)
-
-### Polish
-* Improves error message when super is called outside of constructor (#408) (Arshabh Kumar Agarwal)
-
-### Docs
-
-* [7.0] Moved value field in spec from ObjectMember to ObjectProperty as ObjectMethod's don't have it (#415) [skip ci] (James Browning)
-
-## 7.0.0-beta.5 (2017-03-21)
-
-### Bug Fix
-* Throw error if new.target is used outside of a function (#402) (Brian Ng)
-* Fix parsing of class properties (#351) (Kevin Gibbons)
-
-### Other
- * Test runner: Detect extra property in 'actual' but not in 'expected'. (#407) (Andy)
- * Optimize travis builds (#419) (Daniel Tschinder)
- * Update codecov to 2.0 (#412) (Daniel Tschinder)
- * Fix spec for ClassMethod: It doesn't have a function, it *is* a function. (#406) [skip ci] (Andy)
- * Changed Non-existent RestPattern to RestElement which is what is actually parsed (#409) [skip ci] (James Browning)
- * Upgrade flow to 0.41 (Daniel Tschinder)
- * Fix watch command (#403) (Brian Ng)
- * Update yarn lock (Daniel Tschinder)
- * Fix watch command (#403) (Brian Ng)
- * chore(package): update flow-bin to version 0.41.0 (#395) (greenkeeper[bot])
- * Add estree test for correct order of directives (Daniel Tschinder)
- * Add DoExpression to spec (#364) (Alex Kuzmenko)
- * Mention cloning of repository in CONTRIBUTING.md (#391) [skip ci] (Sumedh Nimkarde)
- * Explain how to run only one test (#389) [skip ci] (Aaron Ang)
-
- ## 7.0.0-beta.4 (2017-03-01)
-
-* Don't consume async when checking for async func decl (#377) (Brian Ng)
-* add `ranges` option [skip ci] (Henry Zhu)
-* Don't parse class properties without initializers when classProperties is disabled and Flow is enabled (#300) (Andrew Levine)
-
-## 7.0.0-beta.3 (2017-02-28)
-
-- [7.0] Change RestProperty/SpreadProperty to RestElement/SpreadElement (#384)
-- Merge changes from 6.x
-
-## 7.0.0-beta.2 (2017-02-20)
-
-- estree: correctly change literals in all cases (#368) (Daniel Tschinder)
-
-## 7.0.0-beta.1 (2017-02-20)
-
-- Fix negative number literal typeannotations (#366) (Daniel Tschinder)
-- Update contributing with more test info [skip ci] (#355) (Brian Ng)
-
-## 7.0.0-beta.0 (2017-02-15)
-
-- Reintroduce Variance node (#333) (Daniel Tschinder)
-- Rename NumericLiteralTypeAnnotation to NumberLiteralTypeAnnotation (#332) (Charles Pick)
-- [7.0] Remove ForAwaitStatement, add await flag to ForOfStatement (#349) (Brandon Dail)
-- chore(package): update ava to version 0.18.0 (#345) (greenkeeper[bot])
-- chore(package): update babel-plugin-istanbul to version 4.0.0 (#350) (greenkeeper[bot])
-- Change location of ObjectTypeIndexer to match flow (#228) (Daniel Tschinder)
-- Rename flow AST Type ExistentialTypeParam to ExistsTypeAnnotation (#322) (Toru Kobayashi)
-- Revert "Temporary rollback for erroring on trailing comma with spread (#154)" (#290) (Daniel Tschinder)
-- Remove classConstructorCall plugin (#291) (Brian Ng)
-- Update yarn.lock (Daniel Tschinder)
-- Update cross-env to 3.x (Daniel Tschinder)
-- [7.0] Remove node 0.10, 0.12 and 5 from Travis (#284) (Sergey Rubanov)
-- Remove `String.fromCodePoint` shim (#279) (Mathias Bynens)
-
-## 6.16.1 (2017-02-23)
-
-### :bug: Regression
-
-- Revert "Fix export default async function to be FunctionDeclaration" ([#375](https://github.com/babel/babylon/pull/375))
-
-Need to modify Babel for this AST node change, so moving to 7.0.
-
-- Revert "Don't parse class properties without initializers when classProperties plugin is disabled, and Flow is enabled" ([#376](https://github.com/babel/babylon/pull/376))
-
-[react-native](https://github.com/facebook/react-native/issues/12542) broke with this so we reverted.
-
-## 6.16.0 (2017-02-23)
-
-### :rocket: New Feature
-
-***ESTree*** compatibility as plugin ([#277](https://github.com/babel/babylon/pull/277)) (Daniel Tschinder)
-
-We finally introduce a new compatibility layer for ESTree. To put babylon into ESTree-compatible mode the new plugin `estree` can be enabled. In this mode the parser will output an AST that is compliant to the specs of [ESTree](https://github.com/estree/estree/)
-
-We highly recommend everyone who uses babylon outside of babel to use this plugin. This will make it much easier for users to switch between different ESTree-compatible parsers. We so far tested several projects with different parsers and exchanged their parser to babylon and in nearly all cases it worked out of the box. Some other estree-compatible parsers include `acorn`, `esprima`, `espree`, `flow-parser`, etc.
-
-To enable `estree` mode simply add the plugin in the config:
-```json
-{
-  "plugins": [ "estree" ]
-}
-```
-
-If you want to migrate your project from non-ESTree mode to ESTree, have a look at our [Readme](https://github.com/babel/babylon/#output), where all deviations are mentioned.
-
-Add a parseExpression public method ([#213](https://github.com/babel/babylon/pull/213)) (jeromew)
-
-Babylon exports a new function to parse a single expression
-
-```js
-import { parseExpression } from 'babylon';
-
-const ast = parseExpression('x || y && z', options);
-```
-
-The returned AST will only consist of the expression. The options are the same as for `parse()`
-
-Add startLine option ([#346](https://github.com/babel/babylon/pull/346)) (Raphael Mu)
-
-A new option was added to babylon allowing to change the initial linenumber for the first line which is usually `1`.
-Changing this for example to `100` will make line `1` of the input source to be marked as line `100`, line `2` as `101`, line `3` as `102`, ...
-
-Function predicate declaration ([#103](https://github.com/babel/babylon/pull/103)) (Panagiotis Vekris)
-
-Added support for function predicates which flow introduced in version 0.33.0
-
-```js
-declare function is_number(x: mixed): boolean %checks(typeof x === "number");
-```
-
-Allow imports in declare module ([#315](https://github.com/babel/babylon/pull/315)) (Daniel Tschinder)
-
-Added support for imports within module declarations which flow introduced in version 0.37.0
-
-```js
-declare module "C" {
-  import type { DT } from "D";
-  declare export type CT = { D: DT };
-}
-```
-
-### :eyeglasses: Spec Compliance
-
-Forbid semicolons after decorators in classes ([#352](https://github.com/babel/babylon/pull/352)) (Kevin Gibbons)
-
-This example now correctly throws an error when there is a semicolon after the decorator:
-
-```js
-class A {
-@a;
-foo(){}
-}
-```
-
-Keywords are not allowed as local specifier ([#307](https://github.com/babel/babylon/pull/307)) (Daniel Tschinder)
-
-Using keywords in imports is not allowed anymore:
-
-```js
-import { default } from "foo";
-import { a as debugger } from "foo";
-```
-
-Do not allow overwritting of primitive types ([#314](https://github.com/babel/babylon/pull/314)) (Daniel Tschinder)
-
-In flow it is now forbidden to overwrite the primitive types `"any"`, `"mixed"`, `"empty"`, `"bool"`, `"boolean"`, `"number"`, `"string"`, `"void"` and `"null"` with your own type declaration.
-
-Disallow import type { type a } from … ([#305](https://github.com/babel/babylon/pull/305)) (Daniel Tschinder)
-
-The following code now correctly throws an error
-
-```js
-import type { type a } from "foo";
-```
-
-Don't parse class properties without initializers when classProperties is disabled and Flow is enabled ([#300](https://github.com/babel/babylon/pull/300)) (Andrew Levine)
-
-Ensure that you enable the `classProperties` plugin in order to enable correct parsing of class properties. Prior to this version it was possible to parse them by enabling the `flow` plugin but this was not intended the behaviour.
-
-If you enable the flow plugin you can only define the type of the class properties, but not initialize them.
-
-Fix export default async function to be FunctionDeclaration ([#324](https://github.com/babel/babylon/pull/324)) (Daniel Tschinder)
-
-Parsing the following code now returns a `FunctionDeclaration` AST node instead of `FunctionExpression`.
-
-```js
-export default async function bar() {};
-```
-
-### :nail_care: Polish
-
-Improve error message on attempt to destructure named import ([#288](https://github.com/babel/babylon/pull/288)) (Brian Ng)
-
-### :bug: Bug Fix
-
-Fix negative number literal typeannotations ([#366](https://github.com/babel/babylon/pull/366)) (Daniel Tschinder)
-
-Ensure takeDecorators is called on exported class ([#358](https://github.com/babel/babylon/pull/358)) (Brian Ng)
-
-ESTree: correctly change literals in all cases ([#368](https://github.com/babel/babylon/pull/368)) (Daniel Tschinder)
-
-Correctly convert RestProperty to Assignable ([#339](https://github.com/babel/babylon/pull/339)) (Daniel Tschinder)
-
-Fix #321 by allowing question marks in type params ([#338](https://github.com/babel/babylon/pull/338)) (Daniel Tschinder)
-
-Fix #336 by correctly setting arrow-param ([#337](https://github.com/babel/babylon/pull/337)) (Daniel Tschinder)
-
-Fix parse error when destructuring `set` with default value ([#317](https://github.com/babel/babylon/pull/317)) (Brian Ng)
-
-Fix ObjectTypeCallProperty static ([#298](https://github.com/babel/babylon/pull/298)) (Dan Harper)
-
-
-### :house: Internal
-
-Fix generator-method-with-computed-name spec ([#360](https://github.com/babel/babylon/pull/360)) (Alex Rattray)
-
-Fix flow type-parameter-declaration test with unintended semantic ([#361](https://github.com/babel/babylon/pull/361)) (Alex Rattray)
-
-Cleanup and splitup parser functions ([#295](https://github.com/babel/babylon/pull/295)) (Daniel Tschinder)
-
-chore(package): update flow-bin to version 0.38.0 ([#313](https://github.com/babel/babylon/pull/313)) (greenkeeper[bot])
-
-Call inner function instead of 1:1 copy to plugin ([#294](https://github.com/babel/babylon/pull/294)) (Daniel Tschinder)
-
-Update eslint-config-babel to the latest version 🚀 ([#299](https://github.com/babel/babylon/pull/299)) (greenkeeper[bot])
-
-Update eslint-config-babel to the latest version 🚀 ([#293](https://github.com/babel/babylon/pull/293)) (greenkeeper[bot])
-
-devDeps: remove eslint-plugin-babel ([#292](https://github.com/babel/babylon/pull/292)) (Kai Cataldo)
-
-Correct indent eslint rule config ([#276](https://github.com/babel/babylon/pull/276)) (Daniel Tschinder)
-
-Fail tests that have expected.json and throws-option ([#285](https://github.com/babel/babylon/pull/285)) (Daniel Tschinder)
-
-### :memo: Documentation
-
-Update contributing with more test info [skip ci] ([#355](https://github.com/babel/babylon/pull/355)) (Brian Ng)
-
-Update API documentation ([#330](https://github.com/babel/babylon/pull/330)) (Timothy Gu)
-
-Added keywords to package.json ([#323](https://github.com/babel/babylon/pull/323)) (Dmytro)
-
-AST spec: fix casing of `RegExpLiteral` ([#318](https://github.com/babel/babylon/pull/318)) (Mathias Bynens)
-
-## 6.15.0 (2017-01-10)
-
-### :eyeglasses: Spec Compliance
-
-Add support for Flow shorthand import type ([#267](https://github.com/babel/babylon/pull/267)) (Jeff Morrison)
-
-This change implements flows new shorthand import syntax
-and where previously you had to write this code:
-
-```js
-import {someValue} from "blah";
-import type {someType} from "blah";
-import typeof {someOtherValue} from "blah";
-```
-
-you can now write it like this:
-
-```js
-import {
-  someValue,
-  type someType,
-  typeof someOtherValue,
-} from "blah";
-```
-
-For more information look at [this](https://github.com/facebook/flow/pull/2890) pull request.
-
-flow: allow leading pipes in all positions ([#256](https://github.com/babel/babylon/pull/256)) (Vladimir Kurchatkin)
-
-This change now allows a leading pipe everywhere types can be used:
-```js
-var f = (x): | 1 | 2 => 1;
-```
-
-Throw error when exporting non-declaration ([#241](https://github.com/babel/babylon/pull/241)) (Kai Cataldo)
-
-Previously babylon parsed the following exports, although they are not valid:
-```js
-export typeof foo;
-export new Foo();
-export function() {};
-export for (;;);
-export while(foo);
-```
-
-### :bug: Bug Fix
-
-Don't set inType flag when parsing property names ([#266](https://github.com/babel/babylon/pull/266)) (Vladimir Kurchatkin)
-
-This fixes parsing of this case:
-
-```js
-const map = {
-  [age <= 17] : 'Too young'
-};
-```
-
-Fix source location for JSXEmptyExpression nodes (fixes #248) ([#249](https://github.com/babel/babylon/pull/249)) (James Long)
-
-The following case produced an invalid AST
-```js
-<div>{/* foo */}</div>
-```
-
-Use fromCodePoint to convert high value unicode entities ([#243](https://github.com/babel/babylon/pull/243)) (Ryan Duffy)
-
-When high value unicode entities (e.g. 💩) were used in the input source code they are now correctly encoded in the resulting AST.
-
-Rename folder to avoid Windows-illegal characters ([#281](https://github.com/babel/babylon/pull/281)) (Ryan Plant)
-
-Allow this.state.clone() when parsing decorators ([#262](https://github.com/babel/babylon/pull/262)) (Alex Rattray)
-
-### :house: Internal
-
-User external-helpers ([#254](https://github.com/babel/babylon/pull/254)) (Daniel Tschinder)
-
-Add watch script for dev ([#234](https://github.com/babel/babylon/pull/234)) (Kai Cataldo)
-
-Freeze current plugins list for "*" option, and remove from README.md ([#245](https://github.com/babel/babylon/pull/245)) (Andrew Levine)
-
-Prepare tests for multiple fixture runners. ([#240](https://github.com/babel/babylon/pull/240)) (Daniel Tschinder)
-
-Add some test coverage for decorators stage-0 plugin ([#250](https://github.com/babel/babylon/pull/250)) (Andrew Levine)
-
-Refactor tokenizer types file ([#263](https://github.com/babel/babylon/pull/263)) (Sven SAULEAU)
-
-Update eslint-config-babel to the latest version 🚀 ([#273](https://github.com/babel/babylon/pull/273)) (greenkeeper[bot])
-
-chore(package): update rollup to version 0.41.0 ([#272](https://github.com/babel/babylon/pull/272)) (greenkeeper[bot])
-
-chore(package): update flow-bin to version 0.37.0 ([#255](https://github.com/babel/babylon/pull/255)) (greenkeeper[bot])
-
-## 6.14.1 (2016-11-17)
-
-### :bug: Bug Fix
-
-Allow `"plugins": ["*"]` ([#229](https://github.com/babel/babylon/pull/229)) (Daniel Tschinder)
-
-```js
-{
-  "plugins": ["*"]
-}
-```
-
-Will include all parser plugins instead of specifying each one individually. Useful for tools like babel-eslint, jscodeshift, and ast-explorer.
-
-## 6.14.0 (2016-11-16)
-
-### :eyeglasses: Spec Compliance
-
-Throw error for reserved words `enum` and `await` ([#195](https://github.com/babel/babylon/pull/195)) (Kai Cataldo)
-
-[11.6.2.2 Future Reserved Words](http://www.ecma-international.org/ecma-262/6.0/#sec-future-reserved-words)
-
-Babylon will throw for more reserved words such as `enum` or `await` (in strict mode).
-
-```
-class enum {} // throws
-class await {} // throws in strict mode (module)
-```
-
-Optional names for function types and object type indexers ([#197](https://github.com/babel/babylon/pull/197)) (Gabe Levi)
-
-So where you used to have to write
-
-```js
-type A = (x: string, y: boolean) => number;
-type B = (z: string) => number;
-type C = { [key: string]: number };
-```
-
-you can now write (with flow 0.34.0)
-
-```js
-type A = (string, boolean) => number;
-type B = string => number;
-type C = { [string]: number };
-```
-
-Parse flow nested array type annotations like `number[][]` ([#219](https://github.com/babel/babylon/pull/219)) (Bernhard Häussner)
-
-Supports these form now of specifying array types:
-
-```js
-var a: number[][][][];
-var b: string[][];
-```
-
-### :bug: Bug Fix
-
-Correctly eat semicolon at the end of `DelcareModuleExports` ([#223](https://github.com/babel/babylon/pull/223))  (Daniel Tschinder)
-
-```
-declare module "foo" { declare module.exports: number }
-declare module "foo" { declare module.exports: number; }  // also allowed now
-```
-
-### :house: Internal
-
- * Count Babel tests towards Babylon code coverage ([#182](https://github.com/babel/babylon/pull/182)) (Moti Zilberman)
- * Fix strange line endings ([#214](https://github.com/babel/babylon/pull/214)) (Thomas Grainger)
- * Add node 7 (Daniel Tschinder)
- * chore(package): update flow-bin to version 0.34.0 ([#204](https://github.com/babel/babylon/pull/204)) (Greenkeeper)
-
-## v6.13.1 (2016-10-26)
-
-### :nail_care: Polish
-
-- Use rollup for bundling to speed up startup time ([#190](https://github.com/babel/babylon/pull/190)) ([@drewml](https://github.com/DrewML))
-
-```js
-const babylon = require('babylon');
-const ast = babylon.parse('var foo = "lol";');
-```
-
-With that test case, there was a ~95ms savings by removing the need for node to build/traverse the dependency graph.
-
-**Without bundling**
-![image](https://cloud.githubusercontent.com/assets/5233399/19420264/3133497e-93ad-11e6-9a6a-2da59c4f5c13.png)
-
-**With bundling**
-![image](https://cloud.githubusercontent.com/assets/5233399/19420267/388f556e-93ad-11e6-813e-7c5c396be322.png)
-
-- add clean command [skip ci] ([#201](https://github.com/babel/babylon/pull/201)) (Henry Zhu)
-- add ForAwaitStatement (async generator already added) [skip ci] ([#196](https://github.com/babel/babylon/pull/196)) (Henry Zhu)
-
-## v6.13.0 (2016-10-21)
-
-### :eyeglasses: Spec Compliance
-
-Property variance type annotations for Flow plugin ([#161](https://github.com/babel/babylon/pull/161)) (Sam Goldman)
-
-> See https://flowtype.org/docs/variance.html for more information
-
-```js
-type T = { +p: T };
-interface T { -p: T };
-declare class T { +[k:K]: V };
-class T { -[k:K]: V };
-class C2 { +p: T = e };
-```
-
-Raise error on duplicate definition of __proto__ ([#183](https://github.com/babel/babylon/pull/183)) (Moti Zilberman)
-
-```js
-({ __proto__: 1, __proto__: 2 }) // Throws an error now
-```
-
-### :bug: Bug Fix
-
-Flow: Allow class properties to be named `static` ([#184](https://github.com/babel/babylon/pull/184)) (Moti Zilberman)
-
-```js
-declare class A {
-  static: T;
-}
-```
-
-Allow "async" as identifier for object literal property shorthand ([#187](https://github.com/babel/babylon/pull/187)) (Andrew Levine)
-
-```js
-var foo = { async, bar };
-```
-
-### :nail_care: Polish
-
-Fix flowtype and add inType to state ([#189](https://github.com/babel/babylon/pull/189)) (Daniel Tschinder)
-
-> This improves the performance slightly (because of hidden classes)
-
-### :house: Internal
-
-Fix .gitattributes line ending setting ([#191](https://github.com/babel/babylon/pull/191)) (Moti Zilberman)
-
-Increase test coverage ([#175](https://github.com/babel/babylon/pull/175) (Moti Zilberman)
-
-Readd missin .eslinignore for IDEs (Daniel Tschinder)
-
-Error on missing expected.json fixture in CI ([#188](https://github.com/babel/babylon/pull/188)) (Moti Zilberman)
-
-Add .gitattributes and .editorconfig for LF line endings ([#179](https://github.com/babel/babylon/pull/179)) (Moti Zilberman)
-
-Fixes two tests that are failing after the merge of #172 ([#177](https://github.com/babel/babylon/pull/177)) (Moti Zilberman)
-
-## v6.12.0 (2016-10-14)
-
-### :eyeglasses: Spec Compliance
-
-Implement import() syntax ([#163](https://github.com/babel/babylon/pull/163)) (Jordan Gensler)
-
-#### Dynamic Import
-
-- Proposal Repo: https://github.com/domenic/proposal-dynamic-import
-- Championed by [@domenic](https://github.com/domenic)
-- stage-2
-- [sept-28 tc39 notes](https://github.com/rwaldron/tc39-notes/blob/master/es7/2016-09/sept-28.md#113a-import)
-
-> This repository contains a proposal for adding a "function-like" import() module loading syntactic form to JavaScript
-
-```js
-import(`./section-modules/${link.dataset.entryModule}.js`)
-.then(module => {
-  module.loadPageInto(main);
-})
-```
-
-Add EmptyTypeAnnotation ([#171](https://github.com/babel/babylon/pull/171)) (Sam Goldman)
-
-#### EmptyTypeAnnotation
-
-Just wasn't covered before.
-
-```js
-type T = empty;
-```
-
-### :bug: Bug Fix
-
-Fix crash when exporting with destructuring and sparse array ([#170](https://github.com/babel/babylon/pull/170)) (Jeroen Engels)
-
-```js
-// was failing due to sparse array
-export const { foo: [ ,, qux7 ] } = bar;
-```
-
-Allow keyword in Flow object declaration property names with type parameters ([#146](https://github.com/babel/babylon/pull/146)) (Dan Harper)
-
-```js
-declare class X {
-  foobar<T>(): void;
-  static foobar<T>(): void;
-}
-```
-
-Allow keyword in object/class property names with Flow type parameters ([#145](https://github.com/babel/babylon/pull/145)) (Dan Harper)
-
-```js
-class Foo {
-  delete<T>(item: T): T {
-    return item;
-  }
-}
-```
-
-Allow typeAnnotations for yield expressions ([#174](https://github.com/babel/babylon/pull/174))) (Daniel Tschinder)
-
-```js
-function *foo() {
-  const x = (yield 5: any);
-}
-```
-
-### :nail_care: Polish
-
-Annotate more errors with expected token ([#172](https://github.com/babel/babylon/pull/172))) (Moti Zilberman)
-
-```js
-// Unexpected token, expected ; (1:6)
-{ set 1 }
-```
-
-### :house: Internal
-
-Remove kcheck ([#173](https://github.com/babel/babylon/pull/173)))  (Daniel Tschinder)
-
-Also run flow, linting, babel tests on separate instances (add back node 0.10)
-
-## v6.11.6 (2016-10-12)
-
-### :bug: Bug Fix/Regression
-
-Fix crash when exporting with destructuring and sparse array ([#170](https://github.com/babel/babylon/pull/170)) (Jeroen Engels)
-
-```js
-// was failing with `Cannot read property 'type' of null` because of null identifiers
-export const { foo: [ ,, qux7 ] } = bar;
-```
-
-## v6.11.5 (2016-10-12)
-
-### :eyeglasses: Spec Compliance
-
-Fix: Check for duplicate named exports in exported destructuring assignments ([#144](https://github.com/babel/babylon/pull/144)) (Kai Cataldo)
-
-```js
-// `foo` has already been exported. Exported identifiers must be unique. (2:20)
-export function foo() {};
-export const { a: [{foo}] } = bar;
-```
-
-Fix: Check for duplicate named exports in exported rest elements/properties ([#164](https://github.com/babel/babylon/pull/164)) (Kai Cataldo)
-
-```js
-// `foo` has already been exported. Exported identifiers must be unique. (2:22)
-export const foo = 1;
-export const [bar, ...foo] = baz;
-```
-
-### :bug: Bug Fix
-
-Fix: Allow identifier `async` for default param in arrow expression ([#165](https://github.com/babel/babylon/pull/165)) (Kai Cataldo)
-
-```js
-// this is ok now
-const test = ({async = true}) => {};
-```
-
-### :nail_care: Polish
-
-Babylon will now print out the token it's expecting if there's a `SyntaxError` ([#150](https://github.com/babel/babylon/pull/150)) (Daniel Tschinder)
-
-```bash
-# So in the case of a missing ending curly (`}`)
-Module build failed: SyntaxError: Unexpected token, expected } (30:0)
-  28 |   }
-  29 |
-> 30 |
-     | ^
-```
-
-## v6.11.4 (2016-10-03)
-
-Temporary rollback for erroring on trailing comma with spread (#154) (Henry Zhu)
-
-## v6.11.3 (2016-10-01)
-
-### :eyeglasses: Spec Compliance
-
-Add static errors for object rest (#149) ([@danez](https://github.com/danez))
-
-> https://github.com/sebmarkbage/ecmascript-rest-spread
-
-Object rest copies the *rest* of properties from the right hand side `obj` starting from the left to right.
-
-```js
-let { x, y, ...z } =  { x: 1, y: 2, z: 3 };
-// x = 1
-// y = 2
-// z = { z: 3 }
-```
-
-#### New Syntax Errors:
-
-**SyntaxError**: The rest element has to be the last element when destructuring (1:10)
-```bash
-> 1 | let { ...x, y, z } = { x: 1, y: 2, z: 3};
-    |           ^
-# Previous behavior:
-# x = { x: 1, y: 2, z: 3 }
-# y = 2
-# z = 3
-```
-
-Before, this was just a more verbose way of shallow copying `obj` since it doesn't actually do what you think.
-
-**SyntaxError**: Cannot have multiple rest elements when destructuring (1:13)
-
-```bash
-> 1 | let { x, ...y, ...z } = { x: 1, y: 2, z: 3};
-    |              ^
-# Previous behavior:
-# x = 1
-# y = { y: 2, z: 3 }
-# z = { y: 2, z: 3 }
-```
-
-Before y and z would just be the same value anyway so there is no reason to need to have both.
-
-**SyntaxError**: A trailing comma is not permitted after the rest element (1:16)
-
-```js
-let { x, y, ...z, } = obj;
-```
-
-The rationale for this is that the use case for trailing comma is that you can add something at the end without affecting the line above. Since a RestProperty always has to be the last property it doesn't make sense.
-
----
-
-get / set are valid property names in default assignment (#142) ([@jezell](https://github.com/jezell))
-
-```js
-// valid
-function something({ set = null, get = null }) {}
-```
-
-## v6.11.2 (2016-09-23)
-
-### Bug Fix
-
-- [#139](https://github.com/babel/babylon/issues/139) Don't do the duplicate check if not an identifier (#140) @hzoo
-
-```js
-// regression with duplicate export check
-SyntaxError: ./typography.js: `undefined` has already been exported. Exported identifiers must be unique. (22:13)
-  20 |
-  21 | export const { rhythm } = typography;
-> 22 | export const { TypographyStyle } = typography
-```
-
-Bail out for now, and make a change to account for destructuring in the next release.
-
-## 6.11.1 (2016-09-22)
-
-### Bug Fix
-- [#137](https://github.com/babel/babylon/pull/137) - Fix a regression with duplicate exports - it was erroring on all keys in `Object.prototype`. @danez
-
-```javascript
-export toString from './toString';
-```
-
-```bash
-`toString` has already been exported. Exported identifiers must be unique. (1:7)
-> 1 | export toString from './toString';
-    |        ^
-  2 |
-```
-
-## 6.11.0 (2016-09-22)
-
-### Spec Compliance (will break CI)
-
-- Disallow duplicate named exports ([#107](https://github.com/babel/babylon/pull/107)) @kaicataldo
-
-```js
-// Only one default export allowed per module. (2:9)
-export default function() {};
-export { foo as default };
-
-// Only one default export allowed per module. (2:0)
-export default {};
-export default function() {};
-
-// `Foo` has already been exported. Exported identifiers must be unique. (2:0)
-export { Foo };
-export class Foo {};
-```
-
-### New Feature (Syntax)
-
-- Add support for computed class property names ([#121](https://github.com/babel/babylon/pull/121)) @motiz88
-
-```js
-// AST
-interface ClassProperty <: Node {
-  type: "ClassProperty";
-  key: Identifier;
-  value: Expression;
-  computed: boolean; // added
-}
-```
-
-```js
-// with "plugins": ["classProperties"]
-class Foo {
-  [x]
-  ['y']
-}
-
-class Bar {
-  [p]
-  [m] () {}
-}
- ```
-
-### Bug Fix
-
-- Fix `static` property falling through in the declare class Flow AST ([#135](https://github.com/babel/babylon/pull/135)) @danharper
-
-```js
-declare class X {
-    a: number;
-    static b: number; // static
-    c: number; // this was being marked as static in the AST as well
-}
-```
-
-### Polish
-
-- Rephrase "assigning/binding to rvalue" errors to include context ([#119](https://github.com/babel/babylon/pull/119)) @motiz88
-
-```js
-// Used to error with:
-// SyntaxError: Assigning to rvalue (1:0)
-
-// Now:
-// Invalid left-hand side in assignment expression (1:0)
-3 = 4
-
-// Invalid left-hand side in for-in statement (1:5)
-for (+i in {});
-```
-
-### Internal
-
-- Fix call to `this.parseMaybeAssign` with correct arguments ([#133](https://github.com/babel/babylon/pull/133)) @danez
-- Add semver note to changelog ([#131](https://github.com/babel/babylon/pull/131)) @hzoo
-
-## 6.10.0 (2016-09-19)
-
-> We plan to include some spec compliance bugs in patch versions. An example was the multiple default exports issue.
-
-### Spec Compliance
-
-* Implement ES2016 check for simple parameter list in strict mode ([#106](https://github.com/babel/babylon/pull/106)) (Timothy Gu)
-
-> It is a Syntax Error if ContainsUseStrict of FunctionBody is true and IsSimpleParameterList of FormalParameters is false. https://tc39.github.io/ecma262/2016/#sec-function-definitions-static-semantics-early-errors
-
-More Context: [tc39-notes](https://github.com/rwaldron/tc39-notes/blob/master/es7/2015-07/july-29.md#611-the-scope-of-use-strict-with-respect-to-destructuring-in-parameter-lists)
-
-For example:
-
-```js
-// this errors because it uses destructuring and default parameters
-// in a function with a "use strict" directive
-function a([ option1, option2 ] = []) {
-  "use strict";
-}
- ```
-
-The solution would be to use a top level "use strict" or to remove the destructuring or default parameters when using a function + "use strict" or to.
-
-### New Feature
-
-* Exact object type annotations for Flow plugin ([#104](https://github.com/babel/babylon/pull/104)) (Basil Hosmer)
-
-Added to flow in https://github.com/facebook/flow/commit/c710c40aa2a115435098d6c0dfeaadb023cd39b8
-
-Looks like:
-
-```js
-var a : {| x: number, y: string |} = { x: 0, y: 'foo' };
-```
-
-### Bug Fixes
-
-* Include `typeParameter` location in `ArrowFunctionExpression` ([#126](https://github.com/babel/babylon/pull/126)) (Daniel Tschinder)
-* Error on invalid flow type annotation with default assignment ([#122](https://github.com/babel/babylon/pull/122)) (Dan Harper)
-* Fix Flow return types on arrow functions ([#124](https://github.com/babel/babylon/pull/124)) (Dan Harper)
-
-### Misc
-
-* Add tests for export extensions ([#127](https://github.com/babel/babylon/pull/127)) (Daniel Tschinder)
-* Fix Contributing guidelines [skip ci] (Daniel Tschinder)
-
-## 6.9.2 (2016-09-09)
-
-The only change is to remove the `babel-runtime` dependency by compiling with Babel's ES2015 loose mode. So using babylon standalone should be smaller.
-
-## 6.9.1 (2016-08-23)
-
-This release contains mainly small bugfixes but also updates babylons default mode to es2017. The features for `exponentiationOperator`, `asyncFunctions` and `trailingFunctionCommas` which previously needed to be activated via plugin are now enabled by default and the plugins are now no-ops.
-
-### Bug Fixes
-
-- Fix issues with default object params in async functions ([#96](https://github.com/babel/babylon/pull/96)) @danez
-- Fix issues with flow-types and async function ([#95](https://github.com/babel/babylon/pull/95)) @danez
-- Fix arrow functions with destructuring, types & default value ([#94](https://github.com/babel/babylon/pull/94)) @danharper
-- Fix declare class with qualified type identifier ([#97](https://github.com/babel/babylon/pull/97)) @danez
-- Remove exponentiationOperator, asyncFunctions, trailingFunctionCommas plugins and enable them by default ([#98](https://github.com/babel/babylon/pull/98)) @danez
-
-## 6.9.0 (2016-08-16)
-
-### New syntax support
-
-- Add JSX spread children ([#42](https://github.com/babel/babylon/pull/42)) @calebmer
-
-(Be aware that React is not going to support this syntax)
-
-```js
-<div>
-  {...todos.map(todo => <Todo key={todo.id} todo={todo}/>)}
-</div>
-```
-
-- Add support for declare module.exports ([#72](https://github.com/babel/babylon/pull/72)) @danez
-
-```js
-declare module "foo" {
-  declare module.exports: {}
-}
-```
-
-### New Features
-
-- If supplied, attach filename property to comment node loc. ([#80](https://github.com/babel/babylon/pull/80)) @divmain
-- Add identifier name to node loc field ([#90](https://github.com/babel/babylon/pull/90)) @kittens
-
-### Bug Fixes
-
-- Fix exponential operator to behave according to spec ([#75](https://github.com/babel/babylon/pull/75)) @danez
-- Fix lookahead to not add comments to arrays which are not cloned ([#76](https://github.com/babel/babylon/pull/76)) @danez
-- Fix accidental fall-through in Flow type parsing. ([#82](https://github.com/babel/babylon/pull/82)) @xiemaisi
-- Only allow declares inside declare module ([#73](https://github.com/babel/babylon/pull/73)) @danez
-- Small fix for parsing type parameter declarations ([#83](https://github.com/babel/babylon/pull/83)) @gabelevi
-- Fix arrow param locations with flow types ([#57](https://github.com/babel/babylon/pull/57)) @danez
-- Fixes SyntaxError position with flow optional type ([#65](https://github.com/babel/babylon/pull/65)) @danez
-
-### Internal
-
-- Add codecoverage to tests @danez
-- Fix tests to not save expected output if we expect the test to fail @danez
-- Make a shallow clone of babel for testing @danez
-- chore(package): update cross-env to version 2.0.0 ([#77](https://github.com/babel/babylon/pull/77)) @greenkeeperio-bot
-- chore(package): update ava to version 0.16.0 ([#86](https://github.com/babel/babylon/pull/86)) @greenkeeperio-bot
-- chore(package): update babel-plugin-istanbul to version 2.0.0 ([#89](https://github.com/babel/babylon/pull/89)) @greenkeeperio-bot
-- chore(package): update nyc to version 8.0.0 ([#88](https://github.com/babel/babylon/pull/88)) @greenkeeperio-bot
-
-## 6.8.4 (2016-07-06)
-
-### Bug Fixes
-
-- Fix the location of params, when flow and default value used ([#68](https://github.com/babel/babylon/pull/68)) @danez
-
-## 6.8.3 (2016-07-02)
-
-### Bug Fixes
-
-- Fix performance regression introduced in 6.8.2 with conditionals ([#63](https://github.com/babel/babylon/pull/63)) @danez
-
-## 6.8.2 (2016-06-24)
-
-### Bug Fixes
-
-- Fix parse error with yielding jsx elements in generators `function* it() { yield <a></a>; }` ([#31](https://github.com/babel/babylon/pull/31)) @eldereal
-- When cloning nodes do not clone its comments ([#24](https://github.com/babel/babylon/pull/24)) @danez
-- Fix parse errors when using arrow functions with an spread element and return type `(...props): void => {}` ([#10](https://github.com/babel/babylon/pull/10)) @danez
-- Fix leading comments added from previous node ([#23](https://github.com/babel/babylon/pull/23)) @danez
-- Fix parse errors with flow's optional arguments `(arg?) => {}` ([#19](https://github.com/babel/babylon/pull/19)) @danez
-- Support negative numeric type literals @kittens
-- Remove line terminator restriction after await keyword @kittens
-- Remove grouped type arrow restriction as it seems flow no longer has it @kittens
-- Fix parse error with generic methods that have the name `get` or `set` `class foo { get() {} }` ([#55](https://github.com/babel/babylon/pull/55)) @vkurchatkin
-- Fix parse error with arrow functions that have flow type parameter declarations `<T>(x: T): T => x;` ([#54](https://github.com/babel/babylon/pull/54)) @gabelevi
-
-### Documentation
-
-- Document AST differences from ESTree ([#41](https://github.com/babel/babylon/pull/41)) @nene
-- Move ast spec from babel/babel ([#46](https://github.com/babel/babylon/pull/46)) @hzoo
-
-### Internal
-
-- Enable skipped tests ([#16](https://github.com/babel/babylon/pull/16)) @danez
-- Add script to test latest version of babylon with babel ([#21](https://github.com/babel/babylon/pull/21)) @danez
-- Upgrade test runner ava @kittens
-- Add missing generate-identifier-regex script @kittens
-- Rename parser context types @kittens
-- Add node v6 to travis testing @hzoo
-- Update to Unicode v9 ([#45](https://github.com/babel/babylon/pull/45)) @mathiasbynens
-
-## 6.8.1 (2016-06-06)
-
-### New Feature
-
-- Parse type parameter declarations with defaults like `type Foo<T = string> = T`
-
-### Bug Fixes
-- Type parameter declarations need 1 or more type parameters.
-- The existential type `*` is not a valid type parameter.
-- The existential type `*` is a primary type
-
-### Spec Compliance
-- The param list for type parameter declarations now consists of `TypeParameter` nodes
-- New `TypeParameter` AST Node (replaces using the `Identifier` node before)
-
-```
-interface TypeParameter <: Node {
-  bound: TypeAnnotation;
-  default: TypeAnnotation;
-  name: string;
-  variance: "plus" | "minus";
-}
-```
-
-## 6.8.0 (2016-05-02)
-
-#### New Feature
-
-##### Parse Method Parameter Decorators ([#12](https://github.com/babel/babylon/pull/12))
-
-> [Method Parameter Decorators](https://goo.gl/8MmCMG) is now a TC39 [stage 0 proposal](https://github.com/tc39/ecma262/blob/master/stage0.md).
-
-Examples:
-
-```js
-class Foo {
-  constructor(@foo() x, @bar({ a: 123 }) @baz() y) {}
-}
-
-export default function func(@foo() x, @bar({ a: 123 }) @baz() y) {}
-
-var obj = {
-  method(@foo() x, @bar({ a: 123 }) @baz() y) {}
-};
-```
-
-##### Parse for-await statements (w/ `asyncGenerators` plugin) ([#17](https://github.com/babel/babylon/pull/17))
-
-There is also a new node type, `ForAwaitStatement`.
-
-> [Async generators and for-await](https://github.com/tc39/proposal-async-iteration) are now a [stage 2 proposal](https://github.com/tc39/ecma262#current-proposals).
-
-Example:
-
-```js
-async function f() {
-  for await (let x of y);
-}
-```
diff --git a/node_modules/jest-circus/node_modules/@babel/parser/LICENSE b/node_modules/jest-circus/node_modules/@babel/parser/LICENSE
deleted file mode 100644
index d4c7fc5..0000000
--- a/node_modules/jest-circus/node_modules/@babel/parser/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2012-2014 by various contributors (see AUTHORS)
-
-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/node_modules/jest-circus/node_modules/@babel/parser/README.md b/node_modules/jest-circus/node_modules/@babel/parser/README.md
deleted file mode 100644
index 65092a0..0000000
--- a/node_modules/jest-circus/node_modules/@babel/parser/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# @babel/parser
-
-> A JavaScript parser
-
-See our website [@babel/parser](https://babeljs.io/docs/en/next/babel-parser.html) for more information or the [issues](https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A+parser+%28babylon%29%22+is%3Aopen) associated with this package.
-
-## Install
-
-Using npm:
-
-```sh
-npm install --save-dev @babel/parser
-```
-
-or using yarn:
-
-```sh
-yarn add @babel/parser --dev
-```
diff --git a/node_modules/jest-circus/node_modules/@babel/parser/bin/babel-parser.js b/node_modules/jest-circus/node_modules/@babel/parser/bin/babel-parser.js
deleted file mode 100755
index 3aca314..0000000
--- a/node_modules/jest-circus/node_modules/@babel/parser/bin/babel-parser.js
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env node
-/* eslint no-var: 0 */
-
-var parser = require("..");
-var fs = require("fs");
-
-var filename = process.argv[2];
-if (!filename) {
-  console.error("no filename specified");
-} else {
-  var file = fs.readFileSync(filename, "utf8");
-  var ast = parser.parse(file);
-
-  console.log(JSON.stringify(ast, null, "  "));
-}
diff --git a/node_modules/jest-circus/node_modules/@babel/parser/lib/index.js b/node_modules/jest-circus/node_modules/@babel/parser/lib/index.js
deleted file mode 100644
index 95d1f46..0000000
--- a/node_modules/jest-circus/node_modules/@babel/parser/lib/index.js
+++ /dev/null
@@ -1,12736 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, '__esModule', { value: true });
-
-const beforeExpr = true;
-const startsExpr = true;
-const isLoop = true;
-const isAssign = true;
-const prefix = true;
-const postfix = true;
-class TokenType {
-  constructor(label, conf = {}) {
-    this.label = label;
-    this.keyword = conf.keyword;
-    this.beforeExpr = !!conf.beforeExpr;
-    this.startsExpr = !!conf.startsExpr;
-    this.rightAssociative = !!conf.rightAssociative;
-    this.isLoop = !!conf.isLoop;
-    this.isAssign = !!conf.isAssign;
-    this.prefix = !!conf.prefix;
-    this.postfix = !!conf.postfix;
-    this.binop = conf.binop != null ? conf.binop : null;
-    this.updateContext = null;
-  }
-
-}
-const keywords = new Map();
-
-function createKeyword(name, options = {}) {
-  options.keyword = name;
-  const token = new TokenType(name, options);
-  keywords.set(name, token);
-  return token;
-}
-
-function createBinop(name, binop) {
-  return new TokenType(name, {
-    beforeExpr,
-    binop
-  });
-}
-
-const types = {
-  num: new TokenType("num", {
-    startsExpr
-  }),
-  bigint: new TokenType("bigint", {
-    startsExpr
-  }),
-  regexp: new TokenType("regexp", {
-    startsExpr
-  }),
-  string: new TokenType("string", {
-    startsExpr
-  }),
-  name: new TokenType("name", {
-    startsExpr
-  }),
-  eof: new TokenType("eof"),
-  bracketL: new TokenType("[", {
-    beforeExpr,
-    startsExpr
-  }),
-  bracketHashL: new TokenType("#[", {
-    beforeExpr,
-    startsExpr
-  }),
-  bracketBarL: new TokenType("[|", {
-    beforeExpr,
-    startsExpr
-  }),
-  bracketR: new TokenType("]"),
-  bracketBarR: new TokenType("|]"),
-  braceL: new TokenType("{", {
-    beforeExpr,
-    startsExpr
-  }),
-  braceBarL: new TokenType("{|", {
-    beforeExpr,
-    startsExpr
-  }),
-  braceHashL: new TokenType("#{", {
-    beforeExpr,
-    startsExpr
-  }),
-  braceR: new TokenType("}"),
-  braceBarR: new TokenType("|}"),
-  parenL: new TokenType("(", {
-    beforeExpr,
-    startsExpr
-  }),
-  parenR: new TokenType(")"),
-  comma: new TokenType(",", {
-    beforeExpr
-  }),
-  semi: new TokenType(";", {
-    beforeExpr
-  }),
-  colon: new TokenType(":", {
-    beforeExpr
-  }),
-  doubleColon: new TokenType("::", {
-    beforeExpr
-  }),
-  dot: new TokenType("."),
-  question: new TokenType("?", {
-    beforeExpr
-  }),
-  questionDot: new TokenType("?."),
-  arrow: new TokenType("=>", {
-    beforeExpr
-  }),
-  template: new TokenType("template"),
-  ellipsis: new TokenType("...", {
-    beforeExpr
-  }),
-  backQuote: new TokenType("`", {
-    startsExpr
-  }),
-  dollarBraceL: new TokenType("${", {
-    beforeExpr,
-    startsExpr
-  }),
-  at: new TokenType("@"),
-  hash: new TokenType("#", {
-    startsExpr
-  }),
-  interpreterDirective: new TokenType("#!..."),
-  eq: new TokenType("=", {
-    beforeExpr,
-    isAssign
-  }),
-  assign: new TokenType("_=", {
-    beforeExpr,
-    isAssign
-  }),
-  incDec: new TokenType("++/--", {
-    prefix,
-    postfix,
-    startsExpr
-  }),
-  bang: new TokenType("!", {
-    beforeExpr,
-    prefix,
-    startsExpr
-  }),
-  tilde: new TokenType("~", {
-    beforeExpr,
-    prefix,
-    startsExpr
-  }),
-  pipeline: createBinop("|>", 0),
-  nullishCoalescing: createBinop("??", 1),
-  logicalOR: createBinop("||", 1),
-  logicalAND: createBinop("&&", 2),
-  bitwiseOR: createBinop("|", 3),
-  bitwiseXOR: createBinop("^", 4),
-  bitwiseAND: createBinop("&", 5),
-  equality: createBinop("==/!=/===/!==", 6),
-  relational: createBinop("</>/<=/>=", 7),
-  bitShift: createBinop("<</>>/>>>", 8),
-  plusMin: new TokenType("+/-", {
-    beforeExpr,
-    binop: 9,
-    prefix,
-    startsExpr
-  }),
-  modulo: new TokenType("%", {
-    beforeExpr,
-    binop: 10,
-    startsExpr
-  }),
-  star: createBinop("*", 10),
-  slash: createBinop("/", 10),
-  exponent: new TokenType("**", {
-    beforeExpr,
-    binop: 11,
-    rightAssociative: true
-  }),
-  _break: createKeyword("break"),
-  _case: createKeyword("case", {
-    beforeExpr
-  }),
-  _catch: createKeyword("catch"),
-  _continue: createKeyword("continue"),
-  _debugger: createKeyword("debugger"),
-  _default: createKeyword("default", {
-    beforeExpr
-  }),
-  _do: createKeyword("do", {
-    isLoop,
-    beforeExpr
-  }),
-  _else: createKeyword("else", {
-    beforeExpr
-  }),
-  _finally: createKeyword("finally"),
-  _for: createKeyword("for", {
-    isLoop
-  }),
-  _function: createKeyword("function", {
-    startsExpr
-  }),
-  _if: createKeyword("if"),
-  _return: createKeyword("return", {
-    beforeExpr
-  }),
-  _switch: createKeyword("switch"),
-  _throw: createKeyword("throw", {
-    beforeExpr,
-    prefix,
-    startsExpr
-  }),
-  _try: createKeyword("try"),
-  _var: createKeyword("var"),
-  _const: createKeyword("const"),
-  _while: createKeyword("while", {
-    isLoop
-  }),
-  _with: createKeyword("with"),
-  _new: createKeyword("new", {
-    beforeExpr,
-    startsExpr
-  }),
-  _this: createKeyword("this", {
-    startsExpr
-  }),
-  _super: createKeyword("super", {
-    startsExpr
-  }),
-  _class: createKeyword("class", {
-    startsExpr
-  }),
-  _extends: createKeyword("extends", {
-    beforeExpr
-  }),
-  _export: createKeyword("export"),
-  _import: createKeyword("import", {
-    startsExpr
-  }),
-  _null: createKeyword("null", {
-    startsExpr
-  }),
-  _true: createKeyword("true", {
-    startsExpr
-  }),
-  _false: createKeyword("false", {
-    startsExpr
-  }),
-  _in: createKeyword("in", {
-    beforeExpr,
-    binop: 7
-  }),
-  _instanceof: createKeyword("instanceof", {
-    beforeExpr,
-    binop: 7
-  }),
-  _typeof: createKeyword("typeof", {
-    beforeExpr,
-    prefix,
-    startsExpr
-  }),
-  _void: createKeyword("void", {
-    beforeExpr,
-    prefix,
-    startsExpr
-  }),
-  _delete: createKeyword("delete", {
-    beforeExpr,
-    prefix,
-    startsExpr
-  })
-};
-
-const SCOPE_OTHER = 0b00000000,
-      SCOPE_PROGRAM = 0b00000001,
-      SCOPE_FUNCTION = 0b00000010,
-      SCOPE_ARROW = 0b00000100,
-      SCOPE_SIMPLE_CATCH = 0b00001000,
-      SCOPE_SUPER = 0b00010000,
-      SCOPE_DIRECT_SUPER = 0b00100000,
-      SCOPE_CLASS = 0b01000000,
-      SCOPE_TS_MODULE = 0b10000000,
-      SCOPE_VAR = SCOPE_PROGRAM | SCOPE_FUNCTION | SCOPE_TS_MODULE;
-const BIND_KIND_VALUE = 0b00000000001,
-      BIND_KIND_TYPE = 0b00000000010,
-      BIND_SCOPE_VAR = 0b00000000100,
-      BIND_SCOPE_LEXICAL = 0b00000001000,
-      BIND_SCOPE_FUNCTION = 0b00000010000,
-      BIND_FLAGS_NONE = 0b00001000000,
-      BIND_FLAGS_CLASS = 0b00010000000,
-      BIND_FLAGS_TS_ENUM = 0b00100000000,
-      BIND_FLAGS_TS_CONST_ENUM = 0b01000000000,
-      BIND_FLAGS_TS_EXPORT_ONLY = 0b10000000000;
-const BIND_CLASS = BIND_KIND_VALUE | BIND_KIND_TYPE | BIND_SCOPE_LEXICAL | BIND_FLAGS_CLASS,
-      BIND_LEXICAL = BIND_KIND_VALUE | 0 | BIND_SCOPE_LEXICAL | 0,
-      BIND_VAR = BIND_KIND_VALUE | 0 | BIND_SCOPE_VAR | 0,
-      BIND_FUNCTION = BIND_KIND_VALUE | 0 | BIND_SCOPE_FUNCTION | 0,
-      BIND_TS_INTERFACE = 0 | BIND_KIND_TYPE | 0 | BIND_FLAGS_CLASS,
-      BIND_TS_TYPE = 0 | BIND_KIND_TYPE | 0 | 0,
-      BIND_TS_ENUM = BIND_KIND_VALUE | BIND_KIND_TYPE | BIND_SCOPE_LEXICAL | BIND_FLAGS_TS_ENUM,
-      BIND_TS_AMBIENT = 0 | 0 | 0 | BIND_FLAGS_TS_EXPORT_ONLY,
-      BIND_NONE = 0 | 0 | 0 | BIND_FLAGS_NONE,
-      BIND_OUTSIDE = BIND_KIND_VALUE | 0 | 0 | BIND_FLAGS_NONE,
-      BIND_TS_CONST_ENUM = BIND_TS_ENUM | BIND_FLAGS_TS_CONST_ENUM,
-      BIND_TS_NAMESPACE = 0 | 0 | 0 | BIND_FLAGS_TS_EXPORT_ONLY;
-const CLASS_ELEMENT_FLAG_STATIC = 0b100,
-      CLASS_ELEMENT_KIND_GETTER = 0b010,
-      CLASS_ELEMENT_KIND_SETTER = 0b001,
-      CLASS_ELEMENT_KIND_ACCESSOR = CLASS_ELEMENT_KIND_GETTER | CLASS_ELEMENT_KIND_SETTER;
-const CLASS_ELEMENT_STATIC_GETTER = CLASS_ELEMENT_KIND_GETTER | CLASS_ELEMENT_FLAG_STATIC,
-      CLASS_ELEMENT_STATIC_SETTER = CLASS_ELEMENT_KIND_SETTER | CLASS_ELEMENT_FLAG_STATIC,
-      CLASS_ELEMENT_INSTANCE_GETTER = CLASS_ELEMENT_KIND_GETTER,
-      CLASS_ELEMENT_INSTANCE_SETTER = CLASS_ELEMENT_KIND_SETTER,
-      CLASS_ELEMENT_OTHER = 0;
-
-const lineBreak = /\r\n?|[\n\u2028\u2029]/;
-const lineBreakG = new RegExp(lineBreak.source, "g");
-function isNewLine(code) {
-  switch (code) {
-    case 10:
-    case 13:
-    case 8232:
-    case 8233:
-      return true;
-
-    default:
-      return false;
-  }
-}
-const skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g;
-function isWhitespace(code) {
-  switch (code) {
-    case 0x0009:
-    case 0x000b:
-    case 0x000c:
-    case 32:
-    case 160:
-    case 5760:
-    case 0x2000:
-    case 0x2001:
-    case 0x2002:
-    case 0x2003:
-    case 0x2004:
-    case 0x2005:
-    case 0x2006:
-    case 0x2007:
-    case 0x2008:
-    case 0x2009:
-    case 0x200a:
-    case 0x202f:
-    case 0x205f:
-    case 0x3000:
-    case 0xfeff:
-      return true;
-
-    default:
-      return false;
-  }
-}
-
-class Position {
-  constructor(line, col) {
-    this.line = line;
-    this.column = col;
-  }
-
-}
-class SourceLocation {
-  constructor(start, end) {
-    this.start = start;
-    this.end = end;
-  }
-
-}
-function getLineInfo(input, offset) {
-  let line = 1;
-  let lineStart = 0;
-  let match;
-  lineBreakG.lastIndex = 0;
-
-  while ((match = lineBreakG.exec(input)) && match.index < offset) {
-    line++;
-    lineStart = lineBreakG.lastIndex;
-  }
-
-  return new Position(line, offset - lineStart);
-}
-
-class BaseParser {
-  constructor() {
-    this.sawUnambiguousESM = false;
-    this.ambiguousScriptDifferentAst = false;
-  }
-
-  hasPlugin(name) {
-    return this.plugins.has(name);
-  }
-
-  getPluginOption(plugin, name) {
-    if (this.hasPlugin(plugin)) return this.plugins.get(plugin)[name];
-  }
-
-}
-
-function last(stack) {
-  return stack[stack.length - 1];
-}
-
-class CommentsParser extends BaseParser {
-  addComment(comment) {
-    if (this.filename) comment.loc.filename = this.filename;
-    this.state.trailingComments.push(comment);
-    this.state.leadingComments.push(comment);
-  }
-
-  adjustCommentsAfterTrailingComma(node, elements, takeAllComments) {
-    if (this.state.leadingComments.length === 0) {
-      return;
-    }
-
-    let lastElement = null;
-    let i = elements.length;
-
-    while (lastElement === null && i > 0) {
-      lastElement = elements[--i];
-    }
-
-    if (lastElement === null) {
-      return;
-    }
-
-    for (let j = 0; j < this.state.leadingComments.length; j++) {
-      if (this.state.leadingComments[j].end < this.state.commentPreviousNode.end) {
-        this.state.leadingComments.splice(j, 1);
-        j--;
-      }
-    }
-
-    const newTrailingComments = [];
-
-    for (let i = 0; i < this.state.leadingComments.length; i++) {
-      const leadingComment = this.state.leadingComments[i];
-
-      if (leadingComment.end < node.end) {
-        newTrailingComments.push(leadingComment);
-
-        if (!takeAllComments) {
-          this.state.leadingComments.splice(i, 1);
-          i--;
-        }
-      } else {
-        if (node.trailingComments === undefined) {
-          node.trailingComments = [];
-        }
-
-        node.trailingComments.push(leadingComment);
-      }
-    }
-
-    if (takeAllComments) this.state.leadingComments = [];
-
-    if (newTrailingComments.length > 0) {
-      lastElement.trailingComments = newTrailingComments;
-    } else if (lastElement.trailingComments !== undefined) {
-      lastElement.trailingComments = [];
-    }
-  }
-
-  processComment(node) {
-    if (node.type === "Program" && node.body.length > 0) return;
-    const stack = this.state.commentStack;
-    let firstChild, lastChild, trailingComments, i, j;
-
-    if (this.state.trailingComments.length > 0) {
-      if (this.state.trailingComments[0].start >= node.end) {
-        trailingComments = this.state.trailingComments;
-        this.state.trailingComments = [];
-      } else {
-        this.state.trailingComments.length = 0;
-      }
-    } else if (stack.length > 0) {
-      const lastInStack = last(stack);
-
-      if (lastInStack.trailingComments && lastInStack.trailingComments[0].start >= node.end) {
-        trailingComments = lastInStack.trailingComments;
-        delete lastInStack.trailingComments;
-      }
-    }
-
-    if (stack.length > 0 && last(stack).start >= node.start) {
-      firstChild = stack.pop();
-    }
-
-    while (stack.length > 0 && last(stack).start >= node.start) {
-      lastChild = stack.pop();
-    }
-
-    if (!lastChild && firstChild) lastChild = firstChild;
-
-    if (firstChild) {
-      switch (node.type) {
-        case "ObjectExpression":
-          this.adjustCommentsAfterTrailingComma(node, node.properties);
-          break;
-
-        case "ObjectPattern":
-          this.adjustCommentsAfterTrailingComma(node, node.properties, true);
-          break;
-
-        case "CallExpression":
-          this.adjustCommentsAfterTrailingComma(node, node.arguments);
-          break;
-
-        case "ArrayExpression":
-          this.adjustCommentsAfterTrailingComma(node, node.elements);
-          break;
-
-        case "ArrayPattern":
-          this.adjustCommentsAfterTrailingComma(node, node.elements, true);
-          break;
-      }
-    } else if (this.state.commentPreviousNode && (this.state.commentPreviousNode.type === "ImportSpecifier" && node.type !== "ImportSpecifier" || this.state.commentPreviousNode.type === "ExportSpecifier" && node.type !== "ExportSpecifier")) {
-      this.adjustCommentsAfterTrailingComma(node, [this.state.commentPreviousNode]);
-    }
-
-    if (lastChild) {
-      if (lastChild.leadingComments) {
-        if (lastChild !== node && lastChild.leadingComments.length > 0 && last(lastChild.leadingComments).end <= node.start) {
-          node.leadingComments = lastChild.leadingComments;
-          delete lastChild.leadingComments;
-        } else {
-          for (i = lastChild.leadingComments.length - 2; i >= 0; --i) {
-            if (lastChild.leadingComments[i].end <= node.start) {
-              node.leadingComments = lastChild.leadingComments.splice(0, i + 1);
-              break;
-            }
-          }
-        }
-      }
-    } else if (this.state.leadingComments.length > 0) {
-      if (last(this.state.leadingComments).end <= node.start) {
-        if (this.state.commentPreviousNode) {
-          for (j = 0; j < this.state.leadingComments.length; j++) {
-            if (this.state.leadingComments[j].end < this.state.commentPreviousNode.end) {
-              this.state.leadingComments.splice(j, 1);
-              j--;
-            }
-          }
-        }
-
-        if (this.state.leadingComments.length > 0) {
-          node.leadingComments = this.state.leadingComments;
-          this.state.leadingComments = [];
-        }
-      } else {
-        for (i = 0; i < this.state.leadingComments.length; i++) {
-          if (this.state.leadingComments[i].end > node.start) {
-            break;
-          }
-        }
-
-        const leadingComments = this.state.leadingComments.slice(0, i);
-
-        if (leadingComments.length) {
-          node.leadingComments = leadingComments;
-        }
-
-        trailingComments = this.state.leadingComments.slice(i);
-
-        if (trailingComments.length === 0) {
-          trailingComments = null;
-        }
-      }
-    }
-
-    this.state.commentPreviousNode = node;
-
-    if (trailingComments) {
-      if (trailingComments.length && trailingComments[0].start >= node.start && last(trailingComments).end <= node.end) {
-        node.innerComments = trailingComments;
-      } else {
-        node.trailingComments = trailingComments;
-      }
-    }
-
-    stack.push(node);
-  }
-
-}
-
-const Errors = Object.freeze({
-  ArgumentsDisallowedInInitializer: "'arguments' is not allowed in class field initializer",
-  AsyncFunctionInSingleStatementContext: "Async functions can only be declared at the top level or inside a block",
-  AwaitBindingIdentifier: "Can not use 'await' as identifier inside an async function",
-  AwaitExpressionFormalParameter: "await is not allowed in async function parameters",
-  AwaitNotInAsyncFunction: "Can not use keyword 'await' outside an async function",
-  BadGetterArity: "getter must not have any formal parameters",
-  BadSetterArity: "setter must have exactly one formal parameter",
-  BadSetterRestParameter: "setter function argument must not be a rest parameter",
-  ConstructorClassField: "Classes may not have a field named 'constructor'",
-  ConstructorClassPrivateField: "Classes may not have a private field named '#constructor'",
-  ConstructorIsAccessor: "Class constructor may not be an accessor",
-  ConstructorIsAsync: "Constructor can't be an async function",
-  ConstructorIsGenerator: "Constructor can't be a generator",
-  DeclarationMissingInitializer: "%0 require an initialization value",
-  DecoratorBeforeExport: "Decorators must be placed *before* the 'export' keyword. You can set the 'decoratorsBeforeExport' option to false to use the 'export @decorator class {}' syntax",
-  DecoratorConstructor: "Decorators can't be used with a constructor. Did you mean '@dec class { ... }'?",
-  DecoratorExportClass: "Using the export keyword between a decorator and a class is not allowed. Please use `export @dec class` instead.",
-  DecoratorSemicolon: "Decorators must not be followed by a semicolon",
-  DeletePrivateField: "Deleting a private field is not allowed",
-  DestructureNamedImport: "ES2015 named imports do not destructure. Use another statement for destructuring after the import.",
-  DuplicateConstructor: "Duplicate constructor in the same class",
-  DuplicateDefaultExport: "Only one default export allowed per module.",
-  DuplicateExport: "`%0` has already been exported. Exported identifiers must be unique.",
-  DuplicateProto: "Redefinition of __proto__ property",
-  DuplicateRegExpFlags: "Duplicate regular expression flag",
-  ElementAfterRest: "Rest element must be last element",
-  EscapedCharNotAnIdentifier: "Invalid Unicode escape",
-  ForInOfLoopInitializer: "%0 loop variable declaration may not have an initializer",
-  GeneratorInSingleStatementContext: "Generators can only be declared at the top level or inside a block",
-  IllegalBreakContinue: "Unsyntactic %0",
-  IllegalLanguageModeDirective: "Illegal 'use strict' directive in function with non-simple parameter list",
-  IllegalReturn: "'return' outside of function",
-  ImportCallArgumentTrailingComma: "Trailing comma is disallowed inside import(...) arguments",
-  ImportCallArity: "import() requires exactly one argument",
-  ImportCallArityLtOne: "Dynamic imports require a parameter: import('a.js')",
-  ImportCallNotNewExpression: "Cannot use new with import(...)",
-  ImportCallSpreadArgument: "... is not allowed in import()",
-  ImportMetaOutsideModule: `import.meta may appear only with 'sourceType: "module"'`,
-  ImportOutsideModule: `'import' and 'export' may appear only with 'sourceType: "module"'`,
-  InvalidCodePoint: "Code point out of bounds",
-  InvalidDigit: "Expected number in radix %0",
-  InvalidEscapeSequence: "Bad character escape sequence",
-  InvalidEscapeSequenceTemplate: "Invalid escape sequence in template",
-  InvalidEscapedReservedWord: "Escape sequence in keyword %0",
-  InvalidIdentifier: "Invalid identifier %0",
-  InvalidLhs: "Invalid left-hand side in %0",
-  InvalidLhsBinding: "Binding invalid left-hand side in %0",
-  InvalidNumber: "Invalid number",
-  InvalidOrUnexpectedToken: "Unexpected character '%0'",
-  InvalidParenthesizedAssignment: "Invalid parenthesized assignment pattern",
-  InvalidPrivateFieldResolution: "Private name #%0 is not defined",
-  InvalidPropertyBindingPattern: "Binding member expression",
-  InvalidRestAssignmentPattern: "Invalid rest operator's argument",
-  LabelRedeclaration: "Label '%0' is already declared",
-  LetInLexicalBinding: "'let' is not allowed to be used as a name in 'let' or 'const' declarations.",
-  MalformedRegExpFlags: "Invalid regular expression flag",
-  MissingClassName: "A class name is required",
-  MissingEqInAssignment: "Only '=' operator can be used for specifying default value.",
-  MissingUnicodeEscape: "Expecting Unicode escape sequence \\uXXXX",
-  MixingCoalesceWithLogical: "Nullish coalescing operator(??) requires parens when mixing with logical operators",
-  ModuleExportUndefined: "Export '%0' is not defined",
-  MultipleDefaultsInSwitch: "Multiple default clauses",
-  NewlineAfterThrow: "Illegal newline after throw",
-  NoCatchOrFinally: "Missing catch or finally clause",
-  NumberIdentifier: "Identifier directly after number",
-  NumericSeparatorInEscapeSequence: "Numeric separators are not allowed inside unicode escape sequences or hex escape sequences",
-  ObsoleteAwaitStar: "await* has been removed from the async functions proposal. Use Promise.all() instead.",
-  OptionalChainingNoNew: "constructors in/after an Optional Chain are not allowed",
-  OptionalChainingNoTemplate: "Tagged Template Literals are not allowed in optionalChain",
-  ParamDupe: "Argument name clash",
-  PatternHasAccessor: "Object pattern can't contain getter or setter",
-  PatternHasMethod: "Object pattern can't contain methods",
-  PipelineBodyNoArrow: 'Unexpected arrow "=>" after pipeline body; arrow function in pipeline body must be parenthesized',
-  PipelineBodySequenceExpression: "Pipeline body may not be a comma-separated sequence expression",
-  PipelineHeadSequenceExpression: "Pipeline head should not be a comma-separated sequence expression",
-  PipelineTopicUnused: "Pipeline is in topic style but does not use topic reference",
-  PrimaryTopicNotAllowed: "Topic reference was used in a lexical context without topic binding",
-  PrimaryTopicRequiresSmartPipeline: "Primary Topic Reference found but pipelineOperator not passed 'smart' for 'proposal' option.",
-  PrivateNameRedeclaration: "Duplicate private name #%0",
-  RecordExpressionBarIncorrectEndSyntaxType: "Record expressions ending with '|}' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'",
-  RecordExpressionBarIncorrectStartSyntaxType: "Record expressions starting with '{|' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'",
-  RecordExpressionHashIncorrectStartSyntaxType: "Record expressions starting with '#{' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'hash'",
-  RestTrailingComma: "Unexpected trailing comma after rest element",
-  SloppyFunction: "In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement",
-  StaticPrototype: "Classes may not have static property named prototype",
-  StrictDelete: "Deleting local variable in strict mode",
-  StrictEvalArguments: "Assigning to '%0' in strict mode",
-  StrictEvalArgumentsBinding: "Binding '%0' in strict mode",
-  StrictFunction: "In strict mode code, functions can only be declared at top level or inside a block",
-  StrictOctalLiteral: "Legacy octal literals are not allowed in strict mode",
-  StrictWith: "'with' in strict mode",
-  SuperNotAllowed: "super() is only valid inside a class constructor of a subclass. Maybe a typo in the method name ('constructor') or not extending another class?",
-  SuperPrivateField: "Private fields can't be accessed on super",
-  TrailingDecorator: "Decorators must be attached to a class element",
-  TupleExpressionBarIncorrectEndSyntaxType: "Tuple expressions ending with '|]' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'",
-  TupleExpressionBarIncorrectStartSyntaxType: "Tuple expressions starting with '[|' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'",
-  TupleExpressionHashIncorrectStartSyntaxType: "Tuple expressions starting with '#[' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'hash'",
-  UnexpectedArgumentPlaceholder: "Unexpected argument placeholder",
-  UnexpectedAwaitAfterPipelineBody: 'Unexpected "await" after pipeline body; await must have parentheses in minimal proposal',
-  UnexpectedDigitAfterHash: "Unexpected digit after hash token",
-  UnexpectedImportExport: "'import' and 'export' may only appear at the top level",
-  UnexpectedKeyword: "Unexpected keyword '%0'",
-  UnexpectedLeadingDecorator: "Leading decorators must be attached to a class declaration",
-  UnexpectedLexicalDeclaration: "Lexical declaration cannot appear in a single-statement context",
-  UnexpectedNewTarget: "new.target can only be used in functions",
-  UnexpectedNumericSeparator: "A numeric separator is only allowed between two digits",
-  UnexpectedPrivateField: "Private names can only be used as the name of a class element (i.e. class C { #p = 42; #m() {} } )\n or a property of member expression (i.e. this.#p).",
-  UnexpectedReservedWord: "Unexpected reserved word '%0'",
-  UnexpectedSuper: "super is only allowed in object methods and classes",
-  UnexpectedToken: "Unexpected token '%'",
-  UnexpectedTokenUnaryExponentiation: "Illegal expression. Wrap left hand side or entire exponentiation in parentheses.",
-  UnsupportedBind: "Binding should be performed on object property.",
-  UnsupportedDecoratorExport: "A decorated export must export a class declaration",
-  UnsupportedDefaultExport: "Only expressions, functions or classes are allowed as the `default` export.",
-  UnsupportedImport: "import can only be used in import() or import.meta",
-  UnsupportedMetaProperty: "The only valid meta property for %0 is %0.%1",
-  UnsupportedParameterDecorator: "Decorators cannot be used to decorate parameters",
-  UnsupportedPropertyDecorator: "Decorators cannot be used to decorate object literal properties",
-  UnsupportedSuper: "super can only be used with function calls (i.e. super()) or in property accesses (i.e. super.prop or super[prop])",
-  UnterminatedComment: "Unterminated comment",
-  UnterminatedRegExp: "Unterminated regular expression",
-  UnterminatedString: "Unterminated string constant",
-  UnterminatedTemplate: "Unterminated template",
-  VarRedeclaration: "Identifier '%0' has already been declared",
-  YieldBindingIdentifier: "Can not use 'yield' as identifier inside a generator",
-  YieldInParameter: "yield is not allowed in generator parameters",
-  ZeroDigitNumericSeparator: "Numeric separator can not be used after leading 0"
-});
-class LocationParser extends CommentsParser {
-  getLocationForPosition(pos) {
-    let loc;
-    if (pos === this.state.start) loc = this.state.startLoc;else if (pos === this.state.lastTokStart) loc = this.state.lastTokStartLoc;else if (pos === this.state.end) loc = this.state.endLoc;else if (pos === this.state.lastTokEnd) loc = this.state.lastTokEndLoc;else loc = getLineInfo(this.input, pos);
-    return loc;
-  }
-
-  raise(pos, errorTemplate, ...params) {
-    return this.raiseWithData(pos, undefined, errorTemplate, ...params);
-  }
-
-  raiseWithData(pos, data, errorTemplate, ...params) {
-    const loc = this.getLocationForPosition(pos);
-    const message = errorTemplate.replace(/%(\d+)/g, (_, i) => params[i]) + ` (${loc.line}:${loc.column})`;
-    return this._raise(Object.assign({
-      loc,
-      pos
-    }, data), message);
-  }
-
-  _raise(errorContext, message) {
-    const err = new SyntaxError(message);
-    Object.assign(err, errorContext);
-
-    if (this.options.errorRecovery) {
-      if (!this.isLookahead) this.state.errors.push(err);
-      return err;
-    } else {
-      throw err;
-    }
-  }
-
-}
-
-function isSimpleProperty(node) {
-  return node != null && node.type === "Property" && node.kind === "init" && node.method === false;
-}
-
-var estree = (superClass => class extends superClass {
-  estreeParseRegExpLiteral({
-    pattern,
-    flags
-  }) {
-    let regex = null;
-
-    try {
-      regex = new RegExp(pattern, flags);
-    } catch (e) {}
-
-    const node = this.estreeParseLiteral(regex);
-    node.regex = {
-      pattern,
-      flags
-    };
-    return node;
-  }
-
-  estreeParseBigIntLiteral(value) {
-    const bigInt = typeof BigInt !== "undefined" ? BigInt(value) : null;
-    const node = this.estreeParseLiteral(bigInt);
-    node.bigint = String(node.value || value);
-    return node;
-  }
-
-  estreeParseLiteral(value) {
-    return this.parseLiteral(value, "Literal");
-  }
-
-  directiveToStmt(directive) {
-    const directiveLiteral = directive.value;
-    const stmt = this.startNodeAt(directive.start, directive.loc.start);
-    const expression = this.startNodeAt(directiveLiteral.start, directiveLiteral.loc.start);
-    expression.value = directiveLiteral.value;
-    expression.raw = directiveLiteral.extra.raw;
-    stmt.expression = this.finishNodeAt(expression, "Literal", directiveLiteral.end, directiveLiteral.loc.end);
-    stmt.directive = directiveLiteral.extra.raw.slice(1, -1);
-    return this.finishNodeAt(stmt, "ExpressionStatement", directive.end, directive.loc.end);
-  }
-
-  initFunction(node, isAsync) {
-    super.initFunction(node, isAsync);
-    node.expression = false;
-  }
-
-  checkDeclaration(node) {
-    if (isSimpleProperty(node)) {
-      this.checkDeclaration(node.value);
-    } else {
-      super.checkDeclaration(node);
-    }
-  }
-
-  checkGetterSetterParams(method) {
-    const prop = method;
-    const paramCount = prop.kind === "get" ? 0 : 1;
-    const start = prop.start;
-
-    if (prop.value.params.length !== paramCount) {
-      if (method.kind === "get") {
-        this.raise(start, Errors.BadGetterArity);
-      } else {
-        this.raise(start, Errors.BadSetterArity);
-      }
-    } else if (prop.kind === "set" && prop.value.params[0].type === "RestElement") {
-      this.raise(start, Errors.BadSetterRestParameter);
-    }
-  }
-
-  checkLVal(expr, bindingType = BIND_NONE, checkClashes, contextDescription, disallowLetBinding) {
-    switch (expr.type) {
-      case "ObjectPattern":
-        expr.properties.forEach(prop => {
-          this.checkLVal(prop.type === "Property" ? prop.value : prop, bindingType, checkClashes, "object destructuring pattern", disallowLetBinding);
-        });
-        break;
-
-      default:
-        super.checkLVal(expr, bindingType, checkClashes, contextDescription, disallowLetBinding);
-    }
-  }
-
-  checkDuplicatedProto(prop, protoRef, refExpressionErrors) {
-    if (prop.type === "SpreadElement" || prop.computed || prop.method || prop.shorthand) {
-      return;
-    }
-
-    const key = prop.key;
-    const name = key.type === "Identifier" ? key.name : String(key.value);
-
-    if (name === "__proto__" && prop.kind === "init") {
-      if (protoRef.used) {
-        if (refExpressionErrors && refExpressionErrors.doubleProto === -1) {
-          refExpressionErrors.doubleProto = key.start;
-        } else {
-          this.raise(key.start, Errors.DuplicateProto);
-        }
-      }
-
-      protoRef.used = true;
-    }
-  }
-
-  isValidDirective(stmt) {
-    return stmt.type === "ExpressionStatement" && stmt.expression.type === "Literal" && typeof stmt.expression.value === "string" && (!stmt.expression.extra || !stmt.expression.extra.parenthesized);
-  }
-
-  stmtToDirective(stmt) {
-    const directive = super.stmtToDirective(stmt);
-    const value = stmt.expression.value;
-    directive.value.value = value;
-    return directive;
-  }
-
-  parseBlockBody(node, allowDirectives, topLevel, end) {
-    super.parseBlockBody(node, allowDirectives, topLevel, end);
-    const directiveStatements = node.directives.map(d => this.directiveToStmt(d));
-    node.body = directiveStatements.concat(node.body);
-    delete node.directives;
-  }
-
-  pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper) {
-    this.parseMethod(method, isGenerator, isAsync, isConstructor, allowsDirectSuper, "ClassMethod", true);
-
-    if (method.typeParameters) {
-      method.value.typeParameters = method.typeParameters;
-      delete method.typeParameters;
-    }
-
-    classBody.body.push(method);
-  }
-
-  parseExprAtom(refExpressionErrors) {
-    switch (this.state.type) {
-      case types.num:
-      case types.string:
-        return this.estreeParseLiteral(this.state.value);
-
-      case types.regexp:
-        return this.estreeParseRegExpLiteral(this.state.value);
-
-      case types.bigint:
-        return this.estreeParseBigIntLiteral(this.state.value);
-
-      case types._null:
-        return this.estreeParseLiteral(null);
-
-      case types._true:
-        return this.estreeParseLiteral(true);
-
-      case types._false:
-        return this.estreeParseLiteral(false);
-
-      default:
-        return super.parseExprAtom(refExpressionErrors);
-    }
-  }
-
-  parseLiteral(value, type, startPos, startLoc) {
-    const node = super.parseLiteral(value, type, startPos, startLoc);
-    node.raw = node.extra.raw;
-    delete node.extra;
-    return node;
-  }
-
-  parseFunctionBody(node, allowExpression, isMethod = false) {
-    super.parseFunctionBody(node, allowExpression, isMethod);
-    node.expression = node.body.type !== "BlockStatement";
-  }
-
-  parseMethod(node, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope = false) {
-    let funcNode = this.startNode();
-    funcNode.kind = node.kind;
-    funcNode = super.parseMethod(funcNode, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope);
-    funcNode.type = "FunctionExpression";
-    delete funcNode.kind;
-    node.value = funcNode;
-    type = type === "ClassMethod" ? "MethodDefinition" : type;
-    return this.finishNode(node, type);
-  }
-
-  parseObjectMethod(prop, isGenerator, isAsync, isPattern, containsEsc) {
-    const node = super.parseObjectMethod(prop, isGenerator, isAsync, isPattern, containsEsc);
-
-    if (node) {
-      node.type = "Property";
-      if (node.kind === "method") node.kind = "init";
-      node.shorthand = false;
-    }
-
-    return node;
-  }
-
-  parseObjectProperty(prop, startPos, startLoc, isPattern, refExpressionErrors) {
-    const node = super.parseObjectProperty(prop, startPos, startLoc, isPattern, refExpressionErrors);
-
-    if (node) {
-      node.kind = "init";
-      node.type = "Property";
-    }
-
-    return node;
-  }
-
-  toAssignable(node) {
-    if (isSimpleProperty(node)) {
-      this.toAssignable(node.value);
-      return node;
-    }
-
-    return super.toAssignable(node);
-  }
-
-  toAssignableObjectExpressionProp(prop, isLast) {
-    if (prop.kind === "get" || prop.kind === "set") {
-      throw this.raise(prop.key.start, Errors.PatternHasAccessor);
-    } else if (prop.method) {
-      throw this.raise(prop.key.start, Errors.PatternHasMethod);
-    } else {
-      super.toAssignableObjectExpressionProp(prop, isLast);
-    }
-  }
-
-  finishCallExpression(node, optional) {
-    super.finishCallExpression(node, optional);
-
-    if (node.callee.type === "Import") {
-      node.type = "ImportExpression";
-      node.source = node.arguments[0];
-      delete node.arguments;
-      delete node.callee;
-    }
-
-    return node;
-  }
-
-  toReferencedListDeep(exprList, isParenthesizedExpr) {
-    if (!exprList) {
-      return;
-    }
-
-    super.toReferencedListDeep(exprList, isParenthesizedExpr);
-  }
-
-  parseExport(node) {
-    super.parseExport(node);
-
-    switch (node.type) {
-      case "ExportAllDeclaration":
-        node.exported = null;
-        break;
-
-      case "ExportNamedDeclaration":
-        if (node.specifiers.length === 1 && node.specifiers[0].type === "ExportNamespaceSpecifier") {
-          node.type = "ExportAllDeclaration";
-          node.exported = node.specifiers[0].exported;
-          delete node.specifiers;
-        }
-
-        break;
-    }
-
-    return node;
-  }
-
-});
-
-class TokContext {
-  constructor(token, isExpr, preserveSpace, override) {
-    this.token = token;
-    this.isExpr = !!isExpr;
-    this.preserveSpace = !!preserveSpace;
-    this.override = override;
-  }
-
-}
-const types$1 = {
-  braceStatement: new TokContext("{", false),
-  braceExpression: new TokContext("{", true),
-  templateQuasi: new TokContext("${", false),
-  parenStatement: new TokContext("(", false),
-  parenExpression: new TokContext("(", true),
-  template: new TokContext("`", true, true, p => p.readTmplToken()),
-  functionExpression: new TokContext("function", true),
-  functionStatement: new TokContext("function", false)
-};
-
-types.parenR.updateContext = types.braceR.updateContext = function () {
-  if (this.state.context.length === 1) {
-    this.state.exprAllowed = true;
-    return;
-  }
-
-  let out = this.state.context.pop();
-
-  if (out === types$1.braceStatement && this.curContext().token === "function") {
-    out = this.state.context.pop();
-  }
-
-  this.state.exprAllowed = !out.isExpr;
-};
-
-types.name.updateContext = function (prevType) {
-  let allowed = false;
-
-  if (prevType !== types.dot) {
-    if (this.state.value === "of" && !this.state.exprAllowed || this.state.value === "yield" && this.prodParam.hasYield) {
-      allowed = true;
-    }
-  }
-
-  this.state.exprAllowed = allowed;
-
-  if (this.state.isIterator) {
-    this.state.isIterator = false;
-  }
-};
-
-types.braceL.updateContext = function (prevType) {
-  this.state.context.push(this.braceIsBlock(prevType) ? types$1.braceStatement : types$1.braceExpression);
-  this.state.exprAllowed = true;
-};
-
-types.dollarBraceL.updateContext = function () {
-  this.state.context.push(types$1.templateQuasi);
-  this.state.exprAllowed = true;
-};
-
-types.parenL.updateContext = function (prevType) {
-  const statementParens = prevType === types._if || prevType === types._for || prevType === types._with || prevType === types._while;
-  this.state.context.push(statementParens ? types$1.parenStatement : types$1.parenExpression);
-  this.state.exprAllowed = true;
-};
-
-types.incDec.updateContext = function () {};
-
-types._function.updateContext = types._class.updateContext = function (prevType) {
-  if (prevType.beforeExpr && prevType !== types.semi && prevType !== types._else && !(prevType === types._return && lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start))) && !((prevType === types.colon || prevType === types.braceL) && this.curContext() === types$1.b_stat)) {
-    this.state.context.push(types$1.functionExpression);
-  } else {
-    this.state.context.push(types$1.functionStatement);
-  }
-
-  this.state.exprAllowed = false;
-};
-
-types.backQuote.updateContext = function () {
-  if (this.curContext() === types$1.template) {
-    this.state.context.pop();
-  } else {
-    this.state.context.push(types$1.template);
-  }
-
-  this.state.exprAllowed = false;
-};
-
-let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08c7\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\u9ffc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7bf\ua7c2-\ua7ca\ua7f5-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
-let nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d3-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf\u1ac0\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1df9\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f";
-const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
-const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
-nonASCIIidentifierStartChars = nonASCIIidentifierChars = null;
-const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 157, 310, 10, 21, 11, 7, 153, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 107, 20, 28, 22, 13, 52, 76, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 85, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 230, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 35, 56, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 190, 0, 80, 921, 103, 110, 18, 195, 2749, 1070, 4050, 582, 8634, 568, 8, 30, 114, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8952, 286, 50, 2, 18, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 2357, 44, 11, 6, 17, 0, 370, 43, 1301, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42717, 35, 4148, 12, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938];
-const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 154, 10, 176, 2, 54, 14, 32, 9, 16, 3, 46, 10, 54, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 161, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 19306, 9, 135, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 5319, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 262, 6, 10, 9, 419, 13, 1495, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
-
-function isInAstralSet(code, set) {
-  let pos = 0x10000;
-
-  for (let i = 0, length = set.length; i < length; i += 2) {
-    pos += set[i];
-    if (pos > code) return false;
-    pos += set[i + 1];
-    if (pos >= code) return true;
-  }
-
-  return false;
-}
-
-function isIdentifierStart(code) {
-  if (code < 65) return code === 36;
-  if (code <= 90) return true;
-  if (code < 97) return code === 95;
-  if (code <= 122) return true;
-
-  if (code <= 0xffff) {
-    return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code));
-  }
-
-  return isInAstralSet(code, astralIdentifierStartCodes);
-}
-function isIdentifierChar(code) {
-  if (code < 48) return code === 36;
-  if (code < 58) return true;
-  if (code < 65) return false;
-  if (code <= 90) return true;
-  if (code < 97) return code === 95;
-  if (code <= 122) return true;
-
-  if (code <= 0xffff) {
-    return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));
-  }
-
-  return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes);
-}
-
-const reservedWords = {
-  keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"],
-  strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"],
-  strictBind: ["eval", "arguments"]
-};
-const keywords$1 = new Set(reservedWords.keyword);
-const reservedWordsStrictSet = new Set(reservedWords.strict);
-const reservedWordsStrictBindSet = new Set(reservedWords.strictBind);
-function isReservedWord(word, inModule) {
-  return inModule && word === "await" || word === "enum";
-}
-function isStrictReservedWord(word, inModule) {
-  return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word);
-}
-function isStrictBindOnlyReservedWord(word) {
-  return reservedWordsStrictBindSet.has(word);
-}
-function isStrictBindReservedWord(word, inModule) {
-  return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word);
-}
-function isKeyword(word) {
-  return keywords$1.has(word);
-}
-
-const keywordRelationalOperator = /^in(stanceof)?$/;
-function isIteratorStart(current, next) {
-  return current === 64 && next === 64;
-}
-
-const reservedTypes = new Set(["_", "any", "bool", "boolean", "empty", "extends", "false", "interface", "mixed", "null", "number", "static", "string", "true", "typeof", "void"]);
-const FlowErrors = Object.freeze({
-  AmbiguousConditionalArrow: "Ambiguous expression: wrap the arrow functions in parentheses to disambiguate.",
-  AmbiguousDeclareModuleKind: "Found both `declare module.exports` and `declare export` in the same module. Modules can only have 1 since they are either an ES module or they are a CommonJS module",
-  AssignReservedType: "Cannot overwrite reserved type %0",
-  DeclareClassElement: "The `declare` modifier can only appear on class fields.",
-  DeclareClassFieldInitializer: "Initializers are not allowed in fields with the `declare` modifier.",
-  DuplicateDeclareModuleExports: "Duplicate `declare module.exports` statement",
-  EnumBooleanMemberNotInitialized: "Boolean enum members need to be initialized. Use either `%0 = true,` or `%0 = false,` in enum `%1`.",
-  EnumDuplicateMemberName: "Enum member names need to be unique, but the name `%0` has already been used before in enum `%1`.",
-  EnumInconsistentMemberValues: "Enum `%0` has inconsistent member initializers. Either use no initializers, or consistently use literals (either booleans, numbers, or strings) for all member initializers.",
-  EnumInvalidExplicitType: "Enum type `%1` is not valid. Use one of `boolean`, `number`, `string`, or `symbol` in enum `%0`.",
-  EnumInvalidExplicitTypeUnknownSupplied: "Supplied enum type is not valid. Use one of `boolean`, `number`, `string`, or `symbol` in enum `%0`.",
-  EnumInvalidMemberInitializerPrimaryType: "Enum `%0` has type `%2`, so the initializer of `%1` needs to be a %2 literal.",
-  EnumInvalidMemberInitializerSymbolType: "Symbol enum members cannot be initialized. Use `%1,` in enum `%0`.",
-  EnumInvalidMemberInitializerUnknownType: "The enum member initializer for `%1` needs to be a literal (either a boolean, number, or string) in enum `%0`.",
-  EnumInvalidMemberName: "Enum member names cannot start with lowercase 'a' through 'z'. Instead of using `%0`, consider using `%1`, in enum `%2`.",
-  EnumNumberMemberNotInitialized: "Number enum members need to be initialized, e.g. `%1 = 1` in enum `%0`.",
-  EnumStringMemberInconsistentlyInitailized: "String enum members need to consistently either all use initializers, or use no initializers, in enum `%0`.",
-  ImportTypeShorthandOnlyInPureImport: "The `type` and `typeof` keywords on named imports can only be used on regular `import` statements. It cannot be used with `import type` or `import typeof` statements",
-  InexactInsideExact: "Explicit inexact syntax cannot appear inside an explicit exact object type",
-  InexactInsideNonObject: "Explicit inexact syntax cannot appear in class or interface definitions",
-  InexactVariance: "Explicit inexact syntax cannot have variance",
-  InvalidNonTypeImportInDeclareModule: "Imports within a `declare module` body must always be `import type` or `import typeof`",
-  MissingTypeParamDefault: "Type parameter declaration needs a default, since a preceding type parameter declaration has a default.",
-  NestedDeclareModule: "`declare module` cannot be used inside another `declare module`",
-  NestedFlowComment: "Cannot have a flow comment inside another flow comment",
-  OptionalBindingPattern: "A binding pattern parameter cannot be optional in an implementation signature.",
-  SpreadVariance: "Spread properties cannot have variance",
-  TypeBeforeInitializer: "Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`",
-  TypeCastInPattern: "The type cast expression is expected to be wrapped with parenthesis",
-  UnexpectedExplicitInexactInObject: "Explicit inexact syntax must appear at the end of an inexact object",
-  UnexpectedReservedType: "Unexpected reserved type %0",
-  UnexpectedReservedUnderscore: "`_` is only allowed as a type argument to call or new",
-  UnexpectedSpaceBetweenModuloChecks: "Spaces between `%` and `checks` are not allowed here.",
-  UnexpectedSpreadType: "Spread operator cannot appear in class or interface definitions",
-  UnexpectedSubtractionOperand: 'Unexpected token, expected "number" or "bigint"',
-  UnexpectedTokenAfterTypeParameter: "Expected an arrow function after this type parameter declaration",
-  UnsupportedDeclareExportKind: "`declare export %0` is not supported. Use `%1` instead",
-  UnsupportedStatementInDeclareModule: "Only declares and type imports are allowed inside declare module",
-  UnterminatedFlowComment: "Unterminated flow-comment"
-});
-
-function isEsModuleType(bodyElement) {
-  return bodyElement.type === "DeclareExportAllDeclaration" || bodyElement.type === "DeclareExportDeclaration" && (!bodyElement.declaration || bodyElement.declaration.type !== "TypeAlias" && bodyElement.declaration.type !== "InterfaceDeclaration");
-}
-
-function hasTypeImportKind(node) {
-  return node.importKind === "type" || node.importKind === "typeof";
-}
-
-function isMaybeDefaultImport(state) {
-  return (state.type === types.name || !!state.type.keyword) && state.value !== "from";
-}
-
-const exportSuggestions = {
-  const: "declare export var",
-  let: "declare export var",
-  type: "export type",
-  interface: "export interface"
-};
-
-function partition(list, test) {
-  const list1 = [];
-  const list2 = [];
-
-  for (let i = 0; i < list.length; i++) {
-    (test(list[i], i, list) ? list1 : list2).push(list[i]);
-  }
-
-  return [list1, list2];
-}
-
-const FLOW_PRAGMA_REGEX = /\*?\s*@((?:no)?flow)\b/;
-var flow = (superClass => class extends superClass {
-  constructor(options, input) {
-    super(options, input);
-    this.flowPragma = undefined;
-  }
-
-  shouldParseTypes() {
-    return this.getPluginOption("flow", "all") || this.flowPragma === "flow";
-  }
-
-  shouldParseEnums() {
-    return !!this.getPluginOption("flow", "enums");
-  }
-
-  finishToken(type, val) {
-    if (type !== types.string && type !== types.semi && type !== types.interpreterDirective) {
-      if (this.flowPragma === undefined) {
-        this.flowPragma = null;
-      }
-    }
-
-    return super.finishToken(type, val);
-  }
-
-  addComment(comment) {
-    if (this.flowPragma === undefined) {
-      const matches = FLOW_PRAGMA_REGEX.exec(comment.value);
-
-      if (!matches) ; else if (matches[1] === "flow") {
-        this.flowPragma = "flow";
-      } else if (matches[1] === "noflow") {
-        this.flowPragma = "noflow";
-      } else {
-        throw new Error("Unexpected flow pragma");
-      }
-    }
-
-    return super.addComment(comment);
-  }
-
-  flowParseTypeInitialiser(tok) {
-    const oldInType = this.state.inType;
-    this.state.inType = true;
-    this.expect(tok || types.colon);
-    const type = this.flowParseType();
-    this.state.inType = oldInType;
-    return type;
-  }
-
-  flowParsePredicate() {
-    const node = this.startNode();
-    const moduloLoc = this.state.startLoc;
-    const moduloPos = this.state.start;
-    this.expect(types.modulo);
-    const checksLoc = this.state.startLoc;
-    this.expectContextual("checks");
-
-    if (moduloLoc.line !== checksLoc.line || moduloLoc.column !== checksLoc.column - 1) {
-      this.raise(moduloPos, FlowErrors.UnexpectedSpaceBetweenModuloChecks);
-    }
-
-    if (this.eat(types.parenL)) {
-      node.value = this.parseExpression();
-      this.expect(types.parenR);
-      return this.finishNode(node, "DeclaredPredicate");
-    } else {
-      return this.finishNode(node, "InferredPredicate");
-    }
-  }
-
-  flowParseTypeAndPredicateInitialiser() {
-    const oldInType = this.state.inType;
-    this.state.inType = true;
-    this.expect(types.colon);
-    let type = null;
-    let predicate = null;
-
-    if (this.match(types.modulo)) {
-      this.state.inType = oldInType;
-      predicate = this.flowParsePredicate();
-    } else {
-      type = this.flowParseType();
-      this.state.inType = oldInType;
-
-      if (this.match(types.modulo)) {
-        predicate = this.flowParsePredicate();
-      }
-    }
-
-    return [type, predicate];
-  }
-
-  flowParseDeclareClass(node) {
-    this.next();
-    this.flowParseInterfaceish(node, true);
-    return this.finishNode(node, "DeclareClass");
-  }
-
-  flowParseDeclareFunction(node) {
-    this.next();
-    const id = node.id = this.parseIdentifier();
-    const typeNode = this.startNode();
-    const typeContainer = this.startNode();
-
-    if (this.isRelational("<")) {
-      typeNode.typeParameters = this.flowParseTypeParameterDeclaration();
-    } else {
-      typeNode.typeParameters = null;
-    }
-
-    this.expect(types.parenL);
-    const tmp = this.flowParseFunctionTypeParams();
-    typeNode.params = tmp.params;
-    typeNode.rest = tmp.rest;
-    this.expect(types.parenR);
-    [typeNode.returnType, node.predicate] = this.flowParseTypeAndPredicateInitialiser();
-    typeContainer.typeAnnotation = this.finishNode(typeNode, "FunctionTypeAnnotation");
-    id.typeAnnotation = this.finishNode(typeContainer, "TypeAnnotation");
-    this.resetEndLocation(id);
-    this.semicolon();
-    return this.finishNode(node, "DeclareFunction");
-  }
-
-  flowParseDeclare(node, insideModule) {
-    if (this.match(types._class)) {
-      return this.flowParseDeclareClass(node);
-    } else if (this.match(types._function)) {
-      return this.flowParseDeclareFunction(node);
-    } else if (this.match(types._var)) {
-      return this.flowParseDeclareVariable(node);
-    } else if (this.eatContextual("module")) {
-      if (this.match(types.dot)) {
-        return this.flowParseDeclareModuleExports(node);
-      } else {
-        if (insideModule) {
-          this.raise(this.state.lastTokStart, FlowErrors.NestedDeclareModule);
-        }
-
-        return this.flowParseDeclareModule(node);
-      }
-    } else if (this.isContextual("type")) {
-      return this.flowParseDeclareTypeAlias(node);
-    } else if (this.isContextual("opaque")) {
-      return this.flowParseDeclareOpaqueType(node);
-    } else if (this.isContextual("interface")) {
-      return this.flowParseDeclareInterface(node);
-    } else if (this.match(types._export)) {
-      return this.flowParseDeclareExportDeclaration(node, insideModule);
-    } else {
-      throw this.unexpected();
-    }
-  }
-
-  flowParseDeclareVariable(node) {
-    this.next();
-    node.id = this.flowParseTypeAnnotatableIdentifier(true);
-    this.scope.declareName(node.id.name, BIND_VAR, node.id.start);
-    this.semicolon();
-    return this.finishNode(node, "DeclareVariable");
-  }
-
-  flowParseDeclareModule(node) {
-    this.scope.enter(SCOPE_OTHER);
-
-    if (this.match(types.string)) {
-      node.id = this.parseExprAtom();
-    } else {
-      node.id = this.parseIdentifier();
-    }
-
-    const bodyNode = node.body = this.startNode();
-    const body = bodyNode.body = [];
-    this.expect(types.braceL);
-
-    while (!this.match(types.braceR)) {
-      let bodyNode = this.startNode();
-
-      if (this.match(types._import)) {
-        this.next();
-
-        if (!this.isContextual("type") && !this.match(types._typeof)) {
-          this.raise(this.state.lastTokStart, FlowErrors.InvalidNonTypeImportInDeclareModule);
-        }
-
-        this.parseImport(bodyNode);
-      } else {
-        this.expectContextual("declare", FlowErrors.UnsupportedStatementInDeclareModule);
-        bodyNode = this.flowParseDeclare(bodyNode, true);
-      }
-
-      body.push(bodyNode);
-    }
-
-    this.scope.exit();
-    this.expect(types.braceR);
-    this.finishNode(bodyNode, "BlockStatement");
-    let kind = null;
-    let hasModuleExport = false;
-    body.forEach(bodyElement => {
-      if (isEsModuleType(bodyElement)) {
-        if (kind === "CommonJS") {
-          this.raise(bodyElement.start, FlowErrors.AmbiguousDeclareModuleKind);
-        }
-
-        kind = "ES";
-      } else if (bodyElement.type === "DeclareModuleExports") {
-        if (hasModuleExport) {
-          this.raise(bodyElement.start, FlowErrors.DuplicateDeclareModuleExports);
-        }
-
-        if (kind === "ES") {
-          this.raise(bodyElement.start, FlowErrors.AmbiguousDeclareModuleKind);
-        }
-
-        kind = "CommonJS";
-        hasModuleExport = true;
-      }
-    });
-    node.kind = kind || "CommonJS";
-    return this.finishNode(node, "DeclareModule");
-  }
-
-  flowParseDeclareExportDeclaration(node, insideModule) {
-    this.expect(types._export);
-
-    if (this.eat(types._default)) {
-      if (this.match(types._function) || this.match(types._class)) {
-        node.declaration = this.flowParseDeclare(this.startNode());
-      } else {
-        node.declaration = this.flowParseType();
-        this.semicolon();
-      }
-
-      node.default = true;
-      return this.finishNode(node, "DeclareExportDeclaration");
-    } else {
-      if (this.match(types._const) || this.isLet() || (this.isContextual("type") || this.isContextual("interface")) && !insideModule) {
-        const label = this.state.value;
-        const suggestion = exportSuggestions[label];
-        throw this.raise(this.state.start, FlowErrors.UnsupportedDeclareExportKind, label, suggestion);
-      }
-
-      if (this.match(types._var) || this.match(types._function) || this.match(types._class) || this.isContextual("opaque")) {
-          node.declaration = this.flowParseDeclare(this.startNode());
-          node.default = false;
-          return this.finishNode(node, "DeclareExportDeclaration");
-        } else if (this.match(types.star) || this.match(types.braceL) || this.isContextual("interface") || this.isContextual("type") || this.isContextual("opaque")) {
-          node = this.parseExport(node);
-
-          if (node.type === "ExportNamedDeclaration") {
-            node.type = "ExportDeclaration";
-            node.default = false;
-            delete node.exportKind;
-          }
-
-          node.type = "Declare" + node.type;
-          return node;
-        }
-    }
-
-    throw this.unexpected();
-  }
-
-  flowParseDeclareModuleExports(node) {
-    this.next();
-    this.expectContextual("exports");
-    node.typeAnnotation = this.flowParseTypeAnnotation();
-    this.semicolon();
-    return this.finishNode(node, "DeclareModuleExports");
-  }
-
-  flowParseDeclareTypeAlias(node) {
-    this.next();
-    this.flowParseTypeAlias(node);
-    node.type = "DeclareTypeAlias";
-    return node;
-  }
-
-  flowParseDeclareOpaqueType(node) {
-    this.next();
-    this.flowParseOpaqueType(node, true);
-    node.type = "DeclareOpaqueType";
-    return node;
-  }
-
-  flowParseDeclareInterface(node) {
-    this.next();
-    this.flowParseInterfaceish(node);
-    return this.finishNode(node, "DeclareInterface");
-  }
-
-  flowParseInterfaceish(node, isClass = false) {
-    node.id = this.flowParseRestrictedIdentifier(!isClass, true);
-    this.scope.declareName(node.id.name, isClass ? BIND_FUNCTION : BIND_LEXICAL, node.id.start);
-
-    if (this.isRelational("<")) {
-      node.typeParameters = this.flowParseTypeParameterDeclaration();
-    } else {
-      node.typeParameters = null;
-    }
-
-    node.extends = [];
-    node.implements = [];
-    node.mixins = [];
-
-    if (this.eat(types._extends)) {
-      do {
-        node.extends.push(this.flowParseInterfaceExtends());
-      } while (!isClass && this.eat(types.comma));
-    }
-
-    if (this.isContextual("mixins")) {
-      this.next();
-
-      do {
-        node.mixins.push(this.flowParseInterfaceExtends());
-      } while (this.eat(types.comma));
-    }
-
-    if (this.isContextual("implements")) {
-      this.next();
-
-      do {
-        node.implements.push(this.flowParseInterfaceExtends());
-      } while (this.eat(types.comma));
-    }
-
-    node.body = this.flowParseObjectType({
-      allowStatic: isClass,
-      allowExact: false,
-      allowSpread: false,
-      allowProto: isClass,
-      allowInexact: false
-    });
-  }
-
-  flowParseInterfaceExtends() {
-    const node = this.startNode();
-    node.id = this.flowParseQualifiedTypeIdentifier();
-
-    if (this.isRelational("<")) {
-      node.typeParameters = this.flowParseTypeParameterInstantiation();
-    } else {
-      node.typeParameters = null;
-    }
-
-    return this.finishNode(node, "InterfaceExtends");
-  }
-
-  flowParseInterface(node) {
-    this.flowParseInterfaceish(node);
-    return this.finishNode(node, "InterfaceDeclaration");
-  }
-
-  checkNotUnderscore(word) {
-    if (word === "_") {
-      this.raise(this.state.start, FlowErrors.UnexpectedReservedUnderscore);
-    }
-  }
-
-  checkReservedType(word, startLoc, declaration) {
-    if (!reservedTypes.has(word)) return;
-    this.raise(startLoc, declaration ? FlowErrors.AssignReservedType : FlowErrors.UnexpectedReservedType, word);
-  }
-
-  flowParseRestrictedIdentifier(liberal, declaration) {
-    this.checkReservedType(this.state.value, this.state.start, declaration);
-    return this.parseIdentifier(liberal);
-  }
-
-  flowParseTypeAlias(node) {
-    node.id = this.flowParseRestrictedIdentifier(false, true);
-    this.scope.declareName(node.id.name, BIND_LEXICAL, node.id.start);
-
-    if (this.isRelational("<")) {
-      node.typeParameters = this.flowParseTypeParameterDeclaration();
-    } else {
-      node.typeParameters = null;
-    }
-
-    node.right = this.flowParseTypeInitialiser(types.eq);
-    this.semicolon();
-    return this.finishNode(node, "TypeAlias");
-  }
-
-  flowParseOpaqueType(node, declare) {
-    this.expectContextual("type");
-    node.id = this.flowParseRestrictedIdentifier(true, true);
-    this.scope.declareName(node.id.name, BIND_LEXICAL, node.id.start);
-
-    if (this.isRelational("<")) {
-      node.typeParameters = this.flowParseTypeParameterDeclaration();
-    } else {
-      node.typeParameters = null;
-    }
-
-    node.supertype = null;
-
-    if (this.match(types.colon)) {
-      node.supertype = this.flowParseTypeInitialiser(types.colon);
-    }
-
-    node.impltype = null;
-
-    if (!declare) {
-      node.impltype = this.flowParseTypeInitialiser(types.eq);
-    }
-
-    this.semicolon();
-    return this.finishNode(node, "OpaqueType");
-  }
-
-  flowParseTypeParameter(requireDefault = false) {
-    const nodeStart = this.state.start;
-    const node = this.startNode();
-    const variance = this.flowParseVariance();
-    const ident = this.flowParseTypeAnnotatableIdentifier();
-    node.name = ident.name;
-    node.variance = variance;
-    node.bound = ident.typeAnnotation;
-
-    if (this.match(types.eq)) {
-      this.eat(types.eq);
-      node.default = this.flowParseType();
-    } else {
-      if (requireDefault) {
-        this.raise(nodeStart, FlowErrors.MissingTypeParamDefault);
-      }
-    }
-
-    return this.finishNode(node, "TypeParameter");
-  }
-
-  flowParseTypeParameterDeclaration() {
-    const oldInType = this.state.inType;
-    const node = this.startNode();
-    node.params = [];
-    this.state.inType = true;
-
-    if (this.isRelational("<") || this.match(types.jsxTagStart)) {
-      this.next();
-    } else {
-      this.unexpected();
-    }
-
-    let defaultRequired = false;
-
-    do {
-      const typeParameter = this.flowParseTypeParameter(defaultRequired);
-      node.params.push(typeParameter);
-
-      if (typeParameter.default) {
-        defaultRequired = true;
-      }
-
-      if (!this.isRelational(">")) {
-        this.expect(types.comma);
-      }
-    } while (!this.isRelational(">"));
-
-    this.expectRelational(">");
-    this.state.inType = oldInType;
-    return this.finishNode(node, "TypeParameterDeclaration");
-  }
-
-  flowParseTypeParameterInstantiation() {
-    const node = this.startNode();
-    const oldInType = this.state.inType;
-    node.params = [];
-    this.state.inType = true;
-    this.expectRelational("<");
-    const oldNoAnonFunctionType = this.state.noAnonFunctionType;
-    this.state.noAnonFunctionType = false;
-
-    while (!this.isRelational(">")) {
-      node.params.push(this.flowParseType());
-
-      if (!this.isRelational(">")) {
-        this.expect(types.comma);
-      }
-    }
-
-    this.state.noAnonFunctionType = oldNoAnonFunctionType;
-    this.expectRelational(">");
-    this.state.inType = oldInType;
-    return this.finishNode(node, "TypeParameterInstantiation");
-  }
-
-  flowParseTypeParameterInstantiationCallOrNew() {
-    const node = this.startNode();
-    const oldInType = this.state.inType;
-    node.params = [];
-    this.state.inType = true;
-    this.expectRelational("<");
-
-    while (!this.isRelational(">")) {
-      node.params.push(this.flowParseTypeOrImplicitInstantiation());
-
-      if (!this.isRelational(">")) {
-        this.expect(types.comma);
-      }
-    }
-
-    this.expectRelational(">");
-    this.state.inType = oldInType;
-    return this.finishNode(node, "TypeParameterInstantiation");
-  }
-
-  flowParseInterfaceType() {
-    const node = this.startNode();
-    this.expectContextual("interface");
-    node.extends = [];
-
-    if (this.eat(types._extends)) {
-      do {
-        node.extends.push(this.flowParseInterfaceExtends());
-      } while (this.eat(types.comma));
-    }
-
-    node.body = this.flowParseObjectType({
-      allowStatic: false,
-      allowExact: false,
-      allowSpread: false,
-      allowProto: false,
-      allowInexact: false
-    });
-    return this.finishNode(node, "InterfaceTypeAnnotation");
-  }
-
-  flowParseObjectPropertyKey() {
-    return this.match(types.num) || this.match(types.string) ? this.parseExprAtom() : this.parseIdentifier(true);
-  }
-
-  flowParseObjectTypeIndexer(node, isStatic, variance) {
-    node.static = isStatic;
-
-    if (this.lookahead().type === types.colon) {
-      node.id = this.flowParseObjectPropertyKey();
-      node.key = this.flowParseTypeInitialiser();
-    } else {
-      node.id = null;
-      node.key = this.flowParseType();
-    }
-
-    this.expect(types.bracketR);
-    node.value = this.flowParseTypeInitialiser();
-    node.variance = variance;
-    return this.finishNode(node, "ObjectTypeIndexer");
-  }
-
-  flowParseObjectTypeInternalSlot(node, isStatic) {
-    node.static = isStatic;
-    node.id = this.flowParseObjectPropertyKey();
-    this.expect(types.bracketR);
-    this.expect(types.bracketR);
-
-    if (this.isRelational("<") || this.match(types.parenL)) {
-      node.method = true;
-      node.optional = false;
-      node.value = this.flowParseObjectTypeMethodish(this.startNodeAt(node.start, node.loc.start));
-    } else {
-      node.method = false;
-
-      if (this.eat(types.question)) {
-        node.optional = true;
-      }
-
-      node.value = this.flowParseTypeInitialiser();
-    }
-
-    return this.finishNode(node, "ObjectTypeInternalSlot");
-  }
-
-  flowParseObjectTypeMethodish(node) {
-    node.params = [];
-    node.rest = null;
-    node.typeParameters = null;
-
-    if (this.isRelational("<")) {
-      node.typeParameters = this.flowParseTypeParameterDeclaration();
-    }
-
-    this.expect(types.parenL);
-
-    while (!this.match(types.parenR) && !this.match(types.ellipsis)) {
-      node.params.push(this.flowParseFunctionTypeParam());
-
-      if (!this.match(types.parenR)) {
-        this.expect(types.comma);
-      }
-    }
-
-    if (this.eat(types.ellipsis)) {
-      node.rest = this.flowParseFunctionTypeParam();
-    }
-
-    this.expect(types.parenR);
-    node.returnType = this.flowParseTypeInitialiser();
-    return this.finishNode(node, "FunctionTypeAnnotation");
-  }
-
-  flowParseObjectTypeCallProperty(node, isStatic) {
-    const valueNode = this.startNode();
-    node.static = isStatic;
-    node.value = this.flowParseObjectTypeMethodish(valueNode);
-    return this.finishNode(node, "ObjectTypeCallProperty");
-  }
-
-  flowParseObjectType({
-    allowStatic,
-    allowExact,
-    allowSpread,
-    allowProto,
-    allowInexact
-  }) {
-    const oldInType = this.state.inType;
-    this.state.inType = true;
-    const nodeStart = this.startNode();
-    nodeStart.callProperties = [];
-    nodeStart.properties = [];
-    nodeStart.indexers = [];
-    nodeStart.internalSlots = [];
-    let endDelim;
-    let exact;
-    let inexact = false;
-
-    if (allowExact && this.match(types.braceBarL)) {
-      this.expect(types.braceBarL);
-      endDelim = types.braceBarR;
-      exact = true;
-    } else {
-      this.expect(types.braceL);
-      endDelim = types.braceR;
-      exact = false;
-    }
-
-    nodeStart.exact = exact;
-
-    while (!this.match(endDelim)) {
-      let isStatic = false;
-      let protoStart = null;
-      let inexactStart = null;
-      const node = this.startNode();
-
-      if (allowProto && this.isContextual("proto")) {
-        const lookahead = this.lookahead();
-
-        if (lookahead.type !== types.colon && lookahead.type !== types.question) {
-          this.next();
-          protoStart = this.state.start;
-          allowStatic = false;
-        }
-      }
-
-      if (allowStatic && this.isContextual("static")) {
-        const lookahead = this.lookahead();
-
-        if (lookahead.type !== types.colon && lookahead.type !== types.question) {
-          this.next();
-          isStatic = true;
-        }
-      }
-
-      const variance = this.flowParseVariance();
-
-      if (this.eat(types.bracketL)) {
-        if (protoStart != null) {
-          this.unexpected(protoStart);
-        }
-
-        if (this.eat(types.bracketL)) {
-          if (variance) {
-            this.unexpected(variance.start);
-          }
-
-          nodeStart.internalSlots.push(this.flowParseObjectTypeInternalSlot(node, isStatic));
-        } else {
-          nodeStart.indexers.push(this.flowParseObjectTypeIndexer(node, isStatic, variance));
-        }
-      } else if (this.match(types.parenL) || this.isRelational("<")) {
-        if (protoStart != null) {
-          this.unexpected(protoStart);
-        }
-
-        if (variance) {
-          this.unexpected(variance.start);
-        }
-
-        nodeStart.callProperties.push(this.flowParseObjectTypeCallProperty(node, isStatic));
-      } else {
-        let kind = "init";
-
-        if (this.isContextual("get") || this.isContextual("set")) {
-          const lookahead = this.lookahead();
-
-          if (lookahead.type === types.name || lookahead.type === types.string || lookahead.type === types.num) {
-            kind = this.state.value;
-            this.next();
-          }
-        }
-
-        const propOrInexact = this.flowParseObjectTypeProperty(node, isStatic, protoStart, variance, kind, allowSpread, allowInexact != null ? allowInexact : !exact);
-
-        if (propOrInexact === null) {
-          inexact = true;
-          inexactStart = this.state.lastTokStart;
-        } else {
-          nodeStart.properties.push(propOrInexact);
-        }
-      }
-
-      this.flowObjectTypeSemicolon();
-
-      if (inexactStart && !this.match(types.braceR) && !this.match(types.braceBarR)) {
-        this.raise(inexactStart, FlowErrors.UnexpectedExplicitInexactInObject);
-      }
-    }
-
-    this.expect(endDelim);
-
-    if (allowSpread) {
-      nodeStart.inexact = inexact;
-    }
-
-    const out = this.finishNode(nodeStart, "ObjectTypeAnnotation");
-    this.state.inType = oldInType;
-    return out;
-  }
-
-  flowParseObjectTypeProperty(node, isStatic, protoStart, variance, kind, allowSpread, allowInexact) {
-    if (this.eat(types.ellipsis)) {
-      const isInexactToken = this.match(types.comma) || this.match(types.semi) || this.match(types.braceR) || this.match(types.braceBarR);
-
-      if (isInexactToken) {
-        if (!allowSpread) {
-          this.raise(this.state.lastTokStart, FlowErrors.InexactInsideNonObject);
-        } else if (!allowInexact) {
-          this.raise(this.state.lastTokStart, FlowErrors.InexactInsideExact);
-        }
-
-        if (variance) {
-          this.raise(variance.start, FlowErrors.InexactVariance);
-        }
-
-        return null;
-      }
-
-      if (!allowSpread) {
-        this.raise(this.state.lastTokStart, FlowErrors.UnexpectedSpreadType);
-      }
-
-      if (protoStart != null) {
-        this.unexpected(protoStart);
-      }
-
-      if (variance) {
-        this.raise(variance.start, FlowErrors.SpreadVariance);
-      }
-
-      node.argument = this.flowParseType();
-      return this.finishNode(node, "ObjectTypeSpreadProperty");
-    } else {
-      node.key = this.flowParseObjectPropertyKey();
-      node.static = isStatic;
-      node.proto = protoStart != null;
-      node.kind = kind;
-      let optional = false;
-
-      if (this.isRelational("<") || this.match(types.parenL)) {
-        node.method = true;
-
-        if (protoStart != null) {
-          this.unexpected(protoStart);
-        }
-
-        if (variance) {
-          this.unexpected(variance.start);
-        }
-
-        node.value = this.flowParseObjectTypeMethodish(this.startNodeAt(node.start, node.loc.start));
-
-        if (kind === "get" || kind === "set") {
-          this.flowCheckGetterSetterParams(node);
-        }
-      } else {
-        if (kind !== "init") this.unexpected();
-        node.method = false;
-
-        if (this.eat(types.question)) {
-          optional = true;
-        }
-
-        node.value = this.flowParseTypeInitialiser();
-        node.variance = variance;
-      }
-
-      node.optional = optional;
-      return this.finishNode(node, "ObjectTypeProperty");
-    }
-  }
-
-  flowCheckGetterSetterParams(property) {
-    const paramCount = property.kind === "get" ? 0 : 1;
-    const start = property.start;
-    const length = property.value.params.length + (property.value.rest ? 1 : 0);
-
-    if (length !== paramCount) {
-      if (property.kind === "get") {
-        this.raise(start, Errors.BadGetterArity);
-      } else {
-        this.raise(start, Errors.BadSetterArity);
-      }
-    }
-
-    if (property.kind === "set" && property.value.rest) {
-      this.raise(start, Errors.BadSetterRestParameter);
-    }
-  }
-
-  flowObjectTypeSemicolon() {
-    if (!this.eat(types.semi) && !this.eat(types.comma) && !this.match(types.braceR) && !this.match(types.braceBarR)) {
-      this.unexpected();
-    }
-  }
-
-  flowParseQualifiedTypeIdentifier(startPos, startLoc, id) {
-    startPos = startPos || this.state.start;
-    startLoc = startLoc || this.state.startLoc;
-    let node = id || this.flowParseRestrictedIdentifier(true);
-
-    while (this.eat(types.dot)) {
-      const node2 = this.startNodeAt(startPos, startLoc);
-      node2.qualification = node;
-      node2.id = this.flowParseRestrictedIdentifier(true);
-      node = this.finishNode(node2, "QualifiedTypeIdentifier");
-    }
-
-    return node;
-  }
-
-  flowParseGenericType(startPos, startLoc, id) {
-    const node = this.startNodeAt(startPos, startLoc);
-    node.typeParameters = null;
-    node.id = this.flowParseQualifiedTypeIdentifier(startPos, startLoc, id);
-
-    if (this.isRelational("<")) {
-      node.typeParameters = this.flowParseTypeParameterInstantiation();
-    }
-
-    return this.finishNode(node, "GenericTypeAnnotation");
-  }
-
-  flowParseTypeofType() {
-    const node = this.startNode();
-    this.expect(types._typeof);
-    node.argument = this.flowParsePrimaryType();
-    return this.finishNode(node, "TypeofTypeAnnotation");
-  }
-
-  flowParseTupleType() {
-    const node = this.startNode();
-    node.types = [];
-    this.expect(types.bracketL);
-
-    while (this.state.pos < this.length && !this.match(types.bracketR)) {
-      node.types.push(this.flowParseType());
-      if (this.match(types.bracketR)) break;
-      this.expect(types.comma);
-    }
-
-    this.expect(types.bracketR);
-    return this.finishNode(node, "TupleTypeAnnotation");
-  }
-
-  flowParseFunctionTypeParam() {
-    let name = null;
-    let optional = false;
-    let typeAnnotation = null;
-    const node = this.startNode();
-    const lh = this.lookahead();
-
-    if (lh.type === types.colon || lh.type === types.question) {
-      name = this.parseIdentifier();
-
-      if (this.eat(types.question)) {
-        optional = true;
-      }
-
-      typeAnnotation = this.flowParseTypeInitialiser();
-    } else {
-      typeAnnotation = this.flowParseType();
-    }
-
-    node.name = name;
-    node.optional = optional;
-    node.typeAnnotation = typeAnnotation;
-    return this.finishNode(node, "FunctionTypeParam");
-  }
-
-  reinterpretTypeAsFunctionTypeParam(type) {
-    const node = this.startNodeAt(type.start, type.loc.start);
-    node.name = null;
-    node.optional = false;
-    node.typeAnnotation = type;
-    return this.finishNode(node, "FunctionTypeParam");
-  }
-
-  flowParseFunctionTypeParams(params = []) {
-    let rest = null;
-
-    while (!this.match(types.parenR) && !this.match(types.ellipsis)) {
-      params.push(this.flowParseFunctionTypeParam());
-
-      if (!this.match(types.parenR)) {
-        this.expect(types.comma);
-      }
-    }
-
-    if (this.eat(types.ellipsis)) {
-      rest = this.flowParseFunctionTypeParam();
-    }
-
-    return {
-      params,
-      rest
-    };
-  }
-
-  flowIdentToTypeAnnotation(startPos, startLoc, node, id) {
-    switch (id.name) {
-      case "any":
-        return this.finishNode(node, "AnyTypeAnnotation");
-
-      case "bool":
-      case "boolean":
-        return this.finishNode(node, "BooleanTypeAnnotation");
-
-      case "mixed":
-        return this.finishNode(node, "MixedTypeAnnotation");
-
-      case "empty":
-        return this.finishNode(node, "EmptyTypeAnnotation");
-
-      case "number":
-        return this.finishNode(node, "NumberTypeAnnotation");
-
-      case "string":
-        return this.finishNode(node, "StringTypeAnnotation");
-
-      case "symbol":
-        return this.finishNode(node, "SymbolTypeAnnotation");
-
-      default:
-        this.checkNotUnderscore(id.name);
-        return this.flowParseGenericType(startPos, startLoc, id);
-    }
-  }
-
-  flowParsePrimaryType() {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    const node = this.startNode();
-    let tmp;
-    let type;
-    let isGroupedType = false;
-    const oldNoAnonFunctionType = this.state.noAnonFunctionType;
-
-    switch (this.state.type) {
-      case types.name:
-        if (this.isContextual("interface")) {
-          return this.flowParseInterfaceType();
-        }
-
-        return this.flowIdentToTypeAnnotation(startPos, startLoc, node, this.parseIdentifier());
-
-      case types.braceL:
-        return this.flowParseObjectType({
-          allowStatic: false,
-          allowExact: false,
-          allowSpread: true,
-          allowProto: false,
-          allowInexact: true
-        });
-
-      case types.braceBarL:
-        return this.flowParseObjectType({
-          allowStatic: false,
-          allowExact: true,
-          allowSpread: true,
-          allowProto: false,
-          allowInexact: false
-        });
-
-      case types.bracketL:
-        this.state.noAnonFunctionType = false;
-        type = this.flowParseTupleType();
-        this.state.noAnonFunctionType = oldNoAnonFunctionType;
-        return type;
-
-      case types.relational:
-        if (this.state.value === "<") {
-          node.typeParameters = this.flowParseTypeParameterDeclaration();
-          this.expect(types.parenL);
-          tmp = this.flowParseFunctionTypeParams();
-          node.params = tmp.params;
-          node.rest = tmp.rest;
-          this.expect(types.parenR);
-          this.expect(types.arrow);
-          node.returnType = this.flowParseType();
-          return this.finishNode(node, "FunctionTypeAnnotation");
-        }
-
-        break;
-
-      case types.parenL:
-        this.next();
-
-        if (!this.match(types.parenR) && !this.match(types.ellipsis)) {
-          if (this.match(types.name)) {
-            const token = this.lookahead().type;
-            isGroupedType = token !== types.question && token !== types.colon;
-          } else {
-            isGroupedType = true;
-          }
-        }
-
-        if (isGroupedType) {
-          this.state.noAnonFunctionType = false;
-          type = this.flowParseType();
-          this.state.noAnonFunctionType = oldNoAnonFunctionType;
-
-          if (this.state.noAnonFunctionType || !(this.match(types.comma) || this.match(types.parenR) && this.lookahead().type === types.arrow)) {
-            this.expect(types.parenR);
-            return type;
-          } else {
-            this.eat(types.comma);
-          }
-        }
-
-        if (type) {
-          tmp = this.flowParseFunctionTypeParams([this.reinterpretTypeAsFunctionTypeParam(type)]);
-        } else {
-          tmp = this.flowParseFunctionTypeParams();
-        }
-
-        node.params = tmp.params;
-        node.rest = tmp.rest;
-        this.expect(types.parenR);
-        this.expect(types.arrow);
-        node.returnType = this.flowParseType();
-        node.typeParameters = null;
-        return this.finishNode(node, "FunctionTypeAnnotation");
-
-      case types.string:
-        return this.parseLiteral(this.state.value, "StringLiteralTypeAnnotation");
-
-      case types._true:
-      case types._false:
-        node.value = this.match(types._true);
-        this.next();
-        return this.finishNode(node, "BooleanLiteralTypeAnnotation");
-
-      case types.plusMin:
-        if (this.state.value === "-") {
-          this.next();
-
-          if (this.match(types.num)) {
-            return this.parseLiteral(-this.state.value, "NumberLiteralTypeAnnotation", node.start, node.loc.start);
-          }
-
-          if (this.match(types.bigint)) {
-            return this.parseLiteral(-this.state.value, "BigIntLiteralTypeAnnotation", node.start, node.loc.start);
-          }
-
-          throw this.raise(this.state.start, FlowErrors.UnexpectedSubtractionOperand);
-        }
-
-        throw this.unexpected();
-
-      case types.num:
-        return this.parseLiteral(this.state.value, "NumberLiteralTypeAnnotation");
-
-      case types.bigint:
-        return this.parseLiteral(this.state.value, "BigIntLiteralTypeAnnotation");
-
-      case types._void:
-        this.next();
-        return this.finishNode(node, "VoidTypeAnnotation");
-
-      case types._null:
-        this.next();
-        return this.finishNode(node, "NullLiteralTypeAnnotation");
-
-      case types._this:
-        this.next();
-        return this.finishNode(node, "ThisTypeAnnotation");
-
-      case types.star:
-        this.next();
-        return this.finishNode(node, "ExistsTypeAnnotation");
-
-      default:
-        if (this.state.type.keyword === "typeof") {
-          return this.flowParseTypeofType();
-        } else if (this.state.type.keyword) {
-          const label = this.state.type.label;
-          this.next();
-          return super.createIdentifier(node, label);
-        }
-
-    }
-
-    throw this.unexpected();
-  }
-
-  flowParsePostfixType() {
-    const startPos = this.state.start,
-          startLoc = this.state.startLoc;
-    let type = this.flowParsePrimaryType();
-
-    while (this.match(types.bracketL) && !this.canInsertSemicolon()) {
-      const node = this.startNodeAt(startPos, startLoc);
-      node.elementType = type;
-      this.expect(types.bracketL);
-      this.expect(types.bracketR);
-      type = this.finishNode(node, "ArrayTypeAnnotation");
-    }
-
-    return type;
-  }
-
-  flowParsePrefixType() {
-    const node = this.startNode();
-
-    if (this.eat(types.question)) {
-      node.typeAnnotation = this.flowParsePrefixType();
-      return this.finishNode(node, "NullableTypeAnnotation");
-    } else {
-      return this.flowParsePostfixType();
-    }
-  }
-
-  flowParseAnonFunctionWithoutParens() {
-    const param = this.flowParsePrefixType();
-
-    if (!this.state.noAnonFunctionType && this.eat(types.arrow)) {
-      const node = this.startNodeAt(param.start, param.loc.start);
-      node.params = [this.reinterpretTypeAsFunctionTypeParam(param)];
-      node.rest = null;
-      node.returnType = this.flowParseType();
-      node.typeParameters = null;
-      return this.finishNode(node, "FunctionTypeAnnotation");
-    }
-
-    return param;
-  }
-
-  flowParseIntersectionType() {
-    const node = this.startNode();
-    this.eat(types.bitwiseAND);
-    const type = this.flowParseAnonFunctionWithoutParens();
-    node.types = [type];
-
-    while (this.eat(types.bitwiseAND)) {
-      node.types.push(this.flowParseAnonFunctionWithoutParens());
-    }
-
-    return node.types.length === 1 ? type : this.finishNode(node, "IntersectionTypeAnnotation");
-  }
-
-  flowParseUnionType() {
-    const node = this.startNode();
-    this.eat(types.bitwiseOR);
-    const type = this.flowParseIntersectionType();
-    node.types = [type];
-
-    while (this.eat(types.bitwiseOR)) {
-      node.types.push(this.flowParseIntersectionType());
-    }
-
-    return node.types.length === 1 ? type : this.finishNode(node, "UnionTypeAnnotation");
-  }
-
-  flowParseType() {
-    const oldInType = this.state.inType;
-    this.state.inType = true;
-    const type = this.flowParseUnionType();
-    this.state.inType = oldInType;
-    this.state.exprAllowed = this.state.exprAllowed || this.state.noAnonFunctionType;
-    return type;
-  }
-
-  flowParseTypeOrImplicitInstantiation() {
-    if (this.state.type === types.name && this.state.value === "_") {
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-      const node = this.parseIdentifier();
-      return this.flowParseGenericType(startPos, startLoc, node);
-    } else {
-      return this.flowParseType();
-    }
-  }
-
-  flowParseTypeAnnotation() {
-    const node = this.startNode();
-    node.typeAnnotation = this.flowParseTypeInitialiser();
-    return this.finishNode(node, "TypeAnnotation");
-  }
-
-  flowParseTypeAnnotatableIdentifier(allowPrimitiveOverride) {
-    const ident = allowPrimitiveOverride ? this.parseIdentifier() : this.flowParseRestrictedIdentifier();
-
-    if (this.match(types.colon)) {
-      ident.typeAnnotation = this.flowParseTypeAnnotation();
-      this.resetEndLocation(ident);
-    }
-
-    return ident;
-  }
-
-  typeCastToParameter(node) {
-    node.expression.typeAnnotation = node.typeAnnotation;
-    this.resetEndLocation(node.expression, node.typeAnnotation.end, node.typeAnnotation.loc.end);
-    return node.expression;
-  }
-
-  flowParseVariance() {
-    let variance = null;
-
-    if (this.match(types.plusMin)) {
-      variance = this.startNode();
-
-      if (this.state.value === "+") {
-        variance.kind = "plus";
-      } else {
-        variance.kind = "minus";
-      }
-
-      this.next();
-      this.finishNode(variance, "Variance");
-    }
-
-    return variance;
-  }
-
-  parseFunctionBody(node, allowExpressionBody, isMethod = false) {
-    if (allowExpressionBody) {
-      return this.forwardNoArrowParamsConversionAt(node, () => super.parseFunctionBody(node, true, isMethod));
-    }
-
-    return super.parseFunctionBody(node, false, isMethod);
-  }
-
-  parseFunctionBodyAndFinish(node, type, isMethod = false) {
-    if (this.match(types.colon)) {
-      const typeNode = this.startNode();
-      [typeNode.typeAnnotation, node.predicate] = this.flowParseTypeAndPredicateInitialiser();
-      node.returnType = typeNode.typeAnnotation ? this.finishNode(typeNode, "TypeAnnotation") : null;
-    }
-
-    super.parseFunctionBodyAndFinish(node, type, isMethod);
-  }
-
-  parseStatement(context, topLevel) {
-    if (this.state.strict && this.match(types.name) && this.state.value === "interface") {
-      const node = this.startNode();
-      this.next();
-      return this.flowParseInterface(node);
-    } else if (this.shouldParseEnums() && this.isContextual("enum")) {
-      const node = this.startNode();
-      this.next();
-      return this.flowParseEnumDeclaration(node);
-    } else {
-      const stmt = super.parseStatement(context, topLevel);
-
-      if (this.flowPragma === undefined && !this.isValidDirective(stmt)) {
-        this.flowPragma = null;
-      }
-
-      return stmt;
-    }
-  }
-
-  parseExpressionStatement(node, expr) {
-    if (expr.type === "Identifier") {
-      if (expr.name === "declare") {
-        if (this.match(types._class) || this.match(types.name) || this.match(types._function) || this.match(types._var) || this.match(types._export)) {
-          return this.flowParseDeclare(node);
-        }
-      } else if (this.match(types.name)) {
-        if (expr.name === "interface") {
-          return this.flowParseInterface(node);
-        } else if (expr.name === "type") {
-          return this.flowParseTypeAlias(node);
-        } else if (expr.name === "opaque") {
-          return this.flowParseOpaqueType(node, false);
-        }
-      }
-    }
-
-    return super.parseExpressionStatement(node, expr);
-  }
-
-  shouldParseExportDeclaration() {
-    return this.isContextual("type") || this.isContextual("interface") || this.isContextual("opaque") || this.shouldParseEnums() && this.isContextual("enum") || super.shouldParseExportDeclaration();
-  }
-
-  isExportDefaultSpecifier() {
-    if (this.match(types.name) && (this.state.value === "type" || this.state.value === "interface" || this.state.value === "opaque" || this.shouldParseEnums() && this.state.value === "enum")) {
-      return false;
-    }
-
-    return super.isExportDefaultSpecifier();
-  }
-
-  parseExportDefaultExpression() {
-    if (this.shouldParseEnums() && this.isContextual("enum")) {
-      const node = this.startNode();
-      this.next();
-      return this.flowParseEnumDeclaration(node);
-    }
-
-    return super.parseExportDefaultExpression();
-  }
-
-  parseConditional(expr, noIn, startPos, startLoc, refNeedsArrowPos) {
-    if (!this.match(types.question)) return expr;
-
-    if (refNeedsArrowPos) {
-      const result = this.tryParse(() => super.parseConditional(expr, noIn, startPos, startLoc));
-
-      if (!result.node) {
-        refNeedsArrowPos.start = result.error.pos || this.state.start;
-        return expr;
-      }
-
-      if (result.error) this.state = result.failState;
-      return result.node;
-    }
-
-    this.expect(types.question);
-    const state = this.state.clone();
-    const originalNoArrowAt = this.state.noArrowAt;
-    const node = this.startNodeAt(startPos, startLoc);
-    let {
-      consequent,
-      failed
-    } = this.tryParseConditionalConsequent();
-    let [valid, invalid] = this.getArrowLikeExpressions(consequent);
-
-    if (failed || invalid.length > 0) {
-      const noArrowAt = [...originalNoArrowAt];
-
-      if (invalid.length > 0) {
-        this.state = state;
-        this.state.noArrowAt = noArrowAt;
-
-        for (let i = 0; i < invalid.length; i++) {
-          noArrowAt.push(invalid[i].start);
-        }
-
-        ({
-          consequent,
-          failed
-        } = this.tryParseConditionalConsequent());
-        [valid, invalid] = this.getArrowLikeExpressions(consequent);
-      }
-
-      if (failed && valid.length > 1) {
-        this.raise(state.start, FlowErrors.AmbiguousConditionalArrow);
-      }
-
-      if (failed && valid.length === 1) {
-        this.state = state;
-        this.state.noArrowAt = noArrowAt.concat(valid[0].start);
-        ({
-          consequent,
-          failed
-        } = this.tryParseConditionalConsequent());
-      }
-    }
-
-    this.getArrowLikeExpressions(consequent, true);
-    this.state.noArrowAt = originalNoArrowAt;
-    this.expect(types.colon);
-    node.test = expr;
-    node.consequent = consequent;
-    node.alternate = this.forwardNoArrowParamsConversionAt(node, () => this.parseMaybeAssign(noIn, undefined, undefined, undefined));
-    return this.finishNode(node, "ConditionalExpression");
-  }
-
-  tryParseConditionalConsequent() {
-    this.state.noArrowParamsConversionAt.push(this.state.start);
-    const consequent = this.parseMaybeAssign();
-    const failed = !this.match(types.colon);
-    this.state.noArrowParamsConversionAt.pop();
-    return {
-      consequent,
-      failed
-    };
-  }
-
-  getArrowLikeExpressions(node, disallowInvalid) {
-    const stack = [node];
-    const arrows = [];
-
-    while (stack.length !== 0) {
-      const node = stack.pop();
-
-      if (node.type === "ArrowFunctionExpression") {
-        if (node.typeParameters || !node.returnType) {
-          this.finishArrowValidation(node);
-        } else {
-          arrows.push(node);
-        }
-
-        stack.push(node.body);
-      } else if (node.type === "ConditionalExpression") {
-        stack.push(node.consequent);
-        stack.push(node.alternate);
-      }
-    }
-
-    if (disallowInvalid) {
-      arrows.forEach(node => this.finishArrowValidation(node));
-      return [arrows, []];
-    }
-
-    return partition(arrows, node => node.params.every(param => this.isAssignable(param, true)));
-  }
-
-  finishArrowValidation(node) {
-    var _node$extra;
-
-    this.toAssignableList(node.params, (_node$extra = node.extra) == null ? void 0 : _node$extra.trailingComma);
-    this.scope.enter(SCOPE_FUNCTION | SCOPE_ARROW);
-    super.checkParams(node, false, true);
-    this.scope.exit();
-  }
-
-  forwardNoArrowParamsConversionAt(node, parse) {
-    let result;
-
-    if (this.state.noArrowParamsConversionAt.indexOf(node.start) !== -1) {
-      this.state.noArrowParamsConversionAt.push(this.state.start);
-      result = parse();
-      this.state.noArrowParamsConversionAt.pop();
-    } else {
-      result = parse();
-    }
-
-    return result;
-  }
-
-  parseParenItem(node, startPos, startLoc) {
-    node = super.parseParenItem(node, startPos, startLoc);
-
-    if (this.eat(types.question)) {
-      node.optional = true;
-      this.resetEndLocation(node);
-    }
-
-    if (this.match(types.colon)) {
-      const typeCastNode = this.startNodeAt(startPos, startLoc);
-      typeCastNode.expression = node;
-      typeCastNode.typeAnnotation = this.flowParseTypeAnnotation();
-      return this.finishNode(typeCastNode, "TypeCastExpression");
-    }
-
-    return node;
-  }
-
-  assertModuleNodeAllowed(node) {
-    if (node.type === "ImportDeclaration" && (node.importKind === "type" || node.importKind === "typeof") || node.type === "ExportNamedDeclaration" && node.exportKind === "type" || node.type === "ExportAllDeclaration" && node.exportKind === "type") {
-      return;
-    }
-
-    super.assertModuleNodeAllowed(node);
-  }
-
-  parseExport(node) {
-    const decl = super.parseExport(node);
-
-    if (decl.type === "ExportNamedDeclaration" || decl.type === "ExportAllDeclaration") {
-      decl.exportKind = decl.exportKind || "value";
-    }
-
-    return decl;
-  }
-
-  parseExportDeclaration(node) {
-    if (this.isContextual("type")) {
-      node.exportKind = "type";
-      const declarationNode = this.startNode();
-      this.next();
-
-      if (this.match(types.braceL)) {
-        node.specifiers = this.parseExportSpecifiers();
-        this.parseExportFrom(node);
-        return null;
-      } else {
-        return this.flowParseTypeAlias(declarationNode);
-      }
-    } else if (this.isContextual("opaque")) {
-      node.exportKind = "type";
-      const declarationNode = this.startNode();
-      this.next();
-      return this.flowParseOpaqueType(declarationNode, false);
-    } else if (this.isContextual("interface")) {
-      node.exportKind = "type";
-      const declarationNode = this.startNode();
-      this.next();
-      return this.flowParseInterface(declarationNode);
-    } else if (this.shouldParseEnums() && this.isContextual("enum")) {
-      node.exportKind = "value";
-      const declarationNode = this.startNode();
-      this.next();
-      return this.flowParseEnumDeclaration(declarationNode);
-    } else {
-      return super.parseExportDeclaration(node);
-    }
-  }
-
-  eatExportStar(node) {
-    if (super.eatExportStar(...arguments)) return true;
-
-    if (this.isContextual("type") && this.lookahead().type === types.star) {
-      node.exportKind = "type";
-      this.next();
-      this.next();
-      return true;
-    }
-
-    return false;
-  }
-
-  maybeParseExportNamespaceSpecifier(node) {
-    const pos = this.state.start;
-    const hasNamespace = super.maybeParseExportNamespaceSpecifier(node);
-
-    if (hasNamespace && node.exportKind === "type") {
-      this.unexpected(pos);
-    }
-
-    return hasNamespace;
-  }
-
-  parseClassId(node, isStatement, optionalId) {
-    super.parseClassId(node, isStatement, optionalId);
-
-    if (this.isRelational("<")) {
-      node.typeParameters = this.flowParseTypeParameterDeclaration();
-    }
-  }
-
-  parseClassMember(classBody, member, state, constructorAllowsSuper) {
-    const pos = this.state.start;
-
-    if (this.isContextual("declare")) {
-      if (this.parseClassMemberFromModifier(classBody, member)) {
-        return;
-      }
-
-      member.declare = true;
-    }
-
-    super.parseClassMember(classBody, member, state, constructorAllowsSuper);
-
-    if (member.declare) {
-      if (member.type !== "ClassProperty" && member.type !== "ClassPrivateProperty") {
-        this.raise(pos, FlowErrors.DeclareClassElement);
-      } else if (member.value) {
-        this.raise(member.value.start, FlowErrors.DeclareClassFieldInitializer);
-      }
-    }
-  }
-
-  getTokenFromCode(code) {
-    const next = this.input.charCodeAt(this.state.pos + 1);
-
-    if (code === 123 && next === 124) {
-      return this.finishOp(types.braceBarL, 2);
-    } else if (this.state.inType && (code === 62 || code === 60)) {
-      return this.finishOp(types.relational, 1);
-    } else if (isIteratorStart(code, next)) {
-      this.state.isIterator = true;
-      return super.readWord();
-    } else {
-      return super.getTokenFromCode(code);
-    }
-  }
-
-  isAssignable(node, isBinding) {
-    switch (node.type) {
-      case "Identifier":
-      case "ObjectPattern":
-      case "ArrayPattern":
-      case "AssignmentPattern":
-        return true;
-
-      case "ObjectExpression":
-        {
-          const last = node.properties.length - 1;
-          return node.properties.every((prop, i) => {
-            return prop.type !== "ObjectMethod" && (i === last || prop.type === "SpreadElement") && this.isAssignable(prop);
-          });
-        }
-
-      case "ObjectProperty":
-        return this.isAssignable(node.value);
-
-      case "SpreadElement":
-        return this.isAssignable(node.argument);
-
-      case "ArrayExpression":
-        return node.elements.every(element => this.isAssignable(element));
-
-      case "AssignmentExpression":
-        return node.operator === "=";
-
-      case "ParenthesizedExpression":
-      case "TypeCastExpression":
-        return this.isAssignable(node.expression);
-
-      case "MemberExpression":
-      case "OptionalMemberExpression":
-        return !isBinding;
-
-      default:
-        return false;
-    }
-  }
-
-  toAssignable(node) {
-    if (node.type === "TypeCastExpression") {
-      return super.toAssignable(this.typeCastToParameter(node));
-    } else {
-      return super.toAssignable(node);
-    }
-  }
-
-  toAssignableList(exprList, trailingCommaPos) {
-    for (let i = 0; i < exprList.length; i++) {
-      const expr = exprList[i];
-
-      if (expr && expr.type === "TypeCastExpression") {
-        exprList[i] = this.typeCastToParameter(expr);
-      }
-    }
-
-    return super.toAssignableList(exprList, trailingCommaPos);
-  }
-
-  toReferencedList(exprList, isParenthesizedExpr) {
-    for (let i = 0; i < exprList.length; i++) {
-      const expr = exprList[i];
-
-      if (expr && expr.type === "TypeCastExpression" && (!expr.extra || !expr.extra.parenthesized) && (exprList.length > 1 || !isParenthesizedExpr)) {
-        this.raise(expr.typeAnnotation.start, FlowErrors.TypeCastInPattern);
-      }
-    }
-
-    return exprList;
-  }
-
-  checkLVal(expr, bindingType = BIND_NONE, checkClashes, contextDescription) {
-    if (expr.type !== "TypeCastExpression") {
-      return super.checkLVal(expr, bindingType, checkClashes, contextDescription);
-    }
-  }
-
-  parseClassProperty(node) {
-    if (this.match(types.colon)) {
-      node.typeAnnotation = this.flowParseTypeAnnotation();
-    }
-
-    return super.parseClassProperty(node);
-  }
-
-  parseClassPrivateProperty(node) {
-    if (this.match(types.colon)) {
-      node.typeAnnotation = this.flowParseTypeAnnotation();
-    }
-
-    return super.parseClassPrivateProperty(node);
-  }
-
-  isClassMethod() {
-    return this.isRelational("<") || super.isClassMethod();
-  }
-
-  isClassProperty() {
-    return this.match(types.colon) || super.isClassProperty();
-  }
-
-  isNonstaticConstructor(method) {
-    return !this.match(types.colon) && super.isNonstaticConstructor(method);
-  }
-
-  pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper) {
-    if (method.variance) {
-      this.unexpected(method.variance.start);
-    }
-
-    delete method.variance;
-
-    if (this.isRelational("<")) {
-      method.typeParameters = this.flowParseTypeParameterDeclaration();
-    }
-
-    super.pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper);
-  }
-
-  pushClassPrivateMethod(classBody, method, isGenerator, isAsync) {
-    if (method.variance) {
-      this.unexpected(method.variance.start);
-    }
-
-    delete method.variance;
-
-    if (this.isRelational("<")) {
-      method.typeParameters = this.flowParseTypeParameterDeclaration();
-    }
-
-    super.pushClassPrivateMethod(classBody, method, isGenerator, isAsync);
-  }
-
-  parseClassSuper(node) {
-    super.parseClassSuper(node);
-
-    if (node.superClass && this.isRelational("<")) {
-      node.superTypeParameters = this.flowParseTypeParameterInstantiation();
-    }
-
-    if (this.isContextual("implements")) {
-      this.next();
-      const implemented = node.implements = [];
-
-      do {
-        const node = this.startNode();
-        node.id = this.flowParseRestrictedIdentifier(true);
-
-        if (this.isRelational("<")) {
-          node.typeParameters = this.flowParseTypeParameterInstantiation();
-        } else {
-          node.typeParameters = null;
-        }
-
-        implemented.push(this.finishNode(node, "ClassImplements"));
-      } while (this.eat(types.comma));
-    }
-  }
-
-  parsePropertyName(node, isPrivateNameAllowed) {
-    const variance = this.flowParseVariance();
-    const key = super.parsePropertyName(node, isPrivateNameAllowed);
-    node.variance = variance;
-    return key;
-  }
-
-  parseObjPropValue(prop, startPos, startLoc, isGenerator, isAsync, isPattern, refExpressionErrors, containsEsc) {
-    if (prop.variance) {
-      this.unexpected(prop.variance.start);
-    }
-
-    delete prop.variance;
-    let typeParameters;
-
-    if (this.isRelational("<")) {
-      typeParameters = this.flowParseTypeParameterDeclaration();
-      if (!this.match(types.parenL)) this.unexpected();
-    }
-
-    super.parseObjPropValue(prop, startPos, startLoc, isGenerator, isAsync, isPattern, refExpressionErrors, containsEsc);
-
-    if (typeParameters) {
-      (prop.value || prop).typeParameters = typeParameters;
-    }
-  }
-
-  parseAssignableListItemTypes(param) {
-    if (this.eat(types.question)) {
-      if (param.type !== "Identifier") {
-        this.raise(param.start, FlowErrors.OptionalBindingPattern);
-      }
-
-      param.optional = true;
-    }
-
-    if (this.match(types.colon)) {
-      param.typeAnnotation = this.flowParseTypeAnnotation();
-    }
-
-    this.resetEndLocation(param);
-    return param;
-  }
-
-  parseMaybeDefault(startPos, startLoc, left) {
-    const node = super.parseMaybeDefault(startPos, startLoc, left);
-
-    if (node.type === "AssignmentPattern" && node.typeAnnotation && node.right.start < node.typeAnnotation.start) {
-      this.raise(node.typeAnnotation.start, FlowErrors.TypeBeforeInitializer);
-    }
-
-    return node;
-  }
-
-  shouldParseDefaultImport(node) {
-    if (!hasTypeImportKind(node)) {
-      return super.shouldParseDefaultImport(node);
-    }
-
-    return isMaybeDefaultImport(this.state);
-  }
-
-  parseImportSpecifierLocal(node, specifier, type, contextDescription) {
-    specifier.local = hasTypeImportKind(node) ? this.flowParseRestrictedIdentifier(true, true) : this.parseIdentifier();
-    this.checkLVal(specifier.local, BIND_LEXICAL, undefined, contextDescription);
-    node.specifiers.push(this.finishNode(specifier, type));
-  }
-
-  maybeParseDefaultImportSpecifier(node) {
-    node.importKind = "value";
-    let kind = null;
-
-    if (this.match(types._typeof)) {
-      kind = "typeof";
-    } else if (this.isContextual("type")) {
-      kind = "type";
-    }
-
-    if (kind) {
-      const lh = this.lookahead();
-
-      if (kind === "type" && lh.type === types.star) {
-        this.unexpected(lh.start);
-      }
-
-      if (isMaybeDefaultImport(lh) || lh.type === types.braceL || lh.type === types.star) {
-        this.next();
-        node.importKind = kind;
-      }
-    }
-
-    return super.maybeParseDefaultImportSpecifier(node);
-  }
-
-  parseImportSpecifier(node) {
-    const specifier = this.startNode();
-    const firstIdentLoc = this.state.start;
-    const firstIdent = this.parseIdentifier(true);
-    let specifierTypeKind = null;
-
-    if (firstIdent.name === "type") {
-      specifierTypeKind = "type";
-    } else if (firstIdent.name === "typeof") {
-      specifierTypeKind = "typeof";
-    }
-
-    let isBinding = false;
-
-    if (this.isContextual("as") && !this.isLookaheadContextual("as")) {
-      const as_ident = this.parseIdentifier(true);
-
-      if (specifierTypeKind !== null && !this.match(types.name) && !this.state.type.keyword) {
-        specifier.imported = as_ident;
-        specifier.importKind = specifierTypeKind;
-        specifier.local = as_ident.__clone();
-      } else {
-        specifier.imported = firstIdent;
-        specifier.importKind = null;
-        specifier.local = this.parseIdentifier();
-      }
-    } else if (specifierTypeKind !== null && (this.match(types.name) || this.state.type.keyword)) {
-      specifier.imported = this.parseIdentifier(true);
-      specifier.importKind = specifierTypeKind;
-
-      if (this.eatContextual("as")) {
-        specifier.local = this.parseIdentifier();
-      } else {
-        isBinding = true;
-        specifier.local = specifier.imported.__clone();
-      }
-    } else {
-      isBinding = true;
-      specifier.imported = firstIdent;
-      specifier.importKind = null;
-      specifier.local = specifier.imported.__clone();
-    }
-
-    const nodeIsTypeImport = hasTypeImportKind(node);
-    const specifierIsTypeImport = hasTypeImportKind(specifier);
-
-    if (nodeIsTypeImport && specifierIsTypeImport) {
-      this.raise(firstIdentLoc, FlowErrors.ImportTypeShorthandOnlyInPureImport);
-    }
-
-    if (nodeIsTypeImport || specifierIsTypeImport) {
-      this.checkReservedType(specifier.local.name, specifier.local.start, true);
-    }
-
-    if (isBinding && !nodeIsTypeImport && !specifierIsTypeImport) {
-      this.checkReservedWord(specifier.local.name, specifier.start, true, true);
-    }
-
-    this.checkLVal(specifier.local, BIND_LEXICAL, undefined, "import specifier");
-    node.specifiers.push(this.finishNode(specifier, "ImportSpecifier"));
-  }
-
-  parseFunctionParams(node, allowModifiers) {
-    const kind = node.kind;
-
-    if (kind !== "get" && kind !== "set" && this.isRelational("<")) {
-      node.typeParameters = this.flowParseTypeParameterDeclaration();
-    }
-
-    super.parseFunctionParams(node, allowModifiers);
-  }
-
-  parseVarId(decl, kind) {
-    super.parseVarId(decl, kind);
-
-    if (this.match(types.colon)) {
-      decl.id.typeAnnotation = this.flowParseTypeAnnotation();
-      this.resetEndLocation(decl.id);
-    }
-  }
-
-  parseAsyncArrowFromCallExpression(node, call) {
-    if (this.match(types.colon)) {
-      const oldNoAnonFunctionType = this.state.noAnonFunctionType;
-      this.state.noAnonFunctionType = true;
-      node.returnType = this.flowParseTypeAnnotation();
-      this.state.noAnonFunctionType = oldNoAnonFunctionType;
-    }
-
-    return super.parseAsyncArrowFromCallExpression(node, call);
-  }
-
-  shouldParseAsyncArrow() {
-    return this.match(types.colon) || super.shouldParseAsyncArrow();
-  }
-
-  parseMaybeAssign(noIn, refExpressionErrors, afterLeftParse, refNeedsArrowPos) {
-    let state = null;
-    let jsx;
-
-    if (this.hasPlugin("jsx") && (this.match(types.jsxTagStart) || this.isRelational("<"))) {
-      state = this.state.clone();
-      jsx = this.tryParse(() => super.parseMaybeAssign(noIn, refExpressionErrors, afterLeftParse, refNeedsArrowPos), state);
-      if (!jsx.error) return jsx.node;
-      const {
-        context
-      } = this.state;
-
-      if (context[context.length - 1] === types$1.j_oTag) {
-        context.length -= 2;
-      } else if (context[context.length - 1] === types$1.j_expr) {
-        context.length -= 1;
-      }
-    }
-
-    if (jsx && jsx.error || this.isRelational("<")) {
-      state = state || this.state.clone();
-      let typeParameters;
-      const arrow = this.tryParse(() => {
-        typeParameters = this.flowParseTypeParameterDeclaration();
-        const arrowExpression = this.forwardNoArrowParamsConversionAt(typeParameters, () => super.parseMaybeAssign(noIn, refExpressionErrors, afterLeftParse, refNeedsArrowPos));
-        arrowExpression.typeParameters = typeParameters;
-        this.resetStartLocationFromNode(arrowExpression, typeParameters);
-        return arrowExpression;
-      }, state);
-      const arrowExpression = arrow.node && arrow.node.type === "ArrowFunctionExpression" ? arrow.node : null;
-      if (!arrow.error && arrowExpression) return arrowExpression;
-
-      if (jsx && jsx.node) {
-        this.state = jsx.failState;
-        return jsx.node;
-      }
-
-      if (arrowExpression) {
-        this.state = arrow.failState;
-        return arrowExpression;
-      }
-
-      if (jsx && jsx.thrown) throw jsx.error;
-      if (arrow.thrown) throw arrow.error;
-      throw this.raise(typeParameters.start, FlowErrors.UnexpectedTokenAfterTypeParameter);
-    }
-
-    return super.parseMaybeAssign(noIn, refExpressionErrors, afterLeftParse, refNeedsArrowPos);
-  }
-
-  parseArrow(node) {
-    if (this.match(types.colon)) {
-      const result = this.tryParse(() => {
-        const oldNoAnonFunctionType = this.state.noAnonFunctionType;
-        this.state.noAnonFunctionType = true;
-        const typeNode = this.startNode();
-        [typeNode.typeAnnotation, node.predicate] = this.flowParseTypeAndPredicateInitialiser();
-        this.state.noAnonFunctionType = oldNoAnonFunctionType;
-        if (this.canInsertSemicolon()) this.unexpected();
-        if (!this.match(types.arrow)) this.unexpected();
-        return typeNode;
-      });
-      if (result.thrown) return null;
-      if (result.error) this.state = result.failState;
-      node.returnType = result.node.typeAnnotation ? this.finishNode(result.node, "TypeAnnotation") : null;
-    }
-
-    return super.parseArrow(node);
-  }
-
-  shouldParseArrow() {
-    return this.match(types.colon) || super.shouldParseArrow();
-  }
-
-  setArrowFunctionParameters(node, params) {
-    if (this.state.noArrowParamsConversionAt.indexOf(node.start) !== -1) {
-      node.params = params;
-    } else {
-      super.setArrowFunctionParameters(node, params);
-    }
-  }
-
-  checkParams(node, allowDuplicates, isArrowFunction) {
-    if (isArrowFunction && this.state.noArrowParamsConversionAt.indexOf(node.start) !== -1) {
-      return;
-    }
-
-    return super.checkParams(...arguments);
-  }
-
-  parseParenAndDistinguishExpression(canBeArrow) {
-    return super.parseParenAndDistinguishExpression(canBeArrow && this.state.noArrowAt.indexOf(this.state.start) === -1);
-  }
-
-  parseSubscripts(base, startPos, startLoc, noCalls) {
-    if (base.type === "Identifier" && base.name === "async" && this.state.noArrowAt.indexOf(startPos) !== -1) {
-      this.next();
-      const node = this.startNodeAt(startPos, startLoc);
-      node.callee = base;
-      node.arguments = this.parseCallExpressionArguments(types.parenR, false);
-      base = this.finishNode(node, "CallExpression");
-    } else if (base.type === "Identifier" && base.name === "async" && this.isRelational("<")) {
-      const state = this.state.clone();
-      const arrow = this.tryParse(abort => this.parseAsyncArrowWithTypeParameters(startPos, startLoc) || abort(), state);
-      if (!arrow.error && !arrow.aborted) return arrow.node;
-      const result = this.tryParse(() => super.parseSubscripts(base, startPos, startLoc, noCalls), state);
-      if (result.node && !result.error) return result.node;
-
-      if (arrow.node) {
-        this.state = arrow.failState;
-        return arrow.node;
-      }
-
-      if (result.node) {
-        this.state = result.failState;
-        return result.node;
-      }
-
-      throw arrow.error || result.error;
-    }
-
-    return super.parseSubscripts(base, startPos, startLoc, noCalls);
-  }
-
-  parseSubscript(base, startPos, startLoc, noCalls, subscriptState) {
-    if (this.match(types.questionDot) && this.isLookaheadRelational("<")) {
-      subscriptState.optionalChainMember = true;
-
-      if (noCalls) {
-        subscriptState.stop = true;
-        return base;
-      }
-
-      this.next();
-      const node = this.startNodeAt(startPos, startLoc);
-      node.callee = base;
-      node.typeArguments = this.flowParseTypeParameterInstantiation();
-      this.expect(types.parenL);
-      node.arguments = this.parseCallExpressionArguments(types.parenR, false);
-      node.optional = true;
-      return this.finishCallExpression(node, true);
-    } else if (!noCalls && this.shouldParseTypes() && this.isRelational("<")) {
-      const node = this.startNodeAt(startPos, startLoc);
-      node.callee = base;
-      const result = this.tryParse(() => {
-        node.typeArguments = this.flowParseTypeParameterInstantiationCallOrNew();
-        this.expect(types.parenL);
-        node.arguments = this.parseCallExpressionArguments(types.parenR, false);
-        if (subscriptState.optionalChainMember) node.optional = false;
-        return this.finishCallExpression(node, subscriptState.optionalChainMember);
-      });
-
-      if (result.node) {
-        if (result.error) this.state = result.failState;
-        return result.node;
-      }
-    }
-
-    return super.parseSubscript(base, startPos, startLoc, noCalls, subscriptState);
-  }
-
-  parseNewArguments(node) {
-    let targs = null;
-
-    if (this.shouldParseTypes() && this.isRelational("<")) {
-      targs = this.tryParse(() => this.flowParseTypeParameterInstantiationCallOrNew()).node;
-    }
-
-    node.typeArguments = targs;
-    super.parseNewArguments(node);
-  }
-
-  parseAsyncArrowWithTypeParameters(startPos, startLoc) {
-    const node = this.startNodeAt(startPos, startLoc);
-    this.parseFunctionParams(node);
-    if (!this.parseArrow(node)) return;
-    return this.parseArrowExpression(node, undefined, true);
-  }
-
-  readToken_mult_modulo(code) {
-    const next = this.input.charCodeAt(this.state.pos + 1);
-
-    if (code === 42 && next === 47 && this.state.hasFlowComment) {
-      this.state.hasFlowComment = false;
-      this.state.pos += 2;
-      this.nextToken();
-      return;
-    }
-
-    super.readToken_mult_modulo(code);
-  }
-
-  readToken_pipe_amp(code) {
-    const next = this.input.charCodeAt(this.state.pos + 1);
-
-    if (code === 124 && next === 125) {
-      this.finishOp(types.braceBarR, 2);
-      return;
-    }
-
-    super.readToken_pipe_amp(code);
-  }
-
-  parseTopLevel(file, program) {
-    const fileNode = super.parseTopLevel(file, program);
-
-    if (this.state.hasFlowComment) {
-      this.raise(this.state.pos, FlowErrors.UnterminatedFlowComment);
-    }
-
-    return fileNode;
-  }
-
-  skipBlockComment() {
-    if (this.hasPlugin("flowComments") && this.skipFlowComment()) {
-      if (this.state.hasFlowComment) {
-        this.unexpected(null, FlowErrors.NestedFlowComment);
-      }
-
-      this.hasFlowCommentCompletion();
-      this.state.pos += this.skipFlowComment();
-      this.state.hasFlowComment = true;
-      return;
-    }
-
-    if (this.state.hasFlowComment) {
-      const end = this.input.indexOf("*-/", this.state.pos += 2);
-
-      if (end === -1) {
-        throw this.raise(this.state.pos - 2, Errors.UnterminatedComment);
-      }
-
-      this.state.pos = end + 3;
-      return;
-    }
-
-    super.skipBlockComment();
-  }
-
-  skipFlowComment() {
-    const {
-      pos
-    } = this.state;
-    let shiftToFirstNonWhiteSpace = 2;
-
-    while ([32, 9].includes(this.input.charCodeAt(pos + shiftToFirstNonWhiteSpace))) {
-      shiftToFirstNonWhiteSpace++;
-    }
-
-    const ch2 = this.input.charCodeAt(shiftToFirstNonWhiteSpace + pos);
-    const ch3 = this.input.charCodeAt(shiftToFirstNonWhiteSpace + pos + 1);
-
-    if (ch2 === 58 && ch3 === 58) {
-      return shiftToFirstNonWhiteSpace + 2;
-    }
-
-    if (this.input.slice(shiftToFirstNonWhiteSpace + pos, shiftToFirstNonWhiteSpace + pos + 12) === "flow-include") {
-      return shiftToFirstNonWhiteSpace + 12;
-    }
-
-    if (ch2 === 58 && ch3 !== 58) {
-      return shiftToFirstNonWhiteSpace;
-    }
-
-    return false;
-  }
-
-  hasFlowCommentCompletion() {
-    const end = this.input.indexOf("*/", this.state.pos);
-
-    if (end === -1) {
-      throw this.raise(this.state.pos, Errors.UnterminatedComment);
-    }
-  }
-
-  flowEnumErrorBooleanMemberNotInitialized(pos, {
-    enumName,
-    memberName
-  }) {
-    this.raise(pos, FlowErrors.EnumBooleanMemberNotInitialized, memberName, enumName);
-  }
-
-  flowEnumErrorInvalidMemberName(pos, {
-    enumName,
-    memberName
-  }) {
-    const suggestion = memberName[0].toUpperCase() + memberName.slice(1);
-    this.raise(pos, FlowErrors.EnumInvalidMemberName, memberName, suggestion, enumName);
-  }
-
-  flowEnumErrorDuplicateMemberName(pos, {
-    enumName,
-    memberName
-  }) {
-    this.raise(pos, FlowErrors.EnumDuplicateMemberName, memberName, enumName);
-  }
-
-  flowEnumErrorInconsistentMemberValues(pos, {
-    enumName
-  }) {
-    this.raise(pos, FlowErrors.EnumInconsistentMemberValues, enumName);
-  }
-
-  flowEnumErrorInvalidExplicitType(pos, {
-    enumName,
-    suppliedType
-  }) {
-    return this.raise(pos, suppliedType === null ? FlowErrors.EnumInvalidExplicitTypeUnknownSupplied : FlowErrors.EnumInvalidExplicitType, enumName, suppliedType);
-  }
-
-  flowEnumErrorInvalidMemberInitializer(pos, {
-    enumName,
-    explicitType,
-    memberName
-  }) {
-    let message = null;
-
-    switch (explicitType) {
-      case "boolean":
-      case "number":
-      case "string":
-        message = FlowErrors.EnumInvalidMemberInitializerPrimaryType;
-        break;
-
-      case "symbol":
-        message = FlowErrors.EnumInvalidMemberInitializerSymbolType;
-        break;
-
-      default:
-        message = FlowErrors.EnumInvalidMemberInitializerUnknownType;
-    }
-
-    return this.raise(pos, message, enumName, memberName, explicitType);
-  }
-
-  flowEnumErrorNumberMemberNotInitialized(pos, {
-    enumName,
-    memberName
-  }) {
-    this.raise(pos, FlowErrors.EnumNumberMemberNotInitialized, enumName, memberName);
-  }
-
-  flowEnumErrorStringMemberInconsistentlyInitailized(pos, {
-    enumName
-  }) {
-    this.raise(pos, FlowErrors.EnumStringMemberInconsistentlyInitailized, enumName);
-  }
-
-  flowEnumMemberInit() {
-    const startPos = this.state.start;
-
-    const endOfInit = () => this.match(types.comma) || this.match(types.braceR);
-
-    switch (this.state.type) {
-      case types.num:
-        {
-          const literal = this.parseLiteral(this.state.value, "NumericLiteral");
-
-          if (endOfInit()) {
-            return {
-              type: "number",
-              pos: literal.start,
-              value: literal
-            };
-          }
-
-          return {
-            type: "invalid",
-            pos: startPos
-          };
-        }
-
-      case types.string:
-        {
-          const literal = this.parseLiteral(this.state.value, "StringLiteral");
-
-          if (endOfInit()) {
-            return {
-              type: "string",
-              pos: literal.start,
-              value: literal
-            };
-          }
-
-          return {
-            type: "invalid",
-            pos: startPos
-          };
-        }
-
-      case types._true:
-      case types._false:
-        {
-          const literal = this.parseBooleanLiteral();
-
-          if (endOfInit()) {
-            return {
-              type: "boolean",
-              pos: literal.start,
-              value: literal
-            };
-          }
-
-          return {
-            type: "invalid",
-            pos: startPos
-          };
-        }
-
-      default:
-        return {
-          type: "invalid",
-          pos: startPos
-        };
-    }
-  }
-
-  flowEnumMemberRaw() {
-    const pos = this.state.start;
-    const id = this.parseIdentifier(true);
-    const init = this.eat(types.eq) ? this.flowEnumMemberInit() : {
-      type: "none",
-      pos
-    };
-    return {
-      id,
-      init
-    };
-  }
-
-  flowEnumCheckExplicitTypeMismatch(pos, context, expectedType) {
-    const {
-      explicitType
-    } = context;
-
-    if (explicitType === null) {
-      return;
-    }
-
-    if (explicitType !== expectedType) {
-      this.flowEnumErrorInvalidMemberInitializer(pos, context);
-    }
-  }
-
-  flowEnumMembers({
-    enumName,
-    explicitType
-  }) {
-    const seenNames = new Set();
-    const members = {
-      booleanMembers: [],
-      numberMembers: [],
-      stringMembers: [],
-      defaultedMembers: []
-    };
-
-    while (!this.match(types.braceR)) {
-      const memberNode = this.startNode();
-      const {
-        id,
-        init
-      } = this.flowEnumMemberRaw();
-      const memberName = id.name;
-
-      if (memberName === "") {
-        continue;
-      }
-
-      if (/^[a-z]/.test(memberName)) {
-        this.flowEnumErrorInvalidMemberName(id.start, {
-          enumName,
-          memberName
-        });
-      }
-
-      if (seenNames.has(memberName)) {
-        this.flowEnumErrorDuplicateMemberName(id.start, {
-          enumName,
-          memberName
-        });
-      }
-
-      seenNames.add(memberName);
-      const context = {
-        enumName,
-        explicitType,
-        memberName
-      };
-      memberNode.id = id;
-
-      switch (init.type) {
-        case "boolean":
-          {
-            this.flowEnumCheckExplicitTypeMismatch(init.pos, context, "boolean");
-            memberNode.init = init.value;
-            members.booleanMembers.push(this.finishNode(memberNode, "EnumBooleanMember"));
-            break;
-          }
-
-        case "number":
-          {
-            this.flowEnumCheckExplicitTypeMismatch(init.pos, context, "number");
-            memberNode.init = init.value;
-            members.numberMembers.push(this.finishNode(memberNode, "EnumNumberMember"));
-            break;
-          }
-
-        case "string":
-          {
-            this.flowEnumCheckExplicitTypeMismatch(init.pos, context, "string");
-            memberNode.init = init.value;
-            members.stringMembers.push(this.finishNode(memberNode, "EnumStringMember"));
-            break;
-          }
-
-        case "invalid":
-          {
-            throw this.flowEnumErrorInvalidMemberInitializer(init.pos, context);
-          }
-
-        case "none":
-          {
-            switch (explicitType) {
-              case "boolean":
-                this.flowEnumErrorBooleanMemberNotInitialized(init.pos, context);
-                break;
-
-              case "number":
-                this.flowEnumErrorNumberMemberNotInitialized(init.pos, context);
-                break;
-
-              default:
-                members.defaultedMembers.push(this.finishNode(memberNode, "EnumDefaultedMember"));
-            }
-          }
-      }
-
-      if (!this.match(types.braceR)) {
-        this.expect(types.comma);
-      }
-    }
-
-    return members;
-  }
-
-  flowEnumStringMembers(initializedMembers, defaultedMembers, {
-    enumName
-  }) {
-    if (initializedMembers.length === 0) {
-      return defaultedMembers;
-    } else if (defaultedMembers.length === 0) {
-      return initializedMembers;
-    } else if (defaultedMembers.length > initializedMembers.length) {
-      for (let _i = 0; _i < initializedMembers.length; _i++) {
-        const member = initializedMembers[_i];
-        this.flowEnumErrorStringMemberInconsistentlyInitailized(member.start, {
-          enumName
-        });
-      }
-
-      return defaultedMembers;
-    } else {
-      for (let _i2 = 0; _i2 < defaultedMembers.length; _i2++) {
-        const member = defaultedMembers[_i2];
-        this.flowEnumErrorStringMemberInconsistentlyInitailized(member.start, {
-          enumName
-        });
-      }
-
-      return initializedMembers;
-    }
-  }
-
-  flowEnumParseExplicitType({
-    enumName
-  }) {
-    if (this.eatContextual("of")) {
-      if (!this.match(types.name)) {
-        throw this.flowEnumErrorInvalidExplicitType(this.state.start, {
-          enumName,
-          suppliedType: null
-        });
-      }
-
-      const {
-        value
-      } = this.state;
-      this.next();
-
-      if (value !== "boolean" && value !== "number" && value !== "string" && value !== "symbol") {
-        this.flowEnumErrorInvalidExplicitType(this.state.start, {
-          enumName,
-          suppliedType: value
-        });
-      }
-
-      return value;
-    }
-
-    return null;
-  }
-
-  flowEnumBody(node, {
-    enumName,
-    nameLoc
-  }) {
-    const explicitType = this.flowEnumParseExplicitType({
-      enumName
-    });
-    this.expect(types.braceL);
-    const members = this.flowEnumMembers({
-      enumName,
-      explicitType
-    });
-
-    switch (explicitType) {
-      case "boolean":
-        node.explicitType = true;
-        node.members = members.booleanMembers;
-        this.expect(types.braceR);
-        return this.finishNode(node, "EnumBooleanBody");
-
-      case "number":
-        node.explicitType = true;
-        node.members = members.numberMembers;
-        this.expect(types.braceR);
-        return this.finishNode(node, "EnumNumberBody");
-
-      case "string":
-        node.explicitType = true;
-        node.members = this.flowEnumStringMembers(members.stringMembers, members.defaultedMembers, {
-          enumName
-        });
-        this.expect(types.braceR);
-        return this.finishNode(node, "EnumStringBody");
-
-      case "symbol":
-        node.members = members.defaultedMembers;
-        this.expect(types.braceR);
-        return this.finishNode(node, "EnumSymbolBody");
-
-      default:
-        {
-          const empty = () => {
-            node.members = [];
-            this.expect(types.braceR);
-            return this.finishNode(node, "EnumStringBody");
-          };
-
-          node.explicitType = false;
-          const boolsLen = members.booleanMembers.length;
-          const numsLen = members.numberMembers.length;
-          const strsLen = members.stringMembers.length;
-          const defaultedLen = members.defaultedMembers.length;
-
-          if (!boolsLen && !numsLen && !strsLen && !defaultedLen) {
-            return empty();
-          } else if (!boolsLen && !numsLen) {
-            node.members = this.flowEnumStringMembers(members.stringMembers, members.defaultedMembers, {
-              enumName
-            });
-            this.expect(types.braceR);
-            return this.finishNode(node, "EnumStringBody");
-          } else if (!numsLen && !strsLen && boolsLen >= defaultedLen) {
-            for (let _i3 = 0, _members$defaultedMem = members.defaultedMembers; _i3 < _members$defaultedMem.length; _i3++) {
-              const member = _members$defaultedMem[_i3];
-              this.flowEnumErrorBooleanMemberNotInitialized(member.start, {
-                enumName,
-                memberName: member.id.name
-              });
-            }
-
-            node.members = members.booleanMembers;
-            this.expect(types.braceR);
-            return this.finishNode(node, "EnumBooleanBody");
-          } else if (!boolsLen && !strsLen && numsLen >= defaultedLen) {
-            for (let _i4 = 0, _members$defaultedMem2 = members.defaultedMembers; _i4 < _members$defaultedMem2.length; _i4++) {
-              const member = _members$defaultedMem2[_i4];
-              this.flowEnumErrorNumberMemberNotInitialized(member.start, {
-                enumName,
-                memberName: member.id.name
-              });
-            }
-
-            node.members = members.numberMembers;
-            this.expect(types.braceR);
-            return this.finishNode(node, "EnumNumberBody");
-          } else {
-            this.flowEnumErrorInconsistentMemberValues(nameLoc, {
-              enumName
-            });
-            return empty();
-          }
-        }
-    }
-  }
-
-  flowParseEnumDeclaration(node) {
-    const id = this.parseIdentifier();
-    node.id = id;
-    node.body = this.flowEnumBody(this.startNode(), {
-      enumName: id.name,
-      nameLoc: id.start
-    });
-    return this.finishNode(node, "EnumDeclaration");
-  }
-
-});
-
-const entities = {
-  quot: "\u0022",
-  amp: "&",
-  apos: "\u0027",
-  lt: "<",
-  gt: ">",
-  nbsp: "\u00A0",
-  iexcl: "\u00A1",
-  cent: "\u00A2",
-  pound: "\u00A3",
-  curren: "\u00A4",
-  yen: "\u00A5",
-  brvbar: "\u00A6",
-  sect: "\u00A7",
-  uml: "\u00A8",
-  copy: "\u00A9",
-  ordf: "\u00AA",
-  laquo: "\u00AB",
-  not: "\u00AC",
-  shy: "\u00AD",
-  reg: "\u00AE",
-  macr: "\u00AF",
-  deg: "\u00B0",
-  plusmn: "\u00B1",
-  sup2: "\u00B2",
-  sup3: "\u00B3",
-  acute: "\u00B4",
-  micro: "\u00B5",
-  para: "\u00B6",
-  middot: "\u00B7",
-  cedil: "\u00B8",
-  sup1: "\u00B9",
-  ordm: "\u00BA",
-  raquo: "\u00BB",
-  frac14: "\u00BC",
-  frac12: "\u00BD",
-  frac34: "\u00BE",
-  iquest: "\u00BF",
-  Agrave: "\u00C0",
-  Aacute: "\u00C1",
-  Acirc: "\u00C2",
-  Atilde: "\u00C3",
-  Auml: "\u00C4",
-  Aring: "\u00C5",
-  AElig: "\u00C6",
-  Ccedil: "\u00C7",
-  Egrave: "\u00C8",
-  Eacute: "\u00C9",
-  Ecirc: "\u00CA",
-  Euml: "\u00CB",
-  Igrave: "\u00CC",
-  Iacute: "\u00CD",
-  Icirc: "\u00CE",
-  Iuml: "\u00CF",
-  ETH: "\u00D0",
-  Ntilde: "\u00D1",
-  Ograve: "\u00D2",
-  Oacute: "\u00D3",
-  Ocirc: "\u00D4",
-  Otilde: "\u00D5",
-  Ouml: "\u00D6",
-  times: "\u00D7",
-  Oslash: "\u00D8",
-  Ugrave: "\u00D9",
-  Uacute: "\u00DA",
-  Ucirc: "\u00DB",
-  Uuml: "\u00DC",
-  Yacute: "\u00DD",
-  THORN: "\u00DE",
-  szlig: "\u00DF",
-  agrave: "\u00E0",
-  aacute: "\u00E1",
-  acirc: "\u00E2",
-  atilde: "\u00E3",
-  auml: "\u00E4",
-  aring: "\u00E5",
-  aelig: "\u00E6",
-  ccedil: "\u00E7",
-  egrave: "\u00E8",
-  eacute: "\u00E9",
-  ecirc: "\u00EA",
-  euml: "\u00EB",
-  igrave: "\u00EC",
-  iacute: "\u00ED",
-  icirc: "\u00EE",
-  iuml: "\u00EF",
-  eth: "\u00F0",
-  ntilde: "\u00F1",
-  ograve: "\u00F2",
-  oacute: "\u00F3",
-  ocirc: "\u00F4",
-  otilde: "\u00F5",
-  ouml: "\u00F6",
-  divide: "\u00F7",
-  oslash: "\u00F8",
-  ugrave: "\u00F9",
-  uacute: "\u00FA",
-  ucirc: "\u00FB",
-  uuml: "\u00FC",
-  yacute: "\u00FD",
-  thorn: "\u00FE",
-  yuml: "\u00FF",
-  OElig: "\u0152",
-  oelig: "\u0153",
-  Scaron: "\u0160",
-  scaron: "\u0161",
-  Yuml: "\u0178",
-  fnof: "\u0192",
-  circ: "\u02C6",
-  tilde: "\u02DC",
-  Alpha: "\u0391",
-  Beta: "\u0392",
-  Gamma: "\u0393",
-  Delta: "\u0394",
-  Epsilon: "\u0395",
-  Zeta: "\u0396",
-  Eta: "\u0397",
-  Theta: "\u0398",
-  Iota: "\u0399",
-  Kappa: "\u039A",
-  Lambda: "\u039B",
-  Mu: "\u039C",
-  Nu: "\u039D",
-  Xi: "\u039E",
-  Omicron: "\u039F",
-  Pi: "\u03A0",
-  Rho: "\u03A1",
-  Sigma: "\u03A3",
-  Tau: "\u03A4",
-  Upsilon: "\u03A5",
-  Phi: "\u03A6",
-  Chi: "\u03A7",
-  Psi: "\u03A8",
-  Omega: "\u03A9",
-  alpha: "\u03B1",
-  beta: "\u03B2",
-  gamma: "\u03B3",
-  delta: "\u03B4",
-  epsilon: "\u03B5",
-  zeta: "\u03B6",
-  eta: "\u03B7",
-  theta: "\u03B8",
-  iota: "\u03B9",
-  kappa: "\u03BA",
-  lambda: "\u03BB",
-  mu: "\u03BC",
-  nu: "\u03BD",
-  xi: "\u03BE",
-  omicron: "\u03BF",
-  pi: "\u03C0",
-  rho: "\u03C1",
-  sigmaf: "\u03C2",
-  sigma: "\u03C3",
-  tau: "\u03C4",
-  upsilon: "\u03C5",
-  phi: "\u03C6",
-  chi: "\u03C7",
-  psi: "\u03C8",
-  omega: "\u03C9",
-  thetasym: "\u03D1",
-  upsih: "\u03D2",
-  piv: "\u03D6",
-  ensp: "\u2002",
-  emsp: "\u2003",
-  thinsp: "\u2009",
-  zwnj: "\u200C",
-  zwj: "\u200D",
-  lrm: "\u200E",
-  rlm: "\u200F",
-  ndash: "\u2013",
-  mdash: "\u2014",
-  lsquo: "\u2018",
-  rsquo: "\u2019",
-  sbquo: "\u201A",
-  ldquo: "\u201C",
-  rdquo: "\u201D",
-  bdquo: "\u201E",
-  dagger: "\u2020",
-  Dagger: "\u2021",
-  bull: "\u2022",
-  hellip: "\u2026",
-  permil: "\u2030",
-  prime: "\u2032",
-  Prime: "\u2033",
-  lsaquo: "\u2039",
-  rsaquo: "\u203A",
-  oline: "\u203E",
-  frasl: "\u2044",
-  euro: "\u20AC",
-  image: "\u2111",
-  weierp: "\u2118",
-  real: "\u211C",
-  trade: "\u2122",
-  alefsym: "\u2135",
-  larr: "\u2190",
-  uarr: "\u2191",
-  rarr: "\u2192",
-  darr: "\u2193",
-  harr: "\u2194",
-  crarr: "\u21B5",
-  lArr: "\u21D0",
-  uArr: "\u21D1",
-  rArr: "\u21D2",
-  dArr: "\u21D3",
-  hArr: "\u21D4",
-  forall: "\u2200",
-  part: "\u2202",
-  exist: "\u2203",
-  empty: "\u2205",
-  nabla: "\u2207",
-  isin: "\u2208",
-  notin: "\u2209",
-  ni: "\u220B",
-  prod: "\u220F",
-  sum: "\u2211",
-  minus: "\u2212",
-  lowast: "\u2217",
-  radic: "\u221A",
-  prop: "\u221D",
-  infin: "\u221E",
-  ang: "\u2220",
-  and: "\u2227",
-  or: "\u2228",
-  cap: "\u2229",
-  cup: "\u222A",
-  int: "\u222B",
-  there4: "\u2234",
-  sim: "\u223C",
-  cong: "\u2245",
-  asymp: "\u2248",
-  ne: "\u2260",
-  equiv: "\u2261",
-  le: "\u2264",
-  ge: "\u2265",
-  sub: "\u2282",
-  sup: "\u2283",
-  nsub: "\u2284",
-  sube: "\u2286",
-  supe: "\u2287",
-  oplus: "\u2295",
-  otimes: "\u2297",
-  perp: "\u22A5",
-  sdot: "\u22C5",
-  lceil: "\u2308",
-  rceil: "\u2309",
-  lfloor: "\u230A",
-  rfloor: "\u230B",
-  lang: "\u2329",
-  rang: "\u232A",
-  loz: "\u25CA",
-  spades: "\u2660",
-  clubs: "\u2663",
-  hearts: "\u2665",
-  diams: "\u2666"
-};
-
-const HEX_NUMBER = /^[\da-fA-F]+$/;
-const DECIMAL_NUMBER = /^\d+$/;
-const JsxErrors = Object.freeze({
-  AttributeIsEmpty: "JSX attributes must only be assigned a non-empty expression",
-  MissingClosingTagFragment: "Expected corresponding JSX closing tag for <>",
-  MissingClosingTagElement: "Expected corresponding JSX closing tag for <%0>",
-  UnsupportedJsxValue: "JSX value should be either an expression or a quoted JSX text",
-  UnterminatedJsxContent: "Unterminated JSX contents",
-  UnwrappedAdjacentJSXElements: "Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>?"
-});
-types$1.j_oTag = new TokContext("<tag", false);
-types$1.j_cTag = new TokContext("</tag", false);
-types$1.j_expr = new TokContext("<tag>...</tag>", true, true);
-types.jsxName = new TokenType("jsxName");
-types.jsxText = new TokenType("jsxText", {
-  beforeExpr: true
-});
-types.jsxTagStart = new TokenType("jsxTagStart", {
-  startsExpr: true
-});
-types.jsxTagEnd = new TokenType("jsxTagEnd");
-
-types.jsxTagStart.updateContext = function () {
-  this.state.context.push(types$1.j_expr);
-  this.state.context.push(types$1.j_oTag);
-  this.state.exprAllowed = false;
-};
-
-types.jsxTagEnd.updateContext = function (prevType) {
-  const out = this.state.context.pop();
-
-  if (out === types$1.j_oTag && prevType === types.slash || out === types$1.j_cTag) {
-    this.state.context.pop();
-    this.state.exprAllowed = this.curContext() === types$1.j_expr;
-  } else {
-    this.state.exprAllowed = true;
-  }
-};
-
-function isFragment(object) {
-  return object ? object.type === "JSXOpeningFragment" || object.type === "JSXClosingFragment" : false;
-}
-
-function getQualifiedJSXName(object) {
-  if (object.type === "JSXIdentifier") {
-    return object.name;
-  }
-
-  if (object.type === "JSXNamespacedName") {
-    return object.namespace.name + ":" + object.name.name;
-  }
-
-  if (object.type === "JSXMemberExpression") {
-    return getQualifiedJSXName(object.object) + "." + getQualifiedJSXName(object.property);
-  }
-
-  throw new Error("Node had unexpected type: " + object.type);
-}
-
-var jsx = (superClass => class extends superClass {
-  jsxReadToken() {
-    let out = "";
-    let chunkStart = this.state.pos;
-
-    for (;;) {
-      if (this.state.pos >= this.length) {
-        throw this.raise(this.state.start, JsxErrors.UnterminatedJsxContent);
-      }
-
-      const ch = this.input.charCodeAt(this.state.pos);
-
-      switch (ch) {
-        case 60:
-        case 123:
-          if (this.state.pos === this.state.start) {
-            if (ch === 60 && this.state.exprAllowed) {
-              ++this.state.pos;
-              return this.finishToken(types.jsxTagStart);
-            }
-
-            return super.getTokenFromCode(ch);
-          }
-
-          out += this.input.slice(chunkStart, this.state.pos);
-          return this.finishToken(types.jsxText, out);
-
-        case 38:
-          out += this.input.slice(chunkStart, this.state.pos);
-          out += this.jsxReadEntity();
-          chunkStart = this.state.pos;
-          break;
-
-        default:
-          if (isNewLine(ch)) {
-            out += this.input.slice(chunkStart, this.state.pos);
-            out += this.jsxReadNewLine(true);
-            chunkStart = this.state.pos;
-          } else {
-            ++this.state.pos;
-          }
-
-      }
-    }
-  }
-
-  jsxReadNewLine(normalizeCRLF) {
-    const ch = this.input.charCodeAt(this.state.pos);
-    let out;
-    ++this.state.pos;
-
-    if (ch === 13 && this.input.charCodeAt(this.state.pos) === 10) {
-      ++this.state.pos;
-      out = normalizeCRLF ? "\n" : "\r\n";
-    } else {
-      out = String.fromCharCode(ch);
-    }
-
-    ++this.state.curLine;
-    this.state.lineStart = this.state.pos;
-    return out;
-  }
-
-  jsxReadString(quote) {
-    let out = "";
-    let chunkStart = ++this.state.pos;
-
-    for (;;) {
-      if (this.state.pos >= this.length) {
-        throw this.raise(this.state.start, Errors.UnterminatedString);
-      }
-
-      const ch = this.input.charCodeAt(this.state.pos);
-      if (ch === quote) break;
-
-      if (ch === 38) {
-        out += this.input.slice(chunkStart, this.state.pos);
-        out += this.jsxReadEntity();
-        chunkStart = this.state.pos;
-      } else if (isNewLine(ch)) {
-        out += this.input.slice(chunkStart, this.state.pos);
-        out += this.jsxReadNewLine(false);
-        chunkStart = this.state.pos;
-      } else {
-        ++this.state.pos;
-      }
-    }
-
-    out += this.input.slice(chunkStart, this.state.pos++);
-    return this.finishToken(types.string, out);
-  }
-
-  jsxReadEntity() {
-    let str = "";
-    let count = 0;
-    let entity;
-    let ch = this.input[this.state.pos];
-    const startPos = ++this.state.pos;
-
-    while (this.state.pos < this.length && count++ < 10) {
-      ch = this.input[this.state.pos++];
-
-      if (ch === ";") {
-        if (str[0] === "#") {
-          if (str[1] === "x") {
-            str = str.substr(2);
-
-            if (HEX_NUMBER.test(str)) {
-              entity = String.fromCodePoint(parseInt(str, 16));
-            }
-          } else {
-            str = str.substr(1);
-
-            if (DECIMAL_NUMBER.test(str)) {
-              entity = String.fromCodePoint(parseInt(str, 10));
-            }
-          }
-        } else {
-          entity = entities[str];
-        }
-
-        break;
-      }
-
-      str += ch;
-    }
-
-    if (!entity) {
-      this.state.pos = startPos;
-      return "&";
-    }
-
-    return entity;
-  }
-
-  jsxReadWord() {
-    let ch;
-    const start = this.state.pos;
-
-    do {
-      ch = this.input.charCodeAt(++this.state.pos);
-    } while (isIdentifierChar(ch) || ch === 45);
-
-    return this.finishToken(types.jsxName, this.input.slice(start, this.state.pos));
-  }
-
-  jsxParseIdentifier() {
-    const node = this.startNode();
-
-    if (this.match(types.jsxName)) {
-      node.name = this.state.value;
-    } else if (this.state.type.keyword) {
-      node.name = this.state.type.keyword;
-    } else {
-      this.unexpected();
-    }
-
-    this.next();
-    return this.finishNode(node, "JSXIdentifier");
-  }
-
-  jsxParseNamespacedName() {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    const name = this.jsxParseIdentifier();
-    if (!this.eat(types.colon)) return name;
-    const node = this.startNodeAt(startPos, startLoc);
-    node.namespace = name;
-    node.name = this.jsxParseIdentifier();
-    return this.finishNode(node, "JSXNamespacedName");
-  }
-
-  jsxParseElementName() {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    let node = this.jsxParseNamespacedName();
-
-    if (node.type === "JSXNamespacedName") {
-      return node;
-    }
-
-    while (this.eat(types.dot)) {
-      const newNode = this.startNodeAt(startPos, startLoc);
-      newNode.object = node;
-      newNode.property = this.jsxParseIdentifier();
-      node = this.finishNode(newNode, "JSXMemberExpression");
-    }
-
-    return node;
-  }
-
-  jsxParseAttributeValue() {
-    let node;
-
-    switch (this.state.type) {
-      case types.braceL:
-        node = this.startNode();
-        this.next();
-        node = this.jsxParseExpressionContainer(node);
-
-        if (node.expression.type === "JSXEmptyExpression") {
-          this.raise(node.start, JsxErrors.AttributeIsEmpty);
-        }
-
-        return node;
-
-      case types.jsxTagStart:
-      case types.string:
-        return this.parseExprAtom();
-
-      default:
-        throw this.raise(this.state.start, JsxErrors.UnsupportedJsxValue);
-    }
-  }
-
-  jsxParseEmptyExpression() {
-    const node = this.startNodeAt(this.state.lastTokEnd, this.state.lastTokEndLoc);
-    return this.finishNodeAt(node, "JSXEmptyExpression", this.state.start, this.state.startLoc);
-  }
-
-  jsxParseSpreadChild(node) {
-    this.next();
-    node.expression = this.parseExpression();
-    this.expect(types.braceR);
-    return this.finishNode(node, "JSXSpreadChild");
-  }
-
-  jsxParseExpressionContainer(node) {
-    if (this.match(types.braceR)) {
-      node.expression = this.jsxParseEmptyExpression();
-    } else {
-      node.expression = this.parseExpression();
-    }
-
-    this.expect(types.braceR);
-    return this.finishNode(node, "JSXExpressionContainer");
-  }
-
-  jsxParseAttribute() {
-    const node = this.startNode();
-
-    if (this.eat(types.braceL)) {
-      this.expect(types.ellipsis);
-      node.argument = this.parseMaybeAssign();
-      this.expect(types.braceR);
-      return this.finishNode(node, "JSXSpreadAttribute");
-    }
-
-    node.name = this.jsxParseNamespacedName();
-    node.value = this.eat(types.eq) ? this.jsxParseAttributeValue() : null;
-    return this.finishNode(node, "JSXAttribute");
-  }
-
-  jsxParseOpeningElementAt(startPos, startLoc) {
-    const node = this.startNodeAt(startPos, startLoc);
-
-    if (this.match(types.jsxTagEnd)) {
-      this.expect(types.jsxTagEnd);
-      return this.finishNode(node, "JSXOpeningFragment");
-    }
-
-    node.name = this.jsxParseElementName();
-    return this.jsxParseOpeningElementAfterName(node);
-  }
-
-  jsxParseOpeningElementAfterName(node) {
-    const attributes = [];
-
-    while (!this.match(types.slash) && !this.match(types.jsxTagEnd)) {
-      attributes.push(this.jsxParseAttribute());
-    }
-
-    node.attributes = attributes;
-    node.selfClosing = this.eat(types.slash);
-    this.expect(types.jsxTagEnd);
-    return this.finishNode(node, "JSXOpeningElement");
-  }
-
-  jsxParseClosingElementAt(startPos, startLoc) {
-    const node = this.startNodeAt(startPos, startLoc);
-
-    if (this.match(types.jsxTagEnd)) {
-      this.expect(types.jsxTagEnd);
-      return this.finishNode(node, "JSXClosingFragment");
-    }
-
-    node.name = this.jsxParseElementName();
-    this.expect(types.jsxTagEnd);
-    return this.finishNode(node, "JSXClosingElement");
-  }
-
-  jsxParseElementAt(startPos, startLoc) {
-    const node = this.startNodeAt(startPos, startLoc);
-    const children = [];
-    const openingElement = this.jsxParseOpeningElementAt(startPos, startLoc);
-    let closingElement = null;
-
-    if (!openingElement.selfClosing) {
-      contents: for (;;) {
-        switch (this.state.type) {
-          case types.jsxTagStart:
-            startPos = this.state.start;
-            startLoc = this.state.startLoc;
-            this.next();
-
-            if (this.eat(types.slash)) {
-              closingElement = this.jsxParseClosingElementAt(startPos, startLoc);
-              break contents;
-            }
-
-            children.push(this.jsxParseElementAt(startPos, startLoc));
-            break;
-
-          case types.jsxText:
-            children.push(this.parseExprAtom());
-            break;
-
-          case types.braceL:
-            {
-              const node = this.startNode();
-              this.next();
-
-              if (this.match(types.ellipsis)) {
-                children.push(this.jsxParseSpreadChild(node));
-              } else {
-                children.push(this.jsxParseExpressionContainer(node));
-              }
-
-              break;
-            }
-
-          default:
-            throw this.unexpected();
-        }
-      }
-
-      if (isFragment(openingElement) && !isFragment(closingElement)) {
-        this.raise(closingElement.start, JsxErrors.MissingClosingTagFragment);
-      } else if (!isFragment(openingElement) && isFragment(closingElement)) {
-        this.raise(closingElement.start, JsxErrors.MissingClosingTagElement, getQualifiedJSXName(openingElement.name));
-      } else if (!isFragment(openingElement) && !isFragment(closingElement)) {
-        if (getQualifiedJSXName(closingElement.name) !== getQualifiedJSXName(openingElement.name)) {
-          this.raise(closingElement.start, JsxErrors.MissingClosingTagElement, getQualifiedJSXName(openingElement.name));
-        }
-      }
-    }
-
-    if (isFragment(openingElement)) {
-      node.openingFragment = openingElement;
-      node.closingFragment = closingElement;
-    } else {
-      node.openingElement = openingElement;
-      node.closingElement = closingElement;
-    }
-
-    node.children = children;
-
-    if (this.isRelational("<")) {
-      throw this.raise(this.state.start, JsxErrors.UnwrappedAdjacentJSXElements);
-    }
-
-    return isFragment(openingElement) ? this.finishNode(node, "JSXFragment") : this.finishNode(node, "JSXElement");
-  }
-
-  jsxParseElement() {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    this.next();
-    return this.jsxParseElementAt(startPos, startLoc);
-  }
-
-  parseExprAtom(refExpressionErrors) {
-    if (this.match(types.jsxText)) {
-      return this.parseLiteral(this.state.value, "JSXText");
-    } else if (this.match(types.jsxTagStart)) {
-      return this.jsxParseElement();
-    } else if (this.isRelational("<") && this.input.charCodeAt(this.state.pos) !== 33) {
-      this.finishToken(types.jsxTagStart);
-      return this.jsxParseElement();
-    } else {
-      return super.parseExprAtom(refExpressionErrors);
-    }
-  }
-
-  getTokenFromCode(code) {
-    if (this.state.inPropertyName) return super.getTokenFromCode(code);
-    const context = this.curContext();
-
-    if (context === types$1.j_expr) {
-      return this.jsxReadToken();
-    }
-
-    if (context === types$1.j_oTag || context === types$1.j_cTag) {
-      if (isIdentifierStart(code)) {
-        return this.jsxReadWord();
-      }
-
-      if (code === 62) {
-        ++this.state.pos;
-        return this.finishToken(types.jsxTagEnd);
-      }
-
-      if ((code === 34 || code === 39) && context === types$1.j_oTag) {
-        return this.jsxReadString(code);
-      }
-    }
-
-    if (code === 60 && this.state.exprAllowed && this.input.charCodeAt(this.state.pos + 1) !== 33) {
-      ++this.state.pos;
-      return this.finishToken(types.jsxTagStart);
-    }
-
-    return super.getTokenFromCode(code);
-  }
-
-  updateContext(prevType) {
-    if (this.match(types.braceL)) {
-      const curContext = this.curContext();
-
-      if (curContext === types$1.j_oTag) {
-        this.state.context.push(types$1.braceExpression);
-      } else if (curContext === types$1.j_expr) {
-        this.state.context.push(types$1.templateQuasi);
-      } else {
-        super.updateContext(prevType);
-      }
-
-      this.state.exprAllowed = true;
-    } else if (this.match(types.slash) && prevType === types.jsxTagStart) {
-      this.state.context.length -= 2;
-      this.state.context.push(types$1.j_cTag);
-      this.state.exprAllowed = false;
-    } else {
-      return super.updateContext(prevType);
-    }
-  }
-
-});
-
-class Scope {
-  constructor(flags) {
-    this.var = [];
-    this.lexical = [];
-    this.functions = [];
-    this.flags = flags;
-  }
-
-}
-class ScopeHandler {
-  constructor(raise, inModule) {
-    this.scopeStack = [];
-    this.undefinedExports = new Map();
-    this.undefinedPrivateNames = new Map();
-    this.raise = raise;
-    this.inModule = inModule;
-  }
-
-  get inFunction() {
-    return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0;
-  }
-
-  get allowSuper() {
-    return (this.currentThisScope().flags & SCOPE_SUPER) > 0;
-  }
-
-  get allowDirectSuper() {
-    return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0;
-  }
-
-  get inClass() {
-    return (this.currentThisScope().flags & SCOPE_CLASS) > 0;
-  }
-
-  get inNonArrowFunction() {
-    return (this.currentThisScope().flags & SCOPE_FUNCTION) > 0;
-  }
-
-  get treatFunctionsAsVar() {
-    return this.treatFunctionsAsVarInScope(this.currentScope());
-  }
-
-  createScope(flags) {
-    return new Scope(flags);
-  }
-
-  enter(flags) {
-    this.scopeStack.push(this.createScope(flags));
-  }
-
-  exit() {
-    this.scopeStack.pop();
-  }
-
-  treatFunctionsAsVarInScope(scope) {
-    return !!(scope.flags & SCOPE_FUNCTION || !this.inModule && scope.flags & SCOPE_PROGRAM);
-  }
-
-  declareName(name, bindingType, pos) {
-    let scope = this.currentScope();
-
-    if (bindingType & BIND_SCOPE_LEXICAL || bindingType & BIND_SCOPE_FUNCTION) {
-      this.checkRedeclarationInScope(scope, name, bindingType, pos);
-
-      if (bindingType & BIND_SCOPE_FUNCTION) {
-        scope.functions.push(name);
-      } else {
-        scope.lexical.push(name);
-      }
-
-      if (bindingType & BIND_SCOPE_LEXICAL) {
-        this.maybeExportDefined(scope, name);
-      }
-    } else if (bindingType & BIND_SCOPE_VAR) {
-      for (let i = this.scopeStack.length - 1; i >= 0; --i) {
-        scope = this.scopeStack[i];
-        this.checkRedeclarationInScope(scope, name, bindingType, pos);
-        scope.var.push(name);
-        this.maybeExportDefined(scope, name);
-        if (scope.flags & SCOPE_VAR) break;
-      }
-    }
-
-    if (this.inModule && scope.flags & SCOPE_PROGRAM) {
-      this.undefinedExports.delete(name);
-    }
-  }
-
-  maybeExportDefined(scope, name) {
-    if (this.inModule && scope.flags & SCOPE_PROGRAM) {
-      this.undefinedExports.delete(name);
-    }
-  }
-
-  checkRedeclarationInScope(scope, name, bindingType, pos) {
-    if (this.isRedeclaredInScope(scope, name, bindingType)) {
-      this.raise(pos, Errors.VarRedeclaration, name);
-    }
-  }
-
-  isRedeclaredInScope(scope, name, bindingType) {
-    if (!(bindingType & BIND_KIND_VALUE)) return false;
-
-    if (bindingType & BIND_SCOPE_LEXICAL) {
-      return scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1;
-    }
-
-    if (bindingType & BIND_SCOPE_FUNCTION) {
-      return scope.lexical.indexOf(name) > -1 || !this.treatFunctionsAsVarInScope(scope) && scope.var.indexOf(name) > -1;
-    }
-
-    return scope.lexical.indexOf(name) > -1 && !(scope.flags & SCOPE_SIMPLE_CATCH && scope.lexical[0] === name) || !this.treatFunctionsAsVarInScope(scope) && scope.functions.indexOf(name) > -1;
-  }
-
-  checkLocalExport(id) {
-    if (this.scopeStack[0].lexical.indexOf(id.name) === -1 && this.scopeStack[0].var.indexOf(id.name) === -1 && this.scopeStack[0].functions.indexOf(id.name) === -1) {
-      this.undefinedExports.set(id.name, id.start);
-    }
-  }
-
-  currentScope() {
-    return this.scopeStack[this.scopeStack.length - 1];
-  }
-
-  currentVarScope() {
-    for (let i = this.scopeStack.length - 1;; i--) {
-      const scope = this.scopeStack[i];
-
-      if (scope.flags & SCOPE_VAR) {
-        return scope;
-      }
-    }
-  }
-
-  currentThisScope() {
-    for (let i = this.scopeStack.length - 1;; i--) {
-      const scope = this.scopeStack[i];
-
-      if ((scope.flags & SCOPE_VAR || scope.flags & SCOPE_CLASS) && !(scope.flags & SCOPE_ARROW)) {
-        return scope;
-      }
-    }
-  }
-
-}
-
-class TypeScriptScope extends Scope {
-  constructor(...args) {
-    super(...args);
-    this.types = [];
-    this.enums = [];
-    this.constEnums = [];
-    this.classes = [];
-    this.exportOnlyBindings = [];
-  }
-
-}
-
-class TypeScriptScopeHandler extends ScopeHandler {
-  createScope(flags) {
-    return new TypeScriptScope(flags);
-  }
-
-  declareName(name, bindingType, pos) {
-    const scope = this.currentScope();
-
-    if (bindingType & BIND_FLAGS_TS_EXPORT_ONLY) {
-      this.maybeExportDefined(scope, name);
-      scope.exportOnlyBindings.push(name);
-      return;
-    }
-
-    super.declareName(...arguments);
-
-    if (bindingType & BIND_KIND_TYPE) {
-      if (!(bindingType & BIND_KIND_VALUE)) {
-        this.checkRedeclarationInScope(scope, name, bindingType, pos);
-        this.maybeExportDefined(scope, name);
-      }
-
-      scope.types.push(name);
-    }
-
-    if (bindingType & BIND_FLAGS_TS_ENUM) scope.enums.push(name);
-    if (bindingType & BIND_FLAGS_TS_CONST_ENUM) scope.constEnums.push(name);
-    if (bindingType & BIND_FLAGS_CLASS) scope.classes.push(name);
-  }
-
-  isRedeclaredInScope(scope, name, bindingType) {
-    if (scope.enums.indexOf(name) > -1) {
-      if (bindingType & BIND_FLAGS_TS_ENUM) {
-        const isConst = !!(bindingType & BIND_FLAGS_TS_CONST_ENUM);
-        const wasConst = scope.constEnums.indexOf(name) > -1;
-        return isConst !== wasConst;
-      }
-
-      return true;
-    }
-
-    if (bindingType & BIND_FLAGS_CLASS && scope.classes.indexOf(name) > -1) {
-      if (scope.lexical.indexOf(name) > -1) {
-        return !!(bindingType & BIND_KIND_VALUE);
-      } else {
-        return false;
-      }
-    }
-
-    if (bindingType & BIND_KIND_TYPE && scope.types.indexOf(name) > -1) {
-      return true;
-    }
-
-    return super.isRedeclaredInScope(...arguments);
-  }
-
-  checkLocalExport(id) {
-    if (this.scopeStack[0].types.indexOf(id.name) === -1 && this.scopeStack[0].exportOnlyBindings.indexOf(id.name) === -1) {
-      super.checkLocalExport(id);
-    }
-  }
-
-}
-
-const PARAM = 0b000,
-      PARAM_YIELD = 0b001,
-      PARAM_AWAIT = 0b010,
-      PARAM_RETURN = 0b100;
-class ProductionParameterHandler {
-  constructor() {
-    this.stacks = [];
-  }
-
-  enter(flags) {
-    this.stacks.push(flags);
-  }
-
-  exit() {
-    this.stacks.pop();
-  }
-
-  currentFlags() {
-    return this.stacks[this.stacks.length - 1];
-  }
-
-  get hasAwait() {
-    return (this.currentFlags() & PARAM_AWAIT) > 0;
-  }
-
-  get hasYield() {
-    return (this.currentFlags() & PARAM_YIELD) > 0;
-  }
-
-  get hasReturn() {
-    return (this.currentFlags() & PARAM_RETURN) > 0;
-  }
-
-}
-function functionFlags(isAsync, isGenerator) {
-  return (isAsync ? PARAM_AWAIT : 0) | (isGenerator ? PARAM_YIELD : 0);
-}
-
-function nonNull(x) {
-  if (x == null) {
-    throw new Error(`Unexpected ${x} value.`);
-  }
-
-  return x;
-}
-
-function assert(x) {
-  if (!x) {
-    throw new Error("Assert fail");
-  }
-}
-
-const TSErrors = Object.freeze({
-  ClassMethodHasDeclare: "Class methods cannot have the 'declare' modifier",
-  ClassMethodHasReadonly: "Class methods cannot have the 'readonly' modifier",
-  DeclareClassFieldHasInitializer: "'declare' class fields cannot have an initializer",
-  DuplicateModifier: "Duplicate modifier: '%0'",
-  EmptyHeritageClauseType: "'%0' list cannot be empty.",
-  IndexSignatureHasAbstract: "Index signatures cannot have the 'abstract' modifier",
-  IndexSignatureHasAccessibility: "Index signatures cannot have an accessibility modifier ('%0')",
-  IndexSignatureHasStatic: "Index signatures cannot have the 'static' modifier",
-  OptionalTypeBeforeRequired: "A required element cannot follow an optional element.",
-  PatternIsOptional: "A binding pattern parameter cannot be optional in an implementation signature.",
-  PrivateElementHasAbstract: "Private elements cannot have the 'abstract' modifier.",
-  PrivateElementHasAccessibility: "Private elements cannot have an accessibility modifier ('%0')",
-  TemplateTypeHasSubstitution: "Template literal types cannot have any substitution",
-  TypeAnnotationAfterAssign: "Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`",
-  UnexpectedReadonly: "'readonly' type modifier is only permitted on array and tuple literal types.",
-  UnexpectedTypeAnnotation: "Did not expect a type annotation here.",
-  UnexpectedTypeCastInParameter: "Unexpected type cast in parameter position.",
-  UnsupportedImportTypeArgument: "Argument in a type import must be a string literal",
-  UnsupportedParameterPropertyKind: "A parameter property may not be declared using a binding pattern.",
-  UnsupportedSignatureParameterKind: "Name in a signature must be an Identifier, ObjectPattern or ArrayPattern, instead got %0"
-});
-
-function keywordTypeFromName(value) {
-  switch (value) {
-    case "any":
-      return "TSAnyKeyword";
-
-    case "boolean":
-      return "TSBooleanKeyword";
-
-    case "bigint":
-      return "TSBigIntKeyword";
-
-    case "never":
-      return "TSNeverKeyword";
-
-    case "number":
-      return "TSNumberKeyword";
-
-    case "object":
-      return "TSObjectKeyword";
-
-    case "string":
-      return "TSStringKeyword";
-
-    case "symbol":
-      return "TSSymbolKeyword";
-
-    case "undefined":
-      return "TSUndefinedKeyword";
-
-    case "unknown":
-      return "TSUnknownKeyword";
-
-    default:
-      return undefined;
-  }
-}
-
-var typescript = (superClass => class extends superClass {
-  getScopeHandler() {
-    return TypeScriptScopeHandler;
-  }
-
-  tsIsIdentifier() {
-    return this.match(types.name);
-  }
-
-  tsNextTokenCanFollowModifier() {
-    this.next();
-    return !this.hasPrecedingLineBreak() && !this.match(types.parenL) && !this.match(types.parenR) && !this.match(types.colon) && !this.match(types.eq) && !this.match(types.question) && !this.match(types.bang);
-  }
-
-  tsParseModifier(allowedModifiers) {
-    if (!this.match(types.name)) {
-      return undefined;
-    }
-
-    const modifier = this.state.value;
-
-    if (allowedModifiers.indexOf(modifier) !== -1 && this.tsTryParse(this.tsNextTokenCanFollowModifier.bind(this))) {
-      return modifier;
-    }
-
-    return undefined;
-  }
-
-  tsParseModifiers(modified, allowedModifiers) {
-    for (;;) {
-      const startPos = this.state.start;
-      const modifier = this.tsParseModifier(allowedModifiers);
-      if (!modifier) break;
-
-      if (Object.hasOwnProperty.call(modified, modifier)) {
-        this.raise(startPos, TSErrors.DuplicateModifier, modifier);
-      }
-
-      modified[modifier] = true;
-    }
-  }
-
-  tsIsListTerminator(kind) {
-    switch (kind) {
-      case "EnumMembers":
-      case "TypeMembers":
-        return this.match(types.braceR);
-
-      case "HeritageClauseElement":
-        return this.match(types.braceL);
-
-      case "TupleElementTypes":
-        return this.match(types.bracketR);
-
-      case "TypeParametersOrArguments":
-        return this.isRelational(">");
-    }
-
-    throw new Error("Unreachable");
-  }
-
-  tsParseList(kind, parseElement) {
-    const result = [];
-
-    while (!this.tsIsListTerminator(kind)) {
-      result.push(parseElement());
-    }
-
-    return result;
-  }
-
-  tsParseDelimitedList(kind, parseElement) {
-    return nonNull(this.tsParseDelimitedListWorker(kind, parseElement, true));
-  }
-
-  tsParseDelimitedListWorker(kind, parseElement, expectSuccess) {
-    const result = [];
-
-    for (;;) {
-      if (this.tsIsListTerminator(kind)) {
-        break;
-      }
-
-      const element = parseElement();
-
-      if (element == null) {
-        return undefined;
-      }
-
-      result.push(element);
-
-      if (this.eat(types.comma)) {
-        continue;
-      }
-
-      if (this.tsIsListTerminator(kind)) {
-        break;
-      }
-
-      if (expectSuccess) {
-        this.expect(types.comma);
-      }
-
-      return undefined;
-    }
-
-    return result;
-  }
-
-  tsParseBracketedList(kind, parseElement, bracket, skipFirstToken) {
-    if (!skipFirstToken) {
-      if (bracket) {
-        this.expect(types.bracketL);
-      } else {
-        this.expectRelational("<");
-      }
-    }
-
-    const result = this.tsParseDelimitedList(kind, parseElement);
-
-    if (bracket) {
-      this.expect(types.bracketR);
-    } else {
-      this.expectRelational(">");
-    }
-
-    return result;
-  }
-
-  tsParseImportType() {
-    const node = this.startNode();
-    this.expect(types._import);
-    this.expect(types.parenL);
-
-    if (!this.match(types.string)) {
-      this.raise(this.state.start, TSErrors.UnsupportedImportTypeArgument);
-    }
-
-    node.argument = this.parseExprAtom();
-    this.expect(types.parenR);
-
-    if (this.eat(types.dot)) {
-      node.qualifier = this.tsParseEntityName(true);
-    }
-
-    if (this.isRelational("<")) {
-      node.typeParameters = this.tsParseTypeArguments();
-    }
-
-    return this.finishNode(node, "TSImportType");
-  }
-
-  tsParseEntityName(allowReservedWords) {
-    let entity = this.parseIdentifier();
-
-    while (this.eat(types.dot)) {
-      const node = this.startNodeAtNode(entity);
-      node.left = entity;
-      node.right = this.parseIdentifier(allowReservedWords);
-      entity = this.finishNode(node, "TSQualifiedName");
-    }
-
-    return entity;
-  }
-
-  tsParseTypeReference() {
-    const node = this.startNode();
-    node.typeName = this.tsParseEntityName(false);
-
-    if (!this.hasPrecedingLineBreak() && this.isRelational("<")) {
-      node.typeParameters = this.tsParseTypeArguments();
-    }
-
-    return this.finishNode(node, "TSTypeReference");
-  }
-
-  tsParseThisTypePredicate(lhs) {
-    this.next();
-    const node = this.startNodeAtNode(lhs);
-    node.parameterName = lhs;
-    node.typeAnnotation = this.tsParseTypeAnnotation(false);
-    return this.finishNode(node, "TSTypePredicate");
-  }
-
-  tsParseThisTypeNode() {
-    const node = this.startNode();
-    this.next();
-    return this.finishNode(node, "TSThisType");
-  }
-
-  tsParseTypeQuery() {
-    const node = this.startNode();
-    this.expect(types._typeof);
-
-    if (this.match(types._import)) {
-      node.exprName = this.tsParseImportType();
-    } else {
-      node.exprName = this.tsParseEntityName(true);
-    }
-
-    return this.finishNode(node, "TSTypeQuery");
-  }
-
-  tsParseTypeParameter() {
-    const node = this.startNode();
-    node.name = this.parseIdentifierName(node.start);
-    node.constraint = this.tsEatThenParseType(types._extends);
-    node.default = this.tsEatThenParseType(types.eq);
-    return this.finishNode(node, "TSTypeParameter");
-  }
-
-  tsTryParseTypeParameters() {
-    if (this.isRelational("<")) {
-      return this.tsParseTypeParameters();
-    }
-  }
-
-  tsParseTypeParameters() {
-    const node = this.startNode();
-
-    if (this.isRelational("<") || this.match(types.jsxTagStart)) {
-      this.next();
-    } else {
-      this.unexpected();
-    }
-
-    node.params = this.tsParseBracketedList("TypeParametersOrArguments", this.tsParseTypeParameter.bind(this), false, true);
-    return this.finishNode(node, "TSTypeParameterDeclaration");
-  }
-
-  tsTryNextParseConstantContext() {
-    if (this.lookahead().type === types._const) {
-      this.next();
-      return this.tsParseTypeReference();
-    }
-
-    return null;
-  }
-
-  tsFillSignature(returnToken, signature) {
-    const returnTokenRequired = returnToken === types.arrow;
-    signature.typeParameters = this.tsTryParseTypeParameters();
-    this.expect(types.parenL);
-    signature.parameters = this.tsParseBindingListForSignature();
-
-    if (returnTokenRequired) {
-      signature.typeAnnotation = this.tsParseTypeOrTypePredicateAnnotation(returnToken);
-    } else if (this.match(returnToken)) {
-      signature.typeAnnotation = this.tsParseTypeOrTypePredicateAnnotation(returnToken);
-    }
-  }
-
-  tsParseBindingListForSignature() {
-    return this.parseBindingList(types.parenR, 41).map(pattern => {
-      if (pattern.type !== "Identifier" && pattern.type !== "RestElement" && pattern.type !== "ObjectPattern" && pattern.type !== "ArrayPattern") {
-        this.raise(pattern.start, TSErrors.UnsupportedSignatureParameterKind, pattern.type);
-      }
-
-      return pattern;
-    });
-  }
-
-  tsParseTypeMemberSemicolon() {
-    if (!this.eat(types.comma)) {
-      this.semicolon();
-    }
-  }
-
-  tsParseSignatureMember(kind, node) {
-    this.tsFillSignature(types.colon, node);
-    this.tsParseTypeMemberSemicolon();
-    return this.finishNode(node, kind);
-  }
-
-  tsIsUnambiguouslyIndexSignature() {
-    this.next();
-    return this.eat(types.name) && this.match(types.colon);
-  }
-
-  tsTryParseIndexSignature(node) {
-    if (!(this.match(types.bracketL) && this.tsLookAhead(this.tsIsUnambiguouslyIndexSignature.bind(this)))) {
-      return undefined;
-    }
-
-    this.expect(types.bracketL);
-    const id = this.parseIdentifier();
-    id.typeAnnotation = this.tsParseTypeAnnotation();
-    this.resetEndLocation(id);
-    this.expect(types.bracketR);
-    node.parameters = [id];
-    const type = this.tsTryParseTypeAnnotation();
-    if (type) node.typeAnnotation = type;
-    this.tsParseTypeMemberSemicolon();
-    return this.finishNode(node, "TSIndexSignature");
-  }
-
-  tsParsePropertyOrMethodSignature(node, readonly) {
-    if (this.eat(types.question)) node.optional = true;
-    const nodeAny = node;
-
-    if (!readonly && (this.match(types.parenL) || this.isRelational("<"))) {
-      const method = nodeAny;
-      this.tsFillSignature(types.colon, method);
-      this.tsParseTypeMemberSemicolon();
-      return this.finishNode(method, "TSMethodSignature");
-    } else {
-      const property = nodeAny;
-      if (readonly) property.readonly = true;
-      const type = this.tsTryParseTypeAnnotation();
-      if (type) property.typeAnnotation = type;
-      this.tsParseTypeMemberSemicolon();
-      return this.finishNode(property, "TSPropertySignature");
-    }
-  }
-
-  tsParseTypeMember() {
-    const node = this.startNode();
-
-    if (this.match(types.parenL) || this.isRelational("<")) {
-      return this.tsParseSignatureMember("TSCallSignatureDeclaration", node);
-    }
-
-    if (this.match(types._new)) {
-      const id = this.startNode();
-      this.next();
-
-      if (this.match(types.parenL) || this.isRelational("<")) {
-        return this.tsParseSignatureMember("TSConstructSignatureDeclaration", node);
-      } else {
-        node.key = this.createIdentifier(id, "new");
-        return this.tsParsePropertyOrMethodSignature(node, false);
-      }
-    }
-
-    const readonly = !!this.tsParseModifier(["readonly"]);
-    const idx = this.tsTryParseIndexSignature(node);
-
-    if (idx) {
-      if (readonly) node.readonly = true;
-      return idx;
-    }
-
-    this.parsePropertyName(node, false);
-    return this.tsParsePropertyOrMethodSignature(node, readonly);
-  }
-
-  tsParseTypeLiteral() {
-    const node = this.startNode();
-    node.members = this.tsParseObjectTypeMembers();
-    return this.finishNode(node, "TSTypeLiteral");
-  }
-
-  tsParseObjectTypeMembers() {
-    this.expect(types.braceL);
-    const members = this.tsParseList("TypeMembers", this.tsParseTypeMember.bind(this));
-    this.expect(types.braceR);
-    return members;
-  }
-
-  tsIsStartOfMappedType() {
-    this.next();
-
-    if (this.eat(types.plusMin)) {
-      return this.isContextual("readonly");
-    }
-
-    if (this.isContextual("readonly")) {
-      this.next();
-    }
-
-    if (!this.match(types.bracketL)) {
-      return false;
-    }
-
-    this.next();
-
-    if (!this.tsIsIdentifier()) {
-      return false;
-    }
-
-    this.next();
-    return this.match(types._in);
-  }
-
-  tsParseMappedTypeParameter() {
-    const node = this.startNode();
-    node.name = this.parseIdentifierName(node.start);
-    node.constraint = this.tsExpectThenParseType(types._in);
-    return this.finishNode(node, "TSTypeParameter");
-  }
-
-  tsParseMappedType() {
-    const node = this.startNode();
-    this.expect(types.braceL);
-
-    if (this.match(types.plusMin)) {
-      node.readonly = this.state.value;
-      this.next();
-      this.expectContextual("readonly");
-    } else if (this.eatContextual("readonly")) {
-      node.readonly = true;
-    }
-
-    this.expect(types.bracketL);
-    node.typeParameter = this.tsParseMappedTypeParameter();
-    this.expect(types.bracketR);
-
-    if (this.match(types.plusMin)) {
-      node.optional = this.state.value;
-      this.next();
-      this.expect(types.question);
-    } else if (this.eat(types.question)) {
-      node.optional = true;
-    }
-
-    node.typeAnnotation = this.tsTryParseType();
-    this.semicolon();
-    this.expect(types.braceR);
-    return this.finishNode(node, "TSMappedType");
-  }
-
-  tsParseTupleType() {
-    const node = this.startNode();
-    node.elementTypes = this.tsParseBracketedList("TupleElementTypes", this.tsParseTupleElementType.bind(this), true, false);
-    let seenOptionalElement = false;
-    node.elementTypes.forEach(elementNode => {
-      if (elementNode.type === "TSOptionalType") {
-        seenOptionalElement = true;
-      } else if (seenOptionalElement && elementNode.type !== "TSRestType") {
-        this.raise(elementNode.start, TSErrors.OptionalTypeBeforeRequired);
-      }
-    });
-    return this.finishNode(node, "TSTupleType");
-  }
-
-  tsParseTupleElementType() {
-    if (this.match(types.ellipsis)) {
-      const restNode = this.startNode();
-      this.next();
-      restNode.typeAnnotation = this.tsParseType();
-
-      if (this.match(types.comma) && this.lookaheadCharCode() !== 93) {
-        this.raiseRestNotLast(this.state.start);
-      }
-
-      return this.finishNode(restNode, "TSRestType");
-    }
-
-    const type = this.tsParseType();
-
-    if (this.eat(types.question)) {
-      const optionalTypeNode = this.startNodeAtNode(type);
-      optionalTypeNode.typeAnnotation = type;
-      return this.finishNode(optionalTypeNode, "TSOptionalType");
-    }
-
-    return type;
-  }
-
-  tsParseParenthesizedType() {
-    const node = this.startNode();
-    this.expect(types.parenL);
-    node.typeAnnotation = this.tsParseType();
-    this.expect(types.parenR);
-    return this.finishNode(node, "TSParenthesizedType");
-  }
-
-  tsParseFunctionOrConstructorType(type) {
-    const node = this.startNode();
-
-    if (type === "TSConstructorType") {
-      this.expect(types._new);
-    }
-
-    this.tsFillSignature(types.arrow, node);
-    return this.finishNode(node, type);
-  }
-
-  tsParseLiteralTypeNode() {
-    const node = this.startNode();
-
-    node.literal = (() => {
-      switch (this.state.type) {
-        case types.num:
-        case types.string:
-        case types._true:
-        case types._false:
-          return this.parseExprAtom();
-
-        default:
-          throw this.unexpected();
-      }
-    })();
-
-    return this.finishNode(node, "TSLiteralType");
-  }
-
-  tsParseTemplateLiteralType() {
-    const node = this.startNode();
-    const templateNode = this.parseTemplate(false);
-
-    if (templateNode.expressions.length > 0) {
-      this.raise(templateNode.expressions[0].start, TSErrors.TemplateTypeHasSubstitution);
-    }
-
-    node.literal = templateNode;
-    return this.finishNode(node, "TSLiteralType");
-  }
-
-  tsParseThisTypeOrThisTypePredicate() {
-    const thisKeyword = this.tsParseThisTypeNode();
-
-    if (this.isContextual("is") && !this.hasPrecedingLineBreak()) {
-      return this.tsParseThisTypePredicate(thisKeyword);
-    } else {
-      return thisKeyword;
-    }
-  }
-
-  tsParseNonArrayType() {
-    switch (this.state.type) {
-      case types.name:
-      case types._void:
-      case types._null:
-        {
-          const type = this.match(types._void) ? "TSVoidKeyword" : this.match(types._null) ? "TSNullKeyword" : keywordTypeFromName(this.state.value);
-
-          if (type !== undefined && this.lookaheadCharCode() !== 46) {
-            const node = this.startNode();
-            this.next();
-            return this.finishNode(node, type);
-          }
-
-          return this.tsParseTypeReference();
-        }
-
-      case types.string:
-      case types.num:
-      case types._true:
-      case types._false:
-        return this.tsParseLiteralTypeNode();
-
-      case types.plusMin:
-        if (this.state.value === "-") {
-          const node = this.startNode();
-
-          if (this.lookahead().type !== types.num) {
-            throw this.unexpected();
-          }
-
-          node.literal = this.parseMaybeUnary();
-          return this.finishNode(node, "TSLiteralType");
-        }
-
-        break;
-
-      case types._this:
-        return this.tsParseThisTypeOrThisTypePredicate();
-
-      case types._typeof:
-        return this.tsParseTypeQuery();
-
-      case types._import:
-        return this.tsParseImportType();
-
-      case types.braceL:
-        return this.tsLookAhead(this.tsIsStartOfMappedType.bind(this)) ? this.tsParseMappedType() : this.tsParseTypeLiteral();
-
-      case types.bracketL:
-        return this.tsParseTupleType();
-
-      case types.parenL:
-        return this.tsParseParenthesizedType();
-
-      case types.backQuote:
-        return this.tsParseTemplateLiteralType();
-    }
-
-    throw this.unexpected();
-  }
-
-  tsParseArrayTypeOrHigher() {
-    let type = this.tsParseNonArrayType();
-
-    while (!this.hasPrecedingLineBreak() && this.eat(types.bracketL)) {
-      if (this.match(types.bracketR)) {
-        const node = this.startNodeAtNode(type);
-        node.elementType = type;
-        this.expect(types.bracketR);
-        type = this.finishNode(node, "TSArrayType");
-      } else {
-        const node = this.startNodeAtNode(type);
-        node.objectType = type;
-        node.indexType = this.tsParseType();
-        this.expect(types.bracketR);
-        type = this.finishNode(node, "TSIndexedAccessType");
-      }
-    }
-
-    return type;
-  }
-
-  tsParseTypeOperator(operator) {
-    const node = this.startNode();
-    this.expectContextual(operator);
-    node.operator = operator;
-    node.typeAnnotation = this.tsParseTypeOperatorOrHigher();
-
-    if (operator === "readonly") {
-      this.tsCheckTypeAnnotationForReadOnly(node);
-    }
-
-    return this.finishNode(node, "TSTypeOperator");
-  }
-
-  tsCheckTypeAnnotationForReadOnly(node) {
-    switch (node.typeAnnotation.type) {
-      case "TSTupleType":
-      case "TSArrayType":
-        return;
-
-      default:
-        this.raise(node.start, TSErrors.UnexpectedReadonly);
-    }
-  }
-
-  tsParseInferType() {
-    const node = this.startNode();
-    this.expectContextual("infer");
-    const typeParameter = this.startNode();
-    typeParameter.name = this.parseIdentifierName(typeParameter.start);
-    node.typeParameter = this.finishNode(typeParameter, "TSTypeParameter");
-    return this.finishNode(node, "TSInferType");
-  }
-
-  tsParseTypeOperatorOrHigher() {
-    const operator = ["keyof", "unique", "readonly"].find(kw => this.isContextual(kw));
-    return operator ? this.tsParseTypeOperator(operator) : this.isContextual("infer") ? this.tsParseInferType() : this.tsParseArrayTypeOrHigher();
-  }
-
-  tsParseUnionOrIntersectionType(kind, parseConstituentType, operator) {
-    this.eat(operator);
-    let type = parseConstituentType();
-
-    if (this.match(operator)) {
-      const types = [type];
-
-      while (this.eat(operator)) {
-        types.push(parseConstituentType());
-      }
-
-      const node = this.startNodeAtNode(type);
-      node.types = types;
-      type = this.finishNode(node, kind);
-    }
-
-    return type;
-  }
-
-  tsParseIntersectionTypeOrHigher() {
-    return this.tsParseUnionOrIntersectionType("TSIntersectionType", this.tsParseTypeOperatorOrHigher.bind(this), types.bitwiseAND);
-  }
-
-  tsParseUnionTypeOrHigher() {
-    return this.tsParseUnionOrIntersectionType("TSUnionType", this.tsParseIntersectionTypeOrHigher.bind(this), types.bitwiseOR);
-  }
-
-  tsIsStartOfFunctionType() {
-    if (this.isRelational("<")) {
-      return true;
-    }
-
-    return this.match(types.parenL) && this.tsLookAhead(this.tsIsUnambiguouslyStartOfFunctionType.bind(this));
-  }
-
-  tsSkipParameterStart() {
-    if (this.match(types.name) || this.match(types._this)) {
-      this.next();
-      return true;
-    }
-
-    if (this.match(types.braceL)) {
-      let braceStackCounter = 1;
-      this.next();
-
-      while (braceStackCounter > 0) {
-        if (this.match(types.braceL)) {
-          ++braceStackCounter;
-        } else if (this.match(types.braceR)) {
-          --braceStackCounter;
-        }
-
-        this.next();
-      }
-
-      return true;
-    }
-
-    if (this.match(types.bracketL)) {
-      let braceStackCounter = 1;
-      this.next();
-
-      while (braceStackCounter > 0) {
-        if (this.match(types.bracketL)) {
-          ++braceStackCounter;
-        } else if (this.match(types.bracketR)) {
-          --braceStackCounter;
-        }
-
-        this.next();
-      }
-
-      return true;
-    }
-
-    return false;
-  }
-
-  tsIsUnambiguouslyStartOfFunctionType() {
-    this.next();
-
-    if (this.match(types.parenR) || this.match(types.ellipsis)) {
-      return true;
-    }
-
-    if (this.tsSkipParameterStart()) {
-      if (this.match(types.colon) || this.match(types.comma) || this.match(types.question) || this.match(types.eq)) {
-        return true;
-      }
-
-      if (this.match(types.parenR)) {
-        this.next();
-
-        if (this.match(types.arrow)) {
-          return true;
-        }
-      }
-    }
-
-    return false;
-  }
-
-  tsParseTypeOrTypePredicateAnnotation(returnToken) {
-    return this.tsInType(() => {
-      const t = this.startNode();
-      this.expect(returnToken);
-      const asserts = this.tsTryParse(this.tsParseTypePredicateAsserts.bind(this));
-
-      if (asserts && this.match(types._this)) {
-        let thisTypePredicate = this.tsParseThisTypeOrThisTypePredicate();
-
-        if (thisTypePredicate.type === "TSThisType") {
-          const node = this.startNodeAtNode(t);
-          node.parameterName = thisTypePredicate;
-          node.asserts = true;
-          thisTypePredicate = this.finishNode(node, "TSTypePredicate");
-        } else {
-          thisTypePredicate.asserts = true;
-        }
-
-        t.typeAnnotation = thisTypePredicate;
-        return this.finishNode(t, "TSTypeAnnotation");
-      }
-
-      const typePredicateVariable = this.tsIsIdentifier() && this.tsTryParse(this.tsParseTypePredicatePrefix.bind(this));
-
-      if (!typePredicateVariable) {
-        if (!asserts) {
-          return this.tsParseTypeAnnotation(false, t);
-        }
-
-        const node = this.startNodeAtNode(t);
-        node.parameterName = this.parseIdentifier();
-        node.asserts = asserts;
-        t.typeAnnotation = this.finishNode(node, "TSTypePredicate");
-        return this.finishNode(t, "TSTypeAnnotation");
-      }
-
-      const type = this.tsParseTypeAnnotation(false);
-      const node = this.startNodeAtNode(t);
-      node.parameterName = typePredicateVariable;
-      node.typeAnnotation = type;
-      node.asserts = asserts;
-      t.typeAnnotation = this.finishNode(node, "TSTypePredicate");
-      return this.finishNode(t, "TSTypeAnnotation");
-    });
-  }
-
-  tsTryParseTypeOrTypePredicateAnnotation() {
-    return this.match(types.colon) ? this.tsParseTypeOrTypePredicateAnnotation(types.colon) : undefined;
-  }
-
-  tsTryParseTypeAnnotation() {
-    return this.match(types.colon) ? this.tsParseTypeAnnotation() : undefined;
-  }
-
-  tsTryParseType() {
-    return this.tsEatThenParseType(types.colon);
-  }
-
-  tsParseTypePredicatePrefix() {
-    const id = this.parseIdentifier();
-
-    if (this.isContextual("is") && !this.hasPrecedingLineBreak()) {
-      this.next();
-      return id;
-    }
-  }
-
-  tsParseTypePredicateAsserts() {
-    if (!this.match(types.name) || this.state.value !== "asserts" || this.hasPrecedingLineBreak()) {
-      return false;
-    }
-
-    const containsEsc = this.state.containsEsc;
-    this.next();
-
-    if (!this.match(types.name) && !this.match(types._this)) {
-      return false;
-    }
-
-    if (containsEsc) {
-      this.raise(this.state.lastTokStart, Errors.InvalidEscapedReservedWord, "asserts");
-    }
-
-    return true;
-  }
-
-  tsParseTypeAnnotation(eatColon = true, t = this.startNode()) {
-    this.tsInType(() => {
-      if (eatColon) this.expect(types.colon);
-      t.typeAnnotation = this.tsParseType();
-    });
-    return this.finishNode(t, "TSTypeAnnotation");
-  }
-
-  tsParseType() {
-    assert(this.state.inType);
-    const type = this.tsParseNonConditionalType();
-
-    if (this.hasPrecedingLineBreak() || !this.eat(types._extends)) {
-      return type;
-    }
-
-    const node = this.startNodeAtNode(type);
-    node.checkType = type;
-    node.extendsType = this.tsParseNonConditionalType();
-    this.expect(types.question);
-    node.trueType = this.tsParseType();
-    this.expect(types.colon);
-    node.falseType = this.tsParseType();
-    return this.finishNode(node, "TSConditionalType");
-  }
-
-  tsParseNonConditionalType() {
-    if (this.tsIsStartOfFunctionType()) {
-      return this.tsParseFunctionOrConstructorType("TSFunctionType");
-    }
-
-    if (this.match(types._new)) {
-      return this.tsParseFunctionOrConstructorType("TSConstructorType");
-    }
-
-    return this.tsParseUnionTypeOrHigher();
-  }
-
-  tsParseTypeAssertion() {
-    const node = this.startNode();
-
-    const _const = this.tsTryNextParseConstantContext();
-
-    node.typeAnnotation = _const || this.tsNextThenParseType();
-    this.expectRelational(">");
-    node.expression = this.parseMaybeUnary();
-    return this.finishNode(node, "TSTypeAssertion");
-  }
-
-  tsParseHeritageClause(descriptor) {
-    const originalStart = this.state.start;
-    const delimitedList = this.tsParseDelimitedList("HeritageClauseElement", this.tsParseExpressionWithTypeArguments.bind(this));
-
-    if (!delimitedList.length) {
-      this.raise(originalStart, TSErrors.EmptyHeritageClauseType, descriptor);
-    }
-
-    return delimitedList;
-  }
-
-  tsParseExpressionWithTypeArguments() {
-    const node = this.startNode();
-    node.expression = this.tsParseEntityName(false);
-
-    if (this.isRelational("<")) {
-      node.typeParameters = this.tsParseTypeArguments();
-    }
-
-    return this.finishNode(node, "TSExpressionWithTypeArguments");
-  }
-
-  tsParseInterfaceDeclaration(node) {
-    node.id = this.parseIdentifier();
-    this.checkLVal(node.id, BIND_TS_INTERFACE, undefined, "typescript interface declaration");
-    node.typeParameters = this.tsTryParseTypeParameters();
-
-    if (this.eat(types._extends)) {
-      node.extends = this.tsParseHeritageClause("extends");
-    }
-
-    const body = this.startNode();
-    body.body = this.tsInType(this.tsParseObjectTypeMembers.bind(this));
-    node.body = this.finishNode(body, "TSInterfaceBody");
-    return this.finishNode(node, "TSInterfaceDeclaration");
-  }
-
-  tsParseTypeAliasDeclaration(node) {
-    node.id = this.parseIdentifier();
-    this.checkLVal(node.id, BIND_TS_TYPE, undefined, "typescript type alias");
-    node.typeParameters = this.tsTryParseTypeParameters();
-    node.typeAnnotation = this.tsExpectThenParseType(types.eq);
-    this.semicolon();
-    return this.finishNode(node, "TSTypeAliasDeclaration");
-  }
-
-  tsInNoContext(cb) {
-    const oldContext = this.state.context;
-    this.state.context = [oldContext[0]];
-
-    try {
-      return cb();
-    } finally {
-      this.state.context = oldContext;
-    }
-  }
-
-  tsInType(cb) {
-    const oldInType = this.state.inType;
-    this.state.inType = true;
-
-    try {
-      return cb();
-    } finally {
-      this.state.inType = oldInType;
-    }
-  }
-
-  tsEatThenParseType(token) {
-    return !this.match(token) ? undefined : this.tsNextThenParseType();
-  }
-
-  tsExpectThenParseType(token) {
-    return this.tsDoThenParseType(() => this.expect(token));
-  }
-
-  tsNextThenParseType() {
-    return this.tsDoThenParseType(() => this.next());
-  }
-
-  tsDoThenParseType(cb) {
-    return this.tsInType(() => {
-      cb();
-      return this.tsParseType();
-    });
-  }
-
-  tsParseEnumMember() {
-    const node = this.startNode();
-    node.id = this.match(types.string) ? this.parseExprAtom() : this.parseIdentifier(true);
-
-    if (this.eat(types.eq)) {
-      node.initializer = this.parseMaybeAssign();
-    }
-
-    return this.finishNode(node, "TSEnumMember");
-  }
-
-  tsParseEnumDeclaration(node, isConst) {
-    if (isConst) node.const = true;
-    node.id = this.parseIdentifier();
-    this.checkLVal(node.id, isConst ? BIND_TS_CONST_ENUM : BIND_TS_ENUM, undefined, "typescript enum declaration");
-    this.expect(types.braceL);
-    node.members = this.tsParseDelimitedList("EnumMembers", this.tsParseEnumMember.bind(this));
-    this.expect(types.braceR);
-    return this.finishNode(node, "TSEnumDeclaration");
-  }
-
-  tsParseModuleBlock() {
-    const node = this.startNode();
-    this.scope.enter(SCOPE_OTHER);
-    this.expect(types.braceL);
-    this.parseBlockOrModuleBlockBody(node.body = [], undefined, true, types.braceR);
-    this.scope.exit();
-    return this.finishNode(node, "TSModuleBlock");
-  }
-
-  tsParseModuleOrNamespaceDeclaration(node, nested = false) {
-    node.id = this.parseIdentifier();
-
-    if (!nested) {
-      this.checkLVal(node.id, BIND_TS_NAMESPACE, null, "module or namespace declaration");
-    }
-
-    if (this.eat(types.dot)) {
-      const inner = this.startNode();
-      this.tsParseModuleOrNamespaceDeclaration(inner, true);
-      node.body = inner;
-    } else {
-      this.scope.enter(SCOPE_TS_MODULE);
-      this.prodParam.enter(PARAM);
-      node.body = this.tsParseModuleBlock();
-      this.prodParam.exit();
-      this.scope.exit();
-    }
-
-    return this.finishNode(node, "TSModuleDeclaration");
-  }
-
-  tsParseAmbientExternalModuleDeclaration(node) {
-    if (this.isContextual("global")) {
-      node.global = true;
-      node.id = this.parseIdentifier();
-    } else if (this.match(types.string)) {
-      node.id = this.parseExprAtom();
-    } else {
-      this.unexpected();
-    }
-
-    if (this.match(types.braceL)) {
-      this.scope.enter(SCOPE_TS_MODULE);
-      this.prodParam.enter(PARAM);
-      node.body = this.tsParseModuleBlock();
-      this.prodParam.exit();
-      this.scope.exit();
-    } else {
-      this.semicolon();
-    }
-
-    return this.finishNode(node, "TSModuleDeclaration");
-  }
-
-  tsParseImportEqualsDeclaration(node, isExport) {
-    node.isExport = isExport || false;
-    node.id = this.parseIdentifier();
-    this.checkLVal(node.id, BIND_LEXICAL, undefined, "import equals declaration");
-    this.expect(types.eq);
-    node.moduleReference = this.tsParseModuleReference();
-    this.semicolon();
-    return this.finishNode(node, "TSImportEqualsDeclaration");
-  }
-
-  tsIsExternalModuleReference() {
-    return this.isContextual("require") && this.lookaheadCharCode() === 40;
-  }
-
-  tsParseModuleReference() {
-    return this.tsIsExternalModuleReference() ? this.tsParseExternalModuleReference() : this.tsParseEntityName(false);
-  }
-
-  tsParseExternalModuleReference() {
-    const node = this.startNode();
-    this.expectContextual("require");
-    this.expect(types.parenL);
-
-    if (!this.match(types.string)) {
-      throw this.unexpected();
-    }
-
-    node.expression = this.parseExprAtom();
-    this.expect(types.parenR);
-    return this.finishNode(node, "TSExternalModuleReference");
-  }
-
-  tsLookAhead(f) {
-    const state = this.state.clone();
-    const res = f();
-    this.state = state;
-    return res;
-  }
-
-  tsTryParseAndCatch(f) {
-    const result = this.tryParse(abort => f() || abort());
-    if (result.aborted || !result.node) return undefined;
-    if (result.error) this.state = result.failState;
-    return result.node;
-  }
-
-  tsTryParse(f) {
-    const state = this.state.clone();
-    const result = f();
-
-    if (result !== undefined && result !== false) {
-      return result;
-    } else {
-      this.state = state;
-      return undefined;
-    }
-  }
-
-  tsTryParseDeclare(nany) {
-    if (this.isLineTerminator()) {
-      return;
-    }
-
-    let starttype = this.state.type;
-    let kind;
-
-    if (this.isContextual("let")) {
-      starttype = types._var;
-      kind = "let";
-    }
-
-    switch (starttype) {
-      case types._function:
-        return this.parseFunctionStatement(nany, false, true);
-
-      case types._class:
-        nany.declare = true;
-        return this.parseClass(nany, true, false);
-
-      case types._const:
-        if (this.match(types._const) && this.isLookaheadContextual("enum")) {
-          this.expect(types._const);
-          this.expectContextual("enum");
-          return this.tsParseEnumDeclaration(nany, true);
-        }
-
-      case types._var:
-        kind = kind || this.state.value;
-        return this.parseVarStatement(nany, kind);
-
-      case types.name:
-        {
-          const value = this.state.value;
-
-          if (value === "global") {
-            return this.tsParseAmbientExternalModuleDeclaration(nany);
-          } else {
-            return this.tsParseDeclaration(nany, value, true);
-          }
-        }
-    }
-  }
-
-  tsTryParseExportDeclaration() {
-    return this.tsParseDeclaration(this.startNode(), this.state.value, true);
-  }
-
-  tsParseExpressionStatement(node, expr) {
-    switch (expr.name) {
-      case "declare":
-        {
-          const declaration = this.tsTryParseDeclare(node);
-
-          if (declaration) {
-            declaration.declare = true;
-            return declaration;
-          }
-
-          break;
-        }
-
-      case "global":
-        if (this.match(types.braceL)) {
-          this.scope.enter(SCOPE_TS_MODULE);
-          this.prodParam.enter(PARAM);
-          const mod = node;
-          mod.global = true;
-          mod.id = expr;
-          mod.body = this.tsParseModuleBlock();
-          this.scope.exit();
-          this.prodParam.exit();
-          return this.finishNode(mod, "TSModuleDeclaration");
-        }
-
-        break;
-
-      default:
-        return this.tsParseDeclaration(node, expr.name, false);
-    }
-  }
-
-  tsParseDeclaration(node, value, next) {
-    switch (value) {
-      case "abstract":
-        if (this.tsCheckLineTerminatorAndMatch(types._class, next)) {
-          const cls = node;
-          cls.abstract = true;
-
-          if (next) {
-            this.next();
-
-            if (!this.match(types._class)) {
-              this.unexpected(null, types._class);
-            }
-          }
-
-          return this.parseClass(cls, true, false);
-        }
-
-        break;
-
-      case "enum":
-        if (next || this.match(types.name)) {
-          if (next) this.next();
-          return this.tsParseEnumDeclaration(node, false);
-        }
-
-        break;
-
-      case "interface":
-        if (this.tsCheckLineTerminatorAndMatch(types.name, next)) {
-          if (next) this.next();
-          return this.tsParseInterfaceDeclaration(node);
-        }
-
-        break;
-
-      case "module":
-        if (next) this.next();
-
-        if (this.match(types.string)) {
-          return this.tsParseAmbientExternalModuleDeclaration(node);
-        } else if (this.tsCheckLineTerminatorAndMatch(types.name, next)) {
-          return this.tsParseModuleOrNamespaceDeclaration(node);
-        }
-
-        break;
-
-      case "namespace":
-        if (this.tsCheckLineTerminatorAndMatch(types.name, next)) {
-          if (next) this.next();
-          return this.tsParseModuleOrNamespaceDeclaration(node);
-        }
-
-        break;
-
-      case "type":
-        if (this.tsCheckLineTerminatorAndMatch(types.name, next)) {
-          if (next) this.next();
-          return this.tsParseTypeAliasDeclaration(node);
-        }
-
-        break;
-    }
-  }
-
-  tsCheckLineTerminatorAndMatch(tokenType, next) {
-    return (next || this.match(tokenType)) && !this.isLineTerminator();
-  }
-
-  tsTryParseGenericAsyncArrowFunction(startPos, startLoc) {
-    if (!this.isRelational("<")) {
-      return undefined;
-    }
-
-    const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;
-    const oldYieldPos = this.state.yieldPos;
-    const oldAwaitPos = this.state.awaitPos;
-    this.state.maybeInArrowParameters = true;
-    this.state.yieldPos = -1;
-    this.state.awaitPos = -1;
-    const res = this.tsTryParseAndCatch(() => {
-      const node = this.startNodeAt(startPos, startLoc);
-      node.typeParameters = this.tsParseTypeParameters();
-      super.parseFunctionParams(node);
-      node.returnType = this.tsTryParseTypeOrTypePredicateAnnotation();
-      this.expect(types.arrow);
-      return node;
-    });
-    this.state.maybeInArrowParameters = oldMaybeInArrowParameters;
-    this.state.yieldPos = oldYieldPos;
-    this.state.awaitPos = oldAwaitPos;
-
-    if (!res) {
-      return undefined;
-    }
-
-    return this.parseArrowExpression(res, null, true);
-  }
-
-  tsParseTypeArguments() {
-    const node = this.startNode();
-    node.params = this.tsInType(() => this.tsInNoContext(() => {
-      this.expectRelational("<");
-      return this.tsParseDelimitedList("TypeParametersOrArguments", this.tsParseType.bind(this));
-    }));
-    this.state.exprAllowed = false;
-    this.expectRelational(">");
-    return this.finishNode(node, "TSTypeParameterInstantiation");
-  }
-
-  tsIsDeclarationStart() {
-    if (this.match(types.name)) {
-      switch (this.state.value) {
-        case "abstract":
-        case "declare":
-        case "enum":
-        case "interface":
-        case "module":
-        case "namespace":
-        case "type":
-          return true;
-      }
-    }
-
-    return false;
-  }
-
-  isExportDefaultSpecifier() {
-    if (this.tsIsDeclarationStart()) return false;
-    return super.isExportDefaultSpecifier();
-  }
-
-  parseAssignableListItem(allowModifiers, decorators) {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    let accessibility;
-    let readonly = false;
-
-    if (allowModifiers) {
-      accessibility = this.parseAccessModifier();
-      readonly = !!this.tsParseModifier(["readonly"]);
-    }
-
-    const left = this.parseMaybeDefault();
-    this.parseAssignableListItemTypes(left);
-    const elt = this.parseMaybeDefault(left.start, left.loc.start, left);
-
-    if (accessibility || readonly) {
-      const pp = this.startNodeAt(startPos, startLoc);
-
-      if (decorators.length) {
-        pp.decorators = decorators;
-      }
-
-      if (accessibility) pp.accessibility = accessibility;
-      if (readonly) pp.readonly = readonly;
-
-      if (elt.type !== "Identifier" && elt.type !== "AssignmentPattern") {
-        this.raise(pp.start, TSErrors.UnsupportedParameterPropertyKind);
-      }
-
-      pp.parameter = elt;
-      return this.finishNode(pp, "TSParameterProperty");
-    }
-
-    if (decorators.length) {
-      left.decorators = decorators;
-    }
-
-    return elt;
-  }
-
-  parseFunctionBodyAndFinish(node, type, isMethod = false) {
-    if (this.match(types.colon)) {
-      node.returnType = this.tsParseTypeOrTypePredicateAnnotation(types.colon);
-    }
-
-    const bodilessType = type === "FunctionDeclaration" ? "TSDeclareFunction" : type === "ClassMethod" ? "TSDeclareMethod" : undefined;
-
-    if (bodilessType && !this.match(types.braceL) && this.isLineTerminator()) {
-      this.finishNode(node, bodilessType);
-      return;
-    }
-
-    super.parseFunctionBodyAndFinish(node, type, isMethod);
-  }
-
-  registerFunctionStatementId(node) {
-    if (!node.body && node.id) {
-      this.checkLVal(node.id, BIND_TS_AMBIENT, null, "function name");
-    } else {
-      super.registerFunctionStatementId(...arguments);
-    }
-  }
-
-  parseSubscript(base, startPos, startLoc, noCalls, state) {
-    if (!this.hasPrecedingLineBreak() && this.match(types.bang)) {
-      this.state.exprAllowed = false;
-      this.next();
-      const nonNullExpression = this.startNodeAt(startPos, startLoc);
-      nonNullExpression.expression = base;
-      return this.finishNode(nonNullExpression, "TSNonNullExpression");
-    }
-
-    if (this.isRelational("<")) {
-      const result = this.tsTryParseAndCatch(() => {
-        if (!noCalls && this.atPossibleAsyncArrow(base)) {
-          const asyncArrowFn = this.tsTryParseGenericAsyncArrowFunction(startPos, startLoc);
-
-          if (asyncArrowFn) {
-            return asyncArrowFn;
-          }
-        }
-
-        const node = this.startNodeAt(startPos, startLoc);
-        node.callee = base;
-        const typeArguments = this.tsParseTypeArguments();
-
-        if (typeArguments) {
-          if (!noCalls && this.eat(types.parenL)) {
-            node.arguments = this.parseCallExpressionArguments(types.parenR, false);
-            node.typeParameters = typeArguments;
-            return this.finishCallExpression(node, state.optionalChainMember);
-          } else if (this.match(types.backQuote)) {
-            return this.parseTaggedTemplateExpression(startPos, startLoc, base, state, typeArguments);
-          }
-        }
-
-        this.unexpected();
-      });
-      if (result) return result;
-    }
-
-    return super.parseSubscript(base, startPos, startLoc, noCalls, state);
-  }
-
-  parseNewArguments(node) {
-    if (this.isRelational("<")) {
-      const typeParameters = this.tsTryParseAndCatch(() => {
-        const args = this.tsParseTypeArguments();
-        if (!this.match(types.parenL)) this.unexpected();
-        return args;
-      });
-
-      if (typeParameters) {
-        node.typeParameters = typeParameters;
-      }
-    }
-
-    super.parseNewArguments(node);
-  }
-
-  parseExprOp(left, leftStartPos, leftStartLoc, minPrec, noIn) {
-    if (nonNull(types._in.binop) > minPrec && !this.hasPrecedingLineBreak() && this.isContextual("as")) {
-      const node = this.startNodeAt(leftStartPos, leftStartLoc);
-      node.expression = left;
-
-      const _const = this.tsTryNextParseConstantContext();
-
-      if (_const) {
-        node.typeAnnotation = _const;
-      } else {
-        node.typeAnnotation = this.tsNextThenParseType();
-      }
-
-      this.finishNode(node, "TSAsExpression");
-      return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn);
-    }
-
-    return super.parseExprOp(left, leftStartPos, leftStartLoc, minPrec, noIn);
-  }
-
-  checkReservedWord(word, startLoc, checkKeywords, isBinding) {}
-
-  checkDuplicateExports() {}
-
-  parseImport(node) {
-    if (this.match(types.name) || this.match(types.star) || this.match(types.braceL)) {
-      const ahead = this.lookahead();
-
-      if (this.match(types.name) && ahead.type === types.eq) {
-        return this.tsParseImportEqualsDeclaration(node);
-      }
-
-      if (this.isContextual("type") && ahead.type !== types.comma && !(ahead.type === types.name && ahead.value === "from")) {
-        node.importKind = "type";
-        this.next();
-      } else {
-        node.importKind = "value";
-      }
-    }
-
-    const importNode = super.parseImport(node);
-
-    if (importNode.importKind === "type" && importNode.specifiers.length > 1 && importNode.specifiers[0].type === "ImportDefaultSpecifier") {
-      this.raise(importNode.start, "A type-only import can specify a default import or named bindings, but not both.");
-    }
-
-    return importNode;
-  }
-
-  parseExport(node) {
-    if (this.match(types._import)) {
-      this.expect(types._import);
-      return this.tsParseImportEqualsDeclaration(node, true);
-    } else if (this.eat(types.eq)) {
-      const assign = node;
-      assign.expression = this.parseExpression();
-      this.semicolon();
-      return this.finishNode(assign, "TSExportAssignment");
-    } else if (this.eatContextual("as")) {
-      const decl = node;
-      this.expectContextual("namespace");
-      decl.id = this.parseIdentifier();
-      this.semicolon();
-      return this.finishNode(decl, "TSNamespaceExportDeclaration");
-    } else {
-      if (this.isContextual("type") && this.lookahead().type === types.braceL) {
-        this.next();
-        node.exportKind = "type";
-      } else {
-        node.exportKind = "value";
-      }
-
-      return super.parseExport(node);
-    }
-  }
-
-  isAbstractClass() {
-    return this.isContextual("abstract") && this.lookahead().type === types._class;
-  }
-
-  parseExportDefaultExpression() {
-    if (this.isAbstractClass()) {
-      const cls = this.startNode();
-      this.next();
-      this.parseClass(cls, true, true);
-      cls.abstract = true;
-      return cls;
-    }
-
-    if (this.state.value === "interface") {
-      const result = this.tsParseDeclaration(this.startNode(), this.state.value, true);
-      if (result) return result;
-    }
-
-    return super.parseExportDefaultExpression();
-  }
-
-  parseStatementContent(context, topLevel) {
-    if (this.state.type === types._const) {
-      const ahead = this.lookahead();
-
-      if (ahead.type === types.name && ahead.value === "enum") {
-        const node = this.startNode();
-        this.expect(types._const);
-        this.expectContextual("enum");
-        return this.tsParseEnumDeclaration(node, true);
-      }
-    }
-
-    return super.parseStatementContent(context, topLevel);
-  }
-
-  parseAccessModifier() {
-    return this.tsParseModifier(["public", "protected", "private"]);
-  }
-
-  parseClassMember(classBody, member, state, constructorAllowsSuper) {
-    this.tsParseModifiers(member, ["declare"]);
-    const accessibility = this.parseAccessModifier();
-    if (accessibility) member.accessibility = accessibility;
-    this.tsParseModifiers(member, ["declare"]);
-    super.parseClassMember(classBody, member, state, constructorAllowsSuper);
-  }
-
-  parseClassMemberWithIsStatic(classBody, member, state, isStatic, constructorAllowsSuper) {
-    this.tsParseModifiers(member, ["abstract", "readonly", "declare"]);
-    const idx = this.tsTryParseIndexSignature(member);
-
-    if (idx) {
-      classBody.body.push(idx);
-
-      if (member.abstract) {
-        this.raise(member.start, TSErrors.IndexSignatureHasAbstract);
-      }
-
-      if (isStatic) {
-        this.raise(member.start, TSErrors.IndexSignatureHasStatic);
-      }
-
-      if (member.accessibility) {
-        this.raise(member.start, TSErrors.IndexSignatureHasAccessibility, member.accessibility);
-      }
-
-      return;
-    }
-
-    super.parseClassMemberWithIsStatic(classBody, member, state, isStatic, constructorAllowsSuper);
-  }
-
-  parsePostMemberNameModifiers(methodOrProp) {
-    const optional = this.eat(types.question);
-    if (optional) methodOrProp.optional = true;
-
-    if (methodOrProp.readonly && this.match(types.parenL)) {
-      this.raise(methodOrProp.start, TSErrors.ClassMethodHasReadonly);
-    }
-
-    if (methodOrProp.declare && this.match(types.parenL)) {
-      this.raise(methodOrProp.start, TSErrors.ClassMethodHasDeclare);
-    }
-  }
-
-  parseExpressionStatement(node, expr) {
-    const decl = expr.type === "Identifier" ? this.tsParseExpressionStatement(node, expr) : undefined;
-    return decl || super.parseExpressionStatement(node, expr);
-  }
-
-  shouldParseExportDeclaration() {
-    if (this.tsIsDeclarationStart()) return true;
-    return super.shouldParseExportDeclaration();
-  }
-
-  parseConditional(expr, noIn, startPos, startLoc, refNeedsArrowPos) {
-    if (!refNeedsArrowPos || !this.match(types.question)) {
-      return super.parseConditional(expr, noIn, startPos, startLoc, refNeedsArrowPos);
-    }
-
-    const result = this.tryParse(() => super.parseConditional(expr, noIn, startPos, startLoc));
-
-    if (!result.node) {
-      refNeedsArrowPos.start = result.error.pos || this.state.start;
-      return expr;
-    }
-
-    if (result.error) this.state = result.failState;
-    return result.node;
-  }
-
-  parseParenItem(node, startPos, startLoc) {
-    node = super.parseParenItem(node, startPos, startLoc);
-
-    if (this.eat(types.question)) {
-      node.optional = true;
-      this.resetEndLocation(node);
-    }
-
-    if (this.match(types.colon)) {
-      const typeCastNode = this.startNodeAt(startPos, startLoc);
-      typeCastNode.expression = node;
-      typeCastNode.typeAnnotation = this.tsParseTypeAnnotation();
-      return this.finishNode(typeCastNode, "TSTypeCastExpression");
-    }
-
-    return node;
-  }
-
-  parseExportDeclaration(node) {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    const isDeclare = this.eatContextual("declare");
-    let declaration;
-
-    if (this.match(types.name)) {
-      declaration = this.tsTryParseExportDeclaration();
-    }
-
-    if (!declaration) {
-      declaration = super.parseExportDeclaration(node);
-    }
-
-    if (declaration && (declaration.type === "TSInterfaceDeclaration" || declaration.type === "TSTypeAliasDeclaration" || isDeclare)) {
-      node.exportKind = "type";
-    }
-
-    if (declaration && isDeclare) {
-      this.resetStartLocation(declaration, startPos, startLoc);
-      declaration.declare = true;
-    }
-
-    return declaration;
-  }
-
-  parseClassId(node, isStatement, optionalId) {
-    if ((!isStatement || optionalId) && this.isContextual("implements")) {
-      return;
-    }
-
-    super.parseClassId(node, isStatement, optionalId, node.declare ? BIND_TS_AMBIENT : BIND_CLASS);
-    const typeParameters = this.tsTryParseTypeParameters();
-    if (typeParameters) node.typeParameters = typeParameters;
-  }
-
-  parseClassPropertyAnnotation(node) {
-    if (!node.optional && this.eat(types.bang)) {
-      node.definite = true;
-    }
-
-    const type = this.tsTryParseTypeAnnotation();
-    if (type) node.typeAnnotation = type;
-  }
-
-  parseClassProperty(node) {
-    this.parseClassPropertyAnnotation(node);
-
-    if (node.declare && this.match(types.equal)) {
-      this.raise(this.state.start, TSErrors.DeclareClassFieldHasInitializer);
-    }
-
-    return super.parseClassProperty(node);
-  }
-
-  parseClassPrivateProperty(node) {
-    if (node.abstract) {
-      this.raise(node.start, TSErrors.PrivateElementHasAbstract);
-    }
-
-    if (node.accessibility) {
-      this.raise(node.start, TSErrors.PrivateElementHasAccessibility, node.accessibility);
-    }
-
-    this.parseClassPropertyAnnotation(node);
-    return super.parseClassPrivateProperty(node);
-  }
-
-  pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper) {
-    const typeParameters = this.tsTryParseTypeParameters();
-    if (typeParameters) method.typeParameters = typeParameters;
-    super.pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper);
-  }
-
-  pushClassPrivateMethod(classBody, method, isGenerator, isAsync) {
-    const typeParameters = this.tsTryParseTypeParameters();
-    if (typeParameters) method.typeParameters = typeParameters;
-    super.pushClassPrivateMethod(classBody, method, isGenerator, isAsync);
-  }
-
-  parseClassSuper(node) {
-    super.parseClassSuper(node);
-
-    if (node.superClass && this.isRelational("<")) {
-      node.superTypeParameters = this.tsParseTypeArguments();
-    }
-
-    if (this.eatContextual("implements")) {
-      node.implements = this.tsParseHeritageClause("implements");
-    }
-  }
-
-  parseObjPropValue(prop, ...args) {
-    const typeParameters = this.tsTryParseTypeParameters();
-    if (typeParameters) prop.typeParameters = typeParameters;
-    super.parseObjPropValue(prop, ...args);
-  }
-
-  parseFunctionParams(node, allowModifiers) {
-    const typeParameters = this.tsTryParseTypeParameters();
-    if (typeParameters) node.typeParameters = typeParameters;
-    super.parseFunctionParams(node, allowModifiers);
-  }
-
-  parseVarId(decl, kind) {
-    super.parseVarId(decl, kind);
-
-    if (decl.id.type === "Identifier" && this.eat(types.bang)) {
-      decl.definite = true;
-    }
-
-    const type = this.tsTryParseTypeAnnotation();
-
-    if (type) {
-      decl.id.typeAnnotation = type;
-      this.resetEndLocation(decl.id);
-    }
-  }
-
-  parseAsyncArrowFromCallExpression(node, call) {
-    if (this.match(types.colon)) {
-      node.returnType = this.tsParseTypeAnnotation();
-    }
-
-    return super.parseAsyncArrowFromCallExpression(node, call);
-  }
-
-  parseMaybeAssign(...args) {
-    let state;
-    let jsx;
-    let typeCast;
-
-    if (this.match(types.jsxTagStart)) {
-      state = this.state.clone();
-      jsx = this.tryParse(() => super.parseMaybeAssign(...args), state);
-      if (!jsx.error) return jsx.node;
-      const {
-        context
-      } = this.state;
-
-      if (context[context.length - 1] === types$1.j_oTag) {
-        context.length -= 2;
-      } else if (context[context.length - 1] === types$1.j_expr) {
-        context.length -= 1;
-      }
-    }
-
-    if (!(jsx && jsx.error) && !this.isRelational("<")) {
-      return super.parseMaybeAssign(...args);
-    }
-
-    let typeParameters;
-    state = state || this.state.clone();
-    const arrow = this.tryParse(abort => {
-      typeParameters = this.tsParseTypeParameters();
-      const expr = super.parseMaybeAssign(...args);
-
-      if (expr.type !== "ArrowFunctionExpression" || expr.extra && expr.extra.parenthesized) {
-        abort();
-      }
-
-      if (typeParameters && typeParameters.params.length !== 0) {
-        this.resetStartLocationFromNode(expr, typeParameters);
-      }
-
-      expr.typeParameters = typeParameters;
-      return expr;
-    }, state);
-    if (!arrow.error && !arrow.aborted) return arrow.node;
-
-    if (!jsx) {
-      assert(!this.hasPlugin("jsx"));
-      typeCast = this.tryParse(() => super.parseMaybeAssign(...args), state);
-      if (!typeCast.error) return typeCast.node;
-    }
-
-    if (jsx && jsx.node) {
-      this.state = jsx.failState;
-      return jsx.node;
-    }
-
-    if (arrow.node) {
-      this.state = arrow.failState;
-      return arrow.node;
-    }
-
-    if (typeCast && typeCast.node) {
-      this.state = typeCast.failState;
-      return typeCast.node;
-    }
-
-    if (jsx && jsx.thrown) throw jsx.error;
-    if (arrow.thrown) throw arrow.error;
-    if (typeCast && typeCast.thrown) throw typeCast.error;
-    throw jsx && jsx.error || arrow.error || typeCast && typeCast.error;
-  }
-
-  parseMaybeUnary(refExpressionErrors) {
-    if (!this.hasPlugin("jsx") && this.isRelational("<")) {
-      return this.tsParseTypeAssertion();
-    } else {
-      return super.parseMaybeUnary(refExpressionErrors);
-    }
-  }
-
-  parseArrow(node) {
-    if (this.match(types.colon)) {
-      const result = this.tryParse(abort => {
-        const returnType = this.tsParseTypeOrTypePredicateAnnotation(types.colon);
-        if (this.canInsertSemicolon() || !this.match(types.arrow)) abort();
-        return returnType;
-      });
-      if (result.aborted) return;
-
-      if (!result.thrown) {
-        if (result.error) this.state = result.failState;
-        node.returnType = result.node;
-      }
-    }
-
-    return super.parseArrow(node);
-  }
-
-  parseAssignableListItemTypes(param) {
-    if (this.eat(types.question)) {
-      if (param.type !== "Identifier") {
-        this.raise(param.start, TSErrors.PatternIsOptional);
-      }
-
-      param.optional = true;
-    }
-
-    const type = this.tsTryParseTypeAnnotation();
-    if (type) param.typeAnnotation = type;
-    this.resetEndLocation(param);
-    return param;
-  }
-
-  toAssignable(node) {
-    switch (node.type) {
-      case "TSTypeCastExpression":
-        return super.toAssignable(this.typeCastToParameter(node));
-
-      case "TSParameterProperty":
-        return super.toAssignable(node);
-
-      case "TSAsExpression":
-      case "TSNonNullExpression":
-      case "TSTypeAssertion":
-        node.expression = this.toAssignable(node.expression);
-        return node;
-
-      default:
-        return super.toAssignable(node);
-    }
-  }
-
-  checkLVal(expr, bindingType = BIND_NONE, checkClashes, contextDescription) {
-    switch (expr.type) {
-      case "TSTypeCastExpression":
-        return;
-
-      case "TSParameterProperty":
-        this.checkLVal(expr.parameter, bindingType, checkClashes, "parameter property");
-        return;
-
-      case "TSAsExpression":
-      case "TSNonNullExpression":
-      case "TSTypeAssertion":
-        this.checkLVal(expr.expression, bindingType, checkClashes, contextDescription);
-        return;
-
-      default:
-        super.checkLVal(expr, bindingType, checkClashes, contextDescription);
-        return;
-    }
-  }
-
-  parseBindingAtom() {
-    switch (this.state.type) {
-      case types._this:
-        return this.parseIdentifier(true);
-
-      default:
-        return super.parseBindingAtom();
-    }
-  }
-
-  parseMaybeDecoratorArguments(expr) {
-    if (this.isRelational("<")) {
-      const typeArguments = this.tsParseTypeArguments();
-
-      if (this.match(types.parenL)) {
-        const call = super.parseMaybeDecoratorArguments(expr);
-        call.typeParameters = typeArguments;
-        return call;
-      }
-
-      this.unexpected(this.state.start, types.parenL);
-    }
-
-    return super.parseMaybeDecoratorArguments(expr);
-  }
-
-  isClassMethod() {
-    return this.isRelational("<") || super.isClassMethod();
-  }
-
-  isClassProperty() {
-    return this.match(types.bang) || this.match(types.colon) || super.isClassProperty();
-  }
-
-  parseMaybeDefault(...args) {
-    const node = super.parseMaybeDefault(...args);
-
-    if (node.type === "AssignmentPattern" && node.typeAnnotation && node.right.start < node.typeAnnotation.start) {
-      this.raise(node.typeAnnotation.start, TSErrors.TypeAnnotationAfterAssign);
-    }
-
-    return node;
-  }
-
-  getTokenFromCode(code) {
-    if (this.state.inType && (code === 62 || code === 60)) {
-      return this.finishOp(types.relational, 1);
-    } else {
-      return super.getTokenFromCode(code);
-    }
-  }
-
-  toAssignableList(exprList) {
-    for (let i = 0; i < exprList.length; i++) {
-      const expr = exprList[i];
-      if (!expr) continue;
-
-      switch (expr.type) {
-        case "TSTypeCastExpression":
-          exprList[i] = this.typeCastToParameter(expr);
-          break;
-
-        case "TSAsExpression":
-        case "TSTypeAssertion":
-          if (!this.state.maybeInArrowParameters) {
-            exprList[i] = this.typeCastToParameter(expr);
-          } else {
-            this.raise(expr.start, TSErrors.UnexpectedTypeCastInParameter);
-          }
-
-          break;
-      }
-    }
-
-    return super.toAssignableList(...arguments);
-  }
-
-  typeCastToParameter(node) {
-    node.expression.typeAnnotation = node.typeAnnotation;
-    this.resetEndLocation(node.expression, node.typeAnnotation.end, node.typeAnnotation.loc.end);
-    return node.expression;
-  }
-
-  toReferencedList(exprList, isInParens) {
-    for (let i = 0; i < exprList.length; i++) {
-      const expr = exprList[i];
-
-      if (expr && expr.type === "TSTypeCastExpression") {
-        this.raise(expr.start, TSErrors.UnexpectedTypeAnnotation);
-      }
-    }
-
-    return exprList;
-  }
-
-  shouldParseArrow() {
-    return this.match(types.colon) || super.shouldParseArrow();
-  }
-
-  shouldParseAsyncArrow() {
-    return this.match(types.colon) || super.shouldParseAsyncArrow();
-  }
-
-  canHaveLeadingDecorator() {
-    return super.canHaveLeadingDecorator() || this.isAbstractClass();
-  }
-
-  jsxParseOpeningElementAfterName(node) {
-    if (this.isRelational("<")) {
-      const typeArguments = this.tsTryParseAndCatch(() => this.tsParseTypeArguments());
-      if (typeArguments) node.typeParameters = typeArguments;
-    }
-
-    return super.jsxParseOpeningElementAfterName(node);
-  }
-
-  getGetterSetterExpectedParamCount(method) {
-    const baseCount = super.getGetterSetterExpectedParamCount(method);
-    const firstParam = method.params[0];
-    const hasContextParam = firstParam && firstParam.type === "Identifier" && firstParam.name === "this";
-    return hasContextParam ? baseCount + 1 : baseCount;
-  }
-
-});
-
-types.placeholder = new TokenType("%%", {
-  startsExpr: true
-});
-var placeholders = (superClass => class extends superClass {
-  parsePlaceholder(expectedNode) {
-    if (this.match(types.placeholder)) {
-      const node = this.startNode();
-      this.next();
-      this.assertNoSpace("Unexpected space in placeholder.");
-      node.name = super.parseIdentifier(true);
-      this.assertNoSpace("Unexpected space in placeholder.");
-      this.expect(types.placeholder);
-      return this.finishPlaceholder(node, expectedNode);
-    }
-  }
-
-  finishPlaceholder(node, expectedNode) {
-    const isFinished = !!(node.expectedNode && node.type === "Placeholder");
-    node.expectedNode = expectedNode;
-    return isFinished ? node : this.finishNode(node, "Placeholder");
-  }
-
-  getTokenFromCode(code) {
-    if (code === 37 && this.input.charCodeAt(this.state.pos + 1) === 37) {
-      return this.finishOp(types.placeholder, 2);
-    }
-
-    return super.getTokenFromCode(...arguments);
-  }
-
-  parseExprAtom() {
-    return this.parsePlaceholder("Expression") || super.parseExprAtom(...arguments);
-  }
-
-  parseIdentifier() {
-    return this.parsePlaceholder("Identifier") || super.parseIdentifier(...arguments);
-  }
-
-  checkReservedWord(word) {
-    if (word !== undefined) super.checkReservedWord(...arguments);
-  }
-
-  parseBindingAtom() {
-    return this.parsePlaceholder("Pattern") || super.parseBindingAtom(...arguments);
-  }
-
-  checkLVal(expr) {
-    if (expr.type !== "Placeholder") super.checkLVal(...arguments);
-  }
-
-  toAssignable(node) {
-    if (node && node.type === "Placeholder" && node.expectedNode === "Expression") {
-      node.expectedNode = "Pattern";
-      return node;
-    }
-
-    return super.toAssignable(...arguments);
-  }
-
-  verifyBreakContinue(node) {
-    if (node.label && node.label.type === "Placeholder") return;
-    super.verifyBreakContinue(...arguments);
-  }
-
-  parseExpressionStatement(node, expr) {
-    if (expr.type !== "Placeholder" || expr.extra && expr.extra.parenthesized) {
-      return super.parseExpressionStatement(...arguments);
-    }
-
-    if (this.match(types.colon)) {
-      const stmt = node;
-      stmt.label = this.finishPlaceholder(expr, "Identifier");
-      this.next();
-      stmt.body = this.parseStatement("label");
-      return this.finishNode(stmt, "LabeledStatement");
-    }
-
-    this.semicolon();
-    node.name = expr.name;
-    return this.finishPlaceholder(node, "Statement");
-  }
-
-  parseBlock() {
-    return this.parsePlaceholder("BlockStatement") || super.parseBlock(...arguments);
-  }
-
-  parseFunctionId() {
-    return this.parsePlaceholder("Identifier") || super.parseFunctionId(...arguments);
-  }
-
-  parseClass(node, isStatement, optionalId) {
-    const type = isStatement ? "ClassDeclaration" : "ClassExpression";
-    this.next();
-    this.takeDecorators(node);
-    const placeholder = this.parsePlaceholder("Identifier");
-
-    if (placeholder) {
-      if (this.match(types._extends) || this.match(types.placeholder) || this.match(types.braceL)) {
-        node.id = placeholder;
-      } else if (optionalId || !isStatement) {
-        node.id = null;
-        node.body = this.finishPlaceholder(placeholder, "ClassBody");
-        return this.finishNode(node, type);
-      } else {
-        this.unexpected(null, "A class name is required");
-      }
-    } else {
-      this.parseClassId(node, isStatement, optionalId);
-    }
-
-    this.parseClassSuper(node);
-    node.body = this.parsePlaceholder("ClassBody") || this.parseClassBody(!!node.superClass);
-    return this.finishNode(node, type);
-  }
-
-  parseExport(node) {
-    const placeholder = this.parsePlaceholder("Identifier");
-    if (!placeholder) return super.parseExport(...arguments);
-
-    if (!this.isContextual("from") && !this.match(types.comma)) {
-      node.specifiers = [];
-      node.source = null;
-      node.declaration = this.finishPlaceholder(placeholder, "Declaration");
-      return this.finishNode(node, "ExportNamedDeclaration");
-    }
-
-    this.expectPlugin("exportDefaultFrom");
-    const specifier = this.startNode();
-    specifier.exported = placeholder;
-    node.specifiers = [this.finishNode(specifier, "ExportDefaultSpecifier")];
-    return super.parseExport(node);
-  }
-
-  maybeParseExportDefaultSpecifier(node) {
-    if (node.specifiers && node.specifiers.length > 0) {
-      return true;
-    }
-
-    return super.maybeParseExportDefaultSpecifier(...arguments);
-  }
-
-  checkExport(node) {
-    const {
-      specifiers
-    } = node;
-
-    if (specifiers && specifiers.length) {
-      node.specifiers = specifiers.filter(node => node.exported.type === "Placeholder");
-    }
-
-    super.checkExport(node);
-    node.specifiers = specifiers;
-  }
-
-  parseImport(node) {
-    const placeholder = this.parsePlaceholder("Identifier");
-    if (!placeholder) return super.parseImport(...arguments);
-    node.specifiers = [];
-
-    if (!this.isContextual("from") && !this.match(types.comma)) {
-      node.source = this.finishPlaceholder(placeholder, "StringLiteral");
-      this.semicolon();
-      return this.finishNode(node, "ImportDeclaration");
-    }
-
-    const specifier = this.startNodeAtNode(placeholder);
-    specifier.local = placeholder;
-    this.finishNode(specifier, "ImportDefaultSpecifier");
-    node.specifiers.push(specifier);
-
-    if (this.eat(types.comma)) {
-      const hasStarImport = this.maybeParseStarImportSpecifier(node);
-      if (!hasStarImport) this.parseNamedImportSpecifiers(node);
-    }
-
-    this.expectContextual("from");
-    node.source = this.parseImportSource();
-    this.semicolon();
-    return this.finishNode(node, "ImportDeclaration");
-  }
-
-  parseImportSource() {
-    return this.parsePlaceholder("StringLiteral") || super.parseImportSource(...arguments);
-  }
-
-});
-
-var v8intrinsic = (superClass => class extends superClass {
-  parseV8Intrinsic() {
-    if (this.match(types.modulo)) {
-      const v8IntrinsicStart = this.state.start;
-      const node = this.startNode();
-      this.eat(types.modulo);
-
-      if (this.match(types.name)) {
-        const name = this.parseIdentifierName(this.state.start);
-        const identifier = this.createIdentifier(node, name);
-        identifier.type = "V8IntrinsicIdentifier";
-
-        if (this.match(types.parenL)) {
-          return identifier;
-        }
-      }
-
-      this.unexpected(v8IntrinsicStart);
-    }
-  }
-
-  parseExprAtom() {
-    return this.parseV8Intrinsic() || super.parseExprAtom(...arguments);
-  }
-
-});
-
-function hasPlugin(plugins, name) {
-  return plugins.some(plugin => {
-    if (Array.isArray(plugin)) {
-      return plugin[0] === name;
-    } else {
-      return plugin === name;
-    }
-  });
-}
-function getPluginOption(plugins, name, option) {
-  const plugin = plugins.find(plugin => {
-    if (Array.isArray(plugin)) {
-      return plugin[0] === name;
-    } else {
-      return plugin === name;
-    }
-  });
-
-  if (plugin && Array.isArray(plugin)) {
-    return plugin[1][option];
-  }
-
-  return null;
-}
-const PIPELINE_PROPOSALS = ["minimal", "smart", "fsharp"];
-const RECORD_AND_TUPLE_SYNTAX_TYPES = ["hash", "bar"];
-function validatePlugins(plugins) {
-  if (hasPlugin(plugins, "decorators")) {
-    if (hasPlugin(plugins, "decorators-legacy")) {
-      throw new Error("Cannot use the decorators and decorators-legacy plugin together");
-    }
-
-    const decoratorsBeforeExport = getPluginOption(plugins, "decorators", "decoratorsBeforeExport");
-
-    if (decoratorsBeforeExport == null) {
-      throw new Error("The 'decorators' plugin requires a 'decoratorsBeforeExport' option," + " whose value must be a boolean. If you are migrating from" + " Babylon/Babel 6 or want to use the old decorators proposal, you" + " should use the 'decorators-legacy' plugin instead of 'decorators'.");
-    } else if (typeof decoratorsBeforeExport !== "boolean") {
-      throw new Error("'decoratorsBeforeExport' must be a boolean.");
-    }
-  }
-
-  if (hasPlugin(plugins, "flow") && hasPlugin(plugins, "typescript")) {
-    throw new Error("Cannot combine flow and typescript plugins.");
-  }
-
-  if (hasPlugin(plugins, "placeholders") && hasPlugin(plugins, "v8intrinsic")) {
-    throw new Error("Cannot combine placeholders and v8intrinsic plugins.");
-  }
-
-  if (hasPlugin(plugins, "pipelineOperator") && !PIPELINE_PROPOSALS.includes(getPluginOption(plugins, "pipelineOperator", "proposal"))) {
-    throw new Error("'pipelineOperator' requires 'proposal' option whose value should be one of: " + PIPELINE_PROPOSALS.map(p => `'${p}'`).join(", "));
-  }
-
-  if (hasPlugin(plugins, "recordAndTuple") && !RECORD_AND_TUPLE_SYNTAX_TYPES.includes(getPluginOption(plugins, "recordAndTuple", "syntaxType"))) {
-    throw new Error("'recordAndTuple' requires 'syntaxType' option whose value should be one of: " + RECORD_AND_TUPLE_SYNTAX_TYPES.map(p => `'${p}'`).join(", "));
-  }
-}
-const mixinPlugins = {
-  estree,
-  jsx,
-  flow,
-  typescript,
-  v8intrinsic,
-  placeholders
-};
-const mixinPluginNames = Object.keys(mixinPlugins);
-
-const defaultOptions = {
-  sourceType: "script",
-  sourceFilename: undefined,
-  startLine: 1,
-  allowAwaitOutsideFunction: false,
-  allowReturnOutsideFunction: false,
-  allowImportExportEverywhere: false,
-  allowSuperOutsideMethod: false,
-  allowUndeclaredExports: false,
-  plugins: [],
-  strictMode: null,
-  ranges: false,
-  tokens: false,
-  createParenthesizedExpressions: false,
-  errorRecovery: false
-};
-function getOptions(opts) {
-  const options = {};
-
-  for (let _i = 0, _Object$keys = Object.keys(defaultOptions); _i < _Object$keys.length; _i++) {
-    const key = _Object$keys[_i];
-    options[key] = opts && opts[key] != null ? opts[key] : defaultOptions[key];
-  }
-
-  return options;
-}
-
-class State {
-  constructor() {
-    this.errors = [];
-    this.potentialArrowAt = -1;
-    this.noArrowAt = [];
-    this.noArrowParamsConversionAt = [];
-    this.inParameters = false;
-    this.maybeInArrowParameters = false;
-    this.maybeInAsyncArrowHead = false;
-    this.inPipeline = false;
-    this.inType = false;
-    this.noAnonFunctionType = false;
-    this.inPropertyName = false;
-    this.hasFlowComment = false;
-    this.isIterator = false;
-    this.topicContext = {
-      maxNumOfResolvableTopics: 0,
-      maxTopicIndex: null
-    };
-    this.soloAwait = false;
-    this.inFSharpPipelineDirectBody = false;
-    this.labels = [];
-    this.decoratorStack = [[]];
-    this.yieldPos = -1;
-    this.awaitPos = -1;
-    this.comments = [];
-    this.trailingComments = [];
-    this.leadingComments = [];
-    this.commentStack = [];
-    this.commentPreviousNode = null;
-    this.pos = 0;
-    this.lineStart = 0;
-    this.type = types.eof;
-    this.value = null;
-    this.start = 0;
-    this.end = 0;
-    this.lastTokEndLoc = null;
-    this.lastTokStartLoc = null;
-    this.lastTokStart = 0;
-    this.lastTokEnd = 0;
-    this.context = [types$1.braceStatement];
-    this.exprAllowed = true;
-    this.containsEsc = false;
-    this.octalPositions = [];
-    this.exportedIdentifiers = [];
-    this.tokensLength = 0;
-  }
-
-  init(options) {
-    this.strict = options.strictMode === false ? false : options.sourceType === "module";
-    this.curLine = options.startLine;
-    this.startLoc = this.endLoc = this.curPosition();
-  }
-
-  curPosition() {
-    return new Position(this.curLine, this.pos - this.lineStart);
-  }
-
-  clone(skipArrays) {
-    const state = new State();
-    const keys = Object.keys(this);
-
-    for (let i = 0, length = keys.length; i < length; i++) {
-      const key = keys[i];
-      let val = this[key];
-
-      if (!skipArrays && Array.isArray(val)) {
-        val = val.slice();
-      }
-
-      state[key] = val;
-    }
-
-    return state;
-  }
-
-}
-
-var _isDigit = function isDigit(code) {
-  return code >= 48 && code <= 57;
-};
-const VALID_REGEX_FLAGS = new Set(["g", "m", "s", "i", "y", "u"]);
-const forbiddenNumericSeparatorSiblings = {
-  decBinOct: [46, 66, 69, 79, 95, 98, 101, 111],
-  hex: [46, 88, 95, 120]
-};
-const allowedNumericSeparatorSiblings = {};
-allowedNumericSeparatorSiblings.bin = [48, 49];
-allowedNumericSeparatorSiblings.oct = [...allowedNumericSeparatorSiblings.bin, 50, 51, 52, 53, 54, 55];
-allowedNumericSeparatorSiblings.dec = [...allowedNumericSeparatorSiblings.oct, 56, 57];
-allowedNumericSeparatorSiblings.hex = [...allowedNumericSeparatorSiblings.dec, 65, 66, 67, 68, 69, 70, 97, 98, 99, 100, 101, 102];
-class Token {
-  constructor(state) {
-    this.type = state.type;
-    this.value = state.value;
-    this.start = state.start;
-    this.end = state.end;
-    this.loc = new SourceLocation(state.startLoc, state.endLoc);
-  }
-
-}
-class Tokenizer extends LocationParser {
-  constructor(options, input) {
-    super();
-    this.tokens = [];
-    this.state = new State();
-    this.state.init(options);
-    this.input = input;
-    this.length = input.length;
-    this.isLookahead = false;
-  }
-
-  pushToken(token) {
-    this.tokens.length = this.state.tokensLength;
-    this.tokens.push(token);
-    ++this.state.tokensLength;
-  }
-
-  next() {
-    if (!this.isLookahead) {
-      this.checkKeywordEscapes();
-
-      if (this.options.tokens) {
-        this.pushToken(new Token(this.state));
-      }
-    }
-
-    this.state.lastTokEnd = this.state.end;
-    this.state.lastTokStart = this.state.start;
-    this.state.lastTokEndLoc = this.state.endLoc;
-    this.state.lastTokStartLoc = this.state.startLoc;
-    this.nextToken();
-  }
-
-  eat(type) {
-    if (this.match(type)) {
-      this.next();
-      return true;
-    } else {
-      return false;
-    }
-  }
-
-  match(type) {
-    return this.state.type === type;
-  }
-
-  lookahead() {
-    const old = this.state;
-    this.state = old.clone(true);
-    this.isLookahead = true;
-    this.next();
-    this.isLookahead = false;
-    const curr = this.state;
-    this.state = old;
-    return curr;
-  }
-
-  nextTokenStart() {
-    const thisTokEnd = this.state.pos;
-    skipWhiteSpace.lastIndex = thisTokEnd;
-    const skip = skipWhiteSpace.exec(this.input);
-    return thisTokEnd + skip[0].length;
-  }
-
-  lookaheadCharCode() {
-    return this.input.charCodeAt(this.nextTokenStart());
-  }
-
-  setStrict(strict) {
-    this.state.strict = strict;
-    if (!this.match(types.num) && !this.match(types.string)) return;
-    this.state.pos = this.state.start;
-
-    while (this.state.pos < this.state.lineStart) {
-      this.state.lineStart = this.input.lastIndexOf("\n", this.state.lineStart - 2) + 1;
-      --this.state.curLine;
-    }
-
-    this.nextToken();
-  }
-
-  curContext() {
-    return this.state.context[this.state.context.length - 1];
-  }
-
-  nextToken() {
-    const curContext = this.curContext();
-    if (!curContext || !curContext.preserveSpace) this.skipSpace();
-    this.state.octalPositions = [];
-    this.state.start = this.state.pos;
-    this.state.startLoc = this.state.curPosition();
-
-    if (this.state.pos >= this.length) {
-      this.finishToken(types.eof);
-      return;
-    }
-
-    const override = curContext == null ? void 0 : curContext.override;
-
-    if (override) {
-      override(this);
-    } else {
-      this.getTokenFromCode(this.input.codePointAt(this.state.pos));
-    }
-  }
-
-  pushComment(block, text, start, end, startLoc, endLoc) {
-    const comment = {
-      type: block ? "CommentBlock" : "CommentLine",
-      value: text,
-      start: start,
-      end: end,
-      loc: new SourceLocation(startLoc, endLoc)
-    };
-    if (this.options.tokens) this.pushToken(comment);
-    this.state.comments.push(comment);
-    this.addComment(comment);
-  }
-
-  skipBlockComment() {
-    const startLoc = this.state.curPosition();
-    const start = this.state.pos;
-    const end = this.input.indexOf("*/", this.state.pos + 2);
-    if (end === -1) throw this.raise(start, Errors.UnterminatedComment);
-    this.state.pos = end + 2;
-    lineBreakG.lastIndex = start;
-    let match;
-
-    while ((match = lineBreakG.exec(this.input)) && match.index < this.state.pos) {
-      ++this.state.curLine;
-      this.state.lineStart = match.index + match[0].length;
-    }
-
-    if (this.isLookahead) return;
-    this.pushComment(true, this.input.slice(start + 2, end), start, this.state.pos, startLoc, this.state.curPosition());
-  }
-
-  skipLineComment(startSkip) {
-    const start = this.state.pos;
-    const startLoc = this.state.curPosition();
-    let ch = this.input.charCodeAt(this.state.pos += startSkip);
-
-    if (this.state.pos < this.length) {
-      while (!isNewLine(ch) && ++this.state.pos < this.length) {
-        ch = this.input.charCodeAt(this.state.pos);
-      }
-    }
-
-    if (this.isLookahead) return;
-    this.pushComment(false, this.input.slice(start + startSkip, this.state.pos), start, this.state.pos, startLoc, this.state.curPosition());
-  }
-
-  skipSpace() {
-    loop: while (this.state.pos < this.length) {
-      const ch = this.input.charCodeAt(this.state.pos);
-
-      switch (ch) {
-        case 32:
-        case 160:
-        case 9:
-          ++this.state.pos;
-          break;
-
-        case 13:
-          if (this.input.charCodeAt(this.state.pos + 1) === 10) {
-            ++this.state.pos;
-          }
-
-        case 10:
-        case 8232:
-        case 8233:
-          ++this.state.pos;
-          ++this.state.curLine;
-          this.state.lineStart = this.state.pos;
-          break;
-
-        case 47:
-          switch (this.input.charCodeAt(this.state.pos + 1)) {
-            case 42:
-              this.skipBlockComment();
-              break;
-
-            case 47:
-              this.skipLineComment(2);
-              break;
-
-            default:
-              break loop;
-          }
-
-          break;
-
-        default:
-          if (isWhitespace(ch)) {
-            ++this.state.pos;
-          } else {
-            break loop;
-          }
-
-      }
-    }
-  }
-
-  finishToken(type, val) {
-    this.state.end = this.state.pos;
-    this.state.endLoc = this.state.curPosition();
-    const prevType = this.state.type;
-    this.state.type = type;
-    this.state.value = val;
-    if (!this.isLookahead) this.updateContext(prevType);
-  }
-
-  readToken_numberSign() {
-    if (this.state.pos === 0 && this.readToken_interpreter()) {
-      return;
-    }
-
-    const nextPos = this.state.pos + 1;
-    const next = this.input.charCodeAt(nextPos);
-
-    if (next >= 48 && next <= 57) {
-      throw this.raise(this.state.pos, Errors.UnexpectedDigitAfterHash);
-    }
-
-    if (this.hasPlugin("recordAndTuple") && (next === 123 || next === 91)) {
-      if (this.getPluginOption("recordAndTuple", "syntaxType") !== "hash") {
-        throw this.raise(this.state.pos, next === 123 ? Errors.RecordExpressionHashIncorrectStartSyntaxType : Errors.TupleExpressionHashIncorrectStartSyntaxType);
-      }
-
-      if (next === 123) {
-        this.finishToken(types.braceHashL);
-      } else {
-        this.finishToken(types.bracketHashL);
-      }
-
-      this.state.pos += 2;
-    } else if (this.hasPlugin("classPrivateProperties") || this.hasPlugin("classPrivateMethods") || this.getPluginOption("pipelineOperator", "proposal") === "smart") {
-      this.finishOp(types.hash, 1);
-    } else {
-      throw this.raise(this.state.pos, Errors.InvalidOrUnexpectedToken, "#");
-    }
-  }
-
-  readToken_dot() {
-    const next = this.input.charCodeAt(this.state.pos + 1);
-
-    if (next >= 48 && next <= 57) {
-      this.readNumber(true);
-      return;
-    }
-
-    if (next === 46 && this.input.charCodeAt(this.state.pos + 2) === 46) {
-      this.state.pos += 3;
-      this.finishToken(types.ellipsis);
-    } else {
-      ++this.state.pos;
-      this.finishToken(types.dot);
-    }
-  }
-
-  readToken_slash() {
-    if (this.state.exprAllowed && !this.state.inType) {
-      ++this.state.pos;
-      this.readRegexp();
-      return;
-    }
-
-    const next = this.input.charCodeAt(this.state.pos + 1);
-
-    if (next === 61) {
-      this.finishOp(types.assign, 2);
-    } else {
-      this.finishOp(types.slash, 1);
-    }
-  }
-
-  readToken_interpreter() {
-    if (this.state.pos !== 0 || this.length < 2) return false;
-    let ch = this.input.charCodeAt(this.state.pos + 1);
-    if (ch !== 33) return false;
-    const start = this.state.pos;
-    this.state.pos += 1;
-
-    while (!isNewLine(ch) && ++this.state.pos < this.length) {
-      ch = this.input.charCodeAt(this.state.pos);
-    }
-
-    const value = this.input.slice(start + 2, this.state.pos);
-    this.finishToken(types.interpreterDirective, value);
-    return true;
-  }
-
-  readToken_mult_modulo(code) {
-    let type = code === 42 ? types.star : types.modulo;
-    let width = 1;
-    let next = this.input.charCodeAt(this.state.pos + 1);
-    const exprAllowed = this.state.exprAllowed;
-
-    if (code === 42 && next === 42) {
-      width++;
-      next = this.input.charCodeAt(this.state.pos + 2);
-      type = types.exponent;
-    }
-
-    if (next === 61 && !exprAllowed) {
-      width++;
-      type = types.assign;
-    }
-
-    this.finishOp(type, width);
-  }
-
-  readToken_pipe_amp(code) {
-    const next = this.input.charCodeAt(this.state.pos + 1);
-
-    if (next === code) {
-      if (this.input.charCodeAt(this.state.pos + 2) === 61) {
-        this.finishOp(types.assign, 3);
-      } else {
-        this.finishOp(code === 124 ? types.logicalOR : types.logicalAND, 2);
-      }
-
-      return;
-    }
-
-    if (code === 124) {
-      if (next === 62) {
-        this.finishOp(types.pipeline, 2);
-        return;
-      }
-
-      if (this.hasPlugin("recordAndTuple") && next === 125) {
-        if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") {
-          throw this.raise(this.state.pos, Errors.RecordExpressionBarIncorrectEndSyntaxType);
-        }
-
-        this.finishOp(types.braceBarR, 2);
-        return;
-      }
-
-      if (this.hasPlugin("recordAndTuple") && next === 93) {
-        if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") {
-          throw this.raise(this.state.pos, Errors.TupleExpressionBarIncorrectEndSyntaxType);
-        }
-
-        this.finishOp(types.bracketBarR, 2);
-        return;
-      }
-    }
-
-    if (next === 61) {
-      this.finishOp(types.assign, 2);
-      return;
-    }
-
-    this.finishOp(code === 124 ? types.bitwiseOR : types.bitwiseAND, 1);
-  }
-
-  readToken_caret() {
-    const next = this.input.charCodeAt(this.state.pos + 1);
-
-    if (next === 61) {
-      this.finishOp(types.assign, 2);
-    } else {
-      this.finishOp(types.bitwiseXOR, 1);
-    }
-  }
-
-  readToken_plus_min(code) {
-    const next = this.input.charCodeAt(this.state.pos + 1);
-
-    if (next === code) {
-      if (next === 45 && !this.inModule && this.input.charCodeAt(this.state.pos + 2) === 62 && (this.state.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.pos)))) {
-        this.skipLineComment(3);
-        this.skipSpace();
-        this.nextToken();
-        return;
-      }
-
-      this.finishOp(types.incDec, 2);
-      return;
-    }
-
-    if (next === 61) {
-      this.finishOp(types.assign, 2);
-    } else {
-      this.finishOp(types.plusMin, 1);
-    }
-  }
-
-  readToken_lt_gt(code) {
-    const next = this.input.charCodeAt(this.state.pos + 1);
-    let size = 1;
-
-    if (next === code) {
-      size = code === 62 && this.input.charCodeAt(this.state.pos + 2) === 62 ? 3 : 2;
-
-      if (this.input.charCodeAt(this.state.pos + size) === 61) {
-        this.finishOp(types.assign, size + 1);
-        return;
-      }
-
-      this.finishOp(types.bitShift, size);
-      return;
-    }
-
-    if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.state.pos + 2) === 45 && this.input.charCodeAt(this.state.pos + 3) === 45) {
-      this.skipLineComment(4);
-      this.skipSpace();
-      this.nextToken();
-      return;
-    }
-
-    if (next === 61) {
-      size = 2;
-    }
-
-    this.finishOp(types.relational, size);
-  }
-
-  readToken_eq_excl(code) {
-    const next = this.input.charCodeAt(this.state.pos + 1);
-
-    if (next === 61) {
-      this.finishOp(types.equality, this.input.charCodeAt(this.state.pos + 2) === 61 ? 3 : 2);
-      return;
-    }
-
-    if (code === 61 && next === 62) {
-      this.state.pos += 2;
-      this.finishToken(types.arrow);
-      return;
-    }
-
-    this.finishOp(code === 61 ? types.eq : types.bang, 1);
-  }
-
-  readToken_question() {
-    const next = this.input.charCodeAt(this.state.pos + 1);
-    const next2 = this.input.charCodeAt(this.state.pos + 2);
-
-    if (next === 63 && !this.state.inType) {
-      if (next2 === 61) {
-        this.finishOp(types.assign, 3);
-      } else {
-        this.finishOp(types.nullishCoalescing, 2);
-      }
-    } else if (next === 46 && !(next2 >= 48 && next2 <= 57)) {
-      this.state.pos += 2;
-      this.finishToken(types.questionDot);
-    } else {
-      ++this.state.pos;
-      this.finishToken(types.question);
-    }
-  }
-
-  getTokenFromCode(code) {
-    switch (code) {
-      case 46:
-        this.readToken_dot();
-        return;
-
-      case 40:
-        ++this.state.pos;
-        this.finishToken(types.parenL);
-        return;
-
-      case 41:
-        ++this.state.pos;
-        this.finishToken(types.parenR);
-        return;
-
-      case 59:
-        ++this.state.pos;
-        this.finishToken(types.semi);
-        return;
-
-      case 44:
-        ++this.state.pos;
-        this.finishToken(types.comma);
-        return;
-
-      case 91:
-        if (this.hasPlugin("recordAndTuple") && this.input.charCodeAt(this.state.pos + 1) === 124) {
-          if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") {
-            throw this.raise(this.state.pos, Errors.TupleExpressionBarIncorrectStartSyntaxType);
-          }
-
-          this.finishToken(types.bracketBarL);
-          this.state.pos += 2;
-        } else {
-          ++this.state.pos;
-          this.finishToken(types.bracketL);
-        }
-
-        return;
-
-      case 93:
-        ++this.state.pos;
-        this.finishToken(types.bracketR);
-        return;
-
-      case 123:
-        if (this.hasPlugin("recordAndTuple") && this.input.charCodeAt(this.state.pos + 1) === 124) {
-          if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") {
-            throw this.raise(this.state.pos, Errors.RecordExpressionBarIncorrectStartSyntaxType);
-          }
-
-          this.finishToken(types.braceBarL);
-          this.state.pos += 2;
-        } else {
-          ++this.state.pos;
-          this.finishToken(types.braceL);
-        }
-
-        return;
-
-      case 125:
-        ++this.state.pos;
-        this.finishToken(types.braceR);
-        return;
-
-      case 58:
-        if (this.hasPlugin("functionBind") && this.input.charCodeAt(this.state.pos + 1) === 58) {
-          this.finishOp(types.doubleColon, 2);
-        } else {
-          ++this.state.pos;
-          this.finishToken(types.colon);
-        }
-
-        return;
-
-      case 63:
-        this.readToken_question();
-        return;
-
-      case 96:
-        ++this.state.pos;
-        this.finishToken(types.backQuote);
-        return;
-
-      case 48:
-        {
-          const next = this.input.charCodeAt(this.state.pos + 1);
-
-          if (next === 120 || next === 88) {
-            this.readRadixNumber(16);
-            return;
-          }
-
-          if (next === 111 || next === 79) {
-            this.readRadixNumber(8);
-            return;
-          }
-
-          if (next === 98 || next === 66) {
-            this.readRadixNumber(2);
-            return;
-          }
-        }
-
-      case 49:
-      case 50:
-      case 51:
-      case 52:
-      case 53:
-      case 54:
-      case 55:
-      case 56:
-      case 57:
-        this.readNumber(false);
-        return;
-
-      case 34:
-      case 39:
-        this.readString(code);
-        return;
-
-      case 47:
-        this.readToken_slash();
-        return;
-
-      case 37:
-      case 42:
-        this.readToken_mult_modulo(code);
-        return;
-
-      case 124:
-      case 38:
-        this.readToken_pipe_amp(code);
-        return;
-
-      case 94:
-        this.readToken_caret();
-        return;
-
-      case 43:
-      case 45:
-        this.readToken_plus_min(code);
-        return;
-
-      case 60:
-      case 62:
-        this.readToken_lt_gt(code);
-        return;
-
-      case 61:
-      case 33:
-        this.readToken_eq_excl(code);
-        return;
-
-      case 126:
-        this.finishOp(types.tilde, 1);
-        return;
-
-      case 64:
-        ++this.state.pos;
-        this.finishToken(types.at);
-        return;
-
-      case 35:
-        this.readToken_numberSign();
-        return;
-
-      case 92:
-        this.readWord();
-        return;
-
-      default:
-        if (isIdentifierStart(code)) {
-          this.readWord();
-          return;
-        }
-
-    }
-
-    throw this.raise(this.state.pos, Errors.InvalidOrUnexpectedToken, String.fromCodePoint(code));
-  }
-
-  finishOp(type, size) {
-    const str = this.input.slice(this.state.pos, this.state.pos + size);
-    this.state.pos += size;
-    this.finishToken(type, str);
-  }
-
-  readRegexp() {
-    const start = this.state.pos;
-    let escaped, inClass;
-
-    for (;;) {
-      if (this.state.pos >= this.length) {
-        throw this.raise(start, Errors.UnterminatedRegExp);
-      }
-
-      const ch = this.input.charAt(this.state.pos);
-
-      if (lineBreak.test(ch)) {
-        throw this.raise(start, Errors.UnterminatedRegExp);
-      }
-
-      if (escaped) {
-        escaped = false;
-      } else {
-        if (ch === "[") {
-          inClass = true;
-        } else if (ch === "]" && inClass) {
-          inClass = false;
-        } else if (ch === "/" && !inClass) {
-          break;
-        }
-
-        escaped = ch === "\\";
-      }
-
-      ++this.state.pos;
-    }
-
-    const content = this.input.slice(start, this.state.pos);
-    ++this.state.pos;
-    let mods = "";
-
-    while (this.state.pos < this.length) {
-      const char = this.input[this.state.pos];
-      const charCode = this.input.codePointAt(this.state.pos);
-
-      if (VALID_REGEX_FLAGS.has(char)) {
-        if (mods.indexOf(char) > -1) {
-          this.raise(this.state.pos + 1, Errors.DuplicateRegExpFlags);
-        }
-      } else if (isIdentifierChar(charCode) || charCode === 92) {
-        this.raise(this.state.pos + 1, Errors.MalformedRegExpFlags);
-      } else {
-        break;
-      }
-
-      ++this.state.pos;
-      mods += char;
-    }
-
-    this.finishToken(types.regexp, {
-      pattern: content,
-      flags: mods
-    });
-  }
-
-  readInt(radix, len, forceLen, allowNumSeparator = true) {
-    const start = this.state.pos;
-    const forbiddenSiblings = radix === 16 ? forbiddenNumericSeparatorSiblings.hex : forbiddenNumericSeparatorSiblings.decBinOct;
-    const allowedSiblings = radix === 16 ? allowedNumericSeparatorSiblings.hex : radix === 10 ? allowedNumericSeparatorSiblings.dec : radix === 8 ? allowedNumericSeparatorSiblings.oct : allowedNumericSeparatorSiblings.bin;
-    let invalid = false;
-    let total = 0;
-
-    for (let i = 0, e = len == null ? Infinity : len; i < e; ++i) {
-      const code = this.input.charCodeAt(this.state.pos);
-      let val;
-
-      if (this.hasPlugin("numericSeparator")) {
-        if (code === 95) {
-          const prev = this.input.charCodeAt(this.state.pos - 1);
-          const next = this.input.charCodeAt(this.state.pos + 1);
-
-          if (allowedSiblings.indexOf(next) === -1) {
-            this.raise(this.state.pos, Errors.UnexpectedNumericSeparator);
-          } else if (forbiddenSiblings.indexOf(prev) > -1 || forbiddenSiblings.indexOf(next) > -1 || Number.isNaN(next)) {
-            this.raise(this.state.pos, Errors.UnexpectedNumericSeparator);
-          }
-
-          if (!allowNumSeparator) {
-            this.raise(this.state.pos, Errors.NumericSeparatorInEscapeSequence);
-          }
-
-          ++this.state.pos;
-          continue;
-        }
-      }
-
-      if (code >= 97) {
-        val = code - 97 + 10;
-      } else if (code >= 65) {
-        val = code - 65 + 10;
-      } else if (_isDigit(code)) {
-        val = code - 48;
-      } else {
-        val = Infinity;
-      }
-
-      if (val >= radix) {
-        if (this.options.errorRecovery && val <= 9) {
-          val = 0;
-          this.raise(this.state.start + i + 2, Errors.InvalidDigit, radix);
-        } else if (forceLen) {
-          val = 0;
-          invalid = true;
-        } else {
-          break;
-        }
-      }
-
-      ++this.state.pos;
-      total = total * radix + val;
-    }
-
-    if (this.state.pos === start || len != null && this.state.pos - start !== len || invalid) {
-      return null;
-    }
-
-    return total;
-  }
-
-  readRadixNumber(radix) {
-    const start = this.state.pos;
-    let isBigInt = false;
-    this.state.pos += 2;
-    const val = this.readInt(radix);
-
-    if (val == null) {
-      this.raise(this.state.start + 2, Errors.InvalidDigit, radix);
-    }
-
-    if (this.input.charCodeAt(this.state.pos) === 110) {
-      ++this.state.pos;
-      isBigInt = true;
-    }
-
-    if (isIdentifierStart(this.input.codePointAt(this.state.pos))) {
-      throw this.raise(this.state.pos, Errors.NumberIdentifier);
-    }
-
-    if (isBigInt) {
-      const str = this.input.slice(start, this.state.pos).replace(/[_n]/g, "");
-      this.finishToken(types.bigint, str);
-      return;
-    }
-
-    this.finishToken(types.num, val);
-  }
-
-  readNumber(startsWithDot) {
-    const start = this.state.pos;
-    let isFloat = false;
-    let isBigInt = false;
-    let isNonOctalDecimalInt = false;
-
-    if (!startsWithDot && this.readInt(10) === null) {
-      this.raise(start, Errors.InvalidNumber);
-    }
-
-    let octal = this.state.pos - start >= 2 && this.input.charCodeAt(start) === 48;
-
-    if (octal) {
-      if (this.state.strict) {
-        this.raise(start, Errors.StrictOctalLiteral);
-      }
-
-      if (/[89]/.test(this.input.slice(start, this.state.pos))) {
-        octal = false;
-        isNonOctalDecimalInt = true;
-      }
-    }
-
-    let next = this.input.charCodeAt(this.state.pos);
-
-    if (next === 46 && !octal) {
-      ++this.state.pos;
-      this.readInt(10);
-      isFloat = true;
-      next = this.input.charCodeAt(this.state.pos);
-    }
-
-    if ((next === 69 || next === 101) && !octal) {
-      next = this.input.charCodeAt(++this.state.pos);
-
-      if (next === 43 || next === 45) {
-        ++this.state.pos;
-      }
-
-      if (this.readInt(10) === null) this.raise(start, "Invalid number");
-      isFloat = true;
-      next = this.input.charCodeAt(this.state.pos);
-    }
-
-    if (this.hasPlugin("numericSeparator") && (octal || isNonOctalDecimalInt)) {
-      const underscorePos = this.input.slice(start, this.state.pos).indexOf("_");
-
-      if (underscorePos > 0) {
-        this.raise(underscorePos + start, Errors.ZeroDigitNumericSeparator);
-      }
-    }
-
-    if (next === 110) {
-      if (isFloat || octal || isNonOctalDecimalInt) {
-        this.raise(start, "Invalid BigIntLiteral");
-      }
-
-      ++this.state.pos;
-      isBigInt = true;
-    }
-
-    if (isIdentifierStart(this.input.codePointAt(this.state.pos))) {
-      throw this.raise(this.state.pos, Errors.NumberIdentifier);
-    }
-
-    const str = this.input.slice(start, this.state.pos).replace(/[_n]/g, "");
-
-    if (isBigInt) {
-      this.finishToken(types.bigint, str);
-      return;
-    }
-
-    const val = octal ? parseInt(str, 8) : parseFloat(str);
-    this.finishToken(types.num, val);
-  }
-
-  readCodePoint(throwOnInvalid) {
-    const ch = this.input.charCodeAt(this.state.pos);
-    let code;
-
-    if (ch === 123) {
-      const codePos = ++this.state.pos;
-      code = this.readHexChar(this.input.indexOf("}", this.state.pos) - this.state.pos, true, throwOnInvalid);
-      ++this.state.pos;
-
-      if (code !== null && code > 0x10ffff) {
-        if (throwOnInvalid) {
-          this.raise(codePos, Errors.InvalidCodePoint);
-        } else {
-          return null;
-        }
-      }
-    } else {
-      code = this.readHexChar(4, false, throwOnInvalid);
-    }
-
-    return code;
-  }
-
-  readString(quote) {
-    let out = "",
-        chunkStart = ++this.state.pos;
-
-    for (;;) {
-      if (this.state.pos >= this.length) {
-        throw this.raise(this.state.start, Errors.UnterminatedString);
-      }
-
-      const ch = this.input.charCodeAt(this.state.pos);
-      if (ch === quote) break;
-
-      if (ch === 92) {
-        out += this.input.slice(chunkStart, this.state.pos);
-        out += this.readEscapedChar(false);
-        chunkStart = this.state.pos;
-      } else if (ch === 8232 || ch === 8233) {
-        ++this.state.pos;
-        ++this.state.curLine;
-        this.state.lineStart = this.state.pos;
-      } else if (isNewLine(ch)) {
-        throw this.raise(this.state.start, Errors.UnterminatedString);
-      } else {
-        ++this.state.pos;
-      }
-    }
-
-    out += this.input.slice(chunkStart, this.state.pos++);
-    this.finishToken(types.string, out);
-  }
-
-  readTmplToken() {
-    let out = "",
-        chunkStart = this.state.pos,
-        containsInvalid = false;
-
-    for (;;) {
-      if (this.state.pos >= this.length) {
-        throw this.raise(this.state.start, Errors.UnterminatedTemplate);
-      }
-
-      const ch = this.input.charCodeAt(this.state.pos);
-
-      if (ch === 96 || ch === 36 && this.input.charCodeAt(this.state.pos + 1) === 123) {
-        if (this.state.pos === this.state.start && this.match(types.template)) {
-          if (ch === 36) {
-            this.state.pos += 2;
-            this.finishToken(types.dollarBraceL);
-            return;
-          } else {
-            ++this.state.pos;
-            this.finishToken(types.backQuote);
-            return;
-          }
-        }
-
-        out += this.input.slice(chunkStart, this.state.pos);
-        this.finishToken(types.template, containsInvalid ? null : out);
-        return;
-      }
-
-      if (ch === 92) {
-        out += this.input.slice(chunkStart, this.state.pos);
-        const escaped = this.readEscapedChar(true);
-
-        if (escaped === null) {
-          containsInvalid = true;
-        } else {
-          out += escaped;
-        }
-
-        chunkStart = this.state.pos;
-      } else if (isNewLine(ch)) {
-        out += this.input.slice(chunkStart, this.state.pos);
-        ++this.state.pos;
-
-        switch (ch) {
-          case 13:
-            if (this.input.charCodeAt(this.state.pos) === 10) {
-              ++this.state.pos;
-            }
-
-          case 10:
-            out += "\n";
-            break;
-
-          default:
-            out += String.fromCharCode(ch);
-            break;
-        }
-
-        ++this.state.curLine;
-        this.state.lineStart = this.state.pos;
-        chunkStart = this.state.pos;
-      } else {
-        ++this.state.pos;
-      }
-    }
-  }
-
-  readEscapedChar(inTemplate) {
-    const throwOnInvalid = !inTemplate;
-    const ch = this.input.charCodeAt(++this.state.pos);
-    ++this.state.pos;
-
-    switch (ch) {
-      case 110:
-        return "\n";
-
-      case 114:
-        return "\r";
-
-      case 120:
-        {
-          const code = this.readHexChar(2, false, throwOnInvalid);
-          return code === null ? null : String.fromCharCode(code);
-        }
-
-      case 117:
-        {
-          const code = this.readCodePoint(throwOnInvalid);
-          return code === null ? null : String.fromCodePoint(code);
-        }
-
-      case 116:
-        return "\t";
-
-      case 98:
-        return "\b";
-
-      case 118:
-        return "\u000b";
-
-      case 102:
-        return "\f";
-
-      case 13:
-        if (this.input.charCodeAt(this.state.pos) === 10) {
-          ++this.state.pos;
-        }
-
-      case 10:
-        this.state.lineStart = this.state.pos;
-        ++this.state.curLine;
-
-      case 8232:
-      case 8233:
-        return "";
-
-      case 56:
-      case 57:
-        if (inTemplate) {
-          return null;
-        }
-
-      default:
-        if (ch >= 48 && ch <= 55) {
-          const codePos = this.state.pos - 1;
-          let octalStr = this.input.substr(this.state.pos - 1, 3).match(/^[0-7]+/)[0];
-          let octal = parseInt(octalStr, 8);
-
-          if (octal > 255) {
-            octalStr = octalStr.slice(0, -1);
-            octal = parseInt(octalStr, 8);
-          }
-
-          this.state.pos += octalStr.length - 1;
-          const next = this.input.charCodeAt(this.state.pos);
-
-          if (octalStr !== "0" || next === 56 || next === 57) {
-            if (inTemplate) {
-              return null;
-            } else if (this.state.strict) {
-              this.raise(codePos, Errors.StrictOctalLiteral);
-            } else {
-              this.state.octalPositions.push(codePos);
-            }
-          }
-
-          return String.fromCharCode(octal);
-        }
-
-        return String.fromCharCode(ch);
-    }
-  }
-
-  readHexChar(len, forceLen, throwOnInvalid) {
-    const codePos = this.state.pos;
-    const n = this.readInt(16, len, forceLen, false);
-
-    if (n === null) {
-      if (throwOnInvalid) {
-        this.raise(codePos, Errors.InvalidEscapeSequence);
-      } else {
-        this.state.pos = codePos - 1;
-      }
-    }
-
-    return n;
-  }
-
-  readWord1() {
-    let word = "";
-    this.state.containsEsc = false;
-    const start = this.state.pos;
-    let chunkStart = this.state.pos;
-
-    while (this.state.pos < this.length) {
-      const ch = this.input.codePointAt(this.state.pos);
-
-      if (isIdentifierChar(ch)) {
-        this.state.pos += ch <= 0xffff ? 1 : 2;
-      } else if (this.state.isIterator && ch === 64) {
-        ++this.state.pos;
-      } else if (ch === 92) {
-        this.state.containsEsc = true;
-        word += this.input.slice(chunkStart, this.state.pos);
-        const escStart = this.state.pos;
-        const identifierCheck = this.state.pos === start ? isIdentifierStart : isIdentifierChar;
-
-        if (this.input.charCodeAt(++this.state.pos) !== 117) {
-          this.raise(this.state.pos, Errors.MissingUnicodeEscape);
-          continue;
-        }
-
-        ++this.state.pos;
-        const esc = this.readCodePoint(true);
-
-        if (esc !== null) {
-          if (!identifierCheck(esc)) {
-            this.raise(escStart, Errors.EscapedCharNotAnIdentifier);
-          }
-
-          word += String.fromCodePoint(esc);
-        }
-
-        chunkStart = this.state.pos;
-      } else {
-        break;
-      }
-    }
-
-    return word + this.input.slice(chunkStart, this.state.pos);
-  }
-
-  isIterator(word) {
-    return word === "@@iterator" || word === "@@asyncIterator";
-  }
-
-  readWord() {
-    const word = this.readWord1();
-    const type = keywords.get(word) || types.name;
-
-    if (this.state.isIterator && (!this.isIterator(word) || !this.state.inType)) {
-      this.raise(this.state.pos, Errors.InvalidIdentifier, word);
-    }
-
-    this.finishToken(type, word);
-  }
-
-  checkKeywordEscapes() {
-    const kw = this.state.type.keyword;
-
-    if (kw && this.state.containsEsc) {
-      this.raise(this.state.start, Errors.InvalidEscapedReservedWord, kw);
-    }
-  }
-
-  braceIsBlock(prevType) {
-    const parent = this.curContext();
-
-    if (parent === types$1.functionExpression || parent === types$1.functionStatement) {
-      return true;
-    }
-
-    if (prevType === types.colon && (parent === types$1.braceStatement || parent === types$1.braceExpression)) {
-      return !parent.isExpr;
-    }
-
-    if (prevType === types._return || prevType === types.name && this.state.exprAllowed) {
-      return lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start));
-    }
-
-    if (prevType === types._else || prevType === types.semi || prevType === types.eof || prevType === types.parenR || prevType === types.arrow) {
-      return true;
-    }
-
-    if (prevType === types.braceL) {
-      return parent === types$1.braceStatement;
-    }
-
-    if (prevType === types._var || prevType === types._const || prevType === types.name) {
-      return false;
-    }
-
-    if (prevType === types.relational) {
-      return true;
-    }
-
-    return !this.state.exprAllowed;
-  }
-
-  updateContext(prevType) {
-    const type = this.state.type;
-    let update;
-
-    if (type.keyword && (prevType === types.dot || prevType === types.questionDot)) {
-      this.state.exprAllowed = false;
-    } else if (update = type.updateContext) {
-      update.call(this, prevType);
-    } else {
-      this.state.exprAllowed = type.beforeExpr;
-    }
-  }
-
-}
-
-class UtilParser extends Tokenizer {
-  addExtra(node, key, val) {
-    if (!node) return;
-    const extra = node.extra = node.extra || {};
-    extra[key] = val;
-  }
-
-  isRelational(op) {
-    return this.match(types.relational) && this.state.value === op;
-  }
-
-  isLookaheadRelational(op) {
-    const next = this.nextTokenStart();
-
-    if (this.input.charAt(next) === op) {
-      if (next + 1 === this.input.length) {
-        return true;
-      }
-
-      const afterNext = this.input.charCodeAt(next + 1);
-      return afterNext !== op.charCodeAt(0) && afterNext !== 61;
-    }
-
-    return false;
-  }
-
-  expectRelational(op) {
-    if (this.isRelational(op)) {
-      this.next();
-    } else {
-      this.unexpected(null, types.relational);
-    }
-  }
-
-  isContextual(name) {
-    return this.match(types.name) && this.state.value === name && !this.state.containsEsc;
-  }
-
-  isUnparsedContextual(nameStart, name) {
-    const nameEnd = nameStart + name.length;
-    return this.input.slice(nameStart, nameEnd) === name && (nameEnd === this.input.length || !isIdentifierChar(this.input.charCodeAt(nameEnd)));
-  }
-
-  isLookaheadContextual(name) {
-    const next = this.nextTokenStart();
-    return this.isUnparsedContextual(next, name);
-  }
-
-  eatContextual(name) {
-    return this.isContextual(name) && this.eat(types.name);
-  }
-
-  expectContextual(name, message) {
-    if (!this.eatContextual(name)) this.unexpected(null, message);
-  }
-
-  canInsertSemicolon() {
-    return this.match(types.eof) || this.match(types.braceR) || this.hasPrecedingLineBreak();
-  }
-
-  hasPrecedingLineBreak() {
-    return lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start));
-  }
-
-  isLineTerminator() {
-    return this.eat(types.semi) || this.canInsertSemicolon();
-  }
-
-  semicolon() {
-    if (!this.isLineTerminator()) this.unexpected(null, types.semi);
-  }
-
-  expect(type, pos) {
-    this.eat(type) || this.unexpected(pos, type);
-  }
-
-  assertNoSpace(message = "Unexpected space.") {
-    if (this.state.start > this.state.lastTokEnd) {
-      this.raise(this.state.lastTokEnd, message);
-    }
-  }
-
-  unexpected(pos, messageOrType = "Unexpected token") {
-    if (typeof messageOrType !== "string") {
-      messageOrType = `Unexpected token, expected "${messageOrType.label}"`;
-    }
-
-    throw this.raise(pos != null ? pos : this.state.start, messageOrType);
-  }
-
-  expectPlugin(name, pos) {
-    if (!this.hasPlugin(name)) {
-      throw this.raiseWithData(pos != null ? pos : this.state.start, {
-        missingPlugin: [name]
-      }, `This experimental syntax requires enabling the parser plugin: '${name}'`);
-    }
-
-    return true;
-  }
-
-  expectOnePlugin(names, pos) {
-    if (!names.some(n => this.hasPlugin(n))) {
-      throw this.raiseWithData(pos != null ? pos : this.state.start, {
-        missingPlugin: names
-      }, `This experimental syntax requires enabling one of the following parser plugin(s): '${names.join(", ")}'`);
-    }
-  }
-
-  checkYieldAwaitInDefaultParams() {
-    if (this.state.yieldPos !== -1 && (this.state.awaitPos === -1 || this.state.yieldPos < this.state.awaitPos)) {
-      this.raise(this.state.yieldPos, "Yield cannot be used as name inside a generator function");
-    }
-
-    if (this.state.awaitPos !== -1) {
-      this.raise(this.state.awaitPos, "Await cannot be used as name inside an async function");
-    }
-  }
-
-  tryParse(fn, oldState = this.state.clone()) {
-    const abortSignal = {
-      node: null
-    };
-
-    try {
-      const node = fn((node = null) => {
-        abortSignal.node = node;
-        throw abortSignal;
-      });
-
-      if (this.state.errors.length > oldState.errors.length) {
-        const failState = this.state;
-        this.state = oldState;
-        return {
-          node,
-          error: failState.errors[oldState.errors.length],
-          thrown: false,
-          aborted: false,
-          failState
-        };
-      }
-
-      return {
-        node,
-        error: null,
-        thrown: false,
-        aborted: false,
-        failState: null
-      };
-    } catch (error) {
-      const failState = this.state;
-      this.state = oldState;
-
-      if (error instanceof SyntaxError) {
-        return {
-          node: null,
-          error,
-          thrown: true,
-          aborted: false,
-          failState
-        };
-      }
-
-      if (error === abortSignal) {
-        return {
-          node: abortSignal.node,
-          error: null,
-          thrown: false,
-          aborted: true,
-          failState
-        };
-      }
-
-      throw error;
-    }
-  }
-
-  checkExpressionErrors(refExpressionErrors, andThrow) {
-    if (!refExpressionErrors) return false;
-    const {
-      shorthandAssign,
-      doubleProto
-    } = refExpressionErrors;
-    if (!andThrow) return shorthandAssign >= 0 || doubleProto >= 0;
-
-    if (shorthandAssign >= 0) {
-      this.unexpected(shorthandAssign);
-    }
-
-    if (doubleProto >= 0) {
-      this.raise(doubleProto, Errors.DuplicateProto);
-    }
-  }
-
-}
-class ExpressionErrors {
-  constructor() {
-    this.shorthandAssign = -1;
-    this.doubleProto = -1;
-  }
-
-}
-
-class Node {
-  constructor(parser, pos, loc) {
-    this.type = "";
-    this.start = pos;
-    this.end = 0;
-    this.loc = new SourceLocation(loc);
-    if (parser && parser.options.ranges) this.range = [pos, 0];
-    if (parser && parser.filename) this.loc.filename = parser.filename;
-  }
-
-  __clone() {
-    const newNode = new Node();
-    const keys = Object.keys(this);
-
-    for (let i = 0, length = keys.length; i < length; i++) {
-      const key = keys[i];
-
-      if (key !== "leadingComments" && key !== "trailingComments" && key !== "innerComments") {
-        newNode[key] = this[key];
-      }
-    }
-
-    return newNode;
-  }
-
-}
-
-class NodeUtils extends UtilParser {
-  startNode() {
-    return new Node(this, this.state.start, this.state.startLoc);
-  }
-
-  startNodeAt(pos, loc) {
-    return new Node(this, pos, loc);
-  }
-
-  startNodeAtNode(type) {
-    return this.startNodeAt(type.start, type.loc.start);
-  }
-
-  finishNode(node, type) {
-    return this.finishNodeAt(node, type, this.state.lastTokEnd, this.state.lastTokEndLoc);
-  }
-
-  finishNodeAt(node, type, pos, loc) {
-
-    node.type = type;
-    node.end = pos;
-    node.loc.end = loc;
-    if (this.options.ranges) node.range[1] = pos;
-    this.processComment(node);
-    return node;
-  }
-
-  resetStartLocation(node, start, startLoc) {
-    node.start = start;
-    node.loc.start = startLoc;
-    if (this.options.ranges) node.range[0] = start;
-  }
-
-  resetEndLocation(node, end = this.state.lastTokEnd, endLoc = this.state.lastTokEndLoc) {
-    node.end = end;
-    node.loc.end = endLoc;
-    if (this.options.ranges) node.range[1] = end;
-  }
-
-  resetStartLocationFromNode(node, locationNode) {
-    this.resetStartLocation(node, locationNode.start, locationNode.loc.start);
-  }
-
-}
-
-const unwrapParenthesizedExpression = node => {
-  return node.type === "ParenthesizedExpression" ? unwrapParenthesizedExpression(node.expression) : node;
-};
-
-class LValParser extends NodeUtils {
-  toAssignable(node) {
-    var _node$extra, _node$extra3;
-
-    let parenthesized = undefined;
-
-    if (node.type === "ParenthesizedExpression" || ((_node$extra = node.extra) == null ? void 0 : _node$extra.parenthesized)) {
-      parenthesized = unwrapParenthesizedExpression(node);
-
-      if (parenthesized.type !== "Identifier" && parenthesized.type !== "MemberExpression") {
-        this.raise(node.start, Errors.InvalidParenthesizedAssignment);
-      }
-    }
-
-    switch (node.type) {
-      case "Identifier":
-      case "ObjectPattern":
-      case "ArrayPattern":
-      case "AssignmentPattern":
-        break;
-
-      case "ObjectExpression":
-        node.type = "ObjectPattern";
-
-        for (let i = 0, length = node.properties.length, last = length - 1; i < length; i++) {
-          var _node$extra2;
-
-          const prop = node.properties[i];
-          const isLast = i === last;
-          this.toAssignableObjectExpressionProp(prop, isLast);
-
-          if (isLast && prop.type === "RestElement" && ((_node$extra2 = node.extra) == null ? void 0 : _node$extra2.trailingComma)) {
-            this.raiseRestNotLast(node.extra.trailingComma);
-          }
-        }
-
-        break;
-
-      case "ObjectProperty":
-        this.toAssignable(node.value);
-        break;
-
-      case "SpreadElement":
-        {
-          this.checkToRestConversion(node);
-          node.type = "RestElement";
-          const arg = node.argument;
-          this.toAssignable(arg);
-          break;
-        }
-
-      case "ArrayExpression":
-        node.type = "ArrayPattern";
-        this.toAssignableList(node.elements, (_node$extra3 = node.extra) == null ? void 0 : _node$extra3.trailingComma);
-        break;
-
-      case "AssignmentExpression":
-        if (node.operator !== "=") {
-          this.raise(node.left.end, Errors.MissingEqInAssignment);
-        }
-
-        node.type = "AssignmentPattern";
-        delete node.operator;
-        this.toAssignable(node.left);
-        break;
-
-      case "ParenthesizedExpression":
-        this.toAssignable(parenthesized);
-        break;
-    }
-
-    return node;
-  }
-
-  toAssignableObjectExpressionProp(prop, isLast) {
-    if (prop.type === "ObjectMethod") {
-      const error = prop.kind === "get" || prop.kind === "set" ? Errors.PatternHasAccessor : Errors.PatternHasMethod;
-      this.raise(prop.key.start, error);
-    } else if (prop.type === "SpreadElement" && !isLast) {
-      this.raiseRestNotLast(prop.start);
-    } else {
-      this.toAssignable(prop);
-    }
-  }
-
-  toAssignableList(exprList, trailingCommaPos) {
-    let end = exprList.length;
-
-    if (end) {
-      const last = exprList[end - 1];
-
-      if (last && last.type === "RestElement") {
-        --end;
-      } else if (last && last.type === "SpreadElement") {
-        last.type = "RestElement";
-        const arg = last.argument;
-        this.toAssignable(arg);
-
-        if (arg.type !== "Identifier" && arg.type !== "MemberExpression" && arg.type !== "ArrayPattern" && arg.type !== "ObjectPattern") {
-          this.unexpected(arg.start);
-        }
-
-        if (trailingCommaPos) {
-          this.raiseTrailingCommaAfterRest(trailingCommaPos);
-        }
-
-        --end;
-      }
-    }
-
-    for (let i = 0; i < end; i++) {
-      const elt = exprList[i];
-
-      if (elt) {
-        this.toAssignable(elt);
-
-        if (elt.type === "RestElement") {
-          this.raiseRestNotLast(elt.start);
-        }
-      }
-    }
-
-    return exprList;
-  }
-
-  toReferencedList(exprList, isParenthesizedExpr) {
-    return exprList;
-  }
-
-  toReferencedListDeep(exprList, isParenthesizedExpr) {
-    this.toReferencedList(exprList, isParenthesizedExpr);
-
-    for (let _i = 0; _i < exprList.length; _i++) {
-      const expr = exprList[_i];
-
-      if (expr && expr.type === "ArrayExpression") {
-        this.toReferencedListDeep(expr.elements);
-      }
-    }
-  }
-
-  parseSpread(refExpressionErrors, refNeedsArrowPos) {
-    const node = this.startNode();
-    this.next();
-    node.argument = this.parseMaybeAssign(false, refExpressionErrors, undefined, refNeedsArrowPos);
-    return this.finishNode(node, "SpreadElement");
-  }
-
-  parseRestBinding() {
-    const node = this.startNode();
-    this.next();
-    node.argument = this.parseBindingAtom();
-    return this.finishNode(node, "RestElement");
-  }
-
-  parseBindingAtom() {
-    switch (this.state.type) {
-      case types.bracketL:
-        {
-          const node = this.startNode();
-          this.next();
-          node.elements = this.parseBindingList(types.bracketR, 93, true);
-          return this.finishNode(node, "ArrayPattern");
-        }
-
-      case types.braceL:
-        return this.parseObj(types.braceR, true);
-    }
-
-    return this.parseIdentifier();
-  }
-
-  parseBindingList(close, closeCharCode, allowEmpty, allowModifiers) {
-    const elts = [];
-    let first = true;
-
-    while (!this.eat(close)) {
-      if (first) {
-        first = false;
-      } else {
-        this.expect(types.comma);
-      }
-
-      if (allowEmpty && this.match(types.comma)) {
-        elts.push(null);
-      } else if (this.eat(close)) {
-        break;
-      } else if (this.match(types.ellipsis)) {
-        elts.push(this.parseAssignableListItemTypes(this.parseRestBinding()));
-        this.checkCommaAfterRest(closeCharCode);
-        this.expect(close);
-        break;
-      } else {
-        const decorators = [];
-
-        if (this.match(types.at) && this.hasPlugin("decorators")) {
-          this.raise(this.state.start, Errors.UnsupportedParameterDecorator);
-        }
-
-        while (this.match(types.at)) {
-          decorators.push(this.parseDecorator());
-        }
-
-        elts.push(this.parseAssignableListItem(allowModifiers, decorators));
-      }
-    }
-
-    return elts;
-  }
-
-  parseAssignableListItem(allowModifiers, decorators) {
-    const left = this.parseMaybeDefault();
-    this.parseAssignableListItemTypes(left);
-    const elt = this.parseMaybeDefault(left.start, left.loc.start, left);
-
-    if (decorators.length) {
-      left.decorators = decorators;
-    }
-
-    return elt;
-  }
-
-  parseAssignableListItemTypes(param) {
-    return param;
-  }
-
-  parseMaybeDefault(startPos, startLoc, left) {
-    startLoc = startLoc || this.state.startLoc;
-    startPos = startPos || this.state.start;
-    left = left || this.parseBindingAtom();
-    if (!this.eat(types.eq)) return left;
-    const node = this.startNodeAt(startPos, startLoc);
-    node.left = left;
-    node.right = this.parseMaybeAssign();
-    return this.finishNode(node, "AssignmentPattern");
-  }
-
-  checkLVal(expr, bindingType = BIND_NONE, checkClashes, contextDescription, disallowLetBinding, strictModeChanged = false) {
-    switch (expr.type) {
-      case "Identifier":
-        if (this.state.strict && (strictModeChanged ? isStrictBindReservedWord(expr.name, this.inModule) : isStrictBindOnlyReservedWord(expr.name))) {
-          this.raise(expr.start, bindingType === BIND_NONE ? Errors.StrictEvalArguments : Errors.StrictEvalArgumentsBinding, expr.name);
-        }
-
-        if (checkClashes) {
-          const key = `_${expr.name}`;
-
-          if (checkClashes[key]) {
-            this.raise(expr.start, Errors.ParamDupe);
-          } else {
-            checkClashes[key] = true;
-          }
-        }
-
-        if (disallowLetBinding && expr.name === "let") {
-          this.raise(expr.start, Errors.LetInLexicalBinding);
-        }
-
-        if (!(bindingType & BIND_NONE)) {
-          this.scope.declareName(expr.name, bindingType, expr.start);
-        }
-
-        break;
-
-      case "MemberExpression":
-        if (bindingType !== BIND_NONE) {
-          this.raise(expr.start, Errors.InvalidPropertyBindingPattern);
-        }
-
-        break;
-
-      case "ObjectPattern":
-        for (let _i2 = 0, _expr$properties = expr.properties; _i2 < _expr$properties.length; _i2++) {
-          let prop = _expr$properties[_i2];
-          if (prop.type === "ObjectProperty") prop = prop.value;else if (prop.type === "ObjectMethod") continue;
-          this.checkLVal(prop, bindingType, checkClashes, "object destructuring pattern", disallowLetBinding);
-        }
-
-        break;
-
-      case "ArrayPattern":
-        for (let _i3 = 0, _expr$elements = expr.elements; _i3 < _expr$elements.length; _i3++) {
-          const elem = _expr$elements[_i3];
-
-          if (elem) {
-            this.checkLVal(elem, bindingType, checkClashes, "array destructuring pattern", disallowLetBinding);
-          }
-        }
-
-        break;
-
-      case "AssignmentPattern":
-        this.checkLVal(expr.left, bindingType, checkClashes, "assignment pattern");
-        break;
-
-      case "RestElement":
-        this.checkLVal(expr.argument, bindingType, checkClashes, "rest element");
-        break;
-
-      case "ParenthesizedExpression":
-        this.checkLVal(expr.expression, bindingType, checkClashes, "parenthesized expression");
-        break;
-
-      default:
-        {
-          this.raise(expr.start, bindingType === BIND_NONE ? Errors.InvalidLhs : Errors.InvalidLhsBinding, contextDescription);
-        }
-    }
-  }
-
-  checkToRestConversion(node) {
-    if (node.argument.type !== "Identifier" && node.argument.type !== "MemberExpression") {
-      this.raise(node.argument.start, Errors.InvalidRestAssignmentPattern);
-    }
-  }
-
-  checkCommaAfterRest(close) {
-    if (this.match(types.comma)) {
-      if (this.lookaheadCharCode() === close) {
-        this.raiseTrailingCommaAfterRest(this.state.start);
-      } else {
-        this.raiseRestNotLast(this.state.start);
-      }
-    }
-  }
-
-  raiseRestNotLast(pos) {
-    throw this.raise(pos, Errors.ElementAfterRest);
-  }
-
-  raiseTrailingCommaAfterRest(pos) {
-    this.raise(pos, Errors.RestTrailingComma);
-  }
-
-}
-
-class ExpressionParser extends LValParser {
-  checkDuplicatedProto(prop, protoRef, refExpressionErrors) {
-    if (prop.type === "SpreadElement" || prop.computed || prop.kind || prop.shorthand) {
-      return;
-    }
-
-    const key = prop.key;
-    const name = key.type === "Identifier" ? key.name : String(key.value);
-
-    if (name === "__proto__") {
-      if (protoRef.used) {
-        if (refExpressionErrors) {
-          if (refExpressionErrors.doubleProto === -1) {
-            refExpressionErrors.doubleProto = key.start;
-          }
-        } else {
-          this.raise(key.start, Errors.DuplicateProto);
-        }
-      }
-
-      protoRef.used = true;
-    }
-  }
-
-  getExpression() {
-    let paramFlags = PARAM;
-
-    if (this.hasPlugin("topLevelAwait") && this.inModule) {
-      paramFlags |= PARAM_AWAIT;
-    }
-
-    this.scope.enter(SCOPE_PROGRAM);
-    this.prodParam.enter(paramFlags);
-    this.nextToken();
-    const expr = this.parseExpression();
-
-    if (!this.match(types.eof)) {
-      this.unexpected();
-    }
-
-    expr.comments = this.state.comments;
-    expr.errors = this.state.errors;
-    return expr;
-  }
-
-  parseExpression(noIn, refExpressionErrors) {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    const expr = this.parseMaybeAssign(noIn, refExpressionErrors);
-
-    if (this.match(types.comma)) {
-      const node = this.startNodeAt(startPos, startLoc);
-      node.expressions = [expr];
-
-      while (this.eat(types.comma)) {
-        node.expressions.push(this.parseMaybeAssign(noIn, refExpressionErrors));
-      }
-
-      this.toReferencedList(node.expressions);
-      return this.finishNode(node, "SequenceExpression");
-    }
-
-    return expr;
-  }
-
-  parseMaybeAssign(noIn, refExpressionErrors, afterLeftParse, refNeedsArrowPos) {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-
-    if (this.isContextual("yield")) {
-      if (this.prodParam.hasYield) {
-        let left = this.parseYield(noIn);
-
-        if (afterLeftParse) {
-          left = afterLeftParse.call(this, left, startPos, startLoc);
-        }
-
-        return left;
-      } else {
-        this.state.exprAllowed = false;
-      }
-    }
-
-    let ownExpressionErrors;
-
-    if (refExpressionErrors) {
-      ownExpressionErrors = false;
-    } else {
-      refExpressionErrors = new ExpressionErrors();
-      ownExpressionErrors = true;
-    }
-
-    if (this.match(types.parenL) || this.match(types.name)) {
-      this.state.potentialArrowAt = this.state.start;
-    }
-
-    let left = this.parseMaybeConditional(noIn, refExpressionErrors, refNeedsArrowPos);
-
-    if (afterLeftParse) {
-      left = afterLeftParse.call(this, left, startPos, startLoc);
-    }
-
-    if (this.state.type.isAssign) {
-      const node = this.startNodeAt(startPos, startLoc);
-      const operator = this.state.value;
-      node.operator = operator;
-
-      if (operator === "??=") {
-        this.expectPlugin("logicalAssignment");
-      }
-
-      if (operator === "||=" || operator === "&&=") {
-        this.expectPlugin("logicalAssignment");
-      }
-
-      if (this.match(types.eq)) {
-        node.left = this.toAssignable(left);
-        refExpressionErrors.doubleProto = -1;
-      } else {
-        node.left = left;
-      }
-
-      if (refExpressionErrors.shorthandAssign >= node.left.start) {
-        refExpressionErrors.shorthandAssign = -1;
-      }
-
-      this.checkLVal(left, undefined, undefined, "assignment expression");
-      this.next();
-      node.right = this.parseMaybeAssign(noIn);
-      return this.finishNode(node, "AssignmentExpression");
-    } else if (ownExpressionErrors) {
-      this.checkExpressionErrors(refExpressionErrors, true);
-    }
-
-    return left;
-  }
-
-  parseMaybeConditional(noIn, refExpressionErrors, refNeedsArrowPos) {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    const potentialArrowAt = this.state.potentialArrowAt;
-    const expr = this.parseExprOps(noIn, refExpressionErrors);
-
-    if (expr.type === "ArrowFunctionExpression" && expr.start === potentialArrowAt) {
-      return expr;
-    }
-
-    if (this.checkExpressionErrors(refExpressionErrors, false)) return expr;
-    return this.parseConditional(expr, noIn, startPos, startLoc, refNeedsArrowPos);
-  }
-
-  parseConditional(expr, noIn, startPos, startLoc, refNeedsArrowPos) {
-    if (this.eat(types.question)) {
-      const node = this.startNodeAt(startPos, startLoc);
-      node.test = expr;
-      node.consequent = this.parseMaybeAssign();
-      this.expect(types.colon);
-      node.alternate = this.parseMaybeAssign(noIn);
-      return this.finishNode(node, "ConditionalExpression");
-    }
-
-    return expr;
-  }
-
-  parseExprOps(noIn, refExpressionErrors) {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    const potentialArrowAt = this.state.potentialArrowAt;
-    const expr = this.parseMaybeUnary(refExpressionErrors);
-
-    if (expr.type === "ArrowFunctionExpression" && expr.start === potentialArrowAt) {
-      return expr;
-    }
-
-    if (this.checkExpressionErrors(refExpressionErrors, false)) {
-      return expr;
-    }
-
-    return this.parseExprOp(expr, startPos, startLoc, -1, noIn);
-  }
-
-  parseExprOp(left, leftStartPos, leftStartLoc, minPrec, noIn) {
-    let prec = this.state.type.binop;
-
-    if (prec != null && (!noIn || !this.match(types._in))) {
-      if (prec > minPrec) {
-        const operator = this.state.value;
-
-        if (operator === "|>" && this.state.inFSharpPipelineDirectBody) {
-          return left;
-        }
-
-        const node = this.startNodeAt(leftStartPos, leftStartLoc);
-        node.left = left;
-        node.operator = operator;
-
-        if (operator === "**" && left.type === "UnaryExpression" && (this.options.createParenthesizedExpressions || !(left.extra && left.extra.parenthesized))) {
-          this.raise(left.argument.start, Errors.UnexpectedTokenUnaryExponentiation);
-        }
-
-        const op = this.state.type;
-        const logical = op === types.logicalOR || op === types.logicalAND;
-        const coalesce = op === types.nullishCoalescing;
-
-        if (op === types.pipeline) {
-          this.expectPlugin("pipelineOperator");
-          this.state.inPipeline = true;
-          this.checkPipelineAtInfixOperator(left, leftStartPos);
-        } else if (coalesce) {
-          prec = types.logicalAND.binop;
-        }
-
-        this.next();
-
-        if (op === types.pipeline && this.getPluginOption("pipelineOperator", "proposal") === "minimal") {
-          if (this.match(types.name) && this.state.value === "await" && this.prodParam.hasAwait) {
-            throw this.raise(this.state.start, Errors.UnexpectedAwaitAfterPipelineBody);
-          }
-        }
-
-        node.right = this.parseExprOpRightExpr(op, prec, noIn);
-        this.finishNode(node, logical || coalesce ? "LogicalExpression" : "BinaryExpression");
-        const nextOp = this.state.type;
-
-        if (coalesce && (nextOp === types.logicalOR || nextOp === types.logicalAND) || logical && nextOp === types.nullishCoalescing) {
-          throw this.raise(this.state.start, Errors.MixingCoalesceWithLogical);
-        }
-
-        return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn);
-      }
-    }
-
-    return left;
-  }
-
-  parseExprOpRightExpr(op, prec, noIn) {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-
-    switch (op) {
-      case types.pipeline:
-        switch (this.getPluginOption("pipelineOperator", "proposal")) {
-          case "smart":
-            return this.withTopicPermittingContext(() => {
-              return this.parseSmartPipelineBody(this.parseExprOpBaseRightExpr(op, prec, noIn), startPos, startLoc);
-            });
-
-          case "fsharp":
-            return this.withSoloAwaitPermittingContext(() => {
-              return this.parseFSharpPipelineBody(prec, noIn);
-            });
-        }
-
-      default:
-        return this.parseExprOpBaseRightExpr(op, prec, noIn);
-    }
-  }
-
-  parseExprOpBaseRightExpr(op, prec, noIn) {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    return this.parseExprOp(this.parseMaybeUnary(), startPos, startLoc, op.rightAssociative ? prec - 1 : prec, noIn);
-  }
-
-  parseMaybeUnary(refExpressionErrors) {
-    if (this.isContextual("await") && this.isAwaitAllowed()) {
-      return this.parseAwait();
-    } else if (this.state.type.prefix) {
-      const node = this.startNode();
-      const update = this.match(types.incDec);
-      node.operator = this.state.value;
-      node.prefix = true;
-
-      if (node.operator === "throw") {
-        this.expectPlugin("throwExpressions");
-      }
-
-      this.next();
-      node.argument = this.parseMaybeUnary();
-      this.checkExpressionErrors(refExpressionErrors, true);
-
-      if (update) {
-        this.checkLVal(node.argument, undefined, undefined, "prefix operation");
-      } else if (this.state.strict && node.operator === "delete") {
-        const arg = node.argument;
-
-        if (arg.type === "Identifier") {
-          this.raise(node.start, Errors.StrictDelete);
-        } else if (arg.type === "MemberExpression" && arg.property.type === "PrivateName") {
-          this.raise(node.start, Errors.DeletePrivateField);
-        }
-      }
-
-      return this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression");
-    }
-
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    let expr = this.parseExprSubscripts(refExpressionErrors);
-    if (this.checkExpressionErrors(refExpressionErrors, false)) return expr;
-
-    while (this.state.type.postfix && !this.canInsertSemicolon()) {
-      const node = this.startNodeAt(startPos, startLoc);
-      node.operator = this.state.value;
-      node.prefix = false;
-      node.argument = expr;
-      this.checkLVal(expr, undefined, undefined, "postfix operation");
-      this.next();
-      expr = this.finishNode(node, "UpdateExpression");
-    }
-
-    return expr;
-  }
-
-  parseExprSubscripts(refExpressionErrors) {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    const potentialArrowAt = this.state.potentialArrowAt;
-    const expr = this.parseExprAtom(refExpressionErrors);
-
-    if (expr.type === "ArrowFunctionExpression" && expr.start === potentialArrowAt) {
-      return expr;
-    }
-
-    return this.parseSubscripts(expr, startPos, startLoc);
-  }
-
-  parseSubscripts(base, startPos, startLoc, noCalls) {
-    const state = {
-      optionalChainMember: false,
-      maybeAsyncArrow: this.atPossibleAsyncArrow(base),
-      stop: false
-    };
-
-    do {
-      const oldMaybeInAsyncArrowHead = this.state.maybeInAsyncArrowHead;
-
-      if (state.maybeAsyncArrow) {
-        this.state.maybeInAsyncArrowHead = true;
-      }
-
-      base = this.parseSubscript(base, startPos, startLoc, noCalls, state);
-      state.maybeAsyncArrow = false;
-      this.state.maybeInAsyncArrowHead = oldMaybeInAsyncArrowHead;
-    } while (!state.stop);
-
-    return base;
-  }
-
-  parseSubscript(base, startPos, startLoc, noCalls, state) {
-    if (!noCalls && this.eat(types.doubleColon)) {
-      const node = this.startNodeAt(startPos, startLoc);
-      node.object = base;
-      node.callee = this.parseNoCallExpr();
-      state.stop = true;
-      return this.parseSubscripts(this.finishNode(node, "BindExpression"), startPos, startLoc, noCalls);
-    }
-
-    let optional = false;
-
-    if (this.match(types.questionDot)) {
-      state.optionalChainMember = optional = true;
-
-      if (noCalls && this.lookaheadCharCode() === 40) {
-        state.stop = true;
-        return base;
-      }
-
-      this.next();
-    }
-
-    const computed = this.eat(types.bracketL);
-
-    if (optional && !this.match(types.parenL) && !this.match(types.backQuote) || computed || this.eat(types.dot)) {
-      const node = this.startNodeAt(startPos, startLoc);
-      node.object = base;
-      node.property = computed ? this.parseExpression() : optional ? this.parseIdentifier(true) : this.parseMaybePrivateName(true);
-      node.computed = computed;
-
-      if (node.property.type === "PrivateName") {
-        if (node.object.type === "Super") {
-          this.raise(startPos, Errors.SuperPrivateField);
-        }
-
-        this.classScope.usePrivateName(node.property.id.name, node.property.start);
-      }
-
-      if (computed) {
-        this.expect(types.bracketR);
-      }
-
-      if (state.optionalChainMember) {
-        node.optional = optional;
-        return this.finishNode(node, "OptionalMemberExpression");
-      } else {
-        return this.finishNode(node, "MemberExpression");
-      }
-    } else if (!noCalls && this.match(types.parenL)) {
-      const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;
-      const oldYieldPos = this.state.yieldPos;
-      const oldAwaitPos = this.state.awaitPos;
-      this.state.maybeInArrowParameters = true;
-      this.state.yieldPos = -1;
-      this.state.awaitPos = -1;
-      this.next();
-      let node = this.startNodeAt(startPos, startLoc);
-      node.callee = base;
-
-      if (optional) {
-        node.optional = true;
-        node.arguments = this.parseCallExpressionArguments(types.parenR, false);
-      } else {
-        node.arguments = this.parseCallExpressionArguments(types.parenR, state.maybeAsyncArrow, base.type === "Import", base.type !== "Super", node);
-      }
-
-      this.finishCallExpression(node, state.optionalChainMember);
-
-      if (state.maybeAsyncArrow && this.shouldParseAsyncArrow() && !optional) {
-        state.stop = true;
-        node = this.parseAsyncArrowFromCallExpression(this.startNodeAt(startPos, startLoc), node);
-        this.checkYieldAwaitInDefaultParams();
-        this.state.yieldPos = oldYieldPos;
-        this.state.awaitPos = oldAwaitPos;
-      } else {
-        this.toReferencedListDeep(node.arguments);
-        if (oldYieldPos !== -1) this.state.yieldPos = oldYieldPos;
-
-        if (!this.isAwaitAllowed() && !oldMaybeInArrowParameters || oldAwaitPos !== -1) {
-          this.state.awaitPos = oldAwaitPos;
-        }
-      }
-
-      this.state.maybeInArrowParameters = oldMaybeInArrowParameters;
-      return node;
-    } else if (this.match(types.backQuote)) {
-      return this.parseTaggedTemplateExpression(startPos, startLoc, base, state);
-    } else {
-      state.stop = true;
-      return base;
-    }
-  }
-
-  parseTaggedTemplateExpression(startPos, startLoc, base, state, typeArguments) {
-    const node = this.startNodeAt(startPos, startLoc);
-    node.tag = base;
-    node.quasi = this.parseTemplate(true);
-    if (typeArguments) node.typeParameters = typeArguments;
-
-    if (state.optionalChainMember) {
-      this.raise(startPos, Errors.OptionalChainingNoTemplate);
-    }
-
-    return this.finishNode(node, "TaggedTemplateExpression");
-  }
-
-  atPossibleAsyncArrow(base) {
-    return base.type === "Identifier" && base.name === "async" && this.state.lastTokEnd === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 && base.start === this.state.potentialArrowAt;
-  }
-
-  finishCallExpression(node, optional) {
-    if (node.callee.type === "Import") {
-      if (node.arguments.length !== 1) {
-        this.raise(node.start, Errors.ImportCallArity);
-      } else {
-        const importArg = node.arguments[0];
-
-        if (importArg && importArg.type === "SpreadElement") {
-          this.raise(importArg.start, Errors.ImportCallSpreadArgument);
-        }
-      }
-    }
-
-    return this.finishNode(node, optional ? "OptionalCallExpression" : "CallExpression");
-  }
-
-  parseCallExpressionArguments(close, possibleAsyncArrow, dynamicImport, allowPlaceholder, nodeForExtra) {
-    const elts = [];
-    let innerParenStart;
-    let first = true;
-    const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;
-    this.state.inFSharpPipelineDirectBody = false;
-
-    while (!this.eat(close)) {
-      if (first) {
-        first = false;
-      } else {
-        this.expect(types.comma);
-
-        if (this.match(close)) {
-          if (dynamicImport) {
-            this.raise(this.state.lastTokStart, Errors.ImportCallArgumentTrailingComma);
-          }
-
-          if (nodeForExtra) {
-            this.addExtra(nodeForExtra, "trailingComma", this.state.lastTokStart);
-          }
-
-          this.next();
-          break;
-        }
-      }
-
-      if (this.match(types.parenL) && !innerParenStart) {
-        innerParenStart = this.state.start;
-      }
-
-      elts.push(this.parseExprListItem(false, possibleAsyncArrow ? new ExpressionErrors() : undefined, possibleAsyncArrow ? {
-        start: 0
-      } : undefined, allowPlaceholder));
-    }
-
-    if (possibleAsyncArrow && innerParenStart && this.shouldParseAsyncArrow()) {
-      this.unexpected();
-    }
-
-    this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;
-    return elts;
-  }
-
-  shouldParseAsyncArrow() {
-    return this.match(types.arrow) && !this.canInsertSemicolon();
-  }
-
-  parseAsyncArrowFromCallExpression(node, call) {
-    var _call$extra;
-
-    this.expect(types.arrow);
-    this.parseArrowExpression(node, call.arguments, true, (_call$extra = call.extra) == null ? void 0 : _call$extra.trailingComma);
-    return node;
-  }
-
-  parseNoCallExpr() {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    return this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true);
-  }
-
-  parseExprAtom(refExpressionErrors) {
-    if (this.state.type === types.slash) this.readRegexp();
-    const canBeArrow = this.state.potentialArrowAt === this.state.start;
-    let node;
-
-    switch (this.state.type) {
-      case types._super:
-        node = this.startNode();
-        this.next();
-
-        if (this.match(types.parenL) && !this.scope.allowDirectSuper && !this.options.allowSuperOutsideMethod) {
-          this.raise(node.start, Errors.SuperNotAllowed);
-        } else if (!this.scope.allowSuper && !this.options.allowSuperOutsideMethod) {
-          this.raise(node.start, Errors.UnexpectedSuper);
-        }
-
-        if (!this.match(types.parenL) && !this.match(types.bracketL) && !this.match(types.dot)) {
-          this.raise(node.start, Errors.UnsupportedSuper);
-        }
-
-        return this.finishNode(node, "Super");
-
-      case types._import:
-        node = this.startNode();
-        this.next();
-
-        if (this.match(types.dot)) {
-          return this.parseImportMetaProperty(node);
-        }
-
-        if (!this.match(types.parenL)) {
-          this.raise(this.state.lastTokStart, Errors.UnsupportedImport);
-        }
-
-        return this.finishNode(node, "Import");
-
-      case types._this:
-        node = this.startNode();
-        this.next();
-        return this.finishNode(node, "ThisExpression");
-
-      case types.name:
-        {
-          node = this.startNode();
-          const containsEsc = this.state.containsEsc;
-          const id = this.parseIdentifier();
-
-          if (!containsEsc && id.name === "async" && this.match(types._function) && !this.canInsertSemicolon()) {
-            const last = this.state.context.length - 1;
-
-            if (this.state.context[last] !== types$1.functionStatement) {
-              throw new Error("Internal error");
-            }
-
-            this.state.context[last] = types$1.functionExpression;
-            this.next();
-            return this.parseFunction(node, undefined, true);
-          } else if (canBeArrow && !containsEsc && id.name === "async" && this.match(types.name) && !this.canInsertSemicolon()) {
-            const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;
-            const oldMaybeInAsyncArrowHead = this.state.maybeInAsyncArrowHead;
-            const oldYieldPos = this.state.yieldPos;
-            const oldAwaitPos = this.state.awaitPos;
-            this.state.maybeInArrowParameters = true;
-            this.state.maybeInAsyncArrowHead = true;
-            this.state.yieldPos = -1;
-            this.state.awaitPos = -1;
-            const params = [this.parseIdentifier()];
-            this.expect(types.arrow);
-            this.checkYieldAwaitInDefaultParams();
-            this.state.maybeInArrowParameters = oldMaybeInArrowParameters;
-            this.state.maybeInAsyncArrowHead = oldMaybeInAsyncArrowHead;
-            this.state.yieldPos = oldYieldPos;
-            this.state.awaitPos = oldAwaitPos;
-            this.parseArrowExpression(node, params, true);
-            return node;
-          }
-
-          if (canBeArrow && this.match(types.arrow) && !this.canInsertSemicolon()) {
-            this.next();
-            this.parseArrowExpression(node, [id], false);
-            return node;
-          }
-
-          return id;
-        }
-
-      case types._do:
-        {
-          this.expectPlugin("doExpressions");
-          const node = this.startNode();
-          this.next();
-          const oldLabels = this.state.labels;
-          this.state.labels = [];
-          node.body = this.parseBlock();
-          this.state.labels = oldLabels;
-          return this.finishNode(node, "DoExpression");
-        }
-
-      case types.regexp:
-        {
-          const value = this.state.value;
-          node = this.parseLiteral(value.value, "RegExpLiteral");
-          node.pattern = value.pattern;
-          node.flags = value.flags;
-          return node;
-        }
-
-      case types.num:
-        return this.parseLiteral(this.state.value, "NumericLiteral");
-
-      case types.bigint:
-        return this.parseLiteral(this.state.value, "BigIntLiteral");
-
-      case types.string:
-        return this.parseLiteral(this.state.value, "StringLiteral");
-
-      case types._null:
-        node = this.startNode();
-        this.next();
-        return this.finishNode(node, "NullLiteral");
-
-      case types._true:
-      case types._false:
-        return this.parseBooleanLiteral();
-
-      case types.parenL:
-        return this.parseParenAndDistinguishExpression(canBeArrow);
-
-      case types.bracketBarL:
-      case types.bracketHashL:
-        {
-          this.expectPlugin("recordAndTuple");
-          const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;
-          const close = this.state.type === types.bracketBarL ? types.bracketBarR : types.bracketR;
-          this.state.inFSharpPipelineDirectBody = false;
-          node = this.startNode();
-          this.next();
-          node.elements = this.parseExprList(close, true, refExpressionErrors, node);
-          this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;
-          return this.finishNode(node, "TupleExpression");
-        }
-
-      case types.bracketL:
-        {
-          const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;
-          this.state.inFSharpPipelineDirectBody = false;
-          node = this.startNode();
-          this.next();
-          node.elements = this.parseExprList(types.bracketR, true, refExpressionErrors, node);
-
-          if (!this.state.maybeInArrowParameters) {
-            this.toReferencedList(node.elements);
-          }
-
-          this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;
-          return this.finishNode(node, "ArrayExpression");
-        }
-
-      case types.braceBarL:
-      case types.braceHashL:
-        {
-          this.expectPlugin("recordAndTuple");
-          const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;
-          const close = this.state.type === types.braceBarL ? types.braceBarR : types.braceR;
-          this.state.inFSharpPipelineDirectBody = false;
-          const ret = this.parseObj(close, false, true, refExpressionErrors);
-          this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;
-          return ret;
-        }
-
-      case types.braceL:
-        {
-          const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;
-          this.state.inFSharpPipelineDirectBody = false;
-          const ret = this.parseObj(types.braceR, false, false, refExpressionErrors);
-          this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;
-          return ret;
-        }
-
-      case types._function:
-        return this.parseFunctionExpression();
-
-      case types.at:
-        this.parseDecorators();
-
-      case types._class:
-        node = this.startNode();
-        this.takeDecorators(node);
-        return this.parseClass(node, false);
-
-      case types._new:
-        return this.parseNew();
-
-      case types.backQuote:
-        return this.parseTemplate(false);
-
-      case types.doubleColon:
-        {
-          node = this.startNode();
-          this.next();
-          node.object = null;
-          const callee = node.callee = this.parseNoCallExpr();
-
-          if (callee.type === "MemberExpression") {
-            return this.finishNode(node, "BindExpression");
-          } else {
-            throw this.raise(callee.start, Errors.UnsupportedBind);
-          }
-        }
-
-      case types.hash:
-        {
-          if (this.state.inPipeline) {
-            node = this.startNode();
-
-            if (this.getPluginOption("pipelineOperator", "proposal") !== "smart") {
-              this.raise(node.start, Errors.PrimaryTopicRequiresSmartPipeline);
-            }
-
-            this.next();
-
-            if (!this.primaryTopicReferenceIsAllowedInCurrentTopicContext()) {
-              this.raise(node.start, Errors.PrimaryTopicNotAllowed);
-            }
-
-            this.registerTopicReference();
-            return this.finishNode(node, "PipelinePrimaryTopicReference");
-          }
-        }
-
-      default:
-        throw this.unexpected();
-    }
-  }
-
-  parseBooleanLiteral() {
-    const node = this.startNode();
-    node.value = this.match(types._true);
-    this.next();
-    return this.finishNode(node, "BooleanLiteral");
-  }
-
-  parseMaybePrivateName(isPrivateNameAllowed) {
-    const isPrivate = this.match(types.hash);
-
-    if (isPrivate) {
-      this.expectOnePlugin(["classPrivateProperties", "classPrivateMethods"]);
-
-      if (!isPrivateNameAllowed) {
-        this.raise(this.state.pos, Errors.UnexpectedPrivateField);
-      }
-
-      const node = this.startNode();
-      this.next();
-      this.assertNoSpace("Unexpected space between # and identifier");
-      node.id = this.parseIdentifier(true);
-      return this.finishNode(node, "PrivateName");
-    } else {
-      return this.parseIdentifier(true);
-    }
-  }
-
-  parseFunctionExpression() {
-    const node = this.startNode();
-    let meta = this.startNode();
-    this.next();
-    meta = this.createIdentifier(meta, "function");
-
-    if (this.prodParam.hasYield && this.eat(types.dot)) {
-      return this.parseMetaProperty(node, meta, "sent");
-    }
-
-    return this.parseFunction(node);
-  }
-
-  parseMetaProperty(node, meta, propertyName) {
-    node.meta = meta;
-
-    if (meta.name === "function" && propertyName === "sent") {
-      if (this.isContextual(propertyName)) {
-        this.expectPlugin("functionSent");
-      } else if (!this.hasPlugin("functionSent")) {
-        this.unexpected();
-      }
-    }
-
-    const containsEsc = this.state.containsEsc;
-    node.property = this.parseIdentifier(true);
-
-    if (node.property.name !== propertyName || containsEsc) {
-      this.raise(node.property.start, Errors.UnsupportedMetaProperty, meta.name, propertyName);
-    }
-
-    return this.finishNode(node, "MetaProperty");
-  }
-
-  parseImportMetaProperty(node) {
-    const id = this.createIdentifier(this.startNodeAtNode(node), "import");
-    this.expect(types.dot);
-
-    if (this.isContextual("meta")) {
-      this.expectPlugin("importMeta");
-
-      if (!this.inModule) {
-        this.raiseWithData(id.start, {
-          code: "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED"
-        }, Errors.ImportMetaOutsideModule);
-      }
-
-      this.sawUnambiguousESM = true;
-    } else if (!this.hasPlugin("importMeta")) {
-      this.raise(id.start, Errors.ImportCallArityLtOne);
-    }
-
-    return this.parseMetaProperty(node, id, "meta");
-  }
-
-  parseLiteral(value, type, startPos, startLoc) {
-    startPos = startPos || this.state.start;
-    startLoc = startLoc || this.state.startLoc;
-    const node = this.startNodeAt(startPos, startLoc);
-    this.addExtra(node, "rawValue", value);
-    this.addExtra(node, "raw", this.input.slice(startPos, this.state.end));
-    node.value = value;
-    this.next();
-    return this.finishNode(node, type);
-  }
-
-  parseParenAndDistinguishExpression(canBeArrow) {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    let val;
-    this.expect(types.parenL);
-    const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;
-    const oldYieldPos = this.state.yieldPos;
-    const oldAwaitPos = this.state.awaitPos;
-    const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;
-    this.state.maybeInArrowParameters = true;
-    this.state.yieldPos = -1;
-    this.state.awaitPos = -1;
-    this.state.inFSharpPipelineDirectBody = false;
-    const innerStartPos = this.state.start;
-    const innerStartLoc = this.state.startLoc;
-    const exprList = [];
-    const refExpressionErrors = new ExpressionErrors();
-    const refNeedsArrowPos = {
-      start: 0
-    };
-    let first = true;
-    let spreadStart;
-    let optionalCommaStart;
-
-    while (!this.match(types.parenR)) {
-      if (first) {
-        first = false;
-      } else {
-        this.expect(types.comma, refNeedsArrowPos.start || null);
-
-        if (this.match(types.parenR)) {
-          optionalCommaStart = this.state.start;
-          break;
-        }
-      }
-
-      if (this.match(types.ellipsis)) {
-        const spreadNodeStartPos = this.state.start;
-        const spreadNodeStartLoc = this.state.startLoc;
-        spreadStart = this.state.start;
-        exprList.push(this.parseParenItem(this.parseRestBinding(), spreadNodeStartPos, spreadNodeStartLoc));
-        this.checkCommaAfterRest(41);
-        break;
-      } else {
-        exprList.push(this.parseMaybeAssign(false, refExpressionErrors, this.parseParenItem, refNeedsArrowPos));
-      }
-    }
-
-    const innerEndPos = this.state.start;
-    const innerEndLoc = this.state.startLoc;
-    this.expect(types.parenR);
-    this.state.maybeInArrowParameters = oldMaybeInArrowParameters;
-    this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;
-    let arrowNode = this.startNodeAt(startPos, startLoc);
-
-    if (canBeArrow && this.shouldParseArrow() && (arrowNode = this.parseArrow(arrowNode))) {
-      if (!this.isAwaitAllowed() && !this.state.maybeInAsyncArrowHead) {
-        this.state.awaitPos = oldAwaitPos;
-      }
-
-      this.checkYieldAwaitInDefaultParams();
-      this.state.yieldPos = oldYieldPos;
-      this.state.awaitPos = oldAwaitPos;
-
-      for (let _i = 0; _i < exprList.length; _i++) {
-        const param = exprList[_i];
-
-        if (param.extra && param.extra.parenthesized) {
-          this.unexpected(param.extra.parenStart);
-        }
-      }
-
-      this.parseArrowExpression(arrowNode, exprList, false);
-      return arrowNode;
-    }
-
-    if (oldYieldPos !== -1) this.state.yieldPos = oldYieldPos;
-    if (oldAwaitPos !== -1) this.state.awaitPos = oldAwaitPos;
-
-    if (!exprList.length) {
-      this.unexpected(this.state.lastTokStart);
-    }
-
-    if (optionalCommaStart) this.unexpected(optionalCommaStart);
-    if (spreadStart) this.unexpected(spreadStart);
-    this.checkExpressionErrors(refExpressionErrors, true);
-    if (refNeedsArrowPos.start) this.unexpected(refNeedsArrowPos.start);
-    this.toReferencedListDeep(exprList, true);
-
-    if (exprList.length > 1) {
-      val = this.startNodeAt(innerStartPos, innerStartLoc);
-      val.expressions = exprList;
-      this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc);
-    } else {
-      val = exprList[0];
-    }
-
-    if (!this.options.createParenthesizedExpressions) {
-      this.addExtra(val, "parenthesized", true);
-      this.addExtra(val, "parenStart", startPos);
-      return val;
-    }
-
-    const parenExpression = this.startNodeAt(startPos, startLoc);
-    parenExpression.expression = val;
-    this.finishNode(parenExpression, "ParenthesizedExpression");
-    return parenExpression;
-  }
-
-  shouldParseArrow() {
-    return !this.canInsertSemicolon();
-  }
-
-  parseArrow(node) {
-    if (this.eat(types.arrow)) {
-      return node;
-    }
-  }
-
-  parseParenItem(node, startPos, startLoc) {
-    return node;
-  }
-
-  parseNew() {
-    const node = this.startNode();
-    let meta = this.startNode();
-    this.next();
-    meta = this.createIdentifier(meta, "new");
-
-    if (this.eat(types.dot)) {
-      const metaProp = this.parseMetaProperty(node, meta, "target");
-
-      if (!this.scope.inNonArrowFunction && !this.scope.inClass) {
-        let error = Errors.UnexpectedNewTarget;
-
-        if (this.hasPlugin("classProperties")) {
-          error += " or class properties";
-        }
-
-        this.raise(metaProp.start, error);
-      }
-
-      return metaProp;
-    }
-
-    node.callee = this.parseNoCallExpr();
-
-    if (node.callee.type === "Import") {
-      this.raise(node.callee.start, Errors.ImportCallNotNewExpression);
-    } else if (node.callee.type === "OptionalMemberExpression" || node.callee.type === "OptionalCallExpression") {
-      this.raise(this.state.lastTokEnd, Errors.OptionalChainingNoNew);
-    } else if (this.eat(types.questionDot)) {
-      this.raise(this.state.start, Errors.OptionalChainingNoNew);
-    }
-
-    this.parseNewArguments(node);
-    return this.finishNode(node, "NewExpression");
-  }
-
-  parseNewArguments(node) {
-    if (this.eat(types.parenL)) {
-      const args = this.parseExprList(types.parenR);
-      this.toReferencedList(args);
-      node.arguments = args;
-    } else {
-      node.arguments = [];
-    }
-  }
-
-  parseTemplateElement(isTagged) {
-    const elem = this.startNode();
-
-    if (this.state.value === null) {
-      if (!isTagged) {
-        this.raise(this.state.start + 1, Errors.InvalidEscapeSequenceTemplate);
-      }
-    }
-
-    elem.value = {
-      raw: this.input.slice(this.state.start, this.state.end).replace(/\r\n?/g, "\n"),
-      cooked: this.state.value
-    };
-    this.next();
-    elem.tail = this.match(types.backQuote);
-    return this.finishNode(elem, "TemplateElement");
-  }
-
-  parseTemplate(isTagged) {
-    const node = this.startNode();
-    this.next();
-    node.expressions = [];
-    let curElt = this.parseTemplateElement(isTagged);
-    node.quasis = [curElt];
-
-    while (!curElt.tail) {
-      this.expect(types.dollarBraceL);
-      node.expressions.push(this.parseExpression());
-      this.expect(types.braceR);
-      node.quasis.push(curElt = this.parseTemplateElement(isTagged));
-    }
-
-    this.next();
-    return this.finishNode(node, "TemplateLiteral");
-  }
-
-  parseObj(close, isPattern, isRecord, refExpressionErrors) {
-    const propHash = Object.create(null);
-    let first = true;
-    const node = this.startNode();
-    node.properties = [];
-    this.next();
-
-    while (!this.eat(close)) {
-      if (first) {
-        first = false;
-      } else {
-        this.expect(types.comma);
-
-        if (this.match(close)) {
-          this.addExtra(node, "trailingComma", this.state.lastTokStart);
-          this.next();
-          break;
-        }
-      }
-
-      const prop = this.parseObjectMember(isPattern, refExpressionErrors);
-
-      if (!isPattern) {
-        this.checkDuplicatedProto(prop, propHash, refExpressionErrors);
-      }
-
-      if (prop.shorthand) {
-        this.addExtra(prop, "shorthand", true);
-      }
-
-      node.properties.push(prop);
-    }
-
-    let type = "ObjectExpression";
-
-    if (isPattern) {
-      type = "ObjectPattern";
-    } else if (isRecord) {
-      type = "RecordExpression";
-    }
-
-    return this.finishNode(node, type);
-  }
-
-  isAsyncProp(prop) {
-    return !prop.computed && prop.key.type === "Identifier" && prop.key.name === "async" && (this.match(types.name) || this.match(types.num) || this.match(types.string) || this.match(types.bracketL) || this.state.type.keyword || this.match(types.star)) && !this.hasPrecedingLineBreak();
-  }
-
-  parseObjectMember(isPattern, refExpressionErrors) {
-    let decorators = [];
-
-    if (this.match(types.at)) {
-      if (this.hasPlugin("decorators")) {
-        this.raise(this.state.start, Errors.UnsupportedPropertyDecorator);
-      }
-
-      while (this.match(types.at)) {
-        decorators.push(this.parseDecorator());
-      }
-    }
-
-    const prop = this.startNode();
-    let isGenerator = false;
-    let isAsync = false;
-    let startPos;
-    let startLoc;
-
-    if (this.match(types.ellipsis)) {
-      if (decorators.length) this.unexpected();
-
-      if (isPattern) {
-        this.next();
-        prop.argument = this.parseIdentifier();
-        this.checkCommaAfterRest(125);
-        return this.finishNode(prop, "RestElement");
-      }
-
-      return this.parseSpread();
-    }
-
-    if (decorators.length) {
-      prop.decorators = decorators;
-      decorators = [];
-    }
-
-    prop.method = false;
-
-    if (isPattern || refExpressionErrors) {
-      startPos = this.state.start;
-      startLoc = this.state.startLoc;
-    }
-
-    if (!isPattern) {
-      isGenerator = this.eat(types.star);
-    }
-
-    const containsEsc = this.state.containsEsc;
-    this.parsePropertyName(prop, false);
-
-    if (!isPattern && !containsEsc && !isGenerator && this.isAsyncProp(prop)) {
-      isAsync = true;
-      isGenerator = this.eat(types.star);
-      this.parsePropertyName(prop, false);
-    } else {
-      isAsync = false;
-    }
-
-    this.parseObjPropValue(prop, startPos, startLoc, isGenerator, isAsync, isPattern, refExpressionErrors, containsEsc);
-    return prop;
-  }
-
-  isGetterOrSetterMethod(prop, isPattern) {
-    return !isPattern && !prop.computed && prop.key.type === "Identifier" && (prop.key.name === "get" || prop.key.name === "set") && (this.match(types.string) || this.match(types.num) || this.match(types.bracketL) || this.match(types.name) || !!this.state.type.keyword);
-  }
-
-  getGetterSetterExpectedParamCount(method) {
-    return method.kind === "get" ? 0 : 1;
-  }
-
-  checkGetterSetterParams(method) {
-    const paramCount = this.getGetterSetterExpectedParamCount(method);
-    const start = method.start;
-
-    if (method.params.length !== paramCount) {
-      if (method.kind === "get") {
-        this.raise(start, Errors.BadGetterArity);
-      } else {
-        this.raise(start, Errors.BadSetterArity);
-      }
-    }
-
-    if (method.kind === "set" && method.params[method.params.length - 1].type === "RestElement") {
-      this.raise(start, Errors.BadSetterRestParameter);
-    }
-  }
-
-  parseObjectMethod(prop, isGenerator, isAsync, isPattern, containsEsc) {
-    if (isAsync || isGenerator || this.match(types.parenL)) {
-      if (isPattern) this.unexpected();
-      prop.kind = "method";
-      prop.method = true;
-      return this.parseMethod(prop, isGenerator, isAsync, false, false, "ObjectMethod");
-    }
-
-    if (!containsEsc && this.isGetterOrSetterMethod(prop, isPattern)) {
-      if (isGenerator || isAsync) this.unexpected();
-      prop.kind = prop.key.name;
-      this.parsePropertyName(prop, false);
-      this.parseMethod(prop, false, false, false, false, "ObjectMethod");
-      this.checkGetterSetterParams(prop);
-      return prop;
-    }
-  }
-
-  parseObjectProperty(prop, startPos, startLoc, isPattern, refExpressionErrors) {
-    prop.shorthand = false;
-
-    if (this.eat(types.colon)) {
-      prop.value = isPattern ? this.parseMaybeDefault(this.state.start, this.state.startLoc) : this.parseMaybeAssign(false, refExpressionErrors);
-      return this.finishNode(prop, "ObjectProperty");
-    }
-
-    if (!prop.computed && prop.key.type === "Identifier") {
-      this.checkReservedWord(prop.key.name, prop.key.start, true, true);
-
-      if (isPattern) {
-        prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key.__clone());
-      } else if (this.match(types.eq) && refExpressionErrors) {
-        if (refExpressionErrors.shorthandAssign === -1) {
-          refExpressionErrors.shorthandAssign = this.state.start;
-        }
-
-        prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key.__clone());
-      } else {
-        prop.value = prop.key.__clone();
-      }
-
-      prop.shorthand = true;
-      return this.finishNode(prop, "ObjectProperty");
-    }
-  }
-
-  parseObjPropValue(prop, startPos, startLoc, isGenerator, isAsync, isPattern, refExpressionErrors, containsEsc) {
-    const node = this.parseObjectMethod(prop, isGenerator, isAsync, isPattern, containsEsc) || this.parseObjectProperty(prop, startPos, startLoc, isPattern, refExpressionErrors);
-    if (!node) this.unexpected();
-    return node;
-  }
-
-  parsePropertyName(prop, isPrivateNameAllowed) {
-    if (this.eat(types.bracketL)) {
-      prop.computed = true;
-      prop.key = this.parseMaybeAssign();
-      this.expect(types.bracketR);
-    } else {
-      const oldInPropertyName = this.state.inPropertyName;
-      this.state.inPropertyName = true;
-      prop.key = this.match(types.num) || this.match(types.string) || this.match(types.bigint) ? this.parseExprAtom() : this.parseMaybePrivateName(isPrivateNameAllowed);
-
-      if (prop.key.type !== "PrivateName") {
-        prop.computed = false;
-      }
-
-      this.state.inPropertyName = oldInPropertyName;
-    }
-
-    return prop.key;
-  }
-
-  initFunction(node, isAsync) {
-    node.id = null;
-    node.generator = false;
-    node.async = !!isAsync;
-  }
-
-  parseMethod(node, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope = false) {
-    const oldYieldPos = this.state.yieldPos;
-    const oldAwaitPos = this.state.awaitPos;
-    this.state.yieldPos = -1;
-    this.state.awaitPos = -1;
-    this.initFunction(node, isAsync);
-    node.generator = !!isGenerator;
-    const allowModifiers = isConstructor;
-    this.scope.enter(SCOPE_FUNCTION | SCOPE_SUPER | (inClassScope ? SCOPE_CLASS : 0) | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0));
-    this.prodParam.enter(functionFlags(isAsync, node.generator));
-    this.parseFunctionParams(node, allowModifiers);
-    this.parseFunctionBodyAndFinish(node, type, true);
-    this.prodParam.exit();
-    this.scope.exit();
-    this.state.yieldPos = oldYieldPos;
-    this.state.awaitPos = oldAwaitPos;
-    return node;
-  }
-
-  parseArrowExpression(node, params, isAsync, trailingCommaPos) {
-    this.scope.enter(SCOPE_FUNCTION | SCOPE_ARROW);
-    this.prodParam.enter(functionFlags(isAsync, false));
-    this.initFunction(node, isAsync);
-    const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;
-    const oldYieldPos = this.state.yieldPos;
-    const oldAwaitPos = this.state.awaitPos;
-
-    if (params) {
-      this.state.maybeInArrowParameters = true;
-      this.setArrowFunctionParameters(node, params, trailingCommaPos);
-    }
-
-    this.state.maybeInArrowParameters = false;
-    this.state.yieldPos = -1;
-    this.state.awaitPos = -1;
-    this.parseFunctionBody(node, true);
-    this.prodParam.exit();
-    this.scope.exit();
-    this.state.maybeInArrowParameters = oldMaybeInArrowParameters;
-    this.state.yieldPos = oldYieldPos;
-    this.state.awaitPos = oldAwaitPos;
-    return this.finishNode(node, "ArrowFunctionExpression");
-  }
-
-  setArrowFunctionParameters(node, params, trailingCommaPos) {
-    node.params = this.toAssignableList(params, trailingCommaPos);
-  }
-
-  parseFunctionBodyAndFinish(node, type, isMethod = false) {
-    this.parseFunctionBody(node, false, isMethod);
-    this.finishNode(node, type);
-  }
-
-  parseFunctionBody(node, allowExpression, isMethod = false) {
-    const isExpression = allowExpression && !this.match(types.braceL);
-    const oldInParameters = this.state.inParameters;
-    this.state.inParameters = false;
-
-    if (isExpression) {
-      node.body = this.parseMaybeAssign();
-      this.checkParams(node, false, allowExpression, false);
-    } else {
-      const oldStrict = this.state.strict;
-      const oldLabels = this.state.labels;
-      this.state.labels = [];
-      this.prodParam.enter(this.prodParam.currentFlags() | PARAM_RETURN);
-      node.body = this.parseBlock(true, false, hasStrictModeDirective => {
-        const nonSimple = !this.isSimpleParamList(node.params);
-
-        if (hasStrictModeDirective && nonSimple) {
-          const errorPos = (node.kind === "method" || node.kind === "constructor") && !!node.key ? node.key.end : node.start;
-          this.raise(errorPos, Errors.IllegalLanguageModeDirective);
-        }
-
-        const strictModeChanged = !oldStrict && this.state.strict;
-        this.checkParams(node, !this.state.strict && !allowExpression && !isMethod && !nonSimple, allowExpression, strictModeChanged);
-
-        if (this.state.strict && node.id) {
-          this.checkLVal(node.id, BIND_OUTSIDE, undefined, "function name", undefined, strictModeChanged);
-        }
-      });
-      this.prodParam.exit();
-      this.state.labels = oldLabels;
-    }
-
-    this.state.inParameters = oldInParameters;
-  }
-
-  isSimpleParamList(params) {
-    for (let i = 0, len = params.length; i < len; i++) {
-      if (params[i].type !== "Identifier") return false;
-    }
-
-    return true;
-  }
-
-  checkParams(node, allowDuplicates, isArrowFunction, strictModeChanged = true) {
-    const nameHash = Object.create(null);
-
-    for (let i = 0; i < node.params.length; i++) {
-      this.checkLVal(node.params[i], BIND_VAR, allowDuplicates ? null : nameHash, "function parameter list", undefined, strictModeChanged);
-    }
-  }
-
-  parseExprList(close, allowEmpty, refExpressionErrors, nodeForExtra) {
-    const elts = [];
-    let first = true;
-
-    while (!this.eat(close)) {
-      if (first) {
-        first = false;
-      } else {
-        this.expect(types.comma);
-
-        if (this.match(close)) {
-          if (nodeForExtra) {
-            this.addExtra(nodeForExtra, "trailingComma", this.state.lastTokStart);
-          }
-
-          this.next();
-          break;
-        }
-      }
-
-      elts.push(this.parseExprListItem(allowEmpty, refExpressionErrors));
-    }
-
-    return elts;
-  }
-
-  parseExprListItem(allowEmpty, refExpressionErrors, refNeedsArrowPos, allowPlaceholder) {
-    let elt;
-
-    if (allowEmpty && this.match(types.comma)) {
-      elt = null;
-    } else if (this.match(types.ellipsis)) {
-      const spreadNodeStartPos = this.state.start;
-      const spreadNodeStartLoc = this.state.startLoc;
-      elt = this.parseParenItem(this.parseSpread(refExpressionErrors, refNeedsArrowPos), spreadNodeStartPos, spreadNodeStartLoc);
-    } else if (this.match(types.question)) {
-      this.expectPlugin("partialApplication");
-
-      if (!allowPlaceholder) {
-        this.raise(this.state.start, Errors.UnexpectedArgumentPlaceholder);
-      }
-
-      const node = this.startNode();
-      this.next();
-      elt = this.finishNode(node, "ArgumentPlaceholder");
-    } else {
-      elt = this.parseMaybeAssign(false, refExpressionErrors, this.parseParenItem, refNeedsArrowPos);
-    }
-
-    return elt;
-  }
-
-  parseIdentifier(liberal) {
-    const node = this.startNode();
-    const name = this.parseIdentifierName(node.start, liberal);
-    return this.createIdentifier(node, name);
-  }
-
-  createIdentifier(node, name) {
-    node.name = name;
-    node.loc.identifierName = name;
-    return this.finishNode(node, "Identifier");
-  }
-
-  parseIdentifierName(pos, liberal) {
-    let name;
-
-    if (this.match(types.name)) {
-      name = this.state.value;
-    } else if (this.state.type.keyword) {
-      name = this.state.type.keyword;
-
-      if ((name === "class" || name === "function") && (this.state.lastTokEnd !== this.state.lastTokStart + 1 || this.input.charCodeAt(this.state.lastTokStart) !== 46)) {
-        this.state.context.pop();
-      }
-    } else {
-      throw this.unexpected();
-    }
-
-    if (liberal) {
-      this.state.type = types.name;
-    } else {
-      this.checkReservedWord(name, this.state.start, !!this.state.type.keyword, false);
-    }
-
-    this.next();
-    return name;
-  }
-
-  checkReservedWord(word, startLoc, checkKeywords, isBinding) {
-    if (this.prodParam.hasYield && word === "yield") {
-      this.raise(startLoc, Errors.YieldBindingIdentifier);
-      return;
-    }
-
-    if (word === "await") {
-      if (this.prodParam.hasAwait) {
-        this.raise(startLoc, Errors.AwaitBindingIdentifier);
-        return;
-      }
-
-      if (this.state.awaitPos === -1 && (this.state.maybeInAsyncArrowHead || this.isAwaitAllowed())) {
-        this.state.awaitPos = this.state.start;
-      }
-    }
-
-    if (this.scope.inClass && !this.scope.inNonArrowFunction && word === "arguments") {
-      this.raise(startLoc, Errors.ArgumentsDisallowedInInitializer);
-      return;
-    }
-
-    if (checkKeywords && isKeyword(word)) {
-      this.raise(startLoc, Errors.UnexpectedKeyword, word);
-      return;
-    }
-
-    const reservedTest = !this.state.strict ? isReservedWord : isBinding ? isStrictBindReservedWord : isStrictReservedWord;
-
-    if (reservedTest(word, this.inModule)) {
-      if (!this.prodParam.hasAwait && word === "await") {
-        this.raise(startLoc, Errors.AwaitNotInAsyncFunction);
-      } else {
-        this.raise(startLoc, Errors.UnexpectedReservedWord, word);
-      }
-    }
-  }
-
-  isAwaitAllowed() {
-    if (this.scope.inFunction) return this.prodParam.hasAwait;
-    if (this.options.allowAwaitOutsideFunction) return true;
-
-    if (this.hasPlugin("topLevelAwait")) {
-      return this.inModule && this.prodParam.hasAwait;
-    }
-
-    return false;
-  }
-
-  parseAwait() {
-    const node = this.startNode();
-    this.next();
-
-    if (this.state.inParameters) {
-      this.raise(node.start, Errors.AwaitExpressionFormalParameter);
-    } else if (this.state.awaitPos === -1) {
-      this.state.awaitPos = node.start;
-    }
-
-    if (this.eat(types.star)) {
-      this.raise(node.start, Errors.ObsoleteAwaitStar);
-    }
-
-    if (!this.scope.inFunction && !this.options.allowAwaitOutsideFunction) {
-      if (this.hasPrecedingLineBreak() || this.match(types.plusMin) || this.match(types.parenL) || this.match(types.bracketL) || this.match(types.backQuote) || this.match(types.regexp) || this.match(types.slash) || this.hasPlugin("v8intrinsic") && this.match(types.modulo)) {
-        this.ambiguousScriptDifferentAst = true;
-      } else {
-        this.sawUnambiguousESM = true;
-      }
-    }
-
-    if (!this.state.soloAwait) {
-      node.argument = this.parseMaybeUnary();
-    }
-
-    return this.finishNode(node, "AwaitExpression");
-  }
-
-  parseYield(noIn) {
-    const node = this.startNode();
-
-    if (this.state.inParameters) {
-      this.raise(node.start, Errors.YieldInParameter);
-    } else if (this.state.yieldPos === -1) {
-      this.state.yieldPos = node.start;
-    }
-
-    this.next();
-
-    if (this.match(types.semi) || !this.match(types.star) && !this.state.type.startsExpr || this.hasPrecedingLineBreak()) {
-      node.delegate = false;
-      node.argument = null;
-    } else {
-      node.delegate = this.eat(types.star);
-      node.argument = this.parseMaybeAssign(noIn);
-    }
-
-    return this.finishNode(node, "YieldExpression");
-  }
-
-  checkPipelineAtInfixOperator(left, leftStartPos) {
-    if (this.getPluginOption("pipelineOperator", "proposal") === "smart") {
-      if (left.type === "SequenceExpression") {
-        this.raise(leftStartPos, Errors.PipelineHeadSequenceExpression);
-      }
-    }
-  }
-
-  parseSmartPipelineBody(childExpression, startPos, startLoc) {
-    const pipelineStyle = this.checkSmartPipelineBodyStyle(childExpression);
-    this.checkSmartPipelineBodyEarlyErrors(childExpression, pipelineStyle, startPos);
-    return this.parseSmartPipelineBodyInStyle(childExpression, pipelineStyle, startPos, startLoc);
-  }
-
-  checkSmartPipelineBodyEarlyErrors(childExpression, pipelineStyle, startPos) {
-    if (this.match(types.arrow)) {
-      throw this.raise(this.state.start, Errors.PipelineBodyNoArrow);
-    } else if (pipelineStyle === "PipelineTopicExpression" && childExpression.type === "SequenceExpression") {
-      this.raise(startPos, Errors.PipelineBodySequenceExpression);
-    }
-  }
-
-  parseSmartPipelineBodyInStyle(childExpression, pipelineStyle, startPos, startLoc) {
-    const bodyNode = this.startNodeAt(startPos, startLoc);
-
-    switch (pipelineStyle) {
-      case "PipelineBareFunction":
-        bodyNode.callee = childExpression;
-        break;
-
-      case "PipelineBareConstructor":
-        bodyNode.callee = childExpression.callee;
-        break;
-
-      case "PipelineBareAwaitedFunction":
-        bodyNode.callee = childExpression.argument;
-        break;
-
-      case "PipelineTopicExpression":
-        if (!this.topicReferenceWasUsedInCurrentTopicContext()) {
-          this.raise(startPos, Errors.PipelineTopicUnused);
-        }
-
-        bodyNode.expression = childExpression;
-        break;
-
-      default:
-        throw new Error(`Internal @babel/parser error: Unknown pipeline style (${pipelineStyle})`);
-    }
-
-    return this.finishNode(bodyNode, pipelineStyle);
-  }
-
-  checkSmartPipelineBodyStyle(expression) {
-    switch (expression.type) {
-      default:
-        return this.isSimpleReference(expression) ? "PipelineBareFunction" : "PipelineTopicExpression";
-    }
-  }
-
-  isSimpleReference(expression) {
-    switch (expression.type) {
-      case "MemberExpression":
-        return !expression.computed && this.isSimpleReference(expression.object);
-
-      case "Identifier":
-        return true;
-
-      default:
-        return false;
-    }
-  }
-
-  withTopicPermittingContext(callback) {
-    const outerContextTopicState = this.state.topicContext;
-    this.state.topicContext = {
-      maxNumOfResolvableTopics: 1,
-      maxTopicIndex: null
-    };
-
-    try {
-      return callback();
-    } finally {
-      this.state.topicContext = outerContextTopicState;
-    }
-  }
-
-  withTopicForbiddingContext(callback) {
-    const outerContextTopicState = this.state.topicContext;
-    this.state.topicContext = {
-      maxNumOfResolvableTopics: 0,
-      maxTopicIndex: null
-    };
-
-    try {
-      return callback();
-    } finally {
-      this.state.topicContext = outerContextTopicState;
-    }
-  }
-
-  withSoloAwaitPermittingContext(callback) {
-    const outerContextSoloAwaitState = this.state.soloAwait;
-    this.state.soloAwait = true;
-
-    try {
-      return callback();
-    } finally {
-      this.state.soloAwait = outerContextSoloAwaitState;
-    }
-  }
-
-  registerTopicReference() {
-    this.state.topicContext.maxTopicIndex = 0;
-  }
-
-  primaryTopicReferenceIsAllowedInCurrentTopicContext() {
-    return this.state.topicContext.maxNumOfResolvableTopics >= 1;
-  }
-
-  topicReferenceWasUsedInCurrentTopicContext() {
-    return this.state.topicContext.maxTopicIndex != null && this.state.topicContext.maxTopicIndex >= 0;
-  }
-
-  parseFSharpPipelineBody(prec, noIn) {
-    const startPos = this.state.start;
-    const startLoc = this.state.startLoc;
-    this.state.potentialArrowAt = this.state.start;
-    const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;
-    this.state.inFSharpPipelineDirectBody = true;
-    const ret = this.parseExprOp(this.parseMaybeUnary(), startPos, startLoc, prec, noIn);
-    this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;
-    return ret;
-  }
-
-}
-
-const loopLabel = {
-  kind: "loop"
-},
-      switchLabel = {
-  kind: "switch"
-};
-const FUNC_NO_FLAGS = 0b000,
-      FUNC_STATEMENT = 0b001,
-      FUNC_HANGING_STATEMENT = 0b010,
-      FUNC_NULLABLE_ID = 0b100;
-class StatementParser extends ExpressionParser {
-  parseTopLevel(file, program) {
-    program.sourceType = this.options.sourceType;
-    program.interpreter = this.parseInterpreterDirective();
-    this.parseBlockBody(program, true, true, types.eof);
-
-    if (this.inModule && !this.options.allowUndeclaredExports && this.scope.undefinedExports.size > 0) {
-      for (let _i = 0, _Array$from = Array.from(this.scope.undefinedExports); _i < _Array$from.length; _i++) {
-        const [name] = _Array$from[_i];
-        const pos = this.scope.undefinedExports.get(name);
-        this.raise(pos, Errors.ModuleExportUndefined, name);
-      }
-    }
-
-    file.program = this.finishNode(program, "Program");
-    file.comments = this.state.comments;
-    if (this.options.tokens) file.tokens = this.tokens;
-    return this.finishNode(file, "File");
-  }
-
-  stmtToDirective(stmt) {
-    const expr = stmt.expression;
-    const directiveLiteral = this.startNodeAt(expr.start, expr.loc.start);
-    const directive = this.startNodeAt(stmt.start, stmt.loc.start);
-    const raw = this.input.slice(expr.start, expr.end);
-    const val = directiveLiteral.value = raw.slice(1, -1);
-    this.addExtra(directiveLiteral, "raw", raw);
-    this.addExtra(directiveLiteral, "rawValue", val);
-    directive.value = this.finishNodeAt(directiveLiteral, "DirectiveLiteral", expr.end, expr.loc.end);
-    return this.finishNodeAt(directive, "Directive", stmt.end, stmt.loc.end);
-  }
-
-  parseInterpreterDirective() {
-    if (!this.match(types.interpreterDirective)) {
-      return null;
-    }
-
-    const node = this.startNode();
-    node.value = this.state.value;
-    this.next();
-    return this.finishNode(node, "InterpreterDirective");
-  }
-
-  isLet(context) {
-    if (!this.isContextual("let")) {
-      return false;
-    }
-
-    const next = this.nextTokenStart();
-    const nextCh = this.input.charCodeAt(next);
-    if (nextCh === 91) return true;
-    if (context) return false;
-    if (nextCh === 123) return true;
-
-    if (isIdentifierStart(nextCh)) {
-      let pos = next + 1;
-
-      while (isIdentifierChar(this.input.charCodeAt(pos))) {
-        ++pos;
-      }
-
-      const ident = this.input.slice(next, pos);
-      if (!keywordRelationalOperator.test(ident)) return true;
-    }
-
-    return false;
-  }
-
-  parseStatement(context, topLevel) {
-    if (this.match(types.at)) {
-      this.parseDecorators(true);
-    }
-
-    return this.parseStatementContent(context, topLevel);
-  }
-
-  parseStatementContent(context, topLevel) {
-    let starttype = this.state.type;
-    const node = this.startNode();
-    let kind;
-
-    if (this.isLet(context)) {
-      starttype = types._var;
-      kind = "let";
-    }
-
-    switch (starttype) {
-      case types._break:
-      case types._continue:
-        return this.parseBreakContinueStatement(node, starttype.keyword);
-
-      case types._debugger:
-        return this.parseDebuggerStatement(node);
-
-      case types._do:
-        return this.parseDoStatement(node);
-
-      case types._for:
-        return this.parseForStatement(node);
-
-      case types._function:
-        if (this.lookaheadCharCode() === 46) break;
-
-        if (context) {
-          if (this.state.strict) {
-            this.raise(this.state.start, Errors.StrictFunction);
-          } else if (context !== "if" && context !== "label") {
-            this.raise(this.state.start, Errors.SloppyFunction);
-          }
-        }
-
-        return this.parseFunctionStatement(node, false, !context);
-
-      case types._class:
-        if (context) this.unexpected();
-        return this.parseClass(node, true);
-
-      case types._if:
-        return this.parseIfStatement(node);
-
-      case types._return:
-        return this.parseReturnStatement(node);
-
-      case types._switch:
-        return this.parseSwitchStatement(node);
-
-      case types._throw:
-        return this.parseThrowStatement(node);
-
-      case types._try:
-        return this.parseTryStatement(node);
-
-      case types._const:
-      case types._var:
-        kind = kind || this.state.value;
-
-        if (context && kind !== "var") {
-          this.raise(this.state.start, Errors.UnexpectedLexicalDeclaration);
-        }
-
-        return this.parseVarStatement(node, kind);
-
-      case types._while:
-        return this.parseWhileStatement(node);
-
-      case types._with:
-        return this.parseWithStatement(node);
-
-      case types.braceL:
-        return this.parseBlock();
-
-      case types.semi:
-        return this.parseEmptyStatement(node);
-
-      case types._export:
-      case types._import:
-        {
-          const nextTokenCharCode = this.lookaheadCharCode();
-
-          if (nextTokenCharCode === 40 || nextTokenCharCode === 46) {
-            break;
-          }
-
-          if (!this.options.allowImportExportEverywhere && !topLevel) {
-            this.raise(this.state.start, Errors.UnexpectedImportExport);
-          }
-
-          this.next();
-          let result;
-
-          if (starttype === types._import) {
-            result = this.parseImport(node);
-
-            if (result.type === "ImportDeclaration" && (!result.importKind || result.importKind === "value")) {
-              this.sawUnambiguousESM = true;
-            }
-          } else {
-            result = this.parseExport(node);
-
-            if (result.type === "ExportNamedDeclaration" && (!result.exportKind || result.exportKind === "value") || result.type === "ExportAllDeclaration" && (!result.exportKind || result.exportKind === "value") || result.type === "ExportDefaultDeclaration") {
-              this.sawUnambiguousESM = true;
-            }
-          }
-
-          this.assertModuleNodeAllowed(node);
-          return result;
-        }
-
-      default:
-        {
-          if (this.isAsyncFunction()) {
-            if (context) {
-              this.raise(this.state.start, Errors.AsyncFunctionInSingleStatementContext);
-            }
-
-            this.next();
-            return this.parseFunctionStatement(node, true, !context);
-          }
-        }
-    }
-
-    const maybeName = this.state.value;
-    const expr = this.parseExpression();
-
-    if (starttype === types.name && expr.type === "Identifier" && this.eat(types.colon)) {
-      return this.parseLabeledStatement(node, maybeName, expr, context);
-    } else {
-      return this.parseExpressionStatement(node, expr);
-    }
-  }
-
-  assertModuleNodeAllowed(node) {
-    if (!this.options.allowImportExportEverywhere && !this.inModule) {
-      this.raiseWithData(node.start, {
-        code: "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED"
-      }, Errors.ImportOutsideModule);
-    }
-  }
-
-  takeDecorators(node) {
-    const decorators = this.state.decoratorStack[this.state.decoratorStack.length - 1];
-
-    if (decorators.length) {
-      node.decorators = decorators;
-      this.resetStartLocationFromNode(node, decorators[0]);
-      this.state.decoratorStack[this.state.decoratorStack.length - 1] = [];
-    }
-  }
-
-  canHaveLeadingDecorator() {
-    return this.match(types._class);
-  }
-
-  parseDecorators(allowExport) {
-    const currentContextDecorators = this.state.decoratorStack[this.state.decoratorStack.length - 1];
-
-    while (this.match(types.at)) {
-      const decorator = this.parseDecorator();
-      currentContextDecorators.push(decorator);
-    }
-
-    if (this.match(types._export)) {
-      if (!allowExport) {
-        this.unexpected();
-      }
-
-      if (this.hasPlugin("decorators") && !this.getPluginOption("decorators", "decoratorsBeforeExport")) {
-        this.raise(this.state.start, Errors.DecoratorExportClass);
-      }
-    } else if (!this.canHaveLeadingDecorator()) {
-      throw this.raise(this.state.start, Errors.UnexpectedLeadingDecorator);
-    }
-  }
-
-  parseDecorator() {
-    this.expectOnePlugin(["decorators-legacy", "decorators"]);
-    const node = this.startNode();
-    this.next();
-
-    if (this.hasPlugin("decorators")) {
-      this.state.decoratorStack.push([]);
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-      let expr;
-
-      if (this.eat(types.parenL)) {
-        expr = this.parseExpression();
-        this.expect(types.parenR);
-      } else {
-        expr = this.parseIdentifier(false);
-
-        while (this.eat(types.dot)) {
-          const node = this.startNodeAt(startPos, startLoc);
-          node.object = expr;
-          node.property = this.parseIdentifier(true);
-          node.computed = false;
-          expr = this.finishNode(node, "MemberExpression");
-        }
-      }
-
-      node.expression = this.parseMaybeDecoratorArguments(expr);
-      this.state.decoratorStack.pop();
-    } else {
-      node.expression = this.parseExprSubscripts();
-    }
-
-    return this.finishNode(node, "Decorator");
-  }
-
-  parseMaybeDecoratorArguments(expr) {
-    if (this.eat(types.parenL)) {
-      const node = this.startNodeAtNode(expr);
-      node.callee = expr;
-      node.arguments = this.parseCallExpressionArguments(types.parenR, false);
-      this.toReferencedList(node.arguments);
-      return this.finishNode(node, "CallExpression");
-    }
-
-    return expr;
-  }
-
-  parseBreakContinueStatement(node, keyword) {
-    const isBreak = keyword === "break";
-    this.next();
-
-    if (this.isLineTerminator()) {
-      node.label = null;
-    } else {
-      node.label = this.parseIdentifier();
-      this.semicolon();
-    }
-
-    this.verifyBreakContinue(node, keyword);
-    return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement");
-  }
-
-  verifyBreakContinue(node, keyword) {
-    const isBreak = keyword === "break";
-    let i;
-
-    for (i = 0; i < this.state.labels.length; ++i) {
-      const lab = this.state.labels[i];
-
-      if (node.label == null || lab.name === node.label.name) {
-        if (lab.kind != null && (isBreak || lab.kind === "loop")) break;
-        if (node.label && isBreak) break;
-      }
-    }
-
-    if (i === this.state.labels.length) {
-      this.raise(node.start, Errors.IllegalBreakContinue, keyword);
-    }
-  }
-
-  parseDebuggerStatement(node) {
-    this.next();
-    this.semicolon();
-    return this.finishNode(node, "DebuggerStatement");
-  }
-
-  parseHeaderExpression() {
-    this.expect(types.parenL);
-    const val = this.parseExpression();
-    this.expect(types.parenR);
-    return val;
-  }
-
-  parseDoStatement(node) {
-    this.next();
-    this.state.labels.push(loopLabel);
-    node.body = this.withTopicForbiddingContext(() => this.parseStatement("do"));
-    this.state.labels.pop();
-    this.expect(types._while);
-    node.test = this.parseHeaderExpression();
-    this.eat(types.semi);
-    return this.finishNode(node, "DoWhileStatement");
-  }
-
-  parseForStatement(node) {
-    this.next();
-    this.state.labels.push(loopLabel);
-    let awaitAt = -1;
-
-    if (this.isAwaitAllowed() && this.eatContextual("await")) {
-      awaitAt = this.state.lastTokStart;
-    }
-
-    this.scope.enter(SCOPE_OTHER);
-    this.expect(types.parenL);
-
-    if (this.match(types.semi)) {
-      if (awaitAt > -1) {
-        this.unexpected(awaitAt);
-      }
-
-      return this.parseFor(node, null);
-    }
-
-    const isLet = this.isLet();
-
-    if (this.match(types._var) || this.match(types._const) || isLet) {
-      const init = this.startNode();
-      const kind = isLet ? "let" : this.state.value;
-      this.next();
-      this.parseVar(init, true, kind);
-      this.finishNode(init, "VariableDeclaration");
-
-      if ((this.match(types._in) || this.isContextual("of")) && init.declarations.length === 1) {
-        return this.parseForIn(node, init, awaitAt);
-      }
-
-      if (awaitAt > -1) {
-        this.unexpected(awaitAt);
-      }
-
-      return this.parseFor(node, init);
-    }
-
-    const refExpressionErrors = new ExpressionErrors();
-    const init = this.parseExpression(true, refExpressionErrors);
-
-    if (this.match(types._in) || this.isContextual("of")) {
-      this.toAssignable(init);
-      const description = this.isContextual("of") ? "for-of statement" : "for-in statement";
-      this.checkLVal(init, undefined, undefined, description);
-      return this.parseForIn(node, init, awaitAt);
-    } else {
-      this.checkExpressionErrors(refExpressionErrors, true);
-    }
-
-    if (awaitAt > -1) {
-      this.unexpected(awaitAt);
-    }
-
-    return this.parseFor(node, init);
-  }
-
-  parseFunctionStatement(node, isAsync, declarationPosition) {
-    this.next();
-    return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), isAsync);
-  }
-
-  parseIfStatement(node) {
-    this.next();
-    node.test = this.parseHeaderExpression();
-    node.consequent = this.parseStatement("if");
-    node.alternate = this.eat(types._else) ? this.parseStatement("if") : null;
-    return this.finishNode(node, "IfStatement");
-  }
-
-  parseReturnStatement(node) {
-    if (!this.prodParam.hasReturn && !this.options.allowReturnOutsideFunction) {
-      this.raise(this.state.start, Errors.IllegalReturn);
-    }
-
-    this.next();
-
-    if (this.isLineTerminator()) {
-      node.argument = null;
-    } else {
-      node.argument = this.parseExpression();
-      this.semicolon();
-    }
-
-    return this.finishNode(node, "ReturnStatement");
-  }
-
-  parseSwitchStatement(node) {
-    this.next();
-    node.discriminant = this.parseHeaderExpression();
-    const cases = node.cases = [];
-    this.expect(types.braceL);
-    this.state.labels.push(switchLabel);
-    this.scope.enter(SCOPE_OTHER);
-    let cur;
-
-    for (let sawDefault; !this.match(types.braceR);) {
-      if (this.match(types._case) || this.match(types._default)) {
-        const isCase = this.match(types._case);
-        if (cur) this.finishNode(cur, "SwitchCase");
-        cases.push(cur = this.startNode());
-        cur.consequent = [];
-        this.next();
-
-        if (isCase) {
-          cur.test = this.parseExpression();
-        } else {
-          if (sawDefault) {
-            this.raise(this.state.lastTokStart, Errors.MultipleDefaultsInSwitch);
-          }
-
-          sawDefault = true;
-          cur.test = null;
-        }
-
-        this.expect(types.colon);
-      } else {
-        if (cur) {
-          cur.consequent.push(this.parseStatement(null));
-        } else {
-          this.unexpected();
-        }
-      }
-    }
-
-    this.scope.exit();
-    if (cur) this.finishNode(cur, "SwitchCase");
-    this.next();
-    this.state.labels.pop();
-    return this.finishNode(node, "SwitchStatement");
-  }
-
-  parseThrowStatement(node) {
-    this.next();
-
-    if (lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start))) {
-      this.raise(this.state.lastTokEnd, Errors.NewlineAfterThrow);
-    }
-
-    node.argument = this.parseExpression();
-    this.semicolon();
-    return this.finishNode(node, "ThrowStatement");
-  }
-
-  parseTryStatement(node) {
-    this.next();
-    node.block = this.parseBlock();
-    node.handler = null;
-
-    if (this.match(types._catch)) {
-      const clause = this.startNode();
-      this.next();
-
-      if (this.match(types.parenL)) {
-        this.expect(types.parenL);
-        clause.param = this.parseBindingAtom();
-        const simple = clause.param.type === "Identifier";
-        this.scope.enter(simple ? SCOPE_SIMPLE_CATCH : 0);
-        this.checkLVal(clause.param, BIND_LEXICAL, null, "catch clause");
-        this.expect(types.parenR);
-      } else {
-        clause.param = null;
-        this.scope.enter(SCOPE_OTHER);
-      }
-
-      clause.body = this.withTopicForbiddingContext(() => this.parseBlock(false, false));
-      this.scope.exit();
-      node.handler = this.finishNode(clause, "CatchClause");
-    }
-
-    node.finalizer = this.eat(types._finally) ? this.parseBlock() : null;
-
-    if (!node.handler && !node.finalizer) {
-      this.raise(node.start, Errors.NoCatchOrFinally);
-    }
-
-    return this.finishNode(node, "TryStatement");
-  }
-
-  parseVarStatement(node, kind) {
-    this.next();
-    this.parseVar(node, false, kind);
-    this.semicolon();
-    return this.finishNode(node, "VariableDeclaration");
-  }
-
-  parseWhileStatement(node) {
-    this.next();
-    node.test = this.parseHeaderExpression();
-    this.state.labels.push(loopLabel);
-    node.body = this.withTopicForbiddingContext(() => this.parseStatement("while"));
-    this.state.labels.pop();
-    return this.finishNode(node, "WhileStatement");
-  }
-
-  parseWithStatement(node) {
-    if (this.state.strict) {
-      this.raise(this.state.start, Errors.StrictWith);
-    }
-
-    this.next();
-    node.object = this.parseHeaderExpression();
-    node.body = this.withTopicForbiddingContext(() => this.parseStatement("with"));
-    return this.finishNode(node, "WithStatement");
-  }
-
-  parseEmptyStatement(node) {
-    this.next();
-    return this.finishNode(node, "EmptyStatement");
-  }
-
-  parseLabeledStatement(node, maybeName, expr, context) {
-    for (let _i2 = 0, _this$state$labels = this.state.labels; _i2 < _this$state$labels.length; _i2++) {
-      const label = _this$state$labels[_i2];
-
-      if (label.name === maybeName) {
-        this.raise(expr.start, Errors.LabelRedeclaration, maybeName);
-      }
-    }
-
-    const kind = this.state.type.isLoop ? "loop" : this.match(types._switch) ? "switch" : null;
-
-    for (let i = this.state.labels.length - 1; i >= 0; i--) {
-      const label = this.state.labels[i];
-
-      if (label.statementStart === node.start) {
-        label.statementStart = this.state.start;
-        label.kind = kind;
-      } else {
-        break;
-      }
-    }
-
-    this.state.labels.push({
-      name: maybeName,
-      kind: kind,
-      statementStart: this.state.start
-    });
-    node.body = this.parseStatement(context ? context.indexOf("label") === -1 ? context + "label" : context : "label");
-    this.state.labels.pop();
-    node.label = expr;
-    return this.finishNode(node, "LabeledStatement");
-  }
-
-  parseExpressionStatement(node, expr) {
-    node.expression = expr;
-    this.semicolon();
-    return this.finishNode(node, "ExpressionStatement");
-  }
-
-  parseBlock(allowDirectives = false, createNewLexicalScope = true, afterBlockParse) {
-    const node = this.startNode();
-    this.expect(types.braceL);
-
-    if (createNewLexicalScope) {
-      this.scope.enter(SCOPE_OTHER);
-    }
-
-    this.parseBlockBody(node, allowDirectives, false, types.braceR, afterBlockParse);
-
-    if (createNewLexicalScope) {
-      this.scope.exit();
-    }
-
-    return this.finishNode(node, "BlockStatement");
-  }
-
-  isValidDirective(stmt) {
-    return stmt.type === "ExpressionStatement" && stmt.expression.type === "StringLiteral" && !stmt.expression.extra.parenthesized;
-  }
-
-  parseBlockBody(node, allowDirectives, topLevel, end, afterBlockParse) {
-    const body = node.body = [];
-    const directives = node.directives = [];
-    this.parseBlockOrModuleBlockBody(body, allowDirectives ? directives : undefined, topLevel, end, afterBlockParse);
-  }
-
-  parseBlockOrModuleBlockBody(body, directives, topLevel, end, afterBlockParse) {
-    const octalPositions = [];
-    const oldStrict = this.state.strict;
-    let hasStrictModeDirective = false;
-    let parsedNonDirective = false;
-
-    while (!this.match(end)) {
-      if (!parsedNonDirective && this.state.octalPositions.length) {
-        octalPositions.push(...this.state.octalPositions);
-      }
-
-      const stmt = this.parseStatement(null, topLevel);
-
-      if (directives && !parsedNonDirective && this.isValidDirective(stmt)) {
-        const directive = this.stmtToDirective(stmt);
-        directives.push(directive);
-
-        if (!hasStrictModeDirective && directive.value.value === "use strict") {
-          hasStrictModeDirective = true;
-          this.setStrict(true);
-        }
-
-        continue;
-      }
-
-      parsedNonDirective = true;
-      body.push(stmt);
-    }
-
-    if (this.state.strict && octalPositions.length) {
-      for (let _i3 = 0; _i3 < octalPositions.length; _i3++) {
-        const pos = octalPositions[_i3];
-        this.raise(pos, Errors.StrictOctalLiteral);
-      }
-    }
-
-    if (afterBlockParse) {
-      afterBlockParse.call(this, hasStrictModeDirective);
-    }
-
-    if (!oldStrict) {
-      this.setStrict(false);
-    }
-
-    this.next();
-  }
-
-  parseFor(node, init) {
-    node.init = init;
-    this.expect(types.semi);
-    node.test = this.match(types.semi) ? null : this.parseExpression();
-    this.expect(types.semi);
-    node.update = this.match(types.parenR) ? null : this.parseExpression();
-    this.expect(types.parenR);
-    node.body = this.withTopicForbiddingContext(() => this.parseStatement("for"));
-    this.scope.exit();
-    this.state.labels.pop();
-    return this.finishNode(node, "ForStatement");
-  }
-
-  parseForIn(node, init, awaitAt) {
-    const isForIn = this.match(types._in);
-    this.next();
-
-    if (isForIn) {
-      if (awaitAt > -1) this.unexpected(awaitAt);
-    } else {
-      node.await = awaitAt > -1;
-    }
-
-    if (init.type === "VariableDeclaration" && init.declarations[0].init != null && (!isForIn || this.state.strict || init.kind !== "var" || init.declarations[0].id.type !== "Identifier")) {
-      this.raise(init.start, Errors.ForInOfLoopInitializer, isForIn ? "for-in" : "for-of");
-    } else if (init.type === "AssignmentPattern") {
-      this.raise(init.start, Errors.InvalidLhs, "for-loop");
-    }
-
-    node.left = init;
-    node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign();
-    this.expect(types.parenR);
-    node.body = this.withTopicForbiddingContext(() => this.parseStatement("for"));
-    this.scope.exit();
-    this.state.labels.pop();
-    return this.finishNode(node, isForIn ? "ForInStatement" : "ForOfStatement");
-  }
-
-  parseVar(node, isFor, kind) {
-    const declarations = node.declarations = [];
-    const isTypescript = this.hasPlugin("typescript");
-    node.kind = kind;
-
-    for (;;) {
-      const decl = this.startNode();
-      this.parseVarId(decl, kind);
-
-      if (this.eat(types.eq)) {
-        decl.init = this.parseMaybeAssign(isFor);
-      } else {
-        if (kind === "const" && !(this.match(types._in) || this.isContextual("of"))) {
-          if (!isTypescript) {
-            this.unexpected();
-          }
-        } else if (decl.id.type !== "Identifier" && !(isFor && (this.match(types._in) || this.isContextual("of")))) {
-          this.raise(this.state.lastTokEnd, Errors.DeclarationMissingInitializer, "Complex binding patterns");
-        }
-
-        decl.init = null;
-      }
-
-      declarations.push(this.finishNode(decl, "VariableDeclarator"));
-      if (!this.eat(types.comma)) break;
-    }
-
-    return node;
-  }
-
-  parseVarId(decl, kind) {
-    decl.id = this.parseBindingAtom();
-    this.checkLVal(decl.id, kind === "var" ? BIND_VAR : BIND_LEXICAL, undefined, "variable declaration", kind !== "var");
-  }
-
-  parseFunction(node, statement = FUNC_NO_FLAGS, isAsync = false) {
-    const isStatement = statement & FUNC_STATEMENT;
-    const isHangingStatement = statement & FUNC_HANGING_STATEMENT;
-    const requireId = !!isStatement && !(statement & FUNC_NULLABLE_ID);
-    this.initFunction(node, isAsync);
-
-    if (this.match(types.star) && isHangingStatement) {
-      this.raise(this.state.start, Errors.GeneratorInSingleStatementContext);
-    }
-
-    node.generator = this.eat(types.star);
-
-    if (isStatement) {
-      node.id = this.parseFunctionId(requireId);
-    }
-
-    const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;
-    const oldYieldPos = this.state.yieldPos;
-    const oldAwaitPos = this.state.awaitPos;
-    this.state.maybeInArrowParameters = false;
-    this.state.yieldPos = -1;
-    this.state.awaitPos = -1;
-    this.scope.enter(SCOPE_FUNCTION);
-    this.prodParam.enter(functionFlags(isAsync, node.generator));
-
-    if (!isStatement) {
-      node.id = this.parseFunctionId();
-    }
-
-    this.parseFunctionParams(node);
-    this.withTopicForbiddingContext(() => {
-      this.parseFunctionBodyAndFinish(node, isStatement ? "FunctionDeclaration" : "FunctionExpression");
-    });
-    this.prodParam.exit();
-    this.scope.exit();
-
-    if (isStatement && !isHangingStatement) {
-      this.registerFunctionStatementId(node);
-    }
-
-    this.state.maybeInArrowParameters = oldMaybeInArrowParameters;
-    this.state.yieldPos = oldYieldPos;
-    this.state.awaitPos = oldAwaitPos;
-    return node;
-  }
-
-  parseFunctionId(requireId) {
-    return requireId || this.match(types.name) ? this.parseIdentifier() : null;
-  }
-
-  parseFunctionParams(node, allowModifiers) {
-    const oldInParameters = this.state.inParameters;
-    this.state.inParameters = true;
-    this.expect(types.parenL);
-    node.params = this.parseBindingList(types.parenR, 41, false, allowModifiers);
-    this.state.inParameters = oldInParameters;
-    this.checkYieldAwaitInDefaultParams();
-  }
-
-  registerFunctionStatementId(node) {
-    if (!node.id) return;
-    this.scope.declareName(node.id.name, this.state.strict || node.generator || node.async ? this.scope.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION, node.id.start);
-  }
-
-  parseClass(node, isStatement, optionalId) {
-    this.next();
-    this.takeDecorators(node);
-    const oldStrict = this.state.strict;
-    this.state.strict = true;
-    this.parseClassId(node, isStatement, optionalId);
-    this.parseClassSuper(node);
-    node.body = this.parseClassBody(!!node.superClass, oldStrict);
-    this.state.strict = oldStrict;
-    return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression");
-  }
-
-  isClassProperty() {
-    return this.match(types.eq) || this.match(types.semi) || this.match(types.braceR);
-  }
-
-  isClassMethod() {
-    return this.match(types.parenL);
-  }
-
-  isNonstaticConstructor(method) {
-    return !method.computed && !method.static && (method.key.name === "constructor" || method.key.value === "constructor");
-  }
-
-  parseClassBody(constructorAllowsSuper, oldStrict) {
-    this.classScope.enter();
-    const state = {
-      hadConstructor: false
-    };
-    let decorators = [];
-    const classBody = this.startNode();
-    classBody.body = [];
-    this.expect(types.braceL);
-    this.withTopicForbiddingContext(() => {
-      while (!this.match(types.braceR)) {
-        if (this.eat(types.semi)) {
-          if (decorators.length > 0) {
-            throw this.raise(this.state.lastTokEnd, Errors.DecoratorSemicolon);
-          }
-
-          continue;
-        }
-
-        if (this.match(types.at)) {
-          decorators.push(this.parseDecorator());
-          continue;
-        }
-
-        const member = this.startNode();
-
-        if (decorators.length) {
-          member.decorators = decorators;
-          this.resetStartLocationFromNode(member, decorators[0]);
-          decorators = [];
-        }
-
-        this.parseClassMember(classBody, member, state, constructorAllowsSuper);
-
-        if (member.kind === "constructor" && member.decorators && member.decorators.length > 0) {
-          this.raise(member.start, Errors.DecoratorConstructor);
-        }
-      }
-    });
-
-    if (!oldStrict) {
-      this.state.strict = false;
-    }
-
-    this.next();
-
-    if (decorators.length) {
-      throw this.raise(this.state.start, Errors.TrailingDecorator);
-    }
-
-    this.classScope.exit();
-    return this.finishNode(classBody, "ClassBody");
-  }
-
-  parseClassMemberFromModifier(classBody, member) {
-    const containsEsc = this.state.containsEsc;
-    const key = this.parseIdentifier(true);
-
-    if (this.isClassMethod()) {
-      const method = member;
-      method.kind = "method";
-      method.computed = false;
-      method.key = key;
-      method.static = false;
-      this.pushClassMethod(classBody, method, false, false, false, false);
-      return true;
-    } else if (this.isClassProperty()) {
-      const prop = member;
-      prop.computed = false;
-      prop.key = key;
-      prop.static = false;
-      classBody.body.push(this.parseClassProperty(prop));
-      return true;
-    } else if (containsEsc) {
-      throw this.unexpected();
-    }
-
-    return false;
-  }
-
-  parseClassMember(classBody, member, state, constructorAllowsSuper) {
-    const isStatic = this.isContextual("static");
-
-    if (isStatic && this.parseClassMemberFromModifier(classBody, member)) {
-      return;
-    }
-
-    this.parseClassMemberWithIsStatic(classBody, member, state, isStatic, constructorAllowsSuper);
-  }
-
-  parseClassMemberWithIsStatic(classBody, member, state, isStatic, constructorAllowsSuper) {
-    const publicMethod = member;
-    const privateMethod = member;
-    const publicProp = member;
-    const privateProp = member;
-    const method = publicMethod;
-    const publicMember = publicMethod;
-    member.static = isStatic;
-
-    if (this.eat(types.star)) {
-      method.kind = "method";
-      this.parseClassPropertyName(method);
-
-      if (method.key.type === "PrivateName") {
-        this.pushClassPrivateMethod(classBody, privateMethod, true, false);
-        return;
-      }
-
-      if (this.isNonstaticConstructor(publicMethod)) {
-        this.raise(publicMethod.key.start, Errors.ConstructorIsGenerator);
-      }
-
-      this.pushClassMethod(classBody, publicMethod, true, false, false, false);
-      return;
-    }
-
-    const containsEsc = this.state.containsEsc;
-    const key = this.parseClassPropertyName(member);
-    const isPrivate = key.type === "PrivateName";
-    const isSimple = key.type === "Identifier";
-    const maybeQuestionTokenStart = this.state.start;
-    this.parsePostMemberNameModifiers(publicMember);
-
-    if (this.isClassMethod()) {
-      method.kind = "method";
-
-      if (isPrivate) {
-        this.pushClassPrivateMethod(classBody, privateMethod, false, false);
-        return;
-      }
-
-      const isConstructor = this.isNonstaticConstructor(publicMethod);
-      let allowsDirectSuper = false;
-
-      if (isConstructor) {
-        publicMethod.kind = "constructor";
-
-        if (state.hadConstructor && !this.hasPlugin("typescript")) {
-          this.raise(key.start, Errors.DuplicateConstructor);
-        }
-
-        state.hadConstructor = true;
-        allowsDirectSuper = constructorAllowsSuper;
-      }
-
-      this.pushClassMethod(classBody, publicMethod, false, false, isConstructor, allowsDirectSuper);
-    } else if (this.isClassProperty()) {
-      if (isPrivate) {
-        this.pushClassPrivateProperty(classBody, privateProp);
-      } else {
-        this.pushClassProperty(classBody, publicProp);
-      }
-    } else if (isSimple && key.name === "async" && !containsEsc && !this.isLineTerminator()) {
-      const isGenerator = this.eat(types.star);
-
-      if (publicMember.optional) {
-        this.unexpected(maybeQuestionTokenStart);
-      }
-
-      method.kind = "method";
-      this.parseClassPropertyName(method);
-      this.parsePostMemberNameModifiers(publicMember);
-
-      if (method.key.type === "PrivateName") {
-        this.pushClassPrivateMethod(classBody, privateMethod, isGenerator, true);
-      } else {
-        if (this.isNonstaticConstructor(publicMethod)) {
-          this.raise(publicMethod.key.start, Errors.ConstructorIsAsync);
-        }
-
-        this.pushClassMethod(classBody, publicMethod, isGenerator, true, false, false);
-      }
-    } else if (isSimple && (key.name === "get" || key.name === "set") && !containsEsc && !(this.match(types.star) && this.isLineTerminator())) {
-      method.kind = key.name;
-      this.parseClassPropertyName(publicMethod);
-
-      if (method.key.type === "PrivateName") {
-        this.pushClassPrivateMethod(classBody, privateMethod, false, false);
-      } else {
-        if (this.isNonstaticConstructor(publicMethod)) {
-          this.raise(publicMethod.key.start, Errors.ConstructorIsAccessor);
-        }
-
-        this.pushClassMethod(classBody, publicMethod, false, false, false, false);
-      }
-
-      this.checkGetterSetterParams(publicMethod);
-    } else if (this.isLineTerminator()) {
-      if (isPrivate) {
-        this.pushClassPrivateProperty(classBody, privateProp);
-      } else {
-        this.pushClassProperty(classBody, publicProp);
-      }
-    } else {
-      this.unexpected();
-    }
-  }
-
-  parseClassPropertyName(member) {
-    const key = this.parsePropertyName(member, true);
-
-    if (!member.computed && member.static && (key.name === "prototype" || key.value === "prototype")) {
-      this.raise(key.start, Errors.StaticPrototype);
-    }
-
-    if (key.type === "PrivateName" && key.id.name === "constructor") {
-      this.raise(key.start, Errors.ConstructorClassPrivateField);
-    }
-
-    return key;
-  }
-
-  pushClassProperty(classBody, prop) {
-    if (!prop.computed && (prop.key.name === "constructor" || prop.key.value === "constructor")) {
-      this.raise(prop.key.start, Errors.ConstructorClassField);
-    }
-
-    classBody.body.push(this.parseClassProperty(prop));
-  }
-
-  pushClassPrivateProperty(classBody, prop) {
-    this.expectPlugin("classPrivateProperties", prop.key.start);
-    const node = this.parseClassPrivateProperty(prop);
-    classBody.body.push(node);
-    this.classScope.declarePrivateName(node.key.id.name, CLASS_ELEMENT_OTHER, node.key.start);
-  }
-
-  pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper) {
-    classBody.body.push(this.parseMethod(method, isGenerator, isAsync, isConstructor, allowsDirectSuper, "ClassMethod", true));
-  }
-
-  pushClassPrivateMethod(classBody, method, isGenerator, isAsync) {
-    this.expectPlugin("classPrivateMethods", method.key.start);
-    const node = this.parseMethod(method, isGenerator, isAsync, false, false, "ClassPrivateMethod", true);
-    classBody.body.push(node);
-    const kind = node.kind === "get" ? node.static ? CLASS_ELEMENT_STATIC_GETTER : CLASS_ELEMENT_INSTANCE_GETTER : node.kind === "set" ? node.static ? CLASS_ELEMENT_STATIC_SETTER : CLASS_ELEMENT_INSTANCE_SETTER : CLASS_ELEMENT_OTHER;
-    this.classScope.declarePrivateName(node.key.id.name, kind, node.key.start);
-  }
-
-  parsePostMemberNameModifiers(methodOrProp) {}
-
-  parseAccessModifier() {
-    return undefined;
-  }
-
-  parseClassPrivateProperty(node) {
-    this.scope.enter(SCOPE_CLASS | SCOPE_SUPER);
-    this.prodParam.enter(PARAM);
-    node.value = this.eat(types.eq) ? this.parseMaybeAssign() : null;
-    this.semicolon();
-    this.prodParam.exit();
-    this.scope.exit();
-    return this.finishNode(node, "ClassPrivateProperty");
-  }
-
-  parseClassProperty(node) {
-    if (!node.typeAnnotation) {
-      this.expectPlugin("classProperties");
-    }
-
-    this.scope.enter(SCOPE_CLASS | SCOPE_SUPER);
-    this.prodParam.enter(PARAM);
-
-    if (this.match(types.eq)) {
-      this.expectPlugin("classProperties");
-      this.next();
-      node.value = this.parseMaybeAssign();
-    } else {
-      node.value = null;
-    }
-
-    this.semicolon();
-    this.prodParam.exit();
-    this.scope.exit();
-    return this.finishNode(node, "ClassProperty");
-  }
-
-  parseClassId(node, isStatement, optionalId, bindingType = BIND_CLASS) {
-    if (this.match(types.name)) {
-      node.id = this.parseIdentifier();
-
-      if (isStatement) {
-        this.checkLVal(node.id, bindingType, undefined, "class name");
-      }
-    } else {
-      if (optionalId || !isStatement) {
-        node.id = null;
-      } else {
-        this.unexpected(null, Errors.MissingClassName);
-      }
-    }
-  }
-
-  parseClassSuper(node) {
-    node.superClass = this.eat(types._extends) ? this.parseExprSubscripts() : null;
-  }
-
-  parseExport(node) {
-    const hasDefault = this.maybeParseExportDefaultSpecifier(node);
-    const parseAfterDefault = !hasDefault || this.eat(types.comma);
-    const hasStar = parseAfterDefault && this.eatExportStar(node);
-    const hasNamespace = hasStar && this.maybeParseExportNamespaceSpecifier(node);
-    const parseAfterNamespace = parseAfterDefault && (!hasNamespace || this.eat(types.comma));
-    const isFromRequired = hasDefault || hasStar;
-
-    if (hasStar && !hasNamespace) {
-      if (hasDefault) this.unexpected();
-      this.parseExportFrom(node, true);
-      return this.finishNode(node, "ExportAllDeclaration");
-    }
-
-    const hasSpecifiers = this.maybeParseExportNamedSpecifiers(node);
-
-    if (hasDefault && parseAfterDefault && !hasStar && !hasSpecifiers || hasNamespace && parseAfterNamespace && !hasSpecifiers) {
-      throw this.unexpected(null, types.braceL);
-    }
-
-    let hasDeclaration;
-
-    if (isFromRequired || hasSpecifiers) {
-      hasDeclaration = false;
-      this.parseExportFrom(node, isFromRequired);
-    } else {
-      hasDeclaration = this.maybeParseExportDeclaration(node);
-    }
-
-    if (isFromRequired || hasSpecifiers || hasDeclaration) {
-      this.checkExport(node, true, false, !!node.source);
-      return this.finishNode(node, "ExportNamedDeclaration");
-    }
-
-    if (this.eat(types._default)) {
-      node.declaration = this.parseExportDefaultExpression();
-      this.checkExport(node, true, true);
-      return this.finishNode(node, "ExportDefaultDeclaration");
-    }
-
-    throw this.unexpected(null, types.braceL);
-  }
-
-  eatExportStar(node) {
-    return this.eat(types.star);
-  }
-
-  maybeParseExportDefaultSpecifier(node) {
-    if (this.isExportDefaultSpecifier()) {
-      this.expectPlugin("exportDefaultFrom");
-      const specifier = this.startNode();
-      specifier.exported = this.parseIdentifier(true);
-      node.specifiers = [this.finishNode(specifier, "ExportDefaultSpecifier")];
-      return true;
-    }
-
-    return false;
-  }
-
-  maybeParseExportNamespaceSpecifier(node) {
-    if (this.isContextual("as")) {
-      if (!node.specifiers) node.specifiers = [];
-      const specifier = this.startNodeAt(this.state.lastTokStart, this.state.lastTokStartLoc);
-      this.next();
-      specifier.exported = this.parseIdentifier(true);
-      node.specifiers.push(this.finishNode(specifier, "ExportNamespaceSpecifier"));
-      return true;
-    }
-
-    return false;
-  }
-
-  maybeParseExportNamedSpecifiers(node) {
-    if (this.match(types.braceL)) {
-      if (!node.specifiers) node.specifiers = [];
-      node.specifiers.push(...this.parseExportSpecifiers());
-      node.source = null;
-      node.declaration = null;
-      return true;
-    }
-
-    return false;
-  }
-
-  maybeParseExportDeclaration(node) {
-    if (this.shouldParseExportDeclaration()) {
-      if (this.isContextual("async")) {
-        const next = this.nextTokenStart();
-
-        if (!this.isUnparsedContextual(next, "function")) {
-          this.unexpected(next, types._function);
-        }
-      }
-
-      node.specifiers = [];
-      node.source = null;
-      node.declaration = this.parseExportDeclaration(node);
-      return true;
-    }
-
-    return false;
-  }
-
-  isAsyncFunction() {
-    if (!this.isContextual("async")) return false;
-    const next = this.nextTokenStart();
-    return !lineBreak.test(this.input.slice(this.state.pos, next)) && this.isUnparsedContextual(next, "function");
-  }
-
-  parseExportDefaultExpression() {
-    const expr = this.startNode();
-    const isAsync = this.isAsyncFunction();
-
-    if (this.match(types._function) || isAsync) {
-      this.next();
-
-      if (isAsync) {
-        this.next();
-      }
-
-      return this.parseFunction(expr, FUNC_STATEMENT | FUNC_NULLABLE_ID, isAsync);
-    } else if (this.match(types._class)) {
-      return this.parseClass(expr, true, true);
-    } else if (this.match(types.at)) {
-      if (this.hasPlugin("decorators") && this.getPluginOption("decorators", "decoratorsBeforeExport")) {
-        this.raise(this.state.start, Errors.DecoratorBeforeExport);
-      }
-
-      this.parseDecorators(false);
-      return this.parseClass(expr, true, true);
-    } else if (this.match(types._const) || this.match(types._var) || this.isLet()) {
-      throw this.raise(this.state.start, Errors.UnsupportedDefaultExport);
-    } else {
-      const res = this.parseMaybeAssign();
-      this.semicolon();
-      return res;
-    }
-  }
-
-  parseExportDeclaration(node) {
-    return this.parseStatement(null);
-  }
-
-  isExportDefaultSpecifier() {
-    if (this.match(types.name)) {
-      return this.state.value !== "async" && this.state.value !== "let";
-    }
-
-    if (!this.match(types._default)) {
-      return false;
-    }
-
-    const next = this.nextTokenStart();
-    return this.input.charCodeAt(next) === 44 || this.isUnparsedContextual(next, "from");
-  }
-
-  parseExportFrom(node, expect) {
-    if (this.eatContextual("from")) {
-      node.source = this.parseImportSource();
-      this.checkExport(node);
-    } else {
-      if (expect) {
-        this.unexpected();
-      } else {
-        node.source = null;
-      }
-    }
-
-    this.semicolon();
-  }
-
-  shouldParseExportDeclaration() {
-    if (this.match(types.at)) {
-      this.expectOnePlugin(["decorators", "decorators-legacy"]);
-
-      if (this.hasPlugin("decorators")) {
-        if (this.getPluginOption("decorators", "decoratorsBeforeExport")) {
-          this.unexpected(this.state.start, Errors.DecoratorBeforeExport);
-        } else {
-          return true;
-        }
-      }
-    }
-
-    return this.state.type.keyword === "var" || this.state.type.keyword === "const" || this.state.type.keyword === "function" || this.state.type.keyword === "class" || this.isLet() || this.isAsyncFunction();
-  }
-
-  checkExport(node, checkNames, isDefault, isFrom) {
-    if (checkNames) {
-      if (isDefault) {
-        this.checkDuplicateExports(node, "default");
-      } else if (node.specifiers && node.specifiers.length) {
-        for (let _i4 = 0, _node$specifiers = node.specifiers; _i4 < _node$specifiers.length; _i4++) {
-          const specifier = _node$specifiers[_i4];
-          this.checkDuplicateExports(specifier, specifier.exported.name);
-
-          if (!isFrom && specifier.local) {
-            this.checkReservedWord(specifier.local.name, specifier.local.start, true, false);
-            this.scope.checkLocalExport(specifier.local);
-          }
-        }
-      } else if (node.declaration) {
-        if (node.declaration.type === "FunctionDeclaration" || node.declaration.type === "ClassDeclaration") {
-          const id = node.declaration.id;
-          if (!id) throw new Error("Assertion failure");
-          this.checkDuplicateExports(node, id.name);
-        } else if (node.declaration.type === "VariableDeclaration") {
-          for (let _i5 = 0, _node$declaration$dec = node.declaration.declarations; _i5 < _node$declaration$dec.length; _i5++) {
-            const declaration = _node$declaration$dec[_i5];
-            this.checkDeclaration(declaration.id);
-          }
-        }
-      }
-    }
-
-    const currentContextDecorators = this.state.decoratorStack[this.state.decoratorStack.length - 1];
-
-    if (currentContextDecorators.length) {
-      const isClass = node.declaration && (node.declaration.type === "ClassDeclaration" || node.declaration.type === "ClassExpression");
-
-      if (!node.declaration || !isClass) {
-        throw this.raise(node.start, Errors.UnsupportedDecoratorExport);
-      }
-
-      this.takeDecorators(node.declaration);
-    }
-  }
-
-  checkDeclaration(node) {
-    if (node.type === "Identifier") {
-      this.checkDuplicateExports(node, node.name);
-    } else if (node.type === "ObjectPattern") {
-      for (let _i6 = 0, _node$properties = node.properties; _i6 < _node$properties.length; _i6++) {
-        const prop = _node$properties[_i6];
-        this.checkDeclaration(prop);
-      }
-    } else if (node.type === "ArrayPattern") {
-      for (let _i7 = 0, _node$elements = node.elements; _i7 < _node$elements.length; _i7++) {
-        const elem = _node$elements[_i7];
-
-        if (elem) {
-          this.checkDeclaration(elem);
-        }
-      }
-    } else if (node.type === "ObjectProperty") {
-      this.checkDeclaration(node.value);
-    } else if (node.type === "RestElement") {
-      this.checkDeclaration(node.argument);
-    } else if (node.type === "AssignmentPattern") {
-      this.checkDeclaration(node.left);
-    }
-  }
-
-  checkDuplicateExports(node, name) {
-    if (this.state.exportedIdentifiers.indexOf(name) > -1) {
-      this.raise(node.start, name === "default" ? Errors.DuplicateDefaultExport : Errors.DuplicateExport, name);
-    }
-
-    this.state.exportedIdentifiers.push(name);
-  }
-
-  parseExportSpecifiers() {
-    const nodes = [];
-    let first = true;
-    this.expect(types.braceL);
-
-    while (!this.eat(types.braceR)) {
-      if (first) {
-        first = false;
-      } else {
-        this.expect(types.comma);
-        if (this.eat(types.braceR)) break;
-      }
-
-      const node = this.startNode();
-      node.local = this.parseIdentifier(true);
-      node.exported = this.eatContextual("as") ? this.parseIdentifier(true) : node.local.__clone();
-      nodes.push(this.finishNode(node, "ExportSpecifier"));
-    }
-
-    return nodes;
-  }
-
-  parseImport(node) {
-    node.specifiers = [];
-
-    if (!this.match(types.string)) {
-      const hasDefault = this.maybeParseDefaultImportSpecifier(node);
-      const parseNext = !hasDefault || this.eat(types.comma);
-      const hasStar = parseNext && this.maybeParseStarImportSpecifier(node);
-      if (parseNext && !hasStar) this.parseNamedImportSpecifiers(node);
-      this.expectContextual("from");
-    }
-
-    node.source = this.parseImportSource();
-    this.semicolon();
-    return this.finishNode(node, "ImportDeclaration");
-  }
-
-  parseImportSource() {
-    if (!this.match(types.string)) this.unexpected();
-    return this.parseExprAtom();
-  }
-
-  shouldParseDefaultImport(node) {
-    return this.match(types.name);
-  }
-
-  parseImportSpecifierLocal(node, specifier, type, contextDescription) {
-    specifier.local = this.parseIdentifier();
-    this.checkLVal(specifier.local, BIND_LEXICAL, undefined, contextDescription);
-    node.specifiers.push(this.finishNode(specifier, type));
-  }
-
-  maybeParseDefaultImportSpecifier(node) {
-    if (this.shouldParseDefaultImport(node)) {
-      this.parseImportSpecifierLocal(node, this.startNode(), "ImportDefaultSpecifier", "default import specifier");
-      return true;
-    }
-
-    return false;
-  }
-
-  maybeParseStarImportSpecifier(node) {
-    if (this.match(types.star)) {
-      const specifier = this.startNode();
-      this.next();
-      this.expectContextual("as");
-      this.parseImportSpecifierLocal(node, specifier, "ImportNamespaceSpecifier", "import namespace specifier");
-      return true;
-    }
-
-    return false;
-  }
-
-  parseNamedImportSpecifiers(node) {
-    let first = true;
-    this.expect(types.braceL);
-
-    while (!this.eat(types.braceR)) {
-      if (first) {
-        first = false;
-      } else {
-        if (this.eat(types.colon)) {
-          throw this.raise(this.state.start, Errors.DestructureNamedImport);
-        }
-
-        this.expect(types.comma);
-        if (this.eat(types.braceR)) break;
-      }
-
-      this.parseImportSpecifier(node);
-    }
-  }
-
-  parseImportSpecifier(node) {
-    const specifier = this.startNode();
-    specifier.imported = this.parseIdentifier(true);
-
-    if (this.eatContextual("as")) {
-      specifier.local = this.parseIdentifier();
-    } else {
-      this.checkReservedWord(specifier.imported.name, specifier.start, true, true);
-      specifier.local = specifier.imported.__clone();
-    }
-
-    this.checkLVal(specifier.local, BIND_LEXICAL, undefined, "import specifier");
-    node.specifiers.push(this.finishNode(specifier, "ImportSpecifier"));
-  }
-
-}
-
-class ClassScope {
-  constructor() {
-    this.privateNames = new Set();
-    this.loneAccessors = new Map();
-    this.undefinedPrivateNames = new Map();
-  }
-
-}
-class ClassScopeHandler {
-  constructor(raise) {
-    this.stack = [];
-    this.undefinedPrivateNames = new Map();
-    this.raise = raise;
-  }
-
-  current() {
-    return this.stack[this.stack.length - 1];
-  }
-
-  enter() {
-    this.stack.push(new ClassScope());
-  }
-
-  exit() {
-    const oldClassScope = this.stack.pop();
-    const current = this.current();
-
-    for (let _i = 0, _Array$from = Array.from(oldClassScope.undefinedPrivateNames); _i < _Array$from.length; _i++) {
-      const [name, pos] = _Array$from[_i];
-
-      if (current) {
-        if (!current.undefinedPrivateNames.has(name)) {
-          current.undefinedPrivateNames.set(name, pos);
-        }
-      } else {
-        this.raise(pos, Errors.InvalidPrivateFieldResolution, name);
-      }
-    }
-  }
-
-  declarePrivateName(name, elementType, pos) {
-    const classScope = this.current();
-    let redefined = classScope.privateNames.has(name);
-
-    if (elementType & CLASS_ELEMENT_KIND_ACCESSOR) {
-      const accessor = redefined && classScope.loneAccessors.get(name);
-
-      if (accessor) {
-        const oldStatic = accessor & CLASS_ELEMENT_FLAG_STATIC;
-        const newStatic = elementType & CLASS_ELEMENT_FLAG_STATIC;
-        const oldKind = accessor & CLASS_ELEMENT_KIND_ACCESSOR;
-        const newKind = elementType & CLASS_ELEMENT_KIND_ACCESSOR;
-        redefined = oldKind === newKind || oldStatic !== newStatic;
-        if (!redefined) classScope.loneAccessors.delete(name);
-      } else if (!redefined) {
-        classScope.loneAccessors.set(name, elementType);
-      }
-    }
-
-    if (redefined) {
-      this.raise(pos, Errors.PrivateNameRedeclaration, name);
-    }
-
-    classScope.privateNames.add(name);
-    classScope.undefinedPrivateNames.delete(name);
-  }
-
-  usePrivateName(name, pos) {
-    let classScope;
-
-    for (let _i2 = 0, _this$stack = this.stack; _i2 < _this$stack.length; _i2++) {
-      classScope = _this$stack[_i2];
-      if (classScope.privateNames.has(name)) return;
-    }
-
-    if (classScope) {
-      classScope.undefinedPrivateNames.set(name, pos);
-    } else {
-      this.raise(pos, Errors.InvalidPrivateFieldResolution, name);
-    }
-  }
-
-}
-
-class Parser extends StatementParser {
-  constructor(options, input) {
-    options = getOptions(options);
-    super(options, input);
-    const ScopeHandler = this.getScopeHandler();
-    this.options = options;
-    this.inModule = this.options.sourceType === "module";
-    this.scope = new ScopeHandler(this.raise.bind(this), this.inModule);
-    this.prodParam = new ProductionParameterHandler();
-    this.classScope = new ClassScopeHandler(this.raise.bind(this));
-    this.plugins = pluginsMap(this.options.plugins);
-    this.filename = options.sourceFilename;
-  }
-
-  getScopeHandler() {
-    return ScopeHandler;
-  }
-
-  parse() {
-    let paramFlags = PARAM;
-
-    if (this.hasPlugin("topLevelAwait") && this.inModule) {
-      paramFlags |= PARAM_AWAIT;
-    }
-
-    this.scope.enter(SCOPE_PROGRAM);
-    this.prodParam.enter(paramFlags);
-    const file = this.startNode();
-    const program = this.startNode();
-    this.nextToken();
-    file.errors = null;
-    this.parseTopLevel(file, program);
-    file.errors = this.state.errors;
-    return file;
-  }
-
-}
-
-function pluginsMap(plugins) {
-  const pluginMap = new Map();
-
-  for (let _i = 0; _i < plugins.length; _i++) {
-    const plugin = plugins[_i];
-    const [name, options] = Array.isArray(plugin) ? plugin : [plugin, {}];
-    if (!pluginMap.has(name)) pluginMap.set(name, options || {});
-  }
-
-  return pluginMap;
-}
-
-function parse(input, options) {
-  if (options && options.sourceType === "unambiguous") {
-    options = Object.assign({}, options);
-
-    try {
-      options.sourceType = "module";
-      const parser = getParser(options, input);
-      const ast = parser.parse();
-
-      if (parser.sawUnambiguousESM) {
-        return ast;
-      }
-
-      if (parser.ambiguousScriptDifferentAst) {
-        try {
-          options.sourceType = "script";
-          return getParser(options, input).parse();
-        } catch (_unused) {}
-      } else {
-        ast.program.sourceType = "script";
-      }
-
-      return ast;
-    } catch (moduleError) {
-      try {
-        options.sourceType = "script";
-        return getParser(options, input).parse();
-      } catch (_unused2) {}
-
-      throw moduleError;
-    }
-  } else {
-    return getParser(options, input).parse();
-  }
-}
-function parseExpression(input, options) {
-  const parser = getParser(options, input);
-
-  if (parser.options.strictMode) {
-    parser.state.strict = true;
-  }
-
-  return parser.getExpression();
-}
-
-function getParser(options, input) {
-  let cls = Parser;
-
-  if (options && options.plugins) {
-    validatePlugins(options.plugins);
-    cls = getParserClass(options.plugins);
-  }
-
-  return new cls(options, input);
-}
-
-const parserClassCache = {};
-
-function getParserClass(pluginsFromOptions) {
-  const pluginList = mixinPluginNames.filter(name => hasPlugin(pluginsFromOptions, name));
-  const key = pluginList.join("/");
-  let cls = parserClassCache[key];
-
-  if (!cls) {
-    cls = Parser;
-
-    for (let _i = 0; _i < pluginList.length; _i++) {
-      const plugin = pluginList[_i];
-      cls = mixinPlugins[plugin](cls);
-    }
-
-    parserClassCache[key] = cls;
-  }
-
-  return cls;
-}
-
-exports.parse = parse;
-exports.parseExpression = parseExpression;
-exports.tokTypes = types;
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/jest-circus/node_modules/@babel/parser/lib/index.js.map b/node_modules/jest-circus/node_modules/@babel/parser/lib/index.js.map
deleted file mode 100644
index 2f331d3..0000000
--- a/node_modules/jest-circus/node_modules/@babel/parser/lib/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../src/tokenizer/types.js","../src/util/scopeflags.js","../src/util/whitespace.js","../src/util/location.js","../src/parser/base.js","../src/parser/comments.js","../src/parser/location.js","../src/plugins/estree.js","../src/tokenizer/context.js","../../babel-helper-validator-identifier/src/identifier.js","../../babel-helper-validator-identifier/src/keyword.js","../src/util/identifier.js","../src/plugins/flow.js","../src/plugins/jsx/xhtml.js","../src/plugins/jsx/index.js","../src/util/scope.js","../src/plugins/typescript/scope.js","../src/util/production-parameter.js","../src/plugins/typescript/index.js","../src/plugins/placeholders.js","../src/plugins/v8intrinsic.js","../src/plugin-utils.js","../src/options.js","../src/tokenizer/state.js","../src/tokenizer/index.js","../src/parser/util.js","../src/parser/node.js","../src/parser/lval.js","../src/parser/expression.js","../src/parser/statement.js","../src/util/class-scope.js","../src/parser/index.js","../src/index.js"],"sourcesContent":["// @flow\n\n// ## Token types\n\n// The assignment of fine-grained, information-carrying type objects\n// allows the tokenizer to store the information it has about a\n// token in a way that is very cheap for the parser to look up.\n\n// All token type variables start with an underscore, to make them\n// easy to recognize.\n\n// The `beforeExpr` property is used to disambiguate between regular\n// expressions and divisions. It is set on all token types that can\n// be followed by an expression (thus, a slash after them would be a\n// regular expression).\n\n// The `startsExpr` property is used to determine whether an expression\n// may be the “argument” subexpression of a `yield` expression or\n// `yield` statement. It is set on all token types that may be at the\n// start of a subexpression.\n\n// `isLoop` marks a keyword as starting a loop, which is important\n// to know when parsing a label, in order to allow or disallow\n// continue jumps to that label.\n\nconst beforeExpr = true;\nconst startsExpr = true;\nconst isLoop = true;\nconst isAssign = true;\nconst prefix = true;\nconst postfix = true;\n\ntype TokenOptions = {\n  keyword?: string,\n  beforeExpr?: boolean,\n  startsExpr?: boolean,\n  rightAssociative?: boolean,\n  isLoop?: boolean,\n  isAssign?: boolean,\n  prefix?: boolean,\n  postfix?: boolean,\n  binop?: ?number,\n};\n\nexport class TokenType {\n  label: string;\n  keyword: ?string;\n  beforeExpr: boolean;\n  startsExpr: boolean;\n  rightAssociative: boolean;\n  isLoop: boolean;\n  isAssign: boolean;\n  prefix: boolean;\n  postfix: boolean;\n  binop: ?number;\n  updateContext: ?(prevType: TokenType) => void;\n\n  constructor(label: string, conf: TokenOptions = {}) {\n    this.label = label;\n    this.keyword = conf.keyword;\n    this.beforeExpr = !!conf.beforeExpr;\n    this.startsExpr = !!conf.startsExpr;\n    this.rightAssociative = !!conf.rightAssociative;\n    this.isLoop = !!conf.isLoop;\n    this.isAssign = !!conf.isAssign;\n    this.prefix = !!conf.prefix;\n    this.postfix = !!conf.postfix;\n    this.binop = conf.binop != null ? conf.binop : null;\n    this.updateContext = null;\n  }\n}\n\nexport const keywords = new Map<string, TokenType>();\n\nfunction createKeyword(name: string, options: TokenOptions = {}): TokenType {\n  options.keyword = name;\n  const token = new TokenType(name, options);\n  keywords.set(name, token);\n  return token;\n}\n\nfunction createBinop(name: string, binop: number) {\n  return new TokenType(name, { beforeExpr, binop });\n}\n\nexport const types: { [name: string]: TokenType } = {\n  num: new TokenType(\"num\", { startsExpr }),\n  bigint: new TokenType(\"bigint\", { startsExpr }),\n  regexp: new TokenType(\"regexp\", { startsExpr }),\n  string: new TokenType(\"string\", { startsExpr }),\n  name: new TokenType(\"name\", { startsExpr }),\n  eof: new TokenType(\"eof\"),\n\n  // Punctuation token types.\n  bracketL: new TokenType(\"[\", { beforeExpr, startsExpr }),\n  bracketHashL: new TokenType(\"#[\", { beforeExpr, startsExpr }),\n  bracketBarL: new TokenType(\"[|\", { beforeExpr, startsExpr }),\n  bracketR: new TokenType(\"]\"),\n  bracketBarR: new TokenType(\"|]\"),\n  braceL: new TokenType(\"{\", { beforeExpr, startsExpr }),\n  braceBarL: new TokenType(\"{|\", { beforeExpr, startsExpr }),\n  braceHashL: new TokenType(\"#{\", { beforeExpr, startsExpr }),\n  braceR: new TokenType(\"}\"),\n  braceBarR: new TokenType(\"|}\"),\n  parenL: new TokenType(\"(\", { beforeExpr, startsExpr }),\n  parenR: new TokenType(\")\"),\n  comma: new TokenType(\",\", { beforeExpr }),\n  semi: new TokenType(\";\", { beforeExpr }),\n  colon: new TokenType(\":\", { beforeExpr }),\n  doubleColon: new TokenType(\"::\", { beforeExpr }),\n  dot: new TokenType(\".\"),\n  question: new TokenType(\"?\", { beforeExpr }),\n  questionDot: new TokenType(\"?.\"),\n  arrow: new TokenType(\"=>\", { beforeExpr }),\n  template: new TokenType(\"template\"),\n  ellipsis: new TokenType(\"...\", { beforeExpr }),\n  backQuote: new TokenType(\"`\", { startsExpr }),\n  dollarBraceL: new TokenType(\"${\", { beforeExpr, startsExpr }),\n  at: new TokenType(\"@\"),\n  hash: new TokenType(\"#\", { startsExpr }),\n\n  // Special hashbang token.\n  interpreterDirective: new TokenType(\"#!...\"),\n\n  // Operators. These carry several kinds of properties to help the\n  // parser use them properly (the presence of these properties is\n  // what categorizes them as operators).\n  //\n  // `binop`, when present, specifies that this operator is a binary\n  // operator, and will refer to its precedence.\n  //\n  // `prefix` and `postfix` mark the operator as a prefix or postfix\n  // unary operator.\n  //\n  // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as\n  // binary operators with a very low precedence, that should result\n  // in AssignmentExpression nodes.\n\n  eq: new TokenType(\"=\", { beforeExpr, isAssign }),\n  assign: new TokenType(\"_=\", { beforeExpr, isAssign }),\n  incDec: new TokenType(\"++/--\", { prefix, postfix, startsExpr }),\n  bang: new TokenType(\"!\", { beforeExpr, prefix, startsExpr }),\n  tilde: new TokenType(\"~\", { beforeExpr, prefix, startsExpr }),\n  pipeline: createBinop(\"|>\", 0),\n  nullishCoalescing: createBinop(\"??\", 1),\n  logicalOR: createBinop(\"||\", 1),\n  logicalAND: createBinop(\"&&\", 2),\n  bitwiseOR: createBinop(\"|\", 3),\n  bitwiseXOR: createBinop(\"^\", 4),\n  bitwiseAND: createBinop(\"&\", 5),\n  equality: createBinop(\"==/!=/===/!==\", 6),\n  relational: createBinop(\"</>/<=/>=\", 7),\n  bitShift: createBinop(\"<</>>/>>>\", 8),\n  plusMin: new TokenType(\"+/-\", { beforeExpr, binop: 9, prefix, startsExpr }),\n  // startsExpr: required by v8intrinsic plugin\n  modulo: new TokenType(\"%\", { beforeExpr, binop: 10, startsExpr }),\n  star: createBinop(\"*\", 10),\n  slash: createBinop(\"/\", 10),\n  exponent: new TokenType(\"**\", {\n    beforeExpr,\n    binop: 11,\n    rightAssociative: true,\n  }),\n\n  // Keywords\n  // Don't forget to update packages/babel-helper-validator-identifier/src/keyword.js\n  // when new keywords are added\n  _break: createKeyword(\"break\"),\n  _case: createKeyword(\"case\", { beforeExpr }),\n  _catch: createKeyword(\"catch\"),\n  _continue: createKeyword(\"continue\"),\n  _debugger: createKeyword(\"debugger\"),\n  _default: createKeyword(\"default\", { beforeExpr }),\n  _do: createKeyword(\"do\", { isLoop, beforeExpr }),\n  _else: createKeyword(\"else\", { beforeExpr }),\n  _finally: createKeyword(\"finally\"),\n  _for: createKeyword(\"for\", { isLoop }),\n  _function: createKeyword(\"function\", { startsExpr }),\n  _if: createKeyword(\"if\"),\n  _return: createKeyword(\"return\", { beforeExpr }),\n  _switch: createKeyword(\"switch\"),\n  _throw: createKeyword(\"throw\", { beforeExpr, prefix, startsExpr }),\n  _try: createKeyword(\"try\"),\n  _var: createKeyword(\"var\"),\n  _const: createKeyword(\"const\"),\n  _while: createKeyword(\"while\", { isLoop }),\n  _with: createKeyword(\"with\"),\n  _new: createKeyword(\"new\", { beforeExpr, startsExpr }),\n  _this: createKeyword(\"this\", { startsExpr }),\n  _super: createKeyword(\"super\", { startsExpr }),\n  _class: createKeyword(\"class\", { startsExpr }),\n  _extends: createKeyword(\"extends\", { beforeExpr }),\n  _export: createKeyword(\"export\"),\n  _import: createKeyword(\"import\", { startsExpr }),\n  _null: createKeyword(\"null\", { startsExpr }),\n  _true: createKeyword(\"true\", { startsExpr }),\n  _false: createKeyword(\"false\", { startsExpr }),\n  _in: createKeyword(\"in\", { beforeExpr, binop: 7 }),\n  _instanceof: createKeyword(\"instanceof\", { beforeExpr, binop: 7 }),\n  _typeof: createKeyword(\"typeof\", { beforeExpr, prefix, startsExpr }),\n  _void: createKeyword(\"void\", { beforeExpr, prefix, startsExpr }),\n  _delete: createKeyword(\"delete\", { beforeExpr, prefix, startsExpr }),\n};\n","// @flow\n\n// Each scope gets a bitset that may contain these flags\n// prettier-ignore\nexport const SCOPE_OTHER        = 0b00000000,\n             SCOPE_PROGRAM      = 0b00000001,\n             SCOPE_FUNCTION     = 0b00000010,\n             SCOPE_ARROW        = 0b00000100,\n             SCOPE_SIMPLE_CATCH = 0b00001000,\n             SCOPE_SUPER        = 0b00010000,\n             SCOPE_DIRECT_SUPER = 0b00100000,\n             SCOPE_CLASS        = 0b01000000,\n             SCOPE_TS_MODULE    = 0b10000000,\n             SCOPE_VAR = SCOPE_PROGRAM | SCOPE_FUNCTION | SCOPE_TS_MODULE;\n\nexport type ScopeFlags =\n  | typeof SCOPE_OTHER\n  | typeof SCOPE_PROGRAM\n  | typeof SCOPE_FUNCTION\n  | typeof SCOPE_VAR\n  | typeof SCOPE_ARROW\n  | typeof SCOPE_SIMPLE_CATCH\n  | typeof SCOPE_SUPER\n  | typeof SCOPE_DIRECT_SUPER\n  | typeof SCOPE_CLASS;\n\n// These flags are meant to be _only_ used inside the Scope class (or subclasses).\n// prettier-ignore\nexport const BIND_KIND_VALUE           = 0b00000_0000_01,\n             BIND_KIND_TYPE            = 0b00000_0000_10,\n             // Used in checkLVal and declareName to determine the type of a binding\n             BIND_SCOPE_VAR            = 0b00000_0001_00, // Var-style binding\n             BIND_SCOPE_LEXICAL        = 0b00000_0010_00, // Let- or const-style binding\n             BIND_SCOPE_FUNCTION       = 0b00000_0100_00, // Function declaration\n             BIND_SCOPE_OUTSIDE        = 0b00000_1000_00, // Special case for function names as\n                                                   // bound inside the function\n             // Misc flags\n             BIND_FLAGS_NONE           = 0b00001_0000_00,\n             BIND_FLAGS_CLASS          = 0b00010_0000_00,\n             BIND_FLAGS_TS_ENUM        = 0b00100_0000_00,\n             BIND_FLAGS_TS_CONST_ENUM  = 0b01000_0000_00,\n             BIND_FLAGS_TS_EXPORT_ONLY = 0b10000_0000_00;\n\n// These flags are meant to be _only_ used by Scope consumers\n// prettier-ignore\n/*                              =    is value?    |    is type?    |      scope          |    misc flags    */\nexport const BIND_CLASS         = BIND_KIND_VALUE | BIND_KIND_TYPE | BIND_SCOPE_LEXICAL  | BIND_FLAGS_CLASS  ,\n             BIND_LEXICAL       = BIND_KIND_VALUE | 0              | BIND_SCOPE_LEXICAL  | 0                 ,\n             BIND_VAR           = BIND_KIND_VALUE | 0              | BIND_SCOPE_VAR      | 0                 ,\n             BIND_FUNCTION      = BIND_KIND_VALUE | 0              | BIND_SCOPE_FUNCTION | 0                 ,\n             BIND_TS_INTERFACE  = 0               | BIND_KIND_TYPE | 0                   | BIND_FLAGS_CLASS  ,\n             BIND_TS_TYPE       = 0               | BIND_KIND_TYPE | 0                   | 0                 ,\n             BIND_TS_ENUM       = BIND_KIND_VALUE | BIND_KIND_TYPE | BIND_SCOPE_LEXICAL  | BIND_FLAGS_TS_ENUM,\n             BIND_TS_AMBIENT    = 0               | 0              | 0            | BIND_FLAGS_TS_EXPORT_ONLY,\n             // These bindings don't introduce anything in the scope. They are used for assignments and\n             // function expressions IDs.\n             BIND_NONE          = 0               | 0              | 0                   | BIND_FLAGS_NONE   ,\n             BIND_OUTSIDE       = BIND_KIND_VALUE | 0              | 0                   | BIND_FLAGS_NONE   ,\n\n             BIND_TS_CONST_ENUM = BIND_TS_ENUM | BIND_FLAGS_TS_CONST_ENUM,\n             BIND_TS_NAMESPACE  = 0               | 0              | 0            | BIND_FLAGS_TS_EXPORT_ONLY;\n\nexport type BindingTypes =\n  | typeof BIND_NONE\n  | typeof BIND_OUTSIDE\n  | typeof BIND_VAR\n  | typeof BIND_LEXICAL\n  | typeof BIND_CLASS\n  | typeof BIND_FUNCTION\n  | typeof BIND_TS_INTERFACE\n  | typeof BIND_TS_TYPE\n  | typeof BIND_TS_ENUM\n  | typeof BIND_TS_AMBIENT\n  | typeof BIND_TS_NAMESPACE;\n\n// prettier-ignore\nexport const CLASS_ELEMENT_FLAG_STATIC = 0b1_00,\n             CLASS_ELEMENT_KIND_GETTER = 0b0_10,\n             CLASS_ELEMENT_KIND_SETTER = 0b0_01,\n             CLASS_ELEMENT_KIND_ACCESSOR = CLASS_ELEMENT_KIND_GETTER | CLASS_ELEMENT_KIND_SETTER;\n\n// prettier-ignore\nexport const CLASS_ELEMENT_STATIC_GETTER   = CLASS_ELEMENT_KIND_GETTER | CLASS_ELEMENT_FLAG_STATIC,\n             CLASS_ELEMENT_STATIC_SETTER   = CLASS_ELEMENT_KIND_SETTER | CLASS_ELEMENT_FLAG_STATIC,\n             CLASS_ELEMENT_INSTANCE_GETTER = CLASS_ELEMENT_KIND_GETTER,\n             CLASS_ELEMENT_INSTANCE_SETTER = CLASS_ELEMENT_KIND_SETTER,\n             CLASS_ELEMENT_OTHER           = 0;\n\nexport type ClassElementTypes =\n  | typeof CLASS_ELEMENT_STATIC_GETTER\n  | typeof CLASS_ELEMENT_STATIC_SETTER\n  | typeof CLASS_ELEMENT_INSTANCE_GETTER\n  | typeof CLASS_ELEMENT_INSTANCE_SETTER\n  | typeof CLASS_ELEMENT_OTHER;\n","// @flow\n\nimport * as charCodes from \"charcodes\";\n\n// Matches a whole line break (where CRLF is considered a single\n// line break). Used to count lines.\nexport const lineBreak = /\\r\\n?|[\\n\\u2028\\u2029]/;\nexport const lineBreakG = new RegExp(lineBreak.source, \"g\");\n\n// https://tc39.github.io/ecma262/#sec-line-terminators\nexport function isNewLine(code: number): boolean {\n  switch (code) {\n    case charCodes.lineFeed:\n    case charCodes.carriageReturn:\n    case charCodes.lineSeparator:\n    case charCodes.paragraphSeparator:\n      return true;\n\n    default:\n      return false;\n  }\n}\n\nexport const skipWhiteSpace = /(?:\\s|\\/\\/.*|\\/\\*[^]*?\\*\\/)*/g;\n\n// https://tc39.github.io/ecma262/#sec-white-space\nexport function isWhitespace(code: number): boolean {\n  switch (code) {\n    case 0x0009: // CHARACTER TABULATION\n    case 0x000b: // LINE TABULATION\n    case 0x000c: // FORM FEED\n    case charCodes.space:\n    case charCodes.nonBreakingSpace:\n    case charCodes.oghamSpaceMark:\n    case 0x2000: // EN QUAD\n    case 0x2001: // EM QUAD\n    case 0x2002: // EN SPACE\n    case 0x2003: // EM SPACE\n    case 0x2004: // THREE-PER-EM SPACE\n    case 0x2005: // FOUR-PER-EM SPACE\n    case 0x2006: // SIX-PER-EM SPACE\n    case 0x2007: // FIGURE SPACE\n    case 0x2008: // PUNCTUATION SPACE\n    case 0x2009: // THIN SPACE\n    case 0x200a: // HAIR SPACE\n    case 0x202f: // NARROW NO-BREAK SPACE\n    case 0x205f: // MEDIUM MATHEMATICAL SPACE\n    case 0x3000: // IDEOGRAPHIC SPACE\n    case 0xfeff: // ZERO WIDTH NO-BREAK SPACE\n      return true;\n\n    default:\n      return false;\n  }\n}\n","// @flow\n\nimport { lineBreakG } from \"./whitespace\";\n\nexport type Pos = {\n  start: number,\n};\n\n// These are used when `options.locations` is on, for the\n// `startLoc` and `endLoc` properties.\n\nexport class Position {\n  line: number;\n  column: number;\n\n  constructor(line: number, col: number) {\n    this.line = line;\n    this.column = col;\n  }\n}\n\nexport class SourceLocation {\n  start: Position;\n  end: Position;\n  filename: string;\n  identifierName: ?string;\n\n  constructor(start: Position, end?: Position) {\n    this.start = start;\n    // $FlowIgnore (may start as null, but initialized later)\n    this.end = end;\n  }\n}\n\n// The `getLineInfo` function is mostly useful when the\n// `locations` option is off (for performance reasons) and you\n// want to find the line/column position for a given character\n// offset. `input` should be the code string that the offset refers\n// into.\n\nexport function getLineInfo(input: string, offset: number): Position {\n  let line = 1;\n  let lineStart = 0;\n  let match;\n  lineBreakG.lastIndex = 0;\n  while ((match = lineBreakG.exec(input)) && match.index < offset) {\n    line++;\n    lineStart = lineBreakG.lastIndex;\n  }\n\n  return new Position(line, offset - lineStart);\n}\n","// @flow\n\nimport type { Options } from \"../options\";\nimport type State from \"../tokenizer/state\";\nimport type { PluginsMap } from \"./index\";\nimport type ScopeHandler from \"../util/scope\";\nimport type ClassScopeHandler from \"../util/class-scope\";\nimport type ProductionParameterHandler from \"../util/production-parameter\";\n\nexport default class BaseParser {\n  // Properties set by constructor in index.js\n  options: Options;\n  inModule: boolean;\n  scope: ScopeHandler<*>;\n  classScope: ClassScopeHandler;\n  prodParam: ProductionParameterHandler;\n  plugins: PluginsMap;\n  filename: ?string;\n  sawUnambiguousESM: boolean = false;\n  ambiguousScriptDifferentAst: boolean = false;\n\n  // Initialized by Tokenizer\n  state: State;\n  // input and length are not in state as they are constant and we do\n  // not want to ever copy them, which happens if state gets cloned\n  input: string;\n  length: number;\n\n  hasPlugin(name: string): boolean {\n    return this.plugins.has(name);\n  }\n\n  getPluginOption(plugin: string, name: string) {\n    // $FlowIssue\n    if (this.hasPlugin(plugin)) return this.plugins.get(plugin)[name];\n  }\n}\n","// @flow\n\n/**\n * Based on the comment attachment algorithm used in espree and estraverse.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright\n *   notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport BaseParser from \"./base\";\nimport type { Comment, Node } from \"../types\";\n\nfunction last<T>(stack: $ReadOnlyArray<T>): T {\n  return stack[stack.length - 1];\n}\n\nexport default class CommentsParser extends BaseParser {\n  addComment(comment: Comment): void {\n    if (this.filename) comment.loc.filename = this.filename;\n    this.state.trailingComments.push(comment);\n    this.state.leadingComments.push(comment);\n  }\n\n  adjustCommentsAfterTrailingComma(\n    node: Node,\n    elements: (Node | null)[],\n    // When the current node is followed by a token which hasn't a respective AST node, we\n    // need to take all the trailing comments to prevent them from being attached to an\n    // unrelated node. e.g. in\n    //     var { x } /* cmt */ = { y }\n    // we don't want /* cmt */ to be attached to { y }.\n    // On the other hand, in\n    //     fn(x) [new line] /* cmt */ [new line] y\n    // /* cmt */ is both a trailing comment of fn(x) and a leading comment of y\n    takeAllComments?: boolean,\n  ) {\n    if (this.state.leadingComments.length === 0) {\n      return;\n    }\n\n    let lastElement = null;\n    let i = elements.length;\n    while (lastElement === null && i > 0) {\n      lastElement = elements[--i];\n    }\n    if (lastElement === null) {\n      return;\n    }\n\n    for (let j = 0; j < this.state.leadingComments.length; j++) {\n      if (\n        this.state.leadingComments[j].end < this.state.commentPreviousNode.end\n      ) {\n        this.state.leadingComments.splice(j, 1);\n        j--;\n      }\n    }\n\n    const newTrailingComments = [];\n    for (let i = 0; i < this.state.leadingComments.length; i++) {\n      const leadingComment = this.state.leadingComments[i];\n      if (leadingComment.end < node.end) {\n        newTrailingComments.push(leadingComment);\n\n        // Perf: we don't need to splice if we are going to reset the array anyway\n        if (!takeAllComments) {\n          this.state.leadingComments.splice(i, 1);\n          i--;\n        }\n      } else {\n        if (node.trailingComments === undefined) {\n          node.trailingComments = [];\n        }\n        node.trailingComments.push(leadingComment);\n      }\n    }\n    if (takeAllComments) this.state.leadingComments = [];\n\n    if (newTrailingComments.length > 0) {\n      lastElement.trailingComments = newTrailingComments;\n    } else if (lastElement.trailingComments !== undefined) {\n      lastElement.trailingComments = [];\n    }\n  }\n\n  processComment(node: Node): void {\n    if (node.type === \"Program\" && node.body.length > 0) return;\n\n    const stack = this.state.commentStack;\n\n    let firstChild, lastChild, trailingComments, i, j;\n\n    if (this.state.trailingComments.length > 0) {\n      // If the first comment in trailingComments comes after the\n      // current node, then we're good - all comments in the array will\n      // come after the node and so it's safe to add them as official\n      // trailingComments.\n      if (this.state.trailingComments[0].start >= node.end) {\n        trailingComments = this.state.trailingComments;\n        this.state.trailingComments = [];\n      } else {\n        // Otherwise, if the first comment doesn't come after the\n        // current node, that means we have a mix of leading and trailing\n        // comments in the array and that leadingComments contains the\n        // same items as trailingComments. Reset trailingComments to\n        // zero items and we'll handle this by evaluating leadingComments\n        // later.\n        this.state.trailingComments.length = 0;\n      }\n    } else if (stack.length > 0) {\n      const lastInStack = last(stack);\n      if (\n        lastInStack.trailingComments &&\n        lastInStack.trailingComments[0].start >= node.end\n      ) {\n        trailingComments = lastInStack.trailingComments;\n        delete lastInStack.trailingComments;\n      }\n    }\n\n    // Eating the stack.\n    if (stack.length > 0 && last(stack).start >= node.start) {\n      firstChild = stack.pop();\n    }\n\n    while (stack.length > 0 && last(stack).start >= node.start) {\n      lastChild = stack.pop();\n    }\n\n    if (!lastChild && firstChild) lastChild = firstChild;\n\n    // Adjust comments that follow a trailing comma on the last element in a\n    // comma separated list of nodes to be the trailing comments on the last\n    // element\n    if (firstChild) {\n      switch (node.type) {\n        case \"ObjectExpression\":\n          this.adjustCommentsAfterTrailingComma(node, node.properties);\n          break;\n        case \"ObjectPattern\":\n          this.adjustCommentsAfterTrailingComma(node, node.properties, true);\n          break;\n        case \"CallExpression\":\n          this.adjustCommentsAfterTrailingComma(node, node.arguments);\n          break;\n        case \"ArrayExpression\":\n          this.adjustCommentsAfterTrailingComma(node, node.elements);\n          break;\n        case \"ArrayPattern\":\n          this.adjustCommentsAfterTrailingComma(node, node.elements, true);\n          break;\n      }\n    } else if (\n      this.state.commentPreviousNode &&\n      ((this.state.commentPreviousNode.type === \"ImportSpecifier\" &&\n        node.type !== \"ImportSpecifier\") ||\n        (this.state.commentPreviousNode.type === \"ExportSpecifier\" &&\n          node.type !== \"ExportSpecifier\"))\n    ) {\n      this.adjustCommentsAfterTrailingComma(node, [\n        this.state.commentPreviousNode,\n      ]);\n    }\n\n    if (lastChild) {\n      if (lastChild.leadingComments) {\n        if (\n          lastChild !== node &&\n          lastChild.leadingComments.length > 0 &&\n          last(lastChild.leadingComments).end <= node.start\n        ) {\n          node.leadingComments = lastChild.leadingComments;\n          delete lastChild.leadingComments;\n        } else {\n          // A leading comment for an anonymous class had been stolen by its first ClassMethod,\n          // so this takes back the leading comment.\n          // See also: https://github.com/eslint/espree/issues/158\n          for (i = lastChild.leadingComments.length - 2; i >= 0; --i) {\n            if (lastChild.leadingComments[i].end <= node.start) {\n              node.leadingComments = lastChild.leadingComments.splice(0, i + 1);\n              break;\n            }\n          }\n        }\n      }\n    } else if (this.state.leadingComments.length > 0) {\n      if (last(this.state.leadingComments).end <= node.start) {\n        if (this.state.commentPreviousNode) {\n          for (j = 0; j < this.state.leadingComments.length; j++) {\n            if (\n              this.state.leadingComments[j].end <\n              this.state.commentPreviousNode.end\n            ) {\n              this.state.leadingComments.splice(j, 1);\n              j--;\n            }\n          }\n        }\n        if (this.state.leadingComments.length > 0) {\n          node.leadingComments = this.state.leadingComments;\n          this.state.leadingComments = [];\n        }\n      } else {\n        // https://github.com/eslint/espree/issues/2\n        //\n        // In special cases, such as return (without a value) and\n        // debugger, all comments will end up as leadingComments and\n        // will otherwise be eliminated. This step runs when the\n        // commentStack is empty and there are comments left\n        // in leadingComments.\n        //\n        // This loop figures out the stopping point between the actual\n        // leading and trailing comments by finding the location of the\n        // first comment that comes after the given node.\n        for (i = 0; i < this.state.leadingComments.length; i++) {\n          if (this.state.leadingComments[i].end > node.start) {\n            break;\n          }\n        }\n\n        // Split the array based on the location of the first comment\n        // that comes after the node. Keep in mind that this could\n        // result in an empty array, and if so, the array must be\n        // deleted.\n        const leadingComments = this.state.leadingComments.slice(0, i);\n\n        if (leadingComments.length) {\n          node.leadingComments = leadingComments;\n        }\n\n        // Similarly, trailing comments are attached later. The variable\n        // must be reset to null if there are no trailing comments.\n        trailingComments = this.state.leadingComments.slice(i);\n        if (trailingComments.length === 0) {\n          trailingComments = null;\n        }\n      }\n    }\n\n    this.state.commentPreviousNode = node;\n\n    if (trailingComments) {\n      if (\n        trailingComments.length &&\n        trailingComments[0].start >= node.start &&\n        last(trailingComments).end <= node.end\n      ) {\n        node.innerComments = trailingComments;\n      } else {\n        node.trailingComments = trailingComments;\n      }\n    }\n\n    stack.push(node);\n  }\n}\n","// @flow\n/* eslint sort-keys: \"error\" */\nimport { getLineInfo, type Position } from \"../util/location\";\nimport CommentsParser from \"./comments\";\n\n// This function is used to raise exceptions on parse errors. It\n// takes an offset integer (into the current `input`) to indicate\n// the location of the error, attaches the position to the end\n// of the error message, and then raises a `SyntaxError` with that\n// message.\n\ntype ErrorContext = {\n  pos: number,\n  loc: Position,\n  missingPlugin?: Array<string>,\n  code?: string,\n};\n\n// The Errors key follows https://cs.chromium.org/chromium/src/v8/src/common/message-template.h unless it does not exist\nexport const Errors = Object.freeze({\n  ArgumentsDisallowedInInitializer:\n    \"'arguments' is not allowed in class field initializer\",\n  AsyncFunctionInSingleStatementContext:\n    \"Async functions can only be declared at the top level or inside a block\",\n  AwaitBindingIdentifier:\n    \"Can not use 'await' as identifier inside an async function\",\n  AwaitExpressionFormalParameter:\n    \"await is not allowed in async function parameters\",\n  AwaitNotInAsyncFunction:\n    \"Can not use keyword 'await' outside an async function\",\n  BadGetterArity: \"getter must not have any formal parameters\",\n  BadSetterArity: \"setter must have exactly one formal parameter\",\n  BadSetterRestParameter:\n    \"setter function argument must not be a rest parameter\",\n  ConstructorClassField: \"Classes may not have a field named 'constructor'\",\n  ConstructorClassPrivateField:\n    \"Classes may not have a private field named '#constructor'\",\n  ConstructorIsAccessor: \"Class constructor may not be an accessor\",\n  ConstructorIsAsync: \"Constructor can't be an async function\",\n  ConstructorIsGenerator: \"Constructor can't be a generator\",\n  DeclarationMissingInitializer: \"%0 require an initialization value\",\n  DecoratorBeforeExport:\n    \"Decorators must be placed *before* the 'export' keyword. You can set the 'decoratorsBeforeExport' option to false to use the 'export @decorator class {}' syntax\",\n  DecoratorConstructor:\n    \"Decorators can't be used with a constructor. Did you mean '@dec class { ... }'?\",\n  DecoratorExportClass:\n    \"Using the export keyword between a decorator and a class is not allowed. Please use `export @dec class` instead.\",\n  DecoratorSemicolon: \"Decorators must not be followed by a semicolon\",\n  DeletePrivateField: \"Deleting a private field is not allowed\",\n  DestructureNamedImport:\n    \"ES2015 named imports do not destructure. Use another statement for destructuring after the import.\",\n  DuplicateConstructor: \"Duplicate constructor in the same class\",\n  DuplicateDefaultExport: \"Only one default export allowed per module.\",\n  DuplicateExport:\n    \"`%0` has already been exported. Exported identifiers must be unique.\",\n  DuplicateProto: \"Redefinition of __proto__ property\",\n  DuplicateRegExpFlags: \"Duplicate regular expression flag\",\n  ElementAfterRest: \"Rest element must be last element\",\n  EscapedCharNotAnIdentifier: \"Invalid Unicode escape\",\n  ForInOfLoopInitializer:\n    \"%0 loop variable declaration may not have an initializer\",\n  GeneratorInSingleStatementContext:\n    \"Generators can only be declared at the top level or inside a block\",\n  IllegalBreakContinue: \"Unsyntactic %0\",\n  IllegalLanguageModeDirective:\n    \"Illegal 'use strict' directive in function with non-simple parameter list\",\n  IllegalReturn: \"'return' outside of function\",\n  ImportCallArgumentTrailingComma:\n    \"Trailing comma is disallowed inside import(...) arguments\",\n  ImportCallArity: \"import() requires exactly one argument\",\n  ImportCallArityLtOne: \"Dynamic imports require a parameter: import('a.js')\",\n  ImportCallNotNewExpression: \"Cannot use new with import(...)\",\n  ImportCallSpreadArgument: \"... is not allowed in import()\",\n  ImportMetaOutsideModule: `import.meta may appear only with 'sourceType: \"module\"'`,\n  ImportOutsideModule: `'import' and 'export' may appear only with 'sourceType: \"module\"'`,\n  InvalidCodePoint: \"Code point out of bounds\",\n  InvalidDigit: \"Expected number in radix %0\",\n  InvalidEscapeSequence: \"Bad character escape sequence\",\n  InvalidEscapeSequenceTemplate: \"Invalid escape sequence in template\",\n  InvalidEscapedReservedWord: \"Escape sequence in keyword %0\",\n  InvalidIdentifier: \"Invalid identifier %0\",\n  InvalidLhs: \"Invalid left-hand side in %0\",\n  InvalidLhsBinding: \"Binding invalid left-hand side in %0\",\n  InvalidNumber: \"Invalid number\",\n  InvalidOrUnexpectedToken: \"Unexpected character '%0'\",\n  InvalidParenthesizedAssignment: \"Invalid parenthesized assignment pattern\",\n  InvalidPrivateFieldResolution: \"Private name #%0 is not defined\",\n  InvalidPropertyBindingPattern: \"Binding member expression\",\n  InvalidRestAssignmentPattern: \"Invalid rest operator's argument\",\n  LabelRedeclaration: \"Label '%0' is already declared\",\n  LetInLexicalBinding:\n    \"'let' is not allowed to be used as a name in 'let' or 'const' declarations.\",\n  MalformedRegExpFlags: \"Invalid regular expression flag\",\n  MissingClassName: \"A class name is required\",\n  MissingEqInAssignment:\n    \"Only '=' operator can be used for specifying default value.\",\n  MissingUnicodeEscape: \"Expecting Unicode escape sequence \\\\uXXXX\",\n  MixingCoalesceWithLogical:\n    \"Nullish coalescing operator(??) requires parens when mixing with logical operators\",\n  ModuleExportUndefined: \"Export '%0' is not defined\",\n  MultipleDefaultsInSwitch: \"Multiple default clauses\",\n  NewlineAfterThrow: \"Illegal newline after throw\",\n  NoCatchOrFinally: \"Missing catch or finally clause\",\n  NumberIdentifier: \"Identifier directly after number\",\n  NumericSeparatorInEscapeSequence:\n    \"Numeric separators are not allowed inside unicode escape sequences or hex escape sequences\",\n  ObsoleteAwaitStar:\n    \"await* has been removed from the async functions proposal. Use Promise.all() instead.\",\n  OptionalChainingNoNew:\n    \"constructors in/after an Optional Chain are not allowed\",\n  OptionalChainingNoTemplate:\n    \"Tagged Template Literals are not allowed in optionalChain\",\n  ParamDupe: \"Argument name clash\",\n  PatternHasAccessor: \"Object pattern can't contain getter or setter\",\n  PatternHasMethod: \"Object pattern can't contain methods\",\n  PipelineBodyNoArrow:\n    'Unexpected arrow \"=>\" after pipeline body; arrow function in pipeline body must be parenthesized',\n  PipelineBodySequenceExpression:\n    \"Pipeline body may not be a comma-separated sequence expression\",\n  PipelineHeadSequenceExpression:\n    \"Pipeline head should not be a comma-separated sequence expression\",\n  PipelineTopicUnused:\n    \"Pipeline is in topic style but does not use topic reference\",\n  PrimaryTopicNotAllowed:\n    \"Topic reference was used in a lexical context without topic binding\",\n  PrimaryTopicRequiresSmartPipeline:\n    \"Primary Topic Reference found but pipelineOperator not passed 'smart' for 'proposal' option.\",\n  PrivateNameRedeclaration: \"Duplicate private name #%0\",\n  RecordExpressionBarIncorrectEndSyntaxType:\n    \"Record expressions ending with '|}' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'\",\n  RecordExpressionBarIncorrectStartSyntaxType:\n    \"Record expressions starting with '{|' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'\",\n  RecordExpressionHashIncorrectStartSyntaxType:\n    \"Record expressions starting with '#{' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'hash'\",\n  RestTrailingComma: \"Unexpected trailing comma after rest element\",\n  SloppyFunction:\n    \"In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement\",\n  StaticPrototype: \"Classes may not have static property named prototype\",\n  StrictDelete: \"Deleting local variable in strict mode\",\n  StrictEvalArguments: \"Assigning to '%0' in strict mode\",\n  StrictEvalArgumentsBinding: \"Binding '%0' in strict mode\",\n  StrictFunction:\n    \"In strict mode code, functions can only be declared at top level or inside a block\",\n  StrictOctalLiteral: \"Legacy octal literals are not allowed in strict mode\",\n  StrictWith: \"'with' in strict mode\",\n  SuperNotAllowed:\n    \"super() is only valid inside a class constructor of a subclass. Maybe a typo in the method name ('constructor') or not extending another class?\",\n  SuperPrivateField: \"Private fields can't be accessed on super\",\n  TrailingDecorator: \"Decorators must be attached to a class element\",\n  TupleExpressionBarIncorrectEndSyntaxType:\n    \"Tuple expressions ending with '|]' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'\",\n  TupleExpressionBarIncorrectStartSyntaxType:\n    \"Tuple expressions starting with '[|' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'\",\n  TupleExpressionHashIncorrectStartSyntaxType:\n    \"Tuple expressions starting with '#[' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'hash'\",\n  UnexpectedArgumentPlaceholder: \"Unexpected argument placeholder\",\n  UnexpectedAwaitAfterPipelineBody:\n    'Unexpected \"await\" after pipeline body; await must have parentheses in minimal proposal',\n  UnexpectedDigitAfterHash: \"Unexpected digit after hash token\",\n  UnexpectedImportExport:\n    \"'import' and 'export' may only appear at the top level\",\n  UnexpectedKeyword: \"Unexpected keyword '%0'\",\n  UnexpectedLeadingDecorator:\n    \"Leading decorators must be attached to a class declaration\",\n  UnexpectedLexicalDeclaration:\n    \"Lexical declaration cannot appear in a single-statement context\",\n  UnexpectedNewTarget: \"new.target can only be used in functions\",\n  UnexpectedNumericSeparator:\n    \"A numeric separator is only allowed between two digits\",\n  UnexpectedPrivateField:\n    \"Private names can only be used as the name of a class element (i.e. class C { #p = 42; #m() {} } )\\n or a property of member expression (i.e. this.#p).\",\n  UnexpectedReservedWord: \"Unexpected reserved word '%0'\",\n  UnexpectedSuper: \"super is only allowed in object methods and classes\",\n  UnexpectedToken: \"Unexpected token '%'\",\n  UnexpectedTokenUnaryExponentiation:\n    \"Illegal expression. Wrap left hand side or entire exponentiation in parentheses.\",\n  UnsupportedBind: \"Binding should be performed on object property.\",\n  UnsupportedDecoratorExport:\n    \"A decorated export must export a class declaration\",\n  UnsupportedDefaultExport:\n    \"Only expressions, functions or classes are allowed as the `default` export.\",\n  UnsupportedImport: \"import can only be used in import() or import.meta\",\n  UnsupportedMetaProperty: \"The only valid meta property for %0 is %0.%1\",\n  UnsupportedParameterDecorator:\n    \"Decorators cannot be used to decorate parameters\",\n  UnsupportedPropertyDecorator:\n    \"Decorators cannot be used to decorate object literal properties\",\n  UnsupportedSuper:\n    \"super can only be used with function calls (i.e. super()) or in property accesses (i.e. super.prop or super[prop])\",\n  UnterminatedComment: \"Unterminated comment\",\n  UnterminatedRegExp: \"Unterminated regular expression\",\n  UnterminatedString: \"Unterminated string constant\",\n  UnterminatedTemplate: \"Unterminated template\",\n  VarRedeclaration: \"Identifier '%0' has already been declared\",\n  YieldBindingIdentifier:\n    \"Can not use 'yield' as identifier inside a generator\",\n  YieldInParameter: \"yield is not allowed in generator parameters\",\n  ZeroDigitNumericSeparator:\n    \"Numeric separator can not be used after leading 0\",\n});\n\nexport default class LocationParser extends CommentsParser {\n  // Forward-declaration: defined in tokenizer/index.js\n  /*::\n  +isLookahead: boolean;\n  */\n\n  getLocationForPosition(pos: number): Position {\n    let loc;\n    if (pos === this.state.start) loc = this.state.startLoc;\n    else if (pos === this.state.lastTokStart) loc = this.state.lastTokStartLoc;\n    else if (pos === this.state.end) loc = this.state.endLoc;\n    else if (pos === this.state.lastTokEnd) loc = this.state.lastTokEndLoc;\n    else loc = getLineInfo(this.input, pos);\n\n    return loc;\n  }\n\n  raise(pos: number, errorTemplate: string, ...params: any): Error | empty {\n    return this.raiseWithData(pos, undefined, errorTemplate, ...params);\n  }\n\n  raiseWithData(\n    pos: number,\n    data?: {\n      missingPlugin?: Array<string>,\n      code?: string,\n    },\n    errorTemplate: string,\n    ...params: any\n  ): Error | empty {\n    const loc = this.getLocationForPosition(pos);\n    const message =\n      errorTemplate.replace(/%(\\d+)/g, (_, i: number) => params[i]) +\n      ` (${loc.line}:${loc.column})`;\n    return this._raise(Object.assign(({ loc, pos }: Object), data), message);\n  }\n\n  _raise(errorContext: ErrorContext, message: string): Error | empty {\n    // $FlowIgnore\n    const err: SyntaxError & ErrorContext = new SyntaxError(message);\n    Object.assign(err, errorContext);\n    if (this.options.errorRecovery) {\n      if (!this.isLookahead) this.state.errors.push(err);\n      return err;\n    } else {\n      throw err;\n    }\n  }\n}\n","// @flow\n\nimport { types as tt, TokenType } from \"../tokenizer/types\";\nimport type Parser from \"../parser\";\nimport type { ExpressionErrors } from \"../parser/util\";\nimport * as N from \"../types\";\nimport type { Position } from \"../util/location\";\nimport { type BindingTypes, BIND_NONE } from \"../util/scopeflags\";\nimport { Errors } from \"../parser/location\";\n\nfunction isSimpleProperty(node: N.Node): boolean {\n  return (\n    node != null &&\n    node.type === \"Property\" &&\n    node.kind === \"init\" &&\n    node.method === false\n  );\n}\n\nexport default (superClass: Class<Parser>): Class<Parser> =>\n  class extends superClass {\n    estreeParseRegExpLiteral({ pattern, flags }: N.RegExpLiteral): N.Node {\n      let regex = null;\n      try {\n        regex = new RegExp(pattern, flags);\n      } catch (e) {\n        // In environments that don't support these flags value will\n        // be null as the regex can't be represented natively.\n      }\n      const node = this.estreeParseLiteral(regex);\n      node.regex = { pattern, flags };\n\n      return node;\n    }\n\n    estreeParseBigIntLiteral(value: any): N.Node {\n      // https://github.com/estree/estree/blob/master/es2020.md#bigintliteral\n      // $FlowIgnore\n      const bigInt = typeof BigInt !== \"undefined\" ? BigInt(value) : null;\n      const node = this.estreeParseLiteral(bigInt);\n      node.bigint = String(node.value || value);\n\n      return node;\n    }\n\n    estreeParseLiteral(value: any): N.Node {\n      return this.parseLiteral(value, \"Literal\");\n    }\n\n    directiveToStmt(directive: N.Directive): N.ExpressionStatement {\n      const directiveLiteral = directive.value;\n\n      const stmt = this.startNodeAt(directive.start, directive.loc.start);\n      const expression = this.startNodeAt(\n        directiveLiteral.start,\n        directiveLiteral.loc.start,\n      );\n\n      expression.value = directiveLiteral.value;\n      expression.raw = directiveLiteral.extra.raw;\n\n      stmt.expression = this.finishNodeAt(\n        expression,\n        \"Literal\",\n        directiveLiteral.end,\n        directiveLiteral.loc.end,\n      );\n      stmt.directive = directiveLiteral.extra.raw.slice(1, -1);\n\n      return this.finishNodeAt(\n        stmt,\n        \"ExpressionStatement\",\n        directive.end,\n        directive.loc.end,\n      );\n    }\n\n    // ==================================\n    // Overrides\n    // ==================================\n\n    initFunction(\n      node: N.BodilessFunctionOrMethodBase,\n      isAsync: ?boolean,\n    ): void {\n      super.initFunction(node, isAsync);\n      node.expression = false;\n    }\n\n    checkDeclaration(node: N.Pattern | N.ObjectProperty): void {\n      if (isSimpleProperty(node)) {\n        this.checkDeclaration(((node: any): N.EstreeProperty).value);\n      } else {\n        super.checkDeclaration(node);\n      }\n    }\n\n    checkGetterSetterParams(method: N.ObjectMethod | N.ClassMethod): void {\n      const prop = ((method: any): N.EstreeProperty | N.EstreeMethodDefinition);\n      const paramCount = prop.kind === \"get\" ? 0 : 1;\n      const start = prop.start;\n      if (prop.value.params.length !== paramCount) {\n        if (method.kind === \"get\") {\n          this.raise(start, Errors.BadGetterArity);\n        } else {\n          this.raise(start, Errors.BadSetterArity);\n        }\n      } else if (\n        prop.kind === \"set\" &&\n        prop.value.params[0].type === \"RestElement\"\n      ) {\n        this.raise(start, Errors.BadSetterRestParameter);\n      }\n    }\n\n    checkLVal(\n      expr: N.Expression,\n      bindingType: BindingTypes = BIND_NONE,\n      checkClashes: ?{ [key: string]: boolean },\n      contextDescription: string,\n      disallowLetBinding?: boolean,\n    ): void {\n      switch (expr.type) {\n        case \"ObjectPattern\":\n          expr.properties.forEach(prop => {\n            this.checkLVal(\n              prop.type === \"Property\" ? prop.value : prop,\n              bindingType,\n              checkClashes,\n              \"object destructuring pattern\",\n              disallowLetBinding,\n            );\n          });\n          break;\n        default:\n          super.checkLVal(\n            expr,\n            bindingType,\n            checkClashes,\n            contextDescription,\n            disallowLetBinding,\n          );\n      }\n    }\n\n    checkDuplicatedProto(\n      prop: N.ObjectMember | N.SpreadElement,\n      protoRef: { used: boolean },\n      refExpressionErrors: ?ExpressionErrors,\n    ): void {\n      if (\n        prop.type === \"SpreadElement\" ||\n        prop.computed ||\n        prop.method ||\n        // $FlowIgnore\n        prop.shorthand\n      ) {\n        return;\n      }\n\n      const key = prop.key;\n      // It is either an Identifier or a String/NumericLiteral\n      const name = key.type === \"Identifier\" ? key.name : String(key.value);\n\n      if (name === \"__proto__\" && prop.kind === \"init\") {\n        // Store the first redefinition's position\n        if (protoRef.used) {\n          if (refExpressionErrors && refExpressionErrors.doubleProto === -1) {\n            refExpressionErrors.doubleProto = key.start;\n          } else {\n            this.raise(key.start, Errors.DuplicateProto);\n          }\n        }\n\n        protoRef.used = true;\n      }\n    }\n\n    isValidDirective(stmt: N.Statement): boolean {\n      return (\n        stmt.type === \"ExpressionStatement\" &&\n        stmt.expression.type === \"Literal\" &&\n        typeof stmt.expression.value === \"string\" &&\n        (!stmt.expression.extra || !stmt.expression.extra.parenthesized)\n      );\n    }\n\n    stmtToDirective(stmt: N.Statement): N.Directive {\n      const directive = super.stmtToDirective(stmt);\n      const value = stmt.expression.value;\n\n      // Reset value to the actual value as in estree mode we want\n      // the stmt to have the real value and not the raw value\n      directive.value.value = value;\n\n      return directive;\n    }\n\n    parseBlockBody(\n      node: N.BlockStatementLike,\n      allowDirectives: ?boolean,\n      topLevel: boolean,\n      end: TokenType,\n    ): void {\n      super.parseBlockBody(node, allowDirectives, topLevel, end);\n\n      const directiveStatements = node.directives.map(d =>\n        this.directiveToStmt(d),\n      );\n      node.body = directiveStatements.concat(node.body);\n      delete node.directives;\n    }\n\n    pushClassMethod(\n      classBody: N.ClassBody,\n      method: N.ClassMethod,\n      isGenerator: boolean,\n      isAsync: boolean,\n      isConstructor: boolean,\n      allowsDirectSuper: boolean,\n    ): void {\n      this.parseMethod(\n        method,\n        isGenerator,\n        isAsync,\n        isConstructor,\n        allowsDirectSuper,\n        \"ClassMethod\",\n        true,\n      );\n      if (method.typeParameters) {\n        // $FlowIgnore\n        method.value.typeParameters = method.typeParameters;\n        delete method.typeParameters;\n      }\n      classBody.body.push(method);\n    }\n\n    parseExprAtom(refExpressionErrors?: ?ExpressionErrors): N.Expression {\n      switch (this.state.type) {\n        case tt.num:\n        case tt.string:\n          return this.estreeParseLiteral(this.state.value);\n\n        case tt.regexp:\n          return this.estreeParseRegExpLiteral(this.state.value);\n\n        case tt.bigint:\n          return this.estreeParseBigIntLiteral(this.state.value);\n\n        case tt._null:\n          return this.estreeParseLiteral(null);\n\n        case tt._true:\n          return this.estreeParseLiteral(true);\n\n        case tt._false:\n          return this.estreeParseLiteral(false);\n\n        default:\n          return super.parseExprAtom(refExpressionErrors);\n      }\n    }\n\n    parseLiteral<T: N.Literal>(\n      value: any,\n      type: /*T[\"kind\"]*/ string,\n      startPos?: number,\n      startLoc?: Position,\n    ): T {\n      const node = super.parseLiteral(value, type, startPos, startLoc);\n      node.raw = node.extra.raw;\n      delete node.extra;\n\n      return node;\n    }\n\n    parseFunctionBody(\n      node: N.Function,\n      allowExpression: ?boolean,\n      isMethod?: boolean = false,\n    ): void {\n      super.parseFunctionBody(node, allowExpression, isMethod);\n      node.expression = node.body.type !== \"BlockStatement\";\n    }\n\n    parseMethod<T: N.MethodLike>(\n      node: T,\n      isGenerator: boolean,\n      isAsync: boolean,\n      isConstructor: boolean,\n      allowDirectSuper: boolean,\n      type: string,\n      inClassScope: boolean = false,\n    ): T {\n      let funcNode = this.startNode();\n      funcNode.kind = node.kind; // provide kind, so super method correctly sets state\n      funcNode = super.parseMethod(\n        funcNode,\n        isGenerator,\n        isAsync,\n        isConstructor,\n        allowDirectSuper,\n        type,\n        inClassScope,\n      );\n      funcNode.type = \"FunctionExpression\";\n      delete funcNode.kind;\n      // $FlowIgnore\n      node.value = funcNode;\n\n      type = type === \"ClassMethod\" ? \"MethodDefinition\" : type;\n      return this.finishNode(node, type);\n    }\n\n    parseObjectMethod(\n      prop: N.ObjectMethod,\n      isGenerator: boolean,\n      isAsync: boolean,\n      isPattern: boolean,\n      containsEsc: boolean,\n    ): ?N.ObjectMethod {\n      const node: N.EstreeProperty = (super.parseObjectMethod(\n        prop,\n        isGenerator,\n        isAsync,\n        isPattern,\n        containsEsc,\n      ): any);\n\n      if (node) {\n        node.type = \"Property\";\n        if (((node: any): N.ClassMethod).kind === \"method\") node.kind = \"init\";\n        node.shorthand = false;\n      }\n\n      return (node: any);\n    }\n\n    parseObjectProperty(\n      prop: N.ObjectProperty,\n      startPos: ?number,\n      startLoc: ?Position,\n      isPattern: boolean,\n      refExpressionErrors: ?ExpressionErrors,\n    ): ?N.ObjectProperty {\n      const node: N.EstreeProperty = (super.parseObjectProperty(\n        prop,\n        startPos,\n        startLoc,\n        isPattern,\n        refExpressionErrors,\n      ): any);\n\n      if (node) {\n        node.kind = \"init\";\n        node.type = \"Property\";\n      }\n\n      return (node: any);\n    }\n\n    toAssignable(node: N.Node): N.Node {\n      if (isSimpleProperty(node)) {\n        this.toAssignable(node.value);\n\n        return node;\n      }\n\n      return super.toAssignable(node);\n    }\n\n    toAssignableObjectExpressionProp(prop: N.Node, isLast: boolean) {\n      if (prop.kind === \"get\" || prop.kind === \"set\") {\n        throw this.raise(prop.key.start, Errors.PatternHasAccessor);\n      } else if (prop.method) {\n        throw this.raise(prop.key.start, Errors.PatternHasMethod);\n      } else {\n        super.toAssignableObjectExpressionProp(prop, isLast);\n      }\n    }\n\n    finishCallExpression<T: N.CallExpression | N.OptionalCallExpression>(\n      node: T,\n      optional: boolean,\n    ): N.Expression {\n      super.finishCallExpression(node, optional);\n\n      if (node.callee.type === \"Import\") {\n        ((node: N.Node): N.EstreeImportExpression).type = \"ImportExpression\";\n        ((node: N.Node): N.EstreeImportExpression).source = node.arguments[0];\n        delete node.arguments;\n        delete node.callee;\n      }\n\n      return node;\n    }\n\n    toReferencedListDeep(\n      exprList: $ReadOnlyArray<?N.Expression>,\n      isParenthesizedExpr?: boolean,\n    ): void {\n      // ImportExpressions do not have an arguments array.\n      if (!exprList) {\n        return;\n      }\n\n      super.toReferencedListDeep(exprList, isParenthesizedExpr);\n    }\n\n    parseExport(node: N.Node) {\n      super.parseExport(node);\n\n      switch (node.type) {\n        case \"ExportAllDeclaration\":\n          node.exported = null;\n          break;\n\n        case \"ExportNamedDeclaration\":\n          if (\n            node.specifiers.length === 1 &&\n            node.specifiers[0].type === \"ExportNamespaceSpecifier\"\n          ) {\n            node.type = \"ExportAllDeclaration\";\n            node.exported = node.specifiers[0].exported;\n            delete node.specifiers;\n          }\n\n          break;\n      }\n\n      return node;\n    }\n  };\n","// @flow\n\n// The algorithm used to determine whether a regexp can appear at a\n// given point in the program is loosely based on sweet.js' approach.\n// See https://github.com/mozilla/sweet.js/wiki/design\n\nimport { types as tt } from \"./types\";\nimport { lineBreak } from \"../util/whitespace\";\n\nexport class TokContext {\n  constructor(\n    token: string,\n    isExpr?: boolean,\n    preserveSpace?: boolean,\n    override?: ?Function, // Takes a Tokenizer as a this-parameter, and returns void.\n  ) {\n    this.token = token;\n    this.isExpr = !!isExpr;\n    this.preserveSpace = !!preserveSpace;\n    this.override = override;\n  }\n\n  token: string;\n  isExpr: boolean;\n  preserveSpace: boolean;\n  override: ?Function;\n}\n\nexport const types: {\n  [key: string]: TokContext,\n} = {\n  braceStatement: new TokContext(\"{\", false),\n  braceExpression: new TokContext(\"{\", true),\n  templateQuasi: new TokContext(\"${\", false),\n  parenStatement: new TokContext(\"(\", false),\n  parenExpression: new TokContext(\"(\", true),\n  template: new TokContext(\"`\", true, true, p => p.readTmplToken()),\n  functionExpression: new TokContext(\"function\", true),\n  functionStatement: new TokContext(\"function\", false),\n};\n\n// Token-specific context update code\n\ntt.parenR.updateContext = tt.braceR.updateContext = function() {\n  if (this.state.context.length === 1) {\n    this.state.exprAllowed = true;\n    return;\n  }\n\n  let out = this.state.context.pop();\n  if (out === types.braceStatement && this.curContext().token === \"function\") {\n    out = this.state.context.pop();\n  }\n\n  this.state.exprAllowed = !out.isExpr;\n};\n\ntt.name.updateContext = function(prevType) {\n  let allowed = false;\n  if (prevType !== tt.dot) {\n    if (\n      (this.state.value === \"of\" && !this.state.exprAllowed) ||\n      (this.state.value === \"yield\" && this.prodParam.hasYield)\n    ) {\n      allowed = true;\n    }\n  }\n  this.state.exprAllowed = allowed;\n\n  if (this.state.isIterator) {\n    this.state.isIterator = false;\n  }\n};\n\ntt.braceL.updateContext = function(prevType) {\n  this.state.context.push(\n    this.braceIsBlock(prevType) ? types.braceStatement : types.braceExpression,\n  );\n  this.state.exprAllowed = true;\n};\n\ntt.dollarBraceL.updateContext = function() {\n  this.state.context.push(types.templateQuasi);\n  this.state.exprAllowed = true;\n};\n\ntt.parenL.updateContext = function(prevType) {\n  const statementParens =\n    prevType === tt._if ||\n    prevType === tt._for ||\n    prevType === tt._with ||\n    prevType === tt._while;\n  this.state.context.push(\n    statementParens ? types.parenStatement : types.parenExpression,\n  );\n  this.state.exprAllowed = true;\n};\n\ntt.incDec.updateContext = function() {\n  // tokExprAllowed stays unchanged\n};\n\ntt._function.updateContext = tt._class.updateContext = function(prevType) {\n  if (\n    prevType.beforeExpr &&\n    prevType !== tt.semi &&\n    prevType !== tt._else &&\n    !(\n      prevType === tt._return &&\n      lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start))\n    ) &&\n    !(\n      (prevType === tt.colon || prevType === tt.braceL) &&\n      this.curContext() === types.b_stat\n    )\n  ) {\n    this.state.context.push(types.functionExpression);\n  } else {\n    this.state.context.push(types.functionStatement);\n  }\n\n  this.state.exprAllowed = false;\n};\n\ntt.backQuote.updateContext = function() {\n  if (this.curContext() === types.template) {\n    this.state.context.pop();\n  } else {\n    this.state.context.push(types.template);\n  }\n  this.state.exprAllowed = false;\n};\n","// @flow\n\nimport * as charCodes from \"charcodes\";\n\n// ## Character categories\n\n// Big ugly regular expressions that match characters in the\n// whitespace, identifier, and identifier-start categories. These\n// are only applied when a character is found to actually have a\n// code point between 0x80 and 0xffff.\n// Generated by `scripts/generate-identifier-regex.js`.\n\n/* prettier-ignore */\nlet nonASCIIidentifierStartChars = \"\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u037f\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u052f\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05d0-\\u05ea\\u05ef-\\u05f2\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086a\\u08a0-\\u08b4\\u08b6-\\u08c7\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u09fc\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0af9\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c39\\u0c3d\\u0c58-\\u0c5a\\u0c60\\u0c61\\u0c80\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d04-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d54-\\u0d56\\u0d5f-\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e81\\u0e82\\u0e84\\u0e86-\\u0e8a\\u0e8c-\\u0ea3\\u0ea5\\u0ea7-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0edc-\\u0edf\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u1000-\\u102a\\u103f\\u1050-\\u1055\\u105a-\\u105d\\u1061\\u1065\\u1066\\u106e-\\u1070\\u1075-\\u1081\\u108e\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f5\\u13f8-\\u13fd\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f8\\u1700-\\u170c\\u170e-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1878\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4b\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1c80-\\u1c88\\u1c90-\\u1cba\\u1cbd-\\u1cbf\\u1ce9-\\u1cec\\u1cee-\\u1cf3\\u1cf5\\u1cf6\\u1cfa\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2118-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2c2e\\u2c30-\\u2c5e\\u2c60-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309b-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312f\\u3131-\\u318e\\u31a0-\\u31bf\\u31f0-\\u31ff\\u3400-\\u4dbf\\u4e00-\\u9ffc\\ua000-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua69d\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua7bf\\ua7c2-\\ua7ca\\ua7f5-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua8fd\\ua8fe\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\ua9e0-\\ua9e4\\ua9e6-\\ua9ef\\ua9fa-\\ua9fe\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa60-\\uaa76\\uaa7a\\uaa7e-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaea\\uaaf2-\\uaaf4\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uab30-\\uab5a\\uab5c-\\uab69\\uab70-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc\";\n/* prettier-ignore */\nlet nonASCIIidentifierChars = \"\\u200c\\u200d\\xb7\\u0300-\\u036f\\u0387\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u0669\\u0670\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u06f0-\\u06f9\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07c0-\\u07c9\\u07eb-\\u07f3\\u07fd\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0859-\\u085b\\u08d3-\\u08e1\\u08e3-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2\\u09e3\\u09e6-\\u09ef\\u09fe\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2\\u0ae3\\u0ae6-\\u0aef\\u0afa-\\u0aff\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b55-\\u0b57\\u0b62\\u0b63\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c00-\\u0c04\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0c66-\\u0c6f\\u0c81-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0ce6-\\u0cef\\u0d00-\\u0d03\\u0d3b\\u0d3c\\u0d3e-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d62\\u0d63\\u0d66-\\u0d6f\\u0d81-\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0de6-\\u0def\\u0df2\\u0df3\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0e50-\\u0e59\\u0eb1\\u0eb4-\\u0ebc\\u0ec8-\\u0ecd\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102b-\\u103e\\u1040-\\u1049\\u1056-\\u1059\\u105e-\\u1060\\u1062-\\u1064\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u1369-\\u1371\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b4-\\u17d3\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u1810-\\u1819\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u1946-\\u194f\\u19d0-\\u19da\\u1a17-\\u1a1b\\u1a55-\\u1a5e\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1ab0-\\u1abd\\u1abf\\u1ac0\\u1b00-\\u1b04\\u1b34-\\u1b44\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1b80-\\u1b82\\u1ba1-\\u1bad\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c24-\\u1c37\\u1c40-\\u1c49\\u1c50-\\u1c59\\u1cd0-\\u1cd2\\u1cd4-\\u1ce8\\u1ced\\u1cf4\\u1cf7-\\u1cf9\\u1dc0-\\u1df9\\u1dfb-\\u1dff\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2cef-\\u2cf1\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua620-\\ua629\\ua66f\\ua674-\\ua67d\\ua69e\\ua69f\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ua82c\\ua880\\ua881\\ua8b4-\\ua8c5\\ua8d0-\\ua8d9\\ua8e0-\\ua8f1\\ua8ff-\\ua909\\ua926-\\ua92d\\ua947-\\ua953\\ua980-\\ua983\\ua9b3-\\ua9c0\\ua9d0-\\ua9d9\\ua9e5\\ua9f0-\\ua9f9\\uaa29-\\uaa36\\uaa43\\uaa4c\\uaa4d\\uaa50-\\uaa59\\uaa7b-\\uaa7d\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uaaeb-\\uaaef\\uaaf5\\uaaf6\\uabe3-\\uabea\\uabec\\uabed\\uabf0-\\uabf9\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe2f\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\";\n\nconst nonASCIIidentifierStart = new RegExp(\n  \"[\" + nonASCIIidentifierStartChars + \"]\",\n);\nconst nonASCIIidentifier = new RegExp(\n  \"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\",\n);\n\nnonASCIIidentifierStartChars = nonASCIIidentifierChars = null;\n\n// These are a run-length and offset-encoded representation of the\n// >0xffff code points that are a valid part of identifiers. The\n// offset starts at 0x10000, and each pair of numbers represents an\n// offset to the next range, and then a size of the range. They were\n// generated by `scripts/generate-identifier-regex.js`.\n/* prettier-ignore */\n/* prettier-ignore */\nconst astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,349,41,7,1,79,28,11,0,9,21,107,20,28,22,13,52,76,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,230,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,35,56,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,190,0,80,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,43,8,8952,286,50,2,18,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,2357,44,11,6,17,0,370,43,1301,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42717,35,4148,12,221,3,5761,15,7472,3104,541,1507,4938];\n/* prettier-ignore */\nconst astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,370,1,154,10,176,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,161,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,19306,9,135,4,60,6,26,9,1014,0,2,54,8,3,82,0,12,1,19628,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,262,6,10,9,419,13,1495,6,110,6,6,9,4759,9,787719,239];\n\n// This has a complexity linear to the value of the code. The\n// assumption is that looking up astral identifier characters is\n// rare.\nfunction isInAstralSet(code: number, set: $ReadOnlyArray<number>): boolean {\n  let pos = 0x10000;\n  for (let i = 0, length = set.length; i < length; i += 2) {\n    pos += set[i];\n    if (pos > code) return false;\n\n    pos += set[i + 1];\n    if (pos >= code) return true;\n  }\n  return false;\n}\n\n// Test whether a given character code starts an identifier.\n\nexport function isIdentifierStart(code: number): boolean {\n  if (code < charCodes.uppercaseA) return code === charCodes.dollarSign;\n  if (code <= charCodes.uppercaseZ) return true;\n  if (code < charCodes.lowercaseA) return code === charCodes.underscore;\n  if (code <= charCodes.lowercaseZ) return true;\n  if (code <= 0xffff) {\n    return (\n      code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code))\n    );\n  }\n  return isInAstralSet(code, astralIdentifierStartCodes);\n}\n\n// Test whether a given character is part of an identifier.\n\nexport function isIdentifierChar(code: number): boolean {\n  if (code < charCodes.digit0) return code === charCodes.dollarSign;\n  if (code < charCodes.colon) return true;\n  if (code < charCodes.uppercaseA) return false;\n  if (code <= charCodes.uppercaseZ) return true;\n  if (code < charCodes.lowercaseA) return code === charCodes.underscore;\n  if (code <= charCodes.lowercaseZ) return true;\n  if (code <= 0xffff) {\n    return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));\n  }\n  return (\n    isInAstralSet(code, astralIdentifierStartCodes) ||\n    isInAstralSet(code, astralIdentifierCodes)\n  );\n}\n\n// Test whether a given string is a valid identifier name\n\nexport function isIdentifierName(name: string): boolean {\n  let isFirst = true;\n  for (const char of Array.from(name)) {\n    const cp = char.codePointAt(0);\n    if (isFirst) {\n      if (!isIdentifierStart(cp)) {\n        return false;\n      }\n      isFirst = false;\n    } else if (!isIdentifierChar(cp)) {\n      return false;\n    }\n  }\n  return true;\n}\n","// @flow\n\nconst reservedWords = {\n  keyword: [\n    \"break\",\n    \"case\",\n    \"catch\",\n    \"continue\",\n    \"debugger\",\n    \"default\",\n    \"do\",\n    \"else\",\n    \"finally\",\n    \"for\",\n    \"function\",\n    \"if\",\n    \"return\",\n    \"switch\",\n    \"throw\",\n    \"try\",\n    \"var\",\n    \"const\",\n    \"while\",\n    \"with\",\n    \"new\",\n    \"this\",\n    \"super\",\n    \"class\",\n    \"extends\",\n    \"export\",\n    \"import\",\n    \"null\",\n    \"true\",\n    \"false\",\n    \"in\",\n    \"instanceof\",\n    \"typeof\",\n    \"void\",\n    \"delete\",\n  ],\n  strict: [\n    \"implements\",\n    \"interface\",\n    \"let\",\n    \"package\",\n    \"private\",\n    \"protected\",\n    \"public\",\n    \"static\",\n    \"yield\",\n  ],\n  strictBind: [\"eval\", \"arguments\"],\n};\nconst keywords = new Set(reservedWords.keyword);\nconst reservedWordsStrictSet = new Set(reservedWords.strict);\nconst reservedWordsStrictBindSet = new Set(reservedWords.strictBind);\n\n/**\n * Checks if word is a reserved word in non-strict mode\n */\nexport function isReservedWord(word: string, inModule: boolean): boolean {\n  return (inModule && word === \"await\") || word === \"enum\";\n}\n\n/**\n * Checks if word is a reserved word in non-binding strict mode\n *\n * Includes non-strict reserved words\n */\nexport function isStrictReservedWord(word: string, inModule: boolean): boolean {\n  return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word);\n}\n\n/**\n * Checks if word is a reserved word in binding strict mode, but it is allowed as\n * a normal identifier.\n */\nexport function isStrictBindOnlyReservedWord(word: string): boolean {\n  return reservedWordsStrictBindSet.has(word);\n}\n\n/**\n * Checks if word is a reserved word in binding strict mode\n *\n * Includes non-strict reserved words and non-binding strict reserved words\n */\nexport function isStrictBindReservedWord(\n  word: string,\n  inModule: boolean,\n): boolean {\n  return (\n    isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word)\n  );\n}\n\nexport function isKeyword(word: string): boolean {\n  return keywords.has(word);\n}\n","/* eslint max-len: 0 */\n\n// @flow\n\nimport * as charCodes from \"charcodes\";\n\nexport {\n  isIdentifierStart,\n  isIdentifierChar,\n  isReservedWord,\n  isStrictBindOnlyReservedWord,\n  isStrictBindReservedWord,\n  isStrictReservedWord,\n  isKeyword,\n} from \"@babel/helper-validator-identifier\";\n\nexport const keywordRelationalOperator = /^in(stanceof)?$/;\n\n// Test whether a current state character code and next character code is @\n\nexport function isIteratorStart(current: number, next: number): boolean {\n  return current === charCodes.atSign && next === charCodes.atSign;\n}\n","// @flow\n\n/*:: declare var invariant; */\n\nimport type Parser from \"../parser\";\nimport { types as tt, type TokenType } from \"../tokenizer/types\";\nimport * as N from \"../types\";\nimport type { Options } from \"../options\";\nimport type { Pos, Position } from \"../util/location\";\nimport type State from \"../tokenizer/state\";\nimport { types as tc } from \"../tokenizer/context\";\nimport * as charCodes from \"charcodes\";\nimport { isIteratorStart } from \"../util/identifier\";\nimport {\n  type BindingTypes,\n  BIND_NONE,\n  BIND_LEXICAL,\n  BIND_VAR,\n  BIND_FUNCTION,\n  SCOPE_ARROW,\n  SCOPE_FUNCTION,\n  SCOPE_OTHER,\n} from \"../util/scopeflags\";\nimport type { ExpressionErrors } from \"../parser/util\";\nimport { Errors } from \"../parser/location\";\n\nconst reservedTypes = new Set([\n  \"_\",\n  \"any\",\n  \"bool\",\n  \"boolean\",\n  \"empty\",\n  \"extends\",\n  \"false\",\n  \"interface\",\n  \"mixed\",\n  \"null\",\n  \"number\",\n  \"static\",\n  \"string\",\n  \"true\",\n  \"typeof\",\n  \"void\",\n]);\n\n/* eslint sort-keys: \"error\" */\n// The Errors key follows https://github.com/facebook/flow/blob/master/src/parser/parse_error.ml unless it does not exist\nconst FlowErrors = Object.freeze({\n  AmbiguousConditionalArrow:\n    \"Ambiguous expression: wrap the arrow functions in parentheses to disambiguate.\",\n  AmbiguousDeclareModuleKind:\n    \"Found both `declare module.exports` and `declare export` in the same module. Modules can only have 1 since they are either an ES module or they are a CommonJS module\",\n  AssignReservedType: \"Cannot overwrite reserved type %0\",\n  DeclareClassElement:\n    \"The `declare` modifier can only appear on class fields.\",\n  DeclareClassFieldInitializer:\n    \"Initializers are not allowed in fields with the `declare` modifier.\",\n  DuplicateDeclareModuleExports: \"Duplicate `declare module.exports` statement\",\n  EnumBooleanMemberNotInitialized:\n    \"Boolean enum members need to be initialized. Use either `%0 = true,` or `%0 = false,` in enum `%1`.\",\n  EnumDuplicateMemberName:\n    \"Enum member names need to be unique, but the name `%0` has already been used before in enum `%1`.\",\n  EnumInconsistentMemberValues:\n    \"Enum `%0` has inconsistent member initializers. Either use no initializers, or consistently use literals (either booleans, numbers, or strings) for all member initializers.\",\n  EnumInvalidExplicitType:\n    \"Enum type `%1` is not valid. Use one of `boolean`, `number`, `string`, or `symbol` in enum `%0`.\",\n  EnumInvalidExplicitTypeUnknownSupplied:\n    \"Supplied enum type is not valid. Use one of `boolean`, `number`, `string`, or `symbol` in enum `%0`.\",\n  EnumInvalidMemberInitializerPrimaryType:\n    \"Enum `%0` has type `%2`, so the initializer of `%1` needs to be a %2 literal.\",\n  EnumInvalidMemberInitializerSymbolType:\n    \"Symbol enum members cannot be initialized. Use `%1,` in enum `%0`.\",\n  EnumInvalidMemberInitializerUnknownType:\n    \"The enum member initializer for `%1` needs to be a literal (either a boolean, number, or string) in enum `%0`.\",\n  EnumInvalidMemberName:\n    \"Enum member names cannot start with lowercase 'a' through 'z'. Instead of using `%0`, consider using `%1`, in enum `%2`.\",\n  EnumNumberMemberNotInitialized:\n    \"Number enum members need to be initialized, e.g. `%1 = 1` in enum `%0`.\",\n  EnumStringMemberInconsistentlyInitailized:\n    \"String enum members need to consistently either all use initializers, or use no initializers, in enum `%0`.\",\n  ImportTypeShorthandOnlyInPureImport:\n    \"The `type` and `typeof` keywords on named imports can only be used on regular `import` statements. It cannot be used with `import type` or `import typeof` statements\",\n  InexactInsideExact:\n    \"Explicit inexact syntax cannot appear inside an explicit exact object type\",\n  InexactInsideNonObject:\n    \"Explicit inexact syntax cannot appear in class or interface definitions\",\n  InexactVariance: \"Explicit inexact syntax cannot have variance\",\n  InvalidNonTypeImportInDeclareModule:\n    \"Imports within a `declare module` body must always be `import type` or `import typeof`\",\n  MissingTypeParamDefault:\n    \"Type parameter declaration needs a default, since a preceding type parameter declaration has a default.\",\n  NestedDeclareModule:\n    \"`declare module` cannot be used inside another `declare module`\",\n  NestedFlowComment: \"Cannot have a flow comment inside another flow comment\",\n  OptionalBindingPattern:\n    \"A binding pattern parameter cannot be optional in an implementation signature.\",\n  SpreadVariance: \"Spread properties cannot have variance\",\n  TypeBeforeInitializer:\n    \"Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`\",\n  TypeCastInPattern:\n    \"The type cast expression is expected to be wrapped with parenthesis\",\n  UnexpectedExplicitInexactInObject:\n    \"Explicit inexact syntax must appear at the end of an inexact object\",\n  UnexpectedReservedType: \"Unexpected reserved type %0\",\n  UnexpectedReservedUnderscore:\n    \"`_` is only allowed as a type argument to call or new\",\n  UnexpectedSpaceBetweenModuloChecks:\n    \"Spaces between `%` and `checks` are not allowed here.\",\n  UnexpectedSpreadType:\n    \"Spread operator cannot appear in class or interface definitions\",\n  UnexpectedSubtractionOperand:\n    'Unexpected token, expected \"number\" or \"bigint\"',\n  UnexpectedTokenAfterTypeParameter:\n    \"Expected an arrow function after this type parameter declaration\",\n  UnsupportedDeclareExportKind:\n    \"`declare export %0` is not supported. Use `%1` instead\",\n  UnsupportedStatementInDeclareModule:\n    \"Only declares and type imports are allowed inside declare module\",\n  UnterminatedFlowComment: \"Unterminated flow-comment\",\n});\n/* eslint-disable sort-keys */\n\nfunction isEsModuleType(bodyElement: N.Node): boolean {\n  return (\n    bodyElement.type === \"DeclareExportAllDeclaration\" ||\n    (bodyElement.type === \"DeclareExportDeclaration\" &&\n      (!bodyElement.declaration ||\n        (bodyElement.declaration.type !== \"TypeAlias\" &&\n          bodyElement.declaration.type !== \"InterfaceDeclaration\")))\n  );\n}\n\nfunction hasTypeImportKind(node: N.Node): boolean {\n  return node.importKind === \"type\" || node.importKind === \"typeof\";\n}\n\nfunction isMaybeDefaultImport(state: State): boolean {\n  return (\n    (state.type === tt.name || !!state.type.keyword) && state.value !== \"from\"\n  );\n}\n\nconst exportSuggestions = {\n  const: \"declare export var\",\n  let: \"declare export var\",\n  type: \"export type\",\n  interface: \"export interface\",\n};\n\n// Like Array#filter, but returns a tuple [ acceptedElements, discardedElements ]\nfunction partition<T>(\n  list: T[],\n  test: (T, number, T[]) => ?boolean,\n): [T[], T[]] {\n  const list1 = [];\n  const list2 = [];\n  for (let i = 0; i < list.length; i++) {\n    (test(list[i], i, list) ? list1 : list2).push(list[i]);\n  }\n  return [list1, list2];\n}\n\nconst FLOW_PRAGMA_REGEX = /\\*?\\s*@((?:no)?flow)\\b/;\n\n// Flow enums types\ntype EnumExplicitType = null | \"boolean\" | \"number\" | \"string\" | \"symbol\";\ntype EnumContext = {|\n  enumName: string,\n  explicitType: EnumExplicitType,\n  memberName: string,\n|};\ntype EnumMemberInit =\n  | {| type: \"number\", pos: number, value: N.Node |}\n  | {| type: \"string\", pos: number, value: N.Node |}\n  | {| type: \"boolean\", pos: number, value: N.Node |}\n  | {| type: \"invalid\", pos: number |}\n  | {| type: \"none\", pos: number |};\n\nexport default (superClass: Class<Parser>): Class<Parser> =>\n  class extends superClass {\n    // The value of the @flow/@noflow pragma. Initially undefined, transitions\n    // to \"@flow\" or \"@noflow\" if we see a pragma. Transitions to null if we are\n    // past the initial comment.\n    flowPragma: void | null | \"flow\" | \"noflow\";\n\n    constructor(options: ?Options, input: string) {\n      super(options, input);\n      this.flowPragma = undefined;\n    }\n\n    shouldParseTypes(): boolean {\n      return this.getPluginOption(\"flow\", \"all\") || this.flowPragma === \"flow\";\n    }\n\n    shouldParseEnums(): boolean {\n      return !!this.getPluginOption(\"flow\", \"enums\");\n    }\n\n    finishToken(type: TokenType, val: any): void {\n      if (\n        type !== tt.string &&\n        type !== tt.semi &&\n        type !== tt.interpreterDirective\n      ) {\n        if (this.flowPragma === undefined) {\n          this.flowPragma = null;\n        }\n      }\n      return super.finishToken(type, val);\n    }\n\n    addComment(comment: N.Comment): void {\n      if (this.flowPragma === undefined) {\n        // Try to parse a flow pragma.\n        const matches = FLOW_PRAGMA_REGEX.exec(comment.value);\n        if (!matches) {\n          // do nothing\n        } else if (matches[1] === \"flow\") {\n          this.flowPragma = \"flow\";\n        } else if (matches[1] === \"noflow\") {\n          this.flowPragma = \"noflow\";\n        } else {\n          throw new Error(\"Unexpected flow pragma\");\n        }\n      }\n      return super.addComment(comment);\n    }\n\n    flowParseTypeInitialiser(tok?: TokenType): N.FlowType {\n      const oldInType = this.state.inType;\n      this.state.inType = true;\n      this.expect(tok || tt.colon);\n\n      const type = this.flowParseType();\n      this.state.inType = oldInType;\n      return type;\n    }\n\n    flowParsePredicate(): N.FlowType {\n      const node = this.startNode();\n      const moduloLoc = this.state.startLoc;\n      const moduloPos = this.state.start;\n      this.expect(tt.modulo);\n      const checksLoc = this.state.startLoc;\n      this.expectContextual(\"checks\");\n      // Force '%' and 'checks' to be adjacent\n      if (\n        moduloLoc.line !== checksLoc.line ||\n        moduloLoc.column !== checksLoc.column - 1\n      ) {\n        this.raise(moduloPos, FlowErrors.UnexpectedSpaceBetweenModuloChecks);\n      }\n      if (this.eat(tt.parenL)) {\n        node.value = this.parseExpression();\n        this.expect(tt.parenR);\n        return this.finishNode(node, \"DeclaredPredicate\");\n      } else {\n        return this.finishNode(node, \"InferredPredicate\");\n      }\n    }\n\n    flowParseTypeAndPredicateInitialiser(): [?N.FlowType, ?N.FlowPredicate] {\n      const oldInType = this.state.inType;\n      this.state.inType = true;\n      this.expect(tt.colon);\n      let type = null;\n      let predicate = null;\n      if (this.match(tt.modulo)) {\n        this.state.inType = oldInType;\n        predicate = this.flowParsePredicate();\n      } else {\n        type = this.flowParseType();\n        this.state.inType = oldInType;\n        if (this.match(tt.modulo)) {\n          predicate = this.flowParsePredicate();\n        }\n      }\n      return [type, predicate];\n    }\n\n    flowParseDeclareClass(node: N.FlowDeclareClass): N.FlowDeclareClass {\n      this.next();\n      this.flowParseInterfaceish(node, /*isClass*/ true);\n      return this.finishNode(node, \"DeclareClass\");\n    }\n\n    flowParseDeclareFunction(\n      node: N.FlowDeclareFunction,\n    ): N.FlowDeclareFunction {\n      this.next();\n\n      const id = (node.id = this.parseIdentifier());\n\n      const typeNode = this.startNode();\n      const typeContainer = this.startNode();\n\n      if (this.isRelational(\"<\")) {\n        typeNode.typeParameters = this.flowParseTypeParameterDeclaration();\n      } else {\n        typeNode.typeParameters = null;\n      }\n\n      this.expect(tt.parenL);\n      const tmp = this.flowParseFunctionTypeParams();\n      typeNode.params = tmp.params;\n      typeNode.rest = tmp.rest;\n      this.expect(tt.parenR);\n\n      [\n        // $FlowFixMe (destructuring not supported yet)\n        typeNode.returnType,\n        // $FlowFixMe (destructuring not supported yet)\n        node.predicate,\n      ] = this.flowParseTypeAndPredicateInitialiser();\n\n      typeContainer.typeAnnotation = this.finishNode(\n        typeNode,\n        \"FunctionTypeAnnotation\",\n      );\n\n      id.typeAnnotation = this.finishNode(typeContainer, \"TypeAnnotation\");\n\n      this.resetEndLocation(id);\n      this.semicolon();\n\n      return this.finishNode(node, \"DeclareFunction\");\n    }\n\n    flowParseDeclare(\n      node: N.FlowDeclare,\n      insideModule?: boolean,\n    ): N.FlowDeclare {\n      if (this.match(tt._class)) {\n        return this.flowParseDeclareClass(node);\n      } else if (this.match(tt._function)) {\n        return this.flowParseDeclareFunction(node);\n      } else if (this.match(tt._var)) {\n        return this.flowParseDeclareVariable(node);\n      } else if (this.eatContextual(\"module\")) {\n        if (this.match(tt.dot)) {\n          return this.flowParseDeclareModuleExports(node);\n        } else {\n          if (insideModule) {\n            this.raise(this.state.lastTokStart, FlowErrors.NestedDeclareModule);\n          }\n          return this.flowParseDeclareModule(node);\n        }\n      } else if (this.isContextual(\"type\")) {\n        return this.flowParseDeclareTypeAlias(node);\n      } else if (this.isContextual(\"opaque\")) {\n        return this.flowParseDeclareOpaqueType(node);\n      } else if (this.isContextual(\"interface\")) {\n        return this.flowParseDeclareInterface(node);\n      } else if (this.match(tt._export)) {\n        return this.flowParseDeclareExportDeclaration(node, insideModule);\n      } else {\n        throw this.unexpected();\n      }\n    }\n\n    flowParseDeclareVariable(\n      node: N.FlowDeclareVariable,\n    ): N.FlowDeclareVariable {\n      this.next();\n      node.id = this.flowParseTypeAnnotatableIdentifier(\n        /*allowPrimitiveOverride*/ true,\n      );\n      this.scope.declareName(node.id.name, BIND_VAR, node.id.start);\n      this.semicolon();\n      return this.finishNode(node, \"DeclareVariable\");\n    }\n\n    flowParseDeclareModule(node: N.FlowDeclareModule): N.FlowDeclareModule {\n      this.scope.enter(SCOPE_OTHER);\n\n      if (this.match(tt.string)) {\n        node.id = this.parseExprAtom();\n      } else {\n        node.id = this.parseIdentifier();\n      }\n\n      const bodyNode = (node.body = this.startNode());\n      const body = (bodyNode.body = []);\n      this.expect(tt.braceL);\n      while (!this.match(tt.braceR)) {\n        let bodyNode = this.startNode();\n\n        if (this.match(tt._import)) {\n          this.next();\n          if (!this.isContextual(\"type\") && !this.match(tt._typeof)) {\n            this.raise(\n              this.state.lastTokStart,\n              FlowErrors.InvalidNonTypeImportInDeclareModule,\n            );\n          }\n          this.parseImport(bodyNode);\n        } else {\n          this.expectContextual(\n            \"declare\",\n            FlowErrors.UnsupportedStatementInDeclareModule,\n          );\n\n          bodyNode = this.flowParseDeclare(bodyNode, true);\n        }\n\n        body.push(bodyNode);\n      }\n\n      this.scope.exit();\n\n      this.expect(tt.braceR);\n\n      this.finishNode(bodyNode, \"BlockStatement\");\n\n      let kind = null;\n      let hasModuleExport = false;\n      body.forEach(bodyElement => {\n        if (isEsModuleType(bodyElement)) {\n          if (kind === \"CommonJS\") {\n            this.raise(\n              bodyElement.start,\n              FlowErrors.AmbiguousDeclareModuleKind,\n            );\n          }\n          kind = \"ES\";\n        } else if (bodyElement.type === \"DeclareModuleExports\") {\n          if (hasModuleExport) {\n            this.raise(\n              bodyElement.start,\n              FlowErrors.DuplicateDeclareModuleExports,\n            );\n          }\n          if (kind === \"ES\") {\n            this.raise(\n              bodyElement.start,\n              FlowErrors.AmbiguousDeclareModuleKind,\n            );\n          }\n          kind = \"CommonJS\";\n          hasModuleExport = true;\n        }\n      });\n\n      node.kind = kind || \"CommonJS\";\n      return this.finishNode(node, \"DeclareModule\");\n    }\n\n    flowParseDeclareExportDeclaration(\n      node: N.FlowDeclareExportDeclaration,\n      insideModule: ?boolean,\n    ): N.FlowDeclareExportDeclaration {\n      this.expect(tt._export);\n\n      if (this.eat(tt._default)) {\n        if (this.match(tt._function) || this.match(tt._class)) {\n          // declare export default class ...\n          // declare export default function ...\n          node.declaration = this.flowParseDeclare(this.startNode());\n        } else {\n          // declare export default [type];\n          node.declaration = this.flowParseType();\n          this.semicolon();\n        }\n        node.default = true;\n\n        return this.finishNode(node, \"DeclareExportDeclaration\");\n      } else {\n        if (\n          this.match(tt._const) ||\n          this.isLet() ||\n          ((this.isContextual(\"type\") || this.isContextual(\"interface\")) &&\n            !insideModule)\n        ) {\n          const label = this.state.value;\n          const suggestion = exportSuggestions[label];\n          throw this.raise(\n            this.state.start,\n            FlowErrors.UnsupportedDeclareExportKind,\n            label,\n            suggestion,\n          );\n        }\n\n        if (\n          this.match(tt._var) || // declare export var ...\n          this.match(tt._function) || // declare export function ...\n          this.match(tt._class) || // declare export class ...\n          this.isContextual(\"opaque\") // declare export opaque ..\n        ) {\n          node.declaration = this.flowParseDeclare(this.startNode());\n          node.default = false;\n\n          return this.finishNode(node, \"DeclareExportDeclaration\");\n        } else if (\n          this.match(tt.star) || // declare export * from ''\n          this.match(tt.braceL) || // declare export {} ...\n          this.isContextual(\"interface\") || // declare export interface ...\n          this.isContextual(\"type\") || // declare export type ...\n          this.isContextual(\"opaque\") // declare export opaque type ...\n        ) {\n          node = this.parseExport(node);\n          if (node.type === \"ExportNamedDeclaration\") {\n            // flow does not support the ExportNamedDeclaration\n            // $FlowIgnore\n            node.type = \"ExportDeclaration\";\n            // $FlowFixMe\n            node.default = false;\n            delete node.exportKind;\n          }\n\n          // $FlowIgnore\n          node.type = \"Declare\" + node.type;\n\n          return node;\n        }\n      }\n\n      throw this.unexpected();\n    }\n\n    flowParseDeclareModuleExports(\n      node: N.FlowDeclareModuleExports,\n    ): N.FlowDeclareModuleExports {\n      this.next();\n      this.expectContextual(\"exports\");\n      node.typeAnnotation = this.flowParseTypeAnnotation();\n      this.semicolon();\n\n      return this.finishNode(node, \"DeclareModuleExports\");\n    }\n\n    flowParseDeclareTypeAlias(\n      node: N.FlowDeclareTypeAlias,\n    ): N.FlowDeclareTypeAlias {\n      this.next();\n      this.flowParseTypeAlias(node);\n      // Don't do finishNode as we don't want to process comments twice\n      node.type = \"DeclareTypeAlias\";\n      return node;\n    }\n\n    flowParseDeclareOpaqueType(\n      node: N.FlowDeclareOpaqueType,\n    ): N.FlowDeclareOpaqueType {\n      this.next();\n      this.flowParseOpaqueType(node, true);\n      // Don't do finishNode as we don't want to process comments twice\n      node.type = \"DeclareOpaqueType\";\n      return node;\n    }\n\n    flowParseDeclareInterface(\n      node: N.FlowDeclareInterface,\n    ): N.FlowDeclareInterface {\n      this.next();\n      this.flowParseInterfaceish(node);\n      return this.finishNode(node, \"DeclareInterface\");\n    }\n\n    // Interfaces\n\n    flowParseInterfaceish(\n      node: N.FlowDeclare,\n      isClass?: boolean = false,\n    ): void {\n      node.id = this.flowParseRestrictedIdentifier(\n        /* liberal */ !isClass,\n        /* declaration */ true,\n      );\n\n      this.scope.declareName(\n        node.id.name,\n        isClass ? BIND_FUNCTION : BIND_LEXICAL,\n        node.id.start,\n      );\n\n      if (this.isRelational(\"<\")) {\n        node.typeParameters = this.flowParseTypeParameterDeclaration();\n      } else {\n        node.typeParameters = null;\n      }\n\n      node.extends = [];\n      node.implements = [];\n      node.mixins = [];\n\n      if (this.eat(tt._extends)) {\n        do {\n          node.extends.push(this.flowParseInterfaceExtends());\n        } while (!isClass && this.eat(tt.comma));\n      }\n\n      if (this.isContextual(\"mixins\")) {\n        this.next();\n        do {\n          node.mixins.push(this.flowParseInterfaceExtends());\n        } while (this.eat(tt.comma));\n      }\n\n      if (this.isContextual(\"implements\")) {\n        this.next();\n        do {\n          node.implements.push(this.flowParseInterfaceExtends());\n        } while (this.eat(tt.comma));\n      }\n\n      node.body = this.flowParseObjectType({\n        allowStatic: isClass,\n        allowExact: false,\n        allowSpread: false,\n        allowProto: isClass,\n        allowInexact: false,\n      });\n    }\n\n    flowParseInterfaceExtends(): N.FlowInterfaceExtends {\n      const node = this.startNode();\n\n      node.id = this.flowParseQualifiedTypeIdentifier();\n      if (this.isRelational(\"<\")) {\n        node.typeParameters = this.flowParseTypeParameterInstantiation();\n      } else {\n        node.typeParameters = null;\n      }\n\n      return this.finishNode(node, \"InterfaceExtends\");\n    }\n\n    flowParseInterface(node: N.FlowInterface): N.FlowInterface {\n      this.flowParseInterfaceish(node);\n      return this.finishNode(node, \"InterfaceDeclaration\");\n    }\n\n    checkNotUnderscore(word: string) {\n      if (word === \"_\") {\n        this.raise(this.state.start, FlowErrors.UnexpectedReservedUnderscore);\n      }\n    }\n\n    checkReservedType(word: string, startLoc: number, declaration?: boolean) {\n      if (!reservedTypes.has(word)) return;\n\n      this.raise(\n        startLoc,\n        declaration\n          ? FlowErrors.AssignReservedType\n          : FlowErrors.UnexpectedReservedType,\n        word,\n      );\n    }\n\n    flowParseRestrictedIdentifier(\n      liberal?: boolean,\n      declaration?: boolean,\n    ): N.Identifier {\n      this.checkReservedType(this.state.value, this.state.start, declaration);\n      return this.parseIdentifier(liberal);\n    }\n\n    // Type aliases\n\n    flowParseTypeAlias(node: N.FlowTypeAlias): N.FlowTypeAlias {\n      node.id = this.flowParseRestrictedIdentifier(\n        /* liberal */ false,\n        /* declaration */ true,\n      );\n      this.scope.declareName(node.id.name, BIND_LEXICAL, node.id.start);\n\n      if (this.isRelational(\"<\")) {\n        node.typeParameters = this.flowParseTypeParameterDeclaration();\n      } else {\n        node.typeParameters = null;\n      }\n\n      node.right = this.flowParseTypeInitialiser(tt.eq);\n      this.semicolon();\n\n      return this.finishNode(node, \"TypeAlias\");\n    }\n\n    flowParseOpaqueType(\n      node: N.FlowOpaqueType,\n      declare: boolean,\n    ): N.FlowOpaqueType {\n      this.expectContextual(\"type\");\n      node.id = this.flowParseRestrictedIdentifier(\n        /* liberal */ true,\n        /* declaration */ true,\n      );\n      this.scope.declareName(node.id.name, BIND_LEXICAL, node.id.start);\n\n      if (this.isRelational(\"<\")) {\n        node.typeParameters = this.flowParseTypeParameterDeclaration();\n      } else {\n        node.typeParameters = null;\n      }\n\n      // Parse the supertype\n      node.supertype = null;\n      if (this.match(tt.colon)) {\n        node.supertype = this.flowParseTypeInitialiser(tt.colon);\n      }\n\n      node.impltype = null;\n      if (!declare) {\n        node.impltype = this.flowParseTypeInitialiser(tt.eq);\n      }\n      this.semicolon();\n\n      return this.finishNode(node, \"OpaqueType\");\n    }\n\n    // Type annotations\n\n    flowParseTypeParameter(requireDefault?: boolean = false): N.TypeParameter {\n      const nodeStart = this.state.start;\n\n      const node = this.startNode();\n\n      const variance = this.flowParseVariance();\n\n      const ident = this.flowParseTypeAnnotatableIdentifier();\n      node.name = ident.name;\n      node.variance = variance;\n      node.bound = ident.typeAnnotation;\n\n      if (this.match(tt.eq)) {\n        this.eat(tt.eq);\n        node.default = this.flowParseType();\n      } else {\n        if (requireDefault) {\n          this.raise(nodeStart, FlowErrors.MissingTypeParamDefault);\n        }\n      }\n\n      return this.finishNode(node, \"TypeParameter\");\n    }\n\n    flowParseTypeParameterDeclaration(): N.TypeParameterDeclaration {\n      const oldInType = this.state.inType;\n      const node = this.startNode();\n      node.params = [];\n\n      this.state.inType = true;\n\n      // istanbul ignore else: this condition is already checked at all call sites\n      if (this.isRelational(\"<\") || this.match(tt.jsxTagStart)) {\n        this.next();\n      } else {\n        this.unexpected();\n      }\n\n      let defaultRequired = false;\n\n      do {\n        const typeParameter = this.flowParseTypeParameter(defaultRequired);\n\n        node.params.push(typeParameter);\n\n        if (typeParameter.default) {\n          defaultRequired = true;\n        }\n\n        if (!this.isRelational(\">\")) {\n          this.expect(tt.comma);\n        }\n      } while (!this.isRelational(\">\"));\n      this.expectRelational(\">\");\n\n      this.state.inType = oldInType;\n\n      return this.finishNode(node, \"TypeParameterDeclaration\");\n    }\n\n    flowParseTypeParameterInstantiation(): N.TypeParameterInstantiation {\n      const node = this.startNode();\n      const oldInType = this.state.inType;\n      node.params = [];\n\n      this.state.inType = true;\n\n      this.expectRelational(\"<\");\n      const oldNoAnonFunctionType = this.state.noAnonFunctionType;\n      this.state.noAnonFunctionType = false;\n      while (!this.isRelational(\">\")) {\n        node.params.push(this.flowParseType());\n        if (!this.isRelational(\">\")) {\n          this.expect(tt.comma);\n        }\n      }\n      this.state.noAnonFunctionType = oldNoAnonFunctionType;\n      this.expectRelational(\">\");\n\n      this.state.inType = oldInType;\n\n      return this.finishNode(node, \"TypeParameterInstantiation\");\n    }\n\n    flowParseTypeParameterInstantiationCallOrNew(): N.TypeParameterInstantiation {\n      const node = this.startNode();\n      const oldInType = this.state.inType;\n      node.params = [];\n\n      this.state.inType = true;\n\n      this.expectRelational(\"<\");\n      while (!this.isRelational(\">\")) {\n        node.params.push(this.flowParseTypeOrImplicitInstantiation());\n        if (!this.isRelational(\">\")) {\n          this.expect(tt.comma);\n        }\n      }\n      this.expectRelational(\">\");\n\n      this.state.inType = oldInType;\n\n      return this.finishNode(node, \"TypeParameterInstantiation\");\n    }\n\n    flowParseInterfaceType(): N.FlowInterfaceType {\n      const node = this.startNode();\n      this.expectContextual(\"interface\");\n\n      node.extends = [];\n      if (this.eat(tt._extends)) {\n        do {\n          node.extends.push(this.flowParseInterfaceExtends());\n        } while (this.eat(tt.comma));\n      }\n\n      node.body = this.flowParseObjectType({\n        allowStatic: false,\n        allowExact: false,\n        allowSpread: false,\n        allowProto: false,\n        allowInexact: false,\n      });\n\n      return this.finishNode(node, \"InterfaceTypeAnnotation\");\n    }\n\n    flowParseObjectPropertyKey(): N.Expression {\n      return this.match(tt.num) || this.match(tt.string)\n        ? this.parseExprAtom()\n        : this.parseIdentifier(true);\n    }\n\n    flowParseObjectTypeIndexer(\n      node: N.FlowObjectTypeIndexer,\n      isStatic: boolean,\n      variance: ?N.FlowVariance,\n    ): N.FlowObjectTypeIndexer {\n      node.static = isStatic;\n\n      // Note: bracketL has already been consumed\n      if (this.lookahead().type === tt.colon) {\n        node.id = this.flowParseObjectPropertyKey();\n        node.key = this.flowParseTypeInitialiser();\n      } else {\n        node.id = null;\n        node.key = this.flowParseType();\n      }\n      this.expect(tt.bracketR);\n      node.value = this.flowParseTypeInitialiser();\n      node.variance = variance;\n\n      return this.finishNode(node, \"ObjectTypeIndexer\");\n    }\n\n    flowParseObjectTypeInternalSlot(\n      node: N.FlowObjectTypeInternalSlot,\n      isStatic: boolean,\n    ): N.FlowObjectTypeInternalSlot {\n      node.static = isStatic;\n      // Note: both bracketL have already been consumed\n      node.id = this.flowParseObjectPropertyKey();\n      this.expect(tt.bracketR);\n      this.expect(tt.bracketR);\n      if (this.isRelational(\"<\") || this.match(tt.parenL)) {\n        node.method = true;\n        node.optional = false;\n        node.value = this.flowParseObjectTypeMethodish(\n          this.startNodeAt(node.start, node.loc.start),\n        );\n      } else {\n        node.method = false;\n        if (this.eat(tt.question)) {\n          node.optional = true;\n        }\n        node.value = this.flowParseTypeInitialiser();\n      }\n      return this.finishNode(node, \"ObjectTypeInternalSlot\");\n    }\n\n    flowParseObjectTypeMethodish(\n      node: N.FlowFunctionTypeAnnotation,\n    ): N.FlowFunctionTypeAnnotation {\n      node.params = [];\n      node.rest = null;\n      node.typeParameters = null;\n\n      if (this.isRelational(\"<\")) {\n        node.typeParameters = this.flowParseTypeParameterDeclaration();\n      }\n\n      this.expect(tt.parenL);\n      while (!this.match(tt.parenR) && !this.match(tt.ellipsis)) {\n        node.params.push(this.flowParseFunctionTypeParam());\n        if (!this.match(tt.parenR)) {\n          this.expect(tt.comma);\n        }\n      }\n\n      if (this.eat(tt.ellipsis)) {\n        node.rest = this.flowParseFunctionTypeParam();\n      }\n      this.expect(tt.parenR);\n      node.returnType = this.flowParseTypeInitialiser();\n\n      return this.finishNode(node, \"FunctionTypeAnnotation\");\n    }\n\n    flowParseObjectTypeCallProperty(\n      node: N.FlowObjectTypeCallProperty,\n      isStatic: boolean,\n    ): N.FlowObjectTypeCallProperty {\n      const valueNode = this.startNode();\n      node.static = isStatic;\n      node.value = this.flowParseObjectTypeMethodish(valueNode);\n      return this.finishNode(node, \"ObjectTypeCallProperty\");\n    }\n\n    flowParseObjectType({\n      allowStatic,\n      allowExact,\n      allowSpread,\n      allowProto,\n      allowInexact,\n    }: {\n      allowStatic: boolean,\n      allowExact: boolean,\n      allowSpread: boolean,\n      allowProto: boolean,\n      allowInexact: boolean,\n    }): N.FlowObjectTypeAnnotation {\n      const oldInType = this.state.inType;\n      this.state.inType = true;\n\n      const nodeStart = this.startNode();\n\n      nodeStart.callProperties = [];\n      nodeStart.properties = [];\n      nodeStart.indexers = [];\n      nodeStart.internalSlots = [];\n\n      let endDelim;\n      let exact;\n      let inexact = false;\n      if (allowExact && this.match(tt.braceBarL)) {\n        this.expect(tt.braceBarL);\n        endDelim = tt.braceBarR;\n        exact = true;\n      } else {\n        this.expect(tt.braceL);\n        endDelim = tt.braceR;\n        exact = false;\n      }\n\n      nodeStart.exact = exact;\n\n      while (!this.match(endDelim)) {\n        let isStatic = false;\n        let protoStart: ?number = null;\n        let inexactStart: ?number = null;\n        const node = this.startNode();\n\n        if (allowProto && this.isContextual(\"proto\")) {\n          const lookahead = this.lookahead();\n\n          if (lookahead.type !== tt.colon && lookahead.type !== tt.question) {\n            this.next();\n            protoStart = this.state.start;\n            allowStatic = false;\n          }\n        }\n\n        if (allowStatic && this.isContextual(\"static\")) {\n          const lookahead = this.lookahead();\n\n          // static is a valid identifier name\n          if (lookahead.type !== tt.colon && lookahead.type !== tt.question) {\n            this.next();\n            isStatic = true;\n          }\n        }\n\n        const variance = this.flowParseVariance();\n\n        if (this.eat(tt.bracketL)) {\n          if (protoStart != null) {\n            this.unexpected(protoStart);\n          }\n          if (this.eat(tt.bracketL)) {\n            if (variance) {\n              this.unexpected(variance.start);\n            }\n            nodeStart.internalSlots.push(\n              this.flowParseObjectTypeInternalSlot(node, isStatic),\n            );\n          } else {\n            nodeStart.indexers.push(\n              this.flowParseObjectTypeIndexer(node, isStatic, variance),\n            );\n          }\n        } else if (this.match(tt.parenL) || this.isRelational(\"<\")) {\n          if (protoStart != null) {\n            this.unexpected(protoStart);\n          }\n          if (variance) {\n            this.unexpected(variance.start);\n          }\n          nodeStart.callProperties.push(\n            this.flowParseObjectTypeCallProperty(node, isStatic),\n          );\n        } else {\n          let kind = \"init\";\n\n          if (this.isContextual(\"get\") || this.isContextual(\"set\")) {\n            const lookahead = this.lookahead();\n            if (\n              lookahead.type === tt.name ||\n              lookahead.type === tt.string ||\n              lookahead.type === tt.num\n            ) {\n              kind = this.state.value;\n              this.next();\n            }\n          }\n\n          const propOrInexact = this.flowParseObjectTypeProperty(\n            node,\n            isStatic,\n            protoStart,\n            variance,\n            kind,\n            allowSpread,\n            allowInexact ?? !exact,\n          );\n\n          if (propOrInexact === null) {\n            inexact = true;\n            inexactStart = this.state.lastTokStart;\n          } else {\n            nodeStart.properties.push(propOrInexact);\n          }\n        }\n\n        this.flowObjectTypeSemicolon();\n\n        if (\n          inexactStart &&\n          !this.match(tt.braceR) &&\n          !this.match(tt.braceBarR)\n        ) {\n          this.raise(\n            inexactStart,\n            FlowErrors.UnexpectedExplicitInexactInObject,\n          );\n        }\n      }\n\n      this.expect(endDelim);\n\n      /* The inexact flag should only be added on ObjectTypeAnnotations that\n       * are not the body of an interface, declare interface, or declare class.\n       * Since spreads are only allowed in objec types, checking that is\n       * sufficient here.\n       */\n      if (allowSpread) {\n        nodeStart.inexact = inexact;\n      }\n\n      const out = this.finishNode(nodeStart, \"ObjectTypeAnnotation\");\n\n      this.state.inType = oldInType;\n\n      return out;\n    }\n\n    flowParseObjectTypeProperty(\n      node: N.FlowObjectTypeProperty | N.FlowObjectTypeSpreadProperty,\n      isStatic: boolean,\n      protoStart: ?number,\n      variance: ?N.FlowVariance,\n      kind: string,\n      allowSpread: boolean,\n      allowInexact: boolean,\n    ): (N.FlowObjectTypeProperty | N.FlowObjectTypeSpreadProperty) | null {\n      if (this.eat(tt.ellipsis)) {\n        const isInexactToken =\n          this.match(tt.comma) ||\n          this.match(tt.semi) ||\n          this.match(tt.braceR) ||\n          this.match(tt.braceBarR);\n\n        if (isInexactToken) {\n          if (!allowSpread) {\n            this.raise(\n              this.state.lastTokStart,\n              FlowErrors.InexactInsideNonObject,\n            );\n          } else if (!allowInexact) {\n            this.raise(this.state.lastTokStart, FlowErrors.InexactInsideExact);\n          }\n          if (variance) {\n            this.raise(variance.start, FlowErrors.InexactVariance);\n          }\n\n          return null;\n        }\n\n        if (!allowSpread) {\n          this.raise(this.state.lastTokStart, FlowErrors.UnexpectedSpreadType);\n        }\n        if (protoStart != null) {\n          this.unexpected(protoStart);\n        }\n        if (variance) {\n          this.raise(variance.start, FlowErrors.SpreadVariance);\n        }\n\n        node.argument = this.flowParseType();\n        return this.finishNode(node, \"ObjectTypeSpreadProperty\");\n      } else {\n        node.key = this.flowParseObjectPropertyKey();\n        node.static = isStatic;\n        node.proto = protoStart != null;\n        node.kind = kind;\n\n        let optional = false;\n        if (this.isRelational(\"<\") || this.match(tt.parenL)) {\n          // This is a method property\n          node.method = true;\n\n          if (protoStart != null) {\n            this.unexpected(protoStart);\n          }\n          if (variance) {\n            this.unexpected(variance.start);\n          }\n\n          node.value = this.flowParseObjectTypeMethodish(\n            this.startNodeAt(node.start, node.loc.start),\n          );\n          if (kind === \"get\" || kind === \"set\") {\n            this.flowCheckGetterSetterParams(node);\n          }\n        } else {\n          if (kind !== \"init\") this.unexpected();\n\n          node.method = false;\n\n          if (this.eat(tt.question)) {\n            optional = true;\n          }\n          node.value = this.flowParseTypeInitialiser();\n          node.variance = variance;\n        }\n\n        node.optional = optional;\n\n        return this.finishNode(node, \"ObjectTypeProperty\");\n      }\n    }\n\n    // This is similar to checkGetterSetterParams, but as\n    // @babel/parser uses non estree properties we cannot reuse it here\n    flowCheckGetterSetterParams(\n      property: N.FlowObjectTypeProperty | N.FlowObjectTypeSpreadProperty,\n    ): void {\n      const paramCount = property.kind === \"get\" ? 0 : 1;\n      const start = property.start;\n      const length =\n        property.value.params.length + (property.value.rest ? 1 : 0);\n      if (length !== paramCount) {\n        if (property.kind === \"get\") {\n          this.raise(start, Errors.BadGetterArity);\n        } else {\n          this.raise(start, Errors.BadSetterArity);\n        }\n      }\n\n      if (property.kind === \"set\" && property.value.rest) {\n        this.raise(start, Errors.BadSetterRestParameter);\n      }\n    }\n\n    flowObjectTypeSemicolon(): void {\n      if (\n        !this.eat(tt.semi) &&\n        !this.eat(tt.comma) &&\n        !this.match(tt.braceR) &&\n        !this.match(tt.braceBarR)\n      ) {\n        this.unexpected();\n      }\n    }\n\n    flowParseQualifiedTypeIdentifier(\n      startPos?: number,\n      startLoc?: Position,\n      id?: N.Identifier,\n    ): N.FlowQualifiedTypeIdentifier {\n      startPos = startPos || this.state.start;\n      startLoc = startLoc || this.state.startLoc;\n      let node = id || this.flowParseRestrictedIdentifier(true);\n\n      while (this.eat(tt.dot)) {\n        const node2 = this.startNodeAt(startPos, startLoc);\n        node2.qualification = node;\n        node2.id = this.flowParseRestrictedIdentifier(true);\n        node = this.finishNode(node2, \"QualifiedTypeIdentifier\");\n      }\n\n      return node;\n    }\n\n    flowParseGenericType(\n      startPos: number,\n      startLoc: Position,\n      id: N.Identifier,\n    ): N.FlowGenericTypeAnnotation {\n      const node = this.startNodeAt(startPos, startLoc);\n\n      node.typeParameters = null;\n      node.id = this.flowParseQualifiedTypeIdentifier(startPos, startLoc, id);\n\n      if (this.isRelational(\"<\")) {\n        node.typeParameters = this.flowParseTypeParameterInstantiation();\n      }\n\n      return this.finishNode(node, \"GenericTypeAnnotation\");\n    }\n\n    flowParseTypeofType(): N.FlowTypeofTypeAnnotation {\n      const node = this.startNode();\n      this.expect(tt._typeof);\n      node.argument = this.flowParsePrimaryType();\n      return this.finishNode(node, \"TypeofTypeAnnotation\");\n    }\n\n    flowParseTupleType(): N.FlowTupleTypeAnnotation {\n      const node = this.startNode();\n      node.types = [];\n      this.expect(tt.bracketL);\n      // We allow trailing commas\n      while (this.state.pos < this.length && !this.match(tt.bracketR)) {\n        node.types.push(this.flowParseType());\n        if (this.match(tt.bracketR)) break;\n        this.expect(tt.comma);\n      }\n      this.expect(tt.bracketR);\n      return this.finishNode(node, \"TupleTypeAnnotation\");\n    }\n\n    flowParseFunctionTypeParam(): N.FlowFunctionTypeParam {\n      let name = null;\n      let optional = false;\n      let typeAnnotation = null;\n      const node = this.startNode();\n      const lh = this.lookahead();\n      if (lh.type === tt.colon || lh.type === tt.question) {\n        name = this.parseIdentifier();\n        if (this.eat(tt.question)) {\n          optional = true;\n        }\n        typeAnnotation = this.flowParseTypeInitialiser();\n      } else {\n        typeAnnotation = this.flowParseType();\n      }\n      node.name = name;\n      node.optional = optional;\n      node.typeAnnotation = typeAnnotation;\n      return this.finishNode(node, \"FunctionTypeParam\");\n    }\n\n    reinterpretTypeAsFunctionTypeParam(\n      type: N.FlowType,\n    ): N.FlowFunctionTypeParam {\n      const node = this.startNodeAt(type.start, type.loc.start);\n      node.name = null;\n      node.optional = false;\n      node.typeAnnotation = type;\n      return this.finishNode(node, \"FunctionTypeParam\");\n    }\n\n    flowParseFunctionTypeParams(\n      params: N.FlowFunctionTypeParam[] = [],\n    ): { params: N.FlowFunctionTypeParam[], rest: ?N.FlowFunctionTypeParam } {\n      let rest: ?N.FlowFunctionTypeParam = null;\n      while (!this.match(tt.parenR) && !this.match(tt.ellipsis)) {\n        params.push(this.flowParseFunctionTypeParam());\n        if (!this.match(tt.parenR)) {\n          this.expect(tt.comma);\n        }\n      }\n      if (this.eat(tt.ellipsis)) {\n        rest = this.flowParseFunctionTypeParam();\n      }\n      return { params, rest };\n    }\n\n    flowIdentToTypeAnnotation(\n      startPos: number,\n      startLoc: Position,\n      node: N.FlowTypeAnnotation,\n      id: N.Identifier,\n    ): N.FlowTypeAnnotation {\n      switch (id.name) {\n        case \"any\":\n          return this.finishNode(node, \"AnyTypeAnnotation\");\n\n        case \"bool\":\n        case \"boolean\":\n          return this.finishNode(node, \"BooleanTypeAnnotation\");\n\n        case \"mixed\":\n          return this.finishNode(node, \"MixedTypeAnnotation\");\n\n        case \"empty\":\n          return this.finishNode(node, \"EmptyTypeAnnotation\");\n\n        case \"number\":\n          return this.finishNode(node, \"NumberTypeAnnotation\");\n\n        case \"string\":\n          return this.finishNode(node, \"StringTypeAnnotation\");\n\n        case \"symbol\":\n          return this.finishNode(node, \"SymbolTypeAnnotation\");\n\n        default:\n          this.checkNotUnderscore(id.name);\n          return this.flowParseGenericType(startPos, startLoc, id);\n      }\n    }\n\n    // The parsing of types roughly parallels the parsing of expressions, and\n    // primary types are kind of like primary expressions...they're the\n    // primitives with which other types are constructed.\n    flowParsePrimaryType(): N.FlowTypeAnnotation {\n      const startPos = this.state.start;\n      const startLoc = this.state.startLoc;\n      const node = this.startNode();\n      let tmp;\n      let type;\n      let isGroupedType = false;\n      const oldNoAnonFunctionType = this.state.noAnonFunctionType;\n\n      switch (this.state.type) {\n        case tt.name:\n          if (this.isContextual(\"interface\")) {\n            return this.flowParseInterfaceType();\n          }\n\n          return this.flowIdentToTypeAnnotation(\n            startPos,\n            startLoc,\n            node,\n            this.parseIdentifier(),\n          );\n\n        case tt.braceL:\n          return this.flowParseObjectType({\n            allowStatic: false,\n            allowExact: false,\n            allowSpread: true,\n            allowProto: false,\n            allowInexact: true,\n          });\n\n        case tt.braceBarL:\n          return this.flowParseObjectType({\n            allowStatic: false,\n            allowExact: true,\n            allowSpread: true,\n            allowProto: false,\n            allowInexact: false,\n          });\n\n        case tt.bracketL:\n          this.state.noAnonFunctionType = false;\n          type = this.flowParseTupleType();\n          this.state.noAnonFunctionType = oldNoAnonFunctionType;\n          return type;\n\n        case tt.relational:\n          if (this.state.value === \"<\") {\n            node.typeParameters = this.flowParseTypeParameterDeclaration();\n            this.expect(tt.parenL);\n            tmp = this.flowParseFunctionTypeParams();\n            node.params = tmp.params;\n            node.rest = tmp.rest;\n            this.expect(tt.parenR);\n\n            this.expect(tt.arrow);\n\n            node.returnType = this.flowParseType();\n\n            return this.finishNode(node, \"FunctionTypeAnnotation\");\n          }\n          break;\n\n        case tt.parenL:\n          this.next();\n\n          // Check to see if this is actually a grouped type\n          if (!this.match(tt.parenR) && !this.match(tt.ellipsis)) {\n            if (this.match(tt.name)) {\n              const token = this.lookahead().type;\n              isGroupedType = token !== tt.question && token !== tt.colon;\n            } else {\n              isGroupedType = true;\n            }\n          }\n\n          if (isGroupedType) {\n            this.state.noAnonFunctionType = false;\n            type = this.flowParseType();\n            this.state.noAnonFunctionType = oldNoAnonFunctionType;\n\n            // A `,` or a `) =>` means this is an anonymous function type\n            if (\n              this.state.noAnonFunctionType ||\n              !(\n                this.match(tt.comma) ||\n                (this.match(tt.parenR) && this.lookahead().type === tt.arrow)\n              )\n            ) {\n              this.expect(tt.parenR);\n              return type;\n            } else {\n              // Eat a comma if there is one\n              this.eat(tt.comma);\n            }\n          }\n\n          if (type) {\n            tmp = this.flowParseFunctionTypeParams([\n              this.reinterpretTypeAsFunctionTypeParam(type),\n            ]);\n          } else {\n            tmp = this.flowParseFunctionTypeParams();\n          }\n\n          node.params = tmp.params;\n          node.rest = tmp.rest;\n\n          this.expect(tt.parenR);\n\n          this.expect(tt.arrow);\n\n          node.returnType = this.flowParseType();\n\n          node.typeParameters = null;\n\n          return this.finishNode(node, \"FunctionTypeAnnotation\");\n\n        case tt.string:\n          return this.parseLiteral(\n            this.state.value,\n            \"StringLiteralTypeAnnotation\",\n          );\n\n        case tt._true:\n        case tt._false:\n          node.value = this.match(tt._true);\n          this.next();\n          return this.finishNode(node, \"BooleanLiteralTypeAnnotation\");\n\n        case tt.plusMin:\n          if (this.state.value === \"-\") {\n            this.next();\n            if (this.match(tt.num)) {\n              return this.parseLiteral(\n                -this.state.value,\n                \"NumberLiteralTypeAnnotation\",\n                node.start,\n                node.loc.start,\n              );\n            }\n\n            if (this.match(tt.bigint)) {\n              return this.parseLiteral(\n                -this.state.value,\n                \"BigIntLiteralTypeAnnotation\",\n                node.start,\n                node.loc.start,\n              );\n            }\n\n            throw this.raise(\n              this.state.start,\n              FlowErrors.UnexpectedSubtractionOperand,\n            );\n          }\n\n          throw this.unexpected();\n        case tt.num:\n          return this.parseLiteral(\n            this.state.value,\n            \"NumberLiteralTypeAnnotation\",\n          );\n\n        case tt.bigint:\n          return this.parseLiteral(\n            this.state.value,\n            \"BigIntLiteralTypeAnnotation\",\n          );\n\n        case tt._void:\n          this.next();\n          return this.finishNode(node, \"VoidTypeAnnotation\");\n\n        case tt._null:\n          this.next();\n          return this.finishNode(node, \"NullLiteralTypeAnnotation\");\n\n        case tt._this:\n          this.next();\n          return this.finishNode(node, \"ThisTypeAnnotation\");\n\n        case tt.star:\n          this.next();\n          return this.finishNode(node, \"ExistsTypeAnnotation\");\n\n        default:\n          if (this.state.type.keyword === \"typeof\") {\n            return this.flowParseTypeofType();\n          } else if (this.state.type.keyword) {\n            const label = this.state.type.label;\n            this.next();\n            return super.createIdentifier(node, label);\n          }\n      }\n\n      throw this.unexpected();\n    }\n\n    flowParsePostfixType(): N.FlowTypeAnnotation {\n      const startPos = this.state.start,\n        startLoc = this.state.startLoc;\n      let type = this.flowParsePrimaryType();\n      while (this.match(tt.bracketL) && !this.canInsertSemicolon()) {\n        const node = this.startNodeAt(startPos, startLoc);\n        node.elementType = type;\n        this.expect(tt.bracketL);\n        this.expect(tt.bracketR);\n        type = this.finishNode(node, \"ArrayTypeAnnotation\");\n      }\n      return type;\n    }\n\n    flowParsePrefixType(): N.FlowTypeAnnotation {\n      const node = this.startNode();\n      if (this.eat(tt.question)) {\n        node.typeAnnotation = this.flowParsePrefixType();\n        return this.finishNode(node, \"NullableTypeAnnotation\");\n      } else {\n        return this.flowParsePostfixType();\n      }\n    }\n\n    flowParseAnonFunctionWithoutParens(): N.FlowTypeAnnotation {\n      const param = this.flowParsePrefixType();\n      if (!this.state.noAnonFunctionType && this.eat(tt.arrow)) {\n        // TODO: This should be a type error. Passing in a SourceLocation, and it expects a Position.\n        const node = this.startNodeAt(param.start, param.loc.start);\n        node.params = [this.reinterpretTypeAsFunctionTypeParam(param)];\n        node.rest = null;\n        node.returnType = this.flowParseType();\n        node.typeParameters = null;\n        return this.finishNode(node, \"FunctionTypeAnnotation\");\n      }\n      return param;\n    }\n\n    flowParseIntersectionType(): N.FlowTypeAnnotation {\n      const node = this.startNode();\n      this.eat(tt.bitwiseAND);\n      const type = this.flowParseAnonFunctionWithoutParens();\n      node.types = [type];\n      while (this.eat(tt.bitwiseAND)) {\n        node.types.push(this.flowParseAnonFunctionWithoutParens());\n      }\n      return node.types.length === 1\n        ? type\n        : this.finishNode(node, \"IntersectionTypeAnnotation\");\n    }\n\n    flowParseUnionType(): N.FlowTypeAnnotation {\n      const node = this.startNode();\n      this.eat(tt.bitwiseOR);\n      const type = this.flowParseIntersectionType();\n      node.types = [type];\n      while (this.eat(tt.bitwiseOR)) {\n        node.types.push(this.flowParseIntersectionType());\n      }\n      return node.types.length === 1\n        ? type\n        : this.finishNode(node, \"UnionTypeAnnotation\");\n    }\n\n    flowParseType(): N.FlowTypeAnnotation {\n      const oldInType = this.state.inType;\n      this.state.inType = true;\n      const type = this.flowParseUnionType();\n      this.state.inType = oldInType;\n      // Ensure that a brace after a function generic type annotation is a\n      // statement, except in arrow functions (noAnonFunctionType)\n      this.state.exprAllowed =\n        this.state.exprAllowed || this.state.noAnonFunctionType;\n      return type;\n    }\n\n    flowParseTypeOrImplicitInstantiation(): N.FlowTypeAnnotation {\n      if (this.state.type === tt.name && this.state.value === \"_\") {\n        const startPos = this.state.start;\n        const startLoc = this.state.startLoc;\n        const node = this.parseIdentifier();\n        return this.flowParseGenericType(startPos, startLoc, node);\n      } else {\n        return this.flowParseType();\n      }\n    }\n\n    flowParseTypeAnnotation(): N.FlowTypeAnnotation {\n      const node = this.startNode();\n      node.typeAnnotation = this.flowParseTypeInitialiser();\n      return this.finishNode(node, \"TypeAnnotation\");\n    }\n\n    flowParseTypeAnnotatableIdentifier(\n      allowPrimitiveOverride?: boolean,\n    ): N.Identifier {\n      const ident = allowPrimitiveOverride\n        ? this.parseIdentifier()\n        : this.flowParseRestrictedIdentifier();\n      if (this.match(tt.colon)) {\n        ident.typeAnnotation = this.flowParseTypeAnnotation();\n        this.resetEndLocation(ident);\n      }\n      return ident;\n    }\n\n    typeCastToParameter(node: N.Node): N.Node {\n      node.expression.typeAnnotation = node.typeAnnotation;\n\n      this.resetEndLocation(\n        node.expression,\n        node.typeAnnotation.end,\n        node.typeAnnotation.loc.end,\n      );\n\n      return node.expression;\n    }\n\n    flowParseVariance(): ?N.FlowVariance {\n      let variance = null;\n      if (this.match(tt.plusMin)) {\n        variance = this.startNode();\n        if (this.state.value === \"+\") {\n          variance.kind = \"plus\";\n        } else {\n          variance.kind = \"minus\";\n        }\n        this.next();\n        this.finishNode(variance, \"Variance\");\n      }\n      return variance;\n    }\n\n    // ==================================\n    // Overrides\n    // ==================================\n\n    parseFunctionBody(\n      node: N.Function,\n      allowExpressionBody: ?boolean,\n      isMethod?: boolean = false,\n    ): void {\n      if (allowExpressionBody) {\n        return this.forwardNoArrowParamsConversionAt(node, () =>\n          super.parseFunctionBody(node, true, isMethod),\n        );\n      }\n\n      return super.parseFunctionBody(node, false, isMethod);\n    }\n\n    parseFunctionBodyAndFinish(\n      node: N.BodilessFunctionOrMethodBase,\n      type: string,\n      isMethod?: boolean = false,\n    ): void {\n      if (this.match(tt.colon)) {\n        const typeNode = this.startNode();\n\n        [\n          // $FlowFixMe (destructuring not supported yet)\n          typeNode.typeAnnotation,\n          // $FlowFixMe (destructuring not supported yet)\n          node.predicate,\n        ] = this.flowParseTypeAndPredicateInitialiser();\n\n        node.returnType = typeNode.typeAnnotation\n          ? this.finishNode(typeNode, \"TypeAnnotation\")\n          : null;\n      }\n\n      super.parseFunctionBodyAndFinish(node, type, isMethod);\n    }\n\n    // interfaces and enums\n    parseStatement(context: ?string, topLevel?: boolean): N.Statement {\n      // strict mode handling of `interface` since it's a reserved word\n      if (\n        this.state.strict &&\n        this.match(tt.name) &&\n        this.state.value === \"interface\"\n      ) {\n        const node = this.startNode();\n        this.next();\n        return this.flowParseInterface(node);\n      } else if (this.shouldParseEnums() && this.isContextual(\"enum\")) {\n        const node = this.startNode();\n        this.next();\n        return this.flowParseEnumDeclaration(node);\n      } else {\n        const stmt = super.parseStatement(context, topLevel);\n        // We will parse a flow pragma in any comment before the first statement.\n        if (this.flowPragma === undefined && !this.isValidDirective(stmt)) {\n          this.flowPragma = null;\n        }\n        return stmt;\n      }\n    }\n\n    // declares, interfaces and type aliases\n    parseExpressionStatement(\n      node: N.ExpressionStatement,\n      expr: N.Expression,\n    ): N.ExpressionStatement {\n      if (expr.type === \"Identifier\") {\n        if (expr.name === \"declare\") {\n          if (\n            this.match(tt._class) ||\n            this.match(tt.name) ||\n            this.match(tt._function) ||\n            this.match(tt._var) ||\n            this.match(tt._export)\n          ) {\n            return this.flowParseDeclare(node);\n          }\n        } else if (this.match(tt.name)) {\n          if (expr.name === \"interface\") {\n            return this.flowParseInterface(node);\n          } else if (expr.name === \"type\") {\n            return this.flowParseTypeAlias(node);\n          } else if (expr.name === \"opaque\") {\n            return this.flowParseOpaqueType(node, false);\n          }\n        }\n      }\n\n      return super.parseExpressionStatement(node, expr);\n    }\n\n    // export type\n    shouldParseExportDeclaration(): boolean {\n      return (\n        this.isContextual(\"type\") ||\n        this.isContextual(\"interface\") ||\n        this.isContextual(\"opaque\") ||\n        (this.shouldParseEnums() && this.isContextual(\"enum\")) ||\n        super.shouldParseExportDeclaration()\n      );\n    }\n\n    isExportDefaultSpecifier(): boolean {\n      if (\n        this.match(tt.name) &&\n        (this.state.value === \"type\" ||\n          this.state.value === \"interface\" ||\n          this.state.value === \"opaque\" ||\n          (this.shouldParseEnums() && this.state.value === \"enum\"))\n      ) {\n        return false;\n      }\n\n      return super.isExportDefaultSpecifier();\n    }\n\n    parseExportDefaultExpression(): N.Expression | N.Declaration {\n      if (this.shouldParseEnums() && this.isContextual(\"enum\")) {\n        const node = this.startNode();\n        this.next();\n        return this.flowParseEnumDeclaration(node);\n      }\n      return super.parseExportDefaultExpression();\n    }\n\n    parseConditional(\n      expr: N.Expression,\n      noIn: ?boolean,\n      startPos: number,\n      startLoc: Position,\n      refNeedsArrowPos?: ?Pos,\n    ): N.Expression {\n      if (!this.match(tt.question)) return expr;\n\n      // only use the expensive \"tryParse\" method if there is a question mark\n      // and if we come from inside parens\n      if (refNeedsArrowPos) {\n        const result = this.tryParse(() =>\n          super.parseConditional(expr, noIn, startPos, startLoc),\n        );\n\n        if (!result.node) {\n          // $FlowIgnore\n          refNeedsArrowPos.start = result.error.pos || this.state.start;\n          return expr;\n        }\n\n        if (result.error) this.state = result.failState;\n        return result.node;\n      }\n\n      this.expect(tt.question);\n      const state = this.state.clone();\n      const originalNoArrowAt = this.state.noArrowAt;\n      const node = this.startNodeAt(startPos, startLoc);\n      let { consequent, failed } = this.tryParseConditionalConsequent();\n      let [valid, invalid] = this.getArrowLikeExpressions(consequent);\n\n      if (failed || invalid.length > 0) {\n        const noArrowAt = [...originalNoArrowAt];\n\n        if (invalid.length > 0) {\n          this.state = state;\n          this.state.noArrowAt = noArrowAt;\n\n          for (let i = 0; i < invalid.length; i++) {\n            noArrowAt.push(invalid[i].start);\n          }\n\n          ({ consequent, failed } = this.tryParseConditionalConsequent());\n          [valid, invalid] = this.getArrowLikeExpressions(consequent);\n        }\n\n        if (failed && valid.length > 1) {\n          // if there are two or more possible correct ways of parsing, throw an\n          // error.\n          // e.g.   Source: a ? (b): c => (d): e => f\n          //      Result 1: a ? b : (c => ((d): e => f))\n          //      Result 2: a ? ((b): c => d) : (e => f)\n          this.raise(state.start, FlowErrors.AmbiguousConditionalArrow);\n        }\n\n        if (failed && valid.length === 1) {\n          this.state = state;\n          this.state.noArrowAt = noArrowAt.concat(valid[0].start);\n          ({ consequent, failed } = this.tryParseConditionalConsequent());\n        }\n      }\n\n      this.getArrowLikeExpressions(consequent, true);\n\n      this.state.noArrowAt = originalNoArrowAt;\n      this.expect(tt.colon);\n\n      node.test = expr;\n      node.consequent = consequent;\n      node.alternate = this.forwardNoArrowParamsConversionAt(node, () =>\n        this.parseMaybeAssign(noIn, undefined, undefined, undefined),\n      );\n\n      return this.finishNode(node, \"ConditionalExpression\");\n    }\n\n    tryParseConditionalConsequent(): {\n      consequent: N.Expression,\n      failed: boolean,\n    } {\n      this.state.noArrowParamsConversionAt.push(this.state.start);\n\n      const consequent = this.parseMaybeAssign();\n      const failed = !this.match(tt.colon);\n\n      this.state.noArrowParamsConversionAt.pop();\n\n      return { consequent, failed };\n    }\n\n    // Given an expression, walks through out its arrow functions whose body is\n    // an expression and through out conditional expressions. It returns every\n    // function which has been parsed with a return type but could have been\n    // parenthesized expressions.\n    // These functions are separated into two arrays: one containing the ones\n    // whose parameters can be converted to assignable lists, one containing the\n    // others.\n    getArrowLikeExpressions(\n      node: N.Expression,\n      disallowInvalid?: boolean,\n    ): [N.ArrowFunctionExpression[], N.ArrowFunctionExpression[]] {\n      const stack = [node];\n      const arrows: N.ArrowFunctionExpression[] = [];\n\n      while (stack.length !== 0) {\n        const node = stack.pop();\n        if (node.type === \"ArrowFunctionExpression\") {\n          if (node.typeParameters || !node.returnType) {\n            // This is an arrow expression without ambiguity, so check its parameters\n            this.finishArrowValidation(node);\n          } else {\n            arrows.push(node);\n          }\n          stack.push(node.body);\n        } else if (node.type === \"ConditionalExpression\") {\n          stack.push(node.consequent);\n          stack.push(node.alternate);\n        }\n      }\n\n      if (disallowInvalid) {\n        arrows.forEach(node => this.finishArrowValidation(node));\n        return [arrows, []];\n      }\n\n      return partition(arrows, node =>\n        node.params.every(param => this.isAssignable(param, true)),\n      );\n    }\n\n    finishArrowValidation(node: N.ArrowFunctionExpression) {\n      this.toAssignableList(\n        // node.params is Expression[] instead of $ReadOnlyArray<Pattern> because it\n        // has not been converted yet.\n        ((node.params: any): N.Expression[]),\n        node.extra?.trailingComma,\n      );\n      // Enter scope, as checkParams defines bindings\n      this.scope.enter(SCOPE_FUNCTION | SCOPE_ARROW);\n      // Use super's method to force the parameters to be checked\n      super.checkParams(node, false, true);\n      this.scope.exit();\n    }\n\n    forwardNoArrowParamsConversionAt<T>(node: N.Node, parse: () => T): T {\n      let result: T;\n      if (this.state.noArrowParamsConversionAt.indexOf(node.start) !== -1) {\n        this.state.noArrowParamsConversionAt.push(this.state.start);\n        result = parse();\n        this.state.noArrowParamsConversionAt.pop();\n      } else {\n        result = parse();\n      }\n\n      return result;\n    }\n\n    parseParenItem(\n      node: N.Expression,\n      startPos: number,\n      startLoc: Position,\n    ): N.Expression {\n      node = super.parseParenItem(node, startPos, startLoc);\n      if (this.eat(tt.question)) {\n        node.optional = true;\n        // Include questionmark in location of node\n        // Don't use this.finishNode() as otherwise we might process comments twice and\n        // include already consumed parens\n        this.resetEndLocation(node);\n      }\n\n      if (this.match(tt.colon)) {\n        const typeCastNode = this.startNodeAt(startPos, startLoc);\n        typeCastNode.expression = node;\n        typeCastNode.typeAnnotation = this.flowParseTypeAnnotation();\n\n        return this.finishNode(typeCastNode, \"TypeCastExpression\");\n      }\n\n      return node;\n    }\n\n    assertModuleNodeAllowed(node: N.Node) {\n      if (\n        (node.type === \"ImportDeclaration\" &&\n          (node.importKind === \"type\" || node.importKind === \"typeof\")) ||\n        (node.type === \"ExportNamedDeclaration\" &&\n          node.exportKind === \"type\") ||\n        (node.type === \"ExportAllDeclaration\" && node.exportKind === \"type\")\n      ) {\n        // Allow Flowtype imports and exports in all conditions because\n        // Flow itself does not care about 'sourceType'.\n        return;\n      }\n\n      super.assertModuleNodeAllowed(node);\n    }\n\n    parseExport(node: N.Node): N.AnyExport {\n      const decl = super.parseExport(node);\n      if (\n        decl.type === \"ExportNamedDeclaration\" ||\n        decl.type === \"ExportAllDeclaration\"\n      ) {\n        decl.exportKind = decl.exportKind || \"value\";\n      }\n      return decl;\n    }\n\n    parseExportDeclaration(node: N.ExportNamedDeclaration): ?N.Declaration {\n      if (this.isContextual(\"type\")) {\n        node.exportKind = \"type\";\n\n        const declarationNode = this.startNode();\n        this.next();\n\n        if (this.match(tt.braceL)) {\n          // export type { foo, bar };\n          node.specifiers = this.parseExportSpecifiers();\n          this.parseExportFrom(node);\n          return null;\n        } else {\n          // export type Foo = Bar;\n          return this.flowParseTypeAlias(declarationNode);\n        }\n      } else if (this.isContextual(\"opaque\")) {\n        node.exportKind = \"type\";\n\n        const declarationNode = this.startNode();\n        this.next();\n        // export opaque type Foo = Bar;\n        return this.flowParseOpaqueType(declarationNode, false);\n      } else if (this.isContextual(\"interface\")) {\n        node.exportKind = \"type\";\n        const declarationNode = this.startNode();\n        this.next();\n        return this.flowParseInterface(declarationNode);\n      } else if (this.shouldParseEnums() && this.isContextual(\"enum\")) {\n        node.exportKind = \"value\";\n        const declarationNode = this.startNode();\n        this.next();\n        return this.flowParseEnumDeclaration(declarationNode);\n      } else {\n        return super.parseExportDeclaration(node);\n      }\n    }\n\n    eatExportStar(node: N.Node): boolean {\n      if (super.eatExportStar(...arguments)) return true;\n\n      if (this.isContextual(\"type\") && this.lookahead().type === tt.star) {\n        node.exportKind = \"type\";\n        this.next();\n        this.next();\n        return true;\n      }\n\n      return false;\n    }\n\n    maybeParseExportNamespaceSpecifier(node: N.Node): boolean {\n      const pos = this.state.start;\n      const hasNamespace = super.maybeParseExportNamespaceSpecifier(node);\n      if (hasNamespace && node.exportKind === \"type\") {\n        this.unexpected(pos);\n      }\n      return hasNamespace;\n    }\n\n    parseClassId(node: N.Class, isStatement: boolean, optionalId: ?boolean) {\n      super.parseClassId(node, isStatement, optionalId);\n      if (this.isRelational(\"<\")) {\n        node.typeParameters = this.flowParseTypeParameterDeclaration();\n      }\n    }\n\n    parseClassMember(\n      classBody: N.ClassBody,\n      member: any,\n      state: { hadConstructor: boolean },\n      constructorAllowsSuper: boolean,\n    ): void {\n      const pos = this.state.start;\n      if (this.isContextual(\"declare\")) {\n        if (this.parseClassMemberFromModifier(classBody, member)) {\n          // 'declare' is a class element name\n          return;\n        }\n\n        member.declare = true;\n      }\n\n      super.parseClassMember(classBody, member, state, constructorAllowsSuper);\n\n      if (member.declare) {\n        if (\n          member.type !== \"ClassProperty\" &&\n          member.type !== \"ClassPrivateProperty\"\n        ) {\n          this.raise(pos, FlowErrors.DeclareClassElement);\n        } else if (member.value) {\n          this.raise(\n            member.value.start,\n            FlowErrors.DeclareClassFieldInitializer,\n          );\n        }\n      }\n    }\n\n    // ensure that inside flow types, we bypass the jsx parser plugin\n    getTokenFromCode(code: number): void {\n      const next = this.input.charCodeAt(this.state.pos + 1);\n      if (code === charCodes.leftCurlyBrace && next === charCodes.verticalBar) {\n        return this.finishOp(tt.braceBarL, 2);\n      } else if (\n        this.state.inType &&\n        (code === charCodes.greaterThan || code === charCodes.lessThan)\n      ) {\n        return this.finishOp(tt.relational, 1);\n      } else if (isIteratorStart(code, next)) {\n        this.state.isIterator = true;\n        return super.readWord();\n      } else {\n        return super.getTokenFromCode(code);\n      }\n    }\n\n    isAssignable(node: N.Node, isBinding?: boolean): boolean {\n      switch (node.type) {\n        case \"Identifier\":\n        case \"ObjectPattern\":\n        case \"ArrayPattern\":\n        case \"AssignmentPattern\":\n          return true;\n\n        case \"ObjectExpression\": {\n          const last = node.properties.length - 1;\n          return node.properties.every((prop, i) => {\n            return (\n              prop.type !== \"ObjectMethod\" &&\n              (i === last || prop.type === \"SpreadElement\") &&\n              this.isAssignable(prop)\n            );\n          });\n        }\n\n        case \"ObjectProperty\":\n          return this.isAssignable(node.value);\n\n        case \"SpreadElement\":\n          return this.isAssignable(node.argument);\n\n        case \"ArrayExpression\":\n          return node.elements.every(element => this.isAssignable(element));\n\n        case \"AssignmentExpression\":\n          return node.operator === \"=\";\n\n        case \"ParenthesizedExpression\":\n        case \"TypeCastExpression\":\n          return this.isAssignable(node.expression);\n\n        case \"MemberExpression\":\n        case \"OptionalMemberExpression\":\n          return !isBinding;\n\n        default:\n          return false;\n      }\n    }\n\n    toAssignable(node: N.Node): N.Node {\n      if (node.type === \"TypeCastExpression\") {\n        return super.toAssignable(this.typeCastToParameter(node));\n      } else {\n        return super.toAssignable(node);\n      }\n    }\n\n    // turn type casts that we found in function parameter head into type annotated params\n    toAssignableList(\n      exprList: N.Expression[],\n      trailingCommaPos?: ?number,\n    ): $ReadOnlyArray<N.Pattern> {\n      for (let i = 0; i < exprList.length; i++) {\n        const expr = exprList[i];\n        if (expr && expr.type === \"TypeCastExpression\") {\n          exprList[i] = this.typeCastToParameter(expr);\n        }\n      }\n      return super.toAssignableList(exprList, trailingCommaPos);\n    }\n\n    // this is a list of nodes, from something like a call expression, we need to filter the\n    // type casts that we've found that are illegal in this context\n    toReferencedList(\n      exprList: $ReadOnlyArray<?N.Expression>,\n      isParenthesizedExpr?: boolean,\n    ): $ReadOnlyArray<?N.Expression> {\n      for (let i = 0; i < exprList.length; i++) {\n        const expr = exprList[i];\n        if (\n          expr &&\n          expr.type === \"TypeCastExpression\" &&\n          (!expr.extra || !expr.extra.parenthesized) &&\n          (exprList.length > 1 || !isParenthesizedExpr)\n        ) {\n          this.raise(expr.typeAnnotation.start, FlowErrors.TypeCastInPattern);\n        }\n      }\n\n      return exprList;\n    }\n\n    checkLVal(\n      expr: N.Expression,\n      bindingType: BindingTypes = BIND_NONE,\n      checkClashes: ?{ [key: string]: boolean },\n      contextDescription: string,\n    ): void {\n      if (expr.type !== \"TypeCastExpression\") {\n        return super.checkLVal(\n          expr,\n          bindingType,\n          checkClashes,\n          contextDescription,\n        );\n      }\n    }\n\n    // parse class property type annotations\n    parseClassProperty(node: N.ClassProperty): N.ClassProperty {\n      if (this.match(tt.colon)) {\n        node.typeAnnotation = this.flowParseTypeAnnotation();\n      }\n      return super.parseClassProperty(node);\n    }\n\n    parseClassPrivateProperty(\n      node: N.ClassPrivateProperty,\n    ): N.ClassPrivateProperty {\n      if (this.match(tt.colon)) {\n        node.typeAnnotation = this.flowParseTypeAnnotation();\n      }\n      return super.parseClassPrivateProperty(node);\n    }\n\n    // determine whether or not we're currently in the position where a class method would appear\n    isClassMethod(): boolean {\n      return this.isRelational(\"<\") || super.isClassMethod();\n    }\n\n    // determine whether or not we're currently in the position where a class property would appear\n    isClassProperty(): boolean {\n      return this.match(tt.colon) || super.isClassProperty();\n    }\n\n    isNonstaticConstructor(method: N.ClassMethod | N.ClassProperty): boolean {\n      return !this.match(tt.colon) && super.isNonstaticConstructor(method);\n    }\n\n    // parse type parameters for class methods\n    pushClassMethod(\n      classBody: N.ClassBody,\n      method: N.ClassMethod,\n      isGenerator: boolean,\n      isAsync: boolean,\n      isConstructor: boolean,\n      allowsDirectSuper: boolean,\n    ): void {\n      if ((method: $FlowFixMe).variance) {\n        this.unexpected((method: $FlowFixMe).variance.start);\n      }\n      delete (method: $FlowFixMe).variance;\n      if (this.isRelational(\"<\")) {\n        method.typeParameters = this.flowParseTypeParameterDeclaration();\n      }\n\n      super.pushClassMethod(\n        classBody,\n        method,\n        isGenerator,\n        isAsync,\n        isConstructor,\n        allowsDirectSuper,\n      );\n    }\n\n    pushClassPrivateMethod(\n      classBody: N.ClassBody,\n      method: N.ClassPrivateMethod,\n      isGenerator: boolean,\n      isAsync: boolean,\n    ): void {\n      if ((method: $FlowFixMe).variance) {\n        this.unexpected((method: $FlowFixMe).variance.start);\n      }\n      delete (method: $FlowFixMe).variance;\n      if (this.isRelational(\"<\")) {\n        method.typeParameters = this.flowParseTypeParameterDeclaration();\n      }\n\n      super.pushClassPrivateMethod(classBody, method, isGenerator, isAsync);\n    }\n\n    // parse a the super class type parameters and implements\n    parseClassSuper(node: N.Class): void {\n      super.parseClassSuper(node);\n      if (node.superClass && this.isRelational(\"<\")) {\n        node.superTypeParameters = this.flowParseTypeParameterInstantiation();\n      }\n      if (this.isContextual(\"implements\")) {\n        this.next();\n        const implemented: N.FlowClassImplements[] = (node.implements = []);\n        do {\n          const node = this.startNode();\n          node.id = this.flowParseRestrictedIdentifier(/*liberal*/ true);\n          if (this.isRelational(\"<\")) {\n            node.typeParameters = this.flowParseTypeParameterInstantiation();\n          } else {\n            node.typeParameters = null;\n          }\n          implemented.push(this.finishNode(node, \"ClassImplements\"));\n        } while (this.eat(tt.comma));\n      }\n    }\n\n    parsePropertyName(\n      node: N.ObjectOrClassMember | N.ClassMember | N.TsNamedTypeElementBase,\n      isPrivateNameAllowed: boolean,\n    ): N.Identifier {\n      const variance = this.flowParseVariance();\n      const key = super.parsePropertyName(node, isPrivateNameAllowed);\n      // $FlowIgnore (\"variance\" not defined on TsNamedTypeElementBase)\n      node.variance = variance;\n      return key;\n    }\n\n    // parse type parameters for object method shorthand\n    parseObjPropValue(\n      prop: N.ObjectMember,\n      startPos: ?number,\n      startLoc: ?Position,\n      isGenerator: boolean,\n      isAsync: boolean,\n      isPattern: boolean,\n      refExpressionErrors: ?ExpressionErrors,\n      containsEsc: boolean,\n    ): void {\n      if ((prop: $FlowFixMe).variance) {\n        this.unexpected((prop: $FlowFixMe).variance.start);\n      }\n      delete (prop: $FlowFixMe).variance;\n\n      let typeParameters;\n\n      // method shorthand\n      if (this.isRelational(\"<\")) {\n        typeParameters = this.flowParseTypeParameterDeclaration();\n        if (!this.match(tt.parenL)) this.unexpected();\n      }\n\n      super.parseObjPropValue(\n        prop,\n        startPos,\n        startLoc,\n        isGenerator,\n        isAsync,\n        isPattern,\n        refExpressionErrors,\n        containsEsc,\n      );\n\n      // add typeParameters if we found them\n      if (typeParameters) {\n        (prop.value || prop).typeParameters = typeParameters;\n      }\n    }\n\n    parseAssignableListItemTypes(param: N.Pattern): N.Pattern {\n      if (this.eat(tt.question)) {\n        if (param.type !== \"Identifier\") {\n          this.raise(param.start, FlowErrors.OptionalBindingPattern);\n        }\n\n        ((param: any): N.Identifier).optional = true;\n      }\n      if (this.match(tt.colon)) {\n        param.typeAnnotation = this.flowParseTypeAnnotation();\n      }\n      this.resetEndLocation(param);\n      return param;\n    }\n\n    parseMaybeDefault(\n      startPos?: ?number,\n      startLoc?: ?Position,\n      left?: ?N.Pattern,\n    ): N.Pattern {\n      const node = super.parseMaybeDefault(startPos, startLoc, left);\n\n      if (\n        node.type === \"AssignmentPattern\" &&\n        node.typeAnnotation &&\n        node.right.start < node.typeAnnotation.start\n      ) {\n        this.raise(node.typeAnnotation.start, FlowErrors.TypeBeforeInitializer);\n      }\n\n      return node;\n    }\n\n    shouldParseDefaultImport(node: N.ImportDeclaration): boolean {\n      if (!hasTypeImportKind(node)) {\n        return super.shouldParseDefaultImport(node);\n      }\n\n      return isMaybeDefaultImport(this.state);\n    }\n\n    parseImportSpecifierLocal(\n      node: N.ImportDeclaration,\n      specifier: N.Node,\n      type: string,\n      contextDescription: string,\n    ): void {\n      specifier.local = hasTypeImportKind(node)\n        ? this.flowParseRestrictedIdentifier(\n            /* liberal */ true,\n            /* declaration */ true,\n          )\n        : this.parseIdentifier();\n\n      this.checkLVal(\n        specifier.local,\n        BIND_LEXICAL,\n        undefined,\n        contextDescription,\n      );\n      node.specifiers.push(this.finishNode(specifier, type));\n    }\n\n    // parse typeof and type imports\n    maybeParseDefaultImportSpecifier(node: N.ImportDeclaration): boolean {\n      node.importKind = \"value\";\n\n      let kind = null;\n      if (this.match(tt._typeof)) {\n        kind = \"typeof\";\n      } else if (this.isContextual(\"type\")) {\n        kind = \"type\";\n      }\n      if (kind) {\n        const lh = this.lookahead();\n\n        // import type * is not allowed\n        if (kind === \"type\" && lh.type === tt.star) {\n          this.unexpected(lh.start);\n        }\n\n        if (\n          isMaybeDefaultImport(lh) ||\n          lh.type === tt.braceL ||\n          lh.type === tt.star\n        ) {\n          this.next();\n          node.importKind = kind;\n        }\n      }\n\n      return super.maybeParseDefaultImportSpecifier(node);\n    }\n\n    // parse import-type/typeof shorthand\n    parseImportSpecifier(node: N.ImportDeclaration): void {\n      const specifier = this.startNode();\n      const firstIdentLoc = this.state.start;\n      const firstIdent = this.parseIdentifier(true);\n\n      let specifierTypeKind = null;\n      if (firstIdent.name === \"type\") {\n        specifierTypeKind = \"type\";\n      } else if (firstIdent.name === \"typeof\") {\n        specifierTypeKind = \"typeof\";\n      }\n\n      let isBinding = false;\n      if (this.isContextual(\"as\") && !this.isLookaheadContextual(\"as\")) {\n        const as_ident = this.parseIdentifier(true);\n        if (\n          specifierTypeKind !== null &&\n          !this.match(tt.name) &&\n          !this.state.type.keyword\n        ) {\n          // `import {type as ,` or `import {type as }`\n          specifier.imported = as_ident;\n          specifier.importKind = specifierTypeKind;\n          specifier.local = as_ident.__clone();\n        } else {\n          // `import {type as foo`\n          specifier.imported = firstIdent;\n          specifier.importKind = null;\n          specifier.local = this.parseIdentifier();\n        }\n      } else if (\n        specifierTypeKind !== null &&\n        (this.match(tt.name) || this.state.type.keyword)\n      ) {\n        // `import {type foo`\n        specifier.imported = this.parseIdentifier(true);\n        specifier.importKind = specifierTypeKind;\n        if (this.eatContextual(\"as\")) {\n          specifier.local = this.parseIdentifier();\n        } else {\n          isBinding = true;\n          specifier.local = specifier.imported.__clone();\n        }\n      } else {\n        isBinding = true;\n        specifier.imported = firstIdent;\n        specifier.importKind = null;\n        specifier.local = specifier.imported.__clone();\n      }\n\n      const nodeIsTypeImport = hasTypeImportKind(node);\n      const specifierIsTypeImport = hasTypeImportKind(specifier);\n\n      if (nodeIsTypeImport && specifierIsTypeImport) {\n        this.raise(\n          firstIdentLoc,\n          FlowErrors.ImportTypeShorthandOnlyInPureImport,\n        );\n      }\n\n      if (nodeIsTypeImport || specifierIsTypeImport) {\n        this.checkReservedType(\n          specifier.local.name,\n          specifier.local.start,\n          /* declaration */ true,\n        );\n      }\n\n      if (isBinding && !nodeIsTypeImport && !specifierIsTypeImport) {\n        this.checkReservedWord(\n          specifier.local.name,\n          specifier.start,\n          true,\n          true,\n        );\n      }\n\n      this.checkLVal(\n        specifier.local,\n        BIND_LEXICAL,\n        undefined,\n        \"import specifier\",\n      );\n      node.specifiers.push(this.finishNode(specifier, \"ImportSpecifier\"));\n    }\n\n    // parse function type parameters - function foo<T>() {}\n    parseFunctionParams(node: N.Function, allowModifiers?: boolean): void {\n      // $FlowFixMe\n      const kind = node.kind;\n      if (kind !== \"get\" && kind !== \"set\" && this.isRelational(\"<\")) {\n        node.typeParameters = this.flowParseTypeParameterDeclaration();\n      }\n      super.parseFunctionParams(node, allowModifiers);\n    }\n\n    // parse flow type annotations on variable declarator heads - let foo: string = bar\n    parseVarId(\n      decl: N.VariableDeclarator,\n      kind: \"var\" | \"let\" | \"const\",\n    ): void {\n      super.parseVarId(decl, kind);\n      if (this.match(tt.colon)) {\n        decl.id.typeAnnotation = this.flowParseTypeAnnotation();\n        this.resetEndLocation(decl.id); // set end position to end of type\n      }\n    }\n\n    // parse the return type of an async arrow function - let foo = (async (): number => {});\n    parseAsyncArrowFromCallExpression(\n      node: N.ArrowFunctionExpression,\n      call: N.CallExpression,\n    ): N.ArrowFunctionExpression {\n      if (this.match(tt.colon)) {\n        const oldNoAnonFunctionType = this.state.noAnonFunctionType;\n        this.state.noAnonFunctionType = true;\n        node.returnType = this.flowParseTypeAnnotation();\n        this.state.noAnonFunctionType = oldNoAnonFunctionType;\n      }\n\n      return super.parseAsyncArrowFromCallExpression(node, call);\n    }\n\n    // todo description\n    shouldParseAsyncArrow(): boolean {\n      return this.match(tt.colon) || super.shouldParseAsyncArrow();\n    }\n\n    // We need to support type parameter declarations for arrow functions. This\n    // is tricky. There are three situations we need to handle\n    //\n    // 1. This is either JSX or an arrow function. We'll try JSX first. If that\n    //    fails, we'll try an arrow function. If that fails, we'll throw the JSX\n    //    error.\n    // 2. This is an arrow function. We'll parse the type parameter declaration,\n    //    parse the rest, make sure the rest is an arrow function, and go from\n    //    there\n    // 3. This is neither. Just call the super method\n    parseMaybeAssign(\n      noIn?: ?boolean,\n      refExpressionErrors?: ?ExpressionErrors,\n      afterLeftParse?: Function,\n      refNeedsArrowPos?: ?Pos,\n    ): N.Expression {\n      let state = null;\n\n      let jsx;\n\n      if (\n        this.hasPlugin(\"jsx\") &&\n        (this.match(tt.jsxTagStart) || this.isRelational(\"<\"))\n      ) {\n        state = this.state.clone();\n\n        jsx = this.tryParse(\n          () =>\n            super.parseMaybeAssign(\n              noIn,\n              refExpressionErrors,\n              afterLeftParse,\n              refNeedsArrowPos,\n            ),\n          state,\n        );\n        /*:: invariant(!jsx.aborted) */\n\n        if (!jsx.error) return jsx.node;\n\n        // Remove `tc.j_expr` and `tc.j_oTag` from context added\n        // by parsing `jsxTagStart` to stop the JSX plugin from\n        // messing with the tokens\n        const { context } = this.state;\n        if (context[context.length - 1] === tc.j_oTag) {\n          context.length -= 2;\n        } else if (context[context.length - 1] === tc.j_expr) {\n          context.length -= 1;\n        }\n      }\n\n      if ((jsx && jsx.error) || this.isRelational(\"<\")) {\n        state = state || this.state.clone();\n\n        let typeParameters;\n\n        const arrow = this.tryParse(() => {\n          typeParameters = this.flowParseTypeParameterDeclaration();\n\n          const arrowExpression = this.forwardNoArrowParamsConversionAt(\n            typeParameters,\n            () =>\n              super.parseMaybeAssign(\n                noIn,\n                refExpressionErrors,\n                afterLeftParse,\n                refNeedsArrowPos,\n              ),\n          );\n          arrowExpression.typeParameters = typeParameters;\n          this.resetStartLocationFromNode(arrowExpression, typeParameters);\n\n          return arrowExpression;\n        }, state);\n\n        const arrowExpression: ?N.ArrowFunctionExpression =\n          arrow.node && arrow.node.type === \"ArrowFunctionExpression\"\n            ? arrow.node\n            : null;\n\n        if (!arrow.error && arrowExpression) return arrowExpression;\n\n        // If we are here, both JSX and Flow parsing attemps failed.\n        // Give the precedence to the JSX error, except if JSX had an\n        // unrecoverable error while Flow didn't.\n        // If the error is recoverable, we can only re-report it if there is\n        // a node we can return.\n\n        if (jsx && jsx.node) {\n          /*:: invariant(jsx.failState) */\n          this.state = jsx.failState;\n          return jsx.node;\n        }\n\n        if (arrowExpression) {\n          /*:: invariant(arrow.failState) */\n          this.state = arrow.failState;\n          return arrowExpression;\n        }\n\n        if (jsx && jsx.thrown) throw jsx.error;\n        if (arrow.thrown) throw arrow.error;\n\n        /*:: invariant(typeParameters) */\n        throw this.raise(\n          typeParameters.start,\n          FlowErrors.UnexpectedTokenAfterTypeParameter,\n        );\n      }\n\n      return super.parseMaybeAssign(\n        noIn,\n        refExpressionErrors,\n        afterLeftParse,\n        refNeedsArrowPos,\n      );\n    }\n\n    // handle return types for arrow functions\n    parseArrow(node: N.ArrowFunctionExpression): ?N.ArrowFunctionExpression {\n      if (this.match(tt.colon)) {\n        const result = this.tryParse(() => {\n          const oldNoAnonFunctionType = this.state.noAnonFunctionType;\n          this.state.noAnonFunctionType = true;\n\n          const typeNode = this.startNode();\n\n          [\n            // $FlowFixMe (destructuring not supported yet)\n            typeNode.typeAnnotation,\n            // $FlowFixMe (destructuring not supported yet)\n            node.predicate,\n          ] = this.flowParseTypeAndPredicateInitialiser();\n\n          this.state.noAnonFunctionType = oldNoAnonFunctionType;\n\n          if (this.canInsertSemicolon()) this.unexpected();\n          if (!this.match(tt.arrow)) this.unexpected();\n\n          return typeNode;\n        });\n\n        if (result.thrown) return null;\n        /*:: invariant(result.node) */\n\n        if (result.error) this.state = result.failState;\n\n        // assign after it is clear it is an arrow\n        node.returnType = result.node.typeAnnotation\n          ? this.finishNode(result.node, \"TypeAnnotation\")\n          : null;\n      }\n\n      return super.parseArrow(node);\n    }\n\n    shouldParseArrow(): boolean {\n      return this.match(tt.colon) || super.shouldParseArrow();\n    }\n\n    setArrowFunctionParameters(\n      node: N.ArrowFunctionExpression,\n      params: N.Expression[],\n    ): void {\n      if (this.state.noArrowParamsConversionAt.indexOf(node.start) !== -1) {\n        node.params = params;\n      } else {\n        super.setArrowFunctionParameters(node, params);\n      }\n    }\n\n    checkParams(\n      node: N.Function,\n      allowDuplicates: boolean,\n      isArrowFunction: ?boolean,\n    ): void {\n      if (\n        isArrowFunction &&\n        this.state.noArrowParamsConversionAt.indexOf(node.start) !== -1\n      ) {\n        return;\n      }\n\n      return super.checkParams(...arguments);\n    }\n\n    parseParenAndDistinguishExpression(canBeArrow: boolean): N.Expression {\n      return super.parseParenAndDistinguishExpression(\n        canBeArrow && this.state.noArrowAt.indexOf(this.state.start) === -1,\n      );\n    }\n\n    parseSubscripts(\n      base: N.Expression,\n      startPos: number,\n      startLoc: Position,\n      noCalls?: ?boolean,\n    ): N.Expression {\n      if (\n        base.type === \"Identifier\" &&\n        base.name === \"async\" &&\n        this.state.noArrowAt.indexOf(startPos) !== -1\n      ) {\n        this.next();\n\n        const node = this.startNodeAt(startPos, startLoc);\n        node.callee = base;\n        node.arguments = this.parseCallExpressionArguments(tt.parenR, false);\n        base = this.finishNode(node, \"CallExpression\");\n      } else if (\n        base.type === \"Identifier\" &&\n        base.name === \"async\" &&\n        this.isRelational(\"<\")\n      ) {\n        const state = this.state.clone();\n        const arrow = this.tryParse(\n          abort =>\n            this.parseAsyncArrowWithTypeParameters(startPos, startLoc) ||\n            abort(),\n          state,\n        );\n\n        if (!arrow.error && !arrow.aborted) return arrow.node;\n\n        const result = this.tryParse(\n          () => super.parseSubscripts(base, startPos, startLoc, noCalls),\n          state,\n        );\n\n        if (result.node && !result.error) return result.node;\n\n        if (arrow.node) {\n          this.state = arrow.failState;\n          return arrow.node;\n        }\n\n        if (result.node) {\n          this.state = result.failState;\n          return result.node;\n        }\n\n        throw arrow.error || result.error;\n      }\n\n      return super.parseSubscripts(base, startPos, startLoc, noCalls);\n    }\n\n    parseSubscript(\n      base: N.Expression,\n      startPos: number,\n      startLoc: Position,\n      noCalls: ?boolean,\n      subscriptState: N.ParseSubscriptState,\n    ): N.Expression {\n      if (this.match(tt.questionDot) && this.isLookaheadRelational(\"<\")) {\n        subscriptState.optionalChainMember = true;\n        if (noCalls) {\n          subscriptState.stop = true;\n          return base;\n        }\n        this.next();\n        const node: N.OptionalCallExpression = this.startNodeAt(\n          startPos,\n          startLoc,\n        );\n        node.callee = base;\n        node.typeArguments = this.flowParseTypeParameterInstantiation();\n        this.expect(tt.parenL);\n        // $FlowFixMe\n        node.arguments = this.parseCallExpressionArguments(tt.parenR, false);\n        node.optional = true;\n        return this.finishCallExpression(node, /* optional */ true);\n      } else if (\n        !noCalls &&\n        this.shouldParseTypes() &&\n        this.isRelational(\"<\")\n      ) {\n        const node = this.startNodeAt(startPos, startLoc);\n        node.callee = base;\n\n        const result = this.tryParse(() => {\n          node.typeArguments = this.flowParseTypeParameterInstantiationCallOrNew();\n          this.expect(tt.parenL);\n          node.arguments = this.parseCallExpressionArguments(tt.parenR, false);\n          if (subscriptState.optionalChainMember) node.optional = false;\n          return this.finishCallExpression(\n            node,\n            subscriptState.optionalChainMember,\n          );\n        });\n\n        if (result.node) {\n          if (result.error) this.state = result.failState;\n          return result.node;\n        }\n      }\n\n      return super.parseSubscript(\n        base,\n        startPos,\n        startLoc,\n        noCalls,\n        subscriptState,\n      );\n    }\n\n    parseNewArguments(node: N.NewExpression): void {\n      let targs = null;\n      if (this.shouldParseTypes() && this.isRelational(\"<\")) {\n        targs = this.tryParse(() =>\n          this.flowParseTypeParameterInstantiationCallOrNew(),\n        ).node;\n      }\n      node.typeArguments = targs;\n\n      super.parseNewArguments(node);\n    }\n\n    parseAsyncArrowWithTypeParameters(\n      startPos: number,\n      startLoc: Position,\n    ): ?N.ArrowFunctionExpression {\n      const node = this.startNodeAt(startPos, startLoc);\n      this.parseFunctionParams(node);\n      if (!this.parseArrow(node)) return;\n      return this.parseArrowExpression(\n        node,\n        /* params */ undefined,\n        /* isAsync */ true,\n      );\n    }\n\n    readToken_mult_modulo(code: number): void {\n      const next = this.input.charCodeAt(this.state.pos + 1);\n      if (\n        code === charCodes.asterisk &&\n        next === charCodes.slash &&\n        this.state.hasFlowComment\n      ) {\n        this.state.hasFlowComment = false;\n        this.state.pos += 2;\n        this.nextToken();\n        return;\n      }\n\n      super.readToken_mult_modulo(code);\n    }\n\n    readToken_pipe_amp(code: number): void {\n      const next = this.input.charCodeAt(this.state.pos + 1);\n      if (\n        code === charCodes.verticalBar &&\n        next === charCodes.rightCurlyBrace\n      ) {\n        // '|}'\n        this.finishOp(tt.braceBarR, 2);\n        return;\n      }\n\n      super.readToken_pipe_amp(code);\n    }\n\n    parseTopLevel(file: N.File, program: N.Program): N.File {\n      const fileNode = super.parseTopLevel(file, program);\n      if (this.state.hasFlowComment) {\n        this.raise(this.state.pos, FlowErrors.UnterminatedFlowComment);\n      }\n      return fileNode;\n    }\n\n    skipBlockComment(): void {\n      if (this.hasPlugin(\"flowComments\") && this.skipFlowComment()) {\n        if (this.state.hasFlowComment) {\n          this.unexpected(null, FlowErrors.NestedFlowComment);\n        }\n        this.hasFlowCommentCompletion();\n        this.state.pos += this.skipFlowComment();\n        this.state.hasFlowComment = true;\n        return;\n      }\n\n      if (this.state.hasFlowComment) {\n        const end = this.input.indexOf(\"*-/\", (this.state.pos += 2));\n        if (end === -1) {\n          throw this.raise(this.state.pos - 2, Errors.UnterminatedComment);\n        }\n        this.state.pos = end + 3;\n        return;\n      }\n\n      super.skipBlockComment();\n    }\n\n    skipFlowComment(): number | boolean {\n      const { pos } = this.state;\n      let shiftToFirstNonWhiteSpace = 2;\n      while (\n        [charCodes.space, charCodes.tab].includes(\n          this.input.charCodeAt(pos + shiftToFirstNonWhiteSpace),\n        )\n      ) {\n        shiftToFirstNonWhiteSpace++;\n      }\n\n      const ch2 = this.input.charCodeAt(shiftToFirstNonWhiteSpace + pos);\n      const ch3 = this.input.charCodeAt(shiftToFirstNonWhiteSpace + pos + 1);\n\n      if (ch2 === charCodes.colon && ch3 === charCodes.colon) {\n        return shiftToFirstNonWhiteSpace + 2; // check for /*::\n      }\n      if (\n        this.input.slice(\n          shiftToFirstNonWhiteSpace + pos,\n          shiftToFirstNonWhiteSpace + pos + 12,\n        ) === \"flow-include\"\n      ) {\n        return shiftToFirstNonWhiteSpace + 12; // check for /*flow-include\n      }\n      if (ch2 === charCodes.colon && ch3 !== charCodes.colon) {\n        return shiftToFirstNonWhiteSpace; // check for /*:, advance up to :\n      }\n      return false;\n    }\n\n    hasFlowCommentCompletion(): void {\n      const end = this.input.indexOf(\"*/\", this.state.pos);\n      if (end === -1) {\n        throw this.raise(this.state.pos, Errors.UnterminatedComment);\n      }\n    }\n\n    // Flow enum parsing\n\n    flowEnumErrorBooleanMemberNotInitialized(\n      pos: number,\n      { enumName, memberName }: { enumName: string, memberName: string },\n    ): void {\n      this.raise(\n        pos,\n        FlowErrors.EnumBooleanMemberNotInitialized,\n        memberName,\n        enumName,\n      );\n    }\n\n    flowEnumErrorInvalidMemberName(\n      pos: number,\n      { enumName, memberName }: { enumName: string, memberName: string },\n    ): void {\n      const suggestion = memberName[0].toUpperCase() + memberName.slice(1);\n      this.raise(\n        pos,\n        FlowErrors.EnumInvalidMemberName,\n        memberName,\n        suggestion,\n        enumName,\n      );\n    }\n\n    flowEnumErrorDuplicateMemberName(\n      pos: number,\n      { enumName, memberName }: { enumName: string, memberName: string },\n    ): void {\n      this.raise(pos, FlowErrors.EnumDuplicateMemberName, memberName, enumName);\n    }\n\n    flowEnumErrorInconsistentMemberValues(\n      pos: number,\n      { enumName }: { enumName: string },\n    ): void {\n      this.raise(pos, FlowErrors.EnumInconsistentMemberValues, enumName);\n    }\n\n    flowEnumErrorInvalidExplicitType(\n      pos: number,\n      {\n        enumName,\n        suppliedType,\n      }: { enumName: string, suppliedType: null | string },\n    ) {\n      return this.raise(\n        pos,\n        suppliedType === null\n          ? FlowErrors.EnumInvalidExplicitTypeUnknownSupplied\n          : FlowErrors.EnumInvalidExplicitType,\n        enumName,\n        suppliedType,\n      );\n    }\n\n    flowEnumErrorInvalidMemberInitializer(\n      pos: number,\n      { enumName, explicitType, memberName }: EnumContext,\n    ) {\n      let message = null;\n      switch (explicitType) {\n        case \"boolean\":\n        case \"number\":\n        case \"string\":\n          message = FlowErrors.EnumInvalidMemberInitializerPrimaryType;\n          break;\n        case \"symbol\":\n          message = FlowErrors.EnumInvalidMemberInitializerSymbolType;\n          break;\n        default:\n          // null\n          message = FlowErrors.EnumInvalidMemberInitializerUnknownType;\n      }\n      return this.raise(pos, message, enumName, memberName, explicitType);\n    }\n\n    flowEnumErrorNumberMemberNotInitialized(\n      pos: number,\n      { enumName, memberName }: { enumName: string, memberName: string },\n    ): void {\n      this.raise(\n        pos,\n        FlowErrors.EnumNumberMemberNotInitialized,\n        enumName,\n        memberName,\n      );\n    }\n\n    flowEnumErrorStringMemberInconsistentlyInitailized(\n      pos: number,\n      { enumName }: { enumName: string },\n    ): void {\n      this.raise(\n        pos,\n        FlowErrors.EnumStringMemberInconsistentlyInitailized,\n        enumName,\n      );\n    }\n\n    flowEnumMemberInit(): EnumMemberInit {\n      const startPos = this.state.start;\n      const endOfInit = () => this.match(tt.comma) || this.match(tt.braceR);\n      switch (this.state.type) {\n        case tt.num: {\n          const literal = this.parseLiteral(this.state.value, \"NumericLiteral\");\n          if (endOfInit()) {\n            return { type: \"number\", pos: literal.start, value: literal };\n          }\n          return { type: \"invalid\", pos: startPos };\n        }\n        case tt.string: {\n          const literal = this.parseLiteral(this.state.value, \"StringLiteral\");\n          if (endOfInit()) {\n            return { type: \"string\", pos: literal.start, value: literal };\n          }\n          return { type: \"invalid\", pos: startPos };\n        }\n        case tt._true:\n        case tt._false: {\n          const literal = this.parseBooleanLiteral();\n          if (endOfInit()) {\n            return {\n              type: \"boolean\",\n              pos: literal.start,\n              value: literal,\n            };\n          }\n          return { type: \"invalid\", pos: startPos };\n        }\n        default:\n          return { type: \"invalid\", pos: startPos };\n      }\n    }\n\n    flowEnumMemberRaw(): { id: N.Node, init: EnumMemberInit } {\n      const pos = this.state.start;\n      const id = this.parseIdentifier(true);\n      const init = this.eat(tt.eq)\n        ? this.flowEnumMemberInit()\n        : { type: \"none\", pos };\n      return { id, init };\n    }\n\n    flowEnumCheckExplicitTypeMismatch(\n      pos: number,\n      context: EnumContext,\n      expectedType: EnumExplicitType,\n    ): void {\n      const { explicitType } = context;\n      if (explicitType === null) {\n        return;\n      }\n      if (explicitType !== expectedType) {\n        this.flowEnumErrorInvalidMemberInitializer(pos, context);\n      }\n    }\n\n    flowEnumMembers({\n      enumName,\n      explicitType,\n    }: {\n      enumName: string,\n      explicitType: EnumExplicitType,\n    }): {|\n      booleanMembers: Array<N.Node>,\n      numberMembers: Array<N.Node>,\n      stringMembers: Array<N.Node>,\n      defaultedMembers: Array<N.Node>,\n    |} {\n      const seenNames = new Set();\n      const members = {\n        booleanMembers: [],\n        numberMembers: [],\n        stringMembers: [],\n        defaultedMembers: [],\n      };\n      while (!this.match(tt.braceR)) {\n        const memberNode = this.startNode();\n        const { id, init } = this.flowEnumMemberRaw();\n        const memberName = id.name;\n        if (memberName === \"\") {\n          continue;\n        }\n        if (/^[a-z]/.test(memberName)) {\n          this.flowEnumErrorInvalidMemberName(id.start, {\n            enumName,\n            memberName,\n          });\n        }\n        if (seenNames.has(memberName)) {\n          this.flowEnumErrorDuplicateMemberName(id.start, {\n            enumName,\n            memberName,\n          });\n        }\n        seenNames.add(memberName);\n        const context = { enumName, explicitType, memberName };\n        memberNode.id = id;\n        switch (init.type) {\n          case \"boolean\": {\n            this.flowEnumCheckExplicitTypeMismatch(\n              init.pos,\n              context,\n              \"boolean\",\n            );\n            memberNode.init = init.value;\n            members.booleanMembers.push(\n              this.finishNode(memberNode, \"EnumBooleanMember\"),\n            );\n            break;\n          }\n          case \"number\": {\n            this.flowEnumCheckExplicitTypeMismatch(init.pos, context, \"number\");\n            memberNode.init = init.value;\n            members.numberMembers.push(\n              this.finishNode(memberNode, \"EnumNumberMember\"),\n            );\n            break;\n          }\n          case \"string\": {\n            this.flowEnumCheckExplicitTypeMismatch(init.pos, context, \"string\");\n            memberNode.init = init.value;\n            members.stringMembers.push(\n              this.finishNode(memberNode, \"EnumStringMember\"),\n            );\n            break;\n          }\n          case \"invalid\": {\n            throw this.flowEnumErrorInvalidMemberInitializer(init.pos, context);\n          }\n          case \"none\": {\n            switch (explicitType) {\n              case \"boolean\":\n                this.flowEnumErrorBooleanMemberNotInitialized(\n                  init.pos,\n                  context,\n                );\n                break;\n              case \"number\":\n                this.flowEnumErrorNumberMemberNotInitialized(init.pos, context);\n                break;\n              default:\n                members.defaultedMembers.push(\n                  this.finishNode(memberNode, \"EnumDefaultedMember\"),\n                );\n            }\n          }\n        }\n\n        if (!this.match(tt.braceR)) {\n          this.expect(tt.comma);\n        }\n      }\n      return members;\n    }\n\n    flowEnumStringMembers(\n      initializedMembers: Array<N.Node>,\n      defaultedMembers: Array<N.Node>,\n      { enumName }: { enumName: string },\n    ): Array<N.Node> {\n      if (initializedMembers.length === 0) {\n        return defaultedMembers;\n      } else if (defaultedMembers.length === 0) {\n        return initializedMembers;\n      } else if (defaultedMembers.length > initializedMembers.length) {\n        for (const member of initializedMembers) {\n          this.flowEnumErrorStringMemberInconsistentlyInitailized(\n            member.start,\n            { enumName },\n          );\n        }\n        return defaultedMembers;\n      } else {\n        for (const member of defaultedMembers) {\n          this.flowEnumErrorStringMemberInconsistentlyInitailized(\n            member.start,\n            { enumName },\n          );\n        }\n        return initializedMembers;\n      }\n    }\n\n    flowEnumParseExplicitType({\n      enumName,\n    }: {\n      enumName: string,\n    }): EnumExplicitType {\n      if (this.eatContextual(\"of\")) {\n        if (!this.match(tt.name)) {\n          throw this.flowEnumErrorInvalidExplicitType(this.state.start, {\n            enumName,\n            suppliedType: null,\n          });\n        }\n\n        const { value } = this.state;\n        this.next();\n\n        if (\n          value !== \"boolean\" &&\n          value !== \"number\" &&\n          value !== \"string\" &&\n          value !== \"symbol\"\n        ) {\n          this.flowEnumErrorInvalidExplicitType(this.state.start, {\n            enumName,\n            suppliedType: value,\n          });\n        }\n\n        return value;\n      }\n      return null;\n    }\n\n    flowEnumBody(node: N.Node, { enumName, nameLoc }): N.Node {\n      const explicitType = this.flowEnumParseExplicitType({ enumName });\n      this.expect(tt.braceL);\n      const members = this.flowEnumMembers({ enumName, explicitType });\n\n      switch (explicitType) {\n        case \"boolean\":\n          node.explicitType = true;\n          node.members = members.booleanMembers;\n          this.expect(tt.braceR);\n          return this.finishNode(node, \"EnumBooleanBody\");\n        case \"number\":\n          node.explicitType = true;\n          node.members = members.numberMembers;\n          this.expect(tt.braceR);\n          return this.finishNode(node, \"EnumNumberBody\");\n        case \"string\":\n          node.explicitType = true;\n          node.members = this.flowEnumStringMembers(\n            members.stringMembers,\n            members.defaultedMembers,\n            { enumName },\n          );\n          this.expect(tt.braceR);\n          return this.finishNode(node, \"EnumStringBody\");\n        case \"symbol\":\n          node.members = members.defaultedMembers;\n          this.expect(tt.braceR);\n          return this.finishNode(node, \"EnumSymbolBody\");\n        default: {\n          // `explicitType` is `null`\n          const empty = () => {\n            node.members = [];\n            this.expect(tt.braceR);\n            return this.finishNode(node, \"EnumStringBody\");\n          };\n          node.explicitType = false;\n\n          const boolsLen = members.booleanMembers.length;\n          const numsLen = members.numberMembers.length;\n          const strsLen = members.stringMembers.length;\n          const defaultedLen = members.defaultedMembers.length;\n\n          if (!boolsLen && !numsLen && !strsLen && !defaultedLen) {\n            return empty();\n          } else if (!boolsLen && !numsLen) {\n            node.members = this.flowEnumStringMembers(\n              members.stringMembers,\n              members.defaultedMembers,\n              { enumName },\n            );\n            this.expect(tt.braceR);\n            return this.finishNode(node, \"EnumStringBody\");\n          } else if (!numsLen && !strsLen && boolsLen >= defaultedLen) {\n            for (const member of members.defaultedMembers) {\n              this.flowEnumErrorBooleanMemberNotInitialized(member.start, {\n                enumName,\n                memberName: member.id.name,\n              });\n            }\n            node.members = members.booleanMembers;\n            this.expect(tt.braceR);\n            return this.finishNode(node, \"EnumBooleanBody\");\n          } else if (!boolsLen && !strsLen && numsLen >= defaultedLen) {\n            for (const member of members.defaultedMembers) {\n              this.flowEnumErrorNumberMemberNotInitialized(member.start, {\n                enumName,\n                memberName: member.id.name,\n              });\n            }\n            node.members = members.numberMembers;\n            this.expect(tt.braceR);\n            return this.finishNode(node, \"EnumNumberBody\");\n          } else {\n            this.flowEnumErrorInconsistentMemberValues(nameLoc, { enumName });\n            return empty();\n          }\n        }\n      }\n    }\n\n    flowParseEnumDeclaration(node: N.Node): N.Node {\n      const id = this.parseIdentifier();\n      node.id = id;\n      node.body = this.flowEnumBody(this.startNode(), {\n        enumName: id.name,\n        nameLoc: id.start,\n      });\n      return this.finishNode(node, \"EnumDeclaration\");\n    }\n  };\n","// @flow\n\nconst entities: { [name: string]: string } = {\n  quot: \"\\u0022\",\n  amp: \"&\",\n  apos: \"\\u0027\",\n  lt: \"<\",\n  gt: \">\",\n  nbsp: \"\\u00A0\",\n  iexcl: \"\\u00A1\",\n  cent: \"\\u00A2\",\n  pound: \"\\u00A3\",\n  curren: \"\\u00A4\",\n  yen: \"\\u00A5\",\n  brvbar: \"\\u00A6\",\n  sect: \"\\u00A7\",\n  uml: \"\\u00A8\",\n  copy: \"\\u00A9\",\n  ordf: \"\\u00AA\",\n  laquo: \"\\u00AB\",\n  not: \"\\u00AC\",\n  shy: \"\\u00AD\",\n  reg: \"\\u00AE\",\n  macr: \"\\u00AF\",\n  deg: \"\\u00B0\",\n  plusmn: \"\\u00B1\",\n  sup2: \"\\u00B2\",\n  sup3: \"\\u00B3\",\n  acute: \"\\u00B4\",\n  micro: \"\\u00B5\",\n  para: \"\\u00B6\",\n  middot: \"\\u00B7\",\n  cedil: \"\\u00B8\",\n  sup1: \"\\u00B9\",\n  ordm: \"\\u00BA\",\n  raquo: \"\\u00BB\",\n  frac14: \"\\u00BC\",\n  frac12: \"\\u00BD\",\n  frac34: \"\\u00BE\",\n  iquest: \"\\u00BF\",\n  Agrave: \"\\u00C0\",\n  Aacute: \"\\u00C1\",\n  Acirc: \"\\u00C2\",\n  Atilde: \"\\u00C3\",\n  Auml: \"\\u00C4\",\n  Aring: \"\\u00C5\",\n  AElig: \"\\u00C6\",\n  Ccedil: \"\\u00C7\",\n  Egrave: \"\\u00C8\",\n  Eacute: \"\\u00C9\",\n  Ecirc: \"\\u00CA\",\n  Euml: \"\\u00CB\",\n  Igrave: \"\\u00CC\",\n  Iacute: \"\\u00CD\",\n  Icirc: \"\\u00CE\",\n  Iuml: \"\\u00CF\",\n  ETH: \"\\u00D0\",\n  Ntilde: \"\\u00D1\",\n  Ograve: \"\\u00D2\",\n  Oacute: \"\\u00D3\",\n  Ocirc: \"\\u00D4\",\n  Otilde: \"\\u00D5\",\n  Ouml: \"\\u00D6\",\n  times: \"\\u00D7\",\n  Oslash: \"\\u00D8\",\n  Ugrave: \"\\u00D9\",\n  Uacute: \"\\u00DA\",\n  Ucirc: \"\\u00DB\",\n  Uuml: \"\\u00DC\",\n  Yacute: \"\\u00DD\",\n  THORN: \"\\u00DE\",\n  szlig: \"\\u00DF\",\n  agrave: \"\\u00E0\",\n  aacute: \"\\u00E1\",\n  acirc: \"\\u00E2\",\n  atilde: \"\\u00E3\",\n  auml: \"\\u00E4\",\n  aring: \"\\u00E5\",\n  aelig: \"\\u00E6\",\n  ccedil: \"\\u00E7\",\n  egrave: \"\\u00E8\",\n  eacute: \"\\u00E9\",\n  ecirc: \"\\u00EA\",\n  euml: \"\\u00EB\",\n  igrave: \"\\u00EC\",\n  iacute: \"\\u00ED\",\n  icirc: \"\\u00EE\",\n  iuml: \"\\u00EF\",\n  eth: \"\\u00F0\",\n  ntilde: \"\\u00F1\",\n  ograve: \"\\u00F2\",\n  oacute: \"\\u00F3\",\n  ocirc: \"\\u00F4\",\n  otilde: \"\\u00F5\",\n  ouml: \"\\u00F6\",\n  divide: \"\\u00F7\",\n  oslash: \"\\u00F8\",\n  ugrave: \"\\u00F9\",\n  uacute: \"\\u00FA\",\n  ucirc: \"\\u00FB\",\n  uuml: \"\\u00FC\",\n  yacute: \"\\u00FD\",\n  thorn: \"\\u00FE\",\n  yuml: \"\\u00FF\",\n  OElig: \"\\u0152\",\n  oelig: \"\\u0153\",\n  Scaron: \"\\u0160\",\n  scaron: \"\\u0161\",\n  Yuml: \"\\u0178\",\n  fnof: \"\\u0192\",\n  circ: \"\\u02C6\",\n  tilde: \"\\u02DC\",\n  Alpha: \"\\u0391\",\n  Beta: \"\\u0392\",\n  Gamma: \"\\u0393\",\n  Delta: \"\\u0394\",\n  Epsilon: \"\\u0395\",\n  Zeta: \"\\u0396\",\n  Eta: \"\\u0397\",\n  Theta: \"\\u0398\",\n  Iota: \"\\u0399\",\n  Kappa: \"\\u039A\",\n  Lambda: \"\\u039B\",\n  Mu: \"\\u039C\",\n  Nu: \"\\u039D\",\n  Xi: \"\\u039E\",\n  Omicron: \"\\u039F\",\n  Pi: \"\\u03A0\",\n  Rho: \"\\u03A1\",\n  Sigma: \"\\u03A3\",\n  Tau: \"\\u03A4\",\n  Upsilon: \"\\u03A5\",\n  Phi: \"\\u03A6\",\n  Chi: \"\\u03A7\",\n  Psi: \"\\u03A8\",\n  Omega: \"\\u03A9\",\n  alpha: \"\\u03B1\",\n  beta: \"\\u03B2\",\n  gamma: \"\\u03B3\",\n  delta: \"\\u03B4\",\n  epsilon: \"\\u03B5\",\n  zeta: \"\\u03B6\",\n  eta: \"\\u03B7\",\n  theta: \"\\u03B8\",\n  iota: \"\\u03B9\",\n  kappa: \"\\u03BA\",\n  lambda: \"\\u03BB\",\n  mu: \"\\u03BC\",\n  nu: \"\\u03BD\",\n  xi: \"\\u03BE\",\n  omicron: \"\\u03BF\",\n  pi: \"\\u03C0\",\n  rho: \"\\u03C1\",\n  sigmaf: \"\\u03C2\",\n  sigma: \"\\u03C3\",\n  tau: \"\\u03C4\",\n  upsilon: \"\\u03C5\",\n  phi: \"\\u03C6\",\n  chi: \"\\u03C7\",\n  psi: \"\\u03C8\",\n  omega: \"\\u03C9\",\n  thetasym: \"\\u03D1\",\n  upsih: \"\\u03D2\",\n  piv: \"\\u03D6\",\n  ensp: \"\\u2002\",\n  emsp: \"\\u2003\",\n  thinsp: \"\\u2009\",\n  zwnj: \"\\u200C\",\n  zwj: \"\\u200D\",\n  lrm: \"\\u200E\",\n  rlm: \"\\u200F\",\n  ndash: \"\\u2013\",\n  mdash: \"\\u2014\",\n  lsquo: \"\\u2018\",\n  rsquo: \"\\u2019\",\n  sbquo: \"\\u201A\",\n  ldquo: \"\\u201C\",\n  rdquo: \"\\u201D\",\n  bdquo: \"\\u201E\",\n  dagger: \"\\u2020\",\n  Dagger: \"\\u2021\",\n  bull: \"\\u2022\",\n  hellip: \"\\u2026\",\n  permil: \"\\u2030\",\n  prime: \"\\u2032\",\n  Prime: \"\\u2033\",\n  lsaquo: \"\\u2039\",\n  rsaquo: \"\\u203A\",\n  oline: \"\\u203E\",\n  frasl: \"\\u2044\",\n  euro: \"\\u20AC\",\n  image: \"\\u2111\",\n  weierp: \"\\u2118\",\n  real: \"\\u211C\",\n  trade: \"\\u2122\",\n  alefsym: \"\\u2135\",\n  larr: \"\\u2190\",\n  uarr: \"\\u2191\",\n  rarr: \"\\u2192\",\n  darr: \"\\u2193\",\n  harr: \"\\u2194\",\n  crarr: \"\\u21B5\",\n  lArr: \"\\u21D0\",\n  uArr: \"\\u21D1\",\n  rArr: \"\\u21D2\",\n  dArr: \"\\u21D3\",\n  hArr: \"\\u21D4\",\n  forall: \"\\u2200\",\n  part: \"\\u2202\",\n  exist: \"\\u2203\",\n  empty: \"\\u2205\",\n  nabla: \"\\u2207\",\n  isin: \"\\u2208\",\n  notin: \"\\u2209\",\n  ni: \"\\u220B\",\n  prod: \"\\u220F\",\n  sum: \"\\u2211\",\n  minus: \"\\u2212\",\n  lowast: \"\\u2217\",\n  radic: \"\\u221A\",\n  prop: \"\\u221D\",\n  infin: \"\\u221E\",\n  ang: \"\\u2220\",\n  and: \"\\u2227\",\n  or: \"\\u2228\",\n  cap: \"\\u2229\",\n  cup: \"\\u222A\",\n  int: \"\\u222B\",\n  there4: \"\\u2234\",\n  sim: \"\\u223C\",\n  cong: \"\\u2245\",\n  asymp: \"\\u2248\",\n  ne: \"\\u2260\",\n  equiv: \"\\u2261\",\n  le: \"\\u2264\",\n  ge: \"\\u2265\",\n  sub: \"\\u2282\",\n  sup: \"\\u2283\",\n  nsub: \"\\u2284\",\n  sube: \"\\u2286\",\n  supe: \"\\u2287\",\n  oplus: \"\\u2295\",\n  otimes: \"\\u2297\",\n  perp: \"\\u22A5\",\n  sdot: \"\\u22C5\",\n  lceil: \"\\u2308\",\n  rceil: \"\\u2309\",\n  lfloor: \"\\u230A\",\n  rfloor: \"\\u230B\",\n  lang: \"\\u2329\",\n  rang: \"\\u232A\",\n  loz: \"\\u25CA\",\n  spades: \"\\u2660\",\n  clubs: \"\\u2663\",\n  hearts: \"\\u2665\",\n  diams: \"\\u2666\",\n};\nexport default entities;\n","// @flow\n\nimport * as charCodes from \"charcodes\";\n\nimport XHTMLEntities from \"./xhtml\";\nimport type Parser from \"../../parser\";\nimport type { ExpressionErrors } from \"../../parser/util\";\nimport { TokenType, types as tt } from \"../../tokenizer/types\";\nimport { TokContext, types as tc } from \"../../tokenizer/context\";\nimport * as N from \"../../types\";\nimport { isIdentifierChar, isIdentifierStart } from \"../../util/identifier\";\nimport type { Position } from \"../../util/location\";\nimport { isNewLine } from \"../../util/whitespace\";\nimport { Errors } from \"../../parser/location\";\n\nconst HEX_NUMBER = /^[\\da-fA-F]+$/;\nconst DECIMAL_NUMBER = /^\\d+$/;\n\nconst JsxErrors = Object.freeze({\n  AttributeIsEmpty:\n    \"JSX attributes must only be assigned a non-empty expression\",\n  MissingClosingTagFragment: \"Expected corresponding JSX closing tag for <>\",\n  MissingClosingTagElement: \"Expected corresponding JSX closing tag for <%0>\",\n  UnsupportedJsxValue:\n    \"JSX value should be either an expression or a quoted JSX text\",\n  UnterminatedJsxContent: \"Unterminated JSX contents\",\n  UnwrappedAdjacentJSXElements:\n    \"Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>?\",\n});\n\n// Be aware that this file is always executed and not only when the plugin is enabled.\n// Therefore this contexts and tokens do always exist.\ntc.j_oTag = new TokContext(\"<tag\", false);\ntc.j_cTag = new TokContext(\"</tag\", false);\ntc.j_expr = new TokContext(\"<tag>...</tag>\", true, true);\n\ntt.jsxName = new TokenType(\"jsxName\");\ntt.jsxText = new TokenType(\"jsxText\", { beforeExpr: true });\ntt.jsxTagStart = new TokenType(\"jsxTagStart\", { startsExpr: true });\ntt.jsxTagEnd = new TokenType(\"jsxTagEnd\");\n\ntt.jsxTagStart.updateContext = function() {\n  this.state.context.push(tc.j_expr); // treat as beginning of JSX expression\n  this.state.context.push(tc.j_oTag); // start opening tag context\n  this.state.exprAllowed = false;\n};\n\ntt.jsxTagEnd.updateContext = function(prevType) {\n  const out = this.state.context.pop();\n  if ((out === tc.j_oTag && prevType === tt.slash) || out === tc.j_cTag) {\n    this.state.context.pop();\n    this.state.exprAllowed = this.curContext() === tc.j_expr;\n  } else {\n    this.state.exprAllowed = true;\n  }\n};\n\nfunction isFragment(object: ?N.JSXElement): boolean {\n  return object\n    ? object.type === \"JSXOpeningFragment\" ||\n        object.type === \"JSXClosingFragment\"\n    : false;\n}\n\n// Transforms JSX element name to string.\n\nfunction getQualifiedJSXName(\n  object: N.JSXIdentifier | N.JSXNamespacedName | N.JSXMemberExpression,\n): string {\n  if (object.type === \"JSXIdentifier\") {\n    return object.name;\n  }\n\n  if (object.type === \"JSXNamespacedName\") {\n    return object.namespace.name + \":\" + object.name.name;\n  }\n\n  if (object.type === \"JSXMemberExpression\") {\n    return (\n      getQualifiedJSXName(object.object) +\n      \".\" +\n      getQualifiedJSXName(object.property)\n    );\n  }\n\n  // istanbul ignore next\n  throw new Error(\"Node had unexpected type: \" + object.type);\n}\n\nexport default (superClass: Class<Parser>): Class<Parser> =>\n  class extends superClass {\n    // Reads inline JSX contents token.\n\n    jsxReadToken(): void {\n      let out = \"\";\n      let chunkStart = this.state.pos;\n      for (;;) {\n        if (this.state.pos >= this.length) {\n          throw this.raise(this.state.start, JsxErrors.UnterminatedJsxContent);\n        }\n\n        const ch = this.input.charCodeAt(this.state.pos);\n\n        switch (ch) {\n          case charCodes.lessThan:\n          case charCodes.leftCurlyBrace:\n            if (this.state.pos === this.state.start) {\n              if (ch === charCodes.lessThan && this.state.exprAllowed) {\n                ++this.state.pos;\n                return this.finishToken(tt.jsxTagStart);\n              }\n              return super.getTokenFromCode(ch);\n            }\n            out += this.input.slice(chunkStart, this.state.pos);\n            return this.finishToken(tt.jsxText, out);\n\n          case charCodes.ampersand:\n            out += this.input.slice(chunkStart, this.state.pos);\n            out += this.jsxReadEntity();\n            chunkStart = this.state.pos;\n            break;\n\n          default:\n            if (isNewLine(ch)) {\n              out += this.input.slice(chunkStart, this.state.pos);\n              out += this.jsxReadNewLine(true);\n              chunkStart = this.state.pos;\n            } else {\n              ++this.state.pos;\n            }\n        }\n      }\n    }\n\n    jsxReadNewLine(normalizeCRLF: boolean): string {\n      const ch = this.input.charCodeAt(this.state.pos);\n      let out;\n      ++this.state.pos;\n      if (\n        ch === charCodes.carriageReturn &&\n        this.input.charCodeAt(this.state.pos) === charCodes.lineFeed\n      ) {\n        ++this.state.pos;\n        out = normalizeCRLF ? \"\\n\" : \"\\r\\n\";\n      } else {\n        out = String.fromCharCode(ch);\n      }\n      ++this.state.curLine;\n      this.state.lineStart = this.state.pos;\n\n      return out;\n    }\n\n    jsxReadString(quote: number): void {\n      let out = \"\";\n      let chunkStart = ++this.state.pos;\n      for (;;) {\n        if (this.state.pos >= this.length) {\n          throw this.raise(this.state.start, Errors.UnterminatedString);\n        }\n\n        const ch = this.input.charCodeAt(this.state.pos);\n        if (ch === quote) break;\n        if (ch === charCodes.ampersand) {\n          out += this.input.slice(chunkStart, this.state.pos);\n          out += this.jsxReadEntity();\n          chunkStart = this.state.pos;\n        } else if (isNewLine(ch)) {\n          out += this.input.slice(chunkStart, this.state.pos);\n          out += this.jsxReadNewLine(false);\n          chunkStart = this.state.pos;\n        } else {\n          ++this.state.pos;\n        }\n      }\n      out += this.input.slice(chunkStart, this.state.pos++);\n      return this.finishToken(tt.string, out);\n    }\n\n    jsxReadEntity(): string {\n      let str = \"\";\n      let count = 0;\n      let entity;\n      let ch = this.input[this.state.pos];\n\n      const startPos = ++this.state.pos;\n      while (this.state.pos < this.length && count++ < 10) {\n        ch = this.input[this.state.pos++];\n        if (ch === \";\") {\n          if (str[0] === \"#\") {\n            if (str[1] === \"x\") {\n              str = str.substr(2);\n              if (HEX_NUMBER.test(str)) {\n                entity = String.fromCodePoint(parseInt(str, 16));\n              }\n            } else {\n              str = str.substr(1);\n              if (DECIMAL_NUMBER.test(str)) {\n                entity = String.fromCodePoint(parseInt(str, 10));\n              }\n            }\n          } else {\n            entity = XHTMLEntities[str];\n          }\n          break;\n        }\n        str += ch;\n      }\n      if (!entity) {\n        this.state.pos = startPos;\n        return \"&\";\n      }\n      return entity;\n    }\n\n    // Read a JSX identifier (valid tag or attribute name).\n    //\n    // Optimized version since JSX identifiers can\"t contain\n    // escape characters and so can be read as single slice.\n    // Also assumes that first character was already checked\n    // by isIdentifierStart in readToken.\n\n    jsxReadWord(): void {\n      let ch;\n      const start = this.state.pos;\n      do {\n        ch = this.input.charCodeAt(++this.state.pos);\n      } while (isIdentifierChar(ch) || ch === charCodes.dash);\n      return this.finishToken(\n        tt.jsxName,\n        this.input.slice(start, this.state.pos),\n      );\n    }\n\n    // Parse next token as JSX identifier\n\n    jsxParseIdentifier(): N.JSXIdentifier {\n      const node = this.startNode();\n      if (this.match(tt.jsxName)) {\n        node.name = this.state.value;\n      } else if (this.state.type.keyword) {\n        node.name = this.state.type.keyword;\n      } else {\n        this.unexpected();\n      }\n      this.next();\n      return this.finishNode(node, \"JSXIdentifier\");\n    }\n\n    // Parse namespaced identifier.\n\n    jsxParseNamespacedName(): N.JSXNamespacedName {\n      const startPos = this.state.start;\n      const startLoc = this.state.startLoc;\n      const name = this.jsxParseIdentifier();\n      if (!this.eat(tt.colon)) return name;\n\n      const node = this.startNodeAt(startPos, startLoc);\n      node.namespace = name;\n      node.name = this.jsxParseIdentifier();\n      return this.finishNode(node, \"JSXNamespacedName\");\n    }\n\n    // Parses element name in any form - namespaced, member\n    // or single identifier.\n\n    jsxParseElementName():\n      | N.JSXIdentifier\n      | N.JSXNamespacedName\n      | N.JSXMemberExpression {\n      const startPos = this.state.start;\n      const startLoc = this.state.startLoc;\n      let node = this.jsxParseNamespacedName();\n      if (node.type === \"JSXNamespacedName\") {\n        return node;\n      }\n      while (this.eat(tt.dot)) {\n        const newNode = this.startNodeAt(startPos, startLoc);\n        newNode.object = node;\n        newNode.property = this.jsxParseIdentifier();\n        node = this.finishNode(newNode, \"JSXMemberExpression\");\n      }\n      return node;\n    }\n\n    // Parses any type of JSX attribute value.\n\n    jsxParseAttributeValue(): N.Expression {\n      let node;\n      switch (this.state.type) {\n        case tt.braceL:\n          node = this.startNode();\n          this.next();\n          node = this.jsxParseExpressionContainer(node);\n          if (node.expression.type === \"JSXEmptyExpression\") {\n            this.raise(node.start, JsxErrors.AttributeIsEmpty);\n          }\n          return node;\n\n        case tt.jsxTagStart:\n        case tt.string:\n          return this.parseExprAtom();\n\n        default:\n          throw this.raise(this.state.start, JsxErrors.UnsupportedJsxValue);\n      }\n    }\n\n    // JSXEmptyExpression is unique type since it doesn't actually parse anything,\n    // and so it should start at the end of last read token (left brace) and finish\n    // at the beginning of the next one (right brace).\n\n    jsxParseEmptyExpression(): N.JSXEmptyExpression {\n      const node = this.startNodeAt(\n        this.state.lastTokEnd,\n        this.state.lastTokEndLoc,\n      );\n      return this.finishNodeAt(\n        node,\n        \"JSXEmptyExpression\",\n        this.state.start,\n        this.state.startLoc,\n      );\n    }\n\n    // Parse JSX spread child\n\n    jsxParseSpreadChild(node: N.JSXSpreadChild): N.JSXSpreadChild {\n      this.next(); // ellipsis\n      node.expression = this.parseExpression();\n      this.expect(tt.braceR);\n\n      return this.finishNode(node, \"JSXSpreadChild\");\n    }\n\n    // Parses JSX expression enclosed into curly brackets.\n\n    jsxParseExpressionContainer(\n      node: N.JSXExpressionContainer,\n    ): N.JSXExpressionContainer {\n      if (this.match(tt.braceR)) {\n        node.expression = this.jsxParseEmptyExpression();\n      } else {\n        node.expression = this.parseExpression();\n      }\n      this.expect(tt.braceR);\n      return this.finishNode(node, \"JSXExpressionContainer\");\n    }\n\n    // Parses following JSX attribute name-value pair.\n\n    jsxParseAttribute(): N.JSXAttribute {\n      const node = this.startNode();\n      if (this.eat(tt.braceL)) {\n        this.expect(tt.ellipsis);\n        node.argument = this.parseMaybeAssign();\n        this.expect(tt.braceR);\n        return this.finishNode(node, \"JSXSpreadAttribute\");\n      }\n      node.name = this.jsxParseNamespacedName();\n      node.value = this.eat(tt.eq) ? this.jsxParseAttributeValue() : null;\n      return this.finishNode(node, \"JSXAttribute\");\n    }\n\n    // Parses JSX opening tag starting after \"<\".\n\n    jsxParseOpeningElementAt(\n      startPos: number,\n      startLoc: Position,\n    ): N.JSXOpeningElement {\n      const node = this.startNodeAt(startPos, startLoc);\n      if (this.match(tt.jsxTagEnd)) {\n        this.expect(tt.jsxTagEnd);\n        return this.finishNode(node, \"JSXOpeningFragment\");\n      }\n      node.name = this.jsxParseElementName();\n      return this.jsxParseOpeningElementAfterName(node);\n    }\n\n    jsxParseOpeningElementAfterName(\n      node: N.JSXOpeningElement,\n    ): N.JSXOpeningElement {\n      const attributes: N.JSXAttribute[] = [];\n      while (!this.match(tt.slash) && !this.match(tt.jsxTagEnd)) {\n        attributes.push(this.jsxParseAttribute());\n      }\n      node.attributes = attributes;\n      node.selfClosing = this.eat(tt.slash);\n      this.expect(tt.jsxTagEnd);\n      return this.finishNode(node, \"JSXOpeningElement\");\n    }\n\n    // Parses JSX closing tag starting after \"</\".\n\n    jsxParseClosingElementAt(\n      startPos: number,\n      startLoc: Position,\n    ): N.JSXClosingElement {\n      const node = this.startNodeAt(startPos, startLoc);\n      if (this.match(tt.jsxTagEnd)) {\n        this.expect(tt.jsxTagEnd);\n        return this.finishNode(node, \"JSXClosingFragment\");\n      }\n      node.name = this.jsxParseElementName();\n      this.expect(tt.jsxTagEnd);\n      return this.finishNode(node, \"JSXClosingElement\");\n    }\n\n    // Parses entire JSX element, including it\"s opening tag\n    // (starting after \"<\"), attributes, contents and closing tag.\n\n    jsxParseElementAt(startPos: number, startLoc: Position): N.JSXElement {\n      const node = this.startNodeAt(startPos, startLoc);\n      const children = [];\n      const openingElement = this.jsxParseOpeningElementAt(startPos, startLoc);\n      let closingElement = null;\n\n      if (!openingElement.selfClosing) {\n        contents: for (;;) {\n          switch (this.state.type) {\n            case tt.jsxTagStart:\n              startPos = this.state.start;\n              startLoc = this.state.startLoc;\n              this.next();\n              if (this.eat(tt.slash)) {\n                closingElement = this.jsxParseClosingElementAt(\n                  startPos,\n                  startLoc,\n                );\n                break contents;\n              }\n              children.push(this.jsxParseElementAt(startPos, startLoc));\n              break;\n\n            case tt.jsxText:\n              children.push(this.parseExprAtom());\n              break;\n\n            case tt.braceL: {\n              const node = this.startNode();\n              this.next();\n              if (this.match(tt.ellipsis)) {\n                children.push(this.jsxParseSpreadChild(node));\n              } else {\n                children.push(this.jsxParseExpressionContainer(node));\n              }\n\n              break;\n            }\n            // istanbul ignore next - should never happen\n            default:\n              throw this.unexpected();\n          }\n        }\n\n        if (isFragment(openingElement) && !isFragment(closingElement)) {\n          this.raise(\n            // $FlowIgnore\n            closingElement.start,\n            JsxErrors.MissingClosingTagFragment,\n          );\n        } else if (!isFragment(openingElement) && isFragment(closingElement)) {\n          this.raise(\n            // $FlowIgnore\n            closingElement.start,\n            JsxErrors.MissingClosingTagElement,\n            getQualifiedJSXName(openingElement.name),\n          );\n        } else if (!isFragment(openingElement) && !isFragment(closingElement)) {\n          if (\n            // $FlowIgnore\n            getQualifiedJSXName(closingElement.name) !==\n            getQualifiedJSXName(openingElement.name)\n          ) {\n            this.raise(\n              // $FlowIgnore\n              closingElement.start,\n              JsxErrors.MissingClosingTagElement,\n              getQualifiedJSXName(openingElement.name),\n            );\n          }\n        }\n      }\n\n      if (isFragment(openingElement)) {\n        node.openingFragment = openingElement;\n        node.closingFragment = closingElement;\n      } else {\n        node.openingElement = openingElement;\n        node.closingElement = closingElement;\n      }\n      node.children = children;\n      if (this.isRelational(\"<\")) {\n        throw this.raise(\n          this.state.start,\n          JsxErrors.UnwrappedAdjacentJSXElements,\n        );\n      }\n\n      return isFragment(openingElement)\n        ? this.finishNode(node, \"JSXFragment\")\n        : this.finishNode(node, \"JSXElement\");\n    }\n\n    // Parses entire JSX element from current position.\n\n    jsxParseElement(): N.JSXElement {\n      const startPos = this.state.start;\n      const startLoc = this.state.startLoc;\n      this.next();\n      return this.jsxParseElementAt(startPos, startLoc);\n    }\n\n    // ==================================\n    // Overrides\n    // ==================================\n\n    parseExprAtom(refExpressionErrors: ?ExpressionErrors): N.Expression {\n      if (this.match(tt.jsxText)) {\n        return this.parseLiteral(this.state.value, \"JSXText\");\n      } else if (this.match(tt.jsxTagStart)) {\n        return this.jsxParseElement();\n      } else if (\n        this.isRelational(\"<\") &&\n        this.input.charCodeAt(this.state.pos) !== charCodes.exclamationMark\n      ) {\n        // In case we encounter an lt token here it will always be the start of\n        // jsx as the lt sign is not allowed in places that expect an expression\n        this.finishToken(tt.jsxTagStart);\n        return this.jsxParseElement();\n      } else {\n        return super.parseExprAtom(refExpressionErrors);\n      }\n    }\n\n    getTokenFromCode(code: number): void {\n      if (this.state.inPropertyName) return super.getTokenFromCode(code);\n\n      const context = this.curContext();\n\n      if (context === tc.j_expr) {\n        return this.jsxReadToken();\n      }\n\n      if (context === tc.j_oTag || context === tc.j_cTag) {\n        if (isIdentifierStart(code)) {\n          return this.jsxReadWord();\n        }\n\n        if (code === charCodes.greaterThan) {\n          ++this.state.pos;\n          return this.finishToken(tt.jsxTagEnd);\n        }\n\n        if (\n          (code === charCodes.quotationMark || code === charCodes.apostrophe) &&\n          context === tc.j_oTag\n        ) {\n          return this.jsxReadString(code);\n        }\n      }\n\n      if (\n        code === charCodes.lessThan &&\n        this.state.exprAllowed &&\n        this.input.charCodeAt(this.state.pos + 1) !== charCodes.exclamationMark\n      ) {\n        ++this.state.pos;\n        return this.finishToken(tt.jsxTagStart);\n      }\n\n      return super.getTokenFromCode(code);\n    }\n\n    updateContext(prevType: TokenType): void {\n      if (this.match(tt.braceL)) {\n        const curContext = this.curContext();\n        if (curContext === tc.j_oTag) {\n          this.state.context.push(tc.braceExpression);\n        } else if (curContext === tc.j_expr) {\n          this.state.context.push(tc.templateQuasi);\n        } else {\n          super.updateContext(prevType);\n        }\n        this.state.exprAllowed = true;\n      } else if (this.match(tt.slash) && prevType === tt.jsxTagStart) {\n        this.state.context.length -= 2; // do not consider JSX expr -> JSX open tag -> ... anymore\n        this.state.context.push(tc.j_cTag); // reconsider as closing tag context\n        this.state.exprAllowed = false;\n      } else {\n        return super.updateContext(prevType);\n      }\n    }\n  };\n","// @flow\nimport {\n  SCOPE_ARROW,\n  SCOPE_DIRECT_SUPER,\n  SCOPE_FUNCTION,\n  SCOPE_SIMPLE_CATCH,\n  SCOPE_SUPER,\n  SCOPE_PROGRAM,\n  SCOPE_VAR,\n  SCOPE_CLASS,\n  BIND_SCOPE_FUNCTION,\n  BIND_SCOPE_VAR,\n  BIND_SCOPE_LEXICAL,\n  BIND_KIND_VALUE,\n  type ScopeFlags,\n  type BindingTypes,\n} from \"./scopeflags\";\nimport * as N from \"../types\";\nimport { Errors } from \"../parser/location\";\n\n// Start an AST node, attaching a start offset.\nexport class Scope {\n  flags: ScopeFlags;\n  // A list of var-declared names in the current lexical scope\n  var: string[] = [];\n  // A list of lexically-declared names in the current lexical scope\n  lexical: string[] = [];\n  // A list of lexically-declared FunctionDeclaration names in the current lexical scope\n  functions: string[] = [];\n\n  constructor(flags: ScopeFlags) {\n    this.flags = flags;\n  }\n}\n\ntype raiseFunction = (number, string, ...any) => void;\n\n// The functions in this module keep track of declared variables in the\n// current scope in order to detect duplicate variable names.\nexport default class ScopeHandler<IScope: Scope = Scope> {\n  scopeStack: Array<IScope> = [];\n  raise: raiseFunction;\n  inModule: boolean;\n  undefinedExports: Map<string, number> = new Map();\n  undefinedPrivateNames: Map<string, number> = new Map();\n\n  constructor(raise: raiseFunction, inModule: boolean) {\n    this.raise = raise;\n    this.inModule = inModule;\n  }\n\n  get inFunction() {\n    return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0;\n  }\n  get allowSuper() {\n    return (this.currentThisScope().flags & SCOPE_SUPER) > 0;\n  }\n  get allowDirectSuper() {\n    return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0;\n  }\n  get inClass() {\n    return (this.currentThisScope().flags & SCOPE_CLASS) > 0;\n  }\n  get inNonArrowFunction() {\n    return (this.currentThisScope().flags & SCOPE_FUNCTION) > 0;\n  }\n  get treatFunctionsAsVar() {\n    return this.treatFunctionsAsVarInScope(this.currentScope());\n  }\n\n  createScope(flags: ScopeFlags): Scope {\n    return new Scope(flags);\n  }\n  // This method will be overwritten by subclasses\n  /*:: +createScope: (flags: ScopeFlags) => IScope; */\n\n  enter(flags: ScopeFlags) {\n    this.scopeStack.push(this.createScope(flags));\n  }\n\n  exit() {\n    this.scopeStack.pop();\n  }\n\n  // The spec says:\n  // > At the top level of a function, or script, function declarations are\n  // > treated like var declarations rather than like lexical declarations.\n  treatFunctionsAsVarInScope(scope: IScope): boolean {\n    return !!(\n      scope.flags & SCOPE_FUNCTION ||\n      (!this.inModule && scope.flags & SCOPE_PROGRAM)\n    );\n  }\n\n  declareName(name: string, bindingType: BindingTypes, pos: number) {\n    let scope = this.currentScope();\n    if (bindingType & BIND_SCOPE_LEXICAL || bindingType & BIND_SCOPE_FUNCTION) {\n      this.checkRedeclarationInScope(scope, name, bindingType, pos);\n\n      if (bindingType & BIND_SCOPE_FUNCTION) {\n        scope.functions.push(name);\n      } else {\n        scope.lexical.push(name);\n      }\n\n      if (bindingType & BIND_SCOPE_LEXICAL) {\n        this.maybeExportDefined(scope, name);\n      }\n    } else if (bindingType & BIND_SCOPE_VAR) {\n      for (let i = this.scopeStack.length - 1; i >= 0; --i) {\n        scope = this.scopeStack[i];\n        this.checkRedeclarationInScope(scope, name, bindingType, pos);\n        scope.var.push(name);\n        this.maybeExportDefined(scope, name);\n\n        if (scope.flags & SCOPE_VAR) break;\n      }\n    }\n    if (this.inModule && scope.flags & SCOPE_PROGRAM) {\n      this.undefinedExports.delete(name);\n    }\n  }\n\n  maybeExportDefined(scope: IScope, name: string) {\n    if (this.inModule && scope.flags & SCOPE_PROGRAM) {\n      this.undefinedExports.delete(name);\n    }\n  }\n\n  checkRedeclarationInScope(\n    scope: IScope,\n    name: string,\n    bindingType: BindingTypes,\n    pos: number,\n  ) {\n    if (this.isRedeclaredInScope(scope, name, bindingType)) {\n      this.raise(pos, Errors.VarRedeclaration, name);\n    }\n  }\n\n  isRedeclaredInScope(\n    scope: IScope,\n    name: string,\n    bindingType: BindingTypes,\n  ): boolean {\n    if (!(bindingType & BIND_KIND_VALUE)) return false;\n\n    if (bindingType & BIND_SCOPE_LEXICAL) {\n      return (\n        scope.lexical.indexOf(name) > -1 ||\n        scope.functions.indexOf(name) > -1 ||\n        scope.var.indexOf(name) > -1\n      );\n    }\n\n    if (bindingType & BIND_SCOPE_FUNCTION) {\n      return (\n        scope.lexical.indexOf(name) > -1 ||\n        (!this.treatFunctionsAsVarInScope(scope) &&\n          scope.var.indexOf(name) > -1)\n      );\n    }\n\n    return (\n      (scope.lexical.indexOf(name) > -1 &&\n        !(scope.flags & SCOPE_SIMPLE_CATCH && scope.lexical[0] === name)) ||\n      (!this.treatFunctionsAsVarInScope(scope) &&\n        scope.functions.indexOf(name) > -1)\n    );\n  }\n\n  checkLocalExport(id: N.Identifier) {\n    if (\n      this.scopeStack[0].lexical.indexOf(id.name) === -1 &&\n      this.scopeStack[0].var.indexOf(id.name) === -1 &&\n      // In strict mode, scope.functions will always be empty.\n      // Modules are strict by default, but the `scriptMode` option\n      // can overwrite this behavior.\n      this.scopeStack[0].functions.indexOf(id.name) === -1\n    ) {\n      this.undefinedExports.set(id.name, id.start);\n    }\n  }\n\n  currentScope(): IScope {\n    return this.scopeStack[this.scopeStack.length - 1];\n  }\n\n  // $FlowIgnore\n  currentVarScope(): IScope {\n    for (let i = this.scopeStack.length - 1; ; i--) {\n      const scope = this.scopeStack[i];\n      if (scope.flags & SCOPE_VAR) {\n        return scope;\n      }\n    }\n  }\n\n  // Could be useful for `arguments`, `this`, `new.target`, `super()`, `super.property`, and `super[property]`.\n  // $FlowIgnore\n  currentThisScope(): IScope {\n    for (let i = this.scopeStack.length - 1; ; i--) {\n      const scope = this.scopeStack[i];\n      if (\n        (scope.flags & SCOPE_VAR || scope.flags & SCOPE_CLASS) &&\n        !(scope.flags & SCOPE_ARROW)\n      ) {\n        return scope;\n      }\n    }\n  }\n}\n","// @flow\n\nimport ScopeHandler, { Scope } from \"../../util/scope\";\nimport {\n  BIND_KIND_TYPE,\n  BIND_FLAGS_TS_ENUM,\n  BIND_FLAGS_TS_CONST_ENUM,\n  BIND_FLAGS_TS_EXPORT_ONLY,\n  BIND_KIND_VALUE,\n  BIND_FLAGS_CLASS,\n  type ScopeFlags,\n  type BindingTypes,\n} from \"../../util/scopeflags\";\nimport * as N from \"../../types\";\n\nclass TypeScriptScope extends Scope {\n  types: string[] = [];\n\n  // enums (which are also in .types)\n  enums: string[] = [];\n\n  // const enums (which are also in .enums and .types)\n  constEnums: string[] = [];\n\n  // classes (which are also in .lexical) and interface (which are also in .types)\n  classes: string[] = [];\n\n  // namespaces and ambient functions (or classes) are too difficult to track,\n  // especially without type analysis.\n  // We need to track them anyway, to avoid \"X is not defined\" errors\n  // when exporting them.\n  exportOnlyBindings: string[] = [];\n}\n\n// See https://github.com/babel/babel/pull/9766#discussion_r268920730 for an\n// explanation of how typescript handles scope.\n\nexport default class TypeScriptScopeHandler extends ScopeHandler<TypeScriptScope> {\n  createScope(flags: ScopeFlags): TypeScriptScope {\n    return new TypeScriptScope(flags);\n  }\n\n  declareName(name: string, bindingType: BindingTypes, pos: number) {\n    const scope = this.currentScope();\n    if (bindingType & BIND_FLAGS_TS_EXPORT_ONLY) {\n      this.maybeExportDefined(scope, name);\n      scope.exportOnlyBindings.push(name);\n      return;\n    }\n\n    super.declareName(...arguments);\n\n    if (bindingType & BIND_KIND_TYPE) {\n      if (!(bindingType & BIND_KIND_VALUE)) {\n        // \"Value\" bindings have already been registered by the superclass.\n        this.checkRedeclarationInScope(scope, name, bindingType, pos);\n        this.maybeExportDefined(scope, name);\n      }\n      scope.types.push(name);\n    }\n    if (bindingType & BIND_FLAGS_TS_ENUM) scope.enums.push(name);\n    if (bindingType & BIND_FLAGS_TS_CONST_ENUM) scope.constEnums.push(name);\n    if (bindingType & BIND_FLAGS_CLASS) scope.classes.push(name);\n  }\n\n  isRedeclaredInScope(\n    scope: TypeScriptScope,\n    name: string,\n    bindingType: BindingTypes,\n  ): boolean {\n    if (scope.enums.indexOf(name) > -1) {\n      if (bindingType & BIND_FLAGS_TS_ENUM) {\n        // Enums can be merged with other enums if they are both\n        //  const or both non-const.\n        const isConst = !!(bindingType & BIND_FLAGS_TS_CONST_ENUM);\n        const wasConst = scope.constEnums.indexOf(name) > -1;\n        return isConst !== wasConst;\n      }\n      return true;\n    }\n    if (bindingType & BIND_FLAGS_CLASS && scope.classes.indexOf(name) > -1) {\n      if (scope.lexical.indexOf(name) > -1) {\n        // Classes can be merged with interfaces\n        return !!(bindingType & BIND_KIND_VALUE);\n      } else {\n        // Interface can be merged with other classes or interfaces\n        return false;\n      }\n    }\n    if (bindingType & BIND_KIND_TYPE && scope.types.indexOf(name) > -1) {\n      return true;\n    }\n\n    return super.isRedeclaredInScope(...arguments);\n  }\n\n  checkLocalExport(id: N.Identifier) {\n    if (\n      this.scopeStack[0].types.indexOf(id.name) === -1 &&\n      this.scopeStack[0].exportOnlyBindings.indexOf(id.name) === -1\n    ) {\n      super.checkLocalExport(id);\n    }\n  }\n}\n","// @flow\nexport const PARAM = 0b000, // Initial Parameter flags\n  PARAM_YIELD = 0b001, // track [Yield] production parameter\n  PARAM_AWAIT = 0b010, // track [Await] production parameter\n  PARAM_RETURN = 0b100; // track [Return] production parameter\n\n// ProductionParameterHandler is a stack fashioned production parameter tracker\n// https://tc39.es/ecma262/#sec-grammar-notation\n// The tracked parameters are defined above. Note that the [In] parameter is\n// tracked in `noIn` argument of `parseExpression`.\n//\n// Whenever [+Await]/[+Yield] appears in the right-hand sides of a production,\n// we must enter a new tracking stack. For example when parsing\n//\n// AsyncFunctionDeclaration [Yield, Await]:\n//   async [no LineTerminator here] function BindingIdentifier[?Yield, ?Await]\n//     ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody }\n//\n// we must follow such process:\n//\n// 1. parse async keyword\n// 2. parse function keyword\n// 3. parse bindingIdentifier <= inherit current parameters: [?Await]\n// 4. enter new stack with (PARAM_AWAIT)\n// 5. parse formal parameters <= must have [Await] parameter [+Await]\n// 6. parse function body\n// 7. exit current stack\n\nexport type ParamKind = typeof PARAM | typeof PARAM_AWAIT | typeof PARAM_YIELD;\n\nexport default class ProductionParameterHandler {\n  stacks: Array<ParamKind> = [];\n  enter(flags: ParamKind) {\n    this.stacks.push(flags);\n  }\n\n  exit() {\n    this.stacks.pop();\n  }\n\n  currentFlags(): ParamKind {\n    return this.stacks[this.stacks.length - 1];\n  }\n\n  get hasAwait(): boolean {\n    return (this.currentFlags() & PARAM_AWAIT) > 0;\n  }\n\n  get hasYield(): boolean {\n    return (this.currentFlags() & PARAM_YIELD) > 0;\n  }\n\n  get hasReturn(): boolean {\n    return (this.currentFlags() & PARAM_RETURN) > 0;\n  }\n}\n\nexport function functionFlags(\n  isAsync: boolean,\n  isGenerator: boolean,\n): ParamKind {\n  return (isAsync ? PARAM_AWAIT : 0) | (isGenerator ? PARAM_YIELD : 0);\n}\n","// @flow\n\n/*:: declare var invariant; */\n\nimport type { TokenType } from \"../../tokenizer/types\";\nimport type State from \"../../tokenizer/state\";\nimport { types as tt } from \"../../tokenizer/types\";\nimport { types as ct } from \"../../tokenizer/context\";\nimport * as N from \"../../types\";\nimport type { Pos, Position } from \"../../util/location\";\nimport type Parser from \"../../parser\";\nimport {\n  type BindingTypes,\n  BIND_NONE,\n  SCOPE_TS_MODULE,\n  SCOPE_OTHER,\n  BIND_TS_ENUM,\n  BIND_TS_CONST_ENUM,\n  BIND_TS_TYPE,\n  BIND_TS_INTERFACE,\n  BIND_TS_AMBIENT,\n  BIND_TS_NAMESPACE,\n  BIND_CLASS,\n  BIND_LEXICAL,\n} from \"../../util/scopeflags\";\nimport TypeScriptScopeHandler from \"./scope\";\nimport * as charCodes from \"charcodes\";\nimport type { ExpressionErrors } from \"../../parser/util\";\nimport { PARAM } from \"../../util/production-parameter\";\nimport { Errors } from \"../../parser/location\";\n\ntype TsModifier =\n  | \"readonly\"\n  | \"abstract\"\n  | \"declare\"\n  | \"static\"\n  | \"public\"\n  | \"private\"\n  | \"protected\";\n\nfunction nonNull<T>(x: ?T): T {\n  if (x == null) {\n    // $FlowIgnore\n    throw new Error(`Unexpected ${x} value.`);\n  }\n  return x;\n}\n\nfunction assert(x: boolean): void {\n  if (!x) {\n    throw new Error(\"Assert fail\");\n  }\n}\n\ntype ParsingContext =\n  | \"EnumMembers\"\n  | \"HeritageClauseElement\"\n  | \"TupleElementTypes\"\n  | \"TypeMembers\"\n  | \"TypeParametersOrArguments\";\n\nconst TSErrors = Object.freeze({\n  ClassMethodHasDeclare: \"Class methods cannot have the 'declare' modifier\",\n  ClassMethodHasReadonly: \"Class methods cannot have the 'readonly' modifier\",\n  DeclareClassFieldHasInitializer:\n    \"'declare' class fields cannot have an initializer\",\n  DuplicateModifier: \"Duplicate modifier: '%0'\",\n  EmptyHeritageClauseType: \"'%0' list cannot be empty.\",\n  IndexSignatureHasAbstract:\n    \"Index signatures cannot have the 'abstract' modifier\",\n  IndexSignatureHasAccessibility:\n    \"Index signatures cannot have an accessibility modifier ('%0')\",\n  IndexSignatureHasStatic: \"Index signatures cannot have the 'static' modifier\",\n  OptionalTypeBeforeRequired:\n    \"A required element cannot follow an optional element.\",\n  PatternIsOptional:\n    \"A binding pattern parameter cannot be optional in an implementation signature.\",\n  PrivateElementHasAbstract:\n    \"Private elements cannot have the 'abstract' modifier.\",\n  PrivateElementHasAccessibility:\n    \"Private elements cannot have an accessibility modifier ('%0')\",\n  TemplateTypeHasSubstitution:\n    \"Template literal types cannot have any substitution\",\n  TypeAnnotationAfterAssign:\n    \"Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`\",\n  UnexpectedReadonly:\n    \"'readonly' type modifier is only permitted on array and tuple literal types.\",\n  UnexpectedTypeAnnotation: \"Did not expect a type annotation here.\",\n  UnexpectedTypeCastInParameter: \"Unexpected type cast in parameter position.\",\n  UnsupportedImportTypeArgument:\n    \"Argument in a type import must be a string literal\",\n  UnsupportedParameterPropertyKind:\n    \"A parameter property may not be declared using a binding pattern.\",\n  UnsupportedSignatureParameterKind:\n    \"Name in a signature must be an Identifier, ObjectPattern or ArrayPattern, instead got %0\",\n});\n\n// Doesn't handle \"void\" or \"null\" because those are keywords, not identifiers.\nfunction keywordTypeFromName(\n  value: string,\n): N.TsKeywordTypeType | typeof undefined {\n  switch (value) {\n    case \"any\":\n      return \"TSAnyKeyword\";\n    case \"boolean\":\n      return \"TSBooleanKeyword\";\n    case \"bigint\":\n      return \"TSBigIntKeyword\";\n    case \"never\":\n      return \"TSNeverKeyword\";\n    case \"number\":\n      return \"TSNumberKeyword\";\n    case \"object\":\n      return \"TSObjectKeyword\";\n    case \"string\":\n      return \"TSStringKeyword\";\n    case \"symbol\":\n      return \"TSSymbolKeyword\";\n    case \"undefined\":\n      return \"TSUndefinedKeyword\";\n    case \"unknown\":\n      return \"TSUnknownKeyword\";\n    default:\n      return undefined;\n  }\n}\n\nexport default (superClass: Class<Parser>): Class<Parser> =>\n  class extends superClass {\n    getScopeHandler(): Class<TypeScriptScopeHandler> {\n      return TypeScriptScopeHandler;\n    }\n\n    tsIsIdentifier(): boolean {\n      // TODO: actually a bit more complex in TypeScript, but shouldn't matter.\n      // See https://github.com/Microsoft/TypeScript/issues/15008\n      return this.match(tt.name);\n    }\n\n    tsNextTokenCanFollowModifier() {\n      // Note: TypeScript's implementation is much more complicated because\n      // more things are considered modifiers there.\n      // This implementation only handles modifiers not handled by @babel/parser itself. And \"static\".\n      // TODO: Would be nice to avoid lookahead. Want a hasLineBreakUpNext() method...\n      this.next();\n      return (\n        !this.hasPrecedingLineBreak() &&\n        !this.match(tt.parenL) &&\n        !this.match(tt.parenR) &&\n        !this.match(tt.colon) &&\n        !this.match(tt.eq) &&\n        !this.match(tt.question) &&\n        !this.match(tt.bang)\n      );\n    }\n\n    /** Parses a modifier matching one the given modifier names. */\n    tsParseModifier<T: TsModifier>(allowedModifiers: T[]): ?T {\n      if (!this.match(tt.name)) {\n        return undefined;\n      }\n\n      const modifier = this.state.value;\n      if (\n        allowedModifiers.indexOf(modifier) !== -1 &&\n        this.tsTryParse(this.tsNextTokenCanFollowModifier.bind(this))\n      ) {\n        return modifier;\n      }\n      return undefined;\n    }\n\n    /** Parses a list of modifiers, in any order.\n     *  If you need a specific order, you must call this function multiple times:\n     *    this.tsParseModifiers(node, [\"public\"]);\n     *    this.tsParseModifiers(node, [\"abstract\", \"readonly\"]);\n     */\n    tsParseModifiers<T: TsModifier>(\n      modified: { [key: TsModifier]: ?true },\n      allowedModifiers: T[],\n    ): void {\n      for (;;) {\n        const startPos = this.state.start;\n        const modifier: ?T = this.tsParseModifier(allowedModifiers);\n\n        if (!modifier) break;\n\n        if (Object.hasOwnProperty.call(modified, modifier)) {\n          this.raise(startPos, TSErrors.DuplicateModifier, modifier);\n        }\n        modified[modifier] = true;\n      }\n    }\n\n    tsIsListTerminator(kind: ParsingContext): boolean {\n      switch (kind) {\n        case \"EnumMembers\":\n        case \"TypeMembers\":\n          return this.match(tt.braceR);\n        case \"HeritageClauseElement\":\n          return this.match(tt.braceL);\n        case \"TupleElementTypes\":\n          return this.match(tt.bracketR);\n        case \"TypeParametersOrArguments\":\n          return this.isRelational(\">\");\n      }\n\n      throw new Error(\"Unreachable\");\n    }\n\n    tsParseList<T: N.Node>(kind: ParsingContext, parseElement: () => T): T[] {\n      const result: T[] = [];\n      while (!this.tsIsListTerminator(kind)) {\n        // Skipping \"parseListElement\" from the TS source since that's just for error handling.\n        result.push(parseElement());\n      }\n      return result;\n    }\n\n    tsParseDelimitedList<T: N.Node>(\n      kind: ParsingContext,\n      parseElement: () => T,\n    ): T[] {\n      return nonNull(\n        this.tsParseDelimitedListWorker(\n          kind,\n          parseElement,\n          /* expectSuccess */ true,\n        ),\n      );\n    }\n\n    /**\n     * If !expectSuccess, returns undefined instead of failing to parse.\n     * If expectSuccess, parseElement should always return a defined value.\n     */\n    tsParseDelimitedListWorker<T: N.Node>(\n      kind: ParsingContext,\n      parseElement: () => ?T,\n      expectSuccess: boolean,\n    ): ?(T[]) {\n      const result = [];\n\n      for (;;) {\n        if (this.tsIsListTerminator(kind)) {\n          break;\n        }\n\n        const element = parseElement();\n        if (element == null) {\n          return undefined;\n        }\n        result.push(element);\n\n        if (this.eat(tt.comma)) {\n          continue;\n        }\n\n        if (this.tsIsListTerminator(kind)) {\n          break;\n        }\n\n        if (expectSuccess) {\n          // This will fail with an error about a missing comma\n          this.expect(tt.comma);\n        }\n        return undefined;\n      }\n\n      return result;\n    }\n\n    tsParseBracketedList<T: N.Node>(\n      kind: ParsingContext,\n      parseElement: () => T,\n      bracket: boolean,\n      skipFirstToken: boolean,\n    ): T[] {\n      if (!skipFirstToken) {\n        if (bracket) {\n          this.expect(tt.bracketL);\n        } else {\n          this.expectRelational(\"<\");\n        }\n      }\n\n      const result = this.tsParseDelimitedList(kind, parseElement);\n\n      if (bracket) {\n        this.expect(tt.bracketR);\n      } else {\n        this.expectRelational(\">\");\n      }\n\n      return result;\n    }\n\n    tsParseImportType(): N.TsImportType {\n      const node: N.TsImportType = this.startNode();\n      this.expect(tt._import);\n      this.expect(tt.parenL);\n      if (!this.match(tt.string)) {\n        this.raise(this.state.start, TSErrors.UnsupportedImportTypeArgument);\n      }\n\n      // For compatibility to estree we cannot call parseLiteral directly here\n      node.argument = this.parseExprAtom();\n      this.expect(tt.parenR);\n\n      if (this.eat(tt.dot)) {\n        node.qualifier = this.tsParseEntityName(/* allowReservedWords */ true);\n      }\n      if (this.isRelational(\"<\")) {\n        node.typeParameters = this.tsParseTypeArguments();\n      }\n      return this.finishNode(node, \"TSImportType\");\n    }\n\n    tsParseEntityName(allowReservedWords: boolean): N.TsEntityName {\n      let entity: N.TsEntityName = this.parseIdentifier();\n      while (this.eat(tt.dot)) {\n        const node: N.TsQualifiedName = this.startNodeAtNode(entity);\n        node.left = entity;\n        node.right = this.parseIdentifier(allowReservedWords);\n        entity = this.finishNode(node, \"TSQualifiedName\");\n      }\n      return entity;\n    }\n\n    tsParseTypeReference(): N.TsTypeReference {\n      const node: N.TsTypeReference = this.startNode();\n      node.typeName = this.tsParseEntityName(/* allowReservedWords */ false);\n      if (!this.hasPrecedingLineBreak() && this.isRelational(\"<\")) {\n        node.typeParameters = this.tsParseTypeArguments();\n      }\n      return this.finishNode(node, \"TSTypeReference\");\n    }\n\n    tsParseThisTypePredicate(lhs: N.TsThisType): N.TsTypePredicate {\n      this.next();\n      const node: N.TsTypePredicate = this.startNodeAtNode(lhs);\n      node.parameterName = lhs;\n      node.typeAnnotation = this.tsParseTypeAnnotation(/* eatColon */ false);\n      return this.finishNode(node, \"TSTypePredicate\");\n    }\n\n    tsParseThisTypeNode(): N.TsThisType {\n      const node: N.TsThisType = this.startNode();\n      this.next();\n      return this.finishNode(node, \"TSThisType\");\n    }\n\n    tsParseTypeQuery(): N.TsTypeQuery {\n      const node: N.TsTypeQuery = this.startNode();\n      this.expect(tt._typeof);\n      if (this.match(tt._import)) {\n        node.exprName = this.tsParseImportType();\n      } else {\n        node.exprName = this.tsParseEntityName(/* allowReservedWords */ true);\n      }\n      return this.finishNode(node, \"TSTypeQuery\");\n    }\n\n    tsParseTypeParameter(): N.TsTypeParameter {\n      const node: N.TsTypeParameter = this.startNode();\n      node.name = this.parseIdentifierName(node.start);\n      node.constraint = this.tsEatThenParseType(tt._extends);\n      node.default = this.tsEatThenParseType(tt.eq);\n      return this.finishNode(node, \"TSTypeParameter\");\n    }\n\n    tsTryParseTypeParameters(): ?N.TsTypeParameterDeclaration {\n      if (this.isRelational(\"<\")) {\n        return this.tsParseTypeParameters();\n      }\n    }\n\n    tsParseTypeParameters() {\n      const node: N.TsTypeParameterDeclaration = this.startNode();\n\n      if (this.isRelational(\"<\") || this.match(tt.jsxTagStart)) {\n        this.next();\n      } else {\n        this.unexpected();\n      }\n\n      node.params = this.tsParseBracketedList(\n        \"TypeParametersOrArguments\",\n        this.tsParseTypeParameter.bind(this),\n        /* bracket */ false,\n        /* skipFirstToken */ true,\n      );\n      return this.finishNode(node, \"TSTypeParameterDeclaration\");\n    }\n\n    tsTryNextParseConstantContext(): ?N.TsTypeReference {\n      if (this.lookahead().type === tt._const) {\n        this.next();\n        return this.tsParseTypeReference();\n      }\n      return null;\n    }\n\n    // Note: In TypeScript implementation we must provide `yieldContext` and `awaitContext`,\n    // but here it's always false, because this is only used for types.\n    tsFillSignature(\n      returnToken: TokenType,\n      signature: N.TsSignatureDeclaration,\n    ): void {\n      // Arrow fns *must* have return token (`=>`). Normal functions can omit it.\n      const returnTokenRequired = returnToken === tt.arrow;\n      signature.typeParameters = this.tsTryParseTypeParameters();\n      this.expect(tt.parenL);\n      signature.parameters = this.tsParseBindingListForSignature();\n      if (returnTokenRequired) {\n        signature.typeAnnotation = this.tsParseTypeOrTypePredicateAnnotation(\n          returnToken,\n        );\n      } else if (this.match(returnToken)) {\n        signature.typeAnnotation = this.tsParseTypeOrTypePredicateAnnotation(\n          returnToken,\n        );\n      }\n    }\n\n    tsParseBindingListForSignature(): $ReadOnlyArray<\n      N.Identifier | N.RestElement | N.ObjectPattern | N.ArrayPattern,\n    > {\n      return this.parseBindingList(tt.parenR, charCodes.rightParenthesis).map(\n        pattern => {\n          if (\n            pattern.type !== \"Identifier\" &&\n            pattern.type !== \"RestElement\" &&\n            pattern.type !== \"ObjectPattern\" &&\n            pattern.type !== \"ArrayPattern\"\n          ) {\n            this.raise(\n              pattern.start,\n              TSErrors.UnsupportedSignatureParameterKind,\n              pattern.type,\n            );\n          }\n          return (pattern: any);\n        },\n      );\n    }\n\n    tsParseTypeMemberSemicolon(): void {\n      if (!this.eat(tt.comma)) {\n        this.semicolon();\n      }\n    }\n\n    tsParseSignatureMember(\n      kind: \"TSCallSignatureDeclaration\" | \"TSConstructSignatureDeclaration\",\n      node: N.TsCallSignatureDeclaration | N.TsConstructSignatureDeclaration,\n    ): N.TsCallSignatureDeclaration | N.TsConstructSignatureDeclaration {\n      this.tsFillSignature(tt.colon, node);\n      this.tsParseTypeMemberSemicolon();\n      return this.finishNode(node, kind);\n    }\n\n    tsIsUnambiguouslyIndexSignature() {\n      this.next(); // Skip '{'\n      return this.eat(tt.name) && this.match(tt.colon);\n    }\n\n    tsTryParseIndexSignature(node: N.Node): ?N.TsIndexSignature {\n      if (\n        !(\n          this.match(tt.bracketL) &&\n          this.tsLookAhead(this.tsIsUnambiguouslyIndexSignature.bind(this))\n        )\n      ) {\n        return undefined;\n      }\n\n      this.expect(tt.bracketL);\n      const id = this.parseIdentifier();\n      id.typeAnnotation = this.tsParseTypeAnnotation();\n      this.resetEndLocation(id); // set end position to end of type\n\n      this.expect(tt.bracketR);\n      node.parameters = [id];\n\n      const type = this.tsTryParseTypeAnnotation();\n      if (type) node.typeAnnotation = type;\n      this.tsParseTypeMemberSemicolon();\n      return this.finishNode(node, \"TSIndexSignature\");\n    }\n\n    tsParsePropertyOrMethodSignature(\n      node: N.TsPropertySignature | N.TsMethodSignature,\n      readonly: boolean,\n    ): N.TsPropertySignature | N.TsMethodSignature {\n      if (this.eat(tt.question)) node.optional = true;\n      const nodeAny: any = node;\n\n      if (!readonly && (this.match(tt.parenL) || this.isRelational(\"<\"))) {\n        const method: N.TsMethodSignature = nodeAny;\n        this.tsFillSignature(tt.colon, method);\n        this.tsParseTypeMemberSemicolon();\n        return this.finishNode(method, \"TSMethodSignature\");\n      } else {\n        const property: N.TsPropertySignature = nodeAny;\n        if (readonly) property.readonly = true;\n        const type = this.tsTryParseTypeAnnotation();\n        if (type) property.typeAnnotation = type;\n        this.tsParseTypeMemberSemicolon();\n        return this.finishNode(property, \"TSPropertySignature\");\n      }\n    }\n\n    tsParseTypeMember(): N.TsTypeElement {\n      const node: any = this.startNode();\n\n      if (this.match(tt.parenL) || this.isRelational(\"<\")) {\n        return this.tsParseSignatureMember(\"TSCallSignatureDeclaration\", node);\n      }\n\n      if (this.match(tt._new)) {\n        const id: N.Identifier = this.startNode();\n        this.next();\n        if (this.match(tt.parenL) || this.isRelational(\"<\")) {\n          return this.tsParseSignatureMember(\n            \"TSConstructSignatureDeclaration\",\n            node,\n          );\n        } else {\n          node.key = this.createIdentifier(id, \"new\");\n          return this.tsParsePropertyOrMethodSignature(node, false);\n        }\n      }\n\n      const readonly = !!this.tsParseModifier([\"readonly\"]);\n\n      const idx = this.tsTryParseIndexSignature(node);\n      if (idx) {\n        if (readonly) node.readonly = true;\n        return idx;\n      }\n\n      this.parsePropertyName(node, /* isPrivateNameAllowed */ false);\n      return this.tsParsePropertyOrMethodSignature(node, readonly);\n    }\n\n    tsParseTypeLiteral(): N.TsTypeLiteral {\n      const node: N.TsTypeLiteral = this.startNode();\n      node.members = this.tsParseObjectTypeMembers();\n      return this.finishNode(node, \"TSTypeLiteral\");\n    }\n\n    tsParseObjectTypeMembers(): $ReadOnlyArray<N.TsTypeElement> {\n      this.expect(tt.braceL);\n      const members = this.tsParseList(\n        \"TypeMembers\",\n        this.tsParseTypeMember.bind(this),\n      );\n      this.expect(tt.braceR);\n      return members;\n    }\n\n    tsIsStartOfMappedType(): boolean {\n      this.next();\n      if (this.eat(tt.plusMin)) {\n        return this.isContextual(\"readonly\");\n      }\n      if (this.isContextual(\"readonly\")) {\n        this.next();\n      }\n      if (!this.match(tt.bracketL)) {\n        return false;\n      }\n      this.next();\n      if (!this.tsIsIdentifier()) {\n        return false;\n      }\n      this.next();\n      return this.match(tt._in);\n    }\n\n    tsParseMappedTypeParameter(): N.TsTypeParameter {\n      const node: N.TsTypeParameter = this.startNode();\n      node.name = this.parseIdentifierName(node.start);\n      node.constraint = this.tsExpectThenParseType(tt._in);\n      return this.finishNode(node, \"TSTypeParameter\");\n    }\n\n    tsParseMappedType(): N.TsMappedType {\n      const node: N.TsMappedType = this.startNode();\n\n      this.expect(tt.braceL);\n\n      if (this.match(tt.plusMin)) {\n        node.readonly = this.state.value;\n        this.next();\n        this.expectContextual(\"readonly\");\n      } else if (this.eatContextual(\"readonly\")) {\n        node.readonly = true;\n      }\n\n      this.expect(tt.bracketL);\n      node.typeParameter = this.tsParseMappedTypeParameter();\n      this.expect(tt.bracketR);\n\n      if (this.match(tt.plusMin)) {\n        node.optional = this.state.value;\n        this.next();\n        this.expect(tt.question);\n      } else if (this.eat(tt.question)) {\n        node.optional = true;\n      }\n\n      node.typeAnnotation = this.tsTryParseType();\n      this.semicolon();\n      this.expect(tt.braceR);\n\n      return this.finishNode(node, \"TSMappedType\");\n    }\n\n    tsParseTupleType(): N.TsTupleType {\n      const node: N.TsTupleType = this.startNode();\n      node.elementTypes = this.tsParseBracketedList(\n        \"TupleElementTypes\",\n        this.tsParseTupleElementType.bind(this),\n        /* bracket */ true,\n        /* skipFirstToken */ false,\n      );\n\n      // Validate the elementTypes to ensure:\n      //   No mandatory elements may follow optional elements\n      //   If there's a rest element, it must be at the end of the tuple\n      let seenOptionalElement = false;\n      node.elementTypes.forEach(elementNode => {\n        if (elementNode.type === \"TSOptionalType\") {\n          seenOptionalElement = true;\n        } else if (seenOptionalElement && elementNode.type !== \"TSRestType\") {\n          this.raise(elementNode.start, TSErrors.OptionalTypeBeforeRequired);\n        }\n      });\n\n      return this.finishNode(node, \"TSTupleType\");\n    }\n\n    tsParseTupleElementType(): N.TsType {\n      // parses `...TsType[]`\n      if (this.match(tt.ellipsis)) {\n        const restNode: N.TsRestType = this.startNode();\n        this.next(); // skips ellipsis\n        restNode.typeAnnotation = this.tsParseType();\n        if (\n          this.match(tt.comma) &&\n          this.lookaheadCharCode() !== charCodes.rightSquareBracket\n        ) {\n          this.raiseRestNotLast(this.state.start);\n        }\n        return this.finishNode(restNode, \"TSRestType\");\n      }\n\n      const type = this.tsParseType();\n      // parses `TsType?`\n      if (this.eat(tt.question)) {\n        const optionalTypeNode: N.TsOptionalType = this.startNodeAtNode(type);\n        optionalTypeNode.typeAnnotation = type;\n        return this.finishNode(optionalTypeNode, \"TSOptionalType\");\n      }\n      return type;\n    }\n\n    tsParseParenthesizedType(): N.TsParenthesizedType {\n      const node = this.startNode();\n      this.expect(tt.parenL);\n      node.typeAnnotation = this.tsParseType();\n      this.expect(tt.parenR);\n      return this.finishNode(node, \"TSParenthesizedType\");\n    }\n\n    tsParseFunctionOrConstructorType(\n      type: \"TSFunctionType\" | \"TSConstructorType\",\n    ): N.TsFunctionOrConstructorType {\n      const node: N.TsFunctionOrConstructorType = this.startNode();\n      if (type === \"TSConstructorType\") {\n        this.expect(tt._new);\n      }\n      this.tsFillSignature(tt.arrow, node);\n      return this.finishNode(node, type);\n    }\n\n    tsParseLiteralTypeNode(): N.TsLiteralType {\n      const node: N.TsLiteralType = this.startNode();\n      node.literal = (() => {\n        switch (this.state.type) {\n          case tt.num:\n          case tt.string:\n          case tt._true:\n          case tt._false:\n            // For compatibility to estree we cannot call parseLiteral directly here\n            return this.parseExprAtom();\n          default:\n            throw this.unexpected();\n        }\n      })();\n      return this.finishNode(node, \"TSLiteralType\");\n    }\n\n    tsParseTemplateLiteralType(): N.TsType {\n      const node: N.TsLiteralType = this.startNode();\n      const templateNode = this.parseTemplate(false);\n      if (templateNode.expressions.length > 0) {\n        this.raise(\n          templateNode.expressions[0].start,\n          TSErrors.TemplateTypeHasSubstitution,\n        );\n      }\n      node.literal = templateNode;\n      return this.finishNode(node, \"TSLiteralType\");\n    }\n\n    tsParseThisTypeOrThisTypePredicate(): N.TsThisType | N.TsTypePredicate {\n      const thisKeyword = this.tsParseThisTypeNode();\n      if (this.isContextual(\"is\") && !this.hasPrecedingLineBreak()) {\n        return this.tsParseThisTypePredicate(thisKeyword);\n      } else {\n        return thisKeyword;\n      }\n    }\n\n    tsParseNonArrayType(): N.TsType {\n      switch (this.state.type) {\n        case tt.name:\n        case tt._void:\n        case tt._null: {\n          const type = this.match(tt._void)\n            ? \"TSVoidKeyword\"\n            : this.match(tt._null)\n            ? \"TSNullKeyword\"\n            : keywordTypeFromName(this.state.value);\n          if (\n            type !== undefined &&\n            this.lookaheadCharCode() !== charCodes.dot\n          ) {\n            const node: N.TsKeywordType = this.startNode();\n            this.next();\n            return this.finishNode(node, type);\n          }\n          return this.tsParseTypeReference();\n        }\n        case tt.string:\n        case tt.num:\n        case tt._true:\n        case tt._false:\n          return this.tsParseLiteralTypeNode();\n        case tt.plusMin:\n          if (this.state.value === \"-\") {\n            const node: N.TsLiteralType = this.startNode();\n            if (this.lookahead().type !== tt.num) {\n              throw this.unexpected();\n            }\n            node.literal = this.parseMaybeUnary();\n            return this.finishNode(node, \"TSLiteralType\");\n          }\n          break;\n        case tt._this:\n          return this.tsParseThisTypeOrThisTypePredicate();\n        case tt._typeof:\n          return this.tsParseTypeQuery();\n        case tt._import:\n          return this.tsParseImportType();\n        case tt.braceL:\n          return this.tsLookAhead(this.tsIsStartOfMappedType.bind(this))\n            ? this.tsParseMappedType()\n            : this.tsParseTypeLiteral();\n        case tt.bracketL:\n          return this.tsParseTupleType();\n        case tt.parenL:\n          return this.tsParseParenthesizedType();\n        case tt.backQuote:\n          return this.tsParseTemplateLiteralType();\n      }\n\n      throw this.unexpected();\n    }\n\n    tsParseArrayTypeOrHigher(): N.TsType {\n      let type = this.tsParseNonArrayType();\n      while (!this.hasPrecedingLineBreak() && this.eat(tt.bracketL)) {\n        if (this.match(tt.bracketR)) {\n          const node: N.TsArrayType = this.startNodeAtNode(type);\n          node.elementType = type;\n          this.expect(tt.bracketR);\n          type = this.finishNode(node, \"TSArrayType\");\n        } else {\n          const node: N.TsIndexedAccessType = this.startNodeAtNode(type);\n          node.objectType = type;\n          node.indexType = this.tsParseType();\n          this.expect(tt.bracketR);\n          type = this.finishNode(node, \"TSIndexedAccessType\");\n        }\n      }\n      return type;\n    }\n\n    tsParseTypeOperator(\n      operator: \"keyof\" | \"unique\" | \"readonly\",\n    ): N.TsTypeOperator {\n      const node: N.TsTypeOperator = this.startNode();\n      this.expectContextual(operator);\n      node.operator = operator;\n      node.typeAnnotation = this.tsParseTypeOperatorOrHigher();\n\n      if (operator === \"readonly\") {\n        this.tsCheckTypeAnnotationForReadOnly(node);\n      }\n\n      return this.finishNode(node, \"TSTypeOperator\");\n    }\n\n    tsCheckTypeAnnotationForReadOnly(node: N.Node) {\n      switch (node.typeAnnotation.type) {\n        case \"TSTupleType\":\n        case \"TSArrayType\":\n          return;\n        default:\n          this.raise(node.start, TSErrors.UnexpectedReadonly);\n      }\n    }\n\n    tsParseInferType(): N.TsInferType {\n      const node = this.startNode();\n      this.expectContextual(\"infer\");\n      const typeParameter = this.startNode();\n      typeParameter.name = this.parseIdentifierName(typeParameter.start);\n      node.typeParameter = this.finishNode(typeParameter, \"TSTypeParameter\");\n      return this.finishNode(node, \"TSInferType\");\n    }\n\n    tsParseTypeOperatorOrHigher(): N.TsType {\n      const operator = [\"keyof\", \"unique\", \"readonly\"].find(kw =>\n        this.isContextual(kw),\n      );\n      return operator\n        ? this.tsParseTypeOperator(operator)\n        : this.isContextual(\"infer\")\n        ? this.tsParseInferType()\n        : this.tsParseArrayTypeOrHigher();\n    }\n\n    tsParseUnionOrIntersectionType(\n      kind: \"TSUnionType\" | \"TSIntersectionType\",\n      parseConstituentType: () => N.TsType,\n      operator: TokenType,\n    ): N.TsType {\n      this.eat(operator);\n      let type = parseConstituentType();\n      if (this.match(operator)) {\n        const types = [type];\n        while (this.eat(operator)) {\n          types.push(parseConstituentType());\n        }\n        const node: N.TsUnionType | N.TsIntersectionType = this.startNodeAtNode(\n          type,\n        );\n        node.types = types;\n        type = this.finishNode(node, kind);\n      }\n      return type;\n    }\n\n    tsParseIntersectionTypeOrHigher(): N.TsType {\n      return this.tsParseUnionOrIntersectionType(\n        \"TSIntersectionType\",\n        this.tsParseTypeOperatorOrHigher.bind(this),\n        tt.bitwiseAND,\n      );\n    }\n\n    tsParseUnionTypeOrHigher() {\n      return this.tsParseUnionOrIntersectionType(\n        \"TSUnionType\",\n        this.tsParseIntersectionTypeOrHigher.bind(this),\n        tt.bitwiseOR,\n      );\n    }\n\n    tsIsStartOfFunctionType() {\n      if (this.isRelational(\"<\")) {\n        return true;\n      }\n      return (\n        this.match(tt.parenL) &&\n        this.tsLookAhead(this.tsIsUnambiguouslyStartOfFunctionType.bind(this))\n      );\n    }\n\n    tsSkipParameterStart(): boolean {\n      if (this.match(tt.name) || this.match(tt._this)) {\n        this.next();\n        return true;\n      }\n\n      if (this.match(tt.braceL)) {\n        let braceStackCounter = 1;\n        this.next();\n\n        while (braceStackCounter > 0) {\n          if (this.match(tt.braceL)) {\n            ++braceStackCounter;\n          } else if (this.match(tt.braceR)) {\n            --braceStackCounter;\n          }\n          this.next();\n        }\n        return true;\n      }\n\n      if (this.match(tt.bracketL)) {\n        let braceStackCounter = 1;\n        this.next();\n\n        while (braceStackCounter > 0) {\n          if (this.match(tt.bracketL)) {\n            ++braceStackCounter;\n          } else if (this.match(tt.bracketR)) {\n            --braceStackCounter;\n          }\n          this.next();\n        }\n        return true;\n      }\n\n      return false;\n    }\n\n    tsIsUnambiguouslyStartOfFunctionType(): boolean {\n      this.next();\n      if (this.match(tt.parenR) || this.match(tt.ellipsis)) {\n        // ( )\n        // ( ...\n        return true;\n      }\n      if (this.tsSkipParameterStart()) {\n        if (\n          this.match(tt.colon) ||\n          this.match(tt.comma) ||\n          this.match(tt.question) ||\n          this.match(tt.eq)\n        ) {\n          // ( xxx :\n          // ( xxx ,\n          // ( xxx ?\n          // ( xxx =\n          return true;\n        }\n        if (this.match(tt.parenR)) {\n          this.next();\n          if (this.match(tt.arrow)) {\n            // ( xxx ) =>\n            return true;\n          }\n        }\n      }\n      return false;\n    }\n\n    tsParseTypeOrTypePredicateAnnotation(\n      returnToken: TokenType,\n    ): N.TsTypeAnnotation {\n      return this.tsInType(() => {\n        const t: N.TsTypeAnnotation = this.startNode();\n        this.expect(returnToken);\n\n        const asserts = this.tsTryParse(\n          this.tsParseTypePredicateAsserts.bind(this),\n        );\n\n        if (asserts && this.match(tt._this)) {\n          // When asserts is false, thisKeyword is handled by tsParseNonArrayType\n          // : asserts this is type\n          let thisTypePredicate = this.tsParseThisTypeOrThisTypePredicate();\n          // if it turns out to be a `TSThisType`, wrap it with `TSTypePredicate`\n          // : asserts this\n          if (thisTypePredicate.type === \"TSThisType\") {\n            const node: N.TsTypePredicate = this.startNodeAtNode(t);\n            node.parameterName = (thisTypePredicate: N.TsThisType);\n            node.asserts = true;\n            thisTypePredicate = this.finishNode(node, \"TSTypePredicate\");\n          } else {\n            (thisTypePredicate: N.TsTypePredicate).asserts = true;\n          }\n          t.typeAnnotation = thisTypePredicate;\n          return this.finishNode(t, \"TSTypeAnnotation\");\n        }\n\n        const typePredicateVariable =\n          this.tsIsIdentifier() &&\n          this.tsTryParse(this.tsParseTypePredicatePrefix.bind(this));\n\n        if (!typePredicateVariable) {\n          if (!asserts) {\n            // : type\n            return this.tsParseTypeAnnotation(/* eatColon */ false, t);\n          }\n\n          const node: N.TsTypePredicate = this.startNodeAtNode(t);\n          // : asserts foo\n          node.parameterName = this.parseIdentifier();\n          node.asserts = asserts;\n          t.typeAnnotation = this.finishNode(node, \"TSTypePredicate\");\n          return this.finishNode(t, \"TSTypeAnnotation\");\n        }\n\n        // : asserts foo is type\n        const type = this.tsParseTypeAnnotation(/* eatColon */ false);\n        const node = this.startNodeAtNode(t);\n        node.parameterName = typePredicateVariable;\n        node.typeAnnotation = type;\n        node.asserts = asserts;\n        t.typeAnnotation = this.finishNode(node, \"TSTypePredicate\");\n        return this.finishNode(t, \"TSTypeAnnotation\");\n      });\n    }\n\n    tsTryParseTypeOrTypePredicateAnnotation(): ?N.TsTypeAnnotation {\n      return this.match(tt.colon)\n        ? this.tsParseTypeOrTypePredicateAnnotation(tt.colon)\n        : undefined;\n    }\n\n    tsTryParseTypeAnnotation(): ?N.TsTypeAnnotation {\n      return this.match(tt.colon) ? this.tsParseTypeAnnotation() : undefined;\n    }\n\n    tsTryParseType(): ?N.TsType {\n      return this.tsEatThenParseType(tt.colon);\n    }\n\n    tsParseTypePredicatePrefix(): ?N.Identifier {\n      const id = this.parseIdentifier();\n      if (this.isContextual(\"is\") && !this.hasPrecedingLineBreak()) {\n        this.next();\n        return id;\n      }\n    }\n\n    tsParseTypePredicateAsserts(): boolean {\n      if (\n        !this.match(tt.name) ||\n        this.state.value !== \"asserts\" ||\n        this.hasPrecedingLineBreak()\n      ) {\n        return false;\n      }\n      const containsEsc = this.state.containsEsc;\n      this.next();\n      if (!this.match(tt.name) && !this.match(tt._this)) {\n        return false;\n      }\n\n      if (containsEsc) {\n        this.raise(\n          this.state.lastTokStart,\n          Errors.InvalidEscapedReservedWord,\n          \"asserts\",\n        );\n      }\n\n      return true;\n    }\n\n    tsParseTypeAnnotation(\n      eatColon = true,\n      t: N.TsTypeAnnotation = this.startNode(),\n    ): N.TsTypeAnnotation {\n      this.tsInType(() => {\n        if (eatColon) this.expect(tt.colon);\n        t.typeAnnotation = this.tsParseType();\n      });\n      return this.finishNode(t, \"TSTypeAnnotation\");\n    }\n\n    /** Be sure to be in a type context before calling this, using `tsInType`. */\n    tsParseType(): N.TsType {\n      // Need to set `state.inType` so that we don't parse JSX in a type context.\n      assert(this.state.inType);\n      const type = this.tsParseNonConditionalType();\n      if (this.hasPrecedingLineBreak() || !this.eat(tt._extends)) {\n        return type;\n      }\n      const node: N.TsConditionalType = this.startNodeAtNode(type);\n      node.checkType = type;\n      node.extendsType = this.tsParseNonConditionalType();\n      this.expect(tt.question);\n      node.trueType = this.tsParseType();\n      this.expect(tt.colon);\n      node.falseType = this.tsParseType();\n      return this.finishNode(node, \"TSConditionalType\");\n    }\n\n    tsParseNonConditionalType(): N.TsType {\n      if (this.tsIsStartOfFunctionType()) {\n        return this.tsParseFunctionOrConstructorType(\"TSFunctionType\");\n      }\n      if (this.match(tt._new)) {\n        // As in `new () => Date`\n        return this.tsParseFunctionOrConstructorType(\"TSConstructorType\");\n      }\n      return this.tsParseUnionTypeOrHigher();\n    }\n\n    tsParseTypeAssertion(): N.TsTypeAssertion {\n      const node: N.TsTypeAssertion = this.startNode();\n      const _const = this.tsTryNextParseConstantContext();\n      node.typeAnnotation = _const || this.tsNextThenParseType();\n      this.expectRelational(\">\");\n      node.expression = this.parseMaybeUnary();\n      return this.finishNode(node, \"TSTypeAssertion\");\n    }\n\n    tsParseHeritageClause(\n      descriptor: string,\n    ): $ReadOnlyArray<N.TsExpressionWithTypeArguments> {\n      const originalStart = this.state.start;\n\n      const delimitedList = this.tsParseDelimitedList(\n        \"HeritageClauseElement\",\n        this.tsParseExpressionWithTypeArguments.bind(this),\n      );\n\n      if (!delimitedList.length) {\n        this.raise(originalStart, TSErrors.EmptyHeritageClauseType, descriptor);\n      }\n\n      return delimitedList;\n    }\n\n    tsParseExpressionWithTypeArguments(): N.TsExpressionWithTypeArguments {\n      const node: N.TsExpressionWithTypeArguments = this.startNode();\n      // Note: TS uses parseLeftHandSideExpressionOrHigher,\n      // then has grammar errors later if it's not an EntityName.\n      node.expression = this.tsParseEntityName(/* allowReservedWords */ false);\n      if (this.isRelational(\"<\")) {\n        node.typeParameters = this.tsParseTypeArguments();\n      }\n\n      return this.finishNode(node, \"TSExpressionWithTypeArguments\");\n    }\n\n    tsParseInterfaceDeclaration(\n      node: N.TsInterfaceDeclaration,\n    ): N.TsInterfaceDeclaration {\n      node.id = this.parseIdentifier();\n      this.checkLVal(\n        node.id,\n        BIND_TS_INTERFACE,\n        undefined,\n        \"typescript interface declaration\",\n      );\n      node.typeParameters = this.tsTryParseTypeParameters();\n      if (this.eat(tt._extends)) {\n        node.extends = this.tsParseHeritageClause(\"extends\");\n      }\n      const body: N.TSInterfaceBody = this.startNode();\n      body.body = this.tsInType(this.tsParseObjectTypeMembers.bind(this));\n      node.body = this.finishNode(body, \"TSInterfaceBody\");\n      return this.finishNode(node, \"TSInterfaceDeclaration\");\n    }\n\n    tsParseTypeAliasDeclaration(\n      node: N.TsTypeAliasDeclaration,\n    ): N.TsTypeAliasDeclaration {\n      node.id = this.parseIdentifier();\n      this.checkLVal(node.id, BIND_TS_TYPE, undefined, \"typescript type alias\");\n\n      node.typeParameters = this.tsTryParseTypeParameters();\n      node.typeAnnotation = this.tsExpectThenParseType(tt.eq);\n      this.semicolon();\n      return this.finishNode(node, \"TSTypeAliasDeclaration\");\n    }\n\n    tsInNoContext<T>(cb: () => T): T {\n      const oldContext = this.state.context;\n      this.state.context = [oldContext[0]];\n      try {\n        return cb();\n      } finally {\n        this.state.context = oldContext;\n      }\n    }\n\n    /**\n     * Runs `cb` in a type context.\n     * This should be called one token *before* the first type token,\n     * so that the call to `next()` is run in type context.\n     */\n    tsInType<T>(cb: () => T): T {\n      const oldInType = this.state.inType;\n      this.state.inType = true;\n      try {\n        return cb();\n      } finally {\n        this.state.inType = oldInType;\n      }\n    }\n\n    tsEatThenParseType(token: TokenType): N.TsType | typeof undefined {\n      return !this.match(token) ? undefined : this.tsNextThenParseType();\n    }\n\n    tsExpectThenParseType(token: TokenType): N.TsType {\n      return this.tsDoThenParseType(() => this.expect(token));\n    }\n\n    tsNextThenParseType(): N.TsType {\n      return this.tsDoThenParseType(() => this.next());\n    }\n\n    tsDoThenParseType(cb: () => void): N.TsType {\n      return this.tsInType(() => {\n        cb();\n        return this.tsParseType();\n      });\n    }\n\n    tsParseEnumMember(): N.TsEnumMember {\n      const node: N.TsEnumMember = this.startNode();\n      // Computed property names are grammar errors in an enum, so accept just string literal or identifier.\n      node.id = this.match(tt.string)\n        ? this.parseExprAtom()\n        : this.parseIdentifier(/* liberal */ true);\n      if (this.eat(tt.eq)) {\n        node.initializer = this.parseMaybeAssign();\n      }\n      return this.finishNode(node, \"TSEnumMember\");\n    }\n\n    tsParseEnumDeclaration(\n      node: N.TsEnumDeclaration,\n      isConst: boolean,\n    ): N.TsEnumDeclaration {\n      if (isConst) node.const = true;\n      node.id = this.parseIdentifier();\n      this.checkLVal(\n        node.id,\n        isConst ? BIND_TS_CONST_ENUM : BIND_TS_ENUM,\n        undefined,\n        \"typescript enum declaration\",\n      );\n\n      this.expect(tt.braceL);\n      node.members = this.tsParseDelimitedList(\n        \"EnumMembers\",\n        this.tsParseEnumMember.bind(this),\n      );\n      this.expect(tt.braceR);\n      return this.finishNode(node, \"TSEnumDeclaration\");\n    }\n\n    tsParseModuleBlock(): N.TsModuleBlock {\n      const node: N.TsModuleBlock = this.startNode();\n      this.scope.enter(SCOPE_OTHER);\n\n      this.expect(tt.braceL);\n      // Inside of a module block is considered \"top-level\", meaning it can have imports and exports.\n      this.parseBlockOrModuleBlockBody(\n        (node.body = []),\n        /* directives */ undefined,\n        /* topLevel */ true,\n        /* end */ tt.braceR,\n      );\n      this.scope.exit();\n      return this.finishNode(node, \"TSModuleBlock\");\n    }\n\n    tsParseModuleOrNamespaceDeclaration(\n      node: N.TsModuleDeclaration,\n      nested?: boolean = false,\n    ): N.TsModuleDeclaration {\n      node.id = this.parseIdentifier();\n\n      if (!nested) {\n        this.checkLVal(\n          node.id,\n          BIND_TS_NAMESPACE,\n          null,\n          \"module or namespace declaration\",\n        );\n      }\n\n      if (this.eat(tt.dot)) {\n        const inner = this.startNode();\n        this.tsParseModuleOrNamespaceDeclaration(inner, true);\n        node.body = inner;\n      } else {\n        this.scope.enter(SCOPE_TS_MODULE);\n        this.prodParam.enter(PARAM);\n        node.body = this.tsParseModuleBlock();\n        this.prodParam.exit();\n        this.scope.exit();\n      }\n      return this.finishNode(node, \"TSModuleDeclaration\");\n    }\n\n    tsParseAmbientExternalModuleDeclaration(\n      node: N.TsModuleDeclaration,\n    ): N.TsModuleDeclaration {\n      if (this.isContextual(\"global\")) {\n        node.global = true;\n        node.id = this.parseIdentifier();\n      } else if (this.match(tt.string)) {\n        node.id = this.parseExprAtom();\n      } else {\n        this.unexpected();\n      }\n      if (this.match(tt.braceL)) {\n        this.scope.enter(SCOPE_TS_MODULE);\n        this.prodParam.enter(PARAM);\n        node.body = this.tsParseModuleBlock();\n        this.prodParam.exit();\n        this.scope.exit();\n      } else {\n        this.semicolon();\n      }\n\n      return this.finishNode(node, \"TSModuleDeclaration\");\n    }\n\n    tsParseImportEqualsDeclaration(\n      node: N.TsImportEqualsDeclaration,\n      isExport?: boolean,\n    ): N.TsImportEqualsDeclaration {\n      node.isExport = isExport || false;\n      node.id = this.parseIdentifier();\n      this.checkLVal(\n        node.id,\n        BIND_LEXICAL,\n        undefined,\n        \"import equals declaration\",\n      );\n      this.expect(tt.eq);\n      node.moduleReference = this.tsParseModuleReference();\n      this.semicolon();\n      return this.finishNode(node, \"TSImportEqualsDeclaration\");\n    }\n\n    tsIsExternalModuleReference(): boolean {\n      return (\n        this.isContextual(\"require\") &&\n        this.lookaheadCharCode() === charCodes.leftParenthesis\n      );\n    }\n\n    tsParseModuleReference(): N.TsModuleReference {\n      return this.tsIsExternalModuleReference()\n        ? this.tsParseExternalModuleReference()\n        : this.tsParseEntityName(/* allowReservedWords */ false);\n    }\n\n    tsParseExternalModuleReference(): N.TsExternalModuleReference {\n      const node: N.TsExternalModuleReference = this.startNode();\n      this.expectContextual(\"require\");\n      this.expect(tt.parenL);\n      if (!this.match(tt.string)) {\n        throw this.unexpected();\n      }\n      // For compatibility to estree we cannot call parseLiteral directly here\n      node.expression = this.parseExprAtom();\n      this.expect(tt.parenR);\n      return this.finishNode(node, \"TSExternalModuleReference\");\n    }\n\n    // Utilities\n\n    tsLookAhead<T>(f: () => T): T {\n      const state = this.state.clone();\n      const res = f();\n      this.state = state;\n      return res;\n    }\n\n    tsTryParseAndCatch<T: ?N.NodeBase>(f: () => T): ?T {\n      const result = this.tryParse(abort => f() || abort());\n\n      if (result.aborted || !result.node) return undefined;\n      if (result.error) this.state = result.failState;\n      return result.node;\n    }\n\n    tsTryParse<T>(f: () => ?T): ?T {\n      const state = this.state.clone();\n      const result = f();\n      if (result !== undefined && result !== false) {\n        return result;\n      } else {\n        this.state = state;\n        return undefined;\n      }\n    }\n\n    tsTryParseDeclare(nany: any): ?N.Declaration {\n      if (this.isLineTerminator()) {\n        return;\n      }\n      let starttype = this.state.type;\n      let kind;\n\n      if (this.isContextual(\"let\")) {\n        starttype = tt._var;\n        kind = \"let\";\n      }\n\n      switch (starttype) {\n        case tt._function:\n          return this.parseFunctionStatement(\n            nany,\n            /* async */ false,\n            /* declarationPosition */ true,\n          );\n        case tt._class:\n          // While this is also set by tsParseExpressionStatement, we need to set it\n          // before parsing the class declaration to now how to register it in the scope.\n          nany.declare = true;\n          return this.parseClass(\n            nany,\n            /* isStatement */ true,\n            /* optionalId */ false,\n          );\n        case tt._const:\n          if (this.match(tt._const) && this.isLookaheadContextual(\"enum\")) {\n            // `const enum = 0;` not allowed because \"enum\" is a strict mode reserved word.\n            this.expect(tt._const);\n            this.expectContextual(\"enum\");\n            return this.tsParseEnumDeclaration(nany, /* isConst */ true);\n          }\n        // falls through\n        case tt._var:\n          kind = kind || this.state.value;\n          return this.parseVarStatement(nany, kind);\n        case tt.name: {\n          const value = this.state.value;\n          if (value === \"global\") {\n            return this.tsParseAmbientExternalModuleDeclaration(nany);\n          } else {\n            return this.tsParseDeclaration(nany, value, /* next */ true);\n          }\n        }\n      }\n    }\n\n    // Note: this won't be called unless the keyword is allowed in `shouldParseExportDeclaration`.\n    tsTryParseExportDeclaration(): ?N.Declaration {\n      return this.tsParseDeclaration(\n        this.startNode(),\n        this.state.value,\n        /* next */ true,\n      );\n    }\n\n    tsParseExpressionStatement(node: any, expr: N.Identifier): ?N.Declaration {\n      switch (expr.name) {\n        case \"declare\": {\n          const declaration = this.tsTryParseDeclare(node);\n          if (declaration) {\n            declaration.declare = true;\n            return declaration;\n          }\n          break;\n        }\n        case \"global\":\n          // `global { }` (with no `declare`) may appear inside an ambient module declaration.\n          // Would like to use tsParseAmbientExternalModuleDeclaration here, but already ran past \"global\".\n          if (this.match(tt.braceL)) {\n            this.scope.enter(SCOPE_TS_MODULE);\n            this.prodParam.enter(PARAM);\n            const mod: N.TsModuleDeclaration = node;\n            mod.global = true;\n            mod.id = expr;\n            mod.body = this.tsParseModuleBlock();\n            this.scope.exit();\n            this.prodParam.exit();\n            return this.finishNode(mod, \"TSModuleDeclaration\");\n          }\n          break;\n\n        default:\n          return this.tsParseDeclaration(node, expr.name, /* next */ false);\n      }\n    }\n\n    // Common to tsTryParseDeclare, tsTryParseExportDeclaration, and tsParseExpressionStatement.\n    tsParseDeclaration(\n      node: any,\n      value: string,\n      next: boolean,\n    ): ?N.Declaration {\n      switch (value) {\n        case \"abstract\":\n          if (this.tsCheckLineTerminatorAndMatch(tt._class, next)) {\n            const cls: N.ClassDeclaration = node;\n            cls.abstract = true;\n            if (next) {\n              this.next();\n              if (!this.match(tt._class)) {\n                this.unexpected(null, tt._class);\n              }\n            }\n            return this.parseClass(\n              cls,\n              /* isStatement */ true,\n              /* optionalId */ false,\n            );\n          }\n          break;\n\n        case \"enum\":\n          if (next || this.match(tt.name)) {\n            if (next) this.next();\n            return this.tsParseEnumDeclaration(node, /* isConst */ false);\n          }\n          break;\n\n        case \"interface\":\n          if (this.tsCheckLineTerminatorAndMatch(tt.name, next)) {\n            if (next) this.next();\n            return this.tsParseInterfaceDeclaration(node);\n          }\n          break;\n\n        case \"module\":\n          if (next) this.next();\n          if (this.match(tt.string)) {\n            return this.tsParseAmbientExternalModuleDeclaration(node);\n          } else if (this.tsCheckLineTerminatorAndMatch(tt.name, next)) {\n            return this.tsParseModuleOrNamespaceDeclaration(node);\n          }\n          break;\n\n        case \"namespace\":\n          if (this.tsCheckLineTerminatorAndMatch(tt.name, next)) {\n            if (next) this.next();\n            return this.tsParseModuleOrNamespaceDeclaration(node);\n          }\n          break;\n\n        case \"type\":\n          if (this.tsCheckLineTerminatorAndMatch(tt.name, next)) {\n            if (next) this.next();\n            return this.tsParseTypeAliasDeclaration(node);\n          }\n          break;\n      }\n    }\n\n    tsCheckLineTerminatorAndMatch(tokenType: TokenType, next: boolean) {\n      return (next || this.match(tokenType)) && !this.isLineTerminator();\n    }\n\n    tsTryParseGenericAsyncArrowFunction(\n      startPos: number,\n      startLoc: Position,\n    ): ?N.ArrowFunctionExpression {\n      if (!this.isRelational(\"<\")) {\n        return undefined;\n      }\n\n      const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;\n      const oldYieldPos = this.state.yieldPos;\n      const oldAwaitPos = this.state.awaitPos;\n      this.state.maybeInArrowParameters = true;\n      this.state.yieldPos = -1;\n      this.state.awaitPos = -1;\n\n      const res: ?N.ArrowFunctionExpression = this.tsTryParseAndCatch(() => {\n        const node: N.ArrowFunctionExpression = this.startNodeAt(\n          startPos,\n          startLoc,\n        );\n        node.typeParameters = this.tsParseTypeParameters();\n        // Don't use overloaded parseFunctionParams which would look for \"<\" again.\n        super.parseFunctionParams(node);\n        node.returnType = this.tsTryParseTypeOrTypePredicateAnnotation();\n        this.expect(tt.arrow);\n        return node;\n      });\n\n      this.state.maybeInArrowParameters = oldMaybeInArrowParameters;\n      this.state.yieldPos = oldYieldPos;\n      this.state.awaitPos = oldAwaitPos;\n\n      if (!res) {\n        return undefined;\n      }\n\n      return this.parseArrowExpression(\n        res,\n        /* params are already set */ null,\n        /* async */ true,\n      );\n    }\n\n    tsParseTypeArguments(): N.TsTypeParameterInstantiation {\n      const node = this.startNode();\n      node.params = this.tsInType(() =>\n        // Temporarily remove a JSX parsing context, which makes us scan different tokens.\n        this.tsInNoContext(() => {\n          this.expectRelational(\"<\");\n          return this.tsParseDelimitedList(\n            \"TypeParametersOrArguments\",\n            this.tsParseType.bind(this),\n          );\n        }),\n      );\n      // This reads the next token after the `>` too, so do this in the enclosing context.\n      // But be sure not to parse a regex in the jsx expression `<C<number> />`, so set exprAllowed = false\n      this.state.exprAllowed = false;\n      this.expectRelational(\">\");\n      return this.finishNode(node, \"TSTypeParameterInstantiation\");\n    }\n\n    tsIsDeclarationStart(): boolean {\n      if (this.match(tt.name)) {\n        switch (this.state.value) {\n          case \"abstract\":\n          case \"declare\":\n          case \"enum\":\n          case \"interface\":\n          case \"module\":\n          case \"namespace\":\n          case \"type\":\n            return true;\n        }\n      }\n\n      return false;\n    }\n\n    // ======================================================\n    // OVERRIDES\n    // ======================================================\n\n    isExportDefaultSpecifier(): boolean {\n      if (this.tsIsDeclarationStart()) return false;\n      return super.isExportDefaultSpecifier();\n    }\n\n    parseAssignableListItem(\n      allowModifiers: ?boolean,\n      decorators: N.Decorator[],\n    ): N.Pattern | N.TSParameterProperty {\n      // Store original location/position to include modifiers in range\n      const startPos = this.state.start;\n      const startLoc = this.state.startLoc;\n\n      let accessibility: ?N.Accessibility;\n      let readonly = false;\n      if (allowModifiers) {\n        accessibility = this.parseAccessModifier();\n        readonly = !!this.tsParseModifier([\"readonly\"]);\n      }\n\n      const left = this.parseMaybeDefault();\n      this.parseAssignableListItemTypes(left);\n      const elt = this.parseMaybeDefault(left.start, left.loc.start, left);\n      if (accessibility || readonly) {\n        const pp: N.TSParameterProperty = this.startNodeAt(startPos, startLoc);\n        if (decorators.length) {\n          pp.decorators = decorators;\n        }\n        if (accessibility) pp.accessibility = accessibility;\n        if (readonly) pp.readonly = readonly;\n        if (elt.type !== \"Identifier\" && elt.type !== \"AssignmentPattern\") {\n          this.raise(pp.start, TSErrors.UnsupportedParameterPropertyKind);\n        }\n        pp.parameter = ((elt: any): N.Identifier | N.AssignmentPattern);\n        return this.finishNode(pp, \"TSParameterProperty\");\n      }\n\n      if (decorators.length) {\n        left.decorators = decorators;\n      }\n\n      return elt;\n    }\n\n    parseFunctionBodyAndFinish(\n      node: N.BodilessFunctionOrMethodBase,\n      type: string,\n      isMethod?: boolean = false,\n    ): void {\n      if (this.match(tt.colon)) {\n        node.returnType = this.tsParseTypeOrTypePredicateAnnotation(tt.colon);\n      }\n\n      const bodilessType =\n        type === \"FunctionDeclaration\"\n          ? \"TSDeclareFunction\"\n          : type === \"ClassMethod\"\n          ? \"TSDeclareMethod\"\n          : undefined;\n      if (bodilessType && !this.match(tt.braceL) && this.isLineTerminator()) {\n        this.finishNode(node, bodilessType);\n        return;\n      }\n\n      super.parseFunctionBodyAndFinish(node, type, isMethod);\n    }\n\n    registerFunctionStatementId(node: N.Function): void {\n      if (!node.body && node.id) {\n        // Function ids are validated after parsing their body.\n        // For bodyless function, we need to do it here.\n        this.checkLVal(node.id, BIND_TS_AMBIENT, null, \"function name\");\n      } else {\n        super.registerFunctionStatementId(...arguments);\n      }\n    }\n\n    parseSubscript(\n      base: N.Expression,\n      startPos: number,\n      startLoc: Position,\n      noCalls: ?boolean,\n      state: N.ParseSubscriptState,\n    ): N.Expression {\n      if (!this.hasPrecedingLineBreak() && this.match(tt.bang)) {\n        this.state.exprAllowed = false;\n        this.next();\n\n        const nonNullExpression: N.TsNonNullExpression = this.startNodeAt(\n          startPos,\n          startLoc,\n        );\n        nonNullExpression.expression = base;\n        return this.finishNode(nonNullExpression, \"TSNonNullExpression\");\n      }\n\n      if (this.isRelational(\"<\")) {\n        // tsTryParseAndCatch is expensive, so avoid if not necessary.\n        // There are number of things we are going to \"maybe\" parse, like type arguments on\n        // tagged template expressions. If any of them fail, walk it back and continue.\n        const result = this.tsTryParseAndCatch(() => {\n          if (!noCalls && this.atPossibleAsyncArrow(base)) {\n            // Almost certainly this is a generic async function `async <T>() => ...\n            // But it might be a call with a type argument `async<T>();`\n            const asyncArrowFn = this.tsTryParseGenericAsyncArrowFunction(\n              startPos,\n              startLoc,\n            );\n            if (asyncArrowFn) {\n              return asyncArrowFn;\n            }\n          }\n\n          const node: N.CallExpression = this.startNodeAt(startPos, startLoc);\n          node.callee = base;\n\n          const typeArguments = this.tsParseTypeArguments();\n\n          if (typeArguments) {\n            if (!noCalls && this.eat(tt.parenL)) {\n              // possibleAsync always false here, because we would have handled it above.\n              // $FlowIgnore (won't be any undefined arguments)\n              node.arguments = this.parseCallExpressionArguments(\n                tt.parenR,\n                /* possibleAsync */ false,\n              );\n              node.typeParameters = typeArguments;\n              return this.finishCallExpression(node, state.optionalChainMember);\n            } else if (this.match(tt.backQuote)) {\n              return this.parseTaggedTemplateExpression(\n                startPos,\n                startLoc,\n                base,\n                state,\n                typeArguments,\n              );\n            }\n          }\n\n          this.unexpected();\n        });\n\n        if (result) return result;\n      }\n\n      return super.parseSubscript(base, startPos, startLoc, noCalls, state);\n    }\n\n    parseNewArguments(node: N.NewExpression): void {\n      if (this.isRelational(\"<\")) {\n        // tsTryParseAndCatch is expensive, so avoid if not necessary.\n        // 99% certain this is `new C<T>();`. But may be `new C < T;`, which is also legal.\n        const typeParameters = this.tsTryParseAndCatch(() => {\n          const args = this.tsParseTypeArguments();\n          if (!this.match(tt.parenL)) this.unexpected();\n          return args;\n        });\n        if (typeParameters) {\n          node.typeParameters = typeParameters;\n        }\n      }\n\n      super.parseNewArguments(node);\n    }\n\n    parseExprOp(\n      left: N.Expression,\n      leftStartPos: number,\n      leftStartLoc: Position,\n      minPrec: number,\n      noIn: ?boolean,\n    ) {\n      if (\n        nonNull(tt._in.binop) > minPrec &&\n        !this.hasPrecedingLineBreak() &&\n        this.isContextual(\"as\")\n      ) {\n        const node: N.TsAsExpression = this.startNodeAt(\n          leftStartPos,\n          leftStartLoc,\n        );\n        node.expression = left;\n        const _const = this.tsTryNextParseConstantContext();\n        if (_const) {\n          node.typeAnnotation = _const;\n        } else {\n          node.typeAnnotation = this.tsNextThenParseType();\n        }\n        this.finishNode(node, \"TSAsExpression\");\n        return this.parseExprOp(\n          node,\n          leftStartPos,\n          leftStartLoc,\n          minPrec,\n          noIn,\n        );\n      }\n\n      return super.parseExprOp(left, leftStartPos, leftStartLoc, minPrec, noIn);\n    }\n\n    checkReservedWord(\n      word: string, // eslint-disable-line no-unused-vars\n      startLoc: number, // eslint-disable-line no-unused-vars\n      checkKeywords: boolean, // eslint-disable-line no-unused-vars\n      // eslint-disable-next-line no-unused-vars\n      isBinding: boolean,\n    ): void {\n      // Don't bother checking for TypeScript code.\n      // Strict mode words may be allowed as in `declare namespace N { const static: number; }`.\n      // And we have a type checker anyway, so don't bother having the parser do it.\n    }\n\n    /*\n    Don't bother doing this check in TypeScript code because:\n    1. We may have a nested export statement with the same name:\n      export const x = 0;\n      export namespace N {\n        export const x = 1;\n      }\n    2. We have a type checker to warn us about this sort of thing.\n    */\n    checkDuplicateExports() {}\n\n    parseImport(node: N.Node): N.AnyImport {\n      if (this.match(tt.name) || this.match(tt.star) || this.match(tt.braceL)) {\n        const ahead = this.lookahead();\n\n        if (this.match(tt.name) && ahead.type === tt.eq) {\n          return this.tsParseImportEqualsDeclaration(node);\n        }\n\n        if (\n          this.isContextual(\"type\") &&\n          // import type, { a } from \"b\";\n          ahead.type !== tt.comma &&\n          // import type from \"a\";\n          !(ahead.type === tt.name && ahead.value === \"from\")\n        ) {\n          node.importKind = \"type\";\n          this.next();\n        } else {\n          node.importKind = \"value\";\n        }\n      }\n\n      const importNode = super.parseImport(node);\n      /*:: invariant(importNode.type !== \"TSImportEqualsDeclaration\") */\n\n      // `import type` can only be used on imports with named imports or with a\n      // default import - but not both\n      if (\n        importNode.importKind === \"type\" &&\n        importNode.specifiers.length > 1 &&\n        importNode.specifiers[0].type === \"ImportDefaultSpecifier\"\n      ) {\n        this.raise(\n          importNode.start,\n          \"A type-only import can specify a default import or named bindings, but not both.\",\n        );\n      }\n\n      return importNode;\n    }\n\n    parseExport(node: N.Node): N.AnyExport {\n      if (this.match(tt._import)) {\n        // `export import A = B;`\n        this.expect(tt._import);\n        return this.tsParseImportEqualsDeclaration(node, /* isExport */ true);\n      } else if (this.eat(tt.eq)) {\n        // `export = x;`\n        const assign: N.TsExportAssignment = node;\n        assign.expression = this.parseExpression();\n        this.semicolon();\n        return this.finishNode(assign, \"TSExportAssignment\");\n      } else if (this.eatContextual(\"as\")) {\n        // `export as namespace A;`\n        const decl: N.TsNamespaceExportDeclaration = node;\n        // See `parseNamespaceExportDeclaration` in TypeScript's own parser\n        this.expectContextual(\"namespace\");\n        decl.id = this.parseIdentifier();\n        this.semicolon();\n        return this.finishNode(decl, \"TSNamespaceExportDeclaration\");\n      } else {\n        if (this.isContextual(\"type\") && this.lookahead().type === tt.braceL) {\n          this.next();\n          node.exportKind = \"type\";\n        } else {\n          node.exportKind = \"value\";\n        }\n\n        return super.parseExport(node);\n      }\n    }\n\n    isAbstractClass(): boolean {\n      return (\n        this.isContextual(\"abstract\") && this.lookahead().type === tt._class\n      );\n    }\n\n    parseExportDefaultExpression(): N.Expression | N.Declaration {\n      if (this.isAbstractClass()) {\n        const cls = this.startNode();\n        this.next(); // Skip \"abstract\"\n        this.parseClass(cls, true, true);\n        cls.abstract = true;\n        return cls;\n      }\n\n      // export default interface allowed in:\n      // https://github.com/Microsoft/TypeScript/pull/16040\n      if (this.state.value === \"interface\") {\n        const result = this.tsParseDeclaration(\n          this.startNode(),\n          this.state.value,\n          true,\n        );\n\n        if (result) return result;\n      }\n\n      return super.parseExportDefaultExpression();\n    }\n\n    parseStatementContent(context: ?string, topLevel: ?boolean): N.Statement {\n      if (this.state.type === tt._const) {\n        const ahead = this.lookahead();\n        if (ahead.type === tt.name && ahead.value === \"enum\") {\n          const node: N.TsEnumDeclaration = this.startNode();\n          this.expect(tt._const);\n          this.expectContextual(\"enum\");\n          return this.tsParseEnumDeclaration(node, /* isConst */ true);\n        }\n      }\n      return super.parseStatementContent(context, topLevel);\n    }\n\n    parseAccessModifier(): ?N.Accessibility {\n      return this.tsParseModifier([\"public\", \"protected\", \"private\"]);\n    }\n\n    parseClassMember(\n      classBody: N.ClassBody,\n      member: any,\n      state: { hadConstructor: boolean },\n      constructorAllowsSuper: boolean,\n    ): void {\n      this.tsParseModifiers(member, [\"declare\"]);\n      const accessibility = this.parseAccessModifier();\n      if (accessibility) member.accessibility = accessibility;\n      this.tsParseModifiers(member, [\"declare\"]);\n\n      super.parseClassMember(classBody, member, state, constructorAllowsSuper);\n    }\n\n    parseClassMemberWithIsStatic(\n      classBody: N.ClassBody,\n      member: N.ClassMember | N.TsIndexSignature,\n      state: { hadConstructor: boolean },\n      isStatic: boolean,\n      constructorAllowsSuper: boolean,\n    ): void {\n      this.tsParseModifiers(member, [\"abstract\", \"readonly\", \"declare\"]);\n\n      const idx = this.tsTryParseIndexSignature(member);\n      if (idx) {\n        classBody.body.push(idx);\n\n        if ((member: any).abstract) {\n          this.raise(member.start, TSErrors.IndexSignatureHasAbstract);\n        }\n        if (isStatic) {\n          this.raise(member.start, TSErrors.IndexSignatureHasStatic);\n        }\n        if ((member: any).accessibility) {\n          this.raise(\n            member.start,\n            TSErrors.IndexSignatureHasAccessibility,\n            (member: any).accessibility,\n          );\n        }\n\n        return;\n      }\n\n      /*:: invariant(member.type !== \"TSIndexSignature\") */\n\n      super.parseClassMemberWithIsStatic(\n        classBody,\n        member,\n        state,\n        isStatic,\n        constructorAllowsSuper,\n      );\n    }\n\n    parsePostMemberNameModifiers(\n      methodOrProp: N.ClassMethod | N.ClassProperty | N.ClassPrivateProperty,\n    ): void {\n      const optional = this.eat(tt.question);\n      if (optional) methodOrProp.optional = true;\n\n      if ((methodOrProp: any).readonly && this.match(tt.parenL)) {\n        this.raise(methodOrProp.start, TSErrors.ClassMethodHasReadonly);\n      }\n\n      if ((methodOrProp: any).declare && this.match(tt.parenL)) {\n        this.raise(methodOrProp.start, TSErrors.ClassMethodHasDeclare);\n      }\n    }\n\n    // Note: The reason we do this in `parseExpressionStatement` and not `parseStatement`\n    // is that e.g. `type()` is valid JS, so we must try parsing that first.\n    // If it's really a type, we will parse `type` as the statement, and can correct it here\n    // by parsing the rest.\n    parseExpressionStatement(\n      node: N.ExpressionStatement,\n      expr: N.Expression,\n    ): N.Statement {\n      const decl =\n        expr.type === \"Identifier\"\n          ? this.tsParseExpressionStatement(node, expr)\n          : undefined;\n      return decl || super.parseExpressionStatement(node, expr);\n    }\n\n    // export type\n    // Should be true for anything parsed by `tsTryParseExportDeclaration`.\n    shouldParseExportDeclaration(): boolean {\n      if (this.tsIsDeclarationStart()) return true;\n      return super.shouldParseExportDeclaration();\n    }\n\n    // An apparent conditional expression could actually be an optional parameter in an arrow function.\n    parseConditional(\n      expr: N.Expression,\n      noIn: ?boolean,\n      startPos: number,\n      startLoc: Position,\n      refNeedsArrowPos?: ?Pos,\n    ): N.Expression {\n      // only do the expensive clone if there is a question mark\n      // and if we come from inside parens\n      if (!refNeedsArrowPos || !this.match(tt.question)) {\n        return super.parseConditional(\n          expr,\n          noIn,\n          startPos,\n          startLoc,\n          refNeedsArrowPos,\n        );\n      }\n\n      const result = this.tryParse(() =>\n        super.parseConditional(expr, noIn, startPos, startLoc),\n      );\n\n      if (!result.node) {\n        // $FlowIgnore\n        refNeedsArrowPos.start = result.error.pos || this.state.start;\n        return expr;\n      }\n      if (result.error) this.state = result.failState;\n      return result.node;\n    }\n\n    // Note: These \"type casts\" are *not* valid TS expressions.\n    // But we parse them here and change them when completing the arrow function.\n    parseParenItem(\n      node: N.Expression,\n      startPos: number,\n      startLoc: Position,\n    ): N.Expression {\n      node = super.parseParenItem(node, startPos, startLoc);\n      if (this.eat(tt.question)) {\n        node.optional = true;\n        // Include questionmark in location of node\n        // Don't use this.finishNode() as otherwise we might process comments twice and\n        // include already consumed parens\n        this.resetEndLocation(node);\n      }\n\n      if (this.match(tt.colon)) {\n        const typeCastNode: N.TsTypeCastExpression = this.startNodeAt(\n          startPos,\n          startLoc,\n        );\n        typeCastNode.expression = node;\n        typeCastNode.typeAnnotation = this.tsParseTypeAnnotation();\n\n        return this.finishNode(typeCastNode, \"TSTypeCastExpression\");\n      }\n\n      return node;\n    }\n\n    parseExportDeclaration(node: N.ExportNamedDeclaration): ?N.Declaration {\n      // Store original location/position\n      const startPos = this.state.start;\n      const startLoc = this.state.startLoc;\n\n      // \"export declare\" is equivalent to just \"export\".\n      const isDeclare = this.eatContextual(\"declare\");\n\n      let declaration: ?N.Declaration;\n\n      if (this.match(tt.name)) {\n        declaration = this.tsTryParseExportDeclaration();\n      }\n      if (!declaration) {\n        declaration = super.parseExportDeclaration(node);\n      }\n      if (\n        declaration &&\n        (declaration.type === \"TSInterfaceDeclaration\" ||\n          declaration.type === \"TSTypeAliasDeclaration\" ||\n          isDeclare)\n      ) {\n        node.exportKind = \"type\";\n      }\n\n      if (declaration && isDeclare) {\n        // Reset location to include `declare` in range\n        this.resetStartLocation(declaration, startPos, startLoc);\n\n        declaration.declare = true;\n      }\n\n      return declaration;\n    }\n\n    parseClassId(\n      node: N.Class,\n      isStatement: boolean,\n      optionalId: ?boolean,\n    ): void {\n      if ((!isStatement || optionalId) && this.isContextual(\"implements\")) {\n        return;\n      }\n\n      super.parseClassId(\n        node,\n        isStatement,\n        optionalId,\n        (node: any).declare ? BIND_TS_AMBIENT : BIND_CLASS,\n      );\n      const typeParameters = this.tsTryParseTypeParameters();\n      if (typeParameters) node.typeParameters = typeParameters;\n    }\n\n    parseClassPropertyAnnotation(\n      node: N.ClassProperty | N.ClassPrivateProperty,\n    ): void {\n      if (!node.optional && this.eat(tt.bang)) {\n        node.definite = true;\n      }\n\n      const type = this.tsTryParseTypeAnnotation();\n      if (type) node.typeAnnotation = type;\n    }\n\n    parseClassProperty(node: N.ClassProperty): N.ClassProperty {\n      this.parseClassPropertyAnnotation(node);\n\n      if (node.declare && this.match(tt.equal)) {\n        this.raise(this.state.start, TSErrors.DeclareClassFieldHasInitializer);\n      }\n\n      return super.parseClassProperty(node);\n    }\n\n    parseClassPrivateProperty(\n      node: N.ClassPrivateProperty,\n    ): N.ClassPrivateProperty {\n      // $FlowIgnore\n      if (node.abstract) {\n        this.raise(node.start, TSErrors.PrivateElementHasAbstract);\n      }\n\n      // $FlowIgnore\n      if (node.accessibility) {\n        this.raise(\n          node.start,\n          TSErrors.PrivateElementHasAccessibility,\n          node.accessibility,\n        );\n      }\n\n      this.parseClassPropertyAnnotation(node);\n      return super.parseClassPrivateProperty(node);\n    }\n\n    pushClassMethod(\n      classBody: N.ClassBody,\n      method: N.ClassMethod,\n      isGenerator: boolean,\n      isAsync: boolean,\n      isConstructor: boolean,\n      allowsDirectSuper: boolean,\n    ): void {\n      const typeParameters = this.tsTryParseTypeParameters();\n      if (typeParameters) method.typeParameters = typeParameters;\n      super.pushClassMethod(\n        classBody,\n        method,\n        isGenerator,\n        isAsync,\n        isConstructor,\n        allowsDirectSuper,\n      );\n    }\n\n    pushClassPrivateMethod(\n      classBody: N.ClassBody,\n      method: N.ClassPrivateMethod,\n      isGenerator: boolean,\n      isAsync: boolean,\n    ): void {\n      const typeParameters = this.tsTryParseTypeParameters();\n      if (typeParameters) method.typeParameters = typeParameters;\n      super.pushClassPrivateMethod(classBody, method, isGenerator, isAsync);\n    }\n\n    parseClassSuper(node: N.Class): void {\n      super.parseClassSuper(node);\n      if (node.superClass && this.isRelational(\"<\")) {\n        node.superTypeParameters = this.tsParseTypeArguments();\n      }\n      if (this.eatContextual(\"implements\")) {\n        node.implements = this.tsParseHeritageClause(\"implements\");\n      }\n    }\n\n    parseObjPropValue(prop: N.ObjectMember, ...args): void {\n      const typeParameters = this.tsTryParseTypeParameters();\n      if (typeParameters) prop.typeParameters = typeParameters;\n\n      super.parseObjPropValue(prop, ...args);\n    }\n\n    parseFunctionParams(node: N.Function, allowModifiers?: boolean): void {\n      const typeParameters = this.tsTryParseTypeParameters();\n      if (typeParameters) node.typeParameters = typeParameters;\n      super.parseFunctionParams(node, allowModifiers);\n    }\n\n    // `let x: number;`\n    parseVarId(\n      decl: N.VariableDeclarator,\n      kind: \"var\" | \"let\" | \"const\",\n    ): void {\n      super.parseVarId(decl, kind);\n      if (decl.id.type === \"Identifier\" && this.eat(tt.bang)) {\n        decl.definite = true;\n      }\n\n      const type = this.tsTryParseTypeAnnotation();\n      if (type) {\n        decl.id.typeAnnotation = type;\n        this.resetEndLocation(decl.id); // set end position to end of type\n      }\n    }\n\n    // parse the return type of an async arrow function - let foo = (async (): number => {});\n    parseAsyncArrowFromCallExpression(\n      node: N.ArrowFunctionExpression,\n      call: N.CallExpression,\n    ): N.ArrowFunctionExpression {\n      if (this.match(tt.colon)) {\n        node.returnType = this.tsParseTypeAnnotation();\n      }\n      return super.parseAsyncArrowFromCallExpression(node, call);\n    }\n\n    parseMaybeAssign(...args): N.Expression {\n      // Note: When the JSX plugin is on, type assertions (`<T> x`) aren't valid syntax.\n\n      let state: ?State;\n      let jsx;\n      let typeCast;\n\n      if (this.match(tt.jsxTagStart)) {\n        // Prefer to parse JSX if possible. But may be an arrow fn.\n        state = this.state.clone();\n\n        jsx = this.tryParse(() => super.parseMaybeAssign(...args), state);\n        /*:: invariant(!jsx.aborted) */\n\n        if (!jsx.error) return jsx.node;\n\n        // Remove `tc.j_expr` and `tc.j_oTag` from context added\n        // by parsing `jsxTagStart` to stop the JSX plugin from\n        // messing with the tokens\n        const { context } = this.state;\n        if (context[context.length - 1] === ct.j_oTag) {\n          context.length -= 2;\n        } else if (context[context.length - 1] === ct.j_expr) {\n          context.length -= 1;\n        }\n      }\n\n      if (!(jsx && jsx.error) && !this.isRelational(\"<\")) {\n        return super.parseMaybeAssign(...args);\n      }\n\n      // Either way, we're looking at a '<': tt.jsxTagStart or relational.\n\n      let typeParameters: N.TsTypeParameterDeclaration;\n      state = state || this.state.clone();\n\n      const arrow = this.tryParse(abort => {\n        // This is similar to TypeScript's `tryParseParenthesizedArrowFunctionExpression`.\n        typeParameters = this.tsParseTypeParameters();\n        const expr = super.parseMaybeAssign(...args);\n\n        if (\n          expr.type !== \"ArrowFunctionExpression\" ||\n          (expr.extra && expr.extra.parenthesized)\n        ) {\n          abort();\n        }\n\n        // Correct TypeScript code should have at least 1 type parameter, but don't crash on bad code.\n        if (typeParameters && typeParameters.params.length !== 0) {\n          this.resetStartLocationFromNode(expr, typeParameters);\n        }\n        expr.typeParameters = typeParameters;\n        return expr;\n      }, state);\n\n      if (!arrow.error && !arrow.aborted) return arrow.node;\n\n      if (!jsx) {\n        // Try parsing a type cast instead of an arrow function.\n        // This will never happen outside of JSX.\n        // (Because in JSX the '<' should be a jsxTagStart and not a relational.\n        assert(!this.hasPlugin(\"jsx\"));\n\n        // This will start with a type assertion (via parseMaybeUnary).\n        // But don't directly call `this.tsParseTypeAssertion` because we want to handle any binary after it.\n        typeCast = this.tryParse(() => super.parseMaybeAssign(...args), state);\n        /*:: invariant(!typeCast.aborted) */\n        if (!typeCast.error) return typeCast.node;\n      }\n\n      if (jsx && jsx.node) {\n        /*:: invariant(jsx.failState) */\n        this.state = jsx.failState;\n        return jsx.node;\n      }\n\n      if (arrow.node) {\n        /*:: invariant(arrow.failState) */\n        this.state = arrow.failState;\n        return arrow.node;\n      }\n\n      if (typeCast && typeCast.node) {\n        /*:: invariant(typeCast.failState) */\n        this.state = typeCast.failState;\n        return typeCast.node;\n      }\n\n      if (jsx && jsx.thrown) throw jsx.error;\n      if (arrow.thrown) throw arrow.error;\n      if (typeCast && typeCast.thrown) throw typeCast.error;\n\n      throw (jsx && jsx.error) || arrow.error || (typeCast && typeCast.error);\n    }\n\n    // Handle type assertions\n    parseMaybeUnary(refExpressionErrors?: ?ExpressionErrors): N.Expression {\n      if (!this.hasPlugin(\"jsx\") && this.isRelational(\"<\")) {\n        return this.tsParseTypeAssertion();\n      } else {\n        return super.parseMaybeUnary(refExpressionErrors);\n      }\n    }\n\n    parseArrow(node: N.ArrowFunctionExpression): ?N.ArrowFunctionExpression {\n      if (this.match(tt.colon)) {\n        // This is different from how the TS parser does it.\n        // TS uses lookahead. The Babel Parser parses it as a parenthesized expression and converts.\n\n        const result = this.tryParse(abort => {\n          const returnType = this.tsParseTypeOrTypePredicateAnnotation(\n            tt.colon,\n          );\n          if (this.canInsertSemicolon() || !this.match(tt.arrow)) abort();\n          return returnType;\n        });\n\n        if (result.aborted) return;\n\n        if (!result.thrown) {\n          if (result.error) this.state = result.failState;\n          node.returnType = result.node;\n        }\n      }\n\n      return super.parseArrow(node);\n    }\n\n    // Allow type annotations inside of a parameter list.\n    parseAssignableListItemTypes(param: N.Pattern) {\n      if (this.eat(tt.question)) {\n        if (param.type !== \"Identifier\") {\n          this.raise(param.start, TSErrors.PatternIsOptional);\n        }\n\n        ((param: any): N.Identifier).optional = true;\n      }\n      const type = this.tsTryParseTypeAnnotation();\n      if (type) param.typeAnnotation = type;\n      this.resetEndLocation(param);\n\n      return param;\n    }\n\n    toAssignable(node: N.Node): N.Node {\n      switch (node.type) {\n        case \"TSTypeCastExpression\":\n          return super.toAssignable(this.typeCastToParameter(node));\n        case \"TSParameterProperty\":\n          return super.toAssignable(node);\n        case \"TSAsExpression\":\n        case \"TSNonNullExpression\":\n        case \"TSTypeAssertion\":\n          node.expression = this.toAssignable(node.expression);\n          return node;\n        default:\n          return super.toAssignable(node);\n      }\n    }\n\n    checkLVal(\n      expr: N.Expression,\n      bindingType: BindingTypes = BIND_NONE,\n      checkClashes: ?{ [key: string]: boolean },\n      contextDescription: string,\n    ): void {\n      switch (expr.type) {\n        case \"TSTypeCastExpression\":\n          // Allow \"typecasts\" to appear on the left of assignment expressions,\n          // because it may be in an arrow function.\n          // e.g. `const f = (foo: number = 0) => foo;`\n          return;\n        case \"TSParameterProperty\":\n          this.checkLVal(\n            expr.parameter,\n            bindingType,\n            checkClashes,\n            \"parameter property\",\n          );\n          return;\n        case \"TSAsExpression\":\n        case \"TSNonNullExpression\":\n        case \"TSTypeAssertion\":\n          this.checkLVal(\n            expr.expression,\n            bindingType,\n            checkClashes,\n            contextDescription,\n          );\n          return;\n        default:\n          super.checkLVal(expr, bindingType, checkClashes, contextDescription);\n          return;\n      }\n    }\n\n    parseBindingAtom(): N.Pattern {\n      switch (this.state.type) {\n        case tt._this:\n          // \"this\" may be the name of a parameter, so allow it.\n          return this.parseIdentifier(/* liberal */ true);\n        default:\n          return super.parseBindingAtom();\n      }\n    }\n\n    parseMaybeDecoratorArguments(expr: N.Expression): N.Expression {\n      if (this.isRelational(\"<\")) {\n        const typeArguments = this.tsParseTypeArguments();\n\n        if (this.match(tt.parenL)) {\n          const call = super.parseMaybeDecoratorArguments(expr);\n          call.typeParameters = typeArguments;\n          return call;\n        }\n\n        this.unexpected(this.state.start, tt.parenL);\n      }\n\n      return super.parseMaybeDecoratorArguments(expr);\n    }\n\n    // === === === === === === === === === === === === === === === ===\n    // Note: All below methods are duplicates of something in flow.js.\n    // Not sure what the best way to combine these is.\n    // === === === === === === === === === === === === === === === ===\n\n    isClassMethod(): boolean {\n      return this.isRelational(\"<\") || super.isClassMethod();\n    }\n\n    isClassProperty(): boolean {\n      return (\n        this.match(tt.bang) || this.match(tt.colon) || super.isClassProperty()\n      );\n    }\n\n    parseMaybeDefault(...args): N.Pattern {\n      const node = super.parseMaybeDefault(...args);\n\n      if (\n        node.type === \"AssignmentPattern\" &&\n        node.typeAnnotation &&\n        node.right.start < node.typeAnnotation.start\n      ) {\n        this.raise(\n          node.typeAnnotation.start,\n          TSErrors.TypeAnnotationAfterAssign,\n        );\n      }\n\n      return node;\n    }\n\n    // ensure that inside types, we bypass the jsx parser plugin\n    getTokenFromCode(code: number): void {\n      if (this.state.inType && (code === 62 || code === 60)) {\n        return this.finishOp(tt.relational, 1);\n      } else {\n        return super.getTokenFromCode(code);\n      }\n    }\n\n    toAssignableList(exprList: N.Expression[]): $ReadOnlyArray<N.Pattern> {\n      for (let i = 0; i < exprList.length; i++) {\n        const expr = exprList[i];\n        if (!expr) continue;\n        switch (expr.type) {\n          case \"TSTypeCastExpression\":\n            exprList[i] = this.typeCastToParameter(expr);\n            break;\n          case \"TSAsExpression\":\n          case \"TSTypeAssertion\":\n            if (!this.state.maybeInArrowParameters) {\n              exprList[i] = this.typeCastToParameter(expr);\n            } else {\n              this.raise(expr.start, TSErrors.UnexpectedTypeCastInParameter);\n            }\n            break;\n        }\n      }\n      return super.toAssignableList(...arguments);\n    }\n\n    typeCastToParameter(node: N.TsTypeCastExpression): N.Node {\n      node.expression.typeAnnotation = node.typeAnnotation;\n\n      this.resetEndLocation(\n        node.expression,\n        node.typeAnnotation.end,\n        node.typeAnnotation.loc.end,\n      );\n\n      return node.expression;\n    }\n\n    toReferencedList(\n      exprList: $ReadOnlyArray<?N.Expression>,\n      isInParens?: boolean, // eslint-disable-line no-unused-vars\n    ): $ReadOnlyArray<?N.Expression> {\n      for (let i = 0; i < exprList.length; i++) {\n        const expr = exprList[i];\n        if (expr && expr.type === \"TSTypeCastExpression\") {\n          this.raise(expr.start, TSErrors.UnexpectedTypeAnnotation);\n        }\n      }\n\n      return exprList;\n    }\n\n    shouldParseArrow() {\n      return this.match(tt.colon) || super.shouldParseArrow();\n    }\n\n    shouldParseAsyncArrow(): boolean {\n      return this.match(tt.colon) || super.shouldParseAsyncArrow();\n    }\n\n    canHaveLeadingDecorator() {\n      // Avoid unnecessary lookahead in checking for abstract class unless needed!\n      return super.canHaveLeadingDecorator() || this.isAbstractClass();\n    }\n\n    jsxParseOpeningElementAfterName(\n      node: N.JSXOpeningElement,\n    ): N.JSXOpeningElement {\n      if (this.isRelational(\"<\")) {\n        const typeArguments = this.tsTryParseAndCatch(() =>\n          this.tsParseTypeArguments(),\n        );\n        if (typeArguments) node.typeParameters = typeArguments;\n      }\n      return super.jsxParseOpeningElementAfterName(node);\n    }\n\n    getGetterSetterExpectedParamCount(\n      method: N.ObjectMethod | N.ClassMethod,\n    ): number {\n      const baseCount = super.getGetterSetterExpectedParamCount(method);\n      const firstParam = method.params[0];\n      const hasContextParam =\n        firstParam &&\n        firstParam.type === \"Identifier\" &&\n        firstParam.name === \"this\";\n\n      return hasContextParam ? baseCount + 1 : baseCount;\n    }\n  };\n","// @flow\n\nimport * as charCodes from \"charcodes\";\n\nimport { types as tt, TokenType } from \"../tokenizer/types\";\nimport type Parser from \"../parser\";\nimport * as N from \"../types\";\n\ntt.placeholder = new TokenType(\"%%\", { startsExpr: true });\n\nexport type PlaceholderTypes =\n  | \"Identifier\"\n  | \"StringLiteral\"\n  | \"Expression\"\n  | \"Statement\"\n  | \"Declaration\"\n  | \"BlockStatement\"\n  | \"ClassBody\"\n  | \"Pattern\";\n\n// $PropertyType doesn't support enums. Use a fake \"switch\" (GetPlaceholderNode)\n//type MaybePlaceholder<T: PlaceholderTypes> = $PropertyType<N, T> | N.Placeholder<T>;\n\ntype _Switch<Value, Cases, Index> = $Call<\n  (\n    $ElementType<$ElementType<Cases, Index>, 0>,\n  ) => $ElementType<$ElementType<Cases, Index>, 1>,\n  Value,\n>;\ntype $Switch<Value, Cases> = _Switch<Value, Cases, *>;\n\ntype NodeOf<T: PlaceholderTypes> = $Switch<\n  T,\n  [\n    [\"Identifier\", N.Identifier],\n    [\"StringLiteral\", N.StringLiteral],\n    [\"Expression\", N.Expression],\n    [\"Statement\", N.Statement],\n    [\"Declaration\", N.Declaration],\n    [\"BlockStatement\", N.BlockStatement],\n    [\"ClassBody\", N.ClassBody],\n    [\"Pattern\", N.Pattern],\n  ],\n>;\n\n// Placeholder<T> breaks everything, because its type is incompatible with\n// the substituted nodes.\ntype MaybePlaceholder<T: PlaceholderTypes> = NodeOf<T>; // | Placeholder<T>\n\nexport default (superClass: Class<Parser>): Class<Parser> =>\n  class extends superClass {\n    parsePlaceholder<T: PlaceholderTypes>(\n      expectedNode: T,\n    ): /*?N.Placeholder<T>*/ ?MaybePlaceholder<T> {\n      if (this.match(tt.placeholder)) {\n        const node = this.startNode();\n        this.next();\n        this.assertNoSpace(\"Unexpected space in placeholder.\");\n\n        // We can't use this.parseIdentifier because\n        // we don't want nested placeholders.\n        node.name = super.parseIdentifier(/* liberal */ true);\n\n        this.assertNoSpace(\"Unexpected space in placeholder.\");\n        this.expect(tt.placeholder);\n        return this.finishPlaceholder(node, expectedNode);\n      }\n    }\n\n    finishPlaceholder<T: PlaceholderTypes>(\n      node: N.Node,\n      expectedNode: T,\n    ): /*N.Placeholder<T>*/ MaybePlaceholder<T> {\n      const isFinished = !!(node.expectedNode && node.type === \"Placeholder\");\n      node.expectedNode = expectedNode;\n\n      return isFinished ? node : this.finishNode(node, \"Placeholder\");\n    }\n\n    /* ============================================================ *\n     * tokenizer/index.js                                           *\n     * ============================================================ */\n\n    getTokenFromCode(code: number) {\n      if (\n        code === charCodes.percentSign &&\n        this.input.charCodeAt(this.state.pos + 1) === charCodes.percentSign\n      ) {\n        return this.finishOp(tt.placeholder, 2);\n      }\n\n      return super.getTokenFromCode(...arguments);\n    }\n\n    /* ============================================================ *\n     * parser/expression.js                                         *\n     * ============================================================ */\n\n    parseExprAtom(): MaybePlaceholder<\"Expression\"> {\n      return (\n        this.parsePlaceholder(\"Expression\") || super.parseExprAtom(...arguments)\n      );\n    }\n\n    parseIdentifier(): MaybePlaceholder<\"Identifier\"> {\n      // NOTE: This function only handles identifiers outside of\n      // expressions and binding patterns, since they are already\n      // handled by the parseExprAtom and parseBindingAtom functions.\n      // This is needed, for example, to parse \"class %%NAME%% {}\".\n      return (\n        this.parsePlaceholder(\"Identifier\") ||\n        super.parseIdentifier(...arguments)\n      );\n    }\n\n    checkReservedWord(word: string): void {\n      // Sometimes we call #checkReservedWord(node.name), expecting\n      // that node is an Identifier. If it is a Placeholder, name\n      // will be undefined.\n      if (word !== undefined) super.checkReservedWord(...arguments);\n    }\n\n    /* ============================================================ *\n     * parser/lval.js                                               *\n     * ============================================================ */\n\n    parseBindingAtom(): MaybePlaceholder<\"Pattern\"> {\n      return (\n        this.parsePlaceholder(\"Pattern\") || super.parseBindingAtom(...arguments)\n      );\n    }\n\n    checkLVal(expr: N.Expression): void {\n      if (expr.type !== \"Placeholder\") super.checkLVal(...arguments);\n    }\n\n    toAssignable(node: N.Node): N.Node {\n      if (\n        node &&\n        node.type === \"Placeholder\" &&\n        node.expectedNode === \"Expression\"\n      ) {\n        node.expectedNode = \"Pattern\";\n        return node;\n      }\n      return super.toAssignable(...arguments);\n    }\n\n    /* ============================================================ *\n     * parser/statement.js                                          *\n     * ============================================================ */\n\n    verifyBreakContinue(node: N.BreakStatement | N.ContinueStatement) {\n      if (node.label && node.label.type === \"Placeholder\") return;\n      super.verifyBreakContinue(...arguments);\n    }\n\n    parseExpressionStatement(\n      node: MaybePlaceholder<\"Statement\">,\n      expr: N.Expression,\n    ): MaybePlaceholder<\"Statement\"> {\n      if (\n        expr.type !== \"Placeholder\" ||\n        (expr.extra && expr.extra.parenthesized)\n      ) {\n        return super.parseExpressionStatement(...arguments);\n      }\n\n      if (this.match(tt.colon)) {\n        const stmt: N.LabeledStatement = node;\n        stmt.label = this.finishPlaceholder(expr, \"Identifier\");\n        this.next();\n        stmt.body = this.parseStatement(\"label\");\n        return this.finishNode(stmt, \"LabeledStatement\");\n      }\n\n      this.semicolon();\n\n      node.name = expr.name;\n      return this.finishPlaceholder(node, \"Statement\");\n    }\n\n    parseBlock(): MaybePlaceholder<\"BlockStatement\"> {\n      return (\n        this.parsePlaceholder(\"BlockStatement\") ||\n        super.parseBlock(...arguments)\n      );\n    }\n\n    parseFunctionId(): ?MaybePlaceholder<\"Identifier\"> {\n      return (\n        this.parsePlaceholder(\"Identifier\") ||\n        super.parseFunctionId(...arguments)\n      );\n    }\n\n    parseClass<T: N.Class>(\n      node: T,\n      isStatement: /* T === ClassDeclaration */ boolean,\n      optionalId?: boolean,\n    ): T {\n      const type = isStatement ? \"ClassDeclaration\" : \"ClassExpression\";\n\n      this.next();\n      this.takeDecorators(node);\n\n      const placeholder = this.parsePlaceholder(\"Identifier\");\n      if (placeholder) {\n        if (\n          this.match(tt._extends) ||\n          this.match(tt.placeholder) ||\n          this.match(tt.braceL)\n        ) {\n          node.id = placeholder;\n        } else if (optionalId || !isStatement) {\n          node.id = null;\n          node.body = this.finishPlaceholder(placeholder, \"ClassBody\");\n          return this.finishNode(node, type);\n        } else {\n          this.unexpected(null, \"A class name is required\");\n        }\n      } else {\n        this.parseClassId(node, isStatement, optionalId);\n      }\n\n      this.parseClassSuper(node);\n      node.body =\n        this.parsePlaceholder(\"ClassBody\") ||\n        this.parseClassBody(!!node.superClass);\n      return this.finishNode(node, type);\n    }\n\n    parseExport(node: N.Node): N.Node {\n      const placeholder = this.parsePlaceholder(\"Identifier\");\n      if (!placeholder) return super.parseExport(...arguments);\n\n      if (!this.isContextual(\"from\") && !this.match(tt.comma)) {\n        // export %%DECL%%;\n        node.specifiers = [];\n        node.source = null;\n        node.declaration = this.finishPlaceholder(placeholder, \"Declaration\");\n        return this.finishNode(node, \"ExportNamedDeclaration\");\n      }\n\n      // export %%NAME%% from \"foo\";\n      this.expectPlugin(\"exportDefaultFrom\");\n      const specifier = this.startNode();\n      specifier.exported = placeholder;\n      node.specifiers = [this.finishNode(specifier, \"ExportDefaultSpecifier\")];\n\n      return super.parseExport(node);\n    }\n\n    maybeParseExportDefaultSpecifier(node: N.Node): boolean {\n      if (node.specifiers && node.specifiers.length > 0) {\n        // \"export %%NAME%%\" has already been parsed by #parseExport.\n        return true;\n      }\n      return super.maybeParseExportDefaultSpecifier(...arguments);\n    }\n\n    checkExport(node: N.ExportNamedDeclaration): void {\n      const { specifiers } = node;\n      if (specifiers && specifiers.length) {\n        node.specifiers = specifiers.filter(\n          node => node.exported.type === \"Placeholder\",\n        );\n      }\n      super.checkExport(node);\n      node.specifiers = specifiers;\n    }\n\n    parseImport(\n      node: N.Node,\n    ): N.ImportDeclaration | N.TsImportEqualsDeclaration {\n      const placeholder = this.parsePlaceholder(\"Identifier\");\n      if (!placeholder) return super.parseImport(...arguments);\n\n      node.specifiers = [];\n\n      if (!this.isContextual(\"from\") && !this.match(tt.comma)) {\n        // import %%STRING%%;\n        node.source = this.finishPlaceholder(placeholder, \"StringLiteral\");\n        this.semicolon();\n        return this.finishNode(node, \"ImportDeclaration\");\n      }\n\n      // import %%DEFAULT%% ...\n      const specifier = this.startNodeAtNode(placeholder);\n      specifier.local = placeholder;\n      this.finishNode(specifier, \"ImportDefaultSpecifier\");\n      node.specifiers.push(specifier);\n\n      if (this.eat(tt.comma)) {\n        // import %%DEFAULT%%, * as ...\n        const hasStarImport = this.maybeParseStarImportSpecifier(node);\n\n        // import %%DEFAULT%%, { ...\n        if (!hasStarImport) this.parseNamedImportSpecifiers(node);\n      }\n\n      this.expectContextual(\"from\");\n      node.source = this.parseImportSource();\n      this.semicolon();\n      return this.finishNode(node, \"ImportDeclaration\");\n    }\n\n    parseImportSource(): MaybePlaceholder<\"StringLiteral\"> {\n      // import ... from %%STRING%%;\n\n      return (\n        this.parsePlaceholder(\"StringLiteral\") ||\n        super.parseImportSource(...arguments)\n      );\n    }\n  };\n","import type Parser from \"../parser\";\nimport { types as tt } from \"../tokenizer/types\";\nimport * as N from \"../types\";\n\nexport default (superClass: Class<Parser>): Class<Parser> =>\n  class extends superClass {\n    parseV8Intrinsic(): N.Expression {\n      if (this.match(tt.modulo)) {\n        const v8IntrinsicStart = this.state.start;\n        // let the `loc` of Identifier starts from `%`\n        const node = this.startNode();\n        this.eat(tt.modulo);\n        if (this.match(tt.name)) {\n          const name = this.parseIdentifierName(this.state.start);\n          const identifier = this.createIdentifier(node, name);\n          identifier.type = \"V8IntrinsicIdentifier\";\n          if (this.match(tt.parenL)) {\n            return identifier;\n          }\n        }\n        this.unexpected(v8IntrinsicStart);\n      }\n    }\n\n    /* ============================================================ *\n     * parser/expression.js                                         *\n     * ============================================================ */\n\n    parseExprAtom(): N.Expression {\n      return this.parseV8Intrinsic() || super.parseExprAtom(...arguments);\n    }\n  };\n","// @flow\n\nimport type Parser from \"./parser\";\n\nexport type Plugin = string | [string, Object];\n\nexport type PluginList = $ReadOnlyArray<Plugin>;\n\nexport type MixinPlugin = (superClass: Class<Parser>) => Class<Parser>;\n\nexport function hasPlugin(plugins: PluginList, name: string): boolean {\n  return plugins.some(plugin => {\n    if (Array.isArray(plugin)) {\n      return plugin[0] === name;\n    } else {\n      return plugin === name;\n    }\n  });\n}\n\nexport function getPluginOption(\n  plugins: PluginList,\n  name: string,\n  option: string,\n) {\n  const plugin = plugins.find(plugin => {\n    if (Array.isArray(plugin)) {\n      return plugin[0] === name;\n    } else {\n      return plugin === name;\n    }\n  });\n\n  if (plugin && Array.isArray(plugin)) {\n    return plugin[1][option];\n  }\n\n  return null;\n}\n\nconst PIPELINE_PROPOSALS = [\"minimal\", \"smart\", \"fsharp\"];\nconst RECORD_AND_TUPLE_SYNTAX_TYPES = [\"hash\", \"bar\"];\n\nexport function validatePlugins(plugins: PluginList) {\n  if (hasPlugin(plugins, \"decorators\")) {\n    if (hasPlugin(plugins, \"decorators-legacy\")) {\n      throw new Error(\n        \"Cannot use the decorators and decorators-legacy plugin together\",\n      );\n    }\n\n    const decoratorsBeforeExport = getPluginOption(\n      plugins,\n      \"decorators\",\n      \"decoratorsBeforeExport\",\n    );\n    if (decoratorsBeforeExport == null) {\n      throw new Error(\n        \"The 'decorators' plugin requires a 'decoratorsBeforeExport' option,\" +\n          \" whose value must be a boolean. If you are migrating from\" +\n          \" Babylon/Babel 6 or want to use the old decorators proposal, you\" +\n          \" should use the 'decorators-legacy' plugin instead of 'decorators'.\",\n      );\n    } else if (typeof decoratorsBeforeExport !== \"boolean\") {\n      throw new Error(\"'decoratorsBeforeExport' must be a boolean.\");\n    }\n  }\n\n  if (hasPlugin(plugins, \"flow\") && hasPlugin(plugins, \"typescript\")) {\n    throw new Error(\"Cannot combine flow and typescript plugins.\");\n  }\n\n  if (hasPlugin(plugins, \"placeholders\") && hasPlugin(plugins, \"v8intrinsic\")) {\n    throw new Error(\"Cannot combine placeholders and v8intrinsic plugins.\");\n  }\n\n  if (\n    hasPlugin(plugins, \"pipelineOperator\") &&\n    !PIPELINE_PROPOSALS.includes(\n      getPluginOption(plugins, \"pipelineOperator\", \"proposal\"),\n    )\n  ) {\n    throw new Error(\n      \"'pipelineOperator' requires 'proposal' option whose value should be one of: \" +\n        PIPELINE_PROPOSALS.map(p => `'${p}'`).join(\", \"),\n    );\n  }\n\n  if (\n    hasPlugin(plugins, \"recordAndTuple\") &&\n    !RECORD_AND_TUPLE_SYNTAX_TYPES.includes(\n      getPluginOption(plugins, \"recordAndTuple\", \"syntaxType\"),\n    )\n  ) {\n    throw new Error(\n      \"'recordAndTuple' requires 'syntaxType' option whose value should be one of: \" +\n        RECORD_AND_TUPLE_SYNTAX_TYPES.map(p => `'${p}'`).join(\", \"),\n    );\n  }\n}\n\n// These plugins are defined using a mixin which extends the parser class.\n\nimport estree from \"./plugins/estree\";\nimport flow from \"./plugins/flow\";\nimport jsx from \"./plugins/jsx\";\nimport typescript from \"./plugins/typescript\";\nimport placeholders from \"./plugins/placeholders\";\nimport v8intrinsic from \"./plugins/v8intrinsic\";\n\n// NOTE: order is important. estree must come first; placeholders must come last.\nexport const mixinPlugins: { [name: string]: MixinPlugin } = {\n  estree,\n  jsx,\n  flow,\n  typescript,\n  v8intrinsic,\n  placeholders,\n};\n\nexport const mixinPluginNames: $ReadOnlyArray<string> = Object.keys(\n  mixinPlugins,\n);\n","// @flow\n\nimport type { PluginList } from \"./plugin-utils\";\n\n// A second optional argument can be given to further configure\n// the parser process. These options are recognized:\n\nexport type SourceType = \"script\" | \"module\" | \"unambiguous\";\n\nexport type Options = {\n  sourceType: SourceType,\n  sourceFilename?: string,\n  startLine: number,\n  allowAwaitOutsideFunction: boolean,\n  allowReturnOutsideFunction: boolean,\n  allowImportExportEverywhere: boolean,\n  allowSuperOutsideMethod: boolean,\n  allowUndeclaredExports: boolean,\n  plugins: PluginList,\n  strictMode: ?boolean,\n  ranges: boolean,\n  tokens: boolean,\n  createParenthesizedExpressions: boolean,\n  errorRecovery: boolean,\n};\n\nexport const defaultOptions: Options = {\n  // Source type (\"script\" or \"module\") for different semantics\n  sourceType: \"script\",\n  // Source filename.\n  sourceFilename: undefined,\n  // Line from which to start counting source. Useful for\n  // integration with other tools.\n  startLine: 1,\n  // When enabled, await at the top level is not considered an\n  // error.\n  allowAwaitOutsideFunction: false,\n  // When enabled, a return at the top level is not considered an\n  // error.\n  allowReturnOutsideFunction: false,\n  // When enabled, import/export statements are not constrained to\n  // appearing at the top of the program.\n  allowImportExportEverywhere: false,\n  // TODO\n  allowSuperOutsideMethod: false,\n  // When enabled, export statements can reference undeclared variables.\n  allowUndeclaredExports: false,\n  // An array of plugins to enable\n  plugins: [],\n  // TODO\n  strictMode: null,\n  // Nodes have their start and end characters offsets recorded in\n  // `start` and `end` properties (directly on the node, rather than\n  // the `loc` object, which holds line/column data. To also add a\n  // [semi-standardized][range] `range` property holding a `[start,\n  // end]` array with the same numbers, set the `ranges` option to\n  // `true`.\n  //\n  // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678\n  ranges: false,\n  // Adds all parsed tokens to a `tokens` property on the `File` node\n  tokens: false,\n  // Whether to create ParenthesizedExpression AST nodes (if false\n  // the parser sets extra.parenthesized on the expression nodes instead).\n  createParenthesizedExpressions: false,\n  // When enabled, errors are attached to the AST instead of being directly thrown.\n  // Some errors will still throw, because @babel/parser can't always recover.\n  errorRecovery: false,\n};\n\n// Interpret and default an options object\n\nexport function getOptions(opts: ?Options): Options {\n  const options: any = {};\n  for (const key of Object.keys(defaultOptions)) {\n    options[key] = opts && opts[key] != null ? opts[key] : defaultOptions[key];\n  }\n  return options;\n}\n","// @flow\n\nimport type { Options } from \"../options\";\nimport * as N from \"../types\";\nimport { Position } from \"../util/location\";\n\nimport { types as ct, type TokContext } from \"./context\";\nimport { types as tt, type TokenType } from \"./types\";\n\ntype TopicContextState = {\n  // When a topic binding has been currently established,\n  // then this is 1. Otherwise, it is 0. This is forwards compatible\n  // with a future plugin for multiple lexical topics.\n  maxNumOfResolvableTopics: number,\n\n  // When a topic binding has been currently established, and if that binding\n  // has been used as a topic reference `#`, then this is 0. Otherwise, it is\n  // `null`. This is forwards compatible with a future plugin for multiple\n  // lexical topics.\n  maxTopicIndex: null | 0,\n};\n\nexport default class State {\n  strict: boolean;\n  curLine: number;\n\n  // And, if locations are used, the {line, column} object\n  // corresponding to those offsets\n  startLoc: Position;\n  endLoc: Position;\n\n  init(options: Options): void {\n    this.strict =\n      options.strictMode === false ? false : options.sourceType === \"module\";\n\n    this.curLine = options.startLine;\n    this.startLoc = this.endLoc = this.curPosition();\n  }\n\n  errors: SyntaxError[] = [];\n\n  // Used to signify the start of a potential arrow function\n  potentialArrowAt: number = -1;\n\n  // Used to signify the start of an expression which looks like a\n  // typed arrow function, but it isn't\n  // e.g. a ? (b) : c => d\n  //          ^\n  noArrowAt: number[] = [];\n\n  // Used to signify the start of an expression whose params, if it looks like\n  // an arrow function, shouldn't be converted to assignable nodes.\n  // This is used to defer the validation of typed arrow functions inside\n  // conditional expressions.\n  // e.g. a ? (b) : c => d\n  //          ^\n  noArrowParamsConversionAt: number[] = [];\n\n  // Flags to track\n  inParameters: boolean = false;\n  maybeInArrowParameters: boolean = false;\n  // This flag is used to track async arrow head across function declarations.\n  // e.g. async (foo = function (await) {}) => {}\n  // When parsing `await` in this expression, `maybeInAsyncArrowHead` is true\n  // but `maybeInArrowParameters` is false\n  maybeInAsyncArrowHead: boolean = false;\n  inPipeline: boolean = false;\n  inType: boolean = false;\n  noAnonFunctionType: boolean = false;\n  inPropertyName: boolean = false;\n  hasFlowComment: boolean = false;\n  isIterator: boolean = false;\n\n  // For the smartPipelines plugin:\n  topicContext: TopicContextState = {\n    maxNumOfResolvableTopics: 0,\n    maxTopicIndex: null,\n  };\n\n  // For the F# plugin\n  soloAwait: boolean = false;\n  inFSharpPipelineDirectBody: boolean = false;\n\n  // Labels in scope.\n  labels: Array<{\n    kind: ?(\"loop\" | \"switch\"),\n    name?: ?string,\n    statementStart?: number,\n  }> = [];\n\n  // Leading decorators. Last element of the stack represents the decorators in current context.\n  // Supports nesting of decorators, e.g. @foo(@bar class inner {}) class outer {}\n  // where @foo belongs to the outer class and @bar to the inner\n  decoratorStack: Array<Array<N.Decorator>> = [[]];\n\n  // Positions to delayed-check that yield/await does not exist in default parameters.\n  yieldPos: number = -1;\n  awaitPos: number = -1;\n\n  // Comment store.\n  comments: Array<N.Comment> = [];\n\n  // Comment attachment store\n  trailingComments: Array<N.Comment> = [];\n  leadingComments: Array<N.Comment> = [];\n  commentStack: Array<{\n    start: number,\n    leadingComments: ?Array<N.Comment>,\n    trailingComments: ?Array<N.Comment>,\n    type: string,\n  }> = [];\n  // $FlowIgnore this is initialized when the parser starts.\n  commentPreviousNode: N.Node = null;\n\n  // The current position of the tokenizer in the input.\n  pos: number = 0;\n  lineStart: number = 0;\n\n  // Properties of the current token:\n  // Its type\n  type: TokenType = tt.eof;\n\n  // For tokens that include more information than their type, the value\n  value: any = null;\n\n  // Its start and end offset\n  start: number = 0;\n  end: number = 0;\n\n  // Position information for the previous token\n  // $FlowIgnore this is initialized when generating the second token.\n  lastTokEndLoc: Position = null;\n  // $FlowIgnore this is initialized when generating the second token.\n  lastTokStartLoc: Position = null;\n  lastTokStart: number = 0;\n  lastTokEnd: number = 0;\n\n  // The context stack is used to superficially track syntactic\n  // context to predict whether a regular expression is allowed in a\n  // given position.\n  context: Array<TokContext> = [ct.braceStatement];\n  exprAllowed: boolean = true;\n\n  // Used to signal to callers of `readWord1` whether the word\n  // contained any escape sequences. This is needed because words with\n  // escape sequences must not be interpreted as keywords.\n  containsEsc: boolean = false;\n\n  // This property is used to throw an error for\n  // an octal literal in a directive that occurs prior\n  // to a \"use strict\" directive.\n  octalPositions: number[] = [];\n\n  // Names of exports store. `default` is stored as a name for both\n  // `export default foo;` and `export { foo as default };`.\n  exportedIdentifiers: Array<string> = [];\n\n  // Tokens length in token store\n  tokensLength: number = 0;\n\n  curPosition(): Position {\n    return new Position(this.curLine, this.pos - this.lineStart);\n  }\n\n  clone(skipArrays?: boolean): State {\n    const state = new State();\n    const keys = Object.keys(this);\n    for (let i = 0, length = keys.length; i < length; i++) {\n      const key = keys[i];\n      // $FlowIgnore\n      let val = this[key];\n\n      if (!skipArrays && Array.isArray(val)) {\n        val = val.slice();\n      }\n\n      // $FlowIgnore\n      state[key] = val;\n    }\n\n    return state;\n  }\n}\n","// @flow\n\nimport type { Options } from \"../options\";\nimport * as N from \"../types\";\nimport type { Position } from \"../util/location\";\nimport * as charCodes from \"charcodes\";\nimport { isIdentifierStart, isIdentifierChar } from \"../util/identifier\";\nimport { types as tt, keywords as keywordTypes, type TokenType } from \"./types\";\nimport { type TokContext, types as ct } from \"./context\";\nimport LocationParser, { Errors } from \"../parser/location\";\nimport { SourceLocation } from \"../util/location\";\nimport {\n  lineBreak,\n  lineBreakG,\n  isNewLine,\n  isWhitespace,\n  skipWhiteSpace,\n} from \"../util/whitespace\";\nimport State from \"./state\";\n\nconst VALID_REGEX_FLAGS = new Set([\"g\", \"m\", \"s\", \"i\", \"y\", \"u\"]);\n\n// The following character codes are forbidden from being\n// an immediate sibling of NumericLiteralSeparator _\n\nconst forbiddenNumericSeparatorSiblings = {\n  decBinOct: [\n    charCodes.dot,\n    charCodes.uppercaseB,\n    charCodes.uppercaseE,\n    charCodes.uppercaseO,\n    charCodes.underscore, // multiple separators are not allowed\n    charCodes.lowercaseB,\n    charCodes.lowercaseE,\n    charCodes.lowercaseO,\n  ],\n  hex: [\n    charCodes.dot,\n    charCodes.uppercaseX,\n    charCodes.underscore, // multiple separators are not allowed\n    charCodes.lowercaseX,\n  ],\n};\n\nconst allowedNumericSeparatorSiblings = {};\nallowedNumericSeparatorSiblings.bin = [\n  // 0 - 1\n  charCodes.digit0,\n  charCodes.digit1,\n];\nallowedNumericSeparatorSiblings.oct = [\n  // 0 - 7\n  ...allowedNumericSeparatorSiblings.bin,\n\n  charCodes.digit2,\n  charCodes.digit3,\n  charCodes.digit4,\n  charCodes.digit5,\n  charCodes.digit6,\n  charCodes.digit7,\n];\nallowedNumericSeparatorSiblings.dec = [\n  // 0 - 9\n  ...allowedNumericSeparatorSiblings.oct,\n\n  charCodes.digit8,\n  charCodes.digit9,\n];\n\nallowedNumericSeparatorSiblings.hex = [\n  // 0 - 9, A - F, a - f,\n  ...allowedNumericSeparatorSiblings.dec,\n\n  charCodes.uppercaseA,\n  charCodes.uppercaseB,\n  charCodes.uppercaseC,\n  charCodes.uppercaseD,\n  charCodes.uppercaseE,\n  charCodes.uppercaseF,\n\n  charCodes.lowercaseA,\n  charCodes.lowercaseB,\n  charCodes.lowercaseC,\n  charCodes.lowercaseD,\n  charCodes.lowercaseE,\n  charCodes.lowercaseF,\n];\n\n// Object type used to represent tokens. Note that normally, tokens\n// simply exist as properties on the parser object. This is only\n// used for the onToken callback and the external tokenizer.\n\nexport class Token {\n  constructor(state: State) {\n    this.type = state.type;\n    this.value = state.value;\n    this.start = state.start;\n    this.end = state.end;\n    this.loc = new SourceLocation(state.startLoc, state.endLoc);\n  }\n\n  type: TokenType;\n  value: any;\n  start: number;\n  end: number;\n  loc: SourceLocation;\n}\n\n// ## Tokenizer\n\nexport default class Tokenizer extends LocationParser {\n  // Forward-declarations\n  // parser/util.js\n  /*::\n  +unexpected: (pos?: ?number, messageOrType?: string | TokenType) => empty;\n  */\n\n  isLookahead: boolean;\n\n  // Token store.\n  tokens: Array<Token | N.Comment> = [];\n\n  constructor(options: Options, input: string) {\n    super();\n    this.state = new State();\n    this.state.init(options);\n    this.input = input;\n    this.length = input.length;\n    this.isLookahead = false;\n  }\n\n  pushToken(token: Token | N.Comment) {\n    // Pop out invalid tokens trapped by try-catch parsing.\n    // Those parsing branches are mainly created by typescript and flow plugins.\n    this.tokens.length = this.state.tokensLength;\n    this.tokens.push(token);\n    ++this.state.tokensLength;\n  }\n\n  // Move to the next token\n\n  next(): void {\n    if (!this.isLookahead) {\n      this.checkKeywordEscapes();\n      if (this.options.tokens) {\n        this.pushToken(new Token(this.state));\n      }\n    }\n\n    this.state.lastTokEnd = this.state.end;\n    this.state.lastTokStart = this.state.start;\n    this.state.lastTokEndLoc = this.state.endLoc;\n    this.state.lastTokStartLoc = this.state.startLoc;\n    this.nextToken();\n  }\n\n  // TODO\n\n  eat(type: TokenType): boolean {\n    if (this.match(type)) {\n      this.next();\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  // TODO\n\n  match(type: TokenType): boolean {\n    return this.state.type === type;\n  }\n\n  // TODO\n\n  lookahead(): State {\n    const old = this.state;\n    this.state = old.clone(true);\n\n    this.isLookahead = true;\n    this.next();\n    this.isLookahead = false;\n\n    const curr = this.state;\n    this.state = old;\n    return curr;\n  }\n\n  nextTokenStart(): number {\n    const thisTokEnd = this.state.pos;\n    skipWhiteSpace.lastIndex = thisTokEnd;\n    const skip = skipWhiteSpace.exec(this.input);\n    // $FlowIgnore: The skipWhiteSpace ensures to match any string\n    return thisTokEnd + skip[0].length;\n  }\n\n  lookaheadCharCode(): number {\n    return this.input.charCodeAt(this.nextTokenStart());\n  }\n\n  // Toggle strict mode. Re-reads the next number or string to please\n  // pedantic tests (`\"use strict\"; 010;` should fail).\n\n  setStrict(strict: boolean): void {\n    this.state.strict = strict;\n    if (!this.match(tt.num) && !this.match(tt.string)) return;\n    this.state.pos = this.state.start;\n    while (this.state.pos < this.state.lineStart) {\n      this.state.lineStart =\n        this.input.lastIndexOf(\"\\n\", this.state.lineStart - 2) + 1;\n      --this.state.curLine;\n    }\n    this.nextToken();\n  }\n\n  curContext(): TokContext {\n    return this.state.context[this.state.context.length - 1];\n  }\n\n  // Read a single token, updating the parser object's token-related\n  // properties.\n\n  nextToken(): void {\n    const curContext = this.curContext();\n    if (!curContext || !curContext.preserveSpace) this.skipSpace();\n\n    this.state.octalPositions = [];\n    this.state.start = this.state.pos;\n    this.state.startLoc = this.state.curPosition();\n    if (this.state.pos >= this.length) {\n      this.finishToken(tt.eof);\n      return;\n    }\n\n    const override = curContext?.override;\n    if (override) {\n      override(this);\n    } else {\n      this.getTokenFromCode(this.input.codePointAt(this.state.pos));\n    }\n  }\n\n  pushComment(\n    block: boolean,\n    text: string,\n    start: number,\n    end: number,\n    startLoc: Position,\n    endLoc: Position,\n  ): void {\n    const comment = {\n      type: block ? \"CommentBlock\" : \"CommentLine\",\n      value: text,\n      start: start,\n      end: end,\n      loc: new SourceLocation(startLoc, endLoc),\n    };\n\n    if (this.options.tokens) this.pushToken(comment);\n    this.state.comments.push(comment);\n    this.addComment(comment);\n  }\n\n  skipBlockComment(): void {\n    const startLoc = this.state.curPosition();\n    const start = this.state.pos;\n    const end = this.input.indexOf(\"*/\", this.state.pos + 2);\n    if (end === -1) throw this.raise(start, Errors.UnterminatedComment);\n\n    this.state.pos = end + 2;\n    lineBreakG.lastIndex = start;\n    let match;\n    while (\n      (match = lineBreakG.exec(this.input)) &&\n      match.index < this.state.pos\n    ) {\n      ++this.state.curLine;\n      this.state.lineStart = match.index + match[0].length;\n    }\n\n    // If we are doing a lookahead right now we need to advance the position (above code)\n    // but we do not want to push the comment to the state.\n    if (this.isLookahead) return;\n\n    this.pushComment(\n      true,\n      this.input.slice(start + 2, end),\n      start,\n      this.state.pos,\n      startLoc,\n      this.state.curPosition(),\n    );\n  }\n\n  skipLineComment(startSkip: number): void {\n    const start = this.state.pos;\n    const startLoc = this.state.curPosition();\n    let ch = this.input.charCodeAt((this.state.pos += startSkip));\n    if (this.state.pos < this.length) {\n      while (!isNewLine(ch) && ++this.state.pos < this.length) {\n        ch = this.input.charCodeAt(this.state.pos);\n      }\n    }\n\n    // If we are doing a lookahead right now we need to advance the position (above code)\n    // but we do not want to push the comment to the state.\n    if (this.isLookahead) return;\n\n    this.pushComment(\n      false,\n      this.input.slice(start + startSkip, this.state.pos),\n      start,\n      this.state.pos,\n      startLoc,\n      this.state.curPosition(),\n    );\n  }\n\n  // Called at the start of the parse and after every token. Skips\n  // whitespace and comments, and.\n\n  skipSpace(): void {\n    loop: while (this.state.pos < this.length) {\n      const ch = this.input.charCodeAt(this.state.pos);\n      switch (ch) {\n        case charCodes.space:\n        case charCodes.nonBreakingSpace:\n        case charCodes.tab:\n          ++this.state.pos;\n          break;\n        case charCodes.carriageReturn:\n          if (\n            this.input.charCodeAt(this.state.pos + 1) === charCodes.lineFeed\n          ) {\n            ++this.state.pos;\n          }\n        // fall through\n        case charCodes.lineFeed:\n        case charCodes.lineSeparator:\n        case charCodes.paragraphSeparator:\n          ++this.state.pos;\n          ++this.state.curLine;\n          this.state.lineStart = this.state.pos;\n          break;\n\n        case charCodes.slash:\n          switch (this.input.charCodeAt(this.state.pos + 1)) {\n            case charCodes.asterisk:\n              this.skipBlockComment();\n              break;\n\n            case charCodes.slash:\n              this.skipLineComment(2);\n              break;\n\n            default:\n              break loop;\n          }\n          break;\n\n        default:\n          if (isWhitespace(ch)) {\n            ++this.state.pos;\n          } else {\n            break loop;\n          }\n      }\n    }\n  }\n\n  // Called at the end of every token. Sets `end`, `val`, and\n  // maintains `context` and `exprAllowed`, and skips the space after\n  // the token, so that the next one's `start` will point at the\n  // right position.\n\n  finishToken(type: TokenType, val: any): void {\n    this.state.end = this.state.pos;\n    this.state.endLoc = this.state.curPosition();\n    const prevType = this.state.type;\n    this.state.type = type;\n    this.state.value = val;\n\n    if (!this.isLookahead) this.updateContext(prevType);\n  }\n\n  // ### Token reading\n\n  // This is the function that is called to fetch the next token. It\n  // is somewhat obscure, because it works in character codes rather\n  // than characters, and because operator parsing has been inlined\n  // into it.\n  //\n  // All in the name of speed.\n\n  // number sign is \"#\"\n  readToken_numberSign(): void {\n    if (this.state.pos === 0 && this.readToken_interpreter()) {\n      return;\n    }\n\n    const nextPos = this.state.pos + 1;\n    const next = this.input.charCodeAt(nextPos);\n    if (next >= charCodes.digit0 && next <= charCodes.digit9) {\n      throw this.raise(this.state.pos, Errors.UnexpectedDigitAfterHash);\n    }\n\n    if (\n      this.hasPlugin(\"recordAndTuple\") &&\n      (next === charCodes.leftCurlyBrace ||\n        next === charCodes.leftSquareBracket)\n    ) {\n      if (this.getPluginOption(\"recordAndTuple\", \"syntaxType\") !== \"hash\") {\n        throw this.raise(\n          this.state.pos,\n          next === charCodes.leftCurlyBrace\n            ? Errors.RecordExpressionHashIncorrectStartSyntaxType\n            : Errors.TupleExpressionHashIncorrectStartSyntaxType,\n        );\n      }\n\n      if (next === charCodes.leftCurlyBrace) {\n        // #{\n        this.finishToken(tt.braceHashL);\n      } else {\n        // #[\n        this.finishToken(tt.bracketHashL);\n      }\n      this.state.pos += 2;\n    } else if (\n      this.hasPlugin(\"classPrivateProperties\") ||\n      this.hasPlugin(\"classPrivateMethods\") ||\n      this.getPluginOption(\"pipelineOperator\", \"proposal\") === \"smart\"\n    ) {\n      this.finishOp(tt.hash, 1);\n    } else {\n      throw this.raise(this.state.pos, Errors.InvalidOrUnexpectedToken, \"#\");\n    }\n  }\n\n  readToken_dot(): void {\n    const next = this.input.charCodeAt(this.state.pos + 1);\n    if (next >= charCodes.digit0 && next <= charCodes.digit9) {\n      this.readNumber(true);\n      return;\n    }\n\n    if (\n      next === charCodes.dot &&\n      this.input.charCodeAt(this.state.pos + 2) === charCodes.dot\n    ) {\n      this.state.pos += 3;\n      this.finishToken(tt.ellipsis);\n    } else {\n      ++this.state.pos;\n      this.finishToken(tt.dot);\n    }\n  }\n\n  readToken_slash(): void {\n    // '/'\n    if (this.state.exprAllowed && !this.state.inType) {\n      ++this.state.pos;\n      this.readRegexp();\n      return;\n    }\n\n    const next = this.input.charCodeAt(this.state.pos + 1);\n    if (next === charCodes.equalsTo) {\n      this.finishOp(tt.assign, 2);\n    } else {\n      this.finishOp(tt.slash, 1);\n    }\n  }\n\n  readToken_interpreter(): boolean {\n    if (this.state.pos !== 0 || this.length < 2) return false;\n\n    let ch = this.input.charCodeAt(this.state.pos + 1);\n    if (ch !== charCodes.exclamationMark) return false;\n\n    const start = this.state.pos;\n    this.state.pos += 1;\n\n    while (!isNewLine(ch) && ++this.state.pos < this.length) {\n      ch = this.input.charCodeAt(this.state.pos);\n    }\n\n    const value = this.input.slice(start + 2, this.state.pos);\n\n    this.finishToken(tt.interpreterDirective, value);\n\n    return true;\n  }\n\n  readToken_mult_modulo(code: number): void {\n    // '%*'\n    let type = code === charCodes.asterisk ? tt.star : tt.modulo;\n    let width = 1;\n    let next = this.input.charCodeAt(this.state.pos + 1);\n    const exprAllowed = this.state.exprAllowed;\n\n    // Exponentiation operator **\n    if (code === charCodes.asterisk && next === charCodes.asterisk) {\n      width++;\n      next = this.input.charCodeAt(this.state.pos + 2);\n      type = tt.exponent;\n    }\n\n    if (next === charCodes.equalsTo && !exprAllowed) {\n      width++;\n      type = tt.assign;\n    }\n\n    this.finishOp(type, width);\n  }\n\n  readToken_pipe_amp(code: number): void {\n    // '||' '&&' '||=' '&&='\n    const next = this.input.charCodeAt(this.state.pos + 1);\n\n    if (next === code) {\n      if (this.input.charCodeAt(this.state.pos + 2) === charCodes.equalsTo) {\n        this.finishOp(tt.assign, 3);\n      } else {\n        this.finishOp(\n          code === charCodes.verticalBar ? tt.logicalOR : tt.logicalAND,\n          2,\n        );\n      }\n      return;\n    }\n\n    if (code === charCodes.verticalBar) {\n      // '|>'\n      if (next === charCodes.greaterThan) {\n        this.finishOp(tt.pipeline, 2);\n        return;\n      }\n      // '|}'\n      if (\n        this.hasPlugin(\"recordAndTuple\") &&\n        next === charCodes.rightCurlyBrace\n      ) {\n        if (this.getPluginOption(\"recordAndTuple\", \"syntaxType\") !== \"bar\") {\n          throw this.raise(\n            this.state.pos,\n            Errors.RecordExpressionBarIncorrectEndSyntaxType,\n          );\n        }\n\n        this.finishOp(tt.braceBarR, 2);\n        return;\n      }\n\n      // '|]'\n      if (\n        this.hasPlugin(\"recordAndTuple\") &&\n        next === charCodes.rightSquareBracket\n      ) {\n        if (this.getPluginOption(\"recordAndTuple\", \"syntaxType\") !== \"bar\") {\n          throw this.raise(\n            this.state.pos,\n            Errors.TupleExpressionBarIncorrectEndSyntaxType,\n          );\n        }\n\n        this.finishOp(tt.bracketBarR, 2);\n        return;\n      }\n    }\n\n    if (next === charCodes.equalsTo) {\n      this.finishOp(tt.assign, 2);\n      return;\n    }\n\n    this.finishOp(\n      code === charCodes.verticalBar ? tt.bitwiseOR : tt.bitwiseAND,\n      1,\n    );\n  }\n\n  readToken_caret(): void {\n    // '^'\n    const next = this.input.charCodeAt(this.state.pos + 1);\n    if (next === charCodes.equalsTo) {\n      this.finishOp(tt.assign, 2);\n    } else {\n      this.finishOp(tt.bitwiseXOR, 1);\n    }\n  }\n\n  readToken_plus_min(code: number): void {\n    // '+-'\n    const next = this.input.charCodeAt(this.state.pos + 1);\n\n    if (next === code) {\n      if (\n        next === charCodes.dash &&\n        !this.inModule &&\n        this.input.charCodeAt(this.state.pos + 2) === charCodes.greaterThan &&\n        (this.state.lastTokEnd === 0 ||\n          lineBreak.test(\n            this.input.slice(this.state.lastTokEnd, this.state.pos),\n          ))\n      ) {\n        // A `-->` line comment\n        this.skipLineComment(3);\n        this.skipSpace();\n        this.nextToken();\n        return;\n      }\n      this.finishOp(tt.incDec, 2);\n      return;\n    }\n\n    if (next === charCodes.equalsTo) {\n      this.finishOp(tt.assign, 2);\n    } else {\n      this.finishOp(tt.plusMin, 1);\n    }\n  }\n\n  readToken_lt_gt(code: number): void {\n    // '<>'\n    const next = this.input.charCodeAt(this.state.pos + 1);\n    let size = 1;\n\n    if (next === code) {\n      size =\n        code === charCodes.greaterThan &&\n        this.input.charCodeAt(this.state.pos + 2) === charCodes.greaterThan\n          ? 3\n          : 2;\n      if (this.input.charCodeAt(this.state.pos + size) === charCodes.equalsTo) {\n        this.finishOp(tt.assign, size + 1);\n        return;\n      }\n      this.finishOp(tt.bitShift, size);\n      return;\n    }\n\n    if (\n      next === charCodes.exclamationMark &&\n      code === charCodes.lessThan &&\n      !this.inModule &&\n      this.input.charCodeAt(this.state.pos + 2) === charCodes.dash &&\n      this.input.charCodeAt(this.state.pos + 3) === charCodes.dash\n    ) {\n      // `<!--`, an XML-style comment that should be interpreted as a line comment\n      this.skipLineComment(4);\n      this.skipSpace();\n      this.nextToken();\n      return;\n    }\n\n    if (next === charCodes.equalsTo) {\n      // <= | >=\n      size = 2;\n    }\n\n    this.finishOp(tt.relational, size);\n  }\n\n  readToken_eq_excl(code: number): void {\n    // '=!'\n    const next = this.input.charCodeAt(this.state.pos + 1);\n    if (next === charCodes.equalsTo) {\n      this.finishOp(\n        tt.equality,\n        this.input.charCodeAt(this.state.pos + 2) === charCodes.equalsTo\n          ? 3\n          : 2,\n      );\n      return;\n    }\n    if (code === charCodes.equalsTo && next === charCodes.greaterThan) {\n      // '=>'\n      this.state.pos += 2;\n      this.finishToken(tt.arrow);\n      return;\n    }\n    this.finishOp(code === charCodes.equalsTo ? tt.eq : tt.bang, 1);\n  }\n\n  readToken_question(): void {\n    // '?'\n    const next = this.input.charCodeAt(this.state.pos + 1);\n    const next2 = this.input.charCodeAt(this.state.pos + 2);\n    if (next === charCodes.questionMark && !this.state.inType) {\n      if (next2 === charCodes.equalsTo) {\n        // '??='\n        this.finishOp(tt.assign, 3);\n      } else {\n        // '??'\n        this.finishOp(tt.nullishCoalescing, 2);\n      }\n    } else if (\n      next === charCodes.dot &&\n      !(next2 >= charCodes.digit0 && next2 <= charCodes.digit9)\n    ) {\n      // '.' not followed by a number\n      this.state.pos += 2;\n      this.finishToken(tt.questionDot);\n    } else {\n      ++this.state.pos;\n      this.finishToken(tt.question);\n    }\n  }\n\n  getTokenFromCode(code: number): void {\n    switch (code) {\n      // The interpretation of a dot depends on whether it is followed\n      // by a digit or another two dots.\n\n      case charCodes.dot:\n        this.readToken_dot();\n        return;\n\n      // Punctuation tokens.\n      case charCodes.leftParenthesis:\n        ++this.state.pos;\n        this.finishToken(tt.parenL);\n        return;\n      case charCodes.rightParenthesis:\n        ++this.state.pos;\n        this.finishToken(tt.parenR);\n        return;\n      case charCodes.semicolon:\n        ++this.state.pos;\n        this.finishToken(tt.semi);\n        return;\n      case charCodes.comma:\n        ++this.state.pos;\n        this.finishToken(tt.comma);\n        return;\n      case charCodes.leftSquareBracket:\n        if (\n          this.hasPlugin(\"recordAndTuple\") &&\n          this.input.charCodeAt(this.state.pos + 1) === charCodes.verticalBar\n        ) {\n          if (this.getPluginOption(\"recordAndTuple\", \"syntaxType\") !== \"bar\") {\n            throw this.raise(\n              this.state.pos,\n              Errors.TupleExpressionBarIncorrectStartSyntaxType,\n            );\n          }\n\n          // [|\n          this.finishToken(tt.bracketBarL);\n          this.state.pos += 2;\n        } else {\n          ++this.state.pos;\n          this.finishToken(tt.bracketL);\n        }\n        return;\n      case charCodes.rightSquareBracket:\n        ++this.state.pos;\n        this.finishToken(tt.bracketR);\n        return;\n      case charCodes.leftCurlyBrace:\n        if (\n          this.hasPlugin(\"recordAndTuple\") &&\n          this.input.charCodeAt(this.state.pos + 1) === charCodes.verticalBar\n        ) {\n          if (this.getPluginOption(\"recordAndTuple\", \"syntaxType\") !== \"bar\") {\n            throw this.raise(\n              this.state.pos,\n              Errors.RecordExpressionBarIncorrectStartSyntaxType,\n            );\n          }\n\n          // {|\n          this.finishToken(tt.braceBarL);\n          this.state.pos += 2;\n        } else {\n          ++this.state.pos;\n          this.finishToken(tt.braceL);\n        }\n        return;\n      case charCodes.rightCurlyBrace:\n        ++this.state.pos;\n        this.finishToken(tt.braceR);\n        return;\n\n      case charCodes.colon:\n        if (\n          this.hasPlugin(\"functionBind\") &&\n          this.input.charCodeAt(this.state.pos + 1) === charCodes.colon\n        ) {\n          this.finishOp(tt.doubleColon, 2);\n        } else {\n          ++this.state.pos;\n          this.finishToken(tt.colon);\n        }\n        return;\n\n      case charCodes.questionMark:\n        this.readToken_question();\n        return;\n\n      case charCodes.graveAccent:\n        ++this.state.pos;\n        this.finishToken(tt.backQuote);\n        return;\n\n      case charCodes.digit0: {\n        const next = this.input.charCodeAt(this.state.pos + 1);\n        // '0x', '0X' - hex number\n        if (next === charCodes.lowercaseX || next === charCodes.uppercaseX) {\n          this.readRadixNumber(16);\n          return;\n        }\n        // '0o', '0O' - octal number\n        if (next === charCodes.lowercaseO || next === charCodes.uppercaseO) {\n          this.readRadixNumber(8);\n          return;\n        }\n        // '0b', '0B' - binary number\n        if (next === charCodes.lowercaseB || next === charCodes.uppercaseB) {\n          this.readRadixNumber(2);\n          return;\n        }\n      }\n      // Anything else beginning with a digit is an integer, octal\n      // number, or float. (fall through)\n      case charCodes.digit1:\n      case charCodes.digit2:\n      case charCodes.digit3:\n      case charCodes.digit4:\n      case charCodes.digit5:\n      case charCodes.digit6:\n      case charCodes.digit7:\n      case charCodes.digit8:\n      case charCodes.digit9:\n        this.readNumber(false);\n        return;\n\n      // Quotes produce strings.\n      case charCodes.quotationMark:\n      case charCodes.apostrophe:\n        this.readString(code);\n        return;\n\n      // Operators are parsed inline in tiny state machines. '=' (charCodes.equalsTo) is\n      // often referred to. `finishOp` simply skips the amount of\n      // characters it is given as second argument, and returns a token\n      // of the type given by its first argument.\n\n      case charCodes.slash:\n        this.readToken_slash();\n        return;\n\n      case charCodes.percentSign:\n      case charCodes.asterisk:\n        this.readToken_mult_modulo(code);\n        return;\n\n      case charCodes.verticalBar:\n      case charCodes.ampersand:\n        this.readToken_pipe_amp(code);\n        return;\n\n      case charCodes.caret:\n        this.readToken_caret();\n        return;\n\n      case charCodes.plusSign:\n      case charCodes.dash:\n        this.readToken_plus_min(code);\n        return;\n\n      case charCodes.lessThan:\n      case charCodes.greaterThan:\n        this.readToken_lt_gt(code);\n        return;\n\n      case charCodes.equalsTo:\n      case charCodes.exclamationMark:\n        this.readToken_eq_excl(code);\n        return;\n\n      case charCodes.tilde:\n        this.finishOp(tt.tilde, 1);\n        return;\n\n      case charCodes.atSign:\n        ++this.state.pos;\n        this.finishToken(tt.at);\n        return;\n\n      case charCodes.numberSign:\n        this.readToken_numberSign();\n        return;\n\n      case charCodes.backslash:\n        this.readWord();\n        return;\n\n      default:\n        if (isIdentifierStart(code)) {\n          this.readWord();\n          return;\n        }\n    }\n\n    throw this.raise(\n      this.state.pos,\n      Errors.InvalidOrUnexpectedToken,\n      String.fromCodePoint(code),\n    );\n  }\n\n  finishOp(type: TokenType, size: number): void {\n    const str = this.input.slice(this.state.pos, this.state.pos + size);\n    this.state.pos += size;\n    this.finishToken(type, str);\n  }\n\n  readRegexp(): void {\n    const start = this.state.pos;\n    let escaped, inClass;\n    for (;;) {\n      if (this.state.pos >= this.length) {\n        throw this.raise(start, Errors.UnterminatedRegExp);\n      }\n      const ch = this.input.charAt(this.state.pos);\n      if (lineBreak.test(ch)) {\n        throw this.raise(start, Errors.UnterminatedRegExp);\n      }\n      if (escaped) {\n        escaped = false;\n      } else {\n        if (ch === \"[\") {\n          inClass = true;\n        } else if (ch === \"]\" && inClass) {\n          inClass = false;\n        } else if (ch === \"/\" && !inClass) {\n          break;\n        }\n        escaped = ch === \"\\\\\";\n      }\n      ++this.state.pos;\n    }\n    const content = this.input.slice(start, this.state.pos);\n    ++this.state.pos;\n\n    let mods = \"\";\n\n    while (this.state.pos < this.length) {\n      const char = this.input[this.state.pos];\n      const charCode = this.input.codePointAt(this.state.pos);\n\n      if (VALID_REGEX_FLAGS.has(char)) {\n        if (mods.indexOf(char) > -1) {\n          this.raise(this.state.pos + 1, Errors.DuplicateRegExpFlags);\n        }\n      } else if (\n        isIdentifierChar(charCode) ||\n        charCode === charCodes.backslash\n      ) {\n        this.raise(this.state.pos + 1, Errors.MalformedRegExpFlags);\n      } else {\n        break;\n      }\n\n      ++this.state.pos;\n      mods += char;\n    }\n\n    this.finishToken(tt.regexp, {\n      pattern: content,\n      flags: mods,\n    });\n  }\n\n  // Read an integer in the given radix. Return null if zero digits\n  // were read, the integer value otherwise. When `len` is given, this\n  // will return `null` unless the integer has exactly `len` digits.\n  // When `forceLen` is `true`, it means that we already know that in case\n  // of a malformed number we have to skip `len` characters anyway, instead\n  // of bailing out early. For example, in \"\\u{123Z}\" we want to read up to }\n  // anyway, while in \"\\u00Z\" we will stop at Z instead of consuming four\n  // characters (and thus the closing quote).\n\n  readInt(\n    radix: number,\n    len?: number,\n    forceLen?: boolean,\n    allowNumSeparator: boolean = true,\n  ): number | null {\n    const start = this.state.pos;\n    const forbiddenSiblings =\n      radix === 16\n        ? forbiddenNumericSeparatorSiblings.hex\n        : forbiddenNumericSeparatorSiblings.decBinOct;\n    const allowedSiblings =\n      radix === 16\n        ? allowedNumericSeparatorSiblings.hex\n        : radix === 10\n        ? allowedNumericSeparatorSiblings.dec\n        : radix === 8\n        ? allowedNumericSeparatorSiblings.oct\n        : allowedNumericSeparatorSiblings.bin;\n\n    let invalid = false;\n    let total = 0;\n\n    for (let i = 0, e = len == null ? Infinity : len; i < e; ++i) {\n      const code = this.input.charCodeAt(this.state.pos);\n      let val;\n\n      if (this.hasPlugin(\"numericSeparator\")) {\n        if (code === charCodes.underscore) {\n          const prev = this.input.charCodeAt(this.state.pos - 1);\n          const next = this.input.charCodeAt(this.state.pos + 1);\n          if (allowedSiblings.indexOf(next) === -1) {\n            this.raise(this.state.pos, Errors.UnexpectedNumericSeparator);\n          } else if (\n            forbiddenSiblings.indexOf(prev) > -1 ||\n            forbiddenSiblings.indexOf(next) > -1 ||\n            Number.isNaN(next)\n          ) {\n            this.raise(this.state.pos, Errors.UnexpectedNumericSeparator);\n          }\n\n          if (!allowNumSeparator) {\n            this.raise(this.state.pos, Errors.NumericSeparatorInEscapeSequence);\n          }\n\n          // Ignore this _ character\n          ++this.state.pos;\n          continue;\n        }\n      }\n\n      if (code >= charCodes.lowercaseA) {\n        val = code - charCodes.lowercaseA + charCodes.lineFeed;\n      } else if (code >= charCodes.uppercaseA) {\n        val = code - charCodes.uppercaseA + charCodes.lineFeed;\n      } else if (charCodes.isDigit(code)) {\n        val = code - charCodes.digit0; // 0-9\n      } else {\n        val = Infinity;\n      }\n      if (val >= radix) {\n        // If we are in \"errorRecovery\" mode and we found a digit which is too big,\n        // don't break the loop.\n\n        if (this.options.errorRecovery && val <= 9) {\n          val = 0;\n          this.raise(this.state.start + i + 2, Errors.InvalidDigit, radix);\n        } else if (forceLen) {\n          val = 0;\n          invalid = true;\n        } else {\n          break;\n        }\n      }\n      ++this.state.pos;\n      total = total * radix + val;\n    }\n    if (\n      this.state.pos === start ||\n      (len != null && this.state.pos - start !== len) ||\n      invalid\n    ) {\n      return null;\n    }\n\n    return total;\n  }\n\n  readRadixNumber(radix: number): void {\n    const start = this.state.pos;\n    let isBigInt = false;\n\n    this.state.pos += 2; // 0x\n    const val = this.readInt(radix);\n    if (val == null) {\n      this.raise(this.state.start + 2, Errors.InvalidDigit, radix);\n    }\n\n    if (this.input.charCodeAt(this.state.pos) === charCodes.lowercaseN) {\n      ++this.state.pos;\n      isBigInt = true;\n    }\n\n    if (isIdentifierStart(this.input.codePointAt(this.state.pos))) {\n      throw this.raise(this.state.pos, Errors.NumberIdentifier);\n    }\n\n    if (isBigInt) {\n      const str = this.input.slice(start, this.state.pos).replace(/[_n]/g, \"\");\n      this.finishToken(tt.bigint, str);\n      return;\n    }\n\n    this.finishToken(tt.num, val);\n  }\n\n  // Read an integer, octal integer, or floating-point number.\n\n  readNumber(startsWithDot: boolean): void {\n    const start = this.state.pos;\n    let isFloat = false;\n    let isBigInt = false;\n    let isNonOctalDecimalInt = false;\n\n    if (!startsWithDot && this.readInt(10) === null) {\n      this.raise(start, Errors.InvalidNumber);\n    }\n    let octal =\n      this.state.pos - start >= 2 &&\n      this.input.charCodeAt(start) === charCodes.digit0;\n    if (octal) {\n      if (this.state.strict) {\n        this.raise(start, Errors.StrictOctalLiteral);\n      }\n      if (/[89]/.test(this.input.slice(start, this.state.pos))) {\n        octal = false;\n        isNonOctalDecimalInt = true;\n      }\n    }\n\n    let next = this.input.charCodeAt(this.state.pos);\n    if (next === charCodes.dot && !octal) {\n      ++this.state.pos;\n      this.readInt(10);\n      isFloat = true;\n      next = this.input.charCodeAt(this.state.pos);\n    }\n\n    if (\n      (next === charCodes.uppercaseE || next === charCodes.lowercaseE) &&\n      !octal\n    ) {\n      next = this.input.charCodeAt(++this.state.pos);\n      if (next === charCodes.plusSign || next === charCodes.dash) {\n        ++this.state.pos;\n      }\n      if (this.readInt(10) === null) this.raise(start, \"Invalid number\");\n      isFloat = true;\n      next = this.input.charCodeAt(this.state.pos);\n    }\n\n    // disallow numeric separators in non octal decimals and legacy octal likes\n    if (this.hasPlugin(\"numericSeparator\") && (octal || isNonOctalDecimalInt)) {\n      const underscorePos = this.input\n        .slice(start, this.state.pos)\n        .indexOf(\"_\");\n      if (underscorePos > 0) {\n        this.raise(underscorePos + start, Errors.ZeroDigitNumericSeparator);\n      }\n    }\n\n    if (next === charCodes.lowercaseN) {\n      // disallow floats, legacy octal syntax and non octal decimals\n      // new style octal (\"0o\") is handled in this.readRadixNumber\n      if (isFloat || octal || isNonOctalDecimalInt) {\n        this.raise(start, \"Invalid BigIntLiteral\");\n      }\n      ++this.state.pos;\n      isBigInt = true;\n    }\n\n    if (isIdentifierStart(this.input.codePointAt(this.state.pos))) {\n      throw this.raise(this.state.pos, Errors.NumberIdentifier);\n    }\n\n    // remove \"_\" for numeric literal separator, and \"n\" for BigInts\n    const str = this.input.slice(start, this.state.pos).replace(/[_n]/g, \"\");\n\n    if (isBigInt) {\n      this.finishToken(tt.bigint, str);\n      return;\n    }\n\n    const val = octal ? parseInt(str, 8) : parseFloat(str);\n    this.finishToken(tt.num, val);\n  }\n\n  // Read a string value, interpreting backslash-escapes.\n\n  readCodePoint(throwOnInvalid: boolean): number | null {\n    const ch = this.input.charCodeAt(this.state.pos);\n    let code;\n\n    if (ch === charCodes.leftCurlyBrace) {\n      const codePos = ++this.state.pos;\n      code = this.readHexChar(\n        this.input.indexOf(\"}\", this.state.pos) - this.state.pos,\n        true,\n        throwOnInvalid,\n      );\n      ++this.state.pos;\n      if (code !== null && code > 0x10ffff) {\n        if (throwOnInvalid) {\n          this.raise(codePos, Errors.InvalidCodePoint);\n        } else {\n          return null;\n        }\n      }\n    } else {\n      code = this.readHexChar(4, false, throwOnInvalid);\n    }\n    return code;\n  }\n\n  readString(quote: number): void {\n    let out = \"\",\n      chunkStart = ++this.state.pos;\n    for (;;) {\n      if (this.state.pos >= this.length) {\n        throw this.raise(this.state.start, Errors.UnterminatedString);\n      }\n      const ch = this.input.charCodeAt(this.state.pos);\n      if (ch === quote) break;\n      if (ch === charCodes.backslash) {\n        out += this.input.slice(chunkStart, this.state.pos);\n        // $FlowFixMe\n        out += this.readEscapedChar(false);\n        chunkStart = this.state.pos;\n      } else if (\n        ch === charCodes.lineSeparator ||\n        ch === charCodes.paragraphSeparator\n      ) {\n        ++this.state.pos;\n        ++this.state.curLine;\n        this.state.lineStart = this.state.pos;\n      } else if (isNewLine(ch)) {\n        throw this.raise(this.state.start, Errors.UnterminatedString);\n      } else {\n        ++this.state.pos;\n      }\n    }\n    out += this.input.slice(chunkStart, this.state.pos++);\n    this.finishToken(tt.string, out);\n  }\n\n  // Reads template string tokens.\n\n  readTmplToken(): void {\n    let out = \"\",\n      chunkStart = this.state.pos,\n      containsInvalid = false;\n    for (;;) {\n      if (this.state.pos >= this.length) {\n        throw this.raise(this.state.start, Errors.UnterminatedTemplate);\n      }\n      const ch = this.input.charCodeAt(this.state.pos);\n      if (\n        ch === charCodes.graveAccent ||\n        (ch === charCodes.dollarSign &&\n          this.input.charCodeAt(this.state.pos + 1) ===\n            charCodes.leftCurlyBrace)\n      ) {\n        if (this.state.pos === this.state.start && this.match(tt.template)) {\n          if (ch === charCodes.dollarSign) {\n            this.state.pos += 2;\n            this.finishToken(tt.dollarBraceL);\n            return;\n          } else {\n            ++this.state.pos;\n            this.finishToken(tt.backQuote);\n            return;\n          }\n        }\n        out += this.input.slice(chunkStart, this.state.pos);\n        this.finishToken(tt.template, containsInvalid ? null : out);\n        return;\n      }\n      if (ch === charCodes.backslash) {\n        out += this.input.slice(chunkStart, this.state.pos);\n        const escaped = this.readEscapedChar(true);\n        if (escaped === null) {\n          containsInvalid = true;\n        } else {\n          out += escaped;\n        }\n        chunkStart = this.state.pos;\n      } else if (isNewLine(ch)) {\n        out += this.input.slice(chunkStart, this.state.pos);\n        ++this.state.pos;\n        switch (ch) {\n          case charCodes.carriageReturn:\n            if (this.input.charCodeAt(this.state.pos) === charCodes.lineFeed) {\n              ++this.state.pos;\n            }\n          // fall through\n          case charCodes.lineFeed:\n            out += \"\\n\";\n            break;\n          default:\n            out += String.fromCharCode(ch);\n            break;\n        }\n        ++this.state.curLine;\n        this.state.lineStart = this.state.pos;\n        chunkStart = this.state.pos;\n      } else {\n        ++this.state.pos;\n      }\n    }\n  }\n\n  // Used to read escaped characters\n\n  readEscapedChar(inTemplate: boolean): string | null {\n    const throwOnInvalid = !inTemplate;\n    const ch = this.input.charCodeAt(++this.state.pos);\n    ++this.state.pos;\n    switch (ch) {\n      case charCodes.lowercaseN:\n        return \"\\n\";\n      case charCodes.lowercaseR:\n        return \"\\r\";\n      case charCodes.lowercaseX: {\n        const code = this.readHexChar(2, false, throwOnInvalid);\n        return code === null ? null : String.fromCharCode(code);\n      }\n      case charCodes.lowercaseU: {\n        const code = this.readCodePoint(throwOnInvalid);\n        return code === null ? null : String.fromCodePoint(code);\n      }\n      case charCodes.lowercaseT:\n        return \"\\t\";\n      case charCodes.lowercaseB:\n        return \"\\b\";\n      case charCodes.lowercaseV:\n        return \"\\u000b\";\n      case charCodes.lowercaseF:\n        return \"\\f\";\n      case charCodes.carriageReturn:\n        if (this.input.charCodeAt(this.state.pos) === charCodes.lineFeed) {\n          ++this.state.pos;\n        }\n      // fall through\n      case charCodes.lineFeed:\n        this.state.lineStart = this.state.pos;\n        ++this.state.curLine;\n      // fall through\n      case charCodes.lineSeparator:\n      case charCodes.paragraphSeparator:\n        return \"\";\n      case charCodes.digit8:\n      case charCodes.digit9:\n        if (inTemplate) {\n          return null;\n        }\n      // fall through\n      default:\n        if (ch >= charCodes.digit0 && ch <= charCodes.digit7) {\n          const codePos = this.state.pos - 1;\n          // $FlowFixMe\n          let octalStr = this.input\n            .substr(this.state.pos - 1, 3)\n            .match(/^[0-7]+/)[0];\n          let octal = parseInt(octalStr, 8);\n          if (octal > 255) {\n            octalStr = octalStr.slice(0, -1);\n            octal = parseInt(octalStr, 8);\n          }\n          this.state.pos += octalStr.length - 1;\n          const next = this.input.charCodeAt(this.state.pos);\n          if (\n            octalStr !== \"0\" ||\n            next === charCodes.digit8 ||\n            next === charCodes.digit9\n          ) {\n            if (inTemplate) {\n              return null;\n            } else if (this.state.strict) {\n              this.raise(codePos, Errors.StrictOctalLiteral);\n            } else {\n              // This property is used to throw an error for\n              // an octal literal in a directive that occurs prior\n              // to a \"use strict\" directive.\n              this.state.octalPositions.push(codePos);\n            }\n          }\n\n          return String.fromCharCode(octal);\n        }\n\n        return String.fromCharCode(ch);\n    }\n  }\n\n  // Used to read character escape sequences ('\\x', '\\u').\n\n  readHexChar(\n    len: number,\n    forceLen: boolean,\n    throwOnInvalid: boolean,\n  ): number | null {\n    const codePos = this.state.pos;\n    const n = this.readInt(16, len, forceLen, false);\n    if (n === null) {\n      if (throwOnInvalid) {\n        this.raise(codePos, Errors.InvalidEscapeSequence);\n      } else {\n        this.state.pos = codePos - 1;\n      }\n    }\n    return n;\n  }\n\n  // Read an identifier, and return it as a string. Sets `this.state.containsEsc`\n  // to whether the word contained a '\\u' escape.\n  //\n  // Incrementally adds only escaped chars, adding other chunks as-is\n  // as a micro-optimization.\n\n  readWord1(): string {\n    let word = \"\";\n    this.state.containsEsc = false;\n    const start = this.state.pos;\n    let chunkStart = this.state.pos;\n\n    while (this.state.pos < this.length) {\n      const ch = this.input.codePointAt(this.state.pos);\n      if (isIdentifierChar(ch)) {\n        this.state.pos += ch <= 0xffff ? 1 : 2;\n      } else if (this.state.isIterator && ch === charCodes.atSign) {\n        ++this.state.pos;\n      } else if (ch === charCodes.backslash) {\n        this.state.containsEsc = true;\n\n        word += this.input.slice(chunkStart, this.state.pos);\n        const escStart = this.state.pos;\n        const identifierCheck =\n          this.state.pos === start ? isIdentifierStart : isIdentifierChar;\n\n        if (this.input.charCodeAt(++this.state.pos) !== charCodes.lowercaseU) {\n          this.raise(this.state.pos, Errors.MissingUnicodeEscape);\n          continue;\n        }\n\n        ++this.state.pos;\n        const esc = this.readCodePoint(true);\n        if (esc !== null) {\n          if (!identifierCheck(esc)) {\n            this.raise(escStart, Errors.EscapedCharNotAnIdentifier);\n          }\n\n          word += String.fromCodePoint(esc);\n        }\n        chunkStart = this.state.pos;\n      } else {\n        break;\n      }\n    }\n    return word + this.input.slice(chunkStart, this.state.pos);\n  }\n\n  isIterator(word: string): boolean {\n    return word === \"@@iterator\" || word === \"@@asyncIterator\";\n  }\n\n  // Read an identifier or keyword token. Will check for reserved\n  // words when necessary.\n\n  readWord(): void {\n    const word = this.readWord1();\n    const type = keywordTypes.get(word) || tt.name;\n\n    // Allow @@iterator and @@asyncIterator as a identifier only inside type\n    if (\n      this.state.isIterator &&\n      (!this.isIterator(word) || !this.state.inType)\n    ) {\n      this.raise(this.state.pos, Errors.InvalidIdentifier, word);\n    }\n\n    this.finishToken(type, word);\n  }\n\n  checkKeywordEscapes(): void {\n    const kw = this.state.type.keyword;\n    if (kw && this.state.containsEsc) {\n      this.raise(this.state.start, Errors.InvalidEscapedReservedWord, kw);\n    }\n  }\n\n  braceIsBlock(prevType: TokenType): boolean {\n    const parent = this.curContext();\n    if (parent === ct.functionExpression || parent === ct.functionStatement) {\n      return true;\n    }\n    if (\n      prevType === tt.colon &&\n      (parent === ct.braceStatement || parent === ct.braceExpression)\n    ) {\n      return !parent.isExpr;\n    }\n\n    // The check for `tt.name && exprAllowed` detects whether we are\n    // after a `yield` or `of` construct. See the `updateContext` for\n    // `tt.name`.\n    if (\n      prevType === tt._return ||\n      (prevType === tt.name && this.state.exprAllowed)\n    ) {\n      return lineBreak.test(\n        this.input.slice(this.state.lastTokEnd, this.state.start),\n      );\n    }\n\n    if (\n      prevType === tt._else ||\n      prevType === tt.semi ||\n      prevType === tt.eof ||\n      prevType === tt.parenR ||\n      prevType === tt.arrow\n    ) {\n      return true;\n    }\n\n    if (prevType === tt.braceL) {\n      return parent === ct.braceStatement;\n    }\n\n    if (\n      prevType === tt._var ||\n      prevType === tt._const ||\n      prevType === tt.name\n    ) {\n      return false;\n    }\n\n    if (prevType === tt.relational) {\n      // `class C<T> { ... }`\n      return true;\n    }\n\n    return !this.state.exprAllowed;\n  }\n\n  updateContext(prevType: TokenType): void {\n    const type = this.state.type;\n    let update;\n\n    if (type.keyword && (prevType === tt.dot || prevType === tt.questionDot)) {\n      this.state.exprAllowed = false;\n    } else if ((update = type.updateContext)) {\n      update.call(this, prevType);\n    } else {\n      this.state.exprAllowed = type.beforeExpr;\n    }\n  }\n}\n","// @flow\n\nimport { types as tt, type TokenType } from \"../tokenizer/types\";\nimport Tokenizer from \"../tokenizer\";\nimport State from \"../tokenizer/state\";\nimport type { Node } from \"../types\";\nimport { lineBreak } from \"../util/whitespace\";\nimport { isIdentifierChar } from \"../util/identifier\";\nimport * as charCodes from \"charcodes\";\nimport { Errors } from \"./location\";\n\ntype TryParse<Node, Error, Thrown, Aborted, FailState> = {\n  node: Node,\n  error: Error,\n  thrown: Thrown,\n  aborted: Aborted,\n  failState: FailState,\n};\n\n// ## Parser utilities\n\nexport default class UtilParser extends Tokenizer {\n  // TODO\n\n  addExtra(node: Node, key: string, val: any): void {\n    if (!node) return;\n\n    const extra = (node.extra = node.extra || {});\n    extra[key] = val;\n  }\n\n  // TODO\n\n  isRelational(op: \"<\" | \">\"): boolean {\n    return this.match(tt.relational) && this.state.value === op;\n  }\n\n  isLookaheadRelational(op: \"<\" | \">\"): boolean {\n    const next = this.nextTokenStart();\n    if (this.input.charAt(next) === op) {\n      if (next + 1 === this.input.length) {\n        return true;\n      }\n      const afterNext = this.input.charCodeAt(next + 1);\n      return afterNext !== op.charCodeAt(0) && afterNext !== charCodes.equalsTo;\n    }\n    return false;\n  }\n\n  // TODO\n\n  expectRelational(op: \"<\" | \">\"): void {\n    if (this.isRelational(op)) {\n      this.next();\n    } else {\n      this.unexpected(null, tt.relational);\n    }\n  }\n\n  // Tests whether parsed token is a contextual keyword.\n\n  isContextual(name: string): boolean {\n    return (\n      this.match(tt.name) &&\n      this.state.value === name &&\n      !this.state.containsEsc\n    );\n  }\n\n  isUnparsedContextual(nameStart: number, name: string): boolean {\n    const nameEnd = nameStart + name.length;\n    return (\n      this.input.slice(nameStart, nameEnd) === name &&\n      (nameEnd === this.input.length ||\n        !isIdentifierChar(this.input.charCodeAt(nameEnd)))\n    );\n  }\n\n  isLookaheadContextual(name: string): boolean {\n    const next = this.nextTokenStart();\n    return this.isUnparsedContextual(next, name);\n  }\n\n  // Consumes contextual keyword if possible.\n\n  eatContextual(name: string): boolean {\n    return this.isContextual(name) && this.eat(tt.name);\n  }\n\n  // Asserts that following token is given contextual keyword.\n\n  expectContextual(name: string, message?: string): void {\n    if (!this.eatContextual(name)) this.unexpected(null, message);\n  }\n\n  // Test whether a semicolon can be inserted at the current position.\n\n  canInsertSemicolon(): boolean {\n    return (\n      this.match(tt.eof) ||\n      this.match(tt.braceR) ||\n      this.hasPrecedingLineBreak()\n    );\n  }\n\n  hasPrecedingLineBreak(): boolean {\n    return lineBreak.test(\n      this.input.slice(this.state.lastTokEnd, this.state.start),\n    );\n  }\n\n  // TODO\n\n  isLineTerminator(): boolean {\n    return this.eat(tt.semi) || this.canInsertSemicolon();\n  }\n\n  // Consume a semicolon, or, failing that, see if we are allowed to\n  // pretend that there is a semicolon at this position.\n\n  semicolon(): void {\n    if (!this.isLineTerminator()) this.unexpected(null, tt.semi);\n  }\n\n  // Expect a token of a given type. If found, consume it, otherwise,\n  // raise an unexpected token error at given pos.\n\n  expect(type: TokenType, pos?: ?number): void {\n    this.eat(type) || this.unexpected(pos, type);\n  }\n\n  // Throws if the current token and the prev one are separated by a space.\n  assertNoSpace(message: string = \"Unexpected space.\"): void {\n    if (this.state.start > this.state.lastTokEnd) {\n      this.raise(this.state.lastTokEnd, message);\n    }\n  }\n\n  // Raise an unexpected token error. Can take the expected token type\n  // instead of a message string.\n\n  unexpected(\n    pos: ?number,\n    messageOrType: string | TokenType = \"Unexpected token\",\n  ): empty {\n    if (typeof messageOrType !== \"string\") {\n      messageOrType = `Unexpected token, expected \"${messageOrType.label}\"`;\n    }\n    throw this.raise(pos != null ? pos : this.state.start, messageOrType);\n  }\n\n  expectPlugin(name: string, pos?: ?number): true {\n    if (!this.hasPlugin(name)) {\n      throw this.raiseWithData(\n        pos != null ? pos : this.state.start,\n        { missingPlugin: [name] },\n        `This experimental syntax requires enabling the parser plugin: '${name}'`,\n      );\n    }\n\n    return true;\n  }\n\n  expectOnePlugin(names: Array<string>, pos?: ?number): void {\n    if (!names.some(n => this.hasPlugin(n))) {\n      throw this.raiseWithData(\n        pos != null ? pos : this.state.start,\n        { missingPlugin: names },\n        `This experimental syntax requires enabling one of the following parser plugin(s): '${names.join(\n          \", \",\n        )}'`,\n      );\n    }\n  }\n\n  checkYieldAwaitInDefaultParams() {\n    if (\n      this.state.yieldPos !== -1 &&\n      (this.state.awaitPos === -1 || this.state.yieldPos < this.state.awaitPos)\n    ) {\n      this.raise(\n        this.state.yieldPos,\n        \"Yield cannot be used as name inside a generator function\",\n      );\n    }\n    if (this.state.awaitPos !== -1) {\n      this.raise(\n        this.state.awaitPos,\n        \"Await cannot be used as name inside an async function\",\n      );\n    }\n  }\n\n  // tryParse will clone parser state.\n  // It is expensive and should be used with cautions\n  tryParse<T: Node | $ReadOnlyArray<Node>>(\n    fn: (abort: (node?: T) => empty) => T,\n    oldState: State = this.state.clone(),\n  ):\n    | TryParse<T, null, false, false, null>\n    | TryParse<T | null, SyntaxError, boolean, false, State>\n    | TryParse<T | null, null, false, true, State> {\n    const abortSignal: { node: T | null } = { node: null };\n    try {\n      const node = fn((node = null) => {\n        abortSignal.node = node;\n        throw abortSignal;\n      });\n      if (this.state.errors.length > oldState.errors.length) {\n        const failState = this.state;\n        this.state = oldState;\n        return {\n          node,\n          error: (failState.errors[oldState.errors.length]: SyntaxError),\n          thrown: false,\n          aborted: false,\n          failState,\n        };\n      }\n\n      return {\n        node,\n        error: null,\n        thrown: false,\n        aborted: false,\n        failState: null,\n      };\n    } catch (error) {\n      const failState = this.state;\n      this.state = oldState;\n      if (error instanceof SyntaxError) {\n        return { node: null, error, thrown: true, aborted: false, failState };\n      }\n      if (error === abortSignal) {\n        return {\n          node: abortSignal.node,\n          error: null,\n          thrown: false,\n          aborted: true,\n          failState,\n        };\n      }\n\n      throw error;\n    }\n  }\n\n  checkExpressionErrors(\n    refExpressionErrors: ?ExpressionErrors,\n    andThrow: boolean,\n  ) {\n    if (!refExpressionErrors) return false;\n    const { shorthandAssign, doubleProto } = refExpressionErrors;\n    if (!andThrow) return shorthandAssign >= 0 || doubleProto >= 0;\n    if (shorthandAssign >= 0) {\n      this.unexpected(shorthandAssign);\n    }\n    if (doubleProto >= 0) {\n      this.raise(doubleProto, Errors.DuplicateProto);\n    }\n  }\n}\n\n/**\n * The ExpressionErrors is a context struct used to track\n * - **shorthandAssign**: track initializer `=` position when parsing ambiguous\n *   patterns. When we are sure the parsed pattern is a RHS, which means it is\n *   not a pattern, we will throw on this position on invalid assign syntax,\n *   otherwise it will be reset to -1\n * - **doubleProto**: track the duplicate `__proto__` key position when parsing\n *   ambiguous object patterns. When we are sure the parsed pattern is a RHS,\n *   which means it is an object literal, we will throw on this position for\n *   __proto__ redefinition, otherwise it will be reset to -1\n */\nexport class ExpressionErrors {\n  shorthandAssign = -1;\n  doubleProto = -1;\n}\n","// @flow\n\nimport type Parser from \"./index\";\nimport UtilParser from \"./util\";\nimport { SourceLocation, type Position } from \"../util/location\";\nimport type { Comment, Node as NodeType, NodeBase } from \"../types\";\n\n// Start an AST node, attaching a start offset.\n\nclass Node implements NodeBase {\n  constructor(parser: Parser, pos: number, loc: Position) {\n    this.type = \"\";\n    this.start = pos;\n    this.end = 0;\n    this.loc = new SourceLocation(loc);\n    if (parser && parser.options.ranges) this.range = [pos, 0];\n    if (parser && parser.filename) this.loc.filename = parser.filename;\n  }\n\n  type: string;\n  start: number;\n  end: number;\n  loc: SourceLocation;\n  range: [number, number];\n  leadingComments: Array<Comment>;\n  trailingComments: Array<Comment>;\n  innerComments: Array<Comment>;\n  extra: { [key: string]: any };\n\n  __clone(): this {\n    // $FlowIgnore\n    const newNode: any = new Node();\n    const keys = Object.keys(this);\n    for (let i = 0, length = keys.length; i < length; i++) {\n      const key = keys[i];\n      // Do not clone comments that are already attached to the node\n      if (\n        key !== \"leadingComments\" &&\n        key !== \"trailingComments\" &&\n        key !== \"innerComments\"\n      ) {\n        // $FlowIgnore\n        newNode[key] = this[key];\n      }\n    }\n\n    return newNode;\n  }\n}\n\nexport class NodeUtils extends UtilParser {\n  startNode<T: NodeType>(): T {\n    // $FlowIgnore\n    return new Node(this, this.state.start, this.state.startLoc);\n  }\n\n  startNodeAt<T: NodeType>(pos: number, loc: Position): T {\n    // $FlowIgnore\n    return new Node(this, pos, loc);\n  }\n\n  /** Start a new node with a previous node's location. */\n  startNodeAtNode<T: NodeType>(type: NodeType): T {\n    return this.startNodeAt(type.start, type.loc.start);\n  }\n\n  // Finish an AST node, adding `type` and `end` properties.\n\n  finishNode<T: NodeType>(node: T, type: string): T {\n    return this.finishNodeAt(\n      node,\n      type,\n      this.state.lastTokEnd,\n      this.state.lastTokEndLoc,\n    );\n  }\n\n  // Finish node at given position\n\n  finishNodeAt<T: NodeType>(\n    node: T,\n    type: string,\n    pos: number,\n    loc: Position,\n  ): T {\n    if (process.env.NODE_ENV !== \"production\" && node.end > 0) {\n      throw new Error(\n        \"Do not call finishNode*() twice on the same node.\" +\n          \" Instead use resetEndLocation() or change type directly.\",\n      );\n    }\n    node.type = type;\n    node.end = pos;\n    node.loc.end = loc;\n    if (this.options.ranges) node.range[1] = pos;\n    this.processComment(node);\n    return node;\n  }\n\n  resetStartLocation(node: NodeBase, start: number, startLoc: Position): void {\n    node.start = start;\n    node.loc.start = startLoc;\n    if (this.options.ranges) node.range[0] = start;\n  }\n\n  resetEndLocation(\n    node: NodeBase,\n    end?: number = this.state.lastTokEnd,\n    endLoc?: Position = this.state.lastTokEndLoc,\n  ): void {\n    node.end = end;\n    node.loc.end = endLoc;\n    if (this.options.ranges) node.range[1] = end;\n  }\n\n  /**\n   * Reset the start location of node to the start location of locationNode\n   */\n  resetStartLocationFromNode(node: NodeBase, locationNode: NodeBase): void {\n    this.resetStartLocation(node, locationNode.start, locationNode.loc.start);\n  }\n}\n","// @flow\n\nimport * as charCodes from \"charcodes\";\nimport { types as tt, type TokenType } from \"../tokenizer/types\";\nimport type {\n  TSParameterProperty,\n  Decorator,\n  Expression,\n  Node,\n  Pattern,\n  RestElement,\n  SpreadElement,\n  /*:: Identifier, */\n  /*:: ObjectExpression, */\n  /*:: ObjectPattern, */\n} from \"../types\";\nimport type { Pos, Position } from \"../util/location\";\nimport {\n  isStrictBindOnlyReservedWord,\n  isStrictBindReservedWord,\n} from \"../util/identifier\";\nimport { NodeUtils } from \"./node\";\nimport { type BindingTypes, BIND_NONE } from \"../util/scopeflags\";\nimport { ExpressionErrors } from \"./util\";\nimport { Errors } from \"./location\";\n\nconst unwrapParenthesizedExpression = (node: Node) => {\n  return node.type === \"ParenthesizedExpression\"\n    ? unwrapParenthesizedExpression(node.expression)\n    : node;\n};\n\nexport default class LValParser extends NodeUtils {\n  // Forward-declaration: defined in expression.js\n  /*::\n  +parseIdentifier: (liberal?: boolean) => Identifier;\n  +parseMaybeAssign: (\n    noIn?: ?boolean,\n    refExpressionErrors?: ?ExpressionErrors,\n    afterLeftParse?: Function,\n    refNeedsArrowPos?: ?Pos,\n  ) => Expression;\n  +parseObj: <T: ObjectPattern | ObjectExpression>(\n    close: TokenType,\n    isPattern: boolean,\n    isRecord?: ?boolean,\n    refExpressionErrors?: ?ExpressionErrors,\n  ) => T;\n  */\n  // Forward-declaration: defined in statement.js\n  /*::\n  +parseDecorator: () => Decorator;\n  */\n\n  // Convert existing expression atom to assignable pattern\n  // if possible.\n  // NOTE: There is a corresponding \"isAssignable\" method in flow.js.\n  // When this one is updated, please check if also that one needs to be updated.\n\n  toAssignable(node: Node): Node {\n    let parenthesized = undefined;\n    if (node.type === \"ParenthesizedExpression\" || node.extra?.parenthesized) {\n      parenthesized = unwrapParenthesizedExpression(node);\n      if (\n        parenthesized.type !== \"Identifier\" &&\n        parenthesized.type !== \"MemberExpression\"\n      ) {\n        this.raise(node.start, Errors.InvalidParenthesizedAssignment);\n      }\n    }\n\n    switch (node.type) {\n      case \"Identifier\":\n      case \"ObjectPattern\":\n      case \"ArrayPattern\":\n      case \"AssignmentPattern\":\n        break;\n\n      case \"ObjectExpression\":\n        node.type = \"ObjectPattern\";\n        for (\n          let i = 0, length = node.properties.length, last = length - 1;\n          i < length;\n          i++\n        ) {\n          const prop = node.properties[i];\n          const isLast = i === last;\n          this.toAssignableObjectExpressionProp(prop, isLast);\n\n          if (\n            isLast &&\n            prop.type === \"RestElement\" &&\n            node.extra?.trailingComma\n          ) {\n            this.raiseRestNotLast(node.extra.trailingComma);\n          }\n        }\n        break;\n\n      case \"ObjectProperty\":\n        this.toAssignable(node.value);\n        break;\n\n      case \"SpreadElement\": {\n        this.checkToRestConversion(node);\n\n        node.type = \"RestElement\";\n        const arg = node.argument;\n        this.toAssignable(arg);\n        break;\n      }\n\n      case \"ArrayExpression\":\n        node.type = \"ArrayPattern\";\n        this.toAssignableList(node.elements, node.extra?.trailingComma);\n        break;\n\n      case \"AssignmentExpression\":\n        if (node.operator !== \"=\") {\n          this.raise(node.left.end, Errors.MissingEqInAssignment);\n        }\n\n        node.type = \"AssignmentPattern\";\n        delete node.operator;\n        this.toAssignable(node.left);\n        break;\n\n      case \"ParenthesizedExpression\":\n        this.toAssignable(((parenthesized: any): Expression));\n        break;\n\n      default:\n      // We don't know how to deal with this node. It will\n      // be reported by a later call to checkLVal\n    }\n    return node;\n  }\n\n  toAssignableObjectExpressionProp(prop: Node, isLast: boolean) {\n    if (prop.type === \"ObjectMethod\") {\n      const error =\n        prop.kind === \"get\" || prop.kind === \"set\"\n          ? Errors.PatternHasAccessor\n          : Errors.PatternHasMethod;\n\n      this.raise(prop.key.start, error);\n    } else if (prop.type === \"SpreadElement\" && !isLast) {\n      this.raiseRestNotLast(prop.start);\n    } else {\n      this.toAssignable(prop);\n    }\n  }\n\n  // Convert list of expression atoms to binding list.\n\n  toAssignableList(\n    exprList: Expression[],\n    trailingCommaPos?: ?number,\n  ): $ReadOnlyArray<Pattern> {\n    let end = exprList.length;\n    if (end) {\n      const last = exprList[end - 1];\n      if (last && last.type === \"RestElement\") {\n        --end;\n      } else if (last && last.type === \"SpreadElement\") {\n        last.type = \"RestElement\";\n        const arg = last.argument;\n        this.toAssignable(arg);\n        if (\n          arg.type !== \"Identifier\" &&\n          arg.type !== \"MemberExpression\" &&\n          arg.type !== \"ArrayPattern\" &&\n          arg.type !== \"ObjectPattern\"\n        ) {\n          this.unexpected(arg.start);\n        }\n\n        if (trailingCommaPos) {\n          this.raiseTrailingCommaAfterRest(trailingCommaPos);\n        }\n\n        --end;\n      }\n    }\n    for (let i = 0; i < end; i++) {\n      const elt = exprList[i];\n      if (elt) {\n        this.toAssignable(elt);\n        if (elt.type === \"RestElement\") {\n          this.raiseRestNotLast(elt.start);\n        }\n      }\n    }\n    return exprList;\n  }\n\n  // Convert list of expression atoms to a list of\n\n  toReferencedList(\n    exprList: $ReadOnlyArray<?Expression>,\n    isParenthesizedExpr?: boolean, // eslint-disable-line no-unused-vars\n  ): $ReadOnlyArray<?Expression> {\n    return exprList;\n  }\n\n  toReferencedListDeep(\n    exprList: $ReadOnlyArray<?Expression>,\n    isParenthesizedExpr?: boolean,\n  ): void {\n    this.toReferencedList(exprList, isParenthesizedExpr);\n\n    for (const expr of exprList) {\n      if (expr && expr.type === \"ArrayExpression\") {\n        this.toReferencedListDeep(expr.elements);\n      }\n    }\n  }\n\n  // Parses spread element.\n\n  parseSpread(\n    refExpressionErrors: ?ExpressionErrors,\n    refNeedsArrowPos?: ?Pos,\n  ): SpreadElement {\n    const node = this.startNode();\n    this.next();\n    node.argument = this.parseMaybeAssign(\n      false,\n      refExpressionErrors,\n      undefined,\n      refNeedsArrowPos,\n    );\n    return this.finishNode(node, \"SpreadElement\");\n  }\n\n  parseRestBinding(): RestElement {\n    const node = this.startNode();\n    this.next();\n    node.argument = this.parseBindingAtom();\n    return this.finishNode(node, \"RestElement\");\n  }\n\n  // Parses lvalue (assignable) atom.\n  parseBindingAtom(): Pattern {\n    switch (this.state.type) {\n      case tt.bracketL: {\n        const node = this.startNode();\n        this.next();\n        node.elements = this.parseBindingList(\n          tt.bracketR,\n          charCodes.rightSquareBracket,\n          true,\n        );\n        return this.finishNode(node, \"ArrayPattern\");\n      }\n\n      case tt.braceL:\n        return this.parseObj(tt.braceR, true);\n    }\n\n    return this.parseIdentifier();\n  }\n\n  parseBindingList(\n    close: TokenType,\n    closeCharCode: $Values<typeof charCodes>,\n    allowEmpty?: boolean,\n    allowModifiers?: boolean,\n  ): $ReadOnlyArray<Pattern | TSParameterProperty> {\n    const elts: Array<Pattern | TSParameterProperty> = [];\n    let first = true;\n    while (!this.eat(close)) {\n      if (first) {\n        first = false;\n      } else {\n        this.expect(tt.comma);\n      }\n      if (allowEmpty && this.match(tt.comma)) {\n        // $FlowFixMe This method returns `$ReadOnlyArray<?Pattern>` if `allowEmpty` is set.\n        elts.push(null);\n      } else if (this.eat(close)) {\n        break;\n      } else if (this.match(tt.ellipsis)) {\n        elts.push(this.parseAssignableListItemTypes(this.parseRestBinding()));\n        this.checkCommaAfterRest(closeCharCode);\n        this.expect(close);\n        break;\n      } else {\n        const decorators = [];\n        if (this.match(tt.at) && this.hasPlugin(\"decorators\")) {\n          this.raise(this.state.start, Errors.UnsupportedParameterDecorator);\n        }\n        while (this.match(tt.at)) {\n          decorators.push(this.parseDecorator());\n        }\n        elts.push(this.parseAssignableListItem(allowModifiers, decorators));\n      }\n    }\n    return elts;\n  }\n\n  parseAssignableListItem(\n    allowModifiers: ?boolean,\n    decorators: Decorator[],\n  ): Pattern | TSParameterProperty {\n    const left = this.parseMaybeDefault();\n    this.parseAssignableListItemTypes(left);\n    const elt = this.parseMaybeDefault(left.start, left.loc.start, left);\n    if (decorators.length) {\n      left.decorators = decorators;\n    }\n    return elt;\n  }\n\n  parseAssignableListItemTypes(param: Pattern): Pattern {\n    return param;\n  }\n\n  // Parses assignment pattern around given atom if possible.\n\n  parseMaybeDefault(\n    startPos?: ?number,\n    startLoc?: ?Position,\n    left?: ?Pattern,\n  ): Pattern {\n    startLoc = startLoc || this.state.startLoc;\n    startPos = startPos || this.state.start;\n    left = left || this.parseBindingAtom();\n    if (!this.eat(tt.eq)) return left;\n\n    const node = this.startNodeAt(startPos, startLoc);\n    node.left = left;\n    node.right = this.parseMaybeAssign();\n    return this.finishNode(node, \"AssignmentPattern\");\n  }\n\n  // Verify that a node is an lval — something that can be assigned\n  // to.\n\n  checkLVal(\n    expr: Expression,\n    bindingType: BindingTypes = BIND_NONE,\n    checkClashes: ?{ [key: string]: boolean },\n    contextDescription: string,\n    disallowLetBinding?: boolean,\n    strictModeChanged?: boolean = false,\n  ): void {\n    switch (expr.type) {\n      case \"Identifier\":\n        if (\n          this.state.strict &&\n          // \"Global\" reserved words have already been checked by parseIdentifier,\n          // unless they have been found in the id or parameters of a strict-mode\n          // function in a sloppy context.\n          (strictModeChanged\n            ? isStrictBindReservedWord(expr.name, this.inModule)\n            : isStrictBindOnlyReservedWord(expr.name))\n        ) {\n          this.raise(\n            expr.start,\n            bindingType === BIND_NONE\n              ? Errors.StrictEvalArguments\n              : Errors.StrictEvalArgumentsBinding,\n            expr.name,\n          );\n        }\n\n        if (checkClashes) {\n          // we need to prefix this with an underscore for the cases where we have a key of\n          // `__proto__`. there's a bug in old V8 where the following wouldn't work:\n          //\n          //   > var obj = Object.create(null);\n          //   undefined\n          //   > obj.__proto__\n          //   null\n          //   > obj.__proto__ = true;\n          //   true\n          //   > obj.__proto__\n          //   null\n          const key = `_${expr.name}`;\n\n          if (checkClashes[key]) {\n            this.raise(expr.start, Errors.ParamDupe);\n          } else {\n            checkClashes[key] = true;\n          }\n        }\n        if (disallowLetBinding && expr.name === \"let\") {\n          this.raise(expr.start, Errors.LetInLexicalBinding);\n        }\n        if (!(bindingType & BIND_NONE)) {\n          this.scope.declareName(expr.name, bindingType, expr.start);\n        }\n        break;\n\n      case \"MemberExpression\":\n        if (bindingType !== BIND_NONE) {\n          this.raise(expr.start, Errors.InvalidPropertyBindingPattern);\n        }\n        break;\n\n      case \"ObjectPattern\":\n        for (let prop of expr.properties) {\n          if (prop.type === \"ObjectProperty\") prop = prop.value;\n          // If we find here an ObjectMethod, it's because this was originally\n          // an ObjectExpression which has then been converted.\n          // toAssignable already reported this error with a nicer message.\n          else if (prop.type === \"ObjectMethod\") continue;\n\n          this.checkLVal(\n            prop,\n            bindingType,\n            checkClashes,\n            \"object destructuring pattern\",\n            disallowLetBinding,\n          );\n        }\n        break;\n\n      case \"ArrayPattern\":\n        for (const elem of expr.elements) {\n          if (elem) {\n            this.checkLVal(\n              elem,\n              bindingType,\n              checkClashes,\n              \"array destructuring pattern\",\n              disallowLetBinding,\n            );\n          }\n        }\n        break;\n\n      case \"AssignmentPattern\":\n        this.checkLVal(\n          expr.left,\n          bindingType,\n          checkClashes,\n          \"assignment pattern\",\n        );\n        break;\n\n      case \"RestElement\":\n        this.checkLVal(\n          expr.argument,\n          bindingType,\n          checkClashes,\n          \"rest element\",\n        );\n        break;\n\n      case \"ParenthesizedExpression\":\n        this.checkLVal(\n          expr.expression,\n          bindingType,\n          checkClashes,\n          \"parenthesized expression\",\n        );\n        break;\n\n      default: {\n        this.raise(\n          expr.start,\n          bindingType === BIND_NONE\n            ? Errors.InvalidLhs\n            : Errors.InvalidLhsBinding,\n          contextDescription,\n        );\n      }\n    }\n  }\n\n  checkToRestConversion(node: SpreadElement): void {\n    if (\n      node.argument.type !== \"Identifier\" &&\n      node.argument.type !== \"MemberExpression\"\n    ) {\n      this.raise(node.argument.start, Errors.InvalidRestAssignmentPattern);\n    }\n  }\n\n  checkCommaAfterRest(close: $Values<typeof charCodes>): void {\n    if (this.match(tt.comma)) {\n      if (this.lookaheadCharCode() === close) {\n        this.raiseTrailingCommaAfterRest(this.state.start);\n      } else {\n        this.raiseRestNotLast(this.state.start);\n      }\n    }\n  }\n\n  raiseRestNotLast(pos: number) {\n    throw this.raise(pos, Errors.ElementAfterRest);\n  }\n\n  raiseTrailingCommaAfterRest(pos: number) {\n    this.raise(pos, Errors.RestTrailingComma);\n  }\n}\n","// @flow\n\n// A recursive descent parser operates by defining functions for all\n// syntactic elements, and recursively calling those, each function\n// advancing the input stream and returning an AST node. Precedence\n// of constructs (for example, the fact that `!x[1]` means `!(x[1])`\n// instead of `(!x)[1]` is handled by the fact that the parser\n// function that parses unary prefix operators is called first, and\n// in turn calls the function that parses `[]` subscripts — that\n// way, it'll receive the node for `x[1]` already parsed, and wraps\n// *that* in the unary operator node.\n//\n// Acorn uses an [operator precedence parser][opp] to handle binary\n// operator precedence, because it is much more compact than using\n// the technique outlined above, which uses different, nesting\n// functions to specify precedence, for all of the ten binary\n// precedence levels that JavaScript defines.\n//\n// [opp]: http://en.wikipedia.org/wiki/Operator-precedence_parser\n\nimport { types as tt, type TokenType } from \"../tokenizer/types\";\nimport { types as ct } from \"../tokenizer/context\";\nimport * as N from \"../types\";\nimport LValParser from \"./lval\";\nimport {\n  isKeyword,\n  isReservedWord,\n  isStrictReservedWord,\n  isStrictBindReservedWord,\n} from \"../util/identifier\";\nimport type { Pos, Position } from \"../util/location\";\nimport * as charCodes from \"charcodes\";\nimport {\n  BIND_OUTSIDE,\n  BIND_VAR,\n  SCOPE_ARROW,\n  SCOPE_CLASS,\n  SCOPE_DIRECT_SUPER,\n  SCOPE_FUNCTION,\n  SCOPE_SUPER,\n  SCOPE_PROGRAM,\n} from \"../util/scopeflags\";\nimport { ExpressionErrors } from \"./util\";\nimport {\n  PARAM_AWAIT,\n  PARAM_RETURN,\n  PARAM,\n  functionFlags,\n} from \"../util/production-parameter\";\nimport { Errors } from \"./location\";\n\nexport default class ExpressionParser extends LValParser {\n  // Forward-declaration: defined in statement.js\n  /*::\n  +parseBlock: (\n    allowDirectives?: boolean,\n    createNewLexicalScope?: boolean,\n    afterBlockParse?: (hasStrictModeDirective: boolean) => void,\n  ) => N.BlockStatement;\n  +parseClass: (\n    node: N.Class,\n    isStatement: boolean,\n    optionalId?: boolean,\n  ) => N.Class;\n  +parseDecorators: (allowExport?: boolean) => void;\n  +parseFunction: <T: N.NormalFunction>(\n    node: T,\n    statement?: number,\n    allowExpressionBody?: boolean,\n    isAsync?: boolean,\n  ) => T;\n  +parseFunctionParams: (node: N.Function, allowModifiers?: boolean) => void;\n  +takeDecorators: (node: N.HasDecorators) => void;\n  */\n\n  // Check if property __proto__ has been used more than once.\n  // If the expression is a destructuring assignment, then __proto__ may appear\n  // multiple times. Otherwise, __proto__ is a duplicated key.\n\n  checkDuplicatedProto(\n    prop: N.ObjectMember | N.SpreadElement,\n    protoRef: { used: boolean },\n    refExpressionErrors: ?ExpressionErrors,\n  ): void {\n    if (\n      prop.type === \"SpreadElement\" ||\n      prop.computed ||\n      prop.kind ||\n      // $FlowIgnore\n      prop.shorthand\n    ) {\n      return;\n    }\n\n    const key = prop.key;\n    // It is either an Identifier or a String/NumericLiteral\n    const name = key.type === \"Identifier\" ? key.name : String(key.value);\n\n    if (name === \"__proto__\") {\n      if (protoRef.used) {\n        if (refExpressionErrors) {\n          // Store the first redefinition's position, otherwise ignore because\n          // we are parsing ambiguous pattern\n          if (refExpressionErrors.doubleProto === -1) {\n            refExpressionErrors.doubleProto = key.start;\n          }\n        } else {\n          this.raise(key.start, Errors.DuplicateProto);\n        }\n      }\n\n      protoRef.used = true;\n    }\n  }\n\n  // Convenience method to parse an Expression only\n  getExpression(): N.Expression {\n    let paramFlags = PARAM;\n    if (this.hasPlugin(\"topLevelAwait\") && this.inModule) {\n      paramFlags |= PARAM_AWAIT;\n    }\n    this.scope.enter(SCOPE_PROGRAM);\n    this.prodParam.enter(paramFlags);\n    this.nextToken();\n    const expr = this.parseExpression();\n    if (!this.match(tt.eof)) {\n      this.unexpected();\n    }\n    expr.comments = this.state.comments;\n    expr.errors = this.state.errors;\n    return expr;\n  }\n\n  // ### Expression parsing\n\n  // These nest, from the most general expression type at the top to\n  // 'atomic', nondivisible expression types at the bottom. Most of\n  // the functions will simply let the function (s) below them parse,\n  // and, *if* the syntactic construct they handle is present, wrap\n  // the AST node that the inner parser gave them in another node.\n\n  // Parse a full expression.\n  // - `noIn`\n  //   is used to forbid the `in` operator (in for loops initialization expressions)\n  //   When `noIn` is true, the production parameter [In] is not present.\n  //   Whenever [?In] appears in the right-hand sides of a production, we pass\n  //   `noIn` to the subroutine calls.\n\n  // - `refExpressionErrors `\n  //   provides reference for storing '=' operator inside shorthand\n  //   property assignment in contexts where both object expression\n  //   and object pattern might appear (so it's possible to raise\n  //   delayed syntax error at correct position).\n\n  parseExpression(\n    noIn?: boolean,\n    refExpressionErrors?: ExpressionErrors,\n  ): N.Expression {\n    const startPos = this.state.start;\n    const startLoc = this.state.startLoc;\n    const expr = this.parseMaybeAssign(noIn, refExpressionErrors);\n    if (this.match(tt.comma)) {\n      const node = this.startNodeAt(startPos, startLoc);\n      node.expressions = [expr];\n      while (this.eat(tt.comma)) {\n        node.expressions.push(this.parseMaybeAssign(noIn, refExpressionErrors));\n      }\n      this.toReferencedList(node.expressions);\n      return this.finishNode(node, \"SequenceExpression\");\n    }\n    return expr;\n  }\n\n  // Parse an assignment expression. This includes applications of\n  // operators like `+=`.\n\n  parseMaybeAssign(\n    noIn?: ?boolean,\n    refExpressionErrors?: ?ExpressionErrors,\n    afterLeftParse?: Function,\n    refNeedsArrowPos?: ?Pos,\n  ): N.Expression {\n    const startPos = this.state.start;\n    const startLoc = this.state.startLoc;\n    if (this.isContextual(\"yield\")) {\n      if (this.prodParam.hasYield) {\n        let left = this.parseYield(noIn);\n        if (afterLeftParse) {\n          left = afterLeftParse.call(this, left, startPos, startLoc);\n        }\n        return left;\n      } else {\n        // The tokenizer will assume an expression is allowed after\n        // `yield`, but this isn't that kind of yield\n        this.state.exprAllowed = false;\n      }\n    }\n\n    let ownExpressionErrors;\n    if (refExpressionErrors) {\n      ownExpressionErrors = false;\n    } else {\n      refExpressionErrors = new ExpressionErrors();\n      ownExpressionErrors = true;\n    }\n\n    if (this.match(tt.parenL) || this.match(tt.name)) {\n      this.state.potentialArrowAt = this.state.start;\n    }\n\n    let left = this.parseMaybeConditional(\n      noIn,\n      refExpressionErrors,\n      refNeedsArrowPos,\n    );\n    if (afterLeftParse) {\n      left = afterLeftParse.call(this, left, startPos, startLoc);\n    }\n    if (this.state.type.isAssign) {\n      const node = this.startNodeAt(startPos, startLoc);\n      const operator = this.state.value;\n      node.operator = operator;\n\n      if (operator === \"??=\") {\n        this.expectPlugin(\"logicalAssignment\");\n      }\n      if (operator === \"||=\" || operator === \"&&=\") {\n        this.expectPlugin(\"logicalAssignment\");\n      }\n      if (this.match(tt.eq)) {\n        node.left = this.toAssignable(left);\n        refExpressionErrors.doubleProto = -1; // reset because double __proto__ is valid in assignment expression\n      } else {\n        node.left = left;\n      }\n\n      if (refExpressionErrors.shorthandAssign >= node.left.start) {\n        refExpressionErrors.shorthandAssign = -1; // reset because shorthand default was used correctly\n      }\n\n      this.checkLVal(left, undefined, undefined, \"assignment expression\");\n\n      this.next();\n      node.right = this.parseMaybeAssign(noIn);\n      return this.finishNode(node, \"AssignmentExpression\");\n    } else if (ownExpressionErrors) {\n      this.checkExpressionErrors(refExpressionErrors, true);\n    }\n\n    return left;\n  }\n\n  // Parse a ternary conditional (`?:`) operator.\n\n  parseMaybeConditional(\n    noIn: ?boolean,\n    refExpressionErrors: ExpressionErrors,\n    refNeedsArrowPos?: ?Pos,\n  ): N.Expression {\n    const startPos = this.state.start;\n    const startLoc = this.state.startLoc;\n    const potentialArrowAt = this.state.potentialArrowAt;\n    const expr = this.parseExprOps(noIn, refExpressionErrors);\n\n    if (\n      expr.type === \"ArrowFunctionExpression\" &&\n      expr.start === potentialArrowAt\n    ) {\n      return expr;\n    }\n    if (this.checkExpressionErrors(refExpressionErrors, false)) return expr;\n\n    return this.parseConditional(\n      expr,\n      noIn,\n      startPos,\n      startLoc,\n      refNeedsArrowPos,\n    );\n  }\n\n  parseConditional(\n    expr: N.Expression,\n    noIn: ?boolean,\n    startPos: number,\n    startLoc: Position,\n    // FIXME: Disabling this for now since can't seem to get it to play nicely\n    // eslint-disable-next-line no-unused-vars\n    refNeedsArrowPos?: ?Pos,\n  ): N.Expression {\n    if (this.eat(tt.question)) {\n      const node = this.startNodeAt(startPos, startLoc);\n      node.test = expr;\n      node.consequent = this.parseMaybeAssign();\n      this.expect(tt.colon);\n      node.alternate = this.parseMaybeAssign(noIn);\n      return this.finishNode(node, \"ConditionalExpression\");\n    }\n    return expr;\n  }\n\n  // Start the precedence parser.\n\n  parseExprOps(\n    noIn: ?boolean,\n    refExpressionErrors: ExpressionErrors,\n  ): N.Expression {\n    const startPos = this.state.start;\n    const startLoc = this.state.startLoc;\n    const potentialArrowAt = this.state.potentialArrowAt;\n    const expr = this.parseMaybeUnary(refExpressionErrors);\n\n    if (\n      expr.type === \"ArrowFunctionExpression\" &&\n      expr.start === potentialArrowAt\n    ) {\n      return expr;\n    }\n    if (this.checkExpressionErrors(refExpressionErrors, false)) {\n      return expr;\n    }\n\n    return this.parseExprOp(expr, startPos, startLoc, -1, noIn);\n  }\n\n  // Parse binary operators with the operator precedence parsing\n  // algorithm. `left` is the left-hand side of the operator.\n  // `minPrec` provides context that allows the function to stop and\n  // defer further parser to one of its callers when it encounters an\n  // operator that has a lower precedence than the set it is parsing.\n\n  parseExprOp(\n    left: N.Expression,\n    leftStartPos: number,\n    leftStartLoc: Position,\n    minPrec: number,\n    noIn: ?boolean,\n  ): N.Expression {\n    let prec = this.state.type.binop;\n    if (prec != null && (!noIn || !this.match(tt._in))) {\n      if (prec > minPrec) {\n        const operator = this.state.value;\n        if (operator === \"|>\" && this.state.inFSharpPipelineDirectBody) {\n          return left;\n        }\n        const node = this.startNodeAt(leftStartPos, leftStartLoc);\n        node.left = left;\n        node.operator = operator;\n        if (\n          operator === \"**\" &&\n          left.type === \"UnaryExpression\" &&\n          (this.options.createParenthesizedExpressions ||\n            !(left.extra && left.extra.parenthesized))\n        ) {\n          this.raise(\n            left.argument.start,\n            Errors.UnexpectedTokenUnaryExponentiation,\n          );\n        }\n\n        const op = this.state.type;\n        const logical = op === tt.logicalOR || op === tt.logicalAND;\n        const coalesce = op === tt.nullishCoalescing;\n\n        if (op === tt.pipeline) {\n          this.expectPlugin(\"pipelineOperator\");\n          this.state.inPipeline = true;\n          this.checkPipelineAtInfixOperator(left, leftStartPos);\n        } else if (coalesce) {\n          // Handle the precedence of `tt.coalesce` as equal to the range of logical expressions.\n          // In other words, `node.right` shouldn't contain logical expressions in order to check the mixed error.\n          prec = ((tt.logicalAND: any): { binop: number }).binop;\n        }\n\n        this.next();\n\n        if (\n          op === tt.pipeline &&\n          this.getPluginOption(\"pipelineOperator\", \"proposal\") === \"minimal\"\n        ) {\n          if (\n            this.match(tt.name) &&\n            this.state.value === \"await\" &&\n            this.prodParam.hasAwait\n          ) {\n            throw this.raise(\n              this.state.start,\n              Errors.UnexpectedAwaitAfterPipelineBody,\n            );\n          }\n        }\n\n        node.right = this.parseExprOpRightExpr(op, prec, noIn);\n        this.finishNode(\n          node,\n          logical || coalesce ? \"LogicalExpression\" : \"BinaryExpression\",\n        );\n        /* this check is for all ?? operators\n         * a ?? b && c for this example\n         * when op is coalesce and nextOp is logical (&&), throw at the pos of nextOp that it can not be mixed.\n         * Symmetrically it also throws when op is logical and nextOp is coalesce\n         */\n        const nextOp = this.state.type;\n        if (\n          (coalesce && (nextOp === tt.logicalOR || nextOp === tt.logicalAND)) ||\n          (logical && nextOp === tt.nullishCoalescing)\n        ) {\n          throw this.raise(this.state.start, Errors.MixingCoalesceWithLogical);\n        }\n\n        return this.parseExprOp(\n          node,\n          leftStartPos,\n          leftStartLoc,\n          minPrec,\n          noIn,\n        );\n      }\n    }\n    return left;\n  }\n\n  // Helper function for `parseExprOp`. Parse the right-hand side of binary-\n  // operator expressions, then apply any operator-specific functions.\n\n  parseExprOpRightExpr(\n    op: TokenType,\n    prec: number,\n    noIn: ?boolean,\n  ): N.Expression {\n    const startPos = this.state.start;\n    const startLoc = this.state.startLoc;\n    switch (op) {\n      case tt.pipeline:\n        switch (this.getPluginOption(\"pipelineOperator\", \"proposal\")) {\n          case \"smart\":\n            return this.withTopicPermittingContext(() => {\n              return this.parseSmartPipelineBody(\n                this.parseExprOpBaseRightExpr(op, prec, noIn),\n                startPos,\n                startLoc,\n              );\n            });\n          case \"fsharp\":\n            return this.withSoloAwaitPermittingContext(() => {\n              return this.parseFSharpPipelineBody(prec, noIn);\n            });\n        }\n      // falls through\n\n      default:\n        return this.parseExprOpBaseRightExpr(op, prec, noIn);\n    }\n  }\n\n  // Helper function for `parseExprOpRightExpr`. Parse the right-hand side of\n  // binary-operator expressions without applying any operator-specific functions.\n\n  parseExprOpBaseRightExpr(\n    op: TokenType,\n    prec: number,\n    noIn: ?boolean,\n  ): N.Expression {\n    const startPos = this.state.start;\n    const startLoc = this.state.startLoc;\n\n    return this.parseExprOp(\n      this.parseMaybeUnary(),\n      startPos,\n      startLoc,\n      op.rightAssociative ? prec - 1 : prec,\n      noIn,\n    );\n  }\n\n  // Parse unary operators, both prefix and postfix.\n\n  parseMaybeUnary(refExpressionErrors: ?ExpressionErrors): N.Expression {\n    if (this.isContextual(\"await\") && this.isAwaitAllowed()) {\n      return this.parseAwait();\n    } else if (this.state.type.prefix) {\n      const node = this.startNode();\n      const update = this.match(tt.incDec);\n      node.operator = this.state.value;\n      node.prefix = true;\n\n      if (node.operator === \"throw\") {\n        this.expectPlugin(\"throwExpressions\");\n      }\n      this.next();\n\n      node.argument = this.parseMaybeUnary();\n\n      this.checkExpressionErrors(refExpressionErrors, true);\n\n      if (update) {\n        this.checkLVal(node.argument, undefined, undefined, \"prefix operation\");\n      } else if (this.state.strict && node.operator === \"delete\") {\n        const arg = node.argument;\n\n        if (arg.type === \"Identifier\") {\n          this.raise(node.start, Errors.StrictDelete);\n        } else if (\n          arg.type === \"MemberExpression\" &&\n          arg.property.type === \"PrivateName\"\n        ) {\n          this.raise(node.start, Errors.DeletePrivateField);\n        }\n      }\n\n      return this.finishNode(\n        node,\n        update ? \"UpdateExpression\" : \"UnaryExpression\",\n      );\n    }\n\n    const startPos = this.state.start;\n    const startLoc = this.state.startLoc;\n    let expr = this.parseExprSubscripts(refExpressionErrors);\n    if (this.checkExpressionErrors(refExpressionErrors, false)) return expr;\n    while (this.state.type.postfix && !this.canInsertSemicolon()) {\n      const node = this.startNodeAt(startPos, startLoc);\n      node.operator = this.state.value;\n      node.prefix = false;\n      node.argument = expr;\n      this.checkLVal(expr, undefined, undefined, \"postfix operation\");\n      this.next();\n      expr = this.finishNode(node, \"UpdateExpression\");\n    }\n    return expr;\n  }\n\n  // Parse call, dot, and `[]`-subscript expressions.\n\n  parseExprSubscripts(refExpressionErrors: ?ExpressionErrors): N.Expression {\n    const startPos = this.state.start;\n    const startLoc = this.state.startLoc;\n    const potentialArrowAt = this.state.potentialArrowAt;\n    const expr = this.parseExprAtom(refExpressionErrors);\n\n    if (\n      expr.type === \"ArrowFunctionExpression\" &&\n      expr.start === potentialArrowAt\n    ) {\n      return expr;\n    }\n\n    return this.parseSubscripts(expr, startPos, startLoc);\n  }\n\n  parseSubscripts(\n    base: N.Expression,\n    startPos: number,\n    startLoc: Position,\n    noCalls?: ?boolean,\n  ): N.Expression {\n    const state = {\n      optionalChainMember: false,\n      maybeAsyncArrow: this.atPossibleAsyncArrow(base),\n      stop: false,\n    };\n    do {\n      const oldMaybeInAsyncArrowHead = this.state.maybeInAsyncArrowHead;\n      if (state.maybeAsyncArrow) {\n        this.state.maybeInAsyncArrowHead = true;\n      }\n      base = this.parseSubscript(base, startPos, startLoc, noCalls, state);\n\n      // After parsing a subscript, this isn't \"async\" for sure.\n      state.maybeAsyncArrow = false;\n      this.state.maybeInAsyncArrowHead = oldMaybeInAsyncArrowHead;\n    } while (!state.stop);\n    return base;\n  }\n\n  /**\n   * @param state Set 'state.stop = true' to indicate that we should stop parsing subscripts.\n   *   state.optionalChainMember to indicate that the member is currently in OptionalChain\n   */\n  parseSubscript(\n    base: N.Expression,\n    startPos: number,\n    startLoc: Position,\n    noCalls: ?boolean,\n    state: N.ParseSubscriptState,\n  ): N.Expression {\n    if (!noCalls && this.eat(tt.doubleColon)) {\n      const node = this.startNodeAt(startPos, startLoc);\n      node.object = base;\n      node.callee = this.parseNoCallExpr();\n      state.stop = true;\n      return this.parseSubscripts(\n        this.finishNode(node, \"BindExpression\"),\n        startPos,\n        startLoc,\n        noCalls,\n      );\n    }\n    let optional = false;\n    if (this.match(tt.questionDot)) {\n      state.optionalChainMember = optional = true;\n      if (noCalls && this.lookaheadCharCode() === charCodes.leftParenthesis) {\n        state.stop = true;\n        return base;\n      }\n      this.next();\n    }\n    const computed = this.eat(tt.bracketL);\n    if (\n      (optional && !this.match(tt.parenL) && !this.match(tt.backQuote)) ||\n      computed ||\n      this.eat(tt.dot)\n    ) {\n      const node = this.startNodeAt(startPos, startLoc);\n      node.object = base;\n      node.property = computed\n        ? this.parseExpression()\n        : optional\n        ? this.parseIdentifier(true)\n        : this.parseMaybePrivateName(true);\n      node.computed = computed;\n\n      if (node.property.type === \"PrivateName\") {\n        if (node.object.type === \"Super\") {\n          this.raise(startPos, Errors.SuperPrivateField);\n        }\n        this.classScope.usePrivateName(\n          node.property.id.name,\n          node.property.start,\n        );\n      }\n\n      if (computed) {\n        this.expect(tt.bracketR);\n      }\n\n      if (state.optionalChainMember) {\n        node.optional = optional;\n        return this.finishNode(node, \"OptionalMemberExpression\");\n      } else {\n        return this.finishNode(node, \"MemberExpression\");\n      }\n    } else if (!noCalls && this.match(tt.parenL)) {\n      const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;\n      const oldYieldPos = this.state.yieldPos;\n      const oldAwaitPos = this.state.awaitPos;\n      this.state.maybeInArrowParameters = true;\n      this.state.yieldPos = -1;\n      this.state.awaitPos = -1;\n\n      this.next();\n\n      let node = this.startNodeAt(startPos, startLoc);\n      node.callee = base;\n\n      if (optional) {\n        node.optional = true;\n        node.arguments = this.parseCallExpressionArguments(tt.parenR, false);\n      } else {\n        node.arguments = this.parseCallExpressionArguments(\n          tt.parenR,\n          state.maybeAsyncArrow,\n          base.type === \"Import\",\n          base.type !== \"Super\",\n          node,\n        );\n      }\n      this.finishCallExpression(node, state.optionalChainMember);\n\n      if (state.maybeAsyncArrow && this.shouldParseAsyncArrow() && !optional) {\n        state.stop = true;\n\n        node = this.parseAsyncArrowFromCallExpression(\n          this.startNodeAt(startPos, startLoc),\n          node,\n        );\n        this.checkYieldAwaitInDefaultParams();\n        this.state.yieldPos = oldYieldPos;\n        this.state.awaitPos = oldAwaitPos;\n      } else {\n        this.toReferencedListDeep(node.arguments);\n\n        // We keep the old value if it isn't null, for cases like\n        //   (x = async(yield)) => {}\n        //\n        // Hi developer of the future :) If you are implementing generator\n        // arrow functions, please read the note below about \"await\" and\n        // verify if the same logic is needed for yield.\n        if (oldYieldPos !== -1) this.state.yieldPos = oldYieldPos;\n\n        // Await is trickier than yield. When parsing a possible arrow function\n        // (e.g. something starting with `async(`) we don't know if its possible\n        // parameters will actually be inside an async arrow function or if it is\n        // a normal call expression.\n        // If it ended up being a call expression, if we are in a context where\n        // await expression are disallowed (and thus \"await\" is an identifier)\n        // we must be careful not to leak this.state.awaitPos to an even outer\n        // context, where \"await\" could not be an identifier.\n        // For example, this code is valid because \"await\" isn't directly inside\n        // an async function:\n        //\n        //     async function a() {\n        //       function b(param = async (await)) {\n        //       }\n        //     }\n        //\n        if (\n          (!this.isAwaitAllowed() && !oldMaybeInArrowParameters) ||\n          oldAwaitPos !== -1\n        ) {\n          this.state.awaitPos = oldAwaitPos;\n        }\n      }\n\n      this.state.maybeInArrowParameters = oldMaybeInArrowParameters;\n\n      return node;\n    } else if (this.match(tt.backQuote)) {\n      return this.parseTaggedTemplateExpression(\n        startPos,\n        startLoc,\n        base,\n        state,\n      );\n    } else {\n      state.stop = true;\n      return base;\n    }\n  }\n\n  parseTaggedTemplateExpression(\n    startPos: number,\n    startLoc: Position,\n    base: N.Expression,\n    state: N.ParseSubscriptState,\n    typeArguments?: ?N.TsTypeParameterInstantiation,\n  ): N.TaggedTemplateExpression {\n    const node: N.TaggedTemplateExpression = this.startNodeAt(\n      startPos,\n      startLoc,\n    );\n    node.tag = base;\n    node.quasi = this.parseTemplate(true);\n    if (typeArguments) node.typeParameters = typeArguments;\n    if (state.optionalChainMember) {\n      this.raise(startPos, Errors.OptionalChainingNoTemplate);\n    }\n    return this.finishNode(node, \"TaggedTemplateExpression\");\n  }\n\n  atPossibleAsyncArrow(base: N.Expression): boolean {\n    return (\n      base.type === \"Identifier\" &&\n      base.name === \"async\" &&\n      this.state.lastTokEnd === base.end &&\n      !this.canInsertSemicolon() &&\n      // check there are no escape sequences, such as \\u{61}sync\n      base.end - base.start === 5 &&\n      base.start === this.state.potentialArrowAt\n    );\n  }\n\n  finishCallExpression<T: N.CallExpression | N.OptionalCallExpression>(\n    node: T,\n    optional: boolean,\n  ): N.Expression {\n    if (node.callee.type === \"Import\") {\n      if (node.arguments.length !== 1) {\n        this.raise(node.start, Errors.ImportCallArity);\n      } else {\n        const importArg = node.arguments[0];\n        if (importArg && importArg.type === \"SpreadElement\") {\n          this.raise(importArg.start, Errors.ImportCallSpreadArgument);\n        }\n      }\n    }\n    return this.finishNode(\n      node,\n      optional ? \"OptionalCallExpression\" : \"CallExpression\",\n    );\n  }\n\n  parseCallExpressionArguments(\n    close: TokenType,\n    possibleAsyncArrow: boolean,\n    dynamicImport?: boolean,\n    allowPlaceholder?: boolean,\n    nodeForExtra?: ?N.Node,\n  ): $ReadOnlyArray<?N.Expression> {\n    const elts = [];\n    let innerParenStart;\n    let first = true;\n    const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;\n    this.state.inFSharpPipelineDirectBody = false;\n\n    while (!this.eat(close)) {\n      if (first) {\n        first = false;\n      } else {\n        this.expect(tt.comma);\n        if (this.match(close)) {\n          if (dynamicImport) {\n            this.raise(\n              this.state.lastTokStart,\n              Errors.ImportCallArgumentTrailingComma,\n            );\n          }\n          if (nodeForExtra) {\n            this.addExtra(\n              nodeForExtra,\n              \"trailingComma\",\n              this.state.lastTokStart,\n            );\n          }\n          this.next();\n          break;\n        }\n      }\n\n      // we need to make sure that if this is an async arrow functions,\n      // that we don't allow inner parens inside the params\n      if (this.match(tt.parenL) && !innerParenStart) {\n        innerParenStart = this.state.start;\n      }\n\n      elts.push(\n        this.parseExprListItem(\n          false,\n          possibleAsyncArrow ? new ExpressionErrors() : undefined,\n          possibleAsyncArrow ? { start: 0 } : undefined,\n          allowPlaceholder,\n        ),\n      );\n    }\n\n    // we found an async arrow function so let's not allow any inner parens\n    if (possibleAsyncArrow && innerParenStart && this.shouldParseAsyncArrow()) {\n      this.unexpected();\n    }\n\n    this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;\n\n    return elts;\n  }\n\n  shouldParseAsyncArrow(): boolean {\n    return this.match(tt.arrow) && !this.canInsertSemicolon();\n  }\n\n  parseAsyncArrowFromCallExpression(\n    node: N.ArrowFunctionExpression,\n    call: N.CallExpression,\n  ): N.ArrowFunctionExpression {\n    this.expect(tt.arrow);\n    this.parseArrowExpression(\n      node,\n      call.arguments,\n      true,\n      call.extra?.trailingComma,\n    );\n    return node;\n  }\n\n  // Parse a no-call expression (like argument of `new` or `::` operators).\n\n  parseNoCallExpr(): N.Expression {\n    const startPos = this.state.start;\n    const startLoc = this.state.startLoc;\n    return this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true);\n  }\n\n  // Parse an atomic expression — either a single token that is an\n  // expression, an expression started by a keyword like `function` or\n  // `new`, or an expression wrapped in punctuation like `()`, `[]`,\n  // or `{}`.\n\n  parseExprAtom(refExpressionErrors?: ?ExpressionErrors): N.Expression {\n    // If a division operator appears in an expression position, the\n    // tokenizer got confused, and we force it to read a regexp instead.\n    if (this.state.type === tt.slash) this.readRegexp();\n\n    const canBeArrow = this.state.potentialArrowAt === this.state.start;\n    let node;\n\n    switch (this.state.type) {\n      case tt._super:\n        node = this.startNode();\n        this.next();\n        if (\n          this.match(tt.parenL) &&\n          !this.scope.allowDirectSuper &&\n          !this.options.allowSuperOutsideMethod\n        ) {\n          this.raise(node.start, Errors.SuperNotAllowed);\n        } else if (\n          !this.scope.allowSuper &&\n          !this.options.allowSuperOutsideMethod\n        ) {\n          this.raise(node.start, Errors.UnexpectedSuper);\n        }\n\n        if (\n          !this.match(tt.parenL) &&\n          !this.match(tt.bracketL) &&\n          !this.match(tt.dot)\n        ) {\n          this.raise(node.start, Errors.UnsupportedSuper);\n        }\n\n        return this.finishNode(node, \"Super\");\n\n      case tt._import:\n        node = this.startNode();\n        this.next();\n\n        if (this.match(tt.dot)) {\n          return this.parseImportMetaProperty(node);\n        }\n\n        if (!this.match(tt.parenL)) {\n          this.raise(this.state.lastTokStart, Errors.UnsupportedImport);\n        }\n        return this.finishNode(node, \"Import\");\n      case tt._this:\n        node = this.startNode();\n        this.next();\n        return this.finishNode(node, \"ThisExpression\");\n\n      case tt.name: {\n        node = this.startNode();\n        const containsEsc = this.state.containsEsc;\n        const id = this.parseIdentifier();\n\n        if (\n          !containsEsc &&\n          id.name === \"async\" &&\n          this.match(tt._function) &&\n          !this.canInsertSemicolon()\n        ) {\n          const last = this.state.context.length - 1;\n          if (this.state.context[last] !== ct.functionStatement) {\n            // Since \"async\" is an identifier and normally identifiers\n            // can't be followed by expression, the tokenizer assumes\n            // that \"function\" starts a statement.\n            // Fixing it in the tokenizer would mean tracking not only the\n            // previous token (\"async\"), but also the one before to know\n            // its beforeExpr value.\n            // It's easier and more efficient to adjust the context here.\n            throw new Error(\"Internal error\");\n          }\n          this.state.context[last] = ct.functionExpression;\n\n          this.next();\n          return this.parseFunction(node, undefined, true);\n        } else if (\n          canBeArrow &&\n          !containsEsc &&\n          id.name === \"async\" &&\n          this.match(tt.name) &&\n          !this.canInsertSemicolon()\n        ) {\n          const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;\n          const oldMaybeInAsyncArrowHead = this.state.maybeInAsyncArrowHead;\n          const oldYieldPos = this.state.yieldPos;\n          const oldAwaitPos = this.state.awaitPos;\n          this.state.maybeInArrowParameters = true;\n          this.state.maybeInAsyncArrowHead = true;\n          this.state.yieldPos = -1;\n          this.state.awaitPos = -1;\n          const params = [this.parseIdentifier()];\n          this.expect(tt.arrow);\n          this.checkYieldAwaitInDefaultParams();\n          this.state.maybeInArrowParameters = oldMaybeInArrowParameters;\n          this.state.maybeInAsyncArrowHead = oldMaybeInAsyncArrowHead;\n          this.state.yieldPos = oldYieldPos;\n          this.state.awaitPos = oldAwaitPos;\n          // let foo = async bar => {};\n          this.parseArrowExpression(node, params, true);\n          return node;\n        }\n\n        if (canBeArrow && this.match(tt.arrow) && !this.canInsertSemicolon()) {\n          this.next();\n          this.parseArrowExpression(node, [id], false);\n          return node;\n        }\n\n        return id;\n      }\n\n      case tt._do: {\n        this.expectPlugin(\"doExpressions\");\n        const node = this.startNode();\n        this.next();\n        const oldLabels = this.state.labels;\n        this.state.labels = [];\n        node.body = this.parseBlock();\n        this.state.labels = oldLabels;\n        return this.finishNode(node, \"DoExpression\");\n      }\n\n      case tt.regexp: {\n        const value = this.state.value;\n        node = this.parseLiteral(value.value, \"RegExpLiteral\");\n        node.pattern = value.pattern;\n        node.flags = value.flags;\n        return node;\n      }\n\n      case tt.num:\n        return this.parseLiteral(this.state.value, \"NumericLiteral\");\n\n      case tt.bigint:\n        return this.parseLiteral(this.state.value, \"BigIntLiteral\");\n\n      case tt.string:\n        return this.parseLiteral(this.state.value, \"StringLiteral\");\n\n      case tt._null:\n        node = this.startNode();\n        this.next();\n        return this.finishNode(node, \"NullLiteral\");\n\n      case tt._true:\n      case tt._false:\n        return this.parseBooleanLiteral();\n\n      case tt.parenL:\n        return this.parseParenAndDistinguishExpression(canBeArrow);\n\n      case tt.bracketBarL:\n      case tt.bracketHashL: {\n        this.expectPlugin(\"recordAndTuple\");\n        const oldInFSharpPipelineDirectBody = this.state\n          .inFSharpPipelineDirectBody;\n        const close =\n          this.state.type === tt.bracketBarL ? tt.bracketBarR : tt.bracketR;\n        this.state.inFSharpPipelineDirectBody = false;\n        node = this.startNode();\n        this.next();\n        node.elements = this.parseExprList(\n          close,\n          true,\n          refExpressionErrors,\n          node,\n        );\n        this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;\n        return this.finishNode(node, \"TupleExpression\");\n      }\n      case tt.bracketL: {\n        const oldInFSharpPipelineDirectBody = this.state\n          .inFSharpPipelineDirectBody;\n        this.state.inFSharpPipelineDirectBody = false;\n        node = this.startNode();\n        this.next();\n        node.elements = this.parseExprList(\n          tt.bracketR,\n          true,\n          refExpressionErrors,\n          node,\n        );\n        if (!this.state.maybeInArrowParameters) {\n          // This could be an array pattern:\n          //   ([a: string, b: string]) => {}\n          // In this case, we don't have to call toReferencedList. We will\n          // call it, if needed, when we are sure that it is a parenthesized\n          // expression by calling toReferencedListDeep.\n          this.toReferencedList(node.elements);\n        }\n        this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;\n        return this.finishNode(node, \"ArrayExpression\");\n      }\n      case tt.braceBarL:\n      case tt.braceHashL: {\n        this.expectPlugin(\"recordAndTuple\");\n        const oldInFSharpPipelineDirectBody = this.state\n          .inFSharpPipelineDirectBody;\n        const close =\n          this.state.type === tt.braceBarL ? tt.braceBarR : tt.braceR;\n        this.state.inFSharpPipelineDirectBody = false;\n        const ret = this.parseObj(close, false, true, refExpressionErrors);\n        this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;\n        return ret;\n      }\n      case tt.braceL: {\n        const oldInFSharpPipelineDirectBody = this.state\n          .inFSharpPipelineDirectBody;\n        this.state.inFSharpPipelineDirectBody = false;\n        const ret = this.parseObj(tt.braceR, false, false, refExpressionErrors);\n        this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;\n        return ret;\n      }\n      case tt._function:\n        return this.parseFunctionExpression();\n\n      case tt.at:\n        this.parseDecorators();\n      // fall through\n      case tt._class:\n        node = this.startNode();\n        this.takeDecorators(node);\n        return this.parseClass(node, false);\n\n      case tt._new:\n        return this.parseNew();\n\n      case tt.backQuote:\n        return this.parseTemplate(false);\n\n      case tt.doubleColon: {\n        node = this.startNode();\n        this.next();\n        node.object = null;\n        const callee = (node.callee = this.parseNoCallExpr());\n        if (callee.type === \"MemberExpression\") {\n          return this.finishNode(node, \"BindExpression\");\n        } else {\n          throw this.raise(callee.start, Errors.UnsupportedBind);\n        }\n      }\n\n      case tt.hash: {\n        if (this.state.inPipeline) {\n          node = this.startNode();\n\n          if (\n            this.getPluginOption(\"pipelineOperator\", \"proposal\") !== \"smart\"\n          ) {\n            this.raise(node.start, Errors.PrimaryTopicRequiresSmartPipeline);\n          }\n\n          this.next();\n\n          if (!this.primaryTopicReferenceIsAllowedInCurrentTopicContext()) {\n            this.raise(node.start, Errors.PrimaryTopicNotAllowed);\n          }\n\n          this.registerTopicReference();\n          return this.finishNode(node, \"PipelinePrimaryTopicReference\");\n        }\n      }\n      // fall through\n      default:\n        throw this.unexpected();\n    }\n  }\n\n  parseBooleanLiteral(): N.BooleanLiteral {\n    const node = this.startNode();\n    node.value = this.match(tt._true);\n    this.next();\n    return this.finishNode(node, \"BooleanLiteral\");\n  }\n\n  parseMaybePrivateName(\n    isPrivateNameAllowed: boolean,\n  ): N.PrivateName | N.Identifier {\n    const isPrivate = this.match(tt.hash);\n\n    if (isPrivate) {\n      this.expectOnePlugin([\"classPrivateProperties\", \"classPrivateMethods\"]);\n      if (!isPrivateNameAllowed) {\n        this.raise(this.state.pos, Errors.UnexpectedPrivateField);\n      }\n      const node = this.startNode();\n      this.next();\n      this.assertNoSpace(\"Unexpected space between # and identifier\");\n      node.id = this.parseIdentifier(true);\n      return this.finishNode(node, \"PrivateName\");\n    } else {\n      return this.parseIdentifier(true);\n    }\n  }\n\n  parseFunctionExpression(): N.FunctionExpression | N.MetaProperty {\n    const node = this.startNode();\n\n    // We do not do parseIdentifier here because when parseFunctionExpression\n    // is called we already know that the current token is a \"name\" with the value \"function\"\n    // This will improve perf a tiny little bit as we do not do validation but more importantly\n    // here is that parseIdentifier will remove an item from the expression stack\n    // if \"function\" or \"class\" is parsed as identifier (in objects e.g.), which should not happen here.\n    let meta = this.startNode();\n    this.next();\n    meta = this.createIdentifier(meta, \"function\");\n\n    if (this.prodParam.hasYield && this.eat(tt.dot)) {\n      return this.parseMetaProperty(node, meta, \"sent\");\n    }\n    return this.parseFunction(node);\n  }\n\n  parseMetaProperty(\n    node: N.MetaProperty,\n    meta: N.Identifier,\n    propertyName: string,\n  ): N.MetaProperty {\n    node.meta = meta;\n\n    if (meta.name === \"function\" && propertyName === \"sent\") {\n      if (this.isContextual(propertyName)) {\n        this.expectPlugin(\"functionSent\");\n      } else if (!this.hasPlugin(\"functionSent\")) {\n        // The code wasn't `function.sent` but just `function.`, so a simple error is less confusing.\n        this.unexpected();\n      }\n    }\n\n    const containsEsc = this.state.containsEsc;\n\n    node.property = this.parseIdentifier(true);\n\n    if (node.property.name !== propertyName || containsEsc) {\n      this.raise(\n        node.property.start,\n        Errors.UnsupportedMetaProperty,\n        meta.name,\n        propertyName,\n      );\n    }\n\n    return this.finishNode(node, \"MetaProperty\");\n  }\n\n  parseImportMetaProperty(node: N.MetaProperty): N.MetaProperty {\n    const id = this.createIdentifier(this.startNodeAtNode(node), \"import\");\n    this.expect(tt.dot);\n\n    if (this.isContextual(\"meta\")) {\n      this.expectPlugin(\"importMeta\");\n\n      if (!this.inModule) {\n        this.raiseWithData(\n          id.start,\n          { code: \"BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED\" },\n          Errors.ImportMetaOutsideModule,\n        );\n      }\n      this.sawUnambiguousESM = true;\n    } else if (!this.hasPlugin(\"importMeta\")) {\n      this.raise(id.start, Errors.ImportCallArityLtOne);\n    }\n\n    return this.parseMetaProperty(node, id, \"meta\");\n  }\n\n  parseLiteral<T: N.Literal>(\n    value: any,\n    type: /*T[\"kind\"]*/ string,\n    startPos?: number,\n    startLoc?: Position,\n  ): T {\n    startPos = startPos || this.state.start;\n    startLoc = startLoc || this.state.startLoc;\n\n    const node = this.startNodeAt(startPos, startLoc);\n    this.addExtra(node, \"rawValue\", value);\n    this.addExtra(node, \"raw\", this.input.slice(startPos, this.state.end));\n    node.value = value;\n    this.next();\n    return this.finishNode(node, type);\n  }\n\n  parseParenAndDistinguishExpression(canBeArrow: boolean): N.Expression {\n    const startPos = this.state.start;\n    const startLoc = this.state.startLoc;\n\n    let val;\n    this.expect(tt.parenL);\n\n    const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;\n    const oldYieldPos = this.state.yieldPos;\n    const oldAwaitPos = this.state.awaitPos;\n    const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;\n    this.state.maybeInArrowParameters = true;\n    this.state.yieldPos = -1;\n    this.state.awaitPos = -1;\n    this.state.inFSharpPipelineDirectBody = false;\n\n    const innerStartPos = this.state.start;\n    const innerStartLoc = this.state.startLoc;\n    const exprList = [];\n    const refExpressionErrors = new ExpressionErrors();\n    const refNeedsArrowPos = { start: 0 };\n    let first = true;\n    let spreadStart;\n    let optionalCommaStart;\n\n    while (!this.match(tt.parenR)) {\n      if (first) {\n        first = false;\n      } else {\n        this.expect(tt.comma, refNeedsArrowPos.start || null);\n        if (this.match(tt.parenR)) {\n          optionalCommaStart = this.state.start;\n          break;\n        }\n      }\n\n      if (this.match(tt.ellipsis)) {\n        const spreadNodeStartPos = this.state.start;\n        const spreadNodeStartLoc = this.state.startLoc;\n        spreadStart = this.state.start;\n        exprList.push(\n          this.parseParenItem(\n            this.parseRestBinding(),\n            spreadNodeStartPos,\n            spreadNodeStartLoc,\n          ),\n        );\n\n        this.checkCommaAfterRest(charCodes.rightParenthesis);\n\n        break;\n      } else {\n        exprList.push(\n          this.parseMaybeAssign(\n            false,\n            refExpressionErrors,\n            this.parseParenItem,\n            refNeedsArrowPos,\n          ),\n        );\n      }\n    }\n\n    const innerEndPos = this.state.start;\n    const innerEndLoc = this.state.startLoc;\n    this.expect(tt.parenR);\n\n    this.state.maybeInArrowParameters = oldMaybeInArrowParameters;\n    this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;\n\n    let arrowNode = this.startNodeAt(startPos, startLoc);\n    if (\n      canBeArrow &&\n      this.shouldParseArrow() &&\n      (arrowNode = this.parseArrow(arrowNode))\n    ) {\n      if (!this.isAwaitAllowed() && !this.state.maybeInAsyncArrowHead) {\n        this.state.awaitPos = oldAwaitPos;\n      }\n      this.checkYieldAwaitInDefaultParams();\n      this.state.yieldPos = oldYieldPos;\n      this.state.awaitPos = oldAwaitPos;\n      for (const param of exprList) {\n        if (param.extra && param.extra.parenthesized) {\n          this.unexpected(param.extra.parenStart);\n        }\n      }\n\n      this.parseArrowExpression(arrowNode, exprList, false);\n      return arrowNode;\n    }\n\n    // We keep the old value if it isn't null, for cases like\n    //   (x = (yield)) => {}\n    if (oldYieldPos !== -1) this.state.yieldPos = oldYieldPos;\n    if (oldAwaitPos !== -1) this.state.awaitPos = oldAwaitPos;\n\n    if (!exprList.length) {\n      this.unexpected(this.state.lastTokStart);\n    }\n    if (optionalCommaStart) this.unexpected(optionalCommaStart);\n    if (spreadStart) this.unexpected(spreadStart);\n    this.checkExpressionErrors(refExpressionErrors, true);\n    if (refNeedsArrowPos.start) this.unexpected(refNeedsArrowPos.start);\n\n    this.toReferencedListDeep(exprList, /* isParenthesizedExpr */ true);\n    if (exprList.length > 1) {\n      val = this.startNodeAt(innerStartPos, innerStartLoc);\n      val.expressions = exprList;\n      this.finishNodeAt(val, \"SequenceExpression\", innerEndPos, innerEndLoc);\n    } else {\n      val = exprList[0];\n    }\n\n    if (!this.options.createParenthesizedExpressions) {\n      this.addExtra(val, \"parenthesized\", true);\n      this.addExtra(val, \"parenStart\", startPos);\n      return val;\n    }\n\n    const parenExpression = this.startNodeAt(startPos, startLoc);\n    parenExpression.expression = val;\n    this.finishNode(parenExpression, \"ParenthesizedExpression\");\n    return parenExpression;\n  }\n\n  shouldParseArrow(): boolean {\n    return !this.canInsertSemicolon();\n  }\n\n  parseArrow(node: N.ArrowFunctionExpression): ?N.ArrowFunctionExpression {\n    if (this.eat(tt.arrow)) {\n      return node;\n    }\n  }\n\n  parseParenItem(\n    node: N.Expression,\n    startPos: number, // eslint-disable-line no-unused-vars\n    startLoc: Position, // eslint-disable-line no-unused-vars\n  ): N.Expression {\n    return node;\n  }\n\n  // New's precedence is slightly tricky. It must allow its argument to\n  // be a `[]` or dot subscript expression, but not a call — at least,\n  // not without wrapping it in parentheses. Thus, it uses the noCalls\n  // argument to parseSubscripts to prevent it from consuming the\n  // argument list.\n\n  parseNew(): N.NewExpression | N.MetaProperty {\n    const node = this.startNode();\n\n    let meta = this.startNode();\n    this.next();\n    meta = this.createIdentifier(meta, \"new\");\n\n    if (this.eat(tt.dot)) {\n      const metaProp = this.parseMetaProperty(node, meta, \"target\");\n\n      if (!this.scope.inNonArrowFunction && !this.scope.inClass) {\n        let error = Errors.UnexpectedNewTarget;\n\n        if (this.hasPlugin(\"classProperties\")) {\n          error += \" or class properties\";\n        }\n\n        this.raise(metaProp.start, error);\n      }\n\n      return metaProp;\n    }\n\n    node.callee = this.parseNoCallExpr();\n\n    if (node.callee.type === \"Import\") {\n      this.raise(node.callee.start, Errors.ImportCallNotNewExpression);\n    } else if (\n      node.callee.type === \"OptionalMemberExpression\" ||\n      node.callee.type === \"OptionalCallExpression\"\n    ) {\n      this.raise(this.state.lastTokEnd, Errors.OptionalChainingNoNew);\n    } else if (this.eat(tt.questionDot)) {\n      this.raise(this.state.start, Errors.OptionalChainingNoNew);\n    }\n\n    this.parseNewArguments(node);\n    return this.finishNode(node, \"NewExpression\");\n  }\n\n  parseNewArguments(node: N.NewExpression): void {\n    if (this.eat(tt.parenL)) {\n      const args = this.parseExprList(tt.parenR);\n      this.toReferencedList(args);\n      // $FlowFixMe (parseExprList should be all non-null in this case)\n      node.arguments = args;\n    } else {\n      node.arguments = [];\n    }\n  }\n\n  // Parse template expression.\n\n  parseTemplateElement(isTagged: boolean): N.TemplateElement {\n    const elem = this.startNode();\n    if (this.state.value === null) {\n      if (!isTagged) {\n        this.raise(this.state.start + 1, Errors.InvalidEscapeSequenceTemplate);\n      }\n    }\n    elem.value = {\n      raw: this.input\n        .slice(this.state.start, this.state.end)\n        .replace(/\\r\\n?/g, \"\\n\"),\n      cooked: this.state.value,\n    };\n    this.next();\n    elem.tail = this.match(tt.backQuote);\n    return this.finishNode(elem, \"TemplateElement\");\n  }\n\n  parseTemplate(isTagged: boolean): N.TemplateLiteral {\n    const node = this.startNode();\n    this.next();\n    node.expressions = [];\n    let curElt = this.parseTemplateElement(isTagged);\n    node.quasis = [curElt];\n    while (!curElt.tail) {\n      this.expect(tt.dollarBraceL);\n      node.expressions.push(this.parseExpression());\n      this.expect(tt.braceR);\n      node.quasis.push((curElt = this.parseTemplateElement(isTagged)));\n    }\n    this.next();\n    return this.finishNode(node, \"TemplateLiteral\");\n  }\n\n  // Parse an object literal, binding pattern, or record.\n\n  parseObj<T: N.ObjectPattern | N.ObjectExpression>(\n    close: TokenType,\n    isPattern: boolean,\n    isRecord?: ?boolean,\n    refExpressionErrors?: ?ExpressionErrors,\n  ): T {\n    const propHash: any = Object.create(null);\n    let first = true;\n    const node = this.startNode();\n\n    node.properties = [];\n    this.next();\n\n    while (!this.eat(close)) {\n      if (first) {\n        first = false;\n      } else {\n        this.expect(tt.comma);\n        if (this.match(close)) {\n          this.addExtra(node, \"trailingComma\", this.state.lastTokStart);\n          this.next();\n          break;\n        }\n      }\n\n      const prop = this.parseObjectMember(isPattern, refExpressionErrors);\n      if (!isPattern) {\n        // $FlowIgnore RestElement will never be returned if !isPattern\n        this.checkDuplicatedProto(prop, propHash, refExpressionErrors);\n      }\n\n      // $FlowIgnore\n      if (prop.shorthand) {\n        this.addExtra(prop, \"shorthand\", true);\n      }\n\n      node.properties.push(prop);\n    }\n\n    let type = \"ObjectExpression\";\n    if (isPattern) {\n      type = \"ObjectPattern\";\n    } else if (isRecord) {\n      type = \"RecordExpression\";\n    }\n    return this.finishNode(node, type);\n  }\n\n  isAsyncProp(prop: N.ObjectProperty): boolean {\n    return (\n      !prop.computed &&\n      prop.key.type === \"Identifier\" &&\n      prop.key.name === \"async\" &&\n      (this.match(tt.name) ||\n        this.match(tt.num) ||\n        this.match(tt.string) ||\n        this.match(tt.bracketL) ||\n        this.state.type.keyword ||\n        this.match(tt.star)) &&\n      !this.hasPrecedingLineBreak()\n    );\n  }\n\n  parseObjectMember(\n    isPattern: boolean,\n    refExpressionErrors?: ?ExpressionErrors,\n  ): N.ObjectMember | N.SpreadElement | N.RestElement {\n    let decorators = [];\n    if (this.match(tt.at)) {\n      if (this.hasPlugin(\"decorators\")) {\n        this.raise(this.state.start, Errors.UnsupportedPropertyDecorator);\n      }\n\n      // we needn't check if decorators (stage 0) plugin is enabled since it's checked by\n      // the call to this.parseDecorator\n      while (this.match(tt.at)) {\n        decorators.push(this.parseDecorator());\n      }\n    }\n\n    const prop = this.startNode();\n    let isGenerator = false;\n    let isAsync = false;\n    let startPos;\n    let startLoc;\n\n    if (this.match(tt.ellipsis)) {\n      if (decorators.length) this.unexpected();\n      if (isPattern) {\n        this.next();\n        // Don't use parseRestBinding() as we only allow Identifier here.\n        prop.argument = this.parseIdentifier();\n        this.checkCommaAfterRest(charCodes.rightCurlyBrace);\n        return this.finishNode(prop, \"RestElement\");\n      }\n\n      return this.parseSpread();\n    }\n\n    if (decorators.length) {\n      prop.decorators = decorators;\n      decorators = [];\n    }\n\n    prop.method = false;\n\n    if (isPattern || refExpressionErrors) {\n      startPos = this.state.start;\n      startLoc = this.state.startLoc;\n    }\n\n    if (!isPattern) {\n      isGenerator = this.eat(tt.star);\n    }\n\n    const containsEsc = this.state.containsEsc;\n    this.parsePropertyName(prop, /* isPrivateNameAllowed */ false);\n\n    if (!isPattern && !containsEsc && !isGenerator && this.isAsyncProp(prop)) {\n      isAsync = true;\n      isGenerator = this.eat(tt.star);\n      this.parsePropertyName(prop, /* isPrivateNameAllowed */ false);\n    } else {\n      isAsync = false;\n    }\n\n    this.parseObjPropValue(\n      prop,\n      startPos,\n      startLoc,\n      isGenerator,\n      isAsync,\n      isPattern,\n      refExpressionErrors,\n      containsEsc,\n    );\n\n    return prop;\n  }\n\n  isGetterOrSetterMethod(prop: N.ObjectMethod, isPattern: boolean): boolean {\n    return (\n      !isPattern &&\n      !prop.computed &&\n      prop.key.type === \"Identifier\" &&\n      (prop.key.name === \"get\" || prop.key.name === \"set\") &&\n      (this.match(tt.string) || // get \"string\"() {}\n      this.match(tt.num) || // get 1() {}\n      this.match(tt.bracketL) || // get [\"string\"]() {}\n      this.match(tt.name) || // get foo() {}\n        !!this.state.type.keyword) // get debugger() {}\n    );\n  }\n\n  getGetterSetterExpectedParamCount(\n    method: N.ObjectMethod | N.ClassMethod,\n  ): number {\n    return method.kind === \"get\" ? 0 : 1;\n  }\n\n  // get methods aren't allowed to have any parameters\n  // set methods must have exactly 1 parameter which is not a rest parameter\n  checkGetterSetterParams(method: N.ObjectMethod | N.ClassMethod): void {\n    const paramCount = this.getGetterSetterExpectedParamCount(method);\n    const start = method.start;\n    if (method.params.length !== paramCount) {\n      if (method.kind === \"get\") {\n        this.raise(start, Errors.BadGetterArity);\n      } else {\n        this.raise(start, Errors.BadSetterArity);\n      }\n    }\n\n    if (\n      method.kind === \"set\" &&\n      method.params[method.params.length - 1].type === \"RestElement\"\n    ) {\n      this.raise(start, Errors.BadSetterRestParameter);\n    }\n  }\n\n  parseObjectMethod(\n    prop: N.ObjectMethod,\n    isGenerator: boolean,\n    isAsync: boolean,\n    isPattern: boolean,\n    containsEsc: boolean,\n  ): ?N.ObjectMethod {\n    if (isAsync || isGenerator || this.match(tt.parenL)) {\n      if (isPattern) this.unexpected();\n      prop.kind = \"method\";\n      prop.method = true;\n      return this.parseMethod(\n        prop,\n        isGenerator,\n        isAsync,\n        /* isConstructor */ false,\n        false,\n        \"ObjectMethod\",\n      );\n    }\n\n    if (!containsEsc && this.isGetterOrSetterMethod(prop, isPattern)) {\n      if (isGenerator || isAsync) this.unexpected();\n      prop.kind = prop.key.name;\n      this.parsePropertyName(prop, /* isPrivateNameAllowed */ false);\n      this.parseMethod(\n        prop,\n        /* isGenerator */ false,\n        /* isAsync */ false,\n        /* isConstructor */ false,\n        false,\n        \"ObjectMethod\",\n      );\n      this.checkGetterSetterParams(prop);\n      return prop;\n    }\n  }\n\n  parseObjectProperty(\n    prop: N.ObjectProperty,\n    startPos: ?number,\n    startLoc: ?Position,\n    isPattern: boolean,\n    refExpressionErrors: ?ExpressionErrors,\n  ): ?N.ObjectProperty {\n    prop.shorthand = false;\n\n    if (this.eat(tt.colon)) {\n      prop.value = isPattern\n        ? this.parseMaybeDefault(this.state.start, this.state.startLoc)\n        : this.parseMaybeAssign(false, refExpressionErrors);\n\n      return this.finishNode(prop, \"ObjectProperty\");\n    }\n\n    if (!prop.computed && prop.key.type === \"Identifier\") {\n      this.checkReservedWord(prop.key.name, prop.key.start, true, true);\n\n      if (isPattern) {\n        prop.value = this.parseMaybeDefault(\n          startPos,\n          startLoc,\n          prop.key.__clone(),\n        );\n      } else if (this.match(tt.eq) && refExpressionErrors) {\n        if (refExpressionErrors.shorthandAssign === -1) {\n          refExpressionErrors.shorthandAssign = this.state.start;\n        }\n        prop.value = this.parseMaybeDefault(\n          startPos,\n          startLoc,\n          prop.key.__clone(),\n        );\n      } else {\n        prop.value = prop.key.__clone();\n      }\n      prop.shorthand = true;\n\n      return this.finishNode(prop, \"ObjectProperty\");\n    }\n  }\n\n  parseObjPropValue(\n    prop: any,\n    startPos: ?number,\n    startLoc: ?Position,\n    isGenerator: boolean,\n    isAsync: boolean,\n    isPattern: boolean,\n    refExpressionErrors?: ?ExpressionErrors,\n    containsEsc: boolean,\n  ): void {\n    const node =\n      this.parseObjectMethod(\n        prop,\n        isGenerator,\n        isAsync,\n        isPattern,\n        containsEsc,\n      ) ||\n      this.parseObjectProperty(\n        prop,\n        startPos,\n        startLoc,\n        isPattern,\n        refExpressionErrors,\n      );\n\n    if (!node) this.unexpected();\n\n    // $FlowFixMe\n    return node;\n  }\n\n  parsePropertyName(\n    prop: N.ObjectOrClassMember | N.ClassMember | N.TsNamedTypeElementBase,\n    isPrivateNameAllowed: boolean,\n  ): N.Expression | N.Identifier {\n    if (this.eat(tt.bracketL)) {\n      (prop: $FlowSubtype<N.ObjectOrClassMember>).computed = true;\n      prop.key = this.parseMaybeAssign();\n      this.expect(tt.bracketR);\n    } else {\n      const oldInPropertyName = this.state.inPropertyName;\n      this.state.inPropertyName = true;\n      // We check if it's valid for it to be a private name when we push it.\n      (prop: $FlowFixMe).key =\n        this.match(tt.num) || this.match(tt.string) || this.match(tt.bigint)\n          ? this.parseExprAtom()\n          : this.parseMaybePrivateName(isPrivateNameAllowed);\n\n      if (prop.key.type !== \"PrivateName\") {\n        // ClassPrivateProperty is never computed, so we don't assign in that case.\n        prop.computed = false;\n      }\n\n      this.state.inPropertyName = oldInPropertyName;\n    }\n\n    return prop.key;\n  }\n\n  // Initialize empty function node.\n\n  initFunction(node: N.BodilessFunctionOrMethodBase, isAsync: ?boolean): void {\n    node.id = null;\n    node.generator = false;\n    node.async = !!isAsync;\n  }\n\n  // Parse object or class method.\n\n  parseMethod<T: N.MethodLike>(\n    node: T,\n    isGenerator: boolean,\n    isAsync: boolean,\n    isConstructor: boolean,\n    allowDirectSuper: boolean,\n    type: string,\n    inClassScope: boolean = false,\n  ): T {\n    const oldYieldPos = this.state.yieldPos;\n    const oldAwaitPos = this.state.awaitPos;\n    this.state.yieldPos = -1;\n    this.state.awaitPos = -1;\n\n    this.initFunction(node, isAsync);\n    node.generator = !!isGenerator;\n    const allowModifiers = isConstructor; // For TypeScript parameter properties\n    this.scope.enter(\n      SCOPE_FUNCTION |\n        SCOPE_SUPER |\n        (inClassScope ? SCOPE_CLASS : 0) |\n        (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0),\n    );\n    this.prodParam.enter(functionFlags(isAsync, node.generator));\n    this.parseFunctionParams((node: any), allowModifiers);\n    this.parseFunctionBodyAndFinish(node, type, true);\n    this.prodParam.exit();\n    this.scope.exit();\n\n    this.state.yieldPos = oldYieldPos;\n    this.state.awaitPos = oldAwaitPos;\n\n    return node;\n  }\n\n  // Parse arrow function expression.\n  // If the parameters are provided, they will be converted to an\n  // assignable list.\n  parseArrowExpression(\n    node: N.ArrowFunctionExpression,\n    params: ?(N.Expression[]),\n    isAsync: boolean,\n    trailingCommaPos: ?number,\n  ): N.ArrowFunctionExpression {\n    this.scope.enter(SCOPE_FUNCTION | SCOPE_ARROW);\n    this.prodParam.enter(functionFlags(isAsync, false));\n    this.initFunction(node, isAsync);\n    const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;\n    const oldYieldPos = this.state.yieldPos;\n    const oldAwaitPos = this.state.awaitPos;\n\n    if (params) {\n      this.state.maybeInArrowParameters = true;\n      this.setArrowFunctionParameters(node, params, trailingCommaPos);\n    }\n    this.state.maybeInArrowParameters = false;\n    this.state.yieldPos = -1;\n    this.state.awaitPos = -1;\n    this.parseFunctionBody(node, true);\n\n    this.prodParam.exit();\n    this.scope.exit();\n    this.state.maybeInArrowParameters = oldMaybeInArrowParameters;\n    this.state.yieldPos = oldYieldPos;\n    this.state.awaitPos = oldAwaitPos;\n\n    return this.finishNode(node, \"ArrowFunctionExpression\");\n  }\n\n  setArrowFunctionParameters(\n    node: N.ArrowFunctionExpression,\n    params: N.Expression[],\n    trailingCommaPos: ?number,\n  ): void {\n    node.params = this.toAssignableList(params, trailingCommaPos);\n  }\n\n  parseFunctionBodyAndFinish(\n    node: N.BodilessFunctionOrMethodBase,\n    type: string,\n    isMethod?: boolean = false,\n  ): void {\n    // $FlowIgnore (node is not bodiless if we get here)\n    this.parseFunctionBody(node, false, isMethod);\n    this.finishNode(node, type);\n  }\n\n  // Parse function body and check parameters.\n  parseFunctionBody(\n    node: N.Function,\n    allowExpression: ?boolean,\n    isMethod?: boolean = false,\n  ): void {\n    const isExpression = allowExpression && !this.match(tt.braceL);\n    const oldInParameters = this.state.inParameters;\n    this.state.inParameters = false;\n\n    if (isExpression) {\n      node.body = this.parseMaybeAssign();\n      this.checkParams(node, false, allowExpression, false);\n    } else {\n      const oldStrict = this.state.strict;\n      // Start a new scope with regard to labels\n      // flag (restore them to their old value afterwards).\n      const oldLabels = this.state.labels;\n      this.state.labels = [];\n\n      // FunctionBody[Yield, Await]:\n      //   StatementList[?Yield, ?Await, +Return] opt\n      this.prodParam.enter(this.prodParam.currentFlags() | PARAM_RETURN);\n      node.body = this.parseBlock(\n        true,\n        false,\n        // Strict mode function checks after we parse the statements in the function body.\n        (hasStrictModeDirective: boolean) => {\n          const nonSimple = !this.isSimpleParamList(node.params);\n\n          if (hasStrictModeDirective && nonSimple) {\n            // This logic is here to align the error location with the ESTree plugin.\n            const errorPos =\n              // $FlowIgnore\n              (node.kind === \"method\" || node.kind === \"constructor\") &&\n              // $FlowIgnore\n              !!node.key\n                ? node.key.end\n                : node.start;\n            this.raise(errorPos, Errors.IllegalLanguageModeDirective);\n          }\n\n          const strictModeChanged = !oldStrict && this.state.strict;\n\n          // Add the params to varDeclaredNames to ensure that an error is thrown\n          // if a let/const declaration in the function clashes with one of the params.\n          this.checkParams(\n            node,\n            !this.state.strict && !allowExpression && !isMethod && !nonSimple,\n            allowExpression,\n            strictModeChanged,\n          );\n\n          // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval'\n          if (this.state.strict && node.id) {\n            this.checkLVal(\n              node.id,\n              BIND_OUTSIDE,\n              undefined,\n              \"function name\",\n              undefined,\n              strictModeChanged,\n            );\n          }\n        },\n      );\n      this.prodParam.exit();\n      this.state.labels = oldLabels;\n    }\n\n    this.state.inParameters = oldInParameters;\n  }\n\n  isSimpleParamList(\n    params: $ReadOnlyArray<N.Pattern | N.TSParameterProperty>,\n  ): boolean {\n    for (let i = 0, len = params.length; i < len; i++) {\n      if (params[i].type !== \"Identifier\") return false;\n    }\n    return true;\n  }\n\n  checkParams(\n    node: N.Function,\n    allowDuplicates: boolean,\n    // eslint-disable-next-line no-unused-vars\n    isArrowFunction: ?boolean,\n    strictModeChanged?: boolean = true,\n  ): void {\n    // $FlowIssue\n    const nameHash: {} = Object.create(null);\n    for (let i = 0; i < node.params.length; i++) {\n      this.checkLVal(\n        node.params[i],\n        BIND_VAR,\n        allowDuplicates ? null : nameHash,\n        \"function parameter list\",\n        undefined,\n        strictModeChanged,\n      );\n    }\n  }\n\n  // Parses a comma-separated list of expressions, and returns them as\n  // an array. `close` is the token type that ends the list, and\n  // `allowEmpty` can be turned on to allow subsequent commas with\n  // nothing in between them to be parsed as `null` (which is needed\n  // for array literals).\n\n  parseExprList(\n    close: TokenType,\n    allowEmpty?: boolean,\n    refExpressionErrors?: ?ExpressionErrors,\n    nodeForExtra?: ?N.Node,\n  ): $ReadOnlyArray<?N.Expression> {\n    const elts = [];\n    let first = true;\n\n    while (!this.eat(close)) {\n      if (first) {\n        first = false;\n      } else {\n        this.expect(tt.comma);\n        if (this.match(close)) {\n          if (nodeForExtra) {\n            this.addExtra(\n              nodeForExtra,\n              \"trailingComma\",\n              this.state.lastTokStart,\n            );\n          }\n          this.next();\n          break;\n        }\n      }\n\n      elts.push(this.parseExprListItem(allowEmpty, refExpressionErrors));\n    }\n    return elts;\n  }\n\n  parseExprListItem(\n    allowEmpty: ?boolean,\n    refExpressionErrors?: ?ExpressionErrors,\n    refNeedsArrowPos: ?Pos,\n    allowPlaceholder: ?boolean,\n  ): ?N.Expression {\n    let elt;\n    if (allowEmpty && this.match(tt.comma)) {\n      elt = null;\n    } else if (this.match(tt.ellipsis)) {\n      const spreadNodeStartPos = this.state.start;\n      const spreadNodeStartLoc = this.state.startLoc;\n      elt = this.parseParenItem(\n        this.parseSpread(refExpressionErrors, refNeedsArrowPos),\n        spreadNodeStartPos,\n        spreadNodeStartLoc,\n      );\n    } else if (this.match(tt.question)) {\n      this.expectPlugin(\"partialApplication\");\n      if (!allowPlaceholder) {\n        this.raise(this.state.start, Errors.UnexpectedArgumentPlaceholder);\n      }\n      const node = this.startNode();\n      this.next();\n      elt = this.finishNode(node, \"ArgumentPlaceholder\");\n    } else {\n      elt = this.parseMaybeAssign(\n        false,\n        refExpressionErrors,\n        this.parseParenItem,\n        refNeedsArrowPos,\n      );\n    }\n    return elt;\n  }\n\n  // Parse the next token as an identifier. If `liberal` is true (used\n  // when parsing properties), it will also convert keywords into\n  // identifiers.\n  // This shouldn't be used to parse the keywords of meta properties, since they\n  // are not identifiers and cannot contain escape sequences.\n\n  parseIdentifier(liberal?: boolean): N.Identifier {\n    const node = this.startNode();\n    const name = this.parseIdentifierName(node.start, liberal);\n\n    return this.createIdentifier(node, name);\n  }\n\n  createIdentifier(node: N.Identifier, name: string): N.Identifier {\n    node.name = name;\n    node.loc.identifierName = name;\n\n    return this.finishNode(node, \"Identifier\");\n  }\n\n  parseIdentifierName(pos: number, liberal?: boolean): string {\n    let name: string;\n\n    if (this.match(tt.name)) {\n      name = this.state.value;\n    } else if (this.state.type.keyword) {\n      name = this.state.type.keyword;\n\n      // `class` and `function` keywords push new context into this.context.\n      // But there is no chance to pop the context if the keyword is consumed\n      // as an identifier such as a property name.\n      // If the previous token is a dot, this does not apply because the\n      // context-managing code already ignored the keyword\n      if (\n        (name === \"class\" || name === \"function\") &&\n        (this.state.lastTokEnd !== this.state.lastTokStart + 1 ||\n          this.input.charCodeAt(this.state.lastTokStart) !== charCodes.dot)\n      ) {\n        this.state.context.pop();\n      }\n    } else {\n      throw this.unexpected();\n    }\n\n    if (liberal) {\n      // If the current token is not used as a keyword, set its type to \"tt.name\".\n      // This will prevent this.next() from throwing about unexpected escapes.\n      this.state.type = tt.name;\n    } else {\n      this.checkReservedWord(\n        name,\n        this.state.start,\n        !!this.state.type.keyword,\n        false,\n      );\n    }\n\n    this.next();\n\n    return name;\n  }\n\n  checkReservedWord(\n    word: string,\n    startLoc: number,\n    checkKeywords: boolean,\n    isBinding: boolean,\n  ): void {\n    if (this.prodParam.hasYield && word === \"yield\") {\n      this.raise(startLoc, Errors.YieldBindingIdentifier);\n      return;\n    }\n\n    if (word === \"await\") {\n      if (this.prodParam.hasAwait) {\n        this.raise(startLoc, Errors.AwaitBindingIdentifier);\n        return;\n      }\n      if (\n        this.state.awaitPos === -1 &&\n        (this.state.maybeInAsyncArrowHead || this.isAwaitAllowed())\n      ) {\n        this.state.awaitPos = this.state.start;\n      }\n    }\n\n    if (\n      this.scope.inClass &&\n      !this.scope.inNonArrowFunction &&\n      word === \"arguments\"\n    ) {\n      this.raise(startLoc, Errors.ArgumentsDisallowedInInitializer);\n      return;\n    }\n    if (checkKeywords && isKeyword(word)) {\n      this.raise(startLoc, Errors.UnexpectedKeyword, word);\n      return;\n    }\n\n    const reservedTest = !this.state.strict\n      ? isReservedWord\n      : isBinding\n      ? isStrictBindReservedWord\n      : isStrictReservedWord;\n\n    if (reservedTest(word, this.inModule)) {\n      if (!this.prodParam.hasAwait && word === \"await\") {\n        this.raise(startLoc, Errors.AwaitNotInAsyncFunction);\n      } else {\n        this.raise(startLoc, Errors.UnexpectedReservedWord, word);\n      }\n    }\n  }\n\n  isAwaitAllowed(): boolean {\n    if (this.scope.inFunction) return this.prodParam.hasAwait;\n    if (this.options.allowAwaitOutsideFunction) return true;\n    if (this.hasPlugin(\"topLevelAwait\")) {\n      return this.inModule && this.prodParam.hasAwait;\n    }\n    return false;\n  }\n\n  // Parses await expression inside async function.\n\n  parseAwait(): N.AwaitExpression {\n    const node = this.startNode();\n\n    this.next();\n\n    if (this.state.inParameters) {\n      this.raise(node.start, Errors.AwaitExpressionFormalParameter);\n    } else if (this.state.awaitPos === -1) {\n      this.state.awaitPos = node.start;\n    }\n    if (this.eat(tt.star)) {\n      this.raise(node.start, Errors.ObsoleteAwaitStar);\n    }\n\n    if (!this.scope.inFunction && !this.options.allowAwaitOutsideFunction) {\n      if (\n        this.hasPrecedingLineBreak() ||\n        // All the following expressions are ambiguous:\n        //   await + 0, await - 0, await ( 0 ), await [ 0 ], await / 0 /u, await ``\n        this.match(tt.plusMin) ||\n        this.match(tt.parenL) ||\n        this.match(tt.bracketL) ||\n        this.match(tt.backQuote) ||\n        // Sometimes the tokenizer generates tt.slash for regexps, and this is\n        // handler by parseExprAtom\n        this.match(tt.regexp) ||\n        this.match(tt.slash) ||\n        // This code could be parsed both as a modulo operator or as an intrinsic:\n        //   await %x(0)\n        (this.hasPlugin(\"v8intrinsic\") && this.match(tt.modulo))\n      ) {\n        this.ambiguousScriptDifferentAst = true;\n      } else {\n        this.sawUnambiguousESM = true;\n      }\n    }\n\n    if (!this.state.soloAwait) {\n      node.argument = this.parseMaybeUnary();\n    }\n\n    return this.finishNode(node, \"AwaitExpression\");\n  }\n\n  // Parses yield expression inside generator.\n\n  parseYield(noIn?: ?boolean): N.YieldExpression {\n    const node = this.startNode();\n\n    if (this.state.inParameters) {\n      this.raise(node.start, Errors.YieldInParameter);\n    } else if (this.state.yieldPos === -1) {\n      this.state.yieldPos = node.start;\n    }\n\n    this.next();\n    if (\n      this.match(tt.semi) ||\n      (!this.match(tt.star) && !this.state.type.startsExpr) ||\n      this.hasPrecedingLineBreak()\n    ) {\n      node.delegate = false;\n      node.argument = null;\n    } else {\n      node.delegate = this.eat(tt.star);\n      node.argument = this.parseMaybeAssign(noIn);\n    }\n    return this.finishNode(node, \"YieldExpression\");\n  }\n\n  // Validates a pipeline (for any of the pipeline Babylon plugins) at the point\n  // of the infix operator `|>`.\n\n  checkPipelineAtInfixOperator(left: N.Expression, leftStartPos: number) {\n    if (this.getPluginOption(\"pipelineOperator\", \"proposal\") === \"smart\") {\n      if (left.type === \"SequenceExpression\") {\n        // Ensure that the pipeline head is not a comma-delimited\n        // sequence expression.\n        this.raise(leftStartPos, Errors.PipelineHeadSequenceExpression);\n      }\n    }\n  }\n\n  parseSmartPipelineBody(\n    childExpression: N.Expression,\n    startPos: number,\n    startLoc: Position,\n  ): N.PipelineBody {\n    const pipelineStyle = this.checkSmartPipelineBodyStyle(childExpression);\n\n    this.checkSmartPipelineBodyEarlyErrors(\n      childExpression,\n      pipelineStyle,\n      startPos,\n    );\n\n    return this.parseSmartPipelineBodyInStyle(\n      childExpression,\n      pipelineStyle,\n      startPos,\n      startLoc,\n    );\n  }\n\n  checkSmartPipelineBodyEarlyErrors(\n    childExpression: N.Expression,\n    pipelineStyle: N.PipelineStyle,\n    startPos: number,\n  ): void {\n    if (this.match(tt.arrow)) {\n      // If the following token is invalidly `=>`, then throw a human-friendly error\n      // instead of something like 'Unexpected token, expected \";\"'.\n      throw this.raise(this.state.start, Errors.PipelineBodyNoArrow);\n    } else if (\n      pipelineStyle === \"PipelineTopicExpression\" &&\n      childExpression.type === \"SequenceExpression\"\n    ) {\n      this.raise(startPos, Errors.PipelineBodySequenceExpression);\n    }\n  }\n\n  parseSmartPipelineBodyInStyle(\n    childExpression: N.Expression,\n    pipelineStyle: N.PipelineStyle,\n    startPos: number,\n    startLoc: Position,\n  ): N.PipelineBody {\n    const bodyNode = this.startNodeAt(startPos, startLoc);\n    switch (pipelineStyle) {\n      case \"PipelineBareFunction\":\n        bodyNode.callee = childExpression;\n        break;\n      case \"PipelineBareConstructor\":\n        bodyNode.callee = childExpression.callee;\n        break;\n      case \"PipelineBareAwaitedFunction\":\n        bodyNode.callee = childExpression.argument;\n        break;\n      case \"PipelineTopicExpression\":\n        if (!this.topicReferenceWasUsedInCurrentTopicContext()) {\n          this.raise(startPos, Errors.PipelineTopicUnused);\n        }\n        bodyNode.expression = childExpression;\n        break;\n      default:\n        throw new Error(\n          `Internal @babel/parser error: Unknown pipeline style (${pipelineStyle})`,\n        );\n    }\n    return this.finishNode(bodyNode, pipelineStyle);\n  }\n\n  checkSmartPipelineBodyStyle(expression: N.Expression): N.PipelineStyle {\n    switch (expression.type) {\n      default:\n        return this.isSimpleReference(expression)\n          ? \"PipelineBareFunction\"\n          : \"PipelineTopicExpression\";\n    }\n  }\n\n  isSimpleReference(expression: N.Expression): boolean {\n    switch (expression.type) {\n      case \"MemberExpression\":\n        return (\n          !expression.computed && this.isSimpleReference(expression.object)\n        );\n      case \"Identifier\":\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  // Enable topic references from outer contexts within smart pipeline bodies.\n  // The function modifies the parser's topic-context state to enable or disable\n  // the use of topic references with the smartPipelines plugin. They then run a\n  // callback, then they reset the parser to the old topic-context state that it\n  // had before the function was called.\n\n  withTopicPermittingContext<T>(callback: () => T): T {\n    const outerContextTopicState = this.state.topicContext;\n    this.state.topicContext = {\n      // Enable the use of the primary topic reference.\n      maxNumOfResolvableTopics: 1,\n      // Hide the use of any topic references from outer contexts.\n      maxTopicIndex: null,\n    };\n\n    try {\n      return callback();\n    } finally {\n      this.state.topicContext = outerContextTopicState;\n    }\n  }\n\n  // Disable topic references from outer contexts within syntax constructs\n  // such as the bodies of iteration statements.\n  // The function modifies the parser's topic-context state to enable or disable\n  // the use of topic references with the smartPipelines plugin. They then run a\n  // callback, then they reset the parser to the old topic-context state that it\n  // had before the function was called.\n\n  withTopicForbiddingContext<T>(callback: () => T): T {\n    const outerContextTopicState = this.state.topicContext;\n    this.state.topicContext = {\n      // Disable the use of the primary topic reference.\n      maxNumOfResolvableTopics: 0,\n      // Hide the use of any topic references from outer contexts.\n      maxTopicIndex: null,\n    };\n\n    try {\n      return callback();\n    } finally {\n      this.state.topicContext = outerContextTopicState;\n    }\n  }\n\n  withSoloAwaitPermittingContext<T>(callback: () => T): T {\n    const outerContextSoloAwaitState = this.state.soloAwait;\n    this.state.soloAwait = true;\n\n    try {\n      return callback();\n    } finally {\n      this.state.soloAwait = outerContextSoloAwaitState;\n    }\n  }\n\n  // Register the use of a primary topic reference (`#`) within the current\n  // topic context.\n  registerTopicReference(): void {\n    this.state.topicContext.maxTopicIndex = 0;\n  }\n\n  primaryTopicReferenceIsAllowedInCurrentTopicContext(): boolean {\n    return this.state.topicContext.maxNumOfResolvableTopics >= 1;\n  }\n\n  topicReferenceWasUsedInCurrentTopicContext(): boolean {\n    return (\n      this.state.topicContext.maxTopicIndex != null &&\n      this.state.topicContext.maxTopicIndex >= 0\n    );\n  }\n\n  parseFSharpPipelineBody(prec: number, noIn: ?boolean): N.Expression {\n    const startPos = this.state.start;\n    const startLoc = this.state.startLoc;\n\n    this.state.potentialArrowAt = this.state.start;\n    const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;\n    this.state.inFSharpPipelineDirectBody = true;\n\n    const ret = this.parseExprOp(\n      this.parseMaybeUnary(),\n      startPos,\n      startLoc,\n      prec,\n      noIn,\n    );\n\n    this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;\n\n    return ret;\n  }\n}\n","// @flow\n\nimport * as N from \"../types\";\nimport { types as tt, type TokenType } from \"../tokenizer/types\";\nimport ExpressionParser from \"./expression\";\nimport { Errors } from \"./location\";\nimport {\n  isIdentifierChar,\n  isIdentifierStart,\n  keywordRelationalOperator,\n} from \"../util/identifier\";\nimport { lineBreak } from \"../util/whitespace\";\nimport * as charCodes from \"charcodes\";\nimport {\n  BIND_CLASS,\n  BIND_LEXICAL,\n  BIND_VAR,\n  BIND_FUNCTION,\n  SCOPE_CLASS,\n  SCOPE_FUNCTION,\n  SCOPE_OTHER,\n  SCOPE_SIMPLE_CATCH,\n  SCOPE_SUPER,\n  CLASS_ELEMENT_OTHER,\n  CLASS_ELEMENT_INSTANCE_GETTER,\n  CLASS_ELEMENT_INSTANCE_SETTER,\n  CLASS_ELEMENT_STATIC_GETTER,\n  CLASS_ELEMENT_STATIC_SETTER,\n  type BindingTypes,\n} from \"../util/scopeflags\";\nimport { ExpressionErrors } from \"./util\";\nimport { PARAM, functionFlags } from \"../util/production-parameter\";\n\nconst loopLabel = { kind: \"loop\" },\n  switchLabel = { kind: \"switch\" };\n\nconst FUNC_NO_FLAGS = 0b000,\n  FUNC_STATEMENT = 0b001,\n  FUNC_HANGING_STATEMENT = 0b010,\n  FUNC_NULLABLE_ID = 0b100;\n\nexport default class StatementParser extends ExpressionParser {\n  // ### Statement parsing\n\n  // Parse a program. Initializes the parser, reads any number of\n  // statements, and wraps them in a Program node.  Optionally takes a\n  // `program` argument.  If present, the statements will be appended\n  // to its body instead of creating a new node.\n\n  parseTopLevel(file: N.File, program: N.Program): N.File {\n    program.sourceType = this.options.sourceType;\n\n    program.interpreter = this.parseInterpreterDirective();\n\n    this.parseBlockBody(program, true, true, tt.eof);\n\n    if (\n      this.inModule &&\n      !this.options.allowUndeclaredExports &&\n      this.scope.undefinedExports.size > 0\n    ) {\n      for (const [name] of Array.from(this.scope.undefinedExports)) {\n        const pos = this.scope.undefinedExports.get(name);\n        // $FlowIssue\n        this.raise(pos, Errors.ModuleExportUndefined, name);\n      }\n    }\n\n    file.program = this.finishNode(program, \"Program\");\n    file.comments = this.state.comments;\n\n    if (this.options.tokens) file.tokens = this.tokens;\n\n    return this.finishNode(file, \"File\");\n  }\n\n  // TODO\n\n  stmtToDirective(stmt: N.Statement): N.Directive {\n    const expr = stmt.expression;\n\n    const directiveLiteral = this.startNodeAt(expr.start, expr.loc.start);\n    const directive = this.startNodeAt(stmt.start, stmt.loc.start);\n\n    const raw = this.input.slice(expr.start, expr.end);\n    const val = (directiveLiteral.value = raw.slice(1, -1)); // remove quotes\n\n    this.addExtra(directiveLiteral, \"raw\", raw);\n    this.addExtra(directiveLiteral, \"rawValue\", val);\n\n    directive.value = this.finishNodeAt(\n      directiveLiteral,\n      \"DirectiveLiteral\",\n      expr.end,\n      expr.loc.end,\n    );\n\n    return this.finishNodeAt(directive, \"Directive\", stmt.end, stmt.loc.end);\n  }\n\n  parseInterpreterDirective(): N.InterpreterDirective | null {\n    if (!this.match(tt.interpreterDirective)) {\n      return null;\n    }\n\n    const node = this.startNode();\n    node.value = this.state.value;\n    this.next();\n    return this.finishNode(node, \"InterpreterDirective\");\n  }\n\n  isLet(context: ?string): boolean {\n    if (!this.isContextual(\"let\")) {\n      return false;\n    }\n    const next = this.nextTokenStart();\n    const nextCh = this.input.charCodeAt(next);\n    // For ambiguous cases, determine if a LexicalDeclaration (or only a\n    // Statement) is allowed here. If context is not empty then only a Statement\n    // is allowed. However, `let [` is an explicit negative lookahead for\n    // ExpressionStatement, so special-case it first.\n    if (nextCh === charCodes.leftSquareBracket) return true;\n    if (context) return false;\n\n    if (nextCh === charCodes.leftCurlyBrace) return true;\n\n    if (isIdentifierStart(nextCh)) {\n      let pos = next + 1;\n      while (isIdentifierChar(this.input.charCodeAt(pos))) {\n        ++pos;\n      }\n      const ident = this.input.slice(next, pos);\n      if (!keywordRelationalOperator.test(ident)) return true;\n    }\n    return false;\n  }\n\n  // Parse a single statement.\n  //\n  // If expecting a statement and finding a slash operator, parse a\n  // regular expression literal. This is to handle cases like\n  // `if (foo) /blah/.exec(foo)`, where looking at the previous token\n  // does not help.\n\n  parseStatement(context: ?string, topLevel?: boolean): N.Statement {\n    if (this.match(tt.at)) {\n      this.parseDecorators(true);\n    }\n    return this.parseStatementContent(context, topLevel);\n  }\n\n  parseStatementContent(context: ?string, topLevel: ?boolean): N.Statement {\n    let starttype = this.state.type;\n    const node = this.startNode();\n    let kind;\n\n    if (this.isLet(context)) {\n      starttype = tt._var;\n      kind = \"let\";\n    }\n\n    // Most types of statements are recognized by the keyword they\n    // start with. Many are trivial to parse, some require a bit of\n    // complexity.\n\n    switch (starttype) {\n      case tt._break:\n      case tt._continue:\n        // $FlowFixMe\n        return this.parseBreakContinueStatement(node, starttype.keyword);\n      case tt._debugger:\n        return this.parseDebuggerStatement(node);\n      case tt._do:\n        return this.parseDoStatement(node);\n      case tt._for:\n        return this.parseForStatement(node);\n      case tt._function:\n        if (this.lookaheadCharCode() === charCodes.dot) break;\n        if (context) {\n          if (this.state.strict) {\n            this.raise(this.state.start, Errors.StrictFunction);\n          } else if (context !== \"if\" && context !== \"label\") {\n            this.raise(this.state.start, Errors.SloppyFunction);\n          }\n        }\n        return this.parseFunctionStatement(node, false, !context);\n\n      case tt._class:\n        if (context) this.unexpected();\n        return this.parseClass(node, true);\n\n      case tt._if:\n        return this.parseIfStatement(node);\n      case tt._return:\n        return this.parseReturnStatement(node);\n      case tt._switch:\n        return this.parseSwitchStatement(node);\n      case tt._throw:\n        return this.parseThrowStatement(node);\n      case tt._try:\n        return this.parseTryStatement(node);\n\n      case tt._const:\n      case tt._var:\n        kind = kind || this.state.value;\n        if (context && kind !== \"var\") {\n          this.raise(this.state.start, Errors.UnexpectedLexicalDeclaration);\n        }\n        return this.parseVarStatement(node, kind);\n\n      case tt._while:\n        return this.parseWhileStatement(node);\n      case tt._with:\n        return this.parseWithStatement(node);\n      case tt.braceL:\n        return this.parseBlock();\n      case tt.semi:\n        return this.parseEmptyStatement(node);\n      case tt._export:\n      case tt._import: {\n        const nextTokenCharCode = this.lookaheadCharCode();\n        if (\n          nextTokenCharCode === charCodes.leftParenthesis ||\n          nextTokenCharCode === charCodes.dot\n        ) {\n          break;\n        }\n\n        if (!this.options.allowImportExportEverywhere && !topLevel) {\n          this.raise(this.state.start, Errors.UnexpectedImportExport);\n        }\n\n        this.next();\n\n        let result;\n        if (starttype === tt._import) {\n          result = this.parseImport(node);\n\n          if (\n            result.type === \"ImportDeclaration\" &&\n            (!result.importKind || result.importKind === \"value\")\n          ) {\n            this.sawUnambiguousESM = true;\n          }\n        } else {\n          result = this.parseExport(node);\n\n          if (\n            (result.type === \"ExportNamedDeclaration\" &&\n              (!result.exportKind || result.exportKind === \"value\")) ||\n            (result.type === \"ExportAllDeclaration\" &&\n              (!result.exportKind || result.exportKind === \"value\")) ||\n            result.type === \"ExportDefaultDeclaration\"\n          ) {\n            this.sawUnambiguousESM = true;\n          }\n        }\n\n        this.assertModuleNodeAllowed(node);\n\n        return result;\n      }\n\n      default: {\n        if (this.isAsyncFunction()) {\n          if (context) {\n            this.raise(\n              this.state.start,\n              Errors.AsyncFunctionInSingleStatementContext,\n            );\n          }\n          this.next();\n          return this.parseFunctionStatement(node, true, !context);\n        }\n      }\n    }\n\n    // If the statement does not start with a statement keyword or a\n    // brace, it's an ExpressionStatement or LabeledStatement. We\n    // simply start parsing an expression, and afterwards, if the\n    // next token is a colon and the expression was a simple\n    // Identifier node, we switch to interpreting it as a label.\n    const maybeName = this.state.value;\n    const expr = this.parseExpression();\n\n    if (\n      starttype === tt.name &&\n      expr.type === \"Identifier\" &&\n      this.eat(tt.colon)\n    ) {\n      return this.parseLabeledStatement(node, maybeName, expr, context);\n    } else {\n      return this.parseExpressionStatement(node, expr);\n    }\n  }\n\n  assertModuleNodeAllowed(node: N.Node): void {\n    if (!this.options.allowImportExportEverywhere && !this.inModule) {\n      this.raiseWithData(\n        node.start,\n        {\n          code: \"BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED\",\n        },\n        Errors.ImportOutsideModule,\n      );\n    }\n  }\n\n  takeDecorators(node: N.HasDecorators): void {\n    const decorators = this.state.decoratorStack[\n      this.state.decoratorStack.length - 1\n    ];\n    if (decorators.length) {\n      node.decorators = decorators;\n      this.resetStartLocationFromNode(node, decorators[0]);\n      this.state.decoratorStack[this.state.decoratorStack.length - 1] = [];\n    }\n  }\n\n  canHaveLeadingDecorator(): boolean {\n    return this.match(tt._class);\n  }\n\n  parseDecorators(allowExport?: boolean): void {\n    const currentContextDecorators = this.state.decoratorStack[\n      this.state.decoratorStack.length - 1\n    ];\n    while (this.match(tt.at)) {\n      const decorator = this.parseDecorator();\n      currentContextDecorators.push(decorator);\n    }\n\n    if (this.match(tt._export)) {\n      if (!allowExport) {\n        this.unexpected();\n      }\n\n      if (\n        this.hasPlugin(\"decorators\") &&\n        !this.getPluginOption(\"decorators\", \"decoratorsBeforeExport\")\n      ) {\n        this.raise(this.state.start, Errors.DecoratorExportClass);\n      }\n    } else if (!this.canHaveLeadingDecorator()) {\n      throw this.raise(this.state.start, Errors.UnexpectedLeadingDecorator);\n    }\n  }\n\n  parseDecorator(): N.Decorator {\n    this.expectOnePlugin([\"decorators-legacy\", \"decorators\"]);\n\n    const node = this.startNode();\n    this.next();\n\n    if (this.hasPlugin(\"decorators\")) {\n      // Every time a decorator class expression is evaluated, a new empty array is pushed onto the stack\n      // So that the decorators of any nested class expressions will be dealt with separately\n      this.state.decoratorStack.push([]);\n\n      const startPos = this.state.start;\n      const startLoc = this.state.startLoc;\n      let expr: N.Expression;\n\n      if (this.eat(tt.parenL)) {\n        expr = this.parseExpression();\n        this.expect(tt.parenR);\n      } else {\n        expr = this.parseIdentifier(false);\n\n        while (this.eat(tt.dot)) {\n          const node = this.startNodeAt(startPos, startLoc);\n          node.object = expr;\n          node.property = this.parseIdentifier(true);\n          node.computed = false;\n          expr = this.finishNode(node, \"MemberExpression\");\n        }\n      }\n\n      node.expression = this.parseMaybeDecoratorArguments(expr);\n      this.state.decoratorStack.pop();\n    } else {\n      node.expression = this.parseExprSubscripts();\n    }\n    return this.finishNode(node, \"Decorator\");\n  }\n\n  parseMaybeDecoratorArguments(expr: N.Expression): N.Expression {\n    if (this.eat(tt.parenL)) {\n      const node = this.startNodeAtNode(expr);\n      node.callee = expr;\n      node.arguments = this.parseCallExpressionArguments(tt.parenR, false);\n      this.toReferencedList(node.arguments);\n      return this.finishNode(node, \"CallExpression\");\n    }\n\n    return expr;\n  }\n\n  parseBreakContinueStatement(\n    node: N.BreakStatement | N.ContinueStatement,\n    keyword: string,\n  ): N.BreakStatement | N.ContinueStatement {\n    const isBreak = keyword === \"break\";\n    this.next();\n\n    if (this.isLineTerminator()) {\n      node.label = null;\n    } else {\n      node.label = this.parseIdentifier();\n      this.semicolon();\n    }\n\n    this.verifyBreakContinue(node, keyword);\n\n    return this.finishNode(\n      node,\n      isBreak ? \"BreakStatement\" : \"ContinueStatement\",\n    );\n  }\n\n  verifyBreakContinue(\n    node: N.BreakStatement | N.ContinueStatement,\n    keyword: string,\n  ) {\n    const isBreak = keyword === \"break\";\n    let i;\n    for (i = 0; i < this.state.labels.length; ++i) {\n      const lab = this.state.labels[i];\n      if (node.label == null || lab.name === node.label.name) {\n        if (lab.kind != null && (isBreak || lab.kind === \"loop\")) break;\n        if (node.label && isBreak) break;\n      }\n    }\n    if (i === this.state.labels.length) {\n      this.raise(node.start, Errors.IllegalBreakContinue, keyword);\n    }\n  }\n\n  parseDebuggerStatement(node: N.DebuggerStatement): N.DebuggerStatement {\n    this.next();\n    this.semicolon();\n    return this.finishNode(node, \"DebuggerStatement\");\n  }\n\n  parseHeaderExpression(): N.Expression {\n    this.expect(tt.parenL);\n    const val = this.parseExpression();\n    this.expect(tt.parenR);\n    return val;\n  }\n\n  parseDoStatement(node: N.DoWhileStatement): N.DoWhileStatement {\n    this.next();\n    this.state.labels.push(loopLabel);\n\n    node.body =\n      // For the smartPipelines plugin: Disable topic references from outer\n      // contexts within the loop body. They are permitted in test expressions,\n      // outside of the loop body.\n      this.withTopicForbiddingContext(() =>\n        // Parse the loop body's body.\n        this.parseStatement(\"do\"),\n      );\n\n    this.state.labels.pop();\n\n    this.expect(tt._while);\n    node.test = this.parseHeaderExpression();\n    this.eat(tt.semi);\n    return this.finishNode(node, \"DoWhileStatement\");\n  }\n\n  // Disambiguating between a `for` and a `for`/`in` or `for`/`of`\n  // loop is non-trivial. Basically, we have to parse the init `var`\n  // statement or expression, disallowing the `in` operator (see\n  // the second parameter to `parseExpression`), and then check\n  // whether the next token is `in` or `of`. When there is no init\n  // part (semicolon immediately after the opening parenthesis), it\n  // is a regular `for` loop.\n\n  parseForStatement(node: N.Node): N.ForLike {\n    this.next();\n    this.state.labels.push(loopLabel);\n\n    let awaitAt = -1;\n    if (this.isAwaitAllowed() && this.eatContextual(\"await\")) {\n      awaitAt = this.state.lastTokStart;\n    }\n    this.scope.enter(SCOPE_OTHER);\n    this.expect(tt.parenL);\n\n    if (this.match(tt.semi)) {\n      if (awaitAt > -1) {\n        this.unexpected(awaitAt);\n      }\n      return this.parseFor(node, null);\n    }\n\n    const isLet = this.isLet();\n    if (this.match(tt._var) || this.match(tt._const) || isLet) {\n      const init = this.startNode();\n      const kind = isLet ? \"let\" : this.state.value;\n      this.next();\n      this.parseVar(init, true, kind);\n      this.finishNode(init, \"VariableDeclaration\");\n\n      if (\n        (this.match(tt._in) || this.isContextual(\"of\")) &&\n        init.declarations.length === 1\n      ) {\n        return this.parseForIn(node, init, awaitAt);\n      }\n      if (awaitAt > -1) {\n        this.unexpected(awaitAt);\n      }\n      return this.parseFor(node, init);\n    }\n\n    const refExpressionErrors = new ExpressionErrors();\n    const init = this.parseExpression(true, refExpressionErrors);\n    if (this.match(tt._in) || this.isContextual(\"of\")) {\n      this.toAssignable(init);\n      const description = this.isContextual(\"of\")\n        ? \"for-of statement\"\n        : \"for-in statement\";\n      this.checkLVal(init, undefined, undefined, description);\n      return this.parseForIn(node, init, awaitAt);\n    } else {\n      this.checkExpressionErrors(refExpressionErrors, true);\n    }\n    if (awaitAt > -1) {\n      this.unexpected(awaitAt);\n    }\n    return this.parseFor(node, init);\n  }\n\n  parseFunctionStatement(\n    node: N.FunctionDeclaration,\n    isAsync?: boolean,\n    declarationPosition?: boolean,\n  ): N.FunctionDeclaration {\n    this.next();\n    return this.parseFunction(\n      node,\n      FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT),\n      isAsync,\n    );\n  }\n\n  parseIfStatement(node: N.IfStatement): N.IfStatement {\n    this.next();\n    node.test = this.parseHeaderExpression();\n    node.consequent = this.parseStatement(\"if\");\n    node.alternate = this.eat(tt._else) ? this.parseStatement(\"if\") : null;\n    return this.finishNode(node, \"IfStatement\");\n  }\n\n  parseReturnStatement(node: N.ReturnStatement): N.ReturnStatement {\n    if (!this.prodParam.hasReturn && !this.options.allowReturnOutsideFunction) {\n      this.raise(this.state.start, Errors.IllegalReturn);\n    }\n\n    this.next();\n\n    // In `return` (and `break`/`continue`), the keywords with\n    // optional arguments, we eagerly look for a semicolon or the\n    // possibility to insert one.\n\n    if (this.isLineTerminator()) {\n      node.argument = null;\n    } else {\n      node.argument = this.parseExpression();\n      this.semicolon();\n    }\n\n    return this.finishNode(node, \"ReturnStatement\");\n  }\n\n  parseSwitchStatement(node: N.SwitchStatement): N.SwitchStatement {\n    this.next();\n    node.discriminant = this.parseHeaderExpression();\n    const cases = (node.cases = []);\n    this.expect(tt.braceL);\n    this.state.labels.push(switchLabel);\n    this.scope.enter(SCOPE_OTHER);\n\n    // Statements under must be grouped (by label) in SwitchCase\n    // nodes. `cur` is used to keep the node that we are currently\n    // adding statements to.\n\n    let cur;\n    for (let sawDefault; !this.match(tt.braceR); ) {\n      if (this.match(tt._case) || this.match(tt._default)) {\n        const isCase = this.match(tt._case);\n        if (cur) this.finishNode(cur, \"SwitchCase\");\n        cases.push((cur = this.startNode()));\n        cur.consequent = [];\n        this.next();\n        if (isCase) {\n          cur.test = this.parseExpression();\n        } else {\n          if (sawDefault) {\n            this.raise(\n              this.state.lastTokStart,\n              Errors.MultipleDefaultsInSwitch,\n            );\n          }\n          sawDefault = true;\n          cur.test = null;\n        }\n        this.expect(tt.colon);\n      } else {\n        if (cur) {\n          cur.consequent.push(this.parseStatement(null));\n        } else {\n          this.unexpected();\n        }\n      }\n    }\n    this.scope.exit();\n    if (cur) this.finishNode(cur, \"SwitchCase\");\n    this.next(); // Closing brace\n    this.state.labels.pop();\n    return this.finishNode(node, \"SwitchStatement\");\n  }\n\n  parseThrowStatement(node: N.ThrowStatement): N.ThrowStatement {\n    this.next();\n    if (\n      lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start))\n    ) {\n      this.raise(this.state.lastTokEnd, Errors.NewlineAfterThrow);\n    }\n    node.argument = this.parseExpression();\n    this.semicolon();\n    return this.finishNode(node, \"ThrowStatement\");\n  }\n\n  parseTryStatement(node: N.TryStatement): N.TryStatement {\n    this.next();\n\n    node.block = this.parseBlock();\n    node.handler = null;\n\n    if (this.match(tt._catch)) {\n      const clause = this.startNode();\n      this.next();\n      if (this.match(tt.parenL)) {\n        this.expect(tt.parenL);\n        clause.param = this.parseBindingAtom();\n        const simple = clause.param.type === \"Identifier\";\n        this.scope.enter(simple ? SCOPE_SIMPLE_CATCH : 0);\n        this.checkLVal(clause.param, BIND_LEXICAL, null, \"catch clause\");\n        this.expect(tt.parenR);\n      } else {\n        clause.param = null;\n        this.scope.enter(SCOPE_OTHER);\n      }\n\n      clause.body =\n        // For the smartPipelines plugin: Disable topic references from outer\n        // contexts within the function body. They are permitted in function\n        // default-parameter expressions, which are part of the outer context,\n        // outside of the function body.\n        this.withTopicForbiddingContext(() =>\n          // Parse the catch clause's body.\n          this.parseBlock(false, false),\n        );\n      this.scope.exit();\n\n      node.handler = this.finishNode(clause, \"CatchClause\");\n    }\n\n    node.finalizer = this.eat(tt._finally) ? this.parseBlock() : null;\n\n    if (!node.handler && !node.finalizer) {\n      this.raise(node.start, Errors.NoCatchOrFinally);\n    }\n\n    return this.finishNode(node, \"TryStatement\");\n  }\n\n  parseVarStatement(\n    node: N.VariableDeclaration,\n    kind: \"var\" | \"let\" | \"const\",\n  ): N.VariableDeclaration {\n    this.next();\n    this.parseVar(node, false, kind);\n    this.semicolon();\n    return this.finishNode(node, \"VariableDeclaration\");\n  }\n\n  parseWhileStatement(node: N.WhileStatement): N.WhileStatement {\n    this.next();\n    node.test = this.parseHeaderExpression();\n    this.state.labels.push(loopLabel);\n\n    node.body =\n      // For the smartPipelines plugin:\n      // Disable topic references from outer contexts within the loop body.\n      // They are permitted in test expressions, outside of the loop body.\n      this.withTopicForbiddingContext(() =>\n        // Parse loop body.\n        this.parseStatement(\"while\"),\n      );\n\n    this.state.labels.pop();\n\n    return this.finishNode(node, \"WhileStatement\");\n  }\n\n  parseWithStatement(node: N.WithStatement): N.WithStatement {\n    if (this.state.strict) {\n      this.raise(this.state.start, Errors.StrictWith);\n    }\n    this.next();\n    node.object = this.parseHeaderExpression();\n\n    node.body =\n      // For the smartPipelines plugin:\n      // Disable topic references from outer contexts within the function body.\n      // They are permitted in function default-parameter expressions, which are\n      // part of the outer context, outside of the function body.\n      this.withTopicForbiddingContext(() =>\n        // Parse the statement body.\n        this.parseStatement(\"with\"),\n      );\n\n    return this.finishNode(node, \"WithStatement\");\n  }\n\n  parseEmptyStatement(node: N.EmptyStatement): N.EmptyStatement {\n    this.next();\n    return this.finishNode(node, \"EmptyStatement\");\n  }\n\n  parseLabeledStatement(\n    node: N.LabeledStatement,\n    maybeName: string,\n    expr: N.Identifier,\n    context: ?string,\n  ): N.LabeledStatement {\n    for (const label of this.state.labels) {\n      if (label.name === maybeName) {\n        this.raise(expr.start, Errors.LabelRedeclaration, maybeName);\n      }\n    }\n\n    const kind = this.state.type.isLoop\n      ? \"loop\"\n      : this.match(tt._switch)\n      ? \"switch\"\n      : null;\n    for (let i = this.state.labels.length - 1; i >= 0; i--) {\n      const label = this.state.labels[i];\n      if (label.statementStart === node.start) {\n        label.statementStart = this.state.start;\n        label.kind = kind;\n      } else {\n        break;\n      }\n    }\n\n    this.state.labels.push({\n      name: maybeName,\n      kind: kind,\n      statementStart: this.state.start,\n    });\n    node.body = this.parseStatement(\n      context\n        ? context.indexOf(\"label\") === -1\n          ? context + \"label\"\n          : context\n        : \"label\",\n    );\n\n    this.state.labels.pop();\n    node.label = expr;\n    return this.finishNode(node, \"LabeledStatement\");\n  }\n\n  parseExpressionStatement(\n    node: N.ExpressionStatement,\n    expr: N.Expression,\n  ): N.Statement {\n    node.expression = expr;\n    this.semicolon();\n    return this.finishNode(node, \"ExpressionStatement\");\n  }\n\n  // Parse a semicolon-enclosed block of statements, handling `\"use\n  // strict\"` declarations when `allowStrict` is true (used for\n  // function bodies).\n\n  parseBlock(\n    allowDirectives?: boolean = false,\n    createNewLexicalScope?: boolean = true,\n    afterBlockParse?: (hasStrictModeDirective: boolean) => void,\n  ): N.BlockStatement {\n    const node = this.startNode();\n    this.expect(tt.braceL);\n    if (createNewLexicalScope) {\n      this.scope.enter(SCOPE_OTHER);\n    }\n    this.parseBlockBody(\n      node,\n      allowDirectives,\n      false,\n      tt.braceR,\n      afterBlockParse,\n    );\n    if (createNewLexicalScope) {\n      this.scope.exit();\n    }\n    return this.finishNode(node, \"BlockStatement\");\n  }\n\n  isValidDirective(stmt: N.Statement): boolean {\n    return (\n      stmt.type === \"ExpressionStatement\" &&\n      stmt.expression.type === \"StringLiteral\" &&\n      !stmt.expression.extra.parenthesized\n    );\n  }\n\n  parseBlockBody(\n    node: N.BlockStatementLike,\n    allowDirectives: ?boolean,\n    topLevel: boolean,\n    end: TokenType,\n    afterBlockParse?: (hasStrictModeDirective: boolean) => void,\n  ): void {\n    const body = (node.body = []);\n    const directives = (node.directives = []);\n    this.parseBlockOrModuleBlockBody(\n      body,\n      allowDirectives ? directives : undefined,\n      topLevel,\n      end,\n      afterBlockParse,\n    );\n  }\n\n  // Undefined directives means that directives are not allowed.\n  parseBlockOrModuleBlockBody(\n    body: N.Statement[],\n    directives: ?(N.Directive[]),\n    topLevel: boolean,\n    end: TokenType,\n    afterBlockParse?: (hasStrictModeDirective: boolean) => void,\n  ): void {\n    const octalPositions = [];\n    const oldStrict = this.state.strict;\n    let hasStrictModeDirective = false;\n    let parsedNonDirective = false;\n\n    while (!this.match(end)) {\n      // Track octal literals that occur before a \"use strict\" directive.\n      if (!parsedNonDirective && this.state.octalPositions.length) {\n        octalPositions.push(...this.state.octalPositions);\n      }\n\n      const stmt = this.parseStatement(null, topLevel);\n\n      if (directives && !parsedNonDirective && this.isValidDirective(stmt)) {\n        const directive = this.stmtToDirective(stmt);\n        directives.push(directive);\n\n        if (!hasStrictModeDirective && directive.value.value === \"use strict\") {\n          hasStrictModeDirective = true;\n          this.setStrict(true);\n        }\n\n        continue;\n      }\n\n      parsedNonDirective = true;\n      body.push(stmt);\n    }\n\n    // Throw an error for any octal literals found before a\n    // \"use strict\" directive. Strict mode will be set at parse\n    // time for any literals that occur after the directive.\n    if (this.state.strict && octalPositions.length) {\n      for (const pos of octalPositions) {\n        this.raise(pos, Errors.StrictOctalLiteral);\n      }\n    }\n\n    if (afterBlockParse) {\n      afterBlockParse.call(this, hasStrictModeDirective);\n    }\n\n    if (!oldStrict) {\n      this.setStrict(false);\n    }\n\n    this.next();\n  }\n\n  // Parse a regular `for` loop. The disambiguation code in\n  // `parseStatement` will already have parsed the init statement or\n  // expression.\n\n  parseFor(\n    node: N.ForStatement,\n    init: ?(N.VariableDeclaration | N.Expression),\n  ): N.ForStatement {\n    node.init = init;\n    this.expect(tt.semi);\n    node.test = this.match(tt.semi) ? null : this.parseExpression();\n    this.expect(tt.semi);\n    node.update = this.match(tt.parenR) ? null : this.parseExpression();\n    this.expect(tt.parenR);\n\n    node.body =\n      // For the smartPipelines plugin: Disable topic references from outer\n      // contexts within the loop body. They are permitted in test expressions,\n      // outside of the loop body.\n      this.withTopicForbiddingContext(() =>\n        // Parse the loop body.\n        this.parseStatement(\"for\"),\n      );\n\n    this.scope.exit();\n    this.state.labels.pop();\n\n    return this.finishNode(node, \"ForStatement\");\n  }\n\n  // Parse a `for`/`in` and `for`/`of` loop, which are almost\n  // same from parser's perspective.\n\n  parseForIn(\n    node: N.ForInOf,\n    init: N.VariableDeclaration | N.AssignmentPattern,\n    awaitAt: number,\n  ): N.ForInOf {\n    const isForIn = this.match(tt._in);\n    this.next();\n\n    if (isForIn) {\n      if (awaitAt > -1) this.unexpected(awaitAt);\n    } else {\n      node.await = awaitAt > -1;\n    }\n\n    if (\n      init.type === \"VariableDeclaration\" &&\n      init.declarations[0].init != null &&\n      (!isForIn ||\n        this.state.strict ||\n        init.kind !== \"var\" ||\n        init.declarations[0].id.type !== \"Identifier\")\n    ) {\n      this.raise(\n        init.start,\n        Errors.ForInOfLoopInitializer,\n        isForIn ? \"for-in\" : \"for-of\",\n      );\n    } else if (init.type === \"AssignmentPattern\") {\n      this.raise(init.start, Errors.InvalidLhs, \"for-loop\");\n    }\n\n    node.left = init;\n    node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign();\n    this.expect(tt.parenR);\n\n    node.body =\n      // For the smartPipelines plugin:\n      // Disable topic references from outer contexts within the loop body.\n      // They are permitted in test expressions, outside of the loop body.\n      this.withTopicForbiddingContext(() =>\n        // Parse loop body.\n        this.parseStatement(\"for\"),\n      );\n\n    this.scope.exit();\n    this.state.labels.pop();\n\n    return this.finishNode(node, isForIn ? \"ForInStatement\" : \"ForOfStatement\");\n  }\n\n  // Parse a list of variable declarations.\n\n  parseVar(\n    node: N.VariableDeclaration,\n    isFor: boolean,\n    kind: \"var\" | \"let\" | \"const\",\n  ): N.VariableDeclaration {\n    const declarations = (node.declarations = []);\n    const isTypescript = this.hasPlugin(\"typescript\");\n    node.kind = kind;\n    for (;;) {\n      const decl = this.startNode();\n      this.parseVarId(decl, kind);\n      if (this.eat(tt.eq)) {\n        decl.init = this.parseMaybeAssign(isFor);\n      } else {\n        if (\n          kind === \"const\" &&\n          !(this.match(tt._in) || this.isContextual(\"of\"))\n        ) {\n          // `const` with no initializer is allowed in TypeScript.\n          // It could be a declaration like `const x: number;`.\n          if (!isTypescript) {\n            this.unexpected();\n          }\n        } else if (\n          decl.id.type !== \"Identifier\" &&\n          !(isFor && (this.match(tt._in) || this.isContextual(\"of\")))\n        ) {\n          this.raise(\n            this.state.lastTokEnd,\n            Errors.DeclarationMissingInitializer,\n            \"Complex binding patterns\",\n          );\n        }\n        decl.init = null;\n      }\n      declarations.push(this.finishNode(decl, \"VariableDeclarator\"));\n      if (!this.eat(tt.comma)) break;\n    }\n    return node;\n  }\n\n  parseVarId(decl: N.VariableDeclarator, kind: \"var\" | \"let\" | \"const\"): void {\n    decl.id = this.parseBindingAtom();\n    this.checkLVal(\n      decl.id,\n      kind === \"var\" ? BIND_VAR : BIND_LEXICAL,\n      undefined,\n      \"variable declaration\",\n      kind !== \"var\",\n    );\n  }\n\n  // Parse a function declaration or literal (depending on the\n  // `isStatement` parameter).\n\n  parseFunction<T: N.NormalFunction>(\n    node: T,\n    statement?: number = FUNC_NO_FLAGS,\n    isAsync?: boolean = false,\n  ): T {\n    const isStatement = statement & FUNC_STATEMENT;\n    const isHangingStatement = statement & FUNC_HANGING_STATEMENT;\n    const requireId = !!isStatement && !(statement & FUNC_NULLABLE_ID);\n\n    this.initFunction(node, isAsync);\n\n    if (this.match(tt.star) && isHangingStatement) {\n      this.raise(this.state.start, Errors.GeneratorInSingleStatementContext);\n    }\n    node.generator = this.eat(tt.star);\n\n    if (isStatement) {\n      node.id = this.parseFunctionId(requireId);\n    }\n\n    const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;\n    const oldYieldPos = this.state.yieldPos;\n    const oldAwaitPos = this.state.awaitPos;\n    this.state.maybeInArrowParameters = false;\n    this.state.yieldPos = -1;\n    this.state.awaitPos = -1;\n    this.scope.enter(SCOPE_FUNCTION);\n    this.prodParam.enter(functionFlags(isAsync, node.generator));\n\n    if (!isStatement) {\n      node.id = this.parseFunctionId();\n    }\n\n    this.parseFunctionParams(node);\n\n    // For the smartPipelines plugin: Disable topic references from outer\n    // contexts within the function body. They are permitted in test\n    // expressions, outside of the function body.\n    this.withTopicForbiddingContext(() => {\n      // Parse the function body.\n      this.parseFunctionBodyAndFinish(\n        node,\n        isStatement ? \"FunctionDeclaration\" : \"FunctionExpression\",\n      );\n    });\n\n    this.prodParam.exit();\n    this.scope.exit();\n\n    if (isStatement && !isHangingStatement) {\n      // We need to register this _after_ parsing the function body\n      // because of TypeScript body-less function declarations,\n      // which shouldn't be added to the scope.\n      this.registerFunctionStatementId(node);\n    }\n\n    this.state.maybeInArrowParameters = oldMaybeInArrowParameters;\n    this.state.yieldPos = oldYieldPos;\n    this.state.awaitPos = oldAwaitPos;\n\n    return node;\n  }\n\n  parseFunctionId(requireId?: boolean): ?N.Identifier {\n    return requireId || this.match(tt.name) ? this.parseIdentifier() : null;\n  }\n\n  parseFunctionParams(node: N.Function, allowModifiers?: boolean): void {\n    const oldInParameters = this.state.inParameters;\n    this.state.inParameters = true;\n\n    this.expect(tt.parenL);\n    node.params = this.parseBindingList(\n      tt.parenR,\n      charCodes.rightParenthesis,\n      /* allowEmpty */ false,\n      allowModifiers,\n    );\n\n    this.state.inParameters = oldInParameters;\n    this.checkYieldAwaitInDefaultParams();\n  }\n\n  registerFunctionStatementId(node: N.Function): void {\n    if (!node.id) return;\n\n    // If it is a regular function declaration in sloppy mode, then it is\n    // subject to Annex B semantics (BIND_FUNCTION). Otherwise, the binding\n    // mode depends on properties of the current scope (see\n    // treatFunctionsAsVar).\n    this.scope.declareName(\n      node.id.name,\n      this.state.strict || node.generator || node.async\n        ? this.scope.treatFunctionsAsVar\n          ? BIND_VAR\n          : BIND_LEXICAL\n        : BIND_FUNCTION,\n      node.id.start,\n    );\n  }\n\n  // Parse a class declaration or literal (depending on the\n  // `isStatement` parameter).\n\n  parseClass<T: N.Class>(\n    node: T,\n    isStatement: /* T === ClassDeclaration */ boolean,\n    optionalId?: boolean,\n  ): T {\n    this.next();\n    this.takeDecorators(node);\n\n    // A class definition is always strict mode code.\n    const oldStrict = this.state.strict;\n    this.state.strict = true;\n\n    this.parseClassId(node, isStatement, optionalId);\n    this.parseClassSuper(node);\n    node.body = this.parseClassBody(!!node.superClass, oldStrict);\n\n    this.state.strict = oldStrict;\n\n    return this.finishNode(\n      node,\n      isStatement ? \"ClassDeclaration\" : \"ClassExpression\",\n    );\n  }\n\n  isClassProperty(): boolean {\n    return this.match(tt.eq) || this.match(tt.semi) || this.match(tt.braceR);\n  }\n\n  isClassMethod(): boolean {\n    return this.match(tt.parenL);\n  }\n\n  isNonstaticConstructor(method: N.ClassMethod | N.ClassProperty): boolean {\n    return (\n      !method.computed &&\n      !method.static &&\n      (method.key.name === \"constructor\" || // Identifier\n        method.key.value === \"constructor\") // String literal\n    );\n  }\n\n  parseClassBody(\n    constructorAllowsSuper: boolean,\n    oldStrict?: boolean,\n  ): N.ClassBody {\n    this.classScope.enter();\n\n    const state = { hadConstructor: false };\n    let decorators: N.Decorator[] = [];\n    const classBody: N.ClassBody = this.startNode();\n    classBody.body = [];\n\n    this.expect(tt.braceL);\n\n    // For the smartPipelines plugin: Disable topic references from outer\n    // contexts within the class body. They are permitted in test expressions,\n    // outside of the class body.\n    this.withTopicForbiddingContext(() => {\n      while (!this.match(tt.braceR)) {\n        if (this.eat(tt.semi)) {\n          if (decorators.length > 0) {\n            throw this.raise(this.state.lastTokEnd, Errors.DecoratorSemicolon);\n          }\n          continue;\n        }\n\n        if (this.match(tt.at)) {\n          decorators.push(this.parseDecorator());\n          continue;\n        }\n\n        const member = this.startNode();\n\n        // steal the decorators if there are any\n        if (decorators.length) {\n          member.decorators = decorators;\n          this.resetStartLocationFromNode(member, decorators[0]);\n          decorators = [];\n        }\n\n        this.parseClassMember(classBody, member, state, constructorAllowsSuper);\n\n        if (\n          member.kind === \"constructor\" &&\n          member.decorators &&\n          member.decorators.length > 0\n        ) {\n          this.raise(member.start, Errors.DecoratorConstructor);\n        }\n      }\n    });\n\n    if (!oldStrict) {\n      this.state.strict = false;\n    }\n\n    this.next();\n\n    if (decorators.length) {\n      throw this.raise(this.state.start, Errors.TrailingDecorator);\n    }\n\n    this.classScope.exit();\n\n    return this.finishNode(classBody, \"ClassBody\");\n  }\n\n  // returns true if the current identifier is a method/field name,\n  // false if it is a modifier\n  parseClassMemberFromModifier(\n    classBody: N.ClassBody,\n    member: N.ClassMember,\n  ): boolean {\n    const containsEsc = this.state.containsEsc;\n    const key = this.parseIdentifier(true); // eats the modifier\n\n    if (this.isClassMethod()) {\n      const method: N.ClassMethod = (member: any);\n\n      // a method named like the modifier\n      method.kind = \"method\";\n      method.computed = false;\n      method.key = key;\n      method.static = false;\n      this.pushClassMethod(\n        classBody,\n        method,\n        false,\n        false,\n        /* isConstructor */ false,\n        false,\n      );\n      return true;\n    } else if (this.isClassProperty()) {\n      const prop: N.ClassProperty = (member: any);\n\n      // a property named like the modifier\n      prop.computed = false;\n      prop.key = key;\n      prop.static = false;\n      classBody.body.push(this.parseClassProperty(prop));\n      return true;\n    } else if (containsEsc) {\n      throw this.unexpected();\n    }\n\n    return false;\n  }\n\n  parseClassMember(\n    classBody: N.ClassBody,\n    member: N.ClassMember,\n    state: { hadConstructor: boolean },\n    constructorAllowsSuper: boolean,\n  ): void {\n    const isStatic = this.isContextual(\"static\");\n\n    if (isStatic && this.parseClassMemberFromModifier(classBody, member)) {\n      // a class element named 'static'\n      return;\n    }\n\n    this.parseClassMemberWithIsStatic(\n      classBody,\n      member,\n      state,\n      isStatic,\n      constructorAllowsSuper,\n    );\n  }\n\n  parseClassMemberWithIsStatic(\n    classBody: N.ClassBody,\n    member: N.ClassMember,\n    state: { hadConstructor: boolean },\n    isStatic: boolean,\n    constructorAllowsSuper: boolean,\n  ) {\n    const publicMethod: $FlowSubtype<N.ClassMethod> = member;\n    const privateMethod: $FlowSubtype<N.ClassPrivateMethod> = member;\n    const publicProp: $FlowSubtype<N.ClassMethod> = member;\n    const privateProp: $FlowSubtype<N.ClassPrivateMethod> = member;\n\n    const method: typeof publicMethod | typeof privateMethod = publicMethod;\n    const publicMember: typeof publicMethod | typeof publicProp = publicMethod;\n\n    member.static = isStatic;\n\n    if (this.eat(tt.star)) {\n      // a generator\n      method.kind = \"method\";\n      this.parseClassPropertyName(method);\n\n      if (method.key.type === \"PrivateName\") {\n        // Private generator method\n        this.pushClassPrivateMethod(classBody, privateMethod, true, false);\n        return;\n      }\n\n      if (this.isNonstaticConstructor(publicMethod)) {\n        this.raise(publicMethod.key.start, Errors.ConstructorIsGenerator);\n      }\n\n      this.pushClassMethod(\n        classBody,\n        publicMethod,\n        true,\n        false,\n        /* isConstructor */ false,\n        false,\n      );\n\n      return;\n    }\n\n    const containsEsc = this.state.containsEsc;\n    const key = this.parseClassPropertyName(member);\n    const isPrivate = key.type === \"PrivateName\";\n    // Check the key is not a computed expression or string literal.\n    const isSimple = key.type === \"Identifier\";\n    const maybeQuestionTokenStart = this.state.start;\n\n    this.parsePostMemberNameModifiers(publicMember);\n\n    if (this.isClassMethod()) {\n      method.kind = \"method\";\n\n      if (isPrivate) {\n        this.pushClassPrivateMethod(classBody, privateMethod, false, false);\n        return;\n      }\n\n      // a normal method\n      const isConstructor = this.isNonstaticConstructor(publicMethod);\n      let allowsDirectSuper = false;\n      if (isConstructor) {\n        publicMethod.kind = \"constructor\";\n\n        // TypeScript allows multiple overloaded constructor declarations.\n        if (state.hadConstructor && !this.hasPlugin(\"typescript\")) {\n          this.raise(key.start, Errors.DuplicateConstructor);\n        }\n        state.hadConstructor = true;\n        allowsDirectSuper = constructorAllowsSuper;\n      }\n\n      this.pushClassMethod(\n        classBody,\n        publicMethod,\n        false,\n        false,\n        isConstructor,\n        allowsDirectSuper,\n      );\n    } else if (this.isClassProperty()) {\n      if (isPrivate) {\n        this.pushClassPrivateProperty(classBody, privateProp);\n      } else {\n        this.pushClassProperty(classBody, publicProp);\n      }\n    } else if (\n      isSimple &&\n      key.name === \"async\" &&\n      !containsEsc &&\n      !this.isLineTerminator()\n    ) {\n      // an async method\n      const isGenerator = this.eat(tt.star);\n\n      if (publicMember.optional) {\n        this.unexpected(maybeQuestionTokenStart);\n      }\n\n      method.kind = \"method\";\n      // The so-called parsed name would have been \"async\": get the real name.\n      this.parseClassPropertyName(method);\n      this.parsePostMemberNameModifiers(publicMember);\n\n      if (method.key.type === \"PrivateName\") {\n        // private async method\n        this.pushClassPrivateMethod(\n          classBody,\n          privateMethod,\n          isGenerator,\n          true,\n        );\n      } else {\n        if (this.isNonstaticConstructor(publicMethod)) {\n          this.raise(publicMethod.key.start, Errors.ConstructorIsAsync);\n        }\n\n        this.pushClassMethod(\n          classBody,\n          publicMethod,\n          isGenerator,\n          true,\n          /* isConstructor */ false,\n          false,\n        );\n      }\n    } else if (\n      isSimple &&\n      (key.name === \"get\" || key.name === \"set\") &&\n      !containsEsc &&\n      !(this.match(tt.star) && this.isLineTerminator())\n    ) {\n      // `get\\n*` is an uninitialized property named 'get' followed by a generator.\n      // a getter or setter\n      method.kind = key.name;\n      // The so-called parsed name would have been \"get/set\": get the real name.\n      this.parseClassPropertyName(publicMethod);\n\n      if (method.key.type === \"PrivateName\") {\n        // private getter/setter\n        this.pushClassPrivateMethod(classBody, privateMethod, false, false);\n      } else {\n        if (this.isNonstaticConstructor(publicMethod)) {\n          this.raise(publicMethod.key.start, Errors.ConstructorIsAccessor);\n        }\n        this.pushClassMethod(\n          classBody,\n          publicMethod,\n          false,\n          false,\n          /* isConstructor */ false,\n          false,\n        );\n      }\n\n      this.checkGetterSetterParams(publicMethod);\n    } else if (this.isLineTerminator()) {\n      // an uninitialized class property (due to ASI, since we don't otherwise recognize the next token)\n      if (isPrivate) {\n        this.pushClassPrivateProperty(classBody, privateProp);\n      } else {\n        this.pushClassProperty(classBody, publicProp);\n      }\n    } else {\n      this.unexpected();\n    }\n  }\n\n  parseClassPropertyName(member: N.ClassMember): N.Expression | N.Identifier {\n    const key = this.parsePropertyName(member, /* isPrivateNameAllowed */ true);\n\n    if (\n      !member.computed &&\n      member.static &&\n      ((key: $FlowSubtype<N.Identifier>).name === \"prototype\" ||\n        (key: $FlowSubtype<N.StringLiteral>).value === \"prototype\")\n    ) {\n      this.raise(key.start, Errors.StaticPrototype);\n    }\n\n    if (key.type === \"PrivateName\" && key.id.name === \"constructor\") {\n      this.raise(key.start, Errors.ConstructorClassPrivateField);\n    }\n\n    return key;\n  }\n\n  pushClassProperty(classBody: N.ClassBody, prop: N.ClassProperty) {\n    if (\n      !prop.computed &&\n      (prop.key.name === \"constructor\" || prop.key.value === \"constructor\")\n    ) {\n      // Non-computed field, which is either an identifier named \"constructor\"\n      // or a string literal named \"constructor\"\n      this.raise(prop.key.start, Errors.ConstructorClassField);\n    }\n\n    classBody.body.push(this.parseClassProperty(prop));\n  }\n\n  pushClassPrivateProperty(\n    classBody: N.ClassBody,\n    prop: N.ClassPrivateProperty,\n  ) {\n    this.expectPlugin(\"classPrivateProperties\", prop.key.start);\n\n    const node = this.parseClassPrivateProperty(prop);\n    classBody.body.push(node);\n\n    this.classScope.declarePrivateName(\n      node.key.id.name,\n      CLASS_ELEMENT_OTHER,\n      node.key.start,\n    );\n  }\n\n  pushClassMethod(\n    classBody: N.ClassBody,\n    method: N.ClassMethod,\n    isGenerator: boolean,\n    isAsync: boolean,\n    isConstructor: boolean,\n    allowsDirectSuper: boolean,\n  ): void {\n    classBody.body.push(\n      this.parseMethod(\n        method,\n        isGenerator,\n        isAsync,\n        isConstructor,\n        allowsDirectSuper,\n        \"ClassMethod\",\n        true,\n      ),\n    );\n  }\n\n  pushClassPrivateMethod(\n    classBody: N.ClassBody,\n    method: N.ClassPrivateMethod,\n    isGenerator: boolean,\n    isAsync: boolean,\n  ): void {\n    this.expectPlugin(\"classPrivateMethods\", method.key.start);\n\n    const node = this.parseMethod(\n      method,\n      isGenerator,\n      isAsync,\n      /* isConstructor */ false,\n      false,\n      \"ClassPrivateMethod\",\n      true,\n    );\n    classBody.body.push(node);\n\n    const kind =\n      node.kind === \"get\"\n        ? node.static\n          ? CLASS_ELEMENT_STATIC_GETTER\n          : CLASS_ELEMENT_INSTANCE_GETTER\n        : node.kind === \"set\"\n        ? node.static\n          ? CLASS_ELEMENT_STATIC_SETTER\n          : CLASS_ELEMENT_INSTANCE_SETTER\n        : CLASS_ELEMENT_OTHER;\n    this.classScope.declarePrivateName(node.key.id.name, kind, node.key.start);\n  }\n\n  // Overridden in typescript.js\n  parsePostMemberNameModifiers(\n    // eslint-disable-next-line no-unused-vars\n    methodOrProp: N.ClassMethod | N.ClassProperty,\n  ): void {}\n\n  // Overridden in typescript.js\n  parseAccessModifier(): ?N.Accessibility {\n    return undefined;\n  }\n\n  parseClassPrivateProperty(\n    node: N.ClassPrivateProperty,\n  ): N.ClassPrivateProperty {\n    this.scope.enter(SCOPE_CLASS | SCOPE_SUPER);\n    // [In] production parameter is tracked in parseMaybeAssign\n    this.prodParam.enter(PARAM);\n\n    node.value = this.eat(tt.eq) ? this.parseMaybeAssign() : null;\n    this.semicolon();\n    this.prodParam.exit();\n\n    this.scope.exit();\n\n    return this.finishNode(node, \"ClassPrivateProperty\");\n  }\n\n  parseClassProperty(node: N.ClassProperty): N.ClassProperty {\n    if (!node.typeAnnotation) {\n      this.expectPlugin(\"classProperties\");\n    }\n\n    this.scope.enter(SCOPE_CLASS | SCOPE_SUPER);\n    // [In] production parameter is tracked in parseMaybeAssign\n    this.prodParam.enter(PARAM);\n\n    if (this.match(tt.eq)) {\n      this.expectPlugin(\"classProperties\");\n      this.next();\n      node.value = this.parseMaybeAssign();\n    } else {\n      node.value = null;\n    }\n    this.semicolon();\n\n    this.prodParam.exit();\n    this.scope.exit();\n\n    return this.finishNode(node, \"ClassProperty\");\n  }\n\n  parseClassId(\n    node: N.Class,\n    isStatement: boolean,\n    optionalId: ?boolean,\n    bindingType: BindingTypes = BIND_CLASS,\n  ): void {\n    if (this.match(tt.name)) {\n      node.id = this.parseIdentifier();\n      if (isStatement) {\n        this.checkLVal(node.id, bindingType, undefined, \"class name\");\n      }\n    } else {\n      if (optionalId || !isStatement) {\n        node.id = null;\n      } else {\n        this.unexpected(null, Errors.MissingClassName);\n      }\n    }\n  }\n\n  parseClassSuper(node: N.Class): void {\n    node.superClass = this.eat(tt._extends) ? this.parseExprSubscripts() : null;\n  }\n\n  // Parses module export declaration.\n\n  parseExport(node: N.Node): N.AnyExport {\n    const hasDefault = this.maybeParseExportDefaultSpecifier(node);\n    const parseAfterDefault = !hasDefault || this.eat(tt.comma);\n    const hasStar = parseAfterDefault && this.eatExportStar(node);\n    const hasNamespace =\n      hasStar && this.maybeParseExportNamespaceSpecifier(node);\n    const parseAfterNamespace =\n      parseAfterDefault && (!hasNamespace || this.eat(tt.comma));\n    const isFromRequired = hasDefault || hasStar;\n\n    if (hasStar && !hasNamespace) {\n      if (hasDefault) this.unexpected();\n      this.parseExportFrom(node, true);\n\n      return this.finishNode(node, \"ExportAllDeclaration\");\n    }\n\n    const hasSpecifiers = this.maybeParseExportNamedSpecifiers(node);\n\n    if (\n      (hasDefault && parseAfterDefault && !hasStar && !hasSpecifiers) ||\n      (hasNamespace && parseAfterNamespace && !hasSpecifiers)\n    ) {\n      throw this.unexpected(null, tt.braceL);\n    }\n\n    let hasDeclaration;\n    if (isFromRequired || hasSpecifiers) {\n      hasDeclaration = false;\n      this.parseExportFrom(node, isFromRequired);\n    } else {\n      hasDeclaration = this.maybeParseExportDeclaration(node);\n    }\n\n    if (isFromRequired || hasSpecifiers || hasDeclaration) {\n      this.checkExport(node, true, false, !!node.source);\n      return this.finishNode(node, \"ExportNamedDeclaration\");\n    }\n\n    if (this.eat(tt._default)) {\n      // export default ...\n      node.declaration = this.parseExportDefaultExpression();\n      this.checkExport(node, true, true);\n\n      return this.finishNode(node, \"ExportDefaultDeclaration\");\n    }\n\n    throw this.unexpected(null, tt.braceL);\n  }\n\n  // eslint-disable-next-line no-unused-vars\n  eatExportStar(node: N.Node): boolean {\n    return this.eat(tt.star);\n  }\n\n  maybeParseExportDefaultSpecifier(node: N.Node): boolean {\n    if (this.isExportDefaultSpecifier()) {\n      // export defaultObj ...\n      this.expectPlugin(\"exportDefaultFrom\");\n      const specifier = this.startNode();\n      specifier.exported = this.parseIdentifier(true);\n      node.specifiers = [this.finishNode(specifier, \"ExportDefaultSpecifier\")];\n      return true;\n    }\n    return false;\n  }\n\n  maybeParseExportNamespaceSpecifier(node: N.Node): boolean {\n    if (this.isContextual(\"as\")) {\n      if (!node.specifiers) node.specifiers = [];\n\n      const specifier = this.startNodeAt(\n        this.state.lastTokStart,\n        this.state.lastTokStartLoc,\n      );\n\n      this.next();\n\n      specifier.exported = this.parseIdentifier(true);\n      node.specifiers.push(\n        this.finishNode(specifier, \"ExportNamespaceSpecifier\"),\n      );\n      return true;\n    }\n    return false;\n  }\n\n  maybeParseExportNamedSpecifiers(node: N.Node): boolean {\n    if (this.match(tt.braceL)) {\n      if (!node.specifiers) node.specifiers = [];\n      node.specifiers.push(...this.parseExportSpecifiers());\n\n      node.source = null;\n      node.declaration = null;\n\n      return true;\n    }\n    return false;\n  }\n\n  maybeParseExportDeclaration(node: N.Node): boolean {\n    if (this.shouldParseExportDeclaration()) {\n      if (this.isContextual(\"async\")) {\n        const next = this.nextTokenStart();\n\n        // export async;\n        if (!this.isUnparsedContextual(next, \"function\")) {\n          this.unexpected(next, tt._function);\n        }\n      }\n\n      node.specifiers = [];\n      node.source = null;\n      node.declaration = this.parseExportDeclaration(node);\n\n      return true;\n    }\n    return false;\n  }\n\n  isAsyncFunction(): boolean {\n    if (!this.isContextual(\"async\")) return false;\n    const next = this.nextTokenStart();\n    return (\n      !lineBreak.test(this.input.slice(this.state.pos, next)) &&\n      this.isUnparsedContextual(next, \"function\")\n    );\n  }\n\n  parseExportDefaultExpression(): N.Expression | N.Declaration {\n    const expr = this.startNode();\n\n    const isAsync = this.isAsyncFunction();\n\n    if (this.match(tt._function) || isAsync) {\n      this.next();\n      if (isAsync) {\n        this.next();\n      }\n\n      return this.parseFunction(\n        expr,\n        FUNC_STATEMENT | FUNC_NULLABLE_ID,\n        isAsync,\n      );\n    } else if (this.match(tt._class)) {\n      return this.parseClass(expr, true, true);\n    } else if (this.match(tt.at)) {\n      if (\n        this.hasPlugin(\"decorators\") &&\n        this.getPluginOption(\"decorators\", \"decoratorsBeforeExport\")\n      ) {\n        this.raise(this.state.start, Errors.DecoratorBeforeExport);\n      }\n      this.parseDecorators(false);\n      return this.parseClass(expr, true, true);\n    } else if (this.match(tt._const) || this.match(tt._var) || this.isLet()) {\n      throw this.raise(this.state.start, Errors.UnsupportedDefaultExport);\n    } else {\n      const res = this.parseMaybeAssign();\n      this.semicolon();\n      return res;\n    }\n  }\n\n  // eslint-disable-next-line no-unused-vars\n  parseExportDeclaration(node: N.ExportNamedDeclaration): ?N.Declaration {\n    return this.parseStatement(null);\n  }\n\n  isExportDefaultSpecifier(): boolean {\n    if (this.match(tt.name)) {\n      return this.state.value !== \"async\" && this.state.value !== \"let\";\n    }\n\n    if (!this.match(tt._default)) {\n      return false;\n    }\n\n    const next = this.nextTokenStart();\n    return (\n      this.input.charCodeAt(next) === charCodes.comma ||\n      this.isUnparsedContextual(next, \"from\")\n    );\n  }\n\n  parseExportFrom(node: N.ExportNamedDeclaration, expect?: boolean): void {\n    if (this.eatContextual(\"from\")) {\n      node.source = this.parseImportSource();\n      this.checkExport(node);\n    } else {\n      if (expect) {\n        this.unexpected();\n      } else {\n        node.source = null;\n      }\n    }\n\n    this.semicolon();\n  }\n\n  shouldParseExportDeclaration(): boolean {\n    if (this.match(tt.at)) {\n      this.expectOnePlugin([\"decorators\", \"decorators-legacy\"]);\n      if (this.hasPlugin(\"decorators\")) {\n        if (this.getPluginOption(\"decorators\", \"decoratorsBeforeExport\")) {\n          this.unexpected(this.state.start, Errors.DecoratorBeforeExport);\n        } else {\n          return true;\n        }\n      }\n    }\n\n    return (\n      this.state.type.keyword === \"var\" ||\n      this.state.type.keyword === \"const\" ||\n      this.state.type.keyword === \"function\" ||\n      this.state.type.keyword === \"class\" ||\n      this.isLet() ||\n      this.isAsyncFunction()\n    );\n  }\n\n  checkExport(\n    node: N.ExportNamedDeclaration,\n    checkNames?: boolean,\n    isDefault?: boolean,\n    isFrom?: boolean,\n  ): void {\n    if (checkNames) {\n      // Check for duplicate exports\n      if (isDefault) {\n        // Default exports\n        this.checkDuplicateExports(node, \"default\");\n      } else if (node.specifiers && node.specifiers.length) {\n        // Named exports\n        for (const specifier of node.specifiers) {\n          this.checkDuplicateExports(specifier, specifier.exported.name);\n          // $FlowIgnore\n          if (!isFrom && specifier.local) {\n            // check for keywords used as local names\n            this.checkReservedWord(\n              specifier.local.name,\n              specifier.local.start,\n              true,\n              false,\n            );\n            // check if export is defined\n            // $FlowIgnore\n            this.scope.checkLocalExport(specifier.local);\n          }\n        }\n      } else if (node.declaration) {\n        // Exported declarations\n        if (\n          node.declaration.type === \"FunctionDeclaration\" ||\n          node.declaration.type === \"ClassDeclaration\"\n        ) {\n          const id = node.declaration.id;\n          if (!id) throw new Error(\"Assertion failure\");\n\n          this.checkDuplicateExports(node, id.name);\n        } else if (node.declaration.type === \"VariableDeclaration\") {\n          for (const declaration of node.declaration.declarations) {\n            this.checkDeclaration(declaration.id);\n          }\n        }\n      }\n    }\n\n    const currentContextDecorators = this.state.decoratorStack[\n      this.state.decoratorStack.length - 1\n    ];\n    if (currentContextDecorators.length) {\n      const isClass =\n        node.declaration &&\n        (node.declaration.type === \"ClassDeclaration\" ||\n          node.declaration.type === \"ClassExpression\");\n      if (!node.declaration || !isClass) {\n        throw this.raise(node.start, Errors.UnsupportedDecoratorExport);\n      }\n      this.takeDecorators(node.declaration);\n    }\n  }\n\n  checkDeclaration(node: N.Pattern | N.ObjectProperty): void {\n    if (node.type === \"Identifier\") {\n      this.checkDuplicateExports(node, node.name);\n    } else if (node.type === \"ObjectPattern\") {\n      for (const prop of node.properties) {\n        this.checkDeclaration(prop);\n      }\n    } else if (node.type === \"ArrayPattern\") {\n      for (const elem of node.elements) {\n        if (elem) {\n          this.checkDeclaration(elem);\n        }\n      }\n    } else if (node.type === \"ObjectProperty\") {\n      this.checkDeclaration(node.value);\n    } else if (node.type === \"RestElement\") {\n      this.checkDeclaration(node.argument);\n    } else if (node.type === \"AssignmentPattern\") {\n      this.checkDeclaration(node.left);\n    }\n  }\n\n  checkDuplicateExports(\n    node:\n      | N.Identifier\n      | N.ExportNamedDeclaration\n      | N.ExportSpecifier\n      | N.ExportDefaultSpecifier,\n    name: string,\n  ): void {\n    if (this.state.exportedIdentifiers.indexOf(name) > -1) {\n      this.raise(\n        node.start,\n        name === \"default\"\n          ? Errors.DuplicateDefaultExport\n          : Errors.DuplicateExport,\n        name,\n      );\n    }\n    this.state.exportedIdentifiers.push(name);\n  }\n\n  // Parses a comma-separated list of module exports.\n\n  parseExportSpecifiers(): Array<N.ExportSpecifier> {\n    const nodes = [];\n    let first = true;\n\n    // export { x, y as z } [from '...']\n    this.expect(tt.braceL);\n\n    while (!this.eat(tt.braceR)) {\n      if (first) {\n        first = false;\n      } else {\n        this.expect(tt.comma);\n        if (this.eat(tt.braceR)) break;\n      }\n\n      const node = this.startNode();\n      node.local = this.parseIdentifier(true);\n      node.exported = this.eatContextual(\"as\")\n        ? this.parseIdentifier(true)\n        : node.local.__clone();\n      nodes.push(this.finishNode(node, \"ExportSpecifier\"));\n    }\n\n    return nodes;\n  }\n\n  // Parses import declaration.\n\n  parseImport(node: N.Node): N.AnyImport {\n    // import '...'\n    node.specifiers = [];\n    if (!this.match(tt.string)) {\n      const hasDefault = this.maybeParseDefaultImportSpecifier(node);\n      const parseNext = !hasDefault || this.eat(tt.comma);\n      const hasStar = parseNext && this.maybeParseStarImportSpecifier(node);\n      if (parseNext && !hasStar) this.parseNamedImportSpecifiers(node);\n      this.expectContextual(\"from\");\n    }\n    node.source = this.parseImportSource();\n    this.semicolon();\n    return this.finishNode(node, \"ImportDeclaration\");\n  }\n\n  parseImportSource(): N.StringLiteral {\n    if (!this.match(tt.string)) this.unexpected();\n    return this.parseExprAtom();\n  }\n\n  // eslint-disable-next-line no-unused-vars\n  shouldParseDefaultImport(node: N.ImportDeclaration): boolean {\n    return this.match(tt.name);\n  }\n\n  parseImportSpecifierLocal(\n    node: N.ImportDeclaration,\n    specifier: N.Node,\n    type: string,\n    contextDescription: string,\n  ): void {\n    specifier.local = this.parseIdentifier();\n    this.checkLVal(\n      specifier.local,\n      BIND_LEXICAL,\n      undefined,\n      contextDescription,\n    );\n    node.specifiers.push(this.finishNode(specifier, type));\n  }\n\n  maybeParseDefaultImportSpecifier(node: N.ImportDeclaration): boolean {\n    if (this.shouldParseDefaultImport(node)) {\n      // import defaultObj, { x, y as z } from '...'\n      this.parseImportSpecifierLocal(\n        node,\n        this.startNode(),\n        \"ImportDefaultSpecifier\",\n        \"default import specifier\",\n      );\n      return true;\n    }\n    return false;\n  }\n\n  maybeParseStarImportSpecifier(node: N.ImportDeclaration): boolean {\n    if (this.match(tt.star)) {\n      const specifier = this.startNode();\n      this.next();\n      this.expectContextual(\"as\");\n\n      this.parseImportSpecifierLocal(\n        node,\n        specifier,\n        \"ImportNamespaceSpecifier\",\n        \"import namespace specifier\",\n      );\n      return true;\n    }\n    return false;\n  }\n\n  parseNamedImportSpecifiers(node: N.ImportDeclaration) {\n    let first = true;\n    this.expect(tt.braceL);\n    while (!this.eat(tt.braceR)) {\n      if (first) {\n        first = false;\n      } else {\n        // Detect an attempt to deep destructure\n        if (this.eat(tt.colon)) {\n          throw this.raise(this.state.start, Errors.DestructureNamedImport);\n        }\n\n        this.expect(tt.comma);\n        if (this.eat(tt.braceR)) break;\n      }\n\n      this.parseImportSpecifier(node);\n    }\n  }\n\n  parseImportSpecifier(node: N.ImportDeclaration): void {\n    const specifier = this.startNode();\n    specifier.imported = this.parseIdentifier(true);\n    if (this.eatContextual(\"as\")) {\n      specifier.local = this.parseIdentifier();\n    } else {\n      this.checkReservedWord(\n        specifier.imported.name,\n        specifier.start,\n        true,\n        true,\n      );\n      specifier.local = specifier.imported.__clone();\n    }\n    this.checkLVal(\n      specifier.local,\n      BIND_LEXICAL,\n      undefined,\n      \"import specifier\",\n    );\n    node.specifiers.push(this.finishNode(specifier, \"ImportSpecifier\"));\n  }\n}\n","// @flow\n\nimport {\n  CLASS_ELEMENT_KIND_ACCESSOR,\n  CLASS_ELEMENT_FLAG_STATIC,\n  type ClassElementTypes,\n} from \"./scopeflags\";\nimport { Errors } from \"../parser/location\";\n\nexport class ClassScope {\n  // A list of private named declared in the current class\n  privateNames: Set<string> = new Set();\n\n  // A list of private getters of setters without their counterpart\n  loneAccessors: Map<string, ClassElementTypes> = new Map();\n\n  // A list of private names used before being defined, mapping to\n  // their position.\n  undefinedPrivateNames: Map<string, number> = new Map();\n}\n\ntype raiseFunction = (number, string, ...any) => void;\n\nexport default class ClassScopeHandler {\n  stack: Array<ClassScope> = [];\n  raise: raiseFunction;\n  undefinedPrivateNames: Map<string, number> = new Map();\n\n  constructor(raise: raiseFunction) {\n    this.raise = raise;\n  }\n\n  current(): ClassScope {\n    return this.stack[this.stack.length - 1];\n  }\n\n  enter() {\n    this.stack.push(new ClassScope());\n  }\n\n  exit() {\n    const oldClassScope = this.stack.pop();\n\n    // Migrate the usage of not yet defined private names to the outer\n    // class scope, or raise an error if we reached the top-level scope.\n\n    const current = this.current();\n\n    // Array.from is needed because this is compiled to an array-like for loop\n    for (const [name, pos] of Array.from(oldClassScope.undefinedPrivateNames)) {\n      if (current) {\n        if (!current.undefinedPrivateNames.has(name)) {\n          current.undefinedPrivateNames.set(name, pos);\n        }\n      } else {\n        this.raise(pos, Errors.InvalidPrivateFieldResolution, name);\n      }\n    }\n  }\n\n  declarePrivateName(\n    name: string,\n    elementType: ClassElementTypes,\n    pos: number,\n  ) {\n    const classScope = this.current();\n    let redefined = classScope.privateNames.has(name);\n\n    if (elementType & CLASS_ELEMENT_KIND_ACCESSOR) {\n      const accessor = redefined && classScope.loneAccessors.get(name);\n      if (accessor) {\n        const oldStatic = accessor & CLASS_ELEMENT_FLAG_STATIC;\n        const newStatic = elementType & CLASS_ELEMENT_FLAG_STATIC;\n\n        const oldKind = accessor & CLASS_ELEMENT_KIND_ACCESSOR;\n        const newKind = elementType & CLASS_ELEMENT_KIND_ACCESSOR;\n\n        // The private name can be duplicated only if it is used by\n        // two accessors with different kind (get and set), and if\n        // they have the same placement (static or not).\n        redefined = oldKind === newKind || oldStatic !== newStatic;\n\n        if (!redefined) classScope.loneAccessors.delete(name);\n      } else if (!redefined) {\n        classScope.loneAccessors.set(name, elementType);\n      }\n    }\n\n    if (redefined) {\n      this.raise(pos, Errors.PrivateNameRedeclaration, name);\n    }\n\n    classScope.privateNames.add(name);\n    classScope.undefinedPrivateNames.delete(name);\n  }\n\n  usePrivateName(name: string, pos: number) {\n    let classScope;\n    for (classScope of this.stack) {\n      if (classScope.privateNames.has(name)) return;\n    }\n\n    if (classScope) {\n      classScope.undefinedPrivateNames.set(name, pos);\n    } else {\n      // top-level\n      this.raise(pos, Errors.InvalidPrivateFieldResolution, name);\n    }\n  }\n}\n","// @flow\n\nimport type { Options } from \"../options\";\nimport type { File /*::, JSXOpeningElement */ } from \"../types\";\nimport type { PluginList } from \"../plugin-utils\";\nimport { getOptions } from \"../options\";\nimport StatementParser from \"./statement\";\nimport { SCOPE_PROGRAM } from \"../util/scopeflags\";\nimport ScopeHandler from \"../util/scope\";\nimport ClassScopeHandler from \"../util/class-scope\";\nimport ProductionParameterHandler, {\n  PARAM_AWAIT,\n  PARAM,\n} from \"../util/production-parameter\";\n\nexport type PluginsMap = Map<string, { [string]: any }>;\n\nexport default class Parser extends StatementParser {\n  // Forward-declaration so typescript plugin can override jsx plugin\n  /*::\n  +jsxParseOpeningElementAfterName: (\n    node: JSXOpeningElement,\n  ) => JSXOpeningElement;\n  */\n\n  constructor(options: ?Options, input: string) {\n    options = getOptions(options);\n    super(options, input);\n\n    const ScopeHandler = this.getScopeHandler();\n\n    this.options = options;\n    this.inModule = this.options.sourceType === \"module\";\n    this.scope = new ScopeHandler(this.raise.bind(this), this.inModule);\n    this.prodParam = new ProductionParameterHandler();\n    this.classScope = new ClassScopeHandler(this.raise.bind(this));\n    this.plugins = pluginsMap(this.options.plugins);\n    this.filename = options.sourceFilename;\n  }\n\n  // This can be overwritten, for example, by the TypeScript plugin.\n  getScopeHandler(): Class<ScopeHandler<*>> {\n    return ScopeHandler;\n  }\n\n  parse(): File {\n    let paramFlags = PARAM;\n    if (this.hasPlugin(\"topLevelAwait\") && this.inModule) {\n      paramFlags |= PARAM_AWAIT;\n    }\n    this.scope.enter(SCOPE_PROGRAM);\n    this.prodParam.enter(paramFlags);\n    const file = this.startNode();\n    const program = this.startNode();\n    this.nextToken();\n    file.errors = null;\n    this.parseTopLevel(file, program);\n    file.errors = this.state.errors;\n    return file;\n  }\n}\n\nfunction pluginsMap(plugins: PluginList): PluginsMap {\n  const pluginMap: PluginsMap = new Map();\n  for (const plugin of plugins) {\n    const [name, options] = Array.isArray(plugin) ? plugin : [plugin, {}];\n    if (!pluginMap.has(name)) pluginMap.set(name, options || {});\n  }\n  return pluginMap;\n}\n","// @flow\n\nimport { type Options } from \"./options\";\nimport {\n  hasPlugin,\n  validatePlugins,\n  mixinPluginNames,\n  mixinPlugins,\n  type PluginList,\n} from \"./plugin-utils\";\nimport Parser from \"./parser\";\n\nimport { types as tokTypes } from \"./tokenizer/types\";\nimport \"./tokenizer/context\";\n\nimport type { Expression, File } from \"./types\";\n\nexport function parse(input: string, options?: Options): File {\n  if (options && options.sourceType === \"unambiguous\") {\n    options = {\n      ...options,\n    };\n    try {\n      options.sourceType = \"module\";\n      const parser = getParser(options, input);\n      const ast = parser.parse();\n\n      if (parser.sawUnambiguousESM) {\n        return ast;\n      }\n\n      if (parser.ambiguousScriptDifferentAst) {\n        // Top level await introduces code which can be both a valid script and\n        // a valid module, but which produces different ASTs:\n        //    await\n        //    0\n        // can be parsed either as an AwaitExpression, or as two ExpressionStatements.\n        try {\n          options.sourceType = \"script\";\n          return getParser(options, input).parse();\n        } catch {}\n      } else {\n        // This is both a valid module and a valid script, but\n        // we parse it as a script by default\n        ast.program.sourceType = \"script\";\n      }\n\n      return ast;\n    } catch (moduleError) {\n      try {\n        options.sourceType = \"script\";\n        return getParser(options, input).parse();\n      } catch {}\n\n      throw moduleError;\n    }\n  } else {\n    return getParser(options, input).parse();\n  }\n}\n\nexport function parseExpression(input: string, options?: Options): Expression {\n  const parser = getParser(options, input);\n  if (parser.options.strictMode) {\n    parser.state.strict = true;\n  }\n  return parser.getExpression();\n}\n\nexport { tokTypes };\n\nfunction getParser(options: ?Options, input: string): Parser {\n  let cls = Parser;\n  if (options && options.plugins) {\n    validatePlugins(options.plugins);\n    cls = getParserClass(options.plugins);\n  }\n\n  return new cls(options, input);\n}\n\nconst parserClassCache: { [key: string]: Class<Parser> } = {};\n\n/** Get a Parser class with plugins applied. */\nfunction getParserClass(pluginsFromOptions: PluginList): Class<Parser> {\n  const pluginList = mixinPluginNames.filter(name =>\n    hasPlugin(pluginsFromOptions, name),\n  );\n\n  const key = pluginList.join(\"/\");\n  let cls = parserClassCache[key];\n  if (!cls) {\n    cls = Parser;\n    for (const plugin of pluginList) {\n      cls = mixinPlugins[plugin](cls);\n    }\n    parserClassCache[key] = cls;\n  }\n  return cls;\n}\n"],"names":["beforeExpr","startsExpr","isLoop","isAssign","prefix","postfix","TokenType","constructor","label","conf","keyword","rightAssociative","binop","updateContext","keywords","Map","createKeyword","name","options","token","set","createBinop","types","num","bigint","regexp","string","eof","bracketL","bracketHashL","bracketBarL","bracketR","bracketBarR","braceL","braceBarL","braceHashL","braceR","braceBarR","parenL","parenR","comma","semi","colon","doubleColon","dot","question","questionDot","arrow","template","ellipsis","backQuote","dollarBraceL","at","hash","interpreterDirective","eq","assign","incDec","bang","tilde","pipeline","nullishCoalescing","logicalOR","logicalAND","bitwiseOR","bitwiseXOR","bitwiseAND","equality","relational","bitShift","plusMin","modulo","star","slash","exponent","_break","_case","_catch","_continue","_debugger","_default","_do","_else","_finally","_for","_function","_if","_return","_switch","_throw","_try","_var","_const","_while","_with","_new","_this","_super","_class","_extends","_export","_import","_null","_true","_false","_in","_instanceof","_typeof","_void","_delete","SCOPE_OTHER","SCOPE_PROGRAM","SCOPE_FUNCTION","SCOPE_ARROW","SCOPE_SIMPLE_CATCH","SCOPE_SUPER","SCOPE_DIRECT_SUPER","SCOPE_CLASS","SCOPE_TS_MODULE","SCOPE_VAR","BIND_KIND_VALUE","BIND_KIND_TYPE","BIND_SCOPE_VAR","BIND_SCOPE_LEXICAL","BIND_SCOPE_FUNCTION","BIND_SCOPE_OUTSIDE","BIND_FLAGS_NONE","BIND_FLAGS_CLASS","BIND_FLAGS_TS_ENUM","BIND_FLAGS_TS_CONST_ENUM","BIND_FLAGS_TS_EXPORT_ONLY","BIND_CLASS","BIND_LEXICAL","BIND_VAR","BIND_FUNCTION","BIND_TS_INTERFACE","BIND_TS_TYPE","BIND_TS_ENUM","BIND_TS_AMBIENT","BIND_NONE","BIND_OUTSIDE","BIND_TS_CONST_ENUM","BIND_TS_NAMESPACE","CLASS_ELEMENT_FLAG_STATIC","CLASS_ELEMENT_KIND_GETTER","CLASS_ELEMENT_KIND_SETTER","CLASS_ELEMENT_KIND_ACCESSOR","CLASS_ELEMENT_STATIC_GETTER","CLASS_ELEMENT_STATIC_SETTER","CLASS_ELEMENT_INSTANCE_GETTER","CLASS_ELEMENT_INSTANCE_SETTER","CLASS_ELEMENT_OTHER","lineBreak","lineBreakG","RegExp","source","isNewLine","code","skipWhiteSpace","isWhitespace","Position","line","col","column","SourceLocation","start","end","getLineInfo","input","offset","lineStart","match","lastIndex","exec","index","BaseParser","sawUnambiguousESM","ambiguousScriptDifferentAst","hasPlugin","plugins","has","getPluginOption","plugin","get","last","stack","length","CommentsParser","addComment","comment","filename","loc","state","trailingComments","push","leadingComments","adjustCommentsAfterTrailingComma","node","elements","takeAllComments","lastElement","i","j","commentPreviousNode","splice","newTrailingComments","leadingComment","undefined","processComment","type","body","commentStack","firstChild","lastChild","lastInStack","pop","properties","arguments","slice","innerComments","Errors","Object","freeze","ArgumentsDisallowedInInitializer","AsyncFunctionInSingleStatementContext","AwaitBindingIdentifier","AwaitExpressionFormalParameter","AwaitNotInAsyncFunction","BadGetterArity","BadSetterArity","BadSetterRestParameter","ConstructorClassField","ConstructorClassPrivateField","ConstructorIsAccessor","ConstructorIsAsync","ConstructorIsGenerator","DeclarationMissingInitializer","DecoratorBeforeExport","DecoratorConstructor","DecoratorExportClass","DecoratorSemicolon","DeletePrivateField","DestructureNamedImport","DuplicateConstructor","DuplicateDefaultExport","DuplicateExport","DuplicateProto","DuplicateRegExpFlags","ElementAfterRest","EscapedCharNotAnIdentifier","ForInOfLoopInitializer","GeneratorInSingleStatementContext","IllegalBreakContinue","IllegalLanguageModeDirective","IllegalReturn","ImportCallArgumentTrailingComma","ImportCallArity","ImportCallArityLtOne","ImportCallNotNewExpression","ImportCallSpreadArgument","ImportMetaOutsideModule","ImportOutsideModule","InvalidCodePoint","InvalidDigit","InvalidEscapeSequence","InvalidEscapeSequenceTemplate","InvalidEscapedReservedWord","InvalidIdentifier","InvalidLhs","InvalidLhsBinding","InvalidNumber","InvalidOrUnexpectedToken","InvalidParenthesizedAssignment","InvalidPrivateFieldResolution","InvalidPropertyBindingPattern","InvalidRestAssignmentPattern","LabelRedeclaration","LetInLexicalBinding","MalformedRegExpFlags","MissingClassName","MissingEqInAssignment","MissingUnicodeEscape","MixingCoalesceWithLogical","ModuleExportUndefined","MultipleDefaultsInSwitch","NewlineAfterThrow","NoCatchOrFinally","NumberIdentifier","NumericSeparatorInEscapeSequence","ObsoleteAwaitStar","OptionalChainingNoNew","OptionalChainingNoTemplate","ParamDupe","PatternHasAccessor","PatternHasMethod","PipelineBodyNoArrow","PipelineBodySequenceExpression","PipelineHeadSequenceExpression","PipelineTopicUnused","PrimaryTopicNotAllowed","PrimaryTopicRequiresSmartPipeline","PrivateNameRedeclaration","RecordExpressionBarIncorrectEndSyntaxType","RecordExpressionBarIncorrectStartSyntaxType","RecordExpressionHashIncorrectStartSyntaxType","RestTrailingComma","SloppyFunction","StaticPrototype","StrictDelete","StrictEvalArguments","StrictEvalArgumentsBinding","StrictFunction","StrictOctalLiteral","StrictWith","SuperNotAllowed","SuperPrivateField","TrailingDecorator","TupleExpressionBarIncorrectEndSyntaxType","TupleExpressionBarIncorrectStartSyntaxType","TupleExpressionHashIncorrectStartSyntaxType","UnexpectedArgumentPlaceholder","UnexpectedAwaitAfterPipelineBody","UnexpectedDigitAfterHash","UnexpectedImportExport","UnexpectedKeyword","UnexpectedLeadingDecorator","UnexpectedLexicalDeclaration","UnexpectedNewTarget","UnexpectedNumericSeparator","UnexpectedPrivateField","UnexpectedReservedWord","UnexpectedSuper","UnexpectedToken","UnexpectedTokenUnaryExponentiation","UnsupportedBind","UnsupportedDecoratorExport","UnsupportedDefaultExport","UnsupportedImport","UnsupportedMetaProperty","UnsupportedParameterDecorator","UnsupportedPropertyDecorator","UnsupportedSuper","UnterminatedComment","UnterminatedRegExp","UnterminatedString","UnterminatedTemplate","VarRedeclaration","YieldBindingIdentifier","YieldInParameter","ZeroDigitNumericSeparator","LocationParser","getLocationForPosition","pos","startLoc","lastTokStart","lastTokStartLoc","endLoc","lastTokEnd","lastTokEndLoc","raise","errorTemplate","params","raiseWithData","data","message","replace","_","_raise","errorContext","err","SyntaxError","errorRecovery","isLookahead","errors","isSimpleProperty","kind","method","superClass","estreeParseRegExpLiteral","pattern","flags","regex","e","estreeParseLiteral","estreeParseBigIntLiteral","value","bigInt","BigInt","String","parseLiteral","directiveToStmt","directive","directiveLiteral","stmt","startNodeAt","expression","raw","extra","finishNodeAt","initFunction","isAsync","checkDeclaration","checkGetterSetterParams","prop","paramCount","checkLVal","expr","bindingType","checkClashes","contextDescription","disallowLetBinding","forEach","checkDuplicatedProto","protoRef","refExpressionErrors","computed","shorthand","key","used","doubleProto","isValidDirective","parenthesized","stmtToDirective","parseBlockBody","allowDirectives","topLevel","directiveStatements","directives","map","d","concat","pushClassMethod","classBody","isGenerator","isConstructor","allowsDirectSuper","parseMethod","typeParameters","parseExprAtom","tt","startPos","parseFunctionBody","allowExpression","isMethod","allowDirectSuper","inClassScope","funcNode","startNode","finishNode","parseObjectMethod","isPattern","containsEsc","parseObjectProperty","toAssignable","toAssignableObjectExpressionProp","isLast","finishCallExpression","optional","callee","toReferencedListDeep","exprList","isParenthesizedExpr","parseExport","exported","specifiers","TokContext","isExpr","preserveSpace","override","braceStatement","braceExpression","templateQuasi","parenStatement","parenExpression","p","readTmplToken","functionExpression","functionStatement","context","exprAllowed","out","curContext","prevType","allowed","prodParam","hasYield","isIterator","braceIsBlock","statementParens","test","b_stat","nonASCIIidentifierStartChars","nonASCIIidentifierChars","nonASCIIidentifierStart","nonASCIIidentifier","astralIdentifierStartCodes","astralIdentifierCodes","isInAstralSet","isIdentifierStart","fromCharCode","isIdentifierChar","reservedWords","strict","strictBind","Set","reservedWordsStrictSet","reservedWordsStrictBindSet","isReservedWord","word","inModule","isStrictReservedWord","isStrictBindOnlyReservedWord","isStrictBindReservedWord","isKeyword","keywordRelationalOperator","isIteratorStart","current","next","reservedTypes","FlowErrors","AmbiguousConditionalArrow","AmbiguousDeclareModuleKind","AssignReservedType","DeclareClassElement","DeclareClassFieldInitializer","DuplicateDeclareModuleExports","EnumBooleanMemberNotInitialized","EnumDuplicateMemberName","EnumInconsistentMemberValues","EnumInvalidExplicitType","EnumInvalidExplicitTypeUnknownSupplied","EnumInvalidMemberInitializerPrimaryType","EnumInvalidMemberInitializerSymbolType","EnumInvalidMemberInitializerUnknownType","EnumInvalidMemberName","EnumNumberMemberNotInitialized","EnumStringMemberInconsistentlyInitailized","ImportTypeShorthandOnlyInPureImport","InexactInsideExact","InexactInsideNonObject","InexactVariance","InvalidNonTypeImportInDeclareModule","MissingTypeParamDefault","NestedDeclareModule","NestedFlowComment","OptionalBindingPattern","SpreadVariance","TypeBeforeInitializer","TypeCastInPattern","UnexpectedExplicitInexactInObject","UnexpectedReservedType","UnexpectedReservedUnderscore","UnexpectedSpaceBetweenModuloChecks","UnexpectedSpreadType","UnexpectedSubtractionOperand","UnexpectedTokenAfterTypeParameter","UnsupportedDeclareExportKind","UnsupportedStatementInDeclareModule","UnterminatedFlowComment","isEsModuleType","bodyElement","declaration","hasTypeImportKind","importKind","isMaybeDefaultImport","exportSuggestions","const","let","interface","partition","list","list1","list2","FLOW_PRAGMA_REGEX","flowPragma","shouldParseTypes","shouldParseEnums","finishToken","val","matches","Error","flowParseTypeInitialiser","tok","oldInType","inType","expect","flowParseType","flowParsePredicate","moduloLoc","moduloPos","checksLoc","expectContextual","eat","parseExpression","flowParseTypeAndPredicateInitialiser","predicate","flowParseDeclareClass","flowParseInterfaceish","flowParseDeclareFunction","id","parseIdentifier","typeNode","typeContainer","isRelational","flowParseTypeParameterDeclaration","tmp","flowParseFunctionTypeParams","rest","returnType","typeAnnotation","resetEndLocation","semicolon","flowParseDeclare","insideModule","flowParseDeclareVariable","eatContextual","flowParseDeclareModuleExports","flowParseDeclareModule","isContextual","flowParseDeclareTypeAlias","flowParseDeclareOpaqueType","flowParseDeclareInterface","flowParseDeclareExportDeclaration","unexpected","flowParseTypeAnnotatableIdentifier","scope","declareName","enter","bodyNode","parseImport","exit","hasModuleExport","default","isLet","suggestion","exportKind","flowParseTypeAnnotation","flowParseTypeAlias","flowParseOpaqueType","isClass","flowParseRestrictedIdentifier","extends","implements","mixins","flowParseInterfaceExtends","flowParseObjectType","allowStatic","allowExact","allowSpread","allowProto","allowInexact","flowParseQualifiedTypeIdentifier","flowParseTypeParameterInstantiation","flowParseInterface","checkNotUnderscore","checkReservedType","liberal","right","declare","supertype","impltype","flowParseTypeParameter","requireDefault","nodeStart","variance","flowParseVariance","ident","bound","jsxTagStart","defaultRequired","typeParameter","expectRelational","oldNoAnonFunctionType","noAnonFunctionType","flowParseTypeParameterInstantiationCallOrNew","flowParseTypeOrImplicitInstantiation","flowParseInterfaceType","flowParseObjectPropertyKey","flowParseObjectTypeIndexer","isStatic","static","lookahead","flowParseObjectTypeInternalSlot","flowParseObjectTypeMethodish","flowParseFunctionTypeParam","flowParseObjectTypeCallProperty","valueNode","callProperties","indexers","internalSlots","endDelim","exact","inexact","protoStart","inexactStart","propOrInexact","flowParseObjectTypeProperty","flowObjectTypeSemicolon","isInexactToken","argument","proto","flowCheckGetterSetterParams","property","node2","qualification","flowParseGenericType","flowParseTypeofType","flowParsePrimaryType","flowParseTupleType","lh","reinterpretTypeAsFunctionTypeParam","flowIdentToTypeAnnotation","isGroupedType","createIdentifier","flowParsePostfixType","canInsertSemicolon","elementType","flowParsePrefixType","flowParseAnonFunctionWithoutParens","param","flowParseIntersectionType","flowParseUnionType","allowPrimitiveOverride","typeCastToParameter","allowExpressionBody","forwardNoArrowParamsConversionAt","parseFunctionBodyAndFinish","parseStatement","flowParseEnumDeclaration","parseExpressionStatement","shouldParseExportDeclaration","isExportDefaultSpecifier","parseExportDefaultExpression","parseConditional","noIn","refNeedsArrowPos","result","tryParse","error","failState","clone","originalNoArrowAt","noArrowAt","consequent","failed","tryParseConditionalConsequent","valid","invalid","getArrowLikeExpressions","alternate","parseMaybeAssign","noArrowParamsConversionAt","disallowInvalid","arrows","finishArrowValidation","every","isAssignable","toAssignableList","trailingComma","checkParams","parse","indexOf","parseParenItem","typeCastNode","assertModuleNodeAllowed","decl","parseExportDeclaration","declarationNode","parseExportSpecifiers","parseExportFrom","eatExportStar","maybeParseExportNamespaceSpecifier","hasNamespace","parseClassId","isStatement","optionalId","parseClassMember","member","constructorAllowsSuper","parseClassMemberFromModifier","getTokenFromCode","charCodeAt","finishOp","readWord","isBinding","element","operator","trailingCommaPos","toReferencedList","parseClassProperty","parseClassPrivateProperty","isClassMethod","isClassProperty","isNonstaticConstructor","pushClassPrivateMethod","parseClassSuper","superTypeParameters","implemented","parsePropertyName","isPrivateNameAllowed","parseObjPropValue","parseAssignableListItemTypes","parseMaybeDefault","left","shouldParseDefaultImport","parseImportSpecifierLocal","specifier","local","maybeParseDefaultImportSpecifier","parseImportSpecifier","firstIdentLoc","firstIdent","specifierTypeKind","isLookaheadContextual","as_ident","imported","__clone","nodeIsTypeImport","specifierIsTypeImport","checkReservedWord","parseFunctionParams","allowModifiers","parseVarId","parseAsyncArrowFromCallExpression","call","shouldParseAsyncArrow","afterLeftParse","jsx","tc","j_oTag","j_expr","arrowExpression","resetStartLocationFromNode","thrown","parseArrow","shouldParseArrow","setArrowFunctionParameters","allowDuplicates","isArrowFunction","parseParenAndDistinguishExpression","canBeArrow","parseSubscripts","base","noCalls","parseCallExpressionArguments","abort","parseAsyncArrowWithTypeParameters","aborted","parseSubscript","subscriptState","isLookaheadRelational","optionalChainMember","stop","typeArguments","parseNewArguments","targs","parseArrowExpression","readToken_mult_modulo","hasFlowComment","nextToken","readToken_pipe_amp","parseTopLevel","file","program","fileNode","skipBlockComment","skipFlowComment","hasFlowCommentCompletion","shiftToFirstNonWhiteSpace","includes","ch2","ch3","flowEnumErrorBooleanMemberNotInitialized","enumName","memberName","flowEnumErrorInvalidMemberName","toUpperCase","flowEnumErrorDuplicateMemberName","flowEnumErrorInconsistentMemberValues","flowEnumErrorInvalidExplicitType","suppliedType","flowEnumErrorInvalidMemberInitializer","explicitType","flowEnumErrorNumberMemberNotInitialized","flowEnumErrorStringMemberInconsistentlyInitailized","flowEnumMemberInit","endOfInit","literal","parseBooleanLiteral","flowEnumMemberRaw","init","flowEnumCheckExplicitTypeMismatch","expectedType","flowEnumMembers","seenNames","members","booleanMembers","numberMembers","stringMembers","defaultedMembers","memberNode","add","flowEnumStringMembers","initializedMembers","flowEnumParseExplicitType","flowEnumBody","nameLoc","empty","boolsLen","numsLen","strsLen","defaultedLen","entities","quot","amp","apos","lt","gt","nbsp","iexcl","cent","pound","curren","yen","brvbar","sect","uml","copy","ordf","laquo","not","shy","reg","macr","deg","plusmn","sup2","sup3","acute","micro","para","middot","cedil","sup1","ordm","raquo","frac14","frac12","frac34","iquest","Agrave","Aacute","Acirc","Atilde","Auml","Aring","AElig","Ccedil","Egrave","Eacute","Ecirc","Euml","Igrave","Iacute","Icirc","Iuml","ETH","Ntilde","Ograve","Oacute","Ocirc","Otilde","Ouml","times","Oslash","Ugrave","Uacute","Ucirc","Uuml","Yacute","THORN","szlig","agrave","aacute","acirc","atilde","auml","aring","aelig","ccedil","egrave","eacute","ecirc","euml","igrave","iacute","icirc","iuml","eth","ntilde","ograve","oacute","ocirc","otilde","ouml","divide","oslash","ugrave","uacute","ucirc","uuml","yacute","thorn","yuml","OElig","oelig","Scaron","scaron","Yuml","fnof","circ","Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega","alpha","beta","gamma","delta","epsilon","zeta","eta","theta","iota","kappa","lambda","mu","nu","xi","omicron","pi","rho","sigmaf","sigma","tau","upsilon","phi","chi","psi","omega","thetasym","upsih","piv","ensp","emsp","thinsp","zwnj","zwj","lrm","rlm","ndash","mdash","lsquo","rsquo","sbquo","ldquo","rdquo","bdquo","dagger","Dagger","bull","hellip","permil","prime","Prime","lsaquo","rsaquo","oline","frasl","euro","image","weierp","real","trade","alefsym","larr","uarr","rarr","darr","harr","crarr","lArr","uArr","rArr","dArr","hArr","forall","part","exist","nabla","isin","notin","ni","prod","sum","minus","lowast","radic","infin","ang","and","or","cap","cup","int","there4","sim","cong","asymp","ne","equiv","le","ge","sub","sup","nsub","sube","supe","oplus","otimes","perp","sdot","lceil","rceil","lfloor","rfloor","lang","rang","loz","spades","clubs","hearts","diams","HEX_NUMBER","DECIMAL_NUMBER","JsxErrors","AttributeIsEmpty","MissingClosingTagFragment","MissingClosingTagElement","UnsupportedJsxValue","UnterminatedJsxContent","UnwrappedAdjacentJSXElements","j_cTag","jsxName","jsxText","jsxTagEnd","isFragment","object","getQualifiedJSXName","namespace","jsxReadToken","chunkStart","ch","jsxReadEntity","jsxReadNewLine","normalizeCRLF","curLine","jsxReadString","quote","str","count","entity","substr","fromCodePoint","parseInt","XHTMLEntities","jsxReadWord","jsxParseIdentifier","jsxParseNamespacedName","jsxParseElementName","newNode","jsxParseAttributeValue","jsxParseExpressionContainer","jsxParseEmptyExpression","jsxParseSpreadChild","jsxParseAttribute","jsxParseOpeningElementAt","jsxParseOpeningElementAfterName","attributes","selfClosing","jsxParseClosingElementAt","jsxParseElementAt","children","openingElement","closingElement","contents","openingFragment","closingFragment","jsxParseElement","inPropertyName","Scope","var","lexical","functions","ScopeHandler","scopeStack","undefinedExports","undefinedPrivateNames","inFunction","currentVarScope","allowSuper","currentThisScope","inClass","inNonArrowFunction","treatFunctionsAsVar","treatFunctionsAsVarInScope","currentScope","createScope","checkRedeclarationInScope","maybeExportDefined","delete","isRedeclaredInScope","checkLocalExport","TypeScriptScope","enums","constEnums","classes","exportOnlyBindings","TypeScriptScopeHandler","isConst","wasConst","PARAM","PARAM_YIELD","PARAM_AWAIT","PARAM_RETURN","ProductionParameterHandler","stacks","currentFlags","hasAwait","hasReturn","functionFlags","nonNull","x","assert","TSErrors","ClassMethodHasDeclare","ClassMethodHasReadonly","DeclareClassFieldHasInitializer","DuplicateModifier","EmptyHeritageClauseType","IndexSignatureHasAbstract","IndexSignatureHasAccessibility","IndexSignatureHasStatic","OptionalTypeBeforeRequired","PatternIsOptional","PrivateElementHasAbstract","PrivateElementHasAccessibility","TemplateTypeHasSubstitution","TypeAnnotationAfterAssign","UnexpectedReadonly","UnexpectedTypeAnnotation","UnexpectedTypeCastInParameter","UnsupportedImportTypeArgument","UnsupportedParameterPropertyKind","UnsupportedSignatureParameterKind","keywordTypeFromName","getScopeHandler","tsIsIdentifier","tsNextTokenCanFollowModifier","hasPrecedingLineBreak","tsParseModifier","allowedModifiers","modifier","tsTryParse","bind","tsParseModifiers","modified","hasOwnProperty","tsIsListTerminator","tsParseList","parseElement","tsParseDelimitedList","tsParseDelimitedListWorker","expectSuccess","tsParseBracketedList","bracket","skipFirstToken","tsParseImportType","qualifier","tsParseEntityName","tsParseTypeArguments","allowReservedWords","startNodeAtNode","tsParseTypeReference","typeName","tsParseThisTypePredicate","lhs","parameterName","tsParseTypeAnnotation","tsParseThisTypeNode","tsParseTypeQuery","exprName","tsParseTypeParameter","parseIdentifierName","constraint","tsEatThenParseType","tsTryParseTypeParameters","tsParseTypeParameters","tsTryNextParseConstantContext","tsFillSignature","returnToken","signature","returnTokenRequired","parameters","tsParseBindingListForSignature","tsParseTypeOrTypePredicateAnnotation","parseBindingList","tsParseTypeMemberSemicolon","tsParseSignatureMember","tsIsUnambiguouslyIndexSignature","tsTryParseIndexSignature","tsLookAhead","tsTryParseTypeAnnotation","tsParsePropertyOrMethodSignature","readonly","nodeAny","tsParseTypeMember","idx","tsParseTypeLiteral","tsParseObjectTypeMembers","tsIsStartOfMappedType","tsParseMappedTypeParameter","tsExpectThenParseType","tsParseMappedType","tsTryParseType","tsParseTupleType","elementTypes","tsParseTupleElementType","seenOptionalElement","elementNode","restNode","tsParseType","lookaheadCharCode","raiseRestNotLast","optionalTypeNode","tsParseParenthesizedType","tsParseFunctionOrConstructorType","tsParseLiteralTypeNode","tsParseTemplateLiteralType","templateNode","parseTemplate","expressions","tsParseThisTypeOrThisTypePredicate","thisKeyword","tsParseNonArrayType","parseMaybeUnary","tsParseArrayTypeOrHigher","objectType","indexType","tsParseTypeOperator","tsParseTypeOperatorOrHigher","tsCheckTypeAnnotationForReadOnly","tsParseInferType","find","kw","tsParseUnionOrIntersectionType","parseConstituentType","tsParseIntersectionTypeOrHigher","tsParseUnionTypeOrHigher","tsIsStartOfFunctionType","tsIsUnambiguouslyStartOfFunctionType","tsSkipParameterStart","braceStackCounter","tsInType","t","asserts","tsParseTypePredicateAsserts","thisTypePredicate","typePredicateVariable","tsParseTypePredicatePrefix","tsTryParseTypeOrTypePredicateAnnotation","eatColon","tsParseNonConditionalType","checkType","extendsType","trueType","falseType","tsParseTypeAssertion","tsNextThenParseType","tsParseHeritageClause","descriptor","originalStart","delimitedList","tsParseExpressionWithTypeArguments","tsParseInterfaceDeclaration","tsParseTypeAliasDeclaration","tsInNoContext","cb","oldContext","tsDoThenParseType","tsParseEnumMember","initializer","tsParseEnumDeclaration","tsParseModuleBlock","parseBlockOrModuleBlockBody","tsParseModuleOrNamespaceDeclaration","nested","inner","tsParseAmbientExternalModuleDeclaration","global","tsParseImportEqualsDeclaration","isExport","moduleReference","tsParseModuleReference","tsIsExternalModuleReference","tsParseExternalModuleReference","f","res","tsTryParseAndCatch","tsTryParseDeclare","nany","isLineTerminator","starttype","parseFunctionStatement","parseClass","parseVarStatement","tsParseDeclaration","tsTryParseExportDeclaration","tsParseExpressionStatement","mod","tsCheckLineTerminatorAndMatch","cls","abstract","tokenType","tsTryParseGenericAsyncArrowFunction","oldMaybeInArrowParameters","maybeInArrowParameters","oldYieldPos","yieldPos","oldAwaitPos","awaitPos","tsIsDeclarationStart","parseAssignableListItem","decorators","accessibility","parseAccessModifier","elt","pp","parameter","bodilessType","registerFunctionStatementId","nonNullExpression","atPossibleAsyncArrow","asyncArrowFn","parseTaggedTemplateExpression","args","parseExprOp","leftStartPos","leftStartLoc","minPrec","checkKeywords","checkDuplicateExports","ahead","importNode","isAbstractClass","parseStatementContent","parseClassMemberWithIsStatic","parsePostMemberNameModifiers","methodOrProp","isDeclare","resetStartLocation","parseClassPropertyAnnotation","definite","equal","typeCast","ct","parseBindingAtom","parseMaybeDecoratorArguments","isInParens","canHaveLeadingDecorator","getGetterSetterExpectedParamCount","baseCount","firstParam","hasContextParam","placeholder","parsePlaceholder","expectedNode","assertNoSpace","finishPlaceholder","isFinished","verifyBreakContinue","parseBlock","parseFunctionId","takeDecorators","parseClassBody","expectPlugin","maybeParseExportDefaultSpecifier","checkExport","filter","hasStarImport","maybeParseStarImportSpecifier","parseNamedImportSpecifiers","parseImportSource","parseV8Intrinsic","v8IntrinsicStart","identifier","some","Array","isArray","option","PIPELINE_PROPOSALS","RECORD_AND_TUPLE_SYNTAX_TYPES","validatePlugins","decoratorsBeforeExport","join","mixinPlugins","estree","flow","typescript","v8intrinsic","placeholders","mixinPluginNames","keys","defaultOptions","sourceType","sourceFilename","startLine","allowAwaitOutsideFunction","allowReturnOutsideFunction","allowImportExportEverywhere","allowSuperOutsideMethod","allowUndeclaredExports","strictMode","ranges","tokens","createParenthesizedExpressions","getOptions","opts","State","potentialArrowAt","inParameters","maybeInAsyncArrowHead","inPipeline","topicContext","maxNumOfResolvableTopics","maxTopicIndex","soloAwait","inFSharpPipelineDirectBody","labels","decoratorStack","comments","octalPositions","exportedIdentifiers","tokensLength","curPosition","skipArrays","isDigit","VALID_REGEX_FLAGS","forbiddenNumericSeparatorSiblings","decBinOct","hex","allowedNumericSeparatorSiblings","bin","oct","dec","Token","Tokenizer","pushToken","checkKeywordEscapes","old","curr","nextTokenStart","thisTokEnd","skip","setStrict","lastIndexOf","skipSpace","codePointAt","pushComment","block","text","skipLineComment","startSkip","loop","readToken_numberSign","readToken_interpreter","nextPos","readToken_dot","readNumber","readToken_slash","readRegexp","width","readToken_caret","readToken_plus_min","readToken_lt_gt","size","readToken_eq_excl","readToken_question","next2","readRadixNumber","readString","escaped","charAt","content","mods","char","charCode","readInt","radix","len","forceLen","allowNumSeparator","forbiddenSiblings","allowedSiblings","total","Infinity","prev","Number","isNaN","isBigInt","startsWithDot","isFloat","isNonOctalDecimalInt","octal","underscorePos","parseFloat","readCodePoint","throwOnInvalid","codePos","readHexChar","readEscapedChar","containsInvalid","inTemplate","octalStr","n","readWord1","escStart","identifierCheck","esc","keywordTypes","parent","update","UtilParser","addExtra","op","afterNext","isUnparsedContextual","nameStart","nameEnd","messageOrType","missingPlugin","expectOnePlugin","names","checkYieldAwaitInDefaultParams","fn","oldState","abortSignal","checkExpressionErrors","andThrow","shorthandAssign","ExpressionErrors","Node","parser","range","NodeUtils","locationNode","unwrapParenthesizedExpression","LValParser","checkToRestConversion","arg","raiseTrailingCommaAfterRest","parseSpread","parseRestBinding","parseObj","close","closeCharCode","allowEmpty","elts","first","checkCommaAfterRest","parseDecorator","strictModeChanged","elem","ExpressionParser","getExpression","paramFlags","parseYield","ownExpressionErrors","parseMaybeConditional","parseExprOps","prec","logical","coalesce","checkPipelineAtInfixOperator","parseExprOpRightExpr","nextOp","withTopicPermittingContext","parseSmartPipelineBody","parseExprOpBaseRightExpr","withSoloAwaitPermittingContext","parseFSharpPipelineBody","isAwaitAllowed","parseAwait","parseExprSubscripts","maybeAsyncArrow","oldMaybeInAsyncArrowHead","parseNoCallExpr","parseMaybePrivateName","classScope","usePrivateName","tag","quasi","importArg","possibleAsyncArrow","dynamicImport","allowPlaceholder","nodeForExtra","innerParenStart","oldInFSharpPipelineDirectBody","parseExprListItem","parseImportMetaProperty","parseFunction","oldLabels","parseExprList","ret","parseFunctionExpression","parseDecorators","parseNew","primaryTopicReferenceIsAllowedInCurrentTopicContext","registerTopicReference","isPrivate","meta","parseMetaProperty","propertyName","innerStartPos","innerStartLoc","spreadStart","optionalCommaStart","spreadNodeStartPos","spreadNodeStartLoc","innerEndPos","innerEndLoc","arrowNode","parenStart","metaProp","parseTemplateElement","isTagged","cooked","tail","curElt","quasis","isRecord","propHash","create","parseObjectMember","isAsyncProp","isGetterOrSetterMethod","oldInPropertyName","generator","async","isExpression","oldInParameters","oldStrict","hasStrictModeDirective","nonSimple","isSimpleParamList","errorPos","nameHash","identifierName","reservedTest","delegate","childExpression","pipelineStyle","checkSmartPipelineBodyStyle","checkSmartPipelineBodyEarlyErrors","parseSmartPipelineBodyInStyle","topicReferenceWasUsedInCurrentTopicContext","isSimpleReference","callback","outerContextTopicState","withTopicForbiddingContext","outerContextSoloAwaitState","loopLabel","switchLabel","FUNC_NO_FLAGS","FUNC_STATEMENT","FUNC_HANGING_STATEMENT","FUNC_NULLABLE_ID","StatementParser","interpreter","parseInterpreterDirective","from","nextCh","parseBreakContinueStatement","parseDebuggerStatement","parseDoStatement","parseForStatement","parseIfStatement","parseReturnStatement","parseSwitchStatement","parseThrowStatement","parseTryStatement","parseWhileStatement","parseWithStatement","parseEmptyStatement","nextTokenCharCode","isAsyncFunction","maybeName","parseLabeledStatement","allowExport","currentContextDecorators","decorator","isBreak","lab","parseHeaderExpression","awaitAt","parseFor","parseVar","declarations","parseForIn","description","declarationPosition","discriminant","cases","cur","sawDefault","isCase","handler","clause","simple","finalizer","statementStart","createNewLexicalScope","afterBlockParse","parsedNonDirective","isForIn","await","isFor","isTypescript","statement","isHangingStatement","requireId","hadConstructor","publicMethod","privateMethod","publicProp","privateProp","publicMember","parseClassPropertyName","isSimple","maybeQuestionTokenStart","pushClassPrivateProperty","pushClassProperty","declarePrivateName","hasDefault","parseAfterDefault","hasStar","parseAfterNamespace","isFromRequired","hasSpecifiers","maybeParseExportNamedSpecifiers","hasDeclaration","maybeParseExportDeclaration","checkNames","isDefault","isFrom","nodes","parseNext","ClassScope","privateNames","loneAccessors","ClassScopeHandler","oldClassScope","redefined","accessor","oldStatic","newStatic","oldKind","newKind","Parser","pluginsMap","pluginMap","getParser","ast","moduleError","getParserClass","parserClassCache","pluginsFromOptions","pluginList"],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/jest-circus/node_modules/@babel/parser/package.json b/node_modules/jest-circus/node_modules/@babel/parser/package.json
deleted file mode 100644
index 77078d3..0000000
--- a/node_modules/jest-circus/node_modules/@babel/parser/package.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "name": "@babel/parser",
-  "version": "7.9.4",
-  "description": "A JavaScript parser",
-  "author": "Sebastian McKenzie <sebmck@gmail.com>",
-  "homepage": "https://babeljs.io/",
-  "license": "MIT",
-  "publishConfig": {
-    "access": "public"
-  },
-  "keywords": [
-    "babel",
-    "javascript",
-    "parser",
-    "tc39",
-    "ecmascript",
-    "@babel/parser"
-  ],
-  "repository": "https://github.com/babel/babel/tree/master/packages/babel-parser",
-  "main": "lib/index.js",
-  "types": "typings/babel-parser.d.ts",
-  "files": [
-    "bin",
-    "lib",
-    "typings"
-  ],
-  "engines": {
-    "node": ">=6.0.0"
-  },
-  "devDependencies": {
-    "@babel/code-frame": "^7.8.3",
-    "@babel/helper-fixtures": "^7.8.6",
-    "@babel/helper-validator-identifier": "^7.9.0",
-    "charcodes": "^0.2.0"
-  },
-  "bin": {
-    "parser": "./bin/babel-parser.js"
-  },
-  "gitHead": "d3cf5fb5f4b46a1f7e9e33f2d24a466e3ea1e50f"
-}
diff --git a/node_modules/jest-circus/node_modules/@babel/parser/typings/babel-parser.d.ts b/node_modules/jest-circus/node_modules/@babel/parser/typings/babel-parser.d.ts
deleted file mode 100644
index 4016108..0000000
--- a/node_modules/jest-circus/node_modules/@babel/parser/typings/babel-parser.d.ts
+++ /dev/null
@@ -1,146 +0,0 @@
-// Type definitions for @babel/parser
-// Project: https://github.com/babel/babel/tree/master/packages/babel-parser
-// Definitions by: Troy Gerwien <https://github.com/yortus>
-//                 Marvin Hagemeister <https://github.com/marvinhagemeister>
-//                 Avi Vahl <https://github.com/AviVahl>
-// TypeScript Version: 2.9
-
-/**
- * Parse the provided code as an entire ECMAScript program.
- */
-export function parse(input: string, options?: ParserOptions): import('@babel/types').File;
-
-/**
- * Parse the provided code as a single expression.
- */
-export function parseExpression(input: string, options?: ParserOptions): import('@babel/types').Expression;
-
-export interface ParserOptions {
-    /**
-     * By default, import and export declarations can only appear at a program's top level.
-     * Setting this option to true allows them anywhere where a statement is allowed.
-     */
-    allowImportExportEverywhere?: boolean;
-
-    /**
-     * By default, await use is not allowed outside of an async function.
-     * Set this to true to accept such code.
-     */
-    allowAwaitOutsideFunction?: boolean;
-
-    /**
-     * By default, a return statement at the top level raises an error.
-     * Set this to true to accept such code.
-     */
-    allowReturnOutsideFunction?: boolean;
-
-    allowSuperOutsideMethod?: boolean;
-
-    /**
-     * By default, exported identifiers must refer to a declared variable.
-     * Set this to true to allow export statements to reference undeclared variables.
-     */
-    allowUndeclaredExports?: boolean;
-
-    /**
-     * Indicate the mode the code should be parsed in.
-     * Can be one of "script", "module", or "unambiguous". Defaults to "script".
-     * "unambiguous" will make @babel/parser attempt to guess, based on the presence
-     * of ES6 import or export statements.
-     * Files with ES6 imports and exports are considered "module" and are otherwise "script".
-     */
-    sourceType?: 'script' | 'module' | 'unambiguous';
-
-    /**
-     * Correlate output AST nodes with their source filename.
-     * Useful when generating code and source maps from the ASTs of multiple input files.
-     */
-    sourceFilename?: string;
-
-    /**
-     * By default, the first line of code parsed is treated as line 1.
-     * You can provide a line number to alternatively start with.
-     * Useful for integration with other source tools.
-     */
-    startLine?: number;
-
-    /**
-     * Array containing the plugins that you want to enable.
-     */
-    plugins?: ParserPlugin[];
-
-    /**
-     * Should the parser work in strict mode.
-     * Defaults to true if sourceType === 'module'. Otherwise, false.
-     */
-    strictMode?: boolean;
-
-    /**
-     * Adds a ranges property to each node: [node.start, node.end]
-     */
-    ranges?: boolean;
-
-    /**
-     * Adds all parsed tokens to a tokens property on the File node.
-     */
-    tokens?: boolean;
-
-    /**
-     * By default, the parser adds information about parentheses by setting
-     * `extra.parenthesized` to `true` as needed.
-     * When this option is `true` the parser creates `ParenthesizedExpression`
-     * AST nodes instead of using the `extra` property.
-     */
-    createParenthesizedExpressions?: boolean;
-}
-
-export type ParserPlugin =
-    'asyncGenerators' |
-    'bigInt' |
-    'classPrivateMethods' |
-    'classPrivateProperties' |
-    'classProperties' |
-    'decorators' |
-    'decorators-legacy' |
-    'doExpressions' |
-    'dynamicImport' |
-    'estree' |
-    'exportDefaultFrom' |
-    'exportNamespaceFrom' | // deprecated
-    'flow' |
-    'flowComments' |
-    'functionBind' |
-    'functionSent' |
-    'importMeta' |
-    'jsx' |
-    'logicalAssignment' |
-    'nullishCoalescingOperator' |
-    'numericSeparator' |
-    'objectRestSpread' |
-    'optionalCatchBinding' |
-    'optionalChaining' |
-    'partialApplication' |
-    'pipelineOperator' |
-    'placeholders' |
-    'throwExpressions' |
-    'topLevelAwait' |
-    'typescript' |
-    'v8intrinsic' |
-    ParserPluginWithOptions;
-
-export type ParserPluginWithOptions =
-    ['decorators', DecoratorsPluginOptions] |
-    ['pipelineOperator', PipelineOperatorPluginOptions] |
-    ['flow', FlowPluginOptions];
-
-export interface DecoratorsPluginOptions {
-    decoratorsBeforeExport?: boolean;
-}
-
-export interface PipelineOperatorPluginOptions {
-    proposal: 'minimal' | 'smart';
-}
-
-export interface FlowPluginOptions {
-    all?: boolean;
-}
diff --git a/node_modules/jest-circus/node_modules/@jest/console/build/BufferedConsole.d.ts b/node_modules/jest-circus/node_modules/@jest/console/build/BufferedConsole.d.ts
index 6781fd0..2794762 100644
--- a/node_modules/jest-circus/node_modules/@jest/console/build/BufferedConsole.d.ts
+++ b/node_modules/jest-circus/node_modules/@jest/console/build/BufferedConsole.d.ts
@@ -4,6 +4,7 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+/// <reference types="node" />
 import { Console } from 'console';
 import type { ConsoleBuffer, LogMessage, LogType } from './types';
 export default class BufferedConsole extends Console {
@@ -11,6 +12,7 @@
     private _counters;
     private _timers;
     private _groupDepth;
+    Console: NodeJS.ConsoleConstructor;
     constructor();
     static write(buffer: ConsoleBuffer, type: LogType, message: LogMessage, level?: number | null): ConsoleBuffer;
     private _log;
diff --git a/node_modules/jest-circus/node_modules/@jest/console/build/BufferedConsole.js b/node_modules/jest-circus/node_modules/@jest/console/build/BufferedConsole.js
index dddb211..aa347e5 100644
--- a/node_modules/jest-circus/node_modules/@jest/console/build/BufferedConsole.js
+++ b/node_modules/jest-circus/node_modules/@jest/console/build/BufferedConsole.js
@@ -75,26 +75,22 @@
 
 class BufferedConsole extends _console().Console {
   constructor() {
-    const buffer = [];
     super({
       write: message => {
-        BufferedConsole.write(buffer, 'log', message, null);
+        BufferedConsole.write(this._buffer, 'log', message, null);
         return true;
       }
     });
 
-    _defineProperty(this, '_buffer', void 0);
+    _defineProperty(this, '_buffer', []);
 
-    _defineProperty(this, '_counters', void 0);
+    _defineProperty(this, '_counters', {});
 
-    _defineProperty(this, '_timers', void 0);
+    _defineProperty(this, '_timers', {});
 
-    _defineProperty(this, '_groupDepth', void 0);
+    _defineProperty(this, '_groupDepth', 0);
 
-    this._buffer = buffer;
-    this._counters = {};
-    this._timers = {};
-    this._groupDepth = 0;
+    _defineProperty(this, 'Console', _console().Console);
   }
 
   static write(buffer, type, message, level) {
diff --git a/node_modules/jest-circus/node_modules/@jest/console/build/CustomConsole.d.ts b/node_modules/jest-circus/node_modules/@jest/console/build/CustomConsole.d.ts
index ace2741..dbf1f98 100644
--- a/node_modules/jest-circus/node_modules/@jest/console/build/CustomConsole.d.ts
+++ b/node_modules/jest-circus/node_modules/@jest/console/build/CustomConsole.d.ts
@@ -15,6 +15,7 @@
     private _counters;
     private _timers;
     private _groupDepth;
+    Console: NodeJS.ConsoleConstructor;
     constructor(stdout: NodeJS.WriteStream, stderr: NodeJS.WriteStream, formatBuffer?: Formatter);
     private _log;
     private _logError;
diff --git a/node_modules/jest-circus/node_modules/@jest/console/build/CustomConsole.js b/node_modules/jest-circus/node_modules/@jest/console/build/CustomConsole.js
index 54a7a66..d2d5c03 100644
--- a/node_modules/jest-circus/node_modules/@jest/console/build/CustomConsole.js
+++ b/node_modules/jest-circus/node_modules/@jest/console/build/CustomConsole.js
@@ -83,18 +83,17 @@
 
     _defineProperty(this, '_formatBuffer', void 0);
 
-    _defineProperty(this, '_counters', void 0);
+    _defineProperty(this, '_counters', {});
 
-    _defineProperty(this, '_timers', void 0);
+    _defineProperty(this, '_timers', {});
 
-    _defineProperty(this, '_groupDepth', void 0);
+    _defineProperty(this, '_groupDepth', 0);
+
+    _defineProperty(this, 'Console', _console().Console);
 
     this._stdout = stdout;
     this._stderr = stderr;
     this._formatBuffer = formatBuffer;
-    this._counters = {};
-    this._timers = {};
-    this._groupDepth = 0;
   }
 
   _log(type, message) {
diff --git a/node_modules/jest-circus/node_modules/@jest/console/package.json b/node_modules/jest-circus/node_modules/@jest/console/package.json
index c8cb597..d4d195f 100644
--- a/node_modules/jest-circus/node_modules/@jest/console/package.json
+++ b/node_modules/jest-circus/node_modules/@jest/console/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/console",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,11 +10,11 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "@types/node": "*",
     "chalk": "^4.0.0",
-    "jest-message-util": "^26.3.0",
-    "jest-util": "^26.3.0",
+    "jest-message-util": "^26.5.2",
+    "jest-util": "^26.5.2",
     "slash": "^3.0.0"
   },
   "devDependencies": {
@@ -26,5 +26,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/@jest/globals/package.json b/node_modules/jest-circus/node_modules/@jest/globals/package.json
index a11c01d..c601634 100644
--- a/node_modules/jest-circus/node_modules/@jest/globals/package.json
+++ b/node_modules/jest-circus/node_modules/@jest/globals/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/globals",
-  "version": "26.4.2",
+  "version": "26.5.3",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -13,12 +13,12 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/environment": "^26.3.0",
-    "@jest/types": "^26.3.0",
-    "expect": "^26.4.2"
+    "@jest/environment": "^26.5.2",
+    "@jest/types": "^26.5.2",
+    "expect": "^26.5.3"
   },
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "71152afbbda76fd09ddb2527b54c365d753f42aa"
 }
diff --git a/node_modules/jest-circus/node_modules/@jest/source-map/package.json b/node_modules/jest-circus/node_modules/@jest/source-map/package.json
index db74e88..bc212cf 100644
--- a/node_modules/jest-circus/node_modules/@jest/source-map/package.json
+++ b/node_modules/jest-circus/node_modules/@jest/source-map/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/source-map",
-  "version": "26.3.0",
+  "version": "26.5.0",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -23,5 +23,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "68d1b1b638bc7464c2794a957c1b894de7da2ee3"
 }
diff --git a/node_modules/jest-circus/node_modules/@jest/test-result/build/index.d.ts b/node_modules/jest-circus/node_modules/@jest/test-result/build/index.d.ts
index 7df6eec..1d83f7b 100644
--- a/node_modules/jest-circus/node_modules/@jest/test-result/build/index.d.ts
+++ b/node_modules/jest-circus/node_modules/@jest/test-result/build/index.d.ts
@@ -6,4 +6,4 @@
  */
 export { default as formatTestResults } from './formatTestResults';
 export { addResult, buildFailureTestResult, createEmptyTestResult, makeEmptyAggregatedTestResult, } from './helpers';
-export type { AggregatedResult, AssertionLocation, AssertionResult, FailedAssertion, FormattedTestResults, Milliseconds, SerializableError, SnapshotSummary, Status, Suite, TestResult, TestCaseResult, V8CoverageResult, } from './types';
+export type { AggregatedResult, AssertionLocation, AssertionResult, FailedAssertion, FormattedTestResults, Milliseconds, RuntimeTransformResult, SerializableError, SnapshotSummary, Status, Suite, TestResult, TestCaseResult, V8CoverageResult, } from './types';
diff --git a/node_modules/jest-circus/node_modules/@jest/test-result/build/types.d.ts b/node_modules/jest-circus/node_modules/@jest/test-result/build/types.d.ts
index 198841a..07f713b 100644
--- a/node_modules/jest-circus/node_modules/@jest/test-result/build/types.d.ts
+++ b/node_modules/jest-circus/node_modules/@jest/test-result/build/types.d.ts
@@ -8,21 +8,24 @@
 import type { ConsoleBuffer } from '@jest/console';
 import type { Config, TestResult, TransformTypes } from '@jest/types';
 import type { V8Coverage } from 'collect-v8-coverage';
+export interface RuntimeTransformResult extends TransformTypes.TransformResult {
+    wrapperLength?: number;
+}
 export declare type V8CoverageResult = Array<{
-    codeTransformResult: TransformTypes.TransformResult | undefined;
+    codeTransformResult: RuntimeTransformResult | undefined;
     result: V8Coverage[number];
 }>;
 export declare type SerializableError = TestResult.SerializableError;
 export declare type FailedAssertion = {
     matcherName?: string;
     message?: string;
-    actual?: any;
+    actual?: unknown;
     pass?: boolean;
     passed?: boolean;
-    expected?: any;
+    expected?: unknown;
     isNot?: boolean;
     stack?: string;
-    error?: any;
+    error?: unknown;
 };
 export declare type AssertionLocation = {
     fullName: string;
@@ -105,7 +108,7 @@
     status: 'failed' | 'passed';
     startTime: number;
     endTime: number;
-    coverage: any;
+    coverage: unknown;
     assertionResults: Array<FormattedAssertionResult>;
 };
 export declare type FormattedTestResults = {
@@ -125,8 +128,8 @@
     testResults: Array<FormattedTestResult>;
     wasInterrupted: boolean;
 };
-export declare type CodeCoverageReporter = any;
-export declare type CodeCoverageFormatter = (coverage: CoverageMapData | null | undefined, reporter: CodeCoverageReporter) => Record<string, any> | null | undefined;
+export declare type CodeCoverageReporter = unknown;
+export declare type CodeCoverageFormatter = (coverage: CoverageMapData | null | undefined, reporter: CodeCoverageReporter) => Record<string, unknown> | null | undefined;
 export declare type UncheckedSnapshot = {
     filePath: string;
     keys: Array<string>;
diff --git a/node_modules/jest-circus/node_modules/@jest/test-result/package.json b/node_modules/jest-circus/node_modules/@jest/test-result/package.json
index 9a6f252..cceff82 100644
--- a/node_modules/jest-circus/node_modules/@jest/test-result/package.json
+++ b/node_modules/jest-circus/node_modules/@jest/test-result/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/test-result",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,8 +10,8 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/console": "^26.3.0",
-    "@jest/types": "^26.3.0",
+    "@jest/console": "^26.5.2",
+    "@jest/types": "^26.5.2",
     "@types/istanbul-lib-coverage": "^2.0.0",
     "collect-v8-coverage": "^1.0.0"
   },
@@ -21,5 +21,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/@jest/test-sequencer/package.json b/node_modules/jest-circus/node_modules/@jest/test-sequencer/package.json
index 642d2c6..2d69b90 100644
--- a/node_modules/jest-circus/node_modules/@jest/test-sequencer/package.json
+++ b/node_modules/jest-circus/node_modules/@jest/test-sequencer/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/test-sequencer",
-  "version": "26.4.2",
+  "version": "26.5.3",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,11 +10,11 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/test-result": "^26.3.0",
+    "@jest/test-result": "^26.5.2",
     "graceful-fs": "^4.2.4",
-    "jest-haste-map": "^26.3.0",
-    "jest-runner": "^26.4.2",
-    "jest-runtime": "^26.4.2"
+    "jest-haste-map": "^26.5.2",
+    "jest-runner": "^26.5.3",
+    "jest-runtime": "^26.5.3"
   },
   "devDependencies": {
     "@types/graceful-fs": "^4.1.3"
@@ -25,5 +25,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "71152afbbda76fd09ddb2527b54c365d753f42aa"
 }
diff --git a/node_modules/jest-circus/node_modules/@jest/transform/package.json b/node_modules/jest-circus/node_modules/@jest/transform/package.json
index 94e1a4c..3c01a57 100644
--- a/node_modules/jest-circus/node_modules/@jest/transform/package.json
+++ b/node_modules/jest-circus/node_modules/@jest/transform/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/transform",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -11,15 +11,15 @@
   "types": "build/index.d.ts",
   "dependencies": {
     "@babel/core": "^7.1.0",
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "babel-plugin-istanbul": "^6.0.0",
     "chalk": "^4.0.0",
     "convert-source-map": "^1.4.0",
     "fast-json-stable-stringify": "^2.0.0",
     "graceful-fs": "^4.2.4",
-    "jest-haste-map": "^26.3.0",
+    "jest-haste-map": "^26.5.2",
     "jest-regex-util": "^26.0.0",
-    "jest-util": "^26.3.0",
+    "jest-util": "^26.5.2",
     "micromatch": "^4.0.2",
     "pirates": "^4.0.1",
     "slash": "^3.0.0",
@@ -42,5 +42,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/@jest/types/build/Circus.d.ts b/node_modules/jest-circus/node_modules/@jest/types/build/Circus.d.ts
index e6ad88d..417a5fe 100644
--- a/node_modules/jest-circus/node_modules/@jest/types/build/Circus.d.ts
+++ b/node_modules/jest-circus/node_modules/@jest/types/build/Circus.d.ts
@@ -18,7 +18,7 @@
 export declare type AsyncFn = TestFn | HookFn;
 export declare type SharedHookType = 'afterAll' | 'beforeAll';
 export declare type HookType = SharedHookType | 'afterEach' | 'beforeEach';
-export declare type TestContext = Record<string, any>;
+export declare type TestContext = Record<string, unknown>;
 export declare type Exception = any;
 export declare type FormattedError = string;
 export declare type Hook = {
@@ -33,6 +33,9 @@
     (event: SyncEvent, state: State): void;
 }
 export declare type Event = SyncEvent | AsyncEvent;
+interface JestGlobals extends Global.TestFrameworkGlobals {
+    expect: unknown;
+}
 export declare type SyncEvent = {
     asyncError: Error;
     mode: BlockMode;
@@ -62,6 +65,7 @@
 export declare type AsyncEvent = {
     name: 'setup';
     testNamePattern?: string;
+    runtimeGlobals: JestGlobals;
     parentProcess: Process;
 } | {
     name: 'include_test_location_in_result';
@@ -143,7 +147,7 @@
 export declare type TestResults = Array<TestResult>;
 export declare type GlobalErrorHandlers = {
     uncaughtException: Array<(exception: Exception) => void>;
-    unhandledRejection: Array<(exception: Exception, promise: Promise<any>) => void>;
+    unhandledRejection: Array<(exception: Exception, promise: Promise<unknown>) => void>;
 };
 export declare type State = {
     currentDescribeBlock: DescribeBlock;
diff --git a/node_modules/jest-circus/node_modules/@jest/types/build/Config.d.ts b/node_modules/jest-circus/node_modules/@jest/types/build/Config.d.ts
index f280c29..5f94989 100644
--- a/node_modules/jest-circus/node_modules/@jest/types/build/Config.d.ts
+++ b/node_modules/jest-circus/node_modules/@jest/types/build/Config.d.ts
@@ -42,6 +42,7 @@
     forceCoverageMatch: Array<Glob>;
     globals: ConfigGlobals;
     haste: HasteConfig;
+    injectGlobals: boolean;
     maxConcurrency: number;
     maxWorkers: number | string;
     moduleDirectories: Array<string>;
@@ -64,7 +65,7 @@
     slowTestThreshold: number;
     snapshotSerializers: Array<Path>;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testFailureExitCode: string | number;
     testLocationInResults: boolean;
     testMatch: Array<Glob>;
@@ -122,6 +123,7 @@
     globalSetup: string | null | undefined;
     globalTeardown: string | null | undefined;
     haste: HasteConfig;
+    injectGlobals: boolean;
     reporters: Array<string | ReporterConfig>;
     logHeapUsage: boolean;
     lastCommit: boolean;
@@ -169,7 +171,7 @@
     snapshotSerializers: Array<Path>;
     errorOnDeprecated: boolean;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testFailureExitCode: string | number;
     testLocationInResults: boolean;
     testMatch: Array<Glob>;
@@ -195,7 +197,7 @@
     watch: boolean;
     watchAll: boolean;
     watchman: boolean;
-    watchPlugins: Array<string | [string, Record<string, any>]>;
+    watchPlugins: Array<string | [string, Record<string, unknown>]>;
 }>;
 export declare type SnapshotUpdateState = 'all' | 'new' | 'none';
 declare type NotifyMode = 'always' | 'failure' | 'success' | 'change' | 'success-change' | 'failure-change';
@@ -273,7 +275,7 @@
     watchman: boolean;
     watchPlugins?: Array<{
         path: string;
-        config: Record<string, any>;
+        config: Record<string, unknown>;
     }> | null;
 };
 export declare type ProjectConfig = {
@@ -295,6 +297,7 @@
     globalTeardown?: string;
     globals: ConfigGlobals;
     haste: HasteConfig;
+    injectGlobals: boolean;
     moduleDirectories: Array<string>;
     moduleFileExtensions: Array<string>;
     moduleLoader?: Path;
@@ -318,7 +321,7 @@
     snapshotResolver?: Path;
     snapshotSerializers: Array<Path>;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testMatch: Array<Glob>;
     testLocationInResults: boolean;
     testPathIgnorePatterns: Array<string>;
@@ -363,6 +366,7 @@
     globalTeardown: string | null | undefined;
     haste: string;
     init: boolean;
+    injectGlobals: boolean;
     json: boolean;
     lastCommit: boolean;
     logHeapUsage: boolean;
diff --git a/node_modules/jest-circus/node_modules/@jest/types/build/Global.d.ts b/node_modules/jest-circus/node_modules/@jest/types/build/Global.d.ts
index c1d541b..8670a49 100644
--- a/node_modules/jest-circus/node_modules/@jest/types/build/Global.d.ts
+++ b/node_modules/jest-circus/node_modules/@jest/types/build/Global.d.ts
@@ -24,9 +24,12 @@
 export declare type EachTestFn<EachCallback extends TestCallback> = (...args: Array<any>) => ReturnType<EachCallback>;
 declare type Jasmine = {
     _DEFAULT_TIMEOUT_INTERVAL?: number;
-    addMatchers: Function;
+    addMatchers: (matchers: Record<string, unknown>) => void;
 };
-declare type Each<EachCallback extends TestCallback> = ((table: EachTable, ...taggedTemplateData: Array<unknown>) => (title: string, test: EachTestFn<EachCallback>, timeout?: number) => void) | (() => void);
+declare type Each<EachCallback extends TestCallback> = ((table: EachTable, ...taggedTemplateData: Array<unknown>) => (title: string, test: EachTestFn<EachCallback>, timeout?: number) => void) | (() => () => void);
+export interface HookBase {
+    (fn: HookFn, timeout?: number): void;
+}
 export interface ItBase {
     (testName: TestName, fn: TestFn, timeout?: number): void;
     each: Each<TestFn>;
@@ -34,7 +37,7 @@
 export interface It extends ItBase {
     only: ItBase;
     skip: ItBase;
-    todo: (testName: TestName, ...rest: Array<any>) => void;
+    todo: (testName: TestName) => void;
 }
 export interface ItConcurrentBase {
     (testName: string, testFn: ConcurrentTestFn, timeout?: number): void;
@@ -66,10 +69,10 @@
     describe: Describe;
     xdescribe: DescribeBase;
     fdescribe: DescribeBase;
-    beforeAll: HookFn;
-    beforeEach: HookFn;
-    afterEach: HookFn;
-    afterAll: HookFn;
+    beforeAll: HookBase;
+    beforeEach: HookBase;
+    afterEach: HookBase;
+    afterAll: HookBase;
 }
 export interface GlobalAdditions extends TestFrameworkGlobals {
     __coverage__: CoverageMapData;
@@ -80,6 +83,6 @@
     spyOnProperty: () => void;
 }
 export interface Global extends GlobalAdditions, Omit<NodeJS.Global, keyof GlobalAdditions> {
-    [extras: string]: any;
+    [extras: string]: unknown;
 }
 export {};
diff --git a/node_modules/jest-circus/node_modules/@jest/types/package.json b/node_modules/jest-circus/node_modules/@jest/types/package.json
index 772dfac..c8aa07c 100644
--- a/node_modules/jest-circus/node_modules/@jest/types/package.json
+++ b/node_modules/jest-circus/node_modules/@jest/types/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/types",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -22,5 +22,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/@types/stack-utils/LICENSE b/node_modules/jest-circus/node_modules/@types/stack-utils/LICENSE
new file mode 100644
index 0000000..9e841e7
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/@types/stack-utils/LICENSE
@@ -0,0 +1,21 @@
+    MIT License
+
+    Copyright (c) Microsoft Corporation.
+
+    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/node_modules/jest-circus/node_modules/@types/stack-utils/README.md b/node_modules/jest-circus/node_modules/@types/stack-utils/README.md
new file mode 100644
index 0000000..92a34de
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/@types/stack-utils/README.md
@@ -0,0 +1,16 @@
+# Installation
+> `npm install --save @types/stack-utils`
+
+# Summary
+This package contains type definitions for stack-utils (https://github.com/tapjs/stack-utils#readme).
+
+# Details
+Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/stack-utils.
+
+### Additional Details
+ * Last updated: Tue, 22 Sep 2020 00:22:28 GMT
+ * Dependencies: none
+ * Global values: none
+
+# Credits
+These definitions were written by [BendingBender](https://github.com/BendingBender).
diff --git a/node_modules/jest-circus/node_modules/@types/stack-utils/index.d.ts b/node_modules/jest-circus/node_modules/@types/stack-utils/index.d.ts
new file mode 100644
index 0000000..3427e35
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/@types/stack-utils/index.d.ts
@@ -0,0 +1,65 @@
+// Type definitions for stack-utils 2.0
+// Project: https://github.com/tapjs/stack-utils#readme
+// Definitions by: BendingBender <https://github.com/BendingBender>
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+// TypeScript Version: 2.2
+
+export = StackUtils;
+
+declare class StackUtils {
+    static nodeInternals(): RegExp[];
+    constructor(options?: StackUtils.Options);
+    clean(stack: string | string[]): string;
+    capture(limit?: number, startStackFunction?: Function): StackUtils.CallSite[];
+    capture(startStackFunction: Function): StackUtils.CallSite[];
+    captureString(limit?: number, startStackFunction?: Function): string;
+    captureString(startStackFunction: Function): string;
+    at(startStackFunction?: Function): StackUtils.CallSiteLike;
+    parseLine(line: string): StackUtils.StackLineData | null;
+}
+
+declare namespace StackUtils {
+    interface Options {
+        internals?: RegExp[];
+        ignoredPackages?: string[];
+        cwd?: string;
+        wrapCallSite?(callSite: CallSite): CallSite;
+    }
+
+    interface CallSite {
+        getThis(): object | undefined;
+        getTypeName(): string;
+        getFunction(): Function | undefined;
+        getFunctionName(): string;
+        getMethodName(): string | null;
+        getFileName(): string | undefined;
+        getLineNumber(): number;
+        getColumnNumber(): number;
+        getEvalOrigin(): CallSite | string;
+        isToplevel(): boolean;
+        isEval(): boolean;
+        isNative(): boolean;
+        isConstructor(): boolean;
+    }
+
+    interface CallSiteLike extends StackData {
+        type?: string;
+    }
+
+    interface StackLineData extends StackData {
+        evalLine?: number;
+        evalColumn?: number;
+        evalFile?: string;
+    }
+
+    interface StackData {
+        line?: number;
+        column?: number;
+        file?: string;
+        constructor?: boolean;
+        evalOrigin?: string;
+        native?: boolean;
+        function?: string;
+        method?: string;
+    }
+}
diff --git a/node_modules/jest-circus/node_modules/@types/stack-utils/package.json b/node_modules/jest-circus/node_modules/@types/stack-utils/package.json
new file mode 100644
index 0000000..1f9393a
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/@types/stack-utils/package.json
@@ -0,0 +1,24 @@
+{
+    "name": "@types/stack-utils",
+    "version": "2.0.0",
+    "description": "TypeScript definitions for stack-utils",
+    "license": "MIT",
+    "contributors": [
+        {
+            "name": "BendingBender",
+            "url": "https://github.com/BendingBender",
+            "githubUsername": "BendingBender"
+        }
+    ],
+    "main": "",
+    "types": "index.d.ts",
+    "repository": {
+        "type": "git",
+        "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
+        "directory": "types/stack-utils"
+    },
+    "scripts": {},
+    "dependencies": {},
+    "typesPublisherContentHash": "53c84779043276d5e313653eabfc4fedae5b103c7dc645555065fdc3b4b0a982",
+    "typeScriptVersion": "3.2"
+}
\ No newline at end of file
diff --git a/node_modules/jest-circus/node_modules/babel-jest/package.json b/node_modules/jest-circus/node_modules/babel-jest/package.json
index fe6ced8..4c14c8e 100644
--- a/node_modules/jest-circus/node_modules/babel-jest/package.json
+++ b/node_modules/jest-circus/node_modules/babel-jest/package.json
@@ -1,7 +1,7 @@
 {
   "name": "babel-jest",
   "description": "Jest plugin to use babel for transformation.",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -11,11 +11,11 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/transform": "^26.3.0",
-    "@jest/types": "^26.3.0",
+    "@jest/transform": "^26.5.2",
+    "@jest/types": "^26.5.2",
     "@types/babel__core": "^7.1.7",
     "babel-plugin-istanbul": "^6.0.0",
-    "babel-preset-jest": "^26.3.0",
+    "babel-preset-jest": "^26.5.0",
     "chalk": "^4.0.0",
     "graceful-fs": "^4.2.4",
     "slash": "^3.0.0"
@@ -33,5 +33,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/babel-plugin-jest-hoist/build/index.js b/node_modules/jest-circus/node_modules/babel-plugin-jest-hoist/build/index.js
index a67a7bd..6128021 100644
--- a/node_modules/jest-circus/node_modules/babel-plugin-jest-hoist/build/index.js
+++ b/node_modules/jest-circus/node_modules/babel-plugin-jest-hoist/build/index.js
@@ -250,7 +250,7 @@
       : _FUNCTIONS$propertyNa.call(FUNCTIONS, args);
   return functionLooksHoistable ? jestObjExpr : null;
 };
-/* eslint-disable sort-keys,@typescript-eslint/explicit-module-boundary-types */
+/* eslint-disable sort-keys */
 
 var _default = () => ({
   pre({path: program}) {
@@ -309,18 +309,21 @@
               : _this$jestObjGetterId.name)
         ) {
           const mockStmt = callExpr.getStatementParent();
-          const mockStmtNode = mockStmt.node;
-          const mockStmtParent = mockStmt.parentPath;
 
-          if (mockStmtParent.isBlock()) {
-            mockStmt.remove();
-            mockStmtParent.unshiftContainer('body', [mockStmtNode]);
+          if (mockStmt) {
+            const mockStmtNode = mockStmt.node;
+            const mockStmtParent = mockStmt.parentPath;
+
+            if (mockStmtParent.isBlock()) {
+              mockStmt.remove();
+              mockStmtParent.unshiftContainer('body', [mockStmtNode]);
+            }
           }
         }
       }
     });
   }
 });
-/* eslint-enable sort-keys,@typescript-eslint/explicit-module-boundary-types */
+/* eslint-enable */
 
 exports.default = _default;
diff --git a/node_modules/jest-circus/node_modules/babel-plugin-jest-hoist/package.json b/node_modules/jest-circus/node_modules/babel-plugin-jest-hoist/package.json
index 0e51f83..2b397fa 100644
--- a/node_modules/jest-circus/node_modules/babel-plugin-jest-hoist/package.json
+++ b/node_modules/jest-circus/node_modules/babel-plugin-jest-hoist/package.json
@@ -1,6 +1,6 @@
 {
   "name": "babel-plugin-jest-hoist",
-  "version": "26.2.0",
+  "version": "26.5.0",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -25,5 +25,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "4a716811a309dae135b780a87dc1647b285800eb"
+  "gitHead": "68d1b1b638bc7464c2794a957c1b894de7da2ee3"
 }
diff --git a/node_modules/jest-circus/node_modules/babel-preset-jest/package.json b/node_modules/jest-circus/node_modules/babel-preset-jest/package.json
index b9739b2..8158600 100644
--- a/node_modules/jest-circus/node_modules/babel-preset-jest/package.json
+++ b/node_modules/jest-circus/node_modules/babel-preset-jest/package.json
@@ -1,6 +1,6 @@
 {
   "name": "babel-preset-jest",
-  "version": "26.3.0",
+  "version": "26.5.0",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -9,7 +9,7 @@
   "license": "MIT",
   "main": "index.js",
   "dependencies": {
-    "babel-plugin-jest-hoist": "^26.2.0",
+    "babel-plugin-jest-hoist": "^26.5.0",
     "babel-preset-current-node-syntax": "^0.1.3"
   },
   "peerDependencies": {
@@ -21,5 +21,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "68d1b1b638bc7464c2794a957c1b894de7da2ee3"
 }
diff --git a/node_modules/jest-circus/node_modules/diff-sequences/build/index.js b/node_modules/jest-circus/node_modules/diff-sequences/build/index.js
index 445260b..5d565d9 100644
--- a/node_modules/jest-circus/node_modules/diff-sequences/build/index.js
+++ b/node_modules/jest-circus/node_modules/diff-sequences/build/index.js
@@ -688,10 +688,8 @@
 };
 
 const validateLength = (name, arg) => {
-  const type = typeof arg;
-
-  if (type !== 'number') {
-    throw new TypeError(`${pkg}: ${name} typeof ${type} is not a number`);
+  if (typeof arg !== 'number') {
+    throw new TypeError(`${pkg}: ${name} typeof ${typeof arg} is not a number`);
   }
 
   if (!Number.isSafeInteger(arg)) {
diff --git a/node_modules/jest-circus/node_modules/diff-sequences/package.json b/node_modules/jest-circus/node_modules/diff-sequences/package.json
index c56b179..808f36c 100644
--- a/node_modules/jest-circus/node_modules/diff-sequences/package.json
+++ b/node_modules/jest-circus/node_modules/diff-sequences/package.json
@@ -1,6 +1,6 @@
 {
   "name": "diff-sequences",
-  "version": "26.3.0",
+  "version": "26.5.0",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -31,5 +31,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "68d1b1b638bc7464c2794a957c1b894de7da2ee3"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-config/build/Defaults.js b/node_modules/jest-circus/node_modules/jest-config/build/Defaults.js
index 7a34589..c3751ed 100644
--- a/node_modules/jest-circus/node_modules/jest-config/build/Defaults.js
+++ b/node_modules/jest-circus/node_modules/jest-config/build/Defaults.js
@@ -61,6 +61,7 @@
     computeSha1: false,
     throwOnModuleCollision: false
   },
+  injectGlobals: true,
   maxConcurrency: 5,
   maxWorkers: '50%',
   moduleDirectories: ['node_modules'],
diff --git a/node_modules/jest-circus/node_modules/jest-config/build/Deprecated.d.ts b/node_modules/jest-circus/node_modules/jest-config/build/Deprecated.d.ts
index 58f67cc..4c05472 100644
--- a/node_modules/jest-circus/node_modules/jest-config/build/Deprecated.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-config/build/Deprecated.d.ts
@@ -4,5 +4,6 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
-declare const _default: Record<string, Function>;
-export default _default;
+import type { DeprecatedOptions } from 'jest-validate';
+declare const deprecatedOptions: DeprecatedOptions;
+export default deprecatedOptions;
diff --git a/node_modules/jest-circus/node_modules/jest-config/build/Deprecated.js b/node_modules/jest-circus/node_modules/jest-config/build/Deprecated.js
index 45fb9f3..2cc5b97 100644
--- a/node_modules/jest-circus/node_modules/jest-config/build/Deprecated.js
+++ b/node_modules/jest-circus/node_modules/jest-config/build/Deprecated.js
@@ -40,7 +40,7 @@
     min: true
   });
 
-var _default = {
+const deprecatedOptions = {
   browser: () => `  Option ${_chalk().default.bold(
     '"browser"'
   )} has been deprecated. Please install "browser-resolve" and use the "resolver" option in Jest configuration as follows:
@@ -104,4 +104,5 @@
   Please update your configuration.
   `
 };
+var _default = deprecatedOptions;
 exports.default = _default;
diff --git a/node_modules/jest-circus/node_modules/jest-config/build/ValidConfig.js b/node_modules/jest-circus/node_modules/jest-config/build/ValidConfig.js
index 78d1f9f..f6608f7 100644
--- a/node_modules/jest-circus/node_modules/jest-config/build/ValidConfig.js
+++ b/node_modules/jest-circus/node_modules/jest-config/build/ValidConfig.js
@@ -84,6 +84,7 @@
     platforms: ['ios', 'android'],
     throwOnModuleCollision: false
   },
+  injectGlobals: true,
   json: false,
   lastCommit: false,
   logHeapUsage: true,
diff --git a/node_modules/jest-circus/node_modules/jest-config/build/index.js b/node_modules/jest-circus/node_modules/jest-config/build/index.js
index 1ad3336..86e04f0 100644
--- a/node_modules/jest-circus/node_modules/jest-config/build/index.js
+++ b/node_modules/jest-circus/node_modules/jest-config/build/index.js
@@ -313,6 +313,7 @@
     globalTeardown: options.globalTeardown,
     globals: options.globals,
     haste: options.haste,
+    injectGlobals: options.injectGlobals,
     moduleDirectories: options.moduleDirectories,
     moduleFileExtensions: options.moduleFileExtensions,
     moduleLoader: options.moduleLoader,
diff --git a/node_modules/jest-circus/node_modules/jest-config/build/normalize.js b/node_modules/jest-circus/node_modules/jest-config/build/normalize.js
index 05bca60..1509ccc 100644
--- a/node_modules/jest-circus/node_modules/jest-config/build/normalize.js
+++ b/node_modules/jest-circus/node_modules/jest-config/build/normalize.js
@@ -1038,6 +1038,7 @@
       case 'findRelatedTests':
       case 'forceCoverageMatch':
       case 'forceExit':
+      case 'injectGlobals':
       case 'lastCommit':
       case 'listTests':
       case 'logHeapUsage':
@@ -1152,7 +1153,7 @@
 
   if (!newOptions.watchAll) {
     newOptions.watchAll = false;
-  } // as any since it can happen. We really need to fix the types here
+  } // as unknown since it can happen. We really need to fix the types here
 
   if (newOptions.moduleNameMapper === _Defaults.default.moduleNameMapper) {
     newOptions.moduleNameMapper = [];
diff --git a/node_modules/jest-circus/node_modules/jest-config/package.json b/node_modules/jest-circus/node_modules/jest-config/package.json
index c6c9170..fb9aefd 100644
--- a/node_modules/jest-circus/node_modules/jest-config/package.json
+++ b/node_modules/jest-circus/node_modules/jest-config/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-config",
-  "version": "26.4.2",
+  "version": "26.5.3",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -11,23 +11,23 @@
   "types": "build/index.d.ts",
   "dependencies": {
     "@babel/core": "^7.1.0",
-    "@jest/test-sequencer": "^26.4.2",
-    "@jest/types": "^26.3.0",
-    "babel-jest": "^26.3.0",
+    "@jest/test-sequencer": "^26.5.3",
+    "@jest/types": "^26.5.2",
+    "babel-jest": "^26.5.2",
     "chalk": "^4.0.0",
     "deepmerge": "^4.2.2",
     "glob": "^7.1.1",
     "graceful-fs": "^4.2.4",
-    "jest-environment-jsdom": "^26.3.0",
-    "jest-environment-node": "^26.3.0",
+    "jest-environment-jsdom": "^26.5.2",
+    "jest-environment-node": "^26.5.2",
     "jest-get-type": "^26.3.0",
-    "jest-jasmine2": "^26.4.2",
+    "jest-jasmine2": "^26.5.3",
     "jest-regex-util": "^26.0.0",
-    "jest-resolve": "^26.4.0",
-    "jest-util": "^26.3.0",
-    "jest-validate": "^26.4.2",
+    "jest-resolve": "^26.5.2",
+    "jest-util": "^26.5.2",
+    "jest-validate": "^26.5.3",
     "micromatch": "^4.0.2",
-    "pretty-format": "^26.4.2"
+    "pretty-format": "^26.5.2"
   },
   "devDependencies": {
     "@types/babel__core": "^7.0.4",
@@ -41,5 +41,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "71152afbbda76fd09ddb2527b54c365d753f42aa"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-diff/package.json b/node_modules/jest-circus/node_modules/jest-diff/package.json
index 91b1855..45eef6e 100644
--- a/node_modules/jest-circus/node_modules/jest-diff/package.json
+++ b/node_modules/jest-circus/node_modules/jest-diff/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-diff",
-  "version": "26.4.2",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -11,12 +11,12 @@
   "types": "build/index.d.ts",
   "dependencies": {
     "chalk": "^4.0.0",
-    "diff-sequences": "^26.3.0",
+    "diff-sequences": "^26.5.0",
     "jest-get-type": "^26.3.0",
-    "pretty-format": "^26.4.2"
+    "pretty-format": "^26.5.2"
   },
   "devDependencies": {
-    "@jest/test-utils": "^26.3.0",
+    "@jest/test-utils": "^26.5.0",
     "strip-ansi": "^6.0.0"
   },
   "engines": {
@@ -25,5 +25,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-environment-jsdom/package.json b/node_modules/jest-circus/node_modules/jest-environment-jsdom/package.json
index 0d9059a..4b2b0d2 100644
--- a/node_modules/jest-circus/node_modules/jest-environment-jsdom/package.json
+++ b/node_modules/jest-circus/node_modules/jest-environment-jsdom/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-environment-jsdom",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,16 +10,16 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/environment": "^26.3.0",
-    "@jest/fake-timers": "^26.3.0",
-    "@jest/types": "^26.3.0",
+    "@jest/environment": "^26.5.2",
+    "@jest/fake-timers": "^26.5.2",
+    "@jest/types": "^26.5.2",
     "@types/node": "*",
-    "jest-mock": "^26.3.0",
-    "jest-util": "^26.3.0",
-    "jsdom": "^16.2.2"
+    "jest-mock": "^26.5.2",
+    "jest-util": "^26.5.2",
+    "jsdom": "^16.4.0"
   },
   "devDependencies": {
-    "@types/jsdom": "^16.2.1"
+    "@types/jsdom": "^16.2.4"
   },
   "engines": {
     "node": ">= 10.14.2"
@@ -27,5 +27,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-environment-node/package.json b/node_modules/jest-circus/node_modules/jest-environment-node/package.json
index f410126..7860c26 100644
--- a/node_modules/jest-circus/node_modules/jest-environment-node/package.json
+++ b/node_modules/jest-circus/node_modules/jest-environment-node/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-environment-node",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,12 +10,12 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/environment": "^26.3.0",
-    "@jest/fake-timers": "^26.3.0",
-    "@jest/types": "^26.3.0",
+    "@jest/environment": "^26.5.2",
+    "@jest/fake-timers": "^26.5.2",
+    "@jest/types": "^26.5.2",
     "@types/node": "*",
-    "jest-mock": "^26.3.0",
-    "jest-util": "^26.3.0"
+    "jest-mock": "^26.5.2",
+    "jest-util": "^26.5.2"
   },
   "engines": {
     "node": ">= 10.14.2"
@@ -23,5 +23,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-haste-map/build/index.js b/node_modules/jest-circus/node_modules/jest-haste-map/build/index.js
index 7690735..4ff4a75 100644
--- a/node_modules/jest-circus/node_modules/jest-haste-map/build/index.js
+++ b/node_modules/jest-circus/node_modules/jest-haste-map/build/index.js
@@ -286,8 +286,6 @@
  *
  */
 
-/* eslint-disable-next-line no-redeclare */
-
 class HasteMap extends _events().EventEmitter {
   constructor(options) {
     super();
diff --git a/node_modules/jest-circus/node_modules/jest-haste-map/build/types.d.ts b/node_modules/jest-circus/node_modules/jest-haste-map/build/types.d.ts
index e1e7ab0..8c0fa71 100644
--- a/node_modules/jest-circus/node_modules/jest-haste-map/build/types.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-haste-map/build/types.d.ts
@@ -37,7 +37,14 @@
     getHasteName(filePath: Config.Path): string | undefined;
 };
 export declare type FileData = Map<Config.Path, FileMetaData>;
-export declare type FileMetaData = [string, number, number, 0 | 1, string, string | null | undefined];
+export declare type FileMetaData = [
+    string,
+    number,
+    number,
+    0 | 1,
+    string,
+    string | null | undefined
+];
 export declare type MockData = Map<string, Config.Path>;
 export declare type ModuleMapData = Map<string, ModuleMapItem>;
 export declare type WatchmanClocks = Map<Config.Path, string>;
diff --git a/node_modules/jest-circus/node_modules/jest-haste-map/package.json b/node_modules/jest-circus/node_modules/jest-haste-map/package.json
index 7caabbc..11be45c 100644
--- a/node_modules/jest-circus/node_modules/jest-haste-map/package.json
+++ b/node_modules/jest-circus/node_modules/jest-haste-map/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-haste-map",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,22 +10,22 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "@types/graceful-fs": "^4.1.2",
     "@types/node": "*",
     "anymatch": "^3.0.3",
     "fb-watchman": "^2.0.0",
     "graceful-fs": "^4.2.4",
     "jest-regex-util": "^26.0.0",
-    "jest-serializer": "^26.3.0",
-    "jest-util": "^26.3.0",
-    "jest-worker": "^26.3.0",
+    "jest-serializer": "^26.5.0",
+    "jest-util": "^26.5.2",
+    "jest-worker": "^26.5.0",
     "micromatch": "^4.0.2",
     "sane": "^4.0.3",
     "walker": "^1.0.7"
   },
   "devDependencies": {
-    "@jest/test-utils": "^26.3.0",
+    "@jest/test-utils": "^26.5.0",
     "@types/anymatch": "^1.3.1",
     "@types/fb-watchman": "^2.0.0",
     "@types/micromatch": "^4.0.0",
@@ -41,5 +41,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/PCancelable.d.ts b/node_modules/jest-circus/node_modules/jest-jasmine2/build/PCancelable.d.ts
index 0791131..f245a6d 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/PCancelable.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/PCancelable.d.ts
@@ -11,7 +11,7 @@
     private _cancel?;
     private _reject;
     constructor(executor: (onCancel: (cancelHandler: () => void) => void, resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: unknown) => void) => void);
-    then<TResult1 = T, TResult2 = never>(onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
-    catch<TResult>(onRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
+    then<TResult1 = T, TResult2 = never>(onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onRejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
+    catch<TResult>(onRejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
     cancel(): void;
 }
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/index.js b/node_modules/jest-circus/node_modules/jest-jasmine2/build/index.js
index 7aa8408..909688f 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/index.js
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/index.js
@@ -68,6 +68,8 @@
  */
 const JASMINE = require.resolve('./jasmine/jasmineLight');
 
+const jestEachBuildDir = path.dirname(require.resolve('jest-each'));
+
 async function jasmine2(globalConfig, config, environment, runtime, testPath) {
   var _runtime$unstable_sho2;
 
@@ -87,35 +89,33 @@
   // in a future version
 
   if (config.testLocationInResults === true) {
-    const originalIt = environment.global.it;
+    function wrapIt(original) {
+      const wrapped = (testName, fn, timeout) => {
+        var _stack$getFileName;
 
-    environment.global.it = (...args) => {
-      const stack = (0, _sourceMap.getCallsite)(1, runtime.getSourceMaps());
-      const it = originalIt(...args); // @ts-expect-error
+        const sourcemaps = runtime.getSourceMaps();
+        let stack = (0, _sourceMap.getCallsite)(1, sourcemaps);
+        const it = original(testName, fn, timeout);
 
-      it.result.__callsite = stack;
-      return it;
-    };
+        if (
+          (_stack$getFileName = stack.getFileName()) === null ||
+          _stack$getFileName === void 0
+            ? void 0
+            : _stack$getFileName.startsWith(jestEachBuildDir)
+        ) {
+          stack = (0, _sourceMap.getCallsite)(4, sourcemaps);
+        } // @ts-expect-error
 
-    const originalXit = environment.global.xit;
+        it.result.__callsite = stack;
+        return it;
+      };
 
-    environment.global.xit = (...args) => {
-      const stack = (0, _sourceMap.getCallsite)(1, runtime.getSourceMaps());
-      const xit = originalXit(...args); // @ts-expect-error
+      return wrapped;
+    }
 
-      xit.result.__callsite = stack;
-      return xit;
-    };
-
-    const originalFit = environment.global.fit;
-
-    environment.global.fit = (...args) => {
-      const stack = (0, _sourceMap.getCallsite)(1, runtime.getSourceMaps());
-      const fit = originalFit(...args); // @ts-expect-error
-
-      fit.result.__callsite = stack;
-      return fit;
-    };
+    environment.global.it = wrapIt(environment.global.it);
+    environment.global.xit = wrapIt(environment.global.xit);
+    environment.global.fit = wrapIt(environment.global.fit);
   }
 
   (0, _jasmineAsyncInstall.default)(globalConfig, environment.global);
@@ -260,6 +260,6 @@
 
   results.snapshot.uncheckedKeys = Array.from(uncheckedKeys);
   return results;
-}; // eslint-disable-next-line no-redeclare
+};
 
 module.exports = jasmine2;
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/isError.js b/node_modules/jest-circus/node_modules/jest-jasmine2/build/isError.js
index 7e79a29..d2a5487 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/isError.js
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/isError.js
@@ -17,8 +17,7 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
-// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
-function isError(potentialError) {
+function isError(potentialError) { // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
   // duck-type Error, see #2549
   const isError =
     potentialError !== null &&
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/ReportDispatcher.js b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/ReportDispatcher.js
index f038987..3acead9 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/ReportDispatcher.js
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/ReportDispatcher.js
@@ -50,6 +50,8 @@
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
+
+/* eslint-disable local/prefer-spread-eventually, local/prefer-rest-params-eventually */
 class ReportDispatcher {
   // @ts-expect-error
   // @ts-expect-error
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/SpyStrategy.js b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/SpyStrategy.js
index ce16794..fc7de39 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/SpyStrategy.js
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/SpyStrategy.js
@@ -50,6 +50,8 @@
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
+
+/* eslint-disable local/ban-types-eventually, local/prefer-rest-params-eventually */
 class SpyStrategy {
   constructor({
     name = 'unknown',
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/createSpy.d.ts b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/createSpy.d.ts
index 5f23ea9..f1d0173 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/createSpy.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/createSpy.d.ts
@@ -6,8 +6,8 @@
  *
  */
 import type { Spy } from '../types';
-interface Fn extends Record<string, any> {
-    (): any;
+interface Fn extends Record<string, unknown> {
+    (): unknown;
 }
 declare function createSpy(name: string, originalFn: Fn): Spy;
 export default createSpy;
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/createSpy.js b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/createSpy.js
index 44f487a..17a6728 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/createSpy.js
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/createSpy.js
@@ -45,7 +45,7 @@
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
 
-/* eslint-disable sort-keys */
+/* eslint-disable sort-keys, local/prefer-rest-params-eventually */
 function createSpy(name, originalFn) {
   const spyStrategy = new _SpyStrategy.default({
     name,
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/jasmineLight.js b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/jasmineLight.js
index 2ea6a0c..6025db6 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/jasmineLight.js
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmine/jasmineLight.js
@@ -57,7 +57,7 @@
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
 
-/* eslint-disable sort-keys */
+/* eslint-disable sort-keys, local/prefer-spread-eventually, local/prefer-rest-params-eventually */
 const create = function (createOptions) {
   const j$ = {...createOptions};
   j$._DEFAULT_TIMEOUT_INTERVAL = createOptions.testTimeout || 5000;
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js
index 6865b95..c8c79d1 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js
@@ -163,7 +163,7 @@
     return spec;
   }; // each is binded after the function is made concurrent, so for now it is made noop
 
-  concurrentFn.each = () => {};
+  concurrentFn.each = () => () => {};
 
   return concurrentFn;
 }
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jestExpect.js b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jestExpect.js
index a95a53f..97e59ec 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/jestExpect.js
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/jestExpect.js
@@ -19,6 +19,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+
+/* eslint-disable local/prefer-spread-eventually */
 var _default = config => {
   global.expect = _expect.default;
 
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/queueRunner.d.ts b/node_modules/jest-circus/node_modules/jest-jasmine2/build/queueRunner.d.ts
index 8335666..5042614 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/queueRunner.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/queueRunner.d.ts
@@ -11,7 +11,7 @@
     onException: (error: Error) => void;
     queueableFns: Array<QueueableFn>;
     setTimeout: Global['setTimeout'];
-    userContext: any;
+    userContext: unknown;
 };
 export interface DoneFn {
     (error?: any): void;
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/setup_jest_globals.js b/node_modules/jest-circus/node_modules/jest-jasmine2/build/setup_jest_globals.js
index 875345b..0f09196 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/setup_jest_globals.js
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/setup_jest_globals.js
@@ -102,7 +102,8 @@
     getPrettier: () =>
       config.prettierPath ? require(config.prettierPath) : null,
     updateSnapshot
-  });
+  }); // @ts-expect-error: snapshotState is a jest extension of `expect`
+
   (0, _expect.setState)({
     snapshotState,
     testPath
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/treeProcessor.d.ts b/node_modules/jest-circus/node_modules/jest-jasmine2/build/treeProcessor.d.ts
index 725de8a..fdeee94 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/treeProcessor.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/treeProcessor.d.ts
@@ -13,13 +13,13 @@
     tree: TreeNode;
 };
 export declare type TreeNode = {
-    afterAllFns: Array<any>;
-    beforeAllFns: Array<any>;
+    afterAllFns: Array<unknown>;
+    beforeAllFns: Array<unknown>;
     disabled?: boolean;
     execute: (onComplete: () => void, enabled: boolean) => void;
     id: string;
     onException: (error: Error) => void;
-    sharedUserContext: () => any;
+    sharedUserContext: () => unknown;
     children?: Array<TreeNode>;
 } & Pick<Suite, 'getResult' | 'parentSuite' | 'result' | 'markedPending'>;
 export default function treeProcessor(options: Options): void;
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/build/types.d.ts b/node_modules/jest-circus/node_modules/jest-jasmine2/build/types.d.ts
index 89f1997..10edc07 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/build/types.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/build/types.d.ts
@@ -28,7 +28,7 @@
 };
 export declare type AsyncExpectationResult = Promise<SyncExpectationResult>;
 export declare type ExpectationResult = SyncExpectationResult | AsyncExpectationResult;
-export declare type RawMatcherFn = (expected: any, actual: any, options?: any) => ExpectationResult;
+export declare type RawMatcherFn = (expected: unknown, actual: unknown, options?: unknown) => ExpectationResult;
 export declare type RunDetails = {
     totalSpecsDefined?: number;
     failedExpectations?: SuiteResult['failedExpectations'];
diff --git a/node_modules/jest-circus/node_modules/jest-jasmine2/package.json b/node_modules/jest-circus/node_modules/jest-jasmine2/package.json
index 1c9f3b9..1041f22 100644
--- a/node_modules/jest-circus/node_modules/jest-jasmine2/package.json
+++ b/node_modules/jest-circus/node_modules/jest-jasmine2/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-jasmine2",
-  "version": "26.4.2",
+  "version": "26.5.3",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -11,22 +11,22 @@
   "types": "build/index.d.ts",
   "dependencies": {
     "@babel/traverse": "^7.1.0",
-    "@jest/environment": "^26.3.0",
-    "@jest/source-map": "^26.3.0",
-    "@jest/test-result": "^26.3.0",
-    "@jest/types": "^26.3.0",
+    "@jest/environment": "^26.5.2",
+    "@jest/source-map": "^26.5.0",
+    "@jest/test-result": "^26.5.2",
+    "@jest/types": "^26.5.2",
     "@types/node": "*",
     "chalk": "^4.0.0",
     "co": "^4.6.0",
-    "expect": "^26.4.2",
+    "expect": "^26.5.3",
     "is-generator-fn": "^2.0.0",
-    "jest-each": "^26.4.2",
-    "jest-matcher-utils": "^26.4.2",
-    "jest-message-util": "^26.3.0",
-    "jest-runtime": "^26.4.2",
-    "jest-snapshot": "^26.4.2",
-    "jest-util": "^26.3.0",
-    "pretty-format": "^26.4.2",
+    "jest-each": "^26.5.2",
+    "jest-matcher-utils": "^26.5.2",
+    "jest-message-util": "^26.5.2",
+    "jest-runtime": "^26.5.3",
+    "jest-snapshot": "^26.5.3",
+    "jest-util": "^26.5.2",
+    "pretty-format": "^26.5.2",
     "throat": "^5.0.0"
   },
   "devDependencies": {
@@ -39,5 +39,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "71152afbbda76fd09ddb2527b54c365d753f42aa"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-leak-detector/package.json b/node_modules/jest-circus/node_modules/jest-leak-detector/package.json
index d3aec9b..3a3ae55 100644
--- a/node_modules/jest-circus/node_modules/jest-leak-detector/package.json
+++ b/node_modules/jest-circus/node_modules/jest-leak-detector/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-leak-detector",
-  "version": "26.4.2",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -11,7 +11,7 @@
   "types": "build/index.d.ts",
   "dependencies": {
     "jest-get-type": "^26.3.0",
-    "pretty-format": "^26.4.2"
+    "pretty-format": "^26.5.2"
   },
   "devDependencies": {
     "@types/weak-napi": "^2.0.0",
@@ -23,5 +23,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-message-util/package.json b/node_modules/jest-circus/node_modules/jest-message-util/package.json
index 6f8b6c4..2bbf224 100644
--- a/node_modules/jest-circus/node_modules/jest-message-util/package.json
+++ b/node_modules/jest-circus/node_modules/jest-message-util/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-message-util",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -14,8 +14,8 @@
   "types": "build/index.d.ts",
   "dependencies": {
     "@babel/code-frame": "^7.0.0",
-    "@jest/types": "^26.3.0",
-    "@types/stack-utils": "^1.0.1",
+    "@jest/types": "^26.5.2",
+    "@types/stack-utils": "^2.0.0",
     "chalk": "^4.0.0",
     "graceful-fs": "^4.2.4",
     "micromatch": "^4.0.2",
@@ -30,5 +30,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-mock/build/index.d.ts b/node_modules/jest-circus/node_modules/jest-mock/build/index.d.ts
index 4360cd5..ce7ba58 100644
--- a/node_modules/jest-circus/node_modules/jest-mock/build/index.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-mock/build/index.d.ts
@@ -42,12 +42,13 @@
         mockReturnThis(): this;
         mockReturnValue(value: T): this;
         mockReturnValueOnce(value: T): this;
-        mockResolvedValue(value: T): this;
-        mockResolvedValueOnce(value: T): this;
-        mockRejectedValue(value: T): this;
-        mockRejectedValueOnce(value: T): this;
+        mockResolvedValue(value: Unpromisify<T>): this;
+        mockResolvedValueOnce(value: Unpromisify<T>): this;
+        mockRejectedValue(value: unknown): this;
+        mockRejectedValueOnce(value: unknown): this;
     }
 }
+declare type Unpromisify<T> = T extends Promise<infer R> ? R : never;
 /**
  * Possible types of a MockFunctionResult.
  * 'return': The call completed by returning normally.
diff --git a/node_modules/jest-circus/node_modules/jest-mock/build/index.js b/node_modules/jest-circus/node_modules/jest-mock/build/index.js
index 7c1e40d..2ebc513 100644
--- a/node_modules/jest-circus/node_modules/jest-mock/build/index.js
+++ b/node_modules/jest-circus/node_modules/jest-mock/build/index.js
@@ -21,6 +21,8 @@
  * LICENSE file in the root directory of this source tree.
  */
 
+/* eslint-disable local/ban-types-eventually, local/prefer-rest-params-eventually */
+
 /**
  * Possible types of a MockFunctionResult.
  * 'return': The call completed by returning normally.
@@ -909,7 +911,6 @@
     return value == null ? '' + value : typeof value;
   }
 }
-/* eslint-disable-next-line no-redeclare */
 
 const JestMock = new ModuleMockerClass(global);
 module.exports = JestMock;
diff --git a/node_modules/jest-circus/node_modules/jest-mock/package.json b/node_modules/jest-circus/node_modules/jest-mock/package.json
index 7478b55..7d60952 100644
--- a/node_modules/jest-circus/node_modules/jest-mock/package.json
+++ b/node_modules/jest-circus/node_modules/jest-mock/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-mock",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,7 +10,7 @@
     "node": ">= 10.14.2"
   },
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "@types/node": "*"
   },
   "license": "MIT",
@@ -19,5 +19,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-resolve/build/index.js b/node_modules/jest-circus/node_modules/jest-resolve/build/index.js
index 1864578..2097b7f 100644
--- a/node_modules/jest-circus/node_modules/jest-resolve/build/index.js
+++ b/node_modules/jest-circus/node_modules/jest-resolve/build/index.js
@@ -121,7 +121,6 @@
       .filter(Boolean) // The resolver expects absolute paths.
       .map(p => path().resolve(resolvedCwd, p))
   : undefined;
-/* eslint-disable-next-line no-redeclare */
 
 class Resolver {
   constructor(moduleMap, options) {
diff --git a/node_modules/jest-circus/node_modules/jest-resolve/package.json b/node_modules/jest-circus/node_modules/jest-resolve/package.json
index ba8f507..c1b112f 100644
--- a/node_modules/jest-circus/node_modules/jest-resolve/package.json
+++ b/node_modules/jest-circus/node_modules/jest-resolve/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-resolve",
-  "version": "26.4.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,11 +10,11 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "chalk": "^4.0.0",
     "graceful-fs": "^4.2.4",
     "jest-pnp-resolver": "^1.2.2",
-    "jest-util": "^26.3.0",
+    "jest-util": "^26.5.2",
     "read-pkg-up": "^7.0.1",
     "resolve": "^1.17.0",
     "slash": "^3.0.0"
@@ -22,7 +22,7 @@
   "devDependencies": {
     "@types/graceful-fs": "^4.1.3",
     "@types/resolve": "^1.17.0",
-    "jest-haste-map": "^26.3.0"
+    "jest-haste-map": "^26.5.2"
   },
   "engines": {
     "node": ">= 10.14.2"
@@ -30,5 +30,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "0b1e41d1d93ce4d15646f4a39fd5a7ffae5f43c3"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-runner/build/index.js b/node_modules/jest-circus/node_modules/jest-runner/build/index.js
index 06812c1..645a536 100644
--- a/node_modules/jest-circus/node_modules/jest-runner/build/index.js
+++ b/node_modules/jest-circus/node_modules/jest-runner/build/index.js
@@ -82,7 +82,6 @@
 
 const TEST_WORKER_PATH = require.resolve('./testWorker');
 
-/* eslint-disable-next-line no-redeclare */
 class TestRunner {
   constructor(globalConfig, context) {
     _defineProperty(this, '_globalConfig', void 0);
diff --git a/node_modules/jest-circus/node_modules/jest-runner/build/runTest.js b/node_modules/jest-circus/node_modules/jest-runner/build/runTest.js
index 61f8eac..ffb1b4c 100644
--- a/node_modules/jest-circus/node_modules/jest-runner/build/runTest.js
+++ b/node_modules/jest-circus/node_modules/jest-runner/build/runTest.js
@@ -222,13 +222,14 @@
   const TestEnvironment = (0, _jestUtil().interopRequireDefault)(
     require(testEnvironment)
   ).default;
-  const testFramework =
-    process.env.JEST_CIRCUS === '1'
-      ? require('jest-circus/runner') // eslint-disable-line import/no-extraneous-dependencies
-      : require(config.testRunner);
-  const Runtime = config.moduleLoader
-    ? require(config.moduleLoader)
-    : require('jest-runtime');
+  const testFramework = (0, _jestUtil().interopRequireDefault)(
+    process.env.JEST_CIRCUS === '1' // eslint-disable-next-line import/no-extraneous-dependencies
+      ? require('jest-circus/runner')
+      : require(config.testRunner)
+  ).default;
+  const Runtime = (0, _jestUtil().interopRequireDefault)(
+    config.moduleLoader ? require(config.moduleLoader) : require('jest-runtime')
+  ).default;
   const consoleOut = globalConfig.useStderr ? process.stderr : process.stdout;
 
   const consoleFormatter = (type, message) =>
@@ -270,18 +271,25 @@
     [path]: testSource
   };
   (0, _jestUtil().setGlobal)(environment.global, 'console', testConsole);
-  const runtime = new Runtime(config, environment, resolver, cacheFS, {
-    changedFiles:
-      context === null || context === void 0 ? void 0 : context.changedFiles,
-    collectCoverage: globalConfig.collectCoverage,
-    collectCoverageFrom: globalConfig.collectCoverageFrom,
-    collectCoverageOnlyFrom: globalConfig.collectCoverageOnlyFrom,
-    coverageProvider: globalConfig.coverageProvider,
-    sourcesRelatedToTestsInChangedFiles:
-      context === null || context === void 0
-        ? void 0
-        : context.sourcesRelatedToTestsInChangedFiles
-  });
+  const runtime = new Runtime(
+    config,
+    environment,
+    resolver,
+    cacheFS,
+    {
+      changedFiles:
+        context === null || context === void 0 ? void 0 : context.changedFiles,
+      collectCoverage: globalConfig.collectCoverage,
+      collectCoverageFrom: globalConfig.collectCoverageFrom,
+      collectCoverageOnlyFrom: globalConfig.collectCoverageOnlyFrom,
+      coverageProvider: globalConfig.coverageProvider,
+      sourcesRelatedToTestsInChangedFiles:
+        context === null || context === void 0
+          ? void 0
+          : context.sourcesRelatedToTestsInChangedFiles
+    },
+    path
+  );
   const start = Date.now();
 
   for (const path of config.setupFiles) {
diff --git a/node_modules/jest-circus/node_modules/jest-runner/package.json b/node_modules/jest-circus/node_modules/jest-runner/package.json
index f679d72..a179134 100644
--- a/node_modules/jest-circus/node_modules/jest-runner/package.json
+++ b/node_modules/jest-circus/node_modules/jest-runner/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-runner",
-  "version": "26.4.2",
+  "version": "26.5.3",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,24 +10,24 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/console": "^26.3.0",
-    "@jest/environment": "^26.3.0",
-    "@jest/test-result": "^26.3.0",
-    "@jest/types": "^26.3.0",
+    "@jest/console": "^26.5.2",
+    "@jest/environment": "^26.5.2",
+    "@jest/test-result": "^26.5.2",
+    "@jest/types": "^26.5.2",
     "@types/node": "*",
     "chalk": "^4.0.0",
     "emittery": "^0.7.1",
     "exit": "^0.1.2",
     "graceful-fs": "^4.2.4",
-    "jest-config": "^26.4.2",
+    "jest-config": "^26.5.3",
     "jest-docblock": "^26.0.0",
-    "jest-haste-map": "^26.3.0",
-    "jest-leak-detector": "^26.4.2",
-    "jest-message-util": "^26.3.0",
-    "jest-resolve": "^26.4.0",
-    "jest-runtime": "^26.4.2",
-    "jest-util": "^26.3.0",
-    "jest-worker": "^26.3.0",
+    "jest-haste-map": "^26.5.2",
+    "jest-leak-detector": "^26.5.2",
+    "jest-message-util": "^26.5.2",
+    "jest-resolve": "^26.5.2",
+    "jest-runtime": "^26.5.3",
+    "jest-util": "^26.5.2",
+    "jest-worker": "^26.5.0",
     "source-map-support": "^0.5.6",
     "throat": "^5.0.0"
   },
@@ -35,7 +35,7 @@
     "@types/exit": "^0.1.30",
     "@types/graceful-fs": "^4.1.2",
     "@types/source-map-support": "^0.5.0",
-    "jest-circus": "^26.4.2"
+    "jest-circus": "^26.5.3"
   },
   "engines": {
     "node": ">= 10.14.2"
@@ -43,5 +43,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "71152afbbda76fd09ddb2527b54c365d753f42aa"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-runtime/build/cli/index.js b/node_modules/jest-circus/node_modules/jest-runtime/build/cli/index.js
index cffed68..fa509b7 100644
--- a/node_modules/jest-circus/node_modules/jest-runtime/build/cli/index.js
+++ b/node_modules/jest-circus/node_modules/jest-runtime/build/cli/index.js
@@ -195,7 +195,7 @@
   const options = await (0, _jestConfig().readConfig)(argv, root);
   const globalConfig = options.globalConfig; // Always disable automocking in scripts.
 
-  const config = {...options.projectConfig, automock: false}; // Break circular dependency
+  const config = {...options.projectConfig, automock: false};
 
   const Runtime = require('..');
 
@@ -221,7 +221,14 @@
       'jestGlobalConfig',
       globalConfig
     );
-    const runtime = new Runtime(config, environment, hasteMap.resolver);
+    const runtime = new Runtime(
+      config,
+      environment,
+      hasteMap.resolver,
+      undefined,
+      undefined,
+      filePath
+    );
 
     for (const path of config.setupFiles) {
       var _runtime$unstable_sho;
diff --git a/node_modules/jest-circus/node_modules/jest-runtime/build/index.d.ts b/node_modules/jest-circus/node_modules/jest-runtime/build/index.d.ts
index 3caec12..a01bba1 100644
--- a/node_modules/jest-circus/node_modules/jest-runtime/build/index.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-runtime/build/index.d.ts
@@ -4,8 +4,9 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
-import type { Config } from '@jest/types';
+import type { Config, Global } from '@jest/types';
 import type { JestEnvironment } from '@jest/environment';
+import type * as JestGlobals from '@jest/globals';
 import type { SourceMapRegistry } from '@jest/source-map';
 import { ShouldInstrumentOptions, shouldInstrument } from '@jest/transform';
 import type { V8CoverageResult } from '@jest/test-result';
@@ -13,6 +14,9 @@
 import Resolver = require('jest-resolve');
 import type { Context as JestContext } from './types';
 import { options as cliOptions } from './cli/args';
+interface JestGlobals extends Global.TestFrameworkGlobals {
+    expect: typeof JestGlobals.expect;
+}
 declare type HasteMapOptions = {
     console?: Console;
     maxWorkers: number;
@@ -39,6 +43,7 @@
     private _fakeTimersImplementation;
     private _internalModuleRegistry;
     private _isCurrentlyExecutingManualMock;
+    private _mainModule;
     private _mockFactories;
     private _mockMetaDataCache;
     private _mockRegistry;
@@ -47,6 +52,7 @@
     private _isolatedModuleRegistry;
     private _moduleRegistry;
     private _esmoduleRegistry;
+    private _testPath;
     private _resolver;
     private _shouldAutoMock;
     private _shouldMockModuleCache;
@@ -61,7 +67,8 @@
     private _virtualMocks;
     private _moduleImplementation?;
     private jestObjectCaches;
-    constructor(config: Config.ProjectConfig, environment: JestEnvironment, resolver: Resolver, cacheFS?: Record<string, string>, coverageOptions?: ShouldInstrumentOptions);
+    private jestGlobals?;
+    constructor(config: Config.ProjectConfig, environment: JestEnvironment, resolver: Resolver, cacheFS?: Record<string, string>, coverageOptions?: ShouldInstrumentOptions, testPath?: Config.Path);
     static shouldInstrument: typeof shouldInstrument;
     static createContext(config: Config.ProjectConfig, options: {
         console?: Console;
@@ -115,11 +122,13 @@
     private _createJestObjectFor;
     private _logFormattedReferenceError;
     private wrapCodeInModuleWrapper;
+    private constructModuleWrapperStart;
     private constructInjectedModuleParameters;
     private handleExecutionError;
     private getGlobalsForCjs;
     private getGlobalsForEsm;
     private getGlobalsFromEnvironment;
     private readFile;
+    setGlobalsForRuntime(globals: JestGlobals): void;
 }
 export = Runtime;
diff --git a/node_modules/jest-circus/node_modules/jest-runtime/build/index.js b/node_modules/jest-circus/node_modules/jest-runtime/build/index.js
index 1d094a6..d3e3ada 100644
--- a/node_modules/jest-circus/node_modules/jest-runtime/build/index.js
+++ b/node_modules/jest-circus/node_modules/jest-runtime/build/index.js
@@ -267,10 +267,16 @@
 const unmockRegExpCache = new WeakMap();
 const EVAL_RESULT_VARIABLE = 'Object.<anonymous>';
 const runtimeSupportsVmModules = typeof _vm().SyntheticModule === 'function';
-/* eslint-disable-next-line no-redeclare */
 
 class Runtime {
-  constructor(config, environment, resolver, cacheFS = {}, coverageOptions) {
+  constructor(
+    config,
+    environment,
+    resolver,
+    cacheFS = {},
+    coverageOptions, // TODO: Make mandatory in Jest 27
+    testPath
+  ) {
     _defineProperty(this, '_cacheFS', void 0);
 
     _defineProperty(this, '_config', void 0);
@@ -289,6 +295,8 @@
 
     _defineProperty(this, '_isCurrentlyExecutingManualMock', void 0);
 
+    _defineProperty(this, '_mainModule', void 0);
+
     _defineProperty(this, '_mockFactories', void 0);
 
     _defineProperty(this, '_mockMetaDataCache', void 0);
@@ -305,6 +313,8 @@
 
     _defineProperty(this, '_esmoduleRegistry', void 0);
 
+    _defineProperty(this, '_testPath', void 0);
+
     _defineProperty(this, '_resolver', void 0);
 
     _defineProperty(this, '_shouldAutoMock', void 0);
@@ -333,6 +343,8 @@
 
     _defineProperty(this, 'jestObjectCaches', void 0);
 
+    _defineProperty(this, 'jestGlobals', void 0);
+
     _defineProperty(
       this,
       'unstable_shouldLoadAsEsm',
@@ -354,6 +366,7 @@
     this._explicitShouldMock = new Map();
     this._internalModuleRegistry = new Map();
     this._isCurrentlyExecutingManualMock = null;
+    this._mainModule = null;
     this._mockFactories = new Map();
     this._mockRegistry = new Map(); // during setup, this cannot be null (and it's fine to explode if it is)
 
@@ -362,6 +375,7 @@
     this._isolatedMockRegistry = null;
     this._moduleRegistry = new Map();
     this._esmoduleRegistry = new Map();
+    this._testPath = testPath;
     this._resolver = resolver;
     this._scriptTransformer = new (_transform().ScriptTransformer)(config);
     this._shouldAutoMock = config.automock;
@@ -510,7 +524,12 @@
       const module = new (_vm().SourceTextModule)(transformedCode, {
         context,
         identifier: modulePath,
-        importModuleDynamically: this.linkModules.bind(this),
+        importModuleDynamically: (specifier, referencingModule) =>
+          this.linkModules(
+            specifier,
+            referencingModule.identifier,
+            referencingModule.context
+          ),
 
         initializeImportMeta(meta) {
           meta.url = (0, _url().pathToFileURL)(modulePath).href;
@@ -522,7 +541,13 @@
         // parallel can all await it. We then await it synchronously below, so
         // we shouldn't get any unhandled rejections
         module
-          .link(this.linkModules.bind(this))
+          .link((specifier, referencingModule) =>
+            this.linkModules(
+              specifier,
+              referencingModule.identifier,
+              referencingModule.context
+            )
+          )
           .then(() => module.evaluate())
           .then(() => module)
       );
@@ -534,7 +559,7 @@
     return module;
   }
 
-  linkModules(specifier, referencingModule) {
+  linkModules(specifier, referencingIdentifier, context) {
     if (specifier === '@jest/globals') {
       const fromCache = this._esmoduleRegistry.get('@jest/globals');
 
@@ -542,10 +567,7 @@
         return fromCache;
       }
 
-      const globals = this.getGlobalsForEsm(
-        referencingModule.identifier,
-        referencingModule.context
-      );
+      const globals = this.getGlobalsForEsm(referencingIdentifier, context);
 
       this._esmoduleRegistry.set('@jest/globals', globals);
 
@@ -554,7 +576,7 @@
 
     const [path, query] = specifier.split('?');
 
-    const resolved = this._resolveModule(referencingModule.identifier, path);
+    const resolved = this._resolveModule(referencingIdentifier, path);
 
     if (
       this._resolver.isCoreModule(resolved) ||
@@ -563,11 +585,7 @@
       return this.loadEsmModule(resolved, query);
     }
 
-    return this.loadCjsAsEsm(
-      referencingModule.identifier,
-      resolved,
-      referencingModule.context
-    );
+    return this.loadCjsAsEsm(referencingIdentifier, resolved, context);
   }
 
   async unstable_importModule(from, moduleName) {
@@ -585,7 +603,7 @@
     return this.loadEsmModule(modulePath, query);
   }
 
-  async loadCjsAsEsm(from, modulePath, context) {
+  loadCjsAsEsm(from, modulePath, context) {
     // CJS loaded via `import` should share cache with other CJS: https://github.com/nodejs/modules/issues/503
     const cjs = this.requireModuleOrMock(from, modulePath);
     const module = new (_vm().SyntheticModule)(
@@ -599,11 +617,7 @@
         identifier: modulePath
       }
     );
-    await module.link(() => {
-      throw new Error('This should never happen');
-    });
-    await module.evaluate();
-    return module;
+    return evaluateSyntheticModule(module);
   }
 
   requireModule(from, moduleName, options, isRequireActual) {
@@ -672,7 +686,8 @@
       exports: {},
       filename: modulePath,
       id: modulePath,
-      loaded: false
+      loaded: false,
+      path: path().dirname(modulePath)
     };
     moduleRegistry.set(modulePath, localModule);
 
@@ -778,7 +793,8 @@
         exports: {},
         filename: modulePath,
         id: modulePath,
-        loaded: false
+        loaded: false,
+        path: path().dirname(modulePath)
       };
 
       this._loadModule(
@@ -994,7 +1010,7 @@
           result
         };
       });
-  } // TODO - remove in Jest 26
+  } // TODO - remove in Jest 27
 
   getSourceMapInfo(_coveredFiles) {
     return {};
@@ -1041,6 +1057,8 @@
 
     this._internalModuleRegistry.clear();
 
+    this._mainModule = null;
+
     this._mockFactories.clear();
 
     this._mockMetaDataCache.clear();
@@ -1149,14 +1167,14 @@
       return;
     }
 
-    const filename = localModule.filename;
+    const module = localModule;
+    const filename = module.filename;
     const lastExecutingModulePath = this._currentlyExecutingModulePath;
     this._currentlyExecutingModulePath = filename;
     const origCurrExecutingManualMock = this._isCurrentlyExecutingManualMock;
     this._isCurrentlyExecutingManualMock = filename;
-    const dirname = path().dirname(filename);
-    localModule.children = [];
-    Object.defineProperty(localModule, 'parent', {
+    module.children = [];
+    Object.defineProperty(module, 'parent', {
       enumerable: true,
 
       get() {
@@ -1164,40 +1182,29 @@
         return moduleRegistry.get(key) || null;
       }
     });
-    localModule.paths = this._resolver.getModulePaths(dirname);
-    Object.defineProperty(localModule, 'require', {
-      value: this._createRequireImplementation(localModule, options)
+    module.paths = this._resolver.getModulePaths(module.path);
+    Object.defineProperty(module, 'require', {
+      value: this._createRequireImplementation(module, options)
     });
     const transformedCode = this.transformFile(filename, options);
-    let compiledFunction = null; // Use this if available instead of deprecated `JestEnvironment.runScript`
+    let compiledFunction = null;
+    const script = this.createScriptFromCode(transformedCode, filename);
+    let runScript = null; // Use this if available instead of deprecated `JestEnvironment.runScript`
 
     if (typeof this._environment.getVmContext === 'function') {
       const vmContext = this._environment.getVmContext();
 
       if (vmContext) {
-        try {
-          compiledFunction = (0, _vm().compileFunction)(
-            transformedCode,
-            this.constructInjectedModuleParameters(),
-            {
-              filename,
-              parsingContext: vmContext
-            }
-          );
-        } catch (e) {
-          throw (0, _transform().handlePotentialSyntaxError)(e);
-        }
+        runScript = script.runInContext(vmContext, {
+          filename
+        });
       }
     } else {
-      const script = this.createScriptFromCode(transformedCode, filename);
+      runScript = this._environment.runScript(script);
+    }
 
-      const runScript = this._environment.runScript(script);
-
-      if (runScript === null) {
-        compiledFunction = null;
-      } else {
-        compiledFunction = runScript[EVAL_RESULT_VARIABLE];
-      }
+    if (runScript !== null) {
+      compiledFunction = runScript[EVAL_RESULT_VARIABLE];
     }
 
     if (compiledFunction === null) {
@@ -1212,29 +1219,41 @@
     const jestObject = this._createJestObjectFor(filename);
 
     this.jestObjectCaches.set(filename, jestObject);
+    const lastArgs = [
+      this._config.injectGlobals ? jestObject : undefined, // jest object
+      this._config.extraGlobals.map(globalVariable => {
+        if (this._environment.global[globalVariable]) {
+          return this._environment.global[globalVariable];
+        }
+
+        throw new Error(
+          `You have requested '${globalVariable}' as a global variable, but it was not present. Please check your config or your global environment.`
+        );
+      })
+    ];
+
+    if (!this._mainModule && filename === this._testPath) {
+      this._mainModule = module;
+    }
+
+    Object.defineProperty(module, 'main', {
+      enumerable: true,
+      value: this._mainModule
+    });
 
     try {
       compiledFunction.call(
-        localModule.exports,
-        localModule, // module object
-        localModule.exports, // module exports
-        localModule.require, // require implementation
-        dirname, // __dirname
-        filename, // __filename
+        module.exports,
+        module, // module object
+        module.exports, // module exports
+        module.require, // require implementation
+        module.path, // __dirname
+        module.filename, // __filename
         this._environment.global, // global object
-        jestObject, // jest object
-        ...this._config.extraGlobals.map(globalVariable => {
-          if (this._environment.global[globalVariable]) {
-            return this._environment.global[globalVariable];
-          }
-
-          throw new Error(
-            `You have requested '${globalVariable}' as a global variable, but it was not present. Please check your config or your global environment.`
-          );
-        })
+        ...lastArgs.filter(notEmpty)
       );
     } catch (error) {
-      this.handleExecutionError(error, localModule);
+      this.handleExecutionError(error, module);
     }
 
     this._isCurrentlyExecutingManualMock = origCurrExecutingManualMock;
@@ -1256,7 +1275,10 @@
       source
     );
 
-    this._fileTransforms.set(filename, transformedFile);
+    this._fileTransforms.set(filename, {
+      ...transformedFile,
+      wrapperLength: this.constructModuleWrapperStart().length
+    });
 
     if (transformedFile.sourceMapPath) {
       this._sourceMapRegistry.set(filename, transformedFile.sourceMapPath);
@@ -1267,11 +1289,24 @@
 
   createScriptFromCode(scriptSource, filename) {
     try {
+      const scriptFilename = this._resolver.isCoreModule(filename)
+        ? `jest-nodejs-core-${filename}`
+        : filename;
       return new (_vm().Script)(this.wrapCodeInModuleWrapper(scriptSource), {
         displayErrors: true,
-        filename: this._resolver.isCoreModule(filename)
-          ? `jest-nodejs-core-${filename}`
-          : filename
+        filename: scriptFilename,
+        // @ts-expect-error: Experimental ESM API
+        importModuleDynamically: specifier => {
+          var _this$_environment$ge, _this$_environment;
+
+          const context =
+            (_this$_environment$ge = (_this$_environment = this._environment)
+              .getVmContext) === null || _this$_environment$ge === void 0
+              ? void 0
+              : _this$_environment$ge.call(_this$_environment);
+          invariant(context);
+          return this.linkModules(specifier, scriptFilename, context);
+        }
       });
     } catch (e) {
       throw (0, _transform().handlePotentialSyntaxError)(e);
@@ -1293,7 +1328,7 @@
   _importCoreModule(moduleName, context) {
     const required = this._requireCoreModule(moduleName);
 
-    return new (_vm().SyntheticModule)(
+    const module = new (_vm().SyntheticModule)(
       ['default', ...Object.keys(required)],
       function () {
         // @ts-expect-error: TS doesn't know what `this` is
@@ -1308,6 +1343,7 @@
         identifier: moduleName
       }
     );
+    return evaluateSyntheticModule(module);
   }
 
   _getMockedNativeModule() {
@@ -1337,7 +1373,8 @@
         exports: {},
         filename,
         id: filename,
-        loaded: false
+        loaded: false,
+        path: path().dirname(filename)
       });
     }; // should we implement the class ourselves?
 
@@ -1557,20 +1594,7 @@
 
     Object.defineProperty(moduleRequire, 'main', {
       enumerable: true,
-
-      get() {
-        let mainModule = from.parent;
-
-        while (
-          mainModule &&
-          mainModule.parent &&
-          mainModule.id !== mainModule.parent.id
-        ) {
-          mainModule = mainModule.parent;
-        }
-
-        return mainModule;
-      }
+      value: this._testPath ? this._moduleRegistry.get(this._testPath) : null
     });
     return moduleRequire;
   }
@@ -1805,14 +1829,12 @@
   }
 
   wrapCodeInModuleWrapper(content) {
+    return this.constructModuleWrapperStart() + content + '\n}});';
+  }
+
+  constructModuleWrapperStart() {
     const args = this.constructInjectedModuleParameters();
-    return (
-      '({"' +
-      EVAL_RESULT_VARIABLE +
-      `":function(${args.join(',')}){` +
-      content +
-      '\n}});'
-    );
+    return '({"' + EVAL_RESULT_VARIABLE + `":function(${args.join(',')}){`;
   }
 
   constructInjectedModuleParameters() {
@@ -1823,9 +1845,9 @@
       '__dirname',
       '__filename',
       'global',
-      'jest',
+      this._config.injectGlobals ? 'jest' : undefined,
       ...this._config.extraGlobals
-    ];
+    ].filter(notEmpty);
   }
 
   handleExecutionError(e, module) {
@@ -1856,7 +1878,7 @@
     return {...this.getGlobalsFromEnvironment(), jest};
   }
 
-  async getGlobalsForEsm(from, context) {
+  getGlobalsForEsm(from, context) {
     let jest = this.jestObjectCaches.get(from);
 
     if (!jest) {
@@ -1878,14 +1900,14 @@
         identifier: '@jest/globals'
       }
     );
-    await module.link(() => {
-      throw new Error('This should never happen');
-    });
-    await module.evaluate();
-    return module;
+    return evaluateSyntheticModule(module);
   }
 
   getGlobalsFromEnvironment() {
+    if (this.jestGlobals) {
+      return {...this.jestGlobals};
+    }
+
     return {
       afterAll: this._environment.global.afterAll,
       afterEach: this._environment.global.afterEach,
@@ -1914,6 +1936,10 @@
 
     return source;
   }
+
+  setGlobalsForRuntime(globals) {
+    this.jestGlobals = globals;
+  }
 }
 
 _defineProperty(Runtime, 'shouldInstrument', _transform().shouldInstrument);
@@ -1924,4 +1950,16 @@
   }
 }
 
+function notEmpty(value) {
+  return value !== null && value !== undefined;
+}
+
+async function evaluateSyntheticModule(module) {
+  await module.link(() => {
+    throw new Error('This should never happen');
+  });
+  await module.evaluate();
+  return module;
+}
+
 module.exports = Runtime;
diff --git a/node_modules/jest-circus/node_modules/jest-runtime/package.json b/node_modules/jest-circus/node_modules/jest-runtime/package.json
index 1cbc65e..ac13f6b 100644
--- a/node_modules/jest-circus/node_modules/jest-runtime/package.json
+++ b/node_modules/jest-circus/node_modules/jest-runtime/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-runtime",
-  "version": "26.4.2",
+  "version": "26.5.3",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,41 +10,41 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/console": "^26.3.0",
-    "@jest/environment": "^26.3.0",
-    "@jest/fake-timers": "^26.3.0",
-    "@jest/globals": "^26.4.2",
-    "@jest/source-map": "^26.3.0",
-    "@jest/test-result": "^26.3.0",
-    "@jest/transform": "^26.3.0",
-    "@jest/types": "^26.3.0",
+    "@jest/console": "^26.5.2",
+    "@jest/environment": "^26.5.2",
+    "@jest/fake-timers": "^26.5.2",
+    "@jest/globals": "^26.5.3",
+    "@jest/source-map": "^26.5.0",
+    "@jest/test-result": "^26.5.2",
+    "@jest/transform": "^26.5.2",
+    "@jest/types": "^26.5.2",
     "@types/yargs": "^15.0.0",
     "chalk": "^4.0.0",
     "collect-v8-coverage": "^1.0.0",
     "exit": "^0.1.2",
     "glob": "^7.1.3",
     "graceful-fs": "^4.2.4",
-    "jest-config": "^26.4.2",
-    "jest-haste-map": "^26.3.0",
-    "jest-message-util": "^26.3.0",
-    "jest-mock": "^26.3.0",
+    "jest-config": "^26.5.3",
+    "jest-haste-map": "^26.5.2",
+    "jest-message-util": "^26.5.2",
+    "jest-mock": "^26.5.2",
     "jest-regex-util": "^26.0.0",
-    "jest-resolve": "^26.4.0",
-    "jest-snapshot": "^26.4.2",
-    "jest-util": "^26.3.0",
-    "jest-validate": "^26.4.2",
+    "jest-resolve": "^26.5.2",
+    "jest-snapshot": "^26.5.3",
+    "jest-util": "^26.5.2",
+    "jest-validate": "^26.5.3",
     "slash": "^3.0.0",
     "strip-bom": "^4.0.0",
-    "yargs": "^15.3.1"
+    "yargs": "^15.4.1"
   },
   "devDependencies": {
-    "@jest/test-utils": "^26.3.0",
+    "@jest/test-utils": "^26.5.0",
     "@types/exit": "^0.1.30",
     "@types/glob": "^7.1.1",
     "@types/graceful-fs": "^4.1.2",
     "@types/node": "^14.0.27",
     "execa": "^4.0.0",
-    "jest-environment-node": "^26.3.0",
+    "jest-environment-node": "^26.5.2",
     "jest-snapshot-serializer-raw": "^1.1.0"
   },
   "bin": "./bin/jest-runtime.js",
@@ -54,5 +54,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "71152afbbda76fd09ddb2527b54c365d753f42aa"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-serializer/build/index.d.ts b/node_modules/jest-circus/node_modules/jest-serializer/build/index.d.ts
index fe76bde..af6694e 100644
--- a/node_modules/jest-circus/node_modules/jest-serializer/build/index.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-serializer/build/index.d.ts
@@ -7,9 +7,9 @@
 /// <reference path="../v8.d.ts" />
 /// <reference types="node" />
 declare type Path = string;
-export declare function deserialize(buffer: Buffer): any;
+export declare function deserialize(buffer: Buffer): unknown;
 export declare function serialize(content: unknown): Buffer;
-export declare function readFileSync(filePath: Path): any;
+export declare function readFileSync(filePath: Path): unknown;
 export declare function writeFileSync(filePath: Path, content: unknown): void;
 declare const _default: {
     deserialize: typeof deserialize;
diff --git a/node_modules/jest-circus/node_modules/jest-serializer/package.json b/node_modules/jest-circus/node_modules/jest-serializer/package.json
index 08635bd..28df711 100644
--- a/node_modules/jest-circus/node_modules/jest-serializer/package.json
+++ b/node_modules/jest-circus/node_modules/jest-serializer/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-serializer",
-  "version": "26.3.0",
+  "version": "26.5.0",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -22,5 +22,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "68d1b1b638bc7464c2794a957c1b894de7da2ee3"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-snapshot/build/State.d.ts b/node_modules/jest-circus/node_modules/jest-snapshot/build/State.d.ts
index 6fb05fc..908ccf0 100644
--- a/node_modules/jest-circus/node_modules/jest-snapshot/build/State.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-snapshot/build/State.d.ts
@@ -5,10 +5,11 @@
  * LICENSE file in the root directory of this source tree.
  */
 import type { Config } from '@jest/types';
+import type { BabelTraverse, Prettier } from './types';
 export declare type SnapshotStateOptions = {
     updateSnapshot: Config.SnapshotUpdateState;
-    getPrettier: () => null | typeof import('prettier');
-    getBabelTraverse: () => Function;
+    getPrettier: () => null | Prettier;
+    getBabelTraverse: () => BabelTraverse;
     expand?: boolean;
 };
 export declare type SnapshotMatchOptions = {
diff --git a/node_modules/jest-circus/node_modules/jest-snapshot/build/index.d.ts b/node_modules/jest-circus/node_modules/jest-snapshot/build/index.d.ts
index 8542577..ce30682 100644
--- a/node_modules/jest-circus/node_modules/jest-snapshot/build/index.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-snapshot/build/index.d.ts
@@ -8,7 +8,7 @@
 import type { FS as HasteFS } from 'jest-haste-map';
 import { SnapshotResolver as JestSnapshotResolver } from './snapshot_resolver';
 import SnapshotState from './State';
-import type { Context } from './types';
+import type { Context, ExpectationResult } from './types';
 import * as utils from './utils';
 declare const JestSnapshot: {
     EXTENSION: string;
@@ -21,82 +21,10 @@
     };
     getSerializers: () => import("pretty-format/build/types").Plugins;
     isSnapshotPath: (path: string) => boolean;
-    toMatchInlineSnapshot: (this: Context, received: any, propertiesOrSnapshot?: string | object | undefined, inlineSnapshot?: string | undefined) => {
-        message: () => string;
-        name: string;
-        pass: boolean;
-        actual?: undefined;
-        expected?: undefined;
-    } | {
-        message: () => string;
-        pass: boolean;
-        name?: undefined;
-        actual?: undefined;
-        expected?: undefined;
-    } | {
-        actual: string;
-        expected: string | undefined;
-        message: () => string;
-        name: string;
-        pass: boolean;
-    };
-    toMatchSnapshot: (this: Context, received: any, propertiesOrHint?: string | object | undefined, hint?: string | undefined) => {
-        message: () => string;
-        name: string;
-        pass: boolean;
-        actual?: undefined;
-        expected?: undefined;
-    } | {
-        message: () => string;
-        pass: boolean;
-        name?: undefined;
-        actual?: undefined;
-        expected?: undefined;
-    } | {
-        actual: string;
-        expected: string | undefined;
-        message: () => string;
-        name: string;
-        pass: boolean;
-    };
-    toThrowErrorMatchingInlineSnapshot: (this: Context, received: any, inlineSnapshot?: string | undefined, fromPromise?: boolean | undefined) => {
-        message: () => string;
-        name: string;
-        pass: boolean;
-        actual?: undefined;
-        expected?: undefined;
-    } | {
-        message: () => string;
-        pass: boolean;
-        name?: undefined;
-        actual?: undefined;
-        expected?: undefined;
-    } | {
-        actual: string;
-        expected: string | undefined;
-        message: () => string;
-        name: string;
-        pass: boolean;
-    };
-    toThrowErrorMatchingSnapshot: (this: Context, received: any, hint: string | undefined, fromPromise: boolean) => {
-        message: () => string;
-        name: string;
-        pass: boolean;
-        actual?: undefined;
-        expected?: undefined;
-    } | {
-        message: () => string;
-        pass: boolean;
-        name?: undefined;
-        actual?: undefined;
-        expected?: undefined;
-    } | {
-        actual: string;
-        expected: string | undefined;
-        message: () => string;
-        name: string;
-        pass: boolean;
-    };
+    toMatchInlineSnapshot: (this: Context, received: unknown, propertiesOrSnapshot?: string | object | undefined, inlineSnapshot?: string | undefined) => ExpectationResult;
+    toMatchSnapshot: (this: Context, received: unknown, propertiesOrHint?: string | object | undefined, hint?: string | undefined) => ExpectationResult;
+    toThrowErrorMatchingInlineSnapshot: (this: Context, received: unknown, inlineSnapshot?: string | undefined, fromPromise?: boolean | undefined) => ExpectationResult;
+    toThrowErrorMatchingSnapshot: (this: Context, received: unknown, hint: string | undefined, fromPromise: boolean) => ExpectationResult;
     utils: typeof utils;
 };
 declare namespace JestSnapshot {
diff --git a/node_modules/jest-circus/node_modules/jest-snapshot/build/index.js b/node_modules/jest-circus/node_modules/jest-snapshot/build/index.js
index db825d4..2eee218 100644
--- a/node_modules/jest-circus/node_modules/jest-snapshot/build/index.js
+++ b/node_modules/jest-circus/node_modules/jest-snapshot/build/index.js
@@ -609,6 +609,4 @@
   toThrowErrorMatchingSnapshot,
   utils
 };
-/* eslint-disable-next-line no-redeclare */
-
 module.exports = JestSnapshot;
diff --git a/node_modules/jest-circus/node_modules/jest-snapshot/build/inline_snapshots.d.ts b/node_modules/jest-circus/node_modules/jest-snapshot/build/inline_snapshots.d.ts
index d464200..5ddaa57 100644
--- a/node_modules/jest-circus/node_modules/jest-snapshot/build/inline_snapshots.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-snapshot/build/inline_snapshots.d.ts
@@ -5,8 +5,9 @@
  * LICENSE file in the root directory of this source tree.
  */
 import type { Frame } from 'jest-message-util';
+import type { BabelTraverse, Prettier } from './types';
 export declare type InlineSnapshot = {
     snapshot: string;
     frame: Frame;
 };
-export declare function saveInlineSnapshots(snapshots: Array<InlineSnapshot>, prettier: typeof import('prettier') | null, babelTraverse: Function): void;
+export declare function saveInlineSnapshots(snapshots: Array<InlineSnapshot>, prettier: Prettier | null, babelTraverse: BabelTraverse): void;
diff --git a/node_modules/jest-circus/node_modules/jest-snapshot/build/inline_snapshots.js b/node_modules/jest-circus/node_modules/jest-snapshot/build/inline_snapshots.js
index 823be44..f02a55b 100644
--- a/node_modules/jest-circus/node_modules/jest-snapshot/build/inline_snapshots.js
+++ b/node_modules/jest-circus/node_modules/jest-snapshot/build/inline_snapshots.js
@@ -111,6 +111,7 @@
       })
     : null; // Detect the parser for the test file.
   // For older versions of Prettier, fallback to a simple parser detection.
+  // @ts-expect-error
 
   const inferredParser = prettier.getFileInfo
     ? prettier.getFileInfo.sync(sourceFilePath).inferredParser
@@ -279,6 +280,8 @@
   const ast = getAst(parsers, inferredParser, text);
   babelTraverse(ast, {
     CallExpression({node: {arguments: args, callee}}) {
+      var _options$tabWidth, _options$tabWidth2;
+
       if (
         callee.type !== 'MemberExpression' ||
         callee.property.type !== 'Identifier' ||
@@ -310,10 +313,21 @@
         snapshot,
         Math.ceil(
           useSpaces
-            ? callee.loc.start.column / options.tabWidth
+            ? callee.loc.start.column /
+                ((_options$tabWidth = options.tabWidth) !== null &&
+                _options$tabWidth !== void 0
+                  ? _options$tabWidth
+                  : 1)
             : callee.loc.start.column / 2 // Each tab is 2 characters.
         ),
-        useSpaces ? ' '.repeat(options.tabWidth) : '\t'
+        useSpaces
+          ? ' '.repeat(
+              (_options$tabWidth2 = options.tabWidth) !== null &&
+                _options$tabWidth2 !== void 0
+                ? _options$tabWidth2
+                : 1
+            )
+          : '\t'
       );
       const replacementNode = (0, _types.templateLiteral)(
         [
@@ -336,5 +350,5 @@
     return 'typescript';
   }
 
-  return 'babylon';
+  return 'babel';
 };
diff --git a/node_modules/jest-circus/node_modules/jest-snapshot/build/printSnapshot.js b/node_modules/jest-circus/node_modules/jest-snapshot/build/printSnapshot.js
index c85c3c4..79da9ff 100644
--- a/node_modules/jest-circus/node_modules/jest-snapshot/build/printSnapshot.js
+++ b/node_modules/jest-circus/node_modules/jest-snapshot/build/printSnapshot.js
@@ -33,6 +33,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+
+/* eslint-disable local/ban-types-eventually */
 // Temporary hack because getObjectSubset has known limitations,
 // is not in the public interface of the expect package,
 // and the long-term goal is to use a non-serialization diff.
diff --git a/node_modules/jest-circus/node_modules/jest-snapshot/build/types.d.ts b/node_modules/jest-circus/node_modules/jest-snapshot/build/types.d.ts
index 47c2c6a..e4f2283 100644
--- a/node_modules/jest-circus/node_modules/jest-snapshot/build/types.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-snapshot/build/types.d.ts
@@ -19,3 +19,9 @@
     received: any;
 };
 export declare type SnapshotData = Record<string, string>;
+export declare type ExpectationResult = {
+    pass: boolean;
+    message: () => string;
+};
+export declare type BabelTraverse = typeof import('@babel/traverse').default;
+export declare type Prettier = typeof import('prettier');
diff --git a/node_modules/jest-circus/node_modules/jest-snapshot/package.json b/node_modules/jest-circus/node_modules/jest-snapshot/package.json
index 4b701b5..334923e 100644
--- a/node_modules/jest-circus/node_modules/jest-snapshot/package.json
+++ b/node_modules/jest-circus/node_modules/jest-snapshot/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-snapshot",
-  "version": "26.4.2",
+  "version": "26.5.3",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -11,19 +11,20 @@
   "types": "build/index.d.ts",
   "dependencies": {
     "@babel/types": "^7.0.0",
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
+    "@types/babel__traverse": "^7.0.4",
     "@types/prettier": "^2.0.0",
     "chalk": "^4.0.0",
-    "expect": "^26.4.2",
+    "expect": "^26.5.3",
     "graceful-fs": "^4.2.4",
-    "jest-diff": "^26.4.2",
+    "jest-diff": "^26.5.2",
     "jest-get-type": "^26.3.0",
-    "jest-haste-map": "^26.3.0",
-    "jest-matcher-utils": "^26.4.2",
-    "jest-message-util": "^26.3.0",
-    "jest-resolve": "^26.4.0",
+    "jest-haste-map": "^26.5.2",
+    "jest-matcher-utils": "^26.5.2",
+    "jest-message-util": "^26.5.2",
+    "jest-resolve": "^26.5.2",
     "natural-compare": "^1.4.0",
-    "pretty-format": "^26.4.2",
+    "pretty-format": "^26.5.2",
     "semver": "^7.3.2"
   },
   "devDependencies": {
@@ -41,5 +42,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "71152afbbda76fd09ddb2527b54c365d753f42aa"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-util/build/ErrorWithStack.d.ts b/node_modules/jest-circus/node_modules/jest-util/build/ErrorWithStack.d.ts
index 2698f36..79764bd 100644
--- a/node_modules/jest-circus/node_modules/jest-util/build/ErrorWithStack.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-util/build/ErrorWithStack.d.ts
@@ -5,5 +5,5 @@
  * LICENSE file in the root directory of this source tree.
  */
 export default class ErrorWithStack extends Error {
-    constructor(message: string | undefined, callsite: Function);
+    constructor(message: string | undefined, callsite: (...args: Array<any>) => unknown);
 }
diff --git a/node_modules/jest-circus/node_modules/jest-util/build/convertDescriptorToString.js b/node_modules/jest-circus/node_modules/jest-util/build/convertDescriptorToString.js
index 0cfab68..4b776af 100644
--- a/node_modules/jest-circus/node_modules/jest-util/build/convertDescriptorToString.js
+++ b/node_modules/jest-circus/node_modules/jest-util/build/convertDescriptorToString.js
@@ -11,6 +11,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+
+/* eslint-disable local/ban-types-eventually */
 // See: https://github.com/facebook/jest/pull/5154
 function convertDescriptorToString(descriptor) {
   if (
diff --git a/node_modules/jest-circus/node_modules/jest-util/build/globsToMatcher.d.ts b/node_modules/jest-circus/node_modules/jest-util/build/globsToMatcher.d.ts
index 4e6cc5b..687684f 100644
--- a/node_modules/jest-circus/node_modules/jest-util/build/globsToMatcher.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-util/build/globsToMatcher.d.ts
@@ -5,6 +5,7 @@
  * LICENSE file in the root directory of this source tree.
  */
 import type { Config } from '@jest/types';
+declare type Matcher = (str: Config.Path) => boolean;
 /**
  * Converts a list of globs into a function that matches a path against the
  * globs.
@@ -22,4 +23,5 @@
  * isMatch('pizza.js'); // true
  * isMatch('pizza.test.js'); // false
  */
-export default function globsToMatcher(globs: Array<Config.Glob>): (path: Config.Path) => boolean;
+export default function globsToMatcher(globs: Array<Config.Glob>): Matcher;
+export {};
diff --git a/node_modules/jest-circus/node_modules/jest-util/build/globsToMatcher.js b/node_modules/jest-circus/node_modules/jest-util/build/globsToMatcher.js
index e517762..9e63c5c 100644
--- a/node_modules/jest-circus/node_modules/jest-util/build/globsToMatcher.js
+++ b/node_modules/jest-circus/node_modules/jest-util/build/globsToMatcher.js
@@ -55,7 +55,7 @@
   if (globs.length === 0) {
     // Since there were no globs given, we can simply have a fast path here and
     // return with a very simple function.
-    return _ => false;
+    return () => false;
   }
 
   const matchers = globs.map(glob => {
diff --git a/node_modules/jest-circus/node_modules/jest-util/package.json b/node_modules/jest-circus/node_modules/jest-util/package.json
index 01d0850..b584b93 100644
--- a/node_modules/jest-circus/node_modules/jest-util/package.json
+++ b/node_modules/jest-circus/node_modules/jest-util/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-util",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,7 +10,7 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "@types/node": "*",
     "chalk": "^4.0.0",
     "graceful-fs": "^4.2.4",
@@ -28,5 +28,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-validate/build/condition.d.ts b/node_modules/jest-circus/node_modules/jest-validate/build/condition.d.ts
index 1cce38f..4411c91 100644
--- a/node_modules/jest-circus/node_modules/jest-validate/build/condition.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-validate/build/condition.d.ts
@@ -6,4 +6,4 @@
  */
 export declare function getValues<T = unknown>(validOption: T): Array<T>;
 export declare function validationCondition(option: unknown, validOption: unknown): boolean;
-export declare function multipleValidOptions<T extends Array<any>>(...args: T): T[number];
+export declare function multipleValidOptions<T extends Array<unknown>>(...args: T): T[number];
diff --git a/node_modules/jest-circus/node_modules/jest-validate/build/deprecated.d.ts b/node_modules/jest-circus/node_modules/jest-validate/build/deprecated.d.ts
index 7eb9b47..b8cf9e0 100644
--- a/node_modules/jest-circus/node_modules/jest-validate/build/deprecated.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-validate/build/deprecated.d.ts
@@ -5,4 +5,4 @@
  * LICENSE file in the root directory of this source tree.
  */
 import type { DeprecatedOptions, ValidationOptions } from './types';
-export declare const deprecationWarning: (config: Record<string, any>, option: string, deprecatedOptions: DeprecatedOptions, options: ValidationOptions) => boolean;
+export declare const deprecationWarning: (config: Record<string, unknown>, option: string, deprecatedOptions: DeprecatedOptions, options: ValidationOptions) => boolean;
diff --git a/node_modules/jest-circus/node_modules/jest-validate/build/exampleConfig.js b/node_modules/jest-circus/node_modules/jest-validate/build/exampleConfig.js
index c4eda4d..555ea05 100644
--- a/node_modules/jest-circus/node_modules/jest-validate/build/exampleConfig.js
+++ b/node_modules/jest-circus/node_modules/jest-validate/build/exampleConfig.js
@@ -16,7 +16,7 @@
   condition: () => true,
   deprecate: () => false,
   deprecatedConfig: {
-    key: () => {}
+    key: () => 'Deprecation message'
   },
   error: () => {},
   exampleConfig: {
diff --git a/node_modules/jest-circus/node_modules/jest-validate/build/index.d.ts b/node_modules/jest-circus/node_modules/jest-validate/build/index.d.ts
index 586ceeb..86ae3ad 100644
--- a/node_modules/jest-circus/node_modules/jest-validate/build/index.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-validate/build/index.d.ts
@@ -5,6 +5,7 @@
  * LICENSE file in the root directory of this source tree.
  */
 export { ValidationError, createDidYouMeanMessage, format, logValidationWarning, } from './utils';
+export type { DeprecatedOptions } from './types';
 export { default as validate } from './validate';
 export { default as validateCLIOptions } from './validateCLIOptions';
 export { multipleValidOptions } from './condition';
diff --git a/node_modules/jest-circus/node_modules/jest-validate/build/types.d.ts b/node_modules/jest-circus/node_modules/jest-validate/build/types.d.ts
index 0a7424b..29af3a8 100644
--- a/node_modules/jest-circus/node_modules/jest-validate/build/types.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-validate/build/types.d.ts
@@ -9,17 +9,18 @@
     error?: string;
     warning?: string;
 };
-export declare type DeprecatedOptions = Record<string, Function>;
+export declare type DeprecatedOptionFunc = (arg: Record<string, unknown>) => string;
+export declare type DeprecatedOptions = Record<string, DeprecatedOptionFunc>;
 export declare type ValidationOptions = {
     comment?: string;
-    condition?: (option: any, validOption: any) => boolean;
-    deprecate?: (config: Record<string, any>, option: string, deprecatedOptions: DeprecatedOptions, options: ValidationOptions) => boolean;
+    condition?: (option: unknown, validOption: unknown) => boolean;
+    deprecate?: (config: Record<string, unknown>, option: string, deprecatedOptions: DeprecatedOptions, options: ValidationOptions) => boolean;
     deprecatedConfig?: DeprecatedOptions;
-    error?: (option: string, received: any, defaultValue: any, options: ValidationOptions, path?: Array<string>) => void;
-    exampleConfig: Record<string, any>;
+    error?: (option: string, received: unknown, defaultValue: unknown, options: ValidationOptions, path?: Array<string>) => void;
+    exampleConfig: Record<string, unknown>;
     recursive?: boolean;
     recursiveBlacklist?: Array<string>;
     title?: Title;
-    unknown?: (config: Record<string, any>, exampleConfig: Record<string, any>, option: string, options: ValidationOptions, path?: Array<string>) => void;
+    unknown?: (config: Record<string, unknown>, exampleConfig: Record<string, unknown>, option: string, options: ValidationOptions, path?: Array<string>) => void;
 };
 export {};
diff --git a/node_modules/jest-circus/node_modules/jest-validate/build/validate.d.ts b/node_modules/jest-circus/node_modules/jest-validate/build/validate.d.ts
index f8cff6f..24a49af 100644
--- a/node_modules/jest-circus/node_modules/jest-validate/build/validate.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-validate/build/validate.d.ts
@@ -6,7 +6,7 @@
  */
 import type { ValidationOptions } from './types';
 declare let hasDeprecationWarnings: boolean;
-declare const validate: (config: Record<string, any>, options: ValidationOptions) => {
+declare const validate: (config: Record<string, unknown>, options: ValidationOptions) => {
     hasDeprecationWarnings: boolean;
     isValid: boolean;
 };
diff --git a/node_modules/jest-circus/node_modules/jest-validate/build/validateCLIOptions.js b/node_modules/jest-circus/node_modules/jest-validate/build/validateCLIOptions.js
index 955304e..f33a189 100644
--- a/node_modules/jest-circus/node_modules/jest-validate/build/validateCLIOptions.js
+++ b/node_modules/jest-circus/node_modules/jest-validate/build/validateCLIOptions.js
@@ -60,10 +60,13 @@
 
   if (unrecognizedOptions.length === 1) {
     const unrecognized = unrecognizedOptions[0];
-    const didYouMeanMessage = (0, _utils.createDidYouMeanMessage)(
-      unrecognized,
-      Array.from(allowedOptions)
-    );
+    const didYouMeanMessage =
+      unrecognized.length > 1
+        ? (0, _utils.createDidYouMeanMessage)(
+            unrecognized,
+            Array.from(allowedOptions)
+          )
+        : '';
     message =
       `  Unrecognized option ${_chalk().default.bold(
         (0, _utils.format)(unrecognized)
@@ -97,6 +100,7 @@
   const unrecognizedOptions = Object.keys(argv).filter(
     arg =>
       !allowedOptions.has((0, _camelcase().default)(arg)) &&
+      !allowedOptions.has(arg) &&
       (!rawArgv.length || rawArgv.includes(arg)),
     []
   );
diff --git a/node_modules/jest-circus/node_modules/jest-validate/build/warnings.d.ts b/node_modules/jest-circus/node_modules/jest-validate/build/warnings.d.ts
index 421ec17..70ff76c 100644
--- a/node_modules/jest-circus/node_modules/jest-validate/build/warnings.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-validate/build/warnings.d.ts
@@ -5,4 +5,4 @@
  * LICENSE file in the root directory of this source tree.
  */
 import type { ValidationOptions } from './types';
-export declare const unknownOptionWarning: (config: Record<string, any>, exampleConfig: Record<string, any>, option: string, options: ValidationOptions, path?: string[] | undefined) => void;
+export declare const unknownOptionWarning: (config: Record<string, unknown>, exampleConfig: Record<string, unknown>, option: string, options: ValidationOptions, path?: string[] | undefined) => void;
diff --git a/node_modules/jest-circus/node_modules/jest-validate/package.json b/node_modules/jest-circus/node_modules/jest-validate/package.json
index 40fd3d6..0b477da 100644
--- a/node_modules/jest-circus/node_modules/jest-validate/package.json
+++ b/node_modules/jest-circus/node_modules/jest-validate/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-validate",
-  "version": "26.4.2",
+  "version": "26.5.3",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,12 +10,12 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "camelcase": "^6.0.0",
     "chalk": "^4.0.0",
     "jest-get-type": "^26.3.0",
     "leven": "^3.1.0",
-    "pretty-format": "^26.4.2"
+    "pretty-format": "^26.5.2"
   },
   "devDependencies": {
     "@types/yargs": "^15.0.3"
@@ -26,5 +26,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "71152afbbda76fd09ddb2527b54c365d753f42aa"
 }
diff --git a/node_modules/jest-circus/node_modules/jest-worker/README.md b/node_modules/jest-circus/node_modules/jest-worker/README.md
index efc91bb..d0523c9 100644
--- a/node_modules/jest-circus/node_modules/jest-worker/README.md
+++ b/node_modules/jest-circus/node_modules/jest-worker/README.md
@@ -87,8 +87,6 @@
 
 Provide a custom worker pool to be used for spawning child processes. By default, Jest will use a node thread pool if available and fall back to child process threads.
 
-The arguments that will be passed to the `setup` method during initialization.
-
 #### `enableWorkerThreads: boolean` (optional)
 
 `jest-worker` will automatically detect if `worker_threads` are available, but will not use them unless passed `enableWorkerThreads: true`.
diff --git a/node_modules/jest-circus/node_modules/jest-worker/build/types.d.ts b/node_modules/jest-circus/node_modules/jest-worker/build/types.d.ts
index a42d7f1..81e109e 100644
--- a/node_modules/jest-circus/node_modules/jest-worker/build/types.d.ts
+++ b/node_modules/jest-circus/node_modules/jest-worker/build/types.d.ts
@@ -77,29 +77,41 @@
     port1: MessagePort;
     port2: MessagePort;
 };
-export declare type ChildMessageInitialize = [typeof CHILD_MESSAGE_INITIALIZE, // type
-boolean, // processed
-string, // file
-// file
-Array<unknown> | undefined, // setupArgs
-// setupArgs
-MessagePort | undefined];
-export declare type ChildMessageCall = [typeof CHILD_MESSAGE_CALL, // type
-boolean, // processed
-string, // method
-Array<unknown>];
-export declare type ChildMessageEnd = [typeof CHILD_MESSAGE_END, // type
-boolean];
+export declare type ChildMessageInitialize = [
+    typeof CHILD_MESSAGE_INITIALIZE,
+    boolean,
+    string,
+    // file
+    Array<unknown> | undefined,
+    // setupArgs
+    MessagePort | undefined
+];
+export declare type ChildMessageCall = [
+    typeof CHILD_MESSAGE_CALL,
+    boolean,
+    string,
+    Array<unknown>
+];
+export declare type ChildMessageEnd = [
+    typeof CHILD_MESSAGE_END,
+    boolean
+];
 export declare type ChildMessage = ChildMessageInitialize | ChildMessageCall | ChildMessageEnd;
-export declare type ParentMessageCustom = [typeof PARENT_MESSAGE_CUSTOM, // type
-unknown];
-export declare type ParentMessageOk = [typeof PARENT_MESSAGE_OK, // type
-unknown];
-export declare type ParentMessageError = [PARENT_MESSAGE_ERROR, // type
-string, // constructor
-string, // message
-string, // stack
-unknown];
+export declare type ParentMessageCustom = [
+    typeof PARENT_MESSAGE_CUSTOM,
+    unknown
+];
+export declare type ParentMessageOk = [
+    typeof PARENT_MESSAGE_OK,
+    unknown
+];
+export declare type ParentMessageError = [
+    PARENT_MESSAGE_ERROR,
+    string,
+    string,
+    string,
+    unknown
+];
 export declare type ParentMessage = ParentMessageOk | ParentMessageError | ParentMessageCustom;
 export declare type OnStart = (worker: WorkerInterface) => void;
 export declare type OnEnd = (err: Error | null, result: unknown) => void;
diff --git a/node_modules/jest-circus/node_modules/jest-worker/build/workers/processChild.js b/node_modules/jest-circus/node_modules/jest-worker/build/workers/processChild.js
index 75cc9bb..a4f5acb 100644
--- a/node_modules/jest-circus/node_modules/jest-worker/build/workers/processChild.js
+++ b/node_modules/jest-circus/node_modules/jest-worker/build/workers/processChild.js
@@ -133,6 +133,11 @@
   execFunction(main.setup, main, setupArgs, execHelper, reportInitializeError);
 }
 
+const isPromise = obj =>
+  !!obj &&
+  (typeof obj === 'object' || typeof obj === 'function') &&
+  typeof obj.then === 'function';
+
 function execFunction(fn, ctx, args, onResult, onError) {
   let result;
 
@@ -143,7 +148,7 @@
     return;
   }
 
-  if (result && typeof result.then === 'function') {
+  if (isPromise(result)) {
     result.then(onResult, onError);
   } else {
     onResult(result);
diff --git a/node_modules/jest-circus/node_modules/jest-worker/build/workers/threadChild.js b/node_modules/jest-circus/node_modules/jest-worker/build/workers/threadChild.js
index 6a696c5..ef32c5b 100644
--- a/node_modules/jest-circus/node_modules/jest-worker/build/workers/threadChild.js
+++ b/node_modules/jest-circus/node_modules/jest-worker/build/workers/threadChild.js
@@ -146,6 +146,11 @@
   execFunction(main.setup, main, setupArgs, execHelper, reportInitializeError);
 }
 
+const isPromise = obj =>
+  !!obj &&
+  (typeof obj === 'object' || typeof obj === 'function') &&
+  typeof obj.then === 'function';
+
 function execFunction(fn, ctx, args, onResult, onError) {
   let result;
 
@@ -156,7 +161,7 @@
     return;
   }
 
-  if (result && typeof result.then === 'function') {
+  if (isPromise(result)) {
     result.then(onResult, onError);
   } else {
     onResult(result);
diff --git a/node_modules/jest-circus/node_modules/jest-worker/package.json b/node_modules/jest-circus/node_modules/jest-worker/package.json
index f40a627..5029e52 100644
--- a/node_modules/jest-circus/node_modules/jest-worker/package.json
+++ b/node_modules/jest-circus/node_modules/jest-worker/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-worker",
-  "version": "26.3.0",
+  "version": "26.5.0",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -17,7 +17,7 @@
   "devDependencies": {
     "@types/merge-stream": "^1.1.2",
     "@types/supports-color": "^5.3.0",
-    "get-stream": "^5.1.0",
+    "get-stream": "^6.0.0",
     "worker-farm": "^1.6.0"
   },
   "engines": {
@@ -26,5 +26,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "68d1b1b638bc7464c2794a957c1b894de7da2ee3"
 }
diff --git a/node_modules/jest-circus/node_modules/jsdom/Changelog.md b/node_modules/jest-circus/node_modules/jsdom/Changelog.md
index a162287..a05cde7 100644
--- a/node_modules/jest-circus/node_modules/jsdom/Changelog.md
+++ b/node_modules/jest-circus/node_modules/jsdom/Changelog.md
@@ -1,3 +1,5 @@
+# jsdom Changelog
+
 <!-- Style guide:
 
 * Use past tense verbs to start the sentence, e.g. "Fixed", "Added", "Removed", ...
@@ -24,6 +26,29 @@
 * Roughly order changes within those groupings by impact.
 -->
 
+## 16.4.0
+
+* Added a not-implemented warning if you try to use the second pseudo-element argument to `getComputedStyle()`, unless you pass a `::part` or `::slotted` pseudo-element, in which case we throw an error per the spec. (ExE-Boss)
+* Improved the performance of repeated access to `el.tagName`, which also indirectly improves performance of selector matching and style computation. (eps1lon)
+* Fixed `form.elements` to respect the `form=""` attribute, so that it can contain non-descendant form controls. (ccwebdesign)
+* Fixed `el.focus()` to do nothing on disconnected elements. (eps1lon)
+* Fixed `el.focus()` to work on SVG elements. (zjffun)
+* Fixed removing the currently-focused element to move focus to the `<body>` element. (eps1lon)
+* Fixed `imgEl.complete` to return true for `<img>` elements with empty or unset `src=""` attributes. (strager)
+* Fixed `imgEl.complete` to return true if an error occurs loading the `<img>`, when canvas is enabled. (strager)
+* Fixed `imgEl.complete` to return false if the `<img>` element's `src=""` attribute is reset. (strager)
+* Fixed the `valueMissing` validation check for `<input type="radio">`. (zjffun)
+* Fixed `translate=""` and `draggable=""` attribute processing to use ASCII case-insensitivity, instead of Unicode case-insensitivity. (zjffun)
+
+## 16.3.0
+
+* Added firing of `focusin` and `focusout` when using `el.focus()` and `el.blur()`. (trueadm)
+* Fixed elements with the `contenteditable=""` attribute to be considered as focusable. (jamieliu386)
+* Fixed `window.NodeFilter` to be per-`Window`, instead of shared across all `Window`s. (ExE-Boss)
+* Fixed edge-case behavior involving use of objects with `handleEvent` properties as event listeners. (ExE-Boss)
+* Fixed a second failing image load sometimes firing a `load` event instead of an `error` event, when the `canvas` package is installed. (strager)
+* Fixed drawing an empty canvas into another canvas. (zjffun)
+
 ## 16.2.2
 
 * Updated `StyleSheetList` for better spec compliance; notably it no longer inherits from `Array.prototype`. (ExE-Boss)
diff --git a/node_modules/jest-circus/node_modules/jsdom/README.md b/node_modules/jest-circus/node_modules/jsdom/README.md
index dc4f270..d3047e4 100644
--- a/node_modules/jest-circus/node_modules/jsdom/README.md
+++ b/node_modules/jest-circus/node_modules/jsdom/README.md
@@ -85,7 +85,7 @@
 
 Again we emphasize to only use this when feeding jsdom code you know is safe. If you use it on arbitrary user-supplied code, or code from the Internet, you are effectively running untrusted Node.js code, and your machine could be compromised.
 
-If you want to execute _external_ scripts, included via `<script src="">`, you'll also need to ensure that they load them. To do this, add the option `resources: "usable"` [as described below](#loading-subresources).
+If you want to execute _external_ scripts, included via `<script src="">`, you'll also need to ensure that they load them. To do this, add the option `resources: "usable"` [as described below](#loading-subresources). (You'll likely also want to set the `url` option, for the reasons discussed there.)
 
 Event handler attributes, like `<div onclick="">`, are also governed by this setting; they will not function unless `runScripts` is set to `"dangerously"`. (However, event handler _properties_, like `div.onclick = ...`, will function regardless of `runScripts`.)
 
@@ -137,6 +137,8 @@
 * Scripts, via `<script>`, but only if `runScripts: "dangerously"` is also set
 * Images, via `<img>`, but only if the `canvas` npm package is also installed (see "[Canvas Support](#canvas-support)" below)
 
+When attempting to load resources, recall that the default value for the `url` option is `"about:blank"`, which means that any resources included via relative URLs will fail to load. (The result of trying to parse the URL `/something` against the URL `about:blank` is an error.) So, you'll likely want to set a non-default value for the `url` option in those cases, or use one of the [convenience APIs](#convenience-apis) that do so automatically.
+
 #### Advanced configuration
 
 _This resource loader system is new as of jsdom v12.0.0, and we'd love your feedback on whether it meets your needs and how easy it is to use. Please file an issue to discuss!_
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/browser/Window.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/browser/Window.js
index 5a4c40b..0f11836 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/browser/Window.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/browser/Window.js
@@ -26,8 +26,8 @@
 const reportException = require("../living/helpers/runtime-script-errors");
 const { fireAnEvent } = require("../living/helpers/events");
 const SessionHistory = require("../living/window/SessionHistory");
-const { forEachMatchingSheetRuleOfElement, getResolvedValue, propertiesWithResolvedValueImplemented } =
-  require("../living/helpers/style-rules");
+const { forEachMatchingSheetRuleOfElement, getResolvedValue, propertiesWithResolvedValueImplemented,
+  SHADOW_DOM_PSEUDO_REGEXP } = require("../living/helpers/style-rules.js");
 const CustomElementRegistry = require("../living/generated/CustomElementRegistry");
 const jsGlobals = require("./js-globals.json");
 
@@ -60,7 +60,7 @@
     }
   }
 
-  installInterfaces(windowInstance);
+  installInterfaces(windowInstance, ["Window"]);
 
   const EventTargetConstructor = windowInstance.EventTarget;
 
@@ -642,6 +642,20 @@
 
   this.getComputedStyle = function (elt) {
     elt = Element.convert(elt);
+    let pseudoElt = arguments[1];
+    if (pseudoElt !== undefined && pseudoElt !== null) {
+      pseudoElt = webIDLConversions.DOMString(pseudoElt);
+    }
+
+    if (pseudoElt !== undefined && pseudoElt !== null && pseudoElt !== "") {
+      // TODO: Parse pseudoElt
+
+      if (SHADOW_DOM_PSEUDO_REGEXP.test(pseudoElt)) {
+        throw new TypeError("Tried to get the computed style of a Shadow DOM pseudo-element.");
+      }
+
+      notImplemented("window.computedStyle(elt, pseudoElt)", this);
+    }
 
     const declaration = new CSSStyleDeclaration();
     const { forEach } = Array.prototype;
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js
index 642e510..f5dfe6a 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js
@@ -25,13 +25,6 @@
   }
 
   addEventListener(type, callback, options) {
-    // webidl2js currently can't handle neither optional arguments nor callback interfaces
-    if (callback === undefined || callback === null) {
-      callback = null;
-    } else if (typeof callback !== "object" && typeof callback !== "function") {
-      throw new TypeError("Only undefined, null, an object, or a function are allowed for the callback parameter");
-    }
-
     options = normalizeEventHandlerOptions(options, ["capture", "once", "passive"]);
 
     if (callback === null) {
@@ -44,7 +37,10 @@
 
     for (let i = 0; i < this._eventListeners[type].length; ++i) {
       const listener = this._eventListeners[type][i];
-      if (listener.options.capture === options.capture && listener.callback === callback) {
+      if (
+        listener.callback.objectReference === callback.objectReference &&
+        listener.options.capture === options.capture
+      ) {
         return;
       }
     }
@@ -56,12 +52,6 @@
   }
 
   removeEventListener(type, callback, options) {
-    if (callback === undefined || callback === null) {
-      callback = null;
-    } else if (typeof callback !== "object" && typeof callback !== "function") {
-      throw new TypeError("Only undefined, null, an object, or a function are allowed for the callback parameter");
-    }
-
     options = normalizeEventHandlerOptions(options, ["capture"]);
 
     if (callback === null) {
@@ -75,7 +65,10 @@
 
     for (let i = 0; i < this._eventListeners[type].length; ++i) {
       const listener = this._eventListeners[type][i];
-      if (listener.callback === callback && listener.options.capture === options.capture) {
+      if (
+        listener.callback.objectReference === callback.objectReference &&
+        listener.options.capture === options.capture
+      ) {
         this._eventListeners[type].splice(i, 1);
         break;
       }
@@ -322,13 +315,7 @@
     }
 
     try {
-      if (typeof listener.callback === "object") {
-        if (typeof listener.callback.handleEvent === "function") {
-          listener.callback.handleEvent(idlUtils.wrapperForImpl(eventImpl));
-        }
-      } else {
-        listener.callback.call(eventImpl.currentTarget, idlUtils.wrapperForImpl(eventImpl));
-      }
+      listener.callback.call(eventImpl.currentTarget, eventImpl);
     } catch (e) {
       let window = null;
       if (wrapper && wrapper._document) {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AbortController.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AbortController.js
index d7d81ef..e931d5d 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AbortController.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AbortController.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "AbortController";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'AbortController'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor AbortController is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class AbortController {
     constructor() {
       return exports.setup(Object.create(new.target.prototype), globalObject, undefined);
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AbortSignal.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AbortSignal.js
index 38844b5..a85ca31 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AbortSignal.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AbortSignal.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "AbortSignal";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'AbortSignal'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,34 +32,62 @@
     throw new Error("Internal error: constructor AbortSignal is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  EventTarget._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  EventTarget._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.EventTarget === undefined) {
     throw new Error("Internal error: attempting to evaluate AbortSignal before EventTarget");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AbstractRange.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AbstractRange.js
index 58963fe..ff48048 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AbstractRange.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AbstractRange.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "AbstractRange";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'AbstractRange'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor AbstractRange is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class AbstractRange {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AddEventListenerOptions.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AddEventListenerOptions.js
index fb552cc..adea232 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AddEventListenerOptions.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AddEventListenerOptions.js
@@ -12,7 +12,7 @@
     const key = "once";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member once that" });
+      value = conversions["boolean"](value, { context: context + " has member 'once' that" });
 
       ret[key] = value;
     } else {
@@ -24,7 +24,7 @@
     const key = "passive";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member passive that" });
+      value = conversions["boolean"](value, { context: context + " has member 'passive' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AssignedNodesOptions.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AssignedNodesOptions.js
index 0dba079..42eae77 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AssignedNodesOptions.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/AssignedNodesOptions.js
@@ -8,7 +8,7 @@
     const key = "flatten";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member flatten that" });
+      value = conversions["boolean"](value, { context: context + " has member 'flatten' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Attr.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Attr.js
index e6d5ed9..19149db 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Attr.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Attr.js
@@ -11,20 +11,20 @@
 
 const interfaceName = "Attr";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Attr'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -34,34 +34,62 @@
     throw new Error("Internal error: constructor Attr is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Node._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Node._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Node === undefined) {
     throw new Error("Internal error: attempting to evaluate Attr before Node");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/BarProp.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/BarProp.js
index 65a8e3e..9353194 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/BarProp.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/BarProp.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "BarProp";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'BarProp'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor BarProp is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class BarProp {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/BinaryType.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/BinaryType.js
index b0a05e6..1e3e7fc 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/BinaryType.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/BinaryType.js
@@ -5,8 +5,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for BinaryType`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for BinaryType`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Blob.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Blob.js
index 9de45e9..5198e0e 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Blob.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Blob.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "Blob";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Blob'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,32 +32,59 @@
     throw new Error("Internal error: constructor Blob is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class Blob {
     constructor() {
       const args = [];
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/BlobPropertyBag.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/BlobPropertyBag.js
index 5008b52..6117142 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/BlobPropertyBag.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/BlobPropertyBag.js
@@ -10,7 +10,7 @@
     const key = "endings";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = EndingType.convert(value, { context: context + " has member endings that" });
+      value = EndingType.convert(value, { context: context + " has member 'endings' that" });
 
       ret[key] = value;
     } else {
@@ -22,7 +22,7 @@
     const key = "type";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["DOMString"](value, { context: context + " has member type that" });
+      value = conversions["DOMString"](value, { context: context + " has member 'type' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CDATASection.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CDATASection.js
index ca7ca1f..d85da50 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CDATASection.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CDATASection.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "CDATASection";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'CDATASection'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,34 +32,62 @@
     throw new Error("Internal error: constructor CDATASection is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Text._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Text._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Text === undefined) {
     throw new Error("Internal error: attempting to evaluate CDATASection before Text");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CanPlayTypeResult.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CanPlayTypeResult.js
index afe5692..48dc3be 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CanPlayTypeResult.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CanPlayTypeResult.js
@@ -5,8 +5,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for CanPlayTypeResult`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for CanPlayTypeResult`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CharacterData.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CharacterData.js
index 5aedd20..bc7be95 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CharacterData.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CharacterData.js
@@ -11,20 +11,20 @@
 
 const interfaceName = "CharacterData";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'CharacterData'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -34,34 +34,62 @@
     throw new Error("Internal error: constructor CharacterData is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Node._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Node._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Node === undefined) {
     throw new Error("Internal error: attempting to evaluate CharacterData before Node");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CloseEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CloseEvent.js
index fa3d0c6..6c3e58d 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CloseEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CloseEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "CloseEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'CloseEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor CloseEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Event._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Event._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Event === undefined) {
     throw new Error("Internal error: attempting to evaluate CloseEvent before Event");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CloseEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CloseEventInit.js
index 1540401..e62f74d 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CloseEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CloseEventInit.js
@@ -12,7 +12,7 @@
     const key = "code";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned short"](value, { context: context + " has member code that" });
+      value = conversions["unsigned short"](value, { context: context + " has member 'code' that" });
 
       ret[key] = value;
     } else {
@@ -24,7 +24,7 @@
     const key = "reason";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["USVString"](value, { context: context + " has member reason that" });
+      value = conversions["USVString"](value, { context: context + " has member 'reason' that" });
 
       ret[key] = value;
     } else {
@@ -36,7 +36,7 @@
     const key = "wasClean";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member wasClean that" });
+      value = conversions["boolean"](value, { context: context + " has member 'wasClean' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Comment.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Comment.js
index 2fde671..d60ee03 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Comment.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Comment.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "Comment";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Comment'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,34 +32,62 @@
     throw new Error("Internal error: constructor Comment is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  CharacterData._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  CharacterData._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.CharacterData === undefined) {
     throw new Error("Internal error: attempting to evaluate Comment before CharacterData");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CompositionEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CompositionEvent.js
index 690d847..572d140 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CompositionEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CompositionEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "CompositionEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'CompositionEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor CompositionEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  UIEvent._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  UIEvent._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.UIEvent === undefined) {
     throw new Error("Internal error: attempting to evaluate CompositionEvent before UIEvent");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CompositionEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CompositionEventInit.js
index e2cba0c..f3b8242 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CompositionEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CompositionEventInit.js
@@ -12,7 +12,7 @@
     const key = "data";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["DOMString"](value, { context: context + " has member data that" });
+      value = conversions["DOMString"](value, { context: context + " has member 'data' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CustomElementRegistry.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CustomElementRegistry.js
index d155acc..4c17bb1 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CustomElementRegistry.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CustomElementRegistry.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "CustomElementRegistry";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'CustomElementRegistry'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,32 +35,59 @@
     throw new Error("Internal error: constructor CustomElementRegistry is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class CustomElementRegistry {
     constructor() {
       throw new TypeError("Illegal constructor");
@@ -132,27 +159,31 @@
     }
 
     whenDefined(name) {
-      const esValue = this !== null && this !== undefined ? this : globalObject;
-      if (!exports.is(esValue)) {
-        throw new TypeError("Illegal invocation");
-      }
+      try {
+        const esValue = this !== null && this !== undefined ? this : globalObject;
+        if (!exports.is(esValue)) {
+          throw new TypeError("Illegal invocation");
+        }
 
-      if (arguments.length < 1) {
-        throw new TypeError(
-          "Failed to execute 'whenDefined' on 'CustomElementRegistry': 1 argument required, but only " +
-            arguments.length +
-            " present."
-        );
+        if (arguments.length < 1) {
+          throw new TypeError(
+            "Failed to execute 'whenDefined' on 'CustomElementRegistry': 1 argument required, but only " +
+              arguments.length +
+              " present."
+          );
+        }
+        const args = [];
+        {
+          let curArg = arguments[0];
+          curArg = conversions["DOMString"](curArg, {
+            context: "Failed to execute 'whenDefined' on 'CustomElementRegistry': parameter 1"
+          });
+          args.push(curArg);
+        }
+        return utils.tryWrapperForImpl(esValue[implSymbol].whenDefined(...args));
+      } catch (e) {
+        return Promise.reject(e);
       }
-      const args = [];
-      {
-        let curArg = arguments[0];
-        curArg = conversions["DOMString"](curArg, {
-          context: "Failed to execute 'whenDefined' on 'CustomElementRegistry': parameter 1"
-        });
-        args.push(curArg);
-      }
-      return utils.tryWrapperForImpl(esValue[implSymbol].whenDefined(...args));
     }
 
     upgrade(root) {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CustomEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CustomEvent.js
index 2070862..004f694 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CustomEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CustomEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "CustomEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'CustomEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor CustomEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Event._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Event._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Event === undefined) {
     throw new Error("Internal error: attempting to evaluate CustomEvent before Event");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CustomEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CustomEventInit.js
index e89c69b..c241770 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CustomEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/CustomEventInit.js
@@ -12,7 +12,7 @@
     const key = "detail";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["any"](value, { context: context + " has member detail that" });
+      value = conversions["any"](value, { context: context + " has member 'detail' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMImplementation.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMImplementation.js
index e28842c..d64a16c 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMImplementation.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMImplementation.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "DOMImplementation";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'DOMImplementation'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,32 +32,59 @@
     throw new Error("Internal error: constructor DOMImplementation is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class DOMImplementation {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMParser.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMParser.js
index 269bb80..8b3f869 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMParser.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMParser.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "DOMParser";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'DOMParser'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,32 +32,59 @@
     throw new Error("Internal error: constructor DOMParser is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class DOMParser {
     constructor() {
       return exports.setup(Object.create(new.target.prototype), globalObject, undefined);
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMStringMap.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMStringMap.js
index 6a03c6c..8914cf3 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMStringMap.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMStringMap.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "DOMStringMap";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'DOMStringMap'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,41 +33,72 @@
     throw new Error("Internal error: constructor DOMStringMap is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+function makeProxy(wrapper, globalObject) {
+  let proxyHandler = proxyHandlerCache.get(globalObject);
+  if (proxyHandler === undefined) {
+    proxyHandler = new ProxyHandler(globalObject);
+    proxyHandlerCache.set(globalObject, proxyHandler);
+  }
+  return new Proxy(wrapper, proxyHandler);
+}
+
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  {
-    let proxyHandler = proxyHandlerCache.get(globalObject);
-    if (proxyHandler === undefined) {
-      proxyHandler = new ProxyHandler(globalObject);
-      proxyHandlerCache.set(globalObject, proxyHandler);
-    }
-    obj = new Proxy(obj, proxyHandler);
-  }
+  wrapper = makeProxy(wrapper, globalObject);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = makeProxy(wrapper, globalObject);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class DOMStringMap {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMTokenList.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMTokenList.js
index c8850ac..3bad047 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMTokenList.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DOMTokenList.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "DOMTokenList";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'DOMTokenList'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,63 @@
     throw new Error("Internal error: constructor DOMTokenList is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj = new Proxy(obj, proxyHandler);
+  wrapper = new Proxy(wrapper, proxyHandler);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = new Proxy(wrapper, proxyHandler);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class DOMTokenList {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Document.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Document.js
index 1298d99..e235fa3 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Document.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Document.js
@@ -7,26 +7,27 @@
 const ceReactionsPreSteps_helpers_custom_elements = require("../helpers/custom-elements.js").ceReactionsPreSteps;
 const ceReactionsPostSteps_helpers_custom_elements = require("../helpers/custom-elements.js").ceReactionsPostSteps;
 const Node = require("./Node.js");
+const NodeFilter = require("./NodeFilter.js");
 const HTMLElement = require("./HTMLElement.js");
 const implSymbol = utils.implSymbol;
 const ctorRegistrySymbol = utils.ctorRegistrySymbol;
 
 const interfaceName = "Document";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Document'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -36,19 +37,24 @@
     throw new Error("Internal error: constructor Document is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
+  return Object.create(ctor.prototype);
+}
+
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
 };
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
 };
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Node._internalSetup(obj, globalObject);
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Node._internalSetup(wrapper, globalObject);
 
   Object.defineProperties(
-    obj,
+    wrapper,
     Object.getOwnPropertyDescriptors({
       get location() {
         const esValue = this !== null && this !== undefined ? this : globalObject;
@@ -66,30 +72,57 @@
           throw new TypeError("Illegal invocation");
         }
 
-        this.location.href = V;
+        const Q = esValue["location"];
+        if (!utils.isObject(Q)) {
+          throw new TypeError("Property 'location' is not an object");
+        }
+        Reflect.set(Q, "href", V);
       }
     })
   );
 
-  Object.defineProperties(obj, { location: { configurable: false } });
+  Object.defineProperties(wrapper, { location: { configurable: false } });
 };
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Node === undefined) {
     throw new Error("Internal error: attempting to evaluate Document before Node");
   }
@@ -591,7 +624,9 @@
           if (curArg === null || curArg === undefined) {
             curArg = null;
           } else {
-            curArg = utils.tryImplForWrapper(curArg);
+            curArg = NodeFilter.convert(curArg, {
+              context: "Failed to execute 'createNodeIterator' on 'Document': parameter 3"
+            });
           }
         } else {
           curArg = null;
@@ -637,7 +672,9 @@
           if (curArg === null || curArg === undefined) {
             curArg = null;
           } else {
-            curArg = utils.tryImplForWrapper(curArg);
+            curArg = NodeFilter.convert(curArg, {
+              context: "Failed to execute 'createTreeWalker' on 'Document': parameter 3"
+            });
           }
         } else {
           curArg = null;
@@ -1291,12 +1328,20 @@
     get onreadystatechange() {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       return utils.tryWrapperForImpl(esValue[implSymbol]["onreadystatechange"]);
     }
 
     set onreadystatechange(V) {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       V = utils.tryImplForWrapper(V);
 
       esValue[implSymbol]["onreadystatechange"] = V;
@@ -2175,12 +2220,20 @@
     get onmouseenter() {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       return utils.tryWrapperForImpl(esValue[implSymbol]["onmouseenter"]);
     }
 
     set onmouseenter(V) {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       V = utils.tryImplForWrapper(V);
 
       esValue[implSymbol]["onmouseenter"] = V;
@@ -2189,12 +2242,20 @@
     get onmouseleave() {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       return utils.tryWrapperForImpl(esValue[implSymbol]["onmouseleave"]);
     }
 
     set onmouseleave(V) {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       V = utils.tryImplForWrapper(V);
 
       esValue[implSymbol]["onmouseleave"] = V;
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DocumentFragment.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DocumentFragment.js
index 3e57c60..e36f0a2 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DocumentFragment.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DocumentFragment.js
@@ -11,20 +11,20 @@
 
 const interfaceName = "DocumentFragment";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'DocumentFragment'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -34,34 +34,62 @@
     throw new Error("Internal error: constructor DocumentFragment is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Node._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Node._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Node === undefined) {
     throw new Error("Internal error: attempting to evaluate DocumentFragment before Node");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DocumentReadyState.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DocumentReadyState.js
index 13daec2..da0f75c 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DocumentReadyState.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DocumentReadyState.js
@@ -5,8 +5,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for DocumentReadyState`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for DocumentReadyState`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DocumentType.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DocumentType.js
index 0ac0453..3ff41e2 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DocumentType.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/DocumentType.js
@@ -11,20 +11,20 @@
 
 const interfaceName = "DocumentType";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'DocumentType'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -34,34 +34,62 @@
     throw new Error("Internal error: constructor DocumentType is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Node._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Node._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Node === undefined) {
     throw new Error("Internal error: attempting to evaluate DocumentType before Node");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Element.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Element.js
index 9246d3a..3e3a58b 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Element.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Element.js
@@ -13,20 +13,20 @@
 
 const interfaceName = "Element";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Element'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -36,34 +36,62 @@
     throw new Error("Internal error: constructor Element is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Node._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Node._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Node === undefined) {
     throw new Error("Internal error: attempting to evaluate Element before Node");
   }
@@ -1144,7 +1172,11 @@
         throw new TypeError("Illegal invocation");
       }
 
-      this.classList.value = V;
+      const Q = esValue["classList"];
+      if (!utils.isObject(Q)) {
+        throw new TypeError("Property 'classList' is not an object");
+      }
+      Reflect.set(Q, "value", V);
     }
 
     get slot() {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ElementCreationOptions.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ElementCreationOptions.js
index 45a2baa..991bab0 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ElementCreationOptions.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ElementCreationOptions.js
@@ -8,7 +8,7 @@
     const key = "is";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["DOMString"](value, { context: context + " has member is that" });
+      value = conversions["DOMString"](value, { context: context + " has member 'is' that" });
 
       ret[key] = value;
     }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ElementDefinitionOptions.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ElementDefinitionOptions.js
index 5161d07..ff14767 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ElementDefinitionOptions.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ElementDefinitionOptions.js
@@ -8,7 +8,7 @@
     const key = "extends";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["DOMString"](value, { context: context + " has member extends that" });
+      value = conversions["DOMString"](value, { context: context + " has member 'extends' that" });
 
       ret[key] = value;
     }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EndingType.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EndingType.js
index 503863a..940ed76 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EndingType.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EndingType.js
@@ -5,8 +5,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for EndingType`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for EndingType`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ErrorEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ErrorEvent.js
index b3a6e56..143a8b4 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ErrorEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ErrorEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "ErrorEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'ErrorEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor ErrorEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Event._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Event._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Event === undefined) {
     throw new Error("Internal error: attempting to evaluate ErrorEvent before Event");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ErrorEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ErrorEventInit.js
index 4c9dbc7..389a384 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ErrorEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ErrorEventInit.js
@@ -12,7 +12,7 @@
     const key = "colno";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned long"](value, { context: context + " has member colno that" });
+      value = conversions["unsigned long"](value, { context: context + " has member 'colno' that" });
 
       ret[key] = value;
     } else {
@@ -24,7 +24,7 @@
     const key = "error";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["any"](value, { context: context + " has member error that" });
+      value = conversions["any"](value, { context: context + " has member 'error' that" });
 
       ret[key] = value;
     } else {
@@ -36,7 +36,7 @@
     const key = "filename";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["USVString"](value, { context: context + " has member filename that" });
+      value = conversions["USVString"](value, { context: context + " has member 'filename' that" });
 
       ret[key] = value;
     } else {
@@ -48,7 +48,7 @@
     const key = "lineno";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned long"](value, { context: context + " has member lineno that" });
+      value = conversions["unsigned long"](value, { context: context + " has member 'lineno' that" });
 
       ret[key] = value;
     } else {
@@ -60,7 +60,7 @@
     const key = "message";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["DOMString"](value, { context: context + " has member message that" });
+      value = conversions["DOMString"](value, { context: context + " has member 'message' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Event.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Event.js
index c5d3aeb..32e843a 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Event.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Event.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "Event";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Event'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,17 +32,22 @@
     throw new Error("Internal error: constructor Event is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
+  return Object.create(ctor.prototype);
+}
+
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
 };
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
 };
-exports._internalSetup = function _internalSetup(obj, globalObject) {
+
+exports._internalSetup = (wrapper, globalObject) => {
   Object.defineProperties(
-    obj,
+    wrapper,
     Object.getOwnPropertyDescriptors({
       get isTrusted() {
         const esValue = this !== null && this !== undefined ? this : globalObject;
@@ -56,25 +61,47 @@
     })
   );
 
-  Object.defineProperties(obj, { isTrusted: { configurable: false } });
+  Object.defineProperties(wrapper, { isTrusted: { configurable: false } });
 };
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker", "AudioWorklet"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class Event {
     constructor(type) {
       if (arguments.length < 1) {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventInit.js
index bc0461e..6bc3e0a 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventInit.js
@@ -8,7 +8,7 @@
     const key = "bubbles";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member bubbles that" });
+      value = conversions["boolean"](value, { context: context + " has member 'bubbles' that" });
 
       ret[key] = value;
     } else {
@@ -20,7 +20,7 @@
     const key = "cancelable";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member cancelable that" });
+      value = conversions["boolean"](value, { context: context + " has member 'cancelable' that" });
 
       ret[key] = value;
     } else {
@@ -32,7 +32,7 @@
     const key = "composed";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member composed that" });
+      value = conversions["boolean"](value, { context: context + " has member 'composed' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventListener.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventListener.js
new file mode 100644
index 0000000..e8b6099
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventListener.js
@@ -0,0 +1,35 @@
+"use strict";
+
+const conversions = require("webidl-conversions");
+const utils = require("./utils.js");
+
+exports.convert = function convert(value, { context = "The provided value" } = {}) {
+  if (!utils.isObject(value)) {
+    throw new TypeError(`${context} is not an object.`);
+  }
+
+  function callTheUserObjectsOperation(event) {
+    let thisArg = utils.tryWrapperForImpl(this);
+    let O = value;
+    let X = O;
+
+    if (typeof O !== "function") {
+      X = O["handleEvent"];
+      if (typeof X !== "function") {
+        throw new TypeError(`${context} does not correctly implement EventListener.`);
+      }
+      thisArg = O;
+    }
+
+    event = utils.tryWrapperForImpl(event);
+
+    let callResult = Reflect.apply(X, thisArg, [event]);
+  }
+
+  callTheUserObjectsOperation[utils.wrapperSymbol] = value;
+  callTheUserObjectsOperation.objectReference = value;
+
+  return callTheUserObjectsOperation;
+};
+
+exports.install = (globalObject, globalNames) => {};
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventListenerOptions.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventListenerOptions.js
index 19f167e..f7c5d8b 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventListenerOptions.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventListenerOptions.js
@@ -8,7 +8,7 @@
     const key = "capture";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member capture that" });
+      value = conversions["boolean"](value, { context: context + " has member 'capture' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventModifierInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventModifierInit.js
index 0c64fd2..beba571 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventModifierInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventModifierInit.js
@@ -12,7 +12,7 @@
     const key = "altKey";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member altKey that" });
+      value = conversions["boolean"](value, { context: context + " has member 'altKey' that" });
 
       ret[key] = value;
     } else {
@@ -24,7 +24,7 @@
     const key = "ctrlKey";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member ctrlKey that" });
+      value = conversions["boolean"](value, { context: context + " has member 'ctrlKey' that" });
 
       ret[key] = value;
     } else {
@@ -36,7 +36,7 @@
     const key = "metaKey";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member metaKey that" });
+      value = conversions["boolean"](value, { context: context + " has member 'metaKey' that" });
 
       ret[key] = value;
     } else {
@@ -48,7 +48,7 @@
     const key = "modifierAltGraph";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member modifierAltGraph that" });
+      value = conversions["boolean"](value, { context: context + " has member 'modifierAltGraph' that" });
 
       ret[key] = value;
     } else {
@@ -60,7 +60,7 @@
     const key = "modifierCapsLock";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member modifierCapsLock that" });
+      value = conversions["boolean"](value, { context: context + " has member 'modifierCapsLock' that" });
 
       ret[key] = value;
     } else {
@@ -72,7 +72,7 @@
     const key = "modifierFn";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member modifierFn that" });
+      value = conversions["boolean"](value, { context: context + " has member 'modifierFn' that" });
 
       ret[key] = value;
     } else {
@@ -84,7 +84,7 @@
     const key = "modifierFnLock";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member modifierFnLock that" });
+      value = conversions["boolean"](value, { context: context + " has member 'modifierFnLock' that" });
 
       ret[key] = value;
     } else {
@@ -96,7 +96,7 @@
     const key = "modifierHyper";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member modifierHyper that" });
+      value = conversions["boolean"](value, { context: context + " has member 'modifierHyper' that" });
 
       ret[key] = value;
     } else {
@@ -108,7 +108,7 @@
     const key = "modifierNumLock";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member modifierNumLock that" });
+      value = conversions["boolean"](value, { context: context + " has member 'modifierNumLock' that" });
 
       ret[key] = value;
     } else {
@@ -120,7 +120,7 @@
     const key = "modifierScrollLock";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member modifierScrollLock that" });
+      value = conversions["boolean"](value, { context: context + " has member 'modifierScrollLock' that" });
 
       ret[key] = value;
     } else {
@@ -132,7 +132,7 @@
     const key = "modifierSuper";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member modifierSuper that" });
+      value = conversions["boolean"](value, { context: context + " has member 'modifierSuper' that" });
 
       ret[key] = value;
     } else {
@@ -144,7 +144,7 @@
     const key = "modifierSymbol";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member modifierSymbol that" });
+      value = conversions["boolean"](value, { context: context + " has member 'modifierSymbol' that" });
 
       ret[key] = value;
     } else {
@@ -156,7 +156,7 @@
     const key = "modifierSymbolLock";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member modifierSymbolLock that" });
+      value = conversions["boolean"](value, { context: context + " has member 'modifierSymbolLock' that" });
 
       ret[key] = value;
     } else {
@@ -168,7 +168,7 @@
     const key = "shiftKey";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member shiftKey that" });
+      value = conversions["boolean"](value, { context: context + " has member 'shiftKey' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventTarget.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventTarget.js
index cee4a46..13632b3 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventTarget.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/EventTarget.js
@@ -3,6 +3,7 @@
 const conversions = require("webidl-conversions");
 const utils = require("./utils.js");
 
+const EventListener = require("./EventListener.js");
 const AddEventListenerOptions = require("./AddEventListenerOptions.js");
 const EventListenerOptions = require("./EventListenerOptions.js");
 const Event = require("./Event.js");
@@ -11,20 +12,20 @@
 
 const interfaceName = "EventTarget";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'EventTarget'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -34,32 +35,59 @@
     throw new Error("Internal error: constructor EventTarget is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker", "AudioWorklet"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class EventTarget {
     constructor() {
       return exports.setup(Object.create(new.target.prototype), globalObject, undefined);
@@ -91,11 +119,9 @@
         if (curArg === null || curArg === undefined) {
           curArg = null;
         } else {
-          if (!utils.isObject(curArg)) {
-            throw new TypeError(
-              "Failed to execute 'addEventListener' on 'EventTarget': parameter 2" + " is not an object"
-            );
-          }
+          curArg = EventListener.convert(curArg, {
+            context: "Failed to execute 'addEventListener' on 'EventTarget': parameter 2"
+          });
         }
         args.push(curArg);
       }
@@ -151,11 +177,9 @@
         if (curArg === null || curArg === undefined) {
           curArg = null;
         } else {
-          if (!utils.isObject(curArg)) {
-            throw new TypeError(
-              "Failed to execute 'removeEventListener' on 'EventTarget': parameter 2" + " is not an object"
-            );
-          }
+          curArg = EventListener.convert(curArg, {
+            context: "Failed to execute 'removeEventListener' on 'EventTarget': parameter 2"
+          });
         }
         args.push(curArg);
       }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/External.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/External.js
index cc2c032..f275096 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/External.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/External.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "External";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'External'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor External is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class External {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/File.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/File.js
index 33f3549..cf880b0 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/File.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/File.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "File";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'File'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor File is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Blob._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Blob._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Blob === undefined) {
     throw new Error("Internal error: attempting to evaluate File before Blob");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FileList.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FileList.js
index 599e142..0a53157 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FileList.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FileList.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "FileList";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'FileList'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,34 +31,63 @@
     throw new Error("Internal error: constructor FileList is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj = new Proxy(obj, proxyHandler);
+  wrapper = new Proxy(wrapper, proxyHandler);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = new Proxy(wrapper, proxyHandler);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class FileList {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FilePropertyBag.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FilePropertyBag.js
index 803d2e3..3227752 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FilePropertyBag.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FilePropertyBag.js
@@ -12,7 +12,7 @@
     const key = "lastModified";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["long long"](value, { context: context + " has member lastModified that" });
+      value = conversions["long long"](value, { context: context + " has member 'lastModified' that" });
 
       ret[key] = value;
     }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FileReader.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FileReader.js
index a9a5e3e..88828d1 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FileReader.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FileReader.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "FileReader";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'FileReader'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor FileReader is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  EventTarget._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  EventTarget._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.EventTarget === undefined) {
     throw new Error("Internal error: attempting to evaluate FileReader before EventTarget");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FocusEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FocusEvent.js
index 1efd3de..8d3c256 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FocusEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FocusEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "FocusEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'FocusEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor FocusEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  UIEvent._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  UIEvent._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.UIEvent === undefined) {
     throw new Error("Internal error: attempting to evaluate FocusEvent before UIEvent");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FocusEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FocusEventInit.js
index e0d6802..7f226e3 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FocusEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FocusEventInit.js
@@ -16,7 +16,7 @@
       if (value === null || value === undefined) {
         value = null;
       } else {
-        value = EventTarget.convert(value, { context: context + " has member relatedTarget that" });
+        value = EventTarget.convert(value, { context: context + " has member 'relatedTarget' that" });
       }
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FormData.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FormData.js
index 8499e72..7f1942a 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FormData.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/FormData.js
@@ -49,20 +49,20 @@
   }
 });
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'FormData'.`);
 };
 
-exports.createDefaultIterator = function createDefaultIterator(target, kind) {
+exports.createDefaultIterator = (target, kind) => {
   const iterator = Object.create(IteratorPrototype);
   Object.defineProperty(iterator, utils.iterInternalSymbol, {
     value: { target, kind, index: 0 },
@@ -71,7 +71,7 @@
   return iterator;
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -81,32 +81,59 @@
     throw new Error("Internal error: constructor FormData is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class FormData {
     constructor() {
       const args = [];
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/GetRootNodeOptions.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/GetRootNodeOptions.js
index 4d5e89f..4d60bd5 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/GetRootNodeOptions.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/GetRootNodeOptions.js
@@ -8,7 +8,7 @@
     const key = "composed";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member composed that" });
+      value = conversions["boolean"](value, { context: context + " has member 'composed' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLAnchorElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLAnchorElement.js
index 424296f..1592f73 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLAnchorElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLAnchorElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLAnchorElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLAnchorElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLAnchorElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLAnchorElement before HTMLElement");
   }
@@ -195,7 +223,11 @@
         throw new TypeError("Illegal invocation");
       }
 
-      this.relList.value = V;
+      const Q = esValue["relList"];
+      if (!utils.isObject(Q)) {
+        throw new TypeError("Property 'relList' is not an object");
+      }
+      Reflect.set(Q, "value", V);
     }
 
     get hreflang() {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLAreaElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLAreaElement.js
index c754069..e77b8bc 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLAreaElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLAreaElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLAreaElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLAreaElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLAreaElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLAreaElement before HTMLElement");
   }
@@ -265,7 +293,11 @@
         throw new TypeError("Illegal invocation");
       }
 
-      this.relList.value = V;
+      const Q = esValue["relList"];
+      if (!utils.isObject(Q)) {
+        throw new TypeError("Property 'relList' is not an object");
+      }
+      Reflect.set(Q, "value", V);
     }
 
     get noHref() {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLAudioElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLAudioElement.js
index 20dc676..7d80742 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLAudioElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLAudioElement.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "HTMLAudioElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLAudioElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor HTMLAudioElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLMediaElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLMediaElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLMediaElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLAudioElement before HTMLMediaElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLBRElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLBRElement.js
index b1093a0..d7cc282 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLBRElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLBRElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLBRElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLBRElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLBRElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLBRElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLBaseElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLBaseElement.js
index a53e47b..2d83400 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLBaseElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLBaseElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLBaseElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLBaseElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLBaseElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLBaseElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLBodyElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLBodyElement.js
index 5e35a27..97e72c0 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLBodyElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLBodyElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLBodyElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLBodyElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLBodyElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLBodyElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLButtonElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLButtonElement.js
index c907688..8e0a563 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLButtonElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLButtonElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLButtonElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLButtonElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLButtonElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLButtonElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLCanvasElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLCanvasElement.js
index 0f1fb00..45e90a7 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLCanvasElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLCanvasElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLCanvasElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLCanvasElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLCanvasElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLCanvasElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLCollection.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLCollection.js
index e238327..88b5e6c 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLCollection.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLCollection.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "HTMLCollection";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLCollection'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,34 +31,63 @@
     throw new Error("Internal error: constructor HTMLCollection is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj = new Proxy(obj, proxyHandler);
+  wrapper = new Proxy(wrapper, proxyHandler);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = new Proxy(wrapper, proxyHandler);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class HTMLCollection {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDListElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDListElement.js
index f6de89e..ec47bfc 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDListElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDListElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLDListElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLDListElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLDListElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLDListElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDataElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDataElement.js
index fc232d5..b04c446 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDataElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDataElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLDataElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLDataElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLDataElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLDataElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDataListElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDataListElement.js
index 9d4fb0b..22ee6ff 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDataListElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDataListElement.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "HTMLDataListElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLDataListElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor HTMLDataListElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLDataListElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDetailsElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDetailsElement.js
index d41a1ea..2f42e88 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDetailsElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDetailsElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLDetailsElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLDetailsElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLDetailsElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLDetailsElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDialogElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDialogElement.js
index acd3c0d..bd270f3 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDialogElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDialogElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLDialogElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLDialogElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLDialogElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLDialogElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDirectoryElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDirectoryElement.js
index e9d3e85..14c5462 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDirectoryElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDirectoryElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLDirectoryElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLDirectoryElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLDirectoryElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLDirectoryElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDivElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDivElement.js
index ade37e7..ab89da5 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDivElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLDivElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLDivElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLDivElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLDivElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLDivElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js
index 450a23f..1d76609 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Element._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Element._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Element === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLElement before Element");
   }
@@ -412,7 +440,11 @@
         throw new TypeError("Illegal invocation");
       }
 
-      this.style.cssText = V;
+      const Q = esValue["style"];
+      if (!utils.isObject(Q)) {
+        throw new TypeError("Property 'style' is not an object");
+      }
+      Reflect.set(Q, "cssText", V);
     }
 
     get onabort() {
@@ -1210,12 +1242,20 @@
     get onmouseenter() {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       return utils.tryWrapperForImpl(esValue[implSymbol]["onmouseenter"]);
     }
 
     set onmouseenter(V) {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       V = utils.tryImplForWrapper(V);
 
       esValue[implSymbol]["onmouseenter"] = V;
@@ -1224,12 +1264,20 @@
     get onmouseleave() {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       return utils.tryWrapperForImpl(esValue[implSymbol]["onmouseleave"]);
     }
 
     set onmouseleave(V) {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       V = utils.tryImplForWrapper(V);
 
       esValue[implSymbol]["onmouseleave"] = V;
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLEmbedElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLEmbedElement.js
index 4bb8622..900af9b 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLEmbedElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLEmbedElement.js
@@ -15,20 +15,20 @@
 
 const interfaceName = "HTMLEmbedElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLEmbedElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -38,34 +38,62 @@
     throw new Error("Internal error: constructor HTMLEmbedElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLEmbedElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFieldSetElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFieldSetElement.js
index a9ec197..2cf5acb 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFieldSetElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFieldSetElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLFieldSetElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLFieldSetElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLFieldSetElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLFieldSetElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFontElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFontElement.js
index 3611fc5..28d479c 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFontElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFontElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLFontElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLFontElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLFontElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLFontElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFormElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFormElement.js
index d75b49d..7e9fae4 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFormElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFormElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLFormElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLFormElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLFormElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLFormElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFrameElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFrameElement.js
index 15c103f..897a601 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFrameElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFrameElement.js
@@ -15,20 +15,20 @@
 
 const interfaceName = "HTMLFrameElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLFrameElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -38,34 +38,62 @@
     throw new Error("Internal error: constructor HTMLFrameElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLFrameElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFrameSetElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFrameSetElement.js
index 2c75a1a..5f58e5e 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFrameSetElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLFrameSetElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLFrameSetElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLFrameSetElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLFrameSetElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLFrameSetElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHRElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHRElement.js
index 8463472..904a2b4 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHRElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHRElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLHRElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLHRElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLHRElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLHRElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHeadElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHeadElement.js
index 8ac2132..1bc6646 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHeadElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHeadElement.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "HTMLHeadElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLHeadElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor HTMLHeadElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLHeadElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHeadingElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHeadingElement.js
index 386380f..709cb46 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHeadingElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHeadingElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLHeadingElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLHeadingElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLHeadingElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLHeadingElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHtmlElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHtmlElement.js
index c9946c8..c1f4f5b 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHtmlElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLHtmlElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLHtmlElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLHtmlElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLHtmlElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLHtmlElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLIFrameElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLIFrameElement.js
index 28daaaf..171d6b1 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLIFrameElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLIFrameElement.js
@@ -15,20 +15,20 @@
 
 const interfaceName = "HTMLIFrameElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLIFrameElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -38,34 +38,62 @@
     throw new Error("Internal error: constructor HTMLIFrameElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLIFrameElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLImageElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLImageElement.js
index 88df021..5247cc2 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLImageElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLImageElement.js
@@ -16,20 +16,20 @@
 
 const interfaceName = "HTMLImageElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLImageElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -39,34 +39,62 @@
     throw new Error("Internal error: constructor HTMLImageElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLImageElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLInputElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLInputElement.js
index 36ff6b2..807ede4 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLInputElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLInputElement.js
@@ -17,20 +17,20 @@
 
 const interfaceName = "HTMLInputElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLInputElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -40,34 +40,62 @@
     throw new Error("Internal error: constructor HTMLInputElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLInputElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLIElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLIElement.js
index 6b08641..221ae38 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLIElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLIElement.js
@@ -13,20 +13,20 @@
 
 const interfaceName = "HTMLLIElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLLIElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -36,34 +36,62 @@
     throw new Error("Internal error: constructor HTMLLIElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLLIElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLabelElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLabelElement.js
index 1d621d7..33c6948 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLabelElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLabelElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLLabelElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLLabelElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLLabelElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLLabelElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLegendElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLegendElement.js
index 1d9cd35..4bd6ced 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLegendElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLegendElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLLegendElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLLegendElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLLegendElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLLegendElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLinkElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLinkElement.js
index 874aeed..b59179b 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLinkElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLLinkElement.js
@@ -15,20 +15,20 @@
 
 const interfaceName = "HTMLLinkElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLLinkElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -38,34 +38,62 @@
     throw new Error("Internal error: constructor HTMLLinkElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLLinkElement before HTMLElement");
   }
@@ -212,7 +240,11 @@
         throw new TypeError("Illegal invocation");
       }
 
-      this.relList.value = V;
+      const Q = esValue["relList"];
+      if (!utils.isObject(Q)) {
+        throw new TypeError("Property 'relList' is not an object");
+      }
+      Reflect.set(Q, "value", V);
     }
 
     get media() {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMapElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMapElement.js
index 90b8819..16abce7 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMapElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMapElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLMapElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLMapElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLMapElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLMapElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMarqueeElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMarqueeElement.js
index 0cc8e20..7175895 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMarqueeElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMarqueeElement.js
@@ -13,20 +13,20 @@
 
 const interfaceName = "HTMLMarqueeElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLMarqueeElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -36,34 +36,62 @@
     throw new Error("Internal error: constructor HTMLMarqueeElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLMarqueeElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMediaElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMediaElement.js
index 3ef27f3..60292a1 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMediaElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMediaElement.js
@@ -15,20 +15,20 @@
 
 const interfaceName = "HTMLMediaElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLMediaElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -38,34 +38,62 @@
     throw new Error("Internal error: constructor HTMLMediaElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLMediaElement before HTMLElement");
   }
@@ -108,12 +136,16 @@
     }
 
     play() {
-      const esValue = this !== null && this !== undefined ? this : globalObject;
-      if (!exports.is(esValue)) {
-        throw new TypeError("Illegal invocation");
-      }
+      try {
+        const esValue = this !== null && this !== undefined ? this : globalObject;
+        if (!exports.is(esValue)) {
+          throw new TypeError("Illegal invocation");
+        }
 
-      return utils.tryWrapperForImpl(esValue[implSymbol].play());
+        return utils.tryWrapperForImpl(esValue[implSymbol].play());
+      } catch (e) {
+        return Promise.reject(e);
+      }
     }
 
     pause() {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMenuElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMenuElement.js
index 09bf4c0..7d4cdcf 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMenuElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMenuElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLMenuElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLMenuElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLMenuElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLMenuElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMetaElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMetaElement.js
index e2aa3ad..ea05532 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMetaElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMetaElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLMetaElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLMetaElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLMetaElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLMetaElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMeterElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMeterElement.js
index 3bbf1d5..55a5de2 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMeterElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLMeterElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLMeterElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLMeterElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLMeterElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLMeterElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLModElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLModElement.js
index d98f71a..3ce80ec 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLModElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLModElement.js
@@ -15,20 +15,20 @@
 
 const interfaceName = "HTMLModElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLModElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -38,34 +38,62 @@
     throw new Error("Internal error: constructor HTMLModElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLModElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOListElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOListElement.js
index 00e5348..04f8621 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOListElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOListElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLOListElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLOListElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLOListElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLOListElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLObjectElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLObjectElement.js
index aaa271d..af9817d 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLObjectElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLObjectElement.js
@@ -16,20 +16,20 @@
 
 const interfaceName = "HTMLObjectElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLObjectElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -39,34 +39,62 @@
     throw new Error("Internal error: constructor HTMLObjectElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLObjectElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOptGroupElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOptGroupElement.js
index 565f49d..5dd112b 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOptGroupElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOptGroupElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLOptGroupElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLOptGroupElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLOptGroupElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLOptGroupElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOptionElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOptionElement.js
index c045182..d91cbf7 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOptionElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOptionElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLOptionElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLOptionElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLOptionElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLOptionElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOptionsCollection.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOptionsCollection.js
index 799ee2f..71346ea 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOptionsCollection.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOptionsCollection.js
@@ -14,20 +14,20 @@
 
 const interfaceName = "HTMLOptionsCollection";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLOptionsCollection'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -37,43 +37,75 @@
     throw new Error("Internal error: constructor HTMLOptionsCollection is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLCollection._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+function makeProxy(wrapper, globalObject) {
+  let proxyHandler = proxyHandlerCache.get(globalObject);
+  if (proxyHandler === undefined) {
+    proxyHandler = new ProxyHandler(globalObject);
+    proxyHandlerCache.set(globalObject, proxyHandler);
+  }
+  return new Proxy(wrapper, proxyHandler);
+}
+
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLCollection._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  {
-    let proxyHandler = proxyHandlerCache.get(globalObject);
-    if (proxyHandler === undefined) {
-      proxyHandler = new ProxyHandler(globalObject);
-      proxyHandlerCache.set(globalObject, proxyHandler);
-    }
-    obj = new Proxy(obj, proxyHandler);
-  }
+  wrapper = makeProxy(wrapper, globalObject);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = makeProxy(wrapper, globalObject);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLCollection === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLOptionsCollection before HTMLCollection");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOutputElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOutputElement.js
index c5a64dc..0c9415a 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOutputElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLOutputElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLOutputElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLOutputElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLOutputElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLOutputElement before HTMLElement");
   }
@@ -132,7 +160,11 @@
         throw new TypeError("Illegal invocation");
       }
 
-      this.htmlFor.value = V;
+      const Q = esValue["htmlFor"];
+      if (!utils.isObject(Q)) {
+        throw new TypeError("Property 'htmlFor' is not an object");
+      }
+      Reflect.set(Q, "value", V);
     }
 
     get form() {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLParagraphElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLParagraphElement.js
index f64ce90..d343b42 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLParagraphElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLParagraphElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLParagraphElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLParagraphElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLParagraphElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLParagraphElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLParamElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLParamElement.js
index 2bfece1..123034e 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLParamElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLParamElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLParamElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLParamElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLParamElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLParamElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLPictureElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLPictureElement.js
index df6dad8..9834a44 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLPictureElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLPictureElement.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "HTMLPictureElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLPictureElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor HTMLPictureElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLPictureElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLPreElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLPreElement.js
index 3010716..4bfd6a9 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLPreElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLPreElement.js
@@ -13,20 +13,20 @@
 
 const interfaceName = "HTMLPreElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLPreElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -36,34 +36,62 @@
     throw new Error("Internal error: constructor HTMLPreElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLPreElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLProgressElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLProgressElement.js
index 1c4c779..c7264f8 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLProgressElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLProgressElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLProgressElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLProgressElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLProgressElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLProgressElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLQuoteElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLQuoteElement.js
index 2154f78..e9d2205 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLQuoteElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLQuoteElement.js
@@ -15,20 +15,20 @@
 
 const interfaceName = "HTMLQuoteElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLQuoteElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -38,34 +38,62 @@
     throw new Error("Internal error: constructor HTMLQuoteElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLQuoteElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLScriptElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLScriptElement.js
index a404ef6..eb34510 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLScriptElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLScriptElement.js
@@ -15,20 +15,20 @@
 
 const interfaceName = "HTMLScriptElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLScriptElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -38,34 +38,62 @@
     throw new Error("Internal error: constructor HTMLScriptElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLScriptElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSelectElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSelectElement.js
index 3bda04b..aa88382 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSelectElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSelectElement.js
@@ -15,20 +15,20 @@
 
 const interfaceName = "HTMLSelectElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLSelectElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -38,43 +38,75 @@
     throw new Error("Internal error: constructor HTMLSelectElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+function makeProxy(wrapper, globalObject) {
+  let proxyHandler = proxyHandlerCache.get(globalObject);
+  if (proxyHandler === undefined) {
+    proxyHandler = new ProxyHandler(globalObject);
+    proxyHandlerCache.set(globalObject, proxyHandler);
+  }
+  return new Proxy(wrapper, proxyHandler);
+}
+
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  {
-    let proxyHandler = proxyHandlerCache.get(globalObject);
-    if (proxyHandler === undefined) {
-      proxyHandler = new ProxyHandler(globalObject);
-      proxyHandlerCache.set(globalObject, proxyHandler);
-    }
-    obj = new Proxy(obj, proxyHandler);
-  }
+  wrapper = makeProxy(wrapper, globalObject);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = makeProxy(wrapper, globalObject);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLSelectElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSlotElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSlotElement.js
index cb5ea1b..870d763 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSlotElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSlotElement.js
@@ -13,20 +13,20 @@
 
 const interfaceName = "HTMLSlotElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLSlotElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -36,34 +36,62 @@
     throw new Error("Internal error: constructor HTMLSlotElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLSlotElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSourceElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSourceElement.js
index 301bbd7..48f397b 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSourceElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSourceElement.js
@@ -15,20 +15,20 @@
 
 const interfaceName = "HTMLSourceElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLSourceElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -38,34 +38,62 @@
     throw new Error("Internal error: constructor HTMLSourceElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLSourceElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSpanElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSpanElement.js
index 8478a7f..fd8028d 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSpanElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLSpanElement.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "HTMLSpanElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLSpanElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor HTMLSpanElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLSpanElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLStyleElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLStyleElement.js
index cfbabec..13f5375 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLStyleElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLStyleElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLStyleElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLStyleElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLStyleElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLStyleElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableCaptionElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableCaptionElement.js
index 24fafb0..e286de5 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableCaptionElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableCaptionElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLTableCaptionElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLTableCaptionElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLTableCaptionElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLTableCaptionElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableCellElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableCellElement.js
index df5437b..cb056d5 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableCellElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableCellElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLTableCellElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLTableCellElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLTableCellElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLTableCellElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableColElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableColElement.js
index 899f1c4..29e6629 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableColElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableColElement.js
@@ -13,20 +13,20 @@
 
 const interfaceName = "HTMLTableColElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLTableColElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -36,34 +36,62 @@
     throw new Error("Internal error: constructor HTMLTableColElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLTableColElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableElement.js
index 41b7d8f..2c6ef4e 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableElement.js
@@ -14,20 +14,20 @@
 
 const interfaceName = "HTMLTableElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLTableElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -37,34 +37,62 @@
     throw new Error("Internal error: constructor HTMLTableElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLTableElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableRowElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableRowElement.js
index b8017fb..805cfa4 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableRowElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableRowElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLTableRowElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLTableRowElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLTableRowElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLTableRowElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableSectionElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableSectionElement.js
index 9c0e1a8..9a4350e 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableSectionElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTableSectionElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLTableSectionElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLTableSectionElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLTableSectionElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLTableSectionElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTemplateElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTemplateElement.js
index a5a3b3d..dc30c57 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTemplateElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTemplateElement.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "HTMLTemplateElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLTemplateElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor HTMLTemplateElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLTemplateElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTextAreaElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTextAreaElement.js
index 6b8cb97..69f3b3b 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTextAreaElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTextAreaElement.js
@@ -14,20 +14,20 @@
 
 const interfaceName = "HTMLTextAreaElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLTextAreaElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -37,34 +37,62 @@
     throw new Error("Internal error: constructor HTMLTextAreaElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLTextAreaElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTimeElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTimeElement.js
index ddf6bcc..5584e73 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTimeElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTimeElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLTimeElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLTimeElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLTimeElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLTimeElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTitleElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTitleElement.js
index 47ab07d..b1ea12d 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTitleElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTitleElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLTitleElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLTitleElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLTitleElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLTitleElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTrackElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTrackElement.js
index 9f9b5eb..b28d3c8 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTrackElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLTrackElement.js
@@ -15,20 +15,20 @@
 
 const interfaceName = "HTMLTrackElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLTrackElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -38,34 +38,62 @@
     throw new Error("Internal error: constructor HTMLTrackElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLTrackElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLUListElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLUListElement.js
index a909478..88f8831 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLUListElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLUListElement.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "HTMLUListElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLUListElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor HTMLUListElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLUListElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLUnknownElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLUnknownElement.js
index 84ca0cd..9e5fea3 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLUnknownElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLUnknownElement.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "HTMLUnknownElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLUnknownElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,34 +32,62 @@
     throw new Error("Internal error: constructor HTMLUnknownElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLUnknownElement before HTMLElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLVideoElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLVideoElement.js
index 5759ad4..200fa02 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLVideoElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HTMLVideoElement.js
@@ -16,20 +16,20 @@
 
 const interfaceName = "HTMLVideoElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HTMLVideoElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -39,34 +39,62 @@
     throw new Error("Internal error: constructor HTMLVideoElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  HTMLMediaElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  HTMLMediaElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.HTMLMediaElement === undefined) {
     throw new Error("Internal error: attempting to evaluate HTMLVideoElement before HTMLMediaElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HashChangeEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HashChangeEvent.js
index beeac89..5827ecc 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HashChangeEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HashChangeEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "HashChangeEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'HashChangeEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor HashChangeEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Event._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Event._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Event === undefined) {
     throw new Error("Internal error: attempting to evaluate HashChangeEvent before Event");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HashChangeEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HashChangeEventInit.js
index 2ecb9cc..af8bf80 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HashChangeEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/HashChangeEventInit.js
@@ -12,7 +12,7 @@
     const key = "newURL";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["USVString"](value, { context: context + " has member newURL that" });
+      value = conversions["USVString"](value, { context: context + " has member 'newURL' that" });
 
       ret[key] = value;
     } else {
@@ -24,7 +24,7 @@
     const key = "oldURL";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["USVString"](value, { context: context + " has member oldURL that" });
+      value = conversions["USVString"](value, { context: context + " has member 'oldURL' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Headers.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Headers.js
index 10026e4..e9ffb86 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Headers.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Headers.js
@@ -47,20 +47,20 @@
   }
 });
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Headers'.`);
 };
 
-exports.createDefaultIterator = function createDefaultIterator(target, kind) {
+exports.createDefaultIterator = (target, kind) => {
   const iterator = Object.create(IteratorPrototype);
   Object.defineProperty(iterator, utils.iterInternalSymbol, {
     value: { target, kind, index: 0 },
@@ -69,7 +69,7 @@
   return iterator;
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -79,32 +79,59 @@
     throw new Error("Internal error: constructor Headers is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class Headers {
     constructor() {
       const args = [];
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/History.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/History.js
index e55cd63..67a8e95 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/History.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/History.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "History";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'History'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor History is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class History {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/InputEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/InputEvent.js
index 794413c..00bf20b 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/InputEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/InputEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "InputEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'InputEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor InputEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  UIEvent._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  UIEvent._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.UIEvent === undefined) {
     throw new Error("Internal error: attempting to evaluate InputEvent before UIEvent");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/InputEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/InputEventInit.js
index 9cb4bdd..b84141e 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/InputEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/InputEventInit.js
@@ -15,7 +15,7 @@
       if (value === null || value === undefined) {
         value = null;
       } else {
-        value = conversions["DOMString"](value, { context: context + " has member data that" });
+        value = conversions["DOMString"](value, { context: context + " has member 'data' that" });
       }
       ret[key] = value;
     } else {
@@ -27,7 +27,7 @@
     const key = "isComposing";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member isComposing that" });
+      value = conversions["boolean"](value, { context: context + " has member 'isComposing' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/KeyboardEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/KeyboardEvent.js
index 7305329..59b95bc 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/KeyboardEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/KeyboardEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "KeyboardEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'KeyboardEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor KeyboardEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  UIEvent._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  UIEvent._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.UIEvent === undefined) {
     throw new Error("Internal error: attempting to evaluate KeyboardEvent before UIEvent");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/KeyboardEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/KeyboardEventInit.js
index 39eb568..b6b38aa 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/KeyboardEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/KeyboardEventInit.js
@@ -12,7 +12,7 @@
     const key = "charCode";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned long"](value, { context: context + " has member charCode that" });
+      value = conversions["unsigned long"](value, { context: context + " has member 'charCode' that" });
 
       ret[key] = value;
     } else {
@@ -24,7 +24,7 @@
     const key = "code";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["DOMString"](value, { context: context + " has member code that" });
+      value = conversions["DOMString"](value, { context: context + " has member 'code' that" });
 
       ret[key] = value;
     } else {
@@ -36,7 +36,7 @@
     const key = "isComposing";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member isComposing that" });
+      value = conversions["boolean"](value, { context: context + " has member 'isComposing' that" });
 
       ret[key] = value;
     } else {
@@ -48,7 +48,7 @@
     const key = "key";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["DOMString"](value, { context: context + " has member key that" });
+      value = conversions["DOMString"](value, { context: context + " has member 'key' that" });
 
       ret[key] = value;
     } else {
@@ -60,7 +60,7 @@
     const key = "keyCode";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned long"](value, { context: context + " has member keyCode that" });
+      value = conversions["unsigned long"](value, { context: context + " has member 'keyCode' that" });
 
       ret[key] = value;
     } else {
@@ -72,7 +72,7 @@
     const key = "location";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned long"](value, { context: context + " has member location that" });
+      value = conversions["unsigned long"](value, { context: context + " has member 'location' that" });
 
       ret[key] = value;
     } else {
@@ -84,7 +84,7 @@
     const key = "repeat";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member repeat that" });
+      value = conversions["boolean"](value, { context: context + " has member 'repeat' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Location.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Location.js
index 2ae764b..a402e81 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Location.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Location.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "Location";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Location'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,17 +31,22 @@
     throw new Error("Internal error: constructor Location is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
+  return Object.create(ctor.prototype);
+}
+
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
 };
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
 };
-exports._internalSetup = function _internalSetup(obj, globalObject) {
+
+exports._internalSetup = (wrapper, globalObject) => {
   Object.defineProperties(
-    obj,
+    wrapper,
     Object.getOwnPropertyDescriptors({
       assign(url) {
         const esValue = this !== null && this !== undefined ? this : globalObject;
@@ -289,7 +294,7 @@
     })
   );
 
-  Object.defineProperties(obj, {
+  Object.defineProperties(wrapper, {
     assign: { configurable: false, writable: false },
     replace: { configurable: false, writable: false },
     reload: { configurable: false, writable: false },
@@ -305,23 +310,45 @@
     hash: { configurable: false }
   });
 };
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class Location {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MessageEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MessageEvent.js
index 6e78996..2197ef9 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MessageEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MessageEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "MessageEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'MessageEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor MessageEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Event._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Event._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker", "AudioWorklet"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Event === undefined) {
     throw new Error("Internal error: attempting to evaluate MessageEvent before Event");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MessageEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MessageEventInit.js
index a381e26..d3837fe 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MessageEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MessageEventInit.js
@@ -12,7 +12,7 @@
     const key = "data";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["any"](value, { context: context + " has member data that" });
+      value = conversions["any"](value, { context: context + " has member 'data' that" });
 
       ret[key] = value;
     } else {
@@ -24,7 +24,7 @@
     const key = "lastEventId";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["DOMString"](value, { context: context + " has member lastEventId that" });
+      value = conversions["DOMString"](value, { context: context + " has member 'lastEventId' that" });
 
       ret[key] = value;
     } else {
@@ -36,7 +36,7 @@
     const key = "origin";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["USVString"](value, { context: context + " has member origin that" });
+      value = conversions["USVString"](value, { context: context + " has member 'origin' that" });
 
       ret[key] = value;
     } else {
@@ -49,7 +49,7 @@
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
       if (!utils.isObject(value)) {
-        throw new TypeError(context + " has member ports that" + " is not an iterable object.");
+        throw new TypeError(context + " has member 'ports' that" + " is not an iterable object.");
       } else {
         const V = [];
         const tmp = value;
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MimeType.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MimeType.js
index 8d54c9b..802b03e 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MimeType.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MimeType.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "MimeType";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'MimeType'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor MimeType is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class MimeType {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MimeTypeArray.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MimeTypeArray.js
index f2bcbd0..483f0c2 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MimeTypeArray.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MimeTypeArray.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "MimeTypeArray";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'MimeTypeArray'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,34 +31,63 @@
     throw new Error("Internal error: constructor MimeTypeArray is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj = new Proxy(obj, proxyHandler);
+  wrapper = new Proxy(wrapper, proxyHandler);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = new Proxy(wrapper, proxyHandler);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class MimeTypeArray {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MouseEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MouseEvent.js
index 4636618..7d652fc 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MouseEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MouseEvent.js
@@ -11,20 +11,20 @@
 
 const interfaceName = "MouseEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'MouseEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -34,34 +34,62 @@
     throw new Error("Internal error: constructor MouseEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  UIEvent._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  UIEvent._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.UIEvent === undefined) {
     throw new Error("Internal error: attempting to evaluate MouseEvent before UIEvent");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MouseEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MouseEventInit.js
index 7ee6887..f49c8a6 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MouseEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MouseEventInit.js
@@ -13,7 +13,7 @@
     const key = "button";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["short"](value, { context: context + " has member button that" });
+      value = conversions["short"](value, { context: context + " has member 'button' that" });
 
       ret[key] = value;
     } else {
@@ -25,7 +25,7 @@
     const key = "buttons";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned short"](value, { context: context + " has member buttons that" });
+      value = conversions["unsigned short"](value, { context: context + " has member 'buttons' that" });
 
       ret[key] = value;
     } else {
@@ -37,7 +37,7 @@
     const key = "clientX";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["long"](value, { context: context + " has member clientX that" });
+      value = conversions["long"](value, { context: context + " has member 'clientX' that" });
 
       ret[key] = value;
     } else {
@@ -49,7 +49,7 @@
     const key = "clientY";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["long"](value, { context: context + " has member clientY that" });
+      value = conversions["long"](value, { context: context + " has member 'clientY' that" });
 
       ret[key] = value;
     } else {
@@ -64,7 +64,7 @@
       if (value === null || value === undefined) {
         value = null;
       } else {
-        value = EventTarget.convert(value, { context: context + " has member relatedTarget that" });
+        value = EventTarget.convert(value, { context: context + " has member 'relatedTarget' that" });
       }
       ret[key] = value;
     } else {
@@ -76,7 +76,7 @@
     const key = "screenX";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["long"](value, { context: context + " has member screenX that" });
+      value = conversions["long"](value, { context: context + " has member 'screenX' that" });
 
       ret[key] = value;
     } else {
@@ -88,7 +88,7 @@
     const key = "screenY";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["long"](value, { context: context + " has member screenY that" });
+      value = conversions["long"](value, { context: context + " has member 'screenY' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MutationObserver.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MutationObserver.js
index cd6ca04..09689fd 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MutationObserver.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MutationObserver.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "MutationObserver";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'MutationObserver'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,32 +33,59 @@
     throw new Error("Internal error: constructor MutationObserver is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class MutationObserver {
     constructor(callback) {
       if (arguments.length < 1) {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MutationObserverInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MutationObserverInit.js
index 327f2c3..424c8e0 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MutationObserverInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MutationObserverInit.js
@@ -9,13 +9,13 @@
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
       if (!utils.isObject(value)) {
-        throw new TypeError(context + " has member attributeFilter that" + " is not an iterable object.");
+        throw new TypeError(context + " has member 'attributeFilter' that" + " is not an iterable object.");
       } else {
         const V = [];
         const tmp = value;
         for (let nextItem of tmp) {
           nextItem = conversions["DOMString"](nextItem, {
-            context: context + " has member attributeFilter that" + "'s element"
+            context: context + " has member 'attributeFilter' that" + "'s element"
           });
 
           V.push(nextItem);
@@ -31,7 +31,7 @@
     const key = "attributeOldValue";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member attributeOldValue that" });
+      value = conversions["boolean"](value, { context: context + " has member 'attributeOldValue' that" });
 
       ret[key] = value;
     }
@@ -41,7 +41,7 @@
     const key = "attributes";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member attributes that" });
+      value = conversions["boolean"](value, { context: context + " has member 'attributes' that" });
 
       ret[key] = value;
     }
@@ -51,7 +51,7 @@
     const key = "characterData";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member characterData that" });
+      value = conversions["boolean"](value, { context: context + " has member 'characterData' that" });
 
       ret[key] = value;
     }
@@ -61,7 +61,7 @@
     const key = "characterDataOldValue";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member characterDataOldValue that" });
+      value = conversions["boolean"](value, { context: context + " has member 'characterDataOldValue' that" });
 
       ret[key] = value;
     }
@@ -71,7 +71,7 @@
     const key = "childList";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member childList that" });
+      value = conversions["boolean"](value, { context: context + " has member 'childList' that" });
 
       ret[key] = value;
     } else {
@@ -83,7 +83,7 @@
     const key = "subtree";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member subtree that" });
+      value = conversions["boolean"](value, { context: context + " has member 'subtree' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MutationRecord.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MutationRecord.js
index 3d0bcab..afc2a47 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MutationRecord.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/MutationRecord.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "MutationRecord";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'MutationRecord'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor MutationRecord is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class MutationRecord {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NamedNodeMap.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NamedNodeMap.js
index f80998c..f75d4c1 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NamedNodeMap.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NamedNodeMap.js
@@ -11,20 +11,20 @@
 
 const interfaceName = "NamedNodeMap";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'NamedNodeMap'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -34,34 +34,63 @@
     throw new Error("Internal error: constructor NamedNodeMap is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj = new Proxy(obj, proxyHandler);
+  wrapper = new Proxy(wrapper, proxyHandler);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = new Proxy(wrapper, proxyHandler);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class NamedNodeMap {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Navigator.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Navigator.js
index 774a6ab..b1baa6d 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Navigator.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Navigator.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "Navigator";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Navigator'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor Navigator is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class Navigator {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Node.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Node.js
index e5c96f5..0649dea 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Node.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Node.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "Node";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Node'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor Node is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  EventTarget._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  EventTarget._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.EventTarget === undefined) {
     throw new Error("Internal error: attempting to evaluate Node before EventTarget");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NodeFilter.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NodeFilter.js
new file mode 100644
index 0000000..7c53d33
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NodeFilter.js
@@ -0,0 +1,74 @@
+"use strict";
+
+const conversions = require("webidl-conversions");
+const utils = require("./utils.js");
+
+exports.convert = function convert(value, { context = "The provided value" } = {}) {
+  if (!utils.isObject(value)) {
+    throw new TypeError(`${context} is not an object.`);
+  }
+
+  function callTheUserObjectsOperation(node) {
+    let thisArg = utils.tryWrapperForImpl(this);
+    let O = value;
+    let X = O;
+
+    if (typeof O !== "function") {
+      X = O["acceptNode"];
+      if (typeof X !== "function") {
+        throw new TypeError(`${context} does not correctly implement NodeFilter.`);
+      }
+      thisArg = O;
+    }
+
+    node = utils.tryWrapperForImpl(node);
+
+    let callResult = Reflect.apply(X, thisArg, [node]);
+
+    callResult = conversions["unsigned short"](callResult, { context: context });
+
+    return callResult;
+  }
+
+  callTheUserObjectsOperation[utils.wrapperSymbol] = value;
+  callTheUserObjectsOperation.objectReference = value;
+
+  return callTheUserObjectsOperation;
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
+  const NodeFilter = () => {
+    throw new TypeError("Illegal invocation");
+  };
+
+  Object.defineProperties(NodeFilter, {
+    FILTER_ACCEPT: { value: 1, enumerable: true },
+    FILTER_REJECT: { value: 2, enumerable: true },
+    FILTER_SKIP: { value: 3, enumerable: true },
+    SHOW_ALL: { value: 0xffffffff, enumerable: true },
+    SHOW_ELEMENT: { value: 0x1, enumerable: true },
+    SHOW_ATTRIBUTE: { value: 0x2, enumerable: true },
+    SHOW_TEXT: { value: 0x4, enumerable: true },
+    SHOW_CDATA_SECTION: { value: 0x8, enumerable: true },
+    SHOW_ENTITY_REFERENCE: { value: 0x10, enumerable: true },
+    SHOW_ENTITY: { value: 0x20, enumerable: true },
+    SHOW_PROCESSING_INSTRUCTION: { value: 0x40, enumerable: true },
+    SHOW_COMMENT: { value: 0x80, enumerable: true },
+    SHOW_DOCUMENT: { value: 0x100, enumerable: true },
+    SHOW_DOCUMENT_TYPE: { value: 0x200, enumerable: true },
+    SHOW_DOCUMENT_FRAGMENT: { value: 0x400, enumerable: true },
+    SHOW_NOTATION: { value: 0x800, enumerable: true }
+  });
+
+  Object.defineProperty(globalObject, "NodeFilter", {
+    configurable: true,
+    writable: true,
+    value: NodeFilter
+  });
+};
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NodeIterator.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NodeIterator.js
index 92e3c33..2676b20 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NodeIterator.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NodeIterator.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "NodeIterator";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'NodeIterator'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor NodeIterator is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class NodeIterator {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NodeList.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NodeList.js
index 225351f..bffa3fb 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NodeList.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/NodeList.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "NodeList";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'NodeList'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,34 +31,63 @@
     throw new Error("Internal error: constructor NodeList is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj = new Proxy(obj, proxyHandler);
+  wrapper = new Proxy(wrapper, proxyHandler);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = new Proxy(wrapper, proxyHandler);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class NodeList {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PageTransitionEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PageTransitionEvent.js
index 63f74ed..ebf7066 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PageTransitionEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PageTransitionEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "PageTransitionEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'PageTransitionEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor PageTransitionEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Event._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Event._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Event === undefined) {
     throw new Error("Internal error: attempting to evaluate PageTransitionEvent before Event");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PageTransitionEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PageTransitionEventInit.js
index 27d9024..1eeffb8 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PageTransitionEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PageTransitionEventInit.js
@@ -12,7 +12,7 @@
     const key = "persisted";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member persisted that" });
+      value = conversions["boolean"](value, { context: context + " has member 'persisted' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Performance.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Performance.js
index 823d3fe..52b199d 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Performance.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Performance.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "Performance";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Performance'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,34 +32,62 @@
     throw new Error("Internal error: constructor Performance is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  EventTarget._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  EventTarget._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.EventTarget === undefined) {
     throw new Error("Internal error: attempting to evaluate Performance before EventTarget");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Plugin.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Plugin.js
index c3b5602..a8c2702 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Plugin.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Plugin.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "Plugin";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Plugin'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,34 +31,63 @@
     throw new Error("Internal error: constructor Plugin is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj = new Proxy(obj, proxyHandler);
+  wrapper = new Proxy(wrapper, proxyHandler);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = new Proxy(wrapper, proxyHandler);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class Plugin {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PluginArray.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PluginArray.js
index 25ea20a..fce79bc 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PluginArray.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PluginArray.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "PluginArray";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'PluginArray'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,34 +31,63 @@
     throw new Error("Internal error: constructor PluginArray is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj = new Proxy(obj, proxyHandler);
+  wrapper = new Proxy(wrapper, proxyHandler);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = new Proxy(wrapper, proxyHandler);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class PluginArray {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PopStateEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PopStateEvent.js
index 8f576a8..9b091b1 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PopStateEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PopStateEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "PopStateEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'PopStateEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor PopStateEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Event._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Event._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Event === undefined) {
     throw new Error("Internal error: attempting to evaluate PopStateEvent before Event");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PopStateEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PopStateEventInit.js
index ce9bcbb..6f9c674 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PopStateEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/PopStateEventInit.js
@@ -12,7 +12,7 @@
     const key = "state";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["any"](value, { context: context + " has member state that" });
+      value = conversions["any"](value, { context: context + " has member 'state' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ProcessingInstruction.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ProcessingInstruction.js
index 6a63c77..f743520 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ProcessingInstruction.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ProcessingInstruction.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "ProcessingInstruction";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'ProcessingInstruction'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,34 +32,62 @@
     throw new Error("Internal error: constructor ProcessingInstruction is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  CharacterData._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  CharacterData._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.CharacterData === undefined) {
     throw new Error("Internal error: attempting to evaluate ProcessingInstruction before CharacterData");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ProgressEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ProgressEvent.js
index 4efd9fb..8d62213 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ProgressEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ProgressEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "ProgressEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'ProgressEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor ProgressEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Event._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Event._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "DedicatedWorker", "SharedWorker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Event === undefined) {
     throw new Error("Internal error: attempting to evaluate ProgressEvent before Event");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ProgressEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ProgressEventInit.js
index 1acbccc..7dd3dee 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ProgressEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ProgressEventInit.js
@@ -12,7 +12,7 @@
     const key = "lengthComputable";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member lengthComputable that" });
+      value = conversions["boolean"](value, { context: context + " has member 'lengthComputable' that" });
 
       ret[key] = value;
     } else {
@@ -24,7 +24,7 @@
     const key = "loaded";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned long long"](value, { context: context + " has member loaded that" });
+      value = conversions["unsigned long long"](value, { context: context + " has member 'loaded' that" });
 
       ret[key] = value;
     } else {
@@ -36,7 +36,7 @@
     const key = "total";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned long long"](value, { context: context + " has member total that" });
+      value = conversions["unsigned long long"](value, { context: context + " has member 'total' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Range.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Range.js
index 9031401..542602c 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Range.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Range.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "Range";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Range'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,34 +35,62 @@
     throw new Error("Internal error: constructor Range is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  AbstractRange._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  AbstractRange._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.AbstractRange === undefined) {
     throw new Error("Internal error: attempting to evaluate Range before AbstractRange");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGAnimatedString.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGAnimatedString.js
index 11145d5..c945ec1 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGAnimatedString.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGAnimatedString.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "SVGAnimatedString";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'SVGAnimatedString'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor SVGAnimatedString is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class SVGAnimatedString {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGBoundingBoxOptions.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGBoundingBoxOptions.js
index 4cfd34e..67fa2fb 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGBoundingBoxOptions.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGBoundingBoxOptions.js
@@ -8,7 +8,7 @@
     const key = "clipped";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member clipped that" });
+      value = conversions["boolean"](value, { context: context + " has member 'clipped' that" });
 
       ret[key] = value;
     } else {
@@ -20,7 +20,7 @@
     const key = "fill";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member fill that" });
+      value = conversions["boolean"](value, { context: context + " has member 'fill' that" });
 
       ret[key] = value;
     } else {
@@ -32,7 +32,7 @@
     const key = "markers";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member markers that" });
+      value = conversions["boolean"](value, { context: context + " has member 'markers' that" });
 
       ret[key] = value;
     } else {
@@ -44,7 +44,7 @@
     const key = "stroke";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["boolean"](value, { context: context + " has member stroke that" });
+      value = conversions["boolean"](value, { context: context + " has member 'stroke' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGElement.js
index a5dd9fc..1bd39aa 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGElement.js
@@ -11,20 +11,20 @@
 
 const interfaceName = "SVGElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'SVGElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -34,34 +34,62 @@
     throw new Error("Internal error: constructor SVGElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Element._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Element._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Element === undefined) {
     throw new Error("Internal error: attempting to evaluate SVGElement before Element");
   }
@@ -139,7 +167,11 @@
         throw new TypeError("Illegal invocation");
       }
 
-      this.style.cssText = V;
+      const Q = esValue["style"];
+      if (!utils.isObject(Q)) {
+        throw new TypeError("Property 'style' is not an object");
+      }
+      Reflect.set(Q, "cssText", V);
     }
 
     get onabort() {
@@ -937,12 +969,20 @@
     get onmouseenter() {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       return utils.tryWrapperForImpl(esValue[implSymbol]["onmouseenter"]);
     }
 
     set onmouseenter(V) {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       V = utils.tryImplForWrapper(V);
 
       esValue[implSymbol]["onmouseenter"] = V;
@@ -951,12 +991,20 @@
     get onmouseleave() {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       return utils.tryWrapperForImpl(esValue[implSymbol]["onmouseleave"]);
     }
 
     set onmouseleave(V) {
       const esValue = this !== null && this !== undefined ? this : globalObject;
 
+      if (!exports.is(esValue)) {
+        return;
+      }
+
       V = utils.tryImplForWrapper(V);
 
       esValue[implSymbol]["onmouseleave"] = V;
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGGraphicsElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGGraphicsElement.js
index 94140ea..3c8415e 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGGraphicsElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGGraphicsElement.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "SVGGraphicsElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'SVGGraphicsElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,34 +32,62 @@
     throw new Error("Internal error: constructor SVGGraphicsElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  SVGElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  SVGElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.SVGElement === undefined) {
     throw new Error("Internal error: attempting to evaluate SVGGraphicsElement before SVGElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGNumber.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGNumber.js
index b5a05c4..afd6bba 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGNumber.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGNumber.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "SVGNumber";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'SVGNumber'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor SVGNumber is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class SVGNumber {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGSVGElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGSVGElement.js
index c7fa509..c4c4dd0 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGSVGElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGSVGElement.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "SVGSVGElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'SVGSVGElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,34 +32,62 @@
     throw new Error("Internal error: constructor SVGSVGElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  SVGGraphicsElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  SVGGraphicsElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.SVGGraphicsElement === undefined) {
     throw new Error("Internal error: attempting to evaluate SVGSVGElement before SVGGraphicsElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGStringList.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGStringList.js
index e9fba61..d430f9b 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGStringList.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGStringList.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "SVGStringList";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'SVGStringList'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,34 +31,63 @@
     throw new Error("Internal error: constructor SVGStringList is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj = new Proxy(obj, proxyHandler);
+  wrapper = new Proxy(wrapper, proxyHandler);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = new Proxy(wrapper, proxyHandler);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class SVGStringList {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGTitleElement.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGTitleElement.js
index f89bba3..be60fb6 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGTitleElement.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SVGTitleElement.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "SVGTitleElement";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'SVGTitleElement'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,34 +32,62 @@
     throw new Error("Internal error: constructor SVGTitleElement is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  SVGElement._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  SVGElement._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.SVGElement === undefined) {
     throw new Error("Internal error: attempting to evaluate SVGTitleElement before SVGElement");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Screen.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Screen.js
index c004a43..92346cf 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Screen.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Screen.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "Screen";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Screen'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor Screen is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class Screen {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollBehavior.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollBehavior.js
index a1df43e..40ff17c 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollBehavior.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollBehavior.js
@@ -5,8 +5,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for ScrollBehavior`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for ScrollBehavior`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollIntoViewOptions.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollIntoViewOptions.js
index 4cba066..6294eaf 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollIntoViewOptions.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollIntoViewOptions.js
@@ -13,7 +13,7 @@
     const key = "block";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = ScrollLogicalPosition.convert(value, { context: context + " has member block that" });
+      value = ScrollLogicalPosition.convert(value, { context: context + " has member 'block' that" });
 
       ret[key] = value;
     } else {
@@ -25,7 +25,7 @@
     const key = "inline";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = ScrollLogicalPosition.convert(value, { context: context + " has member inline that" });
+      value = ScrollLogicalPosition.convert(value, { context: context + " has member 'inline' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollLogicalPosition.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollLogicalPosition.js
index 7a6ef4d..4cd4a69 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollLogicalPosition.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollLogicalPosition.js
@@ -5,8 +5,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for ScrollLogicalPosition`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for ScrollLogicalPosition`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollOptions.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollOptions.js
index 1195c53..fc5a346 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollOptions.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollOptions.js
@@ -10,7 +10,7 @@
     const key = "behavior";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = ScrollBehavior.convert(value, { context: context + " has member behavior that" });
+      value = ScrollBehavior.convert(value, { context: context + " has member 'behavior' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollRestoration.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollRestoration.js
index 49d1d98..9c55989 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollRestoration.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ScrollRestoration.js
@@ -5,8 +5,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for ScrollRestoration`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for ScrollRestoration`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Selection.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Selection.js
index 2d331d9..f3a3cc6 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Selection.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Selection.js
@@ -12,20 +12,20 @@
 
 const interfaceName = "Selection";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Selection'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -35,32 +35,59 @@
     throw new Error("Internal error: constructor Selection is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class Selection {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SelectionMode.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SelectionMode.js
index d000f90..3ee6afb 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SelectionMode.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SelectionMode.js
@@ -5,8 +5,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for SelectionMode`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for SelectionMode`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ShadowRoot.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ShadowRoot.js
index 4363d14..c2660f5 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ShadowRoot.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ShadowRoot.js
@@ -11,20 +11,20 @@
 
 const interfaceName = "ShadowRoot";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'ShadowRoot'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -34,34 +34,62 @@
     throw new Error("Internal error: constructor ShadowRoot is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  DocumentFragment._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  DocumentFragment._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.DocumentFragment === undefined) {
     throw new Error("Internal error: attempting to evaluate ShadowRoot before DocumentFragment");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ShadowRootInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ShadowRootInit.js
index 9e1db96..3023fdb 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ShadowRootInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ShadowRootInit.js
@@ -10,7 +10,7 @@
     const key = "mode";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = ShadowRootMode.convert(value, { context: context + " has member mode that" });
+      value = ShadowRootMode.convert(value, { context: context + " has member 'mode' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ShadowRootMode.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ShadowRootMode.js
index 7b7cdb9..3a15717 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ShadowRootMode.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ShadowRootMode.js
@@ -5,8 +5,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for ShadowRootMode`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for ShadowRootMode`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StaticRange.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StaticRange.js
index 5fe1315..bbd1639 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StaticRange.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StaticRange.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "StaticRange";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'StaticRange'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor StaticRange is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  AbstractRange._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  AbstractRange._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.AbstractRange === undefined) {
     throw new Error("Internal error: attempting to evaluate StaticRange before AbstractRange");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StaticRangeInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StaticRangeInit.js
index bee1483..3df4339 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StaticRangeInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StaticRangeInit.js
@@ -10,7 +10,7 @@
     const key = "endContainer";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = Node.convert(value, { context: context + " has member endContainer that" });
+      value = Node.convert(value, { context: context + " has member 'endContainer' that" });
 
       ret[key] = value;
     } else {
@@ -22,7 +22,7 @@
     const key = "endOffset";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned long"](value, { context: context + " has member endOffset that" });
+      value = conversions["unsigned long"](value, { context: context + " has member 'endOffset' that" });
 
       ret[key] = value;
     } else {
@@ -34,7 +34,7 @@
     const key = "startContainer";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = Node.convert(value, { context: context + " has member startContainer that" });
+      value = Node.convert(value, { context: context + " has member 'startContainer' that" });
 
       ret[key] = value;
     } else {
@@ -46,7 +46,7 @@
     const key = "startOffset";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned long"](value, { context: context + " has member startOffset that" });
+      value = conversions["unsigned long"](value, { context: context + " has member 'startOffset' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Storage.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Storage.js
index 97fda42..f17bfaf 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Storage.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Storage.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "Storage";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Storage'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,34 +31,63 @@
     throw new Error("Internal error: constructor Storage is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj = new Proxy(obj, proxyHandler);
+  wrapper = new Proxy(wrapper, proxyHandler);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = new Proxy(wrapper, proxyHandler);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class Storage {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StorageEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StorageEvent.js
index 47241d9..eff4e79 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StorageEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StorageEvent.js
@@ -11,20 +11,20 @@
 
 const interfaceName = "StorageEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'StorageEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -34,34 +34,62 @@
     throw new Error("Internal error: constructor StorageEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Event._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Event._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Event === undefined) {
     throw new Error("Internal error: attempting to evaluate StorageEvent before Event");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StorageEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StorageEventInit.js
index 64c303b..9c28e14 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StorageEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StorageEventInit.js
@@ -16,7 +16,7 @@
       if (value === null || value === undefined) {
         value = null;
       } else {
-        value = conversions["DOMString"](value, { context: context + " has member key that" });
+        value = conversions["DOMString"](value, { context: context + " has member 'key' that" });
       }
       ret[key] = value;
     } else {
@@ -31,7 +31,7 @@
       if (value === null || value === undefined) {
         value = null;
       } else {
-        value = conversions["DOMString"](value, { context: context + " has member newValue that" });
+        value = conversions["DOMString"](value, { context: context + " has member 'newValue' that" });
       }
       ret[key] = value;
     } else {
@@ -46,7 +46,7 @@
       if (value === null || value === undefined) {
         value = null;
       } else {
-        value = conversions["DOMString"](value, { context: context + " has member oldValue that" });
+        value = conversions["DOMString"](value, { context: context + " has member 'oldValue' that" });
       }
       ret[key] = value;
     } else {
@@ -61,7 +61,7 @@
       if (value === null || value === undefined) {
         value = null;
       } else {
-        value = Storage.convert(value, { context: context + " has member storageArea that" });
+        value = Storage.convert(value, { context: context + " has member 'storageArea' that" });
       }
       ret[key] = value;
     } else {
@@ -73,7 +73,7 @@
     const key = "url";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["USVString"](value, { context: context + " has member url that" });
+      value = conversions["USVString"](value, { context: context + " has member 'url' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StyleSheetList.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StyleSheetList.js
index 9c1bc35..17ddd31 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StyleSheetList.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/StyleSheetList.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "StyleSheetList";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'StyleSheetList'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,34 +31,63 @@
     throw new Error("Internal error: constructor StyleSheetList is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj = new Proxy(obj, proxyHandler);
+  wrapper = new Proxy(wrapper, proxyHandler);
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  let wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper = new Proxy(wrapper, proxyHandler);
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class StyleSheetList {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SupportedType.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SupportedType.js
index 668ee55..3260bac 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SupportedType.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/SupportedType.js
@@ -11,8 +11,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for SupportedType`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for SupportedType`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Text.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Text.js
index d811440..4beef39 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Text.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/Text.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "Text";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'Text'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,34 +32,62 @@
     throw new Error("Internal error: constructor Text is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  CharacterData._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  CharacterData._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.CharacterData === undefined) {
     throw new Error("Internal error: attempting to evaluate Text before CharacterData");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TextTrackKind.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TextTrackKind.js
index b3b01c0..977b607 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TextTrackKind.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TextTrackKind.js
@@ -5,8 +5,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for TextTrackKind`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for TextTrackKind`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TouchEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TouchEvent.js
index b03e185..c3a026f 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TouchEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TouchEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "TouchEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'TouchEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor TouchEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  UIEvent._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  UIEvent._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.UIEvent === undefined) {
     throw new Error("Internal error: attempting to evaluate TouchEvent before UIEvent");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TouchEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TouchEventInit.js
index ae6a9e8..670568e 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TouchEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TouchEventInit.js
@@ -13,7 +13,7 @@
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
       if (!utils.isObject(value)) {
-        throw new TypeError(context + " has member changedTouches that" + " is not an iterable object.");
+        throw new TypeError(context + " has member 'changedTouches' that" + " is not an iterable object.");
       } else {
         const V = [];
         const tmp = value;
@@ -36,7 +36,7 @@
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
       if (!utils.isObject(value)) {
-        throw new TypeError(context + " has member targetTouches that" + " is not an iterable object.");
+        throw new TypeError(context + " has member 'targetTouches' that" + " is not an iterable object.");
       } else {
         const V = [];
         const tmp = value;
@@ -59,7 +59,7 @@
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
       if (!utils.isObject(value)) {
-        throw new TypeError(context + " has member touches that" + " is not an iterable object.");
+        throw new TypeError(context + " has member 'touches' that" + " is not an iterable object.");
       } else {
         const V = [];
         const tmp = value;
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TreeWalker.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TreeWalker.js
index 9edfcf6..b02f5ad 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TreeWalker.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/TreeWalker.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "TreeWalker";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'TreeWalker'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,32 +32,59 @@
     throw new Error("Internal error: constructor TreeWalker is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class TreeWalker {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/UIEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/UIEvent.js
index 59473a1..6565942 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/UIEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/UIEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "UIEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'UIEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor UIEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Event._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Event._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Event === undefined) {
     throw new Error("Internal error: attempting to evaluate UIEvent before Event");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/UIEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/UIEventInit.js
index 99e68ad..9f4ceba 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/UIEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/UIEventInit.js
@@ -12,7 +12,7 @@
     const key = "detail";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["long"](value, { context: context + " has member detail that" });
+      value = conversions["long"](value, { context: context + " has member 'detail' that" });
 
       ret[key] = value;
     } else {
@@ -39,7 +39,7 @@
     const key = "which";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned long"](value, { context: context + " has member which that" });
+      value = conversions["unsigned long"](value, { context: context + " has member 'which' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ValidityState.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ValidityState.js
index 2f44b5b..a976979 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ValidityState.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/ValidityState.js
@@ -8,20 +8,20 @@
 
 const interfaceName = "ValidityState";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'ValidityState'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -31,32 +31,59 @@
     throw new Error("Internal error: constructor ValidityState is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class ValidityState {
     constructor() {
       throw new TypeError("Illegal constructor");
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/VisibilityState.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/VisibilityState.js
index 3a68b07..bc198c1 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/VisibilityState.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/VisibilityState.js
@@ -5,8 +5,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for VisibilityState`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for VisibilityState`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/WebSocket.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/WebSocket.js
index 2912b58..4490187 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/WebSocket.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/WebSocket.js
@@ -11,20 +11,20 @@
 
 const interfaceName = "WebSocket";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'WebSocket'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -34,34 +34,62 @@
     throw new Error("Internal error: constructor WebSocket is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  EventTarget._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  EventTarget._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "Worker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.EventTarget === undefined) {
     throw new Error("Internal error: attempting to evaluate WebSocket before EventTarget");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/WheelEvent.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/WheelEvent.js
index 9ae8d86..85b19a7 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/WheelEvent.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/WheelEvent.js
@@ -10,20 +10,20 @@
 
 const interfaceName = "WheelEvent";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'WheelEvent'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -33,34 +33,62 @@
     throw new Error("Internal error: constructor WheelEvent is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  MouseEvent._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  MouseEvent._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.MouseEvent === undefined) {
     throw new Error("Internal error: attempting to evaluate WheelEvent before MouseEvent");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/WheelEventInit.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/WheelEventInit.js
index debac79..f5bc1d3 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/WheelEventInit.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/WheelEventInit.js
@@ -12,7 +12,7 @@
     const key = "deltaMode";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["unsigned long"](value, { context: context + " has member deltaMode that" });
+      value = conversions["unsigned long"](value, { context: context + " has member 'deltaMode' that" });
 
       ret[key] = value;
     } else {
@@ -24,7 +24,7 @@
     const key = "deltaX";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["double"](value, { context: context + " has member deltaX that" });
+      value = conversions["double"](value, { context: context + " has member 'deltaX' that" });
 
       ret[key] = value;
     } else {
@@ -36,7 +36,7 @@
     const key = "deltaY";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["double"](value, { context: context + " has member deltaY that" });
+      value = conversions["double"](value, { context: context + " has member 'deltaY' that" });
 
       ret[key] = value;
     } else {
@@ -48,7 +48,7 @@
     const key = "deltaZ";
     let value = obj === undefined || obj === null ? undefined : obj[key];
     if (value !== undefined) {
-      value = conversions["double"](value, { context: context + " has member deltaZ that" });
+      value = conversions["double"](value, { context: context + " has member 'deltaZ' that" });
 
       ret[key] = value;
     } else {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLDocument.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLDocument.js
index 77ddd45..3f76007 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLDocument.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLDocument.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "XMLDocument";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'XMLDocument'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,34 +32,62 @@
     throw new Error("Internal error: constructor XMLDocument is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  Document._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  Document._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.Document === undefined) {
     throw new Error("Internal error: attempting to evaluate XMLDocument before Document");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequest.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequest.js
index 233fc2d..de304f7 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequest.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequest.js
@@ -13,20 +13,20 @@
 
 const interfaceName = "XMLHttpRequest";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'XMLHttpRequest'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -36,34 +36,62 @@
     throw new Error("Internal error: constructor XMLHttpRequest is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  XMLHttpRequestEventTarget._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  XMLHttpRequestEventTarget._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "DedicatedWorker", "SharedWorker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.XMLHttpRequestEventTarget === undefined) {
     throw new Error("Internal error: attempting to evaluate XMLHttpRequest before XMLHttpRequestEventTarget");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestEventTarget.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestEventTarget.js
index 868c6d7..4426aca 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestEventTarget.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestEventTarget.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "XMLHttpRequestEventTarget";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'XMLHttpRequestEventTarget'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -34,34 +34,62 @@
     );
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  EventTarget._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  EventTarget._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "DedicatedWorker", "SharedWorker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.EventTarget === undefined) {
     throw new Error("Internal error: attempting to evaluate XMLHttpRequestEventTarget before EventTarget");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestResponseType.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestResponseType.js
index 98e92bb..56696c8 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestResponseType.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestResponseType.js
@@ -5,8 +5,8 @@
 
 exports.convert = function convert(value, { context = "The provided value" } = {}) {
   const string = `${value}`;
-  if (!enumerationValues.has(value)) {
-    throw new TypeError(`${context} '${value}' is not a valid enumeration value for XMLHttpRequestResponseType`);
+  if (!enumerationValues.has(string)) {
+    throw new TypeError(`${context} '${string}' is not a valid enumeration value for XMLHttpRequestResponseType`);
   }
   return string;
 };
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestUpload.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestUpload.js
index bee946d..3e34ade 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestUpload.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestUpload.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "XMLHttpRequestUpload";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'XMLHttpRequestUpload'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,34 +32,62 @@
     throw new Error("Internal error: constructor XMLHttpRequestUpload is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {
-  XMLHttpRequestEventTarget._internalSetup(obj, globalObject);
-};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {
+  XMLHttpRequestEventTarget._internalSetup(wrapper, globalObject);
+};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window", "DedicatedWorker", "SharedWorker"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
+
   if (globalObject.XMLHttpRequestEventTarget === undefined) {
     throw new Error("Internal error: attempting to evaluate XMLHttpRequestUpload before XMLHttpRequestEventTarget");
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLSerializer.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLSerializer.js
index 32c003a..606bb23 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLSerializer.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/generated/XMLSerializer.js
@@ -9,20 +9,20 @@
 
 const interfaceName = "XMLSerializer";
 
-exports.is = function is(obj) {
-  return utils.isObject(obj) && utils.hasOwn(obj, implSymbol) && obj[implSymbol] instanceof Impl.implementation;
+exports.is = value => {
+  return utils.isObject(value) && utils.hasOwn(value, implSymbol) && value[implSymbol] instanceof Impl.implementation;
 };
-exports.isImpl = function isImpl(obj) {
-  return utils.isObject(obj) && obj instanceof Impl.implementation;
+exports.isImpl = value => {
+  return utils.isObject(value) && value instanceof Impl.implementation;
 };
-exports.convert = function convert(obj, { context = "The provided value" } = {}) {
-  if (exports.is(obj)) {
-    return utils.implForWrapper(obj);
+exports.convert = (value, { context = "The provided value" } = {}) => {
+  if (exports.is(value)) {
+    return utils.implForWrapper(value);
   }
   throw new TypeError(`${context} is not of type 'XMLSerializer'.`);
 };
 
-exports.create = function create(globalObject, constructorArgs, privateData) {
+function makeWrapper(globalObject) {
   if (globalObject[ctorRegistrySymbol] === undefined) {
     throw new Error("Internal error: invalid global object");
   }
@@ -32,32 +32,59 @@
     throw new Error("Internal error: constructor XMLSerializer is not installed on the passed global object");
   }
 
-  let obj = Object.create(ctor.prototype);
-  obj = exports.setup(obj, globalObject, constructorArgs, privateData);
-  return obj;
-};
-exports.createImpl = function createImpl(globalObject, constructorArgs, privateData) {
-  const obj = exports.create(globalObject, constructorArgs, privateData);
-  return utils.implForWrapper(obj);
-};
-exports._internalSetup = function _internalSetup(obj, globalObject) {};
-exports.setup = function setup(obj, globalObject, constructorArgs = [], privateData = {}) {
-  privateData.wrapper = obj;
+  return Object.create(ctor.prototype);
+}
 
-  exports._internalSetup(obj, globalObject);
-  Object.defineProperty(obj, implSymbol, {
+exports.create = (globalObject, constructorArgs, privateData) => {
+  const wrapper = makeWrapper(globalObject);
+  return exports.setup(wrapper, globalObject, constructorArgs, privateData);
+};
+
+exports.createImpl = (globalObject, constructorArgs, privateData) => {
+  const wrapper = exports.create(globalObject, constructorArgs, privateData);
+  return utils.implForWrapper(wrapper);
+};
+
+exports._internalSetup = (wrapper, globalObject) => {};
+
+exports.setup = (wrapper, globalObject, constructorArgs = [], privateData = {}) => {
+  privateData.wrapper = wrapper;
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
     value: new Impl.implementation(globalObject, constructorArgs, privateData),
     configurable: true
   });
 
-  obj[implSymbol][utils.wrapperSymbol] = obj;
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
   if (Impl.init) {
-    Impl.init(obj[implSymbol], privateData);
+    Impl.init(wrapper[implSymbol]);
   }
-  return obj;
+  return wrapper;
 };
 
-exports.install = function install(globalObject) {
+exports.new = globalObject => {
+  const wrapper = makeWrapper(globalObject);
+
+  exports._internalSetup(wrapper, globalObject);
+  Object.defineProperty(wrapper, implSymbol, {
+    value: Object.create(Impl.implementation.prototype),
+    configurable: true
+  });
+
+  wrapper[implSymbol][utils.wrapperSymbol] = wrapper;
+  if (Impl.init) {
+    Impl.init(wrapper[implSymbol]);
+  }
+  return wrapper[implSymbol];
+};
+
+const exposed = new Set(["Window"]);
+
+exports.install = (globalObject, globalNames) => {
+  if (!globalNames.some(globalName => exposed.has(globalName))) {
+    return;
+  }
   class XMLSerializer {
     constructor() {
       return exports.setup(Object.create(new.target.prototype), globalObject, undefined);
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/create-event-accessor.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/create-event-accessor.js
index 4890b80..cfcb89e 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/create-event-accessor.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/create-event-accessor.js
@@ -6,10 +6,9 @@
 const reportException = require("./runtime-script-errors");
 
 exports.appendHandler = function appendHandler(el, eventName) {
-  el.addEventListener(eventName, event => {
+  // tryImplForWrapper() is currently required due to use in Window.js
+  idlUtils.tryImplForWrapper(el).addEventListener(eventName, event => {
     // https://html.spec.whatwg.org/#the-event-handler-processing-algorithm
-    event = idlUtils.implForWrapper(event);
-
     const callback = el["on" + eventName];
     if (callback === null) {
       return;
@@ -28,6 +27,7 @@
           event.filename, event.lineno, event.colno, event.error
         );
       } else {
+        // This will no longer be necessary once EventHandler and Window are implemented in IDL:
         const eventWrapper = idlUtils.wrapperForImpl(event);
         returnValue = callback.call(thisValue, eventWrapper);
       }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/focusing.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/focusing.js
index 7ca184b..7d1a38c 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/focusing.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/focusing.js
@@ -1,32 +1,35 @@
 "use strict";
-const nodeType = require("../node-type.js");
 const FocusEvent = require("../generated/FocusEvent.js");
 const idlUtils = require("../generated/utils.js");
 const { isDisabled } = require("./form-controls.js");
 const { firstChildWithLocalName } = require("./traversal");
 const { createAnEvent } = require("./events");
-const { HTML_NS } = require("./namespaces");
+const { HTML_NS, SVG_NS } = require("./namespaces");
+const { isRenderedElement } = require("./svg/render");
 
 const focusableFormElements = new Set(["input", "select", "textarea", "button"]);
 
 // https://html.spec.whatwg.org/multipage/interaction.html#focusable-area, but also some of
-// https://html.spec.whatwg.org/multipage/interaction.html#focusing-steps: e.g., Documents are not actually focusable
-// areas, but their viewports are, and the first step of the latter algorithm translates Documents to their viewports.
-// And also https://html.spec.whatwg.org/multipage/interaction.html#specially-focusable!
+// https://html.spec.whatwg.org/multipage/interaction.html#focusing-steps and some of
+// https://svgwg.org/svg2-draft/interact.html#TermFocusable
 exports.isFocusableAreaElement = elImpl => {
-  if (!elImpl._ownerDocument._defaultView && !elImpl._defaultView) {
-    return false;
-  }
-
-  if (elImpl._nodeType === nodeType.DOCUMENT_NODE) {
-    return true;
-  }
-
-  if (!Number.isNaN(parseInt(elImpl.getAttributeNS(null, "tabindex")))) {
-    return true;
-  }
-
+  // We implemented most of the suggested focusable elements found here:
+  // https://html.spec.whatwg.org/multipage/interaction.html#tabindex-value
+  // However, some suggested elements are not focusable in web browsers, as detailed here:
+  // https://github.com/whatwg/html/issues/5490
   if (elImpl._namespaceURI === HTML_NS) {
+    if (!elImpl._ownerDocument._defaultView) {
+      return false;
+    }
+
+    if (!elImpl.isConnected) {
+      return false;
+    }
+
+    if (!Number.isNaN(parseInt(elImpl.getAttributeNS(null, "tabindex")))) {
+      return true;
+    }
+
     if (elImpl._localName === "iframe") {
       return true;
     }
@@ -48,6 +51,28 @@
 
       return true;
     }
+
+    if (elImpl.hasAttributeNS(null, "contenteditable")) {
+      return true;
+    }
+
+    return false;
+
+    // This does not check for a designMode Document as specified in
+    // https://html.spec.whatwg.org/multipage/interaction.html#editing-host because the designMode
+    // attribute is not implemented.
+  }
+
+  if (elImpl._namespaceURI === SVG_NS) {
+    if (!Number.isNaN(parseInt(elImpl.getAttributeNS(null, "tabindex"))) && isRenderedElement(elImpl)) {
+      return true;
+    }
+
+    if (elImpl._localName === "a" && elImpl.hasAttributeNS(null, "href")) {
+      return true;
+    }
+
+    return false;
   }
 
   return false;
@@ -55,13 +80,16 @@
 
 // https://html.spec.whatwg.org/multipage/interaction.html#fire-a-focus-event plus the steps of
 // https://html.spec.whatwg.org/multipage/interaction.html#focus-update-steps that adjust Documents to Windows
-exports.fireFocusEventWithTargetAdjustment = (name, target, relatedTarget) => {
+// It's extended with the bubbles option to also handle focusin/focusout, which are "defined" in
+// https://w3c.github.io/uievents/#event-type-focusin. See https://github.com/whatwg/html/issues/3514.
+exports.fireFocusEventWithTargetAdjustment = (name, target, relatedTarget, { bubbles = false } = {}) => {
   if (target === null) {
     // E.g. firing blur with nothing previously focused.
     return;
   }
 
   const event = createAnEvent(name, target._globalObject, FocusEvent, {
+    bubbles,
     composed: true,
     relatedTarget,
     view: target._ownerDocument._defaultView,
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/style-rules.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/style-rules.js
index 303155b..e03da9e 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/style-rules.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/style-rules.js
@@ -106,3 +106,5 @@
   // So we skip to "any other property: The resolved value is the computed value."
   return getComputedValue(element, property);
 };
+
+exports.SHADOW_DOM_PSEUDO_REGEXP = /^::(?:part|slotted)\(/i;
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/svg/render.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/svg/render.js
new file mode 100644
index 0000000..651568d
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/helpers/svg/render.js
@@ -0,0 +1,46 @@
+"use strict";
+const { SVG_NS } = require("../namespaces");
+
+// https://svgwg.org/svg2-draft/render.html#TermNeverRenderedElement
+const neverRenderedElements = new Set([
+  "clipPath",
+  "defs",
+  "desc",
+  "linearGradient",
+  "marker",
+  "mask",
+  "metadata",
+  "pattern",
+  "radialGradient",
+  "script",
+  "style",
+  "title",
+  "symbol"
+]);
+
+// https://svgwg.org/svg2-draft/render.html#Rendered-vs-NonRendered
+exports.isRenderedElement = elImpl => {
+  if (neverRenderedElements.has(elImpl._localName)) {
+    return false;
+  }
+
+  // This does not check for elements excluded because of conditional processing attributes or ‘switch’ structures,
+  // because conditional processing is not implemented.
+  // https://svgwg.org/svg2-draft/struct.html#ConditionalProcessing
+
+  // This does not check for computed style of display being none, since that is not yet implemented for HTML
+  // focusability either (and there are no tests yet).
+
+  if (!elImpl.isConnected) {
+    return false;
+  }
+
+  // The spec is unclear about how to deal with non-SVG parents, so we only perform this check for SVG-namespace
+  // parents.
+  if (elImpl.parentElement && elImpl.parentElement._namespaceURI === SVG_NS &&
+                              !exports.isRenderedElement(elImpl.parentNode)) {
+    return false;
+  }
+
+  return true;
+};
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/interfaces.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/interfaces.js
index 90538fc..53f4023 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/interfaces.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/interfaces.js
@@ -3,7 +3,6 @@
 
 const style = require("../level2/style");
 const xpath = require("../level3/xpath");
-const nodeFilter = require("./node-filter");
 
 // This object defines the mapping between the interface name and the generated interface wrapper code.
 // Note: The mapping needs to stay as-is in order due to interface evaluation.
@@ -167,6 +166,7 @@
   XMLHttpRequest: require("./generated/XMLHttpRequest"),
   WebSocket: require("./generated/WebSocket"),
 
+  NodeFilter: require("./generated/NodeFilter"),
   NodeIterator: require("./generated/NodeIterator"),
   TreeWalker: require("./generated/TreeWalker"),
 
@@ -196,10 +196,10 @@
   });
 }
 
-exports.installInterfaces = window => {
+exports.installInterfaces = (window, globalNames) => {
   // Install generated interface.
   for (const generatedInterface of Object.values(generatedInterfaces)) {
-    generatedInterface.install(window);
+    generatedInterface.install(window, globalNames);
   }
 
   // Install legacy HTMLDocument interface
@@ -209,9 +209,6 @@
   // These need to be cleaned up...
   style.addToCore(window);
   xpath(window);
-
-  // This one is OK but needs migration to webidl2js eventually.
-  nodeFilter(window);
 };
 
 // Returns an interface webidl2js wrapper given its an interface name.
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/node-filter.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/node-filter.js
deleted file mode 100644
index 1522850..0000000
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/node-filter.js
+++ /dev/null
@@ -1,47 +0,0 @@
-"use strict";
-const { addConstants } = require("../utils");
-
-module.exports = function (core) {
-  // https://dom.spec.whatwg.org/#interface-nodefilter
-  core.NodeFilter = function () {
-    throw new TypeError("Illegal constructor");
-  };
-
-  /**
-   * Returns an unsigned short that will be used to tell if a given Node must
-   * be accepted or not by the NodeIterator or TreeWalker iteration
-   * algorithm. This method is expected to be written by the user of a
-   * NodeFilter.
-   *
-   * @see https://developer.mozilla.org/en-US/docs/Web/API/NodeFilter
-   * @interface
-   *
-   * @param  {Node} node DOM Node
-   * @return {FILTER_ACCEPT|FILTER_REJECT|FILTER_SKIP}
-   */
-  core.NodeFilter.acceptNode = function (/* node */) {
-    throw new Error("This method is expected to be written by the user of a NodeFilter.");
-  };
-
-  addConstants(core.NodeFilter, {
-    // Constants for whatToShow
-    SHOW_ALL: 0xFFFFFFFF,
-    SHOW_ELEMENT: 0x00000001,
-    SHOW_ATTRIBUTE: 0x00000002,
-    SHOW_TEXT: 0x00000004,
-    SHOW_CDATA_SECTION: 0x00000008,
-    SHOW_ENTITY_REFERENCE: 0x00000010,
-    SHOW_ENTITY: 0x00000020,
-    SHOW_PROCESSING_INSTRUCTION: 0x00000040,
-    SHOW_COMMENT: 0x00000080,
-    SHOW_DOCUMENT: 0x00000100,
-    SHOW_DOCUMENT_TYPE: 0x00000200,
-    SHOW_DOCUMENT_FRAGMENT: 0x00000400,
-    SHOW_NOTATION: 0x00000800,
-
-    // Constants returned by acceptNode
-    FILTER_ACCEPT: 1,
-    FILTER_REJECT: 2,
-    FILTER_SKIP: 3
-  });
-};
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/Document-impl.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/Document-impl.js
index 94f8d48..5a77546 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/Document-impl.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/Document-impl.js
@@ -614,6 +614,10 @@
   }
 
   _runPreRemovingSteps(oldNode) {
+    // https://html.spec.whatwg.org/#focus-fixup-rule
+    if (oldNode === this.activeElement) {
+      this._lastFocusedElement = this.body;
+    }
     for (const activeNodeIterator of this._workingNodeIterators) {
       activeNodeIterator._preRemovingSteps(oldNode);
     }
@@ -763,7 +767,6 @@
     });
   }
 
-  // TODO: Add callback interface support to `webidl2js`
   createTreeWalker(root, whatToShow, filter) {
     return TreeWalker.createImpl(this._globalObject, [], { root, whatToShow, filter });
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/Element-impl.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/Element-impl.js
index 4b07e12..9e8daa6 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/Element-impl.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/Element-impl.js
@@ -78,6 +78,8 @@
     this._attributes = NamedNodeMap.createImpl(this._globalObject, [], {
       element: this
     });
+
+    this._cachedTagName = null;
   }
 
   _attach() {
@@ -133,11 +135,17 @@
     return this._prefix !== null ? this._prefix + ":" + this._localName : this._localName;
   }
   get tagName() {
-    let qualifiedName = this._qualifiedName;
-    if (this.namespaceURI === HTML_NS && this._ownerDocument._parsingMode === "html") {
-      qualifiedName = asciiUppercase(qualifiedName);
+    // This getter can be a hotpath in getComputedStyle.
+    // All these are invariants during the instance lifetime so we can safely cache the computed tagName.
+    // We could create it during construction but since we already identified this as potentially slow we do it lazily.
+    if (this._cachedTagName === null) {
+      if (this.namespaceURI === HTML_NS && this._ownerDocument._parsingMode === "html") {
+        this._cachedTagName = asciiUppercase(this._qualifiedName);
+      } else {
+        this._cachedTagName = this._qualifiedName;
+      }
     }
-    return qualifiedName;
+    return this._cachedTagName;
   }
 
   get attributes() {
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLButtonElement-impl.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLButtonElement-impl.js
index ba5a0cb..783a608 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLButtonElement-impl.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLButtonElement-impl.js
@@ -1,10 +1,10 @@
 "use strict";
 const HTMLElementImpl = require("./HTMLElement-impl").implementation;
-const { isDisabled, formOwner } = require("../helpers/form-controls");
 const DefaultConstraintValidationImpl =
   require("../constraint-validation/DefaultConstraintValidation-impl").implementation;
 const { mixin } = require("../../utils");
-const { getLabelsForLabelable } = require("../helpers/form-controls");
+const { isDisabled, formOwner, getLabelsForLabelable } = require("../helpers/form-controls");
+const { asciiLowercase } = require("../helpers/strings");
 
 class HTMLButtonElementImpl extends HTMLElementImpl {
   constructor(globalObject, args, privateData) {
@@ -42,7 +42,7 @@
   }
 
   get type() {
-    const typeAttr = (this.getAttributeNS(null, "type") || "").toLowerCase();
+    const typeAttr = asciiLowercase(this.getAttributeNS(null, "type") || "");
     switch (typeAttr) {
       case "submit":
       case "reset":
@@ -54,7 +54,7 @@
   }
 
   set type(v) {
-    v = String(v).toLowerCase();
+    v = asciiLowercase(String(v));
     switch (v) {
       case "submit":
       case "reset":
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLCanvasElement-impl.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLCanvasElement-impl.js
index 2435aab..7c7bf97 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLCanvasElement-impl.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLCanvasElement-impl.js
@@ -116,6 +116,9 @@
   ctx[name] = function (image) {
     const impl = idlUtils.implForWrapper(image);
     if (impl) {
+      if (impl instanceof HTMLCanvasElementImpl && !impl._canvas) {
+        impl._getCanvas();
+      }
       arguments[0] = impl._image || impl._canvas;
     }
     return prev.apply(ctx, arguments);
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLElement-impl.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLElement-impl.js
index 89d5531..4e6987d 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLElement-impl.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLElement-impl.js
@@ -8,6 +8,7 @@
 const { firstChildWithLocalName } = require("../helpers/traversal");
 const { isDisabled } = require("../helpers/form-controls");
 const { fireAnEvent } = require("../helpers/events");
+const { asciiLowercase } = require("../helpers/strings");
 
 class HTMLElementImpl extends ElementImpl {
   constructor(globalObject, args, privateData) {
@@ -37,10 +38,11 @@
   // https://html.spec.whatwg.org/multipage/dom.html#the-translate-attribute
   get translate() {
     const translateAttr = this.getAttributeNS(null, "translate");
+    const translateAttrString = asciiLowercase(translateAttr || "");
 
-    if (translateAttr === "yes" || translateAttr === "") {
+    if (translateAttrString === "yes" || (translateAttr && translateAttrString === "")) {
       return true;
-    } else if (translateAttr === "no") {
+    } else if (translateAttrString === "no") {
       return false;
     }
 
@@ -86,7 +88,7 @@
   }
 
   get draggable() {
-    const attributeValue = this.getAttributeNS(null, "draggable");
+    const attributeValue = asciiLowercase(this.getAttributeNS(null, "draggable") || "");
 
     if (attributeValue === "true") {
       return true;
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLFormElement-impl.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLFormElement-impl.js
index b7ccf61..24d7b9a 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLFormElement-impl.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLFormElement-impl.js
@@ -5,7 +5,7 @@
 const HTMLElementImpl = require("./HTMLElement-impl").implementation;
 const { domSymbolTree } = require("../helpers/internal-constants");
 const { fireAnEvent } = require("../helpers/events");
-const { isListed, isSubmittable, isSubmitButton } = require("../helpers/form-controls");
+const { formOwner, isListed, isSubmittable, isSubmitButton } = require("../helpers/form-controls");
 const HTMLCollection = require("../generated/HTMLCollection");
 const notImplemented = require("../../browser/not-implemented");
 const { parseURLToResultingURLRecord } = require("../helpers/document-base-url");
@@ -47,14 +47,24 @@
     super._descendantRemoved.apply(this, arguments);
   }
 
+  _getElementNodes() {
+    return domSymbolTree.treeToArray(this.getRootNode({}), {
+      filter: node => {
+        if (!isListed(node) || (node._localName === "input" && node.type === "image")) {
+          return false;
+        }
+
+        return formOwner(node) === this;
+      }
+    });
+  }
+
   // https://html.spec.whatwg.org/multipage/forms.html#dom-form-elements
   get elements() {
     // TODO: Return a HTMLFormControlsCollection
     return HTMLCollection.createImpl(this._globalObject, [], {
-      element: this,
-      query: () => domSymbolTree.treeToArray(this, {
-        filter: node => isListed(node) && (node._localName !== "input" || node.type !== "image")
-      })
+      element: this.getRootNode({}),
+      query: () => this._getElementNodes()
     });
   }
 
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLImageElement-impl.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLImageElement-impl.js
index 4f2318b..43267a9 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLImageElement-impl.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLImageElement-impl.js
@@ -6,6 +6,11 @@
 const { parseURLToResultingURLRecord } = require("../helpers/document-base-url");
 
 class HTMLImageElementImpl extends HTMLElementImpl {
+  constructor(...args) {
+    super(...args);
+    this._currentRequestState = "unavailable";
+  }
+
   _attrModified(name, value, oldVal) {
     // TODO: handle crossorigin
     if (name === "src" || ((name === "srcset" || name === "width" || name === "sizes") && value !== oldVal)) {
@@ -50,7 +55,11 @@
   }
 
   get complete() {
-    return Boolean(this._image && this._image.complete);
+    const srcAttributeValue = this.getAttributeNS(null, "src");
+    return srcAttributeValue === null ||
+      srcAttributeValue === "" ||
+      this._currentRequestState === "broken" ||
+      this._currentRequestState === "completely available";
   }
 
   get currentSrc() {
@@ -69,16 +78,11 @@
       return;
     }
 
-    let error;
     if (!this._image) {
       this._image = new Canvas.Image();
-      // Install an error handler that just remembers the error. It is then
-      // thrown in the callback of resourceLoader.fetch() below.
-      this._image.onerror = function (err) {
-        error = err;
-      };
     }
     this._currentSrc = null;
+    this._currentRequestState = "unavailable";
     const srcAttributeValue = this.getAttributeNS(null, "src");
     let urlString = null;
     if (srcAttributeValue !== null && srcAttributeValue !== "") {
@@ -98,17 +102,24 @@
         if (response && response.statusCode !== undefined && response.statusCode !== 200) {
           throw new Error("Status code: " + response.statusCode);
         }
-        error = null;
+        let error = null;
+        this._image.onerror = function (err) {
+          error = err;
+        };
         this._image.src = data;
         if (error) {
           throw new Error(error);
         }
         this._currentSrc = srcAttributeValue;
+        this._currentRequestState = "completely available";
       };
 
       request = resourceLoader.fetch(urlString, {
         element: this,
-        onLoad: onLoadImage
+        onLoad: onLoadImage,
+        onError: () => {
+          this._currentRequestState = "broken";
+        }
       });
     } else {
       this._image.src = "";
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLInputElement-impl.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLInputElement-impl.js
index c13d119..386e0a6 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLInputElement-impl.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLInputElement-impl.js
@@ -332,11 +332,11 @@
     return null;
   }
 
-  _isRadioGroupChecked() {
-    if (this.checked) {
+  _someInRadioGroup(name) {
+    if (this[name]) {
       return true;
     }
-    return this._otherRadioGroupElements.some(radioGroupElement => radioGroupElement.checked);
+    return this._otherRadioGroupElements.some(radioGroupElement => radioGroupElement[name]);
   }
 
   get _mutable() {
@@ -976,7 +976,7 @@
             // and all of the input elements in the radio button group have a checkedness
             // that is false, then the element is suffering from being missing.
             case "radio":
-              if (this._required && !this._isRadioGroupChecked()) {
+              if (this._someInRadioGroup("_required") && !this._someInRadioGroup("checked")) {
                 return true;
               }
               break;
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js
index 8640bae..1097c82 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js
@@ -42,20 +42,31 @@
     if (!focusing.isFocusableAreaElement(this)) {
       return;
     }
-
-    const previous = this._ownerDocument._lastFocusedElement;
+    const ownerDocument = this._ownerDocument;
+    const previous = ownerDocument._lastFocusedElement;
 
     if (previous === this) {
       return;
     }
 
-    focusing.fireFocusEventWithTargetAdjustment("blur", previous, this);
-    this._ownerDocument._lastFocusedElement = this;
-    focusing.fireFocusEventWithTargetAdjustment("focus", this, previous);
-
-    if (this._ownerDocument._defaultView._frameElement) {
-      this._ownerDocument._defaultView._frameElement.focus();
+    ownerDocument._lastFocusedElement = null;
+    if (previous) {
+      focusing.fireFocusEventWithTargetAdjustment("blur", previous, this);
+      focusing.fireFocusEventWithTargetAdjustment("focusout", previous, this, { bubbles: true });
+    } else {
+      const frameElement = ownerDocument._defaultView._frameElement;
+      if (frameElement) {
+        const frameLastFocusedElement = frameElement.ownerDocument._lastFocusedElement;
+        frameElement.ownerDocument._lastFocusedElement = null;
+        focusing.fireFocusEventWithTargetAdjustment("blur", frameLastFocusedElement, null);
+        focusing.fireFocusEventWithTargetAdjustment("focusout", frameLastFocusedElement, null, { bubbles: true });
+        frameElement.ownerDocument._lastFocusedElement = frameElement;
+      }
     }
+
+    ownerDocument._lastFocusedElement = this;
+    focusing.fireFocusEventWithTargetAdjustment("focus", this, previous);
+    focusing.fireFocusEventWithTargetAdjustment("focusin", this, previous, { bubbles: true });
   }
 
   blur() {
@@ -63,9 +74,11 @@
       return;
     }
 
-    focusing.fireFocusEventWithTargetAdjustment("blur", this, this._ownerDocument);
     this._ownerDocument._lastFocusedElement = null;
+    focusing.fireFocusEventWithTargetAdjustment("blur", this, this._ownerDocument);
+    focusing.fireFocusEventWithTargetAdjustment("focusout", this, this._ownerDocument, { bubbles: true });
     focusing.fireFocusEventWithTargetAdjustment("focus", this._ownerDocument, this);
+    focusing.fireFocusEventWithTargetAdjustment("focusin", this._ownerDocument, this, { bubbles: true });
   }
 }
 
diff --git a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/traversal/helpers.js b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/traversal/helpers.js
index c2a5ea3..1057cc9 100644
--- a/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/traversal/helpers.js
+++ b/node_modules/jest-circus/node_modules/jsdom/lib/jsdom/living/traversal/helpers.js
@@ -1,9 +1,7 @@
 "use strict";
 const DOMException = require("domexception/webidl2js-wrapper");
-const idlUtils = require("../generated/utils");
 const conversions = require("webidl-conversions");
 
-// TODO: Once NodeFilter is ported to IDL method, use those instead.
 exports.FILTER_ACCEPT = 1; // NodeFilter.FILTER_ACCEPT
 exports.FILTER_REJECT = 2; // NodeFilter.FILTER_REJECT
 exports.FILTER_SKIP = 3; // NodeFilter.FILTER_SKIP
@@ -35,11 +33,7 @@
 
   // https://github.com/whatwg/dom/issues/494
   try {
-    if (typeof filter === "function") {
-      result = filter(idlUtils.wrapperForImpl(nodeImpl));
-    } else {
-      result = filter.acceptNode(idlUtils.wrapperForImpl(nodeImpl));
-    }
+    result = filter(nodeImpl);
   } finally {
     nodeIteratorOrTreeWalkerImpl._active = false;
   }
diff --git a/node_modules/jest-circus/node_modules/jsdom/package.json b/node_modules/jest-circus/node_modules/jsdom/package.json
index 18b8109..ecb5ce9 100644
--- a/node_modules/jest-circus/node_modules/jsdom/package.json
+++ b/node_modules/jest-circus/node_modules/jsdom/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jsdom",
-  "version": "16.2.2",
+  "version": "16.4.0",
   "description": "A JavaScript implementation of many web standards",
   "keywords": [
     "dom",
@@ -40,7 +40,7 @@
     "tough-cookie": "^3.0.1",
     "w3c-hr-time": "^1.0.2",
     "w3c-xmlserializer": "^2.0.0",
-    "webidl-conversions": "^6.0.0",
+    "webidl-conversions": "^6.1.0",
     "whatwg-encoding": "^1.0.5",
     "whatwg-mimetype": "^2.3.0",
     "whatwg-url": "^8.0.0",
@@ -82,7 +82,7 @@
     "st": "^2.0.0",
     "watchify": "^3.11.1",
     "wd": "^1.12.1",
-    "webidl2js": "^15.1.0"
+    "webidl2js": "^16.0.0"
   },
   "browser": {
     "canvas": false,
diff --git a/node_modules/jest-circus/node_modules/pretty-format/build/index.js b/node_modules/jest-circus/node_modules/pretty-format/build/index.js
index 9519847..6e10cb1 100644
--- a/node_modules/jest-circus/node_modules/pretty-format/build/index.js
+++ b/node_modules/jest-circus/node_modules/pretty-format/build/index.js
@@ -32,6 +32,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+
+/* eslint-disable local/ban-types-eventually */
 const toString = Object.prototype.toString;
 const toISOString = Date.prototype.toISOString;
 const errorToString = Error.prototype.toString;
@@ -554,6 +556,5 @@
   Immutable: _Immutable.default,
   ReactElement: _ReactElement.default,
   ReactTestComponent: _ReactTestComponent.default
-}; // eslint-disable-next-line no-redeclare
-
+};
 module.exports = prettyFormat;
diff --git a/node_modules/jest-circus/node_modules/pretty-format/build/plugins/DOMCollection.js b/node_modules/jest-circus/node_modules/pretty-format/build/plugins/DOMCollection.js
index f256551..1ae3750 100644
--- a/node_modules/jest-circus/node_modules/pretty-format/build/plugins/DOMCollection.js
+++ b/node_modules/jest-circus/node_modules/pretty-format/build/plugins/DOMCollection.js
@@ -13,6 +13,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+
+/* eslint-disable local/ban-types-eventually */
 const SPACE = ' ';
 const OBJECT_NAMES = ['DOMStringMap', 'NamedNodeMap'];
 const ARRAY_REGEXP = /^(HTML\w*Collection|NodeList)$/;
diff --git a/node_modules/jest-circus/node_modules/pretty-format/build/plugins/lib/markup.d.ts b/node_modules/jest-circus/node_modules/pretty-format/build/plugins/lib/markup.d.ts
index 6155219..60d99ab 100644
--- a/node_modules/jest-circus/node_modules/pretty-format/build/plugins/lib/markup.d.ts
+++ b/node_modules/jest-circus/node_modules/pretty-format/build/plugins/lib/markup.d.ts
@@ -6,7 +6,7 @@
  */
 import type { Config, Printer, Refs } from '../../types';
 export declare const printProps: (keys: Array<string>, props: Record<string, unknown>, config: Config, indentation: string, depth: number, refs: Refs, printer: Printer) => string;
-export declare const printChildren: (children: Array<any>, config: Config, indentation: string, depth: number, refs: Refs, printer: Printer) => string;
+export declare const printChildren: (children: Array<unknown>, config: Config, indentation: string, depth: number, refs: Refs, printer: Printer) => string;
 export declare const printText: (text: string, config: Config) => string;
 export declare const printComment: (comment: string, config: Config) => string;
 export declare const printElement: (type: string, printedProps: string, printedChildren: string, config: Config, indentation: string) => string;
diff --git a/node_modules/jest-circus/node_modules/pretty-format/package.json b/node_modules/jest-circus/node_modules/pretty-format/package.json
index 7f0c77b..093ddc7 100644
--- a/node_modules/jest-circus/node_modules/pretty-format/package.json
+++ b/node_modules/jest-circus/node_modules/pretty-format/package.json
@@ -1,6 +1,6 @@
 {
   "name": "pretty-format",
-  "version": "26.4.2",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -12,7 +12,7 @@
   "types": "build/index.d.ts",
   "author": "James Kyle <me@thejameskyle.com>",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "ansi-regex": "^5.0.0",
     "ansi-styles": "^4.0.0",
     "react-is": "^16.12.0"
@@ -22,7 +22,7 @@
     "@types/react-is": "^16.7.1",
     "@types/react-test-renderer": "*",
     "immutable": "4.0.0-rc.9",
-    "jest-util": "^26.3.0",
+    "jest-util": "^26.5.2",
     "react": "*",
     "react-dom": "*",
     "react-test-renderer": "*"
@@ -33,5 +33,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/strip-bom/index.d.ts b/node_modules/jest-circus/node_modules/strip-bom/index.d.ts
similarity index 100%
rename from node_modules/strip-bom/index.d.ts
rename to node_modules/jest-circus/node_modules/strip-bom/index.d.ts
diff --git a/node_modules/jest-circus/node_modules/strip-bom/index.js b/node_modules/jest-circus/node_modules/strip-bom/index.js
new file mode 100644
index 0000000..82f9175
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/strip-bom/index.js
@@ -0,0 +1,15 @@
+'use strict';
+
+module.exports = string => {
+	if (typeof string !== 'string') {
+		throw new TypeError(`Expected a string, got ${typeof string}`);
+	}
+
+	// Catches EFBBBF (UTF-8 BOM) because the buffer-to-string
+	// conversion translates it to FEFF (UTF-16 BOM)
+	if (string.charCodeAt(0) === 0xFEFF) {
+		return string.slice(1);
+	}
+
+	return string;
+};
diff --git a/node_modules/cli-cursor/license b/node_modules/jest-circus/node_modules/strip-bom/license
similarity index 100%
rename from node_modules/cli-cursor/license
rename to node_modules/jest-circus/node_modules/strip-bom/license
diff --git a/node_modules/jest-circus/node_modules/strip-bom/package.json b/node_modules/jest-circus/node_modules/strip-bom/package.json
new file mode 100644
index 0000000..f96ba34
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/strip-bom/package.json
@@ -0,0 +1,42 @@
+{
+	"name": "strip-bom",
+	"version": "4.0.0",
+	"description": "Strip UTF-8 byte order mark (BOM) from a string",
+	"license": "MIT",
+	"repository": "sindresorhus/strip-bom",
+	"author": {
+		"name": "Sindre Sorhus",
+		"email": "sindresorhus@gmail.com",
+		"url": "sindresorhus.com"
+	},
+	"engines": {
+		"node": ">=8"
+	},
+	"scripts": {
+		"test": "xo && ava && tsd"
+	},
+	"files": [
+		"index.js",
+		"index.d.ts"
+	],
+	"keywords": [
+		"strip",
+		"bom",
+		"byte",
+		"order",
+		"mark",
+		"unicode",
+		"utf8",
+		"utf-8",
+		"remove",
+		"delete",
+		"trim",
+		"text",
+		"string"
+	],
+	"devDependencies": {
+		"ava": "^1.4.1",
+		"tsd": "^0.7.2",
+		"xo": "^0.24.0"
+	}
+}
diff --git a/node_modules/jest-circus/node_modules/strip-bom/readme.md b/node_modules/jest-circus/node_modules/strip-bom/readme.md
new file mode 100644
index 0000000..e826851
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/strip-bom/readme.md
@@ -0,0 +1,54 @@
+# strip-bom [![Build Status](https://travis-ci.org/sindresorhus/strip-bom.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-bom)
+
+> Strip UTF-8 [byte order mark](https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8) (BOM) from a string
+
+From Wikipedia:
+
+> The Unicode Standard permits the BOM in UTF-8, but does not require nor recommend its use. Byte order has no meaning in UTF-8.
+
+---
+
+<div align="center">
+	<b>
+		<a href="https://tidelift.com/subscription/pkg/npm-strip-bom?utm_source=npm-strip-bom&utm_medium=referral&utm_campaign=readme">Get professional support for 'strip-bom' with a Tidelift subscription</a>
+	</b>
+	<br>
+	<sub>
+		Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
+	</sub>
+</div>
+
+---
+
+## Install
+
+```
+$ npm install strip-bom
+```
+
+
+## Usage
+
+```js
+const stripBom = require('strip-bom');
+
+stripBom('\uFEFFunicorn');
+//=> 'unicorn'
+```
+
+
+## Security
+
+To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure.
+
+
+## Related
+
+- [strip-bom-cli](https://github.com/sindresorhus/strip-bom-cli) - CLI for this module
+- [strip-bom-buf](https://github.com/sindresorhus/strip-bom-buf) - Buffer version of this module
+- [strip-bom-stream](https://github.com/sindresorhus/strip-bom-stream) - Stream version of this module
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/jest-circus/node_modules/yargs-parser/CHANGELOG.md b/node_modules/jest-circus/node_modules/yargs-parser/CHANGELOG.md
new file mode 100644
index 0000000..d91dc51
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs-parser/CHANGELOG.md
@@ -0,0 +1,601 @@
+# Changelog
+
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+
+### [18.1.3](https://www.github.com/yargs/yargs-parser/compare/v18.1.2...v18.1.3) (2020-04-16)
+
+
+### Bug Fixes
+
+* **setArg:** options using camel-case and dot-notation populated twice ([#268](https://www.github.com/yargs/yargs-parser/issues/268)) ([f7e15b9](https://www.github.com/yargs/yargs-parser/commit/f7e15b9800900b9856acac1a830a5f35847be73e))
+
+### [18.1.2](https://www.github.com/yargs/yargs-parser/compare/v18.1.1...v18.1.2) (2020-03-26)
+
+
+### Bug Fixes
+
+* **array, nargs:** support -o=--value and --option=--value format ([#262](https://www.github.com/yargs/yargs-parser/issues/262)) ([41d3f81](https://www.github.com/yargs/yargs-parser/commit/41d3f8139e116706b28de9b0de3433feb08d2f13))
+
+### [18.1.1](https://www.github.com/yargs/yargs-parser/compare/v18.1.0...v18.1.1) (2020-03-16)
+
+
+### Bug Fixes
+
+* \_\_proto\_\_ will now be replaced with \_\_\_proto\_\_\_ in parse ([#258](https://www.github.com/yargs/yargs-parser/issues/258)), patching a potential 
+prototype pollution vulnerability. This was reported by the Snyk Security Research Team.([63810ca](https://www.github.com/yargs/yargs-parser/commit/63810ca1ae1a24b08293a4d971e70e058c7a41e2))
+
+## [18.1.0](https://www.github.com/yargs/yargs-parser/compare/v18.0.0...v18.1.0) (2020-03-07)
+
+
+### Features
+
+* introduce single-digit boolean aliases ([#255](https://www.github.com/yargs/yargs-parser/issues/255)) ([9c60265](https://www.github.com/yargs/yargs-parser/commit/9c60265fd7a03cb98e6df3e32c8c5e7508d9f56f))
+
+## [18.0.0](https://www.github.com/yargs/yargs-parser/compare/v17.1.0...v18.0.0) (2020-03-02)
+
+
+### ⚠ BREAKING CHANGES
+
+* the narg count is now enforced when parsing arrays.
+
+### Features
+
+* NaN can now be provided as a value for nargs, indicating "at least" one value is expected for array ([#251](https://www.github.com/yargs/yargs-parser/issues/251)) ([9db4be8](https://www.github.com/yargs/yargs-parser/commit/9db4be81417a2c7097128db34d86fe70ef4af70c))
+
+## [17.1.0](https://www.github.com/yargs/yargs-parser/compare/v17.0.1...v17.1.0) (2020-03-01)
+
+
+### Features
+
+* introduce greedy-arrays config, for specifying whether arrays consume multiple positionals ([#249](https://www.github.com/yargs/yargs-parser/issues/249)) ([60e880a](https://www.github.com/yargs/yargs-parser/commit/60e880a837046314d89fa4725f923837fd33a9eb))
+
+### [17.0.1](https://www.github.com/yargs/yargs-parser/compare/v17.0.0...v17.0.1) (2020-02-29)
+
+
+### Bug Fixes
+
+* normalized keys were not enumerable ([#247](https://www.github.com/yargs/yargs-parser/issues/247)) ([57119f9](https://www.github.com/yargs/yargs-parser/commit/57119f9f17cf27499bd95e61c2f72d18314f11ba))
+
+## [17.0.0](https://www.github.com/yargs/yargs-parser/compare/v16.1.0...v17.0.0) (2020-02-10)
+
+
+### ⚠ BREAKING CHANGES
+
+* this reverts parsing behavior of booleans to that of yargs@14
+* objects used during parsing are now created with a null
+prototype. There may be some scenarios where this change in behavior
+leaks externally.
+
+### Features
+
+* boolean arguments will not be collected into an implicit array ([#236](https://www.github.com/yargs/yargs-parser/issues/236)) ([34c4e19](https://www.github.com/yargs/yargs-parser/commit/34c4e19bae4e7af63e3cb6fa654a97ed476e5eb5))
+* introduce nargs-eats-options config option ([#246](https://www.github.com/yargs/yargs-parser/issues/246)) ([d50822a](https://www.github.com/yargs/yargs-parser/commit/d50822ac10e1b05f2e9643671ca131ac251b6732))
+
+
+### Bug Fixes
+
+* address bugs with "uknown-options-as-args" ([bc023e3](https://www.github.com/yargs/yargs-parser/commit/bc023e3b13e20a118353f9507d1c999bf388a346))
+* array should take precedence over nargs, but enforce nargs ([#243](https://www.github.com/yargs/yargs-parser/issues/243)) ([4cbc188](https://www.github.com/yargs/yargs-parser/commit/4cbc188b7abb2249529a19c090338debdad2fe6c))
+* support keys that collide with object prototypes ([#234](https://www.github.com/yargs/yargs-parser/issues/234)) ([1587b6d](https://www.github.com/yargs/yargs-parser/commit/1587b6d91db853a9109f1be6b209077993fee4de))
+* unknown options terminated with digits now handled by unknown-options-as-args ([#238](https://www.github.com/yargs/yargs-parser/issues/238)) ([d36cdfa](https://www.github.com/yargs/yargs-parser/commit/d36cdfa854254d7c7e0fe1d583818332ac46c2a5))
+
+## [16.1.0](https://www.github.com/yargs/yargs-parser/compare/v16.0.0...v16.1.0) (2019-11-01)
+
+
+### ⚠ BREAKING CHANGES
+
+* populate error if incompatible narg/count or array/count options are used (#191)
+
+### Features
+
+* options that have had their default value used are now tracked ([#211](https://www.github.com/yargs/yargs-parser/issues/211)) ([a525234](https://www.github.com/yargs/yargs-parser/commit/a525234558c847deedd73f8792e0a3b77b26e2c0))
+* populate error if incompatible narg/count or array/count options are used ([#191](https://www.github.com/yargs/yargs-parser/issues/191)) ([84a401f](https://www.github.com/yargs/yargs-parser/commit/84a401f0fa3095e0a19661670d1570d0c3b9d3c9))
+
+
+### Reverts
+
+* revert 16.0.0 CHANGELOG entry ([920320a](https://www.github.com/yargs/yargs-parser/commit/920320ad9861bbfd58eda39221ae211540fc1daf))
+
+## [15.0.0](https://github.com/yargs/yargs-parser/compare/v14.0.0...v15.0.0) (2019-10-07)
+
+
+### Features
+
+* rework `collect-unknown-options` into `unknown-options-as-args`, providing more comprehensive functionality ([ef771ca](https://github.com/yargs/yargs-parser/commit/ef771ca))
+
+
+### BREAKING CHANGES
+
+* rework `collect-unknown-options` into `unknown-options-as-args`, providing more comprehensive functionality
+
+
+
+## [14.0.0](https://github.com/yargs/yargs-parser/compare/v13.1.1...v14.0.0) (2019-09-06)
+
+
+### Bug Fixes
+
+* boolean arrays with default values ([#185](https://github.com/yargs/yargs-parser/issues/185)) ([7d42572](https://github.com/yargs/yargs-parser/commit/7d42572))
+* boolean now behaves the same as other array types ([#184](https://github.com/yargs/yargs-parser/issues/184)) ([17ca3bd](https://github.com/yargs/yargs-parser/commit/17ca3bd))
+* eatNargs() for 'opt.narg === 0' and boolean typed options ([#188](https://github.com/yargs/yargs-parser/issues/188)) ([c5a1db0](https://github.com/yargs/yargs-parser/commit/c5a1db0))
+* maybeCoerceNumber now takes precedence over coerce return value ([#182](https://github.com/yargs/yargs-parser/issues/182)) ([2f26436](https://github.com/yargs/yargs-parser/commit/2f26436))
+* take into account aliases when appending arrays from config object ([#199](https://github.com/yargs/yargs-parser/issues/199)) ([f8a2d3f](https://github.com/yargs/yargs-parser/commit/f8a2d3f))
+
+
+### Features
+
+* add configuration option to "collect-unknown-options" ([#181](https://github.com/yargs/yargs-parser/issues/181)) ([7909cc4](https://github.com/yargs/yargs-parser/commit/7909cc4))
+* maybeCoerceNumber() now takes into account arrays ([#187](https://github.com/yargs/yargs-parser/issues/187)) ([31c204b](https://github.com/yargs/yargs-parser/commit/31c204b))
+
+
+### BREAKING CHANGES
+
+* unless "parse-numbers" is set to "false", arrays of numeric strings are now parsed as numbers, rather than strings.
+* we have dropped the broken "defaulted" functionality; we would like to revisit adding this in the future.
+* maybeCoerceNumber now takes precedence over coerce return value (#182)
+
+
+
+### [13.1.1](https://www.github.com/yargs/yargs-parser/compare/v13.1.0...v13.1.1) (2019-06-10)
+
+
+### Bug Fixes
+
+* convert values to strings when tokenizing ([#167](https://www.github.com/yargs/yargs-parser/issues/167)) ([57b7883](https://www.github.com/yargs/yargs-parser/commit/57b7883))
+* nargs should allow duplicates when duplicate-arguments-array=false ([#164](https://www.github.com/yargs/yargs-parser/issues/164)) ([47ccb0b](https://www.github.com/yargs/yargs-parser/commit/47ccb0b))
+* should populate "_" when given config with "short-option-groups" false ([#179](https://www.github.com/yargs/yargs-parser/issues/179)) ([6055974](https://www.github.com/yargs/yargs-parser/commit/6055974))
+
+## [13.1.0](https://github.com/yargs/yargs-parser/compare/v13.0.0...v13.1.0) (2019-05-05)
+
+
+### Features
+
+* add `strip-aliased` and `strip-dashed` configuration options. ([#172](https://github.com/yargs/yargs-parser/issues/172)) ([a3936aa](https://github.com/yargs/yargs-parser/commit/a3936aa))
+* support boolean which do not consume next argument. ([#171](https://github.com/yargs/yargs-parser/issues/171)) ([0ae7fcb](https://github.com/yargs/yargs-parser/commit/0ae7fcb))
+
+
+
+<a name="13.0.0"></a>
+# [13.0.0](https://github.com/yargs/yargs-parser/compare/v12.0.0...v13.0.0) (2019-02-02)
+
+
+### Features
+
+* don't coerce number from string with leading '0' or '+' ([#158](https://github.com/yargs/yargs-parser/issues/158)) ([18d0fd5](https://github.com/yargs/yargs-parser/commit/18d0fd5))
+
+
+### BREAKING CHANGES
+
+* options with leading '+' or '0' now parse as strings
+
+
+
+<a name="12.0.0"></a>
+# [12.0.0](https://github.com/yargs/yargs-parser/compare/v11.1.1...v12.0.0) (2019-01-29)
+
+
+### Bug Fixes
+
+* better handling of quoted strings ([#153](https://github.com/yargs/yargs-parser/issues/153)) ([2fb71b2](https://github.com/yargs/yargs-parser/commit/2fb71b2))
+
+
+### Features
+
+* default value is now used if no right-hand value provided for numbers/strings ([#156](https://github.com/yargs/yargs-parser/issues/156)) ([5a7c46a](https://github.com/yargs/yargs-parser/commit/5a7c46a))
+
+
+### BREAKING CHANGES
+
+* a flag with no right-hand value no longer populates defaulted options with `undefined`.
+* quotes at beginning and endings of strings are not removed during parsing.
+
+
+
+<a name="11.1.1"></a>
+## [11.1.1](https://github.com/yargs/yargs-parser/compare/v11.1.0...v11.1.1) (2018-11-19)
+
+
+### Bug Fixes
+
+* ensure empty string is added into argv._ ([#140](https://github.com/yargs/yargs-parser/issues/140)) ([79cda98](https://github.com/yargs/yargs-parser/commit/79cda98))
+
+
+### Reverts
+
+* make requiresArg work in conjunction with arrays ([#136](https://github.com/yargs/yargs-parser/issues/136)) ([f4a3063](https://github.com/yargs/yargs-parser/commit/f4a3063))
+
+
+
+<a name="11.1.0"></a>
+# [11.1.0](https://github.com/yargs/yargs-parser/compare/v11.0.0...v11.1.0) (2018-11-10)
+
+
+### Bug Fixes
+
+* handling of one char alias ([#139](https://github.com/yargs/yargs-parser/issues/139)) ([ee56e31](https://github.com/yargs/yargs-parser/commit/ee56e31))
+
+
+### Features
+
+* add halt-at-non-option configuration option ([#130](https://github.com/yargs/yargs-parser/issues/130)) ([a849fce](https://github.com/yargs/yargs-parser/commit/a849fce))
+
+
+
+<a name="11.0.0"></a>
+# [11.0.0](https://github.com/yargs/yargs-parser/compare/v10.1.0...v11.0.0) (2018-10-06)
+
+
+### Bug Fixes
+
+* flatten-duplicate-arrays:false for more than 2 arrays ([#128](https://github.com/yargs/yargs-parser/issues/128)) ([2bc395f](https://github.com/yargs/yargs-parser/commit/2bc395f))
+* hyphenated flags combined with dot notation broke parsing ([#131](https://github.com/yargs/yargs-parser/issues/131)) ([dc788da](https://github.com/yargs/yargs-parser/commit/dc788da))
+* make requiresArg work in conjunction with arrays ([#136](https://github.com/yargs/yargs-parser/issues/136)) ([77ae1d4](https://github.com/yargs/yargs-parser/commit/77ae1d4))
+
+
+### Chores
+
+* update dependencies ([6dc42a1](https://github.com/yargs/yargs-parser/commit/6dc42a1))
+
+
+### Features
+
+* also add camelCase array options ([#125](https://github.com/yargs/yargs-parser/issues/125)) ([08c0117](https://github.com/yargs/yargs-parser/commit/08c0117))
+* array.type can now be provided, supporting coercion ([#132](https://github.com/yargs/yargs-parser/issues/132)) ([4b8cfce](https://github.com/yargs/yargs-parser/commit/4b8cfce))
+
+
+### BREAKING CHANGES
+
+* drops Node 4 support
+* the argv object is now populated differently (correctly) when hyphens and dot notation are used in conjunction.
+
+
+
+<a name="10.1.0"></a>
+# [10.1.0](https://github.com/yargs/yargs-parser/compare/v10.0.0...v10.1.0) (2018-06-29)
+
+
+### Features
+
+* add `set-placeholder-key` configuration ([#123](https://github.com/yargs/yargs-parser/issues/123)) ([19386ee](https://github.com/yargs/yargs-parser/commit/19386ee))
+
+
+
+<a name="10.0.0"></a>
+# [10.0.0](https://github.com/yargs/yargs-parser/compare/v9.0.2...v10.0.0) (2018-04-04)
+
+
+### Bug Fixes
+
+* do not set boolean flags if not defined in `argv` ([#119](https://github.com/yargs/yargs-parser/issues/119)) ([f6e6599](https://github.com/yargs/yargs-parser/commit/f6e6599))
+
+
+### BREAKING CHANGES
+
+* `boolean` flags defined without a `default` value will now behave like other option type and won't be set in the parsed results when the user doesn't set the corresponding CLI arg.
+
+Previous behavior:
+```js
+var parse = require('yargs-parser');
+
+parse('--flag', {boolean: ['flag']});
+// => { _: [], flag: true }
+
+parse('--no-flag', {boolean: ['flag']});
+// => { _: [], flag: false }
+
+parse('', {boolean: ['flag']});
+// => { _: [], flag: false }
+```
+
+New behavior:
+```js
+var parse = require('yargs-parser');
+
+parse('--flag', {boolean: ['flag']});
+// => { _: [], flag: true }
+
+parse('--no-flag', {boolean: ['flag']});
+// => { _: [], flag: false }
+
+parse('', {boolean: ['flag']});
+// => { _: [] } => flag not set similarly to other option type
+```
+
+
+
+<a name="9.0.2"></a>
+## [9.0.2](https://github.com/yargs/yargs-parser/compare/v9.0.1...v9.0.2) (2018-01-20)
+
+
+### Bug Fixes
+
+* nargs was still aggressively consuming too many arguments ([9b28aad](https://github.com/yargs/yargs-parser/commit/9b28aad))
+
+
+
+<a name="9.0.1"></a>
+## [9.0.1](https://github.com/yargs/yargs-parser/compare/v9.0.0...v9.0.1) (2018-01-20)
+
+
+### Bug Fixes
+
+* nargs was consuming too many arguments ([4fef206](https://github.com/yargs/yargs-parser/commit/4fef206))
+
+
+
+<a name="9.0.0"></a>
+# [9.0.0](https://github.com/yargs/yargs-parser/compare/v8.1.0...v9.0.0) (2018-01-20)
+
+
+### Features
+
+* narg arguments no longer consume flag arguments ([#114](https://github.com/yargs/yargs-parser/issues/114)) ([60bb9b3](https://github.com/yargs/yargs-parser/commit/60bb9b3))
+
+
+### BREAKING CHANGES
+
+* arguments of form --foo, -abc, will no longer be consumed by nargs
+
+
+
+<a name="8.1.0"></a>
+# [8.1.0](https://github.com/yargs/yargs-parser/compare/v8.0.0...v8.1.0) (2017-12-20)
+
+
+### Bug Fixes
+
+* allow null config values ([#108](https://github.com/yargs/yargs-parser/issues/108)) ([d8b14f9](https://github.com/yargs/yargs-parser/commit/d8b14f9))
+* ensure consistent parsing of dot-notation arguments ([#102](https://github.com/yargs/yargs-parser/issues/102)) ([c9bd79c](https://github.com/yargs/yargs-parser/commit/c9bd79c))
+* implement [@antoniom](https://github.com/antoniom)'s fix for camel-case expansion ([3087e1d](https://github.com/yargs/yargs-parser/commit/3087e1d))
+* only run coercion functions once, despite aliases. ([#76](https://github.com/yargs/yargs-parser/issues/76)) ([#103](https://github.com/yargs/yargs-parser/issues/103)) ([507aaef](https://github.com/yargs/yargs-parser/commit/507aaef))
+* scientific notation circumvented bounds check ([#110](https://github.com/yargs/yargs-parser/issues/110)) ([3571f57](https://github.com/yargs/yargs-parser/commit/3571f57))
+* tokenizer should ignore spaces at the beginning of the argString ([#106](https://github.com/yargs/yargs-parser/issues/106)) ([f34ead9](https://github.com/yargs/yargs-parser/commit/f34ead9))
+
+
+### Features
+
+* make combining arrays a configurable option ([#111](https://github.com/yargs/yargs-parser/issues/111)) ([c8bf536](https://github.com/yargs/yargs-parser/commit/c8bf536))
+* merge array from arguments with array from config ([#83](https://github.com/yargs/yargs-parser/issues/83)) ([806ddd6](https://github.com/yargs/yargs-parser/commit/806ddd6))
+
+
+
+<a name="8.0.0"></a>
+# [8.0.0](https://github.com/yargs/yargs-parser/compare/v7.0.0...v8.0.0) (2017-10-05)
+
+
+### Bug Fixes
+
+* Ignore multiple spaces between arguments. ([#100](https://github.com/yargs/yargs-parser/issues/100)) ([d137227](https://github.com/yargs/yargs-parser/commit/d137227))
+
+
+### Features
+
+* allow configuration of prefix for boolean negation ([#94](https://github.com/yargs/yargs-parser/issues/94)) ([00bde7d](https://github.com/yargs/yargs-parser/commit/00bde7d))
+* reworking how numbers are parsed ([#104](https://github.com/yargs/yargs-parser/issues/104)) ([fba00eb](https://github.com/yargs/yargs-parser/commit/fba00eb))
+
+
+### BREAKING CHANGES
+
+* strings that fail `Number.isSafeInteger()` are no longer coerced into numbers. 
+
+
+
+<a name="7.0.0"></a>
+# [7.0.0](https://github.com/yargs/yargs-parser/compare/v6.0.1...v7.0.0) (2017-05-02)
+
+
+### Chores
+
+* revert populate-- logic ([#91](https://github.com/yargs/yargs-parser/issues/91)) ([6003e6d](https://github.com/yargs/yargs-parser/commit/6003e6d))
+
+
+### BREAKING CHANGES
+
+* populate-- now defaults to false.
+
+
+
+<a name="6.0.1"></a>
+## [6.0.1](https://github.com/yargs/yargs-parser/compare/v6.0.0...v6.0.1) (2017-05-01)
+
+
+### Bug Fixes
+
+* default '--' to undefined when not provided; this is closer to the array API ([#90](https://github.com/yargs/yargs-parser/issues/90)) ([4e739cc](https://github.com/yargs/yargs-parser/commit/4e739cc))
+
+
+
+<a name="6.0.0"></a>
+# [6.0.0](https://github.com/yargs/yargs-parser/compare/v4.2.1...v6.0.0) (2017-05-01)
+
+
+### Bug Fixes
+
+* environment variables should take precedence over config file ([#81](https://github.com/yargs/yargs-parser/issues/81)) ([76cee1f](https://github.com/yargs/yargs-parser/commit/76cee1f))
+* parsing hints should apply for dot notation keys ([#86](https://github.com/yargs/yargs-parser/issues/86)) ([3e47d62](https://github.com/yargs/yargs-parser/commit/3e47d62))
+
+
+### Chores
+
+* upgrade to newest version of camelcase ([#87](https://github.com/yargs/yargs-parser/issues/87)) ([f1903aa](https://github.com/yargs/yargs-parser/commit/f1903aa))
+
+
+### Features
+
+* add -- option which allows arguments after the -- flag to be returned separated from positional arguments ([#84](https://github.com/yargs/yargs-parser/issues/84)) ([2572ca8](https://github.com/yargs/yargs-parser/commit/2572ca8))
+* when parsing stops, we now populate "--" by default ([#88](https://github.com/yargs/yargs-parser/issues/88)) ([cd666db](https://github.com/yargs/yargs-parser/commit/cd666db))
+
+
+### BREAKING CHANGES
+
+* rather than placing arguments in "_", when parsing is stopped via "--"; we now populate an array called "--" by default.
+* camelcase now requires Node 4+.
+* environment variables will now override config files (args, env, config-file, config-object)
+
+
+
+<a name="5.0.0"></a>
+# [5.0.0](https://github.com/yargs/yargs-parser/compare/v4.2.1...v5.0.0) (2017-02-18)
+
+
+### Bug Fixes
+
+* environment variables should take precedence over config file ([#81](https://github.com/yargs/yargs-parser/issues/81)) ([76cee1f](https://github.com/yargs/yargs-parser/commit/76cee1f))
+
+
+### BREAKING CHANGES
+
+* environment variables will now override config files (args, env, config-file, config-object)
+
+
+
+<a name="4.2.1"></a>
+## [4.2.1](https://github.com/yargs/yargs-parser/compare/v4.2.0...v4.2.1) (2017-01-02)
+
+
+### Bug Fixes
+
+* flatten/duplicate regression ([#75](https://github.com/yargs/yargs-parser/issues/75)) ([68d68a0](https://github.com/yargs/yargs-parser/commit/68d68a0))
+
+
+
+<a name="4.2.0"></a>
+# [4.2.0](https://github.com/yargs/yargs-parser/compare/v4.1.0...v4.2.0) (2016-12-01)
+
+
+### Bug Fixes
+
+* inner objects in configs had their keys appended to top-level key when dot-notation was disabled ([#72](https://github.com/yargs/yargs-parser/issues/72)) ([0b1b5f9](https://github.com/yargs/yargs-parser/commit/0b1b5f9))
+
+
+### Features
+
+* allow multiple arrays to be provided, rather than always combining ([#71](https://github.com/yargs/yargs-parser/issues/71)) ([0f0fb2d](https://github.com/yargs/yargs-parser/commit/0f0fb2d))
+
+
+
+<a name="4.1.0"></a>
+# [4.1.0](https://github.com/yargs/yargs-parser/compare/v4.0.2...v4.1.0) (2016-11-07)
+
+
+### Features
+
+* apply coercions to default options ([#65](https://github.com/yargs/yargs-parser/issues/65)) ([c79052b](https://github.com/yargs/yargs-parser/commit/c79052b))
+* handle dot notation boolean options ([#63](https://github.com/yargs/yargs-parser/issues/63)) ([02c3545](https://github.com/yargs/yargs-parser/commit/02c3545))
+
+
+
+<a name="4.0.2"></a>
+## [4.0.2](https://github.com/yargs/yargs-parser/compare/v4.0.1...v4.0.2) (2016-09-30)
+
+
+### Bug Fixes
+
+* whoops, let's make the assign not change the Object key order ([29d069a](https://github.com/yargs/yargs-parser/commit/29d069a))
+
+
+
+<a name="4.0.1"></a>
+## [4.0.1](https://github.com/yargs/yargs-parser/compare/v4.0.0...v4.0.1) (2016-09-30)
+
+
+### Bug Fixes
+
+* lodash.assign was deprecated ([#59](https://github.com/yargs/yargs-parser/issues/59)) ([5e7eb11](https://github.com/yargs/yargs-parser/commit/5e7eb11))
+
+
+
+<a name="4.0.0"></a>
+# [4.0.0](https://github.com/yargs/yargs-parser/compare/v3.2.0...v4.0.0) (2016-09-26)
+
+
+### Bug Fixes
+
+* coerce should be applied to the final objects and arrays created ([#57](https://github.com/yargs/yargs-parser/issues/57)) ([4ca69da](https://github.com/yargs/yargs-parser/commit/4ca69da))
+
+
+### BREAKING CHANGES
+
+* coerce is no longer applied to individual arguments in an implicit array.
+
+
+
+<a name="3.2.0"></a>
+# [3.2.0](https://github.com/yargs/yargs-parser/compare/v3.1.0...v3.2.0) (2016-08-13)
+
+
+### Features
+
+* coerce full array instead of each element ([#51](https://github.com/yargs/yargs-parser/issues/51)) ([cc4dc56](https://github.com/yargs/yargs-parser/commit/cc4dc56))
+
+
+
+<a name="3.1.0"></a>
+# [3.1.0](https://github.com/yargs/yargs-parser/compare/v3.0.0...v3.1.0) (2016-08-09)
+
+
+### Bug Fixes
+
+* address pkgConf parsing bug outlined in [#37](https://github.com/yargs/yargs-parser/issues/37) ([#45](https://github.com/yargs/yargs-parser/issues/45)) ([be76ee6](https://github.com/yargs/yargs-parser/commit/be76ee6))
+* better parsing of negative values ([#44](https://github.com/yargs/yargs-parser/issues/44)) ([2e43692](https://github.com/yargs/yargs-parser/commit/2e43692))
+* check aliases when guessing defaults for arguments fixes [#41](https://github.com/yargs/yargs-parser/issues/41) ([#43](https://github.com/yargs/yargs-parser/issues/43)) ([f3e4616](https://github.com/yargs/yargs-parser/commit/f3e4616))
+
+
+### Features
+
+* added coerce option, for providing specialized argument parsing ([#42](https://github.com/yargs/yargs-parser/issues/42)) ([7b49cd2](https://github.com/yargs/yargs-parser/commit/7b49cd2))
+
+
+
+<a name="3.0.0"></a>
+# [3.0.0](https://github.com/yargs/yargs-parser/compare/v2.4.1...v3.0.0) (2016-08-07)
+
+
+### Bug Fixes
+
+* parsing issue with numeric character in group of options ([#19](https://github.com/yargs/yargs-parser/issues/19)) ([f743236](https://github.com/yargs/yargs-parser/commit/f743236))
+* upgraded lodash.assign ([5d7fdf4](https://github.com/yargs/yargs-parser/commit/5d7fdf4))
+
+### BREAKING CHANGES
+
+* subtle change to how values are parsed in a group of single-character arguments.
+* _first released in 3.1.0, better handling of negative values should be considered a breaking change._
+
+
+
+<a name="2.4.1"></a>
+## [2.4.1](https://github.com/yargs/yargs-parser/compare/v2.4.0...v2.4.1) (2016-07-16)
+
+
+### Bug Fixes
+
+* **count:** do not increment a default value ([#39](https://github.com/yargs/yargs-parser/issues/39)) ([b04a189](https://github.com/yargs/yargs-parser/commit/b04a189))
+
+
+
+<a name="2.4.0"></a>
+# [2.4.0](https://github.com/yargs/yargs-parser/compare/v2.3.0...v2.4.0) (2016-04-11)
+
+
+### Features
+
+* **environment:** Support nested options in environment variables ([#26](https://github.com/yargs/yargs-parser/issues/26)) thanks [@elas7](https://github.com/elas7) \o/ ([020778b](https://github.com/yargs/yargs-parser/commit/020778b))
+
+
+
+<a name="2.3.0"></a>
+# [2.3.0](https://github.com/yargs/yargs-parser/compare/v2.2.0...v2.3.0) (2016-04-09)
+
+
+### Bug Fixes
+
+* **boolean:** fix for boolean options with non boolean defaults (#20) ([2dbe86b](https://github.com/yargs/yargs-parser/commit/2dbe86b)), closes [(#20](https://github.com/(/issues/20)
+* **package:** remove tests from tarball ([0353c0d](https://github.com/yargs/yargs-parser/commit/0353c0d))
+* **parsing:** handle calling short option with an empty string as the next value. ([a867165](https://github.com/yargs/yargs-parser/commit/a867165))
+* boolean flag when next value contains the strings 'true' or 'false'. ([69941a6](https://github.com/yargs/yargs-parser/commit/69941a6))
+* update dependencies; add standard-version bin for next release (#24) ([822d9d5](https://github.com/yargs/yargs-parser/commit/822d9d5))
+
+### Features
+
+* **configuration:** Allow to pass configuration objects to yargs-parser ([0780900](https://github.com/yargs/yargs-parser/commit/0780900))
+* **normalize:** allow normalize to work with arrays ([e0eaa1a](https://github.com/yargs/yargs-parser/commit/e0eaa1a))
diff --git a/node_modules/jest-circus/node_modules/yargs-parser/LICENSE.txt b/node_modules/jest-circus/node_modules/yargs-parser/LICENSE.txt
new file mode 100644
index 0000000..836440b
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs-parser/LICENSE.txt
@@ -0,0 +1,14 @@
+Copyright (c) 2016, Contributors
+
+Permission to use, copy, modify, and/or distribute this software
+for any purpose with or without fee is hereby granted, provided
+that the above copyright notice and this permission notice
+appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
+LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
+OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/jest-circus/node_modules/yargs-parser/README.md b/node_modules/jest-circus/node_modules/yargs-parser/README.md
new file mode 100644
index 0000000..bae61c2
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs-parser/README.md
@@ -0,0 +1,449 @@
+# yargs-parser
+
+[![Build Status](https://travis-ci.org/yargs/yargs-parser.svg)](https://travis-ci.org/yargs/yargs-parser)
+[![NPM version](https://img.shields.io/npm/v/yargs-parser.svg)](https://www.npmjs.com/package/yargs-parser)
+[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version)
+
+
+The mighty option parser used by [yargs](https://github.com/yargs/yargs).
+
+visit the [yargs website](http://yargs.js.org/) for more examples, and thorough usage instructions.
+
+<img width="250" src="https://raw.githubusercontent.com/yargs/yargs-parser/master/yargs-logo.png">
+
+## Example
+
+```sh
+npm i yargs-parser --save
+```
+
+```js
+var argv = require('yargs-parser')(process.argv.slice(2))
+console.log(argv)
+```
+
+```sh
+node example.js --foo=33 --bar hello
+{ _: [], foo: 33, bar: 'hello' }
+```
+
+_or parse a string!_
+
+```js
+var argv = require('yargs-parser')('--foo=99 --bar=33')
+console.log(argv)
+```
+
+```sh
+{ _: [], foo: 99, bar: 33 }
+```
+
+Convert an array of mixed types before passing to `yargs-parser`:
+
+```js
+var parse = require('yargs-parser')
+parse(['-f', 11, '--zoom', 55].join(' '))   // <-- array to string
+parse(['-f', 11, '--zoom', 55].map(String)) // <-- array of strings
+```
+
+## API
+
+### require('yargs-parser')(args, opts={})
+
+Parses command line arguments returning a simple mapping of keys and values.
+
+**expects:**
+
+* `args`: a string or array of strings representing the options to parse.
+* `opts`: provide a set of hints indicating how `args` should be parsed:
+  * `opts.alias`: an object representing the set of aliases for a key: `{alias: {foo: ['f']}}`.
+  * `opts.array`: indicate that keys should be parsed as an array: `{array: ['foo', 'bar']}`.<br>
+    Indicate that keys should be parsed as an array and coerced to booleans / numbers:<br>
+    `{array: [{ key: 'foo', boolean: true }, {key: 'bar', number: true}]}`.
+  * `opts.boolean`: arguments should be parsed as booleans: `{boolean: ['x', 'y']}`.
+  * `opts.coerce`: provide a custom synchronous function that returns a coerced value from the argument provided
+    (or throws an error). For arrays the function is called only once for the entire array:<br>
+    `{coerce: {foo: function (arg) {return modifiedArg}}}`.
+  * `opts.config`: indicate a key that represents a path to a configuration file (this file will be loaded and parsed).
+  * `opts.configObjects`: configuration objects to parse, their properties will be set as arguments:<br>
+    `{configObjects: [{'x': 5, 'y': 33}, {'z': 44}]}`.
+  * `opts.configuration`: provide configuration options to the yargs-parser (see: [configuration](#configuration)).
+  * `opts.count`: indicate a key that should be used as a counter, e.g., `-vvv` = `{v: 3}`.
+  * `opts.default`: provide default values for keys: `{default: {x: 33, y: 'hello world!'}}`.
+  * `opts.envPrefix`: environment variables (`process.env`) with the prefix provided should be parsed.
+  * `opts.narg`: specify that a key requires `n` arguments: `{narg: {x: 2}}`.
+  * `opts.normalize`: `path.normalize()` will be applied to values set to this key.
+  * `opts.number`: keys should be treated as numbers.
+  * `opts.string`: keys should be treated as strings (even if they resemble a number `-x 33`).
+
+**returns:**
+
+* `obj`: an object representing the parsed value of `args`
+  * `key/value`: key value pairs for each argument and their aliases.
+  * `_`: an array representing the positional arguments.
+  * [optional] `--`:  an array with arguments after the end-of-options flag `--`.
+
+### require('yargs-parser').detailed(args, opts={})
+
+Parses a command line string, returning detailed information required by the
+yargs engine.
+
+**expects:**
+
+* `args`: a string or array of strings representing options to parse.
+* `opts`: provide a set of hints indicating how `args`, inputs are identical to `require('yargs-parser')(args, opts={})`.
+
+**returns:**
+
+* `argv`: an object representing the parsed value of `args`
+  * `key/value`: key value pairs for each argument and their aliases.
+  * `_`: an array representing the positional arguments.
+  * [optional] `--`:  an array with arguments after the end-of-options flag `--`.
+* `error`: populated with an error object if an exception occurred during parsing.
+* `aliases`: the inferred list of aliases built by combining lists in `opts.alias`.
+* `newAliases`: any new aliases added via camel-case expansion:
+  * `boolean`: `{ fooBar: true }`
+* `defaulted`: any new argument created by `opts.default`, no aliases included.
+  * `boolean`: `{ foo: true }`
+* `configuration`: given by default settings and `opts.configuration`.
+
+<a name="configuration"></a>
+
+### Configuration
+
+The yargs-parser applies several automated transformations on the keys provided
+in `args`. These features can be turned on and off using the `configuration` field
+of `opts`.
+
+```js
+var parsed = parser(['--no-dice'], {
+  configuration: {
+    'boolean-negation': false
+  }
+})
+```
+
+### short option groups
+
+* default: `true`.
+* key: `short-option-groups`.
+
+Should a group of short-options be treated as boolean flags?
+
+```sh
+node example.js -abc
+{ _: [], a: true, b: true, c: true }
+```
+
+_if disabled:_
+
+```sh
+node example.js -abc
+{ _: [], abc: true }
+```
+
+### camel-case expansion
+
+* default: `true`.
+* key: `camel-case-expansion`.
+
+Should hyphenated arguments be expanded into camel-case aliases?
+
+```sh
+node example.js --foo-bar
+{ _: [], 'foo-bar': true, fooBar: true }
+```
+
+_if disabled:_
+
+```sh
+node example.js --foo-bar
+{ _: [], 'foo-bar': true }
+```
+
+### dot-notation
+
+* default: `true`
+* key: `dot-notation`
+
+Should keys that contain `.` be treated as objects?
+
+```sh
+node example.js --foo.bar
+{ _: [], foo: { bar: true } }
+```
+
+_if disabled:_
+
+```sh
+node example.js --foo.bar
+{ _: [], "foo.bar": true }
+```
+
+### parse numbers
+
+* default: `true`
+* key: `parse-numbers`
+
+Should keys that look like numbers be treated as such?
+
+```sh
+node example.js --foo=99.3
+{ _: [], foo: 99.3 }
+```
+
+_if disabled:_
+
+```sh
+node example.js --foo=99.3
+{ _: [], foo: "99.3" }
+```
+
+### boolean negation
+
+* default: `true`
+* key: `boolean-negation`
+
+Should variables prefixed with `--no` be treated as negations?
+
+```sh
+node example.js --no-foo
+{ _: [], foo: false }
+```
+
+_if disabled:_
+
+```sh
+node example.js --no-foo
+{ _: [], "no-foo": true }
+```
+
+### combine arrays
+
+* default: `false`
+* key: `combine-arrays`
+
+Should arrays be combined when provided by both command line arguments and
+a configuration file.
+
+### duplicate arguments array
+
+* default: `true`
+* key: `duplicate-arguments-array`
+
+Should arguments be coerced into an array when duplicated:
+
+```sh
+node example.js -x 1 -x 2
+{ _: [], x: [1, 2] }
+```
+
+_if disabled:_
+
+```sh
+node example.js -x 1 -x 2
+{ _: [], x: 2 }
+```
+
+### flatten duplicate arrays
+
+* default: `true`
+* key: `flatten-duplicate-arrays`
+
+Should array arguments be coerced into a single array when duplicated:
+
+```sh
+node example.js -x 1 2 -x 3 4
+{ _: [], x: [1, 2, 3, 4] }
+```
+
+_if disabled:_
+
+```sh
+node example.js -x 1 2 -x 3 4
+{ _: [], x: [[1, 2], [3, 4]] }
+```
+
+### greedy arrays
+
+* default: `true`
+* key: `greedy-arrays`
+
+Should arrays consume more than one positional argument following their flag.
+
+```sh
+node example --arr 1 2
+{ _[], arr: [1, 2] }
+```
+
+_if disabled:_
+
+```sh
+node example --arr 1 2
+{ _[2], arr: [1] }
+```
+
+**Note: in `v18.0.0` we are considering defaulting greedy arrays to `false`.**
+
+### nargs eats options
+
+* default: `false`
+* key: `nargs-eats-options`
+
+Should nargs consume dash options as well as positional arguments.
+
+### negation prefix
+
+* default: `no-`
+* key: `negation-prefix`
+
+The prefix to use for negated boolean variables.
+
+```sh
+node example.js --no-foo
+{ _: [], foo: false }
+```
+
+_if set to `quux`:_
+
+```sh
+node example.js --quuxfoo
+{ _: [], foo: false }
+```
+
+### populate --
+
+* default: `false`.
+* key: `populate--`
+
+Should unparsed flags be stored in `--` or `_`.
+
+_If disabled:_
+
+```sh
+node example.js a -b -- x y
+{ _: [ 'a', 'x', 'y' ], b: true }
+```
+
+_If enabled:_
+
+```sh
+node example.js a -b -- x y
+{ _: [ 'a' ], '--': [ 'x', 'y' ], b: true }
+```
+
+### set placeholder key
+
+* default: `false`.
+* key: `set-placeholder-key`.
+
+Should a placeholder be added for keys not set via the corresponding CLI argument?
+
+_If disabled:_
+
+```sh
+node example.js -a 1 -c 2
+{ _: [], a: 1, c: 2 }
+```
+
+_If enabled:_
+
+```sh
+node example.js -a 1 -c 2
+{ _: [], a: 1, b: undefined, c: 2 }
+```
+
+### halt at non-option
+
+* default: `false`.
+* key: `halt-at-non-option`.
+
+Should parsing stop at the first positional argument? This is similar to how e.g. `ssh` parses its command line.
+
+_If disabled:_
+
+```sh
+node example.js -a run b -x y
+{ _: [ 'b' ], a: 'run', x: 'y' }
+```
+
+_If enabled:_
+
+```sh
+node example.js -a run b -x y
+{ _: [ 'b', '-x', 'y' ], a: 'run' }
+```
+
+### strip aliased
+
+* default: `false`
+* key: `strip-aliased`
+
+Should aliases be removed before returning results?
+
+_If disabled:_
+
+```sh
+node example.js --test-field 1
+{ _: [], 'test-field': 1, testField: 1, 'test-alias': 1, testAlias: 1 }
+```
+
+_If enabled:_
+
+```sh
+node example.js --test-field 1
+{ _: [], 'test-field': 1, testField: 1 }
+```
+
+### strip dashed
+
+* default: `false`
+* key: `strip-dashed`
+
+Should dashed keys be removed before returning results?  This option has no effect if
+`camel-case-expansion` is disabled.
+
+_If disabled:_
+
+```sh
+node example.js --test-field 1
+{ _: [], 'test-field': 1, testField: 1 }
+```
+
+_If enabled:_
+
+```sh
+node example.js --test-field 1
+{ _: [], testField: 1 }
+```
+
+### unknown options as args
+
+* default: `false`
+* key: `unknown-options-as-args`
+
+Should unknown options be treated like regular arguments?  An unknown option is one that is not
+configured in `opts`.
+
+_If disabled_
+
+```sh
+node example.js --unknown-option --known-option 2 --string-option --unknown-option2
+{ _: [], unknownOption: true, knownOption: 2, stringOption: '', unknownOption2: true }
+```
+
+_If enabled_
+
+```sh
+node example.js --unknown-option --known-option 2 --string-option --unknown-option2
+{ _: ['--unknown-option'], knownOption: 2, stringOption: '--unknown-option2' }
+```
+
+## Special Thanks
+
+The yargs project evolves from optimist and minimist. It owes its
+existence to a lot of James Halliday's hard work. Thanks [substack](https://github.com/substack) **beep** **boop** \o/
+
+## License
+
+ISC
diff --git a/node_modules/jest-circus/node_modules/yargs-parser/index.js b/node_modules/jest-circus/node_modules/yargs-parser/index.js
new file mode 100644
index 0000000..c14c1fc
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs-parser/index.js
@@ -0,0 +1,1032 @@
+const camelCase = require('camelcase')
+const decamelize = require('decamelize')
+const path = require('path')
+const tokenizeArgString = require('./lib/tokenize-arg-string')
+const util = require('util')
+
+function parse (args, opts) {
+  opts = Object.assign(Object.create(null), opts)
+  // allow a string argument to be passed in rather
+  // than an argv array.
+  args = tokenizeArgString(args)
+
+  // aliases might have transitive relationships, normalize this.
+  const aliases = combineAliases(Object.assign(Object.create(null), opts.alias))
+  const configuration = Object.assign({
+    'boolean-negation': true,
+    'camel-case-expansion': true,
+    'combine-arrays': false,
+    'dot-notation': true,
+    'duplicate-arguments-array': true,
+    'flatten-duplicate-arrays': true,
+    'greedy-arrays': true,
+    'halt-at-non-option': false,
+    'nargs-eats-options': false,
+    'negation-prefix': 'no-',
+    'parse-numbers': true,
+    'populate--': false,
+    'set-placeholder-key': false,
+    'short-option-groups': true,
+    'strip-aliased': false,
+    'strip-dashed': false,
+    'unknown-options-as-args': false
+  }, opts.configuration)
+  const defaults = Object.assign(Object.create(null), opts.default)
+  const configObjects = opts.configObjects || []
+  const envPrefix = opts.envPrefix
+  const notFlagsOption = configuration['populate--']
+  const notFlagsArgv = notFlagsOption ? '--' : '_'
+  const newAliases = Object.create(null)
+  const defaulted = Object.create(null)
+  // allow a i18n handler to be passed in, default to a fake one (util.format).
+  const __ = opts.__ || util.format
+  const flags = {
+    aliases: Object.create(null),
+    arrays: Object.create(null),
+    bools: Object.create(null),
+    strings: Object.create(null),
+    numbers: Object.create(null),
+    counts: Object.create(null),
+    normalize: Object.create(null),
+    configs: Object.create(null),
+    nargs: Object.create(null),
+    coercions: Object.create(null),
+    keys: []
+  }
+  const negative = /^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/
+  const negatedBoolean = new RegExp('^--' + configuration['negation-prefix'] + '(.+)')
+
+  ;[].concat(opts.array).filter(Boolean).forEach(function (opt) {
+    const key = opt.key || opt
+
+    // assign to flags[bools|strings|numbers]
+    const assignment = Object.keys(opt).map(function (key) {
+      return ({
+        boolean: 'bools',
+        string: 'strings',
+        number: 'numbers'
+      })[key]
+    }).filter(Boolean).pop()
+
+    // assign key to be coerced
+    if (assignment) {
+      flags[assignment][key] = true
+    }
+
+    flags.arrays[key] = true
+    flags.keys.push(key)
+  })
+
+  ;[].concat(opts.boolean).filter(Boolean).forEach(function (key) {
+    flags.bools[key] = true
+    flags.keys.push(key)
+  })
+
+  ;[].concat(opts.string).filter(Boolean).forEach(function (key) {
+    flags.strings[key] = true
+    flags.keys.push(key)
+  })
+
+  ;[].concat(opts.number).filter(Boolean).forEach(function (key) {
+    flags.numbers[key] = true
+    flags.keys.push(key)
+  })
+
+  ;[].concat(opts.count).filter(Boolean).forEach(function (key) {
+    flags.counts[key] = true
+    flags.keys.push(key)
+  })
+
+  ;[].concat(opts.normalize).filter(Boolean).forEach(function (key) {
+    flags.normalize[key] = true
+    flags.keys.push(key)
+  })
+
+  Object.keys(opts.narg || {}).forEach(function (k) {
+    flags.nargs[k] = opts.narg[k]
+    flags.keys.push(k)
+  })
+
+  Object.keys(opts.coerce || {}).forEach(function (k) {
+    flags.coercions[k] = opts.coerce[k]
+    flags.keys.push(k)
+  })
+
+  if (Array.isArray(opts.config) || typeof opts.config === 'string') {
+    ;[].concat(opts.config).filter(Boolean).forEach(function (key) {
+      flags.configs[key] = true
+    })
+  } else {
+    Object.keys(opts.config || {}).forEach(function (k) {
+      flags.configs[k] = opts.config[k]
+    })
+  }
+
+  // create a lookup table that takes into account all
+  // combinations of aliases: {f: ['foo'], foo: ['f']}
+  extendAliases(opts.key, aliases, opts.default, flags.arrays)
+
+  // apply default values to all aliases.
+  Object.keys(defaults).forEach(function (key) {
+    (flags.aliases[key] || []).forEach(function (alias) {
+      defaults[alias] = defaults[key]
+    })
+  })
+
+  let error = null
+  checkConfiguration()
+
+  let notFlags = []
+
+  const argv = Object.assign(Object.create(null), { _: [] })
+  // TODO(bcoe): for the first pass at removing object prototype  we didn't
+  // remove all prototypes from objects returned by this API, we might want
+  // to gradually move towards doing so.
+  const argvReturn = {}
+
+  for (let i = 0; i < args.length; i++) {
+    const arg = args[i]
+    let broken
+    let key
+    let letters
+    let m
+    let next
+    let value
+
+    // any unknown option (except for end-of-options, "--")
+    if (arg !== '--' && isUnknownOptionAsArg(arg)) {
+      argv._.push(arg)
+    // -- separated by =
+    } else if (arg.match(/^--.+=/) || (
+      !configuration['short-option-groups'] && arg.match(/^-.+=/)
+    )) {
+      // Using [\s\S] instead of . because js doesn't support the
+      // 'dotall' regex modifier. See:
+      // http://stackoverflow.com/a/1068308/13216
+      m = arg.match(/^--?([^=]+)=([\s\S]*)$/)
+
+      // arrays format = '--f=a b c'
+      if (checkAllAliases(m[1], flags.arrays)) {
+        i = eatArray(i, m[1], args, m[2])
+      } else if (checkAllAliases(m[1], flags.nargs) !== false) {
+        // nargs format = '--f=monkey washing cat'
+        i = eatNargs(i, m[1], args, m[2])
+      } else {
+        setArg(m[1], m[2])
+      }
+    } else if (arg.match(negatedBoolean) && configuration['boolean-negation']) {
+      key = arg.match(negatedBoolean)[1]
+      setArg(key, checkAllAliases(key, flags.arrays) ? [false] : false)
+
+    // -- separated by space.
+    } else if (arg.match(/^--.+/) || (
+      !configuration['short-option-groups'] && arg.match(/^-[^-]+/)
+    )) {
+      key = arg.match(/^--?(.+)/)[1]
+
+      if (checkAllAliases(key, flags.arrays)) {
+        // array format = '--foo a b c'
+        i = eatArray(i, key, args)
+      } else if (checkAllAliases(key, flags.nargs) !== false) {
+        // nargs format = '--foo a b c'
+        // should be truthy even if: flags.nargs[key] === 0
+        i = eatNargs(i, key, args)
+      } else {
+        next = args[i + 1]
+
+        if (next !== undefined && (!next.match(/^-/) ||
+          next.match(negative)) &&
+          !checkAllAliases(key, flags.bools) &&
+          !checkAllAliases(key, flags.counts)) {
+          setArg(key, next)
+          i++
+        } else if (/^(true|false)$/.test(next)) {
+          setArg(key, next)
+          i++
+        } else {
+          setArg(key, defaultValue(key))
+        }
+      }
+
+    // dot-notation flag separated by '='.
+    } else if (arg.match(/^-.\..+=/)) {
+      m = arg.match(/^-([^=]+)=([\s\S]*)$/)
+      setArg(m[1], m[2])
+
+    // dot-notation flag separated by space.
+    } else if (arg.match(/^-.\..+/) && !arg.match(negative)) {
+      next = args[i + 1]
+      key = arg.match(/^-(.\..+)/)[1]
+
+      if (next !== undefined && !next.match(/^-/) &&
+        !checkAllAliases(key, flags.bools) &&
+        !checkAllAliases(key, flags.counts)) {
+        setArg(key, next)
+        i++
+      } else {
+        setArg(key, defaultValue(key))
+      }
+    } else if (arg.match(/^-[^-]+/) && !arg.match(negative)) {
+      letters = arg.slice(1, -1).split('')
+      broken = false
+
+      for (let j = 0; j < letters.length; j++) {
+        next = arg.slice(j + 2)
+
+        if (letters[j + 1] && letters[j + 1] === '=') {
+          value = arg.slice(j + 3)
+          key = letters[j]
+
+          if (checkAllAliases(key, flags.arrays)) {
+            // array format = '-f=a b c'
+            i = eatArray(i, key, args, value)
+          } else if (checkAllAliases(key, flags.nargs) !== false) {
+            // nargs format = '-f=monkey washing cat'
+            i = eatNargs(i, key, args, value)
+          } else {
+            setArg(key, value)
+          }
+
+          broken = true
+          break
+        }
+
+        if (next === '-') {
+          setArg(letters[j], next)
+          continue
+        }
+
+        // current letter is an alphabetic character and next value is a number
+        if (/[A-Za-z]/.test(letters[j]) &&
+          /^-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
+          setArg(letters[j], next)
+          broken = true
+          break
+        }
+
+        if (letters[j + 1] && letters[j + 1].match(/\W/)) {
+          setArg(letters[j], next)
+          broken = true
+          break
+        } else {
+          setArg(letters[j], defaultValue(letters[j]))
+        }
+      }
+
+      key = arg.slice(-1)[0]
+
+      if (!broken && key !== '-') {
+        if (checkAllAliases(key, flags.arrays)) {
+          // array format = '-f a b c'
+          i = eatArray(i, key, args)
+        } else if (checkAllAliases(key, flags.nargs) !== false) {
+          // nargs format = '-f a b c'
+          // should be truthy even if: flags.nargs[key] === 0
+          i = eatNargs(i, key, args)
+        } else {
+          next = args[i + 1]
+
+          if (next !== undefined && (!/^(-|--)[^-]/.test(next) ||
+            next.match(negative)) &&
+            !checkAllAliases(key, flags.bools) &&
+            !checkAllAliases(key, flags.counts)) {
+            setArg(key, next)
+            i++
+          } else if (/^(true|false)$/.test(next)) {
+            setArg(key, next)
+            i++
+          } else {
+            setArg(key, defaultValue(key))
+          }
+        }
+      }
+    } else if (arg.match(/^-[0-9]$/) &&
+      arg.match(negative) &&
+      checkAllAliases(arg.slice(1), flags.bools)) {
+      // single-digit boolean alias, e.g: xargs -0
+      key = arg.slice(1)
+      setArg(key, defaultValue(key))
+    } else if (arg === '--') {
+      notFlags = args.slice(i + 1)
+      break
+    } else if (configuration['halt-at-non-option']) {
+      notFlags = args.slice(i)
+      break
+    } else {
+      argv._.push(maybeCoerceNumber('_', arg))
+    }
+  }
+
+  // order of precedence:
+  // 1. command line arg
+  // 2. value from env var
+  // 3. value from config file
+  // 4. value from config objects
+  // 5. configured default value
+  applyEnvVars(argv, true) // special case: check env vars that point to config file
+  applyEnvVars(argv, false)
+  setConfig(argv)
+  setConfigObjects()
+  applyDefaultsAndAliases(argv, flags.aliases, defaults, true)
+  applyCoercions(argv)
+  if (configuration['set-placeholder-key']) setPlaceholderKeys(argv)
+
+  // for any counts either not in args or without an explicit default, set to 0
+  Object.keys(flags.counts).forEach(function (key) {
+    if (!hasKey(argv, key.split('.'))) setArg(key, 0)
+  })
+
+  // '--' defaults to undefined.
+  if (notFlagsOption && notFlags.length) argv[notFlagsArgv] = []
+  notFlags.forEach(function (key) {
+    argv[notFlagsArgv].push(key)
+  })
+
+  if (configuration['camel-case-expansion'] && configuration['strip-dashed']) {
+    Object.keys(argv).filter(key => key !== '--' && key.includes('-')).forEach(key => {
+      delete argv[key]
+    })
+  }
+
+  if (configuration['strip-aliased']) {
+    ;[].concat(...Object.keys(aliases).map(k => aliases[k])).forEach(alias => {
+      if (configuration['camel-case-expansion']) {
+        delete argv[alias.split('.').map(prop => camelCase(prop)).join('.')]
+      }
+
+      delete argv[alias]
+    })
+  }
+
+  // how many arguments should we consume, based
+  // on the nargs option?
+  function eatNargs (i, key, args, argAfterEqualSign) {
+    let ii
+    let toEat = checkAllAliases(key, flags.nargs)
+    // NaN has a special meaning for the array type, indicating that one or
+    // more values are expected.
+    toEat = isNaN(toEat) ? 1 : toEat
+
+    if (toEat === 0) {
+      if (!isUndefined(argAfterEqualSign)) {
+        error = Error(__('Argument unexpected for: %s', key))
+      }
+      setArg(key, defaultValue(key))
+      return i
+    }
+
+    let available = isUndefined(argAfterEqualSign) ? 0 : 1
+    if (configuration['nargs-eats-options']) {
+      // classic behavior, yargs eats positional and dash arguments.
+      if (args.length - (i + 1) + available < toEat) {
+        error = Error(__('Not enough arguments following: %s', key))
+      }
+      available = toEat
+    } else {
+      // nargs will not consume flag arguments, e.g., -abc, --foo,
+      // and terminates when one is observed.
+      for (ii = i + 1; ii < args.length; ii++) {
+        if (!args[ii].match(/^-[^0-9]/) || args[ii].match(negative) || isUnknownOptionAsArg(args[ii])) available++
+        else break
+      }
+      if (available < toEat) error = Error(__('Not enough arguments following: %s', key))
+    }
+
+    let consumed = Math.min(available, toEat)
+    if (!isUndefined(argAfterEqualSign) && consumed > 0) {
+      setArg(key, argAfterEqualSign)
+      consumed--
+    }
+    for (ii = i + 1; ii < (consumed + i + 1); ii++) {
+      setArg(key, args[ii])
+    }
+
+    return (i + consumed)
+  }
+
+  // if an option is an array, eat all non-hyphenated arguments
+  // following it... YUM!
+  // e.g., --foo apple banana cat becomes ["apple", "banana", "cat"]
+  function eatArray (i, key, args, argAfterEqualSign) {
+    let argsToSet = []
+    let next = argAfterEqualSign || args[i + 1]
+    // If both array and nargs are configured, enforce the nargs count:
+    const nargsCount = checkAllAliases(key, flags.nargs)
+
+    if (checkAllAliases(key, flags.bools) && !(/^(true|false)$/.test(next))) {
+      argsToSet.push(true)
+    } else if (isUndefined(next) ||
+        (isUndefined(argAfterEqualSign) && /^-/.test(next) && !negative.test(next) && !isUnknownOptionAsArg(next))) {
+      // for keys without value ==> argsToSet remains an empty []
+      // set user default value, if available
+      if (defaults[key] !== undefined) {
+        const defVal = defaults[key]
+        argsToSet = Array.isArray(defVal) ? defVal : [defVal]
+      }
+    } else {
+      // value in --option=value is eaten as is
+      if (!isUndefined(argAfterEqualSign)) {
+        argsToSet.push(processValue(key, argAfterEqualSign))
+      }
+      for (let ii = i + 1; ii < args.length; ii++) {
+        if ((!configuration['greedy-arrays'] && argsToSet.length > 0) ||
+          (nargsCount && argsToSet.length >= nargsCount)) break
+        next = args[ii]
+        if (/^-/.test(next) && !negative.test(next) && !isUnknownOptionAsArg(next)) break
+        i = ii
+        argsToSet.push(processValue(key, next))
+      }
+    }
+
+    // If both array and nargs are configured, create an error if less than
+    // nargs positionals were found. NaN has special meaning, indicating
+    // that at least one value is required (more are okay).
+    if ((nargsCount && argsToSet.length < nargsCount) ||
+        (isNaN(nargsCount) && argsToSet.length === 0)) {
+      error = Error(__('Not enough arguments following: %s', key))
+    }
+
+    setArg(key, argsToSet)
+    return i
+  }
+
+  function setArg (key, val) {
+    if (/-/.test(key) && configuration['camel-case-expansion']) {
+      const alias = key.split('.').map(function (prop) {
+        return camelCase(prop)
+      }).join('.')
+      addNewAlias(key, alias)
+    }
+
+    const value = processValue(key, val)
+    const splitKey = key.split('.')
+    setKey(argv, splitKey, value)
+
+    // handle populating aliases of the full key
+    if (flags.aliases[key]) {
+      flags.aliases[key].forEach(function (x) {
+        x = x.split('.')
+        setKey(argv, x, value)
+      })
+    }
+
+    // handle populating aliases of the first element of the dot-notation key
+    if (splitKey.length > 1 && configuration['dot-notation']) {
+      ;(flags.aliases[splitKey[0]] || []).forEach(function (x) {
+        x = x.split('.')
+
+        // expand alias with nested objects in key
+        const a = [].concat(splitKey)
+        a.shift() // nuke the old key.
+        x = x.concat(a)
+
+        // populate alias only if is not already an alias of the full key
+        // (already populated above)
+        if (!(flags.aliases[key] || []).includes(x.join('.'))) {
+          setKey(argv, x, value)
+        }
+      })
+    }
+
+    // Set normalize getter and setter when key is in 'normalize' but isn't an array
+    if (checkAllAliases(key, flags.normalize) && !checkAllAliases(key, flags.arrays)) {
+      const keys = [key].concat(flags.aliases[key] || [])
+      keys.forEach(function (key) {
+        Object.defineProperty(argvReturn, key, {
+          enumerable: true,
+          get () {
+            return val
+          },
+          set (value) {
+            val = typeof value === 'string' ? path.normalize(value) : value
+          }
+        })
+      })
+    }
+  }
+
+  function addNewAlias (key, alias) {
+    if (!(flags.aliases[key] && flags.aliases[key].length)) {
+      flags.aliases[key] = [alias]
+      newAliases[alias] = true
+    }
+    if (!(flags.aliases[alias] && flags.aliases[alias].length)) {
+      addNewAlias(alias, key)
+    }
+  }
+
+  function processValue (key, val) {
+    // strings may be quoted, clean this up as we assign values.
+    if (typeof val === 'string' &&
+      (val[0] === "'" || val[0] === '"') &&
+      val[val.length - 1] === val[0]
+    ) {
+      val = val.substring(1, val.length - 1)
+    }
+
+    // handle parsing boolean arguments --foo=true --bar false.
+    if (checkAllAliases(key, flags.bools) || checkAllAliases(key, flags.counts)) {
+      if (typeof val === 'string') val = val === 'true'
+    }
+
+    let value = Array.isArray(val)
+      ? val.map(function (v) { return maybeCoerceNumber(key, v) })
+      : maybeCoerceNumber(key, val)
+
+    // increment a count given as arg (either no value or value parsed as boolean)
+    if (checkAllAliases(key, flags.counts) && (isUndefined(value) || typeof value === 'boolean')) {
+      value = increment
+    }
+
+    // Set normalized value when key is in 'normalize' and in 'arrays'
+    if (checkAllAliases(key, flags.normalize) && checkAllAliases(key, flags.arrays)) {
+      if (Array.isArray(val)) value = val.map(path.normalize)
+      else value = path.normalize(val)
+    }
+    return value
+  }
+
+  function maybeCoerceNumber (key, value) {
+    if (!checkAllAliases(key, flags.strings) && !checkAllAliases(key, flags.bools) && !Array.isArray(value)) {
+      const shouldCoerceNumber = isNumber(value) && configuration['parse-numbers'] && (
+        Number.isSafeInteger(Math.floor(value))
+      )
+      if (shouldCoerceNumber || (!isUndefined(value) && checkAllAliases(key, flags.numbers))) value = Number(value)
+    }
+    return value
+  }
+
+  // set args from config.json file, this should be
+  // applied last so that defaults can be applied.
+  function setConfig (argv) {
+    const configLookup = Object.create(null)
+
+    // expand defaults/aliases, in-case any happen to reference
+    // the config.json file.
+    applyDefaultsAndAliases(configLookup, flags.aliases, defaults)
+
+    Object.keys(flags.configs).forEach(function (configKey) {
+      const configPath = argv[configKey] || configLookup[configKey]
+      if (configPath) {
+        try {
+          let config = null
+          const resolvedConfigPath = path.resolve(process.cwd(), configPath)
+
+          if (typeof flags.configs[configKey] === 'function') {
+            try {
+              config = flags.configs[configKey](resolvedConfigPath)
+            } catch (e) {
+              config = e
+            }
+            if (config instanceof Error) {
+              error = config
+              return
+            }
+          } else {
+            config = require(resolvedConfigPath)
+          }
+
+          setConfigObject(config)
+        } catch (ex) {
+          if (argv[configKey]) error = Error(__('Invalid JSON config file: %s', configPath))
+        }
+      }
+    })
+  }
+
+  // set args from config object.
+  // it recursively checks nested objects.
+  function setConfigObject (config, prev) {
+    Object.keys(config).forEach(function (key) {
+      const value = config[key]
+      const fullKey = prev ? prev + '.' + key : key
+
+      // if the value is an inner object and we have dot-notation
+      // enabled, treat inner objects in config the same as
+      // heavily nested dot notations (foo.bar.apple).
+      if (typeof value === 'object' && value !== null && !Array.isArray(value) && configuration['dot-notation']) {
+        // if the value is an object but not an array, check nested object
+        setConfigObject(value, fullKey)
+      } else {
+        // setting arguments via CLI takes precedence over
+        // values within the config file.
+        if (!hasKey(argv, fullKey.split('.')) || (checkAllAliases(fullKey, flags.arrays) && configuration['combine-arrays'])) {
+          setArg(fullKey, value)
+        }
+      }
+    })
+  }
+
+  // set all config objects passed in opts
+  function setConfigObjects () {
+    if (typeof configObjects === 'undefined') return
+    configObjects.forEach(function (configObject) {
+      setConfigObject(configObject)
+    })
+  }
+
+  function applyEnvVars (argv, configOnly) {
+    if (typeof envPrefix === 'undefined') return
+
+    const prefix = typeof envPrefix === 'string' ? envPrefix : ''
+    Object.keys(process.env).forEach(function (envVar) {
+      if (prefix === '' || envVar.lastIndexOf(prefix, 0) === 0) {
+        // get array of nested keys and convert them to camel case
+        const keys = envVar.split('__').map(function (key, i) {
+          if (i === 0) {
+            key = key.substring(prefix.length)
+          }
+          return camelCase(key)
+        })
+
+        if (((configOnly && flags.configs[keys.join('.')]) || !configOnly) && !hasKey(argv, keys)) {
+          setArg(keys.join('.'), process.env[envVar])
+        }
+      }
+    })
+  }
+
+  function applyCoercions (argv) {
+    let coerce
+    const applied = new Set()
+    Object.keys(argv).forEach(function (key) {
+      if (!applied.has(key)) { // If we haven't already coerced this option via one of its aliases
+        coerce = checkAllAliases(key, flags.coercions)
+        if (typeof coerce === 'function') {
+          try {
+            const value = maybeCoerceNumber(key, coerce(argv[key]))
+            ;([].concat(flags.aliases[key] || [], key)).forEach(ali => {
+              applied.add(ali)
+              argv[ali] = value
+            })
+          } catch (err) {
+            error = err
+          }
+        }
+      }
+    })
+  }
+
+  function setPlaceholderKeys (argv) {
+    flags.keys.forEach((key) => {
+      // don't set placeholder keys for dot notation options 'foo.bar'.
+      if (~key.indexOf('.')) return
+      if (typeof argv[key] === 'undefined') argv[key] = undefined
+    })
+    return argv
+  }
+
+  function applyDefaultsAndAliases (obj, aliases, defaults, canLog = false) {
+    Object.keys(defaults).forEach(function (key) {
+      if (!hasKey(obj, key.split('.'))) {
+        setKey(obj, key.split('.'), defaults[key])
+        if (canLog) defaulted[key] = true
+
+        ;(aliases[key] || []).forEach(function (x) {
+          if (hasKey(obj, x.split('.'))) return
+          setKey(obj, x.split('.'), defaults[key])
+        })
+      }
+    })
+  }
+
+  function hasKey (obj, keys) {
+    let o = obj
+
+    if (!configuration['dot-notation']) keys = [keys.join('.')]
+
+    keys.slice(0, -1).forEach(function (key) {
+      o = (o[key] || {})
+    })
+
+    const key = keys[keys.length - 1]
+
+    if (typeof o !== 'object') return false
+    else return key in o
+  }
+
+  function setKey (obj, keys, value) {
+    let o = obj
+
+    if (!configuration['dot-notation']) keys = [keys.join('.')]
+
+    keys.slice(0, -1).forEach(function (key, index) {
+      // TODO(bcoe): in the next major version of yargs, switch to
+      // Object.create(null) for dot notation:
+      key = sanitizeKey(key)
+
+      if (typeof o === 'object' && o[key] === undefined) {
+        o[key] = {}
+      }
+
+      if (typeof o[key] !== 'object' || Array.isArray(o[key])) {
+        // ensure that o[key] is an array, and that the last item is an empty object.
+        if (Array.isArray(o[key])) {
+          o[key].push({})
+        } else {
+          o[key] = [o[key], {}]
+        }
+
+        // we want to update the empty object at the end of the o[key] array, so set o to that object
+        o = o[key][o[key].length - 1]
+      } else {
+        o = o[key]
+      }
+    })
+
+    // TODO(bcoe): in the next major version of yargs, switch to
+    // Object.create(null) for dot notation:
+    const key = sanitizeKey(keys[keys.length - 1])
+
+    const isTypeArray = checkAllAliases(keys.join('.'), flags.arrays)
+    const isValueArray = Array.isArray(value)
+    let duplicate = configuration['duplicate-arguments-array']
+
+    // nargs has higher priority than duplicate
+    if (!duplicate && checkAllAliases(key, flags.nargs)) {
+      duplicate = true
+      if ((!isUndefined(o[key]) && flags.nargs[key] === 1) || (Array.isArray(o[key]) && o[key].length === flags.nargs[key])) {
+        o[key] = undefined
+      }
+    }
+
+    if (value === increment) {
+      o[key] = increment(o[key])
+    } else if (Array.isArray(o[key])) {
+      if (duplicate && isTypeArray && isValueArray) {
+        o[key] = configuration['flatten-duplicate-arrays'] ? o[key].concat(value) : (Array.isArray(o[key][0]) ? o[key] : [o[key]]).concat([value])
+      } else if (!duplicate && Boolean(isTypeArray) === Boolean(isValueArray)) {
+        o[key] = value
+      } else {
+        o[key] = o[key].concat([value])
+      }
+    } else if (o[key] === undefined && isTypeArray) {
+      o[key] = isValueArray ? value : [value]
+    } else if (duplicate && !(
+      o[key] === undefined ||
+        checkAllAliases(key, flags.counts) ||
+        checkAllAliases(key, flags.bools)
+    )) {
+      o[key] = [o[key], value]
+    } else {
+      o[key] = value
+    }
+  }
+
+  // extend the aliases list with inferred aliases.
+  function extendAliases (...args) {
+    args.forEach(function (obj) {
+      Object.keys(obj || {}).forEach(function (key) {
+        // short-circuit if we've already added a key
+        // to the aliases array, for example it might
+        // exist in both 'opts.default' and 'opts.key'.
+        if (flags.aliases[key]) return
+
+        flags.aliases[key] = [].concat(aliases[key] || [])
+        // For "--option-name", also set argv.optionName
+        flags.aliases[key].concat(key).forEach(function (x) {
+          if (/-/.test(x) && configuration['camel-case-expansion']) {
+            const c = camelCase(x)
+            if (c !== key && flags.aliases[key].indexOf(c) === -1) {
+              flags.aliases[key].push(c)
+              newAliases[c] = true
+            }
+          }
+        })
+        // For "--optionName", also set argv['option-name']
+        flags.aliases[key].concat(key).forEach(function (x) {
+          if (x.length > 1 && /[A-Z]/.test(x) && configuration['camel-case-expansion']) {
+            const c = decamelize(x, '-')
+            if (c !== key && flags.aliases[key].indexOf(c) === -1) {
+              flags.aliases[key].push(c)
+              newAliases[c] = true
+            }
+          }
+        })
+        flags.aliases[key].forEach(function (x) {
+          flags.aliases[x] = [key].concat(flags.aliases[key].filter(function (y) {
+            return x !== y
+          }))
+        })
+      })
+    })
+  }
+
+  // return the 1st set flag for any of a key's aliases (or false if no flag set)
+  function checkAllAliases (key, flag) {
+    const toCheck = [].concat(flags.aliases[key] || [], key)
+    const keys = Object.keys(flag)
+    const setAlias = toCheck.find(key => keys.includes(key))
+    return setAlias ? flag[setAlias] : false
+  }
+
+  function hasAnyFlag (key) {
+    const toCheck = [].concat(Object.keys(flags).map(k => flags[k]))
+    return toCheck.some(function (flag) {
+      return Array.isArray(flag) ? flag.includes(key) : flag[key]
+    })
+  }
+
+  function hasFlagsMatching (arg, ...patterns) {
+    const toCheck = [].concat(...patterns)
+    return toCheck.some(function (pattern) {
+      const match = arg.match(pattern)
+      return match && hasAnyFlag(match[1])
+    })
+  }
+
+  // based on a simplified version of the short flag group parsing logic
+  function hasAllShortFlags (arg) {
+    // if this is a negative number, or doesn't start with a single hyphen, it's not a short flag group
+    if (arg.match(negative) || !arg.match(/^-[^-]+/)) { return false }
+    let hasAllFlags = true
+    let next
+    const letters = arg.slice(1).split('')
+    for (let j = 0; j < letters.length; j++) {
+      next = arg.slice(j + 2)
+
+      if (!hasAnyFlag(letters[j])) {
+        hasAllFlags = false
+        break
+      }
+
+      if ((letters[j + 1] && letters[j + 1] === '=') ||
+        next === '-' ||
+        (/[A-Za-z]/.test(letters[j]) && /^-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) ||
+        (letters[j + 1] && letters[j + 1].match(/\W/))) {
+        break
+      }
+    }
+    return hasAllFlags
+  }
+
+  function isUnknownOptionAsArg (arg) {
+    return configuration['unknown-options-as-args'] && isUnknownOption(arg)
+  }
+
+  function isUnknownOption (arg) {
+    // ignore negative numbers
+    if (arg.match(negative)) { return false }
+    // if this is a short option group and all of them are configured, it isn't unknown
+    if (hasAllShortFlags(arg)) { return false }
+    // e.g. '--count=2'
+    const flagWithEquals = /^-+([^=]+?)=[\s\S]*$/
+    // e.g. '-a' or '--arg'
+    const normalFlag = /^-+([^=]+?)$/
+    // e.g. '-a-'
+    const flagEndingInHyphen = /^-+([^=]+?)-$/
+    // e.g. '-abc123'
+    const flagEndingInDigits = /^-+([^=]+?\d+)$/
+    // e.g. '-a/usr/local'
+    const flagEndingInNonWordCharacters = /^-+([^=]+?)\W+.*$/
+    // check the different types of flag styles, including negatedBoolean, a pattern defined near the start of the parse method
+    return !hasFlagsMatching(arg, flagWithEquals, negatedBoolean, normalFlag, flagEndingInHyphen, flagEndingInDigits, flagEndingInNonWordCharacters)
+  }
+
+  // make a best effor to pick a default value
+  // for an option based on name and type.
+  function defaultValue (key) {
+    if (!checkAllAliases(key, flags.bools) &&
+        !checkAllAliases(key, flags.counts) &&
+        `${key}` in defaults) {
+      return defaults[key]
+    } else {
+      return defaultForType(guessType(key))
+    }
+  }
+
+  // return a default value, given the type of a flag.,
+  // e.g., key of type 'string' will default to '', rather than 'true'.
+  function defaultForType (type) {
+    const def = {
+      boolean: true,
+      string: '',
+      number: undefined,
+      array: []
+    }
+
+    return def[type]
+  }
+
+  // given a flag, enforce a default type.
+  function guessType (key) {
+    let type = 'boolean'
+    if (checkAllAliases(key, flags.strings)) type = 'string'
+    else if (checkAllAliases(key, flags.numbers)) type = 'number'
+    else if (checkAllAliases(key, flags.bools)) type = 'boolean'
+    else if (checkAllAliases(key, flags.arrays)) type = 'array'
+    return type
+  }
+
+  function isNumber (x) {
+    if (x === null || x === undefined) return false
+    // if loaded from config, may already be a number.
+    if (typeof x === 'number') return true
+    // hexadecimal.
+    if (/^0x[0-9a-f]+$/i.test(x)) return true
+    // don't treat 0123 as a number; as it drops the leading '0'.
+    if (x.length > 1 && x[0] === '0') return false
+    return /^[-]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x)
+  }
+
+  function isUndefined (num) {
+    return num === undefined
+  }
+
+  // check user configuration settings for inconsistencies
+  function checkConfiguration () {
+    // count keys should not be set as array/narg
+    Object.keys(flags.counts).find(key => {
+      if (checkAllAliases(key, flags.arrays)) {
+        error = Error(__('Invalid configuration: %s, opts.count excludes opts.array.', key))
+        return true
+      } else if (checkAllAliases(key, flags.nargs)) {
+        error = Error(__('Invalid configuration: %s, opts.count excludes opts.narg.', key))
+        return true
+      }
+    })
+  }
+
+  return {
+    argv: Object.assign(argvReturn, argv),
+    error: error,
+    aliases: Object.assign({}, flags.aliases),
+    newAliases: Object.assign({}, newAliases),
+    defaulted: Object.assign({}, defaulted),
+    configuration: configuration
+  }
+}
+
+// if any aliases reference each other, we should
+// merge them together.
+function combineAliases (aliases) {
+  const aliasArrays = []
+  const combined = Object.create(null)
+  let change = true
+
+  // turn alias lookup hash {key: ['alias1', 'alias2']} into
+  // a simple array ['key', 'alias1', 'alias2']
+  Object.keys(aliases).forEach(function (key) {
+    aliasArrays.push(
+      [].concat(aliases[key], key)
+    )
+  })
+
+  // combine arrays until zero changes are
+  // made in an iteration.
+  while (change) {
+    change = false
+    for (let i = 0; i < aliasArrays.length; i++) {
+      for (let ii = i + 1; ii < aliasArrays.length; ii++) {
+        const intersect = aliasArrays[i].filter(function (v) {
+          return aliasArrays[ii].indexOf(v) !== -1
+        })
+
+        if (intersect.length) {
+          aliasArrays[i] = aliasArrays[i].concat(aliasArrays[ii])
+          aliasArrays.splice(ii, 1)
+          change = true
+          break
+        }
+      }
+    }
+  }
+
+  // map arrays back to the hash-lookup (de-dupe while
+  // we're at it).
+  aliasArrays.forEach(function (aliasArray) {
+    aliasArray = aliasArray.filter(function (v, i, self) {
+      return self.indexOf(v) === i
+    })
+    combined[aliasArray.pop()] = aliasArray
+  })
+
+  return combined
+}
+
+// this function should only be called when a count is given as an arg
+// it is NOT called to set a default value
+// thus we can start the count at 1 instead of 0
+function increment (orig) {
+  return orig !== undefined ? orig + 1 : 1
+}
+
+function Parser (args, opts) {
+  const result = parse(args.slice(), opts)
+  return result.argv
+}
+
+// parse arguments and return detailed
+// meta information, aliases, etc.
+Parser.detailed = function (args, opts) {
+  return parse(args.slice(), opts)
+}
+
+// TODO(bcoe): in the next major version of yargs, switch to
+// Object.create(null) for dot notation:
+function sanitizeKey (key) {
+  if (key === '__proto__') return '___proto___'
+  return key
+}
+
+module.exports = Parser
diff --git a/node_modules/jest-circus/node_modules/yargs-parser/lib/tokenize-arg-string.js b/node_modules/jest-circus/node_modules/yargs-parser/lib/tokenize-arg-string.js
new file mode 100644
index 0000000..260c67c
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs-parser/lib/tokenize-arg-string.js
@@ -0,0 +1,40 @@
+// take an un-split argv string and tokenize it.
+module.exports = function (argString) {
+  if (Array.isArray(argString)) {
+    return argString.map(e => typeof e !== 'string' ? e + '' : e)
+  }
+
+  argString = argString.trim()
+
+  let i = 0
+  let prevC = null
+  let c = null
+  let opening = null
+  const args = []
+
+  for (let ii = 0; ii < argString.length; ii++) {
+    prevC = c
+    c = argString.charAt(ii)
+
+    // split on spaces unless we're in quotes.
+    if (c === ' ' && !opening) {
+      if (!(prevC === ' ')) {
+        i++
+      }
+      continue
+    }
+
+    // don't split the string if we're in matching
+    // opening or closing single and double quotes.
+    if (c === opening) {
+      opening = null
+    } else if ((c === "'" || c === '"') && !opening) {
+      opening = c
+    }
+
+    if (!args[i]) args[i] = ''
+    args[i] += c
+  }
+
+  return args
+}
diff --git a/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/index.d.ts b/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/index.d.ts
new file mode 100644
index 0000000..58f2069
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/index.d.ts
@@ -0,0 +1,63 @@
+declare namespace camelcase {
+	interface Options {
+		/**
+		Uppercase the first character: `foo-bar` → `FooBar`.
+
+		@default false
+		*/
+		readonly pascalCase?: boolean;
+	}
+}
+
+declare const camelcase: {
+	/**
+	Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`.
+
+	@param input - String to convert to camel case.
+
+	@example
+	```
+	import camelCase = require('camelcase');
+
+	camelCase('foo-bar');
+	//=> 'fooBar'
+
+	camelCase('foo_bar');
+	//=> 'fooBar'
+
+	camelCase('Foo-Bar');
+	//=> 'fooBar'
+
+	camelCase('Foo-Bar', {pascalCase: true});
+	//=> 'FooBar'
+
+	camelCase('--foo.bar', {pascalCase: false});
+	//=> 'fooBar'
+
+	camelCase('foo bar');
+	//=> 'fooBar'
+
+	console.log(process.argv[3]);
+	//=> '--foo-bar'
+	camelCase(process.argv[3]);
+	//=> 'fooBar'
+
+	camelCase(['foo', 'bar']);
+	//=> 'fooBar'
+
+	camelCase(['__foo__', '--bar'], {pascalCase: true});
+	//=> 'FooBar'
+	```
+	*/
+	(input: string | ReadonlyArray<string>, options?: camelcase.Options): string;
+
+	// TODO: Remove this for the next major release, refactor the whole definition to:
+	// declare function camelcase(
+	// 	input: string | ReadonlyArray<string>,
+	// 	options?: camelcase.Options
+	// ): string;
+	// export = camelcase;
+	default: typeof camelcase;
+};
+
+export = camelcase;
diff --git a/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/index.js b/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/index.js
new file mode 100644
index 0000000..579f99b
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/index.js
@@ -0,0 +1,76 @@
+'use strict';
+
+const preserveCamelCase = string => {
+	let isLastCharLower = false;
+	let isLastCharUpper = false;
+	let isLastLastCharUpper = false;
+
+	for (let i = 0; i < string.length; i++) {
+		const character = string[i];
+
+		if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) {
+			string = string.slice(0, i) + '-' + string.slice(i);
+			isLastCharLower = false;
+			isLastLastCharUpper = isLastCharUpper;
+			isLastCharUpper = true;
+			i++;
+		} else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) {
+			string = string.slice(0, i - 1) + '-' + string.slice(i - 1);
+			isLastLastCharUpper = isLastCharUpper;
+			isLastCharUpper = false;
+			isLastCharLower = true;
+		} else {
+			isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character;
+			isLastLastCharUpper = isLastCharUpper;
+			isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character;
+		}
+	}
+
+	return string;
+};
+
+const camelCase = (input, options) => {
+	if (!(typeof input === 'string' || Array.isArray(input))) {
+		throw new TypeError('Expected the input to be `string | string[]`');
+	}
+
+	options = Object.assign({
+		pascalCase: false
+	}, options);
+
+	const postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x;
+
+	if (Array.isArray(input)) {
+		input = input.map(x => x.trim())
+			.filter(x => x.length)
+			.join('-');
+	} else {
+		input = input.trim();
+	}
+
+	if (input.length === 0) {
+		return '';
+	}
+
+	if (input.length === 1) {
+		return options.pascalCase ? input.toUpperCase() : input.toLowerCase();
+	}
+
+	const hasUpperCase = input !== input.toLowerCase();
+
+	if (hasUpperCase) {
+		input = preserveCamelCase(input);
+	}
+
+	input = input
+		.replace(/^[_.\- ]+/, '')
+		.toLowerCase()
+		.replace(/[_.\- ]+(\w|$)/g, (_, p1) => p1.toUpperCase())
+		.replace(/\d+(\w|$)/g, m => m.toUpperCase());
+
+	return postProcess(input);
+};
+
+module.exports = camelCase;
+// TODO: Remove this for the next major release
+module.exports.default = camelCase;
diff --git a/node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/license b/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/license
similarity index 100%
rename from node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from/license
rename to node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/license
diff --git a/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/package.json b/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/package.json
new file mode 100644
index 0000000..fbdbaaa
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/package.json
@@ -0,0 +1,43 @@
+{
+	"name": "camelcase",
+	"version": "5.3.1",
+	"description": "Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`",
+	"license": "MIT",
+	"repository": "sindresorhus/camelcase",
+	"author": {
+		"name": "Sindre Sorhus",
+		"email": "sindresorhus@gmail.com",
+		"url": "sindresorhus.com"
+	},
+	"engines": {
+		"node": ">=6"
+	},
+	"scripts": {
+		"test": "xo && ava && tsd"
+	},
+	"files": [
+		"index.js",
+		"index.d.ts"
+	],
+	"keywords": [
+		"camelcase",
+		"camel-case",
+		"camel",
+		"case",
+		"dash",
+		"hyphen",
+		"dot",
+		"underscore",
+		"separator",
+		"string",
+		"text",
+		"convert",
+		"pascalcase",
+		"pascal-case"
+	],
+	"devDependencies": {
+		"ava": "^1.4.1",
+		"tsd": "^0.7.1",
+		"xo": "^0.24.0"
+	}
+}
diff --git a/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/readme.md b/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/readme.md
new file mode 100644
index 0000000..fde2726
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs-parser/node_modules/camelcase/readme.md
@@ -0,0 +1,99 @@
+# camelcase [![Build Status](https://travis-ci.org/sindresorhus/camelcase.svg?branch=master)](https://travis-ci.org/sindresorhus/camelcase)
+
+> Convert a dash/dot/underscore/space separated string to camelCase or PascalCase: `foo-bar` → `fooBar`
+
+---
+
+<div align="center">
+	<b>
+		<a href="https://tidelift.com/subscription/pkg/npm-camelcase?utm_source=npm-camelcase&utm_medium=referral&utm_campaign=readme">Get professional support for 'camelcase' with a Tidelift subscription</a>
+	</b>
+	<br>
+	<sub>
+		Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
+	</sub>
+</div>
+
+---
+
+## Install
+
+```
+$ npm install camelcase
+```
+
+
+## Usage
+
+```js
+const camelCase = require('camelcase');
+
+camelCase('foo-bar');
+//=> 'fooBar'
+
+camelCase('foo_bar');
+//=> 'fooBar'
+
+camelCase('Foo-Bar');
+//=> 'fooBar'
+
+camelCase('Foo-Bar', {pascalCase: true});
+//=> 'FooBar'
+
+camelCase('--foo.bar', {pascalCase: false});
+//=> 'fooBar'
+
+camelCase('foo bar');
+//=> 'fooBar'
+
+console.log(process.argv[3]);
+//=> '--foo-bar'
+camelCase(process.argv[3]);
+//=> 'fooBar'
+
+camelCase(['foo', 'bar']);
+//=> 'fooBar'
+
+camelCase(['__foo__', '--bar'], {pascalCase: true});
+//=> 'FooBar'
+```
+
+
+## API
+
+### camelCase(input, [options])
+
+#### input
+
+Type: `string` `string[]`
+
+String to convert to camel case.
+
+#### options
+
+Type: `Object`
+
+##### pascalCase
+
+Type: `boolean`<br>
+Default: `false`
+
+Uppercase the first character: `foo-bar` → `FooBar`
+
+
+## Security
+
+To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure.
+
+
+## Related
+
+- [decamelize](https://github.com/sindresorhus/decamelize) - The inverse of this module
+- [uppercamelcase](https://github.com/SamVerschueren/uppercamelcase) - Like this module, but to PascalCase instead of camelCase
+- [titleize](https://github.com/sindresorhus/titleize) - Capitalize every word in string
+- [humanize-string](https://github.com/sindresorhus/humanize-string) - Convert a camelized/dasherized/underscored string into a humanized one
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/jest-circus/node_modules/yargs-parser/package.json b/node_modules/jest-circus/node_modules/yargs-parser/package.json
new file mode 100644
index 0000000..636ff17
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs-parser/package.json
@@ -0,0 +1,46 @@
+{
+  "name": "yargs-parser",
+  "version": "18.1.3",
+  "description": "the mighty option parser used by yargs",
+  "main": "index.js",
+  "scripts": {
+    "fix": "standard --fix",
+    "test": "c8 --reporter=text --reporter=html  mocha test/*.js",
+    "posttest": "standard",
+    "coverage": "c8 report --check-coverage check-coverage --lines=100 --branches=97 --statements=100"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/yargs/yargs-parser.git"
+  },
+  "keywords": [
+    "argument",
+    "parser",
+    "yargs",
+    "command",
+    "cli",
+    "parsing",
+    "option",
+    "args",
+    "argument"
+  ],
+  "author": "Ben Coe <ben@npmjs.com>",
+  "license": "ISC",
+  "devDependencies": {
+    "c8": "^7.0.1",
+    "chai": "^4.2.0",
+    "mocha": "^7.0.0",
+    "standard": "^14.3.1"
+  },
+  "dependencies": {
+    "camelcase": "^5.0.0",
+    "decamelize": "^1.2.0"
+  },
+  "files": [
+    "lib",
+    "index.js"
+  ],
+  "engines": {
+    "node": ">=6"
+  }
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/CHANGELOG.md b/node_modules/jest-circus/node_modules/yargs/CHANGELOG.md
new file mode 100644
index 0000000..a010cf3
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/CHANGELOG.md
@@ -0,0 +1,420 @@
+# Changelog
+
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+
+## [15.4.0](https://www.github.com/yargs/yargs/compare/v15.3.1...v15.4.0) (2020-06-30)
+
+
+### Features
+
+* adds deprecation option for commands ([027a636](https://www.github.com/yargs/yargs/commit/027a6365b737e13116811a8ef43670196e1fa00a))
+* support array of examples ([#1682](https://www.github.com/yargs/yargs/issues/1682)) ([225ab82](https://www.github.com/yargs/yargs/commit/225ab8271938bed3a48d23175f3d580ce8cd1306))
+
+
+### Bug Fixes
+
+* **docs:** describe usage of `.check()` in more detail ([932cd11](https://www.github.com/yargs/yargs/commit/932cd1177e93f5cc99edfe57a4028e30717bf8fb))
+* **i18n:** Japanese translation phrasing ([#1619](https://www.github.com/yargs/yargs/issues/1619)) ([0894175](https://www.github.com/yargs/yargs/commit/089417550ef5a5b8ce3578dd2a989191300b64cd))
+* **strict mode:** report default command unknown arguments ([#1626](https://www.github.com/yargs/yargs/issues/1626)) ([69f29a9](https://www.github.com/yargs/yargs/commit/69f29a9cd429d4bb99481238305390107ac75b02))
+* **usage:** translate 'options' group only when displaying help ([#1600](https://www.github.com/yargs/yargs/issues/1600)) ([e60b39b](https://www.github.com/yargs/yargs/commit/e60b39b9d3a912c06db43f87c86ba894142b6c1c))
+
+
+### Reverts
+
+* Revert "chore(deps): update dependency eslint to v7 (#1656)" (#1673) ([34949f8](https://www.github.com/yargs/yargs/commit/34949f89ee7cdf88f7b315659df4b5f62f714842)), closes [#1656](https://www.github.com/yargs/yargs/issues/1656) [#1673](https://www.github.com/yargs/yargs/issues/1673)
+
+### [15.3.1](https://www.github.com/yargs/yargs/compare/v15.3.0...v15.3.1) (2020-03-16)
+
+
+### Bug Fixes
+
+* \_\_proto\_\_ will now be replaced with \_\_\_proto\_\_\_ in parse ([#258](https://www.github.com/yargs/yargs-parser/issues/258)), patching a potential 
+prototype pollution vulnerability. This was reported by the Snyk Security Research Team. ([63810ca](https://www.github.com/yargs/yargs-parser/commit/63810ca1ae1a24b08293a4d971e70e058c7a41e2))
+
+## [15.3.0](https://www.github.com/yargs/yargs/compare/v15.2.0...v15.3.0) (2020-03-08)
+
+
+### Features
+
+* **yargs-parser:** introduce single-digit boolean aliases ([#1576](https://www.github.com/yargs/yargs/issues/1576)) ([3af7f04](https://www.github.com/yargs/yargs/commit/3af7f04cdbfcbd4b3f432aca5144d43f21958c39))
+* add usage for single-digit boolean aliases ([#1580](https://www.github.com/yargs/yargs/issues/1580)) ([6014e39](https://www.github.com/yargs/yargs/commit/6014e39bca3a1e8445aa0fb2a435f6181e344c45))
+
+
+### Bug Fixes
+
+* address ambiguity between nargs of 1 and requiresArg ([#1572](https://www.github.com/yargs/yargs/issues/1572)) ([a5edc32](https://www.github.com/yargs/yargs/commit/a5edc328ecb3f90d1ba09cfe70a0040f68adf50a))
+
+## [15.2.0](https://www.github.com/yargs/yargs/compare/v15.1.0...v15.2.0) (2020-03-01)
+
+
+### ⚠ BREAKING CHANGES
+
+* **deps:** yargs-parser@17.0.0 no longer implicitly creates arrays out of boolean
+arguments when duplicates are provided
+
+### Features
+
+* **completion:** takes negated flags into account when boolean-negation is set ([#1509](https://www.github.com/yargs/yargs/issues/1509)) ([7293ad5](https://www.github.com/yargs/yargs/commit/7293ad50d20ea0fb7dd1ac9b925e90e1bd95dea8))
+* **deps:** pull in yargs-parser@17.0.0 ([#1553](https://www.github.com/yargs/yargs/issues/1553)) ([b9409da](https://www.github.com/yargs/yargs/commit/b9409da199ebca515a848489c206b807fab2e65d))
+* deprecateOption ([#1559](https://www.github.com/yargs/yargs/issues/1559)) ([8aae333](https://www.github.com/yargs/yargs/commit/8aae3332251d09fa136db17ef4a40d83fa052bc4))
+* display appropriate $0 for electron apps ([#1536](https://www.github.com/yargs/yargs/issues/1536)) ([d0e4379](https://www.github.com/yargs/yargs/commit/d0e437912917d6a66bb5128992fa2f566a5f830b))
+* introduces strictCommands() subset of strict mode ([#1540](https://www.github.com/yargs/yargs/issues/1540)) ([1d4cca3](https://www.github.com/yargs/yargs/commit/1d4cca395a98b395e6318f0505fc73bef8b01350))
+* **deps:** yargs-parser with 'greedy-array' configuration ([#1569](https://www.github.com/yargs/yargs/issues/1569)) ([a03a320](https://www.github.com/yargs/yargs/commit/a03a320dbf5c0ce33d829a857fc04a651c0bb53e))
+
+
+### Bug Fixes
+
+* help always displayed for the first command parsed having an async handler ([#1535](https://www.github.com/yargs/yargs/issues/1535)) ([d585b30](https://www.github.com/yargs/yargs/commit/d585b303a43746201b05c9c9fda94a444634df33))
+* **deps:** fix enumeration for normalized path arguments ([#1567](https://www.github.com/yargs/yargs/issues/1567)) ([0b5b1b0](https://www.github.com/yargs/yargs/commit/0b5b1b0e5f4f9baf393c48e9cc2bc85c1b67a47a))
+* **locales:** only translate default option group name ([acc16de](https://www.github.com/yargs/yargs/commit/acc16de6b846ea7332db753646a9cec76b589162))
+* **locales:** remove extra space in French for 'default' ([#1564](https://www.github.com/yargs/yargs/issues/1564)) ([ecfc2c4](https://www.github.com/yargs/yargs/commit/ecfc2c474575c6cdbc6d273c94c13181bd1dbaa6))
+* **translations:** add French translation for unknown command ([#1563](https://www.github.com/yargs/yargs/issues/1563)) ([18b0b75](https://www.github.com/yargs/yargs/commit/18b0b752424bf560271e670ff95a0f90c8386787))
+* **translations:** fix pluralization in error messages. ([#1557](https://www.github.com/yargs/yargs/issues/1557)) ([94fa38c](https://www.github.com/yargs/yargs/commit/94fa38cbab8d86943e87bf41d368ed56dffa6835))
+* **yargs:** correct support of bundled electron apps ([#1554](https://www.github.com/yargs/yargs/issues/1554)) ([a0b61ac](https://www.github.com/yargs/yargs/commit/a0b61ac21e2b554aa73dbf1a66d4a7af94047c2f))
+
+## [15.1.0](https://www.github.com/yargs/yargs/compare/v15.0.2...v15.1.0) (2020-01-02)
+
+
+### Features
+
+* **lang:** add Finnish localization (language code fi) ([222c8fe](https://www.github.com/yargs/yargs/commit/222c8fef2e2ad46e314c337dec96940f896bec35))
+* complete short options with a single dash ([#1507](https://www.github.com/yargs/yargs/issues/1507)) ([99011ab](https://www.github.com/yargs/yargs/commit/99011ab5ba90232506ece0a17e59e2001a1ab562))
+* onFinishCommand handler ([#1473](https://www.github.com/yargs/yargs/issues/1473)) ([fe380cd](https://www.github.com/yargs/yargs/commit/fe380cd356aa33aef0449facd59c22cab8930ac9))
+
+
+### Bug Fixes
+
+* getCompletion() was not working for options ([#1495](https://www.github.com/yargs/yargs/issues/1495)) ([463feb2](https://www.github.com/yargs/yargs/commit/463feb2870158eb9df670222b0f0a40a05cf18d0))
+* misspelling of package.json `engines` field ([0891d0e](https://www.github.com/yargs/yargs/commit/0891d0ed35b30c83a6d9e9f6a5c5f84d13c546a0))
+* populate positionals when unknown-options-as-args is set ([#1508](https://www.github.com/yargs/yargs/issues/1508)) ([bb0f2eb](https://www.github.com/yargs/yargs/commit/bb0f2eb996fa4e19d330b31a01c2036cafa99a7e)), closes [#1444](https://www.github.com/yargs/yargs/issues/1444)
+* show 2 dashes on help for single digit option key or alias ([#1493](https://www.github.com/yargs/yargs/issues/1493)) ([63b3dd3](https://www.github.com/yargs/yargs/commit/63b3dd31a455d428902220c1992ae930e18aff5c))
+* **docs:** use recommended cjs import syntax for ts examples ([#1513](https://www.github.com/yargs/yargs/issues/1513)) ([f9a18bf](https://www.github.com/yargs/yargs/commit/f9a18bfd624a5013108084f690cd8a1de794c430))
+
+### [15.0.2](https://www.github.com/yargs/yargs/compare/v15.0.1...v15.0.2) (2019-11-19)
+
+
+### Bug Fixes
+
+* temporary fix for libraries that call Object.freeze() ([#1483](https://www.github.com/yargs/yargs/issues/1483)) ([99c2dc8](https://www.github.com/yargs/yargs/commit/99c2dc850e67c606644f8b0c0bca1a59c87dcbcd))
+
+### [15.0.1](https://www.github.com/yargs/yargs/compare/v15.0.0...v15.0.1) (2019-11-16)
+
+
+### Bug Fixes
+
+* **deps:** cliui, find-up, and string-width, all drop Node 6 support ([#1479](https://www.github.com/yargs/yargs/issues/1479)) ([6a9ebe2](https://www.github.com/yargs/yargs/commit/6a9ebe2d955e3e979e76c07ffbb1c17fef64cb49))
+
+## [15.0.0](https://www.github.com/yargs/yargs/compare/v14.2.0...v15.0.0) (2019-11-10)
+
+
+### ⚠ BREAKING CHANGES
+
+* **deps:** yargs-parser now throws on invalid combinations of config (#1470)
+* yargs-parser@16.0.0 drops support for Node 6
+* drop Node 6 support (#1461)
+* remove package.json-based parserConfiguration (#1460)
+
+### Features
+
+* **deps:** yargs-parser now throws on invalid combinations of config ([#1470](https://www.github.com/yargs/yargs/issues/1470)) ([c10c38c](https://www.github.com/yargs/yargs/commit/c10c38cca04298f96b55a7e374a9a134abefffa7))
+* expose `Parser` from `require('yargs/yargs')` ([#1477](https://www.github.com/yargs/yargs/issues/1477)) ([1840ba2](https://www.github.com/yargs/yargs/commit/1840ba22f1a24c0ece8e32bbd31db4134a080aee))
+
+
+### Bug Fixes
+
+* **docs:** TypeScript import to prevent a future major release warning ([#1441](https://www.github.com/yargs/yargs/issues/1441)) ([b1b156a](https://www.github.com/yargs/yargs/commit/b1b156a3eb4ddd6803fbbd56c611a77919293000))
+* stop-parse was not being respected by commands ([#1459](https://www.github.com/yargs/yargs/issues/1459)) ([12c82e6](https://www.github.com/yargs/yargs/commit/12c82e62663e928148a7ee2f51629aa26a0f9bb2))
+* update to yargs-parser with fix for array default values ([#1463](https://www.github.com/yargs/yargs/issues/1463)) ([ebee59d](https://www.github.com/yargs/yargs/commit/ebee59d9022da538410e69a5c025019ed46d13d2))
+* **docs:** update boolean description and examples in docs ([#1474](https://www.github.com/yargs/yargs/issues/1474)) ([afd5b48](https://www.github.com/yargs/yargs/commit/afd5b4871bfeb90d58351ac56c5c44a83ef033e6))
+
+
+### Miscellaneous Chores
+
+* drop Node 6 support ([#1461](https://www.github.com/yargs/yargs/issues/1461)) ([2ba8ce0](https://www.github.com/yargs/yargs/commit/2ba8ce05e8fefbeffc6cb7488d9ebf6e86cceb1d))
+
+
+### Code Refactoring
+
+* remove package.json-based parserConfiguration ([#1460](https://www.github.com/yargs/yargs/issues/1460)) ([0d3642b](https://www.github.com/yargs/yargs/commit/0d3642b6f829b637938774c0c6ce5f6bfe1afa51))
+
+## [14.2.0](https://github.com/yargs/yargs/compare/v14.1.0...v14.2.0) (2019-10-07)
+
+
+### Bug Fixes
+
+* async middleware was called twice ([#1422](https://github.com/yargs/yargs/issues/1422)) ([9a42b63](https://github.com/yargs/yargs/commit/9a42b63))
+* fix promise check to accept any spec conform object ([#1424](https://github.com/yargs/yargs/issues/1424)) ([0be43d2](https://github.com/yargs/yargs/commit/0be43d2))
+* groups were not being maintained for nested commands ([#1430](https://github.com/yargs/yargs/issues/1430)) ([d38650e](https://github.com/yargs/yargs/commit/d38650e))
+* **docs:** broken markdown link ([#1426](https://github.com/yargs/yargs/issues/1426)) ([236e24e](https://github.com/yargs/yargs/commit/236e24e))
+* support merging deeply nested configuration ([#1423](https://github.com/yargs/yargs/issues/1423)) ([bae66fe](https://github.com/yargs/yargs/commit/bae66fe))
+
+
+### Features
+
+* **deps:** introduce yargs-parser with support for unknown-options-as-args ([#1440](https://github.com/yargs/yargs/issues/1440)) ([4d21520](https://github.com/yargs/yargs/commit/4d21520))
+
+## [14.1.0](https://github.com/yargs/yargs/compare/v14.0.0...v14.1.0) (2019-09-06)
+
+
+### Bug Fixes
+
+* **docs:** fix incorrect parserConfiguration documentation ([2a99124](https://github.com/yargs/yargs/commit/2a99124))
+* detect zsh when zsh isnt run as a login prompt ([#1395](https://github.com/yargs/yargs/issues/1395)) ([8792d13](https://github.com/yargs/yargs/commit/8792d13))
+* populate correct value on yargs.parsed and stop warning on access ([#1412](https://github.com/yargs/yargs/issues/1412)) ([bb0eb52](https://github.com/yargs/yargs/commit/bb0eb52))
+* showCompletionScript was logging script twice ([#1388](https://github.com/yargs/yargs/issues/1388)) ([07c8537](https://github.com/yargs/yargs/commit/07c8537))
+* strict() should not ignore hyphenated arguments ([#1414](https://github.com/yargs/yargs/issues/1414)) ([b774b5e](https://github.com/yargs/yargs/commit/b774b5e))
+* **docs:** formalize existing callback argument to showHelp ([#1386](https://github.com/yargs/yargs/issues/1386)) ([d217764](https://github.com/yargs/yargs/commit/d217764))
+
+
+### Features
+
+* make it possible to merge configurations when extending other config. ([#1411](https://github.com/yargs/yargs/issues/1411)) ([5d7ad98](https://github.com/yargs/yargs/commit/5d7ad98))
+
+## [14.0.0](https://github.com/yargs/yargs/compare/v13.3.0...v14.0.0) (2019-07-30)
+
+
+### ⚠ BREAKING CHANGES
+
+* we now only officially support yargs.$0 parameter and discourage direct access to yargs.parsed
+* previously to this fix methods like `yargs.getOptions()` contained the state of the last command to execute.
+* do not allow additional positionals in strict mode
+
+### Bug Fixes
+
+* calling parse multiple times now appropriately maintains state ([#1137](https://github.com/yargs/yargs/issues/1137)) ([#1369](https://github.com/yargs/yargs/issues/1369)) ([026b151](https://github.com/yargs/yargs/commit/026b151))
+* prefer user supplied script name in usage ([#1383](https://github.com/yargs/yargs/issues/1383)) ([28c74b9](https://github.com/yargs/yargs/commit/28c74b9))
+* **deps:** use decamelize from npm instead of vendored copy ([#1377](https://github.com/yargs/yargs/issues/1377)) ([015eeb9](https://github.com/yargs/yargs/commit/015eeb9))
+* **examples:** fix usage-options.js to reflect current API ([#1375](https://github.com/yargs/yargs/issues/1375)) ([6e5b76b](https://github.com/yargs/yargs/commit/6e5b76b))
+* do not allow additional positionals in strict mode ([35d777c](https://github.com/yargs/yargs/commit/35d777c))
+* properties accessed on singleton now reflect current state of instance ([#1366](https://github.com/yargs/yargs/issues/1366)) ([409d35b](https://github.com/yargs/yargs/commit/409d35b))
+* tolerate null prototype for config objects with `extends` ([#1376](https://github.com/yargs/yargs/issues/1376)) ([3d26d11](https://github.com/yargs/yargs/commit/3d26d11)), closes [#1372](https://github.com/yargs/yargs/issues/1372)
+* yargs.parsed now populated before returning, when yargs.parse() called with no args (#1382) ([e3981fd](https://github.com/yargs/yargs/commit/e3981fd)), closes [#1382](https://github.com/yargs/yargs/issues/1382)
+
+### Features
+
+* adds support for multiple epilog messages ([#1384](https://github.com/yargs/yargs/issues/1384)) ([07a5554](https://github.com/yargs/yargs/commit/07a5554))
+* allow completionCommand to be set via showCompletionScript ([#1385](https://github.com/yargs/yargs/issues/1385)) ([5562853](https://github.com/yargs/yargs/commit/5562853))
+
+## [13.3.0](https://www.github.com/yargs/yargs/compare/v13.2.4...v13.3.0) (2019-06-10)
+
+
+### Bug Fixes
+
+* **deps:** yargs-parser update addressing several parsing bugs ([#1357](https://www.github.com/yargs/yargs/issues/1357)) ([e230d5b](https://www.github.com/yargs/yargs/commit/e230d5b))
+
+
+### Features
+
+* **i18n:** swap out os-locale dependency for simple inline implementation ([#1356](https://www.github.com/yargs/yargs/issues/1356)) ([4dfa19b](https://www.github.com/yargs/yargs/commit/4dfa19b))
+* support defaultDescription for positional arguments ([812048c](https://www.github.com/yargs/yargs/commit/812048c))
+
+### [13.2.4](https://github.com/yargs/yargs/compare/v13.2.3...v13.2.4) (2019-05-13)
+
+
+### Bug Fixes
+
+* **i18n:** rename unclear 'implication failed' to 'missing dependent arguments' ([#1317](https://github.com/yargs/yargs/issues/1317)) ([bf46813](https://github.com/yargs/yargs/commit/bf46813))
+
+
+
+### [13.2.3](https://github.com/yargs/yargs/compare/v13.2.2...v13.2.3) (2019-05-05)
+
+
+### Bug Fixes
+
+* **deps:** upgrade cliui for compatibility with latest chalk. ([#1330](https://github.com/yargs/yargs/issues/1330)) ([b20db65](https://github.com/yargs/yargs/commit/b20db65))
+* address issues with dutch translation ([#1316](https://github.com/yargs/yargs/issues/1316)) ([0295132](https://github.com/yargs/yargs/commit/0295132))
+
+
+### Tests
+
+* accept differently formatted output ([#1327](https://github.com/yargs/yargs/issues/1327)) ([c294d1b](https://github.com/yargs/yargs/commit/c294d1b))
+
+
+
+## [13.2.2](https://github.com/yargs/yargs/compare/v13.2.1...v13.2.2) (2019-03-06)
+
+
+
+## [13.2.1](https://github.com/yargs/yargs/compare/v13.2.0...v13.2.1) (2019-02-18)
+
+
+### Bug Fixes
+
+* add zsh script to files array ([3180224](https://github.com/yargs/yargs/commit/3180224))
+* support options/sub-commands in zsh completion ([0a96394](https://github.com/yargs/yargs/commit/0a96394))
+
+
+# [13.2.0](https://github.com/yargs/yargs/compare/v13.1.0...v13.2.0) (2019-02-15)
+
+
+### Features
+
+* zsh auto completion ([#1292](https://github.com/yargs/yargs/issues/1292)) ([16c5d25](https://github.com/yargs/yargs/commit/16c5d25)), closes [#1156](https://github.com/yargs/yargs/issues/1156)
+
+
+<a name="13.1.0"></a>
+# [13.1.0](https://github.com/yargs/yargs/compare/v13.0.0...v13.1.0) (2019-02-12)
+
+
+### Features
+
+* add applyBeforeValidation, for applying sync middleware before validation ([5be206a](https://github.com/yargs/yargs/commit/5be206a))
+
+
+
+<a name="13.0.0"></a>
+# [13.0.0](https://github.com/yargs/yargs/compare/v12.0.5...v13.0.0) (2019-02-02)
+
+
+### Bug Fixes
+
+* **deps:** Update os-locale to avoid security vulnerability ([#1270](https://github.com/yargs/yargs/issues/1270)) ([27bf739](https://github.com/yargs/yargs/commit/27bf739))
+* **validation:** Use the error as a message when none exists otherwise ([#1268](https://github.com/yargs/yargs/issues/1268)) ([0510fe6](https://github.com/yargs/yargs/commit/0510fe6))
+* better bash path completion ([#1272](https://github.com/yargs/yargs/issues/1272)) ([da75ea2](https://github.com/yargs/yargs/commit/da75ea2))
+* middleware added multiple times due to reference bug ([#1282](https://github.com/yargs/yargs/issues/1282)) ([64af518](https://github.com/yargs/yargs/commit/64af518))
+
+
+### Chores
+
+* ~drop Node 6 from testing matrix ([#1287](https://github.com/yargs/yargs/issues/1287)) ([ef16792](https://github.com/yargs/yargs/commit/ef16792))~
+  * _opting to not drop Node 6 support until April, [see](https://github.com/nodejs/Release)._
+* update dependencies ([#1284](https://github.com/yargs/yargs/issues/1284)) ([f25de4f](https://github.com/yargs/yargs/commit/f25de4f))
+
+
+### Features
+
+* Add `.parserConfiguration()` method, deprecating package.json config ([#1262](https://github.com/yargs/yargs/issues/1262)) ([3c6869a](https://github.com/yargs/yargs/commit/3c6869a))
+* adds config option for sorting command output ([#1256](https://github.com/yargs/yargs/issues/1256)) ([6916ce9](https://github.com/yargs/yargs/commit/6916ce9))
+* options/positionals with leading '+' and '0' no longer parse as numbers ([#1286](https://github.com/yargs/yargs/issues/1286)) ([e9dc3aa](https://github.com/yargs/yargs/commit/e9dc3aa))
+* support promises in middleware ([f3a4e4f](https://github.com/yargs/yargs/commit/f3a4e4f))
+
+
+### BREAKING CHANGES
+
+* options with leading '+' or '0' now parse as strings
+* dropping Node 6 which hits end of life in April 2019
+* see [yargs-parser@12.0.0 CHANGELOG](https://github.com/yargs/yargs-parser/blob/master/CHANGELOG.md#breaking-changes)
+* we now warn if the yargs stanza package.json is used.
+
+
+
+<a name="12.0.5"></a>
+## [12.0.5](https://github.com/yargs/yargs/compare/v12.0.4...v12.0.5) (2018-11-19)
+
+
+### Bug Fixes
+
+* allows camel-case, variadic arguments, and strict mode to be combined ([#1247](https://github.com/yargs/yargs/issues/1247)) ([eacc035](https://github.com/yargs/yargs/commit/eacc035))
+
+
+
+<a name="12.0.4"></a>
+## [12.0.4](https://github.com/yargs/yargs/compare/v12.0.3...v12.0.4) (2018-11-10)
+
+
+### Bug Fixes
+
+* don't load config when processing positionals ([5d0dc92](https://github.com/yargs/yargs/commit/5d0dc92))
+
+
+
+<a name="12.0.3"></a>
+## [12.0.3](https://github.com/yargs/yargs/compare/v12.0.2...v12.0.3) (2018-10-06)
+
+
+### Bug Fixes
+
+* $0 contains first arg in bundled electron apps ([#1206](https://github.com/yargs/yargs/issues/1206)) ([567820b](https://github.com/yargs/yargs/commit/567820b))
+* accept single function for middleware ([66fd6f7](https://github.com/yargs/yargs/commit/66fd6f7)), closes [#1214](https://github.com/yargs/yargs/issues/1214) [#1214](https://github.com/yargs/yargs/issues/1214)
+* hide `hidden` options from help output even if they are in a group ([#1221](https://github.com/yargs/yargs/issues/1221)) ([da54028](https://github.com/yargs/yargs/commit/da54028))
+* improve Norwegian Bokmål translations ([#1208](https://github.com/yargs/yargs/issues/1208)) ([a458fa4](https://github.com/yargs/yargs/commit/a458fa4))
+* improve Norwegian Nynorsk translations ([#1207](https://github.com/yargs/yargs/issues/1207)) ([d422eb5](https://github.com/yargs/yargs/commit/d422eb5))
+
+
+
+<a name="12.0.2"></a>
+## [12.0.2](https://github.com/yargs/yargs/compare/v12.0.1...v12.0.2) (2018-09-04)
+
+
+### Bug Fixes
+
+* middleware should work regardless of when method is called  ([664b265](https://github.com/yargs/yargs/commit/664b265)), closes [#1178](https://github.com/yargs/yargs/issues/1178)
+* translation not working when using __ with a single parameter ([#1183](https://github.com/yargs/yargs/issues/1183)) ([f449aea](https://github.com/yargs/yargs/commit/f449aea))
+* upgrade os-locale to version that addresses license issue ([#1195](https://github.com/yargs/yargs/issues/1195)) ([efc0970](https://github.com/yargs/yargs/commit/efc0970))
+
+
+
+<a name="12.0.1"></a>
+## [12.0.1](https://github.com/yargs/yargs/compare/v12.0.0...v12.0.1) (2018-06-29)
+
+
+
+<a name="12.0.0"></a>
+# [12.0.0](https://github.com/yargs/yargs/compare/v11.1.0...v12.0.0) (2018-06-26)
+
+
+### Bug Fixes
+
+* .argv and .parse() now invoke identical code path ([#1126](https://github.com/yargs/yargs/issues/1126)) ([f13ebf4](https://github.com/yargs/yargs/commit/f13ebf4))
+* remove the trailing white spaces from the help output ([#1090](https://github.com/yargs/yargs/issues/1090)) ([3f0746c](https://github.com/yargs/yargs/commit/3f0746c))
+* **completion:** Avoid default command and recommendations during completion ([#1123](https://github.com/yargs/yargs/issues/1123)) ([036e7c5](https://github.com/yargs/yargs/commit/036e7c5))
+
+
+### Chores
+
+* test Node.js 6, 8 and 10 ([#1160](https://github.com/yargs/yargs/issues/1160)) ([84f9d2b](https://github.com/yargs/yargs/commit/84f9d2b))
+* upgrade to version of yargs-parser that does not populate value for unset boolean ([#1104](https://github.com/yargs/yargs/issues/1104)) ([d4705f4](https://github.com/yargs/yargs/commit/d4705f4))
+
+
+### Features
+
+* add support for global middleware, useful for shared tasks like metrics ([#1119](https://github.com/yargs/yargs/issues/1119)) ([9d71ac7](https://github.com/yargs/yargs/commit/9d71ac7))
+* allow setting scriptName $0 ([#1143](https://github.com/yargs/yargs/issues/1143)) ([a2f2eae](https://github.com/yargs/yargs/commit/a2f2eae))
+* remove `setPlaceholderKeys` ([#1105](https://github.com/yargs/yargs/issues/1105)) ([6ee2c82](https://github.com/yargs/yargs/commit/6ee2c82))
+
+
+### BREAKING CHANGES
+
+* Options absent from `argv` (not set via CLI argument) are now absent from the parsed result object rather than being set with `undefined`
+* drop Node 4 from testing matrix, such that we'll gradually start drifting away from supporting Node 4.
+* yargs-parser does not populate 'false' when boolean flag is not passed
+* tests that assert against help output will need to be updated
+
+
+
+<a name="11.1.0"></a>
+# [11.1.0](https://github.com/yargs/yargs/compare/v11.0.0...v11.1.0) (2018-03-04)
+
+
+### Bug Fixes
+
+* choose correct config directory when require.main does not exist ([#1056](https://github.com/yargs/yargs/issues/1056)) ([a04678c](https://github.com/yargs/yargs/commit/a04678c))
+
+
+### Features
+
+* allow hidden options to be displayed with --show-hidden ([#1061](https://github.com/yargs/yargs/issues/1061)) ([ea862ae](https://github.com/yargs/yargs/commit/ea862ae))
+* extend *.rc files in addition to json ([#1080](https://github.com/yargs/yargs/issues/1080)) ([11691a6](https://github.com/yargs/yargs/commit/11691a6))
+
+
+
+<a name="11.0.0"></a>
+# [11.0.0](https://github.com/yargs/yargs/compare/v10.1.2...v11.0.0) (2018-01-22)
+
+
+### Bug Fixes
+
+* Set implicit nargs=1 when type=number requiresArg=true ([#1050](https://github.com/yargs/yargs/issues/1050)) ([2b56812](https://github.com/yargs/yargs/commit/2b56812))
+
+
+### Features
+
+* requiresArg is now simply an alias for nargs(1) ([#1054](https://github.com/yargs/yargs/issues/1054)) ([a3ddacc](https://github.com/yargs/yargs/commit/a3ddacc))
+
+
+### BREAKING CHANGES
+
+* requiresArg now has significantly different error output, matching nargs.
+
+[Historical Versions](/docs/CHANGELOG-historical.md)
diff --git a/node_modules/jest-circus/node_modules/yargs/LICENSE b/node_modules/jest-circus/node_modules/yargs/LICENSE
new file mode 100644
index 0000000..b0145ca
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright 2010 James Halliday (mail@substack.net); Modified work Copyright 2014 Contributors (ben@npmjs.com)
+
+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/node_modules/jest-circus/node_modules/yargs/README.md b/node_modules/jest-circus/node_modules/yargs/README.md
new file mode 100644
index 0000000..0db992b
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/README.md
@@ -0,0 +1,140 @@
+<p align="center">
+  <img width="250" src="/yargs-logo.png">
+</p>
+<h1 align="center"> Yargs </h1>
+<p align="center">
+  <b >Yargs be a node.js library fer hearties tryin' ter parse optstrings</b>
+</p>
+
+<br>
+
+[![Build Status][travis-image]][travis-url]
+[![NPM version][npm-image]][npm-url]
+[![js-standard-style][standard-image]][standard-url]
+[![Coverage][coverage-image]][coverage-url]
+[![Conventional Commits][conventional-commits-image]][conventional-commits-url]
+[![Slack][slack-image]][slack-url]
+
+## Description :
+Yargs helps you build interactive command line tools, by parsing arguments and generating an elegant user interface.
+
+It gives you:
+
+* commands and (grouped) options (`my-program.js serve --port=5000`).
+* a dynamically generated help menu based on your arguments.
+
+> <img width="400" src="/screen.png">
+
+* bash-completion shortcuts for commands and options.
+* and [tons more](/docs/api.md).
+
+## Installation
+
+Stable version:
+```bash
+npm i yargs
+```
+
+Bleeding edge version with the most recent features:
+```bash
+npm i yargs@next
+```
+
+## Usage :
+
+### Simple Example
+
+```javascript
+#!/usr/bin/env node
+const {argv} = require('yargs')
+
+if (argv.ships > 3 && argv.distance < 53.5) {
+  console.log('Plunder more riffiwobbles!')
+} else {
+  console.log('Retreat from the xupptumblers!')
+}
+```
+
+```bash
+$ ./plunder.js --ships=4 --distance=22
+Plunder more riffiwobbles!
+
+$ ./plunder.js --ships 12 --distance 98.7
+Retreat from the xupptumblers!
+```
+
+### Complex Example
+
+```javascript
+#!/usr/bin/env node
+require('yargs') // eslint-disable-line
+  .command('serve [port]', 'start the server', (yargs) => {
+    yargs
+      .positional('port', {
+        describe: 'port to bind on',
+        default: 5000
+      })
+  }, (argv) => {
+    if (argv.verbose) console.info(`start server on :${argv.port}`)
+    serve(argv.port)
+  })
+  .option('verbose', {
+    alias: 'v',
+    type: 'boolean',
+    description: 'Run with verbose logging'
+  })
+  .argv
+```
+
+Run the example above with `--help` to see the help for the application.
+
+## TypeScript
+
+yargs has type definitions at [@types/yargs][type-definitions].
+
+```
+npm i @types/yargs --save-dev
+```
+
+See usage examples in [docs](/docs/typescript.md).
+
+## Webpack
+
+See usage examples of yargs with webpack in [docs](/docs/webpack.md).
+
+## Community :
+
+Having problems? want to contribute? join our [community slack](http://devtoolscommunity.herokuapp.com).
+
+## Documentation :
+
+### Table of Contents
+
+* [Yargs' API](/docs/api.md)
+* [Examples](/docs/examples.md)
+* [Parsing Tricks](/docs/tricks.md)
+  * [Stop the Parser](/docs/tricks.md#stop)
+  * [Negating Boolean Arguments](/docs/tricks.md#negate)
+  * [Numbers](/docs/tricks.md#numbers)
+  * [Arrays](/docs/tricks.md#arrays)
+  * [Objects](/docs/tricks.md#objects)
+  * [Quotes](/docs/tricks.md#quotes)
+* [Advanced Topics](/docs/advanced.md)
+  * [Composing Your App Using Commands](/docs/advanced.md#commands)
+  * [Building Configurable CLI Apps](/docs/advanced.md#configuration)
+  * [Customizing Yargs' Parser](/docs/advanced.md#customizing)
+* [Contributing](/contributing.md)
+
+[travis-url]: https://travis-ci.org/yargs/yargs
+[travis-image]: https://img.shields.io/travis/yargs/yargs/master.svg
+[npm-url]: https://www.npmjs.com/package/yargs
+[npm-image]: https://img.shields.io/npm/v/yargs.svg
+[standard-image]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg
+[standard-url]: http://standardjs.com/
+[conventional-commits-image]: https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg
+[conventional-commits-url]: https://conventionalcommits.org/
+[slack-image]: http://devtoolscommunity.herokuapp.com/badge.svg
+[slack-url]: http://devtoolscommunity.herokuapp.com
+[type-definitions]: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/yargs
+[coverage-image]: https://img.shields.io/nycrc/yargs/yargs
+[coverage-url]: https://github.com/yargs/yargs/blob/master/.nycrc
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/apply-extends.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/apply-extends.d.ts
new file mode 100644
index 0000000..5a9aca7
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/apply-extends.d.ts
@@ -0,0 +1,2 @@
+import { Dictionary } from './common-types';
+export declare function applyExtends(config: Dictionary, cwd: string, mergeExtends?: boolean): Dictionary;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/apply-extends.js b/node_modules/jest-circus/node_modules/yargs/build/lib/apply-extends.js
new file mode 100644
index 0000000..005734a
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/apply-extends.js
@@ -0,0 +1,65 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.applyExtends = void 0;
+const fs = require("fs");
+const path = require("path");
+const yerror_1 = require("./yerror");
+let previouslyVisitedConfigs = [];
+function checkForCircularExtends(cfgPath) {
+    if (previouslyVisitedConfigs.indexOf(cfgPath) > -1) {
+        throw new yerror_1.YError(`Circular extended configurations: '${cfgPath}'.`);
+    }
+}
+function getPathToDefaultConfig(cwd, pathToExtend) {
+    return path.resolve(cwd, pathToExtend);
+}
+function mergeDeep(config1, config2) {
+    const target = {};
+    function isObject(obj) {
+        return obj && typeof obj === 'object' && !Array.isArray(obj);
+    }
+    Object.assign(target, config1);
+    for (const key of Object.keys(config2)) {
+        if (isObject(config2[key]) && isObject(target[key])) {
+            target[key] = mergeDeep(config1[key], config2[key]);
+        }
+        else {
+            target[key] = config2[key];
+        }
+    }
+    return target;
+}
+function applyExtends(config, cwd, mergeExtends = false) {
+    let defaultConfig = {};
+    if (Object.prototype.hasOwnProperty.call(config, 'extends')) {
+        if (typeof config.extends !== 'string')
+            return defaultConfig;
+        const isPath = /\.json|\..*rc$/.test(config.extends);
+        let pathToDefault = null;
+        if (!isPath) {
+            try {
+                pathToDefault = require.resolve(config.extends);
+            }
+            catch (err) {
+                // most likely this simply isn't a module.
+            }
+        }
+        else {
+            pathToDefault = getPathToDefaultConfig(cwd, config.extends);
+        }
+        // maybe the module uses key for some other reason,
+        // err on side of caution.
+        if (!pathToDefault && !isPath)
+            return config;
+        if (!pathToDefault)
+            throw new yerror_1.YError(`Unable to find extended config '${config.extends}' in '${cwd}'.`);
+        checkForCircularExtends(pathToDefault);
+        previouslyVisitedConfigs.push(pathToDefault);
+        defaultConfig = isPath ? JSON.parse(fs.readFileSync(pathToDefault, 'utf8')) : require(config.extends);
+        delete config.extends;
+        defaultConfig = applyExtends(defaultConfig, path.dirname(pathToDefault), mergeExtends);
+    }
+    previouslyVisitedConfigs = [];
+    return mergeExtends ? mergeDeep(defaultConfig, config) : Object.assign({}, defaultConfig, config);
+}
+exports.applyExtends = applyExtends;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/argsert.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/argsert.d.ts
new file mode 100644
index 0000000..6f7a83f
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/argsert.d.ts
@@ -0,0 +1,2 @@
+export declare function argsert(callerArguments: any[], length?: number): void;
+export declare function argsert(expected: string, callerArguments: any[], length?: number): void;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/argsert.js b/node_modules/jest-circus/node_modules/yargs/build/lib/argsert.js
new file mode 100644
index 0000000..40cb091
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/argsert.js
@@ -0,0 +1,65 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.argsert = void 0;
+const yerror_1 = require("./yerror");
+const parse_command_1 = require("./parse-command");
+const positionName = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth'];
+function argsert(arg1, arg2, arg3) {
+    function parseArgs() {
+        return typeof arg1 === 'object'
+            ? [{ demanded: [], optional: [] }, arg1, arg2]
+            : [parse_command_1.parseCommand(`cmd ${arg1}`), arg2, arg3];
+    }
+    // TODO: should this eventually raise an exception.
+    try {
+        // preface the argument description with "cmd", so
+        // that we can run it through yargs' command parser.
+        let position = 0;
+        let [parsed, callerArguments, length] = parseArgs();
+        const args = [].slice.call(callerArguments);
+        while (args.length && args[args.length - 1] === undefined)
+            args.pop();
+        length = length || args.length;
+        if (length < parsed.demanded.length) {
+            throw new yerror_1.YError(`Not enough arguments provided. Expected ${parsed.demanded.length} but received ${args.length}.`);
+        }
+        const totalCommands = parsed.demanded.length + parsed.optional.length;
+        if (length > totalCommands) {
+            throw new yerror_1.YError(`Too many arguments provided. Expected max ${totalCommands} but received ${length}.`);
+        }
+        parsed.demanded.forEach((demanded) => {
+            const arg = args.shift();
+            const observedType = guessType(arg);
+            const matchingTypes = demanded.cmd.filter(type => type === observedType || type === '*');
+            if (matchingTypes.length === 0)
+                argumentTypeError(observedType, demanded.cmd, position);
+            position += 1;
+        });
+        parsed.optional.forEach((optional) => {
+            if (args.length === 0)
+                return;
+            const arg = args.shift();
+            const observedType = guessType(arg);
+            const matchingTypes = optional.cmd.filter(type => type === observedType || type === '*');
+            if (matchingTypes.length === 0)
+                argumentTypeError(observedType, optional.cmd, position);
+            position += 1;
+        });
+    }
+    catch (err) {
+        console.warn(err.stack);
+    }
+}
+exports.argsert = argsert;
+function guessType(arg) {
+    if (Array.isArray(arg)) {
+        return 'array';
+    }
+    else if (arg === null) {
+        return 'null';
+    }
+    return typeof arg;
+}
+function argumentTypeError(observedType, allowedTypes, position) {
+    throw new yerror_1.YError(`Invalid ${positionName[position] || 'manyith'} argument. Expected ${allowedTypes.join(' or ')} but received ${observedType}.`);
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/command.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/command.d.ts
new file mode 100644
index 0000000..9db6ab5
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/command.d.ts
@@ -0,0 +1,64 @@
+/// <reference types="node" />
+import { Dictionary } from './common-types';
+import { Middleware } from './middleware';
+import { Positional } from './parse-command';
+import { RequireDirectoryOptions } from 'require-directory';
+import { UsageInstance } from './usage';
+import { ValidationInstance } from './validation';
+import { YargsInstance, Options, OptionDefinition, Context, Arguments, DetailedArguments } from './yargs';
+export declare function command(yargs: YargsInstance, usage: UsageInstance, validation: ValidationInstance, globalMiddleware?: Middleware[]): CommandInstance;
+/** Instance of the command module. */
+export interface CommandInstance {
+    addDirectory(dir: string, context: Context, req: NodeRequireFunction, callerFile: string, opts?: RequireDirectoryOptions<any>): void;
+    addHandler(handler: CommandHandlerDefinition): void;
+    addHandler(cmd: string | string[], description: CommandHandler['description'], builder?: CommandBuilderDefinition | CommandBuilder, handler?: CommandHandlerCallback, commandMiddleware?: Middleware[], deprecated?: boolean): void;
+    cmdToParseOptions(cmdString: string): Positionals;
+    freeze(): void;
+    getCommandHandlers(): Dictionary<CommandHandler>;
+    getCommands(): string[];
+    hasDefaultCommand(): boolean;
+    reset(): CommandInstance;
+    runCommand(command: string | null, yargs: YargsInstance, parsed: DetailedArguments, commandIndex?: number): Arguments | Promise<Arguments>;
+    runDefaultBuilderOn(yargs: YargsInstance): void;
+    unfreeze(): void;
+}
+export interface CommandHandlerDefinition extends Partial<Pick<CommandHandler, 'deprecated' | 'description' | 'handler' | 'middlewares'>> {
+    aliases?: string[];
+    builder?: CommandBuilder | CommandBuilderDefinition;
+    command?: string | string[];
+    desc?: CommandHandler['description'];
+    describe?: CommandHandler['description'];
+}
+export declare function isCommandHandlerDefinition(cmd: string | string[] | CommandHandlerDefinition): cmd is CommandHandlerDefinition;
+export interface CommandBuilderDefinition {
+    builder?: CommandBuilder;
+    deprecated?: boolean;
+    handler: CommandHandlerCallback;
+    middlewares?: Middleware[];
+}
+export declare function isCommandBuilderDefinition(builder?: CommandBuilder | CommandBuilderDefinition): builder is CommandBuilderDefinition;
+export interface CommandHandlerCallback {
+    (argv: Arguments): any;
+}
+export interface CommandHandler {
+    builder: CommandBuilder;
+    demanded: Positional[];
+    deprecated?: boolean;
+    description?: string | false;
+    handler: CommandHandlerCallback;
+    middlewares: Middleware[];
+    optional: Positional[];
+    original: string;
+}
+export declare type CommandBuilder = CommandBuilderCallback | Dictionary<OptionDefinition>;
+interface CommandBuilderCallback {
+    (y: YargsInstance): YargsInstance | void;
+}
+export declare function isCommandBuilderCallback(builder: CommandBuilder): builder is CommandBuilderCallback;
+interface Positionals extends Pick<Options, 'alias' | 'array' | 'default'> {
+    demand: Dictionary<boolean>;
+}
+export interface FinishCommandHandler {
+    (handlerResult: any): any;
+}
+export {};
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/command.js b/node_modules/jest-circus/node_modules/yargs/build/lib/command.js
new file mode 100644
index 0000000..d90c455
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/command.js
@@ -0,0 +1,416 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isCommandBuilderCallback = exports.isCommandBuilderDefinition = exports.isCommandHandlerDefinition = exports.command = void 0;
+const common_types_1 = require("./common-types");
+const is_promise_1 = require("./is-promise");
+const middleware_1 = require("./middleware");
+const parse_command_1 = require("./parse-command");
+const path = require("path");
+const util_1 = require("util");
+const yargs_1 = require("./yargs");
+const requireDirectory = require("require-directory");
+const whichModule = require("which-module");
+const Parser = require("yargs-parser");
+const DEFAULT_MARKER = /(^\*)|(^\$0)/;
+// handles parsing positional arguments,
+// and populating argv with said positional
+// arguments.
+function command(yargs, usage, validation, globalMiddleware = []) {
+    const self = {};
+    let handlers = {};
+    let aliasMap = {};
+    let defaultCommand;
+    self.addHandler = function addHandler(cmd, description, builder, handler, commandMiddleware, deprecated) {
+        let aliases = [];
+        const middlewares = middleware_1.commandMiddlewareFactory(commandMiddleware);
+        handler = handler || (() => { });
+        if (Array.isArray(cmd)) {
+            aliases = cmd.slice(1);
+            cmd = cmd[0];
+        }
+        else if (isCommandHandlerDefinition(cmd)) {
+            let command = (Array.isArray(cmd.command) || typeof cmd.command === 'string') ? cmd.command : moduleName(cmd);
+            if (cmd.aliases)
+                command = [].concat(command).concat(cmd.aliases);
+            self.addHandler(command, extractDesc(cmd), cmd.builder, cmd.handler, cmd.middlewares, cmd.deprecated);
+            return;
+        }
+        // allow a module to be provided instead of separate builder and handler
+        if (isCommandBuilderDefinition(builder)) {
+            self.addHandler([cmd].concat(aliases), description, builder.builder, builder.handler, builder.middlewares, builder.deprecated);
+            return;
+        }
+        // parse positionals out of cmd string
+        const parsedCommand = parse_command_1.parseCommand(cmd);
+        // remove positional args from aliases only
+        aliases = aliases.map(alias => parse_command_1.parseCommand(alias).cmd);
+        // check for default and filter out '*''
+        let isDefault = false;
+        const parsedAliases = [parsedCommand.cmd].concat(aliases).filter((c) => {
+            if (DEFAULT_MARKER.test(c)) {
+                isDefault = true;
+                return false;
+            }
+            return true;
+        });
+        // standardize on $0 for default command.
+        if (parsedAliases.length === 0 && isDefault)
+            parsedAliases.push('$0');
+        // shift cmd and aliases after filtering out '*'
+        if (isDefault) {
+            parsedCommand.cmd = parsedAliases[0];
+            aliases = parsedAliases.slice(1);
+            cmd = cmd.replace(DEFAULT_MARKER, parsedCommand.cmd);
+        }
+        // populate aliasMap
+        aliases.forEach((alias) => {
+            aliasMap[alias] = parsedCommand.cmd;
+        });
+        if (description !== false) {
+            usage.command(cmd, description, isDefault, aliases, deprecated);
+        }
+        handlers[parsedCommand.cmd] = {
+            original: cmd,
+            description,
+            handler,
+            builder: builder || {},
+            middlewares,
+            deprecated,
+            demanded: parsedCommand.demanded,
+            optional: parsedCommand.optional
+        };
+        if (isDefault)
+            defaultCommand = handlers[parsedCommand.cmd];
+    };
+    self.addDirectory = function addDirectory(dir, context, req, callerFile, opts) {
+        opts = opts || {};
+        // disable recursion to support nested directories of subcommands
+        if (typeof opts.recurse !== 'boolean')
+            opts.recurse = false;
+        // exclude 'json', 'coffee' from require-directory defaults
+        if (!Array.isArray(opts.extensions))
+            opts.extensions = ['js'];
+        // allow consumer to define their own visitor function
+        const parentVisit = typeof opts.visit === 'function' ? opts.visit : (o) => o;
+        // call addHandler via visitor function
+        opts.visit = function visit(obj, joined, filename) {
+            const visited = parentVisit(obj, joined, filename);
+            // allow consumer to skip modules with their own visitor
+            if (visited) {
+                // check for cyclic reference
+                // each command file path should only be seen once per execution
+                if (~context.files.indexOf(joined))
+                    return visited;
+                // keep track of visited files in context.files
+                context.files.push(joined);
+                self.addHandler(visited);
+            }
+            return visited;
+        };
+        requireDirectory({ require: req, filename: callerFile }, dir, opts);
+    };
+    // lookup module object from require()d command and derive name
+    // if module was not require()d and no name given, throw error
+    function moduleName(obj) {
+        const mod = whichModule(obj);
+        if (!mod)
+            throw new Error(`No command name given for module: ${util_1.inspect(obj)}`);
+        return commandFromFilename(mod.filename);
+    }
+    // derive command name from filename
+    function commandFromFilename(filename) {
+        return path.basename(filename, path.extname(filename));
+    }
+    function extractDesc({ describe, description, desc }) {
+        for (const test of [describe, description, desc]) {
+            if (typeof test === 'string' || test === false)
+                return test;
+            common_types_1.assertNotStrictEqual(test, true);
+        }
+        return false;
+    }
+    self.getCommands = () => Object.keys(handlers).concat(Object.keys(aliasMap));
+    self.getCommandHandlers = () => handlers;
+    self.hasDefaultCommand = () => !!defaultCommand;
+    self.runCommand = function runCommand(command, yargs, parsed, commandIndex) {
+        let aliases = parsed.aliases;
+        const commandHandler = handlers[command] || handlers[aliasMap[command]] || defaultCommand;
+        const currentContext = yargs.getContext();
+        let numFiles = currentContext.files.length;
+        const parentCommands = currentContext.commands.slice();
+        // what does yargs look like after the builder is run?
+        let innerArgv = parsed.argv;
+        let positionalMap = {};
+        if (command) {
+            currentContext.commands.push(command);
+            currentContext.fullCommands.push(commandHandler.original);
+        }
+        const builder = commandHandler.builder;
+        if (isCommandBuilderCallback(builder)) {
+            // a function can be provided, which builds
+            // up a yargs chain and possibly returns it.
+            const builderOutput = builder(yargs.reset(parsed.aliases));
+            const innerYargs = yargs_1.isYargsInstance(builderOutput) ? builderOutput : yargs;
+            if (shouldUpdateUsage(innerYargs)) {
+                innerYargs.getUsageInstance().usage(usageFromParentCommandsCommandHandler(parentCommands, commandHandler), commandHandler.description);
+            }
+            innerArgv = innerYargs._parseArgs(null, null, true, commandIndex);
+            aliases = innerYargs.parsed.aliases;
+        }
+        else if (isCommandBuilderOptionDefinitions(builder)) {
+            // as a short hand, an object can instead be provided, specifying
+            // the options that a command takes.
+            const innerYargs = yargs.reset(parsed.aliases);
+            if (shouldUpdateUsage(innerYargs)) {
+                innerYargs.getUsageInstance().usage(usageFromParentCommandsCommandHandler(parentCommands, commandHandler), commandHandler.description);
+            }
+            Object.keys(commandHandler.builder).forEach((key) => {
+                innerYargs.option(key, builder[key]);
+            });
+            innerArgv = innerYargs._parseArgs(null, null, true, commandIndex);
+            aliases = innerYargs.parsed.aliases;
+        }
+        if (!yargs._hasOutput()) {
+            positionalMap = populatePositionals(commandHandler, innerArgv, currentContext);
+        }
+        const middlewares = globalMiddleware.slice(0).concat(commandHandler.middlewares);
+        middleware_1.applyMiddleware(innerArgv, yargs, middlewares, true);
+        // we apply validation post-hoc, so that custom
+        // checks get passed populated positional arguments.
+        if (!yargs._hasOutput()) {
+            yargs._runValidation(innerArgv, aliases, positionalMap, yargs.parsed.error, !command);
+        }
+        if (commandHandler.handler && !yargs._hasOutput()) {
+            yargs._setHasOutput();
+            // to simplify the parsing of positionals in commands,
+            // we temporarily populate '--' rather than _, with arguments
+            const populateDoubleDash = !!yargs.getOptions().configuration['populate--'];
+            if (!populateDoubleDash)
+                yargs._copyDoubleDash(innerArgv);
+            innerArgv = middleware_1.applyMiddleware(innerArgv, yargs, middlewares, false);
+            let handlerResult;
+            if (is_promise_1.isPromise(innerArgv)) {
+                handlerResult = innerArgv.then(argv => commandHandler.handler(argv));
+            }
+            else {
+                handlerResult = commandHandler.handler(innerArgv);
+            }
+            const handlerFinishCommand = yargs.getHandlerFinishCommand();
+            if (is_promise_1.isPromise(handlerResult)) {
+                yargs.getUsageInstance().cacheHelpMessage();
+                handlerResult
+                    .then(value => {
+                    if (handlerFinishCommand) {
+                        handlerFinishCommand(value);
+                    }
+                })
+                    .catch(error => {
+                    try {
+                        yargs.getUsageInstance().fail(null, error);
+                    }
+                    catch (err) {
+                        // fail's throwing would cause an unhandled rejection.
+                    }
+                })
+                    .then(() => {
+                    yargs.getUsageInstance().clearCachedHelpMessage();
+                });
+            }
+            else {
+                if (handlerFinishCommand) {
+                    handlerFinishCommand(handlerResult);
+                }
+            }
+        }
+        if (command) {
+            currentContext.commands.pop();
+            currentContext.fullCommands.pop();
+        }
+        numFiles = currentContext.files.length - numFiles;
+        if (numFiles > 0)
+            currentContext.files.splice(numFiles * -1, numFiles);
+        return innerArgv;
+    };
+    function shouldUpdateUsage(yargs) {
+        return !yargs.getUsageInstance().getUsageDisabled() &&
+            yargs.getUsageInstance().getUsage().length === 0;
+    }
+    function usageFromParentCommandsCommandHandler(parentCommands, commandHandler) {
+        const c = DEFAULT_MARKER.test(commandHandler.original) ? commandHandler.original.replace(DEFAULT_MARKER, '').trim() : commandHandler.original;
+        const pc = parentCommands.filter((c) => { return !DEFAULT_MARKER.test(c); });
+        pc.push(c);
+        return `$0 ${pc.join(' ')}`;
+    }
+    self.runDefaultBuilderOn = function (yargs) {
+        common_types_1.assertNotStrictEqual(defaultCommand, undefined);
+        if (shouldUpdateUsage(yargs)) {
+            // build the root-level command string from the default string.
+            const commandString = DEFAULT_MARKER.test(defaultCommand.original)
+                ? defaultCommand.original : defaultCommand.original.replace(/^[^[\]<>]*/, '$0 ');
+            yargs.getUsageInstance().usage(commandString, defaultCommand.description);
+        }
+        const builder = defaultCommand.builder;
+        if (isCommandBuilderCallback(builder)) {
+            builder(yargs);
+        }
+        else {
+            Object.keys(builder).forEach((key) => {
+                yargs.option(key, builder[key]);
+            });
+        }
+    };
+    // transcribe all positional arguments "command <foo> <bar> [apple]"
+    // onto argv.
+    function populatePositionals(commandHandler, argv, context) {
+        argv._ = argv._.slice(context.commands.length); // nuke the current commands
+        const demanded = commandHandler.demanded.slice(0);
+        const optional = commandHandler.optional.slice(0);
+        const positionalMap = {};
+        validation.positionalCount(demanded.length, argv._.length);
+        while (demanded.length) {
+            const demand = demanded.shift();
+            populatePositional(demand, argv, positionalMap);
+        }
+        while (optional.length) {
+            const maybe = optional.shift();
+            populatePositional(maybe, argv, positionalMap);
+        }
+        argv._ = context.commands.concat(argv._);
+        postProcessPositionals(argv, positionalMap, self.cmdToParseOptions(commandHandler.original));
+        return positionalMap;
+    }
+    function populatePositional(positional, argv, positionalMap) {
+        const cmd = positional.cmd[0];
+        if (positional.variadic) {
+            positionalMap[cmd] = argv._.splice(0).map(String);
+        }
+        else {
+            if (argv._.length)
+                positionalMap[cmd] = [String(argv._.shift())];
+        }
+    }
+    // we run yargs-parser against the positional arguments
+    // applying the same parsing logic used for flags.
+    function postProcessPositionals(argv, positionalMap, parseOptions) {
+        // combine the parsing hints we've inferred from the command
+        // string with explicitly configured parsing hints.
+        const options = Object.assign({}, yargs.getOptions());
+        options.default = Object.assign(parseOptions.default, options.default);
+        for (const key of Object.keys(parseOptions.alias)) {
+            options.alias[key] = (options.alias[key] || []).concat(parseOptions.alias[key]);
+        }
+        options.array = options.array.concat(parseOptions.array);
+        delete options.config; //  don't load config when processing positionals.
+        const unparsed = [];
+        Object.keys(positionalMap).forEach((key) => {
+            positionalMap[key].map((value) => {
+                if (options.configuration['unknown-options-as-args'])
+                    options.key[key] = true;
+                unparsed.push(`--${key}`);
+                unparsed.push(value);
+            });
+        });
+        // short-circuit parse.
+        if (!unparsed.length)
+            return;
+        const config = Object.assign({}, options.configuration, {
+            'populate--': true
+        });
+        const parsed = Parser.detailed(unparsed, Object.assign({}, options, {
+            configuration: config
+        }));
+        if (parsed.error) {
+            yargs.getUsageInstance().fail(parsed.error.message, parsed.error);
+        }
+        else {
+            // only copy over positional keys (don't overwrite
+            // flag arguments that were already parsed).
+            const positionalKeys = Object.keys(positionalMap);
+            Object.keys(positionalMap).forEach((key) => {
+                positionalKeys.push(...parsed.aliases[key]);
+            });
+            Object.keys(parsed.argv).forEach((key) => {
+                if (positionalKeys.indexOf(key) !== -1) {
+                    // any new aliases need to be placed in positionalMap, which
+                    // is used for validation.
+                    if (!positionalMap[key])
+                        positionalMap[key] = parsed.argv[key];
+                    argv[key] = parsed.argv[key];
+                }
+            });
+        }
+    }
+    self.cmdToParseOptions = function (cmdString) {
+        const parseOptions = {
+            array: [],
+            default: {},
+            alias: {},
+            demand: {}
+        };
+        const parsed = parse_command_1.parseCommand(cmdString);
+        parsed.demanded.forEach((d) => {
+            const [cmd, ...aliases] = d.cmd;
+            if (d.variadic) {
+                parseOptions.array.push(cmd);
+                parseOptions.default[cmd] = [];
+            }
+            parseOptions.alias[cmd] = aliases;
+            parseOptions.demand[cmd] = true;
+        });
+        parsed.optional.forEach((o) => {
+            const [cmd, ...aliases] = o.cmd;
+            if (o.variadic) {
+                parseOptions.array.push(cmd);
+                parseOptions.default[cmd] = [];
+            }
+            parseOptions.alias[cmd] = aliases;
+        });
+        return parseOptions;
+    };
+    self.reset = () => {
+        handlers = {};
+        aliasMap = {};
+        defaultCommand = undefined;
+        return self;
+    };
+    // used by yargs.parse() to freeze
+    // the state of commands such that
+    // we can apply .parse() multiple times
+    // with the same yargs instance.
+    const frozens = [];
+    self.freeze = () => {
+        frozens.push({
+            handlers,
+            aliasMap,
+            defaultCommand
+        });
+    };
+    self.unfreeze = () => {
+        const frozen = frozens.pop();
+        common_types_1.assertNotStrictEqual(frozen, undefined);
+        ({
+            handlers,
+            aliasMap,
+            defaultCommand
+        } = frozen);
+    };
+    return self;
+}
+exports.command = command;
+function isCommandHandlerDefinition(cmd) {
+    return typeof cmd === 'object';
+}
+exports.isCommandHandlerDefinition = isCommandHandlerDefinition;
+function isCommandBuilderDefinition(builder) {
+    return typeof builder === 'object' &&
+        !!builder.builder &&
+        typeof builder.handler === 'function';
+}
+exports.isCommandBuilderDefinition = isCommandBuilderDefinition;
+function isCommandBuilderCallback(builder) {
+    return typeof builder === 'function';
+}
+exports.isCommandBuilderCallback = isCommandBuilderCallback;
+function isCommandBuilderOptionDefinitions(builder) {
+    return typeof builder === 'object';
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/common-types.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/common-types.d.ts
new file mode 100644
index 0000000..f83c0dd
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/common-types.d.ts
@@ -0,0 +1,36 @@
+/**
+ * An object whose all properties have the same type.
+ */
+export declare type Dictionary<T = any> = {
+    [key: string]: T;
+};
+/**
+ * Returns the keys of T that match Dictionary<U> and are not arrays.
+ */
+export declare type DictionaryKeyof<T, U = any> = Exclude<KeyOf<T, Dictionary<U>>, KeyOf<T, any[]>>;
+/**
+ * Returns the keys of T that match U.
+ */
+export declare type KeyOf<T, U> = Exclude<{
+    [K in keyof T]: T[K] extends U ? K : never;
+}[keyof T], undefined>;
+/**
+ * An array whose first element is not undefined.
+ */
+export declare type NotEmptyArray<T = any> = [T, ...T[]];
+/**
+ * Returns the type of a Dictionary or array values.
+ */
+export declare type ValueOf<T> = T extends (infer U)[] ? U : T[keyof T];
+/**
+ * Typing wrapper around assert.notStrictEqual()
+ */
+export declare function assertNotStrictEqual<N, T>(actual: T | N, expected: N, message?: string | Error): asserts actual is Exclude<T, N>;
+/**
+ * Asserts actual is a single key, not a key array or a key map.
+ */
+export declare function assertSingleKey(actual: string | string[] | Dictionary): asserts actual is string;
+/**
+ * Typing wrapper around Object.keys()
+ */
+export declare function objectKeys<T>(object: T): (keyof T)[];
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/common-types.js b/node_modules/jest-circus/node_modules/yargs/build/lib/common-types.js
new file mode 100644
index 0000000..3064cbf
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/common-types.js
@@ -0,0 +1,25 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.objectKeys = exports.assertSingleKey = exports.assertNotStrictEqual = void 0;
+const assert_1 = require("assert");
+/**
+ * Typing wrapper around assert.notStrictEqual()
+ */
+function assertNotStrictEqual(actual, expected, message) {
+    assert_1.notStrictEqual(actual, expected, message);
+}
+exports.assertNotStrictEqual = assertNotStrictEqual;
+/**
+ * Asserts actual is a single key, not a key array or a key map.
+ */
+function assertSingleKey(actual) {
+    assert_1.strictEqual(typeof actual, 'string');
+}
+exports.assertSingleKey = assertSingleKey;
+/**
+ * Typing wrapper around Object.keys()
+ */
+function objectKeys(object) {
+    return Object.keys(object);
+}
+exports.objectKeys = objectKeys;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/completion-templates.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/completion-templates.d.ts
new file mode 100644
index 0000000..67bcd30
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/completion-templates.d.ts
@@ -0,0 +1,2 @@
+export declare const completionShTemplate = "###-begin-{{app_name}}-completions-###\n#\n# yargs command completion script\n#\n# Installation: {{app_path}} {{completion_command}} >> ~/.bashrc\n#    or {{app_path}} {{completion_command}} >> ~/.bash_profile on OSX.\n#\n_yargs_completions()\n{\n    local cur_word args type_list\n\n    cur_word=\"${COMP_WORDS[COMP_CWORD]}\"\n    args=(\"${COMP_WORDS[@]}\")\n\n    # ask yargs to generate completions.\n    type_list=$({{app_path}} --get-yargs-completions \"${args[@]}\")\n\n    COMPREPLY=( $(compgen -W \"${type_list}\" -- ${cur_word}) )\n\n    # if no match was found, fall back to filename completion\n    if [ ${#COMPREPLY[@]} -eq 0 ]; then\n      COMPREPLY=()\n    fi\n\n    return 0\n}\ncomplete -o default -F _yargs_completions {{app_name}}\n###-end-{{app_name}}-completions-###\n";
+export declare const completionZshTemplate = "###-begin-{{app_name}}-completions-###\n#\n# yargs command completion script\n#\n# Installation: {{app_path}} {{completion_command}} >> ~/.zshrc\n#    or {{app_path}} {{completion_command}} >> ~/.zsh_profile on OSX.\n#\n_{{app_name}}_yargs_completions()\n{\n  local reply\n  local si=$IFS\n  IFS=$'\n' reply=($(COMP_CWORD=\"$((CURRENT-1))\" COMP_LINE=\"$BUFFER\" COMP_POINT=\"$CURSOR\" {{app_path}} --get-yargs-completions \"${words[@]}\"))\n  IFS=$si\n  _describe 'values' reply\n}\ncompdef _{{app_name}}_yargs_completions {{app_name}}\n###-end-{{app_name}}-completions-###\n";
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/completion-templates.js b/node_modules/jest-circus/node_modules/yargs/build/lib/completion-templates.js
new file mode 100644
index 0000000..3ee0e06
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/completion-templates.js
@@ -0,0 +1,50 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.completionZshTemplate = exports.completionShTemplate = void 0;
+exports.completionShTemplate = `###-begin-{{app_name}}-completions-###
+#
+# yargs command completion script
+#
+# Installation: {{app_path}} {{completion_command}} >> ~/.bashrc
+#    or {{app_path}} {{completion_command}} >> ~/.bash_profile on OSX.
+#
+_yargs_completions()
+{
+    local cur_word args type_list
+
+    cur_word="\${COMP_WORDS[COMP_CWORD]}"
+    args=("\${COMP_WORDS[@]}")
+
+    # ask yargs to generate completions.
+    type_list=$({{app_path}} --get-yargs-completions "\${args[@]}")
+
+    COMPREPLY=( $(compgen -W "\${type_list}" -- \${cur_word}) )
+
+    # if no match was found, fall back to filename completion
+    if [ \${#COMPREPLY[@]} -eq 0 ]; then
+      COMPREPLY=()
+    fi
+
+    return 0
+}
+complete -o default -F _yargs_completions {{app_name}}
+###-end-{{app_name}}-completions-###
+`;
+exports.completionZshTemplate = `###-begin-{{app_name}}-completions-###
+#
+# yargs command completion script
+#
+# Installation: {{app_path}} {{completion_command}} >> ~/.zshrc
+#    or {{app_path}} {{completion_command}} >> ~/.zsh_profile on OSX.
+#
+_{{app_name}}_yargs_completions()
+{
+  local reply
+  local si=$IFS
+  IFS=$'\n' reply=($(COMP_CWORD="$((CURRENT-1))" COMP_LINE="$BUFFER" COMP_POINT="$CURSOR" {{app_path}} --get-yargs-completions "\${words[@]}"))
+  IFS=$si
+  _describe 'values' reply
+}
+compdef _{{app_name}}_yargs_completions {{app_name}}
+###-end-{{app_name}}-completions-###
+`;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/completion.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/completion.d.ts
new file mode 100644
index 0000000..176a91b
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/completion.d.ts
@@ -0,0 +1,21 @@
+import { CommandInstance } from './command';
+import { UsageInstance } from './usage';
+import { YargsInstance } from './yargs';
+import { Arguments, DetailedArguments } from 'yargs-parser';
+export declare function completion(yargs: YargsInstance, usage: UsageInstance, command: CommandInstance): CompletionInstance;
+/** Instance of the completion module. */
+export interface CompletionInstance {
+    completionKey: string;
+    generateCompletionScript($0: string, cmd: string): string;
+    getCompletion(args: string[], done: (completions: string[]) => any): any;
+    registerFunction(fn: CompletionFunction): void;
+    setParsed(parsed: DetailedArguments): void;
+}
+export declare type CompletionFunction = SyncCompletionFunction | AsyncCompletionFunction;
+interface SyncCompletionFunction {
+    (current: string, argv: Arguments): string[] | Promise<string[]>;
+}
+interface AsyncCompletionFunction {
+    (current: string, argv: Arguments, done: (completions: string[]) => any): any;
+}
+export {};
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/completion.js b/node_modules/jest-circus/node_modules/yargs/build/lib/completion.js
new file mode 100644
index 0000000..d65925a
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/completion.js
@@ -0,0 +1,135 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.completion = void 0;
+const command_1 = require("./command");
+const templates = require("./completion-templates");
+const is_promise_1 = require("./is-promise");
+const parse_command_1 = require("./parse-command");
+const path = require("path");
+const common_types_1 = require("./common-types");
+// add bash completions to your
+//  yargs-powered applications.
+function completion(yargs, usage, command) {
+    const self = {
+        completionKey: 'get-yargs-completions'
+    };
+    let aliases;
+    self.setParsed = function setParsed(parsed) {
+        aliases = parsed.aliases;
+    };
+    const zshShell = (process.env.SHELL && process.env.SHELL.indexOf('zsh') !== -1) ||
+        (process.env.ZSH_NAME && process.env.ZSH_NAME.indexOf('zsh') !== -1);
+    // get a list of completion commands.
+    // 'args' is the array of strings from the line to be completed
+    self.getCompletion = function getCompletion(args, done) {
+        const completions = [];
+        const current = args.length ? args[args.length - 1] : '';
+        const argv = yargs.parse(args, true);
+        const parentCommands = yargs.getContext().commands;
+        // a custom completion function can be provided
+        // to completion().
+        function runCompletionFunction(argv) {
+            common_types_1.assertNotStrictEqual(completionFunction, null);
+            if (isSyncCompletionFunction(completionFunction)) {
+                const result = completionFunction(current, argv);
+                // promise based completion function.
+                if (is_promise_1.isPromise(result)) {
+                    return result.then((list) => {
+                        process.nextTick(() => { done(list); });
+                    }).catch((err) => {
+                        process.nextTick(() => { throw err; });
+                    });
+                }
+                // synchronous completion function.
+                return done(result);
+            }
+            else {
+                // asynchronous completion function
+                return completionFunction(current, argv, (completions) => {
+                    done(completions);
+                });
+            }
+        }
+        if (completionFunction) {
+            return is_promise_1.isPromise(argv) ? argv.then(runCompletionFunction) : runCompletionFunction(argv);
+        }
+        const handlers = command.getCommandHandlers();
+        for (let i = 0, ii = args.length; i < ii; ++i) {
+            if (handlers[args[i]] && handlers[args[i]].builder) {
+                const builder = handlers[args[i]].builder;
+                if (command_1.isCommandBuilderCallback(builder)) {
+                    const y = yargs.reset();
+                    builder(y);
+                    return y.argv;
+                }
+            }
+        }
+        if (!current.match(/^-/) && parentCommands[parentCommands.length - 1] !== current) {
+            usage.getCommands().forEach((usageCommand) => {
+                const commandName = parse_command_1.parseCommand(usageCommand[0]).cmd;
+                if (args.indexOf(commandName) === -1) {
+                    if (!zshShell) {
+                        completions.push(commandName);
+                    }
+                    else {
+                        const desc = usageCommand[1] || '';
+                        completions.push(commandName.replace(/:/g, '\\:') + ':' + desc);
+                    }
+                }
+            });
+        }
+        if (current.match(/^-/) || (current === '' && completions.length === 0)) {
+            const descs = usage.getDescriptions();
+            const options = yargs.getOptions();
+            Object.keys(options.key).forEach((key) => {
+                const negable = !!options.configuration['boolean-negation'] && options.boolean.includes(key);
+                // If the key and its aliases aren't in 'args', add the key to 'completions'
+                let keyAndAliases = [key].concat(aliases[key] || []);
+                if (negable)
+                    keyAndAliases = keyAndAliases.concat(keyAndAliases.map(key => `no-${key}`));
+                function completeOptionKey(key) {
+                    const notInArgs = keyAndAliases.every(val => args.indexOf(`--${val}`) === -1);
+                    if (notInArgs) {
+                        const startsByTwoDashes = (s) => /^--/.test(s);
+                        const isShortOption = (s) => /^[^0-9]$/.test(s);
+                        const dashes = !startsByTwoDashes(current) && isShortOption(key) ? '-' : '--';
+                        if (!zshShell) {
+                            completions.push(dashes + key);
+                        }
+                        else {
+                            const desc = descs[key] || '';
+                            completions.push(dashes + `${key.replace(/:/g, '\\:')}:${desc.replace('__yargsString__:', '')}`);
+                        }
+                    }
+                }
+                completeOptionKey(key);
+                if (negable && !!options.default[key])
+                    completeOptionKey(`no-${key}`);
+            });
+        }
+        done(completions);
+    };
+    // generate the completion script to add to your .bashrc.
+    self.generateCompletionScript = function generateCompletionScript($0, cmd) {
+        let script = zshShell ? templates.completionZshTemplate : templates.completionShTemplate;
+        const name = path.basename($0);
+        // add ./to applications not yet installed as bin.
+        if ($0.match(/\.js$/))
+            $0 = `./${$0}`;
+        script = script.replace(/{{app_name}}/g, name);
+        script = script.replace(/{{completion_command}}/g, cmd);
+        return script.replace(/{{app_path}}/g, $0);
+    };
+    // register a function to perform your own custom
+    // completions., this function can be either
+    // synchrnous or asynchronous.
+    let completionFunction = null;
+    self.registerFunction = (fn) => {
+        completionFunction = fn;
+    };
+    return self;
+}
+exports.completion = completion;
+function isSyncCompletionFunction(completionFunction) {
+    return completionFunction.length < 3;
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/is-promise.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/is-promise.d.ts
new file mode 100644
index 0000000..19b5566
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/is-promise.d.ts
@@ -0,0 +1 @@
+export declare function isPromise<T>(maybePromise: T | Promise<T>): maybePromise is Promise<T>;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/is-promise.js b/node_modules/jest-circus/node_modules/yargs/build/lib/is-promise.js
new file mode 100644
index 0000000..c24f9a8
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/is-promise.js
@@ -0,0 +1,9 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isPromise = void 0;
+function isPromise(maybePromise) {
+    return !!maybePromise &&
+        !!maybePromise.then &&
+        (typeof maybePromise.then === 'function');
+}
+exports.isPromise = isPromise;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/levenshtein.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/levenshtein.d.ts
new file mode 100644
index 0000000..08b6b7f
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/levenshtein.d.ts
@@ -0,0 +1 @@
+export declare function levenshtein(a: string, b: string): number;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/levenshtein.js b/node_modules/jest-circus/node_modules/yargs/build/lib/levenshtein.js
new file mode 100644
index 0000000..84c0831
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/levenshtein.js
@@ -0,0 +1,58 @@
+"use strict";
+/*
+Copyright (c) 2011 Andrei Mackenzie
+
+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.
+*/
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.levenshtein = void 0;
+// levenshtein distance algorithm, pulled from Andrei Mackenzie's MIT licensed.
+// gist, which can be found here: https://gist.github.com/andrei-m/982927
+// Compute the edit distance between the two given strings
+function levenshtein(a, b) {
+    if (a.length === 0)
+        return b.length;
+    if (b.length === 0)
+        return a.length;
+    const matrix = [];
+    // increment along the first column of each row
+    let i;
+    for (i = 0; i <= b.length; i++) {
+        matrix[i] = [i];
+    }
+    // increment each column in the first row
+    let j;
+    for (j = 0; j <= a.length; j++) {
+        matrix[0][j] = j;
+    }
+    // Fill in the rest of the matrix
+    for (i = 1; i <= b.length; i++) {
+        for (j = 1; j <= a.length; j++) {
+            if (b.charAt(i - 1) === a.charAt(j - 1)) {
+                matrix[i][j] = matrix[i - 1][j - 1];
+            }
+            else {
+                matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
+                Math.min(matrix[i][j - 1] + 1, // insertion
+                matrix[i - 1][j] + 1)); // deletion
+            }
+        }
+    }
+    return matrix[b.length][a.length];
+}
+exports.levenshtein = levenshtein;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/middleware.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/middleware.d.ts
new file mode 100644
index 0000000..8fa7c34
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/middleware.d.ts
@@ -0,0 +1,10 @@
+import { YargsInstance, Arguments } from './yargs';
+export declare function globalMiddlewareFactory<T>(globalMiddleware: Middleware[], context: T): (callback: MiddlewareCallback | MiddlewareCallback[], applyBeforeValidation?: boolean) => T;
+export declare function commandMiddlewareFactory(commandMiddleware?: MiddlewareCallback[]): Middleware[];
+export declare function applyMiddleware(argv: Arguments | Promise<Arguments>, yargs: YargsInstance, middlewares: Middleware[], beforeValidation: boolean): Arguments | Promise<Arguments>;
+export interface MiddlewareCallback {
+    (argv: Arguments, yargs: YargsInstance): Partial<Arguments> | Promise<Partial<Arguments>>;
+}
+export interface Middleware extends MiddlewareCallback {
+    applyBeforeValidation: boolean;
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/middleware.js b/node_modules/jest-circus/node_modules/yargs/build/lib/middleware.js
new file mode 100644
index 0000000..e93b6d2
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/middleware.js
@@ -0,0 +1,57 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.applyMiddleware = exports.commandMiddlewareFactory = exports.globalMiddlewareFactory = void 0;
+const argsert_1 = require("./argsert");
+const is_promise_1 = require("./is-promise");
+function globalMiddlewareFactory(globalMiddleware, context) {
+    return function (callback, applyBeforeValidation = false) {
+        argsert_1.argsert('<array|function> [boolean]', [callback, applyBeforeValidation], arguments.length);
+        if (Array.isArray(callback)) {
+            for (let i = 0; i < callback.length; i++) {
+                if (typeof callback[i] !== 'function') {
+                    throw Error('middleware must be a function');
+                }
+                callback[i].applyBeforeValidation = applyBeforeValidation;
+            }
+            Array.prototype.push.apply(globalMiddleware, callback);
+        }
+        else if (typeof callback === 'function') {
+            callback.applyBeforeValidation = applyBeforeValidation;
+            globalMiddleware.push(callback);
+        }
+        return context;
+    };
+}
+exports.globalMiddlewareFactory = globalMiddlewareFactory;
+function commandMiddlewareFactory(commandMiddleware) {
+    if (!commandMiddleware)
+        return [];
+    return commandMiddleware.map(middleware => {
+        middleware.applyBeforeValidation = false;
+        return middleware;
+    });
+}
+exports.commandMiddlewareFactory = commandMiddlewareFactory;
+function applyMiddleware(argv, yargs, middlewares, beforeValidation) {
+    const beforeValidationError = new Error('middleware cannot return a promise when applyBeforeValidation is true');
+    return middlewares
+        .reduce((acc, middleware) => {
+        if (middleware.applyBeforeValidation !== beforeValidation) {
+            return acc;
+        }
+        if (is_promise_1.isPromise(acc)) {
+            return acc
+                .then(initialObj => Promise.all([initialObj, middleware(initialObj, yargs)]))
+                .then(([initialObj, middlewareObj]) => Object.assign(initialObj, middlewareObj));
+        }
+        else {
+            const result = middleware(acc, yargs);
+            if (beforeValidation && is_promise_1.isPromise(result))
+                throw beforeValidationError;
+            return is_promise_1.isPromise(result)
+                ? result.then(middlewareObj => Object.assign(acc, middlewareObj))
+                : Object.assign(acc, result);
+        }
+    }, argv);
+}
+exports.applyMiddleware = applyMiddleware;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/obj-filter.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/obj-filter.d.ts
new file mode 100644
index 0000000..031ae28
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/obj-filter.d.ts
@@ -0,0 +1 @@
+export declare function objFilter<T extends object>(original?: T, filter?: (k: keyof T, v: T[keyof T]) => boolean): T;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/obj-filter.js b/node_modules/jest-circus/node_modules/yargs/build/lib/obj-filter.js
new file mode 100644
index 0000000..790f947
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/obj-filter.js
@@ -0,0 +1,14 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.objFilter = void 0;
+const common_types_1 = require("./common-types");
+function objFilter(original = {}, filter = () => true) {
+    const obj = {};
+    common_types_1.objectKeys(original).forEach((key) => {
+        if (filter(key, original[key])) {
+            obj[key] = original[key];
+        }
+    });
+    return obj;
+}
+exports.objFilter = objFilter;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/parse-command.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/parse-command.d.ts
new file mode 100644
index 0000000..fc57836
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/parse-command.d.ts
@@ -0,0 +1,11 @@
+import { NotEmptyArray } from './common-types';
+export declare function parseCommand(cmd: string): ParsedCommand;
+export interface ParsedCommand {
+    cmd: string;
+    demanded: Positional[];
+    optional: Positional[];
+}
+export interface Positional {
+    cmd: NotEmptyArray<string>;
+    variadic: boolean;
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/parse-command.js b/node_modules/jest-circus/node_modules/yargs/build/lib/parse-command.js
new file mode 100644
index 0000000..aaf2327
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/parse-command.js
@@ -0,0 +1,36 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.parseCommand = void 0;
+function parseCommand(cmd) {
+    const extraSpacesStrippedCommand = cmd.replace(/\s{2,}/g, ' ');
+    const splitCommand = extraSpacesStrippedCommand.split(/\s+(?![^[]*]|[^<]*>)/);
+    const bregex = /\.*[\][<>]/g;
+    const firstCommand = splitCommand.shift();
+    if (!firstCommand)
+        throw new Error(`No command found in: ${cmd}`);
+    const parsedCommand = {
+        cmd: firstCommand.replace(bregex, ''),
+        demanded: [],
+        optional: []
+    };
+    splitCommand.forEach((cmd, i) => {
+        let variadic = false;
+        cmd = cmd.replace(/\s/g, '');
+        if (/\.+[\]>]/.test(cmd) && i === splitCommand.length - 1)
+            variadic = true;
+        if (/^\[/.test(cmd)) {
+            parsedCommand.optional.push({
+                cmd: cmd.replace(bregex, '').split('|'),
+                variadic
+            });
+        }
+        else {
+            parsedCommand.demanded.push({
+                cmd: cmd.replace(bregex, '').split('|'),
+                variadic
+            });
+        }
+    });
+    return parsedCommand;
+}
+exports.parseCommand = parseCommand;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/process-argv.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/process-argv.d.ts
new file mode 100644
index 0000000..18fd43b
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/process-argv.d.ts
@@ -0,0 +1,2 @@
+export declare function getProcessArgvWithoutBin(): string[];
+export declare function getProcessArgvBin(): string;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/process-argv.js b/node_modules/jest-circus/node_modules/yargs/build/lib/process-argv.js
new file mode 100644
index 0000000..a9201dd
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/process-argv.js
@@ -0,0 +1,31 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getProcessArgvBin = exports.getProcessArgvWithoutBin = void 0;
+function getProcessArgvBinIndex() {
+    // The binary name is the first command line argument for:
+    // - bundled Electron apps: bin argv1 argv2 ... argvn
+    if (isBundledElectronApp())
+        return 0;
+    // or the second one (default) for:
+    // - standard node apps: node bin.js argv1 argv2 ... argvn
+    // - unbundled Electron apps: electron bin.js argv1 arg2 ... argvn
+    return 1;
+}
+function isBundledElectronApp() {
+    // process.defaultApp is either set by electron in an electron unbundled app, or undefined
+    // see https://github.com/electron/electron/blob/master/docs/api/process.md#processdefaultapp-readonly
+    return isElectronApp() && !process.defaultApp;
+}
+function isElectronApp() {
+    // process.versions.electron is either set by electron, or undefined
+    // see https://github.com/electron/electron/blob/master/docs/api/process.md#processversionselectron-readonly
+    return !!process.versions.electron;
+}
+function getProcessArgvWithoutBin() {
+    return process.argv.slice(getProcessArgvBinIndex() + 1);
+}
+exports.getProcessArgvWithoutBin = getProcessArgvWithoutBin;
+function getProcessArgvBin() {
+    return process.argv[getProcessArgvBinIndex()];
+}
+exports.getProcessArgvBin = getProcessArgvBin;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/usage.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/usage.d.ts
new file mode 100644
index 0000000..d9dd1fa
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/usage.d.ts
@@ -0,0 +1,49 @@
+import { Dictionary } from './common-types';
+import { YargsInstance } from './yargs';
+import { YError } from './yerror';
+import { Y18N } from 'y18n';
+export declare function usage(yargs: YargsInstance, y18n: Y18N): UsageInstance;
+/** Instance of the usage module. */
+export interface UsageInstance {
+    cacheHelpMessage(): void;
+    clearCachedHelpMessage(): void;
+    command(cmd: string, description: string | undefined, isDefault: boolean, aliases: string[], deprecated?: boolean): void;
+    deferY18nLookup(str: string): string;
+    describe(keys: string | string[] | Dictionary<string>, desc?: string): void;
+    epilog(msg: string): void;
+    example(cmd: string, description?: string): void;
+    fail(msg?: string | null, err?: YError | string): void;
+    failFn(f: FailureFunction): void;
+    freeze(): void;
+    functionDescription(fn: {
+        name?: string;
+    }): string;
+    getCommands(): [string, string, boolean, string[], boolean][];
+    getDescriptions(): Dictionary<string | undefined>;
+    getPositionalGroupName(): string;
+    getUsage(): [string, string][];
+    getUsageDisabled(): boolean;
+    help(): string;
+    reset(localLookup: Dictionary<boolean>): UsageInstance;
+    showHelp(level: 'error' | 'log' | ((message: string) => void)): void;
+    showHelpOnFail(enabled?: boolean | string, message?: string): UsageInstance;
+    showVersion(): void;
+    stringifiedValues(values?: any[], separator?: string): string;
+    unfreeze(): void;
+    usage(msg: string | null, description?: string | false): UsageInstance;
+    version(ver: any): void;
+    wrap(cols: number | null | undefined): void;
+}
+export interface FailureFunction {
+    (msg: string | undefined | null, err: YError | string | undefined, usage: UsageInstance): void;
+}
+export interface FrozenUsageInstance {
+    failMessage: string | undefined | null;
+    failureOutput: boolean;
+    usages: [string, string][];
+    usageDisabled: boolean;
+    epilogs: string[];
+    examples: [string, string][];
+    commands: [string, string, boolean, string[], boolean][];
+    descriptions: Dictionary<string | undefined>;
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/usage.js b/node_modules/jest-circus/node_modules/yargs/build/lib/usage.js
new file mode 100644
index 0000000..73f7b24
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/usage.js
@@ -0,0 +1,540 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.usage = void 0;
+// this file handles outputting usage instructions,
+// failures, etc. keeps logging in one place.
+const common_types_1 = require("./common-types");
+const obj_filter_1 = require("./obj-filter");
+const path = require("path");
+const yerror_1 = require("./yerror");
+const decamelize = require("decamelize");
+const setBlocking = require("set-blocking");
+const stringWidth = require("string-width");
+function usage(yargs, y18n) {
+    const __ = y18n.__;
+    const self = {};
+    // methods for ouputting/building failure message.
+    const fails = [];
+    self.failFn = function failFn(f) {
+        fails.push(f);
+    };
+    let failMessage = null;
+    let showHelpOnFail = true;
+    self.showHelpOnFail = function showHelpOnFailFn(arg1 = true, arg2) {
+        function parseFunctionArgs() {
+            return typeof arg1 === 'string' ? [true, arg1] : [arg1, arg2];
+        }
+        const [enabled, message] = parseFunctionArgs();
+        failMessage = message;
+        showHelpOnFail = enabled;
+        return self;
+    };
+    let failureOutput = false;
+    self.fail = function fail(msg, err) {
+        const logger = yargs._getLoggerInstance();
+        if (fails.length) {
+            for (let i = fails.length - 1; i >= 0; --i) {
+                fails[i](msg, err, self);
+            }
+        }
+        else {
+            if (yargs.getExitProcess())
+                setBlocking(true);
+            // don't output failure message more than once
+            if (!failureOutput) {
+                failureOutput = true;
+                if (showHelpOnFail) {
+                    yargs.showHelp('error');
+                    logger.error();
+                }
+                if (msg || err)
+                    logger.error(msg || err);
+                if (failMessage) {
+                    if (msg || err)
+                        logger.error('');
+                    logger.error(failMessage);
+                }
+            }
+            err = err || new yerror_1.YError(msg);
+            if (yargs.getExitProcess()) {
+                return yargs.exit(1);
+            }
+            else if (yargs._hasParseCallback()) {
+                return yargs.exit(1, err);
+            }
+            else {
+                throw err;
+            }
+        }
+    };
+    // methods for ouputting/building help (usage) message.
+    let usages = [];
+    let usageDisabled = false;
+    self.usage = (msg, description) => {
+        if (msg === null) {
+            usageDisabled = true;
+            usages = [];
+            return self;
+        }
+        usageDisabled = false;
+        usages.push([msg, description || '']);
+        return self;
+    };
+    self.getUsage = () => {
+        return usages;
+    };
+    self.getUsageDisabled = () => {
+        return usageDisabled;
+    };
+    self.getPositionalGroupName = () => {
+        return __('Positionals:');
+    };
+    let examples = [];
+    self.example = (cmd, description) => {
+        examples.push([cmd, description || '']);
+    };
+    let commands = [];
+    self.command = function command(cmd, description, isDefault, aliases, deprecated = false) {
+        // the last default wins, so cancel out any previously set default
+        if (isDefault) {
+            commands = commands.map((cmdArray) => {
+                cmdArray[2] = false;
+                return cmdArray;
+            });
+        }
+        commands.push([cmd, description || '', isDefault, aliases, deprecated]);
+    };
+    self.getCommands = () => commands;
+    let descriptions = {};
+    self.describe = function describe(keyOrKeys, desc) {
+        if (Array.isArray(keyOrKeys)) {
+            keyOrKeys.forEach((k) => {
+                self.describe(k, desc);
+            });
+        }
+        else if (typeof keyOrKeys === 'object') {
+            Object.keys(keyOrKeys).forEach((k) => {
+                self.describe(k, keyOrKeys[k]);
+            });
+        }
+        else {
+            descriptions[keyOrKeys] = desc;
+        }
+    };
+    self.getDescriptions = () => descriptions;
+    let epilogs = [];
+    self.epilog = (msg) => {
+        epilogs.push(msg);
+    };
+    let wrapSet = false;
+    let wrap;
+    self.wrap = (cols) => {
+        wrapSet = true;
+        wrap = cols;
+    };
+    function getWrap() {
+        if (!wrapSet) {
+            wrap = windowWidth();
+            wrapSet = true;
+        }
+        return wrap;
+    }
+    const deferY18nLookupPrefix = '__yargsString__:';
+    self.deferY18nLookup = str => deferY18nLookupPrefix + str;
+    self.help = function help() {
+        if (cachedHelpMessage)
+            return cachedHelpMessage;
+        normalizeAliases();
+        // handle old demanded API
+        const base$0 = yargs.customScriptName ? yargs.$0 : path.basename(yargs.$0);
+        const demandedOptions = yargs.getDemandedOptions();
+        const demandedCommands = yargs.getDemandedCommands();
+        const deprecatedOptions = yargs.getDeprecatedOptions();
+        const groups = yargs.getGroups();
+        const options = yargs.getOptions();
+        let keys = [];
+        keys = keys.concat(Object.keys(descriptions));
+        keys = keys.concat(Object.keys(demandedOptions));
+        keys = keys.concat(Object.keys(demandedCommands));
+        keys = keys.concat(Object.keys(options.default));
+        keys = keys.filter(filterHiddenOptions);
+        keys = Object.keys(keys.reduce((acc, key) => {
+            if (key !== '_')
+                acc[key] = true;
+            return acc;
+        }, {}));
+        const theWrap = getWrap();
+        const ui = require('cliui')({
+            width: theWrap,
+            wrap: !!theWrap
+        });
+        // the usage string.
+        if (!usageDisabled) {
+            if (usages.length) {
+                // user-defined usage.
+                usages.forEach((usage) => {
+                    ui.div(`${usage[0].replace(/\$0/g, base$0)}`);
+                    if (usage[1]) {
+                        ui.div({ text: `${usage[1]}`, padding: [1, 0, 0, 0] });
+                    }
+                });
+                ui.div();
+            }
+            else if (commands.length) {
+                let u = null;
+                // demonstrate how commands are used.
+                if (demandedCommands._) {
+                    u = `${base$0} <${__('command')}>\n`;
+                }
+                else {
+                    u = `${base$0} [${__('command')}]\n`;
+                }
+                ui.div(`${u}`);
+            }
+        }
+        // your application's commands, i.e., non-option
+        // arguments populated in '_'.
+        if (commands.length) {
+            ui.div(__('Commands:'));
+            const context = yargs.getContext();
+            const parentCommands = context.commands.length ? `${context.commands.join(' ')} ` : '';
+            if (yargs.getParserConfiguration()['sort-commands'] === true) {
+                commands = commands.sort((a, b) => a[0].localeCompare(b[0]));
+            }
+            commands.forEach((command) => {
+                const commandString = `${base$0} ${parentCommands}${command[0].replace(/^\$0 ?/, '')}`; // drop $0 from default commands.
+                ui.span({
+                    text: commandString,
+                    padding: [0, 2, 0, 2],
+                    width: maxWidth(commands, theWrap, `${base$0}${parentCommands}`) + 4
+                }, { text: command[1] });
+                const hints = [];
+                if (command[2])
+                    hints.push(`[${__('default')}]`);
+                if (command[3] && command[3].length) {
+                    hints.push(`[${__('aliases:')} ${command[3].join(', ')}]`);
+                }
+                if (command[4]) {
+                    if (typeof command[4] === 'string') {
+                        hints.push(`[${__('deprecated: %s', command[4])}]`);
+                    }
+                    else {
+                        hints.push(`[${__('deprecated')}]`);
+                    }
+                }
+                if (hints.length) {
+                    ui.div({ text: hints.join(' '), padding: [0, 0, 0, 2], align: 'right' });
+                }
+                else {
+                    ui.div();
+                }
+            });
+            ui.div();
+        }
+        // perform some cleanup on the keys array, making it
+        // only include top-level keys not their aliases.
+        const aliasKeys = (Object.keys(options.alias) || [])
+            .concat(Object.keys(yargs.parsed.newAliases) || []);
+        keys = keys.filter(key => !yargs.parsed.newAliases[key] && aliasKeys.every(alias => (options.alias[alias] || []).indexOf(key) === -1));
+        // populate 'Options:' group with any keys that have not
+        // explicitly had a group set.
+        const defaultGroup = __('Options:');
+        if (!groups[defaultGroup])
+            groups[defaultGroup] = [];
+        addUngroupedKeys(keys, options.alias, groups, defaultGroup);
+        // display 'Options:' table along with any custom tables:
+        Object.keys(groups).forEach((groupName) => {
+            if (!groups[groupName].length)
+                return;
+            // if we've grouped the key 'f', but 'f' aliases 'foobar',
+            // normalizedKeys should contain only 'foobar'.
+            const normalizedKeys = groups[groupName].filter(filterHiddenOptions).map((key) => {
+                if (~aliasKeys.indexOf(key))
+                    return key;
+                for (let i = 0, aliasKey; (aliasKey = aliasKeys[i]) !== undefined; i++) {
+                    if (~(options.alias[aliasKey] || []).indexOf(key))
+                        return aliasKey;
+                }
+                return key;
+            });
+            if (normalizedKeys.length < 1)
+                return;
+            ui.div(groupName);
+            // actually generate the switches string --foo, -f, --bar.
+            const switches = normalizedKeys.reduce((acc, key) => {
+                acc[key] = [key].concat(options.alias[key] || [])
+                    .map(sw => {
+                    // for the special positional group don't
+                    // add '--' or '-' prefix.
+                    if (groupName === self.getPositionalGroupName())
+                        return sw;
+                    else {
+                        return (
+                        // matches yargs-parser logic in which single-digits
+                        // aliases declared with a boolean type are now valid
+                        /^[0-9]$/.test(sw)
+                            ? ~options.boolean.indexOf(key) ? '-' : '--'
+                            : sw.length > 1 ? '--' : '-') + sw;
+                    }
+                })
+                    .join(', ');
+                return acc;
+            }, {});
+            normalizedKeys.forEach((key) => {
+                const kswitch = switches[key];
+                let desc = descriptions[key] || '';
+                let type = null;
+                if (~desc.lastIndexOf(deferY18nLookupPrefix))
+                    desc = __(desc.substring(deferY18nLookupPrefix.length));
+                if (~options.boolean.indexOf(key))
+                    type = `[${__('boolean')}]`;
+                if (~options.count.indexOf(key))
+                    type = `[${__('count')}]`;
+                if (~options.string.indexOf(key))
+                    type = `[${__('string')}]`;
+                if (~options.normalize.indexOf(key))
+                    type = `[${__('string')}]`;
+                if (~options.array.indexOf(key))
+                    type = `[${__('array')}]`;
+                if (~options.number.indexOf(key))
+                    type = `[${__('number')}]`;
+                const deprecatedExtra = (deprecated) => typeof deprecated === 'string'
+                    ? `[${__('deprecated: %s', deprecated)}]`
+                    : `[${__('deprecated')}]`;
+                const extra = [
+                    (key in deprecatedOptions) ? deprecatedExtra(deprecatedOptions[key]) : null,
+                    type,
+                    (key in demandedOptions) ? `[${__('required')}]` : null,
+                    options.choices && options.choices[key] ? `[${__('choices:')} ${self.stringifiedValues(options.choices[key])}]` : null,
+                    defaultString(options.default[key], options.defaultDescription[key])
+                ].filter(Boolean).join(' ');
+                ui.span({ text: kswitch, padding: [0, 2, 0, 2], width: maxWidth(switches, theWrap) + 4 }, desc);
+                if (extra)
+                    ui.div({ text: extra, padding: [0, 0, 0, 2], align: 'right' });
+                else
+                    ui.div();
+            });
+            ui.div();
+        });
+        // describe some common use-cases for your application.
+        if (examples.length) {
+            ui.div(__('Examples:'));
+            examples.forEach((example) => {
+                example[0] = example[0].replace(/\$0/g, base$0);
+            });
+            examples.forEach((example) => {
+                if (example[1] === '') {
+                    ui.div({
+                        text: example[0],
+                        padding: [0, 2, 0, 2]
+                    });
+                }
+                else {
+                    ui.div({
+                        text: example[0],
+                        padding: [0, 2, 0, 2],
+                        width: maxWidth(examples, theWrap) + 4
+                    }, {
+                        text: example[1]
+                    });
+                }
+            });
+            ui.div();
+        }
+        // the usage string.
+        if (epilogs.length > 0) {
+            const e = epilogs.map(epilog => epilog.replace(/\$0/g, base$0)).join('\n');
+            ui.div(`${e}\n`);
+        }
+        // Remove the trailing white spaces
+        return ui.toString().replace(/\s*$/, '');
+    };
+    // return the maximum width of a string
+    // in the left-hand column of a table.
+    function maxWidth(table, theWrap, modifier) {
+        let width = 0;
+        // table might be of the form [leftColumn],
+        // or {key: leftColumn}
+        if (!Array.isArray(table)) {
+            table = Object.values(table).map(v => [v]);
+        }
+        table.forEach((v) => {
+            width = Math.max(stringWidth(modifier ? `${modifier} ${v[0]}` : v[0]), width);
+        });
+        // if we've enabled 'wrap' we should limit
+        // the max-width of the left-column.
+        if (theWrap)
+            width = Math.min(width, parseInt((theWrap * 0.5).toString(), 10));
+        return width;
+    }
+    // make sure any options set for aliases,
+    // are copied to the keys being aliased.
+    function normalizeAliases() {
+        // handle old demanded API
+        const demandedOptions = yargs.getDemandedOptions();
+        const options = yargs.getOptions();
+        (Object.keys(options.alias) || []).forEach((key) => {
+            options.alias[key].forEach((alias) => {
+                // copy descriptions.
+                if (descriptions[alias])
+                    self.describe(key, descriptions[alias]);
+                // copy demanded.
+                if (alias in demandedOptions)
+                    yargs.demandOption(key, demandedOptions[alias]);
+                // type messages.
+                if (~options.boolean.indexOf(alias))
+                    yargs.boolean(key);
+                if (~options.count.indexOf(alias))
+                    yargs.count(key);
+                if (~options.string.indexOf(alias))
+                    yargs.string(key);
+                if (~options.normalize.indexOf(alias))
+                    yargs.normalize(key);
+                if (~options.array.indexOf(alias))
+                    yargs.array(key);
+                if (~options.number.indexOf(alias))
+                    yargs.number(key);
+            });
+        });
+    }
+    // if yargs is executing an async handler, we take a snapshot of the
+    // help message to display on failure:
+    let cachedHelpMessage;
+    self.cacheHelpMessage = function () {
+        cachedHelpMessage = this.help();
+    };
+    // however this snapshot must be cleared afterwards
+    // not to be be used by next calls to parse
+    self.clearCachedHelpMessage = function () {
+        cachedHelpMessage = undefined;
+    };
+    // given a set of keys, place any keys that are
+    // ungrouped under the 'Options:' grouping.
+    function addUngroupedKeys(keys, aliases, groups, defaultGroup) {
+        let groupedKeys = [];
+        let toCheck = null;
+        Object.keys(groups).forEach((group) => {
+            groupedKeys = groupedKeys.concat(groups[group]);
+        });
+        keys.forEach((key) => {
+            toCheck = [key].concat(aliases[key]);
+            if (!toCheck.some(k => groupedKeys.indexOf(k) !== -1)) {
+                groups[defaultGroup].push(key);
+            }
+        });
+        return groupedKeys;
+    }
+    function filterHiddenOptions(key) {
+        return yargs.getOptions().hiddenOptions.indexOf(key) < 0 || yargs.parsed.argv[yargs.getOptions().showHiddenOpt];
+    }
+    self.showHelp = (level) => {
+        const logger = yargs._getLoggerInstance();
+        if (!level)
+            level = 'error';
+        const emit = typeof level === 'function' ? level : logger[level];
+        emit(self.help());
+    };
+    self.functionDescription = (fn) => {
+        const description = fn.name ? decamelize(fn.name, '-') : __('generated-value');
+        return ['(', description, ')'].join('');
+    };
+    self.stringifiedValues = function stringifiedValues(values, separator) {
+        let string = '';
+        const sep = separator || ', ';
+        const array = [].concat(values);
+        if (!values || !array.length)
+            return string;
+        array.forEach((value) => {
+            if (string.length)
+                string += sep;
+            string += JSON.stringify(value);
+        });
+        return string;
+    };
+    // format the default-value-string displayed in
+    // the right-hand column.
+    function defaultString(value, defaultDescription) {
+        let string = `[${__('default:')} `;
+        if (value === undefined && !defaultDescription)
+            return null;
+        if (defaultDescription) {
+            string += defaultDescription;
+        }
+        else {
+            switch (typeof value) {
+                case 'string':
+                    string += `"${value}"`;
+                    break;
+                case 'object':
+                    string += JSON.stringify(value);
+                    break;
+                default:
+                    string += value;
+            }
+        }
+        return `${string}]`;
+    }
+    // guess the width of the console window, max-width 80.
+    function windowWidth() {
+        const maxWidth = 80;
+        // CI is not a TTY
+        /* c8 ignore next 2 */
+        if (typeof process === 'object' && process.stdout && process.stdout.columns) {
+            return Math.min(maxWidth, process.stdout.columns);
+        }
+        else {
+            return maxWidth;
+        }
+    }
+    // logic for displaying application version.
+    let version = null;
+    self.version = (ver) => {
+        version = ver;
+    };
+    self.showVersion = () => {
+        const logger = yargs._getLoggerInstance();
+        logger.log(version);
+    };
+    self.reset = function reset(localLookup) {
+        // do not reset wrap here
+        // do not reset fails here
+        failMessage = null;
+        failureOutput = false;
+        usages = [];
+        usageDisabled = false;
+        epilogs = [];
+        examples = [];
+        commands = [];
+        descriptions = obj_filter_1.objFilter(descriptions, k => !localLookup[k]);
+        return self;
+    };
+    const frozens = [];
+    self.freeze = function freeze() {
+        frozens.push({
+            failMessage,
+            failureOutput,
+            usages,
+            usageDisabled,
+            epilogs,
+            examples,
+            commands,
+            descriptions
+        });
+    };
+    self.unfreeze = function unfreeze() {
+        const frozen = frozens.pop();
+        common_types_1.assertNotStrictEqual(frozen, undefined);
+        ({
+            failMessage,
+            failureOutput,
+            usages,
+            usageDisabled,
+            epilogs,
+            examples,
+            commands,
+            descriptions
+        } = frozen);
+    };
+    return self;
+}
+exports.usage = usage;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/validation.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/validation.d.ts
new file mode 100644
index 0000000..e2d7854
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/validation.d.ts
@@ -0,0 +1,34 @@
+import { Dictionary } from './common-types';
+import { UsageInstance } from './usage';
+import { YargsInstance, Arguments } from './yargs';
+import { DetailedArguments } from 'yargs-parser';
+import { Y18N } from 'y18n';
+export declare function validation(yargs: YargsInstance, usage: UsageInstance, y18n: Y18N): ValidationInstance;
+/** Instance of the validation module. */
+export interface ValidationInstance {
+    check(f: CustomCheck['func'], global: boolean): void;
+    conflicting(argv: Arguments): void;
+    conflicts(key: string | Dictionary<string | string[]>, value?: string | string[]): void;
+    customChecks(argv: Arguments, aliases: DetailedArguments['aliases']): void;
+    freeze(): void;
+    getConflicting(): Dictionary<(string | undefined)[]>;
+    getImplied(): Dictionary<KeyOrPos[]>;
+    implications(argv: Arguments): void;
+    implies(key: string | Dictionary<KeyOrPos | KeyOrPos[]>, value?: KeyOrPos | KeyOrPos[]): void;
+    isValidAndSomeAliasIsNotNew(key: string, aliases: DetailedArguments['aliases']): boolean;
+    limitedChoices(argv: Arguments): void;
+    nonOptionCount(argv: Arguments): void;
+    positionalCount(required: number, observed: number): void;
+    recommendCommands(cmd: string, potentialCommands: string[]): void;
+    requiredArguments(argv: Arguments): void;
+    reset(localLookup: Dictionary): ValidationInstance;
+    unfreeze(): void;
+    unknownArguments(argv: Arguments, aliases: DetailedArguments['aliases'], positionalMap: Dictionary, isDefaultCommand: boolean): void;
+    unknownCommands(argv: Arguments): boolean;
+}
+interface CustomCheck {
+    func: (argv: Arguments, aliases: DetailedArguments['aliases']) => any;
+    global: boolean;
+}
+export declare type KeyOrPos = string | number;
+export {};
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/validation.js b/node_modules/jest-circus/node_modules/yargs/build/lib/validation.js
new file mode 100644
index 0000000..60c5e43
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/validation.js
@@ -0,0 +1,330 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.validation = void 0;
+const argsert_1 = require("./argsert");
+const common_types_1 = require("./common-types");
+const levenshtein_1 = require("./levenshtein");
+const obj_filter_1 = require("./obj-filter");
+const specialKeys = ['$0', '--', '_'];
+// validation-type-stuff, missing params,
+// bad implications, custom checks.
+function validation(yargs, usage, y18n) {
+    const __ = y18n.__;
+    const __n = y18n.__n;
+    const self = {};
+    // validate appropriate # of non-option
+    // arguments were provided, i.e., '_'.
+    self.nonOptionCount = function nonOptionCount(argv) {
+        const demandedCommands = yargs.getDemandedCommands();
+        // don't count currently executing commands
+        const _s = argv._.length - yargs.getContext().commands.length;
+        if (demandedCommands._ && (_s < demandedCommands._.min || _s > demandedCommands._.max)) {
+            if (_s < demandedCommands._.min) {
+                if (demandedCommands._.minMsg !== undefined) {
+                    usage.fail(
+                    // replace $0 with observed, $1 with expected.
+                    demandedCommands._.minMsg
+                        ? demandedCommands._.minMsg.replace(/\$0/g, _s.toString()).replace(/\$1/, demandedCommands._.min.toString())
+                        : null);
+                }
+                else {
+                    usage.fail(__n('Not enough non-option arguments: got %s, need at least %s', 'Not enough non-option arguments: got %s, need at least %s', _s, _s, demandedCommands._.min));
+                }
+            }
+            else if (_s > demandedCommands._.max) {
+                if (demandedCommands._.maxMsg !== undefined) {
+                    usage.fail(
+                    // replace $0 with observed, $1 with expected.
+                    demandedCommands._.maxMsg
+                        ? demandedCommands._.maxMsg.replace(/\$0/g, _s.toString()).replace(/\$1/, demandedCommands._.max.toString())
+                        : null);
+                }
+                else {
+                    usage.fail(__n('Too many non-option arguments: got %s, maximum of %s', 'Too many non-option arguments: got %s, maximum of %s', _s, _s, demandedCommands._.max));
+                }
+            }
+        }
+    };
+    // validate the appropriate # of <required>
+    // positional arguments were provided:
+    self.positionalCount = function positionalCount(required, observed) {
+        if (observed < required) {
+            usage.fail(__n('Not enough non-option arguments: got %s, need at least %s', 'Not enough non-option arguments: got %s, need at least %s', observed, observed, required));
+        }
+    };
+    // make sure all the required arguments are present.
+    self.requiredArguments = function requiredArguments(argv) {
+        const demandedOptions = yargs.getDemandedOptions();
+        let missing = null;
+        for (const key of Object.keys(demandedOptions)) {
+            if (!Object.prototype.hasOwnProperty.call(argv, key) || typeof argv[key] === 'undefined') {
+                missing = missing || {};
+                missing[key] = demandedOptions[key];
+            }
+        }
+        if (missing) {
+            const customMsgs = [];
+            for (const key of Object.keys(missing)) {
+                const msg = missing[key];
+                if (msg && customMsgs.indexOf(msg) < 0) {
+                    customMsgs.push(msg);
+                }
+            }
+            const customMsg = customMsgs.length ? `\n${customMsgs.join('\n')}` : '';
+            usage.fail(__n('Missing required argument: %s', 'Missing required arguments: %s', Object.keys(missing).length, Object.keys(missing).join(', ') + customMsg));
+        }
+    };
+    // check for unknown arguments (strict-mode).
+    self.unknownArguments = function unknownArguments(argv, aliases, positionalMap, isDefaultCommand) {
+        const commandKeys = yargs.getCommandInstance().getCommands();
+        const unknown = [];
+        const currentContext = yargs.getContext();
+        Object.keys(argv).forEach((key) => {
+            if (specialKeys.indexOf(key) === -1 &&
+                !Object.prototype.hasOwnProperty.call(positionalMap, key) &&
+                !Object.prototype.hasOwnProperty.call(yargs._getParseContext(), key) &&
+                !self.isValidAndSomeAliasIsNotNew(key, aliases)) {
+                unknown.push(key);
+            }
+        });
+        if ((currentContext.commands.length > 0) || (commandKeys.length > 0) || isDefaultCommand) {
+            argv._.slice(currentContext.commands.length).forEach((key) => {
+                if (commandKeys.indexOf(key) === -1) {
+                    unknown.push(key);
+                }
+            });
+        }
+        if (unknown.length > 0) {
+            usage.fail(__n('Unknown argument: %s', 'Unknown arguments: %s', unknown.length, unknown.join(', ')));
+        }
+    };
+    self.unknownCommands = function unknownCommands(argv) {
+        const commandKeys = yargs.getCommandInstance().getCommands();
+        const unknown = [];
+        const currentContext = yargs.getContext();
+        if ((currentContext.commands.length > 0) || (commandKeys.length > 0)) {
+            argv._.slice(currentContext.commands.length).forEach((key) => {
+                if (commandKeys.indexOf(key) === -1) {
+                    unknown.push(key);
+                }
+            });
+        }
+        if (unknown.length > 0) {
+            usage.fail(__n('Unknown command: %s', 'Unknown commands: %s', unknown.length, unknown.join(', ')));
+            return true;
+        }
+        else {
+            return false;
+        }
+    };
+    // check for a key that is not an alias, or for which every alias is new,
+    // implying that it was invented by the parser, e.g., during camelization
+    self.isValidAndSomeAliasIsNotNew = function isValidAndSomeAliasIsNotNew(key, aliases) {
+        if (!Object.prototype.hasOwnProperty.call(aliases, key)) {
+            return false;
+        }
+        const newAliases = yargs.parsed.newAliases;
+        for (const a of [key, ...aliases[key]]) {
+            if (!Object.prototype.hasOwnProperty.call(newAliases, a) || !newAliases[key]) {
+                return true;
+            }
+        }
+        return false;
+    };
+    // validate arguments limited to enumerated choices
+    self.limitedChoices = function limitedChoices(argv) {
+        const options = yargs.getOptions();
+        const invalid = {};
+        if (!Object.keys(options.choices).length)
+            return;
+        Object.keys(argv).forEach((key) => {
+            if (specialKeys.indexOf(key) === -1 &&
+                Object.prototype.hasOwnProperty.call(options.choices, key)) {
+                [].concat(argv[key]).forEach((value) => {
+                    // TODO case-insensitive configurability
+                    if (options.choices[key].indexOf(value) === -1 &&
+                        value !== undefined) {
+                        invalid[key] = (invalid[key] || []).concat(value);
+                    }
+                });
+            }
+        });
+        const invalidKeys = Object.keys(invalid);
+        if (!invalidKeys.length)
+            return;
+        let msg = __('Invalid values:');
+        invalidKeys.forEach((key) => {
+            msg += `\n  ${__('Argument: %s, Given: %s, Choices: %s', key, usage.stringifiedValues(invalid[key]), usage.stringifiedValues(options.choices[key]))}`;
+        });
+        usage.fail(msg);
+    };
+    // custom checks, added using the `check` option on yargs.
+    let checks = [];
+    self.check = function check(f, global) {
+        checks.push({
+            func: f,
+            global
+        });
+    };
+    self.customChecks = function customChecks(argv, aliases) {
+        for (let i = 0, f; (f = checks[i]) !== undefined; i++) {
+            const func = f.func;
+            let result = null;
+            try {
+                result = func(argv, aliases);
+            }
+            catch (err) {
+                usage.fail(err.message ? err.message : err, err);
+                continue;
+            }
+            if (!result) {
+                usage.fail(__('Argument check failed: %s', func.toString()));
+            }
+            else if (typeof result === 'string' || result instanceof Error) {
+                usage.fail(result.toString(), result);
+            }
+        }
+    };
+    // check implications, argument foo implies => argument bar.
+    let implied = {};
+    self.implies = function implies(key, value) {
+        argsert_1.argsert('<string|object> [array|number|string]', [key, value], arguments.length);
+        if (typeof key === 'object') {
+            Object.keys(key).forEach((k) => {
+                self.implies(k, key[k]);
+            });
+        }
+        else {
+            yargs.global(key);
+            if (!implied[key]) {
+                implied[key] = [];
+            }
+            if (Array.isArray(value)) {
+                value.forEach((i) => self.implies(key, i));
+            }
+            else {
+                common_types_1.assertNotStrictEqual(value, undefined);
+                implied[key].push(value);
+            }
+        }
+    };
+    self.getImplied = function getImplied() {
+        return implied;
+    };
+    function keyExists(argv, val) {
+        // convert string '1' to number 1
+        const num = Number(val);
+        val = isNaN(num) ? val : num;
+        if (typeof val === 'number') {
+            // check length of argv._
+            val = argv._.length >= val;
+        }
+        else if (val.match(/^--no-.+/)) {
+            // check if key/value doesn't exist
+            val = val.match(/^--no-(.+)/)[1];
+            val = !argv[val];
+        }
+        else {
+            // check if key/value exists
+            val = argv[val];
+        }
+        return val;
+    }
+    self.implications = function implications(argv) {
+        const implyFail = [];
+        Object.keys(implied).forEach((key) => {
+            const origKey = key;
+            (implied[key] || []).forEach((value) => {
+                let key = origKey;
+                const origValue = value;
+                key = keyExists(argv, key);
+                value = keyExists(argv, value);
+                if (key && !value) {
+                    implyFail.push(` ${origKey} -> ${origValue}`);
+                }
+            });
+        });
+        if (implyFail.length) {
+            let msg = `${__('Implications failed:')}\n`;
+            implyFail.forEach((value) => {
+                msg += (value);
+            });
+            usage.fail(msg);
+        }
+    };
+    let conflicting = {};
+    self.conflicts = function conflicts(key, value) {
+        argsert_1.argsert('<string|object> [array|string]', [key, value], arguments.length);
+        if (typeof key === 'object') {
+            Object.keys(key).forEach((k) => {
+                self.conflicts(k, key[k]);
+            });
+        }
+        else {
+            yargs.global(key);
+            if (!conflicting[key]) {
+                conflicting[key] = [];
+            }
+            if (Array.isArray(value)) {
+                value.forEach((i) => self.conflicts(key, i));
+            }
+            else {
+                conflicting[key].push(value);
+            }
+        }
+    };
+    self.getConflicting = () => conflicting;
+    self.conflicting = function conflictingFn(argv) {
+        Object.keys(argv).forEach((key) => {
+            if (conflicting[key]) {
+                conflicting[key].forEach((value) => {
+                    // we default keys to 'undefined' that have been configured, we should not
+                    // apply conflicting check unless they are a value other than 'undefined'.
+                    if (value && argv[key] !== undefined && argv[value] !== undefined) {
+                        usage.fail(__('Arguments %s and %s are mutually exclusive', key, value));
+                    }
+                });
+            }
+        });
+    };
+    self.recommendCommands = function recommendCommands(cmd, potentialCommands) {
+        const threshold = 3; // if it takes more than three edits, let's move on.
+        potentialCommands = potentialCommands.sort((a, b) => b.length - a.length);
+        let recommended = null;
+        let bestDistance = Infinity;
+        for (let i = 0, candidate; (candidate = potentialCommands[i]) !== undefined; i++) {
+            const d = levenshtein_1.levenshtein(cmd, candidate);
+            if (d <= threshold && d < bestDistance) {
+                bestDistance = d;
+                recommended = candidate;
+            }
+        }
+        if (recommended)
+            usage.fail(__('Did you mean %s?', recommended));
+    };
+    self.reset = function reset(localLookup) {
+        implied = obj_filter_1.objFilter(implied, k => !localLookup[k]);
+        conflicting = obj_filter_1.objFilter(conflicting, k => !localLookup[k]);
+        checks = checks.filter(c => c.global);
+        return self;
+    };
+    const frozens = [];
+    self.freeze = function freeze() {
+        frozens.push({
+            implied,
+            checks,
+            conflicting
+        });
+    };
+    self.unfreeze = function unfreeze() {
+        const frozen = frozens.pop();
+        common_types_1.assertNotStrictEqual(frozen, undefined);
+        ({
+            implied,
+            checks,
+            conflicting
+        } = frozen);
+    };
+    return self;
+}
+exports.validation = validation;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/yargs.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/yargs.d.ts
new file mode 100644
index 0000000..8e6e27c
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/yargs.d.ts
@@ -0,0 +1,274 @@
+/// <reference types="node" />
+import { CommandInstance, CommandHandler, CommandBuilderDefinition, CommandBuilder, CommandHandlerCallback, FinishCommandHandler } from './command';
+import { Dictionary } from './common-types';
+import { Arguments as ParserArguments, DetailedArguments as ParserDetailedArguments, Configuration as ParserConfiguration, Options as ParserOptions, ConfigCallback, CoerceCallback } from 'yargs-parser';
+import { YError } from './yerror';
+import { UsageInstance, FailureFunction } from './usage';
+import { CompletionFunction } from './completion';
+import { ValidationInstance, KeyOrPos } from './validation';
+import { Y18N } from 'y18n';
+import { MiddlewareCallback, Middleware } from './middleware';
+import { RequireDirectoryOptions } from 'require-directory';
+export declare function Yargs(processArgs?: string | string[], cwd?: string, parentRequire?: NodeRequire): YargsInstance;
+export declare function rebase(base: string, dir: string): string;
+/** Instance of the yargs module. */
+export interface YargsInstance {
+    $0: string;
+    argv: Arguments;
+    customScriptName: boolean;
+    parsed: DetailedArguments | false;
+    _copyDoubleDash<T extends Arguments | Promise<Arguments>>(argv: T): T;
+    _getLoggerInstance(): LoggerInstance;
+    _getParseContext(): Object;
+    _hasOutput(): boolean;
+    _hasParseCallback(): boolean;
+    _parseArgs: {
+        (args: null, shortCircuit: null, _calledFromCommand: boolean, commandIndex?: number): Arguments | Promise<Arguments>;
+        (args: string | string[], shortCircuit?: boolean): Arguments | Promise<Arguments>;
+    };
+    _runValidation(argv: Arguments, aliases: Dictionary<string[]>, positionalMap: Dictionary<string[]>, parseErrors: Error | null, isDefaultCommand?: boolean): void;
+    _setHasOutput(): void;
+    addHelpOpt: {
+        (opt?: string | false): YargsInstance;
+        (opt?: string, msg?: string): YargsInstance;
+    };
+    addShowHiddenOpt: {
+        (opt?: string | false): YargsInstance;
+        (opt?: string, msg?: string): YargsInstance;
+    };
+    alias: {
+        (keys: string | string[], aliases: string | string[]): YargsInstance;
+        (keyAliases: Dictionary<string | string[]>): YargsInstance;
+    };
+    array(keys: string | string[]): YargsInstance;
+    boolean(keys: string | string[]): YargsInstance;
+    check(f: (argv: Arguments, aliases: Dictionary<string[]>) => any, _global?: boolean): YargsInstance;
+    choices: {
+        (keys: string | string[], choices: string | string[]): YargsInstance;
+        (keyChoices: Dictionary<string | string[]>): YargsInstance;
+    };
+    coerce: {
+        (keys: string | string[], coerceCallback: CoerceCallback): YargsInstance;
+        (keyCoerceCallbacks: Dictionary<CoerceCallback>): YargsInstance;
+    };
+    command(cmd: string | string[], description: CommandHandler['description'], builder?: CommandBuilderDefinition | CommandBuilder, handler?: CommandHandlerCallback, commandMiddleware?: Middleware[], deprecated?: boolean): YargsInstance;
+    commandDir(dir: string, opts?: RequireDirectoryOptions<any>): YargsInstance;
+    completion: {
+        (cmd?: string, fn?: CompletionFunction): YargsInstance;
+        (cmd?: string, desc?: string | false, fn?: CompletionFunction): YargsInstance;
+    };
+    config: {
+        (config: Dictionary): YargsInstance;
+        (keys?: string | string[], configCallback?: ConfigCallback): YargsInstance;
+        (keys?: string | string[], msg?: string, configCallback?: ConfigCallback): YargsInstance;
+    };
+    conflicts: {
+        (key: string, conflictsWith: string | string[]): YargsInstance;
+        (keyConflicts: Dictionary<string | string[]>): YargsInstance;
+    };
+    count(keys: string | string[]): YargsInstance;
+    default: {
+        (key: string, value: any, defaultDescription?: string): YargsInstance;
+        (keys: string[], value: Exclude<any, Function>): YargsInstance;
+        (keys: Dictionary<any>): YargsInstance;
+    };
+    defaults: YargsInstance['default'];
+    demand: {
+        (min: number, max?: number | string, msg?: string): YargsInstance;
+        (keys: string | string[], msg?: string | true): YargsInstance;
+        (keys: string | string[], max: string[], msg?: string | true): YargsInstance;
+        (keyMsgs: Dictionary<string | undefined>): YargsInstance;
+        (keyMsgs: Dictionary<string | undefined>, max: string[], msg?: string): YargsInstance;
+    };
+    demandCommand(): YargsInstance;
+    demandCommand(min: number, minMsg?: string): YargsInstance;
+    demandCommand(min: number, max: number, minMsg?: string | null, maxMsg?: string | null): YargsInstance;
+    demandOption: {
+        (keys: string | string[], msg?: string): YargsInstance;
+        (keyMsgs: Dictionary<string | undefined>): YargsInstance;
+    };
+    deprecateOption(option: string, message?: string | boolean): YargsInstance;
+    describe: {
+        (keys: string | string[], description?: string): YargsInstance;
+        (keyDescriptions: Dictionary<string>): YargsInstance;
+    };
+    detectLocale(detect: boolean): YargsInstance;
+    env(prefix?: string | false): YargsInstance;
+    epilog: YargsInstance['epilogue'];
+    epilogue(msg: string): YargsInstance;
+    example(cmd: string | [string, string?][], description?: string): YargsInstance;
+    exit(code: number, err?: YError | string): void;
+    exitProcess(enabled: boolean): YargsInstance;
+    fail(f: FailureFunction): YargsInstance;
+    getCommandInstance(): CommandInstance;
+    getCompletion(args: string[], done: (completions: string[]) => any): void;
+    getContext(): Context;
+    getDemandedCommands(): Options['demandedCommands'];
+    getDemandedOptions(): Options['demandedOptions'];
+    getDeprecatedOptions(): Options['deprecatedOptions'];
+    getDetectLocale(): boolean;
+    getExitProcess(): boolean;
+    getGroups(): Dictionary<string[]>;
+    getHandlerFinishCommand(): FinishCommandHandler | null;
+    getOptions(): Options;
+    getParserConfiguration(): Configuration;
+    getStrict(): boolean;
+    getStrictCommands(): boolean;
+    getUsageInstance(): UsageInstance;
+    getValidationInstance(): ValidationInstance;
+    global(keys: string | string[], global?: boolean): YargsInstance;
+    group(keys: string | string[], groupName: string): YargsInstance;
+    help: YargsInstance['addHelpOpt'];
+    hide(key: string): YargsInstance;
+    implies: {
+        (key: string, implication: KeyOrPos | KeyOrPos[]): YargsInstance;
+        (keyImplications: Dictionary<KeyOrPos | KeyOrPos[]>): YargsInstance;
+    };
+    locale: {
+        (): string;
+        (locale: string): YargsInstance;
+    };
+    middleware(callback: MiddlewareCallback | MiddlewareCallback[], applyBeforeValidation?: boolean): YargsInstance;
+    nargs: {
+        (keys: string | string[], nargs: number): YargsInstance;
+        (keyNargs: Dictionary<number>): YargsInstance;
+    };
+    normalize(keys: string | string[]): YargsInstance;
+    number(keys: string | string[]): YargsInstance;
+    onFinishCommand(f: FinishCommandHandler): YargsInstance;
+    option: {
+        (key: string, optionDefinition: OptionDefinition): YargsInstance;
+        (keyOptionDefinitions: Dictionary<OptionDefinition>): YargsInstance;
+    };
+    options: YargsInstance['option'];
+    parse: {
+        (): Arguments | Promise<Arguments>;
+        (args: string | string[], context: object, parseCallback?: ParseCallback): Arguments | Promise<Arguments>;
+        (args: string | string[], parseCallback: ParseCallback): Arguments | Promise<Arguments>;
+        (args: string | string[], shortCircuit: boolean): Arguments | Promise<Arguments>;
+    };
+    parserConfiguration(config: Configuration): YargsInstance;
+    pkgConf(key: string, rootPath?: string): YargsInstance;
+    positional(key: string, positionalDefinition: PositionalDefinition): YargsInstance;
+    recommendCommands(recommend: boolean): YargsInstance;
+    require: YargsInstance['demand'];
+    required: YargsInstance['demand'];
+    requiresArg(keys: string | string[] | Dictionary): YargsInstance;
+    reset(aliases?: DetailedArguments['aliases']): YargsInstance;
+    resetOptions(aliases?: DetailedArguments['aliases']): YargsInstance;
+    scriptName(scriptName: string): YargsInstance;
+    showCompletionScript($0?: string, cmd?: string): YargsInstance;
+    showHelp(level: 'error' | 'log' | ((message: string) => void)): YargsInstance;
+    showHelpOnFail: {
+        (message?: string): YargsInstance;
+        (enabled: boolean, message: string): YargsInstance;
+    };
+    showHidden: YargsInstance['addShowHiddenOpt'];
+    skipValidation(keys: string | string[]): YargsInstance;
+    strict(enable?: boolean): YargsInstance;
+    strictCommands(enable?: boolean): YargsInstance;
+    string(key: string | string[]): YargsInstance;
+    terminalWidth(): number | null;
+    updateStrings(obj: Dictionary<string>): YargsInstance;
+    updateLocale: YargsInstance['updateStrings'];
+    usage: {
+        (msg: string | null): YargsInstance;
+        (msg: string, description: CommandHandler['description'], builder?: CommandBuilderDefinition | CommandBuilder, handler?: CommandHandlerCallback): YargsInstance;
+    };
+    version: {
+        (ver?: string | false): YargsInstance;
+        (key?: string, ver?: string): YargsInstance;
+        (key?: string, msg?: string, ver?: string): YargsInstance;
+    };
+    wrap(cols: number | null | undefined): YargsInstance;
+}
+export declare function isYargsInstance(y: YargsInstance | void): y is YargsInstance;
+/** Yargs' context. */
+export interface Context {
+    commands: string[];
+    files: string[];
+    fullCommands: string[];
+}
+declare type LoggerInstance = Pick<Console, 'error' | 'log'>;
+export interface Options extends ParserOptions {
+    __: Y18N['__'];
+    alias: Dictionary<string[]>;
+    array: string[];
+    boolean: string[];
+    choices: Dictionary<string[]>;
+    config: Dictionary<ConfigCallback | boolean>;
+    configObjects: Dictionary[];
+    configuration: Configuration;
+    count: string[];
+    defaultDescription: Dictionary<string | undefined>;
+    demandedCommands: Dictionary<{
+        min: number;
+        max: number;
+        minMsg?: string | null;
+        maxMsg?: string | null;
+    }>;
+    demandedOptions: Dictionary<string | undefined>;
+    deprecatedOptions: Dictionary<string | boolean | undefined>;
+    hiddenOptions: string[];
+    /** Manually set keys */
+    key: Dictionary<boolean | string>;
+    local: string[];
+    normalize: string[];
+    number: string[];
+    showHiddenOpt: string;
+    skipValidation: string[];
+    string: string[];
+}
+export interface Configuration extends Partial<ParserConfiguration> {
+    /** Should a config object be deep-merged with the object config it extends? */
+    'deep-merge-config'?: boolean;
+    /** Should commands be sorted in help? */
+    'sort-commands'?: boolean;
+}
+export interface OptionDefinition {
+    alias?: string | string[];
+    array?: boolean;
+    boolean?: boolean;
+    choices?: string | string[];
+    coerce?: CoerceCallback;
+    config?: boolean;
+    configParser?: ConfigCallback;
+    conflicts?: string | string[];
+    count?: boolean;
+    default?: any;
+    defaultDescription?: string;
+    deprecate?: string | boolean;
+    deprecated?: OptionDefinition['deprecate'];
+    desc?: string;
+    describe?: OptionDefinition['desc'];
+    description?: OptionDefinition['desc'];
+    demand?: string | true;
+    demandOption?: OptionDefinition['demand'];
+    global?: boolean;
+    group?: string;
+    hidden?: boolean;
+    implies?: string | number | KeyOrPos[];
+    nargs?: number;
+    normalize?: boolean;
+    number?: boolean;
+    require?: OptionDefinition['demand'];
+    required?: OptionDefinition['demand'];
+    requiresArg?: boolean;
+    skipValidation?: boolean;
+    string?: boolean;
+    type?: 'array' | 'boolean' | 'count' | 'number' | 'string';
+}
+interface PositionalDefinition extends Pick<OptionDefinition, 'alias' | 'array' | 'coerce' | 'choices' | 'conflicts' | 'default' | 'defaultDescription' | 'demand' | 'desc' | 'describe' | 'description' | 'implies' | 'normalize'> {
+    type?: 'boolean' | 'number' | 'string';
+}
+interface ParseCallback {
+    (err: YError | string | undefined | null, argv: Arguments | Promise<Arguments>, output: string): void;
+}
+export interface Arguments extends ParserArguments {
+    /** The script name or node command */
+    $0: string;
+}
+export interface DetailedArguments extends ParserDetailedArguments {
+    argv: Arguments;
+}
+export {};
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/yargs.js b/node_modules/jest-circus/node_modules/yargs/build/lib/yargs.js
new file mode 100644
index 0000000..316f3d6
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/yargs.js
@@ -0,0 +1,1190 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isYargsInstance = exports.rebase = exports.Yargs = void 0;
+const command_1 = require("./command");
+const common_types_1 = require("./common-types");
+const yerror_1 = require("./yerror");
+const usage_1 = require("./usage");
+const argsert_1 = require("./argsert");
+const fs = require("fs");
+const completion_1 = require("./completion");
+const path = require("path");
+const validation_1 = require("./validation");
+const obj_filter_1 = require("./obj-filter");
+const apply_extends_1 = require("./apply-extends");
+const middleware_1 = require("./middleware");
+const processArgv = require("./process-argv");
+const is_promise_1 = require("./is-promise");
+const Parser = require("yargs-parser");
+const y18nFactory = require("y18n");
+const setBlocking = require("set-blocking");
+const findUp = require("find-up");
+const requireMainFilename = require("require-main-filename");
+function Yargs(processArgs = [], cwd = process.cwd(), parentRequire = require) {
+    const self = {};
+    let command;
+    let completion = null;
+    let groups = {};
+    const globalMiddleware = [];
+    let output = '';
+    const preservedGroups = {};
+    let usage;
+    let validation;
+    let handlerFinishCommand = null;
+    const y18n = y18nFactory({
+        directory: path.resolve(__dirname, '../../locales'),
+        updateFiles: false
+    });
+    self.middleware = middleware_1.globalMiddlewareFactory(globalMiddleware, self);
+    self.scriptName = function (scriptName) {
+        self.customScriptName = true;
+        self.$0 = scriptName;
+        return self;
+    };
+    // ignore the node bin, specify this in your
+    // bin file with #!/usr/bin/env node
+    let default$0;
+    if (/\b(node|iojs|electron)(\.exe)?$/.test(process.argv[0])) {
+        default$0 = process.argv.slice(1, 2);
+    }
+    else {
+        default$0 = process.argv.slice(0, 1);
+    }
+    self.$0 = default$0
+        .map(x => {
+        const b = rebase(cwd, x);
+        return x.match(/^(\/|([a-zA-Z]:)?\\)/) && b.length < x.length ? b : x;
+    })
+        .join(' ').trim();
+    if (process.env._ !== undefined && processArgv.getProcessArgvBin() === process.env._) {
+        self.$0 = process.env._.replace(`${path.dirname(process.execPath)}/`, '');
+    }
+    // use context object to keep track of resets, subcommand execution, etc
+    // submodules should modify and check the state of context as necessary
+    const context = { resets: -1, commands: [], fullCommands: [], files: [] };
+    self.getContext = () => context;
+    // puts yargs back into an initial state. any keys
+    // that have been set to "global" will not be reset
+    // by this action.
+    let options;
+    self.resetOptions = self.reset = function resetOptions(aliases = {}) {
+        context.resets++;
+        options = options || {};
+        // put yargs back into an initial state, this
+        // logic is used to build a nested command
+        // hierarchy.
+        const tmpOptions = {};
+        tmpOptions.local = options.local ? options.local : [];
+        tmpOptions.configObjects = options.configObjects ? options.configObjects : [];
+        // if a key has been explicitly set as local,
+        // we should reset it before passing options to command.
+        const localLookup = {};
+        tmpOptions.local.forEach((l) => {
+            localLookup[l] = true;
+            (aliases[l] || []).forEach((a) => {
+                localLookup[a] = true;
+            });
+        });
+        // add all groups not set to local to preserved groups
+        Object.assign(preservedGroups, Object.keys(groups).reduce((acc, groupName) => {
+            const keys = groups[groupName].filter(key => !(key in localLookup));
+            if (keys.length > 0) {
+                acc[groupName] = keys;
+            }
+            return acc;
+        }, {}));
+        // groups can now be reset
+        groups = {};
+        const arrayOptions = [
+            'array', 'boolean', 'string', 'skipValidation',
+            'count', 'normalize', 'number',
+            'hiddenOptions'
+        ];
+        const objectOptions = [
+            'narg', 'key', 'alias', 'default', 'defaultDescription',
+            'config', 'choices', 'demandedOptions', 'demandedCommands', 'coerce',
+            'deprecatedOptions'
+        ];
+        arrayOptions.forEach(k => {
+            tmpOptions[k] = (options[k] || []).filter(k => !localLookup[k]);
+        });
+        objectOptions.forEach((k) => {
+            tmpOptions[k] = obj_filter_1.objFilter(options[k], k => !localLookup[k]);
+        });
+        tmpOptions.envPrefix = options.envPrefix;
+        options = tmpOptions;
+        // if this is the first time being executed, create
+        // instances of all our helpers -- otherwise just reset.
+        usage = usage ? usage.reset(localLookup) : usage_1.usage(self, y18n);
+        validation = validation ? validation.reset(localLookup) : validation_1.validation(self, usage, y18n);
+        command = command ? command.reset() : command_1.command(self, usage, validation, globalMiddleware);
+        if (!completion)
+            completion = completion_1.completion(self, usage, command);
+        completionCommand = null;
+        output = '';
+        exitError = null;
+        hasOutput = false;
+        self.parsed = false;
+        return self;
+    };
+    self.resetOptions();
+    // temporary hack: allow "freezing" of reset-able state for parse(msg, cb)
+    const frozens = [];
+    function freeze() {
+        frozens.push({
+            options,
+            configObjects: options.configObjects.slice(0),
+            exitProcess,
+            groups,
+            strict,
+            strictCommands,
+            completionCommand,
+            output,
+            exitError,
+            hasOutput,
+            parsed: self.parsed,
+            parseFn,
+            parseContext,
+            handlerFinishCommand
+        });
+        usage.freeze();
+        validation.freeze();
+        command.freeze();
+    }
+    function unfreeze() {
+        const frozen = frozens.pop();
+        common_types_1.assertNotStrictEqual(frozen, undefined);
+        let configObjects;
+        ({
+            options,
+            configObjects,
+            exitProcess,
+            groups,
+            output,
+            exitError,
+            hasOutput,
+            parsed: self.parsed,
+            strict,
+            strictCommands,
+            completionCommand,
+            parseFn,
+            parseContext,
+            handlerFinishCommand
+        } = frozen);
+        options.configObjects = configObjects;
+        usage.unfreeze();
+        validation.unfreeze();
+        command.unfreeze();
+    }
+    self.boolean = function (keys) {
+        argsert_1.argsert('<array|string>', [keys], arguments.length);
+        populateParserHintArray('boolean', keys);
+        return self;
+    };
+    self.array = function (keys) {
+        argsert_1.argsert('<array|string>', [keys], arguments.length);
+        populateParserHintArray('array', keys);
+        return self;
+    };
+    self.number = function (keys) {
+        argsert_1.argsert('<array|string>', [keys], arguments.length);
+        populateParserHintArray('number', keys);
+        return self;
+    };
+    self.normalize = function (keys) {
+        argsert_1.argsert('<array|string>', [keys], arguments.length);
+        populateParserHintArray('normalize', keys);
+        return self;
+    };
+    self.count = function (keys) {
+        argsert_1.argsert('<array|string>', [keys], arguments.length);
+        populateParserHintArray('count', keys);
+        return self;
+    };
+    self.string = function (keys) {
+        argsert_1.argsert('<array|string>', [keys], arguments.length);
+        populateParserHintArray('string', keys);
+        return self;
+    };
+    self.requiresArg = function (keys) {
+        // the 2nd paramter [number] in the argsert the assertion is mandatory
+        // as populateParserHintSingleValueDictionary recursively calls requiresArg
+        // with Nan as a 2nd parameter, although we ignore it
+        argsert_1.argsert('<array|string|object> [number]', [keys], arguments.length);
+        // If someone configures nargs at the same time as requiresArg,
+        // nargs should take precedent,
+        // see: https://github.com/yargs/yargs/pull/1572
+        // TODO: make this work with aliases, using a check similar to
+        // checkAllAliases() in yargs-parser.
+        if (typeof keys === 'string' && options.narg[keys]) {
+            return self;
+        }
+        else {
+            populateParserHintSingleValueDictionary(self.requiresArg, 'narg', keys, NaN);
+        }
+        return self;
+    };
+    self.skipValidation = function (keys) {
+        argsert_1.argsert('<array|string>', [keys], arguments.length);
+        populateParserHintArray('skipValidation', keys);
+        return self;
+    };
+    function populateParserHintArray(type, keys) {
+        keys = [].concat(keys);
+        keys.forEach((key) => {
+            key = sanitizeKey(key);
+            options[type].push(key);
+        });
+    }
+    self.nargs = function (key, value) {
+        argsert_1.argsert('<string|object|array> [number]', [key, value], arguments.length);
+        populateParserHintSingleValueDictionary(self.nargs, 'narg', key, value);
+        return self;
+    };
+    self.choices = function (key, value) {
+        argsert_1.argsert('<object|string|array> [string|array]', [key, value], arguments.length);
+        populateParserHintArrayDictionary(self.choices, 'choices', key, value);
+        return self;
+    };
+    self.alias = function (key, value) {
+        argsert_1.argsert('<object|string|array> [string|array]', [key, value], arguments.length);
+        populateParserHintArrayDictionary(self.alias, 'alias', key, value);
+        return self;
+    };
+    // TODO: actually deprecate self.defaults.
+    self.default = self.defaults = function (key, value, defaultDescription) {
+        argsert_1.argsert('<object|string|array> [*] [string]', [key, value, defaultDescription], arguments.length);
+        if (defaultDescription) {
+            common_types_1.assertSingleKey(key);
+            options.defaultDescription[key] = defaultDescription;
+        }
+        if (typeof value === 'function') {
+            common_types_1.assertSingleKey(key);
+            if (!options.defaultDescription[key])
+                options.defaultDescription[key] = usage.functionDescription(value);
+            value = value.call();
+        }
+        populateParserHintSingleValueDictionary(self.default, 'default', key, value);
+        return self;
+    };
+    self.describe = function (key, desc) {
+        argsert_1.argsert('<object|string|array> [string]', [key, desc], arguments.length);
+        setKey(key, true);
+        usage.describe(key, desc);
+        return self;
+    };
+    function setKey(key, set) {
+        populateParserHintSingleValueDictionary(setKey, 'key', key, set);
+        return self;
+    }
+    function demandOption(keys, msg) {
+        argsert_1.argsert('<object|string|array> [string]', [keys, msg], arguments.length);
+        populateParserHintSingleValueDictionary(self.demandOption, 'demandedOptions', keys, msg);
+        return self;
+    }
+    self.demandOption = demandOption;
+    self.coerce = function (keys, value) {
+        argsert_1.argsert('<object|string|array> [function]', [keys, value], arguments.length);
+        populateParserHintSingleValueDictionary(self.coerce, 'coerce', keys, value);
+        return self;
+    };
+    function populateParserHintSingleValueDictionary(builder, type, key, value) {
+        populateParserHintDictionary(builder, type, key, value, (type, key, value) => {
+            options[type][key] = value;
+        });
+    }
+    function populateParserHintArrayDictionary(builder, type, key, value) {
+        populateParserHintDictionary(builder, type, key, value, (type, key, value) => {
+            options[type][key] = (options[type][key] || []).concat(value);
+        });
+    }
+    function populateParserHintDictionary(builder, type, key, value, singleKeyHandler) {
+        if (Array.isArray(key)) {
+            // an array of keys with one value ['x', 'y', 'z'], function parse () {}
+            key.forEach((k) => {
+                builder(k, value);
+            });
+        }
+        else if (((key) => typeof key === 'object')(key)) {
+            // an object of key value pairs: {'x': parse () {}, 'y': parse() {}}
+            for (const k of common_types_1.objectKeys(key)) {
+                builder(k, key[k]);
+            }
+        }
+        else {
+            singleKeyHandler(type, sanitizeKey(key), value);
+        }
+    }
+    function sanitizeKey(key) {
+        if (key === '__proto__')
+            return '___proto___';
+        return key;
+    }
+    function deleteFromParserHintObject(optionKey) {
+        // delete from all parsing hints:
+        // boolean, array, key, alias, etc.
+        common_types_1.objectKeys(options).forEach((hintKey) => {
+            // configObjects is not a parsing hint array
+            if (((key) => key === 'configObjects')(hintKey))
+                return;
+            const hint = options[hintKey];
+            if (Array.isArray(hint)) {
+                if (~hint.indexOf(optionKey))
+                    hint.splice(hint.indexOf(optionKey), 1);
+            }
+            else if (typeof hint === 'object') {
+                delete hint[optionKey];
+            }
+        });
+        // now delete the description from usage.js.
+        delete usage.getDescriptions()[optionKey];
+    }
+    self.config = function config(key = 'config', msg, parseFn) {
+        argsert_1.argsert('[object|string] [string|function] [function]', [key, msg, parseFn], arguments.length);
+        // allow a config object to be provided directly.
+        if ((typeof key === 'object') && !Array.isArray(key)) {
+            key = apply_extends_1.applyExtends(key, cwd, self.getParserConfiguration()['deep-merge-config']);
+            options.configObjects = (options.configObjects || []).concat(key);
+            return self;
+        }
+        // allow for a custom parsing function.
+        if (typeof msg === 'function') {
+            parseFn = msg;
+            msg = undefined;
+        }
+        self.describe(key, msg || usage.deferY18nLookup('Path to JSON config file'));
+        (Array.isArray(key) ? key : [key]).forEach((k) => {
+            options.config[k] = parseFn || true;
+        });
+        return self;
+    };
+    self.example = function (cmd, description) {
+        argsert_1.argsert('<string|array> [string]', [cmd, description], arguments.length);
+        if (Array.isArray(cmd)) {
+            cmd.forEach((exampleParams) => self.example(...exampleParams));
+        }
+        else {
+            usage.example(cmd, description);
+        }
+        return self;
+    };
+    self.command = function (cmd, description, builder, handler, middlewares, deprecated) {
+        argsert_1.argsert('<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]', [cmd, description, builder, handler, middlewares, deprecated], arguments.length);
+        command.addHandler(cmd, description, builder, handler, middlewares, deprecated);
+        return self;
+    };
+    self.commandDir = function (dir, opts) {
+        argsert_1.argsert('<string> [object]', [dir, opts], arguments.length);
+        const req = parentRequire || require;
+        command.addDirectory(dir, self.getContext(), req, require('get-caller-file')(), opts);
+        return self;
+    };
+    // TODO: deprecate self.demand in favor of
+    // .demandCommand() .demandOption().
+    self.demand = self.required = self.require = function demand(keys, max, msg) {
+        // you can optionally provide a 'max' key,
+        // which will raise an exception if too many '_'
+        // options are provided.
+        if (Array.isArray(max)) {
+            max.forEach((key) => {
+                common_types_1.assertNotStrictEqual(msg, true);
+                demandOption(key, msg);
+            });
+            max = Infinity;
+        }
+        else if (typeof max !== 'number') {
+            msg = max;
+            max = Infinity;
+        }
+        if (typeof keys === 'number') {
+            common_types_1.assertNotStrictEqual(msg, true);
+            self.demandCommand(keys, max, msg, msg);
+        }
+        else if (Array.isArray(keys)) {
+            keys.forEach((key) => {
+                common_types_1.assertNotStrictEqual(msg, true);
+                demandOption(key, msg);
+            });
+        }
+        else {
+            if (typeof msg === 'string') {
+                demandOption(keys, msg);
+            }
+            else if (msg === true || typeof msg === 'undefined') {
+                demandOption(keys);
+            }
+        }
+        return self;
+    };
+    self.demandCommand = function demandCommand(min = 1, max, minMsg, maxMsg) {
+        argsert_1.argsert('[number] [number|string] [string|null|undefined] [string|null|undefined]', [min, max, minMsg, maxMsg], arguments.length);
+        if (typeof max !== 'number') {
+            minMsg = max;
+            max = Infinity;
+        }
+        self.global('_', false);
+        options.demandedCommands._ = {
+            min,
+            max,
+            minMsg,
+            maxMsg
+        };
+        return self;
+    };
+    self.getDemandedOptions = () => {
+        argsert_1.argsert([], 0);
+        return options.demandedOptions;
+    };
+    self.getDemandedCommands = () => {
+        argsert_1.argsert([], 0);
+        return options.demandedCommands;
+    };
+    self.deprecateOption = function deprecateOption(option, message) {
+        argsert_1.argsert('<string> [string|boolean]', [option, message], arguments.length);
+        options.deprecatedOptions[option] = message;
+        return self;
+    };
+    self.getDeprecatedOptions = () => {
+        argsert_1.argsert([], 0);
+        return options.deprecatedOptions;
+    };
+    self.implies = function (key, value) {
+        argsert_1.argsert('<string|object> [number|string|array]', [key, value], arguments.length);
+        validation.implies(key, value);
+        return self;
+    };
+    self.conflicts = function (key1, key2) {
+        argsert_1.argsert('<string|object> [string|array]', [key1, key2], arguments.length);
+        validation.conflicts(key1, key2);
+        return self;
+    };
+    self.usage = function (msg, description, builder, handler) {
+        argsert_1.argsert('<string|null|undefined> [string|boolean] [function|object] [function]', [msg, description, builder, handler], arguments.length);
+        if (description !== undefined) {
+            common_types_1.assertNotStrictEqual(msg, null);
+            // .usage() can be used as an alias for defining
+            // a default command.
+            if ((msg || '').match(/^\$0( |$)/)) {
+                return self.command(msg, description, builder, handler);
+            }
+            else {
+                throw new yerror_1.YError('.usage() description must start with $0 if being used as alias for .command()');
+            }
+        }
+        else {
+            usage.usage(msg);
+            return self;
+        }
+    };
+    self.epilogue = self.epilog = function (msg) {
+        argsert_1.argsert('<string>', [msg], arguments.length);
+        usage.epilog(msg);
+        return self;
+    };
+    self.fail = function (f) {
+        argsert_1.argsert('<function>', [f], arguments.length);
+        usage.failFn(f);
+        return self;
+    };
+    self.onFinishCommand = function (f) {
+        argsert_1.argsert('<function>', [f], arguments.length);
+        handlerFinishCommand = f;
+        return self;
+    };
+    self.getHandlerFinishCommand = () => handlerFinishCommand;
+    self.check = function (f, _global) {
+        argsert_1.argsert('<function> [boolean]', [f, _global], arguments.length);
+        validation.check(f, _global !== false);
+        return self;
+    };
+    self.global = function global(globals, global) {
+        argsert_1.argsert('<string|array> [boolean]', [globals, global], arguments.length);
+        globals = [].concat(globals);
+        if (global !== false) {
+            options.local = options.local.filter(l => globals.indexOf(l) === -1);
+        }
+        else {
+            globals.forEach((g) => {
+                if (options.local.indexOf(g) === -1)
+                    options.local.push(g);
+            });
+        }
+        return self;
+    };
+    self.pkgConf = function pkgConf(key, rootPath) {
+        argsert_1.argsert('<string> [string]', [key, rootPath], arguments.length);
+        let conf = null;
+        // prefer cwd to require-main-filename in this method
+        // since we're looking for e.g. "nyc" config in nyc consumer
+        // rather than "yargs" config in nyc (where nyc is the main filename)
+        const obj = pkgUp(rootPath || cwd);
+        // If an object exists in the key, add it to options.configObjects
+        if (obj[key] && typeof obj[key] === 'object') {
+            conf = apply_extends_1.applyExtends(obj[key], rootPath || cwd, self.getParserConfiguration()['deep-merge-config']);
+            options.configObjects = (options.configObjects || []).concat(conf);
+        }
+        return self;
+    };
+    const pkgs = {};
+    function pkgUp(rootPath) {
+        const npath = rootPath || '*';
+        if (pkgs[npath])
+            return pkgs[npath];
+        let obj = {};
+        try {
+            let startDir = rootPath || requireMainFilename(parentRequire);
+            // When called in an environment that lacks require.main.filename, such as a jest test runner,
+            // startDir is already process.cwd(), and should not be shortened.
+            // Whether or not it is _actually_ a directory (e.g., extensionless bin) is irrelevant, find-up handles it.
+            if (!rootPath && path.extname(startDir)) {
+                startDir = path.dirname(startDir);
+            }
+            const pkgJsonPath = findUp.sync('package.json', {
+                cwd: startDir
+            });
+            common_types_1.assertNotStrictEqual(pkgJsonPath, undefined);
+            obj = JSON.parse(fs.readFileSync(pkgJsonPath).toString());
+        }
+        catch (noop) { }
+        pkgs[npath] = obj || {};
+        return pkgs[npath];
+    }
+    let parseFn = null;
+    let parseContext = null;
+    self.parse = function parse(args, shortCircuit, _parseFn) {
+        argsert_1.argsert('[string|array] [function|boolean|object] [function]', [args, shortCircuit, _parseFn], arguments.length);
+        freeze();
+        if (typeof args === 'undefined') {
+            const argv = self._parseArgs(processArgs);
+            const tmpParsed = self.parsed;
+            unfreeze();
+            // TODO: remove this compatibility hack when we release yargs@15.x:
+            self.parsed = tmpParsed;
+            return argv;
+        }
+        // a context object can optionally be provided, this allows
+        // additional information to be passed to a command handler.
+        if (typeof shortCircuit === 'object') {
+            parseContext = shortCircuit;
+            shortCircuit = _parseFn;
+        }
+        // by providing a function as a second argument to
+        // parse you can capture output that would otherwise
+        // default to printing to stdout/stderr.
+        if (typeof shortCircuit === 'function') {
+            parseFn = shortCircuit;
+            shortCircuit = false;
+        }
+        // completion short-circuits the parsing process,
+        // skipping validation, etc.
+        if (!shortCircuit)
+            processArgs = args;
+        if (parseFn)
+            exitProcess = false;
+        const parsed = self._parseArgs(args, !!shortCircuit);
+        completion.setParsed(self.parsed);
+        if (parseFn)
+            parseFn(exitError, parsed, output);
+        unfreeze();
+        return parsed;
+    };
+    self._getParseContext = () => parseContext || {};
+    self._hasParseCallback = () => !!parseFn;
+    self.option = self.options = function option(key, opt) {
+        argsert_1.argsert('<string|object> [object]', [key, opt], arguments.length);
+        if (typeof key === 'object') {
+            Object.keys(key).forEach((k) => {
+                self.options(k, key[k]);
+            });
+        }
+        else {
+            if (typeof opt !== 'object') {
+                opt = {};
+            }
+            options.key[key] = true; // track manually set keys.
+            if (opt.alias)
+                self.alias(key, opt.alias);
+            const deprecate = opt.deprecate || opt.deprecated;
+            if (deprecate) {
+                self.deprecateOption(key, deprecate);
+            }
+            const demand = opt.demand || opt.required || opt.require;
+            // A required option can be specified via "demand: true".
+            if (demand) {
+                self.demand(key, demand);
+            }
+            if (opt.demandOption) {
+                self.demandOption(key, typeof opt.demandOption === 'string' ? opt.demandOption : undefined);
+            }
+            if (opt.conflicts) {
+                self.conflicts(key, opt.conflicts);
+            }
+            if ('default' in opt) {
+                self.default(key, opt.default);
+            }
+            if (opt.implies !== undefined) {
+                self.implies(key, opt.implies);
+            }
+            if (opt.nargs !== undefined) {
+                self.nargs(key, opt.nargs);
+            }
+            if (opt.config) {
+                self.config(key, opt.configParser);
+            }
+            if (opt.normalize) {
+                self.normalize(key);
+            }
+            if (opt.choices) {
+                self.choices(key, opt.choices);
+            }
+            if (opt.coerce) {
+                self.coerce(key, opt.coerce);
+            }
+            if (opt.group) {
+                self.group(key, opt.group);
+            }
+            if (opt.boolean || opt.type === 'boolean') {
+                self.boolean(key);
+                if (opt.alias)
+                    self.boolean(opt.alias);
+            }
+            if (opt.array || opt.type === 'array') {
+                self.array(key);
+                if (opt.alias)
+                    self.array(opt.alias);
+            }
+            if (opt.number || opt.type === 'number') {
+                self.number(key);
+                if (opt.alias)
+                    self.number(opt.alias);
+            }
+            if (opt.string || opt.type === 'string') {
+                self.string(key);
+                if (opt.alias)
+                    self.string(opt.alias);
+            }
+            if (opt.count || opt.type === 'count') {
+                self.count(key);
+            }
+            if (typeof opt.global === 'boolean') {
+                self.global(key, opt.global);
+            }
+            if (opt.defaultDescription) {
+                options.defaultDescription[key] = opt.defaultDescription;
+            }
+            if (opt.skipValidation) {
+                self.skipValidation(key);
+            }
+            const desc = opt.describe || opt.description || opt.desc;
+            self.describe(key, desc);
+            if (opt.hidden) {
+                self.hide(key);
+            }
+            if (opt.requiresArg) {
+                self.requiresArg(key);
+            }
+        }
+        return self;
+    };
+    self.getOptions = () => options;
+    self.positional = function (key, opts) {
+        argsert_1.argsert('<string> <object>', [key, opts], arguments.length);
+        if (context.resets === 0) {
+            throw new yerror_1.YError(".positional() can only be called in a command's builder function");
+        }
+        // .positional() only supports a subset of the configuration
+        // options available to .option().
+        const supportedOpts = ['default', 'defaultDescription', 'implies', 'normalize',
+            'choices', 'conflicts', 'coerce', 'type', 'describe',
+            'desc', 'description', 'alias'];
+        opts = obj_filter_1.objFilter(opts, (k, v) => {
+            let accept = supportedOpts.indexOf(k) !== -1;
+            // type can be one of string|number|boolean.
+            if (k === 'type' && ['string', 'number', 'boolean'].indexOf(v) === -1)
+                accept = false;
+            return accept;
+        });
+        // copy over any settings that can be inferred from the command string.
+        const fullCommand = context.fullCommands[context.fullCommands.length - 1];
+        const parseOptions = fullCommand ? command.cmdToParseOptions(fullCommand) : {
+            array: [],
+            alias: {},
+            default: {},
+            demand: {}
+        };
+        common_types_1.objectKeys(parseOptions).forEach((pk) => {
+            const parseOption = parseOptions[pk];
+            if (Array.isArray(parseOption)) {
+                if (parseOption.indexOf(key) !== -1)
+                    opts[pk] = true;
+            }
+            else {
+                if (parseOption[key] && !(pk in opts))
+                    opts[pk] = parseOption[key];
+            }
+        });
+        self.group(key, usage.getPositionalGroupName());
+        return self.option(key, opts);
+    };
+    self.group = function group(opts, groupName) {
+        argsert_1.argsert('<string|array> <string>', [opts, groupName], arguments.length);
+        const existing = preservedGroups[groupName] || groups[groupName];
+        if (preservedGroups[groupName]) {
+            // we now only need to track this group name in groups.
+            delete preservedGroups[groupName];
+        }
+        const seen = {};
+        groups[groupName] = (existing || []).concat(opts).filter((key) => {
+            if (seen[key])
+                return false;
+            return (seen[key] = true);
+        });
+        return self;
+    };
+    // combine explicit and preserved groups. explicit groups should be first
+    self.getGroups = () => Object.assign({}, groups, preservedGroups);
+    // as long as options.envPrefix is not undefined,
+    // parser will apply env vars matching prefix to argv
+    self.env = function (prefix) {
+        argsert_1.argsert('[string|boolean]', [prefix], arguments.length);
+        if (prefix === false)
+            delete options.envPrefix;
+        else
+            options.envPrefix = prefix || '';
+        return self;
+    };
+    self.wrap = function (cols) {
+        argsert_1.argsert('<number|null|undefined>', [cols], arguments.length);
+        usage.wrap(cols);
+        return self;
+    };
+    let strict = false;
+    self.strict = function (enabled) {
+        argsert_1.argsert('[boolean]', [enabled], arguments.length);
+        strict = enabled !== false;
+        return self;
+    };
+    self.getStrict = () => strict;
+    let strictCommands = false;
+    self.strictCommands = function (enabled) {
+        argsert_1.argsert('[boolean]', [enabled], arguments.length);
+        strictCommands = enabled !== false;
+        return self;
+    };
+    self.getStrictCommands = () => strictCommands;
+    let parserConfig = {};
+    self.parserConfiguration = function parserConfiguration(config) {
+        argsert_1.argsert('<object>', [config], arguments.length);
+        parserConfig = config;
+        return self;
+    };
+    self.getParserConfiguration = () => parserConfig;
+    self.showHelp = function (level) {
+        argsert_1.argsert('[string|function]', [level], arguments.length);
+        if (!self.parsed)
+            self._parseArgs(processArgs); // run parser, if it has not already been executed.
+        if (command.hasDefaultCommand()) {
+            context.resets++; // override the restriction on top-level positoinals.
+            command.runDefaultBuilderOn(self);
+        }
+        usage.showHelp(level);
+        return self;
+    };
+    let versionOpt = null;
+    self.version = function version(opt, msg, ver) {
+        const defaultVersionOpt = 'version';
+        argsert_1.argsert('[boolean|string] [string] [string]', [opt, msg, ver], arguments.length);
+        // nuke the key previously configured
+        // to return version #.
+        if (versionOpt) {
+            deleteFromParserHintObject(versionOpt);
+            usage.version(undefined);
+            versionOpt = null;
+        }
+        if (arguments.length === 0) {
+            ver = guessVersion();
+            opt = defaultVersionOpt;
+        }
+        else if (arguments.length === 1) {
+            if (opt === false) { // disable default 'version' key.
+                return self;
+            }
+            ver = opt;
+            opt = defaultVersionOpt;
+        }
+        else if (arguments.length === 2) {
+            ver = msg;
+            msg = undefined;
+        }
+        versionOpt = typeof opt === 'string' ? opt : defaultVersionOpt;
+        msg = msg || usage.deferY18nLookup('Show version number');
+        usage.version(ver || undefined);
+        self.boolean(versionOpt);
+        self.describe(versionOpt, msg);
+        return self;
+    };
+    function guessVersion() {
+        const obj = pkgUp();
+        return obj.version || 'unknown';
+    }
+    let helpOpt = null;
+    self.addHelpOpt = self.help = function addHelpOpt(opt, msg) {
+        const defaultHelpOpt = 'help';
+        argsert_1.argsert('[string|boolean] [string]', [opt, msg], arguments.length);
+        // nuke the key previously configured
+        // to return help.
+        if (helpOpt) {
+            deleteFromParserHintObject(helpOpt);
+            helpOpt = null;
+        }
+        if (arguments.length === 1) {
+            if (opt === false)
+                return self;
+        }
+        // use arguments, fallback to defaults for opt and msg
+        helpOpt = typeof opt === 'string' ? opt : defaultHelpOpt;
+        self.boolean(helpOpt);
+        self.describe(helpOpt, msg || usage.deferY18nLookup('Show help'));
+        return self;
+    };
+    const defaultShowHiddenOpt = 'show-hidden';
+    options.showHiddenOpt = defaultShowHiddenOpt;
+    self.addShowHiddenOpt = self.showHidden = function addShowHiddenOpt(opt, msg) {
+        argsert_1.argsert('[string|boolean] [string]', [opt, msg], arguments.length);
+        if (arguments.length === 1) {
+            if (opt === false)
+                return self;
+        }
+        const showHiddenOpt = typeof opt === 'string' ? opt : defaultShowHiddenOpt;
+        self.boolean(showHiddenOpt);
+        self.describe(showHiddenOpt, msg || usage.deferY18nLookup('Show hidden options'));
+        options.showHiddenOpt = showHiddenOpt;
+        return self;
+    };
+    self.hide = function hide(key) {
+        argsert_1.argsert('<string>', [key], arguments.length);
+        options.hiddenOptions.push(key);
+        return self;
+    };
+    self.showHelpOnFail = function showHelpOnFail(enabled, message) {
+        argsert_1.argsert('[boolean|string] [string]', [enabled, message], arguments.length);
+        usage.showHelpOnFail(enabled, message);
+        return self;
+    };
+    var exitProcess = true;
+    self.exitProcess = function (enabled = true) {
+        argsert_1.argsert('[boolean]', [enabled], arguments.length);
+        exitProcess = enabled;
+        return self;
+    };
+    self.getExitProcess = () => exitProcess;
+    var completionCommand = null;
+    self.completion = function (cmd, desc, fn) {
+        argsert_1.argsert('[string] [string|boolean|function] [function]', [cmd, desc, fn], arguments.length);
+        // a function to execute when generating
+        // completions can be provided as the second
+        // or third argument to completion.
+        if (typeof desc === 'function') {
+            fn = desc;
+            desc = undefined;
+        }
+        // register the completion command.
+        completionCommand = cmd || completionCommand || 'completion';
+        if (!desc && desc !== false) {
+            desc = 'generate completion script';
+        }
+        self.command(completionCommand, desc);
+        // a function can be provided
+        if (fn)
+            completion.registerFunction(fn);
+        return self;
+    };
+    self.showCompletionScript = function ($0, cmd) {
+        argsert_1.argsert('[string] [string]', [$0, cmd], arguments.length);
+        $0 = $0 || self.$0;
+        _logger.log(completion.generateCompletionScript($0, cmd || completionCommand || 'completion'));
+        return self;
+    };
+    self.getCompletion = function (args, done) {
+        argsert_1.argsert('<array> <function>', [args, done], arguments.length);
+        completion.getCompletion(args, done);
+    };
+    self.locale = function (locale) {
+        argsert_1.argsert('[string]', [locale], arguments.length);
+        if (!locale) {
+            guessLocale();
+            return y18n.getLocale();
+        }
+        detectLocale = false;
+        y18n.setLocale(locale);
+        return self;
+    };
+    self.updateStrings = self.updateLocale = function (obj) {
+        argsert_1.argsert('<object>', [obj], arguments.length);
+        detectLocale = false;
+        y18n.updateLocale(obj);
+        return self;
+    };
+    let detectLocale = true;
+    self.detectLocale = function (detect) {
+        argsert_1.argsert('<boolean>', [detect], arguments.length);
+        detectLocale = detect;
+        return self;
+    };
+    self.getDetectLocale = () => detectLocale;
+    var hasOutput = false;
+    var exitError = null;
+    // maybe exit, always capture
+    // context about why we wanted to exit.
+    self.exit = (code, err) => {
+        hasOutput = true;
+        exitError = err;
+        if (exitProcess)
+            process.exit(code);
+    };
+    // we use a custom logger that buffers output,
+    // so that we can print to non-CLIs, e.g., chat-bots.
+    const _logger = {
+        log(...args) {
+            if (!self._hasParseCallback())
+                console.log(...args);
+            hasOutput = true;
+            if (output.length)
+                output += '\n';
+            output += args.join(' ');
+        },
+        error(...args) {
+            if (!self._hasParseCallback())
+                console.error(...args);
+            hasOutput = true;
+            if (output.length)
+                output += '\n';
+            output += args.join(' ');
+        }
+    };
+    self._getLoggerInstance = () => _logger;
+    // has yargs output an error our help
+    // message in the current execution context.
+    self._hasOutput = () => hasOutput;
+    self._setHasOutput = () => {
+        hasOutput = true;
+    };
+    let recommendCommands;
+    self.recommendCommands = function (recommend = true) {
+        argsert_1.argsert('[boolean]', [recommend], arguments.length);
+        recommendCommands = recommend;
+        return self;
+    };
+    self.getUsageInstance = () => usage;
+    self.getValidationInstance = () => validation;
+    self.getCommandInstance = () => command;
+    self.terminalWidth = () => {
+        argsert_1.argsert([], 0);
+        return typeof process.stdout.columns !== 'undefined' ? process.stdout.columns : null;
+    };
+    Object.defineProperty(self, 'argv', {
+        get: () => self._parseArgs(processArgs),
+        enumerable: true
+    });
+    self._parseArgs = function parseArgs(args, shortCircuit, _calledFromCommand, commandIndex) {
+        let skipValidation = !!_calledFromCommand;
+        args = args || processArgs;
+        options.__ = y18n.__;
+        options.configuration = self.getParserConfiguration();
+        const populateDoubleDash = !!options.configuration['populate--'];
+        const config = Object.assign({}, options.configuration, {
+            'populate--': true
+        });
+        const parsed = Parser.detailed(args, Object.assign({}, options, {
+            configuration: config
+        }));
+        let argv = parsed.argv;
+        if (parseContext)
+            argv = Object.assign({}, argv, parseContext);
+        const aliases = parsed.aliases;
+        argv.$0 = self.$0;
+        self.parsed = parsed;
+        try {
+            guessLocale(); // guess locale lazily, so that it can be turned off in chain.
+            // while building up the argv object, there
+            // are two passes through the parser. If completion
+            // is being performed short-circuit on the first pass.
+            if (shortCircuit) {
+                return (populateDoubleDash || _calledFromCommand) ? argv : self._copyDoubleDash(argv);
+            }
+            // if there's a handler associated with a
+            // command defer processing to it.
+            if (helpOpt) {
+                // consider any multi-char helpOpt alias as a valid help command
+                // unless all helpOpt aliases are single-char
+                // note that parsed.aliases is a normalized bidirectional map :)
+                const helpCmds = [helpOpt]
+                    .concat(aliases[helpOpt] || [])
+                    .filter(k => k.length > 1);
+                // check if help should trigger and strip it from _.
+                if (~helpCmds.indexOf(argv._[argv._.length - 1])) {
+                    argv._.pop();
+                    argv[helpOpt] = true;
+                }
+            }
+            const handlerKeys = command.getCommands();
+            const requestCompletions = completion.completionKey in argv;
+            const skipRecommendation = argv[helpOpt] || requestCompletions;
+            const skipDefaultCommand = skipRecommendation && (handlerKeys.length > 1 || handlerKeys[0] !== '$0');
+            if (argv._.length) {
+                if (handlerKeys.length) {
+                    let firstUnknownCommand;
+                    for (let i = (commandIndex || 0), cmd; argv._[i] !== undefined; i++) {
+                        cmd = String(argv._[i]);
+                        if (~handlerKeys.indexOf(cmd) && cmd !== completionCommand) {
+                            // commands are executed using a recursive algorithm that executes
+                            // the deepest command first; we keep track of the position in the
+                            // argv._ array that is currently being executed.
+                            const innerArgv = command.runCommand(cmd, self, parsed, i + 1);
+                            return populateDoubleDash ? innerArgv : self._copyDoubleDash(innerArgv);
+                        }
+                        else if (!firstUnknownCommand && cmd !== completionCommand) {
+                            firstUnknownCommand = cmd;
+                            break;
+                        }
+                    }
+                    // run the default command, if defined
+                    if (command.hasDefaultCommand() && !skipDefaultCommand) {
+                        const innerArgv = command.runCommand(null, self, parsed);
+                        return populateDoubleDash ? innerArgv : self._copyDoubleDash(innerArgv);
+                    }
+                    // recommend a command if recommendCommands() has
+                    // been enabled, and no commands were found to execute
+                    if (recommendCommands && firstUnknownCommand && !skipRecommendation) {
+                        validation.recommendCommands(firstUnknownCommand, handlerKeys);
+                    }
+                }
+                // generate a completion script for adding to ~/.bashrc.
+                if (completionCommand && ~argv._.indexOf(completionCommand) && !requestCompletions) {
+                    if (exitProcess)
+                        setBlocking(true);
+                    self.showCompletionScript();
+                    self.exit(0);
+                }
+            }
+            else if (command.hasDefaultCommand() && !skipDefaultCommand) {
+                const innerArgv = command.runCommand(null, self, parsed);
+                return populateDoubleDash ? innerArgv : self._copyDoubleDash(innerArgv);
+            }
+            // we must run completions first, a user might
+            // want to complete the --help or --version option.
+            if (requestCompletions) {
+                if (exitProcess)
+                    setBlocking(true);
+                // we allow for asynchronous completions,
+                // e.g., loading in a list of commands from an API.
+                args = [].concat(args);
+                const completionArgs = args.slice(args.indexOf(`--${completion.completionKey}`) + 1);
+                completion.getCompletion(completionArgs, (completions) => {
+                    ;
+                    (completions || []).forEach((completion) => {
+                        _logger.log(completion);
+                    });
+                    self.exit(0);
+                });
+                return (populateDoubleDash || _calledFromCommand) ? argv : self._copyDoubleDash(argv);
+            }
+            // Handle 'help' and 'version' options
+            // if we haven't already output help!
+            if (!hasOutput) {
+                Object.keys(argv).forEach((key) => {
+                    if (key === helpOpt && argv[key]) {
+                        if (exitProcess)
+                            setBlocking(true);
+                        skipValidation = true;
+                        self.showHelp('log');
+                        self.exit(0);
+                    }
+                    else if (key === versionOpt && argv[key]) {
+                        if (exitProcess)
+                            setBlocking(true);
+                        skipValidation = true;
+                        usage.showVersion();
+                        self.exit(0);
+                    }
+                });
+            }
+            // Check if any of the options to skip validation were provided
+            if (!skipValidation && options.skipValidation.length > 0) {
+                skipValidation = Object.keys(argv).some(key => options.skipValidation.indexOf(key) >= 0 && argv[key] === true);
+            }
+            // If the help or version options where used and exitProcess is false,
+            // or if explicitly skipped, we won't run validations.
+            if (!skipValidation) {
+                if (parsed.error)
+                    throw new yerror_1.YError(parsed.error.message);
+                // if we're executed via bash completion, don't
+                // bother with validation.
+                if (!requestCompletions) {
+                    self._runValidation(argv, aliases, {}, parsed.error);
+                }
+            }
+        }
+        catch (err) {
+            if (err instanceof yerror_1.YError)
+                usage.fail(err.message, err);
+            else
+                throw err;
+        }
+        return (populateDoubleDash || _calledFromCommand) ? argv : self._copyDoubleDash(argv);
+    };
+    // to simplify the parsing of positionals in commands,
+    // we temporarily populate '--' rather than _, with arguments
+    // after the '--' directive. After the parse, we copy these back.
+    self._copyDoubleDash = function (argv) {
+        if (is_promise_1.isPromise(argv) || !argv._ || !argv['--'])
+            return argv;
+        argv._.push.apply(argv._, argv['--']);
+        // TODO(bcoe): refactor command parsing such that this delete is not
+        // necessary: https://github.com/yargs/yargs/issues/1482
+        try {
+            delete argv['--'];
+        }
+        catch (_err) { }
+        return argv;
+    };
+    self._runValidation = function runValidation(argv, aliases, positionalMap, parseErrors, isDefaultCommand = false) {
+        if (parseErrors)
+            throw new yerror_1.YError(parseErrors.message);
+        validation.nonOptionCount(argv);
+        validation.requiredArguments(argv);
+        let failedStrictCommands = false;
+        if (strictCommands) {
+            failedStrictCommands = validation.unknownCommands(argv);
+        }
+        if (strict && !failedStrictCommands) {
+            validation.unknownArguments(argv, aliases, positionalMap, isDefaultCommand);
+        }
+        validation.customChecks(argv, aliases);
+        validation.limitedChoices(argv);
+        validation.implications(argv);
+        validation.conflicting(argv);
+    };
+    function guessLocale() {
+        if (!detectLocale)
+            return;
+        const locale = process.env.LC_ALL || process.env.LC_MESSAGES || process.env.LANG || process.env.LANGUAGE || 'en_US';
+        self.locale(locale.replace(/[.:].*/, ''));
+    }
+    // an app should almost always have --version and --help,
+    // if you *really* want to disable this use .help(false)/.version(false).
+    self.help();
+    self.version();
+    return self;
+}
+exports.Yargs = Yargs;
+// rebase an absolute path to a relative one with respect to a base directory
+// exported for tests
+function rebase(base, dir) {
+    return path.relative(base, dir);
+}
+exports.rebase = rebase;
+function isYargsInstance(y) {
+    return !!y && (typeof y._parseArgs === 'function');
+}
+exports.isYargsInstance = isYargsInstance;
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/yerror.d.ts b/node_modules/jest-circus/node_modules/yargs/build/lib/yerror.d.ts
new file mode 100644
index 0000000..024d0c7
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/yerror.d.ts
@@ -0,0 +1,4 @@
+export declare class YError extends Error {
+    name: string;
+    constructor(msg?: string | null);
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/build/lib/yerror.js b/node_modules/jest-circus/node_modules/yargs/build/lib/yerror.js
new file mode 100644
index 0000000..0fa146e
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/build/lib/yerror.js
@@ -0,0 +1,11 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.YError = void 0;
+class YError extends Error {
+    constructor(msg) {
+        super(msg || 'yargs error');
+        this.name = 'YError';
+        Error.captureStackTrace(this, YError);
+    }
+}
+exports.YError = YError;
diff --git a/node_modules/jest-circus/node_modules/yargs/index.js b/node_modules/jest-circus/node_modules/yargs/index.js
new file mode 100644
index 0000000..7dc62de
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/index.js
@@ -0,0 +1,40 @@
+'use strict'
+// classic singleton yargs API, to use yargs
+// without running as a singleton do:
+// require('yargs/yargs')(process.argv.slice(2))
+const yargs = require('./yargs')
+const processArgv = require('./build/lib/process-argv')
+
+Argv(processArgv.getProcessArgvWithoutBin())
+
+module.exports = Argv
+
+function Argv (processArgs, cwd) {
+  const argv = yargs(processArgs, cwd, require)
+  singletonify(argv)
+  return argv
+}
+
+/*  Hack an instance of Argv with process.argv into Argv
+    so people can do
+    require('yargs')(['--beeble=1','-z','zizzle']).argv
+    to parse a list of args and
+    require('yargs').argv
+    to get a parsed version of process.argv.
+*/
+function singletonify (inst) {
+  Object.keys(inst).forEach((key) => {
+    if (key === 'argv') {
+      Argv.__defineGetter__(key, inst.__lookupGetter__(key))
+    } else if (typeof inst[key] === 'function') {
+      Argv[key] = inst[key].bind(inst)
+    } else {
+      Argv.__defineGetter__('$0', () => {
+        return inst.$0
+      })
+      Argv.__defineGetter__('parsed', () => {
+        return inst.parsed
+      })
+    }
+  })
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/be.json b/node_modules/jest-circus/node_modules/yargs/locales/be.json
new file mode 100644
index 0000000..e28fa30
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/be.json
@@ -0,0 +1,46 @@
+{
+  "Commands:": "Каманды:",
+  "Options:": "Опцыі:",
+  "Examples:": "Прыклады:",
+  "boolean": "булевы тып",
+  "count": "падлік",
+  "string": "радковы тып",
+  "number": "лік",
+  "array": "масіў",
+  "required": "неабходна",
+  "default": "па змаўчанні",
+  "default:": "па змаўчанні:",
+  "choices:": "магчымасці:",
+  "aliases:": "аліасы:",
+  "generated-value": "згенераванае значэнне",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Недастаткова неапцыйных аргументаў: ёсць %s, трэба як мінімум %s",
+    "other": "Недастаткова неапцыйных аргументаў: ёсць %s, трэба як мінімум %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Занадта шмат неапцыйных аргументаў: ёсць %s, максімум дапушчальна %s",
+    "other": "Занадта шмат неапцыйных аргументаў: ёсць %s, максімум дапушчальна %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Не хапае значэння аргументу: %s",
+    "other": "Не хапае значэнняў аргументаў: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Не хапае неабходнага аргументу: %s",
+    "other": "Не хапае неабходных аргументаў: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Невядомы аргумент: %s",
+    "other": "Невядомыя аргументы: %s"
+  },
+  "Invalid values:": "Несапраўдныя значэння:",
+  "Argument: %s, Given: %s, Choices: %s": "Аргумент: %s, Дадзенае значэнне: %s, Магчымасці: %s",
+  "Argument check failed: %s": "Праверка аргументаў не ўдалася: %s",
+  "Implications failed:": "Дадзены аргумент патрабуе наступны дадатковы аргумент:",
+  "Not enough arguments following: %s": "Недастаткова наступных аргументаў: %s",
+  "Invalid JSON config file: %s": "Несапраўдны файл канфігурацыі JSON: %s",
+  "Path to JSON config file": "Шлях да файла канфігурацыі JSON",
+  "Show help": "Паказаць дапамогу",
+  "Show version number": "Паказаць нумар версіі",
+  "Did you mean %s?": "Вы мелі на ўвазе %s?"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/de.json b/node_modules/jest-circus/node_modules/yargs/locales/de.json
new file mode 100644
index 0000000..dc73ec3
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/de.json
@@ -0,0 +1,46 @@
+{
+  "Commands:": "Kommandos:",
+  "Options:": "Optionen:",
+  "Examples:": "Beispiele:",
+  "boolean": "boolean",
+  "count": "Zähler",
+  "string": "string",
+  "number": "Zahl",
+  "array": "array",
+  "required": "erforderlich",
+  "default": "Standard",
+  "default:": "Standard:",
+  "choices:": "Möglichkeiten:",
+  "aliases:": "Aliase:",
+  "generated-value": "Generierter-Wert",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Nicht genügend Argumente ohne Optionen: %s vorhanden, mindestens %s benötigt",
+    "other": "Nicht genügend Argumente ohne Optionen: %s vorhanden, mindestens %s benötigt"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Zu viele Argumente ohne Optionen: %s vorhanden, maximal %s erlaubt",
+    "other": "Zu viele Argumente ohne Optionen: %s vorhanden, maximal %s erlaubt"
+  },
+  "Missing argument value: %s": {
+    "one": "Fehlender Argumentwert: %s",
+    "other": "Fehlende Argumentwerte: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Fehlendes Argument: %s",
+    "other": "Fehlende Argumente: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Unbekanntes Argument: %s",
+    "other": "Unbekannte Argumente: %s"
+  },
+  "Invalid values:": "Unzulässige Werte:",
+  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gegeben: %s, Möglichkeiten: %s",
+  "Argument check failed: %s": "Argumente-Check fehlgeschlagen: %s",
+  "Implications failed:": "Fehlende abhängige Argumente:",
+  "Not enough arguments following: %s": "Nicht genügend Argumente nach: %s",
+  "Invalid JSON config file: %s": "Fehlerhafte JSON-Config Datei: %s",
+  "Path to JSON config file": "Pfad zur JSON-Config Datei",
+  "Show help": "Hilfe anzeigen",
+  "Show version number": "Version anzeigen",
+  "Did you mean %s?": "Meintest du %s?"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/en.json b/node_modules/jest-circus/node_modules/yargs/locales/en.json
new file mode 100644
index 0000000..d794947
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/en.json
@@ -0,0 +1,51 @@
+{
+  "Commands:": "Commands:",
+  "Options:": "Options:",
+  "Examples:": "Examples:",
+  "boolean": "boolean",
+  "count": "count",
+  "string": "string",
+  "number": "number",
+  "array": "array",
+  "required": "required",
+  "default": "default",
+  "default:": "default:",
+  "choices:": "choices:",
+  "aliases:": "aliases:",
+  "generated-value": "generated-value",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Not enough non-option arguments: got %s, need at least %s",
+    "other": "Not enough non-option arguments: got %s, need at least %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Too many non-option arguments: got %s, maximum of %s",
+    "other": "Too many non-option arguments: got %s, maximum of %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Missing argument value: %s",
+    "other": "Missing argument values: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Missing required argument: %s",
+    "other": "Missing required arguments: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Unknown argument: %s",
+    "other": "Unknown arguments: %s"
+  },
+  "Invalid values:": "Invalid values:",
+  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Given: %s, Choices: %s",
+  "Argument check failed: %s": "Argument check failed: %s",
+  "Implications failed:": "Missing dependent arguments:",
+  "Not enough arguments following: %s": "Not enough arguments following: %s",
+  "Invalid JSON config file: %s": "Invalid JSON config file: %s",
+  "Path to JSON config file": "Path to JSON config file",
+  "Show help": "Show help",
+  "Show version number": "Show version number",
+  "Did you mean %s?": "Did you mean %s?",
+  "Arguments %s and %s are mutually exclusive" : "Arguments %s and %s are mutually exclusive",
+  "Positionals:": "Positionals:",
+  "command": "command",
+  "deprecated": "deprecated",
+  "deprecated: %s": "deprecated: %s"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/es.json b/node_modules/jest-circus/node_modules/yargs/locales/es.json
new file mode 100644
index 0000000..d77b461
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/es.json
@@ -0,0 +1,46 @@
+{
+  "Commands:": "Comandos:",
+  "Options:": "Opciones:",
+  "Examples:": "Ejemplos:",
+  "boolean": "booleano",
+  "count": "cuenta",
+  "string": "cadena de caracteres",
+  "number": "número",
+  "array": "tabla",
+  "required": "requerido",
+  "default": "defecto",
+  "default:": "defecto:",
+  "choices:": "selección:",
+  "aliases:": "alias:",
+  "generated-value": "valor-generado",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Hacen falta argumentos no-opcionales: Número recibido %s, necesita por lo menos %s",
+    "other": "Hacen falta argumentos no-opcionales: Número recibido %s, necesita por lo menos %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Demasiados argumentos no-opcionales: Número recibido %s, máximo es %s",
+    "other": "Demasiados argumentos no-opcionales: Número recibido %s, máximo es %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Falta argumento: %s",
+    "other": "Faltan argumentos: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Falta argumento requerido: %s",
+    "other": "Faltan argumentos requeridos: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Argumento desconocido: %s",
+    "other": "Argumentos desconocidos: %s"
+  },
+  "Invalid values:": "Valores inválidos:",
+  "Argument: %s, Given: %s, Choices: %s": "Argumento: %s, Recibido: %s, Seleccionados: %s",
+  "Argument check failed: %s": "Verificación de argumento ha fallado: %s",
+  "Implications failed:": "Implicaciones fallidas:",
+  "Not enough arguments following: %s": "No hay suficientes argumentos después de: %s",
+  "Invalid JSON config file: %s": "Archivo de configuración JSON inválido: %s",
+  "Path to JSON config file": "Ruta al archivo de configuración JSON",
+  "Show help": "Muestra ayuda",
+  "Show version number": "Muestra número de versión",
+  "Did you mean %s?": "Quisiste decir %s?"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/fi.json b/node_modules/jest-circus/node_modules/yargs/locales/fi.json
new file mode 100644
index 0000000..0728c57
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/fi.json
@@ -0,0 +1,49 @@
+{
+  "Commands:": "Komennot:",
+  "Options:": "Valinnat:",
+  "Examples:": "Esimerkkejä:",
+  "boolean": "totuusarvo",
+  "count": "lukumäärä",
+  "string": "merkkijono",
+  "number": "numero",
+  "array": "taulukko",
+  "required": "pakollinen",
+  "default": "oletusarvo",
+  "default:": "oletusarvo:",
+  "choices:": "vaihtoehdot:",
+  "aliases:": "aliakset:",
+  "generated-value": "generoitu-arvo",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Liian vähän argumentteja, jotka eivät ole valintoja: annettu %s, vaaditaan vähintään %s",
+    "other": "Liian vähän argumentteja, jotka eivät ole valintoja: annettu %s, vaaditaan vähintään %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Liikaa argumentteja, jotka eivät ole valintoja: annettu %s, sallitaan enintään %s",
+    "other": "Liikaa argumentteja, jotka eivät ole valintoja: annettu %s, sallitaan enintään %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Argumentin arvo puuttuu: %s",
+    "other": "Argumentin arvot puuttuvat: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Pakollinen argumentti puuttuu: %s",
+    "other": "Pakollisia argumentteja puuttuu: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Tuntematon argumenttn: %s",
+    "other": "Tuntemattomia argumentteja: %s"
+  },
+  "Invalid values:": "Virheelliset arvot:",
+  "Argument: %s, Given: %s, Choices: %s": "Argumentti: %s, Annettu: %s, Vaihtoehdot: %s",
+  "Argument check failed: %s": "Argumentin tarkistus epäonnistui: %s",
+  "Implications failed:": "Riippuvia argumentteja puuttuu:",
+  "Not enough arguments following: %s": "Argumentin perässä ei ole tarpeeksi argumentteja: %s",
+  "Invalid JSON config file: %s": "Epävalidi JSON-asetustiedosto: %s",
+  "Path to JSON config file": "JSON-asetustiedoston polku",
+  "Show help": "Näytä ohje",
+  "Show version number": "Näytä versionumero",
+  "Did you mean %s?": "Tarkoititko %s?",
+  "Arguments %s and %s are mutually exclusive" : "Argumentit %s ja %s eivät ole yhteensopivat",
+  "Positionals:": "Sijaintiparametrit:",
+  "command": "komento"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/fr.json b/node_modules/jest-circus/node_modules/yargs/locales/fr.json
new file mode 100644
index 0000000..edd743f
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/fr.json
@@ -0,0 +1,53 @@
+{
+  "Commands:": "Commandes :",
+  "Options:": "Options :",
+  "Examples:": "Exemples :",
+  "boolean": "booléen",
+  "count": "compteur",
+  "string": "chaîne de caractères",
+  "number": "nombre",
+  "array": "tableau",
+  "required": "requis",
+  "default": "défaut",
+  "default:": "défaut :",
+  "choices:": "choix :",
+  "aliases:": "alias :",
+  "generated-value": "valeur générée",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Pas assez d'arguments (hors options) : reçu %s, besoin d'au moins %s",
+    "other": "Pas assez d'arguments (hors options) : reçus %s, besoin d'au moins %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Trop d'arguments (hors options) : reçu %s, maximum de %s",
+    "other": "Trop d'arguments (hors options) : reçus %s, maximum de %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Argument manquant : %s",
+    "other": "Arguments manquants : %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Argument requis manquant : %s",
+    "other": "Arguments requis manquants : %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Argument inconnu : %s",
+    "other": "Arguments inconnus : %s"
+  },
+  "Unknown command: %s": {
+    "one": "Commande inconnue : %s",
+    "other": "Commandes inconnues : %s"
+  },
+  "Invalid values:": "Valeurs invalides :",
+  "Argument: %s, Given: %s, Choices: %s": "Argument : %s, donné : %s, choix : %s",
+  "Argument check failed: %s": "Echec de la vérification de l'argument : %s",
+  "Implications failed:": "Arguments dépendants manquants :",
+  "Not enough arguments following: %s": "Pas assez d'arguments après : %s",
+  "Invalid JSON config file: %s": "Fichier de configuration JSON invalide : %s",
+  "Path to JSON config file": "Chemin du fichier de configuration JSON",
+  "Show help": "Affiche l'aide",
+  "Show version number": "Affiche le numéro de version",
+  "Did you mean %s?": "Vouliez-vous dire %s ?",
+  "Arguments %s and %s are mutually exclusive" : "Les arguments %s et %s sont mutuellement exclusifs",
+  "Positionals:": "Arguments positionnels :",
+  "command": "commande"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/hi.json b/node_modules/jest-circus/node_modules/yargs/locales/hi.json
new file mode 100644
index 0000000..a9de77c
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/hi.json
@@ -0,0 +1,49 @@
+{
+  "Commands:": "आदेश:",
+  "Options:": "विकल्प:",
+  "Examples:": "उदाहरण:",
+  "boolean": "सत्यता",
+  "count": "संख्या",
+  "string": "वर्णों का तार ",
+  "number": "अंक",
+  "array": "सरणी",
+  "required": "आवश्यक",
+  "default": "डिफॉल्ट",
+  "default:": "डिफॉल्ट:",
+  "choices:": "विकल्प:",
+  "aliases:": "उपनाम:",
+  "generated-value": "उत्पन्न-मूल्य",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "पर्याप्त गैर-विकल्प तर्क प्राप्त नहीं: %s प्राप्त, कम से कम %s की आवश्यकता है",
+    "other": "पर्याप्त गैर-विकल्प तर्क प्राप्त नहीं: %s प्राप्त, कम से कम %s की आवश्यकता है"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "बहुत सारे गैर-विकल्प तर्क: %s प्राप्त, अधिकतम %s मान्य",
+    "other": "बहुत सारे गैर-विकल्प तर्क: %s प्राप्त, अधिकतम %s मान्य"
+  },
+  "Missing argument value: %s": {
+    "one": "कुछ तर्को के मूल्य गुम हैं: %s",
+    "other": "कुछ तर्को के मूल्य गुम हैं: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "आवश्यक तर्क गुम हैं: %s",
+    "other": "आवश्यक तर्क गुम हैं: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "अज्ञात तर्क प्राप्त: %s",
+    "other": "अज्ञात तर्क प्राप्त: %s"
+  },
+  "Invalid values:": "अमान्य मूल्य:",
+  "Argument: %s, Given: %s, Choices: %s": "तर्क: %s, प्राप्त: %s, विकल्प: %s",
+  "Argument check failed: %s": "तर्क जांच विफल: %s",
+  "Implications failed:": "दिए गए तर्क के लिए अतिरिक्त तर्क की अपेक्षा है:",
+  "Not enough arguments following: %s": "निम्नलिखित के बाद पर्याप्त तर्क नहीं प्राप्त: %s",
+  "Invalid JSON config file: %s": "अमान्य JSON config फाइल: %s",
+  "Path to JSON config file": "JSON config फाइल का पथ",
+  "Show help": "सहायता दिखाएँ",
+  "Show version number": "Version संख्या दिखाएँ",
+  "Did you mean %s?": "क्या आपका मतलब है %s?",
+  "Arguments %s and %s are mutually exclusive" : "तर्क %s और %s परस्पर अनन्य हैं",
+  "Positionals:": "स्थानीय:",
+  "command": "आदेश"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/hu.json b/node_modules/jest-circus/node_modules/yargs/locales/hu.json
new file mode 100644
index 0000000..21492d0
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/hu.json
@@ -0,0 +1,46 @@
+{
+  "Commands:": "Parancsok:",
+  "Options:": "Opciók:",
+  "Examples:": "Példák:",
+  "boolean": "boolean",
+  "count": "számláló",
+  "string": "szöveg",
+  "number": "szám",
+  "array": "tömb",
+  "required": "kötelező",
+  "default": "alapértelmezett",
+  "default:": "alapértelmezett:",
+  "choices:": "lehetőségek:",
+  "aliases:": "aliaszok:",
+  "generated-value": "generált-érték",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Nincs elég nem opcionális argumentum: %s van, legalább %s kell",
+    "other": "Nincs elég nem opcionális argumentum: %s van, legalább %s kell"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Túl sok nem opciánlis argumentum van: %s van, maximum %s lehet",
+    "other": "Túl sok nem opciánlis argumentum van: %s van, maximum %s lehet"
+  },
+  "Missing argument value: %s": {
+    "one": "Hiányzó argumentum érték: %s",
+    "other": "Hiányzó argumentum értékek: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Hiányzó kötelező argumentum: %s",
+    "other": "Hiányzó kötelező argumentumok: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Ismeretlen argumentum: %s",
+    "other": "Ismeretlen argumentumok: %s"
+  },
+  "Invalid values:": "Érvénytelen érték:",
+  "Argument: %s, Given: %s, Choices: %s": "Argumentum: %s, Megadott: %s, Lehetőségek: %s",
+  "Argument check failed: %s": "Argumentum ellenőrzés sikertelen: %s",
+  "Implications failed:": "Implikációk sikertelenek:",
+  "Not enough arguments following: %s": "Nem elég argumentum követi: %s",
+  "Invalid JSON config file: %s": "Érvénytelen JSON konfigurációs file: %s",
+  "Path to JSON config file": "JSON konfigurációs file helye",
+  "Show help": "Súgo megjelenítése",
+  "Show version number": "Verziószám megjelenítése",
+  "Did you mean %s?": "Erre gondoltál %s?"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/id.json b/node_modules/jest-circus/node_modules/yargs/locales/id.json
new file mode 100644
index 0000000..125867c
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/id.json
@@ -0,0 +1,50 @@
+
+{
+  "Commands:": "Perintah:",
+  "Options:": "Pilihan:",
+  "Examples:": "Contoh:",
+  "boolean": "boolean",
+  "count": "jumlah",
+  "number": "nomor",
+  "string": "string",
+  "array": "larik",
+  "required": "diperlukan",
+  "default": "bawaan",
+  "default:": "bawaan:",
+  "aliases:": "istilah lain:",
+  "choices:": "pilihan:",
+  "generated-value": "nilai-yang-dihasilkan",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Argumen wajib kurang: hanya %s, minimal %s",
+    "other": "Argumen wajib kurang: hanya %s, minimal %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Terlalu banyak argumen wajib: ada %s, maksimal %s",
+    "other": "Terlalu banyak argumen wajib: ada %s, maksimal %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Kurang argumen: %s",
+    "other": "Kurang argumen: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Kurang argumen wajib: %s",
+    "other": "Kurang argumen wajib: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Argumen tak diketahui: %s",
+    "other": "Argumen tak diketahui: %s"
+  },
+  "Invalid values:": "Nilai-nilai tidak valid:",
+  "Argument: %s, Given: %s, Choices: %s": "Argumen: %s, Diberikan: %s, Pilihan: %s",
+  "Argument check failed: %s": "Pemeriksaan argument gagal: %s",
+  "Implications failed:": "Implikasi gagal:",
+  "Not enough arguments following: %s": "Kurang argumen untuk: %s",
+  "Invalid JSON config file: %s": "Berkas konfigurasi JSON tidak valid: %s",
+  "Path to JSON config file": "Alamat berkas konfigurasi JSON",
+  "Show help": "Lihat bantuan",
+  "Show version number": "Lihat nomor versi",
+  "Did you mean %s?": "Maksud Anda: %s?",
+  "Arguments %s and %s are mutually exclusive" : "Argumen %s dan %s saling eksklusif",
+  "Positionals:": "Posisional-posisional:",
+  "command": "perintah"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/it.json b/node_modules/jest-circus/node_modules/yargs/locales/it.json
new file mode 100644
index 0000000..fde5756
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/it.json
@@ -0,0 +1,46 @@
+{
+  "Commands:": "Comandi:",
+  "Options:": "Opzioni:",
+  "Examples:": "Esempi:",
+  "boolean": "booleano",
+  "count": "contatore",
+  "string": "stringa",
+  "number": "numero",
+  "array": "vettore",
+  "required": "richiesto",
+  "default": "predefinito",
+  "default:": "predefinito:",
+  "choices:": "scelte:",
+  "aliases:": "alias:",
+  "generated-value": "valore generato",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Numero insufficiente di argomenti non opzione: inseriti %s, richiesti almeno %s",
+    "other": "Numero insufficiente di argomenti non opzione: inseriti %s, richiesti almeno %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Troppi argomenti non opzione: inseriti %s, massimo possibile %s",
+    "other": "Troppi argomenti non opzione: inseriti %s, massimo possibile %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Argomento mancante: %s",
+    "other": "Argomenti mancanti: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Argomento richiesto mancante: %s",
+    "other": "Argomenti richiesti mancanti: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Argomento sconosciuto: %s",
+    "other": "Argomenti sconosciuti: %s"
+  },
+  "Invalid values:": "Valori non validi:",
+  "Argument: %s, Given: %s, Choices: %s": "Argomento: %s, Richiesto: %s, Scelte: %s",
+  "Argument check failed: %s": "Controllo dell'argomento fallito: %s",
+  "Implications failed:": "Argomenti dipendenti mancanti:",
+  "Not enough arguments following: %s": "Argomenti insufficienti dopo: %s",
+  "Invalid JSON config file: %s": "File di configurazione JSON non valido: %s",
+  "Path to JSON config file": "Percorso del file di configurazione JSON",
+  "Show help": "Mostra la schermata di aiuto",
+  "Show version number": "Mostra il numero di versione",
+  "Did you mean %s?": "Intendi forse %s?"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/ja.json b/node_modules/jest-circus/node_modules/yargs/locales/ja.json
new file mode 100644
index 0000000..3954ae6
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/ja.json
@@ -0,0 +1,51 @@
+{
+  "Commands:": "コマンド:",
+  "Options:": "オプション:",
+  "Examples:": "例:",
+  "boolean": "真偽",
+  "count": "カウント",
+  "string": "文字列",
+  "number": "数値",
+  "array": "配列",
+  "required": "必須",
+  "default": "デフォルト",
+  "default:": "デフォルト:",
+  "choices:": "選択してください:",
+  "aliases:": "エイリアス:",
+  "generated-value": "生成された値",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "オプションではない引数が %s 個では不足しています。少なくとも %s 個の引数が必要です:",
+    "other": "オプションではない引数が %s 個では不足しています。少なくとも %s 個の引数が必要です:"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "オプションではない引数が %s 個では多すぎます。最大で %s 個までです:",
+    "other": "オプションではない引数が %s 個では多すぎます。最大で %s 個までです:"
+  },
+  "Missing argument value: %s": {
+    "one": "引数の値が見つかりません: %s",
+    "other": "引数の値が見つかりません: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "必須の引数が見つかりません: %s",
+    "other": "必須の引数が見つかりません: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "未知の引数です: %s",
+    "other": "未知の引数です: %s"
+  },
+  "Invalid values:": "不正な値です:",
+  "Argument: %s, Given: %s, Choices: %s": "引数は %s です。与えられた値: %s, 選択してください: %s",
+  "Argument check failed: %s": "引数のチェックに失敗しました: %s",
+  "Implications failed:": "オプションの組み合わせで不正が生じました:",
+  "Not enough arguments following: %s": "次の引数が不足しています。: %s",
+  "Invalid JSON config file: %s": "JSONの設定ファイルが不正です: %s",
+  "Path to JSON config file": "JSONの設定ファイルまでのpath",
+  "Show help": "ヘルプを表示",
+  "Show version number": "バージョンを表示",
+  "Did you mean %s?": "もしかして %s?",
+  "Arguments %s and %s are mutually exclusive" : "引数 %s と %s は同時に指定できません",
+  "Positionals:": "位置:",
+  "command": "コマンド",
+  "deprecated": "非推奨",
+  "deprecated: %s": "非推奨: %s"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/ko.json b/node_modules/jest-circus/node_modules/yargs/locales/ko.json
new file mode 100644
index 0000000..e3187ea
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/ko.json
@@ -0,0 +1,49 @@
+{
+  "Commands:": "명령:",
+  "Options:": "옵션:",
+  "Examples:": "예시:",
+  "boolean": "여부",
+  "count": "개수",
+  "string": "문자열",
+  "number": "숫자",
+  "array": "배열",
+  "required": "필수",
+  "default": "기본",
+  "default:": "기본:",
+  "choices:": "선택:",
+  "aliases:": "별칭:",
+  "generated-value": "생성된 값",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "옵션이 아닌 인자가 충분치 않습니다: %s개를 받았지만, 적어도 %s개는 필요합니다",
+    "other": "옵션이 아닌 인자가 충분치 않습니다: %s개를 받았지만, 적어도 %s개는 필요합니다"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "옵션이 아닌 인자가 너무 많습니다: %s개를 받았지만, %s개 이하여야 합니다",
+    "other": "옵션이 아닌 인자가 너무 많습니다: %s개를 받았지만, %s개 이하여야 합니다"
+  },
+  "Missing argument value: %s": {
+    "one": "인자값을 받지 못했습니다: %s",
+    "other": "인자값들을 받지 못했습니다: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "필수 인자를 받지 못했습니다: %s",
+    "other": "필수 인자들을 받지 못했습니다: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "알 수 없는 인자입니다: %s",
+    "other": "알 수 없는 인자들입니다: %s"
+  },
+  "Invalid values:": "잘못된 값입니다:",
+  "Argument: %s, Given: %s, Choices: %s": "인자: %s, 입력받은 값: %s, 선택지: %s",
+  "Argument check failed: %s": "유효하지 않은 인자입니다: %s",
+  "Implications failed:": "옵션의 조합이 잘못되었습니다:",
+  "Not enough arguments following: %s": "인자가 충분하게 주어지지 않았습니다: %s",
+  "Invalid JSON config file: %s": "유효하지 않은 JSON 설정파일입니다: %s",
+  "Path to JSON config file": "JSON 설정파일 경로",
+  "Show help": "도움말을 보여줍니다",
+  "Show version number": "버전 넘버를 보여줍니다",
+  "Did you mean %s?": "찾고계신게 %s입니까?",
+  "Arguments %s and %s are mutually exclusive" : "%s와 %s 인자는 같이 사용될 수 없습니다",
+  "Positionals:": "위치:",
+  "command": "명령"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/nb.json b/node_modules/jest-circus/node_modules/yargs/locales/nb.json
new file mode 100644
index 0000000..6f410ed
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/nb.json
@@ -0,0 +1,44 @@
+{
+  "Commands:": "Kommandoer:",
+  "Options:": "Alternativer:",
+  "Examples:": "Eksempler:",
+  "boolean": "boolsk",
+  "count": "antall",
+  "string": "streng",
+  "number": "nummer",
+  "array": "matrise",
+  "required": "obligatorisk",
+  "default": "standard",
+  "default:": "standard:",
+  "choices:": "valg:",
+  "generated-value": "generert-verdi",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Ikke nok ikke-alternativ argumenter: fikk %s, trenger minst %s",
+    "other": "Ikke nok ikke-alternativ argumenter: fikk %s, trenger minst %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "For mange ikke-alternativ argumenter: fikk %s, maksimum %s",
+    "other": "For mange ikke-alternativ argumenter: fikk %s, maksimum %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Mangler argument verdi: %s",
+    "other": "Mangler argument verdier: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Mangler obligatorisk argument: %s",
+    "other": "Mangler obligatoriske argumenter: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Ukjent argument: %s",
+    "other": "Ukjente argumenter: %s"
+  },
+  "Invalid values:": "Ugyldige verdier:",
+  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gitt: %s, Valg: %s",
+  "Argument check failed: %s": "Argumentsjekk mislyktes: %s",
+  "Implications failed:": "Konsekvensene mislyktes:",
+  "Not enough arguments following: %s": "Ikke nok følgende argumenter: %s",
+  "Invalid JSON config file: %s": "Ugyldig JSON konfigurasjonsfil: %s",
+  "Path to JSON config file": "Bane til JSON konfigurasjonsfil",
+  "Show help": "Vis hjelp",
+  "Show version number": "Vis versjonsnummer"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/nl.json b/node_modules/jest-circus/node_modules/yargs/locales/nl.json
new file mode 100644
index 0000000..9ff95c5
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/nl.json
@@ -0,0 +1,49 @@
+{
+  "Commands:": "Commando's:",
+  "Options:": "Opties:",
+  "Examples:": "Voorbeelden:",
+  "boolean": "booleaans",
+  "count": "aantal",
+  "string": "string",
+  "number": "getal",
+  "array": "lijst",
+  "required": "verplicht",
+  "default": "standaard",
+  "default:": "standaard:",
+  "choices:": "keuzes:",
+  "aliases:": "aliassen:",
+  "generated-value": "gegenereerde waarde",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Niet genoeg niet-optie-argumenten: %s gekregen, minstens %s nodig",
+    "other": "Niet genoeg niet-optie-argumenten: %s gekregen, minstens %s nodig"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Te veel niet-optie-argumenten: %s gekregen, maximum is %s",
+    "other": "Te veel niet-optie-argumenten: %s gekregen, maximum is %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Missende argumentwaarde: %s",
+    "other": "Missende argumentwaarden: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Missend verplicht argument: %s",
+    "other": "Missende verplichte argumenten: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Onbekend argument: %s",
+    "other": "Onbekende argumenten: %s"
+  },
+  "Invalid values:": "Ongeldige waarden:",
+  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gegeven: %s, Keuzes: %s",
+  "Argument check failed: %s": "Argumentcontrole mislukt: %s",
+  "Implications failed:": "Ontbrekende afhankelijke argumenten:",
+  "Not enough arguments following: %s": "Niet genoeg argumenten na: %s",
+  "Invalid JSON config file: %s": "Ongeldig JSON-config-bestand: %s",
+  "Path to JSON config file": "Pad naar JSON-config-bestand",
+  "Show help": "Toon help",
+  "Show version number": "Toon versienummer",
+  "Did you mean %s?": "Bedoelde u misschien %s?",
+  "Arguments %s and %s are mutually exclusive": "Argumenten %s en %s kunnen niet tegelijk gebruikt worden",
+  "Positionals:": "Positie-afhankelijke argumenten",
+  "command": "commando"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/nn.json b/node_modules/jest-circus/node_modules/yargs/locales/nn.json
new file mode 100644
index 0000000..24479ac
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/nn.json
@@ -0,0 +1,44 @@
+{
+  "Commands:": "Kommandoar:",
+  "Options:": "Alternativ:",
+  "Examples:": "Døme:",
+  "boolean": "boolsk",
+  "count": "mengd",
+  "string": "streng",
+  "number": "nummer",
+  "array": "matrise",
+  "required": "obligatorisk",
+  "default": "standard",
+  "default:": "standard:",
+  "choices:": "val:",
+  "generated-value": "generert-verdi",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Ikkje nok ikkje-alternativ argument: fekk %s, treng minst %s",
+    "other": "Ikkje nok ikkje-alternativ argument: fekk %s, treng minst %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "For mange ikkje-alternativ argument: fekk %s, maksimum %s",
+    "other": "For mange ikkje-alternativ argument: fekk %s, maksimum %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Manglar argumentverdi: %s",
+    "other": "Manglar argumentverdiar: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Manglar obligatorisk argument: %s",
+    "other": "Manglar obligatoriske argument: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Ukjent argument: %s",
+    "other": "Ukjende argument: %s"
+  },
+  "Invalid values:": "Ugyldige verdiar:",
+  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gjeve: %s, Val: %s",
+  "Argument check failed: %s": "Argumentsjekk mislukkast: %s",
+  "Implications failed:": "Konsekvensane mislukkast:",
+  "Not enough arguments following: %s": "Ikkje nok fylgjande argument: %s",
+  "Invalid JSON config file: %s": "Ugyldig JSON konfigurasjonsfil: %s",
+  "Path to JSON config file": "Bane til JSON konfigurasjonsfil",
+  "Show help": "Vis hjelp",
+  "Show version number": "Vis versjonsnummer"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/pirate.json b/node_modules/jest-circus/node_modules/yargs/locales/pirate.json
new file mode 100644
index 0000000..dcb5cb7
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/pirate.json
@@ -0,0 +1,13 @@
+{
+  "Commands:": "Choose yer command:",
+  "Options:": "Options for me hearties!",
+  "Examples:": "Ex. marks the spot:",
+  "required": "requi-yar-ed",
+  "Missing required argument: %s": {
+    "one": "Ye be havin' to set the followin' argument land lubber: %s",
+    "other": "Ye be havin' to set the followin' arguments land lubber: %s"
+  },
+  "Show help": "Parlay this here code of conduct",
+  "Show version number": "'Tis the version ye be askin' fer",
+  "Arguments %s and %s are mutually exclusive" : "Yon scurvy dogs %s and %s be as bad as rum and a prudish wench"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/pl.json b/node_modules/jest-circus/node_modules/yargs/locales/pl.json
new file mode 100644
index 0000000..a41d4bd
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/pl.json
@@ -0,0 +1,49 @@
+{
+  "Commands:": "Polecenia:",
+  "Options:": "Opcje:",
+  "Examples:": "Przykłady:",
+  "boolean": "boolean",
+  "count": "ilość",
+  "string": "ciąg znaków",
+  "number": "liczba",
+  "array": "tablica",
+  "required": "wymagany",
+  "default": "domyślny",
+  "default:": "domyślny:",
+  "choices:": "dostępne:",
+  "aliases:": "aliasy:",
+  "generated-value": "wygenerowana-wartość",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Niewystarczająca ilość argumentów: otrzymano %s, wymagane co najmniej %s",
+    "other": "Niewystarczająca ilość argumentów: otrzymano %s, wymagane co najmniej %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Zbyt duża ilość argumentów: otrzymano %s, wymagane co najwyżej %s",
+    "other": "Zbyt duża ilość argumentów: otrzymano %s, wymagane co najwyżej %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Brak wartości dla argumentu: %s",
+    "other": "Brak wartości dla argumentów: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Brak wymaganego argumentu: %s",
+    "other": "Brak wymaganych argumentów: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Nieznany argument: %s",
+    "other": "Nieznane argumenty: %s"
+  },
+  "Invalid values:": "Nieprawidłowe wartości:",
+  "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Otrzymano: %s, Dostępne: %s",
+  "Argument check failed: %s": "Weryfikacja argumentów nie powiodła się: %s",
+  "Implications failed:": "Założenia nie zostały spełnione:",
+  "Not enough arguments following: %s": "Niewystarczająca ilość argumentów następujących po: %s",
+  "Invalid JSON config file: %s": "Nieprawidłowy plik konfiguracyjny JSON: %s",
+  "Path to JSON config file": "Ścieżka do pliku konfiguracyjnego JSON",
+  "Show help": "Pokaż pomoc",
+  "Show version number": "Pokaż numer wersji",
+  "Did you mean %s?": "Czy chodziło Ci o %s?",
+  "Arguments %s and %s are mutually exclusive": "Argumenty %s i %s wzajemnie się wykluczają",
+  "Positionals:": "Pozycyjne:",
+  "command": "polecenie"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/pt.json b/node_modules/jest-circus/node_modules/yargs/locales/pt.json
new file mode 100644
index 0000000..0c8ac99
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/pt.json
@@ -0,0 +1,45 @@
+{
+  "Commands:": "Comandos:",
+  "Options:": "Opções:",
+  "Examples:": "Exemplos:",
+  "boolean": "boolean",
+  "count": "contagem",
+  "string": "cadeia de caracteres",
+  "number": "número",
+  "array": "arranjo",
+  "required": "requerido",
+  "default": "padrão",
+  "default:": "padrão:",
+  "choices:": "escolhas:",
+  "generated-value": "valor-gerado",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Argumentos insuficientes não opcionais: Argumento %s, necessário pelo menos %s",
+    "other": "Argumentos insuficientes não opcionais: Argumento %s, necessário pelo menos %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Excesso de argumentos não opcionais: recebido %s, máximo de %s",
+    "other": "Excesso de argumentos não opcionais: recebido %s, máximo de %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Falta valor de argumento: %s",
+    "other": "Falta valores de argumento: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Falta argumento obrigatório: %s",
+    "other": "Faltando argumentos obrigatórios: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Argumento desconhecido: %s",
+    "other": "Argumentos desconhecidos: %s"
+  },
+  "Invalid values:": "Valores inválidos:",
+  "Argument: %s, Given: %s, Choices: %s": "Argumento: %s, Dado: %s, Escolhas: %s",
+  "Argument check failed: %s": "Verificação de argumento falhou: %s",
+  "Implications failed:": "Implicações falharam:",
+  "Not enough arguments following: %s": "Insuficientes argumentos a seguir: %s",
+  "Invalid JSON config file: %s": "Arquivo de configuração em JSON esta inválido: %s",
+  "Path to JSON config file": "Caminho para o arquivo de configuração em JSON",
+  "Show help": "Mostra ajuda",
+  "Show version number": "Mostra número de versão",
+  "Arguments %s and %s are mutually exclusive" : "Argumentos %s e %s são mutualmente exclusivos"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/pt_BR.json b/node_modules/jest-circus/node_modules/yargs/locales/pt_BR.json
new file mode 100644
index 0000000..eae1ec6
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/pt_BR.json
@@ -0,0 +1,48 @@
+{
+  "Commands:": "Comandos:",
+  "Options:": "Opções:",
+  "Examples:": "Exemplos:",
+  "boolean": "booleano",
+  "count": "contagem",
+  "string": "string",
+  "number": "número",
+  "array": "array",
+  "required": "obrigatório",
+  "default:": "padrão:",
+  "choices:": "opções:",
+  "aliases:": "sinônimos:",
+  "generated-value": "valor-gerado",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Argumentos insuficientes: Argumento %s, necessário pelo menos %s",
+    "other": "Argumentos insuficientes: Argumento %s, necessário pelo menos %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Excesso de argumentos: recebido %s, máximo de %s",
+    "other": "Excesso de argumentos: recebido %s, máximo de %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Falta valor de argumento: %s",
+    "other": "Falta valores de argumento: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Falta argumento obrigatório: %s",
+    "other": "Faltando argumentos obrigatórios: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Argumento desconhecido: %s",
+    "other": "Argumentos desconhecidos: %s"
+  },
+  "Invalid values:": "Valores inválidos:",
+  "Argument: %s, Given: %s, Choices: %s": "Argumento: %s, Dado: %s, Opções: %s",
+  "Argument check failed: %s": "Verificação de argumento falhou: %s",
+  "Implications failed:": "Implicações falharam:",
+  "Not enough arguments following: %s": "Argumentos insuficientes a seguir: %s",
+  "Invalid JSON config file: %s": "Arquivo JSON de configuração inválido: %s",
+  "Path to JSON config file": "Caminho para o arquivo JSON de configuração",
+  "Show help": "Exibe ajuda",
+  "Show version number": "Exibe a versão",
+  "Did you mean %s?": "Você quis dizer %s?",
+  "Arguments %s and %s are mutually exclusive" : "Argumentos %s e %s são mutualmente exclusivos",
+  "Positionals:": "Posicionais:",
+  "command": "comando"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/ru.json b/node_modules/jest-circus/node_modules/yargs/locales/ru.json
new file mode 100644
index 0000000..5f7f768
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/ru.json
@@ -0,0 +1,46 @@
+{
+  "Commands:": "Команды:",
+  "Options:": "Опции:",
+  "Examples:": "Примеры:",
+  "boolean": "булевый тип",
+  "count": "подсчет",
+  "string": "строковой тип",
+  "number": "число",
+  "array": "массив",
+  "required": "необходимо",
+  "default": "по умолчанию",
+  "default:": "по умолчанию:",
+  "choices:": "возможности:",
+  "aliases:": "алиасы:",
+  "generated-value": "генерированное значение",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Недостаточно неопционных аргументов: есть %s, нужно как минимум %s",
+    "other": "Недостаточно неопционных аргументов: есть %s, нужно как минимум %s"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Слишком много неопционных аргументов: есть %s, максимум допустимо %s",
+    "other": "Слишком много неопционных аргументов: есть %s, максимум допустимо %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Не хватает значения аргумента: %s",
+    "other": "Не хватает значений аргументов: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Не хватает необходимого аргумента: %s",
+    "other": "Не хватает необходимых аргументов: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Неизвестный аргумент: %s",
+    "other": "Неизвестные аргументы: %s"
+  },
+  "Invalid values:": "Недействительные значения:",
+  "Argument: %s, Given: %s, Choices: %s": "Аргумент: %s, Данное значение: %s, Возможности: %s",
+  "Argument check failed: %s": "Проверка аргументов не удалась: %s",
+  "Implications failed:": "Данный аргумент требует следующий дополнительный аргумент:",
+  "Not enough arguments following: %s": "Недостаточно следующих аргументов: %s",
+  "Invalid JSON config file: %s": "Недействительный файл конфигурации JSON: %s",
+  "Path to JSON config file": "Путь к файлу конфигурации JSON",
+  "Show help": "Показать помощь",
+  "Show version number": "Показать номер версии",
+  "Did you mean %s?": "Вы имели в виду %s?"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/th.json b/node_modules/jest-circus/node_modules/yargs/locales/th.json
new file mode 100644
index 0000000..33b048e
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/th.json
@@ -0,0 +1,46 @@
+{
+  "Commands:": "คอมมาน",
+  "Options:": "ออฟชั่น",
+  "Examples:": "ตัวอย่าง",
+  "boolean": "บูลีน",
+  "count": "นับ",
+  "string": "สตริง",
+  "number": "ตัวเลข",
+  "array": "อาเรย์",
+  "required": "จำเป็น",
+  "default": "ค่าเริ่มต้",
+  "default:": "ค่าเริ่มต้น",
+  "choices:": "ตัวเลือก",
+  "aliases:": "เอเลียส",
+  "generated-value": "ค่าที่ถูกสร้างขึ้น",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "ใส่อาร์กิวเมนต์ไม่ครบตามจำนวนที่กำหนด: ใส่ค่ามาจำนวน %s ค่า, แต่ต้องการอย่างน้อย %s ค่า",
+    "other": "ใส่อาร์กิวเมนต์ไม่ครบตามจำนวนที่กำหนด: ใส่ค่ามาจำนวน %s ค่า, แต่ต้องการอย่างน้อย %s ค่า"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "ใส่อาร์กิวเมนต์เกินจำนวนที่กำหนด: ใส่ค่ามาจำนวน %s ค่า, แต่ต้องการมากที่สุด %s ค่า",
+    "other": "ใส่อาร์กิวเมนต์เกินจำนวนที่กำหนด: ใส่ค่ามาจำนวน %s ค่า, แต่ต้องการมากที่สุด %s ค่า"
+  },
+  "Missing argument value: %s": {
+    "one": "ค่าอาร์กิวเมนต์ที่ขาดไป: %s",
+    "other": "ค่าอาร์กิวเมนต์ที่ขาดไป: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "อาร์กิวเมนต์จำเป็นที่ขาดไป: %s",
+    "other": "อาร์กิวเมนต์จำเป็นที่ขาดไป: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "อาร์กิวเมนต์ที่ไม่รู้จัก: %s",
+    "other": "อาร์กิวเมนต์ที่ไม่รู้จัก: %s"
+  },
+  "Invalid values:": "ค่าไม่ถูกต้อง:",
+  "Argument: %s, Given: %s, Choices: %s": "อาร์กิวเมนต์: %s, ได้รับ: %s, ตัวเลือก: %s",
+  "Argument check failed: %s": "ตรวจสอบพบอาร์กิวเมนต์ที่ไม่ถูกต้อง: %s",
+  "Implications failed:": "Implications ไม่สำเร็จ:",
+  "Not enough arguments following: %s": "ใส่อาร์กิวเมนต์ไม่ครบ: %s",
+  "Invalid JSON config file: %s": "ไฟล์คอนฟิค JSON ไม่ถูกต้อง: %s",
+  "Path to JSON config file": "พาทไฟล์คอนฟิค JSON",
+  "Show help": "ขอความช่วยเหลือ",
+  "Show version number": "แสดงตัวเลขเวอร์ชั่น",
+  "Did you mean %s?": "คุณหมายถึง %s?"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/tr.json b/node_modules/jest-circus/node_modules/yargs/locales/tr.json
new file mode 100644
index 0000000..0d0d2cc
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/tr.json
@@ -0,0 +1,48 @@
+{
+  "Commands:": "Komutlar:",
+  "Options:": "Seçenekler:",
+  "Examples:": "Örnekler:",
+  "boolean": "boolean",
+  "count": "sayı",
+  "string": "string",
+  "number": "numara",
+  "array": "array",
+  "required": "zorunlu",
+  "default": "varsayılan",
+  "default:": "varsayılan:",
+  "choices:": "seçimler:",
+  "aliases:": "takma adlar:",
+  "generated-value": "oluşturulan-değer",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "Seçenek dışı argümanlar yetersiz: %s bulundu, %s gerekli",
+    "other": "Seçenek dışı argümanlar yetersiz: %s bulundu, %s gerekli"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "Seçenek dışı argümanlar gereğinden fazla: %s bulundu, azami %s",
+    "other": "Seçenek dışı argümanlar gereğinden fazla: %s bulundu, azami %s"
+  },
+  "Missing argument value: %s": {
+    "one": "Eksik argüman değeri: %s",
+    "other": "Eksik argüman değerleri: %s"
+  },
+  "Missing required argument: %s": {
+    "one": "Eksik zorunlu argüman: %s",
+    "other": "Eksik zorunlu argümanlar: %s"
+  },
+  "Unknown argument: %s": {
+    "one": "Bilinmeyen argüman: %s",
+    "other": "Bilinmeyen argümanlar: %s"
+  },
+  "Invalid values:": "Geçersiz değerler:",
+  "Argument: %s, Given: %s, Choices: %s": "Argüman: %s, Verilen: %s, Seçimler: %s",
+  "Argument check failed: %s": "Argüman kontrolü başarısız oldu: %s",
+  "Implications failed:": "Sonuçlar başarısız oldu:",
+  "Not enough arguments following: %s": "%s için yeterli argüman bulunamadı",
+  "Invalid JSON config file: %s": "Geçersiz JSON yapılandırma dosyası: %s",
+  "Path to JSON config file": "JSON yapılandırma dosya konumu",
+  "Show help": "Yardım detaylarını göster",
+  "Show version number": "Versiyon detaylarını göster",
+  "Did you mean %s?": "Bunu mu demek istediniz: %s?",
+  "Positionals:": "Sıralılar:",
+  "command": "komut"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/zh_CN.json b/node_modules/jest-circus/node_modules/yargs/locales/zh_CN.json
new file mode 100644
index 0000000..257d26b
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/zh_CN.json
@@ -0,0 +1,48 @@
+{
+  "Commands:": "命令：",
+  "Options:": "选项：",
+  "Examples:": "示例：",
+  "boolean": "布尔",
+  "count": "计数",
+  "string": "字符串",
+  "number": "数字",
+  "array": "数组",
+  "required": "必需",
+  "default": "默认值",
+  "default:": "默认值:",
+  "choices:": "可选值:",
+  "generated-value": "生成的值",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "缺少 non-option 参数：传入了 %s 个, 至少需要 %s 个",
+    "other": "缺少 non-option 参数：传入了 %s 个, 至少需要 %s 个"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "non-option 参数过多：传入了 %s 个, 最大允许 %s 个",
+    "other": "non-option 参数过多：传入了 %s 个, 最大允许 %s 个"
+  },
+  "Missing argument value: %s": {
+    "one": "没有给此选项指定值：%s",
+    "other": "没有给这些选项指定值：%s"
+  },
+  "Missing required argument: %s": {
+    "one": "缺少必须的选项：%s",
+    "other": "缺少这些必须的选项：%s"
+  },
+  "Unknown argument: %s": {
+    "one": "无法识别的选项：%s",
+    "other": "无法识别这些选项：%s"
+  },
+  "Invalid values:": "无效的选项值：",
+  "Argument: %s, Given: %s, Choices: %s": "选项名称: %s, 传入的值: %s, 可选的值：%s",
+  "Argument check failed: %s": "选项值验证失败：%s",
+  "Implications failed:": "缺少依赖的选项：",
+  "Not enough arguments following: %s": "没有提供足够的值给此选项：%s",
+  "Invalid JSON config file: %s": "无效的 JSON 配置文件：%s",
+  "Path to JSON config file": "JSON 配置文件的路径",
+  "Show help": "显示帮助信息",
+  "Show version number": "显示版本号",
+  "Did you mean %s?": "是指 %s?",
+  "Arguments %s and %s are mutually exclusive" : "选项 %s 和 %s 是互斥的",
+  "Positionals:": "位置：",
+  "command": "命令"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/locales/zh_TW.json b/node_modules/jest-circus/node_modules/yargs/locales/zh_TW.json
new file mode 100644
index 0000000..e3c7bcf
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/locales/zh_TW.json
@@ -0,0 +1,47 @@
+{
+  "Commands:": "命令：",
+  "Options:": "選項：",
+  "Examples:": "例：",
+  "boolean": "布林",
+  "count": "次數",
+  "string": "字串",
+  "number": "數字",
+  "array": "陣列",
+  "required": "必須",
+  "default": "預設值",
+  "default:": "預設值:",
+  "choices:": "可選值:",
+  "aliases:": "別名:",
+  "generated-value": "生成的值",
+  "Not enough non-option arguments: got %s, need at least %s": {
+    "one": "non-option 引數不足：只傳入了 %s 個, 至少要 %s 個",
+    "other": "non-option 引數不足：只傳入了 %s 個, 至少要 %s 個"
+  },
+  "Too many non-option arguments: got %s, maximum of %s": {
+    "one": "non-option 引數過多：傳入了 %s 個, 但最多 %s 個",
+    "other": "non-option 引數過多：傳入了 %s 個, 但最多 %s 個"
+  },
+  "Missing argument value: %s": {
+    "one": "此引數無指定值：%s",
+    "other": "這些引數無指定值：%s"
+  },
+  "Missing required argument: %s": {
+    "one": "缺少必須的引數：%s",
+    "other": "缺少這些必須的引數：%s"
+  },
+  "Unknown argument: %s": {
+    "one": "未知的引數：%s",
+    "other": "未知的這些引數：%s"
+  },
+  "Invalid values:": "無效的選項值：",
+  "Argument: %s, Given: %s, Choices: %s": "引數名稱: %s, 傳入的值: %s, 可選的值：%s",
+  "Argument check failed: %s": "引數驗證失敗：%s",
+  "Implications failed:": "缺少依賴的選項：",
+  "Not enough arguments following: %s": "沒有提供足夠的值給此引數：%s",
+  "Invalid JSON config file: %s": "無效的 JSON 設置文件：%s",
+  "Path to JSON config file": "JSON 設置文件的路徑",
+  "Show help": "顯示說明",
+  "Show version number": "顯示版本",
+  "Did you mean %s?": "是指 %s?",
+  "Arguments %s and %s are mutually exclusive" : "引數 %s 和 %s 是互斥的"
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/package.json b/node_modules/jest-circus/node_modules/yargs/package.json
new file mode 100644
index 0000000..dc3018a
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/package.json
@@ -0,0 +1,92 @@
+{
+  "name": "yargs",
+  "version": "15.4.1",
+  "description": "yargs the modern, pirate-themed, successor to optimist.",
+  "main": "./index.js",
+  "contributors": [
+    {
+      "name": "Yargs Contributors",
+      "url": "https://github.com/yargs/yargs/graphs/contributors"
+    }
+  ],
+  "files": [
+    "index.js",
+    "yargs.js",
+    "build",
+    "locales",
+    "LICENSE"
+  ],
+  "dependencies": {
+    "cliui": "^6.0.0",
+    "decamelize": "^1.2.0",
+    "find-up": "^4.1.0",
+    "get-caller-file": "^2.0.1",
+    "require-directory": "^2.1.1",
+    "require-main-filename": "^2.0.0",
+    "set-blocking": "^2.0.0",
+    "string-width": "^4.2.0",
+    "which-module": "^2.0.0",
+    "y18n": "^4.0.0",
+    "yargs-parser": "^18.1.2"
+  },
+  "devDependencies": {
+    "@types/chai": "^4.2.11",
+    "@types/decamelize": "^1.2.0",
+    "@types/mocha": "^7.0.2",
+    "@types/node": "^10.0.3",
+    "@typescript-eslint/eslint-plugin": "^3.0.0",
+    "@typescript-eslint/parser": "^3.0.0",
+    "c8": "^7.0.0",
+    "chai": "^4.2.0",
+    "chalk": "^4.0.0",
+    "coveralls": "^3.0.9",
+    "cpr": "^3.0.1",
+    "cross-spawn": "^7.0.0",
+    "es6-promise": "^4.2.5",
+    "eslint": "^6.8.0",
+    "eslint-plugin-import": "^2.20.1",
+    "eslint-plugin-node": "^11.0.0",
+    "gts": "^2.0.0-alpha.4",
+    "hashish": "0.0.4",
+    "mocha": "^7.0.0",
+    "rimraf": "^3.0.2",
+    "standardx": "^5.0.0",
+    "typescript": "^3.7.0",
+    "which": "^2.0.0",
+    "yargs-test-extends": "^1.0.1"
+  },
+  "scripts": {
+    "fix": "standardx --fix  && standardx --fix **/*.ts",
+    "posttest": "npm run check",
+    "test": "c8 mocha --require ./test/before.js --timeout=12000 --check-leaks",
+    "coverage": "c8 report --check-coverage",
+    "check": "standardx && standardx **/*.ts",
+    "compile": "rimraf build && tsc",
+    "prepare": "npm run compile",
+    "pretest": "npm run compile -- -p tsconfig.test.json"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/yargs/yargs.git"
+  },
+  "homepage": "https://yargs.js.org/",
+  "standardx": {
+    "ignore": [
+      "build",
+      "**/example/**"
+    ]
+  },
+  "keywords": [
+    "argument",
+    "args",
+    "option",
+    "parser",
+    "parsing",
+    "cli",
+    "command"
+  ],
+  "license": "MIT",
+  "engines": {
+    "node": ">=8"
+  }
+}
diff --git a/node_modules/jest-circus/node_modules/yargs/yargs.js b/node_modules/jest-circus/node_modules/yargs/yargs.js
new file mode 100644
index 0000000..93e8059
--- /dev/null
+++ b/node_modules/jest-circus/node_modules/yargs/yargs.js
@@ -0,0 +1,14 @@
+'use strict'
+
+// an async function fails early in Node.js versions prior to 8.
+async function requiresNode8OrGreater () {}
+requiresNode8OrGreater()
+
+const { Yargs, rebase } = require('./build/lib/yargs')
+const Parser = require('yargs-parser')
+
+exports = module.exports = Yargs
+exports.rebase = rebase
+
+// allow consumers to directly use the version of yargs-parser used by yargs
+exports.Parser = Parser
diff --git a/node_modules/jest-circus/package.json b/node_modules/jest-circus/package.json
index 689ade4..1871eb3 100644
--- a/node_modules/jest-circus/package.json
+++ b/node_modules/jest-circus/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-circus",
-  "version": "26.4.2",
+  "version": "26.5.3",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -11,35 +11,36 @@
   "types": "build/index.d.ts",
   "dependencies": {
     "@babel/traverse": "^7.1.0",
-    "@jest/environment": "^26.3.0",
-    "@jest/test-result": "^26.3.0",
-    "@jest/types": "^26.3.0",
+    "@jest/environment": "^26.5.2",
+    "@jest/test-result": "^26.5.2",
+    "@jest/types": "^26.5.2",
+    "@types/babel__traverse": "^7.0.4",
     "@types/node": "*",
     "chalk": "^4.0.0",
     "co": "^4.6.0",
     "dedent": "^0.7.0",
-    "expect": "^26.4.2",
+    "expect": "^26.5.3",
     "is-generator-fn": "^2.0.0",
-    "jest-each": "^26.4.2",
-    "jest-matcher-utils": "^26.4.2",
-    "jest-message-util": "^26.3.0",
-    "jest-runner": "^26.4.2",
-    "jest-runtime": "^26.4.2",
-    "jest-snapshot": "^26.4.2",
-    "jest-util": "^26.3.0",
-    "pretty-format": "^26.4.2",
+    "jest-each": "^26.5.2",
+    "jest-matcher-utils": "^26.5.2",
+    "jest-message-util": "^26.5.2",
+    "jest-runner": "^26.5.3",
+    "jest-runtime": "^26.5.3",
+    "jest-snapshot": "^26.5.3",
+    "jest-util": "^26.5.2",
+    "pretty-format": "^26.5.2",
     "stack-utils": "^2.0.2",
     "throat": "^5.0.0"
   },
   "devDependencies": {
     "@babel/core": "^7.1.0",
     "@babel/register": "^7.0.0",
-    "@jest/test-utils": "^26.3.0",
+    "@jest/test-utils": "^26.5.0",
     "@types/babel__traverse": "^7.0.4",
     "@types/co": "^4.6.0",
     "@types/dedent": "^0.7.0",
     "@types/graceful-fs": "^4.1.3",
-    "@types/stack-utils": "^1.0.1",
+    "@types/stack-utils": "^2.0.0",
     "execa": "^4.0.0",
     "graceful-fs": "^4.2.4"
   },
@@ -49,5 +50,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "71152afbbda76fd09ddb2527b54c365d753f42aa"
 }
diff --git a/node_modules/jest-each/node_modules/@jest/types/build/Circus.d.ts b/node_modules/jest-each/node_modules/@jest/types/build/Circus.d.ts
index e6ad88d..417a5fe 100644
--- a/node_modules/jest-each/node_modules/@jest/types/build/Circus.d.ts
+++ b/node_modules/jest-each/node_modules/@jest/types/build/Circus.d.ts
@@ -18,7 +18,7 @@
 export declare type AsyncFn = TestFn | HookFn;
 export declare type SharedHookType = 'afterAll' | 'beforeAll';
 export declare type HookType = SharedHookType | 'afterEach' | 'beforeEach';
-export declare type TestContext = Record<string, any>;
+export declare type TestContext = Record<string, unknown>;
 export declare type Exception = any;
 export declare type FormattedError = string;
 export declare type Hook = {
@@ -33,6 +33,9 @@
     (event: SyncEvent, state: State): void;
 }
 export declare type Event = SyncEvent | AsyncEvent;
+interface JestGlobals extends Global.TestFrameworkGlobals {
+    expect: unknown;
+}
 export declare type SyncEvent = {
     asyncError: Error;
     mode: BlockMode;
@@ -62,6 +65,7 @@
 export declare type AsyncEvent = {
     name: 'setup';
     testNamePattern?: string;
+    runtimeGlobals: JestGlobals;
     parentProcess: Process;
 } | {
     name: 'include_test_location_in_result';
@@ -143,7 +147,7 @@
 export declare type TestResults = Array<TestResult>;
 export declare type GlobalErrorHandlers = {
     uncaughtException: Array<(exception: Exception) => void>;
-    unhandledRejection: Array<(exception: Exception, promise: Promise<any>) => void>;
+    unhandledRejection: Array<(exception: Exception, promise: Promise<unknown>) => void>;
 };
 export declare type State = {
     currentDescribeBlock: DescribeBlock;
diff --git a/node_modules/jest-each/node_modules/@jest/types/build/Config.d.ts b/node_modules/jest-each/node_modules/@jest/types/build/Config.d.ts
index f280c29..5f94989 100644
--- a/node_modules/jest-each/node_modules/@jest/types/build/Config.d.ts
+++ b/node_modules/jest-each/node_modules/@jest/types/build/Config.d.ts
@@ -42,6 +42,7 @@
     forceCoverageMatch: Array<Glob>;
     globals: ConfigGlobals;
     haste: HasteConfig;
+    injectGlobals: boolean;
     maxConcurrency: number;
     maxWorkers: number | string;
     moduleDirectories: Array<string>;
@@ -64,7 +65,7 @@
     slowTestThreshold: number;
     snapshotSerializers: Array<Path>;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testFailureExitCode: string | number;
     testLocationInResults: boolean;
     testMatch: Array<Glob>;
@@ -122,6 +123,7 @@
     globalSetup: string | null | undefined;
     globalTeardown: string | null | undefined;
     haste: HasteConfig;
+    injectGlobals: boolean;
     reporters: Array<string | ReporterConfig>;
     logHeapUsage: boolean;
     lastCommit: boolean;
@@ -169,7 +171,7 @@
     snapshotSerializers: Array<Path>;
     errorOnDeprecated: boolean;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testFailureExitCode: string | number;
     testLocationInResults: boolean;
     testMatch: Array<Glob>;
@@ -195,7 +197,7 @@
     watch: boolean;
     watchAll: boolean;
     watchman: boolean;
-    watchPlugins: Array<string | [string, Record<string, any>]>;
+    watchPlugins: Array<string | [string, Record<string, unknown>]>;
 }>;
 export declare type SnapshotUpdateState = 'all' | 'new' | 'none';
 declare type NotifyMode = 'always' | 'failure' | 'success' | 'change' | 'success-change' | 'failure-change';
@@ -273,7 +275,7 @@
     watchman: boolean;
     watchPlugins?: Array<{
         path: string;
-        config: Record<string, any>;
+        config: Record<string, unknown>;
     }> | null;
 };
 export declare type ProjectConfig = {
@@ -295,6 +297,7 @@
     globalTeardown?: string;
     globals: ConfigGlobals;
     haste: HasteConfig;
+    injectGlobals: boolean;
     moduleDirectories: Array<string>;
     moduleFileExtensions: Array<string>;
     moduleLoader?: Path;
@@ -318,7 +321,7 @@
     snapshotResolver?: Path;
     snapshotSerializers: Array<Path>;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testMatch: Array<Glob>;
     testLocationInResults: boolean;
     testPathIgnorePatterns: Array<string>;
@@ -363,6 +366,7 @@
     globalTeardown: string | null | undefined;
     haste: string;
     init: boolean;
+    injectGlobals: boolean;
     json: boolean;
     lastCommit: boolean;
     logHeapUsage: boolean;
diff --git a/node_modules/jest-each/node_modules/@jest/types/build/Global.d.ts b/node_modules/jest-each/node_modules/@jest/types/build/Global.d.ts
index c1d541b..8670a49 100644
--- a/node_modules/jest-each/node_modules/@jest/types/build/Global.d.ts
+++ b/node_modules/jest-each/node_modules/@jest/types/build/Global.d.ts
@@ -24,9 +24,12 @@
 export declare type EachTestFn<EachCallback extends TestCallback> = (...args: Array<any>) => ReturnType<EachCallback>;
 declare type Jasmine = {
     _DEFAULT_TIMEOUT_INTERVAL?: number;
-    addMatchers: Function;
+    addMatchers: (matchers: Record<string, unknown>) => void;
 };
-declare type Each<EachCallback extends TestCallback> = ((table: EachTable, ...taggedTemplateData: Array<unknown>) => (title: string, test: EachTestFn<EachCallback>, timeout?: number) => void) | (() => void);
+declare type Each<EachCallback extends TestCallback> = ((table: EachTable, ...taggedTemplateData: Array<unknown>) => (title: string, test: EachTestFn<EachCallback>, timeout?: number) => void) | (() => () => void);
+export interface HookBase {
+    (fn: HookFn, timeout?: number): void;
+}
 export interface ItBase {
     (testName: TestName, fn: TestFn, timeout?: number): void;
     each: Each<TestFn>;
@@ -34,7 +37,7 @@
 export interface It extends ItBase {
     only: ItBase;
     skip: ItBase;
-    todo: (testName: TestName, ...rest: Array<any>) => void;
+    todo: (testName: TestName) => void;
 }
 export interface ItConcurrentBase {
     (testName: string, testFn: ConcurrentTestFn, timeout?: number): void;
@@ -66,10 +69,10 @@
     describe: Describe;
     xdescribe: DescribeBase;
     fdescribe: DescribeBase;
-    beforeAll: HookFn;
-    beforeEach: HookFn;
-    afterEach: HookFn;
-    afterAll: HookFn;
+    beforeAll: HookBase;
+    beforeEach: HookBase;
+    afterEach: HookBase;
+    afterAll: HookBase;
 }
 export interface GlobalAdditions extends TestFrameworkGlobals {
     __coverage__: CoverageMapData;
@@ -80,6 +83,6 @@
     spyOnProperty: () => void;
 }
 export interface Global extends GlobalAdditions, Omit<NodeJS.Global, keyof GlobalAdditions> {
-    [extras: string]: any;
+    [extras: string]: unknown;
 }
 export {};
diff --git a/node_modules/jest-each/node_modules/@jest/types/package.json b/node_modules/jest-each/node_modules/@jest/types/package.json
index 772dfac..c8aa07c 100644
--- a/node_modules/jest-each/node_modules/@jest/types/package.json
+++ b/node_modules/jest-each/node_modules/@jest/types/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/types",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -22,5 +22,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-each/node_modules/jest-util/build/ErrorWithStack.d.ts b/node_modules/jest-each/node_modules/jest-util/build/ErrorWithStack.d.ts
index 2698f36..79764bd 100644
--- a/node_modules/jest-each/node_modules/jest-util/build/ErrorWithStack.d.ts
+++ b/node_modules/jest-each/node_modules/jest-util/build/ErrorWithStack.d.ts
@@ -5,5 +5,5 @@
  * LICENSE file in the root directory of this source tree.
  */
 export default class ErrorWithStack extends Error {
-    constructor(message: string | undefined, callsite: Function);
+    constructor(message: string | undefined, callsite: (...args: Array<any>) => unknown);
 }
diff --git a/node_modules/jest-each/node_modules/jest-util/build/convertDescriptorToString.js b/node_modules/jest-each/node_modules/jest-util/build/convertDescriptorToString.js
index 0cfab68..4b776af 100644
--- a/node_modules/jest-each/node_modules/jest-util/build/convertDescriptorToString.js
+++ b/node_modules/jest-each/node_modules/jest-util/build/convertDescriptorToString.js
@@ -11,6 +11,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+
+/* eslint-disable local/ban-types-eventually */
 // See: https://github.com/facebook/jest/pull/5154
 function convertDescriptorToString(descriptor) {
   if (
diff --git a/node_modules/jest-each/node_modules/jest-util/build/globsToMatcher.d.ts b/node_modules/jest-each/node_modules/jest-util/build/globsToMatcher.d.ts
index 4e6cc5b..687684f 100644
--- a/node_modules/jest-each/node_modules/jest-util/build/globsToMatcher.d.ts
+++ b/node_modules/jest-each/node_modules/jest-util/build/globsToMatcher.d.ts
@@ -5,6 +5,7 @@
  * LICENSE file in the root directory of this source tree.
  */
 import type { Config } from '@jest/types';
+declare type Matcher = (str: Config.Path) => boolean;
 /**
  * Converts a list of globs into a function that matches a path against the
  * globs.
@@ -22,4 +23,5 @@
  * isMatch('pizza.js'); // true
  * isMatch('pizza.test.js'); // false
  */
-export default function globsToMatcher(globs: Array<Config.Glob>): (path: Config.Path) => boolean;
+export default function globsToMatcher(globs: Array<Config.Glob>): Matcher;
+export {};
diff --git a/node_modules/jest-each/node_modules/jest-util/build/globsToMatcher.js b/node_modules/jest-each/node_modules/jest-util/build/globsToMatcher.js
index e517762..9e63c5c 100644
--- a/node_modules/jest-each/node_modules/jest-util/build/globsToMatcher.js
+++ b/node_modules/jest-each/node_modules/jest-util/build/globsToMatcher.js
@@ -55,7 +55,7 @@
   if (globs.length === 0) {
     // Since there were no globs given, we can simply have a fast path here and
     // return with a very simple function.
-    return _ => false;
+    return () => false;
   }
 
   const matchers = globs.map(glob => {
diff --git a/node_modules/jest-each/node_modules/jest-util/package.json b/node_modules/jest-each/node_modules/jest-util/package.json
index 01d0850..b584b93 100644
--- a/node_modules/jest-each/node_modules/jest-util/package.json
+++ b/node_modules/jest-each/node_modules/jest-util/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-util",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -10,7 +10,7 @@
   "main": "build/index.js",
   "types": "build/index.d.ts",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "@types/node": "*",
     "chalk": "^4.0.0",
     "graceful-fs": "^4.2.4",
@@ -28,5 +28,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-each/node_modules/pretty-format/build/index.js b/node_modules/jest-each/node_modules/pretty-format/build/index.js
index 9519847..6e10cb1 100644
--- a/node_modules/jest-each/node_modules/pretty-format/build/index.js
+++ b/node_modules/jest-each/node_modules/pretty-format/build/index.js
@@ -32,6 +32,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+
+/* eslint-disable local/ban-types-eventually */
 const toString = Object.prototype.toString;
 const toISOString = Date.prototype.toISOString;
 const errorToString = Error.prototype.toString;
@@ -554,6 +556,5 @@
   Immutable: _Immutable.default,
   ReactElement: _ReactElement.default,
   ReactTestComponent: _ReactTestComponent.default
-}; // eslint-disable-next-line no-redeclare
-
+};
 module.exports = prettyFormat;
diff --git a/node_modules/jest-each/node_modules/pretty-format/build/plugins/DOMCollection.js b/node_modules/jest-each/node_modules/pretty-format/build/plugins/DOMCollection.js
index f256551..1ae3750 100644
--- a/node_modules/jest-each/node_modules/pretty-format/build/plugins/DOMCollection.js
+++ b/node_modules/jest-each/node_modules/pretty-format/build/plugins/DOMCollection.js
@@ -13,6 +13,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+
+/* eslint-disable local/ban-types-eventually */
 const SPACE = ' ';
 const OBJECT_NAMES = ['DOMStringMap', 'NamedNodeMap'];
 const ARRAY_REGEXP = /^(HTML\w*Collection|NodeList)$/;
diff --git a/node_modules/jest-each/node_modules/pretty-format/build/plugins/lib/markup.d.ts b/node_modules/jest-each/node_modules/pretty-format/build/plugins/lib/markup.d.ts
index 6155219..60d99ab 100644
--- a/node_modules/jest-each/node_modules/pretty-format/build/plugins/lib/markup.d.ts
+++ b/node_modules/jest-each/node_modules/pretty-format/build/plugins/lib/markup.d.ts
@@ -6,7 +6,7 @@
  */
 import type { Config, Printer, Refs } from '../../types';
 export declare const printProps: (keys: Array<string>, props: Record<string, unknown>, config: Config, indentation: string, depth: number, refs: Refs, printer: Printer) => string;
-export declare const printChildren: (children: Array<any>, config: Config, indentation: string, depth: number, refs: Refs, printer: Printer) => string;
+export declare const printChildren: (children: Array<unknown>, config: Config, indentation: string, depth: number, refs: Refs, printer: Printer) => string;
 export declare const printText: (text: string, config: Config) => string;
 export declare const printComment: (comment: string, config: Config) => string;
 export declare const printElement: (type: string, printedProps: string, printedChildren: string, config: Config, indentation: string) => string;
diff --git a/node_modules/jest-each/node_modules/pretty-format/package.json b/node_modules/jest-each/node_modules/pretty-format/package.json
index 7f0c77b..093ddc7 100644
--- a/node_modules/jest-each/node_modules/pretty-format/package.json
+++ b/node_modules/jest-each/node_modules/pretty-format/package.json
@@ -1,6 +1,6 @@
 {
   "name": "pretty-format",
-  "version": "26.4.2",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -12,7 +12,7 @@
   "types": "build/index.d.ts",
   "author": "James Kyle <me@thejameskyle.com>",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "ansi-regex": "^5.0.0",
     "ansi-styles": "^4.0.0",
     "react-is": "^16.12.0"
@@ -22,7 +22,7 @@
     "@types/react-is": "^16.7.1",
     "@types/react-test-renderer": "*",
     "immutable": "4.0.0-rc.9",
-    "jest-util": "^26.3.0",
+    "jest-util": "^26.5.2",
     "react": "*",
     "react-dom": "*",
     "react-test-renderer": "*"
@@ -33,5 +33,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-each/package.json b/node_modules/jest-each/package.json
index 8327ec9..eab069a 100644
--- a/node_modules/jest-each/package.json
+++ b/node_modules/jest-each/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-each",
-  "version": "26.4.2",
+  "version": "26.5.2",
   "description": "Parameterised tests for Jest",
   "main": "build/index.js",
   "types": "build/index.d.ts",
@@ -18,11 +18,11 @@
   "author": "Matt Phillips (mattphillips)",
   "license": "MIT",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "chalk": "^4.0.0",
     "jest-get-type": "^26.3.0",
-    "jest-util": "^26.3.0",
-    "pretty-format": "^26.4.2"
+    "jest-util": "^26.5.2",
+    "pretty-format": "^26.5.2"
   },
   "engines": {
     "node": ">= 10.14.2"
@@ -30,5 +30,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-matcher-utils/build/Replaceable.d.ts b/node_modules/jest-matcher-utils/build/Replaceable.d.ts
index 2901cd4..c02db00 100644
--- a/node_modules/jest-matcher-utils/build/Replaceable.d.ts
+++ b/node_modules/jest-matcher-utils/build/Replaceable.d.ts
@@ -4,12 +4,12 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
-declare type ReplaceableForEachCallBack = (value: any, key: any, object: any) => void;
+declare type ReplaceableForEachCallBack = (value: unknown, key: unknown, object: unknown) => void;
 export default class Replaceable {
     object: any;
     type: string;
     constructor(object: any);
-    static isReplaceable(obj1: any, obj2: any): boolean;
+    static isReplaceable(obj1: unknown, obj2: unknown): boolean;
     forEach(cb: ReplaceableForEachCallBack): void;
     get(key: any): any;
     set(key: any, value: any): void;
diff --git a/node_modules/jest-matcher-utils/build/index.js b/node_modules/jest-matcher-utils/build/index.js
index a67ebcf..9e375cc 100644
--- a/node_modules/jest-matcher-utils/build/index.js
+++ b/node_modules/jest-matcher-utils/build/index.js
@@ -71,6 +71,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+
+/* eslint-disable local/ban-types-eventually */
 const {
   AsymmetricMatcher,
   DOMCollection,
diff --git a/node_modules/jest-matcher-utils/node_modules/@jest/types/build/Circus.d.ts b/node_modules/jest-matcher-utils/node_modules/@jest/types/build/Circus.d.ts
index e6ad88d..417a5fe 100644
--- a/node_modules/jest-matcher-utils/node_modules/@jest/types/build/Circus.d.ts
+++ b/node_modules/jest-matcher-utils/node_modules/@jest/types/build/Circus.d.ts
@@ -18,7 +18,7 @@
 export declare type AsyncFn = TestFn | HookFn;
 export declare type SharedHookType = 'afterAll' | 'beforeAll';
 export declare type HookType = SharedHookType | 'afterEach' | 'beforeEach';
-export declare type TestContext = Record<string, any>;
+export declare type TestContext = Record<string, unknown>;
 export declare type Exception = any;
 export declare type FormattedError = string;
 export declare type Hook = {
@@ -33,6 +33,9 @@
     (event: SyncEvent, state: State): void;
 }
 export declare type Event = SyncEvent | AsyncEvent;
+interface JestGlobals extends Global.TestFrameworkGlobals {
+    expect: unknown;
+}
 export declare type SyncEvent = {
     asyncError: Error;
     mode: BlockMode;
@@ -62,6 +65,7 @@
 export declare type AsyncEvent = {
     name: 'setup';
     testNamePattern?: string;
+    runtimeGlobals: JestGlobals;
     parentProcess: Process;
 } | {
     name: 'include_test_location_in_result';
@@ -143,7 +147,7 @@
 export declare type TestResults = Array<TestResult>;
 export declare type GlobalErrorHandlers = {
     uncaughtException: Array<(exception: Exception) => void>;
-    unhandledRejection: Array<(exception: Exception, promise: Promise<any>) => void>;
+    unhandledRejection: Array<(exception: Exception, promise: Promise<unknown>) => void>;
 };
 export declare type State = {
     currentDescribeBlock: DescribeBlock;
diff --git a/node_modules/jest-matcher-utils/node_modules/@jest/types/build/Config.d.ts b/node_modules/jest-matcher-utils/node_modules/@jest/types/build/Config.d.ts
index f280c29..5f94989 100644
--- a/node_modules/jest-matcher-utils/node_modules/@jest/types/build/Config.d.ts
+++ b/node_modules/jest-matcher-utils/node_modules/@jest/types/build/Config.d.ts
@@ -42,6 +42,7 @@
     forceCoverageMatch: Array<Glob>;
     globals: ConfigGlobals;
     haste: HasteConfig;
+    injectGlobals: boolean;
     maxConcurrency: number;
     maxWorkers: number | string;
     moduleDirectories: Array<string>;
@@ -64,7 +65,7 @@
     slowTestThreshold: number;
     snapshotSerializers: Array<Path>;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testFailureExitCode: string | number;
     testLocationInResults: boolean;
     testMatch: Array<Glob>;
@@ -122,6 +123,7 @@
     globalSetup: string | null | undefined;
     globalTeardown: string | null | undefined;
     haste: HasteConfig;
+    injectGlobals: boolean;
     reporters: Array<string | ReporterConfig>;
     logHeapUsage: boolean;
     lastCommit: boolean;
@@ -169,7 +171,7 @@
     snapshotSerializers: Array<Path>;
     errorOnDeprecated: boolean;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testFailureExitCode: string | number;
     testLocationInResults: boolean;
     testMatch: Array<Glob>;
@@ -195,7 +197,7 @@
     watch: boolean;
     watchAll: boolean;
     watchman: boolean;
-    watchPlugins: Array<string | [string, Record<string, any>]>;
+    watchPlugins: Array<string | [string, Record<string, unknown>]>;
 }>;
 export declare type SnapshotUpdateState = 'all' | 'new' | 'none';
 declare type NotifyMode = 'always' | 'failure' | 'success' | 'change' | 'success-change' | 'failure-change';
@@ -273,7 +275,7 @@
     watchman: boolean;
     watchPlugins?: Array<{
         path: string;
-        config: Record<string, any>;
+        config: Record<string, unknown>;
     }> | null;
 };
 export declare type ProjectConfig = {
@@ -295,6 +297,7 @@
     globalTeardown?: string;
     globals: ConfigGlobals;
     haste: HasteConfig;
+    injectGlobals: boolean;
     moduleDirectories: Array<string>;
     moduleFileExtensions: Array<string>;
     moduleLoader?: Path;
@@ -318,7 +321,7 @@
     snapshotResolver?: Path;
     snapshotSerializers: Array<Path>;
     testEnvironment: string;
-    testEnvironmentOptions: Record<string, any>;
+    testEnvironmentOptions: Record<string, unknown>;
     testMatch: Array<Glob>;
     testLocationInResults: boolean;
     testPathIgnorePatterns: Array<string>;
@@ -363,6 +366,7 @@
     globalTeardown: string | null | undefined;
     haste: string;
     init: boolean;
+    injectGlobals: boolean;
     json: boolean;
     lastCommit: boolean;
     logHeapUsage: boolean;
diff --git a/node_modules/jest-matcher-utils/node_modules/@jest/types/build/Global.d.ts b/node_modules/jest-matcher-utils/node_modules/@jest/types/build/Global.d.ts
index c1d541b..8670a49 100644
--- a/node_modules/jest-matcher-utils/node_modules/@jest/types/build/Global.d.ts
+++ b/node_modules/jest-matcher-utils/node_modules/@jest/types/build/Global.d.ts
@@ -24,9 +24,12 @@
 export declare type EachTestFn<EachCallback extends TestCallback> = (...args: Array<any>) => ReturnType<EachCallback>;
 declare type Jasmine = {
     _DEFAULT_TIMEOUT_INTERVAL?: number;
-    addMatchers: Function;
+    addMatchers: (matchers: Record<string, unknown>) => void;
 };
-declare type Each<EachCallback extends TestCallback> = ((table: EachTable, ...taggedTemplateData: Array<unknown>) => (title: string, test: EachTestFn<EachCallback>, timeout?: number) => void) | (() => void);
+declare type Each<EachCallback extends TestCallback> = ((table: EachTable, ...taggedTemplateData: Array<unknown>) => (title: string, test: EachTestFn<EachCallback>, timeout?: number) => void) | (() => () => void);
+export interface HookBase {
+    (fn: HookFn, timeout?: number): void;
+}
 export interface ItBase {
     (testName: TestName, fn: TestFn, timeout?: number): void;
     each: Each<TestFn>;
@@ -34,7 +37,7 @@
 export interface It extends ItBase {
     only: ItBase;
     skip: ItBase;
-    todo: (testName: TestName, ...rest: Array<any>) => void;
+    todo: (testName: TestName) => void;
 }
 export interface ItConcurrentBase {
     (testName: string, testFn: ConcurrentTestFn, timeout?: number): void;
@@ -66,10 +69,10 @@
     describe: Describe;
     xdescribe: DescribeBase;
     fdescribe: DescribeBase;
-    beforeAll: HookFn;
-    beforeEach: HookFn;
-    afterEach: HookFn;
-    afterAll: HookFn;
+    beforeAll: HookBase;
+    beforeEach: HookBase;
+    afterEach: HookBase;
+    afterAll: HookBase;
 }
 export interface GlobalAdditions extends TestFrameworkGlobals {
     __coverage__: CoverageMapData;
@@ -80,6 +83,6 @@
     spyOnProperty: () => void;
 }
 export interface Global extends GlobalAdditions, Omit<NodeJS.Global, keyof GlobalAdditions> {
-    [extras: string]: any;
+    [extras: string]: unknown;
 }
 export {};
diff --git a/node_modules/jest-matcher-utils/node_modules/@jest/types/package.json b/node_modules/jest-matcher-utils/node_modules/@jest/types/package.json
index 772dfac..c8aa07c 100644
--- a/node_modules/jest-matcher-utils/node_modules/@jest/types/package.json
+++ b/node_modules/jest-matcher-utils/node_modules/@jest/types/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@jest/types",
-  "version": "26.3.0",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -22,5 +22,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-matcher-utils/node_modules/diff-sequences/build/index.js b/node_modules/jest-matcher-utils/node_modules/diff-sequences/build/index.js
index 445260b..5d565d9 100644
--- a/node_modules/jest-matcher-utils/node_modules/diff-sequences/build/index.js
+++ b/node_modules/jest-matcher-utils/node_modules/diff-sequences/build/index.js
@@ -688,10 +688,8 @@
 };
 
 const validateLength = (name, arg) => {
-  const type = typeof arg;
-
-  if (type !== 'number') {
-    throw new TypeError(`${pkg}: ${name} typeof ${type} is not a number`);
+  if (typeof arg !== 'number') {
+    throw new TypeError(`${pkg}: ${name} typeof ${typeof arg} is not a number`);
   }
 
   if (!Number.isSafeInteger(arg)) {
diff --git a/node_modules/jest-matcher-utils/node_modules/diff-sequences/package.json b/node_modules/jest-matcher-utils/node_modules/diff-sequences/package.json
index c56b179..808f36c 100644
--- a/node_modules/jest-matcher-utils/node_modules/diff-sequences/package.json
+++ b/node_modules/jest-matcher-utils/node_modules/diff-sequences/package.json
@@ -1,6 +1,6 @@
 {
   "name": "diff-sequences",
-  "version": "26.3.0",
+  "version": "26.5.0",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -31,5 +31,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "3a7e06fe855515a848241bb06a6f6e117847443d"
+  "gitHead": "68d1b1b638bc7464c2794a957c1b894de7da2ee3"
 }
diff --git a/node_modules/jest-matcher-utils/node_modules/jest-diff/package.json b/node_modules/jest-matcher-utils/node_modules/jest-diff/package.json
index 91b1855..45eef6e 100644
--- a/node_modules/jest-matcher-utils/node_modules/jest-diff/package.json
+++ b/node_modules/jest-matcher-utils/node_modules/jest-diff/package.json
@@ -1,6 +1,6 @@
 {
   "name": "jest-diff",
-  "version": "26.4.2",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -11,12 +11,12 @@
   "types": "build/index.d.ts",
   "dependencies": {
     "chalk": "^4.0.0",
-    "diff-sequences": "^26.3.0",
+    "diff-sequences": "^26.5.0",
     "jest-get-type": "^26.3.0",
-    "pretty-format": "^26.4.2"
+    "pretty-format": "^26.5.2"
   },
   "devDependencies": {
-    "@jest/test-utils": "^26.3.0",
+    "@jest/test-utils": "^26.5.0",
     "strip-ansi": "^6.0.0"
   },
   "engines": {
@@ -25,5 +25,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-matcher-utils/node_modules/pretty-format/build/index.js b/node_modules/jest-matcher-utils/node_modules/pretty-format/build/index.js
index 9519847..6e10cb1 100644
--- a/node_modules/jest-matcher-utils/node_modules/pretty-format/build/index.js
+++ b/node_modules/jest-matcher-utils/node_modules/pretty-format/build/index.js
@@ -32,6 +32,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+
+/* eslint-disable local/ban-types-eventually */
 const toString = Object.prototype.toString;
 const toISOString = Date.prototype.toISOString;
 const errorToString = Error.prototype.toString;
@@ -554,6 +556,5 @@
   Immutable: _Immutable.default,
   ReactElement: _ReactElement.default,
   ReactTestComponent: _ReactTestComponent.default
-}; // eslint-disable-next-line no-redeclare
-
+};
 module.exports = prettyFormat;
diff --git a/node_modules/jest-matcher-utils/node_modules/pretty-format/build/plugins/DOMCollection.js b/node_modules/jest-matcher-utils/node_modules/pretty-format/build/plugins/DOMCollection.js
index f256551..1ae3750 100644
--- a/node_modules/jest-matcher-utils/node_modules/pretty-format/build/plugins/DOMCollection.js
+++ b/node_modules/jest-matcher-utils/node_modules/pretty-format/build/plugins/DOMCollection.js
@@ -13,6 +13,8 @@
  * This source code is licensed under the MIT license found in the
  * LICENSE file in the root directory of this source tree.
  */
+
+/* eslint-disable local/ban-types-eventually */
 const SPACE = ' ';
 const OBJECT_NAMES = ['DOMStringMap', 'NamedNodeMap'];
 const ARRAY_REGEXP = /^(HTML\w*Collection|NodeList)$/;
diff --git a/node_modules/jest-matcher-utils/node_modules/pretty-format/build/plugins/lib/markup.d.ts b/node_modules/jest-matcher-utils/node_modules/pretty-format/build/plugins/lib/markup.d.ts
index 6155219..60d99ab 100644
--- a/node_modules/jest-matcher-utils/node_modules/pretty-format/build/plugins/lib/markup.d.ts
+++ b/node_modules/jest-matcher-utils/node_modules/pretty-format/build/plugins/lib/markup.d.ts
@@ -6,7 +6,7 @@
  */
 import type { Config, Printer, Refs } from '../../types';
 export declare const printProps: (keys: Array<string>, props: Record<string, unknown>, config: Config, indentation: string, depth: number, refs: Refs, printer: Printer) => string;
-export declare const printChildren: (children: Array<any>, config: Config, indentation: string, depth: number, refs: Refs, printer: Printer) => string;
+export declare const printChildren: (children: Array<unknown>, config: Config, indentation: string, depth: number, refs: Refs, printer: Printer) => string;
 export declare const printText: (text: string, config: Config) => string;
 export declare const printComment: (comment: string, config: Config) => string;
 export declare const printElement: (type: string, printedProps: string, printedChildren: string, config: Config, indentation: string) => string;
diff --git a/node_modules/jest-matcher-utils/node_modules/pretty-format/package.json b/node_modules/jest-matcher-utils/node_modules/pretty-format/package.json
index 7f0c77b..093ddc7 100644
--- a/node_modules/jest-matcher-utils/node_modules/pretty-format/package.json
+++ b/node_modules/jest-matcher-utils/node_modules/pretty-format/package.json
@@ -1,6 +1,6 @@
 {
   "name": "pretty-format",
-  "version": "26.4.2",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -12,7 +12,7 @@
   "types": "build/index.d.ts",
   "author": "James Kyle <me@thejameskyle.com>",
   "dependencies": {
-    "@jest/types": "^26.3.0",
+    "@jest/types": "^26.5.2",
     "ansi-regex": "^5.0.0",
     "ansi-styles": "^4.0.0",
     "react-is": "^16.12.0"
@@ -22,7 +22,7 @@
     "@types/react-is": "^16.7.1",
     "@types/react-test-renderer": "*",
     "immutable": "4.0.0-rc.9",
-    "jest-util": "^26.3.0",
+    "jest-util": "^26.5.2",
     "react": "*",
     "react-dom": "*",
     "react-test-renderer": "*"
@@ -33,5 +33,5 @@
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/jest-matcher-utils/package.json b/node_modules/jest-matcher-utils/package.json
index 75158d6..28f4024 100644
--- a/node_modules/jest-matcher-utils/package.json
+++ b/node_modules/jest-matcher-utils/package.json
@@ -1,7 +1,7 @@
 {
   "name": "jest-matcher-utils",
   "description": "A set of utility functions for expect and related packages",
-  "version": "26.4.2",
+  "version": "26.5.2",
   "repository": {
     "type": "git",
     "url": "https://github.com/facebook/jest.git",
@@ -15,16 +15,16 @@
   "types": "build/index.d.ts",
   "dependencies": {
     "chalk": "^4.0.0",
-    "jest-diff": "^26.4.2",
+    "jest-diff": "^26.5.2",
     "jest-get-type": "^26.3.0",
-    "pretty-format": "^26.4.2"
+    "pretty-format": "^26.5.2"
   },
   "devDependencies": {
-    "@jest/test-utils": "^26.3.0",
+    "@jest/test-utils": "^26.5.0",
     "@types/node": "*"
   },
   "publishConfig": {
     "access": "public"
   },
-  "gitHead": "2586a798260886c28b6d28256cdfe354e039d5d1"
+  "gitHead": "d2bacceb51e7f05c9cb6d764d5cd886a2fd71267"
 }
diff --git a/node_modules/strip-bom/index.d.ts b/node_modules/jest-runtime/node_modules/strip-bom/index.d.ts
similarity index 100%
copy from node_modules/strip-bom/index.d.ts
copy to node_modules/jest-runtime/node_modules/strip-bom/index.d.ts
diff --git a/node_modules/jest-runtime/node_modules/strip-bom/index.js b/node_modules/jest-runtime/node_modules/strip-bom/index.js
new file mode 100644
index 0000000..82f9175
--- /dev/null
+++ b/node_modules/jest-runtime/node_modules/strip-bom/index.js
@@ -0,0 +1,15 @@
+'use strict';
+
+module.exports = string => {
+	if (typeof string !== 'string') {
+		throw new TypeError(`Expected a string, got ${typeof string}`);
+	}
+
+	// Catches EFBBBF (UTF-8 BOM) because the buffer-to-string
+	// conversion translates it to FEFF (UTF-16 BOM)
+	if (string.charCodeAt(0) === 0xFEFF) {
+		return string.slice(1);
+	}
+
+	return string;
+};
diff --git a/node_modules/cli-cursor/license b/node_modules/jest-runtime/node_modules/strip-bom/license
similarity index 100%
copy from node_modules/cli-cursor/license
copy to node_modules/jest-runtime/node_modules/strip-bom/license
diff --git a/node_modules/jest-runtime/node_modules/strip-bom/package.json b/node_modules/jest-runtime/node_modules/strip-bom/package.json
new file mode 100644
index 0000000..f96ba34
--- /dev/null
+++ b/node_modules/jest-runtime/node_modules/strip-bom/package.json
@@ -0,0 +1,42 @@
+{
+	"name": "strip-bom",
+	"version": "4.0.0",
+	"description": "Strip UTF-8 byte order mark (BOM) from a string",
+	"license": "MIT",
+	"repository": "sindresorhus/strip-bom",
+	"author": {
+		"name": "Sindre Sorhus",
+		"email": "sindresorhus@gmail.com",
+		"url": "sindresorhus.com"
+	},
+	"engines": {
+		"node": ">=8"
+	},
+	"scripts": {
+		"test": "xo && ava && tsd"
+	},
+	"files": [
+		"index.js",
+		"index.d.ts"
+	],
+	"keywords": [
+		"strip",
+		"bom",
+		"byte",
+		"order",
+		"mark",
+		"unicode",
+		"utf8",
+		"utf-8",
+		"remove",
+		"delete",
+		"trim",
+		"text",
+		"string"
+	],
+	"devDependencies": {
+		"ava": "^1.4.1",
+		"tsd": "^0.7.2",
+		"xo": "^0.24.0"
+	}
+}
diff --git a/node_modules/jest-runtime/node_modules/strip-bom/readme.md b/node_modules/jest-runtime/node_modules/strip-bom/readme.md
new file mode 100644
index 0000000..e826851
--- /dev/null
+++ b/node_modules/jest-runtime/node_modules/strip-bom/readme.md
@@ -0,0 +1,54 @@
+# strip-bom [![Build Status](https://travis-ci.org/sindresorhus/strip-bom.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-bom)
+
+> Strip UTF-8 [byte order mark](https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8) (BOM) from a string
+
+From Wikipedia:
+
+> The Unicode Standard permits the BOM in UTF-8, but does not require nor recommend its use. Byte order has no meaning in UTF-8.
+
+---
+
+<div align="center">
+	<b>
+		<a href="https://tidelift.com/subscription/pkg/npm-strip-bom?utm_source=npm-strip-bom&utm_medium=referral&utm_campaign=readme">Get professional support for 'strip-bom' with a Tidelift subscription</a>
+	</b>
+	<br>
+	<sub>
+		Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
+	</sub>
+</div>
+
+---
+
+## Install
+
+```
+$ npm install strip-bom
+```
+
+
+## Usage
+
+```js
+const stripBom = require('strip-bom');
+
+stripBom('\uFEFFunicorn');
+//=> 'unicorn'
+```
+
+
+## Security
+
+To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure.
+
+
+## Related
+
+- [strip-bom-cli](https://github.com/sindresorhus/strip-bom-cli) - CLI for this module
+- [strip-bom-buf](https://github.com/sindresorhus/strip-bom-buf) - Buffer version of this module
+- [strip-bom-stream](https://github.com/sindresorhus/strip-bom-stream) - Stream version of this module
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/jsdoctypeparser/.editorconfig b/node_modules/jsdoctypeparser/.editorconfig
deleted file mode 100644
index 0f17867..0000000
--- a/node_modules/jsdoctypeparser/.editorconfig
+++ /dev/null
@@ -1,9 +0,0 @@
-root = true
-
-[*]
-charset = utf-8
-end_of_line = lf
-indent_size = 2
-indent_style = space
-insert_final_newline = true
-trim_trailing_whitespace = true
diff --git a/node_modules/jsdoctypeparser/.eslintignore b/node_modules/jsdoctypeparser/.eslintignore
deleted file mode 100644
index 51f2096..0000000
--- a/node_modules/jsdoctypeparser/.eslintignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules
-peg_lib
diff --git a/node_modules/jsdoctypeparser/.eslintrc.json b/node_modules/jsdoctypeparser/.eslintrc.json
deleted file mode 100644
index 3eca35c..0000000
--- a/node_modules/jsdoctypeparser/.eslintrc.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "extends": "eslint:recommended",
-  "env": {
-    "node": true,
-    "es6": true
-  },
-  "rules": {
-    "quotes": [2, "single", "avoid-escape"],
-    "no-use-before-define": [2, "nofunc"],
-    "space-infix-ops": [2, { "int32Hint": false }],
-    "curly": [2, "multi-line"],
-    "comma-dangle": [2, "always-multiline"],
-    "camelcase": 0,
-    "no-underscore-dangle": 0
-  }
-}
diff --git a/node_modules/jsdoctypeparser/LICENSE-MIT.txt b/node_modules/jsdoctypeparser/LICENSE-MIT.txt
deleted file mode 100644
index f3c8fa7..0000000
--- a/node_modules/jsdoctypeparser/LICENSE-MIT.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Copyright © 2019 Kuniwak
-
-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/node_modules/jsdoctypeparser/README.md b/node_modules/jsdoctypeparser/README.md
deleted file mode 100644
index 2936a73..0000000
--- a/node_modules/jsdoctypeparser/README.md
+++ /dev/null
@@ -1,637 +0,0 @@
-# jsdoctypeparser
-
-[![Build Status](https://travis-ci.org/jsdoctypeparser/jsdoctypeparser.svg?branch=master)](https://travis-ci.org/jsdoctypeparser/jsdoctypeparser)
-[![NPM version](https://badge.fury.io/js/jsdoctypeparser.svg)](http://badge.fury.io/js/jsdoctypeparser)
-
-The parser can parse:
-
-* [JSDoc type expressions](https://jsdoc.app/tags-type.html)
-  * `foo.bar`, `String[]`
-* [Closure Compiler type expressions](https://developers.google.com/closure/compiler/docs/js-for-compiler)
-  * `Array<string>`, `function(arg1, arg2): ret`
-* [JSDuck type definitions](https://github.com/senchalabs/jsduck/wiki/Type-Definitions)
-  * `Boolean/"top"/"bottom"`
-* [some Typescript types](https://github.com/Microsoft/TypeScript)
-  * `(x: number) => string`, `typeof x`, `import("./some-module")`
-* Complex type expressions
-  * `Array<Array<string>>`, `function(function(Function))`
-
-## Live demo
-
-The [live demo](https://jsdoctypeparser.github.io) is available.
-
-## Usage (Programmatic)
-
-### Parsing
-
-```javascript
-const {parse} = require('jsdoctypeparser');
-
-const ast = parse('Array<MyClass>');
-```
-
-The `ast` becomes:
-
-```json
-{
-  "type": "GENERIC",
-  "subject": {
-    "type": "NAME",
-    "name": "Array"
-  },
-  "objects": [
-    {
-      "type": "NAME",
-      "name": "MyClass"
-    }
-  ],
-  "meta": {
-    "syntax": "ANGLE_BRACKET"
-  }
-}
-```
-
-See the [AST specifications](https://github.com/Kuniwak/jsdoctypeparser/blob/update-readme/README.md#ast-specifications).
-
-### Publishing
-
-We can stringify the AST nodes by using `publish`.
-
-```javascript
-const {publish} = require('jsdoctypeparser');
-
-const ast = {
-  type: 'GENERIC',
-  subject: {
-    type: 'NAME',
-    name: 'Array'
-  },
-  objects: [
-    {
-      type: 'NAME',
-      name: 'MyClass'
-    }
-  ]
-};
-
-const string = publish(ast);
-```
-
-The `string` becomes:
-
-```json
-"Array<MyClass>"
-```
-
-#### Custom publishing
-
-We can change the stringification strategy by using the 2nd parameter of `publish(node, publisher)`.
-The `publisher` MUST have handlers for all node types (see `lib/NodeType.js`).
-
-And we can override default behavior by using `createDefaultPublisher`.
-
-```javascript
-const {publish, createDefaultPublisher} = require('jsdoctypeparser');
-
-const ast = {
-  type: 'NAME',
-  name: 'MyClass',
-};
-
-const customPublisher = createDefaultPublisher();
-customPublisher.NAME = (node, pub) =>
-  `<a href="./types/${node.name}.html">${node.name}</a>`;
-
-const string = publish(ast, customPublisher);
-```
-
-The `string` becomes:
-
-```html
-<a href="./types/MyClass.html">MyClass</a>
-```
-
-### Traversing
-
-We can traverse the AST by using `traverse`.
-This function takes 3 parameters (a node and an onEnter handler, an onLeave handler).
-The handlers take a visiting node.
-
-```javascript
-const {parse, traverse} = require('jsdoctypeparser');
-const ast = parse('Array<{ key1: function(), key2: A.B.C }>');
-
-function onEnter(node, parentName, parentNode) {
-  console.log('enter', node.type, parentName, parentNode.type);
-}
-
-function onLeave(node, parentName, parentNode) {
-  console.log('leave', node.type, parentName, parentNode.type);
-}
-
-traverse(ast, onEnter, onLeave);
-```
-
-The output will be:
-
-```
-enter GENERIC null null
-enter NAME subject GENERIC
-leave NAME subject GENERIC
-enter RECORD objects GENERIC
-enter RECORD_ENTRY entries RECORD
-enter FUNCTION value RECORD_ENTRY
-leave FUNCTION value RECORD_ENTRY
-leave RECORD_ENTRY entries RECORD
-enter RECORD_ENTRY entries RECORD
-enter MEMBER value RECORD_ENTRY
-enter MEMBER owner MEMBER
-enter NAME owner MEMBER
-leave NAME owner MEMBER
-leave MEMBER owner MEMBER
-leave MEMBER value RECORD_ENTRY
-leave RECORD_ENTRY entries RECORD
-leave RECORD objects GENERIC
-leave GENERIC null null
-```
-
-## AST Specifications
-
-### `NAME`
-
-Example:
-
-```javascript
-/**
- * @type {name}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "NAME",
-  "name": string
-}
-```
-
-### `MEMBER`
-
-Example:
-
-```javascript
-/**
- * @type {owner.name}
- * @type {superOwner.owner.name}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "MEMBER",
-  "name": string,
-  "quoteStyle": "none",
-  "owner": node,
-  "hasEventPrefix": boolean
-}
-```
-
-### `INNER_MEMBER`
-
-Example:
-
-```javascript
-/**
- * @type {owner~name}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "INNER_MEMBER",
-  "name": string,
-  "quoteStyle": "none",
-  "owner": node,
-  "hasEventPrefix": boolean
-}
-```
-
-### `INSTANCE_MEMBER`
-
-Example:
-
-```javascript
-/**
- * @type {owner#name}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "INSTANCE_MEMBER",
-  "name": string,
-  "quoteStyle": "none",
-  "owner": node,
-  "hasEventPrefix": boolean
-}
-```
-
-### `UNION`
-
-Example:
-
-```javascript
-/**
- * @type {left|right}
- * @type {(left|right)}
- * @type {left/right}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "UNION",
-  "left": node,
-  "right": node,
-  "meta": {
-    "syntax": ("PIPE" or "SLASH")
-  }
-}
-```
-
-### `RECORD`
-
-Example:
-
-```javascript
-/**
- * @type {{}}
- * @type {{ key: value }}
- * @type {{ key: value, anyKey }}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "RECORD",
-  "entries": [
-    recordEntryNode,
-    recordEntryNode,
-    ...
-  ]
-}
-```
-
-### `RECORD_ENTRY`
-
-Structure:
-
-```javascript
-{
-  "type": "RECORD_ENTRY",
-  "key": string,
-  "value": node (or null)
-}
-```
-
-### `GENERIC`
-
-Example:
-
-```javascript
-/**
- * @type {Subject<Object, Object>}
- * @type {Object[]}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "GENERIC",
-  "subject": node,
-  "objects": [
-    node,
-    node,
-    ...
-  ],
-  "meta": {
-    "syntax": ("ANGLE_BRACKET" or "ANGLE_BRACKET_WITH_DOT" or "SQUARE_BRACKET")
-  }
-}
-```
-
-### `FUNCTION`
-
-Example:
-
-```javascript
-/**
- * @type {function()}
- * @type {function(param, param): return}
- * @type {function(this: Context)}
- * @type {function(new: Class)}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "FUNCTION",
-  "params": [
-    node,
-    node,
-    ...
-  ],
-  "returns": node (or null),
-  "new": node (or null),
-  "this": node (or null)
-}
-```
-
-### `OPTIONAL`
-
-Example:
-
-```javascript
-/**
- * @type {Optional=}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "OPTIONAL",
-  "value": node,
-  "meta": {
-    "syntax": ("PREFIX_EQUALS_SIGN" or "SUFFIX_EQUALS_SIGN")
-  }
-}
-```
-
-### `NULLABLE`
-
-Example:
-
-```javascript
-/**
- * @type {?Nullable}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "NULLABLE",
-  "value": node,
-  "meta": {
-    "syntax": ("PREFIX_QUESTION_MARK" or "SUFFIX_QUESTION_MARK")
-  }
-}
-```
-
-### `NOT_NULLABLE`
-
-Example:
-
-```javascript
-/**
- * @type {!NotNullable}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "NOT_NULLABLE",
-  "value": node,
-  "meta": {
-    "syntax": ("PREFIX_BANG" or "SUFFIX_BANG")
-  }
-}
-```
-
-### `VARIADIC`
-
-Example:
-
-```javascript
-/**
- * @type {...Variadic}
- * @type {Variadic...}
- * @type {...}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "VARIADIC",
-  "value": node (or null),
-  "meta": {
-    "syntax": ("PREFIX_DOTS" or "SUFFIX_DOTS" or "ONLY_DOTS")
-  }
-}
-```
-
-### `MODULE`
-
-Example:
-
-```javascript
-/**
- * @type {module:path/to/file.Module}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "MODULE",
-  "value": node
-}
-```
-
-### `FILE_PATH`
-
-Example:
-
-```javascript
-/**
- * @type {module:path/to/file.Module}
- *               ^^^^^^^^^^^^
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "FILE_PATH",
-  "path": string
-}
-```
-
-### `EXTERNAL`
-
-Example:
-
-```javascript
-/**
- * @type {external:External}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "EXTERNAL",
-  "value": node
-}
-```
-
-### `STRING_VALUE`
-
-Example:
-
-```javascript
-/**
- * @type {"abc"}
- * @type {"can\"escape"}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "STRING_VALUE",
-  "quoteStyle": "double",
-  "string": string
-}
-```
-
-### `NUMBER_VALUE`
-
-Example:
-
-```javascript
-/**
- * @type {123}
- * @type {0b11}
- * @type {0o77}
- * @type {0xff}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "NUMBER_VALUE",
-  "number": string
-}
-```
-
-### `ANY`
-
-Example:
-
-```javascript
-/**
- * @type {*}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "ANY"
-}
-```
-
-### `UNKNOWN`
-
-Example:
-
-```javascript
-/**
- * @type {?}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "UNKNOWN"
-}
-```
-
-### `PARENTHESIS`
-
-Example:
-
-```javascript
-/**
- * @type {(Foo)}
- */
-```
-
-Structure:
-
-```javascript
-{
-  "type": "PARENTHESIS",
-  "value": node
-}
-```
-
-### Others
-
-We can use a parenthesis to change operator orders.
-
-```javascript
-/**
- * @type {(module:path/to/file.js).foo}
- */
-```
-
-## Usage (CLI)
-
-To parse a type into a JSON structure, you may pass a string argument
-containing the structure to parse (with the JSON results equivalent to the
-parsing example above):
-
-```
-jsdoctypeparser 'Array<MyClass>'
-```
-
-Note: There is no need to prefix the path to the `jsdoctypeparser` binary,
-e.g., with `./node_modules/.bin/` when you are running within one of the
-`package.json` `scripts` or if you have installed the package globally.
-
-## License
-
-[This script is licensed under the MIT](./LICENSE-MIT.txt).
diff --git a/node_modules/jsdoctypeparser/bin/jsdoctypeparser b/node_modules/jsdoctypeparser/bin/jsdoctypeparser
deleted file mode 100755
index 109157e..0000000
--- a/node_modules/jsdoctypeparser/bin/jsdoctypeparser
+++ /dev/null
@@ -1,5 +0,0 @@
-#! /usr/bin/env node
-'use strict';
-
-const {parse} = require('../index.js');
-console.log(JSON.stringify(parse(process.argv[2]), null, 2));
diff --git a/node_modules/jsdoctypeparser/index.js b/node_modules/jsdoctypeparser/index.js
deleted file mode 100644
index 3aaf023..0000000
--- a/node_modules/jsdoctypeparser/index.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-/** @typedef {import('./lib/parsing').AstNode} AstNode */
-
-const {parse, JSDocTypeSyntaxError} = require('./lib/parsing.js');
-const {publish, createDefaultPublisher} = require('./lib/publishing.js');
-const {traverse} = require('./lib/traversing.js');
-const NodeType = require('./lib/NodeType.js');
-const SyntaxType = require('./lib/SyntaxType.js');
-
-
-/**
- * Namespace for jsdoctypeparser.
- * @namespace
- * @exports jsdoctypeparser
- */
-module.exports = {
-  parse,
-  JSDocTypeSyntaxError,
-  publish,
-  createDefaultPublisher,
-  traverse,
-  NodeType,
-  SyntaxType,
-};
diff --git a/node_modules/jsdoctypeparser/lib/NodeType.js b/node_modules/jsdoctypeparser/lib/NodeType.js
deleted file mode 100644
index 0dc788d..0000000
--- a/node_modules/jsdoctypeparser/lib/NodeType.js
+++ /dev/null
@@ -1,35 +0,0 @@
-'use strict';
-
-const NodeType = {
-  NAME: 'NAME',
-  MEMBER: 'MEMBER',
-  UNION: 'UNION',
-  VARIADIC: 'VARIADIC',
-  RECORD: 'RECORD',
-  RECORD_ENTRY: 'RECORD_ENTRY',
-  TUPLE: 'TUPLE',
-  GENERIC: 'GENERIC',
-  MODULE: 'MODULE',
-  OPTIONAL: 'OPTIONAL',
-  NULLABLE: 'NULLABLE',
-  NOT_NULLABLE: 'NOT_NULLABLE',
-  FUNCTION: 'FUNCTION',
-  ARROW: 'ARROW',
-  NAMED_PARAMETER: 'NAMED_PARAMETER',
-  ANY: 'ANY',
-  UNKNOWN: 'UNKNOWN',
-  INNER_MEMBER: 'INNER_MEMBER',
-  INSTANCE_MEMBER: 'INSTANCE_MEMBER',
-  STRING_VALUE: 'STRING_VALUE',
-  NUMBER_VALUE: 'NUMBER_VALUE',
-  EXTERNAL: 'EXTERNAL',
-  FILE_PATH: 'FILE_PATH',
-  PARENTHESIS: 'PARENTHESIS',
-  TYPE_QUERY: 'TYPE_QUERY',
-  KEY_QUERY: 'KEY_QUERY',
-  IMPORT: 'IMPORT',
-};
-
-/** @typedef {keyof typeof NodeType} Type */
-
-module.exports = /** @type {{readonly [T in Type]: T}} */ (NodeType);
diff --git a/node_modules/jsdoctypeparser/lib/SyntaxType.js b/node_modules/jsdoctypeparser/lib/SyntaxType.js
deleted file mode 100644
index d3b4c4a..0000000
--- a/node_modules/jsdoctypeparser/lib/SyntaxType.js
+++ /dev/null
@@ -1,89 +0,0 @@
-'use strict';
-
-/**
- * Syntax types for generic types.
- * @enum {string}
- */
-const GenericTypeSyntax = {
-  /**
-   * From TypeScript and Closure Library.
-   * Example: {@code Array<string>}
-   */
-  ANGLE_BRACKET: 'ANGLE_BRACKET',
-
-  /**
-   * From JSDoc and Legacy Closure Library.
-   * Example: {@code Array.<string>}
-   */
-  ANGLE_BRACKET_WITH_DOT: 'ANGLE_BRACKET_WITH_DOT',
-
-  /**
-   * From JSDoc and JSDuck.
-   * Example: {@code String[]}
-   */
-  SQUARE_BRACKET: 'SQUARE_BRACKET',
-};
-
-/**
- * Syntax types for union types.
- * @enum {string}
- */
-const UnionTypeSyntax = {
-  /**
-   * From Closure Library.
-   * Example: {@code Left|Right}
-   */
-  PIPE: 'PIPE',
-
-  /**
-   * From JSDuck.
-   * Example: {@code Left/Right}
-   */
-  SLASH: 'SLASH',
-};
-
-
-const VariadicTypeSyntax = {
-  /**
-   * From Closure Library.
-   * Example: {@code ...Type}
-   */
-  PREFIX_DOTS: 'PREFIX_DOTS',
-
-  /**
-   * From JSDuck.
-   * Example: {@code Type...}
-   */
-  SUFFIX_DOTS: 'SUFFIX_DOTS',
-
-  /**
-   * From Closure Library.
-   * Example: {@code ...}
-   */
-  ONLY_DOTS: 'ONLY_DOTS',
-};
-
-const OptionalTypeSyntax = {
-  PREFIX_EQUALS_SIGN: 'PREFIX_EQUALS_SIGN',
-  SUFFIX_EQUALS_SIGN: 'SUFFIX_EQUALS_SIGN',
-  SUFFIX_KEY_QUESTION_MARK: 'SUFFIX_KEY_QUESTION_MARK',
-};
-
-const NullableTypeSyntax = {
-  PREFIX_QUESTION_MARK: 'PREFIX_QUESTION_MARK',
-  SUFFIX_QUESTION_MARK: 'SUFFIX_QUESTION_MARK',
-};
-
-const NotNullableTypeSyntax = {
-  PREFIX_BANG: 'PREFIX_BANG',
-  SUFFIX_BANG: 'SUFFIX_BANG',
-};
-
-module.exports = {
-  GenericTypeSyntax,
-  UnionTypeSyntax,
-  VariadicTypeSyntax,
-  OptionalTypeSyntax,
-  NullableTypeSyntax,
-  NotNullableTypeSyntax,
-};
diff --git a/node_modules/jsdoctypeparser/lib/parsing.js b/node_modules/jsdoctypeparser/lib/parsing.js
deleted file mode 100644
index fc580a9..0000000
--- a/node_modules/jsdoctypeparser/lib/parsing.js
+++ /dev/null
@@ -1,47 +0,0 @@
-'use strict';
-
-/**
- * @typedef AstNode
- * @property {string} type
- * @property {'none'|'single'|'double'} [quoteStyle]
- * @property {string} [key]
- * @property {string} [name]
- * @property {string} [number]
- * @property {string} [path]
- * @property {string} [string]
- * @property {boolean} [hasEventPrefix]
- * @property {boolean} [typeName]
- * @property {Object<string,any>} [meta]
- * @property {AstNode} [returns]
- * @property {AstNode} [new]
- * @property {AstNode} [value]
- * @property {AstNode} [left]
- * @property {AstNode} [right]
- * @property {AstNode} [owner]
- * @property {AstNode} [subject]
- * @property {AstNode} [this]
- * @property {AstNode[]} [entries]
- * @property {AstNode[]} [objects]
- * @property {AstNode[]} [params]
- */
-
-const {SyntaxError: JSDocTypeSyntaxError, parse} = require('../peg_lib/jsdoctype.js');
-
-module.exports = {
-
-  /** * A class for JSDoc type expression syntax errors.
-   * @constructor
-   * @extends {Error}
-   */
-  JSDocTypeSyntaxError,
-
-
-  /**
-   * Parse the specified type expression string.
-   * @param {string} typeExprStr Type expression string.
-   * @return {AstNode} AST.
-   */
-  parse (typeExprStr) {
-    return parse(typeExprStr);
-  },
-};
diff --git a/node_modules/jsdoctypeparser/lib/publishing.js b/node_modules/jsdoctypeparser/lib/publishing.js
deleted file mode 100644
index 18f718b..0000000
--- a/node_modules/jsdoctypeparser/lib/publishing.js
+++ /dev/null
@@ -1,195 +0,0 @@
-'use strict';
-
-const {OPTIONAL} = require('./NodeType');
-const {OptionalTypeSyntax, VariadicTypeSyntax} = require('./SyntaxType');
-const {format} = require('util');
-
-/** @typedef {import('./parsing').AstNode} AstNode */
-/** @typedef {(node) => string} ConcretePublish */
-/** @typedef {{ [T in import('./NodeType').Type]: (node: AstNode, publish: ConcretePublish) => string }} Publisher */
-
-/**
- * @param {AstNode} node
- * @param {Publisher} [opt_publisher]
- * @return {string}
- */
-function publish(node, opt_publisher) {
-  const publisher = opt_publisher || createDefaultPublisher();
-  return publisher[node.type](node, function(childNode) {
-    return publish(childNode, publisher);
-  });
-}
-
-/**
- * @private
- * @param {string} str
- * @param {'none'|'single'|'double'|undefined} quoteStyle
- * @returns {string} Formatted string
- */
-function addQuotesForName (str, quoteStyle) {
-  // For `MemberName`, not strings
-  if (!quoteStyle || quoteStyle === 'none') {
-    return str;
-  }
-  const singleQuoteStyle = quoteStyle === 'single';
-
-  return format(
-    singleQuoteStyle
-      ? "'%s'"
-      : '"%s"',
-    str
-      .replace(/\\/g, '\\\\')
-      .replace(
-        singleQuoteStyle ? /'/gu : /"/gu,
-        '\\' + (singleQuoteStyle ? "'" : '"')
-      )
-  );
-}
-
-/** @return {Publisher} */
-function createDefaultPublisher() {
-  return {
-    NAME (nameNode) {
-      return nameNode.name;
-    },
-    MEMBER (memberNode, concretePublish) {
-      return format('%s.%s%s', concretePublish(memberNode.owner),
-                    memberNode.hasEventPrefix ? 'event:' : '',
-                    addQuotesForName(memberNode.name, memberNode.quoteStyle));
-    },
-    UNION (unionNode, concretePublish) {
-      return format('%s|%s', concretePublish(unionNode.left),
-                    concretePublish(unionNode.right));
-    },
-    VARIADIC (variadicNode, concretePublish) {
-      if (variadicNode.meta.syntax === VariadicTypeSyntax.ONLY_DOTS) {
-        return '...';
-      }
-      return format('...%s', concretePublish(variadicNode.value));
-    },
-    RECORD (recordNode, concretePublish) {
-      const concretePublishedEntries = recordNode.entries.map(concretePublish);
-      return format('{%s}', concretePublishedEntries.join(', '));
-    },
-    RECORD_ENTRY (entryNode, concretePublish) {
-      if (!entryNode.value) return addQuotesForName(entryNode.key, entryNode.quoteStyle);
-      const keySuffix = (
-        entryNode.value.type === OPTIONAL &&
-        entryNode.value.meta.syntax === OptionalTypeSyntax.SUFFIX_KEY_QUESTION_MARK
-      )
-        ? '?'
-        : '';
-      return format('%s%s: %s', addQuotesForName(entryNode.key, entryNode.quoteStyle), keySuffix, concretePublish(entryNode.value));
-    },
-    TUPLE (tupleNode, concretePublish) {
-      const concretePublishedEntries = tupleNode.entries.map(concretePublish);
-      return format('[%s]', concretePublishedEntries.join(', '));
-    },
-    GENERIC (genericNode, concretePublish) {
-      const concretePublishedObjects = genericNode.objects.map(concretePublish);
-      if (genericNode.meta) {
-        switch (genericNode.meta.syntax) {
-        case 'SQUARE_BRACKET':
-          if (genericNode.subject && genericNode.subject.name === 'Array') {
-            return format('%s[]', concretePublishedObjects.join(', '));
-          }
-          break;
-        case 'ANGLE_BRACKET_WITH_DOT':
-          return format('%s.<%s>', concretePublish(genericNode.subject),
-                        concretePublishedObjects.join(', '));
-        }
-      }
-      return format('%s<%s>', concretePublish(genericNode.subject),
-                    concretePublishedObjects.join(', '));
-    },
-    MODULE (moduleNode, concretePublish) {
-      return format('module:%s', concretePublish(moduleNode.value));
-    },
-    FILE_PATH (filePathNode) {
-      return addQuotesForName(filePathNode.path, filePathNode.quoteStyle);
-    },
-    OPTIONAL (optionalNode, concretePublish) {
-      if (optionalNode.meta.syntax === OptionalTypeSyntax.SUFFIX_KEY_QUESTION_MARK) {
-        return concretePublish(optionalNode.value);
-      }
-      return format('%s=', concretePublish(optionalNode.value));
-    },
-    NULLABLE (nullableNode, concretePublish) {
-      return format('?%s', concretePublish(nullableNode.value));
-    },
-    NOT_NULLABLE (notNullableNode, concretePublish) {
-      return format('!%s', concretePublish(notNullableNode.value));
-    },
-    FUNCTION (functionNode, concretePublish) {
-      const publidshedParams = functionNode.params.map(concretePublish);
-
-      if (functionNode.new) {
-        publidshedParams.unshift(format('new: %s',
-          concretePublish(functionNode.new)));
-      }
-
-      if (functionNode.this) {
-        publidshedParams.unshift(format('this: %s',
-          concretePublish(functionNode.this)));
-      }
-
-      if (functionNode.returns) {
-        return format('function(%s): %s', publidshedParams.join(', '),
-                           concretePublish(functionNode.returns));
-      }
-
-      return format('function(%s)', publidshedParams.join(', '));
-    },
-    ARROW (functionNode, concretePublish) {
-      const publishedParams = functionNode.params.map(concretePublish);
-      return (functionNode.new ? 'new ' : '') + format('(%s) => %s', publishedParams.join(', '), concretePublish(functionNode.returns));
-    },
-    NAMED_PARAMETER (parameterNode, concretePublish) {
-      return parameterNode.name + (parameterNode.typeName ? ': ' + concretePublish(parameterNode.typeName) : '');
-    },
-    ANY () {
-      return '*';
-    },
-    UNKNOWN () {
-      return '?';
-    },
-    INNER_MEMBER (memberNode, concretePublish) {
-      return concretePublish(memberNode.owner) + '~' +
-        (memberNode.hasEventPrefix ? 'event:' : '') +
-        addQuotesForName(memberNode.name, memberNode.quoteStyle);
-    },
-    INSTANCE_MEMBER (memberNode, concretePublish) {
-      return concretePublish(memberNode.owner) + '#' +
-        (memberNode.hasEventPrefix ? 'event:' : '') +
-        addQuotesForName(memberNode.name, memberNode.quoteStyle);
-    },
-    STRING_VALUE (stringValueNode) {
-      return addQuotesForName(stringValueNode.string, stringValueNode.quoteStyle)
-    },
-    NUMBER_VALUE (numberValueNode) {
-      return numberValueNode.number;
-    },
-    EXTERNAL (externalNode /* , concretePublish */) {
-      const {name, quoteStyle} = externalNode;
-      return format('external:%s', addQuotesForName(name, quoteStyle));
-    },
-    PARENTHESIS (parenthesizedNode, concretePublish) {
-      return format('(%s)', concretePublish(parenthesizedNode.value));
-    },
-    TYPE_QUERY (typeQueryNode, concretePublish) {
-      return format('typeof %s', concretePublish(typeQueryNode.name));
-    },
-    KEY_QUERY (keyQueryNode, concretePublish) {
-      return format('keyof %s', concretePublish(keyQueryNode.value));
-    },
-    IMPORT (importNode, concretePublish) {
-      return format('import(%s)', concretePublish(importNode.path));
-    },
-  };
-}
-
-
-module.exports = {
-  publish: publish,
-  createDefaultPublisher: createDefaultPublisher,
-};
diff --git a/node_modules/jsdoctypeparser/lib/traversing.js b/node_modules/jsdoctypeparser/lib/traversing.js
deleted file mode 100644
index add8dd2..0000000
--- a/node_modules/jsdoctypeparser/lib/traversing.js
+++ /dev/null
@@ -1,150 +0,0 @@
-'use strict';
-
-/** @typedef {import('./NodeType').Type} NodeType */
-/** @typedef {{ type: NodeType }} Node */
-/** @typedef {(node: Node, parentPropName: string | null, parentNode: Node | null) => void} TraversalCallback */
-
-/**
- * Traverse the specified AST.
- * @param {Node} node AST to traverse.
- * @param {TraversalCallback} [opt_onEnter] Callback for onEnter.
- * @param {TraversalCallback} [opt_onLeave] Callback for onLeave.
- */
-function traverse(node, opt_onEnter, opt_onLeave) {
-  if (opt_onEnter) opt_onEnter(node, null, null);
-
-  if (node) {
-    const childNodeInfo = _collectChildNodeInfo(node);
-    childNodeInfo.forEach(function([childNode, parentPropName, parentNode]) {
-      traverse(childNode, opt_onEnter ? (node, pn, pNode) => {
-        opt_onEnter(node, pn || parentPropName, pNode || parentNode);
-      } : null, opt_onLeave ? (node, pn, pNode) => {
-        opt_onLeave(node, pn || parentPropName, pNode || parentNode);
-      } : null);
-    });
-  }
-
-  if (opt_onLeave) opt_onLeave(node, null, null);
-}
-
-
-/**
- * @private
- */
-const _PropertyAccessor = {
-  NODE (fn, node, parentPropName, parentNode) {
-    fn(node, parentPropName, parentNode);
-  },
-  NODE_LIST (fn, nodes, parentPropName, parentNode) {
-    nodes.forEach(function(node) {
-      fn(node, parentPropName, parentNode);
-    });
-  },
-  NULLABLE_NODE (fn, opt_node, parentPropName, parentNode) {
-    if (opt_node) fn(opt_node, parentPropName, parentNode);
-  },
-};
-
-
-/**
- * @private
- * @type {{ [T in NodeType]: object }}
- */
-const _childNodesMap = {
-  NAME: {},
-  NAMED_PARAMETER: {
-    typeName: _PropertyAccessor.NULLABLE_NODE,
-  },
-  MEMBER: {
-    owner: _PropertyAccessor.NODE,
-  },
-  UNION: {
-    left: _PropertyAccessor.NODE,
-    right: _PropertyAccessor.NODE,
-  },
-  VARIADIC: {
-    value: _PropertyAccessor.NODE,
-  },
-  RECORD: {
-    entries: _PropertyAccessor.NODE_LIST,
-  },
-  RECORD_ENTRY: {
-    value: _PropertyAccessor.NULLABLE_NODE,
-  },
-  TUPLE: {
-    entries: _PropertyAccessor.NODE_LIST,
-  },
-  GENERIC: {
-    subject: _PropertyAccessor.NODE,
-    objects: _PropertyAccessor.NODE_LIST,
-  },
-  MODULE: {
-    value: _PropertyAccessor.NODE,
-  },
-  OPTIONAL: {
-    value: _PropertyAccessor.NODE,
-  },
-  NULLABLE: {
-    value: _PropertyAccessor.NODE,
-  },
-  NOT_NULLABLE: {
-    value: _PropertyAccessor.NODE,
-  },
-  FUNCTION: {
-    params: _PropertyAccessor.NODE_LIST,
-    returns: _PropertyAccessor.NULLABLE_NODE,
-    this: _PropertyAccessor.NULLABLE_NODE,
-    new: _PropertyAccessor.NULLABLE_NODE,
-  },
-  ARROW: {
-    params: _PropertyAccessor.NODE_LIST,
-    returns: _PropertyAccessor.NULLABLE_NODE,
-  },
-  ANY: {},
-  UNKNOWN: {},
-  INNER_MEMBER: {
-    owner: _PropertyAccessor.NODE,
-  },
-  INSTANCE_MEMBER: {
-    owner: _PropertyAccessor.NODE,
-  },
-  STRING_VALUE: {},
-  NUMBER_VALUE: {},
-  EXTERNAL: {},
-  FILE_PATH: {},
-  PARENTHESIS: {
-    value: _PropertyAccessor.NODE,
-  },
-  TYPE_QUERY: {
-    name: _PropertyAccessor.NODE,
-  },
-  KEY_QUERY: {
-    value: _PropertyAccessor.NODE,
-  },
-  IMPORT: {
-    path: _PropertyAccessor.NODE,
-  },
-};
-
-
-/**
- * @private
- * @param {Node} node
- */
-function _collectChildNodeInfo(node) {
-  const childNodeInfo = [];
-  const propAccessorMap = _childNodesMap[node.type];
-
-  Object.keys(propAccessorMap).forEach(function(propName) {
-    const propAccessor = propAccessorMap[propName];
-    propAccessor((node, propName, parentNode) => {
-      childNodeInfo.push([node, propName, parentNode]);
-    }, node[propName], propName, node);
-  });
-
-  return childNodeInfo;
-}
-
-module.exports = {
-  traverse,
-};
diff --git a/node_modules/jsdoctypeparser/package.json b/node_modules/jsdoctypeparser/package.json
deleted file mode 100644
index 9e57e41..0000000
--- a/node_modules/jsdoctypeparser/package.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-  "name": "jsdoctypeparser",
-  "description": "Strict JsDoc type expression parser.",
-  "version": "6.1.0",
-  "author": "Kuniwak <orga.chem.job@gmail.com>",
-  "contributors": [
-    "Brett Zamir",
-    "Nathan Shively-Sanders"
-  ],
-  "keywords": [
-    "jsdoc",
-    "type expression",
-    "parser"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/jsdoctypeparser/jsdoctypeparser.git"
-  },
-  "engines": {
-    "node": ">=6"
-  },
-  "homepage": "https://jsdoctypeparser.github.io",
-  "bugs": {
-    "mail": "orga.chem.job@gmail.com",
-    "url": "https://github.com/jsdoctypeparser/jsdoctypeparser/issues"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "main": "index.js",
-  "bin": "./bin/jsdoctypeparser",
-  "scripts": {
-    "prepare": "npm-run-all build",
-    "pretest": "npm-run-all lint build",
-    "test": "npm-run-all mocha typecheck",
-    "lint": "eslint .",
-    "mocha": "mocha tests/test_*",
-    "typecheck": "tsc",
-    "clean": "rimraf ./peg_lib",
-    "postclean": "mkdirp ./peg_lib",
-    "prebuild": "npm-run-all clean",
-    "build": "pegjs --cache -o ./peg_lib/jsdoctype.js ./peg_src/jsdoctype.pegjs"
-  },
-  "husky": {
-    "hooks": {
-      "pre-push": "npm test"
-    }
-  },
-  "dependencies": {},
-  "devDependencies": {
-    "@types/node": "^12.12.14",
-    "chai": "^4.2.0",
-    "eslint": "^6.7.2",
-    "husky": "^3.1.0",
-    "mkdirp": "^0.5.1",
-    "mocha": "^6.2.2",
-    "npm-run-all": "^4.1.5",
-    "object.entries-ponyfill": "^1.0.1",
-    "pegjs": "^0.10.0",
-    "rimraf": "^3.0.0",
-    "typescript": "^3.7.2"
-  },
-  "license": "MIT"
-}
diff --git a/node_modules/jsdoctypeparser/peg_lib/jsdoctype.js b/node_modules/jsdoctypeparser/peg_lib/jsdoctype.js
deleted file mode 100644
index 6fdec36..0000000
--- a/node_modules/jsdoctypeparser/peg_lib/jsdoctype.js
+++ /dev/null
@@ -1,7496 +0,0 @@
-/*
- * Generated by PEG.js 0.10.0.
- *
- * http://pegjs.org/
- */
-
-"use strict";
-
-function peg$subclass(child, parent) {
-  function ctor() { this.constructor = child; }
-  ctor.prototype = parent.prototype;
-  child.prototype = new ctor();
-}
-
-function peg$SyntaxError(message, expected, found, location) {
-  this.message  = message;
-  this.expected = expected;
-  this.found    = found;
-  this.location = location;
-  this.name     = "SyntaxError";
-
-  if (typeof Error.captureStackTrace === "function") {
-    Error.captureStackTrace(this, peg$SyntaxError);
-  }
-}
-
-peg$subclass(peg$SyntaxError, Error);
-
-peg$SyntaxError.buildMessage = function(expected, found) {
-  var DESCRIBE_EXPECTATION_FNS = {
-        literal: function(expectation) {
-          return "\"" + literalEscape(expectation.text) + "\"";
-        },
-
-        "class": function(expectation) {
-          var escapedParts = "",
-              i;
-
-          for (i = 0; i < expectation.parts.length; i++) {
-            escapedParts += expectation.parts[i] instanceof Array
-              ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1])
-              : classEscape(expectation.parts[i]);
-          }
-
-          return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
-        },
-
-        any: function(expectation) {
-          return "any character";
-        },
-
-        end: function(expectation) {
-          return "end of input";
-        },
-
-        other: function(expectation) {
-          return expectation.description;
-        }
-      };
-
-  function hex(ch) {
-    return ch.charCodeAt(0).toString(16).toUpperCase();
-  }
-
-  function literalEscape(s) {
-    return s
-      .replace(/\\/g, '\\\\')
-      .replace(/"/g,  '\\"')
-      .replace(/\0/g, '\\0')
-      .replace(/\t/g, '\\t')
-      .replace(/\n/g, '\\n')
-      .replace(/\r/g, '\\r')
-      .replace(/[\x00-\x0F]/g,          function(ch) { return '\\x0' + hex(ch); })
-      .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x'  + hex(ch); });
-  }
-
-  function classEscape(s) {
-    return s
-      .replace(/\\/g, '\\\\')
-      .replace(/\]/g, '\\]')
-      .replace(/\^/g, '\\^')
-      .replace(/-/g,  '\\-')
-      .replace(/\0/g, '\\0')
-      .replace(/\t/g, '\\t')
-      .replace(/\n/g, '\\n')
-      .replace(/\r/g, '\\r')
-      .replace(/[\x00-\x0F]/g,          function(ch) { return '\\x0' + hex(ch); })
-      .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x'  + hex(ch); });
-  }
-
-  function describeExpectation(expectation) {
-    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
-  }
-
-  function describeExpected(expected) {
-    var descriptions = new Array(expected.length),
-        i, j;
-
-    for (i = 0; i < expected.length; i++) {
-      descriptions[i] = describeExpectation(expected[i]);
-    }
-
-    descriptions.sort();
-
-    if (descriptions.length > 0) {
-      for (i = 1, j = 1; i < descriptions.length; i++) {
-        if (descriptions[i - 1] !== descriptions[i]) {
-          descriptions[j] = descriptions[i];
-          j++;
-        }
-      }
-      descriptions.length = j;
-    }
-
-    switch (descriptions.length) {
-      case 1:
-        return descriptions[0];
-
-      case 2:
-        return descriptions[0] + " or " + descriptions[1];
-
-      default:
-        return descriptions.slice(0, -1).join(", ")
-          + ", or "
-          + descriptions[descriptions.length - 1];
-    }
-  }
-
-  function describeFound(found) {
-    return found ? "\"" + literalEscape(found) + "\"" : "end of input";
-  }
-
-  return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
-};
-
-function peg$parse(input, options) {
-  options = options !== void 0 ? options : {};
-
-  var peg$FAILED = {},
-
-      peg$startRuleFunctions = { TopTypeExpr: peg$parseTopTypeExpr },
-      peg$startRuleFunction  = peg$parseTopTypeExpr,
-
-      peg$c0 = function(expr) {
-                 return expr;
-               },
-      peg$c1 = /^[ \t]/,
-      peg$c2 = peg$classExpectation([" ", "\t"], false, false),
-      peg$c3 = /^[\r]/,
-      peg$c4 = peg$classExpectation(["\r"], false, false),
-      peg$c5 = /^[\n]/,
-      peg$c6 = peg$classExpectation(["\n"], false, false),
-      peg$c7 = /^[a-zA-Z_$]/,
-      peg$c8 = peg$classExpectation([["a", "z"], ["A", "Z"], "_", "$"], false, false),
-      peg$c9 = /^[a-zA-Z0-9_$]/,
-      peg$c10 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"], "_", "$"], false, false),
-      peg$c11 = "event:",
-      peg$c12 = peg$literalExpectation("event:", false),
-      peg$c13 = function(rootOwner, memberPartWithOperators) {
-                     return memberPartWithOperators.reduce(function(owner, tokens) {
-                       const operatorType = tokens[1];
-                       const eventNamespace = tokens[3];
-                       const MemberName = tokens[5];
-                       const {quoteStyle, name: memberName} = MemberName;
-
-                       switch (operatorType) {
-                         case NamepathOperatorType.MEMBER:
-                           return {
-                             type: NodeType.MEMBER,
-                             owner,
-                             name: memberName,
-                             quoteStyle,
-                             hasEventPrefix: Boolean(eventNamespace),
-                           };
-                         case NamepathOperatorType.INSTANCE_MEMBER:
-                           return {
-                             type: NodeType.INSTANCE_MEMBER,
-                             owner,
-                             name: memberName,
-                             quoteStyle,
-                             hasEventPrefix: Boolean(eventNamespace),
-                           };
-                         case NamepathOperatorType.INNER_MEMBER:
-                           return {
-                             type: NodeType.INNER_MEMBER,
-                             owner,
-                             name: memberName,
-                             quoteStyle,
-                             hasEventPrefix: Boolean(eventNamespace),
-                           };
-                         default:
-                           throw new Error('Unexpected operator type: "' + operatorType + '"');
-                       }
-                     }, rootOwner);
-                   },
-      peg$c14 = function(name) {
-                           return {
-                             type: NodeType.NAME,
-                             name
-                           };
-                         },
-      peg$c15 = /^[a-zA-Z0-9_$\-]/,
-      peg$c16 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"], "_", "$", "-"], false, false),
-      peg$c17 = function(name) {
-                                  return {
-                                    type: NodeType.NAME,
-                                    name
-                                  };
-                                },
-      peg$c18 = "'",
-      peg$c19 = peg$literalExpectation("'", false),
-      peg$c20 = /^[^\\']/,
-      peg$c21 = peg$classExpectation(["\\", "'"], true, false),
-      peg$c22 = "\\",
-      peg$c23 = peg$literalExpectation("\\", false),
-      peg$c24 = peg$anyExpectation(),
-      peg$c25 = function(name) {
-                     return {
-                       quoteStyle: 'single',
-                       name: name.replace(/\\'/g, "'")
-                         .replace(/\\\\/gu, '\\')
-                     };
-                   },
-      peg$c26 = "\"",
-      peg$c27 = peg$literalExpectation("\"", false),
-      peg$c28 = /^[^\\"]/,
-      peg$c29 = peg$classExpectation(["\\", "\""], true, false),
-      peg$c30 = function(name) {
-                     return {
-                       quoteStyle: 'double',
-                       name: name.replace(/\\"/gu, '"')
-                        .replace(/\\\\/gu, '\\')
-                     };
-                   },
-      peg$c31 = function(name) {
-                   return {
-                     quoteStyle: 'none',
-                     name
-                   };
-                 },
-      peg$c32 = ".",
-      peg$c33 = peg$literalExpectation(".", false),
-      peg$c34 = function(rootOwner, memberPart) {
-                            return memberPart.reduce(function(owner, tokens) {
-                              return {
-                                type: NodeType.MEMBER,
-                                owner,
-                                name: tokens[3]
-                              }
-                            }, rootOwner);
-                          },
-      peg$c35 = function() {
-                           return NamepathOperatorType.MEMBER;
-                         },
-      peg$c36 = "~",
-      peg$c37 = peg$literalExpectation("~", false),
-      peg$c38 = function() {
-                                return NamepathOperatorType.INNER_MEMBER;
-                              },
-      peg$c39 = "#",
-      peg$c40 = peg$literalExpectation("#", false),
-      peg$c41 = function() {
-                                   return NamepathOperatorType.INSTANCE_MEMBER;
-                                 },
-      peg$c42 = "external",
-      peg$c43 = peg$literalExpectation("external", false),
-      peg$c44 = ":",
-      peg$c45 = peg$literalExpectation(":", false),
-      peg$c46 = function(external, memberPartWithOperators) {
-                return memberPartWithOperators.reduce(function(owner, tokens) {
-                  const operatorType = tokens[1];
-                  const eventNamespace = tokens[3];
-                  const MemberName = tokens[5];
-                  const {quoteStyle, name: memberName} = MemberName;
-
-                  switch (operatorType) {
-                    case NamepathOperatorType.MEMBER:
-                      return {
-                        type: NodeType.MEMBER,
-                        owner,
-                        name: memberName,
-                        quoteStyle,
-                        hasEventPrefix: Boolean(eventNamespace),
-                      };
-                    case NamepathOperatorType.INSTANCE_MEMBER:
-                      return {
-                        type: NodeType.INSTANCE_MEMBER,
-                        owner,
-                        name: memberName,
-                        quoteStyle,
-                        hasEventPrefix: Boolean(eventNamespace),
-                      };
-                    case NamepathOperatorType.INNER_MEMBER:
-                      return {
-                        type: NodeType.INNER_MEMBER,
-                        owner,
-                        name: memberName,
-                        quoteStyle,
-                        hasEventPrefix: Boolean(eventNamespace),
-                      };
-                    default:
-                      throw new Error('Unexpected operator type: "' + operatorType + '"');
-                  }
-                }, Object.assign({
-                  type: NodeType.EXTERNAL
-                }, external));
-              },
-      peg$c47 = "module",
-      peg$c48 = peg$literalExpectation("module", false),
-      peg$c49 = function(value) {
-                       return {
-                         type: NodeType.MODULE,
-                         value,
-                       };
-                     },
-      peg$c50 = function(rootOwner, memberPartWithOperators) {
-                       return memberPartWithOperators.reduce(function(owner, tokens) {
-                         const operatorType = tokens[1];
-                         const eventNamespace = tokens[3];
-                         const MemberName = tokens[5];
-                         const {quoteStyle, name: memberName} = MemberName;
-
-                         switch (operatorType) {
-                           case NamepathOperatorType.MEMBER:
-                             return {
-                               type: NodeType.MEMBER,
-                               owner,
-                               name: memberName,
-                               quoteStyle,
-                               hasEventPrefix: Boolean(eventNamespace),
-                             };
-                           case NamepathOperatorType.INSTANCE_MEMBER:
-                             return {
-                               type: NodeType.INSTANCE_MEMBER,
-                               owner,
-                               name: memberName,
-                               quoteStyle,
-                               hasEventPrefix: Boolean(eventNamespace),
-                             };
-                           case NamepathOperatorType.INNER_MEMBER:
-                             return {
-                               type: NodeType.INNER_MEMBER,
-                               owner,
-                               name: memberName,
-                               quoteStyle,
-                               hasEventPrefix: Boolean(eventNamespace),
-                             };
-                           default:
-                             throw new Error('Unexpected operator type: "' + operatorType + '"');
-                         }
-                       }, rootOwner);
-                     },
-      peg$c51 = function(path) {
-                      return {
-                        quoteStyle: 'single',
-                        type: NodeType.FILE_PATH,
-                        path: path.replace(/\\'/g, "'")
-                          .replace(/\\\\/gu, '\\')
-                      };
-                    },
-      peg$c52 = function(path) {
-                      return {
-                        quoteStyle: 'double',
-                        type: NodeType.FILE_PATH,
-                        path: path.replace(/\\"/gu, '"')
-                         .replace(/\\\\/gu, '\\')
-                      };
-                    },
-      peg$c53 = /^[a-zA-Z0-9_$\/\-]/,
-      peg$c54 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"], "_", "$", "/", "-"], false, false),
-      peg$c55 = function(path) {
-                     return {
-                       quoteStyle: 'none',
-                       type: NodeType.FILE_PATH,
-                       path,
-                     };
-                   },
-      peg$c56 = "*",
-      peg$c57 = peg$literalExpectation("*", false),
-      peg$c58 = function() {
-                    return { type: NodeType.ANY };
-                  },
-      peg$c59 = "?",
-      peg$c60 = peg$literalExpectation("?", false),
-      peg$c61 = function() {
-                        return { type: NodeType.UNKNOWN };
-                      },
-      peg$c62 = function(value) {
-                            return {
-                              type: NodeType.STRING_VALUE,
-                              quoteStyle: 'double',
-                              string: value.replace(/\\"/gu, '"')
-                                  .replace(/\\\\/gu, '\\')
-                            };
-                          },
-      peg$c63 = function(value) {
-                            return {
-                              type: NodeType.STRING_VALUE,
-                              quoteStyle: 'single',
-                              string: value.replace(/\\'/g, "'")
-                                  .replace(/\\\\/gu, '\\')
-                            };
-                          },
-      peg$c64 = function(value) {
-                          return {
-                            type: NodeType.NUMBER_VALUE,
-                            number: value
-                          };
-                        },
-      peg$c65 = "+",
-      peg$c66 = peg$literalExpectation("+", false),
-      peg$c67 = "-",
-      peg$c68 = peg$literalExpectation("-", false),
-      peg$c69 = /^[0-9]/,
-      peg$c70 = peg$classExpectation([["0", "9"]], false, false),
-      peg$c71 = "e",
-      peg$c72 = peg$literalExpectation("e", false),
-      peg$c73 = "0b",
-      peg$c74 = peg$literalExpectation("0b", false),
-      peg$c75 = /^[01]/,
-      peg$c76 = peg$classExpectation(["0", "1"], false, false),
-      peg$c77 = "0o",
-      peg$c78 = peg$literalExpectation("0o", false),
-      peg$c79 = /^[0-7]/,
-      peg$c80 = peg$classExpectation([["0", "7"]], false, false),
-      peg$c81 = "0x",
-      peg$c82 = peg$literalExpectation("0x", false),
-      peg$c83 = /^[0-9a-fA-F]/,
-      peg$c84 = peg$classExpectation([["0", "9"], ["a", "f"], ["A", "F"]], false, false),
-      peg$c85 = function(left, syntax, right) {
-                      return {
-                          type: NodeType.UNION,
-                          left,
-                          right,
-                          meta: { syntax },
-                      };
-                    },
-      peg$c86 = "|",
-      peg$c87 = peg$literalExpectation("|", false),
-      peg$c88 = function() {
-                                                return UnionTypeSyntax.PIPE;
-                                              },
-      peg$c89 = "/",
-      peg$c90 = peg$literalExpectation("/", false),
-      peg$c91 = function() {
-                                        return UnionTypeSyntax.SLASH;
-                                      },
-      peg$c92 = "typeof",
-      peg$c93 = peg$literalExpectation("typeof", false),
-      peg$c94 = function(operator, name) {
-                      return {
-                          type: NodeType.TYPE_QUERY,
-                          name,
-                      };
-                    },
-      peg$c95 = "keyof",
-      peg$c96 = peg$literalExpectation("keyof", false),
-      peg$c97 = function(operator, operand) {
-        return {
-          type: NodeType.KEY_QUERY,
-          value: operand,
-        }
-      },
-      peg$c98 = "import",
-      peg$c99 = peg$literalExpectation("import", false),
-      peg$c100 = "(",
-      peg$c101 = peg$literalExpectation("(", false),
-      peg$c102 = ")",
-      peg$c103 = peg$literalExpectation(")", false),
-      peg$c104 = function(operator, path) {
-                       return { type: NodeType.IMPORT, path };
-                     },
-      peg$c105 = function(operator, operand) {
-                               return {
-                                 type: NodeType.NULLABLE,
-                                 value: operand,
-                                 meta: { syntax: NullableTypeSyntax.PREFIX_QUESTION_MARK },
-                               };
-                             },
-      peg$c106 = "!",
-      peg$c107 = peg$literalExpectation("!", false),
-      peg$c108 = function(operator, operand) {
-                                  return {
-                                    type: NodeType.NOT_NULLABLE,
-                                    value: operand,
-                                    meta: { syntax: NotNullableTypeSyntax.PREFIX_BANG },
-                                  };
-                                },
-      peg$c109 = "=",
-      peg$c110 = peg$literalExpectation("=", false),
-      peg$c111 = function(operator, operand) {
-                               return {
-                                 type: NodeType.OPTIONAL,
-                                 value: operand,
-                                 meta: { syntax: OptionalTypeSyntax.PREFIX_EQUALS_SIGN },
-                               };
-                             },
-      peg$c112 = function(operand, operator) {
-                               return {
-                                 type: NodeType.NULLABLE,
-                                 value: operand,
-                                 meta: { syntax: NullableTypeSyntax.SUFFIX_QUESTION_MARK },
-                               };
-                             },
-      peg$c113 = function(operand, operator) {
-                                  return {
-                                    type: NodeType.NOT_NULLABLE,
-                                    value: operand,
-                                    meta: { syntax: NotNullableTypeSyntax.SUFFIX_BANG },
-                                  };
-                                },
-      peg$c114 = function(operand, operator) {
-                               return {
-                                 type: NodeType.OPTIONAL,
-                                 value: operand,
-                                 meta: { syntax: OptionalTypeSyntax.SUFFIX_EQUALS_SIGN },
-                               };
-                             },
-      peg$c115 = function(operand, syntax, params) {
-                        return {
-                          type: NodeType.GENERIC,
-                          subject: operand,
-                          objects: params,
-                          meta: { syntax },
-                        };
-                      },
-      peg$c116 = ",",
-      peg$c117 = peg$literalExpectation(",", false),
-      peg$c118 = function(first, restsWithComma) {
-                                     return restsWithComma.reduce(function(params, tokens) {
-                                       return params.concat([tokens[3]]);
-                                     }, [first]);
-                                   },
-      peg$c119 = ".<",
-      peg$c120 = peg$literalExpectation(".<", false),
-      peg$c121 = function() {
-                                                return GenericTypeSyntax.ANGLE_BRACKET_WITH_DOT;
-                                              },
-      peg$c122 = "<",
-      peg$c123 = peg$literalExpectation("<", false),
-      peg$c124 = function() {
-                                                return GenericTypeSyntax.ANGLE_BRACKET;
-                                              },
-      peg$c125 = ">",
-      peg$c126 = peg$literalExpectation(">", false),
-      peg$c127 = "[",
-      peg$c128 = peg$literalExpectation("[", false),
-      peg$c129 = "]",
-      peg$c130 = peg$literalExpectation("]", false),
-      peg$c131 = function(operand, brackets) {
-                      return brackets.reduce(function(operand) {
-                        return {
-                          type: NodeType.GENERIC,
-                          subject: {
-                            type: NodeType.NAME,
-                            name: 'Array'
-                          },
-                          objects: [ operand ],
-                          meta: { syntax: GenericTypeSyntax.SQUARE_BRACKET },
-                        };
-                      }, operand);
-                    },
-      peg$c132 = "new",
-      peg$c133 = peg$literalExpectation("new", false),
-      peg$c134 = "=>",
-      peg$c135 = peg$literalExpectation("=>", false),
-      peg$c136 = function(newModifier, paramsPart, returnedTypeNode) {
-                         return {
-                           type: NodeType.ARROW,
-                           params: paramsPart,
-                           returns: returnedTypeNode,
-                           new: newModifier
-                         };
-      },
-      peg$c137 = function(params) {
-                                  return params;
-                                },
-      peg$c138 = function() {
-                                  return [];
-                                },
-      peg$c139 = function(paramsWithComma, lastParam) {
-        return paramsWithComma.reduceRight(function(params, tokens) {
-          const param = { type: NodeType.NAMED_PARAMETER, name: tokens[0], typeName: tokens[4] };
-          return [param].concat(params);
-        }, lastParam ? [lastParam] : []);
-      },
-      peg$c140 = "...",
-      peg$c141 = peg$literalExpectation("...", false),
-      peg$c142 = function(spread, id, type) {
-        const operand = { type: NodeType.NAMED_PARAMETER, name: id, typeName: type };
-        if (spread) {
-        return {
-          type: NodeType.VARIADIC,
-          value: operand,
-          meta: { syntax: VariadicTypeSyntax.PREFIX_DOTS },
-        };
-        }
-        else {
-          return operand;
-        }
-      },
-      peg$c143 = "function",
-      peg$c144 = peg$literalExpectation("function", false),
-      peg$c145 = function(paramsPart, returnedTypePart) {
-                         const returnedTypeNode = returnedTypePart ? returnedTypePart[2] : null;
-
-                         return {
-                           type: NodeType.FUNCTION,
-                           params: paramsPart.params,
-                           returns: returnedTypeNode,
-                           this: paramsPart.modifier.nodeThis,
-                           new: paramsPart.modifier.nodeNew,
-                         };
-                       },
-      peg$c146 = function(modifier, params) {
-                                     return { params, modifier };
-                                   },
-      peg$c147 = function(modifier) {
-                                     return { params: [], modifier };
-                                   },
-      peg$c148 = function(params) {
-                                     return { params, modifier: { nodeThis: null, nodeNew: null } };
-                                   },
-      peg$c149 = function() {
-                                     return { params: [], modifier: { nodeThis: null, nodeNew: null } };
-                                   },
-      peg$c150 = "this",
-      peg$c151 = peg$literalExpectation("this", false),
-      peg$c152 = function(modifierThis) {
-                                   return { nodeThis: modifierThis[4], nodeNew: null };
-                                 },
-      peg$c153 = function(modifierNew) {
-                                   return { nodeThis: null, nodeNew: modifierNew[4] };
-                                 },
-      peg$c154 = function(paramsWithComma, lastParam) {
-                               return paramsWithComma.reduceRight(function(params, tokens) {
-                                 const [param] = tokens;
-                                 return [param].concat(params);
-                               }, lastParam ? [lastParam] : []);
-                             },
-      peg$c155 = "{",
-      peg$c156 = peg$literalExpectation("{", false),
-      peg$c157 = "}",
-      peg$c158 = peg$literalExpectation("}", false),
-      peg$c159 = function(entries) {
-                       return {
-                         type: NodeType.RECORD,
-                         entries: entries || [],
-                       };
-                     },
-      peg$c160 = ";",
-      peg$c161 = peg$literalExpectation(";", false),
-      peg$c162 = function(first, restWithComma) {
-                              return restWithComma.reduce(function(entries, tokens) {
-                                const entry = tokens[2];
-                                return entries.concat([entry]);
-                              }, [first]);
-                            },
-      peg$c163 = function(keyInfo, optional, value) {
-                              const {quoteStyle, key} = keyInfo;
-                              return {
-                                type: NodeType.RECORD_ENTRY,
-                                key,
-                                quoteStyle,
-                                value: optional !== '?' ? value : {
-                                  type: NodeType.OPTIONAL,
-                                  value,
-                                  meta: { syntax: OptionalTypeSyntax.SUFFIX_KEY_QUESTION_MARK },
-                                }
-                              };
-                            },
-      peg$c164 = function(keyInfo) {
-                              const {quoteStyle, key} = keyInfo;
-                              return {
-                                type: NodeType.RECORD_ENTRY,
-                                key,
-                                value: null,
-                                quoteStyle
-                              };
-                            },
-      peg$c165 = function(key) {
-                                 return {
-                                   quoteStyle: 'double',
-                                   key: key.replace(/\\"/gu, '"')
-                                     .replace(/\\\\/gu, '\\')
-                                 };
-                             },
-      peg$c166 = function(key) {
-                                 return {
-                                   quoteStyle: 'single',
-                                   key: key.replace(/\\'/g, "'")
-                                     .replace(/\\\\/gu, '\\')
-                                 };
-                               },
-      peg$c167 = function(key) {
-                                 return {
-                                   quoteStyle: 'none',
-                                   key
-                                 };
-                             },
-      peg$c168 = function(entries) {
-        return {
-          type: NodeType.TUPLE,
-          entries: entries || [],
-        }
-      },
-      peg$c169 = function(restWithComma, last) {
-        return restWithComma.reduceRight((entries, tokens) => {
-          let [entry] = tokens;
-          return [entry].concat(entries);
-        }, last ? [last] : []);
-      },
-      peg$c170 = function(wrapped) {
-                          return {
-                            type: NodeType.PARENTHESIS,
-                            value: wrapped,
-                          };
-                        },
-      peg$c171 = function(operand) {
-                               return {
-                                 type: NodeType.VARIADIC,
-                                 value: operand,
-                                 meta: { syntax: VariadicTypeSyntax.PREFIX_DOTS },
-                               };
-                             },
-      peg$c172 = function(operand) {
-                               return {
-                                 type: NodeType.VARIADIC,
-                                 value: operand,
-                                 meta: { syntax: VariadicTypeSyntax.SUFFIX_DOTS },
-                               };
-                             },
-      peg$c173 = function() {
-                            return {
-                              type: NodeType.VARIADIC,
-                              value: { type: NodeType.ANY },
-                              meta: { syntax: VariadicTypeSyntax.ONLY_DOTS },
-                            };
-                          },
-
-      peg$currPos          = 0,
-      peg$savedPos         = 0,
-      peg$posDetailsCache  = [{ line: 1, column: 1 }],
-      peg$maxFailPos       = 0,
-      peg$maxFailExpected  = [],
-      peg$silentFails      = 0,
-
-      peg$resultsCache = {},
-
-      peg$result;
-
-  if ("startRule" in options) {
-    if (!(options.startRule in peg$startRuleFunctions)) {
-      throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
-    }
-
-    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
-  }
-
-  function text() {
-    return input.substring(peg$savedPos, peg$currPos);
-  }
-
-  function location() {
-    return peg$computeLocation(peg$savedPos, peg$currPos);
-  }
-
-  function expected(description, location) {
-    location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
-
-    throw peg$buildStructuredError(
-      [peg$otherExpectation(description)],
-      input.substring(peg$savedPos, peg$currPos),
-      location
-    );
-  }
-
-  function error(message, location) {
-    location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
-
-    throw peg$buildSimpleError(message, location);
-  }
-
-  function peg$literalExpectation(text, ignoreCase) {
-    return { type: "literal", text: text, ignoreCase: ignoreCase };
-  }
-
-  function peg$classExpectation(parts, inverted, ignoreCase) {
-    return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
-  }
-
-  function peg$anyExpectation() {
-    return { type: "any" };
-  }
-
-  function peg$endExpectation() {
-    return { type: "end" };
-  }
-
-  function peg$otherExpectation(description) {
-    return { type: "other", description: description };
-  }
-
-  function peg$computePosDetails(pos) {
-    var details = peg$posDetailsCache[pos], p;
-
-    if (details) {
-      return details;
-    } else {
-      p = pos - 1;
-      while (!peg$posDetailsCache[p]) {
-        p--;
-      }
-
-      details = peg$posDetailsCache[p];
-      details = {
-        line:   details.line,
-        column: details.column
-      };
-
-      while (p < pos) {
-        if (input.charCodeAt(p) === 10) {
-          details.line++;
-          details.column = 1;
-        } else {
-          details.column++;
-        }
-
-        p++;
-      }
-
-      peg$posDetailsCache[pos] = details;
-      return details;
-    }
-  }
-
-  function peg$computeLocation(startPos, endPos) {
-    var startPosDetails = peg$computePosDetails(startPos),
-        endPosDetails   = peg$computePosDetails(endPos);
-
-    return {
-      start: {
-        offset: startPos,
-        line:   startPosDetails.line,
-        column: startPosDetails.column
-      },
-      end: {
-        offset: endPos,
-        line:   endPosDetails.line,
-        column: endPosDetails.column
-      }
-    };
-  }
-
-  function peg$fail(expected) {
-    if (peg$currPos < peg$maxFailPos) { return; }
-
-    if (peg$currPos > peg$maxFailPos) {
-      peg$maxFailPos = peg$currPos;
-      peg$maxFailExpected = [];
-    }
-
-    peg$maxFailExpected.push(expected);
-  }
-
-  function peg$buildSimpleError(message, location) {
-    return new peg$SyntaxError(message, null, null, location);
-  }
-
-  function peg$buildStructuredError(expected, found, location) {
-    return new peg$SyntaxError(
-      peg$SyntaxError.buildMessage(expected, found),
-      expected,
-      found,
-      location
-    );
-  }
-
-  function peg$parseTopTypeExpr() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 84 + 0,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parse_();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parseVariadicTypeExpr();
-      if (s2 === peg$FAILED) {
-        s2 = peg$parseUnionTypeExpr();
-        if (s2 === peg$FAILED) {
-          s2 = peg$parseUnaryUnionTypeExpr();
-          if (s2 === peg$FAILED) {
-            s2 = peg$parseArrayTypeExpr();
-            if (s2 === peg$FAILED) {
-              s2 = peg$parseGenericTypeExpr();
-              if (s2 === peg$FAILED) {
-                s2 = peg$parseRecordTypeExpr();
-                if (s2 === peg$FAILED) {
-                  s2 = peg$parseTupleTypeExpr();
-                  if (s2 === peg$FAILED) {
-                    s2 = peg$parseArrowTypeExpr();
-                    if (s2 === peg$FAILED) {
-                      s2 = peg$parseFunctionTypeExpr();
-                      if (s2 === peg$FAILED) {
-                        s2 = peg$parseTypeQueryExpr();
-                        if (s2 === peg$FAILED) {
-                          s2 = peg$parseKeyQueryExpr();
-                          if (s2 === peg$FAILED) {
-                            s2 = peg$parseBroadNamepathExpr();
-                            if (s2 === peg$FAILED) {
-                              s2 = peg$parseParenthesizedExpr();
-                              if (s2 === peg$FAILED) {
-                                s2 = peg$parseValueExpr();
-                                if (s2 === peg$FAILED) {
-                                  s2 = peg$parseAnyTypeExpr();
-                                  if (s2 === peg$FAILED) {
-                                    s2 = peg$parseUnknownTypeExpr();
-                                  }
-                                }
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parse_();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c0(s2);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseTopLevel() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 84 + 1,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parse_();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parseVariadicTypeExpr();
-      if (s2 === peg$FAILED) {
-        s2 = peg$parseUnionTypeExpr();
-        if (s2 === peg$FAILED) {
-          s2 = peg$parseUnaryUnionTypeExpr();
-          if (s2 === peg$FAILED) {
-            s2 = peg$parseArrayTypeExpr();
-            if (s2 === peg$FAILED) {
-              s2 = peg$parseGenericTypeExpr();
-              if (s2 === peg$FAILED) {
-                s2 = peg$parseRecordTypeExpr();
-                if (s2 === peg$FAILED) {
-                  s2 = peg$parseTupleTypeExpr();
-                  if (s2 === peg$FAILED) {
-                    s2 = peg$parseArrowTypeExpr();
-                    if (s2 === peg$FAILED) {
-                      s2 = peg$parseFunctionTypeExpr();
-                      if (s2 === peg$FAILED) {
-                        s2 = peg$parseTypeQueryExpr();
-                        if (s2 === peg$FAILED) {
-                          s2 = peg$parseKeyQueryExpr();
-                          if (s2 === peg$FAILED) {
-                            s2 = peg$parseBroadNamepathExpr();
-                            if (s2 === peg$FAILED) {
-                              s2 = peg$parseParenthesizedExpr();
-                              if (s2 === peg$FAILED) {
-                                s2 = peg$parseValueExpr();
-                                if (s2 === peg$FAILED) {
-                                  s2 = peg$parseAnyTypeExpr();
-                                  if (s2 === peg$FAILED) {
-                                    s2 = peg$parseUnknownTypeExpr();
-                                  }
-                                }
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parse_();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c0(s2);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parse_() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 84 + 2,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = [];
-    if (peg$c1.test(input.charAt(peg$currPos))) {
-      s1 = input.charAt(peg$currPos);
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c2); }
-    }
-    if (s1 === peg$FAILED) {
-      s1 = peg$currPos;
-      if (peg$c3.test(input.charAt(peg$currPos))) {
-        s2 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c4); }
-      }
-      if (s2 === peg$FAILED) {
-        s2 = null;
-      }
-      if (s2 !== peg$FAILED) {
-        if (peg$c5.test(input.charAt(peg$currPos))) {
-          s3 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c6); }
-        }
-        if (s3 !== peg$FAILED) {
-          s2 = [s2, s3];
-          s1 = s2;
-        } else {
-          peg$currPos = s1;
-          s1 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s1;
-        s1 = peg$FAILED;
-      }
-    }
-    while (s1 !== peg$FAILED) {
-      s0.push(s1);
-      if (peg$c1.test(input.charAt(peg$currPos))) {
-        s1 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c2); }
-      }
-      if (s1 === peg$FAILED) {
-        s1 = peg$currPos;
-        if (peg$c3.test(input.charAt(peg$currPos))) {
-          s2 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c4); }
-        }
-        if (s2 === peg$FAILED) {
-          s2 = null;
-        }
-        if (s2 !== peg$FAILED) {
-          if (peg$c5.test(input.charAt(peg$currPos))) {
-            s3 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s3 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c6); }
-          }
-          if (s3 !== peg$FAILED) {
-            s2 = [s2, s3];
-            s1 = s2;
-          } else {
-            peg$currPos = s1;
-            s1 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s1;
-          s1 = peg$FAILED;
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseJsIdentifier() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 84 + 3,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    if (peg$c7.test(input.charAt(peg$currPos))) {
-      s2 = input.charAt(peg$currPos);
-      peg$currPos++;
-    } else {
-      s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c8); }
-    }
-    if (s2 !== peg$FAILED) {
-      s3 = [];
-      if (peg$c9.test(input.charAt(peg$currPos))) {
-        s4 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c10); }
-      }
-      while (s4 !== peg$FAILED) {
-        s3.push(s4);
-        if (peg$c9.test(input.charAt(peg$currPos))) {
-          s4 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c10); }
-        }
-      }
-      if (s3 !== peg$FAILED) {
-        s2 = [s2, s3];
-        s1 = s2;
-      } else {
-        peg$currPos = s1;
-        s1 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s1;
-      s1 = peg$FAILED;
-    }
-    if (s1 !== peg$FAILED) {
-      s0 = input.substring(s0, peg$currPos);
-    } else {
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseNamepathExpr() {
-    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
-
-    var key    = peg$currPos * 84 + 4,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseParenthesizedExpr();
-    if (s1 === peg$FAILED) {
-      s1 = peg$parseImportTypeExpr();
-      if (s1 === peg$FAILED) {
-        s1 = peg$parseTypeNameExpr();
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      s3 = peg$currPos;
-      s4 = peg$parse_();
-      if (s4 !== peg$FAILED) {
-        s5 = peg$parseInfixNamepathOperator();
-        if (s5 !== peg$FAILED) {
-          s6 = peg$parse_();
-          if (s6 !== peg$FAILED) {
-            if (input.substr(peg$currPos, 6) === peg$c11) {
-              s7 = peg$c11;
-              peg$currPos += 6;
-            } else {
-              s7 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c12); }
-            }
-            if (s7 === peg$FAILED) {
-              s7 = null;
-            }
-            if (s7 !== peg$FAILED) {
-              s8 = peg$parse_();
-              if (s8 !== peg$FAILED) {
-                s9 = peg$parseMemberName();
-                if (s9 !== peg$FAILED) {
-                  s4 = [s4, s5, s6, s7, s8, s9];
-                  s3 = s4;
-                } else {
-                  peg$currPos = s3;
-                  s3 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s3;
-                s3 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s3;
-        s3 = peg$FAILED;
-      }
-      while (s3 !== peg$FAILED) {
-        s2.push(s3);
-        s3 = peg$currPos;
-        s4 = peg$parse_();
-        if (s4 !== peg$FAILED) {
-          s5 = peg$parseInfixNamepathOperator();
-          if (s5 !== peg$FAILED) {
-            s6 = peg$parse_();
-            if (s6 !== peg$FAILED) {
-              if (input.substr(peg$currPos, 6) === peg$c11) {
-                s7 = peg$c11;
-                peg$currPos += 6;
-              } else {
-                s7 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c12); }
-              }
-              if (s7 === peg$FAILED) {
-                s7 = null;
-              }
-              if (s7 !== peg$FAILED) {
-                s8 = peg$parse_();
-                if (s8 !== peg$FAILED) {
-                  s9 = peg$parseMemberName();
-                  if (s9 !== peg$FAILED) {
-                    s4 = [s4, s5, s6, s7, s8, s9];
-                    s3 = s4;
-                  } else {
-                    peg$currPos = s3;
-                    s3 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s3;
-                  s3 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s3;
-                s3 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c13(s1, s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseTypeNameExpr() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 5,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseTypeNameExprJsDocFlavored();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseTypeNameExprStrict();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseTypeNameExprStrict() {
-    var s0, s1;
-
-    var key    = peg$currPos * 84 + 6,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseJsIdentifier();
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c14(s1);
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseTypeNameExprJsDocFlavored() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 84 + 7,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    s2 = peg$currPos;
-    if (peg$c7.test(input.charAt(peg$currPos))) {
-      s3 = input.charAt(peg$currPos);
-      peg$currPos++;
-    } else {
-      s3 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c8); }
-    }
-    if (s3 !== peg$FAILED) {
-      s4 = [];
-      if (peg$c15.test(input.charAt(peg$currPos))) {
-        s5 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s5 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c16); }
-      }
-      while (s5 !== peg$FAILED) {
-        s4.push(s5);
-        if (peg$c15.test(input.charAt(peg$currPos))) {
-          s5 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c16); }
-        }
-      }
-      if (s4 !== peg$FAILED) {
-        s3 = [s3, s4];
-        s2 = s3;
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s2;
-      s2 = peg$FAILED;
-    }
-    if (s2 !== peg$FAILED) {
-      s1 = input.substring(s1, peg$currPos);
-    } else {
-      s1 = s2;
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c17(s1);
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseMemberName() {
-    var s0, s1, s2, s3, s4, s5, s6;
-
-    var key    = peg$currPos * 84 + 8,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 39) {
-      s1 = peg$c18;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c19); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      s3 = [];
-      if (peg$c20.test(input.charAt(peg$currPos))) {
-        s4 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c21); }
-      }
-      if (s4 === peg$FAILED) {
-        s4 = peg$currPos;
-        if (input.charCodeAt(peg$currPos) === 92) {
-          s5 = peg$c22;
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c23); }
-        }
-        if (s5 !== peg$FAILED) {
-          if (input.length > peg$currPos) {
-            s6 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s6 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c24); }
-          }
-          if (s6 !== peg$FAILED) {
-            s5 = [s5, s6];
-            s4 = s5;
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s4;
-          s4 = peg$FAILED;
-        }
-      }
-      while (s4 !== peg$FAILED) {
-        s3.push(s4);
-        if (peg$c20.test(input.charAt(peg$currPos))) {
-          s4 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c21); }
-        }
-        if (s4 === peg$FAILED) {
-          s4 = peg$currPos;
-          if (input.charCodeAt(peg$currPos) === 92) {
-            s5 = peg$c22;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c23); }
-          }
-          if (s5 !== peg$FAILED) {
-            if (input.length > peg$currPos) {
-              s6 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c24); }
-            }
-            if (s6 !== peg$FAILED) {
-              s5 = [s5, s6];
-              s4 = s5;
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        }
-      }
-      if (s3 !== peg$FAILED) {
-        s2 = input.substring(s2, peg$currPos);
-      } else {
-        s2 = s3;
-      }
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 39) {
-          s3 = peg$c18;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c19); }
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c25(s2);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.charCodeAt(peg$currPos) === 34) {
-        s1 = peg$c26;
-        peg$currPos++;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c27); }
-      }
-      if (s1 !== peg$FAILED) {
-        s2 = peg$currPos;
-        s3 = [];
-        if (peg$c28.test(input.charAt(peg$currPos))) {
-          s4 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c29); }
-        }
-        if (s4 === peg$FAILED) {
-          s4 = peg$currPos;
-          if (input.charCodeAt(peg$currPos) === 92) {
-            s5 = peg$c22;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c23); }
-          }
-          if (s5 !== peg$FAILED) {
-            if (input.length > peg$currPos) {
-              s6 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c24); }
-            }
-            if (s6 !== peg$FAILED) {
-              s5 = [s5, s6];
-              s4 = s5;
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        }
-        while (s4 !== peg$FAILED) {
-          s3.push(s4);
-          if (peg$c28.test(input.charAt(peg$currPos))) {
-            s4 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s4 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c29); }
-          }
-          if (s4 === peg$FAILED) {
-            s4 = peg$currPos;
-            if (input.charCodeAt(peg$currPos) === 92) {
-              s5 = peg$c22;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c23); }
-            }
-            if (s5 !== peg$FAILED) {
-              if (input.length > peg$currPos) {
-                s6 = input.charAt(peg$currPos);
-                peg$currPos++;
-              } else {
-                s6 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c24); }
-              }
-              if (s6 !== peg$FAILED) {
-                s5 = [s5, s6];
-                s4 = s5;
-              } else {
-                peg$currPos = s4;
-                s4 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          }
-        }
-        if (s3 !== peg$FAILED) {
-          s2 = input.substring(s2, peg$currPos);
-        } else {
-          s2 = s3;
-        }
-        if (s2 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 34) {
-            s3 = peg$c26;
-            peg$currPos++;
-          } else {
-            s3 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c27); }
-          }
-          if (s3 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c30(s2);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-      if (s0 === peg$FAILED) {
-        s0 = peg$currPos;
-        s1 = peg$parseJsIdentifier();
-        if (s1 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c31(s1);
-        }
-        s0 = s1;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseInfixNamepathOperator() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 9,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseMemberTypeOperator();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseInstanceMemberTypeOperator();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseInnerMemberTypeOperator();
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseQualifiedMemberName() {
-    var s0, s1, s2, s3, s4, s5, s6, s7;
-
-    var key    = peg$currPos * 84 + 10,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseTypeNameExpr();
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      s3 = peg$currPos;
-      s4 = peg$parse_();
-      if (s4 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 46) {
-          s5 = peg$c32;
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c33); }
-        }
-        if (s5 !== peg$FAILED) {
-          s6 = peg$parse_();
-          if (s6 !== peg$FAILED) {
-            s7 = peg$parseTypeNameExpr();
-            if (s7 !== peg$FAILED) {
-              s4 = [s4, s5, s6, s7];
-              s3 = s4;
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s3;
-        s3 = peg$FAILED;
-      }
-      while (s3 !== peg$FAILED) {
-        s2.push(s3);
-        s3 = peg$currPos;
-        s4 = peg$parse_();
-        if (s4 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 46) {
-            s5 = peg$c32;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c33); }
-          }
-          if (s5 !== peg$FAILED) {
-            s6 = peg$parse_();
-            if (s6 !== peg$FAILED) {
-              s7 = peg$parseTypeNameExpr();
-              if (s7 !== peg$FAILED) {
-                s4 = [s4, s5, s6, s7];
-                s3 = s4;
-              } else {
-                peg$currPos = s3;
-                s3 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c34(s1, s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseMemberTypeOperator() {
-    var s0, s1;
-
-    var key    = peg$currPos * 84 + 11,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 46) {
-      s1 = peg$c32;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c33); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c35();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseInnerMemberTypeOperator() {
-    var s0, s1;
-
-    var key    = peg$currPos * 84 + 12,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 126) {
-      s1 = peg$c36;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c37); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c38();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseInstanceMemberTypeOperator() {
-    var s0, s1;
-
-    var key    = peg$currPos * 84 + 13,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 35) {
-      s1 = peg$c39;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c40); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c41();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseBroadNamepathExpr() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 14,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseExternalNameExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseModuleNameExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseNamepathExpr();
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseExternalNameExpr() {
-    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;
-
-    var key    = peg$currPos * 84 + 15,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 8) === peg$c42) {
-      s1 = peg$c42;
-      peg$currPos += 8;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c43); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 58) {
-          s3 = peg$c44;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c45); }
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parseMemberName();
-            if (s5 !== peg$FAILED) {
-              s6 = [];
-              s7 = peg$currPos;
-              s8 = peg$parse_();
-              if (s8 !== peg$FAILED) {
-                s9 = peg$parseInfixNamepathOperator();
-                if (s9 !== peg$FAILED) {
-                  s10 = peg$parse_();
-                  if (s10 !== peg$FAILED) {
-                    if (input.substr(peg$currPos, 6) === peg$c11) {
-                      s11 = peg$c11;
-                      peg$currPos += 6;
-                    } else {
-                      s11 = peg$FAILED;
-                      if (peg$silentFails === 0) { peg$fail(peg$c12); }
-                    }
-                    if (s11 === peg$FAILED) {
-                      s11 = null;
-                    }
-                    if (s11 !== peg$FAILED) {
-                      s12 = peg$parse_();
-                      if (s12 !== peg$FAILED) {
-                        s13 = peg$parseMemberName();
-                        if (s13 !== peg$FAILED) {
-                          s8 = [s8, s9, s10, s11, s12, s13];
-                          s7 = s8;
-                        } else {
-                          peg$currPos = s7;
-                          s7 = peg$FAILED;
-                        }
-                      } else {
-                        peg$currPos = s7;
-                        s7 = peg$FAILED;
-                      }
-                    } else {
-                      peg$currPos = s7;
-                      s7 = peg$FAILED;
-                    }
-                  } else {
-                    peg$currPos = s7;
-                    s7 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s7;
-                  s7 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s7;
-                s7 = peg$FAILED;
-              }
-              while (s7 !== peg$FAILED) {
-                s6.push(s7);
-                s7 = peg$currPos;
-                s8 = peg$parse_();
-                if (s8 !== peg$FAILED) {
-                  s9 = peg$parseInfixNamepathOperator();
-                  if (s9 !== peg$FAILED) {
-                    s10 = peg$parse_();
-                    if (s10 !== peg$FAILED) {
-                      if (input.substr(peg$currPos, 6) === peg$c11) {
-                        s11 = peg$c11;
-                        peg$currPos += 6;
-                      } else {
-                        s11 = peg$FAILED;
-                        if (peg$silentFails === 0) { peg$fail(peg$c12); }
-                      }
-                      if (s11 === peg$FAILED) {
-                        s11 = null;
-                      }
-                      if (s11 !== peg$FAILED) {
-                        s12 = peg$parse_();
-                        if (s12 !== peg$FAILED) {
-                          s13 = peg$parseMemberName();
-                          if (s13 !== peg$FAILED) {
-                            s8 = [s8, s9, s10, s11, s12, s13];
-                            s7 = s8;
-                          } else {
-                            peg$currPos = s7;
-                            s7 = peg$FAILED;
-                          }
-                        } else {
-                          peg$currPos = s7;
-                          s7 = peg$FAILED;
-                        }
-                      } else {
-                        peg$currPos = s7;
-                        s7 = peg$FAILED;
-                      }
-                    } else {
-                      peg$currPos = s7;
-                      s7 = peg$FAILED;
-                    }
-                  } else {
-                    peg$currPos = s7;
-                    s7 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s7;
-                  s7 = peg$FAILED;
-                }
-              }
-              if (s6 !== peg$FAILED) {
-                peg$savedPos = s0;
-                s1 = peg$c46(s5, s6);
-                s0 = s1;
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseModuleNameExpr() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 84 + 16,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 6) === peg$c47) {
-      s1 = peg$c47;
-      peg$currPos += 6;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c48); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 58) {
-          s3 = peg$c44;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c45); }
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parseModulePathExpr();
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c49(s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseModulePathExpr() {
-    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
-
-    var key    = peg$currPos * 84 + 17,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseFilePathExpr();
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      s3 = peg$currPos;
-      s4 = peg$parse_();
-      if (s4 !== peg$FAILED) {
-        s5 = peg$parseInfixNamepathOperator();
-        if (s5 !== peg$FAILED) {
-          s6 = peg$parse_();
-          if (s6 !== peg$FAILED) {
-            if (input.substr(peg$currPos, 6) === peg$c11) {
-              s7 = peg$c11;
-              peg$currPos += 6;
-            } else {
-              s7 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c12); }
-            }
-            if (s7 === peg$FAILED) {
-              s7 = null;
-            }
-            if (s7 !== peg$FAILED) {
-              s8 = peg$parse_();
-              if (s8 !== peg$FAILED) {
-                s9 = peg$parseMemberName();
-                if (s9 !== peg$FAILED) {
-                  s4 = [s4, s5, s6, s7, s8, s9];
-                  s3 = s4;
-                } else {
-                  peg$currPos = s3;
-                  s3 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s3;
-                s3 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s3;
-        s3 = peg$FAILED;
-      }
-      while (s3 !== peg$FAILED) {
-        s2.push(s3);
-        s3 = peg$currPos;
-        s4 = peg$parse_();
-        if (s4 !== peg$FAILED) {
-          s5 = peg$parseInfixNamepathOperator();
-          if (s5 !== peg$FAILED) {
-            s6 = peg$parse_();
-            if (s6 !== peg$FAILED) {
-              if (input.substr(peg$currPos, 6) === peg$c11) {
-                s7 = peg$c11;
-                peg$currPos += 6;
-              } else {
-                s7 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c12); }
-              }
-              if (s7 === peg$FAILED) {
-                s7 = null;
-              }
-              if (s7 !== peg$FAILED) {
-                s8 = peg$parse_();
-                if (s8 !== peg$FAILED) {
-                  s9 = peg$parseMemberName();
-                  if (s9 !== peg$FAILED) {
-                    s4 = [s4, s5, s6, s7, s8, s9];
-                    s3 = s4;
-                  } else {
-                    peg$currPos = s3;
-                    s3 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s3;
-                  s3 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s3;
-                s3 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c50(s1, s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseFilePathExpr() {
-    var s0, s1, s2, s3, s4, s5, s6;
-
-    var key    = peg$currPos * 84 + 18,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 39) {
-      s1 = peg$c18;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c19); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      s3 = [];
-      if (peg$c20.test(input.charAt(peg$currPos))) {
-        s4 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c21); }
-      }
-      if (s4 === peg$FAILED) {
-        s4 = peg$currPos;
-        if (input.charCodeAt(peg$currPos) === 92) {
-          s5 = peg$c22;
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c23); }
-        }
-        if (s5 !== peg$FAILED) {
-          if (input.length > peg$currPos) {
-            s6 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s6 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c24); }
-          }
-          if (s6 !== peg$FAILED) {
-            s5 = [s5, s6];
-            s4 = s5;
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s4;
-          s4 = peg$FAILED;
-        }
-      }
-      while (s4 !== peg$FAILED) {
-        s3.push(s4);
-        if (peg$c20.test(input.charAt(peg$currPos))) {
-          s4 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c21); }
-        }
-        if (s4 === peg$FAILED) {
-          s4 = peg$currPos;
-          if (input.charCodeAt(peg$currPos) === 92) {
-            s5 = peg$c22;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c23); }
-          }
-          if (s5 !== peg$FAILED) {
-            if (input.length > peg$currPos) {
-              s6 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c24); }
-            }
-            if (s6 !== peg$FAILED) {
-              s5 = [s5, s6];
-              s4 = s5;
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        }
-      }
-      if (s3 !== peg$FAILED) {
-        s2 = input.substring(s2, peg$currPos);
-      } else {
-        s2 = s3;
-      }
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 39) {
-          s3 = peg$c18;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c19); }
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c51(s2);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.charCodeAt(peg$currPos) === 34) {
-        s1 = peg$c26;
-        peg$currPos++;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c27); }
-      }
-      if (s1 !== peg$FAILED) {
-        s2 = peg$currPos;
-        s3 = [];
-        if (peg$c28.test(input.charAt(peg$currPos))) {
-          s4 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c29); }
-        }
-        if (s4 === peg$FAILED) {
-          s4 = peg$currPos;
-          if (input.charCodeAt(peg$currPos) === 92) {
-            s5 = peg$c22;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c23); }
-          }
-          if (s5 !== peg$FAILED) {
-            if (input.length > peg$currPos) {
-              s6 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c24); }
-            }
-            if (s6 !== peg$FAILED) {
-              s5 = [s5, s6];
-              s4 = s5;
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        }
-        while (s4 !== peg$FAILED) {
-          s3.push(s4);
-          if (peg$c28.test(input.charAt(peg$currPos))) {
-            s4 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s4 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c29); }
-          }
-          if (s4 === peg$FAILED) {
-            s4 = peg$currPos;
-            if (input.charCodeAt(peg$currPos) === 92) {
-              s5 = peg$c22;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c23); }
-            }
-            if (s5 !== peg$FAILED) {
-              if (input.length > peg$currPos) {
-                s6 = input.charAt(peg$currPos);
-                peg$currPos++;
-              } else {
-                s6 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c24); }
-              }
-              if (s6 !== peg$FAILED) {
-                s5 = [s5, s6];
-                s4 = s5;
-              } else {
-                peg$currPos = s4;
-                s4 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          }
-        }
-        if (s3 !== peg$FAILED) {
-          s2 = input.substring(s2, peg$currPos);
-        } else {
-          s2 = s3;
-        }
-        if (s2 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 34) {
-            s3 = peg$c26;
-            peg$currPos++;
-          } else {
-            s3 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c27); }
-          }
-          if (s3 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c52(s2);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-      if (s0 === peg$FAILED) {
-        s0 = peg$currPos;
-        s1 = peg$currPos;
-        s2 = [];
-        if (peg$c53.test(input.charAt(peg$currPos))) {
-          s3 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c54); }
-        }
-        if (s3 !== peg$FAILED) {
-          while (s3 !== peg$FAILED) {
-            s2.push(s3);
-            if (peg$c53.test(input.charAt(peg$currPos))) {
-              s3 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s3 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c54); }
-            }
-          }
-        } else {
-          s2 = peg$FAILED;
-        }
-        if (s2 !== peg$FAILED) {
-          s1 = input.substring(s1, peg$currPos);
-        } else {
-          s1 = s2;
-        }
-        if (s1 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c55(s1);
-        }
-        s0 = s1;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseAnyTypeExpr() {
-    var s0, s1;
-
-    var key    = peg$currPos * 84 + 19,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 42) {
-      s1 = peg$c56;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c57); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c58();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseUnknownTypeExpr() {
-    var s0, s1;
-
-    var key    = peg$currPos * 84 + 20,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 63) {
-      s1 = peg$c59;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c60); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c61();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseValueExpr() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 21,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseStringLiteralExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseNumberLiteralExpr();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseStringLiteralExpr() {
-    var s0, s1, s2, s3, s4, s5, s6;
-
-    var key    = peg$currPos * 84 + 22,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 34) {
-      s1 = peg$c26;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c27); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      s3 = [];
-      if (peg$c28.test(input.charAt(peg$currPos))) {
-        s4 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c29); }
-      }
-      if (s4 === peg$FAILED) {
-        s4 = peg$currPos;
-        if (input.charCodeAt(peg$currPos) === 92) {
-          s5 = peg$c22;
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c23); }
-        }
-        if (s5 !== peg$FAILED) {
-          if (input.length > peg$currPos) {
-            s6 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s6 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c24); }
-          }
-          if (s6 !== peg$FAILED) {
-            s5 = [s5, s6];
-            s4 = s5;
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s4;
-          s4 = peg$FAILED;
-        }
-      }
-      while (s4 !== peg$FAILED) {
-        s3.push(s4);
-        if (peg$c28.test(input.charAt(peg$currPos))) {
-          s4 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c29); }
-        }
-        if (s4 === peg$FAILED) {
-          s4 = peg$currPos;
-          if (input.charCodeAt(peg$currPos) === 92) {
-            s5 = peg$c22;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c23); }
-          }
-          if (s5 !== peg$FAILED) {
-            if (input.length > peg$currPos) {
-              s6 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c24); }
-            }
-            if (s6 !== peg$FAILED) {
-              s5 = [s5, s6];
-              s4 = s5;
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        }
-      }
-      if (s3 !== peg$FAILED) {
-        s2 = input.substring(s2, peg$currPos);
-      } else {
-        s2 = s3;
-      }
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 34) {
-          s3 = peg$c26;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c27); }
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c62(s2);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.charCodeAt(peg$currPos) === 39) {
-        s1 = peg$c18;
-        peg$currPos++;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c19); }
-      }
-      if (s1 !== peg$FAILED) {
-        s2 = peg$currPos;
-        s3 = [];
-        if (peg$c20.test(input.charAt(peg$currPos))) {
-          s4 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c21); }
-        }
-        if (s4 === peg$FAILED) {
-          s4 = peg$currPos;
-          if (input.charCodeAt(peg$currPos) === 92) {
-            s5 = peg$c22;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c23); }
-          }
-          if (s5 !== peg$FAILED) {
-            if (input.length > peg$currPos) {
-              s6 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c24); }
-            }
-            if (s6 !== peg$FAILED) {
-              s5 = [s5, s6];
-              s4 = s5;
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        }
-        while (s4 !== peg$FAILED) {
-          s3.push(s4);
-          if (peg$c20.test(input.charAt(peg$currPos))) {
-            s4 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s4 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c21); }
-          }
-          if (s4 === peg$FAILED) {
-            s4 = peg$currPos;
-            if (input.charCodeAt(peg$currPos) === 92) {
-              s5 = peg$c22;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c23); }
-            }
-            if (s5 !== peg$FAILED) {
-              if (input.length > peg$currPos) {
-                s6 = input.charAt(peg$currPos);
-                peg$currPos++;
-              } else {
-                s6 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c24); }
-              }
-              if (s6 !== peg$FAILED) {
-                s5 = [s5, s6];
-                s4 = s5;
-              } else {
-                peg$currPos = s4;
-                s4 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          }
-        }
-        if (s3 !== peg$FAILED) {
-          s2 = input.substring(s2, peg$currPos);
-        } else {
-          s2 = s3;
-        }
-        if (s2 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 39) {
-            s3 = peg$c18;
-            peg$currPos++;
-          } else {
-            s3 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c19); }
-          }
-          if (s3 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c63(s2);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseNumberLiteralExpr() {
-    var s0, s1;
-
-    var key    = peg$currPos * 84 + 23,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseBinNumberLiteralExpr();
-    if (s1 === peg$FAILED) {
-      s1 = peg$parseOctNumberLiteralExpr();
-      if (s1 === peg$FAILED) {
-        s1 = peg$parseHexNumberLiteralExpr();
-        if (s1 === peg$FAILED) {
-          s1 = peg$parseDecimalNumberLiteralExpr();
-        }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c64(s1);
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseDecimalNumberLiteralExpr() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 84 + 24,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 43) {
-      s2 = peg$c65;
-      peg$currPos++;
-    } else {
-      s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c66); }
-    }
-    if (s2 === peg$FAILED) {
-      if (input.charCodeAt(peg$currPos) === 45) {
-        s2 = peg$c67;
-        peg$currPos++;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c68); }
-      }
-    }
-    if (s2 === peg$FAILED) {
-      s2 = null;
-    }
-    if (s2 !== peg$FAILED) {
-      s3 = peg$parseUnsignedDecimalNumberLiteralExpr();
-      if (s3 !== peg$FAILED) {
-        s2 = [s2, s3];
-        s1 = s2;
-      } else {
-        peg$currPos = s1;
-        s1 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s1;
-      s1 = peg$FAILED;
-    }
-    if (s1 !== peg$FAILED) {
-      s0 = input.substring(s0, peg$currPos);
-    } else {
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseUnsignedDecimalNumberLiteralExpr() {
-    var s0, s1, s2, s3, s4, s5, s6, s7;
-
-    var key    = peg$currPos * 84 + 25,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    s2 = peg$currPos;
-    s3 = [];
-    if (peg$c69.test(input.charAt(peg$currPos))) {
-      s4 = input.charAt(peg$currPos);
-      peg$currPos++;
-    } else {
-      s4 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c70); }
-    }
-    if (s4 !== peg$FAILED) {
-      while (s4 !== peg$FAILED) {
-        s3.push(s4);
-        if (peg$c69.test(input.charAt(peg$currPos))) {
-          s4 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c70); }
-        }
-      }
-    } else {
-      s3 = peg$FAILED;
-    }
-    if (s3 !== peg$FAILED) {
-      s4 = peg$currPos;
-      if (input.charCodeAt(peg$currPos) === 46) {
-        s5 = peg$c32;
-        peg$currPos++;
-      } else {
-        s5 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c33); }
-      }
-      if (s5 !== peg$FAILED) {
-        s6 = [];
-        if (peg$c69.test(input.charAt(peg$currPos))) {
-          s7 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s7 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c70); }
-        }
-        if (s7 !== peg$FAILED) {
-          while (s7 !== peg$FAILED) {
-            s6.push(s7);
-            if (peg$c69.test(input.charAt(peg$currPos))) {
-              s7 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s7 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c70); }
-            }
-          }
-        } else {
-          s6 = peg$FAILED;
-        }
-        if (s6 !== peg$FAILED) {
-          s5 = [s5, s6];
-          s4 = s5;
-        } else {
-          peg$currPos = s4;
-          s4 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s4;
-        s4 = peg$FAILED;
-      }
-      if (s4 === peg$FAILED) {
-        s4 = null;
-      }
-      if (s4 !== peg$FAILED) {
-        s3 = [s3, s4];
-        s2 = s3;
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s2;
-      s2 = peg$FAILED;
-    }
-    if (s2 === peg$FAILED) {
-      s2 = peg$currPos;
-      if (input.charCodeAt(peg$currPos) === 46) {
-        s3 = peg$c32;
-        peg$currPos++;
-      } else {
-        s3 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c33); }
-      }
-      if (s3 !== peg$FAILED) {
-        s4 = [];
-        if (peg$c69.test(input.charAt(peg$currPos))) {
-          s5 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c70); }
-        }
-        if (s5 !== peg$FAILED) {
-          while (s5 !== peg$FAILED) {
-            s4.push(s5);
-            if (peg$c69.test(input.charAt(peg$currPos))) {
-              s5 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c70); }
-            }
-          }
-        } else {
-          s4 = peg$FAILED;
-        }
-        if (s4 !== peg$FAILED) {
-          s3 = [s3, s4];
-          s2 = s3;
-        } else {
-          peg$currPos = s2;
-          s2 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    }
-    if (s2 !== peg$FAILED) {
-      s3 = peg$currPos;
-      if (input.charCodeAt(peg$currPos) === 101) {
-        s4 = peg$c71;
-        peg$currPos++;
-      } else {
-        s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c72); }
-      }
-      if (s4 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 43) {
-          s5 = peg$c65;
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c66); }
-        }
-        if (s5 === peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 45) {
-            s5 = peg$c67;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c68); }
-          }
-        }
-        if (s5 === peg$FAILED) {
-          s5 = null;
-        }
-        if (s5 !== peg$FAILED) {
-          s6 = [];
-          if (peg$c69.test(input.charAt(peg$currPos))) {
-            s7 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s7 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c70); }
-          }
-          if (s7 !== peg$FAILED) {
-            while (s7 !== peg$FAILED) {
-              s6.push(s7);
-              if (peg$c69.test(input.charAt(peg$currPos))) {
-                s7 = input.charAt(peg$currPos);
-                peg$currPos++;
-              } else {
-                s7 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c70); }
-              }
-            }
-          } else {
-            s6 = peg$FAILED;
-          }
-          if (s6 !== peg$FAILED) {
-            s4 = [s4, s5, s6];
-            s3 = s4;
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s3;
-        s3 = peg$FAILED;
-      }
-      if (s3 === peg$FAILED) {
-        s3 = null;
-      }
-      if (s3 !== peg$FAILED) {
-        s2 = [s2, s3];
-        s1 = s2;
-      } else {
-        peg$currPos = s1;
-        s1 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s1;
-      s1 = peg$FAILED;
-    }
-    if (s1 !== peg$FAILED) {
-      s0 = input.substring(s0, peg$currPos);
-    } else {
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseBinNumberLiteralExpr() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 84 + 26,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 45) {
-      s2 = peg$c67;
-      peg$currPos++;
-    } else {
-      s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c68); }
-    }
-    if (s2 === peg$FAILED) {
-      s2 = null;
-    }
-    if (s2 !== peg$FAILED) {
-      if (input.substr(peg$currPos, 2) === peg$c73) {
-        s3 = peg$c73;
-        peg$currPos += 2;
-      } else {
-        s3 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c74); }
-      }
-      if (s3 !== peg$FAILED) {
-        s4 = [];
-        if (peg$c75.test(input.charAt(peg$currPos))) {
-          s5 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c76); }
-        }
-        if (s5 !== peg$FAILED) {
-          while (s5 !== peg$FAILED) {
-            s4.push(s5);
-            if (peg$c75.test(input.charAt(peg$currPos))) {
-              s5 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c76); }
-            }
-          }
-        } else {
-          s4 = peg$FAILED;
-        }
-        if (s4 !== peg$FAILED) {
-          s2 = [s2, s3, s4];
-          s1 = s2;
-        } else {
-          peg$currPos = s1;
-          s1 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s1;
-        s1 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s1;
-      s1 = peg$FAILED;
-    }
-    if (s1 !== peg$FAILED) {
-      s0 = input.substring(s0, peg$currPos);
-    } else {
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseOctNumberLiteralExpr() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 84 + 27,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 45) {
-      s2 = peg$c67;
-      peg$currPos++;
-    } else {
-      s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c68); }
-    }
-    if (s2 === peg$FAILED) {
-      s2 = null;
-    }
-    if (s2 !== peg$FAILED) {
-      if (input.substr(peg$currPos, 2) === peg$c77) {
-        s3 = peg$c77;
-        peg$currPos += 2;
-      } else {
-        s3 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c78); }
-      }
-      if (s3 !== peg$FAILED) {
-        s4 = [];
-        if (peg$c79.test(input.charAt(peg$currPos))) {
-          s5 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c80); }
-        }
-        if (s5 !== peg$FAILED) {
-          while (s5 !== peg$FAILED) {
-            s4.push(s5);
-            if (peg$c79.test(input.charAt(peg$currPos))) {
-              s5 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c80); }
-            }
-          }
-        } else {
-          s4 = peg$FAILED;
-        }
-        if (s4 !== peg$FAILED) {
-          s2 = [s2, s3, s4];
-          s1 = s2;
-        } else {
-          peg$currPos = s1;
-          s1 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s1;
-        s1 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s1;
-      s1 = peg$FAILED;
-    }
-    if (s1 !== peg$FAILED) {
-      s0 = input.substring(s0, peg$currPos);
-    } else {
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseHexNumberLiteralExpr() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 84 + 28,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 45) {
-      s2 = peg$c67;
-      peg$currPos++;
-    } else {
-      s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c68); }
-    }
-    if (s2 === peg$FAILED) {
-      s2 = null;
-    }
-    if (s2 !== peg$FAILED) {
-      if (input.substr(peg$currPos, 2) === peg$c81) {
-        s3 = peg$c81;
-        peg$currPos += 2;
-      } else {
-        s3 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c82); }
-      }
-      if (s3 !== peg$FAILED) {
-        s4 = [];
-        if (peg$c83.test(input.charAt(peg$currPos))) {
-          s5 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c84); }
-        }
-        if (s5 !== peg$FAILED) {
-          while (s5 !== peg$FAILED) {
-            s4.push(s5);
-            if (peg$c83.test(input.charAt(peg$currPos))) {
-              s5 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c84); }
-            }
-          }
-        } else {
-          s4 = peg$FAILED;
-        }
-        if (s4 !== peg$FAILED) {
-          s2 = [s2, s3, s4];
-          s1 = s2;
-        } else {
-          peg$currPos = s1;
-          s1 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s1;
-        s1 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s1;
-      s1 = peg$FAILED;
-    }
-    if (s1 !== peg$FAILED) {
-      s0 = input.substring(s0, peg$currPos);
-    } else {
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseUnionTypeExpr() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 84 + 29,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseUnionTypeExprOperand();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseUnionTypeOperator();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parseUnionTypeExpr();
-            if (s5 === peg$FAILED) {
-              s5 = peg$parseUnionTypeExprOperand();
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c85(s1, s3, s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseUnionTypeOperator() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 30,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseUnionTypeOperatorClosureLibraryFlavored();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseUnionTypeOperatorJSDuckFlavored();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseUnionTypeOperatorClosureLibraryFlavored() {
-    var s0, s1;
-
-    var key    = peg$currPos * 84 + 31,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 124) {
-      s1 = peg$c86;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c87); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c88();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseUnionTypeOperatorJSDuckFlavored() {
-    var s0, s1;
-
-    var key    = peg$currPos * 84 + 32,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 47) {
-      s1 = peg$c89;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c90); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c91();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseUnionTypeExprOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 33,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseUnaryUnionTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseRecordTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseTupleTypeExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseArrowTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseFunctionTypeExpr();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parseParenthesizedExpr();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parseTypeQueryExpr();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parseKeyQueryExpr();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseGenericTypeExpr();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseArrayTypeExpr();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parseBroadNamepathExpr();
-                        if (s0 === peg$FAILED) {
-                          s0 = peg$parseValueExpr();
-                          if (s0 === peg$FAILED) {
-                            s0 = peg$parseAnyTypeExpr();
-                            if (s0 === peg$FAILED) {
-                              s0 = peg$parseUnknownTypeExpr();
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseUnaryUnionTypeExpr() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 34,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseSuffixUnaryUnionTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parsePrefixUnaryUnionTypeExpr();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsePrefixUnaryUnionTypeExpr() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 35,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parsePrefixOptionalTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parsePrefixNotNullableTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsePrefixNullableTypeExpr();
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsePrefixUnaryUnionTypeExprOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 36,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseGenericTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseRecordTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseTupleTypeExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseArrowTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseFunctionTypeExpr();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parseParenthesizedExpr();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parseBroadNamepathExpr();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parseValueExpr();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseAnyTypeExpr();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseUnknownTypeExpr();
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseTypeQueryExpr() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 84 + 37,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 6) === peg$c92) {
-      s1 = peg$c92;
-      peg$currPos += 6;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c93); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseQualifiedMemberName();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c94(s1, s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseKeyQueryExpr() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 84 + 38,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 5) === peg$c95) {
-      s1 = peg$c95;
-      peg$currPos += 5;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c96); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseKeyQueryExprOperand();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c97(s1, s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseKeyQueryExprOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 39,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseUnionTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseUnaryUnionTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseRecordTypeExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseTupleTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseFunctionTypeExpr();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parseParenthesizedExpr();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parseTypeQueryExpr();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parseKeyQueryExpr();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseArrayTypeExpr();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseGenericTypeExpr();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parseBroadNamepathExpr();
-                        if (s0 === peg$FAILED) {
-                          s0 = peg$parseValueExpr();
-                          if (s0 === peg$FAILED) {
-                            s0 = peg$parseAnyTypeExpr();
-                            if (s0 === peg$FAILED) {
-                              s0 = peg$parseUnknownTypeExpr();
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseImportTypeExpr() {
-    var s0, s1, s2, s3, s4, s5, s6, s7;
-
-    var key    = peg$currPos * 84 + 40,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 6) === peg$c98) {
-      s1 = peg$c98;
-      peg$currPos += 6;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c99); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 40) {
-          s3 = peg$c100;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c101); }
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parseStringLiteralExpr();
-            if (s5 !== peg$FAILED) {
-              s6 = peg$parse_();
-              if (s6 !== peg$FAILED) {
-                if (input.charCodeAt(peg$currPos) === 41) {
-                  s7 = peg$c102;
-                  peg$currPos++;
-                } else {
-                  s7 = peg$FAILED;
-                  if (peg$silentFails === 0) { peg$fail(peg$c103); }
-                }
-                if (s7 !== peg$FAILED) {
-                  peg$savedPos = s0;
-                  s1 = peg$c104(s1, s5);
-                  s0 = s1;
-                } else {
-                  peg$currPos = s0;
-                  s0 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsePrefixNullableTypeExpr() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 84 + 41,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 63) {
-      s1 = peg$c59;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c60); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsePrefixUnaryUnionTypeExprOperand();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c105(s1, s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsePrefixNotNullableTypeExpr() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 84 + 42,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 33) {
-      s1 = peg$c106;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c107); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsePrefixUnaryUnionTypeExprOperand();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c108(s1, s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsePrefixOptionalTypeExpr() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 84 + 43,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 61) {
-      s1 = peg$c109;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c110); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsePrefixUnaryUnionTypeExprOperand();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c111(s1, s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseSuffixUnaryUnionTypeExpr() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 44,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseSuffixOptionalTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseSuffixNullableTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseSuffixNotNullableTypeExpr();
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseSuffixUnaryUnionTypeExprOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 45,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parsePrefixUnaryUnionTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseGenericTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseRecordTypeExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseTupleTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseArrowTypeExpr();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parseFunctionTypeExpr();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parseParenthesizedExpr();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parseBroadNamepathExpr();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseValueExpr();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseAnyTypeExpr();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parseUnknownTypeExpr();
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseSuffixNullableTypeExpr() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 84 + 46,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseSuffixUnaryUnionTypeExprOperand();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 63) {
-          s3 = peg$c59;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c60); }
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c112(s1, s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseSuffixNotNullableTypeExpr() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 84 + 47,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseSuffixUnaryUnionTypeExprOperand();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 33) {
-          s3 = peg$c106;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c107); }
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c113(s1, s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseSuffixOptionalTypeExpr() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 84 + 48,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseSuffixNullableTypeExpr();
-    if (s1 === peg$FAILED) {
-      s1 = peg$parseSuffixNotNullableTypeExpr();
-      if (s1 === peg$FAILED) {
-        s1 = peg$parseSuffixUnaryUnionTypeExprOperand();
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 61) {
-          s3 = peg$c109;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c110); }
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c114(s1, s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseGenericTypeExpr() {
-    var s0, s1, s2, s3, s4, s5, s6, s7;
-
-    var key    = peg$currPos * 84 + 49,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseGenericTypeExprOperand();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseGenericTypeStartToken();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parseGenericTypeExprTypeParamList();
-            if (s5 !== peg$FAILED) {
-              s6 = peg$parse_();
-              if (s6 !== peg$FAILED) {
-                s7 = peg$parseGenericTypeEndToken();
-                if (s7 !== peg$FAILED) {
-                  peg$savedPos = s0;
-                  s1 = peg$c115(s1, s3, s5);
-                  s0 = s1;
-                } else {
-                  peg$currPos = s0;
-                  s0 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseGenericTypeExprOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 50,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseParenthesizedExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseBroadNamepathExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseValueExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseAnyTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseUnknownTypeExpr();
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseGenericTypeExprTypeParamOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 51,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseUnionTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseUnaryUnionTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseRecordTypeExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseTupleTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseArrowTypeExpr();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parseFunctionTypeExpr();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parseParenthesizedExpr();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parseArrayTypeExpr();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseGenericTypeExpr();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseTypeQueryExpr();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parseKeyQueryExpr();
-                        if (s0 === peg$FAILED) {
-                          s0 = peg$parseBroadNamepathExpr();
-                          if (s0 === peg$FAILED) {
-                            s0 = peg$parseValueExpr();
-                            if (s0 === peg$FAILED) {
-                              s0 = peg$parseAnyTypeExpr();
-                              if (s0 === peg$FAILED) {
-                                s0 = peg$parseUnknownTypeExpr();
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseGenericTypeExprTypeParamList() {
-    var s0, s1, s2, s3, s4, s5, s6, s7;
-
-    var key    = peg$currPos * 84 + 52,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseGenericTypeExprTypeParamOperand();
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      s3 = peg$currPos;
-      s4 = peg$parse_();
-      if (s4 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 44) {
-          s5 = peg$c116;
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c117); }
-        }
-        if (s5 !== peg$FAILED) {
-          s6 = peg$parse_();
-          if (s6 !== peg$FAILED) {
-            s7 = peg$parseGenericTypeExprTypeParamOperand();
-            if (s7 !== peg$FAILED) {
-              s4 = [s4, s5, s6, s7];
-              s3 = s4;
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s3;
-        s3 = peg$FAILED;
-      }
-      while (s3 !== peg$FAILED) {
-        s2.push(s3);
-        s3 = peg$currPos;
-        s4 = peg$parse_();
-        if (s4 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 44) {
-            s5 = peg$c116;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c117); }
-          }
-          if (s5 !== peg$FAILED) {
-            s6 = peg$parse_();
-            if (s6 !== peg$FAILED) {
-              s7 = peg$parseGenericTypeExprTypeParamOperand();
-              if (s7 !== peg$FAILED) {
-                s4 = [s4, s5, s6, s7];
-                s3 = s4;
-              } else {
-                peg$currPos = s3;
-                s3 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c118(s1, s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseGenericTypeStartToken() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 53,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseGenericTypeEcmaScriptFlavoredStartToken();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseGenericTypeTypeScriptFlavoredStartToken();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseGenericTypeEcmaScriptFlavoredStartToken() {
-    var s0, s1;
-
-    var key    = peg$currPos * 84 + 54,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 2) === peg$c119) {
-      s1 = peg$c119;
-      peg$currPos += 2;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c120); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c121();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseGenericTypeTypeScriptFlavoredStartToken() {
-    var s0, s1;
-
-    var key    = peg$currPos * 84 + 55,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 60) {
-      s1 = peg$c122;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c123); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c124();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseGenericTypeEndToken() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 56,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    if (input.charCodeAt(peg$currPos) === 62) {
-      s0 = peg$c125;
-      peg$currPos++;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c126); }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseArrayTypeExpr() {
-    var s0, s1, s2, s3, s4, s5, s6, s7;
-
-    var key    = peg$currPos * 84 + 57,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseArrayTypeExprOperand();
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      s3 = peg$currPos;
-      s4 = peg$parse_();
-      if (s4 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 91) {
-          s5 = peg$c127;
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c128); }
-        }
-        if (s5 !== peg$FAILED) {
-          s6 = peg$parse_();
-          if (s6 !== peg$FAILED) {
-            if (input.charCodeAt(peg$currPos) === 93) {
-              s7 = peg$c129;
-              peg$currPos++;
-            } else {
-              s7 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c130); }
-            }
-            if (s7 !== peg$FAILED) {
-              s4 = [s4, s5, s6, s7];
-              s3 = s4;
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s3;
-        s3 = peg$FAILED;
-      }
-      if (s3 !== peg$FAILED) {
-        while (s3 !== peg$FAILED) {
-          s2.push(s3);
-          s3 = peg$currPos;
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.charCodeAt(peg$currPos) === 91) {
-              s5 = peg$c127;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c128); }
-            }
-            if (s5 !== peg$FAILED) {
-              s6 = peg$parse_();
-              if (s6 !== peg$FAILED) {
-                if (input.charCodeAt(peg$currPos) === 93) {
-                  s7 = peg$c129;
-                  peg$currPos++;
-                } else {
-                  s7 = peg$FAILED;
-                  if (peg$silentFails === 0) { peg$fail(peg$c130); }
-                }
-                if (s7 !== peg$FAILED) {
-                  s4 = [s4, s5, s6, s7];
-                  s3 = s4;
-                } else {
-                  peg$currPos = s3;
-                  s3 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s3;
-                s3 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        }
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c131(s1, s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseArrayTypeExprOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 58,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseUnaryUnionTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseRecordTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseTupleTypeExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseArrowTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseFunctionTypeExpr();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parseParenthesizedExpr();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parseGenericTypeExpr();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parseTypeQueryExpr();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseKeyQueryExpr();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseBroadNamepathExpr();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parseValueExpr();
-                        if (s0 === peg$FAILED) {
-                          s0 = peg$parseAnyTypeExpr();
-                          if (s0 === peg$FAILED) {
-                            s0 = peg$parseUnknownTypeExpr();
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseArrowTypeExpr() {
-    var s0, s1, s2, s3, s4, s5, s6, s7;
-
-    var key    = peg$currPos * 84 + 59,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 3) === peg$c132) {
-      s1 = peg$c132;
-      peg$currPos += 3;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c133); }
-    }
-    if (s1 === peg$FAILED) {
-      s1 = null;
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseArrowTypeExprParamsList();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.substr(peg$currPos, 2) === peg$c134) {
-              s5 = peg$c134;
-              peg$currPos += 2;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c135); }
-            }
-            if (s5 !== peg$FAILED) {
-              s6 = peg$parse_();
-              if (s6 !== peg$FAILED) {
-                s7 = peg$parseFunctionTypeExprReturnableOperand();
-                if (s7 !== peg$FAILED) {
-                  peg$savedPos = s0;
-                  s1 = peg$c136(s1, s3, s7);
-                  s0 = s1;
-                } else {
-                  peg$currPos = s0;
-                  s0 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseArrowTypeExprParamsList() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 84 + 60,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 40) {
-      s1 = peg$c100;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c101); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseArrowTypeExprParams();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.charCodeAt(peg$currPos) === 41) {
-              s5 = peg$c102;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c103); }
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c137(s3);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.charCodeAt(peg$currPos) === 40) {
-        s1 = peg$c100;
-        peg$currPos++;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c101); }
-      }
-      if (s1 !== peg$FAILED) {
-        s2 = peg$parse_();
-        if (s2 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 41) {
-            s3 = peg$c102;
-            peg$currPos++;
-          } else {
-            s3 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c103); }
-          }
-          if (s3 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c138();
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseArrowTypeExprParams() {
-    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;
-
-    var key    = peg$currPos * 84 + 61,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$currPos;
-    s3 = peg$parseJsIdentifier();
-    if (s3 !== peg$FAILED) {
-      s4 = peg$parse_();
-      if (s4 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 58) {
-          s5 = peg$c44;
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c45); }
-        }
-        if (s5 !== peg$FAILED) {
-          s6 = peg$parse_();
-          if (s6 !== peg$FAILED) {
-            s7 = peg$parseFunctionTypeExprParamOperand();
-            if (s7 === peg$FAILED) {
-              s7 = null;
-            }
-            if (s7 !== peg$FAILED) {
-              s8 = peg$parse_();
-              if (s8 !== peg$FAILED) {
-                if (input.charCodeAt(peg$currPos) === 44) {
-                  s9 = peg$c116;
-                  peg$currPos++;
-                } else {
-                  s9 = peg$FAILED;
-                  if (peg$silentFails === 0) { peg$fail(peg$c117); }
-                }
-                if (s9 !== peg$FAILED) {
-                  s10 = peg$parse_();
-                  if (s10 !== peg$FAILED) {
-                    s3 = [s3, s4, s5, s6, s7, s8, s9, s10];
-                    s2 = s3;
-                  } else {
-                    peg$currPos = s2;
-                    s2 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s2;
-                  s2 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s2;
-                s2 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s2;
-              s2 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s2;
-            s2 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s2;
-          s2 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s2;
-      s2 = peg$FAILED;
-    }
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$currPos;
-      s3 = peg$parseJsIdentifier();
-      if (s3 !== peg$FAILED) {
-        s4 = peg$parse_();
-        if (s4 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 58) {
-            s5 = peg$c44;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c45); }
-          }
-          if (s5 !== peg$FAILED) {
-            s6 = peg$parse_();
-            if (s6 !== peg$FAILED) {
-              s7 = peg$parseFunctionTypeExprParamOperand();
-              if (s7 === peg$FAILED) {
-                s7 = null;
-              }
-              if (s7 !== peg$FAILED) {
-                s8 = peg$parse_();
-                if (s8 !== peg$FAILED) {
-                  if (input.charCodeAt(peg$currPos) === 44) {
-                    s9 = peg$c116;
-                    peg$currPos++;
-                  } else {
-                    s9 = peg$FAILED;
-                    if (peg$silentFails === 0) { peg$fail(peg$c117); }
-                  }
-                  if (s9 !== peg$FAILED) {
-                    s10 = peg$parse_();
-                    if (s10 !== peg$FAILED) {
-                      s3 = [s3, s4, s5, s6, s7, s8, s9, s10];
-                      s2 = s3;
-                    } else {
-                      peg$currPos = s2;
-                      s2 = peg$FAILED;
-                    }
-                  } else {
-                    peg$currPos = s2;
-                    s2 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s2;
-                  s2 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s2;
-                s2 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s2;
-              s2 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s2;
-            s2 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s2;
-          s2 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parseVariadicNameExpr();
-      if (s2 === peg$FAILED) {
-        s2 = null;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c139(s1, s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseVariadicNameExpr() {
-    var s0, s1, s2, s3, s4, s5, s6, s7;
-
-    var key    = peg$currPos * 84 + 62,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 3) === peg$c140) {
-      s1 = peg$c140;
-      peg$currPos += 3;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c141); }
-    }
-    if (s1 === peg$FAILED) {
-      s1 = null;
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseJsIdentifier();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.charCodeAt(peg$currPos) === 58) {
-              s5 = peg$c44;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c45); }
-            }
-            if (s5 !== peg$FAILED) {
-              s6 = peg$parse_();
-              if (s6 !== peg$FAILED) {
-                s7 = peg$parseFunctionTypeExprParamOperand();
-                if (s7 === peg$FAILED) {
-                  s7 = null;
-                }
-                if (s7 !== peg$FAILED) {
-                  peg$savedPos = s0;
-                  s1 = peg$c142(s1, s3, s7);
-                  s0 = s1;
-                } else {
-                  peg$currPos = s0;
-                  s0 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseFunctionTypeExpr() {
-    var s0, s1, s2, s3, s4, s5, s6, s7, s8;
-
-    var key    = peg$currPos * 84 + 63,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 8) === peg$c143) {
-      s1 = peg$c143;
-      peg$currPos += 8;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c144); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseFunctionTypeExprParamsList();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$currPos;
-            if (input.charCodeAt(peg$currPos) === 58) {
-              s6 = peg$c44;
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c45); }
-            }
-            if (s6 !== peg$FAILED) {
-              s7 = peg$parse_();
-              if (s7 !== peg$FAILED) {
-                s8 = peg$parseFunctionTypeExprReturnableOperand();
-                if (s8 !== peg$FAILED) {
-                  s6 = [s6, s7, s8];
-                  s5 = s6;
-                } else {
-                  peg$currPos = s5;
-                  s5 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s5;
-                s5 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s5;
-              s5 = peg$FAILED;
-            }
-            if (s5 === peg$FAILED) {
-              s5 = null;
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c145(s3, s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseFunctionTypeExprParamsList() {
-    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
-
-    var key    = peg$currPos * 84 + 64,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 40) {
-      s1 = peg$c100;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c101); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseFunctionTypeExprModifier();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.charCodeAt(peg$currPos) === 44) {
-              s5 = peg$c116;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c117); }
-            }
-            if (s5 !== peg$FAILED) {
-              s6 = peg$parse_();
-              if (s6 !== peg$FAILED) {
-                s7 = peg$parseFunctionTypeExprParams();
-                if (s7 !== peg$FAILED) {
-                  s8 = peg$parse_();
-                  if (s8 !== peg$FAILED) {
-                    if (input.charCodeAt(peg$currPos) === 41) {
-                      s9 = peg$c102;
-                      peg$currPos++;
-                    } else {
-                      s9 = peg$FAILED;
-                      if (peg$silentFails === 0) { peg$fail(peg$c103); }
-                    }
-                    if (s9 !== peg$FAILED) {
-                      peg$savedPos = s0;
-                      s1 = peg$c146(s3, s7);
-                      s0 = s1;
-                    } else {
-                      peg$currPos = s0;
-                      s0 = peg$FAILED;
-                    }
-                  } else {
-                    peg$currPos = s0;
-                    s0 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s0;
-                  s0 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.charCodeAt(peg$currPos) === 40) {
-        s1 = peg$c100;
-        peg$currPos++;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c101); }
-      }
-      if (s1 !== peg$FAILED) {
-        s2 = peg$parse_();
-        if (s2 !== peg$FAILED) {
-          s3 = peg$parseFunctionTypeExprModifier();
-          if (s3 !== peg$FAILED) {
-            s4 = peg$parse_();
-            if (s4 !== peg$FAILED) {
-              if (input.charCodeAt(peg$currPos) === 41) {
-                s5 = peg$c102;
-                peg$currPos++;
-              } else {
-                s5 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c103); }
-              }
-              if (s5 !== peg$FAILED) {
-                peg$savedPos = s0;
-                s1 = peg$c147(s3);
-                s0 = s1;
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-      if (s0 === peg$FAILED) {
-        s0 = peg$currPos;
-        if (input.charCodeAt(peg$currPos) === 40) {
-          s1 = peg$c100;
-          peg$currPos++;
-        } else {
-          s1 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c101); }
-        }
-        if (s1 !== peg$FAILED) {
-          s2 = peg$parse_();
-          if (s2 !== peg$FAILED) {
-            s3 = peg$parseFunctionTypeExprParams();
-            if (s3 !== peg$FAILED) {
-              s4 = peg$parse_();
-              if (s4 !== peg$FAILED) {
-                if (input.charCodeAt(peg$currPos) === 41) {
-                  s5 = peg$c102;
-                  peg$currPos++;
-                } else {
-                  s5 = peg$FAILED;
-                  if (peg$silentFails === 0) { peg$fail(peg$c103); }
-                }
-                if (s5 !== peg$FAILED) {
-                  peg$savedPos = s0;
-                  s1 = peg$c148(s3);
-                  s0 = s1;
-                } else {
-                  peg$currPos = s0;
-                  s0 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-        if (s0 === peg$FAILED) {
-          s0 = peg$currPos;
-          if (input.charCodeAt(peg$currPos) === 40) {
-            s1 = peg$c100;
-            peg$currPos++;
-          } else {
-            s1 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c101); }
-          }
-          if (s1 !== peg$FAILED) {
-            s2 = peg$parse_();
-            if (s2 !== peg$FAILED) {
-              if (input.charCodeAt(peg$currPos) === 41) {
-                s3 = peg$c102;
-                peg$currPos++;
-              } else {
-                s3 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c103); }
-              }
-              if (s3 !== peg$FAILED) {
-                peg$savedPos = s0;
-                s1 = peg$c149();
-                s0 = s1;
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseFunctionTypeExprModifier() {
-    var s0, s1, s2, s3, s4, s5, s6;
-
-    var key    = peg$currPos * 84 + 65,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    if (input.substr(peg$currPos, 4) === peg$c150) {
-      s2 = peg$c150;
-      peg$currPos += 4;
-    } else {
-      s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c151); }
-    }
-    if (s2 !== peg$FAILED) {
-      s3 = peg$parse_();
-      if (s3 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 58) {
-          s4 = peg$c44;
-          peg$currPos++;
-        } else {
-          s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c45); }
-        }
-        if (s4 !== peg$FAILED) {
-          s5 = peg$parse_();
-          if (s5 !== peg$FAILED) {
-            s6 = peg$parseFunctionTypeExprParamOperand();
-            if (s6 !== peg$FAILED) {
-              s2 = [s2, s3, s4, s5, s6];
-              s1 = s2;
-            } else {
-              peg$currPos = s1;
-              s1 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s1;
-            s1 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s1;
-          s1 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s1;
-        s1 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s1;
-      s1 = peg$FAILED;
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c152(s1);
-    }
-    s0 = s1;
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$currPos;
-      if (input.substr(peg$currPos, 3) === peg$c132) {
-        s2 = peg$c132;
-        peg$currPos += 3;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c133); }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parse_();
-        if (s3 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 58) {
-            s4 = peg$c44;
-            peg$currPos++;
-          } else {
-            s4 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c45); }
-          }
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parse_();
-            if (s5 !== peg$FAILED) {
-              s6 = peg$parseFunctionTypeExprParamOperand();
-              if (s6 !== peg$FAILED) {
-                s2 = [s2, s3, s4, s5, s6];
-                s1 = s2;
-              } else {
-                peg$currPos = s1;
-                s1 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s1;
-              s1 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s1;
-            s1 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s1;
-          s1 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s1;
-        s1 = peg$FAILED;
-      }
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c153(s1);
-      }
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseFunctionTypeExprParams() {
-    var s0, s1, s2, s3, s4, s5, s6;
-
-    var key    = peg$currPos * 84 + 66,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$currPos;
-    s3 = peg$parseFunctionTypeExprParamOperand();
-    if (s3 !== peg$FAILED) {
-      s4 = peg$parse_();
-      if (s4 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 44) {
-          s5 = peg$c116;
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c117); }
-        }
-        if (s5 !== peg$FAILED) {
-          s6 = peg$parse_();
-          if (s6 !== peg$FAILED) {
-            s3 = [s3, s4, s5, s6];
-            s2 = s3;
-          } else {
-            peg$currPos = s2;
-            s2 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s2;
-          s2 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s2;
-      s2 = peg$FAILED;
-    }
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$currPos;
-      s3 = peg$parseFunctionTypeExprParamOperand();
-      if (s3 !== peg$FAILED) {
-        s4 = peg$parse_();
-        if (s4 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 44) {
-            s5 = peg$c116;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c117); }
-          }
-          if (s5 !== peg$FAILED) {
-            s6 = peg$parse_();
-            if (s6 !== peg$FAILED) {
-              s3 = [s3, s4, s5, s6];
-              s2 = s3;
-            } else {
-              peg$currPos = s2;
-              s2 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s2;
-            s2 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s2;
-          s2 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parseVariadicTypeExpr();
-      if (s2 === peg$FAILED) {
-        s2 = peg$parseVariadicTypeExprOperand();
-      }
-      if (s2 === peg$FAILED) {
-        s2 = null;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c154(s1, s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseFunctionTypeExprParamOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 67,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseUnionTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseTypeQueryExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseKeyQueryExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseUnaryUnionTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseRecordTypeExpr();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parseTupleTypeExpr();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parseArrowTypeExpr();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parseFunctionTypeExpr();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseParenthesizedExpr();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseArrayTypeExpr();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parseGenericTypeExpr();
-                        if (s0 === peg$FAILED) {
-                          s0 = peg$parseBroadNamepathExpr();
-                          if (s0 === peg$FAILED) {
-                            s0 = peg$parseValueExpr();
-                            if (s0 === peg$FAILED) {
-                              s0 = peg$parseAnyTypeExpr();
-                              if (s0 === peg$FAILED) {
-                                s0 = peg$parseUnknownTypeExpr();
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseFunctionTypeExprReturnableOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 68,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parsePrefixUnaryUnionTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseRecordTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseTupleTypeExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseArrowTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseFunctionTypeExpr();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parseParenthesizedExpr();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parseArrayTypeExpr();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parseTypeQueryExpr();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseKeyQueryExpr();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseGenericTypeExpr();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parseBroadNamepathExpr();
-                        if (s0 === peg$FAILED) {
-                          s0 = peg$parseValueExpr();
-                          if (s0 === peg$FAILED) {
-                            s0 = peg$parseAnyTypeExpr();
-                            if (s0 === peg$FAILED) {
-                              s0 = peg$parseUnknownTypeExpr();
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseRecordTypeExpr() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 84 + 69,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 123) {
-      s1 = peg$c155;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c156); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseRecordTypeExprEntries();
-        if (s3 === peg$FAILED) {
-          s3 = null;
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.charCodeAt(peg$currPos) === 125) {
-              s5 = peg$c157;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c158); }
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c159(s3);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseRecordTypeExprEntries() {
-    var s0, s1, s2, s3, s4, s5, s6, s7;
-
-    var key    = peg$currPos * 84 + 70,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseRecordTypeExprEntry();
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      s3 = peg$currPos;
-      s4 = peg$currPos;
-      s5 = peg$parse_();
-      if (s5 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 44) {
-          s6 = peg$c116;
-          peg$currPos++;
-        } else {
-          s6 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c117); }
-        }
-        if (s6 !== peg$FAILED) {
-          s5 = [s5, s6];
-          s4 = s5;
-        } else {
-          peg$currPos = s4;
-          s4 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s4;
-        s4 = peg$FAILED;
-      }
-      if (s4 === peg$FAILED) {
-        s4 = peg$currPos;
-        s5 = peg$parse_();
-        if (s5 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 59) {
-            s6 = peg$c160;
-            peg$currPos++;
-          } else {
-            s6 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c161); }
-          }
-          if (s6 !== peg$FAILED) {
-            s5 = [s5, s6];
-            s4 = s5;
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s4;
-          s4 = peg$FAILED;
-        }
-        if (s4 === peg$FAILED) {
-          s4 = peg$currPos;
-          s5 = [];
-          if (peg$c1.test(input.charAt(peg$currPos))) {
-            s6 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s6 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c2); }
-          }
-          while (s6 !== peg$FAILED) {
-            s5.push(s6);
-            if (peg$c1.test(input.charAt(peg$currPos))) {
-              s6 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c2); }
-            }
-          }
-          if (s5 !== peg$FAILED) {
-            if (peg$c3.test(input.charAt(peg$currPos))) {
-              s6 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c4); }
-            }
-            if (s6 === peg$FAILED) {
-              s6 = null;
-            }
-            if (s6 !== peg$FAILED) {
-              if (peg$c5.test(input.charAt(peg$currPos))) {
-                s7 = input.charAt(peg$currPos);
-                peg$currPos++;
-              } else {
-                s7 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c6); }
-              }
-              if (s7 !== peg$FAILED) {
-                s5 = [s5, s6, s7];
-                s4 = s5;
-              } else {
-                peg$currPos = s4;
-                s4 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        }
-      }
-      if (s4 !== peg$FAILED) {
-        s5 = peg$parse_();
-        if (s5 !== peg$FAILED) {
-          s6 = peg$parseRecordTypeExprEntry();
-          if (s6 !== peg$FAILED) {
-            s4 = [s4, s5, s6];
-            s3 = s4;
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s3;
-        s3 = peg$FAILED;
-      }
-      while (s3 !== peg$FAILED) {
-        s2.push(s3);
-        s3 = peg$currPos;
-        s4 = peg$currPos;
-        s5 = peg$parse_();
-        if (s5 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 44) {
-            s6 = peg$c116;
-            peg$currPos++;
-          } else {
-            s6 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c117); }
-          }
-          if (s6 !== peg$FAILED) {
-            s5 = [s5, s6];
-            s4 = s5;
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s4;
-          s4 = peg$FAILED;
-        }
-        if (s4 === peg$FAILED) {
-          s4 = peg$currPos;
-          s5 = peg$parse_();
-          if (s5 !== peg$FAILED) {
-            if (input.charCodeAt(peg$currPos) === 59) {
-              s6 = peg$c160;
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c161); }
-            }
-            if (s6 !== peg$FAILED) {
-              s5 = [s5, s6];
-              s4 = s5;
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-          if (s4 === peg$FAILED) {
-            s4 = peg$currPos;
-            s5 = [];
-            if (peg$c1.test(input.charAt(peg$currPos))) {
-              s6 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c2); }
-            }
-            while (s6 !== peg$FAILED) {
-              s5.push(s6);
-              if (peg$c1.test(input.charAt(peg$currPos))) {
-                s6 = input.charAt(peg$currPos);
-                peg$currPos++;
-              } else {
-                s6 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c2); }
-              }
-            }
-            if (s5 !== peg$FAILED) {
-              if (peg$c3.test(input.charAt(peg$currPos))) {
-                s6 = input.charAt(peg$currPos);
-                peg$currPos++;
-              } else {
-                s6 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c4); }
-              }
-              if (s6 === peg$FAILED) {
-                s6 = null;
-              }
-              if (s6 !== peg$FAILED) {
-                if (peg$c5.test(input.charAt(peg$currPos))) {
-                  s7 = input.charAt(peg$currPos);
-                  peg$currPos++;
-                } else {
-                  s7 = peg$FAILED;
-                  if (peg$silentFails === 0) { peg$fail(peg$c6); }
-                }
-                if (s7 !== peg$FAILED) {
-                  s5 = [s5, s6, s7];
-                  s4 = s5;
-                } else {
-                  peg$currPos = s4;
-                  s4 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s4;
-                s4 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          }
-        }
-        if (s4 !== peg$FAILED) {
-          s5 = peg$parse_();
-          if (s5 !== peg$FAILED) {
-            s6 = peg$parseRecordTypeExprEntry();
-            if (s6 !== peg$FAILED) {
-              s4 = [s4, s5, s6];
-              s3 = s4;
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = peg$currPos;
-        s4 = peg$parse_();
-        if (s4 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 44) {
-            s5 = peg$c116;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c117); }
-          }
-          if (s5 !== peg$FAILED) {
-            s4 = [s4, s5];
-            s3 = s4;
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-        if (s3 === peg$FAILED) {
-          s3 = peg$currPos;
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.charCodeAt(peg$currPos) === 59) {
-              s5 = peg$c160;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c161); }
-            }
-            if (s5 !== peg$FAILED) {
-              s4 = [s4, s5];
-              s3 = s4;
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-          if (s3 === peg$FAILED) {
-            s3 = peg$currPos;
-            s4 = [];
-            if (peg$c1.test(input.charAt(peg$currPos))) {
-              s5 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c2); }
-            }
-            while (s5 !== peg$FAILED) {
-              s4.push(s5);
-              if (peg$c1.test(input.charAt(peg$currPos))) {
-                s5 = input.charAt(peg$currPos);
-                peg$currPos++;
-              } else {
-                s5 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c2); }
-              }
-            }
-            if (s4 !== peg$FAILED) {
-              if (peg$c3.test(input.charAt(peg$currPos))) {
-                s5 = input.charAt(peg$currPos);
-                peg$currPos++;
-              } else {
-                s5 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c4); }
-              }
-              if (s5 === peg$FAILED) {
-                s5 = null;
-              }
-              if (s5 !== peg$FAILED) {
-                if (peg$c5.test(input.charAt(peg$currPos))) {
-                  s6 = input.charAt(peg$currPos);
-                  peg$currPos++;
-                } else {
-                  s6 = peg$FAILED;
-                  if (peg$silentFails === 0) { peg$fail(peg$c6); }
-                }
-                if (s6 !== peg$FAILED) {
-                  s4 = [s4, s5, s6];
-                  s3 = s4;
-                } else {
-                  peg$currPos = s3;
-                  s3 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s3;
-                s3 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          }
-        }
-        if (s3 === peg$FAILED) {
-          s3 = null;
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c162(s1, s2);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseRecordTypeExprEntry() {
-    var s0, s1, s2, s3, s4, s5, s6, s7;
-
-    var key    = peg$currPos * 84 + 71,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseRecordTypeExprEntryKey();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 63) {
-          s3 = peg$c59;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c60); }
-        }
-        if (s3 === peg$FAILED) {
-          s3 = null;
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.charCodeAt(peg$currPos) === 58) {
-              s5 = peg$c44;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c45); }
-            }
-            if (s5 !== peg$FAILED) {
-              s6 = peg$parse_();
-              if (s6 !== peg$FAILED) {
-                s7 = peg$parseRecordTypeExprEntryOperand();
-                if (s7 !== peg$FAILED) {
-                  peg$savedPos = s0;
-                  s1 = peg$c163(s1, s3, s7);
-                  s0 = s1;
-                } else {
-                  peg$currPos = s0;
-                  s0 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parseRecordTypeExprEntryKey();
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c164(s1);
-      }
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseRecordTypeExprEntryKey() {
-    var s0, s1, s2, s3, s4, s5, s6;
-
-    var key    = peg$currPos * 84 + 72,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 34) {
-      s1 = peg$c26;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c27); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      s3 = [];
-      if (peg$c28.test(input.charAt(peg$currPos))) {
-        s4 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c29); }
-      }
-      if (s4 === peg$FAILED) {
-        s4 = peg$currPos;
-        if (input.charCodeAt(peg$currPos) === 92) {
-          s5 = peg$c22;
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c23); }
-        }
-        if (s5 !== peg$FAILED) {
-          if (input.length > peg$currPos) {
-            s6 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s6 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c24); }
-          }
-          if (s6 !== peg$FAILED) {
-            s5 = [s5, s6];
-            s4 = s5;
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s4;
-          s4 = peg$FAILED;
-        }
-      }
-      while (s4 !== peg$FAILED) {
-        s3.push(s4);
-        if (peg$c28.test(input.charAt(peg$currPos))) {
-          s4 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c29); }
-        }
-        if (s4 === peg$FAILED) {
-          s4 = peg$currPos;
-          if (input.charCodeAt(peg$currPos) === 92) {
-            s5 = peg$c22;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c23); }
-          }
-          if (s5 !== peg$FAILED) {
-            if (input.length > peg$currPos) {
-              s6 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c24); }
-            }
-            if (s6 !== peg$FAILED) {
-              s5 = [s5, s6];
-              s4 = s5;
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        }
-      }
-      if (s3 !== peg$FAILED) {
-        s2 = input.substring(s2, peg$currPos);
-      } else {
-        s2 = s3;
-      }
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 34) {
-          s3 = peg$c26;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c27); }
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c165(s2);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.charCodeAt(peg$currPos) === 39) {
-        s1 = peg$c18;
-        peg$currPos++;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c19); }
-      }
-      if (s1 !== peg$FAILED) {
-        s2 = peg$currPos;
-        s3 = [];
-        if (peg$c20.test(input.charAt(peg$currPos))) {
-          s4 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c21); }
-        }
-        if (s4 === peg$FAILED) {
-          s4 = peg$currPos;
-          if (input.charCodeAt(peg$currPos) === 92) {
-            s5 = peg$c22;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c23); }
-          }
-          if (s5 !== peg$FAILED) {
-            if (input.length > peg$currPos) {
-              s6 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s6 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c24); }
-            }
-            if (s6 !== peg$FAILED) {
-              s5 = [s5, s6];
-              s4 = s5;
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s4;
-            s4 = peg$FAILED;
-          }
-        }
-        while (s4 !== peg$FAILED) {
-          s3.push(s4);
-          if (peg$c20.test(input.charAt(peg$currPos))) {
-            s4 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s4 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c21); }
-          }
-          if (s4 === peg$FAILED) {
-            s4 = peg$currPos;
-            if (input.charCodeAt(peg$currPos) === 92) {
-              s5 = peg$c22;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c23); }
-            }
-            if (s5 !== peg$FAILED) {
-              if (input.length > peg$currPos) {
-                s6 = input.charAt(peg$currPos);
-                peg$currPos++;
-              } else {
-                s6 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c24); }
-              }
-              if (s6 !== peg$FAILED) {
-                s5 = [s5, s6];
-                s4 = s5;
-              } else {
-                peg$currPos = s4;
-                s4 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s4;
-              s4 = peg$FAILED;
-            }
-          }
-        }
-        if (s3 !== peg$FAILED) {
-          s2 = input.substring(s2, peg$currPos);
-        } else {
-          s2 = s3;
-        }
-        if (s2 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 39) {
-            s3 = peg$c18;
-            peg$currPos++;
-          } else {
-            s3 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c19); }
-          }
-          if (s3 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c166(s2);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-      if (s0 === peg$FAILED) {
-        s0 = peg$currPos;
-        s1 = peg$currPos;
-        s2 = peg$parseJsIdentifier();
-        if (s2 === peg$FAILED) {
-          s2 = peg$parseUnsignedDecimalNumberLiteralExpr();
-        }
-        if (s2 !== peg$FAILED) {
-          s1 = input.substring(s1, peg$currPos);
-        } else {
-          s1 = s2;
-        }
-        if (s1 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c167(s1);
-        }
-        s0 = s1;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseRecordTypeExprEntryOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 73,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseUnionTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseUnaryUnionTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseRecordTypeExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseTupleTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseArrowTypeExpr();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parseFunctionTypeExpr();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parseParenthesizedExpr();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parseArrayTypeExpr();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseGenericTypeExpr();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseBroadNamepathExpr();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parseValueExpr();
-                        if (s0 === peg$FAILED) {
-                          s0 = peg$parseAnyTypeExpr();
-                          if (s0 === peg$FAILED) {
-                            s0 = peg$parseUnknownTypeExpr();
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseTupleTypeExpr() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 84 + 74,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 91) {
-      s1 = peg$c127;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c128); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseTupleTypeExprEntries();
-        if (s3 === peg$FAILED) {
-          s3 = null;
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.charCodeAt(peg$currPos) === 93) {
-              s5 = peg$c129;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c130); }
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c168(s3);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseTupleTypeExprEntries() {
-    var s0, s1, s2, s3, s4, s5, s6;
-
-    var key    = peg$currPos * 84 + 75,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$currPos;
-    s3 = peg$parseTupleTypeExprOperand();
-    if (s3 !== peg$FAILED) {
-      s4 = peg$parse_();
-      if (s4 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 44) {
-          s5 = peg$c116;
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c117); }
-        }
-        if (s5 !== peg$FAILED) {
-          s6 = peg$parse_();
-          if (s6 !== peg$FAILED) {
-            s3 = [s3, s4, s5, s6];
-            s2 = s3;
-          } else {
-            peg$currPos = s2;
-            s2 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s2;
-          s2 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s2;
-      s2 = peg$FAILED;
-    }
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$currPos;
-      s3 = peg$parseTupleTypeExprOperand();
-      if (s3 !== peg$FAILED) {
-        s4 = peg$parse_();
-        if (s4 !== peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 44) {
-            s5 = peg$c116;
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c117); }
-          }
-          if (s5 !== peg$FAILED) {
-            s6 = peg$parse_();
-            if (s6 !== peg$FAILED) {
-              s3 = [s3, s4, s5, s6];
-              s2 = s3;
-            } else {
-              peg$currPos = s2;
-              s2 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s2;
-            s2 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s2;
-          s2 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parseVariadicTypeExpr();
-      if (s2 === peg$FAILED) {
-        s2 = peg$parseVariadicTypeExprOperand();
-      }
-      if (s2 === peg$FAILED) {
-        s2 = null;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c169(s1, s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseTupleTypeExprOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 76,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseUnionTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseUnaryUnionTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseRecordTypeExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseTupleTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseArrowTypeExpr();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parseFunctionTypeExpr();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parseParenthesizedExpr();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parseTypeQueryExpr();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseKeyQueryExpr();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseArrayTypeExpr();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parseGenericTypeExpr();
-                        if (s0 === peg$FAILED) {
-                          s0 = peg$parseBroadNamepathExpr();
-                          if (s0 === peg$FAILED) {
-                            s0 = peg$parseValueExpr();
-                            if (s0 === peg$FAILED) {
-                              s0 = peg$parseAnyTypeExpr();
-                              if (s0 === peg$FAILED) {
-                                s0 = peg$parseUnknownTypeExpr();
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseParenthesizedExpr() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 84 + 77,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 40) {
-      s1 = peg$c100;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c101); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseParenthesizedExprOperand();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.charCodeAt(peg$currPos) === 41) {
-              s5 = peg$c102;
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c103); }
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c170(s3);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseParenthesizedExprOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 78,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseUnionTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseUnaryUnionTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseRecordTypeExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseTupleTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseArrowTypeExpr();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parseFunctionTypeExpr();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parseArrayTypeExpr();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parseTypeQueryExpr();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseKeyQueryExpr();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseGenericTypeExpr();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parseBroadNamepathExpr();
-                        if (s0 === peg$FAILED) {
-                          s0 = peg$parseValueExpr();
-                          if (s0 === peg$FAILED) {
-                            s0 = peg$parseAnyTypeExpr();
-                            if (s0 === peg$FAILED) {
-                              s0 = peg$parseUnknownTypeExpr();
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseVariadicTypeExpr() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 79,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parsePrefixVariadicTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseSuffixVariadicTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseAnyVariadicTypeExpr();
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsePrefixVariadicTypeExpr() {
-    var s0, s1, s2;
-
-    var key    = peg$currPos * 84 + 80,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 3) === peg$c140) {
-      s1 = peg$c140;
-      peg$currPos += 3;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c141); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parseVariadicTypeExprOperand();
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c171(s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseSuffixVariadicTypeExpr() {
-    var s0, s1, s2;
-
-    var key    = peg$currPos * 84 + 81,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseVariadicTypeExprOperand();
-    if (s1 !== peg$FAILED) {
-      if (input.substr(peg$currPos, 3) === peg$c140) {
-        s2 = peg$c140;
-        peg$currPos += 3;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c141); }
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c172(s1);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseAnyVariadicTypeExpr() {
-    var s0, s1;
-
-    var key    = peg$currPos * 84 + 82,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 3) === peg$c140) {
-      s1 = peg$c140;
-      peg$currPos += 3;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c141); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c173();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseVariadicTypeExprOperand() {
-    var s0;
-
-    var key    = peg$currPos * 84 + 83,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseUnionTypeExpr();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseUnaryUnionTypeExpr();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parseRecordTypeExpr();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseTupleTypeExpr();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseArrowTypeExpr();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parseFunctionTypeExpr();
-              if (s0 === peg$FAILED) {
-                s0 = peg$parseParenthesizedExpr();
-                if (s0 === peg$FAILED) {
-                  s0 = peg$parseTypeQueryExpr();
-                  if (s0 === peg$FAILED) {
-                    s0 = peg$parseKeyQueryExpr();
-                    if (s0 === peg$FAILED) {
-                      s0 = peg$parseArrayTypeExpr();
-                      if (s0 === peg$FAILED) {
-                        s0 = peg$parseGenericTypeExpr();
-                        if (s0 === peg$FAILED) {
-                          s0 = peg$parseBroadNamepathExpr();
-                          if (s0 === peg$FAILED) {
-                            s0 = peg$parseValueExpr();
-                            if (s0 === peg$FAILED) {
-                              s0 = peg$parseAnyTypeExpr();
-                              if (s0 === peg$FAILED) {
-                                s0 = peg$parseUnknownTypeExpr();
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-
-    const meta = require('../lib/SyntaxType.js');
-    const {
-      GenericTypeSyntax, UnionTypeSyntax,
-      VariadicTypeSyntax, OptionalTypeSyntax,
-      NullableTypeSyntax, NotNullableTypeSyntax,
-    } = meta;
-    const NodeType = require('../lib/NodeType.js');
-
-    const NamepathOperatorType = {
-      MEMBER: 'MEMBER',
-      INNER_MEMBER: 'INNER_MEMBER',
-      INSTANCE_MEMBER: 'INSTANCE_MEMBER',
-    };
-
-    function reverse(array) {
-      const reversed = [].concat(array);
-      reversed.reverse();
-      return reversed;
-    }
-
-
-  peg$result = peg$startRuleFunction();
-
-  if (peg$result !== peg$FAILED && peg$currPos === input.length) {
-    return peg$result;
-  } else {
-    if (peg$result !== peg$FAILED && peg$currPos < input.length) {
-      peg$fail(peg$endExpectation());
-    }
-
-    throw peg$buildStructuredError(
-      peg$maxFailExpected,
-      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
-      peg$maxFailPos < input.length
-        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
-        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
-    );
-  }
-}
-
-module.exports = {
-  SyntaxError: peg$SyntaxError,
-  parse:       peg$parse
-};
diff --git a/node_modules/jsdoctypeparser/peg_src/jsdoctype.pegjs b/node_modules/jsdoctypeparser/peg_src/jsdoctype.pegjs
deleted file mode 100644
index 1920a3d..0000000
--- a/node_modules/jsdoctypeparser/peg_src/jsdoctype.pegjs
+++ /dev/null
@@ -1,1189 +0,0 @@
-{
-  const meta = require('../lib/SyntaxType.js');
-  const {
-    GenericTypeSyntax, UnionTypeSyntax,
-    VariadicTypeSyntax, OptionalTypeSyntax,
-    NullableTypeSyntax, NotNullableTypeSyntax,
-  } = meta;
-  const NodeType = require('../lib/NodeType.js');
-
-  const NamepathOperatorType = {
-    MEMBER: 'MEMBER',
-    INNER_MEMBER: 'INNER_MEMBER',
-    INSTANCE_MEMBER: 'INSTANCE_MEMBER',
-  };
-
-  function reverse(array) {
-    const reversed = [].concat(array);
-    reversed.reverse();
-    return reversed;
-  }
-}
-
-
-
-TopTypeExpr = _ expr:( VariadicTypeExpr
-                  / UnionTypeExpr
-                  / UnaryUnionTypeExpr
-                  / ArrayTypeExpr
-                  / GenericTypeExpr
-                  / RecordTypeExpr
-                  / TupleTypeExpr
-                  / ArrowTypeExpr
-                  / FunctionTypeExpr
-                  / TypeQueryExpr
-                  / KeyQueryExpr
-                  / BroadNamepathExpr
-                  / ParenthesizedExpr
-                  / ValueExpr
-                  / AnyTypeExpr
-                  / UnknownTypeExpr
-                  ) _ {
-           return expr;
-         }
-
-TopLevel = _ expr:( VariadicTypeExpr
-                  / UnionTypeExpr
-                  / UnaryUnionTypeExpr
-                  / ArrayTypeExpr
-                  / GenericTypeExpr
-                  / RecordTypeExpr
-                  / TupleTypeExpr
-                  / ArrowTypeExpr
-                  / FunctionTypeExpr
-                  / TypeQueryExpr
-                  / KeyQueryExpr
-                  / BroadNamepathExpr
-                  / ParenthesizedExpr
-                  / ValueExpr
-                  / AnyTypeExpr
-                  / UnknownTypeExpr
-                  ) _ {
-           return expr;
-         }
-
-
-/*
- * White spaces.
- */
-_  = ([ \t] / [\r]? [\n])*
-
-
-/*
- * JavaScript identifier names.
- *
- * NOTE: We do not support UnicodeIDStart and \UnicodeEscapeSequence yet.
- *
- * Spec:
- *   - http://www.ecma-international.org/ecma-262/6.0/index.html#sec-names-and-keywords
- *   - http://unicode.org/reports/tr31/#Table_Lexical_Classes_for_Identifiers
- */
-JsIdentifier = $([a-zA-Z_$][a-zA-Z0-9_$]*)
-
-
-// It is transformed to remove left recursion.
-// See https://en.wikipedia.org/wiki/Left_recursion#Removing_left_recursion
-NamepathExpr = rootOwner:(ParenthesizedExpr / ImportTypeExpr / TypeNameExpr) memberPartWithOperators:(_ InfixNamepathOperator _ "event:"? _ MemberName)* {
-               return memberPartWithOperators.reduce(function(owner, tokens) {
-                 const operatorType = tokens[1];
-                 const eventNamespace = tokens[3];
-                 const MemberName = tokens[5];
-                 const {quoteStyle, name: memberName} = MemberName;
-
-                 switch (operatorType) {
-                   case NamepathOperatorType.MEMBER:
-                     return {
-                       type: NodeType.MEMBER,
-                       owner,
-                       name: memberName,
-                       quoteStyle,
-                       hasEventPrefix: Boolean(eventNamespace),
-                     };
-                   case NamepathOperatorType.INSTANCE_MEMBER:
-                     return {
-                       type: NodeType.INSTANCE_MEMBER,
-                       owner,
-                       name: memberName,
-                       quoteStyle,
-                       hasEventPrefix: Boolean(eventNamespace),
-                     };
-                   case NamepathOperatorType.INNER_MEMBER:
-                     return {
-                       type: NodeType.INNER_MEMBER,
-                       owner,
-                       name: memberName,
-                       quoteStyle,
-                       hasEventPrefix: Boolean(eventNamespace),
-                     };
-                   default:
-                     throw new Error('Unexpected operator type: "' + operatorType + '"');
-                 }
-               }, rootOwner);
-             }
-
-
-/*
- * Type name expressions.
- *
- * Examples:
- *   - string
- *   - null
- *   - Error
- *   - $
- *   - _
- *   - custom-type (JSDoc compatible)
- *
- * Spec:
- *   - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
- */
-TypeNameExpr = TypeNameExprJsDocFlavored
-             / TypeNameExprStrict
-
-
-TypeNameExprStrict = name:JsIdentifier {
-                     return {
-                       type: NodeType.NAME,
-                       name
-                     };
-                   }
-
-
-// JSDoc allow to use hyphens in identifier contexts.
-// See https://github.com/jsdoctypeparser/jsdoctypeparser/issues/15
-TypeNameExprJsDocFlavored = name:$([a-zA-Z_$][a-zA-Z0-9_$-]*) {
-                            return {
-                              type: NodeType.NAME,
-                              name
-                            };
-                          }
-
-MemberName = "'" name:$([^\\'] / "\\".)* "'" {
-               return {
-                 quoteStyle: 'single',
-                 name: name.replace(/\\'/g, "'")
-                   .replace(/\\\\/gu, '\\')
-               };
-             }
-           / '"' name:$([^\\"] / "\\".)* '"' {
-               return {
-                 quoteStyle: 'double',
-                 name: name.replace(/\\"/gu, '"')
-                  .replace(/\\\\/gu, '\\')
-               };
-             }
-           / name:JsIdentifier {
-             return {
-               quoteStyle: 'none',
-               name
-             };
-           };
-
-
-InfixNamepathOperator = MemberTypeOperator
-                      / InstanceMemberTypeOperator
-                      / InnerMemberTypeOperator
-
-QualifiedMemberName = rootOwner:TypeNameExpr memberPart:(_ "." _ TypeNameExpr)* {
-                      return memberPart.reduce(function(owner, tokens) {
-                        return {
-                          type: NodeType.MEMBER,
-                          owner,
-                          name: tokens[3]
-                        }
-                      }, rootOwner);
-                    }
-
-
-/*
- * Member type expressions.
- *
- * Examples:
- *   - owner.member
- *   - superOwner.owner.member
- */
-MemberTypeOperator = "." {
-                     return NamepathOperatorType.MEMBER;
-                   }
-
-
-/*
- * Inner member type expressions.
- *
- * Examples:
- *   - owner~innerMember
- *   - superOwner~owner~innerMember
- */
-InnerMemberTypeOperator = "~" {
-                          return NamepathOperatorType.INNER_MEMBER;
-                        }
-
-
-/*
- * Instance member type expressions.
- *
- * Examples:
- *   - owner#instanceMember
- *   - superOwner#owner#instanceMember
- */
-InstanceMemberTypeOperator = "#" {
-                             return NamepathOperatorType.INSTANCE_MEMBER;
-                           }
-
-
-BroadNamepathExpr = ExternalNameExpr
-                  / ModuleNameExpr
-                  / NamepathExpr
-
-
-/*
- * External name expressions.
- *
- * Examples:
- *   - external:classNamespaceOrModuleName
- *   - external:path/to/file
- *   - external:path/to/file.js
- *
- * Spec:
- *   - https://jsdoc.app/tags-external.html
- */
-ExternalNameExpr = "external" _ ":" _ external:(MemberName) memberPartWithOperators:(_ InfixNamepathOperator _ "event:"? _ MemberName)* {
-          return memberPartWithOperators.reduce(function(owner, tokens) {
-            const operatorType = tokens[1];
-            const eventNamespace = tokens[3];
-            const MemberName = tokens[5];
-            const {quoteStyle, name: memberName} = MemberName;
-
-            switch (operatorType) {
-              case NamepathOperatorType.MEMBER:
-                return {
-                  type: NodeType.MEMBER,
-                  owner,
-                  name: memberName,
-                  quoteStyle,
-                  hasEventPrefix: Boolean(eventNamespace),
-                };
-              case NamepathOperatorType.INSTANCE_MEMBER:
-                return {
-                  type: NodeType.INSTANCE_MEMBER,
-                  owner,
-                  name: memberName,
-                  quoteStyle,
-                  hasEventPrefix: Boolean(eventNamespace),
-                };
-              case NamepathOperatorType.INNER_MEMBER:
-                return {
-                  type: NodeType.INNER_MEMBER,
-                  owner,
-                  name: memberName,
-                  quoteStyle,
-                  hasEventPrefix: Boolean(eventNamespace),
-                };
-              default:
-                throw new Error('Unexpected operator type: "' + operatorType + '"');
-            }
-          }, Object.assign({
-            type: NodeType.EXTERNAL
-          }, external));
-        }
-
-
-/*
- * Module name expressions.
- *
- * Examples:
- *   - module:path/to/file
- *   - module:path/to/file.MyModule~Foo
- *
- * Spec:
- *   - https://jsdoc.app/tags-module.html
- *   - https://jsdoc.app/howto-commonjs-modules.html
- */
-ModuleNameExpr = "module" _ ":" _ value:ModulePathExpr {
-                 return {
-                   type: NodeType.MODULE,
-                   value,
-                 };
-               }
-
-
-
-// It is transformed to remove left recursion
-ModulePathExpr = rootOwner:(FilePathExpr) memberPartWithOperators:(_ InfixNamepathOperator _ "event:"? _ MemberName)* {
-                 return memberPartWithOperators.reduce(function(owner, tokens) {
-                   const operatorType = tokens[1];
-                   const eventNamespace = tokens[3];
-                   const MemberName = tokens[5];
-                   const {quoteStyle, name: memberName} = MemberName;
-
-                   switch (operatorType) {
-                     case NamepathOperatorType.MEMBER:
-                       return {
-                         type: NodeType.MEMBER,
-                         owner,
-                         name: memberName,
-                         quoteStyle,
-                         hasEventPrefix: Boolean(eventNamespace),
-                       };
-                     case NamepathOperatorType.INSTANCE_MEMBER:
-                       return {
-                         type: NodeType.INSTANCE_MEMBER,
-                         owner,
-                         name: memberName,
-                         quoteStyle,
-                         hasEventPrefix: Boolean(eventNamespace),
-                       };
-                     case NamepathOperatorType.INNER_MEMBER:
-                       return {
-                         type: NodeType.INNER_MEMBER,
-                         owner,
-                         name: memberName,
-                         quoteStyle,
-                         hasEventPrefix: Boolean(eventNamespace),
-                       };
-                     default:
-                       throw new Error('Unexpected operator type: "' + operatorType + '"');
-                   }
-                 }, rootOwner);
-               }
-
-
-
-FilePathExpr = "'" path:$([^\\'] / "\\".)* "'" {
-                return {
-                  quoteStyle: 'single',
-                  type: NodeType.FILE_PATH,
-                  path: path.replace(/\\'/g, "'")
-                    .replace(/\\\\/gu, '\\')
-                };
-              }
-            / '"' path:$([^\\"] / "\\".)* '"' {
-                return {
-                  quoteStyle: 'double',
-                  type: NodeType.FILE_PATH,
-                  path: path.replace(/\\"/gu, '"')
-                   .replace(/\\\\/gu, '\\')
-                };
-              }
-            / path:$([a-zA-Z0-9_$/-]+) {
-               return {
-                 quoteStyle: 'none',
-                 type: NodeType.FILE_PATH,
-                 path,
-               };
-             }
-
-/*
- * Any type expressions.
- *
- * Examples:
- *   - *
- *
- * Spec:
- *   - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
- */
-AnyTypeExpr = "*" {
-              return { type: NodeType.ANY };
-            }
-
-
-
-/*
- * Unknown type expressions.
- *
- * Examples:
- *   - ?
- *
- * Spec:
- *   - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
- */
-UnknownTypeExpr = "?" {
-                  return { type: NodeType.UNKNOWN };
-                }
-
-
-
-/*
- * Value type expressions.
- *
- * Example:
- *   - 123
- *   - 0.0
- *   - -123
- *   - 0b11
- *   - 0o77
- *   - 0cff
- *   - "foo"
- *   - "foo\"bar\nbuz"
- *
- * Spec:
- *   - https://github.com/senchalabs/jsduck/wiki/Type-Definitions#type-names
- */
-ValueExpr = StringLiteralExpr / NumberLiteralExpr
-
-
-StringLiteralExpr = '"' value:$([^\\"] / "\\".)* '"' {
-                      return {
-                        type: NodeType.STRING_VALUE,
-                        quoteStyle: 'double',
-                        string: value.replace(/\\"/gu, '"')
-                            .replace(/\\\\/gu, '\\')
-                      };
-                    }
-                  / "'" value:$([^\\'] / "\\".)* "'" {
-                      return {
-                        type: NodeType.STRING_VALUE,
-                        quoteStyle: 'single',
-                        string: value.replace(/\\'/g, "'")
-                            .replace(/\\\\/gu, '\\')
-                      };
-                    }
-
-
-NumberLiteralExpr = value:(BinNumberLiteralExpr / OctNumberLiteralExpr / HexNumberLiteralExpr / DecimalNumberLiteralExpr) {
-                    return {
-                      type: NodeType.NUMBER_VALUE,
-                      number: value
-                    };
-                  }
-
-
-DecimalNumberLiteralExpr = $(("+" / "-")? UnsignedDecimalNumberLiteralExpr)
-
-UnsignedDecimalNumberLiteralExpr = $((([0-9]+ ("." [0-9]+)?) / ("." [0-9]+)) ("e" ("+" / "-")? [0-9]+)?)
-
-
-
-BinNumberLiteralExpr = $("-"? "0b"[01]+)
-
-
-OctNumberLiteralExpr = $("-"? "0o"[0-7]+)
-
-
-HexNumberLiteralExpr = $("-"? "0x"[0-9a-fA-F]+)
-
-
-
-/*
- * Union type expressions.
- *
- * Examples:
- *   - number|undefined
- *   - Foo|Bar|Baz
- */
-UnionTypeExpr = left:UnionTypeExprOperand _ syntax:UnionTypeOperator _ right:(UnionTypeExpr / UnionTypeExprOperand) {
-                return {
-                    type: NodeType.UNION,
-                    left,
-                    right,
-                    meta: { syntax },
-                };
-              }
-
-// https://github.com/senchalabs/jsduck/wiki/Type-Definitions#type-names
-UnionTypeOperator = UnionTypeOperatorClosureLibraryFlavored
-                  / UnionTypeOperatorJSDuckFlavored
-
-
-UnionTypeOperatorClosureLibraryFlavored = "|" {
-                                          return UnionTypeSyntax.PIPE;
-                                        }
-
-
-UnionTypeOperatorJSDuckFlavored = "/" {
-                                  return UnionTypeSyntax.SLASH;
-                                }
-
-
-UnionTypeExprOperand = UnaryUnionTypeExpr
-                     / RecordTypeExpr
-                     / TupleTypeExpr
-                     / ArrowTypeExpr
-                     / FunctionTypeExpr
-                     / ParenthesizedExpr
-                     / TypeQueryExpr
-                     / KeyQueryExpr
-                     / GenericTypeExpr
-                     / ArrayTypeExpr
-                     / BroadNamepathExpr
-                     / ValueExpr
-                     / AnyTypeExpr
-                     / UnknownTypeExpr
-
-
-UnaryUnionTypeExpr = SuffixUnaryUnionTypeExpr
-                   / PrefixUnaryUnionTypeExpr
-
-
-PrefixUnaryUnionTypeExpr = PrefixOptionalTypeExpr
-                         / PrefixNotNullableTypeExpr
-                         / PrefixNullableTypeExpr
-
-
-PrefixUnaryUnionTypeExprOperand = GenericTypeExpr
-                                / RecordTypeExpr
-                                / TupleTypeExpr
-                                / ArrowTypeExpr
-                                / FunctionTypeExpr
-                                / ParenthesizedExpr
-                                / BroadNamepathExpr
-                                / ValueExpr
-                                / AnyTypeExpr
-                                / UnknownTypeExpr
-
-TypeQueryExpr = operator:"typeof" _ name:QualifiedMemberName {
-                return {
-                    type: NodeType.TYPE_QUERY,
-                    name,
-                };
-              }
-
-KeyQueryExpr = operator:"keyof" _ operand:KeyQueryExprOperand {
-  return {
-    type: NodeType.KEY_QUERY,
-    value: operand,
-  }
-}
-
-KeyQueryExprOperand = UnionTypeExpr
-                    / UnaryUnionTypeExpr
-                    / RecordTypeExpr
-                    / TupleTypeExpr
-                    / FunctionTypeExpr
-                    / ParenthesizedExpr
-                    / TypeQueryExpr
-                    / KeyQueryExpr
-                    / ArrayTypeExpr
-                    / GenericTypeExpr
-                    / BroadNamepathExpr
-                    / ValueExpr
-                    / AnyTypeExpr
-                    / UnknownTypeExpr
-
-ImportTypeExpr = operator:"import" _ "(" _ path:StringLiteralExpr _ ")" {
-                 return { type: NodeType.IMPORT, path };
-               }
-
-/*
- * Prefix nullable type expressions.
- *
- * Examples:
- *   - ?string
- *
- * Spec:
- *   - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
- */
-PrefixNullableTypeExpr = operator:"?" _ operand:PrefixUnaryUnionTypeExprOperand {
-                         return {
-                           type: NodeType.NULLABLE,
-                           value: operand,
-                           meta: { syntax: NullableTypeSyntax.PREFIX_QUESTION_MARK },
-                         };
-                       }
-
-
-
-/*
- * Prefix not nullable type expressions.
- *
- * Examples:
- *   - !Object
- *
- * Spec:
- *   - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
- */
-PrefixNotNullableTypeExpr = operator:"!" _ operand:PrefixUnaryUnionTypeExprOperand {
-                            return {
-                              type: NodeType.NOT_NULLABLE,
-                              value: operand,
-                              meta: { syntax: NotNullableTypeSyntax.PREFIX_BANG },
-                            };
-                          }
-
-
-
-/*
- * Suffix optional type expressions.
- * This expression is deprecated.
- *
- * Examples:
- *   - =string (deprecated)
- */
-PrefixOptionalTypeExpr = operator:"=" _ operand:PrefixUnaryUnionTypeExprOperand {
-                         return {
-                           type: NodeType.OPTIONAL,
-                           value: operand,
-                           meta: { syntax: OptionalTypeSyntax.PREFIX_EQUALS_SIGN },
-                         };
-                       }
-
-
-
-SuffixUnaryUnionTypeExpr = SuffixOptionalTypeExpr
-                         / SuffixNullableTypeExpr
-                         / SuffixNotNullableTypeExpr
-
-
-SuffixUnaryUnionTypeExprOperand = PrefixUnaryUnionTypeExpr
-                                / GenericTypeExpr
-                                / RecordTypeExpr
-                                / TupleTypeExpr
-                                / ArrowTypeExpr
-                                / FunctionTypeExpr
-                                / ParenthesizedExpr
-                                / BroadNamepathExpr
-                                / ValueExpr
-                                / AnyTypeExpr
-                                / UnknownTypeExpr
-
-
-/*
- * Suffix nullable type expressions.
- * This expression is deprecated.
- *
- * Examples:
- *   - string? (deprecated)
- *
- * Note:
- *   Deprecated optional type operators can be placed before optional operators.
- *   See https://github.com/google/closure-library/blob/
- *     47f9c92bb4c7de9a3d46f9921a427402910073fb/closure/goog/net/tmpnetwork.js#L50
- */
-SuffixNullableTypeExpr = operand:SuffixUnaryUnionTypeExprOperand _ operator:"?" {
-                         return {
-                           type: NodeType.NULLABLE,
-                           value: operand,
-                           meta: { syntax: NullableTypeSyntax.SUFFIX_QUESTION_MARK },
-                         };
-                       }
-
-
-
-/*
- * Suffix not nullable type expressions.
- * This expression is deprecated.
- *
- * Examples:
- *   - Object! (deprecated)
- */
-SuffixNotNullableTypeExpr = operand:SuffixUnaryUnionTypeExprOperand _ operator:"!" {
-                            return {
-                              type: NodeType.NOT_NULLABLE,
-                              value: operand,
-                              meta: { syntax: NotNullableTypeSyntax.SUFFIX_BANG },
-                            };
-                          }
-
-
-
-/*
- * Suffix optional type expressions.
- *
- * Examples:
- *   - string=
- *
- * Spec:
- *   - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
- */
-SuffixOptionalTypeExpr = operand:( SuffixNullableTypeExpr
-                                 / SuffixNotNullableTypeExpr
-                                 / SuffixUnaryUnionTypeExprOperand
-                                 ) _ operator:"=" {
-                         return {
-                           type: NodeType.OPTIONAL,
-                           value: operand,
-                           meta: { syntax: OptionalTypeSyntax.SUFFIX_EQUALS_SIGN },
-                         };
-                       }
-
-
-
-/*
- * Generic type expressions.
- *
- * Examples:
- *   - Function<T>
- *   - Array.<string> (Legacy Closure Library style and JSDoc3 style)
- *
- * Spec:
- *   - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
- *   - https://jsdoc.app/tags-type.html
- */
-GenericTypeExpr = operand:GenericTypeExprOperand _ syntax:GenericTypeStartToken _
-                  params:GenericTypeExprTypeParamList _ GenericTypeEndToken {
-                  return {
-                    type: NodeType.GENERIC,
-                    subject: operand,
-                    objects: params,
-                    meta: { syntax },
-                  };
-                }
-
-
-GenericTypeExprOperand = ParenthesizedExpr
-                       / BroadNamepathExpr
-                       / ValueExpr
-                       / AnyTypeExpr
-                       / UnknownTypeExpr
-
-
-GenericTypeExprTypeParamOperand = UnionTypeExpr
-                                / UnaryUnionTypeExpr
-                                / RecordTypeExpr
-                                / TupleTypeExpr
-                                / ArrowTypeExpr
-                                / FunctionTypeExpr
-                                / ParenthesizedExpr
-                                / ArrayTypeExpr
-                                / GenericTypeExpr
-                                / TypeQueryExpr
-                                / KeyQueryExpr
-                                / BroadNamepathExpr
-                                / ValueExpr
-                                / AnyTypeExpr
-                                / UnknownTypeExpr
-
-
-GenericTypeExprTypeParamList = first:GenericTypeExprTypeParamOperand
-                               restsWithComma:(_ "," _ GenericTypeExprTypeParamOperand)* {
-                               return restsWithComma.reduce(function(params, tokens) {
-                                 return params.concat([tokens[3]]);
-                               }, [first]);
-                             }
-
-
-GenericTypeStartToken = GenericTypeEcmaScriptFlavoredStartToken
-                      / GenericTypeTypeScriptFlavoredStartToken
-
-
-GenericTypeEcmaScriptFlavoredStartToken = ".<" {
-                                          return GenericTypeSyntax.ANGLE_BRACKET_WITH_DOT;
-                                        }
-
-
-GenericTypeTypeScriptFlavoredStartToken = "<" {
-                                          return GenericTypeSyntax.ANGLE_BRACKET;
-                                        }
-
-
-GenericTypeEndToken = ">"
-
-
-
-/*
- * JSDoc style array of generic type expressions.
- *
- * Examples:
- *   - string[]
- *   - number[][]
- *
- * Spec:
- *   - https://github.com/senchalabs/jsduck/wiki/Type-Definitions#the-basic-syntax
- */
-// TODO: We should care complex type expression like "Some[]![]"
-ArrayTypeExpr = operand:ArrayTypeExprOperand brackets:(_ "[" _ "]")+ {
-                return brackets.reduce(function(operand) {
-                  return {
-                    type: NodeType.GENERIC,
-                    subject: {
-                      type: NodeType.NAME,
-                      name: 'Array'
-                    },
-                    objects: [ operand ],
-                    meta: { syntax: GenericTypeSyntax.SQUARE_BRACKET },
-                  };
-                }, operand);
-              }
-
-
-ArrayTypeExprOperand = UnaryUnionTypeExpr
-                     / RecordTypeExpr
-                     / TupleTypeExpr
-                     / ArrowTypeExpr
-                     / FunctionTypeExpr
-                     / ParenthesizedExpr
-                     / GenericTypeExpr
-                     / TypeQueryExpr
-                     / KeyQueryExpr
-                     / BroadNamepathExpr
-                     / ValueExpr
-                     / AnyTypeExpr
-                     / UnknownTypeExpr
-
-ArrowTypeExpr = newModifier:"new"? _ paramsPart:ArrowTypeExprParamsList _ "=>" _ returnedTypeNode:FunctionTypeExprReturnableOperand {
-                   return {
-                     type: NodeType.ARROW,
-                     params: paramsPart,
-                     returns: returnedTypeNode,
-                     new: newModifier
-                   };
-}
-
-ArrowTypeExprParamsList = "(" _ params:ArrowTypeExprParams _ ")" {
-                            return params;
-                          }
-                        / "(" _ ")" {
-                            return [];
-                          }
-ArrowTypeExprParams = paramsWithComma:(JsIdentifier _ ":" _ FunctionTypeExprParamOperand? _ "," _)* lastParam:VariadicNameExpr? {
-  return paramsWithComma.reduceRight(function(params, tokens) {
-    const param = { type: NodeType.NAMED_PARAMETER, name: tokens[0], typeName: tokens[4] };
-    return [param].concat(params);
-  }, lastParam ? [lastParam] : []);
-}
-
-VariadicNameExpr = spread:"..."? _ id:JsIdentifier _ ":" _ type:FunctionTypeExprParamOperand? {
-  const operand = { type: NodeType.NAMED_PARAMETER, name: id, typeName: type };
-  if (spread) {
-  return {
-    type: NodeType.VARIADIC,
-    value: operand,
-    meta: { syntax: VariadicTypeSyntax.PREFIX_DOTS },
-  };
-  }
-  else {
-    return operand;
-  }
-}
-
-/*
- * Function type expressions.
- *
- * Examples:
- *   - function(string)
- *   - function(string, ...string)
- *   - function():number
- *   - function(this:jQuery):jQuery
- *   - function(new:Error)
- *
- * Spec:
- *   - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
- */
-FunctionTypeExpr = "function" _ paramsPart:FunctionTypeExprParamsList _
-                   returnedTypePart:(":" _ FunctionTypeExprReturnableOperand)? {
-                   const returnedTypeNode = returnedTypePart ? returnedTypePart[2] : null;
-
-                   return {
-                     type: NodeType.FUNCTION,
-                     params: paramsPart.params,
-                     returns: returnedTypeNode,
-                     this: paramsPart.modifier.nodeThis,
-                     new: paramsPart.modifier.nodeNew,
-                   };
-                 }
-
-
-FunctionTypeExprParamsList = "(" _ modifier:FunctionTypeExprModifier _ "," _ params: FunctionTypeExprParams _ ")" {
-                               return { params, modifier };
-                             }
-                           / "(" _ modifier:FunctionTypeExprModifier _ ")" {
-                               return { params: [], modifier };
-                             }
-                           / "(" _ params:FunctionTypeExprParams _ ")" {
-                               return { params, modifier: { nodeThis: null, nodeNew: null } };
-                             }
-                           / "(" _ ")" {
-                               return { params: [], modifier: { nodeThis: null, nodeNew: null } };
-                             }
-
-
-// We can specify either "this:" or "new:".
-// See https://github.com/google/closure-compiler/blob/
-//       91cf3603d5b0b0dc289ba73adcd0f2741aa90d89/src/
-//       com/google/javascript/jscomp/parsing/JsDocInfoParser.java#L2158-L2171
-FunctionTypeExprModifier = modifierThis:("this" _ ":" _ FunctionTypeExprParamOperand) {
-                             return { nodeThis: modifierThis[4], nodeNew: null };
-                           }
-                         / modifierNew:("new" _ ":" _ FunctionTypeExprParamOperand) {
-                             return { nodeThis: null, nodeNew: modifierNew[4] };
-                           }
-
-
-FunctionTypeExprParams = paramsWithComma:(FunctionTypeExprParamOperand _ "," _)*
-                         // Variadic type is only allowed on the last parameter.
-                         lastParam:(VariadicTypeExpr / VariadicTypeExprOperand)? {
-                         return paramsWithComma.reduceRight(function(params, tokens) {
-                           const [param] = tokens;
-                           return [param].concat(params);
-                         }, lastParam ? [lastParam] : []);
-                       }
-
-
-FunctionTypeExprParamOperand = UnionTypeExpr
-                             / TypeQueryExpr
-                             / KeyQueryExpr
-                             / UnaryUnionTypeExpr
-                             / RecordTypeExpr
-                             / TupleTypeExpr
-                             / ArrowTypeExpr
-                             / FunctionTypeExpr
-                             / ParenthesizedExpr
-                             / ArrayTypeExpr
-                             / GenericTypeExpr
-                             / BroadNamepathExpr
-                             / ValueExpr
-                             / AnyTypeExpr
-                             / UnknownTypeExpr
-
-
-FunctionTypeExprReturnableOperand = PrefixUnaryUnionTypeExpr
-                                  // Suffix unary union type operators should not be
-                                  // placed here to keep operator precedence. For example,
-                                  // "Foo|function():Returned=" should be parsed as
-                                  // "(Foo|function():Returned)=" instead of
-                                  // "Foo|(function():Returned=)". This result was expected
-                                  // by Closure Library.
-                                  //
-                                  // See https://github.com/google/closure-library/blob/
-                                  //   47f9c92bb4c7de9a3d46f9921a427402910073fb/
-                                  //   closure/goog/ui/zippy.js#L47
-                                  / RecordTypeExpr
-                                  / TupleTypeExpr
-                                  / ArrowTypeExpr
-                                  / FunctionTypeExpr
-                                  / ParenthesizedExpr
-                                  / ArrayTypeExpr
-                                  / TypeQueryExpr
-                                  / KeyQueryExpr
-                                  / GenericTypeExpr
-                                  / BroadNamepathExpr
-                                  / ValueExpr
-                                  / AnyTypeExpr
-                                  / UnknownTypeExpr
-
-
-/*
- * Record type expressions.
- *
- * Examples:
- *   - {}
- *   - {length}
- *   - {length:number}
- *   - {toString:Function,valueOf:Function}
- *   - {'foo':*}
- *   - {a:string,b?:number} // TypeScript syntax
- *
- * Spec:
- *   - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
- *   - https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html#patterns-that-are-known-not-to-be-supported
- */
-RecordTypeExpr = "{" _ entries:RecordTypeExprEntries? _ "}" {
-                 return {
-                   type: NodeType.RECORD,
-                   entries: entries || [],
-                 };
-               }
-
-
-RecordTypeExprEntries = first:RecordTypeExprEntry restWithComma:((_ "," /_ ";" / [ \t]* [\r]? [\n]) _ RecordTypeExprEntry)* (_ "," / _ ";" / [ \t]* [\r]? [\n])? {
-                        return restWithComma.reduce(function(entries, tokens) {
-                          const entry = tokens[2];
-                          return entries.concat([entry]);
-                        }, [first]);
-                      }
-
-RecordTypeExprEntry = keyInfo:RecordTypeExprEntryKey _ optional:"?"? _ ":" _ value:RecordTypeExprEntryOperand {
-                        const {quoteStyle, key} = keyInfo;
-                        return {
-                          type: NodeType.RECORD_ENTRY,
-                          key,
-                          quoteStyle,
-                          value: optional !== '?' ? value : {
-                            type: NodeType.OPTIONAL,
-                            value,
-                            meta: { syntax: OptionalTypeSyntax.SUFFIX_KEY_QUESTION_MARK },
-                          }
-                        };
-                      }
-                    / keyInfo:RecordTypeExprEntryKey {
-                        const {quoteStyle, key} = keyInfo;
-                        return {
-                          type: NodeType.RECORD_ENTRY,
-                          key,
-                          value: null,
-                          quoteStyle
-                        };
-                      }
-
-
-RecordTypeExprEntryKey = '"' key:$([^\\"] / "\\".)* '"' {
-                           return {
-                             quoteStyle: 'double',
-                             key: key.replace(/\\"/gu, '"')
-                               .replace(/\\\\/gu, '\\')
-                           };
-                       }
-                       / "'" key:$([^\\'] / "\\".)* "'" {
-                           return {
-                             quoteStyle: 'single',
-                             key: key.replace(/\\'/g, "'")
-                               .replace(/\\\\/gu, '\\')
-                           };
-                         }
-                       / key:$(JsIdentifier / UnsignedDecimalNumberLiteralExpr) {
-                           return {
-                             quoteStyle: 'none',
-                             key
-                           };
-                       }
-
-
-RecordTypeExprEntryOperand = UnionTypeExpr
-                           / UnaryUnionTypeExpr
-                           / RecordTypeExpr
-                           / TupleTypeExpr
-                           / ArrowTypeExpr
-                           / FunctionTypeExpr
-                           / ParenthesizedExpr
-                           / ArrayTypeExpr
-                           / GenericTypeExpr
-                           / BroadNamepathExpr
-                           / ValueExpr
-                           / AnyTypeExpr
-                           / UnknownTypeExpr
-
-
-/**
- * TypeScript style tuple type.
- *
- * Examples:
- *   - []
- *   - [string]
- *   - [number]
- *   - [string, number]
- *
- * Spec:
- *   - https://www.typescriptlang.org/docs/handbook/basic-types.html#tuple
- */
-TupleTypeExpr = "[" _ entries:TupleTypeExprEntries? _ "]" {
-  return {
-    type: NodeType.TUPLE,
-    entries: entries || [],
-  }
-}
-
-TupleTypeExprEntries = restWithComma:(TupleTypeExprOperand _ "," _)*
-                       // Variadic type is only allowed on the last entry.
-                       last:(VariadicTypeExpr / VariadicTypeExprOperand)? {
-  return restWithComma.reduceRight((entries, tokens) => {
-    let [entry] = tokens;
-    return [entry].concat(entries);
-  }, last ? [last] : []);
-}
-
-TupleTypeExprOperand = UnionTypeExpr
-                     / UnaryUnionTypeExpr
-                     / RecordTypeExpr
-                     / TupleTypeExpr
-                     / ArrowTypeExpr
-                     / FunctionTypeExpr
-                     / ParenthesizedExpr
-                     / TypeQueryExpr
-                     / KeyQueryExpr
-                     / ArrayTypeExpr
-                     / GenericTypeExpr
-                     / BroadNamepathExpr
-                     / ValueExpr
-                     / AnyTypeExpr
-                     / UnknownTypeExpr
-
-
-/*
- * Parenthesis expressions.
- *
- * Examples:
- *   - (Foo|Bar)
- *   - (module: path/to/file).Module
- *
- * Spec:
- *   - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
- */
-ParenthesizedExpr = "(" _ wrapped:ParenthesizedExprOperand _ ")" {
-                    return {
-                      type: NodeType.PARENTHESIS,
-                      value: wrapped,
-                    };
-                  }
-
-
-ParenthesizedExprOperand = UnionTypeExpr
-                         / UnaryUnionTypeExpr
-                         / RecordTypeExpr
-                         / TupleTypeExpr
-                         / ArrowTypeExpr
-                         / FunctionTypeExpr
-                         / ArrayTypeExpr
-                         / TypeQueryExpr
-                         / KeyQueryExpr
-                         / GenericTypeExpr
-                         / BroadNamepathExpr
-                         / ValueExpr
-                         / AnyTypeExpr
-                         / UnknownTypeExpr
-
-
-
-/*
- * Variadic type expressions.
- *
- * Examples:
- *   - ...string (only allow on the top level or the last function parameter)
- *   - string... (only allow on the top level)
- *   - ...
- *
- * Note:
- *   It seems that we can omit the operand.
- *   See https://github.com/google/closure-library/blob/
- *       47f9c92bb4c7de9a3d46f9921a427402910073fb/
- *       closure/goog/base.js#L1847
- *
- * Spec:
- *   - https://developers.google.com/closure/compiler/docs/js-for-compiler#types
- *   - https://github.com/senchalabs/jsduck/wiki/Type-Definitions
- */
-VariadicTypeExpr = PrefixVariadicTypeExpr
-                 / SuffixVariadicTypeExpr
-                 / AnyVariadicTypeExpr
-
-
-PrefixVariadicTypeExpr = "..." operand:VariadicTypeExprOperand {
-                         return {
-                           type: NodeType.VARIADIC,
-                           value: operand,
-                           meta: { syntax: VariadicTypeSyntax.PREFIX_DOTS },
-                         };
-                       }
-
-
-SuffixVariadicTypeExpr = operand:VariadicTypeExprOperand "..." {
-                         return {
-                           type: NodeType.VARIADIC,
-                           value: operand,
-                           meta: { syntax: VariadicTypeSyntax.SUFFIX_DOTS },
-                         };
-                       }
-
-
-AnyVariadicTypeExpr = "..." {
-                      return {
-                        type: NodeType.VARIADIC,
-                        value: { type: NodeType.ANY },
-                        meta: { syntax: VariadicTypeSyntax.ONLY_DOTS },
-                      };
-                    }
-
-
-VariadicTypeExprOperand = UnionTypeExpr
-                        / UnaryUnionTypeExpr
-                        / RecordTypeExpr
-                        / TupleTypeExpr
-                        / ArrowTypeExpr
-                        / FunctionTypeExpr
-                        / ParenthesizedExpr
-                        / TypeQueryExpr
-                        / KeyQueryExpr
-                        / ArrayTypeExpr
-                        / GenericTypeExpr
-                        / BroadNamepathExpr
-                        / ValueExpr
-                        / AnyTypeExpr
-                        / UnknownTypeExpr
diff --git a/node_modules/jsdoctypeparser/schemas/AnyNode.json b/node_modules/jsdoctypeparser/schemas/AnyNode.json
deleted file mode 100644
index de545f1..0000000
--- a/node_modules/jsdoctypeparser/schemas/AnyNode.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" }
-  },
-  "required": [
-    "type"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/ExternalNode.json b/node_modules/jsdoctypeparser/schemas/ExternalNode.json
deleted file mode 100644
index 07ed6f5..0000000
--- a/node_modules/jsdoctypeparser/schemas/ExternalNode.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "value": { "$ref": "Node.json" }
-  },
-  "required": [
-    "type",
-    "value"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/FunctionNode.json b/node_modules/jsdoctypeparser/schemas/FunctionNode.json
deleted file mode 100644
index 8cf63e8..0000000
--- a/node_modules/jsdoctypeparser/schemas/FunctionNode.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "params": {
-      "type": "array",
-      "items": { "$ref": "Node.json" }
-    },
-    "returns": {
-      "oneOf": [
-        { "$ref": "Node.json" },
-        null
-      ]
-    },
-    "this": {
-      "oneOf": [
-        { "$ref": "Node.json" },
-        null
-      ]
-    },
-    "new": {
-      "oneOf": [
-        { "$ref": "Node.json" },
-        null
-      ]
-    }
-  },
-  "required": [
-    "type",
-    "params",
-    "returns",
-    "this",
-    "new"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/GenericNode.json b/node_modules/jsdoctypeparser/schemas/GenericNode.json
deleted file mode 100644
index e88422e..0000000
--- a/node_modules/jsdoctypeparser/schemas/GenericNode.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "subject": { "$ref": "Node.json" },
-    "objects": {
-      "type": "array",
-      "items": { "type": "Node.json" }
-    }
-  },
-  "required": [
-    "type",
-    "subject",
-    "objects"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/InnerMemberNode.json b/node_modules/jsdoctypeparser/schemas/InnerMemberNode.json
deleted file mode 100644
index 7c75bdd..0000000
--- a/node_modules/jsdoctypeparser/schemas/InnerMemberNode.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "owner": { "$ref": "Node.json" },
-    "name": { "type": "string" },
-    "hasEventPrefix": { "type": "boolean" },
-    "quoteStyle": {
-      "type": "string",
-      "enum": ["single", "double", "none"]
-    }
-  },
-  "required": [
-    "type",
-    "owner",
-    "name"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/InstanceMemberNode.json b/node_modules/jsdoctypeparser/schemas/InstanceMemberNode.json
deleted file mode 100644
index 7c75bdd..0000000
--- a/node_modules/jsdoctypeparser/schemas/InstanceMemberNode.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "owner": { "$ref": "Node.json" },
-    "name": { "type": "string" },
-    "hasEventPrefix": { "type": "boolean" },
-    "quoteStyle": {
-      "type": "string",
-      "enum": ["single", "double", "none"]
-    }
-  },
-  "required": [
-    "type",
-    "owner",
-    "name"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/MemberNode.json b/node_modules/jsdoctypeparser/schemas/MemberNode.json
deleted file mode 100644
index 7c75bdd..0000000
--- a/node_modules/jsdoctypeparser/schemas/MemberNode.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "owner": { "$ref": "Node.json" },
-    "name": { "type": "string" },
-    "hasEventPrefix": { "type": "boolean" },
-    "quoteStyle": {
-      "type": "string",
-      "enum": ["single", "double", "none"]
-    }
-  },
-  "required": [
-    "type",
-    "owner",
-    "name"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/ModuleNode.json b/node_modules/jsdoctypeparser/schemas/ModuleNode.json
deleted file mode 100644
index 16da8e4..0000000
--- a/node_modules/jsdoctypeparser/schemas/ModuleNode.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "path": { "type": "string" }
-  },
-  "required": [
-    "type",
-    "path"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/NameNode.json b/node_modules/jsdoctypeparser/schemas/NameNode.json
deleted file mode 100644
index 335849c..0000000
--- a/node_modules/jsdoctypeparser/schemas/NameNode.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "name": { "type": "string" }
-  },
-  "required": [
-    "type",
-    "name"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/Node.json b/node_modules/jsdoctypeparser/schemas/Node.json
deleted file mode 100644
index de545f1..0000000
--- a/node_modules/jsdoctypeparser/schemas/Node.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" }
-  },
-  "required": [
-    "type"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/NodeType.json b/node_modules/jsdoctypeparser/schemas/NodeType.json
deleted file mode 100644
index 58e51d7..0000000
--- a/node_modules/jsdoctypeparser/schemas/NodeType.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "type": "string",
-  "enum": [
-    "NAME",
-    "MEMBER",
-    "UNION",
-    "VARIADIC",
-    "RECORD",
-    "RECORD_ENTRY",
-    "TUPLE",
-    "GENERIC",
-    "MODULE",
-    "OPTIONAL",
-    "NULLABLE",
-    "NOT_NULLABLE",
-    "FUNCTION",
-    "ANY",
-    "UNKNOWN",
-    "INNER_MEMBER",
-    "INSTANCE_MEMBER"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/NotNullableNode.json b/node_modules/jsdoctypeparser/schemas/NotNullableNode.json
deleted file mode 100644
index 07ed6f5..0000000
--- a/node_modules/jsdoctypeparser/schemas/NotNullableNode.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "value": { "$ref": "Node.json" }
-  },
-  "required": [
-    "type",
-    "value"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/NullableNode.json b/node_modules/jsdoctypeparser/schemas/NullableNode.json
deleted file mode 100644
index 07ed6f5..0000000
--- a/node_modules/jsdoctypeparser/schemas/NullableNode.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "value": { "$ref": "Node.json" }
-  },
-  "required": [
-    "type",
-    "value"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/NumberValueNode.json b/node_modules/jsdoctypeparser/schemas/NumberValueNode.json
deleted file mode 100644
index f8a6a8d..0000000
--- a/node_modules/jsdoctypeparser/schemas/NumberValueNode.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "number": { "type": "number" }
-  },
-  "required": [
-    "type",
-    "number"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/OptionalNode.json b/node_modules/jsdoctypeparser/schemas/OptionalNode.json
deleted file mode 100644
index 07ed6f5..0000000
--- a/node_modules/jsdoctypeparser/schemas/OptionalNode.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "value": { "$ref": "Node.json" }
-  },
-  "required": [
-    "type",
-    "value"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/RecordEntryNode.json b/node_modules/jsdoctypeparser/schemas/RecordEntryNode.json
deleted file mode 100644
index 7e147c6..0000000
--- a/node_modules/jsdoctypeparser/schemas/RecordEntryNode.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "key": { "type": "string" },
-    "value": {
-      "oneOf": [
-        { "$ref": "Node.json" },
-        null
-      ]
-    }
-  },
-  "required": [
-    "type",
-    "key",
-    "value"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/RecordNode.json b/node_modules/jsdoctypeparser/schemas/RecordNode.json
deleted file mode 100644
index 5b8f650..0000000
--- a/node_modules/jsdoctypeparser/schemas/RecordNode.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "entries": {
-      "type": "array",
-      "items": { "$ref": "#/definitions/RecordEntryNode" }
-    }
-  },
-  "required": [
-    "type",
-    "entries"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/StringValueNode.json b/node_modules/jsdoctypeparser/schemas/StringValueNode.json
deleted file mode 100644
index d23e2da..0000000
--- a/node_modules/jsdoctypeparser/schemas/StringValueNode.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "string": { "type": "string" },
-    "quoteStyle": {
-      "type": "string",
-      "enum": ["single", "double", "none"]
-    }
-  },
-  "required": [
-    "type",
-    "string"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/TupleNode.json b/node_modules/jsdoctypeparser/schemas/TupleNode.json
deleted file mode 100644
index 6f0669d..0000000
--- a/node_modules/jsdoctypeparser/schemas/TupleNode.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "entries": {
-      "type": "array",
-      "items": { "$ref": "Node.json" }
-    }
-  },
-  "required": [
-    "type",
-    "entries"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/UnionNode.json b/node_modules/jsdoctypeparser/schemas/UnionNode.json
deleted file mode 100644
index 2257932..0000000
--- a/node_modules/jsdoctypeparser/schemas/UnionNode.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "right": { "$ref": "Node" },
-    "left": { "$ref": "Node.json" }
-  },
-  "required": [
-    "type",
-    "right",
-    "left"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/UnknownNode.json b/node_modules/jsdoctypeparser/schemas/UnknownNode.json
deleted file mode 100644
index de545f1..0000000
--- a/node_modules/jsdoctypeparser/schemas/UnknownNode.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" }
-  },
-  "required": [
-    "type"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/schemas/VariadicNode.json b/node_modules/jsdoctypeparser/schemas/VariadicNode.json
deleted file mode 100644
index d8964c8..0000000
--- a/node_modules/jsdoctypeparser/schemas/VariadicNode.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "type": { "$ref": "NodeType.json" },
-    "value": { "$ref": "Node.json" },
-    "meta": {
-      "type": "object",
-      "properties": {
-        "syntax": {
-          "type": "string",
-          "enum": ["PREFIX_DOTS", "SUFFIX_DOTS"]
-        }
-      }
-    }
-  },
-  "required": [
-    "type",
-    "value",
-    "meta"
-  ]
-}
diff --git a/node_modules/jsdoctypeparser/tsconfig.json b/node_modules/jsdoctypeparser/tsconfig.json
deleted file mode 100644
index e1553bf..0000000
--- a/node_modules/jsdoctypeparser/tsconfig.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-    "compilerOptions": {
-        "allowJs": true,
-        "checkJs": true,
-        "noEmit": true,
-        "target": "esnext",
-        "lib": ["es2015"],
-        "module": "commonjs",
-        "resolveJsonModule": true,
-        "strict": false
-    },
-    "include": [
-        "lib"
-    ],
-}
diff --git a/node_modules/jsx-ast-utils/.babelrc b/node_modules/jsx-ast-utils/.babelrc
deleted file mode 100644
index 4517434..0000000
--- a/node_modules/jsx-ast-utils/.babelrc
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "presets": ["env"],
-  "plugins": [
-    ["transform-replace-object-assign", { "moduleSpecifier": "object.assign" }],
-    "transform-object-rest-spread",
-  ],
-}
diff --git a/node_modules/jsx-ast-utils/.eslintignore b/node_modules/jsx-ast-utils/.eslintignore
deleted file mode 100644
index 869feff..0000000
--- a/node_modules/jsx-ast-utils/.eslintignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules/
-reports/
-lib/
diff --git a/node_modules/jsx-ast-utils/.eslintrc b/node_modules/jsx-ast-utils/.eslintrc
deleted file mode 100644
index e725eb7..0000000
--- a/node_modules/jsx-ast-utils/.eslintrc
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  extends: "airbnb-base",
-  rules: {
-    no-use-before-define: ["error", { functions: false }]
-  }
-}
diff --git a/node_modules/jsx-ast-utils/.github/FUNDING.yml b/node_modules/jsx-ast-utils/.github/FUNDING.yml
deleted file mode 100644
index 24cba01..0000000
--- a/node_modules/jsx-ast-utils/.github/FUNDING.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-# These are supported funding model platforms
-
-github: [ljharb]
-tidelift: "npm/jsx-ast-utils"
diff --git a/node_modules/jsx-ast-utils/.travis.yml b/node_modules/jsx-ast-utils/.travis.yml
deleted file mode 100644
index 0177af9..0000000
--- a/node_modules/jsx-ast-utils/.travis.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-language: node_js
-os:
- - linux
-node_js:
-  - "12"
-  - "10"
-  - "8"
-  - "6"
-  - "4"
-  - "0.12"
-  - "0.10"
-cache:
-  directories:
-    - node_modules
-after_success:
-  - npm run coveralls
-before_install:
-  - 'case "${TRAVIS_NODE_VERSION}" in 0.*) export NPM_CONFIG_STRICT_SSL=false ;; esac'
-  - 'nvm install-latest-npm'
-install:
-  - 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ] || [ "${TRAVIS_NODE_VERSION}" = "0.9" ]; then nvm install --latest-npm 0.8 && npm install && nvm use "${TRAVIS_NODE_VERSION}"; else npm install; fi;'
-script:
-  - 'if [ -n "${PRETEST-}" ]; then npm run pretest ; fi'
-  - 'if [ -n "${TEST-}" ]; then npm run tests-only ; fi'
-sudo: false
-branches:
-  only:
-    - master
-env:
-  - TEST=true
-matrix:
-  fast_finish: true
-  include:
-    - node_js: "lts/*"
-      env: PRETEST=true
-  allow_failures:
-    - os: osx
-    - node_js: "0.12"
-    - node_js: "0.10"
diff --git a/node_modules/jsx-ast-utils/CHANGELOG.md b/node_modules/jsx-ast-utils/CHANGELOG.md
deleted file mode 100644
index b27d5e7..0000000
--- a/node_modules/jsx-ast-utils/CHANGELOG.md
+++ /dev/null
@@ -1,107 +0,0 @@
-2.2.3 / 2019-10-24
-==================
-- (fix) Fix crash on spread (#94)
-
-2.2.2 / 2019-10-24
-==================
-- (improvement) Add support for retrieving props from a spread with object expression (#93)
-
-2.2.1 / 2019-06-30
-==================
-- (improvement) Account for TypeCastExpression in the utils
-
-2.2.0 / 2019-06-25
-==================
-- (fix) Fix getLiteralPropValue for TS-specific node types.
-- (chore) upgrade dependencies.
-- (improvement) Stop throwing errors when unknown AST nodes are encountered.
-- (dev) CI changes.
-
-2.1.0 / 2018-04-19
-==================
-- Fix undefined bug for template strings. #45
-- Adding support for `objectRestSpread` within props #60
-- Accommodate ExperimentalSpreadProperty in prop values #75
-- Account for SpreadElement AST Nodes #76
-- Support OptionalMemberExpression AST nodes #77
-- Add support to Typescript's node types #72
-
-2.0.1 / 2017-08-31
-==================
-- [fix] Add support for BindExpression
-
-
-2.0.0 / 2017-07-07
-==================
-- [breaking] Remove undefined return from `propName` so it always returns a value.
-
-
-1.4.1 / 2017-04-19
-==================
-- [fix] - Fixing fatal throw in `getPropValue` for `ArrowFunctionExpression`
-
-
-1.4.0 / 2017-02-02
-==================
-- [new] Add eventHandlers and eventHandlersByType to API. These are the event names for DOM elements on JSX-using libraries such as React, inferno, and preact.
-
-
-1.3.5 / 2016-12-14
-==================
-- [fix] Normalize literals "true" and "false" before converting to boolean in Literal prop value extractor.
-
-
-1.3.4 / 2016-11-15
-==================
-- [fix] Recursively resolve JSXMemberExpression names for elementType. (i.e. `<Component.Render.Me />`). Fixes [#9](https://github.com/evcohen/jsx-ast-utils/issues/9)
-
-
-1.3.3 / 2016-10-28
-==================
-- [fix] Add support for `ArrayExpression`.
-
-
-1.3.2 / 2016-10-11
-==================
-- [fix] Add support for `UpdateExpression`.
-
-
-1.3.1 / 2016-07-13
-==================
-- [fix] Add `JSXElement` to expression types to handle recursively extracting prop value.
-
-
-1.3.0 / 2016-07-12
-==================
-- [new] Add support for `TaggedTemplateExpression`.
-
-
-1.2.1 / 2016-06-15
-==================
-- [fix] Point to `lib` instead of `src` for root exports.
-
-
-1.2.0 / 2016-06-15
-==================
-- [new] Export functions from root so they can be imported like the following: `require('jsx-ast-utils/{function}')`.
-
-
-1.1.1 / 2016-06-12
-==================
-- [fix] Better support for expressions in `TemplateLiteral` extraction.
-
-
-1.1.0 / 2016-06-10
-==================
-- [new] Support for namespaced element names.
-- [new] Add `propName` to API to get correct name for prop.
-
-
-1.0.1 / 2016-06-10
-==================
-- [fix] Return actual reserved words instead of string representations of them.
-
-
-1.0.0 / 2016-06-09
-==================
-- Initial stable release
diff --git a/node_modules/jsx-ast-utils/LICENSE.md b/node_modules/jsx-ast-utils/LICENSE.md
deleted file mode 100644
index a66c74b..0000000
--- a/node_modules/jsx-ast-utils/LICENSE.md
+++ /dev/null
@@ -1,8 +0,0 @@
-The MIT License (MIT)
-Copyright (c) 2016 Ethan Cohen
-
-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/node_modules/jsx-ast-utils/README.md b/node_modules/jsx-ast-utils/README.md
deleted file mode 100644
index 1f14b43..0000000
--- a/node_modules/jsx-ast-utils/README.md
+++ /dev/null
@@ -1,294 +0,0 @@
-<p align="center">
-  <a href="https://travis-ci.org/evcohen/jsx-ast-utils">
-    <img src="https://api.travis-ci.org/evcohen/jsx-ast-utils.svg?branch=master"
-         alt="build status">
-  </a>
-  <a href="https://npmjs.org/package/jsx-ast-utils">
-    <img src="https://img.shields.io/npm/v/jsx-ast-utils.svg"
-         alt="npm version">
-  </a>
-  <a href="https://github.com/evcohen/jsx-ast-utils/blob/master/LICENSE.md">
-    <img src="https://img.shields.io/npm/l/jsx-ast-utils.svg"
-         alt="license">
-  </a>
-  <a href='https://coveralls.io/github/evcohen/jsx-ast-utils?branch=master'>
-    <img src='https://coveralls.io/repos/github/evcohen/jsx-ast-utils/badge.svg?branch=master' alt='Coverage Status' />
-  </a>
-  <a href='https://npmjs.org/package/jsx-ast-utils'>
-    <img src='https://img.shields.io/npm/dt/jsx-ast-utils.svg'
-    alt='Total npm downloads' />
-  </a>
-</p>
-
-# jsx-ast-utils
-
-AST utility module for statically analyzing JSX.
-
-## Installation
-```sh
-$ npm i jsx-ast-utils --save
-```
-
-## Usage
-This is a utility module to evaluate AST objects for JSX syntax. This can be super useful when writing linting rules for JSX code. It was originally in the code for [eslint-plugin-jsx-a11y](https://github.com/evcohen/eslint-plugin-jsx-a11y), however I thought it could be useful to be extracted and maintained separately so **you** could write new interesting rules to statically analyze JSX.
-
-### ESLint example
-```js
-import { hasProp } from 'jsx-ast-utils';
-// OR: var hasProp = require('jsx-ast-utils').hasProp;
-// OR: const hasProp = require('jsx-ast-utils/hasProp');
-// OR: import hasProp from 'jsx-ast-utils/hasProp';
-
-module.exports = context => ({
-  JSXOpeningElement: node => {
-    const onChange = hasProp(node.attributes, 'onChange');
-
-    if (onChange) {
-      context.report({
-        node,
-        message: `No onChange!`
-      });
-    }
-  }
-});
-```
-
-## API
-### AST Resources
-1. [JSX spec](https://github.com/facebook/jsx/blob/master/AST.md)
-2. [JS spec](https://github.com/estree/estree/blob/master/spec.md)
-
-### hasProp
-```js
-hasProp(props, prop, options);
-```
-Returns boolean indicating whether an prop exists as an attribute on a JSX element node.
-
-#### Props
-Object - The attributes on the visited node. (Usually `node.attributes`).
-#### Prop
-String - A string representation of the prop you want to check for existence.
-#### Options
-Object - An object representing options for existence checking
-  1. `ignoreCase` - automatically set to `true`.
-  2. `spreadStrict` - automatically set to `true`. This means if spread operator exists in
-     props, it will assume the prop you are looking for is not in the spread.
-     Example: `<div {...props} />` looking for specific prop here will return false if `spreadStrict` is `true`.
-
-<hr />
-
-### hasAnyProp
-
-```js
-hasAnyProp(props, prop, options);
-```
-Returns a boolean indicating if **any** of props in `prop` argument exist on the node.
-
-#### Props
-Object - The attributes on the visited node. (Usually `node.attributes`).
-#### Prop
-Array<String> - An array of strings representing the props you want to check for existence.
-#### Options
-Object - An object representing options for existence checking
-  1. `ignoreCase` - automatically set to `true`.
-  2. `spreadStrict` - automatically set to `true`. This means if spread operator exists in
-     props, it will assume the prop you are looking for is not in the spread.
-     Example: `<div {...props} />` looking for specific prop here will return false if `spreadStrict` is `true`.
-
-<hr />
-
-### hasEveryProp
-
-```js
-hasEveryProp(props, prop, options);
-```
-Returns a boolean indicating if **all** of props in `prop` argument exist on the node.
-
-#### Props
-Object - The attributes on the visited node. (Usually `node.attributes`).
-#### Prop
-Array<String> - An array of strings representing the props you want to check for existence.
-#### Options
-Object - An object representing options for existence checking
- 1. `ignoreCase` - automatically set to `true`.
- 2. `spreadStrict` - automatically set to `true`. This means if spread operator exists in
-    props, it will assume the prop you are looking for is not in the spread.
-    Example: `<div {...props} />` looking for specific prop here will return false if `spreadStrict` is `true`.
-
-<hr />
-
-### getProp
-
-```js
-getProp(props, prop, options);
-```
-Returns the JSXAttribute itself or undefined, indicating the prop is not present on the JSXOpeningElement.
-
-#### Props
-Object - The attributes on the visited node. (Usually `node.attributes`).
-#### Prop
-String - A string representation of the prop you want to check for existence.
-#### Options
-Object - An object representing options for existence checking
-  1. `ignoreCase` - automatically set to `true`.
-
-<hr />
-
-### elementType
-```js
-elementType(node)
-```
-Returns the tagName associated with a JSXElement.
-
-#### Node
-Object - The visited JSXElement node object.
-
-<hr />
-
-### getPropValue
-
-```js
-getPropValue(prop);
-```
-Returns the value of a given attribute. Different types of attributes have their associated values in different properties on the object.
-
-This function should return the most *closely* associated value with the intention of the JSX.
-
-#### Prop
-Object - The JSXAttribute collected by AST parser.
-
-<hr />
-
-### getLiteralPropValue
-
-```js
-getLiteralPropValue(prop);
-```
-Returns the value of a given attribute. Different types of attributes have their associated values in different properties on the object.
-
-This function should return a value only if we can extract a literal value from its attribute (i.e. values that have generic types in JavaScript - strings, numbers, booleans, etc.)
-
-#### Prop
-Object - The JSXAttribute collected by AST parser.
-
-<hr />
-
-### propName
-
-```js
-propName(prop);
-```
-Returns the name associated with a JSXAttribute. For example, given `<div foo="bar" />` and the JSXAttribute for `foo`, this will return the string `"foo"`.
-
-#### Prop
-Object - The JSXAttribute collected by AST parser.
-
-<hr />
-
-### eventHandlers
-
-```js
-console.log(eventHandlers);
-/*
-[
-  'onCopy',
-  'onCut',
-  'onPaste',
-  'onCompositionEnd',
-  'onCompositionStart',
-  'onCompositionUpdate',
-  'onKeyDown',
-  'onKeyPress',
-  'onKeyUp',
-  'onFocus',
-  'onBlur',
-  'onChange',
-  'onInput',
-  'onSubmit',
-  'onClick',
-  'onContextMenu',
-  'onDblClick',
-  'onDoubleClick',
-  'onDrag',
-  'onDragEnd',
-  'onDragEnter',
-  'onDragExit',
-  'onDragLeave',
-  'onDragOver',
-  'onDragStart',
-  'onDrop',
-  'onMouseDown',
-  'onMouseEnter',
-  'onMouseLeave',
-  'onMouseMove',
-  'onMouseOut',
-  'onMouseOver',
-  'onMouseUp',
-  'onSelect',
-  'onTouchCancel',
-  'onTouchEnd',
-  'onTouchMove',
-  'onTouchStart',
-  'onScroll',
-  'onWheel',
-  'onAbort',
-  'onCanPlay',
-  'onCanPlayThrough',
-  'onDurationChange',
-  'onEmptied',
-  'onEncrypted',
-  'onEnded',
-  'onError',
-  'onLoadedData',
-  'onLoadedMetadata',
-  'onLoadStart',
-  'onPause',
-  'onPlay',
-  'onPlaying',
-  'onProgress',
-  'onRateChange',
-  'onSeeked',
-  'onSeeking',
-  'onStalled',
-  'onSuspend',
-  'onTimeUpdate',
-  'onVolumeChange',
-  'onWaiting',
-  'onLoad',
-  'onError',
-  'onAnimationStart',
-  'onAnimationEnd',
-  'onAnimationIteration',
-  'onTransitionEnd',
-]
-*/
-```
-
-Contains a flat list of common event handler props used in JSX to attach behaviors
-to DOM events.
-
-#### eventHandlersByType
-
-The same list as `eventHandlers`, grouped into types.
-
-```js
-console.log(eventHandlersByType);
-/*
-{
-  clipboard: [ 'onCopy', 'onCut', 'onPaste' ],
-  composition: [ 'onCompositionEnd', 'onCompositionStart', 'onCompositionUpdate' ],
-  keyboard: [ 'onKeyDown', 'onKeyPress', 'onKeyUp' ],
-  focus: [ 'onFocus', 'onBlur' ],
-  form: [ 'onChange', 'onInput', 'onSubmit' ],
-  mouse: [ 'onClick', 'onContextMenu', 'onDblClick', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragExit', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp' ],
-  selection: [ 'onSelect' ],
-  touch: [ 'onTouchCancel', 'onTouchEnd', 'onTouchMove', 'onTouchStart' ],
-  ui: [ 'onScroll' ],
-  wheel: [ 'onWheel' ],
-  media: [ 'onAbort', 'onCanPlay', 'onCanPlayThrough', 'onDurationChange', 'onEmptied', 'onEncrypted', 'onEnded', 'onError', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onSeeked', 'onSeeking', 'onStalled', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting' ],
-  image: [ 'onLoad', 'onError' ],
-  animation: [ 'onAnimationStart', 'onAnimationEnd', 'onAnimationIteration' ],
-  transition: [ 'onTransitionEnd' ],
-}
-*/
-```
diff --git a/node_modules/jsx-ast-utils/__tests__/helper.js b/node_modules/jsx-ast-utils/__tests__/helper.js
deleted file mode 100644
index dd00aa5..0000000
--- a/node_modules/jsx-ast-utils/__tests__/helper.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/* eslint-env jest */
-import getProp from '../src/getProp';
-
-const nodeVersion = parseInt(process.version.match(/^v(\d+)\./)[1], 10);
-
-export const fallbackToBabylon = nodeVersion < 6;
-
-let parserName;
-const babelParser = fallbackToBabylon ? require('babylon') : require('@babel/parser');
-const flowParser = require('flow-parser');
-
-const defaultPlugins = ['jsx', 'functionBind', 'estree', 'objectRestSpread', 'optionalChaining'];
-let plugins = [...defaultPlugins];
-
-export function setParserName(name) {
-  parserName = name;
-}
-
-export function changePlugins(pluginOrFn) {
-  if (Array.isArray(pluginOrFn)) {
-    plugins = pluginOrFn;
-  } else if (typeof pluginOrFn === 'function') {
-    plugins = pluginOrFn(plugins);
-  } else {
-    throw new Error('changePlugins argument should be either an array or a function');
-  }
-}
-
-beforeEach(() => {
-  plugins = [...defaultPlugins];
-});
-
-function parse(code) {
-  if (parserName === undefined) {
-    throw new Error('No parser specified');
-  }
-  if (parserName === 'babel') {
-    try {
-      return babelParser.parse(code, { plugins, sourceFilename: 'test.js' });
-    } catch (_) {
-      // eslint-disable-next-line no-console
-      console.warn(`Failed to parse with ${fallbackToBabylon ? 'babylon' : 'Babel'} parser.`);
-    }
-  }
-  if (parserName === 'flow') {
-    try {
-      return flowParser.parse(code, { plugins });
-    } catch (_) {
-      // eslint-disable-next-line no-console
-      console.warn('Failed to parse with the Flow parser');
-    }
-  }
-  throw new Error(`The parser ${parserName} is not yet supported for testing.`);
-}
-
-export function getOpeningElement(code) {
-  const parsedCode = parse(code);
-  let body;
-  if (parsedCode.program) {
-    // eslint-disable-next-line prefer-destructuring
-    body = parsedCode.program.body;
-  } else {
-    // eslint-disable-next-line prefer-destructuring
-    body = parsedCode.body;
-  }
-  if (Array.isArray(body) && body[0] != null) {
-    return body[0].expression.openingElement;
-  }
-
-  return null;
-}
-
-export function extractProp(code, prop = 'foo') {
-  const node = getOpeningElement(code);
-  const { attributes: props } = node;
-  return getProp(props, prop);
-}
-
-export const describeIfNotBabylon = fallbackToBabylon ? describe.skip : describe;
diff --git a/node_modules/jsx-ast-utils/__tests__/src/elementType-test.js b/node_modules/jsx-ast-utils/__tests__/src/elementType-test.js
deleted file mode 100644
index 6310805..0000000
--- a/node_modules/jsx-ast-utils/__tests__/src/elementType-test.js
+++ /dev/null
@@ -1,85 +0,0 @@
-/* eslint-env mocha */
-import assert from 'assert';
-import { getOpeningElement, setParserName } from '../helper';
-import elementType from '../../src/elementType';
-
-describe('elementType tests', () => {
-  beforeEach(() => {
-    setParserName('babel');
-  });
-  it('should export a function', () => {
-    const expected = 'function';
-    const actual = typeof elementType;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should throw an error if the argument is missing', () => {
-    assert.throws(() => { elementType(); }, Error);
-  });
-
-  it('should throw an error if the argument not a JSX node', () => {
-    assert.throws(() => { elementType({ a: 'foo' }); }, Error);
-  });
-
-  it('should return the correct type of the DOM element given its node object', () => {
-    const code = '<div />';
-    const node = getOpeningElement(code);
-
-    const expected = 'div';
-    const actual = elementType(node);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return the correct type of the custom element given its node object', () => {
-    const code = '<Slider />';
-    const node = getOpeningElement(code);
-
-    const expected = 'Slider';
-    const actual = elementType(node);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return the correct type of the custom object element given its node object', () => {
-    const code = '<UX.Slider />';
-    const node = getOpeningElement(code);
-
-    const expected = 'UX.Slider';
-    const actual = elementType(node);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return the correct type of the namespaced element given its node object', () => {
-    const code = '<UX:Slider />';
-    const node = getOpeningElement(code);
-
-    const expected = 'UX:Slider';
-    const actual = elementType(node);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return the correct type of the multiple custom object element given its node object',
-    () => {
-      const code = '<UX.Slider.Blue.Light />';
-      const node = getOpeningElement(code);
-
-      const expected = 'UX.Slider.Blue.Light';
-      const actual = elementType(node);
-
-      assert.equal(expected, actual);
-    });
-
-  it('should return this.Component when given its node object', () => {
-    const code = '<this.Component />';
-    const node = getOpeningElement(code);
-
-    const expected = 'this.Component';
-    const actual = elementType(node);
-
-    assert.equal(expected, actual);
-  });
-});
diff --git a/node_modules/jsx-ast-utils/__tests__/src/eventHandlers-test.js b/node_modules/jsx-ast-utils/__tests__/src/eventHandlers-test.js
deleted file mode 100644
index b678cde..0000000
--- a/node_modules/jsx-ast-utils/__tests__/src/eventHandlers-test.js
+++ /dev/null
@@ -1,101 +0,0 @@
-/* eslint-env mocha */
-import assert from 'assert';
-import includes from 'array-includes';
-import eventHandlers, { eventHandlersByType } from '../../src/eventHandlers';
-
-describe('eventHandlers', () => {
-  it('should contain a list of common JSX event handlers', () => {
-    assert([
-      'onCopy',
-      'onCut',
-      'onPaste',
-      'onCompositionEnd',
-      'onCompositionStart',
-      'onCompositionUpdate',
-      'onKeyDown',
-      'onKeyPress',
-      'onKeyUp',
-      'onFocus',
-      'onBlur',
-      'onChange',
-      'onInput',
-      'onSubmit',
-      'onClick',
-      'onContextMenu',
-      'onDblClick',
-      'onDoubleClick',
-      'onDrag',
-      'onDragEnd',
-      'onDragEnter',
-      'onDragExit',
-      'onDragLeave',
-      'onDragOver',
-      'onDragStart',
-      'onDrop',
-      'onMouseDown',
-      'onMouseEnter',
-      'onMouseLeave',
-      'onMouseMove',
-      'onMouseOut',
-      'onMouseOver',
-      'onMouseUp',
-      'onSelect',
-      'onTouchCancel',
-      'onTouchEnd',
-      'onTouchMove',
-      'onTouchStart',
-      'onScroll',
-      'onWheel',
-      'onAbort',
-      'onCanPlay',
-      'onCanPlayThrough',
-      'onDurationChange',
-      'onEmptied',
-      'onEncrypted',
-      'onEnded',
-      'onError',
-      'onLoadedData',
-      'onLoadedMetadata',
-      'onLoadStart',
-      'onPause',
-      'onPlay',
-      'onPlaying',
-      'onProgress',
-      'onRateChange',
-      'onSeeked',
-      'onSeeking',
-      'onStalled',
-      'onSuspend',
-      'onTimeUpdate',
-      'onVolumeChange',
-      'onWaiting',
-      'onLoad',
-      'onError',
-      'onAnimationStart',
-      'onAnimationEnd',
-      'onAnimationIteration',
-      'onTransitionEnd',
-    ].every(handlerName => includes(eventHandlers, handlerName)));
-  });
-});
-
-describe('eventHandlersByType', () => {
-  it('should be keyed by type', () => {
-    assert([
-      'clipboard',
-      'composition',
-      'keyboard',
-      'focus',
-      'form',
-      'mouse',
-      'selection',
-      'touch',
-      'ui',
-      'wheel',
-      'media',
-      'image',
-      'animation',
-      'transition',
-    ].every(type => !!eventHandlersByType[type]));
-  });
-});
diff --git a/node_modules/jsx-ast-utils/__tests__/src/getProp-parser-test.js b/node_modules/jsx-ast-utils/__tests__/src/getProp-parser-test.js
deleted file mode 100644
index 9ffb50e..0000000
--- a/node_modules/jsx-ast-utils/__tests__/src/getProp-parser-test.js
+++ /dev/null
@@ -1,136 +0,0 @@
-/* eslint-env mocha */
-import assert from 'assert';
-import entries from 'object.entries';
-import fromEntries from 'object.fromentries';
-import { getOpeningElement, setParserName, fallbackToBabylon } from '../helper';
-import getProp from '../../src/getProp';
-
-const literal = {
-  source: '<div {...{ id: "foo" }} />',
-  target: '<div id="foo" />',
-  offset: { keyOffset: -6, valueOffset: -7 },
-};
-
-const expression1 = {
-  source: '<div {...{ id }} />',
-  target: '<div id={id} />',
-  offset: { keyOffset: -6, valueOffset: -2 },
-};
-
-const expression2 = {
-  source: '<div {...{ id: `foo${bar}baz` }} />', // eslint-disable-line no-template-curly-in-string
-  target: '<div id={`foo${bar}baz`} />', // eslint-disable-line no-template-curly-in-string
-  offset: { keyOffset: -6, valueOffset: -6 },
-};
-
-describe('getProp', () => {
-  it('should create the correct AST for literal with flow parser', () => {
-    actualTest('flow', literal);
-  });
-  it('should create the correct AST for literal with babel parser', () => {
-    actualTest('babel', literal);
-  });
-  it('should create the correct AST for expression with flow parser (1)', () => {
-    actualTest('flow', expression1);
-  });
-  it('should create the correct AST for expression with babel parser (1)', () => {
-    actualTest('babel', expression1);
-  });
-  it('should create the correct AST for expression with flow parser (2)', () => {
-    actualTest('flow', expression2);
-  });
-  it('should create the correct AST for expression with babel parser (2)', () => {
-    actualTest('babel', expression2);
-  });
-});
-
-function actualTest(parserName, test) {
-  setParserName(parserName);
-  const { source, target, offset } = test;
-  const sourceProps = stripConstructors(getOpeningElement(source).attributes);
-  const targetProps = stripConstructors(getOpeningElement(target).attributes);
-  const prop = 'id';
-  const sourceResult = getProp(sourceProps, prop);
-  const targetResult = getProp(targetProps, prop);
-
-  if (fallbackToBabylon && parserName === 'babel' && test === literal) {
-    // Babylon (node < 6) adds an `extra: null` prop to a literal if it is parsed from a
-    // JSXAttribute, other literals don't get this.
-    sourceResult.value.extra = null;
-  }
-
-  assert.deepStrictEqual(
-    adjustLocations(sourceResult, offset),
-    targetResult,
-  );
-}
-
-function stripConstructors(value) {
-  return JSON.parse(JSON.stringify(value));
-}
-
-function adjustLocations(node, { keyOffset, valueOffset }) {
-  const hasExpression = !!node.value.expression;
-  return {
-    ...adjustNodeLocations(node, {
-      startOffset: keyOffset,
-      endOffset: valueOffset + (hasExpression ? 1 : 0),
-    }),
-    name: adjustNodeLocations(node.name, { startOffset: keyOffset, endOffset: keyOffset }),
-    value: {
-      ...adjustNodeLocations(node.value, {
-        startOffset: valueOffset - (hasExpression ? 1 : 0),
-        endOffset: valueOffset + (hasExpression ? 1 : 0),
-      }),
-      ...(hasExpression
-        ? {
-          expression: adjustLocationsRecursively(
-            node.value.expression,
-            { startOffset: valueOffset, endOffset: valueOffset },
-          ),
-        }
-        : {}
-      ),
-    },
-  };
-}
-
-function adjustNodeLocations(node, { startOffset, endOffset }) {
-  if (!node.loc) return node;
-  const [start, end] = node.range || [];
-  return {
-    ...node,
-    ...(node.start !== undefined ? { start: node.start + startOffset } : {}),
-    ...(node.end !== undefined ? { end: node.end + endOffset } : {}),
-    loc: {
-      ...node.loc,
-      start: {
-        ...node.loc.start,
-        column: node.loc.start.column + startOffset,
-      },
-      end: {
-        ...node.loc.end,
-        column: node.loc.end.column + endOffset,
-      },
-    },
-    ...(node.range !== undefined ? { range: [start + startOffset, end + endOffset] } : {}),
-  };
-}
-
-function adjustLocationsRecursively(node, { startOffset, endOffset }) {
-  if (Array.isArray(node)) {
-    return node.map(x => adjustLocationsRecursively(x, { startOffset, endOffset }));
-  }
-  if (node && typeof node === 'object') {
-    return adjustNodeLocations(
-      mapValues(node, x => adjustLocationsRecursively(x, { startOffset, endOffset })),
-      { startOffset, endOffset },
-    );
-  }
-
-  return node;
-}
-
-function mapValues(o, f) {
-  return fromEntries(entries(o).map(([k, v]) => [k, f(v)]));
-}
diff --git a/node_modules/jsx-ast-utils/__tests__/src/getProp-test.js b/node_modules/jsx-ast-utils/__tests__/src/getProp-test.js
deleted file mode 100644
index 8ba253d..0000000
--- a/node_modules/jsx-ast-utils/__tests__/src/getProp-test.js
+++ /dev/null
@@ -1,149 +0,0 @@
-/* eslint-env mocha */
-import assert from 'assert';
-import { getOpeningElement, setParserName } from '../helper';
-import getProp from '../../src/getProp';
-
-describe('getProp', () => {
-  beforeEach(() => {
-    setParserName('babel');
-  });
-  it('should export a function', () => {
-    const expected = 'function';
-    const actual = typeof getProp;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return undefined if no arguments are provided', () => {
-    const expected = undefined;
-    const actual = getProp();
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return undefined if the attribute is absent', () => {
-    const code = '<div />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-
-    const expected = undefined;
-    const actual = getProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return the correct attribute if the attribute exists', () => {
-    const code = '<div id="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-
-    const expected = 'id';
-    const actual = getProp(props, prop).name.name;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return the correct attribute if the attribute exists in spread', () => {
-    const code = '<div {...{ id: "foo" }} />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'ID';
-
-    const expected = 'id';
-    const actual = getProp(props, prop).name.name;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return the correct attribute if the attribute exists in spread as an expression', () => {
-    const code = '<div {...{ id }} />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-
-    const expected = 'id';
-    const actual = getProp(props, prop);
-    const actualName = actual.name.name;
-    const actualValue = actual.value.expression.name;
-
-    assert.equal(expected, actualName);
-    assert.equal(expected, actualValue);
-  });
-
-  it('should return the correct attribute if the attribute exists in spread (case sensitive)', () => {
-    const code = '<div {...{ id: "foo" }} />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-    const options = { ignoreCase: false };
-
-    const expected = 'id';
-    const actual = getProp(props, prop, options).name.name;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return undefined if the attribute does not exist in spread (case sensitive)', () => {
-    const code = '<div {...{ id: "foo" }} />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'ID';
-    const options = { ignoreCase: false };
-
-    const expected = undefined;
-    const actual = getProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return undefined for key in spread', () => {
-    // https://github.com/reactjs/rfcs/pull/107
-    const code = '<div {...{ key }} />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'key';
-
-    const expected = undefined;
-    const actual = getProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return undefined if the attribute may exist in spread', () => {
-    const code = '<div {...props} />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-
-    const expected = undefined;
-    const actual = getProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should not crash if the spread contains a spread', () => {
-    const code = '<div {...{ ...props }} />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-
-    getProp(props, prop);
-  });
-
-  it('should return undefined if the attribute is considered absent in case-sensitive mode', () => {
-    const code = '<div ID="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-    const options = {
-      ignoreCase: false,
-    };
-
-    const expected = undefined;
-    const actual = getProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-});
diff --git a/node_modules/jsx-ast-utils/__tests__/src/getPropLiteralValue-babelparser-test.js b/node_modules/jsx-ast-utils/__tests__/src/getPropLiteralValue-babelparser-test.js
deleted file mode 100644
index 68abf41..0000000
--- a/node_modules/jsx-ast-utils/__tests__/src/getPropLiteralValue-babelparser-test.js
+++ /dev/null
@@ -1,522 +0,0 @@
-/* eslint-env mocha */
-/* eslint no-template-curly-in-string: 0 */
-import assert from 'assert';
-import {
-  extractProp,
-  describeIfNotBabylon,
-  changePlugins,
-  setParserName,
-} from '../helper';
-import { getLiteralPropValue } from '../../src/getPropValue';
-
-describe('getLiteralPropValue', () => {
-  beforeEach(() => {
-    setParserName('babel');
-  });
-  it('should export a function', () => {
-    const expected = 'function';
-    const actual = typeof getLiteralPropValue;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return undefined when not provided with a JSXAttribute', () => {
-    const expected = undefined;
-    const actual = getLiteralPropValue(1);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should not throw error when trying to get value from unknown node type', () => {
-    const prop = {
-      type: 'JSXAttribute',
-      value: {
-        type: 'JSXExpressionContainer',
-      },
-    };
-    let counter = 0;
-    // eslint-disable-next-line no-console
-    const errorOrig = console.error;
-    // eslint-disable-next-line no-console
-    console.error = () => {
-      counter += 1;
-    };
-    let value;
-    assert.doesNotThrow(() => {
-      value = getLiteralPropValue(prop);
-    }, Error);
-
-    assert.equal(null, value);
-    assert.equal(counter, 1);
-    // eslint-disable-next-line no-console
-    console.error = errorOrig;
-  });
-
-  describe('Null', () => {
-    it('should return true when no value is given', () => {
-      const prop = extractProp('<div foo />');
-
-      const expected = true;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Literal', () => {
-    it('should return correct string if value is a string', () => {
-      const prop = extractProp('<div foo="bar" />');
-
-      const expected = 'bar';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return correct string if value is a string expression', () => {
-      const prop = extractProp('<div foo={"bar"} />');
-
-      const expected = 'bar';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return correct integer if value is a integer expression', () => {
-      const prop = extractProp('<div foo={1} />');
-
-      const expected = 1;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should convert "true" to boolean type', () => {
-      const prop = extractProp('<div foo="true" />');
-
-      const expected = true;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should convert "TrUE" to boolean type', () => {
-      const prop = extractProp('<div foo="TrUE" />');
-
-      const expected = true;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should convert "false" to boolean type', () => {
-      const prop = extractProp('<div foo="false" />');
-
-      const expected = false;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should convert "FaLsE" to boolean type', () => {
-      const prop = extractProp('<div foo="FaLsE" />');
-
-      const expected = false;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return String null when value is null', () => {
-      const prop = extractProp('<div foo={null} />');
-
-      const expected = 'null';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('JSXElement', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={<bar />} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Identifier', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={bar} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return undefined when identifier is literally `undefined`', () => {
-      const prop = extractProp('<div foo={undefined} />');
-
-      const expected = undefined;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Template literal', () => {
-    it('should return template literal with vars wrapped in curly braces', () => {
-      const prop = extractProp('<div foo={`bar ${baz}`} />');
-
-      const expected = 'bar {baz}';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string "undefined" for expressions that evaluate to undefined', () => {
-      const prop = extractProp('<div foo={`bar ${undefined}`} />');
-
-      const expected = 'bar undefined';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Tagged Template literal', () => {
-    it('should return template literal with vars wrapped in curly braces', () => {
-      const prop = extractProp('<div foo={noop`bar ${baz}`} />');
-
-      const expected = 'bar {baz}';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string "undefined" for expressions that evaluate to undefined', () => {
-      const prop = extractProp('<div foo={noop`bar ${undefined}`} />');
-
-      const expected = 'bar undefined';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Arrow function expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={ () => { return "bar"; }} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Function expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={ function() { return "bar"; } } />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Logical expression', () => {
-    it('should return null for && operator', () => {
-      const prop = extractProp('<div foo={bar && baz} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return null for || operator', () => {
-      const prop = extractProp('<div foo={bar || baz} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Member expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={bar.baz} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Call expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={bar()} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Unary expression', () => {
-    it('should correctly evaluate an expression that prefixes with -', () => {
-      const prop = extractProp('<div foo={-bar} />');
-
-      // -"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getLiteralPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with -', () => {
-      const prop = extractProp('<div foo={-42} />');
-
-      const expected = -42;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with +', () => {
-      const prop = extractProp('<div foo={+bar} />');
-
-      // +"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getLiteralPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with +', () => {
-      const prop = extractProp('<div foo={+42} />');
-
-      const expected = 42;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with !', () => {
-      const prop = extractProp('<div foo={!bar} />');
-
-      const expected = false; // !"bar" === false
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with ~', () => {
-      const prop = extractProp('<div foo={~bar} />');
-
-      const expected = -1; // ~"bar" === -1
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return true when evaluating `delete foo`', () => {
-      const prop = extractProp('<div foo={delete x} />');
-
-      const expected = true;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return undefined when evaluating `void foo`', () => {
-      const prop = extractProp('<div foo={void x} />');
-
-      const expected = undefined;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    // TODO: We should fix this to check to see if we can evaluate it.
-    it('should return undefined when evaluating `typeof foo`', () => {
-      const prop = extractProp('<div foo={typeof x} />');
-
-      const expected = undefined;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Update expression', () => {
-    it('should correctly evaluate an expression that prefixes with ++', () => {
-      const prop = extractProp('<div foo={++bar} />');
-
-      // ++"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getLiteralPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with --', () => {
-      const prop = extractProp('<div foo={--bar} />');
-
-      // --"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getLiteralPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that suffixes with ++', () => {
-      const prop = extractProp('<div foo={bar++} />');
-
-      // "bar"++ => NaN
-      const expected = true;
-      const actual = Number.isNaN(getLiteralPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that suffixes with --', () => {
-      const prop = extractProp('<div foo={bar--} />');
-
-      // "bar"-- => NaN
-      const expected = true;
-      const actual = Number.isNaN(getLiteralPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('This expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={this} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Conditional expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={bar ? baz : bam} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Binary expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={1 == "1"} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Object expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={ { bar: "baz" } } />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  describe('New expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={new Bar()} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  describe('Array expression', () => {
-    it('should evaluate to correct representation of the the array in props', () => {
-      const prop = extractProp('<div foo={["bar", 42, null]} />');
-
-      const expected = ['bar', 42];
-      const actual = getLiteralPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  it('should return an empty array provided an empty array in props', () => {
-    const prop = extractProp('<div foo={[]} />');
-
-    const expected = [];
-    const actual = getLiteralPropValue(prop);
-
-    assert.deepEqual(expected, actual);
-  });
-
-  describe('Bind expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={::this.handleClick} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  describeIfNotBabylon('Typescript', () => {
-    beforeEach(() => {
-      changePlugins(pls => [...pls, 'typescript']);
-    });
-
-    it('should return string representation of variable identifier wrapped in a Typescript non-null assertion', () => {
-      const prop = extractProp('<div foo={bar!} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string representation of variable identifier wrapped in a deep Typescript non-null assertion', () => {
-      const prop = extractProp('<div foo={(bar!)!} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string representation of variable identifier wrapped in a Typescript type coercion', () => {
-      changePlugins(pls => [...pls, 'typescript']);
-      const prop = extractProp('<div foo={bar as any} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-});
diff --git a/node_modules/jsx-ast-utils/__tests__/src/getPropLiteralValue-flowparser-test.js b/node_modules/jsx-ast-utils/__tests__/src/getPropLiteralValue-flowparser-test.js
deleted file mode 100644
index ad614e6..0000000
--- a/node_modules/jsx-ast-utils/__tests__/src/getPropLiteralValue-flowparser-test.js
+++ /dev/null
@@ -1,522 +0,0 @@
-/* eslint-env mocha */
-/* eslint no-template-curly-in-string: 0 */
-import assert from 'assert';
-import {
-  extractProp,
-  describeIfNotBabylon,
-  changePlugins,
-  setParserName,
-} from '../helper';
-import { getLiteralPropValue } from '../../src/getPropValue';
-
-describe('getLiteralPropValue', () => {
-  beforeEach(() => {
-    setParserName('flow');
-  });
-  it('should export a function', () => {
-    const expected = 'function';
-    const actual = typeof getLiteralPropValue;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return undefined when not provided with a JSXAttribute', () => {
-    const expected = undefined;
-    const actual = getLiteralPropValue(1);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should not throw error when trying to get value from unknown node type', () => {
-    const prop = {
-      type: 'JSXAttribute',
-      value: {
-        type: 'JSXExpressionContainer',
-      },
-    };
-    let counter = 0;
-    // eslint-disable-next-line no-console
-    const errorOrig = console.error;
-    // eslint-disable-next-line no-console
-    console.error = () => {
-      counter += 1;
-    };
-    let value;
-    assert.doesNotThrow(() => {
-      value = getLiteralPropValue(prop);
-    }, Error);
-
-    assert.equal(null, value);
-    assert.equal(counter, 1);
-    // eslint-disable-next-line no-console
-    console.error = errorOrig;
-  });
-
-  describe('Null', () => {
-    it('should return true when no value is given', () => {
-      const prop = extractProp('<div foo />');
-
-      const expected = true;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Literal', () => {
-    it('should return correct string if value is a string', () => {
-      const prop = extractProp('<div foo="bar" />');
-
-      const expected = 'bar';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return correct string if value is a string expression', () => {
-      const prop = extractProp('<div foo={"bar"} />');
-
-      const expected = 'bar';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return correct integer if value is a integer expression', () => {
-      const prop = extractProp('<div foo={1} />');
-
-      const expected = 1;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should convert "true" to boolean type', () => {
-      const prop = extractProp('<div foo="true" />');
-
-      const expected = true;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should convert "TrUE" to boolean type', () => {
-      const prop = extractProp('<div foo="TrUE" />');
-
-      const expected = true;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should convert "false" to boolean type', () => {
-      const prop = extractProp('<div foo="false" />');
-
-      const expected = false;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should convert "FaLsE" to boolean type', () => {
-      const prop = extractProp('<div foo="FaLsE" />');
-
-      const expected = false;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return String null when value is null', () => {
-      const prop = extractProp('<div foo={null} />');
-
-      const expected = 'null';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('JSXElement', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={<bar />} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Identifier', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={bar} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return undefined when identifier is literally `undefined`', () => {
-      const prop = extractProp('<div foo={undefined} />');
-
-      const expected = undefined;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Template literal', () => {
-    it('should return template literal with vars wrapped in curly braces', () => {
-      const prop = extractProp('<div foo={`bar ${baz}`} />');
-
-      const expected = 'bar {baz}';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string "undefined" for expressions that evaluate to undefined', () => {
-      const prop = extractProp('<div foo={`bar ${undefined}`} />');
-
-      const expected = 'bar undefined';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Tagged Template literal', () => {
-    it('should return template literal with vars wrapped in curly braces', () => {
-      const prop = extractProp('<div foo={noop`bar ${baz}`} />');
-
-      const expected = 'bar {baz}';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string "undefined" for expressions that evaluate to undefined', () => {
-      const prop = extractProp('<div foo={noop`bar ${undefined}`} />');
-
-      const expected = 'bar undefined';
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Arrow function expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={ () => { return "bar"; }} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Function expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={ function() { return "bar"; } } />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Logical expression', () => {
-    it('should return null for && operator', () => {
-      const prop = extractProp('<div foo={bar && baz} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return null for || operator', () => {
-      const prop = extractProp('<div foo={bar || baz} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Member expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={bar.baz} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Call expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={bar()} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Unary expression', () => {
-    it('should correctly evaluate an expression that prefixes with -', () => {
-      const prop = extractProp('<div foo={-bar} />');
-
-      // -"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getLiteralPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with -', () => {
-      const prop = extractProp('<div foo={-42} />');
-
-      const expected = -42;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with +', () => {
-      const prop = extractProp('<div foo={+bar} />');
-
-      // +"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getLiteralPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with +', () => {
-      const prop = extractProp('<div foo={+42} />');
-
-      const expected = 42;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with !', () => {
-      const prop = extractProp('<div foo={!bar} />');
-
-      const expected = false; // !"bar" === false
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with ~', () => {
-      const prop = extractProp('<div foo={~bar} />');
-
-      const expected = -1; // ~"bar" === -1
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return true when evaluating `delete foo`', () => {
-      const prop = extractProp('<div foo={delete x} />');
-
-      const expected = true;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return undefined when evaluating `void foo`', () => {
-      const prop = extractProp('<div foo={void x} />');
-
-      const expected = undefined;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    // TODO: We should fix this to check to see if we can evaluate it.
-    it('should return undefined when evaluating `typeof foo`', () => {
-      const prop = extractProp('<div foo={typeof x} />');
-
-      const expected = undefined;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Update expression', () => {
-    it('should correctly evaluate an expression that prefixes with ++', () => {
-      const prop = extractProp('<div foo={++bar} />');
-
-      // ++"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getLiteralPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with --', () => {
-      const prop = extractProp('<div foo={--bar} />');
-
-      // --"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getLiteralPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that suffixes with ++', () => {
-      const prop = extractProp('<div foo={bar++} />');
-
-      // "bar"++ => NaN
-      const expected = true;
-      const actual = Number.isNaN(getLiteralPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that suffixes with --', () => {
-      const prop = extractProp('<div foo={bar--} />');
-
-      // "bar"-- => NaN
-      const expected = true;
-      const actual = Number.isNaN(getLiteralPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('This expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={this} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Conditional expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={bar ? baz : bam} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Binary expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={1 == "1"} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Object expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={ { bar: "baz" } } />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  describe('New expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={new Bar()} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  describe('Array expression', () => {
-    it('should evaluate to correct representation of the the array in props', () => {
-      const prop = extractProp('<div foo={["bar", 42, null]} />');
-
-      const expected = ['bar', 42];
-      const actual = getLiteralPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  it('should return an empty array provided an empty array in props', () => {
-    const prop = extractProp('<div foo={[]} />');
-
-    const expected = [];
-    const actual = getLiteralPropValue(prop);
-
-    assert.deepEqual(expected, actual);
-  });
-
-  describe('Bind expression', () => {
-    it('should return null', () => {
-      const prop = extractProp('<div foo={::this.handleClick} />');
-
-      const expected = 'null';
-      const actual = getLiteralPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  describeIfNotBabylon('Typescript', () => {
-    beforeEach(() => {
-      changePlugins(pls => [...pls, 'typescript']);
-    });
-
-    it('should return string representation of variable identifier wrapped in a Typescript non-null assertion', () => {
-      const prop = extractProp('<div foo={bar!} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string representation of variable identifier wrapped in a deep Typescript non-null assertion', () => {
-      const prop = extractProp('<div foo={(bar!)!} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string representation of variable identifier wrapped in a Typescript type coercion', () => {
-      changePlugins(pls => [...pls, 'typescript']);
-      const prop = extractProp('<div foo={bar as any} />');
-
-      const expected = null;
-      const actual = getLiteralPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-});
diff --git a/node_modules/jsx-ast-utils/__tests__/src/getPropValue-babelparser-test.js b/node_modules/jsx-ast-utils/__tests__/src/getPropValue-babelparser-test.js
deleted file mode 100644
index 09d3d77..0000000
--- a/node_modules/jsx-ast-utils/__tests__/src/getPropValue-babelparser-test.js
+++ /dev/null
@@ -1,956 +0,0 @@
-/* eslint-env mocha */
-/* eslint no-template-curly-in-string: 0 */
-import assert from 'assert';
-import {
-  extractProp,
-  changePlugins,
-  fallbackToBabylon,
-  describeIfNotBabylon,
-  setParserName,
-} from '../helper';
-import getPropValue from '../../src/getPropValue';
-
-describe('getPropValue', () => {
-  beforeEach(() => {
-    setParserName('babel');
-  });
-  it('should export a function', () => {
-    const expected = 'function';
-    const actual = typeof getPropValue;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return undefined when not provided with a JSXAttribute', () => {
-    const expected = undefined;
-    const actual = getPropValue(1);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should not throw error when trying to get value from unknown node type', () => {
-    const prop = {
-      type: 'JSXAttribute',
-      value: {
-        type: 'JSXExpressionContainer',
-      },
-    };
-    let counter = 0;
-    // eslint-disable-next-line no-console
-    const errorOrig = console.error;
-    // eslint-disable-next-line no-console
-    console.error = () => {
-      counter += 1;
-    };
-    let value;
-    assert.doesNotThrow(() => {
-      value = getPropValue(prop);
-    }, Error);
-
-    assert.equal(null, value);
-    assert.equal(counter, 1);
-    // eslint-disable-next-line no-console
-    console.error = errorOrig;
-  });
-
-  describe('Null', () => {
-    it('should return true when no value is given', () => {
-      const prop = extractProp('<div foo />');
-
-      const expected = true;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Literal', () => {
-    it('should return correct string if value is a string', () => {
-      const prop = extractProp('<div foo="bar" />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return correct string if value is a string expression', () => {
-      const prop = extractProp('<div foo={"bar"} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return correct integer if value is a integer expression', () => {
-      const prop = extractProp('<div foo={1} />');
-
-      const expected = 1;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should convert "true" to boolean type', () => {
-      const prop = extractProp('<div foo="true" />');
-
-      const expected = true;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should convert "false" to boolean type', () => {
-      const prop = extractProp('<div foo="false" />');
-
-      const expected = false;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('JSXElement', () => {
-    it('should return correct representation of JSX element as a string', () => {
-      const prop = extractProp('<div foo={<bar />} />');
-
-      const expected = '<bar />';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Identifier', () => {
-    it('should return string representation of variable identifier', () => {
-      const prop = extractProp('<div foo={bar} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return undefined when identifier is literally `undefined`', () => {
-      const prop = extractProp('<div foo={undefined} />');
-
-      const expected = undefined;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return String object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={String} />');
-
-      const expected = String;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return Array object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={Array} />');
-
-      const expected = Array;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return Date object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={Date} />');
-
-      const expected = Date;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return Infinity object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={Infinity} />');
-
-      const expected = Infinity;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return Math object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={Math} />');
-
-      const expected = Math;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return Number object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={Number} />');
-
-      const expected = Number;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return Object object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={Object} />');
-
-      const expected = Object;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Template literal', () => {
-    it('should return template literal with vars wrapped in curly braces', () => {
-      const prop = extractProp('<div foo={`bar ${baz}`} />');
-
-      const expected = 'bar {baz}';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string "undefined" for expressions that evaluate to undefined', () => {
-      const prop = extractProp('<div foo={`bar ${undefined}`} />');
-
-      const expected = 'bar undefined';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return template literal with expression type wrapped in curly braces', () => {
-      const prop = extractProp('<div foo={`bar ${baz()}`} />');
-
-      const expected = 'bar {CallExpression}';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should ignore non-expressions in the template literal', () => {
-      const prop = extractProp('<div foo={`bar ${<baz />}`} />');
-
-      const expected = 'bar ';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Tagged Template literal', () => {
-    it('should return template literal with vars wrapped in curly braces', () => {
-      const prop = extractProp('<div foo={noop`bar ${baz}`} />');
-
-      const expected = 'bar {baz}';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string "undefined" for expressions that evaluate to undefined', () => {
-      const prop = extractProp('<div foo={noop`bar ${undefined}`} />');
-
-      const expected = 'bar undefined';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return template literal with expression type wrapped in curly braces', () => {
-      const prop = extractProp('<div foo={noop`bar ${baz()}`} />');
-
-      const expected = 'bar {CallExpression}';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should ignore non-expressions in the template literal', () => {
-      const prop = extractProp('<div foo={noop`bar ${<baz />}`} />');
-
-      const expected = 'bar ';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Arrow function expression', () => {
-    it('should return a function', () => {
-      const prop = extractProp('<div foo={ () => { return "bar"; }} />');
-
-      const expected = 'function';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, typeof actual);
-
-      // For code coverage ¯\_(ツ)_/¯
-      actual();
-    });
-    it('should handle ArrowFunctionExpression as conditional consequent', () => {
-      const prop = extractProp('<div foo={ (true) ? () => null : () => ({})} />');
-
-      const expected = 'function';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, typeof actual);
-
-      // For code coverage ¯\_(ツ)_/¯
-      actual();
-    });
-  });
-
-  describe('Function expression', () => {
-    it('should return a function', () => {
-      const prop = extractProp('<div foo={ function() { return "bar"; } } />');
-
-      const expected = 'function';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, typeof actual);
-
-      // For code coverage ¯\_(ツ)_/¯
-      actual();
-    });
-  });
-
-  describe('Logical expression', () => {
-    it('should correctly infer result of && logical expression based on derived values', () => {
-      const prop = extractProp('<div foo={bar && baz} />');
-
-      const expected = 'baz';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return undefined when evaluating `undefined && undefined` ', () => {
-      const prop = extractProp('<div foo={undefined && undefined} />');
-
-      const expected = undefined;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly infer result of || logical expression based on derived values', () => {
-      const prop = extractProp('<div foo={bar || baz} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly infer result of || logical expression based on derived values', () => {
-      const prop = extractProp('<div foo={undefined || baz} />');
-
-      const expected = 'baz';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return undefined when evaluating `undefined || undefined` ', () => {
-      const prop = extractProp('<div foo={undefined || undefined} />');
-
-      const expected = undefined;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Member expression', () => {
-    it('should return string representation of form `object.property`', () => {
-      const prop = extractProp('<div foo={bar.baz} />');
-
-      const expected = 'bar.baz';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate to a correct representation of member expression with a nullable member', () => {
-      const runTest = () => {
-        const prop = extractProp('<div foo={bar?.baz} />');
-
-        const expected = 'bar?.baz';
-        const actual = getPropValue(prop);
-
-        assert.equal(expected, actual);
-      };
-
-      if (fallbackToBabylon) {
-        // eslint-disable-next-line no-undef
-        expect(runTest).toThrow();
-      } else {
-        runTest();
-      }
-    });
-  });
-
-  describe('Call expression', () => {
-    it('should return string representation of callee', () => {
-      const prop = extractProp('<div foo={bar()} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string representation of callee', () => {
-      const prop = extractProp('<div foo={bar.call()} />');
-
-      const expected = 'bar.call';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Unary expression', () => {
-    it('should correctly evaluate an expression that prefixes with -', () => {
-      const prop = extractProp('<div foo={-bar} />');
-
-      // -"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with -', () => {
-      const prop = extractProp('<div foo={-42} />');
-
-      const expected = -42;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with +', () => {
-      const prop = extractProp('<div foo={+bar} />');
-
-      // +"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with +', () => {
-      const prop = extractProp('<div foo={+42} />');
-
-      const expected = 42;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with !', () => {
-      const prop = extractProp('<div foo={!bar} />');
-
-      const expected = false; // !"bar" === false
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with ~', () => {
-      const prop = extractProp('<div foo={~bar} />');
-
-      const expected = -1; // ~"bar" === -1
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return true when evaluating `delete foo`', () => {
-      const prop = extractProp('<div foo={delete x} />');
-
-      const expected = true;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return undefined when evaluating `void foo`', () => {
-      const prop = extractProp('<div foo={void x} />');
-
-      const expected = undefined;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    // TODO: We should fix this to check to see if we can evaluate it.
-    it('should return undefined when evaluating `typeof foo`', () => {
-      const prop = extractProp('<div foo={typeof x} />');
-
-      const expected = undefined;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Update expression', () => {
-    it('should correctly evaluate an expression that prefixes with ++', () => {
-      const prop = extractProp('<div foo={++bar} />');
-
-      // ++"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with --', () => {
-      const prop = extractProp('<div foo={--bar} />');
-
-      const expected = true;
-      const actual = Number.isNaN(getPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that suffixes with ++', () => {
-      const prop = extractProp('<div foo={bar++} />');
-
-      // "bar"++ => NaN
-      const expected = true;
-      const actual = Number.isNaN(getPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that suffixes with --', () => {
-      const prop = extractProp('<div foo={bar--} />');
-
-      const expected = true;
-      const actual = Number.isNaN(getPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('This expression', () => {
-    it('should return string value `this`', () => {
-      const prop = extractProp('<div foo={this} />');
-
-      const expected = 'this';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Conditional expression', () => {
-    it('should evaluate the conditional based on the derived values correctly', () => {
-      const prop = extractProp('<div foo={bar ? baz : bam} />');
-
-      const expected = 'baz';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the conditional based on the derived values correctly', () => {
-      const prop = extractProp('<div foo={undefined ? baz : bam} />');
-
-      const expected = 'bam';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the conditional based on the derived values correctly', () => {
-      const prop = extractProp('<div foo={(1 > 2) ? baz : bam} />');
-
-      const expected = 'bam';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Binary expression', () => {
-    it('should evaluate the `==` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 == "1"} />');
-      const falseProp = extractProp('<div foo={1 == bar} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `!=` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 != "2"} />');
-      const falseProp = extractProp('<div foo={1 != "1"} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `===` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 === 1} />');
-      const falseProp = extractProp('<div foo={1 === "1"} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `!==` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 !== "1"} />');
-      const falseProp = extractProp('<div foo={1 !== 1} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `<` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 < 2} />');
-      const falseProp = extractProp('<div foo={1 < 0} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `>` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 > 0} />');
-      const falseProp = extractProp('<div foo={1 > 2} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `<=` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 <= 1} />');
-      const falseProp = extractProp('<div foo={1 <= 0} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `>=` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 >= 1} />');
-      const falseProp = extractProp('<div foo={1 >= 2} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `<<` operator correctly', () => {
-      const prop = extractProp('<div foo={1 << 2} />');
-
-      const expected = 4;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `>>` operator correctly', () => {
-      const prop = extractProp('<div foo={1 >> 2} />');
-
-      const expected = 0;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `>>>` operator correctly', () => {
-      const prop = extractProp('<div foo={2 >>> 1} />');
-
-      const expected = 1;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `+` operator correctly', () => {
-      const prop = extractProp('<div foo={1 + 1} />');
-
-      const expected = 2;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `-` operator correctly', () => {
-      const prop = extractProp('<div foo={1 - 1} />');
-
-      const expected = 0;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `*` operator correctly', () => {
-      const prop = extractProp('<div foo={10 * 10} />');
-
-      const expected = 100;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `/` operator correctly', () => {
-      const prop = extractProp('<div foo={10 / 2} />');
-
-      const expected = 5;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `%` operator correctly', () => {
-      const prop = extractProp('<div foo={10 % 3} />');
-
-      const expected = 1;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `|` operator correctly', () => {
-      const prop = extractProp('<div foo={10 | 1} />');
-
-      const expected = 11;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `^` operator correctly', () => {
-      const prop = extractProp('<div foo={10 ^ 1} />');
-
-      const expected = 11;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `&` operator correctly', () => {
-      const prop = extractProp('<div foo={10 & 1} />');
-
-      const expected = 0;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `in` operator correctly', () => {
-      const prop = extractProp('<div foo={foo in bar} />');
-
-      const expected = false;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `instanceof` operator correctly', () => {
-      const prop = extractProp('<div foo={{} instanceof Object} />');
-
-      const expected = true;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `instanceof` operator when right side is not a function', () => {
-      const prop = extractProp('<div foo={"bar" instanceof Baz} />');
-
-      const expected = false;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Object expression', () => {
-    it('should evaluate to a correct representation of the object in props', () => {
-      const prop = extractProp('<div foo={ { bar: "baz" } } />');
-
-      const expected = { bar: 'baz' };
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-
-    it('should evaluate to a correct representation of the object, ignore spread properties', () => {
-      const prop = extractProp('<div foo={{bar: "baz", ...{baz: "bar", foo: {...{bar: "meh"}}}}} />');
-
-      const expected = { bar: 'baz', baz: 'bar', foo: { bar: 'meh' } };
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-
-    it('should evaluate to a correct representation of the object, ignore spread properties', () => {
-      const prop = extractProp('<div foo={{ pathname: manageRoute, state: {...data}}} />');
-
-      const expected = { pathname: 'manageRoute', state: {} };
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  describe('New expression', () => {
-    it('should return a new empty object', () => {
-      const prop = extractProp('<div foo={new Bar()} />');
-
-      const expected = {};
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  describe('Array expression', () => {
-    it('should evaluate to correct representation of the the array in props', () => {
-      const prop = extractProp('<div foo={["bar", 42, null]} />');
-
-      const expected = ['bar', 42, null];
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-
-    it('should evaluate to a correct representation of an array with spread elements', () => {
-      const prop = extractProp('<div foo={[...this.props.params, bar]} />');
-
-      const expected = [undefined, 'bar'];
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  it('should return an empty array provided an empty array in props', () => {
-    const prop = extractProp('<div foo={[]} />');
-
-    const expected = [];
-    const actual = getPropValue(prop);
-
-    assert.deepEqual(expected, actual);
-  });
-
-  describe('Bind expression', () => {
-    it('should return string representation of bind function call when object is null', () => {
-      const prop = extractProp('<div foo={::this.handleClick} />');
-
-      const expected = 'this.handleClick.bind(this)';
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-
-    it('should return string representation of bind function call when object is not null', () => {
-      const prop = extractProp('<div foo={foo::bar} />');
-
-      const expected = 'bar.bind(foo)';
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-
-    it('should return string representation of bind function call when binding to object properties', () => {
-      const prop = extractProp('<div foo={a.b::c} />');
-      const otherProp = extractProp('<div foo={::a.b.c} />');
-
-      const expected = 'a.b.c.bind(a.b)';
-      const actual = getPropValue(prop);
-
-      const otherExpected = 'a.b.c.bind(a.b)';
-      const otherActual = getPropValue(otherProp);
-
-      assert.deepEqual(expected, actual);
-      assert.deepEqual(otherExpected, otherActual);
-    });
-  });
-
-  describe('Type Cast Expression', () => {
-    it('should throw a parsing error', () => {
-      let counter = 0;
-      // eslint-disable-next-line no-console
-      const warnOrig = console.warn;
-      // eslint-disable-next-line no-console
-      console.warn = () => {
-        counter += 1;
-      };
-      // eslint-disable-next-line no-undef
-      expect(() => {
-        extractProp('<div foo={(this.handleClick: (event: MouseEvent) => void))} />');
-      }).toThrow();
-      assert.equal(counter, 1);
-      // eslint-disable-next-line no-console
-      console.warn = warnOrig;
-    });
-  });
-
-  describeIfNotBabylon('Typescript', () => {
-    beforeEach(() => {
-      changePlugins(pls => [...pls, 'typescript']);
-    });
-
-    it('should return string representation of variable identifier wrapped in a Typescript non-null assertion', () => {
-      const prop = extractProp('<div foo={bar!} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string representation of variable identifier wrapped in a deep Typescript non-null assertion', () => {
-      const prop = extractProp('<div foo={(bar!)!} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string representation of variable identifier wrapped in a Typescript type coercion', () => {
-      changePlugins(pls => [...pls, 'typescript']);
-      const prop = extractProp('<div foo={bar as any} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-});
diff --git a/node_modules/jsx-ast-utils/__tests__/src/getPropValue-flowparser-test.js b/node_modules/jsx-ast-utils/__tests__/src/getPropValue-flowparser-test.js
deleted file mode 100644
index 1bad965..0000000
--- a/node_modules/jsx-ast-utils/__tests__/src/getPropValue-flowparser-test.js
+++ /dev/null
@@ -1,938 +0,0 @@
-/* eslint-env mocha */
-/* eslint no-template-curly-in-string: 0 */
-import assert from 'assert';
-import {
-  extractProp,
-  changePlugins,
-  describeIfNotBabylon,
-  setParserName,
-} from '../helper';
-import getPropValue from '../../src/getPropValue';
-
-describe('getPropValue', () => {
-  beforeEach(() => {
-    setParserName('flow');
-  });
-  it('should export a function', () => {
-    const expected = 'function';
-    const actual = typeof getPropValue;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return undefined when not provided with a JSXAttribute', () => {
-    const expected = undefined;
-    const actual = getPropValue(1);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should throw not error when trying to get value from unknown node type', () => {
-    const prop = {
-      type: 'JSXAttribute',
-      value: {
-        type: 'JSXExpressionContainer',
-      },
-    };
-    let counter = 0;
-    // eslint-disable-next-line no-console
-    const errorOrig = console.error;
-    // eslint-disable-next-line no-console
-    console.error = () => {
-      counter += 1;
-    };
-    let value;
-    assert.doesNotThrow(() => {
-      value = getPropValue(prop);
-    }, Error);
-
-    assert.equal(null, value);
-    assert.equal(counter, 1);
-    // eslint-disable-next-line no-console
-    console.error = errorOrig;
-  });
-
-  describe('Null', () => {
-    it('should return true when no value is given', () => {
-      const prop = extractProp('<div foo />');
-
-      const expected = true;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Literal', () => {
-    it('should return correct string if value is a string', () => {
-      const prop = extractProp('<div foo="bar" />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return correct string if value is a string expression', () => {
-      const prop = extractProp('<div foo={"bar"} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return correct integer if value is a integer expression', () => {
-      const prop = extractProp('<div foo={1} />');
-
-      const expected = 1;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should convert "true" to boolean type', () => {
-      const prop = extractProp('<div foo="true" />');
-
-      const expected = true;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should convert "false" to boolean type', () => {
-      const prop = extractProp('<div foo="false" />');
-
-      const expected = false;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('JSXElement', () => {
-    it('should return correct representation of JSX element as a string', () => {
-      const prop = extractProp('<div foo={<bar />} />');
-
-      const expected = '<bar />';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Identifier', () => {
-    it('should return string representation of variable identifier', () => {
-      const prop = extractProp('<div foo={bar} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return undefined when identifier is literally `undefined`', () => {
-      const prop = extractProp('<div foo={undefined} />');
-
-      const expected = undefined;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return String object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={String} />');
-
-      const expected = String;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return Array object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={Array} />');
-
-      const expected = Array;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return Date object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={Date} />');
-
-      const expected = Date;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return Infinity object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={Infinity} />');
-
-      const expected = Infinity;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return Math object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={Math} />');
-
-      const expected = Math;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return Number object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={Number} />');
-
-      const expected = Number;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return Object object when using a reserved JavaScript object', () => {
-      const prop = extractProp('<div foo={Object} />');
-
-      const expected = Object;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Template literal', () => {
-    it('should return template literal with vars wrapped in curly braces', () => {
-      const prop = extractProp('<div foo={`bar ${baz}`} />');
-
-      const expected = 'bar {baz}';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string "undefined" for expressions that evaluate to undefined', () => {
-      const prop = extractProp('<div foo={`bar ${undefined}`} />');
-
-      const expected = 'bar undefined';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return template literal with expression type wrapped in curly braces', () => {
-      const prop = extractProp('<div foo={`bar ${baz()}`} />');
-
-      const expected = 'bar {CallExpression}';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should ignore non-expressions in the template literal', () => {
-      const prop = extractProp('<div foo={`bar ${<baz />}`} />');
-
-      const expected = 'bar ';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Tagged Template literal', () => {
-    it('should return template literal with vars wrapped in curly braces', () => {
-      const prop = extractProp('<div foo={noop`bar ${baz}`} />');
-
-      const expected = 'bar {baz}';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string "undefined" for expressions that evaluate to undefined', () => {
-      const prop = extractProp('<div foo={noop`bar ${undefined}`} />');
-
-      const expected = 'bar undefined';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return template literal with expression type wrapped in curly braces', () => {
-      const prop = extractProp('<div foo={noop`bar ${baz()}`} />');
-
-      const expected = 'bar {CallExpression}';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should ignore non-expressions in the template literal', () => {
-      const prop = extractProp('<div foo={noop`bar ${<baz />}`} />');
-
-      const expected = 'bar ';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Arrow function expression', () => {
-    it('should return a function', () => {
-      const prop = extractProp('<div foo={ () => { return "bar"; }} />');
-
-      const expected = 'function';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, typeof actual);
-
-      // For code coverage ¯\_(ツ)_/¯
-      actual();
-    });
-    it('should handle ArrowFunctionExpression as conditional consequent', () => {
-      const prop = extractProp('<div foo={ (true) ? () => null : () => ({})} />');
-
-      const expected = 'function';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, typeof actual);
-
-      // For code coverage ¯\_(ツ)_/¯
-      actual();
-    });
-  });
-
-  describe('Function expression', () => {
-    it('should return a function', () => {
-      const prop = extractProp('<div foo={ function() { return "bar"; } } />');
-
-      const expected = 'function';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, typeof actual);
-
-      // For code coverage ¯\_(ツ)_/¯
-      actual();
-    });
-  });
-
-  describe('Logical expression', () => {
-    it('should correctly infer result of && logical expression based on derived values', () => {
-      const prop = extractProp('<div foo={bar && baz} />');
-
-      const expected = 'baz';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return undefined when evaluating `undefined && undefined` ', () => {
-      const prop = extractProp('<div foo={undefined && undefined} />');
-
-      const expected = undefined;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly infer result of || logical expression based on derived values', () => {
-      const prop = extractProp('<div foo={bar || baz} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly infer result of || logical expression based on derived values', () => {
-      const prop = extractProp('<div foo={undefined || baz} />');
-
-      const expected = 'baz';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return undefined when evaluating `undefined || undefined` ', () => {
-      const prop = extractProp('<div foo={undefined || undefined} />');
-
-      const expected = undefined;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Member expression', () => {
-    it('should return string representation of form `object.property`', () => {
-      const prop = extractProp('<div foo={bar.baz} />');
-
-      const expected = 'bar.baz';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate to a correct representation of member expression with a nullable member', () => {
-      const prop = extractProp('<div foo={bar?.baz} />');
-
-      const expected = 'bar?.baz';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Call expression', () => {
-    it('should return string representation of callee', () => {
-      const prop = extractProp('<div foo={bar()} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string representation of callee', () => {
-      const prop = extractProp('<div foo={bar.call()} />');
-
-      const expected = 'bar.call';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Unary expression', () => {
-    it('should correctly evaluate an expression that prefixes with -', () => {
-      const prop = extractProp('<div foo={-bar} />');
-
-      // -"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with -', () => {
-      const prop = extractProp('<div foo={-42} />');
-
-      const expected = -42;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with +', () => {
-      const prop = extractProp('<div foo={+bar} />');
-
-      // +"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with +', () => {
-      const prop = extractProp('<div foo={+42} />');
-
-      const expected = 42;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with !', () => {
-      const prop = extractProp('<div foo={!bar} />');
-
-      const expected = false; // !"bar" === false
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with ~', () => {
-      const prop = extractProp('<div foo={~bar} />');
-
-      const expected = -1; // ~"bar" === -1
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return true when evaluating `delete foo`', () => {
-      const prop = extractProp('<div foo={delete x} />');
-
-      const expected = true;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return undefined when evaluating `void foo`', () => {
-      const prop = extractProp('<div foo={void x} />');
-
-      const expected = undefined;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    // TODO: We should fix this to check to see if we can evaluate it.
-    it('should return undefined when evaluating `typeof foo`', () => {
-      const prop = extractProp('<div foo={typeof x} />');
-
-      const expected = undefined;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Update expression', () => {
-    it('should correctly evaluate an expression that prefixes with ++', () => {
-      const prop = extractProp('<div foo={++bar} />');
-
-      // ++"bar" => NaN
-      const expected = true;
-      const actual = Number.isNaN(getPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that prefixes with --', () => {
-      const prop = extractProp('<div foo={--bar} />');
-
-      const expected = true;
-      const actual = Number.isNaN(getPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that suffixes with ++', () => {
-      const prop = extractProp('<div foo={bar++} />');
-
-      // "bar"++ => NaN
-      const expected = true;
-      const actual = Number.isNaN(getPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-
-    it('should correctly evaluate an expression that suffixes with --', () => {
-      const prop = extractProp('<div foo={bar--} />');
-
-      const expected = true;
-      const actual = Number.isNaN(getPropValue(prop));
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('This expression', () => {
-    it('should return string value `this`', () => {
-      const prop = extractProp('<div foo={this} />');
-
-      const expected = 'this';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Conditional expression', () => {
-    it('should evaluate the conditional based on the derived values correctly', () => {
-      const prop = extractProp('<div foo={bar ? baz : bam} />');
-
-      const expected = 'baz';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the conditional based on the derived values correctly', () => {
-      const prop = extractProp('<div foo={undefined ? baz : bam} />');
-
-      const expected = 'bam';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the conditional based on the derived values correctly', () => {
-      const prop = extractProp('<div foo={(1 > 2) ? baz : bam} />');
-
-      const expected = 'bam';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Binary expression', () => {
-    it('should evaluate the `==` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 == "1"} />');
-      const falseProp = extractProp('<div foo={1 == bar} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `!=` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 != "2"} />');
-      const falseProp = extractProp('<div foo={1 != "1"} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `===` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 === 1} />');
-      const falseProp = extractProp('<div foo={1 === "1"} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `!==` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 !== "1"} />');
-      const falseProp = extractProp('<div foo={1 !== 1} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `<` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 < 2} />');
-      const falseProp = extractProp('<div foo={1 < 0} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `>` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 > 0} />');
-      const falseProp = extractProp('<div foo={1 > 2} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `<=` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 <= 1} />');
-      const falseProp = extractProp('<div foo={1 <= 0} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `>=` operator correctly', () => {
-      const trueProp = extractProp('<div foo={1 >= 1} />');
-      const falseProp = extractProp('<div foo={1 >= 2} />');
-
-      const trueVal = getPropValue(trueProp);
-      const falseVal = getPropValue(falseProp);
-
-      assert.equal(true, trueVal);
-      assert.equal(false, falseVal);
-    });
-
-    it('should evaluate the `<<` operator correctly', () => {
-      const prop = extractProp('<div foo={1 << 2} />');
-
-      const expected = 4;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `>>` operator correctly', () => {
-      const prop = extractProp('<div foo={1 >> 2} />');
-
-      const expected = 0;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `>>>` operator correctly', () => {
-      const prop = extractProp('<div foo={2 >>> 1} />');
-
-      const expected = 1;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `+` operator correctly', () => {
-      const prop = extractProp('<div foo={1 + 1} />');
-
-      const expected = 2;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `-` operator correctly', () => {
-      const prop = extractProp('<div foo={1 - 1} />');
-
-      const expected = 0;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `*` operator correctly', () => {
-      const prop = extractProp('<div foo={10 * 10} />');
-
-      const expected = 100;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `/` operator correctly', () => {
-      const prop = extractProp('<div foo={10 / 2} />');
-
-      const expected = 5;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `%` operator correctly', () => {
-      const prop = extractProp('<div foo={10 % 3} />');
-
-      const expected = 1;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `|` operator correctly', () => {
-      const prop = extractProp('<div foo={10 | 1} />');
-
-      const expected = 11;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `^` operator correctly', () => {
-      const prop = extractProp('<div foo={10 ^ 1} />');
-
-      const expected = 11;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `&` operator correctly', () => {
-      const prop = extractProp('<div foo={10 & 1} />');
-
-      const expected = 0;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `in` operator correctly', () => {
-      const prop = extractProp('<div foo={foo in bar} />');
-
-      const expected = false;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `instanceof` operator correctly', () => {
-      const prop = extractProp('<div foo={{} instanceof Object} />');
-
-      const expected = true;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should evaluate the `instanceof` operator when right side is not a function', () => {
-      const prop = extractProp('<div foo={"bar" instanceof Baz} />');
-
-      const expected = false;
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-
-  describe('Object expression', () => {
-    it('should evaluate to a correct representation of the object in props', () => {
-      const prop = extractProp('<div foo={ { bar: "baz" } } />');
-
-      const expected = { bar: 'baz' };
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-
-    it('should evaluate to a correct representation of the object, ignore spread properties', () => {
-      const prop = extractProp('<div foo={{bar: "baz", ...{baz: "bar", foo: {...{bar: "meh"}}}}} />');
-
-      const expected = { bar: 'baz', baz: 'bar', foo: { bar: 'meh' } };
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-
-    it('should evaluate to a correct representation of the object, ignore spread properties', () => {
-      const prop = extractProp('<div foo={{ pathname: manageRoute, state: {...data}}} />');
-
-      const expected = { pathname: 'manageRoute', state: {} };
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  describe('New expression', () => {
-    it('should return a new empty object', () => {
-      const prop = extractProp('<div foo={new Bar()} />');
-
-      const expected = {};
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  describe('Array expression', () => {
-    it('should evaluate to correct representation of the the array in props', () => {
-      const prop = extractProp('<div foo={["bar", 42, null]} />');
-
-      const expected = ['bar', 42, null];
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-
-    it('should evaluate to a correct representation of an array with spread elements', () => {
-      const prop = extractProp('<div foo={[...this.props.params, bar]} />');
-
-      const expected = [undefined, 'bar'];
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  it('should return an empty array provided an empty array in props', () => {
-    const prop = extractProp('<div foo={[]} />');
-
-    const expected = [];
-    const actual = getPropValue(prop);
-
-    assert.deepEqual(expected, actual);
-  });
-
-  describe('Bind expression', () => {
-    it('should return string representation of bind function call when object is null', () => {
-      const prop = extractProp('<div foo={::this.handleClick} />');
-
-      const expected = null;
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(actual, expected);
-    });
-
-    it('should return string representation of bind function call when object is not null', () => {
-      const prop = extractProp('<div foo={foo::bar} />');
-
-      const expected = 'foo';
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(actual, expected);
-    });
-
-    it('should return string representation of bind function call when binding to object properties', () => {
-      const prop = extractProp('<div foo={a.b::c} />');
-      const otherProp = extractProp('<div foo={::a.b.c} />');
-
-      const expected = 'a.b';
-      const actual = getPropValue(prop);
-
-      const otherExpected = null;
-      const otherActual = getPropValue(otherProp);
-
-      assert.deepEqual(actual, expected);
-      assert.deepEqual(otherActual, otherExpected);
-    });
-  });
-
-  describe('Type Cast Expression', () => {
-    it('should return the expression from a type cast', () => {
-      const prop = extractProp('<div foo={(this.handleClick: (event: MouseEvent) => void))} />');
-
-      const expected = 'this.handleClick';
-      const actual = getPropValue(prop);
-
-      assert.deepEqual(expected, actual);
-    });
-  });
-
-  describeIfNotBabylon('Typescript', () => {
-    beforeEach(() => {
-      changePlugins(pls => [...pls, 'typescript']);
-    });
-
-    it('should return string representation of variable identifier wrapped in a Typescript non-null assertion', () => {
-      const prop = extractProp('<div foo={bar!} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string representation of variable identifier wrapped in a deep Typescript non-null assertion', () => {
-      const prop = extractProp('<div foo={(bar!)!} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-
-    it('should return string representation of variable identifier wrapped in a Typescript type coercion', () => {
-      changePlugins(pls => [...pls, 'typescript']);
-      const prop = extractProp('<div foo={bar as any} />');
-
-      const expected = 'bar';
-      const actual = getPropValue(prop);
-
-      assert.equal(expected, actual);
-    });
-  });
-});
diff --git a/node_modules/jsx-ast-utils/__tests__/src/hasProp-test.js b/node_modules/jsx-ast-utils/__tests__/src/hasProp-test.js
deleted file mode 100644
index e759322..0000000
--- a/node_modules/jsx-ast-utils/__tests__/src/hasProp-test.js
+++ /dev/null
@@ -1,412 +0,0 @@
-/* eslint-env mocha */
-import assert from 'assert';
-import { getOpeningElement, setParserName } from '../helper';
-import hasProp, { hasAnyProp, hasEveryProp } from '../../src/hasProp';
-
-describe('hasProp', () => {
-  beforeEach(() => {
-    setParserName('babel');
-  });
-  it('should export a function', () => {
-    const expected = 'function';
-    const actual = typeof hasProp;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if no arguments are provided', () => {
-    const expected = false;
-    const actual = hasProp();
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if the prop is absent', () => {
-    const code = '<div />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-
-    const expected = false;
-    const actual = hasProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if the prop exists', () => {
-    const code = '<div id="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-
-    const expected = true;
-    const actual = hasProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if the prop may exist in spread loose mode', () => {
-    const code = '<div {...props} />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-    const options = {
-      spreadStrict: false,
-    };
-
-    const expected = true;
-    const actual = hasProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if the prop is considered absent in case-sensitive mode', () => {
-    const code = '<div ID="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-    const options = {
-      ignoreCase: false,
-    };
-
-    const expected = false;
-    const actual = hasProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-});
-
-describe('hasAnyProp tests', () => {
-  it('should export a function', () => {
-    const expected = 'function';
-    const actual = typeof hasAnyProp;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if no arguments are provided', () => {
-    const expected = false;
-    const actual = hasAnyProp();
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if the prop is absent', () => {
-    const code = '<div />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-
-    const expected = false;
-    const actual = hasAnyProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if all props are absent in array', () => {
-    const code = '<div />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const propsToCheck = ['id', 'className'];
-
-    const expected = false;
-    const actual = hasAnyProp(props, propsToCheck);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if all props are absent in space delimited string', () => {
-    const code = '<div />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const propsToCheck = 'id className';
-
-    const expected = false;
-    const actual = hasAnyProp(props, propsToCheck);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if the prop exists', () => {
-    const code = '<div id="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-
-    const expected = true;
-    const actual = hasAnyProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if any prop exists in array', () => {
-    const code = '<div id="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = ['className', 'id'];
-
-    const expected = true;
-    const actual = hasAnyProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if any prop exists in space delimited string', () => {
-    const code = '<div id="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'className id';
-
-    const expected = true;
-    const actual = hasAnyProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if the prop may exist in spread loose mode', () => {
-    const code = '<div {...props} />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-    const options = {
-      spreadStrict: false,
-    };
-
-    const expected = true;
-    const actual = hasAnyProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if any prop may exist in spread loose mode', () => {
-    const code = '<div {...props} />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = ['id', 'className'];
-    const options = {
-      spreadStrict: false,
-    };
-
-    const expected = true;
-    const actual = hasAnyProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if the prop is considered absent in case-sensitive mode', () => {
-    const code = '<div ID="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-    const options = {
-      ignoreCase: false,
-    };
-
-    const expected = false;
-    const actual = hasAnyProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if all props are considered absent in case-sensitive mode', () => {
-    const code = '<div ID="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = ['id', 'iD', 'className'];
-    const options = {
-      ignoreCase: false,
-    };
-
-    const expected = false;
-    const actual = hasAnyProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-});
-
-describe('hasEveryProp tests', () => {
-  it('should export a function', () => {
-    const expected = 'function';
-    const actual = typeof hasEveryProp;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if no arguments are provided', () => {
-    const expected = true;
-    const actual = hasEveryProp();
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if the prop is absent', () => {
-    const code = '<div />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-
-    const expected = false;
-    const actual = hasEveryProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if any props are absent in array', () => {
-    const code = '<div id="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const propsToCheck = ['id', 'className'];
-
-    const expected = false;
-    const actual = hasEveryProp(props, propsToCheck);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if all props are absent in array', () => {
-    const code = '<div />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const propsToCheck = ['id', 'className'];
-
-    const expected = false;
-    const actual = hasEveryProp(props, propsToCheck);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if any props are absent in space delimited string', () => {
-    const code = '<div id="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const propsToCheck = 'id className';
-
-    const expected = false;
-    const actual = hasEveryProp(props, propsToCheck);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if all props are absent in space delimited string', () => {
-    const code = '<div />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const propsToCheck = 'id className';
-
-    const expected = false;
-    const actual = hasEveryProp(props, propsToCheck);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if the prop exists', () => {
-    const code = '<div id="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-
-    const expected = true;
-    const actual = hasEveryProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if all props exist in array', () => {
-    const code = '<div id="foo" className="box" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = ['className', 'id'];
-
-    const expected = true;
-    const actual = hasEveryProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if all props exist in space delimited string', () => {
-    const code = '<div id="foo" className="box" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'className id';
-
-    const expected = true;
-    const actual = hasEveryProp(props, prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if the props may exist in spread loose mode', () => {
-    const code = '<div {...props} />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-    const options = {
-      spreadStrict: false,
-    };
-
-    const expected = true;
-    const actual = hasEveryProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if all props may exist in spread loose mode', () => {
-    const code = '<div {...props} />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = ['id', 'className'];
-    const options = {
-      spreadStrict: false,
-    };
-
-    const expected = true;
-    const actual = hasEveryProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if the prop is considered absent in case-sensitive mode', () => {
-    const code = '<div ID="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = 'id';
-    const options = {
-      ignoreCase: false,
-    };
-
-    const expected = false;
-    const actual = hasEveryProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return false if all props are considered absent in case-sensitive mode', () => {
-    const code = '<div ID="foo" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = ['id', 'iD', 'className'];
-    const options = {
-      ignoreCase: false,
-    };
-
-    const expected = false;
-    const actual = hasEveryProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return true if all props are considered present in case-sensitive mode', () => {
-    const code = '<div ID="foo" className="box" />';
-    const node = getOpeningElement(code);
-    const { attributes: props } = node;
-    const prop = ['ID', 'className'];
-    const options = {
-      ignoreCase: false,
-    };
-
-    const expected = true;
-    const actual = hasEveryProp(props, prop, options);
-
-    assert.equal(expected, actual);
-  });
-});
diff --git a/node_modules/jsx-ast-utils/__tests__/src/index-test.js b/node_modules/jsx-ast-utils/__tests__/src/index-test.js
deleted file mode 100644
index a9b7417..0000000
--- a/node_modules/jsx-ast-utils/__tests__/src/index-test.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/* eslint-env mocha */
-import fs from 'fs';
-import path from 'path';
-import assert from 'assert';
-import core from '../../src/index';
-
-const src = fs.readdirSync(path.resolve(__dirname, '../../src'))
-  .filter(f => f.indexOf('.js') >= 0)
-  .map(f => path.basename(f, '.js'));
-
-describe('main export', () => {
-  it('should export an object', () => {
-    const expected = 'object';
-    const actual = typeof core;
-
-    assert.equal(expected, actual);
-  });
-
-  src.filter(f => f !== 'index').forEach((f) => {
-    it(`should export ${f}`, () => {
-      assert.equal(
-        core[f],
-        require(path.join('../../src/', f)).default // eslint-disable-line
-      );
-    });
-
-    it(`should export ${f} from root`, () => {
-      const file = `${f}.js`;
-      const expected = true;
-      const actual = fs.statSync(path.join(path.resolve('.'), file)).isFile();
-
-      assert.equal(expected, actual);
-    });
-  });
-});
diff --git a/node_modules/jsx-ast-utils/__tests__/src/propName-test.js b/node_modules/jsx-ast-utils/__tests__/src/propName-test.js
deleted file mode 100644
index f90856c..0000000
--- a/node_modules/jsx-ast-utils/__tests__/src/propName-test.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* eslint-env mocha */
-import assert from 'assert';
-import { extractProp, setParserName } from '../helper';
-import propName from '../../src/propName';
-
-describe('propName', () => {
-  beforeEach(() => {
-    setParserName('babel');
-  });
-  it('should export a function', () => {
-    const expected = 'function';
-    const actual = typeof propName;
-
-    assert.equal(expected, actual);
-  });
-
-  it('should throw an error if the argument is missing', () => {
-    assert.throws(() => { propName(); }, Error);
-  });
-
-  it('should throw an error if the argument not a JSX node', () => {
-    assert.throws(() => { propName({ a: 'foo' }); }, Error);
-  });
-
-  it('should return correct name for normal prop', () => {
-    const prop = extractProp('<div foo="bar" />');
-
-    const expected = 'foo';
-    const actual = propName(prop);
-
-    assert.equal(expected, actual);
-  });
-
-  it('should return correct name for namespaced prop', () => {
-    const prop = extractProp('<div foo:bar="baz" />', 'foo:bar');
-
-    const expected = 'foo:bar';
-    const actual = propName(prop);
-
-    assert.equal(expected, actual);
-  });
-});
diff --git a/node_modules/jsx-ast-utils/elementType.js b/node_modules/jsx-ast-utils/elementType.js
deleted file mode 100644
index 96873ac..0000000
--- a/node_modules/jsx-ast-utils/elementType.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib').elementType; // eslint-disable-line import/no-unresolved
diff --git a/node_modules/jsx-ast-utils/eventHandlers.js b/node_modules/jsx-ast-utils/eventHandlers.js
deleted file mode 100644
index b5d7f62..0000000
--- a/node_modules/jsx-ast-utils/eventHandlers.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib').eventHandlers; // eslint-disable-line import/no-unresolved
diff --git a/node_modules/jsx-ast-utils/eventHandlersByType.js b/node_modules/jsx-ast-utils/eventHandlersByType.js
deleted file mode 100644
index b7a0c42..0000000
--- a/node_modules/jsx-ast-utils/eventHandlersByType.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib').eventHandlersByType; // eslint-disable-line import/no-unresolved
diff --git a/node_modules/jsx-ast-utils/getLiteralPropValue.js b/node_modules/jsx-ast-utils/getLiteralPropValue.js
deleted file mode 100644
index efc5c8d..0000000
--- a/node_modules/jsx-ast-utils/getLiteralPropValue.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib').getLiteralPropValue; // eslint-disable-line import/no-unresolved
diff --git a/node_modules/jsx-ast-utils/getProp.js b/node_modules/jsx-ast-utils/getProp.js
deleted file mode 100644
index e523c2c..0000000
--- a/node_modules/jsx-ast-utils/getProp.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib').getProp; // eslint-disable-line import/no-unresolved
diff --git a/node_modules/jsx-ast-utils/getPropValue.js b/node_modules/jsx-ast-utils/getPropValue.js
deleted file mode 100644
index 883a37c..0000000
--- a/node_modules/jsx-ast-utils/getPropValue.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib').getPropValue; // eslint-disable-line import/no-unresolved
diff --git a/node_modules/jsx-ast-utils/hasAnyProp.js b/node_modules/jsx-ast-utils/hasAnyProp.js
deleted file mode 100644
index 2a88420..0000000
--- a/node_modules/jsx-ast-utils/hasAnyProp.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib').hasAnyProp; // eslint-disable-line import/no-unresolved
diff --git a/node_modules/jsx-ast-utils/hasEveryProp.js b/node_modules/jsx-ast-utils/hasEveryProp.js
deleted file mode 100644
index 338f569..0000000
--- a/node_modules/jsx-ast-utils/hasEveryProp.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib').hasEveryProp; // eslint-disable-line import/no-unresolved
diff --git a/node_modules/jsx-ast-utils/hasProp.js b/node_modules/jsx-ast-utils/hasProp.js
deleted file mode 100644
index 0f1cd04..0000000
--- a/node_modules/jsx-ast-utils/hasProp.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib').hasProp; // eslint-disable-line import/no-unresolved
diff --git a/node_modules/jsx-ast-utils/lib/elementType.js b/node_modules/jsx-ast-utils/lib/elementType.js
deleted file mode 100644
index c346e7e..0000000
--- a/node_modules/jsx-ast-utils/lib/elementType.js
+++ /dev/null
@@ -1,44 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = elementType;
-function resolveMemberExpressions() {
-  var object = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-  var property = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
-
-  if (object.type === 'JSXMemberExpression') {
-    return resolveMemberExpressions(object.object, object.property) + '.' + property.name;
-  }
-
-  return object.name + '.' + property.name;
-}
-
-/**
- * Returns the tagName associated with a JSXElement.
- */
-function elementType() {
-  var node = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-  var name = node.name;
-
-
-  if (!name) {
-    throw new Error('The argument provided is not a JSXElement node.');
-  }
-
-  if (name.type === 'JSXMemberExpression') {
-    var _name$object = name.object,
-        object = _name$object === undefined ? {} : _name$object,
-        _name$property = name.property,
-        property = _name$property === undefined ? {} : _name$property;
-
-    return resolveMemberExpressions(object, property);
-  }
-
-  if (name.type === 'JSXNamespacedName') {
-    return name.namespace.name + ':' + name.name.name;
-  }
-
-  return node.name.name;
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/eventHandlers.js b/node_modules/jsx-ast-utils/lib/eventHandlers.js
deleted file mode 100644
index 7c5c205..0000000
--- a/node_modules/jsx-ast-utils/lib/eventHandlers.js
+++ /dev/null
@@ -1,33 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-/**
- * Common event handlers for JSX element event binding.
- */
-
-var eventHandlersByType = {
-  clipboard: ['onCopy', 'onCut', 'onPaste'],
-  composition: ['onCompositionEnd', 'onCompositionStart', 'onCompositionUpdate'],
-  keyboard: ['onKeyDown', 'onKeyPress', 'onKeyUp'],
-  focus: ['onFocus', 'onBlur'],
-  form: ['onChange', 'onInput', 'onSubmit'],
-  mouse: ['onClick', 'onContextMenu', 'onDblClick', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragExit', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp'],
-  selection: ['onSelect'],
-  touch: ['onTouchCancel', 'onTouchEnd', 'onTouchMove', 'onTouchStart'],
-  ui: ['onScroll'],
-  wheel: ['onWheel'],
-  media: ['onAbort', 'onCanPlay', 'onCanPlayThrough', 'onDurationChange', 'onEmptied', 'onEncrypted', 'onEnded', 'onError', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onSeeked', 'onSeeking', 'onStalled', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting'],
-  image: ['onLoad', 'onError'],
-  animation: ['onAnimationStart', 'onAnimationEnd', 'onAnimationIteration'],
-  transition: ['onTransitionEnd']
-};
-
-var eventHandlers = Object.keys(eventHandlersByType).reduce(function (accumulator, type) {
-  return accumulator.concat(eventHandlersByType[type]);
-}, []);
-
-exports.default = eventHandlers;
-exports.eventHandlersByType = eventHandlersByType;
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/getProp.js b/node_modules/jsx-ast-utils/lib/getProp.js
deleted file mode 100644
index a5e9d1e..0000000
--- a/node_modules/jsx-ast-utils/lib/getProp.js
+++ /dev/null
@@ -1,88 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-exports.default = getProp;
-
-var _propName = require('./propName');
-
-var _propName2 = _interopRequireDefault(_propName);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var DEFAULT_OPTIONS = {
-  ignoreCase: true
-};
-
-/**
- * Returns the JSXAttribute itself or undefined, indicating the prop
- * is not present on the JSXOpeningElement.
- *
- */
-function getProp() {
-  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
-  var prop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
-  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_OPTIONS;
-
-  function getName(name) {
-    return options.ignoreCase ? name.toUpperCase() : name;
-  }
-  var propToFind = getName(prop);
-  function isPropToFind(property) {
-    return property.type === 'Property' && property.key.type === 'Identifier' && propToFind === getName(property.key.name);
-  }
-
-  var foundAttribute = props.find(function (attribute) {
-    // If the props contain a spread prop, try to find the property in the object expression.
-    if (attribute.type === 'JSXSpreadAttribute') {
-      return attribute.argument.type === 'ObjectExpression' && propToFind !== getName('key') // https://github.com/reactjs/rfcs/pull/107
-      && attribute.argument.properties.some(isPropToFind);
-    }
-
-    return propToFind === getName((0, _propName2.default)(attribute));
-  });
-
-  if (foundAttribute && foundAttribute.type === 'JSXSpreadAttribute') {
-    return propertyToJSXAttribute(foundAttribute.argument.properties.find(isPropToFind));
-  }
-
-  return foundAttribute;
-}
-
-function propertyToJSXAttribute(node) {
-  var key = node.key,
-      value = node.value;
-
-  return _extends({
-    type: 'JSXAttribute',
-    name: _extends({ type: 'JSXIdentifier', name: key.name }, getBaseProps(key)),
-    value: value.type === 'Literal' ? value : _extends({ type: 'JSXExpressionContainer', expression: value }, getBaseProps(value))
-  }, getBaseProps(node));
-}
-
-function getBaseProps(_ref) {
-  var start = _ref.start,
-      end = _ref.end,
-      loc = _ref.loc,
-      range = _ref.range;
-
-  return _extends({
-    loc: getBaseLocation(loc)
-  }, start !== undefined ? { start: start } : {}, end !== undefined ? { end: end } : {}, range !== undefined ? { range: range } : {});
-}
-
-function getBaseLocation(_ref2) {
-  var start = _ref2.start,
-      end = _ref2.end,
-      source = _ref2.source,
-      filename = _ref2.filename;
-
-  return _extends({
-    start: start,
-    end: end
-  }, source !== undefined ? { source: source } : {}, filename !== undefined ? { filename: filename } : {});
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/getPropValue.js b/node_modules/jsx-ast-utils/lib/getPropValue.js
deleted file mode 100644
index de4062f..0000000
--- a/node_modules/jsx-ast-utils/lib/getPropValue.js
+++ /dev/null
@@ -1,57 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = getPropValue;
-exports.getLiteralPropValue = getLiteralPropValue;
-
-var _values = require('./values');
-
-var _values2 = _interopRequireDefault(_values);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var extractValue = function extractValue(attribute, extractor) {
-  if (attribute && attribute.type === 'JSXAttribute') {
-    if (attribute.value === null) {
-      // Null valued attributes imply truthiness.
-      // For example: <div aria-hidden />
-      // See: https://facebook.github.io/react/docs/jsx-in-depth.html#boolean-attributes
-      return true;
-    }
-
-    return extractor(attribute.value);
-  }
-
-  return undefined;
-};
-
-/**
- * Returns the value of a given attribute.
- * Different types of attributes have their associated
- * values in different properties on the object.
- *
- * This function should return the most *closely* associated
- * value with the intention of the JSX.
- *
- * @param attribute - The JSXAttribute collected by AST parser.
- */
-function getPropValue(attribute) {
-  return extractValue(attribute, _values2.default);
-}
-
-/**
- * Returns the value of a given attribute.
- * Different types of attributes have their associated
- * values in different properties on the object.
- *
- * This function should return a value only if we can extract
- * a literal value from its attribute (i.e. values that have generic
- * types in JavaScript - strings, numbers, booleans, etc.)
- *
- * @param attribute - The JSXAttribute collected by AST parser.
- */
-function getLiteralPropValue(attribute) {
-  return extractValue(attribute, _values.getLiteralValue);
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/hasProp.js b/node_modules/jsx-ast-utils/lib/hasProp.js
deleted file mode 100644
index b54326b..0000000
--- a/node_modules/jsx-ast-utils/lib/hasProp.js
+++ /dev/null
@@ -1,74 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = hasProp;
-exports.hasAnyProp = hasAnyProp;
-exports.hasEveryProp = hasEveryProp;
-
-var _propName = require('./propName');
-
-var _propName2 = _interopRequireDefault(_propName);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-var DEFAULT_OPTIONS = {
-  spreadStrict: true,
-  ignoreCase: true
-};
-
-/**
- * Returns boolean indicating whether an prop exists on the props
- * property of a JSX element node.
- */
-function hasProp() {
-  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
-  var prop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
-  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_OPTIONS;
-
-  var propToCheck = options.ignoreCase ? prop.toUpperCase() : prop;
-
-  return props.some(function (attribute) {
-    // If the props contain a spread prop, then refer to strict param.
-    if (attribute.type === 'JSXSpreadAttribute') {
-      return !options.spreadStrict;
-    }
-
-    var currentProp = options.ignoreCase ? (0, _propName2.default)(attribute).toUpperCase() : (0, _propName2.default)(attribute);
-
-    return propToCheck === currentProp;
-  });
-}
-
-/**
- * Given the props on a node and a list of props to check, this returns a boolean
- * indicating if any of them exist on the node.
- */
-function hasAnyProp() {
-  var nodeProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
-  var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
-  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_OPTIONS;
-
-  var propsToCheck = typeof props === 'string' ? props.split(' ') : props;
-
-  return propsToCheck.some(function (prop) {
-    return hasProp(nodeProps, prop, options);
-  });
-}
-
-/**
- * Given the props on a node and a list of props to check, this returns a boolean
- * indicating if all of them exist on the node
- */
-function hasEveryProp() {
-  var nodeProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
-  var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
-  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_OPTIONS;
-
-  var propsToCheck = typeof props === 'string' ? props.split(' ') : props;
-
-  return propsToCheck.every(function (prop) {
-    return hasProp(nodeProps, prop, options);
-  });
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/index.js b/node_modules/jsx-ast-utils/lib/index.js
deleted file mode 100644
index 2fe1119..0000000
--- a/node_modules/jsx-ast-utils/lib/index.js
+++ /dev/null
@@ -1,40 +0,0 @@
-'use strict';
-
-var _hasProp = require('./hasProp');
-
-var _hasProp2 = _interopRequireDefault(_hasProp);
-
-var _elementType = require('./elementType');
-
-var _elementType2 = _interopRequireDefault(_elementType);
-
-var _eventHandlers = require('./eventHandlers');
-
-var _eventHandlers2 = _interopRequireDefault(_eventHandlers);
-
-var _getProp = require('./getProp');
-
-var _getProp2 = _interopRequireDefault(_getProp);
-
-var _getPropValue = require('./getPropValue');
-
-var _getPropValue2 = _interopRequireDefault(_getPropValue);
-
-var _propName = require('./propName');
-
-var _propName2 = _interopRequireDefault(_propName);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-module.exports = {
-  hasProp: _hasProp2.default,
-  hasAnyProp: _hasProp.hasAnyProp,
-  hasEveryProp: _hasProp.hasEveryProp,
-  elementType: _elementType2.default,
-  eventHandlers: _eventHandlers2.default,
-  eventHandlersByType: _eventHandlers.eventHandlersByType,
-  getProp: _getProp2.default,
-  getPropValue: _getPropValue2.default,
-  getLiteralPropValue: _getPropValue.getLiteralPropValue,
-  propName: _propName2.default
-};
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/propName.js b/node_modules/jsx-ast-utils/lib/propName.js
deleted file mode 100644
index 5057886..0000000
--- a/node_modules/jsx-ast-utils/lib/propName.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = propName;
-/**
- * Returns the name of the prop given the JSXAttribute object.
- */
-function propName() {
-  var prop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
-  if (!prop.type || prop.type !== 'JSXAttribute') {
-    throw new Error('The prop must be a JSXAttribute collected by the AST parser.');
-  }
-
-  if (prop.name.type === 'JSXNamespacedName') {
-    return prop.name.namespace.name + ':' + prop.name.name.name;
-  }
-
-  return prop.name.name;
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/JSXElement.js b/node_modules/jsx-ast-utils/lib/values/JSXElement.js
deleted file mode 100644
index 4fa044a..0000000
--- a/node_modules/jsx-ast-utils/lib/values/JSXElement.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromJSXElement;
-/**
- * Extractor function for a JSXElement type value node.
- *
- * Returns self-closing element with correct name.
- */
-function extractValueFromJSXElement(value) {
-  return "<" + value.openingElement.name.name + " />";
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/Literal.js b/node_modules/jsx-ast-utils/lib/values/Literal.js
deleted file mode 100644
index 4233c82..0000000
--- a/node_modules/jsx-ast-utils/lib/values/Literal.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromLiteral;
-/**
- * Extractor function for a Literal type value node.
- *
- * @param - value - AST Value object with type `Literal`
- * @returns { String|Boolean } - The extracted value converted to correct type.
- */
-function extractValueFromLiteral(value) {
-  var extractedValue = value.value;
-
-
-  var normalizedStringValue = typeof extractedValue === 'string' && extractedValue.toLowerCase();
-  if (normalizedStringValue === 'true') {
-    return true;
-  }
-
-  if (normalizedStringValue === 'false') {
-    return false;
-  }
-
-  return extractedValue;
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/ArrayExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/ArrayExpression.js
deleted file mode 100644
index 4e89af4..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/ArrayExpression.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromArrayExpression;
-/**
- * Extractor function for an ArrayExpression type value node.
- * An array expression is an expression with [] syntax.
- *
- * @returns - An array of the extracted elements.
- */
-function extractValueFromArrayExpression(value) {
-  // eslint-disable-next-line global-require
-  var getValue = require('./index.js').default;
-  return value.elements.map(function (element) {
-    return getValue(element);
-  });
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/BinaryExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/BinaryExpression.js
deleted file mode 100644
index a58ea54..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/BinaryExpression.js
+++ /dev/null
@@ -1,78 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromBinaryExpression;
-/**
- * Extractor function for a BinaryExpression type value node.
- * A binary expression has a left and right side separated by an operator
- * such as `a + b`.
- *
- * @param - value - AST Value object with type `BinaryExpression`
- * @returns - The extracted value converted to correct type.
- */
-function extractValueFromBinaryExpression(value) {
-  // eslint-disable-next-line global-require
-  var getValue = require('./index.js').default;
-  var operator = value.operator,
-      left = value.left,
-      right = value.right;
-
-  var leftVal = getValue(left);
-  var rightVal = getValue(right);
-
-  switch (operator) {
-    case '==':
-      return leftVal == rightVal; // eslint-disable-line
-    case '!=':
-      return leftVal != rightVal; // eslint-disable-line
-    case '===':
-      return leftVal === rightVal;
-    case '!==':
-      return leftVal !== rightVal;
-    case '<':
-      return leftVal < rightVal;
-    case '<=':
-      return leftVal <= rightVal;
-    case '>':
-      return leftVal > rightVal;
-    case '>=':
-      return leftVal >= rightVal;
-    case '<<':
-      return leftVal << rightVal; // eslint-disable-line no-bitwise
-    case '>>':
-      return leftVal >> rightVal; // eslint-disable-line no-bitwise
-    case '>>>':
-      return leftVal >>> rightVal; // eslint-disable-line no-bitwise
-    case '+':
-      return leftVal + rightVal;
-    case '-':
-      return leftVal - rightVal;
-    case '*':
-      return leftVal * rightVal;
-    case '/':
-      return leftVal / rightVal;
-    case '%':
-      return leftVal % rightVal;
-    case '|':
-      return leftVal | rightVal; // eslint-disable-line no-bitwise
-    case '^':
-      return leftVal ^ rightVal; // eslint-disable-line no-bitwise
-    case '&':
-      return leftVal & rightVal; // eslint-disable-line no-bitwise
-    case 'in':
-      try {
-        return leftVal in rightVal;
-      } catch (err) {
-        return false;
-      }
-    case 'instanceof':
-      if (typeof rightVal !== 'function') {
-        return false;
-      }
-      return leftVal instanceof rightVal;
-    default:
-      return undefined;
-  }
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/BindExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/BindExpression.js
deleted file mode 100644
index ab27192..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/BindExpression.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromBindExpression;
-/**
- * Extractor function for a BindExpression type value node.
- * A bind expression looks like `::this.foo`
- * This will return `this.foo.bind(this)` as the value to indicate its existence,
- * since we can not execute the function this.foo.bind(this) in a static environment.
- *
- * @param - value - AST Value object with type `BindExpression`
- * @returns - The extracted value converted to correct type.
- */
-function extractValueFromBindExpression(value) {
-  // eslint-disable-next-line global-require
-  var getValue = require('./index.js').default;
-  var callee = getValue(value.callee);
-
-  // If value.object === null, the callee must be a MemberExpression.
-  // https://github.com/babel/babylon/blob/master/ast/spec.md#bindexpression
-  var object = value.object === null ? getValue(value.callee.object) : getValue(value.object);
-
-  if (value.object && value.object.property) {
-    return object + '.' + callee + '.bind(' + object + ')';
-  }
-
-  return callee + '.bind(' + object + ')';
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/CallExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/CallExpression.js
deleted file mode 100644
index 5ff172b..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/CallExpression.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromCallExpression;
-/**
- * Extractor function for a CallExpression type value node.
- * A call expression looks like `bar()`
- * This will return `bar` as the value to indicate its existence,
- * since we can not execute the function bar in a static environment.
- *
- * @param - value - AST Value object with type `CallExpression`
- * @returns - The extracted value converted to correct type.
- */
-function extractValueFromCallExpression(value) {
-  // eslint-disable-next-line global-require
-  var getValue = require('./index.js').default;
-  return getValue(value.callee);
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/ConditionalExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/ConditionalExpression.js
deleted file mode 100644
index 04d67ae..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/ConditionalExpression.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromConditionalExpression;
-/**
- * Extractor function for a ConditionalExpression type value node.
- *
- * @param - value - AST Value object with type `ConditionalExpression`
- * @returns - The extracted value converted to correct type.
- */
-function extractValueFromConditionalExpression(value) {
-  // eslint-disable-next-line global-require
-  var getValue = require('./index.js').default;
-  var test = value.test,
-      alternate = value.alternate,
-      consequent = value.consequent;
-
-
-  return getValue(test) ? getValue(consequent) : getValue(alternate);
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/FunctionExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/FunctionExpression.js
deleted file mode 100644
index 15db995..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/FunctionExpression.js
+++ /dev/null
@@ -1,19 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromFunctionExpression;
-/**
- * Extractor function for a FunctionExpression type value node.
- * Statically, we can't execute the given function, so just return a function
- * to indicate that the value is present.
- *
- * @param - value - AST Value object with type `FunctionExpression`
- * @returns - The extracted value converted to correct type.
- */
-function extractValueFromFunctionExpression(value) {
-  return function () {
-    return value;
-  };
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/Identifier.js b/node_modules/jsx-ast-utils/lib/values/expressions/Identifier.js
deleted file mode 100644
index bea6c94..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/Identifier.js
+++ /dev/null
@@ -1,35 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromIdentifier;
-var JS_RESERVED = {
-  Array: Array,
-  Date: Date,
-  Infinity: Infinity,
-  Math: Math,
-  Number: Number,
-  Object: Object,
-  String: String,
-  undefined: undefined
-};
-
-/**
- * Extractor function for a Identifier type value node.
- * An Identifier is usually a reference to a variable.
- * Just return variable name to determine its existence.
- *
- * @param - value - AST Value object with type `Identifier`
- * @returns - The extracted value converted to correct type.
- */
-function extractValueFromIdentifier(value) {
-  var name = value.name;
-
-
-  if (Object.hasOwnProperty.call(JS_RESERVED, name)) {
-    return JS_RESERVED[name];
-  }
-
-  return name;
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/LogicalExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/LogicalExpression.js
deleted file mode 100644
index 8456287..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/LogicalExpression.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromLogicalExpression;
-/**
- * Extractor function for a LogicalExpression type value node.
- * A logical expression is `a && b` or `a || b`, so we evaluate both sides
- * and return the extracted value of the expression.
- *
- * @param - value - AST Value object with type `LogicalExpression`
- * @returns - The extracted value converted to correct type.
- */
-function extractValueFromLogicalExpression(value) {
-  // eslint-disable-next-line global-require
-  var getValue = require('./index.js').default;
-  var operator = value.operator,
-      left = value.left,
-      right = value.right;
-
-  var leftVal = getValue(left);
-  var rightVal = getValue(right);
-
-  return operator === '&&' ? leftVal && rightVal : leftVal || rightVal;
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/MemberExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/MemberExpression.js
deleted file mode 100644
index e16618a..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/MemberExpression.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromMemberExpression;
-/**
- * Extractor function for a MemberExpression type value node.
- * A member expression is accessing a property on an object `obj.property`.
- *
- * @param - value - AST Value object with type `MemberExpression`
- * @returns - The extracted value converted to correct type
- *  and maintaing `obj.property` convention.
- */
-function extractValueFromMemberExpression(value) {
-  // eslint-disable-next-line global-require
-  var getValue = require('./index.js').default;
-  return getValue(value.object) + '.' + getValue(value.property);
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/NewExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/NewExpression.js
deleted file mode 100644
index 3accd6f..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/NewExpression.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromNewExpression;
-/**
- * Extractor function for a NewExpression type value node.
- * A new expression instantiates an object with `new` keyword.
- *
- * @returns - an empty object.
- */
-function extractValueFromNewExpression() {
-  return new Object(); // eslint-disable-line
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/ObjectExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/ObjectExpression.js
deleted file mode 100644
index eb0904e..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/ObjectExpression.js
+++ /dev/null
@@ -1,35 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromObjectExpression;
-
-var _object = require('object.assign');
-
-var _object2 = _interopRequireDefault(_object);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Extractor function for an ObjectExpression type value node.
- * An object expression is using {}.
- *
- * @returns - a representation of the object
- */
-function extractValueFromObjectExpression(value) {
-  // eslint-disable-next-line global-require
-  var getValue = require('./index.js').default;
-  return value.properties.reduce(function (obj, property) {
-    var object = (0, _object2.default)({}, obj);
-    // Support types: SpreadProperty and ExperimentalSpreadProperty
-    if (/^(?:Experimental)?Spread(?:Property|Element)$/.test(property.type)) {
-      if (property.argument.type === 'ObjectExpression') {
-        return (0, _object2.default)(object, extractValueFromObjectExpression(property.argument));
-      }
-    } else {
-      object[getValue(property.key)] = getValue(property.value);
-    }
-    return object;
-  }, {});
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/OptionalMemberExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/OptionalMemberExpression.js
deleted file mode 100644
index 4fd1e82..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/OptionalMemberExpression.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromOptionalMemberExpression;
-/**
- * Extractor function for a OptionalMemberExpression type value node.
- * A member expression is accessing a property on an object `obj.property`.
- *
- * @param - value - AST Value object with type `OptionalMemberExpression`
- * @returns - The extracted value converted to correct type
- *  and maintaing `obj?.property` convention.
- */
-function extractValueFromOptionalMemberExpression(value) {
-  // eslint-disable-next-line global-require
-  var getValue = require('./index.js').default;
-  return getValue(value.object) + '?.' + getValue(value.property);
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/SpreadElement.js b/node_modules/jsx-ast-utils/lib/values/expressions/SpreadElement.js
deleted file mode 100644
index cee0d48..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/SpreadElement.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromSpreadElement;
-/**
- * Extractor function for a SpreadElement type value node.
- * We can't statically evaluate an array spread, so just return
- * undefined.
- *
- * @param - value - AST Value object with type `SpreadElement`
- * @returns - An prototypeless object.
- */
-function extractValueFromSpreadElement() {
-  return undefined;
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/TaggedTemplateExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/TaggedTemplateExpression.js
deleted file mode 100644
index 9402746..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/TaggedTemplateExpression.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromTaggedTemplateExpression;
-
-var _TemplateLiteral = require('./TemplateLiteral');
-
-var _TemplateLiteral2 = _interopRequireDefault(_TemplateLiteral);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-/**
- * Returns the string value of a tagged template literal object.
- * Redirects the bulk of the work to `TemplateLiteral`.
- */
-function extractValueFromTaggedTemplateExpression(value) {
-  return (0, _TemplateLiteral2.default)(value.quasi);
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/TemplateLiteral.js b/node_modules/jsx-ast-utils/lib/values/expressions/TemplateLiteral.js
deleted file mode 100644
index 4314ea0..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/TemplateLiteral.js
+++ /dev/null
@@ -1,40 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromTemplateLiteral;
-/**
- * Returns the string value of a template literal object.
- * Tries to build it as best as it can based on the passed
- * prop. For instance `This is a ${prop}` will return 'This is a {prop}'.
- *
- * If the template literal builds to undefined (`${undefined}`), then
- * this should return "undefined".
- */
-function extractValueFromTemplateLiteral(value) {
-  var quasis = value.quasis,
-      expressions = value.expressions;
-
-  var partitions = quasis.concat(expressions);
-
-  return partitions.sort(function (a, b) {
-    return a.start - b.start;
-  }).reduce(function (raw, part) {
-    var type = part.type;
-
-    if (type === 'TemplateElement') {
-      return raw + part.value.raw;
-    }
-
-    if (type === 'Identifier') {
-      return part.name === 'undefined' ? '' + raw + part.name : raw + '{' + part.name + '}';
-    }
-
-    if (type.indexOf('Expression') > -1) {
-      return raw + '{' + type + '}';
-    }
-
-    return raw;
-  }, '');
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/ThisExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/ThisExpression.js
deleted file mode 100644
index 185de46..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/ThisExpression.js
+++ /dev/null
@@ -1,15 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromThisExpression;
-/**
- * Extractor function for a ThisExpression type value node.
- * A this expression is using `this` as an identifier.
- *
- * @returns - 'this' as a string.
- */
-function extractValueFromThisExpression() {
-  return 'this';
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/TypeCastExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/TypeCastExpression.js
deleted file mode 100644
index b1a19f8..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/TypeCastExpression.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromTypeCastExpression;
-/**
- * Extractor function for a TypeCastExpression type value node.
- * A type cast expression looks like `(this.handleClick: (event: MouseEvent) => void))`
- * This will return the expression `this.handleClick`.
- *
- * @param - value - AST Value object with type `TypeCastExpression`
- * @returns - The extracted value converted to correct type.
- */
-function extractValueFromTypeCastExpression(value) {
-  // eslint-disable-next-line global-require
-  var getValue = require('./index.js').default;
-  return getValue(value.expression);
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/UnaryExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/UnaryExpression.js
deleted file mode 100644
index 318ec8c..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/UnaryExpression.js
+++ /dev/null
@@ -1,39 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromUnaryExpression;
-/**
- * Extractor function for a UnaryExpression type value node.
- * A unary expression is an expression with a unary operator.
- * For example, !"foobar" will evaluate to false, so this will return false.
- *
- * @param - value - AST Value object with type `UnaryExpression`
- * @returns - The extracted value converted to correct type.
- */
-function extractValueFromUnaryExpression(value) {
-  // eslint-disable-next-line global-require
-  var getValue = require('./index.js').default;
-  var operator = value.operator,
-      argument = value.argument;
-
-
-  switch (operator) {
-    case '-':
-      return -getValue(argument);
-    case '+':
-      return +getValue(argument); // eslint-disable-line no-implicit-coercion
-    case '!':
-      return !getValue(argument);
-    case '~':
-      return ~getValue(argument); // eslint-disable-line no-bitwise
-    case 'delete':
-      // I believe delete statements evaluate to true.
-      return true;
-    case 'typeof':
-    case 'void':
-    default:
-      return undefined;
-  }
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/UpdateExpression.js b/node_modules/jsx-ast-utils/lib/values/expressions/UpdateExpression.js
deleted file mode 100644
index a3a9c72..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/UpdateExpression.js
+++ /dev/null
@@ -1,33 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extractValueFromUpdateExpression;
-/**
- * Extractor function for an UpdateExpression type value node.
- * An update expression is an expression with an update operator.
- * For example, foo++ will evaluate to foo + 1.
- *
- * @param - value - AST Value object with type `UpdateExpression`
- * @returns - The extracted value converted to correct type.
- */
-function extractValueFromUpdateExpression(value) {
-  // eslint-disable-next-line global-require
-  var getValue = require('./index.js').default;
-  var operator = value.operator,
-      argument = value.argument,
-      prefix = value.prefix;
-
-
-  var val = getValue(argument);
-
-  switch (operator) {
-    case '++':
-      return prefix ? ++val : val++; // eslint-disable-line no-plusplus
-    case '--':
-      return prefix ? --val : val--; // eslint-disable-line no-plusplus
-    default:
-      return undefined;
-  }
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/expressions/index.js b/node_modules/jsx-ast-utils/lib/values/expressions/index.js
deleted file mode 100644
index b70ea24..0000000
--- a/node_modules/jsx-ast-utils/lib/values/expressions/index.js
+++ /dev/null
@@ -1,244 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = extract;
-exports.extractLiteral = extractLiteral;
-
-var _object = require('object.assign');
-
-var _object2 = _interopRequireDefault(_object);
-
-var _Literal = require('../Literal');
-
-var _Literal2 = _interopRequireDefault(_Literal);
-
-var _JSXElement = require('../JSXElement');
-
-var _JSXElement2 = _interopRequireDefault(_JSXElement);
-
-var _Identifier = require('./Identifier');
-
-var _Identifier2 = _interopRequireDefault(_Identifier);
-
-var _TaggedTemplateExpression = require('./TaggedTemplateExpression');
-
-var _TaggedTemplateExpression2 = _interopRequireDefault(_TaggedTemplateExpression);
-
-var _TemplateLiteral = require('./TemplateLiteral');
-
-var _TemplateLiteral2 = _interopRequireDefault(_TemplateLiteral);
-
-var _FunctionExpression = require('./FunctionExpression');
-
-var _FunctionExpression2 = _interopRequireDefault(_FunctionExpression);
-
-var _LogicalExpression = require('./LogicalExpression');
-
-var _LogicalExpression2 = _interopRequireDefault(_LogicalExpression);
-
-var _MemberExpression = require('./MemberExpression');
-
-var _MemberExpression2 = _interopRequireDefault(_MemberExpression);
-
-var _OptionalMemberExpression = require('./OptionalMemberExpression');
-
-var _OptionalMemberExpression2 = _interopRequireDefault(_OptionalMemberExpression);
-
-var _CallExpression = require('./CallExpression');
-
-var _CallExpression2 = _interopRequireDefault(_CallExpression);
-
-var _UnaryExpression = require('./UnaryExpression');
-
-var _UnaryExpression2 = _interopRequireDefault(_UnaryExpression);
-
-var _ThisExpression = require('./ThisExpression');
-
-var _ThisExpression2 = _interopRequireDefault(_ThisExpression);
-
-var _ConditionalExpression = require('./ConditionalExpression');
-
-var _ConditionalExpression2 = _interopRequireDefault(_ConditionalExpression);
-
-var _BinaryExpression = require('./BinaryExpression');
-
-var _BinaryExpression2 = _interopRequireDefault(_BinaryExpression);
-
-var _ObjectExpression = require('./ObjectExpression');
-
-var _ObjectExpression2 = _interopRequireDefault(_ObjectExpression);
-
-var _NewExpression = require('./NewExpression');
-
-var _NewExpression2 = _interopRequireDefault(_NewExpression);
-
-var _UpdateExpression = require('./UpdateExpression');
-
-var _UpdateExpression2 = _interopRequireDefault(_UpdateExpression);
-
-var _ArrayExpression = require('./ArrayExpression');
-
-var _ArrayExpression2 = _interopRequireDefault(_ArrayExpression);
-
-var _BindExpression = require('./BindExpression');
-
-var _BindExpression2 = _interopRequireDefault(_BindExpression);
-
-var _SpreadElement = require('./SpreadElement');
-
-var _SpreadElement2 = _interopRequireDefault(_SpreadElement);
-
-var _TypeCastExpression = require('./TypeCastExpression');
-
-var _TypeCastExpression2 = _interopRequireDefault(_TypeCastExpression);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-// Composition map of types to their extractor functions.
-var TYPES = {
-  Identifier: _Identifier2.default,
-  Literal: _Literal2.default,
-  JSXElement: _JSXElement2.default,
-  TaggedTemplateExpression: _TaggedTemplateExpression2.default,
-  TemplateLiteral: _TemplateLiteral2.default,
-  ArrowFunctionExpression: _FunctionExpression2.default,
-  FunctionExpression: _FunctionExpression2.default,
-  LogicalExpression: _LogicalExpression2.default,
-  MemberExpression: _MemberExpression2.default,
-  OptionalMemberExpression: _OptionalMemberExpression2.default,
-  CallExpression: _CallExpression2.default,
-  UnaryExpression: _UnaryExpression2.default,
-  ThisExpression: _ThisExpression2.default,
-  ConditionalExpression: _ConditionalExpression2.default,
-  BinaryExpression: _BinaryExpression2.default,
-  ObjectExpression: _ObjectExpression2.default,
-  NewExpression: _NewExpression2.default,
-  UpdateExpression: _UpdateExpression2.default,
-  ArrayExpression: _ArrayExpression2.default,
-  BindExpression: _BindExpression2.default,
-  SpreadElement: _SpreadElement2.default,
-  TypeCastExpression: _TypeCastExpression2.default
-};
-
-var noop = function noop() {
-  return null;
-};
-
-var errorMessage = function errorMessage(expression) {
-  return 'The prop value with an expression type of ' + expression + ' could not be resolved. Please file issue to get this fixed immediately.';
-};
-
-/**
- * This function maps an AST value node
- * to its correct extractor function for its
- * given type.
- *
- * This will map correctly for *all* possible expression types.
- *
- * @param - value - AST Value object with type `JSXExpressionContainer`
- * @returns The extracted value.
- */
-function extract(value) {
-  // Value will not have the expression property when we recurse.
-  // The type for expression on ArrowFunctionExpression is a boolean.
-  var expression = void 0;
-  if (typeof value.expression !== 'boolean' && value.expression) {
-    expression = value.expression; // eslint-disable-line prefer-destructuring
-  } else {
-    expression = value;
-  }
-  var _expression = expression,
-      type = _expression.type;
-
-
-  while (type === 'TSNonNullExpression' || type === 'TSAsExpression') {
-    var _expression2 = expression;
-    type = _expression2.type;
-
-    if (expression.expression) {
-      var _expression3 = expression;
-      expression = _expression3.expression;
-    }
-  }
-
-  if (TYPES[type] === undefined) {
-    // eslint-disable-next-line no-console
-    console.error(errorMessage(type));
-    return null;
-  }
-
-  return TYPES[type](expression);
-}
-
-// Composition map of types to their extractor functions to handle literals.
-var LITERAL_TYPES = (0, _object2.default)({}, TYPES, {
-  Literal: function Literal(value) {
-    var extractedVal = TYPES.Literal.call(undefined, value);
-    var isNull = extractedVal === null;
-    // This will be convention for attributes that have null
-    // value explicitly defined (<div prop={null} /> maps to 'null').
-    return isNull ? 'null' : extractedVal;
-  },
-  Identifier: function Identifier(value) {
-    var isUndefined = TYPES.Identifier.call(undefined, value) === undefined;
-    return isUndefined ? undefined : null;
-  },
-  JSXElement: noop,
-  ArrowFunctionExpression: noop,
-  FunctionExpression: noop,
-  LogicalExpression: noop,
-  MemberExpression: noop,
-  OptionalMemberExpression: noop,
-  CallExpression: noop,
-  UnaryExpression: function UnaryExpression(value) {
-    var extractedVal = TYPES.UnaryExpression.call(undefined, value);
-    return extractedVal === undefined ? null : extractedVal;
-  },
-  UpdateExpression: function UpdateExpression(value) {
-    var extractedVal = TYPES.UpdateExpression.call(undefined, value);
-    return extractedVal === undefined ? null : extractedVal;
-  },
-  ThisExpression: noop,
-  ConditionalExpression: noop,
-  BinaryExpression: noop,
-  ObjectExpression: noop,
-  NewExpression: noop,
-  ArrayExpression: function ArrayExpression(value) {
-    var extractedVal = TYPES.ArrayExpression.call(undefined, value);
-    return extractedVal.filter(function (val) {
-      return val !== null;
-    });
-  },
-  BindExpression: noop,
-  SpreadElement: noop,
-  TSNonNullExpression: noop,
-  TSAsExpression: noop,
-  TypeCastExpression: noop
-});
-
-/**
- * This function maps an AST value node
- * to its correct extractor function for its
- * given type.
- *
- * This will map correctly for *some* possible types that map to literals.
- *
- * @param - value - AST Value object with type `JSXExpressionContainer`
- * @returns The extracted value.
- */
-function extractLiteral(value) {
-  // Value will not have the expression property when we recurse.
-  var expression = value.expression || value;
-  var type = expression.type;
-
-
-  if (LITERAL_TYPES[type] === undefined) {
-    // eslint-disable-next-line no-console
-    console.error(errorMessage(type));
-    return null;
-  }
-
-  return LITERAL_TYPES[type](expression);
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/lib/values/index.js b/node_modules/jsx-ast-utils/lib/values/index.js
deleted file mode 100644
index c675771..0000000
--- a/node_modules/jsx-ast-utils/lib/values/index.js
+++ /dev/null
@@ -1,66 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
-  value: true
-});
-exports.default = getValue;
-exports.getLiteralValue = getLiteralValue;
-
-var _object = require('object.assign');
-
-var _object2 = _interopRequireDefault(_object);
-
-var _Literal = require('./Literal');
-
-var _Literal2 = _interopRequireDefault(_Literal);
-
-var _JSXElement = require('./JSXElement');
-
-var _JSXElement2 = _interopRequireDefault(_JSXElement);
-
-var _expressions = require('./expressions');
-
-var _expressions2 = _interopRequireDefault(_expressions);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-// Composition map of types to their extractor functions.
-var TYPES = {
-  Literal: _Literal2.default,
-  JSXElement: _JSXElement2.default,
-  JSXExpressionContainer: _expressions2.default
-};
-
-// Composition map of types to their extractor functions to handle literals.
-var LITERAL_TYPES = (0, _object2.default)({}, TYPES, {
-  JSXElement: function JSXElement() {
-    return null;
-  },
-  JSXExpressionContainer: _expressions.extractLiteral
-});
-
-/**
- * This function maps an AST value node
- * to its correct extractor function for its
- * given type.
- *
- * This will map correctly for *all* possible types.
- *
- * @param value - AST Value object on a JSX Attribute.
- */
-function getValue(value) {
-  return TYPES[value.type](value);
-}
-
-/**
- * This function maps an AST value node
- * to its correct extractor function for its
- * given type.
- *
- * This will map correctly for *some* possible types that map to literals.
- *
- * @param value - AST Value object on a JSX Attribute.
- */
-function getLiteralValue(value) {
-  return LITERAL_TYPES[value.type](value);
-}
\ No newline at end of file
diff --git a/node_modules/jsx-ast-utils/package.json b/node_modules/jsx-ast-utils/package.json
deleted file mode 100644
index 94d282a..0000000
--- a/node_modules/jsx-ast-utils/package.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "name": "jsx-ast-utils",
-  "version": "2.2.3",
-  "description": "AST utility module for statically analyzing JSX",
-  "main": "lib/index.js",
-  "scripts": {
-    "prebuild": "rimraf lib",
-    "build": "babel src --out-dir lib",
-    "prepublish": "not-in-publish || (npm test && npm run build)",
-    "coveralls": "cat ./reports/lcov.info | coveralls",
-    "lint": "eslint .",
-    "pretest": "npm run lint",
-    "test": "npm run tests-only --",
-    "tests-only": "jest --coverage",
-    "test:watch": "npm test -- --watch"
-  },
-  "devDependencies": {
-    "@babel/parser": "^7.4.4",
-    "babel-cli": "^6.26.0",
-    "babel-core": "^6.26.3",
-    "babel-eslint": "^10.0.2",
-    "babel-jest": "^20.0.3",
-    "babel-plugin-transform-object-rest-spread": "^6.26.0",
-    "babel-plugin-transform-replace-object-assign": "^1.0.0",
-    "babel-polyfill": "^6.26.0",
-    "babel-preset-env": "^1.7.0",
-    "babylon": "^6.18.0",
-    "coveralls": "^3.0.4",
-    "eslint": "^6.0.0",
-    "eslint-config-airbnb-base": "^13.1.0",
-    "eslint-plugin-import": "^2.17.2",
-    "flow-parser": "^0.102.0",
-    "in-publish": "^2.0.0",
-    "jest": "^20.0.4",
-    "jest-cli": "^20.0.4",
-    "object.entries": "^1.1.0",
-    "object.fromentries": "^2.0.1",
-    "rimraf": "^2.6.3"
-  },
-  "engines": {
-    "node": ">=4.0"
-  },
-  "keywords": [
-    "jsx",
-    "ast",
-    "lint",
-    "eslint"
-  ],
-  "author": "Ethan Cohen",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/evcohen/jsx-ast-utils"
-  },
-  "license": "MIT",
-  "jest": {
-    "coverageReporters": [
-      "lcov"
-    ],
-    "coverageDirectory": "reports",
-    "testPathIgnorePatterns": [
-      "/node_modules/",
-      "helper.js"
-    ]
-  },
-  "dependencies": {
-    "array-includes": "^3.0.3",
-    "object.assign": "^4.1.0"
-  }
-}
diff --git a/node_modules/jsx-ast-utils/propName.js b/node_modules/jsx-ast-utils/propName.js
deleted file mode 100644
index 361a52b..0000000
--- a/node_modules/jsx-ast-utils/propName.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib').propName; // eslint-disable-line import/no-unresolved
diff --git a/node_modules/jsx-ast-utils/src/elementType.js b/node_modules/jsx-ast-utils/src/elementType.js
deleted file mode 100644
index 2f87a19..0000000
--- a/node_modules/jsx-ast-utils/src/elementType.js
+++ /dev/null
@@ -1,29 +0,0 @@
-function resolveMemberExpressions(object = {}, property = {}) {
-  if (object.type === 'JSXMemberExpression') {
-    return `${resolveMemberExpressions(object.object, object.property)}.${property.name}`;
-  }
-
-  return `${object.name}.${property.name}`;
-}
-
-/**
- * Returns the tagName associated with a JSXElement.
- */
-export default function elementType(node = {}) {
-  const { name } = node;
-
-  if (!name) {
-    throw new Error('The argument provided is not a JSXElement node.');
-  }
-
-  if (name.type === 'JSXMemberExpression') {
-    const { object = {}, property = {} } = name;
-    return resolveMemberExpressions(object, property);
-  }
-
-  if (name.type === 'JSXNamespacedName') {
-    return `${name.namespace.name}:${name.name.name}`;
-  }
-
-  return node.name.name;
-}
diff --git a/node_modules/jsx-ast-utils/src/eventHandlers.js b/node_modules/jsx-ast-utils/src/eventHandlers.js
deleted file mode 100644
index 45baf36..0000000
--- a/node_modules/jsx-ast-utils/src/eventHandlers.js
+++ /dev/null
@@ -1,113 +0,0 @@
-
-/**
- * Common event handlers for JSX element event binding.
- */
-
-const eventHandlersByType = {
-  clipboard: [
-    'onCopy',
-    'onCut',
-    'onPaste',
-  ],
-  composition: [
-    'onCompositionEnd',
-    'onCompositionStart',
-    'onCompositionUpdate',
-  ],
-  keyboard: [
-    'onKeyDown',
-    'onKeyPress',
-    'onKeyUp',
-  ],
-  focus: [
-    'onFocus',
-    'onBlur',
-  ],
-  form: [
-    'onChange',
-    'onInput',
-    'onSubmit',
-  ],
-  mouse: [
-    'onClick',
-    'onContextMenu',
-    'onDblClick',
-    'onDoubleClick',
-    'onDrag',
-    'onDragEnd',
-    'onDragEnter',
-    'onDragExit',
-    'onDragLeave',
-    'onDragOver',
-    'onDragStart',
-    'onDrop',
-    'onMouseDown',
-    'onMouseEnter',
-    'onMouseLeave',
-    'onMouseMove',
-    'onMouseOut',
-    'onMouseOver',
-    'onMouseUp',
-  ],
-  selection: [
-    'onSelect',
-  ],
-  touch: [
-    'onTouchCancel',
-    'onTouchEnd',
-    'onTouchMove',
-    'onTouchStart',
-  ],
-  ui: [
-    'onScroll',
-  ],
-  wheel: [
-    'onWheel',
-  ],
-  media: [
-    'onAbort',
-    'onCanPlay',
-    'onCanPlayThrough',
-    'onDurationChange',
-    'onEmptied',
-    'onEncrypted',
-    'onEnded',
-    'onError',
-    'onLoadedData',
-    'onLoadedMetadata',
-    'onLoadStart',
-    'onPause',
-    'onPlay',
-    'onPlaying',
-    'onProgress',
-    'onRateChange',
-    'onSeeked',
-    'onSeeking',
-    'onStalled',
-    'onSuspend',
-    'onTimeUpdate',
-    'onVolumeChange',
-    'onWaiting',
-  ],
-  image: [
-    'onLoad',
-    'onError',
-  ],
-  animation: [
-    'onAnimationStart',
-    'onAnimationEnd',
-    'onAnimationIteration',
-  ],
-  transition: [
-    'onTransitionEnd',
-  ],
-};
-
-const eventHandlers = Object.keys(eventHandlersByType).reduce(
-  (accumulator, type) => accumulator.concat(eventHandlersByType[type]),
-  [],
-);
-
-export default eventHandlers;
-
-export { eventHandlersByType };
diff --git a/node_modules/jsx-ast-utils/src/getProp.js b/node_modules/jsx-ast-utils/src/getProp.js
deleted file mode 100644
index b34f635..0000000
--- a/node_modules/jsx-ast-utils/src/getProp.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import propName from './propName';
-
-const DEFAULT_OPTIONS = {
-  ignoreCase: true,
-};
-
-/**
- * Returns the JSXAttribute itself or undefined, indicating the prop
- * is not present on the JSXOpeningElement.
- *
- */
-export default function getProp(props = [], prop = '', options = DEFAULT_OPTIONS) {
-  function getName(name) { return options.ignoreCase ? name.toUpperCase() : name; }
-  const propToFind = getName(prop);
-  function isPropToFind(property) {
-    return property.type === 'Property'
-      && property.key.type === 'Identifier'
-      && propToFind === getName(property.key.name);
-  }
-
-  const foundAttribute = props.find((attribute) => {
-    // If the props contain a spread prop, try to find the property in the object expression.
-    if (attribute.type === 'JSXSpreadAttribute') {
-      return attribute.argument.type === 'ObjectExpression'
-        && propToFind !== getName('key') // https://github.com/reactjs/rfcs/pull/107
-        && attribute.argument.properties.some(isPropToFind);
-    }
-
-    return propToFind === getName(propName(attribute));
-  });
-
-  if (foundAttribute && foundAttribute.type === 'JSXSpreadAttribute') {
-    return propertyToJSXAttribute(foundAttribute.argument.properties.find(isPropToFind));
-  }
-
-  return foundAttribute;
-}
-
-function propertyToJSXAttribute(node) {
-  const { key, value } = node;
-  return {
-    type: 'JSXAttribute',
-    name: { type: 'JSXIdentifier', name: key.name, ...getBaseProps(key) },
-    value: value.type === 'Literal'
-      ? value
-      : { type: 'JSXExpressionContainer', expression: value, ...getBaseProps(value) },
-    ...getBaseProps(node),
-  };
-}
-
-function getBaseProps({
-  start,
-  end,
-  loc,
-  range,
-}) {
-  return {
-    loc: getBaseLocation(loc),
-    ...(start !== undefined ? { start } : {}),
-    ...(end !== undefined ? { end } : {}),
-    ...(range !== undefined ? { range } : {}),
-  };
-}
-
-function getBaseLocation({
-  start,
-  end,
-  source,
-  filename,
-}) {
-  return {
-    start,
-    end,
-    ...(source !== undefined ? { source } : {}),
-    ...(filename !== undefined ? { filename } : {}),
-  };
-}
diff --git a/node_modules/jsx-ast-utils/src/getPropValue.js b/node_modules/jsx-ast-utils/src/getPropValue.js
deleted file mode 100644
index 80b35ad..0000000
--- a/node_modules/jsx-ast-utils/src/getPropValue.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import getValue, { getLiteralValue } from './values';
-
-const extractValue = (attribute, extractor) => {
-  if (attribute && attribute.type === 'JSXAttribute') {
-    if (attribute.value === null) {
-      // Null valued attributes imply truthiness.
-      // For example: <div aria-hidden />
-      // See: https://facebook.github.io/react/docs/jsx-in-depth.html#boolean-attributes
-      return true;
-    }
-
-    return extractor(attribute.value);
-  }
-
-  return undefined;
-};
-
-/**
- * Returns the value of a given attribute.
- * Different types of attributes have their associated
- * values in different properties on the object.
- *
- * This function should return the most *closely* associated
- * value with the intention of the JSX.
- *
- * @param attribute - The JSXAttribute collected by AST parser.
- */
-export default function getPropValue(attribute) {
-  return extractValue(attribute, getValue);
-}
-
-/**
- * Returns the value of a given attribute.
- * Different types of attributes have their associated
- * values in different properties on the object.
- *
- * This function should return a value only if we can extract
- * a literal value from its attribute (i.e. values that have generic
- * types in JavaScript - strings, numbers, booleans, etc.)
- *
- * @param attribute - The JSXAttribute collected by AST parser.
- */
-export function getLiteralPropValue(attribute) {
-  return extractValue(attribute, getLiteralValue);
-}
diff --git a/node_modules/jsx-ast-utils/src/hasProp.js b/node_modules/jsx-ast-utils/src/hasProp.js
deleted file mode 100644
index e9e4058..0000000
--- a/node_modules/jsx-ast-utils/src/hasProp.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import propName from './propName';
-
-const DEFAULT_OPTIONS = {
-  spreadStrict: true,
-  ignoreCase: true,
-};
-
-/**
- * Returns boolean indicating whether an prop exists on the props
- * property of a JSX element node.
- */
-export default function hasProp(props = [], prop = '', options = DEFAULT_OPTIONS) {
-  const propToCheck = options.ignoreCase ? prop.toUpperCase() : prop;
-
-  return props.some((attribute) => {
-    // If the props contain a spread prop, then refer to strict param.
-    if (attribute.type === 'JSXSpreadAttribute') {
-      return !options.spreadStrict;
-    }
-
-    const currentProp = options.ignoreCase
-      ? propName(attribute).toUpperCase()
-      : propName(attribute);
-
-    return propToCheck === currentProp;
-  });
-}
-
-/**
- * Given the props on a node and a list of props to check, this returns a boolean
- * indicating if any of them exist on the node.
- */
-export function hasAnyProp(nodeProps = [], props = [], options = DEFAULT_OPTIONS) {
-  const propsToCheck = typeof props === 'string' ? props.split(' ') : props;
-
-  return propsToCheck.some(prop => hasProp(nodeProps, prop, options));
-}
-
-/**
- * Given the props on a node and a list of props to check, this returns a boolean
- * indicating if all of them exist on the node
- */
-export function hasEveryProp(nodeProps = [], props = [], options = DEFAULT_OPTIONS) {
-  const propsToCheck = typeof props === 'string' ? props.split(' ') : props;
-
-  return propsToCheck.every(prop => hasProp(nodeProps, prop, options));
-}
diff --git a/node_modules/jsx-ast-utils/src/index.js b/node_modules/jsx-ast-utils/src/index.js
deleted file mode 100644
index 6814764..0000000
--- a/node_modules/jsx-ast-utils/src/index.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import hasProp, { hasAnyProp, hasEveryProp } from './hasProp';
-import elementType from './elementType';
-import eventHandlers, { eventHandlersByType } from './eventHandlers';
-import getProp from './getProp';
-import getPropValue, { getLiteralPropValue } from './getPropValue';
-import propName from './propName';
-
-module.exports = {
-  hasProp,
-  hasAnyProp,
-  hasEveryProp,
-  elementType,
-  eventHandlers,
-  eventHandlersByType,
-  getProp,
-  getPropValue,
-  getLiteralPropValue,
-  propName,
-};
diff --git a/node_modules/jsx-ast-utils/src/propName.js b/node_modules/jsx-ast-utils/src/propName.js
deleted file mode 100644
index 0fc61e7..0000000
--- a/node_modules/jsx-ast-utils/src/propName.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Returns the name of the prop given the JSXAttribute object.
- */
-export default function propName(prop = {}) {
-  if (!prop.type || prop.type !== 'JSXAttribute') {
-    throw new Error('The prop must be a JSXAttribute collected by the AST parser.');
-  }
-
-  if (prop.name.type === 'JSXNamespacedName') {
-    return `${prop.name.namespace.name}:${prop.name.name.name}`;
-  }
-
-  return prop.name.name;
-}
diff --git a/node_modules/jsx-ast-utils/src/values/JSXElement.js b/node_modules/jsx-ast-utils/src/values/JSXElement.js
deleted file mode 100644
index 20cc455..0000000
--- a/node_modules/jsx-ast-utils/src/values/JSXElement.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Extractor function for a JSXElement type value node.
- *
- * Returns self-closing element with correct name.
- */
-export default function extractValueFromJSXElement(value) {
-  return `<${value.openingElement.name.name} />`;
-}
diff --git a/node_modules/jsx-ast-utils/src/values/Literal.js b/node_modules/jsx-ast-utils/src/values/Literal.js
deleted file mode 100644
index a860657..0000000
--- a/node_modules/jsx-ast-utils/src/values/Literal.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Extractor function for a Literal type value node.
- *
- * @param - value - AST Value object with type `Literal`
- * @returns { String|Boolean } - The extracted value converted to correct type.
- */
-export default function extractValueFromLiteral(value) {
-  const { value: extractedValue } = value;
-
-  const normalizedStringValue = typeof extractedValue === 'string' && extractedValue.toLowerCase();
-  if (normalizedStringValue === 'true') {
-    return true;
-  }
-
-  if (normalizedStringValue === 'false') {
-    return false;
-  }
-
-  return extractedValue;
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/ArrayExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/ArrayExpression.js
deleted file mode 100644
index c5230a5..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/ArrayExpression.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * Extractor function for an ArrayExpression type value node.
- * An array expression is an expression with [] syntax.
- *
- * @returns - An array of the extracted elements.
- */
-export default function extractValueFromArrayExpression(value) {
-  // eslint-disable-next-line global-require
-  const getValue = require('./index.js').default;
-  return value.elements.map(element => getValue(element));
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/BinaryExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/BinaryExpression.js
deleted file mode 100644
index cab0cbb..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/BinaryExpression.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * Extractor function for a BinaryExpression type value node.
- * A binary expression has a left and right side separated by an operator
- * such as `a + b`.
- *
- * @param - value - AST Value object with type `BinaryExpression`
- * @returns - The extracted value converted to correct type.
- */
-export default function extractValueFromBinaryExpression(value) {
-  // eslint-disable-next-line global-require
-  const getValue = require('./index.js').default;
-  const { operator, left, right } = value;
-  const leftVal = getValue(left);
-  const rightVal = getValue(right);
-
-  switch (operator) {
-    case '==':
-      return leftVal == rightVal; // eslint-disable-line
-    case '!=':
-      return leftVal != rightVal; // eslint-disable-line
-    case '===':
-      return leftVal === rightVal;
-    case '!==':
-      return leftVal !== rightVal;
-    case '<':
-      return leftVal < rightVal;
-    case '<=':
-      return leftVal <= rightVal;
-    case '>':
-      return leftVal > rightVal;
-    case '>=':
-      return leftVal >= rightVal;
-    case '<<':
-      return leftVal << rightVal; // eslint-disable-line no-bitwise
-    case '>>':
-      return leftVal >> rightVal; // eslint-disable-line no-bitwise
-    case '>>>':
-      return leftVal >>> rightVal; // eslint-disable-line no-bitwise
-    case '+':
-      return leftVal + rightVal;
-    case '-':
-      return leftVal - rightVal;
-    case '*':
-      return leftVal * rightVal;
-    case '/':
-      return leftVal / rightVal;
-    case '%':
-      return leftVal % rightVal;
-    case '|':
-      return leftVal | rightVal; // eslint-disable-line no-bitwise
-    case '^':
-      return leftVal ^ rightVal; // eslint-disable-line no-bitwise
-    case '&':
-      return leftVal & rightVal; // eslint-disable-line no-bitwise
-    case 'in':
-      try {
-        return leftVal in rightVal;
-      } catch (err) {
-        return false;
-      }
-    case 'instanceof':
-      if (typeof rightVal !== 'function') {
-        return false;
-      }
-      return leftVal instanceof rightVal;
-    default:
-      return undefined;
-  }
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/BindExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/BindExpression.js
deleted file mode 100644
index 811ee42..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/BindExpression.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Extractor function for a BindExpression type value node.
- * A bind expression looks like `::this.foo`
- * This will return `this.foo.bind(this)` as the value to indicate its existence,
- * since we can not execute the function this.foo.bind(this) in a static environment.
- *
- * @param - value - AST Value object with type `BindExpression`
- * @returns - The extracted value converted to correct type.
- */
-export default function extractValueFromBindExpression(value) {
-  // eslint-disable-next-line global-require
-  const getValue = require('./index.js').default;
-  const callee = getValue(value.callee);
-
-  // If value.object === null, the callee must be a MemberExpression.
-  // https://github.com/babel/babylon/blob/master/ast/spec.md#bindexpression
-  const object = value.object === null ? getValue(value.callee.object) : getValue(value.object);
-
-  if (value.object && value.object.property) {
-    return `${object}.${callee}.bind(${object})`;
-  }
-
-  return `${callee}.bind(${object})`;
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/CallExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/CallExpression.js
deleted file mode 100644
index 6cdeba9..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/CallExpression.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Extractor function for a CallExpression type value node.
- * A call expression looks like `bar()`
- * This will return `bar` as the value to indicate its existence,
- * since we can not execute the function bar in a static environment.
- *
- * @param - value - AST Value object with type `CallExpression`
- * @returns - The extracted value converted to correct type.
- */
-export default function extractValueFromCallExpression(value) {
-  // eslint-disable-next-line global-require
-  const getValue = require('./index.js').default;
-  return getValue(value.callee);
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/ConditionalExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/ConditionalExpression.js
deleted file mode 100644
index 4a854e5..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/ConditionalExpression.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Extractor function for a ConditionalExpression type value node.
- *
- * @param - value - AST Value object with type `ConditionalExpression`
- * @returns - The extracted value converted to correct type.
- */
-export default function extractValueFromConditionalExpression(value) {
-  // eslint-disable-next-line global-require
-  const getValue = require('./index.js').default;
-  const {
-    test,
-    alternate,
-    consequent,
-  } = value;
-
-  return getValue(test) ? getValue(consequent) : getValue(alternate);
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/FunctionExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/FunctionExpression.js
deleted file mode 100644
index 5f0c6c5..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/FunctionExpression.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * Extractor function for a FunctionExpression type value node.
- * Statically, we can't execute the given function, so just return a function
- * to indicate that the value is present.
- *
- * @param - value - AST Value object with type `FunctionExpression`
- * @returns - The extracted value converted to correct type.
- */
-export default function extractValueFromFunctionExpression(value) {
-  return () => value;
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/Identifier.js b/node_modules/jsx-ast-utils/src/values/expressions/Identifier.js
deleted file mode 100644
index c421575..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/Identifier.js
+++ /dev/null
@@ -1,28 +0,0 @@
-const JS_RESERVED = {
-  Array,
-  Date,
-  Infinity,
-  Math,
-  Number,
-  Object,
-  String,
-  undefined,
-};
-
-/**
- * Extractor function for a Identifier type value node.
- * An Identifier is usually a reference to a variable.
- * Just return variable name to determine its existence.
- *
- * @param - value - AST Value object with type `Identifier`
- * @returns - The extracted value converted to correct type.
- */
-export default function extractValueFromIdentifier(value) {
-  const { name } = value;
-
-  if (Object.hasOwnProperty.call(JS_RESERVED, name)) {
-    return JS_RESERVED[name];
-  }
-
-  return name;
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/LogicalExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/LogicalExpression.js
deleted file mode 100644
index 5b06cd0..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/LogicalExpression.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Extractor function for a LogicalExpression type value node.
- * A logical expression is `a && b` or `a || b`, so we evaluate both sides
- * and return the extracted value of the expression.
- *
- * @param - value - AST Value object with type `LogicalExpression`
- * @returns - The extracted value converted to correct type.
- */
-export default function extractValueFromLogicalExpression(value) {
-  // eslint-disable-next-line global-require
-  const getValue = require('./index.js').default;
-  const { operator, left, right } = value;
-  const leftVal = getValue(left);
-  const rightVal = getValue(right);
-
-  return operator === '&&' ? leftVal && rightVal : leftVal || rightVal;
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/MemberExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/MemberExpression.js
deleted file mode 100644
index 38e31fe..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/MemberExpression.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * Extractor function for a MemberExpression type value node.
- * A member expression is accessing a property on an object `obj.property`.
- *
- * @param - value - AST Value object with type `MemberExpression`
- * @returns - The extracted value converted to correct type
- *  and maintaing `obj.property` convention.
- */
-export default function extractValueFromMemberExpression(value) {
-  // eslint-disable-next-line global-require
-  const getValue = require('./index.js').default;
-  return `${getValue(value.object)}.${getValue(value.property)}`;
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/NewExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/NewExpression.js
deleted file mode 100644
index 5926a57..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/NewExpression.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/**
- * Extractor function for a NewExpression type value node.
- * A new expression instantiates an object with `new` keyword.
- *
- * @returns - an empty object.
- */
-export default function extractValueFromNewExpression() {
-  return new Object(); // eslint-disable-line
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/ObjectExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/ObjectExpression.js
deleted file mode 100644
index a52e807..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/ObjectExpression.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import assign from 'object.assign';
-
-/**
- * Extractor function for an ObjectExpression type value node.
- * An object expression is using {}.
- *
- * @returns - a representation of the object
- */
-export default function extractValueFromObjectExpression(value) {
-  // eslint-disable-next-line global-require
-  const getValue = require('./index.js').default;
-  return value.properties.reduce((obj, property) => {
-    const object = Object.assign({}, obj);
-    // Support types: SpreadProperty and ExperimentalSpreadProperty
-    if (/^(?:Experimental)?Spread(?:Property|Element)$/.test(property.type)) {
-      if (property.argument.type === 'ObjectExpression') {
-        return assign(object, extractValueFromObjectExpression(property.argument));
-      }
-    } else {
-      object[getValue(property.key)] = getValue(property.value);
-    }
-    return object;
-  }, {});
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/OptionalMemberExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/OptionalMemberExpression.js
deleted file mode 100644
index 174c99b..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/OptionalMemberExpression.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * Extractor function for a OptionalMemberExpression type value node.
- * A member expression is accessing a property on an object `obj.property`.
- *
- * @param - value - AST Value object with type `OptionalMemberExpression`
- * @returns - The extracted value converted to correct type
- *  and maintaing `obj?.property` convention.
- */
-export default function extractValueFromOptionalMemberExpression(value) {
-  // eslint-disable-next-line global-require
-  const getValue = require('./index.js').default;
-  return `${getValue(value.object)}?.${getValue(value.property)}`;
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/SpreadElement.js b/node_modules/jsx-ast-utils/src/values/expressions/SpreadElement.js
deleted file mode 100644
index 6caef8a..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/SpreadElement.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * Extractor function for a SpreadElement type value node.
- * We can't statically evaluate an array spread, so just return
- * undefined.
- *
- * @param - value - AST Value object with type `SpreadElement`
- * @returns - An prototypeless object.
- */
-export default function extractValueFromSpreadElement() {
-  return undefined;
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/TaggedTemplateExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/TaggedTemplateExpression.js
deleted file mode 100644
index 8a64ec3..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/TaggedTemplateExpression.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import extractValueFromTemplateLiteral from './TemplateLiteral';
-
-/**
- * Returns the string value of a tagged template literal object.
- * Redirects the bulk of the work to `TemplateLiteral`.
- */
-export default function extractValueFromTaggedTemplateExpression(value) {
-  return extractValueFromTemplateLiteral(value.quasi);
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/TemplateLiteral.js b/node_modules/jsx-ast-utils/src/values/expressions/TemplateLiteral.js
deleted file mode 100644
index 58744c5..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/TemplateLiteral.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Returns the string value of a template literal object.
- * Tries to build it as best as it can based on the passed
- * prop. For instance `This is a ${prop}` will return 'This is a {prop}'.
- *
- * If the template literal builds to undefined (`${undefined}`), then
- * this should return "undefined".
- */
-export default function extractValueFromTemplateLiteral(value) {
-  const {
-    quasis,
-    expressions,
-  } = value;
-  const partitions = quasis.concat(expressions);
-
-  return partitions.sort((a, b) => a.start - b.start).reduce((raw, part) => {
-    const {
-      type,
-    } = part;
-    if (type === 'TemplateElement') {
-      return raw + part.value.raw;
-    }
-
-    if (type === 'Identifier') {
-      return part.name === 'undefined' ? `${raw}${part.name}` : `${raw}{${part.name}}`;
-    }
-
-    if (type.indexOf('Expression') > -1) {
-      return `${raw}{${type}}`;
-    }
-
-    return raw;
-  }, '');
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/ThisExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/ThisExpression.js
deleted file mode 100644
index 1b2b71b..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/ThisExpression.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/**
- * Extractor function for a ThisExpression type value node.
- * A this expression is using `this` as an identifier.
- *
- * @returns - 'this' as a string.
- */
-export default function extractValueFromThisExpression() {
-  return 'this';
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/TypeCastExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/TypeCastExpression.js
deleted file mode 100644
index 005d9dd..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/TypeCastExpression.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * Extractor function for a TypeCastExpression type value node.
- * A type cast expression looks like `(this.handleClick: (event: MouseEvent) => void))`
- * This will return the expression `this.handleClick`.
- *
- * @param - value - AST Value object with type `TypeCastExpression`
- * @returns - The extracted value converted to correct type.
- */
-export default function extractValueFromTypeCastExpression(value) {
-  // eslint-disable-next-line global-require
-  const getValue = require('./index.js').default;
-  return getValue(value.expression);
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/UnaryExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/UnaryExpression.js
deleted file mode 100644
index 7190ff4..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/UnaryExpression.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Extractor function for a UnaryExpression type value node.
- * A unary expression is an expression with a unary operator.
- * For example, !"foobar" will evaluate to false, so this will return false.
- *
- * @param - value - AST Value object with type `UnaryExpression`
- * @returns - The extracted value converted to correct type.
- */
-export default function extractValueFromUnaryExpression(value) {
-  // eslint-disable-next-line global-require
-  const getValue = require('./index.js').default;
-  const { operator, argument } = value;
-
-  switch (operator) {
-    case '-':
-      return -getValue(argument);
-    case '+':
-      return +getValue(argument); // eslint-disable-line no-implicit-coercion
-    case '!':
-      return !getValue(argument);
-    case '~':
-      return ~getValue(argument); // eslint-disable-line no-bitwise
-    case 'delete':
-      // I believe delete statements evaluate to true.
-      return true;
-    case 'typeof':
-    case 'void':
-    default:
-      return undefined;
-  }
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/UpdateExpression.js b/node_modules/jsx-ast-utils/src/values/expressions/UpdateExpression.js
deleted file mode 100644
index 8d9277a..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/UpdateExpression.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Extractor function for an UpdateExpression type value node.
- * An update expression is an expression with an update operator.
- * For example, foo++ will evaluate to foo + 1.
- *
- * @param - value - AST Value object with type `UpdateExpression`
- * @returns - The extracted value converted to correct type.
- */
-export default function extractValueFromUpdateExpression(value) {
-  // eslint-disable-next-line global-require
-  const getValue = require('./index.js').default;
-  const { operator, argument, prefix } = value;
-
-  let val = getValue(argument);
-
-  switch (operator) {
-    case '++':
-      return prefix ? ++val : val++; // eslint-disable-line no-plusplus
-    case '--':
-      return prefix ? --val : val--; // eslint-disable-line no-plusplus
-    default:
-      return undefined;
-  }
-}
diff --git a/node_modules/jsx-ast-utils/src/values/expressions/index.js b/node_modules/jsx-ast-utils/src/values/expressions/index.js
deleted file mode 100644
index fae7600..0000000
--- a/node_modules/jsx-ast-utils/src/values/expressions/index.js
+++ /dev/null
@@ -1,159 +0,0 @@
-import Literal from '../Literal';
-import JSXElement from '../JSXElement';
-import Identifier from './Identifier';
-import TaggedTemplateExpression from './TaggedTemplateExpression';
-import TemplateLiteral from './TemplateLiteral';
-import FunctionExpression from './FunctionExpression';
-import LogicalExpression from './LogicalExpression';
-import MemberExpression from './MemberExpression';
-import OptionalMemberExpression from './OptionalMemberExpression';
-import CallExpression from './CallExpression';
-import UnaryExpression from './UnaryExpression';
-import ThisExpression from './ThisExpression';
-import ConditionalExpression from './ConditionalExpression';
-import BinaryExpression from './BinaryExpression';
-import ObjectExpression from './ObjectExpression';
-import NewExpression from './NewExpression';
-import UpdateExpression from './UpdateExpression';
-import ArrayExpression from './ArrayExpression';
-import BindExpression from './BindExpression';
-import SpreadElement from './SpreadElement';
-import TypeCastExpression from './TypeCastExpression';
-
-// Composition map of types to their extractor functions.
-const TYPES = {
-  Identifier,
-  Literal,
-  JSXElement,
-  TaggedTemplateExpression,
-  TemplateLiteral,
-  ArrowFunctionExpression: FunctionExpression,
-  FunctionExpression,
-  LogicalExpression,
-  MemberExpression,
-  OptionalMemberExpression,
-  CallExpression,
-  UnaryExpression,
-  ThisExpression,
-  ConditionalExpression,
-  BinaryExpression,
-  ObjectExpression,
-  NewExpression,
-  UpdateExpression,
-  ArrayExpression,
-  BindExpression,
-  SpreadElement,
-  TypeCastExpression,
-};
-
-const noop = () => null;
-
-const errorMessage = expression => `The prop value with an expression type of ${expression} could not be resolved. Please file issue to get this fixed immediately.`;
-
-/**
- * This function maps an AST value node
- * to its correct extractor function for its
- * given type.
- *
- * This will map correctly for *all* possible expression types.
- *
- * @param - value - AST Value object with type `JSXExpressionContainer`
- * @returns The extracted value.
- */
-export default function extract(value) {
-  // Value will not have the expression property when we recurse.
-  // The type for expression on ArrowFunctionExpression is a boolean.
-  let expression;
-  if (
-    typeof value.expression !== 'boolean'
-    && value.expression
-  ) {
-    expression = value.expression; // eslint-disable-line prefer-destructuring
-  } else {
-    expression = value;
-  }
-  let { type } = expression;
-
-  while (type === 'TSNonNullExpression' || type === 'TSAsExpression') {
-    ({ type } = expression);
-    if (expression.expression) {
-      ({ expression } = expression);
-    }
-  }
-
-  if (TYPES[type] === undefined) {
-    // eslint-disable-next-line no-console
-    console.error(errorMessage(type));
-    return null;
-  }
-
-  return TYPES[type](expression);
-}
-
-// Composition map of types to their extractor functions to handle literals.
-const LITERAL_TYPES = Object.assign({}, TYPES, {
-  Literal: (value) => {
-    const extractedVal = TYPES.Literal.call(undefined, value);
-    const isNull = extractedVal === null;
-    // This will be convention for attributes that have null
-    // value explicitly defined (<div prop={null} /> maps to 'null').
-    return isNull ? 'null' : extractedVal;
-  },
-  Identifier: (value) => {
-    const isUndefined = TYPES.Identifier.call(undefined, value) === undefined;
-    return isUndefined ? undefined : null;
-  },
-  JSXElement: noop,
-  ArrowFunctionExpression: noop,
-  FunctionExpression: noop,
-  LogicalExpression: noop,
-  MemberExpression: noop,
-  OptionalMemberExpression: noop,
-  CallExpression: noop,
-  UnaryExpression: (value) => {
-    const extractedVal = TYPES.UnaryExpression.call(undefined, value);
-    return extractedVal === undefined ? null : extractedVal;
-  },
-  UpdateExpression: (value) => {
-    const extractedVal = TYPES.UpdateExpression.call(undefined, value);
-    return extractedVal === undefined ? null : extractedVal;
-  },
-  ThisExpression: noop,
-  ConditionalExpression: noop,
-  BinaryExpression: noop,
-  ObjectExpression: noop,
-  NewExpression: noop,
-  ArrayExpression: (value) => {
-    const extractedVal = TYPES.ArrayExpression.call(undefined, value);
-    return extractedVal.filter(val => val !== null);
-  },
-  BindExpression: noop,
-  SpreadElement: noop,
-  TSNonNullExpression: noop,
-  TSAsExpression: noop,
-  TypeCastExpression: noop,
-});
-
-/**
- * This function maps an AST value node
- * to its correct extractor function for its
- * given type.
- *
- * This will map correctly for *some* possible types that map to literals.
- *
- * @param - value - AST Value object with type `JSXExpressionContainer`
- * @returns The extracted value.
- */
-export function extractLiteral(value) {
-  // Value will not have the expression property when we recurse.
-  const expression = value.expression || value;
-  const { type } = expression;
-
-  if (LITERAL_TYPES[type] === undefined) {
-    // eslint-disable-next-line no-console
-    console.error(errorMessage(type));
-    return null;
-  }
-
-  return LITERAL_TYPES[type](expression);
-}
diff --git a/node_modules/jsx-ast-utils/src/values/index.js b/node_modules/jsx-ast-utils/src/values/index.js
deleted file mode 100644
index 630750d..0000000
--- a/node_modules/jsx-ast-utils/src/values/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import Literal from './Literal';
-import JSXElement from './JSXElement';
-import JSXExpressionContainer, { extractLiteral } from './expressions';
-
-// Composition map of types to their extractor functions.
-const TYPES = {
-  Literal,
-  JSXElement,
-  JSXExpressionContainer,
-};
-
-// Composition map of types to their extractor functions to handle literals.
-const LITERAL_TYPES = Object.assign({}, TYPES, {
-  JSXElement: () => null,
-  JSXExpressionContainer: extractLiteral,
-});
-
-/**
- * This function maps an AST value node
- * to its correct extractor function for its
- * given type.
- *
- * This will map correctly for *all* possible types.
- *
- * @param value - AST Value object on a JSX Attribute.
- */
-export default function getValue(value) {
-  return TYPES[value.type](value);
-}
-
-/**
- * This function maps an AST value node
- * to its correct extractor function for its
- * given type.
- *
- * This will map correctly for *some* possible types that map to literals.
- *
- * @param value - AST Value object on a JSX Attribute.
- */
-export function getLiteralValue(value) {
-  return LITERAL_TYPES[value.type](value);
-}
diff --git a/node_modules/load-json-file/node_modules/strip-bom/index.js b/node_modules/load-json-file/node_modules/strip-bom/index.js
deleted file mode 100644
index b00feb9..0000000
--- a/node_modules/load-json-file/node_modules/strip-bom/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-module.exports = x => {
-	if (typeof x !== 'string') {
-		throw new TypeError('Expected a string, got ' + typeof x);
-	}
-
-	// Catches EFBBBF (UTF-8 BOM) because the buffer-to-string
-	// conversion translates it to FEFF (UTF-16 BOM)
-	if (x.charCodeAt(0) === 0xFEFF) {
-		return x.slice(1);
-	}
-
-	return x;
-};
diff --git a/node_modules/load-json-file/node_modules/strip-bom/license b/node_modules/load-json-file/node_modules/strip-bom/license
deleted file mode 100644
index 654d0bf..0000000
--- a/node_modules/load-json-file/node_modules/strip-bom/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-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/node_modules/load-json-file/node_modules/strip-bom/package.json b/node_modules/load-json-file/node_modules/strip-bom/package.json
deleted file mode 100644
index 10f8fdd..0000000
--- a/node_modules/load-json-file/node_modules/strip-bom/package.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "name": "strip-bom",
-  "version": "3.0.0",
-  "description": "Strip UTF-8 byte order mark (BOM) from a string",
-  "license": "MIT",
-  "repository": "sindresorhus/strip-bom",
-  "author": {
-    "name": "Sindre Sorhus",
-    "email": "sindresorhus@gmail.com",
-    "url": "sindresorhus.com"
-  },
-  "engines": {
-    "node": ">=4"
-  },
-  "scripts": {
-    "test": "xo && ava"
-  },
-  "files": [
-    "index.js"
-  ],
-  "keywords": [
-    "strip",
-    "bom",
-    "byte",
-    "order",
-    "mark",
-    "unicode",
-    "utf8",
-    "utf-8",
-    "remove",
-    "delete",
-    "trim",
-    "text",
-    "string"
-  ],
-  "devDependencies": {
-    "ava": "*",
-    "xo": "*"
-  }
-}
diff --git a/node_modules/load-json-file/node_modules/strip-bom/readme.md b/node_modules/load-json-file/node_modules/strip-bom/readme.md
deleted file mode 100644
index 812a980..0000000
--- a/node_modules/load-json-file/node_modules/strip-bom/readme.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# strip-bom [![Build Status](https://travis-ci.org/sindresorhus/strip-bom.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-bom)
-
-> Strip UTF-8 [byte order mark](http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8) (BOM) from a string
-
-From Wikipedia:
-
-> The Unicode Standard permits the BOM in UTF-8, but does not require nor recommend its use. Byte order has no meaning in UTF-8.
-
-
-## Install
-
-```
-$ npm install --save strip-bom
-```
-
-
-## Usage
-
-```js
-const stripBom = require('strip-bom');
-
-stripBom('\uFEFFunicorn');
-//=> 'unicorn'
-```
-
-
-## Related
-
-- [strip-bom-cli](https://github.com/sindresorhus/strip-bom-cli) - CLI for this module
-- [strip-bom-buf](https://github.com/sindresorhus/strip-bom-buf) - Buffer version of this module
-- [strip-bom-stream](https://github.com/sindresorhus/strip-bom-stream) - Stream version of this module
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/loose-envify/LICENSE b/node_modules/loose-envify/LICENSE
deleted file mode 100644
index fbafb48..0000000
--- a/node_modules/loose-envify/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Andres Suarez <zertosh@gmail.com>
-
-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/node_modules/loose-envify/README.md b/node_modules/loose-envify/README.md
deleted file mode 100644
index 7f4e07b..0000000
--- a/node_modules/loose-envify/README.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# loose-envify
-
-[![Build Status](https://travis-ci.org/zertosh/loose-envify.svg?branch=master)](https://travis-ci.org/zertosh/loose-envify)
-
-Fast (and loose) selective `process.env` replacer using [js-tokens](https://github.com/lydell/js-tokens) instead of an AST. Works just like [envify](https://github.com/hughsk/envify) but much faster.
-
-## Gotchas
-
-* Doesn't handle broken syntax.
-* Doesn't look inside embedded expressions in template strings.
-  - **this won't work:**
-  ```js
-  console.log(`the current env is ${process.env.NODE_ENV}`);
-  ```
-* Doesn't replace oddly-spaced or oddly-commented expressions.
-  - **this won't work:**
-  ```js
-  console.log(process./*won't*/env./*work*/NODE_ENV);
-  ```
-
-## Usage/Options
-
-loose-envify has the exact same interface as [envify](https://github.com/hughsk/envify), including the CLI.
-
-## Benchmark
-
-```
-envify:
-
-  $ for i in {1..5}; do node bench/bench.js 'envify'; done
-  708ms
-  727ms
-  791ms
-  719ms
-  720ms
-
-loose-envify:
-
-  $ for i in {1..5}; do node bench/bench.js '../'; done
-  51ms
-  52ms
-  52ms
-  52ms
-  52ms
-```
diff --git a/node_modules/loose-envify/cli.js b/node_modules/loose-envify/cli.js
deleted file mode 100755
index c0b63cb..0000000
--- a/node_modules/loose-envify/cli.js
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env node
-'use strict';
-
-var looseEnvify = require('./');
-var fs = require('fs');
-
-if (process.argv[2]) {
-  fs.createReadStream(process.argv[2], {encoding: 'utf8'})
-    .pipe(looseEnvify(process.argv[2]))
-    .pipe(process.stdout);
-} else {
-  process.stdin.resume()
-  process.stdin
-    .pipe(looseEnvify(__filename))
-    .pipe(process.stdout);
-}
diff --git a/node_modules/loose-envify/custom.js b/node_modules/loose-envify/custom.js
deleted file mode 100644
index 6389bfa..0000000
--- a/node_modules/loose-envify/custom.js
+++ /dev/null
@@ -1,4 +0,0 @@
-// envify compatibility
-'use strict';
-
-module.exports = require('./loose-envify');
diff --git a/node_modules/loose-envify/index.js b/node_modules/loose-envify/index.js
deleted file mode 100644
index 8cd8305..0000000
--- a/node_modules/loose-envify/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-'use strict';
-
-module.exports = require('./loose-envify')(process.env);
diff --git a/node_modules/loose-envify/loose-envify.js b/node_modules/loose-envify/loose-envify.js
deleted file mode 100644
index b5a5be2..0000000
--- a/node_modules/loose-envify/loose-envify.js
+++ /dev/null
@@ -1,36 +0,0 @@
-'use strict';
-
-var stream = require('stream');
-var util = require('util');
-var replace = require('./replace');
-
-var jsonExtRe = /\.json$/;
-
-module.exports = function(rootEnv) {
-  rootEnv = rootEnv || process.env;
-  return function (file, trOpts) {
-    if (jsonExtRe.test(file)) {
-      return stream.PassThrough();
-    }
-    var envs = trOpts ? [rootEnv, trOpts] : [rootEnv];
-    return new LooseEnvify(envs);
-  };
-};
-
-function LooseEnvify(envs) {
-  stream.Transform.call(this);
-  this._data = '';
-  this._envs = envs;
-}
-util.inherits(LooseEnvify, stream.Transform);
-
-LooseEnvify.prototype._transform = function(buf, enc, cb) {
-  this._data += buf;
-  cb();
-};
-
-LooseEnvify.prototype._flush = function(cb) {
-  var replaced = replace(this._data, this._envs);
-  this.push(replaced);
-  cb();
-};
diff --git a/node_modules/loose-envify/package.json b/node_modules/loose-envify/package.json
deleted file mode 100644
index 5e3d0e2..0000000
--- a/node_modules/loose-envify/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "name": "loose-envify",
-  "version": "1.4.0",
-  "description": "Fast (and loose) selective `process.env` replacer using js-tokens instead of an AST",
-  "keywords": [
-    "environment",
-    "variables",
-    "browserify",
-    "browserify-transform",
-    "transform",
-    "source",
-    "configuration"
-  ],
-  "homepage": "https://github.com/zertosh/loose-envify",
-  "license": "MIT",
-  "author": "Andres Suarez <zertosh@gmail.com>",
-  "main": "index.js",
-  "bin": {
-    "loose-envify": "cli.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/zertosh/loose-envify.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "dependencies": {
-    "js-tokens": "^3.0.0 || ^4.0.0"
-  },
-  "devDependencies": {
-    "browserify": "^13.1.1",
-    "envify": "^3.4.0",
-    "tap": "^8.0.0"
-  }
-}
diff --git a/node_modules/loose-envify/replace.js b/node_modules/loose-envify/replace.js
deleted file mode 100644
index ec15e81..0000000
--- a/node_modules/loose-envify/replace.js
+++ /dev/null
@@ -1,65 +0,0 @@
-'use strict';
-
-var jsTokens = require('js-tokens').default;
-
-var processEnvRe = /\bprocess\.env\.[_$a-zA-Z][$\w]+\b/;
-var spaceOrCommentRe = /^(?:\s|\/[/*])/;
-
-function replace(src, envs) {
-  if (!processEnvRe.test(src)) {
-    return src;
-  }
-
-  var out = [];
-  var purge = envs.some(function(env) {
-    return env._ && env._.indexOf('purge') !== -1;
-  });
-
-  jsTokens.lastIndex = 0
-  var parts = src.match(jsTokens);
-
-  for (var i = 0; i < parts.length; i++) {
-    if (parts[i    ] === 'process' &&
-        parts[i + 1] === '.' &&
-        parts[i + 2] === 'env' &&
-        parts[i + 3] === '.') {
-      var prevCodeToken = getAdjacentCodeToken(-1, parts, i);
-      var nextCodeToken = getAdjacentCodeToken(1, parts, i + 4);
-      var replacement = getReplacementString(envs, parts[i + 4], purge);
-      if (prevCodeToken !== '.' &&
-          nextCodeToken !== '.' &&
-          nextCodeToken !== '=' &&
-          typeof replacement === 'string') {
-        out.push(replacement);
-        i += 4;
-        continue;
-      }
-    }
-    out.push(parts[i]);
-  }
-
-  return out.join('');
-}
-
-function getAdjacentCodeToken(dir, parts, i) {
-  while (true) {
-    var part = parts[i += dir];
-    if (!spaceOrCommentRe.test(part)) {
-      return part;
-    }
-  }
-}
-
-function getReplacementString(envs, name, purge) {
-  for (var j = 0; j < envs.length; j++) {
-    var env = envs[j];
-    if (typeof env[name] !== 'undefined') {
-      return JSON.stringify(env[name]);
-    }
-  }
-  if (purge) {
-    return 'undefined';
-  }
-}
-
-module.exports = replace;
diff --git a/node_modules/mute-stream/README.md b/node_modules/mute-stream/README.md
deleted file mode 100644
index 8ab1238..0000000
--- a/node_modules/mute-stream/README.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# mute-stream
-
-Bytes go in, but they don't come out (when muted).
-
-This is a basic pass-through stream, but when muted, the bytes are
-silently dropped, rather than being passed through.
-
-## Usage
-
-```javascript
-var MuteStream = require('mute-stream')
-
-var ms = new MuteStream(options)
-
-ms.pipe(process.stdout)
-ms.write('foo') // writes 'foo' to stdout
-ms.mute()
-ms.write('bar') // does not write 'bar'
-ms.unmute()
-ms.write('baz') // writes 'baz' to stdout
-
-// can also be used to mute incoming data
-var ms = new MuteStream
-input.pipe(ms)
-
-ms.on('data', function (c) {
-  console.log('data: ' + c)
-})
-
-input.emit('data', 'foo') // logs 'foo'
-ms.mute()
-input.emit('data', 'bar') // does not log 'bar'
-ms.unmute()
-input.emit('data', 'baz') // logs 'baz'
-```
-
-## Options
-
-All options are optional.
-
-* `replace` Set to a string to replace each character with the
-  specified string when muted.  (So you can show `****` instead of the
-  password, for example.)
-
-* `prompt` If you are using a replacement char, and also using a
-  prompt with a readline stream (as for a `Password: *****` input),
-  then specify what the prompt is so that backspace will work
-  properly.  Otherwise, pressing backspace will overwrite the prompt
-  with the replacement character, which is weird.
-
-## ms.mute()
-
-Set `muted` to `true`.  Turns `.write()` into a no-op.
-
-## ms.unmute()
-
-Set `muted` to `false`
-
-## ms.isTTY
-
-True if the pipe destination is a TTY, or if the incoming pipe source is
-a TTY.
-
-## Other stream methods...
-
-The other standard readable and writable stream methods are all
-available.  The MuteStream object acts as a facade to its pipe source
-and destination.
diff --git a/node_modules/mute-stream/mute.js b/node_modules/mute-stream/mute.js
deleted file mode 100644
index a24fc09..0000000
--- a/node_modules/mute-stream/mute.js
+++ /dev/null
@@ -1,145 +0,0 @@
-var Stream = require('stream')
-
-module.exports = MuteStream
-
-// var out = new MuteStream(process.stdout)
-// argument auto-pipes
-function MuteStream (opts) {
-  Stream.apply(this)
-  opts = opts || {}
-  this.writable = this.readable = true
-  this.muted = false
-  this.on('pipe', this._onpipe)
-  this.replace = opts.replace
-
-  // For readline-type situations
-  // This much at the start of a line being redrawn after a ctrl char
-  // is seen (such as backspace) won't be redrawn as the replacement
-  this._prompt = opts.prompt || null
-  this._hadControl = false
-}
-
-MuteStream.prototype = Object.create(Stream.prototype)
-
-Object.defineProperty(MuteStream.prototype, 'constructor', {
-  value: MuteStream,
-  enumerable: false
-})
-
-MuteStream.prototype.mute = function () {
-  this.muted = true
-}
-
-MuteStream.prototype.unmute = function () {
-  this.muted = false
-}
-
-Object.defineProperty(MuteStream.prototype, '_onpipe', {
-  value: onPipe,
-  enumerable: false,
-  writable: true,
-  configurable: true
-})
-
-function onPipe (src) {
-  this._src = src
-}
-
-Object.defineProperty(MuteStream.prototype, 'isTTY', {
-  get: getIsTTY,
-  set: setIsTTY,
-  enumerable: true,
-  configurable: true
-})
-
-function getIsTTY () {
-  return( (this._dest) ? this._dest.isTTY
-        : (this._src) ? this._src.isTTY
-        : false
-        )
-}
-
-// basically just get replace the getter/setter with a regular value
-function setIsTTY (isTTY) {
-  Object.defineProperty(this, 'isTTY', {
-    value: isTTY,
-    enumerable: true,
-    writable: true,
-    configurable: true
-  })
-}
-
-Object.defineProperty(MuteStream.prototype, 'rows', {
-  get: function () {
-    return( this._dest ? this._dest.rows
-          : this._src ? this._src.rows
-          : undefined )
-  }, enumerable: true, configurable: true })
-
-Object.defineProperty(MuteStream.prototype, 'columns', {
-  get: function () {
-    return( this._dest ? this._dest.columns
-          : this._src ? this._src.columns
-          : undefined )
-  }, enumerable: true, configurable: true })
-
-
-MuteStream.prototype.pipe = function (dest, options) {
-  this._dest = dest
-  return Stream.prototype.pipe.call(this, dest, options)
-}
-
-MuteStream.prototype.pause = function () {
-  if (this._src) return this._src.pause()
-}
-
-MuteStream.prototype.resume = function () {
-  if (this._src) return this._src.resume()
-}
-
-MuteStream.prototype.write = function (c) {
-  if (this.muted) {
-    if (!this.replace) return true
-    if (c.match(/^\u001b/)) {
-      if(c.indexOf(this._prompt) === 0) {
-        c = c.substr(this._prompt.length);
-        c = c.replace(/./g, this.replace);
-        c = this._prompt + c;
-      }
-      this._hadControl = true
-      return this.emit('data', c)
-    } else {
-      if (this._prompt && this._hadControl &&
-          c.indexOf(this._prompt) === 0) {
-        this._hadControl = false
-        this.emit('data', this._prompt)
-        c = c.substr(this._prompt.length)
-      }
-      c = c.toString().replace(/./g, this.replace)
-    }
-  }
-  this.emit('data', c)
-}
-
-MuteStream.prototype.end = function (c) {
-  if (this.muted) {
-    if (c && this.replace) {
-      c = c.toString().replace(/./g, this.replace)
-    } else {
-      c = null
-    }
-  }
-  if (c) this.emit('data', c)
-  this.emit('end')
-}
-
-function proxy (fn) { return function () {
-  var d = this._dest
-  var s = this._src
-  if (d && d[fn]) d[fn].apply(d, arguments)
-  if (s && s[fn]) s[fn].apply(s, arguments)
-}}
-
-MuteStream.prototype.destroy = proxy('destroy')
-MuteStream.prototype.destroySoon = proxy('destroySoon')
-MuteStream.prototype.close = proxy('close')
diff --git a/node_modules/mute-stream/package.json b/node_modules/mute-stream/package.json
deleted file mode 100644
index 56ebb36..0000000
--- a/node_modules/mute-stream/package.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  "name": "mute-stream",
-  "version": "0.0.8",
-  "main": "mute.js",
-  "directories": {
-    "test": "test"
-  },
-  "devDependencies": {
-    "tap": "^12.1.1"
-  },
-  "scripts": {
-    "test": "tap test/*.js --cov"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/mute-stream"
-  },
-  "keywords": [
-    "mute",
-    "stream",
-    "pipe"
-  ],
-  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
-  "license": "ISC",
-  "description": "Bytes go in, but they don't come out (when muted).",
-  "files": [
-    "mute.js"
-  ]
-}
diff --git a/node_modules/node-fetch/CHANGELOG.md b/node_modules/node-fetch/CHANGELOG.md
index 188fcd3..543d3d9 100644
--- a/node_modules/node-fetch/CHANGELOG.md
+++ b/node_modules/node-fetch/CHANGELOG.md
@@ -5,6 +5,12 @@
 
 # 2.x release
 
+## v2.6.1
+
+**This is an important security release. It is strongly recommended to update as soon as possible.**
+
+- Fix: honor the `size` option after following a redirect.
+
 ## v2.6.0
 
 - Enhance: `options.agent`, it now accepts a function that returns custom http(s).Agent instance based on current URL, see readme for more information.
diff --git a/node_modules/node-fetch/README.md b/node_modules/node-fetch/README.md
index cb19901..2dde742 100644
--- a/node_modules/node-fetch/README.md
+++ b/node_modules/node-fetch/README.md
@@ -5,11 +5,14 @@
 [![build status][travis-image]][travis-url]
 [![coverage status][codecov-image]][codecov-url]
 [![install size][install-size-image]][install-size-url]
+[![Discord][discord-image]][discord-url]
 
 A light-weight module that brings `window.fetch` to Node.js
 
 (We are looking for [v2 maintainers and collaborators](https://github.com/bitinn/node-fetch/issues/567))
 
+[![Backers][opencollective-image]][opencollective-url]
+
 <!-- TOC -->
 
 - [Motivation](#motivation)
@@ -48,7 +51,7 @@
 
 ## Motivation
 
-Instead of implementing `XMLHttpRequest` in Node.js to run browser-specific [Fetch polyfill](https://github.com/github/fetch), why not go from native `http` to `fetch` API directly? Hence `node-fetch`, minimal code for a `window.fetch` compatible API on Node.js runtime.
+Instead of implementing `XMLHttpRequest` in Node.js to run browser-specific [Fetch polyfill](https://github.com/github/fetch), why not go from native `http` to `fetch` API directly? Hence, `node-fetch`, minimal code for a `window.fetch` compatible API on Node.js runtime.
 
 See Matt Andrews' [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch) or Leonardo Quixada's [cross-fetch](https://github.com/lquixada/cross-fetch) for isomorphic usage (exports `node-fetch` for server-side, `whatwg-fetch` for client-side).
 
@@ -56,9 +59,9 @@
 
 - Stay consistent with `window.fetch` API.
 - Make conscious trade-off when following [WHATWG fetch spec][whatwg-fetch] and [stream spec](https://streams.spec.whatwg.org/) implementation details, document known differences.
-- Use native promise, but allow substituting it with [insert your favorite promise library].
-- Use native Node streams for body, on both request and response.
-- Decode content encoding (gzip/deflate) properly, and convert string output (such as `res.text()` and `res.json()`) to UTF-8 automatically.
+- Use native promise but allow substituting it with [insert your favorite promise library].
+- Use native Node streams for body on both request and response.
+- Decode content encoding (gzip/deflate) properly and convert string output (such as `res.text()` and `res.json()`) to UTF-8 automatically.
 - Useful extensions such as timeout, redirect limit, response size limit, [explicit errors](ERROR-HANDLING.md) for troubleshooting.
 
 ## Difference from client-side fetch
@@ -72,16 +75,16 @@
 Current stable release (`2.x`)
 
 ```sh
-$ npm install node-fetch --save
+$ npm install node-fetch
 ```
 
 ## Loading and configuring the module
-We suggest you load the module via `require`, pending the stabalizing of es modules in node:
+We suggest you load the module via `require` until the stabilization of ES modules in node:
 ```js
 const fetch = require('node-fetch');
 ```
 
-If you are using a Promise library other than native, set it through fetch.Promise:
+If you are using a Promise library other than native, set it through `fetch.Promise`:
 ```js
 const Bluebird = require('bluebird');
 
@@ -90,7 +93,7 @@
 
 ## Common Usage
 
-NOTE: The documentation below is up-to-date with `2.x` releases, [see `1.x` readme](https://github.com/bitinn/node-fetch/blob/1.x/README.md), [changelog](https://github.com/bitinn/node-fetch/blob/1.x/CHANGELOG.md) and [2.x upgrade guide](UPGRADE-GUIDE.md) for the differences.
+NOTE: The documentation below is up-to-date with `2.x` releases; see the [`1.x` readme](https://github.com/bitinn/node-fetch/blob/1.x/README.md), [changelog](https://github.com/bitinn/node-fetch/blob/1.x/CHANGELOG.md) and [2.x upgrade guide](UPGRADE-GUIDE.md) for the differences.
 
 #### Plain text or HTML
 ```js
@@ -146,9 +149,9 @@
 ```
 
 #### Handling exceptions
-NOTE: 3xx-5xx responses are *NOT* exceptions, and should be handled in `then()`, see the next section.
+NOTE: 3xx-5xx responses are *NOT* exceptions and should be handled in `then()`; see the next section for more information.
 
-Adding a catch to the fetch promise chain will catch *all* exceptions, such as errors originating from node core libraries, like network errors, and operational errors which are instances of FetchError. See the [error handling document](ERROR-HANDLING.md)  for more details.
+Adding a catch to the fetch promise chain will catch *all* exceptions, such as errors originating from node core libraries, network errors and operational errors, which are instances of FetchError. See the [error handling document](ERROR-HANDLING.md)  for more details.
 
 ```js
 fetch('https://domain.invalid/')
@@ -186,7 +189,7 @@
 ```
 
 #### Buffer
-If you prefer to cache binary data in full, use buffer(). (NOTE: buffer() is a `node-fetch` only API)
+If you prefer to cache binary data in full, use buffer(). (NOTE: `buffer()` is a `node-fetch`-only API)
 
 ```js
 const fileType = require('file-type');
@@ -211,7 +214,7 @@
 
 #### Extract Set-Cookie Header
 
-Unlike browsers, you can access raw `Set-Cookie` headers manually using `Headers.raw()`, this is a `node-fetch` only API.
+Unlike browsers, you can access raw `Set-Cookie` headers manually using `Headers.raw()`. This is a `node-fetch` only API.
 
 ```js
 fetch(url).then(res => {
@@ -263,11 +266,11 @@
 
 #### Request cancellation with AbortSignal
 
-> NOTE: You may only cancel streamed requests on Node >= v8.0.0
+> NOTE: You may cancel streamed requests only on Node >= v8.0.0
 
 You may cancel requests with `AbortController`. A suggested implementation is [`abort-controller`](https://www.npmjs.com/package/abort-controller).
 
-An example of timing out a request after 150ms could be achieved as follows:
+An example of timing out a request after 150ms could be achieved as the following:
 
 ```js
 import AbortController from 'abort-controller';
@@ -308,7 +311,7 @@
 
 Perform an HTTP(S) fetch.
 
-`url` should be an absolute url, such as `https://example.com/`. A path-relative URL (`/file/under/root`) or protocol-relative URL (`//can-be-http-or-https.com/`) will result in a rejected promise.
+`url` should be an absolute url, such as `https://example.com/`. A path-relative URL (`/file/under/root`) or protocol-relative URL (`//can-be-http-or-https.com/`) will result in a rejected `Promise`.
 
 <a id="fetch-options"></a>
 ### Options
@@ -350,7 +353,7 @@
 
 ##### Custom Agent
 
-The `agent` option allows you to specify networking related options that's out of the scope of Fetch. Including and not limit to:
+The `agent` option allows you to specify networking related options which are out of the scope of Fetch, including and not limited to the following:
 
 - Support self-signed certificate
 - Use only IPv4 or IPv6
@@ -358,7 +361,7 @@
 
 See [`http.Agent`](https://nodejs.org/api/http.html#http_new_agent_options) for more information.
 
-In addition, `agent` option accepts a function that returns http(s).Agent instance given current [URL](https://nodejs.org/api/url.html), this is useful during a redirection chain across HTTP and HTTPS protocol.
+In addition, the `agent` option accepts a function that returns `http`(s)`.Agent` instance given current [URL](https://nodejs.org/api/url.html), this is useful during a redirection chain across HTTP and HTTPS protocol.
 
 ```js
 const httpAgent = new http.Agent({
@@ -432,7 +435,7 @@
 
 <small>*(spec-compliant)*</small>
 
-- `body` A string or [Readable stream][node-readable]
+- `body` A `String` or [`Readable` stream][node-readable]
 - `options` A [`ResponseInit`][response-init] options dictionary
 
 Constructs a new `Response` object. The constructor is identical to that in the [browser](https://developer.mozilla.org/en-US/docs/Web/API/Response/Response).
@@ -462,7 +465,7 @@
 
 - `init` Optional argument to pre-fill the `Headers` object
 
-Construct a new `Headers` object. `init` can be either `null`, a `Headers` object, an key-value map object, or any iterable object.
+Construct a new `Headers` object. `init` can be either `null`, a `Headers` object, an key-value map object or any iterable object.
 
 ```js
 // Example adapted from https://fetch.spec.whatwg.org/#example-headers-class
@@ -503,7 +506,7 @@
 
 * Node.js [`Readable` stream][node-readable]
 
-The data encapsulated in the `Body` object. Note that while the [Fetch Standard][whatwg-fetch] requires the property to always be a WHATWG `ReadableStream`, in node-fetch it is a Node.js [`Readable` stream][node-readable].
+Data are encapsulated in the `Body` object. Note that while the [Fetch Standard][whatwg-fetch] requires the property to always be a WHATWG `ReadableStream`, in node-fetch it is a Node.js [`Readable` stream][node-readable].
 
 #### body.bodyUsed
 
@@ -511,7 +514,7 @@
 
 * `Boolean`
 
-A boolean property for if this body has been consumed. Per spec, a consumed body cannot be used again.
+A boolean property for if this body has been consumed. Per the specs, a consumed body cannot be used again.
 
 #### body.arrayBuffer()
 #### body.blob()
@@ -538,9 +541,9 @@
 
 * Returns: <code>Promise&lt;String&gt;</code>
 
-Identical to `body.text()`, except instead of always converting to UTF-8, encoding sniffing will be performed and text converted to UTF-8, if possible.
+Identical to `body.text()`, except instead of always converting to UTF-8, encoding sniffing will be performed and text converted to UTF-8 if possible.
 
-(This API requires an optional dependency on npm package [encoding](https://www.npmjs.com/package/encoding), which you need to install manually. `webpack` users may see [a warning message](https://github.com/bitinn/node-fetch/issues/412#issuecomment-379007792) due to this optional dependency.)
+(This API requires an optional dependency of the npm package [encoding](https://www.npmjs.com/package/encoding), which you need to install manually. `webpack` users may see [a warning message](https://github.com/bitinn/node-fetch/issues/412#issuecomment-379007792) due to this optional dependency.)
 
 <a id="class-fetcherror"></a>
 ### Class: FetchError
@@ -574,6 +577,10 @@
 [codecov-url]: https://codecov.io/gh/bitinn/node-fetch
 [install-size-image]: https://flat.badgen.net/packagephobia/install/node-fetch
 [install-size-url]: https://packagephobia.now.sh/result?p=node-fetch
+[discord-image]: https://img.shields.io/discord/619915844268326952?color=%237289DA&label=Discord&style=flat-square
+[discord-url]: https://discord.gg/Zxbndcm
+[opencollective-image]: https://opencollective.com/node-fetch/backers.svg
+[opencollective-url]: https://opencollective.com/node-fetch
 [whatwg-fetch]: https://fetch.spec.whatwg.org/
 [response-init]: https://fetch.spec.whatwg.org/#responseinit
 [node-readable]: https://nodejs.org/api/stream.html#stream_readable_streams
diff --git a/node_modules/node-fetch/browser.js b/node_modules/node-fetch/browser.js
index 0ad5de0..83c54c5 100644
--- a/node_modules/node-fetch/browser.js
+++ b/node_modules/node-fetch/browser.js
@@ -16,7 +16,9 @@
 module.exports = exports = global.fetch;
 
 // Needed for TypeScript and Webpack.
-exports.default = global.fetch.bind(global);
+if (global.fetch) {
+	exports.default = global.fetch.bind(global);
+}
 
 exports.Headers = global.Headers;
 exports.Request = global.Request;
diff --git a/node_modules/node-fetch/lib/index.es.js b/node_modules/node-fetch/lib/index.es.js
index 37d022c..61906c9 100644
--- a/node_modules/node-fetch/lib/index.es.js
+++ b/node_modules/node-fetch/lib/index.es.js
@@ -461,6 +461,12 @@
 	// html4
 	if (!res && str) {
 		res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str);
+		if (!res) {
+			res = /<meta[\s]+?content=(['"])(.+?)\1[\s]+?http-equiv=(['"])content-type\3/i.exec(str);
+			if (res) {
+				res.pop(); // drop last quote
+			}
+		}
 
 		if (res) {
 			res = /charset=(.*)/i.exec(res.pop());
@@ -1468,7 +1474,7 @@
 				// HTTP fetch step 5.5
 				switch (request.redirect) {
 					case 'error':
-						reject(new FetchError(`redirect mode is set to error: ${request.url}`, 'no-redirect'));
+						reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));
 						finalize();
 						return;
 					case 'manual':
@@ -1507,7 +1513,8 @@
 							method: request.method,
 							body: request.body,
 							signal: request.signal,
-							timeout: request.timeout
+							timeout: request.timeout,
+							size: request.size
 						};
 
 						// HTTP-redirect fetch step 9
diff --git a/node_modules/node-fetch/lib/index.js b/node_modules/node-fetch/lib/index.js
index daa44bc..4b241bf 100644
--- a/node_modules/node-fetch/lib/index.js
+++ b/node_modules/node-fetch/lib/index.js
@@ -465,6 +465,12 @@
 	// html4
 	if (!res && str) {
 		res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str);
+		if (!res) {
+			res = /<meta[\s]+?content=(['"])(.+?)\1[\s]+?http-equiv=(['"])content-type\3/i.exec(str);
+			if (res) {
+				res.pop(); // drop last quote
+			}
+		}
 
 		if (res) {
 			res = /charset=(.*)/i.exec(res.pop());
@@ -1472,7 +1478,7 @@
 				// HTTP fetch step 5.5
 				switch (request.redirect) {
 					case 'error':
-						reject(new FetchError(`redirect mode is set to error: ${request.url}`, 'no-redirect'));
+						reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));
 						finalize();
 						return;
 					case 'manual':
@@ -1511,7 +1517,8 @@
 							method: request.method,
 							body: request.body,
 							signal: request.signal,
-							timeout: request.timeout
+							timeout: request.timeout,
+							size: request.size
 						};
 
 						// HTTP-redirect fetch step 9
diff --git a/node_modules/node-fetch/lib/index.mjs b/node_modules/node-fetch/lib/index.mjs
index e571ea6..ecf59af 100644
--- a/node_modules/node-fetch/lib/index.mjs
+++ b/node_modules/node-fetch/lib/index.mjs
@@ -459,6 +459,12 @@
 	// html4
 	if (!res && str) {
 		res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str);
+		if (!res) {
+			res = /<meta[\s]+?content=(['"])(.+?)\1[\s]+?http-equiv=(['"])content-type\3/i.exec(str);
+			if (res) {
+				res.pop(); // drop last quote
+			}
+		}
 
 		if (res) {
 			res = /charset=(.*)/i.exec(res.pop());
@@ -1466,7 +1472,7 @@
 				// HTTP fetch step 5.5
 				switch (request.redirect) {
 					case 'error':
-						reject(new FetchError(`redirect mode is set to error: ${request.url}`, 'no-redirect'));
+						reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));
 						finalize();
 						return;
 					case 'manual':
@@ -1505,7 +1511,8 @@
 							method: request.method,
 							body: request.body,
 							signal: request.signal,
-							timeout: request.timeout
+							timeout: request.timeout,
+							size: request.size
 						};
 
 						// HTTP-redirect fetch step 9
diff --git a/node_modules/node-fetch/package.json b/node_modules/node-fetch/package.json
index 8e5c883..2160469 100644
--- a/node_modules/node-fetch/package.json
+++ b/node_modules/node-fetch/package.json
@@ -1,66 +1,66 @@
 {
-  "name": "node-fetch",
-  "version": "2.6.0",
-  "description": "A light-weight module that brings window.fetch to node.js",
-  "main": "lib/index",
-  "browser": "./browser.js",
-  "module": "lib/index.mjs",
-  "files": [
-    "lib/index.js",
-    "lib/index.mjs",
-    "lib/index.es.js",
-    "browser.js"
-  ],
-  "engines": {
-    "node": "4.x || >=6.0.0"
-  },
-  "scripts": {
-    "build": "cross-env BABEL_ENV=rollup rollup -c",
-    "prepare": "npm run build",
-    "test": "cross-env BABEL_ENV=test mocha --require babel-register --throw-deprecation test/test.js",
-    "report": "cross-env BABEL_ENV=coverage nyc --reporter lcov --reporter text mocha -R spec test/test.js",
-    "coverage": "cross-env BABEL_ENV=coverage nyc --reporter json --reporter text mocha -R spec test/test.js && codecov -f coverage/coverage-final.json"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/bitinn/node-fetch.git"
-  },
-  "keywords": [
-    "fetch",
-    "http",
-    "promise"
-  ],
-  "author": "David Frank",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/bitinn/node-fetch/issues"
-  },
-  "homepage": "https://github.com/bitinn/node-fetch",
-  "devDependencies": {
-    "@ungap/url-search-params": "^0.1.2",
-    "abort-controller": "^1.1.0",
-    "abortcontroller-polyfill": "^1.3.0",
-    "babel-core": "^6.26.3",
-    "babel-plugin-istanbul": "^4.1.6",
-    "babel-preset-env": "^1.6.1",
-    "babel-register": "^6.16.3",
-    "chai": "^3.5.0",
-    "chai-as-promised": "^7.1.1",
-    "chai-iterator": "^1.1.1",
-    "chai-string": "~1.3.0",
-    "codecov": "^3.3.0",
-    "cross-env": "^5.2.0",
-    "form-data": "^2.3.3",
-    "is-builtin-module": "^1.0.0",
-    "mocha": "^5.0.0",
-    "nyc": "11.9.0",
-    "parted": "^0.1.1",
-    "promise": "^8.0.3",
-    "resumer": "0.0.0",
-    "rollup": "^0.63.4",
-    "rollup-plugin-babel": "^3.0.7",
-    "string-to-arraybuffer": "^1.0.2",
-    "whatwg-url": "^5.0.0"
-  },
-  "dependencies": {}
+    "name": "node-fetch",
+    "version": "2.6.1",
+    "description": "A light-weight module that brings window.fetch to node.js",
+    "main": "lib/index",
+    "browser": "./browser.js",
+    "module": "lib/index.mjs",
+    "files": [
+        "lib/index.js",
+        "lib/index.mjs",
+        "lib/index.es.js",
+        "browser.js"
+    ],
+    "engines": {
+        "node": "4.x || >=6.0.0"
+    },
+    "scripts": {
+        "build": "cross-env BABEL_ENV=rollup rollup -c",
+        "prepare": "npm run build",
+        "test": "cross-env BABEL_ENV=test mocha --require babel-register --throw-deprecation test/test.js",
+        "report": "cross-env BABEL_ENV=coverage nyc --reporter lcov --reporter text mocha -R spec test/test.js",
+        "coverage": "cross-env BABEL_ENV=coverage nyc --reporter json --reporter text mocha -R spec test/test.js && codecov -f coverage/coverage-final.json"
+    },
+    "repository": {
+        "type": "git",
+        "url": "https://github.com/bitinn/node-fetch.git"
+    },
+    "keywords": [
+        "fetch",
+        "http",
+        "promise"
+    ],
+    "author": "David Frank",
+    "license": "MIT",
+    "bugs": {
+        "url": "https://github.com/bitinn/node-fetch/issues"
+    },
+    "homepage": "https://github.com/bitinn/node-fetch",
+    "devDependencies": {
+        "@ungap/url-search-params": "^0.1.2",
+        "abort-controller": "^1.1.0",
+        "abortcontroller-polyfill": "^1.3.0",
+        "babel-core": "^6.26.3",
+        "babel-plugin-istanbul": "^4.1.6",
+        "babel-preset-env": "^1.6.1",
+        "babel-register": "^6.16.3",
+        "chai": "^3.5.0",
+        "chai-as-promised": "^7.1.1",
+        "chai-iterator": "^1.1.1",
+        "chai-string": "~1.3.0",
+        "codecov": "^3.3.0",
+        "cross-env": "^5.2.0",
+        "form-data": "^2.3.3",
+        "is-builtin-module": "^1.0.0",
+        "mocha": "^5.0.0",
+        "nyc": "11.9.0",
+        "parted": "^0.1.1",
+        "promise": "^8.0.3",
+        "resumer": "0.0.0",
+        "rollup": "^0.63.4",
+        "rollup-plugin-babel": "^3.0.7",
+        "string-to-arraybuffer": "^1.0.2",
+        "whatwg-url": "^5.0.0"
+    },
+    "dependencies": {}
 }
diff --git a/node_modules/object-assign/index.js b/node_modules/object-assign/index.js
deleted file mode 100644
index 0930cf8..0000000
--- a/node_modules/object-assign/index.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
-object-assign
-(c) Sindre Sorhus
-@license MIT
-*/
-
-'use strict';
-/* eslint-disable no-unused-vars */
-var getOwnPropertySymbols = Object.getOwnPropertySymbols;
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-var propIsEnumerable = Object.prototype.propertyIsEnumerable;
-
-function toObject(val) {
-	if (val === null || val === undefined) {
-		throw new TypeError('Object.assign cannot be called with null or undefined');
-	}
-
-	return Object(val);
-}
-
-function shouldUseNative() {
-	try {
-		if (!Object.assign) {
-			return false;
-		}
-
-		// Detect buggy property enumeration order in older V8 versions.
-
-		// https://bugs.chromium.org/p/v8/issues/detail?id=4118
-		var test1 = new String('abc');  // eslint-disable-line no-new-wrappers
-		test1[5] = 'de';
-		if (Object.getOwnPropertyNames(test1)[0] === '5') {
-			return false;
-		}
-
-		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
-		var test2 = {};
-		for (var i = 0; i < 10; i++) {
-			test2['_' + String.fromCharCode(i)] = i;
-		}
-		var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
-			return test2[n];
-		});
-		if (order2.join('') !== '0123456789') {
-			return false;
-		}
-
-		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
-		var test3 = {};
-		'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
-			test3[letter] = letter;
-		});
-		if (Object.keys(Object.assign({}, test3)).join('') !==
-				'abcdefghijklmnopqrst') {
-			return false;
-		}
-
-		return true;
-	} catch (err) {
-		// We don't expect any of the above to throw, but better to be safe.
-		return false;
-	}
-}
-
-module.exports = shouldUseNative() ? Object.assign : function (target, source) {
-	var from;
-	var to = toObject(target);
-	var symbols;
-
-	for (var s = 1; s < arguments.length; s++) {
-		from = Object(arguments[s]);
-
-		for (var key in from) {
-			if (hasOwnProperty.call(from, key)) {
-				to[key] = from[key];
-			}
-		}
-
-		if (getOwnPropertySymbols) {
-			symbols = getOwnPropertySymbols(from);
-			for (var i = 0; i < symbols.length; i++) {
-				if (propIsEnumerable.call(from, symbols[i])) {
-					to[symbols[i]] = from[symbols[i]];
-				}
-			}
-		}
-	}
-
-	return to;
-};
diff --git a/node_modules/object-assign/license b/node_modules/object-assign/license
deleted file mode 100644
index 654d0bf..0000000
--- a/node_modules/object-assign/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-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/node_modules/object-assign/package.json b/node_modules/object-assign/package.json
deleted file mode 100644
index 503eb1e..0000000
--- a/node_modules/object-assign/package.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
-  "name": "object-assign",
-  "version": "4.1.1",
-  "description": "ES2015 `Object.assign()` ponyfill",
-  "license": "MIT",
-  "repository": "sindresorhus/object-assign",
-  "author": {
-    "name": "Sindre Sorhus",
-    "email": "sindresorhus@gmail.com",
-    "url": "sindresorhus.com"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "scripts": {
-    "test": "xo && ava",
-    "bench": "matcha bench.js"
-  },
-  "files": [
-    "index.js"
-  ],
-  "keywords": [
-    "object",
-    "assign",
-    "extend",
-    "properties",
-    "es2015",
-    "ecmascript",
-    "harmony",
-    "ponyfill",
-    "prollyfill",
-    "polyfill",
-    "shim",
-    "browser"
-  ],
-  "devDependencies": {
-    "ava": "^0.16.0",
-    "lodash": "^4.16.4",
-    "matcha": "^0.7.0",
-    "xo": "^0.16.0"
-  }
-}
diff --git a/node_modules/object-assign/readme.md b/node_modules/object-assign/readme.md
deleted file mode 100644
index 1be09d3..0000000
--- a/node_modules/object-assign/readme.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign)
-
-> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) [ponyfill](https://ponyfill.com)
-
-
-## Use the built-in
-
-Node.js 4 and up, as well as every evergreen browser (Chrome, Edge, Firefox, Opera, Safari),
-support `Object.assign()` :tada:. If you target only those environments, then by all
-means, use `Object.assign()` instead of this package.
-
-
-## Install
-
-```
-$ npm install --save object-assign
-```
-
-
-## Usage
-
-```js
-const objectAssign = require('object-assign');
-
-objectAssign({foo: 0}, {bar: 1});
-//=> {foo: 0, bar: 1}
-
-// multiple sources
-objectAssign({foo: 0}, {bar: 1}, {baz: 2});
-//=> {foo: 0, bar: 1, baz: 2}
-
-// overwrites equal keys
-objectAssign({foo: 0}, {foo: 1}, {foo: 2});
-//=> {foo: 2}
-
-// ignores null and undefined sources
-objectAssign({foo: 0}, null, {bar: 1}, undefined);
-//=> {foo: 0, bar: 1}
-```
-
-
-## API
-
-### objectAssign(target, [source, ...])
-
-Assigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones.
-
-
-## Resources
-
-- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign)
-
-
-## Related
-
-- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()`
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/object.entries/.eslintrc b/node_modules/object.entries/.eslintrc
deleted file mode 100644
index 15c95c1..0000000
--- a/node_modules/object.entries/.eslintrc
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"id-length": 0,
-		"new-cap": [2, { "capIsNewExceptions": ["RequireObjectCoercible"] }],
-		"no-magic-numbers": [0],
-		"no-restricted-syntax": [2, "BreakStatement", "ContinueStatement", "DebuggerStatement", "LabeledStatement", "WithStatement"]
-	}
-}
diff --git a/node_modules/object.entries/.github/workflows/rebase.yml b/node_modules/object.entries/.github/workflows/rebase.yml
deleted file mode 100644
index 436cb79..0000000
--- a/node_modules/object.entries/.github/workflows/rebase.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: Automatic Rebase
-
-on: [pull_request]
-
-jobs:
-  _:
-    name: "Automatic Rebase"
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v1
-    - uses: ljharb/rebase@master
-      env:
-        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/node_modules/object.entries/CHANGELOG.md b/node_modules/object.entries/CHANGELOG.md
deleted file mode 100644
index 28cafb3..0000000
--- a/node_modules/object.entries/CHANGELOG.md
+++ /dev/null
@@ -1,44 +0,0 @@
-1.1.1 / 2019-12-12
-=================
-  * [Refactor] use split-up `es-abstract` (85% bundle size decrease)
-  * [Deps] update `es-abstract`
-  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `functions-have-names`, `tape`
-  * [Tests] use shared travis-ci configs
-  * [Tests] use `functions-have-names`
-  * [Tests] use `npx aud` instead of `nsp` or `npm audit` with hoops
-  * [actions] add automatic rebasing / merge commit blocking
-  * [meta] clean up scripts
-
-1.1.0 / 2019-01-01
-=================
-  * [New] add `auto` entry point`
-  * [meta] exclude test.html from the npm package
-  * [Deps] update `define-properties`, `es-abstract`, `function-bind`, `has`
-  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `covert`, `tape`
-  * [Tests] up to `node` `v11.6`, `v10.15`, `v9.11`, `v8.15`, `v7.10`, `v6.16`, `v4.9`; use `nvm install-latest-npm`
-  * [Tests] use `npm audit` instead of `nsp`
-  * [Tests] remove `jscs`
-
-1.0.4 / 2016-12-04
-=================
-  * [Deps] update `es-abstract`, `function-bind`, `define-properties`
-  * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`
-  * [Tests] up to `node` `v7.2`, `v6.9`, `v4.6`; improve test matrix.
-
-1.0.3 / 2015-10-06
-=================
-  * [Fix] Not-yet-visited keys made non-enumerable on a `[[Get]]` must not show up in the output (https://github.com/ljharb/proposal-object-values-entries/issues/5)
-
-1.0.2 / 2015-09-25
-=================
-  * [Fix] Not-yet-visited keys deleted on a `[[Get]]` must not show up in the output (#1)
-
-1.0.1 / 2015-09-21
-=================
-  * [Docs] update version badge URL
-  * [Tests] on `io.js` `v3.3`, up to `node` `v4.1`
-  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`
-
-1.0.0 / 2015-09-02
-=================
-  * v1.0.0
diff --git a/node_modules/object.entries/LICENSE b/node_modules/object.entries/LICENSE
deleted file mode 100644
index b43df44..0000000
--- a/node_modules/object.entries/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Jordan Harband
-
-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/node_modules/object.entries/README.md b/node_modules/object.entries/README.md
deleted file mode 100644
index f0cdbfd..0000000
--- a/node_modules/object.entries/README.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# object.entries <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
-
-[![Build Status][travis-svg]][travis-url]
-[![dependency status][deps-svg]][deps-url]
-[![dev dependency status][dev-deps-svg]][dev-deps-url]
-[![License][license-image]][license-url]
-[![Downloads][downloads-image]][downloads-url]
-
-[![npm badge][npm-badge-png]][package-url]
-
-[![browser support][testling-svg]][testling-url]
-
-An ES2017 spec-compliant `Object.entries` shim. Invoke its "shim" method to shim `Object.entries` if it is unavailable or noncompliant.
-
-This package implements the [es-shim API](https://github.com/es-shims/api) interface. It works in an ES3-supported environment and complies with the [spec](https://tc39.github.io/ecma262/#sec-object.entries).
-
-Most common usage:
-```js
-var assert = require('assert');
-var entries = require('object.entries');
-
-var obj = { a: 1, b: 2, c: 3 };
-var expected = [['a', 1], ['b', 2], ['c', 3]];
-
-if (typeof Symbol === 'function' && typeof Symbol() === 'symbol') {
-	// for environments with Symbol support
-	var sym = Symbol();
-	obj[sym] = 4;
-	obj.d = sym;
-	expected.push(['d', sym]);
-}
-
-assert.deepEqual(entries(obj), expected);
-
-if (!Object.entries) {
-	entries.shim();
-}
-
-assert.deepEqual(Object.entries(obj), expected);
-```
-
-## Tests
-Simply clone the repo, `npm install`, and run `npm test`
-
-[package-url]: https://npmjs.com/package/object.entries
-[npm-version-svg]: http://versionbadg.es/es-shims/Object.entries.svg
-[travis-svg]: https://travis-ci.org/es-shims/Object.entries.svg
-[travis-url]: https://travis-ci.org/es-shims/Object.entries
-[deps-svg]: https://david-dm.org/es-shims/Object.entries.svg
-[deps-url]: https://david-dm.org/es-shims/Object.entries
-[dev-deps-svg]: https://david-dm.org/es-shims/Object.entries/dev-status.svg
-[dev-deps-url]: https://david-dm.org/es-shims/Object.entries#info=devDependencies
-[testling-svg]: https://ci.testling.com/es-shims/Object.entries.png
-[testling-url]: https://ci.testling.com/es-shims/Object.entries
-[npm-badge-png]: https://nodei.co/npm/object.entries.png?downloads=true&stars=true
-[license-image]: http://img.shields.io/npm/l/object.entries.svg
-[license-url]: LICENSE
-[downloads-image]: http://img.shields.io/npm/dm/object.entries.svg
-[downloads-url]: http://npm-stat.com/charts.html?package=object.entries
diff --git a/node_modules/object.entries/auto.js b/node_modules/object.entries/auto.js
deleted file mode 100644
index 8ebf606..0000000
--- a/node_modules/object.entries/auto.js
+++ /dev/null
@@ -1,3 +0,0 @@
-'use strict';
-
-require('./shim')();
diff --git a/node_modules/object.entries/implementation.js b/node_modules/object.entries/implementation.js
deleted file mode 100644
index 9842bc4..0000000
--- a/node_modules/object.entries/implementation.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-var RequireObjectCoercible = require('es-abstract/2019/RequireObjectCoercible');
-var has = require('has');
-var bind = require('function-bind');
-var isEnumerable = bind.call(Function.call, Object.prototype.propertyIsEnumerable);
-
-module.exports = function entries(O) {
-	var obj = RequireObjectCoercible(O);
-	var entrys = [];
-	for (var key in obj) {
-		if (has(obj, key) && isEnumerable(obj, key)) {
-			entrys.push([key, obj[key]]);
-		}
-	}
-	return entrys;
-};
diff --git a/node_modules/object.entries/index.js b/node_modules/object.entries/index.js
deleted file mode 100644
index b8ba091..0000000
--- a/node_modules/object.entries/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-var define = require('define-properties');
-
-var implementation = require('./implementation');
-var getPolyfill = require('./polyfill');
-var shim = require('./shim');
-
-var polyfill = getPolyfill();
-
-define(polyfill, {
-	getPolyfill: getPolyfill,
-	implementation: implementation,
-	shim: shim
-});
-
-module.exports = polyfill;
diff --git a/node_modules/object.entries/package.json b/node_modules/object.entries/package.json
deleted file mode 100644
index e257cf2..0000000
--- a/node_modules/object.entries/package.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
-	"name": "object.entries",
-	"version": "1.1.1",
-	"author": "Jordan Harband",
-	"description": "ES2017 spec-compliant Object.entries shim.",
-	"license": "MIT",
-	"main": "index.js",
-	"scripts": {
-		"pretest": "npm run --silent lint",
-		"test": "npm run --silent tests-only",
-		"posttest": "npx aud",
-		"tests-only": "es-shim-api && npm run --silent test:shimmed && npm run --silent test:module",
-		"test:shimmed": "node test/shimmed",
-		"test:module": "node test/index",
-		"coverage": "covert test/*.js",
-		"lint": "eslint ."
-	},
-	"repository": {
-		"type": "git",
-		"url": "git://github.com/es-shims/Object.entries.git"
-	},
-	"keywords": [
-		"Object.entries",
-		"Object.values",
-		"Object.keys",
-		"entries",
-		"values",
-		"ES7",
-		"ES8",
-		"ES2017",
-		"shim",
-		"object",
-		"keys",
-		"polyfill",
-		"es-shim API"
-	],
-	"dependencies": {
-		"define-properties": "^1.1.3",
-		"es-abstract": "^1.17.0-next.1",
-		"function-bind": "^1.1.1",
-		"has": "^1.0.3"
-	},
-	"devDependencies": {
-		"@es-shims/api": "^2.1.2",
-		"@ljharb/eslint-config": "^15.0.2",
-		"array-map": "^0.0.0",
-		"covert": "^1.1.1",
-		"eslint": "^6.7.2",
-		"functions-have-names": "^1.2.0",
-		"tape": "^4.11.0"
-	},
-	"testling": {
-		"files": "test/index.js",
-		"browsers": [
-			"iexplore/9.0..latest",
-			"firefox/4.0..6.0",
-			"firefox/15.0..latest",
-			"firefox/nightly",
-			"chrome/4.0..10.0",
-			"chrome/20.0..latest",
-			"chrome/canary",
-			"opera/11.6..latest",
-			"opera/next",
-			"safari/5.0..latest",
-			"ipad/6.0..latest",
-			"iphone/6.0..latest",
-			"android-browser/4.2"
-		]
-	},
-	"engines": {
-		"node": ">= 0.4"
-	}
-}
diff --git a/node_modules/object.entries/polyfill.js b/node_modules/object.entries/polyfill.js
deleted file mode 100644
index 32e3238..0000000
--- a/node_modules/object.entries/polyfill.js
+++ /dev/null
@@ -1,7 +0,0 @@
-'use strict';
-
-var implementation = require('./implementation');
-
-module.exports = function getPolyfill() {
-	return typeof Object.entries === 'function' ? Object.entries : implementation;
-};
diff --git a/node_modules/object.entries/shim.js b/node_modules/object.entries/shim.js
deleted file mode 100644
index 135defe..0000000
--- a/node_modules/object.entries/shim.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-
-var getPolyfill = require('./polyfill');
-var define = require('define-properties');
-
-module.exports = function shimEntries() {
-	var polyfill = getPolyfill();
-	define(Object, { entries: polyfill }, {
-		entries: function testEntries() {
-			return Object.entries !== polyfill;
-		}
-	});
-	return polyfill;
-};
diff --git a/node_modules/object.entries/test/.eslintrc b/node_modules/object.entries/test/.eslintrc
deleted file mode 100644
index 5bddce7..0000000
--- a/node_modules/object.entries/test/.eslintrc
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-	"rules": {
-		"array-bracket-newline": 0,
-		"max-lines-per-function": 0,
-		"max-nested-callbacks": [2, 3],
-		"max-statements": [2, 12],
-		"max-statements-per-line": [2, { "max": 3 }],
-		"no-invalid-this": [1],
-		"object-curly-newline": 0,
-	}
-}
diff --git a/node_modules/object.entries/test/index.js b/node_modules/object.entries/test/index.js
deleted file mode 100644
index 1859a3f..0000000
--- a/node_modules/object.entries/test/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-var entries = require('../');
-var test = require('tape');
-var runTests = require('./tests');
-
-test('as a function', function (t) {
-	t.test('bad array/this value', function (st) {
-		st['throws'](function () { entries(undefined); }, TypeError, 'undefined is not an object');
-		st['throws'](function () { entries(null); }, TypeError, 'null is not an object');
-		st.end();
-	});
-
-	runTests(entries, t);
-
-	t.end();
-});
diff --git a/node_modules/object.entries/test/shimmed.js b/node_modules/object.entries/test/shimmed.js
deleted file mode 100644
index 29bd7f0..0000000
--- a/node_modules/object.entries/test/shimmed.js
+++ /dev/null
@@ -1,36 +0,0 @@
-'use strict';
-
-var entries = require('../');
-entries.shim();
-
-var test = require('tape');
-var defineProperties = require('define-properties');
-var isEnumerable = Object.prototype.propertyIsEnumerable;
-var functionsHaveNames = require('functions-have-names');
-
-var runTests = require('./tests');
-
-test('shimmed', function (t) {
-	t.equal(Object.entries.length, 1, 'Object.entries has a length of 1');
-	t.test('Function name', { skip: !functionsHaveNames }, function (st) {
-		st.equal(Object.entries.name, 'entries', 'Object.entries has name "entries"');
-		st.end();
-	});
-
-	t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
-		et.equal(false, isEnumerable.call(Object, 'entries'), 'Object.entries is not enumerable');
-		et.end();
-	});
-
-	var supportsStrictMode = (function () { return typeof this === 'undefined'; }());
-
-	t.test('bad object value', { skip: !supportsStrictMode }, function (st) {
-		st['throws'](function () { return Object.entries(undefined); }, TypeError, 'undefined is not an object');
-		st['throws'](function () { return Object.entries(null); }, TypeError, 'null is not an object');
-		st.end();
-	});
-
-	runTests(Object.entries, t);
-
-	t.end();
-});
diff --git a/node_modules/object.entries/test/tests.js b/node_modules/object.entries/test/tests.js
deleted file mode 100644
index 7925e47..0000000
--- a/node_modules/object.entries/test/tests.js
+++ /dev/null
@@ -1,82 +0,0 @@
-'use strict';
-
-var keys = require('object-keys');
-var map = require('array-map');
-var define = require('define-properties');
-
-var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
-
-module.exports = function (entries, t) {
-	var a = {};
-	var b = {};
-	var c = {};
-	var obj = { a: a, b: b, c: c };
-
-	t.deepEqual(entries(obj), [['a', a], ['b', b], ['c', c]], 'basic support');
-	t.deepEqual(entries({ a: a, b: a, c: c }), [['a', a], ['b', a], ['c', c]], 'duplicate entries are included');
-
-	t.test('entries are in the same order as keys', function (st) {
-		var object = { a: a, b: b };
-		object[0] = 3;
-		object.c = c;
-		object[1] = 4;
-		delete object[0];
-		var objKeys = keys(object);
-		var objEntries = map(objKeys, function (key) {
-			return [key, object[key]];
-		});
-		st.deepEqual(entries(object), objEntries, 'entries match key order');
-		st.end();
-	});
-
-	t.test('non-enumerable properties are omitted', { skip: !Object.defineProperty }, function (st) {
-		var object = { a: a, b: b };
-		Object.defineProperty(object, 'c', { enumerable: false, value: c });
-		st.deepEqual(entries(object), [['a', a], ['b', b]], 'non-enumerable property‘s value is omitted');
-		st.end();
-	});
-
-	t.test('inherited properties are omitted', function (st) {
-		var F = function G() {};
-		F.prototype.a = a;
-		var f = new F();
-		f.b = b;
-		st.deepEqual(entries(f), [['b', b]], 'only own properties are included');
-		st.end();
-	});
-
-	t.test('Symbol properties are omitted', { skip: !hasSymbols }, function (st) {
-		var object = { a: a, b: b, c: c };
-		var enumSym = Symbol('enum');
-		var nonEnumSym = Symbol('non enum');
-		object[enumSym] = enumSym;
-		object.d = enumSym;
-		Object.defineProperty(object, nonEnumSym, { enumerable: false, value: nonEnumSym });
-		st.deepEqual(entries(object), [['a', a], ['b', b], ['c', c], ['d', enumSym]], 'symbol properties are omitted');
-		st.end();
-	});
-
-	t.test('not-yet-visited keys deleted on [[Get]] must not show up in output', { skip: !define.supportsDescriptors }, function (st) {
-		var o = { a: 1, b: 2, c: 3 };
-		Object.defineProperty(o, 'a', {
-			get: function () {
-				delete this.b;
-				return 1;
-			}
-		});
-		st.deepEqual(entries(o), [['a', 1], ['c', 3]], 'when "b" is deleted prior to being visited, it should not show up');
-		st.end();
-	});
-
-	t.test('not-yet-visited keys made non-enumerable on [[Get]] must not show up in output', { skip: !define.supportsDescriptors }, function (st) {
-		var o = { a: 'A', b: 'B' };
-		Object.defineProperty(o, 'a', {
-			get: function () {
-				Object.defineProperty(o, 'b', { enumerable: false });
-				return 'A';
-			}
-		});
-		st.deepEqual(entries(o), [['a', 'A']], 'when "b" is made non-enumerable prior to being visited, it should not show up');
-		st.end();
-	});
-};
diff --git a/node_modules/object.fromentries/.eslintrc b/node_modules/object.fromentries/.eslintrc
deleted file mode 100644
index d6d9fd3..0000000
--- a/node_modules/object.fromentries/.eslintrc
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"id-length": 0,
-		"max-statements-per-line": [2, { "max": 2 }],
-		"max-statements": [2, 22],
-		"multiline-comment-style": 1,
-		"new-cap": [2, {
-			"capIsNewExceptions": [
-				"AddEntriesFromIterable",
-				"CreateDataPropertyOrThrow",
-				"Get",
-				"GetIterator",
-				"IsArray",
-				"IteratorStep",
-				"IteratorClose",
-				"IteratorValue",
-				"ThrowCompletion",
-				"ToPropertyKey",
-				"Type",
-				"RequireObjectCoercible",
-			],
-		}],
-	},
-
-	"overrides": [
-		{
-			"files": "test/**",
-			"rules": {
-				"no-invalid-this": 1,
-			},
-		},
-	],
-}
diff --git a/node_modules/object.fromentries/.github/workflows/rebase.yml b/node_modules/object.fromentries/.github/workflows/rebase.yml
deleted file mode 100644
index 436cb79..0000000
--- a/node_modules/object.fromentries/.github/workflows/rebase.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: Automatic Rebase
-
-on: [pull_request]
-
-jobs:
-  _:
-    name: "Automatic Rebase"
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v1
-    - uses: ljharb/rebase@master
-      env:
-        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/node_modules/object.fromentries/.travis.yml b/node_modules/object.fromentries/.travis.yml
deleted file mode 100644
index 2d1c1d2..0000000
--- a/node_modules/object.fromentries/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-version: ~> 1.0
-language: node_js
-os:
- - linux
-import:
- - ljharb/travis-ci:node/all.yml
- - ljharb/travis-ci:node/pretest.yml
- - ljharb/travis-ci:node/posttest.yml
- - ljharb/travis-ci:node/coverage.yml
-matrix:
-  allow_failures:
-    - env: COVERAGE=true
diff --git a/node_modules/object.fromentries/CHANGELOG.md b/node_modules/object.fromentries/CHANGELOG.md
deleted file mode 100644
index 78f70e1..0000000
--- a/node_modules/object.fromentries/CHANGELOG.md
+++ /dev/null
@@ -1,25 +0,0 @@
-2.0.2 / 2019-12-12
-=================
-  * [Refactor] use split-up `es-abstract` (63% bundle size decrease)
-  * [readme] remove testling
-  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`
-  * [meta] add `funding` field
-  * [Tests] use shared travis-ci configs
-  * [actions] add automatic rebasing / merge commit blocking
-
-2.0.1 / 2019-10-03
-=================
-  * [Fix] do not mutate `Object.fromEntries` when already present
-  * [Deps] update `define-properties`, `es-abstract`, `has`
-  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `covert`, `tape`
-  * [Tests] up to `node` `v12.9`, `v11.15`, `v10.16`, `v9.11`, `v8.16`, `v6.17`, `v4.9`
-  * [Tests] use `npx aud` instead of `nsp` or `npm audit` with hoops
-
-2.0.0 / 2018-08-09
-=================
-  * [Breaking] throw when `iterable` is nullish
-  * [Docs] Fix link to proposed spec
-
-1.0.0 / 2018-03-21
-=================
-  * v1.0.0
diff --git a/node_modules/object.fromentries/LICENSE b/node_modules/object.fromentries/LICENSE
deleted file mode 100644
index 9dd868f..0000000
--- a/node_modules/object.fromentries/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2018 Jordan Harband
-
-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/node_modules/object.fromentries/README.md b/node_modules/object.fromentries/README.md
deleted file mode 100644
index fa5b18b..0000000
--- a/node_modules/object.fromentries/README.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# object.fromentries <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
-
-[![Build Status][travis-svg]][travis-url]
-[![dependency status][deps-svg]][deps-url]
-[![dev dependency status][dev-deps-svg]][dev-deps-url]
-[![License][license-image]][license-url]
-[![Downloads][downloads-image]][downloads-url]
-
-[![npm badge][npm-badge-png]][package-url]
-
-An ES spec-proposal-compliant `Object.fromEntries` shim. Invoke its "shim" method to shim `Object.fromEntries` if it is unavailable or noncompliant.
-
-This package implements the [es-shim API](https://github.com/es-shims/api) interface. It works in an ES3-supported environment and complies with the [proposed spec](https://tc39.github.io/proposal-object-from-entries/).
-
-Most common usage:
-```js
-var assert = require('assert');
-var fromEntries = require('object.fromentries');
-
-var obj = { a: 1, b: 2, c: 3 };
-var actual = fromEntries(Object.entries(obj));
-
-assert.deepEqual(obj, actual);
-
-if (!Object.fromEntries) {
-	fromEntries.shim();
-}
-
-assert.deepEqual(Object.fromEntries(Object.entries(obj)), obj);
-```
-
-## Tests
-Simply clone the repo, `npm install`, and run `npm test`
-
-[package-url]: https://npmjs.com/package/object.fromentries
-[npm-version-svg]: http://versionbadg.es/es-shims/Object.fromEntries.svg
-[travis-svg]: https://travis-ci.org/es-shims/Object.fromEntries.svg
-[travis-url]: https://travis-ci.org/es-shims/Object.fromEntries
-[deps-svg]: https://david-dm.org/es-shims/Object.fromEntries.svg
-[deps-url]: https://david-dm.org/es-shims/Object.fromEntries
-[dev-deps-svg]: https://david-dm.org/es-shims/Object.fromEntries/dev-status.svg
-[dev-deps-url]: https://david-dm.org/es-shims/Object.fromEntries#info=devDependencies
-[npm-badge-png]: https://nodei.co/npm/object.fromentries.png?downloads=true&stars=true
-[license-image]: http://img.shields.io/npm/l/object.fromentries.svg
-[license-url]: LICENSE
-[downloads-image]: http://img.shields.io/npm/dm/object.fromentries.svg
-[downloads-url]: http://npm-stat.com/charts.html?package=object.fromentries
diff --git a/node_modules/object.fromentries/auto.js b/node_modules/object.fromentries/auto.js
deleted file mode 100644
index 8ebf606..0000000
--- a/node_modules/object.fromentries/auto.js
+++ /dev/null
@@ -1,3 +0,0 @@
-'use strict';
-
-require('./shim')();
diff --git a/node_modules/object.fromentries/implementation.js b/node_modules/object.fromentries/implementation.js
deleted file mode 100644
index 3c85703..0000000
--- a/node_modules/object.fromentries/implementation.js
+++ /dev/null
@@ -1,48 +0,0 @@
-'use strict';
-
-var AddEntriesFromIterable = require('es-abstract/2019/AddEntriesFromIterable');
-var CreateDataPropertyOrThrow = require('es-abstract/2019/CreateDataPropertyOrThrow');
-var Get = require('es-abstract/2019/Get');
-var IsArray = require('es-abstract/2019/IsArray');
-var RequireObjectCoercible = require('es-abstract/2019/RequireObjectCoercible');
-var ToPropertyKey = require('es-abstract/2019/ToPropertyKey');
-var Type = require('es-abstract/2019/Type');
-
-var adder = function addDataProperty(key, value) {
-	var O = this; // eslint-disable-line no-invalid-this
-	var propertyKey = ToPropertyKey(key);
-	CreateDataPropertyOrThrow(O, propertyKey, value);
-};
-
-var legacyAssign = function assign(obj, entries) {
-	for (var i = 0; i < entries.length; ++i) {
-		var entry = entries[i];
-		if (Type(entry) !== 'Object') {
-			throw new TypeError('iterator returned a non-object; entry expected');
-		}
-
-		var key = Get(entry, '0');
-		var value = Get(entry, '1');
-		var propertyKey = ToPropertyKey(key);
-		CreateDataPropertyOrThrow(obj, propertyKey, value);
-	}
-};
-
-var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
-
-module.exports = function fromEntries(iterable) {
-	RequireObjectCoercible(iterable);
-
-	var obj = {};
-
-	// this part isn't in the spec, it's for a reasonable fallback for pre-ES6 environments
-	if (!hasSymbols) {
-		if (!IsArray(iterable)) {
-			throw new TypeError('this environment lacks native Symbols, and can not support non-Array iterables');
-		}
-		legacyAssign(obj, iterable);
-		return obj;
-	}
-
-	return AddEntriesFromIterable(obj, iterable, adder);
-};
diff --git a/node_modules/object.fromentries/index.js b/node_modules/object.fromentries/index.js
deleted file mode 100644
index a6b0aec..0000000
--- a/node_modules/object.fromentries/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-
-var define = require('define-properties');
-var bind = require('function-bind');
-
-var implementation = require('./implementation');
-var getPolyfill = require('./polyfill');
-var shim = require('./shim');
-
-var polyfill = bind.call(getPolyfill());
-
-define(polyfill, {
-	getPolyfill: getPolyfill,
-	implementation: implementation,
-	shim: shim
-});
-
-module.exports = polyfill;
diff --git a/node_modules/object.fromentries/package.json b/node_modules/object.fromentries/package.json
deleted file mode 100644
index 58befed..0000000
--- a/node_modules/object.fromentries/package.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
-	"name": "object.fromentries",
-	"version": "2.0.2",
-	"author": "Jordan Harband <ljharb@gmail.com>",
-	"funding": {
-		"url": "https://github.com/sponsors/ljharb"
-	},
-	"description": "ES proposal-spec-compliant Object.fromEntries shim.",
-	"license": "MIT",
-	"main": "index.js",
-	"scripts": {
-		"pretest": "npm run --silent lint",
-		"test": "npm run --silent tests-only",
-		"posttest": "npx aud",
-		"tests-only": "es-shim-api --bound && npm run --silent test:shimmed && npm run --silent test:module",
-		"test:shimmed": "node test/shimmed.js",
-		"test:module": "node test/index.js",
-		"coverage": "covert test/*.js",
-		"coverage-quiet": "covert test/*.js --quiet",
-		"lint": "eslint test/*.js *.js"
-	},
-	"repository": {
-		"type": "git",
-		"url": "git://github.com/es-shims/Object.fromEntries.git"
-	},
-	"keywords": [
-		"Object.fromEntries",
-		"Object.entries",
-		"Object.values",
-		"Object.keys",
-		"entries",
-		"values",
-		"ES7",
-		"ES8",
-		"ES2017",
-		"shim",
-		"object",
-		"keys",
-		"polyfill",
-		"es-shim API"
-	],
-	"dependencies": {
-		"define-properties": "^1.1.3",
-		"es-abstract": "^1.17.0-next.1",
-		"function-bind": "^1.1.1",
-		"has": "^1.0.3"
-	},
-	"devDependencies": {
-		"@es-shims/api": "^2.1.2",
-		"@ljharb/eslint-config": "^15.0.2",
-		"array-map": "^0.0.0",
-		"covert": "^1.1.1",
-		"eslint": "^6.7.2",
-		"tape": "^4.11.0"
-	},
-	"testling": {
-		"files": "test/index.js",
-		"browsers": [
-			"iexplore/9.0..latest",
-			"firefox/4.0..6.0",
-			"firefox/15.0..latest",
-			"firefox/nightly",
-			"chrome/4.0..10.0",
-			"chrome/20.0..latest",
-			"chrome/canary",
-			"opera/11.6..latest",
-			"opera/next",
-			"safari/5.0..latest",
-			"ipad/6.0..latest",
-			"iphone/6.0..latest",
-			"android-browser/4.2"
-		]
-	},
-	"engines": {
-		"node": ">= 0.4"
-	}
-}
diff --git a/node_modules/object.fromentries/polyfill.js b/node_modules/object.fromentries/polyfill.js
deleted file mode 100644
index 1c0c611..0000000
--- a/node_modules/object.fromentries/polyfill.js
+++ /dev/null
@@ -1,7 +0,0 @@
-'use strict';
-
-var implementation = require('./implementation');
-
-module.exports = function getPolyfill() {
-	return typeof Object.fromEntries === 'function' ? Object.fromEntries : implementation;
-};
diff --git a/node_modules/object.fromentries/shim.js b/node_modules/object.fromentries/shim.js
deleted file mode 100644
index adaa6a2..0000000
--- a/node_modules/object.fromentries/shim.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-
-var getPolyfill = require('./polyfill');
-var define = require('define-properties');
-
-module.exports = function shimEntries() {
-	var polyfill = getPolyfill();
-	define(Object, { fromEntries: polyfill }, {
-		fromEntries: function testEntries() {
-			return Object.fromEntries !== polyfill;
-		}
-	});
-	return polyfill;
-};
diff --git a/node_modules/object.fromentries/test/index.js b/node_modules/object.fromentries/test/index.js
deleted file mode 100644
index e6d5af6..0000000
--- a/node_modules/object.fromentries/test/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-var fromEntries = require('../');
-var test = require('tape');
-var runTests = require('./tests');
-
-test('as a function', function (t) {
-	t.test('bad array/this value', function (st) {
-		st['throws'](function () { fromEntries(undefined); }, TypeError, 'undefined is not an object');
-		st['throws'](function () { fromEntries(null); }, TypeError, 'null is not an object');
-		st.end();
-	});
-
-	runTests(fromEntries, t);
-
-	t.end();
-});
diff --git a/node_modules/object.fromentries/test/shimmed.js b/node_modules/object.fromentries/test/shimmed.js
deleted file mode 100644
index ed7a671..0000000
--- a/node_modules/object.fromentries/test/shimmed.js
+++ /dev/null
@@ -1,45 +0,0 @@
-'use strict';
-
-var fromEntries = require('../');
-fromEntries.shim();
-
-var test = require('tape');
-var keys = require('object-keys');
-var defineProperties = require('define-properties');
-var isEnumerable = Object.prototype.propertyIsEnumerable;
-var functionsHaveNames = function f() {}.name === 'f';
-
-var runTests = require('./tests');
-
-test('shimmed', function (t) {
-	t.equal(Object.fromEntries.length, 1, 'Object.fromEntries has a length of 1');
-	t.test('Function name', { skip: !functionsHaveNames }, function (st) {
-		st.equal(Object.fromEntries.name, 'fromEntries', 'Object.fromEntries has name "fromEntries"');
-		st.end();
-	});
-
-	t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
-		et.equal(false, isEnumerable.call(Object, 'fromEntries'), 'Object.fromEntries is not enumerable');
-		et.end();
-	});
-
-	var supportsStrictMode = (function () { return typeof this === 'undefined'; }());
-
-	t.test('bad object value', { skip: !supportsStrictMode }, function (st) {
-		st['throws'](function () { return Object.fromEntries(undefined); }, TypeError, 'undefined is not an object');
-		st['throws'](function () { return Object.fromEntries(null); }, TypeError, 'null is not an object');
-		st.end();
-	});
-
-	t.test('does not mutate global method', function (st) {
-		st.deepEqual(keys(Object.fromEntries), [], 'no enumerable keys');
-		st.equal('shim' in Object.fromEntries, false, '"shim" is not present');
-		st.equal('getPolyfill' in Object.fromEntries, false, '"getPolyfill" is not present');
-		st.equal('implementation' in Object.fromEntries, false, '"implementation" is not present');
-		st.end();
-	});
-
-	runTests(Object.fromEntries, t);
-
-	t.end();
-});
diff --git a/node_modules/object.fromentries/test/tests.js b/node_modules/object.fromentries/test/tests.js
deleted file mode 100644
index 9ae8707..0000000
--- a/node_modules/object.fromentries/test/tests.js
+++ /dev/null
@@ -1,15 +0,0 @@
-'use strict';
-
-module.exports = function (fromEntries, t) {
-	var a = {};
-	var b = {};
-	var c = {};
-	var entries = [['a', a], ['b', b], ['c', c]];
-	var obj = { a: a, b: b, c: c };
-
-	t.deepEqual(fromEntries(entries), obj, 'entries -> obj');
-
-	t['throws'](function () { fromEntries(); }, 'entries throws on absent iterable');
-	t['throws'](function () { fromEntries(undefined); }, 'entries throws on undefined');
-	t['throws'](function () { fromEntries(null); }, 'entries throws on null');
-};
diff --git a/node_modules/os-tmpdir/index.js b/node_modules/os-tmpdir/index.js
deleted file mode 100644
index 2077b1c..0000000
--- a/node_modules/os-tmpdir/index.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-var isWindows = process.platform === 'win32';
-var trailingSlashRe = isWindows ? /[^:]\\$/ : /.\/$/;
-
-// https://github.com/nodejs/node/blob/3e7a14381497a3b73dda68d05b5130563cdab420/lib/os.js#L25-L43
-module.exports = function () {
-	var path;
-
-	if (isWindows) {
-		path = process.env.TEMP ||
-			process.env.TMP ||
-			(process.env.SystemRoot || process.env.windir) + '\\temp';
-	} else {
-		path = process.env.TMPDIR ||
-			process.env.TMP ||
-			process.env.TEMP ||
-			'/tmp';
-	}
-
-	if (trailingSlashRe.test(path)) {
-		path = path.slice(0, -1);
-	}
-
-	return path;
-};
diff --git a/node_modules/os-tmpdir/license b/node_modules/os-tmpdir/license
deleted file mode 100644
index 654d0bf..0000000
--- a/node_modules/os-tmpdir/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-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/node_modules/os-tmpdir/package.json b/node_modules/os-tmpdir/package.json
deleted file mode 100644
index 180a317..0000000
--- a/node_modules/os-tmpdir/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "name": "os-tmpdir",
-  "version": "1.0.2",
-  "description": "Node.js os.tmpdir() ponyfill",
-  "license": "MIT",
-  "repository": "sindresorhus/os-tmpdir",
-  "author": {
-    "name": "Sindre Sorhus",
-    "email": "sindresorhus@gmail.com",
-    "url": "sindresorhus.com"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "scripts": {
-    "test": "xo && ava"
-  },
-  "files": [
-    "index.js"
-  ],
-  "keywords": [
-    "built-in",
-    "core",
-    "ponyfill",
-    "polyfill",
-    "shim",
-    "os",
-    "tmpdir",
-    "tempdir",
-    "tmp",
-    "temp",
-    "dir",
-    "directory",
-    "env",
-    "environment"
-  ],
-  "devDependencies": {
-    "ava": "*",
-    "xo": "^0.16.0"
-  }
-}
diff --git a/node_modules/os-tmpdir/readme.md b/node_modules/os-tmpdir/readme.md
deleted file mode 100644
index c09f7ed..0000000
--- a/node_modules/os-tmpdir/readme.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# os-tmpdir [![Build Status](https://travis-ci.org/sindresorhus/os-tmpdir.svg?branch=master)](https://travis-ci.org/sindresorhus/os-tmpdir)
-
-> Node.js [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) [ponyfill](https://ponyfill.com)
-
-Use this instead of `require('os').tmpdir()` to get a consistent behavior on different Node.js versions (even 0.8).
-
-
-## Install
-
-```
-$ npm install --save os-tmpdir
-```
-
-
-## Usage
-
-```js
-const osTmpdir = require('os-tmpdir');
-
-osTmpdir();
-//=> '/var/folders/m3/5574nnhn0yj488ccryqr7tc80000gn/T'
-```
-
-
-## API
-
-See the [`os.tmpdir()` docs](https://nodejs.org/api/os.html#os_os_tmpdir).
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/prop-types/CHANGELOG.md b/node_modules/prop-types/CHANGELOG.md
deleted file mode 100644
index 025d2f4..0000000
--- a/node_modules/prop-types/CHANGELOG.md
+++ /dev/null
@@ -1,92 +0,0 @@
-## 15.7.2
-* [Fix] ensure nullish values in `oneOf` do not crash ([#256](https://github.com/facebook/prop-types/issues/256))
-* [Fix] move `loose-envify` back to production deps, for browerify usage ([#203](https://github.com/facebook/prop-types/issues/203))
-
-## 15.7.1
-* [Fix] avoid template literal syntax ([#255](https://github.com/facebook/prop-types/issues/255), [#254](https://github.com/facebook/prop-types/issues/254))
-
-## 15.7.0
-* [New] Add `.elementType` ([#211](https://github.com/facebook/prop-types/pull/211))
-* [New] add `PropTypes.resetWarningCache` ([#178](https://github.com/facebook/prop-types/pull/178))
-* `oneOf`: improve warning when multiple arguments are supplied ([#244](https://github.com/facebook/prop-types/pull/244))
-* Fix `oneOf` when used with Symbols ([#224](https://github.com/facebook/prop-types/pull/224))
-* Avoid relying on `hasOwnProperty` being present on values' prototypes ([#112](https://github.com/facebook/prop-types/pull/112), [#187](https://github.com/facebook/prop-types/pull/187))
-* Improve readme ([#248](https://github.com/facebook/prop-types/pull/248), [#233](https://github.com/facebook/prop-types/pull/233))
-* Clean up mistaken runtime dep, swap envify for loose-envify ([#204](https://github.com/facebook/prop-types/pull/204))
-
-## 15.6.2
-* Remove the `fbjs` dependency by inlining some helpers from it ([#194](https://github.com/facebook/prop-types/pull/194)))
-
-## 15.6.1
-* Fix an issue where outdated BSD license headers were still present in the published bundle [#162](https://github.com/facebook/prop-types/issues/162)
-
-## 15.6.0
-
-* Switch from BSD + Patents to MIT license
-* Add PropTypes.exact, like PropTypes.shape but warns on extra object keys. ([@thejameskyle](https://github.com/thejameskyle) and [@aweary](https://github.com/aweary) in [#41](https://github.com/facebook/prop-types/pull/41) and [#87](https://github.com/facebook/prop-types/pull/87))
-
-## 15.5.10
-
-* Fix a false positive warning when using a production UMD build of a third-party library with a DEV version of React. ([@gaearon](https://github.com/gaearon) in [#50](https://github.com/facebook/prop-types/pull/50))
-
-## 15.5.9
-
-* Add `loose-envify` Browserify transform for users who don't envify globally. ([@mridgway](https://github.com/mridgway) in [#45](https://github.com/facebook/prop-types/pull/45))
-
-## 15.5.8
-
-* Limit the manual PropTypes call warning count because it has false positives with React versions earlier than 15.2.0 in the 15.x branch and 0.14.9 in the 0.14.x branch. ([@gaearon](https://github.com/gaearon) in [#26](https://github.com/facebook/prop-types/pull/26))
-
-## 15.5.7
-
-* **Critical Bugfix:** Fix an accidental breaking change that caused errors in production when used through `React.PropTypes`.  ([@gaearon](https://github.com/gaearon) in [#20](https://github.com/facebook/prop-types/pull/20))
-* Improve the size of production UMD build.  ([@aweary](https://github.com/aweary) in [38ba18](https://github.com/facebook/prop-types/commit/38ba18a4a8f705f4b2b33c88204573ddd604f2d6) and [7882a7](https://github.com/facebook/prop-types/commit/7882a7285293db5f284bcf559b869fd2cd4c44d4))
-
-## 15.5.6
-
-**Note: this release has a critical issue and was deprecated. Please update to 15.5.7 or higher.**
-
-* Fix a markdown issue in README. ([@bvaughn](https://github.com/bvaughn) in [174f77](https://github.com/facebook/prop-types/commit/174f77a50484fa628593e84b871fb40eed78b69a))
-
-## 15.5.5
-
-**Note: this release has a critical issue and was deprecated. Please update to 15.5.7 or higher.**
-
-* Add missing documentation and license files.  ([@bvaughn](https://github.com/bvaughn) in [0a53d3](https://github.com/facebook/prop-types/commit/0a53d3a34283ae1e2d3aa396632b6dc2a2061e6a))
-
-## 15.5.4
-
-**Note: this release has a critical issue and was deprecated. Please update to 15.5.7 or higher.**
-
-* Reduce the size of the UMD Build. ([@acdlite](https://github.com/acdlite) in [31e9344](https://github.com/facebook/prop-types/commit/31e9344ca3233159928da66295da17dad82db1a8))
-* Remove bad package url. ([@ljharb](https://github.com/ljharb) in [158198f](https://github.com/facebook/prop-types/commit/158198fd6c468a3f6f742e0e355e622b3914048a))
-* Remove the accidentally included typechecking code from the production build.
-
-## 15.5.3
-
-**Note: this release has a critical issue and was deprecated. Please update to 15.5.7 or higher.**
-
-* Remove the accidentally included React package code from the UMD bundle. ([@acdlite](https://github.com/acdlite) in [df318bb](https://github.com/facebook/prop-types/commit/df318bba8a89bc5aadbb0292822cf4ed71d27ace))
-
-## 15.5.2
-
-**Note: this release has a critical issue and was deprecated. Please update to 15.5.7 or higher.**
-
-* Remove dependency on React for CommonJS entry point. ([@acdlite](https://github.com/acdlite) in [cae72bb](https://github.com/facebook/prop-types/commit/cae72bb281a3766c765e3624f6088c3713567e6d))
-
-
-## 15.5.1
-
-**Note: this release has a critical issue and was deprecated. Please update to 15.5.7 or higher.**
-
-* Remove accidental uncompiled ES6 syntax in the published package. ([@acdlite](https://github.com/acdlite) in [e191963](https://github.com/facebook/react/commit/e1919638b39dd65eedd250a8bb649773ca61b6f1))
-
-## 15.5.0
-
-**Note: this release has a critical issue and was deprecated. Please update to 15.5.7 or higher.**
-
-* Initial release.
-
-## Before 15.5.0
-
-PropTypes was previously included in React, but is now a separate package. For earlier history of PropTypes [see the React change log.](https://github.com/facebook/react/blob/master/CHANGELOG.md)
diff --git a/node_modules/prop-types/LICENSE b/node_modules/prop-types/LICENSE
deleted file mode 100644
index 188fb2b..0000000
--- a/node_modules/prop-types/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2013-present, Facebook, Inc.
-
-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/node_modules/prop-types/README.md b/node_modules/prop-types/README.md
deleted file mode 100644
index 1a23c9d..0000000
--- a/node_modules/prop-types/README.md
+++ /dev/null
@@ -1,296 +0,0 @@
-# prop-types [![Build Status](https://travis-ci.com/facebook/prop-types.svg?branch=master)](https://travis-ci.org/facebook/prop-types)
-
-Runtime type checking for React props and similar objects.
-
-You can use prop-types to document the intended types of properties passed to
-components. React (and potentially other libraries—see the checkPropTypes()
-reference below) will check props passed to your components against those
-definitions, and warn in development if they don’t match.
-
-## Installation
-
-```shell
-npm install --save prop-types
-```
-
-## Importing
-
-```js
-import PropTypes from 'prop-types'; // ES6
-var PropTypes = require('prop-types'); // ES5 with npm
-```
-
-### CDN
-
-If you prefer to exclude `prop-types` from your application and use it
-globally via `window.PropTypes`, the `prop-types` package provides
-single-file distributions, which are hosted on the following CDNs:
-
-* [**unpkg**](https://unpkg.com/prop-types/)
-```html
-<!-- development version -->
-<script src="https://unpkg.com/prop-types@15.6/prop-types.js"></script>
-
-<!-- production version -->
-<script src="https://unpkg.com/prop-types@15.6/prop-types.min.js"></script>
-```
-
-* [**cdnjs**](https://cdnjs.com/libraries/prop-types)
-```html
-<!-- development version -->
-<script src="https://cdnjs.cloudflare.com/ajax/libs/prop-types/15.6.0/prop-types.js"></script>
-
-<!-- production version -->
-<script src="https://cdnjs.cloudflare.com/ajax/libs/prop-types/15.6.0/prop-types.min.js"></script>
-```
-
-To load a specific version of `prop-types` replace `15.6.0` with the version number.
-
-## Usage
-
-PropTypes was originally exposed as part of the React core module, and is
-commonly used with React components.
-Here is an example of using PropTypes with a React component, which also
-documents the different validators provided:
-
-```js
-import React from 'react';
-import PropTypes from 'prop-types';
-
-class MyComponent extends React.Component {
-  render() {
-    // ... do things with the props
-  }
-}
-
-MyComponent.propTypes = {
-  // You can declare that a prop is a specific JS primitive. By default, these
-  // are all optional.
-  optionalArray: PropTypes.array,
-  optionalBool: PropTypes.bool,
-  optionalFunc: PropTypes.func,
-  optionalNumber: PropTypes.number,
-  optionalObject: PropTypes.object,
-  optionalString: PropTypes.string,
-  optionalSymbol: PropTypes.symbol,
-
-  // Anything that can be rendered: numbers, strings, elements or an array
-  // (or fragment) containing these types.
-  optionalNode: PropTypes.node,
-
-  // A React element (ie. <MyComponent />).
-  optionalElement: PropTypes.element,
-
-  // A React element type (ie. MyComponent).
-  optionalElementType: PropTypes.elementType,
-
-  // You can also declare that a prop is an instance of a class. This uses
-  // JS's instanceof operator.
-  optionalMessage: PropTypes.instanceOf(Message),
-
-  // You can ensure that your prop is limited to specific values by treating
-  // it as an enum.
-  optionalEnum: PropTypes.oneOf(['News', 'Photos']),
-
-  // An object that could be one of many types
-  optionalUnion: PropTypes.oneOfType([
-    PropTypes.string,
-    PropTypes.number,
-    PropTypes.instanceOf(Message)
-  ]),
-
-  // An array of a certain type
-  optionalArrayOf: PropTypes.arrayOf(PropTypes.number),
-
-  // An object with property values of a certain type
-  optionalObjectOf: PropTypes.objectOf(PropTypes.number),
-
-  // You can chain any of the above with `isRequired` to make sure a warning
-  // is shown if the prop isn't provided.
-
-  // An object taking on a particular shape
-  optionalObjectWithShape: PropTypes.shape({
-    optionalProperty: PropTypes.string,
-    requiredProperty: PropTypes.number.isRequired
-  }),
-
-  // An object with warnings on extra properties
-  optionalObjectWithStrictShape: PropTypes.exact({
-    optionalProperty: PropTypes.string,
-    requiredProperty: PropTypes.number.isRequired
-  }),
-
-  requiredFunc: PropTypes.func.isRequired,
-
-  // A value of any data type
-  requiredAny: PropTypes.any.isRequired,
-
-  // You can also specify a custom validator. It should return an Error
-  // object if the validation fails. Don't `console.warn` or throw, as this
-  // won't work inside `oneOfType`.
-  customProp: function(props, propName, componentName) {
-    if (!/matchme/.test(props[propName])) {
-      return new Error(
-        'Invalid prop `' + propName + '` supplied to' +
-        ' `' + componentName + '`. Validation failed.'
-      );
-    }
-  },
-
-  // You can also supply a custom validator to `arrayOf` and `objectOf`.
-  // It should return an Error object if the validation fails. The validator
-  // will be called for each key in the array or object. The first two
-  // arguments of the validator are the array or object itself, and the
-  // current item's key.
-  customArrayProp: PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
-    if (!/matchme/.test(propValue[key])) {
-      return new Error(
-        'Invalid prop `' + propFullName + '` supplied to' +
-        ' `' + componentName + '`. Validation failed.'
-      );
-    }
-  })
-};
-```
-
-Refer to the [React documentation](https://facebook.github.io/react/docs/typechecking-with-proptypes.html) for more information.
-
-## Migrating from React.PropTypes
-
-Check out [Migrating from React.PropTypes](https://facebook.github.io/react/blog/2017/04/07/react-v15.5.0.html#migrating-from-react.proptypes) for details on how to migrate to `prop-types` from `React.PropTypes`.
-
-Note that this blog posts **mentions a codemod script that performs the conversion automatically**.
-
-There are also important notes below.
-
-## How to Depend on This Package?
-
-For apps, we recommend putting it in `dependencies` with a caret range.
-For example:
-
-```js
-  "dependencies": {
-    "prop-types": "^15.5.7"
-  }
-```
-
-For libraries, we *also* recommend leaving it in `dependencies`:
-
-```js
-  "dependencies": {
-    "prop-types": "^15.5.7"
-  },
-  "peerDependencies": {
-    "react": "^15.5.0"
-  }
-```
-
-**Note:** there are known issues in versions before 15.5.7 so we recommend using it as the minimal version.
-
-Make sure that the version range uses a caret (`^`) and thus is broad enough for npm to efficiently deduplicate packages.
-
-For UMD bundles of your components, make sure you **don’t** include `PropTypes` in the build. Usually this is done by marking it as an external (the specifics depend on your bundler), just like you do with React.
-
-## Compatibility
-
-### React 0.14
-
-This package is compatible with **React 0.14.9**. Compared to 0.14.8 (which was released in March of 2016), there are no other changes in 0.14.9, so it should be a painless upgrade.
-
-```shell
-# ATTENTION: Only run this if you still use React 0.14!
-npm install --save react@^0.14.9 react-dom@^0.14.9
-```
-
-### React 15+
-
-This package is compatible with **React 15.3.0** and higher.
-
-```
-npm install --save react@^15.3.0 react-dom@^15.3.0
-```
-
-### What happens on other React versions?
-
-It outputs warnings with the message below even though the developer doesn’t do anything wrong. Unfortunately there is no solution for this other than updating React to either 15.3.0 or higher, or 0.14.9 if you’re using React 0.14.
-
-## Difference from `React.PropTypes`: Don’t Call Validator Functions
-
-First of all, **which version of React are you using**? You might be seeing this message because a component library has updated to use `prop-types` package, but your version of React is incompatible with it. See the [above section](#compatibility) for more details.
-
-Are you using either React 0.14.9 or a version higher than React 15.3.0? Read on.
-
-When you migrate components to use the standalone `prop-types`, **all validator functions will start throwing an error if you call them directly**. This makes sure that nobody relies on them in production code, and it is safe to strip their implementations to optimize the bundle size.
-
-Code like this is still fine:
-
-```js
-MyComponent.propTypes = {
-  myProp: PropTypes.bool
-};
-```
-
-However, code like this will not work with the `prop-types` package:
-
-```js
-// Will not work with `prop-types` package!
-var errorOrNull = PropTypes.bool(42, 'myProp', 'MyComponent', 'prop');
-```
-
-It will throw an error:
-
-```
-Calling PropTypes validators directly is not supported by the `prop-types` package.
-Use PropTypes.checkPropTypes() to call them.
-```
-
-(If you see **a warning** rather than an error with this message, please check the [above section about compatibility](#compatibility).)
-
-This is new behavior, and you will only encounter it when you migrate from `React.PropTypes` to the `prop-types` package. For the vast majority of components, this doesn’t matter, and if you didn’t see [this warning](https://facebook.github.io/react/warnings/dont-call-proptypes.html) in your components, your code is safe to migrate. This is not a breaking change in React because you are only opting into this change for a component by explicitly changing your imports to use `prop-types`. If you temporarily need the old behavior, you can keep using `React.PropTypes` until React 16.
-
-**If you absolutely need to trigger the validation manually**, call `PropTypes.checkPropTypes()`. Unlike the validators themselves, this function is safe to call in production, as it will be replaced by an empty function:
-
-```js
-// Works with standalone PropTypes
-PropTypes.checkPropTypes(MyComponent.propTypes, props, 'prop', 'MyComponent');
-```
-See below for more info.
-
-**You might also see this error** if you’re calling a `PropTypes` validator from your own custom `PropTypes` validator. In this case, the fix is to make sure that you are passing *all* of the arguments to the inner function. There is a more in-depth explanation of how to fix it [on this page](https://facebook.github.io/react/warnings/dont-call-proptypes.html#fixing-the-false-positive-in-third-party-proptypes). Alternatively, you can temporarily keep using `React.PropTypes` until React 16, as it would still only warn in this case.
-
-If you use a bundler like Browserify or Webpack, don’t forget to [follow these instructions](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build) to correctly bundle your application in development or production mode. Otherwise you’ll ship unnecessary code to your users.
-
-## PropTypes.checkPropTypes
-
-React will automatically check the propTypes you set on the component, but if
-you are using PropTypes without React then you may want to manually call
-`PropTypes.checkPropTypes`, like so:
-
-```js
-const myPropTypes = {
-  name: PropTypes.string,
-  age: PropTypes.number,
-  // ... define your prop validations
-};
-
-const props = {
-  name: 'hello', // is valid
-  age: 'world', // not valid
-};
-
-// Let's say your component is called 'MyComponent'
-
-// Works with standalone PropTypes
-PropTypes.checkPropTypes(myPropTypes, props, 'age', 'MyComponent');
-// This will warn as follows:
-// Warning: Failed prop type: Invalid prop `age` of type `string` supplied to
-// `MyComponent`, expected `number`.
-```
-
-## PropTypes.resetWarningCache()
-
-`PropTypes.checkPropTypes(...)` only `console.error.log(...)`s a given message once.  To reset the cache while testing call `PropTypes.resetWarningCache()`
-
-### License
-
-prop-types is [MIT licensed](./LICENSE).
diff --git a/node_modules/prop-types/checkPropTypes.js b/node_modules/prop-types/checkPropTypes.js
deleted file mode 100644
index 49111df..0000000
--- a/node_modules/prop-types/checkPropTypes.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-var printWarning = function() {};
-
-if (process.env.NODE_ENV !== 'production') {
-  var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');
-  var loggedTypeFailures = {};
-  var has = Function.call.bind(Object.prototype.hasOwnProperty);
-
-  printWarning = function(text) {
-    var message = 'Warning: ' + text;
-    if (typeof console !== 'undefined') {
-      console.error(message);
-    }
-    try {
-      // --- Welcome to debugging React ---
-      // This error was thrown as a convenience so that you can use this stack
-      // to find the callsite that caused this warning to fire.
-      throw new Error(message);
-    } catch (x) {}
-  };
-}
-
-/**
- * Assert that the values match with the type specs.
- * Error messages are memorized and will only be shown once.
- *
- * @param {object} typeSpecs Map of name to a ReactPropType
- * @param {object} values Runtime values that need to be type-checked
- * @param {string} location e.g. "prop", "context", "child context"
- * @param {string} componentName Name of the component for error messages.
- * @param {?Function} getStack Returns the component stack.
- * @private
- */
-function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
-  if (process.env.NODE_ENV !== 'production') {
-    for (var typeSpecName in typeSpecs) {
-      if (has(typeSpecs, typeSpecName)) {
-        var error;
-        // Prop type validation may throw. In case they do, we don't want to
-        // fail the render phase where it didn't fail before. So we log it.
-        // After these have been cleaned up, we'll let them throw.
-        try {
-          // This is intentionally an invariant that gets caught. It's the same
-          // behavior as without this statement except with a better message.
-          if (typeof typeSpecs[typeSpecName] !== 'function') {
-            var err = Error(
-              (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
-              'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'
-            );
-            err.name = 'Invariant Violation';
-            throw err;
-          }
-          error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
-        } catch (ex) {
-          error = ex;
-        }
-        if (error && !(error instanceof Error)) {
-          printWarning(
-            (componentName || 'React class') + ': type specification of ' +
-            location + ' `' + typeSpecName + '` is invalid; the type checker ' +
-            'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
-            'You may have forgotten to pass an argument to the type checker ' +
-            'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
-            'shape all require an argument).'
-          );
-        }
-        if (error instanceof Error && !(error.message in loggedTypeFailures)) {
-          // Only monitor this failure once because there tends to be a lot of the
-          // same error.
-          loggedTypeFailures[error.message] = true;
-
-          var stack = getStack ? getStack() : '';
-
-          printWarning(
-            'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
-          );
-        }
-      }
-    }
-  }
-}
-
-/**
- * Resets warning cache when testing.
- *
- * @private
- */
-checkPropTypes.resetWarningCache = function() {
-  if (process.env.NODE_ENV !== 'production') {
-    loggedTypeFailures = {};
-  }
-}
-
-module.exports = checkPropTypes;
diff --git a/node_modules/prop-types/factory.js b/node_modules/prop-types/factory.js
deleted file mode 100644
index abdf8e6..0000000
--- a/node_modules/prop-types/factory.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-// React 15.5 references this module, and assumes PropTypes are still callable in production.
-// Therefore we re-export development-only version with all the PropTypes checks here.
-// However if one is migrating to the `prop-types` npm library, they will go through the
-// `index.js` entry point, and it will branch depending on the environment.
-var factory = require('./factoryWithTypeCheckers');
-module.exports = function(isValidElement) {
-  // It is still allowed in 15.5.
-  var throwOnDirectAccess = false;
-  return factory(isValidElement, throwOnDirectAccess);
-};
diff --git a/node_modules/prop-types/factoryWithThrowingShims.js b/node_modules/prop-types/factoryWithThrowingShims.js
deleted file mode 100644
index e5b2f9c..0000000
--- a/node_modules/prop-types/factoryWithThrowingShims.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');
-
-function emptyFunction() {}
-function emptyFunctionWithReset() {}
-emptyFunctionWithReset.resetWarningCache = emptyFunction;
-
-module.exports = function() {
-  function shim(props, propName, componentName, location, propFullName, secret) {
-    if (secret === ReactPropTypesSecret) {
-      // It is still safe when called from React.
-      return;
-    }
-    var err = new Error(
-      'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
-      'Use PropTypes.checkPropTypes() to call them. ' +
-      'Read more at http://fb.me/use-check-prop-types'
-    );
-    err.name = 'Invariant Violation';
-    throw err;
-  };
-  shim.isRequired = shim;
-  function getShim() {
-    return shim;
-  };
-  // Important!
-  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.
-  var ReactPropTypes = {
-    array: shim,
-    bool: shim,
-    func: shim,
-    number: shim,
-    object: shim,
-    string: shim,
-    symbol: shim,
-
-    any: shim,
-    arrayOf: getShim,
-    element: shim,
-    elementType: shim,
-    instanceOf: getShim,
-    node: shim,
-    objectOf: getShim,
-    oneOf: getShim,
-    oneOfType: getShim,
-    shape: getShim,
-    exact: getShim,
-
-    checkPropTypes: emptyFunctionWithReset,
-    resetWarningCache: emptyFunction
-  };
-
-  ReactPropTypes.PropTypes = ReactPropTypes;
-
-  return ReactPropTypes;
-};
diff --git a/node_modules/prop-types/factoryWithTypeCheckers.js b/node_modules/prop-types/factoryWithTypeCheckers.js
deleted file mode 100644
index 3711f0b..0000000
--- a/node_modules/prop-types/factoryWithTypeCheckers.js
+++ /dev/null
@@ -1,591 +0,0 @@
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-var ReactIs = require('react-is');
-var assign = require('object-assign');
-
-var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');
-var checkPropTypes = require('./checkPropTypes');
-
-var has = Function.call.bind(Object.prototype.hasOwnProperty);
-var printWarning = function() {};
-
-if (process.env.NODE_ENV !== 'production') {
-  printWarning = function(text) {
-    var message = 'Warning: ' + text;
-    if (typeof console !== 'undefined') {
-      console.error(message);
-    }
-    try {
-      // --- Welcome to debugging React ---
-      // This error was thrown as a convenience so that you can use this stack
-      // to find the callsite that caused this warning to fire.
-      throw new Error(message);
-    } catch (x) {}
-  };
-}
-
-function emptyFunctionThatReturnsNull() {
-  return null;
-}
-
-module.exports = function(isValidElement, throwOnDirectAccess) {
-  /* global Symbol */
-  var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
-  var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.
-
-  /**
-   * Returns the iterator method function contained on the iterable object.
-   *
-   * Be sure to invoke the function with the iterable as context:
-   *
-   *     var iteratorFn = getIteratorFn(myIterable);
-   *     if (iteratorFn) {
-   *       var iterator = iteratorFn.call(myIterable);
-   *       ...
-   *     }
-   *
-   * @param {?object} maybeIterable
-   * @return {?function}
-   */
-  function getIteratorFn(maybeIterable) {
-    var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
-    if (typeof iteratorFn === 'function') {
-      return iteratorFn;
-    }
-  }
-
-  /**
-   * Collection of methods that allow declaration and validation of props that are
-   * supplied to React components. Example usage:
-   *
-   *   var Props = require('ReactPropTypes');
-   *   var MyArticle = React.createClass({
-   *     propTypes: {
-   *       // An optional string prop named "description".
-   *       description: Props.string,
-   *
-   *       // A required enum prop named "category".
-   *       category: Props.oneOf(['News','Photos']).isRequired,
-   *
-   *       // A prop named "dialog" that requires an instance of Dialog.
-   *       dialog: Props.instanceOf(Dialog).isRequired
-   *     },
-   *     render: function() { ... }
-   *   });
-   *
-   * A more formal specification of how these methods are used:
-   *
-   *   type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)
-   *   decl := ReactPropTypes.{type}(.isRequired)?
-   *
-   * Each and every declaration produces a function with the same signature. This
-   * allows the creation of custom validation functions. For example:
-   *
-   *  var MyLink = React.createClass({
-   *    propTypes: {
-   *      // An optional string or URI prop named "href".
-   *      href: function(props, propName, componentName) {
-   *        var propValue = props[propName];
-   *        if (propValue != null && typeof propValue !== 'string' &&
-   *            !(propValue instanceof URI)) {
-   *          return new Error(
-   *            'Expected a string or an URI for ' + propName + ' in ' +
-   *            componentName
-   *          );
-   *        }
-   *      }
-   *    },
-   *    render: function() {...}
-   *  });
-   *
-   * @internal
-   */
-
-  var ANONYMOUS = '<<anonymous>>';
-
-  // Important!
-  // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.
-  var ReactPropTypes = {
-    array: createPrimitiveTypeChecker('array'),
-    bool: createPrimitiveTypeChecker('boolean'),
-    func: createPrimitiveTypeChecker('function'),
-    number: createPrimitiveTypeChecker('number'),
-    object: createPrimitiveTypeChecker('object'),
-    string: createPrimitiveTypeChecker('string'),
-    symbol: createPrimitiveTypeChecker('symbol'),
-
-    any: createAnyTypeChecker(),
-    arrayOf: createArrayOfTypeChecker,
-    element: createElementTypeChecker(),
-    elementType: createElementTypeTypeChecker(),
-    instanceOf: createInstanceTypeChecker,
-    node: createNodeChecker(),
-    objectOf: createObjectOfTypeChecker,
-    oneOf: createEnumTypeChecker,
-    oneOfType: createUnionTypeChecker,
-    shape: createShapeTypeChecker,
-    exact: createStrictShapeTypeChecker,
-  };
-
-  /**
-   * inlined Object.is polyfill to avoid requiring consumers ship their own
-   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
-   */
-  /*eslint-disable no-self-compare*/
-  function is(x, y) {
-    // SameValue algorithm
-    if (x === y) {
-      // Steps 1-5, 7-10
-      // Steps 6.b-6.e: +0 != -0
-      return x !== 0 || 1 / x === 1 / y;
-    } else {
-      // Step 6.a: NaN == NaN
-      return x !== x && y !== y;
-    }
-  }
-  /*eslint-enable no-self-compare*/
-
-  /**
-   * We use an Error-like object for backward compatibility as people may call
-   * PropTypes directly and inspect their output. However, we don't use real
-   * Errors anymore. We don't inspect their stack anyway, and creating them
-   * is prohibitively expensive if they are created too often, such as what
-   * happens in oneOfType() for any type before the one that matched.
-   */
-  function PropTypeError(message) {
-    this.message = message;
-    this.stack = '';
-  }
-  // Make `instanceof Error` still work for returned errors.
-  PropTypeError.prototype = Error.prototype;
-
-  function createChainableTypeChecker(validate) {
-    if (process.env.NODE_ENV !== 'production') {
-      var manualPropTypeCallCache = {};
-      var manualPropTypeWarningCount = 0;
-    }
-    function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {
-      componentName = componentName || ANONYMOUS;
-      propFullName = propFullName || propName;
-
-      if (secret !== ReactPropTypesSecret) {
-        if (throwOnDirectAccess) {
-          // New behavior only for users of `prop-types` package
-          var err = new Error(
-            'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
-            'Use `PropTypes.checkPropTypes()` to call them. ' +
-            'Read more at http://fb.me/use-check-prop-types'
-          );
-          err.name = 'Invariant Violation';
-          throw err;
-        } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {
-          // Old behavior for people using React.PropTypes
-          var cacheKey = componentName + ':' + propName;
-          if (
-            !manualPropTypeCallCache[cacheKey] &&
-            // Avoid spamming the console because they are often not actionable except for lib authors
-            manualPropTypeWarningCount < 3
-          ) {
-            printWarning(
-              'You are manually calling a React.PropTypes validation ' +
-              'function for the `' + propFullName + '` prop on `' + componentName  + '`. This is deprecated ' +
-              'and will throw in the standalone `prop-types` package. ' +
-              'You may be seeing this warning due to a third-party PropTypes ' +
-              'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'
-            );
-            manualPropTypeCallCache[cacheKey] = true;
-            manualPropTypeWarningCount++;
-          }
-        }
-      }
-      if (props[propName] == null) {
-        if (isRequired) {
-          if (props[propName] === null) {
-            return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));
-          }
-          return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));
-        }
-        return null;
-      } else {
-        return validate(props, propName, componentName, location, propFullName);
-      }
-    }
-
-    var chainedCheckType = checkType.bind(null, false);
-    chainedCheckType.isRequired = checkType.bind(null, true);
-
-    return chainedCheckType;
-  }
-
-  function createPrimitiveTypeChecker(expectedType) {
-    function validate(props, propName, componentName, location, propFullName, secret) {
-      var propValue = props[propName];
-      var propType = getPropType(propValue);
-      if (propType !== expectedType) {
-        // `propValue` being instance of, say, date/regexp, pass the 'object'
-        // check, but we can offer a more precise error message here rather than
-        // 'of type `object`'.
-        var preciseType = getPreciseType(propValue);
-
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createAnyTypeChecker() {
-    return createChainableTypeChecker(emptyFunctionThatReturnsNull);
-  }
-
-  function createArrayOfTypeChecker(typeChecker) {
-    function validate(props, propName, componentName, location, propFullName) {
-      if (typeof typeChecker !== 'function') {
-        return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');
-      }
-      var propValue = props[propName];
-      if (!Array.isArray(propValue)) {
-        var propType = getPropType(propValue);
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
-      }
-      for (var i = 0; i < propValue.length; i++) {
-        var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);
-        if (error instanceof Error) {
-          return error;
-        }
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createElementTypeChecker() {
-    function validate(props, propName, componentName, location, propFullName) {
-      var propValue = props[propName];
-      if (!isValidElement(propValue)) {
-        var propType = getPropType(propValue);
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createElementTypeTypeChecker() {
-    function validate(props, propName, componentName, location, propFullName) {
-      var propValue = props[propName];
-      if (!ReactIs.isValidElementType(propValue)) {
-        var propType = getPropType(propValue);
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createInstanceTypeChecker(expectedClass) {
-    function validate(props, propName, componentName, location, propFullName) {
-      if (!(props[propName] instanceof expectedClass)) {
-        var expectedClassName = expectedClass.name || ANONYMOUS;
-        var actualClassName = getClassName(props[propName]);
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createEnumTypeChecker(expectedValues) {
-    if (!Array.isArray(expectedValues)) {
-      if (process.env.NODE_ENV !== 'production') {
-        if (arguments.length > 1) {
-          printWarning(
-            'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +
-            'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'
-          );
-        } else {
-          printWarning('Invalid argument supplied to oneOf, expected an array.');
-        }
-      }
-      return emptyFunctionThatReturnsNull;
-    }
-
-    function validate(props, propName, componentName, location, propFullName) {
-      var propValue = props[propName];
-      for (var i = 0; i < expectedValues.length; i++) {
-        if (is(propValue, expectedValues[i])) {
-          return null;
-        }
-      }
-
-      var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {
-        var type = getPreciseType(value);
-        if (type === 'symbol') {
-          return String(value);
-        }
-        return value;
-      });
-      return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createObjectOfTypeChecker(typeChecker) {
-    function validate(props, propName, componentName, location, propFullName) {
-      if (typeof typeChecker !== 'function') {
-        return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');
-      }
-      var propValue = props[propName];
-      var propType = getPropType(propValue);
-      if (propType !== 'object') {
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));
-      }
-      for (var key in propValue) {
-        if (has(propValue, key)) {
-          var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
-          if (error instanceof Error) {
-            return error;
-          }
-        }
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createUnionTypeChecker(arrayOfTypeCheckers) {
-    if (!Array.isArray(arrayOfTypeCheckers)) {
-      process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;
-      return emptyFunctionThatReturnsNull;
-    }
-
-    for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
-      var checker = arrayOfTypeCheckers[i];
-      if (typeof checker !== 'function') {
-        printWarning(
-          'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +
-          'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'
-        );
-        return emptyFunctionThatReturnsNull;
-      }
-    }
-
-    function validate(props, propName, componentName, location, propFullName) {
-      for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
-        var checker = arrayOfTypeCheckers[i];
-        if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) {
-          return null;
-        }
-      }
-
-      return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createNodeChecker() {
-    function validate(props, propName, componentName, location, propFullName) {
-      if (!isNode(props[propName])) {
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createShapeTypeChecker(shapeTypes) {
-    function validate(props, propName, componentName, location, propFullName) {
-      var propValue = props[propName];
-      var propType = getPropType(propValue);
-      if (propType !== 'object') {
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
-      }
-      for (var key in shapeTypes) {
-        var checker = shapeTypes[key];
-        if (!checker) {
-          continue;
-        }
-        var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
-        if (error) {
-          return error;
-        }
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createStrictShapeTypeChecker(shapeTypes) {
-    function validate(props, propName, componentName, location, propFullName) {
-      var propValue = props[propName];
-      var propType = getPropType(propValue);
-      if (propType !== 'object') {
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
-      }
-      // We need to check all keys in case some are required but missing from
-      // props.
-      var allKeys = assign({}, props[propName], shapeTypes);
-      for (var key in allKeys) {
-        var checker = shapeTypes[key];
-        if (!checker) {
-          return new PropTypeError(
-            'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +
-            '\nBad object: ' + JSON.stringify(props[propName], null, '  ') +
-            '\nValid keys: ' +  JSON.stringify(Object.keys(shapeTypes), null, '  ')
-          );
-        }
-        var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
-        if (error) {
-          return error;
-        }
-      }
-      return null;
-    }
-
-    return createChainableTypeChecker(validate);
-  }
-
-  function isNode(propValue) {
-    switch (typeof propValue) {
-      case 'number':
-      case 'string':
-      case 'undefined':
-        return true;
-      case 'boolean':
-        return !propValue;
-      case 'object':
-        if (Array.isArray(propValue)) {
-          return propValue.every(isNode);
-        }
-        if (propValue === null || isValidElement(propValue)) {
-          return true;
-        }
-
-        var iteratorFn = getIteratorFn(propValue);
-        if (iteratorFn) {
-          var iterator = iteratorFn.call(propValue);
-          var step;
-          if (iteratorFn !== propValue.entries) {
-            while (!(step = iterator.next()).done) {
-              if (!isNode(step.value)) {
-                return false;
-              }
-            }
-          } else {
-            // Iterator will provide entry [k,v] tuples rather than values.
-            while (!(step = iterator.next()).done) {
-              var entry = step.value;
-              if (entry) {
-                if (!isNode(entry[1])) {
-                  return false;
-                }
-              }
-            }
-          }
-        } else {
-          return false;
-        }
-
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  function isSymbol(propType, propValue) {
-    // Native Symbol.
-    if (propType === 'symbol') {
-      return true;
-    }
-
-    // falsy value can't be a Symbol
-    if (!propValue) {
-      return false;
-    }
-
-    // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'
-    if (propValue['@@toStringTag'] === 'Symbol') {
-      return true;
-    }
-
-    // Fallback for non-spec compliant Symbols which are polyfilled.
-    if (typeof Symbol === 'function' && propValue instanceof Symbol) {
-      return true;
-    }
-
-    return false;
-  }
-
-  // Equivalent of `typeof` but with special handling for array and regexp.
-  function getPropType(propValue) {
-    var propType = typeof propValue;
-    if (Array.isArray(propValue)) {
-      return 'array';
-    }
-    if (propValue instanceof RegExp) {
-      // Old webkits (at least until Android 4.0) return 'function' rather than
-      // 'object' for typeof a RegExp. We'll normalize this here so that /bla/
-      // passes PropTypes.object.
-      return 'object';
-    }
-    if (isSymbol(propType, propValue)) {
-      return 'symbol';
-    }
-    return propType;
-  }
-
-  // This handles more types than `getPropType`. Only used for error messages.
-  // See `createPrimitiveTypeChecker`.
-  function getPreciseType(propValue) {
-    if (typeof propValue === 'undefined' || propValue === null) {
-      return '' + propValue;
-    }
-    var propType = getPropType(propValue);
-    if (propType === 'object') {
-      if (propValue instanceof Date) {
-        return 'date';
-      } else if (propValue instanceof RegExp) {
-        return 'regexp';
-      }
-    }
-    return propType;
-  }
-
-  // Returns a string that is postfixed to a warning about an invalid type.
-  // For example, "undefined" or "of type array"
-  function getPostfixForTypeWarning(value) {
-    var type = getPreciseType(value);
-    switch (type) {
-      case 'array':
-      case 'object':
-        return 'an ' + type;
-      case 'boolean':
-      case 'date':
-      case 'regexp':
-        return 'a ' + type;
-      default:
-        return type;
-    }
-  }
-
-  // Returns class name of the object, if any.
-  function getClassName(propValue) {
-    if (!propValue.constructor || !propValue.constructor.name) {
-      return ANONYMOUS;
-    }
-    return propValue.constructor.name;
-  }
-
-  ReactPropTypes.checkPropTypes = checkPropTypes;
-  ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;
-  ReactPropTypes.PropTypes = ReactPropTypes;
-
-  return ReactPropTypes;
-};
diff --git a/node_modules/prop-types/index.js b/node_modules/prop-types/index.js
deleted file mode 100644
index e9ef51d..0000000
--- a/node_modules/prop-types/index.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-if (process.env.NODE_ENV !== 'production') {
-  var ReactIs = require('react-is');
-
-  // By explicitly using `prop-types` you are opting into new development behavior.
-  // http://fb.me/prop-types-in-prod
-  var throwOnDirectAccess = true;
-  module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);
-} else {
-  // By explicitly using `prop-types` you are opting into new production behavior.
-  // http://fb.me/prop-types-in-prod
-  module.exports = require('./factoryWithThrowingShims')();
-}
diff --git a/node_modules/prop-types/lib/ReactPropTypesSecret.js b/node_modules/prop-types/lib/ReactPropTypesSecret.js
deleted file mode 100644
index f54525e..0000000
--- a/node_modules/prop-types/lib/ReactPropTypesSecret.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
-
-module.exports = ReactPropTypesSecret;
diff --git a/node_modules/prop-types/node_modules/.bin/loose-envify b/node_modules/prop-types/node_modules/.bin/loose-envify
deleted file mode 120000
index 2a6b8df..0000000
--- a/node_modules/prop-types/node_modules/.bin/loose-envify
+++ /dev/null
@@ -1 +0,0 @@
-../../../loose-envify/cli.js
\ No newline at end of file
diff --git a/node_modules/prop-types/node_modules/react-is/LICENSE b/node_modules/prop-types/node_modules/react-is/LICENSE
deleted file mode 100644
index b96dcb0..0000000
--- a/node_modules/prop-types/node_modules/react-is/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) Facebook, Inc. and its affiliates.
-
-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/node_modules/prop-types/node_modules/react-is/README.md b/node_modules/prop-types/node_modules/react-is/README.md
deleted file mode 100644
index d255977..0000000
--- a/node_modules/prop-types/node_modules/react-is/README.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# `react-is`
-
-This package allows you to test arbitrary values and see if they're a particular React element type.
-
-## Installation
-
-```sh
-# Yarn
-yarn add react-is
-
-# NPM
-npm install react-is
-```
-
-## Usage
-
-### Determining if a Component is Valid
-
-```js
-import React from "react";
-import * as ReactIs from "react-is";
-
-class ClassComponent extends React.Component {
-  render() {
-    return React.createElement("div");
-  }
-}
-
-const FunctionComponent = () => React.createElement("div");
-
-const ForwardRefComponent = React.forwardRef((props, ref) =>
-  React.createElement(Component, { forwardedRef: ref, ...props })
-);
-
-const Context = React.createContext(false);
-
-ReactIs.isValidElementType("div"); // true
-ReactIs.isValidElementType(ClassComponent); // true
-ReactIs.isValidElementType(FunctionComponent); // true
-ReactIs.isValidElementType(ForwardRefComponent); // true
-ReactIs.isValidElementType(Context.Provider); // true
-ReactIs.isValidElementType(Context.Consumer); // true
-ReactIs.isValidElementType(React.createFactory("div")); // true
-```
-
-### Determining an Element's Type
-
-#### Context
-
-```js
-import React from "react";
-import * as ReactIs from 'react-is';
-
-const ThemeContext = React.createContext("blue");
-
-ReactIs.isContextConsumer(<ThemeContext.Consumer />); // true
-ReactIs.isContextProvider(<ThemeContext.Provider />); // true
-ReactIs.typeOf(<ThemeContext.Provider />) === ReactIs.ContextProvider; // true
-ReactIs.typeOf(<ThemeContext.Consumer />) === ReactIs.ContextConsumer; // true
-```
-
-#### Element
-
-```js
-import React from "react";
-import * as ReactIs from 'react-is';
-
-ReactIs.isElement(<div />); // true
-ReactIs.typeOf(<div />) === ReactIs.Element; // true
-```
-
-#### Fragment
-
-```js
-import React from "react";
-import * as ReactIs from 'react-is';
-
-ReactIs.isFragment(<></>); // true
-ReactIs.typeOf(<></>) === ReactIs.Fragment; // true
-```
-
-#### Portal
-
-```js
-import React from "react";
-import ReactDOM from "react-dom";
-import * as ReactIs from 'react-is';
-
-const div = document.createElement("div");
-const portal = ReactDOM.createPortal(<div />, div);
-
-ReactIs.isPortal(portal); // true
-ReactIs.typeOf(portal) === ReactIs.Portal; // true
-```
-
-#### StrictMode
-
-```js
-import React from "react";
-import * as ReactIs from 'react-is';
-
-ReactIs.isStrictMode(<React.StrictMode />); // true
-ReactIs.typeOf(<React.StrictMode />) === ReactIs.StrictMode; // true
-```
diff --git a/node_modules/prop-types/node_modules/react-is/build-info.json b/node_modules/prop-types/node_modules/react-is/build-info.json
deleted file mode 100644
index 9bde9e6..0000000
--- a/node_modules/prop-types/node_modules/react-is/build-info.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "branch": "master",
-  "buildNumber": "91354",
-  "checksum": "b0ed8f5",
-  "commit": "d28bd2994",
-  "environment": "ci",
-  "reactVersion": "16.12.0-d28bd2994"
-}
diff --git a/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js b/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js
deleted file mode 100644
index 6e1f2f5..0000000
--- a/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js
+++ /dev/null
@@ -1,181 +0,0 @@
-/** @license React v16.13.0
- * react-is.development.js
- *
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-
-
-if (process.env.NODE_ENV !== "production") {
-  (function() {
-'use strict';
-
-// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
-// nor polyfill, then a plain number is used for performance.
-var hasSymbol = typeof Symbol === 'function' && Symbol.for;
-var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
-var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
-var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
-var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
-var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
-var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
-var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary
-// (unstable) APIs that have been removed. Can we remove the symbols?
-
-var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;
-var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
-var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
-var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
-var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;
-var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
-var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
-var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;
-var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;
-var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;
-var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;
-
-function isValidElementType(type) {
-  return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.
-  type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);
-}
-
-function typeOf(object) {
-  if (typeof object === 'object' && object !== null) {
-    var $$typeof = object.$$typeof;
-
-    switch ($$typeof) {
-      case REACT_ELEMENT_TYPE:
-        var type = object.type;
-
-        switch (type) {
-          case REACT_ASYNC_MODE_TYPE:
-          case REACT_CONCURRENT_MODE_TYPE:
-          case REACT_FRAGMENT_TYPE:
-          case REACT_PROFILER_TYPE:
-          case REACT_STRICT_MODE_TYPE:
-          case REACT_SUSPENSE_TYPE:
-            return type;
-
-          default:
-            var $$typeofType = type && type.$$typeof;
-
-            switch ($$typeofType) {
-              case REACT_CONTEXT_TYPE:
-              case REACT_FORWARD_REF_TYPE:
-              case REACT_LAZY_TYPE:
-              case REACT_MEMO_TYPE:
-              case REACT_PROVIDER_TYPE:
-                return $$typeofType;
-
-              default:
-                return $$typeof;
-            }
-
-        }
-
-      case REACT_PORTAL_TYPE:
-        return $$typeof;
-    }
-  }
-
-  return undefined;
-} // AsyncMode is deprecated along with isAsyncMode
-
-var AsyncMode = REACT_ASYNC_MODE_TYPE;
-var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;
-var ContextConsumer = REACT_CONTEXT_TYPE;
-var ContextProvider = REACT_PROVIDER_TYPE;
-var Element = REACT_ELEMENT_TYPE;
-var ForwardRef = REACT_FORWARD_REF_TYPE;
-var Fragment = REACT_FRAGMENT_TYPE;
-var Lazy = REACT_LAZY_TYPE;
-var Memo = REACT_MEMO_TYPE;
-var Portal = REACT_PORTAL_TYPE;
-var Profiler = REACT_PROFILER_TYPE;
-var StrictMode = REACT_STRICT_MODE_TYPE;
-var Suspense = REACT_SUSPENSE_TYPE;
-var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated
-
-function isAsyncMode(object) {
-  {
-    if (!hasWarnedAboutDeprecatedIsAsyncMode) {
-      hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint
-
-      console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');
-    }
-  }
-
-  return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;
-}
-function isConcurrentMode(object) {
-  return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;
-}
-function isContextConsumer(object) {
-  return typeOf(object) === REACT_CONTEXT_TYPE;
-}
-function isContextProvider(object) {
-  return typeOf(object) === REACT_PROVIDER_TYPE;
-}
-function isElement(object) {
-  return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
-}
-function isForwardRef(object) {
-  return typeOf(object) === REACT_FORWARD_REF_TYPE;
-}
-function isFragment(object) {
-  return typeOf(object) === REACT_FRAGMENT_TYPE;
-}
-function isLazy(object) {
-  return typeOf(object) === REACT_LAZY_TYPE;
-}
-function isMemo(object) {
-  return typeOf(object) === REACT_MEMO_TYPE;
-}
-function isPortal(object) {
-  return typeOf(object) === REACT_PORTAL_TYPE;
-}
-function isProfiler(object) {
-  return typeOf(object) === REACT_PROFILER_TYPE;
-}
-function isStrictMode(object) {
-  return typeOf(object) === REACT_STRICT_MODE_TYPE;
-}
-function isSuspense(object) {
-  return typeOf(object) === REACT_SUSPENSE_TYPE;
-}
-
-exports.AsyncMode = AsyncMode;
-exports.ConcurrentMode = ConcurrentMode;
-exports.ContextConsumer = ContextConsumer;
-exports.ContextProvider = ContextProvider;
-exports.Element = Element;
-exports.ForwardRef = ForwardRef;
-exports.Fragment = Fragment;
-exports.Lazy = Lazy;
-exports.Memo = Memo;
-exports.Portal = Portal;
-exports.Profiler = Profiler;
-exports.StrictMode = StrictMode;
-exports.Suspense = Suspense;
-exports.isAsyncMode = isAsyncMode;
-exports.isConcurrentMode = isConcurrentMode;
-exports.isContextConsumer = isContextConsumer;
-exports.isContextProvider = isContextProvider;
-exports.isElement = isElement;
-exports.isForwardRef = isForwardRef;
-exports.isFragment = isFragment;
-exports.isLazy = isLazy;
-exports.isMemo = isMemo;
-exports.isPortal = isPortal;
-exports.isProfiler = isProfiler;
-exports.isStrictMode = isStrictMode;
-exports.isSuspense = isSuspense;
-exports.isValidElementType = isValidElementType;
-exports.typeOf = typeOf;
-  })();
-}
diff --git a/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js b/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js
deleted file mode 100644
index a9c03f1..0000000
--- a/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/** @license React v16.13.0
- * react-is.production.min.js
- *
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b?
-Symbol.for("react.suspense_list"):60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.block"):60121,w=b?Symbol.for("react.fundamental"):60117,x=b?Symbol.for("react.responder"):60118,y=b?Symbol.for("react.scope"):60119;
-function z(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;
-exports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};
-exports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};
-exports.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;
diff --git a/node_modules/prop-types/node_modules/react-is/index.js b/node_modules/prop-types/node_modules/react-is/index.js
deleted file mode 100644
index 3ae098d..0000000
--- a/node_modules/prop-types/node_modules/react-is/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-'use strict';
-
-if (process.env.NODE_ENV === 'production') {
-  module.exports = require('./cjs/react-is.production.min.js');
-} else {
-  module.exports = require('./cjs/react-is.development.js');
-}
diff --git a/node_modules/prop-types/node_modules/react-is/package.json b/node_modules/prop-types/node_modules/react-is/package.json
deleted file mode 100644
index 0936162..0000000
--- a/node_modules/prop-types/node_modules/react-is/package.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-  "name": "react-is",
-  "version": "16.13.0",
-  "description": "Brand checking of React Elements.",
-  "main": "index.js",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/facebook/react.git",
-    "directory": "packages/react-is"
-  },
-  "keywords": [
-    "react"
-  ],
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/facebook/react/issues"
-  },
-  "homepage": "https://reactjs.org/",
-  "files": [
-    "LICENSE",
-    "README.md",
-    "build-info.json",
-    "index.js",
-    "cjs/",
-    "umd/"
-  ]
-}
diff --git a/node_modules/prop-types/node_modules/react-is/umd/react-is.development.js b/node_modules/prop-types/node_modules/react-is/umd/react-is.development.js
deleted file mode 100644
index 1b57de1..0000000
--- a/node_modules/prop-types/node_modules/react-is/umd/react-is.development.js
+++ /dev/null
@@ -1,181 +0,0 @@
-/** @license React v16.13.0
- * react-is.development.js
- *
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-(function (global, factory) {
-  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
-  typeof define === 'function' && define.amd ? define(['exports'], factory) :
-  (global = global || self, factory(global.ReactIs = {}));
-}(this, (function (exports) { 'use strict';
-
-  // The Symbol used to tag the ReactElement-like types. If there is no native Symbol
-  // nor polyfill, then a plain number is used for performance.
-  var hasSymbol = typeof Symbol === 'function' && Symbol.for;
-  var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
-  var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
-  var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
-  var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
-  var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
-  var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
-  var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary
-  // (unstable) APIs that have been removed. Can we remove the symbols?
-
-  var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;
-  var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
-  var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
-  var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
-  var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;
-  var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
-  var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
-  var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;
-  var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;
-  var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;
-  var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;
-
-  function isValidElementType(type) {
-    return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.
-    type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);
-  }
-
-  function typeOf(object) {
-    if (typeof object === 'object' && object !== null) {
-      var $$typeof = object.$$typeof;
-
-      switch ($$typeof) {
-        case REACT_ELEMENT_TYPE:
-          var type = object.type;
-
-          switch (type) {
-            case REACT_ASYNC_MODE_TYPE:
-            case REACT_CONCURRENT_MODE_TYPE:
-            case REACT_FRAGMENT_TYPE:
-            case REACT_PROFILER_TYPE:
-            case REACT_STRICT_MODE_TYPE:
-            case REACT_SUSPENSE_TYPE:
-              return type;
-
-            default:
-              var $$typeofType = type && type.$$typeof;
-
-              switch ($$typeofType) {
-                case REACT_CONTEXT_TYPE:
-                case REACT_FORWARD_REF_TYPE:
-                case REACT_LAZY_TYPE:
-                case REACT_MEMO_TYPE:
-                case REACT_PROVIDER_TYPE:
-                  return $$typeofType;
-
-                default:
-                  return $$typeof;
-              }
-
-          }
-
-        case REACT_PORTAL_TYPE:
-          return $$typeof;
-      }
-    }
-
-    return undefined;
-  } // AsyncMode is deprecated along with isAsyncMode
-
-  var AsyncMode = REACT_ASYNC_MODE_TYPE;
-  var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;
-  var ContextConsumer = REACT_CONTEXT_TYPE;
-  var ContextProvider = REACT_PROVIDER_TYPE;
-  var Element = REACT_ELEMENT_TYPE;
-  var ForwardRef = REACT_FORWARD_REF_TYPE;
-  var Fragment = REACT_FRAGMENT_TYPE;
-  var Lazy = REACT_LAZY_TYPE;
-  var Memo = REACT_MEMO_TYPE;
-  var Portal = REACT_PORTAL_TYPE;
-  var Profiler = REACT_PROFILER_TYPE;
-  var StrictMode = REACT_STRICT_MODE_TYPE;
-  var Suspense = REACT_SUSPENSE_TYPE;
-  var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated
-
-  function isAsyncMode(object) {
-    {
-      if (!hasWarnedAboutDeprecatedIsAsyncMode) {
-        hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint
-
-        console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');
-      }
-    }
-
-    return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;
-  }
-  function isConcurrentMode(object) {
-    return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;
-  }
-  function isContextConsumer(object) {
-    return typeOf(object) === REACT_CONTEXT_TYPE;
-  }
-  function isContextProvider(object) {
-    return typeOf(object) === REACT_PROVIDER_TYPE;
-  }
-  function isElement(object) {
-    return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
-  }
-  function isForwardRef(object) {
-    return typeOf(object) === REACT_FORWARD_REF_TYPE;
-  }
-  function isFragment(object) {
-    return typeOf(object) === REACT_FRAGMENT_TYPE;
-  }
-  function isLazy(object) {
-    return typeOf(object) === REACT_LAZY_TYPE;
-  }
-  function isMemo(object) {
-    return typeOf(object) === REACT_MEMO_TYPE;
-  }
-  function isPortal(object) {
-    return typeOf(object) === REACT_PORTAL_TYPE;
-  }
-  function isProfiler(object) {
-    return typeOf(object) === REACT_PROFILER_TYPE;
-  }
-  function isStrictMode(object) {
-    return typeOf(object) === REACT_STRICT_MODE_TYPE;
-  }
-  function isSuspense(object) {
-    return typeOf(object) === REACT_SUSPENSE_TYPE;
-  }
-
-  exports.AsyncMode = AsyncMode;
-  exports.ConcurrentMode = ConcurrentMode;
-  exports.ContextConsumer = ContextConsumer;
-  exports.ContextProvider = ContextProvider;
-  exports.Element = Element;
-  exports.ForwardRef = ForwardRef;
-  exports.Fragment = Fragment;
-  exports.Lazy = Lazy;
-  exports.Memo = Memo;
-  exports.Portal = Portal;
-  exports.Profiler = Profiler;
-  exports.StrictMode = StrictMode;
-  exports.Suspense = Suspense;
-  exports.isAsyncMode = isAsyncMode;
-  exports.isConcurrentMode = isConcurrentMode;
-  exports.isContextConsumer = isContextConsumer;
-  exports.isContextProvider = isContextProvider;
-  exports.isElement = isElement;
-  exports.isForwardRef = isForwardRef;
-  exports.isFragment = isFragment;
-  exports.isLazy = isLazy;
-  exports.isMemo = isMemo;
-  exports.isPortal = isPortal;
-  exports.isProfiler = isProfiler;
-  exports.isStrictMode = isStrictMode;
-  exports.isSuspense = isSuspense;
-  exports.isValidElementType = isValidElementType;
-  exports.typeOf = typeOf;
-
-})));
diff --git a/node_modules/prop-types/node_modules/react-is/umd/react-is.production.min.js b/node_modules/prop-types/node_modules/react-is/umd/react-is.production.min.js
deleted file mode 100644
index c1e2c60..0000000
--- a/node_modules/prop-types/node_modules/react-is/umd/react-is.production.min.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/** @license React v16.13.0
- * react-is.production.min.js
- *
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-'use strict';(function(b,d){"object"===typeof exports&&"undefined"!==typeof module?d(exports):"function"===typeof define&&define.amd?define(["exports"],d):(b=b||self,d(b.ReactIs={}))})(this,function(b){function d(a){if("object"===typeof a&&null!==a){var b=a.$$typeof;switch(b){case r:switch(a=a.type,a){case t:case e:case f:case g:case h:case k:return a;default:switch(a=a&&a.$$typeof,a){case l:case m:case n:case p:case q:return a;default:return b}}case u:return b}}}function v(a){return d(a)===e}var c=
-"function"===typeof Symbol&&Symbol.for,r=c?Symbol.for("react.element"):60103,u=c?Symbol.for("react.portal"):60106,f=c?Symbol.for("react.fragment"):60107,h=c?Symbol.for("react.strict_mode"):60108,g=c?Symbol.for("react.profiler"):60114,q=c?Symbol.for("react.provider"):60109,l=c?Symbol.for("react.context"):60110,t=c?Symbol.for("react.async_mode"):60111,e=c?Symbol.for("react.concurrent_mode"):60111,m=c?Symbol.for("react.forward_ref"):60112,k=c?Symbol.for("react.suspense"):60113,w=c?Symbol.for("react.suspense_list"):
-60120,p=c?Symbol.for("react.memo"):60115,n=c?Symbol.for("react.lazy"):60116,x=c?Symbol.for("react.block"):60121,y=c?Symbol.for("react.fundamental"):60117,z=c?Symbol.for("react.responder"):60118,A=c?Symbol.for("react.scope"):60119;b.AsyncMode=t;b.ConcurrentMode=e;b.ContextConsumer=l;b.ContextProvider=q;b.Element=r;b.ForwardRef=m;b.Fragment=f;b.Lazy=n;b.Memo=p;b.Portal=u;b.Profiler=g;b.StrictMode=h;b.Suspense=k;b.isAsyncMode=function(a){return v(a)||d(a)===t};b.isConcurrentMode=v;b.isContextConsumer=
-function(a){return d(a)===l};b.isContextProvider=function(a){return d(a)===q};b.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===r};b.isForwardRef=function(a){return d(a)===m};b.isFragment=function(a){return d(a)===f};b.isLazy=function(a){return d(a)===n};b.isMemo=function(a){return d(a)===p};b.isPortal=function(a){return d(a)===u};b.isProfiler=function(a){return d(a)===g};b.isStrictMode=function(a){return d(a)===h};b.isSuspense=function(a){return d(a)===k};b.isValidElementType=
-function(a){return"string"===typeof a||"function"===typeof a||a===f||a===e||a===g||a===h||a===k||a===w||"object"===typeof a&&null!==a&&(a.$$typeof===n||a.$$typeof===p||a.$$typeof===q||a.$$typeof===l||a.$$typeof===m||a.$$typeof===y||a.$$typeof===z||a.$$typeof===A||a.$$typeof===x)};b.typeOf=d});
diff --git a/node_modules/prop-types/package.json b/node_modules/prop-types/package.json
deleted file mode 100644
index 2675a42..0000000
--- a/node_modules/prop-types/package.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
-  "name": "prop-types",
-  "version": "15.7.2",
-  "description": "Runtime type checking for React props and similar objects.",
-  "main": "index.js",
-  "license": "MIT",
-  "files": [
-    "LICENSE",
-    "README.md",
-    "checkPropTypes.js",
-    "factory.js",
-    "factoryWithThrowingShims.js",
-    "factoryWithTypeCheckers.js",
-    "index.js",
-    "prop-types.js",
-    "prop-types.min.js",
-    "lib"
-  ],
-  "repository": "facebook/prop-types",
-  "keywords": [
-    "react"
-  ],
-  "bugs": {
-    "url": "https://github.com/facebook/prop-types/issues"
-  },
-  "homepage": "https://facebook.github.io/react/",
-  "dependencies": {
-    "loose-envify": "^1.4.0",
-    "object-assign": "^4.1.1",
-    "react-is": "^16.8.1"
-  },
-  "scripts": {
-    "pretest": "npm run lint",
-    "lint": "eslint .",
-    "test": "npm run tests-only",
-    "tests-only": "jest",
-    "umd": "NODE_ENV=development browserify index.js -t loose-envify --standalone PropTypes -o prop-types.js",
-    "umd-min": "NODE_ENV=production browserify index.js -t loose-envify -t uglifyify --standalone PropTypes  -p bundle-collapser/plugin -o | uglifyjs --compress unused,dead_code -o prop-types.min.js",
-    "build": "yarn umd && yarn umd-min",
-    "prepublish": "yarn build"
-  },
-  "devDependencies": {
-    "babel-jest": "^19.0.0",
-    "babel-preset-react": "^6.24.1",
-    "browserify": "^16.2.3",
-    "bundle-collapser": "^1.2.1",
-    "eslint": "^5.13.0",
-    "jest": "^19.0.2",
-    "react": "^15.5.1",
-    "uglifyify": "^3.0.4",
-    "uglifyjs": "^2.4.10"
-  },
-  "browserify": {
-    "transform": [
-      "loose-envify"
-    ]
-  }
-}
diff --git a/node_modules/prop-types/prop-types.js b/node_modules/prop-types/prop-types.js
deleted file mode 100644
index 867d699..0000000
--- a/node_modules/prop-types/prop-types.js
+++ /dev/null
@@ -1,1337 +0,0 @@
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.PropTypes = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-var printWarning = function() {};
-
-if ("development" !== 'production') {
-  var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');
-  var loggedTypeFailures = {};
-  var has = Function.call.bind(Object.prototype.hasOwnProperty);
-
-  printWarning = function(text) {
-    var message = 'Warning: ' + text;
-    if (typeof console !== 'undefined') {
-      console.error(message);
-    }
-    try {
-      // --- Welcome to debugging React ---
-      // This error was thrown as a convenience so that you can use this stack
-      // to find the callsite that caused this warning to fire.
-      throw new Error(message);
-    } catch (x) {}
-  };
-}
-
-/**
- * Assert that the values match with the type specs.
- * Error messages are memorized and will only be shown once.
- *
- * @param {object} typeSpecs Map of name to a ReactPropType
- * @param {object} values Runtime values that need to be type-checked
- * @param {string} location e.g. "prop", "context", "child context"
- * @param {string} componentName Name of the component for error messages.
- * @param {?Function} getStack Returns the component stack.
- * @private
- */
-function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
-  if ("development" !== 'production') {
-    for (var typeSpecName in typeSpecs) {
-      if (has(typeSpecs, typeSpecName)) {
-        var error;
-        // Prop type validation may throw. In case they do, we don't want to
-        // fail the render phase where it didn't fail before. So we log it.
-        // After these have been cleaned up, we'll let them throw.
-        try {
-          // This is intentionally an invariant that gets caught. It's the same
-          // behavior as without this statement except with a better message.
-          if (typeof typeSpecs[typeSpecName] !== 'function') {
-            var err = Error(
-              (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
-              'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'
-            );
-            err.name = 'Invariant Violation';
-            throw err;
-          }
-          error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
-        } catch (ex) {
-          error = ex;
-        }
-        if (error && !(error instanceof Error)) {
-          printWarning(
-            (componentName || 'React class') + ': type specification of ' +
-            location + ' `' + typeSpecName + '` is invalid; the type checker ' +
-            'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
-            'You may have forgotten to pass an argument to the type checker ' +
-            'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
-            'shape all require an argument).'
-          );
-        }
-        if (error instanceof Error && !(error.message in loggedTypeFailures)) {
-          // Only monitor this failure once because there tends to be a lot of the
-          // same error.
-          loggedTypeFailures[error.message] = true;
-
-          var stack = getStack ? getStack() : '';
-
-          printWarning(
-            'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
-          );
-        }
-      }
-    }
-  }
-}
-
-/**
- * Resets warning cache when testing.
- *
- * @private
- */
-checkPropTypes.resetWarningCache = function() {
-  if ("development" !== 'production') {
-    loggedTypeFailures = {};
-  }
-}
-
-module.exports = checkPropTypes;
-
-},{"./lib/ReactPropTypesSecret":5}],2:[function(require,module,exports){
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');
-
-function emptyFunction() {}
-function emptyFunctionWithReset() {}
-emptyFunctionWithReset.resetWarningCache = emptyFunction;
-
-module.exports = function() {
-  function shim(props, propName, componentName, location, propFullName, secret) {
-    if (secret === ReactPropTypesSecret) {
-      // It is still safe when called from React.
-      return;
-    }
-    var err = new Error(
-      'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
-      'Use PropTypes.checkPropTypes() to call them. ' +
-      'Read more at http://fb.me/use-check-prop-types'
-    );
-    err.name = 'Invariant Violation';
-    throw err;
-  };
-  shim.isRequired = shim;
-  function getShim() {
-    return shim;
-  };
-  // Important!
-  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.
-  var ReactPropTypes = {
-    array: shim,
-    bool: shim,
-    func: shim,
-    number: shim,
-    object: shim,
-    string: shim,
-    symbol: shim,
-
-    any: shim,
-    arrayOf: getShim,
-    element: shim,
-    elementType: shim,
-    instanceOf: getShim,
-    node: shim,
-    objectOf: getShim,
-    oneOf: getShim,
-    oneOfType: getShim,
-    shape: getShim,
-    exact: getShim,
-
-    checkPropTypes: emptyFunctionWithReset,
-    resetWarningCache: emptyFunction
-  };
-
-  ReactPropTypes.PropTypes = ReactPropTypes;
-
-  return ReactPropTypes;
-};
-
-},{"./lib/ReactPropTypesSecret":5}],3:[function(require,module,exports){
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-var ReactIs = require('react-is');
-var assign = require('object-assign');
-
-var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');
-var checkPropTypes = require('./checkPropTypes');
-
-var has = Function.call.bind(Object.prototype.hasOwnProperty);
-var printWarning = function() {};
-
-if ("development" !== 'production') {
-  printWarning = function(text) {
-    var message = 'Warning: ' + text;
-    if (typeof console !== 'undefined') {
-      console.error(message);
-    }
-    try {
-      // --- Welcome to debugging React ---
-      // This error was thrown as a convenience so that you can use this stack
-      // to find the callsite that caused this warning to fire.
-      throw new Error(message);
-    } catch (x) {}
-  };
-}
-
-function emptyFunctionThatReturnsNull() {
-  return null;
-}
-
-module.exports = function(isValidElement, throwOnDirectAccess) {
-  /* global Symbol */
-  var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
-  var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.
-
-  /**
-   * Returns the iterator method function contained on the iterable object.
-   *
-   * Be sure to invoke the function with the iterable as context:
-   *
-   *     var iteratorFn = getIteratorFn(myIterable);
-   *     if (iteratorFn) {
-   *       var iterator = iteratorFn.call(myIterable);
-   *       ...
-   *     }
-   *
-   * @param {?object} maybeIterable
-   * @return {?function}
-   */
-  function getIteratorFn(maybeIterable) {
-    var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
-    if (typeof iteratorFn === 'function') {
-      return iteratorFn;
-    }
-  }
-
-  /**
-   * Collection of methods that allow declaration and validation of props that are
-   * supplied to React components. Example usage:
-   *
-   *   var Props = require('ReactPropTypes');
-   *   var MyArticle = React.createClass({
-   *     propTypes: {
-   *       // An optional string prop named "description".
-   *       description: Props.string,
-   *
-   *       // A required enum prop named "category".
-   *       category: Props.oneOf(['News','Photos']).isRequired,
-   *
-   *       // A prop named "dialog" that requires an instance of Dialog.
-   *       dialog: Props.instanceOf(Dialog).isRequired
-   *     },
-   *     render: function() { ... }
-   *   });
-   *
-   * A more formal specification of how these methods are used:
-   *
-   *   type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)
-   *   decl := ReactPropTypes.{type}(.isRequired)?
-   *
-   * Each and every declaration produces a function with the same signature. This
-   * allows the creation of custom validation functions. For example:
-   *
-   *  var MyLink = React.createClass({
-   *    propTypes: {
-   *      // An optional string or URI prop named "href".
-   *      href: function(props, propName, componentName) {
-   *        var propValue = props[propName];
-   *        if (propValue != null && typeof propValue !== 'string' &&
-   *            !(propValue instanceof URI)) {
-   *          return new Error(
-   *            'Expected a string or an URI for ' + propName + ' in ' +
-   *            componentName
-   *          );
-   *        }
-   *      }
-   *    },
-   *    render: function() {...}
-   *  });
-   *
-   * @internal
-   */
-
-  var ANONYMOUS = '<<anonymous>>';
-
-  // Important!
-  // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.
-  var ReactPropTypes = {
-    array: createPrimitiveTypeChecker('array'),
-    bool: createPrimitiveTypeChecker('boolean'),
-    func: createPrimitiveTypeChecker('function'),
-    number: createPrimitiveTypeChecker('number'),
-    object: createPrimitiveTypeChecker('object'),
-    string: createPrimitiveTypeChecker('string'),
-    symbol: createPrimitiveTypeChecker('symbol'),
-
-    any: createAnyTypeChecker(),
-    arrayOf: createArrayOfTypeChecker,
-    element: createElementTypeChecker(),
-    elementType: createElementTypeTypeChecker(),
-    instanceOf: createInstanceTypeChecker,
-    node: createNodeChecker(),
-    objectOf: createObjectOfTypeChecker,
-    oneOf: createEnumTypeChecker,
-    oneOfType: createUnionTypeChecker,
-    shape: createShapeTypeChecker,
-    exact: createStrictShapeTypeChecker,
-  };
-
-  /**
-   * inlined Object.is polyfill to avoid requiring consumers ship their own
-   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
-   */
-  /*eslint-disable no-self-compare*/
-  function is(x, y) {
-    // SameValue algorithm
-    if (x === y) {
-      // Steps 1-5, 7-10
-      // Steps 6.b-6.e: +0 != -0
-      return x !== 0 || 1 / x === 1 / y;
-    } else {
-      // Step 6.a: NaN == NaN
-      return x !== x && y !== y;
-    }
-  }
-  /*eslint-enable no-self-compare*/
-
-  /**
-   * We use an Error-like object for backward compatibility as people may call
-   * PropTypes directly and inspect their output. However, we don't use real
-   * Errors anymore. We don't inspect their stack anyway, and creating them
-   * is prohibitively expensive if they are created too often, such as what
-   * happens in oneOfType() for any type before the one that matched.
-   */
-  function PropTypeError(message) {
-    this.message = message;
-    this.stack = '';
-  }
-  // Make `instanceof Error` still work for returned errors.
-  PropTypeError.prototype = Error.prototype;
-
-  function createChainableTypeChecker(validate) {
-    if ("development" !== 'production') {
-      var manualPropTypeCallCache = {};
-      var manualPropTypeWarningCount = 0;
-    }
-    function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {
-      componentName = componentName || ANONYMOUS;
-      propFullName = propFullName || propName;
-
-      if (secret !== ReactPropTypesSecret) {
-        if (throwOnDirectAccess) {
-          // New behavior only for users of `prop-types` package
-          var err = new Error(
-            'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
-            'Use `PropTypes.checkPropTypes()` to call them. ' +
-            'Read more at http://fb.me/use-check-prop-types'
-          );
-          err.name = 'Invariant Violation';
-          throw err;
-        } else if ("development" !== 'production' && typeof console !== 'undefined') {
-          // Old behavior for people using React.PropTypes
-          var cacheKey = componentName + ':' + propName;
-          if (
-            !manualPropTypeCallCache[cacheKey] &&
-            // Avoid spamming the console because they are often not actionable except for lib authors
-            manualPropTypeWarningCount < 3
-          ) {
-            printWarning(
-              'You are manually calling a React.PropTypes validation ' +
-              'function for the `' + propFullName + '` prop on `' + componentName  + '`. This is deprecated ' +
-              'and will throw in the standalone `prop-types` package. ' +
-              'You may be seeing this warning due to a third-party PropTypes ' +
-              'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'
-            );
-            manualPropTypeCallCache[cacheKey] = true;
-            manualPropTypeWarningCount++;
-          }
-        }
-      }
-      if (props[propName] == null) {
-        if (isRequired) {
-          if (props[propName] === null) {
-            return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));
-          }
-          return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));
-        }
-        return null;
-      } else {
-        return validate(props, propName, componentName, location, propFullName);
-      }
-    }
-
-    var chainedCheckType = checkType.bind(null, false);
-    chainedCheckType.isRequired = checkType.bind(null, true);
-
-    return chainedCheckType;
-  }
-
-  function createPrimitiveTypeChecker(expectedType) {
-    function validate(props, propName, componentName, location, propFullName, secret) {
-      var propValue = props[propName];
-      var propType = getPropType(propValue);
-      if (propType !== expectedType) {
-        // `propValue` being instance of, say, date/regexp, pass the 'object'
-        // check, but we can offer a more precise error message here rather than
-        // 'of type `object`'.
-        var preciseType = getPreciseType(propValue);
-
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createAnyTypeChecker() {
-    return createChainableTypeChecker(emptyFunctionThatReturnsNull);
-  }
-
-  function createArrayOfTypeChecker(typeChecker) {
-    function validate(props, propName, componentName, location, propFullName) {
-      if (typeof typeChecker !== 'function') {
-        return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');
-      }
-      var propValue = props[propName];
-      if (!Array.isArray(propValue)) {
-        var propType = getPropType(propValue);
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
-      }
-      for (var i = 0; i < propValue.length; i++) {
-        var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);
-        if (error instanceof Error) {
-          return error;
-        }
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createElementTypeChecker() {
-    function validate(props, propName, componentName, location, propFullName) {
-      var propValue = props[propName];
-      if (!isValidElement(propValue)) {
-        var propType = getPropType(propValue);
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createElementTypeTypeChecker() {
-    function validate(props, propName, componentName, location, propFullName) {
-      var propValue = props[propName];
-      if (!ReactIs.isValidElementType(propValue)) {
-        var propType = getPropType(propValue);
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createInstanceTypeChecker(expectedClass) {
-    function validate(props, propName, componentName, location, propFullName) {
-      if (!(props[propName] instanceof expectedClass)) {
-        var expectedClassName = expectedClass.name || ANONYMOUS;
-        var actualClassName = getClassName(props[propName]);
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createEnumTypeChecker(expectedValues) {
-    if (!Array.isArray(expectedValues)) {
-      if ("development" !== 'production') {
-        if (arguments.length > 1) {
-          printWarning(
-            'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +
-            'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'
-          );
-        } else {
-          printWarning('Invalid argument supplied to oneOf, expected an array.');
-        }
-      }
-      return emptyFunctionThatReturnsNull;
-    }
-
-    function validate(props, propName, componentName, location, propFullName) {
-      var propValue = props[propName];
-      for (var i = 0; i < expectedValues.length; i++) {
-        if (is(propValue, expectedValues[i])) {
-          return null;
-        }
-      }
-
-      var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {
-        var type = getPreciseType(value);
-        if (type === 'symbol') {
-          return String(value);
-        }
-        return value;
-      });
-      return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createObjectOfTypeChecker(typeChecker) {
-    function validate(props, propName, componentName, location, propFullName) {
-      if (typeof typeChecker !== 'function') {
-        return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');
-      }
-      var propValue = props[propName];
-      var propType = getPropType(propValue);
-      if (propType !== 'object') {
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));
-      }
-      for (var key in propValue) {
-        if (has(propValue, key)) {
-          var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
-          if (error instanceof Error) {
-            return error;
-          }
-        }
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createUnionTypeChecker(arrayOfTypeCheckers) {
-    if (!Array.isArray(arrayOfTypeCheckers)) {
-      "development" !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;
-      return emptyFunctionThatReturnsNull;
-    }
-
-    for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
-      var checker = arrayOfTypeCheckers[i];
-      if (typeof checker !== 'function') {
-        printWarning(
-          'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +
-          'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'
-        );
-        return emptyFunctionThatReturnsNull;
-      }
-    }
-
-    function validate(props, propName, componentName, location, propFullName) {
-      for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
-        var checker = arrayOfTypeCheckers[i];
-        if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) {
-          return null;
-        }
-      }
-
-      return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createNodeChecker() {
-    function validate(props, propName, componentName, location, propFullName) {
-      if (!isNode(props[propName])) {
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createShapeTypeChecker(shapeTypes) {
-    function validate(props, propName, componentName, location, propFullName) {
-      var propValue = props[propName];
-      var propType = getPropType(propValue);
-      if (propType !== 'object') {
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
-      }
-      for (var key in shapeTypes) {
-        var checker = shapeTypes[key];
-        if (!checker) {
-          continue;
-        }
-        var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
-        if (error) {
-          return error;
-        }
-      }
-      return null;
-    }
-    return createChainableTypeChecker(validate);
-  }
-
-  function createStrictShapeTypeChecker(shapeTypes) {
-    function validate(props, propName, componentName, location, propFullName) {
-      var propValue = props[propName];
-      var propType = getPropType(propValue);
-      if (propType !== 'object') {
-        return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
-      }
-      // We need to check all keys in case some are required but missing from
-      // props.
-      var allKeys = assign({}, props[propName], shapeTypes);
-      for (var key in allKeys) {
-        var checker = shapeTypes[key];
-        if (!checker) {
-          return new PropTypeError(
-            'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +
-            '\nBad object: ' + JSON.stringify(props[propName], null, '  ') +
-            '\nValid keys: ' +  JSON.stringify(Object.keys(shapeTypes), null, '  ')
-          );
-        }
-        var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
-        if (error) {
-          return error;
-        }
-      }
-      return null;
-    }
-
-    return createChainableTypeChecker(validate);
-  }
-
-  function isNode(propValue) {
-    switch (typeof propValue) {
-      case 'number':
-      case 'string':
-      case 'undefined':
-        return true;
-      case 'boolean':
-        return !propValue;
-      case 'object':
-        if (Array.isArray(propValue)) {
-          return propValue.every(isNode);
-        }
-        if (propValue === null || isValidElement(propValue)) {
-          return true;
-        }
-
-        var iteratorFn = getIteratorFn(propValue);
-        if (iteratorFn) {
-          var iterator = iteratorFn.call(propValue);
-          var step;
-          if (iteratorFn !== propValue.entries) {
-            while (!(step = iterator.next()).done) {
-              if (!isNode(step.value)) {
-                return false;
-              }
-            }
-          } else {
-            // Iterator will provide entry [k,v] tuples rather than values.
-            while (!(step = iterator.next()).done) {
-              var entry = step.value;
-              if (entry) {
-                if (!isNode(entry[1])) {
-                  return false;
-                }
-              }
-            }
-          }
-        } else {
-          return false;
-        }
-
-        return true;
-      default:
-        return false;
-    }
-  }
-
-  function isSymbol(propType, propValue) {
-    // Native Symbol.
-    if (propType === 'symbol') {
-      return true;
-    }
-
-    // falsy value can't be a Symbol
-    if (!propValue) {
-      return false;
-    }
-
-    // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'
-    if (propValue['@@toStringTag'] === 'Symbol') {
-      return true;
-    }
-
-    // Fallback for non-spec compliant Symbols which are polyfilled.
-    if (typeof Symbol === 'function' && propValue instanceof Symbol) {
-      return true;
-    }
-
-    return false;
-  }
-
-  // Equivalent of `typeof` but with special handling for array and regexp.
-  function getPropType(propValue) {
-    var propType = typeof propValue;
-    if (Array.isArray(propValue)) {
-      return 'array';
-    }
-    if (propValue instanceof RegExp) {
-      // Old webkits (at least until Android 4.0) return 'function' rather than
-      // 'object' for typeof a RegExp. We'll normalize this here so that /bla/
-      // passes PropTypes.object.
-      return 'object';
-    }
-    if (isSymbol(propType, propValue)) {
-      return 'symbol';
-    }
-    return propType;
-  }
-
-  // This handles more types than `getPropType`. Only used for error messages.
-  // See `createPrimitiveTypeChecker`.
-  function getPreciseType(propValue) {
-    if (typeof propValue === 'undefined' || propValue === null) {
-      return '' + propValue;
-    }
-    var propType = getPropType(propValue);
-    if (propType === 'object') {
-      if (propValue instanceof Date) {
-        return 'date';
-      } else if (propValue instanceof RegExp) {
-        return 'regexp';
-      }
-    }
-    return propType;
-  }
-
-  // Returns a string that is postfixed to a warning about an invalid type.
-  // For example, "undefined" or "of type array"
-  function getPostfixForTypeWarning(value) {
-    var type = getPreciseType(value);
-    switch (type) {
-      case 'array':
-      case 'object':
-        return 'an ' + type;
-      case 'boolean':
-      case 'date':
-      case 'regexp':
-        return 'a ' + type;
-      default:
-        return type;
-    }
-  }
-
-  // Returns class name of the object, if any.
-  function getClassName(propValue) {
-    if (!propValue.constructor || !propValue.constructor.name) {
-      return ANONYMOUS;
-    }
-    return propValue.constructor.name;
-  }
-
-  ReactPropTypes.checkPropTypes = checkPropTypes;
-  ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;
-  ReactPropTypes.PropTypes = ReactPropTypes;
-
-  return ReactPropTypes;
-};
-
-},{"./checkPropTypes":1,"./lib/ReactPropTypesSecret":5,"object-assign":6,"react-is":10}],4:[function(require,module,exports){
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-if ("development" !== 'production') {
-  var ReactIs = require('react-is');
-
-  // By explicitly using `prop-types` you are opting into new development behavior.
-  // http://fb.me/prop-types-in-prod
-  var throwOnDirectAccess = true;
-  module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);
-} else {
-  // By explicitly using `prop-types` you are opting into new production behavior.
-  // http://fb.me/prop-types-in-prod
-  module.exports = require('./factoryWithThrowingShims')();
-}
-
-},{"./factoryWithThrowingShims":2,"./factoryWithTypeCheckers":3,"react-is":10}],5:[function(require,module,exports){
-/**
- * Copyright (c) 2013-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
-
-module.exports = ReactPropTypesSecret;
-
-},{}],6:[function(require,module,exports){
-/*
-object-assign
-(c) Sindre Sorhus
-@license MIT
-*/
-
-'use strict';
-/* eslint-disable no-unused-vars */
-var getOwnPropertySymbols = Object.getOwnPropertySymbols;
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-var propIsEnumerable = Object.prototype.propertyIsEnumerable;
-
-function toObject(val) {
-	if (val === null || val === undefined) {
-		throw new TypeError('Object.assign cannot be called with null or undefined');
-	}
-
-	return Object(val);
-}
-
-function shouldUseNative() {
-	try {
-		if (!Object.assign) {
-			return false;
-		}
-
-		// Detect buggy property enumeration order in older V8 versions.
-
-		// https://bugs.chromium.org/p/v8/issues/detail?id=4118
-		var test1 = new String('abc');  // eslint-disable-line no-new-wrappers
-		test1[5] = 'de';
-		if (Object.getOwnPropertyNames(test1)[0] === '5') {
-			return false;
-		}
-
-		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
-		var test2 = {};
-		for (var i = 0; i < 10; i++) {
-			test2['_' + String.fromCharCode(i)] = i;
-		}
-		var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
-			return test2[n];
-		});
-		if (order2.join('') !== '0123456789') {
-			return false;
-		}
-
-		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
-		var test3 = {};
-		'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
-			test3[letter] = letter;
-		});
-		if (Object.keys(Object.assign({}, test3)).join('') !==
-				'abcdefghijklmnopqrst') {
-			return false;
-		}
-
-		return true;
-	} catch (err) {
-		// We don't expect any of the above to throw, but better to be safe.
-		return false;
-	}
-}
-
-module.exports = shouldUseNative() ? Object.assign : function (target, source) {
-	var from;
-	var to = toObject(target);
-	var symbols;
-
-	for (var s = 1; s < arguments.length; s++) {
-		from = Object(arguments[s]);
-
-		for (var key in from) {
-			if (hasOwnProperty.call(from, key)) {
-				to[key] = from[key];
-			}
-		}
-
-		if (getOwnPropertySymbols) {
-			symbols = getOwnPropertySymbols(from);
-			for (var i = 0; i < symbols.length; i++) {
-				if (propIsEnumerable.call(from, symbols[i])) {
-					to[symbols[i]] = from[symbols[i]];
-				}
-			}
-		}
-	}
-
-	return to;
-};
-
-},{}],7:[function(require,module,exports){
-// shim for using process in browser
-var process = module.exports = {};
-
-// cached from whatever global is present so that test runners that stub it
-// don't break things.  But we need to wrap it in a try catch in case it is
-// wrapped in strict mode code which doesn't define any globals.  It's inside a
-// function because try/catches deoptimize in certain engines.
-
-var cachedSetTimeout;
-var cachedClearTimeout;
-
-function defaultSetTimout() {
-    throw new Error('setTimeout has not been defined');
-}
-function defaultClearTimeout () {
-    throw new Error('clearTimeout has not been defined');
-}
-(function () {
-    try {
-        if (typeof setTimeout === 'function') {
-            cachedSetTimeout = setTimeout;
-        } else {
-            cachedSetTimeout = defaultSetTimout;
-        }
-    } catch (e) {
-        cachedSetTimeout = defaultSetTimout;
-    }
-    try {
-        if (typeof clearTimeout === 'function') {
-            cachedClearTimeout = clearTimeout;
-        } else {
-            cachedClearTimeout = defaultClearTimeout;
-        }
-    } catch (e) {
-        cachedClearTimeout = defaultClearTimeout;
-    }
-} ())
-function runTimeout(fun) {
-    if (cachedSetTimeout === setTimeout) {
-        //normal enviroments in sane situations
-        return setTimeout(fun, 0);
-    }
-    // if setTimeout wasn't available but was latter defined
-    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
-        cachedSetTimeout = setTimeout;
-        return setTimeout(fun, 0);
-    }
-    try {
-        // when when somebody has screwed with setTimeout but no I.E. maddness
-        return cachedSetTimeout(fun, 0);
-    } catch(e){
-        try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
-            return cachedSetTimeout.call(null, fun, 0);
-        } catch(e){
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
-            return cachedSetTimeout.call(this, fun, 0);
-        }
-    }
-
-
-}
-function runClearTimeout(marker) {
-    if (cachedClearTimeout === clearTimeout) {
-        //normal enviroments in sane situations
-        return clearTimeout(marker);
-    }
-    // if clearTimeout wasn't available but was latter defined
-    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
-        cachedClearTimeout = clearTimeout;
-        return clearTimeout(marker);
-    }
-    try {
-        // when when somebody has screwed with setTimeout but no I.E. maddness
-        return cachedClearTimeout(marker);
-    } catch (e){
-        try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
-            return cachedClearTimeout.call(null, marker);
-        } catch (e){
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
-            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
-            return cachedClearTimeout.call(this, marker);
-        }
-    }
-
-
-
-}
-var queue = [];
-var draining = false;
-var currentQueue;
-var queueIndex = -1;
-
-function cleanUpNextTick() {
-    if (!draining || !currentQueue) {
-        return;
-    }
-    draining = false;
-    if (currentQueue.length) {
-        queue = currentQueue.concat(queue);
-    } else {
-        queueIndex = -1;
-    }
-    if (queue.length) {
-        drainQueue();
-    }
-}
-
-function drainQueue() {
-    if (draining) {
-        return;
-    }
-    var timeout = runTimeout(cleanUpNextTick);
-    draining = true;
-
-    var len = queue.length;
-    while(len) {
-        currentQueue = queue;
-        queue = [];
-        while (++queueIndex < len) {
-            if (currentQueue) {
-                currentQueue[queueIndex].run();
-            }
-        }
-        queueIndex = -1;
-        len = queue.length;
-    }
-    currentQueue = null;
-    draining = false;
-    runClearTimeout(timeout);
-}
-
-process.nextTick = function (fun) {
-    var args = new Array(arguments.length - 1);
-    if (arguments.length > 1) {
-        for (var i = 1; i < arguments.length; i++) {
-            args[i - 1] = arguments[i];
-        }
-    }
-    queue.push(new Item(fun, args));
-    if (queue.length === 1 && !draining) {
-        runTimeout(drainQueue);
-    }
-};
-
-// v8 likes predictible objects
-function Item(fun, array) {
-    this.fun = fun;
-    this.array = array;
-}
-Item.prototype.run = function () {
-    this.fun.apply(null, this.array);
-};
-process.title = 'browser';
-process.browser = true;
-process.env = {};
-process.argv = [];
-process.version = ''; // empty string to avoid regexp issues
-process.versions = {};
-
-function noop() {}
-
-process.on = noop;
-process.addListener = noop;
-process.once = noop;
-process.off = noop;
-process.removeListener = noop;
-process.removeAllListeners = noop;
-process.emit = noop;
-process.prependListener = noop;
-process.prependOnceListener = noop;
-
-process.listeners = function (name) { return [] }
-
-process.binding = function (name) {
-    throw new Error('process.binding is not supported');
-};
-
-process.cwd = function () { return '/' };
-process.chdir = function (dir) {
-    throw new Error('process.chdir is not supported');
-};
-process.umask = function() { return 0; };
-
-},{}],8:[function(require,module,exports){
-(function (process){
-/** @license React v16.8.1
- * react-is.development.js
- *
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';
-
-
-
-if (process.env.NODE_ENV !== "production") {
-  (function() {
-'use strict';
-
-Object.defineProperty(exports, '__esModule', { value: true });
-
-// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
-// nor polyfill, then a plain number is used for performance.
-var hasSymbol = typeof Symbol === 'function' && Symbol.for;
-
-var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;
-var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;
-var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;
-var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;
-var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;
-var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;
-var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace;
-var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;
-var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;
-var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;
-var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;
-var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;
-var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;
-
-function isValidElementType(type) {
-  return typeof type === 'string' || typeof type === 'function' ||
-  // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.
-  type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE);
-}
-
-/**
- * Forked from fbjs/warning:
- * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
- *
- * Only change is we use console.warn instead of console.error,
- * and do nothing when 'console' is not supported.
- * This really simplifies the code.
- * ---
- * Similar to invariant but only logs a warning if the condition is not met.
- * This can be used to log issues in development environments in critical
- * paths. Removing the logging code for production environments will keep the
- * same logic and follow the same code paths.
- */
-
-var lowPriorityWarning = function () {};
-
-{
-  var printWarning = function (format) {
-    for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
-      args[_key - 1] = arguments[_key];
-    }
-
-    var argIndex = 0;
-    var message = 'Warning: ' + format.replace(/%s/g, function () {
-      return args[argIndex++];
-    });
-    if (typeof console !== 'undefined') {
-      console.warn(message);
-    }
-    try {
-      // --- Welcome to debugging React ---
-      // This error was thrown as a convenience so that you can use this stack
-      // to find the callsite that caused this warning to fire.
-      throw new Error(message);
-    } catch (x) {}
-  };
-
-  lowPriorityWarning = function (condition, format) {
-    if (format === undefined) {
-      throw new Error('`lowPriorityWarning(condition, format, ...args)` requires a warning ' + 'message argument');
-    }
-    if (!condition) {
-      for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
-        args[_key2 - 2] = arguments[_key2];
-      }
-
-      printWarning.apply(undefined, [format].concat(args));
-    }
-  };
-}
-
-var lowPriorityWarning$1 = lowPriorityWarning;
-
-function typeOf(object) {
-  if (typeof object === 'object' && object !== null) {
-    var $$typeof = object.$$typeof;
-    switch ($$typeof) {
-      case REACT_ELEMENT_TYPE:
-        var type = object.type;
-
-        switch (type) {
-          case REACT_ASYNC_MODE_TYPE:
-          case REACT_CONCURRENT_MODE_TYPE:
-          case REACT_FRAGMENT_TYPE:
-          case REACT_PROFILER_TYPE:
-          case REACT_STRICT_MODE_TYPE:
-          case REACT_SUSPENSE_TYPE:
-            return type;
-          default:
-            var $$typeofType = type && type.$$typeof;
-
-            switch ($$typeofType) {
-              case REACT_CONTEXT_TYPE:
-              case REACT_FORWARD_REF_TYPE:
-              case REACT_PROVIDER_TYPE:
-                return $$typeofType;
-              default:
-                return $$typeof;
-            }
-        }
-      case REACT_LAZY_TYPE:
-      case REACT_MEMO_TYPE:
-      case REACT_PORTAL_TYPE:
-        return $$typeof;
-    }
-  }
-
-  return undefined;
-}
-
-// AsyncMode is deprecated along with isAsyncMode
-var AsyncMode = REACT_ASYNC_MODE_TYPE;
-var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;
-var ContextConsumer = REACT_CONTEXT_TYPE;
-var ContextProvider = REACT_PROVIDER_TYPE;
-var Element = REACT_ELEMENT_TYPE;
-var ForwardRef = REACT_FORWARD_REF_TYPE;
-var Fragment = REACT_FRAGMENT_TYPE;
-var Lazy = REACT_LAZY_TYPE;
-var Memo = REACT_MEMO_TYPE;
-var Portal = REACT_PORTAL_TYPE;
-var Profiler = REACT_PROFILER_TYPE;
-var StrictMode = REACT_STRICT_MODE_TYPE;
-var Suspense = REACT_SUSPENSE_TYPE;
-
-var hasWarnedAboutDeprecatedIsAsyncMode = false;
-
-// AsyncMode should be deprecated
-function isAsyncMode(object) {
-  {
-    if (!hasWarnedAboutDeprecatedIsAsyncMode) {
-      hasWarnedAboutDeprecatedIsAsyncMode = true;
-      lowPriorityWarning$1(false, 'The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');
-    }
-  }
-  return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;
-}
-function isConcurrentMode(object) {
-  return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;
-}
-function isContextConsumer(object) {
-  return typeOf(object) === REACT_CONTEXT_TYPE;
-}
-function isContextProvider(object) {
-  return typeOf(object) === REACT_PROVIDER_TYPE;
-}
-function isElement(object) {
-  return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
-}
-function isForwardRef(object) {
-  return typeOf(object) === REACT_FORWARD_REF_TYPE;
-}
-function isFragment(object) {
-  return typeOf(object) === REACT_FRAGMENT_TYPE;
-}
-function isLazy(object) {
-  return typeOf(object) === REACT_LAZY_TYPE;
-}
-function isMemo(object) {
-  return typeOf(object) === REACT_MEMO_TYPE;
-}
-function isPortal(object) {
-  return typeOf(object) === REACT_PORTAL_TYPE;
-}
-function isProfiler(object) {
-  return typeOf(object) === REACT_PROFILER_TYPE;
-}
-function isStrictMode(object) {
-  return typeOf(object) === REACT_STRICT_MODE_TYPE;
-}
-function isSuspense(object) {
-  return typeOf(object) === REACT_SUSPENSE_TYPE;
-}
-
-exports.typeOf = typeOf;
-exports.AsyncMode = AsyncMode;
-exports.ConcurrentMode = ConcurrentMode;
-exports.ContextConsumer = ContextConsumer;
-exports.ContextProvider = ContextProvider;
-exports.Element = Element;
-exports.ForwardRef = ForwardRef;
-exports.Fragment = Fragment;
-exports.Lazy = Lazy;
-exports.Memo = Memo;
-exports.Portal = Portal;
-exports.Profiler = Profiler;
-exports.StrictMode = StrictMode;
-exports.Suspense = Suspense;
-exports.isValidElementType = isValidElementType;
-exports.isAsyncMode = isAsyncMode;
-exports.isConcurrentMode = isConcurrentMode;
-exports.isContextConsumer = isContextConsumer;
-exports.isContextProvider = isContextProvider;
-exports.isElement = isElement;
-exports.isForwardRef = isForwardRef;
-exports.isFragment = isFragment;
-exports.isLazy = isLazy;
-exports.isMemo = isMemo;
-exports.isPortal = isPortal;
-exports.isProfiler = isProfiler;
-exports.isStrictMode = isStrictMode;
-exports.isSuspense = isSuspense;
-  })();
-}
-
-}).call(this,require('_process'))
-},{"_process":7}],9:[function(require,module,exports){
-/** @license React v16.8.1
- * react-is.production.min.js
- *
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-'use strict';Object.defineProperty(exports,"__esModule",{value:!0});
-var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b?Symbol.for("react.memo"):
-60115,r=b?Symbol.for("react.lazy"):60116;function t(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case h:return a;default:return u}}case r:case q:case d:return u}}}function v(a){return t(a)===m}exports.typeOf=t;exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;
-exports.Fragment=e;exports.Lazy=r;exports.Memo=q;exports.Portal=d;exports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||"object"===typeof a&&null!==a&&(a.$$typeof===r||a.$$typeof===q||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n)};exports.isAsyncMode=function(a){return v(a)||t(a)===l};exports.isConcurrentMode=v;exports.isContextConsumer=function(a){return t(a)===k};
-exports.isContextProvider=function(a){return t(a)===h};exports.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return t(a)===n};exports.isFragment=function(a){return t(a)===e};exports.isLazy=function(a){return t(a)===r};exports.isMemo=function(a){return t(a)===q};exports.isPortal=function(a){return t(a)===d};exports.isProfiler=function(a){return t(a)===g};exports.isStrictMode=function(a){return t(a)===f};
-exports.isSuspense=function(a){return t(a)===p};
-
-},{}],10:[function(require,module,exports){
-(function (process){
-'use strict';
-
-if (process.env.NODE_ENV === 'production') {
-  module.exports = require('./cjs/react-is.production.min.js');
-} else {
-  module.exports = require('./cjs/react-is.development.js');
-}
-
-}).call(this,require('_process'))
-},{"./cjs/react-is.development.js":8,"./cjs/react-is.production.min.js":9,"_process":7}]},{},[4])(4)
-});
\ No newline at end of file
diff --git a/node_modules/prop-types/prop-types.min.js b/node_modules/prop-types/prop-types.min.js
deleted file mode 100644
index c902433..0000000
--- a/node_modules/prop-types/prop-types.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(f){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define([],f);else{var g;g="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,g.PropTypes=f()}}(function(){return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n||e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){"use strict";function emptyFunction(){}function emptyFunctionWithReset(){}var ReactPropTypesSecret=require(3);emptyFunctionWithReset.resetWarningCache=emptyFunction,module.exports=function(){function e(e,t,n,r,o,p){if(p!==ReactPropTypesSecret){var c=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw c.name="Invariant Violation",c}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:emptyFunctionWithReset,resetWarningCache:emptyFunction};return n.PropTypes=n,n}},{3:3}],2:[function(require,module,exports){module.exports=require(1)()},{1:1}],3:[function(require,module,exports){"use strict";module.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},{}]},{},[2])(2)});
\ No newline at end of file
diff --git a/node_modules/regenerator-runtime/LICENSE b/node_modules/regenerator-runtime/LICENSE
deleted file mode 100644
index cde61b6..0000000
--- a/node_modules/regenerator-runtime/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2014-present, Facebook, Inc.
-
-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/node_modules/regenerator-runtime/README.md b/node_modules/regenerator-runtime/README.md
deleted file mode 100644
index d93386a..0000000
--- a/node_modules/regenerator-runtime/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# regenerator-runtime
-
-Standalone runtime for
-[Regenerator](https://github.com/facebook/regenerator)-compiled generator
-and `async` functions.
-
-To import the runtime as a module (recommended), either of the following
-import styles will work:
-```js
-// CommonJS
-const regeneratorRuntime = require("regenerator-runtime");
-
-// ECMAScript 2015
-import regeneratorRuntime from "regenerator-runtime";
-```
-
-To ensure that `regeneratorRuntime` is defined globally, either of the
-following styles will work:
-```js
-// CommonJS
-require("regenerator-runtime/runtime");
-
-// ECMAScript 2015
-import "regenerator-runtime/runtime";
-```
-
-To get the absolute file system path of `runtime.js`, evaluate the
-following expression:
-```js
-require("regenerator-runtime/path").path
-```
diff --git a/node_modules/regenerator-runtime/package.json b/node_modules/regenerator-runtime/package.json
deleted file mode 100644
index ebfd49a..0000000
--- a/node_modules/regenerator-runtime/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "regenerator-runtime",
-  "author": "Ben Newman <bn@cs.stanford.edu>",
-  "description": "Runtime for Regenerator-compiled generator and async functions.",
-  "version": "0.13.4",
-  "main": "runtime.js",
-  "keywords": [
-    "regenerator",
-    "runtime",
-    "generator",
-    "async"
-  ],
-  "sideEffects": true,
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/facebook/regenerator/tree/master/packages/regenerator-runtime"
-  },
-  "license": "MIT"
-}
diff --git a/node_modules/regenerator-runtime/path.js b/node_modules/regenerator-runtime/path.js
deleted file mode 100644
index ced878b..0000000
--- a/node_modules/regenerator-runtime/path.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * Copyright (c) 2014-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-exports.path = require("path").join(
-  __dirname,
-  "runtime.js"
-);
diff --git a/node_modules/regenerator-runtime/runtime.js b/node_modules/regenerator-runtime/runtime.js
deleted file mode 100644
index 224bf70..0000000
--- a/node_modules/regenerator-runtime/runtime.js
+++ /dev/null
@@ -1,729 +0,0 @@
-/**
- * Copyright (c) 2014-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-var runtime = (function (exports) {
-  "use strict";
-
-  var Op = Object.prototype;
-  var hasOwn = Op.hasOwnProperty;
-  var undefined; // More compressible than void 0.
-  var $Symbol = typeof Symbol === "function" ? Symbol : {};
-  var iteratorSymbol = $Symbol.iterator || "@@iterator";
-  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
-  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
-
-  function wrap(innerFn, outerFn, self, tryLocsList) {
-    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
-    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
-    var generator = Object.create(protoGenerator.prototype);
-    var context = new Context(tryLocsList || []);
-
-    // The ._invoke method unifies the implementations of the .next,
-    // .throw, and .return methods.
-    generator._invoke = makeInvokeMethod(innerFn, self, context);
-
-    return generator;
-  }
-  exports.wrap = wrap;
-
-  // Try/catch helper to minimize deoptimizations. Returns a completion
-  // record like context.tryEntries[i].completion. This interface could
-  // have been (and was previously) designed to take a closure to be
-  // invoked without arguments, but in all the cases we care about we
-  // already have an existing method we want to call, so there's no need
-  // to create a new function object. We can even get away with assuming
-  // the method takes exactly one argument, since that happens to be true
-  // in every case, so we don't have to touch the arguments object. The
-  // only additional allocation required is the completion record, which
-  // has a stable shape and so hopefully should be cheap to allocate.
-  function tryCatch(fn, obj, arg) {
-    try {
-      return { type: "normal", arg: fn.call(obj, arg) };
-    } catch (err) {
-      return { type: "throw", arg: err };
-    }
-  }
-
-  var GenStateSuspendedStart = "suspendedStart";
-  var GenStateSuspendedYield = "suspendedYield";
-  var GenStateExecuting = "executing";
-  var GenStateCompleted = "completed";
-
-  // Returning this object from the innerFn has the same effect as
-  // breaking out of the dispatch switch statement.
-  var ContinueSentinel = {};
-
-  // Dummy constructor functions that we use as the .constructor and
-  // .constructor.prototype properties for functions that return Generator
-  // objects. For full spec compliance, you may wish to configure your
-  // minifier not to mangle the names of these two functions.
-  function Generator() {}
-  function GeneratorFunction() {}
-  function GeneratorFunctionPrototype() {}
-
-  // This is a polyfill for %IteratorPrototype% for environments that
-  // don't natively support it.
-  var IteratorPrototype = {};
-  IteratorPrototype[iteratorSymbol] = function () {
-    return this;
-  };
-
-  var getProto = Object.getPrototypeOf;
-  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
-  if (NativeIteratorPrototype &&
-      NativeIteratorPrototype !== Op &&
-      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
-    // This environment has a native %IteratorPrototype%; use it instead
-    // of the polyfill.
-    IteratorPrototype = NativeIteratorPrototype;
-  }
-
-  var Gp = GeneratorFunctionPrototype.prototype =
-    Generator.prototype = Object.create(IteratorPrototype);
-  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
-  GeneratorFunctionPrototype.constructor = GeneratorFunction;
-  GeneratorFunctionPrototype[toStringTagSymbol] =
-    GeneratorFunction.displayName = "GeneratorFunction";
-
-  // Helper for defining the .next, .throw, and .return methods of the
-  // Iterator interface in terms of a single ._invoke method.
-  function defineIteratorMethods(prototype) {
-    ["next", "throw", "return"].forEach(function(method) {
-      prototype[method] = function(arg) {
-        return this._invoke(method, arg);
-      };
-    });
-  }
-
-  exports.isGeneratorFunction = function(genFun) {
-    var ctor = typeof genFun === "function" && genFun.constructor;
-    return ctor
-      ? ctor === GeneratorFunction ||
-        // For the native GeneratorFunction constructor, the best we can
-        // do is to check its .name property.
-        (ctor.displayName || ctor.name) === "GeneratorFunction"
-      : false;
-  };
-
-  exports.mark = function(genFun) {
-    if (Object.setPrototypeOf) {
-      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
-    } else {
-      genFun.__proto__ = GeneratorFunctionPrototype;
-      if (!(toStringTagSymbol in genFun)) {
-        genFun[toStringTagSymbol] = "GeneratorFunction";
-      }
-    }
-    genFun.prototype = Object.create(Gp);
-    return genFun;
-  };
-
-  // Within the body of any async function, `await x` is transformed to
-  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
-  // `hasOwn.call(value, "__await")` to determine if the yielded value is
-  // meant to be awaited.
-  exports.awrap = function(arg) {
-    return { __await: arg };
-  };
-
-  function AsyncIterator(generator, PromiseImpl) {
-    function invoke(method, arg, resolve, reject) {
-      var record = tryCatch(generator[method], generator, arg);
-      if (record.type === "throw") {
-        reject(record.arg);
-      } else {
-        var result = record.arg;
-        var value = result.value;
-        if (value &&
-            typeof value === "object" &&
-            hasOwn.call(value, "__await")) {
-          return PromiseImpl.resolve(value.__await).then(function(value) {
-            invoke("next", value, resolve, reject);
-          }, function(err) {
-            invoke("throw", err, resolve, reject);
-          });
-        }
-
-        return PromiseImpl.resolve(value).then(function(unwrapped) {
-          // When a yielded Promise is resolved, its final value becomes
-          // the .value of the Promise<{value,done}> result for the
-          // current iteration.
-          result.value = unwrapped;
-          resolve(result);
-        }, function(error) {
-          // If a rejected Promise was yielded, throw the rejection back
-          // into the async generator function so it can be handled there.
-          return invoke("throw", error, resolve, reject);
-        });
-      }
-    }
-
-    var previousPromise;
-
-    function enqueue(method, arg) {
-      function callInvokeWithMethodAndArg() {
-        return new PromiseImpl(function(resolve, reject) {
-          invoke(method, arg, resolve, reject);
-        });
-      }
-
-      return previousPromise =
-        // If enqueue has been called before, then we want to wait until
-        // all previous Promises have been resolved before calling invoke,
-        // so that results are always delivered in the correct order. If
-        // enqueue has not been called before, then it is important to
-        // call invoke immediately, without waiting on a callback to fire,
-        // so that the async generator function has the opportunity to do
-        // any necessary setup in a predictable way. This predictability
-        // is why the Promise constructor synchronously invokes its
-        // executor callback, and why async functions synchronously
-        // execute code before the first await. Since we implement simple
-        // async functions in terms of async generators, it is especially
-        // important to get this right, even though it requires care.
-        previousPromise ? previousPromise.then(
-          callInvokeWithMethodAndArg,
-          // Avoid propagating failures to Promises returned by later
-          // invocations of the iterator.
-          callInvokeWithMethodAndArg
-        ) : callInvokeWithMethodAndArg();
-    }
-
-    // Define the unified helper method that is used to implement .next,
-    // .throw, and .return (see defineIteratorMethods).
-    this._invoke = enqueue;
-  }
-
-  defineIteratorMethods(AsyncIterator.prototype);
-  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
-    return this;
-  };
-  exports.AsyncIterator = AsyncIterator;
-
-  // Note that simple async functions are implemented on top of
-  // AsyncIterator objects; they just return a Promise for the value of
-  // the final result produced by the iterator.
-  exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {
-    if (PromiseImpl === void 0) PromiseImpl = Promise;
-
-    var iter = new AsyncIterator(
-      wrap(innerFn, outerFn, self, tryLocsList),
-      PromiseImpl
-    );
-
-    return exports.isGeneratorFunction(outerFn)
-      ? iter // If outerFn is a generator, return the full iterator.
-      : iter.next().then(function(result) {
-          return result.done ? result.value : iter.next();
-        });
-  };
-
-  function makeInvokeMethod(innerFn, self, context) {
-    var state = GenStateSuspendedStart;
-
-    return function invoke(method, arg) {
-      if (state === GenStateExecuting) {
-        throw new Error("Generator is already running");
-      }
-
-      if (state === GenStateCompleted) {
-        if (method === "throw") {
-          throw arg;
-        }
-
-        // Be forgiving, per 25.3.3.3.3 of the spec:
-        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
-        return doneResult();
-      }
-
-      context.method = method;
-      context.arg = arg;
-
-      while (true) {
-        var delegate = context.delegate;
-        if (delegate) {
-          var delegateResult = maybeInvokeDelegate(delegate, context);
-          if (delegateResult) {
-            if (delegateResult === ContinueSentinel) continue;
-            return delegateResult;
-          }
-        }
-
-        if (context.method === "next") {
-          // Setting context._sent for legacy support of Babel's
-          // function.sent implementation.
-          context.sent = context._sent = context.arg;
-
-        } else if (context.method === "throw") {
-          if (state === GenStateSuspendedStart) {
-            state = GenStateCompleted;
-            throw context.arg;
-          }
-
-          context.dispatchException(context.arg);
-
-        } else if (context.method === "return") {
-          context.abrupt("return", context.arg);
-        }
-
-        state = GenStateExecuting;
-
-        var record = tryCatch(innerFn, self, context);
-        if (record.type === "normal") {
-          // If an exception is thrown from innerFn, we leave state ===
-          // GenStateExecuting and loop back for another invocation.
-          state = context.done
-            ? GenStateCompleted
-            : GenStateSuspendedYield;
-
-          if (record.arg === ContinueSentinel) {
-            continue;
-          }
-
-          return {
-            value: record.arg,
-            done: context.done
-          };
-
-        } else if (record.type === "throw") {
-          state = GenStateCompleted;
-          // Dispatch the exception by looping back around to the
-          // context.dispatchException(context.arg) call above.
-          context.method = "throw";
-          context.arg = record.arg;
-        }
-      }
-    };
-  }
-
-  // Call delegate.iterator[context.method](context.arg) and handle the
-  // result, either by returning a { value, done } result from the
-  // delegate iterator, or by modifying context.method and context.arg,
-  // setting context.delegate to null, and returning the ContinueSentinel.
-  function maybeInvokeDelegate(delegate, context) {
-    var method = delegate.iterator[context.method];
-    if (method === undefined) {
-      // A .throw or .return when the delegate iterator has no .throw
-      // method always terminates the yield* loop.
-      context.delegate = null;
-
-      if (context.method === "throw") {
-        // Note: ["return"] must be used for ES3 parsing compatibility.
-        if (delegate.iterator["return"]) {
-          // If the delegate iterator has a return method, give it a
-          // chance to clean up.
-          context.method = "return";
-          context.arg = undefined;
-          maybeInvokeDelegate(delegate, context);
-
-          if (context.method === "throw") {
-            // If maybeInvokeDelegate(context) changed context.method from
-            // "return" to "throw", let that override the TypeError below.
-            return ContinueSentinel;
-          }
-        }
-
-        context.method = "throw";
-        context.arg = new TypeError(
-          "The iterator does not provide a 'throw' method");
-      }
-
-      return ContinueSentinel;
-    }
-
-    var record = tryCatch(method, delegate.iterator, context.arg);
-
-    if (record.type === "throw") {
-      context.method = "throw";
-      context.arg = record.arg;
-      context.delegate = null;
-      return ContinueSentinel;
-    }
-
-    var info = record.arg;
-
-    if (! info) {
-      context.method = "throw";
-      context.arg = new TypeError("iterator result is not an object");
-      context.delegate = null;
-      return ContinueSentinel;
-    }
-
-    if (info.done) {
-      // Assign the result of the finished delegate to the temporary
-      // variable specified by delegate.resultName (see delegateYield).
-      context[delegate.resultName] = info.value;
-
-      // Resume execution at the desired location (see delegateYield).
-      context.next = delegate.nextLoc;
-
-      // If context.method was "throw" but the delegate handled the
-      // exception, let the outer generator proceed normally. If
-      // context.method was "next", forget context.arg since it has been
-      // "consumed" by the delegate iterator. If context.method was
-      // "return", allow the original .return call to continue in the
-      // outer generator.
-      if (context.method !== "return") {
-        context.method = "next";
-        context.arg = undefined;
-      }
-
-    } else {
-      // Re-yield the result returned by the delegate method.
-      return info;
-    }
-
-    // The delegate iterator is finished, so forget it and continue with
-    // the outer generator.
-    context.delegate = null;
-    return ContinueSentinel;
-  }
-
-  // Define Generator.prototype.{next,throw,return} in terms of the
-  // unified ._invoke helper method.
-  defineIteratorMethods(Gp);
-
-  Gp[toStringTagSymbol] = "Generator";
-
-  // A Generator should always return itself as the iterator object when the
-  // @@iterator function is called on it. Some browsers' implementations of the
-  // iterator prototype chain incorrectly implement this, causing the Generator
-  // object to not be returned from this call. This ensures that doesn't happen.
-  // See https://github.com/facebook/regenerator/issues/274 for more details.
-  Gp[iteratorSymbol] = function() {
-    return this;
-  };
-
-  Gp.toString = function() {
-    return "[object Generator]";
-  };
-
-  function pushTryEntry(locs) {
-    var entry = { tryLoc: locs[0] };
-
-    if (1 in locs) {
-      entry.catchLoc = locs[1];
-    }
-
-    if (2 in locs) {
-      entry.finallyLoc = locs[2];
-      entry.afterLoc = locs[3];
-    }
-
-    this.tryEntries.push(entry);
-  }
-
-  function resetTryEntry(entry) {
-    var record = entry.completion || {};
-    record.type = "normal";
-    delete record.arg;
-    entry.completion = record;
-  }
-
-  function Context(tryLocsList) {
-    // The root entry object (effectively a try statement without a catch
-    // or a finally block) gives us a place to store values thrown from
-    // locations where there is no enclosing try statement.
-    this.tryEntries = [{ tryLoc: "root" }];
-    tryLocsList.forEach(pushTryEntry, this);
-    this.reset(true);
-  }
-
-  exports.keys = function(object) {
-    var keys = [];
-    for (var key in object) {
-      keys.push(key);
-    }
-    keys.reverse();
-
-    // Rather than returning an object with a next method, we keep
-    // things simple and return the next function itself.
-    return function next() {
-      while (keys.length) {
-        var key = keys.pop();
-        if (key in object) {
-          next.value = key;
-          next.done = false;
-          return next;
-        }
-      }
-
-      // To avoid creating an additional object, we just hang the .value
-      // and .done properties off the next function object itself. This
-      // also ensures that the minifier will not anonymize the function.
-      next.done = true;
-      return next;
-    };
-  };
-
-  function values(iterable) {
-    if (iterable) {
-      var iteratorMethod = iterable[iteratorSymbol];
-      if (iteratorMethod) {
-        return iteratorMethod.call(iterable);
-      }
-
-      if (typeof iterable.next === "function") {
-        return iterable;
-      }
-
-      if (!isNaN(iterable.length)) {
-        var i = -1, next = function next() {
-          while (++i < iterable.length) {
-            if (hasOwn.call(iterable, i)) {
-              next.value = iterable[i];
-              next.done = false;
-              return next;
-            }
-          }
-
-          next.value = undefined;
-          next.done = true;
-
-          return next;
-        };
-
-        return next.next = next;
-      }
-    }
-
-    // Return an iterator with no values.
-    return { next: doneResult };
-  }
-  exports.values = values;
-
-  function doneResult() {
-    return { value: undefined, done: true };
-  }
-
-  Context.prototype = {
-    constructor: Context,
-
-    reset: function(skipTempReset) {
-      this.prev = 0;
-      this.next = 0;
-      // Resetting context._sent for legacy support of Babel's
-      // function.sent implementation.
-      this.sent = this._sent = undefined;
-      this.done = false;
-      this.delegate = null;
-
-      this.method = "next";
-      this.arg = undefined;
-
-      this.tryEntries.forEach(resetTryEntry);
-
-      if (!skipTempReset) {
-        for (var name in this) {
-          // Not sure about the optimal order of these conditions:
-          if (name.charAt(0) === "t" &&
-              hasOwn.call(this, name) &&
-              !isNaN(+name.slice(1))) {
-            this[name] = undefined;
-          }
-        }
-      }
-    },
-
-    stop: function() {
-      this.done = true;
-
-      var rootEntry = this.tryEntries[0];
-      var rootRecord = rootEntry.completion;
-      if (rootRecord.type === "throw") {
-        throw rootRecord.arg;
-      }
-
-      return this.rval;
-    },
-
-    dispatchException: function(exception) {
-      if (this.done) {
-        throw exception;
-      }
-
-      var context = this;
-      function handle(loc, caught) {
-        record.type = "throw";
-        record.arg = exception;
-        context.next = loc;
-
-        if (caught) {
-          // If the dispatched exception was caught by a catch block,
-          // then let that catch block handle the exception normally.
-          context.method = "next";
-          context.arg = undefined;
-        }
-
-        return !! caught;
-      }
-
-      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
-        var entry = this.tryEntries[i];
-        var record = entry.completion;
-
-        if (entry.tryLoc === "root") {
-          // Exception thrown outside of any try block that could handle
-          // it, so set the completion value of the entire function to
-          // throw the exception.
-          return handle("end");
-        }
-
-        if (entry.tryLoc <= this.prev) {
-          var hasCatch = hasOwn.call(entry, "catchLoc");
-          var hasFinally = hasOwn.call(entry, "finallyLoc");
-
-          if (hasCatch && hasFinally) {
-            if (this.prev < entry.catchLoc) {
-              return handle(entry.catchLoc, true);
-            } else if (this.prev < entry.finallyLoc) {
-              return handle(entry.finallyLoc);
-            }
-
-          } else if (hasCatch) {
-            if (this.prev < entry.catchLoc) {
-              return handle(entry.catchLoc, true);
-            }
-
-          } else if (hasFinally) {
-            if (this.prev < entry.finallyLoc) {
-              return handle(entry.finallyLoc);
-            }
-
-          } else {
-            throw new Error("try statement without catch or finally");
-          }
-        }
-      }
-    },
-
-    abrupt: function(type, arg) {
-      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
-        var entry = this.tryEntries[i];
-        if (entry.tryLoc <= this.prev &&
-            hasOwn.call(entry, "finallyLoc") &&
-            this.prev < entry.finallyLoc) {
-          var finallyEntry = entry;
-          break;
-        }
-      }
-
-      if (finallyEntry &&
-          (type === "break" ||
-           type === "continue") &&
-          finallyEntry.tryLoc <= arg &&
-          arg <= finallyEntry.finallyLoc) {
-        // Ignore the finally entry if control is not jumping to a
-        // location outside the try/catch block.
-        finallyEntry = null;
-      }
-
-      var record = finallyEntry ? finallyEntry.completion : {};
-      record.type = type;
-      record.arg = arg;
-
-      if (finallyEntry) {
-        this.method = "next";
-        this.next = finallyEntry.finallyLoc;
-        return ContinueSentinel;
-      }
-
-      return this.complete(record);
-    },
-
-    complete: function(record, afterLoc) {
-      if (record.type === "throw") {
-        throw record.arg;
-      }
-
-      if (record.type === "break" ||
-          record.type === "continue") {
-        this.next = record.arg;
-      } else if (record.type === "return") {
-        this.rval = this.arg = record.arg;
-        this.method = "return";
-        this.next = "end";
-      } else if (record.type === "normal" && afterLoc) {
-        this.next = afterLoc;
-      }
-
-      return ContinueSentinel;
-    },
-
-    finish: function(finallyLoc) {
-      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
-        var entry = this.tryEntries[i];
-        if (entry.finallyLoc === finallyLoc) {
-          this.complete(entry.completion, entry.afterLoc);
-          resetTryEntry(entry);
-          return ContinueSentinel;
-        }
-      }
-    },
-
-    "catch": function(tryLoc) {
-      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
-        var entry = this.tryEntries[i];
-        if (entry.tryLoc === tryLoc) {
-          var record = entry.completion;
-          if (record.type === "throw") {
-            var thrown = record.arg;
-            resetTryEntry(entry);
-          }
-          return thrown;
-        }
-      }
-
-      // The context.catch method must only be called with a location
-      // argument that corresponds to a known catch block.
-      throw new Error("illegal catch attempt");
-    },
-
-    delegateYield: function(iterable, resultName, nextLoc) {
-      this.delegate = {
-        iterator: values(iterable),
-        resultName: resultName,
-        nextLoc: nextLoc
-      };
-
-      if (this.method === "next") {
-        // Deliberately forget the last sent value so that we don't
-        // accidentally pass it on to the delegate.
-        this.arg = undefined;
-      }
-
-      return ContinueSentinel;
-    }
-  };
-
-  // Regardless of whether this script is executing as a CommonJS module
-  // or not, return the runtime object so that we can declare the variable
-  // regeneratorRuntime in the outer scope, which allows this module to be
-  // injected easily by `bin/regenerator --include-runtime script.js`.
-  return exports;
-
-}(
-  // If this script is executing as a CommonJS module, use module.exports
-  // as the regeneratorRuntime namespace. Otherwise create a new empty
-  // object. Either way, the resulting object will be used to initialize
-  // the regeneratorRuntime variable at the top of this file.
-  typeof module === "object" ? module.exports : {}
-));
-
-try {
-  regeneratorRuntime = runtime;
-} catch (accidentalStrictMode) {
-  // This module should not be running in strict mode, so the above
-  // assignment should always work unless something is misconfigured. Just
-  // in case runtime.js accidentally runs in strict mode, we can escape
-  // strict mode using a global Function call. This could conceivably fail
-  // if a Content Security Policy forbids using Function, but in that case
-  // the proper solution is to fix the accidental strict mode problem. If
-  // you've misconfigured your bundler to force strict mode and applied a
-  // CSP to forbid Function, and you're not willing to fix either of those
-  // problems, please detail your unique predicament in a GitHub issue.
-  Function("r", "regeneratorRuntime = r")(runtime);
-}
diff --git a/node_modules/regexp.prototype.flags/.editorconfig b/node_modules/regexp.prototype.flags/.editorconfig
deleted file mode 100644
index eaa2141..0000000
--- a/node_modules/regexp.prototype.flags/.editorconfig
+++ /dev/null
@@ -1,13 +0,0 @@
-root = true
-
-[*]
-indent_style = tab;
-insert_final_newline = true;
-quote_type = auto;
-space_after_anonymous_functions = true;
-space_after_control_statements = true;
-spaces_around_operators = true;
-trim_trailing_whitespace = true;
-spaces_in_brackets = false;
-end_of_line = lf;
-
diff --git a/node_modules/regexp.prototype.flags/.eslintrc b/node_modules/regexp.prototype.flags/.eslintrc
deleted file mode 100644
index 71e3771..0000000
--- a/node_modules/regexp.prototype.flags/.eslintrc
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"eqeqeq": [2, "allow-null"],
-		"max-statements": 0,
-		"no-extend-native": [2, { "exceptions": ["RegExp"] }],
-		"no-invalid-regexp": [2, { "allowConstructorFlags": ["s", "u", "y"] }],
-		"no-invalid-this": 0
-	},
-
-	"overrides": [
-		{
-			"files": "test/**",
-			"rules": {
-				"max-lines-per-function": 0,
-			},
-		},
-	],
-}
diff --git a/node_modules/regexp.prototype.flags/.github/workflows/rebase.yml b/node_modules/regexp.prototype.flags/.github/workflows/rebase.yml
deleted file mode 100644
index 436cb79..0000000
--- a/node_modules/regexp.prototype.flags/.github/workflows/rebase.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: Automatic Rebase
-
-on: [pull_request]
-
-jobs:
-  _:
-    name: "Automatic Rebase"
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v1
-    - uses: ljharb/rebase@master
-      env:
-        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/node_modules/regexp.prototype.flags/.travis.yml b/node_modules/regexp.prototype.flags/.travis.yml
deleted file mode 100644
index 2d1c1d2..0000000
--- a/node_modules/regexp.prototype.flags/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-version: ~> 1.0
-language: node_js
-os:
- - linux
-import:
- - ljharb/travis-ci:node/all.yml
- - ljharb/travis-ci:node/pretest.yml
- - ljharb/travis-ci:node/posttest.yml
- - ljharb/travis-ci:node/coverage.yml
-matrix:
-  allow_failures:
-    - env: COVERAGE=true
diff --git a/node_modules/regexp.prototype.flags/CHANGELOG.md b/node_modules/regexp.prototype.flags/CHANGELOG.md
deleted file mode 100644
index fba446d..0000000
--- a/node_modules/regexp.prototype.flags/CHANGELOG.md
+++ /dev/null
@@ -1,44 +0,0 @@
-1.3.0 / 2019-12-14
-=================
-  * [New] add `auto` entry point
-  * [Refactor] use `callBind` helper from `es-abstract`
-  * [Deps] update `define-properties`
-  * [meta] add `funding` field
-  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `covert`, `has`, `tape`
-  * [Tests] use shared travis-ci configs
-  * [Tests] use `eclint` instead of `editorconfig-tools`
-  * [Tests] remove `jscs`
-  * [Tests] use `npx aud` instead of `nsp` or `npm audit` with hoops
-  * [actions] add automatic rebasing / merge commit blocking
-
-1.2.0 / 2017-10-24
-=================
-  * [New] add support for `dotAll` regex flag.
-  * [Deps] update `define-properties`
-  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`, `jscs`, `nsp`, `@es-shims/api`
-  * [Tests] use pretest/posttest for better organization
-  * [Tests] up to `node` `v8.8`, `v7.10`, `v6.11`, `v4.8`; improve matrix; use `nvm install-latest-npm` so new npm doesn’t break old node
-
-1.1.1 / 2015-08-16
-=================
-  * [Fix] cover the case where there is no descriptor on the prototype
-
-1.1.0 / 2015-08-16
-=================
-  * [Robustness] Make some things a bit more robust against later modification of the environment
-  * [New] Implement the [es-shim API](es-shims/api)
-  * [Refactor] Move implementation to `implementation.js`
-  * [Dev Deps] update `eslint`, `jscs`, `tape`, `nsp`, `covert`
-  * [Tests] up to `io.js` `v3.0`
-  * [Tests] use my personal shared `eslint` config
-  * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
-
-1.0.1 / 2014-12-13
-=================
-  * Ensure that non-object values throw, per spec (#3)
-  * Properly match spec steps, so that the flags getter is generic (#3)
-
-1.0.0 / 2014-12-10
-=================
-  * v1.0.0
-
diff --git a/node_modules/regexp.prototype.flags/LICENSE b/node_modules/regexp.prototype.flags/LICENSE
deleted file mode 100644
index 9a8e1e0..0000000
--- a/node_modules/regexp.prototype.flags/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (C) 2014 Jordan Harband
-
-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.
\ No newline at end of file
diff --git a/node_modules/regexp.prototype.flags/README.md b/node_modules/regexp.prototype.flags/README.md
deleted file mode 100644
index 77e151e..0000000
--- a/node_modules/regexp.prototype.flags/README.md
+++ /dev/null
@@ -1,54 +0,0 @@
-RegExp.prototype.flags <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
-
-[![Build Status][travis-svg]][travis-url]
-[![dependency status][deps-svg]][deps-url]
-[![dev dependency status][dev-deps-svg]][dev-deps-url]
-[![License][license-image]][license-url]
-[![Downloads][downloads-image]][downloads-url]
-
-[![npm badge][npm-badge-png]][package-url]
-
-[![browser support][testling-svg]][testling-url]
-
-An ES6 spec-compliant `RegExp.prototype.flags` shim. Invoke its "shim" method to shim RegExp.prototype.flags if it is unavailable.
-*Note*: `RegExp#flags` requires a true ES5 environment - specifically, one with ES5 getters.
-
-This package implements the [es-shim API](https://github.com/es-shims/api) interface. It works in an ES5-supported environment and complies with the [spec](http://www.ecma-international.org/ecma-262/6.0/#sec-get-regexp.prototype.flags).
-
-Most common usage:
-```js
-var flags = require('regexp.prototype.flags');
-
-assert(flags(/a/) === '');
-assert(flags(new RegExp('a') === '');
-assert(flags(/a/mig) === 'gim');
-assert(flags(new RegExp('a', 'mig')) === 'gim');
-
-if (!RegExp.prototype.flags) {
-	flags.shim();
-}
-
-assert(flags(/a/) === /a/.flags);
-assert(flags(new RegExp('a') === new RegExp('a').flags);
-assert(flags(/a/mig) === /a/mig.flags);
-assert(flags(new RegExp('a', 'mig')) === new RegExp('a', 'mig').flags);
-```
-
-## Tests
-Simply clone the repo, `npm install`, and run `npm test`
-
-[package-url]: https://npmjs.com/package/regexp.prototype.flags
-[npm-version-svg]: http://versionbadg.es/es-shims/RegExp.prototype.flags.svg
-[travis-svg]: https://travis-ci.org/es-shims/RegExp.prototype.flags.svg
-[travis-url]: https://travis-ci.org/es-shims/RegExp.prototype.flags
-[deps-svg]: https://david-dm.org/es-shims/RegExp.prototype.flags.svg
-[deps-url]: https://david-dm.org/es-shims/RegExp.prototype.flags
-[dev-deps-svg]: https://david-dm.org/es-shims/RegExp.prototype.flags/dev-status.svg
-[dev-deps-url]: https://david-dm.org/es-shims/RegExp.prototype.flags#info=devDependencies
-[testling-svg]: https://ci.testling.com/es-shims/RegExp.prototype.flags.png
-[testling-url]: https://ci.testling.com/es-shims/RegExp.prototype.flags
-[npm-badge-png]: https://nodei.co/npm/regexp.prototype.flags.png?downloads=true&stars=true
-[license-image]: http://img.shields.io/npm/l/regexp.prototype.flags.svg
-[license-url]: LICENSE
-[downloads-image]: http://img.shields.io/npm/dm/regexp.prototype.flags.svg
-[downloads-url]: http://npm-stat.com/charts.html?package=regexp.prototype.flags
diff --git a/node_modules/regexp.prototype.flags/auto.js b/node_modules/regexp.prototype.flags/auto.js
deleted file mode 100644
index 8ebf606..0000000
--- a/node_modules/regexp.prototype.flags/auto.js
+++ /dev/null
@@ -1,3 +0,0 @@
-'use strict';
-
-require('./shim')();
diff --git a/node_modules/regexp.prototype.flags/implementation.js b/node_modules/regexp.prototype.flags/implementation.js
deleted file mode 100644
index e327dd8..0000000
--- a/node_modules/regexp.prototype.flags/implementation.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict';
-
-var $Object = Object;
-var $TypeError = TypeError;
-
-module.exports = function flags() {
-	if (this != null && this !== $Object(this)) {
-		throw new $TypeError('RegExp.prototype.flags getter called on non-object');
-	}
-	var result = '';
-	if (this.global) {
-		result += 'g';
-	}
-	if (this.ignoreCase) {
-		result += 'i';
-	}
-	if (this.multiline) {
-		result += 'm';
-	}
-	if (this.dotAll) {
-		result += 's';
-	}
-	if (this.unicode) {
-		result += 'u';
-	}
-	if (this.sticky) {
-		result += 'y';
-	}
-	return result;
-};
diff --git a/node_modules/regexp.prototype.flags/index.js b/node_modules/regexp.prototype.flags/index.js
deleted file mode 100644
index e375536..0000000
--- a/node_modules/regexp.prototype.flags/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-
-var define = require('define-properties');
-var callBind = require('es-abstract/helpers/callBind');
-
-var implementation = require('./implementation');
-var getPolyfill = require('./polyfill');
-var shim = require('./shim');
-
-var flagsBound = callBind(implementation);
-
-define(flagsBound, {
-	getPolyfill: getPolyfill,
-	implementation: implementation,
-	shim: shim
-});
-
-module.exports = flagsBound;
diff --git a/node_modules/regexp.prototype.flags/package.json b/node_modules/regexp.prototype.flags/package.json
deleted file mode 100644
index fd4cc74..0000000
--- a/node_modules/regexp.prototype.flags/package.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
-	"name": "regexp.prototype.flags",
-	"version": "1.3.0",
-	"author": "Jordan Harband <ljharb@gmail.com>",
-	"funding": {
-		"url": "https://github.com/sponsors/ljharb"
-	},
-	"description": "ES6 spec-compliant RegExp.prototype.flags shim.",
-	"license": "MIT",
-	"main": "index.js",
-	"scripts": {
-		"pretest": "npm run lint",
-		"test": "npm run tests-only",
-		"posttest": "npx aud",
-		"tests-only": "es-shim-api --bound && node --harmony --es-staging test/index.js",
-		"coverage": "covert test/*.js",
-		"coverage-quiet": "covert test/*.js --quiet",
-		"lint": "eslint .",
-		"eccheck": "eclint check *.js **/*.js > /dev/null"
-	},
-	"repository": {
-		"type": "git",
-		"url": "git://github.com/es-shims/RegExp.prototype.flags.git"
-	},
-	"keywords": [
-		"RegExp.prototype.flags",
-		"regex",
-		"regular expression",
-		"ES6",
-		"shim",
-		"flag",
-		"flags",
-		"regexp",
-		"RegExp#flags",
-		"polyfill",
-		"es-shim API"
-	],
-	"dependencies": {
-		"define-properties": "^1.1.3",
-		"es-abstract": "^1.17.0-next.1"
-	},
-	"devDependencies": {
-		"@es-shims/api": "^2.1.2",
-		"@ljharb/eslint-config": "^15.0.2",
-		"covert": "^1.1.1",
-		"eclint": "^2.8.1",
-		"eslint": "^6.7.2",
-		"has": "^1.0.3",
-		"tape": "^4.11.0"
-	},
-	"testling": {
-		"files": "test/index.js",
-		"browsers": [
-			"iexplore/9.0..latest",
-			"firefox/4.0..6.0",
-			"firefox/15.0..latest",
-			"firefox/nightly",
-			"chrome/4.0..10.0",
-			"chrome/20.0..latest",
-			"chrome/canary",
-			"opera/11.6..latest",
-			"opera/next",
-			"safari/5.0..latest",
-			"ipad/6.0..latest",
-			"iphone/6.0..latest",
-			"android-browser/4.2"
-		]
-	},
-	"engines": {
-		"node": ">= 0.4"
-	}
-}
diff --git a/node_modules/regexp.prototype.flags/polyfill.js b/node_modules/regexp.prototype.flags/polyfill.js
deleted file mode 100644
index 903479b..0000000
--- a/node_modules/regexp.prototype.flags/polyfill.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-var implementation = require('./implementation');
-
-var supportsDescriptors = require('define-properties').supportsDescriptors;
-var $gOPD = Object.getOwnPropertyDescriptor;
-var $TypeError = TypeError;
-
-module.exports = function getPolyfill() {
-	if (!supportsDescriptors) {
-		throw new $TypeError('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');
-	}
-	if ((/a/mig).flags === 'gim') {
-		var descriptor = $gOPD(RegExp.prototype, 'flags');
-		if (descriptor && typeof descriptor.get === 'function' && typeof (/a/).dotAll === 'boolean') {
-			return descriptor.get;
-		}
-	}
-	return implementation;
-};
diff --git a/node_modules/regexp.prototype.flags/shim.js b/node_modules/regexp.prototype.flags/shim.js
deleted file mode 100644
index 3ec77c1..0000000
--- a/node_modules/regexp.prototype.flags/shim.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-
-var supportsDescriptors = require('define-properties').supportsDescriptors;
-var getPolyfill = require('./polyfill');
-var gOPD = Object.getOwnPropertyDescriptor;
-var defineProperty = Object.defineProperty;
-var TypeErr = TypeError;
-var getProto = Object.getPrototypeOf;
-var regex = /a/;
-
-module.exports = function shimFlags() {
-	if (!supportsDescriptors || !getProto) {
-		throw new TypeErr('RegExp.prototype.flags requires a true ES5 environment that supports property descriptors');
-	}
-	var polyfill = getPolyfill();
-	var proto = getProto(regex);
-	var descriptor = gOPD(proto, 'flags');
-	if (!descriptor || descriptor.get !== polyfill) {
-		defineProperty(proto, 'flags', {
-			configurable: true,
-			enumerable: false,
-			get: polyfill
-		});
-	}
-	return polyfill;
-};
diff --git a/node_modules/regexp.prototype.flags/test/index.js b/node_modules/regexp.prototype.flags/test/index.js
deleted file mode 100644
index 2d40c8a..0000000
--- a/node_modules/regexp.prototype.flags/test/index.js
+++ /dev/null
@@ -1,146 +0,0 @@
-'use strict';
-
-var flags = require('../');
-var test = require('tape');
-var has = require('has');
-
-var getRegexLiteral = function (stringRegex) {
-	try {
-		/* jshint evil: true */
-		/* eslint-disable no-new-func */
-		return Function('return ' + stringRegex + ';')();
-		/* eslint-enable no-new-func */
-		/* jshint evil: false */
-	} catch (e) { /**/ }
-	return null;
-};
-
-flags.shim();
-var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags');
-var testGenericFlags = function (object) {
-	return descriptor.get.call(object);
-};
-
-test('works as a function', function (t) {
-	t.equal(flags(/a/g), 'g', 'flags(/a/g) !== "g"');
-	t.equal(flags(/a/gmi), 'gim', 'flags(/a/gmi) !== "gim"');
-	t.equal(flags(new RegExp('a', 'gmi')), 'gim', 'flags(new RegExp("a", "gmi")) !== "gim"');
-	t.equal(flags(/a/), '', 'flags(/a/) !== ""');
-	t.equal(flags(new RegExp('a')), '', 'flags(new RegExp("a")) !== ""');
-
-	t.test('sticky flag', { skip: !has(RegExp.prototype, 'sticky') }, function (st) {
-		st.equal(flags(getRegexLiteral('/a/y')), 'y', 'flags(/a/y) !== "y"');
-		st.equal(flags(new RegExp('a', 'y')), 'y', 'flags(new RegExp("a", "y")) !== "y"');
-		st.end();
-	});
-
-	t.test('unicode flag', { skip: !has(RegExp.prototype, 'unicode') }, function (st) {
-		st.equal(flags(getRegexLiteral('/a/u')), 'u', 'flags(/a/u) !== "u"');
-		st.equal(flags(new RegExp('a', 'u')), 'u', 'flags(new RegExp("a", "u")) !== "u"');
-		st.end();
-	});
-
-	t.test('dotAll flag', { skip: !has(RegExp.prototype, 'dotAll') }, function (st) {
-		st.equal(flags(getRegexLiteral('/a/s')), 's', 'flags(/a/s) !== "s"');
-		st.equal(flags(new RegExp('a', 's')), 's', 'flags(new RegExp("a", "s")) !== "s"');
-		st.end();
-	});
-
-	t.test('sorting', function (st) {
-		st.equal(flags(/a/gim), 'gim', 'flags(/a/gim) !== "gim"');
-		st.equal(flags(/a/mig), 'gim', 'flags(/a/mig) !== "gim"');
-		st.equal(flags(/a/mgi), 'gim', 'flags(/a/mgi) !== "gim"');
-		if (has(RegExp.prototype, 'sticky')) {
-			st.equal(flags(getRegexLiteral('/a/gyim')), 'gimy', 'flags(/a/gyim) !== "gimy"');
-		}
-		if (has(RegExp.prototype, 'unicode')) {
-			st.equal(flags(getRegexLiteral('/a/ugmi')), 'gimu', 'flags(/a/ugmi) !== "gimu"');
-		}
-		if (has(RegExp.prototype, 'dotAll')) {
-			st.equal(flags(getRegexLiteral('/a/sgmi')), 'gims', 'flags(/a/sgmi) !== "gims"');
-		}
-		st.end();
-	});
-
-	t.test('throws properly', function (st) {
-		var nonObjects = ['', false, true, 42, NaN, null, undefined];
-		st.plan(nonObjects.length);
-		var throwsOnNonObject = function (nonObject) {
-			st['throws'](Function.call.bind(nonObject), TypeError);
-		};
-		nonObjects.forEach(throwsOnNonObject);
-	});
-	t.end();
-});
-
-test('shims properly', function (t) {
-	t.test('basic examples', function (st) {
-		st.equal((/a/g).flags, 'g', '(/a/g).flags !== "g"');
-		st.equal((/a/gmi).flags, 'gim', '(/a/gmi).flags !== "gim"');
-		st.equal(new RegExp('a', 'gmi').flags, 'gim', 'new RegExp("a", "gmi").flags !== "gim"');
-		st.equal((/a/).flags, '', '(/a/).flags !== ""');
-		st.equal(new RegExp('a').flags, '', 'new RegExp("a").flags !== ""');
-		st.end();
-	});
-
-	t.test('sticky flag', { skip: !has(RegExp.prototype, 'sticky') }, function (st) {
-		st.equal(getRegexLiteral('/a/y').flags, 'y', '(/a/y).flags !== "y"');
-		st.equal(new RegExp('a', 'y').flags, 'y', 'new RegExp("a", "y").flags !== "y"');
-		st.end();
-	});
-
-	t.test('unicode flag', { skip: !has(RegExp.prototype, 'unicode') }, function (st) {
-		st.equal(getRegexLiteral('/a/u').flags, 'u', '(/a/u).flags !== "u"');
-		st.equal(new RegExp('a', 'u').flags, 'u', 'new RegExp("a", "u").flags !== "u"');
-		st.end();
-	});
-
-	t.test('dotAll flag', { skip: !has(RegExp.prototype, 'dotAll') }, function (st) {
-		st.equal(getRegexLiteral('/a/s').flags, 's', '(/a/s).flags !== "s"');
-		st.equal(new RegExp('a', 's').flags, 's', 'new RegExp("a", "s").flags !== "s"');
-		st.end();
-	});
-
-	t.test('sorting', function (st) {
-		st.equal((/a/gim).flags, 'gim', '(/a/gim).flags !== "gim"');
-		st.equal((/a/mig).flags, 'gim', '(/a/mig).flags !== "gim"');
-		st.equal((/a/mgi).flags, 'gim', '(/a/mgi).flags !== "gim"');
-		if (has(RegExp.prototype, 'sticky')) {
-			st.equal(getRegexLiteral('/a/gyim').flags, 'gimy', '(/a/gyim).flags !== "gimy"');
-		}
-		if (has(RegExp.prototype, 'unicode')) {
-			st.equal(getRegexLiteral('/a/ugmi').flags, 'gimu', '(/a/ugmi).flags !== "gimu"');
-		}
-		if (has(RegExp.prototype, 'dotAll')) {
-			st.equal(getRegexLiteral('/a/sgmi').flags, 'gims', '(/a/sgmi).flags !== "gims"');
-		}
-		st.end();
-	});
-
-	t.test('has the correct descriptor', function (st) {
-		st.equal(descriptor.configurable, true);
-		st.equal(descriptor.enumerable, false);
-		st.equal(typeof descriptor.get, 'function');
-		st.equal(descriptor.set, undefined);
-		st.end();
-	});
-
-	t.test('throws properly', function (st) {
-		var nonObjects = ['', false, true, 42, NaN, null, undefined];
-		st.plan(nonObjects.length);
-		var throwsOnNonObject = function (nonObject) {
-			st['throws'](testGenericFlags.bind(null, nonObject), TypeError);
-		};
-		nonObjects.forEach(throwsOnNonObject);
-	});
-
-	t.test('generic flags', function (st) {
-		st.equal(testGenericFlags({}), '');
-		st.equal(testGenericFlags({ ignoreCase: true }), 'i');
-		st.equal(testGenericFlags({ dotAll: 1, global: 0, sticky: 1, unicode: 1 }), 'suy');
-		st.equal(testGenericFlags({ __proto__: { multiline: true } }), 'm');
-		st.end();
-	});
-
-	t.end();
-});
diff --git a/node_modules/regextras/.babelrc b/node_modules/regextras/.babelrc
deleted file mode 100644
index ece1d87..0000000
--- a/node_modules/regextras/.babelrc
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "presets": [
-    ["@babel/preset-env"]
-  ]
-}
diff --git a/node_modules/regextras/.editorconfig b/node_modules/regextras/.editorconfig
deleted file mode 100644
index c6812c1..0000000
--- a/node_modules/regextras/.editorconfig
+++ /dev/null
@@ -1,12 +0,0 @@
-; EditorConfig file: https://EditorConfig.org
-; Install the "EditorConfig" plugin into your editor to use
-
-root = true
-
-[*]
-charset = utf-8
-end_of_line = lf
-insert_final_newline = true
-indent_style = space
-indent_size = 2
-trim_trailing_whitespace = true
diff --git a/node_modules/regextras/.eslintignore b/node_modules/regextras/.eslintignore
deleted file mode 100644
index 0e75fe5..0000000
--- a/node_modules/regextras/.eslintignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules
-dist
-coverage
diff --git a/node_modules/regextras/.eslintrc.js b/node_modules/regextras/.eslintrc.js
deleted file mode 100644
index ab10e77..0000000
--- a/node_modules/regextras/.eslintrc.js
+++ /dev/null
@@ -1,57 +0,0 @@
-module.exports = {
-  extends: 'ash-nazg/sauron-node',
-  settings: {
-    polyfills: [
-      'console',
-      'document.body'
-    ]
-  },
-  overrides: [{
-    files: 'test/**.js',
-    extends: [
-      'plugin:chai-friendly/recommended',
-      'plugin:chai-expect/recommended'
-    ],
-    env: {
-      mocha: true
-    },
-    globals: {
-      expect: true,
-      assert: true
-    },
-    rules: {
-      'node/no-unsupported-features/es-syntax': 0
-    }
-  }, {
-    files: 'tests/**.js',
-    rules: {
-      'no-console': 0
-    }
-  }, {
-    files: '*.md',
-    globals: {
-      require: false,
-      RegExtras: false,
-      condition: false,
-      regex: false,
-      str: false
-    },
-    rules: {
-      'node/no-unsupported-features/es-syntax': 0,
-      'node/no-extraneous-require': ['error', {allowModules: ['regextras']}],
-      'import/unambiguous': 0,
-      'import/no-commonjs': 0,
-      'import/no-extraneous-dependencies': 0,
-      'no-shadow': ['error', {allow: ['RegExtras']}],
-      'no-unused-vars': ['error', {
-        varsIgnorePattern: 'matches|RegExtras|piglatinArray',
-        argsIgnorePattern: 'matches'
-      }]
-    }
-  }],
-  rules: {
-    // Disable for now
-    'prefer-named-capture-group': 0,
-    'require-unicode-regexp': 0
-  }
-};
diff --git a/node_modules/regextras/.remarkrc b/node_modules/regextras/.remarkrc
deleted file mode 100644
index a3a7b10..0000000
--- a/node_modules/regextras/.remarkrc
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "plugins": {
-    "lint": {
-        "no-multiple-toplevel-headings": false,
-        "ordered-list-marker-value": "one",
-        "no-missing-blank-lines": false,
-        "list-item-spacing": false,
-        "list-item-indent": false
-    }
-  }
-}
diff --git a/node_modules/regextras/CHANGES.md b/node_modules/regextras/CHANGES.md
deleted file mode 100644
index a14ae96..0000000
--- a/node_modules/regextras/CHANGES.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# CHANGES for regextras
-
-## 0.7.0
-
-- Linting (ESLint): Update per latest ash-nazg; switch to 2sp.
-  indent; lint HTML, Markdown
-- Maintenance: Add `.editorconfig`
-- Fix: Properly add any extra u (unicode) flag
-- Enhancement: Add any extra s (dotAll) flag
-- Testing: Use ESM
-- Testing: Add nyc for coverage
-- Testing: Begin use of BDD style
-- Testing: Add tests for mixinRegex and plain prototype.js
-- Testing: Add HTML reporter
-- npm: Update devDeps
-
-## 0.6.1
-
-- npm: Drop `peerDependencies` (though still required)
-
-## 0.6.0
-
-- Enhancement: Add `main` ES and UMD builds (without generators)
-- Linting (ESLint): Apply ash-nazg; use js file format
-- Linting: Add `lgtm.yml`
-- Testing: Avoid missing `regenerator-runtime` and `core-js-bundle`;
-    favicon no-ops; use strict; put `write` in own module
-- npm: Update devDeps, peerDep; add ash-nazg and its peerDeps; ignore rollup
-
-## 0.5.0
-
-- Babel: Add `.babelrc`, preset-env
-- Linting: Switch to .json file; update to avoid new standard rule
-- Testing: Switch from end-of-lifed nodeunit to Mocha
-- npm: Update devDeps; use terser and @babel/core; opn-cli -> open-cli
-- npm: Add regenerator-runtime and core-js-bundle peerDeps and devDeps
-
-## 0.4.0
-
-- Breaking change: Stop exporting default
-- npm: Update devDep
-- npm: Separate nodeunit script from linting/rollup
-
-## 0.3.0
-
-- Breaking change: Move now ES6 source files from `lib` to `src`
-- Enhancement: ES6 Modules export (incomplete)
-- Refactoring: Swap main with index
-- Linting: Add ESLint, `.remarkrc`
-- License: Remove mistakenly copied portion from my other repo
-- License: Rename to reflect type (MIT)
-- npm: Add `packge-lock.json`
-- npm: Update devDeps
-
-## 0.1.1
-
-- Fix README
-
-## 0.1.0
-
-- Initial release
diff --git a/node_modules/regextras/LICENSE-MIT.txt b/node_modules/regextras/LICENSE-MIT.txt
deleted file mode 100644
index 2f25801..0000000
--- a/node_modules/regextras/LICENSE-MIT.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-Copyright (C) 2012 Brett Zamir
-
-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/node_modules/regextras/README.md b/node_modules/regextras/README.md
deleted file mode 100644
index fbb3a6e..0000000
--- a/node_modules/regextras/README.md
+++ /dev/null
@@ -1,177 +0,0 @@
-# regextras
-
-Array extras for regular expressions.
-
-Also provides optional `String` and `RegExp` prototype extensions.
-
-No more writing the implementation-detail-leaking, non-semantic, and
-otherwise ugly:
-
-```js
-let matches;
-while ((matches = regex.exec(str)) !== null) {
-  // Do something
-  if (condition) {
-    break;
-  }
-}
-```
-
-While all of the array extras could be useful, `some`, might be the most
-general purpose as it (as with `every`) allows short-circuiting (breaking).
-
-The following is equivalent to that above (though with `matches` as local):
-
-```js
-RegExtras(regex).some(str, (matches) => {
-  // Do something
-  if (condition) {
-    return true;
-  }
-  return false;
-});
-```
-
-And if the condition is at the end of the loop, just this:
-
-```js
-RegExtras(regex).some(str, (matches) => {
-  // Do something
-  return condition;
-});
-```
-
-## Installation
-
-Node:
-
-```js
-const RegExtras = require('regextras');
-```
-
-Modern browsers:
-
-```js
-import {RegExtras} from './node_modules/regextras/dist/index-es.js';
-```
-
-Older browsers:
-
-```html
-<script src="regextras/dist/index-umd.js"></script>
-```
-
-The prototype versions must be required or included separately.
-
-If you need the generator methods, you should also add the following:
-
-```html
-<script src="regextras/dist/index-generators-umd.js"></script>
-```
-
-## API
-
-### Constructor
-
-`new RegExtras(regex, flags, newLastIndex)`
-
-Example:
-
-```js
-const piglatinArray = RegExtras(/\w*w?ay/).reduce('ouyay areway illysay', function (arr, i, word) {
-  if (word.endsWith('way')) { arr.push(word.replace(/way$/, '')); } else { arr.push(word.slice(-3, -2) + word.slice(0, -3)); }
-  return arr;
-}, []);
-```
-
-All arguments but the first are optional, and the first argument can be
-expressed as a string.
-
-The `new` keywords is not required.
-
-### Instance methods
-
-These methods (and their callbacks) behave like the [array extra](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Iteration_methods)
-to which they correspond with exceptions detailed below.
-
--   ***forEach(str, callback, thisObject)*** - Unlike the other extras, this
-    method returns the RegExtras object (to enable chaining).
-
--   ***some(str, callback, thisObject)***
-
--   ***every(str, callback, thisObject)***
-
--   ***map(str, callback, thisObject)***
-
--   ***filter(str, callback, thisObject)***
-
--   ***reduce(str, cb, prev, thisObj)*** - Unlike the array extras, allows a
-    fourth argument to set an alternative value for `this` within the callback.
-
--   ***reduceRight(str, cb, prev, thisObj)*** - Unlike the array extras,
-    allows a fourth argument to set an alternative value for `this` within
-    the callback.
-
--   ***find(str, cb, thisObj)***
-
--   ***findIndex(str, cb, thisObj)***
-
-Also adds the following methods:
-
--   ***findExec(str, cb, thisObj)*** - Operates like `find()` except that it
-    returns the `exec` result array (with `index` and `input` as well as
-    numeric properties as returned by [RegExp.prototype.exec](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec)).
-
--   ***filterExec(str, cb, thisObj)*** - Operates like `filter()` except that
-    the resulting array will contain the full `exec` results.
-
-If you are using the Node version (or if, for the browser, you add the
-`index-generators.js` file and you are only supporting modern browsers), one
-can use the following generator methods:
-
--   ***values(str)*** - Returns an iterator with the array of matches (for each
-    `RegExp.prototype.exec` result)
-
--   ***keys(str)*** - Returns an iterator with 0-based indexes (from
-    `RegExp.prototype.exec` result)
-
--   ***entries(str)*** - Returns an iterator with an array containing the
-    key and the array of matches (for each `RegExp.prototype.exec` result)
-
-### Class methods
-
--   ***mixinRegex(regex, newFlags='', newLastIndex=regex.lastIndex)*** -
-    Makes a copy of a regular expression.
-
-### Callbacks
-
-All callbacks follow the signature:
-
-`cb(n1, n2..., i, n0);`
-
-...except for the `reduce` and `reduceRight` callbacks which follow:
-
-`cb(prev, n1, n2..., i, n0);`
-
-### Prototype versions
-
-`String` and `RegExp` versions of the above methods are also available.
-
-The `RegExp` prototype version acts in the same way as `RegExtra` just
-without the need for a separate constructor call.
-
-The `String` prototype version differs in that instead of the first argument
-being a string, it is the regular expression.
-
-## Todos
-
-1.  Could add [Array accessor methods](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Accessor_methods)
-    like `slice()`, with an additional supplied regular expression to gather
-    the `exec` results into an array.
-
-2.  Utilize `nodeunit` browser testing (and add `mixinRegex` tests)
-
-    1. Convert nodeunit tests to ES6 modules running through babel-register?;
-        streamline as sole set of tests, reconciling `test` with `tests` folder
-
-3.  Add generators for prototype versions
diff --git a/node_modules/regextras/dist/index-es.js b/node_modules/regextras/dist/index-es.js
deleted file mode 100644
index 20f3a42..0000000
--- a/node_modules/regextras/dist/index-es.js
+++ /dev/null
@@ -1,450 +0,0 @@
-function _classCallCheck(instance, Constructor) {
-  if (!(instance instanceof Constructor)) {
-    throw new TypeError("Cannot call a class as a function");
-  }
-}
-
-function _defineProperties(target, props) {
-  for (var i = 0; i < props.length; i++) {
-    var descriptor = props[i];
-    descriptor.enumerable = descriptor.enumerable || false;
-    descriptor.configurable = true;
-    if ("value" in descriptor) descriptor.writable = true;
-    Object.defineProperty(target, descriptor.key, descriptor);
-  }
-}
-
-function _createClass(Constructor, protoProps, staticProps) {
-  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
-  if (staticProps) _defineProperties(Constructor, staticProps);
-  return Constructor;
-}
-
-function _setPrototypeOf(o, p) {
-  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
-    o.__proto__ = p;
-    return o;
-  };
-
-  return _setPrototypeOf(o, p);
-}
-
-function isNativeReflectConstruct() {
-  if (typeof Reflect === "undefined" || !Reflect.construct) return false;
-  if (Reflect.construct.sham) return false;
-  if (typeof Proxy === "function") return true;
-
-  try {
-    Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
-    return true;
-  } catch (e) {
-    return false;
-  }
-}
-
-function _construct(Parent, args, Class) {
-  if (isNativeReflectConstruct()) {
-    _construct = Reflect.construct;
-  } else {
-    _construct = function _construct(Parent, args, Class) {
-      var a = [null];
-      a.push.apply(a, args);
-      var Constructor = Function.bind.apply(Parent, a);
-      var instance = new Constructor();
-      if (Class) _setPrototypeOf(instance, Class.prototype);
-      return instance;
-    };
-  }
-
-  return _construct.apply(null, arguments);
-}
-
-/* eslint-disable node/no-unsupported-features/es-syntax */
-
-/**
- * @param {RegExp} regex
- * @param {string} newFlags
- * @param {Integer} [newLastIndex=regex.lastIndex]
- * @returns {RegExp}
- */
-function mixinRegex(regex, newFlags) {
-  var newLastIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : regex.lastIndex;
-  newFlags = newFlags || '';
-  regex = new RegExp(regex.source, (newFlags.includes('g') ? 'g' : regex.global ? 'g' : '') + (newFlags.includes('i') ? 'i' : regex.ignoreCase ? 'i' : '') + (newFlags.includes('m') ? 'm' : regex.multiline ? 'm' : '') + (newFlags.includes('u') ? 'u' : regex.sticky ? 'u' : '') + (newFlags.includes('y') ? 'y' : regex.sticky ? 'y' : ''));
-  regex.lastIndex = newLastIndex;
-  return regex;
-}
-
-var RegExtras =
-/*#__PURE__*/
-function () {
-  function RegExtras(regex, flags, newLastIndex) {
-    _classCallCheck(this, RegExtras);
-
-    this.regex = mixinRegex(typeof regex === 'string' ? new RegExp(regex) : mixinRegex(regex), flags || '', newLastIndex);
-  }
-
-  _createClass(RegExtras, [{
-    key: "forEach",
-    value: function forEach(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var regex = mixinRegex(this.regex, 'g');
-      var matches,
-          n0,
-          i = 0;
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        cb.apply(thisObj, matches.concat(i++, n0));
-      }
-
-      return this;
-    }
-  }, {
-    key: "some",
-    value: function some(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var regex = mixinRegex(this.regex, 'g');
-      var matches,
-          ret,
-          n0,
-          i = 0;
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-        if (ret) {
-          return true;
-        }
-      }
-
-      return false;
-    }
-  }, {
-    key: "every",
-    value: function every(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var regex = mixinRegex(this.regex, 'g');
-      var matches,
-          ret,
-          n0,
-          i = 0;
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-        if (!ret) {
-          return false;
-        }
-      }
-
-      return true;
-    }
-  }, {
-    key: "map",
-    value: function map(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var ret = [];
-      var regex = mixinRegex(this.regex, 'g');
-      var matches,
-          n0,
-          i = 0;
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-      }
-
-      return ret;
-    }
-  }, {
-    key: "filter",
-    value: function filter(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var matches,
-          n0,
-          i = 0;
-      var ret = [],
-          regex = mixinRegex(this.regex, 'g');
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        matches = matches.concat(i++, n0);
-
-        if (cb.apply(thisObj, matches)) {
-          ret.push(n0[0]);
-        }
-      }
-
-      return ret;
-    }
-  }, {
-    key: "reduce",
-    value: function reduce(str, cb, prev) {
-      var thisObj = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
-      var matches,
-          n0,
-          i = 0;
-      var regex = mixinRegex(this.regex, 'g');
-
-      if (!prev) {
-        if ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          prev = cb.apply(thisObj, [''].concat(matches.concat(i++, n0)));
-        }
-      }
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        prev = cb.apply(thisObj, [prev].concat(matches.concat(i++, n0)));
-      }
-
-      return prev;
-    }
-  }, {
-    key: "reduceRight",
-    value: function reduceRight(str, cb, prevOrig, thisObjOrig) {
-      var matches,
-          n0,
-          i,
-          thisObj = thisObjOrig,
-          prev = prevOrig;
-      var matchesContainer = [],
-          regex = mixinRegex(this.regex, 'g');
-      thisObj = thisObj || null;
-
-      while ((matches = regex.exec(str)) !== null) {
-        matchesContainer.push(matches);
-      }
-
-      i = matchesContainer.length;
-
-      if (!i) {
-        if (arguments.length < 3) {
-          throw new TypeError('reduce of empty matches array with no initial value');
-        }
-
-        return prev;
-      }
-
-      if (!prev) {
-        matches = matchesContainer.splice(-1)[0];
-        n0 = matches.splice(0, 1);
-        prev = cb.apply(thisObj, [''].concat(matches.concat(i--, n0)));
-      }
-
-      matchesContainer.reduceRight(function (container, mtches) {
-        n0 = mtches.splice(0, 1);
-        prev = cb.apply(thisObj, [prev].concat(mtches.concat(i--, n0)));
-        return container;
-      }, matchesContainer);
-      return prev;
-    }
-  }, {
-    key: "find",
-    value: function find(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var matches,
-          ret,
-          n0,
-          i = 0;
-      var regex = mixinRegex(this.regex, 'g');
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-        if (ret) {
-          return n0[0];
-        }
-      }
-
-      return false;
-    }
-  }, {
-    key: "findIndex",
-    value: function findIndex(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var regex = mixinRegex(this.regex, 'g');
-      var matches,
-          i = 0;
-
-      while ((matches = regex.exec(str)) !== null) {
-        var n0 = matches.splice(0, 1);
-        var ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-        if (ret) {
-          return i - 1;
-        }
-      }
-
-      return -1;
-    }
-  }, {
-    key: "findExec",
-    value: function findExec(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var regex = mixinRegex(this.regex, 'g');
-      var matches,
-          i = 0;
-
-      while ((matches = regex.exec(str)) !== null) {
-        var n0 = matches.splice(0, 1);
-        var ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-        if (ret) {
-          return matches;
-        }
-      }
-
-      return false;
-    }
-  }, {
-    key: "filterExec",
-    value: function filterExec(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var matches,
-          n0,
-          i = 0;
-      var ret = [],
-          regex = mixinRegex(this.regex, 'g');
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        matches.push(i++, n0[0]);
-
-        if (cb.apply(thisObj, matches)) {
-          ret.push(matches);
-        }
-      }
-
-      return ret;
-    }
-  }]);
-
-  return RegExtras;
-}();
-
-var _RegExtras = RegExtras;
-
-RegExtras = function RegExtras() {
-  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
-    args[_key] = arguments[_key];
-  }
-
-  // eslint-disable-line no-class-assign
-  return _construct(_RegExtras, args);
-};
-
-RegExtras.prototype = _RegExtras.prototype;
-RegExtras.mixinRegex = mixinRegex;
-
-/* eslint-disable node/no-unsupported-features/es-syntax */
-// We copy the regular expression so as to be able to always
-// ensure the exec expression is a global one (and thereby prevent recursion)
-
-/**
- *
- * @param {RegExtras} RegExtras
- * @returns {void}
- */
-function addPrototypeMethods(RegExtras) {
-  RegExtras.prototype.entries =
-  /*#__PURE__*/
-  regeneratorRuntime.mark(function _callee(str) {
-    var matches, i, regex;
-    return regeneratorRuntime.wrap(function _callee$(_context) {
-      while (1) {
-        switch (_context.prev = _context.next) {
-          case 0:
-            i = 0;
-            regex = RegExtras.mixinRegex(this.regex, 'g');
-
-          case 2:
-            if (!((matches = regex.exec(str)) !== null)) {
-              _context.next = 7;
-              break;
-            }
-
-            _context.next = 5;
-            return [i++, matches];
-
-          case 5:
-            _context.next = 2;
-            break;
-
-          case 7:
-          case "end":
-            return _context.stop();
-        }
-      }
-    }, _callee, this);
-  });
-  RegExtras.prototype.values =
-  /*#__PURE__*/
-  regeneratorRuntime.mark(function _callee2(str) {
-    var matches, regex;
-    return regeneratorRuntime.wrap(function _callee2$(_context2) {
-      while (1) {
-        switch (_context2.prev = _context2.next) {
-          case 0:
-            regex = RegExtras.mixinRegex(this.regex, 'g');
-
-          case 1:
-            if (!((matches = regex.exec(str)) !== null)) {
-              _context2.next = 6;
-              break;
-            }
-
-            _context2.next = 4;
-            return matches;
-
-          case 4:
-            _context2.next = 1;
-            break;
-
-          case 6:
-          case "end":
-            return _context2.stop();
-        }
-      }
-    }, _callee2, this);
-  });
-  RegExtras.prototype.keys =
-  /*#__PURE__*/
-  regeneratorRuntime.mark(function _callee3(str) {
-    var i, regex;
-    return regeneratorRuntime.wrap(function _callee3$(_context3) {
-      while (1) {
-        switch (_context3.prev = _context3.next) {
-          case 0:
-            i = 0;
-            regex = RegExtras.mixinRegex(this.regex, 'g');
-
-          case 2:
-            if (!(regex.exec(str) !== null)) {
-              _context3.next = 7;
-              break;
-            }
-
-            _context3.next = 5;
-            return i++;
-
-          case 5:
-            _context3.next = 2;
-            break;
-
-          case 7:
-          case "end":
-            return _context3.stop();
-        }
-      }
-    }, _callee3, this);
-  });
-}
-
-addPrototypeMethods(RegExtras);
-
-export { RegExtras, mixinRegex };
diff --git a/node_modules/regextras/dist/index-es.min.js b/node_modules/regextras/dist/index-es.min.js
deleted file mode 100644
index 30149bf..0000000
--- a/node_modules/regextras/dist/index-es.min.js
+++ /dev/null
@@ -1 +0,0 @@
-function e(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function n(e,t){return(n=Object.setPrototypeOf||function(e,n){return e.__proto__=n,e})(e,t)}function t(e,r,c){return(t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}()?Reflect.construct:function(e,t,r){var c=[null];c.push.apply(c,t);var u=new(Function.bind.apply(e,c));return r&&n(u,r.prototype),u}).apply(null,arguments)}function r(e,n){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.lastIndex;return n=n||"",(e=new RegExp(e.source,(n.includes("g")?"g":e.global?"g":"")+(n.includes("i")?"i":e.ignoreCase?"i":"")+(n.includes("m")?"m":e.multiline?"m":"")+(n.includes("u")?"u":e.sticky?"u":"")+(n.includes("y")?"y":e.sticky?"y":""))).lastIndex=t,e}var c=function(){function n(e,t,c){!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,n),this.regex=r("string"==typeof e?new RegExp(e):r(e),t||"",c)}var t,c,u;return t=n,(c=[{key:"forEach",value:function(e,n){for(var t,c,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=r(this.regex,"g"),l=0;null!==(t=i.exec(e));)c=t.splice(0,1),n.apply(u,t.concat(l++,c));return this}},{key:"some",value:function(e,n){for(var t,c,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=r(this.regex,"g"),l=0;null!==(t=i.exec(e));)if(c=t.splice(0,1),n.apply(u,t.concat(l++,c)))return!0;return!1}},{key:"every",value:function(e,n){for(var t,c,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=r(this.regex,"g"),l=0;null!==(t=i.exec(e));)if(c=t.splice(0,1),!n.apply(u,t.concat(l++,c)))return!1;return!0}},{key:"map",value:function(e,n){for(var t,c,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=[],l=r(this.regex,"g"),o=0;null!==(t=l.exec(e));)c=t.splice(0,1),i.push(n.apply(u,t.concat(o++,c)));return i}},{key:"filter",value:function(e,n){for(var t,c,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=0,l=[],o=r(this.regex,"g");null!==(t=o.exec(e));)c=t.splice(0,1),t=t.concat(i++,c),n.apply(u,t)&&l.push(c[0]);return l}},{key:"reduce",value:function(e,n,t){var c,u,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,l=0,o=r(this.regex,"g");for(t||null!==(c=o.exec(e))&&(u=c.splice(0,1),t=n.apply(i,[""].concat(c.concat(l++,u))));null!==(c=o.exec(e));)u=c.splice(0,1),t=n.apply(i,[t].concat(c.concat(l++,u)));return t}},{key:"reduceRight",value:function(e,n,t,c){var u,i,l,o=c,a=t,p=[],s=r(this.regex,"g");for(o=o||null;null!==(u=s.exec(e));)p.push(u);if(!(l=p.length)){if(arguments.length<3)throw new TypeError("reduce of empty matches array with no initial value");return a}return a||(u=p.splice(-1)[0],i=u.splice(0,1),a=n.apply(o,[""].concat(u.concat(l--,i)))),p.reduceRight((function(e,t){return i=t.splice(0,1),a=n.apply(o,[a].concat(t.concat(l--,i))),e}),p),a}},{key:"find",value:function(e,n){for(var t,c,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=0,l=r(this.regex,"g");null!==(t=l.exec(e));)if(c=t.splice(0,1),n.apply(u,t.concat(i++,c)))return c[0];return!1}},{key:"findIndex",value:function(e,n){for(var t,c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,u=r(this.regex,"g"),i=0;null!==(t=u.exec(e));){var l=t.splice(0,1),o=n.apply(c,t.concat(i++,l));if(o)return i-1}return-1}},{key:"findExec",value:function(e,n){for(var t,c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,u=r(this.regex,"g"),i=0;null!==(t=u.exec(e));){var l=t.splice(0,1),o=n.apply(c,t.concat(i++,l));if(o)return t}return!1}},{key:"filterExec",value:function(e,n){for(var t,c,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=0,l=[],o=r(this.regex,"g");null!==(t=o.exec(e));)c=t.splice(0,1),t.push(i++,c[0]),n.apply(u,t)&&l.push(t);return l}}])&&e(t.prototype,c),u&&e(t,u),n}(),u=c;(c=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return t(u,n)}).prototype=u.prototype,c.mixinRegex=r,function(e){e.prototype.entries=regeneratorRuntime.mark((function n(t){var r,c,u;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:c=0,u=e.mixinRegex(this.regex,"g");case 2:if(null===(r=u.exec(t))){n.next=7;break}return n.next=5,[c++,r];case 5:n.next=2;break;case 7:case"end":return n.stop()}}),n,this)})),e.prototype.values=regeneratorRuntime.mark((function n(t){var r,c;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:c=e.mixinRegex(this.regex,"g");case 1:if(null===(r=c.exec(t))){n.next=6;break}return n.next=4,r;case 4:n.next=1;break;case 6:case"end":return n.stop()}}),n,this)})),e.prototype.keys=regeneratorRuntime.mark((function n(t){var r,c;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:r=0,c=e.mixinRegex(this.regex,"g");case 2:if(null===c.exec(t)){n.next=7;break}return n.next=5,r++;case 5:n.next=2;break;case 7:case"end":return n.stop()}}),n,this)}))}(c);export{c as RegExtras,r as mixinRegex};
diff --git a/node_modules/regextras/dist/index-generators-es.js b/node_modules/regextras/dist/index-generators-es.js
deleted file mode 100644
index 1ee4b5e..0000000
--- a/node_modules/regextras/dist/index-generators-es.js
+++ /dev/null
@@ -1,105 +0,0 @@
-/* eslint-disable node/no-unsupported-features/es-syntax */
-// We copy the regular expression so as to be able to always
-// ensure the exec expression is a global one (and thereby prevent recursion)
-
-/**
- *
- * @param {RegExtras} RegExtras
- * @returns {void}
- */
-function addPrototypeMethods(RegExtras) {
-  RegExtras.prototype.entries =
-  /*#__PURE__*/
-  regeneratorRuntime.mark(function _callee(str) {
-    var matches, i, regex;
-    return regeneratorRuntime.wrap(function _callee$(_context) {
-      while (1) {
-        switch (_context.prev = _context.next) {
-          case 0:
-            i = 0;
-            regex = RegExtras.mixinRegex(this.regex, 'g');
-
-          case 2:
-            if (!((matches = regex.exec(str)) !== null)) {
-              _context.next = 7;
-              break;
-            }
-
-            _context.next = 5;
-            return [i++, matches];
-
-          case 5:
-            _context.next = 2;
-            break;
-
-          case 7:
-          case "end":
-            return _context.stop();
-        }
-      }
-    }, _callee, this);
-  });
-  RegExtras.prototype.values =
-  /*#__PURE__*/
-  regeneratorRuntime.mark(function _callee2(str) {
-    var matches, regex;
-    return regeneratorRuntime.wrap(function _callee2$(_context2) {
-      while (1) {
-        switch (_context2.prev = _context2.next) {
-          case 0:
-            regex = RegExtras.mixinRegex(this.regex, 'g');
-
-          case 1:
-            if (!((matches = regex.exec(str)) !== null)) {
-              _context2.next = 6;
-              break;
-            }
-
-            _context2.next = 4;
-            return matches;
-
-          case 4:
-            _context2.next = 1;
-            break;
-
-          case 6:
-          case "end":
-            return _context2.stop();
-        }
-      }
-    }, _callee2, this);
-  });
-  RegExtras.prototype.keys =
-  /*#__PURE__*/
-  regeneratorRuntime.mark(function _callee3(str) {
-    var i, regex;
-    return regeneratorRuntime.wrap(function _callee3$(_context3) {
-      while (1) {
-        switch (_context3.prev = _context3.next) {
-          case 0:
-            i = 0;
-            regex = RegExtras.mixinRegex(this.regex, 'g');
-
-          case 2:
-            if (!(regex.exec(str) !== null)) {
-              _context3.next = 7;
-              break;
-            }
-
-            _context3.next = 5;
-            return i++;
-
-          case 5:
-            _context3.next = 2;
-            break;
-
-          case 7:
-          case "end":
-            return _context3.stop();
-        }
-      }
-    }, _callee3, this);
-  });
-}
-
-export default addPrototypeMethods;
diff --git a/node_modules/regextras/dist/index-generators-umd.js b/node_modules/regextras/dist/index-generators-umd.js
deleted file mode 100644
index d06a853..0000000
--- a/node_modules/regextras/dist/index-generators-umd.js
+++ /dev/null
@@ -1,115 +0,0 @@
-(function (global, factory) {
-  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
-  typeof define === 'function' && define.amd ? define(['exports'], factory) :
-  (global = global || self, factory(global.RegExtras = {}));
-}(this, (function (exports) { 'use strict';
-
-  /* eslint-disable node/no-unsupported-features/es-syntax */
-  // We copy the regular expression so as to be able to always
-  // ensure the exec expression is a global one (and thereby prevent recursion)
-
-  /**
-   *
-   * @param {RegExtras} RegExtras
-   * @returns {void}
-   */
-  function addPrototypeMethods(RegExtras) {
-    RegExtras.prototype.entries =
-    /*#__PURE__*/
-    regeneratorRuntime.mark(function _callee(str) {
-      var matches, i, regex;
-      return regeneratorRuntime.wrap(function _callee$(_context) {
-        while (1) {
-          switch (_context.prev = _context.next) {
-            case 0:
-              i = 0;
-              regex = RegExtras.mixinRegex(this.regex, 'g');
-
-            case 2:
-              if (!((matches = regex.exec(str)) !== null)) {
-                _context.next = 7;
-                break;
-              }
-
-              _context.next = 5;
-              return [i++, matches];
-
-            case 5:
-              _context.next = 2;
-              break;
-
-            case 7:
-            case "end":
-              return _context.stop();
-          }
-        }
-      }, _callee, this);
-    });
-    RegExtras.prototype.values =
-    /*#__PURE__*/
-    regeneratorRuntime.mark(function _callee2(str) {
-      var matches, regex;
-      return regeneratorRuntime.wrap(function _callee2$(_context2) {
-        while (1) {
-          switch (_context2.prev = _context2.next) {
-            case 0:
-              regex = RegExtras.mixinRegex(this.regex, 'g');
-
-            case 1:
-              if (!((matches = regex.exec(str)) !== null)) {
-                _context2.next = 6;
-                break;
-              }
-
-              _context2.next = 4;
-              return matches;
-
-            case 4:
-              _context2.next = 1;
-              break;
-
-            case 6:
-            case "end":
-              return _context2.stop();
-          }
-        }
-      }, _callee2, this);
-    });
-    RegExtras.prototype.keys =
-    /*#__PURE__*/
-    regeneratorRuntime.mark(function _callee3(str) {
-      var i, regex;
-      return regeneratorRuntime.wrap(function _callee3$(_context3) {
-        while (1) {
-          switch (_context3.prev = _context3.next) {
-            case 0:
-              i = 0;
-              regex = RegExtras.mixinRegex(this.regex, 'g');
-
-            case 2:
-              if (!(regex.exec(str) !== null)) {
-                _context3.next = 7;
-                break;
-              }
-
-              _context3.next = 5;
-              return i++;
-
-            case 5:
-              _context3.next = 2;
-              break;
-
-            case 7:
-            case "end":
-              return _context3.stop();
-          }
-        }
-      }, _callee3, this);
-    });
-  }
-
-  exports.default = addPrototypeMethods;
-
-  Object.defineProperty(exports, '__esModule', { value: true });
-
-})));
diff --git a/node_modules/regextras/dist/index-umd.js b/node_modules/regextras/dist/index-umd.js
deleted file mode 100644
index cd1770c..0000000
--- a/node_modules/regextras/dist/index-umd.js
+++ /dev/null
@@ -1,460 +0,0 @@
-(function (global, factory) {
-  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
-  typeof define === 'function' && define.amd ? define(['exports'], factory) :
-  (global = global || self, factory(global.RegExtras = {}));
-}(this, (function (exports) { 'use strict';
-
-  function _classCallCheck(instance, Constructor) {
-    if (!(instance instanceof Constructor)) {
-      throw new TypeError("Cannot call a class as a function");
-    }
-  }
-
-  function _defineProperties(target, props) {
-    for (var i = 0; i < props.length; i++) {
-      var descriptor = props[i];
-      descriptor.enumerable = descriptor.enumerable || false;
-      descriptor.configurable = true;
-      if ("value" in descriptor) descriptor.writable = true;
-      Object.defineProperty(target, descriptor.key, descriptor);
-    }
-  }
-
-  function _createClass(Constructor, protoProps, staticProps) {
-    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
-    if (staticProps) _defineProperties(Constructor, staticProps);
-    return Constructor;
-  }
-
-  function _setPrototypeOf(o, p) {
-    _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
-      o.__proto__ = p;
-      return o;
-    };
-
-    return _setPrototypeOf(o, p);
-  }
-
-  function isNativeReflectConstruct() {
-    if (typeof Reflect === "undefined" || !Reflect.construct) return false;
-    if (Reflect.construct.sham) return false;
-    if (typeof Proxy === "function") return true;
-
-    try {
-      Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
-      return true;
-    } catch (e) {
-      return false;
-    }
-  }
-
-  function _construct(Parent, args, Class) {
-    if (isNativeReflectConstruct()) {
-      _construct = Reflect.construct;
-    } else {
-      _construct = function _construct(Parent, args, Class) {
-        var a = [null];
-        a.push.apply(a, args);
-        var Constructor = Function.bind.apply(Parent, a);
-        var instance = new Constructor();
-        if (Class) _setPrototypeOf(instance, Class.prototype);
-        return instance;
-      };
-    }
-
-    return _construct.apply(null, arguments);
-  }
-
-  /* eslint-disable node/no-unsupported-features/es-syntax */
-
-  /**
-   * @param {RegExp} regex
-   * @param {string} newFlags
-   * @param {Integer} [newLastIndex=regex.lastIndex]
-   * @returns {RegExp}
-   */
-  function mixinRegex(regex, newFlags) {
-    var newLastIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : regex.lastIndex;
-    newFlags = newFlags || '';
-    regex = new RegExp(regex.source, (newFlags.includes('g') ? 'g' : regex.global ? 'g' : '') + (newFlags.includes('i') ? 'i' : regex.ignoreCase ? 'i' : '') + (newFlags.includes('m') ? 'm' : regex.multiline ? 'm' : '') + (newFlags.includes('u') ? 'u' : regex.sticky ? 'u' : '') + (newFlags.includes('y') ? 'y' : regex.sticky ? 'y' : ''));
-    regex.lastIndex = newLastIndex;
-    return regex;
-  }
-
-  exports.RegExtras =
-  /*#__PURE__*/
-  function () {
-    function RegExtras(regex, flags, newLastIndex) {
-      _classCallCheck(this, RegExtras);
-
-      this.regex = mixinRegex(typeof regex === 'string' ? new RegExp(regex) : mixinRegex(regex), flags || '', newLastIndex);
-    }
-
-    _createClass(RegExtras, [{
-      key: "forEach",
-      value: function forEach(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var regex = mixinRegex(this.regex, 'g');
-        var matches,
-            n0,
-            i = 0;
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          cb.apply(thisObj, matches.concat(i++, n0));
-        }
-
-        return this;
-      }
-    }, {
-      key: "some",
-      value: function some(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var regex = mixinRegex(this.regex, 'g');
-        var matches,
-            ret,
-            n0,
-            i = 0;
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-          if (ret) {
-            return true;
-          }
-        }
-
-        return false;
-      }
-    }, {
-      key: "every",
-      value: function every(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var regex = mixinRegex(this.regex, 'g');
-        var matches,
-            ret,
-            n0,
-            i = 0;
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-          if (!ret) {
-            return false;
-          }
-        }
-
-        return true;
-      }
-    }, {
-      key: "map",
-      value: function map(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var ret = [];
-        var regex = mixinRegex(this.regex, 'g');
-        var matches,
-            n0,
-            i = 0;
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-        }
-
-        return ret;
-      }
-    }, {
-      key: "filter",
-      value: function filter(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var matches,
-            n0,
-            i = 0;
-        var ret = [],
-            regex = mixinRegex(this.regex, 'g');
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          matches = matches.concat(i++, n0);
-
-          if (cb.apply(thisObj, matches)) {
-            ret.push(n0[0]);
-          }
-        }
-
-        return ret;
-      }
-    }, {
-      key: "reduce",
-      value: function reduce(str, cb, prev) {
-        var thisObj = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
-        var matches,
-            n0,
-            i = 0;
-        var regex = mixinRegex(this.regex, 'g');
-
-        if (!prev) {
-          if ((matches = regex.exec(str)) !== null) {
-            n0 = matches.splice(0, 1);
-            prev = cb.apply(thisObj, [''].concat(matches.concat(i++, n0)));
-          }
-        }
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          prev = cb.apply(thisObj, [prev].concat(matches.concat(i++, n0)));
-        }
-
-        return prev;
-      }
-    }, {
-      key: "reduceRight",
-      value: function reduceRight(str, cb, prevOrig, thisObjOrig) {
-        var matches,
-            n0,
-            i,
-            thisObj = thisObjOrig,
-            prev = prevOrig;
-        var matchesContainer = [],
-            regex = mixinRegex(this.regex, 'g');
-        thisObj = thisObj || null;
-
-        while ((matches = regex.exec(str)) !== null) {
-          matchesContainer.push(matches);
-        }
-
-        i = matchesContainer.length;
-
-        if (!i) {
-          if (arguments.length < 3) {
-            throw new TypeError('reduce of empty matches array with no initial value');
-          }
-
-          return prev;
-        }
-
-        if (!prev) {
-          matches = matchesContainer.splice(-1)[0];
-          n0 = matches.splice(0, 1);
-          prev = cb.apply(thisObj, [''].concat(matches.concat(i--, n0)));
-        }
-
-        matchesContainer.reduceRight(function (container, mtches) {
-          n0 = mtches.splice(0, 1);
-          prev = cb.apply(thisObj, [prev].concat(mtches.concat(i--, n0)));
-          return container;
-        }, matchesContainer);
-        return prev;
-      }
-    }, {
-      key: "find",
-      value: function find(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var matches,
-            ret,
-            n0,
-            i = 0;
-        var regex = mixinRegex(this.regex, 'g');
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-          if (ret) {
-            return n0[0];
-          }
-        }
-
-        return false;
-      }
-    }, {
-      key: "findIndex",
-      value: function findIndex(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var regex = mixinRegex(this.regex, 'g');
-        var matches,
-            i = 0;
-
-        while ((matches = regex.exec(str)) !== null) {
-          var n0 = matches.splice(0, 1);
-          var ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-          if (ret) {
-            return i - 1;
-          }
-        }
-
-        return -1;
-      }
-    }, {
-      key: "findExec",
-      value: function findExec(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var regex = mixinRegex(this.regex, 'g');
-        var matches,
-            i = 0;
-
-        while ((matches = regex.exec(str)) !== null) {
-          var n0 = matches.splice(0, 1);
-          var ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-          if (ret) {
-            return matches;
-          }
-        }
-
-        return false;
-      }
-    }, {
-      key: "filterExec",
-      value: function filterExec(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var matches,
-            n0,
-            i = 0;
-        var ret = [],
-            regex = mixinRegex(this.regex, 'g');
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          matches.push(i++, n0[0]);
-
-          if (cb.apply(thisObj, matches)) {
-            ret.push(matches);
-          }
-        }
-
-        return ret;
-      }
-    }]);
-
-    return RegExtras;
-  }();
-
-  var _RegExtras = exports.RegExtras;
-
-  exports.RegExtras = function RegExtras() {
-    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
-      args[_key] = arguments[_key];
-    }
-
-    // eslint-disable-line no-class-assign
-    return _construct(_RegExtras, args);
-  };
-
-  exports.RegExtras.prototype = _RegExtras.prototype;
-  exports.RegExtras.mixinRegex = mixinRegex;
-
-  /* eslint-disable node/no-unsupported-features/es-syntax */
-  // We copy the regular expression so as to be able to always
-  // ensure the exec expression is a global one (and thereby prevent recursion)
-
-  /**
-   *
-   * @param {RegExtras} RegExtras
-   * @returns {void}
-   */
-  function addPrototypeMethods(RegExtras) {
-    RegExtras.prototype.entries =
-    /*#__PURE__*/
-    regeneratorRuntime.mark(function _callee(str) {
-      var matches, i, regex;
-      return regeneratorRuntime.wrap(function _callee$(_context) {
-        while (1) {
-          switch (_context.prev = _context.next) {
-            case 0:
-              i = 0;
-              regex = RegExtras.mixinRegex(this.regex, 'g');
-
-            case 2:
-              if (!((matches = regex.exec(str)) !== null)) {
-                _context.next = 7;
-                break;
-              }
-
-              _context.next = 5;
-              return [i++, matches];
-
-            case 5:
-              _context.next = 2;
-              break;
-
-            case 7:
-            case "end":
-              return _context.stop();
-          }
-        }
-      }, _callee, this);
-    });
-    RegExtras.prototype.values =
-    /*#__PURE__*/
-    regeneratorRuntime.mark(function _callee2(str) {
-      var matches, regex;
-      return regeneratorRuntime.wrap(function _callee2$(_context2) {
-        while (1) {
-          switch (_context2.prev = _context2.next) {
-            case 0:
-              regex = RegExtras.mixinRegex(this.regex, 'g');
-
-            case 1:
-              if (!((matches = regex.exec(str)) !== null)) {
-                _context2.next = 6;
-                break;
-              }
-
-              _context2.next = 4;
-              return matches;
-
-            case 4:
-              _context2.next = 1;
-              break;
-
-            case 6:
-            case "end":
-              return _context2.stop();
-          }
-        }
-      }, _callee2, this);
-    });
-    RegExtras.prototype.keys =
-    /*#__PURE__*/
-    regeneratorRuntime.mark(function _callee3(str) {
-      var i, regex;
-      return regeneratorRuntime.wrap(function _callee3$(_context3) {
-        while (1) {
-          switch (_context3.prev = _context3.next) {
-            case 0:
-              i = 0;
-              regex = RegExtras.mixinRegex(this.regex, 'g');
-
-            case 2:
-              if (!(regex.exec(str) !== null)) {
-                _context3.next = 7;
-                break;
-              }
-
-              _context3.next = 5;
-              return i++;
-
-            case 5:
-              _context3.next = 2;
-              break;
-
-            case 7:
-            case "end":
-              return _context3.stop();
-          }
-        }
-      }, _callee3, this);
-    });
-  }
-
-  addPrototypeMethods(exports.RegExtras);
-
-  exports.mixinRegex = mixinRegex;
-
-  Object.defineProperty(exports, '__esModule', { value: true });
-
-})));
diff --git a/node_modules/regextras/dist/index-umd.min.js b/node_modules/regextras/dist/index-umd.min.js
deleted file mode 100644
index 8660f22..0000000
--- a/node_modules/regextras/dist/index-umd.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e=e||self).RegExtras={})}(this,(function(e){"use strict";function n(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function t(e,n){return(t=Object.setPrototypeOf||function(e,n){return e.__proto__=n,e})(e,n)}function r(e,n,c){return(r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}()?Reflect.construct:function(e,n,r){var c=[null];c.push.apply(c,n);var u=new(Function.bind.apply(e,c));return r&&t(u,r.prototype),u}).apply(null,arguments)}function c(e,n){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.lastIndex;return n=n||"",(e=new RegExp(e.source,(n.includes("g")?"g":e.global?"g":"")+(n.includes("i")?"i":e.ignoreCase?"i":"")+(n.includes("m")?"m":e.multiline?"m":"")+(n.includes("u")?"u":e.sticky?"u":"")+(n.includes("y")?"y":e.sticky?"y":""))).lastIndex=t,e}e.RegExtras=function(){function e(n,t,r){!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),this.regex=c("string"==typeof n?new RegExp(n):c(n),t||"",r)}var t,r,u;return t=e,(r=[{key:"forEach",value:function(e,n){for(var t,r,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=c(this.regex,"g"),l=0;null!==(t=i.exec(e));)r=t.splice(0,1),n.apply(u,t.concat(l++,r));return this}},{key:"some",value:function(e,n){for(var t,r,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=c(this.regex,"g"),l=0;null!==(t=i.exec(e));)if(r=t.splice(0,1),n.apply(u,t.concat(l++,r)))return!0;return!1}},{key:"every",value:function(e,n){for(var t,r,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=c(this.regex,"g"),l=0;null!==(t=i.exec(e));)if(r=t.splice(0,1),!n.apply(u,t.concat(l++,r)))return!1;return!0}},{key:"map",value:function(e,n){for(var t,r,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=[],l=c(this.regex,"g"),o=0;null!==(t=l.exec(e));)r=t.splice(0,1),i.push(n.apply(u,t.concat(o++,r)));return i}},{key:"filter",value:function(e,n){for(var t,r,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=0,l=[],o=c(this.regex,"g");null!==(t=o.exec(e));)r=t.splice(0,1),t=t.concat(i++,r),n.apply(u,t)&&l.push(r[0]);return l}},{key:"reduce",value:function(e,n,t){var r,u,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,l=0,o=c(this.regex,"g");for(t||null!==(r=o.exec(e))&&(u=r.splice(0,1),t=n.apply(i,[""].concat(r.concat(l++,u))));null!==(r=o.exec(e));)u=r.splice(0,1),t=n.apply(i,[t].concat(r.concat(l++,u)));return t}},{key:"reduceRight",value:function(e,n,t,r){var u,i,l,o=r,a=t,s=[],p=c(this.regex,"g");for(o=o||null;null!==(u=p.exec(e));)s.push(u);if(!(l=s.length)){if(arguments.length<3)throw new TypeError("reduce of empty matches array with no initial value");return a}return a||(u=s.splice(-1)[0],i=u.splice(0,1),a=n.apply(o,[""].concat(u.concat(l--,i)))),s.reduceRight((function(e,t){return i=t.splice(0,1),a=n.apply(o,[a].concat(t.concat(l--,i))),e}),s),a}},{key:"find",value:function(e,n){for(var t,r,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=0,l=c(this.regex,"g");null!==(t=l.exec(e));)if(r=t.splice(0,1),n.apply(u,t.concat(i++,r)))return r[0];return!1}},{key:"findIndex",value:function(e,n){for(var t,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,u=c(this.regex,"g"),i=0;null!==(t=u.exec(e));){var l=t.splice(0,1),o=n.apply(r,t.concat(i++,l));if(o)return i-1}return-1}},{key:"findExec",value:function(e,n){for(var t,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,u=c(this.regex,"g"),i=0;null!==(t=u.exec(e));){var l=t.splice(0,1),o=n.apply(r,t.concat(i++,l));if(o)return t}return!1}},{key:"filterExec",value:function(e,n){for(var t,r,u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=0,l=[],o=c(this.regex,"g");null!==(t=o.exec(e));)r=t.splice(0,1),t.push(i++,r[0]),n.apply(u,t)&&l.push(t);return l}}])&&n(t.prototype,r),u&&n(t,u),e}();var u,i=e.RegExtras;e.RegExtras=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return r(i,n)},e.RegExtras.prototype=i.prototype,e.RegExtras.mixinRegex=c,(u=e.RegExtras).prototype.entries=regeneratorRuntime.mark((function e(n){var t,r,c;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=0,c=u.mixinRegex(this.regex,"g");case 2:if(null===(t=c.exec(n))){e.next=7;break}return e.next=5,[r++,t];case 5:e.next=2;break;case 7:case"end":return e.stop()}}),e,this)})),u.prototype.values=regeneratorRuntime.mark((function e(n){var t,r;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=u.mixinRegex(this.regex,"g");case 1:if(null===(t=r.exec(n))){e.next=6;break}return e.next=4,t;case 4:e.next=1;break;case 6:case"end":return e.stop()}}),e,this)})),u.prototype.keys=regeneratorRuntime.mark((function e(n){var t,r;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t=0,r=u.mixinRegex(this.regex,"g");case 2:if(null===r.exec(n)){e.next=7;break}return e.next=5,t++;case 5:e.next=2;break;case 7:case"end":return e.stop()}}),e,this)})),e.mixinRegex=c,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/node_modules/regextras/dist/main-es.js b/node_modules/regextras/dist/main-es.js
deleted file mode 100644
index c2c05ad..0000000
--- a/node_modules/regextras/dist/main-es.js
+++ /dev/null
@@ -1,344 +0,0 @@
-function _classCallCheck(instance, Constructor) {
-  if (!(instance instanceof Constructor)) {
-    throw new TypeError("Cannot call a class as a function");
-  }
-}
-
-function _defineProperties(target, props) {
-  for (var i = 0; i < props.length; i++) {
-    var descriptor = props[i];
-    descriptor.enumerable = descriptor.enumerable || false;
-    descriptor.configurable = true;
-    if ("value" in descriptor) descriptor.writable = true;
-    Object.defineProperty(target, descriptor.key, descriptor);
-  }
-}
-
-function _createClass(Constructor, protoProps, staticProps) {
-  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
-  if (staticProps) _defineProperties(Constructor, staticProps);
-  return Constructor;
-}
-
-function _setPrototypeOf(o, p) {
-  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
-    o.__proto__ = p;
-    return o;
-  };
-
-  return _setPrototypeOf(o, p);
-}
-
-function isNativeReflectConstruct() {
-  if (typeof Reflect === "undefined" || !Reflect.construct) return false;
-  if (Reflect.construct.sham) return false;
-  if (typeof Proxy === "function") return true;
-
-  try {
-    Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
-    return true;
-  } catch (e) {
-    return false;
-  }
-}
-
-function _construct(Parent, args, Class) {
-  if (isNativeReflectConstruct()) {
-    _construct = Reflect.construct;
-  } else {
-    _construct = function _construct(Parent, args, Class) {
-      var a = [null];
-      a.push.apply(a, args);
-      var Constructor = Function.bind.apply(Parent, a);
-      var instance = new Constructor();
-      if (Class) _setPrototypeOf(instance, Class.prototype);
-      return instance;
-    };
-  }
-
-  return _construct.apply(null, arguments);
-}
-
-/* eslint-disable node/no-unsupported-features/es-syntax */
-
-/**
- * @param {RegExp} regex
- * @param {string} newFlags
- * @param {Integer} [newLastIndex=regex.lastIndex]
- * @returns {RegExp}
- */
-function mixinRegex(regex, newFlags) {
-  var newLastIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : regex.lastIndex;
-  newFlags = newFlags || '';
-  regex = new RegExp(regex.source, (newFlags.includes('g') ? 'g' : regex.global ? 'g' : '') + (newFlags.includes('i') ? 'i' : regex.ignoreCase ? 'i' : '') + (newFlags.includes('m') ? 'm' : regex.multiline ? 'm' : '') + (newFlags.includes('u') ? 'u' : regex.sticky ? 'u' : '') + (newFlags.includes('y') ? 'y' : regex.sticky ? 'y' : ''));
-  regex.lastIndex = newLastIndex;
-  return regex;
-}
-
-var RegExtras =
-/*#__PURE__*/
-function () {
-  function RegExtras(regex, flags, newLastIndex) {
-    _classCallCheck(this, RegExtras);
-
-    this.regex = mixinRegex(typeof regex === 'string' ? new RegExp(regex) : mixinRegex(regex), flags || '', newLastIndex);
-  }
-
-  _createClass(RegExtras, [{
-    key: "forEach",
-    value: function forEach(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var regex = mixinRegex(this.regex, 'g');
-      var matches,
-          n0,
-          i = 0;
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        cb.apply(thisObj, matches.concat(i++, n0));
-      }
-
-      return this;
-    }
-  }, {
-    key: "some",
-    value: function some(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var regex = mixinRegex(this.regex, 'g');
-      var matches,
-          ret,
-          n0,
-          i = 0;
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-        if (ret) {
-          return true;
-        }
-      }
-
-      return false;
-    }
-  }, {
-    key: "every",
-    value: function every(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var regex = mixinRegex(this.regex, 'g');
-      var matches,
-          ret,
-          n0,
-          i = 0;
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-        if (!ret) {
-          return false;
-        }
-      }
-
-      return true;
-    }
-  }, {
-    key: "map",
-    value: function map(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var ret = [];
-      var regex = mixinRegex(this.regex, 'g');
-      var matches,
-          n0,
-          i = 0;
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-      }
-
-      return ret;
-    }
-  }, {
-    key: "filter",
-    value: function filter(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var matches,
-          n0,
-          i = 0;
-      var ret = [],
-          regex = mixinRegex(this.regex, 'g');
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        matches = matches.concat(i++, n0);
-
-        if (cb.apply(thisObj, matches)) {
-          ret.push(n0[0]);
-        }
-      }
-
-      return ret;
-    }
-  }, {
-    key: "reduce",
-    value: function reduce(str, cb, prev) {
-      var thisObj = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
-      var matches,
-          n0,
-          i = 0;
-      var regex = mixinRegex(this.regex, 'g');
-
-      if (!prev) {
-        if ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          prev = cb.apply(thisObj, [''].concat(matches.concat(i++, n0)));
-        }
-      }
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        prev = cb.apply(thisObj, [prev].concat(matches.concat(i++, n0)));
-      }
-
-      return prev;
-    }
-  }, {
-    key: "reduceRight",
-    value: function reduceRight(str, cb, prevOrig, thisObjOrig) {
-      var matches,
-          n0,
-          i,
-          thisObj = thisObjOrig,
-          prev = prevOrig;
-      var matchesContainer = [],
-          regex = mixinRegex(this.regex, 'g');
-      thisObj = thisObj || null;
-
-      while ((matches = regex.exec(str)) !== null) {
-        matchesContainer.push(matches);
-      }
-
-      i = matchesContainer.length;
-
-      if (!i) {
-        if (arguments.length < 3) {
-          throw new TypeError('reduce of empty matches array with no initial value');
-        }
-
-        return prev;
-      }
-
-      if (!prev) {
-        matches = matchesContainer.splice(-1)[0];
-        n0 = matches.splice(0, 1);
-        prev = cb.apply(thisObj, [''].concat(matches.concat(i--, n0)));
-      }
-
-      matchesContainer.reduceRight(function (container, mtches) {
-        n0 = mtches.splice(0, 1);
-        prev = cb.apply(thisObj, [prev].concat(mtches.concat(i--, n0)));
-        return container;
-      }, matchesContainer);
-      return prev;
-    }
-  }, {
-    key: "find",
-    value: function find(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var matches,
-          ret,
-          n0,
-          i = 0;
-      var regex = mixinRegex(this.regex, 'g');
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-        if (ret) {
-          return n0[0];
-        }
-      }
-
-      return false;
-    }
-  }, {
-    key: "findIndex",
-    value: function findIndex(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var regex = mixinRegex(this.regex, 'g');
-      var matches,
-          i = 0;
-
-      while ((matches = regex.exec(str)) !== null) {
-        var n0 = matches.splice(0, 1);
-        var ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-        if (ret) {
-          return i - 1;
-        }
-      }
-
-      return -1;
-    }
-  }, {
-    key: "findExec",
-    value: function findExec(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var regex = mixinRegex(this.regex, 'g');
-      var matches,
-          i = 0;
-
-      while ((matches = regex.exec(str)) !== null) {
-        var n0 = matches.splice(0, 1);
-        var ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-        if (ret) {
-          return matches;
-        }
-      }
-
-      return false;
-    }
-  }, {
-    key: "filterExec",
-    value: function filterExec(str, cb) {
-      var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-      var matches,
-          n0,
-          i = 0;
-      var ret = [],
-          regex = mixinRegex(this.regex, 'g');
-
-      while ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        matches.push(i++, n0[0]);
-
-        if (cb.apply(thisObj, matches)) {
-          ret.push(matches);
-        }
-      }
-
-      return ret;
-    }
-  }]);
-
-  return RegExtras;
-}();
-
-var _RegExtras = RegExtras;
-
-RegExtras = function RegExtras() {
-  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
-    args[_key] = arguments[_key];
-  }
-
-  // eslint-disable-line no-class-assign
-  return _construct(_RegExtras, args);
-};
-
-RegExtras.prototype = _RegExtras.prototype;
-RegExtras.mixinRegex = mixinRegex;
-
-export { RegExtras, mixinRegex };
diff --git a/node_modules/regextras/dist/main-umd.js b/node_modules/regextras/dist/main-umd.js
deleted file mode 100644
index b2962e3..0000000
--- a/node_modules/regextras/dist/main-umd.js
+++ /dev/null
@@ -1,354 +0,0 @@
-(function (global, factory) {
-  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
-  typeof define === 'function' && define.amd ? define(['exports'], factory) :
-  (global = global || self, factory(global.RegExtras = {}));
-}(this, (function (exports) { 'use strict';
-
-  function _classCallCheck(instance, Constructor) {
-    if (!(instance instanceof Constructor)) {
-      throw new TypeError("Cannot call a class as a function");
-    }
-  }
-
-  function _defineProperties(target, props) {
-    for (var i = 0; i < props.length; i++) {
-      var descriptor = props[i];
-      descriptor.enumerable = descriptor.enumerable || false;
-      descriptor.configurable = true;
-      if ("value" in descriptor) descriptor.writable = true;
-      Object.defineProperty(target, descriptor.key, descriptor);
-    }
-  }
-
-  function _createClass(Constructor, protoProps, staticProps) {
-    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
-    if (staticProps) _defineProperties(Constructor, staticProps);
-    return Constructor;
-  }
-
-  function _setPrototypeOf(o, p) {
-    _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
-      o.__proto__ = p;
-      return o;
-    };
-
-    return _setPrototypeOf(o, p);
-  }
-
-  function isNativeReflectConstruct() {
-    if (typeof Reflect === "undefined" || !Reflect.construct) return false;
-    if (Reflect.construct.sham) return false;
-    if (typeof Proxy === "function") return true;
-
-    try {
-      Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
-      return true;
-    } catch (e) {
-      return false;
-    }
-  }
-
-  function _construct(Parent, args, Class) {
-    if (isNativeReflectConstruct()) {
-      _construct = Reflect.construct;
-    } else {
-      _construct = function _construct(Parent, args, Class) {
-        var a = [null];
-        a.push.apply(a, args);
-        var Constructor = Function.bind.apply(Parent, a);
-        var instance = new Constructor();
-        if (Class) _setPrototypeOf(instance, Class.prototype);
-        return instance;
-      };
-    }
-
-    return _construct.apply(null, arguments);
-  }
-
-  /* eslint-disable node/no-unsupported-features/es-syntax */
-
-  /**
-   * @param {RegExp} regex
-   * @param {string} newFlags
-   * @param {Integer} [newLastIndex=regex.lastIndex]
-   * @returns {RegExp}
-   */
-  function mixinRegex(regex, newFlags) {
-    var newLastIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : regex.lastIndex;
-    newFlags = newFlags || '';
-    regex = new RegExp(regex.source, (newFlags.includes('g') ? 'g' : regex.global ? 'g' : '') + (newFlags.includes('i') ? 'i' : regex.ignoreCase ? 'i' : '') + (newFlags.includes('m') ? 'm' : regex.multiline ? 'm' : '') + (newFlags.includes('u') ? 'u' : regex.sticky ? 'u' : '') + (newFlags.includes('y') ? 'y' : regex.sticky ? 'y' : ''));
-    regex.lastIndex = newLastIndex;
-    return regex;
-  }
-
-  exports.RegExtras =
-  /*#__PURE__*/
-  function () {
-    function RegExtras(regex, flags, newLastIndex) {
-      _classCallCheck(this, RegExtras);
-
-      this.regex = mixinRegex(typeof regex === 'string' ? new RegExp(regex) : mixinRegex(regex), flags || '', newLastIndex);
-    }
-
-    _createClass(RegExtras, [{
-      key: "forEach",
-      value: function forEach(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var regex = mixinRegex(this.regex, 'g');
-        var matches,
-            n0,
-            i = 0;
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          cb.apply(thisObj, matches.concat(i++, n0));
-        }
-
-        return this;
-      }
-    }, {
-      key: "some",
-      value: function some(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var regex = mixinRegex(this.regex, 'g');
-        var matches,
-            ret,
-            n0,
-            i = 0;
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-          if (ret) {
-            return true;
-          }
-        }
-
-        return false;
-      }
-    }, {
-      key: "every",
-      value: function every(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var regex = mixinRegex(this.regex, 'g');
-        var matches,
-            ret,
-            n0,
-            i = 0;
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-          if (!ret) {
-            return false;
-          }
-        }
-
-        return true;
-      }
-    }, {
-      key: "map",
-      value: function map(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var ret = [];
-        var regex = mixinRegex(this.regex, 'g');
-        var matches,
-            n0,
-            i = 0;
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-        }
-
-        return ret;
-      }
-    }, {
-      key: "filter",
-      value: function filter(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var matches,
-            n0,
-            i = 0;
-        var ret = [],
-            regex = mixinRegex(this.regex, 'g');
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          matches = matches.concat(i++, n0);
-
-          if (cb.apply(thisObj, matches)) {
-            ret.push(n0[0]);
-          }
-        }
-
-        return ret;
-      }
-    }, {
-      key: "reduce",
-      value: function reduce(str, cb, prev) {
-        var thisObj = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
-        var matches,
-            n0,
-            i = 0;
-        var regex = mixinRegex(this.regex, 'g');
-
-        if (!prev) {
-          if ((matches = regex.exec(str)) !== null) {
-            n0 = matches.splice(0, 1);
-            prev = cb.apply(thisObj, [''].concat(matches.concat(i++, n0)));
-          }
-        }
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          prev = cb.apply(thisObj, [prev].concat(matches.concat(i++, n0)));
-        }
-
-        return prev;
-      }
-    }, {
-      key: "reduceRight",
-      value: function reduceRight(str, cb, prevOrig, thisObjOrig) {
-        var matches,
-            n0,
-            i,
-            thisObj = thisObjOrig,
-            prev = prevOrig;
-        var matchesContainer = [],
-            regex = mixinRegex(this.regex, 'g');
-        thisObj = thisObj || null;
-
-        while ((matches = regex.exec(str)) !== null) {
-          matchesContainer.push(matches);
-        }
-
-        i = matchesContainer.length;
-
-        if (!i) {
-          if (arguments.length < 3) {
-            throw new TypeError('reduce of empty matches array with no initial value');
-          }
-
-          return prev;
-        }
-
-        if (!prev) {
-          matches = matchesContainer.splice(-1)[0];
-          n0 = matches.splice(0, 1);
-          prev = cb.apply(thisObj, [''].concat(matches.concat(i--, n0)));
-        }
-
-        matchesContainer.reduceRight(function (container, mtches) {
-          n0 = mtches.splice(0, 1);
-          prev = cb.apply(thisObj, [prev].concat(mtches.concat(i--, n0)));
-          return container;
-        }, matchesContainer);
-        return prev;
-      }
-    }, {
-      key: "find",
-      value: function find(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var matches,
-            ret,
-            n0,
-            i = 0;
-        var regex = mixinRegex(this.regex, 'g');
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-          if (ret) {
-            return n0[0];
-          }
-        }
-
-        return false;
-      }
-    }, {
-      key: "findIndex",
-      value: function findIndex(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var regex = mixinRegex(this.regex, 'g');
-        var matches,
-            i = 0;
-
-        while ((matches = regex.exec(str)) !== null) {
-          var n0 = matches.splice(0, 1);
-          var ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-          if (ret) {
-            return i - 1;
-          }
-        }
-
-        return -1;
-      }
-    }, {
-      key: "findExec",
-      value: function findExec(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var regex = mixinRegex(this.regex, 'g');
-        var matches,
-            i = 0;
-
-        while ((matches = regex.exec(str)) !== null) {
-          var n0 = matches.splice(0, 1);
-          var ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-          if (ret) {
-            return matches;
-          }
-        }
-
-        return false;
-      }
-    }, {
-      key: "filterExec",
-      value: function filterExec(str, cb) {
-        var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-        var matches,
-            n0,
-            i = 0;
-        var ret = [],
-            regex = mixinRegex(this.regex, 'g');
-
-        while ((matches = regex.exec(str)) !== null) {
-          n0 = matches.splice(0, 1);
-          matches.push(i++, n0[0]);
-
-          if (cb.apply(thisObj, matches)) {
-            ret.push(matches);
-          }
-        }
-
-        return ret;
-      }
-    }]);
-
-    return RegExtras;
-  }();
-
-  var _RegExtras = exports.RegExtras;
-
-  exports.RegExtras = function RegExtras() {
-    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
-      args[_key] = arguments[_key];
-    }
-
-    // eslint-disable-line no-class-assign
-    return _construct(_RegExtras, args);
-  };
-
-  exports.RegExtras.prototype = _RegExtras.prototype;
-  exports.RegExtras.mixinRegex = mixinRegex;
-
-  exports.mixinRegex = mixinRegex;
-
-  Object.defineProperty(exports, '__esModule', { value: true });
-
-})));
diff --git a/node_modules/regextras/dist/prototype-es.js b/node_modules/regextras/dist/prototype-es.js
deleted file mode 100644
index f3b3c7d..0000000
--- a/node_modules/regextras/dist/prototype-es.js
+++ /dev/null
@@ -1,171 +0,0 @@
-/* eslint-disable node/no-unsupported-features/es-syntax */
-
-/**
- * @param {RegExp} regex
- * @param {string} newFlags
- * @param {Integer} [newLastIndex=regex.lastIndex]
- * @returns {RegExp}
- */
-function mixinRegex(regex, newFlags) {
-  var newLastIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : regex.lastIndex;
-  newFlags = newFlags || '';
-  regex = new RegExp(regex.source, (newFlags.includes('g') ? 'g' : regex.global ? 'g' : '') + (newFlags.includes('i') ? 'i' : regex.ignoreCase ? 'i' : '') + (newFlags.includes('m') ? 'm' : regex.multiline ? 'm' : '') + (newFlags.includes('u') ? 'u' : regex.sticky ? 'u' : '') + (newFlags.includes('y') ? 'y' : regex.sticky ? 'y' : ''));
-  regex.lastIndex = newLastIndex;
-  return regex;
-}
-
-/* eslint-disable no-extend-native,
-    no-use-extend-native/no-use-extend-native,
-    node/no-unsupported-features/es-syntax
-*/
-
-RegExp.prototype.forEach = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      n0,
-      i = 0;
-  var regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    cb.apply(thisObj, matches.concat(i++, n0));
-  }
-
-  return this;
-};
-
-RegExp.prototype.some = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      ret,
-      n0,
-      i = 0;
-  var regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-    if (ret) {
-      return true;
-    }
-  }
-
-  return false;
-};
-
-RegExp.prototype.every = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      ret,
-      n0,
-      i = 0;
-  var regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-    if (!ret) {
-      return false;
-    }
-  }
-
-  return true;
-};
-
-RegExp.prototype.map = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      n0,
-      i = 0;
-  var ret = [];
-  var regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-  }
-
-  return ret;
-};
-
-RegExp.prototype.filter = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      n0,
-      i = 0;
-  var ret = [];
-  var regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    matches = matches.concat(i++, n0);
-
-    if (cb.apply(thisObj, matches)) {
-      ret.push(matches[0]);
-    }
-  }
-
-  return ret;
-};
-
-RegExp.prototype.reduce = function (str, cb, prev) {
-  var thisObj = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
-  var matches,
-      n0,
-      i = 0;
-  var regex = mixinRegex(this, 'g');
-
-  if (!prev) {
-    if ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [''].concat(matches.concat(n0, i++)));
-    }
-  }
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    prev = cb.apply(thisObj, [prev].concat(matches.concat(n0, i++)));
-  }
-
-  return prev;
-};
-
-RegExp.prototype.reduceRight = function (str, cb, prevOrig, thisObjOrig) {
-  var matches,
-      n0,
-      i,
-      prev = prevOrig,
-      thisObj = thisObjOrig;
-  var regex = mixinRegex(this, 'g');
-  var matchesContainer = [];
-  thisObj = thisObj || null;
-
-  while ((matches = regex.exec(str)) !== null) {
-    matchesContainer.push(matches);
-  }
-
-  i = matchesContainer.length;
-
-  if (!i) {
-    if (arguments.length < 3) {
-      throw new TypeError('reduce of empty matches array with no initial value');
-    }
-
-    return prev;
-  }
-
-  if (!prev) {
-    matches = matchesContainer.splice(-1)[0];
-    n0 = matches.splice(0, 1);
-    prev = cb.apply(thisObj, [''].concat(matches.concat(n0, i--)));
-  }
-
-  matchesContainer.reduceRight(function (container, mtches) {
-    n0 = mtches.splice(0, 1);
-    prev = cb.apply(thisObj, [prev].concat(mtches.concat(n0, i--)));
-    return container;
-  }, matchesContainer);
-  return prev;
-};
diff --git a/node_modules/regextras/dist/prototype-umd.js b/node_modules/regextras/dist/prototype-umd.js
deleted file mode 100644
index cb3f721..0000000
--- a/node_modules/regextras/dist/prototype-umd.js
+++ /dev/null
@@ -1,178 +0,0 @@
-(function (factory) {
-  typeof define === 'function' && define.amd ? define(factory) :
-  factory();
-}((function () { 'use strict';
-
-  /* eslint-disable node/no-unsupported-features/es-syntax */
-
-  /**
-   * @param {RegExp} regex
-   * @param {string} newFlags
-   * @param {Integer} [newLastIndex=regex.lastIndex]
-   * @returns {RegExp}
-   */
-  function mixinRegex(regex, newFlags) {
-    var newLastIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : regex.lastIndex;
-    newFlags = newFlags || '';
-    regex = new RegExp(regex.source, (newFlags.includes('g') ? 'g' : regex.global ? 'g' : '') + (newFlags.includes('i') ? 'i' : regex.ignoreCase ? 'i' : '') + (newFlags.includes('m') ? 'm' : regex.multiline ? 'm' : '') + (newFlags.includes('u') ? 'u' : regex.sticky ? 'u' : '') + (newFlags.includes('y') ? 'y' : regex.sticky ? 'y' : ''));
-    regex.lastIndex = newLastIndex;
-    return regex;
-  }
-
-  /* eslint-disable no-extend-native,
-      no-use-extend-native/no-use-extend-native,
-      node/no-unsupported-features/es-syntax
-  */
-
-  RegExp.prototype.forEach = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        n0,
-        i = 0;
-    var regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      cb.apply(thisObj, matches.concat(i++, n0));
-    }
-
-    return this;
-  };
-
-  RegExp.prototype.some = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        ret,
-        n0,
-        i = 0;
-    var regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-      if (ret) {
-        return true;
-      }
-    }
-
-    return false;
-  };
-
-  RegExp.prototype.every = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        ret,
-        n0,
-        i = 0;
-    var regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-      if (!ret) {
-        return false;
-      }
-    }
-
-    return true;
-  };
-
-  RegExp.prototype.map = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        n0,
-        i = 0;
-    var ret = [];
-    var regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-    }
-
-    return ret;
-  };
-
-  RegExp.prototype.filter = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        n0,
-        i = 0;
-    var ret = [];
-    var regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      matches = matches.concat(i++, n0);
-
-      if (cb.apply(thisObj, matches)) {
-        ret.push(matches[0]);
-      }
-    }
-
-    return ret;
-  };
-
-  RegExp.prototype.reduce = function (str, cb, prev) {
-    var thisObj = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
-    var matches,
-        n0,
-        i = 0;
-    var regex = mixinRegex(this, 'g');
-
-    if (!prev) {
-      if ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        prev = cb.apply(thisObj, [''].concat(matches.concat(n0, i++)));
-      }
-    }
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [prev].concat(matches.concat(n0, i++)));
-    }
-
-    return prev;
-  };
-
-  RegExp.prototype.reduceRight = function (str, cb, prevOrig, thisObjOrig) {
-    var matches,
-        n0,
-        i,
-        prev = prevOrig,
-        thisObj = thisObjOrig;
-    var regex = mixinRegex(this, 'g');
-    var matchesContainer = [];
-    thisObj = thisObj || null;
-
-    while ((matches = regex.exec(str)) !== null) {
-      matchesContainer.push(matches);
-    }
-
-    i = matchesContainer.length;
-
-    if (!i) {
-      if (arguments.length < 3) {
-        throw new TypeError('reduce of empty matches array with no initial value');
-      }
-
-      return prev;
-    }
-
-    if (!prev) {
-      matches = matchesContainer.splice(-1)[0];
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [''].concat(matches.concat(n0, i--)));
-    }
-
-    matchesContainer.reduceRight(function (container, mtches) {
-      n0 = mtches.splice(0, 1);
-      prev = cb.apply(thisObj, [prev].concat(mtches.concat(n0, i--)));
-      return container;
-    }, matchesContainer);
-    return prev;
-  };
-
-})));
diff --git a/node_modules/regextras/dist/regexp-prototype-es.js b/node_modules/regextras/dist/regexp-prototype-es.js
deleted file mode 100644
index 0c95002..0000000
--- a/node_modules/regextras/dist/regexp-prototype-es.js
+++ /dev/null
@@ -1,250 +0,0 @@
-/* eslint-disable node/no-unsupported-features/es-syntax */
-
-/**
- * @param {RegExp} regex
- * @param {string} newFlags
- * @param {Integer} [newLastIndex=regex.lastIndex]
- * @returns {RegExp}
- */
-function mixinRegex(regex, newFlags) {
-  var newLastIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : regex.lastIndex;
-  newFlags = newFlags || '';
-  regex = new RegExp(regex.source, (newFlags.includes('g') ? 'g' : regex.global ? 'g' : '') + (newFlags.includes('i') ? 'i' : regex.ignoreCase ? 'i' : '') + (newFlags.includes('m') ? 'm' : regex.multiline ? 'm' : '') + (newFlags.includes('u') ? 'u' : regex.sticky ? 'u' : '') + (newFlags.includes('y') ? 'y' : regex.sticky ? 'y' : ''));
-  regex.lastIndex = newLastIndex;
-  return regex;
-}
-
-/* eslint-disable no-extend-native,
-    no-use-extend-native/no-use-extend-native,
-    node/no-unsupported-features/es-syntax */
-
-RegExp.prototype.forEach = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      n0,
-      i = 0;
-  var regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    cb.apply(thisObj, matches.concat(i++, n0));
-  }
-
-  return this;
-};
-
-RegExp.prototype.some = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      ret,
-      n0,
-      i = 0;
-  var regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-    if (ret) {
-      return true;
-    }
-  }
-
-  return false;
-};
-
-RegExp.prototype.every = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      ret,
-      n0,
-      i = 0;
-  var regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-    if (!ret) {
-      return false;
-    }
-  }
-
-  return true;
-};
-
-RegExp.prototype.map = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      n0,
-      i = 0;
-  var ret = [],
-      regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-  }
-
-  return ret;
-};
-
-RegExp.prototype.filter = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      n0,
-      i = 0;
-  var ret = [],
-      regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    matches = matches.concat(i++, n0);
-
-    if (cb.apply(thisObj, matches)) {
-      ret.push(n0[0]);
-    }
-  }
-
-  return ret;
-};
-
-RegExp.prototype.reduce = function (str, cb, prev) {
-  var thisObj = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
-  var matches,
-      n0,
-      i = 0;
-  var regex = mixinRegex(this, 'g');
-
-  if (!prev) {
-    if ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [''].concat(matches.concat(i++, n0)));
-    }
-  }
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    prev = cb.apply(thisObj, [prev].concat(matches.concat(i++, n0)));
-  }
-
-  return prev;
-};
-
-RegExp.prototype.reduceRight = function (str, cb, prevOrig, thisObjOrig) {
-  var matches,
-      n0,
-      i,
-      prev = prevOrig,
-      thisObj = thisObjOrig;
-  var matchesContainer = [],
-      regex = mixinRegex(this, 'g');
-  thisObj = thisObj || null;
-
-  while ((matches = regex.exec(str)) !== null) {
-    matchesContainer.push(matches);
-  }
-
-  i = matchesContainer.length;
-
-  if (!i) {
-    if (arguments.length < 3) {
-      throw new TypeError('reduce of empty matches array with no initial value');
-    }
-
-    return prev;
-  }
-
-  if (!prev) {
-    matches = matchesContainer.splice(-1)[0];
-    n0 = matches.splice(0, 1);
-    prev = cb.apply(thisObj, [''].concat(matches.concat(i--, n0)));
-  }
-
-  matchesContainer.reduceRight(function (container, mtches) {
-    n0 = mtches.splice(0, 1);
-    prev = cb.apply(thisObj, [prev].concat(mtches.concat(i--, n0)));
-    return container;
-  }, matchesContainer);
-  return prev;
-};
-
-RegExp.prototype.find = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      ret,
-      n0,
-      i = 0;
-  var regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-    if (ret) {
-      return n0[0];
-    }
-  }
-
-  return false;
-};
-
-RegExp.prototype.findIndex = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      ret,
-      n0,
-      i = 0;
-  var regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-    if (ret) {
-      return i - 1;
-    }
-  }
-
-  return -1;
-};
-
-RegExp.prototype.findExec = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      ret,
-      n0,
-      i = 0;
-  var regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-    if (ret) {
-      return matches;
-    }
-  }
-
-  return false;
-};
-
-RegExp.prototype.filterExec = function (str, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      n0,
-      i = 0;
-  var ret = [],
-      regex = mixinRegex(this, 'g');
-
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    matches.push(i++, n0[0]);
-
-    if (cb.apply(thisObj, matches)) {
-      ret.push(matches);
-    }
-  }
-
-  return ret;
-};
diff --git a/node_modules/regextras/dist/regexp-prototype-umd.js b/node_modules/regextras/dist/regexp-prototype-umd.js
deleted file mode 100644
index 6e6ace9..0000000
--- a/node_modules/regextras/dist/regexp-prototype-umd.js
+++ /dev/null
@@ -1,257 +0,0 @@
-(function (factory) {
-  typeof define === 'function' && define.amd ? define(factory) :
-  factory();
-}((function () { 'use strict';
-
-  /* eslint-disable node/no-unsupported-features/es-syntax */
-
-  /**
-   * @param {RegExp} regex
-   * @param {string} newFlags
-   * @param {Integer} [newLastIndex=regex.lastIndex]
-   * @returns {RegExp}
-   */
-  function mixinRegex(regex, newFlags) {
-    var newLastIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : regex.lastIndex;
-    newFlags = newFlags || '';
-    regex = new RegExp(regex.source, (newFlags.includes('g') ? 'g' : regex.global ? 'g' : '') + (newFlags.includes('i') ? 'i' : regex.ignoreCase ? 'i' : '') + (newFlags.includes('m') ? 'm' : regex.multiline ? 'm' : '') + (newFlags.includes('u') ? 'u' : regex.sticky ? 'u' : '') + (newFlags.includes('y') ? 'y' : regex.sticky ? 'y' : ''));
-    regex.lastIndex = newLastIndex;
-    return regex;
-  }
-
-  /* eslint-disable no-extend-native,
-      no-use-extend-native/no-use-extend-native,
-      node/no-unsupported-features/es-syntax */
-
-  RegExp.prototype.forEach = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        n0,
-        i = 0;
-    var regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      cb.apply(thisObj, matches.concat(i++, n0));
-    }
-
-    return this;
-  };
-
-  RegExp.prototype.some = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        ret,
-        n0,
-        i = 0;
-    var regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-      if (ret) {
-        return true;
-      }
-    }
-
-    return false;
-  };
-
-  RegExp.prototype.every = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        ret,
-        n0,
-        i = 0;
-    var regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-      if (!ret) {
-        return false;
-      }
-    }
-
-    return true;
-  };
-
-  RegExp.prototype.map = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        n0,
-        i = 0;
-    var ret = [],
-        regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-    }
-
-    return ret;
-  };
-
-  RegExp.prototype.filter = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        n0,
-        i = 0;
-    var ret = [],
-        regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      matches = matches.concat(i++, n0);
-
-      if (cb.apply(thisObj, matches)) {
-        ret.push(n0[0]);
-      }
-    }
-
-    return ret;
-  };
-
-  RegExp.prototype.reduce = function (str, cb, prev) {
-    var thisObj = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
-    var matches,
-        n0,
-        i = 0;
-    var regex = mixinRegex(this, 'g');
-
-    if (!prev) {
-      if ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        prev = cb.apply(thisObj, [''].concat(matches.concat(i++, n0)));
-      }
-    }
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [prev].concat(matches.concat(i++, n0)));
-    }
-
-    return prev;
-  };
-
-  RegExp.prototype.reduceRight = function (str, cb, prevOrig, thisObjOrig) {
-    var matches,
-        n0,
-        i,
-        prev = prevOrig,
-        thisObj = thisObjOrig;
-    var matchesContainer = [],
-        regex = mixinRegex(this, 'g');
-    thisObj = thisObj || null;
-
-    while ((matches = regex.exec(str)) !== null) {
-      matchesContainer.push(matches);
-    }
-
-    i = matchesContainer.length;
-
-    if (!i) {
-      if (arguments.length < 3) {
-        throw new TypeError('reduce of empty matches array with no initial value');
-      }
-
-      return prev;
-    }
-
-    if (!prev) {
-      matches = matchesContainer.splice(-1)[0];
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [''].concat(matches.concat(i--, n0)));
-    }
-
-    matchesContainer.reduceRight(function (container, mtches) {
-      n0 = mtches.splice(0, 1);
-      prev = cb.apply(thisObj, [prev].concat(mtches.concat(i--, n0)));
-      return container;
-    }, matchesContainer);
-    return prev;
-  };
-
-  RegExp.prototype.find = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        ret,
-        n0,
-        i = 0;
-    var regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-      if (ret) {
-        return n0[0];
-      }
-    }
-
-    return false;
-  };
-
-  RegExp.prototype.findIndex = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        ret,
-        n0,
-        i = 0;
-    var regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-      if (ret) {
-        return i - 1;
-      }
-    }
-
-    return -1;
-  };
-
-  RegExp.prototype.findExec = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        ret,
-        n0,
-        i = 0;
-    var regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-      if (ret) {
-        return matches;
-      }
-    }
-
-    return false;
-  };
-
-  RegExp.prototype.filterExec = function (str, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        n0,
-        i = 0;
-    var ret = [],
-        regex = mixinRegex(this, 'g');
-
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      matches.push(i++, n0[0]);
-
-      if (cb.apply(thisObj, matches)) {
-        ret.push(matches);
-      }
-    }
-
-    return ret;
-  };
-
-})));
diff --git a/node_modules/regextras/dist/string-prototype-es.js b/node_modules/regextras/dist/string-prototype-es.js
deleted file mode 100644
index 778420c..0000000
--- a/node_modules/regextras/dist/string-prototype-es.js
+++ /dev/null
@@ -1,248 +0,0 @@
-/* eslint-disable node/no-unsupported-features/es-syntax */
-
-/**
- * @param {RegExp} regex
- * @param {string} newFlags
- * @param {Integer} [newLastIndex=regex.lastIndex]
- * @returns {RegExp}
- */
-function mixinRegex(regex, newFlags) {
-  var newLastIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : regex.lastIndex;
-  newFlags = newFlags || '';
-  regex = new RegExp(regex.source, (newFlags.includes('g') ? 'g' : regex.global ? 'g' : '') + (newFlags.includes('i') ? 'i' : regex.ignoreCase ? 'i' : '') + (newFlags.includes('m') ? 'm' : regex.multiline ? 'm' : '') + (newFlags.includes('u') ? 'u' : regex.sticky ? 'u' : '') + (newFlags.includes('y') ? 'y' : regex.sticky ? 'y' : ''));
-  regex.lastIndex = newLastIndex;
-  return regex;
-}
-
-// We copy the regular expression so as to be able to always ensure the exec
-
-String.prototype.forEach = function (regex, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      n0,
-      i = 0;
-  regex = mixinRegex(regex, 'g');
-
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    cb.apply(thisObj, matches.concat(i++, n0));
-  }
-
-  return this;
-};
-
-String.prototype.some = function (regex, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      ret,
-      n0,
-      i = 0;
-  regex = mixinRegex(regex, 'g');
-
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-    if (ret) {
-      return true;
-    }
-  }
-
-  return false;
-};
-
-String.prototype.every = function (regex, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      ret,
-      n0,
-      i = 0;
-  regex = mixinRegex(regex, 'g');
-
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-    if (!ret) {
-      return false;
-    }
-  }
-
-  return true;
-};
-
-String.prototype.map = function (regex, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      n0,
-      i = 0;
-  var ret = [];
-  regex = mixinRegex(regex, 'g');
-
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-  }
-
-  return ret;
-};
-
-String.prototype.filter = function (regex, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      n0,
-      i = 0;
-  var ret = [];
-  regex = mixinRegex(regex, 'g');
-
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    matches = matches.concat(i++, n0);
-
-    if (cb.apply(thisObj, matches)) {
-      ret.push(n0[0]);
-    }
-  }
-
-  return ret;
-};
-
-String.prototype.reduce = function (regex, cb, prev) {
-  var thisObj = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
-  var matches,
-      n0,
-      i = 0;
-  regex = mixinRegex(regex, 'g');
-
-  if (!prev) {
-    if ((matches = regex.exec(this)) !== null) {
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [''].concat(matches.concat(i++, n0)));
-    }
-  }
-
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    prev = cb.apply(thisObj, [prev].concat(matches.concat(i++, n0)));
-  }
-
-  return prev;
-};
-
-String.prototype.reduceRight = function (regex, cb, prevOrig, thisObjOrig) {
-  var matches,
-      n0,
-      i,
-      prev = prevOrig,
-      thisObj = thisObjOrig;
-  var matchesContainer = [];
-  regex = mixinRegex(regex, 'g');
-  thisObj = thisObj || null;
-
-  while ((matches = regex.exec(this)) !== null) {
-    matchesContainer.push(matches);
-  }
-
-  i = matchesContainer.length;
-
-  if (!i) {
-    if (arguments.length < 3) {
-      throw new TypeError('reduce of empty matches array with no initial value');
-    }
-
-    return prev;
-  }
-
-  if (!prev) {
-    matches = matchesContainer.splice(-1)[0];
-    n0 = matches.splice(0, 1);
-    prev = cb.apply(thisObj, [''].concat(matches.concat(i--, n0)));
-  }
-
-  matchesContainer.reduceRight(function (container, mtches) {
-    n0 = mtches.splice(0, 1);
-    prev = cb.apply(thisObj, [prev].concat(mtches.concat(i--, n0)));
-    return container;
-  }, matchesContainer);
-  return prev;
-};
-
-String.prototype.find = function (regex, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      ret,
-      n0,
-      i = 0;
-  regex = mixinRegex(regex, 'g');
-
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-    if (ret) {
-      return n0[0];
-    }
-  }
-
-  return false;
-};
-
-String.prototype.findIndex = function (regex, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      ret,
-      n0,
-      i = 0;
-  regex = mixinRegex(regex, 'g');
-
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-    if (ret) {
-      return i - 1;
-    }
-  }
-
-  return -1;
-};
-
-String.prototype.findExec = function (regex, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      ret,
-      n0,
-      i = 0;
-  regex = mixinRegex(regex, 'g');
-
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-    if (ret) {
-      return matches;
-    }
-  }
-
-  return false;
-};
-
-String.prototype.filterExec = function (regex, cb) {
-  var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-  var matches,
-      n0,
-      i = 0;
-  var ret = [];
-  regex = mixinRegex(regex, 'g');
-
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    matches.push(i++, n0[0]);
-
-    if (cb.apply(thisObj, matches)) {
-      ret.push(matches);
-    }
-  }
-
-  return ret;
-};
diff --git a/node_modules/regextras/dist/string-prototype-umd.js b/node_modules/regextras/dist/string-prototype-umd.js
deleted file mode 100644
index 8845c2d..0000000
--- a/node_modules/regextras/dist/string-prototype-umd.js
+++ /dev/null
@@ -1,255 +0,0 @@
-(function (factory) {
-  typeof define === 'function' && define.amd ? define(factory) :
-  factory();
-}((function () { 'use strict';
-
-  /* eslint-disable node/no-unsupported-features/es-syntax */
-
-  /**
-   * @param {RegExp} regex
-   * @param {string} newFlags
-   * @param {Integer} [newLastIndex=regex.lastIndex]
-   * @returns {RegExp}
-   */
-  function mixinRegex(regex, newFlags) {
-    var newLastIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : regex.lastIndex;
-    newFlags = newFlags || '';
-    regex = new RegExp(regex.source, (newFlags.includes('g') ? 'g' : regex.global ? 'g' : '') + (newFlags.includes('i') ? 'i' : regex.ignoreCase ? 'i' : '') + (newFlags.includes('m') ? 'm' : regex.multiline ? 'm' : '') + (newFlags.includes('u') ? 'u' : regex.sticky ? 'u' : '') + (newFlags.includes('y') ? 'y' : regex.sticky ? 'y' : ''));
-    regex.lastIndex = newLastIndex;
-    return regex;
-  }
-
-  // We copy the regular expression so as to be able to always ensure the exec
-
-  String.prototype.forEach = function (regex, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        n0,
-        i = 0;
-    regex = mixinRegex(regex, 'g');
-
-    while ((matches = regex.exec(this)) !== null) {
-      n0 = matches.splice(0, 1);
-      cb.apply(thisObj, matches.concat(i++, n0));
-    }
-
-    return this;
-  };
-
-  String.prototype.some = function (regex, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        ret,
-        n0,
-        i = 0;
-    regex = mixinRegex(regex, 'g');
-
-    while ((matches = regex.exec(this)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-      if (ret) {
-        return true;
-      }
-    }
-
-    return false;
-  };
-
-  String.prototype.every = function (regex, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        ret,
-        n0,
-        i = 0;
-    regex = mixinRegex(regex, 'g');
-
-    while ((matches = regex.exec(this)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-      if (!ret) {
-        return false;
-      }
-    }
-
-    return true;
-  };
-
-  String.prototype.map = function (regex, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        n0,
-        i = 0;
-    var ret = [];
-    regex = mixinRegex(regex, 'g');
-
-    while ((matches = regex.exec(this)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-    }
-
-    return ret;
-  };
-
-  String.prototype.filter = function (regex, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        n0,
-        i = 0;
-    var ret = [];
-    regex = mixinRegex(regex, 'g');
-
-    while ((matches = regex.exec(this)) !== null) {
-      n0 = matches.splice(0, 1);
-      matches = matches.concat(i++, n0);
-
-      if (cb.apply(thisObj, matches)) {
-        ret.push(n0[0]);
-      }
-    }
-
-    return ret;
-  };
-
-  String.prototype.reduce = function (regex, cb, prev) {
-    var thisObj = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
-    var matches,
-        n0,
-        i = 0;
-    regex = mixinRegex(regex, 'g');
-
-    if (!prev) {
-      if ((matches = regex.exec(this)) !== null) {
-        n0 = matches.splice(0, 1);
-        prev = cb.apply(thisObj, [''].concat(matches.concat(i++, n0)));
-      }
-    }
-
-    while ((matches = regex.exec(this)) !== null) {
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [prev].concat(matches.concat(i++, n0)));
-    }
-
-    return prev;
-  };
-
-  String.prototype.reduceRight = function (regex, cb, prevOrig, thisObjOrig) {
-    var matches,
-        n0,
-        i,
-        prev = prevOrig,
-        thisObj = thisObjOrig;
-    var matchesContainer = [];
-    regex = mixinRegex(regex, 'g');
-    thisObj = thisObj || null;
-
-    while ((matches = regex.exec(this)) !== null) {
-      matchesContainer.push(matches);
-    }
-
-    i = matchesContainer.length;
-
-    if (!i) {
-      if (arguments.length < 3) {
-        throw new TypeError('reduce of empty matches array with no initial value');
-      }
-
-      return prev;
-    }
-
-    if (!prev) {
-      matches = matchesContainer.splice(-1)[0];
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [''].concat(matches.concat(i--, n0)));
-    }
-
-    matchesContainer.reduceRight(function (container, mtches) {
-      n0 = mtches.splice(0, 1);
-      prev = cb.apply(thisObj, [prev].concat(mtches.concat(i--, n0)));
-      return container;
-    }, matchesContainer);
-    return prev;
-  };
-
-  String.prototype.find = function (regex, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        ret,
-        n0,
-        i = 0;
-    regex = mixinRegex(regex, 'g');
-
-    while ((matches = regex.exec(this)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-      if (ret) {
-        return n0[0];
-      }
-    }
-
-    return false;
-  };
-
-  String.prototype.findIndex = function (regex, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        ret,
-        n0,
-        i = 0;
-    regex = mixinRegex(regex, 'g');
-
-    while ((matches = regex.exec(this)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-      if (ret) {
-        return i - 1;
-      }
-    }
-
-    return -1;
-  };
-
-  String.prototype.findExec = function (regex, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        ret,
-        n0,
-        i = 0;
-    regex = mixinRegex(regex, 'g');
-
-    while ((matches = regex.exec(this)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-
-      if (ret) {
-        return matches;
-      }
-    }
-
-    return false;
-  };
-
-  String.prototype.filterExec = function (regex, cb) {
-    var thisObj = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
-    var matches,
-        n0,
-        i = 0;
-    var ret = [];
-    regex = mixinRegex(regex, 'g');
-
-    while ((matches = regex.exec(this)) !== null) {
-      n0 = matches.splice(0, 1);
-      matches.push(i++, n0[0]);
-
-      if (cb.apply(thisObj, matches)) {
-        ret.push(matches);
-      }
-    }
-
-    return ret;
-  };
-
-})));
diff --git a/node_modules/regextras/lgtm.yml b/node_modules/regextras/lgtm.yml
deleted file mode 100644
index bb188ba..0000000
--- a/node_modules/regextras/lgtm.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-extraction:
-  javascript:
-    index:
-      filters:
-        - exclude: "dist"
diff --git a/node_modules/regextras/package.json b/node_modules/regextras/package.json
deleted file mode 100644
index 1a76f27..0000000
--- a/node_modules/regextras/package.json
+++ /dev/null
@@ -1,86 +0,0 @@
-{
-  "name": "regextras",
-  "version": "0.7.0",
-  "license": "MIT",
-  "author": "Brett Zamir",
-  "contributors": [],
-  "repository": "https://github.com/brettz9/regextras",
-  "homepage": "https://github.com/brettz9/regextras",
-  "bugs": "https://github.com/brettz9/regextras/issues",
-  "scripts": {
-    "eslint": "eslint --ext=js,md,html .",
-    "rollup": "rollup -c",
-    "start": "static -p 8081",
-    "coverage": "open-cli http://localhost:8081/coverage && npm start",
-    "mocha": "mocha --require esm --require test/node-env.js test/test.*.js --exit",
-    "mocha-cov": "nyc npm run mocha",
-    "test-cov": "npm run eslint && npm run rollup && npm run mocha-cov",
-    "test": "npm run eslint && npm run rollup && npm run mocha",
-    "test-browser": "npm run eslint && npm run rollup && open-cli http://127.0.0.1:8081/tests/regextras.html && npm start"
-  },
-  "nyc": {
-    "reporter": [
-      "html",
-      "text"
-    ],
-    "exclude": [
-      ".eslintrc.js",
-      "rollup.config.js",
-      "dist",
-      "node_modules",
-      "test",
-      "tests"
-    ]
-  },
-  "browserslist": [
-    "cover 100%"
-  ],
-  "main": "dist/index-umd.js",
-  "module": "dist/index-es.js",
-  "keywords": [
-    "regex",
-    "regexp",
-    "regular expression"
-  ],
-  "description": "Array extras for regular expressions",
-  "engines": {
-    "node": ">=0.1.14"
-  },
-  "dependencies": {},
-  "devDependencies": {
-    "@babel/core": "^7.7.5",
-    "@babel/preset-env": "^7.7.6",
-    "@mysticatea/eslint-plugin": "^13.0.0",
-    "chai": "^4.2.0",
-    "core-js-bundle": "^3.5.0",
-    "eslint": "^6.7.2",
-    "eslint-config-ash-nazg": "^13.1.0",
-    "eslint-config-standard": "^14.1.0",
-    "eslint-plugin-array-func": "^3.1.3",
-    "eslint-plugin-chai-expect": "^2.1.0",
-    "eslint-plugin-chai-friendly": "^0.5.0",
-    "eslint-plugin-compat": "^3.3.0",
-    "eslint-plugin-eslint-comments": "^3.1.2",
-    "eslint-plugin-html": "^6.0.0",
-    "eslint-plugin-import": "^2.19.1",
-    "eslint-plugin-jsdoc": "^18.4.3",
-    "eslint-plugin-markdown": "^1.0.1",
-    "eslint-plugin-no-use-extend-native": "^0.4.1",
-    "eslint-plugin-node": "^10.0.0",
-    "eslint-plugin-promise": "^4.2.1",
-    "eslint-plugin-sonarjs": "^0.5.0",
-    "eslint-plugin-standard": "^4.0.1",
-    "eslint-plugin-unicorn": "^14.0.1",
-    "esm": "^3.2.25",
-    "mocha": "^6.2.2",
-    "node-static": "^0.7.11",
-    "nyc": "^14.1.1",
-    "open-cli": "^5.0.0",
-    "regenerator-runtime": "^0.13.3",
-    "remark-lint": "6.0.5",
-    "rollup": "1.27.13",
-    "rollup-plugin-babel": "^4.3.3",
-    "rollup-plugin-terser": "^5.1.3",
-    "typescript": "^3.7.3"
-  }
-}
diff --git a/node_modules/regextras/src/index-generators.js b/node_modules/regextras/src/index-generators.js
deleted file mode 100644
index 3dbf164..0000000
--- a/node_modules/regextras/src/index-generators.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/* eslint-disable node/no-unsupported-features/es-syntax */
-// We copy the regular expression so as to be able to always
-// ensure the exec expression is a global one (and thereby prevent recursion)
-
-/**
- *
- * @param {RegExtras} RegExtras
- * @returns {void}
- */
-function addPrototypeMethods (RegExtras) {
-  RegExtras.prototype.entries = function * (str) {
-    let matches, i = 0;
-    const regex = RegExtras.mixinRegex(this.regex, 'g');
-    while ((matches = regex.exec(str)) !== null) {
-      yield [i++, matches];
-    }
-  };
-
-  RegExtras.prototype.values = function * (str) {
-    let matches;
-    const regex = RegExtras.mixinRegex(this.regex, 'g');
-    while ((matches = regex.exec(str)) !== null) {
-      yield matches;
-    }
-  };
-
-  RegExtras.prototype.keys = function * (str) {
-    let i = 0;
-    const regex = RegExtras.mixinRegex(this.regex, 'g');
-    while (regex.exec(str) !== null) {
-      yield i++;
-    }
-  };
-}
-
-export default addPrototypeMethods;
diff --git a/node_modules/regextras/src/index.js b/node_modules/regextras/src/index.js
deleted file mode 100644
index d5fd294..0000000
--- a/node_modules/regextras/src/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import {mixinRegex, RegExtras} from './main.js';
-import addGenerators from './index-generators.js';
-
-addGenerators(RegExtras);
-
-export {mixinRegex, RegExtras};
diff --git a/node_modules/regextras/src/main.js b/node_modules/regextras/src/main.js
deleted file mode 100644
index 1c1c966..0000000
--- a/node_modules/regextras/src/main.js
+++ /dev/null
@@ -1,185 +0,0 @@
-/* eslint-disable node/no-unsupported-features/es-syntax */
-
-// We copy the regular expression so as to be able to always ensure the
-//   exec expression is a global one (and thereby prevent recursion)
-
-import mixinRegex from './mixinRegex.js';
-
-class RegExtras {
-  constructor (regex, flags, newLastIndex) {
-    this.regex = mixinRegex(
-      (typeof regex === 'string' ? new RegExp(regex) : mixinRegex(regex)),
-      flags || '',
-      newLastIndex
-    );
-  }
-
-  forEach (str, cb, thisObj = null) {
-    const regex = mixinRegex(this.regex, 'g');
-
-    let matches, n0, i = 0;
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      cb.apply(thisObj, matches.concat(i++, n0));
-    }
-    return this;
-  }
-
-  some (str, cb, thisObj = null) {
-    const regex = mixinRegex(this.regex, 'g');
-    let matches, ret, n0, i = 0;
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-      if (ret) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  every (str, cb, thisObj = null) {
-    const regex = mixinRegex(this.regex, 'g');
-    let matches, ret, n0, i = 0;
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-      if (!ret) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  map (str, cb, thisObj = null) {
-    const ret = [];
-    const regex = mixinRegex(this.regex, 'g');
-    let matches, n0, i = 0;
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-    }
-    return ret;
-  }
-
-  filter (str, cb, thisObj = null) {
-    let matches, n0, i = 0;
-    const ret = [], regex = mixinRegex(this.regex, 'g');
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      matches = matches.concat(i++, n0);
-      if (cb.apply(thisObj, matches)) {
-        ret.push(n0[0]);
-      }
-    }
-    return ret;
-  }
-
-  reduce (str, cb, prev, thisObj = null) {
-    let matches, n0, i = 0;
-    const regex = mixinRegex(this.regex, 'g');
-    if (!prev) {
-      if ((matches = regex.exec(str)) !== null) {
-        n0 = matches.splice(0, 1);
-        prev = cb.apply(thisObj, [''].concat(matches.concat(i++, n0)));
-      }
-    }
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [prev].concat(matches.concat(i++, n0)));
-    }
-    return prev;
-  }
-
-  reduceRight (str, cb, prevOrig, thisObjOrig) {
-    let matches, n0, i, thisObj = thisObjOrig, prev = prevOrig;
-    const matchesContainer = [],
-      regex = mixinRegex(this.regex, 'g');
-    thisObj = thisObj || null;
-    while ((matches = regex.exec(str)) !== null) {
-      matchesContainer.push(matches);
-    }
-    i = matchesContainer.length;
-    if (!i) {
-      if (arguments.length < 3) {
-        throw new TypeError(
-          'reduce of empty matches array with no initial value'
-        );
-      }
-      return prev;
-    }
-    if (!prev) {
-      matches = matchesContainer.splice(-1)[0];
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [''].concat(matches.concat(i--, n0)));
-    }
-    matchesContainer.reduceRight((container, mtches) => {
-      n0 = mtches.splice(0, 1);
-      prev = cb.apply(thisObj, [prev].concat(mtches.concat(i--, n0)));
-      return container;
-    }, matchesContainer);
-    return prev;
-  }
-
-  find (str, cb, thisObj = null) {
-    let matches, ret, n0, i = 0;
-    const regex = mixinRegex(this.regex, 'g');
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      ret = cb.apply(thisObj, matches.concat(i++, n0));
-      if (ret) {
-        return n0[0];
-      }
-    }
-    return false;
-  }
-
-  findIndex (str, cb, thisObj = null) {
-    const regex = mixinRegex(this.regex, 'g');
-    let matches, i = 0;
-    while ((matches = regex.exec(str)) !== null) {
-      const n0 = matches.splice(0, 1);
-      const ret = cb.apply(thisObj, matches.concat(i++, n0));
-      if (ret) {
-        return i - 1;
-      }
-    }
-    return -1;
-  }
-
-  findExec (str, cb, thisObj = null) {
-    const regex = mixinRegex(this.regex, 'g');
-    let matches, i = 0;
-    while ((matches = regex.exec(str)) !== null) {
-      const n0 = matches.splice(0, 1);
-      const ret = cb.apply(thisObj, matches.concat(i++, n0));
-      if (ret) {
-        return matches;
-      }
-    }
-    return false;
-  }
-
-  filterExec (str, cb, thisObj = null) {
-    let matches, n0, i = 0;
-    const ret = [], regex = mixinRegex(this.regex, 'g');
-    while ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      matches.push(i++, n0[0]);
-      if (cb.apply(thisObj, matches)) {
-        ret.push(matches);
-      }
-    }
-    return ret;
-  }
-}
-
-const _RegExtras = RegExtras;
-RegExtras = function (...args) { // eslint-disable-line no-class-assign
-  return new _RegExtras(...args);
-};
-RegExtras.prototype = _RegExtras.prototype;
-
-RegExtras.mixinRegex = mixinRegex;
-
-export {mixinRegex, RegExtras};
diff --git a/node_modules/regextras/src/mixinRegex.js b/node_modules/regextras/src/mixinRegex.js
deleted file mode 100644
index 9618b0d..0000000
--- a/node_modules/regextras/src/mixinRegex.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/* eslint-disable node/no-unsupported-features/es-syntax */
-
-/**
- * @param {RegExp} regex
- * @param {string} newFlags
- * @param {Integer} [newLastIndex=regex.lastIndex]
- * @returns {RegExp}
- */
-export default function mixinRegex (
-  regex, newFlags, newLastIndex = regex.lastIndex
-) {
-  newFlags = newFlags || '';
-  regex = new RegExp(
-    regex.source,
-    (newFlags.includes('g') ? 'g' : regex.global ? 'g' : '') +
-            (newFlags.includes('i') ? 'i' : regex.ignoreCase ? 'i' : '') +
-            (newFlags.includes('m') ? 'm' : regex.multiline ? 'm' : '') +
-            (newFlags.includes('u') ? 'u' : regex.unicode ? 'u' : '') +
-            (newFlags.includes('y') ? 'y' : regex.sticky ? 'y' : '') +
-            (newFlags.includes('s') ? 's' : regex.dotAll ? 's' : '')
-  );
-  regex.lastIndex = newLastIndex;
-  return regex;
-}
diff --git a/node_modules/regextras/src/prototype.js b/node_modules/regextras/src/prototype.js
deleted file mode 100644
index 617d995..0000000
--- a/node_modules/regextras/src/prototype.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/* eslint-disable no-extend-native,
-    no-use-extend-native/no-use-extend-native,
-    node/no-unsupported-features/es-syntax */
-
-// We copy the regular expression so as to be able to always ensure the
-//   exec expression is a global one (and thereby prevent recursion)
-
-import mixinRegex from './mixinRegex.js';
-
-RegExp.prototype.forEach = function (str, cb, thisObj = null) {
-  let matches, n0, i = 0;
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    cb.apply(thisObj, matches.concat(i++, n0));
-  }
-  return this;
-};
-
-RegExp.prototype.some = function (str, cb, thisObj = null) {
-  let matches, ret, n0, i = 0;
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-    if (ret) {
-      return true;
-    }
-  }
-  return false;
-};
-
-RegExp.prototype.every = function (str, cb, thisObj = null) {
-  let matches, ret, n0, i = 0;
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-    if (!ret) {
-      return false;
-    }
-  }
-  return true;
-};
-
-RegExp.prototype.map = function (str, cb, thisObj = null) {
-  let matches, n0, i = 0;
-  const ret = [];
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-  }
-  return ret;
-};
-
-RegExp.prototype.filter = function (str, cb, thisObj = null) {
-  let matches, n0, i = 0;
-  const ret = [];
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    matches = matches.concat(i++, n0);
-    if (cb.apply(thisObj, matches)) {
-      ret.push(matches[0]);
-    }
-  }
-  return ret;
-};
-
-RegExp.prototype.reduce = function (str, cb, prev, thisObj = null) {
-  let matches, n0, i = 0;
-  const regex = mixinRegex(this, 'g');
-  if (!prev) {
-    if ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [''].concat(matches.concat(n0, i++)));
-    }
-  }
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    prev = cb.apply(thisObj, [prev].concat(matches.concat(n0, i++)));
-  }
-  return prev;
-};
-
-RegExp.prototype.reduceRight = function (str, cb, prevOrig, thisObjOrig) {
-  let matches, n0, i,
-    prev = prevOrig, thisObj = thisObjOrig;
-  const regex = mixinRegex(this, 'g');
-  const matchesContainer = [];
-  thisObj = thisObj || null;
-  while ((matches = regex.exec(str)) !== null) {
-    matchesContainer.push(matches);
-  }
-  i = matchesContainer.length;
-  if (!i) {
-    if (arguments.length < 3) {
-      throw new TypeError(
-        'reduce of empty matches array with no initial value'
-      );
-    }
-    return prev;
-  }
-  if (!prev) {
-    matches = matchesContainer.splice(-1)[0];
-    n0 = matches.splice(0, 1);
-    prev = cb.apply(thisObj, [''].concat(matches.concat(n0, i--)));
-  }
-  matchesContainer.reduceRight(function (container, mtches) {
-    n0 = mtches.splice(0, 1);
-    prev = cb.apply(thisObj, [prev].concat(mtches.concat(n0, i--)));
-    return container;
-  }, matchesContainer);
-  return prev;
-};
diff --git a/node_modules/regextras/src/regexp-prototype.js b/node_modules/regextras/src/regexp-prototype.js
deleted file mode 100644
index 764bb67..0000000
--- a/node_modules/regextras/src/regexp-prototype.js
+++ /dev/null
@@ -1,168 +0,0 @@
-/* eslint-disable no-extend-native,
-    no-use-extend-native/no-use-extend-native,
-    node/no-unsupported-features/es-syntax */
-
-// We copy the regular expression so as to be able to always ensure the
-//   exec expression is a global one (and thereby prevent recursion)
-
-import mixinRegex from './mixinRegex.js';
-
-RegExp.prototype.forEach = function (str, cb, thisObj = null) {
-  let matches, n0, i = 0;
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    cb.apply(thisObj, matches.concat(i++, n0));
-  }
-  return this;
-};
-
-RegExp.prototype.some = function (str, cb, thisObj = null) {
-  let matches, ret, n0, i = 0;
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-    if (ret) {
-      return true;
-    }
-  }
-  return false;
-};
-
-RegExp.prototype.every = function (str, cb, thisObj = null) {
-  let matches, ret, n0, i = 0;
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-    if (!ret) {
-      return false;
-    }
-  }
-  return true;
-};
-
-RegExp.prototype.map = function (str, cb, thisObj = null) {
-  let matches, n0, i = 0;
-  const ret = [];
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-  }
-  return ret;
-};
-
-RegExp.prototype.filter = function (str, cb, thisObj = null) {
-  let matches, n0, i = 0;
-  const ret = [];
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    matches = matches.concat(i++, n0);
-    if (cb.apply(thisObj, matches)) {
-      ret.push(n0[0]);
-    }
-  }
-  return ret;
-};
-
-RegExp.prototype.reduce = function (str, cb, prev, thisObj = null) {
-  let matches, n0, i = 0;
-  const regex = mixinRegex(this, 'g');
-  if (!prev) {
-    if ((matches = regex.exec(str)) !== null) {
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [''].concat(matches.concat(i++, n0)));
-    }
-  }
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    prev = cb.apply(thisObj, [prev].concat(matches.concat(i++, n0)));
-  }
-  return prev;
-};
-
-RegExp.prototype.reduceRight = function (str, cb, prevOrig, thisObjOrig) {
-  let matches, n0, i,
-    prev = prevOrig, thisObj = thisObjOrig;
-  const regex = mixinRegex(this, 'g');
-  const matchesContainer = [];
-  thisObj = thisObj || null;
-  while ((matches = regex.exec(str)) !== null) {
-    matchesContainer.push(matches);
-  }
-  i = matchesContainer.length;
-  if (!i) {
-    if (arguments.length < 3) {
-      throw new TypeError(
-        'reduce of empty matches array with no initial value'
-      );
-    }
-    return prev;
-  }
-  if (!prev) {
-    matches = matchesContainer.splice(-1)[0];
-    n0 = matches.splice(0, 1);
-    prev = cb.apply(thisObj, [''].concat(matches.concat(i--, n0)));
-  }
-  matchesContainer.reduceRight(function (container, mtches) {
-    n0 = mtches.splice(0, 1);
-    prev = cb.apply(thisObj, [prev].concat(mtches.concat(i--, n0)));
-    return container;
-  }, matchesContainer);
-  return prev;
-};
-
-RegExp.prototype.find = function (str, cb, thisObj = null) {
-  let matches, ret, n0, i = 0;
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-    if (ret) {
-      return n0[0];
-    }
-  }
-  return false;
-};
-
-RegExp.prototype.findIndex = function (str, cb, thisObj = null) {
-  let matches, ret, n0, i = 0;
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-    if (ret) {
-      return i - 1;
-    }
-  }
-  return -1;
-};
-
-RegExp.prototype.findExec = function (str, cb, thisObj = null) {
-  let matches, ret, n0, i = 0;
-  const regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-    if (ret) {
-      return matches;
-    }
-  }
-  return false;
-};
-
-RegExp.prototype.filterExec = function (str, cb, thisObj = null) {
-  let matches, n0, i = 0;
-  const ret = [], regex = mixinRegex(this, 'g');
-  while ((matches = regex.exec(str)) !== null) {
-    n0 = matches.splice(0, 1);
-    matches.push(i++, n0[0]);
-    if (cb.apply(thisObj, matches)) {
-      ret.push(matches);
-    }
-  }
-  return ret;
-};
diff --git a/node_modules/regextras/src/string-prototype.js b/node_modules/regextras/src/string-prototype.js
deleted file mode 100644
index ce26abf..0000000
--- a/node_modules/regextras/src/string-prototype.js
+++ /dev/null
@@ -1,169 +0,0 @@
-// We copy the regular expression so as to be able to always ensure the exec
-//   expression is a global one (and thereby prevent recursion)
-
-/* eslint-disable no-extend-native,
-    no-use-extend-native/no-use-extend-native,
-    node/no-unsupported-features/es-syntax */
-
-import mixinRegex from './mixinRegex.js';
-
-String.prototype.forEach = function (regex, cb, thisObj = null) {
-  let matches, n0, i = 0;
-  regex = mixinRegex(regex, 'g');
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    cb.apply(thisObj, matches.concat(i++, n0));
-  }
-  return this;
-};
-
-String.prototype.some = function (regex, cb, thisObj = null) {
-  let matches, ret, n0, i = 0;
-  regex = mixinRegex(regex, 'g');
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-    if (ret) {
-      return true;
-    }
-  }
-  return false;
-};
-
-String.prototype.every = function (regex, cb, thisObj = null) {
-  let matches, ret, n0, i = 0;
-  regex = mixinRegex(regex, 'g');
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-    if (!ret) {
-      return false;
-    }
-  }
-  return true;
-};
-
-String.prototype.map = function (regex, cb, thisObj = null) {
-  let matches, n0, i = 0;
-  const ret = [];
-  regex = mixinRegex(regex, 'g');
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret.push(cb.apply(thisObj, matches.concat(i++, n0)));
-  }
-  return ret;
-};
-
-String.prototype.filter = function (regex, cb, thisObj = null) {
-  let matches, n0, i = 0;
-  const ret = [];
-  regex = mixinRegex(regex, 'g');
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    matches = matches.concat(i++, n0);
-    if (cb.apply(thisObj, matches)) {
-      ret.push(n0[0]);
-    }
-  }
-  return ret;
-};
-
-String.prototype.reduce = function (regex, cb, prev, thisObj = null) {
-  let matches, n0, i = 0;
-  regex = mixinRegex(regex, 'g');
-  if (!prev) {
-    if ((matches = regex.exec(this)) !== null) {
-      n0 = matches.splice(0, 1);
-      prev = cb.apply(thisObj, [''].concat(matches.concat(i++, n0)));
-    }
-  }
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    prev = cb.apply(thisObj, [prev].concat(matches.concat(i++, n0)));
-  }
-  return prev;
-};
-
-String.prototype.reduceRight = function (regex, cb, prevOrig, thisObjOrig) {
-  let matches, n0, i,
-    prev = prevOrig, thisObj = thisObjOrig;
-  const matchesContainer = [];
-  regex = mixinRegex(regex, 'g');
-  thisObj = thisObj || null;
-  while ((matches = regex.exec(this)) !== null) {
-    matchesContainer.push(matches);
-  }
-  i = matchesContainer.length;
-  if (!i) {
-    if (arguments.length < 3) {
-      throw new TypeError(
-        'reduce of empty matches array with no initial value'
-      );
-    }
-    return prev;
-  }
-  if (!prev) {
-    matches = matchesContainer.splice(-1)[0];
-    n0 = matches.splice(0, 1);
-    prev = cb.apply(thisObj, [''].concat(matches.concat(i--, n0)));
-  }
-  matchesContainer.reduceRight(function (container, mtches) {
-    n0 = mtches.splice(0, 1);
-    prev = cb.apply(thisObj, [prev].concat(mtches.concat(i--, n0)));
-    return container;
-  }, matchesContainer);
-  return prev;
-};
-
-String.prototype.find = function (regex, cb, thisObj = null) {
-  let matches, ret, n0, i = 0;
-  regex = mixinRegex(regex, 'g');
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-    if (ret) {
-      return n0[0];
-    }
-  }
-  return false;
-};
-
-String.prototype.findIndex = function (regex, cb, thisObj = null) {
-  let matches, ret, n0, i = 0;
-  regex = mixinRegex(regex, 'g');
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-    if (ret) {
-      return i - 1;
-    }
-  }
-  return -1;
-};
-
-String.prototype.findExec = function (regex, cb, thisObj = null) {
-  let matches, ret, n0, i = 0;
-  regex = mixinRegex(regex, 'g');
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    ret = cb.apply(thisObj, matches.concat(i++, n0));
-    if (ret) {
-      return matches;
-    }
-  }
-  return false;
-};
-
-String.prototype.filterExec = function (regex, cb, thisObj = null) {
-  let matches, n0, i = 0;
-  const ret = [];
-  regex = mixinRegex(regex, 'g');
-  while ((matches = regex.exec(this)) !== null) {
-    n0 = matches.splice(0, 1);
-    matches.push(i++, n0[0]);
-    if (cb.apply(thisObj, matches)) {
-      ret.push(matches);
-    }
-  }
-  return ret;
-};
diff --git a/node_modules/resolve-cwd/node_modules/resolve-from/index.js b/node_modules/resolve-cwd/node_modules/resolve-from/index.js
deleted file mode 100644
index 44f291c..0000000
--- a/node_modules/resolve-cwd/node_modules/resolve-from/index.js
+++ /dev/null
@@ -1,47 +0,0 @@
-'use strict';
-const path = require('path');
-const Module = require('module');
-const fs = require('fs');
-
-const resolveFrom = (fromDirectory, moduleId, silent) => {
-	if (typeof fromDirectory !== 'string') {
-		throw new TypeError(`Expected \`fromDir\` to be of type \`string\`, got \`${typeof fromDirectory}\``);
-	}
-
-	if (typeof moduleId !== 'string') {
-		throw new TypeError(`Expected \`moduleId\` to be of type \`string\`, got \`${typeof moduleId}\``);
-	}
-
-	try {
-		fromDirectory = fs.realpathSync(fromDirectory);
-	} catch (error) {
-		if (error.code === 'ENOENT') {
-			fromDirectory = path.resolve(fromDirectory);
-		} else if (silent) {
-			return;
-		} else {
-			throw error;
-		}
-	}
-
-	const fromFile = path.join(fromDirectory, 'noop.js');
-
-	const resolveFileName = () => Module._resolveFilename(moduleId, {
-		id: fromFile,
-		filename: fromFile,
-		paths: Module._nodeModulePaths(fromDirectory)
-	});
-
-	if (silent) {
-		try {
-			return resolveFileName();
-		} catch (error) {
-			return;
-		}
-	}
-
-	return resolveFileName();
-};
-
-module.exports = (fromDirectory, moduleId) => resolveFrom(fromDirectory, moduleId);
-module.exports.silent = (fromDirectory, moduleId) => resolveFrom(fromDirectory, moduleId, true);
diff --git a/node_modules/resolve-cwd/node_modules/resolve-from/package.json b/node_modules/resolve-cwd/node_modules/resolve-from/package.json
deleted file mode 100644
index 733df16..0000000
--- a/node_modules/resolve-cwd/node_modules/resolve-from/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-	"name": "resolve-from",
-	"version": "5.0.0",
-	"description": "Resolve the path of a module like `require.resolve()` but from a given path",
-	"license": "MIT",
-	"repository": "sindresorhus/resolve-from",
-	"author": {
-		"name": "Sindre Sorhus",
-		"email": "sindresorhus@gmail.com",
-		"url": "sindresorhus.com"
-	},
-	"engines": {
-		"node": ">=8"
-	},
-	"scripts": {
-		"test": "xo && ava && tsd"
-	},
-	"files": [
-		"index.js",
-		"index.d.ts"
-	],
-	"keywords": [
-		"require",
-		"resolve",
-		"path",
-		"module",
-		"from",
-		"like",
-		"import"
-	],
-	"devDependencies": {
-		"ava": "^1.4.1",
-		"tsd": "^0.7.2",
-		"xo": "^0.24.0"
-	}
-}
diff --git a/node_modules/resolve-cwd/node_modules/resolve-from/readme.md b/node_modules/resolve-cwd/node_modules/resolve-from/readme.md
deleted file mode 100644
index fd4f46f..0000000
--- a/node_modules/resolve-cwd/node_modules/resolve-from/readme.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# resolve-from [![Build Status](https://travis-ci.org/sindresorhus/resolve-from.svg?branch=master)](https://travis-ci.org/sindresorhus/resolve-from)
-
-> Resolve the path of a module like [`require.resolve()`](https://nodejs.org/api/globals.html#globals_require_resolve) but from a given path
-
-
-## Install
-
-```
-$ npm install resolve-from
-```
-
-
-## Usage
-
-```js
-const resolveFrom = require('resolve-from');
-
-// There is a file at `./foo/bar.js`
-
-resolveFrom('foo', './bar');
-//=> '/Users/sindresorhus/dev/test/foo/bar.js'
-```
-
-
-## API
-
-### resolveFrom(fromDirectory, moduleId)
-
-Like `require()`, throws when the module can't be found.
-
-### resolveFrom.silent(fromDirectory, moduleId)
-
-Returns `undefined` instead of throwing when the module can't be found.
-
-#### fromDirectory
-
-Type: `string`
-
-Directory to resolve from.
-
-#### moduleId
-
-Type: `string`
-
-What you would use in `require()`.
-
-
-## Tip
-
-Create a partial using a bound function if you want to resolve from the same `fromDirectory` multiple times:
-
-```js
-const resolveFromFoo = resolveFrom.bind(null, 'foo');
-
-resolveFromFoo('./bar');
-resolveFromFoo('./baz');
-```
-
-
-## Related
-
-- [resolve-cwd](https://github.com/sindresorhus/resolve-cwd) - Resolve the path of a module from the current working directory
-- [import-from](https://github.com/sindresorhus/import-from) - Import a module from a given path
-- [import-cwd](https://github.com/sindresorhus/import-cwd) - Import a module from the current working directory
-- [resolve-pkg](https://github.com/sindresorhus/resolve-pkg) - Resolve the path of a package regardless of it having an entry point
-- [import-lazy](https://github.com/sindresorhus/import-lazy) - Import a module lazily
-- [resolve-global](https://github.com/sindresorhus/resolve-global) - Resolve the path of a globally installed module
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/resolve-cwd/node_modules/resolve-from/index.d.ts b/node_modules/resolve-from/index.d.ts
similarity index 100%
rename from node_modules/resolve-cwd/node_modules/resolve-from/index.d.ts
rename to node_modules/resolve-from/index.d.ts
diff --git a/node_modules/resolve-from/index.js b/node_modules/resolve-from/index.js
index d092447..44f291c 100644
--- a/node_modules/resolve-from/index.js
+++ b/node_modules/resolve-from/index.js
@@ -3,9 +3,9 @@
 const Module = require('module');
 const fs = require('fs');
 
-const resolveFrom = (fromDir, moduleId, silent) => {
-	if (typeof fromDir !== 'string') {
-		throw new TypeError(`Expected \`fromDir\` to be of type \`string\`, got \`${typeof fromDir}\``);
+const resolveFrom = (fromDirectory, moduleId, silent) => {
+	if (typeof fromDirectory !== 'string') {
+		throw new TypeError(`Expected \`fromDir\` to be of type \`string\`, got \`${typeof fromDirectory}\``);
 	}
 
 	if (typeof moduleId !== 'string') {
@@ -13,35 +13,35 @@
 	}
 
 	try {
-		fromDir = fs.realpathSync(fromDir);
-	} catch (err) {
-		if (err.code === 'ENOENT') {
-			fromDir = path.resolve(fromDir);
+		fromDirectory = fs.realpathSync(fromDirectory);
+	} catch (error) {
+		if (error.code === 'ENOENT') {
+			fromDirectory = path.resolve(fromDirectory);
 		} else if (silent) {
-			return null;
+			return;
 		} else {
-			throw err;
+			throw error;
 		}
 	}
 
-	const fromFile = path.join(fromDir, 'noop.js');
+	const fromFile = path.join(fromDirectory, 'noop.js');
 
 	const resolveFileName = () => Module._resolveFilename(moduleId, {
 		id: fromFile,
 		filename: fromFile,
-		paths: Module._nodeModulePaths(fromDir)
+		paths: Module._nodeModulePaths(fromDirectory)
 	});
 
 	if (silent) {
 		try {
 			return resolveFileName();
-		} catch (err) {
-			return null;
+		} catch (error) {
+			return;
 		}
 	}
 
 	return resolveFileName();
 };
 
-module.exports = (fromDir, moduleId) => resolveFrom(fromDir, moduleId);
-module.exports.silent = (fromDir, moduleId) => resolveFrom(fromDir, moduleId, true);
+module.exports = (fromDirectory, moduleId) => resolveFrom(fromDirectory, moduleId);
+module.exports.silent = (fromDirectory, moduleId) => resolveFrom(fromDirectory, moduleId, true);
diff --git a/node_modules/resolve-from/package.json b/node_modules/resolve-from/package.json
index 96bade5..733df16 100644
--- a/node_modules/resolve-from/package.json
+++ b/node_modules/resolve-from/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "resolve-from",
-	"version": "4.0.0",
+	"version": "5.0.0",
 	"description": "Resolve the path of a module like `require.resolve()` but from a given path",
 	"license": "MIT",
 	"repository": "sindresorhus/resolve-from",
@@ -10,13 +10,14 @@
 		"url": "sindresorhus.com"
 	},
 	"engines": {
-		"node": ">=4"
+		"node": ">=8"
 	},
 	"scripts": {
-		"test": "xo && ava"
+		"test": "xo && ava && tsd"
 	},
 	"files": [
-		"index.js"
+		"index.js",
+		"index.d.ts"
 	],
 	"keywords": [
 		"require",
@@ -28,7 +29,8 @@
 		"import"
 	],
 	"devDependencies": {
-		"ava": "*",
-		"xo": "*"
+		"ava": "^1.4.1",
+		"tsd": "^0.7.2",
+		"xo": "^0.24.0"
 	}
 }
diff --git a/node_modules/resolve-from/readme.md b/node_modules/resolve-from/readme.md
index e539f85..fd4f46f 100644
--- a/node_modules/resolve-from/readme.md
+++ b/node_modules/resolve-from/readme.md
@@ -24,15 +24,15 @@
 
 ## API
 
-### resolveFrom(fromDir, moduleId)
+### resolveFrom(fromDirectory, moduleId)
 
 Like `require()`, throws when the module can't be found.
 
-### resolveFrom.silent(fromDir, moduleId)
+### resolveFrom.silent(fromDirectory, moduleId)
 
-Returns `null` instead of throwing when the module can't be found.
+Returns `undefined` instead of throwing when the module can't be found.
 
-#### fromDir
+#### fromDirectory
 
 Type: `string`
 
@@ -47,7 +47,7 @@
 
 ## Tip
 
-Create a partial using a bound function if you want to resolve from the same `fromDir` multiple times:
+Create a partial using a bound function if you want to resolve from the same `fromDirectory` multiple times:
 
 ```js
 const resolveFromFoo = resolveFrom.bind(null, 'foo');
diff --git a/node_modules/restore-cursor/index.d.ts b/node_modules/restore-cursor/index.d.ts
deleted file mode 100644
index 83ff2f4..0000000
--- a/node_modules/restore-cursor/index.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
-Gracefully restore the CLI cursor on exit.
-
-@example
-```
-import restoreCursor = require('restore-cursor');
-
-restoreCursor();
-```
-*/
-declare function restoreCursor(): void;
-
-export = restoreCursor;
diff --git a/node_modules/restore-cursor/index.js b/node_modules/restore-cursor/index.js
deleted file mode 100644
index 3e8dd07..0000000
--- a/node_modules/restore-cursor/index.js
+++ /dev/null
@@ -1,9 +0,0 @@
-'use strict';
-const onetime = require('onetime');
-const signalExit = require('signal-exit');
-
-module.exports = onetime(() => {
-	signalExit(() => {
-		process.stderr.write('\u001B[?25h');
-	}, {alwaysLast: true});
-});
diff --git a/node_modules/restore-cursor/license b/node_modules/restore-cursor/license
deleted file mode 100644
index e7af2f7..0000000
--- a/node_modules/restore-cursor/license
+++ /dev/null
@@ -1,9 +0,0 @@
-MIT License
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-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/node_modules/restore-cursor/package.json b/node_modules/restore-cursor/package.json
deleted file mode 100644
index e8680f6..0000000
--- a/node_modules/restore-cursor/package.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-	"name": "restore-cursor",
-	"version": "3.1.0",
-	"description": "Gracefully restore the CLI cursor on exit",
-	"license": "MIT",
-	"repository": "sindresorhus/restore-cursor",
-	"author": {
-		"name": "Sindre Sorhus",
-		"email": "sindresorhus@gmail.com",
-		"url": "sindresorhus.com"
-	},
-	"engines": {
-		"node": ">=8"
-	},
-	"scripts": {
-		"test": "xo && tsd"
-	},
-	"files": [
-		"index.js",
-		"index.d.ts"
-	],
-	"keywords": [
-		"exit",
-		"quit",
-		"process",
-		"graceful",
-		"shutdown",
-		"sigterm",
-		"sigint",
-		"terminate",
-		"kill",
-		"stop",
-		"cli",
-		"cursor",
-		"ansi",
-		"show",
-		"term",
-		"terminal",
-		"console",
-		"tty",
-		"shell",
-		"command-line"
-	],
-	"dependencies": {
-		"onetime": "^5.1.0",
-		"signal-exit": "^3.0.2"
-	},
-	"devDependencies": {
-		"tsd": "^0.7.2",
-		"xo": "^0.24.0"
-	}
-}
diff --git a/node_modules/restore-cursor/readme.md b/node_modules/restore-cursor/readme.md
deleted file mode 100644
index c224a29..0000000
--- a/node_modules/restore-cursor/readme.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# restore-cursor [![Build Status](https://travis-ci.org/sindresorhus/restore-cursor.svg?branch=master)](https://travis-ci.org/sindresorhus/restore-cursor)
-
-> Gracefully restore the CLI cursor on exit
-
-Prevent the cursor you've hidden interactively from remaining hidden if the process crashes.
-
-
-## Install
-
-```
-$ npm install restore-cursor
-```
-
-
-## Usage
-
-```js
-const restoreCursor = require('restore-cursor');
-
-restoreCursor();
-```
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/rimraf/CHANGELOG.md b/node_modules/rimraf/CHANGELOG.md
new file mode 100644
index 0000000..f116f14
--- /dev/null
+++ b/node_modules/rimraf/CHANGELOG.md
@@ -0,0 +1,65 @@
+# v3.0
+
+- Add `--preserve-root` option to executable (default true)
+- Drop support for Node.js below version 6
+
+# v2.7
+
+- Make `glob` an optional dependency
+
+# 2.6
+
+- Retry on EBUSY on non-windows platforms as well
+- Make `rimraf.sync` 10000% more reliable on Windows
+
+# 2.5
+
+- Handle Windows EPERM when lstat-ing read-only dirs
+- Add glob option to pass options to glob
+
+# 2.4
+
+- Add EPERM to delay/retry loop
+- Add `disableGlob` option
+
+# 2.3
+
+- Make maxBusyTries and emfileWait configurable
+- Handle weird SunOS unlink-dir issue
+- Glob the CLI arg for better Windows support
+
+# 2.2
+
+- Handle ENOENT properly on Windows
+- Allow overriding fs methods
+- Treat EPERM as indicative of non-empty dir
+- Remove optional graceful-fs dep
+- Consistently return null error instead of undefined on success
+- win32: Treat ENOTEMPTY the same as EBUSY
+- Add `rimraf` binary
+
+# 2.1
+
+- Fix SunOS error code for a non-empty directory
+- Try rmdir before readdir
+- Treat EISDIR like EPERM
+- Remove chmod
+- Remove lstat polyfill, node 0.7 is not supported
+
+# 2.0
+
+- Fix myGid call to check process.getgid
+- Simplify the EBUSY backoff logic.
+- Use fs.lstat in node >= 0.7.9
+- Remove gently option
+- remove fiber implementation
+- Delete files that are marked read-only
+
+# 1.0
+
+- Allow ENOENT in sync method
+- Throw when no callback is provided
+- Make opts.gently an absolute path
+- use 'stat' if 'lstat' is not available
+- Consistent error naming, and rethrow non-ENOENT stat errors
+- add fiber implementation
diff --git a/node_modules/rimraf/package.json b/node_modules/rimraf/package.json
index 68c98f9..1bf8d5e 100644
--- a/node_modules/rimraf/package.json
+++ b/node_modules/rimraf/package.json
@@ -1,6 +1,6 @@
 {
   "name": "rimraf",
-  "version": "3.0.0",
+  "version": "3.0.2",
   "main": "rimraf.js",
   "description": "A deep deletion module for node (like `rm -rf`)",
   "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
@@ -25,5 +25,8 @@
   "devDependencies": {
     "mkdirp": "^0.5.1",
     "tap": "^12.1.1"
+  },
+  "funding": {
+    "url": "https://github.com/sponsors/isaacs"
   }
 }
diff --git a/node_modules/rimraf/rimraf.js b/node_modules/rimraf/rimraf.js
index 309b8ca..34da417 100644
--- a/node_modules/rimraf/rimraf.js
+++ b/node_modules/rimraf/rimraf.js
@@ -164,8 +164,6 @@
   assert(p)
   assert(options)
   assert(typeof cb === 'function')
-  if (er)
-    assert(er instanceof Error)
 
   options.chmod(p, 0o666, er2 => {
     if (er2)
@@ -185,8 +183,6 @@
 const fixWinEPERMSync = (p, options, er) => {
   assert(p)
   assert(options)
-  if (er)
-    assert(er instanceof Error)
 
   try {
     options.chmodSync(p, 0o666)
@@ -216,8 +212,6 @@
 const rmdir = (p, options, originalEr, cb) => {
   assert(p)
   assert(options)
-  if (originalEr)
-    assert(originalEr instanceof Error)
   assert(typeof cb === 'function')
 
   // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
@@ -323,8 +317,6 @@
 const rmdirSync = (p, options, originalEr) => {
   assert(p)
   assert(options)
-  if (originalEr)
-    assert(originalEr instanceof Error)
 
   try {
     options.rmdirSync(p)
diff --git a/node_modules/run-async/LICENSE b/node_modules/run-async/LICENSE
deleted file mode 100644
index e895e99..0000000
--- a/node_modules/run-async/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Simon Boudrias
-
-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/node_modules/run-async/README.md b/node_modules/run-async/README.md
deleted file mode 100644
index 8eb62c2..0000000
--- a/node_modules/run-async/README.md
+++ /dev/null
@@ -1,79 +0,0 @@
-Run Async
-=========
-
-[![npm](https://badge.fury.io/js/run-async.svg)](http://badge.fury.io/js/run-async) [![tests](https://travis-ci.org/SBoudrias/run-async.svg?branch=master)](http://travis-ci.org/SBoudrias/run-async) [![dependencies](https://david-dm.org/SBoudrias/run-async.svg?theme=shields.io)](https://david-dm.org/SBoudrias/run-async)
-
-Utility method to run a function either synchronously or asynchronously using a series of common patterns. This is useful for library author accepting sync or async functions as parameter. `runAsync` will always run them as an async method, and normalize the multiple signature.
-
-Installation
-=========
-
-```bash
-npm install --save run-async
-```
-
-Usage
-=========
-
-Here's a simple example print the function results and three options a user can provide a function.
-
-```js
-var runAsync = require('run-async');
-
-var printAfter = function (func) {
-  var cb = function (err, returnValue) {
-    console.log(returnValue);
-  };
-  runAsync(func, cb)(/* arguments for func */);
-};
-```
-
-#### Using `this.async`
-```js
-printAfter(function () {
-  var done = this.async();
-
-  setTimeout(function () {
-    done(null, 'done running with callback');
-  }, 10);
-});
-```
-
-#### Returning a promise
-```js
-printAfter(function () {
-  return new Promise(function (resolve, reject) {
-    resolve('done running with promises');
-  });
-});
-```
-
-#### Synchronous function
-```js
-printAfter(function () {
-  return 'done running sync function';
-});
-```
-
-### runAsync.cb
-
-`runAsync.cb` supports all the function types that `runAsync` does and additionally a traditional **callback as the last argument** signature:
-
-```js
-var runAsync = require('run-async');
-
-// IMPORTANT: The wrapped function must have a fixed number of parameters.
-runAsync.cb(function(a, b, cb) {
-  cb(null, a + b);
-}, function(err, result) {
-  console.log(result)
-})(1, 2)
-```
-
-If your version of node support Promises natively (node >= 0.12), `runAsync` will return a promise. Example: `runAsync(func)(arg1, arg2).then(cb)`
-
-Licence
-========
-
-Copyright (c) 2014 Simon Boudrias (twitter: @vaxilart)  
-Licensed under the MIT license.
diff --git a/node_modules/run-async/index.js b/node_modules/run-async/index.js
deleted file mode 100644
index 41d6fcf..0000000
--- a/node_modules/run-async/index.js
+++ /dev/null
@@ -1,96 +0,0 @@
-'use strict';
-
-var isPromise = require('is-promise');
-
-/**
- * Return a function that will run a function asynchronously or synchronously
- *
- * example:
- * runAsync(wrappedFunction, callback)(...args);
- *
- * @param   {Function} func  Function to run
- * @param   {Function} cb    Callback function passed the `func` returned value
- * @return  {Function(arguments)} Arguments to pass to `func`. This function will in turn
- *                                return a Promise (Node >= 0.12) or call the callbacks.
- */
-
-var runAsync = module.exports = function (func, cb) {
-  cb = cb || function () {};
-
-  return function () {
-
-    var args = arguments;
-
-    var promise = new Promise(function (resolve, reject) {
-      var resolved = false;
-      const wrappedResolve = function (value) {
-        if (resolved) {
-          console.warn('Run-async promise already resolved.')
-        }
-        resolved = true;
-        resolve(value);
-      }
-
-      var rejected = false;
-      const wrappedReject = function (value) {
-        if (rejected) {
-          console.warn('Run-async promise already rejected.')
-        }
-        rejected = true;
-        reject(value);
-      }
-
-      var usingCallback = false;
-      var callbackConflict = false;
-      var contextEnded = false;
-
-      var answer = func.apply({
-        async: function () {
-          if (contextEnded) {
-            console.warn('Run-async async() called outside a valid run-async context, callback will be ignored.');
-            return function() {};
-          }
-          if (callbackConflict) {
-            console.warn('Run-async wrapped function (async) returned a promise.\nCalls to async() callback can have unexpected results.');
-          }
-          usingCallback = true;
-          return function (err, value) {
-            if (err) {
-              wrappedReject(err);
-            } else {
-              wrappedResolve(value);
-            }
-          };
-        }
-      }, Array.prototype.slice.call(args));
-
-      if (usingCallback) {
-        if (isPromise(answer)) {
-          console.warn('Run-async wrapped function (sync) returned a promise but async() callback must be executed to resolve.');
-        }
-      } else {
-        if (isPromise(answer)) {
-          callbackConflict = true;
-          answer.then(wrappedResolve, wrappedReject);
-        } else {
-          wrappedResolve(answer);
-        }
-      }
-      contextEnded = true;
-    });
-
-    promise.then(cb.bind(null, null), cb);
-
-    return promise;
-  }
-};
-
-runAsync.cb = function (func, cb) {
-  return runAsync(function () {
-    var args = Array.prototype.slice.call(arguments);
-    if (args.length === func.length - 1) {
-      args.push(this.async());
-    }
-    return func.apply(this, args);
-  }, cb);
-};
diff --git a/node_modules/run-async/package.json b/node_modules/run-async/package.json
deleted file mode 100644
index 4fb27ae..0000000
--- a/node_modules/run-async/package.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  "name": "run-async",
-  "version": "2.4.0",
-  "description": "Utility method to run function either synchronously or asynchronously using the common `this.async()` style.",
-  "main": "index.js",
-  "scripts": {
-    "test": "mocha -R spec"
-  },
-  "engines": {
-    "node": ">=0.12.0"
-  },
-  "repository": "SBoudrias/run-async",
-  "keywords": [
-    "flow",
-    "flow-control",
-    "async"
-  ],
-  "files": [
-    "index.js"
-  ],
-  "author": "Simon Boudrias <admin@simonboudrias.com>",
-  "license": "MIT",
-  "dependencies": {
-    "is-promise": "^2.1.0"
-  },
-  "devDependencies": {
-    "mocha": "^7.1.0"
-  }
-}
diff --git a/node_modules/rxjs/AsyncSubject.d.ts b/node_modules/rxjs/AsyncSubject.d.ts
deleted file mode 100644
index 2c4d977..0000000
--- a/node_modules/rxjs/AsyncSubject.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/AsyncSubject';
diff --git a/node_modules/rxjs/AsyncSubject.js b/node_modules/rxjs/AsyncSubject.js
deleted file mode 100644
index d32cac1..0000000
--- a/node_modules/rxjs/AsyncSubject.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/AsyncSubject"));
-//# sourceMappingURL=AsyncSubject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/AsyncSubject.js.map b/node_modules/rxjs/AsyncSubject.js.map
deleted file mode 100644
index 704e953..0000000
--- a/node_modules/rxjs/AsyncSubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsyncSubject.js","sources":["src/AsyncSubject.ts"],"names":[],"mappings":";;;;;AAAA,8CAAyC"}
diff --git a/node_modules/rxjs/BehaviorSubject.d.ts b/node_modules/rxjs/BehaviorSubject.d.ts
deleted file mode 100644
index f8b4f44..0000000
--- a/node_modules/rxjs/BehaviorSubject.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/BehaviorSubject';
diff --git a/node_modules/rxjs/BehaviorSubject.js b/node_modules/rxjs/BehaviorSubject.js
deleted file mode 100644
index f31d4bf..0000000
--- a/node_modules/rxjs/BehaviorSubject.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/BehaviorSubject"));
-//# sourceMappingURL=BehaviorSubject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/BehaviorSubject.js.map b/node_modules/rxjs/BehaviorSubject.js.map
deleted file mode 100644
index 825e04b..0000000
--- a/node_modules/rxjs/BehaviorSubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"BehaviorSubject.js","sources":["src/BehaviorSubject.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/InnerSubscriber.d.ts b/node_modules/rxjs/InnerSubscriber.d.ts
deleted file mode 100644
index 79e3b4a..0000000
--- a/node_modules/rxjs/InnerSubscriber.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/InnerSubscriber';
diff --git a/node_modules/rxjs/InnerSubscriber.js b/node_modules/rxjs/InnerSubscriber.js
deleted file mode 100644
index 5c4153a..0000000
--- a/node_modules/rxjs/InnerSubscriber.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/InnerSubscriber"));
-//# sourceMappingURL=InnerSubscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/InnerSubscriber.js.map b/node_modules/rxjs/InnerSubscriber.js.map
deleted file mode 100644
index a4825ae..0000000
--- a/node_modules/rxjs/InnerSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"InnerSubscriber.js","sources":["src/InnerSubscriber.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/LICENSE.txt b/node_modules/rxjs/LICENSE.txt
deleted file mode 100644
index 031ce38..0000000
--- a/node_modules/rxjs/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-                               Apache License
-                         Version 2.0, January 2004
-                      http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
-    "License" shall mean the terms and conditions for use, reproduction,
-    and distribution as defined by Sections 1 through 9 of this document.
-
-    "Licensor" shall mean the copyright owner or entity authorized by
-    the copyright owner that is granting the License.
-
-    "Legal Entity" shall mean the union of the acting entity and all
-    other entities that control, are controlled by, or are under common
-    control with that entity. For the purposes of this definition,
-    "control" means (i) the power, direct or indirect, to cause the
-    direction or management of such entity, whether by contract or
-    otherwise, or (ii) ownership of fifty percent (50%) or more of the
-    outstanding shares, or (iii) beneficial ownership of such entity.
-
-    "You" (or "Your") shall mean an individual or Legal Entity
-    exercising permissions granted by this License.
-
-    "Source" form shall mean the preferred form for making modifications,
-    including but not limited to software source code, documentation
-    source, and configuration files.
-
-    "Object" form shall mean any form resulting from mechanical
-    transformation or translation of a Source form, including but
-    not limited to compiled object code, generated documentation,
-    and conversions to other media types.
-
-    "Work" shall mean the work of authorship, whether in Source or
-    Object form, made available under the License, as indicated by a
-    copyright notice that is included in or attached to the work
-    (an example is provided in the Appendix below).
-
-    "Derivative Works" shall mean any work, whether in Source or Object
-    form, that is based on (or derived from) the Work and for which the
-    editorial revisions, annotations, elaborations, or other modifications
-    represent, as a whole, an original work of authorship. For the purposes
-    of this License, Derivative Works shall not include works that remain
-    separable from, or merely link (or bind by name) to the interfaces of,
-    the Work and Derivative Works thereof.
-
-    "Contribution" shall mean any work of authorship, including
-    the original version of the Work and any modifications or additions
-    to that Work or Derivative Works thereof, that is intentionally
-    submitted to Licensor for inclusion in the Work by the copyright owner
-    or by an individual or Legal Entity authorized to submit on behalf of
-    the copyright owner. For the purposes of this definition, "submitted"
-    means any form of electronic, verbal, or written communication sent
-    to the Licensor or its representatives, including but not limited to
-    communication on electronic mailing lists, source code control systems,
-    and issue tracking systems that are managed by, or on behalf of, the
-    Licensor for the purpose of discussing and improving the Work, but
-    excluding communication that is conspicuously marked or otherwise
-    designated in writing by the copyright owner as "Not a Contribution."
-
-    "Contributor" shall mean Licensor and any individual or Legal Entity
-    on behalf of whom a Contribution has been received by Licensor and
-    subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    copyright license to reproduce, prepare Derivative Works of,
-    publicly display, publicly perform, sublicense, and distribute the
-    Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    (except as stated in this section) patent license to make, have made,
-    use, offer to sell, sell, import, and otherwise transfer the Work,
-    where such license applies only to those patent claims licensable
-    by such Contributor that are necessarily infringed by their
-    Contribution(s) alone or by combination of their Contribution(s)
-    with the Work to which such Contribution(s) was submitted. If You
-    institute patent litigation against any entity (including a
-    cross-claim or counterclaim in a lawsuit) alleging that the Work
-    or a Contribution incorporated within the Work constitutes direct
-    or contributory patent infringement, then any patent licenses
-    granted to You under this License for that Work shall terminate
-    as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
-    Work or Derivative Works thereof in any medium, with or without
-    modifications, and in Source or Object form, provided that You
-    meet the following conditions:
-
-    (a) You must give any other recipients of the Work or
-        Derivative Works a copy of this License; and
-
-    (b) You must cause any modified files to carry prominent notices
-        stating that You changed the files; and
-
-    (c) You must retain, in the Source form of any Derivative Works
-        that You distribute, all copyright, patent, trademark, and
-        attribution notices from the Source form of the Work,
-        excluding those notices that do not pertain to any part of
-        the Derivative Works; and
-
-    (d) If the Work includes a "NOTICE" text file as part of its
-        distribution, then any Derivative Works that You distribute must
-        include a readable copy of the attribution notices contained
-        within such NOTICE file, excluding those notices that do not
-        pertain to any part of the Derivative Works, in at least one
-        of the following places: within a NOTICE text file distributed
-        as part of the Derivative Works; within the Source form or
-        documentation, if provided along with the Derivative Works; or,
-        within a display generated by the Derivative Works, if and
-        wherever such third-party notices normally appear. The contents
-        of the NOTICE file are for informational purposes only and
-        do not modify the License. You may add Your own attribution
-        notices within Derivative Works that You distribute, alongside
-        or as an addendum to the NOTICE text from the Work, provided
-        that such additional attribution notices cannot be construed
-        as modifying the License.
-
-    You may add Your own copyright statement to Your modifications and
-    may provide additional or different license terms and conditions
-    for use, reproduction, or distribution of Your modifications, or
-    for any such Derivative Works as a whole, provided Your use,
-    reproduction, and distribution of the Work otherwise complies with
-    the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
-    any Contribution intentionally submitted for inclusion in the Work
-    by You to the Licensor shall be under the terms and conditions of
-    this License, without any additional terms or conditions.
-    Notwithstanding the above, nothing herein shall supersede or modify
-    the terms of any separate license agreement you may have executed
-    with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
-    names, trademarks, service marks, or product names of the Licensor,
-    except as required for reasonable and customary use in describing the
-    origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
-    agreed to in writing, Licensor provides the Work (and each
-    Contributor provides its Contributions) on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-    implied, including, without limitation, any warranties or conditions
-    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-    PARTICULAR PURPOSE. You are solely responsible for determining the
-    appropriateness of using or redistributing the Work and assume any
-    risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
-    whether in tort (including negligence), contract, or otherwise,
-    unless required by applicable law (such as deliberate and grossly
-    negligent acts) or agreed to in writing, shall any Contributor be
-    liable to You for damages, including any direct, indirect, special,
-    incidental, or consequential damages of any character arising as a
-    result of this License or out of the use or inability to use the
-    Work (including but not limited to damages for loss of goodwill,
-    work stoppage, computer failure or malfunction, or any and all
-    other commercial damages or losses), even if such Contributor
-    has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
-    the Work or Derivative Works thereof, You may choose to offer,
-    and charge a fee for, acceptance of support, warranty, indemnity,
-    or other liability obligations and/or rights consistent with this
-    License. However, in accepting such obligations, You may act only
-    on Your own behalf and on Your sole responsibility, not on behalf
-    of any other Contributor, and only if You agree to indemnify,
-    defend, and hold each Contributor harmless for any liability
-    incurred by, or claims asserted against, such Contributor by reason
-    of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
-    To apply the Apache License to your work, attach the following
-    boilerplate notice, with the fields enclosed by brackets "[]"
-    replaced with your own identifying information. (Don't include
-    the brackets!)  The text should be enclosed in the appropriate
-    comment syntax for the file format. We also recommend that a
-    file or class name and description of purpose be included on the
-    same "printed page" as the copyright notice for easier
-    identification within third-party archives.
-
- Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- 
diff --git a/node_modules/rxjs/Notification.d.ts b/node_modules/rxjs/Notification.d.ts
deleted file mode 100644
index 5d9956d..0000000
--- a/node_modules/rxjs/Notification.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Notification';
diff --git a/node_modules/rxjs/Notification.js b/node_modules/rxjs/Notification.js
deleted file mode 100644
index 8a53935..0000000
--- a/node_modules/rxjs/Notification.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/Notification"));
-//# sourceMappingURL=Notification.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/Notification.js.map b/node_modules/rxjs/Notification.js.map
deleted file mode 100644
index 890b860..0000000
--- a/node_modules/rxjs/Notification.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Notification.js","sources":["src/Notification.ts"],"names":[],"mappings":";;;;;AAAA,8CAAyC"}
diff --git a/node_modules/rxjs/Observable.d.ts b/node_modules/rxjs/Observable.d.ts
deleted file mode 100644
index cc1e68d..0000000
--- a/node_modules/rxjs/Observable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Observable';
diff --git a/node_modules/rxjs/Observable.js b/node_modules/rxjs/Observable.js
deleted file mode 100644
index 231f7df..0000000
--- a/node_modules/rxjs/Observable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/Observable"));
-//# sourceMappingURL=Observable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/Observable.js.map b/node_modules/rxjs/Observable.js.map
deleted file mode 100644
index 5fecdc6..0000000
--- a/node_modules/rxjs/Observable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Observable.js","sources":["src/Observable.ts"],"names":[],"mappings":";;;;;AAAA,4CAAuC"}
diff --git a/node_modules/rxjs/Observer.d.ts b/node_modules/rxjs/Observer.d.ts
deleted file mode 100644
index 867ce2f..0000000
--- a/node_modules/rxjs/Observer.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Observer';
diff --git a/node_modules/rxjs/Observer.js b/node_modules/rxjs/Observer.js
deleted file mode 100644
index c4d5488..0000000
--- a/node_modules/rxjs/Observer.js
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=Observer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/Observer.js.map b/node_modules/rxjs/Observer.js.map
deleted file mode 100644
index 0272f21..0000000
--- a/node_modules/rxjs/Observer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Observer.js","sources":["src/Observer.ts"],"names":[],"mappings":""}
diff --git a/node_modules/rxjs/Operator.d.ts b/node_modules/rxjs/Operator.d.ts
deleted file mode 100644
index fb9a9f9..0000000
--- a/node_modules/rxjs/Operator.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Operator';
diff --git a/node_modules/rxjs/Operator.js b/node_modules/rxjs/Operator.js
deleted file mode 100644
index 3c44713..0000000
--- a/node_modules/rxjs/Operator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=Operator.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/Operator.js.map b/node_modules/rxjs/Operator.js.map
deleted file mode 100644
index 3ca1e3b..0000000
--- a/node_modules/rxjs/Operator.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Operator.js","sources":["src/Operator.ts"],"names":[],"mappings":""}
diff --git a/node_modules/rxjs/OuterSubscriber.d.ts b/node_modules/rxjs/OuterSubscriber.d.ts
deleted file mode 100644
index 9060ae7..0000000
--- a/node_modules/rxjs/OuterSubscriber.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/OuterSubscriber';
diff --git a/node_modules/rxjs/OuterSubscriber.js b/node_modules/rxjs/OuterSubscriber.js
deleted file mode 100644
index 4715481..0000000
--- a/node_modules/rxjs/OuterSubscriber.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/OuterSubscriber"));
-//# sourceMappingURL=OuterSubscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/OuterSubscriber.js.map b/node_modules/rxjs/OuterSubscriber.js.map
deleted file mode 100644
index 8476f04..0000000
--- a/node_modules/rxjs/OuterSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"OuterSubscriber.js","sources":["src/OuterSubscriber.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/README.md b/node_modules/rxjs/README.md
deleted file mode 100644
index e9204f0..0000000
--- a/node_modules/rxjs/README.md
+++ /dev/null
@@ -1,145 +0,0 @@
-<img src="doc/asset/Rx_Logo_S.png" alt="RxJS Logo" width="86" height="86"> RxJS: Reactive Extensions For JavaScript
-======================================
-
-
-[![CircleCI](https://circleci.com/gh/ReactiveX/rxjs/tree/6.x.svg?style=svg)](https://circleci.com/gh/ReactiveX/rxjs/tree/6.x)
-[![npm version](https://badge.fury.io/js/%40reactivex%2Frxjs.svg)](http://badge.fury.io/js/%40reactivex%2Frxjs)
-[![Join the chat at https://gitter.im/Reactive-Extensions/RxJS](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Reactive-Extensions/RxJS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-# RxJS 6 Stable
-
-### MIGRATION AND RELEASE INFORMATION:
-
-Find out how to update to v6, **automatically update your TypeScript code**, and more!
-
-- [Current home is MIGRATION.md](./docs_app/content/guide/v6/migration.md)
-
-### FOR V 5.X PLEASE GO TO [THE 5.0 BRANCH](https://github.com/ReactiveX/rxjs/tree/5.x)
-
-Reactive Extensions Library for JavaScript. This is a rewrite of [Reactive-Extensions/RxJS](https://github.com/Reactive-Extensions/RxJS) and is the latest production-ready version of RxJS. This rewrite is meant to have better performance, better modularity, better debuggable call stacks, while staying mostly backwards compatible, with some breaking changes that reduce the API surface.
-
-[Apache 2.0 License](LICENSE.txt)
-
-- [Code of Conduct](CODE_OF_CONDUCT.md)
-- [Contribution Guidelines](CONTRIBUTING.md)
-- [Maintainer Guidelines](doc/maintainer-guidelines.md)
-- [Creating Operators](doc/operator-creation.md)
-- [API Documentation (WIP)](https://rxjs.dev/)
-
-## Versions In This Repository
-
-- [master](https://github.com/ReactiveX/rxjs/commits/master) - This is all of the current, unreleased work, which is against v6 of RxJS right now
-- [stable](https://github.com/ReactiveX/rxjs/commits/stable) - This is the branch for the latest version you'd get if you do `npm install rxjs`
-
-## Important
-
-By contributing or commenting on issues in this repository, whether you've read them or not, you're agreeing to the [Contributor Code of Conduct](CODE_OF_CONDUCT.md). Much like traffic laws, ignorance doesn't grant you immunity.
-
-## Installation and Usage
-
-### ES6 via npm
-
-```sh
-npm install rxjs
-```
-
-It's recommended to pull in the Observable creation methods you need directly from `'rxjs'` as shown below with `range`. And you can pull in any operator you need from one spot, under `'rxjs/operators'`.
-
-```js
-import { range } from 'rxjs';
-import { map, filter } from 'rxjs/operators';
-
-range(1, 200).pipe(
-  filter(x => x % 2 === 1),
-  map(x => x + x)
-).subscribe(x => console.log(x));
-```
-
-Here, we're using the built-in `pipe` method on Observables to combine operators. See [pipeable operators](https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md) for more information.
-
-### CommonJS via npm
-
-To install this library for CommonJS (CJS) usage, use the following command:
-
-```sh
-npm install rxjs
-```
-
-(Note: destructuring available in Node 8+)
-
-```js
-const { range } = require('rxjs');
-const { map, filter } = require('rxjs/operators');
-
-range(1, 200).pipe(
-  filter(x => x % 2 === 1),
-  map(x => x + x)
-).subscribe(x => console.log(x));
-```
-
-### CDN
-
-For CDN, you can use [unpkg](https://unpkg.com/):
-
-https://unpkg.com/rxjs/bundles/rxjs.umd.min.js
-
-The global namespace for rxjs is `rxjs`:
-
-```js
-const { range } = rxjs;
-const { map, filter } = rxjs.operators;
-
-range(1, 200).pipe(
-  filter(x => x % 2 === 1),
-  map(x => x + x)
-).subscribe(x => console.log(x));
-```
-
-## Goals
-
-- Smaller overall bundles sizes
-- Provide better performance than preceding versions of RxJS
-- To model/follow the [Observable Spec Proposal](https://github.com/zenparsing/es-observable) to the observable
-- Provide more modular file structure in a variety of formats
-- Provide more debuggable call stacks than preceding versions of RxJS
-
-## Building/Testing
-
-- `npm run build_all` - builds everything
-- `npm test` - runs tests
-- `npm run test_no_cache` - run test with `ts-node` set to false
-
-## Performance Tests
-
-Run `npm run build_perf` or `npm run perf` to run the performance tests with `protractor`.
-
-Run `npm run perf_micro [operator]` to run micro performance test benchmarking operator.
-
-## Adding documentation
-We appreciate all contributions to the documentation of any type. All of the information needed to get the docs app up and running locally as well as how to contribute can be found in the [documentation directory](./docs_app).
-
-## Generating PNG marble diagrams
-
-The script `npm run tests2png` requires some native packages installed locally: `imagemagick`, `graphicsmagick`, and `ghostscript`.
-
-For Mac OS X with [Homebrew](http://brew.sh/):
-
-- `brew install imagemagick`
-- `brew install graphicsmagick`
-- `brew install ghostscript`
-- You may need to install the Ghostscript fonts manually:
-  - Download the tarball from the [gs-fonts project](https://sourceforge.net/projects/gs-fonts)
-  - `mkdir -p /usr/local/share/ghostscript && tar zxvf /path/to/ghostscript-fonts.tar.gz -C /usr/local/share/ghostscript`
-
-For Debian Linux:
-
-- `sudo add-apt-repository ppa:dhor/myway`
-- `apt-get install imagemagick`
-- `apt-get install graphicsmagick`
-- `apt-get install ghostscript`
-
-For Windows and other Operating Systems, check the download instructions here:
-
-- http://imagemagick.org
-- http://www.graphicsmagick.org
-- http://www.ghostscript.com/
diff --git a/node_modules/rxjs/ReplaySubject.d.ts b/node_modules/rxjs/ReplaySubject.d.ts
deleted file mode 100644
index b66aea9..0000000
--- a/node_modules/rxjs/ReplaySubject.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/ReplaySubject';
diff --git a/node_modules/rxjs/ReplaySubject.js b/node_modules/rxjs/ReplaySubject.js
deleted file mode 100644
index 4c2bcf5..0000000
--- a/node_modules/rxjs/ReplaySubject.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/ReplaySubject"));
-//# sourceMappingURL=ReplaySubject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/ReplaySubject.js.map b/node_modules/rxjs/ReplaySubject.js.map
deleted file mode 100644
index f6e866e..0000000
--- a/node_modules/rxjs/ReplaySubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ReplaySubject.js","sources":["src/ReplaySubject.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/Rx.d.ts b/node_modules/rxjs/Rx.d.ts
deleted file mode 100644
index 5796fc6..0000000
--- a/node_modules/rxjs/Rx.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat';
diff --git a/node_modules/rxjs/Rx.js b/node_modules/rxjs/Rx.js
deleted file mode 100644
index 112c071..0000000
--- a/node_modules/rxjs/Rx.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat"));
-//# sourceMappingURL=Rx.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/Rx.js.map b/node_modules/rxjs/Rx.js.map
deleted file mode 100644
index 917f45e..0000000
--- a/node_modules/rxjs/Rx.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Rx.js","sources":["src/Rx.ts"],"names":[],"mappings":";;;;;AACA,iCAA4B"}
diff --git a/node_modules/rxjs/Scheduler.d.ts b/node_modules/rxjs/Scheduler.d.ts
deleted file mode 100644
index c21eb1f..0000000
--- a/node_modules/rxjs/Scheduler.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Scheduler';
diff --git a/node_modules/rxjs/Scheduler.js b/node_modules/rxjs/Scheduler.js
deleted file mode 100644
index c12359e..0000000
--- a/node_modules/rxjs/Scheduler.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/Scheduler"));
-//# sourceMappingURL=Scheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/Scheduler.js.map b/node_modules/rxjs/Scheduler.js.map
deleted file mode 100644
index 172522c..0000000
--- a/node_modules/rxjs/Scheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Scheduler.js","sources":["src/Scheduler.ts"],"names":[],"mappings":";;;;;AAAA,2CAAsC"}
diff --git a/node_modules/rxjs/Subject.d.ts b/node_modules/rxjs/Subject.d.ts
deleted file mode 100644
index 7448233..0000000
--- a/node_modules/rxjs/Subject.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Subject';
diff --git a/node_modules/rxjs/Subject.js b/node_modules/rxjs/Subject.js
deleted file mode 100644
index c57058f..0000000
--- a/node_modules/rxjs/Subject.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/Subject"));
-//# sourceMappingURL=Subject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/Subject.js.map b/node_modules/rxjs/Subject.js.map
deleted file mode 100644
index f587544..0000000
--- a/node_modules/rxjs/Subject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Subject.js","sources":["src/Subject.ts"],"names":[],"mappings":";;;;;AAAA,yCAAoC"}
diff --git a/node_modules/rxjs/SubjectSubscription.d.ts b/node_modules/rxjs/SubjectSubscription.d.ts
deleted file mode 100644
index 4f481ce..0000000
--- a/node_modules/rxjs/SubjectSubscription.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/SubjectSubscription';
diff --git a/node_modules/rxjs/SubjectSubscription.js b/node_modules/rxjs/SubjectSubscription.js
deleted file mode 100644
index e82afb1..0000000
--- a/node_modules/rxjs/SubjectSubscription.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/SubjectSubscription"));
-//# sourceMappingURL=SubjectSubscription.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/SubjectSubscription.js.map b/node_modules/rxjs/SubjectSubscription.js.map
deleted file mode 100644
index 15fa5b4..0000000
--- a/node_modules/rxjs/SubjectSubscription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubjectSubscription.js","sources":["src/SubjectSubscription.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/Subscriber.d.ts b/node_modules/rxjs/Subscriber.d.ts
deleted file mode 100644
index 15356d5..0000000
--- a/node_modules/rxjs/Subscriber.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Subscriber';
diff --git a/node_modules/rxjs/Subscriber.js b/node_modules/rxjs/Subscriber.js
deleted file mode 100644
index 79cfe91..0000000
--- a/node_modules/rxjs/Subscriber.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/Subscriber"));
-//# sourceMappingURL=Subscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/Subscriber.js.map b/node_modules/rxjs/Subscriber.js.map
deleted file mode 100644
index c566f0d..0000000
--- a/node_modules/rxjs/Subscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Subscriber.js","sources":["src/Subscriber.ts"],"names":[],"mappings":";;;;;AAAA,4CAAuC"}
diff --git a/node_modules/rxjs/Subscription.d.ts b/node_modules/rxjs/Subscription.d.ts
deleted file mode 100644
index 028cf4c..0000000
--- a/node_modules/rxjs/Subscription.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Subscription';
diff --git a/node_modules/rxjs/Subscription.js b/node_modules/rxjs/Subscription.js
deleted file mode 100644
index 0431872..0000000
--- a/node_modules/rxjs/Subscription.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/Subscription"));
-//# sourceMappingURL=Subscription.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/Subscription.js.map b/node_modules/rxjs/Subscription.js.map
deleted file mode 100644
index 948a0d9..0000000
--- a/node_modules/rxjs/Subscription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Subscription.js","sources":["src/Subscription.ts"],"names":[],"mappings":";;;;;AAAA,8CAAyC"}
diff --git a/node_modules/rxjs/_esm2015/LICENSE.txt b/node_modules/rxjs/_esm2015/LICENSE.txt
deleted file mode 100644
index 031ce38..0000000
--- a/node_modules/rxjs/_esm2015/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-                               Apache License
-                         Version 2.0, January 2004
-                      http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
-    "License" shall mean the terms and conditions for use, reproduction,
-    and distribution as defined by Sections 1 through 9 of this document.
-
-    "Licensor" shall mean the copyright owner or entity authorized by
-    the copyright owner that is granting the License.
-
-    "Legal Entity" shall mean the union of the acting entity and all
-    other entities that control, are controlled by, or are under common
-    control with that entity. For the purposes of this definition,
-    "control" means (i) the power, direct or indirect, to cause the
-    direction or management of such entity, whether by contract or
-    otherwise, or (ii) ownership of fifty percent (50%) or more of the
-    outstanding shares, or (iii) beneficial ownership of such entity.
-
-    "You" (or "Your") shall mean an individual or Legal Entity
-    exercising permissions granted by this License.
-
-    "Source" form shall mean the preferred form for making modifications,
-    including but not limited to software source code, documentation
-    source, and configuration files.
-
-    "Object" form shall mean any form resulting from mechanical
-    transformation or translation of a Source form, including but
-    not limited to compiled object code, generated documentation,
-    and conversions to other media types.
-
-    "Work" shall mean the work of authorship, whether in Source or
-    Object form, made available under the License, as indicated by a
-    copyright notice that is included in or attached to the work
-    (an example is provided in the Appendix below).
-
-    "Derivative Works" shall mean any work, whether in Source or Object
-    form, that is based on (or derived from) the Work and for which the
-    editorial revisions, annotations, elaborations, or other modifications
-    represent, as a whole, an original work of authorship. For the purposes
-    of this License, Derivative Works shall not include works that remain
-    separable from, or merely link (or bind by name) to the interfaces of,
-    the Work and Derivative Works thereof.
-
-    "Contribution" shall mean any work of authorship, including
-    the original version of the Work and any modifications or additions
-    to that Work or Derivative Works thereof, that is intentionally
-    submitted to Licensor for inclusion in the Work by the copyright owner
-    or by an individual or Legal Entity authorized to submit on behalf of
-    the copyright owner. For the purposes of this definition, "submitted"
-    means any form of electronic, verbal, or written communication sent
-    to the Licensor or its representatives, including but not limited to
-    communication on electronic mailing lists, source code control systems,
-    and issue tracking systems that are managed by, or on behalf of, the
-    Licensor for the purpose of discussing and improving the Work, but
-    excluding communication that is conspicuously marked or otherwise
-    designated in writing by the copyright owner as "Not a Contribution."
-
-    "Contributor" shall mean Licensor and any individual or Legal Entity
-    on behalf of whom a Contribution has been received by Licensor and
-    subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    copyright license to reproduce, prepare Derivative Works of,
-    publicly display, publicly perform, sublicense, and distribute the
-    Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    (except as stated in this section) patent license to make, have made,
-    use, offer to sell, sell, import, and otherwise transfer the Work,
-    where such license applies only to those patent claims licensable
-    by such Contributor that are necessarily infringed by their
-    Contribution(s) alone or by combination of their Contribution(s)
-    with the Work to which such Contribution(s) was submitted. If You
-    institute patent litigation against any entity (including a
-    cross-claim or counterclaim in a lawsuit) alleging that the Work
-    or a Contribution incorporated within the Work constitutes direct
-    or contributory patent infringement, then any patent licenses
-    granted to You under this License for that Work shall terminate
-    as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
-    Work or Derivative Works thereof in any medium, with or without
-    modifications, and in Source or Object form, provided that You
-    meet the following conditions:
-
-    (a) You must give any other recipients of the Work or
-        Derivative Works a copy of this License; and
-
-    (b) You must cause any modified files to carry prominent notices
-        stating that You changed the files; and
-
-    (c) You must retain, in the Source form of any Derivative Works
-        that You distribute, all copyright, patent, trademark, and
-        attribution notices from the Source form of the Work,
-        excluding those notices that do not pertain to any part of
-        the Derivative Works; and
-
-    (d) If the Work includes a "NOTICE" text file as part of its
-        distribution, then any Derivative Works that You distribute must
-        include a readable copy of the attribution notices contained
-        within such NOTICE file, excluding those notices that do not
-        pertain to any part of the Derivative Works, in at least one
-        of the following places: within a NOTICE text file distributed
-        as part of the Derivative Works; within the Source form or
-        documentation, if provided along with the Derivative Works; or,
-        within a display generated by the Derivative Works, if and
-        wherever such third-party notices normally appear. The contents
-        of the NOTICE file are for informational purposes only and
-        do not modify the License. You may add Your own attribution
-        notices within Derivative Works that You distribute, alongside
-        or as an addendum to the NOTICE text from the Work, provided
-        that such additional attribution notices cannot be construed
-        as modifying the License.
-
-    You may add Your own copyright statement to Your modifications and
-    may provide additional or different license terms and conditions
-    for use, reproduction, or distribution of Your modifications, or
-    for any such Derivative Works as a whole, provided Your use,
-    reproduction, and distribution of the Work otherwise complies with
-    the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
-    any Contribution intentionally submitted for inclusion in the Work
-    by You to the Licensor shall be under the terms and conditions of
-    this License, without any additional terms or conditions.
-    Notwithstanding the above, nothing herein shall supersede or modify
-    the terms of any separate license agreement you may have executed
-    with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
-    names, trademarks, service marks, or product names of the Licensor,
-    except as required for reasonable and customary use in describing the
-    origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
-    agreed to in writing, Licensor provides the Work (and each
-    Contributor provides its Contributions) on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-    implied, including, without limitation, any warranties or conditions
-    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-    PARTICULAR PURPOSE. You are solely responsible for determining the
-    appropriateness of using or redistributing the Work and assume any
-    risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
-    whether in tort (including negligence), contract, or otherwise,
-    unless required by applicable law (such as deliberate and grossly
-    negligent acts) or agreed to in writing, shall any Contributor be
-    liable to You for damages, including any direct, indirect, special,
-    incidental, or consequential damages of any character arising as a
-    result of this License or out of the use or inability to use the
-    Work (including but not limited to damages for loss of goodwill,
-    work stoppage, computer failure or malfunction, or any and all
-    other commercial damages or losses), even if such Contributor
-    has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
-    the Work or Derivative Works thereof, You may choose to offer,
-    and charge a fee for, acceptance of support, warranty, indemnity,
-    or other liability obligations and/or rights consistent with this
-    License. However, in accepting such obligations, You may act only
-    on Your own behalf and on Your sole responsibility, not on behalf
-    of any other Contributor, and only if You agree to indemnify,
-    defend, and hold each Contributor harmless for any liability
-    incurred by, or claims asserted against, such Contributor by reason
-    of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
-    To apply the Apache License to your work, attach the following
-    boilerplate notice, with the fields enclosed by brackets "[]"
-    replaced with your own identifying information. (Don't include
-    the brackets!)  The text should be enclosed in the appropriate
-    comment syntax for the file format. We also recommend that a
-    file or class name and description of purpose be included on the
-    same "printed page" as the copyright notice for easier
-    identification within third-party archives.
-
- Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- 
diff --git a/node_modules/rxjs/_esm2015/README.md b/node_modules/rxjs/_esm2015/README.md
deleted file mode 100644
index e9204f0..0000000
--- a/node_modules/rxjs/_esm2015/README.md
+++ /dev/null
@@ -1,145 +0,0 @@
-<img src="doc/asset/Rx_Logo_S.png" alt="RxJS Logo" width="86" height="86"> RxJS: Reactive Extensions For JavaScript
-======================================
-
-
-[![CircleCI](https://circleci.com/gh/ReactiveX/rxjs/tree/6.x.svg?style=svg)](https://circleci.com/gh/ReactiveX/rxjs/tree/6.x)
-[![npm version](https://badge.fury.io/js/%40reactivex%2Frxjs.svg)](http://badge.fury.io/js/%40reactivex%2Frxjs)
-[![Join the chat at https://gitter.im/Reactive-Extensions/RxJS](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Reactive-Extensions/RxJS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-# RxJS 6 Stable
-
-### MIGRATION AND RELEASE INFORMATION:
-
-Find out how to update to v6, **automatically update your TypeScript code**, and more!
-
-- [Current home is MIGRATION.md](./docs_app/content/guide/v6/migration.md)
-
-### FOR V 5.X PLEASE GO TO [THE 5.0 BRANCH](https://github.com/ReactiveX/rxjs/tree/5.x)
-
-Reactive Extensions Library for JavaScript. This is a rewrite of [Reactive-Extensions/RxJS](https://github.com/Reactive-Extensions/RxJS) and is the latest production-ready version of RxJS. This rewrite is meant to have better performance, better modularity, better debuggable call stacks, while staying mostly backwards compatible, with some breaking changes that reduce the API surface.
-
-[Apache 2.0 License](LICENSE.txt)
-
-- [Code of Conduct](CODE_OF_CONDUCT.md)
-- [Contribution Guidelines](CONTRIBUTING.md)
-- [Maintainer Guidelines](doc/maintainer-guidelines.md)
-- [Creating Operators](doc/operator-creation.md)
-- [API Documentation (WIP)](https://rxjs.dev/)
-
-## Versions In This Repository
-
-- [master](https://github.com/ReactiveX/rxjs/commits/master) - This is all of the current, unreleased work, which is against v6 of RxJS right now
-- [stable](https://github.com/ReactiveX/rxjs/commits/stable) - This is the branch for the latest version you'd get if you do `npm install rxjs`
-
-## Important
-
-By contributing or commenting on issues in this repository, whether you've read them or not, you're agreeing to the [Contributor Code of Conduct](CODE_OF_CONDUCT.md). Much like traffic laws, ignorance doesn't grant you immunity.
-
-## Installation and Usage
-
-### ES6 via npm
-
-```sh
-npm install rxjs
-```
-
-It's recommended to pull in the Observable creation methods you need directly from `'rxjs'` as shown below with `range`. And you can pull in any operator you need from one spot, under `'rxjs/operators'`.
-
-```js
-import { range } from 'rxjs';
-import { map, filter } from 'rxjs/operators';
-
-range(1, 200).pipe(
-  filter(x => x % 2 === 1),
-  map(x => x + x)
-).subscribe(x => console.log(x));
-```
-
-Here, we're using the built-in `pipe` method on Observables to combine operators. See [pipeable operators](https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md) for more information.
-
-### CommonJS via npm
-
-To install this library for CommonJS (CJS) usage, use the following command:
-
-```sh
-npm install rxjs
-```
-
-(Note: destructuring available in Node 8+)
-
-```js
-const { range } = require('rxjs');
-const { map, filter } = require('rxjs/operators');
-
-range(1, 200).pipe(
-  filter(x => x % 2 === 1),
-  map(x => x + x)
-).subscribe(x => console.log(x));
-```
-
-### CDN
-
-For CDN, you can use [unpkg](https://unpkg.com/):
-
-https://unpkg.com/rxjs/bundles/rxjs.umd.min.js
-
-The global namespace for rxjs is `rxjs`:
-
-```js
-const { range } = rxjs;
-const { map, filter } = rxjs.operators;
-
-range(1, 200).pipe(
-  filter(x => x % 2 === 1),
-  map(x => x + x)
-).subscribe(x => console.log(x));
-```
-
-## Goals
-
-- Smaller overall bundles sizes
-- Provide better performance than preceding versions of RxJS
-- To model/follow the [Observable Spec Proposal](https://github.com/zenparsing/es-observable) to the observable
-- Provide more modular file structure in a variety of formats
-- Provide more debuggable call stacks than preceding versions of RxJS
-
-## Building/Testing
-
-- `npm run build_all` - builds everything
-- `npm test` - runs tests
-- `npm run test_no_cache` - run test with `ts-node` set to false
-
-## Performance Tests
-
-Run `npm run build_perf` or `npm run perf` to run the performance tests with `protractor`.
-
-Run `npm run perf_micro [operator]` to run micro performance test benchmarking operator.
-
-## Adding documentation
-We appreciate all contributions to the documentation of any type. All of the information needed to get the docs app up and running locally as well as how to contribute can be found in the [documentation directory](./docs_app).
-
-## Generating PNG marble diagrams
-
-The script `npm run tests2png` requires some native packages installed locally: `imagemagick`, `graphicsmagick`, and `ghostscript`.
-
-For Mac OS X with [Homebrew](http://brew.sh/):
-
-- `brew install imagemagick`
-- `brew install graphicsmagick`
-- `brew install ghostscript`
-- You may need to install the Ghostscript fonts manually:
-  - Download the tarball from the [gs-fonts project](https://sourceforge.net/projects/gs-fonts)
-  - `mkdir -p /usr/local/share/ghostscript && tar zxvf /path/to/ghostscript-fonts.tar.gz -C /usr/local/share/ghostscript`
-
-For Debian Linux:
-
-- `sudo add-apt-repository ppa:dhor/myway`
-- `apt-get install imagemagick`
-- `apt-get install graphicsmagick`
-- `apt-get install ghostscript`
-
-For Windows and other Operating Systems, check the download instructions here:
-
-- http://imagemagick.org
-- http://www.graphicsmagick.org
-- http://www.ghostscript.com/
diff --git a/node_modules/rxjs/_esm2015/ajax/index.js b/node_modules/rxjs/_esm2015/ajax/index.js
deleted file mode 100644
index 6d17439..0000000
--- a/node_modules/rxjs/_esm2015/ajax/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export { ajax } from '../internal/observable/dom/ajax';
-export { AjaxResponse, AjaxError, AjaxTimeoutError } from '../internal/observable/dom/AjaxObservable';
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/ajax/index.js.map b/node_modules/rxjs/_esm2015/ajax/index.js.map
deleted file mode 100644
index 038e2b1..0000000
--- a/node_modules/rxjs/_esm2015/ajax/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/ajax/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AACvD,OAAO,EAAe,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/fetch/index.js b/node_modules/rxjs/_esm2015/fetch/index.js
deleted file mode 100644
index e851987..0000000
--- a/node_modules/rxjs/_esm2015/fetch/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-export { fromFetch } from '../internal/observable/dom/fetch';
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/fetch/index.js.map b/node_modules/rxjs/_esm2015/fetch/index.js.map
deleted file mode 100644
index 8bf783b..0000000
--- a/node_modules/rxjs/_esm2015/fetch/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/fetch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/index.js b/node_modules/rxjs/_esm2015/index.js
deleted file mode 100644
index a8a925e..0000000
--- a/node_modules/rxjs/_esm2015/index.js
+++ /dev/null
@@ -1,56 +0,0 @@
-export { Observable } from './internal/Observable';
-export { ConnectableObservable } from './internal/observable/ConnectableObservable';
-export { GroupedObservable } from './internal/operators/groupBy';
-export { observable } from './internal/symbol/observable';
-export { Subject } from './internal/Subject';
-export { BehaviorSubject } from './internal/BehaviorSubject';
-export { ReplaySubject } from './internal/ReplaySubject';
-export { AsyncSubject } from './internal/AsyncSubject';
-export { asap as asapScheduler } from './internal/scheduler/asap';
-export { async as asyncScheduler } from './internal/scheduler/async';
-export { queue as queueScheduler } from './internal/scheduler/queue';
-export { animationFrame as animationFrameScheduler } from './internal/scheduler/animationFrame';
-export { VirtualTimeScheduler, VirtualAction } from './internal/scheduler/VirtualTimeScheduler';
-export { Scheduler } from './internal/Scheduler';
-export { Subscription } from './internal/Subscription';
-export { Subscriber } from './internal/Subscriber';
-export { Notification, NotificationKind } from './internal/Notification';
-export { pipe } from './internal/util/pipe';
-export { noop } from './internal/util/noop';
-export { identity } from './internal/util/identity';
-export { isObservable } from './internal/util/isObservable';
-export { ArgumentOutOfRangeError } from './internal/util/ArgumentOutOfRangeError';
-export { EmptyError } from './internal/util/EmptyError';
-export { ObjectUnsubscribedError } from './internal/util/ObjectUnsubscribedError';
-export { UnsubscriptionError } from './internal/util/UnsubscriptionError';
-export { TimeoutError } from './internal/util/TimeoutError';
-export { bindCallback } from './internal/observable/bindCallback';
-export { bindNodeCallback } from './internal/observable/bindNodeCallback';
-export { combineLatest } from './internal/observable/combineLatest';
-export { concat } from './internal/observable/concat';
-export { defer } from './internal/observable/defer';
-export { empty } from './internal/observable/empty';
-export { forkJoin } from './internal/observable/forkJoin';
-export { from } from './internal/observable/from';
-export { fromEvent } from './internal/observable/fromEvent';
-export { fromEventPattern } from './internal/observable/fromEventPattern';
-export { generate } from './internal/observable/generate';
-export { iif } from './internal/observable/iif';
-export { interval } from './internal/observable/interval';
-export { merge } from './internal/observable/merge';
-export { never } from './internal/observable/never';
-export { of } from './internal/observable/of';
-export { onErrorResumeNext } from './internal/observable/onErrorResumeNext';
-export { pairs } from './internal/observable/pairs';
-export { partition } from './internal/observable/partition';
-export { race } from './internal/observable/race';
-export { range } from './internal/observable/range';
-export { throwError } from './internal/observable/throwError';
-export { timer } from './internal/observable/timer';
-export { using } from './internal/observable/using';
-export { zip } from './internal/observable/zip';
-export { scheduled } from './internal/scheduled/scheduled';
-export { EMPTY } from './internal/observable/empty';
-export { NEVER } from './internal/observable/never';
-export { config } from './internal/config';
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/index.js.map b/node_modules/rxjs/_esm2015/index.js.map
deleted file mode 100644
index 35faa43..0000000
--- a/node_modules/rxjs/_esm2015/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../src/index.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal-compatibility/index.js b/node_modules/rxjs/_esm2015/internal-compatibility/index.js
deleted file mode 100644
index 0461e19..0000000
--- a/node_modules/rxjs/_esm2015/internal-compatibility/index.js
+++ /dev/null
@@ -1,56 +0,0 @@
-export { config } from '../internal/config';
-export { InnerSubscriber } from '../internal/InnerSubscriber';
-export { OuterSubscriber } from '../internal/OuterSubscriber';
-export { Scheduler } from '../internal/Scheduler';
-export { AnonymousSubject } from '../internal/Subject';
-export { SubjectSubscription } from '../internal/SubjectSubscription';
-export { Subscriber } from '../internal/Subscriber';
-export { fromPromise } from '../internal/observable/fromPromise';
-export { fromIterable } from '../internal/observable/fromIterable';
-export { ajax } from '../internal/observable/dom/ajax';
-export { webSocket } from '../internal/observable/dom/webSocket';
-export { ajaxGet, ajaxPost, ajaxDelete, ajaxPut, ajaxPatch, ajaxGetJSON, AjaxObservable, AjaxSubscriber, AjaxResponse, AjaxError, AjaxTimeoutError } from '../internal/observable/dom/AjaxObservable';
-export { WebSocketSubject } from '../internal/observable/dom/WebSocketSubject';
-export { CombineLatestOperator } from '../internal/observable/combineLatest';
-export { dispatch } from '../internal/observable/range';
-export { SubscribeOnObservable } from '../internal/observable/SubscribeOnObservable';
-export { Timestamp } from '../internal/operators/timestamp';
-export { TimeInterval } from '../internal/operators/timeInterval';
-export { GroupedObservable } from '../internal/operators/groupBy';
-export { defaultThrottleConfig } from '../internal/operators/throttle';
-export { rxSubscriber } from '../internal/symbol/rxSubscriber';
-export { iterator } from '../internal/symbol/iterator';
-export { observable } from '../internal/symbol/observable';
-export { ArgumentOutOfRangeError } from '../internal/util/ArgumentOutOfRangeError';
-export { EmptyError } from '../internal/util/EmptyError';
-export { Immediate } from '../internal/util/Immediate';
-export { ObjectUnsubscribedError } from '../internal/util/ObjectUnsubscribedError';
-export { TimeoutError } from '../internal/util/TimeoutError';
-export { UnsubscriptionError } from '../internal/util/UnsubscriptionError';
-export { applyMixins } from '../internal/util/applyMixins';
-export { errorObject } from '../internal/util/errorObject';
-export { hostReportError } from '../internal/util/hostReportError';
-export { identity } from '../internal/util/identity';
-export { isArray } from '../internal/util/isArray';
-export { isArrayLike } from '../internal/util/isArrayLike';
-export { isDate } from '../internal/util/isDate';
-export { isFunction } from '../internal/util/isFunction';
-export { isIterable } from '../internal/util/isIterable';
-export { isNumeric } from '../internal/util/isNumeric';
-export { isObject } from '../internal/util/isObject';
-export { isInteropObservable as isObservable } from '../internal/util/isInteropObservable';
-export { isPromise } from '../internal/util/isPromise';
-export { isScheduler } from '../internal/util/isScheduler';
-export { noop } from '../internal/util/noop';
-export { not } from '../internal/util/not';
-export { pipe } from '../internal/util/pipe';
-export { root } from '../internal/util/root';
-export { subscribeTo } from '../internal/util/subscribeTo';
-export { subscribeToArray } from '../internal/util/subscribeToArray';
-export { subscribeToIterable } from '../internal/util/subscribeToIterable';
-export { subscribeToObservable } from '../internal/util/subscribeToObservable';
-export { subscribeToPromise } from '../internal/util/subscribeToPromise';
-export { subscribeToResult } from '../internal/util/subscribeToResult';
-export { toSubscriber } from '../internal/util/toSubscriber';
-export { tryCatch } from '../internal/util/tryCatch';
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal-compatibility/index.js.map b/node_modules/rxjs/_esm2015/internal-compatibility/index.js.map
deleted file mode 100644
index 9de2eb9..0000000
--- a/node_modules/rxjs/_esm2015/internal-compatibility/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/internal-compatibility/index.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/AsyncSubject.js b/node_modules/rxjs/_esm2015/internal/AsyncSubject.js
deleted file mode 100644
index 5365f5a..0000000
--- a/node_modules/rxjs/_esm2015/internal/AsyncSubject.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import { Subject } from './Subject';
-import { Subscription } from './Subscription';
-export class AsyncSubject extends Subject {
-    constructor() {
-        super(...arguments);
-        this.value = null;
-        this.hasNext = false;
-        this.hasCompleted = false;
-    }
-    _subscribe(subscriber) {
-        if (this.hasError) {
-            subscriber.error(this.thrownError);
-            return Subscription.EMPTY;
-        }
-        else if (this.hasCompleted && this.hasNext) {
-            subscriber.next(this.value);
-            subscriber.complete();
-            return Subscription.EMPTY;
-        }
-        return super._subscribe(subscriber);
-    }
-    next(value) {
-        if (!this.hasCompleted) {
-            this.value = value;
-            this.hasNext = true;
-        }
-    }
-    error(error) {
-        if (!this.hasCompleted) {
-            super.error(error);
-        }
-    }
-    complete() {
-        this.hasCompleted = true;
-        if (this.hasNext) {
-            super.next(this.value);
-        }
-        super.complete();
-    }
-}
-//# sourceMappingURL=AsyncSubject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/AsyncSubject.js.map b/node_modules/rxjs/_esm2015/internal/AsyncSubject.js.map
deleted file mode 100644
index a99b981..0000000
--- a/node_modules/rxjs/_esm2015/internal/AsyncSubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsyncSubject.js","sources":["../../src/internal/AsyncSubject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQ9C,MAAM,OAAO,YAAgB,SAAQ,OAAU;IAA/C;;QACU,UAAK,GAAM,IAAI,CAAC;QAChB,YAAO,GAAY,KAAK,CAAC;QACzB,iBAAY,GAAY,KAAK,CAAC;IAmCxC,CAAC;IAhCC,UAAU,CAAC,UAA2B;QACpC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnC,OAAO,YAAY,CAAC,KAAK,CAAC;SAC3B;aAAM,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE;YAC5C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,UAAU,CAAC,QAAQ,EAAE,CAAC;YACtB,OAAO,YAAY,CAAC,KAAK,CAAC;SAC3B;QACD,OAAO,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,KAAQ;QACX,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;SACrB;IACH,CAAC;IAED,KAAK,CAAC,KAAU;QACd,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACpB;IACH,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACxB;QACD,KAAK,CAAC,QAAQ,EAAE,CAAC;IACnB,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/BehaviorSubject.js b/node_modules/rxjs/_esm2015/internal/BehaviorSubject.js
deleted file mode 100644
index c7d77aa..0000000
--- a/node_modules/rxjs/_esm2015/internal/BehaviorSubject.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import { Subject } from './Subject';
-import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
-export class BehaviorSubject extends Subject {
-    constructor(_value) {
-        super();
-        this._value = _value;
-    }
-    get value() {
-        return this.getValue();
-    }
-    _subscribe(subscriber) {
-        const subscription = super._subscribe(subscriber);
-        if (subscription && !subscription.closed) {
-            subscriber.next(this._value);
-        }
-        return subscription;
-    }
-    getValue() {
-        if (this.hasError) {
-            throw this.thrownError;
-        }
-        else if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        else {
-            return this._value;
-        }
-    }
-    next(value) {
-        super.next(this._value = value);
-    }
-}
-//# sourceMappingURL=BehaviorSubject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/BehaviorSubject.js.map b/node_modules/rxjs/_esm2015/internal/BehaviorSubject.js.map
deleted file mode 100644
index d8d3d5e..0000000
--- a/node_modules/rxjs/_esm2015/internal/BehaviorSubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"BehaviorSubject.js","sources":["../../src/internal/BehaviorSubject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAQzE,MAAM,OAAO,eAAmB,SAAQ,OAAU;IAEhD,YAAoB,MAAS;QAC3B,KAAK,EAAE,CAAC;QADU,WAAM,GAAN,MAAM,CAAG;IAE7B,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAGD,UAAU,CAAC,UAAyB;QAClC,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,YAAY,IAAI,CAAoB,YAAa,CAAC,MAAM,EAAE;YAC5D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC9B;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,IAAI,CAAC,WAAW,CAAC;SACxB;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE;YACtB,MAAM,IAAI,uBAAuB,EAAE,CAAC;SACrC;aAAM;YACL,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;IACH,CAAC;IAED,IAAI,CAAC,KAAQ;QACX,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IAClC,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/InnerSubscriber.js b/node_modules/rxjs/_esm2015/internal/InnerSubscriber.js
deleted file mode 100644
index 1c7b4c7..0000000
--- a/node_modules/rxjs/_esm2015/internal/InnerSubscriber.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Subscriber } from './Subscriber';
-export class InnerSubscriber extends Subscriber {
-    constructor(parent, outerValue, outerIndex) {
-        super();
-        this.parent = parent;
-        this.outerValue = outerValue;
-        this.outerIndex = outerIndex;
-        this.index = 0;
-    }
-    _next(value) {
-        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
-    }
-    _error(error) {
-        this.parent.notifyError(error, this);
-        this.unsubscribe();
-    }
-    _complete() {
-        this.parent.notifyComplete(this);
-        this.unsubscribe();
-    }
-}
-//# sourceMappingURL=InnerSubscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/InnerSubscriber.js.map b/node_modules/rxjs/_esm2015/internal/InnerSubscriber.js.map
deleted file mode 100644
index 2c4a906..0000000
--- a/node_modules/rxjs/_esm2015/internal/InnerSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"InnerSubscriber.js","sources":["../../src/internal/InnerSubscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ1C,MAAM,OAAO,eAAsB,SAAQ,UAAa;IAGtD,YAAoB,MAA6B,EAAS,UAAa,EAAS,UAAkB;QAChG,KAAK,EAAE,CAAC;QADU,WAAM,GAAN,MAAM,CAAuB;QAAS,eAAU,GAAV,UAAU,CAAG;QAAS,eAAU,GAAV,UAAU,CAAQ;QAF1F,UAAK,GAAG,CAAC,CAAC;IAIlB,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;IACtF,CAAC;IAES,MAAM,CAAC,KAAU;QACzB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/Notification.js b/node_modules/rxjs/_esm2015/internal/Notification.js
deleted file mode 100644
index 29713d0..0000000
--- a/node_modules/rxjs/_esm2015/internal/Notification.js
+++ /dev/null
@@ -1,73 +0,0 @@
-import { empty } from './observable/empty';
-import { of } from './observable/of';
-import { throwError } from './observable/throwError';
-export var NotificationKind;
-(function (NotificationKind) {
-    NotificationKind["NEXT"] = "N";
-    NotificationKind["ERROR"] = "E";
-    NotificationKind["COMPLETE"] = "C";
-})(NotificationKind || (NotificationKind = {}));
-export class Notification {
-    constructor(kind, value, error) {
-        this.kind = kind;
-        this.value = value;
-        this.error = error;
-        this.hasValue = kind === 'N';
-    }
-    observe(observer) {
-        switch (this.kind) {
-            case 'N':
-                return observer.next && observer.next(this.value);
-            case 'E':
-                return observer.error && observer.error(this.error);
-            case 'C':
-                return observer.complete && observer.complete();
-        }
-    }
-    do(next, error, complete) {
-        const kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return next && next(this.value);
-            case 'E':
-                return error && error(this.error);
-            case 'C':
-                return complete && complete();
-        }
-    }
-    accept(nextOrObserver, error, complete) {
-        if (nextOrObserver && typeof nextOrObserver.next === 'function') {
-            return this.observe(nextOrObserver);
-        }
-        else {
-            return this.do(nextOrObserver, error, complete);
-        }
-    }
-    toObservable() {
-        const kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return of(this.value);
-            case 'E':
-                return throwError(this.error);
-            case 'C':
-                return empty();
-        }
-        throw new Error('unexpected notification kind value');
-    }
-    static createNext(value) {
-        if (typeof value !== 'undefined') {
-            return new Notification('N', value);
-        }
-        return Notification.undefinedValueNotification;
-    }
-    static createError(err) {
-        return new Notification('E', undefined, err);
-    }
-    static createComplete() {
-        return Notification.completeNotification;
-    }
-}
-Notification.completeNotification = new Notification('C');
-Notification.undefinedValueNotification = new Notification('N', undefined);
-//# sourceMappingURL=Notification.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/Notification.js.map b/node_modules/rxjs/_esm2015/internal/Notification.js.map
deleted file mode 100644
index eb38dbf..0000000
--- a/node_modules/rxjs/_esm2015/internal/Notification.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Notification.js","sources":["../../src/internal/Notification.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/Observable.js b/node_modules/rxjs/_esm2015/internal/Observable.js
deleted file mode 100644
index 4904b3f..0000000
--- a/node_modules/rxjs/_esm2015/internal/Observable.js
+++ /dev/null
@@ -1,107 +0,0 @@
-import { canReportError } from './util/canReportError';
-import { toSubscriber } from './util/toSubscriber';
-import { observable as Symbol_observable } from './symbol/observable';
-import { pipeFromArray } from './util/pipe';
-import { config } from './config';
-export class Observable {
-    constructor(subscribe) {
-        this._isScalar = false;
-        if (subscribe) {
-            this._subscribe = subscribe;
-        }
-    }
-    lift(operator) {
-        const observable = new Observable();
-        observable.source = this;
-        observable.operator = operator;
-        return observable;
-    }
-    subscribe(observerOrNext, error, complete) {
-        const { operator } = this;
-        const sink = toSubscriber(observerOrNext, error, complete);
-        if (operator) {
-            sink.add(operator.call(sink, this.source));
-        }
-        else {
-            sink.add(this.source || (config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?
-                this._subscribe(sink) :
-                this._trySubscribe(sink));
-        }
-        if (config.useDeprecatedSynchronousErrorHandling) {
-            if (sink.syncErrorThrowable) {
-                sink.syncErrorThrowable = false;
-                if (sink.syncErrorThrown) {
-                    throw sink.syncErrorValue;
-                }
-            }
-        }
-        return sink;
-    }
-    _trySubscribe(sink) {
-        try {
-            return this._subscribe(sink);
-        }
-        catch (err) {
-            if (config.useDeprecatedSynchronousErrorHandling) {
-                sink.syncErrorThrown = true;
-                sink.syncErrorValue = err;
-            }
-            if (canReportError(sink)) {
-                sink.error(err);
-            }
-            else {
-                console.warn(err);
-            }
-        }
-    }
-    forEach(next, promiseCtor) {
-        promiseCtor = getPromiseCtor(promiseCtor);
-        return new promiseCtor((resolve, reject) => {
-            let subscription;
-            subscription = this.subscribe((value) => {
-                try {
-                    next(value);
-                }
-                catch (err) {
-                    reject(err);
-                    if (subscription) {
-                        subscription.unsubscribe();
-                    }
-                }
-            }, reject, resolve);
-        });
-    }
-    _subscribe(subscriber) {
-        const { source } = this;
-        return source && source.subscribe(subscriber);
-    }
-    [Symbol_observable]() {
-        return this;
-    }
-    pipe(...operations) {
-        if (operations.length === 0) {
-            return this;
-        }
-        return pipeFromArray(operations)(this);
-    }
-    toPromise(promiseCtor) {
-        promiseCtor = getPromiseCtor(promiseCtor);
-        return new promiseCtor((resolve, reject) => {
-            let value;
-            this.subscribe((x) => value = x, (err) => reject(err), () => resolve(value));
-        });
-    }
-}
-Observable.create = (subscribe) => {
-    return new Observable(subscribe);
-};
-function getPromiseCtor(promiseCtor) {
-    if (!promiseCtor) {
-        promiseCtor = config.Promise || Promise;
-    }
-    if (!promiseCtor) {
-        throw new Error('no Promise impl found');
-    }
-    return promiseCtor;
-}
-//# sourceMappingURL=Observable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/Observable.js.map b/node_modules/rxjs/_esm2015/internal/Observable.js.map
deleted file mode 100644
index 32197d0..0000000
--- a/node_modules/rxjs/_esm2015/internal/Observable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Observable.js","sources":["../../src/internal/Observable.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/Observer.js b/node_modules/rxjs/_esm2015/internal/Observer.js
deleted file mode 100644
index 22a6aca..0000000
--- a/node_modules/rxjs/_esm2015/internal/Observer.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { config } from './config';
-import { hostReportError } from './util/hostReportError';
-export const empty = {
-    closed: true,
-    next(value) { },
-    error(err) {
-        if (config.useDeprecatedSynchronousErrorHandling) {
-            throw err;
-        }
-        else {
-            hostReportError(err);
-        }
-    },
-    complete() { }
-};
-//# sourceMappingURL=Observer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/Observer.js.map b/node_modules/rxjs/_esm2015/internal/Observer.js.map
deleted file mode 100644
index cf2a2d3..0000000
--- a/node_modules/rxjs/_esm2015/internal/Observer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Observer.js","sources":["../../src/internal/Observer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,CAAC,MAAM,KAAK,GAAkB;IAClC,MAAM,EAAE,IAAI;IACZ,IAAI,CAAC,KAAU,IAAoB,CAAC;IACpC,KAAK,CAAC,GAAQ;QACZ,IAAI,MAAM,CAAC,qCAAqC,EAAE;YAChD,MAAM,GAAG,CAAC;SACX;aAAM;YACL,eAAe,CAAC,GAAG,CAAC,CAAC;SACtB;IACH,CAAC;IACD,QAAQ,KAAoB,CAAC;CAC9B,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/Operator.js b/node_modules/rxjs/_esm2015/internal/Operator.js
deleted file mode 100644
index 463a42e..0000000
--- a/node_modules/rxjs/_esm2015/internal/Operator.js
+++ /dev/null
@@ -1 +0,0 @@
-//# sourceMappingURL=Operator.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/Operator.js.map b/node_modules/rxjs/_esm2015/internal/Operator.js.map
deleted file mode 100644
index f45f5ad..0000000
--- a/node_modules/rxjs/_esm2015/internal/Operator.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Operator.js","sources":["../../src/internal/Operator.ts"],"names":[],"mappings":""}
diff --git a/node_modules/rxjs/_esm2015/internal/OuterSubscriber.js b/node_modules/rxjs/_esm2015/internal/OuterSubscriber.js
deleted file mode 100644
index fa93e84..0000000
--- a/node_modules/rxjs/_esm2015/internal/OuterSubscriber.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Subscriber } from './Subscriber';
-export class OuterSubscriber extends Subscriber {
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    }
-    notifyError(error, innerSub) {
-        this.destination.error(error);
-    }
-    notifyComplete(innerSub) {
-        this.destination.complete();
-    }
-}
-//# sourceMappingURL=OuterSubscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/OuterSubscriber.js.map b/node_modules/rxjs/_esm2015/internal/OuterSubscriber.js.map
deleted file mode 100644
index 41b6683..0000000
--- a/node_modules/rxjs/_esm2015/internal/OuterSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"OuterSubscriber.js","sources":["../../src/internal/OuterSubscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ1C,MAAM,OAAO,eAAsB,SAAQ,UAAa;IACtD,UAAU,CAAC,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAED,WAAW,CAAC,KAAU,EAAE,QAA+B;QACrD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,cAAc,CAAC,QAA+B;QAC5C,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/ReplaySubject.js b/node_modules/rxjs/_esm2015/internal/ReplaySubject.js
deleted file mode 100644
index 2acf607..0000000
--- a/node_modules/rxjs/_esm2015/internal/ReplaySubject.js
+++ /dev/null
@@ -1,104 +0,0 @@
-import { Subject } from './Subject';
-import { queue } from './scheduler/queue';
-import { Subscription } from './Subscription';
-import { ObserveOnSubscriber } from './operators/observeOn';
-import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
-import { SubjectSubscription } from './SubjectSubscription';
-export class ReplaySubject extends Subject {
-    constructor(bufferSize = Number.POSITIVE_INFINITY, windowTime = Number.POSITIVE_INFINITY, scheduler) {
-        super();
-        this.scheduler = scheduler;
-        this._events = [];
-        this._infiniteTimeWindow = false;
-        this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
-        this._windowTime = windowTime < 1 ? 1 : windowTime;
-        if (windowTime === Number.POSITIVE_INFINITY) {
-            this._infiniteTimeWindow = true;
-            this.next = this.nextInfiniteTimeWindow;
-        }
-        else {
-            this.next = this.nextTimeWindow;
-        }
-    }
-    nextInfiniteTimeWindow(value) {
-        const _events = this._events;
-        _events.push(value);
-        if (_events.length > this._bufferSize) {
-            _events.shift();
-        }
-        super.next(value);
-    }
-    nextTimeWindow(value) {
-        this._events.push(new ReplayEvent(this._getNow(), value));
-        this._trimBufferThenGetEvents();
-        super.next(value);
-    }
-    _subscribe(subscriber) {
-        const _infiniteTimeWindow = this._infiniteTimeWindow;
-        const _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();
-        const scheduler = this.scheduler;
-        const len = _events.length;
-        let subscription;
-        if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        else if (this.isStopped || this.hasError) {
-            subscription = Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            subscription = new SubjectSubscription(this, subscriber);
-        }
-        if (scheduler) {
-            subscriber.add(subscriber = new ObserveOnSubscriber(subscriber, scheduler));
-        }
-        if (_infiniteTimeWindow) {
-            for (let i = 0; i < len && !subscriber.closed; i++) {
-                subscriber.next(_events[i]);
-            }
-        }
-        else {
-            for (let i = 0; i < len && !subscriber.closed; i++) {
-                subscriber.next(_events[i].value);
-            }
-        }
-        if (this.hasError) {
-            subscriber.error(this.thrownError);
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-        }
-        return subscription;
-    }
-    _getNow() {
-        return (this.scheduler || queue).now();
-    }
-    _trimBufferThenGetEvents() {
-        const now = this._getNow();
-        const _bufferSize = this._bufferSize;
-        const _windowTime = this._windowTime;
-        const _events = this._events;
-        const eventsCount = _events.length;
-        let spliceCount = 0;
-        while (spliceCount < eventsCount) {
-            if ((now - _events[spliceCount].time) < _windowTime) {
-                break;
-            }
-            spliceCount++;
-        }
-        if (eventsCount > _bufferSize) {
-            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);
-        }
-        if (spliceCount > 0) {
-            _events.splice(0, spliceCount);
-        }
-        return _events;
-    }
-}
-class ReplayEvent {
-    constructor(time, value) {
-        this.time = time;
-        this.value = value;
-    }
-}
-//# sourceMappingURL=ReplaySubject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/ReplaySubject.js.map b/node_modules/rxjs/_esm2015/internal/ReplaySubject.js.map
deleted file mode 100644
index 24c5cc3..0000000
--- a/node_modules/rxjs/_esm2015/internal/ReplaySubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ReplaySubject.js","sources":["../../src/internal/ReplaySubject.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/Rx.js b/node_modules/rxjs/_esm2015/internal/Rx.js
deleted file mode 100644
index 1bbe29c..0000000
--- a/node_modules/rxjs/_esm2015/internal/Rx.js
+++ /dev/null
@@ -1,172 +0,0 @@
-export { Subject, AnonymousSubject } from './Subject';
-export { Observable } from './Observable';
-export { config } from './config';
-import 'rxjs-compat/add/observable/bindCallback';
-import 'rxjs-compat/add/observable/bindNodeCallback';
-import 'rxjs-compat/add/observable/combineLatest';
-import 'rxjs-compat/add/observable/concat';
-import 'rxjs-compat/add/observable/defer';
-import 'rxjs-compat/add/observable/empty';
-import 'rxjs-compat/add/observable/forkJoin';
-import 'rxjs-compat/add/observable/from';
-import 'rxjs-compat/add/observable/fromEvent';
-import 'rxjs-compat/add/observable/fromEventPattern';
-import 'rxjs-compat/add/observable/fromPromise';
-import 'rxjs-compat/add/observable/generate';
-import 'rxjs-compat/add/observable/if';
-import 'rxjs-compat/add/observable/interval';
-import 'rxjs-compat/add/observable/merge';
-import 'rxjs-compat/add/observable/race';
-import 'rxjs-compat/add/observable/never';
-import 'rxjs-compat/add/observable/of';
-import 'rxjs-compat/add/observable/onErrorResumeNext';
-import 'rxjs-compat/add/observable/pairs';
-import 'rxjs-compat/add/observable/range';
-import 'rxjs-compat/add/observable/using';
-import 'rxjs-compat/add/observable/throw';
-import 'rxjs-compat/add/observable/timer';
-import 'rxjs-compat/add/observable/zip';
-import 'rxjs-compat/add/observable/dom/ajax';
-import 'rxjs-compat/add/observable/dom/webSocket';
-import 'rxjs-compat/add/operator/buffer';
-import 'rxjs-compat/add/operator/bufferCount';
-import 'rxjs-compat/add/operator/bufferTime';
-import 'rxjs-compat/add/operator/bufferToggle';
-import 'rxjs-compat/add/operator/bufferWhen';
-import 'rxjs-compat/add/operator/catch';
-import 'rxjs-compat/add/operator/combineAll';
-import 'rxjs-compat/add/operator/combineLatest';
-import 'rxjs-compat/add/operator/concat';
-import 'rxjs-compat/add/operator/concatAll';
-import 'rxjs-compat/add/operator/concatMap';
-import 'rxjs-compat/add/operator/concatMapTo';
-import 'rxjs-compat/add/operator/count';
-import 'rxjs-compat/add/operator/dematerialize';
-import 'rxjs-compat/add/operator/debounce';
-import 'rxjs-compat/add/operator/debounceTime';
-import 'rxjs-compat/add/operator/defaultIfEmpty';
-import 'rxjs-compat/add/operator/delay';
-import 'rxjs-compat/add/operator/delayWhen';
-import 'rxjs-compat/add/operator/distinct';
-import 'rxjs-compat/add/operator/distinctUntilChanged';
-import 'rxjs-compat/add/operator/distinctUntilKeyChanged';
-import 'rxjs-compat/add/operator/do';
-import 'rxjs-compat/add/operator/exhaust';
-import 'rxjs-compat/add/operator/exhaustMap';
-import 'rxjs-compat/add/operator/expand';
-import 'rxjs-compat/add/operator/elementAt';
-import 'rxjs-compat/add/operator/filter';
-import 'rxjs-compat/add/operator/finally';
-import 'rxjs-compat/add/operator/find';
-import 'rxjs-compat/add/operator/findIndex';
-import 'rxjs-compat/add/operator/first';
-import 'rxjs-compat/add/operator/groupBy';
-import 'rxjs-compat/add/operator/ignoreElements';
-import 'rxjs-compat/add/operator/isEmpty';
-import 'rxjs-compat/add/operator/audit';
-import 'rxjs-compat/add/operator/auditTime';
-import 'rxjs-compat/add/operator/last';
-import 'rxjs-compat/add/operator/let';
-import 'rxjs-compat/add/operator/every';
-import 'rxjs-compat/add/operator/map';
-import 'rxjs-compat/add/operator/mapTo';
-import 'rxjs-compat/add/operator/materialize';
-import 'rxjs-compat/add/operator/max';
-import 'rxjs-compat/add/operator/merge';
-import 'rxjs-compat/add/operator/mergeAll';
-import 'rxjs-compat/add/operator/mergeMap';
-import 'rxjs-compat/add/operator/mergeMapTo';
-import 'rxjs-compat/add/operator/mergeScan';
-import 'rxjs-compat/add/operator/min';
-import 'rxjs-compat/add/operator/multicast';
-import 'rxjs-compat/add/operator/observeOn';
-import 'rxjs-compat/add/operator/onErrorResumeNext';
-import 'rxjs-compat/add/operator/pairwise';
-import 'rxjs-compat/add/operator/partition';
-import 'rxjs-compat/add/operator/pluck';
-import 'rxjs-compat/add/operator/publish';
-import 'rxjs-compat/add/operator/publishBehavior';
-import 'rxjs-compat/add/operator/publishReplay';
-import 'rxjs-compat/add/operator/publishLast';
-import 'rxjs-compat/add/operator/race';
-import 'rxjs-compat/add/operator/reduce';
-import 'rxjs-compat/add/operator/repeat';
-import 'rxjs-compat/add/operator/repeatWhen';
-import 'rxjs-compat/add/operator/retry';
-import 'rxjs-compat/add/operator/retryWhen';
-import 'rxjs-compat/add/operator/sample';
-import 'rxjs-compat/add/operator/sampleTime';
-import 'rxjs-compat/add/operator/scan';
-import 'rxjs-compat/add/operator/sequenceEqual';
-import 'rxjs-compat/add/operator/share';
-import 'rxjs-compat/add/operator/shareReplay';
-import 'rxjs-compat/add/operator/single';
-import 'rxjs-compat/add/operator/skip';
-import 'rxjs-compat/add/operator/skipLast';
-import 'rxjs-compat/add/operator/skipUntil';
-import 'rxjs-compat/add/operator/skipWhile';
-import 'rxjs-compat/add/operator/startWith';
-import 'rxjs-compat/add/operator/subscribeOn';
-import 'rxjs-compat/add/operator/switch';
-import 'rxjs-compat/add/operator/switchMap';
-import 'rxjs-compat/add/operator/switchMapTo';
-import 'rxjs-compat/add/operator/take';
-import 'rxjs-compat/add/operator/takeLast';
-import 'rxjs-compat/add/operator/takeUntil';
-import 'rxjs-compat/add/operator/takeWhile';
-import 'rxjs-compat/add/operator/throttle';
-import 'rxjs-compat/add/operator/throttleTime';
-import 'rxjs-compat/add/operator/timeInterval';
-import 'rxjs-compat/add/operator/timeout';
-import 'rxjs-compat/add/operator/timeoutWith';
-import 'rxjs-compat/add/operator/timestamp';
-import 'rxjs-compat/add/operator/toArray';
-import 'rxjs-compat/add/operator/toPromise';
-import 'rxjs-compat/add/operator/window';
-import 'rxjs-compat/add/operator/windowCount';
-import 'rxjs-compat/add/operator/windowTime';
-import 'rxjs-compat/add/operator/windowToggle';
-import 'rxjs-compat/add/operator/windowWhen';
-import 'rxjs-compat/add/operator/withLatestFrom';
-import 'rxjs-compat/add/operator/zip';
-import 'rxjs-compat/add/operator/zipAll';
-export { Subscription } from './Subscription';
-export { Subscriber } from './Subscriber';
-export { AsyncSubject } from './AsyncSubject';
-export { ReplaySubject } from './ReplaySubject';
-export { BehaviorSubject } from './BehaviorSubject';
-export { ConnectableObservable } from './observable/ConnectableObservable';
-export { Notification, NotificationKind } from './Notification';
-export { EmptyError } from './util/EmptyError';
-export { ArgumentOutOfRangeError } from './util/ArgumentOutOfRangeError';
-export { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
-export { TimeoutError } from './util/TimeoutError';
-export { UnsubscriptionError } from './util/UnsubscriptionError';
-export { TimeInterval } from './operators/timeInterval';
-export { Timestamp } from './operators/timestamp';
-export { TestScheduler } from './testing/TestScheduler';
-export { VirtualTimeScheduler } from './scheduler/VirtualTimeScheduler';
-export { AjaxResponse, AjaxError, AjaxTimeoutError } from './observable/dom/AjaxObservable';
-export { pipe } from './util/pipe';
-import { asap } from './scheduler/asap';
-import { async } from './scheduler/async';
-import { queue } from './scheduler/queue';
-import { animationFrame } from './scheduler/animationFrame';
-import { rxSubscriber } from './symbol/rxSubscriber';
-import { iterator } from './symbol/iterator';
-import { observable } from './symbol/observable';
-import * as _operators from './operators/index';
-export const operators = _operators;
-let Scheduler = {
-    asap,
-    queue,
-    animationFrame,
-    async
-};
-let Symbol = {
-    rxSubscriber,
-    observable,
-    iterator
-};
-export { Scheduler, Symbol };
-//# sourceMappingURL=Rx.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/Rx.js.map b/node_modules/rxjs/_esm2015/internal/Rx.js.map
deleted file mode 100644
index 059580f..0000000
--- a/node_modules/rxjs/_esm2015/internal/Rx.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Rx.js","sources":["../../src/internal/Rx.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/Scheduler.js b/node_modules/rxjs/_esm2015/internal/Scheduler.js
deleted file mode 100644
index 9c0ab99..0000000
--- a/node_modules/rxjs/_esm2015/internal/Scheduler.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export class Scheduler {
-    constructor(SchedulerAction, now = Scheduler.now) {
-        this.SchedulerAction = SchedulerAction;
-        this.now = now;
-    }
-    schedule(work, delay = 0, state) {
-        return new this.SchedulerAction(this, work).schedule(state, delay);
-    }
-}
-Scheduler.now = () => Date.now();
-//# sourceMappingURL=Scheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/Scheduler.js.map b/node_modules/rxjs/_esm2015/internal/Scheduler.js.map
deleted file mode 100644
index 4bc5f39..0000000
--- a/node_modules/rxjs/_esm2015/internal/Scheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Scheduler.js","sources":["../../src/internal/Scheduler.ts"],"names":[],"mappings":"AAuBA,MAAM,OAAO,SAAS;IASpB,YAAoB,eAA8B,EACtC,MAAoB,SAAS,CAAC,GAAG;QADzB,oBAAe,GAAf,eAAe,CAAe;QAEhD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IA6BM,QAAQ,CAAI,IAAmD,EAAE,QAAgB,CAAC,EAAE,KAAS;QAClG,OAAO,IAAI,IAAI,CAAC,eAAe,CAAI,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;;AApCa,aAAG,GAAiB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/Subject.js b/node_modules/rxjs/_esm2015/internal/Subject.js
deleted file mode 100644
index 7bdf815..0000000
--- a/node_modules/rxjs/_esm2015/internal/Subject.js
+++ /dev/null
@@ -1,144 +0,0 @@
-import { Observable } from './Observable';
-import { Subscriber } from './Subscriber';
-import { Subscription } from './Subscription';
-import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
-import { SubjectSubscription } from './SubjectSubscription';
-import { rxSubscriber as rxSubscriberSymbol } from '../internal/symbol/rxSubscriber';
-export class SubjectSubscriber extends Subscriber {
-    constructor(destination) {
-        super(destination);
-        this.destination = destination;
-    }
-}
-export class Subject extends Observable {
-    constructor() {
-        super();
-        this.observers = [];
-        this.closed = false;
-        this.isStopped = false;
-        this.hasError = false;
-        this.thrownError = null;
-    }
-    [rxSubscriberSymbol]() {
-        return new SubjectSubscriber(this);
-    }
-    lift(operator) {
-        const subject = new AnonymousSubject(this, this);
-        subject.operator = operator;
-        return subject;
-    }
-    next(value) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        if (!this.isStopped) {
-            const { observers } = this;
-            const len = observers.length;
-            const copy = observers.slice();
-            for (let i = 0; i < len; i++) {
-                copy[i].next(value);
-            }
-        }
-    }
-    error(err) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        this.hasError = true;
-        this.thrownError = err;
-        this.isStopped = true;
-        const { observers } = this;
-        const len = observers.length;
-        const copy = observers.slice();
-        for (let i = 0; i < len; i++) {
-            copy[i].error(err);
-        }
-        this.observers.length = 0;
-    }
-    complete() {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        this.isStopped = true;
-        const { observers } = this;
-        const len = observers.length;
-        const copy = observers.slice();
-        for (let i = 0; i < len; i++) {
-            copy[i].complete();
-        }
-        this.observers.length = 0;
-    }
-    unsubscribe() {
-        this.isStopped = true;
-        this.closed = true;
-        this.observers = null;
-    }
-    _trySubscribe(subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        else {
-            return super._trySubscribe(subscriber);
-        }
-    }
-    _subscribe(subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        else if (this.hasError) {
-            subscriber.error(this.thrownError);
-            return Subscription.EMPTY;
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-            return Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            return new SubjectSubscription(this, subscriber);
-        }
-    }
-    asObservable() {
-        const observable = new Observable();
-        observable.source = this;
-        return observable;
-    }
-}
-Subject.create = (destination, source) => {
-    return new AnonymousSubject(destination, source);
-};
-export class AnonymousSubject extends Subject {
-    constructor(destination, source) {
-        super();
-        this.destination = destination;
-        this.source = source;
-    }
-    next(value) {
-        const { destination } = this;
-        if (destination && destination.next) {
-            destination.next(value);
-        }
-    }
-    error(err) {
-        const { destination } = this;
-        if (destination && destination.error) {
-            this.destination.error(err);
-        }
-    }
-    complete() {
-        const { destination } = this;
-        if (destination && destination.complete) {
-            this.destination.complete();
-        }
-    }
-    _subscribe(subscriber) {
-        const { source } = this;
-        if (source) {
-            return this.source.subscribe(subscriber);
-        }
-        else {
-            return Subscription.EMPTY;
-        }
-    }
-}
-//# sourceMappingURL=Subject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/Subject.js.map b/node_modules/rxjs/_esm2015/internal/Subject.js.map
deleted file mode 100644
index a826b0f..0000000
--- a/node_modules/rxjs/_esm2015/internal/Subject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Subject.js","sources":["../../src/internal/Subject.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/SubjectSubscription.js b/node_modules/rxjs/_esm2015/internal/SubjectSubscription.js
deleted file mode 100644
index 0f1c5df..0000000
--- a/node_modules/rxjs/_esm2015/internal/SubjectSubscription.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { Subscription } from './Subscription';
-export class SubjectSubscription extends Subscription {
-    constructor(subject, subscriber) {
-        super();
-        this.subject = subject;
-        this.subscriber = subscriber;
-        this.closed = false;
-    }
-    unsubscribe() {
-        if (this.closed) {
-            return;
-        }
-        this.closed = true;
-        const subject = this.subject;
-        const observers = subject.observers;
-        this.subject = null;
-        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
-            return;
-        }
-        const subscriberIndex = observers.indexOf(this.subscriber);
-        if (subscriberIndex !== -1) {
-            observers.splice(subscriberIndex, 1);
-        }
-    }
-}
-//# sourceMappingURL=SubjectSubscription.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/SubjectSubscription.js.map b/node_modules/rxjs/_esm2015/internal/SubjectSubscription.js.map
deleted file mode 100644
index ef477fb..0000000
--- a/node_modules/rxjs/_esm2015/internal/SubjectSubscription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubjectSubscription.js","sources":["../../src/internal/SubjectSubscription.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO9C,MAAM,OAAO,mBAAuB,SAAQ,YAAY;IAGtD,YAAmB,OAAmB,EAAS,UAAuB;QACpE,KAAK,EAAE,CAAC;QADS,YAAO,GAAP,OAAO,CAAY;QAAS,eAAU,GAAV,UAAU,CAAa;QAFtE,WAAM,GAAY,KAAK,CAAC;IAIxB,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO;SACR;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE;YAC/E,OAAO;SACR;QAED,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE3D,IAAI,eAAe,KAAK,CAAC,CAAC,EAAE;YAC1B,SAAS,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;SACtC;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/Subscriber.js b/node_modules/rxjs/_esm2015/internal/Subscriber.js
deleted file mode 100644
index 7dfed3c..0000000
--- a/node_modules/rxjs/_esm2015/internal/Subscriber.js
+++ /dev/null
@@ -1,222 +0,0 @@
-import { isFunction } from './util/isFunction';
-import { empty as emptyObserver } from './Observer';
-import { Subscription } from './Subscription';
-import { rxSubscriber as rxSubscriberSymbol } from '../internal/symbol/rxSubscriber';
-import { config } from './config';
-import { hostReportError } from './util/hostReportError';
-export class Subscriber extends Subscription {
-    constructor(destinationOrNext, error, complete) {
-        super();
-        this.syncErrorValue = null;
-        this.syncErrorThrown = false;
-        this.syncErrorThrowable = false;
-        this.isStopped = false;
-        switch (arguments.length) {
-            case 0:
-                this.destination = emptyObserver;
-                break;
-            case 1:
-                if (!destinationOrNext) {
-                    this.destination = emptyObserver;
-                    break;
-                }
-                if (typeof destinationOrNext === 'object') {
-                    if (destinationOrNext instanceof Subscriber) {
-                        this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;
-                        this.destination = destinationOrNext;
-                        destinationOrNext.add(this);
-                    }
-                    else {
-                        this.syncErrorThrowable = true;
-                        this.destination = new SafeSubscriber(this, destinationOrNext);
-                    }
-                    break;
-                }
-            default:
-                this.syncErrorThrowable = true;
-                this.destination = new SafeSubscriber(this, destinationOrNext, error, complete);
-                break;
-        }
-    }
-    [rxSubscriberSymbol]() { return this; }
-    static create(next, error, complete) {
-        const subscriber = new Subscriber(next, error, complete);
-        subscriber.syncErrorThrowable = false;
-        return subscriber;
-    }
-    next(value) {
-        if (!this.isStopped) {
-            this._next(value);
-        }
-    }
-    error(err) {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._error(err);
-        }
-    }
-    complete() {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._complete();
-        }
-    }
-    unsubscribe() {
-        if (this.closed) {
-            return;
-        }
-        this.isStopped = true;
-        super.unsubscribe();
-    }
-    _next(value) {
-        this.destination.next(value);
-    }
-    _error(err) {
-        this.destination.error(err);
-        this.unsubscribe();
-    }
-    _complete() {
-        this.destination.complete();
-        this.unsubscribe();
-    }
-    _unsubscribeAndRecycle() {
-        const { _parentOrParents } = this;
-        this._parentOrParents = null;
-        this.unsubscribe();
-        this.closed = false;
-        this.isStopped = false;
-        this._parentOrParents = _parentOrParents;
-        return this;
-    }
-}
-export class SafeSubscriber extends Subscriber {
-    constructor(_parentSubscriber, observerOrNext, error, complete) {
-        super();
-        this._parentSubscriber = _parentSubscriber;
-        let next;
-        let context = this;
-        if (isFunction(observerOrNext)) {
-            next = observerOrNext;
-        }
-        else if (observerOrNext) {
-            next = observerOrNext.next;
-            error = observerOrNext.error;
-            complete = observerOrNext.complete;
-            if (observerOrNext !== emptyObserver) {
-                context = Object.create(observerOrNext);
-                if (isFunction(context.unsubscribe)) {
-                    this.add(context.unsubscribe.bind(context));
-                }
-                context.unsubscribe = this.unsubscribe.bind(this);
-            }
-        }
-        this._context = context;
-        this._next = next;
-        this._error = error;
-        this._complete = complete;
-    }
-    next(value) {
-        if (!this.isStopped && this._next) {
-            const { _parentSubscriber } = this;
-            if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                this.__tryOrUnsub(this._next, value);
-            }
-            else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
-                this.unsubscribe();
-            }
-        }
-    }
-    error(err) {
-        if (!this.isStopped) {
-            const { _parentSubscriber } = this;
-            const { useDeprecatedSynchronousErrorHandling } = config;
-            if (this._error) {
-                if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(this._error, err);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parentSubscriber, this._error, err);
-                    this.unsubscribe();
-                }
-            }
-            else if (!_parentSubscriber.syncErrorThrowable) {
-                this.unsubscribe();
-                if (useDeprecatedSynchronousErrorHandling) {
-                    throw err;
-                }
-                hostReportError(err);
-            }
-            else {
-                if (useDeprecatedSynchronousErrorHandling) {
-                    _parentSubscriber.syncErrorValue = err;
-                    _parentSubscriber.syncErrorThrown = true;
-                }
-                else {
-                    hostReportError(err);
-                }
-                this.unsubscribe();
-            }
-        }
-    }
-    complete() {
-        if (!this.isStopped) {
-            const { _parentSubscriber } = this;
-            if (this._complete) {
-                const wrappedComplete = () => this._complete.call(this._context);
-                if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(wrappedComplete);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parentSubscriber, wrappedComplete);
-                    this.unsubscribe();
-                }
-            }
-            else {
-                this.unsubscribe();
-            }
-        }
-    }
-    __tryOrUnsub(fn, value) {
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            this.unsubscribe();
-            if (config.useDeprecatedSynchronousErrorHandling) {
-                throw err;
-            }
-            else {
-                hostReportError(err);
-            }
-        }
-    }
-    __tryOrSetError(parent, fn, value) {
-        if (!config.useDeprecatedSynchronousErrorHandling) {
-            throw new Error('bad call');
-        }
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            if (config.useDeprecatedSynchronousErrorHandling) {
-                parent.syncErrorValue = err;
-                parent.syncErrorThrown = true;
-                return true;
-            }
-            else {
-                hostReportError(err);
-                return true;
-            }
-        }
-        return false;
-    }
-    _unsubscribe() {
-        const { _parentSubscriber } = this;
-        this._context = null;
-        this._parentSubscriber = null;
-        _parentSubscriber.unsubscribe();
-    }
-}
-//# sourceMappingURL=Subscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/Subscriber.js.map b/node_modules/rxjs/_esm2015/internal/Subscriber.js.map
deleted file mode 100644
index 174aa15..0000000
--- a/node_modules/rxjs/_esm2015/internal/Subscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Subscriber.js","sources":["../../src/internal/Subscriber.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/Subscription.js b/node_modules/rxjs/_esm2015/internal/Subscription.js
deleted file mode 100644
index 78301c6..0000000
--- a/node_modules/rxjs/_esm2015/internal/Subscription.js
+++ /dev/null
@@ -1,133 +0,0 @@
-import { isArray } from './util/isArray';
-import { isObject } from './util/isObject';
-import { isFunction } from './util/isFunction';
-import { UnsubscriptionError } from './util/UnsubscriptionError';
-export class Subscription {
-    constructor(unsubscribe) {
-        this.closed = false;
-        this._parentOrParents = null;
-        this._subscriptions = null;
-        if (unsubscribe) {
-            this._unsubscribe = unsubscribe;
-        }
-    }
-    unsubscribe() {
-        let errors;
-        if (this.closed) {
-            return;
-        }
-        let { _parentOrParents, _unsubscribe, _subscriptions } = this;
-        this.closed = true;
-        this._parentOrParents = null;
-        this._subscriptions = null;
-        if (_parentOrParents instanceof Subscription) {
-            _parentOrParents.remove(this);
-        }
-        else if (_parentOrParents !== null) {
-            for (let index = 0; index < _parentOrParents.length; ++index) {
-                const parent = _parentOrParents[index];
-                parent.remove(this);
-            }
-        }
-        if (isFunction(_unsubscribe)) {
-            try {
-                _unsubscribe.call(this);
-            }
-            catch (e) {
-                errors = e instanceof UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];
-            }
-        }
-        if (isArray(_subscriptions)) {
-            let index = -1;
-            let len = _subscriptions.length;
-            while (++index < len) {
-                const sub = _subscriptions[index];
-                if (isObject(sub)) {
-                    try {
-                        sub.unsubscribe();
-                    }
-                    catch (e) {
-                        errors = errors || [];
-                        if (e instanceof UnsubscriptionError) {
-                            errors = errors.concat(flattenUnsubscriptionErrors(e.errors));
-                        }
-                        else {
-                            errors.push(e);
-                        }
-                    }
-                }
-            }
-        }
-        if (errors) {
-            throw new UnsubscriptionError(errors);
-        }
-    }
-    add(teardown) {
-        let subscription = teardown;
-        if (!teardown) {
-            return Subscription.EMPTY;
-        }
-        switch (typeof teardown) {
-            case 'function':
-                subscription = new Subscription(teardown);
-            case 'object':
-                if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {
-                    return subscription;
-                }
-                else if (this.closed) {
-                    subscription.unsubscribe();
-                    return subscription;
-                }
-                else if (!(subscription instanceof Subscription)) {
-                    const tmp = subscription;
-                    subscription = new Subscription();
-                    subscription._subscriptions = [tmp];
-                }
-                break;
-            default: {
-                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
-            }
-        }
-        let { _parentOrParents } = subscription;
-        if (_parentOrParents === null) {
-            subscription._parentOrParents = this;
-        }
-        else if (_parentOrParents instanceof Subscription) {
-            if (_parentOrParents === this) {
-                return subscription;
-            }
-            subscription._parentOrParents = [_parentOrParents, this];
-        }
-        else if (_parentOrParents.indexOf(this) === -1) {
-            _parentOrParents.push(this);
-        }
-        else {
-            return subscription;
-        }
-        const subscriptions = this._subscriptions;
-        if (subscriptions === null) {
-            this._subscriptions = [subscription];
-        }
-        else {
-            subscriptions.push(subscription);
-        }
-        return subscription;
-    }
-    remove(subscription) {
-        const subscriptions = this._subscriptions;
-        if (subscriptions) {
-            const subscriptionIndex = subscriptions.indexOf(subscription);
-            if (subscriptionIndex !== -1) {
-                subscriptions.splice(subscriptionIndex, 1);
-            }
-        }
-    }
-}
-Subscription.EMPTY = (function (empty) {
-    empty.closed = true;
-    return empty;
-}(new Subscription()));
-function flattenUnsubscriptionErrors(errors) {
-    return errors.reduce((errs, err) => errs.concat((err instanceof UnsubscriptionError) ? err.errors : err), []);
-}
-//# sourceMappingURL=Subscription.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/Subscription.js.map b/node_modules/rxjs/_esm2015/internal/Subscription.js.map
deleted file mode 100644
index f2f8ef1..0000000
--- a/node_modules/rxjs/_esm2015/internal/Subscription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Subscription.js","sources":["../../src/internal/Subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAejE,MAAM,OAAO,YAAY;IAsBvB,YAAY,WAAwB;QAX7B,WAAM,GAAY,KAAK,CAAC;QAGrB,qBAAgB,GAAkC,IAAI,CAAC;QAEzD,mBAAc,GAAuB,IAAI,CAAC;QAOhD,IAAI,WAAW,EAAE;YACR,IAAK,CAAC,YAAY,GAAG,WAAW,CAAC;SACzC;IACH,CAAC;IAQD,WAAW;QACT,IAAI,MAAa,CAAC;QAElB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO;SACR;QAED,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,GAAU,IAAK,CAAC;QAEtE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAG7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAE3B,IAAI,gBAAgB,YAAY,YAAY,EAAE;YAC5C,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC/B;aAAM,IAAI,gBAAgB,KAAK,IAAI,EAAE;YACpC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE;gBAC5D,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACvC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;aACrB;SACF;QAED,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE;YAC5B,IAAI;gBACF,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACzB;YAAC,OAAO,CAAC,EAAE;gBACV,MAAM,GAAG,CAAC,YAAY,mBAAmB,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACzF;SACF;QAED,IAAI,OAAO,CAAC,cAAc,CAAC,EAAE;YAC3B,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YACf,IAAI,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC;YAEhC,OAAO,EAAE,KAAK,GAAG,GAAG,EAAE;gBACpB,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;gBAClC,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;oBACjB,IAAI;wBACF,GAAG,CAAC,WAAW,EAAE,CAAC;qBACnB;oBAAC,OAAO,CAAC,EAAE;wBACV,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;wBACtB,IAAI,CAAC,YAAY,mBAAmB,EAAE;4BACpC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;yBAC/D;6BAAM;4BACL,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;yBAChB;qBACF;iBACF;aACF;SACF;QAED,IAAI,MAAM,EAAE;YACV,MAAM,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;SACvC;IACH,CAAC;IAsBD,GAAG,CAAC,QAAuB;QACzB,IAAI,YAAY,GAAkB,QAAS,CAAC;QAE5C,IAAI,CAAO,QAAS,EAAE;YACpB,OAAO,YAAY,CAAC,KAAK,CAAC;SAC3B;QAED,QAAQ,OAAO,QAAQ,EAAE;YACvB,KAAK,UAAU;gBACb,YAAY,GAAG,IAAI,YAAY,CAAe,QAAQ,CAAC,CAAC;YAC1D,KAAK,QAAQ;gBACX,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,MAAM,IAAI,OAAO,YAAY,CAAC,WAAW,KAAK,UAAU,EAAE;oBAElG,OAAO,YAAY,CAAC;iBACrB;qBAAM,IAAI,IAAI,CAAC,MAAM,EAAE;oBACtB,YAAY,CAAC,WAAW,EAAE,CAAC;oBAC3B,OAAO,YAAY,CAAC;iBACrB;qBAAM,IAAI,CAAC,CAAC,YAAY,YAAY,YAAY,CAAC,EAAE;oBAClD,MAAM,GAAG,GAAG,YAAY,CAAC;oBACzB,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;oBAClC,YAAY,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC;iBACrC;gBACD,MAAM;YACR,OAAO,CAAC,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,QAAQ,GAAG,yBAAyB,CAAC,CAAC;aAClF;SACF;QAGD,IAAI,EAAE,gBAAgB,EAAE,GAAG,YAAY,CAAC;QACxC,IAAI,gBAAgB,KAAK,IAAI,EAAE;YAG7B,YAAY,CAAC,gBAAgB,GAAG,IAAI,CAAC;SACtC;aAAM,IAAI,gBAAgB,YAAY,YAAY,EAAE;YACnD,IAAI,gBAAgB,KAAK,IAAI,EAAE;gBAE7B,OAAO,YAAY,CAAC;aACrB;YAGD,YAAY,CAAC,gBAAgB,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;SAC1D;aAAM,IAAI,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YAEhD,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7B;aAAM;YAEL,OAAO,YAAY,CAAC;SACrB;QAGD,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,aAAa,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC,cAAc,GAAG,CAAC,YAAY,CAAC,CAAC;SACtC;aAAM;YACL,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAClC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAQD,MAAM,CAAC,YAA0B;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,aAAa,EAAE;YACjB,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC9D,IAAI,iBAAiB,KAAK,CAAC,CAAC,EAAE;gBAC5B,aAAa,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;aAC5C;SACF;IACH,CAAC;;AAzLa,kBAAK,GAAiB,CAAC,UAAS,KAAU;IACtD,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC;AAyLzB,SAAS,2BAA2B,CAAC,MAAa;IACjD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,YAAY,mBAAmB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/G,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/config.js b/node_modules/rxjs/_esm2015/internal/config.js
deleted file mode 100644
index d237f15..0000000
--- a/node_modules/rxjs/_esm2015/internal/config.js
+++ /dev/null
@@ -1,18 +0,0 @@
-let _enable_super_gross_mode_that_will_cause_bad_things = false;
-export const config = {
-    Promise: undefined,
-    set useDeprecatedSynchronousErrorHandling(value) {
-        if (value) {
-            const error = new Error();
-            console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack);
-        }
-        else if (_enable_super_gross_mode_that_will_cause_bad_things) {
-            console.log('RxJS: Back to a better error behavior. Thank you. <3');
-        }
-        _enable_super_gross_mode_that_will_cause_bad_things = value;
-    },
-    get useDeprecatedSynchronousErrorHandling() {
-        return _enable_super_gross_mode_that_will_cause_bad_things;
-    },
-};
-//# sourceMappingURL=config.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/config.js.map b/node_modules/rxjs/_esm2015/internal/config.js.map
deleted file mode 100644
index 1b8c5be..0000000
--- a/node_modules/rxjs/_esm2015/internal/config.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"config.js","sources":["../../src/internal/config.ts"],"names":[],"mappings":"AAAA,IAAI,mDAAmD,GAAG,KAAK,CAAC;AAMhE,MAAM,CAAC,MAAM,MAAM,GAAG;IAKpB,OAAO,EAAE,SAAmC;IAU5C,IAAI,qCAAqC,CAAC,KAAc;QACtD,IAAI,KAAK,EAAE;YACT,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,+FAA+F,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;SAC7H;aAAM,IAAI,mDAAmD,EAAE;YAC9D,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;SACrE;QACD,mDAAmD,GAAG,KAAK,CAAC;IAC9D,CAAC;IAED,IAAI,qCAAqC;QACvC,OAAO,mDAAmD,CAAC;IAC7D,CAAC;CACF,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/ConnectableObservable.js b/node_modules/rxjs/_esm2015/internal/observable/ConnectableObservable.js
deleted file mode 100644
index d9e6d47..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/ConnectableObservable.js
+++ /dev/null
@@ -1,129 +0,0 @@
-import { SubjectSubscriber } from '../Subject';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { refCount as higherOrderRefCount } from '../operators/refCount';
-export class ConnectableObservable extends Observable {
-    constructor(source, subjectFactory) {
-        super();
-        this.source = source;
-        this.subjectFactory = subjectFactory;
-        this._refCount = 0;
-        this._isComplete = false;
-    }
-    _subscribe(subscriber) {
-        return this.getSubject().subscribe(subscriber);
-    }
-    getSubject() {
-        const subject = this._subject;
-        if (!subject || subject.isStopped) {
-            this._subject = this.subjectFactory();
-        }
-        return this._subject;
-    }
-    connect() {
-        let connection = this._connection;
-        if (!connection) {
-            this._isComplete = false;
-            connection = this._connection = new Subscription();
-            connection.add(this.source
-                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
-            if (connection.closed) {
-                this._connection = null;
-                connection = Subscription.EMPTY;
-            }
-        }
-        return connection;
-    }
-    refCount() {
-        return higherOrderRefCount()(this);
-    }
-}
-export const connectableObservableDescriptor = (() => {
-    const connectableProto = ConnectableObservable.prototype;
-    return {
-        operator: { value: null },
-        _refCount: { value: 0, writable: true },
-        _subject: { value: null, writable: true },
-        _connection: { value: null, writable: true },
-        _subscribe: { value: connectableProto._subscribe },
-        _isComplete: { value: connectableProto._isComplete, writable: true },
-        getSubject: { value: connectableProto.getSubject },
-        connect: { value: connectableProto.connect },
-        refCount: { value: connectableProto.refCount }
-    };
-})();
-class ConnectableSubscriber extends SubjectSubscriber {
-    constructor(destination, connectable) {
-        super(destination);
-        this.connectable = connectable;
-    }
-    _error(err) {
-        this._unsubscribe();
-        super._error(err);
-    }
-    _complete() {
-        this.connectable._isComplete = true;
-        this._unsubscribe();
-        super._complete();
-    }
-    _unsubscribe() {
-        const connectable = this.connectable;
-        if (connectable) {
-            this.connectable = null;
-            const connection = connectable._connection;
-            connectable._refCount = 0;
-            connectable._subject = null;
-            connectable._connection = null;
-            if (connection) {
-                connection.unsubscribe();
-            }
-        }
-    }
-}
-class RefCountOperator {
-    constructor(connectable) {
-        this.connectable = connectable;
-    }
-    call(subscriber, source) {
-        const { connectable } = this;
-        connectable._refCount++;
-        const refCounter = new RefCountSubscriber(subscriber, connectable);
-        const subscription = source.subscribe(refCounter);
-        if (!refCounter.closed) {
-            refCounter.connection = connectable.connect();
-        }
-        return subscription;
-    }
-}
-class RefCountSubscriber extends Subscriber {
-    constructor(destination, connectable) {
-        super(destination);
-        this.connectable = connectable;
-    }
-    _unsubscribe() {
-        const { connectable } = this;
-        if (!connectable) {
-            this.connection = null;
-            return;
-        }
-        this.connectable = null;
-        const refCount = connectable._refCount;
-        if (refCount <= 0) {
-            this.connection = null;
-            return;
-        }
-        connectable._refCount = refCount - 1;
-        if (refCount > 1) {
-            this.connection = null;
-            return;
-        }
-        const { connection } = this;
-        const sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    }
-}
-//# sourceMappingURL=ConnectableObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/ConnectableObservable.js.map b/node_modules/rxjs/_esm2015/internal/observable/ConnectableObservable.js.map
deleted file mode 100644
index b4d080d..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/ConnectableObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ConnectableObservable.js","sources":["../../../src/internal/observable/ConnectableObservable.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/SubscribeOnObservable.js b/node_modules/rxjs/_esm2015/internal/observable/SubscribeOnObservable.js
deleted file mode 100644
index ebdaceb..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/SubscribeOnObservable.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import { Observable } from '../Observable';
-import { asap } from '../scheduler/asap';
-import { isNumeric } from '../util/isNumeric';
-export class SubscribeOnObservable extends Observable {
-    constructor(source, delayTime = 0, scheduler = asap) {
-        super();
-        this.source = source;
-        this.delayTime = delayTime;
-        this.scheduler = scheduler;
-        if (!isNumeric(delayTime) || delayTime < 0) {
-            this.delayTime = 0;
-        }
-        if (!scheduler || typeof scheduler.schedule !== 'function') {
-            this.scheduler = asap;
-        }
-    }
-    static create(source, delay = 0, scheduler = asap) {
-        return new SubscribeOnObservable(source, delay, scheduler);
-    }
-    static dispatch(arg) {
-        const { source, subscriber } = arg;
-        return this.add(source.subscribe(subscriber));
-    }
-    _subscribe(subscriber) {
-        const delay = this.delayTime;
-        const source = this.source;
-        const scheduler = this.scheduler;
-        return scheduler.schedule(SubscribeOnObservable.dispatch, delay, {
-            source, subscriber
-        });
-    }
-}
-//# sourceMappingURL=SubscribeOnObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/SubscribeOnObservable.js.map b/node_modules/rxjs/_esm2015/internal/observable/SubscribeOnObservable.js.map
deleted file mode 100644
index f369182..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/SubscribeOnObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubscribeOnObservable.js","sources":["../../../src/internal/observable/SubscribeOnObservable.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAY9C,MAAM,OAAO,qBAAyB,SAAQ,UAAa;IAYzD,YAAmB,MAAqB,EACpB,YAAoB,CAAC,EACrB,YAA2B,IAAI;QACjD,KAAK,EAAE,CAAC;QAHS,WAAM,GAAN,MAAM,CAAe;QACpB,cAAS,GAAT,SAAS,CAAY;QACrB,cAAS,GAAT,SAAS,CAAsB;QAEjD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE;YAC1C,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;SACpB;QACD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE;YAC1D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;SACvB;IACH,CAAC;IApBD,MAAM,CAAC,MAAM,CAAI,MAAqB,EAAE,QAAgB,CAAC,EAAE,YAA2B,IAAI;QACxF,OAAO,IAAI,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAGD,MAAM,CAAC,QAAQ,CAA8B,GAAmB;QAC9D,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IAChD,CAAC;IAeD,UAAU,CAAC,UAAyB;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAEjC,OAAO,SAAS,CAAC,QAAQ,CAAmB,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE;YACjF,MAAM,EAAE,UAAU;SACnB,CAAC,CAAC;IACL,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/bindCallback.js b/node_modules/rxjs/_esm2015/internal/observable/bindCallback.js
deleted file mode 100644
index 6d74773..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/bindCallback.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import { Observable } from '../Observable';
-import { AsyncSubject } from '../AsyncSubject';
-import { map } from '../operators/map';
-import { canReportError } from '../util/canReportError';
-import { isArray } from '../util/isArray';
-import { isScheduler } from '../util/isScheduler';
-export function bindCallback(callbackFunc, resultSelector, scheduler) {
-    if (resultSelector) {
-        if (isScheduler(resultSelector)) {
-            scheduler = resultSelector;
-        }
-        else {
-            return (...args) => bindCallback(callbackFunc, scheduler)(...args).pipe(map((args) => isArray(args) ? resultSelector(...args) : resultSelector(args)));
-        }
-    }
-    return function (...args) {
-        const context = this;
-        let subject;
-        const params = {
-            context,
-            subject,
-            callbackFunc,
-            scheduler,
-        };
-        return new Observable(subscriber => {
-            if (!scheduler) {
-                if (!subject) {
-                    subject = new AsyncSubject();
-                    const handler = (...innerArgs) => {
-                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-                        subject.complete();
-                    };
-                    try {
-                        callbackFunc.apply(context, [...args, handler]);
-                    }
-                    catch (err) {
-                        if (canReportError(subject)) {
-                            subject.error(err);
-                        }
-                        else {
-                            console.warn(err);
-                        }
-                    }
-                }
-                return subject.subscribe(subscriber);
-            }
-            else {
-                const state = {
-                    args, subscriber, params,
-                };
-                return scheduler.schedule(dispatch, 0, state);
-            }
-        });
-    };
-}
-function dispatch(state) {
-    const self = this;
-    const { args, subscriber, params } = state;
-    const { callbackFunc, context, scheduler } = params;
-    let { subject } = params;
-    if (!subject) {
-        subject = params.subject = new AsyncSubject();
-        const handler = (...innerArgs) => {
-            const value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-            this.add(scheduler.schedule(dispatchNext, 0, { value, subject }));
-        };
-        try {
-            callbackFunc.apply(context, [...args, handler]);
-        }
-        catch (err) {
-            subject.error(err);
-        }
-    }
-    this.add(subject.subscribe(subscriber));
-}
-function dispatchNext(state) {
-    const { value, subject } = state;
-    subject.next(value);
-    subject.complete();
-}
-function dispatchError(state) {
-    const { err, subject } = state;
-    subject.error(err);
-}
-//# sourceMappingURL=bindCallback.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/bindCallback.js.map b/node_modules/rxjs/_esm2015/internal/observable/bindCallback.js.map
deleted file mode 100644
index 205826b..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/bindCallback.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bindCallback.js","sources":["../../../src/internal/observable/bindCallback.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/bindNodeCallback.js b/node_modules/rxjs/_esm2015/internal/observable/bindNodeCallback.js
deleted file mode 100644
index 81ca5a6..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/bindNodeCallback.js
+++ /dev/null
@@ -1,93 +0,0 @@
-import { Observable } from '../Observable';
-import { AsyncSubject } from '../AsyncSubject';
-import { map } from '../operators/map';
-import { canReportError } from '../util/canReportError';
-import { isScheduler } from '../util/isScheduler';
-import { isArray } from '../util/isArray';
-export function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
-    if (resultSelector) {
-        if (isScheduler(resultSelector)) {
-            scheduler = resultSelector;
-        }
-        else {
-            return (...args) => bindNodeCallback(callbackFunc, scheduler)(...args).pipe(map(args => isArray(args) ? resultSelector(...args) : resultSelector(args)));
-        }
-    }
-    return function (...args) {
-        const params = {
-            subject: undefined,
-            args,
-            callbackFunc,
-            scheduler,
-            context: this,
-        };
-        return new Observable(subscriber => {
-            const { context } = params;
-            let { subject } = params;
-            if (!scheduler) {
-                if (!subject) {
-                    subject = params.subject = new AsyncSubject();
-                    const handler = (...innerArgs) => {
-                        const err = innerArgs.shift();
-                        if (err) {
-                            subject.error(err);
-                            return;
-                        }
-                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-                        subject.complete();
-                    };
-                    try {
-                        callbackFunc.apply(context, [...args, handler]);
-                    }
-                    catch (err) {
-                        if (canReportError(subject)) {
-                            subject.error(err);
-                        }
-                        else {
-                            console.warn(err);
-                        }
-                    }
-                }
-                return subject.subscribe(subscriber);
-            }
-            else {
-                return scheduler.schedule(dispatch, 0, { params, subscriber, context });
-            }
-        });
-    };
-}
-function dispatch(state) {
-    const { params, subscriber, context } = state;
-    const { callbackFunc, args, scheduler } = params;
-    let subject = params.subject;
-    if (!subject) {
-        subject = params.subject = new AsyncSubject();
-        const handler = (...innerArgs) => {
-            const err = innerArgs.shift();
-            if (err) {
-                this.add(scheduler.schedule(dispatchError, 0, { err, subject }));
-            }
-            else {
-                const value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-                this.add(scheduler.schedule(dispatchNext, 0, { value, subject }));
-            }
-        };
-        try {
-            callbackFunc.apply(context, [...args, handler]);
-        }
-        catch (err) {
-            this.add(scheduler.schedule(dispatchError, 0, { err, subject }));
-        }
-    }
-    this.add(subject.subscribe(subscriber));
-}
-function dispatchNext(arg) {
-    const { value, subject } = arg;
-    subject.next(value);
-    subject.complete();
-}
-function dispatchError(arg) {
-    const { err, subject } = arg;
-    subject.error(err);
-}
-//# sourceMappingURL=bindNodeCallback.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/bindNodeCallback.js.map b/node_modules/rxjs/_esm2015/internal/observable/bindNodeCallback.js.map
deleted file mode 100644
index 6382afd..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/bindNodeCallback.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bindNodeCallback.js","sources":["../../../src/internal/observable/bindNodeCallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAoJ1C,MAAM,UAAU,gBAAgB,CAC9B,YAAsB,EACtB,cAAsC,EACtC,SAAyB;IAGzB,IAAI,cAAc,EAAE;QAClB,IAAI,WAAW,CAAC,cAAc,CAAC,EAAE;YAC/B,SAAS,GAAG,cAAc,CAAC;SAC5B;aAAM;YAEL,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAChF,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAC5E,CAAC;SACH;KACF;IAED,OAAO,UAAoB,GAAG,IAAW;QACvC,MAAM,MAAM,GAAmB;YAC7B,OAAO,EAAE,SAAS;YAClB,IAAI;YACJ,YAAY;YACZ,SAAS;YACT,OAAO,EAAE,IAAI;SACd,CAAC;QACF,OAAO,IAAI,UAAU,CAAI,UAAU,CAAC,EAAE;YACpC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAC3B,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YACzB,IAAI,CAAC,SAAS,EAAE;gBACd,IAAI,CAAC,OAAO,EAAE;oBACZ,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,YAAY,EAAK,CAAC;oBACjD,MAAM,OAAO,GAAG,CAAC,GAAG,SAAgB,EAAE,EAAE;wBACtC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;wBAE9B,IAAI,GAAG,EAAE;4BACP,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;4BACnB,OAAO;yBACR;wBAED,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;wBAC/D,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrB,CAAC,CAAC;oBAEF,IAAI;wBACF,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;qBACjD;oBAAC,OAAO,GAAG,EAAE;wBACZ,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE;4BAC3B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;yBACpB;6BAAM;4BACL,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;yBACnB;qBACF;iBACF;gBACD,OAAO,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;aACtC;iBAAM;gBACL,OAAO,SAAS,CAAC,QAAQ,CAAmB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;aAC3F;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAgBD,SAAS,QAAQ,CAA6C,KAAuB;IACnF,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC9C,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IACjD,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAE7B,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,YAAY,EAAK,CAAC;QAEjD,MAAM,OAAO,GAAG,CAAC,GAAG,SAAgB,EAAE,EAAE;YACtC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,GAAG,EAAE;gBACP,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAsB,aAAa,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;aACvF;iBAAM;gBACL,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/D,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAqB,YAAY,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;aACvF;QACH,CAAC,CAAC;QAEF,IAAI;YACF,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;SACjD;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAsB,aAAa,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;SACvF;KACF;IAED,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;AAC1C,CAAC;AAOD,SAAS,YAAY,CAAI,GAAuB;IAC9C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,OAAO,CAAC,QAAQ,EAAE,CAAC;AACrB,CAAC;AAOD,SAAS,aAAa,CAAI,GAAwB;IAChD,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAC7B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/combineLatest.js b/node_modules/rxjs/_esm2015/internal/observable/combineLatest.js
deleted file mode 100644
index 975f03e..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/combineLatest.js
+++ /dev/null
@@ -1,89 +0,0 @@
-import { isScheduler } from '../util/isScheduler';
-import { isArray } from '../util/isArray';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { fromArray } from './fromArray';
-const NONE = {};
-export function combineLatest(...observables) {
-    let resultSelector = null;
-    let scheduler = null;
-    if (isScheduler(observables[observables.length - 1])) {
-        scheduler = observables.pop();
-    }
-    if (typeof observables[observables.length - 1] === 'function') {
-        resultSelector = observables.pop();
-    }
-    if (observables.length === 1 && isArray(observables[0])) {
-        observables = observables[0];
-    }
-    return fromArray(observables, scheduler).lift(new CombineLatestOperator(resultSelector));
-}
-export class CombineLatestOperator {
-    constructor(resultSelector) {
-        this.resultSelector = resultSelector;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));
-    }
-}
-export class CombineLatestSubscriber extends OuterSubscriber {
-    constructor(destination, resultSelector) {
-        super(destination);
-        this.resultSelector = resultSelector;
-        this.active = 0;
-        this.values = [];
-        this.observables = [];
-    }
-    _next(observable) {
-        this.values.push(NONE);
-        this.observables.push(observable);
-    }
-    _complete() {
-        const observables = this.observables;
-        const len = observables.length;
-        if (len === 0) {
-            this.destination.complete();
-        }
-        else {
-            this.active = len;
-            this.toRespond = len;
-            for (let i = 0; i < len; i++) {
-                const observable = observables[i];
-                this.add(subscribeToResult(this, observable, observable, i));
-            }
-        }
-    }
-    notifyComplete(unused) {
-        if ((this.active -= 1) === 0) {
-            this.destination.complete();
-        }
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        const values = this.values;
-        const oldVal = values[outerIndex];
-        const toRespond = !this.toRespond
-            ? 0
-            : oldVal === NONE ? --this.toRespond : this.toRespond;
-        values[outerIndex] = innerValue;
-        if (toRespond === 0) {
-            if (this.resultSelector) {
-                this._tryResultSelector(values);
-            }
-            else {
-                this.destination.next(values.slice());
-            }
-        }
-    }
-    _tryResultSelector(values) {
-        let result;
-        try {
-            result = this.resultSelector.apply(this, values);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    }
-}
-//# sourceMappingURL=combineLatest.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/combineLatest.js.map b/node_modules/rxjs/_esm2015/internal/observable/combineLatest.js.map
deleted file mode 100644
index cf8569b..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/combineLatest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineLatest.js","sources":["../../../src/internal/observable/combineLatest.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/concat.js b/node_modules/rxjs/_esm2015/internal/observable/concat.js
deleted file mode 100644
index f4c0fef..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/concat.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { of } from './of';
-import { concatAll } from '../operators/concatAll';
-export function concat(...observables) {
-    return concatAll()(of(...observables));
-}
-//# sourceMappingURL=concat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/concat.js.map b/node_modules/rxjs/_esm2015/internal/observable/concat.js.map
deleted file mode 100644
index da4d8f8..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/concat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concat.js","sources":["../../../src/internal/observable/concat.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AA2InD,MAAM,UAAU,MAAM,CAAoC,GAAG,WAAqC;IAChG,OAAO,SAAS,EAAK,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;AAC5C,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/defer.js b/node_modules/rxjs/_esm2015/internal/observable/defer.js
deleted file mode 100644
index c730f4c..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/defer.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Observable } from '../Observable';
-import { from } from './from';
-import { empty } from './empty';
-export function defer(observableFactory) {
-    return new Observable(subscriber => {
-        let input;
-        try {
-            input = observableFactory();
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        const source = input ? from(input) : empty();
-        return source.subscribe(subscriber);
-    });
-}
-//# sourceMappingURL=defer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/defer.js.map b/node_modules/rxjs/_esm2015/internal/observable/defer.js.map
deleted file mode 100644
index 2f60654..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/defer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"defer.js","sources":["../../../src/internal/observable/defer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAmDhC,MAAM,UAAU,KAAK,CAAwC,iBAA0B;IACrF,OAAO,IAAI,UAAU,CAAqB,UAAU,CAAC,EAAE;QACrD,IAAI,KAAe,CAAC;QACpB,IAAI;YACF,KAAK,GAAG,iBAAiB,EAAE,CAAC;SAC7B;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAA4C,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACpF,OAAO,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/dom/AjaxObservable.js b/node_modules/rxjs/_esm2015/internal/observable/dom/AjaxObservable.js
deleted file mode 100644
index ceb15ff..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/dom/AjaxObservable.js
+++ /dev/null
@@ -1,359 +0,0 @@
-import { root } from '../../util/root';
-import { Observable } from '../../Observable';
-import { Subscriber } from '../../Subscriber';
-import { map } from '../../operators/map';
-function getCORSRequest() {
-    if (root.XMLHttpRequest) {
-        return new root.XMLHttpRequest();
-    }
-    else if (!!root.XDomainRequest) {
-        return new root.XDomainRequest();
-    }
-    else {
-        throw new Error('CORS is not supported by your browser');
-    }
-}
-function getXMLHttpRequest() {
-    if (root.XMLHttpRequest) {
-        return new root.XMLHttpRequest();
-    }
-    else {
-        let progId;
-        try {
-            const progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
-            for (let i = 0; i < 3; i++) {
-                try {
-                    progId = progIds[i];
-                    if (new root.ActiveXObject(progId)) {
-                        break;
-                    }
-                }
-                catch (e) {
-                }
-            }
-            return new root.ActiveXObject(progId);
-        }
-        catch (e) {
-            throw new Error('XMLHttpRequest is not supported by your browser');
-        }
-    }
-}
-export function ajaxGet(url, headers = null) {
-    return new AjaxObservable({ method: 'GET', url, headers });
-}
-export function ajaxPost(url, body, headers) {
-    return new AjaxObservable({ method: 'POST', url, body, headers });
-}
-export function ajaxDelete(url, headers) {
-    return new AjaxObservable({ method: 'DELETE', url, headers });
-}
-export function ajaxPut(url, body, headers) {
-    return new AjaxObservable({ method: 'PUT', url, body, headers });
-}
-export function ajaxPatch(url, body, headers) {
-    return new AjaxObservable({ method: 'PATCH', url, body, headers });
-}
-const mapResponse = map((x, index) => x.response);
-export function ajaxGetJSON(url, headers) {
-    return mapResponse(new AjaxObservable({
-        method: 'GET',
-        url,
-        responseType: 'json',
-        headers
-    }));
-}
-export class AjaxObservable extends Observable {
-    constructor(urlOrRequest) {
-        super();
-        const request = {
-            async: true,
-            createXHR: function () {
-                return this.crossDomain ? getCORSRequest() : getXMLHttpRequest();
-            },
-            crossDomain: true,
-            withCredentials: false,
-            headers: {},
-            method: 'GET',
-            responseType: 'json',
-            timeout: 0
-        };
-        if (typeof urlOrRequest === 'string') {
-            request.url = urlOrRequest;
-        }
-        else {
-            for (const prop in urlOrRequest) {
-                if (urlOrRequest.hasOwnProperty(prop)) {
-                    request[prop] = urlOrRequest[prop];
-                }
-            }
-        }
-        this.request = request;
-    }
-    _subscribe(subscriber) {
-        return new AjaxSubscriber(subscriber, this.request);
-    }
-}
-AjaxObservable.create = (() => {
-    const create = (urlOrRequest) => {
-        return new AjaxObservable(urlOrRequest);
-    };
-    create.get = ajaxGet;
-    create.post = ajaxPost;
-    create.delete = ajaxDelete;
-    create.put = ajaxPut;
-    create.patch = ajaxPatch;
-    create.getJSON = ajaxGetJSON;
-    return create;
-})();
-export class AjaxSubscriber extends Subscriber {
-    constructor(destination, request) {
-        super(destination);
-        this.request = request;
-        this.done = false;
-        const headers = request.headers = request.headers || {};
-        if (!request.crossDomain && !this.getHeader(headers, 'X-Requested-With')) {
-            headers['X-Requested-With'] = 'XMLHttpRequest';
-        }
-        let contentTypeHeader = this.getHeader(headers, 'Content-Type');
-        if (!contentTypeHeader && !(root.FormData && request.body instanceof root.FormData) && typeof request.body !== 'undefined') {
-            headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
-        }
-        request.body = this.serializeBody(request.body, this.getHeader(request.headers, 'Content-Type'));
-        this.send();
-    }
-    next(e) {
-        this.done = true;
-        const { xhr, request, destination } = this;
-        let result;
-        try {
-            result = new AjaxResponse(e, xhr, request);
-        }
-        catch (err) {
-            return destination.error(err);
-        }
-        destination.next(result);
-    }
-    send() {
-        const { request, request: { user, method, url, async, password, headers, body } } = this;
-        try {
-            const xhr = this.xhr = request.createXHR();
-            this.setupEvents(xhr, request);
-            if (user) {
-                xhr.open(method, url, async, user, password);
-            }
-            else {
-                xhr.open(method, url, async);
-            }
-            if (async) {
-                xhr.timeout = request.timeout;
-                xhr.responseType = request.responseType;
-            }
-            if ('withCredentials' in xhr) {
-                xhr.withCredentials = !!request.withCredentials;
-            }
-            this.setHeaders(xhr, headers);
-            if (body) {
-                xhr.send(body);
-            }
-            else {
-                xhr.send();
-            }
-        }
-        catch (err) {
-            this.error(err);
-        }
-    }
-    serializeBody(body, contentType) {
-        if (!body || typeof body === 'string') {
-            return body;
-        }
-        else if (root.FormData && body instanceof root.FormData) {
-            return body;
-        }
-        if (contentType) {
-            const splitIndex = contentType.indexOf(';');
-            if (splitIndex !== -1) {
-                contentType = contentType.substring(0, splitIndex);
-            }
-        }
-        switch (contentType) {
-            case 'application/x-www-form-urlencoded':
-                return Object.keys(body).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(body[key])}`).join('&');
-            case 'application/json':
-                return JSON.stringify(body);
-            default:
-                return body;
-        }
-    }
-    setHeaders(xhr, headers) {
-        for (let key in headers) {
-            if (headers.hasOwnProperty(key)) {
-                xhr.setRequestHeader(key, headers[key]);
-            }
-        }
-    }
-    getHeader(headers, headerName) {
-        for (let key in headers) {
-            if (key.toLowerCase() === headerName.toLowerCase()) {
-                return headers[key];
-            }
-        }
-        return undefined;
-    }
-    setupEvents(xhr, request) {
-        const progressSubscriber = request.progressSubscriber;
-        function xhrTimeout(e) {
-            const { subscriber, progressSubscriber, request } = xhrTimeout;
-            if (progressSubscriber) {
-                progressSubscriber.error(e);
-            }
-            let error;
-            try {
-                error = new AjaxTimeoutError(this, request);
-            }
-            catch (err) {
-                error = err;
-            }
-            subscriber.error(error);
-        }
-        xhr.ontimeout = xhrTimeout;
-        xhrTimeout.request = request;
-        xhrTimeout.subscriber = this;
-        xhrTimeout.progressSubscriber = progressSubscriber;
-        if (xhr.upload && 'withCredentials' in xhr) {
-            if (progressSubscriber) {
-                let xhrProgress;
-                xhrProgress = function (e) {
-                    const { progressSubscriber } = xhrProgress;
-                    progressSubscriber.next(e);
-                };
-                if (root.XDomainRequest) {
-                    xhr.onprogress = xhrProgress;
-                }
-                else {
-                    xhr.upload.onprogress = xhrProgress;
-                }
-                xhrProgress.progressSubscriber = progressSubscriber;
-            }
-            let xhrError;
-            xhrError = function (e) {
-                const { progressSubscriber, subscriber, request } = xhrError;
-                if (progressSubscriber) {
-                    progressSubscriber.error(e);
-                }
-                let error;
-                try {
-                    error = new AjaxError('ajax error', this, request);
-                }
-                catch (err) {
-                    error = err;
-                }
-                subscriber.error(error);
-            };
-            xhr.onerror = xhrError;
-            xhrError.request = request;
-            xhrError.subscriber = this;
-            xhrError.progressSubscriber = progressSubscriber;
-        }
-        function xhrReadyStateChange(e) {
-            return;
-        }
-        xhr.onreadystatechange = xhrReadyStateChange;
-        xhrReadyStateChange.subscriber = this;
-        xhrReadyStateChange.progressSubscriber = progressSubscriber;
-        xhrReadyStateChange.request = request;
-        function xhrLoad(e) {
-            const { subscriber, progressSubscriber, request } = xhrLoad;
-            if (this.readyState === 4) {
-                let status = this.status === 1223 ? 204 : this.status;
-                let response = (this.responseType === 'text' ? (this.response || this.responseText) : this.response);
-                if (status === 0) {
-                    status = response ? 200 : 0;
-                }
-                if (status < 400) {
-                    if (progressSubscriber) {
-                        progressSubscriber.complete();
-                    }
-                    subscriber.next(e);
-                    subscriber.complete();
-                }
-                else {
-                    if (progressSubscriber) {
-                        progressSubscriber.error(e);
-                    }
-                    let error;
-                    try {
-                        error = new AjaxError('ajax error ' + status, this, request);
-                    }
-                    catch (err) {
-                        error = err;
-                    }
-                    subscriber.error(error);
-                }
-            }
-        }
-        xhr.onload = xhrLoad;
-        xhrLoad.subscriber = this;
-        xhrLoad.progressSubscriber = progressSubscriber;
-        xhrLoad.request = request;
-    }
-    unsubscribe() {
-        const { done, xhr } = this;
-        if (!done && xhr && xhr.readyState !== 4 && typeof xhr.abort === 'function') {
-            xhr.abort();
-        }
-        super.unsubscribe();
-    }
-}
-export class AjaxResponse {
-    constructor(originalEvent, xhr, request) {
-        this.originalEvent = originalEvent;
-        this.xhr = xhr;
-        this.request = request;
-        this.status = xhr.status;
-        this.responseType = xhr.responseType || request.responseType;
-        this.response = parseXhrResponse(this.responseType, xhr);
-    }
-}
-const AjaxErrorImpl = (() => {
-    function AjaxErrorImpl(message, xhr, request) {
-        Error.call(this);
-        this.message = message;
-        this.name = 'AjaxError';
-        this.xhr = xhr;
-        this.request = request;
-        this.status = xhr.status;
-        this.responseType = xhr.responseType || request.responseType;
-        this.response = parseXhrResponse(this.responseType, xhr);
-        return this;
-    }
-    AjaxErrorImpl.prototype = Object.create(Error.prototype);
-    return AjaxErrorImpl;
-})();
-export const AjaxError = AjaxErrorImpl;
-function parseJson(xhr) {
-    if ('response' in xhr) {
-        return xhr.responseType ? xhr.response : JSON.parse(xhr.response || xhr.responseText || 'null');
-    }
-    else {
-        return JSON.parse(xhr.responseText || 'null');
-    }
-}
-function parseXhrResponse(responseType, xhr) {
-    switch (responseType) {
-        case 'json':
-            return parseJson(xhr);
-        case 'xml':
-            return xhr.responseXML;
-        case 'text':
-        default:
-            return ('response' in xhr) ? xhr.response : xhr.responseText;
-    }
-}
-function AjaxTimeoutErrorImpl(xhr, request) {
-    AjaxError.call(this, 'ajax timeout', xhr, request);
-    this.name = 'AjaxTimeoutError';
-    return this;
-}
-export const AjaxTimeoutError = AjaxTimeoutErrorImpl;
-//# sourceMappingURL=AjaxObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/dom/AjaxObservable.js.map b/node_modules/rxjs/_esm2015/internal/observable/dom/AjaxObservable.js.map
deleted file mode 100644
index 2f20380..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/dom/AjaxObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AjaxObservable.js","sources":["../../../../src/internal/observable/dom/AjaxObservable.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/dom/WebSocketSubject.js b/node_modules/rxjs/_esm2015/internal/observable/dom/WebSocketSubject.js
deleted file mode 100644
index 357d29b..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/dom/WebSocketSubject.js
+++ /dev/null
@@ -1,209 +0,0 @@
-import { Subject, AnonymousSubject } from '../../Subject';
-import { Subscriber } from '../../Subscriber';
-import { Observable } from '../../Observable';
-import { Subscription } from '../../Subscription';
-import { ReplaySubject } from '../../ReplaySubject';
-const DEFAULT_WEBSOCKET_CONFIG = {
-    url: '',
-    deserializer: (e) => JSON.parse(e.data),
-    serializer: (value) => JSON.stringify(value),
-};
-const WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT = 'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';
-export class WebSocketSubject extends AnonymousSubject {
-    constructor(urlConfigOrSource, destination) {
-        super();
-        if (urlConfigOrSource instanceof Observable) {
-            this.destination = destination;
-            this.source = urlConfigOrSource;
-        }
-        else {
-            const config = this._config = Object.assign({}, DEFAULT_WEBSOCKET_CONFIG);
-            this._output = new Subject();
-            if (typeof urlConfigOrSource === 'string') {
-                config.url = urlConfigOrSource;
-            }
-            else {
-                for (let key in urlConfigOrSource) {
-                    if (urlConfigOrSource.hasOwnProperty(key)) {
-                        config[key] = urlConfigOrSource[key];
-                    }
-                }
-            }
-            if (!config.WebSocketCtor && WebSocket) {
-                config.WebSocketCtor = WebSocket;
-            }
-            else if (!config.WebSocketCtor) {
-                throw new Error('no WebSocket constructor can be found');
-            }
-            this.destination = new ReplaySubject();
-        }
-    }
-    lift(operator) {
-        const sock = new WebSocketSubject(this._config, this.destination);
-        sock.operator = operator;
-        sock.source = this;
-        return sock;
-    }
-    _resetState() {
-        this._socket = null;
-        if (!this.source) {
-            this.destination = new ReplaySubject();
-        }
-        this._output = new Subject();
-    }
-    multiplex(subMsg, unsubMsg, messageFilter) {
-        const self = this;
-        return new Observable((observer) => {
-            try {
-                self.next(subMsg());
-            }
-            catch (err) {
-                observer.error(err);
-            }
-            const subscription = self.subscribe(x => {
-                try {
-                    if (messageFilter(x)) {
-                        observer.next(x);
-                    }
-                }
-                catch (err) {
-                    observer.error(err);
-                }
-            }, err => observer.error(err), () => observer.complete());
-            return () => {
-                try {
-                    self.next(unsubMsg());
-                }
-                catch (err) {
-                    observer.error(err);
-                }
-                subscription.unsubscribe();
-            };
-        });
-    }
-    _connectSocket() {
-        const { WebSocketCtor, protocol, url, binaryType } = this._config;
-        const observer = this._output;
-        let socket = null;
-        try {
-            socket = protocol ?
-                new WebSocketCtor(url, protocol) :
-                new WebSocketCtor(url);
-            this._socket = socket;
-            if (binaryType) {
-                this._socket.binaryType = binaryType;
-            }
-        }
-        catch (e) {
-            observer.error(e);
-            return;
-        }
-        const subscription = new Subscription(() => {
-            this._socket = null;
-            if (socket && socket.readyState === 1) {
-                socket.close();
-            }
-        });
-        socket.onopen = (e) => {
-            const { _socket } = this;
-            if (!_socket) {
-                socket.close();
-                this._resetState();
-                return;
-            }
-            const { openObserver } = this._config;
-            if (openObserver) {
-                openObserver.next(e);
-            }
-            const queue = this.destination;
-            this.destination = Subscriber.create((x) => {
-                if (socket.readyState === 1) {
-                    try {
-                        const { serializer } = this._config;
-                        socket.send(serializer(x));
-                    }
-                    catch (e) {
-                        this.destination.error(e);
-                    }
-                }
-            }, (e) => {
-                const { closingObserver } = this._config;
-                if (closingObserver) {
-                    closingObserver.next(undefined);
-                }
-                if (e && e.code) {
-                    socket.close(e.code, e.reason);
-                }
-                else {
-                    observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));
-                }
-                this._resetState();
-            }, () => {
-                const { closingObserver } = this._config;
-                if (closingObserver) {
-                    closingObserver.next(undefined);
-                }
-                socket.close();
-                this._resetState();
-            });
-            if (queue && queue instanceof ReplaySubject) {
-                subscription.add(queue.subscribe(this.destination));
-            }
-        };
-        socket.onerror = (e) => {
-            this._resetState();
-            observer.error(e);
-        };
-        socket.onclose = (e) => {
-            this._resetState();
-            const { closeObserver } = this._config;
-            if (closeObserver) {
-                closeObserver.next(e);
-            }
-            if (e.wasClean) {
-                observer.complete();
-            }
-            else {
-                observer.error(e);
-            }
-        };
-        socket.onmessage = (e) => {
-            try {
-                const { deserializer } = this._config;
-                observer.next(deserializer(e));
-            }
-            catch (err) {
-                observer.error(err);
-            }
-        };
-    }
-    _subscribe(subscriber) {
-        const { source } = this;
-        if (source) {
-            return source.subscribe(subscriber);
-        }
-        if (!this._socket) {
-            this._connectSocket();
-        }
-        this._output.subscribe(subscriber);
-        subscriber.add(() => {
-            const { _socket } = this;
-            if (this._output.observers.length === 0) {
-                if (_socket && _socket.readyState === 1) {
-                    _socket.close();
-                }
-                this._resetState();
-            }
-        });
-        return subscriber;
-    }
-    unsubscribe() {
-        const { _socket } = this;
-        if (_socket && _socket.readyState === 1) {
-            _socket.close();
-        }
-        this._resetState();
-        super.unsubscribe();
-    }
-}
-//# sourceMappingURL=WebSocketSubject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/dom/WebSocketSubject.js.map b/node_modules/rxjs/_esm2015/internal/observable/dom/WebSocketSubject.js.map
deleted file mode 100644
index 46e5ddd..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/dom/WebSocketSubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"WebSocketSubject.js","sources":["../../../../src/internal/observable/dom/WebSocketSubject.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/dom/ajax.js b/node_modules/rxjs/_esm2015/internal/observable/dom/ajax.js
deleted file mode 100644
index 3ac14f2..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/dom/ajax.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import { AjaxObservable } from './AjaxObservable';
-export const ajax = (() => AjaxObservable.create)();
-//# sourceMappingURL=ajax.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/dom/ajax.js.map b/node_modules/rxjs/_esm2015/internal/observable/dom/ajax.js.map
deleted file mode 100644
index 4803b49..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/dom/ajax.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ajax.js","sources":["../../../../src/internal/observable/dom/ajax.ts"],"names":[],"mappings":"AAAA,OAAO,EAAG,cAAc,EAAuB,MAAM,kBAAkB,CAAC;AAiFxE,MAAM,CAAC,MAAM,IAAI,GAAuB,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/dom/fetch.js b/node_modules/rxjs/_esm2015/internal/observable/dom/fetch.js
deleted file mode 100644
index a999d8b..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/dom/fetch.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import { Observable } from '../../Observable';
-export function fromFetch(input, init) {
-    return new Observable(subscriber => {
-        const controller = new AbortController();
-        const signal = controller.signal;
-        let outerSignalHandler;
-        let abortable = true;
-        let unsubscribed = false;
-        if (init) {
-            if (init.signal) {
-                if (init.signal.aborted) {
-                    controller.abort();
-                }
-                else {
-                    outerSignalHandler = () => {
-                        if (!signal.aborted) {
-                            controller.abort();
-                        }
-                    };
-                    init.signal.addEventListener('abort', outerSignalHandler);
-                }
-            }
-            init = Object.assign({}, init, { signal });
-        }
-        else {
-            init = { signal };
-        }
-        fetch(input, init).then(response => {
-            abortable = false;
-            subscriber.next(response);
-            subscriber.complete();
-        }).catch(err => {
-            abortable = false;
-            if (!unsubscribed) {
-                subscriber.error(err);
-            }
-        });
-        return () => {
-            unsubscribed = true;
-            if (abortable) {
-                controller.abort();
-            }
-        };
-    });
-}
-//# sourceMappingURL=fetch.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/dom/fetch.js.map b/node_modules/rxjs/_esm2015/internal/observable/dom/fetch.js.map
deleted file mode 100644
index ef2034c..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/dom/fetch.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fetch.js","sources":["../../../../src/internal/observable/dom/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAoD9C,MAAM,UAAU,SAAS,CAAC,KAAuB,EAAE,IAAkB;IACnE,OAAO,IAAI,UAAU,CAAW,UAAU,CAAC,EAAE;QAC3C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,IAAI,kBAA8B,CAAC;QACnC,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,IAAI,IAAI,EAAE;YAER,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;oBACvB,UAAU,CAAC,KAAK,EAAE,CAAC;iBACpB;qBAAM;oBACL,kBAAkB,GAAG,GAAG,EAAE;wBACxB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;4BACnB,UAAU,CAAC,KAAK,EAAE,CAAC;yBACpB;oBACH,CAAC,CAAC;oBACF,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;iBAC3D;aACF;YACD,IAAI,qBAAQ,IAAI,IAAE,MAAM,GAAE,CAAC;SAC5B;aAAM;YACL,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC;SACnB;QAED,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACjC,SAAS,GAAG,KAAK,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACb,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,YAAY,EAAE;gBAEjB,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACvB;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,YAAY,GAAG,IAAI,CAAC;YACpB,IAAI,SAAS,EAAE;gBACb,UAAU,CAAC,KAAK,EAAE,CAAC;aACpB;QACH,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/dom/webSocket.js b/node_modules/rxjs/_esm2015/internal/observable/dom/webSocket.js
deleted file mode 100644
index 73a51ab..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/dom/webSocket.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { WebSocketSubject } from './WebSocketSubject';
-export function webSocket(urlConfigOrSource) {
-    return new WebSocketSubject(urlConfigOrSource);
-}
-//# sourceMappingURL=webSocket.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/dom/webSocket.js.map b/node_modules/rxjs/_esm2015/internal/observable/dom/webSocket.js.map
deleted file mode 100644
index 821e4e6..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/dom/webSocket.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"webSocket.js","sources":["../../../../src/internal/observable/dom/webSocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA0B,MAAM,oBAAoB,CAAC;AAyJ9E,MAAM,UAAU,SAAS,CAAI,iBAAqD;IAChF,OAAO,IAAI,gBAAgB,CAAI,iBAAiB,CAAC,CAAC;AACpD,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/empty.js b/node_modules/rxjs/_esm2015/internal/observable/empty.js
deleted file mode 100644
index 6cbbbdc..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/empty.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import { Observable } from '../Observable';
-export const EMPTY = new Observable(subscriber => subscriber.complete());
-export function empty(scheduler) {
-    return scheduler ? emptyScheduled(scheduler) : EMPTY;
-}
-function emptyScheduled(scheduler) {
-    return new Observable(subscriber => scheduler.schedule(() => subscriber.complete()));
-}
-//# sourceMappingURL=empty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/empty.js.map b/node_modules/rxjs/_esm2015/internal/observable/empty.js.map
deleted file mode 100644
index 34f52c9..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/empty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"empty.js","sources":["../../../src/internal/observable/empty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAO3C,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAQ,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;AAsDhF,MAAM,UAAU,KAAK,CAAC,SAAyB;IAC7C,OAAO,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CAAC,SAAwB;IAC9C,OAAO,IAAI,UAAU,CAAQ,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/forkJoin.js b/node_modules/rxjs/_esm2015/internal/observable/forkJoin.js
deleted file mode 100644
index ca915a1..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/forkJoin.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import { Observable } from '../Observable';
-import { isArray } from '../util/isArray';
-import { map } from '../operators/map';
-import { isObject } from '../util/isObject';
-import { from } from './from';
-export function forkJoin(...sources) {
-    if (sources.length === 1) {
-        const first = sources[0];
-        if (isArray(first)) {
-            return forkJoinInternal(first, null);
-        }
-        if (isObject(first) && Object.getPrototypeOf(first) === Object.prototype) {
-            const keys = Object.keys(first);
-            return forkJoinInternal(keys.map(key => first[key]), keys);
-        }
-    }
-    if (typeof sources[sources.length - 1] === 'function') {
-        const resultSelector = sources.pop();
-        sources = (sources.length === 1 && isArray(sources[0])) ? sources[0] : sources;
-        return forkJoinInternal(sources, null).pipe(map((args) => resultSelector(...args)));
-    }
-    return forkJoinInternal(sources, null);
-}
-function forkJoinInternal(sources, keys) {
-    return new Observable(subscriber => {
-        const len = sources.length;
-        if (len === 0) {
-            subscriber.complete();
-            return;
-        }
-        const values = new Array(len);
-        let completed = 0;
-        let emitted = 0;
-        for (let i = 0; i < len; i++) {
-            const source = from(sources[i]);
-            let hasValue = false;
-            subscriber.add(source.subscribe({
-                next: value => {
-                    if (!hasValue) {
-                        hasValue = true;
-                        emitted++;
-                    }
-                    values[i] = value;
-                },
-                error: err => subscriber.error(err),
-                complete: () => {
-                    completed++;
-                    if (completed === len || !hasValue) {
-                        if (emitted === len) {
-                            subscriber.next(keys ?
-                                keys.reduce((result, key, i) => (result[key] = values[i], result), {}) :
-                                values);
-                        }
-                        subscriber.complete();
-                    }
-                }
-            }));
-        }
-    });
-}
-//# sourceMappingURL=forkJoin.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/forkJoin.js.map b/node_modules/rxjs/_esm2015/internal/observable/forkJoin.js.map
deleted file mode 100644
index f853804..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/forkJoin.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"forkJoin.js","sources":["../../../src/internal/observable/forkJoin.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/from.js b/node_modules/rxjs/_esm2015/internal/observable/from.js
deleted file mode 100644
index 8dfff4e..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/from.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Observable } from '../Observable';
-import { subscribeTo } from '../util/subscribeTo';
-import { scheduled } from '../scheduled/scheduled';
-export function from(input, scheduler) {
-    if (!scheduler) {
-        if (input instanceof Observable) {
-            return input;
-        }
-        return new Observable(subscribeTo(input));
-    }
-    else {
-        return scheduled(input, scheduler);
-    }
-}
-//# sourceMappingURL=from.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/from.js.map b/node_modules/rxjs/_esm2015/internal/observable/from.js.map
deleted file mode 100644
index d0b7a0a..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/from.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"from.js","sources":["../../../src/internal/observable/from.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAyGnD,MAAM,UAAU,IAAI,CAAI,KAAyB,EAAE,SAAyB;IAC1E,IAAI,CAAC,SAAS,EAAE;QACd,IAAI,KAAK,YAAY,UAAU,EAAE;YAC/B,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,UAAU,CAAI,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;KAC9C;SAAM;QACL,OAAO,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;KACpC;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/fromArray.js b/node_modules/rxjs/_esm2015/internal/observable/fromArray.js
deleted file mode 100644
index b738433..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/fromArray.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Observable } from '../Observable';
-import { subscribeToArray } from '../util/subscribeToArray';
-import { scheduleArray } from '../scheduled/scheduleArray';
-export function fromArray(input, scheduler) {
-    if (!scheduler) {
-        return new Observable(subscribeToArray(input));
-    }
-    else {
-        return scheduleArray(input, scheduler);
-    }
-}
-//# sourceMappingURL=fromArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/fromArray.js.map b/node_modules/rxjs/_esm2015/internal/observable/fromArray.js.map
deleted file mode 100644
index 55af2ba..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/fromArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromArray.js","sources":["../../../src/internal/observable/fromArray.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,MAAM,UAAU,SAAS,CAAI,KAAmB,EAAE,SAAyB;IACzE,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,UAAU,CAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;KACnD;SAAM;QACL,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;KACxC;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/fromEvent.js b/node_modules/rxjs/_esm2015/internal/observable/fromEvent.js
deleted file mode 100644
index 141acce..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/fromEvent.js
+++ /dev/null
@@ -1,62 +0,0 @@
-import { Observable } from '../Observable';
-import { isArray } from '../util/isArray';
-import { isFunction } from '../util/isFunction';
-import { map } from '../operators/map';
-const toString = (() => Object.prototype.toString)();
-export function fromEvent(target, eventName, options, resultSelector) {
-    if (isFunction(options)) {
-        resultSelector = options;
-        options = undefined;
-    }
-    if (resultSelector) {
-        return fromEvent(target, eventName, options).pipe(map(args => isArray(args) ? resultSelector(...args) : resultSelector(args)));
-    }
-    return new Observable(subscriber => {
-        function handler(e) {
-            if (arguments.length > 1) {
-                subscriber.next(Array.prototype.slice.call(arguments));
-            }
-            else {
-                subscriber.next(e);
-            }
-        }
-        setupSubscription(target, eventName, handler, subscriber, options);
-    });
-}
-function setupSubscription(sourceObj, eventName, handler, subscriber, options) {
-    let unsubscribe;
-    if (isEventTarget(sourceObj)) {
-        const source = sourceObj;
-        sourceObj.addEventListener(eventName, handler, options);
-        unsubscribe = () => source.removeEventListener(eventName, handler, options);
-    }
-    else if (isJQueryStyleEventEmitter(sourceObj)) {
-        const source = sourceObj;
-        sourceObj.on(eventName, handler);
-        unsubscribe = () => source.off(eventName, handler);
-    }
-    else if (isNodeStyleEventEmitter(sourceObj)) {
-        const source = sourceObj;
-        sourceObj.addListener(eventName, handler);
-        unsubscribe = () => source.removeListener(eventName, handler);
-    }
-    else if (sourceObj && sourceObj.length) {
-        for (let i = 0, len = sourceObj.length; i < len; i++) {
-            setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
-        }
-    }
-    else {
-        throw new TypeError('Invalid event target');
-    }
-    subscriber.add(unsubscribe);
-}
-function isNodeStyleEventEmitter(sourceObj) {
-    return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';
-}
-function isJQueryStyleEventEmitter(sourceObj) {
-    return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';
-}
-function isEventTarget(sourceObj) {
-    return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
-}
-//# sourceMappingURL=fromEvent.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/fromEvent.js.map b/node_modules/rxjs/_esm2015/internal/observable/fromEvent.js.map
deleted file mode 100644
index 41428ba..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/fromEvent.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromEvent.js","sources":["../../../src/internal/observable/fromEvent.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/fromEventPattern.js b/node_modules/rxjs/_esm2015/internal/observable/fromEventPattern.js
deleted file mode 100644
index e9e5935..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/fromEventPattern.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { Observable } from '../Observable';
-import { isArray } from '../util/isArray';
-import { isFunction } from '../util/isFunction';
-import { map } from '../operators/map';
-export function fromEventPattern(addHandler, removeHandler, resultSelector) {
-    if (resultSelector) {
-        return fromEventPattern(addHandler, removeHandler).pipe(map(args => isArray(args) ? resultSelector(...args) : resultSelector(args)));
-    }
-    return new Observable(subscriber => {
-        const handler = (...e) => subscriber.next(e.length === 1 ? e[0] : e);
-        let retValue;
-        try {
-            retValue = addHandler(handler);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        if (!isFunction(removeHandler)) {
-            return undefined;
-        }
-        return () => removeHandler(handler, retValue);
-    });
-}
-//# sourceMappingURL=fromEventPattern.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/fromEventPattern.js.map b/node_modules/rxjs/_esm2015/internal/observable/fromEventPattern.js.map
deleted file mode 100644
index 976454a..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/fromEventPattern.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromEventPattern.js","sources":["../../../src/internal/observable/fromEventPattern.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAwIvC,MAAM,UAAU,gBAAgB,CAAI,UAA8C,EAC9C,aAAiE,EACjE,cAAsC;IAExE,IAAI,cAAc,EAAE;QAElB,OAAO,gBAAgB,CAAI,UAAU,EAAE,aAAa,CAAC,CAAC,IAAI,CACxD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAC5E,CAAC;KACH;IAED,OAAO,IAAI,UAAU,CAAU,UAAU,CAAC,EAAE;QAC1C,MAAM,OAAO,GAAG,CAAC,GAAG,CAAM,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1E,IAAI,QAAa,CAAC;QAClB,IAAI;YACF,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;SAChC;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;YAC9B,OAAO,SAAS,CAAC;SAClB;QAED,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAE;IACjD,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/fromIterable.js b/node_modules/rxjs/_esm2015/internal/observable/fromIterable.js
deleted file mode 100644
index 4788d58..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/fromIterable.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Observable } from '../Observable';
-import { subscribeToIterable } from '../util/subscribeToIterable';
-import { scheduleIterable } from '../scheduled/scheduleIterable';
-export function fromIterable(input, scheduler) {
-    if (!input) {
-        throw new Error('Iterable cannot be null');
-    }
-    if (!scheduler) {
-        return new Observable(subscribeToIterable(input));
-    }
-    else {
-        return scheduleIterable(input, scheduler);
-    }
-}
-//# sourceMappingURL=fromIterable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/fromIterable.js.map b/node_modules/rxjs/_esm2015/internal/observable/fromIterable.js.map
deleted file mode 100644
index f150bb3..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/fromIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromIterable.js","sources":["../../../src/internal/observable/fromIterable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,UAAU,YAAY,CAAI,KAAkB,EAAE,SAAyB;IAC3E,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;KAC5C;IACD,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,UAAU,CAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;KACtD;SAAM;QACL,OAAO,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;KAC3C;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/fromPromise.js b/node_modules/rxjs/_esm2015/internal/observable/fromPromise.js
deleted file mode 100644
index 127086c..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/fromPromise.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Observable } from '../Observable';
-import { subscribeToPromise } from '../util/subscribeToPromise';
-import { schedulePromise } from '../scheduled/schedulePromise';
-export function fromPromise(input, scheduler) {
-    if (!scheduler) {
-        return new Observable(subscribeToPromise(input));
-    }
-    else {
-        return schedulePromise(input, scheduler);
-    }
-}
-//# sourceMappingURL=fromPromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/fromPromise.js.map b/node_modules/rxjs/_esm2015/internal/observable/fromPromise.js.map
deleted file mode 100644
index d695e5b..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/fromPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromPromise.js","sources":["../../../src/internal/observable/fromPromise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,UAAU,WAAW,CAAI,KAAqB,EAAE,SAAyB;IAC7E,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,UAAU,CAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;KACrD;SAAM;QACL,OAAO,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;KAC1C;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/generate.js b/node_modules/rxjs/_esm2015/internal/observable/generate.js
deleted file mode 100644
index 6f07fa1..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/generate.js
+++ /dev/null
@@ -1,124 +0,0 @@
-import { Observable } from '../Observable';
-import { identity } from '../util/identity';
-import { isScheduler } from '../util/isScheduler';
-export function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {
-    let resultSelector;
-    let initialState;
-    if (arguments.length == 1) {
-        const options = initialStateOrOptions;
-        initialState = options.initialState;
-        condition = options.condition;
-        iterate = options.iterate;
-        resultSelector = options.resultSelector || identity;
-        scheduler = options.scheduler;
-    }
-    else if (resultSelectorOrObservable === undefined || isScheduler(resultSelectorOrObservable)) {
-        initialState = initialStateOrOptions;
-        resultSelector = identity;
-        scheduler = resultSelectorOrObservable;
-    }
-    else {
-        initialState = initialStateOrOptions;
-        resultSelector = resultSelectorOrObservable;
-    }
-    return new Observable(subscriber => {
-        let state = initialState;
-        if (scheduler) {
-            return scheduler.schedule(dispatch, 0, {
-                subscriber,
-                iterate,
-                condition,
-                resultSelector,
-                state
-            });
-        }
-        do {
-            if (condition) {
-                let conditionResult;
-                try {
-                    conditionResult = condition(state);
-                }
-                catch (err) {
-                    subscriber.error(err);
-                    return undefined;
-                }
-                if (!conditionResult) {
-                    subscriber.complete();
-                    break;
-                }
-            }
-            let value;
-            try {
-                value = resultSelector(state);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-            subscriber.next(value);
-            if (subscriber.closed) {
-                break;
-            }
-            try {
-                state = iterate(state);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-        } while (true);
-        return undefined;
-    });
-}
-function dispatch(state) {
-    const { subscriber, condition } = state;
-    if (subscriber.closed) {
-        return undefined;
-    }
-    if (state.needIterate) {
-        try {
-            state.state = state.iterate(state.state);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-    }
-    else {
-        state.needIterate = true;
-    }
-    if (condition) {
-        let conditionResult;
-        try {
-            conditionResult = condition(state.state);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        if (!conditionResult) {
-            subscriber.complete();
-            return undefined;
-        }
-        if (subscriber.closed) {
-            return undefined;
-        }
-    }
-    let value;
-    try {
-        value = state.resultSelector(state.state);
-    }
-    catch (err) {
-        subscriber.error(err);
-        return undefined;
-    }
-    if (subscriber.closed) {
-        return undefined;
-    }
-    subscriber.next(value);
-    if (subscriber.closed) {
-        return undefined;
-    }
-    return this.schedule(state);
-}
-//# sourceMappingURL=generate.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/generate.js.map b/node_modules/rxjs/_esm2015/internal/observable/generate.js.map
deleted file mode 100644
index 81273db..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/generate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"generate.js","sources":["../../../src/internal/observable/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA8PlD,MAAM,UAAU,QAAQ,CAAO,qBAAgD,EAChD,SAA4B,EAC5B,OAAwB,EACxB,0BAA+D,EAC/D,SAAyB;IAEtD,IAAI,cAAgC,CAAC;IACrC,IAAI,YAAe,CAAC;IAEpB,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACzB,MAAM,OAAO,GAAG,qBAA8C,CAAC;QAC/D,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACpC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAC9B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC1B,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,QAA4B,CAAC;QACxE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;KAC/B;SAAM,IAAI,0BAA0B,KAAK,SAAS,IAAI,WAAW,CAAC,0BAA0B,CAAC,EAAE;QAC9F,YAAY,GAAG,qBAA0B,CAAC;QAC1C,cAAc,GAAG,QAA4B,CAAC;QAC9C,SAAS,GAAG,0BAA2C,CAAC;KACzD;SAAM;QACL,YAAY,GAAG,qBAA0B,CAAC;QAC1C,cAAc,GAAG,0BAA8C,CAAC;KACjE;IAED,OAAO,IAAI,UAAU,CAAI,UAAU,CAAC,EAAE;QACpC,IAAI,KAAK,GAAG,YAAY,CAAC;QACzB,IAAI,SAAS,EAAE;YACb,OAAO,SAAS,CAAC,QAAQ,CAAuB,QAAQ,EAAE,CAAC,EAAE;gBAC3D,UAAU;gBACV,OAAO;gBACP,SAAS;gBACT,cAAc;gBACd,KAAK;aACN,CAAC,CAAC;SACJ;QAED,GAAG;YACD,IAAI,SAAS,EAAE;gBACb,IAAI,eAAwB,CAAC;gBAC7B,IAAI;oBACF,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;iBACpC;gBAAC,OAAO,GAAG,EAAE;oBACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACtB,OAAO,SAAS,CAAC;iBAClB;gBACD,IAAI,CAAC,eAAe,EAAE;oBACpB,UAAU,CAAC,QAAQ,EAAE,CAAC;oBACtB,MAAM;iBACP;aACF;YACD,IAAI,KAAQ,CAAC;YACb,IAAI;gBACF,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;aAC/B;YAAC,OAAO,GAAG,EAAE;gBACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACtB,OAAO,SAAS,CAAC;aAClB;YACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,IAAI,UAAU,CAAC,MAAM,EAAE;gBACrB,MAAM;aACP;YACD,IAAI;gBACF,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;aACxB;YAAC,OAAO,GAAG,EAAE;gBACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACtB,OAAO,SAAS,CAAC;aAClB;SACF,QAAQ,IAAI,EAAE;QAEf,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAoD,KAA2B;IAC9F,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACxC,IAAI,UAAU,CAAC,MAAM,EAAE;QACrB,OAAO,SAAS,CAAC;KAClB;IACD,IAAI,KAAK,CAAC,WAAW,EAAE;QACrB,IAAI;YACF,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SAC1C;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;KACF;SAAM;QACL,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;KAC1B;IACD,IAAI,SAAS,EAAE;QACb,IAAI,eAAwB,CAAC;QAC7B,IAAI;YACF,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SAC1C;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QACD,IAAI,CAAC,eAAe,EAAE;YACpB,UAAU,CAAC,QAAQ,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QACD,IAAI,UAAU,CAAC,MAAM,EAAE;YACrB,OAAO,SAAS,CAAC;SAClB;KACF;IACD,IAAI,KAAQ,CAAC;IACb,IAAI;QACF,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KAC3C;IAAC,OAAO,GAAG,EAAE;QACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO,SAAS,CAAC;KAClB;IACD,IAAI,UAAU,CAAC,MAAM,EAAE;QACrB,OAAO,SAAS,CAAC;KAClB;IACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,IAAI,UAAU,CAAC,MAAM,EAAE;QACrB,OAAO,SAAS,CAAC;KAClB;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/iif.js b/node_modules/rxjs/_esm2015/internal/observable/iif.js
deleted file mode 100644
index 91a626f..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/iif.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { defer } from './defer';
-import { EMPTY } from './empty';
-export function iif(condition, trueResult = EMPTY, falseResult = EMPTY) {
-    return defer(() => condition() ? trueResult : falseResult);
-}
-//# sourceMappingURL=iif.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/iif.js.map b/node_modules/rxjs/_esm2015/internal/observable/iif.js.map
deleted file mode 100644
index fe69e79..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/iif.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"iif.js","sources":["../../../src/internal/observable/iif.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AA2FhC,MAAM,UAAU,GAAG,CACjB,SAAwB,EACxB,aAAuC,KAAK,EAC5C,cAAwC,KAAK;IAE7C,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AAC7D,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/interval.js b/node_modules/rxjs/_esm2015/internal/observable/interval.js
deleted file mode 100644
index 4dbe4a0..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/interval.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import { Observable } from '../Observable';
-import { async } from '../scheduler/async';
-import { isNumeric } from '../util/isNumeric';
-export function interval(period = 0, scheduler = async) {
-    if (!isNumeric(period) || period < 0) {
-        period = 0;
-    }
-    if (!scheduler || typeof scheduler.schedule !== 'function') {
-        scheduler = async;
-    }
-    return new Observable(subscriber => {
-        subscriber.add(scheduler.schedule(dispatch, period, { subscriber, counter: 0, period }));
-        return subscriber;
-    });
-}
-function dispatch(state) {
-    const { subscriber, counter, period } = state;
-    subscriber.next(counter);
-    this.schedule({ subscriber, counter: counter + 1, period }, period);
-}
-//# sourceMappingURL=interval.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/interval.js.map b/node_modules/rxjs/_esm2015/internal/observable/interval.js.map
deleted file mode 100644
index 67f6681..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/interval.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"interval.js","sources":["../../../src/internal/observable/interval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAmD9C,MAAM,UAAU,QAAQ,CAAC,MAAM,GAAG,CAAC,EACV,YAA2B,KAAK;IACvD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE;QACpC,MAAM,GAAG,CAAC,CAAC;KACZ;IAED,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE;QAC1D,SAAS,GAAG,KAAK,CAAC;KACnB;IAED,OAAO,IAAI,UAAU,CAAS,UAAU,CAAC,EAAE;QACzC,UAAU,CAAC,GAAG,CACZ,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CACzE,CAAC;QACF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAuC,KAAoB;IAC1E,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC9C,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/merge.js b/node_modules/rxjs/_esm2015/internal/observable/merge.js
deleted file mode 100644
index c62e364..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/merge.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Observable } from '../Observable';
-import { isScheduler } from '../util/isScheduler';
-import { mergeAll } from '../operators/mergeAll';
-import { fromArray } from './fromArray';
-export function merge(...observables) {
-    let concurrent = Number.POSITIVE_INFINITY;
-    let scheduler = null;
-    let last = observables[observables.length - 1];
-    if (isScheduler(last)) {
-        scheduler = observables.pop();
-        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
-            concurrent = observables.pop();
-        }
-    }
-    else if (typeof last === 'number') {
-        concurrent = observables.pop();
-    }
-    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable) {
-        return observables[0];
-    }
-    return mergeAll(concurrent)(fromArray(observables, scheduler));
-}
-//# sourceMappingURL=merge.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/merge.js.map b/node_modules/rxjs/_esm2015/internal/observable/merge.js.map
deleted file mode 100644
index 8327b24..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/merge.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"merge.js","sources":["../../../src/internal/observable/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAqHxC,MAAM,UAAU,KAAK,CAAO,GAAG,WAAiE;IAC/F,IAAI,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAC1C,IAAI,SAAS,GAAkB,IAAI,CAAC;IACnC,IAAI,IAAI,GAAQ,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpD,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE;QACrB,SAAS,GAAkB,WAAW,CAAC,GAAG,EAAE,CAAC;QAC7C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,QAAQ,EAAE;YACrF,UAAU,GAAW,WAAW,CAAC,GAAG,EAAE,CAAC;SACxC;KACF;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,UAAU,GAAW,WAAW,CAAC,GAAG,EAAE,CAAC;KACxC;IAED,IAAI,SAAS,KAAK,IAAI,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,YAAY,UAAU,EAAE;QAC1F,OAAsB,WAAW,CAAC,CAAC,CAAC,CAAC;KACtC;IAED,OAAO,QAAQ,CAAI,UAAU,CAAC,CAAC,SAAS,CAAM,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AACzE,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/never.js b/node_modules/rxjs/_esm2015/internal/observable/never.js
deleted file mode 100644
index ca45f75..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/never.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import { Observable } from '../Observable';
-import { noop } from '../util/noop';
-export const NEVER = new Observable(noop);
-export function never() {
-    return NEVER;
-}
-//# sourceMappingURL=never.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/never.js.map b/node_modules/rxjs/_esm2015/internal/observable/never.js.map
deleted file mode 100644
index aa51b97..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/never.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"never.js","sources":["../../../src/internal/observable/never.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAgCpC,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAQ,IAAI,CAAC,CAAC;AAKjD,MAAM,UAAU,KAAK;IACnB,OAAO,KAAK,CAAC;AACf,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/of.js b/node_modules/rxjs/_esm2015/internal/observable/of.js
deleted file mode 100644
index fdfd611..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/of.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import { isScheduler } from '../util/isScheduler';
-import { fromArray } from './fromArray';
-import { scheduleArray } from '../scheduled/scheduleArray';
-export function of(...args) {
-    let scheduler = args[args.length - 1];
-    if (isScheduler(scheduler)) {
-        args.pop();
-        return scheduleArray(args, scheduler);
-    }
-    else {
-        return fromArray(args);
-    }
-}
-//# sourceMappingURL=of.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/of.js.map b/node_modules/rxjs/_esm2015/internal/observable/of.js.map
deleted file mode 100644
index 4347b59..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/of.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"of.js","sources":["../../../src/internal/observable/of.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAiG3D,MAAM,UAAU,EAAE,CAAI,GAAG,IAA8B;IACrD,IAAI,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAkB,CAAC;IACvD,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE;QAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,OAAO,aAAa,CAAC,IAAW,EAAE,SAAS,CAAC,CAAC;KAC9C;SAAM;QACL,OAAO,SAAS,CAAC,IAAW,CAAC,CAAC;KAC/B;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/onErrorResumeNext.js b/node_modules/rxjs/_esm2015/internal/observable/onErrorResumeNext.js
deleted file mode 100644
index ac1fdee..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/onErrorResumeNext.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Observable } from '../Observable';
-import { from } from './from';
-import { isArray } from '../util/isArray';
-import { EMPTY } from './empty';
-export function onErrorResumeNext(...sources) {
-    if (sources.length === 0) {
-        return EMPTY;
-    }
-    const [first, ...remainder] = sources;
-    if (sources.length === 1 && isArray(first)) {
-        return onErrorResumeNext(...first);
-    }
-    return new Observable(subscriber => {
-        const subNext = () => subscriber.add(onErrorResumeNext(...remainder).subscribe(subscriber));
-        return from(first).subscribe({
-            next(value) { subscriber.next(value); },
-            error: subNext,
-            complete: subNext,
-        });
-    });
-}
-//# sourceMappingURL=onErrorResumeNext.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/onErrorResumeNext.js.map b/node_modules/rxjs/_esm2015/internal/observable/onErrorResumeNext.js.map
deleted file mode 100644
index 44bd5d3..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/onErrorResumeNext.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"onErrorResumeNext.js","sources":["../../../src/internal/observable/onErrorResumeNext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAwEhC,MAAM,UAAU,iBAAiB,CAAO,GAAG,OAEkD;IAE3F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,KAAK,CAAC;KACd;IAED,MAAM,CAAE,KAAK,EAAE,GAAG,SAAS,CAAE,GAAG,OAAO,CAAC;IAExC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;QAC1C,OAAO,iBAAiB,CAAC,GAAG,KAAK,CAAC,CAAC;KACpC;IAED,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE;QACjC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAClC,iBAAiB,CAAC,GAAG,SAAS,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CACtD,CAAC;QAEF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;YAC3B,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvC,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/pairs.js b/node_modules/rxjs/_esm2015/internal/observable/pairs.js
deleted file mode 100644
index 573ef30..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/pairs.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-export function pairs(obj, scheduler) {
-    if (!scheduler) {
-        return new Observable(subscriber => {
-            const keys = Object.keys(obj);
-            for (let i = 0; i < keys.length && !subscriber.closed; i++) {
-                const key = keys[i];
-                if (obj.hasOwnProperty(key)) {
-                    subscriber.next([key, obj[key]]);
-                }
-            }
-            subscriber.complete();
-        });
-    }
-    else {
-        return new Observable(subscriber => {
-            const keys = Object.keys(obj);
-            const subscription = new Subscription();
-            subscription.add(scheduler.schedule(dispatch, 0, { keys, index: 0, subscriber, subscription, obj }));
-            return subscription;
-        });
-    }
-}
-export function dispatch(state) {
-    const { keys, index, subscriber, subscription, obj } = state;
-    if (!subscriber.closed) {
-        if (index < keys.length) {
-            const key = keys[index];
-            subscriber.next([key, obj[key]]);
-            subscription.add(this.schedule({ keys, index: index + 1, subscriber, subscription, obj }));
-        }
-        else {
-            subscriber.complete();
-        }
-    }
-}
-//# sourceMappingURL=pairs.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/pairs.js.map b/node_modules/rxjs/_esm2015/internal/observable/pairs.js.map
deleted file mode 100644
index e14867e..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/pairs.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pairs.js","sources":["../../../src/internal/observable/pairs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAkD/C,MAAM,UAAU,KAAK,CAAI,GAAW,EAAE,SAAyB;IAC7D,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,UAAU,CAAc,UAAU,CAAC,EAAE;YAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;oBAC3B,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAClC;aACF;YACD,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;KACJ;SAAM;QACL,OAAO,IAAI,UAAU,CAAc,UAAU,CAAC,EAAE;YAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;YACxC,YAAY,CAAC,GAAG,CACd,SAAS,CAAC,QAAQ,CACf,QAAQ,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YACtE,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC;KACJ;AACH,CAAC;AAGD,MAAM,UAAU,QAAQ,CACI,KAAsH;IAChJ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAC7D,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QACtB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;SAC5F;aAAM;YACL,UAAU,CAAC,QAAQ,EAAE,CAAC;SACvB;KACF;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/partition.js b/node_modules/rxjs/_esm2015/internal/observable/partition.js
deleted file mode 100644
index a34a734..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/partition.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { not } from '../util/not';
-import { subscribeTo } from '../util/subscribeTo';
-import { filter } from '../operators/filter';
-import { Observable } from '../Observable';
-export function partition(source, predicate, thisArg) {
-    return [
-        filter(predicate, thisArg)(new Observable(subscribeTo(source))),
-        filter(not(predicate, thisArg))(new Observable(subscribeTo(source)))
-    ];
-}
-//# sourceMappingURL=partition.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/partition.js.map b/node_modules/rxjs/_esm2015/internal/observable/partition.js.map
deleted file mode 100644
index 6c8ed22..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/partition.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"partition.js","sources":["../../../src/internal/observable/partition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAqD3C,MAAM,UAAU,SAAS,CACvB,MAA0B,EAC1B,SAA+C,EAC/C,OAAa;IAEb,OAAO;QACL,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,UAAU,CAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAQ,CAAC,CAAC,IAAI,UAAU,CAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;KAC7C,CAAC;AACtC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/race.js b/node_modules/rxjs/_esm2015/internal/observable/race.js
deleted file mode 100644
index 10b093e..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/race.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import { isArray } from '../util/isArray';
-import { fromArray } from './fromArray';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function race(...observables) {
-    if (observables.length === 1) {
-        if (isArray(observables[0])) {
-            observables = observables[0];
-        }
-        else {
-            return observables[0];
-        }
-    }
-    return fromArray(observables, undefined).lift(new RaceOperator());
-}
-export class RaceOperator {
-    call(subscriber, source) {
-        return source.subscribe(new RaceSubscriber(subscriber));
-    }
-}
-export class RaceSubscriber extends OuterSubscriber {
-    constructor(destination) {
-        super(destination);
-        this.hasFirst = false;
-        this.observables = [];
-        this.subscriptions = [];
-    }
-    _next(observable) {
-        this.observables.push(observable);
-    }
-    _complete() {
-        const observables = this.observables;
-        const len = observables.length;
-        if (len === 0) {
-            this.destination.complete();
-        }
-        else {
-            for (let i = 0; i < len && !this.hasFirst; i++) {
-                let observable = observables[i];
-                let subscription = subscribeToResult(this, observable, observable, i);
-                if (this.subscriptions) {
-                    this.subscriptions.push(subscription);
-                }
-                this.add(subscription);
-            }
-            this.observables = null;
-        }
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (!this.hasFirst) {
-            this.hasFirst = true;
-            for (let i = 0; i < this.subscriptions.length; i++) {
-                if (i !== outerIndex) {
-                    let subscription = this.subscriptions[i];
-                    subscription.unsubscribe();
-                    this.remove(subscription);
-                }
-            }
-            this.subscriptions = null;
-        }
-        this.destination.next(innerValue);
-    }
-}
-//# sourceMappingURL=race.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/race.js.map b/node_modules/rxjs/_esm2015/internal/observable/race.js.map
deleted file mode 100644
index 018e811..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/race.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"race.js","sources":["../../../src/internal/observable/race.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAKxC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAoD9D,MAAM,UAAU,IAAI,CAAI,GAAG,WAAmC;IAG5D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;QAC5B,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;YAC3B,WAAW,GAAG,WAAW,CAAC,CAAC,CAAsB,CAAC;SACnD;aAAM;YACL,OAAO,WAAW,CAAC,CAAC,CAAkB,CAAC;SACxC;KACF;IAED,OAAO,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,YAAY,EAAK,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,OAAO,YAAY;IACvB,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF;AAOD,MAAM,OAAO,cAAkB,SAAQ,eAAqB;IAK1D,YAAY,WAA0B;QACpC,KAAK,CAAC,WAAW,CAAC,CAAC;QALb,aAAQ,GAAY,KAAK,CAAC;QAC1B,gBAAW,GAAsB,EAAE,CAAC;QACpC,kBAAa,GAAmB,EAAE,CAAC;IAI3C,CAAC;IAES,KAAK,CAAC,UAAe;QAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAES,SAAS;QACjB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC;QAE/B,IAAI,GAAG,KAAK,CAAC,EAAE;YACb,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;aAAM;YACL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;gBAC9C,IAAI,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,YAAY,GAAG,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAiB,EAAE,CAAC,CAAC,CAAC;gBAE7E,IAAI,IAAI,CAAC,aAAa,EAAE;oBACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBACvC;gBACD,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aACxB;YACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;SACzB;IACH,CAAC;IAED,UAAU,CAAC,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAClD,IAAI,CAAC,KAAK,UAAU,EAAE;oBACpB,IAAI,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;oBAEzC,YAAY,CAAC,WAAW,EAAE,CAAC;oBAC3B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;iBAC3B;aACF;YAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;SAC3B;QAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/range.js b/node_modules/rxjs/_esm2015/internal/observable/range.js
deleted file mode 100644
index ca93912..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/range.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import { Observable } from '../Observable';
-export function range(start = 0, count, scheduler) {
-    return new Observable(subscriber => {
-        if (count === undefined) {
-            count = start;
-            start = 0;
-        }
-        let index = 0;
-        let current = start;
-        if (scheduler) {
-            return scheduler.schedule(dispatch, 0, {
-                index, count, start, subscriber
-            });
-        }
-        else {
-            do {
-                if (index++ >= count) {
-                    subscriber.complete();
-                    break;
-                }
-                subscriber.next(current++);
-                if (subscriber.closed) {
-                    break;
-                }
-            } while (true);
-        }
-        return undefined;
-    });
-}
-export function dispatch(state) {
-    const { start, index, count, subscriber } = state;
-    if (index >= count) {
-        subscriber.complete();
-        return;
-    }
-    subscriber.next(start);
-    if (subscriber.closed) {
-        return;
-    }
-    state.index = index + 1;
-    state.start = start + 1;
-    this.schedule(state);
-}
-//# sourceMappingURL=range.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/range.js.map b/node_modules/rxjs/_esm2015/internal/observable/range.js.map
deleted file mode 100644
index 8e88801..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/range.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"range.js","sources":["../../../src/internal/observable/range.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAoC3C,MAAM,UAAU,KAAK,CAAC,QAAgB,CAAC,EACjB,KAAc,EACd,SAAyB;IAC7C,OAAO,IAAI,UAAU,CAAS,UAAU,CAAC,EAAE;QACzC,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,KAAK,GAAG,KAAK,CAAC;YACd,KAAK,GAAG,CAAC,CAAC;SACX;QAED,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,SAAS,EAAE;YACb,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE;gBACrC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU;aAChC,CAAC,CAAC;SACJ;aAAM;YACL,GAAG;gBACD,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE;oBACpB,UAAU,CAAC,QAAQ,EAAE,CAAC;oBACtB,MAAM;iBACP;gBACD,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3B,IAAI,UAAU,CAAC,MAAM,EAAE;oBACrB,MAAM;iBACP;aACF,QAAQ,IAAI,EAAE;SAChB;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAGD,MAAM,UAAU,QAAQ,CAA6B,KAAU;IAC7D,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAElD,IAAI,KAAK,IAAI,KAAK,EAAE;QAClB,UAAU,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO;KACR;IAED,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEvB,IAAI,UAAU,CAAC,MAAM,EAAE;QACrB,OAAO;KACR;IAED,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IACxB,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IAExB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/throwError.js b/node_modules/rxjs/_esm2015/internal/observable/throwError.js
deleted file mode 100644
index 981c0af..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/throwError.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { Observable } from '../Observable';
-export function throwError(error, scheduler) {
-    if (!scheduler) {
-        return new Observable(subscriber => subscriber.error(error));
-    }
-    else {
-        return new Observable(subscriber => scheduler.schedule(dispatch, 0, { error, subscriber }));
-    }
-}
-function dispatch({ error, subscriber }) {
-    subscriber.error(error);
-}
-//# sourceMappingURL=throwError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/throwError.js.map b/node_modules/rxjs/_esm2015/internal/observable/throwError.js.map
deleted file mode 100644
index 744583b..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/throwError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throwError.js","sources":["../../../src/internal/observable/throwError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAoE3C,MAAM,UAAU,UAAU,CAAC,KAAU,EAAE,SAAyB;IAC9D,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;KAC9D;SAAM;QACL,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;KAC7F;AACH,CAAC;AAOD,SAAS,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAU,EAAe;IAClD,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/timer.js b/node_modules/rxjs/_esm2015/internal/observable/timer.js
deleted file mode 100644
index 7476984..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/timer.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import { Observable } from '../Observable';
-import { async } from '../scheduler/async';
-import { isNumeric } from '../util/isNumeric';
-import { isScheduler } from '../util/isScheduler';
-export function timer(dueTime = 0, periodOrScheduler, scheduler) {
-    let period = -1;
-    if (isNumeric(periodOrScheduler)) {
-        period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);
-    }
-    else if (isScheduler(periodOrScheduler)) {
-        scheduler = periodOrScheduler;
-    }
-    if (!isScheduler(scheduler)) {
-        scheduler = async;
-    }
-    return new Observable(subscriber => {
-        const due = isNumeric(dueTime)
-            ? dueTime
-            : (+dueTime - scheduler.now());
-        return scheduler.schedule(dispatch, due, {
-            index: 0, period, subscriber
-        });
-    });
-}
-function dispatch(state) {
-    const { index, period, subscriber } = state;
-    subscriber.next(index);
-    if (subscriber.closed) {
-        return;
-    }
-    else if (period === -1) {
-        return subscriber.complete();
-    }
-    state.index = index + 1;
-    this.schedule(state, period);
-}
-//# sourceMappingURL=timer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/timer.js.map b/node_modules/rxjs/_esm2015/internal/observable/timer.js.map
deleted file mode 100644
index b943182..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/timer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timer.js","sources":["../../../src/internal/observable/timer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAqDlD,MAAM,UAAU,KAAK,CAAC,UAAyB,CAAC,EAC1B,iBAA0C,EAC1C,SAAyB;IAC7C,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;IAChB,IAAI,SAAS,CAAC,iBAAiB,CAAC,EAAE;QAChC,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC;KAC1E;SAAM,IAAI,WAAW,CAAC,iBAAiB,CAAC,EAAE;QACzC,SAAS,GAAG,iBAAwB,CAAC;KACtC;IAED,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;QAC3B,SAAS,GAAG,KAAK,CAAC;KACnB;IAED,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE;QACjC,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC;YAC5B,CAAC,CAAE,OAAkB;YACrB,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QAEjC,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;YACvC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAQD,SAAS,QAAQ,CAAoC,KAAiB;IACpE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAC5C,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEvB,IAAI,UAAU,CAAC,MAAM,EAAE;QACrB,OAAO;KACR;SAAM,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE;QACxB,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC;KAC9B;IAED,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/using.js b/node_modules/rxjs/_esm2015/internal/observable/using.js
deleted file mode 100644
index 86af89f..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/using.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import { Observable } from '../Observable';
-import { from } from './from';
-import { EMPTY } from './empty';
-export function using(resourceFactory, observableFactory) {
-    return new Observable(subscriber => {
-        let resource;
-        try {
-            resource = resourceFactory();
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        let result;
-        try {
-            result = observableFactory(resource);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        const source = result ? from(result) : EMPTY;
-        const subscription = source.subscribe(subscriber);
-        return () => {
-            subscription.unsubscribe();
-            if (resource) {
-                resource.unsubscribe();
-            }
-        };
-    });
-}
-//# sourceMappingURL=using.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/using.js.map b/node_modules/rxjs/_esm2015/internal/observable/using.js.map
deleted file mode 100644
index 74ab3bd..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/using.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"using.js","sources":["../../../src/internal/observable/using.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AA8BhC,MAAM,UAAU,KAAK,CAAI,eAA4C,EAC5C,iBAAiF;IACxG,OAAO,IAAI,UAAU,CAAI,UAAU,CAAC,EAAE;QACpC,IAAI,QAA+B,CAAC;QAEpC,IAAI;YACF,QAAQ,GAAG,eAAe,EAAE,CAAC;SAC9B;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,MAAiC,CAAC;QACtC,IAAI;YACF,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;SACtC;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAClD,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,WAAW,EAAE,CAAC;YAC3B,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,WAAW,EAAE,CAAC;aACxB;QACH,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/observable/zip.js b/node_modules/rxjs/_esm2015/internal/observable/zip.js
deleted file mode 100644
index 076ef5b..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/zip.js
+++ /dev/null
@@ -1,198 +0,0 @@
-import { fromArray } from './fromArray';
-import { isArray } from '../util/isArray';
-import { Subscriber } from '../Subscriber';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { iterator as Symbol_iterator } from '../../internal/symbol/iterator';
-export function zip(...observables) {
-    const resultSelector = observables[observables.length - 1];
-    if (typeof resultSelector === 'function') {
-        observables.pop();
-    }
-    return fromArray(observables, undefined).lift(new ZipOperator(resultSelector));
-}
-export class ZipOperator {
-    constructor(resultSelector) {
-        this.resultSelector = resultSelector;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));
-    }
-}
-export class ZipSubscriber extends Subscriber {
-    constructor(destination, resultSelector, values = Object.create(null)) {
-        super(destination);
-        this.iterators = [];
-        this.active = 0;
-        this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null;
-        this.values = values;
-    }
-    _next(value) {
-        const iterators = this.iterators;
-        if (isArray(value)) {
-            iterators.push(new StaticArrayIterator(value));
-        }
-        else if (typeof value[Symbol_iterator] === 'function') {
-            iterators.push(new StaticIterator(value[Symbol_iterator]()));
-        }
-        else {
-            iterators.push(new ZipBufferIterator(this.destination, this, value));
-        }
-    }
-    _complete() {
-        const iterators = this.iterators;
-        const len = iterators.length;
-        this.unsubscribe();
-        if (len === 0) {
-            this.destination.complete();
-            return;
-        }
-        this.active = len;
-        for (let i = 0; i < len; i++) {
-            let iterator = iterators[i];
-            if (iterator.stillUnsubscribed) {
-                const destination = this.destination;
-                destination.add(iterator.subscribe(iterator, i));
-            }
-            else {
-                this.active--;
-            }
-        }
-    }
-    notifyInactive() {
-        this.active--;
-        if (this.active === 0) {
-            this.destination.complete();
-        }
-    }
-    checkIterators() {
-        const iterators = this.iterators;
-        const len = iterators.length;
-        const destination = this.destination;
-        for (let i = 0; i < len; i++) {
-            let iterator = iterators[i];
-            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {
-                return;
-            }
-        }
-        let shouldComplete = false;
-        const args = [];
-        for (let i = 0; i < len; i++) {
-            let iterator = iterators[i];
-            let result = iterator.next();
-            if (iterator.hasCompleted()) {
-                shouldComplete = true;
-            }
-            if (result.done) {
-                destination.complete();
-                return;
-            }
-            args.push(result.value);
-        }
-        if (this.resultSelector) {
-            this._tryresultSelector(args);
-        }
-        else {
-            destination.next(args);
-        }
-        if (shouldComplete) {
-            destination.complete();
-        }
-    }
-    _tryresultSelector(args) {
-        let result;
-        try {
-            result = this.resultSelector.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    }
-}
-class StaticIterator {
-    constructor(iterator) {
-        this.iterator = iterator;
-        this.nextResult = iterator.next();
-    }
-    hasValue() {
-        return true;
-    }
-    next() {
-        const result = this.nextResult;
-        this.nextResult = this.iterator.next();
-        return result;
-    }
-    hasCompleted() {
-        const nextResult = this.nextResult;
-        return nextResult && nextResult.done;
-    }
-}
-class StaticArrayIterator {
-    constructor(array) {
-        this.array = array;
-        this.index = 0;
-        this.length = 0;
-        this.length = array.length;
-    }
-    [Symbol_iterator]() {
-        return this;
-    }
-    next(value) {
-        const i = this.index++;
-        const array = this.array;
-        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
-    }
-    hasValue() {
-        return this.array.length > this.index;
-    }
-    hasCompleted() {
-        return this.array.length === this.index;
-    }
-}
-class ZipBufferIterator extends OuterSubscriber {
-    constructor(destination, parent, observable) {
-        super(destination);
-        this.parent = parent;
-        this.observable = observable;
-        this.stillUnsubscribed = true;
-        this.buffer = [];
-        this.isComplete = false;
-    }
-    [Symbol_iterator]() {
-        return this;
-    }
-    next() {
-        const buffer = this.buffer;
-        if (buffer.length === 0 && this.isComplete) {
-            return { value: null, done: true };
-        }
-        else {
-            return { value: buffer.shift(), done: false };
-        }
-    }
-    hasValue() {
-        return this.buffer.length > 0;
-    }
-    hasCompleted() {
-        return this.buffer.length === 0 && this.isComplete;
-    }
-    notifyComplete() {
-        if (this.buffer.length > 0) {
-            this.isComplete = true;
-            this.parent.notifyInactive();
-        }
-        else {
-            this.destination.complete();
-        }
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.buffer.push(innerValue);
-        this.parent.checkIterators();
-    }
-    subscribe(value, index) {
-        return subscribeToResult(this, this.observable, this, index);
-    }
-}
-//# sourceMappingURL=zip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/observable/zip.js.map b/node_modules/rxjs/_esm2015/internal/observable/zip.js.map
deleted file mode 100644
index 90bfb02..0000000
--- a/node_modules/rxjs/_esm2015/internal/observable/zip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zip.js","sources":["../../../src/internal/observable/zip.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/audit.js b/node_modules/rxjs/_esm2015/internal/operators/audit.js
deleted file mode 100644
index 80618bf..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/audit.js
+++ /dev/null
@@ -1,63 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function audit(durationSelector) {
-    return function auditOperatorFunction(source) {
-        return source.lift(new AuditOperator(durationSelector));
-    };
-}
-class AuditOperator {
-    constructor(durationSelector) {
-        this.durationSelector = durationSelector;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector));
-    }
-}
-class AuditSubscriber extends OuterSubscriber {
-    constructor(destination, durationSelector) {
-        super(destination);
-        this.durationSelector = durationSelector;
-        this.hasValue = false;
-    }
-    _next(value) {
-        this.value = value;
-        this.hasValue = true;
-        if (!this.throttled) {
-            let duration;
-            try {
-                const { durationSelector } = this;
-                duration = durationSelector(value);
-            }
-            catch (err) {
-                return this.destination.error(err);
-            }
-            const innerSubscription = subscribeToResult(this, duration);
-            if (!innerSubscription || innerSubscription.closed) {
-                this.clearThrottle();
-            }
-            else {
-                this.add(this.throttled = innerSubscription);
-            }
-        }
-    }
-    clearThrottle() {
-        const { value, hasValue, throttled } = this;
-        if (throttled) {
-            this.remove(throttled);
-            this.throttled = null;
-            throttled.unsubscribe();
-        }
-        if (hasValue) {
-            this.value = null;
-            this.hasValue = false;
-            this.destination.next(value);
-        }
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex) {
-        this.clearThrottle();
-    }
-    notifyComplete() {
-        this.clearThrottle();
-    }
-}
-//# sourceMappingURL=audit.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/audit.js.map b/node_modules/rxjs/_esm2015/internal/operators/audit.js.map
deleted file mode 100644
index 794f279..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/audit.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"audit.js","sources":["../../../src/internal/operators/audit.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAgD9D,MAAM,UAAU,KAAK,CAAI,gBAA0D;IACjF,OAAO,SAAS,qBAAqB,CAAC,MAAqB;QACzD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,aAAa;IACjB,YAAoB,gBAA0D;QAA1D,qBAAgB,GAAhB,gBAAgB,CAA0C;IAC9E,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAO,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACxF,CAAC;CACF;AAOD,MAAM,eAAsB,SAAQ,eAAqB;IAMvD,YAAY,WAA0B,EAClB,gBAA0D;QAC5E,KAAK,CAAC,WAAW,CAAC,CAAC;QADD,qBAAgB,GAAhB,gBAAgB,CAA0C;QAJtE,aAAQ,GAAY,KAAK,CAAC;IAMlC,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,QAAQ,CAAC;YACb,IAAI;gBACF,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;gBAClC,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;aACpC;YAAC,OAAO,GAAG,EAAE;gBACZ,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACpC;YACD,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC5D,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,EAAE;gBAClD,IAAI,CAAC,aAAa,EAAE,CAAC;aACtB;iBAAM;gBACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,CAAC;aAC9C;SACF;IACH,CAAC;IAED,aAAa;QACX,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAC5C,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,SAAS,CAAC,WAAW,EAAE,CAAC;SACzB;QACD,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IAED,UAAU,CAAC,UAAa,EAAE,UAAa,EAAE,UAAkB,EAAE,UAAkB;QAC7E,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/auditTime.js b/node_modules/rxjs/_esm2015/internal/operators/auditTime.js
deleted file mode 100644
index e94a8b6..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/auditTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import { async } from '../scheduler/async';
-import { audit } from './audit';
-import { timer } from '../observable/timer';
-export function auditTime(duration, scheduler = async) {
-    return audit(() => timer(duration, scheduler));
-}
-//# sourceMappingURL=auditTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/auditTime.js.map b/node_modules/rxjs/_esm2015/internal/operators/auditTime.js.map
deleted file mode 100644
index 1d3d923..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/auditTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"auditTime.js","sources":["../../../src/internal/operators/auditTime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAoD5C,MAAM,UAAU,SAAS,CAAI,QAAgB,EAAE,YAA2B,KAAK;IAC7E,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AACjD,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/buffer.js b/node_modules/rxjs/_esm2015/internal/operators/buffer.js
deleted file mode 100644
index db793d0..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/buffer.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function buffer(closingNotifier) {
-    return function bufferOperatorFunction(source) {
-        return source.lift(new BufferOperator(closingNotifier));
-    };
-}
-class BufferOperator {
-    constructor(closingNotifier) {
-        this.closingNotifier = closingNotifier;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
-    }
-}
-class BufferSubscriber extends OuterSubscriber {
-    constructor(destination, closingNotifier) {
-        super(destination);
-        this.buffer = [];
-        this.add(subscribeToResult(this, closingNotifier));
-    }
-    _next(value) {
-        this.buffer.push(value);
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        const buffer = this.buffer;
-        this.buffer = [];
-        this.destination.next(buffer);
-    }
-}
-//# sourceMappingURL=buffer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/buffer.js.map b/node_modules/rxjs/_esm2015/internal/operators/buffer.js.map
deleted file mode 100644
index c20545b..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/buffer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"buffer.js","sources":["../../../src/internal/operators/buffer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA2C9D,MAAM,UAAU,MAAM,CAAI,eAAgC;IACxD,OAAO,SAAS,sBAAsB,CAAC,MAAqB;QAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAI,eAAe,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,cAAc;IAElB,YAAoB,eAAgC;QAAhC,oBAAe,GAAf,eAAe,CAAiB;IACpD,CAAC;IAED,IAAI,CAAC,UAA2B,EAAE,MAAW;QAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAClF,CAAC;CACF;AAOD,MAAM,gBAAoB,SAAQ,eAAuB;IAGvD,YAAY,WAA4B,EAAE,eAAgC;QACxE,KAAK,CAAC,WAAW,CAAC,CAAC;QAHb,WAAM,GAAQ,EAAE,CAAC;QAIvB,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IACrD,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,UAAU,CAAC,UAAa,EAAE,UAAe,EAC9B,UAAkB,EAAE,UAAkB,EACtC,QAAiC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/bufferCount.js b/node_modules/rxjs/_esm2015/internal/operators/bufferCount.js
deleted file mode 100644
index 0f119e7..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/bufferCount.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function bufferCount(bufferSize, startBufferEvery = null) {
-    return function bufferCountOperatorFunction(source) {
-        return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));
-    };
-}
-class BufferCountOperator {
-    constructor(bufferSize, startBufferEvery) {
-        this.bufferSize = bufferSize;
-        this.startBufferEvery = startBufferEvery;
-        if (!startBufferEvery || bufferSize === startBufferEvery) {
-            this.subscriberClass = BufferCountSubscriber;
-        }
-        else {
-            this.subscriberClass = BufferSkipCountSubscriber;
-        }
-    }
-    call(subscriber, source) {
-        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
-    }
-}
-class BufferCountSubscriber extends Subscriber {
-    constructor(destination, bufferSize) {
-        super(destination);
-        this.bufferSize = bufferSize;
-        this.buffer = [];
-    }
-    _next(value) {
-        const buffer = this.buffer;
-        buffer.push(value);
-        if (buffer.length == this.bufferSize) {
-            this.destination.next(buffer);
-            this.buffer = [];
-        }
-    }
-    _complete() {
-        const buffer = this.buffer;
-        if (buffer.length > 0) {
-            this.destination.next(buffer);
-        }
-        super._complete();
-    }
-}
-class BufferSkipCountSubscriber extends Subscriber {
-    constructor(destination, bufferSize, startBufferEvery) {
-        super(destination);
-        this.bufferSize = bufferSize;
-        this.startBufferEvery = startBufferEvery;
-        this.buffers = [];
-        this.count = 0;
-    }
-    _next(value) {
-        const { bufferSize, startBufferEvery, buffers, count } = this;
-        this.count++;
-        if (count % startBufferEvery === 0) {
-            buffers.push([]);
-        }
-        for (let i = buffers.length; i--;) {
-            const buffer = buffers[i];
-            buffer.push(value);
-            if (buffer.length === bufferSize) {
-                buffers.splice(i, 1);
-                this.destination.next(buffer);
-            }
-        }
-    }
-    _complete() {
-        const { buffers, destination } = this;
-        while (buffers.length > 0) {
-            let buffer = buffers.shift();
-            if (buffer.length > 0) {
-                destination.next(buffer);
-            }
-        }
-        super._complete();
-    }
-}
-//# sourceMappingURL=bufferCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/bufferCount.js.map b/node_modules/rxjs/_esm2015/internal/operators/bufferCount.js.map
deleted file mode 100644
index 13d96ce..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/bufferCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferCount.js","sources":["../../../src/internal/operators/bufferCount.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA2D3C,MAAM,UAAU,WAAW,CAAI,UAAkB,EAAE,mBAA2B,IAAI;IAChF,OAAO,SAAS,2BAA2B,CAAC,MAAqB;QAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAI,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,mBAAmB;IAGvB,YAAoB,UAAkB,EAAU,gBAAwB;QAApD,eAAU,GAAV,UAAU,CAAQ;QAAU,qBAAgB,GAAhB,gBAAgB,CAAQ;QACtE,IAAI,CAAC,gBAAgB,IAAI,UAAU,KAAK,gBAAgB,EAAE;YACxD,IAAI,CAAC,eAAe,GAAG,qBAAqB,CAAC;SAC9C;aAAM;YACL,IAAI,CAAC,eAAe,GAAG,yBAAyB,CAAC;SAClD;IACH,CAAC;IAED,IAAI,CAAC,UAA2B,EAAE,MAAW;QAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACxG,CAAC;CACF;AAOD,MAAM,qBAAyB,SAAQ,UAAa;IAGlD,YAAY,WAA4B,EAAU,UAAkB;QAClE,KAAK,CAAC,WAAW,CAAC,CAAC;QAD6B,eAAU,GAAV,UAAU,CAAQ;QAF5D,WAAM,GAAQ,EAAE,CAAC;IAIzB,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAE3B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnB,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE;YACpC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;SAClB;IACH,CAAC;IAES,SAAS;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC/B;QACD,KAAK,CAAC,SAAS,EAAE,CAAC;IACpB,CAAC;CACF;AAOD,MAAM,yBAA6B,SAAQ,UAAa;IAItD,YAAY,WAA4B,EAAU,UAAkB,EAAU,gBAAwB;QACpG,KAAK,CAAC,WAAW,CAAC,CAAC;QAD6B,eAAU,GAAV,UAAU,CAAQ;QAAU,qBAAgB,GAAhB,gBAAgB,CAAQ;QAH9F,YAAO,GAAe,EAAE,CAAC;QACzB,UAAK,GAAW,CAAC,CAAC;IAI1B,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAE9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,GAAG,gBAAgB,KAAK,CAAC,EAAE;YAClC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAClB;QAED,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,GAAI;YAClC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE;gBAChC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC/B;SACF;IACH,CAAC;IAES,SAAS;QACjB,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAEtC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACzB,IAAI,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACrB,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC1B;SACF;QACD,KAAK,CAAC,SAAS,EAAE,CAAC;IACpB,CAAC;CAEF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/bufferTime.js b/node_modules/rxjs/_esm2015/internal/operators/bufferTime.js
deleted file mode 100644
index aac9ea5..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/bufferTime.js
+++ /dev/null
@@ -1,141 +0,0 @@
-import { async } from '../scheduler/async';
-import { Subscriber } from '../Subscriber';
-import { isScheduler } from '../util/isScheduler';
-export function bufferTime(bufferTimeSpan) {
-    let length = arguments.length;
-    let scheduler = async;
-    if (isScheduler(arguments[arguments.length - 1])) {
-        scheduler = arguments[arguments.length - 1];
-        length--;
-    }
-    let bufferCreationInterval = null;
-    if (length >= 2) {
-        bufferCreationInterval = arguments[1];
-    }
-    let maxBufferSize = Number.POSITIVE_INFINITY;
-    if (length >= 3) {
-        maxBufferSize = arguments[2];
-    }
-    return function bufferTimeOperatorFunction(source) {
-        return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));
-    };
-}
-class BufferTimeOperator {
-    constructor(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
-        this.bufferTimeSpan = bufferTimeSpan;
-        this.bufferCreationInterval = bufferCreationInterval;
-        this.maxBufferSize = maxBufferSize;
-        this.scheduler = scheduler;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler));
-    }
-}
-class Context {
-    constructor() {
-        this.buffer = [];
-    }
-}
-class BufferTimeSubscriber extends Subscriber {
-    constructor(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
-        super(destination);
-        this.bufferTimeSpan = bufferTimeSpan;
-        this.bufferCreationInterval = bufferCreationInterval;
-        this.maxBufferSize = maxBufferSize;
-        this.scheduler = scheduler;
-        this.contexts = [];
-        const context = this.openContext();
-        this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;
-        if (this.timespanOnly) {
-            const timeSpanOnlyState = { subscriber: this, context, bufferTimeSpan };
-            this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-        }
-        else {
-            const closeState = { subscriber: this, context };
-            const creationState = { bufferTimeSpan, bufferCreationInterval, subscriber: this, scheduler };
-            this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState));
-            this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState));
-        }
-    }
-    _next(value) {
-        const contexts = this.contexts;
-        const len = contexts.length;
-        let filledBufferContext;
-        for (let i = 0; i < len; i++) {
-            const context = contexts[i];
-            const buffer = context.buffer;
-            buffer.push(value);
-            if (buffer.length == this.maxBufferSize) {
-                filledBufferContext = context;
-            }
-        }
-        if (filledBufferContext) {
-            this.onBufferFull(filledBufferContext);
-        }
-    }
-    _error(err) {
-        this.contexts.length = 0;
-        super._error(err);
-    }
-    _complete() {
-        const { contexts, destination } = this;
-        while (contexts.length > 0) {
-            const context = contexts.shift();
-            destination.next(context.buffer);
-        }
-        super._complete();
-    }
-    _unsubscribe() {
-        this.contexts = null;
-    }
-    onBufferFull(context) {
-        this.closeContext(context);
-        const closeAction = context.closeAction;
-        closeAction.unsubscribe();
-        this.remove(closeAction);
-        if (!this.closed && this.timespanOnly) {
-            context = this.openContext();
-            const bufferTimeSpan = this.bufferTimeSpan;
-            const timeSpanOnlyState = { subscriber: this, context, bufferTimeSpan };
-            this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-        }
-    }
-    openContext() {
-        const context = new Context();
-        this.contexts.push(context);
-        return context;
-    }
-    closeContext(context) {
-        this.destination.next(context.buffer);
-        const contexts = this.contexts;
-        const spliceIndex = contexts ? contexts.indexOf(context) : -1;
-        if (spliceIndex >= 0) {
-            contexts.splice(contexts.indexOf(context), 1);
-        }
-    }
-}
-function dispatchBufferTimeSpanOnly(state) {
-    const subscriber = state.subscriber;
-    const prevContext = state.context;
-    if (prevContext) {
-        subscriber.closeContext(prevContext);
-    }
-    if (!subscriber.closed) {
-        state.context = subscriber.openContext();
-        state.context.closeAction = this.schedule(state, state.bufferTimeSpan);
-    }
-}
-function dispatchBufferCreation(state) {
-    const { bufferCreationInterval, bufferTimeSpan, subscriber, scheduler } = state;
-    const context = subscriber.openContext();
-    const action = this;
-    if (!subscriber.closed) {
-        subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber, context }));
-        action.schedule(state, bufferCreationInterval);
-    }
-}
-function dispatchBufferClose(arg) {
-    const { subscriber, context } = arg;
-    subscriber.closeContext(context);
-}
-//# sourceMappingURL=bufferTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/bufferTime.js.map b/node_modules/rxjs/_esm2015/internal/operators/bufferTime.js.map
deleted file mode 100644
index 471696a..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/bufferTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferTime.js","sources":["../../../src/internal/operators/bufferTime.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/bufferToggle.js b/node_modules/rxjs/_esm2015/internal/operators/bufferToggle.js
deleted file mode 100644
index 86aae17..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/bufferToggle.js
+++ /dev/null
@@ -1,101 +0,0 @@
-import { Subscription } from '../Subscription';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OuterSubscriber } from '../OuterSubscriber';
-export function bufferToggle(openings, closingSelector) {
-    return function bufferToggleOperatorFunction(source) {
-        return source.lift(new BufferToggleOperator(openings, closingSelector));
-    };
-}
-class BufferToggleOperator {
-    constructor(openings, closingSelector) {
-        this.openings = openings;
-        this.closingSelector = closingSelector;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));
-    }
-}
-class BufferToggleSubscriber extends OuterSubscriber {
-    constructor(destination, openings, closingSelector) {
-        super(destination);
-        this.openings = openings;
-        this.closingSelector = closingSelector;
-        this.contexts = [];
-        this.add(subscribeToResult(this, openings));
-    }
-    _next(value) {
-        const contexts = this.contexts;
-        const len = contexts.length;
-        for (let i = 0; i < len; i++) {
-            contexts[i].buffer.push(value);
-        }
-    }
-    _error(err) {
-        const contexts = this.contexts;
-        while (contexts.length > 0) {
-            const context = contexts.shift();
-            context.subscription.unsubscribe();
-            context.buffer = null;
-            context.subscription = null;
-        }
-        this.contexts = null;
-        super._error(err);
-    }
-    _complete() {
-        const contexts = this.contexts;
-        while (contexts.length > 0) {
-            const context = contexts.shift();
-            this.destination.next(context.buffer);
-            context.subscription.unsubscribe();
-            context.buffer = null;
-            context.subscription = null;
-        }
-        this.contexts = null;
-        super._complete();
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
-    }
-    notifyComplete(innerSub) {
-        this.closeBuffer(innerSub.context);
-    }
-    openBuffer(value) {
-        try {
-            const closingSelector = this.closingSelector;
-            const closingNotifier = closingSelector.call(this, value);
-            if (closingNotifier) {
-                this.trySubscribe(closingNotifier);
-            }
-        }
-        catch (err) {
-            this._error(err);
-        }
-    }
-    closeBuffer(context) {
-        const contexts = this.contexts;
-        if (contexts && context) {
-            const { buffer, subscription } = context;
-            this.destination.next(buffer);
-            contexts.splice(contexts.indexOf(context), 1);
-            this.remove(subscription);
-            subscription.unsubscribe();
-        }
-    }
-    trySubscribe(closingNotifier) {
-        const contexts = this.contexts;
-        const buffer = [];
-        const subscription = new Subscription();
-        const context = { buffer, subscription };
-        contexts.push(context);
-        const innerSubscription = subscribeToResult(this, closingNotifier, context);
-        if (!innerSubscription || innerSubscription.closed) {
-            this.closeBuffer(context);
-        }
-        else {
-            innerSubscription.context = context;
-            this.add(innerSubscription);
-            subscription.add(innerSubscription);
-        }
-    }
-}
-//# sourceMappingURL=bufferToggle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/bufferToggle.js.map b/node_modules/rxjs/_esm2015/internal/operators/bufferToggle.js.map
deleted file mode 100644
index efec280..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/bufferToggle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferToggle.js","sources":["../../../src/internal/operators/bufferToggle.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/bufferWhen.js b/node_modules/rxjs/_esm2015/internal/operators/bufferWhen.js
deleted file mode 100644
index a2dca4f..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/bufferWhen.js
+++ /dev/null
@@ -1,76 +0,0 @@
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function bufferWhen(closingSelector) {
-    return function (source) {
-        return source.lift(new BufferWhenOperator(closingSelector));
-    };
-}
-class BufferWhenOperator {
-    constructor(closingSelector) {
-        this.closingSelector = closingSelector;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));
-    }
-}
-class BufferWhenSubscriber extends OuterSubscriber {
-    constructor(destination, closingSelector) {
-        super(destination);
-        this.closingSelector = closingSelector;
-        this.subscribing = false;
-        this.openBuffer();
-    }
-    _next(value) {
-        this.buffer.push(value);
-    }
-    _complete() {
-        const buffer = this.buffer;
-        if (buffer) {
-            this.destination.next(buffer);
-        }
-        super._complete();
-    }
-    _unsubscribe() {
-        this.buffer = null;
-        this.subscribing = false;
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openBuffer();
-    }
-    notifyComplete() {
-        if (this.subscribing) {
-            this.complete();
-        }
-        else {
-            this.openBuffer();
-        }
-    }
-    openBuffer() {
-        let { closingSubscription } = this;
-        if (closingSubscription) {
-            this.remove(closingSubscription);
-            closingSubscription.unsubscribe();
-        }
-        const buffer = this.buffer;
-        if (this.buffer) {
-            this.destination.next(buffer);
-        }
-        this.buffer = [];
-        let closingNotifier;
-        try {
-            const { closingSelector } = this;
-            closingNotifier = closingSelector();
-        }
-        catch (err) {
-            return this.error(err);
-        }
-        closingSubscription = new Subscription();
-        this.closingSubscription = closingSubscription;
-        this.add(closingSubscription);
-        this.subscribing = true;
-        closingSubscription.add(subscribeToResult(this, closingNotifier));
-        this.subscribing = false;
-    }
-}
-//# sourceMappingURL=bufferWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/bufferWhen.js.map b/node_modules/rxjs/_esm2015/internal/operators/bufferWhen.js.map
deleted file mode 100644
index 89abd16..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/bufferWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferWhen.js","sources":["../../../src/internal/operators/bufferWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/catchError.js b/node_modules/rxjs/_esm2015/internal/operators/catchError.js
deleted file mode 100644
index 8c2a62f..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/catchError.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function catchError(selector) {
-    return function catchErrorOperatorFunction(source) {
-        const operator = new CatchOperator(selector);
-        const caught = source.lift(operator);
-        return (operator.caught = caught);
-    };
-}
-class CatchOperator {
-    constructor(selector) {
-        this.selector = selector;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));
-    }
-}
-class CatchSubscriber extends OuterSubscriber {
-    constructor(destination, selector, caught) {
-        super(destination);
-        this.selector = selector;
-        this.caught = caught;
-    }
-    error(err) {
-        if (!this.isStopped) {
-            let result;
-            try {
-                result = this.selector(err, this.caught);
-            }
-            catch (err2) {
-                super.error(err2);
-                return;
-            }
-            this._unsubscribeAndRecycle();
-            const innerSubscriber = new InnerSubscriber(this, undefined, undefined);
-            this.add(innerSubscriber);
-            const innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-            if (innerSubscription !== innerSubscriber) {
-                this.add(innerSubscription);
-            }
-        }
-    }
-}
-//# sourceMappingURL=catchError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/catchError.js.map b/node_modules/rxjs/_esm2015/internal/operators/catchError.js.map
deleted file mode 100644
index 32aa423..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/catchError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"catchError.js","sources":["../../../src/internal/operators/catchError.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAmF9D,MAAM,UAAU,UAAU,CACxB,QAAgD;IAEhD,OAAO,SAAS,0BAA0B,CAAC,MAAqB;QAC9D,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAuB,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,aAAa;IAGjB,YAAoB,QAAqE;QAArE,aAAQ,GAAR,QAAQ,CAA6D;IACzF,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACvF,CAAC;CACF;AAOD,MAAM,eAAsB,SAAQ,eAAyB;IAC3D,YAAY,WAA4B,EACpB,QAAqE,EACrE,MAAqB;QACvC,KAAK,CAAC,WAAW,CAAC,CAAC;QAFD,aAAQ,GAAR,QAAQ,CAA6D;QACrE,WAAM,GAAN,MAAM,CAAe;IAEzC,CAAC;IAOD,KAAK,CAAC,GAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,MAAW,CAAC;YAChB,IAAI;gBACF,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;aAC1C;YAAC,OAAO,IAAI,EAAE;gBACb,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClB,OAAO;aACR;YACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACxE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC1B,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;YAIjG,IAAI,iBAAiB,KAAK,eAAe,EAAE;gBACzC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;aAC7B;SACF;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/combineAll.js b/node_modules/rxjs/_esm2015/internal/operators/combineAll.js
deleted file mode 100644
index 8b8fe36..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/combineAll.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { CombineLatestOperator } from '../observable/combineLatest';
-export function combineAll(project) {
-    return (source) => source.lift(new CombineLatestOperator(project));
-}
-//# sourceMappingURL=combineAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/combineAll.js.map b/node_modules/rxjs/_esm2015/internal/operators/combineAll.js.map
deleted file mode 100644
index 698b5a6..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/combineAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineAll.js","sources":["../../../src/internal/operators/combineAll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAsDpE,MAAM,UAAU,UAAU,CAAO,OAAsC;IACrE,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;AACpF,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/combineLatest.js b/node_modules/rxjs/_esm2015/internal/operators/combineLatest.js
deleted file mode 100644
index 21d392d..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/combineLatest.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import { isArray } from '../util/isArray';
-import { CombineLatestOperator } from '../observable/combineLatest';
-import { from } from '../observable/from';
-const none = {};
-export function combineLatest(...observables) {
-    let project = null;
-    if (typeof observables[observables.length - 1] === 'function') {
-        project = observables.pop();
-    }
-    if (observables.length === 1 && isArray(observables[0])) {
-        observables = observables[0].slice();
-    }
-    return (source) => source.lift.call(from([source, ...observables]), new CombineLatestOperator(project));
-}
-//# sourceMappingURL=combineLatest.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/combineLatest.js.map b/node_modules/rxjs/_esm2015/internal/operators/combineLatest.js.map
deleted file mode 100644
index 9724120..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/combineLatest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineLatest.js","sources":["../../../src/internal/operators/combineLatest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAI1C,MAAM,IAAI,GAAG,EAAE,CAAC;AAoChB,MAAM,UAAU,aAAa,CAAO,GAAG,WAE4C;IACjF,IAAI,OAAO,GAAiC,IAAI,CAAC;IACjD,IAAI,OAAO,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,UAAU,EAAE;QAC7D,OAAO,GAAiC,WAAW,CAAC,GAAG,EAAE,CAAC;KAC3D;IAID,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;QACvD,WAAW,GAAS,WAAW,CAAC,CAAC,CAAE,CAAC,KAAK,EAAE,CAAC;KAC7C;IAED,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,EAAE,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;AACzH,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/concat.js b/node_modules/rxjs/_esm2015/internal/operators/concat.js
deleted file mode 100644
index 1f4daf1..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/concat.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { concat as concatStatic } from '../observable/concat';
-export function concat(...observables) {
-    return (source) => source.lift.call(concatStatic(source, ...observables));
-}
-//# sourceMappingURL=concat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/concat.js.map b/node_modules/rxjs/_esm2015/internal/operators/concat.js.map
deleted file mode 100644
index 292d9fd..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/concat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concat.js","sources":["../../../src/internal/operators/concat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAG,MAAM,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAC;AA0B/D,MAAM,UAAU,MAAM,CAAO,GAAG,WAAwD;IACtF,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC;AAC3F,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/concatAll.js b/node_modules/rxjs/_esm2015/internal/operators/concatAll.js
deleted file mode 100644
index 9ef0022..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/concatAll.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { mergeAll } from './mergeAll';
-export function concatAll() {
-    return mergeAll(1);
-}
-//# sourceMappingURL=concatAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/concatAll.js.map b/node_modules/rxjs/_esm2015/internal/operators/concatAll.js.map
deleted file mode 100644
index 9c92ccc..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/concatAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatAll.js","sources":["../../../src/internal/operators/concatAll.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAgEtC,MAAM,UAAU,SAAS;IACvB,OAAO,QAAQ,CAAI,CAAC,CAAC,CAAC;AACxB,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/concatMap.js b/node_modules/rxjs/_esm2015/internal/operators/concatMap.js
deleted file mode 100644
index 165b4d5..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/concatMap.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { mergeMap } from './mergeMap';
-export function concatMap(project, resultSelector) {
-    return mergeMap(project, resultSelector, 1);
-}
-//# sourceMappingURL=concatMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/concatMap.js.map b/node_modules/rxjs/_esm2015/internal/operators/concatMap.js.map
deleted file mode 100644
index 63a35fa..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/concatMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatMap.js","sources":["../../../src/internal/operators/concatMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAuEtC,MAAM,UAAU,SAAS,CACvB,OAAuC,EACvC,cAA6G;IAE7G,OAAO,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/concatMapTo.js b/node_modules/rxjs/_esm2015/internal/operators/concatMapTo.js
deleted file mode 100644
index 270a4a2..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/concatMapTo.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { concatMap } from './concatMap';
-export function concatMapTo(innerObservable, resultSelector) {
-    return concatMap(() => innerObservable, resultSelector);
-}
-//# sourceMappingURL=concatMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/concatMapTo.js.map b/node_modules/rxjs/_esm2015/internal/operators/concatMapTo.js.map
deleted file mode 100644
index 10a313a..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/concatMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatMapTo.js","sources":["../../../src/internal/operators/concatMapTo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAmExC,MAAM,UAAU,WAAW,CACzB,eAAkB,EAClB,cAA6G;IAE7G,OAAO,SAAS,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;AAC1D,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/count.js b/node_modules/rxjs/_esm2015/internal/operators/count.js
deleted file mode 100644
index fb4f746..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/count.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function count(predicate) {
-    return (source) => source.lift(new CountOperator(predicate, source));
-}
-class CountOperator {
-    constructor(predicate, source) {
-        this.predicate = predicate;
-        this.source = source;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));
-    }
-}
-class CountSubscriber extends Subscriber {
-    constructor(destination, predicate, source) {
-        super(destination);
-        this.predicate = predicate;
-        this.source = source;
-        this.count = 0;
-        this.index = 0;
-    }
-    _next(value) {
-        if (this.predicate) {
-            this._tryPredicate(value);
-        }
-        else {
-            this.count++;
-        }
-    }
-    _tryPredicate(value) {
-        let result;
-        try {
-            result = this.predicate(value, this.index++, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this.count++;
-        }
-    }
-    _complete() {
-        this.destination.next(this.count);
-        this.destination.complete();
-    }
-}
-//# sourceMappingURL=count.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/count.js.map b/node_modules/rxjs/_esm2015/internal/operators/count.js.map
deleted file mode 100644
index b634bab..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/count.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"count.js","sources":["../../../src/internal/operators/count.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA6D3C,MAAM,UAAU,KAAK,CAAI,SAAuE;IAC9F,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,aAAa;IACjB,YAAoB,SAAuE,EACvE,MAAsB;QADtB,cAAS,GAAT,SAAS,CAA8D;QACvE,WAAM,GAAN,MAAM,CAAgB;IAC1C,CAAC;IAED,IAAI,CAAC,UAA8B,EAAE,MAAW;QAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACxF,CAAC;CACF;AAOD,MAAM,eAAmB,SAAQ,UAAa;IAI5C,YAAY,WAA6B,EACrB,SAAuE,EACvE,MAAsB;QACxC,KAAK,CAAC,WAAW,CAAC,CAAC;QAFD,cAAS,GAAT,SAAS,CAA8D;QACvE,WAAM,GAAN,MAAM,CAAgB;QALlC,UAAK,GAAW,CAAC,CAAC;QAClB,UAAK,GAAW,CAAC,CAAC;IAM1B,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC3B;aAAM;YACL,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;IACH,CAAC;IAEO,aAAa,CAAC,KAAQ;QAC5B,IAAI,MAAW,CAAC;QAEhB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SAC3D;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QAED,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;IACH,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/debounce.js b/node_modules/rxjs/_esm2015/internal/operators/debounce.js
deleted file mode 100644
index e95c94e..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/debounce.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function debounce(durationSelector) {
-    return (source) => source.lift(new DebounceOperator(durationSelector));
-}
-class DebounceOperator {
-    constructor(durationSelector) {
-        this.durationSelector = durationSelector;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));
-    }
-}
-class DebounceSubscriber extends OuterSubscriber {
-    constructor(destination, durationSelector) {
-        super(destination);
-        this.durationSelector = durationSelector;
-        this.hasValue = false;
-        this.durationSubscription = null;
-    }
-    _next(value) {
-        try {
-            const result = this.durationSelector.call(this, value);
-            if (result) {
-                this._tryNext(value, result);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    }
-    _complete() {
-        this.emitValue();
-        this.destination.complete();
-    }
-    _tryNext(value, duration) {
-        let subscription = this.durationSubscription;
-        this.value = value;
-        this.hasValue = true;
-        if (subscription) {
-            subscription.unsubscribe();
-            this.remove(subscription);
-        }
-        subscription = subscribeToResult(this, duration);
-        if (subscription && !subscription.closed) {
-            this.add(this.durationSubscription = subscription);
-        }
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.emitValue();
-    }
-    notifyComplete() {
-        this.emitValue();
-    }
-    emitValue() {
-        if (this.hasValue) {
-            const value = this.value;
-            const subscription = this.durationSubscription;
-            if (subscription) {
-                this.durationSubscription = null;
-                subscription.unsubscribe();
-                this.remove(subscription);
-            }
-            this.value = null;
-            this.hasValue = false;
-            super._next(value);
-        }
-    }
-}
-//# sourceMappingURL=debounce.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/debounce.js.map b/node_modules/rxjs/_esm2015/internal/operators/debounce.js.map
deleted file mode 100644
index 07dc515..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/debounce.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounce.js","sources":["../../../src/internal/operators/debounce.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAkD9D,MAAM,UAAU,QAAQ,CAAI,gBAA0D;IACpF,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,gBAAgB;IACpB,YAAoB,gBAA0D;QAA1D,qBAAgB,GAAhB,gBAAgB,CAA0C;IAC9E,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACrF,CAAC;CACF;AAOD,MAAM,kBAAyB,SAAQ,eAAqB;IAK1D,YAAY,WAA0B,EAClB,gBAA0D;QAC5E,KAAK,CAAC,WAAW,CAAC,CAAC;QADD,qBAAgB,GAAhB,gBAAgB,CAA0C;QAJtE,aAAQ,GAAY,KAAK,CAAC;QAC1B,yBAAoB,GAAiB,IAAI,CAAC;IAKlD,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAEvD,IAAI,MAAM,EAAE;gBACV,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;aAC9B;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;IACH,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAEO,QAAQ,CAAC,KAAQ,EAAE,QAAoC;QAC7D,IAAI,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,YAAY,EAAE;YAChB,YAAY,CAAC,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;SAC3B;QAED,YAAY,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,GAAG,YAAY,CAAC,CAAC;SACpD;IACH,CAAC;IAED,UAAU,CAAC,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,SAAS;QACP,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC;YAC/C,IAAI,YAAY,EAAE;gBAChB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,YAAY,CAAC,WAAW,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;aAC3B;YAMD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACpB;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/debounceTime.js b/node_modules/rxjs/_esm2015/internal/operators/debounceTime.js
deleted file mode 100644
index 891abcc..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/debounceTime.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { async } from '../scheduler/async';
-export function debounceTime(dueTime, scheduler = async) {
-    return (source) => source.lift(new DebounceTimeOperator(dueTime, scheduler));
-}
-class DebounceTimeOperator {
-    constructor(dueTime, scheduler) {
-        this.dueTime = dueTime;
-        this.scheduler = scheduler;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
-    }
-}
-class DebounceTimeSubscriber extends Subscriber {
-    constructor(destination, dueTime, scheduler) {
-        super(destination);
-        this.dueTime = dueTime;
-        this.scheduler = scheduler;
-        this.debouncedSubscription = null;
-        this.lastValue = null;
-        this.hasValue = false;
-    }
-    _next(value) {
-        this.clearDebounce();
-        this.lastValue = value;
-        this.hasValue = true;
-        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
-    }
-    _complete() {
-        this.debouncedNext();
-        this.destination.complete();
-    }
-    debouncedNext() {
-        this.clearDebounce();
-        if (this.hasValue) {
-            const { lastValue } = this;
-            this.lastValue = null;
-            this.hasValue = false;
-            this.destination.next(lastValue);
-        }
-    }
-    clearDebounce() {
-        const debouncedSubscription = this.debouncedSubscription;
-        if (debouncedSubscription !== null) {
-            this.remove(debouncedSubscription);
-            debouncedSubscription.unsubscribe();
-            this.debouncedSubscription = null;
-        }
-    }
-}
-function dispatchNext(subscriber) {
-    subscriber.debouncedNext();
-}
-//# sourceMappingURL=debounceTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/debounceTime.js.map b/node_modules/rxjs/_esm2015/internal/operators/debounceTime.js.map
deleted file mode 100644
index e8d3112..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/debounceTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounceTime.js","sources":["../../../src/internal/operators/debounceTime.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAuD3C,MAAM,UAAU,YAAY,CAAI,OAAe,EAAE,YAA2B,KAAK;IAC/E,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,oBAAoB;IACxB,YAAoB,OAAe,EAAU,SAAwB;QAAjD,YAAO,GAAP,OAAO,CAAQ;QAAU,cAAS,GAAT,SAAS,CAAe;IACrE,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAChG,CAAC;CACF;AAOD,MAAM,sBAA0B,SAAQ,UAAa;IAKnD,YAAY,WAA0B,EAClB,OAAe,EACf,SAAwB;QAC1C,KAAK,CAAC,WAAW,CAAC,CAAC;QAFD,YAAO,GAAP,OAAO,CAAQ;QACf,cAAS,GAAT,SAAS,CAAe;QANpC,0BAAqB,GAAiB,IAAI,CAAC;QAC3C,cAAS,GAAM,IAAI,CAAC;QACpB,aAAQ,GAAY,KAAK,CAAC;IAMlC,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACnG,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;YAM3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAClC;IACH,CAAC;IAEO,aAAa;QACnB,MAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAEzD,IAAI,qBAAqB,KAAK,IAAI,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACnC,qBAAqB,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;SACnC;IACH,CAAC;CACF;AAED,SAAS,YAAY,CAAC,UAAuC;IAC3D,UAAU,CAAC,aAAa,EAAE,CAAC;AAC7B,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/defaultIfEmpty.js b/node_modules/rxjs/_esm2015/internal/operators/defaultIfEmpty.js
deleted file mode 100644
index fbb5802..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/defaultIfEmpty.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function defaultIfEmpty(defaultValue = null) {
-    return (source) => source.lift(new DefaultIfEmptyOperator(defaultValue));
-}
-class DefaultIfEmptyOperator {
-    constructor(defaultValue) {
-        this.defaultValue = defaultValue;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));
-    }
-}
-class DefaultIfEmptySubscriber extends Subscriber {
-    constructor(destination, defaultValue) {
-        super(destination);
-        this.defaultValue = defaultValue;
-        this.isEmpty = true;
-    }
-    _next(value) {
-        this.isEmpty = false;
-        this.destination.next(value);
-    }
-    _complete() {
-        if (this.isEmpty) {
-            this.destination.next(this.defaultValue);
-        }
-        this.destination.complete();
-    }
-}
-//# sourceMappingURL=defaultIfEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/defaultIfEmpty.js.map b/node_modules/rxjs/_esm2015/internal/operators/defaultIfEmpty.js.map
deleted file mode 100644
index c25fbda..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/defaultIfEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"defaultIfEmpty.js","sources":["../../../src/internal/operators/defaultIfEmpty.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA4C3C,MAAM,UAAU,cAAc,CAAO,eAAkB,IAAI;IACzD,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,YAAY,CAAC,CAAsB,CAAC;AAC/G,CAAC;AAED,MAAM,sBAAsB;IAE1B,YAAoB,YAAe;QAAf,iBAAY,GAAZ,YAAY,CAAG;IACnC,CAAC;IAED,IAAI,CAAC,UAA6B,EAAE,MAAW;QAC7C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,wBAAwB,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACvF,CAAC;CACF;AAOD,MAAM,wBAA+B,SAAQ,UAAa;IAGxD,YAAY,WAA8B,EAAU,YAAe;QACjE,KAAK,CAAC,WAAW,CAAC,CAAC;QAD+B,iBAAY,GAAZ,YAAY,CAAG;QAF3D,YAAO,GAAY,IAAI,CAAC;IAIhC,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAES,SAAS;QACjB,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAC1C;QACD,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/delay.js b/node_modules/rxjs/_esm2015/internal/operators/delay.js
deleted file mode 100644
index de834ba..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/delay.js
+++ /dev/null
@@ -1,83 +0,0 @@
-import { async } from '../scheduler/async';
-import { isDate } from '../util/isDate';
-import { Subscriber } from '../Subscriber';
-import { Notification } from '../Notification';
-export function delay(delay, scheduler = async) {
-    const absoluteDelay = isDate(delay);
-    const delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);
-    return (source) => source.lift(new DelayOperator(delayFor, scheduler));
-}
-class DelayOperator {
-    constructor(delay, scheduler) {
-        this.delay = delay;
-        this.scheduler = scheduler;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));
-    }
-}
-class DelaySubscriber extends Subscriber {
-    constructor(destination, delay, scheduler) {
-        super(destination);
-        this.delay = delay;
-        this.scheduler = scheduler;
-        this.queue = [];
-        this.active = false;
-        this.errored = false;
-    }
-    static dispatch(state) {
-        const source = state.source;
-        const queue = source.queue;
-        const scheduler = state.scheduler;
-        const destination = state.destination;
-        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {
-            queue.shift().notification.observe(destination);
-        }
-        if (queue.length > 0) {
-            const delay = Math.max(0, queue[0].time - scheduler.now());
-            this.schedule(state, delay);
-        }
-        else {
-            this.unsubscribe();
-            source.active = false;
-        }
-    }
-    _schedule(scheduler) {
-        this.active = true;
-        const destination = this.destination;
-        destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {
-            source: this, destination: this.destination, scheduler: scheduler
-        }));
-    }
-    scheduleNotification(notification) {
-        if (this.errored === true) {
-            return;
-        }
-        const scheduler = this.scheduler;
-        const message = new DelayMessage(scheduler.now() + this.delay, notification);
-        this.queue.push(message);
-        if (this.active === false) {
-            this._schedule(scheduler);
-        }
-    }
-    _next(value) {
-        this.scheduleNotification(Notification.createNext(value));
-    }
-    _error(err) {
-        this.errored = true;
-        this.queue = [];
-        this.destination.error(err);
-        this.unsubscribe();
-    }
-    _complete() {
-        this.scheduleNotification(Notification.createComplete());
-        this.unsubscribe();
-    }
-}
-class DelayMessage {
-    constructor(time, notification) {
-        this.time = time;
-        this.notification = notification;
-    }
-}
-//# sourceMappingURL=delay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/delay.js.map b/node_modules/rxjs/_esm2015/internal/operators/delay.js.map
deleted file mode 100644
index 02dfa54..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/delay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"delay.js","sources":["../../../src/internal/operators/delay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAsD/C,MAAM,UAAU,KAAK,CAAI,KAAkB,EAClB,YAA2B,KAAK;IACvD,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAS,KAAK,CAAC,CAAC;IACtF,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,aAAa;IACjB,YAAoB,KAAa,EACb,SAAwB;QADxB,UAAK,GAAL,KAAK,CAAQ;QACb,cAAS,GAAT,SAAS,CAAe;IAC5C,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACvF,CAAC;CACF;AAaD,MAAM,eAAmB,SAAQ,UAAa;IAwB5C,YAAY,WAA0B,EAClB,KAAa,EACb,SAAwB;QAC1C,KAAK,CAAC,WAAW,CAAC,CAAC;QAFD,UAAK,GAAL,KAAK,CAAQ;QACb,cAAS,GAAT,SAAS,CAAe;QAzBpC,UAAK,GAA2B,EAAE,CAAC;QACnC,WAAM,GAAY,KAAK,CAAC;QACxB,YAAO,GAAY,KAAK,CAAC;IAyBjC,CAAC;IAvBO,MAAM,CAAC,QAAQ,CAA0C,KAAoB;QACnF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAEtC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE;YACjE,KAAK,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;SACjD;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAC7B;aAAM;YACL,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;SACvB;IACH,CAAC;IAQO,SAAS,CAAC,SAAwB;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,WAA2B,CAAC;QACrD,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAgB,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE;YACtF,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS;SAClE,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,oBAAoB,CAAC,YAA6B;QACxD,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE;YACzB,OAAO;SACR;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC7E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzB,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE;YACzB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;SAC3B;IACH,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;IAES,MAAM,CAAC,GAAQ;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;CACF;AAED,MAAM,YAAY;IAChB,YAA4B,IAAY,EACZ,YAA6B;QAD7B,SAAI,GAAJ,IAAI,CAAQ;QACZ,iBAAY,GAAZ,YAAY,CAAiB;IACzD,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/delayWhen.js b/node_modules/rxjs/_esm2015/internal/operators/delayWhen.js
deleted file mode 100644
index 3b8d6c0..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/delayWhen.js
+++ /dev/null
@@ -1,118 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function delayWhen(delayDurationSelector, subscriptionDelay) {
-    if (subscriptionDelay) {
-        return (source) => new SubscriptionDelayObservable(source, subscriptionDelay)
-            .lift(new DelayWhenOperator(delayDurationSelector));
-    }
-    return (source) => source.lift(new DelayWhenOperator(delayDurationSelector));
-}
-class DelayWhenOperator {
-    constructor(delayDurationSelector) {
-        this.delayDurationSelector = delayDurationSelector;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));
-    }
-}
-class DelayWhenSubscriber extends OuterSubscriber {
-    constructor(destination, delayDurationSelector) {
-        super(destination);
-        this.delayDurationSelector = delayDurationSelector;
-        this.completed = false;
-        this.delayNotifierSubscriptions = [];
-        this.index = 0;
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(outerValue);
-        this.removeSubscription(innerSub);
-        this.tryComplete();
-    }
-    notifyError(error, innerSub) {
-        this._error(error);
-    }
-    notifyComplete(innerSub) {
-        const value = this.removeSubscription(innerSub);
-        if (value) {
-            this.destination.next(value);
-        }
-        this.tryComplete();
-    }
-    _next(value) {
-        const index = this.index++;
-        try {
-            const delayNotifier = this.delayDurationSelector(value, index);
-            if (delayNotifier) {
-                this.tryDelay(delayNotifier, value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    }
-    _complete() {
-        this.completed = true;
-        this.tryComplete();
-        this.unsubscribe();
-    }
-    removeSubscription(subscription) {
-        subscription.unsubscribe();
-        const subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);
-        if (subscriptionIdx !== -1) {
-            this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);
-        }
-        return subscription.outerValue;
-    }
-    tryDelay(delayNotifier, value) {
-        const notifierSubscription = subscribeToResult(this, delayNotifier, value);
-        if (notifierSubscription && !notifierSubscription.closed) {
-            const destination = this.destination;
-            destination.add(notifierSubscription);
-            this.delayNotifierSubscriptions.push(notifierSubscription);
-        }
-    }
-    tryComplete() {
-        if (this.completed && this.delayNotifierSubscriptions.length === 0) {
-            this.destination.complete();
-        }
-    }
-}
-class SubscriptionDelayObservable extends Observable {
-    constructor(source, subscriptionDelay) {
-        super();
-        this.source = source;
-        this.subscriptionDelay = subscriptionDelay;
-    }
-    _subscribe(subscriber) {
-        this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));
-    }
-}
-class SubscriptionDelaySubscriber extends Subscriber {
-    constructor(parent, source) {
-        super();
-        this.parent = parent;
-        this.source = source;
-        this.sourceSubscribed = false;
-    }
-    _next(unused) {
-        this.subscribeToSource();
-    }
-    _error(err) {
-        this.unsubscribe();
-        this.parent.error(err);
-    }
-    _complete() {
-        this.unsubscribe();
-        this.subscribeToSource();
-    }
-    subscribeToSource() {
-        if (!this.sourceSubscribed) {
-            this.sourceSubscribed = true;
-            this.unsubscribe();
-            this.source.subscribe(this.parent);
-        }
-    }
-}
-//# sourceMappingURL=delayWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/delayWhen.js.map b/node_modules/rxjs/_esm2015/internal/operators/delayWhen.js.map
deleted file mode 100644
index 6daa687..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/delayWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"delayWhen.js","sources":["../../../src/internal/operators/delayWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/dematerialize.js b/node_modules/rxjs/_esm2015/internal/operators/dematerialize.js
deleted file mode 100644
index 2e227f1..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/dematerialize.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function dematerialize() {
-    return function dematerializeOperatorFunction(source) {
-        return source.lift(new DeMaterializeOperator());
-    };
-}
-class DeMaterializeOperator {
-    call(subscriber, source) {
-        return source.subscribe(new DeMaterializeSubscriber(subscriber));
-    }
-}
-class DeMaterializeSubscriber extends Subscriber {
-    constructor(destination) {
-        super(destination);
-    }
-    _next(value) {
-        value.observe(this.destination);
-    }
-}
-//# sourceMappingURL=dematerialize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/dematerialize.js.map b/node_modules/rxjs/_esm2015/internal/operators/dematerialize.js.map
deleted file mode 100644
index 7410893..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/dematerialize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"dematerialize.js","sources":["../../../src/internal/operators/dematerialize.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAkD3C,MAAM,UAAU,aAAa;IAC3B,OAAO,SAAS,6BAA6B,CAAC,MAAmC;QAC/E,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,qBAAqB;IACzB,IAAI,CAAC,UAA2B,EAAE,MAAW;QAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;IACnE,CAAC;CACF;AAOD,MAAM,uBAAqD,SAAQ,UAAa;IAC9E,YAAY,WAA4B;QACtC,KAAK,CAAC,WAAW,CAAC,CAAC;IACrB,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/distinct.js b/node_modules/rxjs/_esm2015/internal/operators/distinct.js
deleted file mode 100644
index cda297f..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/distinct.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function distinct(keySelector, flushes) {
-    return (source) => source.lift(new DistinctOperator(keySelector, flushes));
-}
-class DistinctOperator {
-    constructor(keySelector, flushes) {
-        this.keySelector = keySelector;
-        this.flushes = flushes;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));
-    }
-}
-export class DistinctSubscriber extends OuterSubscriber {
-    constructor(destination, keySelector, flushes) {
-        super(destination);
-        this.keySelector = keySelector;
-        this.values = new Set();
-        if (flushes) {
-            this.add(subscribeToResult(this, flushes));
-        }
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values.clear();
-    }
-    notifyError(error, innerSub) {
-        this._error(error);
-    }
-    _next(value) {
-        if (this.keySelector) {
-            this._useKeySelector(value);
-        }
-        else {
-            this._finalizeNext(value, value);
-        }
-    }
-    _useKeySelector(value) {
-        let key;
-        const { destination } = this;
-        try {
-            key = this.keySelector(value);
-        }
-        catch (err) {
-            destination.error(err);
-            return;
-        }
-        this._finalizeNext(key, value);
-    }
-    _finalizeNext(key, value) {
-        const { values } = this;
-        if (!values.has(key)) {
-            values.add(key);
-            this.destination.next(value);
-        }
-    }
-}
-//# sourceMappingURL=distinct.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/distinct.js.map b/node_modules/rxjs/_esm2015/internal/operators/distinct.js.map
deleted file mode 100644
index 7efaa65..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/distinct.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinct.js","sources":["../../../src/internal/operators/distinct.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA6D9D,MAAM,UAAU,QAAQ,CAAO,WAA6B,EAC7B,OAAyB;IACtD,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,gBAAgB;IACpB,YAAoB,WAA4B,EAAU,OAAwB;QAA9D,gBAAW,GAAX,WAAW,CAAiB;QAAU,YAAO,GAAP,OAAO,CAAiB;IAClF,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9F,CAAC;CACF;AAOD,MAAM,OAAO,kBAAyB,SAAQ,eAAqB;IAGjE,YAAY,WAA0B,EAAU,WAA4B,EAAE,OAAwB;QACpG,KAAK,CAAC,WAAW,CAAC,CAAC;QAD2B,gBAAW,GAAX,WAAW,CAAiB;QAFpE,WAAM,GAAG,IAAI,GAAG,EAAK,CAAC;QAK5B,IAAI,OAAO,EAAE;YACX,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;SAC5C;IACH,CAAC;IAED,UAAU,CAAC,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,WAAW,CAAC,KAAU,EAAE,QAA+B;QACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;SAC7B;aAAM;YACL,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAClC;IACH,CAAC;IAEO,eAAe,CAAC,KAAQ;QAC9B,IAAI,GAAM,CAAC;QACX,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAC7B,IAAI;YACF,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC/B;QAAC,OAAO,GAAG,EAAE;YACZ,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO;SACR;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAEO,aAAa,CAAC,GAAQ,EAAE,KAAQ;QACtC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAI,GAAG,CAAC,EAAE;YACvB,MAAM,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;CAEF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/distinctUntilChanged.js b/node_modules/rxjs/_esm2015/internal/operators/distinctUntilChanged.js
deleted file mode 100644
index 3b8903b..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/distinctUntilChanged.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function distinctUntilChanged(compare, keySelector) {
-    return (source) => source.lift(new DistinctUntilChangedOperator(compare, keySelector));
-}
-class DistinctUntilChangedOperator {
-    constructor(compare, keySelector) {
-        this.compare = compare;
-        this.keySelector = keySelector;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
-    }
-}
-class DistinctUntilChangedSubscriber extends Subscriber {
-    constructor(destination, compare, keySelector) {
-        super(destination);
-        this.keySelector = keySelector;
-        this.hasKey = false;
-        if (typeof compare === 'function') {
-            this.compare = compare;
-        }
-    }
-    compare(x, y) {
-        return x === y;
-    }
-    _next(value) {
-        let key;
-        try {
-            const { keySelector } = this;
-            key = keySelector ? keySelector(value) : value;
-        }
-        catch (err) {
-            return this.destination.error(err);
-        }
-        let result = false;
-        if (this.hasKey) {
-            try {
-                const { compare } = this;
-                result = compare(this.key, key);
-            }
-            catch (err) {
-                return this.destination.error(err);
-            }
-        }
-        else {
-            this.hasKey = true;
-        }
-        if (!result) {
-            this.key = key;
-            this.destination.next(value);
-        }
-    }
-}
-//# sourceMappingURL=distinctUntilChanged.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/distinctUntilChanged.js.map b/node_modules/rxjs/_esm2015/internal/operators/distinctUntilChanged.js.map
deleted file mode 100644
index bec6d8c..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/distinctUntilChanged.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinctUntilChanged.js","sources":["../../../src/internal/operators/distinctUntilChanged.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA8D3C,MAAM,UAAU,oBAAoB,CAAO,OAAiC,EAAE,WAAyB;IACrG,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,4BAA4B,CAAO,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AAC9G,CAAC;AAED,MAAM,4BAA4B;IAChC,YAAoB,OAAgC,EAChC,WAAwB;QADxB,YAAO,GAAP,OAAO,CAAyB;QAChC,gBAAW,GAAX,WAAW,CAAa;IAC5C,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,8BAA8B,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,CAAC;CACF;AAOD,MAAM,8BAAqC,SAAQ,UAAa;IAI9D,YAAY,WAA0B,EAC1B,OAAgC,EACxB,WAAwB;QAC1C,KAAK,CAAC,WAAW,CAAC,CAAC;QADD,gBAAW,GAAX,WAAW,CAAa;QAJpC,WAAM,GAAY,KAAK,CAAC;QAM9B,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;YACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;SACxB;IACH,CAAC;IAEO,OAAO,CAAC,CAAM,EAAE,CAAM;QAC5B,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,GAAQ,CAAC;QACb,IAAI;YACF,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;YAC7B,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SAChD;QAAC,OAAO,GAAG,EAAE;YACZ,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACpC;QACD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI;gBACF,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;gBACzB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;aACjC;YAAC,OAAO,GAAG,EAAE;gBACZ,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACpC;SACF;aAAM;YACL,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;SACpB;QACD,IAAI,CAAC,MAAM,EAAE;YACX,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/distinctUntilKeyChanged.js b/node_modules/rxjs/_esm2015/internal/operators/distinctUntilKeyChanged.js
deleted file mode 100644
index 240fd1a..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/distinctUntilKeyChanged.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { distinctUntilChanged } from './distinctUntilChanged';
-export function distinctUntilKeyChanged(key, compare) {
-    return distinctUntilChanged((x, y) => compare ? compare(x[key], y[key]) : x[key] === y[key]);
-}
-//# sourceMappingURL=distinctUntilKeyChanged.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/distinctUntilKeyChanged.js.map b/node_modules/rxjs/_esm2015/internal/operators/distinctUntilKeyChanged.js.map
deleted file mode 100644
index b32d8b3..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/distinctUntilKeyChanged.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinctUntilKeyChanged.js","sources":["../../../src/internal/operators/distinctUntilKeyChanged.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AA8E9D,MAAM,UAAU,uBAAuB,CAAuB,GAAM,EAAE,OAAuC;IAC3G,OAAO,oBAAoB,CAAC,CAAC,CAAI,EAAE,CAAI,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrG,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/elementAt.js b/node_modules/rxjs/_esm2015/internal/operators/elementAt.js
deleted file mode 100644
index b95376f..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/elementAt.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
-import { filter } from './filter';
-import { throwIfEmpty } from './throwIfEmpty';
-import { defaultIfEmpty } from './defaultIfEmpty';
-import { take } from './take';
-export function elementAt(index, defaultValue) {
-    if (index < 0) {
-        throw new ArgumentOutOfRangeError();
-    }
-    const hasDefaultValue = arguments.length >= 2;
-    return (source) => source.pipe(filter((v, i) => i === index), take(1), hasDefaultValue
-        ? defaultIfEmpty(defaultValue)
-        : throwIfEmpty(() => new ArgumentOutOfRangeError()));
-}
-//# sourceMappingURL=elementAt.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/elementAt.js.map b/node_modules/rxjs/_esm2015/internal/operators/elementAt.js.map
deleted file mode 100644
index e7cf7f7..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/elementAt.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"elementAt.js","sources":["../../../src/internal/operators/elementAt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAG1E,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAkD9B,MAAM,UAAU,SAAS,CAAI,KAAa,EAAE,YAAgB;IAC1D,IAAI,KAAK,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,uBAAuB,EAAE,CAAC;KAAE;IACvD,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,EAC7B,IAAI,CAAC,CAAC,CAAC,EACP,eAAe;QACb,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC;QAC9B,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,uBAAuB,EAAE,CAAC,CACtD,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/endWith.js b/node_modules/rxjs/_esm2015/internal/operators/endWith.js
deleted file mode 100644
index cf52a35..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/endWith.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { concat } from '../observable/concat';
-import { of } from '../observable/of';
-export function endWith(...array) {
-    return (source) => concat(source, of(...array));
-}
-//# sourceMappingURL=endWith.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/endWith.js.map b/node_modules/rxjs/_esm2015/internal/operators/endWith.js.map
deleted file mode 100644
index 827ba1a..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/endWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"endWith.js","sources":["../../../src/internal/operators/endWith.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AA8DtC,MAAM,UAAU,OAAO,CAAI,GAAG,KAA+B;IAC3D,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAkB,CAAC;AAClF,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/every.js b/node_modules/rxjs/_esm2015/internal/operators/every.js
deleted file mode 100644
index 7d4a048..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/every.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function every(predicate, thisArg) {
-    return (source) => source.lift(new EveryOperator(predicate, thisArg, source));
-}
-class EveryOperator {
-    constructor(predicate, thisArg, source) {
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-        this.source = source;
-    }
-    call(observer, source) {
-        return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));
-    }
-}
-class EverySubscriber extends Subscriber {
-    constructor(destination, predicate, thisArg, source) {
-        super(destination);
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-        this.source = source;
-        this.index = 0;
-        this.thisArg = thisArg || this;
-    }
-    notifyComplete(everyValueMatch) {
-        this.destination.next(everyValueMatch);
-        this.destination.complete();
-    }
-    _next(value) {
-        let result = false;
-        try {
-            result = this.predicate.call(this.thisArg, value, this.index++, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (!result) {
-            this.notifyComplete(false);
-        }
-    }
-    _complete() {
-        this.notifyComplete(true);
-    }
-}
-//# sourceMappingURL=every.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/every.js.map b/node_modules/rxjs/_esm2015/internal/operators/every.js.map
deleted file mode 100644
index 2d15164..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/every.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"every.js","sources":["../../../src/internal/operators/every.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAwB3C,MAAM,UAAU,KAAK,CAAI,SAAsE,EACtE,OAAa;IACpC,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,aAAa;IACjB,YAAoB,SAAsE,EACtE,OAAa,EACb,MAAsB;QAFtB,cAAS,GAAT,SAAS,CAA6D;QACtE,YAAO,GAAP,OAAO,CAAM;QACb,WAAM,GAAN,MAAM,CAAgB;IAC1C,CAAC;IAED,IAAI,CAAC,QAA6B,EAAE,MAAW;QAC7C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpG,CAAC;CACF;AAOD,MAAM,eAAmB,SAAQ,UAAa;IAG5C,YAAY,WAA8B,EACtB,SAAsE,EACtE,OAAY,EACZ,MAAsB;QACxC,KAAK,CAAC,WAAW,CAAC,CAAC;QAHD,cAAS,GAAT,SAAS,CAA6D;QACtE,YAAO,GAAP,OAAO,CAAK;QACZ,WAAM,GAAN,MAAM,CAAgB;QALlC,UAAK,GAAW,CAAC,CAAC;QAOxB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC;IACjC,CAAC;IAEO,cAAc,CAAC,eAAwB;QAC7C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SAC9E;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QAED,IAAI,CAAC,MAAM,EAAE;YACX,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;SAC5B;IACH,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/exhaust.js b/node_modules/rxjs/_esm2015/internal/operators/exhaust.js
deleted file mode 100644
index ae4a72c..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/exhaust.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function exhaust() {
-    return (source) => source.lift(new SwitchFirstOperator());
-}
-class SwitchFirstOperator {
-    call(subscriber, source) {
-        return source.subscribe(new SwitchFirstSubscriber(subscriber));
-    }
-}
-class SwitchFirstSubscriber extends OuterSubscriber {
-    constructor(destination) {
-        super(destination);
-        this.hasCompleted = false;
-        this.hasSubscription = false;
-    }
-    _next(value) {
-        if (!this.hasSubscription) {
-            this.hasSubscription = true;
-            this.add(subscribeToResult(this, value));
-        }
-    }
-    _complete() {
-        this.hasCompleted = true;
-        if (!this.hasSubscription) {
-            this.destination.complete();
-        }
-    }
-    notifyComplete(innerSub) {
-        this.remove(innerSub);
-        this.hasSubscription = false;
-        if (this.hasCompleted) {
-            this.destination.complete();
-        }
-    }
-}
-//# sourceMappingURL=exhaust.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/exhaust.js.map b/node_modules/rxjs/_esm2015/internal/operators/exhaust.js.map
deleted file mode 100644
index a9a2c6a..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/exhaust.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exhaust.js","sources":["../../../src/internal/operators/exhaust.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAkD9D,MAAM,UAAU,OAAO;IACrB,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,mBAAmB;IACvB,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;CACF;AAOD,MAAM,qBAAyB,SAAQ,eAAqB;IAI1D,YAAY,WAA0B;QACpC,KAAK,CAAC,WAAW,CAAC,CAAC;QAJb,iBAAY,GAAY,KAAK,CAAC;QAC9B,oBAAe,GAAY,KAAK,CAAC;IAIzC,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;SAC1C;IACH,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;IACH,CAAC;IAED,cAAc,CAAC,QAAsB;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/exhaustMap.js b/node_modules/rxjs/_esm2015/internal/operators/exhaustMap.js
deleted file mode 100644
index 89ac718..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/exhaustMap.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { map } from './map';
-import { from } from '../observable/from';
-export function exhaustMap(project, resultSelector) {
-    if (resultSelector) {
-        return (source) => source.pipe(exhaustMap((a, i) => from(project(a, i)).pipe(map((b, ii) => resultSelector(a, b, i, ii)))));
-    }
-    return (source) => source.lift(new ExhaustMapOperator(project));
-}
-class ExhaustMapOperator {
-    constructor(project) {
-        this.project = project;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project));
-    }
-}
-class ExhaustMapSubscriber extends OuterSubscriber {
-    constructor(destination, project) {
-        super(destination);
-        this.project = project;
-        this.hasSubscription = false;
-        this.hasCompleted = false;
-        this.index = 0;
-    }
-    _next(value) {
-        if (!this.hasSubscription) {
-            this.tryNext(value);
-        }
-    }
-    tryNext(value) {
-        let result;
-        const index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.hasSubscription = true;
-        this._innerSub(result, value, index);
-    }
-    _innerSub(result, value, index) {
-        const innerSubscriber = new InnerSubscriber(this, value, index);
-        const destination = this.destination;
-        destination.add(innerSubscriber);
-        const innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            destination.add(innerSubscription);
-        }
-    }
-    _complete() {
-        this.hasCompleted = true;
-        if (!this.hasSubscription) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    }
-    notifyError(err) {
-        this.destination.error(err);
-    }
-    notifyComplete(innerSub) {
-        const destination = this.destination;
-        destination.remove(innerSub);
-        this.hasSubscription = false;
-        if (this.hasCompleted) {
-            this.destination.complete();
-        }
-    }
-}
-//# sourceMappingURL=exhaustMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/exhaustMap.js.map b/node_modules/rxjs/_esm2015/internal/operators/exhaustMap.js.map
deleted file mode 100644
index fbb1faf..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/exhaustMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exhaustMap.js","sources":["../../../src/internal/operators/exhaustMap.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAuD1C,MAAM,UAAU,UAAU,CACxB,OAAuC,EACvC,cAA6G;IAE7G,IAAI,cAAc,EAAE;QAElB,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAC3C,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAC3C,GAAG,CAAC,CAAC,CAAM,EAAE,EAAO,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CACtD,CAAC,CACH,CAAC;KACH;IACD,OAAO,CAAC,MAAqB,EAAE,EAAE,CAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,kBAAkB;IACtB,YAAoB,OAAwD;QAAxD,YAAO,GAAP,OAAO,CAAiD;IAC5E,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E,CAAC;CACF;AAOD,MAAM,oBAA2B,SAAQ,eAAqB;IAK5D,YAAY,WAA0B,EAClB,OAAwD;QAC1E,KAAK,CAAC,WAAW,CAAC,CAAC;QADD,YAAO,GAAP,OAAO,CAAiD;QALpE,oBAAe,GAAG,KAAK,CAAC;QACxB,iBAAY,GAAG,KAAK,CAAC;QACrB,UAAK,GAAG,CAAC,CAAC;IAKlB,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SACrB;IACH,CAAC;IAEO,OAAO,CAAC,KAAQ;QACtB,IAAI,MAA0B,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACrC;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAEO,SAAS,CAAC,MAA0B,EAAE,KAAQ,EAAE,KAAa;QACnE,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,IAAI,CAAC,WAA2B,CAAC;QACrD,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACjC,MAAM,iBAAiB,GAAG,iBAAiB,CAAO,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAIvG,IAAI,iBAAiB,KAAK,eAAe,EAAE;YACzC,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;SACpC;IACH,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,UAAU,CAAC,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAED,WAAW,CAAC,GAAQ;QAClB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,cAAc,CAAC,QAAsB;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC,WAA2B,CAAC;QACrD,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE7B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/expand.js b/node_modules/rxjs/_esm2015/internal/operators/expand.js
deleted file mode 100644
index b999780..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/expand.js
+++ /dev/null
@@ -1,91 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function expand(project, concurrent = Number.POSITIVE_INFINITY, scheduler = undefined) {
-    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
-    return (source) => source.lift(new ExpandOperator(project, concurrent, scheduler));
-}
-export class ExpandOperator {
-    constructor(project, concurrent, scheduler) {
-        this.project = project;
-        this.concurrent = concurrent;
-        this.scheduler = scheduler;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));
-    }
-}
-export class ExpandSubscriber extends OuterSubscriber {
-    constructor(destination, project, concurrent, scheduler) {
-        super(destination);
-        this.project = project;
-        this.concurrent = concurrent;
-        this.scheduler = scheduler;
-        this.index = 0;
-        this.active = 0;
-        this.hasCompleted = false;
-        if (concurrent < Number.POSITIVE_INFINITY) {
-            this.buffer = [];
-        }
-    }
-    static dispatch(arg) {
-        const { subscriber, result, value, index } = arg;
-        subscriber.subscribeToProjection(result, value, index);
-    }
-    _next(value) {
-        const destination = this.destination;
-        if (destination.closed) {
-            this._complete();
-            return;
-        }
-        const index = this.index++;
-        if (this.active < this.concurrent) {
-            destination.next(value);
-            try {
-                const { project } = this;
-                const result = project(value, index);
-                if (!this.scheduler) {
-                    this.subscribeToProjection(result, value, index);
-                }
-                else {
-                    const state = { subscriber: this, result, value, index };
-                    const destination = this.destination;
-                    destination.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));
-                }
-            }
-            catch (e) {
-                destination.error(e);
-            }
-        }
-        else {
-            this.buffer.push(value);
-        }
-    }
-    subscribeToProjection(result, value, index) {
-        this.active++;
-        const destination = this.destination;
-        destination.add(subscribeToResult(this, result, value, index));
-    }
-    _complete() {
-        this.hasCompleted = true;
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this._next(innerValue);
-    }
-    notifyComplete(innerSub) {
-        const buffer = this.buffer;
-        const destination = this.destination;
-        destination.remove(innerSub);
-        this.active--;
-        if (buffer && buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-    }
-}
-//# sourceMappingURL=expand.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/expand.js.map b/node_modules/rxjs/_esm2015/internal/operators/expand.js.map
deleted file mode 100644
index 3e86451..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/expand.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"expand.js","sources":["../../../src/internal/operators/expand.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/filter.js b/node_modules/rxjs/_esm2015/internal/operators/filter.js
deleted file mode 100644
index 3c94a97..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/filter.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function filter(predicate, thisArg) {
-    return function filterOperatorFunction(source) {
-        return source.lift(new FilterOperator(predicate, thisArg));
-    };
-}
-class FilterOperator {
-    constructor(predicate, thisArg) {
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));
-    }
-}
-class FilterSubscriber extends Subscriber {
-    constructor(destination, predicate, thisArg) {
-        super(destination);
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-        this.count = 0;
-    }
-    _next(value) {
-        let result;
-        try {
-            result = this.predicate.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this.destination.next(value);
-        }
-    }
-}
-//# sourceMappingURL=filter.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/filter.js.map b/node_modules/rxjs/_esm2015/internal/operators/filter.js.map
deleted file mode 100644
index d0341d0..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/filter.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"filter.js","sources":["../../../src/internal/operators/filter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAwD3C,MAAM,UAAU,MAAM,CAAI,SAA+C,EAC/C,OAAa;IACrC,OAAO,SAAS,sBAAsB,CAAC,MAAqB;QAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,cAAc;IAClB,YAAoB,SAA+C,EAC/C,OAAa;QADb,cAAS,GAAT,SAAS,CAAsC;QAC/C,YAAO,GAAP,OAAO,CAAM;IACjC,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1F,CAAC;CACF;AAOD,MAAM,gBAAoB,SAAQ,UAAa;IAI7C,YAAY,WAA0B,EAClB,SAA+C,EAC/C,OAAY;QAC9B,KAAK,CAAC,WAAW,CAAC,CAAC;QAFD,cAAS,GAAT,SAAS,CAAsC;QAC/C,YAAO,GAAP,OAAO,CAAK;QAJhC,UAAK,GAAW,CAAC,CAAC;IAMlB,CAAC;IAIS,KAAK,CAAC,KAAQ;QACtB,IAAI,MAAW,CAAC;QAChB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SACjE;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QACD,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/finalize.js b/node_modules/rxjs/_esm2015/internal/operators/finalize.js
deleted file mode 100644
index 0e4b481..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/finalize.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-export function finalize(callback) {
-    return (source) => source.lift(new FinallyOperator(callback));
-}
-class FinallyOperator {
-    constructor(callback) {
-        this.callback = callback;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new FinallySubscriber(subscriber, this.callback));
-    }
-}
-class FinallySubscriber extends Subscriber {
-    constructor(destination, callback) {
-        super(destination);
-        this.add(new Subscription(callback));
-    }
-}
-//# sourceMappingURL=finalize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/finalize.js.map b/node_modules/rxjs/_esm2015/internal/operators/finalize.js.map
deleted file mode 100644
index 41375be..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/finalize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"finalize.js","sources":["../../../src/internal/operators/finalize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAY/C,MAAM,UAAU,QAAQ,CAAI,QAAoB;IAC9C,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,eAAe;IACnB,YAAoB,QAAoB;QAApB,aAAQ,GAAR,QAAQ,CAAY;IACxC,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5E,CAAC;CACF;AAOD,MAAM,iBAAqB,SAAQ,UAAa;IAC9C,YAAY,WAA0B,EAAE,QAAoB;QAC1D,KAAK,CAAC,WAAW,CAAC,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvC,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/find.js b/node_modules/rxjs/_esm2015/internal/operators/find.js
deleted file mode 100644
index 37d80e1..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/find.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function find(predicate, thisArg) {
-    if (typeof predicate !== 'function') {
-        throw new TypeError('predicate is not a function');
-    }
-    return (source) => source.lift(new FindValueOperator(predicate, source, false, thisArg));
-}
-export class FindValueOperator {
-    constructor(predicate, source, yieldIndex, thisArg) {
-        this.predicate = predicate;
-        this.source = source;
-        this.yieldIndex = yieldIndex;
-        this.thisArg = thisArg;
-    }
-    call(observer, source) {
-        return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));
-    }
-}
-export class FindValueSubscriber extends Subscriber {
-    constructor(destination, predicate, source, yieldIndex, thisArg) {
-        super(destination);
-        this.predicate = predicate;
-        this.source = source;
-        this.yieldIndex = yieldIndex;
-        this.thisArg = thisArg;
-        this.index = 0;
-    }
-    notifyComplete(value) {
-        const destination = this.destination;
-        destination.next(value);
-        destination.complete();
-        this.unsubscribe();
-    }
-    _next(value) {
-        const { predicate, thisArg } = this;
-        const index = this.index++;
-        try {
-            const result = predicate.call(thisArg || this, value, index, this.source);
-            if (result) {
-                this.notifyComplete(this.yieldIndex ? index : value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    }
-    _complete() {
-        this.notifyComplete(this.yieldIndex ? -1 : undefined);
-    }
-}
-//# sourceMappingURL=find.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/find.js.map b/node_modules/rxjs/_esm2015/internal/operators/find.js.map
deleted file mode 100644
index 5b684be..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/find.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"find.js","sources":["../../../src/internal/operators/find.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AA8CzC,MAAM,UAAU,IAAI,CAAI,SAAsE,EACtE,OAAa;IACnC,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;QACnC,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;KACpD;IACD,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAA8B,CAAC;AACvI,CAAC;AAED,MAAM,OAAO,iBAAiB;IAC5B,YAAoB,SAAsE,EACtE,MAAqB,EACrB,UAAmB,EACnB,OAAa;QAHb,cAAS,GAAT,SAAS,CAA6D;QACtE,WAAM,GAAN,MAAM,CAAe;QACrB,eAAU,GAAV,UAAU,CAAS;QACnB,YAAO,GAAP,OAAO,CAAM;IACjC,CAAC;IAED,IAAI,CAAC,QAAuB,EAAE,MAAW;QACvC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACzH,CAAC;CACF;AAOD,MAAM,OAAO,mBAAuB,SAAQ,UAAa;IAGvD,YAAY,WAA0B,EAClB,SAAsE,EACtE,MAAqB,EACrB,UAAmB,EACnB,OAAa;QAC/B,KAAK,CAAC,WAAW,CAAC,CAAC;QAJD,cAAS,GAAT,SAAS,CAA6D;QACtE,WAAM,GAAN,MAAM,CAAe;QACrB,eAAU,GAAV,UAAU,CAAS;QACnB,YAAO,GAAP,OAAO,CAAM;QANzB,UAAK,GAAW,CAAC,CAAC;IAQ1B,CAAC;IAEO,cAAc,CAAC,KAAU;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAErC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,WAAW,CAAC,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,MAAM,EAAC,SAAS,EAAE,OAAO,EAAC,GAAG,IAAI,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI;YACF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1E,IAAI,MAAM,EAAE;gBACV,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aACtD;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;IACH,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/findIndex.js b/node_modules/rxjs/_esm2015/internal/operators/findIndex.js
deleted file mode 100644
index 6472721..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/findIndex.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { FindValueOperator } from '../operators/find';
-export function findIndex(predicate, thisArg) {
-    return (source) => source.lift(new FindValueOperator(predicate, source, true, thisArg));
-}
-//# sourceMappingURL=findIndex.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/findIndex.js.map b/node_modules/rxjs/_esm2015/internal/operators/findIndex.js.map
deleted file mode 100644
index 29d8dbf..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/findIndex.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"findIndex.js","sources":["../../../src/internal/operators/findIndex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA0CtD,MAAM,UAAU,SAAS,CAAI,SAAsE,EACtE,OAAa;IACxC,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAoB,CAAC;AAC5H,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/first.js b/node_modules/rxjs/_esm2015/internal/operators/first.js
deleted file mode 100644
index 406bba0..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/first.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { EmptyError } from '../util/EmptyError';
-import { filter } from './filter';
-import { take } from './take';
-import { defaultIfEmpty } from './defaultIfEmpty';
-import { throwIfEmpty } from './throwIfEmpty';
-import { identity } from '../util/identity';
-export function first(predicate, defaultValue) {
-    const hasDefaultValue = arguments.length >= 2;
-    return (source) => source.pipe(predicate ? filter((v, i) => predicate(v, i, source)) : identity, take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(() => new EmptyError()));
-}
-//# sourceMappingURL=first.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/first.js.map b/node_modules/rxjs/_esm2015/internal/operators/first.js.map
deleted file mode 100644
index 44ff5c9..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/first.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"first.js","sources":["../../../src/internal/operators/first.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAuE5C,MAAM,UAAU,KAAK,CACnB,SAAgF,EAChF,YAAgB;IAEhB,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAC3C,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAChE,IAAI,CAAC,CAAC,CAAC,EACP,eAAe,CAAC,CAAC,CAAC,cAAc,CAAQ,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,CAC7F,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/groupBy.js b/node_modules/rxjs/_esm2015/internal/operators/groupBy.js
deleted file mode 100644
index c60d49d..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/groupBy.js
+++ /dev/null
@@ -1,164 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { Observable } from '../Observable';
-import { Subject } from '../Subject';
-export function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {
-    return (source) => source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));
-}
-class GroupByOperator {
-    constructor(keySelector, elementSelector, durationSelector, subjectSelector) {
-        this.keySelector = keySelector;
-        this.elementSelector = elementSelector;
-        this.durationSelector = durationSelector;
-        this.subjectSelector = subjectSelector;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));
-    }
-}
-class GroupBySubscriber extends Subscriber {
-    constructor(destination, keySelector, elementSelector, durationSelector, subjectSelector) {
-        super(destination);
-        this.keySelector = keySelector;
-        this.elementSelector = elementSelector;
-        this.durationSelector = durationSelector;
-        this.subjectSelector = subjectSelector;
-        this.groups = null;
-        this.attemptedToUnsubscribe = false;
-        this.count = 0;
-    }
-    _next(value) {
-        let key;
-        try {
-            key = this.keySelector(value);
-        }
-        catch (err) {
-            this.error(err);
-            return;
-        }
-        this._group(value, key);
-    }
-    _group(value, key) {
-        let groups = this.groups;
-        if (!groups) {
-            groups = this.groups = new Map();
-        }
-        let group = groups.get(key);
-        let element;
-        if (this.elementSelector) {
-            try {
-                element = this.elementSelector(value);
-            }
-            catch (err) {
-                this.error(err);
-            }
-        }
-        else {
-            element = value;
-        }
-        if (!group) {
-            group = (this.subjectSelector ? this.subjectSelector() : new Subject());
-            groups.set(key, group);
-            const groupedObservable = new GroupedObservable(key, group, this);
-            this.destination.next(groupedObservable);
-            if (this.durationSelector) {
-                let duration;
-                try {
-                    duration = this.durationSelector(new GroupedObservable(key, group));
-                }
-                catch (err) {
-                    this.error(err);
-                    return;
-                }
-                this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));
-            }
-        }
-        if (!group.closed) {
-            group.next(element);
-        }
-    }
-    _error(err) {
-        const groups = this.groups;
-        if (groups) {
-            groups.forEach((group, key) => {
-                group.error(err);
-            });
-            groups.clear();
-        }
-        this.destination.error(err);
-    }
-    _complete() {
-        const groups = this.groups;
-        if (groups) {
-            groups.forEach((group, key) => {
-                group.complete();
-            });
-            groups.clear();
-        }
-        this.destination.complete();
-    }
-    removeGroup(key) {
-        this.groups.delete(key);
-    }
-    unsubscribe() {
-        if (!this.closed) {
-            this.attemptedToUnsubscribe = true;
-            if (this.count === 0) {
-                super.unsubscribe();
-            }
-        }
-    }
-}
-class GroupDurationSubscriber extends Subscriber {
-    constructor(key, group, parent) {
-        super(group);
-        this.key = key;
-        this.group = group;
-        this.parent = parent;
-    }
-    _next(value) {
-        this.complete();
-    }
-    _unsubscribe() {
-        const { parent, key } = this;
-        this.key = this.parent = null;
-        if (parent) {
-            parent.removeGroup(key);
-        }
-    }
-}
-export class GroupedObservable extends Observable {
-    constructor(key, groupSubject, refCountSubscription) {
-        super();
-        this.key = key;
-        this.groupSubject = groupSubject;
-        this.refCountSubscription = refCountSubscription;
-    }
-    _subscribe(subscriber) {
-        const subscription = new Subscription();
-        const { refCountSubscription, groupSubject } = this;
-        if (refCountSubscription && !refCountSubscription.closed) {
-            subscription.add(new InnerRefCountSubscription(refCountSubscription));
-        }
-        subscription.add(groupSubject.subscribe(subscriber));
-        return subscription;
-    }
-}
-class InnerRefCountSubscription extends Subscription {
-    constructor(parent) {
-        super();
-        this.parent = parent;
-        parent.count++;
-    }
-    unsubscribe() {
-        const parent = this.parent;
-        if (!parent.closed && !this.closed) {
-            super.unsubscribe();
-            parent.count -= 1;
-            if (parent.count === 0 && parent.attemptedToUnsubscribe) {
-                parent.unsubscribe();
-            }
-        }
-    }
-}
-//# sourceMappingURL=groupBy.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/groupBy.js.map b/node_modules/rxjs/_esm2015/internal/operators/groupBy.js.map
deleted file mode 100644
index 7725828..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/groupBy.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"groupBy.js","sources":["../../../src/internal/operators/groupBy.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/ignoreElements.js b/node_modules/rxjs/_esm2015/internal/operators/ignoreElements.js
deleted file mode 100644
index 9b4d214..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/ignoreElements.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function ignoreElements() {
-    return function ignoreElementsOperatorFunction(source) {
-        return source.lift(new IgnoreElementsOperator());
-    };
-}
-class IgnoreElementsOperator {
-    call(subscriber, source) {
-        return source.subscribe(new IgnoreElementsSubscriber(subscriber));
-    }
-}
-class IgnoreElementsSubscriber extends Subscriber {
-    _next(unused) {
-    }
-}
-//# sourceMappingURL=ignoreElements.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/ignoreElements.js.map b/node_modules/rxjs/_esm2015/internal/operators/ignoreElements.js.map
deleted file mode 100644
index 9ac771c..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/ignoreElements.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ignoreElements.js","sources":["../../../src/internal/operators/ignoreElements.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA8B3C,MAAM,UAAU,cAAc;IAC5B,OAAO,SAAS,8BAA8B,CAAC,MAAuB;QACpE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,sBAAsB;IAC1B,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAAC;IACpE,CAAC;CACF;AAOD,MAAM,wBAA4B,SAAQ,UAAa;IAC3C,KAAK,CAAC,MAAS;IAEzB,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/index.js b/node_modules/rxjs/_esm2015/internal/operators/index.js
deleted file mode 100644
index 52a926c..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/index.js
+++ /dev/null
@@ -1,103 +0,0 @@
-export { audit } from './audit';
-export { auditTime } from './auditTime';
-export { buffer } from './buffer';
-export { bufferCount } from './bufferCount';
-export { bufferTime } from './bufferTime';
-export { bufferToggle } from './bufferToggle';
-export { bufferWhen } from './bufferWhen';
-export { catchError } from './catchError';
-export { combineAll } from './combineAll';
-export { combineLatest } from './combineLatest';
-export { concat } from './concat';
-export { concatAll } from './concatAll';
-export { concatMap } from './concatMap';
-export { concatMapTo } from './concatMapTo';
-export { count } from './count';
-export { debounce } from './debounce';
-export { debounceTime } from './debounceTime';
-export { defaultIfEmpty } from './defaultIfEmpty';
-export { delay } from './delay';
-export { delayWhen } from './delayWhen';
-export { dematerialize } from './dematerialize';
-export { distinct } from './distinct';
-export { distinctUntilChanged } from './distinctUntilChanged';
-export { distinctUntilKeyChanged } from './distinctUntilKeyChanged';
-export { elementAt } from './elementAt';
-export { every } from './every';
-export { exhaust } from './exhaust';
-export { exhaustMap } from './exhaustMap';
-export { expand } from './expand';
-export { filter } from './filter';
-export { finalize } from './finalize';
-export { find } from './find';
-export { findIndex } from './findIndex';
-export { first } from './first';
-export { groupBy } from './groupBy';
-export { ignoreElements } from './ignoreElements';
-export { isEmpty } from './isEmpty';
-export { last } from './last';
-export { map } from './map';
-export { mapTo } from './mapTo';
-export { materialize } from './materialize';
-export { max } from './max';
-export { merge } from './merge';
-export { mergeAll } from './mergeAll';
-export { mergeMap } from './mergeMap';
-export { mergeMap as flatMap } from './mergeMap';
-export { mergeMapTo } from './mergeMapTo';
-export { mergeScan } from './mergeScan';
-export { min } from './min';
-export { multicast } from './multicast';
-export { observeOn } from './observeOn';
-export { onErrorResumeNext } from './onErrorResumeNext';
-export { pairwise } from './pairwise';
-export { partition } from './partition';
-export { pluck } from './pluck';
-export { publish } from './publish';
-export { publishBehavior } from './publishBehavior';
-export { publishLast } from './publishLast';
-export { publishReplay } from './publishReplay';
-export { race } from './race';
-export { reduce } from './reduce';
-export { repeat } from './repeat';
-export { repeatWhen } from './repeatWhen';
-export { retry } from './retry';
-export { retryWhen } from './retryWhen';
-export { refCount } from './refCount';
-export { sample } from './sample';
-export { sampleTime } from './sampleTime';
-export { scan } from './scan';
-export { sequenceEqual } from './sequenceEqual';
-export { share } from './share';
-export { shareReplay } from './shareReplay';
-export { single } from './single';
-export { skip } from './skip';
-export { skipLast } from './skipLast';
-export { skipUntil } from './skipUntil';
-export { skipWhile } from './skipWhile';
-export { startWith } from './startWith';
-export { subscribeOn } from './subscribeOn';
-export { switchAll } from './switchAll';
-export { switchMap } from './switchMap';
-export { switchMapTo } from './switchMapTo';
-export { take } from './take';
-export { takeLast } from './takeLast';
-export { takeUntil } from './takeUntil';
-export { takeWhile } from './takeWhile';
-export { tap } from './tap';
-export { throttle } from './throttle';
-export { throttleTime } from './throttleTime';
-export { timeInterval } from './timeInterval';
-export { timeout } from './timeout';
-export { timeoutWith } from './timeoutWith';
-export { timestamp } from './timestamp';
-export { toArray } from './toArray';
-export { window } from './window';
-export { windowCount } from './windowCount';
-export { windowTime } from './windowTime';
-export { windowToggle } from './windowToggle';
-export { windowWhen } from './windowWhen';
-export { withLatestFrom } from './withLatestFrom';
-export { zip } from './zip';
-export { zipAll } from './zipAll';
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/index.js.map b/node_modules/rxjs/_esm2015/internal/operators/index.js.map
deleted file mode 100644
index 9ba5647..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../../src/internal/operators/index.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/isEmpty.js b/node_modules/rxjs/_esm2015/internal/operators/isEmpty.js
deleted file mode 100644
index a1b8b5a..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/isEmpty.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function isEmpty() {
-    return (source) => source.lift(new IsEmptyOperator());
-}
-class IsEmptyOperator {
-    call(observer, source) {
-        return source.subscribe(new IsEmptySubscriber(observer));
-    }
-}
-class IsEmptySubscriber extends Subscriber {
-    constructor(destination) {
-        super(destination);
-    }
-    notifyComplete(isEmpty) {
-        const destination = this.destination;
-        destination.next(isEmpty);
-        destination.complete();
-    }
-    _next(value) {
-        this.notifyComplete(false);
-    }
-    _complete() {
-        this.notifyComplete(true);
-    }
-}
-//# sourceMappingURL=isEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/isEmpty.js.map b/node_modules/rxjs/_esm2015/internal/operators/isEmpty.js.map
deleted file mode 100644
index c0f8e63..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/isEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isEmpty.js","sources":["../../../src/internal/operators/isEmpty.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAgE3C,MAAM,UAAU,OAAO;IACrB,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,eAAe;IACnB,IAAI,CAAE,QAA6B,EAAE,MAAW;QAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,CAAC;CACF;AAOD,MAAM,iBAAkB,SAAQ,UAAe;IAC7C,YAAY,WAAgC;QAC1C,KAAK,CAAC,WAAW,CAAC,CAAC;IACrB,CAAC;IAEO,cAAc,CAAC,OAAgB;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAErC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,WAAW,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAES,KAAK,CAAC,KAAc;QAC5B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/last.js b/node_modules/rxjs/_esm2015/internal/operators/last.js
deleted file mode 100644
index ff65d75..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/last.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { EmptyError } from '../util/EmptyError';
-import { filter } from './filter';
-import { takeLast } from './takeLast';
-import { throwIfEmpty } from './throwIfEmpty';
-import { defaultIfEmpty } from './defaultIfEmpty';
-import { identity } from '../util/identity';
-export function last(predicate, defaultValue) {
-    const hasDefaultValue = arguments.length >= 2;
-    return (source) => source.pipe(predicate ? filter((v, i) => predicate(v, i, source)) : identity, takeLast(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(() => new EmptyError()));
-}
-//# sourceMappingURL=last.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/last.js.map b/node_modules/rxjs/_esm2015/internal/operators/last.js.map
deleted file mode 100644
index 95eb25f..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/last.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"last.js","sources":["../../../src/internal/operators/last.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAkC5C,MAAM,UAAU,IAAI,CAClB,SAAgF,EAChF,YAAgB;IAEhB,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAC3C,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAChE,QAAQ,CAAC,CAAC,CAAC,EACX,eAAe,CAAC,CAAC,CAAC,cAAc,CAAQ,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,CAC7F,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/map.js b/node_modules/rxjs/_esm2015/internal/operators/map.js
deleted file mode 100644
index 3be1e76..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/map.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function map(project, thisArg) {
-    return function mapOperation(source) {
-        if (typeof project !== 'function') {
-            throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
-        }
-        return source.lift(new MapOperator(project, thisArg));
-    };
-}
-export class MapOperator {
-    constructor(project, thisArg) {
-        this.project = project;
-        this.thisArg = thisArg;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
-    }
-}
-class MapSubscriber extends Subscriber {
-    constructor(destination, project, thisArg) {
-        super(destination);
-        this.project = project;
-        this.count = 0;
-        this.thisArg = thisArg || this;
-    }
-    _next(value) {
-        let result;
-        try {
-            result = this.project.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    }
-}
-//# sourceMappingURL=map.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/map.js.map b/node_modules/rxjs/_esm2015/internal/operators/map.js.map
deleted file mode 100644
index b396f64..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/map.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"map.js","sources":["../../../src/internal/operators/map.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA2C3C,MAAM,UAAU,GAAG,CAAO,OAAuC,EAAE,OAAa;IAC9E,OAAO,SAAS,YAAY,CAAC,MAAqB;QAChD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;YACjC,MAAM,IAAI,SAAS,CAAC,4DAA4D,CAAC,CAAC;SACnF;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,WAAW;IACtB,YAAoB,OAAuC,EAAU,OAAY;QAA7D,YAAO,GAAP,OAAO,CAAgC;QAAU,YAAO,GAAP,OAAO,CAAK;IACjF,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrF,CAAC;CACF;AAOD,MAAM,aAAoB,SAAQ,UAAa;IAI7C,YAAY,WAA0B,EAClB,OAAuC,EAC/C,OAAY;QACtB,KAAK,CAAC,WAAW,CAAC,CAAC;QAFD,YAAO,GAAP,OAAO,CAAgC;QAJ3D,UAAK,GAAW,CAAC,CAAC;QAOhB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC;IACjC,CAAC;IAIS,KAAK,CAAC,KAAQ;QACtB,IAAI,MAAS,CAAC;QACd,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SAC/D;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/mapTo.js b/node_modules/rxjs/_esm2015/internal/operators/mapTo.js
deleted file mode 100644
index 160be16..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/mapTo.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function mapTo(value) {
-    return (source) => source.lift(new MapToOperator(value));
-}
-class MapToOperator {
-    constructor(value) {
-        this.value = value;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new MapToSubscriber(subscriber, this.value));
-    }
-}
-class MapToSubscriber extends Subscriber {
-    constructor(destination, value) {
-        super(destination);
-        this.value = value;
-    }
-    _next(x) {
-        this.destination.next(this.value);
-    }
-}
-//# sourceMappingURL=mapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/mapTo.js.map b/node_modules/rxjs/_esm2015/internal/operators/mapTo.js.map
deleted file mode 100644
index d572ed8..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/mapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mapTo.js","sources":["../../../src/internal/operators/mapTo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAoC3C,MAAM,UAAU,KAAK,CAAO,KAAQ;IAClC,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,aAAa;IAIjB,YAAY,KAAQ;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;CACF;AAOD,MAAM,eAAsB,SAAQ,UAAa;IAI/C,YAAY,WAA0B,EAAE,KAAQ;QAC9C,KAAK,CAAC,WAAW,CAAC,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAES,KAAK,CAAC,CAAI;QAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/materialize.js b/node_modules/rxjs/_esm2015/internal/operators/materialize.js
deleted file mode 100644
index 66eac6c..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/materialize.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { Notification } from '../Notification';
-export function materialize() {
-    return function materializeOperatorFunction(source) {
-        return source.lift(new MaterializeOperator());
-    };
-}
-class MaterializeOperator {
-    call(subscriber, source) {
-        return source.subscribe(new MaterializeSubscriber(subscriber));
-    }
-}
-class MaterializeSubscriber extends Subscriber {
-    constructor(destination) {
-        super(destination);
-    }
-    _next(value) {
-        this.destination.next(Notification.createNext(value));
-    }
-    _error(err) {
-        const destination = this.destination;
-        destination.next(Notification.createError(err));
-        destination.complete();
-    }
-    _complete() {
-        const destination = this.destination;
-        destination.next(Notification.createComplete());
-        destination.complete();
-    }
-}
-//# sourceMappingURL=materialize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/materialize.js.map b/node_modules/rxjs/_esm2015/internal/operators/materialize.js.map
deleted file mode 100644
index cd635a6..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/materialize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"materialize.js","sources":["../../../src/internal/operators/materialize.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAqD/C,MAAM,UAAU,WAAW;IACzB,OAAO,SAAS,2BAA2B,CAAC,MAAqB;QAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,mBAAmB;IACvB,IAAI,CAAC,UAAuC,EAAE,MAAW;QACvD,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;CACF;AAOD,MAAM,qBAAyB,SAAQ,UAAa;IAClD,YAAY,WAAwC;QAClD,KAAK,CAAC,WAAW,CAAC,CAAC;IACrB,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAES,MAAM,CAAC,GAAQ;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,WAAW,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAES,SAAS;QACjB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;QAChD,WAAW,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/max.js b/node_modules/rxjs/_esm2015/internal/operators/max.js
deleted file mode 100644
index 6d2083e..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/max.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import { reduce } from './reduce';
-export function max(comparer) {
-    const max = (typeof comparer === 'function')
-        ? (x, y) => comparer(x, y) > 0 ? x : y
-        : (x, y) => x > y ? x : y;
-    return reduce(max);
-}
-//# sourceMappingURL=max.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/max.js.map b/node_modules/rxjs/_esm2015/internal/operators/max.js.map
deleted file mode 100644
index 0009e69..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/max.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"max.js","sources":["../../../src/internal/operators/max.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAgDlC,MAAM,UAAU,GAAG,CAAI,QAAiC;IACtD,MAAM,GAAG,GAAsB,CAAC,OAAO,QAAQ,KAAK,UAAU,CAAC;QAC7D,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/merge.js b/node_modules/rxjs/_esm2015/internal/operators/merge.js
deleted file mode 100644
index 691be8b..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/merge.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { merge as mergeStatic } from '../observable/merge';
-export function merge(...observables) {
-    return (source) => source.lift.call(mergeStatic(source, ...observables));
-}
-//# sourceMappingURL=merge.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/merge.js.map b/node_modules/rxjs/_esm2015/internal/operators/merge.js.map
deleted file mode 100644
index 52e603c..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/merge.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"merge.js","sources":["../../../src/internal/operators/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAsC3D,MAAM,UAAU,KAAK,CAAO,GAAG,WAAiE;IAC9F,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC;AAC1F,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/mergeAll.js b/node_modules/rxjs/_esm2015/internal/operators/mergeAll.js
deleted file mode 100644
index 05d63a6..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/mergeAll.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { mergeMap } from './mergeMap';
-import { identity } from '../util/identity';
-export function mergeAll(concurrent = Number.POSITIVE_INFINITY) {
-    return mergeMap(identity, concurrent);
-}
-//# sourceMappingURL=mergeAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/mergeAll.js.map b/node_modules/rxjs/_esm2015/internal/operators/mergeAll.js.map
deleted file mode 100644
index 69da147..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/mergeAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeAll.js","sources":["../../../src/internal/operators/mergeAll.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AA6D5C,MAAM,UAAU,QAAQ,CAAI,aAAqB,MAAM,CAAC,iBAAiB;IACvE,OAAO,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/mergeMap.js b/node_modules/rxjs/_esm2015/internal/operators/mergeMap.js
deleted file mode 100644
index 09a50ce..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/mergeMap.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { map } from './map';
-import { from } from '../observable/from';
-export function mergeMap(project, resultSelector, concurrent = Number.POSITIVE_INFINITY) {
-    if (typeof resultSelector === 'function') {
-        return (source) => source.pipe(mergeMap((a, i) => from(project(a, i)).pipe(map((b, ii) => resultSelector(a, b, i, ii))), concurrent));
-    }
-    else if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-    }
-    return (source) => source.lift(new MergeMapOperator(project, concurrent));
-}
-export class MergeMapOperator {
-    constructor(project, concurrent = Number.POSITIVE_INFINITY) {
-        this.project = project;
-        this.concurrent = concurrent;
-    }
-    call(observer, source) {
-        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));
-    }
-}
-export class MergeMapSubscriber extends OuterSubscriber {
-    constructor(destination, project, concurrent = Number.POSITIVE_INFINITY) {
-        super(destination);
-        this.project = project;
-        this.concurrent = concurrent;
-        this.hasCompleted = false;
-        this.buffer = [];
-        this.active = 0;
-        this.index = 0;
-    }
-    _next(value) {
-        if (this.active < this.concurrent) {
-            this._tryNext(value);
-        }
-        else {
-            this.buffer.push(value);
-        }
-    }
-    _tryNext(value) {
-        let result;
-        const index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.active++;
-        this._innerSub(result, value, index);
-    }
-    _innerSub(ish, value, index) {
-        const innerSubscriber = new InnerSubscriber(this, value, index);
-        const destination = this.destination;
-        destination.add(innerSubscriber);
-        const innerSubscription = subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            destination.add(innerSubscription);
-        }
-    }
-    _complete() {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    }
-    notifyComplete(innerSub) {
-        const buffer = this.buffer;
-        this.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            this.destination.complete();
-        }
-    }
-}
-//# sourceMappingURL=mergeMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/mergeMap.js.map b/node_modules/rxjs/_esm2015/internal/operators/mergeMap.js.map
deleted file mode 100644
index d452ec8..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/mergeMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeMap.js","sources":["../../../src/internal/operators/mergeMap.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/mergeMapTo.js b/node_modules/rxjs/_esm2015/internal/operators/mergeMapTo.js
deleted file mode 100644
index d4184ba..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/mergeMapTo.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { mergeMap } from './mergeMap';
-export function mergeMapTo(innerObservable, resultSelector, concurrent = Number.POSITIVE_INFINITY) {
-    if (typeof resultSelector === 'function') {
-        return mergeMap(() => innerObservable, resultSelector, concurrent);
-    }
-    if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-    }
-    return mergeMap(() => innerObservable, concurrent);
-}
-//# sourceMappingURL=mergeMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/mergeMapTo.js.map b/node_modules/rxjs/_esm2015/internal/operators/mergeMapTo.js.map
deleted file mode 100644
index c7db281..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/mergeMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeMapTo.js","sources":["../../../src/internal/operators/mergeMapTo.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAiDtC,MAAM,UAAU,UAAU,CACxB,eAAkB,EAClB,cAAwH,EACxH,aAAqB,MAAM,CAAC,iBAAiB;IAE7C,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE;QACxC,OAAO,QAAQ,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;KACpE;IACD,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;QACtC,UAAU,GAAG,cAAc,CAAC;KAC7B;IACD,OAAO,QAAQ,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/mergeScan.js b/node_modules/rxjs/_esm2015/internal/operators/mergeScan.js
deleted file mode 100644
index db27069..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/mergeScan.js
+++ /dev/null
@@ -1,89 +0,0 @@
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-export function mergeScan(accumulator, seed, concurrent = Number.POSITIVE_INFINITY) {
-    return (source) => source.lift(new MergeScanOperator(accumulator, seed, concurrent));
-}
-export class MergeScanOperator {
-    constructor(accumulator, seed, concurrent) {
-        this.accumulator = accumulator;
-        this.seed = seed;
-        this.concurrent = concurrent;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));
-    }
-}
-export class MergeScanSubscriber extends OuterSubscriber {
-    constructor(destination, accumulator, acc, concurrent) {
-        super(destination);
-        this.accumulator = accumulator;
-        this.acc = acc;
-        this.concurrent = concurrent;
-        this.hasValue = false;
-        this.hasCompleted = false;
-        this.buffer = [];
-        this.active = 0;
-        this.index = 0;
-    }
-    _next(value) {
-        if (this.active < this.concurrent) {
-            const index = this.index++;
-            const destination = this.destination;
-            let ish;
-            try {
-                const { accumulator } = this;
-                ish = accumulator(this.acc, value, index);
-            }
-            catch (e) {
-                return destination.error(e);
-            }
-            this.active++;
-            this._innerSub(ish, value, index);
-        }
-        else {
-            this.buffer.push(value);
-        }
-    }
-    _innerSub(ish, value, index) {
-        const innerSubscriber = new InnerSubscriber(this, value, index);
-        const destination = this.destination;
-        destination.add(innerSubscriber);
-        const innerSubscription = subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            destination.add(innerSubscription);
-        }
-    }
-    _complete() {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            if (this.hasValue === false) {
-                this.destination.next(this.acc);
-            }
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        const { destination } = this;
-        this.acc = innerValue;
-        this.hasValue = true;
-        destination.next(innerValue);
-    }
-    notifyComplete(innerSub) {
-        const buffer = this.buffer;
-        const destination = this.destination;
-        destination.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            if (this.hasValue === false) {
-                this.destination.next(this.acc);
-            }
-            this.destination.complete();
-        }
-    }
-}
-//# sourceMappingURL=mergeScan.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/mergeScan.js.map b/node_modules/rxjs/_esm2015/internal/operators/mergeScan.js.map
deleted file mode 100644
index 37a2788..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/mergeScan.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeScan.js","sources":["../../../src/internal/operators/mergeScan.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/min.js b/node_modules/rxjs/_esm2015/internal/operators/min.js
deleted file mode 100644
index 1f7fc8c..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import { reduce } from './reduce';
-export function min(comparer) {
-    const min = (typeof comparer === 'function')
-        ? (x, y) => comparer(x, y) < 0 ? x : y
-        : (x, y) => x < y ? x : y;
-    return reduce(min);
-}
-//# sourceMappingURL=min.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/min.js.map b/node_modules/rxjs/_esm2015/internal/operators/min.js.map
deleted file mode 100644
index 1793b06..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"min.js","sources":["../../../src/internal/operators/min.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AA+ClC,MAAM,UAAU,GAAG,CAAI,QAAiC;IACtD,MAAM,GAAG,GAAsB,CAAC,OAAO,QAAQ,KAAK,UAAU,CAAC;QAC7D,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/multicast.js b/node_modules/rxjs/_esm2015/internal/operators/multicast.js
deleted file mode 100644
index 6e154c8..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/multicast.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import { connectableObservableDescriptor } from '../observable/ConnectableObservable';
-export function multicast(subjectOrSubjectFactory, selector) {
-    return function multicastOperatorFunction(source) {
-        let subjectFactory;
-        if (typeof subjectOrSubjectFactory === 'function') {
-            subjectFactory = subjectOrSubjectFactory;
-        }
-        else {
-            subjectFactory = function subjectFactory() {
-                return subjectOrSubjectFactory;
-            };
-        }
-        if (typeof selector === 'function') {
-            return source.lift(new MulticastOperator(subjectFactory, selector));
-        }
-        const connectable = Object.create(source, connectableObservableDescriptor);
-        connectable.source = source;
-        connectable.subjectFactory = subjectFactory;
-        return connectable;
-    };
-}
-export class MulticastOperator {
-    constructor(subjectFactory, selector) {
-        this.subjectFactory = subjectFactory;
-        this.selector = selector;
-    }
-    call(subscriber, source) {
-        const { selector } = this;
-        const subject = this.subjectFactory();
-        const subscription = selector(subject).subscribe(subscriber);
-        subscription.add(source.subscribe(subject));
-        return subscription;
-    }
-}
-//# sourceMappingURL=multicast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/multicast.js.map b/node_modules/rxjs/_esm2015/internal/operators/multicast.js.map
deleted file mode 100644
index 254c784..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/multicast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"multicast.js","sources":["../../../src/internal/operators/multicast.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyB,+BAA+B,EAAE,MAAM,qCAAqC,CAAC;AA6B7G,MAAM,UAAU,SAAS,CAAO,uBAAwD,EACxD,QAAmD;IACjF,OAAO,SAAS,yBAAyB,CAAC,MAAqB;QAC7D,IAAI,cAAgC,CAAC;QACrC,IAAI,OAAO,uBAAuB,KAAK,UAAU,EAAE;YACjD,cAAc,GAAqB,uBAAuB,CAAC;SAC5D;aAAM;YACL,cAAc,GAAG,SAAS,cAAc;gBACtC,OAAmB,uBAAuB,CAAC;YAC7C,CAAC,CAAC;SACH;QAED,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;YAClC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;SACrE;QAED,MAAM,WAAW,GAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;QAChF,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;QAC5B,WAAW,CAAC,cAAc,GAAG,cAAc,CAAC;QAE5C,OAAkC,WAAW,CAAC;IAChD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,iBAAiB;IAC5B,YAAoB,cAAgC,EAChC,QAAkD;QADlD,mBAAc,GAAd,cAAc,CAAkB;QAChC,aAAQ,GAAR,QAAQ,CAA0C;IACtE,CAAC;IACD,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC7D,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,OAAO,YAAY,CAAC;IACtB,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/observeOn.js b/node_modules/rxjs/_esm2015/internal/operators/observeOn.js
deleted file mode 100644
index 1efe6d4..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/observeOn.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { Notification } from '../Notification';
-export function observeOn(scheduler, delay = 0) {
-    return function observeOnOperatorFunction(source) {
-        return source.lift(new ObserveOnOperator(scheduler, delay));
-    };
-}
-export class ObserveOnOperator {
-    constructor(scheduler, delay = 0) {
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
-    }
-}
-export class ObserveOnSubscriber extends Subscriber {
-    constructor(destination, scheduler, delay = 0) {
-        super(destination);
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    static dispatch(arg) {
-        const { notification, destination } = arg;
-        notification.observe(destination);
-        this.unsubscribe();
-    }
-    scheduleMessage(notification) {
-        const destination = this.destination;
-        destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));
-    }
-    _next(value) {
-        this.scheduleMessage(Notification.createNext(value));
-    }
-    _error(err) {
-        this.scheduleMessage(Notification.createError(err));
-        this.unsubscribe();
-    }
-    _complete() {
-        this.scheduleMessage(Notification.createComplete());
-        this.unsubscribe();
-    }
-}
-export class ObserveOnMessage {
-    constructor(notification, destination) {
-        this.notification = notification;
-        this.destination = destination;
-    }
-}
-//# sourceMappingURL=observeOn.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/observeOn.js.map b/node_modules/rxjs/_esm2015/internal/operators/observeOn.js.map
deleted file mode 100644
index 65e6cdc..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/observeOn.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"observeOn.js","sources":["../../../src/internal/operators/observeOn.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAuD/C,MAAM,UAAU,SAAS,CAAI,SAAwB,EAAE,QAAgB,CAAC;IACtE,OAAO,SAAS,yBAAyB,CAAC,MAAqB;QAC7D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,iBAAiB;IAC5B,YAAoB,SAAwB,EAAU,QAAgB,CAAC;QAAnD,cAAS,GAAT,SAAS,CAAe;QAAU,UAAK,GAAL,KAAK,CAAY;IACvE,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3F,CAAC;CACF;AAOD,MAAM,OAAO,mBAAuB,SAAQ,UAAa;IAQvD,YAAY,WAA0B,EAClB,SAAwB,EACxB,QAAgB,CAAC;QACnC,KAAK,CAAC,WAAW,CAAC,CAAC;QAFD,cAAS,GAAT,SAAS,CAAe;QACxB,UAAK,GAAL,KAAK,CAAY;IAErC,CAAC;IAVD,MAAM,CAAC,QAAQ,CAA0C,GAAqB;QAC5E,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;QAC1C,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAQO,eAAe,CAAC,YAA+B;QACrD,MAAM,WAAW,GAAG,IAAI,CAAC,WAA2B,CAAC;QACrD,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CACrC,mBAAmB,CAAC,QAAQ,EAC5B,IAAI,CAAC,KAAK,EACV,IAAI,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CACrD,CAAC,CAAC;IACL,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAES,MAAM,CAAC,GAAQ;QACvB,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;CACF;AAED,MAAM,OAAO,gBAAgB;IAC3B,YAAmB,YAA+B,EAC/B,WAAiC;QADjC,iBAAY,GAAZ,YAAY,CAAmB;QAC/B,gBAAW,GAAX,WAAW,CAAsB;IACpD,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/onErrorResumeNext.js b/node_modules/rxjs/_esm2015/internal/operators/onErrorResumeNext.js
deleted file mode 100644
index 67a64f7..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/onErrorResumeNext.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import { from } from '../observable/from';
-import { isArray } from '../util/isArray';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function onErrorResumeNext(...nextSources) {
-    if (nextSources.length === 1 && isArray(nextSources[0])) {
-        nextSources = nextSources[0];
-    }
-    return (source) => source.lift(new OnErrorResumeNextOperator(nextSources));
-}
-export function onErrorResumeNextStatic(...nextSources) {
-    let source = null;
-    if (nextSources.length === 1 && isArray(nextSources[0])) {
-        nextSources = nextSources[0];
-    }
-    source = nextSources.shift();
-    return from(source, null).lift(new OnErrorResumeNextOperator(nextSources));
-}
-class OnErrorResumeNextOperator {
-    constructor(nextSources) {
-        this.nextSources = nextSources;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));
-    }
-}
-class OnErrorResumeNextSubscriber extends OuterSubscriber {
-    constructor(destination, nextSources) {
-        super(destination);
-        this.destination = destination;
-        this.nextSources = nextSources;
-    }
-    notifyError(error, innerSub) {
-        this.subscribeToNextSource();
-    }
-    notifyComplete(innerSub) {
-        this.subscribeToNextSource();
-    }
-    _error(err) {
-        this.subscribeToNextSource();
-        this.unsubscribe();
-    }
-    _complete() {
-        this.subscribeToNextSource();
-        this.unsubscribe();
-    }
-    subscribeToNextSource() {
-        const next = this.nextSources.shift();
-        if (!!next) {
-            const innerSubscriber = new InnerSubscriber(this, undefined, undefined);
-            const destination = this.destination;
-            destination.add(innerSubscriber);
-            const innerSubscription = subscribeToResult(this, next, undefined, undefined, innerSubscriber);
-            if (innerSubscription !== innerSubscriber) {
-                destination.add(innerSubscription);
-            }
-        }
-        else {
-            this.destination.complete();
-        }
-    }
-}
-//# sourceMappingURL=onErrorResumeNext.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/onErrorResumeNext.js.map b/node_modules/rxjs/_esm2015/internal/operators/onErrorResumeNext.js.map
deleted file mode 100644
index fe3cf7a..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/onErrorResumeNext.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"onErrorResumeNext.js","sources":["../../../src/internal/operators/onErrorResumeNext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAI1C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAoF9D,MAAM,UAAU,iBAAiB,CAAO,GAAG,WACwC;IACjF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;QACvD,WAAW,GAA2B,WAAW,CAAC,CAAC,CAAC,CAAC;KACtD;IAED,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAO,WAAW,CAAC,CAAC,CAAC;AAClG,CAAC;AAaD,MAAM,UAAU,uBAAuB,CAAO,GAAG,WAEhB;IAC/B,IAAI,MAAM,GAAyB,IAAI,CAAC;IAExC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;QACvD,WAAW,GAAgC,WAAW,CAAC,CAAC,CAAC,CAAC;KAC3D;IACD,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;IAE7B,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAO,WAAW,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,yBAAyB;IAC7B,YAAoB,WAAwC;QAAxC,gBAAW,GAAX,WAAW,CAA6B;IAC5D,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,2BAA2B,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACzF,CAAC;CACF;AAED,MAAM,2BAAkC,SAAQ,eAAqB;IACnE,YAAsB,WAA0B,EAC5B,WAAwC;QAC1D,KAAK,CAAC,WAAW,CAAC,CAAC;QAFC,gBAAW,GAAX,WAAW,CAAe;QAC5B,gBAAW,GAAX,WAAW,CAA6B;IAE5D,CAAC;IAED,WAAW,CAAC,KAAU,EAAE,QAAiC;QACvD,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAED,cAAc,CAAC,QAAiC;QAC9C,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAES,MAAM,CAAC,GAAQ;QACvB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAEO,qBAAqB;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,IAAI,EAAE;YACV,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACxE,MAAM,WAAW,GAAG,IAAI,CAAC,WAA2B,CAAC;YACrD,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACjC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;YAI/F,IAAI,iBAAiB,KAAK,eAAe,EAAE;gBACzC,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;aACpC;SACF;aAAM;YACL,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/pairwise.js b/node_modules/rxjs/_esm2015/internal/operators/pairwise.js
deleted file mode 100644
index 0013672..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/pairwise.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function pairwise() {
-    return (source) => source.lift(new PairwiseOperator());
-}
-class PairwiseOperator {
-    call(subscriber, source) {
-        return source.subscribe(new PairwiseSubscriber(subscriber));
-    }
-}
-class PairwiseSubscriber extends Subscriber {
-    constructor(destination) {
-        super(destination);
-        this.hasPrev = false;
-    }
-    _next(value) {
-        let pair;
-        if (this.hasPrev) {
-            pair = [this.prev, value];
-        }
-        else {
-            this.hasPrev = true;
-        }
-        this.prev = value;
-        if (pair) {
-            this.destination.next(pair);
-        }
-    }
-}
-//# sourceMappingURL=pairwise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/pairwise.js.map b/node_modules/rxjs/_esm2015/internal/operators/pairwise.js.map
deleted file mode 100644
index f587741..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/pairwise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pairwise.js","sources":["../../../src/internal/operators/pairwise.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA8C3C,MAAM,UAAU,QAAQ;IACtB,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,gBAAgB;IACpB,IAAI,CAAC,UAA8B,EAAE,MAAW;QAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9D,CAAC;CACF;AAOD,MAAM,kBAAsB,SAAQ,UAAa;IAI/C,YAAY,WAA+B;QACzC,KAAK,CAAC,WAAW,CAAC,CAAC;QAHb,YAAO,GAAY,KAAK,CAAC;IAIjC,CAAC;IAED,KAAK,CAAC,KAAQ;QACZ,IAAI,IAAwB,CAAC;QAE7B,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SAC3B;aAAM;YACL,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;SACrB;QAED,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAElB,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7B;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/partition.js b/node_modules/rxjs/_esm2015/internal/operators/partition.js
deleted file mode 100644
index 6ef7d98..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/partition.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import { not } from '../util/not';
-import { filter } from './filter';
-export function partition(predicate, thisArg) {
-    return (source) => [
-        filter(predicate, thisArg)(source),
-        filter(not(predicate, thisArg))(source)
-    ];
-}
-//# sourceMappingURL=partition.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/partition.js.map b/node_modules/rxjs/_esm2015/internal/operators/partition.js.map
deleted file mode 100644
index aa945f5..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/partition.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"partition.js","sources":["../../../src/internal/operators/partition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAoDlC,MAAM,UAAU,SAAS,CAAI,SAA+C,EAC/C,OAAa;IACxC,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC;QAChC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAQ,CAAC,CAAC,MAAM,CAAC;KACb,CAAC;AACtC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/pluck.js b/node_modules/rxjs/_esm2015/internal/operators/pluck.js
deleted file mode 100644
index 4fa3bb1..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/pluck.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { map } from './map';
-export function pluck(...properties) {
-    const length = properties.length;
-    if (length === 0) {
-        throw new Error('list of properties cannot be empty.');
-    }
-    return (source) => map(plucker(properties, length))(source);
-}
-function plucker(props, length) {
-    const mapper = (x) => {
-        let currentProp = x;
-        for (let i = 0; i < length; i++) {
-            const p = currentProp[props[i]];
-            if (typeof p !== 'undefined') {
-                currentProp = p;
-            }
-            else {
-                return undefined;
-            }
-        }
-        return currentProp;
-    };
-    return mapper;
-}
-//# sourceMappingURL=pluck.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/pluck.js.map b/node_modules/rxjs/_esm2015/internal/operators/pluck.js.map
deleted file mode 100644
index 9c47b49..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/pluck.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pluck.js","sources":["../../../src/internal/operators/pluck.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AA6C5B,MAAM,UAAU,KAAK,CAAO,GAAG,UAAoB;IACjD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IACjC,IAAI,MAAM,KAAK,CAAC,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;KACxD;IACD,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,MAAa,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,OAAO,CAAC,KAAe,EAAE,MAAc;IAC9C,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE;QAC3B,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YAC/B,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;gBAC5B,WAAW,GAAG,CAAC,CAAC;aACjB;iBAAM;gBACL,OAAO,SAAS,CAAC;aAClB;SACF;QACD,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/publish.js b/node_modules/rxjs/_esm2015/internal/operators/publish.js
deleted file mode 100644
index 416d7fb..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/publish.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import { Subject } from '../Subject';
-import { multicast } from './multicast';
-export function publish(selector) {
-    return selector ?
-        multicast(() => new Subject(), selector) :
-        multicast(new Subject());
-}
-//# sourceMappingURL=publish.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/publish.js.map b/node_modules/rxjs/_esm2015/internal/operators/publish.js.map
deleted file mode 100644
index 89d79b2..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/publish.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publish.js","sources":["../../../src/internal/operators/publish.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA4DxC,MAAM,UAAU,OAAO,CAAO,QAAiC;IAC7D,OAAO,QAAQ,CAAC,CAAC;QACf,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,EAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7C,SAAS,CAAC,IAAI,OAAO,EAAK,CAAC,CAAC;AAChC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/publishBehavior.js b/node_modules/rxjs/_esm2015/internal/operators/publishBehavior.js
deleted file mode 100644
index 090d696..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/publishBehavior.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { BehaviorSubject } from '../BehaviorSubject';
-import { multicast } from './multicast';
-export function publishBehavior(value) {
-    return (source) => multicast(new BehaviorSubject(value))(source);
-}
-//# sourceMappingURL=publishBehavior.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/publishBehavior.js.map b/node_modules/rxjs/_esm2015/internal/operators/publishBehavior.js.map
deleted file mode 100644
index 04805f1..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/publishBehavior.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishBehavior.js","sources":["../../../src/internal/operators/publishBehavior.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAUxC,MAAM,UAAU,eAAe,CAAI,KAAQ;IACzC,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,eAAe,CAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAA6B,CAAC;AACjH,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/publishLast.js b/node_modules/rxjs/_esm2015/internal/operators/publishLast.js
deleted file mode 100644
index 5d4ea44..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/publishLast.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { AsyncSubject } from '../AsyncSubject';
-import { multicast } from './multicast';
-export function publishLast() {
-    return (source) => multicast(new AsyncSubject())(source);
-}
-//# sourceMappingURL=publishLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/publishLast.js.map b/node_modules/rxjs/_esm2015/internal/operators/publishLast.js.map
deleted file mode 100644
index 120a3fd..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/publishLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishLast.js","sources":["../../../src/internal/operators/publishLast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA8DxC,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,YAAY,EAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7E,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/publishReplay.js b/node_modules/rxjs/_esm2015/internal/operators/publishReplay.js
deleted file mode 100644
index 9aca27f..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/publishReplay.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { ReplaySubject } from '../ReplaySubject';
-import { multicast } from './multicast';
-export function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {
-    if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {
-        scheduler = selectorOrScheduler;
-    }
-    const selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;
-    const subject = new ReplaySubject(bufferSize, windowTime, scheduler);
-    return (source) => multicast(() => subject, selector)(source);
-}
-//# sourceMappingURL=publishReplay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/publishReplay.js.map b/node_modules/rxjs/_esm2015/internal/operators/publishReplay.js.map
deleted file mode 100644
index d8a7ac7..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/publishReplay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishReplay.js","sources":["../../../src/internal/operators/publishReplay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AASxC,MAAM,UAAU,aAAa,CAAO,UAAmB,EACnB,UAAmB,EACnB,mBAA4D,EAC5D,SAAyB;IAE3D,IAAI,mBAAmB,IAAI,OAAO,mBAAmB,KAAK,UAAU,EAAE;QACpE,SAAS,GAAG,mBAAmB,CAAC;KACjC;IAED,MAAM,QAAQ,GAAG,OAAO,mBAAmB,KAAK,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,MAAM,OAAO,GAAG,IAAI,aAAa,CAAI,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAExE,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,MAAM,CAA6B,CAAC;AAC3G,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/race.js b/node_modules/rxjs/_esm2015/internal/operators/race.js
deleted file mode 100644
index faea6b1..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/race.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { isArray } from '../util/isArray';
-import { race as raceStatic } from '../observable/race';
-export function race(...observables) {
-    return function raceOperatorFunction(source) {
-        if (observables.length === 1 && isArray(observables[0])) {
-            observables = observables[0];
-        }
-        return source.lift.call(raceStatic(source, ...observables));
-    };
-}
-//# sourceMappingURL=race.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/race.js.map b/node_modules/rxjs/_esm2015/internal/operators/race.js.map
deleted file mode 100644
index ae477b9..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/race.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"race.js","sources":["../../../src/internal/operators/race.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAsBxD,MAAM,UAAU,IAAI,CAAI,GAAG,WAAgD;IACzE,OAAO,SAAS,oBAAoB,CAAC,MAAqB;QAGxD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;YACvD,WAAW,GAAG,WAAW,CAAC,CAAC,CAAoB,CAAC;SACjD;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,GAAI,WAA+B,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/reduce.js b/node_modules/rxjs/_esm2015/internal/operators/reduce.js
deleted file mode 100644
index ca12987..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/reduce.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import { scan } from './scan';
-import { takeLast } from './takeLast';
-import { defaultIfEmpty } from './defaultIfEmpty';
-import { pipe } from '../util/pipe';
-export function reduce(accumulator, seed) {
-    if (arguments.length >= 2) {
-        return function reduceOperatorFunctionWithSeed(source) {
-            return pipe(scan(accumulator, seed), takeLast(1), defaultIfEmpty(seed))(source);
-        };
-    }
-    return function reduceOperatorFunction(source) {
-        return pipe(scan((acc, value, index) => accumulator(acc, value, index + 1)), takeLast(1))(source);
-    };
-}
-//# sourceMappingURL=reduce.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/reduce.js.map b/node_modules/rxjs/_esm2015/internal/operators/reduce.js.map
deleted file mode 100644
index 1382053..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/reduce.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"reduce.js","sources":["../../../src/internal/operators/reduce.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AA2DpC,MAAM,UAAU,MAAM,CAAO,WAA4D,EAAE,IAAY;IAMrG,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACzB,OAAO,SAAS,8BAA8B,CAAC,MAAqB;YAClE,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAClF,CAAC,CAAC;KACH;IACD,OAAO,SAAS,sBAAsB,CAAC,MAAqB;QAC1D,OAAO,IAAI,CACT,IAAI,CAAW,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,EACzE,QAAQ,CAAC,CAAC,CAAC,CACZ,CAAC,MAAM,CAAC,CAAC;IACZ,CAAC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/refCount.js b/node_modules/rxjs/_esm2015/internal/operators/refCount.js
deleted file mode 100644
index 3de8d1e..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/refCount.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function refCount() {
-    return function refCountOperatorFunction(source) {
-        return source.lift(new RefCountOperator(source));
-    };
-}
-class RefCountOperator {
-    constructor(connectable) {
-        this.connectable = connectable;
-    }
-    call(subscriber, source) {
-        const { connectable } = this;
-        connectable._refCount++;
-        const refCounter = new RefCountSubscriber(subscriber, connectable);
-        const subscription = source.subscribe(refCounter);
-        if (!refCounter.closed) {
-            refCounter.connection = connectable.connect();
-        }
-        return subscription;
-    }
-}
-class RefCountSubscriber extends Subscriber {
-    constructor(destination, connectable) {
-        super(destination);
-        this.connectable = connectable;
-    }
-    _unsubscribe() {
-        const { connectable } = this;
-        if (!connectable) {
-            this.connection = null;
-            return;
-        }
-        this.connectable = null;
-        const refCount = connectable._refCount;
-        if (refCount <= 0) {
-            this.connection = null;
-            return;
-        }
-        connectable._refCount = refCount - 1;
-        if (refCount > 1) {
-            this.connection = null;
-            return;
-        }
-        const { connection } = this;
-        const sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    }
-}
-//# sourceMappingURL=refCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/refCount.js.map b/node_modules/rxjs/_esm2015/internal/operators/refCount.js.map
deleted file mode 100644
index 2bbfde9..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/refCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"refCount.js","sources":["../../../src/internal/operators/refCount.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA2D3C,MAAM,UAAU,QAAQ;IACtB,OAAO,SAAS,wBAAwB,CAAC,MAAgC;QACvE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,CAAgC,CAAC;AACnC,CAAC;AAED,MAAM,gBAAgB;IACpB,YAAoB,WAAqC;QAArC,gBAAW,GAAX,WAAW,CAA0B;IACzD,CAAC;IACD,IAAI,CAAC,UAAyB,EAAE,MAAW;QAEzC,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QACtB,WAAY,CAAC,SAAS,EAAE,CAAC;QAEhC,MAAM,UAAU,GAAG,IAAI,kBAAkB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAElD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACf,UAAW,CAAC,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;SACvD;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAED,MAAM,kBAAsB,SAAQ,UAAa;IAI/C,YAAY,WAA0B,EAClB,WAAqC;QACvD,KAAK,CAAC,WAAW,CAAC,CAAC;QADD,gBAAW,GAAX,WAAW,CAA0B;IAEzD,CAAC;IAES,YAAY;QAEpB,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO;SACR;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,MAAM,QAAQ,GAAU,WAAY,CAAC,SAAS,CAAC;QAC/C,IAAI,QAAQ,IAAI,CAAC,EAAE;YACjB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO;SACR;QAEM,WAAY,CAAC,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC7C,IAAI,QAAQ,GAAG,CAAC,EAAE;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO;SACR;QA0BD,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAC5B,MAAM,gBAAgB,GAAU,WAAY,CAAC,WAAW,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,gBAAgB,IAAI,CAAC,CAAC,UAAU,IAAI,gBAAgB,KAAK,UAAU,CAAC,EAAE;YACxE,gBAAgB,CAAC,WAAW,EAAE,CAAC;SAChC;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/repeat.js b/node_modules/rxjs/_esm2015/internal/operators/repeat.js
deleted file mode 100644
index 8d4788f..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/repeat.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { empty } from '../observable/empty';
-export function repeat(count = -1) {
-    return (source) => {
-        if (count === 0) {
-            return empty();
-        }
-        else if (count < 0) {
-            return source.lift(new RepeatOperator(-1, source));
-        }
-        else {
-            return source.lift(new RepeatOperator(count - 1, source));
-        }
-    };
-}
-class RepeatOperator {
-    constructor(count, source) {
-        this.count = count;
-        this.source = source;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));
-    }
-}
-class RepeatSubscriber extends Subscriber {
-    constructor(destination, count, source) {
-        super(destination);
-        this.count = count;
-        this.source = source;
-    }
-    complete() {
-        if (!this.isStopped) {
-            const { source, count } = this;
-            if (count === 0) {
-                return super.complete();
-            }
-            else if (count > -1) {
-                this.count = count - 1;
-            }
-            source.subscribe(this._unsubscribeAndRecycle());
-        }
-    }
-}
-//# sourceMappingURL=repeat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/repeat.js.map b/node_modules/rxjs/_esm2015/internal/operators/repeat.js.map
deleted file mode 100644
index 10d378a..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/repeat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"repeat.js","sources":["../../../src/internal/operators/repeat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AA2D5C,MAAM,UAAU,MAAM,CAAI,QAAgB,CAAC,CAAC;IAC1C,OAAO,CAAC,MAAqB,EAAE,EAAE;QAC/B,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,OAAO,KAAK,EAAE,CAAC;SAChB;aAAM,IAAI,KAAK,GAAG,CAAC,EAAE;YACpB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;SACpD;aAAM;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;SAC3D;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,cAAc;IAClB,YAAoB,KAAa,EACb,MAAqB;QADrB,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAe;IACzC,CAAC;IACD,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACrF,CAAC;CACF;AAOD,MAAM,gBAAoB,SAAQ,UAAa;IAC7C,YAAY,WAA4B,EACpB,KAAa,EACb,MAAqB;QACvC,KAAK,CAAC,WAAW,CAAC,CAAC;QAFD,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAe;IAEzC,CAAC;IACD,QAAQ;QACN,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;YAC/B,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;aACzB;iBAAM,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;aACxB;YACD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;SACjD;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/repeatWhen.js b/node_modules/rxjs/_esm2015/internal/operators/repeatWhen.js
deleted file mode 100644
index fea24e2..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/repeatWhen.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import { Subject } from '../Subject';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function repeatWhen(notifier) {
-    return (source) => source.lift(new RepeatWhenOperator(notifier));
-}
-class RepeatWhenOperator {
-    constructor(notifier) {
-        this.notifier = notifier;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));
-    }
-}
-class RepeatWhenSubscriber extends OuterSubscriber {
-    constructor(destination, notifier, source) {
-        super(destination);
-        this.notifier = notifier;
-        this.source = source;
-        this.sourceIsBeingSubscribedTo = true;
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.sourceIsBeingSubscribedTo = true;
-        this.source.subscribe(this);
-    }
-    notifyComplete(innerSub) {
-        if (this.sourceIsBeingSubscribedTo === false) {
-            return super.complete();
-        }
-    }
-    complete() {
-        this.sourceIsBeingSubscribedTo = false;
-        if (!this.isStopped) {
-            if (!this.retries) {
-                this.subscribeToRetries();
-            }
-            if (!this.retriesSubscription || this.retriesSubscription.closed) {
-                return super.complete();
-            }
-            this._unsubscribeAndRecycle();
-            this.notifications.next();
-        }
-    }
-    _unsubscribe() {
-        const { notifications, retriesSubscription } = this;
-        if (notifications) {
-            notifications.unsubscribe();
-            this.notifications = null;
-        }
-        if (retriesSubscription) {
-            retriesSubscription.unsubscribe();
-            this.retriesSubscription = null;
-        }
-        this.retries = null;
-    }
-    _unsubscribeAndRecycle() {
-        const { _unsubscribe } = this;
-        this._unsubscribe = null;
-        super._unsubscribeAndRecycle();
-        this._unsubscribe = _unsubscribe;
-        return this;
-    }
-    subscribeToRetries() {
-        this.notifications = new Subject();
-        let retries;
-        try {
-            const { notifier } = this;
-            retries = notifier(this.notifications);
-        }
-        catch (e) {
-            return super.complete();
-        }
-        this.retries = retries;
-        this.retriesSubscription = subscribeToResult(this, retries);
-    }
-}
-//# sourceMappingURL=repeatWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/repeatWhen.js.map b/node_modules/rxjs/_esm2015/internal/operators/repeatWhen.js.map
deleted file mode 100644
index a474619..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/repeatWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"repeatWhen.js","sources":["../../../src/internal/operators/repeatWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/retry.js b/node_modules/rxjs/_esm2015/internal/operators/retry.js
deleted file mode 100644
index e3036c2..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/retry.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function retry(count = -1) {
-    return (source) => source.lift(new RetryOperator(count, source));
-}
-class RetryOperator {
-    constructor(count, source) {
-        this.count = count;
-        this.source = source;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));
-    }
-}
-class RetrySubscriber extends Subscriber {
-    constructor(destination, count, source) {
-        super(destination);
-        this.count = count;
-        this.source = source;
-    }
-    error(err) {
-        if (!this.isStopped) {
-            const { source, count } = this;
-            if (count === 0) {
-                return super.error(err);
-            }
-            else if (count > -1) {
-                this.count = count - 1;
-            }
-            source.subscribe(this._unsubscribeAndRecycle());
-        }
-    }
-}
-//# sourceMappingURL=retry.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/retry.js.map b/node_modules/rxjs/_esm2015/internal/operators/retry.js.map
deleted file mode 100644
index e681649..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/retry.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"retry.js","sources":["../../../src/internal/operators/retry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAmD3C,MAAM,UAAU,KAAK,CAAI,QAAgB,CAAC,CAAC;IACzC,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,aAAa;IACjB,YAAoB,KAAa,EACb,MAAqB;QADrB,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAe;IACzC,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpF,CAAC;CACF;AAOD,MAAM,eAAmB,SAAQ,UAAa;IAC5C,YAAY,WAA4B,EACpB,KAAa,EACb,MAAqB;QACvC,KAAK,CAAC,WAAW,CAAC,CAAC;QAFD,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAe;IAEzC,CAAC;IACD,KAAK,CAAC,GAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;YAC/B,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACzB;iBAAM,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;aACxB;YACD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;SACjD;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/retryWhen.js b/node_modules/rxjs/_esm2015/internal/operators/retryWhen.js
deleted file mode 100644
index 87fef62..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/retryWhen.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import { Subject } from '../Subject';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function retryWhen(notifier) {
-    return (source) => source.lift(new RetryWhenOperator(notifier, source));
-}
-class RetryWhenOperator {
-    constructor(notifier, source) {
-        this.notifier = notifier;
-        this.source = source;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));
-    }
-}
-class RetryWhenSubscriber extends OuterSubscriber {
-    constructor(destination, notifier, source) {
-        super(destination);
-        this.notifier = notifier;
-        this.source = source;
-    }
-    error(err) {
-        if (!this.isStopped) {
-            let errors = this.errors;
-            let retries = this.retries;
-            let retriesSubscription = this.retriesSubscription;
-            if (!retries) {
-                errors = new Subject();
-                try {
-                    const { notifier } = this;
-                    retries = notifier(errors);
-                }
-                catch (e) {
-                    return super.error(e);
-                }
-                retriesSubscription = subscribeToResult(this, retries);
-            }
-            else {
-                this.errors = null;
-                this.retriesSubscription = null;
-            }
-            this._unsubscribeAndRecycle();
-            this.errors = errors;
-            this.retries = retries;
-            this.retriesSubscription = retriesSubscription;
-            errors.next(err);
-        }
-    }
-    _unsubscribe() {
-        const { errors, retriesSubscription } = this;
-        if (errors) {
-            errors.unsubscribe();
-            this.errors = null;
-        }
-        if (retriesSubscription) {
-            retriesSubscription.unsubscribe();
-            this.retriesSubscription = null;
-        }
-        this.retries = null;
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        const { _unsubscribe } = this;
-        this._unsubscribe = null;
-        this._unsubscribeAndRecycle();
-        this._unsubscribe = _unsubscribe;
-        this.source.subscribe(this);
-    }
-}
-//# sourceMappingURL=retryWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/retryWhen.js.map b/node_modules/rxjs/_esm2015/internal/operators/retryWhen.js.map
deleted file mode 100644
index 7756cf7..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/retryWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"retryWhen.js","sources":["../../../src/internal/operators/retryWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/sample.js b/node_modules/rxjs/_esm2015/internal/operators/sample.js
deleted file mode 100644
index 6c2d33b..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/sample.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function sample(notifier) {
-    return (source) => source.lift(new SampleOperator(notifier));
-}
-class SampleOperator {
-    constructor(notifier) {
-        this.notifier = notifier;
-    }
-    call(subscriber, source) {
-        const sampleSubscriber = new SampleSubscriber(subscriber);
-        const subscription = source.subscribe(sampleSubscriber);
-        subscription.add(subscribeToResult(sampleSubscriber, this.notifier));
-        return subscription;
-    }
-}
-class SampleSubscriber extends OuterSubscriber {
-    constructor() {
-        super(...arguments);
-        this.hasValue = false;
-    }
-    _next(value) {
-        this.value = value;
-        this.hasValue = true;
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.emitValue();
-    }
-    notifyComplete() {
-        this.emitValue();
-    }
-    emitValue() {
-        if (this.hasValue) {
-            this.hasValue = false;
-            this.destination.next(this.value);
-        }
-    }
-}
-//# sourceMappingURL=sample.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/sample.js.map b/node_modules/rxjs/_esm2015/internal/operators/sample.js.map
deleted file mode 100644
index 43bdf88..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/sample.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sample.js","sources":["../../../src/internal/operators/sample.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA4C9D,MAAM,UAAU,MAAM,CAAI,QAAyB;IACjD,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,cAAc;IAClB,YAAoB,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAC7C,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxD,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrE,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAOD,MAAM,gBAAuB,SAAQ,eAAqB;IAA1D;;QAEU,aAAQ,GAAY,KAAK,CAAC;IAuBpC,CAAC;IArBW,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,UAAU,CAAC,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,SAAS;QACP,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACnC;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/sampleTime.js b/node_modules/rxjs/_esm2015/internal/operators/sampleTime.js
deleted file mode 100644
index a3b08c2..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/sampleTime.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { async } from '../scheduler/async';
-export function sampleTime(period, scheduler = async) {
-    return (source) => source.lift(new SampleTimeOperator(period, scheduler));
-}
-class SampleTimeOperator {
-    constructor(period, scheduler) {
-        this.period = period;
-        this.scheduler = scheduler;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));
-    }
-}
-class SampleTimeSubscriber extends Subscriber {
-    constructor(destination, period, scheduler) {
-        super(destination);
-        this.period = period;
-        this.scheduler = scheduler;
-        this.hasValue = false;
-        this.add(scheduler.schedule(dispatchNotification, period, { subscriber: this, period }));
-    }
-    _next(value) {
-        this.lastValue = value;
-        this.hasValue = true;
-    }
-    notifyNext() {
-        if (this.hasValue) {
-            this.hasValue = false;
-            this.destination.next(this.lastValue);
-        }
-    }
-}
-function dispatchNotification(state) {
-    let { subscriber, period } = state;
-    subscriber.notifyNext();
-    this.schedule(state, period);
-}
-//# sourceMappingURL=sampleTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/sampleTime.js.map b/node_modules/rxjs/_esm2015/internal/operators/sampleTime.js.map
deleted file mode 100644
index 4b202a3..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/sampleTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sampleTime.js","sources":["../../../src/internal/operators/sampleTime.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA6C3C,MAAM,UAAU,UAAU,CAAI,MAAc,EAAE,YAA2B,KAAK;IAC5E,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,kBAAkB;IACtB,YAAoB,MAAc,EACd,SAAwB;QADxB,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAAe;IAC5C,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7F,CAAC;CACF;AAOD,MAAM,oBAAwB,SAAQ,UAAa;IAIjD,YAAY,WAA0B,EAClB,MAAc,EACd,SAAwB;QAC1C,KAAK,CAAC,WAAW,CAAC,CAAC;QAFD,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAAe;QAJ5C,aAAQ,GAAY,KAAK,CAAC;QAMxB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACvC;IACH,CAAC;CACF;AAED,SAAS,oBAAoB,CAAgC,KAAU;IACrE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACnC,UAAU,CAAC,UAAU,EAAE,CAAC;IACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/scan.js b/node_modules/rxjs/_esm2015/internal/operators/scan.js
deleted file mode 100644
index 44cfc17..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/scan.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function scan(accumulator, seed) {
-    let hasSeed = false;
-    if (arguments.length >= 2) {
-        hasSeed = true;
-    }
-    return function scanOperatorFunction(source) {
-        return source.lift(new ScanOperator(accumulator, seed, hasSeed));
-    };
-}
-class ScanOperator {
-    constructor(accumulator, seed, hasSeed = false) {
-        this.accumulator = accumulator;
-        this.seed = seed;
-        this.hasSeed = hasSeed;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));
-    }
-}
-class ScanSubscriber extends Subscriber {
-    constructor(destination, accumulator, _seed, hasSeed) {
-        super(destination);
-        this.accumulator = accumulator;
-        this._seed = _seed;
-        this.hasSeed = hasSeed;
-        this.index = 0;
-    }
-    get seed() {
-        return this._seed;
-    }
-    set seed(value) {
-        this.hasSeed = true;
-        this._seed = value;
-    }
-    _next(value) {
-        if (!this.hasSeed) {
-            this.seed = value;
-            this.destination.next(value);
-        }
-        else {
-            return this._tryNext(value);
-        }
-    }
-    _tryNext(value) {
-        const index = this.index++;
-        let result;
-        try {
-            result = this.accumulator(this.seed, value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-        this.seed = result;
-        this.destination.next(result);
-    }
-}
-//# sourceMappingURL=scan.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/scan.js.map b/node_modules/rxjs/_esm2015/internal/operators/scan.js.map
deleted file mode 100644
index b93b4db..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/scan.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scan.js","sources":["../../../src/internal/operators/scan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAoD3C,MAAM,UAAU,IAAI,CAAO,WAAmD,EAAE,IAAY;IAC1F,IAAI,OAAO,GAAG,KAAK,CAAC;IAMpB,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACzB,OAAO,GAAG,IAAI,CAAC;KAChB;IAED,OAAO,SAAS,oBAAoB,CAAC,MAAqB;QACxD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,YAAY;IAChB,YAAoB,WAAmD,EAAU,IAAY,EAAU,UAAmB,KAAK;QAA3G,gBAAW,GAAX,WAAW,CAAwC;QAAU,SAAI,GAAJ,IAAI,CAAQ;QAAU,YAAO,GAAP,OAAO,CAAiB;IAAG,CAAC;IAEnI,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrG,CAAC;CACF;AAOD,MAAM,cAAqB,SAAQ,UAAa;IAY9C,YAAY,WAA0B,EAAU,WAAmD,EAAU,KAAY,EACrG,OAAgB;QAClC,KAAK,CAAC,WAAW,CAAC,CAAC;QAF2B,gBAAW,GAAX,WAAW,CAAwC;QAAU,UAAK,GAAL,KAAK,CAAO;QACrG,YAAO,GAAP,OAAO,CAAS;QAZ5B,UAAK,GAAW,CAAC,CAAC;IAc1B,CAAC;IAZD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,IAAI,CAAC,KAAY;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAOS,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;aAAM;YACL,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAC7B;IACH,CAAC;IAEO,QAAQ,CAAC,KAAQ;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,MAAW,CAAC;QAChB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,WAAW,CAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SACvD;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;QACD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/sequenceEqual.js b/node_modules/rxjs/_esm2015/internal/operators/sequenceEqual.js
deleted file mode 100644
index a2a5e6a..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/sequenceEqual.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function sequenceEqual(compareTo, comparator) {
-    return (source) => source.lift(new SequenceEqualOperator(compareTo, comparator));
-}
-export class SequenceEqualOperator {
-    constructor(compareTo, comparator) {
-        this.compareTo = compareTo;
-        this.comparator = comparator;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator));
-    }
-}
-export class SequenceEqualSubscriber extends Subscriber {
-    constructor(destination, compareTo, comparator) {
-        super(destination);
-        this.compareTo = compareTo;
-        this.comparator = comparator;
-        this._a = [];
-        this._b = [];
-        this._oneComplete = false;
-        this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, this)));
-    }
-    _next(value) {
-        if (this._oneComplete && this._b.length === 0) {
-            this.emit(false);
-        }
-        else {
-            this._a.push(value);
-            this.checkValues();
-        }
-    }
-    _complete() {
-        if (this._oneComplete) {
-            this.emit(this._a.length === 0 && this._b.length === 0);
-        }
-        else {
-            this._oneComplete = true;
-        }
-        this.unsubscribe();
-    }
-    checkValues() {
-        const { _a, _b, comparator } = this;
-        while (_a.length > 0 && _b.length > 0) {
-            let a = _a.shift();
-            let b = _b.shift();
-            let areEqual = false;
-            try {
-                areEqual = comparator ? comparator(a, b) : a === b;
-            }
-            catch (e) {
-                this.destination.error(e);
-            }
-            if (!areEqual) {
-                this.emit(false);
-            }
-        }
-    }
-    emit(value) {
-        const { destination } = this;
-        destination.next(value);
-        destination.complete();
-    }
-    nextB(value) {
-        if (this._oneComplete && this._a.length === 0) {
-            this.emit(false);
-        }
-        else {
-            this._b.push(value);
-            this.checkValues();
-        }
-    }
-    completeB() {
-        if (this._oneComplete) {
-            this.emit(this._a.length === 0 && this._b.length === 0);
-        }
-        else {
-            this._oneComplete = true;
-        }
-    }
-}
-class SequenceEqualCompareToSubscriber extends Subscriber {
-    constructor(destination, parent) {
-        super(destination);
-        this.parent = parent;
-    }
-    _next(value) {
-        this.parent.nextB(value);
-    }
-    _error(err) {
-        this.parent.error(err);
-        this.unsubscribe();
-    }
-    _complete() {
-        this.parent.completeB();
-        this.unsubscribe();
-    }
-}
-//# sourceMappingURL=sequenceEqual.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/sequenceEqual.js.map b/node_modules/rxjs/_esm2015/internal/operators/sequenceEqual.js.map
deleted file mode 100644
index 2122eb4..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/sequenceEqual.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sequenceEqual.js","sources":["../../../src/internal/operators/sequenceEqual.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/share.js b/node_modules/rxjs/_esm2015/internal/operators/share.js
deleted file mode 100644
index bc2c953..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/share.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import { multicast } from './multicast';
-import { refCount } from './refCount';
-import { Subject } from '../Subject';
-function shareSubjectFactory() {
-    return new Subject();
-}
-export function share() {
-    return (source) => refCount()(multicast(shareSubjectFactory)(source));
-}
-//# sourceMappingURL=share.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/share.js.map b/node_modules/rxjs/_esm2015/internal/operators/share.js.map
deleted file mode 100644
index 904fa87..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/share.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"share.js","sources":["../../../src/internal/operators/share.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAIrC,SAAS,mBAAmB;IAC1B,OAAO,IAAI,OAAO,EAAE,CAAC;AACvB,CAAC;AAcD,MAAM,UAAU,KAAK;IACnB,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAkB,CAAC;AACxG,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/shareReplay.js b/node_modules/rxjs/_esm2015/internal/operators/shareReplay.js
deleted file mode 100644
index c532954..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/shareReplay.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import { ReplaySubject } from '../ReplaySubject';
-export function shareReplay(configOrBufferSize, windowTime, scheduler) {
-    let config;
-    if (configOrBufferSize && typeof configOrBufferSize === 'object') {
-        config = configOrBufferSize;
-    }
-    else {
-        config = {
-            bufferSize: configOrBufferSize,
-            windowTime,
-            refCount: false,
-            scheduler
-        };
-    }
-    return (source) => source.lift(shareReplayOperator(config));
-}
-function shareReplayOperator({ bufferSize = Number.POSITIVE_INFINITY, windowTime = Number.POSITIVE_INFINITY, refCount: useRefCount, scheduler }) {
-    let subject;
-    let refCount = 0;
-    let subscription;
-    let hasError = false;
-    let isComplete = false;
-    return function shareReplayOperation(source) {
-        refCount++;
-        if (!subject || hasError) {
-            hasError = false;
-            subject = new ReplaySubject(bufferSize, windowTime, scheduler);
-            subscription = source.subscribe({
-                next(value) { subject.next(value); },
-                error(err) {
-                    hasError = true;
-                    subject.error(err);
-                },
-                complete() {
-                    isComplete = true;
-                    subscription = undefined;
-                    subject.complete();
-                },
-            });
-        }
-        const innerSub = subject.subscribe(this);
-        this.add(() => {
-            refCount--;
-            innerSub.unsubscribe();
-            if (subscription && !isComplete && useRefCount && refCount === 0) {
-                subscription.unsubscribe();
-                subscription = undefined;
-                subject = undefined;
-            }
-        });
-    };
-}
-//# sourceMappingURL=shareReplay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/shareReplay.js.map b/node_modules/rxjs/_esm2015/internal/operators/shareReplay.js.map
deleted file mode 100644
index 251caa9..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/shareReplay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"shareReplay.js","sources":["../../../src/internal/operators/shareReplay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA2DjD,MAAM,UAAU,WAAW,CACzB,kBAA+C,EAC/C,UAAmB,EACnB,SAAyB;IAEzB,IAAI,MAAyB,CAAC;IAC9B,IAAI,kBAAkB,IAAI,OAAO,kBAAkB,KAAK,QAAQ,EAAE;QAChE,MAAM,GAAG,kBAAuC,CAAC;KAClD;SAAM;QACL,MAAM,GAAG;YACP,UAAU,EAAE,kBAAwC;YACpD,UAAU;YACV,QAAQ,EAAE,KAAK;YACf,SAAS;SACV,CAAC;KACH;IACD,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,mBAAmB,CAAI,EAC9B,UAAU,GAAG,MAAM,CAAC,iBAAiB,EACrC,UAAU,GAAG,MAAM,CAAC,iBAAiB,EACrC,QAAQ,EAAE,WAAW,EACrB,SAAS,EACS;IAClB,IAAI,OAAqC,CAAC;IAC1C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,YAAsC,CAAC;IAC3C,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,OAAO,SAAS,oBAAoB,CAAsB,MAAqB;QAC7E,QAAQ,EAAE,CAAC;QACX,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE;YACxB,QAAQ,GAAG,KAAK,CAAC;YACjB,OAAO,GAAG,IAAI,aAAa,CAAI,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;YAClE,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC;gBAC9B,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACpC,KAAK,CAAC,GAAG;oBACP,QAAQ,GAAG,IAAI,CAAC;oBAChB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,QAAQ;oBACN,UAAU,GAAG,IAAI,CAAC;oBAClB,YAAY,GAAG,SAAS,CAAC;oBACzB,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,CAAC;aACF,CAAC,CAAC;SACJ;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;YACZ,QAAQ,EAAE,CAAC;YACX,QAAQ,CAAC,WAAW,EAAE,CAAC;YACvB,IAAI,YAAY,IAAI,CAAC,UAAU,IAAI,WAAW,IAAI,QAAQ,KAAK,CAAC,EAAE;gBAChE,YAAY,CAAC,WAAW,EAAE,CAAC;gBAC3B,YAAY,GAAG,SAAS,CAAC;gBACzB,OAAO,GAAG,SAAS,CAAC;aACrB;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/single.js b/node_modules/rxjs/_esm2015/internal/operators/single.js
deleted file mode 100644
index 5839ba6..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/single.js
+++ /dev/null
@@ -1,62 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { EmptyError } from '../util/EmptyError';
-export function single(predicate) {
-    return (source) => source.lift(new SingleOperator(predicate, source));
-}
-class SingleOperator {
-    constructor(predicate, source) {
-        this.predicate = predicate;
-        this.source = source;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));
-    }
-}
-class SingleSubscriber extends Subscriber {
-    constructor(destination, predicate, source) {
-        super(destination);
-        this.predicate = predicate;
-        this.source = source;
-        this.seenValue = false;
-        this.index = 0;
-    }
-    applySingleValue(value) {
-        if (this.seenValue) {
-            this.destination.error('Sequence contains more than one element');
-        }
-        else {
-            this.seenValue = true;
-            this.singleValue = value;
-        }
-    }
-    _next(value) {
-        const index = this.index++;
-        if (this.predicate) {
-            this.tryNext(value, index);
-        }
-        else {
-            this.applySingleValue(value);
-        }
-    }
-    tryNext(value, index) {
-        try {
-            if (this.predicate(value, index, this.source)) {
-                this.applySingleValue(value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    }
-    _complete() {
-        const destination = this.destination;
-        if (this.index > 0) {
-            destination.next(this.seenValue ? this.singleValue : undefined);
-            destination.complete();
-        }
-        else {
-            destination.error(new EmptyError);
-        }
-    }
-}
-//# sourceMappingURL=single.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/single.js.map b/node_modules/rxjs/_esm2015/internal/operators/single.js.map
deleted file mode 100644
index b7db2d9..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/single.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"single.js","sources":["../../../src/internal/operators/single.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAkDhD,MAAM,UAAU,MAAM,CAAI,SAAuE;IAC/F,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,cAAc;IAClB,YAAoB,SAAuE,EACvE,MAAsB;QADtB,cAAS,GAAT,SAAS,CAA8D;QACvE,WAAM,GAAN,MAAM,CAAgB;IAC1C,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACzF,CAAC;CACF;AAOD,MAAM,gBAAoB,SAAQ,UAAa;IAK7C,YAAY,WAAwB,EAChB,SAAuE,EACvE,MAAsB;QACxC,KAAK,CAAC,WAAW,CAAC,CAAC;QAFD,cAAS,GAAT,SAAS,CAA8D;QACvE,WAAM,GAAN,MAAM,CAAgB;QANlC,cAAS,GAAY,KAAK,CAAC;QAE3B,UAAK,GAAW,CAAC,CAAC;IAM1B,CAAC;IAEO,gBAAgB,CAAC,KAAQ;QAC/B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;SACnE;aAAM;YACL,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;SAC1B;IACH,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAC5B;aAAM;YACL,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IAEO,OAAO,CAAC,KAAQ,EAAE,KAAa;QACrC,IAAI;YACF,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;gBAC7C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;aAC9B;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;IACH,CAAC;IAES,SAAS;QACjB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAErC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;YAClB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAChE,WAAW,CAAC,QAAQ,EAAE,CAAC;SACxB;aAAM;YACL,WAAW,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC;SACnC;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/skip.js b/node_modules/rxjs/_esm2015/internal/operators/skip.js
deleted file mode 100644
index 5fa27cd..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/skip.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function skip(count) {
-    return (source) => source.lift(new SkipOperator(count));
-}
-class SkipOperator {
-    constructor(total) {
-        this.total = total;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new SkipSubscriber(subscriber, this.total));
-    }
-}
-class SkipSubscriber extends Subscriber {
-    constructor(destination, total) {
-        super(destination);
-        this.total = total;
-        this.count = 0;
-    }
-    _next(x) {
-        if (++this.count > this.total) {
-            this.destination.next(x);
-        }
-    }
-}
-//# sourceMappingURL=skip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/skip.js.map b/node_modules/rxjs/_esm2015/internal/operators/skip.js.map
deleted file mode 100644
index 82e71ec..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/skip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skip.js","sources":["../../../src/internal/operators/skip.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAe3C,MAAM,UAAU,IAAI,CAAI,KAAa;IACnC,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,YAAY;IAChB,YAAoB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IACjC,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;CACF;AAOD,MAAM,cAAkB,SAAQ,UAAa;IAG3C,YAAY,WAA0B,EAAU,KAAa;QAC3D,KAAK,CAAC,WAAW,CAAC,CAAC;QAD2B,UAAK,GAAL,KAAK,CAAQ;QAF7D,UAAK,GAAW,CAAC,CAAC;IAIlB,CAAC;IAES,KAAK,CAAC,CAAI;QAClB,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;YAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC1B;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/skipLast.js b/node_modules/rxjs/_esm2015/internal/operators/skipLast.js
deleted file mode 100644
index f6de47e..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/skipLast.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
-export function skipLast(count) {
-    return (source) => source.lift(new SkipLastOperator(count));
-}
-class SkipLastOperator {
-    constructor(_skipCount) {
-        this._skipCount = _skipCount;
-        if (this._skipCount < 0) {
-            throw new ArgumentOutOfRangeError;
-        }
-    }
-    call(subscriber, source) {
-        if (this._skipCount === 0) {
-            return source.subscribe(new Subscriber(subscriber));
-        }
-        else {
-            return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount));
-        }
-    }
-}
-class SkipLastSubscriber extends Subscriber {
-    constructor(destination, _skipCount) {
-        super(destination);
-        this._skipCount = _skipCount;
-        this._count = 0;
-        this._ring = new Array(_skipCount);
-    }
-    _next(value) {
-        const skipCount = this._skipCount;
-        const count = this._count++;
-        if (count < skipCount) {
-            this._ring[count] = value;
-        }
-        else {
-            const currentIndex = count % skipCount;
-            const ring = this._ring;
-            const oldValue = ring[currentIndex];
-            ring[currentIndex] = value;
-            this.destination.next(oldValue);
-        }
-    }
-}
-//# sourceMappingURL=skipLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/skipLast.js.map b/node_modules/rxjs/_esm2015/internal/operators/skipLast.js.map
deleted file mode 100644
index 7654c0f..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/skipLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipLast.js","sources":["../../../src/internal/operators/skipLast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AA0C1E,MAAM,UAAU,QAAQ,CAAI,KAAa;IACvC,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,gBAAgB;IACpB,YAAoB,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;QACpC,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE;YACvB,MAAM,IAAI,uBAAuB,CAAC;SACnC;IACH,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;YAGzB,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;SACrD;aAAM;YACL,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;SAC9E;IACH,CAAC;CACF;AAOD,MAAM,kBAAsB,SAAQ,UAAa;IAI/C,YAAY,WAA0B,EAAU,UAAkB;QAChE,KAAK,CAAC,WAAW,CAAC,CAAC;QAD2B,eAAU,GAAV,UAAU,CAAQ;QAF1D,WAAM,GAAW,CAAC,CAAC;QAIzB,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAI,UAAU,CAAC,CAAC;IACxC,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAE5B,IAAI,KAAK,GAAG,SAAS,EAAE;YACrB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;SAC3B;aAAM;YACL,MAAM,YAAY,GAAG,KAAK,GAAG,SAAS,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;YAEpC,IAAI,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACjC;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/skipUntil.js b/node_modules/rxjs/_esm2015/internal/operators/skipUntil.js
deleted file mode 100644
index 4909c5d..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/skipUntil.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function skipUntil(notifier) {
-    return (source) => source.lift(new SkipUntilOperator(notifier));
-}
-class SkipUntilOperator {
-    constructor(notifier) {
-        this.notifier = notifier;
-    }
-    call(destination, source) {
-        return source.subscribe(new SkipUntilSubscriber(destination, this.notifier));
-    }
-}
-class SkipUntilSubscriber extends OuterSubscriber {
-    constructor(destination, notifier) {
-        super(destination);
-        this.hasValue = false;
-        const innerSubscriber = new InnerSubscriber(this, undefined, undefined);
-        this.add(innerSubscriber);
-        this.innerSubscription = innerSubscriber;
-        const innerSubscription = subscribeToResult(this, notifier, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            this.add(innerSubscription);
-            this.innerSubscription = innerSubscription;
-        }
-    }
-    _next(value) {
-        if (this.hasValue) {
-            super._next(value);
-        }
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.hasValue = true;
-        if (this.innerSubscription) {
-            this.innerSubscription.unsubscribe();
-        }
-    }
-    notifyComplete() {
-    }
-}
-//# sourceMappingURL=skipUntil.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/skipUntil.js.map b/node_modules/rxjs/_esm2015/internal/operators/skipUntil.js.map
deleted file mode 100644
index d8ce3ce..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/skipUntil.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipUntil.js","sources":["../../../src/internal/operators/skipUntil.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA2C9D,MAAM,UAAU,SAAS,CAAI,QAAyB;IACpD,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,iBAAiB;IACrB,YAAoB,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAC7C,CAAC;IAED,IAAI,CAAC,WAA0B,EAAE,MAAW;QAC1C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/E,CAAC;CACF;AAOD,MAAM,mBAA0B,SAAQ,eAAqB;IAK3D,YAAY,WAA0B,EAAE,QAA8B;QACpE,KAAK,CAAC,WAAW,CAAC,CAAC;QAJb,aAAQ,GAAY,KAAK,CAAC;QAKhC,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC1B,IAAI,CAAC,iBAAiB,GAAG,eAAe,CAAC;QACzC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAInG,IAAI,iBAAiB,KAAK,eAAe,EAAE;YACzC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC5B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;SAC5C;IACH,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACpB;IACH,CAAC;IAED,UAAU,CAAC,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC;SACtC;IACH,CAAC;IAED,cAAc;IAEd,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/skipWhile.js b/node_modules/rxjs/_esm2015/internal/operators/skipWhile.js
deleted file mode 100644
index a1212bc..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/skipWhile.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function skipWhile(predicate) {
-    return (source) => source.lift(new SkipWhileOperator(predicate));
-}
-class SkipWhileOperator {
-    constructor(predicate) {
-        this.predicate = predicate;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));
-    }
-}
-class SkipWhileSubscriber extends Subscriber {
-    constructor(destination, predicate) {
-        super(destination);
-        this.predicate = predicate;
-        this.skipping = true;
-        this.index = 0;
-    }
-    _next(value) {
-        const destination = this.destination;
-        if (this.skipping) {
-            this.tryCallPredicate(value);
-        }
-        if (!this.skipping) {
-            destination.next(value);
-        }
-    }
-    tryCallPredicate(value) {
-        try {
-            const result = this.predicate(value, this.index++);
-            this.skipping = Boolean(result);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    }
-}
-//# sourceMappingURL=skipWhile.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/skipWhile.js.map b/node_modules/rxjs/_esm2015/internal/operators/skipWhile.js.map
deleted file mode 100644
index c409a55..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/skipWhile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipWhile.js","sources":["../../../src/internal/operators/skipWhile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAe3C,MAAM,UAAU,SAAS,CAAI,SAA+C;IAC1E,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,iBAAiB;IACrB,YAAoB,SAA+C;QAA/C,cAAS,GAAT,SAAS,CAAsC;IACnE,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/E,CAAC;CACF;AAOD,MAAM,mBAAuB,SAAQ,UAAa;IAIhD,YAAY,WAA0B,EAClB,SAA+C;QACjE,KAAK,CAAC,WAAW,CAAC,CAAC;QADD,cAAS,GAAT,SAAS,CAAsC;QAJ3D,aAAQ,GAAY,IAAI,CAAC;QACzB,UAAK,GAAW,CAAC,CAAC;IAK1B,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC9B;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACzB;IACH,CAAC;IAEO,gBAAgB,CAAC,KAAQ;QAC/B,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;SACjC;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/startWith.js b/node_modules/rxjs/_esm2015/internal/operators/startWith.js
deleted file mode 100644
index a9a7c27..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/startWith.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { concat } from '../observable/concat';
-import { isScheduler } from '../util/isScheduler';
-export function startWith(...array) {
-    const scheduler = array[array.length - 1];
-    if (isScheduler(scheduler)) {
-        array.pop();
-        return (source) => concat(array, source, scheduler);
-    }
-    else {
-        return (source) => concat(array, source);
-    }
-}
-//# sourceMappingURL=startWith.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/startWith.js.map b/node_modules/rxjs/_esm2015/internal/operators/startWith.js.map
deleted file mode 100644
index 4ba6b89..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/startWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"startWith.js","sources":["../../../src/internal/operators/startWith.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAiElD,MAAM,UAAU,SAAS,CAAO,GAAG,KAA+B;IAChE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAkB,CAAC;IAC3D,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE;QAE1B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,KAAY,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;KAC3E;SAAM;QACL,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,KAAY,EAAE,MAAM,CAAC,CAAC;KAChE;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/subscribeOn.js b/node_modules/rxjs/_esm2015/internal/operators/subscribeOn.js
deleted file mode 100644
index 2ca5795..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/subscribeOn.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { SubscribeOnObservable } from '../observable/SubscribeOnObservable';
-export function subscribeOn(scheduler, delay = 0) {
-    return function subscribeOnOperatorFunction(source) {
-        return source.lift(new SubscribeOnOperator(scheduler, delay));
-    };
-}
-class SubscribeOnOperator {
-    constructor(scheduler, delay) {
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    call(subscriber, source) {
-        return new SubscribeOnObservable(source, this.delay, this.scheduler).subscribe(subscriber);
-    }
-}
-//# sourceMappingURL=subscribeOn.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/subscribeOn.js.map b/node_modules/rxjs/_esm2015/internal/operators/subscribeOn.js.map
deleted file mode 100644
index dd285b4..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/subscribeOn.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeOn.js","sources":["../../../src/internal/operators/subscribeOn.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AA6C5E,MAAM,UAAU,WAAW,CAAI,SAAwB,EAAE,QAAgB,CAAC;IACxE,OAAO,SAAS,2BAA2B,CAAC,MAAqB;QAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAI,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,mBAAmB;IACvB,YAAoB,SAAwB,EACxB,KAAa;QADb,cAAS,GAAT,SAAS,CAAe;QACxB,UAAK,GAAL,KAAK,CAAQ;IACjC,CAAC;IACD,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,IAAI,qBAAqB,CAC9B,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CACnC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/switchAll.js b/node_modules/rxjs/_esm2015/internal/operators/switchAll.js
deleted file mode 100644
index f0db599..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/switchAll.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { switchMap } from './switchMap';
-import { identity } from '../util/identity';
-export function switchAll() {
-    return switchMap(identity);
-}
-//# sourceMappingURL=switchAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/switchAll.js.map b/node_modules/rxjs/_esm2015/internal/operators/switchAll.js.map
deleted file mode 100644
index 643e89d..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/switchAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchAll.js","sources":["../../../src/internal/operators/switchAll.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AA4D5C,MAAM,UAAU,SAAS;IACvB,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/switchMap.js b/node_modules/rxjs/_esm2015/internal/operators/switchMap.js
deleted file mode 100644
index 8d1894f..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/switchMap.js
+++ /dev/null
@@ -1,73 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { map } from './map';
-import { from } from '../observable/from';
-export function switchMap(project, resultSelector) {
-    if (typeof resultSelector === 'function') {
-        return (source) => source.pipe(switchMap((a, i) => from(project(a, i)).pipe(map((b, ii) => resultSelector(a, b, i, ii)))));
-    }
-    return (source) => source.lift(new SwitchMapOperator(project));
-}
-class SwitchMapOperator {
-    constructor(project) {
-        this.project = project;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));
-    }
-}
-class SwitchMapSubscriber extends OuterSubscriber {
-    constructor(destination, project) {
-        super(destination);
-        this.project = project;
-        this.index = 0;
-    }
-    _next(value) {
-        let result;
-        const index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (error) {
-            this.destination.error(error);
-            return;
-        }
-        this._innerSub(result, value, index);
-    }
-    _innerSub(result, value, index) {
-        const innerSubscription = this.innerSubscription;
-        if (innerSubscription) {
-            innerSubscription.unsubscribe();
-        }
-        const innerSubscriber = new InnerSubscriber(this, value, index);
-        const destination = this.destination;
-        destination.add(innerSubscriber);
-        this.innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-        if (this.innerSubscription !== innerSubscriber) {
-            destination.add(this.innerSubscription);
-        }
-    }
-    _complete() {
-        const { innerSubscription } = this;
-        if (!innerSubscription || innerSubscription.closed) {
-            super._complete();
-        }
-        this.unsubscribe();
-    }
-    _unsubscribe() {
-        this.innerSubscription = null;
-    }
-    notifyComplete(innerSub) {
-        const destination = this.destination;
-        destination.remove(innerSub);
-        this.innerSubscription = null;
-        if (this.isStopped) {
-            super._complete();
-        }
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    }
-}
-//# sourceMappingURL=switchMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/switchMap.js.map b/node_modules/rxjs/_esm2015/internal/operators/switchMap.js.map
deleted file mode 100644
index 82febc0..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/switchMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchMap.js","sources":["../../../src/internal/operators/switchMap.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/switchMapTo.js b/node_modules/rxjs/_esm2015/internal/operators/switchMapTo.js
deleted file mode 100644
index be8a83d..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/switchMapTo.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { switchMap } from './switchMap';
-export function switchMapTo(innerObservable, resultSelector) {
-    return resultSelector ? switchMap(() => innerObservable, resultSelector) : switchMap(() => innerObservable);
-}
-//# sourceMappingURL=switchMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/switchMapTo.js.map b/node_modules/rxjs/_esm2015/internal/operators/switchMapTo.js.map
deleted file mode 100644
index e8cf9dc..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/switchMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchMapTo.js","sources":["../../../src/internal/operators/switchMapTo.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAkDxC,MAAM,UAAU,WAAW,CACzB,eAAmC,EACnC,cAA4F;IAE5F,OAAO,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;AAC9G,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/take.js b/node_modules/rxjs/_esm2015/internal/operators/take.js
deleted file mode 100644
index bd45f03..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/take.js
+++ /dev/null
@@ -1,43 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
-import { empty } from '../observable/empty';
-export function take(count) {
-    return (source) => {
-        if (count === 0) {
-            return empty();
-        }
-        else {
-            return source.lift(new TakeOperator(count));
-        }
-    };
-}
-class TakeOperator {
-    constructor(total) {
-        this.total = total;
-        if (this.total < 0) {
-            throw new ArgumentOutOfRangeError;
-        }
-    }
-    call(subscriber, source) {
-        return source.subscribe(new TakeSubscriber(subscriber, this.total));
-    }
-}
-class TakeSubscriber extends Subscriber {
-    constructor(destination, total) {
-        super(destination);
-        this.total = total;
-        this.count = 0;
-    }
-    _next(value) {
-        const total = this.total;
-        const count = ++this.count;
-        if (count <= total) {
-            this.destination.next(value);
-            if (count === total) {
-                this.destination.complete();
-                this.unsubscribe();
-            }
-        }
-    }
-}
-//# sourceMappingURL=take.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/take.js.map b/node_modules/rxjs/_esm2015/internal/operators/take.js.map
deleted file mode 100644
index dcf2e84..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/take.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"take.js","sources":["../../../src/internal/operators/take.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAkD5C,MAAM,UAAU,IAAI,CAAI,KAAa;IACnC,OAAO,CAAC,MAAqB,EAAE,EAAE;QAC/B,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,OAAO,KAAK,EAAE,CAAC;SAChB;aAAM;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;SAC7C;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,YAAY;IAChB,YAAoB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QAC/B,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;YAClB,MAAM,IAAI,uBAAuB,CAAC;SACnC;IACH,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;CACF;AAOD,MAAM,cAAkB,SAAQ,UAAa;IAG3C,YAAY,WAA0B,EAAU,KAAa;QAC3D,KAAK,CAAC,WAAW,CAAC,CAAC;QAD2B,UAAK,GAAL,KAAK,CAAQ;QAFrD,UAAK,GAAW,CAAC,CAAC;IAI1B,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,KAAK,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;QAC3B,IAAI,KAAK,IAAI,KAAK,EAAE;YAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,KAAK,KAAK,KAAK,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;aACpB;SACF;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/takeLast.js b/node_modules/rxjs/_esm2015/internal/operators/takeLast.js
deleted file mode 100644
index 98fe686..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/takeLast.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
-import { empty } from '../observable/empty';
-export function takeLast(count) {
-    return function takeLastOperatorFunction(source) {
-        if (count === 0) {
-            return empty();
-        }
-        else {
-            return source.lift(new TakeLastOperator(count));
-        }
-    };
-}
-class TakeLastOperator {
-    constructor(total) {
-        this.total = total;
-        if (this.total < 0) {
-            throw new ArgumentOutOfRangeError;
-        }
-    }
-    call(subscriber, source) {
-        return source.subscribe(new TakeLastSubscriber(subscriber, this.total));
-    }
-}
-class TakeLastSubscriber extends Subscriber {
-    constructor(destination, total) {
-        super(destination);
-        this.total = total;
-        this.ring = new Array();
-        this.count = 0;
-    }
-    _next(value) {
-        const ring = this.ring;
-        const total = this.total;
-        const count = this.count++;
-        if (ring.length < total) {
-            ring.push(value);
-        }
-        else {
-            const index = count % total;
-            ring[index] = value;
-        }
-    }
-    _complete() {
-        const destination = this.destination;
-        let count = this.count;
-        if (count > 0) {
-            const total = this.count >= this.total ? this.total : this.count;
-            const ring = this.ring;
-            for (let i = 0; i < total; i++) {
-                const idx = (count++) % total;
-                destination.next(ring[idx]);
-            }
-        }
-        destination.complete();
-    }
-}
-//# sourceMappingURL=takeLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/takeLast.js.map b/node_modules/rxjs/_esm2015/internal/operators/takeLast.js.map
deleted file mode 100644
index f1d87a7..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/takeLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeLast.js","sources":["../../../src/internal/operators/takeLast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AA8C5C,MAAM,UAAU,QAAQ,CAAI,KAAa;IACvC,OAAO,SAAS,wBAAwB,CAAC,MAAqB;QAC5D,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,OAAO,KAAK,EAAE,CAAC;SAChB;aAAM;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;SACjD;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,gBAAgB;IACpB,YAAoB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QAC/B,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;YAClB,MAAM,IAAI,uBAAuB,CAAC;SACnC;IACH,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1E,CAAC;CACF;AAOD,MAAM,kBAAsB,SAAQ,UAAa;IAI/C,YAAY,WAA0B,EAAU,KAAa;QAC3D,KAAK,CAAC,WAAW,CAAC,CAAC;QAD2B,UAAK,GAAL,KAAK,CAAQ;QAHrD,SAAI,GAAa,IAAI,KAAK,EAAE,CAAC;QAC7B,UAAK,GAAW,CAAC,CAAC;IAI1B,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAClB;aAAM;YACL,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;SACrB;IACH,CAAC;IAES,SAAS;QACjB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEvB,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YACjE,MAAM,IAAI,GAAI,IAAI,CAAC,IAAI,CAAC;YAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC9B,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;gBAC9B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;aAC7B;SACF;QAED,WAAW,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/takeUntil.js b/node_modules/rxjs/_esm2015/internal/operators/takeUntil.js
deleted file mode 100644
index 87778e2..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/takeUntil.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function takeUntil(notifier) {
-    return (source) => source.lift(new TakeUntilOperator(notifier));
-}
-class TakeUntilOperator {
-    constructor(notifier) {
-        this.notifier = notifier;
-    }
-    call(subscriber, source) {
-        const takeUntilSubscriber = new TakeUntilSubscriber(subscriber);
-        const notifierSubscription = subscribeToResult(takeUntilSubscriber, this.notifier);
-        if (notifierSubscription && !takeUntilSubscriber.seenValue) {
-            takeUntilSubscriber.add(notifierSubscription);
-            return source.subscribe(takeUntilSubscriber);
-        }
-        return takeUntilSubscriber;
-    }
-}
-class TakeUntilSubscriber extends OuterSubscriber {
-    constructor(destination) {
-        super(destination);
-        this.seenValue = false;
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.seenValue = true;
-        this.complete();
-    }
-    notifyComplete() {
-    }
-}
-//# sourceMappingURL=takeUntil.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/takeUntil.js.map b/node_modules/rxjs/_esm2015/internal/operators/takeUntil.js.map
deleted file mode 100644
index fbefd7d..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/takeUntil.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeUntil.js","sources":["../../../src/internal/operators/takeUntil.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA4C9D,MAAM,UAAU,SAAS,CAAI,QAAyB;IACpD,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,iBAAiB;IACrB,YAAoB,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAC7C,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnF,IAAI,oBAAoB,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE;YAC1D,mBAAmB,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;SAC9C;QACD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;CACF;AAOD,MAAM,mBAA0B,SAAQ,eAAqB;IAG3D,YAAY,WAA4B;QACtC,KAAK,CAAC,WAAW,CAAC,CAAC;QAHrB,cAAS,GAAG,KAAK,CAAC;IAIlB,CAAC;IAED,UAAU,CAAC,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,cAAc;IAEd,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/takeWhile.js b/node_modules/rxjs/_esm2015/internal/operators/takeWhile.js
deleted file mode 100644
index fa75968..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/takeWhile.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function takeWhile(predicate, inclusive = false) {
-    return (source) => source.lift(new TakeWhileOperator(predicate, inclusive));
-}
-class TakeWhileOperator {
-    constructor(predicate, inclusive) {
-        this.predicate = predicate;
-        this.inclusive = inclusive;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive));
-    }
-}
-class TakeWhileSubscriber extends Subscriber {
-    constructor(destination, predicate, inclusive) {
-        super(destination);
-        this.predicate = predicate;
-        this.inclusive = inclusive;
-        this.index = 0;
-    }
-    _next(value) {
-        const destination = this.destination;
-        let result;
-        try {
-            result = this.predicate(value, this.index++);
-        }
-        catch (err) {
-            destination.error(err);
-            return;
-        }
-        this.nextOrComplete(value, result);
-    }
-    nextOrComplete(value, predicateResult) {
-        const destination = this.destination;
-        if (Boolean(predicateResult)) {
-            destination.next(value);
-        }
-        else {
-            if (this.inclusive) {
-                destination.next(value);
-            }
-            destination.complete();
-        }
-    }
-}
-//# sourceMappingURL=takeWhile.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/takeWhile.js.map b/node_modules/rxjs/_esm2015/internal/operators/takeWhile.js.map
deleted file mode 100644
index 9450a9e..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/takeWhile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeWhile.js","sources":["../../../src/internal/operators/takeWhile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAmD3C,MAAM,UAAU,SAAS,CACrB,SAA+C,EAC/C,SAAS,GAAG,KAAK;IACnB,OAAO,CAAC,MAAqB,EAAE,EAAE,CACtB,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,iBAAiB;IACrB,YACY,SAA+C,EAC/C,SAAkB;QADlB,cAAS,GAAT,SAAS,CAAsC;QAC/C,cAAS,GAAT,SAAS,CAAS;IAAG,CAAC;IAElC,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CACnB,IAAI,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3E,CAAC;CACF;AAOD,MAAM,mBAAuB,SAAQ,UAAa;IAGhD,YACI,WAA0B,EAClB,SAA+C,EAC/C,SAAkB;QAC5B,KAAK,CAAC,WAAW,CAAC,CAAC;QAFT,cAAS,GAAT,SAAS,CAAsC;QAC/C,cAAS,GAAT,SAAS,CAAS;QALtB,UAAK,GAAW,CAAC,CAAC;IAO1B,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,MAAe,CAAC;QACpB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SAC9C;QAAC,OAAO,GAAG,EAAE;YACZ,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO;SACR;QACD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAEO,cAAc,CAAC,KAAQ,EAAE,eAAwB;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE;YAC5B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACzB;aAAM;YACL,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACzB;YACD,WAAW,CAAC,QAAQ,EAAE,CAAC;SACxB;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/tap.js b/node_modules/rxjs/_esm2015/internal/operators/tap.js
deleted file mode 100644
index 344c7f3..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/tap.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { noop } from '../util/noop';
-import { isFunction } from '../util/isFunction';
-export function tap(nextOrObserver, error, complete) {
-    return function tapOperatorFunction(source) {
-        return source.lift(new DoOperator(nextOrObserver, error, complete));
-    };
-}
-class DoOperator {
-    constructor(nextOrObserver, error, complete) {
-        this.nextOrObserver = nextOrObserver;
-        this.error = error;
-        this.complete = complete;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
-    }
-}
-class TapSubscriber extends Subscriber {
-    constructor(destination, observerOrNext, error, complete) {
-        super(destination);
-        this._tapNext = noop;
-        this._tapError = noop;
-        this._tapComplete = noop;
-        this._tapError = error || noop;
-        this._tapComplete = complete || noop;
-        if (isFunction(observerOrNext)) {
-            this._context = this;
-            this._tapNext = observerOrNext;
-        }
-        else if (observerOrNext) {
-            this._context = observerOrNext;
-            this._tapNext = observerOrNext.next || noop;
-            this._tapError = observerOrNext.error || noop;
-            this._tapComplete = observerOrNext.complete || noop;
-        }
-    }
-    _next(value) {
-        try {
-            this._tapNext.call(this._context, value);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(value);
-    }
-    _error(err) {
-        try {
-            this._tapError.call(this._context, err);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.error(err);
-    }
-    _complete() {
-        try {
-            this._tapComplete.call(this._context);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        return this.destination.complete();
-    }
-}
-//# sourceMappingURL=tap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/tap.js.map b/node_modules/rxjs/_esm2015/internal/operators/tap.js.map
deleted file mode 100644
index 07364d3..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/tap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"tap.js","sources":["../../../src/internal/operators/tap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AA6DhD,MAAM,UAAU,GAAG,CAAI,cAAsD,EACtD,KAAwB,EACxB,QAAqB;IAC1C,OAAO,SAAS,mBAAmB,CAAC,MAAqB;QACvD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU;IACd,YAAoB,cAAsD,EACtD,KAAwB,EACxB,QAAqB;QAFrB,mBAAc,GAAd,cAAc,CAAwC;QACtD,UAAK,GAAL,KAAK,CAAmB;QACxB,aAAQ,GAAR,QAAQ,CAAa;IACzC,CAAC;IACD,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzG,CAAC;CACF;AAQD,MAAM,aAAiB,SAAQ,UAAa;IAS1C,YAAY,WAA0B,EAC1B,cAA0D,EAC1D,KAAyB,EACzB,QAAqB;QAC7B,KAAK,CAAC,WAAW,CAAC,CAAC;QAVf,aAAQ,GAAyB,IAAI,CAAC;QAEtC,cAAS,GAAyB,IAAI,CAAC;QAEvC,iBAAY,GAAiB,IAAI,CAAC;QAOtC,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,IAAI,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,QAAQ,IAAI,IAAI,CAAC;QACrC,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE;YAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;SAChC;aAAM,IAAI,cAAc,EAAE;YACzB,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;YAC/B,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,IAAI,IAAI,IAAI,CAAC;YAC5C,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,KAAK,IAAI,IAAI,CAAC;YAC9C,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,QAAQ,IAAI,IAAI,CAAC;SACrD;IACH,CAAC;IAEH,KAAK,CAAC,KAAQ;QACZ,IAAI;YACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;SAC1C;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,GAAQ;QACb,IAAI;YACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;SACzC;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,SAAS;QACP,IAAI;YACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAG,CAAC;SACzC;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IACrC,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/throttle.js b/node_modules/rxjs/_esm2015/internal/operators/throttle.js
deleted file mode 100644
index fc07317..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/throttle.js
+++ /dev/null
@@ -1,82 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export const defaultThrottleConfig = {
-    leading: true,
-    trailing: false
-};
-export function throttle(durationSelector, config = defaultThrottleConfig) {
-    return (source) => source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing));
-}
-class ThrottleOperator {
-    constructor(durationSelector, leading, trailing) {
-        this.durationSelector = durationSelector;
-        this.leading = leading;
-        this.trailing = trailing;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));
-    }
-}
-class ThrottleSubscriber extends OuterSubscriber {
-    constructor(destination, durationSelector, _leading, _trailing) {
-        super(destination);
-        this.destination = destination;
-        this.durationSelector = durationSelector;
-        this._leading = _leading;
-        this._trailing = _trailing;
-        this._hasValue = false;
-    }
-    _next(value) {
-        this._hasValue = true;
-        this._sendValue = value;
-        if (!this._throttled) {
-            if (this._leading) {
-                this.send();
-            }
-            else {
-                this.throttle(value);
-            }
-        }
-    }
-    send() {
-        const { _hasValue, _sendValue } = this;
-        if (_hasValue) {
-            this.destination.next(_sendValue);
-            this.throttle(_sendValue);
-        }
-        this._hasValue = false;
-        this._sendValue = null;
-    }
-    throttle(value) {
-        const duration = this.tryDurationSelector(value);
-        if (!!duration) {
-            this.add(this._throttled = subscribeToResult(this, duration));
-        }
-    }
-    tryDurationSelector(value) {
-        try {
-            return this.durationSelector(value);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return null;
-        }
-    }
-    throttlingDone() {
-        const { _throttled, _trailing } = this;
-        if (_throttled) {
-            _throttled.unsubscribe();
-        }
-        this._throttled = null;
-        if (_trailing) {
-            this.send();
-        }
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.throttlingDone();
-    }
-    notifyComplete() {
-        this.throttlingDone();
-    }
-}
-//# sourceMappingURL=throttle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/throttle.js.map b/node_modules/rxjs/_esm2015/internal/operators/throttle.js.map
deleted file mode 100644
index 58b6c9a..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/throttle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throttle.js","sources":["../../../src/internal/operators/throttle.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAS9D,MAAM,CAAC,MAAM,qBAAqB,GAAmB;IACnD,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,KAAK;CAChB,CAAC;AAgDF,MAAM,UAAU,QAAQ,CAAI,gBAA0D,EAC1D,SAAyB,qBAAqB;IACxE,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzH,CAAC;AAED,MAAM,gBAAgB;IACpB,YAAoB,gBAA0D,EAC1D,OAAgB,EAChB,QAAiB;QAFjB,qBAAgB,GAAhB,gBAAgB,CAA0C;QAC1D,YAAO,GAAP,OAAO,CAAS;QAChB,aAAQ,GAAR,QAAQ,CAAS;IACrC,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CACrB,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CACvF,CAAC;IACJ,CAAC;CACF;AAOD,MAAM,kBAAyB,SAAQ,eAAqB;IAK1D,YAAsB,WAA0B,EAC5B,gBAA6D,EAC7D,QAAiB,EACjB,SAAkB;QACpC,KAAK,CAAC,WAAW,CAAC,CAAC;QAJC,gBAAW,GAAX,WAAW,CAAe;QAC5B,qBAAgB,GAAhB,gBAAgB,CAA6C;QAC7D,aAAQ,GAAR,QAAQ,CAAS;QACjB,cAAS,GAAT,SAAS,CAAS;QAL9B,cAAS,GAAG,KAAK,CAAC;IAO1B,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,IAAI,CAAC,IAAI,EAAE,CAAC;aACb;iBAAM;gBACL,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aACtB;SACF;IACH,CAAC;IAEO,IAAI;QACV,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QACvC,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;SAC3B;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAEO,QAAQ,CAAC,KAAQ;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,CAAC,QAAQ,EAAE;YACd,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;SAC/D;IACH,CAAC;IAEO,mBAAmB,CAAC,KAAQ;QAClC,IAAI;YACF,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SACrC;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAEO,cAAc;QACpB,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QACvC,IAAI,UAAU,EAAE;YACd,UAAU,CAAC,WAAW,EAAE,CAAC;SAC1B;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,IAAI,EAAE,CAAC;SACb;IACH,CAAC;IAED,UAAU,CAAC,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/throttleTime.js b/node_modules/rxjs/_esm2015/internal/operators/throttleTime.js
deleted file mode 100644
index 3a1a9c5..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/throttleTime.js
+++ /dev/null
@@ -1,73 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { async } from '../scheduler/async';
-import { defaultThrottleConfig } from './throttle';
-export function throttleTime(duration, scheduler = async, config = defaultThrottleConfig) {
-    return (source) => source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing));
-}
-class ThrottleTimeOperator {
-    constructor(duration, scheduler, leading, trailing) {
-        this.duration = duration;
-        this.scheduler = scheduler;
-        this.leading = leading;
-        this.trailing = trailing;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));
-    }
-}
-class ThrottleTimeSubscriber extends Subscriber {
-    constructor(destination, duration, scheduler, leading, trailing) {
-        super(destination);
-        this.duration = duration;
-        this.scheduler = scheduler;
-        this.leading = leading;
-        this.trailing = trailing;
-        this._hasTrailingValue = false;
-        this._trailingValue = null;
-    }
-    _next(value) {
-        if (this.throttled) {
-            if (this.trailing) {
-                this._trailingValue = value;
-                this._hasTrailingValue = true;
-            }
-        }
-        else {
-            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));
-            if (this.leading) {
-                this.destination.next(value);
-            }
-            else if (this.trailing) {
-                this._trailingValue = value;
-                this._hasTrailingValue = true;
-            }
-        }
-    }
-    _complete() {
-        if (this._hasTrailingValue) {
-            this.destination.next(this._trailingValue);
-            this.destination.complete();
-        }
-        else {
-            this.destination.complete();
-        }
-    }
-    clearThrottle() {
-        const throttled = this.throttled;
-        if (throttled) {
-            if (this.trailing && this._hasTrailingValue) {
-                this.destination.next(this._trailingValue);
-                this._trailingValue = null;
-                this._hasTrailingValue = false;
-            }
-            throttled.unsubscribe();
-            this.remove(throttled);
-            this.throttled = null;
-        }
-    }
-}
-function dispatchNext(arg) {
-    const { subscriber } = arg;
-    subscriber.clearThrottle();
-}
-//# sourceMappingURL=throttleTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/throttleTime.js.map b/node_modules/rxjs/_esm2015/internal/operators/throttleTime.js.map
deleted file mode 100644
index 63ecb28..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/throttleTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throttleTime.js","sources":["../../../src/internal/operators/throttleTime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAkB,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAkFnE,MAAM,UAAU,YAAY,CAAI,QAAgB,EAChB,YAA2B,KAAK,EAChC,SAAyB,qBAAqB;IAC5E,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChI,CAAC;AAED,MAAM,oBAAoB;IACxB,YAAoB,QAAgB,EAChB,SAAwB,EACxB,OAAgB,EAChB,QAAiB;QAHjB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,cAAS,GAAT,SAAS,CAAe;QACxB,YAAO,GAAP,OAAO,CAAS;QAChB,aAAQ,GAAR,QAAQ,CAAS;IACrC,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CACrB,IAAI,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CACnG,CAAC;IACJ,CAAC;CACF;AAOD,MAAM,sBAA0B,SAAQ,UAAa;IAKnD,YAAY,WAA0B,EAClB,QAAgB,EAChB,SAAwB,EACxB,OAAgB,EAChB,QAAiB;QACnC,KAAK,CAAC,WAAW,CAAC,CAAC;QAJD,aAAQ,GAAR,QAAQ,CAAQ;QAChB,cAAS,GAAT,SAAS,CAAe;QACxB,YAAO,GAAP,OAAO,CAAS;QAChB,aAAQ,GAAR,QAAQ,CAAS;QAP7B,sBAAiB,GAAY,KAAK,CAAC;QACnC,mBAAc,GAAM,IAAI,CAAC;IAQjC,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;aAC/B;SACF;aAAM;YACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAiB,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACtH,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC9B;iBAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACxB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;aAC/B;SACF;IACH,CAAC;IAES,SAAS;QACjB,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;aAAM;YACL,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;IACH,CAAC;IAED,aAAa;QACX,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,SAAS,EAAE;YACb,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,iBAAiB,EAAE;gBAC3C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC3C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC3B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;aAChC;YACD,SAAS,CAAC,WAAW,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;SACvB;IACH,CAAC;CACF;AAMD,SAAS,YAAY,CAAI,GAAmB;IAC1C,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;IAC3B,UAAU,CAAC,aAAa,EAAE,CAAC;AAC7B,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/throwIfEmpty.js b/node_modules/rxjs/_esm2015/internal/operators/throwIfEmpty.js
deleted file mode 100644
index 9a42206..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/throwIfEmpty.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { EmptyError } from '../util/EmptyError';
-import { Subscriber } from '../Subscriber';
-export function throwIfEmpty(errorFactory = defaultErrorFactory) {
-    return (source) => {
-        return source.lift(new ThrowIfEmptyOperator(errorFactory));
-    };
-}
-class ThrowIfEmptyOperator {
-    constructor(errorFactory) {
-        this.errorFactory = errorFactory;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory));
-    }
-}
-class ThrowIfEmptySubscriber extends Subscriber {
-    constructor(destination, errorFactory) {
-        super(destination);
-        this.errorFactory = errorFactory;
-        this.hasValue = false;
-    }
-    _next(value) {
-        this.hasValue = true;
-        this.destination.next(value);
-    }
-    _complete() {
-        if (!this.hasValue) {
-            let err;
-            try {
-                err = this.errorFactory();
-            }
-            catch (e) {
-                err = e;
-            }
-            this.destination.error(err);
-        }
-        else {
-            return this.destination.complete();
-        }
-    }
-}
-function defaultErrorFactory() {
-    return new EmptyError();
-}
-//# sourceMappingURL=throwIfEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/throwIfEmpty.js.map b/node_modules/rxjs/_esm2015/internal/operators/throwIfEmpty.js.map
deleted file mode 100644
index 71ed774..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/throwIfEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throwIfEmpty.js","sources":["../../../src/internal/operators/throwIfEmpty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAiC3C,MAAM,UAAU,YAAY,CAAK,eAA4B,mBAAmB;IAC9E,OAAO,CAAC,MAAqB,EAAE,EAAE;QAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,oBAAoB;IACxB,YAAoB,YAAuB;QAAvB,iBAAY,GAAZ,YAAY,CAAW;IAC3C,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACrF,CAAC;CACF;AAED,MAAM,sBAA0B,SAAQ,UAAa;IAGnD,YAAY,WAA0B,EAAU,YAAuB;QACrE,KAAK,CAAC,WAAW,CAAC,CAAC;QAD2B,iBAAY,GAAZ,YAAY,CAAW;QAF/D,aAAQ,GAAY,KAAK,CAAC;IAIlC,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,GAAQ,CAAC;YACb,IAAI;gBACF,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;aAC3B;YAAC,OAAO,CAAC,EAAE;gBACV,GAAG,GAAG,CAAC,CAAC;aACT;YACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;aAAM;YACH,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SACtC;IACH,CAAC;CACF;AAED,SAAS,mBAAmB;IAC1B,OAAO,IAAI,UAAU,EAAE,CAAC;AAC1B,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/timeInterval.js b/node_modules/rxjs/_esm2015/internal/operators/timeInterval.js
deleted file mode 100644
index 1e67b89..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/timeInterval.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { async } from '../scheduler/async';
-import { scan } from './scan';
-import { defer } from '../observable/defer';
-import { map } from './map';
-export function timeInterval(scheduler = async) {
-    return (source) => defer(() => {
-        return source.pipe(scan(({ current }, value) => ({ value, current: scheduler.now(), last: current }), { current: scheduler.now(), value: undefined, last: undefined }), map(({ current, last, value }) => new TimeInterval(value, current - last)));
-    });
-}
-export class TimeInterval {
-    constructor(value, interval) {
-        this.value = value;
-        this.interval = interval;
-    }
-}
-//# sourceMappingURL=timeInterval.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/timeInterval.js.map b/node_modules/rxjs/_esm2015/internal/operators/timeInterval.js.map
deleted file mode 100644
index fa9048b..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/timeInterval.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeInterval.js","sources":["../../../src/internal/operators/timeInterval.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AA+C5B,MAAM,UAAU,YAAY,CAAI,YAA2B,KAAK;IAC9D,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QAC3C,OAAO,MAAM,CAAC,IAAI,CAEhB,IAAI,CACF,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAC5E,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAG,IAAI,EAAE,SAAS,EAAE,CAC1D,EACR,GAAG,CAAuB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC,CACjG,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAQD,MAAM,OAAO,YAAY;IACvB,YAAmB,KAAQ,EAAS,QAAgB;QAAjC,UAAK,GAAL,KAAK,CAAG;QAAS,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;CACzD"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/timeout.js b/node_modules/rxjs/_esm2015/internal/operators/timeout.js
deleted file mode 100644
index 37589e2..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/timeout.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import { async } from '../scheduler/async';
-import { TimeoutError } from '../util/TimeoutError';
-import { timeoutWith } from './timeoutWith';
-import { throwError } from '../observable/throwError';
-export function timeout(due, scheduler = async) {
-    return timeoutWith(due, throwError(new TimeoutError()), scheduler);
-}
-//# sourceMappingURL=timeout.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/timeout.js.map b/node_modules/rxjs/_esm2015/internal/operators/timeout.js.map
deleted file mode 100644
index c0ce3e4..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/timeout.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeout.js","sources":["../../../src/internal/operators/timeout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAK3C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAgFtD,MAAM,UAAU,OAAO,CAAI,GAAkB,EAClB,YAA2B,KAAK;IACzD,OAAO,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,YAAY,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AACrE,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/timeoutWith.js b/node_modules/rxjs/_esm2015/internal/operators/timeoutWith.js
deleted file mode 100644
index 0526cc7..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/timeoutWith.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import { async } from '../scheduler/async';
-import { isDate } from '../util/isDate';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function timeoutWith(due, withObservable, scheduler = async) {
-    return (source) => {
-        let absoluteTimeout = isDate(due);
-        let waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);
-        return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));
-    };
-}
-class TimeoutWithOperator {
-    constructor(waitFor, absoluteTimeout, withObservable, scheduler) {
-        this.waitFor = waitFor;
-        this.absoluteTimeout = absoluteTimeout;
-        this.withObservable = withObservable;
-        this.scheduler = scheduler;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler));
-    }
-}
-class TimeoutWithSubscriber extends OuterSubscriber {
-    constructor(destination, absoluteTimeout, waitFor, withObservable, scheduler) {
-        super(destination);
-        this.absoluteTimeout = absoluteTimeout;
-        this.waitFor = waitFor;
-        this.withObservable = withObservable;
-        this.scheduler = scheduler;
-        this.action = null;
-        this.scheduleTimeout();
-    }
-    static dispatchTimeout(subscriber) {
-        const { withObservable } = subscriber;
-        subscriber._unsubscribeAndRecycle();
-        subscriber.add(subscribeToResult(subscriber, withObservable));
-    }
-    scheduleTimeout() {
-        const { action } = this;
-        if (action) {
-            this.action = action.schedule(this, this.waitFor);
-        }
-        else {
-            this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this));
-        }
-    }
-    _next(value) {
-        if (!this.absoluteTimeout) {
-            this.scheduleTimeout();
-        }
-        super._next(value);
-    }
-    _unsubscribe() {
-        this.action = null;
-        this.scheduler = null;
-        this.withObservable = null;
-    }
-}
-//# sourceMappingURL=timeoutWith.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/timeoutWith.js.map b/node_modules/rxjs/_esm2015/internal/operators/timeoutWith.js.map
deleted file mode 100644
index b4c8f52..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/timeoutWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeoutWith.js","sources":["../../../src/internal/operators/timeoutWith.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA4D9D,MAAM,UAAU,WAAW,CAAO,GAAkB,EAClB,cAAkC,EAClC,YAA2B,KAAK;IAChE,OAAO,CAAC,MAAqB,EAAE,EAAE;QAC/B,IAAI,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAS,GAAG,CAAC,CAAC;QACjF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IACnG,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,mBAAmB;IACvB,YAAoB,OAAe,EACf,eAAwB,EACxB,cAAoC,EACpC,SAAwB;QAHxB,YAAO,GAAP,OAAO,CAAQ;QACf,oBAAe,GAAf,eAAe,CAAS;QACxB,mBAAc,GAAd,cAAc,CAAsB;QACpC,cAAS,GAAT,SAAS,CAAe;IAC5C,CAAC;IAED,IAAI,CAAC,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAC/C,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CACpF,CAAC,CAAC;IACL,CAAC;CACF;AAOD,MAAM,qBAA4B,SAAQ,eAAqB;IAI7D,YAAY,WAA0B,EAClB,eAAwB,EACxB,OAAe,EACf,cAAoC,EACpC,SAAwB;QAC1C,KAAK,CAAC,WAAW,CAAC,CAAC;QAJD,oBAAe,GAAf,eAAe,CAAS;QACxB,YAAO,GAAP,OAAO,CAAQ;QACf,mBAAc,GAAd,cAAc,CAAsB;QACpC,cAAS,GAAT,SAAS,CAAe;QANpC,WAAM,GAAiD,IAAI,CAAC;QAQlE,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,MAAM,CAAC,eAAe,CAAO,UAAuC;QAC1E,MAAM,EAAE,cAAc,EAAE,GAAG,UAAU,CAAC;QAC/B,UAAW,CAAC,sBAAsB,EAAE,CAAC;QAC5C,UAAU,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,eAAe;QACrB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACxB,IAAI,MAAM,EAAE;YAMV,IAAI,CAAC,MAAM,GAAmD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAE,CAAC;SACpG;aAAM;YACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAmD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAC5F,qBAAqB,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CACzD,CAAC,CAAC;SACL;IACH,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;QACD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAGD,YAAY;QACV,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/timestamp.js b/node_modules/rxjs/_esm2015/internal/operators/timestamp.js
deleted file mode 100644
index 9cb0281..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/timestamp.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { async } from '../scheduler/async';
-import { map } from './map';
-export function timestamp(scheduler = async) {
-    return map((value) => new Timestamp(value, scheduler.now()));
-}
-export class Timestamp {
-    constructor(value, timestamp) {
-        this.value = value;
-        this.timestamp = timestamp;
-    }
-}
-//# sourceMappingURL=timestamp.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/timestamp.js.map b/node_modules/rxjs/_esm2015/internal/operators/timestamp.js.map
deleted file mode 100644
index 31a1fb9..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/timestamp.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timestamp.js","sources":["../../../src/internal/operators/timestamp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAoC5B,MAAM,UAAU,SAAS,CAAI,YAA2B,KAAK;IAC3D,OAAO,GAAG,CAAC,CAAC,KAAQ,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAElE,CAAC;AAED,MAAM,OAAO,SAAS;IACpB,YAAmB,KAAQ,EAAS,SAAiB;QAAlC,UAAK,GAAL,KAAK,CAAG;QAAS,cAAS,GAAT,SAAS,CAAQ;IACrD,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/toArray.js b/node_modules/rxjs/_esm2015/internal/operators/toArray.js
deleted file mode 100644
index 98effe7..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/toArray.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { reduce } from './reduce';
-function toArrayReducer(arr, item, index) {
-    if (index === 0) {
-        return [item];
-    }
-    arr.push(item);
-    return arr;
-}
-export function toArray() {
-    return reduce(toArrayReducer, []);
-}
-//# sourceMappingURL=toArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/toArray.js.map b/node_modules/rxjs/_esm2015/internal/operators/toArray.js.map
deleted file mode 100644
index c129b66..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/toArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"toArray.js","sources":["../../../src/internal/operators/toArray.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,SAAS,cAAc,CAAI,GAAQ,EAAE,IAAO,EAAE,KAAa;IACzD,IAAI,KAAK,KAAK,CAAC,EAAE;QACf,OAAO,CAAC,IAAI,CAAC,CAAC;KACf;IACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC;AAiCD,MAAM,UAAU,OAAO;IACrB,OAAO,MAAM,CAAC,cAAc,EAAE,EAAS,CAAC,CAAC;AAC3C,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/window.js b/node_modules/rxjs/_esm2015/internal/operators/window.js
deleted file mode 100644
index 79f0c18..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/window.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import { Subject } from '../Subject';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function window(windowBoundaries) {
-    return function windowOperatorFunction(source) {
-        return source.lift(new WindowOperator(windowBoundaries));
-    };
-}
-class WindowOperator {
-    constructor(windowBoundaries) {
-        this.windowBoundaries = windowBoundaries;
-    }
-    call(subscriber, source) {
-        const windowSubscriber = new WindowSubscriber(subscriber);
-        const sourceSubscription = source.subscribe(windowSubscriber);
-        if (!sourceSubscription.closed) {
-            windowSubscriber.add(subscribeToResult(windowSubscriber, this.windowBoundaries));
-        }
-        return sourceSubscription;
-    }
-}
-class WindowSubscriber extends OuterSubscriber {
-    constructor(destination) {
-        super(destination);
-        this.window = new Subject();
-        destination.next(this.window);
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openWindow();
-    }
-    notifyError(error, innerSub) {
-        this._error(error);
-    }
-    notifyComplete(innerSub) {
-        this._complete();
-    }
-    _next(value) {
-        this.window.next(value);
-    }
-    _error(err) {
-        this.window.error(err);
-        this.destination.error(err);
-    }
-    _complete() {
-        this.window.complete();
-        this.destination.complete();
-    }
-    _unsubscribe() {
-        this.window = null;
-    }
-    openWindow() {
-        const prevWindow = this.window;
-        if (prevWindow) {
-            prevWindow.complete();
-        }
-        const destination = this.destination;
-        const newWindow = this.window = new Subject();
-        destination.next(newWindow);
-    }
-}
-//# sourceMappingURL=window.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/window.js.map b/node_modules/rxjs/_esm2015/internal/operators/window.js.map
deleted file mode 100644
index ec96fcd..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/window.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"window.js","sources":["../../../src/internal/operators/window.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA8C9D,MAAM,UAAU,MAAM,CAAI,gBAAiC;IACzD,OAAO,SAAS,sBAAsB,CAAC,MAAqB;QAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,cAAc;IAElB,YAAoB,gBAAiC;QAAjC,qBAAgB,GAAhB,gBAAgB,CAAiB;IACrD,CAAC;IAED,IAAI,CAAC,UAAqC,EAAE,MAAW;QACrD,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC9D,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YAC9B,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;SAClF;QACD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;CACF;AAOD,MAAM,gBAAoB,SAAQ,eAAuB;IAIvD,YAAY,WAAsC;QAChD,KAAK,CAAC,WAAW,CAAC,CAAC;QAHb,WAAM,GAAe,IAAI,OAAO,EAAK,CAAC;QAI5C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,UAAU,CAAC,UAAa,EAAE,UAAe,EAC9B,UAAkB,EAAE,UAAkB,EACtC,QAAiC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,WAAW,CAAC,KAAU,EAAE,QAAiC;QACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,cAAc,CAAC,QAAiC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAES,MAAM,CAAC,GAAQ;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAES,SAAS;QACjB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAGD,YAAY;QACV,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAEO,UAAU;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC/B,IAAI,UAAU,EAAE;YACd,UAAU,CAAC,QAAQ,EAAE,CAAC;SACvB;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAK,CAAC;QACjD,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/windowCount.js b/node_modules/rxjs/_esm2015/internal/operators/windowCount.js
deleted file mode 100644
index a1b1551..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/windowCount.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { Subject } from '../Subject';
-export function windowCount(windowSize, startWindowEvery = 0) {
-    return function windowCountOperatorFunction(source) {
-        return source.lift(new WindowCountOperator(windowSize, startWindowEvery));
-    };
-}
-class WindowCountOperator {
-    constructor(windowSize, startWindowEvery) {
-        this.windowSize = windowSize;
-        this.startWindowEvery = startWindowEvery;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));
-    }
-}
-class WindowCountSubscriber extends Subscriber {
-    constructor(destination, windowSize, startWindowEvery) {
-        super(destination);
-        this.destination = destination;
-        this.windowSize = windowSize;
-        this.startWindowEvery = startWindowEvery;
-        this.windows = [new Subject()];
-        this.count = 0;
-        destination.next(this.windows[0]);
-    }
-    _next(value) {
-        const startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;
-        const destination = this.destination;
-        const windowSize = this.windowSize;
-        const windows = this.windows;
-        const len = windows.length;
-        for (let i = 0; i < len && !this.closed; i++) {
-            windows[i].next(value);
-        }
-        const c = this.count - windowSize + 1;
-        if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {
-            windows.shift().complete();
-        }
-        if (++this.count % startWindowEvery === 0 && !this.closed) {
-            const window = new Subject();
-            windows.push(window);
-            destination.next(window);
-        }
-    }
-    _error(err) {
-        const windows = this.windows;
-        if (windows) {
-            while (windows.length > 0 && !this.closed) {
-                windows.shift().error(err);
-            }
-        }
-        this.destination.error(err);
-    }
-    _complete() {
-        const windows = this.windows;
-        if (windows) {
-            while (windows.length > 0 && !this.closed) {
-                windows.shift().complete();
-            }
-        }
-        this.destination.complete();
-    }
-    _unsubscribe() {
-        this.count = 0;
-        this.windows = null;
-    }
-}
-//# sourceMappingURL=windowCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/windowCount.js.map b/node_modules/rxjs/_esm2015/internal/operators/windowCount.js.map
deleted file mode 100644
index 70d7936..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/windowCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowCount.js","sources":["../../../src/internal/operators/windowCount.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/windowTime.js b/node_modules/rxjs/_esm2015/internal/operators/windowTime.js
deleted file mode 100644
index 901f80e..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/windowTime.js
+++ /dev/null
@@ -1,142 +0,0 @@
-import { Subject } from '../Subject';
-import { async } from '../scheduler/async';
-import { Subscriber } from '../Subscriber';
-import { isNumeric } from '../util/isNumeric';
-import { isScheduler } from '../util/isScheduler';
-export function windowTime(windowTimeSpan) {
-    let scheduler = async;
-    let windowCreationInterval = null;
-    let maxWindowSize = Number.POSITIVE_INFINITY;
-    if (isScheduler(arguments[3])) {
-        scheduler = arguments[3];
-    }
-    if (isScheduler(arguments[2])) {
-        scheduler = arguments[2];
-    }
-    else if (isNumeric(arguments[2])) {
-        maxWindowSize = arguments[2];
-    }
-    if (isScheduler(arguments[1])) {
-        scheduler = arguments[1];
-    }
-    else if (isNumeric(arguments[1])) {
-        windowCreationInterval = arguments[1];
-    }
-    return function windowTimeOperatorFunction(source) {
-        return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler));
-    };
-}
-class WindowTimeOperator {
-    constructor(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
-        this.windowTimeSpan = windowTimeSpan;
-        this.windowCreationInterval = windowCreationInterval;
-        this.maxWindowSize = maxWindowSize;
-        this.scheduler = scheduler;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler));
-    }
-}
-class CountedSubject extends Subject {
-    constructor() {
-        super(...arguments);
-        this._numberOfNextedValues = 0;
-    }
-    next(value) {
-        this._numberOfNextedValues++;
-        super.next(value);
-    }
-    get numberOfNextedValues() {
-        return this._numberOfNextedValues;
-    }
-}
-class WindowTimeSubscriber extends Subscriber {
-    constructor(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
-        super(destination);
-        this.destination = destination;
-        this.windowTimeSpan = windowTimeSpan;
-        this.windowCreationInterval = windowCreationInterval;
-        this.maxWindowSize = maxWindowSize;
-        this.scheduler = scheduler;
-        this.windows = [];
-        const window = this.openWindow();
-        if (windowCreationInterval !== null && windowCreationInterval >= 0) {
-            const closeState = { subscriber: this, window, context: null };
-            const creationState = { windowTimeSpan, windowCreationInterval, subscriber: this, scheduler };
-            this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState));
-            this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState));
-        }
-        else {
-            const timeSpanOnlyState = { subscriber: this, window, windowTimeSpan };
-            this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));
-        }
-    }
-    _next(value) {
-        const windows = this.windows;
-        const len = windows.length;
-        for (let i = 0; i < len; i++) {
-            const window = windows[i];
-            if (!window.closed) {
-                window.next(value);
-                if (window.numberOfNextedValues >= this.maxWindowSize) {
-                    this.closeWindow(window);
-                }
-            }
-        }
-    }
-    _error(err) {
-        const windows = this.windows;
-        while (windows.length > 0) {
-            windows.shift().error(err);
-        }
-        this.destination.error(err);
-    }
-    _complete() {
-        const windows = this.windows;
-        while (windows.length > 0) {
-            const window = windows.shift();
-            if (!window.closed) {
-                window.complete();
-            }
-        }
-        this.destination.complete();
-    }
-    openWindow() {
-        const window = new CountedSubject();
-        this.windows.push(window);
-        const destination = this.destination;
-        destination.next(window);
-        return window;
-    }
-    closeWindow(window) {
-        window.complete();
-        const windows = this.windows;
-        windows.splice(windows.indexOf(window), 1);
-    }
-}
-function dispatchWindowTimeSpanOnly(state) {
-    const { subscriber, windowTimeSpan, window } = state;
-    if (window) {
-        subscriber.closeWindow(window);
-    }
-    state.window = subscriber.openWindow();
-    this.schedule(state, windowTimeSpan);
-}
-function dispatchWindowCreation(state) {
-    const { windowTimeSpan, subscriber, scheduler, windowCreationInterval } = state;
-    const window = subscriber.openWindow();
-    const action = this;
-    let context = { action, subscription: null };
-    const timeSpanState = { subscriber, window, context };
-    context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState);
-    action.add(context.subscription);
-    action.schedule(state, windowCreationInterval);
-}
-function dispatchWindowClose(state) {
-    const { subscriber, window, context } = state;
-    if (context && context.action && context.subscription) {
-        context.action.remove(context.subscription);
-    }
-    subscriber.closeWindow(window);
-}
-//# sourceMappingURL=windowTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/windowTime.js.map b/node_modules/rxjs/_esm2015/internal/operators/windowTime.js.map
deleted file mode 100644
index 2a47017..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/windowTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowTime.js","sources":["../../../src/internal/operators/windowTime.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/windowToggle.js b/node_modules/rxjs/_esm2015/internal/operators/windowToggle.js
deleted file mode 100644
index 1631e02..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/windowToggle.js
+++ /dev/null
@@ -1,123 +0,0 @@
-import { Subject } from '../Subject';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function windowToggle(openings, closingSelector) {
-    return (source) => source.lift(new WindowToggleOperator(openings, closingSelector));
-}
-class WindowToggleOperator {
-    constructor(openings, closingSelector) {
-        this.openings = openings;
-        this.closingSelector = closingSelector;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector));
-    }
-}
-class WindowToggleSubscriber extends OuterSubscriber {
-    constructor(destination, openings, closingSelector) {
-        super(destination);
-        this.openings = openings;
-        this.closingSelector = closingSelector;
-        this.contexts = [];
-        this.add(this.openSubscription = subscribeToResult(this, openings, openings));
-    }
-    _next(value) {
-        const { contexts } = this;
-        if (contexts) {
-            const len = contexts.length;
-            for (let i = 0; i < len; i++) {
-                contexts[i].window.next(value);
-            }
-        }
-    }
-    _error(err) {
-        const { contexts } = this;
-        this.contexts = null;
-        if (contexts) {
-            const len = contexts.length;
-            let index = -1;
-            while (++index < len) {
-                const context = contexts[index];
-                context.window.error(err);
-                context.subscription.unsubscribe();
-            }
-        }
-        super._error(err);
-    }
-    _complete() {
-        const { contexts } = this;
-        this.contexts = null;
-        if (contexts) {
-            const len = contexts.length;
-            let index = -1;
-            while (++index < len) {
-                const context = contexts[index];
-                context.window.complete();
-                context.subscription.unsubscribe();
-            }
-        }
-        super._complete();
-    }
-    _unsubscribe() {
-        const { contexts } = this;
-        this.contexts = null;
-        if (contexts) {
-            const len = contexts.length;
-            let index = -1;
-            while (++index < len) {
-                const context = contexts[index];
-                context.window.unsubscribe();
-                context.subscription.unsubscribe();
-            }
-        }
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (outerValue === this.openings) {
-            let closingNotifier;
-            try {
-                const { closingSelector } = this;
-                closingNotifier = closingSelector(innerValue);
-            }
-            catch (e) {
-                return this.error(e);
-            }
-            const window = new Subject();
-            const subscription = new Subscription();
-            const context = { window, subscription };
-            this.contexts.push(context);
-            const innerSubscription = subscribeToResult(this, closingNotifier, context);
-            if (innerSubscription.closed) {
-                this.closeWindow(this.contexts.length - 1);
-            }
-            else {
-                innerSubscription.context = context;
-                subscription.add(innerSubscription);
-            }
-            this.destination.next(window);
-        }
-        else {
-            this.closeWindow(this.contexts.indexOf(outerValue));
-        }
-    }
-    notifyError(err) {
-        this.error(err);
-    }
-    notifyComplete(inner) {
-        if (inner !== this.openSubscription) {
-            this.closeWindow(this.contexts.indexOf(inner.context));
-        }
-    }
-    closeWindow(index) {
-        if (index === -1) {
-            return;
-        }
-        const { contexts } = this;
-        const context = contexts[index];
-        const { window, subscription } = context;
-        contexts.splice(index, 1);
-        window.complete();
-        subscription.unsubscribe();
-    }
-}
-//# sourceMappingURL=windowToggle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/windowToggle.js.map b/node_modules/rxjs/_esm2015/internal/operators/windowToggle.js.map
deleted file mode 100644
index 7df7808..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/windowToggle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowToggle.js","sources":["../../../src/internal/operators/windowToggle.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAmD9D,MAAM,UAAU,YAAY,CAAO,QAAuB,EACvB,eAAkD;IACnF,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAO,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,oBAAoB;IAExB,YAAoB,QAAuB,EACvB,eAAkD;QADlD,aAAQ,GAAR,QAAQ,CAAe;QACvB,oBAAe,GAAf,eAAe,CAAmC;IACtE,CAAC;IAED,IAAI,CAAC,UAAqC,EAAE,MAAW;QACrD,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAChD,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAChD,CAAC,CAAC;IACL,CAAC;CACF;AAYD,MAAM,sBAA6B,SAAQ,eAAuB;IAIhE,YAAY,WAAsC,EAC9B,QAAuB,EACvB,eAAkD;QACpE,KAAK,CAAC,WAAW,CAAC,CAAC;QAFD,aAAQ,GAAR,QAAQ,CAAe;QACvB,oBAAe,GAAf,eAAe,CAAmC;QAL9D,aAAQ,GAAuB,EAAE,CAAC;QAOxC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAe,CAAC,CAAC,CAAC;IACvF,CAAC;IAES,KAAK,CAAC,KAAQ;QACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC1B,IAAI,QAAQ,EAAE;YACZ,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;gBAC5B,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAChC;SACF;IACH,CAAC;IAES,MAAM,CAAC,GAAQ;QAEvB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,QAAQ,EAAE;YACZ,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC5B,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YAEf,OAAO,EAAE,KAAK,GAAG,GAAG,EAAE;gBACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC1B,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;aACpC;SACF;QAED,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAES,SAAS;QACjB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,QAAQ,EAAE;YACZ,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC5B,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YACf,OAAO,EAAE,KAAK,GAAG,GAAG,EAAE;gBACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC1B,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;aACpC;SACF;QACD,KAAK,CAAC,SAAS,EAAE,CAAC;IACpB,CAAC;IAGD,YAAY;QACV,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,QAAQ,EAAE;YACZ,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC5B,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YACf,OAAO,EAAE,KAAK,GAAG,GAAG,EAAE;gBACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC7B,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;aACpC;SACF;IACH,CAAC;IAED,UAAU,CAAC,UAAe,EAAE,UAAe,EAChC,UAAkB,EAAE,UAAkB,EACtC,QAAiC;QAE1C,IAAI,UAAU,KAAK,IAAI,CAAC,QAAQ,EAAE;YAChC,IAAI,eAAe,CAAC;YACpB,IAAI;gBACF,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;gBACjC,eAAe,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;aAC/C;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACtB;YAED,MAAM,MAAM,GAAG,IAAI,OAAO,EAAK,CAAC;YAChC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,OAAc,CAAC,CAAC;YAEnF,IAAI,iBAAiB,CAAC,MAAM,EAAE;gBAC5B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;aAC5C;iBAAM;gBACC,iBAAkB,CAAC,OAAO,GAAG,OAAO,CAAC;gBAC3C,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;aACrC;YAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC/B;aAAM;YACL,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;SACrD;IACH,CAAC;IAED,WAAW,CAAC,GAAQ;QAClB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,cAAc,CAAC,KAAmB;QAChC,IAAI,KAAK,KAAK,IAAI,CAAC,gBAAgB,EAAE;YACnC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAQ,KAAM,CAAC,OAAO,CAAC,CAAC,CAAC;SAChE;IACH,CAAC;IAEO,WAAW,CAAC,KAAa;QAC/B,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,OAAO;SACR;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;QACzC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClB,YAAY,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/windowWhen.js b/node_modules/rxjs/_esm2015/internal/operators/windowWhen.js
deleted file mode 100644
index 6b30dcc..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/windowWhen.js
+++ /dev/null
@@ -1,75 +0,0 @@
-import { Subject } from '../Subject';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function windowWhen(closingSelector) {
-    return function windowWhenOperatorFunction(source) {
-        return source.lift(new WindowOperator(closingSelector));
-    };
-}
-class WindowOperator {
-    constructor(closingSelector) {
-        this.closingSelector = closingSelector;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector));
-    }
-}
-class WindowSubscriber extends OuterSubscriber {
-    constructor(destination, closingSelector) {
-        super(destination);
-        this.destination = destination;
-        this.closingSelector = closingSelector;
-        this.openWindow();
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openWindow(innerSub);
-    }
-    notifyError(error, innerSub) {
-        this._error(error);
-    }
-    notifyComplete(innerSub) {
-        this.openWindow(innerSub);
-    }
-    _next(value) {
-        this.window.next(value);
-    }
-    _error(err) {
-        this.window.error(err);
-        this.destination.error(err);
-        this.unsubscribeClosingNotification();
-    }
-    _complete() {
-        this.window.complete();
-        this.destination.complete();
-        this.unsubscribeClosingNotification();
-    }
-    unsubscribeClosingNotification() {
-        if (this.closingNotification) {
-            this.closingNotification.unsubscribe();
-        }
-    }
-    openWindow(innerSub = null) {
-        if (innerSub) {
-            this.remove(innerSub);
-            innerSub.unsubscribe();
-        }
-        const prevWindow = this.window;
-        if (prevWindow) {
-            prevWindow.complete();
-        }
-        const window = this.window = new Subject();
-        this.destination.next(window);
-        let closingNotifier;
-        try {
-            const { closingSelector } = this;
-            closingNotifier = closingSelector();
-        }
-        catch (e) {
-            this.destination.error(e);
-            this.window.error(e);
-            return;
-        }
-        this.add(this.closingNotification = subscribeToResult(this, closingNotifier));
-    }
-}
-//# sourceMappingURL=windowWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/windowWhen.js.map b/node_modules/rxjs/_esm2015/internal/operators/windowWhen.js.map
deleted file mode 100644
index d674ad3..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/windowWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowWhen.js","sources":["../../../src/internal/operators/windowWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/withLatestFrom.js b/node_modules/rxjs/_esm2015/internal/operators/withLatestFrom.js
deleted file mode 100644
index fe47ae7..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/withLatestFrom.js
+++ /dev/null
@@ -1,73 +0,0 @@
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function withLatestFrom(...args) {
-    return (source) => {
-        let project;
-        if (typeof args[args.length - 1] === 'function') {
-            project = args.pop();
-        }
-        const observables = args;
-        return source.lift(new WithLatestFromOperator(observables, project));
-    };
-}
-class WithLatestFromOperator {
-    constructor(observables, project) {
-        this.observables = observables;
-        this.project = project;
-    }
-    call(subscriber, source) {
-        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));
-    }
-}
-class WithLatestFromSubscriber extends OuterSubscriber {
-    constructor(destination, observables, project) {
-        super(destination);
-        this.observables = observables;
-        this.project = project;
-        this.toRespond = [];
-        const len = observables.length;
-        this.values = new Array(len);
-        for (let i = 0; i < len; i++) {
-            this.toRespond.push(i);
-        }
-        for (let i = 0; i < len; i++) {
-            let observable = observables[i];
-            this.add(subscribeToResult(this, observable, observable, i));
-        }
-    }
-    notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values[outerIndex] = innerValue;
-        const toRespond = this.toRespond;
-        if (toRespond.length > 0) {
-            const found = toRespond.indexOf(outerIndex);
-            if (found !== -1) {
-                toRespond.splice(found, 1);
-            }
-        }
-    }
-    notifyComplete() {
-    }
-    _next(value) {
-        if (this.toRespond.length === 0) {
-            const args = [value, ...this.values];
-            if (this.project) {
-                this._tryProject(args);
-            }
-            else {
-                this.destination.next(args);
-            }
-        }
-    }
-    _tryProject(args) {
-        let result;
-        try {
-            result = this.project.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    }
-}
-//# sourceMappingURL=withLatestFrom.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/withLatestFrom.js.map b/node_modules/rxjs/_esm2015/internal/operators/withLatestFrom.js.map
deleted file mode 100644
index 821c236..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/withLatestFrom.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"withLatestFrom.js","sources":["../../../src/internal/operators/withLatestFrom.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/zip.js b/node_modules/rxjs/_esm2015/internal/operators/zip.js
deleted file mode 100644
index 1c6997e..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/zip.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import { zip as zipStatic } from '../observable/zip';
-export function zip(...observables) {
-    return function zipOperatorFunction(source) {
-        return source.lift.call(zipStatic(source, ...observables));
-    };
-}
-//# sourceMappingURL=zip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/zip.js.map b/node_modules/rxjs/_esm2015/internal/operators/zip.js.map
deleted file mode 100644
index 5c9e47b..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/zip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zip.js","sources":["../../../src/internal/operators/zip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAsCrD,MAAM,UAAU,GAAG,CAAO,GAAG,WAAyE;IACpG,OAAO,SAAS,mBAAmB,CAAC,MAAqB;QACvD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAI,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/operators/zipAll.js b/node_modules/rxjs/_esm2015/internal/operators/zipAll.js
deleted file mode 100644
index b3a0c7a..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/zipAll.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { ZipOperator } from '../observable/zip';
-export function zipAll(project) {
-    return (source) => source.lift(new ZipOperator(project));
-}
-//# sourceMappingURL=zipAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/operators/zipAll.js.map b/node_modules/rxjs/_esm2015/internal/operators/zipAll.js.map
deleted file mode 100644
index a9cb659..0000000
--- a/node_modules/rxjs/_esm2015/internal/operators/zipAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zipAll.js","sources":["../../../src/internal/operators/zipAll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAShD,MAAM,UAAU,MAAM,CAAO,OAAsC;IACjE,OAAO,CAAC,MAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1E,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduled/scheduleArray.js b/node_modules/rxjs/_esm2015/internal/scheduled/scheduleArray.js
deleted file mode 100644
index 4604543..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduled/scheduleArray.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-export function scheduleArray(input, scheduler) {
-    return new Observable(subscriber => {
-        const sub = new Subscription();
-        let i = 0;
-        sub.add(scheduler.schedule(function () {
-            if (i === input.length) {
-                subscriber.complete();
-                return;
-            }
-            subscriber.next(input[i++]);
-            if (!subscriber.closed) {
-                sub.add(this.schedule());
-            }
-        }));
-        return sub;
-    });
-}
-//# sourceMappingURL=scheduleArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduled/scheduleArray.js.map b/node_modules/rxjs/_esm2015/internal/scheduled/scheduleArray.js.map
deleted file mode 100644
index 661fe67..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduled/scheduleArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scheduleArray.js","sources":["../../../src/internal/scheduled/scheduleArray.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,UAAU,aAAa,CAAI,KAAmB,EAAE,SAAwB;IAC5E,OAAO,IAAI,UAAU,CAAI,UAAU,CAAC,EAAE;QACpC,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;YACzB,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE;gBACtB,UAAU,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO;aACR;YACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;gBACtB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;aAC1B;QACH,CAAC,CAAC,CAAC,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduled/scheduleIterable.js b/node_modules/rxjs/_esm2015/internal/scheduled/scheduleIterable.js
deleted file mode 100644
index 452d40d..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduled/scheduleIterable.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { iterator as Symbol_iterator } from '../symbol/iterator';
-export function scheduleIterable(input, scheduler) {
-    if (!input) {
-        throw new Error('Iterable cannot be null');
-    }
-    return new Observable(subscriber => {
-        const sub = new Subscription();
-        let iterator;
-        sub.add(() => {
-            if (iterator && typeof iterator.return === 'function') {
-                iterator.return();
-            }
-        });
-        sub.add(scheduler.schedule(() => {
-            iterator = input[Symbol_iterator]();
-            sub.add(scheduler.schedule(function () {
-                if (subscriber.closed) {
-                    return;
-                }
-                let value;
-                let done;
-                try {
-                    const result = iterator.next();
-                    value = result.value;
-                    done = result.done;
-                }
-                catch (err) {
-                    subscriber.error(err);
-                    return;
-                }
-                if (done) {
-                    subscriber.complete();
-                }
-                else {
-                    subscriber.next(value);
-                    this.schedule();
-                }
-            }));
-        }));
-        return sub;
-    });
-}
-//# sourceMappingURL=scheduleIterable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduled/scheduleIterable.js.map b/node_modules/rxjs/_esm2015/internal/scheduled/scheduleIterable.js.map
deleted file mode 100644
index a9b24f6..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduled/scheduleIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scheduleIterable.js","sources":["../../../src/internal/scheduled/scheduleIterable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,UAAU,gBAAgB,CAAI,KAAkB,EAAE,SAAwB;IAC9E,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;KAC5C;IACD,OAAO,IAAI,UAAU,CAAI,UAAU,CAAC,EAAE;QACpC,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,QAAqB,CAAC;QAC1B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;YAEX,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE;gBACrD,QAAQ,CAAC,MAAM,EAAE,CAAC;aACnB;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE;YAC9B,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;gBACzB,IAAI,UAAU,CAAC,MAAM,EAAE;oBACrB,OAAO;iBACR;gBACD,IAAI,KAAQ,CAAC;gBACb,IAAI,IAAa,CAAC;gBAClB,IAAI;oBACF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;oBAC/B,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;oBACrB,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;iBACpB;gBAAC,OAAO,GAAG,EAAE;oBACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACtB,OAAO;iBACR;gBACD,IAAI,IAAI,EAAE;oBACR,UAAU,CAAC,QAAQ,EAAE,CAAC;iBACvB;qBAAM;oBACL,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;iBACjB;YACH,CAAC,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,CAAC,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduled/scheduleObservable.js b/node_modules/rxjs/_esm2015/internal/scheduled/scheduleObservable.js
deleted file mode 100644
index 96ae599..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduled/scheduleObservable.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { observable as Symbol_observable } from '../symbol/observable';
-export function scheduleObservable(input, scheduler) {
-    return new Observable(subscriber => {
-        const sub = new Subscription();
-        sub.add(scheduler.schedule(() => {
-            const observable = input[Symbol_observable]();
-            sub.add(observable.subscribe({
-                next(value) { sub.add(scheduler.schedule(() => subscriber.next(value))); },
-                error(err) { sub.add(scheduler.schedule(() => subscriber.error(err))); },
-                complete() { sub.add(scheduler.schedule(() => subscriber.complete())); },
-            }));
-        }));
-        return sub;
-    });
-}
-//# sourceMappingURL=scheduleObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduled/scheduleObservable.js.map b/node_modules/rxjs/_esm2015/internal/scheduled/scheduleObservable.js.map
deleted file mode 100644
index adddb70..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduled/scheduleObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scheduleObservable.js","sources":["../../../src/internal/scheduled/scheduleObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGvE,MAAM,UAAU,kBAAkB,CAAI,KAA2B,EAAE,SAAwB;IACzF,OAAO,IAAI,UAAU,CAAI,UAAU,CAAC,EAAE;QACpC,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE;YAC9B,MAAM,UAAU,GAAoB,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;gBAC3B,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1E,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,QAAQ,KAAK,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aACzE,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,CAAC,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduled/schedulePromise.js b/node_modules/rxjs/_esm2015/internal/scheduled/schedulePromise.js
deleted file mode 100644
index 68d4938..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduled/schedulePromise.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-export function schedulePromise(input, scheduler) {
-    return new Observable(subscriber => {
-        const sub = new Subscription();
-        sub.add(scheduler.schedule(() => input.then(value => {
-            sub.add(scheduler.schedule(() => {
-                subscriber.next(value);
-                sub.add(scheduler.schedule(() => subscriber.complete()));
-            }));
-        }, err => {
-            sub.add(scheduler.schedule(() => subscriber.error(err)));
-        })));
-        return sub;
-    });
-}
-//# sourceMappingURL=schedulePromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduled/schedulePromise.js.map b/node_modules/rxjs/_esm2015/internal/scheduled/schedulePromise.js.map
deleted file mode 100644
index 2ddd8a2..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduled/schedulePromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"schedulePromise.js","sources":["../../../src/internal/scheduled/schedulePromise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,UAAU,eAAe,CAAI,KAAqB,EAAE,SAAwB;IAChF,OAAO,IAAI,UAAU,CAAI,UAAU,CAAC,EAAE;QACpC,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CACzC,KAAK,CAAC,EAAE;YACN,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE;gBAC9B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC,CAAC;QACN,CAAC,EACD,GAAG,CAAC,EAAE;YACJ,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,CACF,CAAC,CAAC,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduled/scheduled.js b/node_modules/rxjs/_esm2015/internal/scheduled/scheduled.js
deleted file mode 100644
index 554d1a2..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduled/scheduled.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { scheduleObservable } from './scheduleObservable';
-import { schedulePromise } from './schedulePromise';
-import { scheduleArray } from './scheduleArray';
-import { scheduleIterable } from './scheduleIterable';
-import { isInteropObservable } from '../util/isInteropObservable';
-import { isPromise } from '../util/isPromise';
-import { isArrayLike } from '../util/isArrayLike';
-import { isIterable } from '../util/isIterable';
-export function scheduled(input, scheduler) {
-    if (input != null) {
-        if (isInteropObservable(input)) {
-            return scheduleObservable(input, scheduler);
-        }
-        else if (isPromise(input)) {
-            return schedulePromise(input, scheduler);
-        }
-        else if (isArrayLike(input)) {
-            return scheduleArray(input, scheduler);
-        }
-        else if (isIterable(input) || typeof input === 'string') {
-            return scheduleIterable(input, scheduler);
-        }
-    }
-    throw new TypeError((input !== null && typeof input || input) + ' is not observable');
-}
-//# sourceMappingURL=scheduled.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduled/scheduled.js.map b/node_modules/rxjs/_esm2015/internal/scheduled/scheduled.js.map
deleted file mode 100644
index d4e76f8..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduled/scheduled.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scheduled.js","sources":["../../../src/internal/scheduled/scheduled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAahD,MAAM,UAAU,SAAS,CAAI,KAAyB,EAAE,SAAwB;IAC9E,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;YAC9B,OAAO,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SAC7C;aAAM,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE;YAC3B,OAAO,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SAC1C;aAAM,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;YAC7B,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SACxC;aAAO,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC1D,OAAO,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SAC3C;KACF;IAED,MAAM,IAAI,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,KAAK,CAAC,GAAG,oBAAoB,CAAC,CAAC;AACxF,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/Action.js b/node_modules/rxjs/_esm2015/internal/scheduler/Action.js
deleted file mode 100644
index 4ded474..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/Action.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Subscription } from '../Subscription';
-export class Action extends Subscription {
-    constructor(scheduler, work) {
-        super();
-    }
-    schedule(state, delay = 0) {
-        return this;
-    }
-}
-//# sourceMappingURL=Action.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/Action.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/Action.js.map
deleted file mode 100644
index c542852..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/Action.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Action.js","sources":["../../../src/internal/scheduler/Action.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAiB/C,MAAM,OAAO,MAAU,SAAQ,YAAY;IACzC,YAAY,SAAoB,EAAE,IAAmD;QACnF,KAAK,EAAE,CAAC;IACV,CAAC;IAWM,QAAQ,CAAC,KAAS,EAAE,QAAgB,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameAction.js b/node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameAction.js
deleted file mode 100644
index e0b7ffa..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameAction.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-export class AnimationFrameAction extends AsyncAction {
-    constructor(scheduler, work) {
-        super(scheduler, work);
-        this.scheduler = scheduler;
-        this.work = work;
-    }
-    requestAsyncId(scheduler, id, delay = 0) {
-        if (delay !== null && delay > 0) {
-            return super.requestAsyncId(scheduler, id, delay);
-        }
-        scheduler.actions.push(this);
-        return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(() => scheduler.flush(null)));
-    }
-    recycleAsyncId(scheduler, id, delay = 0) {
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return super.recycleAsyncId(scheduler, id, delay);
-        }
-        if (scheduler.actions.length === 0) {
-            cancelAnimationFrame(id);
-            scheduler.scheduled = undefined;
-        }
-        return undefined;
-    }
-}
-//# sourceMappingURL=AnimationFrameAction.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameAction.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameAction.js.map
deleted file mode 100644
index c9dabf4..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameAction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AnimationFrameAction.js","sources":["../../../src/internal/scheduler/AnimationFrameAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAS5C,MAAM,OAAO,oBAAwB,SAAQ,WAAc;IAEzD,YAAsB,SAAkC,EAClC,IAAmD;QACvE,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAFH,cAAS,GAAT,SAAS,CAAyB;QAClC,SAAI,GAAJ,IAAI,CAA+C;IAEzE,CAAC;IAES,cAAc,CAAC,SAAkC,EAAE,EAAQ,EAAE,QAAgB,CAAC;QAEtF,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE;YAC/B,OAAO,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAED,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAI7B,OAAO,SAAS,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,qBAAqB,CACxE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACS,cAAc,CAAC,SAAkC,EAAE,EAAQ,EAAE,QAAgB,CAAC;QAItF,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE;YACvE,OAAO,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAID,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YAClC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YACzB,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;SACjC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameScheduler.js b/node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameScheduler.js
deleted file mode 100644
index cb658cb..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameScheduler.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { AsyncScheduler } from './AsyncScheduler';
-export class AnimationFrameScheduler extends AsyncScheduler {
-    flush(action) {
-        this.active = true;
-        this.scheduled = undefined;
-        const { actions } = this;
-        let error;
-        let index = -1;
-        let count = actions.length;
-        action = action || actions.shift();
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (++index < count && (action = actions.shift()));
-        this.active = false;
-        if (error) {
-            while (++index < count && (action = actions.shift())) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    }
-}
-//# sourceMappingURL=AnimationFrameScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameScheduler.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameScheduler.js.map
deleted file mode 100644
index 88d43ad..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/AnimationFrameScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AnimationFrameScheduler.js","sources":["../../../src/internal/scheduler/AnimationFrameScheduler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,OAAO,uBAAwB,SAAQ,cAAc;IAClD,KAAK,CAAC,MAAyB;QAEpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;QACvB,IAAI,KAAU,CAAC;QACf,IAAI,KAAK,GAAW,CAAC,CAAC,CAAC;QACvB,IAAI,KAAK,GAAW,OAAO,CAAC,MAAM,CAAC;QACnC,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAEnC,GAAG;YACD,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtD,MAAM;aACP;SACF,QAAQ,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;QAExD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,KAAK,EAAE;YACT,OAAO,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;gBACpD,MAAM,CAAC,WAAW,EAAE,CAAC;aACtB;YACD,MAAM,KAAK,CAAC;SACb;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/AsapAction.js b/node_modules/rxjs/_esm2015/internal/scheduler/AsapAction.js
deleted file mode 100644
index 1d6a677..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/AsapAction.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import { Immediate } from '../util/Immediate';
-import { AsyncAction } from './AsyncAction';
-export class AsapAction extends AsyncAction {
-    constructor(scheduler, work) {
-        super(scheduler, work);
-        this.scheduler = scheduler;
-        this.work = work;
-    }
-    requestAsyncId(scheduler, id, delay = 0) {
-        if (delay !== null && delay > 0) {
-            return super.requestAsyncId(scheduler, id, delay);
-        }
-        scheduler.actions.push(this);
-        return scheduler.scheduled || (scheduler.scheduled = Immediate.setImmediate(scheduler.flush.bind(scheduler, null)));
-    }
-    recycleAsyncId(scheduler, id, delay = 0) {
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return super.recycleAsyncId(scheduler, id, delay);
-        }
-        if (scheduler.actions.length === 0) {
-            Immediate.clearImmediate(id);
-            scheduler.scheduled = undefined;
-        }
-        return undefined;
-    }
-}
-//# sourceMappingURL=AsapAction.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/AsapAction.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/AsapAction.js.map
deleted file mode 100644
index a74d5d7..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/AsapAction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsapAction.js","sources":["../../../src/internal/scheduler/AsapAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQ5C,MAAM,OAAO,UAAc,SAAQ,WAAc;IAE/C,YAAsB,SAAwB,EACxB,IAAmD;QACvE,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAFH,cAAS,GAAT,SAAS,CAAe;QACxB,SAAI,GAAJ,IAAI,CAA+C;IAEzE,CAAC;IAES,cAAc,CAAC,SAAwB,EAAE,EAAQ,EAAE,QAAgB,CAAC;QAE5E,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE;YAC/B,OAAO,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAED,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAI7B,OAAO,SAAS,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,CACzE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CACtC,CAAC,CAAC;IACL,CAAC;IACS,cAAc,CAAC,SAAwB,EAAE,EAAQ,EAAE,QAAgB,CAAC;QAI5E,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE;YACvE,OAAO,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAID,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YAClC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC7B,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;SACjC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/AsapScheduler.js b/node_modules/rxjs/_esm2015/internal/scheduler/AsapScheduler.js
deleted file mode 100644
index d4f637d..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/AsapScheduler.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { AsyncScheduler } from './AsyncScheduler';
-export class AsapScheduler extends AsyncScheduler {
-    flush(action) {
-        this.active = true;
-        this.scheduled = undefined;
-        const { actions } = this;
-        let error;
-        let index = -1;
-        let count = actions.length;
-        action = action || actions.shift();
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (++index < count && (action = actions.shift()));
-        this.active = false;
-        if (error) {
-            while (++index < count && (action = actions.shift())) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    }
-}
-//# sourceMappingURL=AsapScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/AsapScheduler.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/AsapScheduler.js.map
deleted file mode 100644
index c8727d8..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/AsapScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsapScheduler.js","sources":["../../../src/internal/scheduler/AsapScheduler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,OAAO,aAAc,SAAQ,cAAc;IACxC,KAAK,CAAC,MAAyB;QAEpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;QACvB,IAAI,KAAU,CAAC;QACf,IAAI,KAAK,GAAW,CAAC,CAAC,CAAC;QACvB,IAAI,KAAK,GAAW,OAAO,CAAC,MAAM,CAAC;QACnC,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAEnC,GAAG;YACD,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtD,MAAM;aACP;SACF,QAAQ,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;QAExD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,KAAK,EAAE;YACT,OAAO,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;gBACpD,MAAM,CAAC,WAAW,EAAE,CAAC;aACtB;YACD,MAAM,KAAK,CAAC;SACb;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/AsyncAction.js b/node_modules/rxjs/_esm2015/internal/scheduler/AsyncAction.js
deleted file mode 100644
index 66c2936..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/AsyncAction.js
+++ /dev/null
@@ -1,80 +0,0 @@
-import { Action } from './Action';
-export class AsyncAction extends Action {
-    constructor(scheduler, work) {
-        super(scheduler, work);
-        this.scheduler = scheduler;
-        this.work = work;
-        this.pending = false;
-    }
-    schedule(state, delay = 0) {
-        if (this.closed) {
-            return this;
-        }
-        this.state = state;
-        const id = this.id;
-        const scheduler = this.scheduler;
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, delay);
-        }
-        this.pending = true;
-        this.delay = delay;
-        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
-        return this;
-    }
-    requestAsyncId(scheduler, id, delay = 0) {
-        return setInterval(scheduler.flush.bind(scheduler, this), delay);
-    }
-    recycleAsyncId(scheduler, id, delay = 0) {
-        if (delay !== null && this.delay === delay && this.pending === false) {
-            return id;
-        }
-        clearInterval(id);
-        return undefined;
-    }
-    execute(state, delay) {
-        if (this.closed) {
-            return new Error('executing a cancelled action');
-        }
-        this.pending = false;
-        const error = this._execute(state, delay);
-        if (error) {
-            return error;
-        }
-        else if (this.pending === false && this.id != null) {
-            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
-        }
-    }
-    _execute(state, delay) {
-        let errored = false;
-        let errorValue = undefined;
-        try {
-            this.work(state);
-        }
-        catch (e) {
-            errored = true;
-            errorValue = !!e && e || new Error(e);
-        }
-        if (errored) {
-            this.unsubscribe();
-            return errorValue;
-        }
-    }
-    _unsubscribe() {
-        const id = this.id;
-        const scheduler = this.scheduler;
-        const actions = scheduler.actions;
-        const index = actions.indexOf(this);
-        this.work = null;
-        this.state = null;
-        this.pending = false;
-        this.scheduler = null;
-        if (index !== -1) {
-            actions.splice(index, 1);
-        }
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, null);
-        }
-        this.delay = null;
-    }
-}
-//# sourceMappingURL=AsyncAction.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/AsyncAction.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/AsyncAction.js.map
deleted file mode 100644
index 081998e..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/AsyncAction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsyncAction.js","sources":["../../../src/internal/scheduler/AsyncAction.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/AsyncScheduler.js b/node_modules/rxjs/_esm2015/internal/scheduler/AsyncScheduler.js
deleted file mode 100644
index 828192f..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/AsyncScheduler.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import { Scheduler } from '../Scheduler';
-export class AsyncScheduler extends Scheduler {
-    constructor(SchedulerAction, now = Scheduler.now) {
-        super(SchedulerAction, () => {
-            if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
-                return AsyncScheduler.delegate.now();
-            }
-            else {
-                return now();
-            }
-        });
-        this.actions = [];
-        this.active = false;
-        this.scheduled = undefined;
-    }
-    schedule(work, delay = 0, state) {
-        if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
-            return AsyncScheduler.delegate.schedule(work, delay, state);
-        }
-        else {
-            return super.schedule(work, delay, state);
-        }
-    }
-    flush(action) {
-        const { actions } = this;
-        if (this.active) {
-            actions.push(action);
-            return;
-        }
-        let error;
-        this.active = true;
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (action = actions.shift());
-        this.active = false;
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    }
-}
-//# sourceMappingURL=AsyncScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/AsyncScheduler.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/AsyncScheduler.js.map
deleted file mode 100644
index 2fd6cd5..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/AsyncScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsyncScheduler.js","sources":["../../../src/internal/scheduler/AsyncScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAMzC,MAAM,OAAO,cAAe,SAAQ,SAAS;IAmB3C,YAAY,eAA8B,EAC9B,MAAoB,SAAS,CAAC,GAAG;QAC3C,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE;YAC1B,IAAI,cAAc,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,KAAK,IAAI,EAAE;gBAC/D,OAAO,cAAc,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;aACtC;iBAAM;gBACL,OAAO,GAAG,EAAE,CAAC;aACd;QACH,CAAC,CAAC,CAAC;QAzBE,YAAO,GAA4B,EAAE,CAAC;QAOtC,WAAM,GAAY,KAAK,CAAC;QAQxB,cAAS,GAAQ,SAAS,CAAC;IAWlC,CAAC;IAEM,QAAQ,CAAI,IAAmD,EAAE,QAAgB,CAAC,EAAE,KAAS;QAClG,IAAI,cAAc,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,KAAK,IAAI,EAAE;YAC/D,OAAO,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC7D;aAAM;YACL,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC3C;IACH,CAAC;IAEM,KAAK,CAAC,MAAwB;QAEnC,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;QAEvB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO;SACR;QAED,IAAI,KAAU,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,GAAG;YACD,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtD,MAAM;aACP;SACF,QAAQ,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE;QAEnC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,KAAK,EAAE;YACT,OAAO,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE;gBAC/B,MAAM,CAAC,WAAW,EAAE,CAAC;aACtB;YACD,MAAM,KAAK,CAAC;SACb;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/QueueAction.js b/node_modules/rxjs/_esm2015/internal/scheduler/QueueAction.js
deleted file mode 100644
index 3b3177a..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/QueueAction.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-export class QueueAction extends AsyncAction {
-    constructor(scheduler, work) {
-        super(scheduler, work);
-        this.scheduler = scheduler;
-        this.work = work;
-    }
-    schedule(state, delay = 0) {
-        if (delay > 0) {
-            return super.schedule(state, delay);
-        }
-        this.delay = delay;
-        this.state = state;
-        this.scheduler.flush(this);
-        return this;
-    }
-    execute(state, delay) {
-        return (delay > 0 || this.closed) ?
-            super.execute(state, delay) :
-            this._execute(state, delay);
-    }
-    requestAsyncId(scheduler, id, delay = 0) {
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return super.requestAsyncId(scheduler, id, delay);
-        }
-        return scheduler.flush(this);
-    }
-}
-//# sourceMappingURL=QueueAction.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/QueueAction.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/QueueAction.js.map
deleted file mode 100644
index af07a1e..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/QueueAction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"QueueAction.js","sources":["../../../src/internal/scheduler/QueueAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,MAAM,OAAO,WAAe,SAAQ,WAAc;IAEhD,YAAsB,SAAyB,EACzB,IAAmD;QACvE,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAFH,cAAS,GAAT,SAAS,CAAgB;QACzB,SAAI,GAAJ,IAAI,CAA+C;IAEzE,CAAC;IAEM,QAAQ,CAAC,KAAS,EAAE,QAAgB,CAAC;QAC1C,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACrC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,OAAO,CAAC,KAAQ,EAAE,KAAa;QACpC,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACjC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAE;IACjC,CAAC;IAES,cAAc,CAAC,SAAyB,EAAE,EAAQ,EAAE,QAAgB,CAAC;QAI7E,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE;YACvE,OAAO,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAED,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/QueueScheduler.js b/node_modules/rxjs/_esm2015/internal/scheduler/QueueScheduler.js
deleted file mode 100644
index cc1fb4d..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/QueueScheduler.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import { AsyncScheduler } from './AsyncScheduler';
-export class QueueScheduler extends AsyncScheduler {
-}
-//# sourceMappingURL=QueueScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/QueueScheduler.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/QueueScheduler.js.map
deleted file mode 100644
index c32c0b1..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/QueueScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"QueueScheduler.js","sources":["../../../src/internal/scheduler/QueueScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,OAAO,cAAe,SAAQ,cAAc;CACjD"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/VirtualTimeScheduler.js b/node_modules/rxjs/_esm2015/internal/scheduler/VirtualTimeScheduler.js
deleted file mode 100644
index ebce6db..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/VirtualTimeScheduler.js
+++ /dev/null
@@ -1,82 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { AsyncScheduler } from './AsyncScheduler';
-export class VirtualTimeScheduler extends AsyncScheduler {
-    constructor(SchedulerAction = VirtualAction, maxFrames = Number.POSITIVE_INFINITY) {
-        super(SchedulerAction, () => this.frame);
-        this.maxFrames = maxFrames;
-        this.frame = 0;
-        this.index = -1;
-    }
-    flush() {
-        const { actions, maxFrames } = this;
-        let error, action;
-        while ((action = actions[0]) && action.delay <= maxFrames) {
-            actions.shift();
-            this.frame = action.delay;
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        }
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    }
-}
-VirtualTimeScheduler.frameTimeFactor = 10;
-export class VirtualAction extends AsyncAction {
-    constructor(scheduler, work, index = scheduler.index += 1) {
-        super(scheduler, work);
-        this.scheduler = scheduler;
-        this.work = work;
-        this.index = index;
-        this.active = true;
-        this.index = scheduler.index = index;
-    }
-    schedule(state, delay = 0) {
-        if (!this.id) {
-            return super.schedule(state, delay);
-        }
-        this.active = false;
-        const action = new VirtualAction(this.scheduler, this.work);
-        this.add(action);
-        return action.schedule(state, delay);
-    }
-    requestAsyncId(scheduler, id, delay = 0) {
-        this.delay = scheduler.frame + delay;
-        const { actions } = scheduler;
-        actions.push(this);
-        actions.sort(VirtualAction.sortActions);
-        return true;
-    }
-    recycleAsyncId(scheduler, id, delay = 0) {
-        return undefined;
-    }
-    _execute(state, delay) {
-        if (this.active === true) {
-            return super._execute(state, delay);
-        }
-    }
-    static sortActions(a, b) {
-        if (a.delay === b.delay) {
-            if (a.index === b.index) {
-                return 0;
-            }
-            else if (a.index > b.index) {
-                return 1;
-            }
-            else {
-                return -1;
-            }
-        }
-        else if (a.delay > b.delay) {
-            return 1;
-        }
-        else {
-            return -1;
-        }
-    }
-}
-//# sourceMappingURL=VirtualTimeScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/VirtualTimeScheduler.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/VirtualTimeScheduler.js.map
deleted file mode 100644
index 9b56e6e..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/VirtualTimeScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"VirtualTimeScheduler.js","sources":["../../../src/internal/scheduler/VirtualTimeScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,MAAM,OAAO,oBAAqB,SAAQ,cAAc;IAOtD,YAAY,kBAAsC,aAAoB,EACnD,YAAoB,MAAM,CAAC,iBAAiB;QAC7D,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QADxB,cAAS,GAAT,SAAS,CAAmC;QAJxD,UAAK,GAAW,CAAC,CAAC;QAClB,UAAK,GAAW,CAAC,CAAC,CAAC;IAK1B,CAAC;IAOM,KAAK;QAEV,MAAM,EAAC,OAAO,EAAE,SAAS,EAAC,GAAG,IAAI,CAAC;QAClC,IAAI,KAAU,EAAE,MAAwB,CAAC;QAEzC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE;YACzD,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAE1B,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtD,MAAM;aACP;SACF;QAED,IAAI,KAAK,EAAE;YACT,OAAO,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE;gBAC/B,MAAM,CAAC,WAAW,EAAE,CAAC;aACtB;YACD,MAAM,KAAK,CAAC;SACb;IACH,CAAC;;AAnCgB,oCAAe,GAAW,EAAE,CAAC;AA0ChD,MAAM,OAAO,aAAiB,SAAQ,WAAc;IAIlD,YAAsB,SAA+B,EAC/B,IAAmD,EACnD,QAAgB,SAAS,CAAC,KAAK,IAAI,CAAC;QACxD,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAHH,cAAS,GAAT,SAAS,CAAsB;QAC/B,SAAI,GAAJ,IAAI,CAA+C;QACnD,UAAK,GAAL,KAAK,CAA+B;QAJhD,WAAM,GAAY,IAAI,CAAC;QAM/B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;IACvC,CAAC;IAEM,QAAQ,CAAC,KAAS,EAAE,QAAgB,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;YACZ,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACrC;QACD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAKpB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjB,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAES,cAAc,CAAC,SAA+B,EAAE,EAAQ,EAAE,QAAgB,CAAC;QACnF,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;QACrC,MAAM,EAAC,OAAO,EAAC,GAAG,SAAS,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,OAAmC,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAES,cAAc,CAAC,SAA+B,EAAE,EAAQ,EAAE,QAAgB,CAAC;QACnF,OAAO,SAAS,CAAC;IACnB,CAAC;IAES,QAAQ,CAAC,KAAQ,EAAE,KAAa;QACxC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;YACxB,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACrC;IACH,CAAC;IAEM,MAAM,CAAC,WAAW,CAAI,CAAmB,EAAE,CAAmB;QACnE,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE;YACvB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE;gBACvB,OAAO,CAAC,CAAC;aACV;iBAAM,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE;gBAC5B,OAAO,CAAC,CAAC;aACV;iBAAM;gBACL,OAAO,CAAC,CAAC,CAAC;aACX;SACF;aAAM,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE;YAC5B,OAAO,CAAC,CAAC;SACV;aAAM;YACL,OAAO,CAAC,CAAC,CAAC;SACX;IACH,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/animationFrame.js b/node_modules/rxjs/_esm2015/internal/scheduler/animationFrame.js
deleted file mode 100644
index 76f7c88..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/animationFrame.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import { AnimationFrameAction } from './AnimationFrameAction';
-import { AnimationFrameScheduler } from './AnimationFrameScheduler';
-export const animationFrame = new AnimationFrameScheduler(AnimationFrameAction);
-//# sourceMappingURL=animationFrame.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/animationFrame.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/animationFrame.js.map
deleted file mode 100644
index 79ee601..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/animationFrame.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"animationFrame.js","sources":["../../../src/internal/scheduler/animationFrame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAsCpE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,uBAAuB,CAAC,oBAAoB,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/asap.js b/node_modules/rxjs/_esm2015/internal/scheduler/asap.js
deleted file mode 100644
index 348d17e..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/asap.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import { AsapAction } from './AsapAction';
-import { AsapScheduler } from './AsapScheduler';
-export const asap = new AsapScheduler(AsapAction);
-//# sourceMappingURL=asap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/asap.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/asap.js.map
deleted file mode 100644
index bb649f6..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/asap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"asap.js","sources":["../../../src/internal/scheduler/asap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAwChD,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/async.js b/node_modules/rxjs/_esm2015/internal/scheduler/async.js
deleted file mode 100644
index 2fa6636..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/async.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { AsyncScheduler } from './AsyncScheduler';
-export const async = new AsyncScheduler(AsyncAction);
-//# sourceMappingURL=async.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/async.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/async.js.map
deleted file mode 100644
index c74d389..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/async.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"async.js","sources":["../../../src/internal/scheduler/async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAqDlD,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/queue.js b/node_modules/rxjs/_esm2015/internal/scheduler/queue.js
deleted file mode 100644
index 1a7edea..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/queue.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import { QueueAction } from './QueueAction';
-import { QueueScheduler } from './QueueScheduler';
-export const queue = new QueueScheduler(QueueAction);
-//# sourceMappingURL=queue.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/scheduler/queue.js.map b/node_modules/rxjs/_esm2015/internal/scheduler/queue.js.map
deleted file mode 100644
index 28e8897..0000000
--- a/node_modules/rxjs/_esm2015/internal/scheduler/queue.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"queue.js","sources":["../../../src/internal/scheduler/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAqElD,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/symbol/iterator.js b/node_modules/rxjs/_esm2015/internal/symbol/iterator.js
deleted file mode 100644
index 33fadd2..0000000
--- a/node_modules/rxjs/_esm2015/internal/symbol/iterator.js
+++ /dev/null
@@ -1,9 +0,0 @@
-export function getSymbolIterator() {
-    if (typeof Symbol !== 'function' || !Symbol.iterator) {
-        return '@@iterator';
-    }
-    return Symbol.iterator;
-}
-export const iterator = getSymbolIterator();
-export const $$iterator = iterator;
-//# sourceMappingURL=iterator.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/symbol/iterator.js.map b/node_modules/rxjs/_esm2015/internal/symbol/iterator.js.map
deleted file mode 100644
index 9670bee..0000000
--- a/node_modules/rxjs/_esm2015/internal/symbol/iterator.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"iterator.js","sources":["../../../src/internal/symbol/iterator.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB;IAC/B,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;QACpD,OAAO,YAAmB,CAAC;KAC5B;IAED,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;AAK5C,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/symbol/observable.js b/node_modules/rxjs/_esm2015/internal/symbol/observable.js
deleted file mode 100644
index 0075890..0000000
--- a/node_modules/rxjs/_esm2015/internal/symbol/observable.js
+++ /dev/null
@@ -1,2 +0,0 @@
-export const observable = (() => typeof Symbol === 'function' && Symbol.observable || '@@observable')();
-//# sourceMappingURL=observable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/symbol/observable.js.map b/node_modules/rxjs/_esm2015/internal/symbol/observable.js.map
deleted file mode 100644
index 08d4eef..0000000
--- a/node_modules/rxjs/_esm2015/internal/symbol/observable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"observable.js","sources":["../../../src/internal/symbol/observable.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,UAAU,IAAI,cAAc,CAAC,EAAE,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/symbol/rxSubscriber.js b/node_modules/rxjs/_esm2015/internal/symbol/rxSubscriber.js
deleted file mode 100644
index 64d5dc6..0000000
--- a/node_modules/rxjs/_esm2015/internal/symbol/rxSubscriber.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export const rxSubscriber = (() => typeof Symbol === 'function'
-    ? Symbol('rxSubscriber')
-    : '@@rxSubscriber_' + Math.random())();
-export const $$rxSubscriber = rxSubscriber;
-//# sourceMappingURL=rxSubscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/symbol/rxSubscriber.js.map b/node_modules/rxjs/_esm2015/internal/symbol/rxSubscriber.js.map
deleted file mode 100644
index 615f022..0000000
--- a/node_modules/rxjs/_esm2015/internal/symbol/rxSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"rxSubscriber.js","sources":["../../../src/internal/symbol/rxSubscriber.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,CAChC,OAAO,MAAM,KAAK,UAAU;IAC1B,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;IACxB,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;AAK3C,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/testing/ColdObservable.js b/node_modules/rxjs/_esm2015/internal/testing/ColdObservable.js
deleted file mode 100644
index 4bb5173..0000000
--- a/node_modules/rxjs/_esm2015/internal/testing/ColdObservable.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { SubscriptionLoggable } from './SubscriptionLoggable';
-import { applyMixins } from '../util/applyMixins';
-export class ColdObservable extends Observable {
-    constructor(messages, scheduler) {
-        super(function (subscriber) {
-            const observable = this;
-            const index = observable.logSubscribedFrame();
-            const subscription = new Subscription();
-            subscription.add(new Subscription(() => {
-                observable.logUnsubscribedFrame(index);
-            }));
-            observable.scheduleMessages(subscriber);
-            return subscription;
-        });
-        this.messages = messages;
-        this.subscriptions = [];
-        this.scheduler = scheduler;
-    }
-    scheduleMessages(subscriber) {
-        const messagesLength = this.messages.length;
-        for (let i = 0; i < messagesLength; i++) {
-            const message = this.messages[i];
-            subscriber.add(this.scheduler.schedule(({ message, subscriber }) => { message.notification.observe(subscriber); }, message.frame, { message, subscriber }));
-        }
-    }
-}
-applyMixins(ColdObservable, [SubscriptionLoggable]);
-//# sourceMappingURL=ColdObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/testing/ColdObservable.js.map b/node_modules/rxjs/_esm2015/internal/testing/ColdObservable.js.map
deleted file mode 100644
index a6f9c6d..0000000
--- a/node_modules/rxjs/_esm2015/internal/testing/ColdObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ColdObservable.js","sources":["../../../src/internal/testing/ColdObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQlD,MAAM,OAAO,cAAkB,SAAQ,UAAa;IAMlD,YAAmB,QAAuB,EAC9B,SAAoB;QAC9B,KAAK,CAAC,UAA+B,UAA2B;YAC9D,MAAM,UAAU,GAAsB,IAAW,CAAC;YAClD,MAAM,KAAK,GAAG,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAC9C,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;YACxC,YAAY,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,GAAG,EAAE;gBACrC,UAAU,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC,CAAC;YACJ,UAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACxC,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC;QAXc,aAAQ,GAAR,QAAQ,CAAe;QALnC,kBAAa,GAAsB,EAAE,CAAC;QAiB3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,gBAAgB,CAAC,UAA2B;QAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACjC,UAAU,CAAC,GAAG,CACZ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAChG,OAAO,CAAC,KAAK,EACb,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAC3B,CAAC;SACH;IACH,CAAC;CACF;AACD,WAAW,CAAC,cAAc,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/testing/HotObservable.js b/node_modules/rxjs/_esm2015/internal/testing/HotObservable.js
deleted file mode 100644
index e2ac763..0000000
--- a/node_modules/rxjs/_esm2015/internal/testing/HotObservable.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import { Subject } from '../Subject';
-import { Subscription } from '../Subscription';
-import { SubscriptionLoggable } from './SubscriptionLoggable';
-import { applyMixins } from '../util/applyMixins';
-export class HotObservable extends Subject {
-    constructor(messages, scheduler) {
-        super();
-        this.messages = messages;
-        this.subscriptions = [];
-        this.scheduler = scheduler;
-    }
-    _subscribe(subscriber) {
-        const subject = this;
-        const index = subject.logSubscribedFrame();
-        const subscription = new Subscription();
-        subscription.add(new Subscription(() => {
-            subject.logUnsubscribedFrame(index);
-        }));
-        subscription.add(super._subscribe(subscriber));
-        return subscription;
-    }
-    setup() {
-        const subject = this;
-        const messagesLength = subject.messages.length;
-        for (var i = 0; i < messagesLength; i++) {
-            (() => {
-                var message = subject.messages[i];
-                subject.scheduler.schedule(() => { message.notification.observe(subject); }, message.frame);
-            })();
-        }
-    }
-}
-applyMixins(HotObservable, [SubscriptionLoggable]);
-//# sourceMappingURL=HotObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/testing/HotObservable.js.map b/node_modules/rxjs/_esm2015/internal/testing/HotObservable.js.map
deleted file mode 100644
index ac44f2a..0000000
--- a/node_modules/rxjs/_esm2015/internal/testing/HotObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"HotObservable.js","sources":["../../../src/internal/testing/HotObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOlD,MAAM,OAAO,aAAiB,SAAQ,OAAU;IAM9C,YAAmB,QAAuB,EAC9B,SAAoB;QAC9B,KAAK,EAAE,CAAC;QAFS,aAAQ,GAAR,QAAQ,CAAe;QALnC,kBAAa,GAAsB,EAAE,CAAC;QAQ3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAGD,UAAU,CAAC,UAA2B;QACpC,MAAM,OAAO,GAAqB,IAAI,CAAC;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACxC,YAAY,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,GAAG,EAAE;YACrC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC;QACJ,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK;QACH,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE;YACvC,CAAC,GAAG,EAAE;gBACJ,IAAI,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAElC,OAAO,CAAC,SAAS,CAAC,QAAQ,CACxB,GAAG,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAChD,OAAO,CAAC,KAAK,CACd,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;SACN;IACH,CAAC;CACF;AACD,WAAW,CAAC,aAAa,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/testing/SubscriptionLog.js b/node_modules/rxjs/_esm2015/internal/testing/SubscriptionLog.js
deleted file mode 100644
index c421751..0000000
--- a/node_modules/rxjs/_esm2015/internal/testing/SubscriptionLog.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export class SubscriptionLog {
-    constructor(subscribedFrame, unsubscribedFrame = Number.POSITIVE_INFINITY) {
-        this.subscribedFrame = subscribedFrame;
-        this.unsubscribedFrame = unsubscribedFrame;
-    }
-}
-//# sourceMappingURL=SubscriptionLog.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/testing/SubscriptionLog.js.map b/node_modules/rxjs/_esm2015/internal/testing/SubscriptionLog.js.map
deleted file mode 100644
index 8903b16..0000000
--- a/node_modules/rxjs/_esm2015/internal/testing/SubscriptionLog.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubscriptionLog.js","sources":["../../../src/internal/testing/SubscriptionLog.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IAC1B,YAAmB,eAAuB,EACvB,oBAA4B,MAAM,CAAC,iBAAiB;QADpD,oBAAe,GAAf,eAAe,CAAQ;QACvB,sBAAiB,GAAjB,iBAAiB,CAAmC;IACvE,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/testing/SubscriptionLoggable.js b/node_modules/rxjs/_esm2015/internal/testing/SubscriptionLoggable.js
deleted file mode 100644
index 08a00d7..0000000
--- a/node_modules/rxjs/_esm2015/internal/testing/SubscriptionLoggable.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { SubscriptionLog } from './SubscriptionLog';
-export class SubscriptionLoggable {
-    constructor() {
-        this.subscriptions = [];
-    }
-    logSubscribedFrame() {
-        this.subscriptions.push(new SubscriptionLog(this.scheduler.now()));
-        return this.subscriptions.length - 1;
-    }
-    logUnsubscribedFrame(index) {
-        const subscriptionLogs = this.subscriptions;
-        const oldSubscriptionLog = subscriptionLogs[index];
-        subscriptionLogs[index] = new SubscriptionLog(oldSubscriptionLog.subscribedFrame, this.scheduler.now());
-    }
-}
-//# sourceMappingURL=SubscriptionLoggable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/testing/SubscriptionLoggable.js.map b/node_modules/rxjs/_esm2015/internal/testing/SubscriptionLoggable.js.map
deleted file mode 100644
index 37f16be..0000000
--- a/node_modules/rxjs/_esm2015/internal/testing/SubscriptionLoggable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubscriptionLoggable.js","sources":["../../../src/internal/testing/SubscriptionLoggable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,OAAO,oBAAoB;IAAjC;QACS,kBAAa,GAAsB,EAAE,CAAC;IAgB/C,CAAC;IAbC,kBAAkB;QAChB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,oBAAoB,CAAC,KAAa;QAChC,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;QAC5C,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACnD,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,eAAe,CAC3C,kBAAkB,CAAC,eAAe,EAClC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CACrB,CAAC;IACJ,CAAC;CACF"}
diff --git a/node_modules/rxjs/_esm2015/internal/testing/TestMessage.js b/node_modules/rxjs/_esm2015/internal/testing/TestMessage.js
deleted file mode 100644
index 908175c..0000000
--- a/node_modules/rxjs/_esm2015/internal/testing/TestMessage.js
+++ /dev/null
@@ -1 +0,0 @@
-//# sourceMappingURL=TestMessage.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/testing/TestMessage.js.map b/node_modules/rxjs/_esm2015/internal/testing/TestMessage.js.map
deleted file mode 100644
index b19facd..0000000
--- a/node_modules/rxjs/_esm2015/internal/testing/TestMessage.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TestMessage.js","sources":["../../../src/internal/testing/TestMessage.ts"],"names":[],"mappings":""}
diff --git a/node_modules/rxjs/_esm2015/internal/testing/TestScheduler.js b/node_modules/rxjs/_esm2015/internal/testing/TestScheduler.js
deleted file mode 100644
index 3b8a55f..0000000
--- a/node_modules/rxjs/_esm2015/internal/testing/TestScheduler.js
+++ /dev/null
@@ -1,322 +0,0 @@
-import { Observable } from '../Observable';
-import { Notification } from '../Notification';
-import { ColdObservable } from './ColdObservable';
-import { HotObservable } from './HotObservable';
-import { SubscriptionLog } from './SubscriptionLog';
-import { VirtualTimeScheduler, VirtualAction } from '../scheduler/VirtualTimeScheduler';
-import { AsyncScheduler } from '../scheduler/AsyncScheduler';
-const defaultMaxFrame = 750;
-export class TestScheduler extends VirtualTimeScheduler {
-    constructor(assertDeepEqual) {
-        super(VirtualAction, defaultMaxFrame);
-        this.assertDeepEqual = assertDeepEqual;
-        this.hotObservables = [];
-        this.coldObservables = [];
-        this.flushTests = [];
-        this.runMode = false;
-    }
-    createTime(marbles) {
-        const indexOf = marbles.indexOf('|');
-        if (indexOf === -1) {
-            throw new Error('marble diagram for time should have a completion marker "|"');
-        }
-        return indexOf * TestScheduler.frameTimeFactor;
-    }
-    createColdObservable(marbles, values, error) {
-        if (marbles.indexOf('^') !== -1) {
-            throw new Error('cold observable cannot have subscription offset "^"');
-        }
-        if (marbles.indexOf('!') !== -1) {
-            throw new Error('cold observable cannot have unsubscription marker "!"');
-        }
-        const messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
-        const cold = new ColdObservable(messages, this);
-        this.coldObservables.push(cold);
-        return cold;
-    }
-    createHotObservable(marbles, values, error) {
-        if (marbles.indexOf('!') !== -1) {
-            throw new Error('hot observable cannot have unsubscription marker "!"');
-        }
-        const messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
-        const subject = new HotObservable(messages, this);
-        this.hotObservables.push(subject);
-        return subject;
-    }
-    materializeInnerObservable(observable, outerFrame) {
-        const messages = [];
-        observable.subscribe((value) => {
-            messages.push({ frame: this.frame - outerFrame, notification: Notification.createNext(value) });
-        }, (err) => {
-            messages.push({ frame: this.frame - outerFrame, notification: Notification.createError(err) });
-        }, () => {
-            messages.push({ frame: this.frame - outerFrame, notification: Notification.createComplete() });
-        });
-        return messages;
-    }
-    expectObservable(observable, subscriptionMarbles = null) {
-        const actual = [];
-        const flushTest = { actual, ready: false };
-        const subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);
-        const subscriptionFrame = subscriptionParsed.subscribedFrame === Number.POSITIVE_INFINITY ?
-            0 : subscriptionParsed.subscribedFrame;
-        const unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;
-        let subscription;
-        this.schedule(() => {
-            subscription = observable.subscribe(x => {
-                let value = x;
-                if (x instanceof Observable) {
-                    value = this.materializeInnerObservable(value, this.frame);
-                }
-                actual.push({ frame: this.frame, notification: Notification.createNext(value) });
-            }, (err) => {
-                actual.push({ frame: this.frame, notification: Notification.createError(err) });
-            }, () => {
-                actual.push({ frame: this.frame, notification: Notification.createComplete() });
-            });
-        }, subscriptionFrame);
-        if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {
-            this.schedule(() => subscription.unsubscribe(), unsubscriptionFrame);
-        }
-        this.flushTests.push(flushTest);
-        const { runMode } = this;
-        return {
-            toBe(marbles, values, errorValue) {
-                flushTest.ready = true;
-                flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);
-            }
-        };
-    }
-    expectSubscriptions(actualSubscriptionLogs) {
-        const flushTest = { actual: actualSubscriptionLogs, ready: false };
-        this.flushTests.push(flushTest);
-        const { runMode } = this;
-        return {
-            toBe(marbles) {
-                const marblesArray = (typeof marbles === 'string') ? [marbles] : marbles;
-                flushTest.ready = true;
-                flushTest.expected = marblesArray.map(marbles => TestScheduler.parseMarblesAsSubscriptions(marbles, runMode));
-            }
-        };
-    }
-    flush() {
-        const hotObservables = this.hotObservables;
-        while (hotObservables.length > 0) {
-            hotObservables.shift().setup();
-        }
-        super.flush();
-        this.flushTests = this.flushTests.filter(test => {
-            if (test.ready) {
-                this.assertDeepEqual(test.actual, test.expected);
-                return false;
-            }
-            return true;
-        });
-    }
-    static parseMarblesAsSubscriptions(marbles, runMode = false) {
-        if (typeof marbles !== 'string') {
-            return new SubscriptionLog(Number.POSITIVE_INFINITY);
-        }
-        const len = marbles.length;
-        let groupStart = -1;
-        let subscriptionFrame = Number.POSITIVE_INFINITY;
-        let unsubscriptionFrame = Number.POSITIVE_INFINITY;
-        let frame = 0;
-        for (let i = 0; i < len; i++) {
-            let nextFrame = frame;
-            const advanceFrameBy = (count) => {
-                nextFrame += count * this.frameTimeFactor;
-            };
-            const c = marbles[i];
-            switch (c) {
-                case ' ':
-                    if (!runMode) {
-                        advanceFrameBy(1);
-                    }
-                    break;
-                case '-':
-                    advanceFrameBy(1);
-                    break;
-                case '(':
-                    groupStart = frame;
-                    advanceFrameBy(1);
-                    break;
-                case ')':
-                    groupStart = -1;
-                    advanceFrameBy(1);
-                    break;
-                case '^':
-                    if (subscriptionFrame !== Number.POSITIVE_INFINITY) {
-                        throw new Error('found a second subscription point \'^\' in a ' +
-                            'subscription marble diagram. There can only be one.');
-                    }
-                    subscriptionFrame = groupStart > -1 ? groupStart : frame;
-                    advanceFrameBy(1);
-                    break;
-                case '!':
-                    if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {
-                        throw new Error('found a second subscription point \'^\' in a ' +
-                            'subscription marble diagram. There can only be one.');
-                    }
-                    unsubscriptionFrame = groupStart > -1 ? groupStart : frame;
-                    break;
-                default:
-                    if (runMode && c.match(/^[0-9]$/)) {
-                        if (i === 0 || marbles[i - 1] === ' ') {
-                            const buffer = marbles.slice(i);
-                            const match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
-                            if (match) {
-                                i += match[0].length - 1;
-                                const duration = parseFloat(match[1]);
-                                const unit = match[2];
-                                let durationInMs;
-                                switch (unit) {
-                                    case 'ms':
-                                        durationInMs = duration;
-                                        break;
-                                    case 's':
-                                        durationInMs = duration * 1000;
-                                        break;
-                                    case 'm':
-                                        durationInMs = duration * 1000 * 60;
-                                        break;
-                                    default:
-                                        break;
-                                }
-                                advanceFrameBy(durationInMs / this.frameTimeFactor);
-                                break;
-                            }
-                        }
-                    }
-                    throw new Error('there can only be \'^\' and \'!\' markers in a ' +
-                        'subscription marble diagram. Found instead \'' + c + '\'.');
-            }
-            frame = nextFrame;
-        }
-        if (unsubscriptionFrame < 0) {
-            return new SubscriptionLog(subscriptionFrame);
-        }
-        else {
-            return new SubscriptionLog(subscriptionFrame, unsubscriptionFrame);
-        }
-    }
-    static parseMarbles(marbles, values, errorValue, materializeInnerObservables = false, runMode = false) {
-        if (marbles.indexOf('!') !== -1) {
-            throw new Error('conventional marble diagrams cannot have the ' +
-                'unsubscription marker "!"');
-        }
-        const len = marbles.length;
-        const testMessages = [];
-        const subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');
-        let frame = subIndex === -1 ? 0 : (subIndex * -this.frameTimeFactor);
-        const getValue = typeof values !== 'object' ?
-            (x) => x :
-            (x) => {
-                if (materializeInnerObservables && values[x] instanceof ColdObservable) {
-                    return values[x].messages;
-                }
-                return values[x];
-            };
-        let groupStart = -1;
-        for (let i = 0; i < len; i++) {
-            let nextFrame = frame;
-            const advanceFrameBy = (count) => {
-                nextFrame += count * this.frameTimeFactor;
-            };
-            let notification;
-            const c = marbles[i];
-            switch (c) {
-                case ' ':
-                    if (!runMode) {
-                        advanceFrameBy(1);
-                    }
-                    break;
-                case '-':
-                    advanceFrameBy(1);
-                    break;
-                case '(':
-                    groupStart = frame;
-                    advanceFrameBy(1);
-                    break;
-                case ')':
-                    groupStart = -1;
-                    advanceFrameBy(1);
-                    break;
-                case '|':
-                    notification = Notification.createComplete();
-                    advanceFrameBy(1);
-                    break;
-                case '^':
-                    advanceFrameBy(1);
-                    break;
-                case '#':
-                    notification = Notification.createError(errorValue || 'error');
-                    advanceFrameBy(1);
-                    break;
-                default:
-                    if (runMode && c.match(/^[0-9]$/)) {
-                        if (i === 0 || marbles[i - 1] === ' ') {
-                            const buffer = marbles.slice(i);
-                            const match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
-                            if (match) {
-                                i += match[0].length - 1;
-                                const duration = parseFloat(match[1]);
-                                const unit = match[2];
-                                let durationInMs;
-                                switch (unit) {
-                                    case 'ms':
-                                        durationInMs = duration;
-                                        break;
-                                    case 's':
-                                        durationInMs = duration * 1000;
-                                        break;
-                                    case 'm':
-                                        durationInMs = duration * 1000 * 60;
-                                        break;
-                                    default:
-                                        break;
-                                }
-                                advanceFrameBy(durationInMs / this.frameTimeFactor);
-                                break;
-                            }
-                        }
-                    }
-                    notification = Notification.createNext(getValue(c));
-                    advanceFrameBy(1);
-                    break;
-            }
-            if (notification) {
-                testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification });
-            }
-            frame = nextFrame;
-        }
-        return testMessages;
-    }
-    run(callback) {
-        const prevFrameTimeFactor = TestScheduler.frameTimeFactor;
-        const prevMaxFrames = this.maxFrames;
-        TestScheduler.frameTimeFactor = 1;
-        this.maxFrames = Number.POSITIVE_INFINITY;
-        this.runMode = true;
-        AsyncScheduler.delegate = this;
-        const helpers = {
-            cold: this.createColdObservable.bind(this),
-            hot: this.createHotObservable.bind(this),
-            flush: this.flush.bind(this),
-            expectObservable: this.expectObservable.bind(this),
-            expectSubscriptions: this.expectSubscriptions.bind(this),
-        };
-        try {
-            const ret = callback(helpers);
-            this.flush();
-            return ret;
-        }
-        finally {
-            TestScheduler.frameTimeFactor = prevFrameTimeFactor;
-            this.maxFrames = prevMaxFrames;
-            this.runMode = false;
-            AsyncScheduler.delegate = undefined;
-        }
-    }
-}
-//# sourceMappingURL=TestScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/testing/TestScheduler.js.map b/node_modules/rxjs/_esm2015/internal/testing/TestScheduler.js.map
deleted file mode 100644
index b2c5bdc..0000000
--- a/node_modules/rxjs/_esm2015/internal/testing/TestScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TestScheduler.js","sources":["../../../src/internal/testing/TestScheduler.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/internal/types.js b/node_modules/rxjs/_esm2015/internal/types.js
deleted file mode 100644
index 5b2306a..0000000
--- a/node_modules/rxjs/_esm2015/internal/types.js
+++ /dev/null
@@ -1 +0,0 @@
-//# sourceMappingURL=types.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/types.js.map b/node_modules/rxjs/_esm2015/internal/types.js.map
deleted file mode 100644
index 607b992..0000000
--- a/node_modules/rxjs/_esm2015/internal/types.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"types.js","sources":["../../src/internal/types.ts"],"names":[],"mappings":""}
diff --git a/node_modules/rxjs/_esm2015/internal/util/ArgumentOutOfRangeError.js b/node_modules/rxjs/_esm2015/internal/util/ArgumentOutOfRangeError.js
deleted file mode 100644
index 73baa86..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/ArgumentOutOfRangeError.js
+++ /dev/null
@@ -1,12 +0,0 @@
-const ArgumentOutOfRangeErrorImpl = (() => {
-    function ArgumentOutOfRangeErrorImpl() {
-        Error.call(this);
-        this.message = 'argument out of range';
-        this.name = 'ArgumentOutOfRangeError';
-        return this;
-    }
-    ArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype);
-    return ArgumentOutOfRangeErrorImpl;
-})();
-export const ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl;
-//# sourceMappingURL=ArgumentOutOfRangeError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/ArgumentOutOfRangeError.js.map b/node_modules/rxjs/_esm2015/internal/util/ArgumentOutOfRangeError.js.map
deleted file mode 100644
index d57ac07..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/ArgumentOutOfRangeError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ArgumentOutOfRangeError.js","sources":["../../../src/internal/util/ArgumentOutOfRangeError.ts"],"names":[],"mappings":"AAOA,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE;IACxC,SAAS,2BAA2B;QAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,uBAAuB,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO,2BAA2B,CAAC;AACrC,CAAC,CAAC,EAAE,CAAC;AAYL,MAAM,CAAC,MAAM,uBAAuB,GAAgC,2BAAkC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/EmptyError.js b/node_modules/rxjs/_esm2015/internal/util/EmptyError.js
deleted file mode 100644
index 6f0cbcc..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/EmptyError.js
+++ /dev/null
@@ -1,12 +0,0 @@
-const EmptyErrorImpl = (() => {
-    function EmptyErrorImpl() {
-        Error.call(this);
-        this.message = 'no elements in sequence';
-        this.name = 'EmptyError';
-        return this;
-    }
-    EmptyErrorImpl.prototype = Object.create(Error.prototype);
-    return EmptyErrorImpl;
-})();
-export const EmptyError = EmptyErrorImpl;
-//# sourceMappingURL=EmptyError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/EmptyError.js.map b/node_modules/rxjs/_esm2015/internal/util/EmptyError.js.map
deleted file mode 100644
index a8e85a3..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/EmptyError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"EmptyError.js","sources":["../../../src/internal/util/EmptyError.ts"],"names":[],"mappings":"AAOA,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE;IAC3B,SAAS,cAAc;QACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,yBAAyB,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE1D,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC,EAAE,CAAC;AAYL,MAAM,CAAC,MAAM,UAAU,GAAmB,cAAqB,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/Immediate.js b/node_modules/rxjs/_esm2015/internal/util/Immediate.js
deleted file mode 100644
index 318097b..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/Immediate.js
+++ /dev/null
@@ -1,27 +0,0 @@
-let nextHandle = 1;
-const RESOLVED = (() => Promise.resolve())();
-const activeHandles = {};
-function findAndClearHandle(handle) {
-    if (handle in activeHandles) {
-        delete activeHandles[handle];
-        return true;
-    }
-    return false;
-}
-export const Immediate = {
-    setImmediate(cb) {
-        const handle = nextHandle++;
-        activeHandles[handle] = true;
-        RESOLVED.then(() => findAndClearHandle(handle) && cb());
-        return handle;
-    },
-    clearImmediate(handle) {
-        findAndClearHandle(handle);
-    },
-};
-export const TestTools = {
-    pending() {
-        return Object.keys(activeHandles).length;
-    }
-};
-//# sourceMappingURL=Immediate.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/Immediate.js.map b/node_modules/rxjs/_esm2015/internal/util/Immediate.js.map
deleted file mode 100644
index 402f32e..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/Immediate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Immediate.js","sources":["../../../src/internal/util/Immediate.ts"],"names":[],"mappings":"AAAA,IAAI,UAAU,GAAG,CAAC,CAAC;AACnB,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;AAC7C,MAAM,aAAa,GAA2B,EAAE,CAAC;AAOjD,SAAS,kBAAkB,CAAC,MAAc;IACxC,IAAI,MAAM,IAAI,aAAa,EAAE;QAC3B,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;KACb;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAKD,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,YAAY,CAAC,EAAc;QACzB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC;AAKF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO;QACL,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;IAC3C,CAAC;CACF,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/ObjectUnsubscribedError.js b/node_modules/rxjs/_esm2015/internal/util/ObjectUnsubscribedError.js
deleted file mode 100644
index 19587e6..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/ObjectUnsubscribedError.js
+++ /dev/null
@@ -1,12 +0,0 @@
-const ObjectUnsubscribedErrorImpl = (() => {
-    function ObjectUnsubscribedErrorImpl() {
-        Error.call(this);
-        this.message = 'object unsubscribed';
-        this.name = 'ObjectUnsubscribedError';
-        return this;
-    }
-    ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);
-    return ObjectUnsubscribedErrorImpl;
-})();
-export const ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;
-//# sourceMappingURL=ObjectUnsubscribedError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/ObjectUnsubscribedError.js.map b/node_modules/rxjs/_esm2015/internal/util/ObjectUnsubscribedError.js.map
deleted file mode 100644
index 0567cdb..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/ObjectUnsubscribedError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ObjectUnsubscribedError.js","sources":["../../../src/internal/util/ObjectUnsubscribedError.ts"],"names":[],"mappings":"AAOA,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE;IACxC,SAAS,2BAA2B;QAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,qBAAqB,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO,2BAA2B,CAAC;AACrC,CAAC,CAAC,EAAE,CAAC;AAWL,MAAM,CAAC,MAAM,uBAAuB,GAAgC,2BAAkC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/TimeoutError.js b/node_modules/rxjs/_esm2015/internal/util/TimeoutError.js
deleted file mode 100644
index 90b79ca..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/TimeoutError.js
+++ /dev/null
@@ -1,12 +0,0 @@
-const TimeoutErrorImpl = (() => {
-    function TimeoutErrorImpl() {
-        Error.call(this);
-        this.message = 'Timeout has occurred';
-        this.name = 'TimeoutError';
-        return this;
-    }
-    TimeoutErrorImpl.prototype = Object.create(Error.prototype);
-    return TimeoutErrorImpl;
-})();
-export const TimeoutError = TimeoutErrorImpl;
-//# sourceMappingURL=TimeoutError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/TimeoutError.js.map b/node_modules/rxjs/_esm2015/internal/util/TimeoutError.js.map
deleted file mode 100644
index 08a99ad..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/TimeoutError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TimeoutError.js","sources":["../../../src/internal/util/TimeoutError.ts"],"names":[],"mappings":"AAOA,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE;IAC7B,SAAS,gBAAgB;QACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,sBAAsB,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE5D,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC,EAAE,CAAC;AASL,MAAM,CAAC,MAAM,YAAY,GAAqB,gBAAuB,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/UnsubscriptionError.js b/node_modules/rxjs/_esm2015/internal/util/UnsubscriptionError.js
deleted file mode 100644
index 41b16f6..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/UnsubscriptionError.js
+++ /dev/null
@@ -1,15 +0,0 @@
-const UnsubscriptionErrorImpl = (() => {
-    function UnsubscriptionErrorImpl(errors) {
-        Error.call(this);
-        this.message = errors ?
-            `${errors.length} errors occurred during unsubscription:
-${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\n  ')}` : '';
-        this.name = 'UnsubscriptionError';
-        this.errors = errors;
-        return this;
-    }
-    UnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);
-    return UnsubscriptionErrorImpl;
-})();
-export const UnsubscriptionError = UnsubscriptionErrorImpl;
-//# sourceMappingURL=UnsubscriptionError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/UnsubscriptionError.js.map b/node_modules/rxjs/_esm2015/internal/util/UnsubscriptionError.js.map
deleted file mode 100644
index 573d18b..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/UnsubscriptionError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"UnsubscriptionError.js","sources":["../../../src/internal/util/UnsubscriptionError.ts"],"names":[],"mappings":"AAQA,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE;IACpC,SAAS,uBAAuB,CAAY,MAAa;QACvD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;YACrB,GAAG,MAAM,CAAC,MAAM;EACpB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEnE,OAAO,uBAAuB,CAAC;AACjC,CAAC,CAAC,EAAE,CAAC;AAML,MAAM,CAAC,MAAM,mBAAmB,GAA4B,uBAA8B,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/applyMixins.js b/node_modules/rxjs/_esm2015/internal/util/applyMixins.js
deleted file mode 100644
index dfbeb91..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/applyMixins.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export function applyMixins(derivedCtor, baseCtors) {
-    for (let i = 0, len = baseCtors.length; i < len; i++) {
-        const baseCtor = baseCtors[i];
-        const propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);
-        for (let j = 0, len2 = propertyKeys.length; j < len2; j++) {
-            const name = propertyKeys[j];
-            derivedCtor.prototype[name] = baseCtor.prototype[name];
-        }
-    }
-}
-//# sourceMappingURL=applyMixins.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/applyMixins.js.map b/node_modules/rxjs/_esm2015/internal/util/applyMixins.js.map
deleted file mode 100644
index 11e203d..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/applyMixins.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"applyMixins.js","sources":["../../../src/internal/util/applyMixins.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,WAAgB,EAAE,SAAgB;IAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;QACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YACzD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SACxD;KACF;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/canReportError.js b/node_modules/rxjs/_esm2015/internal/util/canReportError.js
deleted file mode 100644
index 08819b5..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/canReportError.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export function canReportError(observer) {
-    while (observer) {
-        const { closed, destination, isStopped } = observer;
-        if (closed || isStopped) {
-            return false;
-        }
-        else if (destination && destination instanceof Subscriber) {
-            observer = destination;
-        }
-        else {
-            observer = null;
-        }
-    }
-    return true;
-}
-//# sourceMappingURL=canReportError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/canReportError.js.map b/node_modules/rxjs/_esm2015/internal/util/canReportError.js.map
deleted file mode 100644
index bed1e3b..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/canReportError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"canReportError.js","sources":["../../../src/internal/util/canReportError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAS3C,MAAM,UAAU,cAAc,CAAC,QAAwC;IACrE,OAAO,QAAQ,EAAE;QACf,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,QAAe,CAAC;QAC3D,IAAI,MAAM,IAAI,SAAS,EAAE;YACvB,OAAO,KAAK,CAAC;SACd;aAAM,IAAI,WAAW,IAAI,WAAW,YAAY,UAAU,EAAE;YAC3D,QAAQ,GAAG,WAAW,CAAC;SACxB;aAAM;YACL,QAAQ,GAAG,IAAI,CAAC;SACjB;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/errorObject.js b/node_modules/rxjs/_esm2015/internal/util/errorObject.js
deleted file mode 100644
index 26ab7ff..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/errorObject.js
+++ /dev/null
@@ -1,2 +0,0 @@
-export const errorObject = { e: {} };
-//# sourceMappingURL=errorObject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/errorObject.js.map b/node_modules/rxjs/_esm2015/internal/util/errorObject.js.map
deleted file mode 100644
index dafb8c3..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/errorObject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"errorObject.js","sources":["../../../src/internal/util/errorObject.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,WAAW,GAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/hostReportError.js b/node_modules/rxjs/_esm2015/internal/util/hostReportError.js
deleted file mode 100644
index 3851a36..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/hostReportError.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export function hostReportError(err) {
-    setTimeout(() => { throw err; }, 0);
-}
-//# sourceMappingURL=hostReportError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/hostReportError.js.map b/node_modules/rxjs/_esm2015/internal/util/hostReportError.js.map
deleted file mode 100644
index 202c752..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/hostReportError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"hostReportError.js","sources":["../../../src/internal/util/hostReportError.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,eAAe,CAAC,GAAQ;IACtC,UAAU,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/identity.js b/node_modules/rxjs/_esm2015/internal/util/identity.js
deleted file mode 100644
index 1084d77..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/identity.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export function identity(x) {
-    return x;
-}
-//# sourceMappingURL=identity.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/identity.js.map b/node_modules/rxjs/_esm2015/internal/util/identity.js.map
deleted file mode 100644
index 3173922..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/identity.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"identity.js","sources":["../../../src/internal/util/identity.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAI,CAAI;IAC9B,OAAO,CAAC,CAAC;AACX,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/isArray.js b/node_modules/rxjs/_esm2015/internal/util/isArray.js
deleted file mode 100644
index 98ae429..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isArray.js
+++ /dev/null
@@ -1,2 +0,0 @@
-export const isArray = (() => Array.isArray || ((x) => x && typeof x.length === 'number'))();
-//# sourceMappingURL=isArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/isArray.js.map b/node_modules/rxjs/_esm2015/internal/util/isArray.js.map
deleted file mode 100644
index bdff915..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isArray.js","sources":["../../../src/internal/util/isArray.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAI,CAAM,EAAY,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/isArrayLike.js b/node_modules/rxjs/_esm2015/internal/util/isArrayLike.js
deleted file mode 100644
index 393c8b8..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isArrayLike.js
+++ /dev/null
@@ -1,2 +0,0 @@
-export const isArrayLike = ((x) => x && typeof x.length === 'number' && typeof x !== 'function');
-//# sourceMappingURL=isArrayLike.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/isArrayLike.js.map b/node_modules/rxjs/_esm2015/internal/util/isArrayLike.js.map
deleted file mode 100644
index 5f70120..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isArrayLike.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isArrayLike.js","sources":["../../../src/internal/util/isArrayLike.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAI,CAAM,EAAqB,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/isDate.js b/node_modules/rxjs/_esm2015/internal/util/isDate.js
deleted file mode 100644
index 842d77f..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isDate.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export function isDate(value) {
-    return value instanceof Date && !isNaN(+value);
-}
-//# sourceMappingURL=isDate.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/isDate.js.map b/node_modules/rxjs/_esm2015/internal/util/isDate.js.map
deleted file mode 100644
index 6958919..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isDate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isDate.js","sources":["../../../src/internal/util/isDate.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAAC,KAAU;IAC/B,OAAO,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/isFunction.js b/node_modules/rxjs/_esm2015/internal/util/isFunction.js
deleted file mode 100644
index c569835..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isFunction.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export function isFunction(x) {
-    return typeof x === 'function';
-}
-//# sourceMappingURL=isFunction.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/isFunction.js.map b/node_modules/rxjs/_esm2015/internal/util/isFunction.js.map
deleted file mode 100644
index 3774b95..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isFunction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isFunction.js","sources":["../../../src/internal/util/isFunction.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,CAAM;IAC/B,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC;AACjC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/isInteropObservable.js b/node_modules/rxjs/_esm2015/internal/util/isInteropObservable.js
deleted file mode 100644
index 00ab1c7..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isInteropObservable.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { observable as Symbol_observable } from '../symbol/observable';
-export function isInteropObservable(input) {
-    return input && typeof input[Symbol_observable] === 'function';
-}
-//# sourceMappingURL=isInteropObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/isInteropObservable.js.map b/node_modules/rxjs/_esm2015/internal/util/isInteropObservable.js.map
deleted file mode 100644
index 8826421..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isInteropObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isInteropObservable.js","sources":["../../../src/internal/util/isInteropObservable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGvE,MAAM,UAAU,mBAAmB,CAAC,KAAU;IAC5C,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC,iBAAiB,CAAC,KAAK,UAAU,CAAC;AACjE,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/isIterable.js b/node_modules/rxjs/_esm2015/internal/util/isIterable.js
deleted file mode 100644
index 484e8ed..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isIterable.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { iterator as Symbol_iterator } from '../symbol/iterator';
-export function isIterable(input) {
-    return input && typeof input[Symbol_iterator] === 'function';
-}
-//# sourceMappingURL=isIterable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/isIterable.js.map b/node_modules/rxjs/_esm2015/internal/util/isIterable.js.map
deleted file mode 100644
index 3ff5f6e..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isIterable.js","sources":["../../../src/internal/util/isIterable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGjE,MAAM,UAAU,UAAU,CAAC,KAAU;IACnC,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC,eAAe,CAAC,KAAK,UAAU,CAAC;AAC/D,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/isNumeric.js b/node_modules/rxjs/_esm2015/internal/util/isNumeric.js
deleted file mode 100644
index a7a70d8..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isNumeric.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { isArray } from './isArray';
-export function isNumeric(val) {
-    return !isArray(val) && (val - parseFloat(val) + 1) >= 0;
-}
-//# sourceMappingURL=isNumeric.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/isNumeric.js.map b/node_modules/rxjs/_esm2015/internal/util/isNumeric.js.map
deleted file mode 100644
index b5954be..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isNumeric.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isNumeric.js","sources":["../../../src/internal/util/isNumeric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU,SAAS,CAAC,GAAQ;IAKhC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/isObject.js b/node_modules/rxjs/_esm2015/internal/util/isObject.js
deleted file mode 100644
index e67f6e8..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isObject.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export function isObject(x) {
-    return x !== null && typeof x === 'object';
-}
-//# sourceMappingURL=isObject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/isObject.js.map b/node_modules/rxjs/_esm2015/internal/util/isObject.js.map
deleted file mode 100644
index f942bed..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isObject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isObject.js","sources":["../../../src/internal/util/isObject.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,CAAM;IAC7B,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;AAC7C,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/isObservable.js b/node_modules/rxjs/_esm2015/internal/util/isObservable.js
deleted file mode 100644
index d1c95f5..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isObservable.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { Observable } from '../Observable';
-export function isObservable(obj) {
-    return !!obj && (obj instanceof Observable || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));
-}
-//# sourceMappingURL=isObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/isObservable.js.map b/node_modules/rxjs/_esm2015/internal/util/isObservable.js.map
deleted file mode 100644
index fa08bc7..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isObservable.js","sources":["../../../src/internal/util/isObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAO3C,MAAM,UAAU,YAAY,CAAI,GAAQ;IACtC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,YAAY,UAAU,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC;AACzH,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/isPromise.js b/node_modules/rxjs/_esm2015/internal/util/isPromise.js
deleted file mode 100644
index 7ffe206..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isPromise.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export function isPromise(value) {
-    return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
-}
-//# sourceMappingURL=isPromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/isPromise.js.map b/node_modules/rxjs/_esm2015/internal/util/isPromise.js.map
deleted file mode 100644
index dcd975c..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isPromise.js","sources":["../../../src/internal/util/isPromise.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,SAAS,CAAC,KAAU;IAClC,OAAO,CAAC,CAAC,KAAK,IAAI,OAAa,KAAM,CAAC,SAAS,KAAK,UAAU,IAAI,OAAQ,KAAa,CAAC,IAAI,KAAK,UAAU,CAAC;AAC9G,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/isScheduler.js b/node_modules/rxjs/_esm2015/internal/util/isScheduler.js
deleted file mode 100644
index 51a2ba4..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isScheduler.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export function isScheduler(value) {
-    return value && typeof value.schedule === 'function';
-}
-//# sourceMappingURL=isScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/isScheduler.js.map b/node_modules/rxjs/_esm2015/internal/util/isScheduler.js.map
deleted file mode 100644
index 75c4eca..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/isScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isScheduler.js","sources":["../../../src/internal/util/isScheduler.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,KAAU;IACpC,OAAO,KAAK,IAAI,OAAa,KAAM,CAAC,QAAQ,KAAK,UAAU,CAAC;AAC9D,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/noop.js b/node_modules/rxjs/_esm2015/internal/util/noop.js
deleted file mode 100644
index 1a78a54..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/noop.js
+++ /dev/null
@@ -1,2 +0,0 @@
-export function noop() { }
-//# sourceMappingURL=noop.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/noop.js.map b/node_modules/rxjs/_esm2015/internal/util/noop.js.map
deleted file mode 100644
index 5d245d8..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/noop.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"noop.js","sources":["../../../src/internal/util/noop.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,IAAI,KAAK,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/not.js b/node_modules/rxjs/_esm2015/internal/util/not.js
deleted file mode 100644
index f430f55..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/not.js
+++ /dev/null
@@ -1,9 +0,0 @@
-export function not(pred, thisArg) {
-    function notPred() {
-        return !(notPred.pred.apply(notPred.thisArg, arguments));
-    }
-    notPred.pred = pred;
-    notPred.thisArg = thisArg;
-    return notPred;
-}
-//# sourceMappingURL=not.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/not.js.map b/node_modules/rxjs/_esm2015/internal/util/not.js.map
deleted file mode 100644
index c74adc5..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/not.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"not.js","sources":["../../../src/internal/util/not.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,CAAC,IAAc,EAAE,OAAY;IAC9C,SAAS,OAAO;QACd,OAAO,CAAC,CAAQ,OAAQ,CAAC,IAAI,CAAC,KAAK,CAAQ,OAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3E,CAAC;IACM,OAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,OAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAClC,OAAO,OAAO,CAAC;AACjB,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/pipe.js b/node_modules/rxjs/_esm2015/internal/util/pipe.js
deleted file mode 100644
index 3bda15e..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/pipe.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { noop } from './noop';
-export function pipe(...fns) {
-    return pipeFromArray(fns);
-}
-export function pipeFromArray(fns) {
-    if (!fns) {
-        return noop;
-    }
-    if (fns.length === 1) {
-        return fns[0];
-    }
-    return function piped(input) {
-        return fns.reduce((prev, fn) => fn(prev), input);
-    };
-}
-//# sourceMappingURL=pipe.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/pipe.js.map b/node_modules/rxjs/_esm2015/internal/util/pipe.js.map
deleted file mode 100644
index f82b8e1..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/pipe.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pipe.js","sources":["../../../src/internal/util/pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAiB9B,MAAM,UAAU,IAAI,CAAC,GAAG,GAAmC;IACzD,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAGD,MAAM,UAAU,aAAa,CAAO,GAA+B;IACjE,IAAI,CAAC,GAAG,EAAE;QACR,OAAO,IAA+B,CAAC;KACxC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;QACpB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;KACf;IAED,OAAO,SAAS,KAAK,CAAC,KAAQ;QAC5B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,IAAS,EAAE,EAAuB,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAY,CAAC,CAAC;IACpF,CAAC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/root.js b/node_modules/rxjs/_esm2015/internal/util/root.js
deleted file mode 100644
index e12f2e2..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/root.js
+++ /dev/null
@@ -1,12 +0,0 @@
-const __window = typeof window !== 'undefined' && window;
-const __self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&
-    self instanceof WorkerGlobalScope && self;
-const __global = typeof global !== 'undefined' && global;
-const _root = __window || __global || __self;
-(function () {
-    if (!_root) {
-        throw new Error('RxJS could not find any global context (window, self, global)');
-    }
-})();
-export { _root as root };
-//# sourceMappingURL=root.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/root.js.map b/node_modules/rxjs/_esm2015/internal/util/root.js.map
deleted file mode 100644
index db51d96..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/root.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"root.js","sources":["../../../src/internal/util/root.ts"],"names":[],"mappings":"AAeA,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC;AACzD,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,iBAAiB,KAAK,WAAW;IAClF,IAAI,YAAY,iBAAiB,IAAI,IAAI,CAAC;AAC9C,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC;AACzD,MAAM,KAAK,GAAQ,QAAQ,IAAI,QAAQ,IAAI,MAAM,CAAC;AAKlD,CAAC;IACC,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;KAClF;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/subscribeTo.js b/node_modules/rxjs/_esm2015/internal/util/subscribeTo.js
deleted file mode 100644
index 71a569b..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/subscribeTo.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import { subscribeToArray } from './subscribeToArray';
-import { subscribeToPromise } from './subscribeToPromise';
-import { subscribeToIterable } from './subscribeToIterable';
-import { subscribeToObservable } from './subscribeToObservable';
-import { isArrayLike } from './isArrayLike';
-import { isPromise } from './isPromise';
-import { isObject } from './isObject';
-import { iterator as Symbol_iterator } from '../symbol/iterator';
-import { observable as Symbol_observable } from '../symbol/observable';
-export const subscribeTo = (result) => {
-    if (!!result && typeof result[Symbol_observable] === 'function') {
-        return subscribeToObservable(result);
-    }
-    else if (isArrayLike(result)) {
-        return subscribeToArray(result);
-    }
-    else if (isPromise(result)) {
-        return subscribeToPromise(result);
-    }
-    else if (!!result && typeof result[Symbol_iterator] === 'function') {
-        return subscribeToIterable(result);
-    }
-    else {
-        const value = isObject(result) ? 'an invalid object' : `'${result}'`;
-        const msg = `You provided ${value} where a stream was expected.`
-            + ' You can provide an Observable, Promise, Array, or Iterable.';
-        throw new TypeError(msg);
-    }
-};
-//# sourceMappingURL=subscribeTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/subscribeTo.js.map b/node_modules/rxjs/_esm2015/internal/util/subscribeTo.js.map
deleted file mode 100644
index 22f4c1e..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/subscribeTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeTo.js","sources":["../../../src/internal/util/subscribeTo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIvE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAI,MAA0B,EAAsD,EAAE;IAC/G,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,iBAAiB,CAAC,KAAK,UAAU,EAAE;QAC/D,OAAO,qBAAqB,CAAC,MAAa,CAAC,CAAC;KAC7C;SAAM,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE;QAC9B,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;KACjC;SAAM,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE;QAC5B,OAAO,kBAAkB,CAAC,MAAsB,CAAC,CAAC;KACnD;SAAM,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,UAAU,EAAE;QACpE,OAAO,mBAAmB,CAAC,MAAa,CAAC,CAAC;KAC3C;SAAM;QACL,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC;QACrE,MAAM,GAAG,GAAG,gBAAgB,KAAK,+BAA+B;cAC5D,8DAA8D,CAAC;QACnE,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;KAC1B;AACH,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/subscribeToArray.js b/node_modules/rxjs/_esm2015/internal/util/subscribeToArray.js
deleted file mode 100644
index 2693661..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/subscribeToArray.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export const subscribeToArray = (array) => (subscriber) => {
-    for (let i = 0, len = array.length; i < len && !subscriber.closed; i++) {
-        subscriber.next(array[i]);
-    }
-    subscriber.complete();
-};
-//# sourceMappingURL=subscribeToArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/subscribeToArray.js.map b/node_modules/rxjs/_esm2015/internal/util/subscribeToArray.js.map
deleted file mode 100644
index ebf89a1..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/subscribeToArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToArray.js","sources":["../../../src/internal/util/subscribeToArray.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAI,KAAmB,EAAE,EAAE,CAAC,CAAC,UAAyB,EAAE,EAAE;IACxF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC3B;IACD,UAAU,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/subscribeToIterable.js b/node_modules/rxjs/_esm2015/internal/util/subscribeToIterable.js
deleted file mode 100644
index cd64b04..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/subscribeToIterable.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import { iterator as Symbol_iterator } from '../symbol/iterator';
-export const subscribeToIterable = (iterable) => (subscriber) => {
-    const iterator = iterable[Symbol_iterator]();
-    do {
-        const item = iterator.next();
-        if (item.done) {
-            subscriber.complete();
-            break;
-        }
-        subscriber.next(item.value);
-        if (subscriber.closed) {
-            break;
-        }
-    } while (true);
-    if (typeof iterator.return === 'function') {
-        subscriber.add(() => {
-            if (iterator.return) {
-                iterator.return();
-            }
-        });
-    }
-    return subscriber;
-};
-//# sourceMappingURL=subscribeToIterable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/subscribeToIterable.js.map b/node_modules/rxjs/_esm2015/internal/util/subscribeToIterable.js.map
deleted file mode 100644
index e06662c..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/subscribeToIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToIterable.js","sources":["../../../src/internal/util/subscribeToIterable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAI,QAAqB,EAAE,EAAE,CAAC,CAAC,UAAyB,EAAE,EAAE;IAC7F,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;IAC7C,GAAG;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,UAAU,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM;SACP;QACD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,UAAU,CAAC,MAAM,EAAE;YACrB,MAAM;SACP;KACF,QAAQ,IAAI,EAAE;IAGf,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE;QACzC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,IAAI,QAAQ,CAAC,MAAM,EAAE;gBACnB,QAAQ,CAAC,MAAM,EAAE,CAAC;aACnB;QACH,CAAC,CAAC,CAAC;KACJ;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/subscribeToObservable.js b/node_modules/rxjs/_esm2015/internal/util/subscribeToObservable.js
deleted file mode 100644
index 8a28421..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/subscribeToObservable.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { observable as Symbol_observable } from '../symbol/observable';
-export const subscribeToObservable = (obj) => (subscriber) => {
-    const obs = obj[Symbol_observable]();
-    if (typeof obs.subscribe !== 'function') {
-        throw new TypeError('Provided object does not correctly implement Symbol.observable');
-    }
-    else {
-        return obs.subscribe(subscriber);
-    }
-};
-//# sourceMappingURL=subscribeToObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/subscribeToObservable.js.map b/node_modules/rxjs/_esm2015/internal/util/subscribeToObservable.js.map
deleted file mode 100644
index 85cce8d..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/subscribeToObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToObservable.js","sources":["../../../src/internal/util/subscribeToObservable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAOvE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAI,GAAQ,EAAE,EAAE,CAAC,CAAC,UAAyB,EAAE,EAAE;IAClF,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;IACrC,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,EAAE;QAEvC,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;KACvF;SAAM;QACL,OAAO,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;KAClC;AACH,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/subscribeToPromise.js b/node_modules/rxjs/_esm2015/internal/util/subscribeToPromise.js
deleted file mode 100644
index 0f919ba..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/subscribeToPromise.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { hostReportError } from './hostReportError';
-export const subscribeToPromise = (promise) => (subscriber) => {
-    promise.then((value) => {
-        if (!subscriber.closed) {
-            subscriber.next(value);
-            subscriber.complete();
-        }
-    }, (err) => subscriber.error(err))
-        .then(null, hostReportError);
-    return subscriber;
-};
-//# sourceMappingURL=subscribeToPromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/subscribeToPromise.js.map b/node_modules/rxjs/_esm2015/internal/util/subscribeToPromise.js.map
deleted file mode 100644
index f8af52c..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/subscribeToPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToPromise.js","sources":["../../../src/internal/util/subscribeToPromise.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAI,OAAuB,EAAE,EAAE,CAAC,CAAC,UAAyB,EAAE,EAAE;IAC9F,OAAO,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,EAAE;QACR,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACtB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,UAAU,CAAC,QAAQ,EAAE,CAAC;SACvB;IACH,CAAC,EACD,CAAC,GAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CACpC;SACA,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC7B,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/subscribeToResult.js b/node_modules/rxjs/_esm2015/internal/util/subscribeToResult.js
deleted file mode 100644
index be8d01f..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/subscribeToResult.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeTo } from './subscribeTo';
-import { Observable } from '../Observable';
-export function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, innerSubscriber = new InnerSubscriber(outerSubscriber, outerValue, outerIndex)) {
-    if (innerSubscriber.closed) {
-        return undefined;
-    }
-    if (result instanceof Observable) {
-        return result.subscribe(innerSubscriber);
-    }
-    return subscribeTo(result)(innerSubscriber);
-}
-//# sourceMappingURL=subscribeToResult.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/subscribeToResult.js.map b/node_modules/rxjs/_esm2015/internal/util/subscribeToResult.js.map
deleted file mode 100644
index c1751b6..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/subscribeToResult.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToResult.js","sources":["../../../src/internal/util/subscribeToResult.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAiB3C,MAAM,UAAU,iBAAiB,CAC/B,eAAsC,EACtC,MAAW,EACX,UAAc,EACd,UAAmB,EACnB,kBAAiC,IAAI,eAAe,CAAC,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC;IAE7F,IAAI,eAAe,CAAC,MAAM,EAAE;QAC1B,OAAO,SAAS,CAAC;KAClB;IACD,IAAI,MAAM,YAAY,UAAU,EAAE;QAChC,OAAO,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;KAC1C;IACD,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAiB,CAAC;AAC9D,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/toSubscriber.js b/node_modules/rxjs/_esm2015/internal/util/toSubscriber.js
deleted file mode 100644
index 1d61183..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/toSubscriber.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { rxSubscriber as rxSubscriberSymbol } from '../symbol/rxSubscriber';
-import { empty as emptyObserver } from '../Observer';
-export function toSubscriber(nextOrObserver, error, complete) {
-    if (nextOrObserver) {
-        if (nextOrObserver instanceof Subscriber) {
-            return nextOrObserver;
-        }
-        if (nextOrObserver[rxSubscriberSymbol]) {
-            return nextOrObserver[rxSubscriberSymbol]();
-        }
-    }
-    if (!nextOrObserver && !error && !complete) {
-        return new Subscriber(emptyObserver);
-    }
-    return new Subscriber(nextOrObserver, error, complete);
-}
-//# sourceMappingURL=toSubscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/toSubscriber.js.map b/node_modules/rxjs/_esm2015/internal/util/toSubscriber.js.map
deleted file mode 100644
index 5f6c7a9..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/toSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"toSubscriber.js","sources":["../../../src/internal/util/toSubscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AAGrD,MAAM,UAAU,YAAY,CAC1B,cAA0D,EAC1D,KAA4B,EAC5B,QAAqB;IAErB,IAAI,cAAc,EAAE;QAClB,IAAI,cAAc,YAAY,UAAU,EAAE;YACxC,OAAwB,cAAe,CAAC;SACzC;QAED,IAAI,cAAc,CAAC,kBAAkB,CAAC,EAAE;YACtC,OAAO,cAAc,CAAC,kBAAkB,CAAC,EAAE,CAAC;SAC7C;KACF;IAED,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE;QAC1C,OAAO,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;KACtC;IAED,OAAO,IAAI,UAAU,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/internal/util/tryCatch.js b/node_modules/rxjs/_esm2015/internal/util/tryCatch.js
deleted file mode 100644
index 503fcee..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/tryCatch.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import { errorObject } from './errorObject';
-let tryCatchTarget;
-function tryCatcher() {
-    errorObject.e = undefined;
-    try {
-        return tryCatchTarget.apply(this, arguments);
-    }
-    catch (e) {
-        errorObject.e = e;
-        return errorObject;
-    }
-    finally {
-        tryCatchTarget = undefined;
-    }
-}
-export function tryCatch(fn) {
-    tryCatchTarget = fn;
-    return tryCatcher;
-}
-//# sourceMappingURL=tryCatch.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/internal/util/tryCatch.js.map b/node_modules/rxjs/_esm2015/internal/util/tryCatch.js.map
deleted file mode 100644
index f685299..0000000
--- a/node_modules/rxjs/_esm2015/internal/util/tryCatch.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"tryCatch.js","sources":["../../../src/internal/util/tryCatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,IAAI,cAAwB,CAAC;AAE7B,SAAS,UAAU;IACjB,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC;IAC1B,IAAI;QACF,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;KAC9C;IAAC,OAAO,CAAC,EAAE;QACV,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,WAAW,CAAC;KACpB;YAAS;QACR,cAAc,GAAG,SAAS,CAAC;KAC5B;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAqB,EAAK;IAChD,cAAc,GAAG,EAAE,CAAC;IACpB,OAAY,UAAU,CAAC;AACzB,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/operators/index.js b/node_modules/rxjs/_esm2015/operators/index.js
deleted file mode 100644
index 9531fe8..0000000
--- a/node_modules/rxjs/_esm2015/operators/index.js
+++ /dev/null
@@ -1,105 +0,0 @@
-export { audit } from '../internal/operators/audit';
-export { auditTime } from '../internal/operators/auditTime';
-export { buffer } from '../internal/operators/buffer';
-export { bufferCount } from '../internal/operators/bufferCount';
-export { bufferTime } from '../internal/operators/bufferTime';
-export { bufferToggle } from '../internal/operators/bufferToggle';
-export { bufferWhen } from '../internal/operators/bufferWhen';
-export { catchError } from '../internal/operators/catchError';
-export { combineAll } from '../internal/operators/combineAll';
-export { combineLatest } from '../internal/operators/combineLatest';
-export { concat } from '../internal/operators/concat';
-export { concatAll } from '../internal/operators/concatAll';
-export { concatMap } from '../internal/operators/concatMap';
-export { concatMapTo } from '../internal/operators/concatMapTo';
-export { count } from '../internal/operators/count';
-export { debounce } from '../internal/operators/debounce';
-export { debounceTime } from '../internal/operators/debounceTime';
-export { defaultIfEmpty } from '../internal/operators/defaultIfEmpty';
-export { delay } from '../internal/operators/delay';
-export { delayWhen } from '../internal/operators/delayWhen';
-export { dematerialize } from '../internal/operators/dematerialize';
-export { distinct } from '../internal/operators/distinct';
-export { distinctUntilChanged } from '../internal/operators/distinctUntilChanged';
-export { distinctUntilKeyChanged } from '../internal/operators/distinctUntilKeyChanged';
-export { elementAt } from '../internal/operators/elementAt';
-export { endWith } from '../internal/operators/endWith';
-export { every } from '../internal/operators/every';
-export { exhaust } from '../internal/operators/exhaust';
-export { exhaustMap } from '../internal/operators/exhaustMap';
-export { expand } from '../internal/operators/expand';
-export { filter } from '../internal/operators/filter';
-export { finalize } from '../internal/operators/finalize';
-export { find } from '../internal/operators/find';
-export { findIndex } from '../internal/operators/findIndex';
-export { first } from '../internal/operators/first';
-export { groupBy } from '../internal/operators/groupBy';
-export { ignoreElements } from '../internal/operators/ignoreElements';
-export { isEmpty } from '../internal/operators/isEmpty';
-export { last } from '../internal/operators/last';
-export { map } from '../internal/operators/map';
-export { mapTo } from '../internal/operators/mapTo';
-export { materialize } from '../internal/operators/materialize';
-export { max } from '../internal/operators/max';
-export { merge } from '../internal/operators/merge';
-export { mergeAll } from '../internal/operators/mergeAll';
-export { mergeMap } from '../internal/operators/mergeMap';
-export { mergeMap as flatMap } from '../internal/operators/mergeMap';
-export { mergeMapTo } from '../internal/operators/mergeMapTo';
-export { mergeScan } from '../internal/operators/mergeScan';
-export { min } from '../internal/operators/min';
-export { multicast } from '../internal/operators/multicast';
-export { observeOn } from '../internal/operators/observeOn';
-export { onErrorResumeNext } from '../internal/operators/onErrorResumeNext';
-export { pairwise } from '../internal/operators/pairwise';
-export { partition } from '../internal/operators/partition';
-export { pluck } from '../internal/operators/pluck';
-export { publish } from '../internal/operators/publish';
-export { publishBehavior } from '../internal/operators/publishBehavior';
-export { publishLast } from '../internal/operators/publishLast';
-export { publishReplay } from '../internal/operators/publishReplay';
-export { race } from '../internal/operators/race';
-export { reduce } from '../internal/operators/reduce';
-export { repeat } from '../internal/operators/repeat';
-export { repeatWhen } from '../internal/operators/repeatWhen';
-export { retry } from '../internal/operators/retry';
-export { retryWhen } from '../internal/operators/retryWhen';
-export { refCount } from '../internal/operators/refCount';
-export { sample } from '../internal/operators/sample';
-export { sampleTime } from '../internal/operators/sampleTime';
-export { scan } from '../internal/operators/scan';
-export { sequenceEqual } from '../internal/operators/sequenceEqual';
-export { share } from '../internal/operators/share';
-export { shareReplay } from '../internal/operators/shareReplay';
-export { single } from '../internal/operators/single';
-export { skip } from '../internal/operators/skip';
-export { skipLast } from '../internal/operators/skipLast';
-export { skipUntil } from '../internal/operators/skipUntil';
-export { skipWhile } from '../internal/operators/skipWhile';
-export { startWith } from '../internal/operators/startWith';
-export { subscribeOn } from '../internal/operators/subscribeOn';
-export { switchAll } from '../internal/operators/switchAll';
-export { switchMap } from '../internal/operators/switchMap';
-export { switchMapTo } from '../internal/operators/switchMapTo';
-export { take } from '../internal/operators/take';
-export { takeLast } from '../internal/operators/takeLast';
-export { takeUntil } from '../internal/operators/takeUntil';
-export { takeWhile } from '../internal/operators/takeWhile';
-export { tap } from '../internal/operators/tap';
-export { throttle } from '../internal/operators/throttle';
-export { throttleTime } from '../internal/operators/throttleTime';
-export { throwIfEmpty } from '../internal/operators/throwIfEmpty';
-export { timeInterval } from '../internal/operators/timeInterval';
-export { timeout } from '../internal/operators/timeout';
-export { timeoutWith } from '../internal/operators/timeoutWith';
-export { timestamp } from '../internal/operators/timestamp';
-export { toArray } from '../internal/operators/toArray';
-export { window } from '../internal/operators/window';
-export { windowCount } from '../internal/operators/windowCount';
-export { windowTime } from '../internal/operators/windowTime';
-export { windowToggle } from '../internal/operators/windowToggle';
-export { windowWhen } from '../internal/operators/windowWhen';
-export { withLatestFrom } from '../internal/operators/withLatestFrom';
-export { zip } from '../internal/operators/zip';
-export { zipAll } from '../internal/operators/zipAll';
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/operators/index.js.map b/node_modules/rxjs/_esm2015/operators/index.js.map
deleted file mode 100644
index 3d3ab93..0000000
--- a/node_modules/rxjs/_esm2015/operators/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/operators/index.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm2015/path-mapping.js b/node_modules/rxjs/_esm2015/path-mapping.js
deleted file mode 100644
index 31003f1..0000000
--- a/node_modules/rxjs/_esm2015/path-mapping.js
+++ /dev/null
@@ -1,453 +0,0 @@
-
-"use strict"
-
-var path = require('path');
-var dir = path.resolve(__dirname);
-
-module.exports = function() {
-  return {
-    "rxjs/util/tryCatch": "rxjs-compat/_esm2015/util/tryCatch",
-    "rxjs/util/toSubscriber": "rxjs-compat/_esm2015/util/toSubscriber",
-    "rxjs/util/subscribeToResult": "rxjs-compat/_esm2015/util/subscribeToResult",
-    "rxjs/util/subscribeToPromise": "rxjs-compat/_esm2015/util/subscribeToPromise",
-    "rxjs/util/subscribeToObservable": "rxjs-compat/_esm2015/util/subscribeToObservable",
-    "rxjs/util/subscribeToIterable": "rxjs-compat/_esm2015/util/subscribeToIterable",
-    "rxjs/util/subscribeToArray": "rxjs-compat/_esm2015/util/subscribeToArray",
-    "rxjs/util/subscribeTo": "rxjs-compat/_esm2015/util/subscribeTo",
-    "rxjs/util/root": "rxjs-compat/_esm2015/util/root",
-    "rxjs/util/pipe": "rxjs-compat/_esm2015/util/pipe",
-    "rxjs/util/not": "rxjs-compat/_esm2015/util/not",
-    "rxjs/util/noop": "rxjs-compat/_esm2015/util/noop",
-    "rxjs/util/isScheduler": "rxjs-compat/_esm2015/util/isScheduler",
-    "rxjs/util/isPromise": "rxjs-compat/_esm2015/util/isPromise",
-    "rxjs/util/isObservable": "rxjs-compat/_esm2015/util/isObservable",
-    "rxjs/util/isObject": "rxjs-compat/_esm2015/util/isObject",
-    "rxjs/util/isNumeric": "rxjs-compat/_esm2015/util/isNumeric",
-    "rxjs/util/isIterable": "rxjs-compat/_esm2015/util/isIterable",
-    "rxjs/util/isFunction": "rxjs-compat/_esm2015/util/isFunction",
-    "rxjs/util/isDate": "rxjs-compat/_esm2015/util/isDate",
-    "rxjs/util/isArrayLike": "rxjs-compat/_esm2015/util/isArrayLike",
-    "rxjs/util/isArray": "rxjs-compat/_esm2015/util/isArray",
-    "rxjs/util/identity": "rxjs-compat/_esm2015/util/identity",
-    "rxjs/util/hostReportError": "rxjs-compat/_esm2015/util/hostReportError",
-    "rxjs/util/errorObject": "rxjs-compat/_esm2015/util/errorObject",
-    "rxjs/util/applyMixins": "rxjs-compat/_esm2015/util/applyMixins",
-    "rxjs/util/UnsubscriptionError": "rxjs-compat/_esm2015/util/UnsubscriptionError",
-    "rxjs/util/TimeoutError": "rxjs-compat/_esm2015/util/TimeoutError",
-    "rxjs/util/ObjectUnsubscribedError": "rxjs-compat/_esm2015/util/ObjectUnsubscribedError",
-    "rxjs/util/Immediate": "rxjs-compat/_esm2015/util/Immediate",
-    "rxjs/util/EmptyError": "rxjs-compat/_esm2015/util/EmptyError",
-    "rxjs/util/ArgumentOutOfRangeError": "rxjs-compat/_esm2015/util/ArgumentOutOfRangeError",
-    "rxjs/symbol/rxSubscriber": "rxjs-compat/_esm2015/symbol/rxSubscriber",
-    "rxjs/symbol/observable": "rxjs-compat/_esm2015/symbol/observable",
-    "rxjs/symbol/iterator": "rxjs-compat/_esm2015/symbol/iterator",
-    "rxjs/scheduler/queue": "rxjs-compat/_esm2015/scheduler/queue",
-    "rxjs/scheduler/async": "rxjs-compat/_esm2015/scheduler/async",
-    "rxjs/scheduler/asap": "rxjs-compat/_esm2015/scheduler/asap",
-    "rxjs/scheduler/animationFrame": "rxjs-compat/_esm2015/scheduler/animationFrame",
-    "rxjs/operators/zipAll": "rxjs-compat/_esm2015/operators/zipAll",
-    "rxjs/operators/zip": "rxjs-compat/_esm2015/operators/zip",
-    "rxjs/operators/withLatestFrom": "rxjs-compat/_esm2015/operators/withLatestFrom",
-    "rxjs/operators/windowWhen": "rxjs-compat/_esm2015/operators/windowWhen",
-    "rxjs/operators/windowToggle": "rxjs-compat/_esm2015/operators/windowToggle",
-    "rxjs/operators/windowTime": "rxjs-compat/_esm2015/operators/windowTime",
-    "rxjs/operators/windowCount": "rxjs-compat/_esm2015/operators/windowCount",
-    "rxjs/operators/window": "rxjs-compat/_esm2015/operators/window",
-    "rxjs/operators/toArray": "rxjs-compat/_esm2015/operators/toArray",
-    "rxjs/operators/timestamp": "rxjs-compat/_esm2015/operators/timestamp",
-    "rxjs/operators/timeoutWith": "rxjs-compat/_esm2015/operators/timeoutWith",
-    "rxjs/operators/timeout": "rxjs-compat/_esm2015/operators/timeout",
-    "rxjs/operators/timeInterval": "rxjs-compat/_esm2015/operators/timeInterval",
-    "rxjs/operators/throwIfEmpty": "rxjs-compat/_esm2015/operators/throwIfEmpty",
-    "rxjs/operators/throttleTime": "rxjs-compat/_esm2015/operators/throttleTime",
-    "rxjs/operators/throttle": "rxjs-compat/_esm2015/operators/throttle",
-    "rxjs/operators/tap": "rxjs-compat/_esm2015/operators/tap",
-    "rxjs/operators/takeWhile": "rxjs-compat/_esm2015/operators/takeWhile",
-    "rxjs/operators/takeUntil": "rxjs-compat/_esm2015/operators/takeUntil",
-    "rxjs/operators/takeLast": "rxjs-compat/_esm2015/operators/takeLast",
-    "rxjs/operators/take": "rxjs-compat/_esm2015/operators/take",
-    "rxjs/operators/switchMapTo": "rxjs-compat/_esm2015/operators/switchMapTo",
-    "rxjs/operators/switchMap": "rxjs-compat/_esm2015/operators/switchMap",
-    "rxjs/operators/switchAll": "rxjs-compat/_esm2015/operators/switchAll",
-    "rxjs/operators/subscribeOn": "rxjs-compat/_esm2015/operators/subscribeOn",
-    "rxjs/operators/startWith": "rxjs-compat/_esm2015/operators/startWith",
-    "rxjs/operators/skipWhile": "rxjs-compat/_esm2015/operators/skipWhile",
-    "rxjs/operators/skipUntil": "rxjs-compat/_esm2015/operators/skipUntil",
-    "rxjs/operators/skipLast": "rxjs-compat/_esm2015/operators/skipLast",
-    "rxjs/operators/skip": "rxjs-compat/_esm2015/operators/skip",
-    "rxjs/operators/single": "rxjs-compat/_esm2015/operators/single",
-    "rxjs/operators/shareReplay": "rxjs-compat/_esm2015/operators/shareReplay",
-    "rxjs/operators/share": "rxjs-compat/_esm2015/operators/share",
-    "rxjs/operators/sequenceEqual": "rxjs-compat/_esm2015/operators/sequenceEqual",
-    "rxjs/operators/scan": "rxjs-compat/_esm2015/operators/scan",
-    "rxjs/operators/sampleTime": "rxjs-compat/_esm2015/operators/sampleTime",
-    "rxjs/operators/sample": "rxjs-compat/_esm2015/operators/sample",
-    "rxjs/operators/retryWhen": "rxjs-compat/_esm2015/operators/retryWhen",
-    "rxjs/operators/retry": "rxjs-compat/_esm2015/operators/retry",
-    "rxjs/operators/repeatWhen": "rxjs-compat/_esm2015/operators/repeatWhen",
-    "rxjs/operators/repeat": "rxjs-compat/_esm2015/operators/repeat",
-    "rxjs/operators/refCount": "rxjs-compat/_esm2015/operators/refCount",
-    "rxjs/operators/reduce": "rxjs-compat/_esm2015/operators/reduce",
-    "rxjs/operators/race": "rxjs-compat/_esm2015/operators/race",
-    "rxjs/operators/publishReplay": "rxjs-compat/_esm2015/operators/publishReplay",
-    "rxjs/operators/publishLast": "rxjs-compat/_esm2015/operators/publishLast",
-    "rxjs/operators/publishBehavior": "rxjs-compat/_esm2015/operators/publishBehavior",
-    "rxjs/operators/publish": "rxjs-compat/_esm2015/operators/publish",
-    "rxjs/operators/pluck": "rxjs-compat/_esm2015/operators/pluck",
-    "rxjs/operators/partition": "rxjs-compat/_esm2015/operators/partition",
-    "rxjs/operators/pairwise": "rxjs-compat/_esm2015/operators/pairwise",
-    "rxjs/operators/onErrorResumeNext": "rxjs-compat/_esm2015/operators/onErrorResumeNext",
-    "rxjs/operators/observeOn": "rxjs-compat/_esm2015/operators/observeOn",
-    "rxjs/operators/multicast": "rxjs-compat/_esm2015/operators/multicast",
-    "rxjs/operators/min": "rxjs-compat/_esm2015/operators/min",
-    "rxjs/operators/mergeScan": "rxjs-compat/_esm2015/operators/mergeScan",
-    "rxjs/operators/mergeMapTo": "rxjs-compat/_esm2015/operators/mergeMapTo",
-    "rxjs/operators/mergeMap": "rxjs-compat/_esm2015/operators/mergeMap",
-    "rxjs/operators/mergeAll": "rxjs-compat/_esm2015/operators/mergeAll",
-    "rxjs/operators/merge": "rxjs-compat/_esm2015/operators/merge",
-    "rxjs/operators/max": "rxjs-compat/_esm2015/operators/max",
-    "rxjs/operators/materialize": "rxjs-compat/_esm2015/operators/materialize",
-    "rxjs/operators/mapTo": "rxjs-compat/_esm2015/operators/mapTo",
-    "rxjs/operators/map": "rxjs-compat/_esm2015/operators/map",
-    "rxjs/operators/last": "rxjs-compat/_esm2015/operators/last",
-    "rxjs/operators/isEmpty": "rxjs-compat/_esm2015/operators/isEmpty",
-    "rxjs/operators/ignoreElements": "rxjs-compat/_esm2015/operators/ignoreElements",
-    "rxjs/operators/groupBy": "rxjs-compat/_esm2015/operators/groupBy",
-    "rxjs/operators/first": "rxjs-compat/_esm2015/operators/first",
-    "rxjs/operators/findIndex": "rxjs-compat/_esm2015/operators/findIndex",
-    "rxjs/operators/find": "rxjs-compat/_esm2015/operators/find",
-    "rxjs/operators/finalize": "rxjs-compat/_esm2015/operators/finalize",
-    "rxjs/operators/filter": "rxjs-compat/_esm2015/operators/filter",
-    "rxjs/operators/expand": "rxjs-compat/_esm2015/operators/expand",
-    "rxjs/operators/exhaustMap": "rxjs-compat/_esm2015/operators/exhaustMap",
-    "rxjs/operators/exhaust": "rxjs-compat/_esm2015/operators/exhaust",
-    "rxjs/operators/every": "rxjs-compat/_esm2015/operators/every",
-    "rxjs/operators/elementAt": "rxjs-compat/_esm2015/operators/elementAt",
-    "rxjs/operators/distinctUntilKeyChanged": "rxjs-compat/_esm2015/operators/distinctUntilKeyChanged",
-    "rxjs/operators/distinctUntilChanged": "rxjs-compat/_esm2015/operators/distinctUntilChanged",
-    "rxjs/operators/distinct": "rxjs-compat/_esm2015/operators/distinct",
-    "rxjs/operators/dematerialize": "rxjs-compat/_esm2015/operators/dematerialize",
-    "rxjs/operators/delayWhen": "rxjs-compat/_esm2015/operators/delayWhen",
-    "rxjs/operators/delay": "rxjs-compat/_esm2015/operators/delay",
-    "rxjs/operators/defaultIfEmpty": "rxjs-compat/_esm2015/operators/defaultIfEmpty",
-    "rxjs/operators/debounceTime": "rxjs-compat/_esm2015/operators/debounceTime",
-    "rxjs/operators/debounce": "rxjs-compat/_esm2015/operators/debounce",
-    "rxjs/operators/count": "rxjs-compat/_esm2015/operators/count",
-    "rxjs/operators/concatMapTo": "rxjs-compat/_esm2015/operators/concatMapTo",
-    "rxjs/operators/concatMap": "rxjs-compat/_esm2015/operators/concatMap",
-    "rxjs/operators/concatAll": "rxjs-compat/_esm2015/operators/concatAll",
-    "rxjs/operators/concat": "rxjs-compat/_esm2015/operators/concat",
-    "rxjs/operators/combineLatest": "rxjs-compat/_esm2015/operators/combineLatest",
-    "rxjs/operators/combineAll": "rxjs-compat/_esm2015/operators/combineAll",
-    "rxjs/operators/catchError": "rxjs-compat/_esm2015/operators/catchError",
-    "rxjs/operators/bufferWhen": "rxjs-compat/_esm2015/operators/bufferWhen",
-    "rxjs/operators/bufferToggle": "rxjs-compat/_esm2015/operators/bufferToggle",
-    "rxjs/operators/bufferTime": "rxjs-compat/_esm2015/operators/bufferTime",
-    "rxjs/operators/bufferCount": "rxjs-compat/_esm2015/operators/bufferCount",
-    "rxjs/operators/buffer": "rxjs-compat/_esm2015/operators/buffer",
-    "rxjs/operators/auditTime": "rxjs-compat/_esm2015/operators/auditTime",
-    "rxjs/operators/audit": "rxjs-compat/_esm2015/operators/audit",
-    "rxjs/operator/zipAll": "rxjs-compat/_esm2015/operator/zipAll",
-    "rxjs/operator/zip": "rxjs-compat/_esm2015/operator/zip",
-    "rxjs/operator/withLatestFrom": "rxjs-compat/_esm2015/operator/withLatestFrom",
-    "rxjs/operator/windowWhen": "rxjs-compat/_esm2015/operator/windowWhen",
-    "rxjs/operator/windowToggle": "rxjs-compat/_esm2015/operator/windowToggle",
-    "rxjs/operator/windowTime": "rxjs-compat/_esm2015/operator/windowTime",
-    "rxjs/operator/windowCount": "rxjs-compat/_esm2015/operator/windowCount",
-    "rxjs/operator/window": "rxjs-compat/_esm2015/operator/window",
-    "rxjs/operator/toPromise": "rxjs-compat/_esm2015/operator/toPromise",
-    "rxjs/operator/toArray": "rxjs-compat/_esm2015/operator/toArray",
-    "rxjs/operator/timestamp": "rxjs-compat/_esm2015/operator/timestamp",
-    "rxjs/operator/timeoutWith": "rxjs-compat/_esm2015/operator/timeoutWith",
-    "rxjs/operator/timeout": "rxjs-compat/_esm2015/operator/timeout",
-    "rxjs/operator/timeInterval": "rxjs-compat/_esm2015/operator/timeInterval",
-    "rxjs/operator/throttleTime": "rxjs-compat/_esm2015/operator/throttleTime",
-    "rxjs/operator/throttle": "rxjs-compat/_esm2015/operator/throttle",
-    "rxjs/operator/takeWhile": "rxjs-compat/_esm2015/operator/takeWhile",
-    "rxjs/operator/takeUntil": "rxjs-compat/_esm2015/operator/takeUntil",
-    "rxjs/operator/takeLast": "rxjs-compat/_esm2015/operator/takeLast",
-    "rxjs/operator/take": "rxjs-compat/_esm2015/operator/take",
-    "rxjs/operator/switchMapTo": "rxjs-compat/_esm2015/operator/switchMapTo",
-    "rxjs/operator/switchMap": "rxjs-compat/_esm2015/operator/switchMap",
-    "rxjs/operator/switch": "rxjs-compat/_esm2015/operator/switch",
-    "rxjs/operator/subscribeOn": "rxjs-compat/_esm2015/operator/subscribeOn",
-    "rxjs/operator/startWith": "rxjs-compat/_esm2015/operator/startWith",
-    "rxjs/operator/skipWhile": "rxjs-compat/_esm2015/operator/skipWhile",
-    "rxjs/operator/skipUntil": "rxjs-compat/_esm2015/operator/skipUntil",
-    "rxjs/operator/skipLast": "rxjs-compat/_esm2015/operator/skipLast",
-    "rxjs/operator/skip": "rxjs-compat/_esm2015/operator/skip",
-    "rxjs/operator/single": "rxjs-compat/_esm2015/operator/single",
-    "rxjs/operator/shareReplay": "rxjs-compat/_esm2015/operator/shareReplay",
-    "rxjs/operator/share": "rxjs-compat/_esm2015/operator/share",
-    "rxjs/operator/sequenceEqual": "rxjs-compat/_esm2015/operator/sequenceEqual",
-    "rxjs/operator/scan": "rxjs-compat/_esm2015/operator/scan",
-    "rxjs/operator/sampleTime": "rxjs-compat/_esm2015/operator/sampleTime",
-    "rxjs/operator/sample": "rxjs-compat/_esm2015/operator/sample",
-    "rxjs/operator/retryWhen": "rxjs-compat/_esm2015/operator/retryWhen",
-    "rxjs/operator/retry": "rxjs-compat/_esm2015/operator/retry",
-    "rxjs/operator/repeatWhen": "rxjs-compat/_esm2015/operator/repeatWhen",
-    "rxjs/operator/repeat": "rxjs-compat/_esm2015/operator/repeat",
-    "rxjs/operator/reduce": "rxjs-compat/_esm2015/operator/reduce",
-    "rxjs/operator/race": "rxjs-compat/_esm2015/operator/race",
-    "rxjs/operator/publishReplay": "rxjs-compat/_esm2015/operator/publishReplay",
-    "rxjs/operator/publishLast": "rxjs-compat/_esm2015/operator/publishLast",
-    "rxjs/operator/publishBehavior": "rxjs-compat/_esm2015/operator/publishBehavior",
-    "rxjs/operator/publish": "rxjs-compat/_esm2015/operator/publish",
-    "rxjs/operator/pluck": "rxjs-compat/_esm2015/operator/pluck",
-    "rxjs/operator/partition": "rxjs-compat/_esm2015/operator/partition",
-    "rxjs/operator/pairwise": "rxjs-compat/_esm2015/operator/pairwise",
-    "rxjs/operator/onErrorResumeNext": "rxjs-compat/_esm2015/operator/onErrorResumeNext",
-    "rxjs/operator/observeOn": "rxjs-compat/_esm2015/operator/observeOn",
-    "rxjs/operator/multicast": "rxjs-compat/_esm2015/operator/multicast",
-    "rxjs/operator/min": "rxjs-compat/_esm2015/operator/min",
-    "rxjs/operator/mergeScan": "rxjs-compat/_esm2015/operator/mergeScan",
-    "rxjs/operator/mergeMapTo": "rxjs-compat/_esm2015/operator/mergeMapTo",
-    "rxjs/operator/mergeMap": "rxjs-compat/_esm2015/operator/mergeMap",
-    "rxjs/operator/mergeAll": "rxjs-compat/_esm2015/operator/mergeAll",
-    "rxjs/operator/merge": "rxjs-compat/_esm2015/operator/merge",
-    "rxjs/operator/max": "rxjs-compat/_esm2015/operator/max",
-    "rxjs/operator/materialize": "rxjs-compat/_esm2015/operator/materialize",
-    "rxjs/operator/mapTo": "rxjs-compat/_esm2015/operator/mapTo",
-    "rxjs/operator/map": "rxjs-compat/_esm2015/operator/map",
-    "rxjs/operator/let": "rxjs-compat/_esm2015/operator/let",
-    "rxjs/operator/last": "rxjs-compat/_esm2015/operator/last",
-    "rxjs/operator/isEmpty": "rxjs-compat/_esm2015/operator/isEmpty",
-    "rxjs/operator/ignoreElements": "rxjs-compat/_esm2015/operator/ignoreElements",
-    "rxjs/operator/groupBy": "rxjs-compat/_esm2015/operator/groupBy",
-    "rxjs/operator/first": "rxjs-compat/_esm2015/operator/first",
-    "rxjs/operator/findIndex": "rxjs-compat/_esm2015/operator/findIndex",
-    "rxjs/operator/find": "rxjs-compat/_esm2015/operator/find",
-    "rxjs/operator/finally": "rxjs-compat/_esm2015/operator/finally",
-    "rxjs/operator/filter": "rxjs-compat/_esm2015/operator/filter",
-    "rxjs/operator/expand": "rxjs-compat/_esm2015/operator/expand",
-    "rxjs/operator/exhaustMap": "rxjs-compat/_esm2015/operator/exhaustMap",
-    "rxjs/operator/exhaust": "rxjs-compat/_esm2015/operator/exhaust",
-    "rxjs/operator/every": "rxjs-compat/_esm2015/operator/every",
-    "rxjs/operator/elementAt": "rxjs-compat/_esm2015/operator/elementAt",
-    "rxjs/operator/do": "rxjs-compat/_esm2015/operator/do",
-    "rxjs/operator/distinctUntilKeyChanged": "rxjs-compat/_esm2015/operator/distinctUntilKeyChanged",
-    "rxjs/operator/distinctUntilChanged": "rxjs-compat/_esm2015/operator/distinctUntilChanged",
-    "rxjs/operator/distinct": "rxjs-compat/_esm2015/operator/distinct",
-    "rxjs/operator/dematerialize": "rxjs-compat/_esm2015/operator/dematerialize",
-    "rxjs/operator/delayWhen": "rxjs-compat/_esm2015/operator/delayWhen",
-    "rxjs/operator/delay": "rxjs-compat/_esm2015/operator/delay",
-    "rxjs/operator/defaultIfEmpty": "rxjs-compat/_esm2015/operator/defaultIfEmpty",
-    "rxjs/operator/debounceTime": "rxjs-compat/_esm2015/operator/debounceTime",
-    "rxjs/operator/debounce": "rxjs-compat/_esm2015/operator/debounce",
-    "rxjs/operator/count": "rxjs-compat/_esm2015/operator/count",
-    "rxjs/operator/concatMapTo": "rxjs-compat/_esm2015/operator/concatMapTo",
-    "rxjs/operator/concatMap": "rxjs-compat/_esm2015/operator/concatMap",
-    "rxjs/operator/concatAll": "rxjs-compat/_esm2015/operator/concatAll",
-    "rxjs/operator/concat": "rxjs-compat/_esm2015/operator/concat",
-    "rxjs/operator/combineLatest": "rxjs-compat/_esm2015/operator/combineLatest",
-    "rxjs/operator/combineAll": "rxjs-compat/_esm2015/operator/combineAll",
-    "rxjs/operator/catch": "rxjs-compat/_esm2015/operator/catch",
-    "rxjs/operator/bufferWhen": "rxjs-compat/_esm2015/operator/bufferWhen",
-    "rxjs/operator/bufferToggle": "rxjs-compat/_esm2015/operator/bufferToggle",
-    "rxjs/operator/bufferTime": "rxjs-compat/_esm2015/operator/bufferTime",
-    "rxjs/operator/bufferCount": "rxjs-compat/_esm2015/operator/bufferCount",
-    "rxjs/operator/buffer": "rxjs-compat/_esm2015/operator/buffer",
-    "rxjs/operator/auditTime": "rxjs-compat/_esm2015/operator/auditTime",
-    "rxjs/operator/audit": "rxjs-compat/_esm2015/operator/audit",
-    "rxjs/observable/zip": "rxjs-compat/_esm2015/observable/zip",
-    "rxjs/observable/using": "rxjs-compat/_esm2015/observable/using",
-    "rxjs/observable/timer": "rxjs-compat/_esm2015/observable/timer",
-    "rxjs/observable/throw": "rxjs-compat/_esm2015/observable/throw",
-    "rxjs/observable/range": "rxjs-compat/_esm2015/observable/range",
-    "rxjs/observable/race": "rxjs-compat/_esm2015/observable/race",
-    "rxjs/observable/pairs": "rxjs-compat/_esm2015/observable/pairs",
-    "rxjs/observable/onErrorResumeNext": "rxjs-compat/_esm2015/observable/onErrorResumeNext",
-    "rxjs/observable/of": "rxjs-compat/_esm2015/observable/of",
-    "rxjs/observable/never": "rxjs-compat/_esm2015/observable/never",
-    "rxjs/observable/merge": "rxjs-compat/_esm2015/observable/merge",
-    "rxjs/observable/interval": "rxjs-compat/_esm2015/observable/interval",
-    "rxjs/observable/if": "rxjs-compat/_esm2015/observable/if",
-    "rxjs/observable/generate": "rxjs-compat/_esm2015/observable/generate",
-    "rxjs/observable/fromPromise": "rxjs-compat/_esm2015/observable/fromPromise",
-    "rxjs/observable/fromIterable": "rxjs-compat/_esm2015/observable/fromIterable",
-    "rxjs/observable/fromEventPattern": "rxjs-compat/_esm2015/observable/fromEventPattern",
-    "rxjs/observable/fromEvent": "rxjs-compat/_esm2015/observable/fromEvent",
-    "rxjs/observable/fromArray": "rxjs-compat/_esm2015/observable/fromArray",
-    "rxjs/observable/from": "rxjs-compat/_esm2015/observable/from",
-    "rxjs/observable/forkJoin": "rxjs-compat/_esm2015/observable/forkJoin",
-    "rxjs/observable/empty": "rxjs-compat/_esm2015/observable/empty",
-    "rxjs/observable/dom/webSocket": "rxjs-compat/_esm2015/observable/dom/webSocket",
-    "rxjs/observable/dom/ajax": "rxjs-compat/_esm2015/observable/dom/ajax",
-    "rxjs/observable/dom/WebSocketSubject": "rxjs-compat/_esm2015/observable/dom/WebSocketSubject",
-    "rxjs/observable/dom/AjaxObservable": "rxjs-compat/_esm2015/observable/dom/AjaxObservable",
-    "rxjs/observable/defer": "rxjs-compat/_esm2015/observable/defer",
-    "rxjs/observable/concat": "rxjs-compat/_esm2015/observable/concat",
-    "rxjs/observable/combineLatest": "rxjs-compat/_esm2015/observable/combineLatest",
-    "rxjs/observable/bindNodeCallback": "rxjs-compat/_esm2015/observable/bindNodeCallback",
-    "rxjs/observable/bindCallback": "rxjs-compat/_esm2015/observable/bindCallback",
-    "rxjs/observable/UsingObservable": "rxjs-compat/_esm2015/observable/UsingObservable",
-    "rxjs/observable/TimerObservable": "rxjs-compat/_esm2015/observable/TimerObservable",
-    "rxjs/observable/SubscribeOnObservable": "rxjs-compat/_esm2015/observable/SubscribeOnObservable",
-    "rxjs/observable/ScalarObservable": "rxjs-compat/_esm2015/observable/ScalarObservable",
-    "rxjs/observable/RangeObservable": "rxjs-compat/_esm2015/observable/RangeObservable",
-    "rxjs/observable/PromiseObservable": "rxjs-compat/_esm2015/observable/PromiseObservable",
-    "rxjs/observable/PairsObservable": "rxjs-compat/_esm2015/observable/PairsObservable",
-    "rxjs/observable/NeverObservable": "rxjs-compat/_esm2015/observable/NeverObservable",
-    "rxjs/observable/IteratorObservable": "rxjs-compat/_esm2015/observable/IteratorObservable",
-    "rxjs/observable/IntervalObservable": "rxjs-compat/_esm2015/observable/IntervalObservable",
-    "rxjs/observable/IfObservable": "rxjs-compat/_esm2015/observable/IfObservable",
-    "rxjs/observable/GenerateObservable": "rxjs-compat/_esm2015/observable/GenerateObservable",
-    "rxjs/observable/FromObservable": "rxjs-compat/_esm2015/observable/FromObservable",
-    "rxjs/observable/FromEventPatternObservable": "rxjs-compat/_esm2015/observable/FromEventPatternObservable",
-    "rxjs/observable/FromEventObservable": "rxjs-compat/_esm2015/observable/FromEventObservable",
-    "rxjs/observable/ForkJoinObservable": "rxjs-compat/_esm2015/observable/ForkJoinObservable",
-    "rxjs/observable/ErrorObservable": "rxjs-compat/_esm2015/observable/ErrorObservable",
-    "rxjs/observable/EmptyObservable": "rxjs-compat/_esm2015/observable/EmptyObservable",
-    "rxjs/observable/DeferObservable": "rxjs-compat/_esm2015/observable/DeferObservable",
-    "rxjs/observable/ConnectableObservable": "rxjs-compat/_esm2015/observable/ConnectableObservable",
-    "rxjs/observable/BoundNodeCallbackObservable": "rxjs-compat/_esm2015/observable/BoundNodeCallbackObservable",
-    "rxjs/observable/BoundCallbackObservable": "rxjs-compat/_esm2015/observable/BoundCallbackObservable",
-    "rxjs/observable/ArrayObservable": "rxjs-compat/_esm2015/observable/ArrayObservable",
-    "rxjs/observable/ArrayLikeObservable": "rxjs-compat/_esm2015/observable/ArrayLikeObservable",
-    "rxjs/interfaces": "rxjs-compat/_esm2015/interfaces",
-    "rxjs/add/operator/zipAll": "rxjs-compat/_esm2015/add/operator/zipAll",
-    "rxjs/add/operator/zip": "rxjs-compat/_esm2015/add/operator/zip",
-    "rxjs/add/operator/withLatestFrom": "rxjs-compat/_esm2015/add/operator/withLatestFrom",
-    "rxjs/add/operator/windowWhen": "rxjs-compat/_esm2015/add/operator/windowWhen",
-    "rxjs/add/operator/windowToggle": "rxjs-compat/_esm2015/add/operator/windowToggle",
-    "rxjs/add/operator/windowTime": "rxjs-compat/_esm2015/add/operator/windowTime",
-    "rxjs/add/operator/windowCount": "rxjs-compat/_esm2015/add/operator/windowCount",
-    "rxjs/add/operator/window": "rxjs-compat/_esm2015/add/operator/window",
-    "rxjs/add/operator/toPromise": "rxjs-compat/_esm2015/add/operator/toPromise",
-    "rxjs/add/operator/toArray": "rxjs-compat/_esm2015/add/operator/toArray",
-    "rxjs/add/operator/timestamp": "rxjs-compat/_esm2015/add/operator/timestamp",
-    "rxjs/add/operator/timeoutWith": "rxjs-compat/_esm2015/add/operator/timeoutWith",
-    "rxjs/add/operator/timeout": "rxjs-compat/_esm2015/add/operator/timeout",
-    "rxjs/add/operator/timeInterval": "rxjs-compat/_esm2015/add/operator/timeInterval",
-    "rxjs/add/operator/throttleTime": "rxjs-compat/_esm2015/add/operator/throttleTime",
-    "rxjs/add/operator/throttle": "rxjs-compat/_esm2015/add/operator/throttle",
-    "rxjs/add/operator/takeWhile": "rxjs-compat/_esm2015/add/operator/takeWhile",
-    "rxjs/add/operator/takeUntil": "rxjs-compat/_esm2015/add/operator/takeUntil",
-    "rxjs/add/operator/takeLast": "rxjs-compat/_esm2015/add/operator/takeLast",
-    "rxjs/add/operator/take": "rxjs-compat/_esm2015/add/operator/take",
-    "rxjs/add/operator/switchMapTo": "rxjs-compat/_esm2015/add/operator/switchMapTo",
-    "rxjs/add/operator/switchMap": "rxjs-compat/_esm2015/add/operator/switchMap",
-    "rxjs/add/operator/switch": "rxjs-compat/_esm2015/add/operator/switch",
-    "rxjs/add/operator/subscribeOn": "rxjs-compat/_esm2015/add/operator/subscribeOn",
-    "rxjs/add/operator/startWith": "rxjs-compat/_esm2015/add/operator/startWith",
-    "rxjs/add/operator/skipWhile": "rxjs-compat/_esm2015/add/operator/skipWhile",
-    "rxjs/add/operator/skipUntil": "rxjs-compat/_esm2015/add/operator/skipUntil",
-    "rxjs/add/operator/skipLast": "rxjs-compat/_esm2015/add/operator/skipLast",
-    "rxjs/add/operator/skip": "rxjs-compat/_esm2015/add/operator/skip",
-    "rxjs/add/operator/single": "rxjs-compat/_esm2015/add/operator/single",
-    "rxjs/add/operator/shareReplay": "rxjs-compat/_esm2015/add/operator/shareReplay",
-    "rxjs/add/operator/share": "rxjs-compat/_esm2015/add/operator/share",
-    "rxjs/add/operator/sequenceEqual": "rxjs-compat/_esm2015/add/operator/sequenceEqual",
-    "rxjs/add/operator/scan": "rxjs-compat/_esm2015/add/operator/scan",
-    "rxjs/add/operator/sampleTime": "rxjs-compat/_esm2015/add/operator/sampleTime",
-    "rxjs/add/operator/sample": "rxjs-compat/_esm2015/add/operator/sample",
-    "rxjs/add/operator/retryWhen": "rxjs-compat/_esm2015/add/operator/retryWhen",
-    "rxjs/add/operator/retry": "rxjs-compat/_esm2015/add/operator/retry",
-    "rxjs/add/operator/repeatWhen": "rxjs-compat/_esm2015/add/operator/repeatWhen",
-    "rxjs/add/operator/repeat": "rxjs-compat/_esm2015/add/operator/repeat",
-    "rxjs/add/operator/reduce": "rxjs-compat/_esm2015/add/operator/reduce",
-    "rxjs/add/operator/race": "rxjs-compat/_esm2015/add/operator/race",
-    "rxjs/add/operator/publishReplay": "rxjs-compat/_esm2015/add/operator/publishReplay",
-    "rxjs/add/operator/publishLast": "rxjs-compat/_esm2015/add/operator/publishLast",
-    "rxjs/add/operator/publishBehavior": "rxjs-compat/_esm2015/add/operator/publishBehavior",
-    "rxjs/add/operator/publish": "rxjs-compat/_esm2015/add/operator/publish",
-    "rxjs/add/operator/pluck": "rxjs-compat/_esm2015/add/operator/pluck",
-    "rxjs/add/operator/partition": "rxjs-compat/_esm2015/add/operator/partition",
-    "rxjs/add/operator/pairwise": "rxjs-compat/_esm2015/add/operator/pairwise",
-    "rxjs/add/operator/onErrorResumeNext": "rxjs-compat/_esm2015/add/operator/onErrorResumeNext",
-    "rxjs/add/operator/observeOn": "rxjs-compat/_esm2015/add/operator/observeOn",
-    "rxjs/add/operator/multicast": "rxjs-compat/_esm2015/add/operator/multicast",
-    "rxjs/add/operator/min": "rxjs-compat/_esm2015/add/operator/min",
-    "rxjs/add/operator/mergeScan": "rxjs-compat/_esm2015/add/operator/mergeScan",
-    "rxjs/add/operator/mergeMapTo": "rxjs-compat/_esm2015/add/operator/mergeMapTo",
-    "rxjs/add/operator/mergeMap": "rxjs-compat/_esm2015/add/operator/mergeMap",
-    "rxjs/add/operator/mergeAll": "rxjs-compat/_esm2015/add/operator/mergeAll",
-    "rxjs/add/operator/merge": "rxjs-compat/_esm2015/add/operator/merge",
-    "rxjs/add/operator/max": "rxjs-compat/_esm2015/add/operator/max",
-    "rxjs/add/operator/materialize": "rxjs-compat/_esm2015/add/operator/materialize",
-    "rxjs/add/operator/mapTo": "rxjs-compat/_esm2015/add/operator/mapTo",
-    "rxjs/add/operator/map": "rxjs-compat/_esm2015/add/operator/map",
-    "rxjs/add/operator/let": "rxjs-compat/_esm2015/add/operator/let",
-    "rxjs/add/operator/last": "rxjs-compat/_esm2015/add/operator/last",
-    "rxjs/add/operator/isEmpty": "rxjs-compat/_esm2015/add/operator/isEmpty",
-    "rxjs/add/operator/ignoreElements": "rxjs-compat/_esm2015/add/operator/ignoreElements",
-    "rxjs/add/operator/groupBy": "rxjs-compat/_esm2015/add/operator/groupBy",
-    "rxjs/add/operator/first": "rxjs-compat/_esm2015/add/operator/first",
-    "rxjs/add/operator/findIndex": "rxjs-compat/_esm2015/add/operator/findIndex",
-    "rxjs/add/operator/find": "rxjs-compat/_esm2015/add/operator/find",
-    "rxjs/add/operator/finally": "rxjs-compat/_esm2015/add/operator/finally",
-    "rxjs/add/operator/filter": "rxjs-compat/_esm2015/add/operator/filter",
-    "rxjs/add/operator/expand": "rxjs-compat/_esm2015/add/operator/expand",
-    "rxjs/add/operator/exhaustMap": "rxjs-compat/_esm2015/add/operator/exhaustMap",
-    "rxjs/add/operator/exhaust": "rxjs-compat/_esm2015/add/operator/exhaust",
-    "rxjs/add/operator/every": "rxjs-compat/_esm2015/add/operator/every",
-    "rxjs/add/operator/elementAt": "rxjs-compat/_esm2015/add/operator/elementAt",
-    "rxjs/add/operator/do": "rxjs-compat/_esm2015/add/operator/do",
-    "rxjs/add/operator/distinctUntilKeyChanged": "rxjs-compat/_esm2015/add/operator/distinctUntilKeyChanged",
-    "rxjs/add/operator/distinctUntilChanged": "rxjs-compat/_esm2015/add/operator/distinctUntilChanged",
-    "rxjs/add/operator/distinct": "rxjs-compat/_esm2015/add/operator/distinct",
-    "rxjs/add/operator/dematerialize": "rxjs-compat/_esm2015/add/operator/dematerialize",
-    "rxjs/add/operator/delayWhen": "rxjs-compat/_esm2015/add/operator/delayWhen",
-    "rxjs/add/operator/delay": "rxjs-compat/_esm2015/add/operator/delay",
-    "rxjs/add/operator/defaultIfEmpty": "rxjs-compat/_esm2015/add/operator/defaultIfEmpty",
-    "rxjs/add/operator/debounceTime": "rxjs-compat/_esm2015/add/operator/debounceTime",
-    "rxjs/add/operator/debounce": "rxjs-compat/_esm2015/add/operator/debounce",
-    "rxjs/add/operator/count": "rxjs-compat/_esm2015/add/operator/count",
-    "rxjs/add/operator/concatMapTo": "rxjs-compat/_esm2015/add/operator/concatMapTo",
-    "rxjs/add/operator/concatMap": "rxjs-compat/_esm2015/add/operator/concatMap",
-    "rxjs/add/operator/concatAll": "rxjs-compat/_esm2015/add/operator/concatAll",
-    "rxjs/add/operator/concat": "rxjs-compat/_esm2015/add/operator/concat",
-    "rxjs/add/operator/combineLatest": "rxjs-compat/_esm2015/add/operator/combineLatest",
-    "rxjs/add/operator/combineAll": "rxjs-compat/_esm2015/add/operator/combineAll",
-    "rxjs/add/operator/catch": "rxjs-compat/_esm2015/add/operator/catch",
-    "rxjs/add/operator/bufferWhen": "rxjs-compat/_esm2015/add/operator/bufferWhen",
-    "rxjs/add/operator/bufferToggle": "rxjs-compat/_esm2015/add/operator/bufferToggle",
-    "rxjs/add/operator/bufferTime": "rxjs-compat/_esm2015/add/operator/bufferTime",
-    "rxjs/add/operator/bufferCount": "rxjs-compat/_esm2015/add/operator/bufferCount",
-    "rxjs/add/operator/buffer": "rxjs-compat/_esm2015/add/operator/buffer",
-    "rxjs/add/operator/auditTime": "rxjs-compat/_esm2015/add/operator/auditTime",
-    "rxjs/add/operator/audit": "rxjs-compat/_esm2015/add/operator/audit",
-    "rxjs/add/observable/zip": "rxjs-compat/_esm2015/add/observable/zip",
-    "rxjs/add/observable/using": "rxjs-compat/_esm2015/add/observable/using",
-    "rxjs/add/observable/timer": "rxjs-compat/_esm2015/add/observable/timer",
-    "rxjs/add/observable/throw": "rxjs-compat/_esm2015/add/observable/throw",
-    "rxjs/add/observable/range": "rxjs-compat/_esm2015/add/observable/range",
-    "rxjs/add/observable/race": "rxjs-compat/_esm2015/add/observable/race",
-    "rxjs/add/observable/pairs": "rxjs-compat/_esm2015/add/observable/pairs",
-    "rxjs/add/observable/onErrorResumeNext": "rxjs-compat/_esm2015/add/observable/onErrorResumeNext",
-    "rxjs/add/observable/of": "rxjs-compat/_esm2015/add/observable/of",
-    "rxjs/add/observable/never": "rxjs-compat/_esm2015/add/observable/never",
-    "rxjs/add/observable/merge": "rxjs-compat/_esm2015/add/observable/merge",
-    "rxjs/add/observable/interval": "rxjs-compat/_esm2015/add/observable/interval",
-    "rxjs/add/observable/if": "rxjs-compat/_esm2015/add/observable/if",
-    "rxjs/add/observable/generate": "rxjs-compat/_esm2015/add/observable/generate",
-    "rxjs/add/observable/fromPromise": "rxjs-compat/_esm2015/add/observable/fromPromise",
-    "rxjs/add/observable/fromEventPattern": "rxjs-compat/_esm2015/add/observable/fromEventPattern",
-    "rxjs/add/observable/fromEvent": "rxjs-compat/_esm2015/add/observable/fromEvent",
-    "rxjs/add/observable/from": "rxjs-compat/_esm2015/add/observable/from",
-    "rxjs/add/observable/forkJoin": "rxjs-compat/_esm2015/add/observable/forkJoin",
-    "rxjs/add/observable/empty": "rxjs-compat/_esm2015/add/observable/empty",
-    "rxjs/add/observable/dom/webSocket": "rxjs-compat/_esm2015/add/observable/dom/webSocket",
-    "rxjs/add/observable/dom/ajax": "rxjs-compat/_esm2015/add/observable/dom/ajax",
-    "rxjs/add/observable/defer": "rxjs-compat/_esm2015/add/observable/defer",
-    "rxjs/add/observable/concat": "rxjs-compat/_esm2015/add/observable/concat",
-    "rxjs/add/observable/combineLatest": "rxjs-compat/_esm2015/add/observable/combineLatest",
-    "rxjs/add/observable/bindNodeCallback": "rxjs-compat/_esm2015/add/observable/bindNodeCallback",
-    "rxjs/add/observable/bindCallback": "rxjs-compat/_esm2015/add/observable/bindCallback",
-    "rxjs/Subscription": "rxjs-compat/_esm2015/Subscription",
-    "rxjs/Subscriber": "rxjs-compat/_esm2015/Subscriber",
-    "rxjs/SubjectSubscription": "rxjs-compat/_esm2015/SubjectSubscription",
-    "rxjs/Subject": "rxjs-compat/_esm2015/Subject",
-    "rxjs/Scheduler": "rxjs-compat/_esm2015/Scheduler",
-    "rxjs/Rx": "rxjs-compat/_esm2015/Rx",
-    "rxjs/ReplaySubject": "rxjs-compat/_esm2015/ReplaySubject",
-    "rxjs/OuterSubscriber": "rxjs-compat/_esm2015/OuterSubscriber",
-    "rxjs/Operator": "rxjs-compat/_esm2015/Operator",
-    "rxjs/Observer": "rxjs-compat/_esm2015/Observer",
-    "rxjs/Observable": "rxjs-compat/_esm2015/Observable",
-    "rxjs/Notification": "rxjs-compat/_esm2015/Notification",
-    "rxjs/InnerSubscriber": "rxjs-compat/_esm2015/InnerSubscriber",
-    "rxjs/BehaviorSubject": "rxjs-compat/_esm2015/BehaviorSubject",
-    "rxjs/AsyncSubject": "rxjs-compat/_esm2015/AsyncSubject"
-};
-}
diff --git a/node_modules/rxjs/_esm2015/testing/index.js b/node_modules/rxjs/_esm2015/testing/index.js
deleted file mode 100644
index f0f7b53..0000000
--- a/node_modules/rxjs/_esm2015/testing/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-export { TestScheduler } from '../internal/testing/TestScheduler';
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/testing/index.js.map b/node_modules/rxjs/_esm2015/testing/index.js.map
deleted file mode 100644
index 6882405..0000000
--- a/node_modules/rxjs/_esm2015/testing/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC"}
diff --git a/node_modules/rxjs/_esm2015/webSocket/index.js b/node_modules/rxjs/_esm2015/webSocket/index.js
deleted file mode 100644
index a4bb4ea..0000000
--- a/node_modules/rxjs/_esm2015/webSocket/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export { webSocket as webSocket } from '../internal/observable/dom/webSocket';
-export { WebSocketSubject } from '../internal/observable/dom/WebSocketSubject';
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/_esm2015/webSocket/index.js.map b/node_modules/rxjs/_esm2015/webSocket/index.js.map
deleted file mode 100644
index 599e9a7..0000000
--- a/node_modules/rxjs/_esm2015/webSocket/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/webSocket/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAA0B,MAAM,6CAA6C,CAAC"}
diff --git a/node_modules/rxjs/_esm5/LICENSE.txt b/node_modules/rxjs/_esm5/LICENSE.txt
deleted file mode 100644
index 031ce38..0000000
--- a/node_modules/rxjs/_esm5/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-                               Apache License
-                         Version 2.0, January 2004
-                      http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
-    "License" shall mean the terms and conditions for use, reproduction,
-    and distribution as defined by Sections 1 through 9 of this document.
-
-    "Licensor" shall mean the copyright owner or entity authorized by
-    the copyright owner that is granting the License.
-
-    "Legal Entity" shall mean the union of the acting entity and all
-    other entities that control, are controlled by, or are under common
-    control with that entity. For the purposes of this definition,
-    "control" means (i) the power, direct or indirect, to cause the
-    direction or management of such entity, whether by contract or
-    otherwise, or (ii) ownership of fifty percent (50%) or more of the
-    outstanding shares, or (iii) beneficial ownership of such entity.
-
-    "You" (or "Your") shall mean an individual or Legal Entity
-    exercising permissions granted by this License.
-
-    "Source" form shall mean the preferred form for making modifications,
-    including but not limited to software source code, documentation
-    source, and configuration files.
-
-    "Object" form shall mean any form resulting from mechanical
-    transformation or translation of a Source form, including but
-    not limited to compiled object code, generated documentation,
-    and conversions to other media types.
-
-    "Work" shall mean the work of authorship, whether in Source or
-    Object form, made available under the License, as indicated by a
-    copyright notice that is included in or attached to the work
-    (an example is provided in the Appendix below).
-
-    "Derivative Works" shall mean any work, whether in Source or Object
-    form, that is based on (or derived from) the Work and for which the
-    editorial revisions, annotations, elaborations, or other modifications
-    represent, as a whole, an original work of authorship. For the purposes
-    of this License, Derivative Works shall not include works that remain
-    separable from, or merely link (or bind by name) to the interfaces of,
-    the Work and Derivative Works thereof.
-
-    "Contribution" shall mean any work of authorship, including
-    the original version of the Work and any modifications or additions
-    to that Work or Derivative Works thereof, that is intentionally
-    submitted to Licensor for inclusion in the Work by the copyright owner
-    or by an individual or Legal Entity authorized to submit on behalf of
-    the copyright owner. For the purposes of this definition, "submitted"
-    means any form of electronic, verbal, or written communication sent
-    to the Licensor or its representatives, including but not limited to
-    communication on electronic mailing lists, source code control systems,
-    and issue tracking systems that are managed by, or on behalf of, the
-    Licensor for the purpose of discussing and improving the Work, but
-    excluding communication that is conspicuously marked or otherwise
-    designated in writing by the copyright owner as "Not a Contribution."
-
-    "Contributor" shall mean Licensor and any individual or Legal Entity
-    on behalf of whom a Contribution has been received by Licensor and
-    subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    copyright license to reproduce, prepare Derivative Works of,
-    publicly display, publicly perform, sublicense, and distribute the
-    Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    (except as stated in this section) patent license to make, have made,
-    use, offer to sell, sell, import, and otherwise transfer the Work,
-    where such license applies only to those patent claims licensable
-    by such Contributor that are necessarily infringed by their
-    Contribution(s) alone or by combination of their Contribution(s)
-    with the Work to which such Contribution(s) was submitted. If You
-    institute patent litigation against any entity (including a
-    cross-claim or counterclaim in a lawsuit) alleging that the Work
-    or a Contribution incorporated within the Work constitutes direct
-    or contributory patent infringement, then any patent licenses
-    granted to You under this License for that Work shall terminate
-    as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
-    Work or Derivative Works thereof in any medium, with or without
-    modifications, and in Source or Object form, provided that You
-    meet the following conditions:
-
-    (a) You must give any other recipients of the Work or
-        Derivative Works a copy of this License; and
-
-    (b) You must cause any modified files to carry prominent notices
-        stating that You changed the files; and
-
-    (c) You must retain, in the Source form of any Derivative Works
-        that You distribute, all copyright, patent, trademark, and
-        attribution notices from the Source form of the Work,
-        excluding those notices that do not pertain to any part of
-        the Derivative Works; and
-
-    (d) If the Work includes a "NOTICE" text file as part of its
-        distribution, then any Derivative Works that You distribute must
-        include a readable copy of the attribution notices contained
-        within such NOTICE file, excluding those notices that do not
-        pertain to any part of the Derivative Works, in at least one
-        of the following places: within a NOTICE text file distributed
-        as part of the Derivative Works; within the Source form or
-        documentation, if provided along with the Derivative Works; or,
-        within a display generated by the Derivative Works, if and
-        wherever such third-party notices normally appear. The contents
-        of the NOTICE file are for informational purposes only and
-        do not modify the License. You may add Your own attribution
-        notices within Derivative Works that You distribute, alongside
-        or as an addendum to the NOTICE text from the Work, provided
-        that such additional attribution notices cannot be construed
-        as modifying the License.
-
-    You may add Your own copyright statement to Your modifications and
-    may provide additional or different license terms and conditions
-    for use, reproduction, or distribution of Your modifications, or
-    for any such Derivative Works as a whole, provided Your use,
-    reproduction, and distribution of the Work otherwise complies with
-    the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
-    any Contribution intentionally submitted for inclusion in the Work
-    by You to the Licensor shall be under the terms and conditions of
-    this License, without any additional terms or conditions.
-    Notwithstanding the above, nothing herein shall supersede or modify
-    the terms of any separate license agreement you may have executed
-    with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
-    names, trademarks, service marks, or product names of the Licensor,
-    except as required for reasonable and customary use in describing the
-    origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
-    agreed to in writing, Licensor provides the Work (and each
-    Contributor provides its Contributions) on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-    implied, including, without limitation, any warranties or conditions
-    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-    PARTICULAR PURPOSE. You are solely responsible for determining the
-    appropriateness of using or redistributing the Work and assume any
-    risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
-    whether in tort (including negligence), contract, or otherwise,
-    unless required by applicable law (such as deliberate and grossly
-    negligent acts) or agreed to in writing, shall any Contributor be
-    liable to You for damages, including any direct, indirect, special,
-    incidental, or consequential damages of any character arising as a
-    result of this License or out of the use or inability to use the
-    Work (including but not limited to damages for loss of goodwill,
-    work stoppage, computer failure or malfunction, or any and all
-    other commercial damages or losses), even if such Contributor
-    has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
-    the Work or Derivative Works thereof, You may choose to offer,
-    and charge a fee for, acceptance of support, warranty, indemnity,
-    or other liability obligations and/or rights consistent with this
-    License. However, in accepting such obligations, You may act only
-    on Your own behalf and on Your sole responsibility, not on behalf
-    of any other Contributor, and only if You agree to indemnify,
-    defend, and hold each Contributor harmless for any liability
-    incurred by, or claims asserted against, such Contributor by reason
-    of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
-    To apply the Apache License to your work, attach the following
-    boilerplate notice, with the fields enclosed by brackets "[]"
-    replaced with your own identifying information. (Don't include
-    the brackets!)  The text should be enclosed in the appropriate
-    comment syntax for the file format. We also recommend that a
-    file or class name and description of purpose be included on the
-    same "printed page" as the copyright notice for easier
-    identification within third-party archives.
-
- Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- 
diff --git a/node_modules/rxjs/_esm5/README.md b/node_modules/rxjs/_esm5/README.md
deleted file mode 100644
index e9204f0..0000000
--- a/node_modules/rxjs/_esm5/README.md
+++ /dev/null
@@ -1,145 +0,0 @@
-<img src="doc/asset/Rx_Logo_S.png" alt="RxJS Logo" width="86" height="86"> RxJS: Reactive Extensions For JavaScript
-======================================
-
-
-[![CircleCI](https://circleci.com/gh/ReactiveX/rxjs/tree/6.x.svg?style=svg)](https://circleci.com/gh/ReactiveX/rxjs/tree/6.x)
-[![npm version](https://badge.fury.io/js/%40reactivex%2Frxjs.svg)](http://badge.fury.io/js/%40reactivex%2Frxjs)
-[![Join the chat at https://gitter.im/Reactive-Extensions/RxJS](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Reactive-Extensions/RxJS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-# RxJS 6 Stable
-
-### MIGRATION AND RELEASE INFORMATION:
-
-Find out how to update to v6, **automatically update your TypeScript code**, and more!
-
-- [Current home is MIGRATION.md](./docs_app/content/guide/v6/migration.md)
-
-### FOR V 5.X PLEASE GO TO [THE 5.0 BRANCH](https://github.com/ReactiveX/rxjs/tree/5.x)
-
-Reactive Extensions Library for JavaScript. This is a rewrite of [Reactive-Extensions/RxJS](https://github.com/Reactive-Extensions/RxJS) and is the latest production-ready version of RxJS. This rewrite is meant to have better performance, better modularity, better debuggable call stacks, while staying mostly backwards compatible, with some breaking changes that reduce the API surface.
-
-[Apache 2.0 License](LICENSE.txt)
-
-- [Code of Conduct](CODE_OF_CONDUCT.md)
-- [Contribution Guidelines](CONTRIBUTING.md)
-- [Maintainer Guidelines](doc/maintainer-guidelines.md)
-- [Creating Operators](doc/operator-creation.md)
-- [API Documentation (WIP)](https://rxjs.dev/)
-
-## Versions In This Repository
-
-- [master](https://github.com/ReactiveX/rxjs/commits/master) - This is all of the current, unreleased work, which is against v6 of RxJS right now
-- [stable](https://github.com/ReactiveX/rxjs/commits/stable) - This is the branch for the latest version you'd get if you do `npm install rxjs`
-
-## Important
-
-By contributing or commenting on issues in this repository, whether you've read them or not, you're agreeing to the [Contributor Code of Conduct](CODE_OF_CONDUCT.md). Much like traffic laws, ignorance doesn't grant you immunity.
-
-## Installation and Usage
-
-### ES6 via npm
-
-```sh
-npm install rxjs
-```
-
-It's recommended to pull in the Observable creation methods you need directly from `'rxjs'` as shown below with `range`. And you can pull in any operator you need from one spot, under `'rxjs/operators'`.
-
-```js
-import { range } from 'rxjs';
-import { map, filter } from 'rxjs/operators';
-
-range(1, 200).pipe(
-  filter(x => x % 2 === 1),
-  map(x => x + x)
-).subscribe(x => console.log(x));
-```
-
-Here, we're using the built-in `pipe` method on Observables to combine operators. See [pipeable operators](https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md) for more information.
-
-### CommonJS via npm
-
-To install this library for CommonJS (CJS) usage, use the following command:
-
-```sh
-npm install rxjs
-```
-
-(Note: destructuring available in Node 8+)
-
-```js
-const { range } = require('rxjs');
-const { map, filter } = require('rxjs/operators');
-
-range(1, 200).pipe(
-  filter(x => x % 2 === 1),
-  map(x => x + x)
-).subscribe(x => console.log(x));
-```
-
-### CDN
-
-For CDN, you can use [unpkg](https://unpkg.com/):
-
-https://unpkg.com/rxjs/bundles/rxjs.umd.min.js
-
-The global namespace for rxjs is `rxjs`:
-
-```js
-const { range } = rxjs;
-const { map, filter } = rxjs.operators;
-
-range(1, 200).pipe(
-  filter(x => x % 2 === 1),
-  map(x => x + x)
-).subscribe(x => console.log(x));
-```
-
-## Goals
-
-- Smaller overall bundles sizes
-- Provide better performance than preceding versions of RxJS
-- To model/follow the [Observable Spec Proposal](https://github.com/zenparsing/es-observable) to the observable
-- Provide more modular file structure in a variety of formats
-- Provide more debuggable call stacks than preceding versions of RxJS
-
-## Building/Testing
-
-- `npm run build_all` - builds everything
-- `npm test` - runs tests
-- `npm run test_no_cache` - run test with `ts-node` set to false
-
-## Performance Tests
-
-Run `npm run build_perf` or `npm run perf` to run the performance tests with `protractor`.
-
-Run `npm run perf_micro [operator]` to run micro performance test benchmarking operator.
-
-## Adding documentation
-We appreciate all contributions to the documentation of any type. All of the information needed to get the docs app up and running locally as well as how to contribute can be found in the [documentation directory](./docs_app).
-
-## Generating PNG marble diagrams
-
-The script `npm run tests2png` requires some native packages installed locally: `imagemagick`, `graphicsmagick`, and `ghostscript`.
-
-For Mac OS X with [Homebrew](http://brew.sh/):
-
-- `brew install imagemagick`
-- `brew install graphicsmagick`
-- `brew install ghostscript`
-- You may need to install the Ghostscript fonts manually:
-  - Download the tarball from the [gs-fonts project](https://sourceforge.net/projects/gs-fonts)
-  - `mkdir -p /usr/local/share/ghostscript && tar zxvf /path/to/ghostscript-fonts.tar.gz -C /usr/local/share/ghostscript`
-
-For Debian Linux:
-
-- `sudo add-apt-repository ppa:dhor/myway`
-- `apt-get install imagemagick`
-- `apt-get install graphicsmagick`
-- `apt-get install ghostscript`
-
-For Windows and other Operating Systems, check the download instructions here:
-
-- http://imagemagick.org
-- http://www.graphicsmagick.org
-- http://www.ghostscript.com/
diff --git a/node_modules/rxjs/_esm5/ajax/index.js b/node_modules/rxjs/_esm5/ajax/index.js
deleted file mode 100644
index 0f1bf03..0000000
--- a/node_modules/rxjs/_esm5/ajax/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export { ajax } from '../internal/observable/dom/ajax';
-export { AjaxResponse, AjaxError, AjaxTimeoutError } from '../internal/observable/dom/AjaxObservable';
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/rxjs/_esm5/ajax/index.js.map b/node_modules/rxjs/_esm5/ajax/index.js.map
deleted file mode 100644
index 038e2b1..0000000
--- a/node_modules/rxjs/_esm5/ajax/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/ajax/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AACvD,OAAO,EAAe,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC"}
diff --git a/node_modules/rxjs/_esm5/fetch/index.js b/node_modules/rxjs/_esm5/fetch/index.js
deleted file mode 100644
index d6c825b..0000000
--- a/node_modules/rxjs/_esm5/fetch/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export { fromFetch } from '../internal/observable/dom/fetch';
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/rxjs/_esm5/fetch/index.js.map b/node_modules/rxjs/_esm5/fetch/index.js.map
deleted file mode 100644
index 8bf783b..0000000
--- a/node_modules/rxjs/_esm5/fetch/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/fetch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/index.js b/node_modules/rxjs/_esm5/index.js
deleted file mode 100644
index c260ad0..0000000
--- a/node_modules/rxjs/_esm5/index.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export { Observable } from './internal/Observable';
-export { ConnectableObservable } from './internal/observable/ConnectableObservable';
-export { GroupedObservable } from './internal/operators/groupBy';
-export { observable } from './internal/symbol/observable';
-export { Subject } from './internal/Subject';
-export { BehaviorSubject } from './internal/BehaviorSubject';
-export { ReplaySubject } from './internal/ReplaySubject';
-export { AsyncSubject } from './internal/AsyncSubject';
-export { asap as asapScheduler } from './internal/scheduler/asap';
-export { async as asyncScheduler } from './internal/scheduler/async';
-export { queue as queueScheduler } from './internal/scheduler/queue';
-export { animationFrame as animationFrameScheduler } from './internal/scheduler/animationFrame';
-export { VirtualTimeScheduler, VirtualAction } from './internal/scheduler/VirtualTimeScheduler';
-export { Scheduler } from './internal/Scheduler';
-export { Subscription } from './internal/Subscription';
-export { Subscriber } from './internal/Subscriber';
-export { Notification, NotificationKind } from './internal/Notification';
-export { pipe } from './internal/util/pipe';
-export { noop } from './internal/util/noop';
-export { identity } from './internal/util/identity';
-export { isObservable } from './internal/util/isObservable';
-export { ArgumentOutOfRangeError } from './internal/util/ArgumentOutOfRangeError';
-export { EmptyError } from './internal/util/EmptyError';
-export { ObjectUnsubscribedError } from './internal/util/ObjectUnsubscribedError';
-export { UnsubscriptionError } from './internal/util/UnsubscriptionError';
-export { TimeoutError } from './internal/util/TimeoutError';
-export { bindCallback } from './internal/observable/bindCallback';
-export { bindNodeCallback } from './internal/observable/bindNodeCallback';
-export { combineLatest } from './internal/observable/combineLatest';
-export { concat } from './internal/observable/concat';
-export { defer } from './internal/observable/defer';
-export { empty } from './internal/observable/empty';
-export { forkJoin } from './internal/observable/forkJoin';
-export { from } from './internal/observable/from';
-export { fromEvent } from './internal/observable/fromEvent';
-export { fromEventPattern } from './internal/observable/fromEventPattern';
-export { generate } from './internal/observable/generate';
-export { iif } from './internal/observable/iif';
-export { interval } from './internal/observable/interval';
-export { merge } from './internal/observable/merge';
-export { never } from './internal/observable/never';
-export { of } from './internal/observable/of';
-export { onErrorResumeNext } from './internal/observable/onErrorResumeNext';
-export { pairs } from './internal/observable/pairs';
-export { partition } from './internal/observable/partition';
-export { race } from './internal/observable/race';
-export { range } from './internal/observable/range';
-export { throwError } from './internal/observable/throwError';
-export { timer } from './internal/observable/timer';
-export { using } from './internal/observable/using';
-export { zip } from './internal/observable/zip';
-export { scheduled } from './internal/scheduled/scheduled';
-export { EMPTY } from './internal/observable/empty';
-export { NEVER } from './internal/observable/never';
-export { config } from './internal/config';
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/rxjs/_esm5/index.js.map b/node_modules/rxjs/_esm5/index.js.map
deleted file mode 100644
index 35faa43..0000000
--- a/node_modules/rxjs/_esm5/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAG1D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,cAAc,IAAI,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAChG,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGzE,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAG3D,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAMpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal-compatibility/index.js b/node_modules/rxjs/_esm5/internal-compatibility/index.js
deleted file mode 100644
index 2164bc8..0000000
--- a/node_modules/rxjs/_esm5/internal-compatibility/index.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export { config } from '../internal/config';
-export { InnerSubscriber } from '../internal/InnerSubscriber';
-export { OuterSubscriber } from '../internal/OuterSubscriber';
-export { Scheduler } from '../internal/Scheduler';
-export { AnonymousSubject } from '../internal/Subject';
-export { SubjectSubscription } from '../internal/SubjectSubscription';
-export { Subscriber } from '../internal/Subscriber';
-export { fromPromise } from '../internal/observable/fromPromise';
-export { fromIterable } from '../internal/observable/fromIterable';
-export { ajax } from '../internal/observable/dom/ajax';
-export { webSocket } from '../internal/observable/dom/webSocket';
-export { ajaxGet, ajaxPost, ajaxDelete, ajaxPut, ajaxPatch, ajaxGetJSON, AjaxObservable, AjaxSubscriber, AjaxResponse, AjaxError, AjaxTimeoutError } from '../internal/observable/dom/AjaxObservable';
-export { WebSocketSubject } from '../internal/observable/dom/WebSocketSubject';
-export { CombineLatestOperator } from '../internal/observable/combineLatest';
-export { dispatch } from '../internal/observable/range';
-export { SubscribeOnObservable } from '../internal/observable/SubscribeOnObservable';
-export { Timestamp } from '../internal/operators/timestamp';
-export { TimeInterval } from '../internal/operators/timeInterval';
-export { GroupedObservable } from '../internal/operators/groupBy';
-export { defaultThrottleConfig } from '../internal/operators/throttle';
-export { rxSubscriber } from '../internal/symbol/rxSubscriber';
-export { iterator } from '../internal/symbol/iterator';
-export { observable } from '../internal/symbol/observable';
-export { ArgumentOutOfRangeError } from '../internal/util/ArgumentOutOfRangeError';
-export { EmptyError } from '../internal/util/EmptyError';
-export { Immediate } from '../internal/util/Immediate';
-export { ObjectUnsubscribedError } from '../internal/util/ObjectUnsubscribedError';
-export { TimeoutError } from '../internal/util/TimeoutError';
-export { UnsubscriptionError } from '../internal/util/UnsubscriptionError';
-export { applyMixins } from '../internal/util/applyMixins';
-export { errorObject } from '../internal/util/errorObject';
-export { hostReportError } from '../internal/util/hostReportError';
-export { identity } from '../internal/util/identity';
-export { isArray } from '../internal/util/isArray';
-export { isArrayLike } from '../internal/util/isArrayLike';
-export { isDate } from '../internal/util/isDate';
-export { isFunction } from '../internal/util/isFunction';
-export { isIterable } from '../internal/util/isIterable';
-export { isNumeric } from '../internal/util/isNumeric';
-export { isObject } from '../internal/util/isObject';
-export { isInteropObservable as isObservable } from '../internal/util/isInteropObservable';
-export { isPromise } from '../internal/util/isPromise';
-export { isScheduler } from '../internal/util/isScheduler';
-export { noop } from '../internal/util/noop';
-export { not } from '../internal/util/not';
-export { pipe } from '../internal/util/pipe';
-export { root } from '../internal/util/root';
-export { subscribeTo } from '../internal/util/subscribeTo';
-export { subscribeToArray } from '../internal/util/subscribeToArray';
-export { subscribeToIterable } from '../internal/util/subscribeToIterable';
-export { subscribeToObservable } from '../internal/util/subscribeToObservable';
-export { subscribeToPromise } from '../internal/util/subscribeToPromise';
-export { subscribeToResult } from '../internal/util/subscribeToResult';
-export { toSubscriber } from '../internal/util/toSubscriber';
-export { tryCatch } from '../internal/util/tryCatch';
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/rxjs/_esm5/internal-compatibility/index.js.map b/node_modules/rxjs/_esm5/internal-compatibility/index.js.map
deleted file mode 100644
index 9de2eb9..0000000
--- a/node_modules/rxjs/_esm5/internal-compatibility/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/internal-compatibility/index.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/AsyncSubject.js b/node_modules/rxjs/_esm5/internal/AsyncSubject.js
deleted file mode 100644
index 8c92fbb..0000000
--- a/node_modules/rxjs/_esm5/internal/AsyncSubject.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subject,_Subscription PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subject } from './Subject';
-import { Subscription } from './Subscription';
-var AsyncSubject = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(AsyncSubject, _super);
-    function AsyncSubject() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this.value = null;
-        _this.hasNext = false;
-        _this.hasCompleted = false;
-        return _this;
-    }
-    AsyncSubject.prototype._subscribe = function (subscriber) {
-        if (this.hasError) {
-            subscriber.error(this.thrownError);
-            return Subscription.EMPTY;
-        }
-        else if (this.hasCompleted && this.hasNext) {
-            subscriber.next(this.value);
-            subscriber.complete();
-            return Subscription.EMPTY;
-        }
-        return _super.prototype._subscribe.call(this, subscriber);
-    };
-    AsyncSubject.prototype.next = function (value) {
-        if (!this.hasCompleted) {
-            this.value = value;
-            this.hasNext = true;
-        }
-    };
-    AsyncSubject.prototype.error = function (error) {
-        if (!this.hasCompleted) {
-            _super.prototype.error.call(this, error);
-        }
-    };
-    AsyncSubject.prototype.complete = function () {
-        this.hasCompleted = true;
-        if (this.hasNext) {
-            _super.prototype.next.call(this, this.value);
-        }
-        _super.prototype.complete.call(this);
-    };
-    return AsyncSubject;
-}(Subject));
-export { AsyncSubject };
-//# sourceMappingURL=AsyncSubject.js.map
diff --git a/node_modules/rxjs/_esm5/internal/AsyncSubject.js.map b/node_modules/rxjs/_esm5/internal/AsyncSubject.js.map
deleted file mode 100644
index cdf243a..0000000
--- a/node_modules/rxjs/_esm5/internal/AsyncSubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsyncSubject.js","sources":["../../src/internal/AsyncSubject.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQ9C;IAAqC,wCAAU;IAA/C;QAAA,qEAsCC;QArCS,WAAK,GAAM,IAAI,CAAC;QAChB,aAAO,GAAY,KAAK,CAAC;QACzB,kBAAY,GAAY,KAAK,CAAC;;IAmCxC,CAAC;IAhCC,iCAAU,GAAV,UAAW,UAA2B;QACpC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnC,OAAO,YAAY,CAAC,KAAK,CAAC;SAC3B;aAAM,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE;YAC5C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,UAAU,CAAC,QAAQ,EAAE,CAAC;YACtB,OAAO,YAAY,CAAC,KAAK,CAAC;SAC3B;QACD,OAAO,iBAAM,UAAU,YAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,2BAAI,GAAJ,UAAK,KAAQ;QACX,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;SACrB;IACH,CAAC;IAED,4BAAK,GAAL,UAAM,KAAU;QACd,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,iBAAM,KAAK,YAAC,KAAK,CAAC,CAAC;SACpB;IACH,CAAC;IAED,+BAAQ,GAAR;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,iBAAM,IAAI,YAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACxB;QACD,iBAAM,QAAQ,WAAE,CAAC;IACnB,CAAC;IACH,mBAAC;AAAD,CAAC,AAtCD,CAAqC,OAAO,GAsC3C"}
diff --git a/node_modules/rxjs/_esm5/internal/BehaviorSubject.js b/node_modules/rxjs/_esm5/internal/BehaviorSubject.js
deleted file mode 100644
index c7ddbd6..0000000
--- a/node_modules/rxjs/_esm5/internal/BehaviorSubject.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subject,_util_ObjectUnsubscribedError PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subject } from './Subject';
-import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
-var BehaviorSubject = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(BehaviorSubject, _super);
-    function BehaviorSubject(_value) {
-        var _this = _super.call(this) || this;
-        _this._value = _value;
-        return _this;
-    }
-    Object.defineProperty(BehaviorSubject.prototype, "value", {
-        get: function () {
-            return this.getValue();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    BehaviorSubject.prototype._subscribe = function (subscriber) {
-        var subscription = _super.prototype._subscribe.call(this, subscriber);
-        if (subscription && !subscription.closed) {
-            subscriber.next(this._value);
-        }
-        return subscription;
-    };
-    BehaviorSubject.prototype.getValue = function () {
-        if (this.hasError) {
-            throw this.thrownError;
-        }
-        else if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        else {
-            return this._value;
-        }
-    };
-    BehaviorSubject.prototype.next = function (value) {
-        _super.prototype.next.call(this, this._value = value);
-    };
-    return BehaviorSubject;
-}(Subject));
-export { BehaviorSubject };
-//# sourceMappingURL=BehaviorSubject.js.map
diff --git a/node_modules/rxjs/_esm5/internal/BehaviorSubject.js.map b/node_modules/rxjs/_esm5/internal/BehaviorSubject.js.map
deleted file mode 100644
index cc33132..0000000
--- a/node_modules/rxjs/_esm5/internal/BehaviorSubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"BehaviorSubject.js","sources":["../../src/internal/BehaviorSubject.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAQzE;IAAwC,2CAAU;IAEhD,yBAAoB,MAAS;QAA7B,YACE,iBAAO,SACR;QAFmB,YAAM,GAAN,MAAM,CAAG;;IAE7B,CAAC;IAED,sBAAI,kCAAK;aAAT;YACE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC;;;OAAA;IAGD,oCAAU,GAAV,UAAW,UAAyB;QAClC,IAAM,YAAY,GAAG,iBAAM,UAAU,YAAC,UAAU,CAAC,CAAC;QAClD,IAAI,YAAY,IAAI,CAAoB,YAAa,CAAC,MAAM,EAAE;YAC5D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC9B;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,kCAAQ,GAAR;QACE,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,IAAI,CAAC,WAAW,CAAC;SACxB;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE;YACtB,MAAM,IAAI,uBAAuB,EAAE,CAAC;SACrC;aAAM;YACL,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;IACH,CAAC;IAED,8BAAI,GAAJ,UAAK,KAAQ;QACX,iBAAM,IAAI,YAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IAClC,CAAC;IACH,sBAAC;AAAD,CAAC,AAhCD,CAAwC,OAAO,GAgC9C"}
diff --git a/node_modules/rxjs/_esm5/internal/InnerSubscriber.js b/node_modules/rxjs/_esm5/internal/InnerSubscriber.js
deleted file mode 100644
index d92fa72..0000000
--- a/node_modules/rxjs/_esm5/internal/InnerSubscriber.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from './Subscriber';
-var InnerSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(InnerSubscriber, _super);
-    function InnerSubscriber(parent, outerValue, outerIndex) {
-        var _this = _super.call(this) || this;
-        _this.parent = parent;
-        _this.outerValue = outerValue;
-        _this.outerIndex = outerIndex;
-        _this.index = 0;
-        return _this;
-    }
-    InnerSubscriber.prototype._next = function (value) {
-        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
-    };
-    InnerSubscriber.prototype._error = function (error) {
-        this.parent.notifyError(error, this);
-        this.unsubscribe();
-    };
-    InnerSubscriber.prototype._complete = function () {
-        this.parent.notifyComplete(this);
-        this.unsubscribe();
-    };
-    return InnerSubscriber;
-}(Subscriber));
-export { InnerSubscriber };
-//# sourceMappingURL=InnerSubscriber.js.map
diff --git a/node_modules/rxjs/_esm5/internal/InnerSubscriber.js.map b/node_modules/rxjs/_esm5/internal/InnerSubscriber.js.map
deleted file mode 100644
index 4522441..0000000
--- a/node_modules/rxjs/_esm5/internal/InnerSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"InnerSubscriber.js","sources":["../../src/internal/InnerSubscriber.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ1C;IAA2C,2CAAa;IAGtD,yBAAoB,MAA6B,EAAS,UAAa,EAAS,UAAkB;QAAlG,YACE,iBAAO,SACR;QAFmB,YAAM,GAAN,MAAM,CAAuB;QAAS,gBAAU,GAAV,UAAU,CAAG;QAAS,gBAAU,GAAV,UAAU,CAAQ;QAF1F,WAAK,GAAG,CAAC,CAAC;;IAIlB,CAAC;IAES,+BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;IACtF,CAAC;IAES,gCAAM,GAAhB,UAAiB,KAAU;QACzB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,mCAAS,GAAnB;QACE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IACH,sBAAC;AAAD,CAAC,AApBD,CAA2C,UAAU,GAoBpD"}
diff --git a/node_modules/rxjs/_esm5/internal/Notification.js b/node_modules/rxjs/_esm5/internal/Notification.js
deleted file mode 100644
index 3f7dcd7..0000000
--- a/node_modules/rxjs/_esm5/internal/Notification.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/** PURE_IMPORTS_START _observable_empty,_observable_of,_observable_throwError PURE_IMPORTS_END */
-import { empty } from './observable/empty';
-import { of } from './observable/of';
-import { throwError } from './observable/throwError';
-export var NotificationKind;
-/*@__PURE__*/ (function (NotificationKind) {
-    NotificationKind["NEXT"] = "N";
-    NotificationKind["ERROR"] = "E";
-    NotificationKind["COMPLETE"] = "C";
-})(NotificationKind || (NotificationKind = {}));
-var Notification = /*@__PURE__*/ (function () {
-    function Notification(kind, value, error) {
-        this.kind = kind;
-        this.value = value;
-        this.error = error;
-        this.hasValue = kind === 'N';
-    }
-    Notification.prototype.observe = function (observer) {
-        switch (this.kind) {
-            case 'N':
-                return observer.next && observer.next(this.value);
-            case 'E':
-                return observer.error && observer.error(this.error);
-            case 'C':
-                return observer.complete && observer.complete();
-        }
-    };
-    Notification.prototype.do = function (next, error, complete) {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return next && next(this.value);
-            case 'E':
-                return error && error(this.error);
-            case 'C':
-                return complete && complete();
-        }
-    };
-    Notification.prototype.accept = function (nextOrObserver, error, complete) {
-        if (nextOrObserver && typeof nextOrObserver.next === 'function') {
-            return this.observe(nextOrObserver);
-        }
-        else {
-            return this.do(nextOrObserver, error, complete);
-        }
-    };
-    Notification.prototype.toObservable = function () {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return of(this.value);
-            case 'E':
-                return throwError(this.error);
-            case 'C':
-                return empty();
-        }
-        throw new Error('unexpected notification kind value');
-    };
-    Notification.createNext = function (value) {
-        if (typeof value !== 'undefined') {
-            return new Notification('N', value);
-        }
-        return Notification.undefinedValueNotification;
-    };
-    Notification.createError = function (err) {
-        return new Notification('E', undefined, err);
-    };
-    Notification.createComplete = function () {
-        return Notification.completeNotification;
-    };
-    Notification.completeNotification = new Notification('C');
-    Notification.undefinedValueNotification = new Notification('N', undefined);
-    return Notification;
-}());
-export { Notification };
-//# sourceMappingURL=Notification.js.map
diff --git a/node_modules/rxjs/_esm5/internal/Notification.js.map b/node_modules/rxjs/_esm5/internal/Notification.js.map
deleted file mode 100644
index 9c15255..0000000
--- a/node_modules/rxjs/_esm5/internal/Notification.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Notification.js","sources":["../../src/internal/Notification.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/Observable.js b/node_modules/rxjs/_esm5/internal/Observable.js
deleted file mode 100644
index 8f2ef30..0000000
--- a/node_modules/rxjs/_esm5/internal/Observable.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */
-import { canReportError } from './util/canReportError';
-import { toSubscriber } from './util/toSubscriber';
-import { observable as Symbol_observable } from './symbol/observable';
-import { pipeFromArray } from './util/pipe';
-import { config } from './config';
-var Observable = /*@__PURE__*/ (function () {
-    function Observable(subscribe) {
-        this._isScalar = false;
-        if (subscribe) {
-            this._subscribe = subscribe;
-        }
-    }
-    Observable.prototype.lift = function (operator) {
-        var observable = new Observable();
-        observable.source = this;
-        observable.operator = operator;
-        return observable;
-    };
-    Observable.prototype.subscribe = function (observerOrNext, error, complete) {
-        var operator = this.operator;
-        var sink = toSubscriber(observerOrNext, error, complete);
-        if (operator) {
-            sink.add(operator.call(sink, this.source));
-        }
-        else {
-            sink.add(this.source || (config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?
-                this._subscribe(sink) :
-                this._trySubscribe(sink));
-        }
-        if (config.useDeprecatedSynchronousErrorHandling) {
-            if (sink.syncErrorThrowable) {
-                sink.syncErrorThrowable = false;
-                if (sink.syncErrorThrown) {
-                    throw sink.syncErrorValue;
-                }
-            }
-        }
-        return sink;
-    };
-    Observable.prototype._trySubscribe = function (sink) {
-        try {
-            return this._subscribe(sink);
-        }
-        catch (err) {
-            if (config.useDeprecatedSynchronousErrorHandling) {
-                sink.syncErrorThrown = true;
-                sink.syncErrorValue = err;
-            }
-            if (canReportError(sink)) {
-                sink.error(err);
-            }
-            else {
-                console.warn(err);
-            }
-        }
-    };
-    Observable.prototype.forEach = function (next, promiseCtor) {
-        var _this = this;
-        promiseCtor = getPromiseCtor(promiseCtor);
-        return new promiseCtor(function (resolve, reject) {
-            var subscription;
-            subscription = _this.subscribe(function (value) {
-                try {
-                    next(value);
-                }
-                catch (err) {
-                    reject(err);
-                    if (subscription) {
-                        subscription.unsubscribe();
-                    }
-                }
-            }, reject, resolve);
-        });
-    };
-    Observable.prototype._subscribe = function (subscriber) {
-        var source = this.source;
-        return source && source.subscribe(subscriber);
-    };
-    Observable.prototype[Symbol_observable] = function () {
-        return this;
-    };
-    Observable.prototype.pipe = function () {
-        var operations = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            operations[_i] = arguments[_i];
-        }
-        if (operations.length === 0) {
-            return this;
-        }
-        return pipeFromArray(operations)(this);
-    };
-    Observable.prototype.toPromise = function (promiseCtor) {
-        var _this = this;
-        promiseCtor = getPromiseCtor(promiseCtor);
-        return new promiseCtor(function (resolve, reject) {
-            var value;
-            _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });
-        });
-    };
-    Observable.create = function (subscribe) {
-        return new Observable(subscribe);
-    };
-    return Observable;
-}());
-export { Observable };
-function getPromiseCtor(promiseCtor) {
-    if (!promiseCtor) {
-        promiseCtor = config.Promise || Promise;
-    }
-    if (!promiseCtor) {
-        throw new Error('no Promise impl found');
-    }
-    return promiseCtor;
-}
-//# sourceMappingURL=Observable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/Observable.js.map b/node_modules/rxjs/_esm5/internal/Observable.js.map
deleted file mode 100644
index 1cd9695..0000000
--- a/node_modules/rxjs/_esm5/internal/Observable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Observable.js","sources":["../../src/internal/Observable.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/Observer.js b/node_modules/rxjs/_esm5/internal/Observer.js
deleted file mode 100644
index b066ea2..0000000
--- a/node_modules/rxjs/_esm5/internal/Observer.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/** PURE_IMPORTS_START _config,_util_hostReportError PURE_IMPORTS_END */
-import { config } from './config';
-import { hostReportError } from './util/hostReportError';
-export var empty = {
-    closed: true,
-    next: function (value) { },
-    error: function (err) {
-        if (config.useDeprecatedSynchronousErrorHandling) {
-            throw err;
-        }
-        else {
-            hostReportError(err);
-        }
-    },
-    complete: function () { }
-};
-//# sourceMappingURL=Observer.js.map
diff --git a/node_modules/rxjs/_esm5/internal/Observer.js.map b/node_modules/rxjs/_esm5/internal/Observer.js.map
deleted file mode 100644
index 1db7633..0000000
--- a/node_modules/rxjs/_esm5/internal/Observer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Observer.js","sources":["../../src/internal/Observer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,CAAC,IAAM,KAAK,GAAkB;IAClC,MAAM,EAAE,IAAI;IACZ,IAAI,EAAJ,UAAK,KAAU,IAAoB,CAAC;IACpC,KAAK,EAAL,UAAM,GAAQ;QACZ,IAAI,MAAM,CAAC,qCAAqC,EAAE;YAChD,MAAM,GAAG,CAAC;SACX;aAAM;YACL,eAAe,CAAC,GAAG,CAAC,CAAC;SACtB;IACH,CAAC;IACD,QAAQ,EAAR,cAA4B,CAAC;CAC9B,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/Operator.js b/node_modules/rxjs/_esm5/internal/Operator.js
deleted file mode 100644
index 09d2cfc..0000000
--- a/node_modules/rxjs/_esm5/internal/Operator.js
+++ /dev/null
@@ -1 +0,0 @@
-//# sourceMappingURL=Operator.js.map
diff --git a/node_modules/rxjs/_esm5/internal/Operator.js.map b/node_modules/rxjs/_esm5/internal/Operator.js.map
deleted file mode 100644
index f45f5ad..0000000
--- a/node_modules/rxjs/_esm5/internal/Operator.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Operator.js","sources":["../../src/internal/Operator.ts"],"names":[],"mappings":""}
diff --git a/node_modules/rxjs/_esm5/internal/OuterSubscriber.js b/node_modules/rxjs/_esm5/internal/OuterSubscriber.js
deleted file mode 100644
index de6dbfe..0000000
--- a/node_modules/rxjs/_esm5/internal/OuterSubscriber.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from './Subscriber';
-var OuterSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(OuterSubscriber, _super);
-    function OuterSubscriber() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    OuterSubscriber.prototype.notifyError = function (error, innerSub) {
-        this.destination.error(error);
-    };
-    OuterSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.destination.complete();
-    };
-    return OuterSubscriber;
-}(Subscriber));
-export { OuterSubscriber };
-//# sourceMappingURL=OuterSubscriber.js.map
diff --git a/node_modules/rxjs/_esm5/internal/OuterSubscriber.js.map b/node_modules/rxjs/_esm5/internal/OuterSubscriber.js.map
deleted file mode 100644
index df6aee2..0000000
--- a/node_modules/rxjs/_esm5/internal/OuterSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"OuterSubscriber.js","sources":["../../src/internal/OuterSubscriber.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ1C;IAA2C,2CAAa;IAAxD;;IAcA,CAAC;IAbC,oCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAED,qCAAW,GAAX,UAAY,KAAU,EAAE,QAA+B;QACrD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,wCAAc,GAAd,UAAe,QAA+B;QAC5C,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IACH,sBAAC;AAAD,CAAC,AAdD,CAA2C,UAAU,GAcpD"}
diff --git a/node_modules/rxjs/_esm5/internal/ReplaySubject.js b/node_modules/rxjs/_esm5/internal/ReplaySubject.js
deleted file mode 100644
index 7cd229a..0000000
--- a/node_modules/rxjs/_esm5/internal/ReplaySubject.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subject,_scheduler_queue,_Subscription,_operators_observeOn,_util_ObjectUnsubscribedError,_SubjectSubscription PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subject } from './Subject';
-import { queue } from './scheduler/queue';
-import { Subscription } from './Subscription';
-import { ObserveOnSubscriber } from './operators/observeOn';
-import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
-import { SubjectSubscription } from './SubjectSubscription';
-var ReplaySubject = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ReplaySubject, _super);
-    function ReplaySubject(bufferSize, windowTime, scheduler) {
-        if (bufferSize === void 0) {
-            bufferSize = Number.POSITIVE_INFINITY;
-        }
-        if (windowTime === void 0) {
-            windowTime = Number.POSITIVE_INFINITY;
-        }
-        var _this = _super.call(this) || this;
-        _this.scheduler = scheduler;
-        _this._events = [];
-        _this._infiniteTimeWindow = false;
-        _this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
-        _this._windowTime = windowTime < 1 ? 1 : windowTime;
-        if (windowTime === Number.POSITIVE_INFINITY) {
-            _this._infiniteTimeWindow = true;
-            _this.next = _this.nextInfiniteTimeWindow;
-        }
-        else {
-            _this.next = _this.nextTimeWindow;
-        }
-        return _this;
-    }
-    ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) {
-        var _events = this._events;
-        _events.push(value);
-        if (_events.length > this._bufferSize) {
-            _events.shift();
-        }
-        _super.prototype.next.call(this, value);
-    };
-    ReplaySubject.prototype.nextTimeWindow = function (value) {
-        this._events.push(new ReplayEvent(this._getNow(), value));
-        this._trimBufferThenGetEvents();
-        _super.prototype.next.call(this, value);
-    };
-    ReplaySubject.prototype._subscribe = function (subscriber) {
-        var _infiniteTimeWindow = this._infiniteTimeWindow;
-        var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();
-        var scheduler = this.scheduler;
-        var len = _events.length;
-        var subscription;
-        if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        else if (this.isStopped || this.hasError) {
-            subscription = Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            subscription = new SubjectSubscription(this, subscriber);
-        }
-        if (scheduler) {
-            subscriber.add(subscriber = new ObserveOnSubscriber(subscriber, scheduler));
-        }
-        if (_infiniteTimeWindow) {
-            for (var i = 0; i < len && !subscriber.closed; i++) {
-                subscriber.next(_events[i]);
-            }
-        }
-        else {
-            for (var i = 0; i < len && !subscriber.closed; i++) {
-                subscriber.next(_events[i].value);
-            }
-        }
-        if (this.hasError) {
-            subscriber.error(this.thrownError);
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-        }
-        return subscription;
-    };
-    ReplaySubject.prototype._getNow = function () {
-        return (this.scheduler || queue).now();
-    };
-    ReplaySubject.prototype._trimBufferThenGetEvents = function () {
-        var now = this._getNow();
-        var _bufferSize = this._bufferSize;
-        var _windowTime = this._windowTime;
-        var _events = this._events;
-        var eventsCount = _events.length;
-        var spliceCount = 0;
-        while (spliceCount < eventsCount) {
-            if ((now - _events[spliceCount].time) < _windowTime) {
-                break;
-            }
-            spliceCount++;
-        }
-        if (eventsCount > _bufferSize) {
-            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);
-        }
-        if (spliceCount > 0) {
-            _events.splice(0, spliceCount);
-        }
-        return _events;
-    };
-    return ReplaySubject;
-}(Subject));
-export { ReplaySubject };
-var ReplayEvent = /*@__PURE__*/ (function () {
-    function ReplayEvent(time, value) {
-        this.time = time;
-        this.value = value;
-    }
-    return ReplayEvent;
-}());
-//# sourceMappingURL=ReplaySubject.js.map
diff --git a/node_modules/rxjs/_esm5/internal/ReplaySubject.js.map b/node_modules/rxjs/_esm5/internal/ReplaySubject.js.map
deleted file mode 100644
index a881321..0000000
--- a/node_modules/rxjs/_esm5/internal/ReplaySubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ReplaySubject.js","sources":["../../src/internal/ReplaySubject.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/Rx.js b/node_modules/rxjs/_esm5/internal/Rx.js
deleted file mode 100644
index de82a39..0000000
--- a/node_modules/rxjs/_esm5/internal/Rx.js
+++ /dev/null
@@ -1,173 +0,0 @@
-/** PURE_IMPORTS_START _scheduler_asap,_scheduler_async,_scheduler_queue,_scheduler_animationFrame,_symbol_rxSubscriber,_symbol_iterator,_symbol_observable,_operators_index PURE_IMPORTS_END */
-export { Subject, AnonymousSubject } from './Subject';
-export { Observable } from './Observable';
-export { config } from './config';
-import 'rxjs-compat/add/observable/bindCallback';
-import 'rxjs-compat/add/observable/bindNodeCallback';
-import 'rxjs-compat/add/observable/combineLatest';
-import 'rxjs-compat/add/observable/concat';
-import 'rxjs-compat/add/observable/defer';
-import 'rxjs-compat/add/observable/empty';
-import 'rxjs-compat/add/observable/forkJoin';
-import 'rxjs-compat/add/observable/from';
-import 'rxjs-compat/add/observable/fromEvent';
-import 'rxjs-compat/add/observable/fromEventPattern';
-import 'rxjs-compat/add/observable/fromPromise';
-import 'rxjs-compat/add/observable/generate';
-import 'rxjs-compat/add/observable/if';
-import 'rxjs-compat/add/observable/interval';
-import 'rxjs-compat/add/observable/merge';
-import 'rxjs-compat/add/observable/race';
-import 'rxjs-compat/add/observable/never';
-import 'rxjs-compat/add/observable/of';
-import 'rxjs-compat/add/observable/onErrorResumeNext';
-import 'rxjs-compat/add/observable/pairs';
-import 'rxjs-compat/add/observable/range';
-import 'rxjs-compat/add/observable/using';
-import 'rxjs-compat/add/observable/throw';
-import 'rxjs-compat/add/observable/timer';
-import 'rxjs-compat/add/observable/zip';
-import 'rxjs-compat/add/observable/dom/ajax';
-import 'rxjs-compat/add/observable/dom/webSocket';
-import 'rxjs-compat/add/operator/buffer';
-import 'rxjs-compat/add/operator/bufferCount';
-import 'rxjs-compat/add/operator/bufferTime';
-import 'rxjs-compat/add/operator/bufferToggle';
-import 'rxjs-compat/add/operator/bufferWhen';
-import 'rxjs-compat/add/operator/catch';
-import 'rxjs-compat/add/operator/combineAll';
-import 'rxjs-compat/add/operator/combineLatest';
-import 'rxjs-compat/add/operator/concat';
-import 'rxjs-compat/add/operator/concatAll';
-import 'rxjs-compat/add/operator/concatMap';
-import 'rxjs-compat/add/operator/concatMapTo';
-import 'rxjs-compat/add/operator/count';
-import 'rxjs-compat/add/operator/dematerialize';
-import 'rxjs-compat/add/operator/debounce';
-import 'rxjs-compat/add/operator/debounceTime';
-import 'rxjs-compat/add/operator/defaultIfEmpty';
-import 'rxjs-compat/add/operator/delay';
-import 'rxjs-compat/add/operator/delayWhen';
-import 'rxjs-compat/add/operator/distinct';
-import 'rxjs-compat/add/operator/distinctUntilChanged';
-import 'rxjs-compat/add/operator/distinctUntilKeyChanged';
-import 'rxjs-compat/add/operator/do';
-import 'rxjs-compat/add/operator/exhaust';
-import 'rxjs-compat/add/operator/exhaustMap';
-import 'rxjs-compat/add/operator/expand';
-import 'rxjs-compat/add/operator/elementAt';
-import 'rxjs-compat/add/operator/filter';
-import 'rxjs-compat/add/operator/finally';
-import 'rxjs-compat/add/operator/find';
-import 'rxjs-compat/add/operator/findIndex';
-import 'rxjs-compat/add/operator/first';
-import 'rxjs-compat/add/operator/groupBy';
-import 'rxjs-compat/add/operator/ignoreElements';
-import 'rxjs-compat/add/operator/isEmpty';
-import 'rxjs-compat/add/operator/audit';
-import 'rxjs-compat/add/operator/auditTime';
-import 'rxjs-compat/add/operator/last';
-import 'rxjs-compat/add/operator/let';
-import 'rxjs-compat/add/operator/every';
-import 'rxjs-compat/add/operator/map';
-import 'rxjs-compat/add/operator/mapTo';
-import 'rxjs-compat/add/operator/materialize';
-import 'rxjs-compat/add/operator/max';
-import 'rxjs-compat/add/operator/merge';
-import 'rxjs-compat/add/operator/mergeAll';
-import 'rxjs-compat/add/operator/mergeMap';
-import 'rxjs-compat/add/operator/mergeMapTo';
-import 'rxjs-compat/add/operator/mergeScan';
-import 'rxjs-compat/add/operator/min';
-import 'rxjs-compat/add/operator/multicast';
-import 'rxjs-compat/add/operator/observeOn';
-import 'rxjs-compat/add/operator/onErrorResumeNext';
-import 'rxjs-compat/add/operator/pairwise';
-import 'rxjs-compat/add/operator/partition';
-import 'rxjs-compat/add/operator/pluck';
-import 'rxjs-compat/add/operator/publish';
-import 'rxjs-compat/add/operator/publishBehavior';
-import 'rxjs-compat/add/operator/publishReplay';
-import 'rxjs-compat/add/operator/publishLast';
-import 'rxjs-compat/add/operator/race';
-import 'rxjs-compat/add/operator/reduce';
-import 'rxjs-compat/add/operator/repeat';
-import 'rxjs-compat/add/operator/repeatWhen';
-import 'rxjs-compat/add/operator/retry';
-import 'rxjs-compat/add/operator/retryWhen';
-import 'rxjs-compat/add/operator/sample';
-import 'rxjs-compat/add/operator/sampleTime';
-import 'rxjs-compat/add/operator/scan';
-import 'rxjs-compat/add/operator/sequenceEqual';
-import 'rxjs-compat/add/operator/share';
-import 'rxjs-compat/add/operator/shareReplay';
-import 'rxjs-compat/add/operator/single';
-import 'rxjs-compat/add/operator/skip';
-import 'rxjs-compat/add/operator/skipLast';
-import 'rxjs-compat/add/operator/skipUntil';
-import 'rxjs-compat/add/operator/skipWhile';
-import 'rxjs-compat/add/operator/startWith';
-import 'rxjs-compat/add/operator/subscribeOn';
-import 'rxjs-compat/add/operator/switch';
-import 'rxjs-compat/add/operator/switchMap';
-import 'rxjs-compat/add/operator/switchMapTo';
-import 'rxjs-compat/add/operator/take';
-import 'rxjs-compat/add/operator/takeLast';
-import 'rxjs-compat/add/operator/takeUntil';
-import 'rxjs-compat/add/operator/takeWhile';
-import 'rxjs-compat/add/operator/throttle';
-import 'rxjs-compat/add/operator/throttleTime';
-import 'rxjs-compat/add/operator/timeInterval';
-import 'rxjs-compat/add/operator/timeout';
-import 'rxjs-compat/add/operator/timeoutWith';
-import 'rxjs-compat/add/operator/timestamp';
-import 'rxjs-compat/add/operator/toArray';
-import 'rxjs-compat/add/operator/toPromise';
-import 'rxjs-compat/add/operator/window';
-import 'rxjs-compat/add/operator/windowCount';
-import 'rxjs-compat/add/operator/windowTime';
-import 'rxjs-compat/add/operator/windowToggle';
-import 'rxjs-compat/add/operator/windowWhen';
-import 'rxjs-compat/add/operator/withLatestFrom';
-import 'rxjs-compat/add/operator/zip';
-import 'rxjs-compat/add/operator/zipAll';
-export { Subscription } from './Subscription';
-export { Subscriber } from './Subscriber';
-export { AsyncSubject } from './AsyncSubject';
-export { ReplaySubject } from './ReplaySubject';
-export { BehaviorSubject } from './BehaviorSubject';
-export { ConnectableObservable } from './observable/ConnectableObservable';
-export { Notification, NotificationKind } from './Notification';
-export { EmptyError } from './util/EmptyError';
-export { ArgumentOutOfRangeError } from './util/ArgumentOutOfRangeError';
-export { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
-export { TimeoutError } from './util/TimeoutError';
-export { UnsubscriptionError } from './util/UnsubscriptionError';
-export { TimeInterval } from './operators/timeInterval';
-export { Timestamp } from './operators/timestamp';
-export { TestScheduler } from './testing/TestScheduler';
-export { VirtualTimeScheduler } from './scheduler/VirtualTimeScheduler';
-export { AjaxResponse, AjaxError, AjaxTimeoutError } from './observable/dom/AjaxObservable';
-export { pipe } from './util/pipe';
-import { asap } from './scheduler/asap';
-import { async } from './scheduler/async';
-import { queue } from './scheduler/queue';
-import { animationFrame } from './scheduler/animationFrame';
-import { rxSubscriber } from './symbol/rxSubscriber';
-import { iterator } from './symbol/iterator';
-import { observable } from './symbol/observable';
-import * as _operators from './operators/index';
-export var operators = _operators;
-var Scheduler = {
-    asap: asap,
-    queue: queue,
-    animationFrame: animationFrame,
-    async: async
-};
-var Symbol = {
-    rxSubscriber: rxSubscriber,
-    observable: observable,
-    iterator: iterator
-};
-export { Scheduler, Symbol };
-//# sourceMappingURL=Rx.js.map
diff --git a/node_modules/rxjs/_esm5/internal/Rx.js.map b/node_modules/rxjs/_esm5/internal/Rx.js.map
deleted file mode 100644
index ca18900..0000000
--- a/node_modules/rxjs/_esm5/internal/Rx.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Rx.js","sources":["../../src/internal/Rx.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/Scheduler.js b/node_modules/rxjs/_esm5/internal/Scheduler.js
deleted file mode 100644
index 3312a44..0000000
--- a/node_modules/rxjs/_esm5/internal/Scheduler.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var Scheduler = /*@__PURE__*/ (function () {
-    function Scheduler(SchedulerAction, now) {
-        if (now === void 0) {
-            now = Scheduler.now;
-        }
-        this.SchedulerAction = SchedulerAction;
-        this.now = now;
-    }
-    Scheduler.prototype.schedule = function (work, delay, state) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        return new this.SchedulerAction(this, work).schedule(state, delay);
-    };
-    Scheduler.now = function () { return Date.now(); };
-    return Scheduler;
-}());
-export { Scheduler };
-//# sourceMappingURL=Scheduler.js.map
diff --git a/node_modules/rxjs/_esm5/internal/Scheduler.js.map b/node_modules/rxjs/_esm5/internal/Scheduler.js.map
deleted file mode 100644
index 79dfb85..0000000
--- a/node_modules/rxjs/_esm5/internal/Scheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Scheduler.js","sources":["../../src/internal/Scheduler.ts"],"names":[],"mappings":"AAuBA;IASE,mBAAoB,eAA8B,EACtC,GAAiC;QAAjC,oBAAA,EAAA,MAAoB,SAAS,CAAC,GAAG;QADzB,oBAAe,GAAf,eAAe,CAAe;QAEhD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IA6BM,4BAAQ,GAAf,UAAmB,IAAmD,EAAE,KAAiB,EAAE,KAAS;QAA5B,sBAAA,EAAA,SAAiB;QACvF,OAAO,IAAI,IAAI,CAAC,eAAe,CAAI,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;IApCa,aAAG,GAAiB,cAAM,OAAA,IAAI,CAAC,GAAG,EAAE,EAAV,CAAU,CAAC;IAqCrD,gBAAC;CAAA,AA5CD,IA4CC;SA5CY,SAAS"}
diff --git a/node_modules/rxjs/_esm5/internal/Subject.js b/node_modules/rxjs/_esm5/internal/Subject.js
deleted file mode 100644
index 84c3c50..0000000
--- a/node_modules/rxjs/_esm5/internal/Subject.js
+++ /dev/null
@@ -1,158 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Observable } from './Observable';
-import { Subscriber } from './Subscriber';
-import { Subscription } from './Subscription';
-import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
-import { SubjectSubscription } from './SubjectSubscription';
-import { rxSubscriber as rxSubscriberSymbol } from '../internal/symbol/rxSubscriber';
-var SubjectSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SubjectSubscriber, _super);
-    function SubjectSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        return _this;
-    }
-    return SubjectSubscriber;
-}(Subscriber));
-export { SubjectSubscriber };
-var Subject = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(Subject, _super);
-    function Subject() {
-        var _this = _super.call(this) || this;
-        _this.observers = [];
-        _this.closed = false;
-        _this.isStopped = false;
-        _this.hasError = false;
-        _this.thrownError = null;
-        return _this;
-    }
-    Subject.prototype[rxSubscriberSymbol] = function () {
-        return new SubjectSubscriber(this);
-    };
-    Subject.prototype.lift = function (operator) {
-        var subject = new AnonymousSubject(this, this);
-        subject.operator = operator;
-        return subject;
-    };
-    Subject.prototype.next = function (value) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        if (!this.isStopped) {
-            var observers = this.observers;
-            var len = observers.length;
-            var copy = observers.slice();
-            for (var i = 0; i < len; i++) {
-                copy[i].next(value);
-            }
-        }
-    };
-    Subject.prototype.error = function (err) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        this.hasError = true;
-        this.thrownError = err;
-        this.isStopped = true;
-        var observers = this.observers;
-        var len = observers.length;
-        var copy = observers.slice();
-        for (var i = 0; i < len; i++) {
-            copy[i].error(err);
-        }
-        this.observers.length = 0;
-    };
-    Subject.prototype.complete = function () {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        this.isStopped = true;
-        var observers = this.observers;
-        var len = observers.length;
-        var copy = observers.slice();
-        for (var i = 0; i < len; i++) {
-            copy[i].complete();
-        }
-        this.observers.length = 0;
-    };
-    Subject.prototype.unsubscribe = function () {
-        this.isStopped = true;
-        this.closed = true;
-        this.observers = null;
-    };
-    Subject.prototype._trySubscribe = function (subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        else {
-            return _super.prototype._trySubscribe.call(this, subscriber);
-        }
-    };
-    Subject.prototype._subscribe = function (subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError();
-        }
-        else if (this.hasError) {
-            subscriber.error(this.thrownError);
-            return Subscription.EMPTY;
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-            return Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            return new SubjectSubscription(this, subscriber);
-        }
-    };
-    Subject.prototype.asObservable = function () {
-        var observable = new Observable();
-        observable.source = this;
-        return observable;
-    };
-    Subject.create = function (destination, source) {
-        return new AnonymousSubject(destination, source);
-    };
-    return Subject;
-}(Observable));
-export { Subject };
-var AnonymousSubject = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(AnonymousSubject, _super);
-    function AnonymousSubject(destination, source) {
-        var _this = _super.call(this) || this;
-        _this.destination = destination;
-        _this.source = source;
-        return _this;
-    }
-    AnonymousSubject.prototype.next = function (value) {
-        var destination = this.destination;
-        if (destination && destination.next) {
-            destination.next(value);
-        }
-    };
-    AnonymousSubject.prototype.error = function (err) {
-        var destination = this.destination;
-        if (destination && destination.error) {
-            this.destination.error(err);
-        }
-    };
-    AnonymousSubject.prototype.complete = function () {
-        var destination = this.destination;
-        if (destination && destination.complete) {
-            this.destination.complete();
-        }
-    };
-    AnonymousSubject.prototype._subscribe = function (subscriber) {
-        var source = this.source;
-        if (source) {
-            return this.source.subscribe(subscriber);
-        }
-        else {
-            return Subscription.EMPTY;
-        }
-    };
-    return AnonymousSubject;
-}(Subject));
-export { AnonymousSubject };
-//# sourceMappingURL=Subject.js.map
diff --git a/node_modules/rxjs/_esm5/internal/Subject.js.map b/node_modules/rxjs/_esm5/internal/Subject.js.map
deleted file mode 100644
index 881b06e..0000000
--- a/node_modules/rxjs/_esm5/internal/Subject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Subject.js","sources":["../../src/internal/Subject.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/SubjectSubscription.js b/node_modules/rxjs/_esm5/internal/SubjectSubscription.js
deleted file mode 100644
index f09a2a2..0000000
--- a/node_modules/rxjs/_esm5/internal/SubjectSubscription.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscription } from './Subscription';
-var SubjectSubscription = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SubjectSubscription, _super);
-    function SubjectSubscription(subject, subscriber) {
-        var _this = _super.call(this) || this;
-        _this.subject = subject;
-        _this.subscriber = subscriber;
-        _this.closed = false;
-        return _this;
-    }
-    SubjectSubscription.prototype.unsubscribe = function () {
-        if (this.closed) {
-            return;
-        }
-        this.closed = true;
-        var subject = this.subject;
-        var observers = subject.observers;
-        this.subject = null;
-        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
-            return;
-        }
-        var subscriberIndex = observers.indexOf(this.subscriber);
-        if (subscriberIndex !== -1) {
-            observers.splice(subscriberIndex, 1);
-        }
-    };
-    return SubjectSubscription;
-}(Subscription));
-export { SubjectSubscription };
-//# sourceMappingURL=SubjectSubscription.js.map
diff --git a/node_modules/rxjs/_esm5/internal/SubjectSubscription.js.map b/node_modules/rxjs/_esm5/internal/SubjectSubscription.js.map
deleted file mode 100644
index 3698894..0000000
--- a/node_modules/rxjs/_esm5/internal/SubjectSubscription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubjectSubscription.js","sources":["../../src/internal/SubjectSubscription.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO9C;IAA4C,+CAAY;IAGtD,6BAAmB,OAAmB,EAAS,UAAuB;QAAtE,YACE,iBAAO,SACR;QAFkB,aAAO,GAAP,OAAO,CAAY;QAAS,gBAAU,GAAV,UAAU,CAAa;QAFtE,YAAM,GAAY,KAAK,CAAC;;IAIxB,CAAC;IAED,yCAAW,GAAX;QACE,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO;SACR;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE;YAC/E,OAAO;SACR;QAED,IAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE3D,IAAI,eAAe,KAAK,CAAC,CAAC,EAAE;YAC1B,SAAS,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;SACtC;IACH,CAAC;IACH,0BAAC;AAAD,CAAC,AA7BD,CAA4C,YAAY,GA6BvD"}
diff --git a/node_modules/rxjs/_esm5/internal/Subscriber.js b/node_modules/rxjs/_esm5/internal/Subscriber.js
deleted file mode 100644
index 8610093..0000000
--- a/node_modules/rxjs/_esm5/internal/Subscriber.js
+++ /dev/null
@@ -1,233 +0,0 @@
-/** PURE_IMPORTS_START tslib,_util_isFunction,_Observer,_Subscription,_internal_symbol_rxSubscriber,_config,_util_hostReportError PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { isFunction } from './util/isFunction';
-import { empty as emptyObserver } from './Observer';
-import { Subscription } from './Subscription';
-import { rxSubscriber as rxSubscriberSymbol } from '../internal/symbol/rxSubscriber';
-import { config } from './config';
-import { hostReportError } from './util/hostReportError';
-var Subscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(Subscriber, _super);
-    function Subscriber(destinationOrNext, error, complete) {
-        var _this = _super.call(this) || this;
-        _this.syncErrorValue = null;
-        _this.syncErrorThrown = false;
-        _this.syncErrorThrowable = false;
-        _this.isStopped = false;
-        switch (arguments.length) {
-            case 0:
-                _this.destination = emptyObserver;
-                break;
-            case 1:
-                if (!destinationOrNext) {
-                    _this.destination = emptyObserver;
-                    break;
-                }
-                if (typeof destinationOrNext === 'object') {
-                    if (destinationOrNext instanceof Subscriber) {
-                        _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;
-                        _this.destination = destinationOrNext;
-                        destinationOrNext.add(_this);
-                    }
-                    else {
-                        _this.syncErrorThrowable = true;
-                        _this.destination = new SafeSubscriber(_this, destinationOrNext);
-                    }
-                    break;
-                }
-            default:
-                _this.syncErrorThrowable = true;
-                _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete);
-                break;
-        }
-        return _this;
-    }
-    Subscriber.prototype[rxSubscriberSymbol] = function () { return this; };
-    Subscriber.create = function (next, error, complete) {
-        var subscriber = new Subscriber(next, error, complete);
-        subscriber.syncErrorThrowable = false;
-        return subscriber;
-    };
-    Subscriber.prototype.next = function (value) {
-        if (!this.isStopped) {
-            this._next(value);
-        }
-    };
-    Subscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._error(err);
-        }
-    };
-    Subscriber.prototype.complete = function () {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._complete();
-        }
-    };
-    Subscriber.prototype.unsubscribe = function () {
-        if (this.closed) {
-            return;
-        }
-        this.isStopped = true;
-        _super.prototype.unsubscribe.call(this);
-    };
-    Subscriber.prototype._next = function (value) {
-        this.destination.next(value);
-    };
-    Subscriber.prototype._error = function (err) {
-        this.destination.error(err);
-        this.unsubscribe();
-    };
-    Subscriber.prototype._complete = function () {
-        this.destination.complete();
-        this.unsubscribe();
-    };
-    Subscriber.prototype._unsubscribeAndRecycle = function () {
-        var _parentOrParents = this._parentOrParents;
-        this._parentOrParents = null;
-        this.unsubscribe();
-        this.closed = false;
-        this.isStopped = false;
-        this._parentOrParents = _parentOrParents;
-        return this;
-    };
-    return Subscriber;
-}(Subscription));
-export { Subscriber };
-var SafeSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SafeSubscriber, _super);
-    function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) {
-        var _this = _super.call(this) || this;
-        _this._parentSubscriber = _parentSubscriber;
-        var next;
-        var context = _this;
-        if (isFunction(observerOrNext)) {
-            next = observerOrNext;
-        }
-        else if (observerOrNext) {
-            next = observerOrNext.next;
-            error = observerOrNext.error;
-            complete = observerOrNext.complete;
-            if (observerOrNext !== emptyObserver) {
-                context = Object.create(observerOrNext);
-                if (isFunction(context.unsubscribe)) {
-                    _this.add(context.unsubscribe.bind(context));
-                }
-                context.unsubscribe = _this.unsubscribe.bind(_this);
-            }
-        }
-        _this._context = context;
-        _this._next = next;
-        _this._error = error;
-        _this._complete = complete;
-        return _this;
-    }
-    SafeSubscriber.prototype.next = function (value) {
-        if (!this.isStopped && this._next) {
-            var _parentSubscriber = this._parentSubscriber;
-            if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                this.__tryOrUnsub(this._next, value);
-            }
-            else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var _parentSubscriber = this._parentSubscriber;
-            var useDeprecatedSynchronousErrorHandling = config.useDeprecatedSynchronousErrorHandling;
-            if (this._error) {
-                if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(this._error, err);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parentSubscriber, this._error, err);
-                    this.unsubscribe();
-                }
-            }
-            else if (!_parentSubscriber.syncErrorThrowable) {
-                this.unsubscribe();
-                if (useDeprecatedSynchronousErrorHandling) {
-                    throw err;
-                }
-                hostReportError(err);
-            }
-            else {
-                if (useDeprecatedSynchronousErrorHandling) {
-                    _parentSubscriber.syncErrorValue = err;
-                    _parentSubscriber.syncErrorThrown = true;
-                }
-                else {
-                    hostReportError(err);
-                }
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.complete = function () {
-        var _this = this;
-        if (!this.isStopped) {
-            var _parentSubscriber = this._parentSubscriber;
-            if (this._complete) {
-                var wrappedComplete = function () { return _this._complete.call(_this._context); };
-                if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(wrappedComplete);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parentSubscriber, wrappedComplete);
-                    this.unsubscribe();
-                }
-            }
-            else {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            this.unsubscribe();
-            if (config.useDeprecatedSynchronousErrorHandling) {
-                throw err;
-            }
-            else {
-                hostReportError(err);
-            }
-        }
-    };
-    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
-        if (!config.useDeprecatedSynchronousErrorHandling) {
-            throw new Error('bad call');
-        }
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            if (config.useDeprecatedSynchronousErrorHandling) {
-                parent.syncErrorValue = err;
-                parent.syncErrorThrown = true;
-                return true;
-            }
-            else {
-                hostReportError(err);
-                return true;
-            }
-        }
-        return false;
-    };
-    SafeSubscriber.prototype._unsubscribe = function () {
-        var _parentSubscriber = this._parentSubscriber;
-        this._context = null;
-        this._parentSubscriber = null;
-        _parentSubscriber.unsubscribe();
-    };
-    return SafeSubscriber;
-}(Subscriber));
-export { SafeSubscriber };
-//# sourceMappingURL=Subscriber.js.map
diff --git a/node_modules/rxjs/_esm5/internal/Subscriber.js.map b/node_modules/rxjs/_esm5/internal/Subscriber.js.map
deleted file mode 100644
index c2b7024..0000000
--- a/node_modules/rxjs/_esm5/internal/Subscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Subscriber.js","sources":["../../src/internal/Subscriber.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/Subscription.js b/node_modules/rxjs/_esm5/internal/Subscription.js
deleted file mode 100644
index a0b8e62..0000000
--- a/node_modules/rxjs/_esm5/internal/Subscription.js
+++ /dev/null
@@ -1,136 +0,0 @@
-/** PURE_IMPORTS_START _util_isArray,_util_isObject,_util_isFunction,_util_UnsubscriptionError PURE_IMPORTS_END */
-import { isArray } from './util/isArray';
-import { isObject } from './util/isObject';
-import { isFunction } from './util/isFunction';
-import { UnsubscriptionError } from './util/UnsubscriptionError';
-var Subscription = /*@__PURE__*/ (function () {
-    function Subscription(unsubscribe) {
-        this.closed = false;
-        this._parentOrParents = null;
-        this._subscriptions = null;
-        if (unsubscribe) {
-            this._unsubscribe = unsubscribe;
-        }
-    }
-    Subscription.prototype.unsubscribe = function () {
-        var errors;
-        if (this.closed) {
-            return;
-        }
-        var _a = this, _parentOrParents = _a._parentOrParents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;
-        this.closed = true;
-        this._parentOrParents = null;
-        this._subscriptions = null;
-        if (_parentOrParents instanceof Subscription) {
-            _parentOrParents.remove(this);
-        }
-        else if (_parentOrParents !== null) {
-            for (var index = 0; index < _parentOrParents.length; ++index) {
-                var parent_1 = _parentOrParents[index];
-                parent_1.remove(this);
-            }
-        }
-        if (isFunction(_unsubscribe)) {
-            try {
-                _unsubscribe.call(this);
-            }
-            catch (e) {
-                errors = e instanceof UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];
-            }
-        }
-        if (isArray(_subscriptions)) {
-            var index = -1;
-            var len = _subscriptions.length;
-            while (++index < len) {
-                var sub = _subscriptions[index];
-                if (isObject(sub)) {
-                    try {
-                        sub.unsubscribe();
-                    }
-                    catch (e) {
-                        errors = errors || [];
-                        if (e instanceof UnsubscriptionError) {
-                            errors = errors.concat(flattenUnsubscriptionErrors(e.errors));
-                        }
-                        else {
-                            errors.push(e);
-                        }
-                    }
-                }
-            }
-        }
-        if (errors) {
-            throw new UnsubscriptionError(errors);
-        }
-    };
-    Subscription.prototype.add = function (teardown) {
-        var subscription = teardown;
-        if (!teardown) {
-            return Subscription.EMPTY;
-        }
-        switch (typeof teardown) {
-            case 'function':
-                subscription = new Subscription(teardown);
-            case 'object':
-                if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {
-                    return subscription;
-                }
-                else if (this.closed) {
-                    subscription.unsubscribe();
-                    return subscription;
-                }
-                else if (!(subscription instanceof Subscription)) {
-                    var tmp = subscription;
-                    subscription = new Subscription();
-                    subscription._subscriptions = [tmp];
-                }
-                break;
-            default: {
-                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
-            }
-        }
-        var _parentOrParents = subscription._parentOrParents;
-        if (_parentOrParents === null) {
-            subscription._parentOrParents = this;
-        }
-        else if (_parentOrParents instanceof Subscription) {
-            if (_parentOrParents === this) {
-                return subscription;
-            }
-            subscription._parentOrParents = [_parentOrParents, this];
-        }
-        else if (_parentOrParents.indexOf(this) === -1) {
-            _parentOrParents.push(this);
-        }
-        else {
-            return subscription;
-        }
-        var subscriptions = this._subscriptions;
-        if (subscriptions === null) {
-            this._subscriptions = [subscription];
-        }
-        else {
-            subscriptions.push(subscription);
-        }
-        return subscription;
-    };
-    Subscription.prototype.remove = function (subscription) {
-        var subscriptions = this._subscriptions;
-        if (subscriptions) {
-            var subscriptionIndex = subscriptions.indexOf(subscription);
-            if (subscriptionIndex !== -1) {
-                subscriptions.splice(subscriptionIndex, 1);
-            }
-        }
-    };
-    Subscription.EMPTY = (function (empty) {
-        empty.closed = true;
-        return empty;
-    }(new Subscription()));
-    return Subscription;
-}());
-export { Subscription };
-function flattenUnsubscriptionErrors(errors) {
-    return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError) ? err.errors : err); }, []);
-}
-//# sourceMappingURL=Subscription.js.map
diff --git a/node_modules/rxjs/_esm5/internal/Subscription.js.map b/node_modules/rxjs/_esm5/internal/Subscription.js.map
deleted file mode 100644
index 9ff4261..0000000
--- a/node_modules/rxjs/_esm5/internal/Subscription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Subscription.js","sources":["../../src/internal/Subscription.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/config.js b/node_modules/rxjs/_esm5/internal/config.js
deleted file mode 100644
index e998229..0000000
--- a/node_modules/rxjs/_esm5/internal/config.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-var _enable_super_gross_mode_that_will_cause_bad_things = false;
-export var config = {
-    Promise: undefined,
-    set useDeprecatedSynchronousErrorHandling(value) {
-        if (value) {
-            var error = /*@__PURE__*/ new Error();
-            /*@__PURE__*/ console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack);
-        }
-        else if (_enable_super_gross_mode_that_will_cause_bad_things) {
-            /*@__PURE__*/ console.log('RxJS: Back to a better error behavior. Thank you. <3');
-        }
-        _enable_super_gross_mode_that_will_cause_bad_things = value;
-    },
-    get useDeprecatedSynchronousErrorHandling() {
-        return _enable_super_gross_mode_that_will_cause_bad_things;
-    },
-};
-//# sourceMappingURL=config.js.map
diff --git a/node_modules/rxjs/_esm5/internal/config.js.map b/node_modules/rxjs/_esm5/internal/config.js.map
deleted file mode 100644
index 21e6def..0000000
--- a/node_modules/rxjs/_esm5/internal/config.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"config.js","sources":["../../src/internal/config.ts"],"names":[],"mappings":"AAAA,IAAI,mDAAmD,GAAG,KAAK,CAAC;AAMhE,MAAM,CAAC,IAAM,MAAM,GAAG;IAKpB,OAAO,EAAE,SAAmC;IAU5C,IAAI,qCAAqC,CAAC,KAAc;QACtD,IAAI,KAAK,EAAE;YACT,IAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,+FAA+F,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;SAC7H;aAAM,IAAI,mDAAmD,EAAE;YAC9D,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;SACrE;QACD,mDAAmD,GAAG,KAAK,CAAC;IAC9D,CAAC;IAED,IAAI,qCAAqC;QACvC,OAAO,mDAAmD,CAAC;IAC7D,CAAC;CACF,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/ConnectableObservable.js b/node_modules/rxjs/_esm5/internal/observable/ConnectableObservable.js
deleted file mode 100644
index ed31911..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/ConnectableObservable.js
+++ /dev/null
@@ -1,142 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subject,_Observable,_Subscriber,_Subscription,_operators_refCount PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { SubjectSubscriber } from '../Subject';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { refCount as higherOrderRefCount } from '../operators/refCount';
-var ConnectableObservable = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ConnectableObservable, _super);
-    function ConnectableObservable(source, subjectFactory) {
-        var _this = _super.call(this) || this;
-        _this.source = source;
-        _this.subjectFactory = subjectFactory;
-        _this._refCount = 0;
-        _this._isComplete = false;
-        return _this;
-    }
-    ConnectableObservable.prototype._subscribe = function (subscriber) {
-        return this.getSubject().subscribe(subscriber);
-    };
-    ConnectableObservable.prototype.getSubject = function () {
-        var subject = this._subject;
-        if (!subject || subject.isStopped) {
-            this._subject = this.subjectFactory();
-        }
-        return this._subject;
-    };
-    ConnectableObservable.prototype.connect = function () {
-        var connection = this._connection;
-        if (!connection) {
-            this._isComplete = false;
-            connection = this._connection = new Subscription();
-            connection.add(this.source
-                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
-            if (connection.closed) {
-                this._connection = null;
-                connection = Subscription.EMPTY;
-            }
-        }
-        return connection;
-    };
-    ConnectableObservable.prototype.refCount = function () {
-        return higherOrderRefCount()(this);
-    };
-    return ConnectableObservable;
-}(Observable));
-export { ConnectableObservable };
-export var connectableObservableDescriptor = /*@__PURE__*/ (function () {
-    var connectableProto = ConnectableObservable.prototype;
-    return {
-        operator: { value: null },
-        _refCount: { value: 0, writable: true },
-        _subject: { value: null, writable: true },
-        _connection: { value: null, writable: true },
-        _subscribe: { value: connectableProto._subscribe },
-        _isComplete: { value: connectableProto._isComplete, writable: true },
-        getSubject: { value: connectableProto.getSubject },
-        connect: { value: connectableProto.connect },
-        refCount: { value: connectableProto.refCount }
-    };
-})();
-var ConnectableSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ConnectableSubscriber, _super);
-    function ConnectableSubscriber(destination, connectable) {
-        var _this = _super.call(this, destination) || this;
-        _this.connectable = connectable;
-        return _this;
-    }
-    ConnectableSubscriber.prototype._error = function (err) {
-        this._unsubscribe();
-        _super.prototype._error.call(this, err);
-    };
-    ConnectableSubscriber.prototype._complete = function () {
-        this.connectable._isComplete = true;
-        this._unsubscribe();
-        _super.prototype._complete.call(this);
-    };
-    ConnectableSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (connectable) {
-            this.connectable = null;
-            var connection = connectable._connection;
-            connectable._refCount = 0;
-            connectable._subject = null;
-            connectable._connection = null;
-            if (connection) {
-                connection.unsubscribe();
-            }
-        }
-    };
-    return ConnectableSubscriber;
-}(SubjectSubscriber));
-var RefCountOperator = /*@__PURE__*/ (function () {
-    function RefCountOperator(connectable) {
-        this.connectable = connectable;
-    }
-    RefCountOperator.prototype.call = function (subscriber, source) {
-        var connectable = this.connectable;
-        connectable._refCount++;
-        var refCounter = new RefCountSubscriber(subscriber, connectable);
-        var subscription = source.subscribe(refCounter);
-        if (!refCounter.closed) {
-            refCounter.connection = connectable.connect();
-        }
-        return subscription;
-    };
-    return RefCountOperator;
-}());
-var RefCountSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(RefCountSubscriber, _super);
-    function RefCountSubscriber(destination, connectable) {
-        var _this = _super.call(this, destination) || this;
-        _this.connectable = connectable;
-        return _this;
-    }
-    RefCountSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (!connectable) {
-            this.connection = null;
-            return;
-        }
-        this.connectable = null;
-        var refCount = connectable._refCount;
-        if (refCount <= 0) {
-            this.connection = null;
-            return;
-        }
-        connectable._refCount = refCount - 1;
-        if (refCount > 1) {
-            this.connection = null;
-            return;
-        }
-        var connection = this.connection;
-        var sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    };
-    return RefCountSubscriber;
-}(Subscriber));
-//# sourceMappingURL=ConnectableObservable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/ConnectableObservable.js.map b/node_modules/rxjs/_esm5/internal/observable/ConnectableObservable.js.map
deleted file mode 100644
index 44b1ecc..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/ConnectableObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ConnectableObservable.js","sources":["../../../src/internal/observable/ConnectableObservable.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/SubscribeOnObservable.js b/node_modules/rxjs/_esm5/internal/observable/SubscribeOnObservable.js
deleted file mode 100644
index c4ef848..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/SubscribeOnObservable.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Observable,_scheduler_asap,_util_isNumeric PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Observable } from '../Observable';
-import { asap } from '../scheduler/asap';
-import { isNumeric } from '../util/isNumeric';
-var SubscribeOnObservable = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SubscribeOnObservable, _super);
-    function SubscribeOnObservable(source, delayTime, scheduler) {
-        if (delayTime === void 0) {
-            delayTime = 0;
-        }
-        if (scheduler === void 0) {
-            scheduler = asap;
-        }
-        var _this = _super.call(this) || this;
-        _this.source = source;
-        _this.delayTime = delayTime;
-        _this.scheduler = scheduler;
-        if (!isNumeric(delayTime) || delayTime < 0) {
-            _this.delayTime = 0;
-        }
-        if (!scheduler || typeof scheduler.schedule !== 'function') {
-            _this.scheduler = asap;
-        }
-        return _this;
-    }
-    SubscribeOnObservable.create = function (source, delay, scheduler) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        if (scheduler === void 0) {
-            scheduler = asap;
-        }
-        return new SubscribeOnObservable(source, delay, scheduler);
-    };
-    SubscribeOnObservable.dispatch = function (arg) {
-        var source = arg.source, subscriber = arg.subscriber;
-        return this.add(source.subscribe(subscriber));
-    };
-    SubscribeOnObservable.prototype._subscribe = function (subscriber) {
-        var delay = this.delayTime;
-        var source = this.source;
-        var scheduler = this.scheduler;
-        return scheduler.schedule(SubscribeOnObservable.dispatch, delay, {
-            source: source, subscriber: subscriber
-        });
-    };
-    return SubscribeOnObservable;
-}(Observable));
-export { SubscribeOnObservable };
-//# sourceMappingURL=SubscribeOnObservable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/SubscribeOnObservable.js.map b/node_modules/rxjs/_esm5/internal/observable/SubscribeOnObservable.js.map
deleted file mode 100644
index 6092bee..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/SubscribeOnObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubscribeOnObservable.js","sources":["../../../src/internal/observable/SubscribeOnObservable.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAY9C;IAA8C,iDAAa;IAYzD,+BAAmB,MAAqB,EACpB,SAAqB,EACrB,SAA+B;QAD/B,0BAAA,EAAA,aAAqB;QACrB,0BAAA,EAAA,gBAA+B;QAFnD,YAGE,iBAAO,SAOR;QAVkB,YAAM,GAAN,MAAM,CAAe;QACpB,eAAS,GAAT,SAAS,CAAY;QACrB,eAAS,GAAT,SAAS,CAAsB;QAEjD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE;YAC1C,KAAI,CAAC,SAAS,GAAG,CAAC,CAAC;SACpB;QACD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE;YAC1D,KAAI,CAAC,SAAS,GAAG,IAAI,CAAC;SACvB;;IACH,CAAC;IApBM,4BAAM,GAAb,UAAiB,MAAqB,EAAE,KAAiB,EAAE,SAA+B;QAAlD,sBAAA,EAAA,SAAiB;QAAE,0BAAA,EAAA,gBAA+B;QACxF,OAAO,IAAI,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAGM,8BAAQ,GAAf,UAA6C,GAAmB;QACtD,IAAA,mBAAM,EAAE,2BAAU,CAAS;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IAChD,CAAC;IAeD,0CAAU,GAAV,UAAW,UAAyB;QAClC,IAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAEjC,OAAO,SAAS,CAAC,QAAQ,CAAmB,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE;YACjF,MAAM,QAAA,EAAE,UAAU,YAAA;SACnB,CAAC,CAAC;IACL,CAAC;IACH,4BAAC;AAAD,CAAC,AAlCD,CAA8C,UAAU,GAkCvD"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/bindCallback.js b/node_modules/rxjs/_esm5/internal/observable/bindCallback.js
deleted file mode 100644
index ee5e68a..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/bindCallback.js
+++ /dev/null
@@ -1,105 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isArray,_util_isScheduler PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { AsyncSubject } from '../AsyncSubject';
-import { map } from '../operators/map';
-import { canReportError } from '../util/canReportError';
-import { isArray } from '../util/isArray';
-import { isScheduler } from '../util/isScheduler';
-export function bindCallback(callbackFunc, resultSelector, scheduler) {
-    if (resultSelector) {
-        if (isScheduler(resultSelector)) {
-            scheduler = resultSelector;
-        }
-        else {
-            return function () {
-                var args = [];
-                for (var _i = 0; _i < arguments.length; _i++) {
-                    args[_i] = arguments[_i];
-                }
-                return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map(function (args) { return isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-            };
-        }
-    }
-    return function () {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        var context = this;
-        var subject;
-        var params = {
-            context: context,
-            subject: subject,
-            callbackFunc: callbackFunc,
-            scheduler: scheduler,
-        };
-        return new Observable(function (subscriber) {
-            if (!scheduler) {
-                if (!subject) {
-                    subject = new AsyncSubject();
-                    var handler = function () {
-                        var innerArgs = [];
-                        for (var _i = 0; _i < arguments.length; _i++) {
-                            innerArgs[_i] = arguments[_i];
-                        }
-                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-                        subject.complete();
-                    };
-                    try {
-                        callbackFunc.apply(context, args.concat([handler]));
-                    }
-                    catch (err) {
-                        if (canReportError(subject)) {
-                            subject.error(err);
-                        }
-                        else {
-                            console.warn(err);
-                        }
-                    }
-                }
-                return subject.subscribe(subscriber);
-            }
-            else {
-                var state = {
-                    args: args, subscriber: subscriber, params: params,
-                };
-                return scheduler.schedule(dispatch, 0, state);
-            }
-        });
-    };
-}
-function dispatch(state) {
-    var _this = this;
-    var self = this;
-    var args = state.args, subscriber = state.subscriber, params = state.params;
-    var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler;
-    var subject = params.subject;
-    if (!subject) {
-        subject = params.subject = new AsyncSubject();
-        var handler = function () {
-            var innerArgs = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                innerArgs[_i] = arguments[_i];
-            }
-            var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-            _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
-        };
-        try {
-            callbackFunc.apply(context, args.concat([handler]));
-        }
-        catch (err) {
-            subject.error(err);
-        }
-    }
-    this.add(subject.subscribe(subscriber));
-}
-function dispatchNext(state) {
-    var value = state.value, subject = state.subject;
-    subject.next(value);
-    subject.complete();
-}
-function dispatchError(state) {
-    var err = state.err, subject = state.subject;
-    subject.error(err);
-}
-//# sourceMappingURL=bindCallback.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/bindCallback.js.map b/node_modules/rxjs/_esm5/internal/observable/bindCallback.js.map
deleted file mode 100644
index f516e14..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/bindCallback.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bindCallback.js","sources":["../../../src/internal/observable/bindCallback.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/bindNodeCallback.js b/node_modules/rxjs/_esm5/internal/observable/bindNodeCallback.js
deleted file mode 100644
index 5d8c4ca..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/bindNodeCallback.js
+++ /dev/null
@@ -1,113 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isScheduler,_util_isArray PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { AsyncSubject } from '../AsyncSubject';
-import { map } from '../operators/map';
-import { canReportError } from '../util/canReportError';
-import { isScheduler } from '../util/isScheduler';
-import { isArray } from '../util/isArray';
-export function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
-    if (resultSelector) {
-        if (isScheduler(resultSelector)) {
-            scheduler = resultSelector;
-        }
-        else {
-            return function () {
-                var args = [];
-                for (var _i = 0; _i < arguments.length; _i++) {
-                    args[_i] = arguments[_i];
-                }
-                return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map(function (args) { return isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-            };
-        }
-    }
-    return function () {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        var params = {
-            subject: undefined,
-            args: args,
-            callbackFunc: callbackFunc,
-            scheduler: scheduler,
-            context: this,
-        };
-        return new Observable(function (subscriber) {
-            var context = params.context;
-            var subject = params.subject;
-            if (!scheduler) {
-                if (!subject) {
-                    subject = params.subject = new AsyncSubject();
-                    var handler = function () {
-                        var innerArgs = [];
-                        for (var _i = 0; _i < arguments.length; _i++) {
-                            innerArgs[_i] = arguments[_i];
-                        }
-                        var err = innerArgs.shift();
-                        if (err) {
-                            subject.error(err);
-                            return;
-                        }
-                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-                        subject.complete();
-                    };
-                    try {
-                        callbackFunc.apply(context, args.concat([handler]));
-                    }
-                    catch (err) {
-                        if (canReportError(subject)) {
-                            subject.error(err);
-                        }
-                        else {
-                            console.warn(err);
-                        }
-                    }
-                }
-                return subject.subscribe(subscriber);
-            }
-            else {
-                return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context });
-            }
-        });
-    };
-}
-function dispatch(state) {
-    var _this = this;
-    var params = state.params, subscriber = state.subscriber, context = state.context;
-    var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler;
-    var subject = params.subject;
-    if (!subject) {
-        subject = params.subject = new AsyncSubject();
-        var handler = function () {
-            var innerArgs = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                innerArgs[_i] = arguments[_i];
-            }
-            var err = innerArgs.shift();
-            if (err) {
-                _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
-            }
-            else {
-                var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-                _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
-            }
-        };
-        try {
-            callbackFunc.apply(context, args.concat([handler]));
-        }
-        catch (err) {
-            this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
-        }
-    }
-    this.add(subject.subscribe(subscriber));
-}
-function dispatchNext(arg) {
-    var value = arg.value, subject = arg.subject;
-    subject.next(value);
-    subject.complete();
-}
-function dispatchError(arg) {
-    var err = arg.err, subject = arg.subject;
-    subject.error(err);
-}
-//# sourceMappingURL=bindNodeCallback.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/bindNodeCallback.js.map b/node_modules/rxjs/_esm5/internal/observable/bindNodeCallback.js.map
deleted file mode 100644
index ffa674c..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/bindNodeCallback.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bindNodeCallback.js","sources":["../../../src/internal/observable/bindNodeCallback.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/combineLatest.js b/node_modules/rxjs/_esm5/internal/observable/combineLatest.js
deleted file mode 100644
index 8cdbe27..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/combineLatest.js
+++ /dev/null
@@ -1,101 +0,0 @@
-/** PURE_IMPORTS_START tslib,_util_isScheduler,_util_isArray,_OuterSubscriber,_util_subscribeToResult,_fromArray PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { isScheduler } from '../util/isScheduler';
-import { isArray } from '../util/isArray';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { fromArray } from './fromArray';
-var NONE = {};
-export function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var resultSelector = null;
-    var scheduler = null;
-    if (isScheduler(observables[observables.length - 1])) {
-        scheduler = observables.pop();
-    }
-    if (typeof observables[observables.length - 1] === 'function') {
-        resultSelector = observables.pop();
-    }
-    if (observables.length === 1 && isArray(observables[0])) {
-        observables = observables[0];
-    }
-    return fromArray(observables, scheduler).lift(new CombineLatestOperator(resultSelector));
-}
-var CombineLatestOperator = /*@__PURE__*/ (function () {
-    function CombineLatestOperator(resultSelector) {
-        this.resultSelector = resultSelector;
-    }
-    CombineLatestOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));
-    };
-    return CombineLatestOperator;
-}());
-export { CombineLatestOperator };
-var CombineLatestSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(CombineLatestSubscriber, _super);
-    function CombineLatestSubscriber(destination, resultSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.resultSelector = resultSelector;
-        _this.active = 0;
-        _this.values = [];
-        _this.observables = [];
-        return _this;
-    }
-    CombineLatestSubscriber.prototype._next = function (observable) {
-        this.values.push(NONE);
-        this.observables.push(observable);
-    };
-    CombineLatestSubscriber.prototype._complete = function () {
-        var observables = this.observables;
-        var len = observables.length;
-        if (len === 0) {
-            this.destination.complete();
-        }
-        else {
-            this.active = len;
-            this.toRespond = len;
-            for (var i = 0; i < len; i++) {
-                var observable = observables[i];
-                this.add(subscribeToResult(this, observable, observable, i));
-            }
-        }
-    };
-    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {
-        if ((this.active -= 1) === 0) {
-            this.destination.complete();
-        }
-    };
-    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var values = this.values;
-        var oldVal = values[outerIndex];
-        var toRespond = !this.toRespond
-            ? 0
-            : oldVal === NONE ? --this.toRespond : this.toRespond;
-        values[outerIndex] = innerValue;
-        if (toRespond === 0) {
-            if (this.resultSelector) {
-                this._tryResultSelector(values);
-            }
-            else {
-                this.destination.next(values.slice());
-            }
-        }
-    };
-    CombineLatestSubscriber.prototype._tryResultSelector = function (values) {
-        var result;
-        try {
-            result = this.resultSelector.apply(this, values);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return CombineLatestSubscriber;
-}(OuterSubscriber));
-export { CombineLatestSubscriber };
-//# sourceMappingURL=combineLatest.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/combineLatest.js.map b/node_modules/rxjs/_esm5/internal/observable/combineLatest.js.map
deleted file mode 100644
index 4c2e2de..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/combineLatest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineLatest.js","sources":["../../../src/internal/observable/combineLatest.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/concat.js b/node_modules/rxjs/_esm5/internal/observable/concat.js
deleted file mode 100644
index 4c08930..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/concat.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/** PURE_IMPORTS_START _of,_operators_concatAll PURE_IMPORTS_END */
-import { of } from './of';
-import { concatAll } from '../operators/concatAll';
-export function concat() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return concatAll()(of.apply(void 0, observables));
-}
-//# sourceMappingURL=concat.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/concat.js.map b/node_modules/rxjs/_esm5/internal/observable/concat.js.map
deleted file mode 100644
index f963a9a..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/concat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concat.js","sources":["../../../src/internal/observable/concat.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AA2InD,MAAM,UAAU,MAAM;IAAoC,qBAAwC;SAAxC,UAAwC,EAAxC,qBAAwC,EAAxC,IAAwC;QAAxC,gCAAwC;;IAChG,OAAO,SAAS,EAAK,CAAC,EAAE,eAAI,WAAW,EAAE,CAAC;AAC5C,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/defer.js b/node_modules/rxjs/_esm5/internal/observable/defer.js
deleted file mode 100644
index d4cc24a..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/defer.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { from } from './from';
-import { empty } from './empty';
-export function defer(observableFactory) {
-    return new Observable(function (subscriber) {
-        var input;
-        try {
-            input = observableFactory();
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        var source = input ? from(input) : empty();
-        return source.subscribe(subscriber);
-    });
-}
-//# sourceMappingURL=defer.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/defer.js.map b/node_modules/rxjs/_esm5/internal/observable/defer.js.map
deleted file mode 100644
index 07ea88c..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/defer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"defer.js","sources":["../../../src/internal/observable/defer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAmDhC,MAAM,UAAU,KAAK,CAAwC,iBAA0B;IACrF,OAAO,IAAI,UAAU,CAAqB,UAAA,UAAU;QAClD,IAAI,KAAe,CAAC;QACpB,IAAI;YACF,KAAK,GAAG,iBAAiB,EAAE,CAAC;SAC7B;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QACD,IAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAA4C,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACpF,OAAO,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/dom/AjaxObservable.js b/node_modules/rxjs/_esm5/internal/observable/dom/AjaxObservable.js
deleted file mode 100644
index 6cc88b5..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/dom/AjaxObservable.js
+++ /dev/null
@@ -1,374 +0,0 @@
-/** PURE_IMPORTS_START tslib,_.._util_root,_.._Observable,_.._Subscriber,_.._operators_map PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { root } from '../../util/root';
-import { Observable } from '../../Observable';
-import { Subscriber } from '../../Subscriber';
-import { map } from '../../operators/map';
-function getCORSRequest() {
-    if (root.XMLHttpRequest) {
-        return new root.XMLHttpRequest();
-    }
-    else if (!!root.XDomainRequest) {
-        return new root.XDomainRequest();
-    }
-    else {
-        throw new Error('CORS is not supported by your browser');
-    }
-}
-function getXMLHttpRequest() {
-    if (root.XMLHttpRequest) {
-        return new root.XMLHttpRequest();
-    }
-    else {
-        var progId = void 0;
-        try {
-            var progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
-            for (var i = 0; i < 3; i++) {
-                try {
-                    progId = progIds[i];
-                    if (new root.ActiveXObject(progId)) {
-                        break;
-                    }
-                }
-                catch (e) {
-                }
-            }
-            return new root.ActiveXObject(progId);
-        }
-        catch (e) {
-            throw new Error('XMLHttpRequest is not supported by your browser');
-        }
-    }
-}
-export function ajaxGet(url, headers) {
-    if (headers === void 0) {
-        headers = null;
-    }
-    return new AjaxObservable({ method: 'GET', url: url, headers: headers });
-}
-export function ajaxPost(url, body, headers) {
-    return new AjaxObservable({ method: 'POST', url: url, body: body, headers: headers });
-}
-export function ajaxDelete(url, headers) {
-    return new AjaxObservable({ method: 'DELETE', url: url, headers: headers });
-}
-export function ajaxPut(url, body, headers) {
-    return new AjaxObservable({ method: 'PUT', url: url, body: body, headers: headers });
-}
-export function ajaxPatch(url, body, headers) {
-    return new AjaxObservable({ method: 'PATCH', url: url, body: body, headers: headers });
-}
-var mapResponse = /*@__PURE__*/ map(function (x, index) { return x.response; });
-export function ajaxGetJSON(url, headers) {
-    return mapResponse(new AjaxObservable({
-        method: 'GET',
-        url: url,
-        responseType: 'json',
-        headers: headers
-    }));
-}
-var AjaxObservable = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(AjaxObservable, _super);
-    function AjaxObservable(urlOrRequest) {
-        var _this = _super.call(this) || this;
-        var request = {
-            async: true,
-            createXHR: function () {
-                return this.crossDomain ? getCORSRequest() : getXMLHttpRequest();
-            },
-            crossDomain: true,
-            withCredentials: false,
-            headers: {},
-            method: 'GET',
-            responseType: 'json',
-            timeout: 0
-        };
-        if (typeof urlOrRequest === 'string') {
-            request.url = urlOrRequest;
-        }
-        else {
-            for (var prop in urlOrRequest) {
-                if (urlOrRequest.hasOwnProperty(prop)) {
-                    request[prop] = urlOrRequest[prop];
-                }
-            }
-        }
-        _this.request = request;
-        return _this;
-    }
-    AjaxObservable.prototype._subscribe = function (subscriber) {
-        return new AjaxSubscriber(subscriber, this.request);
-    };
-    AjaxObservable.create = (function () {
-        var create = function (urlOrRequest) {
-            return new AjaxObservable(urlOrRequest);
-        };
-        create.get = ajaxGet;
-        create.post = ajaxPost;
-        create.delete = ajaxDelete;
-        create.put = ajaxPut;
-        create.patch = ajaxPatch;
-        create.getJSON = ajaxGetJSON;
-        return create;
-    })();
-    return AjaxObservable;
-}(Observable));
-export { AjaxObservable };
-var AjaxSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(AjaxSubscriber, _super);
-    function AjaxSubscriber(destination, request) {
-        var _this = _super.call(this, destination) || this;
-        _this.request = request;
-        _this.done = false;
-        var headers = request.headers = request.headers || {};
-        if (!request.crossDomain && !_this.getHeader(headers, 'X-Requested-With')) {
-            headers['X-Requested-With'] = 'XMLHttpRequest';
-        }
-        var contentTypeHeader = _this.getHeader(headers, 'Content-Type');
-        if (!contentTypeHeader && !(root.FormData && request.body instanceof root.FormData) && typeof request.body !== 'undefined') {
-            headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
-        }
-        request.body = _this.serializeBody(request.body, _this.getHeader(request.headers, 'Content-Type'));
-        _this.send();
-        return _this;
-    }
-    AjaxSubscriber.prototype.next = function (e) {
-        this.done = true;
-        var _a = this, xhr = _a.xhr, request = _a.request, destination = _a.destination;
-        var result;
-        try {
-            result = new AjaxResponse(e, xhr, request);
-        }
-        catch (err) {
-            return destination.error(err);
-        }
-        destination.next(result);
-    };
-    AjaxSubscriber.prototype.send = function () {
-        var _a = this, request = _a.request, _b = _a.request, user = _b.user, method = _b.method, url = _b.url, async = _b.async, password = _b.password, headers = _b.headers, body = _b.body;
-        try {
-            var xhr = this.xhr = request.createXHR();
-            this.setupEvents(xhr, request);
-            if (user) {
-                xhr.open(method, url, async, user, password);
-            }
-            else {
-                xhr.open(method, url, async);
-            }
-            if (async) {
-                xhr.timeout = request.timeout;
-                xhr.responseType = request.responseType;
-            }
-            if ('withCredentials' in xhr) {
-                xhr.withCredentials = !!request.withCredentials;
-            }
-            this.setHeaders(xhr, headers);
-            if (body) {
-                xhr.send(body);
-            }
-            else {
-                xhr.send();
-            }
-        }
-        catch (err) {
-            this.error(err);
-        }
-    };
-    AjaxSubscriber.prototype.serializeBody = function (body, contentType) {
-        if (!body || typeof body === 'string') {
-            return body;
-        }
-        else if (root.FormData && body instanceof root.FormData) {
-            return body;
-        }
-        if (contentType) {
-            var splitIndex = contentType.indexOf(';');
-            if (splitIndex !== -1) {
-                contentType = contentType.substring(0, splitIndex);
-            }
-        }
-        switch (contentType) {
-            case 'application/x-www-form-urlencoded':
-                return Object.keys(body).map(function (key) { return encodeURIComponent(key) + "=" + encodeURIComponent(body[key]); }).join('&');
-            case 'application/json':
-                return JSON.stringify(body);
-            default:
-                return body;
-        }
-    };
-    AjaxSubscriber.prototype.setHeaders = function (xhr, headers) {
-        for (var key in headers) {
-            if (headers.hasOwnProperty(key)) {
-                xhr.setRequestHeader(key, headers[key]);
-            }
-        }
-    };
-    AjaxSubscriber.prototype.getHeader = function (headers, headerName) {
-        for (var key in headers) {
-            if (key.toLowerCase() === headerName.toLowerCase()) {
-                return headers[key];
-            }
-        }
-        return undefined;
-    };
-    AjaxSubscriber.prototype.setupEvents = function (xhr, request) {
-        var progressSubscriber = request.progressSubscriber;
-        function xhrTimeout(e) {
-            var _a = xhrTimeout, subscriber = _a.subscriber, progressSubscriber = _a.progressSubscriber, request = _a.request;
-            if (progressSubscriber) {
-                progressSubscriber.error(e);
-            }
-            var error;
-            try {
-                error = new AjaxTimeoutError(this, request);
-            }
-            catch (err) {
-                error = err;
-            }
-            subscriber.error(error);
-        }
-        xhr.ontimeout = xhrTimeout;
-        xhrTimeout.request = request;
-        xhrTimeout.subscriber = this;
-        xhrTimeout.progressSubscriber = progressSubscriber;
-        if (xhr.upload && 'withCredentials' in xhr) {
-            if (progressSubscriber) {
-                var xhrProgress_1;
-                xhrProgress_1 = function (e) {
-                    var progressSubscriber = xhrProgress_1.progressSubscriber;
-                    progressSubscriber.next(e);
-                };
-                if (root.XDomainRequest) {
-                    xhr.onprogress = xhrProgress_1;
-                }
-                else {
-                    xhr.upload.onprogress = xhrProgress_1;
-                }
-                xhrProgress_1.progressSubscriber = progressSubscriber;
-            }
-            var xhrError_1;
-            xhrError_1 = function (e) {
-                var _a = xhrError_1, progressSubscriber = _a.progressSubscriber, subscriber = _a.subscriber, request = _a.request;
-                if (progressSubscriber) {
-                    progressSubscriber.error(e);
-                }
-                var error;
-                try {
-                    error = new AjaxError('ajax error', this, request);
-                }
-                catch (err) {
-                    error = err;
-                }
-                subscriber.error(error);
-            };
-            xhr.onerror = xhrError_1;
-            xhrError_1.request = request;
-            xhrError_1.subscriber = this;
-            xhrError_1.progressSubscriber = progressSubscriber;
-        }
-        function xhrReadyStateChange(e) {
-            return;
-        }
-        xhr.onreadystatechange = xhrReadyStateChange;
-        xhrReadyStateChange.subscriber = this;
-        xhrReadyStateChange.progressSubscriber = progressSubscriber;
-        xhrReadyStateChange.request = request;
-        function xhrLoad(e) {
-            var _a = xhrLoad, subscriber = _a.subscriber, progressSubscriber = _a.progressSubscriber, request = _a.request;
-            if (this.readyState === 4) {
-                var status_1 = this.status === 1223 ? 204 : this.status;
-                var response = (this.responseType === 'text' ? (this.response || this.responseText) : this.response);
-                if (status_1 === 0) {
-                    status_1 = response ? 200 : 0;
-                }
-                if (status_1 < 400) {
-                    if (progressSubscriber) {
-                        progressSubscriber.complete();
-                    }
-                    subscriber.next(e);
-                    subscriber.complete();
-                }
-                else {
-                    if (progressSubscriber) {
-                        progressSubscriber.error(e);
-                    }
-                    var error = void 0;
-                    try {
-                        error = new AjaxError('ajax error ' + status_1, this, request);
-                    }
-                    catch (err) {
-                        error = err;
-                    }
-                    subscriber.error(error);
-                }
-            }
-        }
-        xhr.onload = xhrLoad;
-        xhrLoad.subscriber = this;
-        xhrLoad.progressSubscriber = progressSubscriber;
-        xhrLoad.request = request;
-    };
-    AjaxSubscriber.prototype.unsubscribe = function () {
-        var _a = this, done = _a.done, xhr = _a.xhr;
-        if (!done && xhr && xhr.readyState !== 4 && typeof xhr.abort === 'function') {
-            xhr.abort();
-        }
-        _super.prototype.unsubscribe.call(this);
-    };
-    return AjaxSubscriber;
-}(Subscriber));
-export { AjaxSubscriber };
-var AjaxResponse = /*@__PURE__*/ (function () {
-    function AjaxResponse(originalEvent, xhr, request) {
-        this.originalEvent = originalEvent;
-        this.xhr = xhr;
-        this.request = request;
-        this.status = xhr.status;
-        this.responseType = xhr.responseType || request.responseType;
-        this.response = parseXhrResponse(this.responseType, xhr);
-    }
-    return AjaxResponse;
-}());
-export { AjaxResponse };
-var AjaxErrorImpl = /*@__PURE__*/ (function () {
-    function AjaxErrorImpl(message, xhr, request) {
-        Error.call(this);
-        this.message = message;
-        this.name = 'AjaxError';
-        this.xhr = xhr;
-        this.request = request;
-        this.status = xhr.status;
-        this.responseType = xhr.responseType || request.responseType;
-        this.response = parseXhrResponse(this.responseType, xhr);
-        return this;
-    }
-    AjaxErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype);
-    return AjaxErrorImpl;
-})();
-export var AjaxError = AjaxErrorImpl;
-function parseJson(xhr) {
-    if ('response' in xhr) {
-        return xhr.responseType ? xhr.response : JSON.parse(xhr.response || xhr.responseText || 'null');
-    }
-    else {
-        return JSON.parse(xhr.responseText || 'null');
-    }
-}
-function parseXhrResponse(responseType, xhr) {
-    switch (responseType) {
-        case 'json':
-            return parseJson(xhr);
-        case 'xml':
-            return xhr.responseXML;
-        case 'text':
-        default:
-            return ('response' in xhr) ? xhr.response : xhr.responseText;
-    }
-}
-function AjaxTimeoutErrorImpl(xhr, request) {
-    AjaxError.call(this, 'ajax timeout', xhr, request);
-    this.name = 'AjaxTimeoutError';
-    return this;
-}
-export var AjaxTimeoutError = AjaxTimeoutErrorImpl;
-//# sourceMappingURL=AjaxObservable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/dom/AjaxObservable.js.map b/node_modules/rxjs/_esm5/internal/observable/dom/AjaxObservable.js.map
deleted file mode 100644
index a5517c6..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/dom/AjaxObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AjaxObservable.js","sources":["../../../../src/internal/observable/dom/AjaxObservable.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/dom/WebSocketSubject.js b/node_modules/rxjs/_esm5/internal/observable/dom/WebSocketSubject.js
deleted file mode 100644
index 136c863..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/dom/WebSocketSubject.js
+++ /dev/null
@@ -1,217 +0,0 @@
-/** PURE_IMPORTS_START tslib,_.._Subject,_.._Subscriber,_.._Observable,_.._Subscription,_.._ReplaySubject PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subject, AnonymousSubject } from '../../Subject';
-import { Subscriber } from '../../Subscriber';
-import { Observable } from '../../Observable';
-import { Subscription } from '../../Subscription';
-import { ReplaySubject } from '../../ReplaySubject';
-var DEFAULT_WEBSOCKET_CONFIG = {
-    url: '',
-    deserializer: function (e) { return JSON.parse(e.data); },
-    serializer: function (value) { return JSON.stringify(value); },
-};
-var WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT = 'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';
-var WebSocketSubject = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(WebSocketSubject, _super);
-    function WebSocketSubject(urlConfigOrSource, destination) {
-        var _this = _super.call(this) || this;
-        if (urlConfigOrSource instanceof Observable) {
-            _this.destination = destination;
-            _this.source = urlConfigOrSource;
-        }
-        else {
-            var config = _this._config = tslib_1.__assign({}, DEFAULT_WEBSOCKET_CONFIG);
-            _this._output = new Subject();
-            if (typeof urlConfigOrSource === 'string') {
-                config.url = urlConfigOrSource;
-            }
-            else {
-                for (var key in urlConfigOrSource) {
-                    if (urlConfigOrSource.hasOwnProperty(key)) {
-                        config[key] = urlConfigOrSource[key];
-                    }
-                }
-            }
-            if (!config.WebSocketCtor && WebSocket) {
-                config.WebSocketCtor = WebSocket;
-            }
-            else if (!config.WebSocketCtor) {
-                throw new Error('no WebSocket constructor can be found');
-            }
-            _this.destination = new ReplaySubject();
-        }
-        return _this;
-    }
-    WebSocketSubject.prototype.lift = function (operator) {
-        var sock = new WebSocketSubject(this._config, this.destination);
-        sock.operator = operator;
-        sock.source = this;
-        return sock;
-    };
-    WebSocketSubject.prototype._resetState = function () {
-        this._socket = null;
-        if (!this.source) {
-            this.destination = new ReplaySubject();
-        }
-        this._output = new Subject();
-    };
-    WebSocketSubject.prototype.multiplex = function (subMsg, unsubMsg, messageFilter) {
-        var self = this;
-        return new Observable(function (observer) {
-            try {
-                self.next(subMsg());
-            }
-            catch (err) {
-                observer.error(err);
-            }
-            var subscription = self.subscribe(function (x) {
-                try {
-                    if (messageFilter(x)) {
-                        observer.next(x);
-                    }
-                }
-                catch (err) {
-                    observer.error(err);
-                }
-            }, function (err) { return observer.error(err); }, function () { return observer.complete(); });
-            return function () {
-                try {
-                    self.next(unsubMsg());
-                }
-                catch (err) {
-                    observer.error(err);
-                }
-                subscription.unsubscribe();
-            };
-        });
-    };
-    WebSocketSubject.prototype._connectSocket = function () {
-        var _this = this;
-        var _a = this._config, WebSocketCtor = _a.WebSocketCtor, protocol = _a.protocol, url = _a.url, binaryType = _a.binaryType;
-        var observer = this._output;
-        var socket = null;
-        try {
-            socket = protocol ?
-                new WebSocketCtor(url, protocol) :
-                new WebSocketCtor(url);
-            this._socket = socket;
-            if (binaryType) {
-                this._socket.binaryType = binaryType;
-            }
-        }
-        catch (e) {
-            observer.error(e);
-            return;
-        }
-        var subscription = new Subscription(function () {
-            _this._socket = null;
-            if (socket && socket.readyState === 1) {
-                socket.close();
-            }
-        });
-        socket.onopen = function (e) {
-            var _socket = _this._socket;
-            if (!_socket) {
-                socket.close();
-                _this._resetState();
-                return;
-            }
-            var openObserver = _this._config.openObserver;
-            if (openObserver) {
-                openObserver.next(e);
-            }
-            var queue = _this.destination;
-            _this.destination = Subscriber.create(function (x) {
-                if (socket.readyState === 1) {
-                    try {
-                        var serializer = _this._config.serializer;
-                        socket.send(serializer(x));
-                    }
-                    catch (e) {
-                        _this.destination.error(e);
-                    }
-                }
-            }, function (e) {
-                var closingObserver = _this._config.closingObserver;
-                if (closingObserver) {
-                    closingObserver.next(undefined);
-                }
-                if (e && e.code) {
-                    socket.close(e.code, e.reason);
-                }
-                else {
-                    observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));
-                }
-                _this._resetState();
-            }, function () {
-                var closingObserver = _this._config.closingObserver;
-                if (closingObserver) {
-                    closingObserver.next(undefined);
-                }
-                socket.close();
-                _this._resetState();
-            });
-            if (queue && queue instanceof ReplaySubject) {
-                subscription.add(queue.subscribe(_this.destination));
-            }
-        };
-        socket.onerror = function (e) {
-            _this._resetState();
-            observer.error(e);
-        };
-        socket.onclose = function (e) {
-            _this._resetState();
-            var closeObserver = _this._config.closeObserver;
-            if (closeObserver) {
-                closeObserver.next(e);
-            }
-            if (e.wasClean) {
-                observer.complete();
-            }
-            else {
-                observer.error(e);
-            }
-        };
-        socket.onmessage = function (e) {
-            try {
-                var deserializer = _this._config.deserializer;
-                observer.next(deserializer(e));
-            }
-            catch (err) {
-                observer.error(err);
-            }
-        };
-    };
-    WebSocketSubject.prototype._subscribe = function (subscriber) {
-        var _this = this;
-        var source = this.source;
-        if (source) {
-            return source.subscribe(subscriber);
-        }
-        if (!this._socket) {
-            this._connectSocket();
-        }
-        this._output.subscribe(subscriber);
-        subscriber.add(function () {
-            var _socket = _this._socket;
-            if (_this._output.observers.length === 0) {
-                if (_socket && _socket.readyState === 1) {
-                    _socket.close();
-                }
-                _this._resetState();
-            }
-        });
-        return subscriber;
-    };
-    WebSocketSubject.prototype.unsubscribe = function () {
-        var _socket = this._socket;
-        if (_socket && _socket.readyState === 1) {
-            _socket.close();
-        }
-        this._resetState();
-        _super.prototype.unsubscribe.call(this);
-    };
-    return WebSocketSubject;
-}(AnonymousSubject));
-export { WebSocketSubject };
-//# sourceMappingURL=WebSocketSubject.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/dom/WebSocketSubject.js.map b/node_modules/rxjs/_esm5/internal/observable/dom/WebSocketSubject.js.map
deleted file mode 100644
index 6c1c1d5..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/dom/WebSocketSubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"WebSocketSubject.js","sources":["../../../../src/internal/observable/dom/WebSocketSubject.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/dom/ajax.js b/node_modules/rxjs/_esm5/internal/observable/dom/ajax.js
deleted file mode 100644
index 86ee518..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/dom/ajax.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/** PURE_IMPORTS_START _AjaxObservable PURE_IMPORTS_END */
-import { AjaxObservable } from './AjaxObservable';
-export var ajax = /*@__PURE__*/ (function () { return AjaxObservable.create; })();
-//# sourceMappingURL=ajax.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/dom/ajax.js.map b/node_modules/rxjs/_esm5/internal/observable/dom/ajax.js.map
deleted file mode 100644
index d2ee88d..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/dom/ajax.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ajax.js","sources":["../../../../src/internal/observable/dom/ajax.ts"],"names":[],"mappings":"AAAA,OAAO,EAAG,cAAc,EAAuB,MAAM,kBAAkB,CAAC;AAiFxE,MAAM,CAAC,IAAM,IAAI,GAAuB,CAAC,cAAM,OAAA,cAAc,CAAC,MAAM,EAArB,CAAqB,CAAC,EAAE,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/dom/fetch.js b/node_modules/rxjs/_esm5/internal/observable/dom/fetch.js
deleted file mode 100644
index 6decb81..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/dom/fetch.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/** PURE_IMPORTS_START tslib,_.._Observable PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Observable } from '../../Observable';
-export function fromFetch(input, init) {
-    return new Observable(function (subscriber) {
-        var controller = new AbortController();
-        var signal = controller.signal;
-        var outerSignalHandler;
-        var abortable = true;
-        var unsubscribed = false;
-        if (init) {
-            if (init.signal) {
-                if (init.signal.aborted) {
-                    controller.abort();
-                }
-                else {
-                    outerSignalHandler = function () {
-                        if (!signal.aborted) {
-                            controller.abort();
-                        }
-                    };
-                    init.signal.addEventListener('abort', outerSignalHandler);
-                }
-            }
-            init = tslib_1.__assign({}, init, { signal: signal });
-        }
-        else {
-            init = { signal: signal };
-        }
-        fetch(input, init).then(function (response) {
-            abortable = false;
-            subscriber.next(response);
-            subscriber.complete();
-        }).catch(function (err) {
-            abortable = false;
-            if (!unsubscribed) {
-                subscriber.error(err);
-            }
-        });
-        return function () {
-            unsubscribed = true;
-            if (abortable) {
-                controller.abort();
-            }
-        };
-    });
-}
-//# sourceMappingURL=fetch.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/dom/fetch.js.map b/node_modules/rxjs/_esm5/internal/observable/dom/fetch.js.map
deleted file mode 100644
index ca00fae..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/dom/fetch.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fetch.js","sources":["../../../../src/internal/observable/dom/fetch.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAoD9C,MAAM,UAAU,SAAS,CAAC,KAAuB,EAAE,IAAkB;IACnE,OAAO,IAAI,UAAU,CAAW,UAAA,UAAU;QACxC,IAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,IAAI,kBAA8B,CAAC;QACnC,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,IAAI,IAAI,EAAE;YAER,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;oBACvB,UAAU,CAAC,KAAK,EAAE,CAAC;iBACpB;qBAAM;oBACL,kBAAkB,GAAG;wBACnB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;4BACnB,UAAU,CAAC,KAAK,EAAE,CAAC;yBACpB;oBACH,CAAC,CAAC;oBACF,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;iBAC3D;aACF;YACD,IAAI,wBAAQ,IAAI,IAAE,MAAM,QAAA,GAAE,CAAC;SAC5B;aAAM;YACL,IAAI,GAAG,EAAE,MAAM,QAAA,EAAE,CAAC;SACnB;QAED,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAA,QAAQ;YAC9B,SAAS,GAAG,KAAK,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC,KAAK,CAAC,UAAA,GAAG;YACV,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,YAAY,EAAE;gBAEjB,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACvB;QACH,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,YAAY,GAAG,IAAI,CAAC;YACpB,IAAI,SAAS,EAAE;gBACb,UAAU,CAAC,KAAK,EAAE,CAAC;aACpB;QACH,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/dom/webSocket.js b/node_modules/rxjs/_esm5/internal/observable/dom/webSocket.js
deleted file mode 100644
index f5dbcaa..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/dom/webSocket.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _WebSocketSubject PURE_IMPORTS_END */
-import { WebSocketSubject } from './WebSocketSubject';
-export function webSocket(urlConfigOrSource) {
-    return new WebSocketSubject(urlConfigOrSource);
-}
-//# sourceMappingURL=webSocket.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/dom/webSocket.js.map b/node_modules/rxjs/_esm5/internal/observable/dom/webSocket.js.map
deleted file mode 100644
index 821e4e6..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/dom/webSocket.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"webSocket.js","sources":["../../../../src/internal/observable/dom/webSocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA0B,MAAM,oBAAoB,CAAC;AAyJ9E,MAAM,UAAU,SAAS,CAAI,iBAAqD;IAChF,OAAO,IAAI,gBAAgB,CAAI,iBAAiB,CAAC,CAAC;AACpD,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/empty.js b/node_modules/rxjs/_esm5/internal/observable/empty.js
deleted file mode 100644
index 1c4b0c7..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/empty.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-export var EMPTY = /*@__PURE__*/ new Observable(function (subscriber) { return subscriber.complete(); });
-export function empty(scheduler) {
-    return scheduler ? emptyScheduled(scheduler) : EMPTY;
-}
-function emptyScheduled(scheduler) {
-    return new Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });
-}
-//# sourceMappingURL=empty.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/empty.js.map b/node_modules/rxjs/_esm5/internal/observable/empty.js.map
deleted file mode 100644
index 567e87c..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/empty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"empty.js","sources":["../../../src/internal/observable/empty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAO3C,MAAM,CAAC,IAAM,KAAK,GAAG,IAAI,UAAU,CAAQ,UAAA,UAAU,IAAI,OAAA,UAAU,CAAC,QAAQ,EAAE,EAArB,CAAqB,CAAC,CAAC;AAsDhF,MAAM,UAAU,KAAK,CAAC,SAAyB;IAC7C,OAAO,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CAAC,SAAwB;IAC9C,OAAO,IAAI,UAAU,CAAQ,UAAA,UAAU,IAAI,OAAA,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,UAAU,CAAC,QAAQ,EAAE,EAArB,CAAqB,CAAC,EAA/C,CAA+C,CAAC,CAAC;AAC9F,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/forkJoin.js b/node_modules/rxjs/_esm5/internal/observable/forkJoin.js
deleted file mode 100644
index 5c38fe7..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/forkJoin.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_util_isArray,_operators_map,_util_isObject,_from PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { isArray } from '../util/isArray';
-import { map } from '../operators/map';
-import { isObject } from '../util/isObject';
-import { from } from './from';
-export function forkJoin() {
-    var sources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        sources[_i] = arguments[_i];
-    }
-    if (sources.length === 1) {
-        var first_1 = sources[0];
-        if (isArray(first_1)) {
-            return forkJoinInternal(first_1, null);
-        }
-        if (isObject(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) {
-            var keys = Object.keys(first_1);
-            return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys);
-        }
-    }
-    if (typeof sources[sources.length - 1] === 'function') {
-        var resultSelector_1 = sources.pop();
-        sources = (sources.length === 1 && isArray(sources[0])) ? sources[0] : sources;
-        return forkJoinInternal(sources, null).pipe(map(function (args) { return resultSelector_1.apply(void 0, args); }));
-    }
-    return forkJoinInternal(sources, null);
-}
-function forkJoinInternal(sources, keys) {
-    return new Observable(function (subscriber) {
-        var len = sources.length;
-        if (len === 0) {
-            subscriber.complete();
-            return;
-        }
-        var values = new Array(len);
-        var completed = 0;
-        var emitted = 0;
-        var _loop_1 = function (i) {
-            var source = from(sources[i]);
-            var hasValue = false;
-            subscriber.add(source.subscribe({
-                next: function (value) {
-                    if (!hasValue) {
-                        hasValue = true;
-                        emitted++;
-                    }
-                    values[i] = value;
-                },
-                error: function (err) { return subscriber.error(err); },
-                complete: function () {
-                    completed++;
-                    if (completed === len || !hasValue) {
-                        if (emitted === len) {
-                            subscriber.next(keys ?
-                                keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) :
-                                values);
-                        }
-                        subscriber.complete();
-                    }
-                }
-            }));
-        };
-        for (var i = 0; i < len; i++) {
-            _loop_1(i);
-        }
-    });
-}
-//# sourceMappingURL=forkJoin.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/forkJoin.js.map b/node_modules/rxjs/_esm5/internal/observable/forkJoin.js.map
deleted file mode 100644
index e175ee5..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/forkJoin.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"forkJoin.js","sources":["../../../src/internal/observable/forkJoin.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/from.js b/node_modules/rxjs/_esm5/internal/observable/from.js
deleted file mode 100644
index 453c25e..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/from.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_util_subscribeTo,_scheduled_scheduled PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { subscribeTo } from '../util/subscribeTo';
-import { scheduled } from '../scheduled/scheduled';
-export function from(input, scheduler) {
-    if (!scheduler) {
-        if (input instanceof Observable) {
-            return input;
-        }
-        return new Observable(subscribeTo(input));
-    }
-    else {
-        return scheduled(input, scheduler);
-    }
-}
-//# sourceMappingURL=from.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/from.js.map b/node_modules/rxjs/_esm5/internal/observable/from.js.map
deleted file mode 100644
index d0b7a0a..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/from.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"from.js","sources":["../../../src/internal/observable/from.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAyGnD,MAAM,UAAU,IAAI,CAAI,KAAyB,EAAE,SAAyB;IAC1E,IAAI,CAAC,SAAS,EAAE;QACd,IAAI,KAAK,YAAY,UAAU,EAAE;YAC/B,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,UAAU,CAAI,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;KAC9C;SAAM;QACL,OAAO,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;KACpC;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/fromArray.js b/node_modules/rxjs/_esm5/internal/observable/fromArray.js
deleted file mode 100644
index 587cb72..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/fromArray.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_util_subscribeToArray,_scheduled_scheduleArray PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { subscribeToArray } from '../util/subscribeToArray';
-import { scheduleArray } from '../scheduled/scheduleArray';
-export function fromArray(input, scheduler) {
-    if (!scheduler) {
-        return new Observable(subscribeToArray(input));
-    }
-    else {
-        return scheduleArray(input, scheduler);
-    }
-}
-//# sourceMappingURL=fromArray.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/fromArray.js.map b/node_modules/rxjs/_esm5/internal/observable/fromArray.js.map
deleted file mode 100644
index 55af2ba..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/fromArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromArray.js","sources":["../../../src/internal/observable/fromArray.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,MAAM,UAAU,SAAS,CAAI,KAAmB,EAAE,SAAyB;IACzE,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,UAAU,CAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;KACnD;SAAM;QACL,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;KACxC;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/fromEvent.js b/node_modules/rxjs/_esm5/internal/observable/fromEvent.js
deleted file mode 100644
index 0c52458..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/fromEvent.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { isArray } from '../util/isArray';
-import { isFunction } from '../util/isFunction';
-import { map } from '../operators/map';
-var toString = /*@__PURE__*/ (function () { return Object.prototype.toString; })();
-export function fromEvent(target, eventName, options, resultSelector) {
-    if (isFunction(options)) {
-        resultSelector = options;
-        options = undefined;
-    }
-    if (resultSelector) {
-        return fromEvent(target, eventName, options).pipe(map(function (args) { return isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-    }
-    return new Observable(function (subscriber) {
-        function handler(e) {
-            if (arguments.length > 1) {
-                subscriber.next(Array.prototype.slice.call(arguments));
-            }
-            else {
-                subscriber.next(e);
-            }
-        }
-        setupSubscription(target, eventName, handler, subscriber, options);
-    });
-}
-function setupSubscription(sourceObj, eventName, handler, subscriber, options) {
-    var unsubscribe;
-    if (isEventTarget(sourceObj)) {
-        var source_1 = sourceObj;
-        sourceObj.addEventListener(eventName, handler, options);
-        unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); };
-    }
-    else if (isJQueryStyleEventEmitter(sourceObj)) {
-        var source_2 = sourceObj;
-        sourceObj.on(eventName, handler);
-        unsubscribe = function () { return source_2.off(eventName, handler); };
-    }
-    else if (isNodeStyleEventEmitter(sourceObj)) {
-        var source_3 = sourceObj;
-        sourceObj.addListener(eventName, handler);
-        unsubscribe = function () { return source_3.removeListener(eventName, handler); };
-    }
-    else if (sourceObj && sourceObj.length) {
-        for (var i = 0, len = sourceObj.length; i < len; i++) {
-            setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
-        }
-    }
-    else {
-        throw new TypeError('Invalid event target');
-    }
-    subscriber.add(unsubscribe);
-}
-function isNodeStyleEventEmitter(sourceObj) {
-    return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';
-}
-function isJQueryStyleEventEmitter(sourceObj) {
-    return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';
-}
-function isEventTarget(sourceObj) {
-    return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
-}
-//# sourceMappingURL=fromEvent.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/fromEvent.js.map b/node_modules/rxjs/_esm5/internal/observable/fromEvent.js.map
deleted file mode 100644
index 55aa18e..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/fromEvent.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromEvent.js","sources":["../../../src/internal/observable/fromEvent.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/fromEventPattern.js b/node_modules/rxjs/_esm5/internal/observable/fromEventPattern.js
deleted file mode 100644
index 9c40ae6..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/fromEventPattern.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { isArray } from '../util/isArray';
-import { isFunction } from '../util/isFunction';
-import { map } from '../operators/map';
-export function fromEventPattern(addHandler, removeHandler, resultSelector) {
-    if (resultSelector) {
-        return fromEventPattern(addHandler, removeHandler).pipe(map(function (args) { return isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-    }
-    return new Observable(function (subscriber) {
-        var handler = function () {
-            var e = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                e[_i] = arguments[_i];
-            }
-            return subscriber.next(e.length === 1 ? e[0] : e);
-        };
-        var retValue;
-        try {
-            retValue = addHandler(handler);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        if (!isFunction(removeHandler)) {
-            return undefined;
-        }
-        return function () { return removeHandler(handler, retValue); };
-    });
-}
-//# sourceMappingURL=fromEventPattern.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/fromEventPattern.js.map b/node_modules/rxjs/_esm5/internal/observable/fromEventPattern.js.map
deleted file mode 100644
index fc758c1..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/fromEventPattern.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromEventPattern.js","sources":["../../../src/internal/observable/fromEventPattern.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAwIvC,MAAM,UAAU,gBAAgB,CAAI,UAA8C,EAC9C,aAAiE,EACjE,cAAsC;IAExE,IAAI,cAAc,EAAE;QAElB,OAAO,gBAAgB,CAAI,UAAU,EAAE,aAAa,CAAC,CAAC,IAAI,CACxD,GAAG,CAAC,UAAA,IAAI,IAAI,OAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,eAAI,IAAI,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EAA9D,CAA8D,CAAC,CAC5E,CAAC;KACH;IAED,OAAO,IAAI,UAAU,CAAU,UAAA,UAAU;QACvC,IAAM,OAAO,GAAG;YAAC,WAAS;iBAAT,UAAS,EAAT,qBAAS,EAAT,IAAS;gBAAT,sBAAS;;YAAK,OAAA,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAA1C,CAA0C,CAAC;QAE1E,IAAI,QAAa,CAAC;QAClB,IAAI;YACF,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;SAChC;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;YAC9B,OAAO,SAAS,CAAC;SAClB;QAED,OAAO,cAAM,OAAA,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAhC,CAAgC,CAAE;IACjD,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/fromIterable.js b/node_modules/rxjs/_esm5/internal/observable/fromIterable.js
deleted file mode 100644
index c37371f..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/fromIterable.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_util_subscribeToIterable,_scheduled_scheduleIterable PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { subscribeToIterable } from '../util/subscribeToIterable';
-import { scheduleIterable } from '../scheduled/scheduleIterable';
-export function fromIterable(input, scheduler) {
-    if (!input) {
-        throw new Error('Iterable cannot be null');
-    }
-    if (!scheduler) {
-        return new Observable(subscribeToIterable(input));
-    }
-    else {
-        return scheduleIterable(input, scheduler);
-    }
-}
-//# sourceMappingURL=fromIterable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/fromIterable.js.map b/node_modules/rxjs/_esm5/internal/observable/fromIterable.js.map
deleted file mode 100644
index f150bb3..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/fromIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromIterable.js","sources":["../../../src/internal/observable/fromIterable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,UAAU,YAAY,CAAI,KAAkB,EAAE,SAAyB;IAC3E,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;KAC5C;IACD,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,UAAU,CAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;KACtD;SAAM;QACL,OAAO,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;KAC3C;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/fromPromise.js b/node_modules/rxjs/_esm5/internal/observable/fromPromise.js
deleted file mode 100644
index a826216..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/fromPromise.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_util_subscribeToPromise,_scheduled_schedulePromise PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { subscribeToPromise } from '../util/subscribeToPromise';
-import { schedulePromise } from '../scheduled/schedulePromise';
-export function fromPromise(input, scheduler) {
-    if (!scheduler) {
-        return new Observable(subscribeToPromise(input));
-    }
-    else {
-        return schedulePromise(input, scheduler);
-    }
-}
-//# sourceMappingURL=fromPromise.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/fromPromise.js.map b/node_modules/rxjs/_esm5/internal/observable/fromPromise.js.map
deleted file mode 100644
index d695e5b..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/fromPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromPromise.js","sources":["../../../src/internal/observable/fromPromise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,UAAU,WAAW,CAAI,KAAqB,EAAE,SAAyB;IAC7E,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,UAAU,CAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;KACrD;SAAM;QACL,OAAO,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;KAC1C;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/generate.js b/node_modules/rxjs/_esm5/internal/observable/generate.js
deleted file mode 100644
index 0e8ecb3..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/generate.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_util_identity,_util_isScheduler PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { identity } from '../util/identity';
-import { isScheduler } from '../util/isScheduler';
-export function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {
-    var resultSelector;
-    var initialState;
-    if (arguments.length == 1) {
-        var options = initialStateOrOptions;
-        initialState = options.initialState;
-        condition = options.condition;
-        iterate = options.iterate;
-        resultSelector = options.resultSelector || identity;
-        scheduler = options.scheduler;
-    }
-    else if (resultSelectorOrObservable === undefined || isScheduler(resultSelectorOrObservable)) {
-        initialState = initialStateOrOptions;
-        resultSelector = identity;
-        scheduler = resultSelectorOrObservable;
-    }
-    else {
-        initialState = initialStateOrOptions;
-        resultSelector = resultSelectorOrObservable;
-    }
-    return new Observable(function (subscriber) {
-        var state = initialState;
-        if (scheduler) {
-            return scheduler.schedule(dispatch, 0, {
-                subscriber: subscriber,
-                iterate: iterate,
-                condition: condition,
-                resultSelector: resultSelector,
-                state: state
-            });
-        }
-        do {
-            if (condition) {
-                var conditionResult = void 0;
-                try {
-                    conditionResult = condition(state);
-                }
-                catch (err) {
-                    subscriber.error(err);
-                    return undefined;
-                }
-                if (!conditionResult) {
-                    subscriber.complete();
-                    break;
-                }
-            }
-            var value = void 0;
-            try {
-                value = resultSelector(state);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-            subscriber.next(value);
-            if (subscriber.closed) {
-                break;
-            }
-            try {
-                state = iterate(state);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-        } while (true);
-        return undefined;
-    });
-}
-function dispatch(state) {
-    var subscriber = state.subscriber, condition = state.condition;
-    if (subscriber.closed) {
-        return undefined;
-    }
-    if (state.needIterate) {
-        try {
-            state.state = state.iterate(state.state);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-    }
-    else {
-        state.needIterate = true;
-    }
-    if (condition) {
-        var conditionResult = void 0;
-        try {
-            conditionResult = condition(state.state);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        if (!conditionResult) {
-            subscriber.complete();
-            return undefined;
-        }
-        if (subscriber.closed) {
-            return undefined;
-        }
-    }
-    var value;
-    try {
-        value = state.resultSelector(state.state);
-    }
-    catch (err) {
-        subscriber.error(err);
-        return undefined;
-    }
-    if (subscriber.closed) {
-        return undefined;
-    }
-    subscriber.next(value);
-    if (subscriber.closed) {
-        return undefined;
-    }
-    return this.schedule(state);
-}
-//# sourceMappingURL=generate.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/generate.js.map b/node_modules/rxjs/_esm5/internal/observable/generate.js.map
deleted file mode 100644
index 05c10df..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/generate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"generate.js","sources":["../../../src/internal/observable/generate.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/iif.js b/node_modules/rxjs/_esm5/internal/observable/iif.js
deleted file mode 100644
index 67a4bd9..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/iif.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/** PURE_IMPORTS_START _defer,_empty PURE_IMPORTS_END */
-import { defer } from './defer';
-import { EMPTY } from './empty';
-export function iif(condition, trueResult, falseResult) {
-    if (trueResult === void 0) {
-        trueResult = EMPTY;
-    }
-    if (falseResult === void 0) {
-        falseResult = EMPTY;
-    }
-    return defer(function () { return condition() ? trueResult : falseResult; });
-}
-//# sourceMappingURL=iif.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/iif.js.map b/node_modules/rxjs/_esm5/internal/observable/iif.js.map
deleted file mode 100644
index bafa2e2..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/iif.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"iif.js","sources":["../../../src/internal/observable/iif.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AA2FhC,MAAM,UAAU,GAAG,CACjB,SAAwB,EACxB,UAA4C,EAC5C,WAA6C;IAD7C,2BAAA,EAAA,kBAA4C;IAC5C,4BAAA,EAAA,mBAA6C;IAE7C,OAAO,KAAK,CAAC,cAAM,OAAA,SAAS,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAtC,CAAsC,CAAC,CAAC;AAC7D,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/interval.js b/node_modules/rxjs/_esm5/internal/observable/interval.js
deleted file mode 100644
index c530a02..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/interval.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { async } from '../scheduler/async';
-import { isNumeric } from '../util/isNumeric';
-export function interval(period, scheduler) {
-    if (period === void 0) {
-        period = 0;
-    }
-    if (scheduler === void 0) {
-        scheduler = async;
-    }
-    if (!isNumeric(period) || period < 0) {
-        period = 0;
-    }
-    if (!scheduler || typeof scheduler.schedule !== 'function') {
-        scheduler = async;
-    }
-    return new Observable(function (subscriber) {
-        subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period }));
-        return subscriber;
-    });
-}
-function dispatch(state) {
-    var subscriber = state.subscriber, counter = state.counter, period = state.period;
-    subscriber.next(counter);
-    this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period);
-}
-//# sourceMappingURL=interval.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/interval.js.map b/node_modules/rxjs/_esm5/internal/observable/interval.js.map
deleted file mode 100644
index 8fd0b0c..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/interval.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"interval.js","sources":["../../../src/internal/observable/interval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAmD9C,MAAM,UAAU,QAAQ,CAAC,MAAU,EACV,SAAgC;IADhC,uBAAA,EAAA,UAAU;IACV,0BAAA,EAAA,iBAAgC;IACvD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE;QACpC,MAAM,GAAG,CAAC,CAAC;KACZ;IAED,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE;QAC1D,SAAS,GAAG,KAAK,CAAC;KACnB;IAED,OAAO,IAAI,UAAU,CAAS,UAAA,UAAU;QACtC,UAAU,CAAC,GAAG,CACZ,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,YAAA,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,QAAA,EAAE,CAAC,CACzE,CAAC;QACF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAuC,KAAoB;IAClE,IAAA,6BAAU,EAAE,uBAAO,EAAE,qBAAM,CAAW;IAC9C,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,YAAA,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,MAAM,QAAA,EAAE,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/merge.js b/node_modules/rxjs/_esm5/internal/observable/merge.js
deleted file mode 100644
index baa8fd3..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/merge.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_util_isScheduler,_operators_mergeAll,_fromArray PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { isScheduler } from '../util/isScheduler';
-import { mergeAll } from '../operators/mergeAll';
-import { fromArray } from './fromArray';
-export function merge() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var concurrent = Number.POSITIVE_INFINITY;
-    var scheduler = null;
-    var last = observables[observables.length - 1];
-    if (isScheduler(last)) {
-        scheduler = observables.pop();
-        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
-            concurrent = observables.pop();
-        }
-    }
-    else if (typeof last === 'number') {
-        concurrent = observables.pop();
-    }
-    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable) {
-        return observables[0];
-    }
-    return mergeAll(concurrent)(fromArray(observables, scheduler));
-}
-//# sourceMappingURL=merge.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/merge.js.map b/node_modules/rxjs/_esm5/internal/observable/merge.js.map
deleted file mode 100644
index e65dd6e..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/merge.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"merge.js","sources":["../../../src/internal/observable/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAqHxC,MAAM,UAAU,KAAK;IAAO,qBAAoE;SAApE,UAAoE,EAApE,qBAAoE,EAApE,IAAoE;QAApE,gCAAoE;;IAC/F,IAAI,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAC1C,IAAI,SAAS,GAAkB,IAAI,CAAC;IACnC,IAAI,IAAI,GAAQ,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpD,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE;QACrB,SAAS,GAAkB,WAAW,CAAC,GAAG,EAAE,CAAC;QAC7C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,QAAQ,EAAE;YACrF,UAAU,GAAW,WAAW,CAAC,GAAG,EAAE,CAAC;SACxC;KACF;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,UAAU,GAAW,WAAW,CAAC,GAAG,EAAE,CAAC;KACxC;IAED,IAAI,SAAS,KAAK,IAAI,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,YAAY,UAAU,EAAE;QAC1F,OAAsB,WAAW,CAAC,CAAC,CAAC,CAAC;KACtC;IAED,OAAO,QAAQ,CAAI,UAAU,CAAC,CAAC,SAAS,CAAM,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AACzE,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/never.js b/node_modules/rxjs/_esm5/internal/observable/never.js
deleted file mode 100644
index 09f7cd0..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/never.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_util_noop PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { noop } from '../util/noop';
-export var NEVER = /*@__PURE__*/ new Observable(noop);
-export function never() {
-    return NEVER;
-}
-//# sourceMappingURL=never.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/never.js.map b/node_modules/rxjs/_esm5/internal/observable/never.js.map
deleted file mode 100644
index a32cf25..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/never.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"never.js","sources":["../../../src/internal/observable/never.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAgCpC,MAAM,CAAC,IAAM,KAAK,GAAG,IAAI,UAAU,CAAQ,IAAI,CAAC,CAAC;AAKjD,MAAM,UAAU,KAAK;IACnB,OAAO,KAAK,CAAC;AACf,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/of.js b/node_modules/rxjs/_esm5/internal/observable/of.js
deleted file mode 100644
index 9078744..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/of.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/** PURE_IMPORTS_START _util_isScheduler,_fromArray,_scheduled_scheduleArray PURE_IMPORTS_END */
-import { isScheduler } from '../util/isScheduler';
-import { fromArray } from './fromArray';
-import { scheduleArray } from '../scheduled/scheduleArray';
-export function of() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i] = arguments[_i];
-    }
-    var scheduler = args[args.length - 1];
-    if (isScheduler(scheduler)) {
-        args.pop();
-        return scheduleArray(args, scheduler);
-    }
-    else {
-        return fromArray(args);
-    }
-}
-//# sourceMappingURL=of.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/of.js.map b/node_modules/rxjs/_esm5/internal/observable/of.js.map
deleted file mode 100644
index e0b0338..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/of.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"of.js","sources":["../../../src/internal/observable/of.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAiG3D,MAAM,UAAU,EAAE;IAAI,cAAiC;SAAjC,UAAiC,EAAjC,qBAAiC,EAAjC,IAAiC;QAAjC,yBAAiC;;IACrD,IAAI,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAkB,CAAC;IACvD,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE;QAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,OAAO,aAAa,CAAC,IAAW,EAAE,SAAS,CAAC,CAAC;KAC9C;SAAM;QACL,OAAO,SAAS,CAAC,IAAW,CAAC,CAAC;KAC/B;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/onErrorResumeNext.js b/node_modules/rxjs/_esm5/internal/observable/onErrorResumeNext.js
deleted file mode 100644
index efa034e..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/onErrorResumeNext.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_from,_util_isArray,_empty PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { from } from './from';
-import { isArray } from '../util/isArray';
-import { EMPTY } from './empty';
-export function onErrorResumeNext() {
-    var sources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        sources[_i] = arguments[_i];
-    }
-    if (sources.length === 0) {
-        return EMPTY;
-    }
-    var first = sources[0], remainder = sources.slice(1);
-    if (sources.length === 1 && isArray(first)) {
-        return onErrorResumeNext.apply(void 0, first);
-    }
-    return new Observable(function (subscriber) {
-        var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); };
-        return from(first).subscribe({
-            next: function (value) { subscriber.next(value); },
-            error: subNext,
-            complete: subNext,
-        });
-    });
-}
-//# sourceMappingURL=onErrorResumeNext.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/onErrorResumeNext.js.map b/node_modules/rxjs/_esm5/internal/observable/onErrorResumeNext.js.map
deleted file mode 100644
index 357a8a7..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/onErrorResumeNext.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"onErrorResumeNext.js","sources":["../../../src/internal/observable/onErrorResumeNext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAwEhC,MAAM,UAAU,iBAAiB;IAAO,iBAEqD;SAFrD,UAEqD,EAFrD,qBAEqD,EAFrD,IAEqD;QAFrD,4BAEqD;;IAE3F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,KAAK,CAAC;KACd;IAEO,IAAA,kBAAK,EAAE,4BAAY,CAAa;IAExC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;QAC1C,OAAO,iBAAiB,eAAI,KAAK,EAAE;KACpC;IAED,OAAO,IAAI,UAAU,CAAC,UAAA,UAAU;QAC9B,IAAM,OAAO,GAAG,cAAM,OAAA,UAAU,CAAC,GAAG,CAClC,iBAAiB,eAAI,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,CACtD,EAFqB,CAErB,CAAC;QAEF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;YAC3B,IAAI,YAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvC,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/pairs.js b/node_modules/rxjs/_esm5/internal/observable/pairs.js
deleted file mode 100644
index 85d799b..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/pairs.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-export function pairs(obj, scheduler) {
-    if (!scheduler) {
-        return new Observable(function (subscriber) {
-            var keys = Object.keys(obj);
-            for (var i = 0; i < keys.length && !subscriber.closed; i++) {
-                var key = keys[i];
-                if (obj.hasOwnProperty(key)) {
-                    subscriber.next([key, obj[key]]);
-                }
-            }
-            subscriber.complete();
-        });
-    }
-    else {
-        return new Observable(function (subscriber) {
-            var keys = Object.keys(obj);
-            var subscription = new Subscription();
-            subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj }));
-            return subscription;
-        });
-    }
-}
-export function dispatch(state) {
-    var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj;
-    if (!subscriber.closed) {
-        if (index < keys.length) {
-            var key = keys[index];
-            subscriber.next([key, obj[key]]);
-            subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj }));
-        }
-        else {
-            subscriber.complete();
-        }
-    }
-}
-//# sourceMappingURL=pairs.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/pairs.js.map b/node_modules/rxjs/_esm5/internal/observable/pairs.js.map
deleted file mode 100644
index d2f93bd..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/pairs.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pairs.js","sources":["../../../src/internal/observable/pairs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAkD/C,MAAM,UAAU,KAAK,CAAI,GAAW,EAAE,SAAyB;IAC7D,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,UAAU,CAAc,UAAA,UAAU;YAC3C,IAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC1D,IAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;oBAC3B,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAClC;aACF;YACD,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;KACJ;SAAM;QACL,OAAO,IAAI,UAAU,CAAc,UAAA,UAAU;YAC3C,IAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;YACxC,YAAY,CAAC,GAAG,CACd,SAAS,CAAC,QAAQ,CACf,QAAQ,EAAE,CAAC,EAAE,EAAE,IAAI,MAAA,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,YAAA,EAAE,YAAY,cAAA,EAAE,GAAG,KAAA,EAAE,CAAC,CAAC,CAAC;YACtE,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC;KACJ;AACH,CAAC;AAGD,MAAM,UAAU,QAAQ,CACI,KAAsH;IACxI,IAAA,iBAAI,EAAE,mBAAK,EAAE,6BAAU,EAAE,iCAAY,EAAE,eAAG,CAAW;IAC7D,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QACtB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;YACvB,IAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,MAAA,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,UAAU,YAAA,EAAE,YAAY,cAAA,EAAE,GAAG,KAAA,EAAE,CAAC,CAAC,CAAC;SAC5F;aAAM;YACL,UAAU,CAAC,QAAQ,EAAE,CAAC;SACvB;KACF;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/partition.js b/node_modules/rxjs/_esm5/internal/observable/partition.js
deleted file mode 100644
index 7b46b04..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/partition.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/** PURE_IMPORTS_START _util_not,_util_subscribeTo,_operators_filter,_Observable PURE_IMPORTS_END */
-import { not } from '../util/not';
-import { subscribeTo } from '../util/subscribeTo';
-import { filter } from '../operators/filter';
-import { Observable } from '../Observable';
-export function partition(source, predicate, thisArg) {
-    return [
-        filter(predicate, thisArg)(new Observable(subscribeTo(source))),
-        filter(not(predicate, thisArg))(new Observable(subscribeTo(source)))
-    ];
-}
-//# sourceMappingURL=partition.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/partition.js.map b/node_modules/rxjs/_esm5/internal/observable/partition.js.map
deleted file mode 100644
index 6c8ed22..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/partition.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"partition.js","sources":["../../../src/internal/observable/partition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAqD3C,MAAM,UAAU,SAAS,CACvB,MAA0B,EAC1B,SAA+C,EAC/C,OAAa;IAEb,OAAO;QACL,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,UAAU,CAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAQ,CAAC,CAAC,IAAI,UAAU,CAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;KAC7C,CAAC;AACtC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/race.js b/node_modules/rxjs/_esm5/internal/observable/race.js
deleted file mode 100644
index 88a47a4..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/race.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/** PURE_IMPORTS_START tslib,_util_isArray,_fromArray,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { isArray } from '../util/isArray';
-import { fromArray } from './fromArray';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function race() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    if (observables.length === 1) {
-        if (isArray(observables[0])) {
-            observables = observables[0];
-        }
-        else {
-            return observables[0];
-        }
-    }
-    return fromArray(observables, undefined).lift(new RaceOperator());
-}
-var RaceOperator = /*@__PURE__*/ (function () {
-    function RaceOperator() {
-    }
-    RaceOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RaceSubscriber(subscriber));
-    };
-    return RaceOperator;
-}());
-export { RaceOperator };
-var RaceSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(RaceSubscriber, _super);
-    function RaceSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasFirst = false;
-        _this.observables = [];
-        _this.subscriptions = [];
-        return _this;
-    }
-    RaceSubscriber.prototype._next = function (observable) {
-        this.observables.push(observable);
-    };
-    RaceSubscriber.prototype._complete = function () {
-        var observables = this.observables;
-        var len = observables.length;
-        if (len === 0) {
-            this.destination.complete();
-        }
-        else {
-            for (var i = 0; i < len && !this.hasFirst; i++) {
-                var observable = observables[i];
-                var subscription = subscribeToResult(this, observable, observable, i);
-                if (this.subscriptions) {
-                    this.subscriptions.push(subscription);
-                }
-                this.add(subscription);
-            }
-            this.observables = null;
-        }
-    };
-    RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (!this.hasFirst) {
-            this.hasFirst = true;
-            for (var i = 0; i < this.subscriptions.length; i++) {
-                if (i !== outerIndex) {
-                    var subscription = this.subscriptions[i];
-                    subscription.unsubscribe();
-                    this.remove(subscription);
-                }
-            }
-            this.subscriptions = null;
-        }
-        this.destination.next(innerValue);
-    };
-    return RaceSubscriber;
-}(OuterSubscriber));
-export { RaceSubscriber };
-//# sourceMappingURL=race.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/race.js.map b/node_modules/rxjs/_esm5/internal/observable/race.js.map
deleted file mode 100644
index 75ad4d5..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/race.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"race.js","sources":["../../../src/internal/observable/race.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAKxC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAoD9D,MAAM,UAAU,IAAI;IAAI,qBAAsC;SAAtC,UAAsC,EAAtC,qBAAsC,EAAtC,IAAsC;QAAtC,gCAAsC;;IAG5D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;QAC5B,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;YAC3B,WAAW,GAAG,WAAW,CAAC,CAAC,CAAsB,CAAC;SACnD;aAAM;YACL,OAAO,WAAW,CAAC,CAAC,CAAkB,CAAC;SACxC;KACF;IAED,OAAO,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,YAAY,EAAK,CAAC,CAAC;AACvE,CAAC;AAED;IAAA;IAIA,CAAC;IAHC,2BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1D,CAAC;IACH,mBAAC;AAAD,CAAC,AAJD,IAIC;;AAOD;IAAuC,0CAAqB;IAK1D,wBAAY,WAA0B;QAAtC,YACE,kBAAM,WAAW,CAAC,SACnB;QANO,cAAQ,GAAY,KAAK,CAAC;QAC1B,iBAAW,GAAsB,EAAE,CAAC;QACpC,mBAAa,GAAmB,EAAE,CAAC;;IAI3C,CAAC;IAES,8BAAK,GAAf,UAAgB,UAAe;QAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAES,kCAAS,GAAnB;QACE,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC;QAE/B,IAAI,GAAG,KAAK,CAAC,EAAE;YACb,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;aAAM;YACL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;gBAC9C,IAAI,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,YAAY,GAAG,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAiB,EAAE,CAAC,CAAC,CAAC;gBAE7E,IAAI,IAAI,CAAC,aAAa,EAAE;oBACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBACvC;gBACD,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aACxB;YACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;SACzB;IACH,CAAC;IAED,mCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAClD,IAAI,CAAC,KAAK,UAAU,EAAE;oBACpB,IAAI,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;oBAEzC,YAAY,CAAC,WAAW,EAAE,CAAC;oBAC3B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;iBAC3B;aACF;YAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;SAC3B;QAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IACH,qBAAC;AAAD,CAAC,AArDD,CAAuC,eAAe,GAqDrD"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/range.js b/node_modules/rxjs/_esm5/internal/observable/range.js
deleted file mode 100644
index 3e0184c..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/range.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-export function range(start, count, scheduler) {
-    if (start === void 0) {
-        start = 0;
-    }
-    return new Observable(function (subscriber) {
-        if (count === undefined) {
-            count = start;
-            start = 0;
-        }
-        var index = 0;
-        var current = start;
-        if (scheduler) {
-            return scheduler.schedule(dispatch, 0, {
-                index: index, count: count, start: start, subscriber: subscriber
-            });
-        }
-        else {
-            do {
-                if (index++ >= count) {
-                    subscriber.complete();
-                    break;
-                }
-                subscriber.next(current++);
-                if (subscriber.closed) {
-                    break;
-                }
-            } while (true);
-        }
-        return undefined;
-    });
-}
-export function dispatch(state) {
-    var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber;
-    if (index >= count) {
-        subscriber.complete();
-        return;
-    }
-    subscriber.next(start);
-    if (subscriber.closed) {
-        return;
-    }
-    state.index = index + 1;
-    state.start = start + 1;
-    this.schedule(state);
-}
-//# sourceMappingURL=range.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/range.js.map b/node_modules/rxjs/_esm5/internal/observable/range.js.map
deleted file mode 100644
index d36149e..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/range.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"range.js","sources":["../../../src/internal/observable/range.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAoC3C,MAAM,UAAU,KAAK,CAAC,KAAiB,EACjB,KAAc,EACd,SAAyB;IAFzB,sBAAA,EAAA,SAAiB;IAGrC,OAAO,IAAI,UAAU,CAAS,UAAA,UAAU;QACtC,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,KAAK,GAAG,KAAK,CAAC;YACd,KAAK,GAAG,CAAC,CAAC;SACX;QAED,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,SAAS,EAAE;YACb,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE;gBACrC,KAAK,OAAA,EAAE,KAAK,OAAA,EAAE,KAAK,OAAA,EAAE,UAAU,YAAA;aAChC,CAAC,CAAC;SACJ;aAAM;YACL,GAAG;gBACD,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE;oBACpB,UAAU,CAAC,QAAQ,EAAE,CAAC;oBACtB,MAAM;iBACP;gBACD,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3B,IAAI,UAAU,CAAC,MAAM,EAAE;oBACrB,MAAM;iBACP;aACF,QAAQ,IAAI,EAAE;SAChB;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAGD,MAAM,UAAU,QAAQ,CAA6B,KAAU;IACrD,IAAA,mBAAK,EAAE,mBAAK,EAAE,mBAAK,EAAE,6BAAU,CAAW;IAElD,IAAI,KAAK,IAAI,KAAK,EAAE;QAClB,UAAU,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO;KACR;IAED,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEvB,IAAI,UAAU,CAAC,MAAM,EAAE;QACrB,OAAO;KACR;IAED,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IACxB,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IAExB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/throwError.js b/node_modules/rxjs/_esm5/internal/observable/throwError.js
deleted file mode 100644
index aa4196a..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/throwError.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-export function throwError(error, scheduler) {
-    if (!scheduler) {
-        return new Observable(function (subscriber) { return subscriber.error(error); });
-    }
-    else {
-        return new Observable(function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); });
-    }
-}
-function dispatch(_a) {
-    var error = _a.error, subscriber = _a.subscriber;
-    subscriber.error(error);
-}
-//# sourceMappingURL=throwError.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/throwError.js.map b/node_modules/rxjs/_esm5/internal/observable/throwError.js.map
deleted file mode 100644
index ec48b6f..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/throwError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throwError.js","sources":["../../../src/internal/observable/throwError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAoE3C,MAAM,UAAU,UAAU,CAAC,KAAU,EAAE,SAAyB;IAC9D,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,UAAU,CAAC,UAAA,UAAU,IAAI,OAAA,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAvB,CAAuB,CAAC,CAAC;KAC9D;SAAM;QACL,OAAO,IAAI,UAAU,CAAC,UAAA,UAAU,IAAI,OAAA,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,KAAK,OAAA,EAAE,UAAU,YAAA,EAAE,CAAC,EAAtD,CAAsD,CAAC,CAAC;KAC7F;AACH,CAAC;AAOD,SAAS,QAAQ,CAAC,EAAkC;QAAhC,gBAAK,EAAE,0BAAU;IACnC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/timer.js b/node_modules/rxjs/_esm5/internal/observable/timer.js
deleted file mode 100644
index 73b8540..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/timer.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { async } from '../scheduler/async';
-import { isNumeric } from '../util/isNumeric';
-import { isScheduler } from '../util/isScheduler';
-export function timer(dueTime, periodOrScheduler, scheduler) {
-    if (dueTime === void 0) {
-        dueTime = 0;
-    }
-    var period = -1;
-    if (isNumeric(periodOrScheduler)) {
-        period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);
-    }
-    else if (isScheduler(periodOrScheduler)) {
-        scheduler = periodOrScheduler;
-    }
-    if (!isScheduler(scheduler)) {
-        scheduler = async;
-    }
-    return new Observable(function (subscriber) {
-        var due = isNumeric(dueTime)
-            ? dueTime
-            : (+dueTime - scheduler.now());
-        return scheduler.schedule(dispatch, due, {
-            index: 0, period: period, subscriber: subscriber
-        });
-    });
-}
-function dispatch(state) {
-    var index = state.index, period = state.period, subscriber = state.subscriber;
-    subscriber.next(index);
-    if (subscriber.closed) {
-        return;
-    }
-    else if (period === -1) {
-        return subscriber.complete();
-    }
-    state.index = index + 1;
-    this.schedule(state, period);
-}
-//# sourceMappingURL=timer.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/timer.js.map b/node_modules/rxjs/_esm5/internal/observable/timer.js.map
deleted file mode 100644
index ef5924f..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/timer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timer.js","sources":["../../../src/internal/observable/timer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAqDlD,MAAM,UAAU,KAAK,CAAC,OAA0B,EAC1B,iBAA0C,EAC1C,SAAyB;IAFzB,wBAAA,EAAA,WAA0B;IAG9C,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;IAChB,IAAI,SAAS,CAAC,iBAAiB,CAAC,EAAE;QAChC,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC;KAC1E;SAAM,IAAI,WAAW,CAAC,iBAAiB,CAAC,EAAE;QACzC,SAAS,GAAG,iBAAwB,CAAC;KACtC;IAED,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;QAC3B,SAAS,GAAG,KAAK,CAAC;KACnB;IAED,OAAO,IAAI,UAAU,CAAC,UAAA,UAAU;QAC9B,IAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC;YAC5B,CAAC,CAAE,OAAkB;YACrB,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QAEjC,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;YACvC,KAAK,EAAE,CAAC,EAAE,MAAM,QAAA,EAAE,UAAU,YAAA;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAQD,SAAS,QAAQ,CAAoC,KAAiB;IAC5D,IAAA,mBAAK,EAAE,qBAAM,EAAE,6BAAU,CAAW;IAC5C,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEvB,IAAI,UAAU,CAAC,MAAM,EAAE;QACrB,OAAO;KACR;SAAM,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE;QACxB,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC;KAC9B;IAED,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/using.js b/node_modules/rxjs/_esm5/internal/observable/using.js
deleted file mode 100644
index d65743c..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/using.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { from } from './from';
-import { EMPTY } from './empty';
-export function using(resourceFactory, observableFactory) {
-    return new Observable(function (subscriber) {
-        var resource;
-        try {
-            resource = resourceFactory();
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        var result;
-        try {
-            result = observableFactory(resource);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        var source = result ? from(result) : EMPTY;
-        var subscription = source.subscribe(subscriber);
-        return function () {
-            subscription.unsubscribe();
-            if (resource) {
-                resource.unsubscribe();
-            }
-        };
-    });
-}
-//# sourceMappingURL=using.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/using.js.map b/node_modules/rxjs/_esm5/internal/observable/using.js.map
deleted file mode 100644
index e227847..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/using.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"using.js","sources":["../../../src/internal/observable/using.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AA8BhC,MAAM,UAAU,KAAK,CAAI,eAA4C,EAC5C,iBAAiF;IACxG,OAAO,IAAI,UAAU,CAAI,UAAA,UAAU;QACjC,IAAI,QAA+B,CAAC;QAEpC,IAAI;YACF,QAAQ,GAAG,eAAe,EAAE,CAAC;SAC9B;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,MAAiC,CAAC;QACtC,IAAI;YACF,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;SACtC;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QAED,IAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7C,IAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAClD,OAAO;YACL,YAAY,CAAC,WAAW,EAAE,CAAC;YAC3B,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,WAAW,EAAE,CAAC;aACxB;QACH,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/observable/zip.js b/node_modules/rxjs/_esm5/internal/observable/zip.js
deleted file mode 100644
index e15b320..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/zip.js
+++ /dev/null
@@ -1,218 +0,0 @@
-/** PURE_IMPORTS_START tslib,_fromArray,_util_isArray,_Subscriber,_OuterSubscriber,_util_subscribeToResult,_.._internal_symbol_iterator PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { fromArray } from './fromArray';
-import { isArray } from '../util/isArray';
-import { Subscriber } from '../Subscriber';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { iterator as Symbol_iterator } from '../../internal/symbol/iterator';
-export function zip() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var resultSelector = observables[observables.length - 1];
-    if (typeof resultSelector === 'function') {
-        observables.pop();
-    }
-    return fromArray(observables, undefined).lift(new ZipOperator(resultSelector));
-}
-var ZipOperator = /*@__PURE__*/ (function () {
-    function ZipOperator(resultSelector) {
-        this.resultSelector = resultSelector;
-    }
-    ZipOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));
-    };
-    return ZipOperator;
-}());
-export { ZipOperator };
-var ZipSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ZipSubscriber, _super);
-    function ZipSubscriber(destination, resultSelector, values) {
-        if (values === void 0) {
-            values = Object.create(null);
-        }
-        var _this = _super.call(this, destination) || this;
-        _this.iterators = [];
-        _this.active = 0;
-        _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null;
-        _this.values = values;
-        return _this;
-    }
-    ZipSubscriber.prototype._next = function (value) {
-        var iterators = this.iterators;
-        if (isArray(value)) {
-            iterators.push(new StaticArrayIterator(value));
-        }
-        else if (typeof value[Symbol_iterator] === 'function') {
-            iterators.push(new StaticIterator(value[Symbol_iterator]()));
-        }
-        else {
-            iterators.push(new ZipBufferIterator(this.destination, this, value));
-        }
-    };
-    ZipSubscriber.prototype._complete = function () {
-        var iterators = this.iterators;
-        var len = iterators.length;
-        this.unsubscribe();
-        if (len === 0) {
-            this.destination.complete();
-            return;
-        }
-        this.active = len;
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (iterator.stillUnsubscribed) {
-                var destination = this.destination;
-                destination.add(iterator.subscribe(iterator, i));
-            }
-            else {
-                this.active--;
-            }
-        }
-    };
-    ZipSubscriber.prototype.notifyInactive = function () {
-        this.active--;
-        if (this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    ZipSubscriber.prototype.checkIterators = function () {
-        var iterators = this.iterators;
-        var len = iterators.length;
-        var destination = this.destination;
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {
-                return;
-            }
-        }
-        var shouldComplete = false;
-        var args = [];
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            var result = iterator.next();
-            if (iterator.hasCompleted()) {
-                shouldComplete = true;
-            }
-            if (result.done) {
-                destination.complete();
-                return;
-            }
-            args.push(result.value);
-        }
-        if (this.resultSelector) {
-            this._tryresultSelector(args);
-        }
-        else {
-            destination.next(args);
-        }
-        if (shouldComplete) {
-            destination.complete();
-        }
-    };
-    ZipSubscriber.prototype._tryresultSelector = function (args) {
-        var result;
-        try {
-            result = this.resultSelector.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return ZipSubscriber;
-}(Subscriber));
-export { ZipSubscriber };
-var StaticIterator = /*@__PURE__*/ (function () {
-    function StaticIterator(iterator) {
-        this.iterator = iterator;
-        this.nextResult = iterator.next();
-    }
-    StaticIterator.prototype.hasValue = function () {
-        return true;
-    };
-    StaticIterator.prototype.next = function () {
-        var result = this.nextResult;
-        this.nextResult = this.iterator.next();
-        return result;
-    };
-    StaticIterator.prototype.hasCompleted = function () {
-        var nextResult = this.nextResult;
-        return nextResult && nextResult.done;
-    };
-    return StaticIterator;
-}());
-var StaticArrayIterator = /*@__PURE__*/ (function () {
-    function StaticArrayIterator(array) {
-        this.array = array;
-        this.index = 0;
-        this.length = 0;
-        this.length = array.length;
-    }
-    StaticArrayIterator.prototype[Symbol_iterator] = function () {
-        return this;
-    };
-    StaticArrayIterator.prototype.next = function (value) {
-        var i = this.index++;
-        var array = this.array;
-        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
-    };
-    StaticArrayIterator.prototype.hasValue = function () {
-        return this.array.length > this.index;
-    };
-    StaticArrayIterator.prototype.hasCompleted = function () {
-        return this.array.length === this.index;
-    };
-    return StaticArrayIterator;
-}());
-var ZipBufferIterator = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ZipBufferIterator, _super);
-    function ZipBufferIterator(destination, parent, observable) {
-        var _this = _super.call(this, destination) || this;
-        _this.parent = parent;
-        _this.observable = observable;
-        _this.stillUnsubscribed = true;
-        _this.buffer = [];
-        _this.isComplete = false;
-        return _this;
-    }
-    ZipBufferIterator.prototype[Symbol_iterator] = function () {
-        return this;
-    };
-    ZipBufferIterator.prototype.next = function () {
-        var buffer = this.buffer;
-        if (buffer.length === 0 && this.isComplete) {
-            return { value: null, done: true };
-        }
-        else {
-            return { value: buffer.shift(), done: false };
-        }
-    };
-    ZipBufferIterator.prototype.hasValue = function () {
-        return this.buffer.length > 0;
-    };
-    ZipBufferIterator.prototype.hasCompleted = function () {
-        return this.buffer.length === 0 && this.isComplete;
-    };
-    ZipBufferIterator.prototype.notifyComplete = function () {
-        if (this.buffer.length > 0) {
-            this.isComplete = true;
-            this.parent.notifyInactive();
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.buffer.push(innerValue);
-        this.parent.checkIterators();
-    };
-    ZipBufferIterator.prototype.subscribe = function (value, index) {
-        return subscribeToResult(this, this.observable, this, index);
-    };
-    return ZipBufferIterator;
-}(OuterSubscriber));
-//# sourceMappingURL=zip.js.map
diff --git a/node_modules/rxjs/_esm5/internal/observable/zip.js.map b/node_modules/rxjs/_esm5/internal/observable/zip.js.map
deleted file mode 100644
index a0eca11..0000000
--- a/node_modules/rxjs/_esm5/internal/observable/zip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zip.js","sources":["../../../src/internal/observable/zip.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/audit.js b/node_modules/rxjs/_esm5/internal/operators/audit.js
deleted file mode 100644
index 4c8fc94..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/audit.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function audit(durationSelector) {
-    return function auditOperatorFunction(source) {
-        return source.lift(new AuditOperator(durationSelector));
-    };
-}
-var AuditOperator = /*@__PURE__*/ (function () {
-    function AuditOperator(durationSelector) {
-        this.durationSelector = durationSelector;
-    }
-    AuditOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector));
-    };
-    return AuditOperator;
-}());
-var AuditSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(AuditSubscriber, _super);
-    function AuditSubscriber(destination, durationSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.durationSelector = durationSelector;
-        _this.hasValue = false;
-        return _this;
-    }
-    AuditSubscriber.prototype._next = function (value) {
-        this.value = value;
-        this.hasValue = true;
-        if (!this.throttled) {
-            var duration = void 0;
-            try {
-                var durationSelector = this.durationSelector;
-                duration = durationSelector(value);
-            }
-            catch (err) {
-                return this.destination.error(err);
-            }
-            var innerSubscription = subscribeToResult(this, duration);
-            if (!innerSubscription || innerSubscription.closed) {
-                this.clearThrottle();
-            }
-            else {
-                this.add(this.throttled = innerSubscription);
-            }
-        }
-    };
-    AuditSubscriber.prototype.clearThrottle = function () {
-        var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled;
-        if (throttled) {
-            this.remove(throttled);
-            this.throttled = null;
-            throttled.unsubscribe();
-        }
-        if (hasValue) {
-            this.value = null;
-            this.hasValue = false;
-            this.destination.next(value);
-        }
-    };
-    AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {
-        this.clearThrottle();
-    };
-    AuditSubscriber.prototype.notifyComplete = function () {
-        this.clearThrottle();
-    };
-    return AuditSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=audit.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/audit.js.map b/node_modules/rxjs/_esm5/internal/operators/audit.js.map
deleted file mode 100644
index 4ad5797..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/audit.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"audit.js","sources":["../../../src/internal/operators/audit.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAgD9D,MAAM,UAAU,KAAK,CAAI,gBAA0D;IACjF,OAAO,SAAS,qBAAqB,CAAC,MAAqB;QACzD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC;AAED;IACE,uBAAoB,gBAA0D;QAA1D,qBAAgB,GAAhB,gBAAgB,CAA0C;IAC9E,CAAC;IAED,4BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAO,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACxF,CAAC;IACH,oBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAoC,2CAAqB;IAMvD,yBAAY,WAA0B,EAClB,gBAA0D;QAD9E,YAEE,kBAAM,WAAW,CAAC,SACnB;QAFmB,sBAAgB,GAAhB,gBAAgB,CAA0C;QAJtE,cAAQ,GAAY,KAAK,CAAC;;IAMlC,CAAC;IAES,+BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,QAAQ,SAAA,CAAC;YACb,IAAI;gBACM,IAAA,wCAAgB,CAAU;gBAClC,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;aACpC;YAAC,OAAO,GAAG,EAAE;gBACZ,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACpC;YACD,IAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC5D,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,EAAE;gBAClD,IAAI,CAAC,aAAa,EAAE,CAAC;aACtB;iBAAM;gBACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,CAAC;aAC9C;SACF;IACH,CAAC;IAED,uCAAa,GAAb;QACQ,IAAA,SAAqC,EAAnC,gBAAK,EAAE,sBAAQ,EAAE,wBAAS,CAAU;QAC5C,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,SAAS,CAAC,WAAW,EAAE,CAAC;SACzB;QACD,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IAED,oCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAAE,UAAkB,EAAE,UAAkB;QAC7E,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,wCAAc,GAAd;QACE,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IACH,sBAAC;AAAD,CAAC,AApDD,CAAoC,eAAe,GAoDlD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/auditTime.js b/node_modules/rxjs/_esm5/internal/operators/auditTime.js
deleted file mode 100644
index e862206..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/auditTime.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */
-import { async } from '../scheduler/async';
-import { audit } from './audit';
-import { timer } from '../observable/timer';
-export function auditTime(duration, scheduler) {
-    if (scheduler === void 0) {
-        scheduler = async;
-    }
-    return audit(function () { return timer(duration, scheduler); });
-}
-//# sourceMappingURL=auditTime.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/auditTime.js.map b/node_modules/rxjs/_esm5/internal/operators/auditTime.js.map
deleted file mode 100644
index 318084a..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/auditTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"auditTime.js","sources":["../../../src/internal/operators/auditTime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAoD5C,MAAM,UAAU,SAAS,CAAI,QAAgB,EAAE,SAAgC;IAAhC,0BAAA,EAAA,iBAAgC;IAC7E,OAAO,KAAK,CAAC,cAAM,OAAA,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,EAA1B,CAA0B,CAAC,CAAC;AACjD,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/buffer.js b/node_modules/rxjs/_esm5/internal/operators/buffer.js
deleted file mode 100644
index 6ab63ae..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/buffer.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function buffer(closingNotifier) {
-    return function bufferOperatorFunction(source) {
-        return source.lift(new BufferOperator(closingNotifier));
-    };
-}
-var BufferOperator = /*@__PURE__*/ (function () {
-    function BufferOperator(closingNotifier) {
-        this.closingNotifier = closingNotifier;
-    }
-    BufferOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
-    };
-    return BufferOperator;
-}());
-var BufferSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(BufferSubscriber, _super);
-    function BufferSubscriber(destination, closingNotifier) {
-        var _this = _super.call(this, destination) || this;
-        _this.buffer = [];
-        _this.add(subscribeToResult(_this, closingNotifier));
-        return _this;
-    }
-    BufferSubscriber.prototype._next = function (value) {
-        this.buffer.push(value);
-    };
-    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var buffer = this.buffer;
-        this.buffer = [];
-        this.destination.next(buffer);
-    };
-    return BufferSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=buffer.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/buffer.js.map b/node_modules/rxjs/_esm5/internal/operators/buffer.js.map
deleted file mode 100644
index b43c12b..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/buffer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"buffer.js","sources":["../../../src/internal/operators/buffer.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA2C9D,MAAM,UAAU,MAAM,CAAI,eAAgC;IACxD,OAAO,SAAS,sBAAsB,CAAC,MAAqB;QAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAI,eAAe,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAED;IAEE,wBAAoB,eAAgC;QAAhC,oBAAe,GAAf,eAAe,CAAiB;IACpD,CAAC;IAED,6BAAI,GAAJ,UAAK,UAA2B,EAAE,MAAW;QAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAClF,CAAC;IACH,qBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAkC,4CAAuB;IAGvD,0BAAY,WAA4B,EAAE,eAAgC;QAA1E,YACE,kBAAM,WAAW,CAAC,SAEnB;QALO,YAAM,GAAQ,EAAE,CAAC;QAIvB,KAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAI,EAAE,eAAe,CAAC,CAAC,CAAC;;IACrD,CAAC;IAES,gCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,qCAAU,GAAV,UAAW,UAAa,EAAE,UAAe,EAC9B,UAAkB,EAAE,UAAkB,EACtC,QAAiC;QAC1C,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACH,uBAAC;AAAD,CAAC,AAnBD,CAAkC,eAAe,GAmBhD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/bufferCount.js b/node_modules/rxjs/_esm5/internal/operators/bufferCount.js
deleted file mode 100644
index b882b6e..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/bufferCount.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function bufferCount(bufferSize, startBufferEvery) {
-    if (startBufferEvery === void 0) {
-        startBufferEvery = null;
-    }
-    return function bufferCountOperatorFunction(source) {
-        return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));
-    };
-}
-var BufferCountOperator = /*@__PURE__*/ (function () {
-    function BufferCountOperator(bufferSize, startBufferEvery) {
-        this.bufferSize = bufferSize;
-        this.startBufferEvery = startBufferEvery;
-        if (!startBufferEvery || bufferSize === startBufferEvery) {
-            this.subscriberClass = BufferCountSubscriber;
-        }
-        else {
-            this.subscriberClass = BufferSkipCountSubscriber;
-        }
-    }
-    BufferCountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
-    };
-    return BufferCountOperator;
-}());
-var BufferCountSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(BufferCountSubscriber, _super);
-    function BufferCountSubscriber(destination, bufferSize) {
-        var _this = _super.call(this, destination) || this;
-        _this.bufferSize = bufferSize;
-        _this.buffer = [];
-        return _this;
-    }
-    BufferCountSubscriber.prototype._next = function (value) {
-        var buffer = this.buffer;
-        buffer.push(value);
-        if (buffer.length == this.bufferSize) {
-            this.destination.next(buffer);
-            this.buffer = [];
-        }
-    };
-    BufferCountSubscriber.prototype._complete = function () {
-        var buffer = this.buffer;
-        if (buffer.length > 0) {
-            this.destination.next(buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferCountSubscriber;
-}(Subscriber));
-var BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(BufferSkipCountSubscriber, _super);
-    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {
-        var _this = _super.call(this, destination) || this;
-        _this.bufferSize = bufferSize;
-        _this.startBufferEvery = startBufferEvery;
-        _this.buffers = [];
-        _this.count = 0;
-        return _this;
-    }
-    BufferSkipCountSubscriber.prototype._next = function (value) {
-        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;
-        this.count++;
-        if (count % startBufferEvery === 0) {
-            buffers.push([]);
-        }
-        for (var i = buffers.length; i--;) {
-            var buffer = buffers[i];
-            buffer.push(value);
-            if (buffer.length === bufferSize) {
-                buffers.splice(i, 1);
-                this.destination.next(buffer);
-            }
-        }
-    };
-    BufferSkipCountSubscriber.prototype._complete = function () {
-        var _a = this, buffers = _a.buffers, destination = _a.destination;
-        while (buffers.length > 0) {
-            var buffer = buffers.shift();
-            if (buffer.length > 0) {
-                destination.next(buffer);
-            }
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferSkipCountSubscriber;
-}(Subscriber));
-//# sourceMappingURL=bufferCount.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/bufferCount.js.map b/node_modules/rxjs/_esm5/internal/operators/bufferCount.js.map
deleted file mode 100644
index 0beead0..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/bufferCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferCount.js","sources":["../../../src/internal/operators/bufferCount.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/bufferTime.js b/node_modules/rxjs/_esm5/internal/operators/bufferTime.js
deleted file mode 100644
index 723d954..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/bufferTime.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/** PURE_IMPORTS_START tslib,_scheduler_async,_Subscriber,_util_isScheduler PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { async } from '../scheduler/async';
-import { Subscriber } from '../Subscriber';
-import { isScheduler } from '../util/isScheduler';
-export function bufferTime(bufferTimeSpan) {
-    var length = arguments.length;
-    var scheduler = async;
-    if (isScheduler(arguments[arguments.length - 1])) {
-        scheduler = arguments[arguments.length - 1];
-        length--;
-    }
-    var bufferCreationInterval = null;
-    if (length >= 2) {
-        bufferCreationInterval = arguments[1];
-    }
-    var maxBufferSize = Number.POSITIVE_INFINITY;
-    if (length >= 3) {
-        maxBufferSize = arguments[2];
-    }
-    return function bufferTimeOperatorFunction(source) {
-        return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));
-    };
-}
-var BufferTimeOperator = /*@__PURE__*/ (function () {
-    function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
-        this.bufferTimeSpan = bufferTimeSpan;
-        this.bufferCreationInterval = bufferCreationInterval;
-        this.maxBufferSize = maxBufferSize;
-        this.scheduler = scheduler;
-    }
-    BufferTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler));
-    };
-    return BufferTimeOperator;
-}());
-var Context = /*@__PURE__*/ (function () {
-    function Context() {
-        this.buffer = [];
-    }
-    return Context;
-}());
-var BufferTimeSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(BufferTimeSubscriber, _super);
-    function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.bufferTimeSpan = bufferTimeSpan;
-        _this.bufferCreationInterval = bufferCreationInterval;
-        _this.maxBufferSize = maxBufferSize;
-        _this.scheduler = scheduler;
-        _this.contexts = [];
-        var context = _this.openContext();
-        _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;
-        if (_this.timespanOnly) {
-            var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan };
-            _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-        }
-        else {
-            var closeState = { subscriber: _this, context: context };
-            var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler };
-            _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState));
-            _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState));
-        }
-        return _this;
-    }
-    BufferTimeSubscriber.prototype._next = function (value) {
-        var contexts = this.contexts;
-        var len = contexts.length;
-        var filledBufferContext;
-        for (var i = 0; i < len; i++) {
-            var context_1 = contexts[i];
-            var buffer = context_1.buffer;
-            buffer.push(value);
-            if (buffer.length == this.maxBufferSize) {
-                filledBufferContext = context_1;
-            }
-        }
-        if (filledBufferContext) {
-            this.onBufferFull(filledBufferContext);
-        }
-    };
-    BufferTimeSubscriber.prototype._error = function (err) {
-        this.contexts.length = 0;
-        _super.prototype._error.call(this, err);
-    };
-    BufferTimeSubscriber.prototype._complete = function () {
-        var _a = this, contexts = _a.contexts, destination = _a.destination;
-        while (contexts.length > 0) {
-            var context_2 = contexts.shift();
-            destination.next(context_2.buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    BufferTimeSubscriber.prototype._unsubscribe = function () {
-        this.contexts = null;
-    };
-    BufferTimeSubscriber.prototype.onBufferFull = function (context) {
-        this.closeContext(context);
-        var closeAction = context.closeAction;
-        closeAction.unsubscribe();
-        this.remove(closeAction);
-        if (!this.closed && this.timespanOnly) {
-            context = this.openContext();
-            var bufferTimeSpan = this.bufferTimeSpan;
-            var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan };
-            this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-        }
-    };
-    BufferTimeSubscriber.prototype.openContext = function () {
-        var context = new Context();
-        this.contexts.push(context);
-        return context;
-    };
-    BufferTimeSubscriber.prototype.closeContext = function (context) {
-        this.destination.next(context.buffer);
-        var contexts = this.contexts;
-        var spliceIndex = contexts ? contexts.indexOf(context) : -1;
-        if (spliceIndex >= 0) {
-            contexts.splice(contexts.indexOf(context), 1);
-        }
-    };
-    return BufferTimeSubscriber;
-}(Subscriber));
-function dispatchBufferTimeSpanOnly(state) {
-    var subscriber = state.subscriber;
-    var prevContext = state.context;
-    if (prevContext) {
-        subscriber.closeContext(prevContext);
-    }
-    if (!subscriber.closed) {
-        state.context = subscriber.openContext();
-        state.context.closeAction = this.schedule(state, state.bufferTimeSpan);
-    }
-}
-function dispatchBufferCreation(state) {
-    var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler;
-    var context = subscriber.openContext();
-    var action = this;
-    if (!subscriber.closed) {
-        subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context }));
-        action.schedule(state, bufferCreationInterval);
-    }
-}
-function dispatchBufferClose(arg) {
-    var subscriber = arg.subscriber, context = arg.context;
-    subscriber.closeContext(context);
-}
-//# sourceMappingURL=bufferTime.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/bufferTime.js.map b/node_modules/rxjs/_esm5/internal/operators/bufferTime.js.map
deleted file mode 100644
index 1591543..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/bufferTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferTime.js","sources":["../../../src/internal/operators/bufferTime.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/bufferToggle.js b/node_modules/rxjs/_esm5/internal/operators/bufferToggle.js
deleted file mode 100644
index 005988b..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/bufferToggle.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscription,_util_subscribeToResult,_OuterSubscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscription } from '../Subscription';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OuterSubscriber } from '../OuterSubscriber';
-export function bufferToggle(openings, closingSelector) {
-    return function bufferToggleOperatorFunction(source) {
-        return source.lift(new BufferToggleOperator(openings, closingSelector));
-    };
-}
-var BufferToggleOperator = /*@__PURE__*/ (function () {
-    function BufferToggleOperator(openings, closingSelector) {
-        this.openings = openings;
-        this.closingSelector = closingSelector;
-    }
-    BufferToggleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));
-    };
-    return BufferToggleOperator;
-}());
-var BufferToggleSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(BufferToggleSubscriber, _super);
-    function BufferToggleSubscriber(destination, openings, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.openings = openings;
-        _this.closingSelector = closingSelector;
-        _this.contexts = [];
-        _this.add(subscribeToResult(_this, openings));
-        return _this;
-    }
-    BufferToggleSubscriber.prototype._next = function (value) {
-        var contexts = this.contexts;
-        var len = contexts.length;
-        for (var i = 0; i < len; i++) {
-            contexts[i].buffer.push(value);
-        }
-    };
-    BufferToggleSubscriber.prototype._error = function (err) {
-        var contexts = this.contexts;
-        while (contexts.length > 0) {
-            var context_1 = contexts.shift();
-            context_1.subscription.unsubscribe();
-            context_1.buffer = null;
-            context_1.subscription = null;
-        }
-        this.contexts = null;
-        _super.prototype._error.call(this, err);
-    };
-    BufferToggleSubscriber.prototype._complete = function () {
-        var contexts = this.contexts;
-        while (contexts.length > 0) {
-            var context_2 = contexts.shift();
-            this.destination.next(context_2.buffer);
-            context_2.subscription.unsubscribe();
-            context_2.buffer = null;
-            context_2.subscription = null;
-        }
-        this.contexts = null;
-        _super.prototype._complete.call(this);
-    };
-    BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
-    };
-    BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.closeBuffer(innerSub.context);
-    };
-    BufferToggleSubscriber.prototype.openBuffer = function (value) {
-        try {
-            var closingSelector = this.closingSelector;
-            var closingNotifier = closingSelector.call(this, value);
-            if (closingNotifier) {
-                this.trySubscribe(closingNotifier);
-            }
-        }
-        catch (err) {
-            this._error(err);
-        }
-    };
-    BufferToggleSubscriber.prototype.closeBuffer = function (context) {
-        var contexts = this.contexts;
-        if (contexts && context) {
-            var buffer = context.buffer, subscription = context.subscription;
-            this.destination.next(buffer);
-            contexts.splice(contexts.indexOf(context), 1);
-            this.remove(subscription);
-            subscription.unsubscribe();
-        }
-    };
-    BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) {
-        var contexts = this.contexts;
-        var buffer = [];
-        var subscription = new Subscription();
-        var context = { buffer: buffer, subscription: subscription };
-        contexts.push(context);
-        var innerSubscription = subscribeToResult(this, closingNotifier, context);
-        if (!innerSubscription || innerSubscription.closed) {
-            this.closeBuffer(context);
-        }
-        else {
-            innerSubscription.context = context;
-            this.add(innerSubscription);
-            subscription.add(innerSubscription);
-        }
-    };
-    return BufferToggleSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=bufferToggle.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/bufferToggle.js.map b/node_modules/rxjs/_esm5/internal/operators/bufferToggle.js.map
deleted file mode 100644
index 1c59cf4..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/bufferToggle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferToggle.js","sources":["../../../src/internal/operators/bufferToggle.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAkDrD,MAAM,UAAU,YAAY,CAC1B,QAAkC,EAClC,eAAyD;IAEzD,OAAO,SAAS,4BAA4B,CAAC,MAAqB;QAChE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAO,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC;AACJ,CAAC;AAED;IAEE,8BAAoB,QAAkC,EAClC,eAAyD;QADzD,aAAQ,GAAR,QAAQ,CAA0B;QAClC,oBAAe,GAAf,eAAe,CAA0C;IAC7E,CAAC;IAED,mCAAI,GAAJ,UAAK,UAA2B,EAAE,MAAW;QAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACvG,CAAC;IACH,2BAAC;AAAD,CAAC,AATD,IASC;AAYD;IAA2C,kDAAqB;IAG9D,gCAAY,WAA4B,EACpB,QAAkC,EAClC,eAAgE;QAFpF,YAGE,kBAAM,WAAW,CAAC,SAEnB;QAJmB,cAAQ,GAAR,QAAQ,CAA0B;QAClC,qBAAe,GAAf,eAAe,CAAiD;QAJ5E,cAAQ,GAA4B,EAAE,CAAC;QAM7C,KAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;;IAC9C,CAAC;IAES,sCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YAC5B,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAChC;IACH,CAAC;IAES,uCAAM,GAAhB,UAAiB,GAAQ;QACvB,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,IAAM,SAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjC,SAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YACnC,SAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YACtB,SAAO,CAAC,YAAY,GAAG,IAAI,CAAC;SAC7B;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,iBAAM,MAAM,YAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAES,0CAAS,GAAnB;QACE,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,IAAM,SAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAO,CAAC,MAAM,CAAC,CAAC;YACtC,SAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YACnC,SAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YACtB,SAAO,CAAC,YAAY,GAAG,IAAI,CAAC;SAC7B;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,iBAAM,SAAS,WAAE,CAAC;IACpB,CAAC;IAED,2CAAU,GAAV,UAAW,UAAe,EAAE,UAAa,EAC9B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC1E,CAAC;IAED,+CAAc,GAAd,UAAe,QAA+B;QAC5C,IAAI,CAAC,WAAW,CAAQ,QAAS,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEO,2CAAU,GAAlB,UAAmB,KAAQ;QACzB,IAAI;YACF,IAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;YAC7C,IAAM,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1D,IAAI,eAAe,EAAE;gBACnB,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;aACpC;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAClB;IACH,CAAC;IAEO,4CAAW,GAAnB,UAAoB,OAAyB;QAC3C,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,IAAI,QAAQ,IAAI,OAAO,EAAE;YACf,IAAA,uBAAM,EAAE,mCAAY,CAAa;YACzC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9B,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC1B,YAAY,CAAC,WAAW,EAAE,CAAC;SAC5B;IACH,CAAC;IAEO,6CAAY,GAApB,UAAqB,eAAoB;QACvC,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,IAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACxC,IAAM,OAAO,GAAG,EAAE,MAAM,QAAA,EAAE,YAAY,cAAA,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEvB,IAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAO,OAAO,CAAC,CAAC;QAEjF,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,EAAE;YAClD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;SAC3B;aAAM;YACE,iBAAkB,CAAC,OAAO,GAAG,OAAO,CAAC;YAE5C,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC5B,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;SACrC;IACH,CAAC;IACH,6BAAC;AAAD,CAAC,AAhGD,CAA2C,eAAe,GAgGzD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/bufferWhen.js b/node_modules/rxjs/_esm5/internal/operators/bufferWhen.js
deleted file mode 100644
index 7a0872a..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/bufferWhen.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function bufferWhen(closingSelector) {
-    return function (source) {
-        return source.lift(new BufferWhenOperator(closingSelector));
-    };
-}
-var BufferWhenOperator = /*@__PURE__*/ (function () {
-    function BufferWhenOperator(closingSelector) {
-        this.closingSelector = closingSelector;
-    }
-    BufferWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));
-    };
-    return BufferWhenOperator;
-}());
-var BufferWhenSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(BufferWhenSubscriber, _super);
-    function BufferWhenSubscriber(destination, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.closingSelector = closingSelector;
-        _this.subscribing = false;
-        _this.openBuffer();
-        return _this;
-    }
-    BufferWhenSubscriber.prototype._next = function (value) {
-        this.buffer.push(value);
-    };
-    BufferWhenSubscriber.prototype._complete = function () {
-        var buffer = this.buffer;
-        if (buffer) {
-            this.destination.next(buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    BufferWhenSubscriber.prototype._unsubscribe = function () {
-        this.buffer = null;
-        this.subscribing = false;
-    };
-    BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openBuffer();
-    };
-    BufferWhenSubscriber.prototype.notifyComplete = function () {
-        if (this.subscribing) {
-            this.complete();
-        }
-        else {
-            this.openBuffer();
-        }
-    };
-    BufferWhenSubscriber.prototype.openBuffer = function () {
-        var closingSubscription = this.closingSubscription;
-        if (closingSubscription) {
-            this.remove(closingSubscription);
-            closingSubscription.unsubscribe();
-        }
-        var buffer = this.buffer;
-        if (this.buffer) {
-            this.destination.next(buffer);
-        }
-        this.buffer = [];
-        var closingNotifier;
-        try {
-            var closingSelector = this.closingSelector;
-            closingNotifier = closingSelector();
-        }
-        catch (err) {
-            return this.error(err);
-        }
-        closingSubscription = new Subscription();
-        this.closingSubscription = closingSubscription;
-        this.add(closingSubscription);
-        this.subscribing = true;
-        closingSubscription.add(subscribeToResult(this, closingNotifier));
-        this.subscribing = false;
-    };
-    return BufferWhenSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=bufferWhen.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/bufferWhen.js.map b/node_modules/rxjs/_esm5/internal/operators/bufferWhen.js.map
deleted file mode 100644
index 0e01d96..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/bufferWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferWhen.js","sources":["../../../src/internal/operators/bufferWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/catchError.js b/node_modules/rxjs/_esm5/internal/operators/catchError.js
deleted file mode 100644
index 7a1e402..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/catchError.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function catchError(selector) {
-    return function catchErrorOperatorFunction(source) {
-        var operator = new CatchOperator(selector);
-        var caught = source.lift(operator);
-        return (operator.caught = caught);
-    };
-}
-var CatchOperator = /*@__PURE__*/ (function () {
-    function CatchOperator(selector) {
-        this.selector = selector;
-    }
-    CatchOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));
-    };
-    return CatchOperator;
-}());
-var CatchSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(CatchSubscriber, _super);
-    function CatchSubscriber(destination, selector, caught) {
-        var _this = _super.call(this, destination) || this;
-        _this.selector = selector;
-        _this.caught = caught;
-        return _this;
-    }
-    CatchSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var result = void 0;
-            try {
-                result = this.selector(err, this.caught);
-            }
-            catch (err2) {
-                _super.prototype.error.call(this, err2);
-                return;
-            }
-            this._unsubscribeAndRecycle();
-            var innerSubscriber = new InnerSubscriber(this, undefined, undefined);
-            this.add(innerSubscriber);
-            var innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-            if (innerSubscription !== innerSubscriber) {
-                this.add(innerSubscription);
-            }
-        }
-    };
-    return CatchSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=catchError.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/catchError.js.map b/node_modules/rxjs/_esm5/internal/operators/catchError.js.map
deleted file mode 100644
index 7f03160..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/catchError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"catchError.js","sources":["../../../src/internal/operators/catchError.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAmF9D,MAAM,UAAU,UAAU,CACxB,QAAgD;IAEhD,OAAO,SAAS,0BAA0B,CAAC,MAAqB;QAC9D,IAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAuB,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC;AAED;IAGE,uBAAoB,QAAqE;QAArE,aAAQ,GAAR,QAAQ,CAA6D;IACzF,CAAC;IAED,4BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACvF,CAAC;IACH,oBAAC;AAAD,CAAC,AATD,IASC;AAOD;IAAoC,2CAAyB;IAC3D,yBAAY,WAA4B,EACpB,QAAqE,EACrE,MAAqB;QAFzC,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,cAAQ,GAAR,QAAQ,CAA6D;QACrE,YAAM,GAAN,MAAM,CAAe;;IAEzC,CAAC;IAOD,+BAAK,GAAL,UAAM,GAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,MAAM,SAAK,CAAC;YAChB,IAAI;gBACF,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;aAC1C;YAAC,OAAO,IAAI,EAAE;gBACb,iBAAM,KAAK,YAAC,IAAI,CAAC,CAAC;gBAClB,OAAO;aACR;YACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAM,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACxE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC1B,IAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;YAIjG,IAAI,iBAAiB,KAAK,eAAe,EAAE;gBACzC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;aAC7B;SACF;IACH,CAAC;IACH,sBAAC;AAAD,CAAC,AAjCD,CAAoC,eAAe,GAiClD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/combineAll.js b/node_modules/rxjs/_esm5/internal/operators/combineAll.js
deleted file mode 100644
index 2be83a4..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/combineAll.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _observable_combineLatest PURE_IMPORTS_END */
-import { CombineLatestOperator } from '../observable/combineLatest';
-export function combineAll(project) {
-    return function (source) { return source.lift(new CombineLatestOperator(project)); };
-}
-//# sourceMappingURL=combineAll.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/combineAll.js.map b/node_modules/rxjs/_esm5/internal/operators/combineAll.js.map
deleted file mode 100644
index 1105b52..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/combineAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineAll.js","sources":["../../../src/internal/operators/combineAll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAsDpE,MAAM,UAAU,UAAU,CAAO,OAAsC;IACrE,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC,EAA/C,CAA+C,CAAC;AACpF,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/combineLatest.js b/node_modules/rxjs/_esm5/internal/operators/combineLatest.js
deleted file mode 100644
index 9718499..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/combineLatest.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/** PURE_IMPORTS_START _util_isArray,_observable_combineLatest,_observable_from PURE_IMPORTS_END */
-import { isArray } from '../util/isArray';
-import { CombineLatestOperator } from '../observable/combineLatest';
-import { from } from '../observable/from';
-var none = {};
-export function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var project = null;
-    if (typeof observables[observables.length - 1] === 'function') {
-        project = observables.pop();
-    }
-    if (observables.length === 1 && isArray(observables[0])) {
-        observables = observables[0].slice();
-    }
-    return function (source) { return source.lift.call(from([source].concat(observables)), new CombineLatestOperator(project)); };
-}
-//# sourceMappingURL=combineLatest.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/combineLatest.js.map b/node_modules/rxjs/_esm5/internal/operators/combineLatest.js.map
deleted file mode 100644
index 911b122..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/combineLatest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineLatest.js","sources":["../../../src/internal/operators/combineLatest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAI1C,IAAM,IAAI,GAAG,EAAE,CAAC;AAoChB,MAAM,UAAU,aAAa;IAAO,qBAE+C;SAF/C,UAE+C,EAF/C,qBAE+C,EAF/C,IAE+C;QAF/C,gCAE+C;;IACjF,IAAI,OAAO,GAAiC,IAAI,CAAC;IACjD,IAAI,OAAO,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,UAAU,EAAE;QAC7D,OAAO,GAAiC,WAAW,CAAC,GAAG,EAAE,CAAC;KAC3D;IAID,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;QACvD,WAAW,GAAS,WAAW,CAAC,CAAC,CAAE,CAAC,KAAK,EAAE,CAAC;KAC7C;IAED,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,SAAK,WAAW,EAAE,EAAE,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC,EAApF,CAAoF,CAAC;AACzH,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/concat.js b/node_modules/rxjs/_esm5/internal/operators/concat.js
deleted file mode 100644
index 2827f39..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/concat.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/** PURE_IMPORTS_START _observable_concat PURE_IMPORTS_END */
-import { concat as concatStatic } from '../observable/concat';
-export function concat() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function (source) { return source.lift.call(concatStatic.apply(void 0, [source].concat(observables))); };
-}
-//# sourceMappingURL=concat.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/concat.js.map b/node_modules/rxjs/_esm5/internal/operators/concat.js.map
deleted file mode 100644
index 3294279..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/concat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concat.js","sources":["../../../src/internal/operators/concat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAG,MAAM,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAC;AA0B/D,MAAM,UAAU,MAAM;IAAO,qBAA2D;SAA3D,UAA2D,EAA3D,qBAA2D,EAA3D,IAA2D;QAA3D,gCAA2D;;IACtF,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,gBAAC,MAAM,SAAK,WAAW,GAAE,EAAtD,CAAsD,CAAC;AAC3F,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/concatAll.js b/node_modules/rxjs/_esm5/internal/operators/concatAll.js
deleted file mode 100644
index bc3a803..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/concatAll.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _mergeAll PURE_IMPORTS_END */
-import { mergeAll } from './mergeAll';
-export function concatAll() {
-    return mergeAll(1);
-}
-//# sourceMappingURL=concatAll.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/concatAll.js.map b/node_modules/rxjs/_esm5/internal/operators/concatAll.js.map
deleted file mode 100644
index 9c92ccc..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/concatAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatAll.js","sources":["../../../src/internal/operators/concatAll.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAgEtC,MAAM,UAAU,SAAS;IACvB,OAAO,QAAQ,CAAI,CAAC,CAAC,CAAC;AACxB,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/concatMap.js b/node_modules/rxjs/_esm5/internal/operators/concatMap.js
deleted file mode 100644
index 16b9e95..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/concatMap.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */
-import { mergeMap } from './mergeMap';
-export function concatMap(project, resultSelector) {
-    return mergeMap(project, resultSelector, 1);
-}
-//# sourceMappingURL=concatMap.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/concatMap.js.map b/node_modules/rxjs/_esm5/internal/operators/concatMap.js.map
deleted file mode 100644
index 63a35fa..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/concatMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatMap.js","sources":["../../../src/internal/operators/concatMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAuEtC,MAAM,UAAU,SAAS,CACvB,OAAuC,EACvC,cAA6G;IAE7G,OAAO,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/concatMapTo.js b/node_modules/rxjs/_esm5/internal/operators/concatMapTo.js
deleted file mode 100644
index 616264d..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/concatMapTo.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */
-import { concatMap } from './concatMap';
-export function concatMapTo(innerObservable, resultSelector) {
-    return concatMap(function () { return innerObservable; }, resultSelector);
-}
-//# sourceMappingURL=concatMapTo.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/concatMapTo.js.map b/node_modules/rxjs/_esm5/internal/operators/concatMapTo.js.map
deleted file mode 100644
index fb2e722..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/concatMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatMapTo.js","sources":["../../../src/internal/operators/concatMapTo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAmExC,MAAM,UAAU,WAAW,CACzB,eAAkB,EAClB,cAA6G;IAE7G,OAAO,SAAS,CAAC,cAAM,OAAA,eAAe,EAAf,CAAe,EAAE,cAAc,CAAC,CAAC;AAC1D,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/count.js b/node_modules/rxjs/_esm5/internal/operators/count.js
deleted file mode 100644
index 122cb3e..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/count.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function count(predicate) {
-    return function (source) { return source.lift(new CountOperator(predicate, source)); };
-}
-var CountOperator = /*@__PURE__*/ (function () {
-    function CountOperator(predicate, source) {
-        this.predicate = predicate;
-        this.source = source;
-    }
-    CountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));
-    };
-    return CountOperator;
-}());
-var CountSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(CountSubscriber, _super);
-    function CountSubscriber(destination, predicate, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.source = source;
-        _this.count = 0;
-        _this.index = 0;
-        return _this;
-    }
-    CountSubscriber.prototype._next = function (value) {
-        if (this.predicate) {
-            this._tryPredicate(value);
-        }
-        else {
-            this.count++;
-        }
-    };
-    CountSubscriber.prototype._tryPredicate = function (value) {
-        var result;
-        try {
-            result = this.predicate(value, this.index++, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this.count++;
-        }
-    };
-    CountSubscriber.prototype._complete = function () {
-        this.destination.next(this.count);
-        this.destination.complete();
-    };
-    return CountSubscriber;
-}(Subscriber));
-//# sourceMappingURL=count.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/count.js.map b/node_modules/rxjs/_esm5/internal/operators/count.js.map
deleted file mode 100644
index 0ddc924..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/count.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"count.js","sources":["../../../src/internal/operators/count.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA6D3C,MAAM,UAAU,KAAK,CAAI,SAAuE;IAC9F,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAjD,CAAiD,CAAC;AACtF,CAAC;AAED;IACE,uBAAoB,SAAuE,EACvE,MAAsB;QADtB,cAAS,GAAT,SAAS,CAA8D;QACvE,WAAM,GAAN,MAAM,CAAgB;IAC1C,CAAC;IAED,4BAAI,GAAJ,UAAK,UAA8B,EAAE,MAAW;QAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACxF,CAAC;IACH,oBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAiC,2CAAa;IAI5C,yBAAY,WAA6B,EACrB,SAAuE,EACvE,MAAsB;QAF1C,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,eAAS,GAAT,SAAS,CAA8D;QACvE,YAAM,GAAN,MAAM,CAAgB;QALlC,WAAK,GAAW,CAAC,CAAC;QAClB,WAAK,GAAW,CAAC,CAAC;;IAM1B,CAAC;IAES,+BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC3B;aAAM;YACL,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;IACH,CAAC;IAEO,uCAAa,GAArB,UAAsB,KAAQ;QAC5B,IAAI,MAAW,CAAC;QAEhB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SAC3D;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QAED,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;IACH,CAAC;IAES,mCAAS,GAAnB;QACE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IACH,sBAAC;AAAD,CAAC,AArCD,CAAiC,UAAU,GAqC1C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/debounce.js b/node_modules/rxjs/_esm5/internal/operators/debounce.js
deleted file mode 100644
index 998e139..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/debounce.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function debounce(durationSelector) {
-    return function (source) { return source.lift(new DebounceOperator(durationSelector)); };
-}
-var DebounceOperator = /*@__PURE__*/ (function () {
-    function DebounceOperator(durationSelector) {
-        this.durationSelector = durationSelector;
-    }
-    DebounceOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));
-    };
-    return DebounceOperator;
-}());
-var DebounceSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(DebounceSubscriber, _super);
-    function DebounceSubscriber(destination, durationSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.durationSelector = durationSelector;
-        _this.hasValue = false;
-        _this.durationSubscription = null;
-        return _this;
-    }
-    DebounceSubscriber.prototype._next = function (value) {
-        try {
-            var result = this.durationSelector.call(this, value);
-            if (result) {
-                this._tryNext(value, result);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    DebounceSubscriber.prototype._complete = function () {
-        this.emitValue();
-        this.destination.complete();
-    };
-    DebounceSubscriber.prototype._tryNext = function (value, duration) {
-        var subscription = this.durationSubscription;
-        this.value = value;
-        this.hasValue = true;
-        if (subscription) {
-            subscription.unsubscribe();
-            this.remove(subscription);
-        }
-        subscription = subscribeToResult(this, duration);
-        if (subscription && !subscription.closed) {
-            this.add(this.durationSubscription = subscription);
-        }
-    };
-    DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.emitValue();
-    };
-    DebounceSubscriber.prototype.notifyComplete = function () {
-        this.emitValue();
-    };
-    DebounceSubscriber.prototype.emitValue = function () {
-        if (this.hasValue) {
-            var value = this.value;
-            var subscription = this.durationSubscription;
-            if (subscription) {
-                this.durationSubscription = null;
-                subscription.unsubscribe();
-                this.remove(subscription);
-            }
-            this.value = null;
-            this.hasValue = false;
-            _super.prototype._next.call(this, value);
-        }
-    };
-    return DebounceSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=debounce.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/debounce.js.map b/node_modules/rxjs/_esm5/internal/operators/debounce.js.map
deleted file mode 100644
index 35981cb..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/debounce.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounce.js","sources":["../../../src/internal/operators/debounce.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/debounceTime.js b/node_modules/rxjs/_esm5/internal/operators/debounceTime.js
deleted file mode 100644
index ce18492..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/debounceTime.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { async } from '../scheduler/async';
-export function debounceTime(dueTime, scheduler) {
-    if (scheduler === void 0) {
-        scheduler = async;
-    }
-    return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); };
-}
-var DebounceTimeOperator = /*@__PURE__*/ (function () {
-    function DebounceTimeOperator(dueTime, scheduler) {
-        this.dueTime = dueTime;
-        this.scheduler = scheduler;
-    }
-    DebounceTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
-    };
-    return DebounceTimeOperator;
-}());
-var DebounceTimeSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(DebounceTimeSubscriber, _super);
-    function DebounceTimeSubscriber(destination, dueTime, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.dueTime = dueTime;
-        _this.scheduler = scheduler;
-        _this.debouncedSubscription = null;
-        _this.lastValue = null;
-        _this.hasValue = false;
-        return _this;
-    }
-    DebounceTimeSubscriber.prototype._next = function (value) {
-        this.clearDebounce();
-        this.lastValue = value;
-        this.hasValue = true;
-        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
-    };
-    DebounceTimeSubscriber.prototype._complete = function () {
-        this.debouncedNext();
-        this.destination.complete();
-    };
-    DebounceTimeSubscriber.prototype.debouncedNext = function () {
-        this.clearDebounce();
-        if (this.hasValue) {
-            var lastValue = this.lastValue;
-            this.lastValue = null;
-            this.hasValue = false;
-            this.destination.next(lastValue);
-        }
-    };
-    DebounceTimeSubscriber.prototype.clearDebounce = function () {
-        var debouncedSubscription = this.debouncedSubscription;
-        if (debouncedSubscription !== null) {
-            this.remove(debouncedSubscription);
-            debouncedSubscription.unsubscribe();
-            this.debouncedSubscription = null;
-        }
-    };
-    return DebounceTimeSubscriber;
-}(Subscriber));
-function dispatchNext(subscriber) {
-    subscriber.debouncedNext();
-}
-//# sourceMappingURL=debounceTime.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/debounceTime.js.map b/node_modules/rxjs/_esm5/internal/operators/debounceTime.js.map
deleted file mode 100644
index b0f304e..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/debounceTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounceTime.js","sources":["../../../src/internal/operators/debounceTime.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAuD3C,MAAM,UAAU,YAAY,CAAI,OAAe,EAAE,SAAgC;IAAhC,0BAAA,EAAA,iBAAgC;IAC/E,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,EAAzD,CAAyD,CAAC;AAC9F,CAAC;AAED;IACE,8BAAoB,OAAe,EAAU,SAAwB;QAAjD,YAAO,GAAP,OAAO,CAAQ;QAAU,cAAS,GAAT,SAAS,CAAe;IACrE,CAAC;IAED,mCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAChG,CAAC;IACH,2BAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAwC,kDAAa;IAKnD,gCAAY,WAA0B,EAClB,OAAe,EACf,SAAwB;QAF5C,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,aAAO,GAAP,OAAO,CAAQ;QACf,eAAS,GAAT,SAAS,CAAe;QANpC,2BAAqB,GAAiB,IAAI,CAAC;QAC3C,eAAS,GAAM,IAAI,CAAC;QACpB,cAAQ,GAAY,KAAK,CAAC;;IAMlC,CAAC;IAES,sCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACnG,CAAC;IAES,0CAAS,GAAnB;QACE,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,8CAAa,GAAb;QACE,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,IAAI,CAAC,QAAQ,EAAE;YACT,IAAA,0BAAS,CAAU;YAM3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAClC;IACH,CAAC;IAEO,8CAAa,GAArB;QACE,IAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAEzD,IAAI,qBAAqB,KAAK,IAAI,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACnC,qBAAqB,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;SACnC;IACH,CAAC;IACH,6BAAC;AAAD,CAAC,AAhDD,CAAwC,UAAU,GAgDjD;AAED,SAAS,YAAY,CAAC,UAAuC;IAC3D,UAAU,CAAC,aAAa,EAAE,CAAC;AAC7B,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/defaultIfEmpty.js b/node_modules/rxjs/_esm5/internal/operators/defaultIfEmpty.js
deleted file mode 100644
index 3fa86ca..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/defaultIfEmpty.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function defaultIfEmpty(defaultValue) {
-    if (defaultValue === void 0) {
-        defaultValue = null;
-    }
-    return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); };
-}
-var DefaultIfEmptyOperator = /*@__PURE__*/ (function () {
-    function DefaultIfEmptyOperator(defaultValue) {
-        this.defaultValue = defaultValue;
-    }
-    DefaultIfEmptyOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));
-    };
-    return DefaultIfEmptyOperator;
-}());
-var DefaultIfEmptySubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(DefaultIfEmptySubscriber, _super);
-    function DefaultIfEmptySubscriber(destination, defaultValue) {
-        var _this = _super.call(this, destination) || this;
-        _this.defaultValue = defaultValue;
-        _this.isEmpty = true;
-        return _this;
-    }
-    DefaultIfEmptySubscriber.prototype._next = function (value) {
-        this.isEmpty = false;
-        this.destination.next(value);
-    };
-    DefaultIfEmptySubscriber.prototype._complete = function () {
-        if (this.isEmpty) {
-            this.destination.next(this.defaultValue);
-        }
-        this.destination.complete();
-    };
-    return DefaultIfEmptySubscriber;
-}(Subscriber));
-//# sourceMappingURL=defaultIfEmpty.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/defaultIfEmpty.js.map b/node_modules/rxjs/_esm5/internal/operators/defaultIfEmpty.js.map
deleted file mode 100644
index 7cddd3f..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/defaultIfEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"defaultIfEmpty.js","sources":["../../../src/internal/operators/defaultIfEmpty.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA4C3C,MAAM,UAAU,cAAc,CAAO,YAAsB;IAAtB,6BAAA,EAAA,mBAAsB;IACzD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,YAAY,CAAC,CAAsB,EAA1E,CAA0E,CAAC;AAC/G,CAAC;AAED;IAEE,gCAAoB,YAAe;QAAf,iBAAY,GAAZ,YAAY,CAAG;IACnC,CAAC;IAED,qCAAI,GAAJ,UAAK,UAA6B,EAAE,MAAW;QAC7C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,wBAAwB,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACvF,CAAC;IACH,6BAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAA6C,oDAAa;IAGxD,kCAAY,WAA8B,EAAU,YAAe;QAAnE,YACE,kBAAM,WAAW,CAAC,SACnB;QAFmD,kBAAY,GAAZ,YAAY,CAAG;QAF3D,aAAO,GAAY,IAAI,CAAC;;IAIhC,CAAC;IAES,wCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAES,4CAAS,GAAnB;QACE,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAC1C;QACD,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IACH,+BAAC;AAAD,CAAC,AAlBD,CAA6C,UAAU,GAkBtD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/delay.js b/node_modules/rxjs/_esm5/internal/operators/delay.js
deleted file mode 100644
index c54ee75..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/delay.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { async } from '../scheduler/async';
-import { isDate } from '../util/isDate';
-import { Subscriber } from '../Subscriber';
-import { Notification } from '../Notification';
-export function delay(delay, scheduler) {
-    if (scheduler === void 0) {
-        scheduler = async;
-    }
-    var absoluteDelay = isDate(delay);
-    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);
-    return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); };
-}
-var DelayOperator = /*@__PURE__*/ (function () {
-    function DelayOperator(delay, scheduler) {
-        this.delay = delay;
-        this.scheduler = scheduler;
-    }
-    DelayOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));
-    };
-    return DelayOperator;
-}());
-var DelaySubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(DelaySubscriber, _super);
-    function DelaySubscriber(destination, delay, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.delay = delay;
-        _this.scheduler = scheduler;
-        _this.queue = [];
-        _this.active = false;
-        _this.errored = false;
-        return _this;
-    }
-    DelaySubscriber.dispatch = function (state) {
-        var source = state.source;
-        var queue = source.queue;
-        var scheduler = state.scheduler;
-        var destination = state.destination;
-        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {
-            queue.shift().notification.observe(destination);
-        }
-        if (queue.length > 0) {
-            var delay_1 = Math.max(0, queue[0].time - scheduler.now());
-            this.schedule(state, delay_1);
-        }
-        else {
-            this.unsubscribe();
-            source.active = false;
-        }
-    };
-    DelaySubscriber.prototype._schedule = function (scheduler) {
-        this.active = true;
-        var destination = this.destination;
-        destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {
-            source: this, destination: this.destination, scheduler: scheduler
-        }));
-    };
-    DelaySubscriber.prototype.scheduleNotification = function (notification) {
-        if (this.errored === true) {
-            return;
-        }
-        var scheduler = this.scheduler;
-        var message = new DelayMessage(scheduler.now() + this.delay, notification);
-        this.queue.push(message);
-        if (this.active === false) {
-            this._schedule(scheduler);
-        }
-    };
-    DelaySubscriber.prototype._next = function (value) {
-        this.scheduleNotification(Notification.createNext(value));
-    };
-    DelaySubscriber.prototype._error = function (err) {
-        this.errored = true;
-        this.queue = [];
-        this.destination.error(err);
-        this.unsubscribe();
-    };
-    DelaySubscriber.prototype._complete = function () {
-        this.scheduleNotification(Notification.createComplete());
-        this.unsubscribe();
-    };
-    return DelaySubscriber;
-}(Subscriber));
-var DelayMessage = /*@__PURE__*/ (function () {
-    function DelayMessage(time, notification) {
-        this.time = time;
-        this.notification = notification;
-    }
-    return DelayMessage;
-}());
-//# sourceMappingURL=delay.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/delay.js.map b/node_modules/rxjs/_esm5/internal/operators/delay.js.map
deleted file mode 100644
index 1e955da..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/delay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"delay.js","sources":["../../../src/internal/operators/delay.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/delayWhen.js b/node_modules/rxjs/_esm5/internal/operators/delayWhen.js
deleted file mode 100644
index cda6c7e..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/delayWhen.js
+++ /dev/null
@@ -1,132 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_Observable,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function delayWhen(delayDurationSelector, subscriptionDelay) {
-    if (subscriptionDelay) {
-        return function (source) {
-            return new SubscriptionDelayObservable(source, subscriptionDelay)
-                .lift(new DelayWhenOperator(delayDurationSelector));
-        };
-    }
-    return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); };
-}
-var DelayWhenOperator = /*@__PURE__*/ (function () {
-    function DelayWhenOperator(delayDurationSelector) {
-        this.delayDurationSelector = delayDurationSelector;
-    }
-    DelayWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));
-    };
-    return DelayWhenOperator;
-}());
-var DelayWhenSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(DelayWhenSubscriber, _super);
-    function DelayWhenSubscriber(destination, delayDurationSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.delayDurationSelector = delayDurationSelector;
-        _this.completed = false;
-        _this.delayNotifierSubscriptions = [];
-        _this.index = 0;
-        return _this;
-    }
-    DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(outerValue);
-        this.removeSubscription(innerSub);
-        this.tryComplete();
-    };
-    DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) {
-        var value = this.removeSubscription(innerSub);
-        if (value) {
-            this.destination.next(value);
-        }
-        this.tryComplete();
-    };
-    DelayWhenSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        try {
-            var delayNotifier = this.delayDurationSelector(value, index);
-            if (delayNotifier) {
-                this.tryDelay(delayNotifier, value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    DelayWhenSubscriber.prototype._complete = function () {
-        this.completed = true;
-        this.tryComplete();
-        this.unsubscribe();
-    };
-    DelayWhenSubscriber.prototype.removeSubscription = function (subscription) {
-        subscription.unsubscribe();
-        var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);
-        if (subscriptionIdx !== -1) {
-            this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);
-        }
-        return subscription.outerValue;
-    };
-    DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) {
-        var notifierSubscription = subscribeToResult(this, delayNotifier, value);
-        if (notifierSubscription && !notifierSubscription.closed) {
-            var destination = this.destination;
-            destination.add(notifierSubscription);
-            this.delayNotifierSubscriptions.push(notifierSubscription);
-        }
-    };
-    DelayWhenSubscriber.prototype.tryComplete = function () {
-        if (this.completed && this.delayNotifierSubscriptions.length === 0) {
-            this.destination.complete();
-        }
-    };
-    return DelayWhenSubscriber;
-}(OuterSubscriber));
-var SubscriptionDelayObservable = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SubscriptionDelayObservable, _super);
-    function SubscriptionDelayObservable(source, subscriptionDelay) {
-        var _this = _super.call(this) || this;
-        _this.source = source;
-        _this.subscriptionDelay = subscriptionDelay;
-        return _this;
-    }
-    SubscriptionDelayObservable.prototype._subscribe = function (subscriber) {
-        this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));
-    };
-    return SubscriptionDelayObservable;
-}(Observable));
-var SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SubscriptionDelaySubscriber, _super);
-    function SubscriptionDelaySubscriber(parent, source) {
-        var _this = _super.call(this) || this;
-        _this.parent = parent;
-        _this.source = source;
-        _this.sourceSubscribed = false;
-        return _this;
-    }
-    SubscriptionDelaySubscriber.prototype._next = function (unused) {
-        this.subscribeToSource();
-    };
-    SubscriptionDelaySubscriber.prototype._error = function (err) {
-        this.unsubscribe();
-        this.parent.error(err);
-    };
-    SubscriptionDelaySubscriber.prototype._complete = function () {
-        this.unsubscribe();
-        this.subscribeToSource();
-    };
-    SubscriptionDelaySubscriber.prototype.subscribeToSource = function () {
-        if (!this.sourceSubscribed) {
-            this.sourceSubscribed = true;
-            this.unsubscribe();
-            this.source.subscribe(this.parent);
-        }
-    };
-    return SubscriptionDelaySubscriber;
-}(Subscriber));
-//# sourceMappingURL=delayWhen.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/delayWhen.js.map b/node_modules/rxjs/_esm5/internal/operators/delayWhen.js.map
deleted file mode 100644
index f3b5557..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/delayWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"delayWhen.js","sources":["../../../src/internal/operators/delayWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/dematerialize.js b/node_modules/rxjs/_esm5/internal/operators/dematerialize.js
deleted file mode 100644
index 1de64c2..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/dematerialize.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function dematerialize() {
-    return function dematerializeOperatorFunction(source) {
-        return source.lift(new DeMaterializeOperator());
-    };
-}
-var DeMaterializeOperator = /*@__PURE__*/ (function () {
-    function DeMaterializeOperator() {
-    }
-    DeMaterializeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DeMaterializeSubscriber(subscriber));
-    };
-    return DeMaterializeOperator;
-}());
-var DeMaterializeSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(DeMaterializeSubscriber, _super);
-    function DeMaterializeSubscriber(destination) {
-        return _super.call(this, destination) || this;
-    }
-    DeMaterializeSubscriber.prototype._next = function (value) {
-        value.observe(this.destination);
-    };
-    return DeMaterializeSubscriber;
-}(Subscriber));
-//# sourceMappingURL=dematerialize.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/dematerialize.js.map b/node_modules/rxjs/_esm5/internal/operators/dematerialize.js.map
deleted file mode 100644
index ec9080a..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/dematerialize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"dematerialize.js","sources":["../../../src/internal/operators/dematerialize.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAkD3C,MAAM,UAAU,aAAa;IAC3B,OAAO,SAAS,6BAA6B,CAAC,MAAmC;QAC/E,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC;AAED;IAAA;IAIA,CAAC;IAHC,oCAAI,GAAJ,UAAK,UAA2B,EAAE,MAAW;QAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;IACnE,CAAC;IACH,4BAAC;AAAD,CAAC,AAJD,IAIC;AAOD;IAAmE,mDAAa;IAC9E,iCAAY,WAA4B;eACtC,kBAAM,WAAW,CAAC;IACpB,CAAC;IAES,uCAAK,GAAf,UAAgB,KAAQ;QACtB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IACH,8BAAC;AAAD,CAAC,AARD,CAAmE,UAAU,GAQ5E"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/distinct.js b/node_modules/rxjs/_esm5/internal/operators/distinct.js
deleted file mode 100644
index 482c905..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/distinct.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function distinct(keySelector, flushes) {
-    return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); };
-}
-var DistinctOperator = /*@__PURE__*/ (function () {
-    function DistinctOperator(keySelector, flushes) {
-        this.keySelector = keySelector;
-        this.flushes = flushes;
-    }
-    DistinctOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));
-    };
-    return DistinctOperator;
-}());
-var DistinctSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(DistinctSubscriber, _super);
-    function DistinctSubscriber(destination, keySelector, flushes) {
-        var _this = _super.call(this, destination) || this;
-        _this.keySelector = keySelector;
-        _this.values = new Set();
-        if (flushes) {
-            _this.add(subscribeToResult(_this, flushes));
-        }
-        return _this;
-    }
-    DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values.clear();
-    };
-    DistinctSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    DistinctSubscriber.prototype._next = function (value) {
-        if (this.keySelector) {
-            this._useKeySelector(value);
-        }
-        else {
-            this._finalizeNext(value, value);
-        }
-    };
-    DistinctSubscriber.prototype._useKeySelector = function (value) {
-        var key;
-        var destination = this.destination;
-        try {
-            key = this.keySelector(value);
-        }
-        catch (err) {
-            destination.error(err);
-            return;
-        }
-        this._finalizeNext(key, value);
-    };
-    DistinctSubscriber.prototype._finalizeNext = function (key, value) {
-        var values = this.values;
-        if (!values.has(key)) {
-            values.add(key);
-            this.destination.next(value);
-        }
-    };
-    return DistinctSubscriber;
-}(OuterSubscriber));
-export { DistinctSubscriber };
-//# sourceMappingURL=distinct.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/distinct.js.map b/node_modules/rxjs/_esm5/internal/operators/distinct.js.map
deleted file mode 100644
index a4d9552..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/distinct.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinct.js","sources":["../../../src/internal/operators/distinct.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA6D9D,MAAM,UAAU,QAAQ,CAAO,WAA6B,EAC7B,OAAyB;IACtD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EAAvD,CAAuD,CAAC;AAC5F,CAAC;AAED;IACE,0BAAoB,WAA4B,EAAU,OAAwB;QAA9D,gBAAW,GAAX,WAAW,CAAiB;QAAU,YAAO,GAAP,OAAO,CAAiB;IAClF,CAAC;IAED,+BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9F,CAAC;IACH,uBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAA8C,8CAAqB;IAGjE,4BAAY,WAA0B,EAAU,WAA4B,EAAE,OAAwB;QAAtG,YACE,kBAAM,WAAW,CAAC,SAKnB;QAN+C,iBAAW,GAAX,WAAW,CAAiB;QAFpE,YAAM,GAAG,IAAI,GAAG,EAAK,CAAC;QAK5B,IAAI,OAAO,EAAE;YACX,KAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAI,EAAE,OAAO,CAAC,CAAC,CAAC;SAC5C;;IACH,CAAC;IAED,uCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,wCAAW,GAAX,UAAY,KAAU,EAAE,QAA+B;QACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAES,kCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;SAC7B;aAAM;YACL,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAClC;IACH,CAAC;IAEO,4CAAe,GAAvB,UAAwB,KAAQ;QAC9B,IAAI,GAAM,CAAC;QACH,IAAA,8BAAW,CAAU;QAC7B,IAAI;YACF,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC/B;QAAC,OAAO,GAAG,EAAE;YACZ,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO;SACR;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAEO,0CAAa,GAArB,UAAsB,GAAQ,EAAE,KAAQ;QAC9B,IAAA,oBAAM,CAAU;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAI,GAAG,CAAC,EAAE;YACvB,MAAM,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IAEH,yBAAC;AAAD,CAAC,AAjDD,CAA8C,eAAe,GAiD5D"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/distinctUntilChanged.js b/node_modules/rxjs/_esm5/internal/operators/distinctUntilChanged.js
deleted file mode 100644
index 7f1fd98..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/distinctUntilChanged.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function distinctUntilChanged(compare, keySelector) {
-    return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); };
-}
-var DistinctUntilChangedOperator = /*@__PURE__*/ (function () {
-    function DistinctUntilChangedOperator(compare, keySelector) {
-        this.compare = compare;
-        this.keySelector = keySelector;
-    }
-    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
-    };
-    return DistinctUntilChangedOperator;
-}());
-var DistinctUntilChangedSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(DistinctUntilChangedSubscriber, _super);
-    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.keySelector = keySelector;
-        _this.hasKey = false;
-        if (typeof compare === 'function') {
-            _this.compare = compare;
-        }
-        return _this;
-    }
-    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {
-        return x === y;
-    };
-    DistinctUntilChangedSubscriber.prototype._next = function (value) {
-        var key;
-        try {
-            var keySelector = this.keySelector;
-            key = keySelector ? keySelector(value) : value;
-        }
-        catch (err) {
-            return this.destination.error(err);
-        }
-        var result = false;
-        if (this.hasKey) {
-            try {
-                var compare = this.compare;
-                result = compare(this.key, key);
-            }
-            catch (err) {
-                return this.destination.error(err);
-            }
-        }
-        else {
-            this.hasKey = true;
-        }
-        if (!result) {
-            this.key = key;
-            this.destination.next(value);
-        }
-    };
-    return DistinctUntilChangedSubscriber;
-}(Subscriber));
-//# sourceMappingURL=distinctUntilChanged.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/distinctUntilChanged.js.map b/node_modules/rxjs/_esm5/internal/operators/distinctUntilChanged.js.map
deleted file mode 100644
index 7825477..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/distinctUntilChanged.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinctUntilChanged.js","sources":["../../../src/internal/operators/distinctUntilChanged.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA8D3C,MAAM,UAAU,oBAAoB,CAAO,OAAiC,EAAE,WAAyB;IACrG,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,4BAA4B,CAAO,OAAO,EAAE,WAAW,CAAC,CAAC,EAAzE,CAAyE,CAAC;AAC9G,CAAC;AAED;IACE,sCAAoB,OAAgC,EAChC,WAAwB;QADxB,YAAO,GAAP,OAAO,CAAyB;QAChC,gBAAW,GAAX,WAAW,CAAa;IAC5C,CAAC;IAED,2CAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,8BAA8B,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,CAAC;IACH,mCAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAmD,0DAAa;IAI9D,wCAAY,WAA0B,EAC1B,OAAgC,EACxB,WAAwB;QAF5C,YAGE,kBAAM,WAAW,CAAC,SAInB;QALmB,iBAAW,GAAX,WAAW,CAAa;QAJpC,YAAM,GAAY,KAAK,CAAC;QAM9B,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;YACjC,KAAI,CAAC,OAAO,GAAG,OAAO,CAAC;SACxB;;IACH,CAAC;IAEO,gDAAO,GAAf,UAAgB,CAAM,EAAE,CAAM;QAC5B,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAES,8CAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,GAAQ,CAAC;QACb,IAAI;YACM,IAAA,8BAAW,CAAU;YAC7B,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SAChD;QAAC,OAAO,GAAG,EAAE;YACZ,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACpC;QACD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI;gBACM,IAAA,sBAAO,CAAU;gBACzB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;aACjC;YAAC,OAAO,GAAG,EAAE;gBACZ,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACpC;SACF;aAAM;YACL,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;SACpB;QACD,IAAI,CAAC,MAAM,EAAE;YACX,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IACH,qCAAC;AAAD,CAAC,AAzCD,CAAmD,UAAU,GAyC5D"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/distinctUntilKeyChanged.js b/node_modules/rxjs/_esm5/internal/operators/distinctUntilKeyChanged.js
deleted file mode 100644
index fbb0131..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/distinctUntilKeyChanged.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */
-import { distinctUntilChanged } from './distinctUntilChanged';
-export function distinctUntilKeyChanged(key, compare) {
-    return distinctUntilChanged(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });
-}
-//# sourceMappingURL=distinctUntilKeyChanged.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/distinctUntilKeyChanged.js.map b/node_modules/rxjs/_esm5/internal/operators/distinctUntilKeyChanged.js.map
deleted file mode 100644
index f5dff6e..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/distinctUntilKeyChanged.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinctUntilKeyChanged.js","sources":["../../../src/internal/operators/distinctUntilKeyChanged.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AA8E9D,MAAM,UAAU,uBAAuB,CAAuB,GAAM,EAAE,OAAuC;IAC3G,OAAO,oBAAoB,CAAC,UAAC,CAAI,EAAE,CAAI,IAAK,OAAA,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAArD,CAAqD,CAAC,CAAC;AACrG,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/elementAt.js b/node_modules/rxjs/_esm5/internal/operators/elementAt.js
deleted file mode 100644
index edc4594..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/elementAt.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */
-import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
-import { filter } from './filter';
-import { throwIfEmpty } from './throwIfEmpty';
-import { defaultIfEmpty } from './defaultIfEmpty';
-import { take } from './take';
-export function elementAt(index, defaultValue) {
-    if (index < 0) {
-        throw new ArgumentOutOfRangeError();
-    }
-    var hasDefaultValue = arguments.length >= 2;
-    return function (source) {
-        return source.pipe(filter(function (v, i) { return i === index; }), take(1), hasDefaultValue
-            ? defaultIfEmpty(defaultValue)
-            : throwIfEmpty(function () { return new ArgumentOutOfRangeError(); }));
-    };
-}
-//# sourceMappingURL=elementAt.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/elementAt.js.map b/node_modules/rxjs/_esm5/internal/operators/elementAt.js.map
deleted file mode 100644
index d9f04a7..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/elementAt.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"elementAt.js","sources":["../../../src/internal/operators/elementAt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAG1E,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAkD9B,MAAM,UAAU,SAAS,CAAI,KAAa,EAAE,YAAgB;IAC1D,IAAI,KAAK,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,uBAAuB,EAAE,CAAC;KAAE;IACvD,IAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9C,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAC3C,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,KAAK,KAAK,EAAX,CAAW,CAAC,EAC7B,IAAI,CAAC,CAAC,CAAC,EACP,eAAe;QACb,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC;QAC9B,CAAC,CAAC,YAAY,CAAC,cAAM,OAAA,IAAI,uBAAuB,EAAE,EAA7B,CAA6B,CAAC,CACtD,EANiC,CAMjC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/endWith.js b/node_modules/rxjs/_esm5/internal/operators/endWith.js
deleted file mode 100644
index 081f55a..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/endWith.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/** PURE_IMPORTS_START _observable_concat,_observable_of PURE_IMPORTS_END */
-import { concat } from '../observable/concat';
-import { of } from '../observable/of';
-export function endWith() {
-    var array = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        array[_i] = arguments[_i];
-    }
-    return function (source) { return concat(source, of.apply(void 0, array)); };
-}
-//# sourceMappingURL=endWith.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/endWith.js.map b/node_modules/rxjs/_esm5/internal/operators/endWith.js.map
deleted file mode 100644
index 8b9f150..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/endWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"endWith.js","sources":["../../../src/internal/operators/endWith.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AA8DtC,MAAM,UAAU,OAAO;IAAI,eAAkC;SAAlC,UAAkC,EAAlC,qBAAkC,EAAlC,IAAkC;QAAlC,0BAAkC;;IAC3D,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,MAAM,EAAE,EAAE,eAAI,KAAK,EAAmB,EAA7C,CAA6C,CAAC;AAClF,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/every.js b/node_modules/rxjs/_esm5/internal/operators/every.js
deleted file mode 100644
index 71f04b6..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/every.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function every(predicate, thisArg) {
-    return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); };
-}
-var EveryOperator = /*@__PURE__*/ (function () {
-    function EveryOperator(predicate, thisArg, source) {
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-        this.source = source;
-    }
-    EveryOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));
-    };
-    return EveryOperator;
-}());
-var EverySubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(EverySubscriber, _super);
-    function EverySubscriber(destination, predicate, thisArg, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.thisArg = thisArg;
-        _this.source = source;
-        _this.index = 0;
-        _this.thisArg = thisArg || _this;
-        return _this;
-    }
-    EverySubscriber.prototype.notifyComplete = function (everyValueMatch) {
-        this.destination.next(everyValueMatch);
-        this.destination.complete();
-    };
-    EverySubscriber.prototype._next = function (value) {
-        var result = false;
-        try {
-            result = this.predicate.call(this.thisArg, value, this.index++, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (!result) {
-            this.notifyComplete(false);
-        }
-    };
-    EverySubscriber.prototype._complete = function () {
-        this.notifyComplete(true);
-    };
-    return EverySubscriber;
-}(Subscriber));
-//# sourceMappingURL=every.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/every.js.map b/node_modules/rxjs/_esm5/internal/operators/every.js.map
deleted file mode 100644
index 8e4b3d5..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/every.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"every.js","sources":["../../../src/internal/operators/every.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAwB3C,MAAM,UAAU,KAAK,CAAI,SAAsE,EACtE,OAAa;IACpC,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,EAA1D,CAA0D,CAAC;AAC/F,CAAC;AAED;IACE,uBAAoB,SAAsE,EACtE,OAAa,EACb,MAAsB;QAFtB,cAAS,GAAT,SAAS,CAA6D;QACtE,YAAO,GAAP,OAAO,CAAM;QACb,WAAM,GAAN,MAAM,CAAgB;IAC1C,CAAC;IAED,4BAAI,GAAJ,UAAK,QAA6B,EAAE,MAAW;QAC7C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpG,CAAC;IACH,oBAAC;AAAD,CAAC,AATD,IASC;AAOD;IAAiC,2CAAa;IAG5C,yBAAY,WAA8B,EACtB,SAAsE,EACtE,OAAY,EACZ,MAAsB;QAH1C,YAIE,kBAAM,WAAW,CAAC,SAEnB;QALmB,eAAS,GAAT,SAAS,CAA6D;QACtE,aAAO,GAAP,OAAO,CAAK;QACZ,YAAM,GAAN,MAAM,CAAgB;QALlC,WAAK,GAAW,CAAC,CAAC;QAOxB,KAAI,CAAC,OAAO,GAAG,OAAO,IAAI,KAAI,CAAC;;IACjC,CAAC;IAEO,wCAAc,GAAtB,UAAuB,eAAwB;QAC7C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAES,+BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SAC9E;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QAED,IAAI,CAAC,MAAM,EAAE;YACX,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;SAC5B;IACH,CAAC;IAES,mCAAS,GAAnB;QACE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACH,sBAAC;AAAD,CAAC,AAjCD,CAAiC,UAAU,GAiC1C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/exhaust.js b/node_modules/rxjs/_esm5/internal/operators/exhaust.js
deleted file mode 100644
index 143a778..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/exhaust.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function exhaust() {
-    return function (source) { return source.lift(new SwitchFirstOperator()); };
-}
-var SwitchFirstOperator = /*@__PURE__*/ (function () {
-    function SwitchFirstOperator() {
-    }
-    SwitchFirstOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SwitchFirstSubscriber(subscriber));
-    };
-    return SwitchFirstOperator;
-}());
-var SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SwitchFirstSubscriber, _super);
-    function SwitchFirstSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasCompleted = false;
-        _this.hasSubscription = false;
-        return _this;
-    }
-    SwitchFirstSubscriber.prototype._next = function (value) {
-        if (!this.hasSubscription) {
-            this.hasSubscription = true;
-            this.add(subscribeToResult(this, value));
-        }
-    };
-    SwitchFirstSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (!this.hasSubscription) {
-            this.destination.complete();
-        }
-    };
-    SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.remove(innerSub);
-        this.hasSubscription = false;
-        if (this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return SwitchFirstSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=exhaust.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/exhaust.js.map b/node_modules/rxjs/_esm5/internal/operators/exhaust.js.map
deleted file mode 100644
index 745e22e..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/exhaust.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exhaust.js","sources":["../../../src/internal/operators/exhaust.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAkD9D,MAAM,UAAU,OAAO;IACrB,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAK,CAAC,EAAzC,CAAyC,CAAC;AAC9E,CAAC;AAED;IAAA;IAIA,CAAC;IAHC,kCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;IACH,0BAAC;AAAD,CAAC,AAJD,IAIC;AAOD;IAAuC,iDAAqB;IAI1D,+BAAY,WAA0B;QAAtC,YACE,kBAAM,WAAW,CAAC,SACnB;QALO,kBAAY,GAAY,KAAK,CAAC;QAC9B,qBAAe,GAAY,KAAK,CAAC;;IAIzC,CAAC;IAES,qCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;SAC1C;IACH,CAAC;IAES,yCAAS,GAAnB;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;IACH,CAAC;IAED,8CAAc,GAAd,UAAe,QAAsB;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;IACH,CAAC;IACH,4BAAC;AAAD,CAAC,AA7BD,CAAuC,eAAe,GA6BrD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/exhaustMap.js b/node_modules/rxjs/_esm5/internal/operators/exhaustMap.js
deleted file mode 100644
index 883d2f9..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/exhaustMap.js
+++ /dev/null
@@ -1,85 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { map } from './map';
-import { from } from '../observable/from';
-export function exhaustMap(project, resultSelector) {
-    if (resultSelector) {
-        return function (source) { return source.pipe(exhaustMap(function (a, i) { return from(project(a, i)).pipe(map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
-    }
-    return function (source) {
-        return source.lift(new ExhaustMapOperator(project));
-    };
-}
-var ExhaustMapOperator = /*@__PURE__*/ (function () {
-    function ExhaustMapOperator(project) {
-        this.project = project;
-    }
-    ExhaustMapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project));
-    };
-    return ExhaustMapOperator;
-}());
-var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ExhaustMapSubscriber, _super);
-    function ExhaustMapSubscriber(destination, project) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.hasSubscription = false;
-        _this.hasCompleted = false;
-        _this.index = 0;
-        return _this;
-    }
-    ExhaustMapSubscriber.prototype._next = function (value) {
-        if (!this.hasSubscription) {
-            this.tryNext(value);
-        }
-    };
-    ExhaustMapSubscriber.prototype.tryNext = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.hasSubscription = true;
-        this._innerSub(result, value, index);
-    };
-    ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) {
-        var innerSubscriber = new InnerSubscriber(this, value, index);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        var innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            destination.add(innerSubscription);
-        }
-    };
-    ExhaustMapSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (!this.hasSubscription) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    ExhaustMapSubscriber.prototype.notifyError = function (err) {
-        this.destination.error(err);
-    };
-    ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.hasSubscription = false;
-        if (this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return ExhaustMapSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=exhaustMap.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/exhaustMap.js.map b/node_modules/rxjs/_esm5/internal/operators/exhaustMap.js.map
deleted file mode 100644
index 660c513..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/exhaustMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exhaustMap.js","sources":["../../../src/internal/operators/exhaustMap.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/expand.js b/node_modules/rxjs/_esm5/internal/operators/expand.js
deleted file mode 100644
index 43a3e2b..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/expand.js
+++ /dev/null
@@ -1,105 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function expand(project, concurrent, scheduler) {
-    if (concurrent === void 0) {
-        concurrent = Number.POSITIVE_INFINITY;
-    }
-    if (scheduler === void 0) {
-        scheduler = undefined;
-    }
-    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
-    return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); };
-}
-var ExpandOperator = /*@__PURE__*/ (function () {
-    function ExpandOperator(project, concurrent, scheduler) {
-        this.project = project;
-        this.concurrent = concurrent;
-        this.scheduler = scheduler;
-    }
-    ExpandOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));
-    };
-    return ExpandOperator;
-}());
-export { ExpandOperator };
-var ExpandSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ExpandSubscriber, _super);
-    function ExpandSubscriber(destination, project, concurrent, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.concurrent = concurrent;
-        _this.scheduler = scheduler;
-        _this.index = 0;
-        _this.active = 0;
-        _this.hasCompleted = false;
-        if (concurrent < Number.POSITIVE_INFINITY) {
-            _this.buffer = [];
-        }
-        return _this;
-    }
-    ExpandSubscriber.dispatch = function (arg) {
-        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;
-        subscriber.subscribeToProjection(result, value, index);
-    };
-    ExpandSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        if (destination.closed) {
-            this._complete();
-            return;
-        }
-        var index = this.index++;
-        if (this.active < this.concurrent) {
-            destination.next(value);
-            try {
-                var project = this.project;
-                var result = project(value, index);
-                if (!this.scheduler) {
-                    this.subscribeToProjection(result, value, index);
-                }
-                else {
-                    var state = { subscriber: this, result: result, value: value, index: index };
-                    var destination_1 = this.destination;
-                    destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));
-                }
-            }
-            catch (e) {
-                destination.error(e);
-            }
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {
-        this.active++;
-        var destination = this.destination;
-        destination.add(subscribeToResult(this, result, value, index));
-    };
-    ExpandSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this._next(innerValue);
-    };
-    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.active--;
-        if (buffer && buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    return ExpandSubscriber;
-}(OuterSubscriber));
-export { ExpandSubscriber };
-//# sourceMappingURL=expand.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/expand.js.map b/node_modules/rxjs/_esm5/internal/operators/expand.js.map
deleted file mode 100644
index 6db2258..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/expand.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"expand.js","sources":["../../../src/internal/operators/expand.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/filter.js b/node_modules/rxjs/_esm5/internal/operators/filter.js
deleted file mode 100644
index b442c00..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/filter.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function filter(predicate, thisArg) {
-    return function filterOperatorFunction(source) {
-        return source.lift(new FilterOperator(predicate, thisArg));
-    };
-}
-var FilterOperator = /*@__PURE__*/ (function () {
-    function FilterOperator(predicate, thisArg) {
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-    }
-    FilterOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));
-    };
-    return FilterOperator;
-}());
-var FilterSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(FilterSubscriber, _super);
-    function FilterSubscriber(destination, predicate, thisArg) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.thisArg = thisArg;
-        _this.count = 0;
-        return _this;
-    }
-    FilterSubscriber.prototype._next = function (value) {
-        var result;
-        try {
-            result = this.predicate.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this.destination.next(value);
-        }
-    };
-    return FilterSubscriber;
-}(Subscriber));
-//# sourceMappingURL=filter.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/filter.js.map b/node_modules/rxjs/_esm5/internal/operators/filter.js.map
deleted file mode 100644
index 5f368bc..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/filter.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"filter.js","sources":["../../../src/internal/operators/filter.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAwD3C,MAAM,UAAU,MAAM,CAAI,SAA+C,EAC/C,OAAa;IACrC,OAAO,SAAS,sBAAsB,CAAC,MAAqB;QAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAED;IACE,wBAAoB,SAA+C,EAC/C,OAAa;QADb,cAAS,GAAT,SAAS,CAAsC;QAC/C,YAAO,GAAP,OAAO,CAAM;IACjC,CAAC;IAED,6BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1F,CAAC;IACH,qBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAkC,4CAAa;IAI7C,0BAAY,WAA0B,EAClB,SAA+C,EAC/C,OAAY;QAFhC,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,eAAS,GAAT,SAAS,CAAsC;QAC/C,aAAO,GAAP,OAAO,CAAK;QAJhC,WAAK,GAAW,CAAC,CAAC;;IAMlB,CAAC;IAIS,gCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,MAAW,CAAC;QAChB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SACjE;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QACD,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAxBD,CAAkC,UAAU,GAwB3C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/finalize.js b/node_modules/rxjs/_esm5/internal/operators/finalize.js
deleted file mode 100644
index e863d39..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/finalize.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-export function finalize(callback) {
-    return function (source) { return source.lift(new FinallyOperator(callback)); };
-}
-var FinallyOperator = /*@__PURE__*/ (function () {
-    function FinallyOperator(callback) {
-        this.callback = callback;
-    }
-    FinallyOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new FinallySubscriber(subscriber, this.callback));
-    };
-    return FinallyOperator;
-}());
-var FinallySubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(FinallySubscriber, _super);
-    function FinallySubscriber(destination, callback) {
-        var _this = _super.call(this, destination) || this;
-        _this.add(new Subscription(callback));
-        return _this;
-    }
-    return FinallySubscriber;
-}(Subscriber));
-//# sourceMappingURL=finalize.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/finalize.js.map b/node_modules/rxjs/_esm5/internal/operators/finalize.js.map
deleted file mode 100644
index 7e4b0b8..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/finalize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"finalize.js","sources":["../../../src/internal/operators/finalize.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAY/C,MAAM,UAAU,QAAQ,CAAI,QAAoB;IAC9C,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,EAA1C,CAA0C,CAAC;AAC/E,CAAC;AAED;IACE,yBAAoB,QAAoB;QAApB,aAAQ,GAAR,QAAQ,CAAY;IACxC,CAAC;IAED,8BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5E,CAAC;IACH,sBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAmC,6CAAa;IAC9C,2BAAY,WAA0B,EAAE,QAAoB;QAA5D,YACE,kBAAM,WAAW,CAAC,SAEnB;QADC,KAAI,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;;IACvC,CAAC;IACH,wBAAC;AAAD,CAAC,AALD,CAAmC,UAAU,GAK5C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/find.js b/node_modules/rxjs/_esm5/internal/operators/find.js
deleted file mode 100644
index 366e91d..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/find.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function find(predicate, thisArg) {
-    if (typeof predicate !== 'function') {
-        throw new TypeError('predicate is not a function');
-    }
-    return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); };
-}
-var FindValueOperator = /*@__PURE__*/ (function () {
-    function FindValueOperator(predicate, source, yieldIndex, thisArg) {
-        this.predicate = predicate;
-        this.source = source;
-        this.yieldIndex = yieldIndex;
-        this.thisArg = thisArg;
-    }
-    FindValueOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));
-    };
-    return FindValueOperator;
-}());
-export { FindValueOperator };
-var FindValueSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(FindValueSubscriber, _super);
-    function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.source = source;
-        _this.yieldIndex = yieldIndex;
-        _this.thisArg = thisArg;
-        _this.index = 0;
-        return _this;
-    }
-    FindValueSubscriber.prototype.notifyComplete = function (value) {
-        var destination = this.destination;
-        destination.next(value);
-        destination.complete();
-        this.unsubscribe();
-    };
-    FindValueSubscriber.prototype._next = function (value) {
-        var _a = this, predicate = _a.predicate, thisArg = _a.thisArg;
-        var index = this.index++;
-        try {
-            var result = predicate.call(thisArg || this, value, index, this.source);
-            if (result) {
-                this.notifyComplete(this.yieldIndex ? index : value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    FindValueSubscriber.prototype._complete = function () {
-        this.notifyComplete(this.yieldIndex ? -1 : undefined);
-    };
-    return FindValueSubscriber;
-}(Subscriber));
-export { FindValueSubscriber };
-//# sourceMappingURL=find.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/find.js.map b/node_modules/rxjs/_esm5/internal/operators/find.js.map
deleted file mode 100644
index 7328095..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/find.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"find.js","sources":["../../../src/internal/operators/find.ts"],"names":[],"mappings":";AAEA,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AA8CzC,MAAM,UAAU,IAAI,CAAI,SAAsE,EACtE,OAAa;IACnC,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;QACnC,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;KACpD;IACD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAA8B,EAAlG,CAAkG,CAAC;AACvI,CAAC;AAED;IACE,2BAAoB,SAAsE,EACtE,MAAqB,EACrB,UAAmB,EACnB,OAAa;QAHb,cAAS,GAAT,SAAS,CAA6D;QACtE,WAAM,GAAN,MAAM,CAAe;QACrB,eAAU,GAAV,UAAU,CAAS;QACnB,YAAO,GAAP,OAAO,CAAM;IACjC,CAAC;IAED,gCAAI,GAAJ,UAAK,QAAuB,EAAE,MAAW;QACvC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACzH,CAAC;IACH,wBAAC;AAAD,CAAC,AAVD,IAUC;;AAOD;IAA4C,+CAAa;IAGvD,6BAAY,WAA0B,EAClB,SAAsE,EACtE,MAAqB,EACrB,UAAmB,EACnB,OAAa;QAJjC,YAKE,kBAAM,WAAW,CAAC,SACnB;QALmB,eAAS,GAAT,SAAS,CAA6D;QACtE,YAAM,GAAN,MAAM,CAAe;QACrB,gBAAU,GAAV,UAAU,CAAS;QACnB,aAAO,GAAP,OAAO,CAAM;QANzB,WAAK,GAAW,CAAC,CAAC;;IAQ1B,CAAC;IAEO,4CAAc,GAAtB,UAAuB,KAAU;QAC/B,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAErC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,WAAW,CAAC,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,mCAAK,GAAf,UAAgB,KAAQ;QAChB,IAAA,SAA2B,EAA1B,wBAAS,EAAE,oBAAO,CAAS;QAClC,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI;YACF,IAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1E,IAAI,MAAM,EAAE;gBACV,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aACtD;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;IACH,CAAC;IAES,uCAAS,GAAnB;QACE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IACH,0BAAC;AAAD,CAAC,AAnCD,CAA4C,UAAU,GAmCrD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/findIndex.js b/node_modules/rxjs/_esm5/internal/operators/findIndex.js
deleted file mode 100644
index 536c949..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/findIndex.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */
-import { FindValueOperator } from '../operators/find';
-export function findIndex(predicate, thisArg) {
-    return function (source) { return source.lift(new FindValueOperator(predicate, source, true, thisArg)); };
-}
-//# sourceMappingURL=findIndex.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/findIndex.js.map b/node_modules/rxjs/_esm5/internal/operators/findIndex.js.map
deleted file mode 100644
index 41500ac..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/findIndex.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"findIndex.js","sources":["../../../src/internal/operators/findIndex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA0CtD,MAAM,UAAU,SAAS,CAAI,SAAsE,EACtE,OAAa;IACxC,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAoB,EAAvF,CAAuF,CAAC;AAC5H,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/first.js b/node_modules/rxjs/_esm5/internal/operators/first.js
deleted file mode 100644
index 4305b8d..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/first.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */
-import { EmptyError } from '../util/EmptyError';
-import { filter } from './filter';
-import { take } from './take';
-import { defaultIfEmpty } from './defaultIfEmpty';
-import { throwIfEmpty } from './throwIfEmpty';
-import { identity } from '../util/identity';
-export function first(predicate, defaultValue) {
-    var hasDefaultValue = arguments.length >= 2;
-    return function (source) { return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); })); };
-}
-//# sourceMappingURL=first.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/first.js.map b/node_modules/rxjs/_esm5/internal/operators/first.js.map
deleted file mode 100644
index d43d396..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/first.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"first.js","sources":["../../../src/internal/operators/first.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAuE5C,MAAM,UAAU,KAAK,CACnB,SAAgF,EAChF,YAAgB;IAEhB,IAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9C,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAC3C,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAvB,CAAuB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAChE,IAAI,CAAC,CAAC,CAAC,EACP,eAAe,CAAC,CAAC,CAAC,cAAc,CAAQ,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,cAAM,OAAA,IAAI,UAAU,EAAE,EAAhB,CAAgB,CAAC,CAC7F,EAJiC,CAIjC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/groupBy.js b/node_modules/rxjs/_esm5/internal/operators/groupBy.js
deleted file mode 100644
index dba2ede..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/groupBy.js
+++ /dev/null
@@ -1,182 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription,_Observable,_Subject PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { Observable } from '../Observable';
-import { Subject } from '../Subject';
-export function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {
-    return function (source) {
-        return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));
-    };
-}
-var GroupByOperator = /*@__PURE__*/ (function () {
-    function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) {
-        this.keySelector = keySelector;
-        this.elementSelector = elementSelector;
-        this.durationSelector = durationSelector;
-        this.subjectSelector = subjectSelector;
-    }
-    GroupByOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));
-    };
-    return GroupByOperator;
-}());
-var GroupBySubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(GroupBySubscriber, _super);
-    function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.keySelector = keySelector;
-        _this.elementSelector = elementSelector;
-        _this.durationSelector = durationSelector;
-        _this.subjectSelector = subjectSelector;
-        _this.groups = null;
-        _this.attemptedToUnsubscribe = false;
-        _this.count = 0;
-        return _this;
-    }
-    GroupBySubscriber.prototype._next = function (value) {
-        var key;
-        try {
-            key = this.keySelector(value);
-        }
-        catch (err) {
-            this.error(err);
-            return;
-        }
-        this._group(value, key);
-    };
-    GroupBySubscriber.prototype._group = function (value, key) {
-        var groups = this.groups;
-        if (!groups) {
-            groups = this.groups = new Map();
-        }
-        var group = groups.get(key);
-        var element;
-        if (this.elementSelector) {
-            try {
-                element = this.elementSelector(value);
-            }
-            catch (err) {
-                this.error(err);
-            }
-        }
-        else {
-            element = value;
-        }
-        if (!group) {
-            group = (this.subjectSelector ? this.subjectSelector() : new Subject());
-            groups.set(key, group);
-            var groupedObservable = new GroupedObservable(key, group, this);
-            this.destination.next(groupedObservable);
-            if (this.durationSelector) {
-                var duration = void 0;
-                try {
-                    duration = this.durationSelector(new GroupedObservable(key, group));
-                }
-                catch (err) {
-                    this.error(err);
-                    return;
-                }
-                this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));
-            }
-        }
-        if (!group.closed) {
-            group.next(element);
-        }
-    };
-    GroupBySubscriber.prototype._error = function (err) {
-        var groups = this.groups;
-        if (groups) {
-            groups.forEach(function (group, key) {
-                group.error(err);
-            });
-            groups.clear();
-        }
-        this.destination.error(err);
-    };
-    GroupBySubscriber.prototype._complete = function () {
-        var groups = this.groups;
-        if (groups) {
-            groups.forEach(function (group, key) {
-                group.complete();
-            });
-            groups.clear();
-        }
-        this.destination.complete();
-    };
-    GroupBySubscriber.prototype.removeGroup = function (key) {
-        this.groups.delete(key);
-    };
-    GroupBySubscriber.prototype.unsubscribe = function () {
-        if (!this.closed) {
-            this.attemptedToUnsubscribe = true;
-            if (this.count === 0) {
-                _super.prototype.unsubscribe.call(this);
-            }
-        }
-    };
-    return GroupBySubscriber;
-}(Subscriber));
-var GroupDurationSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(GroupDurationSubscriber, _super);
-    function GroupDurationSubscriber(key, group, parent) {
-        var _this = _super.call(this, group) || this;
-        _this.key = key;
-        _this.group = group;
-        _this.parent = parent;
-        return _this;
-    }
-    GroupDurationSubscriber.prototype._next = function (value) {
-        this.complete();
-    };
-    GroupDurationSubscriber.prototype._unsubscribe = function () {
-        var _a = this, parent = _a.parent, key = _a.key;
-        this.key = this.parent = null;
-        if (parent) {
-            parent.removeGroup(key);
-        }
-    };
-    return GroupDurationSubscriber;
-}(Subscriber));
-var GroupedObservable = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(GroupedObservable, _super);
-    function GroupedObservable(key, groupSubject, refCountSubscription) {
-        var _this = _super.call(this) || this;
-        _this.key = key;
-        _this.groupSubject = groupSubject;
-        _this.refCountSubscription = refCountSubscription;
-        return _this;
-    }
-    GroupedObservable.prototype._subscribe = function (subscriber) {
-        var subscription = new Subscription();
-        var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject;
-        if (refCountSubscription && !refCountSubscription.closed) {
-            subscription.add(new InnerRefCountSubscription(refCountSubscription));
-        }
-        subscription.add(groupSubject.subscribe(subscriber));
-        return subscription;
-    };
-    return GroupedObservable;
-}(Observable));
-export { GroupedObservable };
-var InnerRefCountSubscription = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(InnerRefCountSubscription, _super);
-    function InnerRefCountSubscription(parent) {
-        var _this = _super.call(this) || this;
-        _this.parent = parent;
-        parent.count++;
-        return _this;
-    }
-    InnerRefCountSubscription.prototype.unsubscribe = function () {
-        var parent = this.parent;
-        if (!parent.closed && !this.closed) {
-            _super.prototype.unsubscribe.call(this);
-            parent.count -= 1;
-            if (parent.count === 0 && parent.attemptedToUnsubscribe) {
-                parent.unsubscribe();
-            }
-        }
-    };
-    return InnerRefCountSubscription;
-}(Subscription));
-//# sourceMappingURL=groupBy.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/groupBy.js.map b/node_modules/rxjs/_esm5/internal/operators/groupBy.js.map
deleted file mode 100644
index d726fca..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/groupBy.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"groupBy.js","sources":["../../../src/internal/operators/groupBy.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/ignoreElements.js b/node_modules/rxjs/_esm5/internal/operators/ignoreElements.js
deleted file mode 100644
index 978266c..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/ignoreElements.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function ignoreElements() {
-    return function ignoreElementsOperatorFunction(source) {
-        return source.lift(new IgnoreElementsOperator());
-    };
-}
-var IgnoreElementsOperator = /*@__PURE__*/ (function () {
-    function IgnoreElementsOperator() {
-    }
-    IgnoreElementsOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new IgnoreElementsSubscriber(subscriber));
-    };
-    return IgnoreElementsOperator;
-}());
-var IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(IgnoreElementsSubscriber, _super);
-    function IgnoreElementsSubscriber() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    IgnoreElementsSubscriber.prototype._next = function (unused) {
-    };
-    return IgnoreElementsSubscriber;
-}(Subscriber));
-//# sourceMappingURL=ignoreElements.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/ignoreElements.js.map b/node_modules/rxjs/_esm5/internal/operators/ignoreElements.js.map
deleted file mode 100644
index f81484a..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/ignoreElements.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ignoreElements.js","sources":["../../../src/internal/operators/ignoreElements.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA8B3C,MAAM,UAAU,cAAc;IAC5B,OAAO,SAAS,8BAA8B,CAAC,MAAuB;QACpE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC;AAED;IAAA;IAIA,CAAC;IAHC,qCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAAC;IACpE,CAAC;IACH,6BAAC;AAAD,CAAC,AAJD,IAIC;AAOD;IAA0C,oDAAa;IAAvD;;IAIA,CAAC;IAHW,wCAAK,GAAf,UAAgB,MAAS;IAEzB,CAAC;IACH,+BAAC;AAAD,CAAC,AAJD,CAA0C,UAAU,GAInD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/index.js b/node_modules/rxjs/_esm5/internal/operators/index.js
deleted file mode 100644
index 4c082a1..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/index.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export { audit } from './audit';
-export { auditTime } from './auditTime';
-export { buffer } from './buffer';
-export { bufferCount } from './bufferCount';
-export { bufferTime } from './bufferTime';
-export { bufferToggle } from './bufferToggle';
-export { bufferWhen } from './bufferWhen';
-export { catchError } from './catchError';
-export { combineAll } from './combineAll';
-export { combineLatest } from './combineLatest';
-export { concat } from './concat';
-export { concatAll } from './concatAll';
-export { concatMap } from './concatMap';
-export { concatMapTo } from './concatMapTo';
-export { count } from './count';
-export { debounce } from './debounce';
-export { debounceTime } from './debounceTime';
-export { defaultIfEmpty } from './defaultIfEmpty';
-export { delay } from './delay';
-export { delayWhen } from './delayWhen';
-export { dematerialize } from './dematerialize';
-export { distinct } from './distinct';
-export { distinctUntilChanged } from './distinctUntilChanged';
-export { distinctUntilKeyChanged } from './distinctUntilKeyChanged';
-export { elementAt } from './elementAt';
-export { every } from './every';
-export { exhaust } from './exhaust';
-export { exhaustMap } from './exhaustMap';
-export { expand } from './expand';
-export { filter } from './filter';
-export { finalize } from './finalize';
-export { find } from './find';
-export { findIndex } from './findIndex';
-export { first } from './first';
-export { groupBy } from './groupBy';
-export { ignoreElements } from './ignoreElements';
-export { isEmpty } from './isEmpty';
-export { last } from './last';
-export { map } from './map';
-export { mapTo } from './mapTo';
-export { materialize } from './materialize';
-export { max } from './max';
-export { merge } from './merge';
-export { mergeAll } from './mergeAll';
-export { mergeMap } from './mergeMap';
-export { mergeMap as flatMap } from './mergeMap';
-export { mergeMapTo } from './mergeMapTo';
-export { mergeScan } from './mergeScan';
-export { min } from './min';
-export { multicast } from './multicast';
-export { observeOn } from './observeOn';
-export { onErrorResumeNext } from './onErrorResumeNext';
-export { pairwise } from './pairwise';
-export { partition } from './partition';
-export { pluck } from './pluck';
-export { publish } from './publish';
-export { publishBehavior } from './publishBehavior';
-export { publishLast } from './publishLast';
-export { publishReplay } from './publishReplay';
-export { race } from './race';
-export { reduce } from './reduce';
-export { repeat } from './repeat';
-export { repeatWhen } from './repeatWhen';
-export { retry } from './retry';
-export { retryWhen } from './retryWhen';
-export { refCount } from './refCount';
-export { sample } from './sample';
-export { sampleTime } from './sampleTime';
-export { scan } from './scan';
-export { sequenceEqual } from './sequenceEqual';
-export { share } from './share';
-export { shareReplay } from './shareReplay';
-export { single } from './single';
-export { skip } from './skip';
-export { skipLast } from './skipLast';
-export { skipUntil } from './skipUntil';
-export { skipWhile } from './skipWhile';
-export { startWith } from './startWith';
-export { subscribeOn } from './subscribeOn';
-export { switchAll } from './switchAll';
-export { switchMap } from './switchMap';
-export { switchMapTo } from './switchMapTo';
-export { take } from './take';
-export { takeLast } from './takeLast';
-export { takeUntil } from './takeUntil';
-export { takeWhile } from './takeWhile';
-export { tap } from './tap';
-export { throttle } from './throttle';
-export { throttleTime } from './throttleTime';
-export { timeInterval } from './timeInterval';
-export { timeout } from './timeout';
-export { timeoutWith } from './timeoutWith';
-export { timestamp } from './timestamp';
-export { toArray } from './toArray';
-export { window } from './window';
-export { windowCount } from './windowCount';
-export { windowTime } from './windowTime';
-export { windowToggle } from './windowToggle';
-export { windowWhen } from './windowWhen';
-export { withLatestFrom } from './withLatestFrom';
-export { zip } from './zip';
-export { zipAll } from './zipAll';
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/index.js.map b/node_modules/rxjs/_esm5/internal/operators/index.js.map
deleted file mode 100644
index 9ba5647..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../../src/internal/operators/index.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/isEmpty.js b/node_modules/rxjs/_esm5/internal/operators/isEmpty.js
deleted file mode 100644
index 320dfe7..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/isEmpty.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function isEmpty() {
-    return function (source) { return source.lift(new IsEmptyOperator()); };
-}
-var IsEmptyOperator = /*@__PURE__*/ (function () {
-    function IsEmptyOperator() {
-    }
-    IsEmptyOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new IsEmptySubscriber(observer));
-    };
-    return IsEmptyOperator;
-}());
-var IsEmptySubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(IsEmptySubscriber, _super);
-    function IsEmptySubscriber(destination) {
-        return _super.call(this, destination) || this;
-    }
-    IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) {
-        var destination = this.destination;
-        destination.next(isEmpty);
-        destination.complete();
-    };
-    IsEmptySubscriber.prototype._next = function (value) {
-        this.notifyComplete(false);
-    };
-    IsEmptySubscriber.prototype._complete = function () {
-        this.notifyComplete(true);
-    };
-    return IsEmptySubscriber;
-}(Subscriber));
-//# sourceMappingURL=isEmpty.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/isEmpty.js.map b/node_modules/rxjs/_esm5/internal/operators/isEmpty.js.map
deleted file mode 100644
index 4cd3a66..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/isEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isEmpty.js","sources":["../../../src/internal/operators/isEmpty.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAgE3C,MAAM,UAAU,OAAO;IACrB,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,EAAE,CAAC,EAAlC,CAAkC,CAAC;AACvE,CAAC;AAED;IAAA;IAIA,CAAC;IAHC,8BAAI,GAAJ,UAAM,QAA6B,EAAE,MAAW;QAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,CAAC;IACH,sBAAC;AAAD,CAAC,AAJD,IAIC;AAOD;IAAgC,6CAAe;IAC7C,2BAAY,WAAgC;eAC1C,kBAAM,WAAW,CAAC;IACpB,CAAC;IAEO,0CAAc,GAAtB,UAAuB,OAAgB;QACrC,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAErC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,WAAW,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAES,iCAAK,GAAf,UAAgB,KAAc;QAC5B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAES,qCAAS,GAAnB;QACE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACH,wBAAC;AAAD,CAAC,AAnBD,CAAgC,UAAU,GAmBzC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/last.js b/node_modules/rxjs/_esm5/internal/operators/last.js
deleted file mode 100644
index 2d5d851..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/last.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */
-import { EmptyError } from '../util/EmptyError';
-import { filter } from './filter';
-import { takeLast } from './takeLast';
-import { throwIfEmpty } from './throwIfEmpty';
-import { defaultIfEmpty } from './defaultIfEmpty';
-import { identity } from '../util/identity';
-export function last(predicate, defaultValue) {
-    var hasDefaultValue = arguments.length >= 2;
-    return function (source) { return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, takeLast(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); })); };
-}
-//# sourceMappingURL=last.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/last.js.map b/node_modules/rxjs/_esm5/internal/operators/last.js.map
deleted file mode 100644
index c4fa2b8..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/last.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"last.js","sources":["../../../src/internal/operators/last.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAkC5C,MAAM,UAAU,IAAI,CAClB,SAAgF,EAChF,YAAgB;IAEhB,IAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9C,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAC3C,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAvB,CAAuB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAChE,QAAQ,CAAC,CAAC,CAAC,EACX,eAAe,CAAC,CAAC,CAAC,cAAc,CAAQ,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,cAAM,OAAA,IAAI,UAAU,EAAE,EAAhB,CAAgB,CAAC,CAC7F,EAJiC,CAIjC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/map.js b/node_modules/rxjs/_esm5/internal/operators/map.js
deleted file mode 100644
index 803b6b5..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/map.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function map(project, thisArg) {
-    return function mapOperation(source) {
-        if (typeof project !== 'function') {
-            throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
-        }
-        return source.lift(new MapOperator(project, thisArg));
-    };
-}
-var MapOperator = /*@__PURE__*/ (function () {
-    function MapOperator(project, thisArg) {
-        this.project = project;
-        this.thisArg = thisArg;
-    }
-    MapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
-    };
-    return MapOperator;
-}());
-export { MapOperator };
-var MapSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(MapSubscriber, _super);
-    function MapSubscriber(destination, project, thisArg) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.count = 0;
-        _this.thisArg = thisArg || _this;
-        return _this;
-    }
-    MapSubscriber.prototype._next = function (value) {
-        var result;
-        try {
-            result = this.project.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return MapSubscriber;
-}(Subscriber));
-//# sourceMappingURL=map.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/map.js.map b/node_modules/rxjs/_esm5/internal/operators/map.js.map
deleted file mode 100644
index 7b59f9a..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/map.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"map.js","sources":["../../../src/internal/operators/map.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA2C3C,MAAM,UAAU,GAAG,CAAO,OAAuC,EAAE,OAAa;IAC9E,OAAO,SAAS,YAAY,CAAC,MAAqB;QAChD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;YACjC,MAAM,IAAI,SAAS,CAAC,4DAA4D,CAAC,CAAC;SACnF;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC;AACJ,CAAC;AAED;IACE,qBAAoB,OAAuC,EAAU,OAAY;QAA7D,YAAO,GAAP,OAAO,CAAgC;QAAU,YAAO,GAAP,OAAO,CAAK;IACjF,CAAC;IAED,0BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrF,CAAC;IACH,kBAAC;AAAD,CAAC,AAPD,IAOC;;AAOD;IAAkC,yCAAa;IAI7C,uBAAY,WAA0B,EAClB,OAAuC,EAC/C,OAAY;QAFxB,YAGE,kBAAM,WAAW,CAAC,SAEnB;QAJmB,aAAO,GAAP,OAAO,CAAgC;QAJ3D,WAAK,GAAW,CAAC,CAAC;QAOhB,KAAI,CAAC,OAAO,GAAG,OAAO,IAAI,KAAI,CAAC;;IACjC,CAAC;IAIS,6BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,MAAS,CAAC;QACd,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SAC/D;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACH,oBAAC;AAAD,CAAC,AAvBD,CAAkC,UAAU,GAuB3C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/mapTo.js b/node_modules/rxjs/_esm5/internal/operators/mapTo.js
deleted file mode 100644
index 3a92b45..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/mapTo.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function mapTo(value) {
-    return function (source) { return source.lift(new MapToOperator(value)); };
-}
-var MapToOperator = /*@__PURE__*/ (function () {
-    function MapToOperator(value) {
-        this.value = value;
-    }
-    MapToOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MapToSubscriber(subscriber, this.value));
-    };
-    return MapToOperator;
-}());
-var MapToSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(MapToSubscriber, _super);
-    function MapToSubscriber(destination, value) {
-        var _this = _super.call(this, destination) || this;
-        _this.value = value;
-        return _this;
-    }
-    MapToSubscriber.prototype._next = function (x) {
-        this.destination.next(this.value);
-    };
-    return MapToSubscriber;
-}(Subscriber));
-//# sourceMappingURL=mapTo.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/mapTo.js.map b/node_modules/rxjs/_esm5/internal/operators/mapTo.js.map
deleted file mode 100644
index 8818dbc..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/mapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mapTo.js","sources":["../../../src/internal/operators/mapTo.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAoC3C,MAAM,UAAU,KAAK,CAAO,KAAQ;IAClC,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,EAArC,CAAqC,CAAC;AAC1E,CAAC;AAED;IAIE,uBAAY,KAAQ;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,4BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IACH,oBAAC;AAAD,CAAC,AAXD,IAWC;AAOD;IAAoC,2CAAa;IAI/C,yBAAY,WAA0B,EAAE,KAAQ;QAAhD,YACE,kBAAM,WAAW,CAAC,SAEnB;QADC,KAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;IACrB,CAAC;IAES,+BAAK,GAAf,UAAgB,CAAI;QAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IACH,sBAAC;AAAD,CAAC,AAZD,CAAoC,UAAU,GAY7C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/materialize.js b/node_modules/rxjs/_esm5/internal/operators/materialize.js
deleted file mode 100644
index 6371b5c..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/materialize.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { Notification } from '../Notification';
-export function materialize() {
-    return function materializeOperatorFunction(source) {
-        return source.lift(new MaterializeOperator());
-    };
-}
-var MaterializeOperator = /*@__PURE__*/ (function () {
-    function MaterializeOperator() {
-    }
-    MaterializeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MaterializeSubscriber(subscriber));
-    };
-    return MaterializeOperator;
-}());
-var MaterializeSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(MaterializeSubscriber, _super);
-    function MaterializeSubscriber(destination) {
-        return _super.call(this, destination) || this;
-    }
-    MaterializeSubscriber.prototype._next = function (value) {
-        this.destination.next(Notification.createNext(value));
-    };
-    MaterializeSubscriber.prototype._error = function (err) {
-        var destination = this.destination;
-        destination.next(Notification.createError(err));
-        destination.complete();
-    };
-    MaterializeSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        destination.next(Notification.createComplete());
-        destination.complete();
-    };
-    return MaterializeSubscriber;
-}(Subscriber));
-//# sourceMappingURL=materialize.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/materialize.js.map b/node_modules/rxjs/_esm5/internal/operators/materialize.js.map
deleted file mode 100644
index 9c6c16c..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/materialize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"materialize.js","sources":["../../../src/internal/operators/materialize.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAqD/C,MAAM,UAAU,WAAW;IACzB,OAAO,SAAS,2BAA2B,CAAC,MAAqB;QAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC;AACJ,CAAC;AAED;IAAA;IAIA,CAAC;IAHC,kCAAI,GAAJ,UAAK,UAAuC,EAAE,MAAW;QACvD,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;IACH,0BAAC;AAAD,CAAC,AAJD,IAIC;AAOD;IAAuC,iDAAa;IAClD,+BAAY,WAAwC;eAClD,kBAAM,WAAW,CAAC;IACpB,CAAC;IAES,qCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAES,sCAAM,GAAhB,UAAiB,GAAQ;QACvB,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,WAAW,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAES,yCAAS,GAAnB;QACE,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;QAChD,WAAW,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IACH,4BAAC;AAAD,CAAC,AApBD,CAAuC,UAAU,GAoBhD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/max.js b/node_modules/rxjs/_esm5/internal/operators/max.js
deleted file mode 100644
index f9bac9d..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/max.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */
-import { reduce } from './reduce';
-export function max(comparer) {
-    var max = (typeof comparer === 'function')
-        ? function (x, y) { return comparer(x, y) > 0 ? x : y; }
-        : function (x, y) { return x > y ? x : y; };
-    return reduce(max);
-}
-//# sourceMappingURL=max.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/max.js.map b/node_modules/rxjs/_esm5/internal/operators/max.js.map
deleted file mode 100644
index 77e7d72..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/max.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"max.js","sources":["../../../src/internal/operators/max.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAgDlC,MAAM,UAAU,GAAG,CAAI,QAAiC;IACtD,IAAM,GAAG,GAAsB,CAAC,OAAO,QAAQ,KAAK,UAAU,CAAC;QAC7D,CAAC,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAA1B,CAA0B;QACtC,CAAC,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAb,CAAa,CAAC;IAE5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/merge.js b/node_modules/rxjs/_esm5/internal/operators/merge.js
deleted file mode 100644
index 1db8d08..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/merge.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/** PURE_IMPORTS_START _observable_merge PURE_IMPORTS_END */
-import { merge as mergeStatic } from '../observable/merge';
-export function merge() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function (source) { return source.lift.call(mergeStatic.apply(void 0, [source].concat(observables))); };
-}
-//# sourceMappingURL=merge.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/merge.js.map b/node_modules/rxjs/_esm5/internal/operators/merge.js.map
deleted file mode 100644
index 5df9381..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/merge.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"merge.js","sources":["../../../src/internal/operators/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAsC3D,MAAM,UAAU,KAAK;IAAO,qBAAoE;SAApE,UAAoE,EAApE,qBAAoE,EAApE,IAAoE;QAApE,gCAAoE;;IAC9F,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,gBAAC,MAAM,SAAK,WAAW,GAAE,EAArD,CAAqD,CAAC;AAC1F,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/mergeAll.js b/node_modules/rxjs/_esm5/internal/operators/mergeAll.js
deleted file mode 100644
index da69579..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/mergeAll.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/** PURE_IMPORTS_START _mergeMap,_util_identity PURE_IMPORTS_END */
-import { mergeMap } from './mergeMap';
-import { identity } from '../util/identity';
-export function mergeAll(concurrent) {
-    if (concurrent === void 0) {
-        concurrent = Number.POSITIVE_INFINITY;
-    }
-    return mergeMap(identity, concurrent);
-}
-//# sourceMappingURL=mergeAll.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/mergeAll.js.map b/node_modules/rxjs/_esm5/internal/operators/mergeAll.js.map
deleted file mode 100644
index 43e5690..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/mergeAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeAll.js","sources":["../../../src/internal/operators/mergeAll.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AA6D5C,MAAM,UAAU,QAAQ,CAAI,UAA6C;IAA7C,2BAAA,EAAA,aAAqB,MAAM,CAAC,iBAAiB;IACvE,OAAO,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/mergeMap.js b/node_modules/rxjs/_esm5/internal/operators/mergeMap.js
deleted file mode 100644
index fbd037f..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/mergeMap.js
+++ /dev/null
@@ -1,103 +0,0 @@
-/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber,_map,_observable_from PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { map } from './map';
-import { from } from '../observable/from';
-export function mergeMap(project, resultSelector, concurrent) {
-    if (concurrent === void 0) {
-        concurrent = Number.POSITIVE_INFINITY;
-    }
-    if (typeof resultSelector === 'function') {
-        return function (source) { return source.pipe(mergeMap(function (a, i) { return from(project(a, i)).pipe(map(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); };
-    }
-    else if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-    }
-    return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); };
-}
-var MergeMapOperator = /*@__PURE__*/ (function () {
-    function MergeMapOperator(project, concurrent) {
-        if (concurrent === void 0) {
-            concurrent = Number.POSITIVE_INFINITY;
-        }
-        this.project = project;
-        this.concurrent = concurrent;
-    }
-    MergeMapOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));
-    };
-    return MergeMapOperator;
-}());
-export { MergeMapOperator };
-var MergeMapSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(MergeMapSubscriber, _super);
-    function MergeMapSubscriber(destination, project, concurrent) {
-        if (concurrent === void 0) {
-            concurrent = Number.POSITIVE_INFINITY;
-        }
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.concurrent = concurrent;
-        _this.hasCompleted = false;
-        _this.buffer = [];
-        _this.active = 0;
-        _this.index = 0;
-        return _this;
-    }
-    MergeMapSubscriber.prototype._next = function (value) {
-        if (this.active < this.concurrent) {
-            this._tryNext(value);
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    MergeMapSubscriber.prototype._tryNext = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.active++;
-        this._innerSub(result, value, index);
-    };
-    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {
-        var innerSubscriber = new InnerSubscriber(this, value, index);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        var innerSubscription = subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            destination.add(innerSubscription);
-        }
-    };
-    MergeMapSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        this.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return MergeMapSubscriber;
-}(OuterSubscriber));
-export { MergeMapSubscriber };
-//# sourceMappingURL=mergeMap.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/mergeMap.js.map b/node_modules/rxjs/_esm5/internal/operators/mergeMap.js.map
deleted file mode 100644
index 24302fa..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/mergeMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeMap.js","sources":["../../../src/internal/operators/mergeMap.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/mergeMapTo.js b/node_modules/rxjs/_esm5/internal/operators/mergeMapTo.js
deleted file mode 100644
index 9c898d5..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/mergeMapTo.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */
-import { mergeMap } from './mergeMap';
-export function mergeMapTo(innerObservable, resultSelector, concurrent) {
-    if (concurrent === void 0) {
-        concurrent = Number.POSITIVE_INFINITY;
-    }
-    if (typeof resultSelector === 'function') {
-        return mergeMap(function () { return innerObservable; }, resultSelector, concurrent);
-    }
-    if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-    }
-    return mergeMap(function () { return innerObservable; }, concurrent);
-}
-//# sourceMappingURL=mergeMapTo.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/mergeMapTo.js.map b/node_modules/rxjs/_esm5/internal/operators/mergeMapTo.js.map
deleted file mode 100644
index 5041d0c..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/mergeMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeMapTo.js","sources":["../../../src/internal/operators/mergeMapTo.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAiDtC,MAAM,UAAU,UAAU,CACxB,eAAkB,EAClB,cAAwH,EACxH,UAA6C;IAA7C,2BAAA,EAAA,aAAqB,MAAM,CAAC,iBAAiB;IAE7C,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE;QACxC,OAAO,QAAQ,CAAC,cAAM,OAAA,eAAe,EAAf,CAAe,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;KACpE;IACD,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;QACtC,UAAU,GAAG,cAAc,CAAC;KAC7B;IACD,OAAO,QAAQ,CAAC,cAAM,OAAA,eAAe,EAAf,CAAe,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/mergeScan.js b/node_modules/rxjs/_esm5/internal/operators/mergeScan.js
deleted file mode 100644
index a474e2e..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/mergeScan.js
+++ /dev/null
@@ -1,100 +0,0 @@
-/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-export function mergeScan(accumulator, seed, concurrent) {
-    if (concurrent === void 0) {
-        concurrent = Number.POSITIVE_INFINITY;
-    }
-    return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); };
-}
-var MergeScanOperator = /*@__PURE__*/ (function () {
-    function MergeScanOperator(accumulator, seed, concurrent) {
-        this.accumulator = accumulator;
-        this.seed = seed;
-        this.concurrent = concurrent;
-    }
-    MergeScanOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));
-    };
-    return MergeScanOperator;
-}());
-export { MergeScanOperator };
-var MergeScanSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(MergeScanSubscriber, _super);
-    function MergeScanSubscriber(destination, accumulator, acc, concurrent) {
-        var _this = _super.call(this, destination) || this;
-        _this.accumulator = accumulator;
-        _this.acc = acc;
-        _this.concurrent = concurrent;
-        _this.hasValue = false;
-        _this.hasCompleted = false;
-        _this.buffer = [];
-        _this.active = 0;
-        _this.index = 0;
-        return _this;
-    }
-    MergeScanSubscriber.prototype._next = function (value) {
-        if (this.active < this.concurrent) {
-            var index = this.index++;
-            var destination = this.destination;
-            var ish = void 0;
-            try {
-                var accumulator = this.accumulator;
-                ish = accumulator(this.acc, value, index);
-            }
-            catch (e) {
-                return destination.error(e);
-            }
-            this.active++;
-            this._innerSub(ish, value, index);
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    MergeScanSubscriber.prototype._innerSub = function (ish, value, index) {
-        var innerSubscriber = new InnerSubscriber(this, value, index);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        var innerSubscription = subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            destination.add(innerSubscription);
-        }
-    };
-    MergeScanSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            if (this.hasValue === false) {
-                this.destination.next(this.acc);
-            }
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var destination = this.destination;
-        this.acc = innerValue;
-        this.hasValue = true;
-        destination.next(innerValue);
-    };
-    MergeScanSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            if (this.hasValue === false) {
-                this.destination.next(this.acc);
-            }
-            this.destination.complete();
-        }
-    };
-    return MergeScanSubscriber;
-}(OuterSubscriber));
-export { MergeScanSubscriber };
-//# sourceMappingURL=mergeScan.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/mergeScan.js.map b/node_modules/rxjs/_esm5/internal/operators/mergeScan.js.map
deleted file mode 100644
index 2c70b25..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/mergeScan.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeScan.js","sources":["../../../src/internal/operators/mergeScan.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/min.js b/node_modules/rxjs/_esm5/internal/operators/min.js
deleted file mode 100644
index cbd3c6a..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */
-import { reduce } from './reduce';
-export function min(comparer) {
-    var min = (typeof comparer === 'function')
-        ? function (x, y) { return comparer(x, y) < 0 ? x : y; }
-        : function (x, y) { return x < y ? x : y; };
-    return reduce(min);
-}
-//# sourceMappingURL=min.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/min.js.map b/node_modules/rxjs/_esm5/internal/operators/min.js.map
deleted file mode 100644
index c62a934..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"min.js","sources":["../../../src/internal/operators/min.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AA+ClC,MAAM,UAAU,GAAG,CAAI,QAAiC;IACtD,IAAM,GAAG,GAAsB,CAAC,OAAO,QAAQ,KAAK,UAAU,CAAC;QAC7D,CAAC,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAA1B,CAA0B;QACtC,CAAC,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAb,CAAa,CAAC;IAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/multicast.js b/node_modules/rxjs/_esm5/internal/operators/multicast.js
deleted file mode 100644
index 531728b..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/multicast.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/** PURE_IMPORTS_START _observable_ConnectableObservable PURE_IMPORTS_END */
-import { connectableObservableDescriptor } from '../observable/ConnectableObservable';
-export function multicast(subjectOrSubjectFactory, selector) {
-    return function multicastOperatorFunction(source) {
-        var subjectFactory;
-        if (typeof subjectOrSubjectFactory === 'function') {
-            subjectFactory = subjectOrSubjectFactory;
-        }
-        else {
-            subjectFactory = function subjectFactory() {
-                return subjectOrSubjectFactory;
-            };
-        }
-        if (typeof selector === 'function') {
-            return source.lift(new MulticastOperator(subjectFactory, selector));
-        }
-        var connectable = Object.create(source, connectableObservableDescriptor);
-        connectable.source = source;
-        connectable.subjectFactory = subjectFactory;
-        return connectable;
-    };
-}
-var MulticastOperator = /*@__PURE__*/ (function () {
-    function MulticastOperator(subjectFactory, selector) {
-        this.subjectFactory = subjectFactory;
-        this.selector = selector;
-    }
-    MulticastOperator.prototype.call = function (subscriber, source) {
-        var selector = this.selector;
-        var subject = this.subjectFactory();
-        var subscription = selector(subject).subscribe(subscriber);
-        subscription.add(source.subscribe(subject));
-        return subscription;
-    };
-    return MulticastOperator;
-}());
-export { MulticastOperator };
-//# sourceMappingURL=multicast.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/multicast.js.map b/node_modules/rxjs/_esm5/internal/operators/multicast.js.map
deleted file mode 100644
index 27e4bc9..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/multicast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"multicast.js","sources":["../../../src/internal/operators/multicast.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyB,+BAA+B,EAAE,MAAM,qCAAqC,CAAC;AA6B7G,MAAM,UAAU,SAAS,CAAO,uBAAwD,EACxD,QAAmD;IACjF,OAAO,SAAS,yBAAyB,CAAC,MAAqB;QAC7D,IAAI,cAAgC,CAAC;QACrC,IAAI,OAAO,uBAAuB,KAAK,UAAU,EAAE;YACjD,cAAc,GAAqB,uBAAuB,CAAC;SAC5D;aAAM;YACL,cAAc,GAAG,SAAS,cAAc;gBACtC,OAAmB,uBAAuB,CAAC;YAC7C,CAAC,CAAC;SACH;QAED,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;YAClC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;SACrE;QAED,IAAM,WAAW,GAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;QAChF,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;QAC5B,WAAW,CAAC,cAAc,GAAG,cAAc,CAAC;QAE5C,OAAkC,WAAW,CAAC;IAChD,CAAC,CAAC;AACJ,CAAC;AAED;IACE,2BAAoB,cAAgC,EAChC,QAAkD;QADlD,mBAAc,GAAd,cAAc,CAAkB;QAChC,aAAQ,GAAR,QAAQ,CAA0C;IACtE,CAAC;IACD,gCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACjC,IAAA,wBAAQ,CAAU;QAC1B,IAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACtC,IAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC7D,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,OAAO,YAAY,CAAC;IACtB,CAAC;IACH,wBAAC;AAAD,CAAC,AAXD,IAWC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/observeOn.js b/node_modules/rxjs/_esm5/internal/operators/observeOn.js
deleted file mode 100644
index a5ad11f..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/observeOn.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { Notification } from '../Notification';
-export function observeOn(scheduler, delay) {
-    if (delay === void 0) {
-        delay = 0;
-    }
-    return function observeOnOperatorFunction(source) {
-        return source.lift(new ObserveOnOperator(scheduler, delay));
-    };
-}
-var ObserveOnOperator = /*@__PURE__*/ (function () {
-    function ObserveOnOperator(scheduler, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    ObserveOnOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
-    };
-    return ObserveOnOperator;
-}());
-export { ObserveOnOperator };
-var ObserveOnSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ObserveOnSubscriber, _super);
-    function ObserveOnSubscriber(destination, scheduler, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        var _this = _super.call(this, destination) || this;
-        _this.scheduler = scheduler;
-        _this.delay = delay;
-        return _this;
-    }
-    ObserveOnSubscriber.dispatch = function (arg) {
-        var notification = arg.notification, destination = arg.destination;
-        notification.observe(destination);
-        this.unsubscribe();
-    };
-    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {
-        var destination = this.destination;
-        destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));
-    };
-    ObserveOnSubscriber.prototype._next = function (value) {
-        this.scheduleMessage(Notification.createNext(value));
-    };
-    ObserveOnSubscriber.prototype._error = function (err) {
-        this.scheduleMessage(Notification.createError(err));
-        this.unsubscribe();
-    };
-    ObserveOnSubscriber.prototype._complete = function () {
-        this.scheduleMessage(Notification.createComplete());
-        this.unsubscribe();
-    };
-    return ObserveOnSubscriber;
-}(Subscriber));
-export { ObserveOnSubscriber };
-var ObserveOnMessage = /*@__PURE__*/ (function () {
-    function ObserveOnMessage(notification, destination) {
-        this.notification = notification;
-        this.destination = destination;
-    }
-    return ObserveOnMessage;
-}());
-export { ObserveOnMessage };
-//# sourceMappingURL=observeOn.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/observeOn.js.map b/node_modules/rxjs/_esm5/internal/operators/observeOn.js.map
deleted file mode 100644
index c41d515..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/observeOn.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"observeOn.js","sources":["../../../src/internal/operators/observeOn.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAuD/C,MAAM,UAAU,SAAS,CAAI,SAAwB,EAAE,KAAiB;IAAjB,sBAAA,EAAA,SAAiB;IACtE,OAAO,SAAS,yBAAyB,CAAC,MAAqB;QAC7D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;AACJ,CAAC;AAED;IACE,2BAAoB,SAAwB,EAAU,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAAnD,cAAS,GAAT,SAAS,CAAe;QAAU,UAAK,GAAL,KAAK,CAAY;IACvE,CAAC;IAED,gCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3F,CAAC;IACH,wBAAC;AAAD,CAAC,AAPD,IAOC;;AAOD;IAA4C,+CAAa;IAQvD,6BAAY,WAA0B,EAClB,SAAwB,EACxB,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAFrC,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,eAAS,GAAT,SAAS,CAAe;QACxB,WAAK,GAAL,KAAK,CAAY;;IAErC,CAAC;IAVM,4BAAQ,GAAf,UAAyD,GAAqB;QACpE,IAAA,+BAAY,EAAE,6BAAW,CAAS;QAC1C,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAQO,6CAAe,GAAvB,UAAwB,YAA+B;QACrD,IAAM,WAAW,GAAG,IAAI,CAAC,WAA2B,CAAC;QACrD,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CACrC,mBAAmB,CAAC,QAAQ,EAC5B,IAAI,CAAC,KAAK,EACV,IAAI,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CACrD,CAAC,CAAC;IACL,CAAC;IAES,mCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAES,oCAAM,GAAhB,UAAiB,GAAQ;QACvB,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,uCAAS,GAAnB;QACE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IACH,0BAAC;AAAD,CAAC,AApCD,CAA4C,UAAU,GAoCrD;;AAED;IACE,0BAAmB,YAA+B,EAC/B,WAAiC;QADjC,iBAAY,GAAZ,YAAY,CAAmB;QAC/B,gBAAW,GAAX,WAAW,CAAsB;IACpD,CAAC;IACH,uBAAC;AAAD,CAAC,AAJD,IAIC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/onErrorResumeNext.js b/node_modules/rxjs/_esm5/internal/operators/onErrorResumeNext.js
deleted file mode 100644
index acf1628..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/onErrorResumeNext.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/** PURE_IMPORTS_START tslib,_observable_from,_util_isArray,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { from } from '../observable/from';
-import { isArray } from '../util/isArray';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function onErrorResumeNext() {
-    var nextSources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        nextSources[_i] = arguments[_i];
-    }
-    if (nextSources.length === 1 && isArray(nextSources[0])) {
-        nextSources = nextSources[0];
-    }
-    return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); };
-}
-export function onErrorResumeNextStatic() {
-    var nextSources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        nextSources[_i] = arguments[_i];
-    }
-    var source = null;
-    if (nextSources.length === 1 && isArray(nextSources[0])) {
-        nextSources = nextSources[0];
-    }
-    source = nextSources.shift();
-    return from(source, null).lift(new OnErrorResumeNextOperator(nextSources));
-}
-var OnErrorResumeNextOperator = /*@__PURE__*/ (function () {
-    function OnErrorResumeNextOperator(nextSources) {
-        this.nextSources = nextSources;
-    }
-    OnErrorResumeNextOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));
-    };
-    return OnErrorResumeNextOperator;
-}());
-var OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(OnErrorResumeNextSubscriber, _super);
-    function OnErrorResumeNextSubscriber(destination, nextSources) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.nextSources = nextSources;
-        return _this;
-    }
-    OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) {
-        this.subscribeToNextSource();
-    };
-    OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.subscribeToNextSource();
-    };
-    OnErrorResumeNextSubscriber.prototype._error = function (err) {
-        this.subscribeToNextSource();
-        this.unsubscribe();
-    };
-    OnErrorResumeNextSubscriber.prototype._complete = function () {
-        this.subscribeToNextSource();
-        this.unsubscribe();
-    };
-    OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () {
-        var next = this.nextSources.shift();
-        if (!!next) {
-            var innerSubscriber = new InnerSubscriber(this, undefined, undefined);
-            var destination = this.destination;
-            destination.add(innerSubscriber);
-            var innerSubscription = subscribeToResult(this, next, undefined, undefined, innerSubscriber);
-            if (innerSubscription !== innerSubscriber) {
-                destination.add(innerSubscription);
-            }
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    return OnErrorResumeNextSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=onErrorResumeNext.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/onErrorResumeNext.js.map b/node_modules/rxjs/_esm5/internal/operators/onErrorResumeNext.js.map
deleted file mode 100644
index e4a6512..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/onErrorResumeNext.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"onErrorResumeNext.js","sources":["../../../src/internal/operators/onErrorResumeNext.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/pairwise.js b/node_modules/rxjs/_esm5/internal/operators/pairwise.js
deleted file mode 100644
index 50b742b..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/pairwise.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function pairwise() {
-    return function (source) { return source.lift(new PairwiseOperator()); };
-}
-var PairwiseOperator = /*@__PURE__*/ (function () {
-    function PairwiseOperator() {
-    }
-    PairwiseOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new PairwiseSubscriber(subscriber));
-    };
-    return PairwiseOperator;
-}());
-var PairwiseSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(PairwiseSubscriber, _super);
-    function PairwiseSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasPrev = false;
-        return _this;
-    }
-    PairwiseSubscriber.prototype._next = function (value) {
-        var pair;
-        if (this.hasPrev) {
-            pair = [this.prev, value];
-        }
-        else {
-            this.hasPrev = true;
-        }
-        this.prev = value;
-        if (pair) {
-            this.destination.next(pair);
-        }
-    };
-    return PairwiseSubscriber;
-}(Subscriber));
-//# sourceMappingURL=pairwise.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/pairwise.js.map b/node_modules/rxjs/_esm5/internal/operators/pairwise.js.map
deleted file mode 100644
index b22c563..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/pairwise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pairwise.js","sources":["../../../src/internal/operators/pairwise.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA8C3C,MAAM,UAAU,QAAQ;IACtB,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,EAAE,CAAC,EAAnC,CAAmC,CAAC;AACxE,CAAC;AAED;IAAA;IAIA,CAAC;IAHC,+BAAI,GAAJ,UAAK,UAA8B,EAAE,MAAW;QAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9D,CAAC;IACH,uBAAC;AAAD,CAAC,AAJD,IAIC;AAOD;IAAoC,8CAAa;IAI/C,4BAAY,WAA+B;QAA3C,YACE,kBAAM,WAAW,CAAC,SACnB;QAJO,aAAO,GAAY,KAAK,CAAC;;IAIjC,CAAC;IAED,kCAAK,GAAL,UAAM,KAAQ;QACZ,IAAI,IAAwB,CAAC;QAE7B,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SAC3B;aAAM;YACL,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;SACrB;QAED,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAElB,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7B;IACH,CAAC;IACH,yBAAC;AAAD,CAAC,AAvBD,CAAoC,UAAU,GAuB7C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/partition.js b/node_modules/rxjs/_esm5/internal/operators/partition.js
deleted file mode 100644
index 5dce311..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/partition.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/** PURE_IMPORTS_START _util_not,_filter PURE_IMPORTS_END */
-import { not } from '../util/not';
-import { filter } from './filter';
-export function partition(predicate, thisArg) {
-    return function (source) {
-        return [
-            filter(predicate, thisArg)(source),
-            filter(not(predicate, thisArg))(source)
-        ];
-    };
-}
-//# sourceMappingURL=partition.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/partition.js.map b/node_modules/rxjs/_esm5/internal/operators/partition.js.map
deleted file mode 100644
index 510790b..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/partition.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"partition.js","sources":["../../../src/internal/operators/partition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAoDlC,MAAM,UAAU,SAAS,CAAI,SAA+C,EAC/C,OAAa;IACxC,OAAO,UAAC,MAAqB,IAAK,OAAA;QAChC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAQ,CAAC,CAAC,MAAM,CAAC;KACb,EAHD,CAGC,CAAC;AACtC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/pluck.js b/node_modules/rxjs/_esm5/internal/operators/pluck.js
deleted file mode 100644
index aa1f4da..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/pluck.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/** PURE_IMPORTS_START _map PURE_IMPORTS_END */
-import { map } from './map';
-export function pluck() {
-    var properties = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        properties[_i] = arguments[_i];
-    }
-    var length = properties.length;
-    if (length === 0) {
-        throw new Error('list of properties cannot be empty.');
-    }
-    return function (source) { return map(plucker(properties, length))(source); };
-}
-function plucker(props, length) {
-    var mapper = function (x) {
-        var currentProp = x;
-        for (var i = 0; i < length; i++) {
-            var p = currentProp[props[i]];
-            if (typeof p !== 'undefined') {
-                currentProp = p;
-            }
-            else {
-                return undefined;
-            }
-        }
-        return currentProp;
-    };
-    return mapper;
-}
-//# sourceMappingURL=pluck.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/pluck.js.map b/node_modules/rxjs/_esm5/internal/operators/pluck.js.map
deleted file mode 100644
index d1661b4..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/pluck.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pluck.js","sources":["../../../src/internal/operators/pluck.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AA6C5B,MAAM,UAAU,KAAK;IAAO,oBAAuB;SAAvB,UAAuB,EAAvB,qBAAuB,EAAvB,IAAuB;QAAvB,+BAAuB;;IACjD,IAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IACjC,IAAI,MAAM,KAAK,CAAC,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;KACxD;IACD,OAAO,UAAC,MAAqB,IAAK,OAAA,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,MAAa,CAAC,EAA/C,CAA+C,CAAC;AACpF,CAAC;AAED,SAAS,OAAO,CAAC,KAAe,EAAE,MAAc;IAC9C,IAAM,MAAM,GAAG,UAAC,CAAS;QACvB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YAC/B,IAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;gBAC5B,WAAW,GAAG,CAAC,CAAC;aACjB;iBAAM;gBACL,OAAO,SAAS,CAAC;aAClB;SACF;QACD,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/publish.js b/node_modules/rxjs/_esm5/internal/operators/publish.js
deleted file mode 100644
index 34e283c..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/publish.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */
-import { Subject } from '../Subject';
-import { multicast } from './multicast';
-export function publish(selector) {
-    return selector ?
-        multicast(function () { return new Subject(); }, selector) :
-        multicast(new Subject());
-}
-//# sourceMappingURL=publish.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/publish.js.map b/node_modules/rxjs/_esm5/internal/operators/publish.js.map
deleted file mode 100644
index 7a5f094..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/publish.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publish.js","sources":["../../../src/internal/operators/publish.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA4DxC,MAAM,UAAU,OAAO,CAAO,QAAiC;IAC7D,OAAO,QAAQ,CAAC,CAAC;QACf,SAAS,CAAC,cAAM,OAAA,IAAI,OAAO,EAAK,EAAhB,CAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7C,SAAS,CAAC,IAAI,OAAO,EAAK,CAAC,CAAC;AAChC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/publishBehavior.js b/node_modules/rxjs/_esm5/internal/operators/publishBehavior.js
deleted file mode 100644
index ce55a7f..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/publishBehavior.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */
-import { BehaviorSubject } from '../BehaviorSubject';
-import { multicast } from './multicast';
-export function publishBehavior(value) {
-    return function (source) { return multicast(new BehaviorSubject(value))(source); };
-}
-//# sourceMappingURL=publishBehavior.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/publishBehavior.js.map b/node_modules/rxjs/_esm5/internal/operators/publishBehavior.js.map
deleted file mode 100644
index 00aedd1..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/publishBehavior.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishBehavior.js","sources":["../../../src/internal/operators/publishBehavior.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAUxC,MAAM,UAAU,eAAe,CAAI,KAAQ;IACzC,OAAO,UAAC,MAAqB,IAAK,OAAA,SAAS,CAAC,IAAI,eAAe,CAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAA6B,EAA5E,CAA4E,CAAC;AACjH,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/publishLast.js b/node_modules/rxjs/_esm5/internal/operators/publishLast.js
deleted file mode 100644
index 93ec13e..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/publishLast.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */
-import { AsyncSubject } from '../AsyncSubject';
-import { multicast } from './multicast';
-export function publishLast() {
-    return function (source) { return multicast(new AsyncSubject())(source); };
-}
-//# sourceMappingURL=publishLast.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/publishLast.js.map b/node_modules/rxjs/_esm5/internal/operators/publishLast.js.map
deleted file mode 100644
index 4b63d00..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/publishLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishLast.js","sources":["../../../src/internal/operators/publishLast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA8DxC,MAAM,UAAU,WAAW;IACzB,OAAO,UAAC,MAAqB,IAAK,OAAA,SAAS,CAAC,IAAI,YAAY,EAAK,CAAC,CAAC,MAAM,CAAC,EAAxC,CAAwC,CAAC;AAC7E,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/publishReplay.js b/node_modules/rxjs/_esm5/internal/operators/publishReplay.js
deleted file mode 100644
index 9dfb138..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/publishReplay.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */
-import { ReplaySubject } from '../ReplaySubject';
-import { multicast } from './multicast';
-export function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {
-    if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {
-        scheduler = selectorOrScheduler;
-    }
-    var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;
-    var subject = new ReplaySubject(bufferSize, windowTime, scheduler);
-    return function (source) { return multicast(function () { return subject; }, selector)(source); };
-}
-//# sourceMappingURL=publishReplay.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/publishReplay.js.map b/node_modules/rxjs/_esm5/internal/operators/publishReplay.js.map
deleted file mode 100644
index 74f7dcd..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/publishReplay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishReplay.js","sources":["../../../src/internal/operators/publishReplay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AASxC,MAAM,UAAU,aAAa,CAAO,UAAmB,EACnB,UAAmB,EACnB,mBAA4D,EAC5D,SAAyB;IAE3D,IAAI,mBAAmB,IAAI,OAAO,mBAAmB,KAAK,UAAU,EAAE;QACpE,SAAS,GAAG,mBAAmB,CAAC;KACjC;IAED,IAAM,QAAQ,GAAG,OAAO,mBAAmB,KAAK,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,IAAM,OAAO,GAAG,IAAI,aAAa,CAAI,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAExE,OAAO,UAAC,MAAqB,IAAK,OAAA,SAAS,CAAC,cAAM,OAAA,OAAO,EAAP,CAAO,EAAE,QAAQ,CAAC,CAAC,MAAM,CAA6B,EAAtE,CAAsE,CAAC;AAC3G,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/race.js b/node_modules/rxjs/_esm5/internal/operators/race.js
deleted file mode 100644
index 5168c21..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/race.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/** PURE_IMPORTS_START _util_isArray,_observable_race PURE_IMPORTS_END */
-import { isArray } from '../util/isArray';
-import { race as raceStatic } from '../observable/race';
-export function race() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function raceOperatorFunction(source) {
-        if (observables.length === 1 && isArray(observables[0])) {
-            observables = observables[0];
-        }
-        return source.lift.call(raceStatic.apply(void 0, [source].concat(observables)));
-    };
-}
-//# sourceMappingURL=race.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/race.js.map b/node_modules/rxjs/_esm5/internal/operators/race.js.map
deleted file mode 100644
index 27b66a6..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/race.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"race.js","sources":["../../../src/internal/operators/race.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAsBxD,MAAM,UAAU,IAAI;IAAI,qBAAmD;SAAnD,UAAmD,EAAnD,qBAAmD,EAAnD,IAAmD;QAAnD,gCAAmD;;IACzE,OAAO,SAAS,oBAAoB,CAAC,MAAqB;QAGxD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;YACvD,WAAW,GAAG,WAAW,CAAC,CAAC,CAAoB,CAAC;SACjD;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,gBAAC,MAAM,SAAM,WAA+B,GAAE,CAAC;IACnF,CAAC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/reduce.js b/node_modules/rxjs/_esm5/internal/operators/reduce.js
deleted file mode 100644
index ffd0e00..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/reduce.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */
-import { scan } from './scan';
-import { takeLast } from './takeLast';
-import { defaultIfEmpty } from './defaultIfEmpty';
-import { pipe } from '../util/pipe';
-export function reduce(accumulator, seed) {
-    if (arguments.length >= 2) {
-        return function reduceOperatorFunctionWithSeed(source) {
-            return pipe(scan(accumulator, seed), takeLast(1), defaultIfEmpty(seed))(source);
-        };
-    }
-    return function reduceOperatorFunction(source) {
-        return pipe(scan(function (acc, value, index) { return accumulator(acc, value, index + 1); }), takeLast(1))(source);
-    };
-}
-//# sourceMappingURL=reduce.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/reduce.js.map b/node_modules/rxjs/_esm5/internal/operators/reduce.js.map
deleted file mode 100644
index b8e0bc5..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/reduce.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"reduce.js","sources":["../../../src/internal/operators/reduce.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AA2DpC,MAAM,UAAU,MAAM,CAAO,WAA4D,EAAE,IAAY;IAMrG,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACzB,OAAO,SAAS,8BAA8B,CAAC,MAAqB;YAClE,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAClF,CAAC,CAAC;KACH;IACD,OAAO,SAAS,sBAAsB,CAAC,MAAqB;QAC1D,OAAO,IAAI,CACT,IAAI,CAAW,UAAC,GAAG,EAAE,KAAK,EAAE,KAAK,IAAK,OAAA,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,EAAlC,CAAkC,CAAC,EACzE,QAAQ,CAAC,CAAC,CAAC,CACZ,CAAC,MAAM,CAAC,CAAC;IACZ,CAAC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/refCount.js b/node_modules/rxjs/_esm5/internal/operators/refCount.js
deleted file mode 100644
index f4c6b6a..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/refCount.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function refCount() {
-    return function refCountOperatorFunction(source) {
-        return source.lift(new RefCountOperator(source));
-    };
-}
-var RefCountOperator = /*@__PURE__*/ (function () {
-    function RefCountOperator(connectable) {
-        this.connectable = connectable;
-    }
-    RefCountOperator.prototype.call = function (subscriber, source) {
-        var connectable = this.connectable;
-        connectable._refCount++;
-        var refCounter = new RefCountSubscriber(subscriber, connectable);
-        var subscription = source.subscribe(refCounter);
-        if (!refCounter.closed) {
-            refCounter.connection = connectable.connect();
-        }
-        return subscription;
-    };
-    return RefCountOperator;
-}());
-var RefCountSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(RefCountSubscriber, _super);
-    function RefCountSubscriber(destination, connectable) {
-        var _this = _super.call(this, destination) || this;
-        _this.connectable = connectable;
-        return _this;
-    }
-    RefCountSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (!connectable) {
-            this.connection = null;
-            return;
-        }
-        this.connectable = null;
-        var refCount = connectable._refCount;
-        if (refCount <= 0) {
-            this.connection = null;
-            return;
-        }
-        connectable._refCount = refCount - 1;
-        if (refCount > 1) {
-            this.connection = null;
-            return;
-        }
-        var connection = this.connection;
-        var sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    };
-    return RefCountSubscriber;
-}(Subscriber));
-//# sourceMappingURL=refCount.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/refCount.js.map b/node_modules/rxjs/_esm5/internal/operators/refCount.js.map
deleted file mode 100644
index bd534ca..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/refCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"refCount.js","sources":["../../../src/internal/operators/refCount.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA2D3C,MAAM,UAAU,QAAQ;IACtB,OAAO,SAAS,wBAAwB,CAAC,MAAgC;QACvE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,CAAgC,CAAC;AACnC,CAAC;AAED;IACE,0BAAoB,WAAqC;QAArC,gBAAW,GAAX,WAAW,CAA0B;IACzD,CAAC;IACD,+BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QAEjC,IAAA,8BAAW,CAAU;QACtB,WAAY,CAAC,SAAS,EAAE,CAAC;QAEhC,IAAM,UAAU,GAAG,IAAI,kBAAkB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACnE,IAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAElD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACf,UAAW,CAAC,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;SACvD;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IACH,uBAAC;AAAD,CAAC,AAjBD,IAiBC;AAED;IAAoC,8CAAa;IAI/C,4BAAY,WAA0B,EAClB,WAAqC;QADzD,YAEE,kBAAM,WAAW,CAAC,SACnB;QAFmB,iBAAW,GAAX,WAAW,CAA0B;;IAEzD,CAAC;IAES,yCAAY,GAAtB;QAEU,IAAA,8BAAW,CAAU;QAC7B,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO;SACR;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAM,QAAQ,GAAU,WAAY,CAAC,SAAS,CAAC;QAC/C,IAAI,QAAQ,IAAI,CAAC,EAAE;YACjB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO;SACR;QAEM,WAAY,CAAC,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC7C,IAAI,QAAQ,GAAG,CAAC,EAAE;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO;SACR;QA0BO,IAAA,4BAAU,CAAU;QAC5B,IAAM,gBAAgB,GAAU,WAAY,CAAC,WAAW,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,gBAAgB,IAAI,CAAC,CAAC,UAAU,IAAI,gBAAgB,KAAK,UAAU,CAAC,EAAE;YACxE,gBAAgB,CAAC,WAAW,EAAE,CAAC;SAChC;IACH,CAAC;IACH,yBAAC;AAAD,CAAC,AA9DD,CAAoC,UAAU,GA8D7C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/repeat.js b/node_modules/rxjs/_esm5/internal/operators/repeat.js
deleted file mode 100644
index 7b21c64..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/repeat.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_observable_empty PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { empty } from '../observable/empty';
-export function repeat(count) {
-    if (count === void 0) {
-        count = -1;
-    }
-    return function (source) {
-        if (count === 0) {
-            return empty();
-        }
-        else if (count < 0) {
-            return source.lift(new RepeatOperator(-1, source));
-        }
-        else {
-            return source.lift(new RepeatOperator(count - 1, source));
-        }
-    };
-}
-var RepeatOperator = /*@__PURE__*/ (function () {
-    function RepeatOperator(count, source) {
-        this.count = count;
-        this.source = source;
-    }
-    RepeatOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));
-    };
-    return RepeatOperator;
-}());
-var RepeatSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(RepeatSubscriber, _super);
-    function RepeatSubscriber(destination, count, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.count = count;
-        _this.source = source;
-        return _this;
-    }
-    RepeatSubscriber.prototype.complete = function () {
-        if (!this.isStopped) {
-            var _a = this, source = _a.source, count = _a.count;
-            if (count === 0) {
-                return _super.prototype.complete.call(this);
-            }
-            else if (count > -1) {
-                this.count = count - 1;
-            }
-            source.subscribe(this._unsubscribeAndRecycle());
-        }
-    };
-    return RepeatSubscriber;
-}(Subscriber));
-//# sourceMappingURL=repeat.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/repeat.js.map b/node_modules/rxjs/_esm5/internal/operators/repeat.js.map
deleted file mode 100644
index f3efd03..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/repeat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"repeat.js","sources":["../../../src/internal/operators/repeat.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AA2D5C,MAAM,UAAU,MAAM,CAAI,KAAkB;IAAlB,sBAAA,EAAA,SAAiB,CAAC;IAC1C,OAAO,UAAC,MAAqB;QAC3B,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,OAAO,KAAK,EAAE,CAAC;SAChB;aAAM,IAAI,KAAK,GAAG,CAAC,EAAE;YACpB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;SACpD;aAAM;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;SAC3D;IACH,CAAC,CAAC;AACJ,CAAC;AAED;IACE,wBAAoB,KAAa,EACb,MAAqB;QADrB,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAe;IACzC,CAAC;IACD,6BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACrF,CAAC;IACH,qBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAkC,4CAAa;IAC7C,0BAAY,WAA4B,EACpB,KAAa,EACb,MAAqB;QAFzC,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,WAAK,GAAL,KAAK,CAAQ;QACb,YAAM,GAAN,MAAM,CAAe;;IAEzC,CAAC;IACD,mCAAQ,GAAR;QACE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACb,IAAA,SAAwB,EAAtB,kBAAM,EAAE,gBAAK,CAAU;YAC/B,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,OAAO,iBAAM,QAAQ,WAAE,CAAC;aACzB;iBAAM,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;aACxB;YACD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;SACjD;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAjBD,CAAkC,UAAU,GAiB3C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/repeatWhen.js b/node_modules/rxjs/_esm5/internal/operators/repeatWhen.js
deleted file mode 100644
index c074534..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/repeatWhen.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subject } from '../Subject';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function repeatWhen(notifier) {
-    return function (source) { return source.lift(new RepeatWhenOperator(notifier)); };
-}
-var RepeatWhenOperator = /*@__PURE__*/ (function () {
-    function RepeatWhenOperator(notifier) {
-        this.notifier = notifier;
-    }
-    RepeatWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));
-    };
-    return RepeatWhenOperator;
-}());
-var RepeatWhenSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(RepeatWhenSubscriber, _super);
-    function RepeatWhenSubscriber(destination, notifier, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.notifier = notifier;
-        _this.source = source;
-        _this.sourceIsBeingSubscribedTo = true;
-        return _this;
-    }
-    RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.sourceIsBeingSubscribedTo = true;
-        this.source.subscribe(this);
-    };
-    RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) {
-        if (this.sourceIsBeingSubscribedTo === false) {
-            return _super.prototype.complete.call(this);
-        }
-    };
-    RepeatWhenSubscriber.prototype.complete = function () {
-        this.sourceIsBeingSubscribedTo = false;
-        if (!this.isStopped) {
-            if (!this.retries) {
-                this.subscribeToRetries();
-            }
-            if (!this.retriesSubscription || this.retriesSubscription.closed) {
-                return _super.prototype.complete.call(this);
-            }
-            this._unsubscribeAndRecycle();
-            this.notifications.next();
-        }
-    };
-    RepeatWhenSubscriber.prototype._unsubscribe = function () {
-        var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription;
-        if (notifications) {
-            notifications.unsubscribe();
-            this.notifications = null;
-        }
-        if (retriesSubscription) {
-            retriesSubscription.unsubscribe();
-            this.retriesSubscription = null;
-        }
-        this.retries = null;
-    };
-    RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () {
-        var _unsubscribe = this._unsubscribe;
-        this._unsubscribe = null;
-        _super.prototype._unsubscribeAndRecycle.call(this);
-        this._unsubscribe = _unsubscribe;
-        return this;
-    };
-    RepeatWhenSubscriber.prototype.subscribeToRetries = function () {
-        this.notifications = new Subject();
-        var retries;
-        try {
-            var notifier = this.notifier;
-            retries = notifier(this.notifications);
-        }
-        catch (e) {
-            return _super.prototype.complete.call(this);
-        }
-        this.retries = retries;
-        this.retriesSubscription = subscribeToResult(this, retries);
-    };
-    return RepeatWhenSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=repeatWhen.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/repeatWhen.js.map b/node_modules/rxjs/_esm5/internal/operators/repeatWhen.js.map
deleted file mode 100644
index 39f1dd7..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/repeatWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"repeatWhen.js","sources":["../../../src/internal/operators/repeatWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/retry.js b/node_modules/rxjs/_esm5/internal/operators/retry.js
deleted file mode 100644
index 854f94c..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/retry.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function retry(count) {
-    if (count === void 0) {
-        count = -1;
-    }
-    return function (source) { return source.lift(new RetryOperator(count, source)); };
-}
-var RetryOperator = /*@__PURE__*/ (function () {
-    function RetryOperator(count, source) {
-        this.count = count;
-        this.source = source;
-    }
-    RetryOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));
-    };
-    return RetryOperator;
-}());
-var RetrySubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(RetrySubscriber, _super);
-    function RetrySubscriber(destination, count, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.count = count;
-        _this.source = source;
-        return _this;
-    }
-    RetrySubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var _a = this, source = _a.source, count = _a.count;
-            if (count === 0) {
-                return _super.prototype.error.call(this, err);
-            }
-            else if (count > -1) {
-                this.count = count - 1;
-            }
-            source.subscribe(this._unsubscribeAndRecycle());
-        }
-    };
-    return RetrySubscriber;
-}(Subscriber));
-//# sourceMappingURL=retry.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/retry.js.map b/node_modules/rxjs/_esm5/internal/operators/retry.js.map
deleted file mode 100644
index 0c6331c..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/retry.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"retry.js","sources":["../../../src/internal/operators/retry.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAmD3C,MAAM,UAAU,KAAK,CAAI,KAAkB;IAAlB,sBAAA,EAAA,SAAiB,CAAC;IACzC,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAA7C,CAA6C,CAAC;AAClF,CAAC;AAED;IACE,uBAAoB,KAAa,EACb,MAAqB;QADrB,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAe;IACzC,CAAC;IAED,4BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpF,CAAC;IACH,oBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAiC,2CAAa;IAC5C,yBAAY,WAA4B,EACpB,KAAa,EACb,MAAqB;QAFzC,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,WAAK,GAAL,KAAK,CAAQ;QACb,YAAM,GAAN,MAAM,CAAe;;IAEzC,CAAC;IACD,+BAAK,GAAL,UAAM,GAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACb,IAAA,SAAwB,EAAtB,kBAAM,EAAE,gBAAK,CAAU;YAC/B,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,OAAO,iBAAM,KAAK,YAAC,GAAG,CAAC,CAAC;aACzB;iBAAM,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;aACxB;YACD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;SACjD;IACH,CAAC;IACH,sBAAC;AAAD,CAAC,AAjBD,CAAiC,UAAU,GAiB1C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/retryWhen.js b/node_modules/rxjs/_esm5/internal/operators/retryWhen.js
deleted file mode 100644
index 4cf8853..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/retryWhen.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subject } from '../Subject';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function retryWhen(notifier) {
-    return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); };
-}
-var RetryWhenOperator = /*@__PURE__*/ (function () {
-    function RetryWhenOperator(notifier, source) {
-        this.notifier = notifier;
-        this.source = source;
-    }
-    RetryWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));
-    };
-    return RetryWhenOperator;
-}());
-var RetryWhenSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(RetryWhenSubscriber, _super);
-    function RetryWhenSubscriber(destination, notifier, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.notifier = notifier;
-        _this.source = source;
-        return _this;
-    }
-    RetryWhenSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var errors = this.errors;
-            var retries = this.retries;
-            var retriesSubscription = this.retriesSubscription;
-            if (!retries) {
-                errors = new Subject();
-                try {
-                    var notifier = this.notifier;
-                    retries = notifier(errors);
-                }
-                catch (e) {
-                    return _super.prototype.error.call(this, e);
-                }
-                retriesSubscription = subscribeToResult(this, retries);
-            }
-            else {
-                this.errors = null;
-                this.retriesSubscription = null;
-            }
-            this._unsubscribeAndRecycle();
-            this.errors = errors;
-            this.retries = retries;
-            this.retriesSubscription = retriesSubscription;
-            errors.next(err);
-        }
-    };
-    RetryWhenSubscriber.prototype._unsubscribe = function () {
-        var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription;
-        if (errors) {
-            errors.unsubscribe();
-            this.errors = null;
-        }
-        if (retriesSubscription) {
-            retriesSubscription.unsubscribe();
-            this.retriesSubscription = null;
-        }
-        this.retries = null;
-    };
-    RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var _unsubscribe = this._unsubscribe;
-        this._unsubscribe = null;
-        this._unsubscribeAndRecycle();
-        this._unsubscribe = _unsubscribe;
-        this.source.subscribe(this);
-    };
-    return RetryWhenSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=retryWhen.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/retryWhen.js.map b/node_modules/rxjs/_esm5/internal/operators/retryWhen.js.map
deleted file mode 100644
index 5d602b7..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/retryWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"retryWhen.js","sources":["../../../src/internal/operators/retryWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/sample.js b/node_modules/rxjs/_esm5/internal/operators/sample.js
deleted file mode 100644
index 47f23ee..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/sample.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function sample(notifier) {
-    return function (source) { return source.lift(new SampleOperator(notifier)); };
-}
-var SampleOperator = /*@__PURE__*/ (function () {
-    function SampleOperator(notifier) {
-        this.notifier = notifier;
-    }
-    SampleOperator.prototype.call = function (subscriber, source) {
-        var sampleSubscriber = new SampleSubscriber(subscriber);
-        var subscription = source.subscribe(sampleSubscriber);
-        subscription.add(subscribeToResult(sampleSubscriber, this.notifier));
-        return subscription;
-    };
-    return SampleOperator;
-}());
-var SampleSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SampleSubscriber, _super);
-    function SampleSubscriber() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this.hasValue = false;
-        return _this;
-    }
-    SampleSubscriber.prototype._next = function (value) {
-        this.value = value;
-        this.hasValue = true;
-    };
-    SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.emitValue();
-    };
-    SampleSubscriber.prototype.notifyComplete = function () {
-        this.emitValue();
-    };
-    SampleSubscriber.prototype.emitValue = function () {
-        if (this.hasValue) {
-            this.hasValue = false;
-            this.destination.next(this.value);
-        }
-    };
-    return SampleSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=sample.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/sample.js.map b/node_modules/rxjs/_esm5/internal/operators/sample.js.map
deleted file mode 100644
index be04902..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/sample.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sample.js","sources":["../../../src/internal/operators/sample.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA4C9D,MAAM,UAAU,MAAM,CAAI,QAAyB;IACjD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAzC,CAAyC,CAAC;AAC9E,CAAC;AAED;IACE,wBAAoB,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAC7C,CAAC;IAED,6BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,IAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxD,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrE,OAAO,YAAY,CAAC;IACtB,CAAC;IACH,qBAAC;AAAD,CAAC,AAVD,IAUC;AAOD;IAAqC,4CAAqB;IAA1D;QAAA,qEAyBC;QAvBS,cAAQ,GAAY,KAAK,CAAC;;IAuBpC,CAAC;IArBW,gCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,qCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,yCAAc,GAAd;QACE,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,oCAAS,GAAT;QACE,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACnC;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAzBD,CAAqC,eAAe,GAyBnD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/sampleTime.js b/node_modules/rxjs/_esm5/internal/operators/sampleTime.js
deleted file mode 100644
index 06bef93..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/sampleTime.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { async } from '../scheduler/async';
-export function sampleTime(period, scheduler) {
-    if (scheduler === void 0) {
-        scheduler = async;
-    }
-    return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); };
-}
-var SampleTimeOperator = /*@__PURE__*/ (function () {
-    function SampleTimeOperator(period, scheduler) {
-        this.period = period;
-        this.scheduler = scheduler;
-    }
-    SampleTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));
-    };
-    return SampleTimeOperator;
-}());
-var SampleTimeSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SampleTimeSubscriber, _super);
-    function SampleTimeSubscriber(destination, period, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.period = period;
-        _this.scheduler = scheduler;
-        _this.hasValue = false;
-        _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period }));
-        return _this;
-    }
-    SampleTimeSubscriber.prototype._next = function (value) {
-        this.lastValue = value;
-        this.hasValue = true;
-    };
-    SampleTimeSubscriber.prototype.notifyNext = function () {
-        if (this.hasValue) {
-            this.hasValue = false;
-            this.destination.next(this.lastValue);
-        }
-    };
-    return SampleTimeSubscriber;
-}(Subscriber));
-function dispatchNotification(state) {
-    var subscriber = state.subscriber, period = state.period;
-    subscriber.notifyNext();
-    this.schedule(state, period);
-}
-//# sourceMappingURL=sampleTime.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/sampleTime.js.map b/node_modules/rxjs/_esm5/internal/operators/sampleTime.js.map
deleted file mode 100644
index bcdb4eb..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/sampleTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sampleTime.js","sources":["../../../src/internal/operators/sampleTime.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA6C3C,MAAM,UAAU,UAAU,CAAI,MAAc,EAAE,SAAgC;IAAhC,0BAAA,EAAA,iBAAgC;IAC5E,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAtD,CAAsD,CAAC;AAC3F,CAAC;AAED;IACE,4BAAoB,MAAc,EACd,SAAwB;QADxB,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAAe;IAC5C,CAAC;IAED,iCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7F,CAAC;IACH,yBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAsC,gDAAa;IAIjD,8BAAY,WAA0B,EAClB,MAAc,EACd,SAAwB;QAF5C,YAGE,kBAAM,WAAW,CAAC,SAEnB;QAJmB,YAAM,GAAN,MAAM,CAAQ;QACd,eAAS,GAAT,SAAS,CAAe;QAJ5C,cAAQ,GAAY,KAAK,CAAC;QAMxB,KAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,KAAI,EAAE,MAAM,QAAA,EAAE,CAAC,CAAC,CAAC;;IAC3F,CAAC;IAES,oCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,yCAAU,GAAV;QACE,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACvC;IACH,CAAC;IACH,2BAAC;AAAD,CAAC,AAtBD,CAAsC,UAAU,GAsB/C;AAED,SAAS,oBAAoB,CAAgC,KAAU;IAC/D,IAAA,6BAAU,EAAE,qBAAM,CAAW;IACnC,UAAU,CAAC,UAAU,EAAE,CAAC;IACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/scan.js b/node_modules/rxjs/_esm5/internal/operators/scan.js
deleted file mode 100644
index be7e768..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/scan.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function scan(accumulator, seed) {
-    var hasSeed = false;
-    if (arguments.length >= 2) {
-        hasSeed = true;
-    }
-    return function scanOperatorFunction(source) {
-        return source.lift(new ScanOperator(accumulator, seed, hasSeed));
-    };
-}
-var ScanOperator = /*@__PURE__*/ (function () {
-    function ScanOperator(accumulator, seed, hasSeed) {
-        if (hasSeed === void 0) {
-            hasSeed = false;
-        }
-        this.accumulator = accumulator;
-        this.seed = seed;
-        this.hasSeed = hasSeed;
-    }
-    ScanOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));
-    };
-    return ScanOperator;
-}());
-var ScanSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ScanSubscriber, _super);
-    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {
-        var _this = _super.call(this, destination) || this;
-        _this.accumulator = accumulator;
-        _this._seed = _seed;
-        _this.hasSeed = hasSeed;
-        _this.index = 0;
-        return _this;
-    }
-    Object.defineProperty(ScanSubscriber.prototype, "seed", {
-        get: function () {
-            return this._seed;
-        },
-        set: function (value) {
-            this.hasSeed = true;
-            this._seed = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    ScanSubscriber.prototype._next = function (value) {
-        if (!this.hasSeed) {
-            this.seed = value;
-            this.destination.next(value);
-        }
-        else {
-            return this._tryNext(value);
-        }
-    };
-    ScanSubscriber.prototype._tryNext = function (value) {
-        var index = this.index++;
-        var result;
-        try {
-            result = this.accumulator(this.seed, value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-        this.seed = result;
-        this.destination.next(result);
-    };
-    return ScanSubscriber;
-}(Subscriber));
-//# sourceMappingURL=scan.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/scan.js.map b/node_modules/rxjs/_esm5/internal/operators/scan.js.map
deleted file mode 100644
index f3543ea..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/scan.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scan.js","sources":["../../../src/internal/operators/scan.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAoD3C,MAAM,UAAU,IAAI,CAAO,WAAmD,EAAE,IAAY;IAC1F,IAAI,OAAO,GAAG,KAAK,CAAC;IAMpB,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACzB,OAAO,GAAG,IAAI,CAAC;KAChB;IAED,OAAO,SAAS,oBAAoB,CAAC,MAAqB;QACxD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC;AAED;IACE,sBAAoB,WAAmD,EAAU,IAAY,EAAU,OAAwB;QAAxB,wBAAA,EAAA,eAAwB;QAA3G,gBAAW,GAAX,WAAW,CAAwC;QAAU,SAAI,GAAJ,IAAI,CAAQ;QAAU,YAAO,GAAP,OAAO,CAAiB;IAAG,CAAC;IAEnI,2BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrG,CAAC;IACH,mBAAC;AAAD,CAAC,AAND,IAMC;AAOD;IAAmC,0CAAa;IAY9C,wBAAY,WAA0B,EAAU,WAAmD,EAAU,KAAY,EACrG,OAAgB;QADpC,YAEE,kBAAM,WAAW,CAAC,SACnB;QAH+C,iBAAW,GAAX,WAAW,CAAwC;QAAU,WAAK,GAAL,KAAK,CAAO;QACrG,aAAO,GAAP,OAAO,CAAS;QAZ5B,WAAK,GAAW,CAAC,CAAC;;IAc1B,CAAC;IAZD,sBAAI,gCAAI;aAAR;YACE,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;aAED,UAAS,KAAY;YACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;;;OALA;IAYS,8BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;aAAM;YACL,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAC7B;IACH,CAAC;IAEO,iCAAQ,GAAhB,UAAiB,KAAQ;QACvB,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,MAAW,CAAC;QAChB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,WAAW,CAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SACvD;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;QACD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACH,qBAAC;AAAD,CAAC,AArCD,CAAmC,UAAU,GAqC5C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/sequenceEqual.js b/node_modules/rxjs/_esm5/internal/operators/sequenceEqual.js
deleted file mode 100644
index f22b97c..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/sequenceEqual.js
+++ /dev/null
@@ -1,110 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function sequenceEqual(compareTo, comparator) {
-    return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); };
-}
-var SequenceEqualOperator = /*@__PURE__*/ (function () {
-    function SequenceEqualOperator(compareTo, comparator) {
-        this.compareTo = compareTo;
-        this.comparator = comparator;
-    }
-    SequenceEqualOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator));
-    };
-    return SequenceEqualOperator;
-}());
-export { SequenceEqualOperator };
-var SequenceEqualSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SequenceEqualSubscriber, _super);
-    function SequenceEqualSubscriber(destination, compareTo, comparator) {
-        var _this = _super.call(this, destination) || this;
-        _this.compareTo = compareTo;
-        _this.comparator = comparator;
-        _this._a = [];
-        _this._b = [];
-        _this._oneComplete = false;
-        _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this)));
-        return _this;
-    }
-    SequenceEqualSubscriber.prototype._next = function (value) {
-        if (this._oneComplete && this._b.length === 0) {
-            this.emit(false);
-        }
-        else {
-            this._a.push(value);
-            this.checkValues();
-        }
-    };
-    SequenceEqualSubscriber.prototype._complete = function () {
-        if (this._oneComplete) {
-            this.emit(this._a.length === 0 && this._b.length === 0);
-        }
-        else {
-            this._oneComplete = true;
-        }
-        this.unsubscribe();
-    };
-    SequenceEqualSubscriber.prototype.checkValues = function () {
-        var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator;
-        while (_a.length > 0 && _b.length > 0) {
-            var a = _a.shift();
-            var b = _b.shift();
-            var areEqual = false;
-            try {
-                areEqual = comparator ? comparator(a, b) : a === b;
-            }
-            catch (e) {
-                this.destination.error(e);
-            }
-            if (!areEqual) {
-                this.emit(false);
-            }
-        }
-    };
-    SequenceEqualSubscriber.prototype.emit = function (value) {
-        var destination = this.destination;
-        destination.next(value);
-        destination.complete();
-    };
-    SequenceEqualSubscriber.prototype.nextB = function (value) {
-        if (this._oneComplete && this._a.length === 0) {
-            this.emit(false);
-        }
-        else {
-            this._b.push(value);
-            this.checkValues();
-        }
-    };
-    SequenceEqualSubscriber.prototype.completeB = function () {
-        if (this._oneComplete) {
-            this.emit(this._a.length === 0 && this._b.length === 0);
-        }
-        else {
-            this._oneComplete = true;
-        }
-    };
-    return SequenceEqualSubscriber;
-}(Subscriber));
-export { SequenceEqualSubscriber };
-var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SequenceEqualCompareToSubscriber, _super);
-    function SequenceEqualCompareToSubscriber(destination, parent) {
-        var _this = _super.call(this, destination) || this;
-        _this.parent = parent;
-        return _this;
-    }
-    SequenceEqualCompareToSubscriber.prototype._next = function (value) {
-        this.parent.nextB(value);
-    };
-    SequenceEqualCompareToSubscriber.prototype._error = function (err) {
-        this.parent.error(err);
-        this.unsubscribe();
-    };
-    SequenceEqualCompareToSubscriber.prototype._complete = function () {
-        this.parent.completeB();
-        this.unsubscribe();
-    };
-    return SequenceEqualCompareToSubscriber;
-}(Subscriber));
-//# sourceMappingURL=sequenceEqual.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/sequenceEqual.js.map b/node_modules/rxjs/_esm5/internal/operators/sequenceEqual.js.map
deleted file mode 100644
index e0edce7..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/sequenceEqual.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sequenceEqual.js","sources":["../../../src/internal/operators/sequenceEqual.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/share.js b/node_modules/rxjs/_esm5/internal/operators/share.js
deleted file mode 100644
index 45863eb..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/share.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */
-import { multicast } from './multicast';
-import { refCount } from './refCount';
-import { Subject } from '../Subject';
-function shareSubjectFactory() {
-    return new Subject();
-}
-export function share() {
-    return function (source) { return refCount()(multicast(shareSubjectFactory)(source)); };
-}
-//# sourceMappingURL=share.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/share.js.map b/node_modules/rxjs/_esm5/internal/operators/share.js.map
deleted file mode 100644
index 8946dd6..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/share.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"share.js","sources":["../../../src/internal/operators/share.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAIrC,SAAS,mBAAmB;IAC1B,OAAO,IAAI,OAAO,EAAE,CAAC;AACvB,CAAC;AAcD,MAAM,UAAU,KAAK;IACnB,OAAO,UAAC,MAAqB,IAAK,OAAA,QAAQ,EAAE,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAkB,EAAnE,CAAmE,CAAC;AACxG,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/shareReplay.js b/node_modules/rxjs/_esm5/internal/operators/shareReplay.js
deleted file mode 100644
index 8ced16b..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/shareReplay.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/** PURE_IMPORTS_START _ReplaySubject PURE_IMPORTS_END */
-import { ReplaySubject } from '../ReplaySubject';
-export function shareReplay(configOrBufferSize, windowTime, scheduler) {
-    var config;
-    if (configOrBufferSize && typeof configOrBufferSize === 'object') {
-        config = configOrBufferSize;
-    }
-    else {
-        config = {
-            bufferSize: configOrBufferSize,
-            windowTime: windowTime,
-            refCount: false,
-            scheduler: scheduler
-        };
-    }
-    return function (source) { return source.lift(shareReplayOperator(config)); };
-}
-function shareReplayOperator(_a) {
-    var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler;
-    var subject;
-    var refCount = 0;
-    var subscription;
-    var hasError = false;
-    var isComplete = false;
-    return function shareReplayOperation(source) {
-        refCount++;
-        if (!subject || hasError) {
-            hasError = false;
-            subject = new ReplaySubject(bufferSize, windowTime, scheduler);
-            subscription = source.subscribe({
-                next: function (value) { subject.next(value); },
-                error: function (err) {
-                    hasError = true;
-                    subject.error(err);
-                },
-                complete: function () {
-                    isComplete = true;
-                    subscription = undefined;
-                    subject.complete();
-                },
-            });
-        }
-        var innerSub = subject.subscribe(this);
-        this.add(function () {
-            refCount--;
-            innerSub.unsubscribe();
-            if (subscription && !isComplete && useRefCount && refCount === 0) {
-                subscription.unsubscribe();
-                subscription = undefined;
-                subject = undefined;
-            }
-        });
-    };
-}
-//# sourceMappingURL=shareReplay.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/shareReplay.js.map b/node_modules/rxjs/_esm5/internal/operators/shareReplay.js.map
deleted file mode 100644
index 9ff3b84..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/shareReplay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"shareReplay.js","sources":["../../../src/internal/operators/shareReplay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA2DjD,MAAM,UAAU,WAAW,CACzB,kBAA+C,EAC/C,UAAmB,EACnB,SAAyB;IAEzB,IAAI,MAAyB,CAAC;IAC9B,IAAI,kBAAkB,IAAI,OAAO,kBAAkB,KAAK,QAAQ,EAAE;QAChE,MAAM,GAAG,kBAAuC,CAAC;KAClD;SAAM;QACL,MAAM,GAAG;YACP,UAAU,EAAE,kBAAwC;YACpD,UAAU,YAAA;YACV,QAAQ,EAAE,KAAK;YACf,SAAS,WAAA;SACV,CAAC;KACH;IACD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,EAAxC,CAAwC,CAAC;AAC7E,CAAC;AAED,SAAS,mBAAmB,CAAI,EAKZ;QAJlB,kBAAqC,EAArC,0DAAqC,EACrC,kBAAqC,EAArC,0DAAqC,EACrC,yBAAqB,EACrB,wBAAS;IAET,IAAI,OAAqC,CAAC;IAC1C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,YAAsC,CAAC;IAC3C,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,OAAO,SAAS,oBAAoB,CAAsB,MAAqB;QAC7E,QAAQ,EAAE,CAAC;QACX,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE;YACxB,QAAQ,GAAG,KAAK,CAAC;YACjB,OAAO,GAAG,IAAI,aAAa,CAAI,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;YAClE,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC;gBAC9B,IAAI,YAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACpC,KAAK,YAAC,GAAG;oBACP,QAAQ,GAAG,IAAI,CAAC;oBAChB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,QAAQ;oBACN,UAAU,GAAG,IAAI,CAAC;oBAClB,YAAY,GAAG,SAAS,CAAC;oBACzB,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,CAAC;aACF,CAAC,CAAC;SACJ;QAED,IAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC;YACP,QAAQ,EAAE,CAAC;YACX,QAAQ,CAAC,WAAW,EAAE,CAAC;YACvB,IAAI,YAAY,IAAI,CAAC,UAAU,IAAI,WAAW,IAAI,QAAQ,KAAK,CAAC,EAAE;gBAChE,YAAY,CAAC,WAAW,EAAE,CAAC;gBAC3B,YAAY,GAAG,SAAS,CAAC;gBACzB,OAAO,GAAG,SAAS,CAAC;aACrB;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/single.js b/node_modules/rxjs/_esm5/internal/operators/single.js
deleted file mode 100644
index 35de127..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/single.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_util_EmptyError PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { EmptyError } from '../util/EmptyError';
-export function single(predicate) {
-    return function (source) { return source.lift(new SingleOperator(predicate, source)); };
-}
-var SingleOperator = /*@__PURE__*/ (function () {
-    function SingleOperator(predicate, source) {
-        this.predicate = predicate;
-        this.source = source;
-    }
-    SingleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));
-    };
-    return SingleOperator;
-}());
-var SingleSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SingleSubscriber, _super);
-    function SingleSubscriber(destination, predicate, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.source = source;
-        _this.seenValue = false;
-        _this.index = 0;
-        return _this;
-    }
-    SingleSubscriber.prototype.applySingleValue = function (value) {
-        if (this.seenValue) {
-            this.destination.error('Sequence contains more than one element');
-        }
-        else {
-            this.seenValue = true;
-            this.singleValue = value;
-        }
-    };
-    SingleSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        if (this.predicate) {
-            this.tryNext(value, index);
-        }
-        else {
-            this.applySingleValue(value);
-        }
-    };
-    SingleSubscriber.prototype.tryNext = function (value, index) {
-        try {
-            if (this.predicate(value, index, this.source)) {
-                this.applySingleValue(value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    SingleSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        if (this.index > 0) {
-            destination.next(this.seenValue ? this.singleValue : undefined);
-            destination.complete();
-        }
-        else {
-            destination.error(new EmptyError);
-        }
-    };
-    return SingleSubscriber;
-}(Subscriber));
-//# sourceMappingURL=single.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/single.js.map b/node_modules/rxjs/_esm5/internal/operators/single.js.map
deleted file mode 100644
index 3d87a32..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/single.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"single.js","sources":["../../../src/internal/operators/single.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAkDhD,MAAM,UAAU,MAAM,CAAI,SAAuE;IAC/F,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAlD,CAAkD,CAAC;AACvF,CAAC;AAED;IACE,wBAAoB,SAAuE,EACvE,MAAsB;QADtB,cAAS,GAAT,SAAS,CAA8D;QACvE,WAAM,GAAN,MAAM,CAAgB;IAC1C,CAAC;IAED,6BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACzF,CAAC;IACH,qBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAkC,4CAAa;IAK7C,0BAAY,WAAwB,EAChB,SAAuE,EACvE,MAAsB;QAF1C,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,eAAS,GAAT,SAAS,CAA8D;QACvE,YAAM,GAAN,MAAM,CAAgB;QANlC,eAAS,GAAY,KAAK,CAAC;QAE3B,WAAK,GAAW,CAAC,CAAC;;IAM1B,CAAC;IAEO,2CAAgB,GAAxB,UAAyB,KAAQ;QAC/B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;SACnE;aAAM;YACL,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;SAC1B;IACH,CAAC;IAES,gCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAC5B;aAAM;YACL,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IAEO,kCAAO,GAAf,UAAgB,KAAQ,EAAE,KAAa;QACrC,IAAI;YACF,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;gBAC7C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;aAC9B;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;IACH,CAAC;IAES,oCAAS,GAAnB;QACE,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAErC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;YAClB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAChE,WAAW,CAAC,QAAQ,EAAE,CAAC;SACxB;aAAM;YACL,WAAW,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC;SACnC;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAlDD,CAAkC,UAAU,GAkD3C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/skip.js b/node_modules/rxjs/_esm5/internal/operators/skip.js
deleted file mode 100644
index 9fe4263..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/skip.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function skip(count) {
-    return function (source) { return source.lift(new SkipOperator(count)); };
-}
-var SkipOperator = /*@__PURE__*/ (function () {
-    function SkipOperator(total) {
-        this.total = total;
-    }
-    SkipOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SkipSubscriber(subscriber, this.total));
-    };
-    return SkipOperator;
-}());
-var SkipSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SkipSubscriber, _super);
-    function SkipSubscriber(destination, total) {
-        var _this = _super.call(this, destination) || this;
-        _this.total = total;
-        _this.count = 0;
-        return _this;
-    }
-    SkipSubscriber.prototype._next = function (x) {
-        if (++this.count > this.total) {
-            this.destination.next(x);
-        }
-    };
-    return SkipSubscriber;
-}(Subscriber));
-//# sourceMappingURL=skip.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/skip.js.map b/node_modules/rxjs/_esm5/internal/operators/skip.js.map
deleted file mode 100644
index 812cbea..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/skip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skip.js","sources":["../../../src/internal/operators/skip.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAe3C,MAAM,UAAU,IAAI,CAAI,KAAa;IACnC,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,EAApC,CAAoC,CAAC;AACzE,CAAC;AAED;IACE,sBAAoB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IACjC,CAAC;IAED,2BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IACH,mBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAgC,0CAAa;IAG3C,wBAAY,WAA0B,EAAU,KAAa;QAA7D,YACE,kBAAM,WAAW,CAAC,SACnB;QAF+C,WAAK,GAAL,KAAK,CAAQ;QAF7D,WAAK,GAAW,CAAC,CAAC;;IAIlB,CAAC;IAES,8BAAK,GAAf,UAAgB,CAAI;QAClB,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;YAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC1B;IACH,CAAC;IACH,qBAAC;AAAD,CAAC,AAZD,CAAgC,UAAU,GAYzC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/skipLast.js b/node_modules/rxjs/_esm5/internal/operators/skipLast.js
deleted file mode 100644
index ab9f142..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/skipLast.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
-export function skipLast(count) {
-    return function (source) { return source.lift(new SkipLastOperator(count)); };
-}
-var SkipLastOperator = /*@__PURE__*/ (function () {
-    function SkipLastOperator(_skipCount) {
-        this._skipCount = _skipCount;
-        if (this._skipCount < 0) {
-            throw new ArgumentOutOfRangeError;
-        }
-    }
-    SkipLastOperator.prototype.call = function (subscriber, source) {
-        if (this._skipCount === 0) {
-            return source.subscribe(new Subscriber(subscriber));
-        }
-        else {
-            return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount));
-        }
-    };
-    return SkipLastOperator;
-}());
-var SkipLastSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SkipLastSubscriber, _super);
-    function SkipLastSubscriber(destination, _skipCount) {
-        var _this = _super.call(this, destination) || this;
-        _this._skipCount = _skipCount;
-        _this._count = 0;
-        _this._ring = new Array(_skipCount);
-        return _this;
-    }
-    SkipLastSubscriber.prototype._next = function (value) {
-        var skipCount = this._skipCount;
-        var count = this._count++;
-        if (count < skipCount) {
-            this._ring[count] = value;
-        }
-        else {
-            var currentIndex = count % skipCount;
-            var ring = this._ring;
-            var oldValue = ring[currentIndex];
-            ring[currentIndex] = value;
-            this.destination.next(oldValue);
-        }
-    };
-    return SkipLastSubscriber;
-}(Subscriber));
-//# sourceMappingURL=skipLast.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/skipLast.js.map b/node_modules/rxjs/_esm5/internal/operators/skipLast.js.map
deleted file mode 100644
index bf337d3..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/skipLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipLast.js","sources":["../../../src/internal/operators/skipLast.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AA0C1E,MAAM,UAAU,QAAQ,CAAI,KAAa;IACvC,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAxC,CAAwC,CAAC;AAC7E,CAAC;AAED;IACE,0BAAoB,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;QACpC,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE;YACvB,MAAM,IAAI,uBAAuB,CAAC;SACnC;IACH,CAAC;IAED,+BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;YAGzB,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;SACrD;aAAM;YACL,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;SAC9E;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAhBD,IAgBC;AAOD;IAAoC,8CAAa;IAI/C,4BAAY,WAA0B,EAAU,UAAkB;QAAlE,YACE,kBAAM,WAAW,CAAC,SAEnB;QAH+C,gBAAU,GAAV,UAAU,CAAQ;QAF1D,YAAM,GAAW,CAAC,CAAC;QAIzB,KAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAI,UAAU,CAAC,CAAC;;IACxC,CAAC;IAES,kCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAE5B,IAAI,KAAK,GAAG,SAAS,EAAE;YACrB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;SAC3B;aAAM;YACL,IAAM,YAAY,GAAG,KAAK,GAAG,SAAS,CAAC;YACvC,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YACxB,IAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;YAEpC,IAAI,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACjC;IACH,CAAC;IACH,yBAAC;AAAD,CAAC,AAxBD,CAAoC,UAAU,GAwB7C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/skipUntil.js b/node_modules/rxjs/_esm5/internal/operators/skipUntil.js
deleted file mode 100644
index 09327ff..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/skipUntil.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function skipUntil(notifier) {
-    return function (source) { return source.lift(new SkipUntilOperator(notifier)); };
-}
-var SkipUntilOperator = /*@__PURE__*/ (function () {
-    function SkipUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    SkipUntilOperator.prototype.call = function (destination, source) {
-        return source.subscribe(new SkipUntilSubscriber(destination, this.notifier));
-    };
-    return SkipUntilOperator;
-}());
-var SkipUntilSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SkipUntilSubscriber, _super);
-    function SkipUntilSubscriber(destination, notifier) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasValue = false;
-        var innerSubscriber = new InnerSubscriber(_this, undefined, undefined);
-        _this.add(innerSubscriber);
-        _this.innerSubscription = innerSubscriber;
-        var innerSubscription = subscribeToResult(_this, notifier, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            _this.add(innerSubscription);
-            _this.innerSubscription = innerSubscription;
-        }
-        return _this;
-    }
-    SkipUntilSubscriber.prototype._next = function (value) {
-        if (this.hasValue) {
-            _super.prototype._next.call(this, value);
-        }
-    };
-    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.hasValue = true;
-        if (this.innerSubscription) {
-            this.innerSubscription.unsubscribe();
-        }
-    };
-    SkipUntilSubscriber.prototype.notifyComplete = function () {
-    };
-    return SkipUntilSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=skipUntil.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/skipUntil.js.map b/node_modules/rxjs/_esm5/internal/operators/skipUntil.js.map
deleted file mode 100644
index 50e9113..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/skipUntil.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipUntil.js","sources":["../../../src/internal/operators/skipUntil.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA2C9D,MAAM,UAAU,SAAS,CAAI,QAAyB;IACpD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAA5C,CAA4C,CAAC;AACjF,CAAC;AAED;IACE,2BAAoB,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAC7C,CAAC;IAED,gCAAI,GAAJ,UAAK,WAA0B,EAAE,MAAW;QAC1C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/E,CAAC;IACH,wBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAwC,+CAAqB;IAK3D,6BAAY,WAA0B,EAAE,QAA8B;QAAtE,YACE,kBAAM,WAAW,CAAC,SAYnB;QAhBO,cAAQ,GAAY,KAAK,CAAC;QAKhC,IAAM,eAAe,GAAG,IAAI,eAAe,CAAC,KAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACxE,KAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC1B,KAAI,CAAC,iBAAiB,GAAG,eAAe,CAAC;QACzC,IAAM,iBAAiB,GAAG,iBAAiB,CAAC,KAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAInG,IAAI,iBAAiB,KAAK,eAAe,EAAE;YACzC,KAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC5B,KAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;SAC5C;;IACH,CAAC;IAES,mCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,iBAAM,KAAK,YAAC,KAAK,CAAC,CAAC;SACpB;IACH,CAAC;IAED,wCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC;SACtC;IACH,CAAC;IAED,4CAAc,GAAd;IAEA,CAAC;IACH,0BAAC;AAAD,CAAC,AAtCD,CAAwC,eAAe,GAsCtD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/skipWhile.js b/node_modules/rxjs/_esm5/internal/operators/skipWhile.js
deleted file mode 100644
index ab0ee01..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/skipWhile.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function skipWhile(predicate) {
-    return function (source) { return source.lift(new SkipWhileOperator(predicate)); };
-}
-var SkipWhileOperator = /*@__PURE__*/ (function () {
-    function SkipWhileOperator(predicate) {
-        this.predicate = predicate;
-    }
-    SkipWhileOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));
-    };
-    return SkipWhileOperator;
-}());
-var SkipWhileSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SkipWhileSubscriber, _super);
-    function SkipWhileSubscriber(destination, predicate) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.skipping = true;
-        _this.index = 0;
-        return _this;
-    }
-    SkipWhileSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        if (this.skipping) {
-            this.tryCallPredicate(value);
-        }
-        if (!this.skipping) {
-            destination.next(value);
-        }
-    };
-    SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {
-        try {
-            var result = this.predicate(value, this.index++);
-            this.skipping = Boolean(result);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    return SkipWhileSubscriber;
-}(Subscriber));
-//# sourceMappingURL=skipWhile.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/skipWhile.js.map b/node_modules/rxjs/_esm5/internal/operators/skipWhile.js.map
deleted file mode 100644
index 90f3f04..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/skipWhile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipWhile.js","sources":["../../../src/internal/operators/skipWhile.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAe3C,MAAM,UAAU,SAAS,CAAI,SAA+C;IAC1E,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAA7C,CAA6C,CAAC;AAClF,CAAC;AAED;IACE,2BAAoB,SAA+C;QAA/C,cAAS,GAAT,SAAS,CAAsC;IACnE,CAAC;IAED,gCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/E,CAAC;IACH,wBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAqC,+CAAa;IAIhD,6BAAY,WAA0B,EAClB,SAA+C;QADnE,YAEE,kBAAM,WAAW,CAAC,SACnB;QAFmB,eAAS,GAAT,SAAS,CAAsC;QAJ3D,cAAQ,GAAY,IAAI,CAAC;QACzB,WAAK,GAAW,CAAC,CAAC;;IAK1B,CAAC;IAES,mCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC9B;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACzB;IACH,CAAC;IAEO,8CAAgB,GAAxB,UAAyB,KAAQ;QAC/B,IAAI;YACF,IAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;SACjC;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;IACH,CAAC;IACH,0BAAC;AAAD,CAAC,AA5BD,CAAqC,UAAU,GA4B9C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/startWith.js b/node_modules/rxjs/_esm5/internal/operators/startWith.js
deleted file mode 100644
index fd531b8..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/startWith.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/** PURE_IMPORTS_START _observable_concat,_util_isScheduler PURE_IMPORTS_END */
-import { concat } from '../observable/concat';
-import { isScheduler } from '../util/isScheduler';
-export function startWith() {
-    var array = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        array[_i] = arguments[_i];
-    }
-    var scheduler = array[array.length - 1];
-    if (isScheduler(scheduler)) {
-        array.pop();
-        return function (source) { return concat(array, source, scheduler); };
-    }
-    else {
-        return function (source) { return concat(array, source); };
-    }
-}
-//# sourceMappingURL=startWith.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/startWith.js.map b/node_modules/rxjs/_esm5/internal/operators/startWith.js.map
deleted file mode 100644
index f8afec0..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/startWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"startWith.js","sources":["../../../src/internal/operators/startWith.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAiElD,MAAM,UAAU,SAAS;IAAO,eAAkC;SAAlC,UAAkC,EAAlC,qBAAkC,EAAlC,IAAkC;QAAlC,0BAAkC;;IAChE,IAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAkB,CAAC;IAC3D,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE;QAE1B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,KAAY,EAAE,MAAM,EAAE,SAAS,CAAC,EAAvC,CAAuC,CAAC;KAC3E;SAAM;QACL,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,KAAY,EAAE,MAAM,CAAC,EAA5B,CAA4B,CAAC;KAChE;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/subscribeOn.js b/node_modules/rxjs/_esm5/internal/operators/subscribeOn.js
deleted file mode 100644
index 891ab16..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/subscribeOn.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */
-import { SubscribeOnObservable } from '../observable/SubscribeOnObservable';
-export function subscribeOn(scheduler, delay) {
-    if (delay === void 0) {
-        delay = 0;
-    }
-    return function subscribeOnOperatorFunction(source) {
-        return source.lift(new SubscribeOnOperator(scheduler, delay));
-    };
-}
-var SubscribeOnOperator = /*@__PURE__*/ (function () {
-    function SubscribeOnOperator(scheduler, delay) {
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    SubscribeOnOperator.prototype.call = function (subscriber, source) {
-        return new SubscribeOnObservable(source, this.delay, this.scheduler).subscribe(subscriber);
-    };
-    return SubscribeOnOperator;
-}());
-//# sourceMappingURL=subscribeOn.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/subscribeOn.js.map b/node_modules/rxjs/_esm5/internal/operators/subscribeOn.js.map
deleted file mode 100644
index 7f7ed37..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/subscribeOn.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeOn.js","sources":["../../../src/internal/operators/subscribeOn.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AA6C5E,MAAM,UAAU,WAAW,CAAI,SAAwB,EAAE,KAAiB;IAAjB,sBAAA,EAAA,SAAiB;IACxE,OAAO,SAAS,2BAA2B,CAAC,MAAqB;QAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAI,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC;AAED;IACE,6BAAoB,SAAwB,EACxB,KAAa;QADb,cAAS,GAAT,SAAS,CAAe;QACxB,UAAK,GAAL,KAAK,CAAQ;IACjC,CAAC;IACD,kCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,IAAI,qBAAqB,CAC9B,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CACnC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IACH,0BAAC;AAAD,CAAC,AATD,IASC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/switchAll.js b/node_modules/rxjs/_esm5/internal/operators/switchAll.js
deleted file mode 100644
index ae104cf..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/switchAll.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */
-import { switchMap } from './switchMap';
-import { identity } from '../util/identity';
-export function switchAll() {
-    return switchMap(identity);
-}
-//# sourceMappingURL=switchAll.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/switchAll.js.map b/node_modules/rxjs/_esm5/internal/operators/switchAll.js.map
deleted file mode 100644
index 643e89d..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/switchAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchAll.js","sources":["../../../src/internal/operators/switchAll.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AA4D5C,MAAM,UAAU,SAAS;IACvB,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/switchMap.js b/node_modules/rxjs/_esm5/internal/operators/switchMap.js
deleted file mode 100644
index c0086eb..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/switchMap.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { map } from './map';
-import { from } from '../observable/from';
-export function switchMap(project, resultSelector) {
-    if (typeof resultSelector === 'function') {
-        return function (source) { return source.pipe(switchMap(function (a, i) { return from(project(a, i)).pipe(map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
-    }
-    return function (source) { return source.lift(new SwitchMapOperator(project)); };
-}
-var SwitchMapOperator = /*@__PURE__*/ (function () {
-    function SwitchMapOperator(project) {
-        this.project = project;
-    }
-    SwitchMapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));
-    };
-    return SwitchMapOperator;
-}());
-var SwitchMapSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(SwitchMapSubscriber, _super);
-    function SwitchMapSubscriber(destination, project) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.index = 0;
-        return _this;
-    }
-    SwitchMapSubscriber.prototype._next = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (error) {
-            this.destination.error(error);
-            return;
-        }
-        this._innerSub(result, value, index);
-    };
-    SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {
-        var innerSubscription = this.innerSubscription;
-        if (innerSubscription) {
-            innerSubscription.unsubscribe();
-        }
-        var innerSubscriber = new InnerSubscriber(this, value, index);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        this.innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-        if (this.innerSubscription !== innerSubscriber) {
-            destination.add(this.innerSubscription);
-        }
-    };
-    SwitchMapSubscriber.prototype._complete = function () {
-        var innerSubscription = this.innerSubscription;
-        if (!innerSubscription || innerSubscription.closed) {
-            _super.prototype._complete.call(this);
-        }
-        this.unsubscribe();
-    };
-    SwitchMapSubscriber.prototype._unsubscribe = function () {
-        this.innerSubscription = null;
-    };
-    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.innerSubscription = null;
-        if (this.isStopped) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    return SwitchMapSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=switchMap.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/switchMap.js.map b/node_modules/rxjs/_esm5/internal/operators/switchMap.js.map
deleted file mode 100644
index 51aa8f2..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/switchMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchMap.js","sources":["../../../src/internal/operators/switchMap.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/switchMapTo.js b/node_modules/rxjs/_esm5/internal/operators/switchMapTo.js
deleted file mode 100644
index 19e1251..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/switchMapTo.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */
-import { switchMap } from './switchMap';
-export function switchMapTo(innerObservable, resultSelector) {
-    return resultSelector ? switchMap(function () { return innerObservable; }, resultSelector) : switchMap(function () { return innerObservable; });
-}
-//# sourceMappingURL=switchMapTo.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/switchMapTo.js.map b/node_modules/rxjs/_esm5/internal/operators/switchMapTo.js.map
deleted file mode 100644
index e2a777b..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/switchMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchMapTo.js","sources":["../../../src/internal/operators/switchMapTo.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAkDxC,MAAM,UAAU,WAAW,CACzB,eAAmC,EACnC,cAA4F;IAE5F,OAAO,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,cAAM,OAAA,eAAe,EAAf,CAAe,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,cAAM,OAAA,eAAe,EAAf,CAAe,CAAC,CAAC;AAC9G,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/take.js b/node_modules/rxjs/_esm5/internal/operators/take.js
deleted file mode 100644
index 879122b..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/take.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
-import { empty } from '../observable/empty';
-export function take(count) {
-    return function (source) {
-        if (count === 0) {
-            return empty();
-        }
-        else {
-            return source.lift(new TakeOperator(count));
-        }
-    };
-}
-var TakeOperator = /*@__PURE__*/ (function () {
-    function TakeOperator(total) {
-        this.total = total;
-        if (this.total < 0) {
-            throw new ArgumentOutOfRangeError;
-        }
-    }
-    TakeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeSubscriber(subscriber, this.total));
-    };
-    return TakeOperator;
-}());
-var TakeSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(TakeSubscriber, _super);
-    function TakeSubscriber(destination, total) {
-        var _this = _super.call(this, destination) || this;
-        _this.total = total;
-        _this.count = 0;
-        return _this;
-    }
-    TakeSubscriber.prototype._next = function (value) {
-        var total = this.total;
-        var count = ++this.count;
-        if (count <= total) {
-            this.destination.next(value);
-            if (count === total) {
-                this.destination.complete();
-                this.unsubscribe();
-            }
-        }
-    };
-    return TakeSubscriber;
-}(Subscriber));
-//# sourceMappingURL=take.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/take.js.map b/node_modules/rxjs/_esm5/internal/operators/take.js.map
deleted file mode 100644
index ea5a2ed..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/take.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"take.js","sources":["../../../src/internal/operators/take.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAkD5C,MAAM,UAAU,IAAI,CAAI,KAAa;IACnC,OAAO,UAAC,MAAqB;QAC3B,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,OAAO,KAAK,EAAE,CAAC;SAChB;aAAM;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;SAC7C;IACH,CAAC,CAAC;AACJ,CAAC;AAED;IACE,sBAAoB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QAC/B,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;YAClB,MAAM,IAAI,uBAAuB,CAAC;SACnC;IACH,CAAC;IAED,2BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IACH,mBAAC;AAAD,CAAC,AAVD,IAUC;AAOD;IAAgC,0CAAa;IAG3C,wBAAY,WAA0B,EAAU,KAAa;QAA7D,YACE,kBAAM,WAAW,CAAC,SACnB;QAF+C,WAAK,GAAL,KAAK,CAAQ;QAFrD,WAAK,GAAW,CAAC,CAAC;;IAI1B,CAAC;IAES,8BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAM,KAAK,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;QAC3B,IAAI,KAAK,IAAI,KAAK,EAAE;YAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,KAAK,KAAK,KAAK,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;aACpB;SACF;IACH,CAAC;IACH,qBAAC;AAAD,CAAC,AAlBD,CAAgC,UAAU,GAkBzC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/takeLast.js b/node_modules/rxjs/_esm5/internal/operators/takeLast.js
deleted file mode 100644
index d5d2658..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/takeLast.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
-import { empty } from '../observable/empty';
-export function takeLast(count) {
-    return function takeLastOperatorFunction(source) {
-        if (count === 0) {
-            return empty();
-        }
-        else {
-            return source.lift(new TakeLastOperator(count));
-        }
-    };
-}
-var TakeLastOperator = /*@__PURE__*/ (function () {
-    function TakeLastOperator(total) {
-        this.total = total;
-        if (this.total < 0) {
-            throw new ArgumentOutOfRangeError;
-        }
-    }
-    TakeLastOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeLastSubscriber(subscriber, this.total));
-    };
-    return TakeLastOperator;
-}());
-var TakeLastSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(TakeLastSubscriber, _super);
-    function TakeLastSubscriber(destination, total) {
-        var _this = _super.call(this, destination) || this;
-        _this.total = total;
-        _this.ring = new Array();
-        _this.count = 0;
-        return _this;
-    }
-    TakeLastSubscriber.prototype._next = function (value) {
-        var ring = this.ring;
-        var total = this.total;
-        var count = this.count++;
-        if (ring.length < total) {
-            ring.push(value);
-        }
-        else {
-            var index = count % total;
-            ring[index] = value;
-        }
-    };
-    TakeLastSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        var count = this.count;
-        if (count > 0) {
-            var total = this.count >= this.total ? this.total : this.count;
-            var ring = this.ring;
-            for (var i = 0; i < total; i++) {
-                var idx = (count++) % total;
-                destination.next(ring[idx]);
-            }
-        }
-        destination.complete();
-    };
-    return TakeLastSubscriber;
-}(Subscriber));
-//# sourceMappingURL=takeLast.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/takeLast.js.map b/node_modules/rxjs/_esm5/internal/operators/takeLast.js.map
deleted file mode 100644
index d3a5486..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/takeLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeLast.js","sources":["../../../src/internal/operators/takeLast.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AA8C5C,MAAM,UAAU,QAAQ,CAAI,KAAa;IACvC,OAAO,SAAS,wBAAwB,CAAC,MAAqB;QAC5D,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,OAAO,KAAK,EAAE,CAAC;SAChB;aAAM;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;SACjD;IACH,CAAC,CAAC;AACJ,CAAC;AAED;IACE,0BAAoB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QAC/B,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;YAClB,MAAM,IAAI,uBAAuB,CAAC;SACnC;IACH,CAAC;IAED,+BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1E,CAAC;IACH,uBAAC;AAAD,CAAC,AAVD,IAUC;AAOD;IAAoC,8CAAa;IAI/C,4BAAY,WAA0B,EAAU,KAAa;QAA7D,YACE,kBAAM,WAAW,CAAC,SACnB;QAF+C,WAAK,GAAL,KAAK,CAAQ;QAHrD,UAAI,GAAa,IAAI,KAAK,EAAE,CAAC;QAC7B,WAAK,GAAW,CAAC,CAAC;;IAI1B,CAAC;IAES,kCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAClB;aAAM;YACL,IAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;SACrB;IACH,CAAC;IAES,sCAAS,GAAnB;QACE,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEvB,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YACjE,IAAM,IAAI,GAAI,IAAI,CAAC,IAAI,CAAC;YAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC9B,IAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;gBAC9B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;aAC7B;SACF;QAED,WAAW,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IACH,yBAAC;AAAD,CAAC,AArCD,CAAoC,UAAU,GAqC7C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/takeUntil.js b/node_modules/rxjs/_esm5/internal/operators/takeUntil.js
deleted file mode 100644
index 72ea18e..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/takeUntil.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function takeUntil(notifier) {
-    return function (source) { return source.lift(new TakeUntilOperator(notifier)); };
-}
-var TakeUntilOperator = /*@__PURE__*/ (function () {
-    function TakeUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    TakeUntilOperator.prototype.call = function (subscriber, source) {
-        var takeUntilSubscriber = new TakeUntilSubscriber(subscriber);
-        var notifierSubscription = subscribeToResult(takeUntilSubscriber, this.notifier);
-        if (notifierSubscription && !takeUntilSubscriber.seenValue) {
-            takeUntilSubscriber.add(notifierSubscription);
-            return source.subscribe(takeUntilSubscriber);
-        }
-        return takeUntilSubscriber;
-    };
-    return TakeUntilOperator;
-}());
-var TakeUntilSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(TakeUntilSubscriber, _super);
-    function TakeUntilSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.seenValue = false;
-        return _this;
-    }
-    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.seenValue = true;
-        this.complete();
-    };
-    TakeUntilSubscriber.prototype.notifyComplete = function () {
-    };
-    return TakeUntilSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=takeUntil.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/takeUntil.js.map b/node_modules/rxjs/_esm5/internal/operators/takeUntil.js.map
deleted file mode 100644
index d9411bd..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/takeUntil.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeUntil.js","sources":["../../../src/internal/operators/takeUntil.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA4C9D,MAAM,UAAU,SAAS,CAAI,QAAyB;IACpD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAA5C,CAA4C,CAAC;AACjF,CAAC;AAED;IACE,2BAAoB,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAC7C,CAAC;IAED,gCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,IAAM,mBAAmB,GAAG,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAChE,IAAM,oBAAoB,GAAG,iBAAiB,CAAC,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnF,IAAI,oBAAoB,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE;YAC1D,mBAAmB,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;SAC9C;QACD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACH,wBAAC;AAAD,CAAC,AAbD,IAaC;AAOD;IAAwC,+CAAqB;IAG3D,6BAAY,WAA4B;QAAxC,YACE,kBAAM,WAAW,CAAC,SACnB;QAJD,eAAS,GAAG,KAAK,CAAC;;IAIlB,CAAC;IAED,wCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,4CAAc,GAAd;IAEA,CAAC;IACH,0BAAC;AAAD,CAAC,AAjBD,CAAwC,eAAe,GAiBtD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/takeWhile.js b/node_modules/rxjs/_esm5/internal/operators/takeWhile.js
deleted file mode 100644
index 0d7ed52..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/takeWhile.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-export function takeWhile(predicate, inclusive) {
-    if (inclusive === void 0) {
-        inclusive = false;
-    }
-    return function (source) {
-        return source.lift(new TakeWhileOperator(predicate, inclusive));
-    };
-}
-var TakeWhileOperator = /*@__PURE__*/ (function () {
-    function TakeWhileOperator(predicate, inclusive) {
-        this.predicate = predicate;
-        this.inclusive = inclusive;
-    }
-    TakeWhileOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive));
-    };
-    return TakeWhileOperator;
-}());
-var TakeWhileSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(TakeWhileSubscriber, _super);
-    function TakeWhileSubscriber(destination, predicate, inclusive) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.inclusive = inclusive;
-        _this.index = 0;
-        return _this;
-    }
-    TakeWhileSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        var result;
-        try {
-            result = this.predicate(value, this.index++);
-        }
-        catch (err) {
-            destination.error(err);
-            return;
-        }
-        this.nextOrComplete(value, result);
-    };
-    TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {
-        var destination = this.destination;
-        if (Boolean(predicateResult)) {
-            destination.next(value);
-        }
-        else {
-            if (this.inclusive) {
-                destination.next(value);
-            }
-            destination.complete();
-        }
-    };
-    return TakeWhileSubscriber;
-}(Subscriber));
-//# sourceMappingURL=takeWhile.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/takeWhile.js.map b/node_modules/rxjs/_esm5/internal/operators/takeWhile.js.map
deleted file mode 100644
index e9085ff..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/takeWhile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeWhile.js","sources":["../../../src/internal/operators/takeWhile.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAmD3C,MAAM,UAAU,SAAS,CACrB,SAA+C,EAC/C,SAAiB;IAAjB,0BAAA,EAAA,iBAAiB;IACnB,OAAO,UAAC,MAAqB;QAClB,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAAxD,CAAwD,CAAC;AACtE,CAAC;AAED;IACE,2BACY,SAA+C,EAC/C,SAAkB;QADlB,cAAS,GAAT,SAAS,CAAsC;QAC/C,cAAS,GAAT,SAAS,CAAS;IAAG,CAAC;IAElC,gCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CACnB,IAAI,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3E,CAAC;IACH,wBAAC;AAAD,CAAC,AATD,IASC;AAOD;IAAqC,+CAAa;IAGhD,6BACI,WAA0B,EAClB,SAA+C,EAC/C,SAAkB;QAH9B,YAIE,kBAAM,WAAW,CAAC,SACnB;QAHW,eAAS,GAAT,SAAS,CAAsC;QAC/C,eAAS,GAAT,SAAS,CAAS;QALtB,WAAK,GAAW,CAAC,CAAC;;IAO1B,CAAC;IAES,mCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,MAAe,CAAC;QACpB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SAC9C;QAAC,OAAO,GAAG,EAAE;YACZ,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO;SACR;QACD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAEO,4CAAc,GAAtB,UAAuB,KAAQ,EAAE,eAAwB;QACvD,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE;YAC5B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACzB;aAAM;YACL,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACzB;YACD,WAAW,CAAC,QAAQ,EAAE,CAAC;SACxB;IACH,CAAC;IACH,0BAAC;AAAD,CAAC,AAjCD,CAAqC,UAAU,GAiC9C"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/tap.js b/node_modules/rxjs/_esm5/internal/operators/tap.js
deleted file mode 100644
index 19ab564..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/tap.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_util_noop,_util_isFunction PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { noop } from '../util/noop';
-import { isFunction } from '../util/isFunction';
-export function tap(nextOrObserver, error, complete) {
-    return function tapOperatorFunction(source) {
-        return source.lift(new DoOperator(nextOrObserver, error, complete));
-    };
-}
-var DoOperator = /*@__PURE__*/ (function () {
-    function DoOperator(nextOrObserver, error, complete) {
-        this.nextOrObserver = nextOrObserver;
-        this.error = error;
-        this.complete = complete;
-    }
-    DoOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
-    };
-    return DoOperator;
-}());
-var TapSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(TapSubscriber, _super);
-    function TapSubscriber(destination, observerOrNext, error, complete) {
-        var _this = _super.call(this, destination) || this;
-        _this._tapNext = noop;
-        _this._tapError = noop;
-        _this._tapComplete = noop;
-        _this._tapError = error || noop;
-        _this._tapComplete = complete || noop;
-        if (isFunction(observerOrNext)) {
-            _this._context = _this;
-            _this._tapNext = observerOrNext;
-        }
-        else if (observerOrNext) {
-            _this._context = observerOrNext;
-            _this._tapNext = observerOrNext.next || noop;
-            _this._tapError = observerOrNext.error || noop;
-            _this._tapComplete = observerOrNext.complete || noop;
-        }
-        return _this;
-    }
-    TapSubscriber.prototype._next = function (value) {
-        try {
-            this._tapNext.call(this._context, value);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(value);
-    };
-    TapSubscriber.prototype._error = function (err) {
-        try {
-            this._tapError.call(this._context, err);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.error(err);
-    };
-    TapSubscriber.prototype._complete = function () {
-        try {
-            this._tapComplete.call(this._context);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        return this.destination.complete();
-    };
-    return TapSubscriber;
-}(Subscriber));
-//# sourceMappingURL=tap.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/tap.js.map b/node_modules/rxjs/_esm5/internal/operators/tap.js.map
deleted file mode 100644
index 499d6da..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/tap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"tap.js","sources":["../../../src/internal/operators/tap.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/throttle.js b/node_modules/rxjs/_esm5/internal/operators/throttle.js
deleted file mode 100644
index 8996213..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/throttle.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export var defaultThrottleConfig = {
-    leading: true,
-    trailing: false
-};
-export function throttle(durationSelector, config) {
-    if (config === void 0) {
-        config = defaultThrottleConfig;
-    }
-    return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); };
-}
-var ThrottleOperator = /*@__PURE__*/ (function () {
-    function ThrottleOperator(durationSelector, leading, trailing) {
-        this.durationSelector = durationSelector;
-        this.leading = leading;
-        this.trailing = trailing;
-    }
-    ThrottleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));
-    };
-    return ThrottleOperator;
-}());
-var ThrottleSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ThrottleSubscriber, _super);
-    function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.durationSelector = durationSelector;
-        _this._leading = _leading;
-        _this._trailing = _trailing;
-        _this._hasValue = false;
-        return _this;
-    }
-    ThrottleSubscriber.prototype._next = function (value) {
-        this._hasValue = true;
-        this._sendValue = value;
-        if (!this._throttled) {
-            if (this._leading) {
-                this.send();
-            }
-            else {
-                this.throttle(value);
-            }
-        }
-    };
-    ThrottleSubscriber.prototype.send = function () {
-        var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue;
-        if (_hasValue) {
-            this.destination.next(_sendValue);
-            this.throttle(_sendValue);
-        }
-        this._hasValue = false;
-        this._sendValue = null;
-    };
-    ThrottleSubscriber.prototype.throttle = function (value) {
-        var duration = this.tryDurationSelector(value);
-        if (!!duration) {
-            this.add(this._throttled = subscribeToResult(this, duration));
-        }
-    };
-    ThrottleSubscriber.prototype.tryDurationSelector = function (value) {
-        try {
-            return this.durationSelector(value);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return null;
-        }
-    };
-    ThrottleSubscriber.prototype.throttlingDone = function () {
-        var _a = this, _throttled = _a._throttled, _trailing = _a._trailing;
-        if (_throttled) {
-            _throttled.unsubscribe();
-        }
-        this._throttled = null;
-        if (_trailing) {
-            this.send();
-        }
-    };
-    ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.throttlingDone();
-    };
-    ThrottleSubscriber.prototype.notifyComplete = function () {
-        this.throttlingDone();
-    };
-    return ThrottleSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=throttle.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/throttle.js.map b/node_modules/rxjs/_esm5/internal/operators/throttle.js.map
deleted file mode 100644
index b204d74..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/throttle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throttle.js","sources":["../../../src/internal/operators/throttle.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/throttleTime.js b/node_modules/rxjs/_esm5/internal/operators/throttleTime.js
deleted file mode 100644
index 78a228a..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/throttleTime.js
+++ /dev/null
@@ -1,85 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { async } from '../scheduler/async';
-import { defaultThrottleConfig } from './throttle';
-export function throttleTime(duration, scheduler, config) {
-    if (scheduler === void 0) {
-        scheduler = async;
-    }
-    if (config === void 0) {
-        config = defaultThrottleConfig;
-    }
-    return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); };
-}
-var ThrottleTimeOperator = /*@__PURE__*/ (function () {
-    function ThrottleTimeOperator(duration, scheduler, leading, trailing) {
-        this.duration = duration;
-        this.scheduler = scheduler;
-        this.leading = leading;
-        this.trailing = trailing;
-    }
-    ThrottleTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));
-    };
-    return ThrottleTimeOperator;
-}());
-var ThrottleTimeSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ThrottleTimeSubscriber, _super);
-    function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {
-        var _this = _super.call(this, destination) || this;
-        _this.duration = duration;
-        _this.scheduler = scheduler;
-        _this.leading = leading;
-        _this.trailing = trailing;
-        _this._hasTrailingValue = false;
-        _this._trailingValue = null;
-        return _this;
-    }
-    ThrottleTimeSubscriber.prototype._next = function (value) {
-        if (this.throttled) {
-            if (this.trailing) {
-                this._trailingValue = value;
-                this._hasTrailingValue = true;
-            }
-        }
-        else {
-            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));
-            if (this.leading) {
-                this.destination.next(value);
-            }
-            else if (this.trailing) {
-                this._trailingValue = value;
-                this._hasTrailingValue = true;
-            }
-        }
-    };
-    ThrottleTimeSubscriber.prototype._complete = function () {
-        if (this._hasTrailingValue) {
-            this.destination.next(this._trailingValue);
-            this.destination.complete();
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    ThrottleTimeSubscriber.prototype.clearThrottle = function () {
-        var throttled = this.throttled;
-        if (throttled) {
-            if (this.trailing && this._hasTrailingValue) {
-                this.destination.next(this._trailingValue);
-                this._trailingValue = null;
-                this._hasTrailingValue = false;
-            }
-            throttled.unsubscribe();
-            this.remove(throttled);
-            this.throttled = null;
-        }
-    };
-    return ThrottleTimeSubscriber;
-}(Subscriber));
-function dispatchNext(arg) {
-    var subscriber = arg.subscriber;
-    subscriber.clearThrottle();
-}
-//# sourceMappingURL=throttleTime.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/throttleTime.js.map b/node_modules/rxjs/_esm5/internal/operators/throttleTime.js.map
deleted file mode 100644
index bf5a868..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/throttleTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throttleTime.js","sources":["../../../src/internal/operators/throttleTime.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/throwIfEmpty.js b/node_modules/rxjs/_esm5/internal/operators/throwIfEmpty.js
deleted file mode 100644
index 61e9716..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/throwIfEmpty.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/** PURE_IMPORTS_START tslib,_util_EmptyError,_Subscriber PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { EmptyError } from '../util/EmptyError';
-import { Subscriber } from '../Subscriber';
-export function throwIfEmpty(errorFactory) {
-    if (errorFactory === void 0) {
-        errorFactory = defaultErrorFactory;
-    }
-    return function (source) {
-        return source.lift(new ThrowIfEmptyOperator(errorFactory));
-    };
-}
-var ThrowIfEmptyOperator = /*@__PURE__*/ (function () {
-    function ThrowIfEmptyOperator(errorFactory) {
-        this.errorFactory = errorFactory;
-    }
-    ThrowIfEmptyOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory));
-    };
-    return ThrowIfEmptyOperator;
-}());
-var ThrowIfEmptySubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ThrowIfEmptySubscriber, _super);
-    function ThrowIfEmptySubscriber(destination, errorFactory) {
-        var _this = _super.call(this, destination) || this;
-        _this.errorFactory = errorFactory;
-        _this.hasValue = false;
-        return _this;
-    }
-    ThrowIfEmptySubscriber.prototype._next = function (value) {
-        this.hasValue = true;
-        this.destination.next(value);
-    };
-    ThrowIfEmptySubscriber.prototype._complete = function () {
-        if (!this.hasValue) {
-            var err = void 0;
-            try {
-                err = this.errorFactory();
-            }
-            catch (e) {
-                err = e;
-            }
-            this.destination.error(err);
-        }
-        else {
-            return this.destination.complete();
-        }
-    };
-    return ThrowIfEmptySubscriber;
-}(Subscriber));
-function defaultErrorFactory() {
-    return new EmptyError();
-}
-//# sourceMappingURL=throwIfEmpty.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/throwIfEmpty.js.map b/node_modules/rxjs/_esm5/internal/operators/throwIfEmpty.js.map
deleted file mode 100644
index 9e6c83c..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/throwIfEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throwIfEmpty.js","sources":["../../../src/internal/operators/throwIfEmpty.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAiC3C,MAAM,UAAU,YAAY,CAAK,YAA+C;IAA/C,6BAAA,EAAA,kCAA+C;IAC9E,OAAO,UAAC,MAAqB;QAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAED;IACE,8BAAoB,YAAuB;QAAvB,iBAAY,GAAZ,YAAY,CAAW;IAC3C,CAAC;IAED,mCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACrF,CAAC;IACH,2BAAC;AAAD,CAAC,AAPD,IAOC;AAED;IAAwC,kDAAa;IAGnD,gCAAY,WAA0B,EAAU,YAAuB;QAAvE,YACE,kBAAM,WAAW,CAAC,SACnB;QAF+C,kBAAY,GAAZ,YAAY,CAAW;QAF/D,cAAQ,GAAY,KAAK,CAAC;;IAIlC,CAAC;IAES,sCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAES,0CAAS,GAAnB;QACE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,GAAG,SAAK,CAAC;YACb,IAAI;gBACF,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;aAC3B;YAAC,OAAO,CAAC,EAAE;gBACV,GAAG,GAAG,CAAC,CAAC;aACT;YACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;aAAM;YACH,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SACtC;IACH,CAAC;IACH,6BAAC;AAAD,CAAC,AAzBD,CAAwC,UAAU,GAyBjD;AAED,SAAS,mBAAmB;IAC1B,OAAO,IAAI,UAAU,EAAE,CAAC;AAC1B,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/timeInterval.js b/node_modules/rxjs/_esm5/internal/operators/timeInterval.js
deleted file mode 100644
index f2190b6..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/timeInterval.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */
-import { async } from '../scheduler/async';
-import { scan } from './scan';
-import { defer } from '../observable/defer';
-import { map } from './map';
-export function timeInterval(scheduler) {
-    if (scheduler === void 0) {
-        scheduler = async;
-    }
-    return function (source) {
-        return defer(function () {
-            return source.pipe(scan(function (_a, value) {
-                var current = _a.current;
-                return ({ value: value, current: scheduler.now(), last: current });
-            }, { current: scheduler.now(), value: undefined, last: undefined }), map(function (_a) {
-                var current = _a.current, last = _a.last, value = _a.value;
-                return new TimeInterval(value, current - last);
-            }));
-        });
-    };
-}
-var TimeInterval = /*@__PURE__*/ (function () {
-    function TimeInterval(value, interval) {
-        this.value = value;
-        this.interval = interval;
-    }
-    return TimeInterval;
-}());
-export { TimeInterval };
-//# sourceMappingURL=timeInterval.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/timeInterval.js.map b/node_modules/rxjs/_esm5/internal/operators/timeInterval.js.map
deleted file mode 100644
index 08d9db8..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/timeInterval.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeInterval.js","sources":["../../../src/internal/operators/timeInterval.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AA+C5B,MAAM,UAAU,YAAY,CAAI,SAAgC;IAAhC,0BAAA,EAAA,iBAAgC;IAC9D,OAAO,UAAC,MAAqB,IAAK,OAAA,KAAK,CAAC;QACtC,OAAO,MAAM,CAAC,IAAI,CAEhB,IAAI,CACF,UAAC,EAAW,EAAE,KAAK;gBAAhB,oBAAO;YAAc,OAAA,CAAC,EAAE,KAAK,OAAA,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAApD,CAAoD,EAC5E,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAG,IAAI,EAAE,SAAS,EAAE,CAC1D,EACR,GAAG,CAAuB,UAAC,EAAwB;gBAAtB,oBAAO,EAAE,cAAI,EAAE,gBAAK;YAAO,OAAA,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;QAAvC,CAAuC,CAAC,CACjG,CAAC;IACJ,CAAC,CAAC,EATgC,CAShC,CAAC;AACL,CAAC;AAQD;IACE,sBAAmB,KAAQ,EAAS,QAAgB;QAAjC,UAAK,GAAL,KAAK,CAAG;QAAS,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAC1D,mBAAC;AAAD,CAAC,AAFD,IAEC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/timeout.js b/node_modules/rxjs/_esm5/internal/operators/timeout.js
deleted file mode 100644
index 47bbebc..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/timeout.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */
-import { async } from '../scheduler/async';
-import { TimeoutError } from '../util/TimeoutError';
-import { timeoutWith } from './timeoutWith';
-import { throwError } from '../observable/throwError';
-export function timeout(due, scheduler) {
-    if (scheduler === void 0) {
-        scheduler = async;
-    }
-    return timeoutWith(due, throwError(new TimeoutError()), scheduler);
-}
-//# sourceMappingURL=timeout.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/timeout.js.map b/node_modules/rxjs/_esm5/internal/operators/timeout.js.map
deleted file mode 100644
index a67d267..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/timeout.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeout.js","sources":["../../../src/internal/operators/timeout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAK3C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAgFtD,MAAM,UAAU,OAAO,CAAI,GAAkB,EAClB,SAAgC;IAAhC,0BAAA,EAAA,iBAAgC;IACzD,OAAO,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,YAAY,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AACrE,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/timeoutWith.js b/node_modules/rxjs/_esm5/internal/operators/timeoutWith.js
deleted file mode 100644
index 47cd28c..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/timeoutWith.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { async } from '../scheduler/async';
-import { isDate } from '../util/isDate';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function timeoutWith(due, withObservable, scheduler) {
-    if (scheduler === void 0) {
-        scheduler = async;
-    }
-    return function (source) {
-        var absoluteTimeout = isDate(due);
-        var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);
-        return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));
-    };
-}
-var TimeoutWithOperator = /*@__PURE__*/ (function () {
-    function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) {
-        this.waitFor = waitFor;
-        this.absoluteTimeout = absoluteTimeout;
-        this.withObservable = withObservable;
-        this.scheduler = scheduler;
-    }
-    TimeoutWithOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler));
-    };
-    return TimeoutWithOperator;
-}());
-var TimeoutWithSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(TimeoutWithSubscriber, _super);
-    function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.absoluteTimeout = absoluteTimeout;
-        _this.waitFor = waitFor;
-        _this.withObservable = withObservable;
-        _this.scheduler = scheduler;
-        _this.action = null;
-        _this.scheduleTimeout();
-        return _this;
-    }
-    TimeoutWithSubscriber.dispatchTimeout = function (subscriber) {
-        var withObservable = subscriber.withObservable;
-        subscriber._unsubscribeAndRecycle();
-        subscriber.add(subscribeToResult(subscriber, withObservable));
-    };
-    TimeoutWithSubscriber.prototype.scheduleTimeout = function () {
-        var action = this.action;
-        if (action) {
-            this.action = action.schedule(this, this.waitFor);
-        }
-        else {
-            this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this));
-        }
-    };
-    TimeoutWithSubscriber.prototype._next = function (value) {
-        if (!this.absoluteTimeout) {
-            this.scheduleTimeout();
-        }
-        _super.prototype._next.call(this, value);
-    };
-    TimeoutWithSubscriber.prototype._unsubscribe = function () {
-        this.action = null;
-        this.scheduler = null;
-        this.withObservable = null;
-    };
-    return TimeoutWithSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=timeoutWith.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/timeoutWith.js.map b/node_modules/rxjs/_esm5/internal/operators/timeoutWith.js.map
deleted file mode 100644
index 8bb331a..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/timeoutWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeoutWith.js","sources":["../../../src/internal/operators/timeoutWith.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/timestamp.js b/node_modules/rxjs/_esm5/internal/operators/timestamp.js
deleted file mode 100644
index 693f891..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/timestamp.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/** PURE_IMPORTS_START _scheduler_async,_map PURE_IMPORTS_END */
-import { async } from '../scheduler/async';
-import { map } from './map';
-export function timestamp(scheduler) {
-    if (scheduler === void 0) {
-        scheduler = async;
-    }
-    return map(function (value) { return new Timestamp(value, scheduler.now()); });
-}
-var Timestamp = /*@__PURE__*/ (function () {
-    function Timestamp(value, timestamp) {
-        this.value = value;
-        this.timestamp = timestamp;
-    }
-    return Timestamp;
-}());
-export { Timestamp };
-//# sourceMappingURL=timestamp.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/timestamp.js.map b/node_modules/rxjs/_esm5/internal/operators/timestamp.js.map
deleted file mode 100644
index c09bcac..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/timestamp.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timestamp.js","sources":["../../../src/internal/operators/timestamp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAoC5B,MAAM,UAAU,SAAS,CAAI,SAAgC;IAAhC,0BAAA,EAAA,iBAAgC;IAC3D,OAAO,GAAG,CAAC,UAAC,KAAQ,IAAK,OAAA,IAAI,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,EAArC,CAAqC,CAAC,CAAC;AAElE,CAAC;AAED;IACE,mBAAmB,KAAQ,EAAS,SAAiB;QAAlC,UAAK,GAAL,KAAK,CAAG;QAAS,cAAS,GAAT,SAAS,CAAQ;IACrD,CAAC;IACH,gBAAC;AAAD,CAAC,AAHD,IAGC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/toArray.js b/node_modules/rxjs/_esm5/internal/operators/toArray.js
deleted file mode 100644
index 7e10933..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/toArray.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */
-import { reduce } from './reduce';
-function toArrayReducer(arr, item, index) {
-    if (index === 0) {
-        return [item];
-    }
-    arr.push(item);
-    return arr;
-}
-export function toArray() {
-    return reduce(toArrayReducer, []);
-}
-//# sourceMappingURL=toArray.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/toArray.js.map b/node_modules/rxjs/_esm5/internal/operators/toArray.js.map
deleted file mode 100644
index c129b66..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/toArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"toArray.js","sources":["../../../src/internal/operators/toArray.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,SAAS,cAAc,CAAI,GAAQ,EAAE,IAAO,EAAE,KAAa;IACzD,IAAI,KAAK,KAAK,CAAC,EAAE;QACf,OAAO,CAAC,IAAI,CAAC,CAAC;KACf;IACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC;AAiCD,MAAM,UAAU,OAAO;IACrB,OAAO,MAAM,CAAC,cAAc,EAAE,EAAS,CAAC,CAAC;AAC3C,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/window.js b/node_modules/rxjs/_esm5/internal/operators/window.js
deleted file mode 100644
index 0b1f46a..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/window.js
+++ /dev/null
@@ -1,67 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subject } from '../Subject';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function window(windowBoundaries) {
-    return function windowOperatorFunction(source) {
-        return source.lift(new WindowOperator(windowBoundaries));
-    };
-}
-var WindowOperator = /*@__PURE__*/ (function () {
-    function WindowOperator(windowBoundaries) {
-        this.windowBoundaries = windowBoundaries;
-    }
-    WindowOperator.prototype.call = function (subscriber, source) {
-        var windowSubscriber = new WindowSubscriber(subscriber);
-        var sourceSubscription = source.subscribe(windowSubscriber);
-        if (!sourceSubscription.closed) {
-            windowSubscriber.add(subscribeToResult(windowSubscriber, this.windowBoundaries));
-        }
-        return sourceSubscription;
-    };
-    return WindowOperator;
-}());
-var WindowSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(WindowSubscriber, _super);
-    function WindowSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.window = new Subject();
-        destination.next(_this.window);
-        return _this;
-    }
-    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openWindow();
-    };
-    WindowSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
-        this._complete();
-    };
-    WindowSubscriber.prototype._next = function (value) {
-        this.window.next(value);
-    };
-    WindowSubscriber.prototype._error = function (err) {
-        this.window.error(err);
-        this.destination.error(err);
-    };
-    WindowSubscriber.prototype._complete = function () {
-        this.window.complete();
-        this.destination.complete();
-    };
-    WindowSubscriber.prototype._unsubscribe = function () {
-        this.window = null;
-    };
-    WindowSubscriber.prototype.openWindow = function () {
-        var prevWindow = this.window;
-        if (prevWindow) {
-            prevWindow.complete();
-        }
-        var destination = this.destination;
-        var newWindow = this.window = new Subject();
-        destination.next(newWindow);
-    };
-    return WindowSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=window.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/window.js.map b/node_modules/rxjs/_esm5/internal/operators/window.js.map
deleted file mode 100644
index 8c9abeb..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/window.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"window.js","sources":["../../../src/internal/operators/window.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA8C9D,MAAM,UAAU,MAAM,CAAI,gBAAiC;IACzD,OAAO,SAAS,sBAAsB,CAAC,MAAqB;QAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC;AACJ,CAAC;AAED;IAEE,wBAAoB,gBAAiC;QAAjC,qBAAgB,GAAhB,gBAAgB,CAAiB;IACrD,CAAC;IAED,6BAAI,GAAJ,UAAK,UAAqC,EAAE,MAAW;QACrD,IAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAM,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC9D,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YAC9B,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;SAClF;QACD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACH,qBAAC;AAAD,CAAC,AAbD,IAaC;AAOD;IAAkC,4CAAuB;IAIvD,0BAAY,WAAsC;QAAlD,YACE,kBAAM,WAAW,CAAC,SAEnB;QALO,YAAM,GAAe,IAAI,OAAO,EAAK,CAAC;QAI5C,WAAW,CAAC,IAAI,CAAC,KAAI,CAAC,MAAM,CAAC,CAAC;;IAChC,CAAC;IAED,qCAAU,GAAV,UAAW,UAAa,EAAE,UAAe,EAC9B,UAAkB,EAAE,UAAkB,EACtC,QAAiC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,sCAAW,GAAX,UAAY,KAAU,EAAE,QAAiC;QACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,yCAAc,GAAd,UAAe,QAAiC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAES,gCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAES,iCAAM,GAAhB,UAAiB,GAAQ;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAES,oCAAS,GAAnB;QACE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAGD,uCAAY,GAAZ;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAEO,qCAAU,GAAlB;QACE,IAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC/B,IAAI,UAAU,EAAE;YACd,UAAU,CAAC,QAAQ,EAAE,CAAC;SACvB;QACD,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAK,CAAC;QACjD,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IACH,uBAAC;AAAD,CAAC,AAnDD,CAAkC,eAAe,GAmDhD"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/windowCount.js b/node_modules/rxjs/_esm5/internal/operators/windowCount.js
deleted file mode 100644
index c8b0068..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/windowCount.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscriber,_Subject PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscriber } from '../Subscriber';
-import { Subject } from '../Subject';
-export function windowCount(windowSize, startWindowEvery) {
-    if (startWindowEvery === void 0) {
-        startWindowEvery = 0;
-    }
-    return function windowCountOperatorFunction(source) {
-        return source.lift(new WindowCountOperator(windowSize, startWindowEvery));
-    };
-}
-var WindowCountOperator = /*@__PURE__*/ (function () {
-    function WindowCountOperator(windowSize, startWindowEvery) {
-        this.windowSize = windowSize;
-        this.startWindowEvery = startWindowEvery;
-    }
-    WindowCountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));
-    };
-    return WindowCountOperator;
-}());
-var WindowCountSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(WindowCountSubscriber, _super);
-    function WindowCountSubscriber(destination, windowSize, startWindowEvery) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.windowSize = windowSize;
-        _this.startWindowEvery = startWindowEvery;
-        _this.windows = [new Subject()];
-        _this.count = 0;
-        destination.next(_this.windows[0]);
-        return _this;
-    }
-    WindowCountSubscriber.prototype._next = function (value) {
-        var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;
-        var destination = this.destination;
-        var windowSize = this.windowSize;
-        var windows = this.windows;
-        var len = windows.length;
-        for (var i = 0; i < len && !this.closed; i++) {
-            windows[i].next(value);
-        }
-        var c = this.count - windowSize + 1;
-        if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {
-            windows.shift().complete();
-        }
-        if (++this.count % startWindowEvery === 0 && !this.closed) {
-            var window_1 = new Subject();
-            windows.push(window_1);
-            destination.next(window_1);
-        }
-    };
-    WindowCountSubscriber.prototype._error = function (err) {
-        var windows = this.windows;
-        if (windows) {
-            while (windows.length > 0 && !this.closed) {
-                windows.shift().error(err);
-            }
-        }
-        this.destination.error(err);
-    };
-    WindowCountSubscriber.prototype._complete = function () {
-        var windows = this.windows;
-        if (windows) {
-            while (windows.length > 0 && !this.closed) {
-                windows.shift().complete();
-            }
-        }
-        this.destination.complete();
-    };
-    WindowCountSubscriber.prototype._unsubscribe = function () {
-        this.count = 0;
-        this.windows = null;
-    };
-    return WindowCountSubscriber;
-}(Subscriber));
-//# sourceMappingURL=windowCount.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/windowCount.js.map b/node_modules/rxjs/_esm5/internal/operators/windowCount.js.map
deleted file mode 100644
index 918887c..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/windowCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowCount.js","sources":["../../../src/internal/operators/windowCount.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/windowTime.js b/node_modules/rxjs/_esm5/internal/operators/windowTime.js
deleted file mode 100644
index f5482e9..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/windowTime.js
+++ /dev/null
@@ -1,155 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subject,_scheduler_async,_Subscriber,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subject } from '../Subject';
-import { async } from '../scheduler/async';
-import { Subscriber } from '../Subscriber';
-import { isNumeric } from '../util/isNumeric';
-import { isScheduler } from '../util/isScheduler';
-export function windowTime(windowTimeSpan) {
-    var scheduler = async;
-    var windowCreationInterval = null;
-    var maxWindowSize = Number.POSITIVE_INFINITY;
-    if (isScheduler(arguments[3])) {
-        scheduler = arguments[3];
-    }
-    if (isScheduler(arguments[2])) {
-        scheduler = arguments[2];
-    }
-    else if (isNumeric(arguments[2])) {
-        maxWindowSize = arguments[2];
-    }
-    if (isScheduler(arguments[1])) {
-        scheduler = arguments[1];
-    }
-    else if (isNumeric(arguments[1])) {
-        windowCreationInterval = arguments[1];
-    }
-    return function windowTimeOperatorFunction(source) {
-        return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler));
-    };
-}
-var WindowTimeOperator = /*@__PURE__*/ (function () {
-    function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
-        this.windowTimeSpan = windowTimeSpan;
-        this.windowCreationInterval = windowCreationInterval;
-        this.maxWindowSize = maxWindowSize;
-        this.scheduler = scheduler;
-    }
-    WindowTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler));
-    };
-    return WindowTimeOperator;
-}());
-var CountedSubject = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(CountedSubject, _super);
-    function CountedSubject() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this._numberOfNextedValues = 0;
-        return _this;
-    }
-    CountedSubject.prototype.next = function (value) {
-        this._numberOfNextedValues++;
-        _super.prototype.next.call(this, value);
-    };
-    Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", {
-        get: function () {
-            return this._numberOfNextedValues;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return CountedSubject;
-}(Subject));
-var WindowTimeSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(WindowTimeSubscriber, _super);
-    function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.windowTimeSpan = windowTimeSpan;
-        _this.windowCreationInterval = windowCreationInterval;
-        _this.maxWindowSize = maxWindowSize;
-        _this.scheduler = scheduler;
-        _this.windows = [];
-        var window = _this.openWindow();
-        if (windowCreationInterval !== null && windowCreationInterval >= 0) {
-            var closeState = { subscriber: _this, window: window, context: null };
-            var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler };
-            _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState));
-            _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState));
-        }
-        else {
-            var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan };
-            _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));
-        }
-        return _this;
-    }
-    WindowTimeSubscriber.prototype._next = function (value) {
-        var windows = this.windows;
-        var len = windows.length;
-        for (var i = 0; i < len; i++) {
-            var window_1 = windows[i];
-            if (!window_1.closed) {
-                window_1.next(value);
-                if (window_1.numberOfNextedValues >= this.maxWindowSize) {
-                    this.closeWindow(window_1);
-                }
-            }
-        }
-    };
-    WindowTimeSubscriber.prototype._error = function (err) {
-        var windows = this.windows;
-        while (windows.length > 0) {
-            windows.shift().error(err);
-        }
-        this.destination.error(err);
-    };
-    WindowTimeSubscriber.prototype._complete = function () {
-        var windows = this.windows;
-        while (windows.length > 0) {
-            var window_2 = windows.shift();
-            if (!window_2.closed) {
-                window_2.complete();
-            }
-        }
-        this.destination.complete();
-    };
-    WindowTimeSubscriber.prototype.openWindow = function () {
-        var window = new CountedSubject();
-        this.windows.push(window);
-        var destination = this.destination;
-        destination.next(window);
-        return window;
-    };
-    WindowTimeSubscriber.prototype.closeWindow = function (window) {
-        window.complete();
-        var windows = this.windows;
-        windows.splice(windows.indexOf(window), 1);
-    };
-    return WindowTimeSubscriber;
-}(Subscriber));
-function dispatchWindowTimeSpanOnly(state) {
-    var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window;
-    if (window) {
-        subscriber.closeWindow(window);
-    }
-    state.window = subscriber.openWindow();
-    this.schedule(state, windowTimeSpan);
-}
-function dispatchWindowCreation(state) {
-    var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval;
-    var window = subscriber.openWindow();
-    var action = this;
-    var context = { action: action, subscription: null };
-    var timeSpanState = { subscriber: subscriber, window: window, context: context };
-    context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState);
-    action.add(context.subscription);
-    action.schedule(state, windowCreationInterval);
-}
-function dispatchWindowClose(state) {
-    var subscriber = state.subscriber, window = state.window, context = state.context;
-    if (context && context.action && context.subscription) {
-        context.action.remove(context.subscription);
-    }
-    subscriber.closeWindow(window);
-}
-//# sourceMappingURL=windowTime.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/windowTime.js.map b/node_modules/rxjs/_esm5/internal/operators/windowTime.js.map
deleted file mode 100644
index 365bd56..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/windowTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowTime.js","sources":["../../../src/internal/operators/windowTime.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/windowToggle.js b/node_modules/rxjs/_esm5/internal/operators/windowToggle.js
deleted file mode 100644
index 0387d97..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/windowToggle.js
+++ /dev/null
@@ -1,129 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subject,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subject } from '../Subject';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function windowToggle(openings, closingSelector) {
-    return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); };
-}
-var WindowToggleOperator = /*@__PURE__*/ (function () {
-    function WindowToggleOperator(openings, closingSelector) {
-        this.openings = openings;
-        this.closingSelector = closingSelector;
-    }
-    WindowToggleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector));
-    };
-    return WindowToggleOperator;
-}());
-var WindowToggleSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(WindowToggleSubscriber, _super);
-    function WindowToggleSubscriber(destination, openings, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.openings = openings;
-        _this.closingSelector = closingSelector;
-        _this.contexts = [];
-        _this.add(_this.openSubscription = subscribeToResult(_this, openings, openings));
-        return _this;
-    }
-    WindowToggleSubscriber.prototype._next = function (value) {
-        var contexts = this.contexts;
-        if (contexts) {
-            var len = contexts.length;
-            for (var i = 0; i < len; i++) {
-                contexts[i].window.next(value);
-            }
-        }
-    };
-    WindowToggleSubscriber.prototype._error = function (err) {
-        var contexts = this.contexts;
-        this.contexts = null;
-        if (contexts) {
-            var len = contexts.length;
-            var index = -1;
-            while (++index < len) {
-                var context_1 = contexts[index];
-                context_1.window.error(err);
-                context_1.subscription.unsubscribe();
-            }
-        }
-        _super.prototype._error.call(this, err);
-    };
-    WindowToggleSubscriber.prototype._complete = function () {
-        var contexts = this.contexts;
-        this.contexts = null;
-        if (contexts) {
-            var len = contexts.length;
-            var index = -1;
-            while (++index < len) {
-                var context_2 = contexts[index];
-                context_2.window.complete();
-                context_2.subscription.unsubscribe();
-            }
-        }
-        _super.prototype._complete.call(this);
-    };
-    WindowToggleSubscriber.prototype._unsubscribe = function () {
-        var contexts = this.contexts;
-        this.contexts = null;
-        if (contexts) {
-            var len = contexts.length;
-            var index = -1;
-            while (++index < len) {
-                var context_3 = contexts[index];
-                context_3.window.unsubscribe();
-                context_3.subscription.unsubscribe();
-            }
-        }
-    };
-    WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (outerValue === this.openings) {
-            var closingNotifier = void 0;
-            try {
-                var closingSelector = this.closingSelector;
-                closingNotifier = closingSelector(innerValue);
-            }
-            catch (e) {
-                return this.error(e);
-            }
-            var window_1 = new Subject();
-            var subscription = new Subscription();
-            var context_4 = { window: window_1, subscription: subscription };
-            this.contexts.push(context_4);
-            var innerSubscription = subscribeToResult(this, closingNotifier, context_4);
-            if (innerSubscription.closed) {
-                this.closeWindow(this.contexts.length - 1);
-            }
-            else {
-                innerSubscription.context = context_4;
-                subscription.add(innerSubscription);
-            }
-            this.destination.next(window_1);
-        }
-        else {
-            this.closeWindow(this.contexts.indexOf(outerValue));
-        }
-    };
-    WindowToggleSubscriber.prototype.notifyError = function (err) {
-        this.error(err);
-    };
-    WindowToggleSubscriber.prototype.notifyComplete = function (inner) {
-        if (inner !== this.openSubscription) {
-            this.closeWindow(this.contexts.indexOf(inner.context));
-        }
-    };
-    WindowToggleSubscriber.prototype.closeWindow = function (index) {
-        if (index === -1) {
-            return;
-        }
-        var contexts = this.contexts;
-        var context = contexts[index];
-        var window = context.window, subscription = context.subscription;
-        contexts.splice(index, 1);
-        window.complete();
-        subscription.unsubscribe();
-    };
-    return WindowToggleSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=windowToggle.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/windowToggle.js.map b/node_modules/rxjs/_esm5/internal/operators/windowToggle.js.map
deleted file mode 100644
index b0a3b6e..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/windowToggle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowToggle.js","sources":["../../../src/internal/operators/windowToggle.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/windowWhen.js b/node_modules/rxjs/_esm5/internal/operators/windowWhen.js
deleted file mode 100644
index ead5fc8..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/windowWhen.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subject } from '../Subject';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function windowWhen(closingSelector) {
-    return function windowWhenOperatorFunction(source) {
-        return source.lift(new WindowOperator(closingSelector));
-    };
-}
-var WindowOperator = /*@__PURE__*/ (function () {
-    function WindowOperator(closingSelector) {
-        this.closingSelector = closingSelector;
-    }
-    WindowOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector));
-    };
-    return WindowOperator;
-}());
-var WindowSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(WindowSubscriber, _super);
-    function WindowSubscriber(destination, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.closingSelector = closingSelector;
-        _this.openWindow();
-        return _this;
-    }
-    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openWindow(innerSub);
-    };
-    WindowSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.openWindow(innerSub);
-    };
-    WindowSubscriber.prototype._next = function (value) {
-        this.window.next(value);
-    };
-    WindowSubscriber.prototype._error = function (err) {
-        this.window.error(err);
-        this.destination.error(err);
-        this.unsubscribeClosingNotification();
-    };
-    WindowSubscriber.prototype._complete = function () {
-        this.window.complete();
-        this.destination.complete();
-        this.unsubscribeClosingNotification();
-    };
-    WindowSubscriber.prototype.unsubscribeClosingNotification = function () {
-        if (this.closingNotification) {
-            this.closingNotification.unsubscribe();
-        }
-    };
-    WindowSubscriber.prototype.openWindow = function (innerSub) {
-        if (innerSub === void 0) {
-            innerSub = null;
-        }
-        if (innerSub) {
-            this.remove(innerSub);
-            innerSub.unsubscribe();
-        }
-        var prevWindow = this.window;
-        if (prevWindow) {
-            prevWindow.complete();
-        }
-        var window = this.window = new Subject();
-        this.destination.next(window);
-        var closingNotifier;
-        try {
-            var closingSelector = this.closingSelector;
-            closingNotifier = closingSelector();
-        }
-        catch (e) {
-            this.destination.error(e);
-            this.window.error(e);
-            return;
-        }
-        this.add(this.closingNotification = subscribeToResult(this, closingNotifier));
-    };
-    return WindowSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=windowWhen.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/windowWhen.js.map b/node_modules/rxjs/_esm5/internal/operators/windowWhen.js.map
deleted file mode 100644
index 2916af7..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/windowWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowWhen.js","sources":["../../../src/internal/operators/windowWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/withLatestFrom.js b/node_modules/rxjs/_esm5/internal/operators/withLatestFrom.js
deleted file mode 100644
index 3bd163b..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/withLatestFrom.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-export function withLatestFrom() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i] = arguments[_i];
-    }
-    return function (source) {
-        var project;
-        if (typeof args[args.length - 1] === 'function') {
-            project = args.pop();
-        }
-        var observables = args;
-        return source.lift(new WithLatestFromOperator(observables, project));
-    };
-}
-var WithLatestFromOperator = /*@__PURE__*/ (function () {
-    function WithLatestFromOperator(observables, project) {
-        this.observables = observables;
-        this.project = project;
-    }
-    WithLatestFromOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));
-    };
-    return WithLatestFromOperator;
-}());
-var WithLatestFromSubscriber = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(WithLatestFromSubscriber, _super);
-    function WithLatestFromSubscriber(destination, observables, project) {
-        var _this = _super.call(this, destination) || this;
-        _this.observables = observables;
-        _this.project = project;
-        _this.toRespond = [];
-        var len = observables.length;
-        _this.values = new Array(len);
-        for (var i = 0; i < len; i++) {
-            _this.toRespond.push(i);
-        }
-        for (var i = 0; i < len; i++) {
-            var observable = observables[i];
-            _this.add(subscribeToResult(_this, observable, observable, i));
-        }
-        return _this;
-    }
-    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values[outerIndex] = innerValue;
-        var toRespond = this.toRespond;
-        if (toRespond.length > 0) {
-            var found = toRespond.indexOf(outerIndex);
-            if (found !== -1) {
-                toRespond.splice(found, 1);
-            }
-        }
-    };
-    WithLatestFromSubscriber.prototype.notifyComplete = function () {
-    };
-    WithLatestFromSubscriber.prototype._next = function (value) {
-        if (this.toRespond.length === 0) {
-            var args = [value].concat(this.values);
-            if (this.project) {
-                this._tryProject(args);
-            }
-            else {
-                this.destination.next(args);
-            }
-        }
-    };
-    WithLatestFromSubscriber.prototype._tryProject = function (args) {
-        var result;
-        try {
-            result = this.project.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return WithLatestFromSubscriber;
-}(OuterSubscriber));
-//# sourceMappingURL=withLatestFrom.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/withLatestFrom.js.map b/node_modules/rxjs/_esm5/internal/operators/withLatestFrom.js.map
deleted file mode 100644
index 4e8e72f..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/withLatestFrom.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"withLatestFrom.js","sources":["../../../src/internal/operators/withLatestFrom.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/zip.js b/node_modules/rxjs/_esm5/internal/operators/zip.js
deleted file mode 100644
index 9d79bce..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/zip.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */
-import { zip as zipStatic } from '../observable/zip';
-export function zip() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function zipOperatorFunction(source) {
-        return source.lift.call(zipStatic.apply(void 0, [source].concat(observables)));
-    };
-}
-//# sourceMappingURL=zip.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/zip.js.map b/node_modules/rxjs/_esm5/internal/operators/zip.js.map
deleted file mode 100644
index baa09ef..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/zip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zip.js","sources":["../../../src/internal/operators/zip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAsCrD,MAAM,UAAU,GAAG;IAAO,qBAA4E;SAA5E,UAA4E,EAA5E,qBAA4E,EAA5E,IAA4E;QAA5E,gCAA4E;;IACpG,OAAO,SAAS,mBAAmB,CAAC,MAAqB;QACvD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,gBAAI,MAAM,SAAK,WAAW,GAAE,CAAC;IAChE,CAAC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/operators/zipAll.js b/node_modules/rxjs/_esm5/internal/operators/zipAll.js
deleted file mode 100644
index cc58dd2..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/zipAll.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */
-import { ZipOperator } from '../observable/zip';
-export function zipAll(project) {
-    return function (source) { return source.lift(new ZipOperator(project)); };
-}
-//# sourceMappingURL=zipAll.js.map
diff --git a/node_modules/rxjs/_esm5/internal/operators/zipAll.js.map b/node_modules/rxjs/_esm5/internal/operators/zipAll.js.map
deleted file mode 100644
index e0919fd..0000000
--- a/node_modules/rxjs/_esm5/internal/operators/zipAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zipAll.js","sources":["../../../src/internal/operators/zipAll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAShD,MAAM,UAAU,MAAM,CAAO,OAAsC;IACjE,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,EAArC,CAAqC,CAAC;AAC1E,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduled/scheduleArray.js b/node_modules/rxjs/_esm5/internal/scheduled/scheduleArray.js
deleted file mode 100644
index b980756..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduled/scheduleArray.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-export function scheduleArray(input, scheduler) {
-    return new Observable(function (subscriber) {
-        var sub = new Subscription();
-        var i = 0;
-        sub.add(scheduler.schedule(function () {
-            if (i === input.length) {
-                subscriber.complete();
-                return;
-            }
-            subscriber.next(input[i++]);
-            if (!subscriber.closed) {
-                sub.add(this.schedule());
-            }
-        }));
-        return sub;
-    });
-}
-//# sourceMappingURL=scheduleArray.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduled/scheduleArray.js.map b/node_modules/rxjs/_esm5/internal/scheduled/scheduleArray.js.map
deleted file mode 100644
index 2a01c6c..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduled/scheduleArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scheduleArray.js","sources":["../../../src/internal/scheduled/scheduleArray.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,UAAU,aAAa,CAAI,KAAmB,EAAE,SAAwB;IAC5E,OAAO,IAAI,UAAU,CAAI,UAAA,UAAU;QACjC,IAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;YACzB,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE;gBACtB,UAAU,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO;aACR;YACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;gBACtB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;aAC1B;QACH,CAAC,CAAC,CAAC,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduled/scheduleIterable.js b/node_modules/rxjs/_esm5/internal/scheduled/scheduleIterable.js
deleted file mode 100644
index c199cc9..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduled/scheduleIterable.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_iterator PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { iterator as Symbol_iterator } from '../symbol/iterator';
-export function scheduleIterable(input, scheduler) {
-    if (!input) {
-        throw new Error('Iterable cannot be null');
-    }
-    return new Observable(function (subscriber) {
-        var sub = new Subscription();
-        var iterator;
-        sub.add(function () {
-            if (iterator && typeof iterator.return === 'function') {
-                iterator.return();
-            }
-        });
-        sub.add(scheduler.schedule(function () {
-            iterator = input[Symbol_iterator]();
-            sub.add(scheduler.schedule(function () {
-                if (subscriber.closed) {
-                    return;
-                }
-                var value;
-                var done;
-                try {
-                    var result = iterator.next();
-                    value = result.value;
-                    done = result.done;
-                }
-                catch (err) {
-                    subscriber.error(err);
-                    return;
-                }
-                if (done) {
-                    subscriber.complete();
-                }
-                else {
-                    subscriber.next(value);
-                    this.schedule();
-                }
-            }));
-        }));
-        return sub;
-    });
-}
-//# sourceMappingURL=scheduleIterable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduled/scheduleIterable.js.map b/node_modules/rxjs/_esm5/internal/scheduled/scheduleIterable.js.map
deleted file mode 100644
index 1c1d88b..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduled/scheduleIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scheduleIterable.js","sources":["../../../src/internal/scheduled/scheduleIterable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,UAAU,gBAAgB,CAAI,KAAkB,EAAE,SAAwB;IAC9E,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;KAC5C;IACD,OAAO,IAAI,UAAU,CAAI,UAAA,UAAU;QACjC,IAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,QAAqB,CAAC;QAC1B,GAAG,CAAC,GAAG,CAAC;YAEN,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE;gBACrD,QAAQ,CAAC,MAAM,EAAE,CAAC;aACnB;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;YACzB,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;gBACzB,IAAI,UAAU,CAAC,MAAM,EAAE;oBACrB,OAAO;iBACR;gBACD,IAAI,KAAQ,CAAC;gBACb,IAAI,IAAa,CAAC;gBAClB,IAAI;oBACF,IAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;oBAC/B,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;oBACrB,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;iBACpB;gBAAC,OAAO,GAAG,EAAE;oBACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACtB,OAAO;iBACR;gBACD,IAAI,IAAI,EAAE;oBACR,UAAU,CAAC,QAAQ,EAAE,CAAC;iBACvB;qBAAM;oBACL,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;iBACjB;YACH,CAAC,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,CAAC,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduled/scheduleObservable.js b/node_modules/rxjs/_esm5/internal/scheduled/scheduleObservable.js
deleted file mode 100644
index 226f596..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduled/scheduleObservable.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_observable PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { observable as Symbol_observable } from '../symbol/observable';
-export function scheduleObservable(input, scheduler) {
-    return new Observable(function (subscriber) {
-        var sub = new Subscription();
-        sub.add(scheduler.schedule(function () {
-            var observable = input[Symbol_observable]();
-            sub.add(observable.subscribe({
-                next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); },
-                error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); },
-                complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); },
-            }));
-        }));
-        return sub;
-    });
-}
-//# sourceMappingURL=scheduleObservable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduled/scheduleObservable.js.map b/node_modules/rxjs/_esm5/internal/scheduled/scheduleObservable.js.map
deleted file mode 100644
index 0fd99fb..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduled/scheduleObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scheduleObservable.js","sources":["../../../src/internal/scheduled/scheduleObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGvE,MAAM,UAAU,kBAAkB,CAAI,KAA2B,EAAE,SAAwB;IACzF,OAAO,IAAI,UAAU,CAAI,UAAA,UAAU;QACjC,IAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;YACzB,IAAM,UAAU,GAAoB,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;gBAC3B,IAAI,YAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAtB,CAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1E,KAAK,YAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAArB,CAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,QAAQ,gBAAK,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,UAAU,CAAC,QAAQ,EAAE,EAArB,CAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;aACzE,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,CAAC,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduled/schedulePromise.js b/node_modules/rxjs/_esm5/internal/scheduled/schedulePromise.js
deleted file mode 100644
index e2f79e3..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduled/schedulePromise.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-export function schedulePromise(input, scheduler) {
-    return new Observable(function (subscriber) {
-        var sub = new Subscription();
-        sub.add(scheduler.schedule(function () {
-            return input.then(function (value) {
-                sub.add(scheduler.schedule(function () {
-                    subscriber.next(value);
-                    sub.add(scheduler.schedule(function () { return subscriber.complete(); }));
-                }));
-            }, function (err) {
-                sub.add(scheduler.schedule(function () { return subscriber.error(err); }));
-            });
-        }));
-        return sub;
-    });
-}
-//# sourceMappingURL=schedulePromise.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduled/schedulePromise.js.map b/node_modules/rxjs/_esm5/internal/scheduled/schedulePromise.js.map
deleted file mode 100644
index 98fc42f..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduled/schedulePromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"schedulePromise.js","sources":["../../../src/internal/scheduled/schedulePromise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,UAAU,eAAe,CAAI,KAAqB,EAAE,SAAwB;IAChF,OAAO,IAAI,UAAU,CAAI,UAAA,UAAU;QACjC,IAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,KAAK,CAAC,IAAI,CACzC,UAAA,KAAK;YACH,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;gBACzB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,UAAU,CAAC,QAAQ,EAAE,EAArB,CAAqB,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC,CAAC;QACN,CAAC,EACD,UAAA,GAAG;YACD,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAArB,CAAqB,CAAC,CAAC,CAAC;QAC3D,CAAC,CACF,EAVgC,CAUhC,CAAC,CAAC,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduled/scheduled.js b/node_modules/rxjs/_esm5/internal/scheduled/scheduled.js
deleted file mode 100644
index 5284575..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduled/scheduled.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/** PURE_IMPORTS_START _scheduleObservable,_schedulePromise,_scheduleArray,_scheduleIterable,_util_isInteropObservable,_util_isPromise,_util_isArrayLike,_util_isIterable PURE_IMPORTS_END */
-import { scheduleObservable } from './scheduleObservable';
-import { schedulePromise } from './schedulePromise';
-import { scheduleArray } from './scheduleArray';
-import { scheduleIterable } from './scheduleIterable';
-import { isInteropObservable } from '../util/isInteropObservable';
-import { isPromise } from '../util/isPromise';
-import { isArrayLike } from '../util/isArrayLike';
-import { isIterable } from '../util/isIterable';
-export function scheduled(input, scheduler) {
-    if (input != null) {
-        if (isInteropObservable(input)) {
-            return scheduleObservable(input, scheduler);
-        }
-        else if (isPromise(input)) {
-            return schedulePromise(input, scheduler);
-        }
-        else if (isArrayLike(input)) {
-            return scheduleArray(input, scheduler);
-        }
-        else if (isIterable(input) || typeof input === 'string') {
-            return scheduleIterable(input, scheduler);
-        }
-    }
-    throw new TypeError((input !== null && typeof input || input) + ' is not observable');
-}
-//# sourceMappingURL=scheduled.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduled/scheduled.js.map b/node_modules/rxjs/_esm5/internal/scheduled/scheduled.js.map
deleted file mode 100644
index d4e76f8..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduled/scheduled.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scheduled.js","sources":["../../../src/internal/scheduled/scheduled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAahD,MAAM,UAAU,SAAS,CAAI,KAAyB,EAAE,SAAwB;IAC9E,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;YAC9B,OAAO,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SAC7C;aAAM,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE;YAC3B,OAAO,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SAC1C;aAAM,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;YAC7B,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SACxC;aAAO,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC1D,OAAO,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SAC3C;KACF;IAED,MAAM,IAAI,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,KAAK,CAAC,GAAG,oBAAoB,CAAC,CAAC;AACxF,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/Action.js b/node_modules/rxjs/_esm5/internal/scheduler/Action.js
deleted file mode 100644
index 5b40fd5..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/Action.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subscription } from '../Subscription';
-var Action = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(Action, _super);
-    function Action(scheduler, work) {
-        return _super.call(this) || this;
-    }
-    Action.prototype.schedule = function (state, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        return this;
-    };
-    return Action;
-}(Subscription));
-export { Action };
-//# sourceMappingURL=Action.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/Action.js.map b/node_modules/rxjs/_esm5/internal/scheduler/Action.js.map
deleted file mode 100644
index 92fdd5c..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/Action.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Action.js","sources":["../../../src/internal/scheduler/Action.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAiB/C;IAA+B,kCAAY;IACzC,gBAAY,SAAoB,EAAE,IAAmD;eACnF,iBAAO;IACT,CAAC;IAWM,yBAAQ,GAAf,UAAgB,KAAS,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACH,aAAC;AAAD,CAAC,AAjBD,CAA+B,YAAY,GAiB1C"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/AnimationFrameAction.js b/node_modules/rxjs/_esm5/internal/scheduler/AnimationFrameAction.js
deleted file mode 100644
index 09f436d..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/AnimationFrameAction.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { AsyncAction } from './AsyncAction';
-var AnimationFrameAction = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(AnimationFrameAction, _super);
-    function AnimationFrameAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        return _this;
-    }
-    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        if (delay !== null && delay > 0) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        scheduler.actions.push(this);
-        return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); }));
-    };
-    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
-        }
-        if (scheduler.actions.length === 0) {
-            cancelAnimationFrame(id);
-            scheduler.scheduled = undefined;
-        }
-        return undefined;
-    };
-    return AnimationFrameAction;
-}(AsyncAction));
-export { AnimationFrameAction };
-//# sourceMappingURL=AnimationFrameAction.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/AnimationFrameAction.js.map b/node_modules/rxjs/_esm5/internal/scheduler/AnimationFrameAction.js.map
deleted file mode 100644
index 98fa65a..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/AnimationFrameAction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AnimationFrameAction.js","sources":["../../../src/internal/scheduler/AnimationFrameAction.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAS5C;IAA6C,gDAAc;IAEzD,8BAAsB,SAAkC,EAClC,IAAmD;QADzE,YAEE,kBAAM,SAAS,EAAE,IAAI,CAAC,SACvB;QAHqB,eAAS,GAAT,SAAS,CAAyB;QAClC,UAAI,GAAJ,IAAI,CAA+C;;IAEzE,CAAC;IAES,6CAAc,GAAxB,UAAyB,SAAkC,EAAE,EAAQ,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAEtF,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE;YAC/B,OAAO,iBAAM,cAAc,YAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAED,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAI7B,OAAO,SAAS,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,qBAAqB,CACxE,cAAM,OAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAArB,CAAqB,CAAC,CAAC,CAAC;IAClC,CAAC;IACS,6CAAc,GAAxB,UAAyB,SAAkC,EAAE,EAAQ,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAItF,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE;YACvE,OAAO,iBAAM,cAAc,YAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAID,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YAClC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YACzB,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;SACjC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IACH,2BAAC;AAAD,CAAC,AArCD,CAA6C,WAAW,GAqCvD"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/AnimationFrameScheduler.js b/node_modules/rxjs/_esm5/internal/scheduler/AnimationFrameScheduler.js
deleted file mode 100644
index 3aed085..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/AnimationFrameScheduler.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { AsyncScheduler } from './AsyncScheduler';
-var AnimationFrameScheduler = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(AnimationFrameScheduler, _super);
-    function AnimationFrameScheduler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    AnimationFrameScheduler.prototype.flush = function (action) {
-        this.active = true;
-        this.scheduled = undefined;
-        var actions = this.actions;
-        var error;
-        var index = -1;
-        var count = actions.length;
-        action = action || actions.shift();
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (++index < count && (action = actions.shift()));
-        this.active = false;
-        if (error) {
-            while (++index < count && (action = actions.shift())) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AnimationFrameScheduler;
-}(AsyncScheduler));
-export { AnimationFrameScheduler };
-//# sourceMappingURL=AnimationFrameScheduler.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/AnimationFrameScheduler.js.map b/node_modules/rxjs/_esm5/internal/scheduler/AnimationFrameScheduler.js.map
deleted file mode 100644
index 06f7b0f..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/AnimationFrameScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AnimationFrameScheduler.js","sources":["../../../src/internal/scheduler/AnimationFrameScheduler.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;IAA6C,mDAAc;IAA3D;;IA2BA,CAAC;IA1BQ,uCAAK,GAAZ,UAAa,MAAyB;QAEpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAEpB,IAAA,sBAAO,CAAS;QACvB,IAAI,KAAU,CAAC;QACf,IAAI,KAAK,GAAW,CAAC,CAAC,CAAC;QACvB,IAAI,KAAK,GAAW,OAAO,CAAC,MAAM,CAAC;QACnC,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAEnC,GAAG;YACD,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtD,MAAM;aACP;SACF,QAAQ,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;QAExD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,KAAK,EAAE;YACT,OAAO,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;gBACpD,MAAM,CAAC,WAAW,EAAE,CAAC;aACtB;YACD,MAAM,KAAK,CAAC;SACb;IACH,CAAC;IACH,8BAAC;AAAD,CAAC,AA3BD,CAA6C,cAAc,GA2B1D"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/AsapAction.js b/node_modules/rxjs/_esm5/internal/scheduler/AsapAction.js
deleted file mode 100644
index 3e49e0b..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/AsapAction.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/** PURE_IMPORTS_START tslib,_util_Immediate,_AsyncAction PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Immediate } from '../util/Immediate';
-import { AsyncAction } from './AsyncAction';
-var AsapAction = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(AsapAction, _super);
-    function AsapAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        return _this;
-    }
-    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        if (delay !== null && delay > 0) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        scheduler.actions.push(this);
-        return scheduler.scheduled || (scheduler.scheduled = Immediate.setImmediate(scheduler.flush.bind(scheduler, null)));
-    };
-    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
-        }
-        if (scheduler.actions.length === 0) {
-            Immediate.clearImmediate(id);
-            scheduler.scheduled = undefined;
-        }
-        return undefined;
-    };
-    return AsapAction;
-}(AsyncAction));
-export { AsapAction };
-//# sourceMappingURL=AsapAction.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/AsapAction.js.map b/node_modules/rxjs/_esm5/internal/scheduler/AsapAction.js.map
deleted file mode 100644
index 74b829a..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/AsapAction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsapAction.js","sources":["../../../src/internal/scheduler/AsapAction.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQ5C;IAAmC,sCAAc;IAE/C,oBAAsB,SAAwB,EACxB,IAAmD;QADzE,YAEE,kBAAM,SAAS,EAAE,IAAI,CAAC,SACvB;QAHqB,eAAS,GAAT,SAAS,CAAe;QACxB,UAAI,GAAJ,IAAI,CAA+C;;IAEzE,CAAC;IAES,mCAAc,GAAxB,UAAyB,SAAwB,EAAE,EAAQ,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAE5E,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE;YAC/B,OAAO,iBAAM,cAAc,YAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAED,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAI7B,OAAO,SAAS,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,CACzE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CACtC,CAAC,CAAC;IACL,CAAC;IACS,mCAAc,GAAxB,UAAyB,SAAwB,EAAE,EAAQ,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAI5E,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE;YACvE,OAAO,iBAAM,cAAc,YAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAID,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YAClC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC7B,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;SACjC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IACH,iBAAC;AAAD,CAAC,AAtCD,CAAmC,WAAW,GAsC7C"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/AsapScheduler.js b/node_modules/rxjs/_esm5/internal/scheduler/AsapScheduler.js
deleted file mode 100644
index f13565c..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/AsapScheduler.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { AsyncScheduler } from './AsyncScheduler';
-var AsapScheduler = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(AsapScheduler, _super);
-    function AsapScheduler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    AsapScheduler.prototype.flush = function (action) {
-        this.active = true;
-        this.scheduled = undefined;
-        var actions = this.actions;
-        var error;
-        var index = -1;
-        var count = actions.length;
-        action = action || actions.shift();
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (++index < count && (action = actions.shift()));
-        this.active = false;
-        if (error) {
-            while (++index < count && (action = actions.shift())) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AsapScheduler;
-}(AsyncScheduler));
-export { AsapScheduler };
-//# sourceMappingURL=AsapScheduler.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/AsapScheduler.js.map b/node_modules/rxjs/_esm5/internal/scheduler/AsapScheduler.js.map
deleted file mode 100644
index f2c9159..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/AsapScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsapScheduler.js","sources":["../../../src/internal/scheduler/AsapScheduler.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;IAAmC,yCAAc;IAAjD;;IA2BA,CAAC;IA1BQ,6BAAK,GAAZ,UAAa,MAAyB;QAEpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAEpB,IAAA,sBAAO,CAAS;QACvB,IAAI,KAAU,CAAC;QACf,IAAI,KAAK,GAAW,CAAC,CAAC,CAAC;QACvB,IAAI,KAAK,GAAW,OAAO,CAAC,MAAM,CAAC;QACnC,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAEnC,GAAG;YACD,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtD,MAAM;aACP;SACF,QAAQ,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;QAExD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,KAAK,EAAE;YACT,OAAO,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;gBACpD,MAAM,CAAC,WAAW,EAAE,CAAC;aACtB;YACD,MAAM,KAAK,CAAC;SACb;IACH,CAAC;IACH,oBAAC;AAAD,CAAC,AA3BD,CAAmC,cAAc,GA2BhD"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/AsyncAction.js b/node_modules/rxjs/_esm5/internal/scheduler/AsyncAction.js
deleted file mode 100644
index 035fcaa..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/AsyncAction.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Action PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Action } from './Action';
-var AsyncAction = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(AsyncAction, _super);
-    function AsyncAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        _this.pending = false;
-        return _this;
-    }
-    AsyncAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        if (this.closed) {
-            return this;
-        }
-        this.state = state;
-        var id = this.id;
-        var scheduler = this.scheduler;
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, delay);
-        }
-        this.pending = true;
-        this.delay = delay;
-        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
-        return this;
-    };
-    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        return setInterval(scheduler.flush.bind(scheduler, this), delay);
-    };
-    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        if (delay !== null && this.delay === delay && this.pending === false) {
-            return id;
-        }
-        clearInterval(id);
-        return undefined;
-    };
-    AsyncAction.prototype.execute = function (state, delay) {
-        if (this.closed) {
-            return new Error('executing a cancelled action');
-        }
-        this.pending = false;
-        var error = this._execute(state, delay);
-        if (error) {
-            return error;
-        }
-        else if (this.pending === false && this.id != null) {
-            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
-        }
-    };
-    AsyncAction.prototype._execute = function (state, delay) {
-        var errored = false;
-        var errorValue = undefined;
-        try {
-            this.work(state);
-        }
-        catch (e) {
-            errored = true;
-            errorValue = !!e && e || new Error(e);
-        }
-        if (errored) {
-            this.unsubscribe();
-            return errorValue;
-        }
-    };
-    AsyncAction.prototype._unsubscribe = function () {
-        var id = this.id;
-        var scheduler = this.scheduler;
-        var actions = scheduler.actions;
-        var index = actions.indexOf(this);
-        this.work = null;
-        this.state = null;
-        this.pending = false;
-        this.scheduler = null;
-        if (index !== -1) {
-            actions.splice(index, 1);
-        }
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, null);
-        }
-        this.delay = null;
-    };
-    return AsyncAction;
-}(Action));
-export { AsyncAction };
-//# sourceMappingURL=AsyncAction.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/AsyncAction.js.map b/node_modules/rxjs/_esm5/internal/scheduler/AsyncAction.js.map
deleted file mode 100644
index 2adefe5..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/AsyncAction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsyncAction.js","sources":["../../../src/internal/scheduler/AsyncAction.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/AsyncScheduler.js b/node_modules/rxjs/_esm5/internal/scheduler/AsyncScheduler.js
deleted file mode 100644
index e4a372c..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/AsyncScheduler.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Scheduler PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Scheduler } from '../Scheduler';
-var AsyncScheduler = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(AsyncScheduler, _super);
-    function AsyncScheduler(SchedulerAction, now) {
-        if (now === void 0) {
-            now = Scheduler.now;
-        }
-        var _this = _super.call(this, SchedulerAction, function () {
-            if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) {
-                return AsyncScheduler.delegate.now();
-            }
-            else {
-                return now();
-            }
-        }) || this;
-        _this.actions = [];
-        _this.active = false;
-        _this.scheduled = undefined;
-        return _this;
-    }
-    AsyncScheduler.prototype.schedule = function (work, delay, state) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
-            return AsyncScheduler.delegate.schedule(work, delay, state);
-        }
-        else {
-            return _super.prototype.schedule.call(this, work, delay, state);
-        }
-    };
-    AsyncScheduler.prototype.flush = function (action) {
-        var actions = this.actions;
-        if (this.active) {
-            actions.push(action);
-            return;
-        }
-        var error;
-        this.active = true;
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (action = actions.shift());
-        this.active = false;
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AsyncScheduler;
-}(Scheduler));
-export { AsyncScheduler };
-//# sourceMappingURL=AsyncScheduler.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/AsyncScheduler.js.map b/node_modules/rxjs/_esm5/internal/scheduler/AsyncScheduler.js.map
deleted file mode 100644
index f314809..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/AsyncScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsyncScheduler.js","sources":["../../../src/internal/scheduler/AsyncScheduler.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAMzC;IAAoC,0CAAS;IAmB3C,wBAAY,eAA8B,EAC9B,GAAiC;QAAjC,oBAAA,EAAA,MAAoB,SAAS,CAAC,GAAG;QAD7C,YAEE,kBAAM,eAAe,EAAE;YACrB,IAAI,cAAc,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,KAAK,KAAI,EAAE;gBAC/D,OAAO,cAAc,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;aACtC;iBAAM;gBACL,OAAO,GAAG,EAAE,CAAC;aACd;QACH,CAAC,CAAC,SACH;QA1BM,aAAO,GAA4B,EAAE,CAAC;QAOtC,YAAM,GAAY,KAAK,CAAC;QAQxB,eAAS,GAAQ,SAAS,CAAC;;IAWlC,CAAC;IAEM,iCAAQ,GAAf,UAAmB,IAAmD,EAAE,KAAiB,EAAE,KAAS;QAA5B,sBAAA,EAAA,SAAiB;QACvF,IAAI,cAAc,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,KAAK,IAAI,EAAE;YAC/D,OAAO,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC7D;aAAM;YACL,OAAO,iBAAM,QAAQ,YAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC3C;IACH,CAAC;IAEM,8BAAK,GAAZ,UAAa,MAAwB;QAE5B,IAAA,sBAAO,CAAS;QAEvB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO;SACR;QAED,IAAI,KAAU,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,GAAG;YACD,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtD,MAAM;aACP;SACF,QAAQ,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE;QAEnC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,KAAK,EAAE;YACT,OAAO,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE;gBAC/B,MAAM,CAAC,WAAW,EAAE,CAAC;aACtB;YACD,MAAM,KAAK,CAAC;SACb;IACH,CAAC;IACH,qBAAC;AAAD,CAAC,AAjED,CAAoC,SAAS,GAiE5C"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/QueueAction.js b/node_modules/rxjs/_esm5/internal/scheduler/QueueAction.js
deleted file mode 100644
index e18406d..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/QueueAction.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { AsyncAction } from './AsyncAction';
-var QueueAction = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(QueueAction, _super);
-    function QueueAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        return _this;
-    }
-    QueueAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        if (delay > 0) {
-            return _super.prototype.schedule.call(this, state, delay);
-        }
-        this.delay = delay;
-        this.state = state;
-        this.scheduler.flush(this);
-        return this;
-    };
-    QueueAction.prototype.execute = function (state, delay) {
-        return (delay > 0 || this.closed) ?
-            _super.prototype.execute.call(this, state, delay) :
-            this._execute(state, delay);
-    };
-    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        return scheduler.flush(this);
-    };
-    return QueueAction;
-}(AsyncAction));
-export { QueueAction };
-//# sourceMappingURL=QueueAction.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/QueueAction.js.map b/node_modules/rxjs/_esm5/internal/scheduler/QueueAction.js.map
deleted file mode 100644
index 541a53d..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/QueueAction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"QueueAction.js","sources":["../../../src/internal/scheduler/QueueAction.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C;IAAoC,uCAAc;IAEhD,qBAAsB,SAAyB,EACzB,IAAmD;QADzE,YAEE,kBAAM,SAAS,EAAE,IAAI,CAAC,SACvB;QAHqB,eAAS,GAAT,SAAS,CAAgB;QACzB,UAAI,GAAJ,IAAI,CAA+C;;IAEzE,CAAC;IAEM,8BAAQ,GAAf,UAAgB,KAAS,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAC1C,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,OAAO,iBAAM,QAAQ,YAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACrC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,6BAAO,GAAd,UAAe,KAAQ,EAAE,KAAa;QACpC,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACjC,iBAAM,OAAO,YAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAE;IACjC,CAAC;IAES,oCAAc,GAAxB,UAAyB,SAAyB,EAAE,EAAQ,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAI7E,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE;YACvE,OAAO,iBAAM,cAAc,YAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAED,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACH,kBAAC;AAAD,CAAC,AAjCD,CAAoC,WAAW,GAiC9C"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/QueueScheduler.js b/node_modules/rxjs/_esm5/internal/scheduler/QueueScheduler.js
deleted file mode 100644
index 6dca70f..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/QueueScheduler.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { AsyncScheduler } from './AsyncScheduler';
-var QueueScheduler = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(QueueScheduler, _super);
-    function QueueScheduler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    return QueueScheduler;
-}(AsyncScheduler));
-export { QueueScheduler };
-//# sourceMappingURL=QueueScheduler.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/QueueScheduler.js.map b/node_modules/rxjs/_esm5/internal/scheduler/QueueScheduler.js.map
deleted file mode 100644
index ff548cd..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/QueueScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"QueueScheduler.js","sources":["../../../src/internal/scheduler/QueueScheduler.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;IAAoC,0CAAc;IAAlD;;IACA,CAAC;IAAD,qBAAC;AAAD,CAAC,AADD,CAAoC,cAAc,GACjD"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/VirtualTimeScheduler.js b/node_modules/rxjs/_esm5/internal/scheduler/VirtualTimeScheduler.js
deleted file mode 100644
index 37ee7f3..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/VirtualTimeScheduler.js
+++ /dev/null
@@ -1,110 +0,0 @@
-/** PURE_IMPORTS_START tslib,_AsyncAction,_AsyncScheduler PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { AsyncAction } from './AsyncAction';
-import { AsyncScheduler } from './AsyncScheduler';
-var VirtualTimeScheduler = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(VirtualTimeScheduler, _super);
-    function VirtualTimeScheduler(SchedulerAction, maxFrames) {
-        if (SchedulerAction === void 0) {
-            SchedulerAction = VirtualAction;
-        }
-        if (maxFrames === void 0) {
-            maxFrames = Number.POSITIVE_INFINITY;
-        }
-        var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this;
-        _this.maxFrames = maxFrames;
-        _this.frame = 0;
-        _this.index = -1;
-        return _this;
-    }
-    VirtualTimeScheduler.prototype.flush = function () {
-        var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
-        var error, action;
-        while ((action = actions[0]) && action.delay <= maxFrames) {
-            actions.shift();
-            this.frame = action.delay;
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        }
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    VirtualTimeScheduler.frameTimeFactor = 10;
-    return VirtualTimeScheduler;
-}(AsyncScheduler));
-export { VirtualTimeScheduler };
-var VirtualAction = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(VirtualAction, _super);
-    function VirtualAction(scheduler, work, index) {
-        if (index === void 0) {
-            index = scheduler.index += 1;
-        }
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        _this.index = index;
-        _this.active = true;
-        _this.index = scheduler.index = index;
-        return _this;
-    }
-    VirtualAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        if (!this.id) {
-            return _super.prototype.schedule.call(this, state, delay);
-        }
-        this.active = false;
-        var action = new VirtualAction(this.scheduler, this.work);
-        this.add(action);
-        return action.schedule(state, delay);
-    };
-    VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        this.delay = scheduler.frame + delay;
-        var actions = scheduler.actions;
-        actions.push(this);
-        actions.sort(VirtualAction.sortActions);
-        return true;
-    };
-    VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) {
-            delay = 0;
-        }
-        return undefined;
-    };
-    VirtualAction.prototype._execute = function (state, delay) {
-        if (this.active === true) {
-            return _super.prototype._execute.call(this, state, delay);
-        }
-    };
-    VirtualAction.sortActions = function (a, b) {
-        if (a.delay === b.delay) {
-            if (a.index === b.index) {
-                return 0;
-            }
-            else if (a.index > b.index) {
-                return 1;
-            }
-            else {
-                return -1;
-            }
-        }
-        else if (a.delay > b.delay) {
-            return 1;
-        }
-        else {
-            return -1;
-        }
-    };
-    return VirtualAction;
-}(AsyncAction));
-export { VirtualAction };
-//# sourceMappingURL=VirtualTimeScheduler.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/VirtualTimeScheduler.js.map b/node_modules/rxjs/_esm5/internal/scheduler/VirtualTimeScheduler.js.map
deleted file mode 100644
index 9e30824..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/VirtualTimeScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"VirtualTimeScheduler.js","sources":["../../../src/internal/scheduler/VirtualTimeScheduler.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/animationFrame.js b/node_modules/rxjs/_esm5/internal/scheduler/animationFrame.js
deleted file mode 100644
index a4b3977..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/animationFrame.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/** PURE_IMPORTS_START _AnimationFrameAction,_AnimationFrameScheduler PURE_IMPORTS_END */
-import { AnimationFrameAction } from './AnimationFrameAction';
-import { AnimationFrameScheduler } from './AnimationFrameScheduler';
-export var animationFrame = /*@__PURE__*/ new AnimationFrameScheduler(AnimationFrameAction);
-//# sourceMappingURL=animationFrame.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/animationFrame.js.map b/node_modules/rxjs/_esm5/internal/scheduler/animationFrame.js.map
deleted file mode 100644
index 8f2924e..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/animationFrame.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"animationFrame.js","sources":["../../../src/internal/scheduler/animationFrame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAsCpE,MAAM,CAAC,IAAM,cAAc,GAAG,IAAI,uBAAuB,CAAC,oBAAoB,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/asap.js b/node_modules/rxjs/_esm5/internal/scheduler/asap.js
deleted file mode 100644
index bfe4f16..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/asap.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/** PURE_IMPORTS_START _AsapAction,_AsapScheduler PURE_IMPORTS_END */
-import { AsapAction } from './AsapAction';
-import { AsapScheduler } from './AsapScheduler';
-export var asap = /*@__PURE__*/ new AsapScheduler(AsapAction);
-//# sourceMappingURL=asap.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/asap.js.map b/node_modules/rxjs/_esm5/internal/scheduler/asap.js.map
deleted file mode 100644
index 82a07fa..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/asap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"asap.js","sources":["../../../src/internal/scheduler/asap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAwChD,MAAM,CAAC,IAAM,IAAI,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/async.js b/node_modules/rxjs/_esm5/internal/scheduler/async.js
deleted file mode 100644
index 4b29a48..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/async.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/** PURE_IMPORTS_START _AsyncAction,_AsyncScheduler PURE_IMPORTS_END */
-import { AsyncAction } from './AsyncAction';
-import { AsyncScheduler } from './AsyncScheduler';
-export var async = /*@__PURE__*/ new AsyncScheduler(AsyncAction);
-//# sourceMappingURL=async.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/async.js.map b/node_modules/rxjs/_esm5/internal/scheduler/async.js.map
deleted file mode 100644
index e3297c1..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/async.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"async.js","sources":["../../../src/internal/scheduler/async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAqDlD,MAAM,CAAC,IAAM,KAAK,GAAG,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/queue.js b/node_modules/rxjs/_esm5/internal/scheduler/queue.js
deleted file mode 100644
index c0446e8..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/queue.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/** PURE_IMPORTS_START _QueueAction,_QueueScheduler PURE_IMPORTS_END */
-import { QueueAction } from './QueueAction';
-import { QueueScheduler } from './QueueScheduler';
-export var queue = /*@__PURE__*/ new QueueScheduler(QueueAction);
-//# sourceMappingURL=queue.js.map
diff --git a/node_modules/rxjs/_esm5/internal/scheduler/queue.js.map b/node_modules/rxjs/_esm5/internal/scheduler/queue.js.map
deleted file mode 100644
index fe11c39..0000000
--- a/node_modules/rxjs/_esm5/internal/scheduler/queue.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"queue.js","sources":["../../../src/internal/scheduler/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAqElD,MAAM,CAAC,IAAM,KAAK,GAAG,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/symbol/iterator.js b/node_modules/rxjs/_esm5/internal/symbol/iterator.js
deleted file mode 100644
index 30341cd..0000000
--- a/node_modules/rxjs/_esm5/internal/symbol/iterator.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export function getSymbolIterator() {
-    if (typeof Symbol !== 'function' || !Symbol.iterator) {
-        return '@@iterator';
-    }
-    return Symbol.iterator;
-}
-export var iterator = /*@__PURE__*/ getSymbolIterator();
-export var $$iterator = iterator;
-//# sourceMappingURL=iterator.js.map
diff --git a/node_modules/rxjs/_esm5/internal/symbol/iterator.js.map b/node_modules/rxjs/_esm5/internal/symbol/iterator.js.map
deleted file mode 100644
index 8231331..0000000
--- a/node_modules/rxjs/_esm5/internal/symbol/iterator.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"iterator.js","sources":["../../../src/internal/symbol/iterator.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB;IAC/B,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;QACpD,OAAO,YAAmB,CAAC;KAC5B;IAED,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,IAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;AAK5C,MAAM,CAAC,IAAM,UAAU,GAAG,QAAQ,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/symbol/observable.js b/node_modules/rxjs/_esm5/internal/symbol/observable.js
deleted file mode 100644
index 6eb96a3..0000000
--- a/node_modules/rxjs/_esm5/internal/symbol/observable.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export var observable = /*@__PURE__*/ (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })();
-//# sourceMappingURL=observable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/symbol/observable.js.map b/node_modules/rxjs/_esm5/internal/symbol/observable.js.map
deleted file mode 100644
index 863bc62..0000000
--- a/node_modules/rxjs/_esm5/internal/symbol/observable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"observable.js","sources":["../../../src/internal/symbol/observable.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,IAAM,UAAU,GAAG,CAAC,cAAM,OAAA,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,UAAU,IAAI,cAAc,EAAnE,CAAmE,CAAC,EAAE,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/symbol/rxSubscriber.js b/node_modules/rxjs/_esm5/internal/symbol/rxSubscriber.js
deleted file mode 100644
index dcf762f..0000000
--- a/node_modules/rxjs/_esm5/internal/symbol/rxSubscriber.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export var rxSubscriber = /*@__PURE__*/ (function () {
-    return typeof Symbol === 'function'
-        ? /*@__PURE__*/ Symbol('rxSubscriber')
-        : '@@rxSubscriber_' + /*@__PURE__*/ Math.random();
-})();
-export var $$rxSubscriber = rxSubscriber;
-//# sourceMappingURL=rxSubscriber.js.map
diff --git a/node_modules/rxjs/_esm5/internal/symbol/rxSubscriber.js.map b/node_modules/rxjs/_esm5/internal/symbol/rxSubscriber.js.map
deleted file mode 100644
index a68fff5..0000000
--- a/node_modules/rxjs/_esm5/internal/symbol/rxSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"rxSubscriber.js","sources":["../../../src/internal/symbol/rxSubscriber.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,IAAM,YAAY,GAAG,CAAC;IAC3B,OAAA,OAAO,MAAM,KAAK,UAAU;QAC1B,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;QACxB,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM,EAAE;AAFrC,CAEqC,CAAC,EAAE,CAAC;AAK3C,MAAM,CAAC,IAAM,cAAc,GAAG,YAAY,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/testing/ColdObservable.js b/node_modules/rxjs/_esm5/internal/testing/ColdObservable.js
deleted file mode 100644
index 9ff1ef6..0000000
--- a/node_modules/rxjs/_esm5/internal/testing/ColdObservable.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Observable,_Subscription,_SubscriptionLoggable,_util_applyMixins PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { SubscriptionLoggable } from './SubscriptionLoggable';
-import { applyMixins } from '../util/applyMixins';
-var ColdObservable = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(ColdObservable, _super);
-    function ColdObservable(messages, scheduler) {
-        var _this = _super.call(this, function (subscriber) {
-            var observable = this;
-            var index = observable.logSubscribedFrame();
-            var subscription = new Subscription();
-            subscription.add(new Subscription(function () {
-                observable.logUnsubscribedFrame(index);
-            }));
-            observable.scheduleMessages(subscriber);
-            return subscription;
-        }) || this;
-        _this.messages = messages;
-        _this.subscriptions = [];
-        _this.scheduler = scheduler;
-        return _this;
-    }
-    ColdObservable.prototype.scheduleMessages = function (subscriber) {
-        var messagesLength = this.messages.length;
-        for (var i = 0; i < messagesLength; i++) {
-            var message = this.messages[i];
-            subscriber.add(this.scheduler.schedule(function (_a) {
-                var message = _a.message, subscriber = _a.subscriber;
-                message.notification.observe(subscriber);
-            }, message.frame, { message: message, subscriber: subscriber }));
-        }
-    };
-    return ColdObservable;
-}(Observable));
-export { ColdObservable };
-/*@__PURE__*/ applyMixins(ColdObservable, [SubscriptionLoggable]);
-//# sourceMappingURL=ColdObservable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/testing/ColdObservable.js.map b/node_modules/rxjs/_esm5/internal/testing/ColdObservable.js.map
deleted file mode 100644
index d02429e..0000000
--- a/node_modules/rxjs/_esm5/internal/testing/ColdObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ColdObservable.js","sources":["../../../src/internal/testing/ColdObservable.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQlD;IAAuC,0CAAa;IAMlD,wBAAmB,QAAuB,EAC9B,SAAoB;QADhC,YAEE,kBAAM,UAA+B,UAA2B;YAC9D,IAAM,UAAU,GAAsB,IAAW,CAAC;YAClD,IAAM,KAAK,GAAG,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAC9C,IAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;YACxC,YAAY,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC;gBAChC,UAAU,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC,CAAC;YACJ,UAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACxC,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,SAEH;QAbkB,cAAQ,GAAR,QAAQ,CAAe;QALnC,mBAAa,GAAsB,EAAE,CAAC;QAiB3C,KAAI,CAAC,SAAS,GAAG,SAAS,CAAC;;IAC7B,CAAC;IAED,yCAAgB,GAAhB,UAAiB,UAA2B;QAC1C,IAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE;YACvC,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACjC,UAAU,CAAC,GAAG,CACZ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAC,EAAuB;oBAArB,oBAAO,EAAE,0BAAU;gBAAS,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAAC,CAAC,EAChG,OAAO,CAAC,KAAK,EACb,EAAE,OAAO,SAAA,EAAE,UAAU,YAAA,EAAE,CAAC,CAC3B,CAAC;SACH;IACH,CAAC;IACH,qBAAC;AAAD,CAAC,AAhCD,CAAuC,UAAU,GAgChD;;AACD,WAAW,CAAC,cAAc,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/testing/HotObservable.js b/node_modules/rxjs/_esm5/internal/testing/HotObservable.js
deleted file mode 100644
index 1e4aac5..0000000
--- a/node_modules/rxjs/_esm5/internal/testing/HotObservable.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Subject,_Subscription,_SubscriptionLoggable,_util_applyMixins PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Subject } from '../Subject';
-import { Subscription } from '../Subscription';
-import { SubscriptionLoggable } from './SubscriptionLoggable';
-import { applyMixins } from '../util/applyMixins';
-var HotObservable = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(HotObservable, _super);
-    function HotObservable(messages, scheduler) {
-        var _this = _super.call(this) || this;
-        _this.messages = messages;
-        _this.subscriptions = [];
-        _this.scheduler = scheduler;
-        return _this;
-    }
-    HotObservable.prototype._subscribe = function (subscriber) {
-        var subject = this;
-        var index = subject.logSubscribedFrame();
-        var subscription = new Subscription();
-        subscription.add(new Subscription(function () {
-            subject.logUnsubscribedFrame(index);
-        }));
-        subscription.add(_super.prototype._subscribe.call(this, subscriber));
-        return subscription;
-    };
-    HotObservable.prototype.setup = function () {
-        var subject = this;
-        var messagesLength = subject.messages.length;
-        for (var i = 0; i < messagesLength; i++) {
-            (function () {
-                var message = subject.messages[i];
-                subject.scheduler.schedule(function () { message.notification.observe(subject); }, message.frame);
-            })();
-        }
-    };
-    return HotObservable;
-}(Subject));
-export { HotObservable };
-/*@__PURE__*/ applyMixins(HotObservable, [SubscriptionLoggable]);
-//# sourceMappingURL=HotObservable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/testing/HotObservable.js.map b/node_modules/rxjs/_esm5/internal/testing/HotObservable.js.map
deleted file mode 100644
index e0f3293..0000000
--- a/node_modules/rxjs/_esm5/internal/testing/HotObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"HotObservable.js","sources":["../../../src/internal/testing/HotObservable.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAI/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOlD;IAAsC,yCAAU;IAM9C,uBAAmB,QAAuB,EAC9B,SAAoB;QADhC,YAEE,iBAAO,SAER;QAJkB,cAAQ,GAAR,QAAQ,CAAe;QALnC,mBAAa,GAAsB,EAAE,CAAC;QAQ3C,KAAI,CAAC,SAAS,GAAG,SAAS,CAAC;;IAC7B,CAAC;IAGD,kCAAU,GAAV,UAAW,UAA2B;QACpC,IAAM,OAAO,GAAqB,IAAI,CAAC;QACvC,IAAM,KAAK,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC3C,IAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACxC,YAAY,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC;YAChC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC;QACJ,YAAY,CAAC,GAAG,CAAC,iBAAM,UAAU,YAAC,UAAU,CAAC,CAAC,CAAC;QAC/C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,6BAAK,GAAL;QACE,IAAM,OAAO,GAAG,IAAI,CAAC;QACrB,IAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE;YACvC,CAAC;gBACC,IAAI,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAElC,OAAO,CAAC,SAAS,CAAC,QAAQ,CACxB,cAAQ,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAChD,OAAO,CAAC,KAAK,CACd,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;SACN;IACH,CAAC;IACH,oBAAC;AAAD,CAAC,AAvCD,CAAsC,OAAO,GAuC5C;;AACD,WAAW,CAAC,aAAa,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/testing/SubscriptionLog.js b/node_modules/rxjs/_esm5/internal/testing/SubscriptionLog.js
deleted file mode 100644
index 2d5ea3b..0000000
--- a/node_modules/rxjs/_esm5/internal/testing/SubscriptionLog.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var SubscriptionLog = /*@__PURE__*/ (function () {
-    function SubscriptionLog(subscribedFrame, unsubscribedFrame) {
-        if (unsubscribedFrame === void 0) {
-            unsubscribedFrame = Number.POSITIVE_INFINITY;
-        }
-        this.subscribedFrame = subscribedFrame;
-        this.unsubscribedFrame = unsubscribedFrame;
-    }
-    return SubscriptionLog;
-}());
-export { SubscriptionLog };
-//# sourceMappingURL=SubscriptionLog.js.map
diff --git a/node_modules/rxjs/_esm5/internal/testing/SubscriptionLog.js.map b/node_modules/rxjs/_esm5/internal/testing/SubscriptionLog.js.map
deleted file mode 100644
index 0eb029d..0000000
--- a/node_modules/rxjs/_esm5/internal/testing/SubscriptionLog.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubscriptionLog.js","sources":["../../../src/internal/testing/SubscriptionLog.ts"],"names":[],"mappings":"AAAA;IACE,yBAAmB,eAAuB,EACvB,iBAAoD;QAApD,kCAAA,EAAA,oBAA4B,MAAM,CAAC,iBAAiB;QADpD,oBAAe,GAAf,eAAe,CAAQ;QACvB,sBAAiB,GAAjB,iBAAiB,CAAmC;IACvE,CAAC;IACH,sBAAC;AAAD,CAAC,AAJD,IAIC"}
diff --git a/node_modules/rxjs/_esm5/internal/testing/SubscriptionLoggable.js b/node_modules/rxjs/_esm5/internal/testing/SubscriptionLoggable.js
deleted file mode 100644
index 41bdb9e..0000000
--- a/node_modules/rxjs/_esm5/internal/testing/SubscriptionLoggable.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/** PURE_IMPORTS_START _SubscriptionLog PURE_IMPORTS_END */
-import { SubscriptionLog } from './SubscriptionLog';
-var SubscriptionLoggable = /*@__PURE__*/ (function () {
-    function SubscriptionLoggable() {
-        this.subscriptions = [];
-    }
-    SubscriptionLoggable.prototype.logSubscribedFrame = function () {
-        this.subscriptions.push(new SubscriptionLog(this.scheduler.now()));
-        return this.subscriptions.length - 1;
-    };
-    SubscriptionLoggable.prototype.logUnsubscribedFrame = function (index) {
-        var subscriptionLogs = this.subscriptions;
-        var oldSubscriptionLog = subscriptionLogs[index];
-        subscriptionLogs[index] = new SubscriptionLog(oldSubscriptionLog.subscribedFrame, this.scheduler.now());
-    };
-    return SubscriptionLoggable;
-}());
-export { SubscriptionLoggable };
-//# sourceMappingURL=SubscriptionLoggable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/testing/SubscriptionLoggable.js.map b/node_modules/rxjs/_esm5/internal/testing/SubscriptionLoggable.js.map
deleted file mode 100644
index d41652d..0000000
--- a/node_modules/rxjs/_esm5/internal/testing/SubscriptionLoggable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubscriptionLoggable.js","sources":["../../../src/internal/testing/SubscriptionLoggable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;IAAA;QACS,kBAAa,GAAsB,EAAE,CAAC;IAgB/C,CAAC;IAbC,iDAAkB,GAAlB;QACE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,mDAAoB,GAApB,UAAqB,KAAa;QAChC,IAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;QAC5C,IAAM,kBAAkB,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACnD,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,eAAe,CAC3C,kBAAkB,CAAC,eAAe,EAClC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CACrB,CAAC;IACJ,CAAC;IACH,2BAAC;AAAD,CAAC,AAjBD,IAiBC"}
diff --git a/node_modules/rxjs/_esm5/internal/testing/TestMessage.js b/node_modules/rxjs/_esm5/internal/testing/TestMessage.js
deleted file mode 100644
index 711064f..0000000
--- a/node_modules/rxjs/_esm5/internal/testing/TestMessage.js
+++ /dev/null
@@ -1 +0,0 @@
-//# sourceMappingURL=TestMessage.js.map
diff --git a/node_modules/rxjs/_esm5/internal/testing/TestMessage.js.map b/node_modules/rxjs/_esm5/internal/testing/TestMessage.js.map
deleted file mode 100644
index b19facd..0000000
--- a/node_modules/rxjs/_esm5/internal/testing/TestMessage.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TestMessage.js","sources":["../../../src/internal/testing/TestMessage.ts"],"names":[],"mappings":""}
diff --git a/node_modules/rxjs/_esm5/internal/testing/TestScheduler.js b/node_modules/rxjs/_esm5/internal/testing/TestScheduler.js
deleted file mode 100644
index 04c6975..0000000
--- a/node_modules/rxjs/_esm5/internal/testing/TestScheduler.js
+++ /dev/null
@@ -1,359 +0,0 @@
-/** PURE_IMPORTS_START tslib,_Observable,_Notification,_ColdObservable,_HotObservable,_SubscriptionLog,_scheduler_VirtualTimeScheduler,_scheduler_AsyncScheduler PURE_IMPORTS_END */
-import * as tslib_1 from "tslib";
-import { Observable } from '../Observable';
-import { Notification } from '../Notification';
-import { ColdObservable } from './ColdObservable';
-import { HotObservable } from './HotObservable';
-import { SubscriptionLog } from './SubscriptionLog';
-import { VirtualTimeScheduler, VirtualAction } from '../scheduler/VirtualTimeScheduler';
-import { AsyncScheduler } from '../scheduler/AsyncScheduler';
-var defaultMaxFrame = 750;
-var TestScheduler = /*@__PURE__*/ (function (_super) {
-    tslib_1.__extends(TestScheduler, _super);
-    function TestScheduler(assertDeepEqual) {
-        var _this = _super.call(this, VirtualAction, defaultMaxFrame) || this;
-        _this.assertDeepEqual = assertDeepEqual;
-        _this.hotObservables = [];
-        _this.coldObservables = [];
-        _this.flushTests = [];
-        _this.runMode = false;
-        return _this;
-    }
-    TestScheduler.prototype.createTime = function (marbles) {
-        var indexOf = marbles.indexOf('|');
-        if (indexOf === -1) {
-            throw new Error('marble diagram for time should have a completion marker "|"');
-        }
-        return indexOf * TestScheduler.frameTimeFactor;
-    };
-    TestScheduler.prototype.createColdObservable = function (marbles, values, error) {
-        if (marbles.indexOf('^') !== -1) {
-            throw new Error('cold observable cannot have subscription offset "^"');
-        }
-        if (marbles.indexOf('!') !== -1) {
-            throw new Error('cold observable cannot have unsubscription marker "!"');
-        }
-        var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
-        var cold = new ColdObservable(messages, this);
-        this.coldObservables.push(cold);
-        return cold;
-    };
-    TestScheduler.prototype.createHotObservable = function (marbles, values, error) {
-        if (marbles.indexOf('!') !== -1) {
-            throw new Error('hot observable cannot have unsubscription marker "!"');
-        }
-        var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
-        var subject = new HotObservable(messages, this);
-        this.hotObservables.push(subject);
-        return subject;
-    };
-    TestScheduler.prototype.materializeInnerObservable = function (observable, outerFrame) {
-        var _this = this;
-        var messages = [];
-        observable.subscribe(function (value) {
-            messages.push({ frame: _this.frame - outerFrame, notification: Notification.createNext(value) });
-        }, function (err) {
-            messages.push({ frame: _this.frame - outerFrame, notification: Notification.createError(err) });
-        }, function () {
-            messages.push({ frame: _this.frame - outerFrame, notification: Notification.createComplete() });
-        });
-        return messages;
-    };
-    TestScheduler.prototype.expectObservable = function (observable, subscriptionMarbles) {
-        var _this = this;
-        if (subscriptionMarbles === void 0) {
-            subscriptionMarbles = null;
-        }
-        var actual = [];
-        var flushTest = { actual: actual, ready: false };
-        var subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);
-        var subscriptionFrame = subscriptionParsed.subscribedFrame === Number.POSITIVE_INFINITY ?
-            0 : subscriptionParsed.subscribedFrame;
-        var unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;
-        var subscription;
-        this.schedule(function () {
-            subscription = observable.subscribe(function (x) {
-                var value = x;
-                if (x instanceof Observable) {
-                    value = _this.materializeInnerObservable(value, _this.frame);
-                }
-                actual.push({ frame: _this.frame, notification: Notification.createNext(value) });
-            }, function (err) {
-                actual.push({ frame: _this.frame, notification: Notification.createError(err) });
-            }, function () {
-                actual.push({ frame: _this.frame, notification: Notification.createComplete() });
-            });
-        }, subscriptionFrame);
-        if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {
-            this.schedule(function () { return subscription.unsubscribe(); }, unsubscriptionFrame);
-        }
-        this.flushTests.push(flushTest);
-        var runMode = this.runMode;
-        return {
-            toBe: function (marbles, values, errorValue) {
-                flushTest.ready = true;
-                flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);
-            }
-        };
-    };
-    TestScheduler.prototype.expectSubscriptions = function (actualSubscriptionLogs) {
-        var flushTest = { actual: actualSubscriptionLogs, ready: false };
-        this.flushTests.push(flushTest);
-        var runMode = this.runMode;
-        return {
-            toBe: function (marbles) {
-                var marblesArray = (typeof marbles === 'string') ? [marbles] : marbles;
-                flushTest.ready = true;
-                flushTest.expected = marblesArray.map(function (marbles) {
-                    return TestScheduler.parseMarblesAsSubscriptions(marbles, runMode);
-                });
-            }
-        };
-    };
-    TestScheduler.prototype.flush = function () {
-        var _this = this;
-        var hotObservables = this.hotObservables;
-        while (hotObservables.length > 0) {
-            hotObservables.shift().setup();
-        }
-        _super.prototype.flush.call(this);
-        this.flushTests = this.flushTests.filter(function (test) {
-            if (test.ready) {
-                _this.assertDeepEqual(test.actual, test.expected);
-                return false;
-            }
-            return true;
-        });
-    };
-    TestScheduler.parseMarblesAsSubscriptions = function (marbles, runMode) {
-        var _this = this;
-        if (runMode === void 0) {
-            runMode = false;
-        }
-        if (typeof marbles !== 'string') {
-            return new SubscriptionLog(Number.POSITIVE_INFINITY);
-        }
-        var len = marbles.length;
-        var groupStart = -1;
-        var subscriptionFrame = Number.POSITIVE_INFINITY;
-        var unsubscriptionFrame = Number.POSITIVE_INFINITY;
-        var frame = 0;
-        var _loop_1 = function (i) {
-            var nextFrame = frame;
-            var advanceFrameBy = function (count) {
-                nextFrame += count * _this.frameTimeFactor;
-            };
-            var c = marbles[i];
-            switch (c) {
-                case ' ':
-                    if (!runMode) {
-                        advanceFrameBy(1);
-                    }
-                    break;
-                case '-':
-                    advanceFrameBy(1);
-                    break;
-                case '(':
-                    groupStart = frame;
-                    advanceFrameBy(1);
-                    break;
-                case ')':
-                    groupStart = -1;
-                    advanceFrameBy(1);
-                    break;
-                case '^':
-                    if (subscriptionFrame !== Number.POSITIVE_INFINITY) {
-                        throw new Error('found a second subscription point \'^\' in a ' +
-                            'subscription marble diagram. There can only be one.');
-                    }
-                    subscriptionFrame = groupStart > -1 ? groupStart : frame;
-                    advanceFrameBy(1);
-                    break;
-                case '!':
-                    if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {
-                        throw new Error('found a second subscription point \'^\' in a ' +
-                            'subscription marble diagram. There can only be one.');
-                    }
-                    unsubscriptionFrame = groupStart > -1 ? groupStart : frame;
-                    break;
-                default:
-                    if (runMode && c.match(/^[0-9]$/)) {
-                        if (i === 0 || marbles[i - 1] === ' ') {
-                            var buffer = marbles.slice(i);
-                            var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
-                            if (match) {
-                                i += match[0].length - 1;
-                                var duration = parseFloat(match[1]);
-                                var unit = match[2];
-                                var durationInMs = void 0;
-                                switch (unit) {
-                                    case 'ms':
-                                        durationInMs = duration;
-                                        break;
-                                    case 's':
-                                        durationInMs = duration * 1000;
-                                        break;
-                                    case 'm':
-                                        durationInMs = duration * 1000 * 60;
-                                        break;
-                                    default:
-                                        break;
-                                }
-                                advanceFrameBy(durationInMs / this_1.frameTimeFactor);
-                                break;
-                            }
-                        }
-                    }
-                    throw new Error('there can only be \'^\' and \'!\' markers in a ' +
-                        'subscription marble diagram. Found instead \'' + c + '\'.');
-            }
-            frame = nextFrame;
-            out_i_1 = i;
-        };
-        var this_1 = this, out_i_1;
-        for (var i = 0; i < len; i++) {
-            _loop_1(i);
-            i = out_i_1;
-        }
-        if (unsubscriptionFrame < 0) {
-            return new SubscriptionLog(subscriptionFrame);
-        }
-        else {
-            return new SubscriptionLog(subscriptionFrame, unsubscriptionFrame);
-        }
-    };
-    TestScheduler.parseMarbles = function (marbles, values, errorValue, materializeInnerObservables, runMode) {
-        var _this = this;
-        if (materializeInnerObservables === void 0) {
-            materializeInnerObservables = false;
-        }
-        if (runMode === void 0) {
-            runMode = false;
-        }
-        if (marbles.indexOf('!') !== -1) {
-            throw new Error('conventional marble diagrams cannot have the ' +
-                'unsubscription marker "!"');
-        }
-        var len = marbles.length;
-        var testMessages = [];
-        var subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');
-        var frame = subIndex === -1 ? 0 : (subIndex * -this.frameTimeFactor);
-        var getValue = typeof values !== 'object' ?
-            function (x) { return x; } :
-            function (x) {
-                if (materializeInnerObservables && values[x] instanceof ColdObservable) {
-                    return values[x].messages;
-                }
-                return values[x];
-            };
-        var groupStart = -1;
-        var _loop_2 = function (i) {
-            var nextFrame = frame;
-            var advanceFrameBy = function (count) {
-                nextFrame += count * _this.frameTimeFactor;
-            };
-            var notification = void 0;
-            var c = marbles[i];
-            switch (c) {
-                case ' ':
-                    if (!runMode) {
-                        advanceFrameBy(1);
-                    }
-                    break;
-                case '-':
-                    advanceFrameBy(1);
-                    break;
-                case '(':
-                    groupStart = frame;
-                    advanceFrameBy(1);
-                    break;
-                case ')':
-                    groupStart = -1;
-                    advanceFrameBy(1);
-                    break;
-                case '|':
-                    notification = Notification.createComplete();
-                    advanceFrameBy(1);
-                    break;
-                case '^':
-                    advanceFrameBy(1);
-                    break;
-                case '#':
-                    notification = Notification.createError(errorValue || 'error');
-                    advanceFrameBy(1);
-                    break;
-                default:
-                    if (runMode && c.match(/^[0-9]$/)) {
-                        if (i === 0 || marbles[i - 1] === ' ') {
-                            var buffer = marbles.slice(i);
-                            var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
-                            if (match) {
-                                i += match[0].length - 1;
-                                var duration = parseFloat(match[1]);
-                                var unit = match[2];
-                                var durationInMs = void 0;
-                                switch (unit) {
-                                    case 'ms':
-                                        durationInMs = duration;
-                                        break;
-                                    case 's':
-                                        durationInMs = duration * 1000;
-                                        break;
-                                    case 'm':
-                                        durationInMs = duration * 1000 * 60;
-                                        break;
-                                    default:
-                                        break;
-                                }
-                                advanceFrameBy(durationInMs / this_2.frameTimeFactor);
-                                break;
-                            }
-                        }
-                    }
-                    notification = Notification.createNext(getValue(c));
-                    advanceFrameBy(1);
-                    break;
-            }
-            if (notification) {
-                testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification: notification });
-            }
-            frame = nextFrame;
-            out_i_2 = i;
-        };
-        var this_2 = this, out_i_2;
-        for (var i = 0; i < len; i++) {
-            _loop_2(i);
-            i = out_i_2;
-        }
-        return testMessages;
-    };
-    TestScheduler.prototype.run = function (callback) {
-        var prevFrameTimeFactor = TestScheduler.frameTimeFactor;
-        var prevMaxFrames = this.maxFrames;
-        TestScheduler.frameTimeFactor = 1;
-        this.maxFrames = Number.POSITIVE_INFINITY;
-        this.runMode = true;
-        AsyncScheduler.delegate = this;
-        var helpers = {
-            cold: this.createColdObservable.bind(this),
-            hot: this.createHotObservable.bind(this),
-            flush: this.flush.bind(this),
-            expectObservable: this.expectObservable.bind(this),
-            expectSubscriptions: this.expectSubscriptions.bind(this),
-        };
-        try {
-            var ret = callback(helpers);
-            this.flush();
-            return ret;
-        }
-        finally {
-            TestScheduler.frameTimeFactor = prevFrameTimeFactor;
-            this.maxFrames = prevMaxFrames;
-            this.runMode = false;
-            AsyncScheduler.delegate = undefined;
-        }
-    };
-    return TestScheduler;
-}(VirtualTimeScheduler));
-export { TestScheduler };
-//# sourceMappingURL=TestScheduler.js.map
diff --git a/node_modules/rxjs/_esm5/internal/testing/TestScheduler.js.map b/node_modules/rxjs/_esm5/internal/testing/TestScheduler.js.map
deleted file mode 100644
index 2ef5201..0000000
--- a/node_modules/rxjs/_esm5/internal/testing/TestScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TestScheduler.js","sources":["../../../src/internal/testing/TestScheduler.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/internal/types.js b/node_modules/rxjs/_esm5/internal/types.js
deleted file mode 100644
index c62542c..0000000
--- a/node_modules/rxjs/_esm5/internal/types.js
+++ /dev/null
@@ -1 +0,0 @@
-//# sourceMappingURL=types.js.map
diff --git a/node_modules/rxjs/_esm5/internal/types.js.map b/node_modules/rxjs/_esm5/internal/types.js.map
deleted file mode 100644
index 607b992..0000000
--- a/node_modules/rxjs/_esm5/internal/types.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"types.js","sources":["../../src/internal/types.ts"],"names":[],"mappings":""}
diff --git a/node_modules/rxjs/_esm5/internal/util/ArgumentOutOfRangeError.js b/node_modules/rxjs/_esm5/internal/util/ArgumentOutOfRangeError.js
deleted file mode 100644
index 401828b..0000000
--- a/node_modules/rxjs/_esm5/internal/util/ArgumentOutOfRangeError.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-var ArgumentOutOfRangeErrorImpl = /*@__PURE__*/ (function () {
-    function ArgumentOutOfRangeErrorImpl() {
-        Error.call(this);
-        this.message = 'argument out of range';
-        this.name = 'ArgumentOutOfRangeError';
-        return this;
-    }
-    ArgumentOutOfRangeErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype);
-    return ArgumentOutOfRangeErrorImpl;
-})();
-export var ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl;
-//# sourceMappingURL=ArgumentOutOfRangeError.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/ArgumentOutOfRangeError.js.map b/node_modules/rxjs/_esm5/internal/util/ArgumentOutOfRangeError.js.map
deleted file mode 100644
index bc3c755..0000000
--- a/node_modules/rxjs/_esm5/internal/util/ArgumentOutOfRangeError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ArgumentOutOfRangeError.js","sources":["../../../src/internal/util/ArgumentOutOfRangeError.ts"],"names":[],"mappings":"AAOA,IAAM,2BAA2B,GAAG,CAAC;IACnC,SAAS,2BAA2B;QAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,uBAAuB,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO,2BAA2B,CAAC;AACrC,CAAC,CAAC,EAAE,CAAC;AAYL,MAAM,CAAC,IAAM,uBAAuB,GAAgC,2BAAkC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/EmptyError.js b/node_modules/rxjs/_esm5/internal/util/EmptyError.js
deleted file mode 100644
index cca489d..0000000
--- a/node_modules/rxjs/_esm5/internal/util/EmptyError.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-var EmptyErrorImpl = /*@__PURE__*/ (function () {
-    function EmptyErrorImpl() {
-        Error.call(this);
-        this.message = 'no elements in sequence';
-        this.name = 'EmptyError';
-        return this;
-    }
-    EmptyErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype);
-    return EmptyErrorImpl;
-})();
-export var EmptyError = EmptyErrorImpl;
-//# sourceMappingURL=EmptyError.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/EmptyError.js.map b/node_modules/rxjs/_esm5/internal/util/EmptyError.js.map
deleted file mode 100644
index 70117cf..0000000
--- a/node_modules/rxjs/_esm5/internal/util/EmptyError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"EmptyError.js","sources":["../../../src/internal/util/EmptyError.ts"],"names":[],"mappings":"AAOA,IAAM,cAAc,GAAG,CAAC;IACtB,SAAS,cAAc;QACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,yBAAyB,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE1D,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC,EAAE,CAAC;AAYL,MAAM,CAAC,IAAM,UAAU,GAAmB,cAAqB,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/Immediate.js b/node_modules/rxjs/_esm5/internal/util/Immediate.js
deleted file mode 100644
index 9d79b64..0000000
--- a/node_modules/rxjs/_esm5/internal/util/Immediate.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-var nextHandle = 1;
-var RESOLVED = /*@__PURE__*/ (function () { return /*@__PURE__*/ Promise.resolve(); })();
-var activeHandles = {};
-function findAndClearHandle(handle) {
-    if (handle in activeHandles) {
-        delete activeHandles[handle];
-        return true;
-    }
-    return false;
-}
-export var Immediate = {
-    setImmediate: function (cb) {
-        var handle = nextHandle++;
-        activeHandles[handle] = true;
-        RESOLVED.then(function () { return findAndClearHandle(handle) && cb(); });
-        return handle;
-    },
-    clearImmediate: function (handle) {
-        findAndClearHandle(handle);
-    },
-};
-export var TestTools = {
-    pending: function () {
-        return Object.keys(activeHandles).length;
-    }
-};
-//# sourceMappingURL=Immediate.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/Immediate.js.map b/node_modules/rxjs/_esm5/internal/util/Immediate.js.map
deleted file mode 100644
index dee1d43..0000000
--- a/node_modules/rxjs/_esm5/internal/util/Immediate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Immediate.js","sources":["../../../src/internal/util/Immediate.ts"],"names":[],"mappings":"AAAA,IAAI,UAAU,GAAG,CAAC,CAAC;AACnB,IAAM,QAAQ,GAAG,CAAC,cAAM,OAAA,OAAO,CAAC,OAAO,EAAE,EAAjB,CAAiB,CAAC,EAAE,CAAC;AAC7C,IAAM,aAAa,GAA2B,EAAE,CAAC;AAOjD,SAAS,kBAAkB,CAAC,MAAc;IACxC,IAAI,MAAM,IAAI,aAAa,EAAE;QAC3B,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;KACb;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAKD,MAAM,CAAC,IAAM,SAAS,GAAG;IACvB,YAAY,EAAZ,UAAa,EAAc;QACzB,IAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,cAAM,OAAA,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAlC,CAAkC,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,cAAc,EAAd,UAAe,MAAc;QAC3B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC;AAKF,MAAM,CAAC,IAAM,SAAS,GAAG;IACvB,OAAO;QACL,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;IAC3C,CAAC;CACF,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/ObjectUnsubscribedError.js b/node_modules/rxjs/_esm5/internal/util/ObjectUnsubscribedError.js
deleted file mode 100644
index 3b33398..0000000
--- a/node_modules/rxjs/_esm5/internal/util/ObjectUnsubscribedError.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-var ObjectUnsubscribedErrorImpl = /*@__PURE__*/ (function () {
-    function ObjectUnsubscribedErrorImpl() {
-        Error.call(this);
-        this.message = 'object unsubscribed';
-        this.name = 'ObjectUnsubscribedError';
-        return this;
-    }
-    ObjectUnsubscribedErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype);
-    return ObjectUnsubscribedErrorImpl;
-})();
-export var ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;
-//# sourceMappingURL=ObjectUnsubscribedError.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/ObjectUnsubscribedError.js.map b/node_modules/rxjs/_esm5/internal/util/ObjectUnsubscribedError.js.map
deleted file mode 100644
index 0e7d3af..0000000
--- a/node_modules/rxjs/_esm5/internal/util/ObjectUnsubscribedError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ObjectUnsubscribedError.js","sources":["../../../src/internal/util/ObjectUnsubscribedError.ts"],"names":[],"mappings":"AAOA,IAAM,2BAA2B,GAAG,CAAC;IACnC,SAAS,2BAA2B;QAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,qBAAqB,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO,2BAA2B,CAAC;AACrC,CAAC,CAAC,EAAE,CAAC;AAWL,MAAM,CAAC,IAAM,uBAAuB,GAAgC,2BAAkC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/TimeoutError.js b/node_modules/rxjs/_esm5/internal/util/TimeoutError.js
deleted file mode 100644
index 3740348..0000000
--- a/node_modules/rxjs/_esm5/internal/util/TimeoutError.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-var TimeoutErrorImpl = /*@__PURE__*/ (function () {
-    function TimeoutErrorImpl() {
-        Error.call(this);
-        this.message = 'Timeout has occurred';
-        this.name = 'TimeoutError';
-        return this;
-    }
-    TimeoutErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype);
-    return TimeoutErrorImpl;
-})();
-export var TimeoutError = TimeoutErrorImpl;
-//# sourceMappingURL=TimeoutError.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/TimeoutError.js.map b/node_modules/rxjs/_esm5/internal/util/TimeoutError.js.map
deleted file mode 100644
index 4dafca3..0000000
--- a/node_modules/rxjs/_esm5/internal/util/TimeoutError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TimeoutError.js","sources":["../../../src/internal/util/TimeoutError.ts"],"names":[],"mappings":"AAOA,IAAM,gBAAgB,GAAG,CAAC;IACxB,SAAS,gBAAgB;QACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,sBAAsB,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE5D,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC,EAAE,CAAC;AASL,MAAM,CAAC,IAAM,YAAY,GAAqB,gBAAuB,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/UnsubscriptionError.js b/node_modules/rxjs/_esm5/internal/util/UnsubscriptionError.js
deleted file mode 100644
index 76345fe..0000000
--- a/node_modules/rxjs/_esm5/internal/util/UnsubscriptionError.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-var UnsubscriptionErrorImpl = /*@__PURE__*/ (function () {
-    function UnsubscriptionErrorImpl(errors) {
-        Error.call(this);
-        this.message = errors ?
-            errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n  ') : '';
-        this.name = 'UnsubscriptionError';
-        this.errors = errors;
-        return this;
-    }
-    UnsubscriptionErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype);
-    return UnsubscriptionErrorImpl;
-})();
-export var UnsubscriptionError = UnsubscriptionErrorImpl;
-//# sourceMappingURL=UnsubscriptionError.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/UnsubscriptionError.js.map b/node_modules/rxjs/_esm5/internal/util/UnsubscriptionError.js.map
deleted file mode 100644
index 02a0b74..0000000
--- a/node_modules/rxjs/_esm5/internal/util/UnsubscriptionError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"UnsubscriptionError.js","sources":["../../../src/internal/util/UnsubscriptionError.ts"],"names":[],"mappings":"AAQA,IAAM,uBAAuB,GAAG,CAAC;IAC/B,SAAS,uBAAuB,CAAY,MAAa;QACvD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;YAClB,MAAM,CAAC,MAAM,iDACpB,MAAM,CAAC,GAAG,CAAC,UAAC,GAAG,EAAE,CAAC,IAAK,OAAG,CAAC,GAAG,CAAC,UAAK,GAAG,CAAC,QAAQ,EAAI,EAA7B,CAA6B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEnE,OAAO,uBAAuB,CAAC;AACjC,CAAC,CAAC,EAAE,CAAC;AAML,MAAM,CAAC,IAAM,mBAAmB,GAA4B,uBAA8B,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/applyMixins.js b/node_modules/rxjs/_esm5/internal/util/applyMixins.js
deleted file mode 100644
index 69cfe79..0000000
--- a/node_modules/rxjs/_esm5/internal/util/applyMixins.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export function applyMixins(derivedCtor, baseCtors) {
-    for (var i = 0, len = baseCtors.length; i < len; i++) {
-        var baseCtor = baseCtors[i];
-        var propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);
-        for (var j = 0, len2 = propertyKeys.length; j < len2; j++) {
-            var name_1 = propertyKeys[j];
-            derivedCtor.prototype[name_1] = baseCtor.prototype[name_1];
-        }
-    }
-}
-//# sourceMappingURL=applyMixins.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/applyMixins.js.map b/node_modules/rxjs/_esm5/internal/util/applyMixins.js.map
deleted file mode 100644
index f4dde03..0000000
--- a/node_modules/rxjs/_esm5/internal/util/applyMixins.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"applyMixins.js","sources":["../../../src/internal/util/applyMixins.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,WAAgB,EAAE,SAAgB;IAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;QACpD,IAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAM,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YACzD,IAAM,MAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,WAAW,CAAC,SAAS,CAAC,MAAI,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAI,CAAC,CAAC;SACxD;KACF;AACH,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/canReportError.js b/node_modules/rxjs/_esm5/internal/util/canReportError.js
deleted file mode 100644
index 954fc15..0000000
--- a/node_modules/rxjs/_esm5/internal/util/canReportError.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/** PURE_IMPORTS_START _Subscriber PURE_IMPORTS_END */
-import { Subscriber } from '../Subscriber';
-export function canReportError(observer) {
-    while (observer) {
-        var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped;
-        if (closed_1 || isStopped) {
-            return false;
-        }
-        else if (destination && destination instanceof Subscriber) {
-            observer = destination;
-        }
-        else {
-            observer = null;
-        }
-    }
-    return true;
-}
-//# sourceMappingURL=canReportError.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/canReportError.js.map b/node_modules/rxjs/_esm5/internal/util/canReportError.js.map
deleted file mode 100644
index 62742ce..0000000
--- a/node_modules/rxjs/_esm5/internal/util/canReportError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"canReportError.js","sources":["../../../src/internal/util/canReportError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAS3C,MAAM,UAAU,cAAc,CAAC,QAAwC;IACrE,OAAO,QAAQ,EAAE;QACT,IAAA,aAAoD,EAAlD,oBAAM,EAAE,4BAAW,EAAE,wBAAS,CAAqB;QAC3D,IAAI,QAAM,IAAI,SAAS,EAAE;YACvB,OAAO,KAAK,CAAC;SACd;aAAM,IAAI,WAAW,IAAI,WAAW,YAAY,UAAU,EAAE;YAC3D,QAAQ,GAAG,WAAW,CAAC;SACxB;aAAM;YACL,QAAQ,GAAG,IAAI,CAAC;SACjB;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/errorObject.js b/node_modules/rxjs/_esm5/internal/util/errorObject.js
deleted file mode 100644
index b6dc75b..0000000
--- a/node_modules/rxjs/_esm5/internal/util/errorObject.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export var errorObject = { e: {} };
-//# sourceMappingURL=errorObject.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/errorObject.js.map b/node_modules/rxjs/_esm5/internal/util/errorObject.js.map
deleted file mode 100644
index 58aacd1..0000000
--- a/node_modules/rxjs/_esm5/internal/util/errorObject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"errorObject.js","sources":["../../../src/internal/util/errorObject.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,IAAM,WAAW,GAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/hostReportError.js b/node_modules/rxjs/_esm5/internal/util/hostReportError.js
deleted file mode 100644
index 6b1d722..0000000
--- a/node_modules/rxjs/_esm5/internal/util/hostReportError.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export function hostReportError(err) {
-    setTimeout(function () { throw err; }, 0);
-}
-//# sourceMappingURL=hostReportError.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/hostReportError.js.map b/node_modules/rxjs/_esm5/internal/util/hostReportError.js.map
deleted file mode 100644
index 6e705e9..0000000
--- a/node_modules/rxjs/_esm5/internal/util/hostReportError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"hostReportError.js","sources":["../../../src/internal/util/hostReportError.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,eAAe,CAAC,GAAQ;IACtC,UAAU,CAAC,cAAQ,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/identity.js b/node_modules/rxjs/_esm5/internal/util/identity.js
deleted file mode 100644
index e40f423..0000000
--- a/node_modules/rxjs/_esm5/internal/util/identity.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export function identity(x) {
-    return x;
-}
-//# sourceMappingURL=identity.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/identity.js.map b/node_modules/rxjs/_esm5/internal/util/identity.js.map
deleted file mode 100644
index 3173922..0000000
--- a/node_modules/rxjs/_esm5/internal/util/identity.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"identity.js","sources":["../../../src/internal/util/identity.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAI,CAAI;IAC9B,OAAO,CAAC,CAAC;AACX,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/isArray.js b/node_modules/rxjs/_esm5/internal/util/isArray.js
deleted file mode 100644
index 52ce6a3..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isArray.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export var isArray = /*@__PURE__*/ (function () { return Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); })();
-//# sourceMappingURL=isArray.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/isArray.js.map b/node_modules/rxjs/_esm5/internal/util/isArray.js.map
deleted file mode 100644
index 39e072f..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isArray.js","sources":["../../../src/internal/util/isArray.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,OAAO,GAAG,CAAC,cAAM,OAAA,KAAK,CAAC,OAAO,IAAI,CAAC,UAAI,CAAM,IAAe,OAAA,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAjC,CAAiC,CAAC,EAA7E,CAA6E,CAAC,EAAE,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/isArrayLike.js b/node_modules/rxjs/_esm5/internal/util/isArrayLike.js
deleted file mode 100644
index 770234e..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isArrayLike.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });
-//# sourceMappingURL=isArrayLike.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/isArrayLike.js.map b/node_modules/rxjs/_esm5/internal/util/isArrayLike.js.map
deleted file mode 100644
index 72e46a4..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isArrayLike.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isArrayLike.js","sources":["../../../src/internal/util/isArrayLike.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAM,WAAW,GAAG,CAAC,UAAI,CAAM,IAAwB,OAAA,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,UAAU,EAA5D,CAA4D,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/isDate.js b/node_modules/rxjs/_esm5/internal/util/isDate.js
deleted file mode 100644
index d9ef2a3..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isDate.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export function isDate(value) {
-    return value instanceof Date && !isNaN(+value);
-}
-//# sourceMappingURL=isDate.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/isDate.js.map b/node_modules/rxjs/_esm5/internal/util/isDate.js.map
deleted file mode 100644
index 6958919..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isDate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isDate.js","sources":["../../../src/internal/util/isDate.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAAC,KAAU;IAC/B,OAAO,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/isFunction.js b/node_modules/rxjs/_esm5/internal/util/isFunction.js
deleted file mode 100644
index 09c5a25..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isFunction.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export function isFunction(x) {
-    return typeof x === 'function';
-}
-//# sourceMappingURL=isFunction.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/isFunction.js.map b/node_modules/rxjs/_esm5/internal/util/isFunction.js.map
deleted file mode 100644
index 3774b95..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isFunction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isFunction.js","sources":["../../../src/internal/util/isFunction.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,CAAM;IAC/B,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC;AACjC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/isInteropObservable.js b/node_modules/rxjs/_esm5/internal/util/isInteropObservable.js
deleted file mode 100644
index ed0dab0..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isInteropObservable.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */
-import { observable as Symbol_observable } from '../symbol/observable';
-export function isInteropObservable(input) {
-    return input && typeof input[Symbol_observable] === 'function';
-}
-//# sourceMappingURL=isInteropObservable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/isInteropObservable.js.map b/node_modules/rxjs/_esm5/internal/util/isInteropObservable.js.map
deleted file mode 100644
index 8826421..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isInteropObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isInteropObservable.js","sources":["../../../src/internal/util/isInteropObservable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGvE,MAAM,UAAU,mBAAmB,CAAC,KAAU;IAC5C,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC,iBAAiB,CAAC,KAAK,UAAU,CAAC;AACjE,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/isIterable.js b/node_modules/rxjs/_esm5/internal/util/isIterable.js
deleted file mode 100644
index d1b7c1e..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isIterable.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */
-import { iterator as Symbol_iterator } from '../symbol/iterator';
-export function isIterable(input) {
-    return input && typeof input[Symbol_iterator] === 'function';
-}
-//# sourceMappingURL=isIterable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/isIterable.js.map b/node_modules/rxjs/_esm5/internal/util/isIterable.js.map
deleted file mode 100644
index 3ff5f6e..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isIterable.js","sources":["../../../src/internal/util/isIterable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGjE,MAAM,UAAU,UAAU,CAAC,KAAU;IACnC,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC,eAAe,CAAC,KAAK,UAAU,CAAC;AAC/D,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/isNumeric.js b/node_modules/rxjs/_esm5/internal/util/isNumeric.js
deleted file mode 100644
index eb21f1f..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isNumeric.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _isArray PURE_IMPORTS_END */
-import { isArray } from './isArray';
-export function isNumeric(val) {
-    return !isArray(val) && (val - parseFloat(val) + 1) >= 0;
-}
-//# sourceMappingURL=isNumeric.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/isNumeric.js.map b/node_modules/rxjs/_esm5/internal/util/isNumeric.js.map
deleted file mode 100644
index b5954be..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isNumeric.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isNumeric.js","sources":["../../../src/internal/util/isNumeric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU,SAAS,CAAC,GAAQ;IAKhC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/isObject.js b/node_modules/rxjs/_esm5/internal/util/isObject.js
deleted file mode 100644
index 709a8a7..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isObject.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export function isObject(x) {
-    return x !== null && typeof x === 'object';
-}
-//# sourceMappingURL=isObject.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/isObject.js.map b/node_modules/rxjs/_esm5/internal/util/isObject.js.map
deleted file mode 100644
index f942bed..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isObject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isObject.js","sources":["../../../src/internal/util/isObject.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,CAAM;IAC7B,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;AAC7C,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/isObservable.js b/node_modules/rxjs/_esm5/internal/util/isObservable.js
deleted file mode 100644
index af8b987..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isObservable.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */
-import { Observable } from '../Observable';
-export function isObservable(obj) {
-    return !!obj && (obj instanceof Observable || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));
-}
-//# sourceMappingURL=isObservable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/isObservable.js.map b/node_modules/rxjs/_esm5/internal/util/isObservable.js.map
deleted file mode 100644
index fa08bc7..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isObservable.js","sources":["../../../src/internal/util/isObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAO3C,MAAM,UAAU,YAAY,CAAI,GAAQ;IACtC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,YAAY,UAAU,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC;AACzH,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/isPromise.js b/node_modules/rxjs/_esm5/internal/util/isPromise.js
deleted file mode 100644
index d5c579b..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isPromise.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export function isPromise(value) {
-    return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
-}
-//# sourceMappingURL=isPromise.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/isPromise.js.map b/node_modules/rxjs/_esm5/internal/util/isPromise.js.map
deleted file mode 100644
index dcd975c..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isPromise.js","sources":["../../../src/internal/util/isPromise.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,SAAS,CAAC,KAAU;IAClC,OAAO,CAAC,CAAC,KAAK,IAAI,OAAa,KAAM,CAAC,SAAS,KAAK,UAAU,IAAI,OAAQ,KAAa,CAAC,IAAI,KAAK,UAAU,CAAC;AAC9G,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/isScheduler.js b/node_modules/rxjs/_esm5/internal/util/isScheduler.js
deleted file mode 100644
index f5218be..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isScheduler.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export function isScheduler(value) {
-    return value && typeof value.schedule === 'function';
-}
-//# sourceMappingURL=isScheduler.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/isScheduler.js.map b/node_modules/rxjs/_esm5/internal/util/isScheduler.js.map
deleted file mode 100644
index 75c4eca..0000000
--- a/node_modules/rxjs/_esm5/internal/util/isScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isScheduler.js","sources":["../../../src/internal/util/isScheduler.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,KAAU;IACpC,OAAO,KAAK,IAAI,OAAa,KAAM,CAAC,QAAQ,KAAK,UAAU,CAAC;AAC9D,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/noop.js b/node_modules/rxjs/_esm5/internal/util/noop.js
deleted file mode 100644
index 65de19c..0000000
--- a/node_modules/rxjs/_esm5/internal/util/noop.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export function noop() { }
-//# sourceMappingURL=noop.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/noop.js.map b/node_modules/rxjs/_esm5/internal/util/noop.js.map
deleted file mode 100644
index 5d245d8..0000000
--- a/node_modules/rxjs/_esm5/internal/util/noop.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"noop.js","sources":["../../../src/internal/util/noop.ts"],"names":[],"mappings":"AACA,MAAM,UAAU,IAAI,KAAK,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/not.js b/node_modules/rxjs/_esm5/internal/util/not.js
deleted file mode 100644
index a77962e..0000000
--- a/node_modules/rxjs/_esm5/internal/util/not.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export function not(pred, thisArg) {
-    function notPred() {
-        return !(notPred.pred.apply(notPred.thisArg, arguments));
-    }
-    notPred.pred = pred;
-    notPred.thisArg = thisArg;
-    return notPred;
-}
-//# sourceMappingURL=not.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/not.js.map b/node_modules/rxjs/_esm5/internal/util/not.js.map
deleted file mode 100644
index c74adc5..0000000
--- a/node_modules/rxjs/_esm5/internal/util/not.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"not.js","sources":["../../../src/internal/util/not.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,CAAC,IAAc,EAAE,OAAY;IAC9C,SAAS,OAAO;QACd,OAAO,CAAC,CAAQ,OAAQ,CAAC,IAAI,CAAC,KAAK,CAAQ,OAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3E,CAAC;IACM,OAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,OAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAClC,OAAO,OAAO,CAAC;AACjB,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/pipe.js b/node_modules/rxjs/_esm5/internal/util/pipe.js
deleted file mode 100644
index f02d398..0000000
--- a/node_modules/rxjs/_esm5/internal/util/pipe.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/** PURE_IMPORTS_START _noop PURE_IMPORTS_END */
-import { noop } from './noop';
-export function pipe() {
-    var fns = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        fns[_i] = arguments[_i];
-    }
-    return pipeFromArray(fns);
-}
-export function pipeFromArray(fns) {
-    if (!fns) {
-        return noop;
-    }
-    if (fns.length === 1) {
-        return fns[0];
-    }
-    return function piped(input) {
-        return fns.reduce(function (prev, fn) { return fn(prev); }, input);
-    };
-}
-//# sourceMappingURL=pipe.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/pipe.js.map b/node_modules/rxjs/_esm5/internal/util/pipe.js.map
deleted file mode 100644
index 7fb0dd0..0000000
--- a/node_modules/rxjs/_esm5/internal/util/pipe.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pipe.js","sources":["../../../src/internal/util/pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAiB9B,MAAM,UAAU,IAAI;IAAC,aAAsC;SAAtC,UAAsC,EAAtC,qBAAsC,EAAtC,IAAsC;QAAtC,wBAAsC;;IACzD,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAGD,MAAM,UAAU,aAAa,CAAO,GAA+B;IACjE,IAAI,CAAC,GAAG,EAAE;QACR,OAAO,IAA+B,CAAC;KACxC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;QACpB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;KACf;IAED,OAAO,SAAS,KAAK,CAAC,KAAQ;QAC5B,OAAO,GAAG,CAAC,MAAM,CAAC,UAAC,IAAS,EAAE,EAAuB,IAAK,OAAA,EAAE,CAAC,IAAI,CAAC,EAAR,CAAQ,EAAE,KAAY,CAAC,CAAC;IACpF,CAAC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/root.js b/node_modules/rxjs/_esm5/internal/util/root.js
deleted file mode 100644
index 48b2a87..0000000
--- a/node_modules/rxjs/_esm5/internal/util/root.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-var __window = typeof window !== 'undefined' && window;
-var __self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&
-    self instanceof WorkerGlobalScope && self;
-var __global = typeof global !== 'undefined' && global;
-var _root = __window || __global || __self;
-/*@__PURE__*/ (function () {
-    if (!_root) {
-        throw /*@__PURE__*/ new Error('RxJS could not find any global context (window, self, global)');
-    }
-})();
-export { _root as root };
-//# sourceMappingURL=root.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/root.js.map b/node_modules/rxjs/_esm5/internal/util/root.js.map
deleted file mode 100644
index 29b8a5f..0000000
--- a/node_modules/rxjs/_esm5/internal/util/root.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"root.js","sources":["../../../src/internal/util/root.ts"],"names":[],"mappings":"AAeA,IAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC;AACzD,IAAM,MAAM,GAAG,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,iBAAiB,KAAK,WAAW;IAClF,IAAI,YAAY,iBAAiB,IAAI,IAAI,CAAC;AAC9C,IAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC;AACzD,IAAM,KAAK,GAAQ,QAAQ,IAAI,QAAQ,IAAI,MAAM,CAAC;AAKlD,CAAC;IACC,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;KAClF;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/subscribeTo.js b/node_modules/rxjs/_esm5/internal/util/subscribeTo.js
deleted file mode 100644
index f18d25e..0000000
--- a/node_modules/rxjs/_esm5/internal/util/subscribeTo.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/** PURE_IMPORTS_START _subscribeToArray,_subscribeToPromise,_subscribeToIterable,_subscribeToObservable,_isArrayLike,_isPromise,_isObject,_symbol_iterator,_symbol_observable PURE_IMPORTS_END */
-import { subscribeToArray } from './subscribeToArray';
-import { subscribeToPromise } from './subscribeToPromise';
-import { subscribeToIterable } from './subscribeToIterable';
-import { subscribeToObservable } from './subscribeToObservable';
-import { isArrayLike } from './isArrayLike';
-import { isPromise } from './isPromise';
-import { isObject } from './isObject';
-import { iterator as Symbol_iterator } from '../symbol/iterator';
-import { observable as Symbol_observable } from '../symbol/observable';
-export var subscribeTo = function (result) {
-    if (!!result && typeof result[Symbol_observable] === 'function') {
-        return subscribeToObservable(result);
-    }
-    else if (isArrayLike(result)) {
-        return subscribeToArray(result);
-    }
-    else if (isPromise(result)) {
-        return subscribeToPromise(result);
-    }
-    else if (!!result && typeof result[Symbol_iterator] === 'function') {
-        return subscribeToIterable(result);
-    }
-    else {
-        var value = isObject(result) ? 'an invalid object' : "'" + result + "'";
-        var msg = "You provided " + value + " where a stream was expected."
-            + ' You can provide an Observable, Promise, Array, or Iterable.';
-        throw new TypeError(msg);
-    }
-};
-//# sourceMappingURL=subscribeTo.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/subscribeTo.js.map b/node_modules/rxjs/_esm5/internal/util/subscribeTo.js.map
deleted file mode 100644
index d4ceec1..0000000
--- a/node_modules/rxjs/_esm5/internal/util/subscribeTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeTo.js","sources":["../../../src/internal/util/subscribeTo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIvE,MAAM,CAAC,IAAM,WAAW,GAAG,UAAI,MAA0B;IACvD,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,iBAAiB,CAAC,KAAK,UAAU,EAAE;QAC/D,OAAO,qBAAqB,CAAC,MAAa,CAAC,CAAC;KAC7C;SAAM,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE;QAC9B,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;KACjC;SAAM,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE;QAC5B,OAAO,kBAAkB,CAAC,MAAsB,CAAC,CAAC;KACnD;SAAM,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,UAAU,EAAE;QACpE,OAAO,mBAAmB,CAAC,MAAa,CAAC,CAAC;KAC3C;SAAM;QACL,IAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAI,MAAM,MAAG,CAAC;QACrE,IAAM,GAAG,GAAG,kBAAgB,KAAK,kCAA+B;cAC5D,8DAA8D,CAAC;QACnE,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;KAC1B;AACH,CAAC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/subscribeToArray.js b/node_modules/rxjs/_esm5/internal/util/subscribeToArray.js
deleted file mode 100644
index 1c45718..0000000
--- a/node_modules/rxjs/_esm5/internal/util/subscribeToArray.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export var subscribeToArray = function (array) {
-    return function (subscriber) {
-        for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) {
-            subscriber.next(array[i]);
-        }
-        subscriber.complete();
-    };
-};
-//# sourceMappingURL=subscribeToArray.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/subscribeToArray.js.map b/node_modules/rxjs/_esm5/internal/util/subscribeToArray.js.map
deleted file mode 100644
index 72d912b..0000000
--- a/node_modules/rxjs/_esm5/internal/util/subscribeToArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToArray.js","sources":["../../../src/internal/util/subscribeToArray.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,IAAM,gBAAgB,GAAG,UAAI,KAAmB,IAAK,OAAA,UAAC,UAAyB;IACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC3B;IACD,UAAU,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,EAL2D,CAK3D,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/subscribeToIterable.js b/node_modules/rxjs/_esm5/internal/util/subscribeToIterable.js
deleted file mode 100644
index 39dcb2d..0000000
--- a/node_modules/rxjs/_esm5/internal/util/subscribeToIterable.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */
-import { iterator as Symbol_iterator } from '../symbol/iterator';
-export var subscribeToIterable = function (iterable) {
-    return function (subscriber) {
-        var iterator = iterable[Symbol_iterator]();
-        do {
-            var item = iterator.next();
-            if (item.done) {
-                subscriber.complete();
-                break;
-            }
-            subscriber.next(item.value);
-            if (subscriber.closed) {
-                break;
-            }
-        } while (true);
-        if (typeof iterator.return === 'function') {
-            subscriber.add(function () {
-                if (iterator.return) {
-                    iterator.return();
-                }
-            });
-        }
-        return subscriber;
-    };
-};
-//# sourceMappingURL=subscribeToIterable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/subscribeToIterable.js.map b/node_modules/rxjs/_esm5/internal/util/subscribeToIterable.js.map
deleted file mode 100644
index 9fd0ca4..0000000
--- a/node_modules/rxjs/_esm5/internal/util/subscribeToIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToIterable.js","sources":["../../../src/internal/util/subscribeToIterable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,CAAC,IAAM,mBAAmB,GAAG,UAAI,QAAqB,IAAK,OAAA,UAAC,UAAyB;IACzF,IAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;IAC7C,GAAG;QACD,IAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,UAAU,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM;SACP;QACD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,UAAU,CAAC,MAAM,EAAE;YACrB,MAAM;SACP;KACF,QAAQ,IAAI,EAAE;IAGf,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE;QACzC,UAAU,CAAC,GAAG,CAAC;YACb,IAAI,QAAQ,CAAC,MAAM,EAAE;gBACnB,QAAQ,CAAC,MAAM,EAAE,CAAC;aACnB;QACH,CAAC,CAAC,CAAC;KACJ;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,EAxBgE,CAwBhE,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/subscribeToObservable.js b/node_modules/rxjs/_esm5/internal/util/subscribeToObservable.js
deleted file mode 100644
index 1a04dfc..0000000
--- a/node_modules/rxjs/_esm5/internal/util/subscribeToObservable.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */
-import { observable as Symbol_observable } from '../symbol/observable';
-export var subscribeToObservable = function (obj) {
-    return function (subscriber) {
-        var obs = obj[Symbol_observable]();
-        if (typeof obs.subscribe !== 'function') {
-            throw new TypeError('Provided object does not correctly implement Symbol.observable');
-        }
-        else {
-            return obs.subscribe(subscriber);
-        }
-    };
-};
-//# sourceMappingURL=subscribeToObservable.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/subscribeToObservable.js.map b/node_modules/rxjs/_esm5/internal/util/subscribeToObservable.js.map
deleted file mode 100644
index 13f8849..0000000
--- a/node_modules/rxjs/_esm5/internal/util/subscribeToObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToObservable.js","sources":["../../../src/internal/util/subscribeToObservable.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAOvE,MAAM,CAAC,IAAM,qBAAqB,GAAG,UAAI,GAAQ,IAAK,OAAA,UAAC,UAAyB;IAC9E,IAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;IACrC,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,EAAE;QAEvC,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;KACvF;SAAM;QACL,OAAO,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;KAClC;AACH,CAAC,EARqD,CAQrD,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/subscribeToPromise.js b/node_modules/rxjs/_esm5/internal/util/subscribeToPromise.js
deleted file mode 100644
index 1a01bbe..0000000
--- a/node_modules/rxjs/_esm5/internal/util/subscribeToPromise.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/** PURE_IMPORTS_START _hostReportError PURE_IMPORTS_END */
-import { hostReportError } from './hostReportError';
-export var subscribeToPromise = function (promise) {
-    return function (subscriber) {
-        promise.then(function (value) {
-            if (!subscriber.closed) {
-                subscriber.next(value);
-                subscriber.complete();
-            }
-        }, function (err) { return subscriber.error(err); })
-            .then(null, hostReportError);
-        return subscriber;
-    };
-};
-//# sourceMappingURL=subscribeToPromise.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/subscribeToPromise.js.map b/node_modules/rxjs/_esm5/internal/util/subscribeToPromise.js.map
deleted file mode 100644
index 8271a7e..0000000
--- a/node_modules/rxjs/_esm5/internal/util/subscribeToPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToPromise.js","sources":["../../../src/internal/util/subscribeToPromise.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,CAAC,IAAM,kBAAkB,GAAG,UAAI,OAAuB,IAAK,OAAA,UAAC,UAAyB;IAC1F,OAAO,CAAC,IAAI,CACV,UAAC,KAAK;QACJ,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACtB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,UAAU,CAAC,QAAQ,EAAE,CAAC;SACvB;IACH,CAAC,EACD,UAAC,GAAQ,IAAK,OAAA,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAArB,CAAqB,CACpC;SACA,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC7B,OAAO,UAAU,CAAC;AACpB,CAAC,EAZiE,CAYjE,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/subscribeToResult.js b/node_modules/rxjs/_esm5/internal/util/subscribeToResult.js
deleted file mode 100644
index 73b36eb..0000000
--- a/node_modules/rxjs/_esm5/internal/util/subscribeToResult.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/** PURE_IMPORTS_START _InnerSubscriber,_subscribeTo,_Observable PURE_IMPORTS_END */
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeTo } from './subscribeTo';
-import { Observable } from '../Observable';
-export function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, innerSubscriber) {
-    if (innerSubscriber === void 0) {
-        innerSubscriber = new InnerSubscriber(outerSubscriber, outerValue, outerIndex);
-    }
-    if (innerSubscriber.closed) {
-        return undefined;
-    }
-    if (result instanceof Observable) {
-        return result.subscribe(innerSubscriber);
-    }
-    return subscribeTo(result)(innerSubscriber);
-}
-//# sourceMappingURL=subscribeToResult.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/subscribeToResult.js.map b/node_modules/rxjs/_esm5/internal/util/subscribeToResult.js.map
deleted file mode 100644
index 5a5239c..0000000
--- a/node_modules/rxjs/_esm5/internal/util/subscribeToResult.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToResult.js","sources":["../../../src/internal/util/subscribeToResult.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAiB3C,MAAM,UAAU,iBAAiB,CAC/B,eAAsC,EACtC,MAAW,EACX,UAAc,EACd,UAAmB,EACnB,eAA6F;IAA7F,gCAAA,EAAA,sBAAqC,eAAe,CAAC,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC;IAE7F,IAAI,eAAe,CAAC,MAAM,EAAE;QAC1B,OAAO,SAAS,CAAC;KAClB;IACD,IAAI,MAAM,YAAY,UAAU,EAAE;QAChC,OAAO,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;KAC1C;IACD,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAiB,CAAC;AAC9D,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/toSubscriber.js b/node_modules/rxjs/_esm5/internal/util/toSubscriber.js
deleted file mode 100644
index b61db35..0000000
--- a/node_modules/rxjs/_esm5/internal/util/toSubscriber.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/** PURE_IMPORTS_START _Subscriber,_symbol_rxSubscriber,_Observer PURE_IMPORTS_END */
-import { Subscriber } from '../Subscriber';
-import { rxSubscriber as rxSubscriberSymbol } from '../symbol/rxSubscriber';
-import { empty as emptyObserver } from '../Observer';
-export function toSubscriber(nextOrObserver, error, complete) {
-    if (nextOrObserver) {
-        if (nextOrObserver instanceof Subscriber) {
-            return nextOrObserver;
-        }
-        if (nextOrObserver[rxSubscriberSymbol]) {
-            return nextOrObserver[rxSubscriberSymbol]();
-        }
-    }
-    if (!nextOrObserver && !error && !complete) {
-        return new Subscriber(emptyObserver);
-    }
-    return new Subscriber(nextOrObserver, error, complete);
-}
-//# sourceMappingURL=toSubscriber.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/toSubscriber.js.map b/node_modules/rxjs/_esm5/internal/util/toSubscriber.js.map
deleted file mode 100644
index 5f6c7a9..0000000
--- a/node_modules/rxjs/_esm5/internal/util/toSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"toSubscriber.js","sources":["../../../src/internal/util/toSubscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,KAAK,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AAGrD,MAAM,UAAU,YAAY,CAC1B,cAA0D,EAC1D,KAA4B,EAC5B,QAAqB;IAErB,IAAI,cAAc,EAAE;QAClB,IAAI,cAAc,YAAY,UAAU,EAAE;YACxC,OAAwB,cAAe,CAAC;SACzC;QAED,IAAI,cAAc,CAAC,kBAAkB,CAAC,EAAE;YACtC,OAAO,cAAc,CAAC,kBAAkB,CAAC,EAAE,CAAC;SAC7C;KACF;IAED,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE;QAC1C,OAAO,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;KACtC;IAED,OAAO,IAAI,UAAU,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC"}
diff --git a/node_modules/rxjs/_esm5/internal/util/tryCatch.js b/node_modules/rxjs/_esm5/internal/util/tryCatch.js
deleted file mode 100644
index d49095d..0000000
--- a/node_modules/rxjs/_esm5/internal/util/tryCatch.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/** PURE_IMPORTS_START _errorObject PURE_IMPORTS_END */
-import { errorObject } from './errorObject';
-var tryCatchTarget;
-function tryCatcher() {
-    errorObject.e = undefined;
-    try {
-        return tryCatchTarget.apply(this, arguments);
-    }
-    catch (e) {
-        errorObject.e = e;
-        return errorObject;
-    }
-    finally {
-        tryCatchTarget = undefined;
-    }
-}
-export function tryCatch(fn) {
-    tryCatchTarget = fn;
-    return tryCatcher;
-}
-//# sourceMappingURL=tryCatch.js.map
diff --git a/node_modules/rxjs/_esm5/internal/util/tryCatch.js.map b/node_modules/rxjs/_esm5/internal/util/tryCatch.js.map
deleted file mode 100644
index f685299..0000000
--- a/node_modules/rxjs/_esm5/internal/util/tryCatch.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"tryCatch.js","sources":["../../../src/internal/util/tryCatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,IAAI,cAAwB,CAAC;AAE7B,SAAS,UAAU;IACjB,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC;IAC1B,IAAI;QACF,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;KAC9C;IAAC,OAAO,CAAC,EAAE;QACV,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,WAAW,CAAC;KACpB;YAAS;QACR,cAAc,GAAG,SAAS,CAAC;KAC5B;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAqB,EAAK;IAChD,cAAc,GAAG,EAAE,CAAC;IACpB,OAAY,UAAU,CAAC;AACzB,CAAC"}
diff --git a/node_modules/rxjs/_esm5/operators/index.js b/node_modules/rxjs/_esm5/operators/index.js
deleted file mode 100644
index 808bb1d..0000000
--- a/node_modules/rxjs/_esm5/operators/index.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export { audit } from '../internal/operators/audit';
-export { auditTime } from '../internal/operators/auditTime';
-export { buffer } from '../internal/operators/buffer';
-export { bufferCount } from '../internal/operators/bufferCount';
-export { bufferTime } from '../internal/operators/bufferTime';
-export { bufferToggle } from '../internal/operators/bufferToggle';
-export { bufferWhen } from '../internal/operators/bufferWhen';
-export { catchError } from '../internal/operators/catchError';
-export { combineAll } from '../internal/operators/combineAll';
-export { combineLatest } from '../internal/operators/combineLatest';
-export { concat } from '../internal/operators/concat';
-export { concatAll } from '../internal/operators/concatAll';
-export { concatMap } from '../internal/operators/concatMap';
-export { concatMapTo } from '../internal/operators/concatMapTo';
-export { count } from '../internal/operators/count';
-export { debounce } from '../internal/operators/debounce';
-export { debounceTime } from '../internal/operators/debounceTime';
-export { defaultIfEmpty } from '../internal/operators/defaultIfEmpty';
-export { delay } from '../internal/operators/delay';
-export { delayWhen } from '../internal/operators/delayWhen';
-export { dematerialize } from '../internal/operators/dematerialize';
-export { distinct } from '../internal/operators/distinct';
-export { distinctUntilChanged } from '../internal/operators/distinctUntilChanged';
-export { distinctUntilKeyChanged } from '../internal/operators/distinctUntilKeyChanged';
-export { elementAt } from '../internal/operators/elementAt';
-export { endWith } from '../internal/operators/endWith';
-export { every } from '../internal/operators/every';
-export { exhaust } from '../internal/operators/exhaust';
-export { exhaustMap } from '../internal/operators/exhaustMap';
-export { expand } from '../internal/operators/expand';
-export { filter } from '../internal/operators/filter';
-export { finalize } from '../internal/operators/finalize';
-export { find } from '../internal/operators/find';
-export { findIndex } from '../internal/operators/findIndex';
-export { first } from '../internal/operators/first';
-export { groupBy } from '../internal/operators/groupBy';
-export { ignoreElements } from '../internal/operators/ignoreElements';
-export { isEmpty } from '../internal/operators/isEmpty';
-export { last } from '../internal/operators/last';
-export { map } from '../internal/operators/map';
-export { mapTo } from '../internal/operators/mapTo';
-export { materialize } from '../internal/operators/materialize';
-export { max } from '../internal/operators/max';
-export { merge } from '../internal/operators/merge';
-export { mergeAll } from '../internal/operators/mergeAll';
-export { mergeMap } from '../internal/operators/mergeMap';
-export { mergeMap as flatMap } from '../internal/operators/mergeMap';
-export { mergeMapTo } from '../internal/operators/mergeMapTo';
-export { mergeScan } from '../internal/operators/mergeScan';
-export { min } from '../internal/operators/min';
-export { multicast } from '../internal/operators/multicast';
-export { observeOn } from '../internal/operators/observeOn';
-export { onErrorResumeNext } from '../internal/operators/onErrorResumeNext';
-export { pairwise } from '../internal/operators/pairwise';
-export { partition } from '../internal/operators/partition';
-export { pluck } from '../internal/operators/pluck';
-export { publish } from '../internal/operators/publish';
-export { publishBehavior } from '../internal/operators/publishBehavior';
-export { publishLast } from '../internal/operators/publishLast';
-export { publishReplay } from '../internal/operators/publishReplay';
-export { race } from '../internal/operators/race';
-export { reduce } from '../internal/operators/reduce';
-export { repeat } from '../internal/operators/repeat';
-export { repeatWhen } from '../internal/operators/repeatWhen';
-export { retry } from '../internal/operators/retry';
-export { retryWhen } from '../internal/operators/retryWhen';
-export { refCount } from '../internal/operators/refCount';
-export { sample } from '../internal/operators/sample';
-export { sampleTime } from '../internal/operators/sampleTime';
-export { scan } from '../internal/operators/scan';
-export { sequenceEqual } from '../internal/operators/sequenceEqual';
-export { share } from '../internal/operators/share';
-export { shareReplay } from '../internal/operators/shareReplay';
-export { single } from '../internal/operators/single';
-export { skip } from '../internal/operators/skip';
-export { skipLast } from '../internal/operators/skipLast';
-export { skipUntil } from '../internal/operators/skipUntil';
-export { skipWhile } from '../internal/operators/skipWhile';
-export { startWith } from '../internal/operators/startWith';
-export { subscribeOn } from '../internal/operators/subscribeOn';
-export { switchAll } from '../internal/operators/switchAll';
-export { switchMap } from '../internal/operators/switchMap';
-export { switchMapTo } from '../internal/operators/switchMapTo';
-export { take } from '../internal/operators/take';
-export { takeLast } from '../internal/operators/takeLast';
-export { takeUntil } from '../internal/operators/takeUntil';
-export { takeWhile } from '../internal/operators/takeWhile';
-export { tap } from '../internal/operators/tap';
-export { throttle } from '../internal/operators/throttle';
-export { throttleTime } from '../internal/operators/throttleTime';
-export { throwIfEmpty } from '../internal/operators/throwIfEmpty';
-export { timeInterval } from '../internal/operators/timeInterval';
-export { timeout } from '../internal/operators/timeout';
-export { timeoutWith } from '../internal/operators/timeoutWith';
-export { timestamp } from '../internal/operators/timestamp';
-export { toArray } from '../internal/operators/toArray';
-export { window } from '../internal/operators/window';
-export { windowCount } from '../internal/operators/windowCount';
-export { windowTime } from '../internal/operators/windowTime';
-export { windowToggle } from '../internal/operators/windowToggle';
-export { windowWhen } from '../internal/operators/windowWhen';
-export { withLatestFrom } from '../internal/operators/withLatestFrom';
-export { zip } from '../internal/operators/zip';
-export { zipAll } from '../internal/operators/zipAll';
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/rxjs/_esm5/operators/index.js.map b/node_modules/rxjs/_esm5/operators/index.js.map
deleted file mode 100644
index 3d3ab93..0000000
--- a/node_modules/rxjs/_esm5/operators/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/operators/index.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/_esm5/path-mapping.js b/node_modules/rxjs/_esm5/path-mapping.js
deleted file mode 100644
index 2fc15a1..0000000
--- a/node_modules/rxjs/_esm5/path-mapping.js
+++ /dev/null
@@ -1,453 +0,0 @@
-
-"use strict"
-
-var path = require('path');
-var dir = path.resolve(__dirname);
-
-module.exports = function() {
-  return {
-    "rxjs/util/tryCatch": "rxjs-compat/_esm5/util/tryCatch",
-    "rxjs/util/toSubscriber": "rxjs-compat/_esm5/util/toSubscriber",
-    "rxjs/util/subscribeToResult": "rxjs-compat/_esm5/util/subscribeToResult",
-    "rxjs/util/subscribeToPromise": "rxjs-compat/_esm5/util/subscribeToPromise",
-    "rxjs/util/subscribeToObservable": "rxjs-compat/_esm5/util/subscribeToObservable",
-    "rxjs/util/subscribeToIterable": "rxjs-compat/_esm5/util/subscribeToIterable",
-    "rxjs/util/subscribeToArray": "rxjs-compat/_esm5/util/subscribeToArray",
-    "rxjs/util/subscribeTo": "rxjs-compat/_esm5/util/subscribeTo",
-    "rxjs/util/root": "rxjs-compat/_esm5/util/root",
-    "rxjs/util/pipe": "rxjs-compat/_esm5/util/pipe",
-    "rxjs/util/not": "rxjs-compat/_esm5/util/not",
-    "rxjs/util/noop": "rxjs-compat/_esm5/util/noop",
-    "rxjs/util/isScheduler": "rxjs-compat/_esm5/util/isScheduler",
-    "rxjs/util/isPromise": "rxjs-compat/_esm5/util/isPromise",
-    "rxjs/util/isObservable": "rxjs-compat/_esm5/util/isObservable",
-    "rxjs/util/isObject": "rxjs-compat/_esm5/util/isObject",
-    "rxjs/util/isNumeric": "rxjs-compat/_esm5/util/isNumeric",
-    "rxjs/util/isIterable": "rxjs-compat/_esm5/util/isIterable",
-    "rxjs/util/isFunction": "rxjs-compat/_esm5/util/isFunction",
-    "rxjs/util/isDate": "rxjs-compat/_esm5/util/isDate",
-    "rxjs/util/isArrayLike": "rxjs-compat/_esm5/util/isArrayLike",
-    "rxjs/util/isArray": "rxjs-compat/_esm5/util/isArray",
-    "rxjs/util/identity": "rxjs-compat/_esm5/util/identity",
-    "rxjs/util/hostReportError": "rxjs-compat/_esm5/util/hostReportError",
-    "rxjs/util/errorObject": "rxjs-compat/_esm5/util/errorObject",
-    "rxjs/util/applyMixins": "rxjs-compat/_esm5/util/applyMixins",
-    "rxjs/util/UnsubscriptionError": "rxjs-compat/_esm5/util/UnsubscriptionError",
-    "rxjs/util/TimeoutError": "rxjs-compat/_esm5/util/TimeoutError",
-    "rxjs/util/ObjectUnsubscribedError": "rxjs-compat/_esm5/util/ObjectUnsubscribedError",
-    "rxjs/util/Immediate": "rxjs-compat/_esm5/util/Immediate",
-    "rxjs/util/EmptyError": "rxjs-compat/_esm5/util/EmptyError",
-    "rxjs/util/ArgumentOutOfRangeError": "rxjs-compat/_esm5/util/ArgumentOutOfRangeError",
-    "rxjs/symbol/rxSubscriber": "rxjs-compat/_esm5/symbol/rxSubscriber",
-    "rxjs/symbol/observable": "rxjs-compat/_esm5/symbol/observable",
-    "rxjs/symbol/iterator": "rxjs-compat/_esm5/symbol/iterator",
-    "rxjs/scheduler/queue": "rxjs-compat/_esm5/scheduler/queue",
-    "rxjs/scheduler/async": "rxjs-compat/_esm5/scheduler/async",
-    "rxjs/scheduler/asap": "rxjs-compat/_esm5/scheduler/asap",
-    "rxjs/scheduler/animationFrame": "rxjs-compat/_esm5/scheduler/animationFrame",
-    "rxjs/operators/zipAll": "rxjs-compat/_esm5/operators/zipAll",
-    "rxjs/operators/zip": "rxjs-compat/_esm5/operators/zip",
-    "rxjs/operators/withLatestFrom": "rxjs-compat/_esm5/operators/withLatestFrom",
-    "rxjs/operators/windowWhen": "rxjs-compat/_esm5/operators/windowWhen",
-    "rxjs/operators/windowToggle": "rxjs-compat/_esm5/operators/windowToggle",
-    "rxjs/operators/windowTime": "rxjs-compat/_esm5/operators/windowTime",
-    "rxjs/operators/windowCount": "rxjs-compat/_esm5/operators/windowCount",
-    "rxjs/operators/window": "rxjs-compat/_esm5/operators/window",
-    "rxjs/operators/toArray": "rxjs-compat/_esm5/operators/toArray",
-    "rxjs/operators/timestamp": "rxjs-compat/_esm5/operators/timestamp",
-    "rxjs/operators/timeoutWith": "rxjs-compat/_esm5/operators/timeoutWith",
-    "rxjs/operators/timeout": "rxjs-compat/_esm5/operators/timeout",
-    "rxjs/operators/timeInterval": "rxjs-compat/_esm5/operators/timeInterval",
-    "rxjs/operators/throwIfEmpty": "rxjs-compat/_esm5/operators/throwIfEmpty",
-    "rxjs/operators/throttleTime": "rxjs-compat/_esm5/operators/throttleTime",
-    "rxjs/operators/throttle": "rxjs-compat/_esm5/operators/throttle",
-    "rxjs/operators/tap": "rxjs-compat/_esm5/operators/tap",
-    "rxjs/operators/takeWhile": "rxjs-compat/_esm5/operators/takeWhile",
-    "rxjs/operators/takeUntil": "rxjs-compat/_esm5/operators/takeUntil",
-    "rxjs/operators/takeLast": "rxjs-compat/_esm5/operators/takeLast",
-    "rxjs/operators/take": "rxjs-compat/_esm5/operators/take",
-    "rxjs/operators/switchMapTo": "rxjs-compat/_esm5/operators/switchMapTo",
-    "rxjs/operators/switchMap": "rxjs-compat/_esm5/operators/switchMap",
-    "rxjs/operators/switchAll": "rxjs-compat/_esm5/operators/switchAll",
-    "rxjs/operators/subscribeOn": "rxjs-compat/_esm5/operators/subscribeOn",
-    "rxjs/operators/startWith": "rxjs-compat/_esm5/operators/startWith",
-    "rxjs/operators/skipWhile": "rxjs-compat/_esm5/operators/skipWhile",
-    "rxjs/operators/skipUntil": "rxjs-compat/_esm5/operators/skipUntil",
-    "rxjs/operators/skipLast": "rxjs-compat/_esm5/operators/skipLast",
-    "rxjs/operators/skip": "rxjs-compat/_esm5/operators/skip",
-    "rxjs/operators/single": "rxjs-compat/_esm5/operators/single",
-    "rxjs/operators/shareReplay": "rxjs-compat/_esm5/operators/shareReplay",
-    "rxjs/operators/share": "rxjs-compat/_esm5/operators/share",
-    "rxjs/operators/sequenceEqual": "rxjs-compat/_esm5/operators/sequenceEqual",
-    "rxjs/operators/scan": "rxjs-compat/_esm5/operators/scan",
-    "rxjs/operators/sampleTime": "rxjs-compat/_esm5/operators/sampleTime",
-    "rxjs/operators/sample": "rxjs-compat/_esm5/operators/sample",
-    "rxjs/operators/retryWhen": "rxjs-compat/_esm5/operators/retryWhen",
-    "rxjs/operators/retry": "rxjs-compat/_esm5/operators/retry",
-    "rxjs/operators/repeatWhen": "rxjs-compat/_esm5/operators/repeatWhen",
-    "rxjs/operators/repeat": "rxjs-compat/_esm5/operators/repeat",
-    "rxjs/operators/refCount": "rxjs-compat/_esm5/operators/refCount",
-    "rxjs/operators/reduce": "rxjs-compat/_esm5/operators/reduce",
-    "rxjs/operators/race": "rxjs-compat/_esm5/operators/race",
-    "rxjs/operators/publishReplay": "rxjs-compat/_esm5/operators/publishReplay",
-    "rxjs/operators/publishLast": "rxjs-compat/_esm5/operators/publishLast",
-    "rxjs/operators/publishBehavior": "rxjs-compat/_esm5/operators/publishBehavior",
-    "rxjs/operators/publish": "rxjs-compat/_esm5/operators/publish",
-    "rxjs/operators/pluck": "rxjs-compat/_esm5/operators/pluck",
-    "rxjs/operators/partition": "rxjs-compat/_esm5/operators/partition",
-    "rxjs/operators/pairwise": "rxjs-compat/_esm5/operators/pairwise",
-    "rxjs/operators/onErrorResumeNext": "rxjs-compat/_esm5/operators/onErrorResumeNext",
-    "rxjs/operators/observeOn": "rxjs-compat/_esm5/operators/observeOn",
-    "rxjs/operators/multicast": "rxjs-compat/_esm5/operators/multicast",
-    "rxjs/operators/min": "rxjs-compat/_esm5/operators/min",
-    "rxjs/operators/mergeScan": "rxjs-compat/_esm5/operators/mergeScan",
-    "rxjs/operators/mergeMapTo": "rxjs-compat/_esm5/operators/mergeMapTo",
-    "rxjs/operators/mergeMap": "rxjs-compat/_esm5/operators/mergeMap",
-    "rxjs/operators/mergeAll": "rxjs-compat/_esm5/operators/mergeAll",
-    "rxjs/operators/merge": "rxjs-compat/_esm5/operators/merge",
-    "rxjs/operators/max": "rxjs-compat/_esm5/operators/max",
-    "rxjs/operators/materialize": "rxjs-compat/_esm5/operators/materialize",
-    "rxjs/operators/mapTo": "rxjs-compat/_esm5/operators/mapTo",
-    "rxjs/operators/map": "rxjs-compat/_esm5/operators/map",
-    "rxjs/operators/last": "rxjs-compat/_esm5/operators/last",
-    "rxjs/operators/isEmpty": "rxjs-compat/_esm5/operators/isEmpty",
-    "rxjs/operators/ignoreElements": "rxjs-compat/_esm5/operators/ignoreElements",
-    "rxjs/operators/groupBy": "rxjs-compat/_esm5/operators/groupBy",
-    "rxjs/operators/first": "rxjs-compat/_esm5/operators/first",
-    "rxjs/operators/findIndex": "rxjs-compat/_esm5/operators/findIndex",
-    "rxjs/operators/find": "rxjs-compat/_esm5/operators/find",
-    "rxjs/operators/finalize": "rxjs-compat/_esm5/operators/finalize",
-    "rxjs/operators/filter": "rxjs-compat/_esm5/operators/filter",
-    "rxjs/operators/expand": "rxjs-compat/_esm5/operators/expand",
-    "rxjs/operators/exhaustMap": "rxjs-compat/_esm5/operators/exhaustMap",
-    "rxjs/operators/exhaust": "rxjs-compat/_esm5/operators/exhaust",
-    "rxjs/operators/every": "rxjs-compat/_esm5/operators/every",
-    "rxjs/operators/elementAt": "rxjs-compat/_esm5/operators/elementAt",
-    "rxjs/operators/distinctUntilKeyChanged": "rxjs-compat/_esm5/operators/distinctUntilKeyChanged",
-    "rxjs/operators/distinctUntilChanged": "rxjs-compat/_esm5/operators/distinctUntilChanged",
-    "rxjs/operators/distinct": "rxjs-compat/_esm5/operators/distinct",
-    "rxjs/operators/dematerialize": "rxjs-compat/_esm5/operators/dematerialize",
-    "rxjs/operators/delayWhen": "rxjs-compat/_esm5/operators/delayWhen",
-    "rxjs/operators/delay": "rxjs-compat/_esm5/operators/delay",
-    "rxjs/operators/defaultIfEmpty": "rxjs-compat/_esm5/operators/defaultIfEmpty",
-    "rxjs/operators/debounceTime": "rxjs-compat/_esm5/operators/debounceTime",
-    "rxjs/operators/debounce": "rxjs-compat/_esm5/operators/debounce",
-    "rxjs/operators/count": "rxjs-compat/_esm5/operators/count",
-    "rxjs/operators/concatMapTo": "rxjs-compat/_esm5/operators/concatMapTo",
-    "rxjs/operators/concatMap": "rxjs-compat/_esm5/operators/concatMap",
-    "rxjs/operators/concatAll": "rxjs-compat/_esm5/operators/concatAll",
-    "rxjs/operators/concat": "rxjs-compat/_esm5/operators/concat",
-    "rxjs/operators/combineLatest": "rxjs-compat/_esm5/operators/combineLatest",
-    "rxjs/operators/combineAll": "rxjs-compat/_esm5/operators/combineAll",
-    "rxjs/operators/catchError": "rxjs-compat/_esm5/operators/catchError",
-    "rxjs/operators/bufferWhen": "rxjs-compat/_esm5/operators/bufferWhen",
-    "rxjs/operators/bufferToggle": "rxjs-compat/_esm5/operators/bufferToggle",
-    "rxjs/operators/bufferTime": "rxjs-compat/_esm5/operators/bufferTime",
-    "rxjs/operators/bufferCount": "rxjs-compat/_esm5/operators/bufferCount",
-    "rxjs/operators/buffer": "rxjs-compat/_esm5/operators/buffer",
-    "rxjs/operators/auditTime": "rxjs-compat/_esm5/operators/auditTime",
-    "rxjs/operators/audit": "rxjs-compat/_esm5/operators/audit",
-    "rxjs/operator/zipAll": "rxjs-compat/_esm5/operator/zipAll",
-    "rxjs/operator/zip": "rxjs-compat/_esm5/operator/zip",
-    "rxjs/operator/withLatestFrom": "rxjs-compat/_esm5/operator/withLatestFrom",
-    "rxjs/operator/windowWhen": "rxjs-compat/_esm5/operator/windowWhen",
-    "rxjs/operator/windowToggle": "rxjs-compat/_esm5/operator/windowToggle",
-    "rxjs/operator/windowTime": "rxjs-compat/_esm5/operator/windowTime",
-    "rxjs/operator/windowCount": "rxjs-compat/_esm5/operator/windowCount",
-    "rxjs/operator/window": "rxjs-compat/_esm5/operator/window",
-    "rxjs/operator/toPromise": "rxjs-compat/_esm5/operator/toPromise",
-    "rxjs/operator/toArray": "rxjs-compat/_esm5/operator/toArray",
-    "rxjs/operator/timestamp": "rxjs-compat/_esm5/operator/timestamp",
-    "rxjs/operator/timeoutWith": "rxjs-compat/_esm5/operator/timeoutWith",
-    "rxjs/operator/timeout": "rxjs-compat/_esm5/operator/timeout",
-    "rxjs/operator/timeInterval": "rxjs-compat/_esm5/operator/timeInterval",
-    "rxjs/operator/throttleTime": "rxjs-compat/_esm5/operator/throttleTime",
-    "rxjs/operator/throttle": "rxjs-compat/_esm5/operator/throttle",
-    "rxjs/operator/takeWhile": "rxjs-compat/_esm5/operator/takeWhile",
-    "rxjs/operator/takeUntil": "rxjs-compat/_esm5/operator/takeUntil",
-    "rxjs/operator/takeLast": "rxjs-compat/_esm5/operator/takeLast",
-    "rxjs/operator/take": "rxjs-compat/_esm5/operator/take",
-    "rxjs/operator/switchMapTo": "rxjs-compat/_esm5/operator/switchMapTo",
-    "rxjs/operator/switchMap": "rxjs-compat/_esm5/operator/switchMap",
-    "rxjs/operator/switch": "rxjs-compat/_esm5/operator/switch",
-    "rxjs/operator/subscribeOn": "rxjs-compat/_esm5/operator/subscribeOn",
-    "rxjs/operator/startWith": "rxjs-compat/_esm5/operator/startWith",
-    "rxjs/operator/skipWhile": "rxjs-compat/_esm5/operator/skipWhile",
-    "rxjs/operator/skipUntil": "rxjs-compat/_esm5/operator/skipUntil",
-    "rxjs/operator/skipLast": "rxjs-compat/_esm5/operator/skipLast",
-    "rxjs/operator/skip": "rxjs-compat/_esm5/operator/skip",
-    "rxjs/operator/single": "rxjs-compat/_esm5/operator/single",
-    "rxjs/operator/shareReplay": "rxjs-compat/_esm5/operator/shareReplay",
-    "rxjs/operator/share": "rxjs-compat/_esm5/operator/share",
-    "rxjs/operator/sequenceEqual": "rxjs-compat/_esm5/operator/sequenceEqual",
-    "rxjs/operator/scan": "rxjs-compat/_esm5/operator/scan",
-    "rxjs/operator/sampleTime": "rxjs-compat/_esm5/operator/sampleTime",
-    "rxjs/operator/sample": "rxjs-compat/_esm5/operator/sample",
-    "rxjs/operator/retryWhen": "rxjs-compat/_esm5/operator/retryWhen",
-    "rxjs/operator/retry": "rxjs-compat/_esm5/operator/retry",
-    "rxjs/operator/repeatWhen": "rxjs-compat/_esm5/operator/repeatWhen",
-    "rxjs/operator/repeat": "rxjs-compat/_esm5/operator/repeat",
-    "rxjs/operator/reduce": "rxjs-compat/_esm5/operator/reduce",
-    "rxjs/operator/race": "rxjs-compat/_esm5/operator/race",
-    "rxjs/operator/publishReplay": "rxjs-compat/_esm5/operator/publishReplay",
-    "rxjs/operator/publishLast": "rxjs-compat/_esm5/operator/publishLast",
-    "rxjs/operator/publishBehavior": "rxjs-compat/_esm5/operator/publishBehavior",
-    "rxjs/operator/publish": "rxjs-compat/_esm5/operator/publish",
-    "rxjs/operator/pluck": "rxjs-compat/_esm5/operator/pluck",
-    "rxjs/operator/partition": "rxjs-compat/_esm5/operator/partition",
-    "rxjs/operator/pairwise": "rxjs-compat/_esm5/operator/pairwise",
-    "rxjs/operator/onErrorResumeNext": "rxjs-compat/_esm5/operator/onErrorResumeNext",
-    "rxjs/operator/observeOn": "rxjs-compat/_esm5/operator/observeOn",
-    "rxjs/operator/multicast": "rxjs-compat/_esm5/operator/multicast",
-    "rxjs/operator/min": "rxjs-compat/_esm5/operator/min",
-    "rxjs/operator/mergeScan": "rxjs-compat/_esm5/operator/mergeScan",
-    "rxjs/operator/mergeMapTo": "rxjs-compat/_esm5/operator/mergeMapTo",
-    "rxjs/operator/mergeMap": "rxjs-compat/_esm5/operator/mergeMap",
-    "rxjs/operator/mergeAll": "rxjs-compat/_esm5/operator/mergeAll",
-    "rxjs/operator/merge": "rxjs-compat/_esm5/operator/merge",
-    "rxjs/operator/max": "rxjs-compat/_esm5/operator/max",
-    "rxjs/operator/materialize": "rxjs-compat/_esm5/operator/materialize",
-    "rxjs/operator/mapTo": "rxjs-compat/_esm5/operator/mapTo",
-    "rxjs/operator/map": "rxjs-compat/_esm5/operator/map",
-    "rxjs/operator/let": "rxjs-compat/_esm5/operator/let",
-    "rxjs/operator/last": "rxjs-compat/_esm5/operator/last",
-    "rxjs/operator/isEmpty": "rxjs-compat/_esm5/operator/isEmpty",
-    "rxjs/operator/ignoreElements": "rxjs-compat/_esm5/operator/ignoreElements",
-    "rxjs/operator/groupBy": "rxjs-compat/_esm5/operator/groupBy",
-    "rxjs/operator/first": "rxjs-compat/_esm5/operator/first",
-    "rxjs/operator/findIndex": "rxjs-compat/_esm5/operator/findIndex",
-    "rxjs/operator/find": "rxjs-compat/_esm5/operator/find",
-    "rxjs/operator/finally": "rxjs-compat/_esm5/operator/finally",
-    "rxjs/operator/filter": "rxjs-compat/_esm5/operator/filter",
-    "rxjs/operator/expand": "rxjs-compat/_esm5/operator/expand",
-    "rxjs/operator/exhaustMap": "rxjs-compat/_esm5/operator/exhaustMap",
-    "rxjs/operator/exhaust": "rxjs-compat/_esm5/operator/exhaust",
-    "rxjs/operator/every": "rxjs-compat/_esm5/operator/every",
-    "rxjs/operator/elementAt": "rxjs-compat/_esm5/operator/elementAt",
-    "rxjs/operator/do": "rxjs-compat/_esm5/operator/do",
-    "rxjs/operator/distinctUntilKeyChanged": "rxjs-compat/_esm5/operator/distinctUntilKeyChanged",
-    "rxjs/operator/distinctUntilChanged": "rxjs-compat/_esm5/operator/distinctUntilChanged",
-    "rxjs/operator/distinct": "rxjs-compat/_esm5/operator/distinct",
-    "rxjs/operator/dematerialize": "rxjs-compat/_esm5/operator/dematerialize",
-    "rxjs/operator/delayWhen": "rxjs-compat/_esm5/operator/delayWhen",
-    "rxjs/operator/delay": "rxjs-compat/_esm5/operator/delay",
-    "rxjs/operator/defaultIfEmpty": "rxjs-compat/_esm5/operator/defaultIfEmpty",
-    "rxjs/operator/debounceTime": "rxjs-compat/_esm5/operator/debounceTime",
-    "rxjs/operator/debounce": "rxjs-compat/_esm5/operator/debounce",
-    "rxjs/operator/count": "rxjs-compat/_esm5/operator/count",
-    "rxjs/operator/concatMapTo": "rxjs-compat/_esm5/operator/concatMapTo",
-    "rxjs/operator/concatMap": "rxjs-compat/_esm5/operator/concatMap",
-    "rxjs/operator/concatAll": "rxjs-compat/_esm5/operator/concatAll",
-    "rxjs/operator/concat": "rxjs-compat/_esm5/operator/concat",
-    "rxjs/operator/combineLatest": "rxjs-compat/_esm5/operator/combineLatest",
-    "rxjs/operator/combineAll": "rxjs-compat/_esm5/operator/combineAll",
-    "rxjs/operator/catch": "rxjs-compat/_esm5/operator/catch",
-    "rxjs/operator/bufferWhen": "rxjs-compat/_esm5/operator/bufferWhen",
-    "rxjs/operator/bufferToggle": "rxjs-compat/_esm5/operator/bufferToggle",
-    "rxjs/operator/bufferTime": "rxjs-compat/_esm5/operator/bufferTime",
-    "rxjs/operator/bufferCount": "rxjs-compat/_esm5/operator/bufferCount",
-    "rxjs/operator/buffer": "rxjs-compat/_esm5/operator/buffer",
-    "rxjs/operator/auditTime": "rxjs-compat/_esm5/operator/auditTime",
-    "rxjs/operator/audit": "rxjs-compat/_esm5/operator/audit",
-    "rxjs/observable/zip": "rxjs-compat/_esm5/observable/zip",
-    "rxjs/observable/using": "rxjs-compat/_esm5/observable/using",
-    "rxjs/observable/timer": "rxjs-compat/_esm5/observable/timer",
-    "rxjs/observable/throw": "rxjs-compat/_esm5/observable/throw",
-    "rxjs/observable/range": "rxjs-compat/_esm5/observable/range",
-    "rxjs/observable/race": "rxjs-compat/_esm5/observable/race",
-    "rxjs/observable/pairs": "rxjs-compat/_esm5/observable/pairs",
-    "rxjs/observable/onErrorResumeNext": "rxjs-compat/_esm5/observable/onErrorResumeNext",
-    "rxjs/observable/of": "rxjs-compat/_esm5/observable/of",
-    "rxjs/observable/never": "rxjs-compat/_esm5/observable/never",
-    "rxjs/observable/merge": "rxjs-compat/_esm5/observable/merge",
-    "rxjs/observable/interval": "rxjs-compat/_esm5/observable/interval",
-    "rxjs/observable/if": "rxjs-compat/_esm5/observable/if",
-    "rxjs/observable/generate": "rxjs-compat/_esm5/observable/generate",
-    "rxjs/observable/fromPromise": "rxjs-compat/_esm5/observable/fromPromise",
-    "rxjs/observable/fromIterable": "rxjs-compat/_esm5/observable/fromIterable",
-    "rxjs/observable/fromEventPattern": "rxjs-compat/_esm5/observable/fromEventPattern",
-    "rxjs/observable/fromEvent": "rxjs-compat/_esm5/observable/fromEvent",
-    "rxjs/observable/fromArray": "rxjs-compat/_esm5/observable/fromArray",
-    "rxjs/observable/from": "rxjs-compat/_esm5/observable/from",
-    "rxjs/observable/forkJoin": "rxjs-compat/_esm5/observable/forkJoin",
-    "rxjs/observable/empty": "rxjs-compat/_esm5/observable/empty",
-    "rxjs/observable/dom/webSocket": "rxjs-compat/_esm5/observable/dom/webSocket",
-    "rxjs/observable/dom/ajax": "rxjs-compat/_esm5/observable/dom/ajax",
-    "rxjs/observable/dom/WebSocketSubject": "rxjs-compat/_esm5/observable/dom/WebSocketSubject",
-    "rxjs/observable/dom/AjaxObservable": "rxjs-compat/_esm5/observable/dom/AjaxObservable",
-    "rxjs/observable/defer": "rxjs-compat/_esm5/observable/defer",
-    "rxjs/observable/concat": "rxjs-compat/_esm5/observable/concat",
-    "rxjs/observable/combineLatest": "rxjs-compat/_esm5/observable/combineLatest",
-    "rxjs/observable/bindNodeCallback": "rxjs-compat/_esm5/observable/bindNodeCallback",
-    "rxjs/observable/bindCallback": "rxjs-compat/_esm5/observable/bindCallback",
-    "rxjs/observable/UsingObservable": "rxjs-compat/_esm5/observable/UsingObservable",
-    "rxjs/observable/TimerObservable": "rxjs-compat/_esm5/observable/TimerObservable",
-    "rxjs/observable/SubscribeOnObservable": "rxjs-compat/_esm5/observable/SubscribeOnObservable",
-    "rxjs/observable/ScalarObservable": "rxjs-compat/_esm5/observable/ScalarObservable",
-    "rxjs/observable/RangeObservable": "rxjs-compat/_esm5/observable/RangeObservable",
-    "rxjs/observable/PromiseObservable": "rxjs-compat/_esm5/observable/PromiseObservable",
-    "rxjs/observable/PairsObservable": "rxjs-compat/_esm5/observable/PairsObservable",
-    "rxjs/observable/NeverObservable": "rxjs-compat/_esm5/observable/NeverObservable",
-    "rxjs/observable/IteratorObservable": "rxjs-compat/_esm5/observable/IteratorObservable",
-    "rxjs/observable/IntervalObservable": "rxjs-compat/_esm5/observable/IntervalObservable",
-    "rxjs/observable/IfObservable": "rxjs-compat/_esm5/observable/IfObservable",
-    "rxjs/observable/GenerateObservable": "rxjs-compat/_esm5/observable/GenerateObservable",
-    "rxjs/observable/FromObservable": "rxjs-compat/_esm5/observable/FromObservable",
-    "rxjs/observable/FromEventPatternObservable": "rxjs-compat/_esm5/observable/FromEventPatternObservable",
-    "rxjs/observable/FromEventObservable": "rxjs-compat/_esm5/observable/FromEventObservable",
-    "rxjs/observable/ForkJoinObservable": "rxjs-compat/_esm5/observable/ForkJoinObservable",
-    "rxjs/observable/ErrorObservable": "rxjs-compat/_esm5/observable/ErrorObservable",
-    "rxjs/observable/EmptyObservable": "rxjs-compat/_esm5/observable/EmptyObservable",
-    "rxjs/observable/DeferObservable": "rxjs-compat/_esm5/observable/DeferObservable",
-    "rxjs/observable/ConnectableObservable": "rxjs-compat/_esm5/observable/ConnectableObservable",
-    "rxjs/observable/BoundNodeCallbackObservable": "rxjs-compat/_esm5/observable/BoundNodeCallbackObservable",
-    "rxjs/observable/BoundCallbackObservable": "rxjs-compat/_esm5/observable/BoundCallbackObservable",
-    "rxjs/observable/ArrayObservable": "rxjs-compat/_esm5/observable/ArrayObservable",
-    "rxjs/observable/ArrayLikeObservable": "rxjs-compat/_esm5/observable/ArrayLikeObservable",
-    "rxjs/interfaces": "rxjs-compat/_esm5/interfaces",
-    "rxjs/add/operator/zipAll": "rxjs-compat/_esm5/add/operator/zipAll",
-    "rxjs/add/operator/zip": "rxjs-compat/_esm5/add/operator/zip",
-    "rxjs/add/operator/withLatestFrom": "rxjs-compat/_esm5/add/operator/withLatestFrom",
-    "rxjs/add/operator/windowWhen": "rxjs-compat/_esm5/add/operator/windowWhen",
-    "rxjs/add/operator/windowToggle": "rxjs-compat/_esm5/add/operator/windowToggle",
-    "rxjs/add/operator/windowTime": "rxjs-compat/_esm5/add/operator/windowTime",
-    "rxjs/add/operator/windowCount": "rxjs-compat/_esm5/add/operator/windowCount",
-    "rxjs/add/operator/window": "rxjs-compat/_esm5/add/operator/window",
-    "rxjs/add/operator/toPromise": "rxjs-compat/_esm5/add/operator/toPromise",
-    "rxjs/add/operator/toArray": "rxjs-compat/_esm5/add/operator/toArray",
-    "rxjs/add/operator/timestamp": "rxjs-compat/_esm5/add/operator/timestamp",
-    "rxjs/add/operator/timeoutWith": "rxjs-compat/_esm5/add/operator/timeoutWith",
-    "rxjs/add/operator/timeout": "rxjs-compat/_esm5/add/operator/timeout",
-    "rxjs/add/operator/timeInterval": "rxjs-compat/_esm5/add/operator/timeInterval",
-    "rxjs/add/operator/throttleTime": "rxjs-compat/_esm5/add/operator/throttleTime",
-    "rxjs/add/operator/throttle": "rxjs-compat/_esm5/add/operator/throttle",
-    "rxjs/add/operator/takeWhile": "rxjs-compat/_esm5/add/operator/takeWhile",
-    "rxjs/add/operator/takeUntil": "rxjs-compat/_esm5/add/operator/takeUntil",
-    "rxjs/add/operator/takeLast": "rxjs-compat/_esm5/add/operator/takeLast",
-    "rxjs/add/operator/take": "rxjs-compat/_esm5/add/operator/take",
-    "rxjs/add/operator/switchMapTo": "rxjs-compat/_esm5/add/operator/switchMapTo",
-    "rxjs/add/operator/switchMap": "rxjs-compat/_esm5/add/operator/switchMap",
-    "rxjs/add/operator/switch": "rxjs-compat/_esm5/add/operator/switch",
-    "rxjs/add/operator/subscribeOn": "rxjs-compat/_esm5/add/operator/subscribeOn",
-    "rxjs/add/operator/startWith": "rxjs-compat/_esm5/add/operator/startWith",
-    "rxjs/add/operator/skipWhile": "rxjs-compat/_esm5/add/operator/skipWhile",
-    "rxjs/add/operator/skipUntil": "rxjs-compat/_esm5/add/operator/skipUntil",
-    "rxjs/add/operator/skipLast": "rxjs-compat/_esm5/add/operator/skipLast",
-    "rxjs/add/operator/skip": "rxjs-compat/_esm5/add/operator/skip",
-    "rxjs/add/operator/single": "rxjs-compat/_esm5/add/operator/single",
-    "rxjs/add/operator/shareReplay": "rxjs-compat/_esm5/add/operator/shareReplay",
-    "rxjs/add/operator/share": "rxjs-compat/_esm5/add/operator/share",
-    "rxjs/add/operator/sequenceEqual": "rxjs-compat/_esm5/add/operator/sequenceEqual",
-    "rxjs/add/operator/scan": "rxjs-compat/_esm5/add/operator/scan",
-    "rxjs/add/operator/sampleTime": "rxjs-compat/_esm5/add/operator/sampleTime",
-    "rxjs/add/operator/sample": "rxjs-compat/_esm5/add/operator/sample",
-    "rxjs/add/operator/retryWhen": "rxjs-compat/_esm5/add/operator/retryWhen",
-    "rxjs/add/operator/retry": "rxjs-compat/_esm5/add/operator/retry",
-    "rxjs/add/operator/repeatWhen": "rxjs-compat/_esm5/add/operator/repeatWhen",
-    "rxjs/add/operator/repeat": "rxjs-compat/_esm5/add/operator/repeat",
-    "rxjs/add/operator/reduce": "rxjs-compat/_esm5/add/operator/reduce",
-    "rxjs/add/operator/race": "rxjs-compat/_esm5/add/operator/race",
-    "rxjs/add/operator/publishReplay": "rxjs-compat/_esm5/add/operator/publishReplay",
-    "rxjs/add/operator/publishLast": "rxjs-compat/_esm5/add/operator/publishLast",
-    "rxjs/add/operator/publishBehavior": "rxjs-compat/_esm5/add/operator/publishBehavior",
-    "rxjs/add/operator/publish": "rxjs-compat/_esm5/add/operator/publish",
-    "rxjs/add/operator/pluck": "rxjs-compat/_esm5/add/operator/pluck",
-    "rxjs/add/operator/partition": "rxjs-compat/_esm5/add/operator/partition",
-    "rxjs/add/operator/pairwise": "rxjs-compat/_esm5/add/operator/pairwise",
-    "rxjs/add/operator/onErrorResumeNext": "rxjs-compat/_esm5/add/operator/onErrorResumeNext",
-    "rxjs/add/operator/observeOn": "rxjs-compat/_esm5/add/operator/observeOn",
-    "rxjs/add/operator/multicast": "rxjs-compat/_esm5/add/operator/multicast",
-    "rxjs/add/operator/min": "rxjs-compat/_esm5/add/operator/min",
-    "rxjs/add/operator/mergeScan": "rxjs-compat/_esm5/add/operator/mergeScan",
-    "rxjs/add/operator/mergeMapTo": "rxjs-compat/_esm5/add/operator/mergeMapTo",
-    "rxjs/add/operator/mergeMap": "rxjs-compat/_esm5/add/operator/mergeMap",
-    "rxjs/add/operator/mergeAll": "rxjs-compat/_esm5/add/operator/mergeAll",
-    "rxjs/add/operator/merge": "rxjs-compat/_esm5/add/operator/merge",
-    "rxjs/add/operator/max": "rxjs-compat/_esm5/add/operator/max",
-    "rxjs/add/operator/materialize": "rxjs-compat/_esm5/add/operator/materialize",
-    "rxjs/add/operator/mapTo": "rxjs-compat/_esm5/add/operator/mapTo",
-    "rxjs/add/operator/map": "rxjs-compat/_esm5/add/operator/map",
-    "rxjs/add/operator/let": "rxjs-compat/_esm5/add/operator/let",
-    "rxjs/add/operator/last": "rxjs-compat/_esm5/add/operator/last",
-    "rxjs/add/operator/isEmpty": "rxjs-compat/_esm5/add/operator/isEmpty",
-    "rxjs/add/operator/ignoreElements": "rxjs-compat/_esm5/add/operator/ignoreElements",
-    "rxjs/add/operator/groupBy": "rxjs-compat/_esm5/add/operator/groupBy",
-    "rxjs/add/operator/first": "rxjs-compat/_esm5/add/operator/first",
-    "rxjs/add/operator/findIndex": "rxjs-compat/_esm5/add/operator/findIndex",
-    "rxjs/add/operator/find": "rxjs-compat/_esm5/add/operator/find",
-    "rxjs/add/operator/finally": "rxjs-compat/_esm5/add/operator/finally",
-    "rxjs/add/operator/filter": "rxjs-compat/_esm5/add/operator/filter",
-    "rxjs/add/operator/expand": "rxjs-compat/_esm5/add/operator/expand",
-    "rxjs/add/operator/exhaustMap": "rxjs-compat/_esm5/add/operator/exhaustMap",
-    "rxjs/add/operator/exhaust": "rxjs-compat/_esm5/add/operator/exhaust",
-    "rxjs/add/operator/every": "rxjs-compat/_esm5/add/operator/every",
-    "rxjs/add/operator/elementAt": "rxjs-compat/_esm5/add/operator/elementAt",
-    "rxjs/add/operator/do": "rxjs-compat/_esm5/add/operator/do",
-    "rxjs/add/operator/distinctUntilKeyChanged": "rxjs-compat/_esm5/add/operator/distinctUntilKeyChanged",
-    "rxjs/add/operator/distinctUntilChanged": "rxjs-compat/_esm5/add/operator/distinctUntilChanged",
-    "rxjs/add/operator/distinct": "rxjs-compat/_esm5/add/operator/distinct",
-    "rxjs/add/operator/dematerialize": "rxjs-compat/_esm5/add/operator/dematerialize",
-    "rxjs/add/operator/delayWhen": "rxjs-compat/_esm5/add/operator/delayWhen",
-    "rxjs/add/operator/delay": "rxjs-compat/_esm5/add/operator/delay",
-    "rxjs/add/operator/defaultIfEmpty": "rxjs-compat/_esm5/add/operator/defaultIfEmpty",
-    "rxjs/add/operator/debounceTime": "rxjs-compat/_esm5/add/operator/debounceTime",
-    "rxjs/add/operator/debounce": "rxjs-compat/_esm5/add/operator/debounce",
-    "rxjs/add/operator/count": "rxjs-compat/_esm5/add/operator/count",
-    "rxjs/add/operator/concatMapTo": "rxjs-compat/_esm5/add/operator/concatMapTo",
-    "rxjs/add/operator/concatMap": "rxjs-compat/_esm5/add/operator/concatMap",
-    "rxjs/add/operator/concatAll": "rxjs-compat/_esm5/add/operator/concatAll",
-    "rxjs/add/operator/concat": "rxjs-compat/_esm5/add/operator/concat",
-    "rxjs/add/operator/combineLatest": "rxjs-compat/_esm5/add/operator/combineLatest",
-    "rxjs/add/operator/combineAll": "rxjs-compat/_esm5/add/operator/combineAll",
-    "rxjs/add/operator/catch": "rxjs-compat/_esm5/add/operator/catch",
-    "rxjs/add/operator/bufferWhen": "rxjs-compat/_esm5/add/operator/bufferWhen",
-    "rxjs/add/operator/bufferToggle": "rxjs-compat/_esm5/add/operator/bufferToggle",
-    "rxjs/add/operator/bufferTime": "rxjs-compat/_esm5/add/operator/bufferTime",
-    "rxjs/add/operator/bufferCount": "rxjs-compat/_esm5/add/operator/bufferCount",
-    "rxjs/add/operator/buffer": "rxjs-compat/_esm5/add/operator/buffer",
-    "rxjs/add/operator/auditTime": "rxjs-compat/_esm5/add/operator/auditTime",
-    "rxjs/add/operator/audit": "rxjs-compat/_esm5/add/operator/audit",
-    "rxjs/add/observable/zip": "rxjs-compat/_esm5/add/observable/zip",
-    "rxjs/add/observable/using": "rxjs-compat/_esm5/add/observable/using",
-    "rxjs/add/observable/timer": "rxjs-compat/_esm5/add/observable/timer",
-    "rxjs/add/observable/throw": "rxjs-compat/_esm5/add/observable/throw",
-    "rxjs/add/observable/range": "rxjs-compat/_esm5/add/observable/range",
-    "rxjs/add/observable/race": "rxjs-compat/_esm5/add/observable/race",
-    "rxjs/add/observable/pairs": "rxjs-compat/_esm5/add/observable/pairs",
-    "rxjs/add/observable/onErrorResumeNext": "rxjs-compat/_esm5/add/observable/onErrorResumeNext",
-    "rxjs/add/observable/of": "rxjs-compat/_esm5/add/observable/of",
-    "rxjs/add/observable/never": "rxjs-compat/_esm5/add/observable/never",
-    "rxjs/add/observable/merge": "rxjs-compat/_esm5/add/observable/merge",
-    "rxjs/add/observable/interval": "rxjs-compat/_esm5/add/observable/interval",
-    "rxjs/add/observable/if": "rxjs-compat/_esm5/add/observable/if",
-    "rxjs/add/observable/generate": "rxjs-compat/_esm5/add/observable/generate",
-    "rxjs/add/observable/fromPromise": "rxjs-compat/_esm5/add/observable/fromPromise",
-    "rxjs/add/observable/fromEventPattern": "rxjs-compat/_esm5/add/observable/fromEventPattern",
-    "rxjs/add/observable/fromEvent": "rxjs-compat/_esm5/add/observable/fromEvent",
-    "rxjs/add/observable/from": "rxjs-compat/_esm5/add/observable/from",
-    "rxjs/add/observable/forkJoin": "rxjs-compat/_esm5/add/observable/forkJoin",
-    "rxjs/add/observable/empty": "rxjs-compat/_esm5/add/observable/empty",
-    "rxjs/add/observable/dom/webSocket": "rxjs-compat/_esm5/add/observable/dom/webSocket",
-    "rxjs/add/observable/dom/ajax": "rxjs-compat/_esm5/add/observable/dom/ajax",
-    "rxjs/add/observable/defer": "rxjs-compat/_esm5/add/observable/defer",
-    "rxjs/add/observable/concat": "rxjs-compat/_esm5/add/observable/concat",
-    "rxjs/add/observable/combineLatest": "rxjs-compat/_esm5/add/observable/combineLatest",
-    "rxjs/add/observable/bindNodeCallback": "rxjs-compat/_esm5/add/observable/bindNodeCallback",
-    "rxjs/add/observable/bindCallback": "rxjs-compat/_esm5/add/observable/bindCallback",
-    "rxjs/Subscription": "rxjs-compat/_esm5/Subscription",
-    "rxjs/Subscriber": "rxjs-compat/_esm5/Subscriber",
-    "rxjs/SubjectSubscription": "rxjs-compat/_esm5/SubjectSubscription",
-    "rxjs/Subject": "rxjs-compat/_esm5/Subject",
-    "rxjs/Scheduler": "rxjs-compat/_esm5/Scheduler",
-    "rxjs/Rx": "rxjs-compat/_esm5/Rx",
-    "rxjs/ReplaySubject": "rxjs-compat/_esm5/ReplaySubject",
-    "rxjs/OuterSubscriber": "rxjs-compat/_esm5/OuterSubscriber",
-    "rxjs/Operator": "rxjs-compat/_esm5/Operator",
-    "rxjs/Observer": "rxjs-compat/_esm5/Observer",
-    "rxjs/Observable": "rxjs-compat/_esm5/Observable",
-    "rxjs/Notification": "rxjs-compat/_esm5/Notification",
-    "rxjs/InnerSubscriber": "rxjs-compat/_esm5/InnerSubscriber",
-    "rxjs/BehaviorSubject": "rxjs-compat/_esm5/BehaviorSubject",
-    "rxjs/AsyncSubject": "rxjs-compat/_esm5/AsyncSubject"
-};
-}
diff --git a/node_modules/rxjs/_esm5/testing/index.js b/node_modules/rxjs/_esm5/testing/index.js
deleted file mode 100644
index 856db3b..0000000
--- a/node_modules/rxjs/_esm5/testing/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export { TestScheduler } from '../internal/testing/TestScheduler';
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/rxjs/_esm5/testing/index.js.map b/node_modules/rxjs/_esm5/testing/index.js.map
deleted file mode 100644
index 6882405..0000000
--- a/node_modules/rxjs/_esm5/testing/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC"}
diff --git a/node_modules/rxjs/_esm5/webSocket/index.js b/node_modules/rxjs/_esm5/webSocket/index.js
deleted file mode 100644
index edf0104..0000000
--- a/node_modules/rxjs/_esm5/webSocket/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/** PURE_IMPORTS_START  PURE_IMPORTS_END */
-export { webSocket as webSocket } from '../internal/observable/dom/webSocket';
-export { WebSocketSubject } from '../internal/observable/dom/WebSocketSubject';
-//# sourceMappingURL=index.js.map
diff --git a/node_modules/rxjs/_esm5/webSocket/index.js.map b/node_modules/rxjs/_esm5/webSocket/index.js.map
deleted file mode 100644
index 599e9a7..0000000
--- a/node_modules/rxjs/_esm5/webSocket/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/webSocket/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAA0B,MAAM,6CAA6C,CAAC"}
diff --git a/node_modules/rxjs/add/observable/bindCallback.d.ts b/node_modules/rxjs/add/observable/bindCallback.d.ts
deleted file mode 100644
index 7926a09..0000000
--- a/node_modules/rxjs/add/observable/bindCallback.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/bindCallback';
diff --git a/node_modules/rxjs/add/observable/bindCallback.js b/node_modules/rxjs/add/observable/bindCallback.js
deleted file mode 100644
index c76db00..0000000
--- a/node_modules/rxjs/add/observable/bindCallback.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/bindCallback");
-//# sourceMappingURL=bindCallback.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/bindCallback.js.map b/node_modules/rxjs/add/observable/bindCallback.js.map
deleted file mode 100644
index 5d43370..0000000
--- a/node_modules/rxjs/add/observable/bindCallback.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bindCallback.js","sources":["../../src/add/observable/bindCallback.ts"],"names":[],"mappings":";;AAAA,mDAAiD"}
diff --git a/node_modules/rxjs/add/observable/bindNodeCallback.d.ts b/node_modules/rxjs/add/observable/bindNodeCallback.d.ts
deleted file mode 100644
index 049f9a7..0000000
--- a/node_modules/rxjs/add/observable/bindNodeCallback.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/bindNodeCallback';
diff --git a/node_modules/rxjs/add/observable/bindNodeCallback.js b/node_modules/rxjs/add/observable/bindNodeCallback.js
deleted file mode 100644
index b3e2a75..0000000
--- a/node_modules/rxjs/add/observable/bindNodeCallback.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/bindNodeCallback");
-//# sourceMappingURL=bindNodeCallback.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/bindNodeCallback.js.map b/node_modules/rxjs/add/observable/bindNodeCallback.js.map
deleted file mode 100644
index a0ee559..0000000
--- a/node_modules/rxjs/add/observable/bindNodeCallback.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bindNodeCallback.js","sources":["../../src/add/observable/bindNodeCallback.ts"],"names":[],"mappings":";;AAAA,uDAAqD"}
diff --git a/node_modules/rxjs/add/observable/combineLatest.d.ts b/node_modules/rxjs/add/observable/combineLatest.d.ts
deleted file mode 100644
index 7163d7a..0000000
--- a/node_modules/rxjs/add/observable/combineLatest.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/combineLatest';
diff --git a/node_modules/rxjs/add/observable/combineLatest.js b/node_modules/rxjs/add/observable/combineLatest.js
deleted file mode 100644
index db16f57..0000000
--- a/node_modules/rxjs/add/observable/combineLatest.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/combineLatest");
-//# sourceMappingURL=combineLatest.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/combineLatest.js.map b/node_modules/rxjs/add/observable/combineLatest.js.map
deleted file mode 100644
index 302f4ff..0000000
--- a/node_modules/rxjs/add/observable/combineLatest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineLatest.js","sources":["../../src/add/observable/combineLatest.ts"],"names":[],"mappings":";;AAAA,oDAAkD"}
diff --git a/node_modules/rxjs/add/observable/concat.d.ts b/node_modules/rxjs/add/observable/concat.d.ts
deleted file mode 100644
index b392cb2..0000000
--- a/node_modules/rxjs/add/observable/concat.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/concat';
diff --git a/node_modules/rxjs/add/observable/concat.js b/node_modules/rxjs/add/observable/concat.js
deleted file mode 100644
index aeca6ca..0000000
--- a/node_modules/rxjs/add/observable/concat.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/concat");
-//# sourceMappingURL=concat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/concat.js.map b/node_modules/rxjs/add/observable/concat.js.map
deleted file mode 100644
index ad0e211..0000000
--- a/node_modules/rxjs/add/observable/concat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concat.js","sources":["../../src/add/observable/concat.ts"],"names":[],"mappings":";;AAAA,6CAA2C"}
diff --git a/node_modules/rxjs/add/observable/defer.d.ts b/node_modules/rxjs/add/observable/defer.d.ts
deleted file mode 100644
index b4e2966..0000000
--- a/node_modules/rxjs/add/observable/defer.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/defer';
diff --git a/node_modules/rxjs/add/observable/defer.js b/node_modules/rxjs/add/observable/defer.js
deleted file mode 100644
index 11b55d9..0000000
--- a/node_modules/rxjs/add/observable/defer.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/defer");
-//# sourceMappingURL=defer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/defer.js.map b/node_modules/rxjs/add/observable/defer.js.map
deleted file mode 100644
index 60c6edc..0000000
--- a/node_modules/rxjs/add/observable/defer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"defer.js","sources":["../../src/add/observable/defer.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/observable/dom/ajax.d.ts b/node_modules/rxjs/add/observable/dom/ajax.d.ts
deleted file mode 100644
index 2b32efe..0000000
--- a/node_modules/rxjs/add/observable/dom/ajax.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/dom/ajax';
diff --git a/node_modules/rxjs/add/observable/dom/ajax.js b/node_modules/rxjs/add/observable/dom/ajax.js
deleted file mode 100644
index 744ffd2..0000000
--- a/node_modules/rxjs/add/observable/dom/ajax.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/dom/ajax");
-//# sourceMappingURL=ajax.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/dom/ajax.js.map b/node_modules/rxjs/add/observable/dom/ajax.js.map
deleted file mode 100644
index 969c299..0000000
--- a/node_modules/rxjs/add/observable/dom/ajax.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ajax.js","sources":["../../../src/add/observable/dom/ajax.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/observable/dom/webSocket.d.ts b/node_modules/rxjs/add/observable/dom/webSocket.d.ts
deleted file mode 100644
index bc5d3f3..0000000
--- a/node_modules/rxjs/add/observable/dom/webSocket.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/dom/webSocket';
diff --git a/node_modules/rxjs/add/observable/dom/webSocket.js b/node_modules/rxjs/add/observable/dom/webSocket.js
deleted file mode 100644
index 29eb2c0..0000000
--- a/node_modules/rxjs/add/observable/dom/webSocket.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/dom/webSocket");
-//# sourceMappingURL=webSocket.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/dom/webSocket.js.map b/node_modules/rxjs/add/observable/dom/webSocket.js.map
deleted file mode 100644
index c31b8fe..0000000
--- a/node_modules/rxjs/add/observable/dom/webSocket.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"webSocket.js","sources":["../../../src/add/observable/dom/webSocket.ts"],"names":[],"mappings":";;AAAA,oDAAkD"}
diff --git a/node_modules/rxjs/add/observable/empty.d.ts b/node_modules/rxjs/add/observable/empty.d.ts
deleted file mode 100644
index d261ad7..0000000
--- a/node_modules/rxjs/add/observable/empty.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/empty';
diff --git a/node_modules/rxjs/add/observable/empty.js b/node_modules/rxjs/add/observable/empty.js
deleted file mode 100644
index 582d5b7..0000000
--- a/node_modules/rxjs/add/observable/empty.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/empty");
-//# sourceMappingURL=empty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/empty.js.map b/node_modules/rxjs/add/observable/empty.js.map
deleted file mode 100644
index 68623e4..0000000
--- a/node_modules/rxjs/add/observable/empty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"empty.js","sources":["../../src/add/observable/empty.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/observable/forkJoin.d.ts b/node_modules/rxjs/add/observable/forkJoin.d.ts
deleted file mode 100644
index 2a581e2..0000000
--- a/node_modules/rxjs/add/observable/forkJoin.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/forkJoin';
diff --git a/node_modules/rxjs/add/observable/forkJoin.js b/node_modules/rxjs/add/observable/forkJoin.js
deleted file mode 100644
index 053a095..0000000
--- a/node_modules/rxjs/add/observable/forkJoin.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/forkJoin");
-//# sourceMappingURL=forkJoin.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/forkJoin.js.map b/node_modules/rxjs/add/observable/forkJoin.js.map
deleted file mode 100644
index f6e1d87..0000000
--- a/node_modules/rxjs/add/observable/forkJoin.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"forkJoin.js","sources":["../../src/add/observable/forkJoin.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/observable/from.d.ts b/node_modules/rxjs/add/observable/from.d.ts
deleted file mode 100644
index 06572d8..0000000
--- a/node_modules/rxjs/add/observable/from.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/from';
diff --git a/node_modules/rxjs/add/observable/from.js b/node_modules/rxjs/add/observable/from.js
deleted file mode 100644
index 6505176..0000000
--- a/node_modules/rxjs/add/observable/from.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/from");
-//# sourceMappingURL=from.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/from.js.map b/node_modules/rxjs/add/observable/from.js.map
deleted file mode 100644
index 369039a..0000000
--- a/node_modules/rxjs/add/observable/from.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"from.js","sources":["../../src/add/observable/from.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/add/observable/fromEvent.d.ts b/node_modules/rxjs/add/observable/fromEvent.d.ts
deleted file mode 100644
index 0d6e05b..0000000
--- a/node_modules/rxjs/add/observable/fromEvent.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/fromEvent';
diff --git a/node_modules/rxjs/add/observable/fromEvent.js b/node_modules/rxjs/add/observable/fromEvent.js
deleted file mode 100644
index 75321cb..0000000
--- a/node_modules/rxjs/add/observable/fromEvent.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/fromEvent");
-//# sourceMappingURL=fromEvent.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/fromEvent.js.map b/node_modules/rxjs/add/observable/fromEvent.js.map
deleted file mode 100644
index f931c43..0000000
--- a/node_modules/rxjs/add/observable/fromEvent.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromEvent.js","sources":["../../src/add/observable/fromEvent.ts"],"names":[],"mappings":";;AAAA,gDAA8C"}
diff --git a/node_modules/rxjs/add/observable/fromEventPattern.d.ts b/node_modules/rxjs/add/observable/fromEventPattern.d.ts
deleted file mode 100644
index c7241f8..0000000
--- a/node_modules/rxjs/add/observable/fromEventPattern.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/fromEventPattern';
diff --git a/node_modules/rxjs/add/observable/fromEventPattern.js b/node_modules/rxjs/add/observable/fromEventPattern.js
deleted file mode 100644
index 58fbfa5..0000000
--- a/node_modules/rxjs/add/observable/fromEventPattern.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/fromEventPattern");
-//# sourceMappingURL=fromEventPattern.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/fromEventPattern.js.map b/node_modules/rxjs/add/observable/fromEventPattern.js.map
deleted file mode 100644
index ad181b9..0000000
--- a/node_modules/rxjs/add/observable/fromEventPattern.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromEventPattern.js","sources":["../../src/add/observable/fromEventPattern.ts"],"names":[],"mappings":";;AAAA,uDAAqD"}
diff --git a/node_modules/rxjs/add/observable/fromPromise.d.ts b/node_modules/rxjs/add/observable/fromPromise.d.ts
deleted file mode 100644
index c262242..0000000
--- a/node_modules/rxjs/add/observable/fromPromise.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/fromPromise';
diff --git a/node_modules/rxjs/add/observable/fromPromise.js b/node_modules/rxjs/add/observable/fromPromise.js
deleted file mode 100644
index 418055c..0000000
--- a/node_modules/rxjs/add/observable/fromPromise.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/fromPromise");
-//# sourceMappingURL=fromPromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/fromPromise.js.map b/node_modules/rxjs/add/observable/fromPromise.js.map
deleted file mode 100644
index 91ea320..0000000
--- a/node_modules/rxjs/add/observable/fromPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromPromise.js","sources":["../../src/add/observable/fromPromise.ts"],"names":[],"mappings":";;AAAA,kDAAgD"}
diff --git a/node_modules/rxjs/add/observable/generate.d.ts b/node_modules/rxjs/add/observable/generate.d.ts
deleted file mode 100644
index 3203a9b..0000000
--- a/node_modules/rxjs/add/observable/generate.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/generate';
diff --git a/node_modules/rxjs/add/observable/generate.js b/node_modules/rxjs/add/observable/generate.js
deleted file mode 100644
index 65bb024..0000000
--- a/node_modules/rxjs/add/observable/generate.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/generate");
-//# sourceMappingURL=generate.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/generate.js.map b/node_modules/rxjs/add/observable/generate.js.map
deleted file mode 100644
index 9c228e4..0000000
--- a/node_modules/rxjs/add/observable/generate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"generate.js","sources":["../../src/add/observable/generate.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/observable/if.d.ts b/node_modules/rxjs/add/observable/if.d.ts
deleted file mode 100644
index 5767d74..0000000
--- a/node_modules/rxjs/add/observable/if.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/if';
diff --git a/node_modules/rxjs/add/observable/if.js b/node_modules/rxjs/add/observable/if.js
deleted file mode 100644
index 3942d95..0000000
--- a/node_modules/rxjs/add/observable/if.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/if");
-//# sourceMappingURL=if.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/if.js.map b/node_modules/rxjs/add/observable/if.js.map
deleted file mode 100644
index 583456e..0000000
--- a/node_modules/rxjs/add/observable/if.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"if.js","sources":["../../src/add/observable/if.ts"],"names":[],"mappings":";;AAAA,yCAAuC"}
diff --git a/node_modules/rxjs/add/observable/interval.d.ts b/node_modules/rxjs/add/observable/interval.d.ts
deleted file mode 100644
index 6cd2b31..0000000
--- a/node_modules/rxjs/add/observable/interval.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/interval';
diff --git a/node_modules/rxjs/add/observable/interval.js b/node_modules/rxjs/add/observable/interval.js
deleted file mode 100644
index 522be15..0000000
--- a/node_modules/rxjs/add/observable/interval.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/interval");
-//# sourceMappingURL=interval.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/interval.js.map b/node_modules/rxjs/add/observable/interval.js.map
deleted file mode 100644
index 6bfd345..0000000
--- a/node_modules/rxjs/add/observable/interval.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"interval.js","sources":["../../src/add/observable/interval.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/observable/merge.d.ts b/node_modules/rxjs/add/observable/merge.d.ts
deleted file mode 100644
index 7a111a5..0000000
--- a/node_modules/rxjs/add/observable/merge.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/merge';
diff --git a/node_modules/rxjs/add/observable/merge.js b/node_modules/rxjs/add/observable/merge.js
deleted file mode 100644
index bbc2ca9..0000000
--- a/node_modules/rxjs/add/observable/merge.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/merge");
-//# sourceMappingURL=merge.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/merge.js.map b/node_modules/rxjs/add/observable/merge.js.map
deleted file mode 100644
index ca95870..0000000
--- a/node_modules/rxjs/add/observable/merge.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"merge.js","sources":["../../src/add/observable/merge.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/observable/never.d.ts b/node_modules/rxjs/add/observable/never.d.ts
deleted file mode 100644
index 4c464d0..0000000
--- a/node_modules/rxjs/add/observable/never.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/never';
diff --git a/node_modules/rxjs/add/observable/never.js b/node_modules/rxjs/add/observable/never.js
deleted file mode 100644
index 955e5ba..0000000
--- a/node_modules/rxjs/add/observable/never.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/never");
-//# sourceMappingURL=never.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/never.js.map b/node_modules/rxjs/add/observable/never.js.map
deleted file mode 100644
index fc70b64..0000000
--- a/node_modules/rxjs/add/observable/never.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"never.js","sources":["../../src/add/observable/never.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/observable/of.d.ts b/node_modules/rxjs/add/observable/of.d.ts
deleted file mode 100644
index c0720f6..0000000
--- a/node_modules/rxjs/add/observable/of.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/of';
diff --git a/node_modules/rxjs/add/observable/of.js b/node_modules/rxjs/add/observable/of.js
deleted file mode 100644
index bcb264c..0000000
--- a/node_modules/rxjs/add/observable/of.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/of");
-//# sourceMappingURL=of.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/of.js.map b/node_modules/rxjs/add/observable/of.js.map
deleted file mode 100644
index c018612..0000000
--- a/node_modules/rxjs/add/observable/of.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"of.js","sources":["../../src/add/observable/of.ts"],"names":[],"mappings":";;AAAA,yCAAuC"}
diff --git a/node_modules/rxjs/add/observable/onErrorResumeNext.d.ts b/node_modules/rxjs/add/observable/onErrorResumeNext.d.ts
deleted file mode 100644
index 80a4d91..0000000
--- a/node_modules/rxjs/add/observable/onErrorResumeNext.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/onErrorResumeNext';
diff --git a/node_modules/rxjs/add/observable/onErrorResumeNext.js b/node_modules/rxjs/add/observable/onErrorResumeNext.js
deleted file mode 100644
index fb765a9..0000000
--- a/node_modules/rxjs/add/observable/onErrorResumeNext.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/onErrorResumeNext");
-//# sourceMappingURL=onErrorResumeNext.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/onErrorResumeNext.js.map b/node_modules/rxjs/add/observable/onErrorResumeNext.js.map
deleted file mode 100644
index 13a90e7..0000000
--- a/node_modules/rxjs/add/observable/onErrorResumeNext.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"onErrorResumeNext.js","sources":["../../src/add/observable/onErrorResumeNext.ts"],"names":[],"mappings":";;AAAA,wDAAsD"}
diff --git a/node_modules/rxjs/add/observable/pairs.d.ts b/node_modules/rxjs/add/observable/pairs.d.ts
deleted file mode 100644
index 3af25b6..0000000
--- a/node_modules/rxjs/add/observable/pairs.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/pairs';
diff --git a/node_modules/rxjs/add/observable/pairs.js b/node_modules/rxjs/add/observable/pairs.js
deleted file mode 100644
index ba16ba4..0000000
--- a/node_modules/rxjs/add/observable/pairs.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/pairs");
-//# sourceMappingURL=pairs.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/pairs.js.map b/node_modules/rxjs/add/observable/pairs.js.map
deleted file mode 100644
index d7e0150..0000000
--- a/node_modules/rxjs/add/observable/pairs.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pairs.js","sources":["../../src/add/observable/pairs.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/observable/race.d.ts b/node_modules/rxjs/add/observable/race.d.ts
deleted file mode 100644
index 9b45c4e..0000000
--- a/node_modules/rxjs/add/observable/race.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/race';
diff --git a/node_modules/rxjs/add/observable/race.js b/node_modules/rxjs/add/observable/race.js
deleted file mode 100644
index 691cbe4..0000000
--- a/node_modules/rxjs/add/observable/race.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/race");
-//# sourceMappingURL=race.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/race.js.map b/node_modules/rxjs/add/observable/race.js.map
deleted file mode 100644
index 8a185cb..0000000
--- a/node_modules/rxjs/add/observable/race.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"race.js","sources":["../../src/add/observable/race.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/add/observable/range.d.ts b/node_modules/rxjs/add/observable/range.d.ts
deleted file mode 100644
index 2ae274e..0000000
--- a/node_modules/rxjs/add/observable/range.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/range';
diff --git a/node_modules/rxjs/add/observable/range.js b/node_modules/rxjs/add/observable/range.js
deleted file mode 100644
index 39d2f57..0000000
--- a/node_modules/rxjs/add/observable/range.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/range");
-//# sourceMappingURL=range.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/range.js.map b/node_modules/rxjs/add/observable/range.js.map
deleted file mode 100644
index c4c1e3b..0000000
--- a/node_modules/rxjs/add/observable/range.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"range.js","sources":["../../src/add/observable/range.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/observable/throw.d.ts b/node_modules/rxjs/add/observable/throw.d.ts
deleted file mode 100644
index 7405653..0000000
--- a/node_modules/rxjs/add/observable/throw.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/throw';
diff --git a/node_modules/rxjs/add/observable/throw.js b/node_modules/rxjs/add/observable/throw.js
deleted file mode 100644
index 21b4885..0000000
--- a/node_modules/rxjs/add/observable/throw.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/throw");
-//# sourceMappingURL=throw.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/throw.js.map b/node_modules/rxjs/add/observable/throw.js.map
deleted file mode 100644
index af86d3f..0000000
--- a/node_modules/rxjs/add/observable/throw.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throw.js","sources":["../../src/add/observable/throw.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/observable/timer.d.ts b/node_modules/rxjs/add/observable/timer.d.ts
deleted file mode 100644
index 60e2f9b..0000000
--- a/node_modules/rxjs/add/observable/timer.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/timer';
diff --git a/node_modules/rxjs/add/observable/timer.js b/node_modules/rxjs/add/observable/timer.js
deleted file mode 100644
index 39403e4..0000000
--- a/node_modules/rxjs/add/observable/timer.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/timer");
-//# sourceMappingURL=timer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/timer.js.map b/node_modules/rxjs/add/observable/timer.js.map
deleted file mode 100644
index 4f6a8e7..0000000
--- a/node_modules/rxjs/add/observable/timer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timer.js","sources":["../../src/add/observable/timer.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/observable/using.d.ts b/node_modules/rxjs/add/observable/using.d.ts
deleted file mode 100644
index c7ac49a..0000000
--- a/node_modules/rxjs/add/observable/using.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/using';
diff --git a/node_modules/rxjs/add/observable/using.js b/node_modules/rxjs/add/observable/using.js
deleted file mode 100644
index d387fef..0000000
--- a/node_modules/rxjs/add/observable/using.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/using");
-//# sourceMappingURL=using.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/using.js.map b/node_modules/rxjs/add/observable/using.js.map
deleted file mode 100644
index 23b5fb6..0000000
--- a/node_modules/rxjs/add/observable/using.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"using.js","sources":["../../src/add/observable/using.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/observable/zip.d.ts b/node_modules/rxjs/add/observable/zip.d.ts
deleted file mode 100644
index 5c72041..0000000
--- a/node_modules/rxjs/add/observable/zip.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/zip';
diff --git a/node_modules/rxjs/add/observable/zip.js b/node_modules/rxjs/add/observable/zip.js
deleted file mode 100644
index 8d9ceee..0000000
--- a/node_modules/rxjs/add/observable/zip.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/observable/zip");
-//# sourceMappingURL=zip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/observable/zip.js.map b/node_modules/rxjs/add/observable/zip.js.map
deleted file mode 100644
index 979d4b8..0000000
--- a/node_modules/rxjs/add/observable/zip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zip.js","sources":["../../src/add/observable/zip.ts"],"names":[],"mappings":";;AAAA,0CAAwC"}
diff --git a/node_modules/rxjs/add/operator/audit.d.ts b/node_modules/rxjs/add/operator/audit.d.ts
deleted file mode 100644
index a3eb5a4..0000000
--- a/node_modules/rxjs/add/operator/audit.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/audit';
diff --git a/node_modules/rxjs/add/operator/audit.js b/node_modules/rxjs/add/operator/audit.js
deleted file mode 100644
index c76b382..0000000
--- a/node_modules/rxjs/add/operator/audit.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/audit");
-//# sourceMappingURL=audit.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/audit.js.map b/node_modules/rxjs/add/operator/audit.js.map
deleted file mode 100644
index 16b4fd0..0000000
--- a/node_modules/rxjs/add/operator/audit.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"audit.js","sources":["../../src/add/operator/audit.ts"],"names":[],"mappings":";;AAAA,0CAAwC"}
diff --git a/node_modules/rxjs/add/operator/auditTime.d.ts b/node_modules/rxjs/add/operator/auditTime.d.ts
deleted file mode 100644
index 41f68da..0000000
--- a/node_modules/rxjs/add/operator/auditTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/auditTime';
diff --git a/node_modules/rxjs/add/operator/auditTime.js b/node_modules/rxjs/add/operator/auditTime.js
deleted file mode 100644
index 480f95c..0000000
--- a/node_modules/rxjs/add/operator/auditTime.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/auditTime");
-//# sourceMappingURL=auditTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/auditTime.js.map b/node_modules/rxjs/add/operator/auditTime.js.map
deleted file mode 100644
index aa604d7..0000000
--- a/node_modules/rxjs/add/operator/auditTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"auditTime.js","sources":["../../src/add/operator/auditTime.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/buffer.d.ts b/node_modules/rxjs/add/operator/buffer.d.ts
deleted file mode 100644
index b501cae..0000000
--- a/node_modules/rxjs/add/operator/buffer.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/buffer';
diff --git a/node_modules/rxjs/add/operator/buffer.js b/node_modules/rxjs/add/operator/buffer.js
deleted file mode 100644
index 68872bb..0000000
--- a/node_modules/rxjs/add/operator/buffer.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/buffer");
-//# sourceMappingURL=buffer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/buffer.js.map b/node_modules/rxjs/add/operator/buffer.js.map
deleted file mode 100644
index 76dbd49..0000000
--- a/node_modules/rxjs/add/operator/buffer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"buffer.js","sources":["../../src/add/operator/buffer.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/add/operator/bufferCount.d.ts b/node_modules/rxjs/add/operator/bufferCount.d.ts
deleted file mode 100644
index 96237e5..0000000
--- a/node_modules/rxjs/add/operator/bufferCount.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/bufferCount';
diff --git a/node_modules/rxjs/add/operator/bufferCount.js b/node_modules/rxjs/add/operator/bufferCount.js
deleted file mode 100644
index 9c7c5d7..0000000
--- a/node_modules/rxjs/add/operator/bufferCount.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/bufferCount");
-//# sourceMappingURL=bufferCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/bufferCount.js.map b/node_modules/rxjs/add/operator/bufferCount.js.map
deleted file mode 100644
index c9a5c6f..0000000
--- a/node_modules/rxjs/add/operator/bufferCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferCount.js","sources":["../../src/add/operator/bufferCount.ts"],"names":[],"mappings":";;AAAA,gDAA8C"}
diff --git a/node_modules/rxjs/add/operator/bufferTime.d.ts b/node_modules/rxjs/add/operator/bufferTime.d.ts
deleted file mode 100644
index abd78ab..0000000
--- a/node_modules/rxjs/add/operator/bufferTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/bufferTime';
diff --git a/node_modules/rxjs/add/operator/bufferTime.js b/node_modules/rxjs/add/operator/bufferTime.js
deleted file mode 100644
index 7ed332a..0000000
--- a/node_modules/rxjs/add/operator/bufferTime.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/bufferTime");
-//# sourceMappingURL=bufferTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/bufferTime.js.map b/node_modules/rxjs/add/operator/bufferTime.js.map
deleted file mode 100644
index 4d6990c..0000000
--- a/node_modules/rxjs/add/operator/bufferTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferTime.js","sources":["../../src/add/operator/bufferTime.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/operator/bufferToggle.d.ts b/node_modules/rxjs/add/operator/bufferToggle.d.ts
deleted file mode 100644
index 2dbdf86..0000000
--- a/node_modules/rxjs/add/operator/bufferToggle.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/bufferToggle';
diff --git a/node_modules/rxjs/add/operator/bufferToggle.js b/node_modules/rxjs/add/operator/bufferToggle.js
deleted file mode 100644
index d6d5a24..0000000
--- a/node_modules/rxjs/add/operator/bufferToggle.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/bufferToggle");
-//# sourceMappingURL=bufferToggle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/bufferToggle.js.map b/node_modules/rxjs/add/operator/bufferToggle.js.map
deleted file mode 100644
index 20cd73b..0000000
--- a/node_modules/rxjs/add/operator/bufferToggle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferToggle.js","sources":["../../src/add/operator/bufferToggle.ts"],"names":[],"mappings":";;AAAA,iDAA+C"}
diff --git a/node_modules/rxjs/add/operator/bufferWhen.d.ts b/node_modules/rxjs/add/operator/bufferWhen.d.ts
deleted file mode 100644
index 4ad636f..0000000
--- a/node_modules/rxjs/add/operator/bufferWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/bufferWhen';
diff --git a/node_modules/rxjs/add/operator/bufferWhen.js b/node_modules/rxjs/add/operator/bufferWhen.js
deleted file mode 100644
index 0c53f4e..0000000
--- a/node_modules/rxjs/add/operator/bufferWhen.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/bufferWhen");
-//# sourceMappingURL=bufferWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/bufferWhen.js.map b/node_modules/rxjs/add/operator/bufferWhen.js.map
deleted file mode 100644
index 8c8ee88..0000000
--- a/node_modules/rxjs/add/operator/bufferWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferWhen.js","sources":["../../src/add/operator/bufferWhen.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/operator/catch.d.ts b/node_modules/rxjs/add/operator/catch.d.ts
deleted file mode 100644
index 316a29e..0000000
--- a/node_modules/rxjs/add/operator/catch.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/catch';
diff --git a/node_modules/rxjs/add/operator/catch.js b/node_modules/rxjs/add/operator/catch.js
deleted file mode 100644
index 9220291..0000000
--- a/node_modules/rxjs/add/operator/catch.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/catch");
-//# sourceMappingURL=catch.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/catch.js.map b/node_modules/rxjs/add/operator/catch.js.map
deleted file mode 100644
index 09d0bd9..0000000
--- a/node_modules/rxjs/add/operator/catch.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"catch.js","sources":["../../src/add/operator/catch.ts"],"names":[],"mappings":";;AAAA,0CAAwC"}
diff --git a/node_modules/rxjs/add/operator/combineAll.d.ts b/node_modules/rxjs/add/operator/combineAll.d.ts
deleted file mode 100644
index 0cf4be8..0000000
--- a/node_modules/rxjs/add/operator/combineAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/combineAll';
diff --git a/node_modules/rxjs/add/operator/combineAll.js b/node_modules/rxjs/add/operator/combineAll.js
deleted file mode 100644
index 5b5317d..0000000
--- a/node_modules/rxjs/add/operator/combineAll.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/combineAll");
-//# sourceMappingURL=combineAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/combineAll.js.map b/node_modules/rxjs/add/operator/combineAll.js.map
deleted file mode 100644
index 0721014..0000000
--- a/node_modules/rxjs/add/operator/combineAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineAll.js","sources":["../../src/add/operator/combineAll.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/operator/combineLatest.d.ts b/node_modules/rxjs/add/operator/combineLatest.d.ts
deleted file mode 100644
index 88333e7..0000000
--- a/node_modules/rxjs/add/operator/combineLatest.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/combineLatest';
diff --git a/node_modules/rxjs/add/operator/combineLatest.js b/node_modules/rxjs/add/operator/combineLatest.js
deleted file mode 100644
index bbdfce8..0000000
--- a/node_modules/rxjs/add/operator/combineLatest.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/combineLatest");
-//# sourceMappingURL=combineLatest.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/combineLatest.js.map b/node_modules/rxjs/add/operator/combineLatest.js.map
deleted file mode 100644
index d6f48f8..0000000
--- a/node_modules/rxjs/add/operator/combineLatest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineLatest.js","sources":["../../src/add/operator/combineLatest.ts"],"names":[],"mappings":";;AAAA,kDAAgD"}
diff --git a/node_modules/rxjs/add/operator/concat.d.ts b/node_modules/rxjs/add/operator/concat.d.ts
deleted file mode 100644
index c743a6b..0000000
--- a/node_modules/rxjs/add/operator/concat.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/concat';
diff --git a/node_modules/rxjs/add/operator/concat.js b/node_modules/rxjs/add/operator/concat.js
deleted file mode 100644
index e65246e..0000000
--- a/node_modules/rxjs/add/operator/concat.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/concat");
-//# sourceMappingURL=concat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/concat.js.map b/node_modules/rxjs/add/operator/concat.js.map
deleted file mode 100644
index 7ccae34..0000000
--- a/node_modules/rxjs/add/operator/concat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concat.js","sources":["../../src/add/operator/concat.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/add/operator/concatAll.d.ts b/node_modules/rxjs/add/operator/concatAll.d.ts
deleted file mode 100644
index cf9157f..0000000
--- a/node_modules/rxjs/add/operator/concatAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/concatAll';
diff --git a/node_modules/rxjs/add/operator/concatAll.js b/node_modules/rxjs/add/operator/concatAll.js
deleted file mode 100644
index da7ee18..0000000
--- a/node_modules/rxjs/add/operator/concatAll.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/concatAll");
-//# sourceMappingURL=concatAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/concatAll.js.map b/node_modules/rxjs/add/operator/concatAll.js.map
deleted file mode 100644
index 8eaafd8..0000000
--- a/node_modules/rxjs/add/operator/concatAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatAll.js","sources":["../../src/add/operator/concatAll.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/concatMap.d.ts b/node_modules/rxjs/add/operator/concatMap.d.ts
deleted file mode 100644
index dadc722..0000000
--- a/node_modules/rxjs/add/operator/concatMap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/concatMap';
diff --git a/node_modules/rxjs/add/operator/concatMap.js b/node_modules/rxjs/add/operator/concatMap.js
deleted file mode 100644
index 9d98af9..0000000
--- a/node_modules/rxjs/add/operator/concatMap.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/concatMap");
-//# sourceMappingURL=concatMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/concatMap.js.map b/node_modules/rxjs/add/operator/concatMap.js.map
deleted file mode 100644
index 752de44..0000000
--- a/node_modules/rxjs/add/operator/concatMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatMap.js","sources":["../../src/add/operator/concatMap.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/concatMapTo.d.ts b/node_modules/rxjs/add/operator/concatMapTo.d.ts
deleted file mode 100644
index 9a843a6..0000000
--- a/node_modules/rxjs/add/operator/concatMapTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/concatMapTo';
diff --git a/node_modules/rxjs/add/operator/concatMapTo.js b/node_modules/rxjs/add/operator/concatMapTo.js
deleted file mode 100644
index 6698aef..0000000
--- a/node_modules/rxjs/add/operator/concatMapTo.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/concatMapTo");
-//# sourceMappingURL=concatMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/concatMapTo.js.map b/node_modules/rxjs/add/operator/concatMapTo.js.map
deleted file mode 100644
index fb73ad6..0000000
--- a/node_modules/rxjs/add/operator/concatMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatMapTo.js","sources":["../../src/add/operator/concatMapTo.ts"],"names":[],"mappings":";;AAAA,gDAA8C"}
diff --git a/node_modules/rxjs/add/operator/count.d.ts b/node_modules/rxjs/add/operator/count.d.ts
deleted file mode 100644
index 85c6832..0000000
--- a/node_modules/rxjs/add/operator/count.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/count';
diff --git a/node_modules/rxjs/add/operator/count.js b/node_modules/rxjs/add/operator/count.js
deleted file mode 100644
index 6957cf5..0000000
--- a/node_modules/rxjs/add/operator/count.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/count");
-//# sourceMappingURL=count.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/count.js.map b/node_modules/rxjs/add/operator/count.js.map
deleted file mode 100644
index ace114c..0000000
--- a/node_modules/rxjs/add/operator/count.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"count.js","sources":["../../src/add/operator/count.ts"],"names":[],"mappings":";;AAAA,0CAAwC"}
diff --git a/node_modules/rxjs/add/operator/debounce.d.ts b/node_modules/rxjs/add/operator/debounce.d.ts
deleted file mode 100644
index e5ff5db..0000000
--- a/node_modules/rxjs/add/operator/debounce.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/debounce';
diff --git a/node_modules/rxjs/add/operator/debounce.js b/node_modules/rxjs/add/operator/debounce.js
deleted file mode 100644
index a1d7f17..0000000
--- a/node_modules/rxjs/add/operator/debounce.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/debounce");
-//# sourceMappingURL=debounce.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/debounce.js.map b/node_modules/rxjs/add/operator/debounce.js.map
deleted file mode 100644
index 89ad4eb..0000000
--- a/node_modules/rxjs/add/operator/debounce.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounce.js","sources":["../../src/add/operator/debounce.ts"],"names":[],"mappings":";;AAAA,6CAA2C"}
diff --git a/node_modules/rxjs/add/operator/debounceTime.d.ts b/node_modules/rxjs/add/operator/debounceTime.d.ts
deleted file mode 100644
index 8ffedf9..0000000
--- a/node_modules/rxjs/add/operator/debounceTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/debounceTime';
diff --git a/node_modules/rxjs/add/operator/debounceTime.js b/node_modules/rxjs/add/operator/debounceTime.js
deleted file mode 100644
index 9a66c53..0000000
--- a/node_modules/rxjs/add/operator/debounceTime.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/debounceTime");
-//# sourceMappingURL=debounceTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/debounceTime.js.map b/node_modules/rxjs/add/operator/debounceTime.js.map
deleted file mode 100644
index cdbad98..0000000
--- a/node_modules/rxjs/add/operator/debounceTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounceTime.js","sources":["../../src/add/operator/debounceTime.ts"],"names":[],"mappings":";;AAAA,iDAA+C"}
diff --git a/node_modules/rxjs/add/operator/defaultIfEmpty.d.ts b/node_modules/rxjs/add/operator/defaultIfEmpty.d.ts
deleted file mode 100644
index d8e0070..0000000
--- a/node_modules/rxjs/add/operator/defaultIfEmpty.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/defaultIfEmpty';
diff --git a/node_modules/rxjs/add/operator/defaultIfEmpty.js b/node_modules/rxjs/add/operator/defaultIfEmpty.js
deleted file mode 100644
index 8f79694..0000000
--- a/node_modules/rxjs/add/operator/defaultIfEmpty.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/defaultIfEmpty");
-//# sourceMappingURL=defaultIfEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/defaultIfEmpty.js.map b/node_modules/rxjs/add/operator/defaultIfEmpty.js.map
deleted file mode 100644
index 3a5147e..0000000
--- a/node_modules/rxjs/add/operator/defaultIfEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"defaultIfEmpty.js","sources":["../../src/add/operator/defaultIfEmpty.ts"],"names":[],"mappings":";;AAAA,mDAAiD"}
diff --git a/node_modules/rxjs/add/operator/delay.d.ts b/node_modules/rxjs/add/operator/delay.d.ts
deleted file mode 100644
index 96d2017..0000000
--- a/node_modules/rxjs/add/operator/delay.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/delay';
diff --git a/node_modules/rxjs/add/operator/delay.js b/node_modules/rxjs/add/operator/delay.js
deleted file mode 100644
index 5828c65..0000000
--- a/node_modules/rxjs/add/operator/delay.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/delay");
-//# sourceMappingURL=delay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/delay.js.map b/node_modules/rxjs/add/operator/delay.js.map
deleted file mode 100644
index cd27763..0000000
--- a/node_modules/rxjs/add/operator/delay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"delay.js","sources":["../../src/add/operator/delay.ts"],"names":[],"mappings":";;AAAA,0CAAwC"}
diff --git a/node_modules/rxjs/add/operator/delayWhen.d.ts b/node_modules/rxjs/add/operator/delayWhen.d.ts
deleted file mode 100644
index a50cebb..0000000
--- a/node_modules/rxjs/add/operator/delayWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/delayWhen';
diff --git a/node_modules/rxjs/add/operator/delayWhen.js b/node_modules/rxjs/add/operator/delayWhen.js
deleted file mode 100644
index 9e5b758..0000000
--- a/node_modules/rxjs/add/operator/delayWhen.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/delayWhen");
-//# sourceMappingURL=delayWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/delayWhen.js.map b/node_modules/rxjs/add/operator/delayWhen.js.map
deleted file mode 100644
index 0ab069a..0000000
--- a/node_modules/rxjs/add/operator/delayWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"delayWhen.js","sources":["../../src/add/operator/delayWhen.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/dematerialize.d.ts b/node_modules/rxjs/add/operator/dematerialize.d.ts
deleted file mode 100644
index 18f368b..0000000
--- a/node_modules/rxjs/add/operator/dematerialize.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/dematerialize';
diff --git a/node_modules/rxjs/add/operator/dematerialize.js b/node_modules/rxjs/add/operator/dematerialize.js
deleted file mode 100644
index 933d925..0000000
--- a/node_modules/rxjs/add/operator/dematerialize.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/dematerialize");
-//# sourceMappingURL=dematerialize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/dematerialize.js.map b/node_modules/rxjs/add/operator/dematerialize.js.map
deleted file mode 100644
index 5ba22f8..0000000
--- a/node_modules/rxjs/add/operator/dematerialize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"dematerialize.js","sources":["../../src/add/operator/dematerialize.ts"],"names":[],"mappings":";;AAAA,kDAAgD"}
diff --git a/node_modules/rxjs/add/operator/distinct.d.ts b/node_modules/rxjs/add/operator/distinct.d.ts
deleted file mode 100644
index 330f8f9..0000000
--- a/node_modules/rxjs/add/operator/distinct.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/distinct';
diff --git a/node_modules/rxjs/add/operator/distinct.js b/node_modules/rxjs/add/operator/distinct.js
deleted file mode 100644
index 0ba3bac..0000000
--- a/node_modules/rxjs/add/operator/distinct.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/distinct");
-//# sourceMappingURL=distinct.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/distinct.js.map b/node_modules/rxjs/add/operator/distinct.js.map
deleted file mode 100644
index d4196d0..0000000
--- a/node_modules/rxjs/add/operator/distinct.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinct.js","sources":["../../src/add/operator/distinct.ts"],"names":[],"mappings":";;AAAA,6CAA2C"}
diff --git a/node_modules/rxjs/add/operator/distinctUntilChanged.d.ts b/node_modules/rxjs/add/operator/distinctUntilChanged.d.ts
deleted file mode 100644
index 8273e9e..0000000
--- a/node_modules/rxjs/add/operator/distinctUntilChanged.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/distinctUntilChanged';
diff --git a/node_modules/rxjs/add/operator/distinctUntilChanged.js b/node_modules/rxjs/add/operator/distinctUntilChanged.js
deleted file mode 100644
index a08c77a..0000000
--- a/node_modules/rxjs/add/operator/distinctUntilChanged.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/distinctUntilChanged");
-//# sourceMappingURL=distinctUntilChanged.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/distinctUntilChanged.js.map b/node_modules/rxjs/add/operator/distinctUntilChanged.js.map
deleted file mode 100644
index 7c0cc23..0000000
--- a/node_modules/rxjs/add/operator/distinctUntilChanged.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinctUntilChanged.js","sources":["../../src/add/operator/distinctUntilChanged.ts"],"names":[],"mappings":";;AAAA,yDAAuD"}
diff --git a/node_modules/rxjs/add/operator/distinctUntilKeyChanged.d.ts b/node_modules/rxjs/add/operator/distinctUntilKeyChanged.d.ts
deleted file mode 100644
index f556b82..0000000
--- a/node_modules/rxjs/add/operator/distinctUntilKeyChanged.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/distinctUntilKeyChanged';
diff --git a/node_modules/rxjs/add/operator/distinctUntilKeyChanged.js b/node_modules/rxjs/add/operator/distinctUntilKeyChanged.js
deleted file mode 100644
index f48243a..0000000
--- a/node_modules/rxjs/add/operator/distinctUntilKeyChanged.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/distinctUntilKeyChanged");
-//# sourceMappingURL=distinctUntilKeyChanged.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/distinctUntilKeyChanged.js.map b/node_modules/rxjs/add/operator/distinctUntilKeyChanged.js.map
deleted file mode 100644
index 10931c8..0000000
--- a/node_modules/rxjs/add/operator/distinctUntilKeyChanged.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinctUntilKeyChanged.js","sources":["../../src/add/operator/distinctUntilKeyChanged.ts"],"names":[],"mappings":";;AAAA,4DAA0D"}
diff --git a/node_modules/rxjs/add/operator/do.d.ts b/node_modules/rxjs/add/operator/do.d.ts
deleted file mode 100644
index 9eee7cd..0000000
--- a/node_modules/rxjs/add/operator/do.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/do';
diff --git a/node_modules/rxjs/add/operator/do.js b/node_modules/rxjs/add/operator/do.js
deleted file mode 100644
index caf5174..0000000
--- a/node_modules/rxjs/add/operator/do.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/do");
-//# sourceMappingURL=do.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/do.js.map b/node_modules/rxjs/add/operator/do.js.map
deleted file mode 100644
index 0e0eda0..0000000
--- a/node_modules/rxjs/add/operator/do.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"do.js","sources":["../../src/add/operator/do.ts"],"names":[],"mappings":";;AAAA,uCAAqC"}
diff --git a/node_modules/rxjs/add/operator/elementAt.d.ts b/node_modules/rxjs/add/operator/elementAt.d.ts
deleted file mode 100644
index 8fe8f29..0000000
--- a/node_modules/rxjs/add/operator/elementAt.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/elementAt';
diff --git a/node_modules/rxjs/add/operator/elementAt.js b/node_modules/rxjs/add/operator/elementAt.js
deleted file mode 100644
index 49f837d..0000000
--- a/node_modules/rxjs/add/operator/elementAt.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/elementAt");
-//# sourceMappingURL=elementAt.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/elementAt.js.map b/node_modules/rxjs/add/operator/elementAt.js.map
deleted file mode 100644
index 5075eb5..0000000
--- a/node_modules/rxjs/add/operator/elementAt.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"elementAt.js","sources":["../../src/add/operator/elementAt.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/every.d.ts b/node_modules/rxjs/add/operator/every.d.ts
deleted file mode 100644
index 789d3c1..0000000
--- a/node_modules/rxjs/add/operator/every.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/every';
diff --git a/node_modules/rxjs/add/operator/every.js b/node_modules/rxjs/add/operator/every.js
deleted file mode 100644
index 5726e81..0000000
--- a/node_modules/rxjs/add/operator/every.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/every");
-//# sourceMappingURL=every.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/every.js.map b/node_modules/rxjs/add/operator/every.js.map
deleted file mode 100644
index 4aecfac..0000000
--- a/node_modules/rxjs/add/operator/every.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"every.js","sources":["../../src/add/operator/every.ts"],"names":[],"mappings":";;AAAA,0CAAwC"}
diff --git a/node_modules/rxjs/add/operator/exhaust.d.ts b/node_modules/rxjs/add/operator/exhaust.d.ts
deleted file mode 100644
index d0cae89..0000000
--- a/node_modules/rxjs/add/operator/exhaust.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/exhaust';
diff --git a/node_modules/rxjs/add/operator/exhaust.js b/node_modules/rxjs/add/operator/exhaust.js
deleted file mode 100644
index 961de7c..0000000
--- a/node_modules/rxjs/add/operator/exhaust.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/exhaust");
-//# sourceMappingURL=exhaust.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/exhaust.js.map b/node_modules/rxjs/add/operator/exhaust.js.map
deleted file mode 100644
index c639877..0000000
--- a/node_modules/rxjs/add/operator/exhaust.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exhaust.js","sources":["../../src/add/operator/exhaust.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/operator/exhaustMap.d.ts b/node_modules/rxjs/add/operator/exhaustMap.d.ts
deleted file mode 100644
index 6e231be..0000000
--- a/node_modules/rxjs/add/operator/exhaustMap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/exhaustMap';
diff --git a/node_modules/rxjs/add/operator/exhaustMap.js b/node_modules/rxjs/add/operator/exhaustMap.js
deleted file mode 100644
index c00bae3..0000000
--- a/node_modules/rxjs/add/operator/exhaustMap.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/exhaustMap");
-//# sourceMappingURL=exhaustMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/exhaustMap.js.map b/node_modules/rxjs/add/operator/exhaustMap.js.map
deleted file mode 100644
index ee84018..0000000
--- a/node_modules/rxjs/add/operator/exhaustMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exhaustMap.js","sources":["../../src/add/operator/exhaustMap.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/operator/expand.d.ts b/node_modules/rxjs/add/operator/expand.d.ts
deleted file mode 100644
index 035ea49..0000000
--- a/node_modules/rxjs/add/operator/expand.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/expand';
diff --git a/node_modules/rxjs/add/operator/expand.js b/node_modules/rxjs/add/operator/expand.js
deleted file mode 100644
index 1a5e5f1..0000000
--- a/node_modules/rxjs/add/operator/expand.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/expand");
-//# sourceMappingURL=expand.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/expand.js.map b/node_modules/rxjs/add/operator/expand.js.map
deleted file mode 100644
index 6ffe1cf..0000000
--- a/node_modules/rxjs/add/operator/expand.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"expand.js","sources":["../../src/add/operator/expand.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/add/operator/filter.d.ts b/node_modules/rxjs/add/operator/filter.d.ts
deleted file mode 100644
index 1cfe74a..0000000
--- a/node_modules/rxjs/add/operator/filter.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/filter';
diff --git a/node_modules/rxjs/add/operator/filter.js b/node_modules/rxjs/add/operator/filter.js
deleted file mode 100644
index fdceab3..0000000
--- a/node_modules/rxjs/add/operator/filter.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/filter");
-//# sourceMappingURL=filter.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/filter.js.map b/node_modules/rxjs/add/operator/filter.js.map
deleted file mode 100644
index d1576dc..0000000
--- a/node_modules/rxjs/add/operator/filter.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"filter.js","sources":["../../src/add/operator/filter.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/add/operator/finally.d.ts b/node_modules/rxjs/add/operator/finally.d.ts
deleted file mode 100644
index 7db9d99..0000000
--- a/node_modules/rxjs/add/operator/finally.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/finally';
diff --git a/node_modules/rxjs/add/operator/finally.js b/node_modules/rxjs/add/operator/finally.js
deleted file mode 100644
index 6e921a7..0000000
--- a/node_modules/rxjs/add/operator/finally.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/finally");
-//# sourceMappingURL=finally.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/finally.js.map b/node_modules/rxjs/add/operator/finally.js.map
deleted file mode 100644
index a864c86..0000000
--- a/node_modules/rxjs/add/operator/finally.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"finally.js","sources":["../../src/add/operator/finally.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/operator/find.d.ts b/node_modules/rxjs/add/operator/find.d.ts
deleted file mode 100644
index 2255ba4..0000000
--- a/node_modules/rxjs/add/operator/find.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/find';
diff --git a/node_modules/rxjs/add/operator/find.js b/node_modules/rxjs/add/operator/find.js
deleted file mode 100644
index 91d31ba..0000000
--- a/node_modules/rxjs/add/operator/find.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/find");
-//# sourceMappingURL=find.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/find.js.map b/node_modules/rxjs/add/operator/find.js.map
deleted file mode 100644
index c23f16b..0000000
--- a/node_modules/rxjs/add/operator/find.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"find.js","sources":["../../src/add/operator/find.ts"],"names":[],"mappings":";;AAAA,yCAAuC"}
diff --git a/node_modules/rxjs/add/operator/findIndex.d.ts b/node_modules/rxjs/add/operator/findIndex.d.ts
deleted file mode 100644
index 8d98469..0000000
--- a/node_modules/rxjs/add/operator/findIndex.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/findIndex';
diff --git a/node_modules/rxjs/add/operator/findIndex.js b/node_modules/rxjs/add/operator/findIndex.js
deleted file mode 100644
index a3982d8..0000000
--- a/node_modules/rxjs/add/operator/findIndex.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/findIndex");
-//# sourceMappingURL=findIndex.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/findIndex.js.map b/node_modules/rxjs/add/operator/findIndex.js.map
deleted file mode 100644
index fce0f58..0000000
--- a/node_modules/rxjs/add/operator/findIndex.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"findIndex.js","sources":["../../src/add/operator/findIndex.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/first.d.ts b/node_modules/rxjs/add/operator/first.d.ts
deleted file mode 100644
index b12264f..0000000
--- a/node_modules/rxjs/add/operator/first.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/first';
diff --git a/node_modules/rxjs/add/operator/first.js b/node_modules/rxjs/add/operator/first.js
deleted file mode 100644
index 14e9c80..0000000
--- a/node_modules/rxjs/add/operator/first.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/first");
-//# sourceMappingURL=first.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/first.js.map b/node_modules/rxjs/add/operator/first.js.map
deleted file mode 100644
index 0a63f44..0000000
--- a/node_modules/rxjs/add/operator/first.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"first.js","sources":["../../src/add/operator/first.ts"],"names":[],"mappings":";;AAAA,0CAAwC"}
diff --git a/node_modules/rxjs/add/operator/groupBy.d.ts b/node_modules/rxjs/add/operator/groupBy.d.ts
deleted file mode 100644
index 932d1f4..0000000
--- a/node_modules/rxjs/add/operator/groupBy.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/groupBy';
diff --git a/node_modules/rxjs/add/operator/groupBy.js b/node_modules/rxjs/add/operator/groupBy.js
deleted file mode 100644
index 4c79ff1..0000000
--- a/node_modules/rxjs/add/operator/groupBy.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/groupBy");
-//# sourceMappingURL=groupBy.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/groupBy.js.map b/node_modules/rxjs/add/operator/groupBy.js.map
deleted file mode 100644
index 9701dab..0000000
--- a/node_modules/rxjs/add/operator/groupBy.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"groupBy.js","sources":["../../src/add/operator/groupBy.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/operator/ignoreElements.d.ts b/node_modules/rxjs/add/operator/ignoreElements.d.ts
deleted file mode 100644
index 28b04ba..0000000
--- a/node_modules/rxjs/add/operator/ignoreElements.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/ignoreElements';
diff --git a/node_modules/rxjs/add/operator/ignoreElements.js b/node_modules/rxjs/add/operator/ignoreElements.js
deleted file mode 100644
index 08cf515..0000000
--- a/node_modules/rxjs/add/operator/ignoreElements.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/ignoreElements");
-//# sourceMappingURL=ignoreElements.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/ignoreElements.js.map b/node_modules/rxjs/add/operator/ignoreElements.js.map
deleted file mode 100644
index 2acf913..0000000
--- a/node_modules/rxjs/add/operator/ignoreElements.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ignoreElements.js","sources":["../../src/add/operator/ignoreElements.ts"],"names":[],"mappings":";;AAAA,mDAAiD"}
diff --git a/node_modules/rxjs/add/operator/isEmpty.d.ts b/node_modules/rxjs/add/operator/isEmpty.d.ts
deleted file mode 100644
index b84aaa9..0000000
--- a/node_modules/rxjs/add/operator/isEmpty.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/isEmpty';
diff --git a/node_modules/rxjs/add/operator/isEmpty.js b/node_modules/rxjs/add/operator/isEmpty.js
deleted file mode 100644
index 730a52f..0000000
--- a/node_modules/rxjs/add/operator/isEmpty.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/isEmpty");
-//# sourceMappingURL=isEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/isEmpty.js.map b/node_modules/rxjs/add/operator/isEmpty.js.map
deleted file mode 100644
index 27ce72a..0000000
--- a/node_modules/rxjs/add/operator/isEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isEmpty.js","sources":["../../src/add/operator/isEmpty.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/operator/last.d.ts b/node_modules/rxjs/add/operator/last.d.ts
deleted file mode 100644
index 0b222df..0000000
--- a/node_modules/rxjs/add/operator/last.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/last';
diff --git a/node_modules/rxjs/add/operator/last.js b/node_modules/rxjs/add/operator/last.js
deleted file mode 100644
index b1d158c..0000000
--- a/node_modules/rxjs/add/operator/last.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/last");
-//# sourceMappingURL=last.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/last.js.map b/node_modules/rxjs/add/operator/last.js.map
deleted file mode 100644
index 70f3e2e..0000000
--- a/node_modules/rxjs/add/operator/last.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"last.js","sources":["../../src/add/operator/last.ts"],"names":[],"mappings":";;AAAA,yCAAuC"}
diff --git a/node_modules/rxjs/add/operator/let.d.ts b/node_modules/rxjs/add/operator/let.d.ts
deleted file mode 100644
index 5b92015..0000000
--- a/node_modules/rxjs/add/operator/let.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/let';
diff --git a/node_modules/rxjs/add/operator/let.js b/node_modules/rxjs/add/operator/let.js
deleted file mode 100644
index 2a289f2..0000000
--- a/node_modules/rxjs/add/operator/let.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/let");
-//# sourceMappingURL=let.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/let.js.map b/node_modules/rxjs/add/operator/let.js.map
deleted file mode 100644
index f43757b..0000000
--- a/node_modules/rxjs/add/operator/let.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"let.js","sources":["../../src/add/operator/let.ts"],"names":[],"mappings":";;AAAA,wCAAsC"}
diff --git a/node_modules/rxjs/add/operator/map.d.ts b/node_modules/rxjs/add/operator/map.d.ts
deleted file mode 100644
index e9f2a7f..0000000
--- a/node_modules/rxjs/add/operator/map.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/map';
diff --git a/node_modules/rxjs/add/operator/map.js b/node_modules/rxjs/add/operator/map.js
deleted file mode 100644
index 91060b4..0000000
--- a/node_modules/rxjs/add/operator/map.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/map");
-//# sourceMappingURL=map.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/map.js.map b/node_modules/rxjs/add/operator/map.js.map
deleted file mode 100644
index 945bd41..0000000
--- a/node_modules/rxjs/add/operator/map.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"map.js","sources":["../../src/add/operator/map.ts"],"names":[],"mappings":";;AAAA,wCAAsC"}
diff --git a/node_modules/rxjs/add/operator/mapTo.d.ts b/node_modules/rxjs/add/operator/mapTo.d.ts
deleted file mode 100644
index a49f787..0000000
--- a/node_modules/rxjs/add/operator/mapTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/mapTo';
diff --git a/node_modules/rxjs/add/operator/mapTo.js b/node_modules/rxjs/add/operator/mapTo.js
deleted file mode 100644
index 5d24be4..0000000
--- a/node_modules/rxjs/add/operator/mapTo.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/mapTo");
-//# sourceMappingURL=mapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/mapTo.js.map b/node_modules/rxjs/add/operator/mapTo.js.map
deleted file mode 100644
index e0b6b77..0000000
--- a/node_modules/rxjs/add/operator/mapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mapTo.js","sources":["../../src/add/operator/mapTo.ts"],"names":[],"mappings":";;AAAA,0CAAwC"}
diff --git a/node_modules/rxjs/add/operator/materialize.d.ts b/node_modules/rxjs/add/operator/materialize.d.ts
deleted file mode 100644
index e773199..0000000
--- a/node_modules/rxjs/add/operator/materialize.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/materialize';
diff --git a/node_modules/rxjs/add/operator/materialize.js b/node_modules/rxjs/add/operator/materialize.js
deleted file mode 100644
index 8e14b7e..0000000
--- a/node_modules/rxjs/add/operator/materialize.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/materialize");
-//# sourceMappingURL=materialize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/materialize.js.map b/node_modules/rxjs/add/operator/materialize.js.map
deleted file mode 100644
index 0efd701..0000000
--- a/node_modules/rxjs/add/operator/materialize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"materialize.js","sources":["../../src/add/operator/materialize.ts"],"names":[],"mappings":";;AAAA,gDAA8C"}
diff --git a/node_modules/rxjs/add/operator/max.d.ts b/node_modules/rxjs/add/operator/max.d.ts
deleted file mode 100644
index c66f7ae..0000000
--- a/node_modules/rxjs/add/operator/max.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/max';
diff --git a/node_modules/rxjs/add/operator/max.js b/node_modules/rxjs/add/operator/max.js
deleted file mode 100644
index 56b5824..0000000
--- a/node_modules/rxjs/add/operator/max.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/max");
-//# sourceMappingURL=max.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/max.js.map b/node_modules/rxjs/add/operator/max.js.map
deleted file mode 100644
index 7b0277e..0000000
--- a/node_modules/rxjs/add/operator/max.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"max.js","sources":["../../src/add/operator/max.ts"],"names":[],"mappings":";;AAAA,wCAAsC"}
diff --git a/node_modules/rxjs/add/operator/merge.d.ts b/node_modules/rxjs/add/operator/merge.d.ts
deleted file mode 100644
index dfa5c46..0000000
--- a/node_modules/rxjs/add/operator/merge.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/merge';
diff --git a/node_modules/rxjs/add/operator/merge.js b/node_modules/rxjs/add/operator/merge.js
deleted file mode 100644
index 10f11d5..0000000
--- a/node_modules/rxjs/add/operator/merge.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/merge");
-//# sourceMappingURL=merge.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/merge.js.map b/node_modules/rxjs/add/operator/merge.js.map
deleted file mode 100644
index ceb8603..0000000
--- a/node_modules/rxjs/add/operator/merge.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"merge.js","sources":["../../src/add/operator/merge.ts"],"names":[],"mappings":";;AAAA,0CAAwC"}
diff --git a/node_modules/rxjs/add/operator/mergeAll.d.ts b/node_modules/rxjs/add/operator/mergeAll.d.ts
deleted file mode 100644
index 06cdc4f..0000000
--- a/node_modules/rxjs/add/operator/mergeAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/mergeAll';
diff --git a/node_modules/rxjs/add/operator/mergeAll.js b/node_modules/rxjs/add/operator/mergeAll.js
deleted file mode 100644
index 02b8b75..0000000
--- a/node_modules/rxjs/add/operator/mergeAll.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/mergeAll");
-//# sourceMappingURL=mergeAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/mergeAll.js.map b/node_modules/rxjs/add/operator/mergeAll.js.map
deleted file mode 100644
index 9ec784a..0000000
--- a/node_modules/rxjs/add/operator/mergeAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeAll.js","sources":["../../src/add/operator/mergeAll.ts"],"names":[],"mappings":";;AAAA,6CAA2C"}
diff --git a/node_modules/rxjs/add/operator/mergeMap.d.ts b/node_modules/rxjs/add/operator/mergeMap.d.ts
deleted file mode 100644
index d8ec3cc..0000000
--- a/node_modules/rxjs/add/operator/mergeMap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/mergeMap';
diff --git a/node_modules/rxjs/add/operator/mergeMap.js b/node_modules/rxjs/add/operator/mergeMap.js
deleted file mode 100644
index e550a31..0000000
--- a/node_modules/rxjs/add/operator/mergeMap.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/mergeMap");
-//# sourceMappingURL=mergeMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/mergeMap.js.map b/node_modules/rxjs/add/operator/mergeMap.js.map
deleted file mode 100644
index bdefc21..0000000
--- a/node_modules/rxjs/add/operator/mergeMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeMap.js","sources":["../../src/add/operator/mergeMap.ts"],"names":[],"mappings":";;AAAA,6CAA2C"}
diff --git a/node_modules/rxjs/add/operator/mergeMapTo.d.ts b/node_modules/rxjs/add/operator/mergeMapTo.d.ts
deleted file mode 100644
index 0d8e15f..0000000
--- a/node_modules/rxjs/add/operator/mergeMapTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/mergeMapTo';
diff --git a/node_modules/rxjs/add/operator/mergeMapTo.js b/node_modules/rxjs/add/operator/mergeMapTo.js
deleted file mode 100644
index 30f39e2..0000000
--- a/node_modules/rxjs/add/operator/mergeMapTo.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/mergeMapTo");
-//# sourceMappingURL=mergeMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/mergeMapTo.js.map b/node_modules/rxjs/add/operator/mergeMapTo.js.map
deleted file mode 100644
index c741663..0000000
--- a/node_modules/rxjs/add/operator/mergeMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeMapTo.js","sources":["../../src/add/operator/mergeMapTo.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/operator/mergeScan.d.ts b/node_modules/rxjs/add/operator/mergeScan.d.ts
deleted file mode 100644
index 17c5fcc..0000000
--- a/node_modules/rxjs/add/operator/mergeScan.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/mergeScan';
diff --git a/node_modules/rxjs/add/operator/mergeScan.js b/node_modules/rxjs/add/operator/mergeScan.js
deleted file mode 100644
index 9be36cd..0000000
--- a/node_modules/rxjs/add/operator/mergeScan.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/mergeScan");
-//# sourceMappingURL=mergeScan.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/mergeScan.js.map b/node_modules/rxjs/add/operator/mergeScan.js.map
deleted file mode 100644
index b6e3a2f..0000000
--- a/node_modules/rxjs/add/operator/mergeScan.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeScan.js","sources":["../../src/add/operator/mergeScan.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/min.d.ts b/node_modules/rxjs/add/operator/min.d.ts
deleted file mode 100644
index 5fa91d5..0000000
--- a/node_modules/rxjs/add/operator/min.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/min';
diff --git a/node_modules/rxjs/add/operator/min.js b/node_modules/rxjs/add/operator/min.js
deleted file mode 100644
index d23db81..0000000
--- a/node_modules/rxjs/add/operator/min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/min");
-//# sourceMappingURL=min.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/min.js.map b/node_modules/rxjs/add/operator/min.js.map
deleted file mode 100644
index 88fbc15..0000000
--- a/node_modules/rxjs/add/operator/min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"min.js","sources":["../../src/add/operator/min.ts"],"names":[],"mappings":";;AAAA,wCAAsC"}
diff --git a/node_modules/rxjs/add/operator/multicast.d.ts b/node_modules/rxjs/add/operator/multicast.d.ts
deleted file mode 100644
index 03b0670..0000000
--- a/node_modules/rxjs/add/operator/multicast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/multicast';
diff --git a/node_modules/rxjs/add/operator/multicast.js b/node_modules/rxjs/add/operator/multicast.js
deleted file mode 100644
index 2f7c199..0000000
--- a/node_modules/rxjs/add/operator/multicast.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/multicast");
-//# sourceMappingURL=multicast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/multicast.js.map b/node_modules/rxjs/add/operator/multicast.js.map
deleted file mode 100644
index accd0a8..0000000
--- a/node_modules/rxjs/add/operator/multicast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"multicast.js","sources":["../../src/add/operator/multicast.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/observeOn.d.ts b/node_modules/rxjs/add/operator/observeOn.d.ts
deleted file mode 100644
index 4ade085..0000000
--- a/node_modules/rxjs/add/operator/observeOn.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/observeOn';
diff --git a/node_modules/rxjs/add/operator/observeOn.js b/node_modules/rxjs/add/operator/observeOn.js
deleted file mode 100644
index 1eb8c75..0000000
--- a/node_modules/rxjs/add/operator/observeOn.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/observeOn");
-//# sourceMappingURL=observeOn.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/observeOn.js.map b/node_modules/rxjs/add/operator/observeOn.js.map
deleted file mode 100644
index 82b9528..0000000
--- a/node_modules/rxjs/add/operator/observeOn.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"observeOn.js","sources":["../../src/add/operator/observeOn.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/onErrorResumeNext.d.ts b/node_modules/rxjs/add/operator/onErrorResumeNext.d.ts
deleted file mode 100644
index 0d2aa97..0000000
--- a/node_modules/rxjs/add/operator/onErrorResumeNext.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/onErrorResumeNext';
diff --git a/node_modules/rxjs/add/operator/onErrorResumeNext.js b/node_modules/rxjs/add/operator/onErrorResumeNext.js
deleted file mode 100644
index 1cdca28..0000000
--- a/node_modules/rxjs/add/operator/onErrorResumeNext.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/onErrorResumeNext");
-//# sourceMappingURL=onErrorResumeNext.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/onErrorResumeNext.js.map b/node_modules/rxjs/add/operator/onErrorResumeNext.js.map
deleted file mode 100644
index 9f4c34c..0000000
--- a/node_modules/rxjs/add/operator/onErrorResumeNext.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"onErrorResumeNext.js","sources":["../../src/add/operator/onErrorResumeNext.ts"],"names":[],"mappings":";;AAAA,sDAAoD"}
diff --git a/node_modules/rxjs/add/operator/pairwise.d.ts b/node_modules/rxjs/add/operator/pairwise.d.ts
deleted file mode 100644
index 2930fd3..0000000
--- a/node_modules/rxjs/add/operator/pairwise.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/pairwise';
diff --git a/node_modules/rxjs/add/operator/pairwise.js b/node_modules/rxjs/add/operator/pairwise.js
deleted file mode 100644
index a458db3..0000000
--- a/node_modules/rxjs/add/operator/pairwise.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/pairwise");
-//# sourceMappingURL=pairwise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/pairwise.js.map b/node_modules/rxjs/add/operator/pairwise.js.map
deleted file mode 100644
index f52406e..0000000
--- a/node_modules/rxjs/add/operator/pairwise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pairwise.js","sources":["../../src/add/operator/pairwise.ts"],"names":[],"mappings":";;AAAA,6CAA2C"}
diff --git a/node_modules/rxjs/add/operator/partition.d.ts b/node_modules/rxjs/add/operator/partition.d.ts
deleted file mode 100644
index 7b8c869..0000000
--- a/node_modules/rxjs/add/operator/partition.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/partition';
diff --git a/node_modules/rxjs/add/operator/partition.js b/node_modules/rxjs/add/operator/partition.js
deleted file mode 100644
index a85b37a..0000000
--- a/node_modules/rxjs/add/operator/partition.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/partition");
-//# sourceMappingURL=partition.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/partition.js.map b/node_modules/rxjs/add/operator/partition.js.map
deleted file mode 100644
index cdd4dcb..0000000
--- a/node_modules/rxjs/add/operator/partition.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"partition.js","sources":["../../src/add/operator/partition.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/pluck.d.ts b/node_modules/rxjs/add/operator/pluck.d.ts
deleted file mode 100644
index 0af0f3b..0000000
--- a/node_modules/rxjs/add/operator/pluck.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/pluck';
diff --git a/node_modules/rxjs/add/operator/pluck.js b/node_modules/rxjs/add/operator/pluck.js
deleted file mode 100644
index 87e2b9d..0000000
--- a/node_modules/rxjs/add/operator/pluck.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/pluck");
-//# sourceMappingURL=pluck.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/pluck.js.map b/node_modules/rxjs/add/operator/pluck.js.map
deleted file mode 100644
index 4f8da48..0000000
--- a/node_modules/rxjs/add/operator/pluck.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pluck.js","sources":["../../src/add/operator/pluck.ts"],"names":[],"mappings":";;AAAA,0CAAwC"}
diff --git a/node_modules/rxjs/add/operator/publish.d.ts b/node_modules/rxjs/add/operator/publish.d.ts
deleted file mode 100644
index b7198cc..0000000
--- a/node_modules/rxjs/add/operator/publish.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/publish';
diff --git a/node_modules/rxjs/add/operator/publish.js b/node_modules/rxjs/add/operator/publish.js
deleted file mode 100644
index 68a62eb..0000000
--- a/node_modules/rxjs/add/operator/publish.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/publish");
-//# sourceMappingURL=publish.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/publish.js.map b/node_modules/rxjs/add/operator/publish.js.map
deleted file mode 100644
index 1ebb5a3..0000000
--- a/node_modules/rxjs/add/operator/publish.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publish.js","sources":["../../src/add/operator/publish.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/operator/publishBehavior.d.ts b/node_modules/rxjs/add/operator/publishBehavior.d.ts
deleted file mode 100644
index 3bc5e01..0000000
--- a/node_modules/rxjs/add/operator/publishBehavior.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/publishBehavior';
diff --git a/node_modules/rxjs/add/operator/publishBehavior.js b/node_modules/rxjs/add/operator/publishBehavior.js
deleted file mode 100644
index 3667cb7..0000000
--- a/node_modules/rxjs/add/operator/publishBehavior.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/publishBehavior");
-//# sourceMappingURL=publishBehavior.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/publishBehavior.js.map b/node_modules/rxjs/add/operator/publishBehavior.js.map
deleted file mode 100644
index ac4949b..0000000
--- a/node_modules/rxjs/add/operator/publishBehavior.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishBehavior.js","sources":["../../src/add/operator/publishBehavior.ts"],"names":[],"mappings":";;AAAA,oDAAkD"}
diff --git a/node_modules/rxjs/add/operator/publishLast.d.ts b/node_modules/rxjs/add/operator/publishLast.d.ts
deleted file mode 100644
index 243d07c..0000000
--- a/node_modules/rxjs/add/operator/publishLast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/publishLast';
diff --git a/node_modules/rxjs/add/operator/publishLast.js b/node_modules/rxjs/add/operator/publishLast.js
deleted file mode 100644
index 6f85bbd..0000000
--- a/node_modules/rxjs/add/operator/publishLast.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/publishLast");
-//# sourceMappingURL=publishLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/publishLast.js.map b/node_modules/rxjs/add/operator/publishLast.js.map
deleted file mode 100644
index a1e6ec7..0000000
--- a/node_modules/rxjs/add/operator/publishLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishLast.js","sources":["../../src/add/operator/publishLast.ts"],"names":[],"mappings":";;AAAA,gDAA8C"}
diff --git a/node_modules/rxjs/add/operator/publishReplay.d.ts b/node_modules/rxjs/add/operator/publishReplay.d.ts
deleted file mode 100644
index 06bc922..0000000
--- a/node_modules/rxjs/add/operator/publishReplay.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/publishReplay';
diff --git a/node_modules/rxjs/add/operator/publishReplay.js b/node_modules/rxjs/add/operator/publishReplay.js
deleted file mode 100644
index 8577776..0000000
--- a/node_modules/rxjs/add/operator/publishReplay.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/publishReplay");
-//# sourceMappingURL=publishReplay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/publishReplay.js.map b/node_modules/rxjs/add/operator/publishReplay.js.map
deleted file mode 100644
index eb44e12..0000000
--- a/node_modules/rxjs/add/operator/publishReplay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishReplay.js","sources":["../../src/add/operator/publishReplay.ts"],"names":[],"mappings":";;AAAA,kDAAgD"}
diff --git a/node_modules/rxjs/add/operator/race.d.ts b/node_modules/rxjs/add/operator/race.d.ts
deleted file mode 100644
index b113466..0000000
--- a/node_modules/rxjs/add/operator/race.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/race';
diff --git a/node_modules/rxjs/add/operator/race.js b/node_modules/rxjs/add/operator/race.js
deleted file mode 100644
index f139329..0000000
--- a/node_modules/rxjs/add/operator/race.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/race");
-//# sourceMappingURL=race.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/race.js.map b/node_modules/rxjs/add/operator/race.js.map
deleted file mode 100644
index bb48aad..0000000
--- a/node_modules/rxjs/add/operator/race.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"race.js","sources":["../../src/add/operator/race.ts"],"names":[],"mappings":";;AAAA,yCAAuC"}
diff --git a/node_modules/rxjs/add/operator/reduce.d.ts b/node_modules/rxjs/add/operator/reduce.d.ts
deleted file mode 100644
index c8db530..0000000
--- a/node_modules/rxjs/add/operator/reduce.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/reduce';
diff --git a/node_modules/rxjs/add/operator/reduce.js b/node_modules/rxjs/add/operator/reduce.js
deleted file mode 100644
index d278e1d..0000000
--- a/node_modules/rxjs/add/operator/reduce.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/reduce");
-//# sourceMappingURL=reduce.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/reduce.js.map b/node_modules/rxjs/add/operator/reduce.js.map
deleted file mode 100644
index 6f63204..0000000
--- a/node_modules/rxjs/add/operator/reduce.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"reduce.js","sources":["../../src/add/operator/reduce.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/add/operator/repeat.d.ts b/node_modules/rxjs/add/operator/repeat.d.ts
deleted file mode 100644
index 4290613..0000000
--- a/node_modules/rxjs/add/operator/repeat.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/repeat';
diff --git a/node_modules/rxjs/add/operator/repeat.js b/node_modules/rxjs/add/operator/repeat.js
deleted file mode 100644
index 7376df4..0000000
--- a/node_modules/rxjs/add/operator/repeat.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/repeat");
-//# sourceMappingURL=repeat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/repeat.js.map b/node_modules/rxjs/add/operator/repeat.js.map
deleted file mode 100644
index 8efab1f..0000000
--- a/node_modules/rxjs/add/operator/repeat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"repeat.js","sources":["../../src/add/operator/repeat.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/add/operator/repeatWhen.d.ts b/node_modules/rxjs/add/operator/repeatWhen.d.ts
deleted file mode 100644
index ca5471a..0000000
--- a/node_modules/rxjs/add/operator/repeatWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/repeatWhen';
diff --git a/node_modules/rxjs/add/operator/repeatWhen.js b/node_modules/rxjs/add/operator/repeatWhen.js
deleted file mode 100644
index 4a23d60..0000000
--- a/node_modules/rxjs/add/operator/repeatWhen.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/repeatWhen");
-//# sourceMappingURL=repeatWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/repeatWhen.js.map b/node_modules/rxjs/add/operator/repeatWhen.js.map
deleted file mode 100644
index 53b67c3..0000000
--- a/node_modules/rxjs/add/operator/repeatWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"repeatWhen.js","sources":["../../src/add/operator/repeatWhen.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/operator/retry.d.ts b/node_modules/rxjs/add/operator/retry.d.ts
deleted file mode 100644
index fb9316b..0000000
--- a/node_modules/rxjs/add/operator/retry.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/retry';
diff --git a/node_modules/rxjs/add/operator/retry.js b/node_modules/rxjs/add/operator/retry.js
deleted file mode 100644
index c00fa98..0000000
--- a/node_modules/rxjs/add/operator/retry.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/retry");
-//# sourceMappingURL=retry.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/retry.js.map b/node_modules/rxjs/add/operator/retry.js.map
deleted file mode 100644
index bde602f..0000000
--- a/node_modules/rxjs/add/operator/retry.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"retry.js","sources":["../../src/add/operator/retry.ts"],"names":[],"mappings":";;AAAA,0CAAwC"}
diff --git a/node_modules/rxjs/add/operator/retryWhen.d.ts b/node_modules/rxjs/add/operator/retryWhen.d.ts
deleted file mode 100644
index c455337..0000000
--- a/node_modules/rxjs/add/operator/retryWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/retryWhen';
diff --git a/node_modules/rxjs/add/operator/retryWhen.js b/node_modules/rxjs/add/operator/retryWhen.js
deleted file mode 100644
index 689a957..0000000
--- a/node_modules/rxjs/add/operator/retryWhen.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/retryWhen");
-//# sourceMappingURL=retryWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/retryWhen.js.map b/node_modules/rxjs/add/operator/retryWhen.js.map
deleted file mode 100644
index 3340634..0000000
--- a/node_modules/rxjs/add/operator/retryWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"retryWhen.js","sources":["../../src/add/operator/retryWhen.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/sample.d.ts b/node_modules/rxjs/add/operator/sample.d.ts
deleted file mode 100644
index 441255f..0000000
--- a/node_modules/rxjs/add/operator/sample.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/sample';
diff --git a/node_modules/rxjs/add/operator/sample.js b/node_modules/rxjs/add/operator/sample.js
deleted file mode 100644
index 1318150..0000000
--- a/node_modules/rxjs/add/operator/sample.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/sample");
-//# sourceMappingURL=sample.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/sample.js.map b/node_modules/rxjs/add/operator/sample.js.map
deleted file mode 100644
index 48d52ee..0000000
--- a/node_modules/rxjs/add/operator/sample.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sample.js","sources":["../../src/add/operator/sample.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/add/operator/sampleTime.d.ts b/node_modules/rxjs/add/operator/sampleTime.d.ts
deleted file mode 100644
index 153d8b0..0000000
--- a/node_modules/rxjs/add/operator/sampleTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/sampleTime';
diff --git a/node_modules/rxjs/add/operator/sampleTime.js b/node_modules/rxjs/add/operator/sampleTime.js
deleted file mode 100644
index 3296e68..0000000
--- a/node_modules/rxjs/add/operator/sampleTime.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/sampleTime");
-//# sourceMappingURL=sampleTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/sampleTime.js.map b/node_modules/rxjs/add/operator/sampleTime.js.map
deleted file mode 100644
index 9774074..0000000
--- a/node_modules/rxjs/add/operator/sampleTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sampleTime.js","sources":["../../src/add/operator/sampleTime.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/operator/scan.d.ts b/node_modules/rxjs/add/operator/scan.d.ts
deleted file mode 100644
index baf8162..0000000
--- a/node_modules/rxjs/add/operator/scan.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/scan';
diff --git a/node_modules/rxjs/add/operator/scan.js b/node_modules/rxjs/add/operator/scan.js
deleted file mode 100644
index e2186c0..0000000
--- a/node_modules/rxjs/add/operator/scan.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/scan");
-//# sourceMappingURL=scan.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/scan.js.map b/node_modules/rxjs/add/operator/scan.js.map
deleted file mode 100644
index 75fbc7a..0000000
--- a/node_modules/rxjs/add/operator/scan.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scan.js","sources":["../../src/add/operator/scan.ts"],"names":[],"mappings":";;AAAA,yCAAuC"}
diff --git a/node_modules/rxjs/add/operator/sequenceEqual.d.ts b/node_modules/rxjs/add/operator/sequenceEqual.d.ts
deleted file mode 100644
index f47a31d..0000000
--- a/node_modules/rxjs/add/operator/sequenceEqual.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/sequenceEqual';
diff --git a/node_modules/rxjs/add/operator/sequenceEqual.js b/node_modules/rxjs/add/operator/sequenceEqual.js
deleted file mode 100644
index 009d8bd..0000000
--- a/node_modules/rxjs/add/operator/sequenceEqual.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/sequenceEqual");
-//# sourceMappingURL=sequenceEqual.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/sequenceEqual.js.map b/node_modules/rxjs/add/operator/sequenceEqual.js.map
deleted file mode 100644
index 5f0a05c..0000000
--- a/node_modules/rxjs/add/operator/sequenceEqual.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sequenceEqual.js","sources":["../../src/add/operator/sequenceEqual.ts"],"names":[],"mappings":";;AAAA,kDAAgD"}
diff --git a/node_modules/rxjs/add/operator/share.d.ts b/node_modules/rxjs/add/operator/share.d.ts
deleted file mode 100644
index 6db65af..0000000
--- a/node_modules/rxjs/add/operator/share.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/share';
diff --git a/node_modules/rxjs/add/operator/share.js b/node_modules/rxjs/add/operator/share.js
deleted file mode 100644
index a77a301..0000000
--- a/node_modules/rxjs/add/operator/share.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/share");
-//# sourceMappingURL=share.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/share.js.map b/node_modules/rxjs/add/operator/share.js.map
deleted file mode 100644
index d3612c2..0000000
--- a/node_modules/rxjs/add/operator/share.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"share.js","sources":["../../src/add/operator/share.ts"],"names":[],"mappings":";;AAAA,0CAAwC"}
diff --git a/node_modules/rxjs/add/operator/shareReplay.d.ts b/node_modules/rxjs/add/operator/shareReplay.d.ts
deleted file mode 100644
index 7f31ff4..0000000
--- a/node_modules/rxjs/add/operator/shareReplay.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/shareReplay';
diff --git a/node_modules/rxjs/add/operator/shareReplay.js b/node_modules/rxjs/add/operator/shareReplay.js
deleted file mode 100644
index a5492b9..0000000
--- a/node_modules/rxjs/add/operator/shareReplay.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/shareReplay");
-//# sourceMappingURL=shareReplay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/shareReplay.js.map b/node_modules/rxjs/add/operator/shareReplay.js.map
deleted file mode 100644
index a0ccd1a..0000000
--- a/node_modules/rxjs/add/operator/shareReplay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"shareReplay.js","sources":["../../src/add/operator/shareReplay.ts"],"names":[],"mappings":";;AAAA,gDAA8C"}
diff --git a/node_modules/rxjs/add/operator/single.d.ts b/node_modules/rxjs/add/operator/single.d.ts
deleted file mode 100644
index d35b3cd..0000000
--- a/node_modules/rxjs/add/operator/single.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/single';
diff --git a/node_modules/rxjs/add/operator/single.js b/node_modules/rxjs/add/operator/single.js
deleted file mode 100644
index e8c6eda..0000000
--- a/node_modules/rxjs/add/operator/single.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/single");
-//# sourceMappingURL=single.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/single.js.map b/node_modules/rxjs/add/operator/single.js.map
deleted file mode 100644
index 8bac037..0000000
--- a/node_modules/rxjs/add/operator/single.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"single.js","sources":["../../src/add/operator/single.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/add/operator/skip.d.ts b/node_modules/rxjs/add/operator/skip.d.ts
deleted file mode 100644
index 1456f1e..0000000
--- a/node_modules/rxjs/add/operator/skip.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/skip';
diff --git a/node_modules/rxjs/add/operator/skip.js b/node_modules/rxjs/add/operator/skip.js
deleted file mode 100644
index 6fe5c69..0000000
--- a/node_modules/rxjs/add/operator/skip.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/skip");
-//# sourceMappingURL=skip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/skip.js.map b/node_modules/rxjs/add/operator/skip.js.map
deleted file mode 100644
index 02ae65d..0000000
--- a/node_modules/rxjs/add/operator/skip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skip.js","sources":["../../src/add/operator/skip.ts"],"names":[],"mappings":";;AAAA,yCAAuC"}
diff --git a/node_modules/rxjs/add/operator/skipLast.d.ts b/node_modules/rxjs/add/operator/skipLast.d.ts
deleted file mode 100644
index 0c432c9..0000000
--- a/node_modules/rxjs/add/operator/skipLast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/skipLast';
diff --git a/node_modules/rxjs/add/operator/skipLast.js b/node_modules/rxjs/add/operator/skipLast.js
deleted file mode 100644
index f27a585..0000000
--- a/node_modules/rxjs/add/operator/skipLast.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/skipLast");
-//# sourceMappingURL=skipLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/skipLast.js.map b/node_modules/rxjs/add/operator/skipLast.js.map
deleted file mode 100644
index 02475f1..0000000
--- a/node_modules/rxjs/add/operator/skipLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipLast.js","sources":["../../src/add/operator/skipLast.ts"],"names":[],"mappings":";;AAAA,6CAA2C"}
diff --git a/node_modules/rxjs/add/operator/skipUntil.d.ts b/node_modules/rxjs/add/operator/skipUntil.d.ts
deleted file mode 100644
index 21ea6b2..0000000
--- a/node_modules/rxjs/add/operator/skipUntil.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/skipUntil';
diff --git a/node_modules/rxjs/add/operator/skipUntil.js b/node_modules/rxjs/add/operator/skipUntil.js
deleted file mode 100644
index 69c0389..0000000
--- a/node_modules/rxjs/add/operator/skipUntil.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/skipUntil");
-//# sourceMappingURL=skipUntil.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/skipUntil.js.map b/node_modules/rxjs/add/operator/skipUntil.js.map
deleted file mode 100644
index f0a19cc..0000000
--- a/node_modules/rxjs/add/operator/skipUntil.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipUntil.js","sources":["../../src/add/operator/skipUntil.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/skipWhile.d.ts b/node_modules/rxjs/add/operator/skipWhile.d.ts
deleted file mode 100644
index 496218b..0000000
--- a/node_modules/rxjs/add/operator/skipWhile.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/skipWhile';
diff --git a/node_modules/rxjs/add/operator/skipWhile.js b/node_modules/rxjs/add/operator/skipWhile.js
deleted file mode 100644
index 093c352..0000000
--- a/node_modules/rxjs/add/operator/skipWhile.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/skipWhile");
-//# sourceMappingURL=skipWhile.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/skipWhile.js.map b/node_modules/rxjs/add/operator/skipWhile.js.map
deleted file mode 100644
index 5e076c9..0000000
--- a/node_modules/rxjs/add/operator/skipWhile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipWhile.js","sources":["../../src/add/operator/skipWhile.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/startWith.d.ts b/node_modules/rxjs/add/operator/startWith.d.ts
deleted file mode 100644
index 9c9e670..0000000
--- a/node_modules/rxjs/add/operator/startWith.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/startWith';
diff --git a/node_modules/rxjs/add/operator/startWith.js b/node_modules/rxjs/add/operator/startWith.js
deleted file mode 100644
index cce240d..0000000
--- a/node_modules/rxjs/add/operator/startWith.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/startWith");
-//# sourceMappingURL=startWith.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/startWith.js.map b/node_modules/rxjs/add/operator/startWith.js.map
deleted file mode 100644
index db9e74e..0000000
--- a/node_modules/rxjs/add/operator/startWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"startWith.js","sources":["../../src/add/operator/startWith.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/subscribeOn.d.ts b/node_modules/rxjs/add/operator/subscribeOn.d.ts
deleted file mode 100644
index a1b5d6d..0000000
--- a/node_modules/rxjs/add/operator/subscribeOn.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/subscribeOn';
diff --git a/node_modules/rxjs/add/operator/subscribeOn.js b/node_modules/rxjs/add/operator/subscribeOn.js
deleted file mode 100644
index 003a9ea..0000000
--- a/node_modules/rxjs/add/operator/subscribeOn.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/subscribeOn");
-//# sourceMappingURL=subscribeOn.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/subscribeOn.js.map b/node_modules/rxjs/add/operator/subscribeOn.js.map
deleted file mode 100644
index 546ffb8..0000000
--- a/node_modules/rxjs/add/operator/subscribeOn.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeOn.js","sources":["../../src/add/operator/subscribeOn.ts"],"names":[],"mappings":";;AAAA,gDAA8C"}
diff --git a/node_modules/rxjs/add/operator/switch.d.ts b/node_modules/rxjs/add/operator/switch.d.ts
deleted file mode 100644
index d2d3f48..0000000
--- a/node_modules/rxjs/add/operator/switch.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/switch';
diff --git a/node_modules/rxjs/add/operator/switch.js b/node_modules/rxjs/add/operator/switch.js
deleted file mode 100644
index 8da50a1..0000000
--- a/node_modules/rxjs/add/operator/switch.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/switch");
-//# sourceMappingURL=switch.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/switch.js.map b/node_modules/rxjs/add/operator/switch.js.map
deleted file mode 100644
index e291bac..0000000
--- a/node_modules/rxjs/add/operator/switch.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switch.js","sources":["../../src/add/operator/switch.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/add/operator/switchMap.d.ts b/node_modules/rxjs/add/operator/switchMap.d.ts
deleted file mode 100644
index b1dfdfa..0000000
--- a/node_modules/rxjs/add/operator/switchMap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/switchMap';
diff --git a/node_modules/rxjs/add/operator/switchMap.js b/node_modules/rxjs/add/operator/switchMap.js
deleted file mode 100644
index f9ac611..0000000
--- a/node_modules/rxjs/add/operator/switchMap.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/switchMap");
-//# sourceMappingURL=switchMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/switchMap.js.map b/node_modules/rxjs/add/operator/switchMap.js.map
deleted file mode 100644
index 1d9bb0b..0000000
--- a/node_modules/rxjs/add/operator/switchMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchMap.js","sources":["../../src/add/operator/switchMap.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/switchMapTo.d.ts b/node_modules/rxjs/add/operator/switchMapTo.d.ts
deleted file mode 100644
index 320b844..0000000
--- a/node_modules/rxjs/add/operator/switchMapTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/switchMapTo';
diff --git a/node_modules/rxjs/add/operator/switchMapTo.js b/node_modules/rxjs/add/operator/switchMapTo.js
deleted file mode 100644
index cc5cb93..0000000
--- a/node_modules/rxjs/add/operator/switchMapTo.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/switchMapTo");
-//# sourceMappingURL=switchMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/switchMapTo.js.map b/node_modules/rxjs/add/operator/switchMapTo.js.map
deleted file mode 100644
index 62d7c10..0000000
--- a/node_modules/rxjs/add/operator/switchMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchMapTo.js","sources":["../../src/add/operator/switchMapTo.ts"],"names":[],"mappings":";;AAAA,gDAA8C"}
diff --git a/node_modules/rxjs/add/operator/take.d.ts b/node_modules/rxjs/add/operator/take.d.ts
deleted file mode 100644
index 08c3bcb..0000000
--- a/node_modules/rxjs/add/operator/take.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/take';
diff --git a/node_modules/rxjs/add/operator/take.js b/node_modules/rxjs/add/operator/take.js
deleted file mode 100644
index aac062c..0000000
--- a/node_modules/rxjs/add/operator/take.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/take");
-//# sourceMappingURL=take.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/take.js.map b/node_modules/rxjs/add/operator/take.js.map
deleted file mode 100644
index 2716631..0000000
--- a/node_modules/rxjs/add/operator/take.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"take.js","sources":["../../src/add/operator/take.ts"],"names":[],"mappings":";;AAAA,yCAAuC"}
diff --git a/node_modules/rxjs/add/operator/takeLast.d.ts b/node_modules/rxjs/add/operator/takeLast.d.ts
deleted file mode 100644
index 13d0816..0000000
--- a/node_modules/rxjs/add/operator/takeLast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/takeLast';
diff --git a/node_modules/rxjs/add/operator/takeLast.js b/node_modules/rxjs/add/operator/takeLast.js
deleted file mode 100644
index 9da93fc..0000000
--- a/node_modules/rxjs/add/operator/takeLast.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/takeLast");
-//# sourceMappingURL=takeLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/takeLast.js.map b/node_modules/rxjs/add/operator/takeLast.js.map
deleted file mode 100644
index b3c0b7f..0000000
--- a/node_modules/rxjs/add/operator/takeLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeLast.js","sources":["../../src/add/operator/takeLast.ts"],"names":[],"mappings":";;AAAA,6CAA2C"}
diff --git a/node_modules/rxjs/add/operator/takeUntil.d.ts b/node_modules/rxjs/add/operator/takeUntil.d.ts
deleted file mode 100644
index 78c8e55..0000000
--- a/node_modules/rxjs/add/operator/takeUntil.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/takeUntil';
diff --git a/node_modules/rxjs/add/operator/takeUntil.js b/node_modules/rxjs/add/operator/takeUntil.js
deleted file mode 100644
index f69102c..0000000
--- a/node_modules/rxjs/add/operator/takeUntil.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/takeUntil");
-//# sourceMappingURL=takeUntil.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/takeUntil.js.map b/node_modules/rxjs/add/operator/takeUntil.js.map
deleted file mode 100644
index a9ab1f1..0000000
--- a/node_modules/rxjs/add/operator/takeUntil.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeUntil.js","sources":["../../src/add/operator/takeUntil.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/takeWhile.d.ts b/node_modules/rxjs/add/operator/takeWhile.d.ts
deleted file mode 100644
index 06ff174..0000000
--- a/node_modules/rxjs/add/operator/takeWhile.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/takeWhile';
diff --git a/node_modules/rxjs/add/operator/takeWhile.js b/node_modules/rxjs/add/operator/takeWhile.js
deleted file mode 100644
index 84d37ea..0000000
--- a/node_modules/rxjs/add/operator/takeWhile.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/takeWhile");
-//# sourceMappingURL=takeWhile.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/takeWhile.js.map b/node_modules/rxjs/add/operator/takeWhile.js.map
deleted file mode 100644
index 291ca39..0000000
--- a/node_modules/rxjs/add/operator/takeWhile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeWhile.js","sources":["../../src/add/operator/takeWhile.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/throttle.d.ts b/node_modules/rxjs/add/operator/throttle.d.ts
deleted file mode 100644
index 825457b..0000000
--- a/node_modules/rxjs/add/operator/throttle.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/throttle';
diff --git a/node_modules/rxjs/add/operator/throttle.js b/node_modules/rxjs/add/operator/throttle.js
deleted file mode 100644
index 4ff4d7f..0000000
--- a/node_modules/rxjs/add/operator/throttle.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/throttle");
-//# sourceMappingURL=throttle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/throttle.js.map b/node_modules/rxjs/add/operator/throttle.js.map
deleted file mode 100644
index fb643ca..0000000
--- a/node_modules/rxjs/add/operator/throttle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throttle.js","sources":["../../src/add/operator/throttle.ts"],"names":[],"mappings":";;AAAA,6CAA2C"}
diff --git a/node_modules/rxjs/add/operator/throttleTime.d.ts b/node_modules/rxjs/add/operator/throttleTime.d.ts
deleted file mode 100644
index c683297..0000000
--- a/node_modules/rxjs/add/operator/throttleTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/throttleTime';
diff --git a/node_modules/rxjs/add/operator/throttleTime.js b/node_modules/rxjs/add/operator/throttleTime.js
deleted file mode 100644
index 4cb8a2b..0000000
--- a/node_modules/rxjs/add/operator/throttleTime.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/throttleTime");
-//# sourceMappingURL=throttleTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/throttleTime.js.map b/node_modules/rxjs/add/operator/throttleTime.js.map
deleted file mode 100644
index e6a434e..0000000
--- a/node_modules/rxjs/add/operator/throttleTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throttleTime.js","sources":["../../src/add/operator/throttleTime.ts"],"names":[],"mappings":";;AAAA,iDAA+C"}
diff --git a/node_modules/rxjs/add/operator/timeInterval.d.ts b/node_modules/rxjs/add/operator/timeInterval.d.ts
deleted file mode 100644
index 198a616..0000000
--- a/node_modules/rxjs/add/operator/timeInterval.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/timeInterval';
diff --git a/node_modules/rxjs/add/operator/timeInterval.js b/node_modules/rxjs/add/operator/timeInterval.js
deleted file mode 100644
index fae6799..0000000
--- a/node_modules/rxjs/add/operator/timeInterval.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/timeInterval");
-//# sourceMappingURL=timeInterval.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/timeInterval.js.map b/node_modules/rxjs/add/operator/timeInterval.js.map
deleted file mode 100644
index 39a6077..0000000
--- a/node_modules/rxjs/add/operator/timeInterval.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeInterval.js","sources":["../../src/add/operator/timeInterval.ts"],"names":[],"mappings":";;AAAA,iDAA+C"}
diff --git a/node_modules/rxjs/add/operator/timeout.d.ts b/node_modules/rxjs/add/operator/timeout.d.ts
deleted file mode 100644
index 2a69ffd..0000000
--- a/node_modules/rxjs/add/operator/timeout.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/timeout';
diff --git a/node_modules/rxjs/add/operator/timeout.js b/node_modules/rxjs/add/operator/timeout.js
deleted file mode 100644
index 5263dcc..0000000
--- a/node_modules/rxjs/add/operator/timeout.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/timeout");
-//# sourceMappingURL=timeout.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/timeout.js.map b/node_modules/rxjs/add/operator/timeout.js.map
deleted file mode 100644
index b9cd549..0000000
--- a/node_modules/rxjs/add/operator/timeout.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeout.js","sources":["../../src/add/operator/timeout.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/operator/timeoutWith.d.ts b/node_modules/rxjs/add/operator/timeoutWith.d.ts
deleted file mode 100644
index cd4ec44..0000000
--- a/node_modules/rxjs/add/operator/timeoutWith.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/timeoutWith';
diff --git a/node_modules/rxjs/add/operator/timeoutWith.js b/node_modules/rxjs/add/operator/timeoutWith.js
deleted file mode 100644
index d68cb34..0000000
--- a/node_modules/rxjs/add/operator/timeoutWith.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/timeoutWith");
-//# sourceMappingURL=timeoutWith.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/timeoutWith.js.map b/node_modules/rxjs/add/operator/timeoutWith.js.map
deleted file mode 100644
index c4f7107..0000000
--- a/node_modules/rxjs/add/operator/timeoutWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeoutWith.js","sources":["../../src/add/operator/timeoutWith.ts"],"names":[],"mappings":";;AAAA,gDAA8C"}
diff --git a/node_modules/rxjs/add/operator/timestamp.d.ts b/node_modules/rxjs/add/operator/timestamp.d.ts
deleted file mode 100644
index 16402c8..0000000
--- a/node_modules/rxjs/add/operator/timestamp.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/timestamp';
diff --git a/node_modules/rxjs/add/operator/timestamp.js b/node_modules/rxjs/add/operator/timestamp.js
deleted file mode 100644
index 7cda577..0000000
--- a/node_modules/rxjs/add/operator/timestamp.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/timestamp");
-//# sourceMappingURL=timestamp.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/timestamp.js.map b/node_modules/rxjs/add/operator/timestamp.js.map
deleted file mode 100644
index add6759..0000000
--- a/node_modules/rxjs/add/operator/timestamp.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timestamp.js","sources":["../../src/add/operator/timestamp.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/toArray.d.ts b/node_modules/rxjs/add/operator/toArray.d.ts
deleted file mode 100644
index a0f1a4f..0000000
--- a/node_modules/rxjs/add/operator/toArray.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/toArray';
diff --git a/node_modules/rxjs/add/operator/toArray.js b/node_modules/rxjs/add/operator/toArray.js
deleted file mode 100644
index e7c8107..0000000
--- a/node_modules/rxjs/add/operator/toArray.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/toArray");
-//# sourceMappingURL=toArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/toArray.js.map b/node_modules/rxjs/add/operator/toArray.js.map
deleted file mode 100644
index 0377690..0000000
--- a/node_modules/rxjs/add/operator/toArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"toArray.js","sources":["../../src/add/operator/toArray.ts"],"names":[],"mappings":";;AAAA,4CAA0C"}
diff --git a/node_modules/rxjs/add/operator/toPromise.d.ts b/node_modules/rxjs/add/operator/toPromise.d.ts
deleted file mode 100644
index cc7b16e..0000000
--- a/node_modules/rxjs/add/operator/toPromise.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/toPromise';
diff --git a/node_modules/rxjs/add/operator/toPromise.js b/node_modules/rxjs/add/operator/toPromise.js
deleted file mode 100644
index c7cb12b..0000000
--- a/node_modules/rxjs/add/operator/toPromise.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/toPromise");
-//# sourceMappingURL=toPromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/toPromise.js.map b/node_modules/rxjs/add/operator/toPromise.js.map
deleted file mode 100644
index cfa4eb4..0000000
--- a/node_modules/rxjs/add/operator/toPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"toPromise.js","sources":["../../src/add/operator/toPromise.ts"],"names":[],"mappings":";;AAAA,8CAA4C"}
diff --git a/node_modules/rxjs/add/operator/window.d.ts b/node_modules/rxjs/add/operator/window.d.ts
deleted file mode 100644
index 450c41f..0000000
--- a/node_modules/rxjs/add/operator/window.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/window';
diff --git a/node_modules/rxjs/add/operator/window.js b/node_modules/rxjs/add/operator/window.js
deleted file mode 100644
index 656fce3..0000000
--- a/node_modules/rxjs/add/operator/window.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/window");
-//# sourceMappingURL=window.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/window.js.map b/node_modules/rxjs/add/operator/window.js.map
deleted file mode 100644
index 1bf33da..0000000
--- a/node_modules/rxjs/add/operator/window.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"window.js","sources":["../../src/add/operator/window.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/add/operator/windowCount.d.ts b/node_modules/rxjs/add/operator/windowCount.d.ts
deleted file mode 100644
index da7eccf..0000000
--- a/node_modules/rxjs/add/operator/windowCount.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/windowCount';
diff --git a/node_modules/rxjs/add/operator/windowCount.js b/node_modules/rxjs/add/operator/windowCount.js
deleted file mode 100644
index 1018e22..0000000
--- a/node_modules/rxjs/add/operator/windowCount.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/windowCount");
-//# sourceMappingURL=windowCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/windowCount.js.map b/node_modules/rxjs/add/operator/windowCount.js.map
deleted file mode 100644
index 5e80c7a..0000000
--- a/node_modules/rxjs/add/operator/windowCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowCount.js","sources":["../../src/add/operator/windowCount.ts"],"names":[],"mappings":";;AAAA,gDAA8C"}
diff --git a/node_modules/rxjs/add/operator/windowTime.d.ts b/node_modules/rxjs/add/operator/windowTime.d.ts
deleted file mode 100644
index 1d82ec6..0000000
--- a/node_modules/rxjs/add/operator/windowTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/windowTime';
diff --git a/node_modules/rxjs/add/operator/windowTime.js b/node_modules/rxjs/add/operator/windowTime.js
deleted file mode 100644
index 091a9ae..0000000
--- a/node_modules/rxjs/add/operator/windowTime.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/windowTime");
-//# sourceMappingURL=windowTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/windowTime.js.map b/node_modules/rxjs/add/operator/windowTime.js.map
deleted file mode 100644
index 067b878..0000000
--- a/node_modules/rxjs/add/operator/windowTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowTime.js","sources":["../../src/add/operator/windowTime.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/operator/windowToggle.d.ts b/node_modules/rxjs/add/operator/windowToggle.d.ts
deleted file mode 100644
index 9ed25df..0000000
--- a/node_modules/rxjs/add/operator/windowToggle.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/windowToggle';
diff --git a/node_modules/rxjs/add/operator/windowToggle.js b/node_modules/rxjs/add/operator/windowToggle.js
deleted file mode 100644
index d84082f..0000000
--- a/node_modules/rxjs/add/operator/windowToggle.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/windowToggle");
-//# sourceMappingURL=windowToggle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/windowToggle.js.map b/node_modules/rxjs/add/operator/windowToggle.js.map
deleted file mode 100644
index a2197f2..0000000
--- a/node_modules/rxjs/add/operator/windowToggle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowToggle.js","sources":["../../src/add/operator/windowToggle.ts"],"names":[],"mappings":";;AAAA,iDAA+C"}
diff --git a/node_modules/rxjs/add/operator/windowWhen.d.ts b/node_modules/rxjs/add/operator/windowWhen.d.ts
deleted file mode 100644
index f5d8564..0000000
--- a/node_modules/rxjs/add/operator/windowWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/windowWhen';
diff --git a/node_modules/rxjs/add/operator/windowWhen.js b/node_modules/rxjs/add/operator/windowWhen.js
deleted file mode 100644
index f647f9b..0000000
--- a/node_modules/rxjs/add/operator/windowWhen.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/windowWhen");
-//# sourceMappingURL=windowWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/windowWhen.js.map b/node_modules/rxjs/add/operator/windowWhen.js.map
deleted file mode 100644
index 419601b..0000000
--- a/node_modules/rxjs/add/operator/windowWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowWhen.js","sources":["../../src/add/operator/windowWhen.ts"],"names":[],"mappings":";;AAAA,+CAA6C"}
diff --git a/node_modules/rxjs/add/operator/withLatestFrom.d.ts b/node_modules/rxjs/add/operator/withLatestFrom.d.ts
deleted file mode 100644
index 9f71574..0000000
--- a/node_modules/rxjs/add/operator/withLatestFrom.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/withLatestFrom';
diff --git a/node_modules/rxjs/add/operator/withLatestFrom.js b/node_modules/rxjs/add/operator/withLatestFrom.js
deleted file mode 100644
index 548babd..0000000
--- a/node_modules/rxjs/add/operator/withLatestFrom.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/withLatestFrom");
-//# sourceMappingURL=withLatestFrom.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/withLatestFrom.js.map b/node_modules/rxjs/add/operator/withLatestFrom.js.map
deleted file mode 100644
index af5df33..0000000
--- a/node_modules/rxjs/add/operator/withLatestFrom.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"withLatestFrom.js","sources":["../../src/add/operator/withLatestFrom.ts"],"names":[],"mappings":";;AAAA,mDAAiD"}
diff --git a/node_modules/rxjs/add/operator/zip.d.ts b/node_modules/rxjs/add/operator/zip.d.ts
deleted file mode 100644
index 414202a..0000000
--- a/node_modules/rxjs/add/operator/zip.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/zip';
diff --git a/node_modules/rxjs/add/operator/zip.js b/node_modules/rxjs/add/operator/zip.js
deleted file mode 100644
index 368d4fa..0000000
--- a/node_modules/rxjs/add/operator/zip.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/zip");
-//# sourceMappingURL=zip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/zip.js.map b/node_modules/rxjs/add/operator/zip.js.map
deleted file mode 100644
index c2472f9..0000000
--- a/node_modules/rxjs/add/operator/zip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zip.js","sources":["../../src/add/operator/zip.ts"],"names":[],"mappings":";;AAAA,wCAAsC"}
diff --git a/node_modules/rxjs/add/operator/zipAll.d.ts b/node_modules/rxjs/add/operator/zipAll.d.ts
deleted file mode 100644
index cf8877f..0000000
--- a/node_modules/rxjs/add/operator/zipAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/zipAll';
diff --git a/node_modules/rxjs/add/operator/zipAll.js b/node_modules/rxjs/add/operator/zipAll.js
deleted file mode 100644
index 70cdb3e..0000000
--- a/node_modules/rxjs/add/operator/zipAll.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-require("rxjs-compat/add/operator/zipAll");
-//# sourceMappingURL=zipAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/add/operator/zipAll.js.map b/node_modules/rxjs/add/operator/zipAll.js.map
deleted file mode 100644
index dcd81ab..0000000
--- a/node_modules/rxjs/add/operator/zipAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zipAll.js","sources":["../../src/add/operator/zipAll.ts"],"names":[],"mappings":";;AAAA,2CAAyC"}
diff --git a/node_modules/rxjs/ajax/index.d.ts b/node_modules/rxjs/ajax/index.d.ts
deleted file mode 100644
index 73cb0cc..0000000
--- a/node_modules/rxjs/ajax/index.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { ajax } from '../internal/observable/dom/ajax';
-export { AjaxRequest, AjaxResponse, AjaxError, AjaxTimeoutError } from '../internal/observable/dom/AjaxObservable';
diff --git a/node_modules/rxjs/ajax/index.js b/node_modules/rxjs/ajax/index.js
deleted file mode 100644
index 93c809f..0000000
--- a/node_modules/rxjs/ajax/index.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ajax_1 = require("../internal/observable/dom/ajax");
-exports.ajax = ajax_1.ajax;
-var AjaxObservable_1 = require("../internal/observable/dom/AjaxObservable");
-exports.AjaxResponse = AjaxObservable_1.AjaxResponse;
-exports.AjaxError = AjaxObservable_1.AjaxError;
-exports.AjaxTimeoutError = AjaxObservable_1.AjaxTimeoutError;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/ajax/index.js.map b/node_modules/rxjs/ajax/index.js.map
deleted file mode 100644
index e3636d1..0000000
--- a/node_modules/rxjs/ajax/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../src/ajax/index.ts"],"names":[],"mappings":";;AAAA,wDAAuD;AAA9C,sBAAA,IAAI,CAAA;AACb,4EAAmH;AAA7F,wCAAA,YAAY,CAAA;AAAE,qCAAA,SAAS,CAAA;AAAE,4CAAA,gBAAgB,CAAA"}
diff --git a/node_modules/rxjs/ajax/package.json b/node_modules/rxjs/ajax/package.json
deleted file mode 100644
index 898cd05..0000000
--- a/node_modules/rxjs/ajax/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "rxjs/ajax",
-  "typings": "./index.d.ts",
-  "main": "./index.js",
-  "module": "../_esm5/ajax/index.js",
-  "es2015": "../_esm2015/ajax/index.js",
-  "sideEffects": false
-}
diff --git a/node_modules/rxjs/bundles/rxjs.umd.js b/node_modules/rxjs/bundles/rxjs.umd.js
deleted file mode 100644
index ada2f49..0000000
--- a/node_modules/rxjs/bundles/rxjs.umd.js
+++ /dev/null
@@ -1,9293 +0,0 @@
-/**
-  @license
-                                 Apache License
-                         Version 2.0, January 2004
-                      http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
-    "License" shall mean the terms and conditions for use, reproduction,
-    and distribution as defined by Sections 1 through 9 of this document.
-
-    "Licensor" shall mean the copyright owner or entity authorized by
-    the copyright owner that is granting the License.
-
-    "Legal Entity" shall mean the union of the acting entity and all
-    other entities that control, are controlled by, or are under common
-    control with that entity. For the purposes of this definition,
-    "control" means (i) the power, direct or indirect, to cause the
-    direction or management of such entity, whether by contract or
-    otherwise, or (ii) ownership of fifty percent (50%) or more of the
-    outstanding shares, or (iii) beneficial ownership of such entity.
-
-    "You" (or "Your") shall mean an individual or Legal Entity
-    exercising permissions granted by this License.
-
-    "Source" form shall mean the preferred form for making modifications,
-    including but not limited to software source code, documentation
-    source, and configuration files.
-
-    "Object" form shall mean any form resulting from mechanical
-    transformation or translation of a Source form, including but
-    not limited to compiled object code, generated documentation,
-    and conversions to other media types.
-
-    "Work" shall mean the work of authorship, whether in Source or
-    Object form, made available under the License, as indicated by a
-    copyright notice that is included in or attached to the work
-    (an example is provided in the Appendix below).
-
-    "Derivative Works" shall mean any work, whether in Source or Object
-    form, that is based on (or derived from) the Work and for which the
-    editorial revisions, annotations, elaborations, or other modifications
-    represent, as a whole, an original work of authorship. For the purposes
-    of this License, Derivative Works shall not include works that remain
-    separable from, or merely link (or bind by name) to the interfaces of,
-    the Work and Derivative Works thereof.
-
-    "Contribution" shall mean any work of authorship, including
-    the original version of the Work and any modifications or additions
-    to that Work or Derivative Works thereof, that is intentionally
-    submitted to Licensor for inclusion in the Work by the copyright owner
-    or by an individual or Legal Entity authorized to submit on behalf of
-    the copyright owner. For the purposes of this definition, "submitted"
-    means any form of electronic, verbal, or written communication sent
-    to the Licensor or its representatives, including but not limited to
-    communication on electronic mailing lists, source code control systems,
-    and issue tracking systems that are managed by, or on behalf of, the
-    Licensor for the purpose of discussing and improving the Work, but
-    excluding communication that is conspicuously marked or otherwise
-    designated in writing by the copyright owner as "Not a Contribution."
-
-    "Contributor" shall mean Licensor and any individual or Legal Entity
-    on behalf of whom a Contribution has been received by Licensor and
-    subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    copyright license to reproduce, prepare Derivative Works of,
-    publicly display, publicly perform, sublicense, and distribute the
-    Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    (except as stated in this section) patent license to make, have made,
-    use, offer to sell, sell, import, and otherwise transfer the Work,
-    where such license applies only to those patent claims licensable
-    by such Contributor that are necessarily infringed by their
-    Contribution(s) alone or by combination of their Contribution(s)
-    with the Work to which such Contribution(s) was submitted. If You
-    institute patent litigation against any entity (including a
-    cross-claim or counterclaim in a lawsuit) alleging that the Work
-    or a Contribution incorporated within the Work constitutes direct
-    or contributory patent infringement, then any patent licenses
-    granted to You under this License for that Work shall terminate
-    as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
-    Work or Derivative Works thereof in any medium, with or without
-    modifications, and in Source or Object form, provided that You
-    meet the following conditions:
-
-    (a) You must give any other recipients of the Work or
-        Derivative Works a copy of this License; and
-
-    (b) You must cause any modified files to carry prominent notices
-        stating that You changed the files; and
-
-    (c) You must retain, in the Source form of any Derivative Works
-        that You distribute, all copyright, patent, trademark, and
-        attribution notices from the Source form of the Work,
-        excluding those notices that do not pertain to any part of
-        the Derivative Works; and
-
-    (d) If the Work includes a "NOTICE" text file as part of its
-        distribution, then any Derivative Works that You distribute must
-        include a readable copy of the attribution notices contained
-        within such NOTICE file, excluding those notices that do not
-        pertain to any part of the Derivative Works, in at least one
-        of the following places: within a NOTICE text file distributed
-        as part of the Derivative Works; within the Source form or
-        documentation, if provided along with the Derivative Works; or,
-        within a display generated by the Derivative Works, if and
-        wherever such third-party notices normally appear. The contents
-        of the NOTICE file are for informational purposes only and
-        do not modify the License. You may add Your own attribution
-        notices within Derivative Works that You distribute, alongside
-        or as an addendum to the NOTICE text from the Work, provided
-        that such additional attribution notices cannot be construed
-        as modifying the License.
-
-    You may add Your own copyright statement to Your modifications and
-    may provide additional or different license terms and conditions
-    for use, reproduction, or distribution of Your modifications, or
-    for any such Derivative Works as a whole, provided Your use,
-    reproduction, and distribution of the Work otherwise complies with
-    the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
-    any Contribution intentionally submitted for inclusion in the Work
-    by You to the Licensor shall be under the terms and conditions of
-    this License, without any additional terms or conditions.
-    Notwithstanding the above, nothing herein shall supersede or modify
-    the terms of any separate license agreement you may have executed
-    with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
-    names, trademarks, service marks, or product names of the Licensor,
-    except as required for reasonable and customary use in describing the
-    origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
-    agreed to in writing, Licensor provides the Work (and each
-    Contributor provides its Contributions) on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-    implied, including, without limitation, any warranties or conditions
-    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-    PARTICULAR PURPOSE. You are solely responsible for determining the
-    appropriateness of using or redistributing the Work and assume any
-    risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
-    whether in tort (including negligence), contract, or otherwise,
-    unless required by applicable law (such as deliberate and grossly
-    negligent acts) or agreed to in writing, shall any Contributor be
-    liable to You for damages, including any direct, indirect, special,
-    incidental, or consequential damages of any character arising as a
-    result of this License or out of the use or inability to use the
-    Work (including but not limited to damages for loss of goodwill,
-    work stoppage, computer failure or malfunction, or any and all
-    other commercial damages or losses), even if such Contributor
-    has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
-    the Work or Derivative Works thereof, You may choose to offer,
-    and charge a fee for, acceptance of support, warranty, indemnity,
-    or other liability obligations and/or rights consistent with this
-    License. However, in accepting such obligations, You may act only
-    on Your own behalf and on Your sole responsibility, not on behalf
-    of any other Contributor, and only if You agree to indemnify,
-    defend, and hold each Contributor harmless for any liability
-    incurred by, or claims asserted against, such Contributor by reason
-    of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
-    To apply the Apache License to your work, attach the following
-    boilerplate notice, with the fields enclosed by brackets "[]"
-    replaced with your own identifying information. (Don't include
-    the brackets!)  The text should be enclosed in the appropriate
-    comment syntax for the file format. We also recommend that a
-    file or class name and description of purpose be included on the
-    same "printed page" as the copyright notice for easier
-    identification within third-party archives.
-
- Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- 
-
- **/
-/**
-  @license
-                                 Apache License
-                         Version 2.0, January 2004
-                      http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
-    "License" shall mean the terms and conditions for use, reproduction,
-    and distribution as defined by Sections 1 through 9 of this document.
-
-    "Licensor" shall mean the copyright owner or entity authorized by
-    the copyright owner that is granting the License.
-
-    "Legal Entity" shall mean the union of the acting entity and all
-    other entities that control, are controlled by, or are under common
-    control with that entity. For the purposes of this definition,
-    "control" means (i) the power, direct or indirect, to cause the
-    direction or management of such entity, whether by contract or
-    otherwise, or (ii) ownership of fifty percent (50%) or more of the
-    outstanding shares, or (iii) beneficial ownership of such entity.
-
-    "You" (or "Your") shall mean an individual or Legal Entity
-    exercising permissions granted by this License.
-
-    "Source" form shall mean the preferred form for making modifications,
-    including but not limited to software source code, documentation
-    source, and configuration files.
-
-    "Object" form shall mean any form resulting from mechanical
-    transformation or translation of a Source form, including but
-    not limited to compiled object code, generated documentation,
-    and conversions to other media types.
-
-    "Work" shall mean the work of authorship, whether in Source or
-    Object form, made available under the License, as indicated by a
-    copyright notice that is included in or attached to the work
-    (an example is provided in the Appendix below).
-
-    "Derivative Works" shall mean any work, whether in Source or Object
-    form, that is based on (or derived from) the Work and for which the
-    editorial revisions, annotations, elaborations, or other modifications
-    represent, as a whole, an original work of authorship. For the purposes
-    of this License, Derivative Works shall not include works that remain
-    separable from, or merely link (or bind by name) to the interfaces of,
-    the Work and Derivative Works thereof.
-
-    "Contribution" shall mean any work of authorship, including
-    the original version of the Work and any modifications or additions
-    to that Work or Derivative Works thereof, that is intentionally
-    submitted to Licensor for inclusion in the Work by the copyright owner
-    or by an individual or Legal Entity authorized to submit on behalf of
-    the copyright owner. For the purposes of this definition, "submitted"
-    means any form of electronic, verbal, or written communication sent
-    to the Licensor or its representatives, including but not limited to
-    communication on electronic mailing lists, source code control systems,
-    and issue tracking systems that are managed by, or on behalf of, the
-    Licensor for the purpose of discussing and improving the Work, but
-    excluding communication that is conspicuously marked or otherwise
-    designated in writing by the copyright owner as "Not a Contribution."
-
-    "Contributor" shall mean Licensor and any individual or Legal Entity
-    on behalf of whom a Contribution has been received by Licensor and
-    subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    copyright license to reproduce, prepare Derivative Works of,
-    publicly display, publicly perform, sublicense, and distribute the
-    Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    (except as stated in this section) patent license to make, have made,
-    use, offer to sell, sell, import, and otherwise transfer the Work,
-    where such license applies only to those patent claims licensable
-    by such Contributor that are necessarily infringed by their
-    Contribution(s) alone or by combination of their Contribution(s)
-    with the Work to which such Contribution(s) was submitted. If You
-    institute patent litigation against any entity (including a
-    cross-claim or counterclaim in a lawsuit) alleging that the Work
-    or a Contribution incorporated within the Work constitutes direct
-    or contributory patent infringement, then any patent licenses
-    granted to You under this License for that Work shall terminate
-    as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
-    Work or Derivative Works thereof in any medium, with or without
-    modifications, and in Source or Object form, provided that You
-    meet the following conditions:
-
-    (a) You must give any other recipients of the Work or
-        Derivative Works a copy of this License; and
-
-    (b) You must cause any modified files to carry prominent notices
-        stating that You changed the files; and
-
-    (c) You must retain, in the Source form of any Derivative Works
-        that You distribute, all copyright, patent, trademark, and
-        attribution notices from the Source form of the Work,
-        excluding those notices that do not pertain to any part of
-        the Derivative Works; and
-
-    (d) If the Work includes a "NOTICE" text file as part of its
-        distribution, then any Derivative Works that You distribute must
-        include a readable copy of the attribution notices contained
-        within such NOTICE file, excluding those notices that do not
-        pertain to any part of the Derivative Works, in at least one
-        of the following places: within a NOTICE text file distributed
-        as part of the Derivative Works; within the Source form or
-        documentation, if provided along with the Derivative Works; or,
-        within a display generated by the Derivative Works, if and
-        wherever such third-party notices normally appear. The contents
-        of the NOTICE file are for informational purposes only and
-        do not modify the License. You may add Your own attribution
-        notices within Derivative Works that You distribute, alongside
-        or as an addendum to the NOTICE text from the Work, provided
-        that such additional attribution notices cannot be construed
-        as modifying the License.
-
-    You may add Your own copyright statement to Your modifications and
-    may provide additional or different license terms and conditions
-    for use, reproduction, or distribution of Your modifications, or
-    for any such Derivative Works as a whole, provided Your use,
-    reproduction, and distribution of the Work otherwise complies with
-    the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
-    any Contribution intentionally submitted for inclusion in the Work
-    by You to the Licensor shall be under the terms and conditions of
-    this License, without any additional terms or conditions.
-    Notwithstanding the above, nothing herein shall supersede or modify
-    the terms of any separate license agreement you may have executed
-    with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
-    names, trademarks, service marks, or product names of the Licensor,
-    except as required for reasonable and customary use in describing the
-    origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
-    agreed to in writing, Licensor provides the Work (and each
-    Contributor provides its Contributions) on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-    implied, including, without limitation, any warranties or conditions
-    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-    PARTICULAR PURPOSE. You are solely responsible for determining the
-    appropriateness of using or redistributing the Work and assume any
-    risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
-    whether in tort (including negligence), contract, or otherwise,
-    unless required by applicable law (such as deliberate and grossly
-    negligent acts) or agreed to in writing, shall any Contributor be
-    liable to You for damages, including any direct, indirect, special,
-    incidental, or consequential damages of any character arising as a
-    result of this License or out of the use or inability to use the
-    Work (including but not limited to damages for loss of goodwill,
-    work stoppage, computer failure or malfunction, or any and all
-    other commercial damages or losses), even if such Contributor
-    has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
-    the Work or Derivative Works thereof, You may choose to offer,
-    and charge a fee for, acceptance of support, warranty, indemnity,
-    or other liability obligations and/or rights consistent with this
-    License. However, in accepting such obligations, You may act only
-    on Your own behalf and on Your sole responsibility, not on behalf
-    of any other Contributor, and only if You agree to indemnify,
-    defend, and hold each Contributor harmless for any liability
-    incurred by, or claims asserted against, such Contributor by reason
-    of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
-    To apply the Apache License to your work, attach the following
-    boilerplate notice, with the fields enclosed by brackets "[]"
-    replaced with your own identifying information. (Don't include
-    the brackets!)  The text should be enclosed in the appropriate
-    comment syntax for the file format. We also recommend that a
-    file or class name and description of purpose be included on the
-    same "printed page" as the copyright notice for easier
-    identification within third-party archives.
-
- Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- 
-
- **/
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
-    typeof define === 'function' && define.amd ? define('rxjs', ['exports'], factory) :
-    (factory((global.rxjs = {})));
-}(this, (function (exports) { 'use strict';
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-
-    function isFunction(x) {
-        return typeof x === 'function';
-    }
-
-    var _enable_super_gross_mode_that_will_cause_bad_things = false;
-    var config = {
-        Promise: undefined,
-        set useDeprecatedSynchronousErrorHandling(value) {
-            if (value) {
-                var error = new Error();
-                console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack);
-            }
-            else if (_enable_super_gross_mode_that_will_cause_bad_things) {
-                console.log('RxJS: Back to a better error behavior. Thank you. <3');
-            }
-            _enable_super_gross_mode_that_will_cause_bad_things = value;
-        },
-        get useDeprecatedSynchronousErrorHandling() {
-            return _enable_super_gross_mode_that_will_cause_bad_things;
-        },
-    };
-
-    function hostReportError(err) {
-        setTimeout(function () { throw err; }, 0);
-    }
-
-    var empty = {
-        closed: true,
-        next: function (value) { },
-        error: function (err) {
-            if (config.useDeprecatedSynchronousErrorHandling) {
-                throw err;
-            }
-            else {
-                hostReportError(err);
-            }
-        },
-        complete: function () { }
-    };
-
-    var isArray = (function () { return Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); })();
-
-    function isObject(x) {
-        return x !== null && typeof x === 'object';
-    }
-
-    var UnsubscriptionErrorImpl = (function () {
-        function UnsubscriptionErrorImpl(errors) {
-            Error.call(this);
-            this.message = errors ?
-                errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n  ') : '';
-            this.name = 'UnsubscriptionError';
-            this.errors = errors;
-            return this;
-        }
-        UnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);
-        return UnsubscriptionErrorImpl;
-    })();
-    var UnsubscriptionError = UnsubscriptionErrorImpl;
-
-    var Subscription = (function () {
-        function Subscription(unsubscribe) {
-            this.closed = false;
-            this._parentOrParents = null;
-            this._subscriptions = null;
-            if (unsubscribe) {
-                this._unsubscribe = unsubscribe;
-            }
-        }
-        Subscription.prototype.unsubscribe = function () {
-            var errors;
-            if (this.closed) {
-                return;
-            }
-            var _a = this, _parentOrParents = _a._parentOrParents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;
-            this.closed = true;
-            this._parentOrParents = null;
-            this._subscriptions = null;
-            if (_parentOrParents instanceof Subscription) {
-                _parentOrParents.remove(this);
-            }
-            else if (_parentOrParents !== null) {
-                for (var index = 0; index < _parentOrParents.length; ++index) {
-                    var parent_1 = _parentOrParents[index];
-                    parent_1.remove(this);
-                }
-            }
-            if (isFunction(_unsubscribe)) {
-                try {
-                    _unsubscribe.call(this);
-                }
-                catch (e) {
-                    errors = e instanceof UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];
-                }
-            }
-            if (isArray(_subscriptions)) {
-                var index = -1;
-                var len = _subscriptions.length;
-                while (++index < len) {
-                    var sub = _subscriptions[index];
-                    if (isObject(sub)) {
-                        try {
-                            sub.unsubscribe();
-                        }
-                        catch (e) {
-                            errors = errors || [];
-                            if (e instanceof UnsubscriptionError) {
-                                errors = errors.concat(flattenUnsubscriptionErrors(e.errors));
-                            }
-                            else {
-                                errors.push(e);
-                            }
-                        }
-                    }
-                }
-            }
-            if (errors) {
-                throw new UnsubscriptionError(errors);
-            }
-        };
-        Subscription.prototype.add = function (teardown) {
-            var subscription = teardown;
-            if (!teardown) {
-                return Subscription.EMPTY;
-            }
-            switch (typeof teardown) {
-                case 'function':
-                    subscription = new Subscription(teardown);
-                case 'object':
-                    if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {
-                        return subscription;
-                    }
-                    else if (this.closed) {
-                        subscription.unsubscribe();
-                        return subscription;
-                    }
-                    else if (!(subscription instanceof Subscription)) {
-                        var tmp = subscription;
-                        subscription = new Subscription();
-                        subscription._subscriptions = [tmp];
-                    }
-                    break;
-                default: {
-                    throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
-                }
-            }
-            var _parentOrParents = subscription._parentOrParents;
-            if (_parentOrParents === null) {
-                subscription._parentOrParents = this;
-            }
-            else if (_parentOrParents instanceof Subscription) {
-                if (_parentOrParents === this) {
-                    return subscription;
-                }
-                subscription._parentOrParents = [_parentOrParents, this];
-            }
-            else if (_parentOrParents.indexOf(this) === -1) {
-                _parentOrParents.push(this);
-            }
-            else {
-                return subscription;
-            }
-            var subscriptions = this._subscriptions;
-            if (subscriptions === null) {
-                this._subscriptions = [subscription];
-            }
-            else {
-                subscriptions.push(subscription);
-            }
-            return subscription;
-        };
-        Subscription.prototype.remove = function (subscription) {
-            var subscriptions = this._subscriptions;
-            if (subscriptions) {
-                var subscriptionIndex = subscriptions.indexOf(subscription);
-                if (subscriptionIndex !== -1) {
-                    subscriptions.splice(subscriptionIndex, 1);
-                }
-            }
-        };
-        Subscription.EMPTY = (function (empty) {
-            empty.closed = true;
-            return empty;
-        }(new Subscription()));
-        return Subscription;
-    }());
-    function flattenUnsubscriptionErrors(errors) {
-        return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError) ? err.errors : err); }, []);
-    }
-
-    var rxSubscriber = (function () {
-        return typeof Symbol === 'function'
-            ? Symbol('rxSubscriber')
-            : '@@rxSubscriber_' + Math.random();
-    })();
-
-    var Subscriber = (function (_super) {
-        __extends(Subscriber, _super);
-        function Subscriber(destinationOrNext, error, complete) {
-            var _this = _super.call(this) || this;
-            _this.syncErrorValue = null;
-            _this.syncErrorThrown = false;
-            _this.syncErrorThrowable = false;
-            _this.isStopped = false;
-            switch (arguments.length) {
-                case 0:
-                    _this.destination = empty;
-                    break;
-                case 1:
-                    if (!destinationOrNext) {
-                        _this.destination = empty;
-                        break;
-                    }
-                    if (typeof destinationOrNext === 'object') {
-                        if (destinationOrNext instanceof Subscriber) {
-                            _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;
-                            _this.destination = destinationOrNext;
-                            destinationOrNext.add(_this);
-                        }
-                        else {
-                            _this.syncErrorThrowable = true;
-                            _this.destination = new SafeSubscriber(_this, destinationOrNext);
-                        }
-                        break;
-                    }
-                default:
-                    _this.syncErrorThrowable = true;
-                    _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete);
-                    break;
-            }
-            return _this;
-        }
-        Subscriber.prototype[rxSubscriber] = function () { return this; };
-        Subscriber.create = function (next, error, complete) {
-            var subscriber = new Subscriber(next, error, complete);
-            subscriber.syncErrorThrowable = false;
-            return subscriber;
-        };
-        Subscriber.prototype.next = function (value) {
-            if (!this.isStopped) {
-                this._next(value);
-            }
-        };
-        Subscriber.prototype.error = function (err) {
-            if (!this.isStopped) {
-                this.isStopped = true;
-                this._error(err);
-            }
-        };
-        Subscriber.prototype.complete = function () {
-            if (!this.isStopped) {
-                this.isStopped = true;
-                this._complete();
-            }
-        };
-        Subscriber.prototype.unsubscribe = function () {
-            if (this.closed) {
-                return;
-            }
-            this.isStopped = true;
-            _super.prototype.unsubscribe.call(this);
-        };
-        Subscriber.prototype._next = function (value) {
-            this.destination.next(value);
-        };
-        Subscriber.prototype._error = function (err) {
-            this.destination.error(err);
-            this.unsubscribe();
-        };
-        Subscriber.prototype._complete = function () {
-            this.destination.complete();
-            this.unsubscribe();
-        };
-        Subscriber.prototype._unsubscribeAndRecycle = function () {
-            var _parentOrParents = this._parentOrParents;
-            this._parentOrParents = null;
-            this.unsubscribe();
-            this.closed = false;
-            this.isStopped = false;
-            this._parentOrParents = _parentOrParents;
-            return this;
-        };
-        return Subscriber;
-    }(Subscription));
-    var SafeSubscriber = (function (_super) {
-        __extends(SafeSubscriber, _super);
-        function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) {
-            var _this = _super.call(this) || this;
-            _this._parentSubscriber = _parentSubscriber;
-            var next;
-            var context = _this;
-            if (isFunction(observerOrNext)) {
-                next = observerOrNext;
-            }
-            else if (observerOrNext) {
-                next = observerOrNext.next;
-                error = observerOrNext.error;
-                complete = observerOrNext.complete;
-                if (observerOrNext !== empty) {
-                    context = Object.create(observerOrNext);
-                    if (isFunction(context.unsubscribe)) {
-                        _this.add(context.unsubscribe.bind(context));
-                    }
-                    context.unsubscribe = _this.unsubscribe.bind(_this);
-                }
-            }
-            _this._context = context;
-            _this._next = next;
-            _this._error = error;
-            _this._complete = complete;
-            return _this;
-        }
-        SafeSubscriber.prototype.next = function (value) {
-            if (!this.isStopped && this._next) {
-                var _parentSubscriber = this._parentSubscriber;
-                if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(this._next, value);
-                }
-                else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
-                    this.unsubscribe();
-                }
-            }
-        };
-        SafeSubscriber.prototype.error = function (err) {
-            if (!this.isStopped) {
-                var _parentSubscriber = this._parentSubscriber;
-                var useDeprecatedSynchronousErrorHandling = config.useDeprecatedSynchronousErrorHandling;
-                if (this._error) {
-                    if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                        this.__tryOrUnsub(this._error, err);
-                        this.unsubscribe();
-                    }
-                    else {
-                        this.__tryOrSetError(_parentSubscriber, this._error, err);
-                        this.unsubscribe();
-                    }
-                }
-                else if (!_parentSubscriber.syncErrorThrowable) {
-                    this.unsubscribe();
-                    if (useDeprecatedSynchronousErrorHandling) {
-                        throw err;
-                    }
-                    hostReportError(err);
-                }
-                else {
-                    if (useDeprecatedSynchronousErrorHandling) {
-                        _parentSubscriber.syncErrorValue = err;
-                        _parentSubscriber.syncErrorThrown = true;
-                    }
-                    else {
-                        hostReportError(err);
-                    }
-                    this.unsubscribe();
-                }
-            }
-        };
-        SafeSubscriber.prototype.complete = function () {
-            var _this = this;
-            if (!this.isStopped) {
-                var _parentSubscriber = this._parentSubscriber;
-                if (this._complete) {
-                    var wrappedComplete = function () { return _this._complete.call(_this._context); };
-                    if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                        this.__tryOrUnsub(wrappedComplete);
-                        this.unsubscribe();
-                    }
-                    else {
-                        this.__tryOrSetError(_parentSubscriber, wrappedComplete);
-                        this.unsubscribe();
-                    }
-                }
-                else {
-                    this.unsubscribe();
-                }
-            }
-        };
-        SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
-            try {
-                fn.call(this._context, value);
-            }
-            catch (err) {
-                this.unsubscribe();
-                if (config.useDeprecatedSynchronousErrorHandling) {
-                    throw err;
-                }
-                else {
-                    hostReportError(err);
-                }
-            }
-        };
-        SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
-            if (!config.useDeprecatedSynchronousErrorHandling) {
-                throw new Error('bad call');
-            }
-            try {
-                fn.call(this._context, value);
-            }
-            catch (err) {
-                if (config.useDeprecatedSynchronousErrorHandling) {
-                    parent.syncErrorValue = err;
-                    parent.syncErrorThrown = true;
-                    return true;
-                }
-                else {
-                    hostReportError(err);
-                    return true;
-                }
-            }
-            return false;
-        };
-        SafeSubscriber.prototype._unsubscribe = function () {
-            var _parentSubscriber = this._parentSubscriber;
-            this._context = null;
-            this._parentSubscriber = null;
-            _parentSubscriber.unsubscribe();
-        };
-        return SafeSubscriber;
-    }(Subscriber));
-
-    function canReportError(observer) {
-        while (observer) {
-            var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped;
-            if (closed_1 || isStopped) {
-                return false;
-            }
-            else if (destination && destination instanceof Subscriber) {
-                observer = destination;
-            }
-            else {
-                observer = null;
-            }
-        }
-        return true;
-    }
-
-    function toSubscriber(nextOrObserver, error, complete) {
-        if (nextOrObserver) {
-            if (nextOrObserver instanceof Subscriber) {
-                return nextOrObserver;
-            }
-            if (nextOrObserver[rxSubscriber]) {
-                return nextOrObserver[rxSubscriber]();
-            }
-        }
-        if (!nextOrObserver && !error && !complete) {
-            return new Subscriber(empty);
-        }
-        return new Subscriber(nextOrObserver, error, complete);
-    }
-
-    var observable = (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })();
-
-    function noop() { }
-
-    function pipe() {
-        var fns = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            fns[_i] = arguments[_i];
-        }
-        return pipeFromArray(fns);
-    }
-    function pipeFromArray(fns) {
-        if (!fns) {
-            return noop;
-        }
-        if (fns.length === 1) {
-            return fns[0];
-        }
-        return function piped(input) {
-            return fns.reduce(function (prev, fn) { return fn(prev); }, input);
-        };
-    }
-
-    var Observable = (function () {
-        function Observable(subscribe) {
-            this._isScalar = false;
-            if (subscribe) {
-                this._subscribe = subscribe;
-            }
-        }
-        Observable.prototype.lift = function (operator) {
-            var observable$$1 = new Observable();
-            observable$$1.source = this;
-            observable$$1.operator = operator;
-            return observable$$1;
-        };
-        Observable.prototype.subscribe = function (observerOrNext, error, complete) {
-            var operator = this.operator;
-            var sink = toSubscriber(observerOrNext, error, complete);
-            if (operator) {
-                sink.add(operator.call(sink, this.source));
-            }
-            else {
-                sink.add(this.source || (config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?
-                    this._subscribe(sink) :
-                    this._trySubscribe(sink));
-            }
-            if (config.useDeprecatedSynchronousErrorHandling) {
-                if (sink.syncErrorThrowable) {
-                    sink.syncErrorThrowable = false;
-                    if (sink.syncErrorThrown) {
-                        throw sink.syncErrorValue;
-                    }
-                }
-            }
-            return sink;
-        };
-        Observable.prototype._trySubscribe = function (sink) {
-            try {
-                return this._subscribe(sink);
-            }
-            catch (err) {
-                if (config.useDeprecatedSynchronousErrorHandling) {
-                    sink.syncErrorThrown = true;
-                    sink.syncErrorValue = err;
-                }
-                if (canReportError(sink)) {
-                    sink.error(err);
-                }
-                else {
-                    console.warn(err);
-                }
-            }
-        };
-        Observable.prototype.forEach = function (next, promiseCtor) {
-            var _this = this;
-            promiseCtor = getPromiseCtor(promiseCtor);
-            return new promiseCtor(function (resolve, reject) {
-                var subscription;
-                subscription = _this.subscribe(function (value) {
-                    try {
-                        next(value);
-                    }
-                    catch (err) {
-                        reject(err);
-                        if (subscription) {
-                            subscription.unsubscribe();
-                        }
-                    }
-                }, reject, resolve);
-            });
-        };
-        Observable.prototype._subscribe = function (subscriber) {
-            var source = this.source;
-            return source && source.subscribe(subscriber);
-        };
-        Observable.prototype[observable] = function () {
-            return this;
-        };
-        Observable.prototype.pipe = function () {
-            var operations = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                operations[_i] = arguments[_i];
-            }
-            if (operations.length === 0) {
-                return this;
-            }
-            return pipeFromArray(operations)(this);
-        };
-        Observable.prototype.toPromise = function (promiseCtor) {
-            var _this = this;
-            promiseCtor = getPromiseCtor(promiseCtor);
-            return new promiseCtor(function (resolve, reject) {
-                var value;
-                _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });
-            });
-        };
-        Observable.create = function (subscribe) {
-            return new Observable(subscribe);
-        };
-        return Observable;
-    }());
-    function getPromiseCtor(promiseCtor) {
-        if (!promiseCtor) {
-            promiseCtor = config.Promise || Promise;
-        }
-        if (!promiseCtor) {
-            throw new Error('no Promise impl found');
-        }
-        return promiseCtor;
-    }
-
-    var ObjectUnsubscribedErrorImpl = (function () {
-        function ObjectUnsubscribedErrorImpl() {
-            Error.call(this);
-            this.message = 'object unsubscribed';
-            this.name = 'ObjectUnsubscribedError';
-            return this;
-        }
-        ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);
-        return ObjectUnsubscribedErrorImpl;
-    })();
-    var ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;
-
-    var SubjectSubscription = (function (_super) {
-        __extends(SubjectSubscription, _super);
-        function SubjectSubscription(subject, subscriber) {
-            var _this = _super.call(this) || this;
-            _this.subject = subject;
-            _this.subscriber = subscriber;
-            _this.closed = false;
-            return _this;
-        }
-        SubjectSubscription.prototype.unsubscribe = function () {
-            if (this.closed) {
-                return;
-            }
-            this.closed = true;
-            var subject = this.subject;
-            var observers = subject.observers;
-            this.subject = null;
-            if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
-                return;
-            }
-            var subscriberIndex = observers.indexOf(this.subscriber);
-            if (subscriberIndex !== -1) {
-                observers.splice(subscriberIndex, 1);
-            }
-        };
-        return SubjectSubscription;
-    }(Subscription));
-
-    var SubjectSubscriber = (function (_super) {
-        __extends(SubjectSubscriber, _super);
-        function SubjectSubscriber(destination) {
-            var _this = _super.call(this, destination) || this;
-            _this.destination = destination;
-            return _this;
-        }
-        return SubjectSubscriber;
-    }(Subscriber));
-    var Subject = (function (_super) {
-        __extends(Subject, _super);
-        function Subject() {
-            var _this = _super.call(this) || this;
-            _this.observers = [];
-            _this.closed = false;
-            _this.isStopped = false;
-            _this.hasError = false;
-            _this.thrownError = null;
-            return _this;
-        }
-        Subject.prototype[rxSubscriber] = function () {
-            return new SubjectSubscriber(this);
-        };
-        Subject.prototype.lift = function (operator) {
-            var subject = new AnonymousSubject(this, this);
-            subject.operator = operator;
-            return subject;
-        };
-        Subject.prototype.next = function (value) {
-            if (this.closed) {
-                throw new ObjectUnsubscribedError();
-            }
-            if (!this.isStopped) {
-                var observers = this.observers;
-                var len = observers.length;
-                var copy = observers.slice();
-                for (var i = 0; i < len; i++) {
-                    copy[i].next(value);
-                }
-            }
-        };
-        Subject.prototype.error = function (err) {
-            if (this.closed) {
-                throw new ObjectUnsubscribedError();
-            }
-            this.hasError = true;
-            this.thrownError = err;
-            this.isStopped = true;
-            var observers = this.observers;
-            var len = observers.length;
-            var copy = observers.slice();
-            for (var i = 0; i < len; i++) {
-                copy[i].error(err);
-            }
-            this.observers.length = 0;
-        };
-        Subject.prototype.complete = function () {
-            if (this.closed) {
-                throw new ObjectUnsubscribedError();
-            }
-            this.isStopped = true;
-            var observers = this.observers;
-            var len = observers.length;
-            var copy = observers.slice();
-            for (var i = 0; i < len; i++) {
-                copy[i].complete();
-            }
-            this.observers.length = 0;
-        };
-        Subject.prototype.unsubscribe = function () {
-            this.isStopped = true;
-            this.closed = true;
-            this.observers = null;
-        };
-        Subject.prototype._trySubscribe = function (subscriber) {
-            if (this.closed) {
-                throw new ObjectUnsubscribedError();
-            }
-            else {
-                return _super.prototype._trySubscribe.call(this, subscriber);
-            }
-        };
-        Subject.prototype._subscribe = function (subscriber) {
-            if (this.closed) {
-                throw new ObjectUnsubscribedError();
-            }
-            else if (this.hasError) {
-                subscriber.error(this.thrownError);
-                return Subscription.EMPTY;
-            }
-            else if (this.isStopped) {
-                subscriber.complete();
-                return Subscription.EMPTY;
-            }
-            else {
-                this.observers.push(subscriber);
-                return new SubjectSubscription(this, subscriber);
-            }
-        };
-        Subject.prototype.asObservable = function () {
-            var observable = new Observable();
-            observable.source = this;
-            return observable;
-        };
-        Subject.create = function (destination, source) {
-            return new AnonymousSubject(destination, source);
-        };
-        return Subject;
-    }(Observable));
-    var AnonymousSubject = (function (_super) {
-        __extends(AnonymousSubject, _super);
-        function AnonymousSubject(destination, source) {
-            var _this = _super.call(this) || this;
-            _this.destination = destination;
-            _this.source = source;
-            return _this;
-        }
-        AnonymousSubject.prototype.next = function (value) {
-            var destination = this.destination;
-            if (destination && destination.next) {
-                destination.next(value);
-            }
-        };
-        AnonymousSubject.prototype.error = function (err) {
-            var destination = this.destination;
-            if (destination && destination.error) {
-                this.destination.error(err);
-            }
-        };
-        AnonymousSubject.prototype.complete = function () {
-            var destination = this.destination;
-            if (destination && destination.complete) {
-                this.destination.complete();
-            }
-        };
-        AnonymousSubject.prototype._subscribe = function (subscriber) {
-            var source = this.source;
-            if (source) {
-                return this.source.subscribe(subscriber);
-            }
-            else {
-                return Subscription.EMPTY;
-            }
-        };
-        return AnonymousSubject;
-    }(Subject));
-
-    function refCount() {
-        return function refCountOperatorFunction(source) {
-            return source.lift(new RefCountOperator(source));
-        };
-    }
-    var RefCountOperator = (function () {
-        function RefCountOperator(connectable) {
-            this.connectable = connectable;
-        }
-        RefCountOperator.prototype.call = function (subscriber, source) {
-            var connectable = this.connectable;
-            connectable._refCount++;
-            var refCounter = new RefCountSubscriber(subscriber, connectable);
-            var subscription = source.subscribe(refCounter);
-            if (!refCounter.closed) {
-                refCounter.connection = connectable.connect();
-            }
-            return subscription;
-        };
-        return RefCountOperator;
-    }());
-    var RefCountSubscriber = (function (_super) {
-        __extends(RefCountSubscriber, _super);
-        function RefCountSubscriber(destination, connectable) {
-            var _this = _super.call(this, destination) || this;
-            _this.connectable = connectable;
-            return _this;
-        }
-        RefCountSubscriber.prototype._unsubscribe = function () {
-            var connectable = this.connectable;
-            if (!connectable) {
-                this.connection = null;
-                return;
-            }
-            this.connectable = null;
-            var refCount = connectable._refCount;
-            if (refCount <= 0) {
-                this.connection = null;
-                return;
-            }
-            connectable._refCount = refCount - 1;
-            if (refCount > 1) {
-                this.connection = null;
-                return;
-            }
-            var connection = this.connection;
-            var sharedConnection = connectable._connection;
-            this.connection = null;
-            if (sharedConnection && (!connection || sharedConnection === connection)) {
-                sharedConnection.unsubscribe();
-            }
-        };
-        return RefCountSubscriber;
-    }(Subscriber));
-
-    var ConnectableObservable = (function (_super) {
-        __extends(ConnectableObservable, _super);
-        function ConnectableObservable(source, subjectFactory) {
-            var _this = _super.call(this) || this;
-            _this.source = source;
-            _this.subjectFactory = subjectFactory;
-            _this._refCount = 0;
-            _this._isComplete = false;
-            return _this;
-        }
-        ConnectableObservable.prototype._subscribe = function (subscriber) {
-            return this.getSubject().subscribe(subscriber);
-        };
-        ConnectableObservable.prototype.getSubject = function () {
-            var subject = this._subject;
-            if (!subject || subject.isStopped) {
-                this._subject = this.subjectFactory();
-            }
-            return this._subject;
-        };
-        ConnectableObservable.prototype.connect = function () {
-            var connection = this._connection;
-            if (!connection) {
-                this._isComplete = false;
-                connection = this._connection = new Subscription();
-                connection.add(this.source
-                    .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
-                if (connection.closed) {
-                    this._connection = null;
-                    connection = Subscription.EMPTY;
-                }
-            }
-            return connection;
-        };
-        ConnectableObservable.prototype.refCount = function () {
-            return refCount()(this);
-        };
-        return ConnectableObservable;
-    }(Observable));
-    var connectableObservableDescriptor = (function () {
-        var connectableProto = ConnectableObservable.prototype;
-        return {
-            operator: { value: null },
-            _refCount: { value: 0, writable: true },
-            _subject: { value: null, writable: true },
-            _connection: { value: null, writable: true },
-            _subscribe: { value: connectableProto._subscribe },
-            _isComplete: { value: connectableProto._isComplete, writable: true },
-            getSubject: { value: connectableProto.getSubject },
-            connect: { value: connectableProto.connect },
-            refCount: { value: connectableProto.refCount }
-        };
-    })();
-    var ConnectableSubscriber = (function (_super) {
-        __extends(ConnectableSubscriber, _super);
-        function ConnectableSubscriber(destination, connectable) {
-            var _this = _super.call(this, destination) || this;
-            _this.connectable = connectable;
-            return _this;
-        }
-        ConnectableSubscriber.prototype._error = function (err) {
-            this._unsubscribe();
-            _super.prototype._error.call(this, err);
-        };
-        ConnectableSubscriber.prototype._complete = function () {
-            this.connectable._isComplete = true;
-            this._unsubscribe();
-            _super.prototype._complete.call(this);
-        };
-        ConnectableSubscriber.prototype._unsubscribe = function () {
-            var connectable = this.connectable;
-            if (connectable) {
-                this.connectable = null;
-                var connection = connectable._connection;
-                connectable._refCount = 0;
-                connectable._subject = null;
-                connectable._connection = null;
-                if (connection) {
-                    connection.unsubscribe();
-                }
-            }
-        };
-        return ConnectableSubscriber;
-    }(SubjectSubscriber));
-    var RefCountSubscriber$1 = (function (_super) {
-        __extends(RefCountSubscriber, _super);
-        function RefCountSubscriber(destination, connectable) {
-            var _this = _super.call(this, destination) || this;
-            _this.connectable = connectable;
-            return _this;
-        }
-        RefCountSubscriber.prototype._unsubscribe = function () {
-            var connectable = this.connectable;
-            if (!connectable) {
-                this.connection = null;
-                return;
-            }
-            this.connectable = null;
-            var refCount$$1 = connectable._refCount;
-            if (refCount$$1 <= 0) {
-                this.connection = null;
-                return;
-            }
-            connectable._refCount = refCount$$1 - 1;
-            if (refCount$$1 > 1) {
-                this.connection = null;
-                return;
-            }
-            var connection = this.connection;
-            var sharedConnection = connectable._connection;
-            this.connection = null;
-            if (sharedConnection && (!connection || sharedConnection === connection)) {
-                sharedConnection.unsubscribe();
-            }
-        };
-        return RefCountSubscriber;
-    }(Subscriber));
-
-    function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {
-        return function (source) {
-            return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));
-        };
-    }
-    var GroupByOperator = (function () {
-        function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) {
-            this.keySelector = keySelector;
-            this.elementSelector = elementSelector;
-            this.durationSelector = durationSelector;
-            this.subjectSelector = subjectSelector;
-        }
-        GroupByOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));
-        };
-        return GroupByOperator;
-    }());
-    var GroupBySubscriber = (function (_super) {
-        __extends(GroupBySubscriber, _super);
-        function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) {
-            var _this = _super.call(this, destination) || this;
-            _this.keySelector = keySelector;
-            _this.elementSelector = elementSelector;
-            _this.durationSelector = durationSelector;
-            _this.subjectSelector = subjectSelector;
-            _this.groups = null;
-            _this.attemptedToUnsubscribe = false;
-            _this.count = 0;
-            return _this;
-        }
-        GroupBySubscriber.prototype._next = function (value) {
-            var key;
-            try {
-                key = this.keySelector(value);
-            }
-            catch (err) {
-                this.error(err);
-                return;
-            }
-            this._group(value, key);
-        };
-        GroupBySubscriber.prototype._group = function (value, key) {
-            var groups = this.groups;
-            if (!groups) {
-                groups = this.groups = new Map();
-            }
-            var group = groups.get(key);
-            var element;
-            if (this.elementSelector) {
-                try {
-                    element = this.elementSelector(value);
-                }
-                catch (err) {
-                    this.error(err);
-                }
-            }
-            else {
-                element = value;
-            }
-            if (!group) {
-                group = (this.subjectSelector ? this.subjectSelector() : new Subject());
-                groups.set(key, group);
-                var groupedObservable = new GroupedObservable(key, group, this);
-                this.destination.next(groupedObservable);
-                if (this.durationSelector) {
-                    var duration = void 0;
-                    try {
-                        duration = this.durationSelector(new GroupedObservable(key, group));
-                    }
-                    catch (err) {
-                        this.error(err);
-                        return;
-                    }
-                    this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));
-                }
-            }
-            if (!group.closed) {
-                group.next(element);
-            }
-        };
-        GroupBySubscriber.prototype._error = function (err) {
-            var groups = this.groups;
-            if (groups) {
-                groups.forEach(function (group, key) {
-                    group.error(err);
-                });
-                groups.clear();
-            }
-            this.destination.error(err);
-        };
-        GroupBySubscriber.prototype._complete = function () {
-            var groups = this.groups;
-            if (groups) {
-                groups.forEach(function (group, key) {
-                    group.complete();
-                });
-                groups.clear();
-            }
-            this.destination.complete();
-        };
-        GroupBySubscriber.prototype.removeGroup = function (key) {
-            this.groups.delete(key);
-        };
-        GroupBySubscriber.prototype.unsubscribe = function () {
-            if (!this.closed) {
-                this.attemptedToUnsubscribe = true;
-                if (this.count === 0) {
-                    _super.prototype.unsubscribe.call(this);
-                }
-            }
-        };
-        return GroupBySubscriber;
-    }(Subscriber));
-    var GroupDurationSubscriber = (function (_super) {
-        __extends(GroupDurationSubscriber, _super);
-        function GroupDurationSubscriber(key, group, parent) {
-            var _this = _super.call(this, group) || this;
-            _this.key = key;
-            _this.group = group;
-            _this.parent = parent;
-            return _this;
-        }
-        GroupDurationSubscriber.prototype._next = function (value) {
-            this.complete();
-        };
-        GroupDurationSubscriber.prototype._unsubscribe = function () {
-            var _a = this, parent = _a.parent, key = _a.key;
-            this.key = this.parent = null;
-            if (parent) {
-                parent.removeGroup(key);
-            }
-        };
-        return GroupDurationSubscriber;
-    }(Subscriber));
-    var GroupedObservable = (function (_super) {
-        __extends(GroupedObservable, _super);
-        function GroupedObservable(key, groupSubject, refCountSubscription) {
-            var _this = _super.call(this) || this;
-            _this.key = key;
-            _this.groupSubject = groupSubject;
-            _this.refCountSubscription = refCountSubscription;
-            return _this;
-        }
-        GroupedObservable.prototype._subscribe = function (subscriber) {
-            var subscription = new Subscription();
-            var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject;
-            if (refCountSubscription && !refCountSubscription.closed) {
-                subscription.add(new InnerRefCountSubscription(refCountSubscription));
-            }
-            subscription.add(groupSubject.subscribe(subscriber));
-            return subscription;
-        };
-        return GroupedObservable;
-    }(Observable));
-    var InnerRefCountSubscription = (function (_super) {
-        __extends(InnerRefCountSubscription, _super);
-        function InnerRefCountSubscription(parent) {
-            var _this = _super.call(this) || this;
-            _this.parent = parent;
-            parent.count++;
-            return _this;
-        }
-        InnerRefCountSubscription.prototype.unsubscribe = function () {
-            var parent = this.parent;
-            if (!parent.closed && !this.closed) {
-                _super.prototype.unsubscribe.call(this);
-                parent.count -= 1;
-                if (parent.count === 0 && parent.attemptedToUnsubscribe) {
-                    parent.unsubscribe();
-                }
-            }
-        };
-        return InnerRefCountSubscription;
-    }(Subscription));
-
-    var BehaviorSubject = (function (_super) {
-        __extends(BehaviorSubject, _super);
-        function BehaviorSubject(_value) {
-            var _this = _super.call(this) || this;
-            _this._value = _value;
-            return _this;
-        }
-        Object.defineProperty(BehaviorSubject.prototype, "value", {
-            get: function () {
-                return this.getValue();
-            },
-            enumerable: true,
-            configurable: true
-        });
-        BehaviorSubject.prototype._subscribe = function (subscriber) {
-            var subscription = _super.prototype._subscribe.call(this, subscriber);
-            if (subscription && !subscription.closed) {
-                subscriber.next(this._value);
-            }
-            return subscription;
-        };
-        BehaviorSubject.prototype.getValue = function () {
-            if (this.hasError) {
-                throw this.thrownError;
-            }
-            else if (this.closed) {
-                throw new ObjectUnsubscribedError();
-            }
-            else {
-                return this._value;
-            }
-        };
-        BehaviorSubject.prototype.next = function (value) {
-            _super.prototype.next.call(this, this._value = value);
-        };
-        return BehaviorSubject;
-    }(Subject));
-
-    var Action = (function (_super) {
-        __extends(Action, _super);
-        function Action(scheduler, work) {
-            return _super.call(this) || this;
-        }
-        Action.prototype.schedule = function (state, delay) {
-            if (delay === void 0) { delay = 0; }
-            return this;
-        };
-        return Action;
-    }(Subscription));
-
-    var AsyncAction = (function (_super) {
-        __extends(AsyncAction, _super);
-        function AsyncAction(scheduler, work) {
-            var _this = _super.call(this, scheduler, work) || this;
-            _this.scheduler = scheduler;
-            _this.work = work;
-            _this.pending = false;
-            return _this;
-        }
-        AsyncAction.prototype.schedule = function (state, delay) {
-            if (delay === void 0) { delay = 0; }
-            if (this.closed) {
-                return this;
-            }
-            this.state = state;
-            var id = this.id;
-            var scheduler = this.scheduler;
-            if (id != null) {
-                this.id = this.recycleAsyncId(scheduler, id, delay);
-            }
-            this.pending = true;
-            this.delay = delay;
-            this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
-            return this;
-        };
-        AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-            if (delay === void 0) { delay = 0; }
-            return setInterval(scheduler.flush.bind(scheduler, this), delay);
-        };
-        AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-            if (delay === void 0) { delay = 0; }
-            if (delay !== null && this.delay === delay && this.pending === false) {
-                return id;
-            }
-            clearInterval(id);
-            return undefined;
-        };
-        AsyncAction.prototype.execute = function (state, delay) {
-            if (this.closed) {
-                return new Error('executing a cancelled action');
-            }
-            this.pending = false;
-            var error = this._execute(state, delay);
-            if (error) {
-                return error;
-            }
-            else if (this.pending === false && this.id != null) {
-                this.id = this.recycleAsyncId(this.scheduler, this.id, null);
-            }
-        };
-        AsyncAction.prototype._execute = function (state, delay) {
-            var errored = false;
-            var errorValue = undefined;
-            try {
-                this.work(state);
-            }
-            catch (e) {
-                errored = true;
-                errorValue = !!e && e || new Error(e);
-            }
-            if (errored) {
-                this.unsubscribe();
-                return errorValue;
-            }
-        };
-        AsyncAction.prototype._unsubscribe = function () {
-            var id = this.id;
-            var scheduler = this.scheduler;
-            var actions = scheduler.actions;
-            var index = actions.indexOf(this);
-            this.work = null;
-            this.state = null;
-            this.pending = false;
-            this.scheduler = null;
-            if (index !== -1) {
-                actions.splice(index, 1);
-            }
-            if (id != null) {
-                this.id = this.recycleAsyncId(scheduler, id, null);
-            }
-            this.delay = null;
-        };
-        return AsyncAction;
-    }(Action));
-
-    var QueueAction = (function (_super) {
-        __extends(QueueAction, _super);
-        function QueueAction(scheduler, work) {
-            var _this = _super.call(this, scheduler, work) || this;
-            _this.scheduler = scheduler;
-            _this.work = work;
-            return _this;
-        }
-        QueueAction.prototype.schedule = function (state, delay) {
-            if (delay === void 0) { delay = 0; }
-            if (delay > 0) {
-                return _super.prototype.schedule.call(this, state, delay);
-            }
-            this.delay = delay;
-            this.state = state;
-            this.scheduler.flush(this);
-            return this;
-        };
-        QueueAction.prototype.execute = function (state, delay) {
-            return (delay > 0 || this.closed) ?
-                _super.prototype.execute.call(this, state, delay) :
-                this._execute(state, delay);
-        };
-        QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-            if (delay === void 0) { delay = 0; }
-            if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-                return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-            }
-            return scheduler.flush(this);
-        };
-        return QueueAction;
-    }(AsyncAction));
-
-    var Scheduler = (function () {
-        function Scheduler(SchedulerAction, now) {
-            if (now === void 0) { now = Scheduler.now; }
-            this.SchedulerAction = SchedulerAction;
-            this.now = now;
-        }
-        Scheduler.prototype.schedule = function (work, delay, state) {
-            if (delay === void 0) { delay = 0; }
-            return new this.SchedulerAction(this, work).schedule(state, delay);
-        };
-        Scheduler.now = function () { return Date.now(); };
-        return Scheduler;
-    }());
-
-    var AsyncScheduler = (function (_super) {
-        __extends(AsyncScheduler, _super);
-        function AsyncScheduler(SchedulerAction, now) {
-            if (now === void 0) { now = Scheduler.now; }
-            var _this = _super.call(this, SchedulerAction, function () {
-                if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) {
-                    return AsyncScheduler.delegate.now();
-                }
-                else {
-                    return now();
-                }
-            }) || this;
-            _this.actions = [];
-            _this.active = false;
-            _this.scheduled = undefined;
-            return _this;
-        }
-        AsyncScheduler.prototype.schedule = function (work, delay, state) {
-            if (delay === void 0) { delay = 0; }
-            if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
-                return AsyncScheduler.delegate.schedule(work, delay, state);
-            }
-            else {
-                return _super.prototype.schedule.call(this, work, delay, state);
-            }
-        };
-        AsyncScheduler.prototype.flush = function (action) {
-            var actions = this.actions;
-            if (this.active) {
-                actions.push(action);
-                return;
-            }
-            var error;
-            this.active = true;
-            do {
-                if (error = action.execute(action.state, action.delay)) {
-                    break;
-                }
-            } while (action = actions.shift());
-            this.active = false;
-            if (error) {
-                while (action = actions.shift()) {
-                    action.unsubscribe();
-                }
-                throw error;
-            }
-        };
-        return AsyncScheduler;
-    }(Scheduler));
-
-    var QueueScheduler = (function (_super) {
-        __extends(QueueScheduler, _super);
-        function QueueScheduler() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        return QueueScheduler;
-    }(AsyncScheduler));
-
-    var queue = new QueueScheduler(QueueAction);
-
-    var EMPTY = new Observable(function (subscriber) { return subscriber.complete(); });
-    function empty$1(scheduler) {
-        return scheduler ? emptyScheduled(scheduler) : EMPTY;
-    }
-    function emptyScheduled(scheduler) {
-        return new Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });
-    }
-
-    function isScheduler(value) {
-        return value && typeof value.schedule === 'function';
-    }
-
-    var subscribeToArray = function (array) { return function (subscriber) {
-        for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) {
-            subscriber.next(array[i]);
-        }
-        subscriber.complete();
-    }; };
-
-    function scheduleArray(input, scheduler) {
-        return new Observable(function (subscriber) {
-            var sub = new Subscription();
-            var i = 0;
-            sub.add(scheduler.schedule(function () {
-                if (i === input.length) {
-                    subscriber.complete();
-                    return;
-                }
-                subscriber.next(input[i++]);
-                if (!subscriber.closed) {
-                    sub.add(this.schedule());
-                }
-            }));
-            return sub;
-        });
-    }
-
-    function fromArray(input, scheduler) {
-        if (!scheduler) {
-            return new Observable(subscribeToArray(input));
-        }
-        else {
-            return scheduleArray(input, scheduler);
-        }
-    }
-
-    function of() {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        var scheduler = args[args.length - 1];
-        if (isScheduler(scheduler)) {
-            args.pop();
-            return scheduleArray(args, scheduler);
-        }
-        else {
-            return fromArray(args);
-        }
-    }
-
-    function throwError(error, scheduler) {
-        if (!scheduler) {
-            return new Observable(function (subscriber) { return subscriber.error(error); });
-        }
-        else {
-            return new Observable(function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); });
-        }
-    }
-    function dispatch(_a) {
-        var error = _a.error, subscriber = _a.subscriber;
-        subscriber.error(error);
-    }
-
-    (function (NotificationKind) {
-        NotificationKind["NEXT"] = "N";
-        NotificationKind["ERROR"] = "E";
-        NotificationKind["COMPLETE"] = "C";
-    })(exports.NotificationKind || (exports.NotificationKind = {}));
-    var Notification = (function () {
-        function Notification(kind, value, error) {
-            this.kind = kind;
-            this.value = value;
-            this.error = error;
-            this.hasValue = kind === 'N';
-        }
-        Notification.prototype.observe = function (observer) {
-            switch (this.kind) {
-                case 'N':
-                    return observer.next && observer.next(this.value);
-                case 'E':
-                    return observer.error && observer.error(this.error);
-                case 'C':
-                    return observer.complete && observer.complete();
-            }
-        };
-        Notification.prototype.do = function (next, error, complete) {
-            var kind = this.kind;
-            switch (kind) {
-                case 'N':
-                    return next && next(this.value);
-                case 'E':
-                    return error && error(this.error);
-                case 'C':
-                    return complete && complete();
-            }
-        };
-        Notification.prototype.accept = function (nextOrObserver, error, complete) {
-            if (nextOrObserver && typeof nextOrObserver.next === 'function') {
-                return this.observe(nextOrObserver);
-            }
-            else {
-                return this.do(nextOrObserver, error, complete);
-            }
-        };
-        Notification.prototype.toObservable = function () {
-            var kind = this.kind;
-            switch (kind) {
-                case 'N':
-                    return of(this.value);
-                case 'E':
-                    return throwError(this.error);
-                case 'C':
-                    return empty$1();
-            }
-            throw new Error('unexpected notification kind value');
-        };
-        Notification.createNext = function (value) {
-            if (typeof value !== 'undefined') {
-                return new Notification('N', value);
-            }
-            return Notification.undefinedValueNotification;
-        };
-        Notification.createError = function (err) {
-            return new Notification('E', undefined, err);
-        };
-        Notification.createComplete = function () {
-            return Notification.completeNotification;
-        };
-        Notification.completeNotification = new Notification('C');
-        Notification.undefinedValueNotification = new Notification('N', undefined);
-        return Notification;
-    }());
-
-    function observeOn(scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        return function observeOnOperatorFunction(source) {
-            return source.lift(new ObserveOnOperator(scheduler, delay));
-        };
-    }
-    var ObserveOnOperator = (function () {
-        function ObserveOnOperator(scheduler, delay) {
-            if (delay === void 0) { delay = 0; }
-            this.scheduler = scheduler;
-            this.delay = delay;
-        }
-        ObserveOnOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
-        };
-        return ObserveOnOperator;
-    }());
-    var ObserveOnSubscriber = (function (_super) {
-        __extends(ObserveOnSubscriber, _super);
-        function ObserveOnSubscriber(destination, scheduler, delay) {
-            if (delay === void 0) { delay = 0; }
-            var _this = _super.call(this, destination) || this;
-            _this.scheduler = scheduler;
-            _this.delay = delay;
-            return _this;
-        }
-        ObserveOnSubscriber.dispatch = function (arg) {
-            var notification = arg.notification, destination = arg.destination;
-            notification.observe(destination);
-            this.unsubscribe();
-        };
-        ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {
-            var destination = this.destination;
-            destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));
-        };
-        ObserveOnSubscriber.prototype._next = function (value) {
-            this.scheduleMessage(Notification.createNext(value));
-        };
-        ObserveOnSubscriber.prototype._error = function (err) {
-            this.scheduleMessage(Notification.createError(err));
-            this.unsubscribe();
-        };
-        ObserveOnSubscriber.prototype._complete = function () {
-            this.scheduleMessage(Notification.createComplete());
-            this.unsubscribe();
-        };
-        return ObserveOnSubscriber;
-    }(Subscriber));
-    var ObserveOnMessage = (function () {
-        function ObserveOnMessage(notification, destination) {
-            this.notification = notification;
-            this.destination = destination;
-        }
-        return ObserveOnMessage;
-    }());
-
-    var ReplaySubject = (function (_super) {
-        __extends(ReplaySubject, _super);
-        function ReplaySubject(bufferSize, windowTime, scheduler) {
-            if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
-            if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
-            var _this = _super.call(this) || this;
-            _this.scheduler = scheduler;
-            _this._events = [];
-            _this._infiniteTimeWindow = false;
-            _this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
-            _this._windowTime = windowTime < 1 ? 1 : windowTime;
-            if (windowTime === Number.POSITIVE_INFINITY) {
-                _this._infiniteTimeWindow = true;
-                _this.next = _this.nextInfiniteTimeWindow;
-            }
-            else {
-                _this.next = _this.nextTimeWindow;
-            }
-            return _this;
-        }
-        ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) {
-            var _events = this._events;
-            _events.push(value);
-            if (_events.length > this._bufferSize) {
-                _events.shift();
-            }
-            _super.prototype.next.call(this, value);
-        };
-        ReplaySubject.prototype.nextTimeWindow = function (value) {
-            this._events.push(new ReplayEvent(this._getNow(), value));
-            this._trimBufferThenGetEvents();
-            _super.prototype.next.call(this, value);
-        };
-        ReplaySubject.prototype._subscribe = function (subscriber) {
-            var _infiniteTimeWindow = this._infiniteTimeWindow;
-            var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();
-            var scheduler = this.scheduler;
-            var len = _events.length;
-            var subscription;
-            if (this.closed) {
-                throw new ObjectUnsubscribedError();
-            }
-            else if (this.isStopped || this.hasError) {
-                subscription = Subscription.EMPTY;
-            }
-            else {
-                this.observers.push(subscriber);
-                subscription = new SubjectSubscription(this, subscriber);
-            }
-            if (scheduler) {
-                subscriber.add(subscriber = new ObserveOnSubscriber(subscriber, scheduler));
-            }
-            if (_infiniteTimeWindow) {
-                for (var i = 0; i < len && !subscriber.closed; i++) {
-                    subscriber.next(_events[i]);
-                }
-            }
-            else {
-                for (var i = 0; i < len && !subscriber.closed; i++) {
-                    subscriber.next(_events[i].value);
-                }
-            }
-            if (this.hasError) {
-                subscriber.error(this.thrownError);
-            }
-            else if (this.isStopped) {
-                subscriber.complete();
-            }
-            return subscription;
-        };
-        ReplaySubject.prototype._getNow = function () {
-            return (this.scheduler || queue).now();
-        };
-        ReplaySubject.prototype._trimBufferThenGetEvents = function () {
-            var now = this._getNow();
-            var _bufferSize = this._bufferSize;
-            var _windowTime = this._windowTime;
-            var _events = this._events;
-            var eventsCount = _events.length;
-            var spliceCount = 0;
-            while (spliceCount < eventsCount) {
-                if ((now - _events[spliceCount].time) < _windowTime) {
-                    break;
-                }
-                spliceCount++;
-            }
-            if (eventsCount > _bufferSize) {
-                spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);
-            }
-            if (spliceCount > 0) {
-                _events.splice(0, spliceCount);
-            }
-            return _events;
-        };
-        return ReplaySubject;
-    }(Subject));
-    var ReplayEvent = (function () {
-        function ReplayEvent(time, value) {
-            this.time = time;
-            this.value = value;
-        }
-        return ReplayEvent;
-    }());
-
-    var AsyncSubject = (function (_super) {
-        __extends(AsyncSubject, _super);
-        function AsyncSubject() {
-            var _this = _super !== null && _super.apply(this, arguments) || this;
-            _this.value = null;
-            _this.hasNext = false;
-            _this.hasCompleted = false;
-            return _this;
-        }
-        AsyncSubject.prototype._subscribe = function (subscriber) {
-            if (this.hasError) {
-                subscriber.error(this.thrownError);
-                return Subscription.EMPTY;
-            }
-            else if (this.hasCompleted && this.hasNext) {
-                subscriber.next(this.value);
-                subscriber.complete();
-                return Subscription.EMPTY;
-            }
-            return _super.prototype._subscribe.call(this, subscriber);
-        };
-        AsyncSubject.prototype.next = function (value) {
-            if (!this.hasCompleted) {
-                this.value = value;
-                this.hasNext = true;
-            }
-        };
-        AsyncSubject.prototype.error = function (error) {
-            if (!this.hasCompleted) {
-                _super.prototype.error.call(this, error);
-            }
-        };
-        AsyncSubject.prototype.complete = function () {
-            this.hasCompleted = true;
-            if (this.hasNext) {
-                _super.prototype.next.call(this, this.value);
-            }
-            _super.prototype.complete.call(this);
-        };
-        return AsyncSubject;
-    }(Subject));
-
-    var nextHandle = 1;
-    var RESOLVED = (function () { return Promise.resolve(); })();
-    var activeHandles = {};
-    function findAndClearHandle(handle) {
-        if (handle in activeHandles) {
-            delete activeHandles[handle];
-            return true;
-        }
-        return false;
-    }
-    var Immediate = {
-        setImmediate: function (cb) {
-            var handle = nextHandle++;
-            activeHandles[handle] = true;
-            RESOLVED.then(function () { return findAndClearHandle(handle) && cb(); });
-            return handle;
-        },
-        clearImmediate: function (handle) {
-            findAndClearHandle(handle);
-        },
-    };
-
-    var AsapAction = (function (_super) {
-        __extends(AsapAction, _super);
-        function AsapAction(scheduler, work) {
-            var _this = _super.call(this, scheduler, work) || this;
-            _this.scheduler = scheduler;
-            _this.work = work;
-            return _this;
-        }
-        AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-            if (delay === void 0) { delay = 0; }
-            if (delay !== null && delay > 0) {
-                return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-            }
-            scheduler.actions.push(this);
-            return scheduler.scheduled || (scheduler.scheduled = Immediate.setImmediate(scheduler.flush.bind(scheduler, null)));
-        };
-        AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-            if (delay === void 0) { delay = 0; }
-            if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-                return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
-            }
-            if (scheduler.actions.length === 0) {
-                Immediate.clearImmediate(id);
-                scheduler.scheduled = undefined;
-            }
-            return undefined;
-        };
-        return AsapAction;
-    }(AsyncAction));
-
-    var AsapScheduler = (function (_super) {
-        __extends(AsapScheduler, _super);
-        function AsapScheduler() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        AsapScheduler.prototype.flush = function (action) {
-            this.active = true;
-            this.scheduled = undefined;
-            var actions = this.actions;
-            var error;
-            var index = -1;
-            var count = actions.length;
-            action = action || actions.shift();
-            do {
-                if (error = action.execute(action.state, action.delay)) {
-                    break;
-                }
-            } while (++index < count && (action = actions.shift()));
-            this.active = false;
-            if (error) {
-                while (++index < count && (action = actions.shift())) {
-                    action.unsubscribe();
-                }
-                throw error;
-            }
-        };
-        return AsapScheduler;
-    }(AsyncScheduler));
-
-    var asap = new AsapScheduler(AsapAction);
-
-    var async = new AsyncScheduler(AsyncAction);
-
-    var AnimationFrameAction = (function (_super) {
-        __extends(AnimationFrameAction, _super);
-        function AnimationFrameAction(scheduler, work) {
-            var _this = _super.call(this, scheduler, work) || this;
-            _this.scheduler = scheduler;
-            _this.work = work;
-            return _this;
-        }
-        AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-            if (delay === void 0) { delay = 0; }
-            if (delay !== null && delay > 0) {
-                return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-            }
-            scheduler.actions.push(this);
-            return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); }));
-        };
-        AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-            if (delay === void 0) { delay = 0; }
-            if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-                return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
-            }
-            if (scheduler.actions.length === 0) {
-                cancelAnimationFrame(id);
-                scheduler.scheduled = undefined;
-            }
-            return undefined;
-        };
-        return AnimationFrameAction;
-    }(AsyncAction));
-
-    var AnimationFrameScheduler = (function (_super) {
-        __extends(AnimationFrameScheduler, _super);
-        function AnimationFrameScheduler() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        AnimationFrameScheduler.prototype.flush = function (action) {
-            this.active = true;
-            this.scheduled = undefined;
-            var actions = this.actions;
-            var error;
-            var index = -1;
-            var count = actions.length;
-            action = action || actions.shift();
-            do {
-                if (error = action.execute(action.state, action.delay)) {
-                    break;
-                }
-            } while (++index < count && (action = actions.shift()));
-            this.active = false;
-            if (error) {
-                while (++index < count && (action = actions.shift())) {
-                    action.unsubscribe();
-                }
-                throw error;
-            }
-        };
-        return AnimationFrameScheduler;
-    }(AsyncScheduler));
-
-    var animationFrame = new AnimationFrameScheduler(AnimationFrameAction);
-
-    var VirtualTimeScheduler = (function (_super) {
-        __extends(VirtualTimeScheduler, _super);
-        function VirtualTimeScheduler(SchedulerAction, maxFrames) {
-            if (SchedulerAction === void 0) { SchedulerAction = VirtualAction; }
-            if (maxFrames === void 0) { maxFrames = Number.POSITIVE_INFINITY; }
-            var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this;
-            _this.maxFrames = maxFrames;
-            _this.frame = 0;
-            _this.index = -1;
-            return _this;
-        }
-        VirtualTimeScheduler.prototype.flush = function () {
-            var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
-            var error, action;
-            while ((action = actions[0]) && action.delay <= maxFrames) {
-                actions.shift();
-                this.frame = action.delay;
-                if (error = action.execute(action.state, action.delay)) {
-                    break;
-                }
-            }
-            if (error) {
-                while (action = actions.shift()) {
-                    action.unsubscribe();
-                }
-                throw error;
-            }
-        };
-        VirtualTimeScheduler.frameTimeFactor = 10;
-        return VirtualTimeScheduler;
-    }(AsyncScheduler));
-    var VirtualAction = (function (_super) {
-        __extends(VirtualAction, _super);
-        function VirtualAction(scheduler, work, index) {
-            if (index === void 0) { index = scheduler.index += 1; }
-            var _this = _super.call(this, scheduler, work) || this;
-            _this.scheduler = scheduler;
-            _this.work = work;
-            _this.index = index;
-            _this.active = true;
-            _this.index = scheduler.index = index;
-            return _this;
-        }
-        VirtualAction.prototype.schedule = function (state, delay) {
-            if (delay === void 0) { delay = 0; }
-            if (!this.id) {
-                return _super.prototype.schedule.call(this, state, delay);
-            }
-            this.active = false;
-            var action = new VirtualAction(this.scheduler, this.work);
-            this.add(action);
-            return action.schedule(state, delay);
-        };
-        VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-            if (delay === void 0) { delay = 0; }
-            this.delay = scheduler.frame + delay;
-            var actions = scheduler.actions;
-            actions.push(this);
-            actions.sort(VirtualAction.sortActions);
-            return true;
-        };
-        VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-            if (delay === void 0) { delay = 0; }
-            return undefined;
-        };
-        VirtualAction.prototype._execute = function (state, delay) {
-            if (this.active === true) {
-                return _super.prototype._execute.call(this, state, delay);
-            }
-        };
-        VirtualAction.sortActions = function (a, b) {
-            if (a.delay === b.delay) {
-                if (a.index === b.index) {
-                    return 0;
-                }
-                else if (a.index > b.index) {
-                    return 1;
-                }
-                else {
-                    return -1;
-                }
-            }
-            else if (a.delay > b.delay) {
-                return 1;
-            }
-            else {
-                return -1;
-            }
-        };
-        return VirtualAction;
-    }(AsyncAction));
-
-    function identity(x) {
-        return x;
-    }
-
-    function isObservable(obj) {
-        return !!obj && (obj instanceof Observable || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));
-    }
-
-    var ArgumentOutOfRangeErrorImpl = (function () {
-        function ArgumentOutOfRangeErrorImpl() {
-            Error.call(this);
-            this.message = 'argument out of range';
-            this.name = 'ArgumentOutOfRangeError';
-            return this;
-        }
-        ArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype);
-        return ArgumentOutOfRangeErrorImpl;
-    })();
-    var ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl;
-
-    var EmptyErrorImpl = (function () {
-        function EmptyErrorImpl() {
-            Error.call(this);
-            this.message = 'no elements in sequence';
-            this.name = 'EmptyError';
-            return this;
-        }
-        EmptyErrorImpl.prototype = Object.create(Error.prototype);
-        return EmptyErrorImpl;
-    })();
-    var EmptyError = EmptyErrorImpl;
-
-    var TimeoutErrorImpl = (function () {
-        function TimeoutErrorImpl() {
-            Error.call(this);
-            this.message = 'Timeout has occurred';
-            this.name = 'TimeoutError';
-            return this;
-        }
-        TimeoutErrorImpl.prototype = Object.create(Error.prototype);
-        return TimeoutErrorImpl;
-    })();
-    var TimeoutError = TimeoutErrorImpl;
-
-    function map(project, thisArg) {
-        return function mapOperation(source) {
-            if (typeof project !== 'function') {
-                throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
-            }
-            return source.lift(new MapOperator(project, thisArg));
-        };
-    }
-    var MapOperator = (function () {
-        function MapOperator(project, thisArg) {
-            this.project = project;
-            this.thisArg = thisArg;
-        }
-        MapOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
-        };
-        return MapOperator;
-    }());
-    var MapSubscriber = (function (_super) {
-        __extends(MapSubscriber, _super);
-        function MapSubscriber(destination, project, thisArg) {
-            var _this = _super.call(this, destination) || this;
-            _this.project = project;
-            _this.count = 0;
-            _this.thisArg = thisArg || _this;
-            return _this;
-        }
-        MapSubscriber.prototype._next = function (value) {
-            var result;
-            try {
-                result = this.project.call(this.thisArg, value, this.count++);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            this.destination.next(result);
-        };
-        return MapSubscriber;
-    }(Subscriber));
-
-    function bindCallback(callbackFunc, resultSelector, scheduler) {
-        if (resultSelector) {
-            if (isScheduler(resultSelector)) {
-                scheduler = resultSelector;
-            }
-            else {
-                return function () {
-                    var args = [];
-                    for (var _i = 0; _i < arguments.length; _i++) {
-                        args[_i] = arguments[_i];
-                    }
-                    return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map(function (args) { return isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-                };
-            }
-        }
-        return function () {
-            var args = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                args[_i] = arguments[_i];
-            }
-            var context = this;
-            var subject;
-            var params = {
-                context: context,
-                subject: subject,
-                callbackFunc: callbackFunc,
-                scheduler: scheduler,
-            };
-            return new Observable(function (subscriber) {
-                if (!scheduler) {
-                    if (!subject) {
-                        subject = new AsyncSubject();
-                        var handler = function () {
-                            var innerArgs = [];
-                            for (var _i = 0; _i < arguments.length; _i++) {
-                                innerArgs[_i] = arguments[_i];
-                            }
-                            subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-                            subject.complete();
-                        };
-                        try {
-                            callbackFunc.apply(context, args.concat([handler]));
-                        }
-                        catch (err) {
-                            if (canReportError(subject)) {
-                                subject.error(err);
-                            }
-                            else {
-                                console.warn(err);
-                            }
-                        }
-                    }
-                    return subject.subscribe(subscriber);
-                }
-                else {
-                    var state = {
-                        args: args, subscriber: subscriber, params: params,
-                    };
-                    return scheduler.schedule(dispatch$1, 0, state);
-                }
-            });
-        };
-    }
-    function dispatch$1(state) {
-        var _this = this;
-        var args = state.args, subscriber = state.subscriber, params = state.params;
-        var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler;
-        var subject = params.subject;
-        if (!subject) {
-            subject = params.subject = new AsyncSubject();
-            var handler = function () {
-                var innerArgs = [];
-                for (var _i = 0; _i < arguments.length; _i++) {
-                    innerArgs[_i] = arguments[_i];
-                }
-                var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-                _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
-            };
-            try {
-                callbackFunc.apply(context, args.concat([handler]));
-            }
-            catch (err) {
-                subject.error(err);
-            }
-        }
-        this.add(subject.subscribe(subscriber));
-    }
-    function dispatchNext(state) {
-        var value = state.value, subject = state.subject;
-        subject.next(value);
-        subject.complete();
-    }
-
-    function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
-        if (resultSelector) {
-            if (isScheduler(resultSelector)) {
-                scheduler = resultSelector;
-            }
-            else {
-                return function () {
-                    var args = [];
-                    for (var _i = 0; _i < arguments.length; _i++) {
-                        args[_i] = arguments[_i];
-                    }
-                    return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map(function (args) { return isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-                };
-            }
-        }
-        return function () {
-            var args = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                args[_i] = arguments[_i];
-            }
-            var params = {
-                subject: undefined,
-                args: args,
-                callbackFunc: callbackFunc,
-                scheduler: scheduler,
-                context: this,
-            };
-            return new Observable(function (subscriber) {
-                var context = params.context;
-                var subject = params.subject;
-                if (!scheduler) {
-                    if (!subject) {
-                        subject = params.subject = new AsyncSubject();
-                        var handler = function () {
-                            var innerArgs = [];
-                            for (var _i = 0; _i < arguments.length; _i++) {
-                                innerArgs[_i] = arguments[_i];
-                            }
-                            var err = innerArgs.shift();
-                            if (err) {
-                                subject.error(err);
-                                return;
-                            }
-                            subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-                            subject.complete();
-                        };
-                        try {
-                            callbackFunc.apply(context, args.concat([handler]));
-                        }
-                        catch (err) {
-                            if (canReportError(subject)) {
-                                subject.error(err);
-                            }
-                            else {
-                                console.warn(err);
-                            }
-                        }
-                    }
-                    return subject.subscribe(subscriber);
-                }
-                else {
-                    return scheduler.schedule(dispatch$2, 0, { params: params, subscriber: subscriber, context: context });
-                }
-            });
-        };
-    }
-    function dispatch$2(state) {
-        var _this = this;
-        var params = state.params, subscriber = state.subscriber, context = state.context;
-        var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler;
-        var subject = params.subject;
-        if (!subject) {
-            subject = params.subject = new AsyncSubject();
-            var handler = function () {
-                var innerArgs = [];
-                for (var _i = 0; _i < arguments.length; _i++) {
-                    innerArgs[_i] = arguments[_i];
-                }
-                var err = innerArgs.shift();
-                if (err) {
-                    _this.add(scheduler.schedule(dispatchError$1, 0, { err: err, subject: subject }));
-                }
-                else {
-                    var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-                    _this.add(scheduler.schedule(dispatchNext$1, 0, { value: value, subject: subject }));
-                }
-            };
-            try {
-                callbackFunc.apply(context, args.concat([handler]));
-            }
-            catch (err) {
-                this.add(scheduler.schedule(dispatchError$1, 0, { err: err, subject: subject }));
-            }
-        }
-        this.add(subject.subscribe(subscriber));
-    }
-    function dispatchNext$1(arg) {
-        var value = arg.value, subject = arg.subject;
-        subject.next(value);
-        subject.complete();
-    }
-    function dispatchError$1(arg) {
-        var err = arg.err, subject = arg.subject;
-        subject.error(err);
-    }
-
-    var OuterSubscriber = (function (_super) {
-        __extends(OuterSubscriber, _super);
-        function OuterSubscriber() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.destination.next(innerValue);
-        };
-        OuterSubscriber.prototype.notifyError = function (error, innerSub) {
-            this.destination.error(error);
-        };
-        OuterSubscriber.prototype.notifyComplete = function (innerSub) {
-            this.destination.complete();
-        };
-        return OuterSubscriber;
-    }(Subscriber));
-
-    var InnerSubscriber = (function (_super) {
-        __extends(InnerSubscriber, _super);
-        function InnerSubscriber(parent, outerValue, outerIndex) {
-            var _this = _super.call(this) || this;
-            _this.parent = parent;
-            _this.outerValue = outerValue;
-            _this.outerIndex = outerIndex;
-            _this.index = 0;
-            return _this;
-        }
-        InnerSubscriber.prototype._next = function (value) {
-            this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
-        };
-        InnerSubscriber.prototype._error = function (error) {
-            this.parent.notifyError(error, this);
-            this.unsubscribe();
-        };
-        InnerSubscriber.prototype._complete = function () {
-            this.parent.notifyComplete(this);
-            this.unsubscribe();
-        };
-        return InnerSubscriber;
-    }(Subscriber));
-
-    var subscribeToPromise = function (promise) { return function (subscriber) {
-        promise.then(function (value) {
-            if (!subscriber.closed) {
-                subscriber.next(value);
-                subscriber.complete();
-            }
-        }, function (err) { return subscriber.error(err); })
-            .then(null, hostReportError);
-        return subscriber;
-    }; };
-
-    function getSymbolIterator() {
-        if (typeof Symbol !== 'function' || !Symbol.iterator) {
-            return '@@iterator';
-        }
-        return Symbol.iterator;
-    }
-    var iterator = getSymbolIterator();
-
-    var subscribeToIterable = function (iterable) { return function (subscriber) {
-        var iterator$$1 = iterable[iterator]();
-        do {
-            var item = iterator$$1.next();
-            if (item.done) {
-                subscriber.complete();
-                break;
-            }
-            subscriber.next(item.value);
-            if (subscriber.closed) {
-                break;
-            }
-        } while (true);
-        if (typeof iterator$$1.return === 'function') {
-            subscriber.add(function () {
-                if (iterator$$1.return) {
-                    iterator$$1.return();
-                }
-            });
-        }
-        return subscriber;
-    }; };
-
-    var subscribeToObservable = function (obj) { return function (subscriber) {
-        var obs = obj[observable]();
-        if (typeof obs.subscribe !== 'function') {
-            throw new TypeError('Provided object does not correctly implement Symbol.observable');
-        }
-        else {
-            return obs.subscribe(subscriber);
-        }
-    }; };
-
-    var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });
-
-    function isPromise(value) {
-        return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
-    }
-
-    var subscribeTo = function (result) {
-        if (!!result && typeof result[observable] === 'function') {
-            return subscribeToObservable(result);
-        }
-        else if (isArrayLike(result)) {
-            return subscribeToArray(result);
-        }
-        else if (isPromise(result)) {
-            return subscribeToPromise(result);
-        }
-        else if (!!result && typeof result[iterator] === 'function') {
-            return subscribeToIterable(result);
-        }
-        else {
-            var value = isObject(result) ? 'an invalid object' : "'" + result + "'";
-            var msg = "You provided " + value + " where a stream was expected."
-                + ' You can provide an Observable, Promise, Array, or Iterable.';
-            throw new TypeError(msg);
-        }
-    };
-
-    function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, innerSubscriber) {
-        if (innerSubscriber === void 0) { innerSubscriber = new InnerSubscriber(outerSubscriber, outerValue, outerIndex); }
-        if (innerSubscriber.closed) {
-            return undefined;
-        }
-        if (result instanceof Observable) {
-            return result.subscribe(innerSubscriber);
-        }
-        return subscribeTo(result)(innerSubscriber);
-    }
-
-    var NONE = {};
-    function combineLatest() {
-        var observables = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            observables[_i] = arguments[_i];
-        }
-        var resultSelector = null;
-        var scheduler = null;
-        if (isScheduler(observables[observables.length - 1])) {
-            scheduler = observables.pop();
-        }
-        if (typeof observables[observables.length - 1] === 'function') {
-            resultSelector = observables.pop();
-        }
-        if (observables.length === 1 && isArray(observables[0])) {
-            observables = observables[0];
-        }
-        return fromArray(observables, scheduler).lift(new CombineLatestOperator(resultSelector));
-    }
-    var CombineLatestOperator = (function () {
-        function CombineLatestOperator(resultSelector) {
-            this.resultSelector = resultSelector;
-        }
-        CombineLatestOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));
-        };
-        return CombineLatestOperator;
-    }());
-    var CombineLatestSubscriber = (function (_super) {
-        __extends(CombineLatestSubscriber, _super);
-        function CombineLatestSubscriber(destination, resultSelector) {
-            var _this = _super.call(this, destination) || this;
-            _this.resultSelector = resultSelector;
-            _this.active = 0;
-            _this.values = [];
-            _this.observables = [];
-            return _this;
-        }
-        CombineLatestSubscriber.prototype._next = function (observable) {
-            this.values.push(NONE);
-            this.observables.push(observable);
-        };
-        CombineLatestSubscriber.prototype._complete = function () {
-            var observables = this.observables;
-            var len = observables.length;
-            if (len === 0) {
-                this.destination.complete();
-            }
-            else {
-                this.active = len;
-                this.toRespond = len;
-                for (var i = 0; i < len; i++) {
-                    var observable = observables[i];
-                    this.add(subscribeToResult(this, observable, observable, i));
-                }
-            }
-        };
-        CombineLatestSubscriber.prototype.notifyComplete = function (unused) {
-            if ((this.active -= 1) === 0) {
-                this.destination.complete();
-            }
-        };
-        CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            var values = this.values;
-            var oldVal = values[outerIndex];
-            var toRespond = !this.toRespond
-                ? 0
-                : oldVal === NONE ? --this.toRespond : this.toRespond;
-            values[outerIndex] = innerValue;
-            if (toRespond === 0) {
-                if (this.resultSelector) {
-                    this._tryResultSelector(values);
-                }
-                else {
-                    this.destination.next(values.slice());
-                }
-            }
-        };
-        CombineLatestSubscriber.prototype._tryResultSelector = function (values) {
-            var result;
-            try {
-                result = this.resultSelector.apply(this, values);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            this.destination.next(result);
-        };
-        return CombineLatestSubscriber;
-    }(OuterSubscriber));
-
-    function scheduleObservable(input, scheduler) {
-        return new Observable(function (subscriber) {
-            var sub = new Subscription();
-            sub.add(scheduler.schedule(function () {
-                var observable$$1 = input[observable]();
-                sub.add(observable$$1.subscribe({
-                    next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); },
-                    error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); },
-                    complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); },
-                }));
-            }));
-            return sub;
-        });
-    }
-
-    function schedulePromise(input, scheduler) {
-        return new Observable(function (subscriber) {
-            var sub = new Subscription();
-            sub.add(scheduler.schedule(function () { return input.then(function (value) {
-                sub.add(scheduler.schedule(function () {
-                    subscriber.next(value);
-                    sub.add(scheduler.schedule(function () { return subscriber.complete(); }));
-                }));
-            }, function (err) {
-                sub.add(scheduler.schedule(function () { return subscriber.error(err); }));
-            }); }));
-            return sub;
-        });
-    }
-
-    function scheduleIterable(input, scheduler) {
-        if (!input) {
-            throw new Error('Iterable cannot be null');
-        }
-        return new Observable(function (subscriber) {
-            var sub = new Subscription();
-            var iterator$$1;
-            sub.add(function () {
-                if (iterator$$1 && typeof iterator$$1.return === 'function') {
-                    iterator$$1.return();
-                }
-            });
-            sub.add(scheduler.schedule(function () {
-                iterator$$1 = input[iterator]();
-                sub.add(scheduler.schedule(function () {
-                    if (subscriber.closed) {
-                        return;
-                    }
-                    var value;
-                    var done;
-                    try {
-                        var result = iterator$$1.next();
-                        value = result.value;
-                        done = result.done;
-                    }
-                    catch (err) {
-                        subscriber.error(err);
-                        return;
-                    }
-                    if (done) {
-                        subscriber.complete();
-                    }
-                    else {
-                        subscriber.next(value);
-                        this.schedule();
-                    }
-                }));
-            }));
-            return sub;
-        });
-    }
-
-    function isInteropObservable(input) {
-        return input && typeof input[observable] === 'function';
-    }
-
-    function isIterable(input) {
-        return input && typeof input[iterator] === 'function';
-    }
-
-    function scheduled(input, scheduler) {
-        if (input != null) {
-            if (isInteropObservable(input)) {
-                return scheduleObservable(input, scheduler);
-            }
-            else if (isPromise(input)) {
-                return schedulePromise(input, scheduler);
-            }
-            else if (isArrayLike(input)) {
-                return scheduleArray(input, scheduler);
-            }
-            else if (isIterable(input) || typeof input === 'string') {
-                return scheduleIterable(input, scheduler);
-            }
-        }
-        throw new TypeError((input !== null && typeof input || input) + ' is not observable');
-    }
-
-    function from(input, scheduler) {
-        if (!scheduler) {
-            if (input instanceof Observable) {
-                return input;
-            }
-            return new Observable(subscribeTo(input));
-        }
-        else {
-            return scheduled(input, scheduler);
-        }
-    }
-
-    function mergeMap(project, resultSelector, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        if (typeof resultSelector === 'function') {
-            return function (source) { return source.pipe(mergeMap(function (a, i) { return from(project(a, i)).pipe(map(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); };
-        }
-        else if (typeof resultSelector === 'number') {
-            concurrent = resultSelector;
-        }
-        return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); };
-    }
-    var MergeMapOperator = (function () {
-        function MergeMapOperator(project, concurrent) {
-            if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-            this.project = project;
-            this.concurrent = concurrent;
-        }
-        MergeMapOperator.prototype.call = function (observer, source) {
-            return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));
-        };
-        return MergeMapOperator;
-    }());
-    var MergeMapSubscriber = (function (_super) {
-        __extends(MergeMapSubscriber, _super);
-        function MergeMapSubscriber(destination, project, concurrent) {
-            if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-            var _this = _super.call(this, destination) || this;
-            _this.project = project;
-            _this.concurrent = concurrent;
-            _this.hasCompleted = false;
-            _this.buffer = [];
-            _this.active = 0;
-            _this.index = 0;
-            return _this;
-        }
-        MergeMapSubscriber.prototype._next = function (value) {
-            if (this.active < this.concurrent) {
-                this._tryNext(value);
-            }
-            else {
-                this.buffer.push(value);
-            }
-        };
-        MergeMapSubscriber.prototype._tryNext = function (value) {
-            var result;
-            var index = this.index++;
-            try {
-                result = this.project(value, index);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            this.active++;
-            this._innerSub(result, value, index);
-        };
-        MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {
-            var innerSubscriber = new InnerSubscriber(this, value, index);
-            var destination = this.destination;
-            destination.add(innerSubscriber);
-            var innerSubscription = subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
-            if (innerSubscription !== innerSubscriber) {
-                destination.add(innerSubscription);
-            }
-        };
-        MergeMapSubscriber.prototype._complete = function () {
-            this.hasCompleted = true;
-            if (this.active === 0 && this.buffer.length === 0) {
-                this.destination.complete();
-            }
-            this.unsubscribe();
-        };
-        MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.destination.next(innerValue);
-        };
-        MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {
-            var buffer = this.buffer;
-            this.remove(innerSub);
-            this.active--;
-            if (buffer.length > 0) {
-                this._next(buffer.shift());
-            }
-            else if (this.active === 0 && this.hasCompleted) {
-                this.destination.complete();
-            }
-        };
-        return MergeMapSubscriber;
-    }(OuterSubscriber));
-
-    function mergeAll(concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        return mergeMap(identity, concurrent);
-    }
-
-    function concatAll() {
-        return mergeAll(1);
-    }
-
-    function concat() {
-        var observables = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            observables[_i] = arguments[_i];
-        }
-        return concatAll()(of.apply(void 0, observables));
-    }
-
-    function defer(observableFactory) {
-        return new Observable(function (subscriber) {
-            var input;
-            try {
-                input = observableFactory();
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-            var source = input ? from(input) : empty$1();
-            return source.subscribe(subscriber);
-        });
-    }
-
-    function forkJoin() {
-        var sources = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            sources[_i] = arguments[_i];
-        }
-        if (sources.length === 1) {
-            var first_1 = sources[0];
-            if (isArray(first_1)) {
-                return forkJoinInternal(first_1, null);
-            }
-            if (isObject(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) {
-                var keys = Object.keys(first_1);
-                return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys);
-            }
-        }
-        if (typeof sources[sources.length - 1] === 'function') {
-            var resultSelector_1 = sources.pop();
-            sources = (sources.length === 1 && isArray(sources[0])) ? sources[0] : sources;
-            return forkJoinInternal(sources, null).pipe(map(function (args) { return resultSelector_1.apply(void 0, args); }));
-        }
-        return forkJoinInternal(sources, null);
-    }
-    function forkJoinInternal(sources, keys) {
-        return new Observable(function (subscriber) {
-            var len = sources.length;
-            if (len === 0) {
-                subscriber.complete();
-                return;
-            }
-            var values = new Array(len);
-            var completed = 0;
-            var emitted = 0;
-            var _loop_1 = function (i) {
-                var source = from(sources[i]);
-                var hasValue = false;
-                subscriber.add(source.subscribe({
-                    next: function (value) {
-                        if (!hasValue) {
-                            hasValue = true;
-                            emitted++;
-                        }
-                        values[i] = value;
-                    },
-                    error: function (err) { return subscriber.error(err); },
-                    complete: function () {
-                        completed++;
-                        if (completed === len || !hasValue) {
-                            if (emitted === len) {
-                                subscriber.next(keys ?
-                                    keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) :
-                                    values);
-                            }
-                            subscriber.complete();
-                        }
-                    }
-                }));
-            };
-            for (var i = 0; i < len; i++) {
-                _loop_1(i);
-            }
-        });
-    }
-
-    function fromEvent(target, eventName, options, resultSelector) {
-        if (isFunction(options)) {
-            resultSelector = options;
-            options = undefined;
-        }
-        if (resultSelector) {
-            return fromEvent(target, eventName, options).pipe(map(function (args) { return isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-        }
-        return new Observable(function (subscriber) {
-            function handler(e) {
-                if (arguments.length > 1) {
-                    subscriber.next(Array.prototype.slice.call(arguments));
-                }
-                else {
-                    subscriber.next(e);
-                }
-            }
-            setupSubscription(target, eventName, handler, subscriber, options);
-        });
-    }
-    function setupSubscription(sourceObj, eventName, handler, subscriber, options) {
-        var unsubscribe;
-        if (isEventTarget(sourceObj)) {
-            var source_1 = sourceObj;
-            sourceObj.addEventListener(eventName, handler, options);
-            unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); };
-        }
-        else if (isJQueryStyleEventEmitter(sourceObj)) {
-            var source_2 = sourceObj;
-            sourceObj.on(eventName, handler);
-            unsubscribe = function () { return source_2.off(eventName, handler); };
-        }
-        else if (isNodeStyleEventEmitter(sourceObj)) {
-            var source_3 = sourceObj;
-            sourceObj.addListener(eventName, handler);
-            unsubscribe = function () { return source_3.removeListener(eventName, handler); };
-        }
-        else if (sourceObj && sourceObj.length) {
-            for (var i = 0, len = sourceObj.length; i < len; i++) {
-                setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
-            }
-        }
-        else {
-            throw new TypeError('Invalid event target');
-        }
-        subscriber.add(unsubscribe);
-    }
-    function isNodeStyleEventEmitter(sourceObj) {
-        return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';
-    }
-    function isJQueryStyleEventEmitter(sourceObj) {
-        return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';
-    }
-    function isEventTarget(sourceObj) {
-        return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
-    }
-
-    function fromEventPattern(addHandler, removeHandler, resultSelector) {
-        if (resultSelector) {
-            return fromEventPattern(addHandler, removeHandler).pipe(map(function (args) { return isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-        }
-        return new Observable(function (subscriber) {
-            var handler = function () {
-                var e = [];
-                for (var _i = 0; _i < arguments.length; _i++) {
-                    e[_i] = arguments[_i];
-                }
-                return subscriber.next(e.length === 1 ? e[0] : e);
-            };
-            var retValue;
-            try {
-                retValue = addHandler(handler);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-            if (!isFunction(removeHandler)) {
-                return undefined;
-            }
-            return function () { return removeHandler(handler, retValue); };
-        });
-    }
-
-    function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {
-        var resultSelector;
-        var initialState;
-        if (arguments.length == 1) {
-            var options = initialStateOrOptions;
-            initialState = options.initialState;
-            condition = options.condition;
-            iterate = options.iterate;
-            resultSelector = options.resultSelector || identity;
-            scheduler = options.scheduler;
-        }
-        else if (resultSelectorOrObservable === undefined || isScheduler(resultSelectorOrObservable)) {
-            initialState = initialStateOrOptions;
-            resultSelector = identity;
-            scheduler = resultSelectorOrObservable;
-        }
-        else {
-            initialState = initialStateOrOptions;
-            resultSelector = resultSelectorOrObservable;
-        }
-        return new Observable(function (subscriber) {
-            var state = initialState;
-            if (scheduler) {
-                return scheduler.schedule(dispatch$3, 0, {
-                    subscriber: subscriber,
-                    iterate: iterate,
-                    condition: condition,
-                    resultSelector: resultSelector,
-                    state: state
-                });
-            }
-            do {
-                if (condition) {
-                    var conditionResult = void 0;
-                    try {
-                        conditionResult = condition(state);
-                    }
-                    catch (err) {
-                        subscriber.error(err);
-                        return undefined;
-                    }
-                    if (!conditionResult) {
-                        subscriber.complete();
-                        break;
-                    }
-                }
-                var value = void 0;
-                try {
-                    value = resultSelector(state);
-                }
-                catch (err) {
-                    subscriber.error(err);
-                    return undefined;
-                }
-                subscriber.next(value);
-                if (subscriber.closed) {
-                    break;
-                }
-                try {
-                    state = iterate(state);
-                }
-                catch (err) {
-                    subscriber.error(err);
-                    return undefined;
-                }
-            } while (true);
-            return undefined;
-        });
-    }
-    function dispatch$3(state) {
-        var subscriber = state.subscriber, condition = state.condition;
-        if (subscriber.closed) {
-            return undefined;
-        }
-        if (state.needIterate) {
-            try {
-                state.state = state.iterate(state.state);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-        }
-        else {
-            state.needIterate = true;
-        }
-        if (condition) {
-            var conditionResult = void 0;
-            try {
-                conditionResult = condition(state.state);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-            if (!conditionResult) {
-                subscriber.complete();
-                return undefined;
-            }
-            if (subscriber.closed) {
-                return undefined;
-            }
-        }
-        var value;
-        try {
-            value = state.resultSelector(state.state);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        if (subscriber.closed) {
-            return undefined;
-        }
-        subscriber.next(value);
-        if (subscriber.closed) {
-            return undefined;
-        }
-        return this.schedule(state);
-    }
-
-    function iif(condition, trueResult, falseResult) {
-        if (trueResult === void 0) { trueResult = EMPTY; }
-        if (falseResult === void 0) { falseResult = EMPTY; }
-        return defer(function () { return condition() ? trueResult : falseResult; });
-    }
-
-    function isNumeric(val) {
-        return !isArray(val) && (val - parseFloat(val) + 1) >= 0;
-    }
-
-    function interval(period, scheduler) {
-        if (period === void 0) { period = 0; }
-        if (scheduler === void 0) { scheduler = async; }
-        if (!isNumeric(period) || period < 0) {
-            period = 0;
-        }
-        if (!scheduler || typeof scheduler.schedule !== 'function') {
-            scheduler = async;
-        }
-        return new Observable(function (subscriber) {
-            subscriber.add(scheduler.schedule(dispatch$4, period, { subscriber: subscriber, counter: 0, period: period }));
-            return subscriber;
-        });
-    }
-    function dispatch$4(state) {
-        var subscriber = state.subscriber, counter = state.counter, period = state.period;
-        subscriber.next(counter);
-        this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period);
-    }
-
-    function merge() {
-        var observables = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            observables[_i] = arguments[_i];
-        }
-        var concurrent = Number.POSITIVE_INFINITY;
-        var scheduler = null;
-        var last = observables[observables.length - 1];
-        if (isScheduler(last)) {
-            scheduler = observables.pop();
-            if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
-                concurrent = observables.pop();
-            }
-        }
-        else if (typeof last === 'number') {
-            concurrent = observables.pop();
-        }
-        if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable) {
-            return observables[0];
-        }
-        return mergeAll(concurrent)(fromArray(observables, scheduler));
-    }
-
-    var NEVER = new Observable(noop);
-    function never() {
-        return NEVER;
-    }
-
-    function onErrorResumeNext() {
-        var sources = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            sources[_i] = arguments[_i];
-        }
-        if (sources.length === 0) {
-            return EMPTY;
-        }
-        var first = sources[0], remainder = sources.slice(1);
-        if (sources.length === 1 && isArray(first)) {
-            return onErrorResumeNext.apply(void 0, first);
-        }
-        return new Observable(function (subscriber) {
-            var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); };
-            return from(first).subscribe({
-                next: function (value) { subscriber.next(value); },
-                error: subNext,
-                complete: subNext,
-            });
-        });
-    }
-
-    function pairs(obj, scheduler) {
-        if (!scheduler) {
-            return new Observable(function (subscriber) {
-                var keys = Object.keys(obj);
-                for (var i = 0; i < keys.length && !subscriber.closed; i++) {
-                    var key = keys[i];
-                    if (obj.hasOwnProperty(key)) {
-                        subscriber.next([key, obj[key]]);
-                    }
-                }
-                subscriber.complete();
-            });
-        }
-        else {
-            return new Observable(function (subscriber) {
-                var keys = Object.keys(obj);
-                var subscription = new Subscription();
-                subscription.add(scheduler.schedule(dispatch$5, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj }));
-                return subscription;
-            });
-        }
-    }
-    function dispatch$5(state) {
-        var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj;
-        if (!subscriber.closed) {
-            if (index < keys.length) {
-                var key = keys[index];
-                subscriber.next([key, obj[key]]);
-                subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj }));
-            }
-            else {
-                subscriber.complete();
-            }
-        }
-    }
-
-    function not(pred, thisArg) {
-        function notPred() {
-            return !(notPred.pred.apply(notPred.thisArg, arguments));
-        }
-        notPred.pred = pred;
-        notPred.thisArg = thisArg;
-        return notPred;
-    }
-
-    function filter(predicate, thisArg) {
-        return function filterOperatorFunction(source) {
-            return source.lift(new FilterOperator(predicate, thisArg));
-        };
-    }
-    var FilterOperator = (function () {
-        function FilterOperator(predicate, thisArg) {
-            this.predicate = predicate;
-            this.thisArg = thisArg;
-        }
-        FilterOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));
-        };
-        return FilterOperator;
-    }());
-    var FilterSubscriber = (function (_super) {
-        __extends(FilterSubscriber, _super);
-        function FilterSubscriber(destination, predicate, thisArg) {
-            var _this = _super.call(this, destination) || this;
-            _this.predicate = predicate;
-            _this.thisArg = thisArg;
-            _this.count = 0;
-            return _this;
-        }
-        FilterSubscriber.prototype._next = function (value) {
-            var result;
-            try {
-                result = this.predicate.call(this.thisArg, value, this.count++);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            if (result) {
-                this.destination.next(value);
-            }
-        };
-        return FilterSubscriber;
-    }(Subscriber));
-
-    function partition(source, predicate, thisArg) {
-        return [
-            filter(predicate, thisArg)(new Observable(subscribeTo(source))),
-            filter(not(predicate, thisArg))(new Observable(subscribeTo(source)))
-        ];
-    }
-
-    function race() {
-        var observables = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            observables[_i] = arguments[_i];
-        }
-        if (observables.length === 1) {
-            if (isArray(observables[0])) {
-                observables = observables[0];
-            }
-            else {
-                return observables[0];
-            }
-        }
-        return fromArray(observables, undefined).lift(new RaceOperator());
-    }
-    var RaceOperator = (function () {
-        function RaceOperator() {
-        }
-        RaceOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new RaceSubscriber(subscriber));
-        };
-        return RaceOperator;
-    }());
-    var RaceSubscriber = (function (_super) {
-        __extends(RaceSubscriber, _super);
-        function RaceSubscriber(destination) {
-            var _this = _super.call(this, destination) || this;
-            _this.hasFirst = false;
-            _this.observables = [];
-            _this.subscriptions = [];
-            return _this;
-        }
-        RaceSubscriber.prototype._next = function (observable) {
-            this.observables.push(observable);
-        };
-        RaceSubscriber.prototype._complete = function () {
-            var observables = this.observables;
-            var len = observables.length;
-            if (len === 0) {
-                this.destination.complete();
-            }
-            else {
-                for (var i = 0; i < len && !this.hasFirst; i++) {
-                    var observable = observables[i];
-                    var subscription = subscribeToResult(this, observable, observable, i);
-                    if (this.subscriptions) {
-                        this.subscriptions.push(subscription);
-                    }
-                    this.add(subscription);
-                }
-                this.observables = null;
-            }
-        };
-        RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            if (!this.hasFirst) {
-                this.hasFirst = true;
-                for (var i = 0; i < this.subscriptions.length; i++) {
-                    if (i !== outerIndex) {
-                        var subscription = this.subscriptions[i];
-                        subscription.unsubscribe();
-                        this.remove(subscription);
-                    }
-                }
-                this.subscriptions = null;
-            }
-            this.destination.next(innerValue);
-        };
-        return RaceSubscriber;
-    }(OuterSubscriber));
-
-    function range(start, count, scheduler) {
-        if (start === void 0) { start = 0; }
-        return new Observable(function (subscriber) {
-            if (count === undefined) {
-                count = start;
-                start = 0;
-            }
-            var index = 0;
-            var current = start;
-            if (scheduler) {
-                return scheduler.schedule(dispatch$6, 0, {
-                    index: index, count: count, start: start, subscriber: subscriber
-                });
-            }
-            else {
-                do {
-                    if (index++ >= count) {
-                        subscriber.complete();
-                        break;
-                    }
-                    subscriber.next(current++);
-                    if (subscriber.closed) {
-                        break;
-                    }
-                } while (true);
-            }
-            return undefined;
-        });
-    }
-    function dispatch$6(state) {
-        var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber;
-        if (index >= count) {
-            subscriber.complete();
-            return;
-        }
-        subscriber.next(start);
-        if (subscriber.closed) {
-            return;
-        }
-        state.index = index + 1;
-        state.start = start + 1;
-        this.schedule(state);
-    }
-
-    function timer(dueTime, periodOrScheduler, scheduler) {
-        if (dueTime === void 0) { dueTime = 0; }
-        var period = -1;
-        if (isNumeric(periodOrScheduler)) {
-            period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);
-        }
-        else if (isScheduler(periodOrScheduler)) {
-            scheduler = periodOrScheduler;
-        }
-        if (!isScheduler(scheduler)) {
-            scheduler = async;
-        }
-        return new Observable(function (subscriber) {
-            var due = isNumeric(dueTime)
-                ? dueTime
-                : (+dueTime - scheduler.now());
-            return scheduler.schedule(dispatch$7, due, {
-                index: 0, period: period, subscriber: subscriber
-            });
-        });
-    }
-    function dispatch$7(state) {
-        var index = state.index, period = state.period, subscriber = state.subscriber;
-        subscriber.next(index);
-        if (subscriber.closed) {
-            return;
-        }
-        else if (period === -1) {
-            return subscriber.complete();
-        }
-        state.index = index + 1;
-        this.schedule(state, period);
-    }
-
-    function using(resourceFactory, observableFactory) {
-        return new Observable(function (subscriber) {
-            var resource;
-            try {
-                resource = resourceFactory();
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-            var result;
-            try {
-                result = observableFactory(resource);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-            var source = result ? from(result) : EMPTY;
-            var subscription = source.subscribe(subscriber);
-            return function () {
-                subscription.unsubscribe();
-                if (resource) {
-                    resource.unsubscribe();
-                }
-            };
-        });
-    }
-
-    function zip() {
-        var observables = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            observables[_i] = arguments[_i];
-        }
-        var resultSelector = observables[observables.length - 1];
-        if (typeof resultSelector === 'function') {
-            observables.pop();
-        }
-        return fromArray(observables, undefined).lift(new ZipOperator(resultSelector));
-    }
-    var ZipOperator = (function () {
-        function ZipOperator(resultSelector) {
-            this.resultSelector = resultSelector;
-        }
-        ZipOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));
-        };
-        return ZipOperator;
-    }());
-    var ZipSubscriber = (function (_super) {
-        __extends(ZipSubscriber, _super);
-        function ZipSubscriber(destination, resultSelector, values) {
-            if (values === void 0) { values = Object.create(null); }
-            var _this = _super.call(this, destination) || this;
-            _this.iterators = [];
-            _this.active = 0;
-            _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null;
-            _this.values = values;
-            return _this;
-        }
-        ZipSubscriber.prototype._next = function (value) {
-            var iterators = this.iterators;
-            if (isArray(value)) {
-                iterators.push(new StaticArrayIterator(value));
-            }
-            else if (typeof value[iterator] === 'function') {
-                iterators.push(new StaticIterator(value[iterator]()));
-            }
-            else {
-                iterators.push(new ZipBufferIterator(this.destination, this, value));
-            }
-        };
-        ZipSubscriber.prototype._complete = function () {
-            var iterators = this.iterators;
-            var len = iterators.length;
-            this.unsubscribe();
-            if (len === 0) {
-                this.destination.complete();
-                return;
-            }
-            this.active = len;
-            for (var i = 0; i < len; i++) {
-                var iterator$$1 = iterators[i];
-                if (iterator$$1.stillUnsubscribed) {
-                    var destination = this.destination;
-                    destination.add(iterator$$1.subscribe(iterator$$1, i));
-                }
-                else {
-                    this.active--;
-                }
-            }
-        };
-        ZipSubscriber.prototype.notifyInactive = function () {
-            this.active--;
-            if (this.active === 0) {
-                this.destination.complete();
-            }
-        };
-        ZipSubscriber.prototype.checkIterators = function () {
-            var iterators = this.iterators;
-            var len = iterators.length;
-            var destination = this.destination;
-            for (var i = 0; i < len; i++) {
-                var iterator$$1 = iterators[i];
-                if (typeof iterator$$1.hasValue === 'function' && !iterator$$1.hasValue()) {
-                    return;
-                }
-            }
-            var shouldComplete = false;
-            var args = [];
-            for (var i = 0; i < len; i++) {
-                var iterator$$1 = iterators[i];
-                var result = iterator$$1.next();
-                if (iterator$$1.hasCompleted()) {
-                    shouldComplete = true;
-                }
-                if (result.done) {
-                    destination.complete();
-                    return;
-                }
-                args.push(result.value);
-            }
-            if (this.resultSelector) {
-                this._tryresultSelector(args);
-            }
-            else {
-                destination.next(args);
-            }
-            if (shouldComplete) {
-                destination.complete();
-            }
-        };
-        ZipSubscriber.prototype._tryresultSelector = function (args) {
-            var result;
-            try {
-                result = this.resultSelector.apply(this, args);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            this.destination.next(result);
-        };
-        return ZipSubscriber;
-    }(Subscriber));
-    var StaticIterator = (function () {
-        function StaticIterator(iterator$$1) {
-            this.iterator = iterator$$1;
-            this.nextResult = iterator$$1.next();
-        }
-        StaticIterator.prototype.hasValue = function () {
-            return true;
-        };
-        StaticIterator.prototype.next = function () {
-            var result = this.nextResult;
-            this.nextResult = this.iterator.next();
-            return result;
-        };
-        StaticIterator.prototype.hasCompleted = function () {
-            var nextResult = this.nextResult;
-            return nextResult && nextResult.done;
-        };
-        return StaticIterator;
-    }());
-    var StaticArrayIterator = (function () {
-        function StaticArrayIterator(array) {
-            this.array = array;
-            this.index = 0;
-            this.length = 0;
-            this.length = array.length;
-        }
-        StaticArrayIterator.prototype[iterator] = function () {
-            return this;
-        };
-        StaticArrayIterator.prototype.next = function (value) {
-            var i = this.index++;
-            var array = this.array;
-            return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
-        };
-        StaticArrayIterator.prototype.hasValue = function () {
-            return this.array.length > this.index;
-        };
-        StaticArrayIterator.prototype.hasCompleted = function () {
-            return this.array.length === this.index;
-        };
-        return StaticArrayIterator;
-    }());
-    var ZipBufferIterator = (function (_super) {
-        __extends(ZipBufferIterator, _super);
-        function ZipBufferIterator(destination, parent, observable) {
-            var _this = _super.call(this, destination) || this;
-            _this.parent = parent;
-            _this.observable = observable;
-            _this.stillUnsubscribed = true;
-            _this.buffer = [];
-            _this.isComplete = false;
-            return _this;
-        }
-        ZipBufferIterator.prototype[iterator] = function () {
-            return this;
-        };
-        ZipBufferIterator.prototype.next = function () {
-            var buffer = this.buffer;
-            if (buffer.length === 0 && this.isComplete) {
-                return { value: null, done: true };
-            }
-            else {
-                return { value: buffer.shift(), done: false };
-            }
-        };
-        ZipBufferIterator.prototype.hasValue = function () {
-            return this.buffer.length > 0;
-        };
-        ZipBufferIterator.prototype.hasCompleted = function () {
-            return this.buffer.length === 0 && this.isComplete;
-        };
-        ZipBufferIterator.prototype.notifyComplete = function () {
-            if (this.buffer.length > 0) {
-                this.isComplete = true;
-                this.parent.notifyInactive();
-            }
-            else {
-                this.destination.complete();
-            }
-        };
-        ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.buffer.push(innerValue);
-            this.parent.checkIterators();
-        };
-        ZipBufferIterator.prototype.subscribe = function (value, index) {
-            return subscribeToResult(this, this.observable, this, index);
-        };
-        return ZipBufferIterator;
-    }(OuterSubscriber));
-
-    function audit(durationSelector) {
-        return function auditOperatorFunction(source) {
-            return source.lift(new AuditOperator(durationSelector));
-        };
-    }
-    var AuditOperator = (function () {
-        function AuditOperator(durationSelector) {
-            this.durationSelector = durationSelector;
-        }
-        AuditOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector));
-        };
-        return AuditOperator;
-    }());
-    var AuditSubscriber = (function (_super) {
-        __extends(AuditSubscriber, _super);
-        function AuditSubscriber(destination, durationSelector) {
-            var _this = _super.call(this, destination) || this;
-            _this.durationSelector = durationSelector;
-            _this.hasValue = false;
-            return _this;
-        }
-        AuditSubscriber.prototype._next = function (value) {
-            this.value = value;
-            this.hasValue = true;
-            if (!this.throttled) {
-                var duration = void 0;
-                try {
-                    var durationSelector = this.durationSelector;
-                    duration = durationSelector(value);
-                }
-                catch (err) {
-                    return this.destination.error(err);
-                }
-                var innerSubscription = subscribeToResult(this, duration);
-                if (!innerSubscription || innerSubscription.closed) {
-                    this.clearThrottle();
-                }
-                else {
-                    this.add(this.throttled = innerSubscription);
-                }
-            }
-        };
-        AuditSubscriber.prototype.clearThrottle = function () {
-            var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled;
-            if (throttled) {
-                this.remove(throttled);
-                this.throttled = null;
-                throttled.unsubscribe();
-            }
-            if (hasValue) {
-                this.value = null;
-                this.hasValue = false;
-                this.destination.next(value);
-            }
-        };
-        AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {
-            this.clearThrottle();
-        };
-        AuditSubscriber.prototype.notifyComplete = function () {
-            this.clearThrottle();
-        };
-        return AuditSubscriber;
-    }(OuterSubscriber));
-
-    function auditTime(duration, scheduler) {
-        if (scheduler === void 0) { scheduler = async; }
-        return audit(function () { return timer(duration, scheduler); });
-    }
-
-    function buffer(closingNotifier) {
-        return function bufferOperatorFunction(source) {
-            return source.lift(new BufferOperator(closingNotifier));
-        };
-    }
-    var BufferOperator = (function () {
-        function BufferOperator(closingNotifier) {
-            this.closingNotifier = closingNotifier;
-        }
-        BufferOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
-        };
-        return BufferOperator;
-    }());
-    var BufferSubscriber = (function (_super) {
-        __extends(BufferSubscriber, _super);
-        function BufferSubscriber(destination, closingNotifier) {
-            var _this = _super.call(this, destination) || this;
-            _this.buffer = [];
-            _this.add(subscribeToResult(_this, closingNotifier));
-            return _this;
-        }
-        BufferSubscriber.prototype._next = function (value) {
-            this.buffer.push(value);
-        };
-        BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            var buffer = this.buffer;
-            this.buffer = [];
-            this.destination.next(buffer);
-        };
-        return BufferSubscriber;
-    }(OuterSubscriber));
-
-    function bufferCount(bufferSize, startBufferEvery) {
-        if (startBufferEvery === void 0) { startBufferEvery = null; }
-        return function bufferCountOperatorFunction(source) {
-            return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));
-        };
-    }
-    var BufferCountOperator = (function () {
-        function BufferCountOperator(bufferSize, startBufferEvery) {
-            this.bufferSize = bufferSize;
-            this.startBufferEvery = startBufferEvery;
-            if (!startBufferEvery || bufferSize === startBufferEvery) {
-                this.subscriberClass = BufferCountSubscriber;
-            }
-            else {
-                this.subscriberClass = BufferSkipCountSubscriber;
-            }
-        }
-        BufferCountOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
-        };
-        return BufferCountOperator;
-    }());
-    var BufferCountSubscriber = (function (_super) {
-        __extends(BufferCountSubscriber, _super);
-        function BufferCountSubscriber(destination, bufferSize) {
-            var _this = _super.call(this, destination) || this;
-            _this.bufferSize = bufferSize;
-            _this.buffer = [];
-            return _this;
-        }
-        BufferCountSubscriber.prototype._next = function (value) {
-            var buffer = this.buffer;
-            buffer.push(value);
-            if (buffer.length == this.bufferSize) {
-                this.destination.next(buffer);
-                this.buffer = [];
-            }
-        };
-        BufferCountSubscriber.prototype._complete = function () {
-            var buffer = this.buffer;
-            if (buffer.length > 0) {
-                this.destination.next(buffer);
-            }
-            _super.prototype._complete.call(this);
-        };
-        return BufferCountSubscriber;
-    }(Subscriber));
-    var BufferSkipCountSubscriber = (function (_super) {
-        __extends(BufferSkipCountSubscriber, _super);
-        function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {
-            var _this = _super.call(this, destination) || this;
-            _this.bufferSize = bufferSize;
-            _this.startBufferEvery = startBufferEvery;
-            _this.buffers = [];
-            _this.count = 0;
-            return _this;
-        }
-        BufferSkipCountSubscriber.prototype._next = function (value) {
-            var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;
-            this.count++;
-            if (count % startBufferEvery === 0) {
-                buffers.push([]);
-            }
-            for (var i = buffers.length; i--;) {
-                var buffer = buffers[i];
-                buffer.push(value);
-                if (buffer.length === bufferSize) {
-                    buffers.splice(i, 1);
-                    this.destination.next(buffer);
-                }
-            }
-        };
-        BufferSkipCountSubscriber.prototype._complete = function () {
-            var _a = this, buffers = _a.buffers, destination = _a.destination;
-            while (buffers.length > 0) {
-                var buffer = buffers.shift();
-                if (buffer.length > 0) {
-                    destination.next(buffer);
-                }
-            }
-            _super.prototype._complete.call(this);
-        };
-        return BufferSkipCountSubscriber;
-    }(Subscriber));
-
-    function bufferTime(bufferTimeSpan) {
-        var length = arguments.length;
-        var scheduler = async;
-        if (isScheduler(arguments[arguments.length - 1])) {
-            scheduler = arguments[arguments.length - 1];
-            length--;
-        }
-        var bufferCreationInterval = null;
-        if (length >= 2) {
-            bufferCreationInterval = arguments[1];
-        }
-        var maxBufferSize = Number.POSITIVE_INFINITY;
-        if (length >= 3) {
-            maxBufferSize = arguments[2];
-        }
-        return function bufferTimeOperatorFunction(source) {
-            return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));
-        };
-    }
-    var BufferTimeOperator = (function () {
-        function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
-            this.bufferTimeSpan = bufferTimeSpan;
-            this.bufferCreationInterval = bufferCreationInterval;
-            this.maxBufferSize = maxBufferSize;
-            this.scheduler = scheduler;
-        }
-        BufferTimeOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler));
-        };
-        return BufferTimeOperator;
-    }());
-    var Context = (function () {
-        function Context() {
-            this.buffer = [];
-        }
-        return Context;
-    }());
-    var BufferTimeSubscriber = (function (_super) {
-        __extends(BufferTimeSubscriber, _super);
-        function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
-            var _this = _super.call(this, destination) || this;
-            _this.bufferTimeSpan = bufferTimeSpan;
-            _this.bufferCreationInterval = bufferCreationInterval;
-            _this.maxBufferSize = maxBufferSize;
-            _this.scheduler = scheduler;
-            _this.contexts = [];
-            var context = _this.openContext();
-            _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;
-            if (_this.timespanOnly) {
-                var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan };
-                _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-            }
-            else {
-                var closeState = { subscriber: _this, context: context };
-                var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler };
-                _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState));
-                _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState));
-            }
-            return _this;
-        }
-        BufferTimeSubscriber.prototype._next = function (value) {
-            var contexts = this.contexts;
-            var len = contexts.length;
-            var filledBufferContext;
-            for (var i = 0; i < len; i++) {
-                var context_1 = contexts[i];
-                var buffer = context_1.buffer;
-                buffer.push(value);
-                if (buffer.length == this.maxBufferSize) {
-                    filledBufferContext = context_1;
-                }
-            }
-            if (filledBufferContext) {
-                this.onBufferFull(filledBufferContext);
-            }
-        };
-        BufferTimeSubscriber.prototype._error = function (err) {
-            this.contexts.length = 0;
-            _super.prototype._error.call(this, err);
-        };
-        BufferTimeSubscriber.prototype._complete = function () {
-            var _a = this, contexts = _a.contexts, destination = _a.destination;
-            while (contexts.length > 0) {
-                var context_2 = contexts.shift();
-                destination.next(context_2.buffer);
-            }
-            _super.prototype._complete.call(this);
-        };
-        BufferTimeSubscriber.prototype._unsubscribe = function () {
-            this.contexts = null;
-        };
-        BufferTimeSubscriber.prototype.onBufferFull = function (context) {
-            this.closeContext(context);
-            var closeAction = context.closeAction;
-            closeAction.unsubscribe();
-            this.remove(closeAction);
-            if (!this.closed && this.timespanOnly) {
-                context = this.openContext();
-                var bufferTimeSpan = this.bufferTimeSpan;
-                var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan };
-                this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-            }
-        };
-        BufferTimeSubscriber.prototype.openContext = function () {
-            var context = new Context();
-            this.contexts.push(context);
-            return context;
-        };
-        BufferTimeSubscriber.prototype.closeContext = function (context) {
-            this.destination.next(context.buffer);
-            var contexts = this.contexts;
-            var spliceIndex = contexts ? contexts.indexOf(context) : -1;
-            if (spliceIndex >= 0) {
-                contexts.splice(contexts.indexOf(context), 1);
-            }
-        };
-        return BufferTimeSubscriber;
-    }(Subscriber));
-    function dispatchBufferTimeSpanOnly(state) {
-        var subscriber = state.subscriber;
-        var prevContext = state.context;
-        if (prevContext) {
-            subscriber.closeContext(prevContext);
-        }
-        if (!subscriber.closed) {
-            state.context = subscriber.openContext();
-            state.context.closeAction = this.schedule(state, state.bufferTimeSpan);
-        }
-    }
-    function dispatchBufferCreation(state) {
-        var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler;
-        var context = subscriber.openContext();
-        var action = this;
-        if (!subscriber.closed) {
-            subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context }));
-            action.schedule(state, bufferCreationInterval);
-        }
-    }
-    function dispatchBufferClose(arg) {
-        var subscriber = arg.subscriber, context = arg.context;
-        subscriber.closeContext(context);
-    }
-
-    function bufferToggle(openings, closingSelector) {
-        return function bufferToggleOperatorFunction(source) {
-            return source.lift(new BufferToggleOperator(openings, closingSelector));
-        };
-    }
-    var BufferToggleOperator = (function () {
-        function BufferToggleOperator(openings, closingSelector) {
-            this.openings = openings;
-            this.closingSelector = closingSelector;
-        }
-        BufferToggleOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));
-        };
-        return BufferToggleOperator;
-    }());
-    var BufferToggleSubscriber = (function (_super) {
-        __extends(BufferToggleSubscriber, _super);
-        function BufferToggleSubscriber(destination, openings, closingSelector) {
-            var _this = _super.call(this, destination) || this;
-            _this.openings = openings;
-            _this.closingSelector = closingSelector;
-            _this.contexts = [];
-            _this.add(subscribeToResult(_this, openings));
-            return _this;
-        }
-        BufferToggleSubscriber.prototype._next = function (value) {
-            var contexts = this.contexts;
-            var len = contexts.length;
-            for (var i = 0; i < len; i++) {
-                contexts[i].buffer.push(value);
-            }
-        };
-        BufferToggleSubscriber.prototype._error = function (err) {
-            var contexts = this.contexts;
-            while (contexts.length > 0) {
-                var context_1 = contexts.shift();
-                context_1.subscription.unsubscribe();
-                context_1.buffer = null;
-                context_1.subscription = null;
-            }
-            this.contexts = null;
-            _super.prototype._error.call(this, err);
-        };
-        BufferToggleSubscriber.prototype._complete = function () {
-            var contexts = this.contexts;
-            while (contexts.length > 0) {
-                var context_2 = contexts.shift();
-                this.destination.next(context_2.buffer);
-                context_2.subscription.unsubscribe();
-                context_2.buffer = null;
-                context_2.subscription = null;
-            }
-            this.contexts = null;
-            _super.prototype._complete.call(this);
-        };
-        BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
-        };
-        BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) {
-            this.closeBuffer(innerSub.context);
-        };
-        BufferToggleSubscriber.prototype.openBuffer = function (value) {
-            try {
-                var closingSelector = this.closingSelector;
-                var closingNotifier = closingSelector.call(this, value);
-                if (closingNotifier) {
-                    this.trySubscribe(closingNotifier);
-                }
-            }
-            catch (err) {
-                this._error(err);
-            }
-        };
-        BufferToggleSubscriber.prototype.closeBuffer = function (context) {
-            var contexts = this.contexts;
-            if (contexts && context) {
-                var buffer = context.buffer, subscription = context.subscription;
-                this.destination.next(buffer);
-                contexts.splice(contexts.indexOf(context), 1);
-                this.remove(subscription);
-                subscription.unsubscribe();
-            }
-        };
-        BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) {
-            var contexts = this.contexts;
-            var buffer = [];
-            var subscription = new Subscription();
-            var context = { buffer: buffer, subscription: subscription };
-            contexts.push(context);
-            var innerSubscription = subscribeToResult(this, closingNotifier, context);
-            if (!innerSubscription || innerSubscription.closed) {
-                this.closeBuffer(context);
-            }
-            else {
-                innerSubscription.context = context;
-                this.add(innerSubscription);
-                subscription.add(innerSubscription);
-            }
-        };
-        return BufferToggleSubscriber;
-    }(OuterSubscriber));
-
-    function bufferWhen(closingSelector) {
-        return function (source) {
-            return source.lift(new BufferWhenOperator(closingSelector));
-        };
-    }
-    var BufferWhenOperator = (function () {
-        function BufferWhenOperator(closingSelector) {
-            this.closingSelector = closingSelector;
-        }
-        BufferWhenOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));
-        };
-        return BufferWhenOperator;
-    }());
-    var BufferWhenSubscriber = (function (_super) {
-        __extends(BufferWhenSubscriber, _super);
-        function BufferWhenSubscriber(destination, closingSelector) {
-            var _this = _super.call(this, destination) || this;
-            _this.closingSelector = closingSelector;
-            _this.subscribing = false;
-            _this.openBuffer();
-            return _this;
-        }
-        BufferWhenSubscriber.prototype._next = function (value) {
-            this.buffer.push(value);
-        };
-        BufferWhenSubscriber.prototype._complete = function () {
-            var buffer = this.buffer;
-            if (buffer) {
-                this.destination.next(buffer);
-            }
-            _super.prototype._complete.call(this);
-        };
-        BufferWhenSubscriber.prototype._unsubscribe = function () {
-            this.buffer = null;
-            this.subscribing = false;
-        };
-        BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.openBuffer();
-        };
-        BufferWhenSubscriber.prototype.notifyComplete = function () {
-            if (this.subscribing) {
-                this.complete();
-            }
-            else {
-                this.openBuffer();
-            }
-        };
-        BufferWhenSubscriber.prototype.openBuffer = function () {
-            var closingSubscription = this.closingSubscription;
-            if (closingSubscription) {
-                this.remove(closingSubscription);
-                closingSubscription.unsubscribe();
-            }
-            var buffer = this.buffer;
-            if (this.buffer) {
-                this.destination.next(buffer);
-            }
-            this.buffer = [];
-            var closingNotifier;
-            try {
-                var closingSelector = this.closingSelector;
-                closingNotifier = closingSelector();
-            }
-            catch (err) {
-                return this.error(err);
-            }
-            closingSubscription = new Subscription();
-            this.closingSubscription = closingSubscription;
-            this.add(closingSubscription);
-            this.subscribing = true;
-            closingSubscription.add(subscribeToResult(this, closingNotifier));
-            this.subscribing = false;
-        };
-        return BufferWhenSubscriber;
-    }(OuterSubscriber));
-
-    function catchError(selector) {
-        return function catchErrorOperatorFunction(source) {
-            var operator = new CatchOperator(selector);
-            var caught = source.lift(operator);
-            return (operator.caught = caught);
-        };
-    }
-    var CatchOperator = (function () {
-        function CatchOperator(selector) {
-            this.selector = selector;
-        }
-        CatchOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));
-        };
-        return CatchOperator;
-    }());
-    var CatchSubscriber = (function (_super) {
-        __extends(CatchSubscriber, _super);
-        function CatchSubscriber(destination, selector, caught) {
-            var _this = _super.call(this, destination) || this;
-            _this.selector = selector;
-            _this.caught = caught;
-            return _this;
-        }
-        CatchSubscriber.prototype.error = function (err) {
-            if (!this.isStopped) {
-                var result = void 0;
-                try {
-                    result = this.selector(err, this.caught);
-                }
-                catch (err2) {
-                    _super.prototype.error.call(this, err2);
-                    return;
-                }
-                this._unsubscribeAndRecycle();
-                var innerSubscriber = new InnerSubscriber(this, undefined, undefined);
-                this.add(innerSubscriber);
-                var innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-                if (innerSubscription !== innerSubscriber) {
-                    this.add(innerSubscription);
-                }
-            }
-        };
-        return CatchSubscriber;
-    }(OuterSubscriber));
-
-    function combineAll(project) {
-        return function (source) { return source.lift(new CombineLatestOperator(project)); };
-    }
-
-    function combineLatest$1() {
-        var observables = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            observables[_i] = arguments[_i];
-        }
-        var project = null;
-        if (typeof observables[observables.length - 1] === 'function') {
-            project = observables.pop();
-        }
-        if (observables.length === 1 && isArray(observables[0])) {
-            observables = observables[0].slice();
-        }
-        return function (source) { return source.lift.call(from([source].concat(observables)), new CombineLatestOperator(project)); };
-    }
-
-    function concat$1() {
-        var observables = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            observables[_i] = arguments[_i];
-        }
-        return function (source) { return source.lift.call(concat.apply(void 0, [source].concat(observables))); };
-    }
-
-    function concatMap(project, resultSelector) {
-        return mergeMap(project, resultSelector, 1);
-    }
-
-    function concatMapTo(innerObservable, resultSelector) {
-        return concatMap(function () { return innerObservable; }, resultSelector);
-    }
-
-    function count(predicate) {
-        return function (source) { return source.lift(new CountOperator(predicate, source)); };
-    }
-    var CountOperator = (function () {
-        function CountOperator(predicate, source) {
-            this.predicate = predicate;
-            this.source = source;
-        }
-        CountOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));
-        };
-        return CountOperator;
-    }());
-    var CountSubscriber = (function (_super) {
-        __extends(CountSubscriber, _super);
-        function CountSubscriber(destination, predicate, source) {
-            var _this = _super.call(this, destination) || this;
-            _this.predicate = predicate;
-            _this.source = source;
-            _this.count = 0;
-            _this.index = 0;
-            return _this;
-        }
-        CountSubscriber.prototype._next = function (value) {
-            if (this.predicate) {
-                this._tryPredicate(value);
-            }
-            else {
-                this.count++;
-            }
-        };
-        CountSubscriber.prototype._tryPredicate = function (value) {
-            var result;
-            try {
-                result = this.predicate(value, this.index++, this.source);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            if (result) {
-                this.count++;
-            }
-        };
-        CountSubscriber.prototype._complete = function () {
-            this.destination.next(this.count);
-            this.destination.complete();
-        };
-        return CountSubscriber;
-    }(Subscriber));
-
-    function debounce(durationSelector) {
-        return function (source) { return source.lift(new DebounceOperator(durationSelector)); };
-    }
-    var DebounceOperator = (function () {
-        function DebounceOperator(durationSelector) {
-            this.durationSelector = durationSelector;
-        }
-        DebounceOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));
-        };
-        return DebounceOperator;
-    }());
-    var DebounceSubscriber = (function (_super) {
-        __extends(DebounceSubscriber, _super);
-        function DebounceSubscriber(destination, durationSelector) {
-            var _this = _super.call(this, destination) || this;
-            _this.durationSelector = durationSelector;
-            _this.hasValue = false;
-            _this.durationSubscription = null;
-            return _this;
-        }
-        DebounceSubscriber.prototype._next = function (value) {
-            try {
-                var result = this.durationSelector.call(this, value);
-                if (result) {
-                    this._tryNext(value, result);
-                }
-            }
-            catch (err) {
-                this.destination.error(err);
-            }
-        };
-        DebounceSubscriber.prototype._complete = function () {
-            this.emitValue();
-            this.destination.complete();
-        };
-        DebounceSubscriber.prototype._tryNext = function (value, duration) {
-            var subscription = this.durationSubscription;
-            this.value = value;
-            this.hasValue = true;
-            if (subscription) {
-                subscription.unsubscribe();
-                this.remove(subscription);
-            }
-            subscription = subscribeToResult(this, duration);
-            if (subscription && !subscription.closed) {
-                this.add(this.durationSubscription = subscription);
-            }
-        };
-        DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.emitValue();
-        };
-        DebounceSubscriber.prototype.notifyComplete = function () {
-            this.emitValue();
-        };
-        DebounceSubscriber.prototype.emitValue = function () {
-            if (this.hasValue) {
-                var value = this.value;
-                var subscription = this.durationSubscription;
-                if (subscription) {
-                    this.durationSubscription = null;
-                    subscription.unsubscribe();
-                    this.remove(subscription);
-                }
-                this.value = null;
-                this.hasValue = false;
-                _super.prototype._next.call(this, value);
-            }
-        };
-        return DebounceSubscriber;
-    }(OuterSubscriber));
-
-    function debounceTime(dueTime, scheduler) {
-        if (scheduler === void 0) { scheduler = async; }
-        return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); };
-    }
-    var DebounceTimeOperator = (function () {
-        function DebounceTimeOperator(dueTime, scheduler) {
-            this.dueTime = dueTime;
-            this.scheduler = scheduler;
-        }
-        DebounceTimeOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
-        };
-        return DebounceTimeOperator;
-    }());
-    var DebounceTimeSubscriber = (function (_super) {
-        __extends(DebounceTimeSubscriber, _super);
-        function DebounceTimeSubscriber(destination, dueTime, scheduler) {
-            var _this = _super.call(this, destination) || this;
-            _this.dueTime = dueTime;
-            _this.scheduler = scheduler;
-            _this.debouncedSubscription = null;
-            _this.lastValue = null;
-            _this.hasValue = false;
-            return _this;
-        }
-        DebounceTimeSubscriber.prototype._next = function (value) {
-            this.clearDebounce();
-            this.lastValue = value;
-            this.hasValue = true;
-            this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext$2, this.dueTime, this));
-        };
-        DebounceTimeSubscriber.prototype._complete = function () {
-            this.debouncedNext();
-            this.destination.complete();
-        };
-        DebounceTimeSubscriber.prototype.debouncedNext = function () {
-            this.clearDebounce();
-            if (this.hasValue) {
-                var lastValue = this.lastValue;
-                this.lastValue = null;
-                this.hasValue = false;
-                this.destination.next(lastValue);
-            }
-        };
-        DebounceTimeSubscriber.prototype.clearDebounce = function () {
-            var debouncedSubscription = this.debouncedSubscription;
-            if (debouncedSubscription !== null) {
-                this.remove(debouncedSubscription);
-                debouncedSubscription.unsubscribe();
-                this.debouncedSubscription = null;
-            }
-        };
-        return DebounceTimeSubscriber;
-    }(Subscriber));
-    function dispatchNext$2(subscriber) {
-        subscriber.debouncedNext();
-    }
-
-    function defaultIfEmpty(defaultValue) {
-        if (defaultValue === void 0) { defaultValue = null; }
-        return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); };
-    }
-    var DefaultIfEmptyOperator = (function () {
-        function DefaultIfEmptyOperator(defaultValue) {
-            this.defaultValue = defaultValue;
-        }
-        DefaultIfEmptyOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));
-        };
-        return DefaultIfEmptyOperator;
-    }());
-    var DefaultIfEmptySubscriber = (function (_super) {
-        __extends(DefaultIfEmptySubscriber, _super);
-        function DefaultIfEmptySubscriber(destination, defaultValue) {
-            var _this = _super.call(this, destination) || this;
-            _this.defaultValue = defaultValue;
-            _this.isEmpty = true;
-            return _this;
-        }
-        DefaultIfEmptySubscriber.prototype._next = function (value) {
-            this.isEmpty = false;
-            this.destination.next(value);
-        };
-        DefaultIfEmptySubscriber.prototype._complete = function () {
-            if (this.isEmpty) {
-                this.destination.next(this.defaultValue);
-            }
-            this.destination.complete();
-        };
-        return DefaultIfEmptySubscriber;
-    }(Subscriber));
-
-    function isDate(value) {
-        return value instanceof Date && !isNaN(+value);
-    }
-
-    function delay(delay, scheduler) {
-        if (scheduler === void 0) { scheduler = async; }
-        var absoluteDelay = isDate(delay);
-        var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);
-        return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); };
-    }
-    var DelayOperator = (function () {
-        function DelayOperator(delay, scheduler) {
-            this.delay = delay;
-            this.scheduler = scheduler;
-        }
-        DelayOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));
-        };
-        return DelayOperator;
-    }());
-    var DelaySubscriber = (function (_super) {
-        __extends(DelaySubscriber, _super);
-        function DelaySubscriber(destination, delay, scheduler) {
-            var _this = _super.call(this, destination) || this;
-            _this.delay = delay;
-            _this.scheduler = scheduler;
-            _this.queue = [];
-            _this.active = false;
-            _this.errored = false;
-            return _this;
-        }
-        DelaySubscriber.dispatch = function (state) {
-            var source = state.source;
-            var queue = source.queue;
-            var scheduler = state.scheduler;
-            var destination = state.destination;
-            while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {
-                queue.shift().notification.observe(destination);
-            }
-            if (queue.length > 0) {
-                var delay_1 = Math.max(0, queue[0].time - scheduler.now());
-                this.schedule(state, delay_1);
-            }
-            else {
-                this.unsubscribe();
-                source.active = false;
-            }
-        };
-        DelaySubscriber.prototype._schedule = function (scheduler) {
-            this.active = true;
-            var destination = this.destination;
-            destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {
-                source: this, destination: this.destination, scheduler: scheduler
-            }));
-        };
-        DelaySubscriber.prototype.scheduleNotification = function (notification) {
-            if (this.errored === true) {
-                return;
-            }
-            var scheduler = this.scheduler;
-            var message = new DelayMessage(scheduler.now() + this.delay, notification);
-            this.queue.push(message);
-            if (this.active === false) {
-                this._schedule(scheduler);
-            }
-        };
-        DelaySubscriber.prototype._next = function (value) {
-            this.scheduleNotification(Notification.createNext(value));
-        };
-        DelaySubscriber.prototype._error = function (err) {
-            this.errored = true;
-            this.queue = [];
-            this.destination.error(err);
-            this.unsubscribe();
-        };
-        DelaySubscriber.prototype._complete = function () {
-            this.scheduleNotification(Notification.createComplete());
-            this.unsubscribe();
-        };
-        return DelaySubscriber;
-    }(Subscriber));
-    var DelayMessage = (function () {
-        function DelayMessage(time, notification) {
-            this.time = time;
-            this.notification = notification;
-        }
-        return DelayMessage;
-    }());
-
-    function delayWhen(delayDurationSelector, subscriptionDelay) {
-        if (subscriptionDelay) {
-            return function (source) {
-                return new SubscriptionDelayObservable(source, subscriptionDelay)
-                    .lift(new DelayWhenOperator(delayDurationSelector));
-            };
-        }
-        return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); };
-    }
-    var DelayWhenOperator = (function () {
-        function DelayWhenOperator(delayDurationSelector) {
-            this.delayDurationSelector = delayDurationSelector;
-        }
-        DelayWhenOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));
-        };
-        return DelayWhenOperator;
-    }());
-    var DelayWhenSubscriber = (function (_super) {
-        __extends(DelayWhenSubscriber, _super);
-        function DelayWhenSubscriber(destination, delayDurationSelector) {
-            var _this = _super.call(this, destination) || this;
-            _this.delayDurationSelector = delayDurationSelector;
-            _this.completed = false;
-            _this.delayNotifierSubscriptions = [];
-            _this.index = 0;
-            return _this;
-        }
-        DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.destination.next(outerValue);
-            this.removeSubscription(innerSub);
-            this.tryComplete();
-        };
-        DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) {
-            this._error(error);
-        };
-        DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) {
-            var value = this.removeSubscription(innerSub);
-            if (value) {
-                this.destination.next(value);
-            }
-            this.tryComplete();
-        };
-        DelayWhenSubscriber.prototype._next = function (value) {
-            var index = this.index++;
-            try {
-                var delayNotifier = this.delayDurationSelector(value, index);
-                if (delayNotifier) {
-                    this.tryDelay(delayNotifier, value);
-                }
-            }
-            catch (err) {
-                this.destination.error(err);
-            }
-        };
-        DelayWhenSubscriber.prototype._complete = function () {
-            this.completed = true;
-            this.tryComplete();
-            this.unsubscribe();
-        };
-        DelayWhenSubscriber.prototype.removeSubscription = function (subscription) {
-            subscription.unsubscribe();
-            var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);
-            if (subscriptionIdx !== -1) {
-                this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);
-            }
-            return subscription.outerValue;
-        };
-        DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) {
-            var notifierSubscription = subscribeToResult(this, delayNotifier, value);
-            if (notifierSubscription && !notifierSubscription.closed) {
-                var destination = this.destination;
-                destination.add(notifierSubscription);
-                this.delayNotifierSubscriptions.push(notifierSubscription);
-            }
-        };
-        DelayWhenSubscriber.prototype.tryComplete = function () {
-            if (this.completed && this.delayNotifierSubscriptions.length === 0) {
-                this.destination.complete();
-            }
-        };
-        return DelayWhenSubscriber;
-    }(OuterSubscriber));
-    var SubscriptionDelayObservable = (function (_super) {
-        __extends(SubscriptionDelayObservable, _super);
-        function SubscriptionDelayObservable(source, subscriptionDelay) {
-            var _this = _super.call(this) || this;
-            _this.source = source;
-            _this.subscriptionDelay = subscriptionDelay;
-            return _this;
-        }
-        SubscriptionDelayObservable.prototype._subscribe = function (subscriber) {
-            this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));
-        };
-        return SubscriptionDelayObservable;
-    }(Observable));
-    var SubscriptionDelaySubscriber = (function (_super) {
-        __extends(SubscriptionDelaySubscriber, _super);
-        function SubscriptionDelaySubscriber(parent, source) {
-            var _this = _super.call(this) || this;
-            _this.parent = parent;
-            _this.source = source;
-            _this.sourceSubscribed = false;
-            return _this;
-        }
-        SubscriptionDelaySubscriber.prototype._next = function (unused) {
-            this.subscribeToSource();
-        };
-        SubscriptionDelaySubscriber.prototype._error = function (err) {
-            this.unsubscribe();
-            this.parent.error(err);
-        };
-        SubscriptionDelaySubscriber.prototype._complete = function () {
-            this.unsubscribe();
-            this.subscribeToSource();
-        };
-        SubscriptionDelaySubscriber.prototype.subscribeToSource = function () {
-            if (!this.sourceSubscribed) {
-                this.sourceSubscribed = true;
-                this.unsubscribe();
-                this.source.subscribe(this.parent);
-            }
-        };
-        return SubscriptionDelaySubscriber;
-    }(Subscriber));
-
-    function dematerialize() {
-        return function dematerializeOperatorFunction(source) {
-            return source.lift(new DeMaterializeOperator());
-        };
-    }
-    var DeMaterializeOperator = (function () {
-        function DeMaterializeOperator() {
-        }
-        DeMaterializeOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new DeMaterializeSubscriber(subscriber));
-        };
-        return DeMaterializeOperator;
-    }());
-    var DeMaterializeSubscriber = (function (_super) {
-        __extends(DeMaterializeSubscriber, _super);
-        function DeMaterializeSubscriber(destination) {
-            return _super.call(this, destination) || this;
-        }
-        DeMaterializeSubscriber.prototype._next = function (value) {
-            value.observe(this.destination);
-        };
-        return DeMaterializeSubscriber;
-    }(Subscriber));
-
-    function distinct(keySelector, flushes) {
-        return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); };
-    }
-    var DistinctOperator = (function () {
-        function DistinctOperator(keySelector, flushes) {
-            this.keySelector = keySelector;
-            this.flushes = flushes;
-        }
-        DistinctOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));
-        };
-        return DistinctOperator;
-    }());
-    var DistinctSubscriber = (function (_super) {
-        __extends(DistinctSubscriber, _super);
-        function DistinctSubscriber(destination, keySelector, flushes) {
-            var _this = _super.call(this, destination) || this;
-            _this.keySelector = keySelector;
-            _this.values = new Set();
-            if (flushes) {
-                _this.add(subscribeToResult(_this, flushes));
-            }
-            return _this;
-        }
-        DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.values.clear();
-        };
-        DistinctSubscriber.prototype.notifyError = function (error, innerSub) {
-            this._error(error);
-        };
-        DistinctSubscriber.prototype._next = function (value) {
-            if (this.keySelector) {
-                this._useKeySelector(value);
-            }
-            else {
-                this._finalizeNext(value, value);
-            }
-        };
-        DistinctSubscriber.prototype._useKeySelector = function (value) {
-            var key;
-            var destination = this.destination;
-            try {
-                key = this.keySelector(value);
-            }
-            catch (err) {
-                destination.error(err);
-                return;
-            }
-            this._finalizeNext(key, value);
-        };
-        DistinctSubscriber.prototype._finalizeNext = function (key, value) {
-            var values = this.values;
-            if (!values.has(key)) {
-                values.add(key);
-                this.destination.next(value);
-            }
-        };
-        return DistinctSubscriber;
-    }(OuterSubscriber));
-
-    function distinctUntilChanged(compare, keySelector) {
-        return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); };
-    }
-    var DistinctUntilChangedOperator = (function () {
-        function DistinctUntilChangedOperator(compare, keySelector) {
-            this.compare = compare;
-            this.keySelector = keySelector;
-        }
-        DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
-        };
-        return DistinctUntilChangedOperator;
-    }());
-    var DistinctUntilChangedSubscriber = (function (_super) {
-        __extends(DistinctUntilChangedSubscriber, _super);
-        function DistinctUntilChangedSubscriber(destination, compare, keySelector) {
-            var _this = _super.call(this, destination) || this;
-            _this.keySelector = keySelector;
-            _this.hasKey = false;
-            if (typeof compare === 'function') {
-                _this.compare = compare;
-            }
-            return _this;
-        }
-        DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {
-            return x === y;
-        };
-        DistinctUntilChangedSubscriber.prototype._next = function (value) {
-            var key;
-            try {
-                var keySelector = this.keySelector;
-                key = keySelector ? keySelector(value) : value;
-            }
-            catch (err) {
-                return this.destination.error(err);
-            }
-            var result = false;
-            if (this.hasKey) {
-                try {
-                    var compare = this.compare;
-                    result = compare(this.key, key);
-                }
-                catch (err) {
-                    return this.destination.error(err);
-                }
-            }
-            else {
-                this.hasKey = true;
-            }
-            if (!result) {
-                this.key = key;
-                this.destination.next(value);
-            }
-        };
-        return DistinctUntilChangedSubscriber;
-    }(Subscriber));
-
-    function distinctUntilKeyChanged(key, compare) {
-        return distinctUntilChanged(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });
-    }
-
-    function throwIfEmpty(errorFactory) {
-        if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }
-        return function (source) {
-            return source.lift(new ThrowIfEmptyOperator(errorFactory));
-        };
-    }
-    var ThrowIfEmptyOperator = (function () {
-        function ThrowIfEmptyOperator(errorFactory) {
-            this.errorFactory = errorFactory;
-        }
-        ThrowIfEmptyOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory));
-        };
-        return ThrowIfEmptyOperator;
-    }());
-    var ThrowIfEmptySubscriber = (function (_super) {
-        __extends(ThrowIfEmptySubscriber, _super);
-        function ThrowIfEmptySubscriber(destination, errorFactory) {
-            var _this = _super.call(this, destination) || this;
-            _this.errorFactory = errorFactory;
-            _this.hasValue = false;
-            return _this;
-        }
-        ThrowIfEmptySubscriber.prototype._next = function (value) {
-            this.hasValue = true;
-            this.destination.next(value);
-        };
-        ThrowIfEmptySubscriber.prototype._complete = function () {
-            if (!this.hasValue) {
-                var err = void 0;
-                try {
-                    err = this.errorFactory();
-                }
-                catch (e) {
-                    err = e;
-                }
-                this.destination.error(err);
-            }
-            else {
-                return this.destination.complete();
-            }
-        };
-        return ThrowIfEmptySubscriber;
-    }(Subscriber));
-    function defaultErrorFactory() {
-        return new EmptyError();
-    }
-
-    function take(count) {
-        return function (source) {
-            if (count === 0) {
-                return empty$1();
-            }
-            else {
-                return source.lift(new TakeOperator(count));
-            }
-        };
-    }
-    var TakeOperator = (function () {
-        function TakeOperator(total) {
-            this.total = total;
-            if (this.total < 0) {
-                throw new ArgumentOutOfRangeError;
-            }
-        }
-        TakeOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new TakeSubscriber(subscriber, this.total));
-        };
-        return TakeOperator;
-    }());
-    var TakeSubscriber = (function (_super) {
-        __extends(TakeSubscriber, _super);
-        function TakeSubscriber(destination, total) {
-            var _this = _super.call(this, destination) || this;
-            _this.total = total;
-            _this.count = 0;
-            return _this;
-        }
-        TakeSubscriber.prototype._next = function (value) {
-            var total = this.total;
-            var count = ++this.count;
-            if (count <= total) {
-                this.destination.next(value);
-                if (count === total) {
-                    this.destination.complete();
-                    this.unsubscribe();
-                }
-            }
-        };
-        return TakeSubscriber;
-    }(Subscriber));
-
-    function elementAt(index, defaultValue) {
-        if (index < 0) {
-            throw new ArgumentOutOfRangeError();
-        }
-        var hasDefaultValue = arguments.length >= 2;
-        return function (source) { return source.pipe(filter(function (v, i) { return i === index; }), take(1), hasDefaultValue
-            ? defaultIfEmpty(defaultValue)
-            : throwIfEmpty(function () { return new ArgumentOutOfRangeError(); })); };
-    }
-
-    function endWith() {
-        var array = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            array[_i] = arguments[_i];
-        }
-        return function (source) { return concat(source, of.apply(void 0, array)); };
-    }
-
-    function every(predicate, thisArg) {
-        return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); };
-    }
-    var EveryOperator = (function () {
-        function EveryOperator(predicate, thisArg, source) {
-            this.predicate = predicate;
-            this.thisArg = thisArg;
-            this.source = source;
-        }
-        EveryOperator.prototype.call = function (observer, source) {
-            return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));
-        };
-        return EveryOperator;
-    }());
-    var EverySubscriber = (function (_super) {
-        __extends(EverySubscriber, _super);
-        function EverySubscriber(destination, predicate, thisArg, source) {
-            var _this = _super.call(this, destination) || this;
-            _this.predicate = predicate;
-            _this.thisArg = thisArg;
-            _this.source = source;
-            _this.index = 0;
-            _this.thisArg = thisArg || _this;
-            return _this;
-        }
-        EverySubscriber.prototype.notifyComplete = function (everyValueMatch) {
-            this.destination.next(everyValueMatch);
-            this.destination.complete();
-        };
-        EverySubscriber.prototype._next = function (value) {
-            var result = false;
-            try {
-                result = this.predicate.call(this.thisArg, value, this.index++, this.source);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            if (!result) {
-                this.notifyComplete(false);
-            }
-        };
-        EverySubscriber.prototype._complete = function () {
-            this.notifyComplete(true);
-        };
-        return EverySubscriber;
-    }(Subscriber));
-
-    function exhaust() {
-        return function (source) { return source.lift(new SwitchFirstOperator()); };
-    }
-    var SwitchFirstOperator = (function () {
-        function SwitchFirstOperator() {
-        }
-        SwitchFirstOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new SwitchFirstSubscriber(subscriber));
-        };
-        return SwitchFirstOperator;
-    }());
-    var SwitchFirstSubscriber = (function (_super) {
-        __extends(SwitchFirstSubscriber, _super);
-        function SwitchFirstSubscriber(destination) {
-            var _this = _super.call(this, destination) || this;
-            _this.hasCompleted = false;
-            _this.hasSubscription = false;
-            return _this;
-        }
-        SwitchFirstSubscriber.prototype._next = function (value) {
-            if (!this.hasSubscription) {
-                this.hasSubscription = true;
-                this.add(subscribeToResult(this, value));
-            }
-        };
-        SwitchFirstSubscriber.prototype._complete = function () {
-            this.hasCompleted = true;
-            if (!this.hasSubscription) {
-                this.destination.complete();
-            }
-        };
-        SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) {
-            this.remove(innerSub);
-            this.hasSubscription = false;
-            if (this.hasCompleted) {
-                this.destination.complete();
-            }
-        };
-        return SwitchFirstSubscriber;
-    }(OuterSubscriber));
-
-    function exhaustMap(project, resultSelector) {
-        if (resultSelector) {
-            return function (source) { return source.pipe(exhaustMap(function (a, i) { return from(project(a, i)).pipe(map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
-        }
-        return function (source) {
-            return source.lift(new ExhaustMapOperator(project));
-        };
-    }
-    var ExhaustMapOperator = (function () {
-        function ExhaustMapOperator(project) {
-            this.project = project;
-        }
-        ExhaustMapOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project));
-        };
-        return ExhaustMapOperator;
-    }());
-    var ExhaustMapSubscriber = (function (_super) {
-        __extends(ExhaustMapSubscriber, _super);
-        function ExhaustMapSubscriber(destination, project) {
-            var _this = _super.call(this, destination) || this;
-            _this.project = project;
-            _this.hasSubscription = false;
-            _this.hasCompleted = false;
-            _this.index = 0;
-            return _this;
-        }
-        ExhaustMapSubscriber.prototype._next = function (value) {
-            if (!this.hasSubscription) {
-                this.tryNext(value);
-            }
-        };
-        ExhaustMapSubscriber.prototype.tryNext = function (value) {
-            var result;
-            var index = this.index++;
-            try {
-                result = this.project(value, index);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            this.hasSubscription = true;
-            this._innerSub(result, value, index);
-        };
-        ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) {
-            var innerSubscriber = new InnerSubscriber(this, value, index);
-            var destination = this.destination;
-            destination.add(innerSubscriber);
-            var innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-            if (innerSubscription !== innerSubscriber) {
-                destination.add(innerSubscription);
-            }
-        };
-        ExhaustMapSubscriber.prototype._complete = function () {
-            this.hasCompleted = true;
-            if (!this.hasSubscription) {
-                this.destination.complete();
-            }
-            this.unsubscribe();
-        };
-        ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.destination.next(innerValue);
-        };
-        ExhaustMapSubscriber.prototype.notifyError = function (err) {
-            this.destination.error(err);
-        };
-        ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) {
-            var destination = this.destination;
-            destination.remove(innerSub);
-            this.hasSubscription = false;
-            if (this.hasCompleted) {
-                this.destination.complete();
-            }
-        };
-        return ExhaustMapSubscriber;
-    }(OuterSubscriber));
-
-    function expand(project, concurrent, scheduler) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        if (scheduler === void 0) { scheduler = undefined; }
-        concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
-        return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); };
-    }
-    var ExpandOperator = (function () {
-        function ExpandOperator(project, concurrent, scheduler) {
-            this.project = project;
-            this.concurrent = concurrent;
-            this.scheduler = scheduler;
-        }
-        ExpandOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));
-        };
-        return ExpandOperator;
-    }());
-    var ExpandSubscriber = (function (_super) {
-        __extends(ExpandSubscriber, _super);
-        function ExpandSubscriber(destination, project, concurrent, scheduler) {
-            var _this = _super.call(this, destination) || this;
-            _this.project = project;
-            _this.concurrent = concurrent;
-            _this.scheduler = scheduler;
-            _this.index = 0;
-            _this.active = 0;
-            _this.hasCompleted = false;
-            if (concurrent < Number.POSITIVE_INFINITY) {
-                _this.buffer = [];
-            }
-            return _this;
-        }
-        ExpandSubscriber.dispatch = function (arg) {
-            var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;
-            subscriber.subscribeToProjection(result, value, index);
-        };
-        ExpandSubscriber.prototype._next = function (value) {
-            var destination = this.destination;
-            if (destination.closed) {
-                this._complete();
-                return;
-            }
-            var index = this.index++;
-            if (this.active < this.concurrent) {
-                destination.next(value);
-                try {
-                    var project = this.project;
-                    var result = project(value, index);
-                    if (!this.scheduler) {
-                        this.subscribeToProjection(result, value, index);
-                    }
-                    else {
-                        var state = { subscriber: this, result: result, value: value, index: index };
-                        var destination_1 = this.destination;
-                        destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));
-                    }
-                }
-                catch (e) {
-                    destination.error(e);
-                }
-            }
-            else {
-                this.buffer.push(value);
-            }
-        };
-        ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {
-            this.active++;
-            var destination = this.destination;
-            destination.add(subscribeToResult(this, result, value, index));
-        };
-        ExpandSubscriber.prototype._complete = function () {
-            this.hasCompleted = true;
-            if (this.hasCompleted && this.active === 0) {
-                this.destination.complete();
-            }
-            this.unsubscribe();
-        };
-        ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this._next(innerValue);
-        };
-        ExpandSubscriber.prototype.notifyComplete = function (innerSub) {
-            var buffer = this.buffer;
-            var destination = this.destination;
-            destination.remove(innerSub);
-            this.active--;
-            if (buffer && buffer.length > 0) {
-                this._next(buffer.shift());
-            }
-            if (this.hasCompleted && this.active === 0) {
-                this.destination.complete();
-            }
-        };
-        return ExpandSubscriber;
-    }(OuterSubscriber));
-
-    function finalize(callback) {
-        return function (source) { return source.lift(new FinallyOperator(callback)); };
-    }
-    var FinallyOperator = (function () {
-        function FinallyOperator(callback) {
-            this.callback = callback;
-        }
-        FinallyOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new FinallySubscriber(subscriber, this.callback));
-        };
-        return FinallyOperator;
-    }());
-    var FinallySubscriber = (function (_super) {
-        __extends(FinallySubscriber, _super);
-        function FinallySubscriber(destination, callback) {
-            var _this = _super.call(this, destination) || this;
-            _this.add(new Subscription(callback));
-            return _this;
-        }
-        return FinallySubscriber;
-    }(Subscriber));
-
-    function find(predicate, thisArg) {
-        if (typeof predicate !== 'function') {
-            throw new TypeError('predicate is not a function');
-        }
-        return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); };
-    }
-    var FindValueOperator = (function () {
-        function FindValueOperator(predicate, source, yieldIndex, thisArg) {
-            this.predicate = predicate;
-            this.source = source;
-            this.yieldIndex = yieldIndex;
-            this.thisArg = thisArg;
-        }
-        FindValueOperator.prototype.call = function (observer, source) {
-            return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));
-        };
-        return FindValueOperator;
-    }());
-    var FindValueSubscriber = (function (_super) {
-        __extends(FindValueSubscriber, _super);
-        function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) {
-            var _this = _super.call(this, destination) || this;
-            _this.predicate = predicate;
-            _this.source = source;
-            _this.yieldIndex = yieldIndex;
-            _this.thisArg = thisArg;
-            _this.index = 0;
-            return _this;
-        }
-        FindValueSubscriber.prototype.notifyComplete = function (value) {
-            var destination = this.destination;
-            destination.next(value);
-            destination.complete();
-            this.unsubscribe();
-        };
-        FindValueSubscriber.prototype._next = function (value) {
-            var _a = this, predicate = _a.predicate, thisArg = _a.thisArg;
-            var index = this.index++;
-            try {
-                var result = predicate.call(thisArg || this, value, index, this.source);
-                if (result) {
-                    this.notifyComplete(this.yieldIndex ? index : value);
-                }
-            }
-            catch (err) {
-                this.destination.error(err);
-            }
-        };
-        FindValueSubscriber.prototype._complete = function () {
-            this.notifyComplete(this.yieldIndex ? -1 : undefined);
-        };
-        return FindValueSubscriber;
-    }(Subscriber));
-
-    function findIndex(predicate, thisArg) {
-        return function (source) { return source.lift(new FindValueOperator(predicate, source, true, thisArg)); };
-    }
-
-    function first(predicate, defaultValue) {
-        var hasDefaultValue = arguments.length >= 2;
-        return function (source) { return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); })); };
-    }
-
-    function ignoreElements() {
-        return function ignoreElementsOperatorFunction(source) {
-            return source.lift(new IgnoreElementsOperator());
-        };
-    }
-    var IgnoreElementsOperator = (function () {
-        function IgnoreElementsOperator() {
-        }
-        IgnoreElementsOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new IgnoreElementsSubscriber(subscriber));
-        };
-        return IgnoreElementsOperator;
-    }());
-    var IgnoreElementsSubscriber = (function (_super) {
-        __extends(IgnoreElementsSubscriber, _super);
-        function IgnoreElementsSubscriber() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        IgnoreElementsSubscriber.prototype._next = function (unused) {
-        };
-        return IgnoreElementsSubscriber;
-    }(Subscriber));
-
-    function isEmpty() {
-        return function (source) { return source.lift(new IsEmptyOperator()); };
-    }
-    var IsEmptyOperator = (function () {
-        function IsEmptyOperator() {
-        }
-        IsEmptyOperator.prototype.call = function (observer, source) {
-            return source.subscribe(new IsEmptySubscriber(observer));
-        };
-        return IsEmptyOperator;
-    }());
-    var IsEmptySubscriber = (function (_super) {
-        __extends(IsEmptySubscriber, _super);
-        function IsEmptySubscriber(destination) {
-            return _super.call(this, destination) || this;
-        }
-        IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) {
-            var destination = this.destination;
-            destination.next(isEmpty);
-            destination.complete();
-        };
-        IsEmptySubscriber.prototype._next = function (value) {
-            this.notifyComplete(false);
-        };
-        IsEmptySubscriber.prototype._complete = function () {
-            this.notifyComplete(true);
-        };
-        return IsEmptySubscriber;
-    }(Subscriber));
-
-    function takeLast(count) {
-        return function takeLastOperatorFunction(source) {
-            if (count === 0) {
-                return empty$1();
-            }
-            else {
-                return source.lift(new TakeLastOperator(count));
-            }
-        };
-    }
-    var TakeLastOperator = (function () {
-        function TakeLastOperator(total) {
-            this.total = total;
-            if (this.total < 0) {
-                throw new ArgumentOutOfRangeError;
-            }
-        }
-        TakeLastOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new TakeLastSubscriber(subscriber, this.total));
-        };
-        return TakeLastOperator;
-    }());
-    var TakeLastSubscriber = (function (_super) {
-        __extends(TakeLastSubscriber, _super);
-        function TakeLastSubscriber(destination, total) {
-            var _this = _super.call(this, destination) || this;
-            _this.total = total;
-            _this.ring = new Array();
-            _this.count = 0;
-            return _this;
-        }
-        TakeLastSubscriber.prototype._next = function (value) {
-            var ring = this.ring;
-            var total = this.total;
-            var count = this.count++;
-            if (ring.length < total) {
-                ring.push(value);
-            }
-            else {
-                var index = count % total;
-                ring[index] = value;
-            }
-        };
-        TakeLastSubscriber.prototype._complete = function () {
-            var destination = this.destination;
-            var count = this.count;
-            if (count > 0) {
-                var total = this.count >= this.total ? this.total : this.count;
-                var ring = this.ring;
-                for (var i = 0; i < total; i++) {
-                    var idx = (count++) % total;
-                    destination.next(ring[idx]);
-                }
-            }
-            destination.complete();
-        };
-        return TakeLastSubscriber;
-    }(Subscriber));
-
-    function last(predicate, defaultValue) {
-        var hasDefaultValue = arguments.length >= 2;
-        return function (source) { return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, takeLast(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); })); };
-    }
-
-    function mapTo(value) {
-        return function (source) { return source.lift(new MapToOperator(value)); };
-    }
-    var MapToOperator = (function () {
-        function MapToOperator(value) {
-            this.value = value;
-        }
-        MapToOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new MapToSubscriber(subscriber, this.value));
-        };
-        return MapToOperator;
-    }());
-    var MapToSubscriber = (function (_super) {
-        __extends(MapToSubscriber, _super);
-        function MapToSubscriber(destination, value) {
-            var _this = _super.call(this, destination) || this;
-            _this.value = value;
-            return _this;
-        }
-        MapToSubscriber.prototype._next = function (x) {
-            this.destination.next(this.value);
-        };
-        return MapToSubscriber;
-    }(Subscriber));
-
-    function materialize() {
-        return function materializeOperatorFunction(source) {
-            return source.lift(new MaterializeOperator());
-        };
-    }
-    var MaterializeOperator = (function () {
-        function MaterializeOperator() {
-        }
-        MaterializeOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new MaterializeSubscriber(subscriber));
-        };
-        return MaterializeOperator;
-    }());
-    var MaterializeSubscriber = (function (_super) {
-        __extends(MaterializeSubscriber, _super);
-        function MaterializeSubscriber(destination) {
-            return _super.call(this, destination) || this;
-        }
-        MaterializeSubscriber.prototype._next = function (value) {
-            this.destination.next(Notification.createNext(value));
-        };
-        MaterializeSubscriber.prototype._error = function (err) {
-            var destination = this.destination;
-            destination.next(Notification.createError(err));
-            destination.complete();
-        };
-        MaterializeSubscriber.prototype._complete = function () {
-            var destination = this.destination;
-            destination.next(Notification.createComplete());
-            destination.complete();
-        };
-        return MaterializeSubscriber;
-    }(Subscriber));
-
-    function scan(accumulator, seed) {
-        var hasSeed = false;
-        if (arguments.length >= 2) {
-            hasSeed = true;
-        }
-        return function scanOperatorFunction(source) {
-            return source.lift(new ScanOperator(accumulator, seed, hasSeed));
-        };
-    }
-    var ScanOperator = (function () {
-        function ScanOperator(accumulator, seed, hasSeed) {
-            if (hasSeed === void 0) { hasSeed = false; }
-            this.accumulator = accumulator;
-            this.seed = seed;
-            this.hasSeed = hasSeed;
-        }
-        ScanOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));
-        };
-        return ScanOperator;
-    }());
-    var ScanSubscriber = (function (_super) {
-        __extends(ScanSubscriber, _super);
-        function ScanSubscriber(destination, accumulator, _seed, hasSeed) {
-            var _this = _super.call(this, destination) || this;
-            _this.accumulator = accumulator;
-            _this._seed = _seed;
-            _this.hasSeed = hasSeed;
-            _this.index = 0;
-            return _this;
-        }
-        Object.defineProperty(ScanSubscriber.prototype, "seed", {
-            get: function () {
-                return this._seed;
-            },
-            set: function (value) {
-                this.hasSeed = true;
-                this._seed = value;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        ScanSubscriber.prototype._next = function (value) {
-            if (!this.hasSeed) {
-                this.seed = value;
-                this.destination.next(value);
-            }
-            else {
-                return this._tryNext(value);
-            }
-        };
-        ScanSubscriber.prototype._tryNext = function (value) {
-            var index = this.index++;
-            var result;
-            try {
-                result = this.accumulator(this.seed, value, index);
-            }
-            catch (err) {
-                this.destination.error(err);
-            }
-            this.seed = result;
-            this.destination.next(result);
-        };
-        return ScanSubscriber;
-    }(Subscriber));
-
-    function reduce(accumulator, seed) {
-        if (arguments.length >= 2) {
-            return function reduceOperatorFunctionWithSeed(source) {
-                return pipe(scan(accumulator, seed), takeLast(1), defaultIfEmpty(seed))(source);
-            };
-        }
-        return function reduceOperatorFunction(source) {
-            return pipe(scan(function (acc, value, index) { return accumulator(acc, value, index + 1); }), takeLast(1))(source);
-        };
-    }
-
-    function max(comparer) {
-        var max = (typeof comparer === 'function')
-            ? function (x, y) { return comparer(x, y) > 0 ? x : y; }
-            : function (x, y) { return x > y ? x : y; };
-        return reduce(max);
-    }
-
-    function merge$1() {
-        var observables = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            observables[_i] = arguments[_i];
-        }
-        return function (source) { return source.lift.call(merge.apply(void 0, [source].concat(observables))); };
-    }
-
-    function mergeMapTo(innerObservable, resultSelector, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        if (typeof resultSelector === 'function') {
-            return mergeMap(function () { return innerObservable; }, resultSelector, concurrent);
-        }
-        if (typeof resultSelector === 'number') {
-            concurrent = resultSelector;
-        }
-        return mergeMap(function () { return innerObservable; }, concurrent);
-    }
-
-    function mergeScan(accumulator, seed, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); };
-    }
-    var MergeScanOperator = (function () {
-        function MergeScanOperator(accumulator, seed, concurrent) {
-            this.accumulator = accumulator;
-            this.seed = seed;
-            this.concurrent = concurrent;
-        }
-        MergeScanOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));
-        };
-        return MergeScanOperator;
-    }());
-    var MergeScanSubscriber = (function (_super) {
-        __extends(MergeScanSubscriber, _super);
-        function MergeScanSubscriber(destination, accumulator, acc, concurrent) {
-            var _this = _super.call(this, destination) || this;
-            _this.accumulator = accumulator;
-            _this.acc = acc;
-            _this.concurrent = concurrent;
-            _this.hasValue = false;
-            _this.hasCompleted = false;
-            _this.buffer = [];
-            _this.active = 0;
-            _this.index = 0;
-            return _this;
-        }
-        MergeScanSubscriber.prototype._next = function (value) {
-            if (this.active < this.concurrent) {
-                var index = this.index++;
-                var destination = this.destination;
-                var ish = void 0;
-                try {
-                    var accumulator = this.accumulator;
-                    ish = accumulator(this.acc, value, index);
-                }
-                catch (e) {
-                    return destination.error(e);
-                }
-                this.active++;
-                this._innerSub(ish, value, index);
-            }
-            else {
-                this.buffer.push(value);
-            }
-        };
-        MergeScanSubscriber.prototype._innerSub = function (ish, value, index) {
-            var innerSubscriber = new InnerSubscriber(this, value, index);
-            var destination = this.destination;
-            destination.add(innerSubscriber);
-            var innerSubscription = subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
-            if (innerSubscription !== innerSubscriber) {
-                destination.add(innerSubscription);
-            }
-        };
-        MergeScanSubscriber.prototype._complete = function () {
-            this.hasCompleted = true;
-            if (this.active === 0 && this.buffer.length === 0) {
-                if (this.hasValue === false) {
-                    this.destination.next(this.acc);
-                }
-                this.destination.complete();
-            }
-            this.unsubscribe();
-        };
-        MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            var destination = this.destination;
-            this.acc = innerValue;
-            this.hasValue = true;
-            destination.next(innerValue);
-        };
-        MergeScanSubscriber.prototype.notifyComplete = function (innerSub) {
-            var buffer = this.buffer;
-            var destination = this.destination;
-            destination.remove(innerSub);
-            this.active--;
-            if (buffer.length > 0) {
-                this._next(buffer.shift());
-            }
-            else if (this.active === 0 && this.hasCompleted) {
-                if (this.hasValue === false) {
-                    this.destination.next(this.acc);
-                }
-                this.destination.complete();
-            }
-        };
-        return MergeScanSubscriber;
-    }(OuterSubscriber));
-
-    function min(comparer) {
-        var min = (typeof comparer === 'function')
-            ? function (x, y) { return comparer(x, y) < 0 ? x : y; }
-            : function (x, y) { return x < y ? x : y; };
-        return reduce(min);
-    }
-
-    function multicast(subjectOrSubjectFactory, selector) {
-        return function multicastOperatorFunction(source) {
-            var subjectFactory;
-            if (typeof subjectOrSubjectFactory === 'function') {
-                subjectFactory = subjectOrSubjectFactory;
-            }
-            else {
-                subjectFactory = function subjectFactory() {
-                    return subjectOrSubjectFactory;
-                };
-            }
-            if (typeof selector === 'function') {
-                return source.lift(new MulticastOperator(subjectFactory, selector));
-            }
-            var connectable = Object.create(source, connectableObservableDescriptor);
-            connectable.source = source;
-            connectable.subjectFactory = subjectFactory;
-            return connectable;
-        };
-    }
-    var MulticastOperator = (function () {
-        function MulticastOperator(subjectFactory, selector) {
-            this.subjectFactory = subjectFactory;
-            this.selector = selector;
-        }
-        MulticastOperator.prototype.call = function (subscriber, source) {
-            var selector = this.selector;
-            var subject = this.subjectFactory();
-            var subscription = selector(subject).subscribe(subscriber);
-            subscription.add(source.subscribe(subject));
-            return subscription;
-        };
-        return MulticastOperator;
-    }());
-
-    function onErrorResumeNext$1() {
-        var nextSources = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            nextSources[_i] = arguments[_i];
-        }
-        if (nextSources.length === 1 && isArray(nextSources[0])) {
-            nextSources = nextSources[0];
-        }
-        return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); };
-    }
-    var OnErrorResumeNextOperator = (function () {
-        function OnErrorResumeNextOperator(nextSources) {
-            this.nextSources = nextSources;
-        }
-        OnErrorResumeNextOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));
-        };
-        return OnErrorResumeNextOperator;
-    }());
-    var OnErrorResumeNextSubscriber = (function (_super) {
-        __extends(OnErrorResumeNextSubscriber, _super);
-        function OnErrorResumeNextSubscriber(destination, nextSources) {
-            var _this = _super.call(this, destination) || this;
-            _this.destination = destination;
-            _this.nextSources = nextSources;
-            return _this;
-        }
-        OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) {
-            this.subscribeToNextSource();
-        };
-        OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) {
-            this.subscribeToNextSource();
-        };
-        OnErrorResumeNextSubscriber.prototype._error = function (err) {
-            this.subscribeToNextSource();
-            this.unsubscribe();
-        };
-        OnErrorResumeNextSubscriber.prototype._complete = function () {
-            this.subscribeToNextSource();
-            this.unsubscribe();
-        };
-        OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () {
-            var next = this.nextSources.shift();
-            if (!!next) {
-                var innerSubscriber = new InnerSubscriber(this, undefined, undefined);
-                var destination = this.destination;
-                destination.add(innerSubscriber);
-                var innerSubscription = subscribeToResult(this, next, undefined, undefined, innerSubscriber);
-                if (innerSubscription !== innerSubscriber) {
-                    destination.add(innerSubscription);
-                }
-            }
-            else {
-                this.destination.complete();
-            }
-        };
-        return OnErrorResumeNextSubscriber;
-    }(OuterSubscriber));
-
-    function pairwise() {
-        return function (source) { return source.lift(new PairwiseOperator()); };
-    }
-    var PairwiseOperator = (function () {
-        function PairwiseOperator() {
-        }
-        PairwiseOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new PairwiseSubscriber(subscriber));
-        };
-        return PairwiseOperator;
-    }());
-    var PairwiseSubscriber = (function (_super) {
-        __extends(PairwiseSubscriber, _super);
-        function PairwiseSubscriber(destination) {
-            var _this = _super.call(this, destination) || this;
-            _this.hasPrev = false;
-            return _this;
-        }
-        PairwiseSubscriber.prototype._next = function (value) {
-            var pair;
-            if (this.hasPrev) {
-                pair = [this.prev, value];
-            }
-            else {
-                this.hasPrev = true;
-            }
-            this.prev = value;
-            if (pair) {
-                this.destination.next(pair);
-            }
-        };
-        return PairwiseSubscriber;
-    }(Subscriber));
-
-    function partition$1(predicate, thisArg) {
-        return function (source) { return [
-            filter(predicate, thisArg)(source),
-            filter(not(predicate, thisArg))(source)
-        ]; };
-    }
-
-    function pluck() {
-        var properties = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            properties[_i] = arguments[_i];
-        }
-        var length = properties.length;
-        if (length === 0) {
-            throw new Error('list of properties cannot be empty.');
-        }
-        return function (source) { return map(plucker(properties, length))(source); };
-    }
-    function plucker(props, length) {
-        var mapper = function (x) {
-            var currentProp = x;
-            for (var i = 0; i < length; i++) {
-                var p = currentProp[props[i]];
-                if (typeof p !== 'undefined') {
-                    currentProp = p;
-                }
-                else {
-                    return undefined;
-                }
-            }
-            return currentProp;
-        };
-        return mapper;
-    }
-
-    function publish(selector) {
-        return selector ?
-            multicast(function () { return new Subject(); }, selector) :
-            multicast(new Subject());
-    }
-
-    function publishBehavior(value) {
-        return function (source) { return multicast(new BehaviorSubject(value))(source); };
-    }
-
-    function publishLast() {
-        return function (source) { return multicast(new AsyncSubject())(source); };
-    }
-
-    function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {
-        if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {
-            scheduler = selectorOrScheduler;
-        }
-        var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;
-        var subject = new ReplaySubject(bufferSize, windowTime, scheduler);
-        return function (source) { return multicast(function () { return subject; }, selector)(source); };
-    }
-
-    function race$1() {
-        var observables = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            observables[_i] = arguments[_i];
-        }
-        return function raceOperatorFunction(source) {
-            if (observables.length === 1 && isArray(observables[0])) {
-                observables = observables[0];
-            }
-            return source.lift.call(race.apply(void 0, [source].concat(observables)));
-        };
-    }
-
-    function repeat(count) {
-        if (count === void 0) { count = -1; }
-        return function (source) {
-            if (count === 0) {
-                return empty$1();
-            }
-            else if (count < 0) {
-                return source.lift(new RepeatOperator(-1, source));
-            }
-            else {
-                return source.lift(new RepeatOperator(count - 1, source));
-            }
-        };
-    }
-    var RepeatOperator = (function () {
-        function RepeatOperator(count, source) {
-            this.count = count;
-            this.source = source;
-        }
-        RepeatOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));
-        };
-        return RepeatOperator;
-    }());
-    var RepeatSubscriber = (function (_super) {
-        __extends(RepeatSubscriber, _super);
-        function RepeatSubscriber(destination, count, source) {
-            var _this = _super.call(this, destination) || this;
-            _this.count = count;
-            _this.source = source;
-            return _this;
-        }
-        RepeatSubscriber.prototype.complete = function () {
-            if (!this.isStopped) {
-                var _a = this, source = _a.source, count = _a.count;
-                if (count === 0) {
-                    return _super.prototype.complete.call(this);
-                }
-                else if (count > -1) {
-                    this.count = count - 1;
-                }
-                source.subscribe(this._unsubscribeAndRecycle());
-            }
-        };
-        return RepeatSubscriber;
-    }(Subscriber));
-
-    function repeatWhen(notifier) {
-        return function (source) { return source.lift(new RepeatWhenOperator(notifier)); };
-    }
-    var RepeatWhenOperator = (function () {
-        function RepeatWhenOperator(notifier) {
-            this.notifier = notifier;
-        }
-        RepeatWhenOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));
-        };
-        return RepeatWhenOperator;
-    }());
-    var RepeatWhenSubscriber = (function (_super) {
-        __extends(RepeatWhenSubscriber, _super);
-        function RepeatWhenSubscriber(destination, notifier, source) {
-            var _this = _super.call(this, destination) || this;
-            _this.notifier = notifier;
-            _this.source = source;
-            _this.sourceIsBeingSubscribedTo = true;
-            return _this;
-        }
-        RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.sourceIsBeingSubscribedTo = true;
-            this.source.subscribe(this);
-        };
-        RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) {
-            if (this.sourceIsBeingSubscribedTo === false) {
-                return _super.prototype.complete.call(this);
-            }
-        };
-        RepeatWhenSubscriber.prototype.complete = function () {
-            this.sourceIsBeingSubscribedTo = false;
-            if (!this.isStopped) {
-                if (!this.retries) {
-                    this.subscribeToRetries();
-                }
-                if (!this.retriesSubscription || this.retriesSubscription.closed) {
-                    return _super.prototype.complete.call(this);
-                }
-                this._unsubscribeAndRecycle();
-                this.notifications.next();
-            }
-        };
-        RepeatWhenSubscriber.prototype._unsubscribe = function () {
-            var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription;
-            if (notifications) {
-                notifications.unsubscribe();
-                this.notifications = null;
-            }
-            if (retriesSubscription) {
-                retriesSubscription.unsubscribe();
-                this.retriesSubscription = null;
-            }
-            this.retries = null;
-        };
-        RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () {
-            var _unsubscribe = this._unsubscribe;
-            this._unsubscribe = null;
-            _super.prototype._unsubscribeAndRecycle.call(this);
-            this._unsubscribe = _unsubscribe;
-            return this;
-        };
-        RepeatWhenSubscriber.prototype.subscribeToRetries = function () {
-            this.notifications = new Subject();
-            var retries;
-            try {
-                var notifier = this.notifier;
-                retries = notifier(this.notifications);
-            }
-            catch (e) {
-                return _super.prototype.complete.call(this);
-            }
-            this.retries = retries;
-            this.retriesSubscription = subscribeToResult(this, retries);
-        };
-        return RepeatWhenSubscriber;
-    }(OuterSubscriber));
-
-    function retry(count) {
-        if (count === void 0) { count = -1; }
-        return function (source) { return source.lift(new RetryOperator(count, source)); };
-    }
-    var RetryOperator = (function () {
-        function RetryOperator(count, source) {
-            this.count = count;
-            this.source = source;
-        }
-        RetryOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));
-        };
-        return RetryOperator;
-    }());
-    var RetrySubscriber = (function (_super) {
-        __extends(RetrySubscriber, _super);
-        function RetrySubscriber(destination, count, source) {
-            var _this = _super.call(this, destination) || this;
-            _this.count = count;
-            _this.source = source;
-            return _this;
-        }
-        RetrySubscriber.prototype.error = function (err) {
-            if (!this.isStopped) {
-                var _a = this, source = _a.source, count = _a.count;
-                if (count === 0) {
-                    return _super.prototype.error.call(this, err);
-                }
-                else if (count > -1) {
-                    this.count = count - 1;
-                }
-                source.subscribe(this._unsubscribeAndRecycle());
-            }
-        };
-        return RetrySubscriber;
-    }(Subscriber));
-
-    function retryWhen(notifier) {
-        return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); };
-    }
-    var RetryWhenOperator = (function () {
-        function RetryWhenOperator(notifier, source) {
-            this.notifier = notifier;
-            this.source = source;
-        }
-        RetryWhenOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));
-        };
-        return RetryWhenOperator;
-    }());
-    var RetryWhenSubscriber = (function (_super) {
-        __extends(RetryWhenSubscriber, _super);
-        function RetryWhenSubscriber(destination, notifier, source) {
-            var _this = _super.call(this, destination) || this;
-            _this.notifier = notifier;
-            _this.source = source;
-            return _this;
-        }
-        RetryWhenSubscriber.prototype.error = function (err) {
-            if (!this.isStopped) {
-                var errors = this.errors;
-                var retries = this.retries;
-                var retriesSubscription = this.retriesSubscription;
-                if (!retries) {
-                    errors = new Subject();
-                    try {
-                        var notifier = this.notifier;
-                        retries = notifier(errors);
-                    }
-                    catch (e) {
-                        return _super.prototype.error.call(this, e);
-                    }
-                    retriesSubscription = subscribeToResult(this, retries);
-                }
-                else {
-                    this.errors = null;
-                    this.retriesSubscription = null;
-                }
-                this._unsubscribeAndRecycle();
-                this.errors = errors;
-                this.retries = retries;
-                this.retriesSubscription = retriesSubscription;
-                errors.next(err);
-            }
-        };
-        RetryWhenSubscriber.prototype._unsubscribe = function () {
-            var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription;
-            if (errors) {
-                errors.unsubscribe();
-                this.errors = null;
-            }
-            if (retriesSubscription) {
-                retriesSubscription.unsubscribe();
-                this.retriesSubscription = null;
-            }
-            this.retries = null;
-        };
-        RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            var _unsubscribe = this._unsubscribe;
-            this._unsubscribe = null;
-            this._unsubscribeAndRecycle();
-            this._unsubscribe = _unsubscribe;
-            this.source.subscribe(this);
-        };
-        return RetryWhenSubscriber;
-    }(OuterSubscriber));
-
-    function sample(notifier) {
-        return function (source) { return source.lift(new SampleOperator(notifier)); };
-    }
-    var SampleOperator = (function () {
-        function SampleOperator(notifier) {
-            this.notifier = notifier;
-        }
-        SampleOperator.prototype.call = function (subscriber, source) {
-            var sampleSubscriber = new SampleSubscriber(subscriber);
-            var subscription = source.subscribe(sampleSubscriber);
-            subscription.add(subscribeToResult(sampleSubscriber, this.notifier));
-            return subscription;
-        };
-        return SampleOperator;
-    }());
-    var SampleSubscriber = (function (_super) {
-        __extends(SampleSubscriber, _super);
-        function SampleSubscriber() {
-            var _this = _super !== null && _super.apply(this, arguments) || this;
-            _this.hasValue = false;
-            return _this;
-        }
-        SampleSubscriber.prototype._next = function (value) {
-            this.value = value;
-            this.hasValue = true;
-        };
-        SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.emitValue();
-        };
-        SampleSubscriber.prototype.notifyComplete = function () {
-            this.emitValue();
-        };
-        SampleSubscriber.prototype.emitValue = function () {
-            if (this.hasValue) {
-                this.hasValue = false;
-                this.destination.next(this.value);
-            }
-        };
-        return SampleSubscriber;
-    }(OuterSubscriber));
-
-    function sampleTime(period, scheduler) {
-        if (scheduler === void 0) { scheduler = async; }
-        return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); };
-    }
-    var SampleTimeOperator = (function () {
-        function SampleTimeOperator(period, scheduler) {
-            this.period = period;
-            this.scheduler = scheduler;
-        }
-        SampleTimeOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));
-        };
-        return SampleTimeOperator;
-    }());
-    var SampleTimeSubscriber = (function (_super) {
-        __extends(SampleTimeSubscriber, _super);
-        function SampleTimeSubscriber(destination, period, scheduler) {
-            var _this = _super.call(this, destination) || this;
-            _this.period = period;
-            _this.scheduler = scheduler;
-            _this.hasValue = false;
-            _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period }));
-            return _this;
-        }
-        SampleTimeSubscriber.prototype._next = function (value) {
-            this.lastValue = value;
-            this.hasValue = true;
-        };
-        SampleTimeSubscriber.prototype.notifyNext = function () {
-            if (this.hasValue) {
-                this.hasValue = false;
-                this.destination.next(this.lastValue);
-            }
-        };
-        return SampleTimeSubscriber;
-    }(Subscriber));
-    function dispatchNotification(state) {
-        var subscriber = state.subscriber, period = state.period;
-        subscriber.notifyNext();
-        this.schedule(state, period);
-    }
-
-    function sequenceEqual(compareTo, comparator) {
-        return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); };
-    }
-    var SequenceEqualOperator = (function () {
-        function SequenceEqualOperator(compareTo, comparator) {
-            this.compareTo = compareTo;
-            this.comparator = comparator;
-        }
-        SequenceEqualOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator));
-        };
-        return SequenceEqualOperator;
-    }());
-    var SequenceEqualSubscriber = (function (_super) {
-        __extends(SequenceEqualSubscriber, _super);
-        function SequenceEqualSubscriber(destination, compareTo, comparator) {
-            var _this = _super.call(this, destination) || this;
-            _this.compareTo = compareTo;
-            _this.comparator = comparator;
-            _this._a = [];
-            _this._b = [];
-            _this._oneComplete = false;
-            _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this)));
-            return _this;
-        }
-        SequenceEqualSubscriber.prototype._next = function (value) {
-            if (this._oneComplete && this._b.length === 0) {
-                this.emit(false);
-            }
-            else {
-                this._a.push(value);
-                this.checkValues();
-            }
-        };
-        SequenceEqualSubscriber.prototype._complete = function () {
-            if (this._oneComplete) {
-                this.emit(this._a.length === 0 && this._b.length === 0);
-            }
-            else {
-                this._oneComplete = true;
-            }
-            this.unsubscribe();
-        };
-        SequenceEqualSubscriber.prototype.checkValues = function () {
-            var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator;
-            while (_a.length > 0 && _b.length > 0) {
-                var a = _a.shift();
-                var b = _b.shift();
-                var areEqual = false;
-                try {
-                    areEqual = comparator ? comparator(a, b) : a === b;
-                }
-                catch (e) {
-                    this.destination.error(e);
-                }
-                if (!areEqual) {
-                    this.emit(false);
-                }
-            }
-        };
-        SequenceEqualSubscriber.prototype.emit = function (value) {
-            var destination = this.destination;
-            destination.next(value);
-            destination.complete();
-        };
-        SequenceEqualSubscriber.prototype.nextB = function (value) {
-            if (this._oneComplete && this._a.length === 0) {
-                this.emit(false);
-            }
-            else {
-                this._b.push(value);
-                this.checkValues();
-            }
-        };
-        SequenceEqualSubscriber.prototype.completeB = function () {
-            if (this._oneComplete) {
-                this.emit(this._a.length === 0 && this._b.length === 0);
-            }
-            else {
-                this._oneComplete = true;
-            }
-        };
-        return SequenceEqualSubscriber;
-    }(Subscriber));
-    var SequenceEqualCompareToSubscriber = (function (_super) {
-        __extends(SequenceEqualCompareToSubscriber, _super);
-        function SequenceEqualCompareToSubscriber(destination, parent) {
-            var _this = _super.call(this, destination) || this;
-            _this.parent = parent;
-            return _this;
-        }
-        SequenceEqualCompareToSubscriber.prototype._next = function (value) {
-            this.parent.nextB(value);
-        };
-        SequenceEqualCompareToSubscriber.prototype._error = function (err) {
-            this.parent.error(err);
-            this.unsubscribe();
-        };
-        SequenceEqualCompareToSubscriber.prototype._complete = function () {
-            this.parent.completeB();
-            this.unsubscribe();
-        };
-        return SequenceEqualCompareToSubscriber;
-    }(Subscriber));
-
-    function shareSubjectFactory() {
-        return new Subject();
-    }
-    function share() {
-        return function (source) { return refCount()(multicast(shareSubjectFactory)(source)); };
-    }
-
-    function shareReplay(configOrBufferSize, windowTime, scheduler) {
-        var config;
-        if (configOrBufferSize && typeof configOrBufferSize === 'object') {
-            config = configOrBufferSize;
-        }
-        else {
-            config = {
-                bufferSize: configOrBufferSize,
-                windowTime: windowTime,
-                refCount: false,
-                scheduler: scheduler
-            };
-        }
-        return function (source) { return source.lift(shareReplayOperator(config)); };
-    }
-    function shareReplayOperator(_a) {
-        var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler;
-        var subject;
-        var refCount = 0;
-        var subscription;
-        var hasError = false;
-        var isComplete = false;
-        return function shareReplayOperation(source) {
-            refCount++;
-            if (!subject || hasError) {
-                hasError = false;
-                subject = new ReplaySubject(bufferSize, windowTime, scheduler);
-                subscription = source.subscribe({
-                    next: function (value) { subject.next(value); },
-                    error: function (err) {
-                        hasError = true;
-                        subject.error(err);
-                    },
-                    complete: function () {
-                        isComplete = true;
-                        subscription = undefined;
-                        subject.complete();
-                    },
-                });
-            }
-            var innerSub = subject.subscribe(this);
-            this.add(function () {
-                refCount--;
-                innerSub.unsubscribe();
-                if (subscription && !isComplete && useRefCount && refCount === 0) {
-                    subscription.unsubscribe();
-                    subscription = undefined;
-                    subject = undefined;
-                }
-            });
-        };
-    }
-
-    function single(predicate) {
-        return function (source) { return source.lift(new SingleOperator(predicate, source)); };
-    }
-    var SingleOperator = (function () {
-        function SingleOperator(predicate, source) {
-            this.predicate = predicate;
-            this.source = source;
-        }
-        SingleOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));
-        };
-        return SingleOperator;
-    }());
-    var SingleSubscriber = (function (_super) {
-        __extends(SingleSubscriber, _super);
-        function SingleSubscriber(destination, predicate, source) {
-            var _this = _super.call(this, destination) || this;
-            _this.predicate = predicate;
-            _this.source = source;
-            _this.seenValue = false;
-            _this.index = 0;
-            return _this;
-        }
-        SingleSubscriber.prototype.applySingleValue = function (value) {
-            if (this.seenValue) {
-                this.destination.error('Sequence contains more than one element');
-            }
-            else {
-                this.seenValue = true;
-                this.singleValue = value;
-            }
-        };
-        SingleSubscriber.prototype._next = function (value) {
-            var index = this.index++;
-            if (this.predicate) {
-                this.tryNext(value, index);
-            }
-            else {
-                this.applySingleValue(value);
-            }
-        };
-        SingleSubscriber.prototype.tryNext = function (value, index) {
-            try {
-                if (this.predicate(value, index, this.source)) {
-                    this.applySingleValue(value);
-                }
-            }
-            catch (err) {
-                this.destination.error(err);
-            }
-        };
-        SingleSubscriber.prototype._complete = function () {
-            var destination = this.destination;
-            if (this.index > 0) {
-                destination.next(this.seenValue ? this.singleValue : undefined);
-                destination.complete();
-            }
-            else {
-                destination.error(new EmptyError);
-            }
-        };
-        return SingleSubscriber;
-    }(Subscriber));
-
-    function skip(count) {
-        return function (source) { return source.lift(new SkipOperator(count)); };
-    }
-    var SkipOperator = (function () {
-        function SkipOperator(total) {
-            this.total = total;
-        }
-        SkipOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new SkipSubscriber(subscriber, this.total));
-        };
-        return SkipOperator;
-    }());
-    var SkipSubscriber = (function (_super) {
-        __extends(SkipSubscriber, _super);
-        function SkipSubscriber(destination, total) {
-            var _this = _super.call(this, destination) || this;
-            _this.total = total;
-            _this.count = 0;
-            return _this;
-        }
-        SkipSubscriber.prototype._next = function (x) {
-            if (++this.count > this.total) {
-                this.destination.next(x);
-            }
-        };
-        return SkipSubscriber;
-    }(Subscriber));
-
-    function skipLast(count) {
-        return function (source) { return source.lift(new SkipLastOperator(count)); };
-    }
-    var SkipLastOperator = (function () {
-        function SkipLastOperator(_skipCount) {
-            this._skipCount = _skipCount;
-            if (this._skipCount < 0) {
-                throw new ArgumentOutOfRangeError;
-            }
-        }
-        SkipLastOperator.prototype.call = function (subscriber, source) {
-            if (this._skipCount === 0) {
-                return source.subscribe(new Subscriber(subscriber));
-            }
-            else {
-                return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount));
-            }
-        };
-        return SkipLastOperator;
-    }());
-    var SkipLastSubscriber = (function (_super) {
-        __extends(SkipLastSubscriber, _super);
-        function SkipLastSubscriber(destination, _skipCount) {
-            var _this = _super.call(this, destination) || this;
-            _this._skipCount = _skipCount;
-            _this._count = 0;
-            _this._ring = new Array(_skipCount);
-            return _this;
-        }
-        SkipLastSubscriber.prototype._next = function (value) {
-            var skipCount = this._skipCount;
-            var count = this._count++;
-            if (count < skipCount) {
-                this._ring[count] = value;
-            }
-            else {
-                var currentIndex = count % skipCount;
-                var ring = this._ring;
-                var oldValue = ring[currentIndex];
-                ring[currentIndex] = value;
-                this.destination.next(oldValue);
-            }
-        };
-        return SkipLastSubscriber;
-    }(Subscriber));
-
-    function skipUntil(notifier) {
-        return function (source) { return source.lift(new SkipUntilOperator(notifier)); };
-    }
-    var SkipUntilOperator = (function () {
-        function SkipUntilOperator(notifier) {
-            this.notifier = notifier;
-        }
-        SkipUntilOperator.prototype.call = function (destination, source) {
-            return source.subscribe(new SkipUntilSubscriber(destination, this.notifier));
-        };
-        return SkipUntilOperator;
-    }());
-    var SkipUntilSubscriber = (function (_super) {
-        __extends(SkipUntilSubscriber, _super);
-        function SkipUntilSubscriber(destination, notifier) {
-            var _this = _super.call(this, destination) || this;
-            _this.hasValue = false;
-            var innerSubscriber = new InnerSubscriber(_this, undefined, undefined);
-            _this.add(innerSubscriber);
-            _this.innerSubscription = innerSubscriber;
-            var innerSubscription = subscribeToResult(_this, notifier, undefined, undefined, innerSubscriber);
-            if (innerSubscription !== innerSubscriber) {
-                _this.add(innerSubscription);
-                _this.innerSubscription = innerSubscription;
-            }
-            return _this;
-        }
-        SkipUntilSubscriber.prototype._next = function (value) {
-            if (this.hasValue) {
-                _super.prototype._next.call(this, value);
-            }
-        };
-        SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.hasValue = true;
-            if (this.innerSubscription) {
-                this.innerSubscription.unsubscribe();
-            }
-        };
-        SkipUntilSubscriber.prototype.notifyComplete = function () {
-        };
-        return SkipUntilSubscriber;
-    }(OuterSubscriber));
-
-    function skipWhile(predicate) {
-        return function (source) { return source.lift(new SkipWhileOperator(predicate)); };
-    }
-    var SkipWhileOperator = (function () {
-        function SkipWhileOperator(predicate) {
-            this.predicate = predicate;
-        }
-        SkipWhileOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));
-        };
-        return SkipWhileOperator;
-    }());
-    var SkipWhileSubscriber = (function (_super) {
-        __extends(SkipWhileSubscriber, _super);
-        function SkipWhileSubscriber(destination, predicate) {
-            var _this = _super.call(this, destination) || this;
-            _this.predicate = predicate;
-            _this.skipping = true;
-            _this.index = 0;
-            return _this;
-        }
-        SkipWhileSubscriber.prototype._next = function (value) {
-            var destination = this.destination;
-            if (this.skipping) {
-                this.tryCallPredicate(value);
-            }
-            if (!this.skipping) {
-                destination.next(value);
-            }
-        };
-        SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {
-            try {
-                var result = this.predicate(value, this.index++);
-                this.skipping = Boolean(result);
-            }
-            catch (err) {
-                this.destination.error(err);
-            }
-        };
-        return SkipWhileSubscriber;
-    }(Subscriber));
-
-    function startWith() {
-        var array = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            array[_i] = arguments[_i];
-        }
-        var scheduler = array[array.length - 1];
-        if (isScheduler(scheduler)) {
-            array.pop();
-            return function (source) { return concat(array, source, scheduler); };
-        }
-        else {
-            return function (source) { return concat(array, source); };
-        }
-    }
-
-    var SubscribeOnObservable = (function (_super) {
-        __extends(SubscribeOnObservable, _super);
-        function SubscribeOnObservable(source, delayTime, scheduler) {
-            if (delayTime === void 0) { delayTime = 0; }
-            if (scheduler === void 0) { scheduler = asap; }
-            var _this = _super.call(this) || this;
-            _this.source = source;
-            _this.delayTime = delayTime;
-            _this.scheduler = scheduler;
-            if (!isNumeric(delayTime) || delayTime < 0) {
-                _this.delayTime = 0;
-            }
-            if (!scheduler || typeof scheduler.schedule !== 'function') {
-                _this.scheduler = asap;
-            }
-            return _this;
-        }
-        SubscribeOnObservable.create = function (source, delay, scheduler) {
-            if (delay === void 0) { delay = 0; }
-            if (scheduler === void 0) { scheduler = asap; }
-            return new SubscribeOnObservable(source, delay, scheduler);
-        };
-        SubscribeOnObservable.dispatch = function (arg) {
-            var source = arg.source, subscriber = arg.subscriber;
-            return this.add(source.subscribe(subscriber));
-        };
-        SubscribeOnObservable.prototype._subscribe = function (subscriber) {
-            var delay = this.delayTime;
-            var source = this.source;
-            var scheduler = this.scheduler;
-            return scheduler.schedule(SubscribeOnObservable.dispatch, delay, {
-                source: source, subscriber: subscriber
-            });
-        };
-        return SubscribeOnObservable;
-    }(Observable));
-
-    function subscribeOn(scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        return function subscribeOnOperatorFunction(source) {
-            return source.lift(new SubscribeOnOperator(scheduler, delay));
-        };
-    }
-    var SubscribeOnOperator = (function () {
-        function SubscribeOnOperator(scheduler, delay) {
-            this.scheduler = scheduler;
-            this.delay = delay;
-        }
-        SubscribeOnOperator.prototype.call = function (subscriber, source) {
-            return new SubscribeOnObservable(source, this.delay, this.scheduler).subscribe(subscriber);
-        };
-        return SubscribeOnOperator;
-    }());
-
-    function switchMap(project, resultSelector) {
-        if (typeof resultSelector === 'function') {
-            return function (source) { return source.pipe(switchMap(function (a, i) { return from(project(a, i)).pipe(map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
-        }
-        return function (source) { return source.lift(new SwitchMapOperator(project)); };
-    }
-    var SwitchMapOperator = (function () {
-        function SwitchMapOperator(project) {
-            this.project = project;
-        }
-        SwitchMapOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));
-        };
-        return SwitchMapOperator;
-    }());
-    var SwitchMapSubscriber = (function (_super) {
-        __extends(SwitchMapSubscriber, _super);
-        function SwitchMapSubscriber(destination, project) {
-            var _this = _super.call(this, destination) || this;
-            _this.project = project;
-            _this.index = 0;
-            return _this;
-        }
-        SwitchMapSubscriber.prototype._next = function (value) {
-            var result;
-            var index = this.index++;
-            try {
-                result = this.project(value, index);
-            }
-            catch (error) {
-                this.destination.error(error);
-                return;
-            }
-            this._innerSub(result, value, index);
-        };
-        SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {
-            var innerSubscription = this.innerSubscription;
-            if (innerSubscription) {
-                innerSubscription.unsubscribe();
-            }
-            var innerSubscriber = new InnerSubscriber(this, value, index);
-            var destination = this.destination;
-            destination.add(innerSubscriber);
-            this.innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-            if (this.innerSubscription !== innerSubscriber) {
-                destination.add(this.innerSubscription);
-            }
-        };
-        SwitchMapSubscriber.prototype._complete = function () {
-            var innerSubscription = this.innerSubscription;
-            if (!innerSubscription || innerSubscription.closed) {
-                _super.prototype._complete.call(this);
-            }
-            this.unsubscribe();
-        };
-        SwitchMapSubscriber.prototype._unsubscribe = function () {
-            this.innerSubscription = null;
-        };
-        SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {
-            var destination = this.destination;
-            destination.remove(innerSub);
-            this.innerSubscription = null;
-            if (this.isStopped) {
-                _super.prototype._complete.call(this);
-            }
-        };
-        SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.destination.next(innerValue);
-        };
-        return SwitchMapSubscriber;
-    }(OuterSubscriber));
-
-    function switchAll() {
-        return switchMap(identity);
-    }
-
-    function switchMapTo(innerObservable, resultSelector) {
-        return resultSelector ? switchMap(function () { return innerObservable; }, resultSelector) : switchMap(function () { return innerObservable; });
-    }
-
-    function takeUntil(notifier) {
-        return function (source) { return source.lift(new TakeUntilOperator(notifier)); };
-    }
-    var TakeUntilOperator = (function () {
-        function TakeUntilOperator(notifier) {
-            this.notifier = notifier;
-        }
-        TakeUntilOperator.prototype.call = function (subscriber, source) {
-            var takeUntilSubscriber = new TakeUntilSubscriber(subscriber);
-            var notifierSubscription = subscribeToResult(takeUntilSubscriber, this.notifier);
-            if (notifierSubscription && !takeUntilSubscriber.seenValue) {
-                takeUntilSubscriber.add(notifierSubscription);
-                return source.subscribe(takeUntilSubscriber);
-            }
-            return takeUntilSubscriber;
-        };
-        return TakeUntilOperator;
-    }());
-    var TakeUntilSubscriber = (function (_super) {
-        __extends(TakeUntilSubscriber, _super);
-        function TakeUntilSubscriber(destination) {
-            var _this = _super.call(this, destination) || this;
-            _this.seenValue = false;
-            return _this;
-        }
-        TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.seenValue = true;
-            this.complete();
-        };
-        TakeUntilSubscriber.prototype.notifyComplete = function () {
-        };
-        return TakeUntilSubscriber;
-    }(OuterSubscriber));
-
-    function takeWhile(predicate, inclusive) {
-        if (inclusive === void 0) { inclusive = false; }
-        return function (source) {
-            return source.lift(new TakeWhileOperator(predicate, inclusive));
-        };
-    }
-    var TakeWhileOperator = (function () {
-        function TakeWhileOperator(predicate, inclusive) {
-            this.predicate = predicate;
-            this.inclusive = inclusive;
-        }
-        TakeWhileOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive));
-        };
-        return TakeWhileOperator;
-    }());
-    var TakeWhileSubscriber = (function (_super) {
-        __extends(TakeWhileSubscriber, _super);
-        function TakeWhileSubscriber(destination, predicate, inclusive) {
-            var _this = _super.call(this, destination) || this;
-            _this.predicate = predicate;
-            _this.inclusive = inclusive;
-            _this.index = 0;
-            return _this;
-        }
-        TakeWhileSubscriber.prototype._next = function (value) {
-            var destination = this.destination;
-            var result;
-            try {
-                result = this.predicate(value, this.index++);
-            }
-            catch (err) {
-                destination.error(err);
-                return;
-            }
-            this.nextOrComplete(value, result);
-        };
-        TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {
-            var destination = this.destination;
-            if (Boolean(predicateResult)) {
-                destination.next(value);
-            }
-            else {
-                if (this.inclusive) {
-                    destination.next(value);
-                }
-                destination.complete();
-            }
-        };
-        return TakeWhileSubscriber;
-    }(Subscriber));
-
-    function tap(nextOrObserver, error, complete) {
-        return function tapOperatorFunction(source) {
-            return source.lift(new DoOperator(nextOrObserver, error, complete));
-        };
-    }
-    var DoOperator = (function () {
-        function DoOperator(nextOrObserver, error, complete) {
-            this.nextOrObserver = nextOrObserver;
-            this.error = error;
-            this.complete = complete;
-        }
-        DoOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
-        };
-        return DoOperator;
-    }());
-    var TapSubscriber = (function (_super) {
-        __extends(TapSubscriber, _super);
-        function TapSubscriber(destination, observerOrNext, error, complete) {
-            var _this = _super.call(this, destination) || this;
-            _this._tapNext = noop;
-            _this._tapError = noop;
-            _this._tapComplete = noop;
-            _this._tapError = error || noop;
-            _this._tapComplete = complete || noop;
-            if (isFunction(observerOrNext)) {
-                _this._context = _this;
-                _this._tapNext = observerOrNext;
-            }
-            else if (observerOrNext) {
-                _this._context = observerOrNext;
-                _this._tapNext = observerOrNext.next || noop;
-                _this._tapError = observerOrNext.error || noop;
-                _this._tapComplete = observerOrNext.complete || noop;
-            }
-            return _this;
-        }
-        TapSubscriber.prototype._next = function (value) {
-            try {
-                this._tapNext.call(this._context, value);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            this.destination.next(value);
-        };
-        TapSubscriber.prototype._error = function (err) {
-            try {
-                this._tapError.call(this._context, err);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            this.destination.error(err);
-        };
-        TapSubscriber.prototype._complete = function () {
-            try {
-                this._tapComplete.call(this._context);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            return this.destination.complete();
-        };
-        return TapSubscriber;
-    }(Subscriber));
-
-    var defaultThrottleConfig = {
-        leading: true,
-        trailing: false
-    };
-    function throttle(durationSelector, config) {
-        if (config === void 0) { config = defaultThrottleConfig; }
-        return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); };
-    }
-    var ThrottleOperator = (function () {
-        function ThrottleOperator(durationSelector, leading, trailing) {
-            this.durationSelector = durationSelector;
-            this.leading = leading;
-            this.trailing = trailing;
-        }
-        ThrottleOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));
-        };
-        return ThrottleOperator;
-    }());
-    var ThrottleSubscriber = (function (_super) {
-        __extends(ThrottleSubscriber, _super);
-        function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {
-            var _this = _super.call(this, destination) || this;
-            _this.destination = destination;
-            _this.durationSelector = durationSelector;
-            _this._leading = _leading;
-            _this._trailing = _trailing;
-            _this._hasValue = false;
-            return _this;
-        }
-        ThrottleSubscriber.prototype._next = function (value) {
-            this._hasValue = true;
-            this._sendValue = value;
-            if (!this._throttled) {
-                if (this._leading) {
-                    this.send();
-                }
-                else {
-                    this.throttle(value);
-                }
-            }
-        };
-        ThrottleSubscriber.prototype.send = function () {
-            var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue;
-            if (_hasValue) {
-                this.destination.next(_sendValue);
-                this.throttle(_sendValue);
-            }
-            this._hasValue = false;
-            this._sendValue = null;
-        };
-        ThrottleSubscriber.prototype.throttle = function (value) {
-            var duration = this.tryDurationSelector(value);
-            if (!!duration) {
-                this.add(this._throttled = subscribeToResult(this, duration));
-            }
-        };
-        ThrottleSubscriber.prototype.tryDurationSelector = function (value) {
-            try {
-                return this.durationSelector(value);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return null;
-            }
-        };
-        ThrottleSubscriber.prototype.throttlingDone = function () {
-            var _a = this, _throttled = _a._throttled, _trailing = _a._trailing;
-            if (_throttled) {
-                _throttled.unsubscribe();
-            }
-            this._throttled = null;
-            if (_trailing) {
-                this.send();
-            }
-        };
-        ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.throttlingDone();
-        };
-        ThrottleSubscriber.prototype.notifyComplete = function () {
-            this.throttlingDone();
-        };
-        return ThrottleSubscriber;
-    }(OuterSubscriber));
-
-    function throttleTime(duration, scheduler, config) {
-        if (scheduler === void 0) { scheduler = async; }
-        if (config === void 0) { config = defaultThrottleConfig; }
-        return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); };
-    }
-    var ThrottleTimeOperator = (function () {
-        function ThrottleTimeOperator(duration, scheduler, leading, trailing) {
-            this.duration = duration;
-            this.scheduler = scheduler;
-            this.leading = leading;
-            this.trailing = trailing;
-        }
-        ThrottleTimeOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));
-        };
-        return ThrottleTimeOperator;
-    }());
-    var ThrottleTimeSubscriber = (function (_super) {
-        __extends(ThrottleTimeSubscriber, _super);
-        function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {
-            var _this = _super.call(this, destination) || this;
-            _this.duration = duration;
-            _this.scheduler = scheduler;
-            _this.leading = leading;
-            _this.trailing = trailing;
-            _this._hasTrailingValue = false;
-            _this._trailingValue = null;
-            return _this;
-        }
-        ThrottleTimeSubscriber.prototype._next = function (value) {
-            if (this.throttled) {
-                if (this.trailing) {
-                    this._trailingValue = value;
-                    this._hasTrailingValue = true;
-                }
-            }
-            else {
-                this.add(this.throttled = this.scheduler.schedule(dispatchNext$3, this.duration, { subscriber: this }));
-                if (this.leading) {
-                    this.destination.next(value);
-                }
-                else if (this.trailing) {
-                    this._trailingValue = value;
-                    this._hasTrailingValue = true;
-                }
-            }
-        };
-        ThrottleTimeSubscriber.prototype._complete = function () {
-            if (this._hasTrailingValue) {
-                this.destination.next(this._trailingValue);
-                this.destination.complete();
-            }
-            else {
-                this.destination.complete();
-            }
-        };
-        ThrottleTimeSubscriber.prototype.clearThrottle = function () {
-            var throttled = this.throttled;
-            if (throttled) {
-                if (this.trailing && this._hasTrailingValue) {
-                    this.destination.next(this._trailingValue);
-                    this._trailingValue = null;
-                    this._hasTrailingValue = false;
-                }
-                throttled.unsubscribe();
-                this.remove(throttled);
-                this.throttled = null;
-            }
-        };
-        return ThrottleTimeSubscriber;
-    }(Subscriber));
-    function dispatchNext$3(arg) {
-        var subscriber = arg.subscriber;
-        subscriber.clearThrottle();
-    }
-
-    function timeInterval(scheduler) {
-        if (scheduler === void 0) { scheduler = async; }
-        return function (source) { return defer(function () {
-            return source.pipe(scan(function (_a, value) {
-                var current = _a.current;
-                return ({ value: value, current: scheduler.now(), last: current });
-            }, { current: scheduler.now(), value: undefined, last: undefined }), map(function (_a) {
-                var current = _a.current, last = _a.last, value = _a.value;
-                return new TimeInterval(value, current - last);
-            }));
-        }); };
-    }
-    var TimeInterval = (function () {
-        function TimeInterval(value, interval) {
-            this.value = value;
-            this.interval = interval;
-        }
-        return TimeInterval;
-    }());
-
-    function timeoutWith(due, withObservable, scheduler) {
-        if (scheduler === void 0) { scheduler = async; }
-        return function (source) {
-            var absoluteTimeout = isDate(due);
-            var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);
-            return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));
-        };
-    }
-    var TimeoutWithOperator = (function () {
-        function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) {
-            this.waitFor = waitFor;
-            this.absoluteTimeout = absoluteTimeout;
-            this.withObservable = withObservable;
-            this.scheduler = scheduler;
-        }
-        TimeoutWithOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler));
-        };
-        return TimeoutWithOperator;
-    }());
-    var TimeoutWithSubscriber = (function (_super) {
-        __extends(TimeoutWithSubscriber, _super);
-        function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) {
-            var _this = _super.call(this, destination) || this;
-            _this.absoluteTimeout = absoluteTimeout;
-            _this.waitFor = waitFor;
-            _this.withObservable = withObservable;
-            _this.scheduler = scheduler;
-            _this.action = null;
-            _this.scheduleTimeout();
-            return _this;
-        }
-        TimeoutWithSubscriber.dispatchTimeout = function (subscriber) {
-            var withObservable = subscriber.withObservable;
-            subscriber._unsubscribeAndRecycle();
-            subscriber.add(subscribeToResult(subscriber, withObservable));
-        };
-        TimeoutWithSubscriber.prototype.scheduleTimeout = function () {
-            var action = this.action;
-            if (action) {
-                this.action = action.schedule(this, this.waitFor);
-            }
-            else {
-                this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this));
-            }
-        };
-        TimeoutWithSubscriber.prototype._next = function (value) {
-            if (!this.absoluteTimeout) {
-                this.scheduleTimeout();
-            }
-            _super.prototype._next.call(this, value);
-        };
-        TimeoutWithSubscriber.prototype._unsubscribe = function () {
-            this.action = null;
-            this.scheduler = null;
-            this.withObservable = null;
-        };
-        return TimeoutWithSubscriber;
-    }(OuterSubscriber));
-
-    function timeout(due, scheduler) {
-        if (scheduler === void 0) { scheduler = async; }
-        return timeoutWith(due, throwError(new TimeoutError()), scheduler);
-    }
-
-    function timestamp(scheduler) {
-        if (scheduler === void 0) { scheduler = async; }
-        return map(function (value) { return new Timestamp(value, scheduler.now()); });
-    }
-    var Timestamp = (function () {
-        function Timestamp(value, timestamp) {
-            this.value = value;
-            this.timestamp = timestamp;
-        }
-        return Timestamp;
-    }());
-
-    function toArrayReducer(arr, item, index) {
-        if (index === 0) {
-            return [item];
-        }
-        arr.push(item);
-        return arr;
-    }
-    function toArray() {
-        return reduce(toArrayReducer, []);
-    }
-
-    function window$1(windowBoundaries) {
-        return function windowOperatorFunction(source) {
-            return source.lift(new WindowOperator(windowBoundaries));
-        };
-    }
-    var WindowOperator = (function () {
-        function WindowOperator(windowBoundaries) {
-            this.windowBoundaries = windowBoundaries;
-        }
-        WindowOperator.prototype.call = function (subscriber, source) {
-            var windowSubscriber = new WindowSubscriber(subscriber);
-            var sourceSubscription = source.subscribe(windowSubscriber);
-            if (!sourceSubscription.closed) {
-                windowSubscriber.add(subscribeToResult(windowSubscriber, this.windowBoundaries));
-            }
-            return sourceSubscription;
-        };
-        return WindowOperator;
-    }());
-    var WindowSubscriber = (function (_super) {
-        __extends(WindowSubscriber, _super);
-        function WindowSubscriber(destination) {
-            var _this = _super.call(this, destination) || this;
-            _this.window = new Subject();
-            destination.next(_this.window);
-            return _this;
-        }
-        WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.openWindow();
-        };
-        WindowSubscriber.prototype.notifyError = function (error, innerSub) {
-            this._error(error);
-        };
-        WindowSubscriber.prototype.notifyComplete = function (innerSub) {
-            this._complete();
-        };
-        WindowSubscriber.prototype._next = function (value) {
-            this.window.next(value);
-        };
-        WindowSubscriber.prototype._error = function (err) {
-            this.window.error(err);
-            this.destination.error(err);
-        };
-        WindowSubscriber.prototype._complete = function () {
-            this.window.complete();
-            this.destination.complete();
-        };
-        WindowSubscriber.prototype._unsubscribe = function () {
-            this.window = null;
-        };
-        WindowSubscriber.prototype.openWindow = function () {
-            var prevWindow = this.window;
-            if (prevWindow) {
-                prevWindow.complete();
-            }
-            var destination = this.destination;
-            var newWindow = this.window = new Subject();
-            destination.next(newWindow);
-        };
-        return WindowSubscriber;
-    }(OuterSubscriber));
-
-    function windowCount(windowSize, startWindowEvery) {
-        if (startWindowEvery === void 0) { startWindowEvery = 0; }
-        return function windowCountOperatorFunction(source) {
-            return source.lift(new WindowCountOperator(windowSize, startWindowEvery));
-        };
-    }
-    var WindowCountOperator = (function () {
-        function WindowCountOperator(windowSize, startWindowEvery) {
-            this.windowSize = windowSize;
-            this.startWindowEvery = startWindowEvery;
-        }
-        WindowCountOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));
-        };
-        return WindowCountOperator;
-    }());
-    var WindowCountSubscriber = (function (_super) {
-        __extends(WindowCountSubscriber, _super);
-        function WindowCountSubscriber(destination, windowSize, startWindowEvery) {
-            var _this = _super.call(this, destination) || this;
-            _this.destination = destination;
-            _this.windowSize = windowSize;
-            _this.startWindowEvery = startWindowEvery;
-            _this.windows = [new Subject()];
-            _this.count = 0;
-            destination.next(_this.windows[0]);
-            return _this;
-        }
-        WindowCountSubscriber.prototype._next = function (value) {
-            var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;
-            var destination = this.destination;
-            var windowSize = this.windowSize;
-            var windows = this.windows;
-            var len = windows.length;
-            for (var i = 0; i < len && !this.closed; i++) {
-                windows[i].next(value);
-            }
-            var c = this.count - windowSize + 1;
-            if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {
-                windows.shift().complete();
-            }
-            if (++this.count % startWindowEvery === 0 && !this.closed) {
-                var window_1 = new Subject();
-                windows.push(window_1);
-                destination.next(window_1);
-            }
-        };
-        WindowCountSubscriber.prototype._error = function (err) {
-            var windows = this.windows;
-            if (windows) {
-                while (windows.length > 0 && !this.closed) {
-                    windows.shift().error(err);
-                }
-            }
-            this.destination.error(err);
-        };
-        WindowCountSubscriber.prototype._complete = function () {
-            var windows = this.windows;
-            if (windows) {
-                while (windows.length > 0 && !this.closed) {
-                    windows.shift().complete();
-                }
-            }
-            this.destination.complete();
-        };
-        WindowCountSubscriber.prototype._unsubscribe = function () {
-            this.count = 0;
-            this.windows = null;
-        };
-        return WindowCountSubscriber;
-    }(Subscriber));
-
-    function windowTime(windowTimeSpan) {
-        var scheduler = async;
-        var windowCreationInterval = null;
-        var maxWindowSize = Number.POSITIVE_INFINITY;
-        if (isScheduler(arguments[3])) {
-            scheduler = arguments[3];
-        }
-        if (isScheduler(arguments[2])) {
-            scheduler = arguments[2];
-        }
-        else if (isNumeric(arguments[2])) {
-            maxWindowSize = arguments[2];
-        }
-        if (isScheduler(arguments[1])) {
-            scheduler = arguments[1];
-        }
-        else if (isNumeric(arguments[1])) {
-            windowCreationInterval = arguments[1];
-        }
-        return function windowTimeOperatorFunction(source) {
-            return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler));
-        };
-    }
-    var WindowTimeOperator = (function () {
-        function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
-            this.windowTimeSpan = windowTimeSpan;
-            this.windowCreationInterval = windowCreationInterval;
-            this.maxWindowSize = maxWindowSize;
-            this.scheduler = scheduler;
-        }
-        WindowTimeOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler));
-        };
-        return WindowTimeOperator;
-    }());
-    var CountedSubject = (function (_super) {
-        __extends(CountedSubject, _super);
-        function CountedSubject() {
-            var _this = _super !== null && _super.apply(this, arguments) || this;
-            _this._numberOfNextedValues = 0;
-            return _this;
-        }
-        CountedSubject.prototype.next = function (value) {
-            this._numberOfNextedValues++;
-            _super.prototype.next.call(this, value);
-        };
-        Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", {
-            get: function () {
-                return this._numberOfNextedValues;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        return CountedSubject;
-    }(Subject));
-    var WindowTimeSubscriber = (function (_super) {
-        __extends(WindowTimeSubscriber, _super);
-        function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
-            var _this = _super.call(this, destination) || this;
-            _this.destination = destination;
-            _this.windowTimeSpan = windowTimeSpan;
-            _this.windowCreationInterval = windowCreationInterval;
-            _this.maxWindowSize = maxWindowSize;
-            _this.scheduler = scheduler;
-            _this.windows = [];
-            var window = _this.openWindow();
-            if (windowCreationInterval !== null && windowCreationInterval >= 0) {
-                var closeState = { subscriber: _this, window: window, context: null };
-                var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler };
-                _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState));
-                _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState));
-            }
-            else {
-                var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan };
-                _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));
-            }
-            return _this;
-        }
-        WindowTimeSubscriber.prototype._next = function (value) {
-            var windows = this.windows;
-            var len = windows.length;
-            for (var i = 0; i < len; i++) {
-                var window_1 = windows[i];
-                if (!window_1.closed) {
-                    window_1.next(value);
-                    if (window_1.numberOfNextedValues >= this.maxWindowSize) {
-                        this.closeWindow(window_1);
-                    }
-                }
-            }
-        };
-        WindowTimeSubscriber.prototype._error = function (err) {
-            var windows = this.windows;
-            while (windows.length > 0) {
-                windows.shift().error(err);
-            }
-            this.destination.error(err);
-        };
-        WindowTimeSubscriber.prototype._complete = function () {
-            var windows = this.windows;
-            while (windows.length > 0) {
-                var window_2 = windows.shift();
-                if (!window_2.closed) {
-                    window_2.complete();
-                }
-            }
-            this.destination.complete();
-        };
-        WindowTimeSubscriber.prototype.openWindow = function () {
-            var window = new CountedSubject();
-            this.windows.push(window);
-            var destination = this.destination;
-            destination.next(window);
-            return window;
-        };
-        WindowTimeSubscriber.prototype.closeWindow = function (window) {
-            window.complete();
-            var windows = this.windows;
-            windows.splice(windows.indexOf(window), 1);
-        };
-        return WindowTimeSubscriber;
-    }(Subscriber));
-    function dispatchWindowTimeSpanOnly(state) {
-        var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window;
-        if (window) {
-            subscriber.closeWindow(window);
-        }
-        state.window = subscriber.openWindow();
-        this.schedule(state, windowTimeSpan);
-    }
-    function dispatchWindowCreation(state) {
-        var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval;
-        var window = subscriber.openWindow();
-        var action = this;
-        var context = { action: action, subscription: null };
-        var timeSpanState = { subscriber: subscriber, window: window, context: context };
-        context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState);
-        action.add(context.subscription);
-        action.schedule(state, windowCreationInterval);
-    }
-    function dispatchWindowClose(state) {
-        var subscriber = state.subscriber, window = state.window, context = state.context;
-        if (context && context.action && context.subscription) {
-            context.action.remove(context.subscription);
-        }
-        subscriber.closeWindow(window);
-    }
-
-    function windowToggle(openings, closingSelector) {
-        return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); };
-    }
-    var WindowToggleOperator = (function () {
-        function WindowToggleOperator(openings, closingSelector) {
-            this.openings = openings;
-            this.closingSelector = closingSelector;
-        }
-        WindowToggleOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector));
-        };
-        return WindowToggleOperator;
-    }());
-    var WindowToggleSubscriber = (function (_super) {
-        __extends(WindowToggleSubscriber, _super);
-        function WindowToggleSubscriber(destination, openings, closingSelector) {
-            var _this = _super.call(this, destination) || this;
-            _this.openings = openings;
-            _this.closingSelector = closingSelector;
-            _this.contexts = [];
-            _this.add(_this.openSubscription = subscribeToResult(_this, openings, openings));
-            return _this;
-        }
-        WindowToggleSubscriber.prototype._next = function (value) {
-            var contexts = this.contexts;
-            if (contexts) {
-                var len = contexts.length;
-                for (var i = 0; i < len; i++) {
-                    contexts[i].window.next(value);
-                }
-            }
-        };
-        WindowToggleSubscriber.prototype._error = function (err) {
-            var contexts = this.contexts;
-            this.contexts = null;
-            if (contexts) {
-                var len = contexts.length;
-                var index = -1;
-                while (++index < len) {
-                    var context_1 = contexts[index];
-                    context_1.window.error(err);
-                    context_1.subscription.unsubscribe();
-                }
-            }
-            _super.prototype._error.call(this, err);
-        };
-        WindowToggleSubscriber.prototype._complete = function () {
-            var contexts = this.contexts;
-            this.contexts = null;
-            if (contexts) {
-                var len = contexts.length;
-                var index = -1;
-                while (++index < len) {
-                    var context_2 = contexts[index];
-                    context_2.window.complete();
-                    context_2.subscription.unsubscribe();
-                }
-            }
-            _super.prototype._complete.call(this);
-        };
-        WindowToggleSubscriber.prototype._unsubscribe = function () {
-            var contexts = this.contexts;
-            this.contexts = null;
-            if (contexts) {
-                var len = contexts.length;
-                var index = -1;
-                while (++index < len) {
-                    var context_3 = contexts[index];
-                    context_3.window.unsubscribe();
-                    context_3.subscription.unsubscribe();
-                }
-            }
-        };
-        WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            if (outerValue === this.openings) {
-                var closingNotifier = void 0;
-                try {
-                    var closingSelector = this.closingSelector;
-                    closingNotifier = closingSelector(innerValue);
-                }
-                catch (e) {
-                    return this.error(e);
-                }
-                var window_1 = new Subject();
-                var subscription = new Subscription();
-                var context_4 = { window: window_1, subscription: subscription };
-                this.contexts.push(context_4);
-                var innerSubscription = subscribeToResult(this, closingNotifier, context_4);
-                if (innerSubscription.closed) {
-                    this.closeWindow(this.contexts.length - 1);
-                }
-                else {
-                    innerSubscription.context = context_4;
-                    subscription.add(innerSubscription);
-                }
-                this.destination.next(window_1);
-            }
-            else {
-                this.closeWindow(this.contexts.indexOf(outerValue));
-            }
-        };
-        WindowToggleSubscriber.prototype.notifyError = function (err) {
-            this.error(err);
-        };
-        WindowToggleSubscriber.prototype.notifyComplete = function (inner) {
-            if (inner !== this.openSubscription) {
-                this.closeWindow(this.contexts.indexOf(inner.context));
-            }
-        };
-        WindowToggleSubscriber.prototype.closeWindow = function (index) {
-            if (index === -1) {
-                return;
-            }
-            var contexts = this.contexts;
-            var context = contexts[index];
-            var window = context.window, subscription = context.subscription;
-            contexts.splice(index, 1);
-            window.complete();
-            subscription.unsubscribe();
-        };
-        return WindowToggleSubscriber;
-    }(OuterSubscriber));
-
-    function windowWhen(closingSelector) {
-        return function windowWhenOperatorFunction(source) {
-            return source.lift(new WindowOperator$1(closingSelector));
-        };
-    }
-    var WindowOperator$1 = (function () {
-        function WindowOperator(closingSelector) {
-            this.closingSelector = closingSelector;
-        }
-        WindowOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new WindowSubscriber$1(subscriber, this.closingSelector));
-        };
-        return WindowOperator;
-    }());
-    var WindowSubscriber$1 = (function (_super) {
-        __extends(WindowSubscriber, _super);
-        function WindowSubscriber(destination, closingSelector) {
-            var _this = _super.call(this, destination) || this;
-            _this.destination = destination;
-            _this.closingSelector = closingSelector;
-            _this.openWindow();
-            return _this;
-        }
-        WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.openWindow(innerSub);
-        };
-        WindowSubscriber.prototype.notifyError = function (error, innerSub) {
-            this._error(error);
-        };
-        WindowSubscriber.prototype.notifyComplete = function (innerSub) {
-            this.openWindow(innerSub);
-        };
-        WindowSubscriber.prototype._next = function (value) {
-            this.window.next(value);
-        };
-        WindowSubscriber.prototype._error = function (err) {
-            this.window.error(err);
-            this.destination.error(err);
-            this.unsubscribeClosingNotification();
-        };
-        WindowSubscriber.prototype._complete = function () {
-            this.window.complete();
-            this.destination.complete();
-            this.unsubscribeClosingNotification();
-        };
-        WindowSubscriber.prototype.unsubscribeClosingNotification = function () {
-            if (this.closingNotification) {
-                this.closingNotification.unsubscribe();
-            }
-        };
-        WindowSubscriber.prototype.openWindow = function (innerSub) {
-            if (innerSub === void 0) { innerSub = null; }
-            if (innerSub) {
-                this.remove(innerSub);
-                innerSub.unsubscribe();
-            }
-            var prevWindow = this.window;
-            if (prevWindow) {
-                prevWindow.complete();
-            }
-            var window = this.window = new Subject();
-            this.destination.next(window);
-            var closingNotifier;
-            try {
-                var closingSelector = this.closingSelector;
-                closingNotifier = closingSelector();
-            }
-            catch (e) {
-                this.destination.error(e);
-                this.window.error(e);
-                return;
-            }
-            this.add(this.closingNotification = subscribeToResult(this, closingNotifier));
-        };
-        return WindowSubscriber;
-    }(OuterSubscriber));
-
-    function withLatestFrom() {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        return function (source) {
-            var project;
-            if (typeof args[args.length - 1] === 'function') {
-                project = args.pop();
-            }
-            var observables = args;
-            return source.lift(new WithLatestFromOperator(observables, project));
-        };
-    }
-    var WithLatestFromOperator = (function () {
-        function WithLatestFromOperator(observables, project) {
-            this.observables = observables;
-            this.project = project;
-        }
-        WithLatestFromOperator.prototype.call = function (subscriber, source) {
-            return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));
-        };
-        return WithLatestFromOperator;
-    }());
-    var WithLatestFromSubscriber = (function (_super) {
-        __extends(WithLatestFromSubscriber, _super);
-        function WithLatestFromSubscriber(destination, observables, project) {
-            var _this = _super.call(this, destination) || this;
-            _this.observables = observables;
-            _this.project = project;
-            _this.toRespond = [];
-            var len = observables.length;
-            _this.values = new Array(len);
-            for (var i = 0; i < len; i++) {
-                _this.toRespond.push(i);
-            }
-            for (var i = 0; i < len; i++) {
-                var observable = observables[i];
-                _this.add(subscribeToResult(_this, observable, observable, i));
-            }
-            return _this;
-        }
-        WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-            this.values[outerIndex] = innerValue;
-            var toRespond = this.toRespond;
-            if (toRespond.length > 0) {
-                var found = toRespond.indexOf(outerIndex);
-                if (found !== -1) {
-                    toRespond.splice(found, 1);
-                }
-            }
-        };
-        WithLatestFromSubscriber.prototype.notifyComplete = function () {
-        };
-        WithLatestFromSubscriber.prototype._next = function (value) {
-            if (this.toRespond.length === 0) {
-                var args = [value].concat(this.values);
-                if (this.project) {
-                    this._tryProject(args);
-                }
-                else {
-                    this.destination.next(args);
-                }
-            }
-        };
-        WithLatestFromSubscriber.prototype._tryProject = function (args) {
-            var result;
-            try {
-                result = this.project.apply(this, args);
-            }
-            catch (err) {
-                this.destination.error(err);
-                return;
-            }
-            this.destination.next(result);
-        };
-        return WithLatestFromSubscriber;
-    }(OuterSubscriber));
-
-    function zip$1() {
-        var observables = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            observables[_i] = arguments[_i];
-        }
-        return function zipOperatorFunction(source) {
-            return source.lift.call(zip.apply(void 0, [source].concat(observables)));
-        };
-    }
-
-    function zipAll(project) {
-        return function (source) { return source.lift(new ZipOperator(project)); };
-    }
-
-
-
-    var _operators = /*#__PURE__*/Object.freeze({
-        audit: audit,
-        auditTime: auditTime,
-        buffer: buffer,
-        bufferCount: bufferCount,
-        bufferTime: bufferTime,
-        bufferToggle: bufferToggle,
-        bufferWhen: bufferWhen,
-        catchError: catchError,
-        combineAll: combineAll,
-        combineLatest: combineLatest$1,
-        concat: concat$1,
-        concatAll: concatAll,
-        concatMap: concatMap,
-        concatMapTo: concatMapTo,
-        count: count,
-        debounce: debounce,
-        debounceTime: debounceTime,
-        defaultIfEmpty: defaultIfEmpty,
-        delay: delay,
-        delayWhen: delayWhen,
-        dematerialize: dematerialize,
-        distinct: distinct,
-        distinctUntilChanged: distinctUntilChanged,
-        distinctUntilKeyChanged: distinctUntilKeyChanged,
-        elementAt: elementAt,
-        endWith: endWith,
-        every: every,
-        exhaust: exhaust,
-        exhaustMap: exhaustMap,
-        expand: expand,
-        filter: filter,
-        finalize: finalize,
-        find: find,
-        findIndex: findIndex,
-        first: first,
-        groupBy: groupBy,
-        ignoreElements: ignoreElements,
-        isEmpty: isEmpty,
-        last: last,
-        map: map,
-        mapTo: mapTo,
-        materialize: materialize,
-        max: max,
-        merge: merge$1,
-        mergeAll: mergeAll,
-        mergeMap: mergeMap,
-        flatMap: mergeMap,
-        mergeMapTo: mergeMapTo,
-        mergeScan: mergeScan,
-        min: min,
-        multicast: multicast,
-        observeOn: observeOn,
-        onErrorResumeNext: onErrorResumeNext$1,
-        pairwise: pairwise,
-        partition: partition$1,
-        pluck: pluck,
-        publish: publish,
-        publishBehavior: publishBehavior,
-        publishLast: publishLast,
-        publishReplay: publishReplay,
-        race: race$1,
-        reduce: reduce,
-        repeat: repeat,
-        repeatWhen: repeatWhen,
-        retry: retry,
-        retryWhen: retryWhen,
-        refCount: refCount,
-        sample: sample,
-        sampleTime: sampleTime,
-        scan: scan,
-        sequenceEqual: sequenceEqual,
-        share: share,
-        shareReplay: shareReplay,
-        single: single,
-        skip: skip,
-        skipLast: skipLast,
-        skipUntil: skipUntil,
-        skipWhile: skipWhile,
-        startWith: startWith,
-        subscribeOn: subscribeOn,
-        switchAll: switchAll,
-        switchMap: switchMap,
-        switchMapTo: switchMapTo,
-        take: take,
-        takeLast: takeLast,
-        takeUntil: takeUntil,
-        takeWhile: takeWhile,
-        tap: tap,
-        throttle: throttle,
-        throttleTime: throttleTime,
-        throwIfEmpty: throwIfEmpty,
-        timeInterval: timeInterval,
-        timeout: timeout,
-        timeoutWith: timeoutWith,
-        timestamp: timestamp,
-        toArray: toArray,
-        window: window$1,
-        windowCount: windowCount,
-        windowTime: windowTime,
-        windowToggle: windowToggle,
-        windowWhen: windowWhen,
-        withLatestFrom: withLatestFrom,
-        zip: zip$1,
-        zipAll: zipAll
-    });
-
-    var SubscriptionLog = (function () {
-        function SubscriptionLog(subscribedFrame, unsubscribedFrame) {
-            if (unsubscribedFrame === void 0) { unsubscribedFrame = Number.POSITIVE_INFINITY; }
-            this.subscribedFrame = subscribedFrame;
-            this.unsubscribedFrame = unsubscribedFrame;
-        }
-        return SubscriptionLog;
-    }());
-
-    var SubscriptionLoggable = (function () {
-        function SubscriptionLoggable() {
-            this.subscriptions = [];
-        }
-        SubscriptionLoggable.prototype.logSubscribedFrame = function () {
-            this.subscriptions.push(new SubscriptionLog(this.scheduler.now()));
-            return this.subscriptions.length - 1;
-        };
-        SubscriptionLoggable.prototype.logUnsubscribedFrame = function (index) {
-            var subscriptionLogs = this.subscriptions;
-            var oldSubscriptionLog = subscriptionLogs[index];
-            subscriptionLogs[index] = new SubscriptionLog(oldSubscriptionLog.subscribedFrame, this.scheduler.now());
-        };
-        return SubscriptionLoggable;
-    }());
-
-    function applyMixins(derivedCtor, baseCtors) {
-        for (var i = 0, len = baseCtors.length; i < len; i++) {
-            var baseCtor = baseCtors[i];
-            var propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);
-            for (var j = 0, len2 = propertyKeys.length; j < len2; j++) {
-                var name_1 = propertyKeys[j];
-                derivedCtor.prototype[name_1] = baseCtor.prototype[name_1];
-            }
-        }
-    }
-
-    var ColdObservable = (function (_super) {
-        __extends(ColdObservable, _super);
-        function ColdObservable(messages, scheduler) {
-            var _this = _super.call(this, function (subscriber) {
-                var observable = this;
-                var index = observable.logSubscribedFrame();
-                var subscription = new Subscription();
-                subscription.add(new Subscription(function () {
-                    observable.logUnsubscribedFrame(index);
-                }));
-                observable.scheduleMessages(subscriber);
-                return subscription;
-            }) || this;
-            _this.messages = messages;
-            _this.subscriptions = [];
-            _this.scheduler = scheduler;
-            return _this;
-        }
-        ColdObservable.prototype.scheduleMessages = function (subscriber) {
-            var messagesLength = this.messages.length;
-            for (var i = 0; i < messagesLength; i++) {
-                var message = this.messages[i];
-                subscriber.add(this.scheduler.schedule(function (_a) {
-                    var message = _a.message, subscriber = _a.subscriber;
-                    message.notification.observe(subscriber);
-                }, message.frame, { message: message, subscriber: subscriber }));
-            }
-        };
-        return ColdObservable;
-    }(Observable));
-    applyMixins(ColdObservable, [SubscriptionLoggable]);
-
-    var HotObservable = (function (_super) {
-        __extends(HotObservable, _super);
-        function HotObservable(messages, scheduler) {
-            var _this = _super.call(this) || this;
-            _this.messages = messages;
-            _this.subscriptions = [];
-            _this.scheduler = scheduler;
-            return _this;
-        }
-        HotObservable.prototype._subscribe = function (subscriber) {
-            var subject = this;
-            var index = subject.logSubscribedFrame();
-            var subscription = new Subscription();
-            subscription.add(new Subscription(function () {
-                subject.logUnsubscribedFrame(index);
-            }));
-            subscription.add(_super.prototype._subscribe.call(this, subscriber));
-            return subscription;
-        };
-        HotObservable.prototype.setup = function () {
-            var subject = this;
-            var messagesLength = subject.messages.length;
-            for (var i = 0; i < messagesLength; i++) {
-                (function () {
-                    var message = subject.messages[i];
-                    subject.scheduler.schedule(function () { message.notification.observe(subject); }, message.frame);
-                })();
-            }
-        };
-        return HotObservable;
-    }(Subject));
-    applyMixins(HotObservable, [SubscriptionLoggable]);
-
-    var defaultMaxFrame = 750;
-    var TestScheduler = (function (_super) {
-        __extends(TestScheduler, _super);
-        function TestScheduler(assertDeepEqual) {
-            var _this = _super.call(this, VirtualAction, defaultMaxFrame) || this;
-            _this.assertDeepEqual = assertDeepEqual;
-            _this.hotObservables = [];
-            _this.coldObservables = [];
-            _this.flushTests = [];
-            _this.runMode = false;
-            return _this;
-        }
-        TestScheduler.prototype.createTime = function (marbles) {
-            var indexOf = marbles.indexOf('|');
-            if (indexOf === -1) {
-                throw new Error('marble diagram for time should have a completion marker "|"');
-            }
-            return indexOf * TestScheduler.frameTimeFactor;
-        };
-        TestScheduler.prototype.createColdObservable = function (marbles, values, error) {
-            if (marbles.indexOf('^') !== -1) {
-                throw new Error('cold observable cannot have subscription offset "^"');
-            }
-            if (marbles.indexOf('!') !== -1) {
-                throw new Error('cold observable cannot have unsubscription marker "!"');
-            }
-            var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
-            var cold = new ColdObservable(messages, this);
-            this.coldObservables.push(cold);
-            return cold;
-        };
-        TestScheduler.prototype.createHotObservable = function (marbles, values, error) {
-            if (marbles.indexOf('!') !== -1) {
-                throw new Error('hot observable cannot have unsubscription marker "!"');
-            }
-            var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
-            var subject = new HotObservable(messages, this);
-            this.hotObservables.push(subject);
-            return subject;
-        };
-        TestScheduler.prototype.materializeInnerObservable = function (observable, outerFrame) {
-            var _this = this;
-            var messages = [];
-            observable.subscribe(function (value) {
-                messages.push({ frame: _this.frame - outerFrame, notification: Notification.createNext(value) });
-            }, function (err) {
-                messages.push({ frame: _this.frame - outerFrame, notification: Notification.createError(err) });
-            }, function () {
-                messages.push({ frame: _this.frame - outerFrame, notification: Notification.createComplete() });
-            });
-            return messages;
-        };
-        TestScheduler.prototype.expectObservable = function (observable, subscriptionMarbles) {
-            var _this = this;
-            if (subscriptionMarbles === void 0) { subscriptionMarbles = null; }
-            var actual = [];
-            var flushTest = { actual: actual, ready: false };
-            var subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);
-            var subscriptionFrame = subscriptionParsed.subscribedFrame === Number.POSITIVE_INFINITY ?
-                0 : subscriptionParsed.subscribedFrame;
-            var unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;
-            var subscription;
-            this.schedule(function () {
-                subscription = observable.subscribe(function (x) {
-                    var value = x;
-                    if (x instanceof Observable) {
-                        value = _this.materializeInnerObservable(value, _this.frame);
-                    }
-                    actual.push({ frame: _this.frame, notification: Notification.createNext(value) });
-                }, function (err) {
-                    actual.push({ frame: _this.frame, notification: Notification.createError(err) });
-                }, function () {
-                    actual.push({ frame: _this.frame, notification: Notification.createComplete() });
-                });
-            }, subscriptionFrame);
-            if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {
-                this.schedule(function () { return subscription.unsubscribe(); }, unsubscriptionFrame);
-            }
-            this.flushTests.push(flushTest);
-            var runMode = this.runMode;
-            return {
-                toBe: function (marbles, values, errorValue) {
-                    flushTest.ready = true;
-                    flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);
-                }
-            };
-        };
-        TestScheduler.prototype.expectSubscriptions = function (actualSubscriptionLogs) {
-            var flushTest = { actual: actualSubscriptionLogs, ready: false };
-            this.flushTests.push(flushTest);
-            var runMode = this.runMode;
-            return {
-                toBe: function (marbles) {
-                    var marblesArray = (typeof marbles === 'string') ? [marbles] : marbles;
-                    flushTest.ready = true;
-                    flushTest.expected = marblesArray.map(function (marbles) {
-                        return TestScheduler.parseMarblesAsSubscriptions(marbles, runMode);
-                    });
-                }
-            };
-        };
-        TestScheduler.prototype.flush = function () {
-            var _this = this;
-            var hotObservables = this.hotObservables;
-            while (hotObservables.length > 0) {
-                hotObservables.shift().setup();
-            }
-            _super.prototype.flush.call(this);
-            this.flushTests = this.flushTests.filter(function (test) {
-                if (test.ready) {
-                    _this.assertDeepEqual(test.actual, test.expected);
-                    return false;
-                }
-                return true;
-            });
-        };
-        TestScheduler.parseMarblesAsSubscriptions = function (marbles, runMode) {
-            var _this = this;
-            if (runMode === void 0) { runMode = false; }
-            if (typeof marbles !== 'string') {
-                return new SubscriptionLog(Number.POSITIVE_INFINITY);
-            }
-            var len = marbles.length;
-            var groupStart = -1;
-            var subscriptionFrame = Number.POSITIVE_INFINITY;
-            var unsubscriptionFrame = Number.POSITIVE_INFINITY;
-            var frame = 0;
-            var _loop_1 = function (i) {
-                var nextFrame = frame;
-                var advanceFrameBy = function (count) {
-                    nextFrame += count * _this.frameTimeFactor;
-                };
-                var c = marbles[i];
-                switch (c) {
-                    case ' ':
-                        if (!runMode) {
-                            advanceFrameBy(1);
-                        }
-                        break;
-                    case '-':
-                        advanceFrameBy(1);
-                        break;
-                    case '(':
-                        groupStart = frame;
-                        advanceFrameBy(1);
-                        break;
-                    case ')':
-                        groupStart = -1;
-                        advanceFrameBy(1);
-                        break;
-                    case '^':
-                        if (subscriptionFrame !== Number.POSITIVE_INFINITY) {
-                            throw new Error('found a second subscription point \'^\' in a ' +
-                                'subscription marble diagram. There can only be one.');
-                        }
-                        subscriptionFrame = groupStart > -1 ? groupStart : frame;
-                        advanceFrameBy(1);
-                        break;
-                    case '!':
-                        if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {
-                            throw new Error('found a second subscription point \'^\' in a ' +
-                                'subscription marble diagram. There can only be one.');
-                        }
-                        unsubscriptionFrame = groupStart > -1 ? groupStart : frame;
-                        break;
-                    default:
-                        if (runMode && c.match(/^[0-9]$/)) {
-                            if (i === 0 || marbles[i - 1] === ' ') {
-                                var buffer = marbles.slice(i);
-                                var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
-                                if (match) {
-                                    i += match[0].length - 1;
-                                    var duration = parseFloat(match[1]);
-                                    var unit = match[2];
-                                    var durationInMs = void 0;
-                                    switch (unit) {
-                                        case 'ms':
-                                            durationInMs = duration;
-                                            break;
-                                        case 's':
-                                            durationInMs = duration * 1000;
-                                            break;
-                                        case 'm':
-                                            durationInMs = duration * 1000 * 60;
-                                            break;
-                                        default:
-                                            break;
-                                    }
-                                    advanceFrameBy(durationInMs / this_1.frameTimeFactor);
-                                    break;
-                                }
-                            }
-                        }
-                        throw new Error('there can only be \'^\' and \'!\' markers in a ' +
-                            'subscription marble diagram. Found instead \'' + c + '\'.');
-                }
-                frame = nextFrame;
-                out_i_1 = i;
-            };
-            var this_1 = this, out_i_1;
-            for (var i = 0; i < len; i++) {
-                _loop_1(i);
-                i = out_i_1;
-            }
-            if (unsubscriptionFrame < 0) {
-                return new SubscriptionLog(subscriptionFrame);
-            }
-            else {
-                return new SubscriptionLog(subscriptionFrame, unsubscriptionFrame);
-            }
-        };
-        TestScheduler.parseMarbles = function (marbles, values, errorValue, materializeInnerObservables, runMode) {
-            var _this = this;
-            if (materializeInnerObservables === void 0) { materializeInnerObservables = false; }
-            if (runMode === void 0) { runMode = false; }
-            if (marbles.indexOf('!') !== -1) {
-                throw new Error('conventional marble diagrams cannot have the ' +
-                    'unsubscription marker "!"');
-            }
-            var len = marbles.length;
-            var testMessages = [];
-            var subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');
-            var frame = subIndex === -1 ? 0 : (subIndex * -this.frameTimeFactor);
-            var getValue = typeof values !== 'object' ?
-                function (x) { return x; } :
-                function (x) {
-                    if (materializeInnerObservables && values[x] instanceof ColdObservable) {
-                        return values[x].messages;
-                    }
-                    return values[x];
-                };
-            var groupStart = -1;
-            var _loop_2 = function (i) {
-                var nextFrame = frame;
-                var advanceFrameBy = function (count) {
-                    nextFrame += count * _this.frameTimeFactor;
-                };
-                var notification = void 0;
-                var c = marbles[i];
-                switch (c) {
-                    case ' ':
-                        if (!runMode) {
-                            advanceFrameBy(1);
-                        }
-                        break;
-                    case '-':
-                        advanceFrameBy(1);
-                        break;
-                    case '(':
-                        groupStart = frame;
-                        advanceFrameBy(1);
-                        break;
-                    case ')':
-                        groupStart = -1;
-                        advanceFrameBy(1);
-                        break;
-                    case '|':
-                        notification = Notification.createComplete();
-                        advanceFrameBy(1);
-                        break;
-                    case '^':
-                        advanceFrameBy(1);
-                        break;
-                    case '#':
-                        notification = Notification.createError(errorValue || 'error');
-                        advanceFrameBy(1);
-                        break;
-                    default:
-                        if (runMode && c.match(/^[0-9]$/)) {
-                            if (i === 0 || marbles[i - 1] === ' ') {
-                                var buffer = marbles.slice(i);
-                                var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
-                                if (match) {
-                                    i += match[0].length - 1;
-                                    var duration = parseFloat(match[1]);
-                                    var unit = match[2];
-                                    var durationInMs = void 0;
-                                    switch (unit) {
-                                        case 'ms':
-                                            durationInMs = duration;
-                                            break;
-                                        case 's':
-                                            durationInMs = duration * 1000;
-                                            break;
-                                        case 'm':
-                                            durationInMs = duration * 1000 * 60;
-                                            break;
-                                        default:
-                                            break;
-                                    }
-                                    advanceFrameBy(durationInMs / this_2.frameTimeFactor);
-                                    break;
-                                }
-                            }
-                        }
-                        notification = Notification.createNext(getValue(c));
-                        advanceFrameBy(1);
-                        break;
-                }
-                if (notification) {
-                    testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification: notification });
-                }
-                frame = nextFrame;
-                out_i_2 = i;
-            };
-            var this_2 = this, out_i_2;
-            for (var i = 0; i < len; i++) {
-                _loop_2(i);
-                i = out_i_2;
-            }
-            return testMessages;
-        };
-        TestScheduler.prototype.run = function (callback) {
-            var prevFrameTimeFactor = TestScheduler.frameTimeFactor;
-            var prevMaxFrames = this.maxFrames;
-            TestScheduler.frameTimeFactor = 1;
-            this.maxFrames = Number.POSITIVE_INFINITY;
-            this.runMode = true;
-            AsyncScheduler.delegate = this;
-            var helpers = {
-                cold: this.createColdObservable.bind(this),
-                hot: this.createHotObservable.bind(this),
-                flush: this.flush.bind(this),
-                expectObservable: this.expectObservable.bind(this),
-                expectSubscriptions: this.expectSubscriptions.bind(this),
-            };
-            try {
-                var ret = callback(helpers);
-                this.flush();
-                return ret;
-            }
-            finally {
-                TestScheduler.frameTimeFactor = prevFrameTimeFactor;
-                this.maxFrames = prevMaxFrames;
-                this.runMode = false;
-                AsyncScheduler.delegate = undefined;
-            }
-        };
-        return TestScheduler;
-    }(VirtualTimeScheduler));
-
-
-
-    var _testing = /*#__PURE__*/Object.freeze({
-        TestScheduler: TestScheduler
-    });
-
-    var __window = typeof window !== 'undefined' && window;
-    var __self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&
-        self instanceof WorkerGlobalScope && self;
-    var __global = typeof global !== 'undefined' && global;
-    var _root = __window || __global || __self;
-    (function () {
-        if (!_root) {
-            throw new Error('RxJS could not find any global context (window, self, global)');
-        }
-    })();
-
-    function getCORSRequest() {
-        if (_root.XMLHttpRequest) {
-            return new _root.XMLHttpRequest();
-        }
-        else if (!!_root.XDomainRequest) {
-            return new _root.XDomainRequest();
-        }
-        else {
-            throw new Error('CORS is not supported by your browser');
-        }
-    }
-    function getXMLHttpRequest() {
-        if (_root.XMLHttpRequest) {
-            return new _root.XMLHttpRequest();
-        }
-        else {
-            var progId = void 0;
-            try {
-                var progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
-                for (var i = 0; i < 3; i++) {
-                    try {
-                        progId = progIds[i];
-                        if (new _root.ActiveXObject(progId)) {
-                            break;
-                        }
-                    }
-                    catch (e) {
-                    }
-                }
-                return new _root.ActiveXObject(progId);
-            }
-            catch (e) {
-                throw new Error('XMLHttpRequest is not supported by your browser');
-            }
-        }
-    }
-    function ajaxGet(url, headers) {
-        if (headers === void 0) { headers = null; }
-        return new AjaxObservable({ method: 'GET', url: url, headers: headers });
-    }
-    function ajaxPost(url, body, headers) {
-        return new AjaxObservable({ method: 'POST', url: url, body: body, headers: headers });
-    }
-    function ajaxDelete(url, headers) {
-        return new AjaxObservable({ method: 'DELETE', url: url, headers: headers });
-    }
-    function ajaxPut(url, body, headers) {
-        return new AjaxObservable({ method: 'PUT', url: url, body: body, headers: headers });
-    }
-    function ajaxPatch(url, body, headers) {
-        return new AjaxObservable({ method: 'PATCH', url: url, body: body, headers: headers });
-    }
-    var mapResponse = map(function (x, index) { return x.response; });
-    function ajaxGetJSON(url, headers) {
-        return mapResponse(new AjaxObservable({
-            method: 'GET',
-            url: url,
-            responseType: 'json',
-            headers: headers
-        }));
-    }
-    var AjaxObservable = (function (_super) {
-        __extends(AjaxObservable, _super);
-        function AjaxObservable(urlOrRequest) {
-            var _this = _super.call(this) || this;
-            var request = {
-                async: true,
-                createXHR: function () {
-                    return this.crossDomain ? getCORSRequest() : getXMLHttpRequest();
-                },
-                crossDomain: true,
-                withCredentials: false,
-                headers: {},
-                method: 'GET',
-                responseType: 'json',
-                timeout: 0
-            };
-            if (typeof urlOrRequest === 'string') {
-                request.url = urlOrRequest;
-            }
-            else {
-                for (var prop in urlOrRequest) {
-                    if (urlOrRequest.hasOwnProperty(prop)) {
-                        request[prop] = urlOrRequest[prop];
-                    }
-                }
-            }
-            _this.request = request;
-            return _this;
-        }
-        AjaxObservable.prototype._subscribe = function (subscriber) {
-            return new AjaxSubscriber(subscriber, this.request);
-        };
-        AjaxObservable.create = (function () {
-            var create = function (urlOrRequest) {
-                return new AjaxObservable(urlOrRequest);
-            };
-            create.get = ajaxGet;
-            create.post = ajaxPost;
-            create.delete = ajaxDelete;
-            create.put = ajaxPut;
-            create.patch = ajaxPatch;
-            create.getJSON = ajaxGetJSON;
-            return create;
-        })();
-        return AjaxObservable;
-    }(Observable));
-    var AjaxSubscriber = (function (_super) {
-        __extends(AjaxSubscriber, _super);
-        function AjaxSubscriber(destination, request) {
-            var _this = _super.call(this, destination) || this;
-            _this.request = request;
-            _this.done = false;
-            var headers = request.headers = request.headers || {};
-            if (!request.crossDomain && !_this.getHeader(headers, 'X-Requested-With')) {
-                headers['X-Requested-With'] = 'XMLHttpRequest';
-            }
-            var contentTypeHeader = _this.getHeader(headers, 'Content-Type');
-            if (!contentTypeHeader && !(_root.FormData && request.body instanceof _root.FormData) && typeof request.body !== 'undefined') {
-                headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
-            }
-            request.body = _this.serializeBody(request.body, _this.getHeader(request.headers, 'Content-Type'));
-            _this.send();
-            return _this;
-        }
-        AjaxSubscriber.prototype.next = function (e) {
-            this.done = true;
-            var _a = this, xhr = _a.xhr, request = _a.request, destination = _a.destination;
-            var result;
-            try {
-                result = new AjaxResponse(e, xhr, request);
-            }
-            catch (err) {
-                return destination.error(err);
-            }
-            destination.next(result);
-        };
-        AjaxSubscriber.prototype.send = function () {
-            var _a = this, request = _a.request, _b = _a.request, user = _b.user, method = _b.method, url = _b.url, async = _b.async, password = _b.password, headers = _b.headers, body = _b.body;
-            try {
-                var xhr = this.xhr = request.createXHR();
-                this.setupEvents(xhr, request);
-                if (user) {
-                    xhr.open(method, url, async, user, password);
-                }
-                else {
-                    xhr.open(method, url, async);
-                }
-                if (async) {
-                    xhr.timeout = request.timeout;
-                    xhr.responseType = request.responseType;
-                }
-                if ('withCredentials' in xhr) {
-                    xhr.withCredentials = !!request.withCredentials;
-                }
-                this.setHeaders(xhr, headers);
-                if (body) {
-                    xhr.send(body);
-                }
-                else {
-                    xhr.send();
-                }
-            }
-            catch (err) {
-                this.error(err);
-            }
-        };
-        AjaxSubscriber.prototype.serializeBody = function (body, contentType) {
-            if (!body || typeof body === 'string') {
-                return body;
-            }
-            else if (_root.FormData && body instanceof _root.FormData) {
-                return body;
-            }
-            if (contentType) {
-                var splitIndex = contentType.indexOf(';');
-                if (splitIndex !== -1) {
-                    contentType = contentType.substring(0, splitIndex);
-                }
-            }
-            switch (contentType) {
-                case 'application/x-www-form-urlencoded':
-                    return Object.keys(body).map(function (key) { return encodeURIComponent(key) + "=" + encodeURIComponent(body[key]); }).join('&');
-                case 'application/json':
-                    return JSON.stringify(body);
-                default:
-                    return body;
-            }
-        };
-        AjaxSubscriber.prototype.setHeaders = function (xhr, headers) {
-            for (var key in headers) {
-                if (headers.hasOwnProperty(key)) {
-                    xhr.setRequestHeader(key, headers[key]);
-                }
-            }
-        };
-        AjaxSubscriber.prototype.getHeader = function (headers, headerName) {
-            for (var key in headers) {
-                if (key.toLowerCase() === headerName.toLowerCase()) {
-                    return headers[key];
-                }
-            }
-            return undefined;
-        };
-        AjaxSubscriber.prototype.setupEvents = function (xhr, request) {
-            var progressSubscriber = request.progressSubscriber;
-            function xhrTimeout(e) {
-                var _a = xhrTimeout, subscriber = _a.subscriber, progressSubscriber = _a.progressSubscriber, request = _a.request;
-                if (progressSubscriber) {
-                    progressSubscriber.error(e);
-                }
-                var error;
-                try {
-                    error = new AjaxTimeoutError(this, request);
-                }
-                catch (err) {
-                    error = err;
-                }
-                subscriber.error(error);
-            }
-            xhr.ontimeout = xhrTimeout;
-            xhrTimeout.request = request;
-            xhrTimeout.subscriber = this;
-            xhrTimeout.progressSubscriber = progressSubscriber;
-            if (xhr.upload && 'withCredentials' in xhr) {
-                if (progressSubscriber) {
-                    var xhrProgress_1;
-                    xhrProgress_1 = function (e) {
-                        var progressSubscriber = xhrProgress_1.progressSubscriber;
-                        progressSubscriber.next(e);
-                    };
-                    if (_root.XDomainRequest) {
-                        xhr.onprogress = xhrProgress_1;
-                    }
-                    else {
-                        xhr.upload.onprogress = xhrProgress_1;
-                    }
-                    xhrProgress_1.progressSubscriber = progressSubscriber;
-                }
-                var xhrError_1;
-                xhrError_1 = function (e) {
-                    var _a = xhrError_1, progressSubscriber = _a.progressSubscriber, subscriber = _a.subscriber, request = _a.request;
-                    if (progressSubscriber) {
-                        progressSubscriber.error(e);
-                    }
-                    var error;
-                    try {
-                        error = new AjaxError('ajax error', this, request);
-                    }
-                    catch (err) {
-                        error = err;
-                    }
-                    subscriber.error(error);
-                };
-                xhr.onerror = xhrError_1;
-                xhrError_1.request = request;
-                xhrError_1.subscriber = this;
-                xhrError_1.progressSubscriber = progressSubscriber;
-            }
-            function xhrReadyStateChange(e) {
-                return;
-            }
-            xhr.onreadystatechange = xhrReadyStateChange;
-            xhrReadyStateChange.subscriber = this;
-            xhrReadyStateChange.progressSubscriber = progressSubscriber;
-            xhrReadyStateChange.request = request;
-            function xhrLoad(e) {
-                var _a = xhrLoad, subscriber = _a.subscriber, progressSubscriber = _a.progressSubscriber, request = _a.request;
-                if (this.readyState === 4) {
-                    var status_1 = this.status === 1223 ? 204 : this.status;
-                    var response = (this.responseType === 'text' ? (this.response || this.responseText) : this.response);
-                    if (status_1 === 0) {
-                        status_1 = response ? 200 : 0;
-                    }
-                    if (status_1 < 400) {
-                        if (progressSubscriber) {
-                            progressSubscriber.complete();
-                        }
-                        subscriber.next(e);
-                        subscriber.complete();
-                    }
-                    else {
-                        if (progressSubscriber) {
-                            progressSubscriber.error(e);
-                        }
-                        var error = void 0;
-                        try {
-                            error = new AjaxError('ajax error ' + status_1, this, request);
-                        }
-                        catch (err) {
-                            error = err;
-                        }
-                        subscriber.error(error);
-                    }
-                }
-            }
-            xhr.onload = xhrLoad;
-            xhrLoad.subscriber = this;
-            xhrLoad.progressSubscriber = progressSubscriber;
-            xhrLoad.request = request;
-        };
-        AjaxSubscriber.prototype.unsubscribe = function () {
-            var _a = this, done = _a.done, xhr = _a.xhr;
-            if (!done && xhr && xhr.readyState !== 4 && typeof xhr.abort === 'function') {
-                xhr.abort();
-            }
-            _super.prototype.unsubscribe.call(this);
-        };
-        return AjaxSubscriber;
-    }(Subscriber));
-    var AjaxResponse = (function () {
-        function AjaxResponse(originalEvent, xhr, request) {
-            this.originalEvent = originalEvent;
-            this.xhr = xhr;
-            this.request = request;
-            this.status = xhr.status;
-            this.responseType = xhr.responseType || request.responseType;
-            this.response = parseXhrResponse(this.responseType, xhr);
-        }
-        return AjaxResponse;
-    }());
-    var AjaxErrorImpl = (function () {
-        function AjaxErrorImpl(message, xhr, request) {
-            Error.call(this);
-            this.message = message;
-            this.name = 'AjaxError';
-            this.xhr = xhr;
-            this.request = request;
-            this.status = xhr.status;
-            this.responseType = xhr.responseType || request.responseType;
-            this.response = parseXhrResponse(this.responseType, xhr);
-            return this;
-        }
-        AjaxErrorImpl.prototype = Object.create(Error.prototype);
-        return AjaxErrorImpl;
-    })();
-    var AjaxError = AjaxErrorImpl;
-    function parseJson(xhr) {
-        if ('response' in xhr) {
-            return xhr.responseType ? xhr.response : JSON.parse(xhr.response || xhr.responseText || 'null');
-        }
-        else {
-            return JSON.parse(xhr.responseText || 'null');
-        }
-    }
-    function parseXhrResponse(responseType, xhr) {
-        switch (responseType) {
-            case 'json':
-                return parseJson(xhr);
-            case 'xml':
-                return xhr.responseXML;
-            case 'text':
-            default:
-                return ('response' in xhr) ? xhr.response : xhr.responseText;
-        }
-    }
-    function AjaxTimeoutErrorImpl(xhr, request) {
-        AjaxError.call(this, 'ajax timeout', xhr, request);
-        this.name = 'AjaxTimeoutError';
-        return this;
-    }
-    var AjaxTimeoutError = AjaxTimeoutErrorImpl;
-
-    var ajax = (function () { return AjaxObservable.create; })();
-
-
-
-    var _ajax = /*#__PURE__*/Object.freeze({
-        ajax: ajax,
-        AjaxResponse: AjaxResponse,
-        AjaxError: AjaxError,
-        AjaxTimeoutError: AjaxTimeoutError
-    });
-
-    var DEFAULT_WEBSOCKET_CONFIG = {
-        url: '',
-        deserializer: function (e) { return JSON.parse(e.data); },
-        serializer: function (value) { return JSON.stringify(value); },
-    };
-    var WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT = 'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';
-    var WebSocketSubject = (function (_super) {
-        __extends(WebSocketSubject, _super);
-        function WebSocketSubject(urlConfigOrSource, destination) {
-            var _this = _super.call(this) || this;
-            if (urlConfigOrSource instanceof Observable) {
-                _this.destination = destination;
-                _this.source = urlConfigOrSource;
-            }
-            else {
-                var config = _this._config = __assign({}, DEFAULT_WEBSOCKET_CONFIG);
-                _this._output = new Subject();
-                if (typeof urlConfigOrSource === 'string') {
-                    config.url = urlConfigOrSource;
-                }
-                else {
-                    for (var key in urlConfigOrSource) {
-                        if (urlConfigOrSource.hasOwnProperty(key)) {
-                            config[key] = urlConfigOrSource[key];
-                        }
-                    }
-                }
-                if (!config.WebSocketCtor && WebSocket) {
-                    config.WebSocketCtor = WebSocket;
-                }
-                else if (!config.WebSocketCtor) {
-                    throw new Error('no WebSocket constructor can be found');
-                }
-                _this.destination = new ReplaySubject();
-            }
-            return _this;
-        }
-        WebSocketSubject.prototype.lift = function (operator) {
-            var sock = new WebSocketSubject(this._config, this.destination);
-            sock.operator = operator;
-            sock.source = this;
-            return sock;
-        };
-        WebSocketSubject.prototype._resetState = function () {
-            this._socket = null;
-            if (!this.source) {
-                this.destination = new ReplaySubject();
-            }
-            this._output = new Subject();
-        };
-        WebSocketSubject.prototype.multiplex = function (subMsg, unsubMsg, messageFilter) {
-            var self = this;
-            return new Observable(function (observer) {
-                try {
-                    self.next(subMsg());
-                }
-                catch (err) {
-                    observer.error(err);
-                }
-                var subscription = self.subscribe(function (x) {
-                    try {
-                        if (messageFilter(x)) {
-                            observer.next(x);
-                        }
-                    }
-                    catch (err) {
-                        observer.error(err);
-                    }
-                }, function (err) { return observer.error(err); }, function () { return observer.complete(); });
-                return function () {
-                    try {
-                        self.next(unsubMsg());
-                    }
-                    catch (err) {
-                        observer.error(err);
-                    }
-                    subscription.unsubscribe();
-                };
-            });
-        };
-        WebSocketSubject.prototype._connectSocket = function () {
-            var _this = this;
-            var _a = this._config, WebSocketCtor = _a.WebSocketCtor, protocol = _a.protocol, url = _a.url, binaryType = _a.binaryType;
-            var observer = this._output;
-            var socket = null;
-            try {
-                socket = protocol ?
-                    new WebSocketCtor(url, protocol) :
-                    new WebSocketCtor(url);
-                this._socket = socket;
-                if (binaryType) {
-                    this._socket.binaryType = binaryType;
-                }
-            }
-            catch (e) {
-                observer.error(e);
-                return;
-            }
-            var subscription = new Subscription(function () {
-                _this._socket = null;
-                if (socket && socket.readyState === 1) {
-                    socket.close();
-                }
-            });
-            socket.onopen = function (e) {
-                var _socket = _this._socket;
-                if (!_socket) {
-                    socket.close();
-                    _this._resetState();
-                    return;
-                }
-                var openObserver = _this._config.openObserver;
-                if (openObserver) {
-                    openObserver.next(e);
-                }
-                var queue = _this.destination;
-                _this.destination = Subscriber.create(function (x) {
-                    if (socket.readyState === 1) {
-                        try {
-                            var serializer = _this._config.serializer;
-                            socket.send(serializer(x));
-                        }
-                        catch (e) {
-                            _this.destination.error(e);
-                        }
-                    }
-                }, function (e) {
-                    var closingObserver = _this._config.closingObserver;
-                    if (closingObserver) {
-                        closingObserver.next(undefined);
-                    }
-                    if (e && e.code) {
-                        socket.close(e.code, e.reason);
-                    }
-                    else {
-                        observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));
-                    }
-                    _this._resetState();
-                }, function () {
-                    var closingObserver = _this._config.closingObserver;
-                    if (closingObserver) {
-                        closingObserver.next(undefined);
-                    }
-                    socket.close();
-                    _this._resetState();
-                });
-                if (queue && queue instanceof ReplaySubject) {
-                    subscription.add(queue.subscribe(_this.destination));
-                }
-            };
-            socket.onerror = function (e) {
-                _this._resetState();
-                observer.error(e);
-            };
-            socket.onclose = function (e) {
-                _this._resetState();
-                var closeObserver = _this._config.closeObserver;
-                if (closeObserver) {
-                    closeObserver.next(e);
-                }
-                if (e.wasClean) {
-                    observer.complete();
-                }
-                else {
-                    observer.error(e);
-                }
-            };
-            socket.onmessage = function (e) {
-                try {
-                    var deserializer = _this._config.deserializer;
-                    observer.next(deserializer(e));
-                }
-                catch (err) {
-                    observer.error(err);
-                }
-            };
-        };
-        WebSocketSubject.prototype._subscribe = function (subscriber) {
-            var _this = this;
-            var source = this.source;
-            if (source) {
-                return source.subscribe(subscriber);
-            }
-            if (!this._socket) {
-                this._connectSocket();
-            }
-            this._output.subscribe(subscriber);
-            subscriber.add(function () {
-                var _socket = _this._socket;
-                if (_this._output.observers.length === 0) {
-                    if (_socket && _socket.readyState === 1) {
-                        _socket.close();
-                    }
-                    _this._resetState();
-                }
-            });
-            return subscriber;
-        };
-        WebSocketSubject.prototype.unsubscribe = function () {
-            var _socket = this._socket;
-            if (_socket && _socket.readyState === 1) {
-                _socket.close();
-            }
-            this._resetState();
-            _super.prototype.unsubscribe.call(this);
-        };
-        return WebSocketSubject;
-    }(AnonymousSubject));
-
-    function webSocket(urlConfigOrSource) {
-        return new WebSocketSubject(urlConfigOrSource);
-    }
-
-
-
-    var _webSocket = /*#__PURE__*/Object.freeze({
-        webSocket: webSocket,
-        WebSocketSubject: WebSocketSubject
-    });
-
-    function fromFetch(input, init) {
-        return new Observable(function (subscriber) {
-            var controller = new AbortController();
-            var signal = controller.signal;
-            var outerSignalHandler;
-            var abortable = true;
-            var unsubscribed = false;
-            if (init) {
-                if (init.signal) {
-                    if (init.signal.aborted) {
-                        controller.abort();
-                    }
-                    else {
-                        outerSignalHandler = function () {
-                            if (!signal.aborted) {
-                                controller.abort();
-                            }
-                        };
-                        init.signal.addEventListener('abort', outerSignalHandler);
-                    }
-                }
-                init = __assign({}, init, { signal: signal });
-            }
-            else {
-                init = { signal: signal };
-            }
-            fetch(input, init).then(function (response) {
-                abortable = false;
-                subscriber.next(response);
-                subscriber.complete();
-            }).catch(function (err) {
-                abortable = false;
-                if (!unsubscribed) {
-                    subscriber.error(err);
-                }
-            });
-            return function () {
-                unsubscribed = true;
-                if (abortable) {
-                    controller.abort();
-                }
-            };
-        });
-    }
-
-
-
-    var _fetch = /*#__PURE__*/Object.freeze({
-        fromFetch: fromFetch
-    });
-
-    var operators = _operators;
-    var testing = _testing;
-    var ajax$1 = _ajax;
-    var webSocket$1 = _webSocket;
-    var fetch$1 = _fetch;
-
-    exports.operators = operators;
-    exports.testing = testing;
-    exports.ajax = ajax$1;
-    exports.webSocket = webSocket$1;
-    exports.fetch = fetch$1;
-    exports.Observable = Observable;
-    exports.ConnectableObservable = ConnectableObservable;
-    exports.GroupedObservable = GroupedObservable;
-    exports.observable = observable;
-    exports.Subject = Subject;
-    exports.BehaviorSubject = BehaviorSubject;
-    exports.ReplaySubject = ReplaySubject;
-    exports.AsyncSubject = AsyncSubject;
-    exports.asapScheduler = asap;
-    exports.asyncScheduler = async;
-    exports.queueScheduler = queue;
-    exports.animationFrameScheduler = animationFrame;
-    exports.VirtualTimeScheduler = VirtualTimeScheduler;
-    exports.VirtualAction = VirtualAction;
-    exports.Scheduler = Scheduler;
-    exports.Subscription = Subscription;
-    exports.Subscriber = Subscriber;
-    exports.Notification = Notification;
-    exports.pipe = pipe;
-    exports.noop = noop;
-    exports.identity = identity;
-    exports.isObservable = isObservable;
-    exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError;
-    exports.EmptyError = EmptyError;
-    exports.ObjectUnsubscribedError = ObjectUnsubscribedError;
-    exports.UnsubscriptionError = UnsubscriptionError;
-    exports.TimeoutError = TimeoutError;
-    exports.bindCallback = bindCallback;
-    exports.bindNodeCallback = bindNodeCallback;
-    exports.combineLatest = combineLatest;
-    exports.concat = concat;
-    exports.defer = defer;
-    exports.empty = empty$1;
-    exports.forkJoin = forkJoin;
-    exports.from = from;
-    exports.fromEvent = fromEvent;
-    exports.fromEventPattern = fromEventPattern;
-    exports.generate = generate;
-    exports.iif = iif;
-    exports.interval = interval;
-    exports.merge = merge;
-    exports.never = never;
-    exports.of = of;
-    exports.onErrorResumeNext = onErrorResumeNext;
-    exports.pairs = pairs;
-    exports.partition = partition;
-    exports.race = race;
-    exports.range = range;
-    exports.throwError = throwError;
-    exports.timer = timer;
-    exports.using = using;
-    exports.zip = zip;
-    exports.scheduled = scheduled;
-    exports.EMPTY = EMPTY;
-    exports.NEVER = NEVER;
-    exports.config = config;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-})));
-
-//# sourceMappingURL=rxjs.umd.js.map
-
diff --git a/node_modules/rxjs/bundles/rxjs.umd.js.map b/node_modules/rxjs/bundles/rxjs.umd.js.map
deleted file mode 100644
index 1e229ab..0000000
--- a/node_modules/rxjs/bundles/rxjs.umd.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"umd.js","sources":["../tslib/tslib.es6.js","../dist/esm5_for_rollup/internal/util/isFunction.js","../dist/esm5_for_rollup/internal/config.js","../dist/esm5_for_rollup/internal/util/hostReportError.js","../dist/esm5_for_rollup/internal/Observer.js","../dist/esm5_for_rollup/internal/util/isArray.js","../dist/esm5_for_rollup/internal/util/isObject.js","../dist/esm5_for_rollup/internal/util/UnsubscriptionError.js","../dist/esm5_for_rollup/internal/Subscription.js","../dist/esm5_for_rollup/internal/symbol/rxSubscriber.js","../dist/esm5_for_rollup/internal/Subscriber.js","../dist/esm5_for_rollup/internal/util/canReportError.js","../dist/esm5_for_rollup/internal/util/toSubscriber.js","../dist/esm5_for_rollup/internal/symbol/observable.js","../dist/esm5_for_rollup/internal/util/noop.js","../dist/esm5_for_rollup/internal/util/pipe.js","../dist/esm5_for_rollup/internal/Observable.js","../dist/esm5_for_rollup/internal/util/ObjectUnsubscribedError.js","../dist/esm5_for_rollup/internal/SubjectSubscription.js","../dist/esm5_for_rollup/internal/Subject.js","../dist/esm5_for_rollup/internal/operators/refCount.js","../dist/esm5_for_rollup/internal/observable/ConnectableObservable.js","../dist/esm5_for_rollup/internal/operators/groupBy.js","../dist/esm5_for_rollup/internal/BehaviorSubject.js","../dist/esm5_for_rollup/internal/scheduler/Action.js","../dist/esm5_for_rollup/internal/scheduler/AsyncAction.js","../dist/esm5_for_rollup/internal/scheduler/QueueAction.js","../dist/esm5_for_rollup/internal/Scheduler.js","../dist/esm5_for_rollup/internal/scheduler/AsyncScheduler.js","../dist/esm5_for_rollup/internal/scheduler/QueueScheduler.js","../dist/esm5_for_rollup/internal/scheduler/queue.js","../dist/esm5_for_rollup/internal/observable/empty.js","../dist/esm5_for_rollup/internal/util/isScheduler.js","../dist/esm5_for_rollup/internal/util/subscribeToArray.js","../dist/esm5_for_rollup/internal/scheduled/scheduleArray.js","../dist/esm5_for_rollup/internal/observable/fromArray.js","../dist/esm5_for_rollup/internal/observable/of.js","../dist/esm5_for_rollup/internal/observable/throwError.js","../dist/esm5_for_rollup/internal/Notification.js","../dist/esm5_for_rollup/internal/operators/observeOn.js","../dist/esm5_for_rollup/internal/ReplaySubject.js","../dist/esm5_for_rollup/internal/AsyncSubject.js","../dist/esm5_for_rollup/internal/util/Immediate.js","../dist/esm5_for_rollup/internal/scheduler/AsapAction.js","../dist/esm5_for_rollup/internal/scheduler/AsapScheduler.js","../dist/esm5_for_rollup/internal/scheduler/asap.js","../dist/esm5_for_rollup/internal/scheduler/async.js","../dist/esm5_for_rollup/internal/scheduler/AnimationFrameAction.js","../dist/esm5_for_rollup/internal/scheduler/AnimationFrameScheduler.js","../dist/esm5_for_rollup/internal/scheduler/animationFrame.js","../dist/esm5_for_rollup/internal/scheduler/VirtualTimeScheduler.js","../dist/esm5_for_rollup/internal/util/identity.js","../dist/esm5_for_rollup/internal/util/isObservable.js","../dist/esm5_for_rollup/internal/util/ArgumentOutOfRangeError.js","../dist/esm5_for_rollup/internal/util/EmptyError.js","../dist/esm5_for_rollup/internal/util/TimeoutError.js","../dist/esm5_for_rollup/internal/operators/map.js","../dist/esm5_for_rollup/internal/observable/bindCallback.js","../dist/esm5_for_rollup/internal/observable/bindNodeCallback.js","../dist/esm5_for_rollup/internal/OuterSubscriber.js","../dist/esm5_for_rollup/internal/InnerSubscriber.js","../dist/esm5_for_rollup/internal/util/subscribeToPromise.js","../dist/esm5_for_rollup/internal/symbol/iterator.js","../dist/esm5_for_rollup/internal/util/subscribeToIterable.js","../dist/esm5_for_rollup/internal/util/subscribeToObservable.js","../dist/esm5_for_rollup/internal/util/isArrayLike.js","../dist/esm5_for_rollup/internal/util/isPromise.js","../dist/esm5_for_rollup/internal/util/subscribeTo.js","../dist/esm5_for_rollup/internal/util/subscribeToResult.js","../dist/esm5_for_rollup/internal/observable/combineLatest.js","../dist/esm5_for_rollup/internal/scheduled/scheduleObservable.js","../dist/esm5_for_rollup/internal/scheduled/schedulePromise.js","../dist/esm5_for_rollup/internal/scheduled/scheduleIterable.js","../dist/esm5_for_rollup/internal/util/isInteropObservable.js","../dist/esm5_for_rollup/internal/util/isIterable.js","../dist/esm5_for_rollup/internal/scheduled/scheduled.js","../dist/esm5_for_rollup/internal/observable/from.js","../dist/esm5_for_rollup/internal/operators/mergeMap.js","../dist/esm5_for_rollup/internal/operators/mergeAll.js","../dist/esm5_for_rollup/internal/operators/concatAll.js","../dist/esm5_for_rollup/internal/observable/concat.js","../dist/esm5_for_rollup/internal/observable/defer.js","../dist/esm5_for_rollup/internal/observable/forkJoin.js","../dist/esm5_for_rollup/internal/observable/fromEvent.js","../dist/esm5_for_rollup/internal/observable/fromEventPattern.js","../dist/esm5_for_rollup/internal/observable/generate.js","../dist/esm5_for_rollup/internal/observable/iif.js","../dist/esm5_for_rollup/internal/util/isNumeric.js","../dist/esm5_for_rollup/internal/observable/interval.js","../dist/esm5_for_rollup/internal/observable/merge.js","../dist/esm5_for_rollup/internal/observable/never.js","../dist/esm5_for_rollup/internal/observable/onErrorResumeNext.js","../dist/esm5_for_rollup/internal/observable/pairs.js","../dist/esm5_for_rollup/internal/util/not.js","../dist/esm5_for_rollup/internal/operators/filter.js","../dist/esm5_for_rollup/internal/observable/partition.js","../dist/esm5_for_rollup/internal/observable/race.js","../dist/esm5_for_rollup/internal/observable/range.js","../dist/esm5_for_rollup/internal/observable/timer.js","../dist/esm5_for_rollup/internal/observable/using.js","../dist/esm5_for_rollup/internal/observable/zip.js","../dist/esm5_for_rollup/internal/operators/audit.js","../dist/esm5_for_rollup/internal/operators/auditTime.js","../dist/esm5_for_rollup/internal/operators/buffer.js","../dist/esm5_for_rollup/internal/operators/bufferCount.js","../dist/esm5_for_rollup/internal/operators/bufferTime.js","../dist/esm5_for_rollup/internal/operators/bufferToggle.js","../dist/esm5_for_rollup/internal/operators/bufferWhen.js","../dist/esm5_for_rollup/internal/operators/catchError.js","../dist/esm5_for_rollup/internal/operators/combineAll.js","../dist/esm5_for_rollup/internal/operators/combineLatest.js","../dist/esm5_for_rollup/internal/operators/concat.js","../dist/esm5_for_rollup/internal/operators/concatMap.js","../dist/esm5_for_rollup/internal/operators/concatMapTo.js","../dist/esm5_for_rollup/internal/operators/count.js","../dist/esm5_for_rollup/internal/operators/debounce.js","../dist/esm5_for_rollup/internal/operators/debounceTime.js","../dist/esm5_for_rollup/internal/operators/defaultIfEmpty.js","../dist/esm5_for_rollup/internal/util/isDate.js","../dist/esm5_for_rollup/internal/operators/delay.js","../dist/esm5_for_rollup/internal/operators/delayWhen.js","../dist/esm5_for_rollup/internal/operators/dematerialize.js","../dist/esm5_for_rollup/internal/operators/distinct.js","../dist/esm5_for_rollup/internal/operators/distinctUntilChanged.js","../dist/esm5_for_rollup/internal/operators/distinctUntilKeyChanged.js","../dist/esm5_for_rollup/internal/operators/throwIfEmpty.js","../dist/esm5_for_rollup/internal/operators/take.js","../dist/esm5_for_rollup/internal/operators/elementAt.js","../dist/esm5_for_rollup/internal/operators/endWith.js","../dist/esm5_for_rollup/internal/operators/every.js","../dist/esm5_for_rollup/internal/operators/exhaust.js","../dist/esm5_for_rollup/internal/operators/exhaustMap.js","../dist/esm5_for_rollup/internal/operators/expand.js","../dist/esm5_for_rollup/internal/operators/finalize.js","../dist/esm5_for_rollup/internal/operators/find.js","../dist/esm5_for_rollup/internal/operators/findIndex.js","../dist/esm5_for_rollup/internal/operators/first.js","../dist/esm5_for_rollup/internal/operators/ignoreElements.js","../dist/esm5_for_rollup/internal/operators/isEmpty.js","../dist/esm5_for_rollup/internal/operators/takeLast.js","../dist/esm5_for_rollup/internal/operators/last.js","../dist/esm5_for_rollup/internal/operators/mapTo.js","../dist/esm5_for_rollup/internal/operators/materialize.js","../dist/esm5_for_rollup/internal/operators/scan.js","../dist/esm5_for_rollup/internal/operators/reduce.js","../dist/esm5_for_rollup/internal/operators/max.js","../dist/esm5_for_rollup/internal/operators/merge.js","../dist/esm5_for_rollup/internal/operators/mergeMapTo.js","../dist/esm5_for_rollup/internal/operators/mergeScan.js","../dist/esm5_for_rollup/internal/operators/min.js","../dist/esm5_for_rollup/internal/operators/multicast.js","../dist/esm5_for_rollup/internal/operators/onErrorResumeNext.js","../dist/esm5_for_rollup/internal/operators/pairwise.js","../dist/esm5_for_rollup/internal/operators/partition.js","../dist/esm5_for_rollup/internal/operators/pluck.js","../dist/esm5_for_rollup/internal/operators/publish.js","../dist/esm5_for_rollup/internal/operators/publishBehavior.js","../dist/esm5_for_rollup/internal/operators/publishLast.js","../dist/esm5_for_rollup/internal/operators/publishReplay.js","../dist/esm5_for_rollup/internal/operators/race.js","../dist/esm5_for_rollup/internal/operators/repeat.js","../dist/esm5_for_rollup/internal/operators/repeatWhen.js","../dist/esm5_for_rollup/internal/operators/retry.js","../dist/esm5_for_rollup/internal/operators/retryWhen.js","../dist/esm5_for_rollup/internal/operators/sample.js","../dist/esm5_for_rollup/internal/operators/sampleTime.js","../dist/esm5_for_rollup/internal/operators/sequenceEqual.js","../dist/esm5_for_rollup/internal/operators/share.js","../dist/esm5_for_rollup/internal/operators/shareReplay.js","../dist/esm5_for_rollup/internal/operators/single.js","../dist/esm5_for_rollup/internal/operators/skip.js","../dist/esm5_for_rollup/internal/operators/skipLast.js","../dist/esm5_for_rollup/internal/operators/skipUntil.js","../dist/esm5_for_rollup/internal/operators/skipWhile.js","../dist/esm5_for_rollup/internal/operators/startWith.js","../dist/esm5_for_rollup/internal/observable/SubscribeOnObservable.js","../dist/esm5_for_rollup/internal/operators/subscribeOn.js","../dist/esm5_for_rollup/internal/operators/switchMap.js","../dist/esm5_for_rollup/internal/operators/switchAll.js","../dist/esm5_for_rollup/internal/operators/switchMapTo.js","../dist/esm5_for_rollup/internal/operators/takeUntil.js","../dist/esm5_for_rollup/internal/operators/takeWhile.js","../dist/esm5_for_rollup/internal/operators/tap.js","../dist/esm5_for_rollup/internal/operators/throttle.js","../dist/esm5_for_rollup/internal/operators/throttleTime.js","../dist/esm5_for_rollup/internal/operators/timeInterval.js","../dist/esm5_for_rollup/internal/operators/timeoutWith.js","../dist/esm5_for_rollup/internal/operators/timeout.js","../dist/esm5_for_rollup/internal/operators/timestamp.js","../dist/esm5_for_rollup/internal/operators/toArray.js","../dist/esm5_for_rollup/internal/operators/window.js","../dist/esm5_for_rollup/internal/operators/windowCount.js","../dist/esm5_for_rollup/internal/operators/windowTime.js","../dist/esm5_for_rollup/internal/operators/windowToggle.js","../dist/esm5_for_rollup/internal/operators/windowWhen.js","../dist/esm5_for_rollup/internal/operators/withLatestFrom.js","../dist/esm5_for_rollup/internal/operators/zip.js","../dist/esm5_for_rollup/internal/operators/zipAll.js","../dist/esm5_for_rollup/internal/testing/SubscriptionLog.js","../dist/esm5_for_rollup/internal/testing/SubscriptionLoggable.js","../dist/esm5_for_rollup/internal/util/applyMixins.js","../dist/esm5_for_rollup/internal/testing/ColdObservable.js","../dist/esm5_for_rollup/internal/testing/HotObservable.js","../dist/esm5_for_rollup/internal/testing/TestScheduler.js","../dist/esm5_for_rollup/internal/util/root.js","../dist/esm5_for_rollup/internal/observable/dom/AjaxObservable.js","../dist/esm5_for_rollup/internal/observable/dom/ajax.js","../dist/esm5_for_rollup/internal/observable/dom/WebSocketSubject.js","../dist/esm5_for_rollup/internal/observable/dom/webSocket.js","../dist/esm5_for_rollup/internal/observable/dom/fetch.js","../dist/esm5_for_rollup/internal/umd.js"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n    ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n    function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = Object.assign || function __assign(t) {\r\n    for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n        s = arguments[i];\r\n        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n    }\r\n    return t;\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n            t[p[i]] = s[p[i]];\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [0, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n    if (m) return m.call(o);\r\n    return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);  }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator];\r\n    return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","export function isFunction(x) {\n    return typeof x === 'function';\n}\n//# sourceMappingURL=isFunction.js.map","var _enable_super_gross_mode_that_will_cause_bad_things = false;\nexport var config = {\n    Promise: undefined,\n    set useDeprecatedSynchronousErrorHandling(value) {\n        if (value) {\n            var error = new Error();\n            console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \\n' + error.stack);\n        }\n        else if (_enable_super_gross_mode_that_will_cause_bad_things) {\n            console.log('RxJS: Back to a better error behavior. Thank you. <3');\n        }\n        _enable_super_gross_mode_that_will_cause_bad_things = value;\n    },\n    get useDeprecatedSynchronousErrorHandling() {\n        return _enable_super_gross_mode_that_will_cause_bad_things;\n    },\n};\n//# sourceMappingURL=config.js.map","export function hostReportError(err) {\n    setTimeout(function () { throw err; }, 0);\n}\n//# sourceMappingURL=hostReportError.js.map","import { config } from './config';\nimport { hostReportError } from './util/hostReportError';\nexport var empty = {\n    closed: true,\n    next: function (value) { },\n    error: function (err) {\n        if (config.useDeprecatedSynchronousErrorHandling) {\n            throw err;\n        }\n        else {\n            hostReportError(err);\n        }\n    },\n    complete: function () { }\n};\n//# sourceMappingURL=Observer.js.map","export var isArray = (function () { return Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); })();\n//# sourceMappingURL=isArray.js.map","export function isObject(x) {\n    return x !== null && typeof x === 'object';\n}\n//# sourceMappingURL=isObject.js.map","var UnsubscriptionErrorImpl = (function () {\n    function UnsubscriptionErrorImpl(errors) {\n        Error.call(this);\n        this.message = errors ?\n            errors.length + \" errors occurred during unsubscription:\\n\" + errors.map(function (err, i) { return i + 1 + \") \" + err.toString(); }).join('\\n  ') : '';\n        this.name = 'UnsubscriptionError';\n        this.errors = errors;\n        return this;\n    }\n    UnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);\n    return UnsubscriptionErrorImpl;\n})();\nexport var UnsubscriptionError = UnsubscriptionErrorImpl;\n//# sourceMappingURL=UnsubscriptionError.js.map","import { isArray } from './util/isArray';\nimport { isObject } from './util/isObject';\nimport { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nvar Subscription = (function () {\n    function Subscription(unsubscribe) {\n        this.closed = false;\n        this._parentOrParents = null;\n        this._subscriptions = null;\n        if (unsubscribe) {\n            this._unsubscribe = unsubscribe;\n        }\n    }\n    Subscription.prototype.unsubscribe = function () {\n        var errors;\n        if (this.closed) {\n            return;\n        }\n        var _a = this, _parentOrParents = _a._parentOrParents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;\n        this.closed = true;\n        this._parentOrParents = null;\n        this._subscriptions = null;\n        if (_parentOrParents instanceof Subscription) {\n            _parentOrParents.remove(this);\n        }\n        else if (_parentOrParents !== null) {\n            for (var index = 0; index < _parentOrParents.length; ++index) {\n                var parent_1 = _parentOrParents[index];\n                parent_1.remove(this);\n            }\n        }\n        if (isFunction(_unsubscribe)) {\n            try {\n                _unsubscribe.call(this);\n            }\n            catch (e) {\n                errors = e instanceof UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];\n            }\n        }\n        if (isArray(_subscriptions)) {\n            var index = -1;\n            var len = _subscriptions.length;\n            while (++index < len) {\n                var sub = _subscriptions[index];\n                if (isObject(sub)) {\n                    try {\n                        sub.unsubscribe();\n                    }\n                    catch (e) {\n                        errors = errors || [];\n                        if (e instanceof UnsubscriptionError) {\n                            errors = errors.concat(flattenUnsubscriptionErrors(e.errors));\n                        }\n                        else {\n                            errors.push(e);\n                        }\n                    }\n                }\n            }\n        }\n        if (errors) {\n            throw new UnsubscriptionError(errors);\n        }\n    };\n    Subscription.prototype.add = function (teardown) {\n        var subscription = teardown;\n        if (!teardown) {\n            return Subscription.EMPTY;\n        }\n        switch (typeof teardown) {\n            case 'function':\n                subscription = new Subscription(teardown);\n            case 'object':\n                if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {\n                    return subscription;\n                }\n                else if (this.closed) {\n                    subscription.unsubscribe();\n                    return subscription;\n                }\n                else if (!(subscription instanceof Subscription)) {\n                    var tmp = subscription;\n                    subscription = new Subscription();\n                    subscription._subscriptions = [tmp];\n                }\n                break;\n            default: {\n                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');\n            }\n        }\n        var _parentOrParents = subscription._parentOrParents;\n        if (_parentOrParents === null) {\n            subscription._parentOrParents = this;\n        }\n        else if (_parentOrParents instanceof Subscription) {\n            if (_parentOrParents === this) {\n                return subscription;\n            }\n            subscription._parentOrParents = [_parentOrParents, this];\n        }\n        else if (_parentOrParents.indexOf(this) === -1) {\n            _parentOrParents.push(this);\n        }\n        else {\n            return subscription;\n        }\n        var subscriptions = this._subscriptions;\n        if (subscriptions === null) {\n            this._subscriptions = [subscription];\n        }\n        else {\n            subscriptions.push(subscription);\n        }\n        return subscription;\n    };\n    Subscription.prototype.remove = function (subscription) {\n        var subscriptions = this._subscriptions;\n        if (subscriptions) {\n            var subscriptionIndex = subscriptions.indexOf(subscription);\n            if (subscriptionIndex !== -1) {\n                subscriptions.splice(subscriptionIndex, 1);\n            }\n        }\n    };\n    Subscription.EMPTY = (function (empty) {\n        empty.closed = true;\n        return empty;\n    }(new Subscription()));\n    return Subscription;\n}());\nexport { Subscription };\nfunction flattenUnsubscriptionErrors(errors) {\n    return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError) ? err.errors : err); }, []);\n}\n//# sourceMappingURL=Subscription.js.map","export var rxSubscriber = (function () {\n    return typeof Symbol === 'function'\n        ? Symbol('rxSubscriber')\n        : '@@rxSubscriber_' + Math.random();\n})();\nexport var $$rxSubscriber = rxSubscriber;\n//# sourceMappingURL=rxSubscriber.js.map","import * as tslib_1 from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { empty as emptyObserver } from './Observer';\nimport { Subscription } from './Subscription';\nimport { rxSubscriber as rxSubscriberSymbol } from '../internal/symbol/rxSubscriber';\nimport { config } from './config';\nimport { hostReportError } from './util/hostReportError';\nvar Subscriber = (function (_super) {\n    tslib_1.__extends(Subscriber, _super);\n    function Subscriber(destinationOrNext, error, complete) {\n        var _this = _super.call(this) || this;\n        _this.syncErrorValue = null;\n        _this.syncErrorThrown = false;\n        _this.syncErrorThrowable = false;\n        _this.isStopped = false;\n        switch (arguments.length) {\n            case 0:\n                _this.destination = emptyObserver;\n                break;\n            case 1:\n                if (!destinationOrNext) {\n                    _this.destination = emptyObserver;\n                    break;\n                }\n                if (typeof destinationOrNext === 'object') {\n                    if (destinationOrNext instanceof Subscriber) {\n                        _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;\n                        _this.destination = destinationOrNext;\n                        destinationOrNext.add(_this);\n                    }\n                    else {\n                        _this.syncErrorThrowable = true;\n                        _this.destination = new SafeSubscriber(_this, destinationOrNext);\n                    }\n                    break;\n                }\n            default:\n                _this.syncErrorThrowable = true;\n                _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete);\n                break;\n        }\n        return _this;\n    }\n    Subscriber.prototype[rxSubscriberSymbol] = function () { return this; };\n    Subscriber.create = function (next, error, complete) {\n        var subscriber = new Subscriber(next, error, complete);\n        subscriber.syncErrorThrowable = false;\n        return subscriber;\n    };\n    Subscriber.prototype.next = function (value) {\n        if (!this.isStopped) {\n            this._next(value);\n        }\n    };\n    Subscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            this.isStopped = true;\n            this._error(err);\n        }\n    };\n    Subscriber.prototype.complete = function () {\n        if (!this.isStopped) {\n            this.isStopped = true;\n            this._complete();\n        }\n    };\n    Subscriber.prototype.unsubscribe = function () {\n        if (this.closed) {\n            return;\n        }\n        this.isStopped = true;\n        _super.prototype.unsubscribe.call(this);\n    };\n    Subscriber.prototype._next = function (value) {\n        this.destination.next(value);\n    };\n    Subscriber.prototype._error = function (err) {\n        this.destination.error(err);\n        this.unsubscribe();\n    };\n    Subscriber.prototype._complete = function () {\n        this.destination.complete();\n        this.unsubscribe();\n    };\n    Subscriber.prototype._unsubscribeAndRecycle = function () {\n        var _parentOrParents = this._parentOrParents;\n        this._parentOrParents = null;\n        this.unsubscribe();\n        this.closed = false;\n        this.isStopped = false;\n        this._parentOrParents = _parentOrParents;\n        return this;\n    };\n    return Subscriber;\n}(Subscription));\nexport { Subscriber };\nvar SafeSubscriber = (function (_super) {\n    tslib_1.__extends(SafeSubscriber, _super);\n    function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) {\n        var _this = _super.call(this) || this;\n        _this._parentSubscriber = _parentSubscriber;\n        var next;\n        var context = _this;\n        if (isFunction(observerOrNext)) {\n            next = observerOrNext;\n        }\n        else if (observerOrNext) {\n            next = observerOrNext.next;\n            error = observerOrNext.error;\n            complete = observerOrNext.complete;\n            if (observerOrNext !== emptyObserver) {\n                context = Object.create(observerOrNext);\n                if (isFunction(context.unsubscribe)) {\n                    _this.add(context.unsubscribe.bind(context));\n                }\n                context.unsubscribe = _this.unsubscribe.bind(_this);\n            }\n        }\n        _this._context = context;\n        _this._next = next;\n        _this._error = error;\n        _this._complete = complete;\n        return _this;\n    }\n    SafeSubscriber.prototype.next = function (value) {\n        if (!this.isStopped && this._next) {\n            var _parentSubscriber = this._parentSubscriber;\n            if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {\n                this.__tryOrUnsub(this._next, value);\n            }\n            else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {\n                this.unsubscribe();\n            }\n        }\n    };\n    SafeSubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var _parentSubscriber = this._parentSubscriber;\n            var useDeprecatedSynchronousErrorHandling = config.useDeprecatedSynchronousErrorHandling;\n            if (this._error) {\n                if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {\n                    this.__tryOrUnsub(this._error, err);\n                    this.unsubscribe();\n                }\n                else {\n                    this.__tryOrSetError(_parentSubscriber, this._error, err);\n                    this.unsubscribe();\n                }\n            }\n            else if (!_parentSubscriber.syncErrorThrowable) {\n                this.unsubscribe();\n                if (useDeprecatedSynchronousErrorHandling) {\n                    throw err;\n                }\n                hostReportError(err);\n            }\n            else {\n                if (useDeprecatedSynchronousErrorHandling) {\n                    _parentSubscriber.syncErrorValue = err;\n                    _parentSubscriber.syncErrorThrown = true;\n                }\n                else {\n                    hostReportError(err);\n                }\n                this.unsubscribe();\n            }\n        }\n    };\n    SafeSubscriber.prototype.complete = function () {\n        var _this = this;\n        if (!this.isStopped) {\n            var _parentSubscriber = this._parentSubscriber;\n            if (this._complete) {\n                var wrappedComplete = function () { return _this._complete.call(_this._context); };\n                if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {\n                    this.__tryOrUnsub(wrappedComplete);\n                    this.unsubscribe();\n                }\n                else {\n                    this.__tryOrSetError(_parentSubscriber, wrappedComplete);\n                    this.unsubscribe();\n                }\n            }\n            else {\n                this.unsubscribe();\n            }\n        }\n    };\n    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {\n        try {\n            fn.call(this._context, value);\n        }\n        catch (err) {\n            this.unsubscribe();\n            if (config.useDeprecatedSynchronousErrorHandling) {\n                throw err;\n            }\n            else {\n                hostReportError(err);\n            }\n        }\n    };\n    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {\n        if (!config.useDeprecatedSynchronousErrorHandling) {\n            throw new Error('bad call');\n        }\n        try {\n            fn.call(this._context, value);\n        }\n        catch (err) {\n            if (config.useDeprecatedSynchronousErrorHandling) {\n                parent.syncErrorValue = err;\n                parent.syncErrorThrown = true;\n                return true;\n            }\n            else {\n                hostReportError(err);\n                return true;\n            }\n        }\n        return false;\n    };\n    SafeSubscriber.prototype._unsubscribe = function () {\n        var _parentSubscriber = this._parentSubscriber;\n        this._context = null;\n        this._parentSubscriber = null;\n        _parentSubscriber.unsubscribe();\n    };\n    return SafeSubscriber;\n}(Subscriber));\nexport { SafeSubscriber };\n//# sourceMappingURL=Subscriber.js.map","import { Subscriber } from '../Subscriber';\nexport function canReportError(observer) {\n    while (observer) {\n        var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped;\n        if (closed_1 || isStopped) {\n            return false;\n        }\n        else if (destination && destination instanceof Subscriber) {\n            observer = destination;\n        }\n        else {\n            observer = null;\n        }\n    }\n    return true;\n}\n//# sourceMappingURL=canReportError.js.map","import { Subscriber } from '../Subscriber';\nimport { rxSubscriber as rxSubscriberSymbol } from '../symbol/rxSubscriber';\nimport { empty as emptyObserver } from '../Observer';\nexport function toSubscriber(nextOrObserver, error, complete) {\n    if (nextOrObserver) {\n        if (nextOrObserver instanceof Subscriber) {\n            return nextOrObserver;\n        }\n        if (nextOrObserver[rxSubscriberSymbol]) {\n            return nextOrObserver[rxSubscriberSymbol]();\n        }\n    }\n    if (!nextOrObserver && !error && !complete) {\n        return new Subscriber(emptyObserver);\n    }\n    return new Subscriber(nextOrObserver, error, complete);\n}\n//# sourceMappingURL=toSubscriber.js.map","export var observable = (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })();\n//# sourceMappingURL=observable.js.map","export function noop() { }\n//# sourceMappingURL=noop.js.map","import { noop } from './noop';\nexport function pipe() {\n    var fns = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        fns[_i] = arguments[_i];\n    }\n    return pipeFromArray(fns);\n}\nexport function pipeFromArray(fns) {\n    if (!fns) {\n        return noop;\n    }\n    if (fns.length === 1) {\n        return fns[0];\n    }\n    return function piped(input) {\n        return fns.reduce(function (prev, fn) { return fn(prev); }, input);\n    };\n}\n//# sourceMappingURL=pipe.js.map","import { canReportError } from './util/canReportError';\nimport { toSubscriber } from './util/toSubscriber';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nvar Observable = (function () {\n    function Observable(subscribe) {\n        this._isScalar = false;\n        if (subscribe) {\n            this._subscribe = subscribe;\n        }\n    }\n    Observable.prototype.lift = function (operator) {\n        var observable = new Observable();\n        observable.source = this;\n        observable.operator = operator;\n        return observable;\n    };\n    Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n        var operator = this.operator;\n        var sink = toSubscriber(observerOrNext, error, complete);\n        if (operator) {\n            sink.add(operator.call(sink, this.source));\n        }\n        else {\n            sink.add(this.source || (config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?\n                this._subscribe(sink) :\n                this._trySubscribe(sink));\n        }\n        if (config.useDeprecatedSynchronousErrorHandling) {\n            if (sink.syncErrorThrowable) {\n                sink.syncErrorThrowable = false;\n                if (sink.syncErrorThrown) {\n                    throw sink.syncErrorValue;\n                }\n            }\n        }\n        return sink;\n    };\n    Observable.prototype._trySubscribe = function (sink) {\n        try {\n            return this._subscribe(sink);\n        }\n        catch (err) {\n            if (config.useDeprecatedSynchronousErrorHandling) {\n                sink.syncErrorThrown = true;\n                sink.syncErrorValue = err;\n            }\n            if (canReportError(sink)) {\n                sink.error(err);\n            }\n            else {\n                console.warn(err);\n            }\n        }\n    };\n    Observable.prototype.forEach = function (next, promiseCtor) {\n        var _this = this;\n        promiseCtor = getPromiseCtor(promiseCtor);\n        return new promiseCtor(function (resolve, reject) {\n            var subscription;\n            subscription = _this.subscribe(function (value) {\n                try {\n                    next(value);\n                }\n                catch (err) {\n                    reject(err);\n                    if (subscription) {\n                        subscription.unsubscribe();\n                    }\n                }\n            }, reject, resolve);\n        });\n    };\n    Observable.prototype._subscribe = function (subscriber) {\n        var source = this.source;\n        return source && source.subscribe(subscriber);\n    };\n    Observable.prototype[Symbol_observable] = function () {\n        return this;\n    };\n    Observable.prototype.pipe = function () {\n        var operations = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            operations[_i] = arguments[_i];\n        }\n        if (operations.length === 0) {\n            return this;\n        }\n        return pipeFromArray(operations)(this);\n    };\n    Observable.prototype.toPromise = function (promiseCtor) {\n        var _this = this;\n        promiseCtor = getPromiseCtor(promiseCtor);\n        return new promiseCtor(function (resolve, reject) {\n            var value;\n            _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });\n        });\n    };\n    Observable.create = function (subscribe) {\n        return new Observable(subscribe);\n    };\n    return Observable;\n}());\nexport { Observable };\nfunction getPromiseCtor(promiseCtor) {\n    if (!promiseCtor) {\n        promiseCtor = config.Promise || Promise;\n    }\n    if (!promiseCtor) {\n        throw new Error('no Promise impl found');\n    }\n    return promiseCtor;\n}\n//# sourceMappingURL=Observable.js.map","var ObjectUnsubscribedErrorImpl = (function () {\n    function ObjectUnsubscribedErrorImpl() {\n        Error.call(this);\n        this.message = 'object unsubscribed';\n        this.name = 'ObjectUnsubscribedError';\n        return this;\n    }\n    ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);\n    return ObjectUnsubscribedErrorImpl;\n})();\nexport var ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;\n//# sourceMappingURL=ObjectUnsubscribedError.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscription } from './Subscription';\nvar SubjectSubscription = (function (_super) {\n    tslib_1.__extends(SubjectSubscription, _super);\n    function SubjectSubscription(subject, subscriber) {\n        var _this = _super.call(this) || this;\n        _this.subject = subject;\n        _this.subscriber = subscriber;\n        _this.closed = false;\n        return _this;\n    }\n    SubjectSubscription.prototype.unsubscribe = function () {\n        if (this.closed) {\n            return;\n        }\n        this.closed = true;\n        var subject = this.subject;\n        var observers = subject.observers;\n        this.subject = null;\n        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {\n            return;\n        }\n        var subscriberIndex = observers.indexOf(this.subscriber);\n        if (subscriberIndex !== -1) {\n            observers.splice(subscriberIndex, 1);\n        }\n    };\n    return SubjectSubscription;\n}(Subscription));\nexport { SubjectSubscription };\n//# sourceMappingURL=SubjectSubscription.js.map","import * as tslib_1 from \"tslib\";\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { SubjectSubscription } from './SubjectSubscription';\nimport { rxSubscriber as rxSubscriberSymbol } from '../internal/symbol/rxSubscriber';\nvar SubjectSubscriber = (function (_super) {\n    tslib_1.__extends(SubjectSubscriber, _super);\n    function SubjectSubscriber(destination) {\n        var _this = _super.call(this, destination) || this;\n        _this.destination = destination;\n        return _this;\n    }\n    return SubjectSubscriber;\n}(Subscriber));\nexport { SubjectSubscriber };\nvar Subject = (function (_super) {\n    tslib_1.__extends(Subject, _super);\n    function Subject() {\n        var _this = _super.call(this) || this;\n        _this.observers = [];\n        _this.closed = false;\n        _this.isStopped = false;\n        _this.hasError = false;\n        _this.thrownError = null;\n        return _this;\n    }\n    Subject.prototype[rxSubscriberSymbol] = function () {\n        return new SubjectSubscriber(this);\n    };\n    Subject.prototype.lift = function (operator) {\n        var subject = new AnonymousSubject(this, this);\n        subject.operator = operator;\n        return subject;\n    };\n    Subject.prototype.next = function (value) {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError();\n        }\n        if (!this.isStopped) {\n            var observers = this.observers;\n            var len = observers.length;\n            var copy = observers.slice();\n            for (var i = 0; i < len; i++) {\n                copy[i].next(value);\n            }\n        }\n    };\n    Subject.prototype.error = function (err) {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError();\n        }\n        this.hasError = true;\n        this.thrownError = err;\n        this.isStopped = true;\n        var observers = this.observers;\n        var len = observers.length;\n        var copy = observers.slice();\n        for (var i = 0; i < len; i++) {\n            copy[i].error(err);\n        }\n        this.observers.length = 0;\n    };\n    Subject.prototype.complete = function () {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError();\n        }\n        this.isStopped = true;\n        var observers = this.observers;\n        var len = observers.length;\n        var copy = observers.slice();\n        for (var i = 0; i < len; i++) {\n            copy[i].complete();\n        }\n        this.observers.length = 0;\n    };\n    Subject.prototype.unsubscribe = function () {\n        this.isStopped = true;\n        this.closed = true;\n        this.observers = null;\n    };\n    Subject.prototype._trySubscribe = function (subscriber) {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError();\n        }\n        else {\n            return _super.prototype._trySubscribe.call(this, subscriber);\n        }\n    };\n    Subject.prototype._subscribe = function (subscriber) {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError();\n        }\n        else if (this.hasError) {\n            subscriber.error(this.thrownError);\n            return Subscription.EMPTY;\n        }\n        else if (this.isStopped) {\n            subscriber.complete();\n            return Subscription.EMPTY;\n        }\n        else {\n            this.observers.push(subscriber);\n            return new SubjectSubscription(this, subscriber);\n        }\n    };\n    Subject.prototype.asObservable = function () {\n        var observable = new Observable();\n        observable.source = this;\n        return observable;\n    };\n    Subject.create = function (destination, source) {\n        return new AnonymousSubject(destination, source);\n    };\n    return Subject;\n}(Observable));\nexport { Subject };\nvar AnonymousSubject = (function (_super) {\n    tslib_1.__extends(AnonymousSubject, _super);\n    function AnonymousSubject(destination, source) {\n        var _this = _super.call(this) || this;\n        _this.destination = destination;\n        _this.source = source;\n        return _this;\n    }\n    AnonymousSubject.prototype.next = function (value) {\n        var destination = this.destination;\n        if (destination && destination.next) {\n            destination.next(value);\n        }\n    };\n    AnonymousSubject.prototype.error = function (err) {\n        var destination = this.destination;\n        if (destination && destination.error) {\n            this.destination.error(err);\n        }\n    };\n    AnonymousSubject.prototype.complete = function () {\n        var destination = this.destination;\n        if (destination && destination.complete) {\n            this.destination.complete();\n        }\n    };\n    AnonymousSubject.prototype._subscribe = function (subscriber) {\n        var source = this.source;\n        if (source) {\n            return this.source.subscribe(subscriber);\n        }\n        else {\n            return Subscription.EMPTY;\n        }\n    };\n    return AnonymousSubject;\n}(Subject));\nexport { AnonymousSubject };\n//# sourceMappingURL=Subject.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function refCount() {\n    return function refCountOperatorFunction(source) {\n        return source.lift(new RefCountOperator(source));\n    };\n}\nvar RefCountOperator = (function () {\n    function RefCountOperator(connectable) {\n        this.connectable = connectable;\n    }\n    RefCountOperator.prototype.call = function (subscriber, source) {\n        var connectable = this.connectable;\n        connectable._refCount++;\n        var refCounter = new RefCountSubscriber(subscriber, connectable);\n        var subscription = source.subscribe(refCounter);\n        if (!refCounter.closed) {\n            refCounter.connection = connectable.connect();\n        }\n        return subscription;\n    };\n    return RefCountOperator;\n}());\nvar RefCountSubscriber = (function (_super) {\n    tslib_1.__extends(RefCountSubscriber, _super);\n    function RefCountSubscriber(destination, connectable) {\n        var _this = _super.call(this, destination) || this;\n        _this.connectable = connectable;\n        return _this;\n    }\n    RefCountSubscriber.prototype._unsubscribe = function () {\n        var connectable = this.connectable;\n        if (!connectable) {\n            this.connection = null;\n            return;\n        }\n        this.connectable = null;\n        var refCount = connectable._refCount;\n        if (refCount <= 0) {\n            this.connection = null;\n            return;\n        }\n        connectable._refCount = refCount - 1;\n        if (refCount > 1) {\n            this.connection = null;\n            return;\n        }\n        var connection = this.connection;\n        var sharedConnection = connectable._connection;\n        this.connection = null;\n        if (sharedConnection && (!connection || sharedConnection === connection)) {\n            sharedConnection.unsubscribe();\n        }\n    };\n    return RefCountSubscriber;\n}(Subscriber));\n//# sourceMappingURL=refCount.js.map","import * as tslib_1 from \"tslib\";\nimport { SubjectSubscriber } from '../Subject';\nimport { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\nimport { refCount as higherOrderRefCount } from '../operators/refCount';\nvar ConnectableObservable = (function (_super) {\n    tslib_1.__extends(ConnectableObservable, _super);\n    function ConnectableObservable(source, subjectFactory) {\n        var _this = _super.call(this) || this;\n        _this.source = source;\n        _this.subjectFactory = subjectFactory;\n        _this._refCount = 0;\n        _this._isComplete = false;\n        return _this;\n    }\n    ConnectableObservable.prototype._subscribe = function (subscriber) {\n        return this.getSubject().subscribe(subscriber);\n    };\n    ConnectableObservable.prototype.getSubject = function () {\n        var subject = this._subject;\n        if (!subject || subject.isStopped) {\n            this._subject = this.subjectFactory();\n        }\n        return this._subject;\n    };\n    ConnectableObservable.prototype.connect = function () {\n        var connection = this._connection;\n        if (!connection) {\n            this._isComplete = false;\n            connection = this._connection = new Subscription();\n            connection.add(this.source\n                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));\n            if (connection.closed) {\n                this._connection = null;\n                connection = Subscription.EMPTY;\n            }\n        }\n        return connection;\n    };\n    ConnectableObservable.prototype.refCount = function () {\n        return higherOrderRefCount()(this);\n    };\n    return ConnectableObservable;\n}(Observable));\nexport { ConnectableObservable };\nexport var connectableObservableDescriptor = (function () {\n    var connectableProto = ConnectableObservable.prototype;\n    return {\n        operator: { value: null },\n        _refCount: { value: 0, writable: true },\n        _subject: { value: null, writable: true },\n        _connection: { value: null, writable: true },\n        _subscribe: { value: connectableProto._subscribe },\n        _isComplete: { value: connectableProto._isComplete, writable: true },\n        getSubject: { value: connectableProto.getSubject },\n        connect: { value: connectableProto.connect },\n        refCount: { value: connectableProto.refCount }\n    };\n})();\nvar ConnectableSubscriber = (function (_super) {\n    tslib_1.__extends(ConnectableSubscriber, _super);\n    function ConnectableSubscriber(destination, connectable) {\n        var _this = _super.call(this, destination) || this;\n        _this.connectable = connectable;\n        return _this;\n    }\n    ConnectableSubscriber.prototype._error = function (err) {\n        this._unsubscribe();\n        _super.prototype._error.call(this, err);\n    };\n    ConnectableSubscriber.prototype._complete = function () {\n        this.connectable._isComplete = true;\n        this._unsubscribe();\n        _super.prototype._complete.call(this);\n    };\n    ConnectableSubscriber.prototype._unsubscribe = function () {\n        var connectable = this.connectable;\n        if (connectable) {\n            this.connectable = null;\n            var connection = connectable._connection;\n            connectable._refCount = 0;\n            connectable._subject = null;\n            connectable._connection = null;\n            if (connection) {\n                connection.unsubscribe();\n            }\n        }\n    };\n    return ConnectableSubscriber;\n}(SubjectSubscriber));\nvar RefCountOperator = (function () {\n    function RefCountOperator(connectable) {\n        this.connectable = connectable;\n    }\n    RefCountOperator.prototype.call = function (subscriber, source) {\n        var connectable = this.connectable;\n        connectable._refCount++;\n        var refCounter = new RefCountSubscriber(subscriber, connectable);\n        var subscription = source.subscribe(refCounter);\n        if (!refCounter.closed) {\n            refCounter.connection = connectable.connect();\n        }\n        return subscription;\n    };\n    return RefCountOperator;\n}());\nvar RefCountSubscriber = (function (_super) {\n    tslib_1.__extends(RefCountSubscriber, _super);\n    function RefCountSubscriber(destination, connectable) {\n        var _this = _super.call(this, destination) || this;\n        _this.connectable = connectable;\n        return _this;\n    }\n    RefCountSubscriber.prototype._unsubscribe = function () {\n        var connectable = this.connectable;\n        if (!connectable) {\n            this.connection = null;\n            return;\n        }\n        this.connectable = null;\n        var refCount = connectable._refCount;\n        if (refCount <= 0) {\n            this.connection = null;\n            return;\n        }\n        connectable._refCount = refCount - 1;\n        if (refCount > 1) {\n            this.connection = null;\n            return;\n        }\n        var connection = this.connection;\n        var sharedConnection = connectable._connection;\n        this.connection = null;\n        if (sharedConnection && (!connection || sharedConnection === connection)) {\n            sharedConnection.unsubscribe();\n        }\n    };\n    return RefCountSubscriber;\n}(Subscriber));\n//# sourceMappingURL=ConnectableObservable.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\nimport { Observable } from '../Observable';\nimport { Subject } from '../Subject';\nexport function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {\n    return function (source) {\n        return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));\n    };\n}\nvar GroupByOperator = (function () {\n    function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) {\n        this.keySelector = keySelector;\n        this.elementSelector = elementSelector;\n        this.durationSelector = durationSelector;\n        this.subjectSelector = subjectSelector;\n    }\n    GroupByOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));\n    };\n    return GroupByOperator;\n}());\nvar GroupBySubscriber = (function (_super) {\n    tslib_1.__extends(GroupBySubscriber, _super);\n    function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.keySelector = keySelector;\n        _this.elementSelector = elementSelector;\n        _this.durationSelector = durationSelector;\n        _this.subjectSelector = subjectSelector;\n        _this.groups = null;\n        _this.attemptedToUnsubscribe = false;\n        _this.count = 0;\n        return _this;\n    }\n    GroupBySubscriber.prototype._next = function (value) {\n        var key;\n        try {\n            key = this.keySelector(value);\n        }\n        catch (err) {\n            this.error(err);\n            return;\n        }\n        this._group(value, key);\n    };\n    GroupBySubscriber.prototype._group = function (value, key) {\n        var groups = this.groups;\n        if (!groups) {\n            groups = this.groups = new Map();\n        }\n        var group = groups.get(key);\n        var element;\n        if (this.elementSelector) {\n            try {\n                element = this.elementSelector(value);\n            }\n            catch (err) {\n                this.error(err);\n            }\n        }\n        else {\n            element = value;\n        }\n        if (!group) {\n            group = (this.subjectSelector ? this.subjectSelector() : new Subject());\n            groups.set(key, group);\n            var groupedObservable = new GroupedObservable(key, group, this);\n            this.destination.next(groupedObservable);\n            if (this.durationSelector) {\n                var duration = void 0;\n                try {\n                    duration = this.durationSelector(new GroupedObservable(key, group));\n                }\n                catch (err) {\n                    this.error(err);\n                    return;\n                }\n                this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));\n            }\n        }\n        if (!group.closed) {\n            group.next(element);\n        }\n    };\n    GroupBySubscriber.prototype._error = function (err) {\n        var groups = this.groups;\n        if (groups) {\n            groups.forEach(function (group, key) {\n                group.error(err);\n            });\n            groups.clear();\n        }\n        this.destination.error(err);\n    };\n    GroupBySubscriber.prototype._complete = function () {\n        var groups = this.groups;\n        if (groups) {\n            groups.forEach(function (group, key) {\n                group.complete();\n            });\n            groups.clear();\n        }\n        this.destination.complete();\n    };\n    GroupBySubscriber.prototype.removeGroup = function (key) {\n        this.groups.delete(key);\n    };\n    GroupBySubscriber.prototype.unsubscribe = function () {\n        if (!this.closed) {\n            this.attemptedToUnsubscribe = true;\n            if (this.count === 0) {\n                _super.prototype.unsubscribe.call(this);\n            }\n        }\n    };\n    return GroupBySubscriber;\n}(Subscriber));\nvar GroupDurationSubscriber = (function (_super) {\n    tslib_1.__extends(GroupDurationSubscriber, _super);\n    function GroupDurationSubscriber(key, group, parent) {\n        var _this = _super.call(this, group) || this;\n        _this.key = key;\n        _this.group = group;\n        _this.parent = parent;\n        return _this;\n    }\n    GroupDurationSubscriber.prototype._next = function (value) {\n        this.complete();\n    };\n    GroupDurationSubscriber.prototype._unsubscribe = function () {\n        var _a = this, parent = _a.parent, key = _a.key;\n        this.key = this.parent = null;\n        if (parent) {\n            parent.removeGroup(key);\n        }\n    };\n    return GroupDurationSubscriber;\n}(Subscriber));\nvar GroupedObservable = (function (_super) {\n    tslib_1.__extends(GroupedObservable, _super);\n    function GroupedObservable(key, groupSubject, refCountSubscription) {\n        var _this = _super.call(this) || this;\n        _this.key = key;\n        _this.groupSubject = groupSubject;\n        _this.refCountSubscription = refCountSubscription;\n        return _this;\n    }\n    GroupedObservable.prototype._subscribe = function (subscriber) {\n        var subscription = new Subscription();\n        var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject;\n        if (refCountSubscription && !refCountSubscription.closed) {\n            subscription.add(new InnerRefCountSubscription(refCountSubscription));\n        }\n        subscription.add(groupSubject.subscribe(subscriber));\n        return subscription;\n    };\n    return GroupedObservable;\n}(Observable));\nexport { GroupedObservable };\nvar InnerRefCountSubscription = (function (_super) {\n    tslib_1.__extends(InnerRefCountSubscription, _super);\n    function InnerRefCountSubscription(parent) {\n        var _this = _super.call(this) || this;\n        _this.parent = parent;\n        parent.count++;\n        return _this;\n    }\n    InnerRefCountSubscription.prototype.unsubscribe = function () {\n        var parent = this.parent;\n        if (!parent.closed && !this.closed) {\n            _super.prototype.unsubscribe.call(this);\n            parent.count -= 1;\n            if (parent.count === 0 && parent.attemptedToUnsubscribe) {\n                parent.unsubscribe();\n            }\n        }\n    };\n    return InnerRefCountSubscription;\n}(Subscription));\n//# sourceMappingURL=groupBy.js.map","import * as tslib_1 from \"tslib\";\nimport { Subject } from './Subject';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nvar BehaviorSubject = (function (_super) {\n    tslib_1.__extends(BehaviorSubject, _super);\n    function BehaviorSubject(_value) {\n        var _this = _super.call(this) || this;\n        _this._value = _value;\n        return _this;\n    }\n    Object.defineProperty(BehaviorSubject.prototype, \"value\", {\n        get: function () {\n            return this.getValue();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    BehaviorSubject.prototype._subscribe = function (subscriber) {\n        var subscription = _super.prototype._subscribe.call(this, subscriber);\n        if (subscription && !subscription.closed) {\n            subscriber.next(this._value);\n        }\n        return subscription;\n    };\n    BehaviorSubject.prototype.getValue = function () {\n        if (this.hasError) {\n            throw this.thrownError;\n        }\n        else if (this.closed) {\n            throw new ObjectUnsubscribedError();\n        }\n        else {\n            return this._value;\n        }\n    };\n    BehaviorSubject.prototype.next = function (value) {\n        _super.prototype.next.call(this, this._value = value);\n    };\n    return BehaviorSubject;\n}(Subject));\nexport { BehaviorSubject };\n//# sourceMappingURL=BehaviorSubject.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscription } from '../Subscription';\nvar Action = (function (_super) {\n    tslib_1.__extends(Action, _super);\n    function Action(scheduler, work) {\n        return _super.call(this) || this;\n    }\n    Action.prototype.schedule = function (state, delay) {\n        if (delay === void 0) { delay = 0; }\n        return this;\n    };\n    return Action;\n}(Subscription));\nexport { Action };\n//# sourceMappingURL=Action.js.map","import * as tslib_1 from \"tslib\";\nimport { Action } from './Action';\nvar AsyncAction = (function (_super) {\n    tslib_1.__extends(AsyncAction, _super);\n    function AsyncAction(scheduler, work) {\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        _this.pending = false;\n        return _this;\n    }\n    AsyncAction.prototype.schedule = function (state, delay) {\n        if (delay === void 0) { delay = 0; }\n        if (this.closed) {\n            return this;\n        }\n        this.state = state;\n        var id = this.id;\n        var scheduler = this.scheduler;\n        if (id != null) {\n            this.id = this.recycleAsyncId(scheduler, id, delay);\n        }\n        this.pending = true;\n        this.delay = delay;\n        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);\n        return this;\n    };\n    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        return setInterval(scheduler.flush.bind(scheduler, this), delay);\n    };\n    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        if (delay !== null && this.delay === delay && this.pending === false) {\n            return id;\n        }\n        clearInterval(id);\n        return undefined;\n    };\n    AsyncAction.prototype.execute = function (state, delay) {\n        if (this.closed) {\n            return new Error('executing a cancelled action');\n        }\n        this.pending = false;\n        var error = this._execute(state, delay);\n        if (error) {\n            return error;\n        }\n        else if (this.pending === false && this.id != null) {\n            this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n        }\n    };\n    AsyncAction.prototype._execute = function (state, delay) {\n        var errored = false;\n        var errorValue = undefined;\n        try {\n            this.work(state);\n        }\n        catch (e) {\n            errored = true;\n            errorValue = !!e && e || new Error(e);\n        }\n        if (errored) {\n            this.unsubscribe();\n            return errorValue;\n        }\n    };\n    AsyncAction.prototype._unsubscribe = function () {\n        var id = this.id;\n        var scheduler = this.scheduler;\n        var actions = scheduler.actions;\n        var index = actions.indexOf(this);\n        this.work = null;\n        this.state = null;\n        this.pending = false;\n        this.scheduler = null;\n        if (index !== -1) {\n            actions.splice(index, 1);\n        }\n        if (id != null) {\n            this.id = this.recycleAsyncId(scheduler, id, null);\n        }\n        this.delay = null;\n    };\n    return AsyncAction;\n}(Action));\nexport { AsyncAction };\n//# sourceMappingURL=AsyncAction.js.map","import * as tslib_1 from \"tslib\";\nimport { AsyncAction } from './AsyncAction';\nvar QueueAction = (function (_super) {\n    tslib_1.__extends(QueueAction, _super);\n    function QueueAction(scheduler, work) {\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        return _this;\n    }\n    QueueAction.prototype.schedule = function (state, delay) {\n        if (delay === void 0) { delay = 0; }\n        if (delay > 0) {\n            return _super.prototype.schedule.call(this, state, delay);\n        }\n        this.delay = delay;\n        this.state = state;\n        this.scheduler.flush(this);\n        return this;\n    };\n    QueueAction.prototype.execute = function (state, delay) {\n        return (delay > 0 || this.closed) ?\n            _super.prototype.execute.call(this, state, delay) :\n            this._execute(state, delay);\n    };\n    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);\n        }\n        return scheduler.flush(this);\n    };\n    return QueueAction;\n}(AsyncAction));\nexport { QueueAction };\n//# sourceMappingURL=QueueAction.js.map","var Scheduler = (function () {\n    function Scheduler(SchedulerAction, now) {\n        if (now === void 0) { now = Scheduler.now; }\n        this.SchedulerAction = SchedulerAction;\n        this.now = now;\n    }\n    Scheduler.prototype.schedule = function (work, delay, state) {\n        if (delay === void 0) { delay = 0; }\n        return new this.SchedulerAction(this, work).schedule(state, delay);\n    };\n    Scheduler.now = function () { return Date.now(); };\n    return Scheduler;\n}());\nexport { Scheduler };\n//# sourceMappingURL=Scheduler.js.map","import * as tslib_1 from \"tslib\";\nimport { Scheduler } from '../Scheduler';\nvar AsyncScheduler = (function (_super) {\n    tslib_1.__extends(AsyncScheduler, _super);\n    function AsyncScheduler(SchedulerAction, now) {\n        if (now === void 0) { now = Scheduler.now; }\n        var _this = _super.call(this, SchedulerAction, function () {\n            if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) {\n                return AsyncScheduler.delegate.now();\n            }\n            else {\n                return now();\n            }\n        }) || this;\n        _this.actions = [];\n        _this.active = false;\n        _this.scheduled = undefined;\n        return _this;\n    }\n    AsyncScheduler.prototype.schedule = function (work, delay, state) {\n        if (delay === void 0) { delay = 0; }\n        if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {\n            return AsyncScheduler.delegate.schedule(work, delay, state);\n        }\n        else {\n            return _super.prototype.schedule.call(this, work, delay, state);\n        }\n    };\n    AsyncScheduler.prototype.flush = function (action) {\n        var actions = this.actions;\n        if (this.active) {\n            actions.push(action);\n            return;\n        }\n        var error;\n        this.active = true;\n        do {\n            if (error = action.execute(action.state, action.delay)) {\n                break;\n            }\n        } while (action = actions.shift());\n        this.active = false;\n        if (error) {\n            while (action = actions.shift()) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    return AsyncScheduler;\n}(Scheduler));\nexport { AsyncScheduler };\n//# sourceMappingURL=AsyncScheduler.js.map","import * as tslib_1 from \"tslib\";\nimport { AsyncScheduler } from './AsyncScheduler';\nvar QueueScheduler = (function (_super) {\n    tslib_1.__extends(QueueScheduler, _super);\n    function QueueScheduler() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    return QueueScheduler;\n}(AsyncScheduler));\nexport { QueueScheduler };\n//# sourceMappingURL=QueueScheduler.js.map","import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\nexport var queue = new QueueScheduler(QueueAction);\n//# sourceMappingURL=queue.js.map","import { Observable } from '../Observable';\nexport var EMPTY = new Observable(function (subscriber) { return subscriber.complete(); });\nexport function empty(scheduler) {\n    return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\nfunction emptyScheduled(scheduler) {\n    return new Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });\n}\n//# sourceMappingURL=empty.js.map","export function isScheduler(value) {\n    return value && typeof value.schedule === 'function';\n}\n//# sourceMappingURL=isScheduler.js.map","export var subscribeToArray = function (array) { return function (subscriber) {\n    for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) {\n        subscriber.next(array[i]);\n    }\n    subscriber.complete();\n}; };\n//# sourceMappingURL=subscribeToArray.js.map","import { Observable } from '../Observable';\nimport { Subscription } from '../Subscription';\nexport function scheduleArray(input, scheduler) {\n    return new Observable(function (subscriber) {\n        var sub = new Subscription();\n        var i = 0;\n        sub.add(scheduler.schedule(function () {\n            if (i === input.length) {\n                subscriber.complete();\n                return;\n            }\n            subscriber.next(input[i++]);\n            if (!subscriber.closed) {\n                sub.add(this.schedule());\n            }\n        }));\n        return sub;\n    });\n}\n//# sourceMappingURL=scheduleArray.js.map","import { Observable } from '../Observable';\nimport { subscribeToArray } from '../util/subscribeToArray';\nimport { scheduleArray } from '../scheduled/scheduleArray';\nexport function fromArray(input, scheduler) {\n    if (!scheduler) {\n        return new Observable(subscribeToArray(input));\n    }\n    else {\n        return scheduleArray(input, scheduler);\n    }\n}\n//# sourceMappingURL=fromArray.js.map","import { isScheduler } from '../util/isScheduler';\nimport { fromArray } from './fromArray';\nimport { scheduleArray } from '../scheduled/scheduleArray';\nexport function of() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    var scheduler = args[args.length - 1];\n    if (isScheduler(scheduler)) {\n        args.pop();\n        return scheduleArray(args, scheduler);\n    }\n    else {\n        return fromArray(args);\n    }\n}\n//# sourceMappingURL=of.js.map","import { Observable } from '../Observable';\nexport function throwError(error, scheduler) {\n    if (!scheduler) {\n        return new Observable(function (subscriber) { return subscriber.error(error); });\n    }\n    else {\n        return new Observable(function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); });\n    }\n}\nfunction dispatch(_a) {\n    var error = _a.error, subscriber = _a.subscriber;\n    subscriber.error(error);\n}\n//# sourceMappingURL=throwError.js.map","import { empty } from './observable/empty';\nimport { of } from './observable/of';\nimport { throwError } from './observable/throwError';\nexport var NotificationKind;\n(function (NotificationKind) {\n    NotificationKind[\"NEXT\"] = \"N\";\n    NotificationKind[\"ERROR\"] = \"E\";\n    NotificationKind[\"COMPLETE\"] = \"C\";\n})(NotificationKind || (NotificationKind = {}));\nvar Notification = (function () {\n    function Notification(kind, value, error) {\n        this.kind = kind;\n        this.value = value;\n        this.error = error;\n        this.hasValue = kind === 'N';\n    }\n    Notification.prototype.observe = function (observer) {\n        switch (this.kind) {\n            case 'N':\n                return observer.next && observer.next(this.value);\n            case 'E':\n                return observer.error && observer.error(this.error);\n            case 'C':\n                return observer.complete && observer.complete();\n        }\n    };\n    Notification.prototype.do = function (next, error, complete) {\n        var kind = this.kind;\n        switch (kind) {\n            case 'N':\n                return next && next(this.value);\n            case 'E':\n                return error && error(this.error);\n            case 'C':\n                return complete && complete();\n        }\n    };\n    Notification.prototype.accept = function (nextOrObserver, error, complete) {\n        if (nextOrObserver && typeof nextOrObserver.next === 'function') {\n            return this.observe(nextOrObserver);\n        }\n        else {\n            return this.do(nextOrObserver, error, complete);\n        }\n    };\n    Notification.prototype.toObservable = function () {\n        var kind = this.kind;\n        switch (kind) {\n            case 'N':\n                return of(this.value);\n            case 'E':\n                return throwError(this.error);\n            case 'C':\n                return empty();\n        }\n        throw new Error('unexpected notification kind value');\n    };\n    Notification.createNext = function (value) {\n        if (typeof value !== 'undefined') {\n            return new Notification('N', value);\n        }\n        return Notification.undefinedValueNotification;\n    };\n    Notification.createError = function (err) {\n        return new Notification('E', undefined, err);\n    };\n    Notification.createComplete = function () {\n        return Notification.completeNotification;\n    };\n    Notification.completeNotification = new Notification('C');\n    Notification.undefinedValueNotification = new Notification('N', undefined);\n    return Notification;\n}());\nexport { Notification };\n//# sourceMappingURL=Notification.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { Notification } from '../Notification';\nexport function observeOn(scheduler, delay) {\n    if (delay === void 0) { delay = 0; }\n    return function observeOnOperatorFunction(source) {\n        return source.lift(new ObserveOnOperator(scheduler, delay));\n    };\n}\nvar ObserveOnOperator = (function () {\n    function ObserveOnOperator(scheduler, delay) {\n        if (delay === void 0) { delay = 0; }\n        this.scheduler = scheduler;\n        this.delay = delay;\n    }\n    ObserveOnOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));\n    };\n    return ObserveOnOperator;\n}());\nexport { ObserveOnOperator };\nvar ObserveOnSubscriber = (function (_super) {\n    tslib_1.__extends(ObserveOnSubscriber, _super);\n    function ObserveOnSubscriber(destination, scheduler, delay) {\n        if (delay === void 0) { delay = 0; }\n        var _this = _super.call(this, destination) || this;\n        _this.scheduler = scheduler;\n        _this.delay = delay;\n        return _this;\n    }\n    ObserveOnSubscriber.dispatch = function (arg) {\n        var notification = arg.notification, destination = arg.destination;\n        notification.observe(destination);\n        this.unsubscribe();\n    };\n    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {\n        var destination = this.destination;\n        destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));\n    };\n    ObserveOnSubscriber.prototype._next = function (value) {\n        this.scheduleMessage(Notification.createNext(value));\n    };\n    ObserveOnSubscriber.prototype._error = function (err) {\n        this.scheduleMessage(Notification.createError(err));\n        this.unsubscribe();\n    };\n    ObserveOnSubscriber.prototype._complete = function () {\n        this.scheduleMessage(Notification.createComplete());\n        this.unsubscribe();\n    };\n    return ObserveOnSubscriber;\n}(Subscriber));\nexport { ObserveOnSubscriber };\nvar ObserveOnMessage = (function () {\n    function ObserveOnMessage(notification, destination) {\n        this.notification = notification;\n        this.destination = destination;\n    }\n    return ObserveOnMessage;\n}());\nexport { ObserveOnMessage };\n//# sourceMappingURL=observeOn.js.map","import * as tslib_1 from \"tslib\";\nimport { Subject } from './Subject';\nimport { queue } from './scheduler/queue';\nimport { Subscription } from './Subscription';\nimport { ObserveOnSubscriber } from './operators/observeOn';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { SubjectSubscription } from './SubjectSubscription';\nvar ReplaySubject = (function (_super) {\n    tslib_1.__extends(ReplaySubject, _super);\n    function ReplaySubject(bufferSize, windowTime, scheduler) {\n        if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }\n        if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }\n        var _this = _super.call(this) || this;\n        _this.scheduler = scheduler;\n        _this._events = [];\n        _this._infiniteTimeWindow = false;\n        _this._bufferSize = bufferSize < 1 ? 1 : bufferSize;\n        _this._windowTime = windowTime < 1 ? 1 : windowTime;\n        if (windowTime === Number.POSITIVE_INFINITY) {\n            _this._infiniteTimeWindow = true;\n            _this.next = _this.nextInfiniteTimeWindow;\n        }\n        else {\n            _this.next = _this.nextTimeWindow;\n        }\n        return _this;\n    }\n    ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) {\n        var _events = this._events;\n        _events.push(value);\n        if (_events.length > this._bufferSize) {\n            _events.shift();\n        }\n        _super.prototype.next.call(this, value);\n    };\n    ReplaySubject.prototype.nextTimeWindow = function (value) {\n        this._events.push(new ReplayEvent(this._getNow(), value));\n        this._trimBufferThenGetEvents();\n        _super.prototype.next.call(this, value);\n    };\n    ReplaySubject.prototype._subscribe = function (subscriber) {\n        var _infiniteTimeWindow = this._infiniteTimeWindow;\n        var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();\n        var scheduler = this.scheduler;\n        var len = _events.length;\n        var subscription;\n        if (this.closed) {\n            throw new ObjectUnsubscribedError();\n        }\n        else if (this.isStopped || this.hasError) {\n            subscription = Subscription.EMPTY;\n        }\n        else {\n            this.observers.push(subscriber);\n            subscription = new SubjectSubscription(this, subscriber);\n        }\n        if (scheduler) {\n            subscriber.add(subscriber = new ObserveOnSubscriber(subscriber, scheduler));\n        }\n        if (_infiniteTimeWindow) {\n            for (var i = 0; i < len && !subscriber.closed; i++) {\n                subscriber.next(_events[i]);\n            }\n        }\n        else {\n            for (var i = 0; i < len && !subscriber.closed; i++) {\n                subscriber.next(_events[i].value);\n            }\n        }\n        if (this.hasError) {\n            subscriber.error(this.thrownError);\n        }\n        else if (this.isStopped) {\n            subscriber.complete();\n        }\n        return subscription;\n    };\n    ReplaySubject.prototype._getNow = function () {\n        return (this.scheduler || queue).now();\n    };\n    ReplaySubject.prototype._trimBufferThenGetEvents = function () {\n        var now = this._getNow();\n        var _bufferSize = this._bufferSize;\n        var _windowTime = this._windowTime;\n        var _events = this._events;\n        var eventsCount = _events.length;\n        var spliceCount = 0;\n        while (spliceCount < eventsCount) {\n            if ((now - _events[spliceCount].time) < _windowTime) {\n                break;\n            }\n            spliceCount++;\n        }\n        if (eventsCount > _bufferSize) {\n            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);\n        }\n        if (spliceCount > 0) {\n            _events.splice(0, spliceCount);\n        }\n        return _events;\n    };\n    return ReplaySubject;\n}(Subject));\nexport { ReplaySubject };\nvar ReplayEvent = (function () {\n    function ReplayEvent(time, value) {\n        this.time = time;\n        this.value = value;\n    }\n    return ReplayEvent;\n}());\n//# sourceMappingURL=ReplaySubject.js.map","import * as tslib_1 from \"tslib\";\nimport { Subject } from './Subject';\nimport { Subscription } from './Subscription';\nvar AsyncSubject = (function (_super) {\n    tslib_1.__extends(AsyncSubject, _super);\n    function AsyncSubject() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.value = null;\n        _this.hasNext = false;\n        _this.hasCompleted = false;\n        return _this;\n    }\n    AsyncSubject.prototype._subscribe = function (subscriber) {\n        if (this.hasError) {\n            subscriber.error(this.thrownError);\n            return Subscription.EMPTY;\n        }\n        else if (this.hasCompleted && this.hasNext) {\n            subscriber.next(this.value);\n            subscriber.complete();\n            return Subscription.EMPTY;\n        }\n        return _super.prototype._subscribe.call(this, subscriber);\n    };\n    AsyncSubject.prototype.next = function (value) {\n        if (!this.hasCompleted) {\n            this.value = value;\n            this.hasNext = true;\n        }\n    };\n    AsyncSubject.prototype.error = function (error) {\n        if (!this.hasCompleted) {\n            _super.prototype.error.call(this, error);\n        }\n    };\n    AsyncSubject.prototype.complete = function () {\n        this.hasCompleted = true;\n        if (this.hasNext) {\n            _super.prototype.next.call(this, this.value);\n        }\n        _super.prototype.complete.call(this);\n    };\n    return AsyncSubject;\n}(Subject));\nexport { AsyncSubject };\n//# sourceMappingURL=AsyncSubject.js.map","var nextHandle = 1;\nvar RESOLVED = (function () { return Promise.resolve(); })();\nvar activeHandles = {};\nfunction findAndClearHandle(handle) {\n    if (handle in activeHandles) {\n        delete activeHandles[handle];\n        return true;\n    }\n    return false;\n}\nexport var Immediate = {\n    setImmediate: function (cb) {\n        var handle = nextHandle++;\n        activeHandles[handle] = true;\n        RESOLVED.then(function () { return findAndClearHandle(handle) && cb(); });\n        return handle;\n    },\n    clearImmediate: function (handle) {\n        findAndClearHandle(handle);\n    },\n};\nexport var TestTools = {\n    pending: function () {\n        return Object.keys(activeHandles).length;\n    }\n};\n//# sourceMappingURL=Immediate.js.map","import * as tslib_1 from \"tslib\";\nimport { Immediate } from '../util/Immediate';\nimport { AsyncAction } from './AsyncAction';\nvar AsapAction = (function (_super) {\n    tslib_1.__extends(AsapAction, _super);\n    function AsapAction(scheduler, work) {\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        return _this;\n    }\n    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        if (delay !== null && delay > 0) {\n            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);\n        }\n        scheduler.actions.push(this);\n        return scheduler.scheduled || (scheduler.scheduled = Immediate.setImmediate(scheduler.flush.bind(scheduler, null)));\n    };\n    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);\n        }\n        if (scheduler.actions.length === 0) {\n            Immediate.clearImmediate(id);\n            scheduler.scheduled = undefined;\n        }\n        return undefined;\n    };\n    return AsapAction;\n}(AsyncAction));\nexport { AsapAction };\n//# sourceMappingURL=AsapAction.js.map","import * as tslib_1 from \"tslib\";\nimport { AsyncScheduler } from './AsyncScheduler';\nvar AsapScheduler = (function (_super) {\n    tslib_1.__extends(AsapScheduler, _super);\n    function AsapScheduler() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    AsapScheduler.prototype.flush = function (action) {\n        this.active = true;\n        this.scheduled = undefined;\n        var actions = this.actions;\n        var error;\n        var index = -1;\n        var count = actions.length;\n        action = action || actions.shift();\n        do {\n            if (error = action.execute(action.state, action.delay)) {\n                break;\n            }\n        } while (++index < count && (action = actions.shift()));\n        this.active = false;\n        if (error) {\n            while (++index < count && (action = actions.shift())) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    return AsapScheduler;\n}(AsyncScheduler));\nexport { AsapScheduler };\n//# sourceMappingURL=AsapScheduler.js.map","import { AsapAction } from './AsapAction';\nimport { AsapScheduler } from './AsapScheduler';\nexport var asap = new AsapScheduler(AsapAction);\n//# sourceMappingURL=asap.js.map","import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\nexport var async = new AsyncScheduler(AsyncAction);\n//# sourceMappingURL=async.js.map","import * as tslib_1 from \"tslib\";\nimport { AsyncAction } from './AsyncAction';\nvar AnimationFrameAction = (function (_super) {\n    tslib_1.__extends(AnimationFrameAction, _super);\n    function AnimationFrameAction(scheduler, work) {\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        return _this;\n    }\n    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        if (delay !== null && delay > 0) {\n            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);\n        }\n        scheduler.actions.push(this);\n        return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); }));\n    };\n    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);\n        }\n        if (scheduler.actions.length === 0) {\n            cancelAnimationFrame(id);\n            scheduler.scheduled = undefined;\n        }\n        return undefined;\n    };\n    return AnimationFrameAction;\n}(AsyncAction));\nexport { AnimationFrameAction };\n//# sourceMappingURL=AnimationFrameAction.js.map","import * as tslib_1 from \"tslib\";\nimport { AsyncScheduler } from './AsyncScheduler';\nvar AnimationFrameScheduler = (function (_super) {\n    tslib_1.__extends(AnimationFrameScheduler, _super);\n    function AnimationFrameScheduler() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    AnimationFrameScheduler.prototype.flush = function (action) {\n        this.active = true;\n        this.scheduled = undefined;\n        var actions = this.actions;\n        var error;\n        var index = -1;\n        var count = actions.length;\n        action = action || actions.shift();\n        do {\n            if (error = action.execute(action.state, action.delay)) {\n                break;\n            }\n        } while (++index < count && (action = actions.shift()));\n        this.active = false;\n        if (error) {\n            while (++index < count && (action = actions.shift())) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    return AnimationFrameScheduler;\n}(AsyncScheduler));\nexport { AnimationFrameScheduler };\n//# sourceMappingURL=AnimationFrameScheduler.js.map","import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nexport var animationFrame = new AnimationFrameScheduler(AnimationFrameAction);\n//# sourceMappingURL=animationFrame.js.map","import * as tslib_1 from \"tslib\";\nimport { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\nvar VirtualTimeScheduler = (function (_super) {\n    tslib_1.__extends(VirtualTimeScheduler, _super);\n    function VirtualTimeScheduler(SchedulerAction, maxFrames) {\n        if (SchedulerAction === void 0) { SchedulerAction = VirtualAction; }\n        if (maxFrames === void 0) { maxFrames = Number.POSITIVE_INFINITY; }\n        var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this;\n        _this.maxFrames = maxFrames;\n        _this.frame = 0;\n        _this.index = -1;\n        return _this;\n    }\n    VirtualTimeScheduler.prototype.flush = function () {\n        var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;\n        var error, action;\n        while ((action = actions[0]) && action.delay <= maxFrames) {\n            actions.shift();\n            this.frame = action.delay;\n            if (error = action.execute(action.state, action.delay)) {\n                break;\n            }\n        }\n        if (error) {\n            while (action = actions.shift()) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    VirtualTimeScheduler.frameTimeFactor = 10;\n    return VirtualTimeScheduler;\n}(AsyncScheduler));\nexport { VirtualTimeScheduler };\nvar VirtualAction = (function (_super) {\n    tslib_1.__extends(VirtualAction, _super);\n    function VirtualAction(scheduler, work, index) {\n        if (index === void 0) { index = scheduler.index += 1; }\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        _this.index = index;\n        _this.active = true;\n        _this.index = scheduler.index = index;\n        return _this;\n    }\n    VirtualAction.prototype.schedule = function (state, delay) {\n        if (delay === void 0) { delay = 0; }\n        if (!this.id) {\n            return _super.prototype.schedule.call(this, state, delay);\n        }\n        this.active = false;\n        var action = new VirtualAction(this.scheduler, this.work);\n        this.add(action);\n        return action.schedule(state, delay);\n    };\n    VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        this.delay = scheduler.frame + delay;\n        var actions = scheduler.actions;\n        actions.push(this);\n        actions.sort(VirtualAction.sortActions);\n        return true;\n    };\n    VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        return undefined;\n    };\n    VirtualAction.prototype._execute = function (state, delay) {\n        if (this.active === true) {\n            return _super.prototype._execute.call(this, state, delay);\n        }\n    };\n    VirtualAction.sortActions = function (a, b) {\n        if (a.delay === b.delay) {\n            if (a.index === b.index) {\n                return 0;\n            }\n            else if (a.index > b.index) {\n                return 1;\n            }\n            else {\n                return -1;\n            }\n        }\n        else if (a.delay > b.delay) {\n            return 1;\n        }\n        else {\n            return -1;\n        }\n    };\n    return VirtualAction;\n}(AsyncAction));\nexport { VirtualAction };\n//# sourceMappingURL=VirtualTimeScheduler.js.map","export function identity(x) {\n    return x;\n}\n//# sourceMappingURL=identity.js.map","import { Observable } from '../Observable';\nexport function isObservable(obj) {\n    return !!obj && (obj instanceof Observable || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));\n}\n//# sourceMappingURL=isObservable.js.map","var ArgumentOutOfRangeErrorImpl = (function () {\n    function ArgumentOutOfRangeErrorImpl() {\n        Error.call(this);\n        this.message = 'argument out of range';\n        this.name = 'ArgumentOutOfRangeError';\n        return this;\n    }\n    ArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype);\n    return ArgumentOutOfRangeErrorImpl;\n})();\nexport var ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl;\n//# sourceMappingURL=ArgumentOutOfRangeError.js.map","var EmptyErrorImpl = (function () {\n    function EmptyErrorImpl() {\n        Error.call(this);\n        this.message = 'no elements in sequence';\n        this.name = 'EmptyError';\n        return this;\n    }\n    EmptyErrorImpl.prototype = Object.create(Error.prototype);\n    return EmptyErrorImpl;\n})();\nexport var EmptyError = EmptyErrorImpl;\n//# sourceMappingURL=EmptyError.js.map","var TimeoutErrorImpl = (function () {\n    function TimeoutErrorImpl() {\n        Error.call(this);\n        this.message = 'Timeout has occurred';\n        this.name = 'TimeoutError';\n        return this;\n    }\n    TimeoutErrorImpl.prototype = Object.create(Error.prototype);\n    return TimeoutErrorImpl;\n})();\nexport var TimeoutError = TimeoutErrorImpl;\n//# sourceMappingURL=TimeoutError.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function map(project, thisArg) {\n    return function mapOperation(source) {\n        if (typeof project !== 'function') {\n            throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');\n        }\n        return source.lift(new MapOperator(project, thisArg));\n    };\n}\nvar MapOperator = (function () {\n    function MapOperator(project, thisArg) {\n        this.project = project;\n        this.thisArg = thisArg;\n    }\n    MapOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));\n    };\n    return MapOperator;\n}());\nexport { MapOperator };\nvar MapSubscriber = (function (_super) {\n    tslib_1.__extends(MapSubscriber, _super);\n    function MapSubscriber(destination, project, thisArg) {\n        var _this = _super.call(this, destination) || this;\n        _this.project = project;\n        _this.count = 0;\n        _this.thisArg = thisArg || _this;\n        return _this;\n    }\n    MapSubscriber.prototype._next = function (value) {\n        var result;\n        try {\n            result = this.project.call(this.thisArg, value, this.count++);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return MapSubscriber;\n}(Subscriber));\n//# sourceMappingURL=map.js.map","import { Observable } from '../Observable';\nimport { AsyncSubject } from '../AsyncSubject';\nimport { map } from '../operators/map';\nimport { canReportError } from '../util/canReportError';\nimport { isArray } from '../util/isArray';\nimport { isScheduler } from '../util/isScheduler';\nexport function bindCallback(callbackFunc, resultSelector, scheduler) {\n    if (resultSelector) {\n        if (isScheduler(resultSelector)) {\n            scheduler = resultSelector;\n        }\n        else {\n            return function () {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments[_i];\n                }\n                return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map(function (args) { return isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));\n            };\n        }\n    }\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var context = this;\n        var subject;\n        var params = {\n            context: context,\n            subject: subject,\n            callbackFunc: callbackFunc,\n            scheduler: scheduler,\n        };\n        return new Observable(function (subscriber) {\n            if (!scheduler) {\n                if (!subject) {\n                    subject = new AsyncSubject();\n                    var handler = function () {\n                        var innerArgs = [];\n                        for (var _i = 0; _i < arguments.length; _i++) {\n                            innerArgs[_i] = arguments[_i];\n                        }\n                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);\n                        subject.complete();\n                    };\n                    try {\n                        callbackFunc.apply(context, args.concat([handler]));\n                    }\n                    catch (err) {\n                        if (canReportError(subject)) {\n                            subject.error(err);\n                        }\n                        else {\n                            console.warn(err);\n                        }\n                    }\n                }\n                return subject.subscribe(subscriber);\n            }\n            else {\n                var state = {\n                    args: args, subscriber: subscriber, params: params,\n                };\n                return scheduler.schedule(dispatch, 0, state);\n            }\n        });\n    };\n}\nfunction dispatch(state) {\n    var _this = this;\n    var self = this;\n    var args = state.args, subscriber = state.subscriber, params = state.params;\n    var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler;\n    var subject = params.subject;\n    if (!subject) {\n        subject = params.subject = new AsyncSubject();\n        var handler = function () {\n            var innerArgs = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                innerArgs[_i] = arguments[_i];\n            }\n            var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;\n            _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));\n        };\n        try {\n            callbackFunc.apply(context, args.concat([handler]));\n        }\n        catch (err) {\n            subject.error(err);\n        }\n    }\n    this.add(subject.subscribe(subscriber));\n}\nfunction dispatchNext(state) {\n    var value = state.value, subject = state.subject;\n    subject.next(value);\n    subject.complete();\n}\nfunction dispatchError(state) {\n    var err = state.err, subject = state.subject;\n    subject.error(err);\n}\n//# sourceMappingURL=bindCallback.js.map","import { Observable } from '../Observable';\nimport { AsyncSubject } from '../AsyncSubject';\nimport { map } from '../operators/map';\nimport { canReportError } from '../util/canReportError';\nimport { isScheduler } from '../util/isScheduler';\nimport { isArray } from '../util/isArray';\nexport function bindNodeCallback(callbackFunc, resultSelector, scheduler) {\n    if (resultSelector) {\n        if (isScheduler(resultSelector)) {\n            scheduler = resultSelector;\n        }\n        else {\n            return function () {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments[_i];\n                }\n                return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map(function (args) { return isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));\n            };\n        }\n    }\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var params = {\n            subject: undefined,\n            args: args,\n            callbackFunc: callbackFunc,\n            scheduler: scheduler,\n            context: this,\n        };\n        return new Observable(function (subscriber) {\n            var context = params.context;\n            var subject = params.subject;\n            if (!scheduler) {\n                if (!subject) {\n                    subject = params.subject = new AsyncSubject();\n                    var handler = function () {\n                        var innerArgs = [];\n                        for (var _i = 0; _i < arguments.length; _i++) {\n                            innerArgs[_i] = arguments[_i];\n                        }\n                        var err = innerArgs.shift();\n                        if (err) {\n                            subject.error(err);\n                            return;\n                        }\n                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);\n                        subject.complete();\n                    };\n                    try {\n                        callbackFunc.apply(context, args.concat([handler]));\n                    }\n                    catch (err) {\n                        if (canReportError(subject)) {\n                            subject.error(err);\n                        }\n                        else {\n                            console.warn(err);\n                        }\n                    }\n                }\n                return subject.subscribe(subscriber);\n            }\n            else {\n                return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context });\n            }\n        });\n    };\n}\nfunction dispatch(state) {\n    var _this = this;\n    var params = state.params, subscriber = state.subscriber, context = state.context;\n    var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler;\n    var subject = params.subject;\n    if (!subject) {\n        subject = params.subject = new AsyncSubject();\n        var handler = function () {\n            var innerArgs = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                innerArgs[_i] = arguments[_i];\n            }\n            var err = innerArgs.shift();\n            if (err) {\n                _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));\n            }\n            else {\n                var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;\n                _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));\n            }\n        };\n        try {\n            callbackFunc.apply(context, args.concat([handler]));\n        }\n        catch (err) {\n            this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));\n        }\n    }\n    this.add(subject.subscribe(subscriber));\n}\nfunction dispatchNext(arg) {\n    var value = arg.value, subject = arg.subject;\n    subject.next(value);\n    subject.complete();\n}\nfunction dispatchError(arg) {\n    var err = arg.err, subject = arg.subject;\n    subject.error(err);\n}\n//# sourceMappingURL=bindNodeCallback.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from './Subscriber';\nvar OuterSubscriber = (function (_super) {\n    tslib_1.__extends(OuterSubscriber, _super);\n    function OuterSubscriber() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.destination.next(innerValue);\n    };\n    OuterSubscriber.prototype.notifyError = function (error, innerSub) {\n        this.destination.error(error);\n    };\n    OuterSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.destination.complete();\n    };\n    return OuterSubscriber;\n}(Subscriber));\nexport { OuterSubscriber };\n//# sourceMappingURL=OuterSubscriber.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from './Subscriber';\nvar InnerSubscriber = (function (_super) {\n    tslib_1.__extends(InnerSubscriber, _super);\n    function InnerSubscriber(parent, outerValue, outerIndex) {\n        var _this = _super.call(this) || this;\n        _this.parent = parent;\n        _this.outerValue = outerValue;\n        _this.outerIndex = outerIndex;\n        _this.index = 0;\n        return _this;\n    }\n    InnerSubscriber.prototype._next = function (value) {\n        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);\n    };\n    InnerSubscriber.prototype._error = function (error) {\n        this.parent.notifyError(error, this);\n        this.unsubscribe();\n    };\n    InnerSubscriber.prototype._complete = function () {\n        this.parent.notifyComplete(this);\n        this.unsubscribe();\n    };\n    return InnerSubscriber;\n}(Subscriber));\nexport { InnerSubscriber };\n//# sourceMappingURL=InnerSubscriber.js.map","import { hostReportError } from './hostReportError';\nexport var subscribeToPromise = function (promise) { return function (subscriber) {\n    promise.then(function (value) {\n        if (!subscriber.closed) {\n            subscriber.next(value);\n            subscriber.complete();\n        }\n    }, function (err) { return subscriber.error(err); })\n        .then(null, hostReportError);\n    return subscriber;\n}; };\n//# sourceMappingURL=subscribeToPromise.js.map","export function getSymbolIterator() {\n    if (typeof Symbol !== 'function' || !Symbol.iterator) {\n        return '@@iterator';\n    }\n    return Symbol.iterator;\n}\nexport var iterator = getSymbolIterator();\nexport var $$iterator = iterator;\n//# sourceMappingURL=iterator.js.map","import { iterator as Symbol_iterator } from '../symbol/iterator';\nexport var subscribeToIterable = function (iterable) { return function (subscriber) {\n    var iterator = iterable[Symbol_iterator]();\n    do {\n        var item = iterator.next();\n        if (item.done) {\n            subscriber.complete();\n            break;\n        }\n        subscriber.next(item.value);\n        if (subscriber.closed) {\n            break;\n        }\n    } while (true);\n    if (typeof iterator.return === 'function') {\n        subscriber.add(function () {\n            if (iterator.return) {\n                iterator.return();\n            }\n        });\n    }\n    return subscriber;\n}; };\n//# sourceMappingURL=subscribeToIterable.js.map","import { observable as Symbol_observable } from '../symbol/observable';\nexport var subscribeToObservable = function (obj) { return function (subscriber) {\n    var obs = obj[Symbol_observable]();\n    if (typeof obs.subscribe !== 'function') {\n        throw new TypeError('Provided object does not correctly implement Symbol.observable');\n    }\n    else {\n        return obs.subscribe(subscriber);\n    }\n}; };\n//# sourceMappingURL=subscribeToObservable.js.map","export var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });\n//# sourceMappingURL=isArrayLike.js.map","export function isPromise(value) {\n    return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function';\n}\n//# sourceMappingURL=isPromise.js.map","import { subscribeToArray } from './subscribeToArray';\nimport { subscribeToPromise } from './subscribeToPromise';\nimport { subscribeToIterable } from './subscribeToIterable';\nimport { subscribeToObservable } from './subscribeToObservable';\nimport { isArrayLike } from './isArrayLike';\nimport { isPromise } from './isPromise';\nimport { isObject } from './isObject';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { observable as Symbol_observable } from '../symbol/observable';\nexport var subscribeTo = function (result) {\n    if (!!result && typeof result[Symbol_observable] === 'function') {\n        return subscribeToObservable(result);\n    }\n    else if (isArrayLike(result)) {\n        return subscribeToArray(result);\n    }\n    else if (isPromise(result)) {\n        return subscribeToPromise(result);\n    }\n    else if (!!result && typeof result[Symbol_iterator] === 'function') {\n        return subscribeToIterable(result);\n    }\n    else {\n        var value = isObject(result) ? 'an invalid object' : \"'\" + result + \"'\";\n        var msg = \"You provided \" + value + \" where a stream was expected.\"\n            + ' You can provide an Observable, Promise, Array, or Iterable.';\n        throw new TypeError(msg);\n    }\n};\n//# sourceMappingURL=subscribeTo.js.map","import { InnerSubscriber } from '../InnerSubscriber';\nimport { subscribeTo } from './subscribeTo';\nimport { Observable } from '../Observable';\nexport function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, innerSubscriber) {\n    if (innerSubscriber === void 0) { innerSubscriber = new InnerSubscriber(outerSubscriber, outerValue, outerIndex); }\n    if (innerSubscriber.closed) {\n        return undefined;\n    }\n    if (result instanceof Observable) {\n        return result.subscribe(innerSubscriber);\n    }\n    return subscribeTo(result)(innerSubscriber);\n}\n//# sourceMappingURL=subscribeToResult.js.map","import * as tslib_1 from \"tslib\";\nimport { isScheduler } from '../util/isScheduler';\nimport { isArray } from '../util/isArray';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { fromArray } from './fromArray';\nvar NONE = {};\nexport function combineLatest() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    var resultSelector = null;\n    var scheduler = null;\n    if (isScheduler(observables[observables.length - 1])) {\n        scheduler = observables.pop();\n    }\n    if (typeof observables[observables.length - 1] === 'function') {\n        resultSelector = observables.pop();\n    }\n    if (observables.length === 1 && isArray(observables[0])) {\n        observables = observables[0];\n    }\n    return fromArray(observables, scheduler).lift(new CombineLatestOperator(resultSelector));\n}\nvar CombineLatestOperator = (function () {\n    function CombineLatestOperator(resultSelector) {\n        this.resultSelector = resultSelector;\n    }\n    CombineLatestOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));\n    };\n    return CombineLatestOperator;\n}());\nexport { CombineLatestOperator };\nvar CombineLatestSubscriber = (function (_super) {\n    tslib_1.__extends(CombineLatestSubscriber, _super);\n    function CombineLatestSubscriber(destination, resultSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.resultSelector = resultSelector;\n        _this.active = 0;\n        _this.values = [];\n        _this.observables = [];\n        return _this;\n    }\n    CombineLatestSubscriber.prototype._next = function (observable) {\n        this.values.push(NONE);\n        this.observables.push(observable);\n    };\n    CombineLatestSubscriber.prototype._complete = function () {\n        var observables = this.observables;\n        var len = observables.length;\n        if (len === 0) {\n            this.destination.complete();\n        }\n        else {\n            this.active = len;\n            this.toRespond = len;\n            for (var i = 0; i < len; i++) {\n                var observable = observables[i];\n                this.add(subscribeToResult(this, observable, observable, i));\n            }\n        }\n    };\n    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {\n        if ((this.active -= 1) === 0) {\n            this.destination.complete();\n        }\n    };\n    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var values = this.values;\n        var oldVal = values[outerIndex];\n        var toRespond = !this.toRespond\n            ? 0\n            : oldVal === NONE ? --this.toRespond : this.toRespond;\n        values[outerIndex] = innerValue;\n        if (toRespond === 0) {\n            if (this.resultSelector) {\n                this._tryResultSelector(values);\n            }\n            else {\n                this.destination.next(values.slice());\n            }\n        }\n    };\n    CombineLatestSubscriber.prototype._tryResultSelector = function (values) {\n        var result;\n        try {\n            result = this.resultSelector.apply(this, values);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return CombineLatestSubscriber;\n}(OuterSubscriber));\nexport { CombineLatestSubscriber };\n//# sourceMappingURL=combineLatest.js.map","import { Observable } from '../Observable';\nimport { Subscription } from '../Subscription';\nimport { observable as Symbol_observable } from '../symbol/observable';\nexport function scheduleObservable(input, scheduler) {\n    return new Observable(function (subscriber) {\n        var sub = new Subscription();\n        sub.add(scheduler.schedule(function () {\n            var observable = input[Symbol_observable]();\n            sub.add(observable.subscribe({\n                next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); },\n                error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); },\n                complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); },\n            }));\n        }));\n        return sub;\n    });\n}\n//# sourceMappingURL=scheduleObservable.js.map","import { Observable } from '../Observable';\nimport { Subscription } from '../Subscription';\nexport function schedulePromise(input, scheduler) {\n    return new Observable(function (subscriber) {\n        var sub = new Subscription();\n        sub.add(scheduler.schedule(function () { return input.then(function (value) {\n            sub.add(scheduler.schedule(function () {\n                subscriber.next(value);\n                sub.add(scheduler.schedule(function () { return subscriber.complete(); }));\n            }));\n        }, function (err) {\n            sub.add(scheduler.schedule(function () { return subscriber.error(err); }));\n        }); }));\n        return sub;\n    });\n}\n//# sourceMappingURL=schedulePromise.js.map","import { Observable } from '../Observable';\nimport { Subscription } from '../Subscription';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\nexport function scheduleIterable(input, scheduler) {\n    if (!input) {\n        throw new Error('Iterable cannot be null');\n    }\n    return new Observable(function (subscriber) {\n        var sub = new Subscription();\n        var iterator;\n        sub.add(function () {\n            if (iterator && typeof iterator.return === 'function') {\n                iterator.return();\n            }\n        });\n        sub.add(scheduler.schedule(function () {\n            iterator = input[Symbol_iterator]();\n            sub.add(scheduler.schedule(function () {\n                if (subscriber.closed) {\n                    return;\n                }\n                var value;\n                var done;\n                try {\n                    var result = iterator.next();\n                    value = result.value;\n                    done = result.done;\n                }\n                catch (err) {\n                    subscriber.error(err);\n                    return;\n                }\n                if (done) {\n                    subscriber.complete();\n                }\n                else {\n                    subscriber.next(value);\n                    this.schedule();\n                }\n            }));\n        }));\n        return sub;\n    });\n}\n//# sourceMappingURL=scheduleIterable.js.map","import { observable as Symbol_observable } from '../symbol/observable';\nexport function isInteropObservable(input) {\n    return input && typeof input[Symbol_observable] === 'function';\n}\n//# sourceMappingURL=isInteropObservable.js.map","import { iterator as Symbol_iterator } from '../symbol/iterator';\nexport function isIterable(input) {\n    return input && typeof input[Symbol_iterator] === 'function';\n}\n//# sourceMappingURL=isIterable.js.map","import { scheduleObservable } from './scheduleObservable';\nimport { schedulePromise } from './schedulePromise';\nimport { scheduleArray } from './scheduleArray';\nimport { scheduleIterable } from './scheduleIterable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isPromise } from '../util/isPromise';\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isIterable } from '../util/isIterable';\nexport function scheduled(input, scheduler) {\n    if (input != null) {\n        if (isInteropObservable(input)) {\n            return scheduleObservable(input, scheduler);\n        }\n        else if (isPromise(input)) {\n            return schedulePromise(input, scheduler);\n        }\n        else if (isArrayLike(input)) {\n            return scheduleArray(input, scheduler);\n        }\n        else if (isIterable(input) || typeof input === 'string') {\n            return scheduleIterable(input, scheduler);\n        }\n    }\n    throw new TypeError((input !== null && typeof input || input) + ' is not observable');\n}\n//# sourceMappingURL=scheduled.js.map","import { Observable } from '../Observable';\nimport { subscribeTo } from '../util/subscribeTo';\nimport { scheduled } from '../scheduled/scheduled';\nexport function from(input, scheduler) {\n    if (!scheduler) {\n        if (input instanceof Observable) {\n            return input;\n        }\n        return new Observable(subscribeTo(input));\n    }\n    else {\n        return scheduled(input, scheduler);\n    }\n}\n//# sourceMappingURL=from.js.map","import * as tslib_1 from \"tslib\";\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { map } from './map';\nimport { from } from '../observable/from';\nexport function mergeMap(project, resultSelector, concurrent) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    if (typeof resultSelector === 'function') {\n        return function (source) { return source.pipe(mergeMap(function (a, i) { return from(project(a, i)).pipe(map(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); };\n    }\n    else if (typeof resultSelector === 'number') {\n        concurrent = resultSelector;\n    }\n    return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); };\n}\nvar MergeMapOperator = (function () {\n    function MergeMapOperator(project, concurrent) {\n        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n        this.project = project;\n        this.concurrent = concurrent;\n    }\n    MergeMapOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));\n    };\n    return MergeMapOperator;\n}());\nexport { MergeMapOperator };\nvar MergeMapSubscriber = (function (_super) {\n    tslib_1.__extends(MergeMapSubscriber, _super);\n    function MergeMapSubscriber(destination, project, concurrent) {\n        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n        var _this = _super.call(this, destination) || this;\n        _this.project = project;\n        _this.concurrent = concurrent;\n        _this.hasCompleted = false;\n        _this.buffer = [];\n        _this.active = 0;\n        _this.index = 0;\n        return _this;\n    }\n    MergeMapSubscriber.prototype._next = function (value) {\n        if (this.active < this.concurrent) {\n            this._tryNext(value);\n        }\n        else {\n            this.buffer.push(value);\n        }\n    };\n    MergeMapSubscriber.prototype._tryNext = function (value) {\n        var result;\n        var index = this.index++;\n        try {\n            result = this.project(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.active++;\n        this._innerSub(result, value, index);\n    };\n    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {\n        var innerSubscriber = new InnerSubscriber(this, value, index);\n        var destination = this.destination;\n        destination.add(innerSubscriber);\n        var innerSubscription = subscribeToResult(this, ish, undefined, undefined, innerSubscriber);\n        if (innerSubscription !== innerSubscriber) {\n            destination.add(innerSubscription);\n        }\n    };\n    MergeMapSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.active === 0 && this.buffer.length === 0) {\n            this.destination.complete();\n        }\n        this.unsubscribe();\n    };\n    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.destination.next(innerValue);\n    };\n    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        this.remove(innerSub);\n        this.active--;\n        if (buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        else if (this.active === 0 && this.hasCompleted) {\n            this.destination.complete();\n        }\n    };\n    return MergeMapSubscriber;\n}(OuterSubscriber));\nexport { MergeMapSubscriber };\n//# sourceMappingURL=mergeMap.js.map","import { mergeMap } from './mergeMap';\nimport { identity } from '../util/identity';\nexport function mergeAll(concurrent) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    return mergeMap(identity, concurrent);\n}\n//# sourceMappingURL=mergeAll.js.map","import { mergeAll } from './mergeAll';\nexport function concatAll() {\n    return mergeAll(1);\n}\n//# sourceMappingURL=concatAll.js.map","import { of } from './of';\nimport { concatAll } from '../operators/concatAll';\nexport function concat() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    return concatAll()(of.apply(void 0, observables));\n}\n//# sourceMappingURL=concat.js.map","import { Observable } from '../Observable';\nimport { from } from './from';\nimport { empty } from './empty';\nexport function defer(observableFactory) {\n    return new Observable(function (subscriber) {\n        var input;\n        try {\n            input = observableFactory();\n        }\n        catch (err) {\n            subscriber.error(err);\n            return undefined;\n        }\n        var source = input ? from(input) : empty();\n        return source.subscribe(subscriber);\n    });\n}\n//# sourceMappingURL=defer.js.map","import { Observable } from '../Observable';\nimport { isArray } from '../util/isArray';\nimport { map } from '../operators/map';\nimport { isObject } from '../util/isObject';\nimport { from } from './from';\nexport function forkJoin() {\n    var sources = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        sources[_i] = arguments[_i];\n    }\n    if (sources.length === 1) {\n        var first_1 = sources[0];\n        if (isArray(first_1)) {\n            return forkJoinInternal(first_1, null);\n        }\n        if (isObject(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) {\n            var keys = Object.keys(first_1);\n            return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys);\n        }\n    }\n    if (typeof sources[sources.length - 1] === 'function') {\n        var resultSelector_1 = sources.pop();\n        sources = (sources.length === 1 && isArray(sources[0])) ? sources[0] : sources;\n        return forkJoinInternal(sources, null).pipe(map(function (args) { return resultSelector_1.apply(void 0, args); }));\n    }\n    return forkJoinInternal(sources, null);\n}\nfunction forkJoinInternal(sources, keys) {\n    return new Observable(function (subscriber) {\n        var len = sources.length;\n        if (len === 0) {\n            subscriber.complete();\n            return;\n        }\n        var values = new Array(len);\n        var completed = 0;\n        var emitted = 0;\n        var _loop_1 = function (i) {\n            var source = from(sources[i]);\n            var hasValue = false;\n            subscriber.add(source.subscribe({\n                next: function (value) {\n                    if (!hasValue) {\n                        hasValue = true;\n                        emitted++;\n                    }\n                    values[i] = value;\n                },\n                error: function (err) { return subscriber.error(err); },\n                complete: function () {\n                    completed++;\n                    if (completed === len || !hasValue) {\n                        if (emitted === len) {\n                            subscriber.next(keys ?\n                                keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) :\n                                values);\n                        }\n                        subscriber.complete();\n                    }\n                }\n            }));\n        };\n        for (var i = 0; i < len; i++) {\n            _loop_1(i);\n        }\n    });\n}\n//# sourceMappingURL=forkJoin.js.map","import { Observable } from '../Observable';\nimport { isArray } from '../util/isArray';\nimport { isFunction } from '../util/isFunction';\nimport { map } from '../operators/map';\nvar toString = (function () { return Object.prototype.toString; })();\nexport function fromEvent(target, eventName, options, resultSelector) {\n    if (isFunction(options)) {\n        resultSelector = options;\n        options = undefined;\n    }\n    if (resultSelector) {\n        return fromEvent(target, eventName, options).pipe(map(function (args) { return isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));\n    }\n    return new Observable(function (subscriber) {\n        function handler(e) {\n            if (arguments.length > 1) {\n                subscriber.next(Array.prototype.slice.call(arguments));\n            }\n            else {\n                subscriber.next(e);\n            }\n        }\n        setupSubscription(target, eventName, handler, subscriber, options);\n    });\n}\nfunction setupSubscription(sourceObj, eventName, handler, subscriber, options) {\n    var unsubscribe;\n    if (isEventTarget(sourceObj)) {\n        var source_1 = sourceObj;\n        sourceObj.addEventListener(eventName, handler, options);\n        unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); };\n    }\n    else if (isJQueryStyleEventEmitter(sourceObj)) {\n        var source_2 = sourceObj;\n        sourceObj.on(eventName, handler);\n        unsubscribe = function () { return source_2.off(eventName, handler); };\n    }\n    else if (isNodeStyleEventEmitter(sourceObj)) {\n        var source_3 = sourceObj;\n        sourceObj.addListener(eventName, handler);\n        unsubscribe = function () { return source_3.removeListener(eventName, handler); };\n    }\n    else if (sourceObj && sourceObj.length) {\n        for (var i = 0, len = sourceObj.length; i < len; i++) {\n            setupSubscription(sourceObj[i], eventName, handler, subscriber, options);\n        }\n    }\n    else {\n        throw new TypeError('Invalid event target');\n    }\n    subscriber.add(unsubscribe);\n}\nfunction isNodeStyleEventEmitter(sourceObj) {\n    return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';\n}\nfunction isJQueryStyleEventEmitter(sourceObj) {\n    return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';\n}\nfunction isEventTarget(sourceObj) {\n    return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';\n}\n//# sourceMappingURL=fromEvent.js.map","import { Observable } from '../Observable';\nimport { isArray } from '../util/isArray';\nimport { isFunction } from '../util/isFunction';\nimport { map } from '../operators/map';\nexport function fromEventPattern(addHandler, removeHandler, resultSelector) {\n    if (resultSelector) {\n        return fromEventPattern(addHandler, removeHandler).pipe(map(function (args) { return isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));\n    }\n    return new Observable(function (subscriber) {\n        var handler = function () {\n            var e = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                e[_i] = arguments[_i];\n            }\n            return subscriber.next(e.length === 1 ? e[0] : e);\n        };\n        var retValue;\n        try {\n            retValue = addHandler(handler);\n        }\n        catch (err) {\n            subscriber.error(err);\n            return undefined;\n        }\n        if (!isFunction(removeHandler)) {\n            return undefined;\n        }\n        return function () { return removeHandler(handler, retValue); };\n    });\n}\n//# sourceMappingURL=fromEventPattern.js.map","import { Observable } from '../Observable';\nimport { identity } from '../util/identity';\nimport { isScheduler } from '../util/isScheduler';\nexport function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {\n    var resultSelector;\n    var initialState;\n    if (arguments.length == 1) {\n        var options = initialStateOrOptions;\n        initialState = options.initialState;\n        condition = options.condition;\n        iterate = options.iterate;\n        resultSelector = options.resultSelector || identity;\n        scheduler = options.scheduler;\n    }\n    else if (resultSelectorOrObservable === undefined || isScheduler(resultSelectorOrObservable)) {\n        initialState = initialStateOrOptions;\n        resultSelector = identity;\n        scheduler = resultSelectorOrObservable;\n    }\n    else {\n        initialState = initialStateOrOptions;\n        resultSelector = resultSelectorOrObservable;\n    }\n    return new Observable(function (subscriber) {\n        var state = initialState;\n        if (scheduler) {\n            return scheduler.schedule(dispatch, 0, {\n                subscriber: subscriber,\n                iterate: iterate,\n                condition: condition,\n                resultSelector: resultSelector,\n                state: state\n            });\n        }\n        do {\n            if (condition) {\n                var conditionResult = void 0;\n                try {\n                    conditionResult = condition(state);\n                }\n                catch (err) {\n                    subscriber.error(err);\n                    return undefined;\n                }\n                if (!conditionResult) {\n                    subscriber.complete();\n                    break;\n                }\n            }\n            var value = void 0;\n            try {\n                value = resultSelector(state);\n            }\n            catch (err) {\n                subscriber.error(err);\n                return undefined;\n            }\n            subscriber.next(value);\n            if (subscriber.closed) {\n                break;\n            }\n            try {\n                state = iterate(state);\n            }\n            catch (err) {\n                subscriber.error(err);\n                return undefined;\n            }\n        } while (true);\n        return undefined;\n    });\n}\nfunction dispatch(state) {\n    var subscriber = state.subscriber, condition = state.condition;\n    if (subscriber.closed) {\n        return undefined;\n    }\n    if (state.needIterate) {\n        try {\n            state.state = state.iterate(state.state);\n        }\n        catch (err) {\n            subscriber.error(err);\n            return undefined;\n        }\n    }\n    else {\n        state.needIterate = true;\n    }\n    if (condition) {\n        var conditionResult = void 0;\n        try {\n            conditionResult = condition(state.state);\n        }\n        catch (err) {\n            subscriber.error(err);\n            return undefined;\n        }\n        if (!conditionResult) {\n            subscriber.complete();\n            return undefined;\n        }\n        if (subscriber.closed) {\n            return undefined;\n        }\n    }\n    var value;\n    try {\n        value = state.resultSelector(state.state);\n    }\n    catch (err) {\n        subscriber.error(err);\n        return undefined;\n    }\n    if (subscriber.closed) {\n        return undefined;\n    }\n    subscriber.next(value);\n    if (subscriber.closed) {\n        return undefined;\n    }\n    return this.schedule(state);\n}\n//# sourceMappingURL=generate.js.map","import { defer } from './defer';\nimport { EMPTY } from './empty';\nexport function iif(condition, trueResult, falseResult) {\n    if (trueResult === void 0) { trueResult = EMPTY; }\n    if (falseResult === void 0) { falseResult = EMPTY; }\n    return defer(function () { return condition() ? trueResult : falseResult; });\n}\n//# sourceMappingURL=iif.js.map","import { isArray } from './isArray';\nexport function isNumeric(val) {\n    return !isArray(val) && (val - parseFloat(val) + 1) >= 0;\n}\n//# sourceMappingURL=isNumeric.js.map","import { Observable } from '../Observable';\nimport { async } from '../scheduler/async';\nimport { isNumeric } from '../util/isNumeric';\nexport function interval(period, scheduler) {\n    if (period === void 0) { period = 0; }\n    if (scheduler === void 0) { scheduler = async; }\n    if (!isNumeric(period) || period < 0) {\n        period = 0;\n    }\n    if (!scheduler || typeof scheduler.schedule !== 'function') {\n        scheduler = async;\n    }\n    return new Observable(function (subscriber) {\n        subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period }));\n        return subscriber;\n    });\n}\nfunction dispatch(state) {\n    var subscriber = state.subscriber, counter = state.counter, period = state.period;\n    subscriber.next(counter);\n    this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period);\n}\n//# sourceMappingURL=interval.js.map","import { Observable } from '../Observable';\nimport { isScheduler } from '../util/isScheduler';\nimport { mergeAll } from '../operators/mergeAll';\nimport { fromArray } from './fromArray';\nexport function merge() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    var concurrent = Number.POSITIVE_INFINITY;\n    var scheduler = null;\n    var last = observables[observables.length - 1];\n    if (isScheduler(last)) {\n        scheduler = observables.pop();\n        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {\n            concurrent = observables.pop();\n        }\n    }\n    else if (typeof last === 'number') {\n        concurrent = observables.pop();\n    }\n    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable) {\n        return observables[0];\n    }\n    return mergeAll(concurrent)(fromArray(observables, scheduler));\n}\n//# sourceMappingURL=merge.js.map","import { Observable } from '../Observable';\nimport { noop } from '../util/noop';\nexport var NEVER = new Observable(noop);\nexport function never() {\n    return NEVER;\n}\n//# sourceMappingURL=never.js.map","import { Observable } from '../Observable';\nimport { from } from './from';\nimport { isArray } from '../util/isArray';\nimport { EMPTY } from './empty';\nexport function onErrorResumeNext() {\n    var sources = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        sources[_i] = arguments[_i];\n    }\n    if (sources.length === 0) {\n        return EMPTY;\n    }\n    var first = sources[0], remainder = sources.slice(1);\n    if (sources.length === 1 && isArray(first)) {\n        return onErrorResumeNext.apply(void 0, first);\n    }\n    return new Observable(function (subscriber) {\n        var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); };\n        return from(first).subscribe({\n            next: function (value) { subscriber.next(value); },\n            error: subNext,\n            complete: subNext,\n        });\n    });\n}\n//# sourceMappingURL=onErrorResumeNext.js.map","import { Observable } from '../Observable';\nimport { Subscription } from '../Subscription';\nexport function pairs(obj, scheduler) {\n    if (!scheduler) {\n        return new Observable(function (subscriber) {\n            var keys = Object.keys(obj);\n            for (var i = 0; i < keys.length && !subscriber.closed; i++) {\n                var key = keys[i];\n                if (obj.hasOwnProperty(key)) {\n                    subscriber.next([key, obj[key]]);\n                }\n            }\n            subscriber.complete();\n        });\n    }\n    else {\n        return new Observable(function (subscriber) {\n            var keys = Object.keys(obj);\n            var subscription = new Subscription();\n            subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj }));\n            return subscription;\n        });\n    }\n}\nexport function dispatch(state) {\n    var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj;\n    if (!subscriber.closed) {\n        if (index < keys.length) {\n            var key = keys[index];\n            subscriber.next([key, obj[key]]);\n            subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj }));\n        }\n        else {\n            subscriber.complete();\n        }\n    }\n}\n//# sourceMappingURL=pairs.js.map","export function not(pred, thisArg) {\n    function notPred() {\n        return !(notPred.pred.apply(notPred.thisArg, arguments));\n    }\n    notPred.pred = pred;\n    notPred.thisArg = thisArg;\n    return notPred;\n}\n//# sourceMappingURL=not.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function filter(predicate, thisArg) {\n    return function filterOperatorFunction(source) {\n        return source.lift(new FilterOperator(predicate, thisArg));\n    };\n}\nvar FilterOperator = (function () {\n    function FilterOperator(predicate, thisArg) {\n        this.predicate = predicate;\n        this.thisArg = thisArg;\n    }\n    FilterOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));\n    };\n    return FilterOperator;\n}());\nvar FilterSubscriber = (function (_super) {\n    tslib_1.__extends(FilterSubscriber, _super);\n    function FilterSubscriber(destination, predicate, thisArg) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.thisArg = thisArg;\n        _this.count = 0;\n        return _this;\n    }\n    FilterSubscriber.prototype._next = function (value) {\n        var result;\n        try {\n            result = this.predicate.call(this.thisArg, value, this.count++);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            this.destination.next(value);\n        }\n    };\n    return FilterSubscriber;\n}(Subscriber));\n//# sourceMappingURL=filter.js.map","import { not } from '../util/not';\nimport { subscribeTo } from '../util/subscribeTo';\nimport { filter } from '../operators/filter';\nimport { Observable } from '../Observable';\nexport function partition(source, predicate, thisArg) {\n    return [\n        filter(predicate, thisArg)(new Observable(subscribeTo(source))),\n        filter(not(predicate, thisArg))(new Observable(subscribeTo(source)))\n    ];\n}\n//# sourceMappingURL=partition.js.map","import * as tslib_1 from \"tslib\";\nimport { isArray } from '../util/isArray';\nimport { fromArray } from './fromArray';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function race() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    if (observables.length === 1) {\n        if (isArray(observables[0])) {\n            observables = observables[0];\n        }\n        else {\n            return observables[0];\n        }\n    }\n    return fromArray(observables, undefined).lift(new RaceOperator());\n}\nvar RaceOperator = (function () {\n    function RaceOperator() {\n    }\n    RaceOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new RaceSubscriber(subscriber));\n    };\n    return RaceOperator;\n}());\nexport { RaceOperator };\nvar RaceSubscriber = (function (_super) {\n    tslib_1.__extends(RaceSubscriber, _super);\n    function RaceSubscriber(destination) {\n        var _this = _super.call(this, destination) || this;\n        _this.hasFirst = false;\n        _this.observables = [];\n        _this.subscriptions = [];\n        return _this;\n    }\n    RaceSubscriber.prototype._next = function (observable) {\n        this.observables.push(observable);\n    };\n    RaceSubscriber.prototype._complete = function () {\n        var observables = this.observables;\n        var len = observables.length;\n        if (len === 0) {\n            this.destination.complete();\n        }\n        else {\n            for (var i = 0; i < len && !this.hasFirst; i++) {\n                var observable = observables[i];\n                var subscription = subscribeToResult(this, observable, observable, i);\n                if (this.subscriptions) {\n                    this.subscriptions.push(subscription);\n                }\n                this.add(subscription);\n            }\n            this.observables = null;\n        }\n    };\n    RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        if (!this.hasFirst) {\n            this.hasFirst = true;\n            for (var i = 0; i < this.subscriptions.length; i++) {\n                if (i !== outerIndex) {\n                    var subscription = this.subscriptions[i];\n                    subscription.unsubscribe();\n                    this.remove(subscription);\n                }\n            }\n            this.subscriptions = null;\n        }\n        this.destination.next(innerValue);\n    };\n    return RaceSubscriber;\n}(OuterSubscriber));\nexport { RaceSubscriber };\n//# sourceMappingURL=race.js.map","import { Observable } from '../Observable';\nexport function range(start, count, scheduler) {\n    if (start === void 0) { start = 0; }\n    return new Observable(function (subscriber) {\n        if (count === undefined) {\n            count = start;\n            start = 0;\n        }\n        var index = 0;\n        var current = start;\n        if (scheduler) {\n            return scheduler.schedule(dispatch, 0, {\n                index: index, count: count, start: start, subscriber: subscriber\n            });\n        }\n        else {\n            do {\n                if (index++ >= count) {\n                    subscriber.complete();\n                    break;\n                }\n                subscriber.next(current++);\n                if (subscriber.closed) {\n                    break;\n                }\n            } while (true);\n        }\n        return undefined;\n    });\n}\nexport function dispatch(state) {\n    var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber;\n    if (index >= count) {\n        subscriber.complete();\n        return;\n    }\n    subscriber.next(start);\n    if (subscriber.closed) {\n        return;\n    }\n    state.index = index + 1;\n    state.start = start + 1;\n    this.schedule(state);\n}\n//# sourceMappingURL=range.js.map","import { Observable } from '../Observable';\nimport { async } from '../scheduler/async';\nimport { isNumeric } from '../util/isNumeric';\nimport { isScheduler } from '../util/isScheduler';\nexport function timer(dueTime, periodOrScheduler, scheduler) {\n    if (dueTime === void 0) { dueTime = 0; }\n    var period = -1;\n    if (isNumeric(periodOrScheduler)) {\n        period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);\n    }\n    else if (isScheduler(periodOrScheduler)) {\n        scheduler = periodOrScheduler;\n    }\n    if (!isScheduler(scheduler)) {\n        scheduler = async;\n    }\n    return new Observable(function (subscriber) {\n        var due = isNumeric(dueTime)\n            ? dueTime\n            : (+dueTime - scheduler.now());\n        return scheduler.schedule(dispatch, due, {\n            index: 0, period: period, subscriber: subscriber\n        });\n    });\n}\nfunction dispatch(state) {\n    var index = state.index, period = state.period, subscriber = state.subscriber;\n    subscriber.next(index);\n    if (subscriber.closed) {\n        return;\n    }\n    else if (period === -1) {\n        return subscriber.complete();\n    }\n    state.index = index + 1;\n    this.schedule(state, period);\n}\n//# sourceMappingURL=timer.js.map","import { Observable } from '../Observable';\nimport { from } from './from';\nimport { EMPTY } from './empty';\nexport function using(resourceFactory, observableFactory) {\n    return new Observable(function (subscriber) {\n        var resource;\n        try {\n            resource = resourceFactory();\n        }\n        catch (err) {\n            subscriber.error(err);\n            return undefined;\n        }\n        var result;\n        try {\n            result = observableFactory(resource);\n        }\n        catch (err) {\n            subscriber.error(err);\n            return undefined;\n        }\n        var source = result ? from(result) : EMPTY;\n        var subscription = source.subscribe(subscriber);\n        return function () {\n            subscription.unsubscribe();\n            if (resource) {\n                resource.unsubscribe();\n            }\n        };\n    });\n}\n//# sourceMappingURL=using.js.map","import * as tslib_1 from \"tslib\";\nimport { fromArray } from './fromArray';\nimport { isArray } from '../util/isArray';\nimport { Subscriber } from '../Subscriber';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { iterator as Symbol_iterator } from '../../internal/symbol/iterator';\nexport function zip() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    var resultSelector = observables[observables.length - 1];\n    if (typeof resultSelector === 'function') {\n        observables.pop();\n    }\n    return fromArray(observables, undefined).lift(new ZipOperator(resultSelector));\n}\nvar ZipOperator = (function () {\n    function ZipOperator(resultSelector) {\n        this.resultSelector = resultSelector;\n    }\n    ZipOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));\n    };\n    return ZipOperator;\n}());\nexport { ZipOperator };\nvar ZipSubscriber = (function (_super) {\n    tslib_1.__extends(ZipSubscriber, _super);\n    function ZipSubscriber(destination, resultSelector, values) {\n        if (values === void 0) { values = Object.create(null); }\n        var _this = _super.call(this, destination) || this;\n        _this.iterators = [];\n        _this.active = 0;\n        _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null;\n        _this.values = values;\n        return _this;\n    }\n    ZipSubscriber.prototype._next = function (value) {\n        var iterators = this.iterators;\n        if (isArray(value)) {\n            iterators.push(new StaticArrayIterator(value));\n        }\n        else if (typeof value[Symbol_iterator] === 'function') {\n            iterators.push(new StaticIterator(value[Symbol_iterator]()));\n        }\n        else {\n            iterators.push(new ZipBufferIterator(this.destination, this, value));\n        }\n    };\n    ZipSubscriber.prototype._complete = function () {\n        var iterators = this.iterators;\n        var len = iterators.length;\n        this.unsubscribe();\n        if (len === 0) {\n            this.destination.complete();\n            return;\n        }\n        this.active = len;\n        for (var i = 0; i < len; i++) {\n            var iterator = iterators[i];\n            if (iterator.stillUnsubscribed) {\n                var destination = this.destination;\n                destination.add(iterator.subscribe(iterator, i));\n            }\n            else {\n                this.active--;\n            }\n        }\n    };\n    ZipSubscriber.prototype.notifyInactive = function () {\n        this.active--;\n        if (this.active === 0) {\n            this.destination.complete();\n        }\n    };\n    ZipSubscriber.prototype.checkIterators = function () {\n        var iterators = this.iterators;\n        var len = iterators.length;\n        var destination = this.destination;\n        for (var i = 0; i < len; i++) {\n            var iterator = iterators[i];\n            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {\n                return;\n            }\n        }\n        var shouldComplete = false;\n        var args = [];\n        for (var i = 0; i < len; i++) {\n            var iterator = iterators[i];\n            var result = iterator.next();\n            if (iterator.hasCompleted()) {\n                shouldComplete = true;\n            }\n            if (result.done) {\n                destination.complete();\n                return;\n            }\n            args.push(result.value);\n        }\n        if (this.resultSelector) {\n            this._tryresultSelector(args);\n        }\n        else {\n            destination.next(args);\n        }\n        if (shouldComplete) {\n            destination.complete();\n        }\n    };\n    ZipSubscriber.prototype._tryresultSelector = function (args) {\n        var result;\n        try {\n            result = this.resultSelector.apply(this, args);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return ZipSubscriber;\n}(Subscriber));\nexport { ZipSubscriber };\nvar StaticIterator = (function () {\n    function StaticIterator(iterator) {\n        this.iterator = iterator;\n        this.nextResult = iterator.next();\n    }\n    StaticIterator.prototype.hasValue = function () {\n        return true;\n    };\n    StaticIterator.prototype.next = function () {\n        var result = this.nextResult;\n        this.nextResult = this.iterator.next();\n        return result;\n    };\n    StaticIterator.prototype.hasCompleted = function () {\n        var nextResult = this.nextResult;\n        return nextResult && nextResult.done;\n    };\n    return StaticIterator;\n}());\nvar StaticArrayIterator = (function () {\n    function StaticArrayIterator(array) {\n        this.array = array;\n        this.index = 0;\n        this.length = 0;\n        this.length = array.length;\n    }\n    StaticArrayIterator.prototype[Symbol_iterator] = function () {\n        return this;\n    };\n    StaticArrayIterator.prototype.next = function (value) {\n        var i = this.index++;\n        var array = this.array;\n        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };\n    };\n    StaticArrayIterator.prototype.hasValue = function () {\n        return this.array.length > this.index;\n    };\n    StaticArrayIterator.prototype.hasCompleted = function () {\n        return this.array.length === this.index;\n    };\n    return StaticArrayIterator;\n}());\nvar ZipBufferIterator = (function (_super) {\n    tslib_1.__extends(ZipBufferIterator, _super);\n    function ZipBufferIterator(destination, parent, observable) {\n        var _this = _super.call(this, destination) || this;\n        _this.parent = parent;\n        _this.observable = observable;\n        _this.stillUnsubscribed = true;\n        _this.buffer = [];\n        _this.isComplete = false;\n        return _this;\n    }\n    ZipBufferIterator.prototype[Symbol_iterator] = function () {\n        return this;\n    };\n    ZipBufferIterator.prototype.next = function () {\n        var buffer = this.buffer;\n        if (buffer.length === 0 && this.isComplete) {\n            return { value: null, done: true };\n        }\n        else {\n            return { value: buffer.shift(), done: false };\n        }\n    };\n    ZipBufferIterator.prototype.hasValue = function () {\n        return this.buffer.length > 0;\n    };\n    ZipBufferIterator.prototype.hasCompleted = function () {\n        return this.buffer.length === 0 && this.isComplete;\n    };\n    ZipBufferIterator.prototype.notifyComplete = function () {\n        if (this.buffer.length > 0) {\n            this.isComplete = true;\n            this.parent.notifyInactive();\n        }\n        else {\n            this.destination.complete();\n        }\n    };\n    ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.buffer.push(innerValue);\n        this.parent.checkIterators();\n    };\n    ZipBufferIterator.prototype.subscribe = function (value, index) {\n        return subscribeToResult(this, this.observable, this, index);\n    };\n    return ZipBufferIterator;\n}(OuterSubscriber));\n//# sourceMappingURL=zip.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function audit(durationSelector) {\n    return function auditOperatorFunction(source) {\n        return source.lift(new AuditOperator(durationSelector));\n    };\n}\nvar AuditOperator = (function () {\n    function AuditOperator(durationSelector) {\n        this.durationSelector = durationSelector;\n    }\n    AuditOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector));\n    };\n    return AuditOperator;\n}());\nvar AuditSubscriber = (function (_super) {\n    tslib_1.__extends(AuditSubscriber, _super);\n    function AuditSubscriber(destination, durationSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.durationSelector = durationSelector;\n        _this.hasValue = false;\n        return _this;\n    }\n    AuditSubscriber.prototype._next = function (value) {\n        this.value = value;\n        this.hasValue = true;\n        if (!this.throttled) {\n            var duration = void 0;\n            try {\n                var durationSelector = this.durationSelector;\n                duration = durationSelector(value);\n            }\n            catch (err) {\n                return this.destination.error(err);\n            }\n            var innerSubscription = subscribeToResult(this, duration);\n            if (!innerSubscription || innerSubscription.closed) {\n                this.clearThrottle();\n            }\n            else {\n                this.add(this.throttled = innerSubscription);\n            }\n        }\n    };\n    AuditSubscriber.prototype.clearThrottle = function () {\n        var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled;\n        if (throttled) {\n            this.remove(throttled);\n            this.throttled = null;\n            throttled.unsubscribe();\n        }\n        if (hasValue) {\n            this.value = null;\n            this.hasValue = false;\n            this.destination.next(value);\n        }\n    };\n    AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {\n        this.clearThrottle();\n    };\n    AuditSubscriber.prototype.notifyComplete = function () {\n        this.clearThrottle();\n    };\n    return AuditSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=audit.js.map","import { async } from '../scheduler/async';\nimport { audit } from './audit';\nimport { timer } from '../observable/timer';\nexport function auditTime(duration, scheduler) {\n    if (scheduler === void 0) { scheduler = async; }\n    return audit(function () { return timer(duration, scheduler); });\n}\n//# sourceMappingURL=auditTime.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function buffer(closingNotifier) {\n    return function bufferOperatorFunction(source) {\n        return source.lift(new BufferOperator(closingNotifier));\n    };\n}\nvar BufferOperator = (function () {\n    function BufferOperator(closingNotifier) {\n        this.closingNotifier = closingNotifier;\n    }\n    BufferOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));\n    };\n    return BufferOperator;\n}());\nvar BufferSubscriber = (function (_super) {\n    tslib_1.__extends(BufferSubscriber, _super);\n    function BufferSubscriber(destination, closingNotifier) {\n        var _this = _super.call(this, destination) || this;\n        _this.buffer = [];\n        _this.add(subscribeToResult(_this, closingNotifier));\n        return _this;\n    }\n    BufferSubscriber.prototype._next = function (value) {\n        this.buffer.push(value);\n    };\n    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var buffer = this.buffer;\n        this.buffer = [];\n        this.destination.next(buffer);\n    };\n    return BufferSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=buffer.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function bufferCount(bufferSize, startBufferEvery) {\n    if (startBufferEvery === void 0) { startBufferEvery = null; }\n    return function bufferCountOperatorFunction(source) {\n        return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));\n    };\n}\nvar BufferCountOperator = (function () {\n    function BufferCountOperator(bufferSize, startBufferEvery) {\n        this.bufferSize = bufferSize;\n        this.startBufferEvery = startBufferEvery;\n        if (!startBufferEvery || bufferSize === startBufferEvery) {\n            this.subscriberClass = BufferCountSubscriber;\n        }\n        else {\n            this.subscriberClass = BufferSkipCountSubscriber;\n        }\n    }\n    BufferCountOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));\n    };\n    return BufferCountOperator;\n}());\nvar BufferCountSubscriber = (function (_super) {\n    tslib_1.__extends(BufferCountSubscriber, _super);\n    function BufferCountSubscriber(destination, bufferSize) {\n        var _this = _super.call(this, destination) || this;\n        _this.bufferSize = bufferSize;\n        _this.buffer = [];\n        return _this;\n    }\n    BufferCountSubscriber.prototype._next = function (value) {\n        var buffer = this.buffer;\n        buffer.push(value);\n        if (buffer.length == this.bufferSize) {\n            this.destination.next(buffer);\n            this.buffer = [];\n        }\n    };\n    BufferCountSubscriber.prototype._complete = function () {\n        var buffer = this.buffer;\n        if (buffer.length > 0) {\n            this.destination.next(buffer);\n        }\n        _super.prototype._complete.call(this);\n    };\n    return BufferCountSubscriber;\n}(Subscriber));\nvar BufferSkipCountSubscriber = (function (_super) {\n    tslib_1.__extends(BufferSkipCountSubscriber, _super);\n    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {\n        var _this = _super.call(this, destination) || this;\n        _this.bufferSize = bufferSize;\n        _this.startBufferEvery = startBufferEvery;\n        _this.buffers = [];\n        _this.count = 0;\n        return _this;\n    }\n    BufferSkipCountSubscriber.prototype._next = function (value) {\n        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;\n        this.count++;\n        if (count % startBufferEvery === 0) {\n            buffers.push([]);\n        }\n        for (var i = buffers.length; i--;) {\n            var buffer = buffers[i];\n            buffer.push(value);\n            if (buffer.length === bufferSize) {\n                buffers.splice(i, 1);\n                this.destination.next(buffer);\n            }\n        }\n    };\n    BufferSkipCountSubscriber.prototype._complete = function () {\n        var _a = this, buffers = _a.buffers, destination = _a.destination;\n        while (buffers.length > 0) {\n            var buffer = buffers.shift();\n            if (buffer.length > 0) {\n                destination.next(buffer);\n            }\n        }\n        _super.prototype._complete.call(this);\n    };\n    return BufferSkipCountSubscriber;\n}(Subscriber));\n//# sourceMappingURL=bufferCount.js.map","import * as tslib_1 from \"tslib\";\nimport { async } from '../scheduler/async';\nimport { Subscriber } from '../Subscriber';\nimport { isScheduler } from '../util/isScheduler';\nexport function bufferTime(bufferTimeSpan) {\n    var length = arguments.length;\n    var scheduler = async;\n    if (isScheduler(arguments[arguments.length - 1])) {\n        scheduler = arguments[arguments.length - 1];\n        length--;\n    }\n    var bufferCreationInterval = null;\n    if (length >= 2) {\n        bufferCreationInterval = arguments[1];\n    }\n    var maxBufferSize = Number.POSITIVE_INFINITY;\n    if (length >= 3) {\n        maxBufferSize = arguments[2];\n    }\n    return function bufferTimeOperatorFunction(source) {\n        return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));\n    };\n}\nvar BufferTimeOperator = (function () {\n    function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {\n        this.bufferTimeSpan = bufferTimeSpan;\n        this.bufferCreationInterval = bufferCreationInterval;\n        this.maxBufferSize = maxBufferSize;\n        this.scheduler = scheduler;\n    }\n    BufferTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler));\n    };\n    return BufferTimeOperator;\n}());\nvar Context = (function () {\n    function Context() {\n        this.buffer = [];\n    }\n    return Context;\n}());\nvar BufferTimeSubscriber = (function (_super) {\n    tslib_1.__extends(BufferTimeSubscriber, _super);\n    function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.bufferTimeSpan = bufferTimeSpan;\n        _this.bufferCreationInterval = bufferCreationInterval;\n        _this.maxBufferSize = maxBufferSize;\n        _this.scheduler = scheduler;\n        _this.contexts = [];\n        var context = _this.openContext();\n        _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;\n        if (_this.timespanOnly) {\n            var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan };\n            _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));\n        }\n        else {\n            var closeState = { subscriber: _this, context: context };\n            var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler };\n            _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState));\n            _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState));\n        }\n        return _this;\n    }\n    BufferTimeSubscriber.prototype._next = function (value) {\n        var contexts = this.contexts;\n        var len = contexts.length;\n        var filledBufferContext;\n        for (var i = 0; i < len; i++) {\n            var context_1 = contexts[i];\n            var buffer = context_1.buffer;\n            buffer.push(value);\n            if (buffer.length == this.maxBufferSize) {\n                filledBufferContext = context_1;\n            }\n        }\n        if (filledBufferContext) {\n            this.onBufferFull(filledBufferContext);\n        }\n    };\n    BufferTimeSubscriber.prototype._error = function (err) {\n        this.contexts.length = 0;\n        _super.prototype._error.call(this, err);\n    };\n    BufferTimeSubscriber.prototype._complete = function () {\n        var _a = this, contexts = _a.contexts, destination = _a.destination;\n        while (contexts.length > 0) {\n            var context_2 = contexts.shift();\n            destination.next(context_2.buffer);\n        }\n        _super.prototype._complete.call(this);\n    };\n    BufferTimeSubscriber.prototype._unsubscribe = function () {\n        this.contexts = null;\n    };\n    BufferTimeSubscriber.prototype.onBufferFull = function (context) {\n        this.closeContext(context);\n        var closeAction = context.closeAction;\n        closeAction.unsubscribe();\n        this.remove(closeAction);\n        if (!this.closed && this.timespanOnly) {\n            context = this.openContext();\n            var bufferTimeSpan = this.bufferTimeSpan;\n            var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan };\n            this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));\n        }\n    };\n    BufferTimeSubscriber.prototype.openContext = function () {\n        var context = new Context();\n        this.contexts.push(context);\n        return context;\n    };\n    BufferTimeSubscriber.prototype.closeContext = function (context) {\n        this.destination.next(context.buffer);\n        var contexts = this.contexts;\n        var spliceIndex = contexts ? contexts.indexOf(context) : -1;\n        if (spliceIndex >= 0) {\n            contexts.splice(contexts.indexOf(context), 1);\n        }\n    };\n    return BufferTimeSubscriber;\n}(Subscriber));\nfunction dispatchBufferTimeSpanOnly(state) {\n    var subscriber = state.subscriber;\n    var prevContext = state.context;\n    if (prevContext) {\n        subscriber.closeContext(prevContext);\n    }\n    if (!subscriber.closed) {\n        state.context = subscriber.openContext();\n        state.context.closeAction = this.schedule(state, state.bufferTimeSpan);\n    }\n}\nfunction dispatchBufferCreation(state) {\n    var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler;\n    var context = subscriber.openContext();\n    var action = this;\n    if (!subscriber.closed) {\n        subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context }));\n        action.schedule(state, bufferCreationInterval);\n    }\n}\nfunction dispatchBufferClose(arg) {\n    var subscriber = arg.subscriber, context = arg.context;\n    subscriber.closeContext(context);\n}\n//# sourceMappingURL=bufferTime.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscription } from '../Subscription';\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { OuterSubscriber } from '../OuterSubscriber';\nexport function bufferToggle(openings, closingSelector) {\n    return function bufferToggleOperatorFunction(source) {\n        return source.lift(new BufferToggleOperator(openings, closingSelector));\n    };\n}\nvar BufferToggleOperator = (function () {\n    function BufferToggleOperator(openings, closingSelector) {\n        this.openings = openings;\n        this.closingSelector = closingSelector;\n    }\n    BufferToggleOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));\n    };\n    return BufferToggleOperator;\n}());\nvar BufferToggleSubscriber = (function (_super) {\n    tslib_1.__extends(BufferToggleSubscriber, _super);\n    function BufferToggleSubscriber(destination, openings, closingSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.openings = openings;\n        _this.closingSelector = closingSelector;\n        _this.contexts = [];\n        _this.add(subscribeToResult(_this, openings));\n        return _this;\n    }\n    BufferToggleSubscriber.prototype._next = function (value) {\n        var contexts = this.contexts;\n        var len = contexts.length;\n        for (var i = 0; i < len; i++) {\n            contexts[i].buffer.push(value);\n        }\n    };\n    BufferToggleSubscriber.prototype._error = function (err) {\n        var contexts = this.contexts;\n        while (contexts.length > 0) {\n            var context_1 = contexts.shift();\n            context_1.subscription.unsubscribe();\n            context_1.buffer = null;\n            context_1.subscription = null;\n        }\n        this.contexts = null;\n        _super.prototype._error.call(this, err);\n    };\n    BufferToggleSubscriber.prototype._complete = function () {\n        var contexts = this.contexts;\n        while (contexts.length > 0) {\n            var context_2 = contexts.shift();\n            this.destination.next(context_2.buffer);\n            context_2.subscription.unsubscribe();\n            context_2.buffer = null;\n            context_2.subscription = null;\n        }\n        this.contexts = null;\n        _super.prototype._complete.call(this);\n    };\n    BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);\n    };\n    BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.closeBuffer(innerSub.context);\n    };\n    BufferToggleSubscriber.prototype.openBuffer = function (value) {\n        try {\n            var closingSelector = this.closingSelector;\n            var closingNotifier = closingSelector.call(this, value);\n            if (closingNotifier) {\n                this.trySubscribe(closingNotifier);\n            }\n        }\n        catch (err) {\n            this._error(err);\n        }\n    };\n    BufferToggleSubscriber.prototype.closeBuffer = function (context) {\n        var contexts = this.contexts;\n        if (contexts && context) {\n            var buffer = context.buffer, subscription = context.subscription;\n            this.destination.next(buffer);\n            contexts.splice(contexts.indexOf(context), 1);\n            this.remove(subscription);\n            subscription.unsubscribe();\n        }\n    };\n    BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) {\n        var contexts = this.contexts;\n        var buffer = [];\n        var subscription = new Subscription();\n        var context = { buffer: buffer, subscription: subscription };\n        contexts.push(context);\n        var innerSubscription = subscribeToResult(this, closingNotifier, context);\n        if (!innerSubscription || innerSubscription.closed) {\n            this.closeBuffer(context);\n        }\n        else {\n            innerSubscription.context = context;\n            this.add(innerSubscription);\n            subscription.add(innerSubscription);\n        }\n    };\n    return BufferToggleSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=bufferToggle.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscription } from '../Subscription';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function bufferWhen(closingSelector) {\n    return function (source) {\n        return source.lift(new BufferWhenOperator(closingSelector));\n    };\n}\nvar BufferWhenOperator = (function () {\n    function BufferWhenOperator(closingSelector) {\n        this.closingSelector = closingSelector;\n    }\n    BufferWhenOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));\n    };\n    return BufferWhenOperator;\n}());\nvar BufferWhenSubscriber = (function (_super) {\n    tslib_1.__extends(BufferWhenSubscriber, _super);\n    function BufferWhenSubscriber(destination, closingSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.closingSelector = closingSelector;\n        _this.subscribing = false;\n        _this.openBuffer();\n        return _this;\n    }\n    BufferWhenSubscriber.prototype._next = function (value) {\n        this.buffer.push(value);\n    };\n    BufferWhenSubscriber.prototype._complete = function () {\n        var buffer = this.buffer;\n        if (buffer) {\n            this.destination.next(buffer);\n        }\n        _super.prototype._complete.call(this);\n    };\n    BufferWhenSubscriber.prototype._unsubscribe = function () {\n        this.buffer = null;\n        this.subscribing = false;\n    };\n    BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.openBuffer();\n    };\n    BufferWhenSubscriber.prototype.notifyComplete = function () {\n        if (this.subscribing) {\n            this.complete();\n        }\n        else {\n            this.openBuffer();\n        }\n    };\n    BufferWhenSubscriber.prototype.openBuffer = function () {\n        var closingSubscription = this.closingSubscription;\n        if (closingSubscription) {\n            this.remove(closingSubscription);\n            closingSubscription.unsubscribe();\n        }\n        var buffer = this.buffer;\n        if (this.buffer) {\n            this.destination.next(buffer);\n        }\n        this.buffer = [];\n        var closingNotifier;\n        try {\n            var closingSelector = this.closingSelector;\n            closingNotifier = closingSelector();\n        }\n        catch (err) {\n            return this.error(err);\n        }\n        closingSubscription = new Subscription();\n        this.closingSubscription = closingSubscription;\n        this.add(closingSubscription);\n        this.subscribing = true;\n        closingSubscription.add(subscribeToResult(this, closingNotifier));\n        this.subscribing = false;\n    };\n    return BufferWhenSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=bufferWhen.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function catchError(selector) {\n    return function catchErrorOperatorFunction(source) {\n        var operator = new CatchOperator(selector);\n        var caught = source.lift(operator);\n        return (operator.caught = caught);\n    };\n}\nvar CatchOperator = (function () {\n    function CatchOperator(selector) {\n        this.selector = selector;\n    }\n    CatchOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));\n    };\n    return CatchOperator;\n}());\nvar CatchSubscriber = (function (_super) {\n    tslib_1.__extends(CatchSubscriber, _super);\n    function CatchSubscriber(destination, selector, caught) {\n        var _this = _super.call(this, destination) || this;\n        _this.selector = selector;\n        _this.caught = caught;\n        return _this;\n    }\n    CatchSubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var result = void 0;\n            try {\n                result = this.selector(err, this.caught);\n            }\n            catch (err2) {\n                _super.prototype.error.call(this, err2);\n                return;\n            }\n            this._unsubscribeAndRecycle();\n            var innerSubscriber = new InnerSubscriber(this, undefined, undefined);\n            this.add(innerSubscriber);\n            var innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);\n            if (innerSubscription !== innerSubscriber) {\n                this.add(innerSubscription);\n            }\n        }\n    };\n    return CatchSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=catchError.js.map","import { CombineLatestOperator } from '../observable/combineLatest';\nexport function combineAll(project) {\n    return function (source) { return source.lift(new CombineLatestOperator(project)); };\n}\n//# sourceMappingURL=combineAll.js.map","import { isArray } from '../util/isArray';\nimport { CombineLatestOperator } from '../observable/combineLatest';\nimport { from } from '../observable/from';\nvar none = {};\nexport function combineLatest() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    var project = null;\n    if (typeof observables[observables.length - 1] === 'function') {\n        project = observables.pop();\n    }\n    if (observables.length === 1 && isArray(observables[0])) {\n        observables = observables[0].slice();\n    }\n    return function (source) { return source.lift.call(from([source].concat(observables)), new CombineLatestOperator(project)); };\n}\n//# sourceMappingURL=combineLatest.js.map","import { concat as concatStatic } from '../observable/concat';\nexport function concat() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    return function (source) { return source.lift.call(concatStatic.apply(void 0, [source].concat(observables))); };\n}\n//# sourceMappingURL=concat.js.map","import { mergeMap } from './mergeMap';\nexport function concatMap(project, resultSelector) {\n    return mergeMap(project, resultSelector, 1);\n}\n//# sourceMappingURL=concatMap.js.map","import { concatMap } from './concatMap';\nexport function concatMapTo(innerObservable, resultSelector) {\n    return concatMap(function () { return innerObservable; }, resultSelector);\n}\n//# sourceMappingURL=concatMapTo.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function count(predicate) {\n    return function (source) { return source.lift(new CountOperator(predicate, source)); };\n}\nvar CountOperator = (function () {\n    function CountOperator(predicate, source) {\n        this.predicate = predicate;\n        this.source = source;\n    }\n    CountOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));\n    };\n    return CountOperator;\n}());\nvar CountSubscriber = (function (_super) {\n    tslib_1.__extends(CountSubscriber, _super);\n    function CountSubscriber(destination, predicate, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.source = source;\n        _this.count = 0;\n        _this.index = 0;\n        return _this;\n    }\n    CountSubscriber.prototype._next = function (value) {\n        if (this.predicate) {\n            this._tryPredicate(value);\n        }\n        else {\n            this.count++;\n        }\n    };\n    CountSubscriber.prototype._tryPredicate = function (value) {\n        var result;\n        try {\n            result = this.predicate(value, this.index++, this.source);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            this.count++;\n        }\n    };\n    CountSubscriber.prototype._complete = function () {\n        this.destination.next(this.count);\n        this.destination.complete();\n    };\n    return CountSubscriber;\n}(Subscriber));\n//# sourceMappingURL=count.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function debounce(durationSelector) {\n    return function (source) { return source.lift(new DebounceOperator(durationSelector)); };\n}\nvar DebounceOperator = (function () {\n    function DebounceOperator(durationSelector) {\n        this.durationSelector = durationSelector;\n    }\n    DebounceOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));\n    };\n    return DebounceOperator;\n}());\nvar DebounceSubscriber = (function (_super) {\n    tslib_1.__extends(DebounceSubscriber, _super);\n    function DebounceSubscriber(destination, durationSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.durationSelector = durationSelector;\n        _this.hasValue = false;\n        _this.durationSubscription = null;\n        return _this;\n    }\n    DebounceSubscriber.prototype._next = function (value) {\n        try {\n            var result = this.durationSelector.call(this, value);\n            if (result) {\n                this._tryNext(value, result);\n            }\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    DebounceSubscriber.prototype._complete = function () {\n        this.emitValue();\n        this.destination.complete();\n    };\n    DebounceSubscriber.prototype._tryNext = function (value, duration) {\n        var subscription = this.durationSubscription;\n        this.value = value;\n        this.hasValue = true;\n        if (subscription) {\n            subscription.unsubscribe();\n            this.remove(subscription);\n        }\n        subscription = subscribeToResult(this, duration);\n        if (subscription && !subscription.closed) {\n            this.add(this.durationSubscription = subscription);\n        }\n    };\n    DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.emitValue();\n    };\n    DebounceSubscriber.prototype.notifyComplete = function () {\n        this.emitValue();\n    };\n    DebounceSubscriber.prototype.emitValue = function () {\n        if (this.hasValue) {\n            var value = this.value;\n            var subscription = this.durationSubscription;\n            if (subscription) {\n                this.durationSubscription = null;\n                subscription.unsubscribe();\n                this.remove(subscription);\n            }\n            this.value = null;\n            this.hasValue = false;\n            _super.prototype._next.call(this, value);\n        }\n    };\n    return DebounceSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=debounce.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { async } from '../scheduler/async';\nexport function debounceTime(dueTime, scheduler) {\n    if (scheduler === void 0) { scheduler = async; }\n    return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); };\n}\nvar DebounceTimeOperator = (function () {\n    function DebounceTimeOperator(dueTime, scheduler) {\n        this.dueTime = dueTime;\n        this.scheduler = scheduler;\n    }\n    DebounceTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));\n    };\n    return DebounceTimeOperator;\n}());\nvar DebounceTimeSubscriber = (function (_super) {\n    tslib_1.__extends(DebounceTimeSubscriber, _super);\n    function DebounceTimeSubscriber(destination, dueTime, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.dueTime = dueTime;\n        _this.scheduler = scheduler;\n        _this.debouncedSubscription = null;\n        _this.lastValue = null;\n        _this.hasValue = false;\n        return _this;\n    }\n    DebounceTimeSubscriber.prototype._next = function (value) {\n        this.clearDebounce();\n        this.lastValue = value;\n        this.hasValue = true;\n        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));\n    };\n    DebounceTimeSubscriber.prototype._complete = function () {\n        this.debouncedNext();\n        this.destination.complete();\n    };\n    DebounceTimeSubscriber.prototype.debouncedNext = function () {\n        this.clearDebounce();\n        if (this.hasValue) {\n            var lastValue = this.lastValue;\n            this.lastValue = null;\n            this.hasValue = false;\n            this.destination.next(lastValue);\n        }\n    };\n    DebounceTimeSubscriber.prototype.clearDebounce = function () {\n        var debouncedSubscription = this.debouncedSubscription;\n        if (debouncedSubscription !== null) {\n            this.remove(debouncedSubscription);\n            debouncedSubscription.unsubscribe();\n            this.debouncedSubscription = null;\n        }\n    };\n    return DebounceTimeSubscriber;\n}(Subscriber));\nfunction dispatchNext(subscriber) {\n    subscriber.debouncedNext();\n}\n//# sourceMappingURL=debounceTime.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function defaultIfEmpty(defaultValue) {\n    if (defaultValue === void 0) { defaultValue = null; }\n    return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); };\n}\nvar DefaultIfEmptyOperator = (function () {\n    function DefaultIfEmptyOperator(defaultValue) {\n        this.defaultValue = defaultValue;\n    }\n    DefaultIfEmptyOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));\n    };\n    return DefaultIfEmptyOperator;\n}());\nvar DefaultIfEmptySubscriber = (function (_super) {\n    tslib_1.__extends(DefaultIfEmptySubscriber, _super);\n    function DefaultIfEmptySubscriber(destination, defaultValue) {\n        var _this = _super.call(this, destination) || this;\n        _this.defaultValue = defaultValue;\n        _this.isEmpty = true;\n        return _this;\n    }\n    DefaultIfEmptySubscriber.prototype._next = function (value) {\n        this.isEmpty = false;\n        this.destination.next(value);\n    };\n    DefaultIfEmptySubscriber.prototype._complete = function () {\n        if (this.isEmpty) {\n            this.destination.next(this.defaultValue);\n        }\n        this.destination.complete();\n    };\n    return DefaultIfEmptySubscriber;\n}(Subscriber));\n//# sourceMappingURL=defaultIfEmpty.js.map","export function isDate(value) {\n    return value instanceof Date && !isNaN(+value);\n}\n//# sourceMappingURL=isDate.js.map","import * as tslib_1 from \"tslib\";\nimport { async } from '../scheduler/async';\nimport { isDate } from '../util/isDate';\nimport { Subscriber } from '../Subscriber';\nimport { Notification } from '../Notification';\nexport function delay(delay, scheduler) {\n    if (scheduler === void 0) { scheduler = async; }\n    var absoluteDelay = isDate(delay);\n    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);\n    return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); };\n}\nvar DelayOperator = (function () {\n    function DelayOperator(delay, scheduler) {\n        this.delay = delay;\n        this.scheduler = scheduler;\n    }\n    DelayOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));\n    };\n    return DelayOperator;\n}());\nvar DelaySubscriber = (function (_super) {\n    tslib_1.__extends(DelaySubscriber, _super);\n    function DelaySubscriber(destination, delay, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.delay = delay;\n        _this.scheduler = scheduler;\n        _this.queue = [];\n        _this.active = false;\n        _this.errored = false;\n        return _this;\n    }\n    DelaySubscriber.dispatch = function (state) {\n        var source = state.source;\n        var queue = source.queue;\n        var scheduler = state.scheduler;\n        var destination = state.destination;\n        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {\n            queue.shift().notification.observe(destination);\n        }\n        if (queue.length > 0) {\n            var delay_1 = Math.max(0, queue[0].time - scheduler.now());\n            this.schedule(state, delay_1);\n        }\n        else {\n            this.unsubscribe();\n            source.active = false;\n        }\n    };\n    DelaySubscriber.prototype._schedule = function (scheduler) {\n        this.active = true;\n        var destination = this.destination;\n        destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {\n            source: this, destination: this.destination, scheduler: scheduler\n        }));\n    };\n    DelaySubscriber.prototype.scheduleNotification = function (notification) {\n        if (this.errored === true) {\n            return;\n        }\n        var scheduler = this.scheduler;\n        var message = new DelayMessage(scheduler.now() + this.delay, notification);\n        this.queue.push(message);\n        if (this.active === false) {\n            this._schedule(scheduler);\n        }\n    };\n    DelaySubscriber.prototype._next = function (value) {\n        this.scheduleNotification(Notification.createNext(value));\n    };\n    DelaySubscriber.prototype._error = function (err) {\n        this.errored = true;\n        this.queue = [];\n        this.destination.error(err);\n        this.unsubscribe();\n    };\n    DelaySubscriber.prototype._complete = function () {\n        this.scheduleNotification(Notification.createComplete());\n        this.unsubscribe();\n    };\n    return DelaySubscriber;\n}(Subscriber));\nvar DelayMessage = (function () {\n    function DelayMessage(time, notification) {\n        this.time = time;\n        this.notification = notification;\n    }\n    return DelayMessage;\n}());\n//# sourceMappingURL=delay.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function delayWhen(delayDurationSelector, subscriptionDelay) {\n    if (subscriptionDelay) {\n        return function (source) {\n            return new SubscriptionDelayObservable(source, subscriptionDelay)\n                .lift(new DelayWhenOperator(delayDurationSelector));\n        };\n    }\n    return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); };\n}\nvar DelayWhenOperator = (function () {\n    function DelayWhenOperator(delayDurationSelector) {\n        this.delayDurationSelector = delayDurationSelector;\n    }\n    DelayWhenOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));\n    };\n    return DelayWhenOperator;\n}());\nvar DelayWhenSubscriber = (function (_super) {\n    tslib_1.__extends(DelayWhenSubscriber, _super);\n    function DelayWhenSubscriber(destination, delayDurationSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.delayDurationSelector = delayDurationSelector;\n        _this.completed = false;\n        _this.delayNotifierSubscriptions = [];\n        _this.index = 0;\n        return _this;\n    }\n    DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.destination.next(outerValue);\n        this.removeSubscription(innerSub);\n        this.tryComplete();\n    };\n    DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) {\n        this._error(error);\n    };\n    DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) {\n        var value = this.removeSubscription(innerSub);\n        if (value) {\n            this.destination.next(value);\n        }\n        this.tryComplete();\n    };\n    DelayWhenSubscriber.prototype._next = function (value) {\n        var index = this.index++;\n        try {\n            var delayNotifier = this.delayDurationSelector(value, index);\n            if (delayNotifier) {\n                this.tryDelay(delayNotifier, value);\n            }\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    DelayWhenSubscriber.prototype._complete = function () {\n        this.completed = true;\n        this.tryComplete();\n        this.unsubscribe();\n    };\n    DelayWhenSubscriber.prototype.removeSubscription = function (subscription) {\n        subscription.unsubscribe();\n        var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);\n        if (subscriptionIdx !== -1) {\n            this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);\n        }\n        return subscription.outerValue;\n    };\n    DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) {\n        var notifierSubscription = subscribeToResult(this, delayNotifier, value);\n        if (notifierSubscription && !notifierSubscription.closed) {\n            var destination = this.destination;\n            destination.add(notifierSubscription);\n            this.delayNotifierSubscriptions.push(notifierSubscription);\n        }\n    };\n    DelayWhenSubscriber.prototype.tryComplete = function () {\n        if (this.completed && this.delayNotifierSubscriptions.length === 0) {\n            this.destination.complete();\n        }\n    };\n    return DelayWhenSubscriber;\n}(OuterSubscriber));\nvar SubscriptionDelayObservable = (function (_super) {\n    tslib_1.__extends(SubscriptionDelayObservable, _super);\n    function SubscriptionDelayObservable(source, subscriptionDelay) {\n        var _this = _super.call(this) || this;\n        _this.source = source;\n        _this.subscriptionDelay = subscriptionDelay;\n        return _this;\n    }\n    SubscriptionDelayObservable.prototype._subscribe = function (subscriber) {\n        this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));\n    };\n    return SubscriptionDelayObservable;\n}(Observable));\nvar SubscriptionDelaySubscriber = (function (_super) {\n    tslib_1.__extends(SubscriptionDelaySubscriber, _super);\n    function SubscriptionDelaySubscriber(parent, source) {\n        var _this = _super.call(this) || this;\n        _this.parent = parent;\n        _this.source = source;\n        _this.sourceSubscribed = false;\n        return _this;\n    }\n    SubscriptionDelaySubscriber.prototype._next = function (unused) {\n        this.subscribeToSource();\n    };\n    SubscriptionDelaySubscriber.prototype._error = function (err) {\n        this.unsubscribe();\n        this.parent.error(err);\n    };\n    SubscriptionDelaySubscriber.prototype._complete = function () {\n        this.unsubscribe();\n        this.subscribeToSource();\n    };\n    SubscriptionDelaySubscriber.prototype.subscribeToSource = function () {\n        if (!this.sourceSubscribed) {\n            this.sourceSubscribed = true;\n            this.unsubscribe();\n            this.source.subscribe(this.parent);\n        }\n    };\n    return SubscriptionDelaySubscriber;\n}(Subscriber));\n//# sourceMappingURL=delayWhen.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function dematerialize() {\n    return function dematerializeOperatorFunction(source) {\n        return source.lift(new DeMaterializeOperator());\n    };\n}\nvar DeMaterializeOperator = (function () {\n    function DeMaterializeOperator() {\n    }\n    DeMaterializeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DeMaterializeSubscriber(subscriber));\n    };\n    return DeMaterializeOperator;\n}());\nvar DeMaterializeSubscriber = (function (_super) {\n    tslib_1.__extends(DeMaterializeSubscriber, _super);\n    function DeMaterializeSubscriber(destination) {\n        return _super.call(this, destination) || this;\n    }\n    DeMaterializeSubscriber.prototype._next = function (value) {\n        value.observe(this.destination);\n    };\n    return DeMaterializeSubscriber;\n}(Subscriber));\n//# sourceMappingURL=dematerialize.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function distinct(keySelector, flushes) {\n    return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); };\n}\nvar DistinctOperator = (function () {\n    function DistinctOperator(keySelector, flushes) {\n        this.keySelector = keySelector;\n        this.flushes = flushes;\n    }\n    DistinctOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));\n    };\n    return DistinctOperator;\n}());\nvar DistinctSubscriber = (function (_super) {\n    tslib_1.__extends(DistinctSubscriber, _super);\n    function DistinctSubscriber(destination, keySelector, flushes) {\n        var _this = _super.call(this, destination) || this;\n        _this.keySelector = keySelector;\n        _this.values = new Set();\n        if (flushes) {\n            _this.add(subscribeToResult(_this, flushes));\n        }\n        return _this;\n    }\n    DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.values.clear();\n    };\n    DistinctSubscriber.prototype.notifyError = function (error, innerSub) {\n        this._error(error);\n    };\n    DistinctSubscriber.prototype._next = function (value) {\n        if (this.keySelector) {\n            this._useKeySelector(value);\n        }\n        else {\n            this._finalizeNext(value, value);\n        }\n    };\n    DistinctSubscriber.prototype._useKeySelector = function (value) {\n        var key;\n        var destination = this.destination;\n        try {\n            key = this.keySelector(value);\n        }\n        catch (err) {\n            destination.error(err);\n            return;\n        }\n        this._finalizeNext(key, value);\n    };\n    DistinctSubscriber.prototype._finalizeNext = function (key, value) {\n        var values = this.values;\n        if (!values.has(key)) {\n            values.add(key);\n            this.destination.next(value);\n        }\n    };\n    return DistinctSubscriber;\n}(OuterSubscriber));\nexport { DistinctSubscriber };\n//# sourceMappingURL=distinct.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function distinctUntilChanged(compare, keySelector) {\n    return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); };\n}\nvar DistinctUntilChangedOperator = (function () {\n    function DistinctUntilChangedOperator(compare, keySelector) {\n        this.compare = compare;\n        this.keySelector = keySelector;\n    }\n    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));\n    };\n    return DistinctUntilChangedOperator;\n}());\nvar DistinctUntilChangedSubscriber = (function (_super) {\n    tslib_1.__extends(DistinctUntilChangedSubscriber, _super);\n    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.keySelector = keySelector;\n        _this.hasKey = false;\n        if (typeof compare === 'function') {\n            _this.compare = compare;\n        }\n        return _this;\n    }\n    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {\n        return x === y;\n    };\n    DistinctUntilChangedSubscriber.prototype._next = function (value) {\n        var key;\n        try {\n            var keySelector = this.keySelector;\n            key = keySelector ? keySelector(value) : value;\n        }\n        catch (err) {\n            return this.destination.error(err);\n        }\n        var result = false;\n        if (this.hasKey) {\n            try {\n                var compare = this.compare;\n                result = compare(this.key, key);\n            }\n            catch (err) {\n                return this.destination.error(err);\n            }\n        }\n        else {\n            this.hasKey = true;\n        }\n        if (!result) {\n            this.key = key;\n            this.destination.next(value);\n        }\n    };\n    return DistinctUntilChangedSubscriber;\n}(Subscriber));\n//# sourceMappingURL=distinctUntilChanged.js.map","import { distinctUntilChanged } from './distinctUntilChanged';\nexport function distinctUntilKeyChanged(key, compare) {\n    return distinctUntilChanged(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });\n}\n//# sourceMappingURL=distinctUntilKeyChanged.js.map","import * as tslib_1 from \"tslib\";\nimport { EmptyError } from '../util/EmptyError';\nimport { Subscriber } from '../Subscriber';\nexport function throwIfEmpty(errorFactory) {\n    if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }\n    return function (source) {\n        return source.lift(new ThrowIfEmptyOperator(errorFactory));\n    };\n}\nvar ThrowIfEmptyOperator = (function () {\n    function ThrowIfEmptyOperator(errorFactory) {\n        this.errorFactory = errorFactory;\n    }\n    ThrowIfEmptyOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory));\n    };\n    return ThrowIfEmptyOperator;\n}());\nvar ThrowIfEmptySubscriber = (function (_super) {\n    tslib_1.__extends(ThrowIfEmptySubscriber, _super);\n    function ThrowIfEmptySubscriber(destination, errorFactory) {\n        var _this = _super.call(this, destination) || this;\n        _this.errorFactory = errorFactory;\n        _this.hasValue = false;\n        return _this;\n    }\n    ThrowIfEmptySubscriber.prototype._next = function (value) {\n        this.hasValue = true;\n        this.destination.next(value);\n    };\n    ThrowIfEmptySubscriber.prototype._complete = function () {\n        if (!this.hasValue) {\n            var err = void 0;\n            try {\n                err = this.errorFactory();\n            }\n            catch (e) {\n                err = e;\n            }\n            this.destination.error(err);\n        }\n        else {\n            return this.destination.complete();\n        }\n    };\n    return ThrowIfEmptySubscriber;\n}(Subscriber));\nfunction defaultErrorFactory() {\n    return new EmptyError();\n}\n//# sourceMappingURL=throwIfEmpty.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';\nimport { empty } from '../observable/empty';\nexport function take(count) {\n    return function (source) {\n        if (count === 0) {\n            return empty();\n        }\n        else {\n            return source.lift(new TakeOperator(count));\n        }\n    };\n}\nvar TakeOperator = (function () {\n    function TakeOperator(total) {\n        this.total = total;\n        if (this.total < 0) {\n            throw new ArgumentOutOfRangeError;\n        }\n    }\n    TakeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeSubscriber(subscriber, this.total));\n    };\n    return TakeOperator;\n}());\nvar TakeSubscriber = (function (_super) {\n    tslib_1.__extends(TakeSubscriber, _super);\n    function TakeSubscriber(destination, total) {\n        var _this = _super.call(this, destination) || this;\n        _this.total = total;\n        _this.count = 0;\n        return _this;\n    }\n    TakeSubscriber.prototype._next = function (value) {\n        var total = this.total;\n        var count = ++this.count;\n        if (count <= total) {\n            this.destination.next(value);\n            if (count === total) {\n                this.destination.complete();\n                this.unsubscribe();\n            }\n        }\n    };\n    return TakeSubscriber;\n}(Subscriber));\n//# sourceMappingURL=take.js.map","import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';\nimport { filter } from './filter';\nimport { throwIfEmpty } from './throwIfEmpty';\nimport { defaultIfEmpty } from './defaultIfEmpty';\nimport { take } from './take';\nexport function elementAt(index, defaultValue) {\n    if (index < 0) {\n        throw new ArgumentOutOfRangeError();\n    }\n    var hasDefaultValue = arguments.length >= 2;\n    return function (source) { return source.pipe(filter(function (v, i) { return i === index; }), take(1), hasDefaultValue\n        ? defaultIfEmpty(defaultValue)\n        : throwIfEmpty(function () { return new ArgumentOutOfRangeError(); })); };\n}\n//# sourceMappingURL=elementAt.js.map","import { concat } from '../observable/concat';\nimport { of } from '../observable/of';\nexport function endWith() {\n    var array = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        array[_i] = arguments[_i];\n    }\n    return function (source) { return concat(source, of.apply(void 0, array)); };\n}\n//# sourceMappingURL=endWith.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function every(predicate, thisArg) {\n    return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); };\n}\nvar EveryOperator = (function () {\n    function EveryOperator(predicate, thisArg, source) {\n        this.predicate = predicate;\n        this.thisArg = thisArg;\n        this.source = source;\n    }\n    EveryOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));\n    };\n    return EveryOperator;\n}());\nvar EverySubscriber = (function (_super) {\n    tslib_1.__extends(EverySubscriber, _super);\n    function EverySubscriber(destination, predicate, thisArg, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.thisArg = thisArg;\n        _this.source = source;\n        _this.index = 0;\n        _this.thisArg = thisArg || _this;\n        return _this;\n    }\n    EverySubscriber.prototype.notifyComplete = function (everyValueMatch) {\n        this.destination.next(everyValueMatch);\n        this.destination.complete();\n    };\n    EverySubscriber.prototype._next = function (value) {\n        var result = false;\n        try {\n            result = this.predicate.call(this.thisArg, value, this.index++, this.source);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (!result) {\n            this.notifyComplete(false);\n        }\n    };\n    EverySubscriber.prototype._complete = function () {\n        this.notifyComplete(true);\n    };\n    return EverySubscriber;\n}(Subscriber));\n//# sourceMappingURL=every.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function exhaust() {\n    return function (source) { return source.lift(new SwitchFirstOperator()); };\n}\nvar SwitchFirstOperator = (function () {\n    function SwitchFirstOperator() {\n    }\n    SwitchFirstOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SwitchFirstSubscriber(subscriber));\n    };\n    return SwitchFirstOperator;\n}());\nvar SwitchFirstSubscriber = (function (_super) {\n    tslib_1.__extends(SwitchFirstSubscriber, _super);\n    function SwitchFirstSubscriber(destination) {\n        var _this = _super.call(this, destination) || this;\n        _this.hasCompleted = false;\n        _this.hasSubscription = false;\n        return _this;\n    }\n    SwitchFirstSubscriber.prototype._next = function (value) {\n        if (!this.hasSubscription) {\n            this.hasSubscription = true;\n            this.add(subscribeToResult(this, value));\n        }\n    };\n    SwitchFirstSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (!this.hasSubscription) {\n            this.destination.complete();\n        }\n    };\n    SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.remove(innerSub);\n        this.hasSubscription = false;\n        if (this.hasCompleted) {\n            this.destination.complete();\n        }\n    };\n    return SwitchFirstSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=exhaust.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { map } from './map';\nimport { from } from '../observable/from';\nexport function exhaustMap(project, resultSelector) {\n    if (resultSelector) {\n        return function (source) { return source.pipe(exhaustMap(function (a, i) { return from(project(a, i)).pipe(map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };\n    }\n    return function (source) {\n        return source.lift(new ExhaustMapOperator(project));\n    };\n}\nvar ExhaustMapOperator = (function () {\n    function ExhaustMapOperator(project) {\n        this.project = project;\n    }\n    ExhaustMapOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project));\n    };\n    return ExhaustMapOperator;\n}());\nvar ExhaustMapSubscriber = (function (_super) {\n    tslib_1.__extends(ExhaustMapSubscriber, _super);\n    function ExhaustMapSubscriber(destination, project) {\n        var _this = _super.call(this, destination) || this;\n        _this.project = project;\n        _this.hasSubscription = false;\n        _this.hasCompleted = false;\n        _this.index = 0;\n        return _this;\n    }\n    ExhaustMapSubscriber.prototype._next = function (value) {\n        if (!this.hasSubscription) {\n            this.tryNext(value);\n        }\n    };\n    ExhaustMapSubscriber.prototype.tryNext = function (value) {\n        var result;\n        var index = this.index++;\n        try {\n            result = this.project(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.hasSubscription = true;\n        this._innerSub(result, value, index);\n    };\n    ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) {\n        var innerSubscriber = new InnerSubscriber(this, value, index);\n        var destination = this.destination;\n        destination.add(innerSubscriber);\n        var innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);\n        if (innerSubscription !== innerSubscriber) {\n            destination.add(innerSubscription);\n        }\n    };\n    ExhaustMapSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (!this.hasSubscription) {\n            this.destination.complete();\n        }\n        this.unsubscribe();\n    };\n    ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.destination.next(innerValue);\n    };\n    ExhaustMapSubscriber.prototype.notifyError = function (err) {\n        this.destination.error(err);\n    };\n    ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) {\n        var destination = this.destination;\n        destination.remove(innerSub);\n        this.hasSubscription = false;\n        if (this.hasCompleted) {\n            this.destination.complete();\n        }\n    };\n    return ExhaustMapSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=exhaustMap.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function expand(project, concurrent, scheduler) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    if (scheduler === void 0) { scheduler = undefined; }\n    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;\n    return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); };\n}\nvar ExpandOperator = (function () {\n    function ExpandOperator(project, concurrent, scheduler) {\n        this.project = project;\n        this.concurrent = concurrent;\n        this.scheduler = scheduler;\n    }\n    ExpandOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));\n    };\n    return ExpandOperator;\n}());\nexport { ExpandOperator };\nvar ExpandSubscriber = (function (_super) {\n    tslib_1.__extends(ExpandSubscriber, _super);\n    function ExpandSubscriber(destination, project, concurrent, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.project = project;\n        _this.concurrent = concurrent;\n        _this.scheduler = scheduler;\n        _this.index = 0;\n        _this.active = 0;\n        _this.hasCompleted = false;\n        if (concurrent < Number.POSITIVE_INFINITY) {\n            _this.buffer = [];\n        }\n        return _this;\n    }\n    ExpandSubscriber.dispatch = function (arg) {\n        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;\n        subscriber.subscribeToProjection(result, value, index);\n    };\n    ExpandSubscriber.prototype._next = function (value) {\n        var destination = this.destination;\n        if (destination.closed) {\n            this._complete();\n            return;\n        }\n        var index = this.index++;\n        if (this.active < this.concurrent) {\n            destination.next(value);\n            try {\n                var project = this.project;\n                var result = project(value, index);\n                if (!this.scheduler) {\n                    this.subscribeToProjection(result, value, index);\n                }\n                else {\n                    var state = { subscriber: this, result: result, value: value, index: index };\n                    var destination_1 = this.destination;\n                    destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));\n                }\n            }\n            catch (e) {\n                destination.error(e);\n            }\n        }\n        else {\n            this.buffer.push(value);\n        }\n    };\n    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {\n        this.active++;\n        var destination = this.destination;\n        destination.add(subscribeToResult(this, result, value, index));\n    };\n    ExpandSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.hasCompleted && this.active === 0) {\n            this.destination.complete();\n        }\n        this.unsubscribe();\n    };\n    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this._next(innerValue);\n    };\n    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        var destination = this.destination;\n        destination.remove(innerSub);\n        this.active--;\n        if (buffer && buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        if (this.hasCompleted && this.active === 0) {\n            this.destination.complete();\n        }\n    };\n    return ExpandSubscriber;\n}(OuterSubscriber));\nexport { ExpandSubscriber };\n//# sourceMappingURL=expand.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\nexport function finalize(callback) {\n    return function (source) { return source.lift(new FinallyOperator(callback)); };\n}\nvar FinallyOperator = (function () {\n    function FinallyOperator(callback) {\n        this.callback = callback;\n    }\n    FinallyOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new FinallySubscriber(subscriber, this.callback));\n    };\n    return FinallyOperator;\n}());\nvar FinallySubscriber = (function (_super) {\n    tslib_1.__extends(FinallySubscriber, _super);\n    function FinallySubscriber(destination, callback) {\n        var _this = _super.call(this, destination) || this;\n        _this.add(new Subscription(callback));\n        return _this;\n    }\n    return FinallySubscriber;\n}(Subscriber));\n//# sourceMappingURL=finalize.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function find(predicate, thisArg) {\n    if (typeof predicate !== 'function') {\n        throw new TypeError('predicate is not a function');\n    }\n    return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); };\n}\nvar FindValueOperator = (function () {\n    function FindValueOperator(predicate, source, yieldIndex, thisArg) {\n        this.predicate = predicate;\n        this.source = source;\n        this.yieldIndex = yieldIndex;\n        this.thisArg = thisArg;\n    }\n    FindValueOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));\n    };\n    return FindValueOperator;\n}());\nexport { FindValueOperator };\nvar FindValueSubscriber = (function (_super) {\n    tslib_1.__extends(FindValueSubscriber, _super);\n    function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.source = source;\n        _this.yieldIndex = yieldIndex;\n        _this.thisArg = thisArg;\n        _this.index = 0;\n        return _this;\n    }\n    FindValueSubscriber.prototype.notifyComplete = function (value) {\n        var destination = this.destination;\n        destination.next(value);\n        destination.complete();\n        this.unsubscribe();\n    };\n    FindValueSubscriber.prototype._next = function (value) {\n        var _a = this, predicate = _a.predicate, thisArg = _a.thisArg;\n        var index = this.index++;\n        try {\n            var result = predicate.call(thisArg || this, value, index, this.source);\n            if (result) {\n                this.notifyComplete(this.yieldIndex ? index : value);\n            }\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    FindValueSubscriber.prototype._complete = function () {\n        this.notifyComplete(this.yieldIndex ? -1 : undefined);\n    };\n    return FindValueSubscriber;\n}(Subscriber));\nexport { FindValueSubscriber };\n//# sourceMappingURL=find.js.map","import { FindValueOperator } from '../operators/find';\nexport function findIndex(predicate, thisArg) {\n    return function (source) { return source.lift(new FindValueOperator(predicate, source, true, thisArg)); };\n}\n//# sourceMappingURL=findIndex.js.map","import { EmptyError } from '../util/EmptyError';\nimport { filter } from './filter';\nimport { take } from './take';\nimport { defaultIfEmpty } from './defaultIfEmpty';\nimport { throwIfEmpty } from './throwIfEmpty';\nimport { identity } from '../util/identity';\nexport function first(predicate, defaultValue) {\n    var hasDefaultValue = arguments.length >= 2;\n    return function (source) { return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); })); };\n}\n//# sourceMappingURL=first.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function ignoreElements() {\n    return function ignoreElementsOperatorFunction(source) {\n        return source.lift(new IgnoreElementsOperator());\n    };\n}\nvar IgnoreElementsOperator = (function () {\n    function IgnoreElementsOperator() {\n    }\n    IgnoreElementsOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new IgnoreElementsSubscriber(subscriber));\n    };\n    return IgnoreElementsOperator;\n}());\nvar IgnoreElementsSubscriber = (function (_super) {\n    tslib_1.__extends(IgnoreElementsSubscriber, _super);\n    function IgnoreElementsSubscriber() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    IgnoreElementsSubscriber.prototype._next = function (unused) {\n    };\n    return IgnoreElementsSubscriber;\n}(Subscriber));\n//# sourceMappingURL=ignoreElements.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function isEmpty() {\n    return function (source) { return source.lift(new IsEmptyOperator()); };\n}\nvar IsEmptyOperator = (function () {\n    function IsEmptyOperator() {\n    }\n    IsEmptyOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new IsEmptySubscriber(observer));\n    };\n    return IsEmptyOperator;\n}());\nvar IsEmptySubscriber = (function (_super) {\n    tslib_1.__extends(IsEmptySubscriber, _super);\n    function IsEmptySubscriber(destination) {\n        return _super.call(this, destination) || this;\n    }\n    IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) {\n        var destination = this.destination;\n        destination.next(isEmpty);\n        destination.complete();\n    };\n    IsEmptySubscriber.prototype._next = function (value) {\n        this.notifyComplete(false);\n    };\n    IsEmptySubscriber.prototype._complete = function () {\n        this.notifyComplete(true);\n    };\n    return IsEmptySubscriber;\n}(Subscriber));\n//# sourceMappingURL=isEmpty.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';\nimport { empty } from '../observable/empty';\nexport function takeLast(count) {\n    return function takeLastOperatorFunction(source) {\n        if (count === 0) {\n            return empty();\n        }\n        else {\n            return source.lift(new TakeLastOperator(count));\n        }\n    };\n}\nvar TakeLastOperator = (function () {\n    function TakeLastOperator(total) {\n        this.total = total;\n        if (this.total < 0) {\n            throw new ArgumentOutOfRangeError;\n        }\n    }\n    TakeLastOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeLastSubscriber(subscriber, this.total));\n    };\n    return TakeLastOperator;\n}());\nvar TakeLastSubscriber = (function (_super) {\n    tslib_1.__extends(TakeLastSubscriber, _super);\n    function TakeLastSubscriber(destination, total) {\n        var _this = _super.call(this, destination) || this;\n        _this.total = total;\n        _this.ring = new Array();\n        _this.count = 0;\n        return _this;\n    }\n    TakeLastSubscriber.prototype._next = function (value) {\n        var ring = this.ring;\n        var total = this.total;\n        var count = this.count++;\n        if (ring.length < total) {\n            ring.push(value);\n        }\n        else {\n            var index = count % total;\n            ring[index] = value;\n        }\n    };\n    TakeLastSubscriber.prototype._complete = function () {\n        var destination = this.destination;\n        var count = this.count;\n        if (count > 0) {\n            var total = this.count >= this.total ? this.total : this.count;\n            var ring = this.ring;\n            for (var i = 0; i < total; i++) {\n                var idx = (count++) % total;\n                destination.next(ring[idx]);\n            }\n        }\n        destination.complete();\n    };\n    return TakeLastSubscriber;\n}(Subscriber));\n//# sourceMappingURL=takeLast.js.map","import { EmptyError } from '../util/EmptyError';\nimport { filter } from './filter';\nimport { takeLast } from './takeLast';\nimport { throwIfEmpty } from './throwIfEmpty';\nimport { defaultIfEmpty } from './defaultIfEmpty';\nimport { identity } from '../util/identity';\nexport function last(predicate, defaultValue) {\n    var hasDefaultValue = arguments.length >= 2;\n    return function (source) { return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, takeLast(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); })); };\n}\n//# sourceMappingURL=last.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function mapTo(value) {\n    return function (source) { return source.lift(new MapToOperator(value)); };\n}\nvar MapToOperator = (function () {\n    function MapToOperator(value) {\n        this.value = value;\n    }\n    MapToOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new MapToSubscriber(subscriber, this.value));\n    };\n    return MapToOperator;\n}());\nvar MapToSubscriber = (function (_super) {\n    tslib_1.__extends(MapToSubscriber, _super);\n    function MapToSubscriber(destination, value) {\n        var _this = _super.call(this, destination) || this;\n        _this.value = value;\n        return _this;\n    }\n    MapToSubscriber.prototype._next = function (x) {\n        this.destination.next(this.value);\n    };\n    return MapToSubscriber;\n}(Subscriber));\n//# sourceMappingURL=mapTo.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { Notification } from '../Notification';\nexport function materialize() {\n    return function materializeOperatorFunction(source) {\n        return source.lift(new MaterializeOperator());\n    };\n}\nvar MaterializeOperator = (function () {\n    function MaterializeOperator() {\n    }\n    MaterializeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new MaterializeSubscriber(subscriber));\n    };\n    return MaterializeOperator;\n}());\nvar MaterializeSubscriber = (function (_super) {\n    tslib_1.__extends(MaterializeSubscriber, _super);\n    function MaterializeSubscriber(destination) {\n        return _super.call(this, destination) || this;\n    }\n    MaterializeSubscriber.prototype._next = function (value) {\n        this.destination.next(Notification.createNext(value));\n    };\n    MaterializeSubscriber.prototype._error = function (err) {\n        var destination = this.destination;\n        destination.next(Notification.createError(err));\n        destination.complete();\n    };\n    MaterializeSubscriber.prototype._complete = function () {\n        var destination = this.destination;\n        destination.next(Notification.createComplete());\n        destination.complete();\n    };\n    return MaterializeSubscriber;\n}(Subscriber));\n//# sourceMappingURL=materialize.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function scan(accumulator, seed) {\n    var hasSeed = false;\n    if (arguments.length >= 2) {\n        hasSeed = true;\n    }\n    return function scanOperatorFunction(source) {\n        return source.lift(new ScanOperator(accumulator, seed, hasSeed));\n    };\n}\nvar ScanOperator = (function () {\n    function ScanOperator(accumulator, seed, hasSeed) {\n        if (hasSeed === void 0) { hasSeed = false; }\n        this.accumulator = accumulator;\n        this.seed = seed;\n        this.hasSeed = hasSeed;\n    }\n    ScanOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));\n    };\n    return ScanOperator;\n}());\nvar ScanSubscriber = (function (_super) {\n    tslib_1.__extends(ScanSubscriber, _super);\n    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {\n        var _this = _super.call(this, destination) || this;\n        _this.accumulator = accumulator;\n        _this._seed = _seed;\n        _this.hasSeed = hasSeed;\n        _this.index = 0;\n        return _this;\n    }\n    Object.defineProperty(ScanSubscriber.prototype, \"seed\", {\n        get: function () {\n            return this._seed;\n        },\n        set: function (value) {\n            this.hasSeed = true;\n            this._seed = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ScanSubscriber.prototype._next = function (value) {\n        if (!this.hasSeed) {\n            this.seed = value;\n            this.destination.next(value);\n        }\n        else {\n            return this._tryNext(value);\n        }\n    };\n    ScanSubscriber.prototype._tryNext = function (value) {\n        var index = this.index++;\n        var result;\n        try {\n            result = this.accumulator(this.seed, value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n        this.seed = result;\n        this.destination.next(result);\n    };\n    return ScanSubscriber;\n}(Subscriber));\n//# sourceMappingURL=scan.js.map","import { scan } from './scan';\nimport { takeLast } from './takeLast';\nimport { defaultIfEmpty } from './defaultIfEmpty';\nimport { pipe } from '../util/pipe';\nexport function reduce(accumulator, seed) {\n    if (arguments.length >= 2) {\n        return function reduceOperatorFunctionWithSeed(source) {\n            return pipe(scan(accumulator, seed), takeLast(1), defaultIfEmpty(seed))(source);\n        };\n    }\n    return function reduceOperatorFunction(source) {\n        return pipe(scan(function (acc, value, index) { return accumulator(acc, value, index + 1); }), takeLast(1))(source);\n    };\n}\n//# sourceMappingURL=reduce.js.map","import { reduce } from './reduce';\nexport function max(comparer) {\n    var max = (typeof comparer === 'function')\n        ? function (x, y) { return comparer(x, y) > 0 ? x : y; }\n        : function (x, y) { return x > y ? x : y; };\n    return reduce(max);\n}\n//# sourceMappingURL=max.js.map","import { merge as mergeStatic } from '../observable/merge';\nexport function merge() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    return function (source) { return source.lift.call(mergeStatic.apply(void 0, [source].concat(observables))); };\n}\n//# sourceMappingURL=merge.js.map","import { mergeMap } from './mergeMap';\nexport function mergeMapTo(innerObservable, resultSelector, concurrent) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    if (typeof resultSelector === 'function') {\n        return mergeMap(function () { return innerObservable; }, resultSelector, concurrent);\n    }\n    if (typeof resultSelector === 'number') {\n        concurrent = resultSelector;\n    }\n    return mergeMap(function () { return innerObservable; }, concurrent);\n}\n//# sourceMappingURL=mergeMapTo.js.map","import * as tslib_1 from \"tslib\";\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nexport function mergeScan(accumulator, seed, concurrent) {\n    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }\n    return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); };\n}\nvar MergeScanOperator = (function () {\n    function MergeScanOperator(accumulator, seed, concurrent) {\n        this.accumulator = accumulator;\n        this.seed = seed;\n        this.concurrent = concurrent;\n    }\n    MergeScanOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));\n    };\n    return MergeScanOperator;\n}());\nexport { MergeScanOperator };\nvar MergeScanSubscriber = (function (_super) {\n    tslib_1.__extends(MergeScanSubscriber, _super);\n    function MergeScanSubscriber(destination, accumulator, acc, concurrent) {\n        var _this = _super.call(this, destination) || this;\n        _this.accumulator = accumulator;\n        _this.acc = acc;\n        _this.concurrent = concurrent;\n        _this.hasValue = false;\n        _this.hasCompleted = false;\n        _this.buffer = [];\n        _this.active = 0;\n        _this.index = 0;\n        return _this;\n    }\n    MergeScanSubscriber.prototype._next = function (value) {\n        if (this.active < this.concurrent) {\n            var index = this.index++;\n            var destination = this.destination;\n            var ish = void 0;\n            try {\n                var accumulator = this.accumulator;\n                ish = accumulator(this.acc, value, index);\n            }\n            catch (e) {\n                return destination.error(e);\n            }\n            this.active++;\n            this._innerSub(ish, value, index);\n        }\n        else {\n            this.buffer.push(value);\n        }\n    };\n    MergeScanSubscriber.prototype._innerSub = function (ish, value, index) {\n        var innerSubscriber = new InnerSubscriber(this, value, index);\n        var destination = this.destination;\n        destination.add(innerSubscriber);\n        var innerSubscription = subscribeToResult(this, ish, undefined, undefined, innerSubscriber);\n        if (innerSubscription !== innerSubscriber) {\n            destination.add(innerSubscription);\n        }\n    };\n    MergeScanSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.active === 0 && this.buffer.length === 0) {\n            if (this.hasValue === false) {\n                this.destination.next(this.acc);\n            }\n            this.destination.complete();\n        }\n        this.unsubscribe();\n    };\n    MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var destination = this.destination;\n        this.acc = innerValue;\n        this.hasValue = true;\n        destination.next(innerValue);\n    };\n    MergeScanSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        var destination = this.destination;\n        destination.remove(innerSub);\n        this.active--;\n        if (buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        else if (this.active === 0 && this.hasCompleted) {\n            if (this.hasValue === false) {\n                this.destination.next(this.acc);\n            }\n            this.destination.complete();\n        }\n    };\n    return MergeScanSubscriber;\n}(OuterSubscriber));\nexport { MergeScanSubscriber };\n//# sourceMappingURL=mergeScan.js.map","import { reduce } from './reduce';\nexport function min(comparer) {\n    var min = (typeof comparer === 'function')\n        ? function (x, y) { return comparer(x, y) < 0 ? x : y; }\n        : function (x, y) { return x < y ? x : y; };\n    return reduce(min);\n}\n//# sourceMappingURL=min.js.map","import { connectableObservableDescriptor } from '../observable/ConnectableObservable';\nexport function multicast(subjectOrSubjectFactory, selector) {\n    return function multicastOperatorFunction(source) {\n        var subjectFactory;\n        if (typeof subjectOrSubjectFactory === 'function') {\n            subjectFactory = subjectOrSubjectFactory;\n        }\n        else {\n            subjectFactory = function subjectFactory() {\n                return subjectOrSubjectFactory;\n            };\n        }\n        if (typeof selector === 'function') {\n            return source.lift(new MulticastOperator(subjectFactory, selector));\n        }\n        var connectable = Object.create(source, connectableObservableDescriptor);\n        connectable.source = source;\n        connectable.subjectFactory = subjectFactory;\n        return connectable;\n    };\n}\nvar MulticastOperator = (function () {\n    function MulticastOperator(subjectFactory, selector) {\n        this.subjectFactory = subjectFactory;\n        this.selector = selector;\n    }\n    MulticastOperator.prototype.call = function (subscriber, source) {\n        var selector = this.selector;\n        var subject = this.subjectFactory();\n        var subscription = selector(subject).subscribe(subscriber);\n        subscription.add(source.subscribe(subject));\n        return subscription;\n    };\n    return MulticastOperator;\n}());\nexport { MulticastOperator };\n//# sourceMappingURL=multicast.js.map","import * as tslib_1 from \"tslib\";\nimport { from } from '../observable/from';\nimport { isArray } from '../util/isArray';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function onErrorResumeNext() {\n    var nextSources = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        nextSources[_i] = arguments[_i];\n    }\n    if (nextSources.length === 1 && isArray(nextSources[0])) {\n        nextSources = nextSources[0];\n    }\n    return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); };\n}\nexport function onErrorResumeNextStatic() {\n    var nextSources = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        nextSources[_i] = arguments[_i];\n    }\n    var source = null;\n    if (nextSources.length === 1 && isArray(nextSources[0])) {\n        nextSources = nextSources[0];\n    }\n    source = nextSources.shift();\n    return from(source, null).lift(new OnErrorResumeNextOperator(nextSources));\n}\nvar OnErrorResumeNextOperator = (function () {\n    function OnErrorResumeNextOperator(nextSources) {\n        this.nextSources = nextSources;\n    }\n    OnErrorResumeNextOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));\n    };\n    return OnErrorResumeNextOperator;\n}());\nvar OnErrorResumeNextSubscriber = (function (_super) {\n    tslib_1.__extends(OnErrorResumeNextSubscriber, _super);\n    function OnErrorResumeNextSubscriber(destination, nextSources) {\n        var _this = _super.call(this, destination) || this;\n        _this.destination = destination;\n        _this.nextSources = nextSources;\n        return _this;\n    }\n    OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) {\n        this.subscribeToNextSource();\n    };\n    OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.subscribeToNextSource();\n    };\n    OnErrorResumeNextSubscriber.prototype._error = function (err) {\n        this.subscribeToNextSource();\n        this.unsubscribe();\n    };\n    OnErrorResumeNextSubscriber.prototype._complete = function () {\n        this.subscribeToNextSource();\n        this.unsubscribe();\n    };\n    OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () {\n        var next = this.nextSources.shift();\n        if (!!next) {\n            var innerSubscriber = new InnerSubscriber(this, undefined, undefined);\n            var destination = this.destination;\n            destination.add(innerSubscriber);\n            var innerSubscription = subscribeToResult(this, next, undefined, undefined, innerSubscriber);\n            if (innerSubscription !== innerSubscriber) {\n                destination.add(innerSubscription);\n            }\n        }\n        else {\n            this.destination.complete();\n        }\n    };\n    return OnErrorResumeNextSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=onErrorResumeNext.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function pairwise() {\n    return function (source) { return source.lift(new PairwiseOperator()); };\n}\nvar PairwiseOperator = (function () {\n    function PairwiseOperator() {\n    }\n    PairwiseOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new PairwiseSubscriber(subscriber));\n    };\n    return PairwiseOperator;\n}());\nvar PairwiseSubscriber = (function (_super) {\n    tslib_1.__extends(PairwiseSubscriber, _super);\n    function PairwiseSubscriber(destination) {\n        var _this = _super.call(this, destination) || this;\n        _this.hasPrev = false;\n        return _this;\n    }\n    PairwiseSubscriber.prototype._next = function (value) {\n        var pair;\n        if (this.hasPrev) {\n            pair = [this.prev, value];\n        }\n        else {\n            this.hasPrev = true;\n        }\n        this.prev = value;\n        if (pair) {\n            this.destination.next(pair);\n        }\n    };\n    return PairwiseSubscriber;\n}(Subscriber));\n//# sourceMappingURL=pairwise.js.map","import { not } from '../util/not';\nimport { filter } from './filter';\nexport function partition(predicate, thisArg) {\n    return function (source) { return [\n        filter(predicate, thisArg)(source),\n        filter(not(predicate, thisArg))(source)\n    ]; };\n}\n//# sourceMappingURL=partition.js.map","import { map } from './map';\nexport function pluck() {\n    var properties = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        properties[_i] = arguments[_i];\n    }\n    var length = properties.length;\n    if (length === 0) {\n        throw new Error('list of properties cannot be empty.');\n    }\n    return function (source) { return map(plucker(properties, length))(source); };\n}\nfunction plucker(props, length) {\n    var mapper = function (x) {\n        var currentProp = x;\n        for (var i = 0; i < length; i++) {\n            var p = currentProp[props[i]];\n            if (typeof p !== 'undefined') {\n                currentProp = p;\n            }\n            else {\n                return undefined;\n            }\n        }\n        return currentProp;\n    };\n    return mapper;\n}\n//# sourceMappingURL=pluck.js.map","import { Subject } from '../Subject';\nimport { multicast } from './multicast';\nexport function publish(selector) {\n    return selector ?\n        multicast(function () { return new Subject(); }, selector) :\n        multicast(new Subject());\n}\n//# sourceMappingURL=publish.js.map","import { BehaviorSubject } from '../BehaviorSubject';\nimport { multicast } from './multicast';\nexport function publishBehavior(value) {\n    return function (source) { return multicast(new BehaviorSubject(value))(source); };\n}\n//# sourceMappingURL=publishBehavior.js.map","import { AsyncSubject } from '../AsyncSubject';\nimport { multicast } from './multicast';\nexport function publishLast() {\n    return function (source) { return multicast(new AsyncSubject())(source); };\n}\n//# sourceMappingURL=publishLast.js.map","import { ReplaySubject } from '../ReplaySubject';\nimport { multicast } from './multicast';\nexport function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {\n    if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {\n        scheduler = selectorOrScheduler;\n    }\n    var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;\n    var subject = new ReplaySubject(bufferSize, windowTime, scheduler);\n    return function (source) { return multicast(function () { return subject; }, selector)(source); };\n}\n//# sourceMappingURL=publishReplay.js.map","import { isArray } from '../util/isArray';\nimport { race as raceStatic } from '../observable/race';\nexport function race() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    return function raceOperatorFunction(source) {\n        if (observables.length === 1 && isArray(observables[0])) {\n            observables = observables[0];\n        }\n        return source.lift.call(raceStatic.apply(void 0, [source].concat(observables)));\n    };\n}\n//# sourceMappingURL=race.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { empty } from '../observable/empty';\nexport function repeat(count) {\n    if (count === void 0) { count = -1; }\n    return function (source) {\n        if (count === 0) {\n            return empty();\n        }\n        else if (count < 0) {\n            return source.lift(new RepeatOperator(-1, source));\n        }\n        else {\n            return source.lift(new RepeatOperator(count - 1, source));\n        }\n    };\n}\nvar RepeatOperator = (function () {\n    function RepeatOperator(count, source) {\n        this.count = count;\n        this.source = source;\n    }\n    RepeatOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));\n    };\n    return RepeatOperator;\n}());\nvar RepeatSubscriber = (function (_super) {\n    tslib_1.__extends(RepeatSubscriber, _super);\n    function RepeatSubscriber(destination, count, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.count = count;\n        _this.source = source;\n        return _this;\n    }\n    RepeatSubscriber.prototype.complete = function () {\n        if (!this.isStopped) {\n            var _a = this, source = _a.source, count = _a.count;\n            if (count === 0) {\n                return _super.prototype.complete.call(this);\n            }\n            else if (count > -1) {\n                this.count = count - 1;\n            }\n            source.subscribe(this._unsubscribeAndRecycle());\n        }\n    };\n    return RepeatSubscriber;\n}(Subscriber));\n//# sourceMappingURL=repeat.js.map","import * as tslib_1 from \"tslib\";\nimport { Subject } from '../Subject';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function repeatWhen(notifier) {\n    return function (source) { return source.lift(new RepeatWhenOperator(notifier)); };\n}\nvar RepeatWhenOperator = (function () {\n    function RepeatWhenOperator(notifier) {\n        this.notifier = notifier;\n    }\n    RepeatWhenOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));\n    };\n    return RepeatWhenOperator;\n}());\nvar RepeatWhenSubscriber = (function (_super) {\n    tslib_1.__extends(RepeatWhenSubscriber, _super);\n    function RepeatWhenSubscriber(destination, notifier, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.notifier = notifier;\n        _this.source = source;\n        _this.sourceIsBeingSubscribedTo = true;\n        return _this;\n    }\n    RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.sourceIsBeingSubscribedTo = true;\n        this.source.subscribe(this);\n    };\n    RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) {\n        if (this.sourceIsBeingSubscribedTo === false) {\n            return _super.prototype.complete.call(this);\n        }\n    };\n    RepeatWhenSubscriber.prototype.complete = function () {\n        this.sourceIsBeingSubscribedTo = false;\n        if (!this.isStopped) {\n            if (!this.retries) {\n                this.subscribeToRetries();\n            }\n            if (!this.retriesSubscription || this.retriesSubscription.closed) {\n                return _super.prototype.complete.call(this);\n            }\n            this._unsubscribeAndRecycle();\n            this.notifications.next();\n        }\n    };\n    RepeatWhenSubscriber.prototype._unsubscribe = function () {\n        var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription;\n        if (notifications) {\n            notifications.unsubscribe();\n            this.notifications = null;\n        }\n        if (retriesSubscription) {\n            retriesSubscription.unsubscribe();\n            this.retriesSubscription = null;\n        }\n        this.retries = null;\n    };\n    RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () {\n        var _unsubscribe = this._unsubscribe;\n        this._unsubscribe = null;\n        _super.prototype._unsubscribeAndRecycle.call(this);\n        this._unsubscribe = _unsubscribe;\n        return this;\n    };\n    RepeatWhenSubscriber.prototype.subscribeToRetries = function () {\n        this.notifications = new Subject();\n        var retries;\n        try {\n            var notifier = this.notifier;\n            retries = notifier(this.notifications);\n        }\n        catch (e) {\n            return _super.prototype.complete.call(this);\n        }\n        this.retries = retries;\n        this.retriesSubscription = subscribeToResult(this, retries);\n    };\n    return RepeatWhenSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=repeatWhen.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function retry(count) {\n    if (count === void 0) { count = -1; }\n    return function (source) { return source.lift(new RetryOperator(count, source)); };\n}\nvar RetryOperator = (function () {\n    function RetryOperator(count, source) {\n        this.count = count;\n        this.source = source;\n    }\n    RetryOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));\n    };\n    return RetryOperator;\n}());\nvar RetrySubscriber = (function (_super) {\n    tslib_1.__extends(RetrySubscriber, _super);\n    function RetrySubscriber(destination, count, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.count = count;\n        _this.source = source;\n        return _this;\n    }\n    RetrySubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var _a = this, source = _a.source, count = _a.count;\n            if (count === 0) {\n                return _super.prototype.error.call(this, err);\n            }\n            else if (count > -1) {\n                this.count = count - 1;\n            }\n            source.subscribe(this._unsubscribeAndRecycle());\n        }\n    };\n    return RetrySubscriber;\n}(Subscriber));\n//# sourceMappingURL=retry.js.map","import * as tslib_1 from \"tslib\";\nimport { Subject } from '../Subject';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function retryWhen(notifier) {\n    return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); };\n}\nvar RetryWhenOperator = (function () {\n    function RetryWhenOperator(notifier, source) {\n        this.notifier = notifier;\n        this.source = source;\n    }\n    RetryWhenOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));\n    };\n    return RetryWhenOperator;\n}());\nvar RetryWhenSubscriber = (function (_super) {\n    tslib_1.__extends(RetryWhenSubscriber, _super);\n    function RetryWhenSubscriber(destination, notifier, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.notifier = notifier;\n        _this.source = source;\n        return _this;\n    }\n    RetryWhenSubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var errors = this.errors;\n            var retries = this.retries;\n            var retriesSubscription = this.retriesSubscription;\n            if (!retries) {\n                errors = new Subject();\n                try {\n                    var notifier = this.notifier;\n                    retries = notifier(errors);\n                }\n                catch (e) {\n                    return _super.prototype.error.call(this, e);\n                }\n                retriesSubscription = subscribeToResult(this, retries);\n            }\n            else {\n                this.errors = null;\n                this.retriesSubscription = null;\n            }\n            this._unsubscribeAndRecycle();\n            this.errors = errors;\n            this.retries = retries;\n            this.retriesSubscription = retriesSubscription;\n            errors.next(err);\n        }\n    };\n    RetryWhenSubscriber.prototype._unsubscribe = function () {\n        var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription;\n        if (errors) {\n            errors.unsubscribe();\n            this.errors = null;\n        }\n        if (retriesSubscription) {\n            retriesSubscription.unsubscribe();\n            this.retriesSubscription = null;\n        }\n        this.retries = null;\n    };\n    RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var _unsubscribe = this._unsubscribe;\n        this._unsubscribe = null;\n        this._unsubscribeAndRecycle();\n        this._unsubscribe = _unsubscribe;\n        this.source.subscribe(this);\n    };\n    return RetryWhenSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=retryWhen.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function sample(notifier) {\n    return function (source) { return source.lift(new SampleOperator(notifier)); };\n}\nvar SampleOperator = (function () {\n    function SampleOperator(notifier) {\n        this.notifier = notifier;\n    }\n    SampleOperator.prototype.call = function (subscriber, source) {\n        var sampleSubscriber = new SampleSubscriber(subscriber);\n        var subscription = source.subscribe(sampleSubscriber);\n        subscription.add(subscribeToResult(sampleSubscriber, this.notifier));\n        return subscription;\n    };\n    return SampleOperator;\n}());\nvar SampleSubscriber = (function (_super) {\n    tslib_1.__extends(SampleSubscriber, _super);\n    function SampleSubscriber() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.hasValue = false;\n        return _this;\n    }\n    SampleSubscriber.prototype._next = function (value) {\n        this.value = value;\n        this.hasValue = true;\n    };\n    SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.emitValue();\n    };\n    SampleSubscriber.prototype.notifyComplete = function () {\n        this.emitValue();\n    };\n    SampleSubscriber.prototype.emitValue = function () {\n        if (this.hasValue) {\n            this.hasValue = false;\n            this.destination.next(this.value);\n        }\n    };\n    return SampleSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=sample.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { async } from '../scheduler/async';\nexport function sampleTime(period, scheduler) {\n    if (scheduler === void 0) { scheduler = async; }\n    return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); };\n}\nvar SampleTimeOperator = (function () {\n    function SampleTimeOperator(period, scheduler) {\n        this.period = period;\n        this.scheduler = scheduler;\n    }\n    SampleTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));\n    };\n    return SampleTimeOperator;\n}());\nvar SampleTimeSubscriber = (function (_super) {\n    tslib_1.__extends(SampleTimeSubscriber, _super);\n    function SampleTimeSubscriber(destination, period, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.period = period;\n        _this.scheduler = scheduler;\n        _this.hasValue = false;\n        _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period }));\n        return _this;\n    }\n    SampleTimeSubscriber.prototype._next = function (value) {\n        this.lastValue = value;\n        this.hasValue = true;\n    };\n    SampleTimeSubscriber.prototype.notifyNext = function () {\n        if (this.hasValue) {\n            this.hasValue = false;\n            this.destination.next(this.lastValue);\n        }\n    };\n    return SampleTimeSubscriber;\n}(Subscriber));\nfunction dispatchNotification(state) {\n    var subscriber = state.subscriber, period = state.period;\n    subscriber.notifyNext();\n    this.schedule(state, period);\n}\n//# sourceMappingURL=sampleTime.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function sequenceEqual(compareTo, comparator) {\n    return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); };\n}\nvar SequenceEqualOperator = (function () {\n    function SequenceEqualOperator(compareTo, comparator) {\n        this.compareTo = compareTo;\n        this.comparator = comparator;\n    }\n    SequenceEqualOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator));\n    };\n    return SequenceEqualOperator;\n}());\nexport { SequenceEqualOperator };\nvar SequenceEqualSubscriber = (function (_super) {\n    tslib_1.__extends(SequenceEqualSubscriber, _super);\n    function SequenceEqualSubscriber(destination, compareTo, comparator) {\n        var _this = _super.call(this, destination) || this;\n        _this.compareTo = compareTo;\n        _this.comparator = comparator;\n        _this._a = [];\n        _this._b = [];\n        _this._oneComplete = false;\n        _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this)));\n        return _this;\n    }\n    SequenceEqualSubscriber.prototype._next = function (value) {\n        if (this._oneComplete && this._b.length === 0) {\n            this.emit(false);\n        }\n        else {\n            this._a.push(value);\n            this.checkValues();\n        }\n    };\n    SequenceEqualSubscriber.prototype._complete = function () {\n        if (this._oneComplete) {\n            this.emit(this._a.length === 0 && this._b.length === 0);\n        }\n        else {\n            this._oneComplete = true;\n        }\n        this.unsubscribe();\n    };\n    SequenceEqualSubscriber.prototype.checkValues = function () {\n        var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator;\n        while (_a.length > 0 && _b.length > 0) {\n            var a = _a.shift();\n            var b = _b.shift();\n            var areEqual = false;\n            try {\n                areEqual = comparator ? comparator(a, b) : a === b;\n            }\n            catch (e) {\n                this.destination.error(e);\n            }\n            if (!areEqual) {\n                this.emit(false);\n            }\n        }\n    };\n    SequenceEqualSubscriber.prototype.emit = function (value) {\n        var destination = this.destination;\n        destination.next(value);\n        destination.complete();\n    };\n    SequenceEqualSubscriber.prototype.nextB = function (value) {\n        if (this._oneComplete && this._a.length === 0) {\n            this.emit(false);\n        }\n        else {\n            this._b.push(value);\n            this.checkValues();\n        }\n    };\n    SequenceEqualSubscriber.prototype.completeB = function () {\n        if (this._oneComplete) {\n            this.emit(this._a.length === 0 && this._b.length === 0);\n        }\n        else {\n            this._oneComplete = true;\n        }\n    };\n    return SequenceEqualSubscriber;\n}(Subscriber));\nexport { SequenceEqualSubscriber };\nvar SequenceEqualCompareToSubscriber = (function (_super) {\n    tslib_1.__extends(SequenceEqualCompareToSubscriber, _super);\n    function SequenceEqualCompareToSubscriber(destination, parent) {\n        var _this = _super.call(this, destination) || this;\n        _this.parent = parent;\n        return _this;\n    }\n    SequenceEqualCompareToSubscriber.prototype._next = function (value) {\n        this.parent.nextB(value);\n    };\n    SequenceEqualCompareToSubscriber.prototype._error = function (err) {\n        this.parent.error(err);\n        this.unsubscribe();\n    };\n    SequenceEqualCompareToSubscriber.prototype._complete = function () {\n        this.parent.completeB();\n        this.unsubscribe();\n    };\n    return SequenceEqualCompareToSubscriber;\n}(Subscriber));\n//# sourceMappingURL=sequenceEqual.js.map","import { multicast } from './multicast';\nimport { refCount } from './refCount';\nimport { Subject } from '../Subject';\nfunction shareSubjectFactory() {\n    return new Subject();\n}\nexport function share() {\n    return function (source) { return refCount()(multicast(shareSubjectFactory)(source)); };\n}\n//# sourceMappingURL=share.js.map","import { ReplaySubject } from '../ReplaySubject';\nexport function shareReplay(configOrBufferSize, windowTime, scheduler) {\n    var config;\n    if (configOrBufferSize && typeof configOrBufferSize === 'object') {\n        config = configOrBufferSize;\n    }\n    else {\n        config = {\n            bufferSize: configOrBufferSize,\n            windowTime: windowTime,\n            refCount: false,\n            scheduler: scheduler\n        };\n    }\n    return function (source) { return source.lift(shareReplayOperator(config)); };\n}\nfunction shareReplayOperator(_a) {\n    var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler;\n    var subject;\n    var refCount = 0;\n    var subscription;\n    var hasError = false;\n    var isComplete = false;\n    return function shareReplayOperation(source) {\n        refCount++;\n        if (!subject || hasError) {\n            hasError = false;\n            subject = new ReplaySubject(bufferSize, windowTime, scheduler);\n            subscription = source.subscribe({\n                next: function (value) { subject.next(value); },\n                error: function (err) {\n                    hasError = true;\n                    subject.error(err);\n                },\n                complete: function () {\n                    isComplete = true;\n                    subscription = undefined;\n                    subject.complete();\n                },\n            });\n        }\n        var innerSub = subject.subscribe(this);\n        this.add(function () {\n            refCount--;\n            innerSub.unsubscribe();\n            if (subscription && !isComplete && useRefCount && refCount === 0) {\n                subscription.unsubscribe();\n                subscription = undefined;\n                subject = undefined;\n            }\n        });\n    };\n}\n//# sourceMappingURL=shareReplay.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { EmptyError } from '../util/EmptyError';\nexport function single(predicate) {\n    return function (source) { return source.lift(new SingleOperator(predicate, source)); };\n}\nvar SingleOperator = (function () {\n    function SingleOperator(predicate, source) {\n        this.predicate = predicate;\n        this.source = source;\n    }\n    SingleOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));\n    };\n    return SingleOperator;\n}());\nvar SingleSubscriber = (function (_super) {\n    tslib_1.__extends(SingleSubscriber, _super);\n    function SingleSubscriber(destination, predicate, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.source = source;\n        _this.seenValue = false;\n        _this.index = 0;\n        return _this;\n    }\n    SingleSubscriber.prototype.applySingleValue = function (value) {\n        if (this.seenValue) {\n            this.destination.error('Sequence contains more than one element');\n        }\n        else {\n            this.seenValue = true;\n            this.singleValue = value;\n        }\n    };\n    SingleSubscriber.prototype._next = function (value) {\n        var index = this.index++;\n        if (this.predicate) {\n            this.tryNext(value, index);\n        }\n        else {\n            this.applySingleValue(value);\n        }\n    };\n    SingleSubscriber.prototype.tryNext = function (value, index) {\n        try {\n            if (this.predicate(value, index, this.source)) {\n                this.applySingleValue(value);\n            }\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    SingleSubscriber.prototype._complete = function () {\n        var destination = this.destination;\n        if (this.index > 0) {\n            destination.next(this.seenValue ? this.singleValue : undefined);\n            destination.complete();\n        }\n        else {\n            destination.error(new EmptyError);\n        }\n    };\n    return SingleSubscriber;\n}(Subscriber));\n//# sourceMappingURL=single.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function skip(count) {\n    return function (source) { return source.lift(new SkipOperator(count)); };\n}\nvar SkipOperator = (function () {\n    function SkipOperator(total) {\n        this.total = total;\n    }\n    SkipOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SkipSubscriber(subscriber, this.total));\n    };\n    return SkipOperator;\n}());\nvar SkipSubscriber = (function (_super) {\n    tslib_1.__extends(SkipSubscriber, _super);\n    function SkipSubscriber(destination, total) {\n        var _this = _super.call(this, destination) || this;\n        _this.total = total;\n        _this.count = 0;\n        return _this;\n    }\n    SkipSubscriber.prototype._next = function (x) {\n        if (++this.count > this.total) {\n            this.destination.next(x);\n        }\n    };\n    return SkipSubscriber;\n}(Subscriber));\n//# sourceMappingURL=skip.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';\nexport function skipLast(count) {\n    return function (source) { return source.lift(new SkipLastOperator(count)); };\n}\nvar SkipLastOperator = (function () {\n    function SkipLastOperator(_skipCount) {\n        this._skipCount = _skipCount;\n        if (this._skipCount < 0) {\n            throw new ArgumentOutOfRangeError;\n        }\n    }\n    SkipLastOperator.prototype.call = function (subscriber, source) {\n        if (this._skipCount === 0) {\n            return source.subscribe(new Subscriber(subscriber));\n        }\n        else {\n            return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount));\n        }\n    };\n    return SkipLastOperator;\n}());\nvar SkipLastSubscriber = (function (_super) {\n    tslib_1.__extends(SkipLastSubscriber, _super);\n    function SkipLastSubscriber(destination, _skipCount) {\n        var _this = _super.call(this, destination) || this;\n        _this._skipCount = _skipCount;\n        _this._count = 0;\n        _this._ring = new Array(_skipCount);\n        return _this;\n    }\n    SkipLastSubscriber.prototype._next = function (value) {\n        var skipCount = this._skipCount;\n        var count = this._count++;\n        if (count < skipCount) {\n            this._ring[count] = value;\n        }\n        else {\n            var currentIndex = count % skipCount;\n            var ring = this._ring;\n            var oldValue = ring[currentIndex];\n            ring[currentIndex] = value;\n            this.destination.next(oldValue);\n        }\n    };\n    return SkipLastSubscriber;\n}(Subscriber));\n//# sourceMappingURL=skipLast.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function skipUntil(notifier) {\n    return function (source) { return source.lift(new SkipUntilOperator(notifier)); };\n}\nvar SkipUntilOperator = (function () {\n    function SkipUntilOperator(notifier) {\n        this.notifier = notifier;\n    }\n    SkipUntilOperator.prototype.call = function (destination, source) {\n        return source.subscribe(new SkipUntilSubscriber(destination, this.notifier));\n    };\n    return SkipUntilOperator;\n}());\nvar SkipUntilSubscriber = (function (_super) {\n    tslib_1.__extends(SkipUntilSubscriber, _super);\n    function SkipUntilSubscriber(destination, notifier) {\n        var _this = _super.call(this, destination) || this;\n        _this.hasValue = false;\n        var innerSubscriber = new InnerSubscriber(_this, undefined, undefined);\n        _this.add(innerSubscriber);\n        _this.innerSubscription = innerSubscriber;\n        var innerSubscription = subscribeToResult(_this, notifier, undefined, undefined, innerSubscriber);\n        if (innerSubscription !== innerSubscriber) {\n            _this.add(innerSubscription);\n            _this.innerSubscription = innerSubscription;\n        }\n        return _this;\n    }\n    SkipUntilSubscriber.prototype._next = function (value) {\n        if (this.hasValue) {\n            _super.prototype._next.call(this, value);\n        }\n    };\n    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.hasValue = true;\n        if (this.innerSubscription) {\n            this.innerSubscription.unsubscribe();\n        }\n    };\n    SkipUntilSubscriber.prototype.notifyComplete = function () {\n    };\n    return SkipUntilSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=skipUntil.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function skipWhile(predicate) {\n    return function (source) { return source.lift(new SkipWhileOperator(predicate)); };\n}\nvar SkipWhileOperator = (function () {\n    function SkipWhileOperator(predicate) {\n        this.predicate = predicate;\n    }\n    SkipWhileOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));\n    };\n    return SkipWhileOperator;\n}());\nvar SkipWhileSubscriber = (function (_super) {\n    tslib_1.__extends(SkipWhileSubscriber, _super);\n    function SkipWhileSubscriber(destination, predicate) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.skipping = true;\n        _this.index = 0;\n        return _this;\n    }\n    SkipWhileSubscriber.prototype._next = function (value) {\n        var destination = this.destination;\n        if (this.skipping) {\n            this.tryCallPredicate(value);\n        }\n        if (!this.skipping) {\n            destination.next(value);\n        }\n    };\n    SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {\n        try {\n            var result = this.predicate(value, this.index++);\n            this.skipping = Boolean(result);\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    return SkipWhileSubscriber;\n}(Subscriber));\n//# sourceMappingURL=skipWhile.js.map","import { concat } from '../observable/concat';\nimport { isScheduler } from '../util/isScheduler';\nexport function startWith() {\n    var array = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        array[_i] = arguments[_i];\n    }\n    var scheduler = array[array.length - 1];\n    if (isScheduler(scheduler)) {\n        array.pop();\n        return function (source) { return concat(array, source, scheduler); };\n    }\n    else {\n        return function (source) { return concat(array, source); };\n    }\n}\n//# sourceMappingURL=startWith.js.map","import * as tslib_1 from \"tslib\";\nimport { Observable } from '../Observable';\nimport { asap } from '../scheduler/asap';\nimport { isNumeric } from '../util/isNumeric';\nvar SubscribeOnObservable = (function (_super) {\n    tslib_1.__extends(SubscribeOnObservable, _super);\n    function SubscribeOnObservable(source, delayTime, scheduler) {\n        if (delayTime === void 0) { delayTime = 0; }\n        if (scheduler === void 0) { scheduler = asap; }\n        var _this = _super.call(this) || this;\n        _this.source = source;\n        _this.delayTime = delayTime;\n        _this.scheduler = scheduler;\n        if (!isNumeric(delayTime) || delayTime < 0) {\n            _this.delayTime = 0;\n        }\n        if (!scheduler || typeof scheduler.schedule !== 'function') {\n            _this.scheduler = asap;\n        }\n        return _this;\n    }\n    SubscribeOnObservable.create = function (source, delay, scheduler) {\n        if (delay === void 0) { delay = 0; }\n        if (scheduler === void 0) { scheduler = asap; }\n        return new SubscribeOnObservable(source, delay, scheduler);\n    };\n    SubscribeOnObservable.dispatch = function (arg) {\n        var source = arg.source, subscriber = arg.subscriber;\n        return this.add(source.subscribe(subscriber));\n    };\n    SubscribeOnObservable.prototype._subscribe = function (subscriber) {\n        var delay = this.delayTime;\n        var source = this.source;\n        var scheduler = this.scheduler;\n        return scheduler.schedule(SubscribeOnObservable.dispatch, delay, {\n            source: source, subscriber: subscriber\n        });\n    };\n    return SubscribeOnObservable;\n}(Observable));\nexport { SubscribeOnObservable };\n//# sourceMappingURL=SubscribeOnObservable.js.map","import { SubscribeOnObservable } from '../observable/SubscribeOnObservable';\nexport function subscribeOn(scheduler, delay) {\n    if (delay === void 0) { delay = 0; }\n    return function subscribeOnOperatorFunction(source) {\n        return source.lift(new SubscribeOnOperator(scheduler, delay));\n    };\n}\nvar SubscribeOnOperator = (function () {\n    function SubscribeOnOperator(scheduler, delay) {\n        this.scheduler = scheduler;\n        this.delay = delay;\n    }\n    SubscribeOnOperator.prototype.call = function (subscriber, source) {\n        return new SubscribeOnObservable(source, this.delay, this.scheduler).subscribe(subscriber);\n    };\n    return SubscribeOnOperator;\n}());\n//# sourceMappingURL=subscribeOn.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { map } from './map';\nimport { from } from '../observable/from';\nexport function switchMap(project, resultSelector) {\n    if (typeof resultSelector === 'function') {\n        return function (source) { return source.pipe(switchMap(function (a, i) { return from(project(a, i)).pipe(map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };\n    }\n    return function (source) { return source.lift(new SwitchMapOperator(project)); };\n}\nvar SwitchMapOperator = (function () {\n    function SwitchMapOperator(project) {\n        this.project = project;\n    }\n    SwitchMapOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));\n    };\n    return SwitchMapOperator;\n}());\nvar SwitchMapSubscriber = (function (_super) {\n    tslib_1.__extends(SwitchMapSubscriber, _super);\n    function SwitchMapSubscriber(destination, project) {\n        var _this = _super.call(this, destination) || this;\n        _this.project = project;\n        _this.index = 0;\n        return _this;\n    }\n    SwitchMapSubscriber.prototype._next = function (value) {\n        var result;\n        var index = this.index++;\n        try {\n            result = this.project(value, index);\n        }\n        catch (error) {\n            this.destination.error(error);\n            return;\n        }\n        this._innerSub(result, value, index);\n    };\n    SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {\n        var innerSubscription = this.innerSubscription;\n        if (innerSubscription) {\n            innerSubscription.unsubscribe();\n        }\n        var innerSubscriber = new InnerSubscriber(this, value, index);\n        var destination = this.destination;\n        destination.add(innerSubscriber);\n        this.innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);\n        if (this.innerSubscription !== innerSubscriber) {\n            destination.add(this.innerSubscription);\n        }\n    };\n    SwitchMapSubscriber.prototype._complete = function () {\n        var innerSubscription = this.innerSubscription;\n        if (!innerSubscription || innerSubscription.closed) {\n            _super.prototype._complete.call(this);\n        }\n        this.unsubscribe();\n    };\n    SwitchMapSubscriber.prototype._unsubscribe = function () {\n        this.innerSubscription = null;\n    };\n    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {\n        var destination = this.destination;\n        destination.remove(innerSub);\n        this.innerSubscription = null;\n        if (this.isStopped) {\n            _super.prototype._complete.call(this);\n        }\n    };\n    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.destination.next(innerValue);\n    };\n    return SwitchMapSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=switchMap.js.map","import { switchMap } from './switchMap';\nimport { identity } from '../util/identity';\nexport function switchAll() {\n    return switchMap(identity);\n}\n//# sourceMappingURL=switchAll.js.map","import { switchMap } from './switchMap';\nexport function switchMapTo(innerObservable, resultSelector) {\n    return resultSelector ? switchMap(function () { return innerObservable; }, resultSelector) : switchMap(function () { return innerObservable; });\n}\n//# sourceMappingURL=switchMapTo.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function takeUntil(notifier) {\n    return function (source) { return source.lift(new TakeUntilOperator(notifier)); };\n}\nvar TakeUntilOperator = (function () {\n    function TakeUntilOperator(notifier) {\n        this.notifier = notifier;\n    }\n    TakeUntilOperator.prototype.call = function (subscriber, source) {\n        var takeUntilSubscriber = new TakeUntilSubscriber(subscriber);\n        var notifierSubscription = subscribeToResult(takeUntilSubscriber, this.notifier);\n        if (notifierSubscription && !takeUntilSubscriber.seenValue) {\n            takeUntilSubscriber.add(notifierSubscription);\n            return source.subscribe(takeUntilSubscriber);\n        }\n        return takeUntilSubscriber;\n    };\n    return TakeUntilOperator;\n}());\nvar TakeUntilSubscriber = (function (_super) {\n    tslib_1.__extends(TakeUntilSubscriber, _super);\n    function TakeUntilSubscriber(destination) {\n        var _this = _super.call(this, destination) || this;\n        _this.seenValue = false;\n        return _this;\n    }\n    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.seenValue = true;\n        this.complete();\n    };\n    TakeUntilSubscriber.prototype.notifyComplete = function () {\n    };\n    return TakeUntilSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=takeUntil.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function takeWhile(predicate, inclusive) {\n    if (inclusive === void 0) { inclusive = false; }\n    return function (source) {\n        return source.lift(new TakeWhileOperator(predicate, inclusive));\n    };\n}\nvar TakeWhileOperator = (function () {\n    function TakeWhileOperator(predicate, inclusive) {\n        this.predicate = predicate;\n        this.inclusive = inclusive;\n    }\n    TakeWhileOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive));\n    };\n    return TakeWhileOperator;\n}());\nvar TakeWhileSubscriber = (function (_super) {\n    tslib_1.__extends(TakeWhileSubscriber, _super);\n    function TakeWhileSubscriber(destination, predicate, inclusive) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.inclusive = inclusive;\n        _this.index = 0;\n        return _this;\n    }\n    TakeWhileSubscriber.prototype._next = function (value) {\n        var destination = this.destination;\n        var result;\n        try {\n            result = this.predicate(value, this.index++);\n        }\n        catch (err) {\n            destination.error(err);\n            return;\n        }\n        this.nextOrComplete(value, result);\n    };\n    TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {\n        var destination = this.destination;\n        if (Boolean(predicateResult)) {\n            destination.next(value);\n        }\n        else {\n            if (this.inclusive) {\n                destination.next(value);\n            }\n            destination.complete();\n        }\n    };\n    return TakeWhileSubscriber;\n}(Subscriber));\n//# sourceMappingURL=takeWhile.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { noop } from '../util/noop';\nimport { isFunction } from '../util/isFunction';\nexport function tap(nextOrObserver, error, complete) {\n    return function tapOperatorFunction(source) {\n        return source.lift(new DoOperator(nextOrObserver, error, complete));\n    };\n}\nvar DoOperator = (function () {\n    function DoOperator(nextOrObserver, error, complete) {\n        this.nextOrObserver = nextOrObserver;\n        this.error = error;\n        this.complete = complete;\n    }\n    DoOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));\n    };\n    return DoOperator;\n}());\nvar TapSubscriber = (function (_super) {\n    tslib_1.__extends(TapSubscriber, _super);\n    function TapSubscriber(destination, observerOrNext, error, complete) {\n        var _this = _super.call(this, destination) || this;\n        _this._tapNext = noop;\n        _this._tapError = noop;\n        _this._tapComplete = noop;\n        _this._tapError = error || noop;\n        _this._tapComplete = complete || noop;\n        if (isFunction(observerOrNext)) {\n            _this._context = _this;\n            _this._tapNext = observerOrNext;\n        }\n        else if (observerOrNext) {\n            _this._context = observerOrNext;\n            _this._tapNext = observerOrNext.next || noop;\n            _this._tapError = observerOrNext.error || noop;\n            _this._tapComplete = observerOrNext.complete || noop;\n        }\n        return _this;\n    }\n    TapSubscriber.prototype._next = function (value) {\n        try {\n            this._tapNext.call(this._context, value);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(value);\n    };\n    TapSubscriber.prototype._error = function (err) {\n        try {\n            this._tapError.call(this._context, err);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.error(err);\n    };\n    TapSubscriber.prototype._complete = function () {\n        try {\n            this._tapComplete.call(this._context);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        return this.destination.complete();\n    };\n    return TapSubscriber;\n}(Subscriber));\n//# sourceMappingURL=tap.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport var defaultThrottleConfig = {\n    leading: true,\n    trailing: false\n};\nexport function throttle(durationSelector, config) {\n    if (config === void 0) { config = defaultThrottleConfig; }\n    return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); };\n}\nvar ThrottleOperator = (function () {\n    function ThrottleOperator(durationSelector, leading, trailing) {\n        this.durationSelector = durationSelector;\n        this.leading = leading;\n        this.trailing = trailing;\n    }\n    ThrottleOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));\n    };\n    return ThrottleOperator;\n}());\nvar ThrottleSubscriber = (function (_super) {\n    tslib_1.__extends(ThrottleSubscriber, _super);\n    function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {\n        var _this = _super.call(this, destination) || this;\n        _this.destination = destination;\n        _this.durationSelector = durationSelector;\n        _this._leading = _leading;\n        _this._trailing = _trailing;\n        _this._hasValue = false;\n        return _this;\n    }\n    ThrottleSubscriber.prototype._next = function (value) {\n        this._hasValue = true;\n        this._sendValue = value;\n        if (!this._throttled) {\n            if (this._leading) {\n                this.send();\n            }\n            else {\n                this.throttle(value);\n            }\n        }\n    };\n    ThrottleSubscriber.prototype.send = function () {\n        var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue;\n        if (_hasValue) {\n            this.destination.next(_sendValue);\n            this.throttle(_sendValue);\n        }\n        this._hasValue = false;\n        this._sendValue = null;\n    };\n    ThrottleSubscriber.prototype.throttle = function (value) {\n        var duration = this.tryDurationSelector(value);\n        if (!!duration) {\n            this.add(this._throttled = subscribeToResult(this, duration));\n        }\n    };\n    ThrottleSubscriber.prototype.tryDurationSelector = function (value) {\n        try {\n            return this.durationSelector(value);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return null;\n        }\n    };\n    ThrottleSubscriber.prototype.throttlingDone = function () {\n        var _a = this, _throttled = _a._throttled, _trailing = _a._trailing;\n        if (_throttled) {\n            _throttled.unsubscribe();\n        }\n        this._throttled = null;\n        if (_trailing) {\n            this.send();\n        }\n    };\n    ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.throttlingDone();\n    };\n    ThrottleSubscriber.prototype.notifyComplete = function () {\n        this.throttlingDone();\n    };\n    return ThrottleSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=throttle.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { async } from '../scheduler/async';\nimport { defaultThrottleConfig } from './throttle';\nexport function throttleTime(duration, scheduler, config) {\n    if (scheduler === void 0) { scheduler = async; }\n    if (config === void 0) { config = defaultThrottleConfig; }\n    return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); };\n}\nvar ThrottleTimeOperator = (function () {\n    function ThrottleTimeOperator(duration, scheduler, leading, trailing) {\n        this.duration = duration;\n        this.scheduler = scheduler;\n        this.leading = leading;\n        this.trailing = trailing;\n    }\n    ThrottleTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));\n    };\n    return ThrottleTimeOperator;\n}());\nvar ThrottleTimeSubscriber = (function (_super) {\n    tslib_1.__extends(ThrottleTimeSubscriber, _super);\n    function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {\n        var _this = _super.call(this, destination) || this;\n        _this.duration = duration;\n        _this.scheduler = scheduler;\n        _this.leading = leading;\n        _this.trailing = trailing;\n        _this._hasTrailingValue = false;\n        _this._trailingValue = null;\n        return _this;\n    }\n    ThrottleTimeSubscriber.prototype._next = function (value) {\n        if (this.throttled) {\n            if (this.trailing) {\n                this._trailingValue = value;\n                this._hasTrailingValue = true;\n            }\n        }\n        else {\n            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));\n            if (this.leading) {\n                this.destination.next(value);\n            }\n            else if (this.trailing) {\n                this._trailingValue = value;\n                this._hasTrailingValue = true;\n            }\n        }\n    };\n    ThrottleTimeSubscriber.prototype._complete = function () {\n        if (this._hasTrailingValue) {\n            this.destination.next(this._trailingValue);\n            this.destination.complete();\n        }\n        else {\n            this.destination.complete();\n        }\n    };\n    ThrottleTimeSubscriber.prototype.clearThrottle = function () {\n        var throttled = this.throttled;\n        if (throttled) {\n            if (this.trailing && this._hasTrailingValue) {\n                this.destination.next(this._trailingValue);\n                this._trailingValue = null;\n                this._hasTrailingValue = false;\n            }\n            throttled.unsubscribe();\n            this.remove(throttled);\n            this.throttled = null;\n        }\n    };\n    return ThrottleTimeSubscriber;\n}(Subscriber));\nfunction dispatchNext(arg) {\n    var subscriber = arg.subscriber;\n    subscriber.clearThrottle();\n}\n//# sourceMappingURL=throttleTime.js.map","import { async } from '../scheduler/async';\nimport { scan } from './scan';\nimport { defer } from '../observable/defer';\nimport { map } from './map';\nexport function timeInterval(scheduler) {\n    if (scheduler === void 0) { scheduler = async; }\n    return function (source) { return defer(function () {\n        return source.pipe(scan(function (_a, value) {\n            var current = _a.current;\n            return ({ value: value, current: scheduler.now(), last: current });\n        }, { current: scheduler.now(), value: undefined, last: undefined }), map(function (_a) {\n            var current = _a.current, last = _a.last, value = _a.value;\n            return new TimeInterval(value, current - last);\n        }));\n    }); };\n}\nvar TimeInterval = (function () {\n    function TimeInterval(value, interval) {\n        this.value = value;\n        this.interval = interval;\n    }\n    return TimeInterval;\n}());\nexport { TimeInterval };\n//# sourceMappingURL=timeInterval.js.map","import * as tslib_1 from \"tslib\";\nimport { async } from '../scheduler/async';\nimport { isDate } from '../util/isDate';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function timeoutWith(due, withObservable, scheduler) {\n    if (scheduler === void 0) { scheduler = async; }\n    return function (source) {\n        var absoluteTimeout = isDate(due);\n        var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);\n        return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));\n    };\n}\nvar TimeoutWithOperator = (function () {\n    function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) {\n        this.waitFor = waitFor;\n        this.absoluteTimeout = absoluteTimeout;\n        this.withObservable = withObservable;\n        this.scheduler = scheduler;\n    }\n    TimeoutWithOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler));\n    };\n    return TimeoutWithOperator;\n}());\nvar TimeoutWithSubscriber = (function (_super) {\n    tslib_1.__extends(TimeoutWithSubscriber, _super);\n    function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.absoluteTimeout = absoluteTimeout;\n        _this.waitFor = waitFor;\n        _this.withObservable = withObservable;\n        _this.scheduler = scheduler;\n        _this.action = null;\n        _this.scheduleTimeout();\n        return _this;\n    }\n    TimeoutWithSubscriber.dispatchTimeout = function (subscriber) {\n        var withObservable = subscriber.withObservable;\n        subscriber._unsubscribeAndRecycle();\n        subscriber.add(subscribeToResult(subscriber, withObservable));\n    };\n    TimeoutWithSubscriber.prototype.scheduleTimeout = function () {\n        var action = this.action;\n        if (action) {\n            this.action = action.schedule(this, this.waitFor);\n        }\n        else {\n            this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this));\n        }\n    };\n    TimeoutWithSubscriber.prototype._next = function (value) {\n        if (!this.absoluteTimeout) {\n            this.scheduleTimeout();\n        }\n        _super.prototype._next.call(this, value);\n    };\n    TimeoutWithSubscriber.prototype._unsubscribe = function () {\n        this.action = null;\n        this.scheduler = null;\n        this.withObservable = null;\n    };\n    return TimeoutWithSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=timeoutWith.js.map","import { async } from '../scheduler/async';\nimport { TimeoutError } from '../util/TimeoutError';\nimport { timeoutWith } from './timeoutWith';\nimport { throwError } from '../observable/throwError';\nexport function timeout(due, scheduler) {\n    if (scheduler === void 0) { scheduler = async; }\n    return timeoutWith(due, throwError(new TimeoutError()), scheduler);\n}\n//# sourceMappingURL=timeout.js.map","import { async } from '../scheduler/async';\nimport { map } from './map';\nexport function timestamp(scheduler) {\n    if (scheduler === void 0) { scheduler = async; }\n    return map(function (value) { return new Timestamp(value, scheduler.now()); });\n}\nvar Timestamp = (function () {\n    function Timestamp(value, timestamp) {\n        this.value = value;\n        this.timestamp = timestamp;\n    }\n    return Timestamp;\n}());\nexport { Timestamp };\n//# sourceMappingURL=timestamp.js.map","import { reduce } from './reduce';\nfunction toArrayReducer(arr, item, index) {\n    if (index === 0) {\n        return [item];\n    }\n    arr.push(item);\n    return arr;\n}\nexport function toArray() {\n    return reduce(toArrayReducer, []);\n}\n//# sourceMappingURL=toArray.js.map","import * as tslib_1 from \"tslib\";\nimport { Subject } from '../Subject';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function window(windowBoundaries) {\n    return function windowOperatorFunction(source) {\n        return source.lift(new WindowOperator(windowBoundaries));\n    };\n}\nvar WindowOperator = (function () {\n    function WindowOperator(windowBoundaries) {\n        this.windowBoundaries = windowBoundaries;\n    }\n    WindowOperator.prototype.call = function (subscriber, source) {\n        var windowSubscriber = new WindowSubscriber(subscriber);\n        var sourceSubscription = source.subscribe(windowSubscriber);\n        if (!sourceSubscription.closed) {\n            windowSubscriber.add(subscribeToResult(windowSubscriber, this.windowBoundaries));\n        }\n        return sourceSubscription;\n    };\n    return WindowOperator;\n}());\nvar WindowSubscriber = (function (_super) {\n    tslib_1.__extends(WindowSubscriber, _super);\n    function WindowSubscriber(destination) {\n        var _this = _super.call(this, destination) || this;\n        _this.window = new Subject();\n        destination.next(_this.window);\n        return _this;\n    }\n    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.openWindow();\n    };\n    WindowSubscriber.prototype.notifyError = function (error, innerSub) {\n        this._error(error);\n    };\n    WindowSubscriber.prototype.notifyComplete = function (innerSub) {\n        this._complete();\n    };\n    WindowSubscriber.prototype._next = function (value) {\n        this.window.next(value);\n    };\n    WindowSubscriber.prototype._error = function (err) {\n        this.window.error(err);\n        this.destination.error(err);\n    };\n    WindowSubscriber.prototype._complete = function () {\n        this.window.complete();\n        this.destination.complete();\n    };\n    WindowSubscriber.prototype._unsubscribe = function () {\n        this.window = null;\n    };\n    WindowSubscriber.prototype.openWindow = function () {\n        var prevWindow = this.window;\n        if (prevWindow) {\n            prevWindow.complete();\n        }\n        var destination = this.destination;\n        var newWindow = this.window = new Subject();\n        destination.next(newWindow);\n    };\n    return WindowSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=window.js.map","import * as tslib_1 from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nimport { Subject } from '../Subject';\nexport function windowCount(windowSize, startWindowEvery) {\n    if (startWindowEvery === void 0) { startWindowEvery = 0; }\n    return function windowCountOperatorFunction(source) {\n        return source.lift(new WindowCountOperator(windowSize, startWindowEvery));\n    };\n}\nvar WindowCountOperator = (function () {\n    function WindowCountOperator(windowSize, startWindowEvery) {\n        this.windowSize = windowSize;\n        this.startWindowEvery = startWindowEvery;\n    }\n    WindowCountOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));\n    };\n    return WindowCountOperator;\n}());\nvar WindowCountSubscriber = (function (_super) {\n    tslib_1.__extends(WindowCountSubscriber, _super);\n    function WindowCountSubscriber(destination, windowSize, startWindowEvery) {\n        var _this = _super.call(this, destination) || this;\n        _this.destination = destination;\n        _this.windowSize = windowSize;\n        _this.startWindowEvery = startWindowEvery;\n        _this.windows = [new Subject()];\n        _this.count = 0;\n        destination.next(_this.windows[0]);\n        return _this;\n    }\n    WindowCountSubscriber.prototype._next = function (value) {\n        var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;\n        var destination = this.destination;\n        var windowSize = this.windowSize;\n        var windows = this.windows;\n        var len = windows.length;\n        for (var i = 0; i < len && !this.closed; i++) {\n            windows[i].next(value);\n        }\n        var c = this.count - windowSize + 1;\n        if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {\n            windows.shift().complete();\n        }\n        if (++this.count % startWindowEvery === 0 && !this.closed) {\n            var window_1 = new Subject();\n            windows.push(window_1);\n            destination.next(window_1);\n        }\n    };\n    WindowCountSubscriber.prototype._error = function (err) {\n        var windows = this.windows;\n        if (windows) {\n            while (windows.length > 0 && !this.closed) {\n                windows.shift().error(err);\n            }\n        }\n        this.destination.error(err);\n    };\n    WindowCountSubscriber.prototype._complete = function () {\n        var windows = this.windows;\n        if (windows) {\n            while (windows.length > 0 && !this.closed) {\n                windows.shift().complete();\n            }\n        }\n        this.destination.complete();\n    };\n    WindowCountSubscriber.prototype._unsubscribe = function () {\n        this.count = 0;\n        this.windows = null;\n    };\n    return WindowCountSubscriber;\n}(Subscriber));\n//# sourceMappingURL=windowCount.js.map","import * as tslib_1 from \"tslib\";\nimport { Subject } from '../Subject';\nimport { async } from '../scheduler/async';\nimport { Subscriber } from '../Subscriber';\nimport { isNumeric } from '../util/isNumeric';\nimport { isScheduler } from '../util/isScheduler';\nexport function windowTime(windowTimeSpan) {\n    var scheduler = async;\n    var windowCreationInterval = null;\n    var maxWindowSize = Number.POSITIVE_INFINITY;\n    if (isScheduler(arguments[3])) {\n        scheduler = arguments[3];\n    }\n    if (isScheduler(arguments[2])) {\n        scheduler = arguments[2];\n    }\n    else if (isNumeric(arguments[2])) {\n        maxWindowSize = arguments[2];\n    }\n    if (isScheduler(arguments[1])) {\n        scheduler = arguments[1];\n    }\n    else if (isNumeric(arguments[1])) {\n        windowCreationInterval = arguments[1];\n    }\n    return function windowTimeOperatorFunction(source) {\n        return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler));\n    };\n}\nvar WindowTimeOperator = (function () {\n    function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {\n        this.windowTimeSpan = windowTimeSpan;\n        this.windowCreationInterval = windowCreationInterval;\n        this.maxWindowSize = maxWindowSize;\n        this.scheduler = scheduler;\n    }\n    WindowTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler));\n    };\n    return WindowTimeOperator;\n}());\nvar CountedSubject = (function (_super) {\n    tslib_1.__extends(CountedSubject, _super);\n    function CountedSubject() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._numberOfNextedValues = 0;\n        return _this;\n    }\n    CountedSubject.prototype.next = function (value) {\n        this._numberOfNextedValues++;\n        _super.prototype.next.call(this, value);\n    };\n    Object.defineProperty(CountedSubject.prototype, \"numberOfNextedValues\", {\n        get: function () {\n            return this._numberOfNextedValues;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    return CountedSubject;\n}(Subject));\nvar WindowTimeSubscriber = (function (_super) {\n    tslib_1.__extends(WindowTimeSubscriber, _super);\n    function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.destination = destination;\n        _this.windowTimeSpan = windowTimeSpan;\n        _this.windowCreationInterval = windowCreationInterval;\n        _this.maxWindowSize = maxWindowSize;\n        _this.scheduler = scheduler;\n        _this.windows = [];\n        var window = _this.openWindow();\n        if (windowCreationInterval !== null && windowCreationInterval >= 0) {\n            var closeState = { subscriber: _this, window: window, context: null };\n            var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler };\n            _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState));\n            _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState));\n        }\n        else {\n            var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan };\n            _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));\n        }\n        return _this;\n    }\n    WindowTimeSubscriber.prototype._next = function (value) {\n        var windows = this.windows;\n        var len = windows.length;\n        for (var i = 0; i < len; i++) {\n            var window_1 = windows[i];\n            if (!window_1.closed) {\n                window_1.next(value);\n                if (window_1.numberOfNextedValues >= this.maxWindowSize) {\n                    this.closeWindow(window_1);\n                }\n            }\n        }\n    };\n    WindowTimeSubscriber.prototype._error = function (err) {\n        var windows = this.windows;\n        while (windows.length > 0) {\n            windows.shift().error(err);\n        }\n        this.destination.error(err);\n    };\n    WindowTimeSubscriber.prototype._complete = function () {\n        var windows = this.windows;\n        while (windows.length > 0) {\n            var window_2 = windows.shift();\n            if (!window_2.closed) {\n                window_2.complete();\n            }\n        }\n        this.destination.complete();\n    };\n    WindowTimeSubscriber.prototype.openWindow = function () {\n        var window = new CountedSubject();\n        this.windows.push(window);\n        var destination = this.destination;\n        destination.next(window);\n        return window;\n    };\n    WindowTimeSubscriber.prototype.closeWindow = function (window) {\n        window.complete();\n        var windows = this.windows;\n        windows.splice(windows.indexOf(window), 1);\n    };\n    return WindowTimeSubscriber;\n}(Subscriber));\nfunction dispatchWindowTimeSpanOnly(state) {\n    var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window;\n    if (window) {\n        subscriber.closeWindow(window);\n    }\n    state.window = subscriber.openWindow();\n    this.schedule(state, windowTimeSpan);\n}\nfunction dispatchWindowCreation(state) {\n    var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval;\n    var window = subscriber.openWindow();\n    var action = this;\n    var context = { action: action, subscription: null };\n    var timeSpanState = { subscriber: subscriber, window: window, context: context };\n    context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState);\n    action.add(context.subscription);\n    action.schedule(state, windowCreationInterval);\n}\nfunction dispatchWindowClose(state) {\n    var subscriber = state.subscriber, window = state.window, context = state.context;\n    if (context && context.action && context.subscription) {\n        context.action.remove(context.subscription);\n    }\n    subscriber.closeWindow(window);\n}\n//# sourceMappingURL=windowTime.js.map","import * as tslib_1 from \"tslib\";\nimport { Subject } from '../Subject';\nimport { Subscription } from '../Subscription';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function windowToggle(openings, closingSelector) {\n    return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); };\n}\nvar WindowToggleOperator = (function () {\n    function WindowToggleOperator(openings, closingSelector) {\n        this.openings = openings;\n        this.closingSelector = closingSelector;\n    }\n    WindowToggleOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector));\n    };\n    return WindowToggleOperator;\n}());\nvar WindowToggleSubscriber = (function (_super) {\n    tslib_1.__extends(WindowToggleSubscriber, _super);\n    function WindowToggleSubscriber(destination, openings, closingSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.openings = openings;\n        _this.closingSelector = closingSelector;\n        _this.contexts = [];\n        _this.add(_this.openSubscription = subscribeToResult(_this, openings, openings));\n        return _this;\n    }\n    WindowToggleSubscriber.prototype._next = function (value) {\n        var contexts = this.contexts;\n        if (contexts) {\n            var len = contexts.length;\n            for (var i = 0; i < len; i++) {\n                contexts[i].window.next(value);\n            }\n        }\n    };\n    WindowToggleSubscriber.prototype._error = function (err) {\n        var contexts = this.contexts;\n        this.contexts = null;\n        if (contexts) {\n            var len = contexts.length;\n            var index = -1;\n            while (++index < len) {\n                var context_1 = contexts[index];\n                context_1.window.error(err);\n                context_1.subscription.unsubscribe();\n            }\n        }\n        _super.prototype._error.call(this, err);\n    };\n    WindowToggleSubscriber.prototype._complete = function () {\n        var contexts = this.contexts;\n        this.contexts = null;\n        if (contexts) {\n            var len = contexts.length;\n            var index = -1;\n            while (++index < len) {\n                var context_2 = contexts[index];\n                context_2.window.complete();\n                context_2.subscription.unsubscribe();\n            }\n        }\n        _super.prototype._complete.call(this);\n    };\n    WindowToggleSubscriber.prototype._unsubscribe = function () {\n        var contexts = this.contexts;\n        this.contexts = null;\n        if (contexts) {\n            var len = contexts.length;\n            var index = -1;\n            while (++index < len) {\n                var context_3 = contexts[index];\n                context_3.window.unsubscribe();\n                context_3.subscription.unsubscribe();\n            }\n        }\n    };\n    WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        if (outerValue === this.openings) {\n            var closingNotifier = void 0;\n            try {\n                var closingSelector = this.closingSelector;\n                closingNotifier = closingSelector(innerValue);\n            }\n            catch (e) {\n                return this.error(e);\n            }\n            var window_1 = new Subject();\n            var subscription = new Subscription();\n            var context_4 = { window: window_1, subscription: subscription };\n            this.contexts.push(context_4);\n            var innerSubscription = subscribeToResult(this, closingNotifier, context_4);\n            if (innerSubscription.closed) {\n                this.closeWindow(this.contexts.length - 1);\n            }\n            else {\n                innerSubscription.context = context_4;\n                subscription.add(innerSubscription);\n            }\n            this.destination.next(window_1);\n        }\n        else {\n            this.closeWindow(this.contexts.indexOf(outerValue));\n        }\n    };\n    WindowToggleSubscriber.prototype.notifyError = function (err) {\n        this.error(err);\n    };\n    WindowToggleSubscriber.prototype.notifyComplete = function (inner) {\n        if (inner !== this.openSubscription) {\n            this.closeWindow(this.contexts.indexOf(inner.context));\n        }\n    };\n    WindowToggleSubscriber.prototype.closeWindow = function (index) {\n        if (index === -1) {\n            return;\n        }\n        var contexts = this.contexts;\n        var context = contexts[index];\n        var window = context.window, subscription = context.subscription;\n        contexts.splice(index, 1);\n        window.complete();\n        subscription.unsubscribe();\n    };\n    return WindowToggleSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=windowToggle.js.map","import * as tslib_1 from \"tslib\";\nimport { Subject } from '../Subject';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function windowWhen(closingSelector) {\n    return function windowWhenOperatorFunction(source) {\n        return source.lift(new WindowOperator(closingSelector));\n    };\n}\nvar WindowOperator = (function () {\n    function WindowOperator(closingSelector) {\n        this.closingSelector = closingSelector;\n    }\n    WindowOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector));\n    };\n    return WindowOperator;\n}());\nvar WindowSubscriber = (function (_super) {\n    tslib_1.__extends(WindowSubscriber, _super);\n    function WindowSubscriber(destination, closingSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.destination = destination;\n        _this.closingSelector = closingSelector;\n        _this.openWindow();\n        return _this;\n    }\n    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.openWindow(innerSub);\n    };\n    WindowSubscriber.prototype.notifyError = function (error, innerSub) {\n        this._error(error);\n    };\n    WindowSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.openWindow(innerSub);\n    };\n    WindowSubscriber.prototype._next = function (value) {\n        this.window.next(value);\n    };\n    WindowSubscriber.prototype._error = function (err) {\n        this.window.error(err);\n        this.destination.error(err);\n        this.unsubscribeClosingNotification();\n    };\n    WindowSubscriber.prototype._complete = function () {\n        this.window.complete();\n        this.destination.complete();\n        this.unsubscribeClosingNotification();\n    };\n    WindowSubscriber.prototype.unsubscribeClosingNotification = function () {\n        if (this.closingNotification) {\n            this.closingNotification.unsubscribe();\n        }\n    };\n    WindowSubscriber.prototype.openWindow = function (innerSub) {\n        if (innerSub === void 0) { innerSub = null; }\n        if (innerSub) {\n            this.remove(innerSub);\n            innerSub.unsubscribe();\n        }\n        var prevWindow = this.window;\n        if (prevWindow) {\n            prevWindow.complete();\n        }\n        var window = this.window = new Subject();\n        this.destination.next(window);\n        var closingNotifier;\n        try {\n            var closingSelector = this.closingSelector;\n            closingNotifier = closingSelector();\n        }\n        catch (e) {\n            this.destination.error(e);\n            this.window.error(e);\n            return;\n        }\n        this.add(this.closingNotification = subscribeToResult(this, closingNotifier));\n    };\n    return WindowSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=windowWhen.js.map","import * as tslib_1 from \"tslib\";\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nexport function withLatestFrom() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    return function (source) {\n        var project;\n        if (typeof args[args.length - 1] === 'function') {\n            project = args.pop();\n        }\n        var observables = args;\n        return source.lift(new WithLatestFromOperator(observables, project));\n    };\n}\nvar WithLatestFromOperator = (function () {\n    function WithLatestFromOperator(observables, project) {\n        this.observables = observables;\n        this.project = project;\n    }\n    WithLatestFromOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));\n    };\n    return WithLatestFromOperator;\n}());\nvar WithLatestFromSubscriber = (function (_super) {\n    tslib_1.__extends(WithLatestFromSubscriber, _super);\n    function WithLatestFromSubscriber(destination, observables, project) {\n        var _this = _super.call(this, destination) || this;\n        _this.observables = observables;\n        _this.project = project;\n        _this.toRespond = [];\n        var len = observables.length;\n        _this.values = new Array(len);\n        for (var i = 0; i < len; i++) {\n            _this.toRespond.push(i);\n        }\n        for (var i = 0; i < len; i++) {\n            var observable = observables[i];\n            _this.add(subscribeToResult(_this, observable, observable, i));\n        }\n        return _this;\n    }\n    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.values[outerIndex] = innerValue;\n        var toRespond = this.toRespond;\n        if (toRespond.length > 0) {\n            var found = toRespond.indexOf(outerIndex);\n            if (found !== -1) {\n                toRespond.splice(found, 1);\n            }\n        }\n    };\n    WithLatestFromSubscriber.prototype.notifyComplete = function () {\n    };\n    WithLatestFromSubscriber.prototype._next = function (value) {\n        if (this.toRespond.length === 0) {\n            var args = [value].concat(this.values);\n            if (this.project) {\n                this._tryProject(args);\n            }\n            else {\n                this.destination.next(args);\n            }\n        }\n    };\n    WithLatestFromSubscriber.prototype._tryProject = function (args) {\n        var result;\n        try {\n            result = this.project.apply(this, args);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return WithLatestFromSubscriber;\n}(OuterSubscriber));\n//# sourceMappingURL=withLatestFrom.js.map","import { zip as zipStatic } from '../observable/zip';\nexport function zip() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    return function zipOperatorFunction(source) {\n        return source.lift.call(zipStatic.apply(void 0, [source].concat(observables)));\n    };\n}\n//# sourceMappingURL=zip.js.map","import { ZipOperator } from '../observable/zip';\nexport function zipAll(project) {\n    return function (source) { return source.lift(new ZipOperator(project)); };\n}\n//# sourceMappingURL=zipAll.js.map","var SubscriptionLog = (function () {\n    function SubscriptionLog(subscribedFrame, unsubscribedFrame) {\n        if (unsubscribedFrame === void 0) { unsubscribedFrame = Number.POSITIVE_INFINITY; }\n        this.subscribedFrame = subscribedFrame;\n        this.unsubscribedFrame = unsubscribedFrame;\n    }\n    return SubscriptionLog;\n}());\nexport { SubscriptionLog };\n//# sourceMappingURL=SubscriptionLog.js.map","import { SubscriptionLog } from './SubscriptionLog';\nvar SubscriptionLoggable = (function () {\n    function SubscriptionLoggable() {\n        this.subscriptions = [];\n    }\n    SubscriptionLoggable.prototype.logSubscribedFrame = function () {\n        this.subscriptions.push(new SubscriptionLog(this.scheduler.now()));\n        return this.subscriptions.length - 1;\n    };\n    SubscriptionLoggable.prototype.logUnsubscribedFrame = function (index) {\n        var subscriptionLogs = this.subscriptions;\n        var oldSubscriptionLog = subscriptionLogs[index];\n        subscriptionLogs[index] = new SubscriptionLog(oldSubscriptionLog.subscribedFrame, this.scheduler.now());\n    };\n    return SubscriptionLoggable;\n}());\nexport { SubscriptionLoggable };\n//# sourceMappingURL=SubscriptionLoggable.js.map","export function applyMixins(derivedCtor, baseCtors) {\n    for (var i = 0, len = baseCtors.length; i < len; i++) {\n        var baseCtor = baseCtors[i];\n        var propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);\n        for (var j = 0, len2 = propertyKeys.length; j < len2; j++) {\n            var name_1 = propertyKeys[j];\n            derivedCtor.prototype[name_1] = baseCtor.prototype[name_1];\n        }\n    }\n}\n//# sourceMappingURL=applyMixins.js.map","import * as tslib_1 from \"tslib\";\nimport { Observable } from '../Observable';\nimport { Subscription } from '../Subscription';\nimport { SubscriptionLoggable } from './SubscriptionLoggable';\nimport { applyMixins } from '../util/applyMixins';\nvar ColdObservable = (function (_super) {\n    tslib_1.__extends(ColdObservable, _super);\n    function ColdObservable(messages, scheduler) {\n        var _this = _super.call(this, function (subscriber) {\n            var observable = this;\n            var index = observable.logSubscribedFrame();\n            var subscription = new Subscription();\n            subscription.add(new Subscription(function () {\n                observable.logUnsubscribedFrame(index);\n            }));\n            observable.scheduleMessages(subscriber);\n            return subscription;\n        }) || this;\n        _this.messages = messages;\n        _this.subscriptions = [];\n        _this.scheduler = scheduler;\n        return _this;\n    }\n    ColdObservable.prototype.scheduleMessages = function (subscriber) {\n        var messagesLength = this.messages.length;\n        for (var i = 0; i < messagesLength; i++) {\n            var message = this.messages[i];\n            subscriber.add(this.scheduler.schedule(function (_a) {\n                var message = _a.message, subscriber = _a.subscriber;\n                message.notification.observe(subscriber);\n            }, message.frame, { message: message, subscriber: subscriber }));\n        }\n    };\n    return ColdObservable;\n}(Observable));\nexport { ColdObservable };\napplyMixins(ColdObservable, [SubscriptionLoggable]);\n//# sourceMappingURL=ColdObservable.js.map","import * as tslib_1 from \"tslib\";\nimport { Subject } from '../Subject';\nimport { Subscription } from '../Subscription';\nimport { SubscriptionLoggable } from './SubscriptionLoggable';\nimport { applyMixins } from '../util/applyMixins';\nvar HotObservable = (function (_super) {\n    tslib_1.__extends(HotObservable, _super);\n    function HotObservable(messages, scheduler) {\n        var _this = _super.call(this) || this;\n        _this.messages = messages;\n        _this.subscriptions = [];\n        _this.scheduler = scheduler;\n        return _this;\n    }\n    HotObservable.prototype._subscribe = function (subscriber) {\n        var subject = this;\n        var index = subject.logSubscribedFrame();\n        var subscription = new Subscription();\n        subscription.add(new Subscription(function () {\n            subject.logUnsubscribedFrame(index);\n        }));\n        subscription.add(_super.prototype._subscribe.call(this, subscriber));\n        return subscription;\n    };\n    HotObservable.prototype.setup = function () {\n        var subject = this;\n        var messagesLength = subject.messages.length;\n        for (var i = 0; i < messagesLength; i++) {\n            (function () {\n                var message = subject.messages[i];\n                subject.scheduler.schedule(function () { message.notification.observe(subject); }, message.frame);\n            })();\n        }\n    };\n    return HotObservable;\n}(Subject));\nexport { HotObservable };\napplyMixins(HotObservable, [SubscriptionLoggable]);\n//# sourceMappingURL=HotObservable.js.map","import * as tslib_1 from \"tslib\";\nimport { Observable } from '../Observable';\nimport { Notification } from '../Notification';\nimport { ColdObservable } from './ColdObservable';\nimport { HotObservable } from './HotObservable';\nimport { SubscriptionLog } from './SubscriptionLog';\nimport { VirtualTimeScheduler, VirtualAction } from '../scheduler/VirtualTimeScheduler';\nimport { AsyncScheduler } from '../scheduler/AsyncScheduler';\nvar defaultMaxFrame = 750;\nvar TestScheduler = (function (_super) {\n    tslib_1.__extends(TestScheduler, _super);\n    function TestScheduler(assertDeepEqual) {\n        var _this = _super.call(this, VirtualAction, defaultMaxFrame) || this;\n        _this.assertDeepEqual = assertDeepEqual;\n        _this.hotObservables = [];\n        _this.coldObservables = [];\n        _this.flushTests = [];\n        _this.runMode = false;\n        return _this;\n    }\n    TestScheduler.prototype.createTime = function (marbles) {\n        var indexOf = marbles.indexOf('|');\n        if (indexOf === -1) {\n            throw new Error('marble diagram for time should have a completion marker \"|\"');\n        }\n        return indexOf * TestScheduler.frameTimeFactor;\n    };\n    TestScheduler.prototype.createColdObservable = function (marbles, values, error) {\n        if (marbles.indexOf('^') !== -1) {\n            throw new Error('cold observable cannot have subscription offset \"^\"');\n        }\n        if (marbles.indexOf('!') !== -1) {\n            throw new Error('cold observable cannot have unsubscription marker \"!\"');\n        }\n        var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);\n        var cold = new ColdObservable(messages, this);\n        this.coldObservables.push(cold);\n        return cold;\n    };\n    TestScheduler.prototype.createHotObservable = function (marbles, values, error) {\n        if (marbles.indexOf('!') !== -1) {\n            throw new Error('hot observable cannot have unsubscription marker \"!\"');\n        }\n        var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);\n        var subject = new HotObservable(messages, this);\n        this.hotObservables.push(subject);\n        return subject;\n    };\n    TestScheduler.prototype.materializeInnerObservable = function (observable, outerFrame) {\n        var _this = this;\n        var messages = [];\n        observable.subscribe(function (value) {\n            messages.push({ frame: _this.frame - outerFrame, notification: Notification.createNext(value) });\n        }, function (err) {\n            messages.push({ frame: _this.frame - outerFrame, notification: Notification.createError(err) });\n        }, function () {\n            messages.push({ frame: _this.frame - outerFrame, notification: Notification.createComplete() });\n        });\n        return messages;\n    };\n    TestScheduler.prototype.expectObservable = function (observable, subscriptionMarbles) {\n        var _this = this;\n        if (subscriptionMarbles === void 0) { subscriptionMarbles = null; }\n        var actual = [];\n        var flushTest = { actual: actual, ready: false };\n        var subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);\n        var subscriptionFrame = subscriptionParsed.subscribedFrame === Number.POSITIVE_INFINITY ?\n            0 : subscriptionParsed.subscribedFrame;\n        var unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;\n        var subscription;\n        this.schedule(function () {\n            subscription = observable.subscribe(function (x) {\n                var value = x;\n                if (x instanceof Observable) {\n                    value = _this.materializeInnerObservable(value, _this.frame);\n                }\n                actual.push({ frame: _this.frame, notification: Notification.createNext(value) });\n            }, function (err) {\n                actual.push({ frame: _this.frame, notification: Notification.createError(err) });\n            }, function () {\n                actual.push({ frame: _this.frame, notification: Notification.createComplete() });\n            });\n        }, subscriptionFrame);\n        if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {\n            this.schedule(function () { return subscription.unsubscribe(); }, unsubscriptionFrame);\n        }\n        this.flushTests.push(flushTest);\n        var runMode = this.runMode;\n        return {\n            toBe: function (marbles, values, errorValue) {\n                flushTest.ready = true;\n                flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);\n            }\n        };\n    };\n    TestScheduler.prototype.expectSubscriptions = function (actualSubscriptionLogs) {\n        var flushTest = { actual: actualSubscriptionLogs, ready: false };\n        this.flushTests.push(flushTest);\n        var runMode = this.runMode;\n        return {\n            toBe: function (marbles) {\n                var marblesArray = (typeof marbles === 'string') ? [marbles] : marbles;\n                flushTest.ready = true;\n                flushTest.expected = marblesArray.map(function (marbles) {\n                    return TestScheduler.parseMarblesAsSubscriptions(marbles, runMode);\n                });\n            }\n        };\n    };\n    TestScheduler.prototype.flush = function () {\n        var _this = this;\n        var hotObservables = this.hotObservables;\n        while (hotObservables.length > 0) {\n            hotObservables.shift().setup();\n        }\n        _super.prototype.flush.call(this);\n        this.flushTests = this.flushTests.filter(function (test) {\n            if (test.ready) {\n                _this.assertDeepEqual(test.actual, test.expected);\n                return false;\n            }\n            return true;\n        });\n    };\n    TestScheduler.parseMarblesAsSubscriptions = function (marbles, runMode) {\n        var _this = this;\n        if (runMode === void 0) { runMode = false; }\n        if (typeof marbles !== 'string') {\n            return new SubscriptionLog(Number.POSITIVE_INFINITY);\n        }\n        var len = marbles.length;\n        var groupStart = -1;\n        var subscriptionFrame = Number.POSITIVE_INFINITY;\n        var unsubscriptionFrame = Number.POSITIVE_INFINITY;\n        var frame = 0;\n        var _loop_1 = function (i) {\n            var nextFrame = frame;\n            var advanceFrameBy = function (count) {\n                nextFrame += count * _this.frameTimeFactor;\n            };\n            var c = marbles[i];\n            switch (c) {\n                case ' ':\n                    if (!runMode) {\n                        advanceFrameBy(1);\n                    }\n                    break;\n                case '-':\n                    advanceFrameBy(1);\n                    break;\n                case '(':\n                    groupStart = frame;\n                    advanceFrameBy(1);\n                    break;\n                case ')':\n                    groupStart = -1;\n                    advanceFrameBy(1);\n                    break;\n                case '^':\n                    if (subscriptionFrame !== Number.POSITIVE_INFINITY) {\n                        throw new Error('found a second subscription point \\'^\\' in a ' +\n                            'subscription marble diagram. There can only be one.');\n                    }\n                    subscriptionFrame = groupStart > -1 ? groupStart : frame;\n                    advanceFrameBy(1);\n                    break;\n                case '!':\n                    if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {\n                        throw new Error('found a second subscription point \\'^\\' in a ' +\n                            'subscription marble diagram. There can only be one.');\n                    }\n                    unsubscriptionFrame = groupStart > -1 ? groupStart : frame;\n                    break;\n                default:\n                    if (runMode && c.match(/^[0-9]$/)) {\n                        if (i === 0 || marbles[i - 1] === ' ') {\n                            var buffer = marbles.slice(i);\n                            var match = buffer.match(/^([0-9]+(?:\\.[0-9]+)?)(ms|s|m) /);\n                            if (match) {\n                                i += match[0].length - 1;\n                                var duration = parseFloat(match[1]);\n                                var unit = match[2];\n                                var durationInMs = void 0;\n                                switch (unit) {\n                                    case 'ms':\n                                        durationInMs = duration;\n                                        break;\n                                    case 's':\n                                        durationInMs = duration * 1000;\n                                        break;\n                                    case 'm':\n                                        durationInMs = duration * 1000 * 60;\n                                        break;\n                                    default:\n                                        break;\n                                }\n                                advanceFrameBy(durationInMs / this_1.frameTimeFactor);\n                                break;\n                            }\n                        }\n                    }\n                    throw new Error('there can only be \\'^\\' and \\'!\\' markers in a ' +\n                        'subscription marble diagram. Found instead \\'' + c + '\\'.');\n            }\n            frame = nextFrame;\n            out_i_1 = i;\n        };\n        var this_1 = this, out_i_1;\n        for (var i = 0; i < len; i++) {\n            _loop_1(i);\n            i = out_i_1;\n        }\n        if (unsubscriptionFrame < 0) {\n            return new SubscriptionLog(subscriptionFrame);\n        }\n        else {\n            return new SubscriptionLog(subscriptionFrame, unsubscriptionFrame);\n        }\n    };\n    TestScheduler.parseMarbles = function (marbles, values, errorValue, materializeInnerObservables, runMode) {\n        var _this = this;\n        if (materializeInnerObservables === void 0) { materializeInnerObservables = false; }\n        if (runMode === void 0) { runMode = false; }\n        if (marbles.indexOf('!') !== -1) {\n            throw new Error('conventional marble diagrams cannot have the ' +\n                'unsubscription marker \"!\"');\n        }\n        var len = marbles.length;\n        var testMessages = [];\n        var subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');\n        var frame = subIndex === -1 ? 0 : (subIndex * -this.frameTimeFactor);\n        var getValue = typeof values !== 'object' ?\n            function (x) { return x; } :\n            function (x) {\n                if (materializeInnerObservables && values[x] instanceof ColdObservable) {\n                    return values[x].messages;\n                }\n                return values[x];\n            };\n        var groupStart = -1;\n        var _loop_2 = function (i) {\n            var nextFrame = frame;\n            var advanceFrameBy = function (count) {\n                nextFrame += count * _this.frameTimeFactor;\n            };\n            var notification = void 0;\n            var c = marbles[i];\n            switch (c) {\n                case ' ':\n                    if (!runMode) {\n                        advanceFrameBy(1);\n                    }\n                    break;\n                case '-':\n                    advanceFrameBy(1);\n                    break;\n                case '(':\n                    groupStart = frame;\n                    advanceFrameBy(1);\n                    break;\n                case ')':\n                    groupStart = -1;\n                    advanceFrameBy(1);\n                    break;\n                case '|':\n                    notification = Notification.createComplete();\n                    advanceFrameBy(1);\n                    break;\n                case '^':\n                    advanceFrameBy(1);\n                    break;\n                case '#':\n                    notification = Notification.createError(errorValue || 'error');\n                    advanceFrameBy(1);\n                    break;\n                default:\n                    if (runMode && c.match(/^[0-9]$/)) {\n                        if (i === 0 || marbles[i - 1] === ' ') {\n                            var buffer = marbles.slice(i);\n                            var match = buffer.match(/^([0-9]+(?:\\.[0-9]+)?)(ms|s|m) /);\n                            if (match) {\n                                i += match[0].length - 1;\n                                var duration = parseFloat(match[1]);\n                                var unit = match[2];\n                                var durationInMs = void 0;\n                                switch (unit) {\n                                    case 'ms':\n                                        durationInMs = duration;\n                                        break;\n                                    case 's':\n                                        durationInMs = duration * 1000;\n                                        break;\n                                    case 'm':\n                                        durationInMs = duration * 1000 * 60;\n                                        break;\n                                    default:\n                                        break;\n                                }\n                                advanceFrameBy(durationInMs / this_2.frameTimeFactor);\n                                break;\n                            }\n                        }\n                    }\n                    notification = Notification.createNext(getValue(c));\n                    advanceFrameBy(1);\n                    break;\n            }\n            if (notification) {\n                testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification: notification });\n            }\n            frame = nextFrame;\n            out_i_2 = i;\n        };\n        var this_2 = this, out_i_2;\n        for (var i = 0; i < len; i++) {\n            _loop_2(i);\n            i = out_i_2;\n        }\n        return testMessages;\n    };\n    TestScheduler.prototype.run = function (callback) {\n        var prevFrameTimeFactor = TestScheduler.frameTimeFactor;\n        var prevMaxFrames = this.maxFrames;\n        TestScheduler.frameTimeFactor = 1;\n        this.maxFrames = Number.POSITIVE_INFINITY;\n        this.runMode = true;\n        AsyncScheduler.delegate = this;\n        var helpers = {\n            cold: this.createColdObservable.bind(this),\n            hot: this.createHotObservable.bind(this),\n            flush: this.flush.bind(this),\n            expectObservable: this.expectObservable.bind(this),\n            expectSubscriptions: this.expectSubscriptions.bind(this),\n        };\n        try {\n            var ret = callback(helpers);\n            this.flush();\n            return ret;\n        }\n        finally {\n            TestScheduler.frameTimeFactor = prevFrameTimeFactor;\n            this.maxFrames = prevMaxFrames;\n            this.runMode = false;\n            AsyncScheduler.delegate = undefined;\n        }\n    };\n    return TestScheduler;\n}(VirtualTimeScheduler));\nexport { TestScheduler };\n//# sourceMappingURL=TestScheduler.js.map","var __window = typeof window !== 'undefined' && window;\nvar __self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&\n    self instanceof WorkerGlobalScope && self;\nvar __global = typeof global !== 'undefined' && global;\nvar _root = __window || __global || __self;\n(function () {\n    if (!_root) {\n        throw new Error('RxJS could not find any global context (window, self, global)');\n    }\n})();\nexport { _root as root };\n//# sourceMappingURL=root.js.map","import * as tslib_1 from \"tslib\";\nimport { root } from '../../util/root';\nimport { Observable } from '../../Observable';\nimport { Subscriber } from '../../Subscriber';\nimport { map } from '../../operators/map';\nfunction getCORSRequest() {\n    if (root.XMLHttpRequest) {\n        return new root.XMLHttpRequest();\n    }\n    else if (!!root.XDomainRequest) {\n        return new root.XDomainRequest();\n    }\n    else {\n        throw new Error('CORS is not supported by your browser');\n    }\n}\nfunction getXMLHttpRequest() {\n    if (root.XMLHttpRequest) {\n        return new root.XMLHttpRequest();\n    }\n    else {\n        var progId = void 0;\n        try {\n            var progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];\n            for (var i = 0; i < 3; i++) {\n                try {\n                    progId = progIds[i];\n                    if (new root.ActiveXObject(progId)) {\n                        break;\n                    }\n                }\n                catch (e) {\n                }\n            }\n            return new root.ActiveXObject(progId);\n        }\n        catch (e) {\n            throw new Error('XMLHttpRequest is not supported by your browser');\n        }\n    }\n}\nexport function ajaxGet(url, headers) {\n    if (headers === void 0) { headers = null; }\n    return new AjaxObservable({ method: 'GET', url: url, headers: headers });\n}\nexport function ajaxPost(url, body, headers) {\n    return new AjaxObservable({ method: 'POST', url: url, body: body, headers: headers });\n}\nexport function ajaxDelete(url, headers) {\n    return new AjaxObservable({ method: 'DELETE', url: url, headers: headers });\n}\nexport function ajaxPut(url, body, headers) {\n    return new AjaxObservable({ method: 'PUT', url: url, body: body, headers: headers });\n}\nexport function ajaxPatch(url, body, headers) {\n    return new AjaxObservable({ method: 'PATCH', url: url, body: body, headers: headers });\n}\nvar mapResponse = map(function (x, index) { return x.response; });\nexport function ajaxGetJSON(url, headers) {\n    return mapResponse(new AjaxObservable({\n        method: 'GET',\n        url: url,\n        responseType: 'json',\n        headers: headers\n    }));\n}\nvar AjaxObservable = (function (_super) {\n    tslib_1.__extends(AjaxObservable, _super);\n    function AjaxObservable(urlOrRequest) {\n        var _this = _super.call(this) || this;\n        var request = {\n            async: true,\n            createXHR: function () {\n                return this.crossDomain ? getCORSRequest() : getXMLHttpRequest();\n            },\n            crossDomain: true,\n            withCredentials: false,\n            headers: {},\n            method: 'GET',\n            responseType: 'json',\n            timeout: 0\n        };\n        if (typeof urlOrRequest === 'string') {\n            request.url = urlOrRequest;\n        }\n        else {\n            for (var prop in urlOrRequest) {\n                if (urlOrRequest.hasOwnProperty(prop)) {\n                    request[prop] = urlOrRequest[prop];\n                }\n            }\n        }\n        _this.request = request;\n        return _this;\n    }\n    AjaxObservable.prototype._subscribe = function (subscriber) {\n        return new AjaxSubscriber(subscriber, this.request);\n    };\n    AjaxObservable.create = (function () {\n        var create = function (urlOrRequest) {\n            return new AjaxObservable(urlOrRequest);\n        };\n        create.get = ajaxGet;\n        create.post = ajaxPost;\n        create.delete = ajaxDelete;\n        create.put = ajaxPut;\n        create.patch = ajaxPatch;\n        create.getJSON = ajaxGetJSON;\n        return create;\n    })();\n    return AjaxObservable;\n}(Observable));\nexport { AjaxObservable };\nvar AjaxSubscriber = (function (_super) {\n    tslib_1.__extends(AjaxSubscriber, _super);\n    function AjaxSubscriber(destination, request) {\n        var _this = _super.call(this, destination) || this;\n        _this.request = request;\n        _this.done = false;\n        var headers = request.headers = request.headers || {};\n        if (!request.crossDomain && !_this.getHeader(headers, 'X-Requested-With')) {\n            headers['X-Requested-With'] = 'XMLHttpRequest';\n        }\n        var contentTypeHeader = _this.getHeader(headers, 'Content-Type');\n        if (!contentTypeHeader && !(root.FormData && request.body instanceof root.FormData) && typeof request.body !== 'undefined') {\n            headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';\n        }\n        request.body = _this.serializeBody(request.body, _this.getHeader(request.headers, 'Content-Type'));\n        _this.send();\n        return _this;\n    }\n    AjaxSubscriber.prototype.next = function (e) {\n        this.done = true;\n        var _a = this, xhr = _a.xhr, request = _a.request, destination = _a.destination;\n        var result;\n        try {\n            result = new AjaxResponse(e, xhr, request);\n        }\n        catch (err) {\n            return destination.error(err);\n        }\n        destination.next(result);\n    };\n    AjaxSubscriber.prototype.send = function () {\n        var _a = this, request = _a.request, _b = _a.request, user = _b.user, method = _b.method, url = _b.url, async = _b.async, password = _b.password, headers = _b.headers, body = _b.body;\n        try {\n            var xhr = this.xhr = request.createXHR();\n            this.setupEvents(xhr, request);\n            if (user) {\n                xhr.open(method, url, async, user, password);\n            }\n            else {\n                xhr.open(method, url, async);\n            }\n            if (async) {\n                xhr.timeout = request.timeout;\n                xhr.responseType = request.responseType;\n            }\n            if ('withCredentials' in xhr) {\n                xhr.withCredentials = !!request.withCredentials;\n            }\n            this.setHeaders(xhr, headers);\n            if (body) {\n                xhr.send(body);\n            }\n            else {\n                xhr.send();\n            }\n        }\n        catch (err) {\n            this.error(err);\n        }\n    };\n    AjaxSubscriber.prototype.serializeBody = function (body, contentType) {\n        if (!body || typeof body === 'string') {\n            return body;\n        }\n        else if (root.FormData && body instanceof root.FormData) {\n            return body;\n        }\n        if (contentType) {\n            var splitIndex = contentType.indexOf(';');\n            if (splitIndex !== -1) {\n                contentType = contentType.substring(0, splitIndex);\n            }\n        }\n        switch (contentType) {\n            case 'application/x-www-form-urlencoded':\n                return Object.keys(body).map(function (key) { return encodeURIComponent(key) + \"=\" + encodeURIComponent(body[key]); }).join('&');\n            case 'application/json':\n                return JSON.stringify(body);\n            default:\n                return body;\n        }\n    };\n    AjaxSubscriber.prototype.setHeaders = function (xhr, headers) {\n        for (var key in headers) {\n            if (headers.hasOwnProperty(key)) {\n                xhr.setRequestHeader(key, headers[key]);\n            }\n        }\n    };\n    AjaxSubscriber.prototype.getHeader = function (headers, headerName) {\n        for (var key in headers) {\n            if (key.toLowerCase() === headerName.toLowerCase()) {\n                return headers[key];\n            }\n        }\n        return undefined;\n    };\n    AjaxSubscriber.prototype.setupEvents = function (xhr, request) {\n        var progressSubscriber = request.progressSubscriber;\n        function xhrTimeout(e) {\n            var _a = xhrTimeout, subscriber = _a.subscriber, progressSubscriber = _a.progressSubscriber, request = _a.request;\n            if (progressSubscriber) {\n                progressSubscriber.error(e);\n            }\n            var error;\n            try {\n                error = new AjaxTimeoutError(this, request);\n            }\n            catch (err) {\n                error = err;\n            }\n            subscriber.error(error);\n        }\n        xhr.ontimeout = xhrTimeout;\n        xhrTimeout.request = request;\n        xhrTimeout.subscriber = this;\n        xhrTimeout.progressSubscriber = progressSubscriber;\n        if (xhr.upload && 'withCredentials' in xhr) {\n            if (progressSubscriber) {\n                var xhrProgress_1;\n                xhrProgress_1 = function (e) {\n                    var progressSubscriber = xhrProgress_1.progressSubscriber;\n                    progressSubscriber.next(e);\n                };\n                if (root.XDomainRequest) {\n                    xhr.onprogress = xhrProgress_1;\n                }\n                else {\n                    xhr.upload.onprogress = xhrProgress_1;\n                }\n                xhrProgress_1.progressSubscriber = progressSubscriber;\n            }\n            var xhrError_1;\n            xhrError_1 = function (e) {\n                var _a = xhrError_1, progressSubscriber = _a.progressSubscriber, subscriber = _a.subscriber, request = _a.request;\n                if (progressSubscriber) {\n                    progressSubscriber.error(e);\n                }\n                var error;\n                try {\n                    error = new AjaxError('ajax error', this, request);\n                }\n                catch (err) {\n                    error = err;\n                }\n                subscriber.error(error);\n            };\n            xhr.onerror = xhrError_1;\n            xhrError_1.request = request;\n            xhrError_1.subscriber = this;\n            xhrError_1.progressSubscriber = progressSubscriber;\n        }\n        function xhrReadyStateChange(e) {\n            return;\n        }\n        xhr.onreadystatechange = xhrReadyStateChange;\n        xhrReadyStateChange.subscriber = this;\n        xhrReadyStateChange.progressSubscriber = progressSubscriber;\n        xhrReadyStateChange.request = request;\n        function xhrLoad(e) {\n            var _a = xhrLoad, subscriber = _a.subscriber, progressSubscriber = _a.progressSubscriber, request = _a.request;\n            if (this.readyState === 4) {\n                var status_1 = this.status === 1223 ? 204 : this.status;\n                var response = (this.responseType === 'text' ? (this.response || this.responseText) : this.response);\n                if (status_1 === 0) {\n                    status_1 = response ? 200 : 0;\n                }\n                if (status_1 < 400) {\n                    if (progressSubscriber) {\n                        progressSubscriber.complete();\n                    }\n                    subscriber.next(e);\n                    subscriber.complete();\n                }\n                else {\n                    if (progressSubscriber) {\n                        progressSubscriber.error(e);\n                    }\n                    var error = void 0;\n                    try {\n                        error = new AjaxError('ajax error ' + status_1, this, request);\n                    }\n                    catch (err) {\n                        error = err;\n                    }\n                    subscriber.error(error);\n                }\n            }\n        }\n        xhr.onload = xhrLoad;\n        xhrLoad.subscriber = this;\n        xhrLoad.progressSubscriber = progressSubscriber;\n        xhrLoad.request = request;\n    };\n    AjaxSubscriber.prototype.unsubscribe = function () {\n        var _a = this, done = _a.done, xhr = _a.xhr;\n        if (!done && xhr && xhr.readyState !== 4 && typeof xhr.abort === 'function') {\n            xhr.abort();\n        }\n        _super.prototype.unsubscribe.call(this);\n    };\n    return AjaxSubscriber;\n}(Subscriber));\nexport { AjaxSubscriber };\nvar AjaxResponse = (function () {\n    function AjaxResponse(originalEvent, xhr, request) {\n        this.originalEvent = originalEvent;\n        this.xhr = xhr;\n        this.request = request;\n        this.status = xhr.status;\n        this.responseType = xhr.responseType || request.responseType;\n        this.response = parseXhrResponse(this.responseType, xhr);\n    }\n    return AjaxResponse;\n}());\nexport { AjaxResponse };\nvar AjaxErrorImpl = (function () {\n    function AjaxErrorImpl(message, xhr, request) {\n        Error.call(this);\n        this.message = message;\n        this.name = 'AjaxError';\n        this.xhr = xhr;\n        this.request = request;\n        this.status = xhr.status;\n        this.responseType = xhr.responseType || request.responseType;\n        this.response = parseXhrResponse(this.responseType, xhr);\n        return this;\n    }\n    AjaxErrorImpl.prototype = Object.create(Error.prototype);\n    return AjaxErrorImpl;\n})();\nexport var AjaxError = AjaxErrorImpl;\nfunction parseJson(xhr) {\n    if ('response' in xhr) {\n        return xhr.responseType ? xhr.response : JSON.parse(xhr.response || xhr.responseText || 'null');\n    }\n    else {\n        return JSON.parse(xhr.responseText || 'null');\n    }\n}\nfunction parseXhrResponse(responseType, xhr) {\n    switch (responseType) {\n        case 'json':\n            return parseJson(xhr);\n        case 'xml':\n            return xhr.responseXML;\n        case 'text':\n        default:\n            return ('response' in xhr) ? xhr.response : xhr.responseText;\n    }\n}\nfunction AjaxTimeoutErrorImpl(xhr, request) {\n    AjaxError.call(this, 'ajax timeout', xhr, request);\n    this.name = 'AjaxTimeoutError';\n    return this;\n}\nexport var AjaxTimeoutError = AjaxTimeoutErrorImpl;\n//# sourceMappingURL=AjaxObservable.js.map","import { AjaxObservable } from './AjaxObservable';\nexport var ajax = (function () { return AjaxObservable.create; })();\n//# sourceMappingURL=ajax.js.map","import * as tslib_1 from \"tslib\";\nimport { Subject, AnonymousSubject } from '../../Subject';\nimport { Subscriber } from '../../Subscriber';\nimport { Observable } from '../../Observable';\nimport { Subscription } from '../../Subscription';\nimport { ReplaySubject } from '../../ReplaySubject';\nvar DEFAULT_WEBSOCKET_CONFIG = {\n    url: '',\n    deserializer: function (e) { return JSON.parse(e.data); },\n    serializer: function (value) { return JSON.stringify(value); },\n};\nvar WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT = 'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';\nvar WebSocketSubject = (function (_super) {\n    tslib_1.__extends(WebSocketSubject, _super);\n    function WebSocketSubject(urlConfigOrSource, destination) {\n        var _this = _super.call(this) || this;\n        if (urlConfigOrSource instanceof Observable) {\n            _this.destination = destination;\n            _this.source = urlConfigOrSource;\n        }\n        else {\n            var config = _this._config = tslib_1.__assign({}, DEFAULT_WEBSOCKET_CONFIG);\n            _this._output = new Subject();\n            if (typeof urlConfigOrSource === 'string') {\n                config.url = urlConfigOrSource;\n            }\n            else {\n                for (var key in urlConfigOrSource) {\n                    if (urlConfigOrSource.hasOwnProperty(key)) {\n                        config[key] = urlConfigOrSource[key];\n                    }\n                }\n            }\n            if (!config.WebSocketCtor && WebSocket) {\n                config.WebSocketCtor = WebSocket;\n            }\n            else if (!config.WebSocketCtor) {\n                throw new Error('no WebSocket constructor can be found');\n            }\n            _this.destination = new ReplaySubject();\n        }\n        return _this;\n    }\n    WebSocketSubject.prototype.lift = function (operator) {\n        var sock = new WebSocketSubject(this._config, this.destination);\n        sock.operator = operator;\n        sock.source = this;\n        return sock;\n    };\n    WebSocketSubject.prototype._resetState = function () {\n        this._socket = null;\n        if (!this.source) {\n            this.destination = new ReplaySubject();\n        }\n        this._output = new Subject();\n    };\n    WebSocketSubject.prototype.multiplex = function (subMsg, unsubMsg, messageFilter) {\n        var self = this;\n        return new Observable(function (observer) {\n            try {\n                self.next(subMsg());\n            }\n            catch (err) {\n                observer.error(err);\n            }\n            var subscription = self.subscribe(function (x) {\n                try {\n                    if (messageFilter(x)) {\n                        observer.next(x);\n                    }\n                }\n                catch (err) {\n                    observer.error(err);\n                }\n            }, function (err) { return observer.error(err); }, function () { return observer.complete(); });\n            return function () {\n                try {\n                    self.next(unsubMsg());\n                }\n                catch (err) {\n                    observer.error(err);\n                }\n                subscription.unsubscribe();\n            };\n        });\n    };\n    WebSocketSubject.prototype._connectSocket = function () {\n        var _this = this;\n        var _a = this._config, WebSocketCtor = _a.WebSocketCtor, protocol = _a.protocol, url = _a.url, binaryType = _a.binaryType;\n        var observer = this._output;\n        var socket = null;\n        try {\n            socket = protocol ?\n                new WebSocketCtor(url, protocol) :\n                new WebSocketCtor(url);\n            this._socket = socket;\n            if (binaryType) {\n                this._socket.binaryType = binaryType;\n            }\n        }\n        catch (e) {\n            observer.error(e);\n            return;\n        }\n        var subscription = new Subscription(function () {\n            _this._socket = null;\n            if (socket && socket.readyState === 1) {\n                socket.close();\n            }\n        });\n        socket.onopen = function (e) {\n            var _socket = _this._socket;\n            if (!_socket) {\n                socket.close();\n                _this._resetState();\n                return;\n            }\n            var openObserver = _this._config.openObserver;\n            if (openObserver) {\n                openObserver.next(e);\n            }\n            var queue = _this.destination;\n            _this.destination = Subscriber.create(function (x) {\n                if (socket.readyState === 1) {\n                    try {\n                        var serializer = _this._config.serializer;\n                        socket.send(serializer(x));\n                    }\n                    catch (e) {\n                        _this.destination.error(e);\n                    }\n                }\n            }, function (e) {\n                var closingObserver = _this._config.closingObserver;\n                if (closingObserver) {\n                    closingObserver.next(undefined);\n                }\n                if (e && e.code) {\n                    socket.close(e.code, e.reason);\n                }\n                else {\n                    observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));\n                }\n                _this._resetState();\n            }, function () {\n                var closingObserver = _this._config.closingObserver;\n                if (closingObserver) {\n                    closingObserver.next(undefined);\n                }\n                socket.close();\n                _this._resetState();\n            });\n            if (queue && queue instanceof ReplaySubject) {\n                subscription.add(queue.subscribe(_this.destination));\n            }\n        };\n        socket.onerror = function (e) {\n            _this._resetState();\n            observer.error(e);\n        };\n        socket.onclose = function (e) {\n            _this._resetState();\n            var closeObserver = _this._config.closeObserver;\n            if (closeObserver) {\n                closeObserver.next(e);\n            }\n            if (e.wasClean) {\n                observer.complete();\n            }\n            else {\n                observer.error(e);\n            }\n        };\n        socket.onmessage = function (e) {\n            try {\n                var deserializer = _this._config.deserializer;\n                observer.next(deserializer(e));\n            }\n            catch (err) {\n                observer.error(err);\n            }\n        };\n    };\n    WebSocketSubject.prototype._subscribe = function (subscriber) {\n        var _this = this;\n        var source = this.source;\n        if (source) {\n            return source.subscribe(subscriber);\n        }\n        if (!this._socket) {\n            this._connectSocket();\n        }\n        this._output.subscribe(subscriber);\n        subscriber.add(function () {\n            var _socket = _this._socket;\n            if (_this._output.observers.length === 0) {\n                if (_socket && _socket.readyState === 1) {\n                    _socket.close();\n                }\n                _this._resetState();\n            }\n        });\n        return subscriber;\n    };\n    WebSocketSubject.prototype.unsubscribe = function () {\n        var _socket = this._socket;\n        if (_socket && _socket.readyState === 1) {\n            _socket.close();\n        }\n        this._resetState();\n        _super.prototype.unsubscribe.call(this);\n    };\n    return WebSocketSubject;\n}(AnonymousSubject));\nexport { WebSocketSubject };\n//# sourceMappingURL=WebSocketSubject.js.map","import { WebSocketSubject } from './WebSocketSubject';\nexport function webSocket(urlConfigOrSource) {\n    return new WebSocketSubject(urlConfigOrSource);\n}\n//# sourceMappingURL=webSocket.js.map","import * as tslib_1 from \"tslib\";\nimport { Observable } from '../../Observable';\nexport function fromFetch(input, init) {\n    return new Observable(function (subscriber) {\n        var controller = new AbortController();\n        var signal = controller.signal;\n        var outerSignalHandler;\n        var abortable = true;\n        var unsubscribed = false;\n        if (init) {\n            if (init.signal) {\n                if (init.signal.aborted) {\n                    controller.abort();\n                }\n                else {\n                    outerSignalHandler = function () {\n                        if (!signal.aborted) {\n                            controller.abort();\n                        }\n                    };\n                    init.signal.addEventListener('abort', outerSignalHandler);\n                }\n            }\n            init = tslib_1.__assign({}, init, { signal: signal });\n        }\n        else {\n            init = { signal: signal };\n        }\n        fetch(input, init).then(function (response) {\n            abortable = false;\n            subscriber.next(response);\n            subscriber.complete();\n        }).catch(function (err) {\n            abortable = false;\n            if (!unsubscribed) {\n                subscriber.error(err);\n            }\n        });\n        return function () {\n            unsubscribed = true;\n            if (abortable) {\n                controller.abort();\n            }\n        };\n    });\n}\n//# sourceMappingURL=fetch.js.map","export * from '../index';\nimport * as _operators from '../operators/index';\nexport var operators = _operators;\nimport * as _testing from '../testing/index';\nexport var testing = _testing;\nimport * as _ajax from '../ajax/index';\nexport var ajax = _ajax;\nimport * as _webSocket from '../webSocket/index';\nexport var webSocket = _webSocket;\nimport * as _fetch from '../fetch/index';\nexport var fetch = _fetch;\n//# sourceMappingURL=umd.js.map"],"names":["tslib_1.__extends","emptyObserver","rxSubscriberSymbol","observable","Symbol_observable","higherOrderRefCount","RefCountSubscriber","refCount","empty","NotificationKind","dispatch","dispatchError","dispatchNext","iterator","Symbol_iterator","combineLatest","concat","concatStatic","merge","mergeStatic","onErrorResumeNext","partition","race","raceStatic","window","WindowOperator","WindowSubscriber","zip","zipStatic","root","tslib_1.__assign","ajax","webSocket","fetch"],"mappings":"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"}
diff --git a/node_modules/rxjs/bundles/rxjs.umd.min.js b/node_modules/rxjs/bundles/rxjs.umd.min.js
deleted file mode 100644
index 9fbb69e..0000000
--- a/node_modules/rxjs/bundles/rxjs.umd.min.js
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
-  @license
-  Apache License 2.0 https://github.com/ReactiveX/RxJS/blob/master/LICENSE.txt
- **/
-/**
-  @license
-  Apache License 2.0 https://github.com/ReactiveX/RxJS/blob/master/LICENSE.txt
- **/
-/*
- *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-*****************************************************************************/
-(function(k,h){"object"===typeof exports&&"undefined"!==typeof module?h(exports):"function"===typeof define&&define.amd?define("rxjs",["exports"],h):h(k.rxjs={})})(this,function(k){function h(c,a){function b(){this.constructor=c}Kb(c,a);c.prototype=null===a?Object.create(a):(b.prototype=a.prototype,new b)}function P(c){return"function"===typeof c}function Q(c){setTimeout(function(){throw c;},0)}function ra(c){return null!==c&&"object"===typeof c}function Ka(c){return c.reduce(function(a,b){return a.concat(b instanceof
-Y?b.errors:b)},[])}function sa(c){for(;c;){var a=c.destination,b=c.isStopped;if(c.closed||b)return!1;c=a&&a instanceof m?a:null}return!0}function D(){}function ta(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];return La(c)}function La(c){return c?1===c.length?c[0]:function(a){return c.reduce(function(b,a){return a(b)},a)}:D}function Ma(c){c||(c=C.Promise||Promise);if(!c)throw Error("no Promise impl found");return c}function ua(){return function(c){return c.lift(new Lb(c))}}function R(c){return c?
-Mb(c):S}function Mb(c){return new n(function(a){return c.schedule(function(){return a.complete()})})}function A(c){return c&&"function"===typeof c.schedule}function va(c,a){return new n(function(b){var d=new t,e=0;d.add(a.schedule(function(){e===c.length?b.complete():(b.next(c[e++]),b.closed||d.add(this.schedule()))}));return d})}function Z(c,a){return a?va(c,a):new n(Na(c))}function ga(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];a=c[c.length-1];return A(a)?(c.pop(),va(c,a)):Z(c)}
-function wa(c,a){return a?new n(function(b){return a.schedule(Nb,0,{error:c,subscriber:b})}):new n(function(b){return b.error(c)})}function Nb(c){c.subscriber.error(c.error)}function Oa(c){return c in xa?(delete xa[c],!0):!1}function J(c){return c}function B(c,a){return function(b){if("function"!==typeof c)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return b.lift(new Ob(c,a))}}function Pa(c,a,b){if(a)if(A(a))b=a;else return function(){for(var d=[],e=0;e<arguments.length;e++)d[e]=
-arguments[e];return Pa(c,b).apply(void 0,d).pipe(B(function(b){return x(b)?a.apply(void 0,b):a(b)}))};return function(){for(var a=[],e=0;e<arguments.length;e++)a[e]=arguments[e];var f=this,g,l={context:f,subject:g,callbackFunc:c,scheduler:b};return new n(function(d){if(b)return b.schedule(Pb,0,{args:a,subscriber:d,params:l});if(!g){g=new T;try{c.apply(f,a.concat([function(){for(var b=[],a=0;a<arguments.length;a++)b[a]=arguments[a];g.next(1>=b.length?b[0]:b);g.complete()}]))}catch(K){sa(g)?g.error(K):
-console.warn(K)}}return g.subscribe(d)})}}function Pb(c){var a=this,b=c.args,d=c.subscriber;c=c.params;var e=c.callbackFunc,f=c.context,g=c.scheduler,l=c.subject;if(!l){l=c.subject=new T;try{e.apply(f,b.concat([function(){for(var b=[],c=0;c<arguments.length;c++)b[c]=arguments[c];a.add(g.schedule(Qb,0,{value:1>=b.length?b[0]:b,subject:l}))}]))}catch(u){l.error(u)}}this.add(l.subscribe(d))}function Qb(c){var a=c.subject;a.next(c.value);a.complete()}function Qa(c,a,b){if(a)if(A(a))b=a;else return function(){for(var d=
-[],e=0;e<arguments.length;e++)d[e]=arguments[e];return Qa(c,b).apply(void 0,d).pipe(B(function(b){return x(b)?a.apply(void 0,b):a(b)}))};return function(){for(var a=[],e=0;e<arguments.length;e++)a[e]=arguments[e];var f={subject:void 0,args:a,callbackFunc:c,scheduler:b,context:this};return new n(function(d){var e=f.context,g=f.subject;if(b)return b.schedule(Rb,0,{params:f,subscriber:d,context:e});if(!g){g=f.subject=new T;try{c.apply(e,a.concat([function(){for(var b=[],a=0;a<arguments.length;a++)b[a]=
-arguments[a];(a=b.shift())?g.error(a):(g.next(1>=b.length?b[0]:b),g.complete())}]))}catch(K){sa(g)?g.error(K):console.warn(K)}}return g.subscribe(d)})}}function Rb(c){var a=this,b=c.params,d=c.subscriber;c=c.context;var e=b.callbackFunc,f=b.args,g=b.scheduler,l=b.subject;if(!l){l=b.subject=new T;try{e.apply(c,f.concat([function(){for(var b=[],c=0;c<arguments.length;c++)b[c]=arguments[c];(c=b.shift())?a.add(g.schedule(Ra,0,{err:c,subject:l})):a.add(g.schedule(Sb,0,{value:1>=b.length?b[0]:b,subject:l}))}]))}catch(u){this.add(g.schedule(Ra,
-0,{err:u,subject:l}))}}this.add(l.subscribe(d))}function Sb(c){var a=c.subject;a.next(c.value);a.complete()}function Ra(c){c.subject.error(c.err)}function Sa(c){return!!c&&"function"!==typeof c.subscribe&&"function"===typeof c.then}function p(c,a,b,d,e){void 0===e&&(e=new G(c,b,d));if(!e.closed)return a instanceof n?a.subscribe(e):ha(a)(e)}function Tb(c,a){return new n(function(b){var d=new t;d.add(a.schedule(function(){var e=c[U]();d.add(e.subscribe({next:function(c){d.add(a.schedule(function(){return b.next(c)}))},
-error:function(c){d.add(a.schedule(function(){return b.error(c)}))},complete:function(){d.add(a.schedule(function(){return b.complete()}))}}))}));return d})}function Ub(c,a){return new n(function(b){var d=new t;d.add(a.schedule(function(){return c.then(function(c){d.add(a.schedule(function(){b.next(c);d.add(a.schedule(function(){return b.complete()}))}))},function(c){d.add(a.schedule(function(){return b.error(c)}))})}));return d})}function Vb(c,a){if(!c)throw Error("Iterable cannot be null");return new n(function(b){var d=
-new t,e;d.add(function(){e&&"function"===typeof e.return&&e.return()});d.add(a.schedule(function(){e=c[E]();d.add(a.schedule(function(){if(!b.closed){var a,c;try{var d=e.next();a=d.value;c=d.done}catch(u){b.error(u);return}c?b.complete():(b.next(a),this.schedule())}}))}));return d})}function Ta(c,a){if(null!=c){if(c&&"function"===typeof c[U])return Tb(c,a);if(Sa(c))return Ub(c,a);if(Ua(c))return va(c,a);if(c&&"function"===typeof c[E]||"string"===typeof c)return Vb(c,a)}throw new TypeError((null!==
-c&&typeof c||c)+" is not observable");}function F(c,a){return a?Ta(c,a):c instanceof n?c:new n(ha(c))}function L(c,a,b){void 0===b&&(b=Number.POSITIVE_INFINITY);if("function"===typeof a)return function(d){return d.pipe(L(function(b,d){return F(c(b,d)).pipe(B(function(c,e){return a(b,c,d,e)}))},b))};"number"===typeof a&&(b=a);return function(a){return a.lift(new Wb(c,b))}}function ya(c){void 0===c&&(c=Number.POSITIVE_INFINITY);return L(J,c)}function Va(){return ya(1)}function aa(){for(var c=[],a=0;a<
-arguments.length;a++)c[a]=arguments[a];return Va()(ga.apply(void 0,c))}function za(c){return new n(function(a){var b;try{b=c()}catch(d){a.error(d);return}return(b?F(b):R()).subscribe(a)})}function ia(c,a){return new n(function(b){var d=c.length;if(0===d)b.complete();else for(var e=Array(d),f=0,g=0,l=function(l){var h=F(c[l]),u=!1;b.add(h.subscribe({next:function(b){u||(u=!0,g++);e[l]=b},error:function(a){return b.error(a)},complete:function(){f++;f!==d&&u||(g===d&&b.next(a?a.reduce(function(b,a,c){return b[a]=
-e[c],b},{}):e),b.complete())}}))},h=0;h<d;h++)l(h)})}function Wa(c,a,b,d){P(b)&&(d=b,b=void 0);return d?Wa(c,a,b).pipe(B(function(b){return x(b)?d.apply(void 0,b):d(b)})):new n(function(d){Xa(c,a,function(b){1<arguments.length?d.next(Array.prototype.slice.call(arguments)):d.next(b)},d,b)})}function Xa(c,a,b,d,e){var f;if(c&&"function"===typeof c.addEventListener&&"function"===typeof c.removeEventListener)c.addEventListener(a,b,e),f=function(){return c.removeEventListener(a,b,e)};else if(c&&"function"===
-typeof c.on&&"function"===typeof c.off)c.on(a,b),f=function(){return c.off(a,b)};else if(c&&"function"===typeof c.addListener&&"function"===typeof c.removeListener)c.addListener(a,b),f=function(){return c.removeListener(a,b)};else if(c&&c.length)for(var g=0,l=c.length;g<l;g++)Xa(c[g],a,b,d,e);else throw new TypeError("Invalid event target");d.add(f)}function Ya(c,a,b){return b?Ya(c,a).pipe(B(function(a){return x(a)?b.apply(void 0,a):b(a)})):new n(function(b){var d=function(){for(var a=[],c=0;c<arguments.length;c++)a[c]=
-arguments[c];return b.next(1===a.length?a[0]:a)},f;try{f=c(d)}catch(g){b.error(g);return}if(P(a))return function(){return a(d,f)}})}function $b(c){var a=c.subscriber,b=c.condition;if(!a.closed){if(c.needIterate)try{c.state=c.iterate(c.state)}catch(f){a.error(f);return}else c.needIterate=!0;if(b){var d=void 0;try{d=b(c.state)}catch(f){a.error(f);return}if(!d){a.complete();return}if(a.closed)return}var e;try{e=c.resultSelector(c.state)}catch(f){a.error(f);return}if(!a.closed&&(a.next(e),!a.closed))return this.schedule(c)}}
-function V(c){return!x(c)&&0<=c-parseFloat(c)+1}function ac(c){var a=c.subscriber,b=c.counter;c=c.period;a.next(b);this.schedule({subscriber:a,counter:b+1,period:c},c)}function Za(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];var a=Number.POSITIVE_INFINITY,b=null,d=c[c.length-1];A(d)?(b=c.pop(),1<c.length&&"number"===typeof c[c.length-1]&&(a=c.pop())):"number"===typeof d&&(a=c.pop());return null===b&&1===c.length&&c[0]instanceof n?c[0]:ya(a)(Z(c,b))}function Aa(){for(var c=[],a=0;a<
-arguments.length;a++)c[a]=arguments[a];if(0===c.length)return S;var b=c[0],d=c.slice(1);return 1===c.length&&x(b)?Aa.apply(void 0,b):new n(function(a){var c=function(){return a.add(Aa.apply(void 0,d).subscribe(a))};return F(b).subscribe({next:function(b){a.next(b)},error:c,complete:c})})}function bc(c){var a=c.keys,b=c.index,d=c.subscriber,e=c.subscription;c=c.obj;if(!d.closed)if(b<a.length){var f=a[b];d.next([f,c[f]]);e.add(this.schedule({keys:a,index:b+1,subscriber:d,subscription:e,obj:c}))}else d.complete()}
-function $a(c,a){function b(){return!b.pred.apply(b.thisArg,arguments)}b.pred=c;b.thisArg=a;return b}function H(c,a){return function(b){return b.lift(new cc(c,a))}}function ab(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];if(1===c.length)if(x(c[0]))c=c[0];else return c[0];return Z(c,void 0).lift(new dc)}function ec(c){var a=c.start,b=c.index,d=c.subscriber;b>=c.count?d.complete():(d.next(a),d.closed||(c.index=b+1,c.start=a+1,this.schedule(c)))}function bb(c,a,b){void 0===c&&(c=0);var d=
--1;V(a)?d=1>Number(a)&&1||Number(a):A(a)&&(b=a);A(b)||(b=y);return new n(function(a){var e=V(c)?c:+c-b.now();return b.schedule(fc,e,{index:0,period:d,subscriber:a})})}function fc(c){var a=c.index,b=c.period,d=c.subscriber;d.next(a);if(!d.closed){if(-1===b)return d.complete();c.index=a+1;this.schedule(c,b)}}function cb(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];a=c[c.length-1];"function"===typeof a&&c.pop();return Z(c,void 0).lift(new db(a))}function eb(c){return function(a){return a.lift(new gc(c))}}
-function fb(c){var a=c.subscriber,b=c.context;b&&a.closeContext(b);a.closed||(c.context=a.openContext(),c.context.closeAction=this.schedule(c,c.bufferTimeSpan))}function hc(c){var a=c.bufferCreationInterval,b=c.bufferTimeSpan,d=c.subscriber,e=c.scheduler,f=d.openContext();d.closed||(d.add(f.closeAction=e.schedule(gb,b,{subscriber:d,context:f})),this.schedule(c,a))}function gb(c){c.subscriber.closeContext(c.context)}function hb(c,a){return L(c,a,1)}function ic(c){c.debouncedNext()}function ba(c){void 0===
-c&&(c=null);return function(a){return a.lift(new jc(c))}}function ib(c,a){return function(b){return b.lift(new kc(c,a))}}function ja(c){void 0===c&&(c=lc);return function(a){return a.lift(new mc(c))}}function lc(){return new ca}function Ba(c){return function(a){return 0===c?R():a.lift(new nc(c))}}function jb(c,a){return a?function(b){return b.pipe(jb(function(b,e){return F(c(b,e)).pipe(B(function(c,d){return a(b,c,e,d)}))}))}:function(b){return b.lift(new oc(c))}}function ka(c){return function(a){return 0===
-c?R():a.lift(new pc(c))}}function la(c,a){var b=!1;2<=arguments.length&&(b=!0);return function(d){return d.lift(new qc(c,a,b))}}function ma(c,a){return 2<=arguments.length?function(b){return ta(la(c,a),ka(1),ba(a))(b)}:function(b){return ta(la(function(b,a,f){return c(b,a,f+1)}),ka(1))(b)}}function M(c,a){return function(b){var d;d="function"===typeof c?c:function(){return c};if("function"===typeof a)return b.lift(new rc(d,a));var e=Object.create(b,sc);e.source=b;e.subjectFactory=d;return e}}function tc(c,
-a){return function(b){var d=b;for(b=0;b<a;b++)if(d=d[c[b]],"undefined"===typeof d)return;return d}}function uc(c){var a=c.period;c.subscriber.notifyNext();this.schedule(c,a)}function vc(){return new v}function wc(c){var a=c.bufferSize,b=void 0===a?Number.POSITIVE_INFINITY:a,a=c.windowTime,d=void 0===a?Number.POSITIVE_INFINITY:a,e=c.refCount,f=c.scheduler,g,l=0,h,k=!1,r=!1;return function(a){l++;if(!g||k)k=!1,g=new W(b,d,f),h=a.subscribe({next:function(b){g.next(b)},error:function(b){k=!0;g.error(b)},
-complete:function(){r=!0;h=void 0;g.complete()}});var c=g.subscribe(this);this.add(function(){l--;c.unsubscribe();h&&!r&&e&&0===l&&(h.unsubscribe(),g=h=void 0)})}}function da(c,a){return"function"===typeof a?function(b){return b.pipe(da(function(b,e){return F(c(b,e)).pipe(B(function(c,d){return a(b,c,e,d)}))}))}:function(b){return b.lift(new xc(c))}}function yc(c){c.subscriber.clearThrottle()}function kb(c,a,b){void 0===b&&(b=y);return function(d){var e=c instanceof Date&&!isNaN(+c),f=e?+c-b.now():
-Math.abs(c);return d.lift(new zc(f,e,a,b))}}function Ac(c,a,b){if(0===b)return[a];c.push(a);return c}function Bc(c){var a=c.subscriber,b=c.windowTimeSpan,d=c.window;d&&a.closeWindow(d);c.window=a.openWindow();this.schedule(c,b)}function Cc(c){var a=c.windowTimeSpan,b=c.subscriber,d=c.scheduler,e=c.windowCreationInterval,f=b.openWindow(),g={action:this,subscription:null};g.subscription=d.schedule(lb,a,{subscriber:b,window:f,context:g});this.add(g.subscription);this.schedule(c,e)}function lb(c){var a=
-c.subscriber,b=c.window;(c=c.context)&&c.action&&c.subscription&&c.action.remove(c.subscription);a.closeWindow(b)}function mb(c,a){for(var b=0,d=a.length;b<d;b++)for(var e=a[b],f=Object.getOwnPropertyNames(e.prototype),g=0,l=f.length;g<l;g++){var h=f[g];c.prototype[h]=e.prototype[h]}}function Dc(c,a){void 0===a&&(a=null);return new N({method:"GET",url:c,headers:a})}function Ec(c,a,b){return new N({method:"POST",url:c,body:a,headers:b})}function Fc(c,a){return new N({method:"DELETE",url:c,headers:a})}
-function Gc(c,a,b){return new N({method:"PUT",url:c,body:a,headers:b})}function Hc(c,a,b){return new N({method:"PATCH",url:c,body:a,headers:b})}function Ic(c,a){return Jc(new N({method:"GET",url:c,responseType:"json",headers:a}))}function nb(c,a){switch(c){case "json":return c="response"in a?a.responseType?a.response:JSON.parse(a.response||a.responseText||"null"):JSON.parse(a.responseText||"null"),c;case "xml":return a.responseXML;default:return"response"in a?a.response:a.responseText}}var Kb=Object.setPrototypeOf||
-{__proto__:[]}instanceof Array&&function(c,a){c.__proto__=a}||function(c,a){for(var b in a)a.hasOwnProperty(b)&&(c[b]=a[b])},ob=Object.assign||function(c){for(var a,b=1,d=arguments.length;b<d;b++){a=arguments[b];for(var e in a)Object.prototype.hasOwnProperty.call(a,e)&&(c[e]=a[e])}return c},Ca=!1,C={Promise:void 0,set useDeprecatedSynchronousErrorHandling(c){c?console.warn("DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n"+Error().stack):Ca&&console.log("RxJS: Back to a better error behavior. Thank you. \x3c3");
-Ca=c},get useDeprecatedSynchronousErrorHandling(){return Ca}},na={closed:!0,next:function(c){},error:function(c){if(C.useDeprecatedSynchronousErrorHandling)throw c;Q(c)},complete:function(){}},x=function(){return Array.isArray||function(c){return c&&"number"===typeof c.length}}(),Y=function(){function c(a){Error.call(this);this.message=a?a.length+" errors occurred during unsubscription:\n"+a.map(function(b,a){return a+1+") "+b.toString()}).join("\n  "):"";this.name="UnsubscriptionError";this.errors=
-a;return this}c.prototype=Object.create(Error.prototype);return c}(),t=function(){function c(a){this.closed=!1;this._subscriptions=this._parentOrParents=null;a&&(this._unsubscribe=a)}c.prototype.unsubscribe=function(){var a;if(!this.closed){var b=this._parentOrParents,d=this._unsubscribe,e=this._subscriptions;this.closed=!0;this._subscriptions=this._parentOrParents=null;if(b instanceof c)b.remove(this);else if(null!==b)for(var f=0;f<b.length;++f)b[f].remove(this);if(P(d))try{d.call(this)}catch(g){a=
-g instanceof Y?Ka(g.errors):[g]}if(x(e))for(f=-1,b=e.length;++f<b;)if(d=e[f],ra(d))try{d.unsubscribe()}catch(g){a=a||[],g instanceof Y?a=a.concat(Ka(g.errors)):a.push(g)}if(a)throw new Y(a);}};c.prototype.add=function(a){var b=a;if(!a)return c.EMPTY;switch(typeof a){case "function":b=new c(a);case "object":if(b===this||b.closed||"function"!==typeof b.unsubscribe)return b;if(this.closed)return b.unsubscribe(),b;b instanceof c||(a=b,b=new c,b._subscriptions=[a]);break;default:throw Error("unrecognized teardown "+
-a+" added to Subscription.");}a=b._parentOrParents;if(null===a)b._parentOrParents=this;else if(a instanceof c){if(a===this)return b;b._parentOrParents=[a,this]}else if(-1===a.indexOf(this))a.push(this);else return b;a=this._subscriptions;null===a?this._subscriptions=[b]:a.push(b);return b};c.prototype.remove=function(a){var b=this._subscriptions;b&&(a=b.indexOf(a),-1!==a&&b.splice(a,1))};c.EMPTY=function(a){a.closed=!0;return a}(new c);return c}(),oa="function"===typeof Symbol?Symbol("rxSubscriber"):
-"@@rxSubscriber_"+Math.random(),m=function(c){function a(b,d,e){var f=c.call(this)||this;f.syncErrorValue=null;f.syncErrorThrown=!1;f.syncErrorThrowable=!1;f.isStopped=!1;switch(arguments.length){case 0:f.destination=na;break;case 1:if(!b){f.destination=na;break}if("object"===typeof b){b instanceof a?(f.syncErrorThrowable=b.syncErrorThrowable,f.destination=b,b.add(f)):(f.syncErrorThrowable=!0,f.destination=new pb(f,b));break}default:f.syncErrorThrowable=!0,f.destination=new pb(f,b,d,e)}return f}h(a,
-c);a.prototype[oa]=function(){return this};a.create=function(b,c,e){b=new a(b,c,e);b.syncErrorThrowable=!1;return b};a.prototype.next=function(b){this.isStopped||this._next(b)};a.prototype.error=function(b){this.isStopped||(this.isStopped=!0,this._error(b))};a.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())};a.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,c.prototype.unsubscribe.call(this))};a.prototype._next=function(b){this.destination.next(b)};
-a.prototype._error=function(b){this.destination.error(b);this.unsubscribe()};a.prototype._complete=function(){this.destination.complete();this.unsubscribe()};a.prototype._unsubscribeAndRecycle=function(){var b=this._parentOrParents;this._parentOrParents=null;this.unsubscribe();this.isStopped=this.closed=!1;this._parentOrParents=b;return this};return a}(t),pb=function(c){function a(b,a,e,f){var d=c.call(this)||this;d._parentSubscriber=b;var l;b=d;P(a)?l=a:a&&(l=a.next,e=a.error,f=a.complete,a!==na&&
-(b=Object.create(a),P(b.unsubscribe)&&d.add(b.unsubscribe.bind(b)),b.unsubscribe=d.unsubscribe.bind(d)));d._context=b;d._next=l;d._error=e;d._complete=f;return d}h(a,c);a.prototype.next=function(b){if(!this.isStopped&&this._next){var a=this._parentSubscriber;C.useDeprecatedSynchronousErrorHandling&&a.syncErrorThrowable?this.__tryOrSetError(a,this._next,b)&&this.unsubscribe():this.__tryOrUnsub(this._next,b)}};a.prototype.error=function(b){if(!this.isStopped){var a=this._parentSubscriber,c=C.useDeprecatedSynchronousErrorHandling;
-if(this._error)c&&a.syncErrorThrowable?this.__tryOrSetError(a,this._error,b):this.__tryOrUnsub(this._error,b),this.unsubscribe();else if(a.syncErrorThrowable)c?(a.syncErrorValue=b,a.syncErrorThrown=!0):Q(b),this.unsubscribe();else{this.unsubscribe();if(c)throw b;Q(b)}}};a.prototype.complete=function(){var b=this;if(!this.isStopped){var a=this._parentSubscriber;if(this._complete){var c=function(){return b._complete.call(b._context)};C.useDeprecatedSynchronousErrorHandling&&a.syncErrorThrowable?this.__tryOrSetError(a,
-c):this.__tryOrUnsub(c)}this.unsubscribe()}};a.prototype.__tryOrUnsub=function(b,a){try{b.call(this._context,a)}catch(e){this.unsubscribe();if(C.useDeprecatedSynchronousErrorHandling)throw e;Q(e)}};a.prototype.__tryOrSetError=function(b,a,c){if(!C.useDeprecatedSynchronousErrorHandling)throw Error("bad call");try{a.call(this._context,c)}catch(f){return C.useDeprecatedSynchronousErrorHandling?(b.syncErrorValue=f,b.syncErrorThrown=!0):Q(f),!0}return!1};a.prototype._unsubscribe=function(){var b=this._parentSubscriber;
-this._parentSubscriber=this._context=null;b.unsubscribe()};return a}(m),U="function"===typeof Symbol&&Symbol.observable||"@@observable",n=function(){function c(a){this._isScalar=!1;a&&(this._subscribe=a)}c.prototype.lift=function(a){var b=new c;b.source=this;b.operator=a;return b};c.prototype.subscribe=function(a,b,c){var d=this.operator;a:{if(a){if(a instanceof m)break a;if(a[oa]){a=a[oa]();break a}}a=a||b||c?new m(a,b,c):new m(na)}d?a.add(d.call(a,this.source)):a.add(this.source||C.useDeprecatedSynchronousErrorHandling&&
-!a.syncErrorThrowable?this._subscribe(a):this._trySubscribe(a));if(C.useDeprecatedSynchronousErrorHandling&&a.syncErrorThrowable&&(a.syncErrorThrowable=!1,a.syncErrorThrown))throw a.syncErrorValue;return a};c.prototype._trySubscribe=function(a){try{return this._subscribe(a)}catch(b){C.useDeprecatedSynchronousErrorHandling&&(a.syncErrorThrown=!0,a.syncErrorValue=b),sa(a)?a.error(b):console.warn(b)}};c.prototype.forEach=function(a,b){var c=this;b=Ma(b);return new b(function(b,d){var e;e=c.subscribe(function(b){try{a(b)}catch(u){d(u),
-e&&e.unsubscribe()}},d,b)})};c.prototype._subscribe=function(a){var b=this.source;return b&&b.subscribe(a)};c.prototype[U]=function(){return this};c.prototype.pipe=function(){for(var a=[],b=0;b<arguments.length;b++)a[b]=arguments[b];return 0===a.length?this:La(a)(this)};c.prototype.toPromise=function(a){var b=this;a=Ma(a);return new a(function(a,c){var d;b.subscribe(function(b){return d=b},function(b){return c(b)},function(){return a(d)})})};c.create=function(a){return new c(a)};return c}(),I=function(){function c(){Error.call(this);
-this.message="object unsubscribed";this.name="ObjectUnsubscribedError";return this}c.prototype=Object.create(Error.prototype);return c}(),qb=function(c){function a(b,a){var d=c.call(this)||this;d.subject=b;d.subscriber=a;d.closed=!1;return d}h(a,c);a.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var b=this.subject,a=b.observers;this.subject=null;!a||0===a.length||b.isStopped||b.closed||(b=a.indexOf(this.subscriber),-1!==b&&a.splice(b,1))}};return a}(t),rb=function(c){function a(b){var a=
-c.call(this,b)||this;a.destination=b;return a}h(a,c);return a}(m),v=function(c){function a(){var b=c.call(this)||this;b.observers=[];b.closed=!1;b.isStopped=!1;b.hasError=!1;b.thrownError=null;return b}h(a,c);a.prototype[oa]=function(){return new rb(this)};a.prototype.lift=function(b){var a=new Da(this,this);a.operator=b;return a};a.prototype.next=function(b){if(this.closed)throw new I;if(!this.isStopped)for(var a=this.observers,c=a.length,a=a.slice(),f=0;f<c;f++)a[f].next(b)};a.prototype.error=function(b){if(this.closed)throw new I;
-this.hasError=!0;this.thrownError=b;this.isStopped=!0;for(var a=this.observers,c=a.length,a=a.slice(),f=0;f<c;f++)a[f].error(b);this.observers.length=0};a.prototype.complete=function(){if(this.closed)throw new I;this.isStopped=!0;for(var b=this.observers,a=b.length,b=b.slice(),c=0;c<a;c++)b[c].complete();this.observers.length=0};a.prototype.unsubscribe=function(){this.closed=this.isStopped=!0;this.observers=null};a.prototype._trySubscribe=function(b){if(this.closed)throw new I;return c.prototype._trySubscribe.call(this,
-b)};a.prototype._subscribe=function(b){if(this.closed)throw new I;if(this.hasError)return b.error(this.thrownError),t.EMPTY;if(this.isStopped)return b.complete(),t.EMPTY;this.observers.push(b);return new qb(this,b)};a.prototype.asObservable=function(){var b=new n;b.source=this;return b};a.create=function(b,a){return new Da(b,a)};return a}(n),Da=function(c){function a(b,a){var d=c.call(this)||this;d.destination=b;d.source=a;return d}h(a,c);a.prototype.next=function(b){var a=this.destination;a&&a.next&&
-a.next(b)};a.prototype.error=function(b){var a=this.destination;a&&a.error&&this.destination.error(b)};a.prototype.complete=function(){var b=this.destination;b&&b.complete&&this.destination.complete()};a.prototype._subscribe=function(b){return this.source?this.source.subscribe(b):t.EMPTY};return a}(v),Lb=function(){function c(a){this.connectable=a}c.prototype.call=function(a,b){var c=this.connectable;c._refCount++;a=new Kc(a,c);b=b.subscribe(a);a.closed||(a.connection=c.connect());return b};return c}(),
-Kc=function(c){function a(b,a){b=c.call(this,b)||this;b.connectable=a;return b}h(a,c);a.prototype._unsubscribe=function(){var b=this.connectable;if(b){this.connectable=null;var a=b._refCount;0>=a?this.connection=null:(b._refCount=a-1,1<a?this.connection=null:(a=this.connection,b=b._connection,this.connection=null,!b||a&&b!==a||b.unsubscribe()))}else this.connection=null};return a}(m),sb=function(c){function a(b,a){var d=c.call(this)||this;d.source=b;d.subjectFactory=a;d._refCount=0;d._isComplete=
-!1;return d}h(a,c);a.prototype._subscribe=function(b){return this.getSubject().subscribe(b)};a.prototype.getSubject=function(){var b=this._subject;if(!b||b.isStopped)this._subject=this.subjectFactory();return this._subject};a.prototype.connect=function(){var b=this._connection;b||(this._isComplete=!1,b=this._connection=new t,b.add(this.source.subscribe(new Lc(this.getSubject(),this))),b.closed&&(this._connection=null,b=t.EMPTY));return b};a.prototype.refCount=function(){return ua()(this)};return a}(n),
-sc=function(){var c=sb.prototype;return{operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:c._subscribe},_isComplete:{value:c._isComplete,writable:!0},getSubject:{value:c.getSubject},connect:{value:c.connect},refCount:{value:c.refCount}}}(),Lc=function(c){function a(b,a){b=c.call(this,b)||this;b.connectable=a;return b}h(a,c);a.prototype._error=function(b){this._unsubscribe();c.prototype._error.call(this,b)};
-a.prototype._complete=function(){this.connectable._isComplete=!0;this._unsubscribe();c.prototype._complete.call(this)};a.prototype._unsubscribe=function(){var b=this.connectable;if(b){this.connectable=null;var a=b._connection;b._refCount=0;b._subject=null;b._connection=null;a&&a.unsubscribe()}};return a}(rb);(function(c){function a(b,a){b=c.call(this,b)||this;b.connectable=a;return b}h(a,c);a.prototype._unsubscribe=function(){var b=this.connectable;if(b){this.connectable=null;var a=b._refCount;0>=
-a?this.connection=null:(b._refCount=a-1,1<a?this.connection=null:(a=this.connection,b=b._connection,this.connection=null,!b||a&&b!==a||b.unsubscribe()))}else this.connection=null};return a})(m);var Nc=function(){function c(a,b,c,e){this.keySelector=a;this.elementSelector=b;this.durationSelector=c;this.subjectSelector=e}c.prototype.call=function(a,b){return b.subscribe(new Mc(a,this.keySelector,this.elementSelector,this.durationSelector,this.subjectSelector))};return c}(),Mc=function(c){function a(b,
-a,e,f,g){b=c.call(this,b)||this;b.keySelector=a;b.elementSelector=e;b.durationSelector=f;b.subjectSelector=g;b.groups=null;b.attemptedToUnsubscribe=!1;b.count=0;return b}h(a,c);a.prototype._next=function(b){var a;try{a=this.keySelector(b)}catch(e){this.error(e);return}this._group(b,a)};a.prototype._group=function(b,a){var c=this.groups;c||(c=this.groups=new Map);var d=c.get(a),g;if(this.elementSelector)try{g=this.elementSelector(b)}catch(l){this.error(l)}else g=b;if(!d&&(d=this.subjectSelector?this.subjectSelector():
-new v,c.set(a,d),b=new Ea(a,d,this),this.destination.next(b),this.durationSelector)){b=void 0;try{b=this.durationSelector(new Ea(a,d))}catch(l){this.error(l);return}this.add(b.subscribe(new Oc(a,d,this)))}d.closed||d.next(g)};a.prototype._error=function(b){var a=this.groups;a&&(a.forEach(function(a,c){a.error(b)}),a.clear());this.destination.error(b)};a.prototype._complete=function(){var b=this.groups;b&&(b.forEach(function(b,a){b.complete()}),b.clear());this.destination.complete()};a.prototype.removeGroup=
-function(b){this.groups.delete(b)};a.prototype.unsubscribe=function(){this.closed||(this.attemptedToUnsubscribe=!0,0===this.count&&c.prototype.unsubscribe.call(this))};return a}(m),Oc=function(c){function a(b,a,e){var d=c.call(this,a)||this;d.key=b;d.group=a;d.parent=e;return d}h(a,c);a.prototype._next=function(b){this.complete()};a.prototype._unsubscribe=function(){var b=this.parent,a=this.key;this.key=this.parent=null;b&&b.removeGroup(a)};return a}(m),Ea=function(c){function a(b,a,e){var d=c.call(this)||
-this;d.key=b;d.groupSubject=a;d.refCountSubscription=e;return d}h(a,c);a.prototype._subscribe=function(b){var a=new t,c=this.refCountSubscription,f=this.groupSubject;c&&!c.closed&&a.add(new Pc(c));a.add(f.subscribe(b));return a};return a}(n),Pc=function(c){function a(b){var a=c.call(this)||this;a.parent=b;b.count++;return a}h(a,c);a.prototype.unsubscribe=function(){var b=this.parent;b.closed||this.closed||(c.prototype.unsubscribe.call(this),--b.count,0===b.count&&b.attemptedToUnsubscribe&&b.unsubscribe())};
-return a}(t),tb=function(c){function a(b){var a=c.call(this)||this;a._value=b;return a}h(a,c);Object.defineProperty(a.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0});a.prototype._subscribe=function(b){var a=c.prototype._subscribe.call(this,b);a&&!a.closed&&b.next(this._value);return a};a.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new I;return this._value};a.prototype.next=function(b){c.prototype.next.call(this,
-this._value=b)};return a}(v),ea=function(c){function a(b,a){var d=c.call(this,b,a)||this;d.scheduler=b;d.work=a;d.pending=!1;return d}h(a,c);a.prototype.schedule=function(b,a){void 0===a&&(a=0);if(this.closed)return this;this.state=b;b=this.id;var c=this.scheduler;null!=b&&(this.id=this.recycleAsyncId(c,b,a));this.pending=!0;this.delay=a;this.id=this.id||this.requestAsyncId(c,this.id,a);return this};a.prototype.requestAsyncId=function(b,a,c){void 0===c&&(c=0);return setInterval(b.flush.bind(b,this),
-c)};a.prototype.recycleAsyncId=function(b,a,c){void 0===c&&(c=0);if(null!==c&&this.delay===c&&!1===this.pending)return a;clearInterval(a)};a.prototype.execute=function(b,a){if(this.closed)return Error("executing a cancelled action");this.pending=!1;if(b=this._execute(b,a))return b;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))};a.prototype._execute=function(b,a){a=!1;var c=void 0;try{this.work(b)}catch(f){a=!0,c=!!f&&f||Error(f)}if(a)return this.unsubscribe(),
-c};a.prototype._unsubscribe=function(){var b=this.id,a=this.scheduler,c=a.actions,f=c.indexOf(this);this.state=this.work=null;this.pending=!1;this.scheduler=null;-1!==f&&c.splice(f,1);null!=b&&(this.id=this.recycleAsyncId(a,b,null));this.delay=null};return a}(function(c){function a(b,a){return c.call(this)||this}h(a,c);a.prototype.schedule=function(b,a){return this};return a}(t)),Qc=function(c){function a(b,a){var d=c.call(this,b,a)||this;d.scheduler=b;d.work=a;return d}h(a,c);a.prototype.schedule=
-function(b,a){void 0===a&&(a=0);if(0<a)return c.prototype.schedule.call(this,b,a);this.delay=a;this.state=b;this.scheduler.flush(this);return this};a.prototype.execute=function(b,a){return 0<a||this.closed?c.prototype.execute.call(this,b,a):this._execute(b,a)};a.prototype.requestAsyncId=function(b,a,e){void 0===e&&(e=0);return null!==e&&0<e||null===e&&0<this.delay?c.prototype.requestAsyncId.call(this,b,a,e):b.flush(this)};return a}(ea),Fa=function(){function c(a,b){void 0===b&&(b=c.now);this.SchedulerAction=
-a;this.now=b}c.prototype.schedule=function(a,b,c){void 0===b&&(b=0);return(new this.SchedulerAction(this,a)).schedule(c,b)};c.now=function(){return Date.now()};return c}(),O=function(c){function a(b,d){void 0===d&&(d=Fa.now);var e=c.call(this,b,function(){return a.delegate&&a.delegate!==e?a.delegate.now():d()})||this;e.actions=[];e.active=!1;e.scheduled=void 0;return e}h(a,c);a.prototype.schedule=function(b,d,e){void 0===d&&(d=0);return a.delegate&&a.delegate!==this?a.delegate.schedule(b,d,e):c.prototype.schedule.call(this,
-b,d,e)};a.prototype.flush=function(b){var a=this.actions;if(this.active)a.push(b);else{var c;this.active=!0;do if(c=b.execute(b.state,b.delay))break;while(b=a.shift());this.active=!1;if(c){for(;b=a.shift();)b.unsubscribe();throw c;}}};return a}(Fa),ub=new (function(c){function a(){return null!==c&&c.apply(this,arguments)||this}h(a,c);return a}(O))(Qc),S=new n(function(c){return c.complete()}),Na=function(c){return function(a){for(var b=0,d=c.length;b<d&&!a.closed;b++)a.next(c[b]);a.complete()}};(function(c){c.NEXT=
-"N";c.ERROR="E";c.COMPLETE="C"})(k.NotificationKind||(k.NotificationKind={}));var w=function(){function c(a,b,c){this.kind=a;this.value=b;this.error=c;this.hasValue="N"===a}c.prototype.observe=function(a){switch(this.kind){case "N":return a.next&&a.next(this.value);case "E":return a.error&&a.error(this.error);case "C":return a.complete&&a.complete()}};c.prototype.do=function(a,b,c){switch(this.kind){case "N":return a&&a(this.value);case "E":return b&&b(this.error);case "C":return c&&c()}};c.prototype.accept=
-function(a,b,c){return a&&"function"===typeof a.next?this.observe(a):this.do(a,b,c)};c.prototype.toObservable=function(){switch(this.kind){case "N":return ga(this.value);case "E":return wa(this.error);case "C":return R()}throw Error("unexpected notification kind value");};c.createNext=function(a){return"undefined"!==typeof a?new c("N",a):c.undefinedValueNotification};c.createError=function(a){return new c("E",void 0,a)};c.createComplete=function(){return c.completeNotification};c.completeNotification=
-new c("C");c.undefinedValueNotification=new c("N",void 0);return c}(),Rc=function(){function c(a,b){void 0===b&&(b=0);this.scheduler=a;this.delay=b}c.prototype.call=function(a,b){return b.subscribe(new vb(a,this.scheduler,this.delay))};return c}(),vb=function(c){function a(b,a,e){void 0===e&&(e=0);b=c.call(this,b)||this;b.scheduler=a;b.delay=e;return b}h(a,c);a.dispatch=function(b){b.notification.observe(b.destination);this.unsubscribe()};a.prototype.scheduleMessage=function(b){this.destination.add(this.scheduler.schedule(a.dispatch,
-this.delay,new Sc(b,this.destination)))};a.prototype._next=function(b){this.scheduleMessage(w.createNext(b))};a.prototype._error=function(b){this.scheduleMessage(w.createError(b));this.unsubscribe()};a.prototype._complete=function(){this.scheduleMessage(w.createComplete());this.unsubscribe()};return a}(m),Sc=function(){return function(c,a){this.notification=c;this.destination=a}}(),W=function(c){function a(b,a,e){void 0===b&&(b=Number.POSITIVE_INFINITY);void 0===a&&(a=Number.POSITIVE_INFINITY);var d=
-c.call(this)||this;d.scheduler=e;d._events=[];d._infiniteTimeWindow=!1;d._bufferSize=1>b?1:b;d._windowTime=1>a?1:a;a===Number.POSITIVE_INFINITY?(d._infiniteTimeWindow=!0,d.next=d.nextInfiniteTimeWindow):d.next=d.nextTimeWindow;return d}h(a,c);a.prototype.nextInfiniteTimeWindow=function(b){var a=this._events;a.push(b);a.length>this._bufferSize&&a.shift();c.prototype.next.call(this,b)};a.prototype.nextTimeWindow=function(b){this._events.push(new Tc(this._getNow(),b));this._trimBufferThenGetEvents();
-c.prototype.next.call(this,b)};a.prototype._subscribe=function(b){var a=this._infiniteTimeWindow,c=a?this._events:this._trimBufferThenGetEvents(),f=this.scheduler,g=c.length,l;if(this.closed)throw new I;this.isStopped||this.hasError?l=t.EMPTY:(this.observers.push(b),l=new qb(this,b));f&&b.add(b=new vb(b,f));if(a)for(a=0;a<g&&!b.closed;a++)b.next(c[a]);else for(a=0;a<g&&!b.closed;a++)b.next(c[a].value);this.hasError?b.error(this.thrownError):this.isStopped&&b.complete();return l};a.prototype._getNow=
-function(){return(this.scheduler||ub).now()};a.prototype._trimBufferThenGetEvents=function(){for(var b=this._getNow(),a=this._bufferSize,c=this._windowTime,f=this._events,g=f.length,l=0;l<g&&!(b-f[l].time<c);)l++;g>a&&(l=Math.max(l,g-a));0<l&&f.splice(0,l);return f};return a}(v),Tc=function(){return function(c,a){this.time=c;this.value=a}}(),T=function(c){function a(){var b=null!==c&&c.apply(this,arguments)||this;b.value=null;b.hasNext=!1;b.hasCompleted=!1;return b}h(a,c);a.prototype._subscribe=function(b){return this.hasError?
-(b.error(this.thrownError),t.EMPTY):this.hasCompleted&&this.hasNext?(b.next(this.value),b.complete(),t.EMPTY):c.prototype._subscribe.call(this,b)};a.prototype.next=function(b){this.hasCompleted||(this.value=b,this.hasNext=!0)};a.prototype.error=function(b){this.hasCompleted||c.prototype.error.call(this,b)};a.prototype.complete=function(){this.hasCompleted=!0;this.hasNext&&c.prototype.next.call(this,this.value);c.prototype.complete.call(this)};return a}(v),Uc=1,Vc=Promise.resolve(),xa={},wb={setImmediate:function(c){var a=
-Uc++;xa[a]=!0;Vc.then(function(){return Oa(a)&&c()});return a},clearImmediate:function(c){Oa(c)}},Wc=function(c){function a(b,a){var d=c.call(this,b,a)||this;d.scheduler=b;d.work=a;return d}h(a,c);a.prototype.requestAsyncId=function(b,a,e){void 0===e&&(e=0);if(null!==e&&0<e)return c.prototype.requestAsyncId.call(this,b,a,e);b.actions.push(this);return b.scheduled||(b.scheduled=wb.setImmediate(b.flush.bind(b,null)))};a.prototype.recycleAsyncId=function(b,a,e){void 0===e&&(e=0);if(null!==e&&0<e||null===
-e&&0<this.delay)return c.prototype.recycleAsyncId.call(this,b,a,e);0===b.actions.length&&(wb.clearImmediate(a),b.scheduled=void 0)};return a}(ea),pa=new (function(c){function a(){return null!==c&&c.apply(this,arguments)||this}h(a,c);a.prototype.flush=function(b){this.active=!0;this.scheduled=void 0;var a=this.actions,c,f=-1,g=a.length;b=b||a.shift();do if(c=b.execute(b.state,b.delay))break;while(++f<g&&(b=a.shift()));this.active=!1;if(c){for(;++f<g&&(b=a.shift());)b.unsubscribe();throw c;}};return a}(O))(Wc),
-y=new O(ea),Xc=function(c){function a(b,a){var d=c.call(this,b,a)||this;d.scheduler=b;d.work=a;return d}h(a,c);a.prototype.requestAsyncId=function(b,a,e){void 0===e&&(e=0);if(null!==e&&0<e)return c.prototype.requestAsyncId.call(this,b,a,e);b.actions.push(this);return b.scheduled||(b.scheduled=requestAnimationFrame(function(){return b.flush(null)}))};a.prototype.recycleAsyncId=function(b,a,e){void 0===e&&(e=0);if(null!==e&&0<e||null===e&&0<this.delay)return c.prototype.recycleAsyncId.call(this,b,a,
-e);0===b.actions.length&&(cancelAnimationFrame(a),b.scheduled=void 0)};return a}(ea),Yc=new (function(c){function a(){return null!==c&&c.apply(this,arguments)||this}h(a,c);a.prototype.flush=function(b){this.active=!0;this.scheduled=void 0;var a=this.actions,c,f=-1,g=a.length;b=b||a.shift();do if(c=b.execute(b.state,b.delay))break;while(++f<g&&(b=a.shift()));this.active=!1;if(c){for(;++f<g&&(b=a.shift());)b.unsubscribe();throw c;}};return a}(O))(Xc),xb=function(c){function a(b,a){void 0===b&&(b=Ga);
-void 0===a&&(a=Number.POSITIVE_INFINITY);var d=c.call(this,b,function(){return d.frame})||this;d.maxFrames=a;d.frame=0;d.index=-1;return d}h(a,c);a.prototype.flush=function(){for(var b=this.actions,a=this.maxFrames,c,f;(f=b[0])&&f.delay<=a&&!(b.shift(),this.frame=f.delay,c=f.execute(f.state,f.delay)););if(c){for(;f=b.shift();)f.unsubscribe();throw c;}};a.frameTimeFactor=10;return a}(O),Ga=function(c){function a(b,a,e){void 0===e&&(e=b.index+=1);var d=c.call(this,b,a)||this;d.scheduler=b;d.work=a;
-d.index=e;d.active=!0;d.index=b.index=e;return d}h(a,c);a.prototype.schedule=function(b,d){void 0===d&&(d=0);if(!this.id)return c.prototype.schedule.call(this,b,d);this.active=!1;var e=new a(this.scheduler,this.work);this.add(e);return e.schedule(b,d)};a.prototype.requestAsyncId=function(b,c,e){void 0===e&&(e=0);this.delay=b.frame+e;b=b.actions;b.push(this);b.sort(a.sortActions);return!0};a.prototype.recycleAsyncId=function(b,a,c){};a.prototype._execute=function(b,a){if(!0===this.active)return c.prototype._execute.call(this,
-b,a)};a.sortActions=function(b,a){return b.delay===a.delay?b.index===a.index?0:b.index>a.index?1:-1:b.delay>a.delay?1:-1};return a}(ea),X=function(){function c(){Error.call(this);this.message="argument out of range";this.name="ArgumentOutOfRangeError";return this}c.prototype=Object.create(Error.prototype);return c}(),ca=function(){function c(){Error.call(this);this.message="no elements in sequence";this.name="EmptyError";return this}c.prototype=Object.create(Error.prototype);return c}(),yb=function(){function c(){Error.call(this);
-this.message="Timeout has occurred";this.name="TimeoutError";return this}c.prototype=Object.create(Error.prototype);return c}(),Ob=function(){function c(a,b){this.project=a;this.thisArg=b}c.prototype.call=function(a,b){return b.subscribe(new Zc(a,this.project,this.thisArg))};return c}(),Zc=function(c){function a(b,a,e){b=c.call(this,b)||this;b.project=a;b.count=0;b.thisArg=e||b;return b}h(a,c);a.prototype._next=function(b){var a;try{a=this.project.call(this.thisArg,b,this.count++)}catch(e){this.destination.error(e);
-return}this.destination.next(a)};return a}(m),q=function(c){function a(){return null!==c&&c.apply(this,arguments)||this}h(a,c);a.prototype.notifyNext=function(b,a,c,f,g){this.destination.next(a)};a.prototype.notifyError=function(b,a){this.destination.error(b)};a.prototype.notifyComplete=function(b){this.destination.complete()};return a}(m),G=function(c){function a(b,a,e){var d=c.call(this)||this;d.parent=b;d.outerValue=a;d.outerIndex=e;d.index=0;return d}h(a,c);a.prototype._next=function(b){this.parent.notifyNext(this.outerValue,
-b,this.outerIndex,this.index++,this)};a.prototype._error=function(b){this.parent.notifyError(b,this);this.unsubscribe()};a.prototype._complete=function(){this.parent.notifyComplete(this);this.unsubscribe()};return a}(m),$c=function(c){return function(a){c.then(function(b){a.closed||(a.next(b),a.complete())},function(b){return a.error(b)}).then(null,Q);return a}},E;E="function"===typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator";var ad=function(c){return function(a){var b=c[E]();do{var d=
-b.next();if(d.done){a.complete();break}a.next(d.value);if(a.closed)break}while(1);"function"===typeof b.return&&a.add(function(){b.return&&b.return()});return a}},bd=function(c){return function(a){var b=c[U]();if("function"!==typeof b.subscribe)throw new TypeError("Provided object does not correctly implement Symbol.observable");return b.subscribe(a)}},Ua=function(c){return c&&"number"===typeof c.length&&"function"!==typeof c},ha=function(c){if(c&&"function"===typeof c[U])return bd(c);if(Ua(c))return Na(c);
-if(Sa(c))return $c(c);if(c&&"function"===typeof c[E])return ad(c);c=ra(c)?"an invalid object":"'"+c+"'";throw new TypeError("You provided "+c+" where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.");},zb={},Ha=function(){function c(a){this.resultSelector=a}c.prototype.call=function(a,b){return b.subscribe(new cd(a,this.resultSelector))};return c}(),cd=function(c){function a(b,a){b=c.call(this,b)||this;b.resultSelector=a;b.active=0;b.values=[];b.observables=[];return b}
-h(a,c);a.prototype._next=function(b){this.values.push(zb);this.observables.push(b)};a.prototype._complete=function(){var b=this.observables,a=b.length;if(0===a)this.destination.complete();else{this.toRespond=this.active=a;for(var c=0;c<a;c++){var f=b[c];this.add(p(this,f,f,c))}}};a.prototype.notifyComplete=function(b){0===--this.active&&this.destination.complete()};a.prototype.notifyNext=function(b,a,c,f,g){b=this.values;f=b[c];f=this.toRespond?f===zb?--this.toRespond:this.toRespond:0;b[c]=a;0===
-f&&(this.resultSelector?this._tryResultSelector(b):this.destination.next(b.slice()))};a.prototype._tryResultSelector=function(b){var a;try{a=this.resultSelector.apply(this,b)}catch(e){this.destination.error(e);return}this.destination.next(a)};return a}(q),Wb=function(){function c(a,b){void 0===b&&(b=Number.POSITIVE_INFINITY);this.project=a;this.concurrent=b}c.prototype.call=function(a,b){return b.subscribe(new dd(a,this.project,this.concurrent))};return c}(),dd=function(c){function a(b,a,e){void 0===
-e&&(e=Number.POSITIVE_INFINITY);b=c.call(this,b)||this;b.project=a;b.concurrent=e;b.hasCompleted=!1;b.buffer=[];b.active=0;b.index=0;return b}h(a,c);a.prototype._next=function(b){this.active<this.concurrent?this._tryNext(b):this.buffer.push(b)};a.prototype._tryNext=function(b){var a,c=this.index++;try{a=this.project(b,c)}catch(f){this.destination.error(f);return}this.active++;this._innerSub(a,b,c)};a.prototype._innerSub=function(b,a,c){a=new G(this,a,c);c=this.destination;c.add(a);b=p(this,b,void 0,
-void 0,a);b!==a&&c.add(b)};a.prototype._complete=function(){this.hasCompleted=!0;0===this.active&&0===this.buffer.length&&this.destination.complete();this.unsubscribe()};a.prototype.notifyNext=function(b,a,c,f,g){this.destination.next(a)};a.prototype.notifyComplete=function(b){var a=this.buffer;this.remove(b);this.active--;0<a.length?this._next(a.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()};return a}(q),Ab=new n(D),cc=function(){function c(a,b){this.predicate=a;this.thisArg=
-b}c.prototype.call=function(a,b){return b.subscribe(new ed(a,this.predicate,this.thisArg))};return c}(),ed=function(c){function a(b,a,e){b=c.call(this,b)||this;b.predicate=a;b.thisArg=e;b.count=0;return b}h(a,c);a.prototype._next=function(b){var a;try{a=this.predicate.call(this.thisArg,b,this.count++)}catch(e){this.destination.error(e);return}a&&this.destination.next(b)};return a}(m),dc=function(){function c(){}c.prototype.call=function(a,b){return b.subscribe(new fd(a))};return c}(),fd=function(c){function a(b){b=
-c.call(this,b)||this;b.hasFirst=!1;b.observables=[];b.subscriptions=[];return b}h(a,c);a.prototype._next=function(b){this.observables.push(b)};a.prototype._complete=function(){var b=this.observables,a=b.length;if(0===a)this.destination.complete();else{for(var c=0;c<a&&!this.hasFirst;c++){var f=b[c],f=p(this,f,f,c);this.subscriptions&&this.subscriptions.push(f);this.add(f)}this.observables=null}};a.prototype.notifyNext=function(b,a,c,f,g){if(!this.hasFirst){this.hasFirst=!0;for(b=0;b<this.subscriptions.length;b++)b!==
-c&&(f=this.subscriptions[b],f.unsubscribe(),this.remove(f));this.subscriptions=null}this.destination.next(a)};return a}(q),db=function(){function c(a){this.resultSelector=a}c.prototype.call=function(a,b){return b.subscribe(new gd(a,this.resultSelector))};return c}(),gd=function(c){function a(b,a,e){void 0===e&&(e=Object.create(null));b=c.call(this,b)||this;b.iterators=[];b.active=0;b.resultSelector="function"===typeof a?a:null;b.values=e;return b}h(a,c);a.prototype._next=function(b){var a=this.iterators;
-x(b)?a.push(new hd(b)):"function"===typeof b[E]?a.push(new id(b[E]())):a.push(new jd(this.destination,this,b))};a.prototype._complete=function(){var b=this.iterators,a=b.length;this.unsubscribe();if(0===a)this.destination.complete();else{this.active=a;for(var c=0;c<a;c++){var f=b[c];f.stillUnsubscribed?this.destination.add(f.subscribe(f,c)):this.active--}}};a.prototype.notifyInactive=function(){this.active--;0===this.active&&this.destination.complete()};a.prototype.checkIterators=function(){for(var b=
-this.iterators,a=b.length,c=this.destination,f=0;f<a;f++){var g=b[f];if("function"===typeof g.hasValue&&!g.hasValue())return}for(var l=!1,h=[],f=0;f<a;f++){var g=b[f],k=g.next();g.hasCompleted()&&(l=!0);if(k.done){c.complete();return}h.push(k.value)}this.resultSelector?this._tryresultSelector(h):c.next(h);l&&c.complete()};a.prototype._tryresultSelector=function(b){var a;try{a=this.resultSelector.apply(this,b)}catch(e){this.destination.error(e);return}this.destination.next(a)};return a}(m),id=function(){function c(a){this.iterator=
-a;this.nextResult=a.next()}c.prototype.hasValue=function(){return!0};c.prototype.next=function(){var a=this.nextResult;this.nextResult=this.iterator.next();return a};c.prototype.hasCompleted=function(){var a=this.nextResult;return a&&a.done};return c}(),hd=function(){function c(a){this.array=a;this.length=this.index=0;this.length=a.length}c.prototype[E]=function(){return this};c.prototype.next=function(a){a=this.index++;var b=this.array;return a<this.length?{value:b[a],done:!1}:{value:null,done:!0}};
-c.prototype.hasValue=function(){return this.array.length>this.index};c.prototype.hasCompleted=function(){return this.array.length===this.index};return c}(),jd=function(c){function a(b,a,e){b=c.call(this,b)||this;b.parent=a;b.observable=e;b.stillUnsubscribed=!0;b.buffer=[];b.isComplete=!1;return b}h(a,c);a.prototype[E]=function(){return this};a.prototype.next=function(){var b=this.buffer;return 0===b.length&&this.isComplete?{value:null,done:!0}:{value:b.shift(),done:!1}};a.prototype.hasValue=function(){return 0<
-this.buffer.length};a.prototype.hasCompleted=function(){return 0===this.buffer.length&&this.isComplete};a.prototype.notifyComplete=function(){0<this.buffer.length?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()};a.prototype.notifyNext=function(b,a,c,f,g){this.buffer.push(a);this.parent.checkIterators()};a.prototype.subscribe=function(b,a){return p(this,this.observable,this,a)};return a}(q),gc=function(){function c(a){this.durationSelector=a}c.prototype.call=function(a,
-b){return b.subscribe(new kd(a,this.durationSelector))};return c}(),kd=function(c){function a(b,a){b=c.call(this,b)||this;b.durationSelector=a;b.hasValue=!1;return b}h(a,c);a.prototype._next=function(b){this.value=b;this.hasValue=!0;if(!this.throttled){var a=void 0;try{var c=this.durationSelector,a=c(b)}catch(f){return this.destination.error(f)}b=p(this,a);!b||b.closed?this.clearThrottle():this.add(this.throttled=b)}};a.prototype.clearThrottle=function(){var b=this.value,a=this.hasValue,c=this.throttled;
-c&&(this.remove(c),this.throttled=null,c.unsubscribe());a&&(this.value=null,this.hasValue=!1,this.destination.next(b))};a.prototype.notifyNext=function(b,a,c,f){this.clearThrottle()};a.prototype.notifyComplete=function(){this.clearThrottle()};return a}(q),md=function(){function c(a){this.closingNotifier=a}c.prototype.call=function(a,b){return b.subscribe(new ld(a,this.closingNotifier))};return c}(),ld=function(c){function a(b,a){b=c.call(this,b)||this;b.buffer=[];b.add(p(b,a));return b}h(a,c);a.prototype._next=
-function(b){this.buffer.push(b)};a.prototype.notifyNext=function(b,a,c,f,g){b=this.buffer;this.buffer=[];this.destination.next(b)};return a}(q),pd=function(){function c(a,b){this.bufferSize=a;this.subscriberClass=(this.startBufferEvery=b)&&a!==b?nd:od}c.prototype.call=function(a,b){return b.subscribe(new this.subscriberClass(a,this.bufferSize,this.startBufferEvery))};return c}(),od=function(c){function a(b,a){b=c.call(this,b)||this;b.bufferSize=a;b.buffer=[];return b}h(a,c);a.prototype._next=function(b){var a=
-this.buffer;a.push(b);a.length==this.bufferSize&&(this.destination.next(a),this.buffer=[])};a.prototype._complete=function(){var b=this.buffer;0<b.length&&this.destination.next(b);c.prototype._complete.call(this)};return a}(m),nd=function(c){function a(b,a,e){b=c.call(this,b)||this;b.bufferSize=a;b.startBufferEvery=e;b.buffers=[];b.count=0;return b}h(a,c);a.prototype._next=function(b){var a=this.bufferSize,c=this.startBufferEvery,f=this.buffers,g=this.count;this.count++;0===g%c&&f.push([]);for(c=
-f.length;c--;)g=f[c],g.push(b),g.length===a&&(f.splice(c,1),this.destination.next(g))};a.prototype._complete=function(){for(var b=this.buffers,a=this.destination;0<b.length;){var e=b.shift();0<e.length&&a.next(e)}c.prototype._complete.call(this)};return a}(m),rd=function(){function c(a,b,c,e){this.bufferTimeSpan=a;this.bufferCreationInterval=b;this.maxBufferSize=c;this.scheduler=e}c.prototype.call=function(a,b){return b.subscribe(new qd(a,this.bufferTimeSpan,this.bufferCreationInterval,this.maxBufferSize,
-this.scheduler))};return c}(),sd=function(){return function(){this.buffer=[]}}(),qd=function(c){function a(b,a,e,f,g){b=c.call(this,b)||this;b.bufferTimeSpan=a;b.bufferCreationInterval=e;b.maxBufferSize=f;b.scheduler=g;b.contexts=[];f=b.openContext();b.timespanOnly=null==e||0>e;if(b.timespanOnly)b.add(f.closeAction=g.schedule(fb,a,{subscriber:b,context:f,bufferTimeSpan:a}));else{var d={bufferTimeSpan:a,bufferCreationInterval:e,subscriber:b,scheduler:g};b.add(f.closeAction=g.schedule(gb,a,{subscriber:b,
-context:f}));b.add(g.schedule(hc,e,d))}return b}h(a,c);a.prototype._next=function(b){for(var a=this.contexts,c=a.length,f,g=0;g<c;g++){var l=a[g],h=l.buffer;h.push(b);h.length==this.maxBufferSize&&(f=l)}if(f)this.onBufferFull(f)};a.prototype._error=function(b){this.contexts.length=0;c.prototype._error.call(this,b)};a.prototype._complete=function(){for(var b=this.contexts,a=this.destination;0<b.length;){var e=b.shift();a.next(e.buffer)}c.prototype._complete.call(this)};a.prototype._unsubscribe=function(){this.contexts=
-null};a.prototype.onBufferFull=function(b){this.closeContext(b);b=b.closeAction;b.unsubscribe();this.remove(b);if(!this.closed&&this.timespanOnly){b=this.openContext();var a=this.bufferTimeSpan;this.add(b.closeAction=this.scheduler.schedule(fb,a,{subscriber:this,context:b,bufferTimeSpan:a}))}};a.prototype.openContext=function(){var b=new sd;this.contexts.push(b);return b};a.prototype.closeContext=function(b){this.destination.next(b.buffer);var a=this.contexts;0<=(a?a.indexOf(b):-1)&&a.splice(a.indexOf(b),
-1)};return a}(m),ud=function(){function c(a,b){this.openings=a;this.closingSelector=b}c.prototype.call=function(a,b){return b.subscribe(new td(a,this.openings,this.closingSelector))};return c}(),td=function(c){function a(b,a,e){b=c.call(this,b)||this;b.openings=a;b.closingSelector=e;b.contexts=[];b.add(p(b,a));return b}h(a,c);a.prototype._next=function(b){for(var a=this.contexts,c=a.length,f=0;f<c;f++)a[f].buffer.push(b)};a.prototype._error=function(b){for(var a=this.contexts;0<a.length;){var e=a.shift();
-e.subscription.unsubscribe();e.buffer=null;e.subscription=null}this.contexts=null;c.prototype._error.call(this,b)};a.prototype._complete=function(){for(var b=this.contexts;0<b.length;){var a=b.shift();this.destination.next(a.buffer);a.subscription.unsubscribe();a.buffer=null;a.subscription=null}this.contexts=null;c.prototype._complete.call(this)};a.prototype.notifyNext=function(b,a,c,f,g){b?this.closeBuffer(b):this.openBuffer(a)};a.prototype.notifyComplete=function(b){this.closeBuffer(b.context)};
-a.prototype.openBuffer=function(b){try{var a=this.closingSelector.call(this,b);a&&this.trySubscribe(a)}catch(e){this._error(e)}};a.prototype.closeBuffer=function(b){var a=this.contexts;if(a&&b){var c=b.subscription;this.destination.next(b.buffer);a.splice(a.indexOf(b),1);this.remove(c);c.unsubscribe()}};a.prototype.trySubscribe=function(b){var a=this.contexts,c=new t,f={buffer:[],subscription:c};a.push(f);b=p(this,b,f);!b||b.closed?this.closeBuffer(f):(b.context=f,this.add(b),c.add(b))};return a}(q),
-wd=function(){function c(a){this.closingSelector=a}c.prototype.call=function(a,b){return b.subscribe(new vd(a,this.closingSelector))};return c}(),vd=function(c){function a(b,a){b=c.call(this,b)||this;b.closingSelector=a;b.subscribing=!1;b.openBuffer();return b}h(a,c);a.prototype._next=function(b){this.buffer.push(b)};a.prototype._complete=function(){var b=this.buffer;b&&this.destination.next(b);c.prototype._complete.call(this)};a.prototype._unsubscribe=function(){this.buffer=null;this.subscribing=
-!1};a.prototype.notifyNext=function(b,a,c,f,g){this.openBuffer()};a.prototype.notifyComplete=function(){this.subscribing?this.complete():this.openBuffer()};a.prototype.openBuffer=function(){var b=this.closingSubscription;b&&(this.remove(b),b.unsubscribe());(b=this.buffer)&&this.destination.next(b);this.buffer=[];var a;try{var c=this.closingSelector;a=c()}catch(f){return this.error(f)}this.closingSubscription=b=new t;this.add(b);this.subscribing=!0;b.add(p(this,a));this.subscribing=!1};return a}(q),
-yd=function(){function c(a){this.selector=a}c.prototype.call=function(a,b){return b.subscribe(new xd(a,this.selector,this.caught))};return c}(),xd=function(c){function a(b,a,e){b=c.call(this,b)||this;b.selector=a;b.caught=e;return b}h(a,c);a.prototype.error=function(b){if(!this.isStopped){var a=void 0;try{a=this.selector(b,this.caught)}catch(e){c.prototype.error.call(this,e);return}this._unsubscribeAndRecycle();b=new G(this,void 0,void 0);this.add(b);a=p(this,a,void 0,void 0,b);a!==b&&this.add(a)}};
-return a}(q),Ad=function(){function c(a,b){this.predicate=a;this.source=b}c.prototype.call=function(a,b){return b.subscribe(new zd(a,this.predicate,this.source))};return c}(),zd=function(c){function a(b,a,e){b=c.call(this,b)||this;b.predicate=a;b.source=e;b.count=0;b.index=0;return b}h(a,c);a.prototype._next=function(b){this.predicate?this._tryPredicate(b):this.count++};a.prototype._tryPredicate=function(b){var a;try{a=this.predicate(b,this.index++,this.source)}catch(e){this.destination.error(e);
-return}a&&this.count++};a.prototype._complete=function(){this.destination.next(this.count);this.destination.complete()};return a}(m),Cd=function(){function c(a){this.durationSelector=a}c.prototype.call=function(a,b){return b.subscribe(new Bd(a,this.durationSelector))};return c}(),Bd=function(c){function a(b,a){b=c.call(this,b)||this;b.durationSelector=a;b.hasValue=!1;b.durationSubscription=null;return b}h(a,c);a.prototype._next=function(b){try{var a=this.durationSelector.call(this,b);a&&this._tryNext(b,
-a)}catch(e){this.destination.error(e)}};a.prototype._complete=function(){this.emitValue();this.destination.complete()};a.prototype._tryNext=function(b,a){var c=this.durationSubscription;this.value=b;this.hasValue=!0;c&&(c.unsubscribe(),this.remove(c));(c=p(this,a))&&!c.closed&&this.add(this.durationSubscription=c)};a.prototype.notifyNext=function(b,a,c,f,g){this.emitValue()};a.prototype.notifyComplete=function(){this.emitValue()};a.prototype.emitValue=function(){if(this.hasValue){var b=this.value,
-a=this.durationSubscription;a&&(this.durationSubscription=null,a.unsubscribe(),this.remove(a));this.value=null;this.hasValue=!1;c.prototype._next.call(this,b)}};return a}(q),Ed=function(){function c(a,b){this.dueTime=a;this.scheduler=b}c.prototype.call=function(a,b){return b.subscribe(new Dd(a,this.dueTime,this.scheduler))};return c}(),Dd=function(c){function a(b,a,e){b=c.call(this,b)||this;b.dueTime=a;b.scheduler=e;b.debouncedSubscription=null;b.lastValue=null;b.hasValue=!1;return b}h(a,c);a.prototype._next=
-function(b){this.clearDebounce();this.lastValue=b;this.hasValue=!0;this.add(this.debouncedSubscription=this.scheduler.schedule(ic,this.dueTime,this))};a.prototype._complete=function(){this.debouncedNext();this.destination.complete()};a.prototype.debouncedNext=function(){this.clearDebounce();if(this.hasValue){var b=this.lastValue;this.lastValue=null;this.hasValue=!1;this.destination.next(b)}};a.prototype.clearDebounce=function(){var b=this.debouncedSubscription;null!==b&&(this.remove(b),b.unsubscribe(),
-this.debouncedSubscription=null)};return a}(m),jc=function(){function c(a){this.defaultValue=a}c.prototype.call=function(a,b){return b.subscribe(new Fd(a,this.defaultValue))};return c}(),Fd=function(c){function a(b,a){b=c.call(this,b)||this;b.defaultValue=a;b.isEmpty=!0;return b}h(a,c);a.prototype._next=function(b){this.isEmpty=!1;this.destination.next(b)};a.prototype._complete=function(){this.isEmpty&&this.destination.next(this.defaultValue);this.destination.complete()};return a}(m),Hd=function(){function c(a,
-b){this.delay=a;this.scheduler=b}c.prototype.call=function(a,b){return b.subscribe(new Gd(a,this.delay,this.scheduler))};return c}(),Gd=function(c){function a(b,a,e){b=c.call(this,b)||this;b.delay=a;b.scheduler=e;b.queue=[];b.active=!1;b.errored=!1;return b}h(a,c);a.dispatch=function(b){for(var a=b.source,c=a.queue,f=b.scheduler,g=b.destination;0<c.length&&0>=c[0].time-f.now();)c.shift().notification.observe(g);0<c.length?(a=Math.max(0,c[0].time-f.now()),this.schedule(b,a)):(this.unsubscribe(),a.active=
-!1)};a.prototype._schedule=function(b){this.active=!0;this.destination.add(b.schedule(a.dispatch,this.delay,{source:this,destination:this.destination,scheduler:b}))};a.prototype.scheduleNotification=function(b){if(!0!==this.errored){var a=this.scheduler;b=new Id(a.now()+this.delay,b);this.queue.push(b);!1===this.active&&this._schedule(a)}};a.prototype._next=function(b){this.scheduleNotification(w.createNext(b))};a.prototype._error=function(b){this.errored=!0;this.queue=[];this.destination.error(b);
-this.unsubscribe()};a.prototype._complete=function(){this.scheduleNotification(w.createComplete());this.unsubscribe()};return a}(m),Id=function(){return function(c,a){this.time=c;this.notification=a}}(),Bb=function(){function c(a){this.delayDurationSelector=a}c.prototype.call=function(a,b){return b.subscribe(new Jd(a,this.delayDurationSelector))};return c}(),Jd=function(c){function a(b,a){b=c.call(this,b)||this;b.delayDurationSelector=a;b.completed=!1;b.delayNotifierSubscriptions=[];b.index=0;return b}
-h(a,c);a.prototype.notifyNext=function(b,a,c,f,g){this.destination.next(b);this.removeSubscription(g);this.tryComplete()};a.prototype.notifyError=function(b,a){this._error(b)};a.prototype.notifyComplete=function(b){(b=this.removeSubscription(b))&&this.destination.next(b);this.tryComplete()};a.prototype._next=function(b){var a=this.index++;try{var c=this.delayDurationSelector(b,a);c&&this.tryDelay(c,b)}catch(f){this.destination.error(f)}};a.prototype._complete=function(){this.completed=!0;this.tryComplete();
-this.unsubscribe()};a.prototype.removeSubscription=function(b){b.unsubscribe();var a=this.delayNotifierSubscriptions.indexOf(b);-1!==a&&this.delayNotifierSubscriptions.splice(a,1);return b.outerValue};a.prototype.tryDelay=function(b,a){(b=p(this,b,a))&&!b.closed&&(this.destination.add(b),this.delayNotifierSubscriptions.push(b))};a.prototype.tryComplete=function(){this.completed&&0===this.delayNotifierSubscriptions.length&&this.destination.complete()};return a}(q),Ld=function(c){function a(b,a){var d=
-c.call(this)||this;d.source=b;d.subscriptionDelay=a;return d}h(a,c);a.prototype._subscribe=function(b){this.subscriptionDelay.subscribe(new Kd(b,this.source))};return a}(n),Kd=function(c){function a(b,a){var d=c.call(this)||this;d.parent=b;d.source=a;d.sourceSubscribed=!1;return d}h(a,c);a.prototype._next=function(b){this.subscribeToSource()};a.prototype._error=function(b){this.unsubscribe();this.parent.error(b)};a.prototype._complete=function(){this.unsubscribe();this.subscribeToSource()};a.prototype.subscribeToSource=
-function(){this.sourceSubscribed||(this.sourceSubscribed=!0,this.unsubscribe(),this.source.subscribe(this.parent))};return a}(m),Nd=function(){function c(){}c.prototype.call=function(a,b){return b.subscribe(new Md(a))};return c}(),Md=function(c){function a(b){return c.call(this,b)||this}h(a,c);a.prototype._next=function(b){b.observe(this.destination)};return a}(m),Pd=function(){function c(a,b){this.keySelector=a;this.flushes=b}c.prototype.call=function(a,b){return b.subscribe(new Od(a,this.keySelector,
-this.flushes))};return c}(),Od=function(c){function a(b,a,e){b=c.call(this,b)||this;b.keySelector=a;b.values=new Set;e&&b.add(p(b,e));return b}h(a,c);a.prototype.notifyNext=function(b,a,c,f,g){this.values.clear()};a.prototype.notifyError=function(b,a){this._error(b)};a.prototype._next=function(b){this.keySelector?this._useKeySelector(b):this._finalizeNext(b,b)};a.prototype._useKeySelector=function(b){var a,c=this.destination;try{a=this.keySelector(b)}catch(f){c.error(f);return}this._finalizeNext(a,
-b)};a.prototype._finalizeNext=function(b,a){var c=this.values;c.has(b)||(c.add(b),this.destination.next(a))};return a}(q),kc=function(){function c(a,b){this.compare=a;this.keySelector=b}c.prototype.call=function(a,b){return b.subscribe(new Qd(a,this.compare,this.keySelector))};return c}(),Qd=function(c){function a(b,a,e){b=c.call(this,b)||this;b.keySelector=e;b.hasKey=!1;"function"===typeof a&&(b.compare=a);return b}h(a,c);a.prototype.compare=function(b,a){return b===a};a.prototype._next=function(b){var a;
-try{var c=this.keySelector;a=c?c(b):b}catch(g){return this.destination.error(g)}c=!1;if(this.hasKey)try{var f=this.compare,c=f(this.key,a)}catch(g){return this.destination.error(g)}else this.hasKey=!0;c||(this.key=a,this.destination.next(b))};return a}(m),mc=function(){function c(a){this.errorFactory=a}c.prototype.call=function(a,b){return b.subscribe(new Rd(a,this.errorFactory))};return c}(),Rd=function(c){function a(b,a){b=c.call(this,b)||this;b.errorFactory=a;b.hasValue=!1;return b}h(a,c);a.prototype._next=
-function(b){this.hasValue=!0;this.destination.next(b)};a.prototype._complete=function(){if(this.hasValue)return this.destination.complete();var b=void 0;try{b=this.errorFactory()}catch(d){b=d}this.destination.error(b)};return a}(m),nc=function(){function c(a){this.total=a;if(0>this.total)throw new X;}c.prototype.call=function(a,b){return b.subscribe(new Sd(a,this.total))};return c}(),Sd=function(c){function a(b,a){b=c.call(this,b)||this;b.total=a;b.count=0;return b}h(a,c);a.prototype._next=function(b){var a=
-this.total,c=++this.count;c<=a&&(this.destination.next(b),c===a&&(this.destination.complete(),this.unsubscribe()))};return a}(m),Ud=function(){function c(a,b,c){this.predicate=a;this.thisArg=b;this.source=c}c.prototype.call=function(a,b){return b.subscribe(new Td(a,this.predicate,this.thisArg,this.source))};return c}(),Td=function(c){function a(b,a,e,f){b=c.call(this,b)||this;b.predicate=a;b.thisArg=e;b.source=f;b.index=0;b.thisArg=e||b;return b}h(a,c);a.prototype.notifyComplete=function(b){this.destination.next(b);
-this.destination.complete()};a.prototype._next=function(b){var a=!1;try{a=this.predicate.call(this.thisArg,b,this.index++,this.source)}catch(e){this.destination.error(e);return}a||this.notifyComplete(!1)};a.prototype._complete=function(){this.notifyComplete(!0)};return a}(m),Wd=function(){function c(){}c.prototype.call=function(a,b){return b.subscribe(new Vd(a))};return c}(),Vd=function(c){function a(b){b=c.call(this,b)||this;b.hasCompleted=!1;b.hasSubscription=!1;return b}h(a,c);a.prototype._next=
-function(b){this.hasSubscription||(this.hasSubscription=!0,this.add(p(this,b)))};a.prototype._complete=function(){this.hasCompleted=!0;this.hasSubscription||this.destination.complete()};a.prototype.notifyComplete=function(b){this.remove(b);this.hasSubscription=!1;this.hasCompleted&&this.destination.complete()};return a}(q),oc=function(){function c(a){this.project=a}c.prototype.call=function(a,b){return b.subscribe(new Xd(a,this.project))};return c}(),Xd=function(c){function a(b,a){b=c.call(this,b)||
-this;b.project=a;b.hasSubscription=!1;b.hasCompleted=!1;b.index=0;return b}h(a,c);a.prototype._next=function(b){this.hasSubscription||this.tryNext(b)};a.prototype.tryNext=function(b){var a,c=this.index++;try{a=this.project(b,c)}catch(f){this.destination.error(f);return}this.hasSubscription=!0;this._innerSub(a,b,c)};a.prototype._innerSub=function(b,a,c){a=new G(this,a,c);c=this.destination;c.add(a);b=p(this,b,void 0,void 0,a);b!==a&&c.add(b)};a.prototype._complete=function(){this.hasCompleted=!0;this.hasSubscription||
-this.destination.complete();this.unsubscribe()};a.prototype.notifyNext=function(b,a,c,f,g){this.destination.next(a)};a.prototype.notifyError=function(b){this.destination.error(b)};a.prototype.notifyComplete=function(b){this.destination.remove(b);this.hasSubscription=!1;this.hasCompleted&&this.destination.complete()};return a}(q),Zd=function(){function c(a,b,c){this.project=a;this.concurrent=b;this.scheduler=c}c.prototype.call=function(a,b){return b.subscribe(new Yd(a,this.project,this.concurrent,
-this.scheduler))};return c}(),Yd=function(c){function a(b,a,e,f){b=c.call(this,b)||this;b.project=a;b.concurrent=e;b.scheduler=f;b.index=0;b.active=0;b.hasCompleted=!1;e<Number.POSITIVE_INFINITY&&(b.buffer=[]);return b}h(a,c);a.dispatch=function(b){b.subscriber.subscribeToProjection(b.result,b.value,b.index)};a.prototype._next=function(b){var c=this.destination;if(c.closed)this._complete();else{var e=this.index++;if(this.active<this.concurrent){c.next(b);try{var f=this.project,g=f(b,e);this.scheduler?
-this.destination.add(this.scheduler.schedule(a.dispatch,0,{subscriber:this,result:g,value:b,index:e})):this.subscribeToProjection(g,b,e)}catch(l){c.error(l)}}else this.buffer.push(b)}};a.prototype.subscribeToProjection=function(b,a,c){this.active++;this.destination.add(p(this,b,a,c))};a.prototype._complete=function(){(this.hasCompleted=!0,0===this.active)&&this.destination.complete();this.unsubscribe()};a.prototype.notifyNext=function(b,a,c,f,g){this._next(a)};a.prototype.notifyComplete=function(b){var a=
-this.buffer;this.destination.remove(b);this.active--;a&&0<a.length&&this._next(a.shift());this.hasCompleted&&0===this.active&&this.destination.complete()};return a}(q),ae=function(){function c(a){this.callback=a}c.prototype.call=function(a,b){return b.subscribe(new $d(a,this.callback))};return c}(),$d=function(c){function a(b,a){b=c.call(this,b)||this;b.add(new t(a));return b}h(a,c);return a}(m),Cb=function(){function c(a,b,c,e){this.predicate=a;this.source=b;this.yieldIndex=c;this.thisArg=e}c.prototype.call=
-function(a,b){return b.subscribe(new be(a,this.predicate,this.source,this.yieldIndex,this.thisArg))};return c}(),be=function(c){function a(b,a,e,f,g){b=c.call(this,b)||this;b.predicate=a;b.source=e;b.yieldIndex=f;b.thisArg=g;b.index=0;return b}h(a,c);a.prototype.notifyComplete=function(b){var a=this.destination;a.next(b);a.complete();this.unsubscribe()};a.prototype._next=function(b){var a=this.predicate,c=this.thisArg,f=this.index++;try{a.call(c||this,b,f,this.source)&&this.notifyComplete(this.yieldIndex?
-f:b)}catch(g){this.destination.error(g)}};a.prototype._complete=function(){this.notifyComplete(this.yieldIndex?-1:void 0)};return a}(m),de=function(){function c(){}c.prototype.call=function(a,b){return b.subscribe(new ce(a))};return c}(),ce=function(c){function a(){return null!==c&&c.apply(this,arguments)||this}h(a,c);a.prototype._next=function(b){};return a}(m),fe=function(){function c(){}c.prototype.call=function(a,b){return b.subscribe(new ee(a))};return c}(),ee=function(c){function a(b){return c.call(this,
-b)||this}h(a,c);a.prototype.notifyComplete=function(b){var a=this.destination;a.next(b);a.complete()};a.prototype._next=function(b){this.notifyComplete(!1)};a.prototype._complete=function(){this.notifyComplete(!0)};return a}(m),pc=function(){function c(a){this.total=a;if(0>this.total)throw new X;}c.prototype.call=function(a,b){return b.subscribe(new ge(a,this.total))};return c}(),ge=function(c){function a(b,a){b=c.call(this,b)||this;b.total=a;b.ring=[];b.count=0;return b}h(a,c);a.prototype._next=
-function(b){var a=this.ring,c=this.total,f=this.count++;a.length<c?a.push(b):a[f%c]=b};a.prototype._complete=function(){var b=this.destination,a=this.count;if(0<a)for(var c=this.count>=this.total?this.total:this.count,f=this.ring,g=0;g<c;g++){var l=a++%c;b.next(f[l])}b.complete()};return a}(m),ie=function(){function c(a){this.value=a}c.prototype.call=function(a,b){return b.subscribe(new he(a,this.value))};return c}(),he=function(c){function a(b,a){b=c.call(this,b)||this;b.value=a;return b}h(a,c);
-a.prototype._next=function(b){this.destination.next(this.value)};return a}(m),ke=function(){function c(){}c.prototype.call=function(a,b){return b.subscribe(new je(a))};return c}(),je=function(c){function a(b){return c.call(this,b)||this}h(a,c);a.prototype._next=function(b){this.destination.next(w.createNext(b))};a.prototype._error=function(b){var a=this.destination;a.next(w.createError(b));a.complete()};a.prototype._complete=function(){var b=this.destination;b.next(w.createComplete());b.complete()};
-return a}(m),qc=function(){function c(a,b,c){void 0===c&&(c=!1);this.accumulator=a;this.seed=b;this.hasSeed=c}c.prototype.call=function(a,b){return b.subscribe(new le(a,this.accumulator,this.seed,this.hasSeed))};return c}(),le=function(c){function a(b,a,e,f){b=c.call(this,b)||this;b.accumulator=a;b._seed=e;b.hasSeed=f;b.index=0;return b}h(a,c);Object.defineProperty(a.prototype,"seed",{get:function(){return this._seed},set:function(b){this.hasSeed=!0;this._seed=b},enumerable:!0,configurable:!0});a.prototype._next=
-function(b){if(this.hasSeed)return this._tryNext(b);this.seed=b;this.destination.next(b)};a.prototype._tryNext=function(b){var a=this.index++,c;try{c=this.accumulator(this.seed,b,a)}catch(f){this.destination.error(f)}this.seed=c;this.destination.next(c)};return a}(m),ne=function(){function c(a,b,c){this.accumulator=a;this.seed=b;this.concurrent=c}c.prototype.call=function(a,b){return b.subscribe(new me(a,this.accumulator,this.seed,this.concurrent))};return c}(),me=function(c){function a(b,a,e,f){b=
-c.call(this,b)||this;b.accumulator=a;b.acc=e;b.concurrent=f;b.hasValue=!1;b.hasCompleted=!1;b.buffer=[];b.active=0;b.index=0;return b}h(a,c);a.prototype._next=function(b){if(this.active<this.concurrent){var a=this.index++,c=this.destination,f=void 0;try{var g=this.accumulator,f=g(this.acc,b,a)}catch(l){return c.error(l)}this.active++;this._innerSub(f,b,a)}else this.buffer.push(b)};a.prototype._innerSub=function(b,a,c){a=new G(this,a,c);c=this.destination;c.add(a);b=p(this,b,void 0,void 0,a);b!==a&&
-c.add(b)};a.prototype._complete=function(){this.hasCompleted=!0;0===this.active&&0===this.buffer.length&&(!1===this.hasValue&&this.destination.next(this.acc),this.destination.complete());this.unsubscribe()};a.prototype.notifyNext=function(b,a,c,f,g){b=this.destination;this.acc=a;this.hasValue=!0;b.next(a)};a.prototype.notifyComplete=function(b){var a=this.buffer;this.destination.remove(b);this.active--;0<a.length?this._next(a.shift()):0===this.active&&this.hasCompleted&&(!1===this.hasValue&&this.destination.next(this.acc),
-this.destination.complete())};return a}(q),rc=function(){function c(a,b){this.subjectFactory=a;this.selector=b}c.prototype.call=function(a,b){var c=this.selector,e=this.subjectFactory();a=c(e).subscribe(a);a.add(b.subscribe(e));return a};return c}(),pe=function(){function c(a){this.nextSources=a}c.prototype.call=function(a,b){return b.subscribe(new oe(a,this.nextSources))};return c}(),oe=function(c){function a(b,a){var d=c.call(this,b)||this;d.destination=b;d.nextSources=a;return d}h(a,c);a.prototype.notifyError=
-function(b,a){this.subscribeToNextSource()};a.prototype.notifyComplete=function(b){this.subscribeToNextSource()};a.prototype._error=function(b){this.subscribeToNextSource();this.unsubscribe()};a.prototype._complete=function(){this.subscribeToNextSource();this.unsubscribe()};a.prototype.subscribeToNextSource=function(){var b=this.nextSources.shift();if(b){var a=new G(this,void 0,void 0),c=this.destination;c.add(a);b=p(this,b,void 0,void 0,a);b!==a&&c.add(b)}else this.destination.complete()};return a}(q),
-re=function(){function c(){}c.prototype.call=function(a,b){return b.subscribe(new qe(a))};return c}(),qe=function(c){function a(b){b=c.call(this,b)||this;b.hasPrev=!1;return b}h(a,c);a.prototype._next=function(b){var a;this.hasPrev?a=[this.prev,b]:this.hasPrev=!0;this.prev=b;a&&this.destination.next(a)};return a}(m),Db=function(){function c(a,b){this.count=a;this.source=b}c.prototype.call=function(a,b){return b.subscribe(new se(a,this.count,this.source))};return c}(),se=function(c){function a(b,a,
-e){b=c.call(this,b)||this;b.count=a;b.source=e;return b}h(a,c);a.prototype.complete=function(){if(!this.isStopped){var b=this.source,a=this.count;if(0===a)return c.prototype.complete.call(this);-1<a&&(this.count=a-1);b.subscribe(this._unsubscribeAndRecycle())}};return a}(m),ue=function(){function c(a){this.notifier=a}c.prototype.call=function(a,b){return b.subscribe(new te(a,this.notifier,b))};return c}(),te=function(c){function a(b,a,e){b=c.call(this,b)||this;b.notifier=a;b.source=e;b.sourceIsBeingSubscribedTo=
-!0;return b}h(a,c);a.prototype.notifyNext=function(b,a,c,f,g){this.sourceIsBeingSubscribedTo=!0;this.source.subscribe(this)};a.prototype.notifyComplete=function(b){if(!1===this.sourceIsBeingSubscribedTo)return c.prototype.complete.call(this)};a.prototype.complete=function(){this.sourceIsBeingSubscribedTo=!1;if(!this.isStopped){this.retries||this.subscribeToRetries();if(!this.retriesSubscription||this.retriesSubscription.closed)return c.prototype.complete.call(this);this._unsubscribeAndRecycle();this.notifications.next()}};
-a.prototype._unsubscribe=function(){var b=this.notifications,a=this.retriesSubscription;b&&(b.unsubscribe(),this.notifications=null);a&&(a.unsubscribe(),this.retriesSubscription=null);this.retries=null};a.prototype._unsubscribeAndRecycle=function(){var b=this._unsubscribe;this._unsubscribe=null;c.prototype._unsubscribeAndRecycle.call(this);this._unsubscribe=b;return this};a.prototype.subscribeToRetries=function(){this.notifications=new v;var b;try{var a=this.notifier;b=a(this.notifications)}catch(e){return c.prototype.complete.call(this)}this.retries=
-b;this.retriesSubscription=p(this,b)};return a}(q),we=function(){function c(a,b){this.count=a;this.source=b}c.prototype.call=function(a,b){return b.subscribe(new ve(a,this.count,this.source))};return c}(),ve=function(c){function a(b,a,e){b=c.call(this,b)||this;b.count=a;b.source=e;return b}h(a,c);a.prototype.error=function(b){if(!this.isStopped){var a=this.source,e=this.count;if(0===e)return c.prototype.error.call(this,b);-1<e&&(this.count=e-1);a.subscribe(this._unsubscribeAndRecycle())}};return a}(m),
-ye=function(){function c(a,b){this.notifier=a;this.source=b}c.prototype.call=function(a,b){return b.subscribe(new xe(a,this.notifier,this.source))};return c}(),xe=function(c){function a(b,a,e){b=c.call(this,b)||this;b.notifier=a;b.source=e;return b}h(a,c);a.prototype.error=function(b){if(!this.isStopped){var a=this.errors,e=this.retries,f=this.retriesSubscription;if(e)this.retriesSubscription=this.errors=null;else{a=new v;try{var g=this.notifier,e=g(a)}catch(l){return c.prototype.error.call(this,
-l)}f=p(this,e)}this._unsubscribeAndRecycle();this.errors=a;this.retries=e;this.retriesSubscription=f;a.next(b)}};a.prototype._unsubscribe=function(){var b=this.errors,a=this.retriesSubscription;b&&(b.unsubscribe(),this.errors=null);a&&(a.unsubscribe(),this.retriesSubscription=null);this.retries=null};a.prototype.notifyNext=function(b,a,c,f,g){b=this._unsubscribe;this._unsubscribe=null;this._unsubscribeAndRecycle();this._unsubscribe=b;this.source.subscribe(this)};return a}(q),Ae=function(){function c(a){this.notifier=
-a}c.prototype.call=function(a,b){a=new ze(a);b=b.subscribe(a);b.add(p(a,this.notifier));return b};return c}(),ze=function(c){function a(){var b=null!==c&&c.apply(this,arguments)||this;b.hasValue=!1;return b}h(a,c);a.prototype._next=function(b){this.value=b;this.hasValue=!0};a.prototype.notifyNext=function(b,a,c,f,g){this.emitValue()};a.prototype.notifyComplete=function(){this.emitValue()};a.prototype.emitValue=function(){this.hasValue&&(this.hasValue=!1,this.destination.next(this.value))};return a}(q),
-Ce=function(){function c(a,b){this.period=a;this.scheduler=b}c.prototype.call=function(a,b){return b.subscribe(new Be(a,this.period,this.scheduler))};return c}(),Be=function(c){function a(b,a,e){b=c.call(this,b)||this;b.period=a;b.scheduler=e;b.hasValue=!1;b.add(e.schedule(uc,a,{subscriber:b,period:a}));return b}h(a,c);a.prototype._next=function(b){this.lastValue=b;this.hasValue=!0};a.prototype.notifyNext=function(){this.hasValue&&(this.hasValue=!1,this.destination.next(this.lastValue))};return a}(m),
-Ee=function(){function c(a,b){this.compareTo=a;this.comparator=b}c.prototype.call=function(a,b){return b.subscribe(new De(a,this.compareTo,this.comparator))};return c}(),De=function(c){function a(b,a,e){var d=c.call(this,b)||this;d.compareTo=a;d.comparator=e;d._a=[];d._b=[];d._oneComplete=!1;d.destination.add(a.subscribe(new Fe(b,d)));return d}h(a,c);a.prototype._next=function(b){this._oneComplete&&0===this._b.length?this.emit(!1):(this._a.push(b),this.checkValues())};a.prototype._complete=function(){this._oneComplete?
-this.emit(0===this._a.length&&0===this._b.length):this._oneComplete=!0;this.unsubscribe()};a.prototype.checkValues=function(){for(var b=this._a,a=this._b,c=this.comparator;0<b.length&&0<a.length;){var f=b.shift(),g=a.shift(),l=!1;try{l=c?c(f,g):f===g}catch(u){this.destination.error(u)}l||this.emit(!1)}};a.prototype.emit=function(b){var a=this.destination;a.next(b);a.complete()};a.prototype.nextB=function(b){this._oneComplete&&0===this._a.length?this.emit(!1):(this._b.push(b),this.checkValues())};
-a.prototype.completeB=function(){this._oneComplete?this.emit(0===this._a.length&&0===this._b.length):this._oneComplete=!0};return a}(m),Fe=function(c){function a(b,a){b=c.call(this,b)||this;b.parent=a;return b}h(a,c);a.prototype._next=function(b){this.parent.nextB(b)};a.prototype._error=function(b){this.parent.error(b);this.unsubscribe()};a.prototype._complete=function(){this.parent.completeB();this.unsubscribe()};return a}(m),He=function(){function c(a,b){this.predicate=a;this.source=b}c.prototype.call=
-function(a,b){return b.subscribe(new Ge(a,this.predicate,this.source))};return c}(),Ge=function(c){function a(b,a,e){b=c.call(this,b)||this;b.predicate=a;b.source=e;b.seenValue=!1;b.index=0;return b}h(a,c);a.prototype.applySingleValue=function(b){this.seenValue?this.destination.error("Sequence contains more than one element"):(this.seenValue=!0,this.singleValue=b)};a.prototype._next=function(b){var a=this.index++;this.predicate?this.tryNext(b,a):this.applySingleValue(b)};a.prototype.tryNext=function(b,
-a){try{this.predicate(b,a,this.source)&&this.applySingleValue(b)}catch(e){this.destination.error(e)}};a.prototype._complete=function(){var b=this.destination;0<this.index?(b.next(this.seenValue?this.singleValue:void 0),b.complete()):b.error(new ca)};return a}(m),Je=function(){function c(a){this.total=a}c.prototype.call=function(a,b){return b.subscribe(new Ie(a,this.total))};return c}(),Ie=function(c){function a(b,a){b=c.call(this,b)||this;b.total=a;b.count=0;return b}h(a,c);a.prototype._next=function(b){++this.count>
-this.total&&this.destination.next(b)};return a}(m),Le=function(){function c(a){this._skipCount=a;if(0>this._skipCount)throw new X;}c.prototype.call=function(a,b){return 0===this._skipCount?b.subscribe(new m(a)):b.subscribe(new Ke(a,this._skipCount))};return c}(),Ke=function(c){function a(b,a){b=c.call(this,b)||this;b._skipCount=a;b._count=0;b._ring=Array(a);return b}h(a,c);a.prototype._next=function(b){var a=this._skipCount,c=this._count++;if(c<a)this._ring[c]=b;else{var a=c%a,c=this._ring,f=c[a];
-c[a]=b;this.destination.next(f)}};return a}(m),Ne=function(){function c(a){this.notifier=a}c.prototype.call=function(a,b){return b.subscribe(new Me(a,this.notifier))};return c}(),Me=function(c){function a(a,d){a=c.call(this,a)||this;a.hasValue=!1;var b=new G(a,void 0,void 0);a.add(b);a.innerSubscription=b;d=p(a,d,void 0,void 0,b);d!==b&&(a.add(d),a.innerSubscription=d);return a}h(a,c);a.prototype._next=function(a){this.hasValue&&c.prototype._next.call(this,a)};a.prototype.notifyNext=function(a,c,
-e,f,g){this.hasValue=!0;this.innerSubscription&&this.innerSubscription.unsubscribe()};a.prototype.notifyComplete=function(){};return a}(q),Pe=function(){function c(a){this.predicate=a}c.prototype.call=function(a,b){return b.subscribe(new Oe(a,this.predicate))};return c}(),Oe=function(c){function a(a,d){a=c.call(this,a)||this;a.predicate=d;a.skipping=!0;a.index=0;return a}h(a,c);a.prototype._next=function(a){var b=this.destination;this.skipping&&this.tryCallPredicate(a);this.skipping||b.next(a)};a.prototype.tryCallPredicate=
-function(a){try{this.skipping=!!this.predicate(a,this.index++)}catch(d){this.destination.error(d)}};return a}(m),Qe=function(c){function a(a,d,e){void 0===d&&(d=0);void 0===e&&(e=pa);var b=c.call(this)||this;b.source=a;b.delayTime=d;b.scheduler=e;if(!V(d)||0>d)b.delayTime=0;e&&"function"===typeof e.schedule||(b.scheduler=pa);return b}h(a,c);a.create=function(b,c,e){void 0===c&&(c=0);void 0===e&&(e=pa);return new a(b,c,e)};a.dispatch=function(a){return this.add(a.source.subscribe(a.subscriber))};a.prototype._subscribe=
-function(b){return this.scheduler.schedule(a.dispatch,this.delayTime,{source:this.source,subscriber:b})};return a}(n),Re=function(){function c(a,b){this.scheduler=a;this.delay=b}c.prototype.call=function(a,b){return(new Qe(b,this.delay,this.scheduler)).subscribe(a)};return c}(),xc=function(){function c(a){this.project=a}c.prototype.call=function(a,b){return b.subscribe(new Se(a,this.project))};return c}(),Se=function(c){function a(a,d){a=c.call(this,a)||this;a.project=d;a.index=0;return a}h(a,c);
-a.prototype._next=function(a){var b,c=this.index++;try{b=this.project(a,c)}catch(f){this.destination.error(f);return}this._innerSub(b,a,c)};a.prototype._innerSub=function(a,c,e){var b=this.innerSubscription;b&&b.unsubscribe();c=new G(this,c,e);e=this.destination;e.add(c);this.innerSubscription=p(this,a,void 0,void 0,c);this.innerSubscription!==c&&e.add(this.innerSubscription)};a.prototype._complete=function(){var a=this.innerSubscription;a&&!a.closed||c.prototype._complete.call(this);this.unsubscribe()};
-a.prototype._unsubscribe=function(){this.innerSubscription=null};a.prototype.notifyComplete=function(a){this.destination.remove(a);this.innerSubscription=null;this.isStopped&&c.prototype._complete.call(this)};a.prototype.notifyNext=function(a,c,e,f,g){this.destination.next(c)};return a}(q),Ue=function(){function c(a){this.notifier=a}c.prototype.call=function(a,b){a=new Te(a);var c=p(a,this.notifier);return c&&!a.seenValue?(a.add(c),b.subscribe(a)):a};return c}(),Te=function(c){function a(a){a=c.call(this,
-a)||this;a.seenValue=!1;return a}h(a,c);a.prototype.notifyNext=function(a,c,e,f,g){this.seenValue=!0;this.complete()};a.prototype.notifyComplete=function(){};return a}(q),We=function(){function c(a,b){this.predicate=a;this.inclusive=b}c.prototype.call=function(a,b){return b.subscribe(new Ve(a,this.predicate,this.inclusive))};return c}(),Ve=function(c){function a(a,d,e){a=c.call(this,a)||this;a.predicate=d;a.inclusive=e;a.index=0;return a}h(a,c);a.prototype._next=function(a){var b=this.destination,
-c;try{c=this.predicate(a,this.index++)}catch(f){b.error(f);return}this.nextOrComplete(a,c)};a.prototype.nextOrComplete=function(a,c){var b=this.destination;c?b.next(a):(this.inclusive&&b.next(a),b.complete())};return a}(m),Ye=function(){function c(a,b,c){this.nextOrObserver=a;this.error=b;this.complete=c}c.prototype.call=function(a,b){return b.subscribe(new Xe(a,this.nextOrObserver,this.error,this.complete))};return c}(),Xe=function(c){function a(a,d,e,f){a=c.call(this,a)||this;a._tapNext=D;a._tapError=
-D;a._tapComplete=D;a._tapError=e||D;a._tapComplete=f||D;P(d)?(a._context=a,a._tapNext=d):d&&(a._context=d,a._tapNext=d.next||D,a._tapError=d.error||D,a._tapComplete=d.complete||D);return a}h(a,c);a.prototype._next=function(a){try{this._tapNext.call(this._context,a)}catch(d){this.destination.error(d);return}this.destination.next(a)};a.prototype._error=function(a){try{this._tapError.call(this._context,a)}catch(d){this.destination.error(d);return}this.destination.error(a)};a.prototype._complete=function(){try{this._tapComplete.call(this._context)}catch(b){this.destination.error(b);
-return}return this.destination.complete()};return a}(m),Eb={leading:!0,trailing:!1},$e=function(){function c(a,b,c){this.durationSelector=a;this.leading=b;this.trailing=c}c.prototype.call=function(a,b){return b.subscribe(new Ze(a,this.durationSelector,this.leading,this.trailing))};return c}(),Ze=function(c){function a(a,d,e,f){var b=c.call(this,a)||this;b.destination=a;b.durationSelector=d;b._leading=e;b._trailing=f;b._hasValue=!1;return b}h(a,c);a.prototype._next=function(a){this._hasValue=!0;this._sendValue=
-a;this._throttled||(this._leading?this.send():this.throttle(a))};a.prototype.send=function(){var a=this._sendValue;this._hasValue&&(this.destination.next(a),this.throttle(a));this._hasValue=!1;this._sendValue=null};a.prototype.throttle=function(a){(a=this.tryDurationSelector(a))&&this.add(this._throttled=p(this,a))};a.prototype.tryDurationSelector=function(a){try{return this.durationSelector(a)}catch(d){return this.destination.error(d),null}};a.prototype.throttlingDone=function(){var a=this._throttled,
-c=this._trailing;a&&a.unsubscribe();this._throttled=null;c&&this.send()};a.prototype.notifyNext=function(a,c,e,f,g){this.throttlingDone()};a.prototype.notifyComplete=function(){this.throttlingDone()};return a}(q),bf=function(){function c(a,b,c,e){this.duration=a;this.scheduler=b;this.leading=c;this.trailing=e}c.prototype.call=function(a,b){return b.subscribe(new af(a,this.duration,this.scheduler,this.leading,this.trailing))};return c}(),af=function(c){function a(a,d,e,f,g){a=c.call(this,a)||this;
-a.duration=d;a.scheduler=e;a.leading=f;a.trailing=g;a._hasTrailingValue=!1;a._trailingValue=null;return a}h(a,c);a.prototype._next=function(a){this.throttled?this.trailing&&(this._trailingValue=a,this._hasTrailingValue=!0):(this.add(this.throttled=this.scheduler.schedule(yc,this.duration,{subscriber:this})),this.leading?this.destination.next(a):this.trailing&&(this._trailingValue=a,this._hasTrailingValue=!0))};a.prototype._complete=function(){this._hasTrailingValue&&this.destination.next(this._trailingValue);
-this.destination.complete()};a.prototype.clearThrottle=function(){var a=this.throttled;a&&(this.trailing&&this._hasTrailingValue&&(this.destination.next(this._trailingValue),this._trailingValue=null,this._hasTrailingValue=!1),a.unsubscribe(),this.remove(a),this.throttled=null)};return a}(m),cf=function(){return function(c,a){this.value=c;this.interval=a}}(),zc=function(){function c(a,b,c,e){this.waitFor=a;this.absoluteTimeout=b;this.withObservable=c;this.scheduler=e}c.prototype.call=function(a,b){return b.subscribe(new df(a,
-this.absoluteTimeout,this.waitFor,this.withObservable,this.scheduler))};return c}(),df=function(c){function a(a,d,e,f,g){a=c.call(this,a)||this;a.absoluteTimeout=d;a.waitFor=e;a.withObservable=f;a.scheduler=g;a.action=null;a.scheduleTimeout();return a}h(a,c);a.dispatchTimeout=function(a){var b=a.withObservable;a._unsubscribeAndRecycle();a.add(p(a,b))};a.prototype.scheduleTimeout=function(){var b=this.action;b?this.action=b.schedule(this,this.waitFor):this.add(this.action=this.scheduler.schedule(a.dispatchTimeout,
-this.waitFor,this))};a.prototype._next=function(a){this.absoluteTimeout||this.scheduleTimeout();c.prototype._next.call(this,a)};a.prototype._unsubscribe=function(){this.withObservable=this.scheduler=this.action=null};return a}(q),ef=function(){return function(c,a){this.value=c;this.timestamp=a}}(),gf=function(){function c(a){this.windowBoundaries=a}c.prototype.call=function(a,b){a=new ff(a);b=b.subscribe(a);b.closed||a.add(p(a,this.windowBoundaries));return b};return c}(),ff=function(c){function a(a){var b=
-c.call(this,a)||this;b.window=new v;a.next(b.window);return b}h(a,c);a.prototype.notifyNext=function(a,c,e,f,g){this.openWindow()};a.prototype.notifyError=function(a,c){this._error(a)};a.prototype.notifyComplete=function(a){this._complete()};a.prototype._next=function(a){this.window.next(a)};a.prototype._error=function(a){this.window.error(a);this.destination.error(a)};a.prototype._complete=function(){this.window.complete();this.destination.complete()};a.prototype._unsubscribe=function(){this.window=
-null};a.prototype.openWindow=function(){var a=this.window;a&&a.complete();var a=this.destination,c=this.window=new v;a.next(c)};return a}(q),jf=function(){function c(a,b){this.windowSize=a;this.startWindowEvery=b}c.prototype.call=function(a,b){return b.subscribe(new hf(a,this.windowSize,this.startWindowEvery))};return c}(),hf=function(c){function a(a,d,e){var b=c.call(this,a)||this;b.destination=a;b.windowSize=d;b.startWindowEvery=e;b.windows=[new v];b.count=0;a.next(b.windows[0]);return b}h(a,c);
-a.prototype._next=function(a){for(var b=0<this.startWindowEvery?this.startWindowEvery:this.windowSize,c=this.destination,f=this.windowSize,g=this.windows,l=g.length,h=0;h<l&&!this.closed;h++)g[h].next(a);a=this.count-f+1;0<=a&&0===a%b&&!this.closed&&g.shift().complete();0!==++this.count%b||this.closed||(b=new v,g.push(b),c.next(b))};a.prototype._error=function(a){var b=this.windows;if(b)for(;0<b.length&&!this.closed;)b.shift().error(a);this.destination.error(a)};a.prototype._complete=function(){var a=
-this.windows;if(a)for(;0<a.length&&!this.closed;)a.shift().complete();this.destination.complete()};a.prototype._unsubscribe=function(){this.count=0;this.windows=null};return a}(m),lf=function(){function c(a,b,c,e){this.windowTimeSpan=a;this.windowCreationInterval=b;this.maxWindowSize=c;this.scheduler=e}c.prototype.call=function(a,b){return b.subscribe(new kf(a,this.windowTimeSpan,this.windowCreationInterval,this.maxWindowSize,this.scheduler))};return c}(),mf=function(c){function a(){var a=null!==
-c&&c.apply(this,arguments)||this;a._numberOfNextedValues=0;return a}h(a,c);a.prototype.next=function(a){this._numberOfNextedValues++;c.prototype.next.call(this,a)};Object.defineProperty(a.prototype,"numberOfNextedValues",{get:function(){return this._numberOfNextedValues},enumerable:!0,configurable:!0});return a}(v),kf=function(c){function a(a,d,e,f,g){var b=c.call(this,a)||this;b.destination=a;b.windowTimeSpan=d;b.windowCreationInterval=e;b.maxWindowSize=f;b.scheduler=g;b.windows=[];a=b.openWindow();
-null!==e&&0<=e?(f={windowTimeSpan:d,windowCreationInterval:e,subscriber:b,scheduler:g},b.add(g.schedule(lb,d,{subscriber:b,window:a,context:null})),b.add(g.schedule(Cc,e,f))):b.add(g.schedule(Bc,d,{subscriber:b,window:a,windowTimeSpan:d}));return b}h(a,c);a.prototype._next=function(a){for(var b=this.windows,c=b.length,f=0;f<c;f++){var g=b[f];g.closed||(g.next(a),g.numberOfNextedValues>=this.maxWindowSize&&this.closeWindow(g))}};a.prototype._error=function(a){for(var b=this.windows;0<b.length;)b.shift().error(a);
-this.destination.error(a)};a.prototype._complete=function(){for(var a=this.windows;0<a.length;){var c=a.shift();c.closed||c.complete()}this.destination.complete()};a.prototype.openWindow=function(){var a=new mf;this.windows.push(a);this.destination.next(a);return a};a.prototype.closeWindow=function(a){a.complete();var b=this.windows;b.splice(b.indexOf(a),1)};return a}(m),of=function(){function c(a,b){this.openings=a;this.closingSelector=b}c.prototype.call=function(a,b){return b.subscribe(new nf(a,
-this.openings,this.closingSelector))};return c}(),nf=function(c){function a(a,d,e){a=c.call(this,a)||this;a.openings=d;a.closingSelector=e;a.contexts=[];a.add(a.openSubscription=p(a,d,d));return a}h(a,c);a.prototype._next=function(a){var b=this.contexts;if(b)for(var c=b.length,f=0;f<c;f++)b[f].window.next(a)};a.prototype._error=function(a){var b=this.contexts;this.contexts=null;if(b)for(var e=b.length,f=-1;++f<e;){var g=b[f];g.window.error(a);g.subscription.unsubscribe()}c.prototype._error.call(this,
-a)};a.prototype._complete=function(){var a=this.contexts;this.contexts=null;if(a)for(var d=a.length,e=-1;++e<d;){var f=a[e];f.window.complete();f.subscription.unsubscribe()}c.prototype._complete.call(this)};a.prototype._unsubscribe=function(){var a=this.contexts;this.contexts=null;if(a)for(var c=a.length,e=-1;++e<c;){var f=a[e];f.window.unsubscribe();f.subscription.unsubscribe()}};a.prototype.notifyNext=function(a,c,e,f,g){if(a===this.openings){a=void 0;try{var b=this.closingSelector;a=b(c)}catch(u){return this.error(u)}c=
-new v;b=new t;e={window:c,subscription:b};this.contexts.push(e);a=p(this,a,e);a.closed?this.closeWindow(this.contexts.length-1):(a.context=e,b.add(a));this.destination.next(c)}else this.closeWindow(this.contexts.indexOf(a))};a.prototype.notifyError=function(a){this.error(a)};a.prototype.notifyComplete=function(a){a!==this.openSubscription&&this.closeWindow(this.contexts.indexOf(a.context))};a.prototype.closeWindow=function(a){if(-1!==a){var b=this.contexts,c=b[a],f=c.window,c=c.subscription;b.splice(a,
-1);f.complete();c.unsubscribe()}};return a}(q),qf=function(){function c(a){this.closingSelector=a}c.prototype.call=function(a,b){return b.subscribe(new pf(a,this.closingSelector))};return c}(),pf=function(c){function a(a,d){var b=c.call(this,a)||this;b.destination=a;b.closingSelector=d;b.openWindow();return b}h(a,c);a.prototype.notifyNext=function(a,c,e,f,g){this.openWindow(g)};a.prototype.notifyError=function(a,c){this._error(a)};a.prototype.notifyComplete=function(a){this.openWindow(a)};a.prototype._next=
-function(a){this.window.next(a)};a.prototype._error=function(a){this.window.error(a);this.destination.error(a);this.unsubscribeClosingNotification()};a.prototype._complete=function(){this.window.complete();this.destination.complete();this.unsubscribeClosingNotification()};a.prototype.unsubscribeClosingNotification=function(){this.closingNotification&&this.closingNotification.unsubscribe()};a.prototype.openWindow=function(a){void 0===a&&(a=null);a&&(this.remove(a),a.unsubscribe());(a=this.window)&&
-a.complete();a=this.window=new v;this.destination.next(a);var b;try{var c=this.closingSelector;b=c()}catch(f){this.destination.error(f);this.window.error(f);return}this.add(this.closingNotification=p(this,b))};return a}(q),sf=function(){function c(a,b){this.observables=a;this.project=b}c.prototype.call=function(a,b){return b.subscribe(new rf(a,this.observables,this.project))};return c}(),rf=function(c){function a(a,d,e){a=c.call(this,a)||this;a.observables=d;a.project=e;a.toRespond=[];e=d.length;
-a.values=Array(e);for(var b=0;b<e;b++)a.toRespond.push(b);for(b=0;b<e;b++){var g=d[b];a.add(p(a,g,g,b))}return a}h(a,c);a.prototype.notifyNext=function(a,c,e,f,g){this.values[e]=c;a=this.toRespond;0<a.length&&(e=a.indexOf(e),-1!==e&&a.splice(e,1))};a.prototype.notifyComplete=function(){};a.prototype._next=function(a){0===this.toRespond.length&&(a=[a].concat(this.values),this.project?this._tryProject(a):this.destination.next(a))};a.prototype._tryProject=function(a){var b;try{b=this.project.apply(this,
-a)}catch(e){this.destination.error(e);return}this.destination.next(b)};return a}(q),tf=Object.freeze({audit:eb,auditTime:function(c,a){void 0===a&&(a=y);return eb(function(){return bb(c,a)})},buffer:function(c){return function(a){return a.lift(new md(c))}},bufferCount:function(c,a){void 0===a&&(a=null);return function(b){return b.lift(new pd(c,a))}},bufferTime:function(c){var a=arguments.length,b=y;A(arguments[arguments.length-1])&&(b=arguments[arguments.length-1],a--);var d=null;2<=a&&(d=arguments[1]);
-var e=Number.POSITIVE_INFINITY;3<=a&&(e=arguments[2]);return function(a){return a.lift(new rd(c,d,e,b))}},bufferToggle:function(c,a){return function(b){return b.lift(new ud(c,a))}},bufferWhen:function(c){return function(a){return a.lift(new wd(c))}},catchError:function(c){return function(a){var b=new yd(c);a=a.lift(b);return b.caught=a}},combineAll:function(c){return function(a){return a.lift(new Ha(c))}},combineLatest:function(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];var b=null;
-"function"===typeof c[c.length-1]&&(b=c.pop());1===c.length&&x(c[0])&&(c=c[0].slice());return function(a){return a.lift.call(F([a].concat(c)),new Ha(b))}},concat:function(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];return function(a){return a.lift.call(aa.apply(void 0,[a].concat(c)))}},concatAll:Va,concatMap:hb,concatMapTo:function(c,a){return hb(function(){return c},a)},count:function(c){return function(a){return a.lift(new Ad(c,a))}},debounce:function(c){return function(a){return a.lift(new Cd(c))}},
-debounceTime:function(c,a){void 0===a&&(a=y);return function(b){return b.lift(new Ed(c,a))}},defaultIfEmpty:ba,delay:function(c,a){void 0===a&&(a=y);var b=c instanceof Date&&!isNaN(+c)?+c-a.now():Math.abs(c);return function(c){return c.lift(new Hd(b,a))}},delayWhen:function(c,a){return a?function(b){return(new Ld(b,a)).lift(new Bb(c))}:function(a){return a.lift(new Bb(c))}},dematerialize:function(){return function(c){return c.lift(new Nd)}},distinct:function(c,a){return function(b){return b.lift(new Pd(c,
-a))}},distinctUntilChanged:ib,distinctUntilKeyChanged:function(c,a){return ib(function(b,d){return a?a(b[c],d[c]):b[c]===d[c]})},elementAt:function(c,a){if(0>c)throw new X;var b=2<=arguments.length;return function(d){return d.pipe(H(function(a,b){return b===c}),Ba(1),b?ba(a):ja(function(){return new X}))}},endWith:function(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];return function(a){return aa(a,ga.apply(void 0,c))}},every:function(c,a){return function(b){return b.lift(new Ud(c,a,
-b))}},exhaust:function(){return function(c){return c.lift(new Wd)}},exhaustMap:jb,expand:function(c,a,b){void 0===a&&(a=Number.POSITIVE_INFINITY);void 0===b&&(b=void 0);a=1>(a||0)?Number.POSITIVE_INFINITY:a;return function(d){return d.lift(new Zd(c,a,b))}},filter:H,finalize:function(c){return function(a){return a.lift(new ae(c))}},find:function(c,a){if("function"!==typeof c)throw new TypeError("predicate is not a function");return function(b){return b.lift(new Cb(c,b,!1,a))}},findIndex:function(c,
-a){return function(b){return b.lift(new Cb(c,b,!0,a))}},first:function(c,a){var b=2<=arguments.length;return function(d){return d.pipe(c?H(function(a,b){return c(a,b,d)}):J,Ba(1),b?ba(a):ja(function(){return new ca}))}},groupBy:function(c,a,b,d){return function(e){return e.lift(new Nc(c,a,b,d))}},ignoreElements:function(){return function(c){return c.lift(new de)}},isEmpty:function(){return function(c){return c.lift(new fe)}},last:function(c,a){var b=2<=arguments.length;return function(d){return d.pipe(c?
-H(function(a,b){return c(a,b,d)}):J,ka(1),b?ba(a):ja(function(){return new ca}))}},map:B,mapTo:function(c){return function(a){return a.lift(new ie(c))}},materialize:function(){return function(c){return c.lift(new ke)}},max:function(c){return ma("function"===typeof c?function(a,b){return 0<c(a,b)?a:b}:function(a,b){return a>b?a:b})},merge:function(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];return function(a){return a.lift.call(Za.apply(void 0,[a].concat(c)))}},mergeAll:ya,mergeMap:L,
-flatMap:L,mergeMapTo:function(c,a,b){void 0===b&&(b=Number.POSITIVE_INFINITY);if("function"===typeof a)return L(function(){return c},a,b);"number"===typeof a&&(b=a);return L(function(){return c},b)},mergeScan:function(c,a,b){void 0===b&&(b=Number.POSITIVE_INFINITY);return function(d){return d.lift(new ne(c,a,b))}},min:function(c){return ma("function"===typeof c?function(a,b){return 0>c(a,b)?a:b}:function(a,b){return a<b?a:b})},multicast:M,observeOn:function(c,a){void 0===a&&(a=0);return function(b){return b.lift(new Rc(c,
-a))}},onErrorResumeNext:function(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];1===c.length&&x(c[0])&&(c=c[0]);return function(a){return a.lift(new pe(c))}},pairwise:function(){return function(c){return c.lift(new re)}},partition:function(c,a){return function(b){return[H(c,a)(b),H($a(c,a))(b)]}},pluck:function(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];var b=c.length;if(0===b)throw Error("list of properties cannot be empty.");return function(a){return B(tc(c,b))(a)}},
-publish:function(c){return c?M(function(){return new v},c):M(new v)},publishBehavior:function(c){return function(a){return M(new tb(c))(a)}},publishLast:function(){return function(c){return M(new T)(c)}},publishReplay:function(c,a,b,d){b&&"function"!==typeof b&&(d=b);var e="function"===typeof b?b:void 0,f=new W(c,a,d);return function(a){return M(function(){return f},e)(a)}},race:function(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];return function(a){1===c.length&&x(c[0])&&(c=c[0]);
-return a.lift.call(ab.apply(void 0,[a].concat(c)))}},reduce:ma,repeat:function(c){void 0===c&&(c=-1);return function(a){return 0===c?R():0>c?a.lift(new Db(-1,a)):a.lift(new Db(c-1,a))}},repeatWhen:function(c){return function(a){return a.lift(new ue(c))}},retry:function(c){void 0===c&&(c=-1);return function(a){return a.lift(new we(c,a))}},retryWhen:function(c){return function(a){return a.lift(new ye(c,a))}},refCount:ua,sample:function(c){return function(a){return a.lift(new Ae(c))}},sampleTime:function(c,
-a){void 0===a&&(a=y);return function(b){return b.lift(new Ce(c,a))}},scan:la,sequenceEqual:function(c,a){return function(b){return b.lift(new Ee(c,a))}},share:function(){return function(c){return ua()(M(vc)(c))}},shareReplay:function(c,a,b){var d;d=c&&"object"===typeof c?c:{bufferSize:c,windowTime:a,refCount:!1,scheduler:b};return function(a){return a.lift(wc(d))}},single:function(c){return function(a){return a.lift(new He(c,a))}},skip:function(c){return function(a){return a.lift(new Je(c))}},skipLast:function(c){return function(a){return a.lift(new Le(c))}},
-skipUntil:function(c){return function(a){return a.lift(new Ne(c))}},skipWhile:function(c){return function(a){return a.lift(new Pe(c))}},startWith:function(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];var b=c[c.length-1];return A(b)?(c.pop(),function(a){return aa(c,a,b)}):function(a){return aa(c,a)}},subscribeOn:function(c,a){void 0===a&&(a=0);return function(b){return b.lift(new Re(c,a))}},switchAll:function(){return da(J)},switchMap:da,switchMapTo:function(c,a){return a?da(function(){return c},
-a):da(function(){return c})},take:Ba,takeLast:ka,takeUntil:function(c){return function(a){return a.lift(new Ue(c))}},takeWhile:function(c,a){void 0===a&&(a=!1);return function(b){return b.lift(new We(c,a))}},tap:function(c,a,b){return function(d){return d.lift(new Ye(c,a,b))}},throttle:function(c,a){void 0===a&&(a=Eb);return function(b){return b.lift(new $e(c,a.leading,a.trailing))}},throttleTime:function(c,a,b){void 0===a&&(a=y);void 0===b&&(b=Eb);return function(d){return d.lift(new bf(c,a,b.leading,
-b.trailing))}},throwIfEmpty:ja,timeInterval:function(c){void 0===c&&(c=y);return function(a){return za(function(){return a.pipe(la(function(a,d){a=a.current;return{value:d,current:c.now(),last:a}},{current:c.now(),value:void 0,last:void 0}),B(function(a){return new cf(a.value,a.current-a.last)}))})}},timeout:function(c,a){void 0===a&&(a=y);return kb(c,wa(new yb),a)},timeoutWith:kb,timestamp:function(c){void 0===c&&(c=y);return B(function(a){return new ef(a,c.now())})},toArray:function(){return ma(Ac,
-[])},window:function(c){return function(a){return a.lift(new gf(c))}},windowCount:function(c,a){void 0===a&&(a=0);return function(b){return b.lift(new jf(c,a))}},windowTime:function(c,a,b,d){var e=y,f=null,g=Number.POSITIVE_INFINITY;A(d)&&(e=d);A(b)?e=b:V(b)&&(g=b);A(a)?e=a:V(a)&&(f=a);return function(a){return a.lift(new lf(c,f,g,e))}},windowToggle:function(c,a){return function(b){return b.lift(new of(c,a))}},windowWhen:function(c){return function(a){return a.lift(new qf(c))}},withLatestFrom:function(){for(var c=
-[],a=0;a<arguments.length;a++)c[a]=arguments[a];return function(a){var b;"function"===typeof c[c.length-1]&&(b=c.pop());return a.lift(new sf(c,b))}},zip:function(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];return function(a){return a.lift.call(cb.apply(void 0,[a].concat(c)))}},zipAll:function(c){return function(a){return a.lift(new db(c))}}}),fa=function(){return function(c,a){void 0===a&&(a=Number.POSITIVE_INFINITY);this.subscribedFrame=c;this.unsubscribedFrame=a}}(),Fb=function(){function c(){this.subscriptions=
-[]}c.prototype.logSubscribedFrame=function(){this.subscriptions.push(new fa(this.scheduler.now()));return this.subscriptions.length-1};c.prototype.logUnsubscribedFrame=function(a){var b=this.subscriptions;b[a]=new fa(b[a].subscribedFrame,this.scheduler.now())};return c}(),Ia=function(c){function a(a,d){var b=c.call(this,function(a){var b=this,c=b.logSubscribedFrame(),d=new t;d.add(new t(function(){b.logUnsubscribedFrame(c)}));b.scheduleMessages(a);return d})||this;b.messages=a;b.subscriptions=[];
-b.scheduler=d;return b}h(a,c);a.prototype.scheduleMessages=function(a){for(var b=this.messages.length,c=0;c<b;c++){var f=this.messages[c];a.add(this.scheduler.schedule(function(a){a.message.notification.observe(a.subscriber)},f.frame,{message:f,subscriber:a}))}};return a}(n);mb(Ia,[Fb]);var Gb=function(c){function a(a,d){var b=c.call(this)||this;b.messages=a;b.subscriptions=[];b.scheduler=d;return b}h(a,c);a.prototype._subscribe=function(a){var b=this,e=b.logSubscribedFrame(),f=new t;f.add(new t(function(){b.logUnsubscribedFrame(e)}));
-f.add(c.prototype._subscribe.call(this,a));return f};a.prototype.setup=function(){for(var a=this,c=a.messages.length,e=0;e<c;e++)(function(){var b=a.messages[e];a.scheduler.schedule(function(){b.notification.observe(a)},b.frame)})()};return a}(v);mb(Gb,[Fb]);var vf=function(c){function a(a){var b=c.call(this,Ga,750)||this;b.assertDeepEqual=a;b.hotObservables=[];b.coldObservables=[];b.flushTests=[];b.runMode=!1;return b}h(a,c);a.prototype.createTime=function(b){b=b.indexOf("|");if(-1===b)throw Error('marble diagram for time should have a completion marker "|"');
-return b*a.frameTimeFactor};a.prototype.createColdObservable=function(b,c,e){if(-1!==b.indexOf("^"))throw Error('cold observable cannot have subscription offset "^"');if(-1!==b.indexOf("!"))throw Error('cold observable cannot have unsubscription marker "!"');b=a.parseMarbles(b,c,e,void 0,this.runMode);b=new Ia(b,this);this.coldObservables.push(b);return b};a.prototype.createHotObservable=function(b,c,e){if(-1!==b.indexOf("!"))throw Error('hot observable cannot have unsubscription marker "!"');b=a.parseMarbles(b,
-c,e,void 0,this.runMode);b=new Gb(b,this);this.hotObservables.push(b);return b};a.prototype.materializeInnerObservable=function(a,c){var b=this,d=[];a.subscribe(function(a){d.push({frame:b.frame-c,notification:w.createNext(a)})},function(a){d.push({frame:b.frame-c,notification:w.createError(a)})},function(){d.push({frame:b.frame-c,notification:w.createComplete()})});return d};a.prototype.expectObservable=function(b,c){var d=this;void 0===c&&(c=null);var f=[],g={actual:f,ready:!1};c=a.parseMarblesAsSubscriptions(c,
-this.runMode);var h=c.unsubscribedFrame,k;this.schedule(function(){k=b.subscribe(function(a){var b=a;a instanceof n&&(b=d.materializeInnerObservable(b,d.frame));f.push({frame:d.frame,notification:w.createNext(b)})},function(a){f.push({frame:d.frame,notification:w.createError(a)})},function(){f.push({frame:d.frame,notification:w.createComplete()})})},c.subscribedFrame===Number.POSITIVE_INFINITY?0:c.subscribedFrame);h!==Number.POSITIVE_INFINITY&&this.schedule(function(){return k.unsubscribe()},h);this.flushTests.push(g);
-var m=this.runMode;return{toBe:function(b,c,d){g.ready=!0;g.expected=a.parseMarbles(b,c,d,!0,m)}}};a.prototype.expectSubscriptions=function(b){var c={actual:b,ready:!1};this.flushTests.push(c);var e=this.runMode;return{toBe:function(b){b="string"===typeof b?[b]:b;c.ready=!0;c.expected=b.map(function(b){return a.parseMarblesAsSubscriptions(b,e)})}}};a.prototype.flush=function(){for(var a=this,d=this.hotObservables;0<d.length;)d.shift().setup();c.prototype.flush.call(this);this.flushTests=this.flushTests.filter(function(b){return b.ready?
-(a.assertDeepEqual(b.actual,b.expected),!1):!0})};a.parseMarblesAsSubscriptions=function(a,c){var b=this;void 0===c&&(c=!1);if("string"!==typeof a)return new fa(Number.POSITIVE_INFINITY);for(var d=a.length,g=-1,h=Number.POSITIVE_INFINITY,k=Number.POSITIVE_INFINITY,m=0,r=function(d){var e=m,f=function(a){e+=a*b.frameTimeFactor},l=a[d];switch(l){case " ":c||f(1);break;case "-":f(1);break;case "(":g=m;f(1);break;case ")":g=-1;f(1);break;case "^":if(h!==Number.POSITIVE_INFINITY)throw Error("found a second subscription point '^' in a subscription marble diagram. There can only be one.");
-h=-1<g?g:m;f(1);break;case "!":if(k!==Number.POSITIVE_INFINITY)throw Error("found a second subscription point '^' in a subscription marble diagram. There can only be one.");k=-1<g?g:m;break;default:if(c&&l.match(/^[0-9]$/)&&(0===d||" "===a[d-1])){var r=a.slice(d).match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);if(r){d+=r[0].length-1;var l=parseFloat(r[1]),u=void 0;switch(r[2]){case "ms":u=l;break;case "s":u=1E3*l;break;case "m":u=6E4*l}f(u/n.frameTimeFactor);break}}throw Error("there can only be '^' and '!' markers in a subscription marble diagram. Found instead '"+
-l+"'.");}m=e;p=d},n=this,p,q=0;q<d;q++)r(q),q=p;return 0>k?new fa(h):new fa(h,k)};a.parseMarbles=function(a,c,e,f,g){var b=this;void 0===f&&(f=!1);void 0===g&&(g=!1);if(-1!==a.indexOf("!"))throw Error('conventional marble diagrams cannot have the unsubscription marker "!"');for(var d=a.length,h=[],k=g?a.replace(/^[ ]+/,"").indexOf("^"):a.indexOf("^"),m=-1===k?0:k*-this.frameTimeFactor,n="object"!==typeof c?function(a){return a}:function(a){return f&&c[a]instanceof Ia?c[a].messages:c[a]},p=-1,k=function(c){var d=
-m,f=function(a){d+=a*b.frameTimeFactor},l=void 0,k=a[c];switch(k){case " ":g||f(1);break;case "-":f(1);break;case "(":p=m;f(1);break;case ")":p=-1;f(1);break;case "|":l=w.createComplete();f(1);break;case "^":f(1);break;case "#":l=w.createError(e||"error");f(1);break;default:if(g&&k.match(/^[0-9]$/)&&(0===c||" "===a[c-1])){var u=a.slice(c).match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);if(u){c+=u[0].length-1;var k=parseFloat(u[1]),r=void 0;switch(u[2]){case "ms":r=k;break;case "s":r=1E3*k;break;case "m":r=
-6E4*k}f(r/q.frameTimeFactor);break}}l=w.createNext(n(k));f(1)}l&&h.push({frame:-1<p?p:m,notification:l});m=d;t=c},q=this,t,v=0;v<d;v++)k(v),v=t;return h};a.prototype.run=function(b){var c=a.frameTimeFactor,e=this.maxFrames;a.frameTimeFactor=1;this.maxFrames=Number.POSITIVE_INFINITY;this.runMode=!0;O.delegate=this;var f={cold:this.createColdObservable.bind(this),hot:this.createHotObservable.bind(this),flush:this.flush.bind(this),expectObservable:this.expectObservable.bind(this),expectSubscriptions:this.expectSubscriptions.bind(this)};
-try{var g=b(f);this.flush();return g}finally{a.frameTimeFactor=c,this.maxFrames=e,this.runMode=!1,O.delegate=void 0}};return a}(xb),wf=Object.freeze({TestScheduler:vf}),xf="undefined"!==typeof self&&"undefined"!==typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,yf="undefined"!==typeof global&&global,z="undefined"!==typeof window&&window||yf||xf;if(!z)throw Error("RxJS could not find any global context (window, self, global)");var Jc=B(function(c,a){return c.response}),N=function(c){function a(a){var b=
-c.call(this)||this,e={async:!0,createXHR:function(){var a;if(this.crossDomain)if(z.XMLHttpRequest)a=new z.XMLHttpRequest;else if(z.XDomainRequest)a=new z.XDomainRequest;else throw Error("CORS is not supported by your browser");else if(z.XMLHttpRequest)a=new z.XMLHttpRequest;else{var b=void 0;try{for(var c=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],d=0;3>d;d++)try{b=c[d];new z.ActiveXObject(b);break}catch(r){}a=new z.ActiveXObject(b)}catch(r){throw Error("XMLHttpRequest is not supported by your browser");
-}}return a},crossDomain:!0,withCredentials:!1,headers:{},method:"GET",responseType:"json",timeout:0};if("string"===typeof a)e.url=a;else for(var f in a)a.hasOwnProperty(f)&&(e[f]=a[f]);b.request=e;return b}h(a,c);a.prototype._subscribe=function(a){return new zf(a,this.request)};a.create=function(){var b=function(b){return new a(b)};b.get=Dc;b.post=Ec;b.delete=Fc;b.put=Gc;b.patch=Hc;b.getJSON=Ic;return b}();return a}(n),zf=function(c){function a(a,d){a=c.call(this,a)||this;a.request=d;a.done=!1;var b=
-d.headers=d.headers||{};d.crossDomain||a.getHeader(b,"X-Requested-With")||(b["X-Requested-With"]="XMLHttpRequest");a.getHeader(b,"Content-Type")||z.FormData&&d.body instanceof z.FormData||"undefined"===typeof d.body||(b["Content-Type"]="application/x-www-form-urlencoded; charset\x3dUTF-8");d.body=a.serializeBody(d.body,a.getHeader(d.headers,"Content-Type"));a.send();return a}h(a,c);a.prototype.next=function(a){this.done=!0;var b=this.xhr,c=this.request,f=this.destination,g;try{g=new Hb(a,b,c)}catch(l){return f.error(l)}f.next(g)};
-a.prototype.send=function(){var a=this.request,c=this.request,e=c.user,f=c.method,g=c.url,h=c.async,k=c.password,m=c.headers,c=c.body;try{var r=this.xhr=a.createXHR();this.setupEvents(r,a);e?r.open(f,g,h,e,k):r.open(f,g,h);h&&(r.timeout=a.timeout,r.responseType=a.responseType);"withCredentials"in r&&(r.withCredentials=!!a.withCredentials);this.setHeaders(r,m);c?r.send(c):r.send()}catch(Xb){this.error(Xb)}};a.prototype.serializeBody=function(a,c){if(!a||"string"===typeof a||z.FormData&&a instanceof
-z.FormData)return a;if(c){var b=c.indexOf(";");-1!==b&&(c=c.substring(0,b))}switch(c){case "application/x-www-form-urlencoded":return Object.keys(a).map(function(b){return encodeURIComponent(b)+"\x3d"+encodeURIComponent(a[b])}).join("\x26");case "application/json":return JSON.stringify(a);default:return a}};a.prototype.setHeaders=function(a,c){for(var b in c)c.hasOwnProperty(b)&&a.setRequestHeader(b,c[b])};a.prototype.getHeader=function(a,c){for(var b in a)if(b.toLowerCase()===c.toLowerCase())return a[b]};
-a.prototype.setupEvents=function(a,c){function b(a){var c=b.subscriber,d=b.progressSubscriber,e=b.request;d&&d.error(a);var f;try{f=new Ib(this,e)}catch(Ja){f=Ja}c.error(f)}function d(a){}function g(a){var b=g.subscriber,c=g.progressSubscriber,d=g.request;if(4===this.readyState){var e=1223===this.status?204:this.status,f="text"===this.responseType?this.response||this.responseText:this.response;0===e&&(e=f?200:0);if(400>e)c&&c.complete(),b.next(a),b.complete();else{c&&c.error(a);a=void 0;try{a=new qa("ajax error "+
-e,this,d)}catch(uf){a=uf}b.error(a)}}}var h=c.progressSubscriber;a.ontimeout=b;b.request=c;b.subscriber=this;b.progressSubscriber=h;if(a.upload&&"withCredentials"in a){if(h){var k;k=function(a){k.progressSubscriber.next(a)};z.XDomainRequest?a.onprogress=k:a.upload.onprogress=k;k.progressSubscriber=h}var m;m=function(a){var b=m.progressSubscriber,c=m.subscriber,d=m.request;b&&b.error(a);var e;try{e=new qa("ajax error",this,d)}catch(Ja){e=Ja}c.error(e)};a.onerror=m;m.request=c;m.subscriber=this;m.progressSubscriber=
-h}a.onreadystatechange=d;d.subscriber=this;d.progressSubscriber=h;d.request=c;a.onload=g;g.subscriber=this;g.progressSubscriber=h;g.request=c};a.prototype.unsubscribe=function(){var a=this.xhr;!this.done&&a&&4!==a.readyState&&"function"===typeof a.abort&&a.abort();c.prototype.unsubscribe.call(this)};return a}(m),Hb=function(){return function(c,a,b){this.originalEvent=c;this.xhr=a;this.request=b;this.status=a.status;this.responseType=a.responseType||b.responseType;this.response=nb(this.responseType,
-a)}}(),qa=function(){function c(a,b,c){Error.call(this);this.message=a;this.name="AjaxError";this.xhr=b;this.request=c;this.status=b.status;this.responseType=b.responseType||c.responseType;this.response=nb(this.responseType,b);return this}c.prototype=Object.create(Error.prototype);return c}(),Ib=function(c,a){qa.call(this,"ajax timeout",c,a);this.name="AjaxTimeoutError";return this},Af=Object.freeze({ajax:N.create,AjaxResponse:Hb,AjaxError:qa,AjaxTimeoutError:Ib}),Bf={url:"",deserializer:function(c){return JSON.parse(c.data)},
-serializer:function(c){return JSON.stringify(c)}},Jb=function(c){function a(a,d){var b=c.call(this)||this;if(a instanceof n)b.destination=d,b.source=a;else{d=b._config=ob({},Bf);b._output=new v;if("string"===typeof a)d.url=a;else for(var f in a)a.hasOwnProperty(f)&&(d[f]=a[f]);if(!d.WebSocketCtor&&WebSocket)d.WebSocketCtor=WebSocket;else if(!d.WebSocketCtor)throw Error("no WebSocket constructor can be found");b.destination=new W}return b}h(a,c);a.prototype.lift=function(b){var c=new a(this._config,
-this.destination);c.operator=b;c.source=this;return c};a.prototype._resetState=function(){this._socket=null;this.source||(this.destination=new W);this._output=new v};a.prototype.multiplex=function(a,c,e){var b=this;return new n(function(d){try{b.next(a())}catch(u){d.error(u)}var f=b.subscribe(function(a){try{e(a)&&d.next(a)}catch(K){d.error(K)}},function(a){return d.error(a)},function(){return d.complete()});return function(){try{b.next(c())}catch(u){d.error(u)}f.unsubscribe()}})};a.prototype._connectSocket=
-function(){var a=this,c=this._config,e=c.WebSocketCtor,f=c.protocol,g=c.url,c=c.binaryType,h=this._output,k=null;try{this._socket=k=f?new e(g,f):new e(g),c&&(this._socket.binaryType=c)}catch(r){h.error(r);return}var n=new t(function(){a._socket=null;k&&1===k.readyState&&k.close()});k.onopen=function(b){if(a._socket){var c=a._config.openObserver;c&&c.next(b);b=a.destination;a.destination=m.create(function(b){if(1===k.readyState)try{var c=a._config.serializer;k.send(c(b))}catch(Zb){a.destination.error(Zb)}},
-function(b){var c=a._config.closingObserver;c&&c.next(void 0);b&&b.code?k.close(b.code,b.reason):h.error(new TypeError("WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }"));a._resetState()},function(){var b=a._config.closingObserver;b&&b.next(void 0);k.close();a._resetState()});b&&b instanceof W&&n.add(b.subscribe(a.destination))}else k.close(),a._resetState()};k.onerror=function(b){a._resetState();h.error(b)};k.onclose=
-function(b){a._resetState();var c=a._config.closeObserver;c&&c.next(b);b.wasClean?h.complete():h.error(b)};k.onmessage=function(b){try{var c=a._config.deserializer;h.next(c(b))}catch(Yb){h.error(Yb)}}};a.prototype._subscribe=function(a){var b=this,c=this.source;if(c)return c.subscribe(a);this._socket||this._connectSocket();this._output.subscribe(a);a.add(function(){var a=b._socket;0===b._output.observers.length&&(a&&1===a.readyState&&a.close(),b._resetState())});return a};a.prototype.unsubscribe=
-function(){var a=this._socket;a&&1===a.readyState&&a.close();this._resetState();c.prototype.unsubscribe.call(this)};return a}(Da),Cf=Object.freeze({webSocket:function(c){return new Jb(c)},WebSocketSubject:Jb}),Df=Object.freeze({fromFetch:function(c,a){return new n(function(b){var d=new AbortController,e=d.signal,f=!0,g=!1;a?(a.signal&&(a.signal.aborted?d.abort():a.signal.addEventListener("abort",function(){e.aborted||d.abort()})),a=ob({},a,{signal:e})):a={signal:e};fetch(c,a).then(function(a){f=!1;
-b.next(a);b.complete()}).catch(function(a){f=!1;g||b.error(a)});return function(){g=!0;f&&d.abort()}})}});k.operators=tf;k.testing=wf;k.ajax=Af;k.webSocket=Cf;k.fetch=Df;k.Observable=n;k.ConnectableObservable=sb;k.GroupedObservable=Ea;k.observable=U;k.Subject=v;k.BehaviorSubject=tb;k.ReplaySubject=W;k.AsyncSubject=T;k.asapScheduler=pa;k.asyncScheduler=y;k.queueScheduler=ub;k.animationFrameScheduler=Yc;k.VirtualTimeScheduler=xb;k.VirtualAction=Ga;k.Scheduler=Fa;k.Subscription=t;k.Subscriber=m;k.Notification=
-w;k.pipe=ta;k.noop=D;k.identity=J;k.isObservable=function(c){return!!c&&(c instanceof n||"function"===typeof c.lift&&"function"===typeof c.subscribe)};k.ArgumentOutOfRangeError=X;k.EmptyError=ca;k.ObjectUnsubscribedError=I;k.UnsubscriptionError=Y;k.TimeoutError=yb;k.bindCallback=Pa;k.bindNodeCallback=Qa;k.combineLatest=function(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];var b=a=null;A(c[c.length-1])&&(b=c.pop());"function"===typeof c[c.length-1]&&(a=c.pop());1===c.length&&x(c[0])&&
-(c=c[0]);return Z(c,b).lift(new Ha(a))};k.concat=aa;k.defer=za;k.empty=R;k.forkJoin=function(){for(var c=[],a=0;a<arguments.length;a++)c[a]=arguments[a];if(1===c.length){var b=c[0];if(x(b))return ia(b,null);if(ra(b)&&Object.getPrototypeOf(b)===Object.prototype)return c=Object.keys(b),ia(c.map(function(a){return b[a]}),c)}if("function"===typeof c[c.length-1]){var d=c.pop(),c=1===c.length&&x(c[0])?c[0]:c;return ia(c,null).pipe(B(function(a){return d.apply(void 0,a)}))}return ia(c,null)};k.from=F;k.fromEvent=
-Wa;k.fromEventPattern=Ya;k.generate=function(c,a,b,d,e){var f,g;1==arguments.length?(g=c.initialState,a=c.condition,b=c.iterate,f=c.resultSelector||J,e=c.scheduler):void 0===d||A(d)?(g=c,f=J,e=d):(g=c,f=d);return new n(function(c){var d=g;if(e)return e.schedule($b,0,{subscriber:c,iterate:b,condition:a,resultSelector:f,state:d});do{if(a){var h=void 0;try{h=a(d)}catch(r){c.error(r);break}if(!h){c.complete();break}}h=void 0;try{h=f(d)}catch(r){c.error(r);break}c.next(h);if(c.closed)break;try{d=b(d)}catch(r){c.error(r);
-break}}while(1)})};k.iif=function(c,a,b){void 0===a&&(a=S);void 0===b&&(b=S);return za(function(){return c()?a:b})};k.interval=function(c,a){void 0===c&&(c=0);void 0===a&&(a=y);if(!V(c)||0>c)c=0;a&&"function"===typeof a.schedule||(a=y);return new n(function(b){b.add(a.schedule(ac,c,{subscriber:b,counter:0,period:c}));return b})};k.merge=Za;k.never=function(){return Ab};k.of=ga;k.onErrorResumeNext=Aa;k.pairs=function(c,a){return a?new n(function(b){var d=Object.keys(c),e=new t;e.add(a.schedule(bc,
-0,{keys:d,index:0,subscriber:b,subscription:e,obj:c}));return e}):new n(function(a){for(var b=Object.keys(c),e=0;e<b.length&&!a.closed;e++){var f=b[e];c.hasOwnProperty(f)&&a.next([f,c[f]])}a.complete()})};k.partition=function(c,a,b){return[H(a,b)(new n(ha(c))),H($a(a,b))(new n(ha(c)))]};k.race=ab;k.range=function(c,a,b){void 0===c&&(c=0);return new n(function(d){void 0===a&&(a=c,c=0);var e=0,f=c;if(b)return b.schedule(ec,0,{index:e,count:a,start:c,subscriber:d});do{if(e++>=a){d.complete();break}d.next(f++);
-if(d.closed)break}while(1)})};k.throwError=wa;k.timer=bb;k.using=function(c,a){return new n(function(b){var d;try{d=c()}catch(g){b.error(g);return}var e;try{e=a(d)}catch(g){b.error(g);return}var f=(e?F(e):S).subscribe(b);return function(){f.unsubscribe();d&&d.unsubscribe()}})};k.zip=cb;k.scheduled=Ta;k.EMPTY=S;k.NEVER=Ab;k.config=C;Object.defineProperty(k,"__esModule",{value:!0})});
-//# sourceMappingURL=rxjs.umd.min.js.map
-
diff --git a/node_modules/rxjs/bundles/rxjs.umd.min.js.map b/node_modules/rxjs/bundles/rxjs.umd.min.js.map
deleted file mode 100644
index 5835f5e..0000000
--- a/node_modules/rxjs/bundles/rxjs.umd.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"","lineCount":258,"mappings":"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","sources":["../Input_0"],"names":["global","factory","exports","module","define","amd","rxjs","__extends","d","b","__","constructor","extendStatics","prototype","Object","create","isFunction","x","hostReportError","err","setTimeout","isObject","flattenUnsubscriptionErrors","errors","reduce","errs","concat","UnsubscriptionError","canReportError","observer","destination","_a","isStopped","closed","Subscriber","noop","pipe","fns","_i","arguments","length","pipeFromArray","piped","input","prev","fn","getPromiseCtor","promiseCtor","config","Promise","Error","refCount","refCountOperatorFunction","source","lift","RefCountOperator","empty$1","scheduler","emptyScheduled","EMPTY","Observable","subscriber","schedule","complete","isScheduler","value","scheduleArray","sub","Subscription","i","add","next","fromArray","subscribeToArray","of","args","pop","throwError","error","dispatch","findAndClearHandle","handle","activeHandles","identity","map","project","thisArg","mapOperation","TypeError","MapOperator","bindCallback","callbackFunc","resultSelector","apply","isArray","context","subject","params","dispatch$1","state","AsyncSubject","handler","innerArgs","console","warn","subscribe","_this","dispatchNext","bindNodeCallback","undefined","dispatch$2","shift","dispatchError$1","dispatchNext$1","arg","isPromise","then","subscribeToResult","outerSubscriber","result","outerValue","outerIndex","innerSubscriber","InnerSubscriber","subscribeTo","scheduleObservable","observable$$1","observable","schedulePromise","scheduleIterable","iterator$$1","return","iterator","done","scheduled","isArrayLike","from","mergeMap","concurrent","Number","POSITIVE_INFINITY","a","ii","MergeMapOperator","mergeAll","concatAll","observables","defer","observableFactory","forkJoinInternal","sources","keys","len","values","Array","completed","emitted","_loop_1","hasValue","key","fromEvent","target","eventName","options","setupSubscription","e","slice","call","sourceObj","unsubscribe","addEventListener","removeEventListener","on","off","addListener","removeListener","fromEventPattern","addHandler","removeHandler","retValue","dispatch$3","condition","needIterate","iterate","conditionResult","isNumeric","val","parseFloat","dispatch$4","counter","period","merge","last","onErrorResumeNext","first","remainder","subNext","dispatch$5","index","subscription","obj","not","pred","notPred","filter","predicate","filterOperatorFunction","FilterOperator","race","RaceOperator","dispatch$6","start","count","timer","dueTime","periodOrScheduler","async","due","now","dispatch$7","zip","ZipOperator","audit","durationSelector","auditOperatorFunction","AuditOperator","dispatchBufferTimeSpanOnly","prevContext","closeContext","openContext","closeAction","bufferTimeSpan","dispatchBufferCreation","bufferCreationInterval","dispatchBufferClose","action","concatMap","dispatchNext$2","debouncedNext","defaultIfEmpty","defaultValue","DefaultIfEmptyOperator","distinctUntilChanged","compare","keySelector","DistinctUntilChangedOperator","throwIfEmpty","errorFactory","defaultErrorFactory","ThrowIfEmptyOperator","EmptyError","take","TakeOperator","exhaustMap","ExhaustMapOperator","takeLast","takeLastOperatorFunction","TakeLastOperator","scan","accumulator","seed","hasSeed","scanOperatorFunction","ScanOperator","reduceOperatorFunctionWithSeed","reduceOperatorFunction","acc","multicast","subjectOrSubjectFactory","selector","multicastOperatorFunction","subjectFactory","MulticastOperator","connectable","connectableObservableDescriptor","plucker","props","mapper","currentProp","p","dispatchNotification","notifyNext","shareSubjectFactory","Subject","shareReplayOperator","_b","bufferSize","_c","windowTime","useRefCount","hasError","isComplete","shareReplayOperation","ReplaySubject","innerSub","switchMap","SwitchMapOperator","dispatchNext$3","clearThrottle","timeoutWith","withObservable","absoluteTimeout","Date","isNaN","waitFor","Math","abs","TimeoutWithOperator","toArrayReducer","arr","item","push","dispatchWindowTimeSpanOnly","windowTimeSpan","window","closeWindow","openWindow","dispatchWindowCreation","windowCreationInterval","dispatchWindowClose","timeSpanState","remove","applyMixins","derivedCtor","baseCtors","baseCtor","propertyKeys","getOwnPropertyNames","j","len2","name_1","ajaxGet","url","headers","AjaxObservable","method","ajaxPost","body","ajaxDelete","ajaxPut","ajaxPatch","ajaxGetJSON","mapResponse","responseType","parseXhrResponse","xhr","response","JSON","parse","responseText","responseXML","setPrototypeOf","__proto__","hasOwnProperty","__assign","assign","t","s","n","_enable_super_gross_mode_that_will_cause_bad_things","useDeprecatedSynchronousErrorHandling","stack","log","empty","UnsubscriptionErrorImpl","message","toString","join","name","_subscriptions","_parentOrParents","_unsubscribe","Subscription.prototype.unsubscribe","parent_1","Subscription.prototype.add","teardown","tmp","indexOf","subscriptions","Subscription.prototype.remove","subscriptionIndex","splice","rxSubscriber","Symbol","random","_super","destinationOrNext","syncErrorValue","syncErrorThrown","syncErrorThrowable","SafeSubscriber","Subscriber.create","Subscriber.prototype.next","_next","Subscriber.prototype.error","_error","Subscriber.prototype.complete","_complete","Subscriber.prototype.unsubscribe","Subscriber.prototype._next","Subscriber.prototype._error","Subscriber.prototype._complete","_unsubscribeAndRecycle","Subscriber.prototype._unsubscribeAndRecycle","_parentSubscriber","observerOrNext","bind","_context","SafeSubscriber.prototype.next","__tryOrSetError","__tryOrUnsub","SafeSubscriber.prototype.error","SafeSubscriber.prototype.complete","wrappedComplete","SafeSubscriber.prototype.__tryOrUnsub","SafeSubscriber.prototype.__tryOrSetError","parent","SafeSubscriber.prototype._unsubscribe","_isScalar","_subscribe","Observable.prototype.lift","operator","Observable.prototype.subscribe","sink","_trySubscribe","Observable.prototype._trySubscribe","forEach","Observable.prototype.forEach","resolve","reject","Observable.prototype._subscribe","Observable.prototype.pipe","operations","toPromise","Observable.prototype.toPromise","Observable.create","ObjectUnsubscribedError","ObjectUnsubscribedErrorImpl","SubjectSubscription","SubjectSubscription.prototype.unsubscribe","observers","subscriberIndex","SubjectSubscriber","thrownError","Subject.prototype.lift","AnonymousSubject","Subject.prototype.next","copy","Subject.prototype.error","Subject.prototype.complete","Subject.prototype.unsubscribe","Subject.prototype._trySubscribe","Subject.prototype._subscribe","asObservable","Subject.prototype.asObservable","Subject.create","AnonymousSubject.prototype.next","AnonymousSubject.prototype.error","AnonymousSubject.prototype.complete","AnonymousSubject.prototype._subscribe","RefCountOperator.prototype.call","_refCount","refCounter","RefCountSubscriber","connection","connect","RefCountSubscriber.prototype._unsubscribe","sharedConnection","_connection","ConnectableObservable","_isComplete","ConnectableObservable.prototype._subscribe","getSubject","ConnectableObservable.prototype.getSubject","_subject","ConnectableObservable.prototype.connect","ConnectableSubscriber","ConnectableObservable.prototype.refCount","connectableProto","writable","ConnectableSubscriber.prototype._error","ConnectableSubscriber.prototype._complete","ConnectableSubscriber.prototype._unsubscribe","refCount$$1","GroupByOperator","elementSelector","subjectSelector","GroupByOperator.prototype.call","GroupBySubscriber","groups","attemptedToUnsubscribe","GroupBySubscriber.prototype._next","_group","GroupBySubscriber.prototype._group","Map","group","get","element","set","groupedObservable","GroupedObservable","duration","GroupDurationSubscriber","GroupBySubscriber.prototype._error","clear","GroupBySubscriber.prototype._complete","removeGroup","GroupBySubscriber.prototype.removeGroup","delete","GroupBySubscriber.prototype.unsubscribe","GroupDurationSubscriber.prototype._next","GroupDurationSubscriber.prototype._unsubscribe","groupSubject","refCountSubscription","GroupedObservable.prototype._subscribe","InnerRefCountSubscription","InnerRefCountSubscription.prototype.unsubscribe","BehaviorSubject","_value","defineProperty","getValue","enumerable","configurable","BehaviorSubject.prototype._subscribe","BehaviorSubject.prototype.getValue","BehaviorSubject.prototype.next","AsyncAction","work","pending","AsyncAction.prototype.schedule","delay","id","recycleAsyncId","requestAsyncId","AsyncAction.prototype.requestAsyncId","setInterval","flush","AsyncAction.prototype.recycleAsyncId","clearInterval","execute","AsyncAction.prototype.execute","_execute","AsyncAction.prototype._execute","errored","errorValue","AsyncAction.prototype._unsubscribe","actions","Action","Action.prototype.schedule","QueueAction","QueueAction.prototype.schedule","QueueAction.prototype.execute","QueueAction.prototype.requestAsyncId","Scheduler","SchedulerAction","Scheduler.prototype.schedule","Scheduler.now","AsyncScheduler","delegate","active","AsyncScheduler.prototype.schedule","AsyncScheduler.prototype.flush","queue","QueueScheduler","array","NotificationKind","Notification","kind","observe","Notification.prototype.observe","do","Notification.prototype.do","accept","Notification.prototype.accept","nextOrObserver","toObservable","Notification.prototype.toObservable","createNext","Notification.createNext","undefinedValueNotification","createError","Notification.createError","createComplete","Notification.createComplete","completeNotification","ObserveOnOperator","ObserveOnOperator.prototype.call","ObserveOnSubscriber","ObserveOnSubscriber.dispatch","notification","scheduleMessage","ObserveOnSubscriber.prototype.scheduleMessage","ObserveOnMessage","ObserveOnSubscriber.prototype._next","ObserveOnSubscriber.prototype._error","ObserveOnSubscriber.prototype._complete","_events","_infiniteTimeWindow","_bufferSize","_windowTime","nextInfiniteTimeWindow","nextTimeWindow","ReplaySubject.prototype.nextInfiniteTimeWindow","ReplaySubject.prototype.nextTimeWindow","ReplayEvent","_getNow","_trimBufferThenGetEvents","ReplaySubject.prototype._subscribe","ReplaySubject.prototype._getNow","ReplaySubject.prototype._trimBufferThenGetEvents","eventsCount","spliceCount","time","max","hasNext","hasCompleted","AsyncSubject.prototype._subscribe","AsyncSubject.prototype.next","AsyncSubject.prototype.error","AsyncSubject.prototype.complete","nextHandle","RESOLVED","Immediate","setImmediate","cb","clearImmediate","AsapAction","AsapAction.prototype.requestAsyncId","AsapAction.prototype.recycleAsyncId","asap","AsapScheduler","AsapScheduler.prototype.flush","AnimationFrameAction","AnimationFrameAction.prototype.requestAsyncId","requestAnimationFrame","AnimationFrameAction.prototype.recycleAsyncId","cancelAnimationFrame","animationFrame","AnimationFrameScheduler","AnimationFrameScheduler.prototype.flush","VirtualTimeScheduler","maxFrames","VirtualAction","frame","VirtualTimeScheduler.prototype.flush","frameTimeFactor","VirtualAction.prototype.schedule","VirtualAction.prototype.requestAsyncId","sort","sortActions","VirtualAction.prototype.recycleAsyncId","VirtualAction.prototype._execute","VirtualAction.sortActions","ArgumentOutOfRangeError","ArgumentOutOfRangeErrorImpl","EmptyErrorImpl","TimeoutError","TimeoutErrorImpl","MapOperator.prototype.call","MapSubscriber","MapSubscriber.prototype._next","OuterSubscriber","OuterSubscriber.prototype.notifyNext","innerValue","innerIndex","notifyError","OuterSubscriber.prototype.notifyError","notifyComplete","OuterSubscriber.prototype.notifyComplete","InnerSubscriber.prototype._next","InnerSubscriber.prototype._error","InnerSubscriber.prototype._complete","subscribeToPromise","promise","subscribeToIterable","iterable","subscribeToObservable","obs","NONE","CombineLatestOperator","CombineLatestOperator.prototype.call","CombineLatestSubscriber","CombineLatestSubscriber.prototype._next","CombineLatestSubscriber.prototype._complete","toRespond","CombineLatestSubscriber.prototype.notifyComplete","unused","CombineLatestSubscriber.prototype.notifyNext","oldVal","_tryResultSelector","CombineLatestSubscriber.prototype._tryResultSelector","MergeMapOperator.prototype.call","MergeMapSubscriber","buffer","MergeMapSubscriber.prototype._next","_tryNext","MergeMapSubscriber.prototype._tryNext","_innerSub","MergeMapSubscriber.prototype._innerSub","ish","innerSubscription","MergeMapSubscriber.prototype._complete","MergeMapSubscriber.prototype.notifyNext","MergeMapSubscriber.prototype.notifyComplete","NEVER","FilterOperator.prototype.call","FilterSubscriber","FilterSubscriber.prototype._next","RaceOperator.prototype.call","RaceSubscriber","hasFirst","RaceSubscriber.prototype._next","RaceSubscriber.prototype._complete","RaceSubscriber.prototype.notifyNext","ZipOperator.prototype.call","ZipSubscriber","iterators","ZipSubscriber.prototype._next","StaticArrayIterator","StaticIterator","ZipBufferIterator","ZipSubscriber.prototype._complete","stillUnsubscribed","notifyInactive","ZipSubscriber.prototype.notifyInactive","checkIterators","ZipSubscriber.prototype.checkIterators","shouldComplete","_tryresultSelector","ZipSubscriber.prototype._tryresultSelector","nextResult","StaticIterator.prototype.hasValue","StaticIterator.prototype.next","StaticIterator.prototype.hasCompleted","StaticArrayIterator.prototype.next","StaticArrayIterator.prototype.hasValue","StaticArrayIterator.prototype.hasCompleted","ZipBufferIterator.prototype.next","ZipBufferIterator.prototype.hasValue","ZipBufferIterator.prototype.hasCompleted","ZipBufferIterator.prototype.notifyComplete","ZipBufferIterator.prototype.notifyNext","ZipBufferIterator.prototype.subscribe","AuditOperator.prototype.call","AuditSubscriber","AuditSubscriber.prototype._next","throttled","AuditSubscriber.prototype.clearThrottle","AuditSubscriber.prototype.notifyNext","AuditSubscriber.prototype.notifyComplete","BufferOperator","closingNotifier","BufferOperator.prototype.call","BufferSubscriber","BufferSubscriber.prototype._next","BufferSubscriber.prototype.notifyNext","BufferCountOperator","startBufferEvery","subscriberClass","BufferSkipCountSubscriber","BufferCountSubscriber","BufferCountOperator.prototype.call","BufferCountSubscriber.prototype._next","BufferCountSubscriber.prototype._complete","buffers","BufferSkipCountSubscriber.prototype._next","BufferSkipCountSubscriber.prototype._complete","BufferTimeOperator","maxBufferSize","BufferTimeOperator.prototype.call","BufferTimeSubscriber","Context","contexts","timespanOnly","timeSpanOnlyState","creationState","closeState","BufferTimeSubscriber.prototype._next","filledBufferContext","context_1","onBufferFull","BufferTimeSubscriber.prototype._error","BufferTimeSubscriber.prototype._complete","context_2","BufferTimeSubscriber.prototype._unsubscribe","BufferTimeSubscriber.prototype.onBufferFull","BufferTimeSubscriber.prototype.openContext","BufferTimeSubscriber.prototype.closeContext","spliceIndex","BufferToggleOperator","openings","closingSelector","BufferToggleOperator.prototype.call","BufferToggleSubscriber","BufferToggleSubscriber.prototype._next","BufferToggleSubscriber.prototype._error","BufferToggleSubscriber.prototype._complete","BufferToggleSubscriber.prototype.notifyNext","closeBuffer","openBuffer","BufferToggleSubscriber.prototype.notifyComplete","BufferToggleSubscriber.prototype.openBuffer","trySubscribe","BufferToggleSubscriber.prototype.closeBuffer","BufferToggleSubscriber.prototype.trySubscribe","BufferWhenOperator","BufferWhenOperator.prototype.call","BufferWhenSubscriber","subscribing","BufferWhenSubscriber.prototype._next","BufferWhenSubscriber.prototype._complete","BufferWhenSubscriber.prototype._unsubscribe","BufferWhenSubscriber.prototype.notifyNext","BufferWhenSubscriber.prototype.notifyComplete","BufferWhenSubscriber.prototype.openBuffer","closingSubscription","CatchOperator","CatchOperator.prototype.call","CatchSubscriber","caught","CatchSubscriber.prototype.error","err2","CountOperator","CountOperator.prototype.call","CountSubscriber","CountSubscriber.prototype._next","_tryPredicate","CountSubscriber.prototype._tryPredicate","CountSubscriber.prototype._complete","DebounceOperator","DebounceOperator.prototype.call","DebounceSubscriber","durationSubscription","DebounceSubscriber.prototype._next","DebounceSubscriber.prototype._complete","emitValue","DebounceSubscriber.prototype._tryNext","DebounceSubscriber.prototype.notifyNext","DebounceSubscriber.prototype.notifyComplete","DebounceSubscriber.prototype.emitValue","DebounceTimeOperator","DebounceTimeOperator.prototype.call","DebounceTimeSubscriber","debouncedSubscription","lastValue","DebounceTimeSubscriber.prototype._next","clearDebounce","DebounceTimeSubscriber.prototype._complete","DebounceTimeSubscriber.prototype.debouncedNext","DebounceTimeSubscriber.prototype.clearDebounce","DefaultIfEmptyOperator.prototype.call","DefaultIfEmptySubscriber","isEmpty","DefaultIfEmptySubscriber.prototype._next","DefaultIfEmptySubscriber.prototype._complete","DelayOperator","DelayOperator.prototype.call","DelaySubscriber","DelaySubscriber.dispatch","delay_1","_schedule","DelaySubscriber.prototype._schedule","scheduleNotification","DelaySubscriber.prototype.scheduleNotification","DelayMessage","DelaySubscriber.prototype._next","DelaySubscriber.prototype._error","DelaySubscriber.prototype._complete","DelayWhenOperator","delayDurationSelector","DelayWhenOperator.prototype.call","DelayWhenSubscriber","delayNotifierSubscriptions","DelayWhenSubscriber.prototype.notifyNext","removeSubscription","tryComplete","DelayWhenSubscriber.prototype.notifyError","DelayWhenSubscriber.prototype.notifyComplete","DelayWhenSubscriber.prototype._next","delayNotifier","tryDelay","DelayWhenSubscriber.prototype._complete","DelayWhenSubscriber.prototype.removeSubscription","subscriptionIdx","DelayWhenSubscriber.prototype.tryDelay","notifierSubscription","DelayWhenSubscriber.prototype.tryComplete","SubscriptionDelayObservable","subscriptionDelay","SubscriptionDelayObservable.prototype._subscribe","SubscriptionDelaySubscriber","sourceSubscribed","SubscriptionDelaySubscriber.prototype._next","subscribeToSource","SubscriptionDelaySubscriber.prototype._error","SubscriptionDelaySubscriber.prototype._complete","SubscriptionDelaySubscriber.prototype.subscribeToSource","DeMaterializeOperator","DeMaterializeOperator.prototype.call","DeMaterializeSubscriber","DeMaterializeSubscriber.prototype._next","DistinctOperator","flushes","DistinctOperator.prototype.call","DistinctSubscriber","Set","DistinctSubscriber.prototype.notifyNext","DistinctSubscriber.prototype.notifyError","DistinctSubscriber.prototype._next","_useKeySelector","_finalizeNext","DistinctSubscriber.prototype._useKeySelector","DistinctSubscriber.prototype._finalizeNext","has","DistinctUntilChangedOperator.prototype.call","DistinctUntilChangedSubscriber","hasKey","DistinctUntilChangedSubscriber.prototype.compare","y","DistinctUntilChangedSubscriber.prototype._next","ThrowIfEmptyOperator.prototype.call","ThrowIfEmptySubscriber","ThrowIfEmptySubscriber.prototype._next","ThrowIfEmptySubscriber.prototype._complete","total","TakeOperator.prototype.call","TakeSubscriber","TakeSubscriber.prototype._next","EveryOperator","EveryOperator.prototype.call","EverySubscriber","EverySubscriber.prototype.notifyComplete","everyValueMatch","EverySubscriber.prototype._next","EverySubscriber.prototype._complete","SwitchFirstOperator","SwitchFirstOperator.prototype.call","SwitchFirstSubscriber","hasSubscription","SwitchFirstSubscriber.prototype._next","SwitchFirstSubscriber.prototype._complete","SwitchFirstSubscriber.prototype.notifyComplete","ExhaustMapOperator.prototype.call","ExhaustMapSubscriber","ExhaustMapSubscriber.prototype._next","tryNext","ExhaustMapSubscriber.prototype.tryNext","ExhaustMapSubscriber.prototype._innerSub","ExhaustMapSubscriber.prototype._complete","ExhaustMapSubscriber.prototype.notifyNext","ExhaustMapSubscriber.prototype.notifyError","ExhaustMapSubscriber.prototype.notifyComplete","ExpandOperator","ExpandOperator.prototype.call","ExpandSubscriber","ExpandSubscriber.dispatch","subscribeToProjection","ExpandSubscriber.prototype._next","ExpandSubscriber.prototype.subscribeToProjection","ExpandSubscriber.prototype._complete","ExpandSubscriber.prototype.notifyNext","ExpandSubscriber.prototype.notifyComplete","FinallyOperator","callback","FinallyOperator.prototype.call","FinallySubscriber","FindValueOperator","yieldIndex","FindValueOperator.prototype.call","FindValueSubscriber","FindValueSubscriber.prototype.notifyComplete","FindValueSubscriber.prototype._next","FindValueSubscriber.prototype._complete","IgnoreElementsOperator","IgnoreElementsOperator.prototype.call","IgnoreElementsSubscriber","IgnoreElementsSubscriber.prototype._next","IsEmptyOperator","IsEmptyOperator.prototype.call","IsEmptySubscriber","IsEmptySubscriber.prototype.notifyComplete","IsEmptySubscriber.prototype._next","IsEmptySubscriber.prototype._complete","TakeLastOperator.prototype.call","TakeLastSubscriber","ring","TakeLastSubscriber.prototype._next","TakeLastSubscriber.prototype._complete","idx","MapToOperator","MapToOperator.prototype.call","MapToSubscriber","MapToSubscriber.prototype._next","MaterializeOperator","MaterializeOperator.prototype.call","MaterializeSubscriber","MaterializeSubscriber.prototype._next","MaterializeSubscriber.prototype._error","MaterializeSubscriber.prototype._complete","ScanOperator.prototype.call","ScanSubscriber","_seed","ScanSubscriber.prototype._next","ScanSubscriber.prototype._tryNext","MergeScanOperator","MergeScanOperator.prototype.call","MergeScanSubscriber","MergeScanSubscriber.prototype._next","MergeScanSubscriber.prototype._innerSub","MergeScanSubscriber.prototype._complete","MergeScanSubscriber.prototype.notifyNext","MergeScanSubscriber.prototype.notifyComplete","MulticastOperator.prototype.call","OnErrorResumeNextOperator","nextSources","OnErrorResumeNextOperator.prototype.call","OnErrorResumeNextSubscriber","OnErrorResumeNextSubscriber.prototype.notifyError","subscribeToNextSource","OnErrorResumeNextSubscriber.prototype.notifyComplete","OnErrorResumeNextSubscriber.prototype._error","OnErrorResumeNextSubscriber.prototype._complete","OnErrorResumeNextSubscriber.prototype.subscribeToNextSource","PairwiseOperator","PairwiseOperator.prototype.call","PairwiseSubscriber","hasPrev","PairwiseSubscriber.prototype._next","pair","RepeatOperator","RepeatOperator.prototype.call","RepeatSubscriber","RepeatSubscriber.prototype.complete","RepeatWhenOperator","notifier","RepeatWhenOperator.prototype.call","RepeatWhenSubscriber","sourceIsBeingSubscribedTo","RepeatWhenSubscriber.prototype.notifyNext","RepeatWhenSubscriber.prototype.notifyComplete","RepeatWhenSubscriber.prototype.complete","retries","subscribeToRetries","retriesSubscription","notifications","RepeatWhenSubscriber.prototype._unsubscribe","RepeatWhenSubscriber.prototype._unsubscribeAndRecycle","RepeatWhenSubscriber.prototype.subscribeToRetries","RetryOperator","RetryOperator.prototype.call","RetrySubscriber","RetrySubscriber.prototype.error","RetryWhenOperator","RetryWhenOperator.prototype.call","RetryWhenSubscriber","RetryWhenSubscriber.prototype.error","RetryWhenSubscriber.prototype._unsubscribe","RetryWhenSubscriber.prototype.notifyNext","SampleOperator","SampleOperator.prototype.call","sampleSubscriber","SampleSubscriber","SampleSubscriber.prototype._next","SampleSubscriber.prototype.notifyNext","SampleSubscriber.prototype.notifyComplete","SampleSubscriber.prototype.emitValue","SampleTimeOperator","SampleTimeOperator.prototype.call","SampleTimeSubscriber","SampleTimeSubscriber.prototype._next","SampleTimeSubscriber.prototype.notifyNext","SequenceEqualOperator","compareTo","comparator","SequenceEqualOperator.prototype.call","SequenceEqualSubscriber","_oneComplete","SequenceEqualCompareToSubscriber","SequenceEqualSubscriber.prototype._next","emit","checkValues","SequenceEqualSubscriber.prototype._complete","SequenceEqualSubscriber.prototype.checkValues","areEqual","SequenceEqualSubscriber.prototype.emit","nextB","SequenceEqualSubscriber.prototype.nextB","completeB","SequenceEqualSubscriber.prototype.completeB","SequenceEqualCompareToSubscriber.prototype._next","SequenceEqualCompareToSubscriber.prototype._error","SequenceEqualCompareToSubscriber.prototype._complete","SingleOperator","SingleOperator.prototype.call","SingleSubscriber","seenValue","applySingleValue","SingleSubscriber.prototype.applySingleValue","singleValue","SingleSubscriber.prototype._next","SingleSubscriber.prototype.tryNext","SingleSubscriber.prototype._complete","SkipOperator","SkipOperator.prototype.call","SkipSubscriber","SkipSubscriber.prototype._next","SkipLastOperator","_skipCount","SkipLastOperator.prototype.call","SkipLastSubscriber","_count","_ring","SkipLastSubscriber.prototype._next","skipCount","currentIndex","oldValue","SkipUntilOperator","SkipUntilOperator.prototype.call","SkipUntilSubscriber","SkipUntilSubscriber.prototype._next","SkipUntilSubscriber.prototype.notifyNext","SkipUntilSubscriber.prototype.notifyComplete","SkipWhileOperator","SkipWhileOperator.prototype.call","SkipWhileSubscriber","skipping","SkipWhileSubscriber.prototype._next","tryCallPredicate","SkipWhileSubscriber.prototype.tryCallPredicate","SubscribeOnObservable","delayTime","SubscribeOnObservable.create","SubscribeOnObservable.dispatch","SubscribeOnObservable.prototype._subscribe","SubscribeOnOperator","SubscribeOnOperator.prototype.call","SwitchMapOperator.prototype.call","SwitchMapSubscriber","SwitchMapSubscriber.prototype._next","SwitchMapSubscriber.prototype._innerSub","SwitchMapSubscriber.prototype._complete","SwitchMapSubscriber.prototype._unsubscribe","SwitchMapSubscriber.prototype.notifyComplete","SwitchMapSubscriber.prototype.notifyNext","TakeUntilOperator","TakeUntilOperator.prototype.call","takeUntilSubscriber","TakeUntilSubscriber","TakeUntilSubscriber.prototype.notifyNext","TakeUntilSubscriber.prototype.notifyComplete","TakeWhileOperator","inclusive","TakeWhileOperator.prototype.call","TakeWhileSubscriber","TakeWhileSubscriber.prototype._next","nextOrComplete","TakeWhileSubscriber.prototype.nextOrComplete","predicateResult","DoOperator","DoOperator.prototype.call","TapSubscriber","_tapNext","_tapError","_tapComplete","TapSubscriber.prototype._next","TapSubscriber.prototype._error","TapSubscriber.prototype._complete","defaultThrottleConfig","leading","trailing","ThrottleOperator","ThrottleOperator.prototype.call","ThrottleSubscriber","_leading","_trailing","_hasValue","ThrottleSubscriber.prototype._next","_sendValue","_throttled","send","throttle","ThrottleSubscriber.prototype.send","ThrottleSubscriber.prototype.throttle","tryDurationSelector","ThrottleSubscriber.prototype.tryDurationSelector","throttlingDone","ThrottleSubscriber.prototype.throttlingDone","ThrottleSubscriber.prototype.notifyNext","ThrottleSubscriber.prototype.notifyComplete","ThrottleTimeOperator","ThrottleTimeOperator.prototype.call","ThrottleTimeSubscriber","_hasTrailingValue","_trailingValue","ThrottleTimeSubscriber.prototype._next","ThrottleTimeSubscriber.prototype._complete","ThrottleTimeSubscriber.prototype.clearThrottle","TimeInterval","interval","TimeoutWithOperator.prototype.call","TimeoutWithSubscriber","scheduleTimeout","dispatchTimeout","TimeoutWithSubscriber.dispatchTimeout","TimeoutWithSubscriber.prototype.scheduleTimeout","TimeoutWithSubscriber.prototype._next","TimeoutWithSubscriber.prototype._unsubscribe","Timestamp","timestamp","WindowOperator","windowBoundaries","WindowOperator.prototype.call","windowSubscriber","WindowSubscriber","sourceSubscription","WindowSubscriber.prototype.notifyNext","WindowSubscriber.prototype.notifyError","WindowSubscriber.prototype.notifyComplete","WindowSubscriber.prototype._next","WindowSubscriber.prototype._error","WindowSubscriber.prototype._complete","WindowSubscriber.prototype._unsubscribe","WindowSubscriber.prototype.openWindow","prevWindow","newWindow","WindowCountOperator","windowSize","startWindowEvery","WindowCountOperator.prototype.call","WindowCountSubscriber","windows","WindowCountSubscriber.prototype._next","c","window_1","WindowCountSubscriber.prototype._error","WindowCountSubscriber.prototype._complete","WindowCountSubscriber.prototype._unsubscribe","WindowTimeOperator","maxWindowSize","WindowTimeOperator.prototype.call","WindowTimeSubscriber","CountedSubject","_numberOfNextedValues","CountedSubject.prototype.next","WindowTimeSubscriber.prototype._next","numberOfNextedValues","WindowTimeSubscriber.prototype._error","WindowTimeSubscriber.prototype._complete","window_2","WindowTimeSubscriber.prototype.openWindow","WindowTimeSubscriber.prototype.closeWindow","WindowToggleOperator","WindowToggleOperator.prototype.call","WindowToggleSubscriber","openSubscription","WindowToggleSubscriber.prototype._next","WindowToggleSubscriber.prototype._error","WindowToggleSubscriber.prototype._complete","WindowToggleSubscriber.prototype._unsubscribe","context_3","WindowToggleSubscriber.prototype.notifyNext","context_4","WindowToggleSubscriber.prototype.notifyError","WindowToggleSubscriber.prototype.notifyComplete","inner","WindowToggleSubscriber.prototype.closeWindow","WindowOperator$1","WindowSubscriber$1","unsubscribeClosingNotification","WindowSubscriber.prototype.unsubscribeClosingNotification","closingNotification","WithLatestFromOperator","WithLatestFromOperator.prototype.call","WithLatestFromSubscriber","WithLatestFromSubscriber.prototype.notifyNext","found","WithLatestFromSubscriber.prototype.notifyComplete","WithLatestFromSubscriber.prototype._next","_tryProject","WithLatestFromSubscriber.prototype._tryProject","_operators","freeze","auditTime","bufferOperatorFunction","bufferCount","bufferCountOperatorFunction","bufferTime","bufferTimeOperatorFunction","bufferToggle","bufferToggleOperatorFunction","bufferWhen","catchError","catchErrorOperatorFunction","combineAll","combineLatest","combineLatest$1","concat$1","concatMapTo","innerObservable","debounce","debounceTime","delayFor","delayWhen","dematerialize","dematerializeOperatorFunction","distinct","distinctUntilKeyChanged","elementAt","hasDefaultValue","v","endWith","every","exhaust","expand","finalize","find","findIndex","groupBy","ignoreElements","ignoreElementsOperatorFunction","mapTo","materialize","materializeOperatorFunction","comparer","merge$1","flatMap","mergeMapTo","mergeScan","min","observeOn","observeOnOperatorFunction","onErrorResumeNext$1","pairwise","partition","partition$1","pluck","properties","publish","publishBehavior","publishLast","publishReplay","selectorOrScheduler","race$1","raceOperatorFunction","repeat","repeatWhen","retry","retryWhen","sample","sampleTime","sequenceEqual","share","shareReplay","configOrBufferSize","single","skip","skipLast","skipUntil","skipWhile","startWith","subscribeOn","subscribeOnOperatorFunction","switchAll","switchMapTo","takeUntil","takeWhile","tap","tapOperatorFunction","throttleTime","timeInterval","current","timeout","toArray","window$1","windowOperatorFunction","windowCount","windowCountOperatorFunction","windowTimeOperatorFunction","windowToggle","windowWhen","windowWhenOperatorFunction","withLatestFrom","zip$1","zipOperatorFunction","zipAll","SubscriptionLog","subscribedFrame","unsubscribedFrame","SubscriptionLoggable","logSubscribedFrame","SubscriptionLoggable.prototype.logSubscribedFrame","logUnsubscribedFrame","SubscriptionLoggable.prototype.logUnsubscribedFrame","subscriptionLogs","oldSubscriptionLog","ColdObservable","messages","scheduleMessages","ColdObservable.prototype.scheduleMessages","messagesLength","HotObservable","HotObservable.prototype._subscribe","setup","HotObservable.prototype.setup","TestScheduler","assertDeepEqual","defaultMaxFrame","hotObservables","coldObservables","flushTests","runMode","createTime","TestScheduler.prototype.createTime","marbles","createColdObservable","TestScheduler.prototype.createColdObservable","parseMarbles","cold","createHotObservable","TestScheduler.prototype.createHotObservable","materializeInnerObservable","TestScheduler.prototype.materializeInnerObservable","outerFrame","expectObservable","TestScheduler.prototype.expectObservable","subscriptionMarbles","actual","flushTest","ready","subscriptionParsed","parseMarblesAsSubscriptions","unsubscriptionFrame","subscriptionFrame","toBe","expected","expectSubscriptions","TestScheduler.prototype.expectSubscriptions","actualSubscriptionLogs","marblesArray","TestScheduler.prototype.flush","test","TestScheduler.parseMarblesAsSubscriptions","groupStart","nextFrame","advanceFrameBy","match","durationInMs","unit","this_1","out_i_1","TestScheduler.parseMarbles","materializeInnerObservables","testMessages","subIndex","replace","_loop_2","this_2","out_i_2","run","TestScheduler.prototype.run","prevFrameTimeFactor","prevMaxFrames","helpers","hot","ret","_testing","__self","self","WorkerGlobalScope","__global","_root","urlOrRequest","request","createXHR","crossDomain","XMLHttpRequest","XDomainRequest","progId","progIds","ActiveXObject","withCredentials","prop","AjaxObservable.prototype._subscribe","AjaxSubscriber","post","put","patch","getJSON","getHeader","contentTypeHeader","FormData","serializeBody","AjaxSubscriber.prototype.next","AjaxResponse","AjaxSubscriber.prototype.send","user","password","setupEvents","open","setHeaders","AjaxSubscriber.prototype.serializeBody","contentType","splitIndex","substring","encodeURIComponent","stringify","AjaxSubscriber.prototype.setHeaders","setRequestHeader","AjaxSubscriber.prototype.getHeader","headerName","toLowerCase","AjaxSubscriber.prototype.setupEvents","xhrTimeout","progressSubscriber","AjaxTimeoutError","xhrReadyStateChange","xhrLoad","readyState","status_1","status","AjaxError","ontimeout","upload","xhrProgress_1","onprogress","xhrError_1","onerror","onreadystatechange","onload","AjaxSubscriber.prototype.unsubscribe","abort","originalEvent","AjaxErrorImpl","AjaxTimeoutErrorImpl","_ajax","ajax","DEFAULT_WEBSOCKET_CONFIG","deserializer","data","serializer","WebSocketSubject","urlConfigOrSource","_config","_output","WebSocketCtor","WebSocket","WebSocketSubject.prototype.lift","sock","_resetState","WebSocketSubject.prototype._resetState","_socket","multiplex","WebSocketSubject.prototype.multiplex","subMsg","unsubMsg","messageFilter","_connectSocket","WebSocketSubject.prototype._connectSocket","protocol","binaryType","socket","close","onopen","socket.onopen","openObserver","closingObserver","code","reason","WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT","socket.onerror","onclose","socket.onclose","closeObserver","wasClean","onmessage","socket.onmessage","WebSocketSubject.prototype._subscribe","WebSocketSubject.prototype.unsubscribe","_webSocket","webSocket","fetch$1","_fetch","fromFetch","init","controller","AbortController","signal","abortable","unsubscribed","aborted","outerSignalHandler","fetch","catch","operators","testing","asapScheduler","asyncScheduler","queueScheduler","animationFrameScheduler","isObservable","forkJoin","first_1","getPrototypeOf","resultSelector_1","generate","initialStateOrOptions","resultSelectorOrObservable","initialState","iif","trueResult","falseResult","never","pairs","range","using","resourceFactory","resource"]}
diff --git a/node_modules/rxjs/fetch/index.d.ts b/node_modules/rxjs/fetch/index.d.ts
deleted file mode 100644
index e6ff01d..0000000
--- a/node_modules/rxjs/fetch/index.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { fromFetch } from '../internal/observable/dom/fetch';
diff --git a/node_modules/rxjs/fetch/index.js b/node_modules/rxjs/fetch/index.js
deleted file mode 100644
index ca5d62f..0000000
--- a/node_modules/rxjs/fetch/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var fetch_1 = require("../internal/observable/dom/fetch");
-exports.fromFetch = fetch_1.fromFetch;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/fetch/index.js.map b/node_modules/rxjs/fetch/index.js.map
deleted file mode 100644
index 0f14a63..0000000
--- a/node_modules/rxjs/fetch/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../src/fetch/index.ts"],"names":[],"mappings":";;AAAA,0DAA6D;AAApD,4BAAA,SAAS,CAAA"}
diff --git a/node_modules/rxjs/fetch/package.json b/node_modules/rxjs/fetch/package.json
deleted file mode 100644
index dff5519..0000000
--- a/node_modules/rxjs/fetch/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "rxjs/fetch",
-  "typings": "./index.d.ts",
-  "main": "./index.js",
-  "module": "../_esm5/fetch/index.js",
-  "es2015": "../_esm2015/fetch/index.js",
-  "sideEffects": false
-}
diff --git a/node_modules/rxjs/index.d.ts b/node_modules/rxjs/index.d.ts
deleted file mode 100644
index d33af3b..0000000
--- a/node_modules/rxjs/index.d.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-export { Observable } from './internal/Observable';
-export { ConnectableObservable } from './internal/observable/ConnectableObservable';
-export { GroupedObservable } from './internal/operators/groupBy';
-export { Operator } from './internal/Operator';
-export { observable } from './internal/symbol/observable';
-export { Subject } from './internal/Subject';
-export { BehaviorSubject } from './internal/BehaviorSubject';
-export { ReplaySubject } from './internal/ReplaySubject';
-export { AsyncSubject } from './internal/AsyncSubject';
-export { asap as asapScheduler } from './internal/scheduler/asap';
-export { async as asyncScheduler } from './internal/scheduler/async';
-export { queue as queueScheduler } from './internal/scheduler/queue';
-export { animationFrame as animationFrameScheduler } from './internal/scheduler/animationFrame';
-export { VirtualTimeScheduler, VirtualAction } from './internal/scheduler/VirtualTimeScheduler';
-export { Scheduler } from './internal/Scheduler';
-export { Subscription } from './internal/Subscription';
-export { Subscriber } from './internal/Subscriber';
-export { Notification, NotificationKind } from './internal/Notification';
-export { pipe } from './internal/util/pipe';
-export { noop } from './internal/util/noop';
-export { identity } from './internal/util/identity';
-export { isObservable } from './internal/util/isObservable';
-export { ArgumentOutOfRangeError } from './internal/util/ArgumentOutOfRangeError';
-export { EmptyError } from './internal/util/EmptyError';
-export { ObjectUnsubscribedError } from './internal/util/ObjectUnsubscribedError';
-export { UnsubscriptionError } from './internal/util/UnsubscriptionError';
-export { TimeoutError } from './internal/util/TimeoutError';
-export { bindCallback } from './internal/observable/bindCallback';
-export { bindNodeCallback } from './internal/observable/bindNodeCallback';
-export { combineLatest } from './internal/observable/combineLatest';
-export { concat } from './internal/observable/concat';
-export { defer } from './internal/observable/defer';
-export { empty } from './internal/observable/empty';
-export { forkJoin } from './internal/observable/forkJoin';
-export { from } from './internal/observable/from';
-export { fromEvent } from './internal/observable/fromEvent';
-export { fromEventPattern } from './internal/observable/fromEventPattern';
-export { generate } from './internal/observable/generate';
-export { iif } from './internal/observable/iif';
-export { interval } from './internal/observable/interval';
-export { merge } from './internal/observable/merge';
-export { never } from './internal/observable/never';
-export { of } from './internal/observable/of';
-export { onErrorResumeNext } from './internal/observable/onErrorResumeNext';
-export { pairs } from './internal/observable/pairs';
-export { partition } from './internal/observable/partition';
-export { race } from './internal/observable/race';
-export { range } from './internal/observable/range';
-export { throwError } from './internal/observable/throwError';
-export { timer } from './internal/observable/timer';
-export { using } from './internal/observable/using';
-export { zip } from './internal/observable/zip';
-export { scheduled } from './internal/scheduled/scheduled';
-export { EMPTY } from './internal/observable/empty';
-export { NEVER } from './internal/observable/never';
-export * from './internal/types';
-export { config } from './internal/config';
diff --git a/node_modules/rxjs/index.js b/node_modules/rxjs/index.js
deleted file mode 100644
index 042b7e6..0000000
--- a/node_modules/rxjs/index.js
+++ /dev/null
@@ -1,115 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("./internal/Observable");
-exports.Observable = Observable_1.Observable;
-var ConnectableObservable_1 = require("./internal/observable/ConnectableObservable");
-exports.ConnectableObservable = ConnectableObservable_1.ConnectableObservable;
-var groupBy_1 = require("./internal/operators/groupBy");
-exports.GroupedObservable = groupBy_1.GroupedObservable;
-var observable_1 = require("./internal/symbol/observable");
-exports.observable = observable_1.observable;
-var Subject_1 = require("./internal/Subject");
-exports.Subject = Subject_1.Subject;
-var BehaviorSubject_1 = require("./internal/BehaviorSubject");
-exports.BehaviorSubject = BehaviorSubject_1.BehaviorSubject;
-var ReplaySubject_1 = require("./internal/ReplaySubject");
-exports.ReplaySubject = ReplaySubject_1.ReplaySubject;
-var AsyncSubject_1 = require("./internal/AsyncSubject");
-exports.AsyncSubject = AsyncSubject_1.AsyncSubject;
-var asap_1 = require("./internal/scheduler/asap");
-exports.asapScheduler = asap_1.asap;
-var async_1 = require("./internal/scheduler/async");
-exports.asyncScheduler = async_1.async;
-var queue_1 = require("./internal/scheduler/queue");
-exports.queueScheduler = queue_1.queue;
-var animationFrame_1 = require("./internal/scheduler/animationFrame");
-exports.animationFrameScheduler = animationFrame_1.animationFrame;
-var VirtualTimeScheduler_1 = require("./internal/scheduler/VirtualTimeScheduler");
-exports.VirtualTimeScheduler = VirtualTimeScheduler_1.VirtualTimeScheduler;
-exports.VirtualAction = VirtualTimeScheduler_1.VirtualAction;
-var Scheduler_1 = require("./internal/Scheduler");
-exports.Scheduler = Scheduler_1.Scheduler;
-var Subscription_1 = require("./internal/Subscription");
-exports.Subscription = Subscription_1.Subscription;
-var Subscriber_1 = require("./internal/Subscriber");
-exports.Subscriber = Subscriber_1.Subscriber;
-var Notification_1 = require("./internal/Notification");
-exports.Notification = Notification_1.Notification;
-exports.NotificationKind = Notification_1.NotificationKind;
-var pipe_1 = require("./internal/util/pipe");
-exports.pipe = pipe_1.pipe;
-var noop_1 = require("./internal/util/noop");
-exports.noop = noop_1.noop;
-var identity_1 = require("./internal/util/identity");
-exports.identity = identity_1.identity;
-var isObservable_1 = require("./internal/util/isObservable");
-exports.isObservable = isObservable_1.isObservable;
-var ArgumentOutOfRangeError_1 = require("./internal/util/ArgumentOutOfRangeError");
-exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-var EmptyError_1 = require("./internal/util/EmptyError");
-exports.EmptyError = EmptyError_1.EmptyError;
-var ObjectUnsubscribedError_1 = require("./internal/util/ObjectUnsubscribedError");
-exports.ObjectUnsubscribedError = ObjectUnsubscribedError_1.ObjectUnsubscribedError;
-var UnsubscriptionError_1 = require("./internal/util/UnsubscriptionError");
-exports.UnsubscriptionError = UnsubscriptionError_1.UnsubscriptionError;
-var TimeoutError_1 = require("./internal/util/TimeoutError");
-exports.TimeoutError = TimeoutError_1.TimeoutError;
-var bindCallback_1 = require("./internal/observable/bindCallback");
-exports.bindCallback = bindCallback_1.bindCallback;
-var bindNodeCallback_1 = require("./internal/observable/bindNodeCallback");
-exports.bindNodeCallback = bindNodeCallback_1.bindNodeCallback;
-var combineLatest_1 = require("./internal/observable/combineLatest");
-exports.combineLatest = combineLatest_1.combineLatest;
-var concat_1 = require("./internal/observable/concat");
-exports.concat = concat_1.concat;
-var defer_1 = require("./internal/observable/defer");
-exports.defer = defer_1.defer;
-var empty_1 = require("./internal/observable/empty");
-exports.empty = empty_1.empty;
-var forkJoin_1 = require("./internal/observable/forkJoin");
-exports.forkJoin = forkJoin_1.forkJoin;
-var from_1 = require("./internal/observable/from");
-exports.from = from_1.from;
-var fromEvent_1 = require("./internal/observable/fromEvent");
-exports.fromEvent = fromEvent_1.fromEvent;
-var fromEventPattern_1 = require("./internal/observable/fromEventPattern");
-exports.fromEventPattern = fromEventPattern_1.fromEventPattern;
-var generate_1 = require("./internal/observable/generate");
-exports.generate = generate_1.generate;
-var iif_1 = require("./internal/observable/iif");
-exports.iif = iif_1.iif;
-var interval_1 = require("./internal/observable/interval");
-exports.interval = interval_1.interval;
-var merge_1 = require("./internal/observable/merge");
-exports.merge = merge_1.merge;
-var never_1 = require("./internal/observable/never");
-exports.never = never_1.never;
-var of_1 = require("./internal/observable/of");
-exports.of = of_1.of;
-var onErrorResumeNext_1 = require("./internal/observable/onErrorResumeNext");
-exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
-var pairs_1 = require("./internal/observable/pairs");
-exports.pairs = pairs_1.pairs;
-var partition_1 = require("./internal/observable/partition");
-exports.partition = partition_1.partition;
-var race_1 = require("./internal/observable/race");
-exports.race = race_1.race;
-var range_1 = require("./internal/observable/range");
-exports.range = range_1.range;
-var throwError_1 = require("./internal/observable/throwError");
-exports.throwError = throwError_1.throwError;
-var timer_1 = require("./internal/observable/timer");
-exports.timer = timer_1.timer;
-var using_1 = require("./internal/observable/using");
-exports.using = using_1.using;
-var zip_1 = require("./internal/observable/zip");
-exports.zip = zip_1.zip;
-var scheduled_1 = require("./internal/scheduled/scheduled");
-exports.scheduled = scheduled_1.scheduled;
-var empty_2 = require("./internal/observable/empty");
-exports.EMPTY = empty_2.EMPTY;
-var never_2 = require("./internal/observable/never");
-exports.NEVER = never_2.NEVER;
-var config_1 = require("./internal/config");
-exports.config = config_1.config;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/index.js.map b/node_modules/rxjs/index.js.map
deleted file mode 100644
index 226fe84..0000000
--- a/node_modules/rxjs/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["src/index.ts"],"names":[],"mappings":";;AACA,oDAAmD;AAA1C,kCAAA,UAAU,CAAA;AACnB,qFAAoF;AAA3E,wDAAA,qBAAqB,CAAA;AAC9B,wDAAiE;AAAxD,sCAAA,iBAAiB,CAAA;AAE1B,2DAA0D;AAAjD,kCAAA,UAAU,CAAA;AAGnB,8CAA6C;AAApC,4BAAA,OAAO,CAAA;AAChB,8DAA6D;AAApD,4CAAA,eAAe,CAAA;AACxB,0DAAyD;AAAhD,wCAAA,aAAa,CAAA;AACtB,wDAAuD;AAA9C,sCAAA,YAAY,CAAA;AAGrB,kDAAkE;AAAzD,+BAAA,IAAI,CAAiB;AAC9B,oDAAqE;AAA5D,iCAAA,KAAK,CAAkB;AAChC,oDAAqE;AAA5D,iCAAA,KAAK,CAAkB;AAChC,sEAAgG;AAAvF,mDAAA,cAAc,CAA2B;AAClD,kFAAgG;AAAvF,sDAAA,oBAAoB,CAAA;AAAE,+CAAA,aAAa,CAAA;AAC5C,kDAAiD;AAAxC,gCAAA,SAAS,CAAA;AAGlB,wDAAuD;AAA9C,sCAAA,YAAY,CAAA;AACrB,oDAAmD;AAA1C,kCAAA,UAAU,CAAA;AAGnB,wDAAyE;AAAhE,sCAAA,YAAY,CAAA;AAAE,0CAAA,gBAAgB,CAAA;AAGvC,6CAA4C;AAAnC,sBAAA,IAAI,CAAA;AACb,6CAA4C;AAAnC,sBAAA,IAAI,CAAA;AACb,qDAAoD;AAA3C,8BAAA,QAAQ,CAAA;AACjB,6DAA4D;AAAnD,sCAAA,YAAY,CAAA;AAGrB,mFAAkF;AAAzE,4DAAA,uBAAuB,CAAA;AAChC,yDAAwD;AAA/C,kCAAA,UAAU,CAAA;AACnB,mFAAkF;AAAzE,4DAAA,uBAAuB,CAAA;AAChC,2EAA0E;AAAjE,oDAAA,mBAAmB,CAAA;AAC5B,6DAA4D;AAAnD,sCAAA,YAAY,CAAA;AAGrB,mEAAkE;AAAzD,sCAAA,YAAY,CAAA;AACrB,2EAA0E;AAAjE,8CAAA,gBAAgB,CAAA;AACzB,qEAAoE;AAA3D,wCAAA,aAAa,CAAA;AACtB,uDAAsD;AAA7C,0BAAA,MAAM,CAAA;AACf,qDAAoD;AAA3C,wBAAA,KAAK,CAAA;AACd,qDAAoD;AAA3C,wBAAA,KAAK,CAAA;AACd,2DAA0D;AAAjD,8BAAA,QAAQ,CAAA;AACjB,mDAAkD;AAAzC,sBAAA,IAAI,CAAA;AACb,6DAA4D;AAAnD,gCAAA,SAAS,CAAA;AAClB,2EAA0E;AAAjE,8CAAA,gBAAgB,CAAA;AACzB,2DAA0D;AAAjD,8BAAA,QAAQ,CAAA;AACjB,iDAAgD;AAAvC,oBAAA,GAAG,CAAA;AACZ,2DAA0D;AAAjD,8BAAA,QAAQ,CAAA;AACjB,qDAAoD;AAA3C,wBAAA,KAAK,CAAA;AACd,qDAAoD;AAA3C,wBAAA,KAAK,CAAA;AACd,+CAA8C;AAArC,kBAAA,EAAE,CAAA;AACX,6EAA4E;AAAnE,gDAAA,iBAAiB,CAAA;AAC1B,qDAAoD;AAA3C,wBAAA,KAAK,CAAA;AACd,6DAA4D;AAAnD,gCAAA,SAAS,CAAA;AAClB,mDAAkD;AAAzC,sBAAA,IAAI,CAAA;AACb,qDAAoD;AAA3C,wBAAA,KAAK,CAAA;AACd,+DAA8D;AAArD,kCAAA,UAAU,CAAA;AACnB,qDAAoD;AAA3C,wBAAA,KAAK,CAAA;AACd,qDAAoD;AAA3C,wBAAA,KAAK,CAAA;AACd,iDAAgD;AAAvC,oBAAA,GAAG,CAAA;AACZ,4DAA2D;AAAlD,gCAAA,SAAS,CAAA;AAGlB,qDAAoD;AAA3C,wBAAA,KAAK,CAAA;AACd,qDAAoD;AAA3C,wBAAA,KAAK,CAAA;AAMd,4CAA2C;AAAlC,0BAAA,MAAM,CAAA"}
diff --git a/node_modules/rxjs/interfaces.d.ts b/node_modules/rxjs/interfaces.d.ts
deleted file mode 100644
index 5d5821d..0000000
--- a/node_modules/rxjs/interfaces.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/interfaces';
diff --git a/node_modules/rxjs/interfaces.js b/node_modules/rxjs/interfaces.js
deleted file mode 100644
index db91911..0000000
--- a/node_modules/rxjs/interfaces.js
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=interfaces.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/interfaces.js.map b/node_modules/rxjs/interfaces.js.map
deleted file mode 100644
index 21fafaa..0000000
--- a/node_modules/rxjs/interfaces.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"interfaces.js","sources":["src/interfaces.ts"],"names":[],"mappings":""}
diff --git a/node_modules/rxjs/internal-compatibility/index.d.ts b/node_modules/rxjs/internal-compatibility/index.d.ts
deleted file mode 100644
index 3f2c80e..0000000
--- a/node_modules/rxjs/internal-compatibility/index.d.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-export { config } from '../internal/config';
-export { InnerSubscriber } from '../internal/InnerSubscriber';
-export { OuterSubscriber } from '../internal/OuterSubscriber';
-export { Scheduler } from '../internal/Scheduler';
-export { AnonymousSubject } from '../internal/Subject';
-export { SubjectSubscription } from '../internal/SubjectSubscription';
-export { Subscriber } from '../internal/Subscriber';
-export { fromPromise } from '../internal/observable/fromPromise';
-export { fromIterable } from '../internal/observable/fromIterable';
-export { ajax } from '../internal/observable/dom/ajax';
-export { webSocket } from '../internal/observable/dom/webSocket';
-export { AjaxRequest, AjaxCreationMethod, ajaxGet, ajaxPost, ajaxDelete, ajaxPut, ajaxPatch, ajaxGetJSON, AjaxObservable, AjaxSubscriber, AjaxResponse, AjaxError, AjaxTimeoutError } from '../internal/observable/dom/AjaxObservable';
-export { WebSocketSubjectConfig, WebSocketSubject } from '../internal/observable/dom/WebSocketSubject';
-export { CombineLatestOperator } from '../internal/observable/combineLatest';
-export { EventTargetLike } from '../internal/observable/fromEvent';
-export { ConditionFunc, IterateFunc, ResultFunc, GenerateBaseOptions, GenerateOptions } from '../internal/observable/generate';
-export { dispatch } from '../internal/observable/range';
-export { SubscribeOnObservable } from '../internal/observable/SubscribeOnObservable';
-export { Timestamp } from '../internal/operators/timestamp';
-export { TimeInterval } from '../internal/operators/timeInterval';
-export { GroupedObservable } from '../internal/operators/groupBy';
-export { ShareReplayConfig } from '../internal/operators/shareReplay';
-export { ThrottleConfig, defaultThrottleConfig } from '../internal/operators/throttle';
-export { rxSubscriber } from '../internal/symbol/rxSubscriber';
-export { iterator } from '../internal/symbol/iterator';
-export { observable } from '../internal/symbol/observable';
-export { ArgumentOutOfRangeError } from '../internal/util/ArgumentOutOfRangeError';
-export { EmptyError } from '../internal/util/EmptyError';
-export { Immediate } from '../internal/util/Immediate';
-export { ObjectUnsubscribedError } from '../internal/util/ObjectUnsubscribedError';
-export { TimeoutError } from '../internal/util/TimeoutError';
-export { UnsubscriptionError } from '../internal/util/UnsubscriptionError';
-export { applyMixins } from '../internal/util/applyMixins';
-export { errorObject } from '../internal/util/errorObject';
-export { hostReportError } from '../internal/util/hostReportError';
-export { identity } from '../internal/util/identity';
-export { isArray } from '../internal/util/isArray';
-export { isArrayLike } from '../internal/util/isArrayLike';
-export { isDate } from '../internal/util/isDate';
-export { isFunction } from '../internal/util/isFunction';
-export { isIterable } from '../internal/util/isIterable';
-export { isNumeric } from '../internal/util/isNumeric';
-export { isObject } from '../internal/util/isObject';
-export { isInteropObservable as isObservable } from '../internal/util/isInteropObservable';
-export { isPromise } from '../internal/util/isPromise';
-export { isScheduler } from '../internal/util/isScheduler';
-export { noop } from '../internal/util/noop';
-export { not } from '../internal/util/not';
-export { pipe } from '../internal/util/pipe';
-export { root } from '../internal/util/root';
-export { subscribeTo } from '../internal/util/subscribeTo';
-export { subscribeToArray } from '../internal/util/subscribeToArray';
-export { subscribeToIterable } from '../internal/util/subscribeToIterable';
-export { subscribeToObservable } from '../internal/util/subscribeToObservable';
-export { subscribeToPromise } from '../internal/util/subscribeToPromise';
-export { subscribeToResult } from '../internal/util/subscribeToResult';
-export { toSubscriber } from '../internal/util/toSubscriber';
-export { tryCatch } from '../internal/util/tryCatch';
diff --git a/node_modules/rxjs/internal-compatibility/index.js b/node_modules/rxjs/internal-compatibility/index.js
deleted file mode 100644
index d0e265e..0000000
--- a/node_modules/rxjs/internal-compatibility/index.js
+++ /dev/null
@@ -1,123 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var config_1 = require("../internal/config");
-exports.config = config_1.config;
-var InnerSubscriber_1 = require("../internal/InnerSubscriber");
-exports.InnerSubscriber = InnerSubscriber_1.InnerSubscriber;
-var OuterSubscriber_1 = require("../internal/OuterSubscriber");
-exports.OuterSubscriber = OuterSubscriber_1.OuterSubscriber;
-var Scheduler_1 = require("../internal/Scheduler");
-exports.Scheduler = Scheduler_1.Scheduler;
-var Subject_1 = require("../internal/Subject");
-exports.AnonymousSubject = Subject_1.AnonymousSubject;
-var SubjectSubscription_1 = require("../internal/SubjectSubscription");
-exports.SubjectSubscription = SubjectSubscription_1.SubjectSubscription;
-var Subscriber_1 = require("../internal/Subscriber");
-exports.Subscriber = Subscriber_1.Subscriber;
-var fromPromise_1 = require("../internal/observable/fromPromise");
-exports.fromPromise = fromPromise_1.fromPromise;
-var fromIterable_1 = require("../internal/observable/fromIterable");
-exports.fromIterable = fromIterable_1.fromIterable;
-var ajax_1 = require("../internal/observable/dom/ajax");
-exports.ajax = ajax_1.ajax;
-var webSocket_1 = require("../internal/observable/dom/webSocket");
-exports.webSocket = webSocket_1.webSocket;
-var AjaxObservable_1 = require("../internal/observable/dom/AjaxObservable");
-exports.ajaxGet = AjaxObservable_1.ajaxGet;
-exports.ajaxPost = AjaxObservable_1.ajaxPost;
-exports.ajaxDelete = AjaxObservable_1.ajaxDelete;
-exports.ajaxPut = AjaxObservable_1.ajaxPut;
-exports.ajaxPatch = AjaxObservable_1.ajaxPatch;
-exports.ajaxGetJSON = AjaxObservable_1.ajaxGetJSON;
-exports.AjaxObservable = AjaxObservable_1.AjaxObservable;
-exports.AjaxSubscriber = AjaxObservable_1.AjaxSubscriber;
-exports.AjaxResponse = AjaxObservable_1.AjaxResponse;
-exports.AjaxError = AjaxObservable_1.AjaxError;
-exports.AjaxTimeoutError = AjaxObservable_1.AjaxTimeoutError;
-var WebSocketSubject_1 = require("../internal/observable/dom/WebSocketSubject");
-exports.WebSocketSubject = WebSocketSubject_1.WebSocketSubject;
-var combineLatest_1 = require("../internal/observable/combineLatest");
-exports.CombineLatestOperator = combineLatest_1.CombineLatestOperator;
-var range_1 = require("../internal/observable/range");
-exports.dispatch = range_1.dispatch;
-var SubscribeOnObservable_1 = require("../internal/observable/SubscribeOnObservable");
-exports.SubscribeOnObservable = SubscribeOnObservable_1.SubscribeOnObservable;
-var timestamp_1 = require("../internal/operators/timestamp");
-exports.Timestamp = timestamp_1.Timestamp;
-var timeInterval_1 = require("../internal/operators/timeInterval");
-exports.TimeInterval = timeInterval_1.TimeInterval;
-var groupBy_1 = require("../internal/operators/groupBy");
-exports.GroupedObservable = groupBy_1.GroupedObservable;
-var throttle_1 = require("../internal/operators/throttle");
-exports.defaultThrottleConfig = throttle_1.defaultThrottleConfig;
-var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
-exports.rxSubscriber = rxSubscriber_1.rxSubscriber;
-var iterator_1 = require("../internal/symbol/iterator");
-exports.iterator = iterator_1.iterator;
-var observable_1 = require("../internal/symbol/observable");
-exports.observable = observable_1.observable;
-var ArgumentOutOfRangeError_1 = require("../internal/util/ArgumentOutOfRangeError");
-exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-var EmptyError_1 = require("../internal/util/EmptyError");
-exports.EmptyError = EmptyError_1.EmptyError;
-var Immediate_1 = require("../internal/util/Immediate");
-exports.Immediate = Immediate_1.Immediate;
-var ObjectUnsubscribedError_1 = require("../internal/util/ObjectUnsubscribedError");
-exports.ObjectUnsubscribedError = ObjectUnsubscribedError_1.ObjectUnsubscribedError;
-var TimeoutError_1 = require("../internal/util/TimeoutError");
-exports.TimeoutError = TimeoutError_1.TimeoutError;
-var UnsubscriptionError_1 = require("../internal/util/UnsubscriptionError");
-exports.UnsubscriptionError = UnsubscriptionError_1.UnsubscriptionError;
-var applyMixins_1 = require("../internal/util/applyMixins");
-exports.applyMixins = applyMixins_1.applyMixins;
-var errorObject_1 = require("../internal/util/errorObject");
-exports.errorObject = errorObject_1.errorObject;
-var hostReportError_1 = require("../internal/util/hostReportError");
-exports.hostReportError = hostReportError_1.hostReportError;
-var identity_1 = require("../internal/util/identity");
-exports.identity = identity_1.identity;
-var isArray_1 = require("../internal/util/isArray");
-exports.isArray = isArray_1.isArray;
-var isArrayLike_1 = require("../internal/util/isArrayLike");
-exports.isArrayLike = isArrayLike_1.isArrayLike;
-var isDate_1 = require("../internal/util/isDate");
-exports.isDate = isDate_1.isDate;
-var isFunction_1 = require("../internal/util/isFunction");
-exports.isFunction = isFunction_1.isFunction;
-var isIterable_1 = require("../internal/util/isIterable");
-exports.isIterable = isIterable_1.isIterable;
-var isNumeric_1 = require("../internal/util/isNumeric");
-exports.isNumeric = isNumeric_1.isNumeric;
-var isObject_1 = require("../internal/util/isObject");
-exports.isObject = isObject_1.isObject;
-var isInteropObservable_1 = require("../internal/util/isInteropObservable");
-exports.isObservable = isInteropObservable_1.isInteropObservable;
-var isPromise_1 = require("../internal/util/isPromise");
-exports.isPromise = isPromise_1.isPromise;
-var isScheduler_1 = require("../internal/util/isScheduler");
-exports.isScheduler = isScheduler_1.isScheduler;
-var noop_1 = require("../internal/util/noop");
-exports.noop = noop_1.noop;
-var not_1 = require("../internal/util/not");
-exports.not = not_1.not;
-var pipe_1 = require("../internal/util/pipe");
-exports.pipe = pipe_1.pipe;
-var root_1 = require("../internal/util/root");
-exports.root = root_1.root;
-var subscribeTo_1 = require("../internal/util/subscribeTo");
-exports.subscribeTo = subscribeTo_1.subscribeTo;
-var subscribeToArray_1 = require("../internal/util/subscribeToArray");
-exports.subscribeToArray = subscribeToArray_1.subscribeToArray;
-var subscribeToIterable_1 = require("../internal/util/subscribeToIterable");
-exports.subscribeToIterable = subscribeToIterable_1.subscribeToIterable;
-var subscribeToObservable_1 = require("../internal/util/subscribeToObservable");
-exports.subscribeToObservable = subscribeToObservable_1.subscribeToObservable;
-var subscribeToPromise_1 = require("../internal/util/subscribeToPromise");
-exports.subscribeToPromise = subscribeToPromise_1.subscribeToPromise;
-var subscribeToResult_1 = require("../internal/util/subscribeToResult");
-exports.subscribeToResult = subscribeToResult_1.subscribeToResult;
-var toSubscriber_1 = require("../internal/util/toSubscriber");
-exports.toSubscriber = toSubscriber_1.toSubscriber;
-var tryCatch_1 = require("../internal/util/tryCatch");
-exports.tryCatch = tryCatch_1.tryCatch;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal-compatibility/index.js.map b/node_modules/rxjs/internal-compatibility/index.js.map
deleted file mode 100644
index 2119394..0000000
--- a/node_modules/rxjs/internal-compatibility/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../src/internal-compatibility/index.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal-compatibility/package.json b/node_modules/rxjs/internal-compatibility/package.json
deleted file mode 100644
index 5ff05a6..0000000
--- a/node_modules/rxjs/internal-compatibility/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "rxjs/internal-compatibility",
-  "typings": "./index.d.ts",
-  "main": "./index.js",
-  "module": "../_esm5/internal-compatibility/index.js",
-  "es2015": "../_esm2015/internal-compatibility/index.js",
-  "sideEffects": false
-}
diff --git a/node_modules/rxjs/internal/AsyncSubject.d.ts b/node_modules/rxjs/internal/AsyncSubject.d.ts
deleted file mode 100644
index fde2be1..0000000
--- a/node_modules/rxjs/internal/AsyncSubject.d.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { Subject } from './Subject';
-import { Subscriber } from './Subscriber';
-import { Subscription } from './Subscription';
-/**
- * A variant of Subject that only emits a value when it completes. It will emit
- * its latest value to all its observers on completion.
- *
- * @class AsyncSubject<T>
- */
-export declare class AsyncSubject<T> extends Subject<T> {
-    private value;
-    private hasNext;
-    private hasCompleted;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _subscribe(subscriber: Subscriber<any>): Subscription;
-    next(value: T): void;
-    error(error: any): void;
-    complete(): void;
-}
diff --git a/node_modules/rxjs/internal/AsyncSubject.js b/node_modules/rxjs/internal/AsyncSubject.js
deleted file mode 100644
index 55d028b..0000000
--- a/node_modules/rxjs/internal/AsyncSubject.js
+++ /dev/null
@@ -1,60 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("./Subject");
-var Subscription_1 = require("./Subscription");
-var AsyncSubject = (function (_super) {
-    __extends(AsyncSubject, _super);
-    function AsyncSubject() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this.value = null;
-        _this.hasNext = false;
-        _this.hasCompleted = false;
-        return _this;
-    }
-    AsyncSubject.prototype._subscribe = function (subscriber) {
-        if (this.hasError) {
-            subscriber.error(this.thrownError);
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else if (this.hasCompleted && this.hasNext) {
-            subscriber.next(this.value);
-            subscriber.complete();
-            return Subscription_1.Subscription.EMPTY;
-        }
-        return _super.prototype._subscribe.call(this, subscriber);
-    };
-    AsyncSubject.prototype.next = function (value) {
-        if (!this.hasCompleted) {
-            this.value = value;
-            this.hasNext = true;
-        }
-    };
-    AsyncSubject.prototype.error = function (error) {
-        if (!this.hasCompleted) {
-            _super.prototype.error.call(this, error);
-        }
-    };
-    AsyncSubject.prototype.complete = function () {
-        this.hasCompleted = true;
-        if (this.hasNext) {
-            _super.prototype.next.call(this, this.value);
-        }
-        _super.prototype.complete.call(this);
-    };
-    return AsyncSubject;
-}(Subject_1.Subject));
-exports.AsyncSubject = AsyncSubject;
-//# sourceMappingURL=AsyncSubject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/AsyncSubject.js.map b/node_modules/rxjs/internal/AsyncSubject.js.map
deleted file mode 100644
index 56ffa67..0000000
--- a/node_modules/rxjs/internal/AsyncSubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsyncSubject.js","sources":["../src/internal/AsyncSubject.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,qCAAoC;AAEpC,+CAA8C;AAQ9C;IAAqC,gCAAU;IAA/C;QAAA,qEAsCC;QArCS,WAAK,GAAM,IAAI,CAAC;QAChB,aAAO,GAAY,KAAK,CAAC;QACzB,kBAAY,GAAY,KAAK,CAAC;;IAmCxC,CAAC;IAhCC,iCAAU,GAAV,UAAW,UAA2B;QACpC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnC,OAAO,2BAAY,CAAC,KAAK,CAAC;SAC3B;aAAM,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE;YAC5C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,UAAU,CAAC,QAAQ,EAAE,CAAC;YACtB,OAAO,2BAAY,CAAC,KAAK,CAAC;SAC3B;QACD,OAAO,iBAAM,UAAU,YAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,2BAAI,GAAJ,UAAK,KAAQ;QACX,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;SACrB;IACH,CAAC;IAED,4BAAK,GAAL,UAAM,KAAU;QACd,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,iBAAM,KAAK,YAAC,KAAK,CAAC,CAAC;SACpB;IACH,CAAC;IAED,+BAAQ,GAAR;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,iBAAM,IAAI,YAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACxB;QACD,iBAAM,QAAQ,WAAE,CAAC;IACnB,CAAC;IACH,mBAAC;AAAD,CAAC,AAtCD,CAAqC,iBAAO,GAsC3C;AAtCY,oCAAY"}
diff --git a/node_modules/rxjs/internal/BehaviorSubject.d.ts b/node_modules/rxjs/internal/BehaviorSubject.d.ts
deleted file mode 100644
index c84b212..0000000
--- a/node_modules/rxjs/internal/BehaviorSubject.d.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Subject } from './Subject';
-import { Subscriber } from './Subscriber';
-import { Subscription } from './Subscription';
-/**
- * A variant of Subject that requires an initial value and emits its current
- * value whenever it is subscribed to.
- *
- * @class BehaviorSubject<T>
- */
-export declare class BehaviorSubject<T> extends Subject<T> {
-    private _value;
-    constructor(_value: T);
-    readonly value: T;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _subscribe(subscriber: Subscriber<T>): Subscription;
-    getValue(): T;
-    next(value: T): void;
-}
diff --git a/node_modules/rxjs/internal/BehaviorSubject.js b/node_modules/rxjs/internal/BehaviorSubject.js
deleted file mode 100644
index 99435d6..0000000
--- a/node_modules/rxjs/internal/BehaviorSubject.js
+++ /dev/null
@@ -1,56 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("./Subject");
-var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
-var BehaviorSubject = (function (_super) {
-    __extends(BehaviorSubject, _super);
-    function BehaviorSubject(_value) {
-        var _this = _super.call(this) || this;
-        _this._value = _value;
-        return _this;
-    }
-    Object.defineProperty(BehaviorSubject.prototype, "value", {
-        get: function () {
-            return this.getValue();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    BehaviorSubject.prototype._subscribe = function (subscriber) {
-        var subscription = _super.prototype._subscribe.call(this, subscriber);
-        if (subscription && !subscription.closed) {
-            subscriber.next(this._value);
-        }
-        return subscription;
-    };
-    BehaviorSubject.prototype.getValue = function () {
-        if (this.hasError) {
-            throw this.thrownError;
-        }
-        else if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else {
-            return this._value;
-        }
-    };
-    BehaviorSubject.prototype.next = function (value) {
-        _super.prototype.next.call(this, this._value = value);
-    };
-    return BehaviorSubject;
-}(Subject_1.Subject));
-exports.BehaviorSubject = BehaviorSubject;
-//# sourceMappingURL=BehaviorSubject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/BehaviorSubject.js.map b/node_modules/rxjs/internal/BehaviorSubject.js.map
deleted file mode 100644
index 54d4006..0000000
--- a/node_modules/rxjs/internal/BehaviorSubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"BehaviorSubject.js","sources":["../src/internal/BehaviorSubject.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,qCAAoC;AAIpC,0EAAyE;AAQzE;IAAwC,mCAAU;IAEhD,yBAAoB,MAAS;QAA7B,YACE,iBAAO,SACR;QAFmB,YAAM,GAAN,MAAM,CAAG;;IAE7B,CAAC;IAED,sBAAI,kCAAK;aAAT;YACE,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC;;;OAAA;IAGD,oCAAU,GAAV,UAAW,UAAyB;QAClC,IAAM,YAAY,GAAG,iBAAM,UAAU,YAAC,UAAU,CAAC,CAAC;QAClD,IAAI,YAAY,IAAI,CAAoB,YAAa,CAAC,MAAM,EAAE;YAC5D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC9B;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,kCAAQ,GAAR;QACE,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,IAAI,CAAC,WAAW,CAAC;SACxB;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE;YACtB,MAAM,IAAI,iDAAuB,EAAE,CAAC;SACrC;aAAM;YACL,OAAO,IAAI,CAAC,MAAM,CAAC;SACpB;IACH,CAAC;IAED,8BAAI,GAAJ,UAAK,KAAQ;QACX,iBAAM,IAAI,YAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IAClC,CAAC;IACH,sBAAC;AAAD,CAAC,AAhCD,CAAwC,iBAAO,GAgC9C;AAhCY,0CAAe"}
diff --git a/node_modules/rxjs/internal/InnerSubscriber.d.ts b/node_modules/rxjs/internal/InnerSubscriber.d.ts
deleted file mode 100644
index da9c606..0000000
--- a/node_modules/rxjs/internal/InnerSubscriber.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { Subscriber } from './Subscriber';
-import { OuterSubscriber } from './OuterSubscriber';
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class InnerSubscriber<T, R> extends Subscriber<R> {
-    private parent;
-    outerValue: T;
-    outerIndex: number;
-    private index;
-    constructor(parent: OuterSubscriber<T, R>, outerValue: T, outerIndex: number);
-    protected _next(value: R): void;
-    protected _error(error: any): void;
-    protected _complete(): void;
-}
diff --git a/node_modules/rxjs/internal/InnerSubscriber.js b/node_modules/rxjs/internal/InnerSubscriber.js
deleted file mode 100644
index d9b6dc4..0000000
--- a/node_modules/rxjs/internal/InnerSubscriber.js
+++ /dev/null
@@ -1,41 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("./Subscriber");
-var InnerSubscriber = (function (_super) {
-    __extends(InnerSubscriber, _super);
-    function InnerSubscriber(parent, outerValue, outerIndex) {
-        var _this = _super.call(this) || this;
-        _this.parent = parent;
-        _this.outerValue = outerValue;
-        _this.outerIndex = outerIndex;
-        _this.index = 0;
-        return _this;
-    }
-    InnerSubscriber.prototype._next = function (value) {
-        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
-    };
-    InnerSubscriber.prototype._error = function (error) {
-        this.parent.notifyError(error, this);
-        this.unsubscribe();
-    };
-    InnerSubscriber.prototype._complete = function () {
-        this.parent.notifyComplete(this);
-        this.unsubscribe();
-    };
-    return InnerSubscriber;
-}(Subscriber_1.Subscriber));
-exports.InnerSubscriber = InnerSubscriber;
-//# sourceMappingURL=InnerSubscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/InnerSubscriber.js.map b/node_modules/rxjs/internal/InnerSubscriber.js.map
deleted file mode 100644
index 4b50244..0000000
--- a/node_modules/rxjs/internal/InnerSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"InnerSubscriber.js","sources":["../src/internal/InnerSubscriber.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA0C;AAQ1C;IAA2C,mCAAa;IAGtD,yBAAoB,MAA6B,EAAS,UAAa,EAAS,UAAkB;QAAlG,YACE,iBAAO,SACR;QAFmB,YAAM,GAAN,MAAM,CAAuB;QAAS,gBAAU,GAAV,UAAU,CAAG;QAAS,gBAAU,GAAV,UAAU,CAAQ;QAF1F,WAAK,GAAG,CAAC,CAAC;;IAIlB,CAAC;IAES,+BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;IACtF,CAAC;IAES,gCAAM,GAAhB,UAAiB,KAAU;QACzB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,mCAAS,GAAnB;QACE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IACH,sBAAC;AAAD,CAAC,AApBD,CAA2C,uBAAU,GAoBpD;AApBY,0CAAe"}
diff --git a/node_modules/rxjs/internal/Notification.d.ts b/node_modules/rxjs/internal/Notification.d.ts
deleted file mode 100644
index ad94554..0000000
--- a/node_modules/rxjs/internal/Notification.d.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import { PartialObserver } from './types';
-import { Observable } from './Observable';
-/**
- * @deprecated NotificationKind is deprecated as const enums are not compatible with isolated modules. Use a string literal instead.
- */
-export declare enum NotificationKind {
-    NEXT = "N",
-    ERROR = "E",
-    COMPLETE = "C"
-}
-/**
- * Represents a push-based event or value that an {@link Observable} can emit.
- * This class is particularly useful for operators that manage notifications,
- * like {@link materialize}, {@link dematerialize}, {@link observeOn}, and
- * others. Besides wrapping the actual delivered value, it also annotates it
- * with metadata of, for instance, what type of push message it is (`next`,
- * `error`, or `complete`).
- *
- * @see {@link materialize}
- * @see {@link dematerialize}
- * @see {@link observeOn}
- *
- * @class Notification<T>
- */
-export declare class Notification<T> {
-    kind: 'N' | 'E' | 'C';
-    value?: T;
-    error?: any;
-    hasValue: boolean;
-    constructor(kind: 'N' | 'E' | 'C', value?: T, error?: any);
-    /**
-     * Delivers to the given `observer` the value wrapped by this Notification.
-     * @param {Observer} observer
-     * @return
-     */
-    observe(observer: PartialObserver<T>): any;
-    /**
-     * Given some {@link Observer} callbacks, deliver the value represented by the
-     * current Notification to the correctly corresponding callback.
-     * @param {function(value: T): void} next An Observer `next` callback.
-     * @param {function(err: any): void} [error] An Observer `error` callback.
-     * @param {function(): void} [complete] An Observer `complete` callback.
-     * @return {any}
-     */
-    do(next: (value: T) => void, error?: (err: any) => void, complete?: () => void): any;
-    /**
-     * Takes an Observer or its individual callback functions, and calls `observe`
-     * or `do` methods accordingly.
-     * @param {Observer|function(value: T): void} nextOrObserver An Observer or
-     * the `next` callback.
-     * @param {function(err: any): void} [error] An Observer `error` callback.
-     * @param {function(): void} [complete] An Observer `complete` callback.
-     * @return {any}
-     */
-    accept(nextOrObserver: PartialObserver<T> | ((value: T) => void), error?: (err: any) => void, complete?: () => void): any;
-    /**
-     * Returns a simple Observable that just delivers the notification represented
-     * by this Notification instance.
-     * @return {any}
-     */
-    toObservable(): Observable<T>;
-    private static completeNotification;
-    private static undefinedValueNotification;
-    /**
-     * A shortcut to create a Notification instance of the type `next` from a
-     * given value.
-     * @param {T} value The `next` value.
-     * @return {Notification<T>} The "next" Notification representing the
-     * argument.
-     * @nocollapse
-     */
-    static createNext<T>(value: T): Notification<T>;
-    /**
-     * A shortcut to create a Notification instance of the type `error` from a
-     * given error.
-     * @param {any} [err] The `error` error.
-     * @return {Notification<T>} The "error" Notification representing the
-     * argument.
-     * @nocollapse
-     */
-    static createError<T>(err?: any): Notification<T>;
-    /**
-     * A shortcut to create a Notification instance of the type `complete`.
-     * @return {Notification<any>} The valueless "complete" Notification.
-     * @nocollapse
-     */
-    static createComplete(): Notification<any>;
-}
diff --git a/node_modules/rxjs/internal/Notification.js b/node_modules/rxjs/internal/Notification.js
deleted file mode 100644
index dc3eeb6..0000000
--- a/node_modules/rxjs/internal/Notification.js
+++ /dev/null
@@ -1,77 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var empty_1 = require("./observable/empty");
-var of_1 = require("./observable/of");
-var throwError_1 = require("./observable/throwError");
-var NotificationKind;
-(function (NotificationKind) {
-    NotificationKind["NEXT"] = "N";
-    NotificationKind["ERROR"] = "E";
-    NotificationKind["COMPLETE"] = "C";
-})(NotificationKind = exports.NotificationKind || (exports.NotificationKind = {}));
-var Notification = (function () {
-    function Notification(kind, value, error) {
-        this.kind = kind;
-        this.value = value;
-        this.error = error;
-        this.hasValue = kind === 'N';
-    }
-    Notification.prototype.observe = function (observer) {
-        switch (this.kind) {
-            case 'N':
-                return observer.next && observer.next(this.value);
-            case 'E':
-                return observer.error && observer.error(this.error);
-            case 'C':
-                return observer.complete && observer.complete();
-        }
-    };
-    Notification.prototype.do = function (next, error, complete) {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return next && next(this.value);
-            case 'E':
-                return error && error(this.error);
-            case 'C':
-                return complete && complete();
-        }
-    };
-    Notification.prototype.accept = function (nextOrObserver, error, complete) {
-        if (nextOrObserver && typeof nextOrObserver.next === 'function') {
-            return this.observe(nextOrObserver);
-        }
-        else {
-            return this.do(nextOrObserver, error, complete);
-        }
-    };
-    Notification.prototype.toObservable = function () {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return of_1.of(this.value);
-            case 'E':
-                return throwError_1.throwError(this.error);
-            case 'C':
-                return empty_1.empty();
-        }
-        throw new Error('unexpected notification kind value');
-    };
-    Notification.createNext = function (value) {
-        if (typeof value !== 'undefined') {
-            return new Notification('N', value);
-        }
-        return Notification.undefinedValueNotification;
-    };
-    Notification.createError = function (err) {
-        return new Notification('E', undefined, err);
-    };
-    Notification.createComplete = function () {
-        return Notification.completeNotification;
-    };
-    Notification.completeNotification = new Notification('C');
-    Notification.undefinedValueNotification = new Notification('N', undefined);
-    return Notification;
-}());
-exports.Notification = Notification;
-//# sourceMappingURL=Notification.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/Notification.js.map b/node_modules/rxjs/internal/Notification.js.map
deleted file mode 100644
index 64be5a0..0000000
--- a/node_modules/rxjs/internal/Notification.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Notification.js","sources":["../src/internal/Notification.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/Observable.d.ts b/node_modules/rxjs/internal/Observable.d.ts
deleted file mode 100644
index 6c5c2da..0000000
--- a/node_modules/rxjs/internal/Observable.d.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import { Operator } from './Operator';
-import { Subscriber } from './Subscriber';
-import { Subscription } from './Subscription';
-import { TeardownLogic, OperatorFunction, PartialObserver, Subscribable } from './types';
-import { iif } from './observable/iif';
-import { throwError } from './observable/throwError';
-/**
- * A representation of any set of values over any amount of time. This is the most basic building block
- * of RxJS.
- *
- * @class Observable<T>
- */
-export declare class Observable<T> implements Subscribable<T> {
-    /** Internal implementation detail, do not use directly. */
-    _isScalar: boolean;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    source: Observable<any>;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    operator: Operator<any, T>;
-    /**
-     * @constructor
-     * @param {Function} subscribe the function that is called when the Observable is
-     * initially subscribed to. This function is given a Subscriber, to which new values
-     * can be `next`ed, or an `error` method can be called to raise an error, or
-     * `complete` can be called to notify of a successful completion.
-     */
-    constructor(subscribe?: (this: Observable<T>, subscriber: Subscriber<T>) => TeardownLogic);
-    /**
-     * Creates a new cold Observable by calling the Observable constructor
-     * @static true
-     * @owner Observable
-     * @method create
-     * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor
-     * @return {Observable} a new cold observable
-     * @nocollapse
-     * @deprecated use new Observable() instead
-     */
-    static create: Function;
-    /**
-     * Creates a new Observable, with this Observable as the source, and the passed
-     * operator defined as the new observable's operator.
-     * @method lift
-     * @param {Operator} operator the operator defining the operation to take on the observable
-     * @return {Observable} a new observable with the Operator applied
-     */
-    lift<R>(operator: Operator<T, R>): Observable<R>;
-    subscribe(observer?: PartialObserver<T>): Subscription;
-    /** @deprecated Use an observer instead of a complete callback */
-    subscribe(next: null | undefined, error: null | undefined, complete: () => void): Subscription;
-    /** @deprecated Use an observer instead of an error callback */
-    subscribe(next: null | undefined, error: (error: any) => void, complete?: () => void): Subscription;
-    /** @deprecated Use an observer instead of a complete callback */
-    subscribe(next: (value: T) => void, error: null | undefined, complete: () => void): Subscription;
-    subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _trySubscribe(sink: Subscriber<T>): TeardownLogic;
-    /**
-     * @method forEach
-     * @param {Function} next a handler for each value emitted by the observable
-     * @param {PromiseConstructor} [promiseCtor] a constructor function used to instantiate the Promise
-     * @return {Promise} a promise that either resolves on observable completion or
-     *  rejects with the handled error
-     */
-    forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise<void>;
-    /** @internal This is an internal implementation detail, do not use. */
-    _subscribe(subscriber: Subscriber<any>): TeardownLogic;
-    /**
-     * @nocollapse
-     * @deprecated In favor of iif creation function: import { iif } from 'rxjs';
-     */
-    static if: typeof iif;
-    /**
-     * @nocollapse
-     * @deprecated In favor of throwError creation function: import { throwError } from 'rxjs';
-     */
-    static throw: typeof throwError;
-    pipe(): Observable<T>;
-    pipe<A>(op1: OperatorFunction<T, A>): Observable<A>;
-    pipe<A, B>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>): Observable<B>;
-    pipe<A, B, C>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>): Observable<C>;
-    pipe<A, B, C, D>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>): Observable<D>;
-    pipe<A, B, C, D, E>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>): Observable<E>;
-    pipe<A, B, C, D, E, F>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>): Observable<F>;
-    pipe<A, B, C, D, E, F, G>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>): Observable<G>;
-    pipe<A, B, C, D, E, F, G, H>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>): Observable<H>;
-    pipe<A, B, C, D, E, F, G, H, I>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>, op9: OperatorFunction<H, I>): Observable<I>;
-    pipe<A, B, C, D, E, F, G, H, I>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>, op9: OperatorFunction<H, I>, ...operations: OperatorFunction<any, any>[]): Observable<{}>;
-    toPromise<T>(this: Observable<T>): Promise<T>;
-    toPromise<T>(this: Observable<T>, PromiseCtor: typeof Promise): Promise<T>;
-    toPromise<T>(this: Observable<T>, PromiseCtor: PromiseConstructorLike): Promise<T>;
-}
diff --git a/node_modules/rxjs/internal/Observable.js b/node_modules/rxjs/internal/Observable.js
deleted file mode 100644
index 780998b..0000000
--- a/node_modules/rxjs/internal/Observable.js
+++ /dev/null
@@ -1,117 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var canReportError_1 = require("./util/canReportError");
-var toSubscriber_1 = require("./util/toSubscriber");
-var observable_1 = require("./symbol/observable");
-var pipe_1 = require("./util/pipe");
-var config_1 = require("./config");
-var Observable = (function () {
-    function Observable(subscribe) {
-        this._isScalar = false;
-        if (subscribe) {
-            this._subscribe = subscribe;
-        }
-    }
-    Observable.prototype.lift = function (operator) {
-        var observable = new Observable();
-        observable.source = this;
-        observable.operator = operator;
-        return observable;
-    };
-    Observable.prototype.subscribe = function (observerOrNext, error, complete) {
-        var operator = this.operator;
-        var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);
-        if (operator) {
-            sink.add(operator.call(sink, this.source));
-        }
-        else {
-            sink.add(this.source || (config_1.config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?
-                this._subscribe(sink) :
-                this._trySubscribe(sink));
-        }
-        if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-            if (sink.syncErrorThrowable) {
-                sink.syncErrorThrowable = false;
-                if (sink.syncErrorThrown) {
-                    throw sink.syncErrorValue;
-                }
-            }
-        }
-        return sink;
-    };
-    Observable.prototype._trySubscribe = function (sink) {
-        try {
-            return this._subscribe(sink);
-        }
-        catch (err) {
-            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-                sink.syncErrorThrown = true;
-                sink.syncErrorValue = err;
-            }
-            if (canReportError_1.canReportError(sink)) {
-                sink.error(err);
-            }
-            else {
-                console.warn(err);
-            }
-        }
-    };
-    Observable.prototype.forEach = function (next, promiseCtor) {
-        var _this = this;
-        promiseCtor = getPromiseCtor(promiseCtor);
-        return new promiseCtor(function (resolve, reject) {
-            var subscription;
-            subscription = _this.subscribe(function (value) {
-                try {
-                    next(value);
-                }
-                catch (err) {
-                    reject(err);
-                    if (subscription) {
-                        subscription.unsubscribe();
-                    }
-                }
-            }, reject, resolve);
-        });
-    };
-    Observable.prototype._subscribe = function (subscriber) {
-        var source = this.source;
-        return source && source.subscribe(subscriber);
-    };
-    Observable.prototype[observable_1.observable] = function () {
-        return this;
-    };
-    Observable.prototype.pipe = function () {
-        var operations = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            operations[_i] = arguments[_i];
-        }
-        if (operations.length === 0) {
-            return this;
-        }
-        return pipe_1.pipeFromArray(operations)(this);
-    };
-    Observable.prototype.toPromise = function (promiseCtor) {
-        var _this = this;
-        promiseCtor = getPromiseCtor(promiseCtor);
-        return new promiseCtor(function (resolve, reject) {
-            var value;
-            _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });
-        });
-    };
-    Observable.create = function (subscribe) {
-        return new Observable(subscribe);
-    };
-    return Observable;
-}());
-exports.Observable = Observable;
-function getPromiseCtor(promiseCtor) {
-    if (!promiseCtor) {
-        promiseCtor = config_1.config.Promise || Promise;
-    }
-    if (!promiseCtor) {
-        throw new Error('no Promise impl found');
-    }
-    return promiseCtor;
-}
-//# sourceMappingURL=Observable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/Observable.js.map b/node_modules/rxjs/internal/Observable.js.map
deleted file mode 100644
index 4119f09..0000000
--- a/node_modules/rxjs/internal/Observable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Observable.js","sources":["../src/internal/Observable.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/Observer.d.ts b/node_modules/rxjs/internal/Observer.d.ts
deleted file mode 100644
index 454905d..0000000
--- a/node_modules/rxjs/internal/Observer.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { Observer } from './types';
-export declare const empty: Observer<any>;
diff --git a/node_modules/rxjs/internal/Observer.js b/node_modules/rxjs/internal/Observer.js
deleted file mode 100644
index e457b5f..0000000
--- a/node_modules/rxjs/internal/Observer.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var config_1 = require("./config");
-var hostReportError_1 = require("./util/hostReportError");
-exports.empty = {
-    closed: true,
-    next: function (value) { },
-    error: function (err) {
-        if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-            throw err;
-        }
-        else {
-            hostReportError_1.hostReportError(err);
-        }
-    },
-    complete: function () { }
-};
-//# sourceMappingURL=Observer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/Observer.js.map b/node_modules/rxjs/internal/Observer.js.map
deleted file mode 100644
index 6d12ace..0000000
--- a/node_modules/rxjs/internal/Observer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Observer.js","sources":["../src/internal/Observer.ts"],"names":[],"mappings":";;AACA,mCAAkC;AAClC,0DAAyD;AAE5C,QAAA,KAAK,GAAkB;IAClC,MAAM,EAAE,IAAI;IACZ,IAAI,EAAJ,UAAK,KAAU,IAAoB,CAAC;IACpC,KAAK,EAAL,UAAM,GAAQ;QACZ,IAAI,eAAM,CAAC,qCAAqC,EAAE;YAChD,MAAM,GAAG,CAAC;SACX;aAAM;YACL,iCAAe,CAAC,GAAG,CAAC,CAAC;SACtB;IACH,CAAC;IACD,QAAQ,EAAR,cAA4B,CAAC;CAC9B,CAAC"}
diff --git a/node_modules/rxjs/internal/Operator.d.ts b/node_modules/rxjs/internal/Operator.d.ts
deleted file mode 100644
index a1054c1..0000000
--- a/node_modules/rxjs/internal/Operator.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { Subscriber } from './Subscriber';
-import { TeardownLogic } from './types';
-export interface Operator<T, R> {
-    call(subscriber: Subscriber<R>, source: any): TeardownLogic;
-}
diff --git a/node_modules/rxjs/internal/Operator.js b/node_modules/rxjs/internal/Operator.js
deleted file mode 100644
index 3c44713..0000000
--- a/node_modules/rxjs/internal/Operator.js
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=Operator.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/Operator.js.map b/node_modules/rxjs/internal/Operator.js.map
deleted file mode 100644
index e883033..0000000
--- a/node_modules/rxjs/internal/Operator.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Operator.js","sources":["../src/internal/Operator.ts"],"names":[],"mappings":""}
diff --git a/node_modules/rxjs/internal/OuterSubscriber.d.ts b/node_modules/rxjs/internal/OuterSubscriber.d.ts
deleted file mode 100644
index 1550120..0000000
--- a/node_modules/rxjs/internal/OuterSubscriber.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Subscriber } from './Subscriber';
-import { InnerSubscriber } from './InnerSubscriber';
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class OuterSubscriber<T, R> extends Subscriber<T> {
-    notifyNext(outerValue: T, innerValue: R, outerIndex: number, innerIndex: number, innerSub: InnerSubscriber<T, R>): void;
-    notifyError(error: any, innerSub: InnerSubscriber<T, R>): void;
-    notifyComplete(innerSub: InnerSubscriber<T, R>): void;
-}
diff --git a/node_modules/rxjs/internal/OuterSubscriber.js b/node_modules/rxjs/internal/OuterSubscriber.js
deleted file mode 100644
index c2377b1..0000000
--- a/node_modules/rxjs/internal/OuterSubscriber.js
+++ /dev/null
@@ -1,34 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("./Subscriber");
-var OuterSubscriber = (function (_super) {
-    __extends(OuterSubscriber, _super);
-    function OuterSubscriber() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    OuterSubscriber.prototype.notifyError = function (error, innerSub) {
-        this.destination.error(error);
-    };
-    OuterSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.destination.complete();
-    };
-    return OuterSubscriber;
-}(Subscriber_1.Subscriber));
-exports.OuterSubscriber = OuterSubscriber;
-//# sourceMappingURL=OuterSubscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/OuterSubscriber.js.map b/node_modules/rxjs/internal/OuterSubscriber.js.map
deleted file mode 100644
index 37860d5..0000000
--- a/node_modules/rxjs/internal/OuterSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"OuterSubscriber.js","sources":["../src/internal/OuterSubscriber.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA0C;AAQ1C;IAA2C,mCAAa;IAAxD;;IAcA,CAAC;IAbC,oCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAED,qCAAW,GAAX,UAAY,KAAU,EAAE,QAA+B;QACrD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,wCAAc,GAAd,UAAe,QAA+B;QAC5C,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IACH,sBAAC;AAAD,CAAC,AAdD,CAA2C,uBAAU,GAcpD;AAdY,0CAAe"}
diff --git a/node_modules/rxjs/internal/ReplaySubject.d.ts b/node_modules/rxjs/internal/ReplaySubject.d.ts
deleted file mode 100644
index 28383d0..0000000
--- a/node_modules/rxjs/internal/ReplaySubject.d.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { Subject } from './Subject';
-import { SchedulerLike } from './types';
-import { Subscriber } from './Subscriber';
-import { Subscription } from './Subscription';
-/**
- * A variant of Subject that "replays" or emits old values to new subscribers.
- * It buffers a set number of values and will emit those values immediately to
- * any new subscribers in addition to emitting new values to existing subscribers.
- *
- * @class ReplaySubject<T>
- */
-export declare class ReplaySubject<T> extends Subject<T> {
-    private scheduler?;
-    private _events;
-    private _bufferSize;
-    private _windowTime;
-    private _infiniteTimeWindow;
-    constructor(bufferSize?: number, windowTime?: number, scheduler?: SchedulerLike);
-    private nextInfiniteTimeWindow;
-    private nextTimeWindow;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _subscribe(subscriber: Subscriber<T>): Subscription;
-    _getNow(): number;
-    private _trimBufferThenGetEvents;
-}
diff --git a/node_modules/rxjs/internal/ReplaySubject.js b/node_modules/rxjs/internal/ReplaySubject.js
deleted file mode 100644
index 673884f..0000000
--- a/node_modules/rxjs/internal/ReplaySubject.js
+++ /dev/null
@@ -1,126 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("./Subject");
-var queue_1 = require("./scheduler/queue");
-var Subscription_1 = require("./Subscription");
-var observeOn_1 = require("./operators/observeOn");
-var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
-var SubjectSubscription_1 = require("./SubjectSubscription");
-var ReplaySubject = (function (_super) {
-    __extends(ReplaySubject, _super);
-    function ReplaySubject(bufferSize, windowTime, scheduler) {
-        if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
-        if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
-        var _this = _super.call(this) || this;
-        _this.scheduler = scheduler;
-        _this._events = [];
-        _this._infiniteTimeWindow = false;
-        _this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
-        _this._windowTime = windowTime < 1 ? 1 : windowTime;
-        if (windowTime === Number.POSITIVE_INFINITY) {
-            _this._infiniteTimeWindow = true;
-            _this.next = _this.nextInfiniteTimeWindow;
-        }
-        else {
-            _this.next = _this.nextTimeWindow;
-        }
-        return _this;
-    }
-    ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) {
-        var _events = this._events;
-        _events.push(value);
-        if (_events.length > this._bufferSize) {
-            _events.shift();
-        }
-        _super.prototype.next.call(this, value);
-    };
-    ReplaySubject.prototype.nextTimeWindow = function (value) {
-        this._events.push(new ReplayEvent(this._getNow(), value));
-        this._trimBufferThenGetEvents();
-        _super.prototype.next.call(this, value);
-    };
-    ReplaySubject.prototype._subscribe = function (subscriber) {
-        var _infiniteTimeWindow = this._infiniteTimeWindow;
-        var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();
-        var scheduler = this.scheduler;
-        var len = _events.length;
-        var subscription;
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else if (this.isStopped || this.hasError) {
-            subscription = Subscription_1.Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            subscription = new SubjectSubscription_1.SubjectSubscription(this, subscriber);
-        }
-        if (scheduler) {
-            subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler));
-        }
-        if (_infiniteTimeWindow) {
-            for (var i = 0; i < len && !subscriber.closed; i++) {
-                subscriber.next(_events[i]);
-            }
-        }
-        else {
-            for (var i = 0; i < len && !subscriber.closed; i++) {
-                subscriber.next(_events[i].value);
-            }
-        }
-        if (this.hasError) {
-            subscriber.error(this.thrownError);
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-        }
-        return subscription;
-    };
-    ReplaySubject.prototype._getNow = function () {
-        return (this.scheduler || queue_1.queue).now();
-    };
-    ReplaySubject.prototype._trimBufferThenGetEvents = function () {
-        var now = this._getNow();
-        var _bufferSize = this._bufferSize;
-        var _windowTime = this._windowTime;
-        var _events = this._events;
-        var eventsCount = _events.length;
-        var spliceCount = 0;
-        while (spliceCount < eventsCount) {
-            if ((now - _events[spliceCount].time) < _windowTime) {
-                break;
-            }
-            spliceCount++;
-        }
-        if (eventsCount > _bufferSize) {
-            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);
-        }
-        if (spliceCount > 0) {
-            _events.splice(0, spliceCount);
-        }
-        return _events;
-    };
-    return ReplaySubject;
-}(Subject_1.Subject));
-exports.ReplaySubject = ReplaySubject;
-var ReplayEvent = (function () {
-    function ReplayEvent(time, value) {
-        this.time = time;
-        this.value = value;
-    }
-    return ReplayEvent;
-}());
-//# sourceMappingURL=ReplaySubject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/ReplaySubject.js.map b/node_modules/rxjs/internal/ReplaySubject.js.map
deleted file mode 100644
index b04e61c..0000000
--- a/node_modules/rxjs/internal/ReplaySubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ReplaySubject.js","sources":["../src/internal/ReplaySubject.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,qCAAoC;AAEpC,2CAA0C;AAE1C,+CAA8C;AAC9C,mDAA4D;AAC5D,0EAAyE;AACzE,6DAA4D;AAQ5D;IAAsC,iCAAU;IAM9C,uBAAY,UAA6C,EAC7C,UAA6C,EACrC,SAAyB;QAFjC,2BAAA,EAAA,aAAqB,MAAM,CAAC,iBAAiB;QAC7C,2BAAA,EAAA,aAAqB,MAAM,CAAC,iBAAiB;QADzD,YAGE,iBAAO,SAUR;QAXmB,eAAS,GAAT,SAAS,CAAgB;QAPrC,aAAO,GAA2B,EAAE,CAAC;QAGrC,yBAAmB,GAAY,KAAK,CAAC;QAM3C,KAAI,CAAC,WAAW,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACnD,KAAI,CAAC,WAAW,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QAEnD,IAAI,UAAU,KAAK,MAAM,CAAC,iBAAiB,EAAE;YAC3C,KAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,KAAI,CAAC,IAAI,GAAG,KAAI,CAAC,sBAAsB,CAAC;SACzC;aAAM;YACL,KAAI,CAAC,IAAI,GAAG,KAAI,CAAC,cAAc,CAAC;SACjC;;IACH,CAAC;IAEO,8CAAsB,GAA9B,UAA+B,KAAQ;QACrC,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAGpB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;YACrC,OAAO,CAAC,KAAK,EAAE,CAAC;SACjB;QAED,iBAAM,IAAI,YAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAEO,sCAAc,GAAtB,UAAuB,KAAQ;QAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,iBAAM,IAAI,YAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAGD,kCAAU,GAAV,UAAW,UAAyB;QAElC,IAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACrD,IAAM,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;QACrF,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;QAC3B,IAAI,YAA0B,CAAC;QAE/B,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,MAAM,IAAI,iDAAuB,EAAE,CAAC;SACrC;aAAM,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC1C,YAAY,GAAG,2BAAY,CAAC,KAAK,CAAC;SACnC;aAAM;YACL,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAChC,YAAY,GAAG,IAAI,yCAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;SAC1D;QAED,IAAI,SAAS,EAAE;YACb,UAAU,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,+BAAmB,CAAI,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;SAChF;QAED,IAAI,mBAAmB,EAAE;YACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAClD,UAAU,CAAC,IAAI,CAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;aAChC;SACF;aAAM;YACL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAClD,UAAU,CAAC,IAAI,CAAkB,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;aACrD;SACF;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SACpC;aAAM,IAAI,IAAI,CAAC,SAAS,EAAE;YACzB,UAAU,CAAC,QAAQ,EAAE,CAAC;SACvB;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,+BAAO,GAAP;QACE,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,aAAK,CAAC,CAAC,GAAG,EAAE,CAAC;IACzC,CAAC;IAEO,gDAAwB,GAAhC;QACE,IAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAM,OAAO,GAAqB,IAAI,CAAC,OAAO,CAAC;QAE/C,IAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;QACnC,IAAI,WAAW,GAAG,CAAC,CAAC;QAKpB,OAAO,WAAW,GAAG,WAAW,EAAE;YAChC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,EAAE;gBACnD,MAAM;aACP;YACD,WAAW,EAAE,CAAC;SACf;QAED,IAAI,WAAW,GAAG,WAAW,EAAE;YAC7B,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAAC,CAAC;SAChE;QAED,IAAI,WAAW,GAAG,CAAC,EAAE;YACnB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;SAChC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEH,oBAAC;AAAD,CAAC,AAnHD,CAAsC,iBAAO,GAmH5C;AAnHY,sCAAa;AAqH1B;IACE,qBAAmB,IAAY,EAAS,KAAQ;QAA7B,SAAI,GAAJ,IAAI,CAAQ;QAAS,UAAK,GAAL,KAAK,CAAG;IAChD,CAAC;IACH,kBAAC;AAAD,CAAC,AAHD,IAGC"}
diff --git a/node_modules/rxjs/internal/Rx.d.ts b/node_modules/rxjs/internal/Rx.d.ts
deleted file mode 100644
index ad8b666..0000000
--- a/node_modules/rxjs/internal/Rx.d.ts
+++ /dev/null
@@ -1,195 +0,0 @@
-export { Subject, AnonymousSubject } from './Subject';
-export { Observable } from './Observable';
-export { config } from './config';
-import 'rxjs-compat/add/observable/bindCallback';
-import 'rxjs-compat/add/observable/bindNodeCallback';
-import 'rxjs-compat/add/observable/combineLatest';
-import 'rxjs-compat/add/observable/concat';
-import 'rxjs-compat/add/observable/defer';
-import 'rxjs-compat/add/observable/empty';
-import 'rxjs-compat/add/observable/forkJoin';
-import 'rxjs-compat/add/observable/from';
-import 'rxjs-compat/add/observable/fromEvent';
-import 'rxjs-compat/add/observable/fromEventPattern';
-import 'rxjs-compat/add/observable/fromPromise';
-import 'rxjs-compat/add/observable/generate';
-import 'rxjs-compat/add/observable/if';
-import 'rxjs-compat/add/observable/interval';
-import 'rxjs-compat/add/observable/merge';
-import 'rxjs-compat/add/observable/race';
-import 'rxjs-compat/add/observable/never';
-import 'rxjs-compat/add/observable/of';
-import 'rxjs-compat/add/observable/onErrorResumeNext';
-import 'rxjs-compat/add/observable/pairs';
-import 'rxjs-compat/add/observable/range';
-import 'rxjs-compat/add/observable/using';
-import 'rxjs-compat/add/observable/throw';
-import 'rxjs-compat/add/observable/timer';
-import 'rxjs-compat/add/observable/zip';
-import 'rxjs-compat/add/observable/dom/ajax';
-import 'rxjs-compat/add/observable/dom/webSocket';
-import 'rxjs-compat/add/operator/buffer';
-import 'rxjs-compat/add/operator/bufferCount';
-import 'rxjs-compat/add/operator/bufferTime';
-import 'rxjs-compat/add/operator/bufferToggle';
-import 'rxjs-compat/add/operator/bufferWhen';
-import 'rxjs-compat/add/operator/catch';
-import 'rxjs-compat/add/operator/combineAll';
-import 'rxjs-compat/add/operator/combineLatest';
-import 'rxjs-compat/add/operator/concat';
-import 'rxjs-compat/add/operator/concatAll';
-import 'rxjs-compat/add/operator/concatMap';
-import 'rxjs-compat/add/operator/concatMapTo';
-import 'rxjs-compat/add/operator/count';
-import 'rxjs-compat/add/operator/dematerialize';
-import 'rxjs-compat/add/operator/debounce';
-import 'rxjs-compat/add/operator/debounceTime';
-import 'rxjs-compat/add/operator/defaultIfEmpty';
-import 'rxjs-compat/add/operator/delay';
-import 'rxjs-compat/add/operator/delayWhen';
-import 'rxjs-compat/add/operator/distinct';
-import 'rxjs-compat/add/operator/distinctUntilChanged';
-import 'rxjs-compat/add/operator/distinctUntilKeyChanged';
-import 'rxjs-compat/add/operator/do';
-import 'rxjs-compat/add/operator/exhaust';
-import 'rxjs-compat/add/operator/exhaustMap';
-import 'rxjs-compat/add/operator/expand';
-import 'rxjs-compat/add/operator/elementAt';
-import 'rxjs-compat/add/operator/filter';
-import 'rxjs-compat/add/operator/finally';
-import 'rxjs-compat/add/operator/find';
-import 'rxjs-compat/add/operator/findIndex';
-import 'rxjs-compat/add/operator/first';
-import 'rxjs-compat/add/operator/groupBy';
-import 'rxjs-compat/add/operator/ignoreElements';
-import 'rxjs-compat/add/operator/isEmpty';
-import 'rxjs-compat/add/operator/audit';
-import 'rxjs-compat/add/operator/auditTime';
-import 'rxjs-compat/add/operator/last';
-import 'rxjs-compat/add/operator/let';
-import 'rxjs-compat/add/operator/every';
-import 'rxjs-compat/add/operator/map';
-import 'rxjs-compat/add/operator/mapTo';
-import 'rxjs-compat/add/operator/materialize';
-import 'rxjs-compat/add/operator/max';
-import 'rxjs-compat/add/operator/merge';
-import 'rxjs-compat/add/operator/mergeAll';
-import 'rxjs-compat/add/operator/mergeMap';
-import 'rxjs-compat/add/operator/mergeMapTo';
-import 'rxjs-compat/add/operator/mergeScan';
-import 'rxjs-compat/add/operator/min';
-import 'rxjs-compat/add/operator/multicast';
-import 'rxjs-compat/add/operator/observeOn';
-import 'rxjs-compat/add/operator/onErrorResumeNext';
-import 'rxjs-compat/add/operator/pairwise';
-import 'rxjs-compat/add/operator/partition';
-import 'rxjs-compat/add/operator/pluck';
-import 'rxjs-compat/add/operator/publish';
-import 'rxjs-compat/add/operator/publishBehavior';
-import 'rxjs-compat/add/operator/publishReplay';
-import 'rxjs-compat/add/operator/publishLast';
-import 'rxjs-compat/add/operator/race';
-import 'rxjs-compat/add/operator/reduce';
-import 'rxjs-compat/add/operator/repeat';
-import 'rxjs-compat/add/operator/repeatWhen';
-import 'rxjs-compat/add/operator/retry';
-import 'rxjs-compat/add/operator/retryWhen';
-import 'rxjs-compat/add/operator/sample';
-import 'rxjs-compat/add/operator/sampleTime';
-import 'rxjs-compat/add/operator/scan';
-import 'rxjs-compat/add/operator/sequenceEqual';
-import 'rxjs-compat/add/operator/share';
-import 'rxjs-compat/add/operator/shareReplay';
-import 'rxjs-compat/add/operator/single';
-import 'rxjs-compat/add/operator/skip';
-import 'rxjs-compat/add/operator/skipLast';
-import 'rxjs-compat/add/operator/skipUntil';
-import 'rxjs-compat/add/operator/skipWhile';
-import 'rxjs-compat/add/operator/startWith';
-import 'rxjs-compat/add/operator/subscribeOn';
-import 'rxjs-compat/add/operator/switch';
-import 'rxjs-compat/add/operator/switchMap';
-import 'rxjs-compat/add/operator/switchMapTo';
-import 'rxjs-compat/add/operator/take';
-import 'rxjs-compat/add/operator/takeLast';
-import 'rxjs-compat/add/operator/takeUntil';
-import 'rxjs-compat/add/operator/takeWhile';
-import 'rxjs-compat/add/operator/throttle';
-import 'rxjs-compat/add/operator/throttleTime';
-import 'rxjs-compat/add/operator/timeInterval';
-import 'rxjs-compat/add/operator/timeout';
-import 'rxjs-compat/add/operator/timeoutWith';
-import 'rxjs-compat/add/operator/timestamp';
-import 'rxjs-compat/add/operator/toArray';
-import 'rxjs-compat/add/operator/toPromise';
-import 'rxjs-compat/add/operator/window';
-import 'rxjs-compat/add/operator/windowCount';
-import 'rxjs-compat/add/operator/windowTime';
-import 'rxjs-compat/add/operator/windowToggle';
-import 'rxjs-compat/add/operator/windowWhen';
-import 'rxjs-compat/add/operator/withLatestFrom';
-import 'rxjs-compat/add/operator/zip';
-import 'rxjs-compat/add/operator/zipAll';
-export { Operator } from './Operator';
-export { Observer } from './types';
-export { Subscription } from './Subscription';
-export { Subscriber } from './Subscriber';
-export { AsyncSubject } from './AsyncSubject';
-export { ReplaySubject } from './ReplaySubject';
-export { BehaviorSubject } from './BehaviorSubject';
-export { ConnectableObservable } from './observable/ConnectableObservable';
-export { Notification, NotificationKind } from './Notification';
-export { EmptyError } from './util/EmptyError';
-export { ArgumentOutOfRangeError } from './util/ArgumentOutOfRangeError';
-export { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
-export { TimeoutError } from './util/TimeoutError';
-export { UnsubscriptionError } from './util/UnsubscriptionError';
-export { TimeInterval } from './operators/timeInterval';
-export { Timestamp } from './operators/timestamp';
-export { TestScheduler } from './testing/TestScheduler';
-export { VirtualTimeScheduler } from './scheduler/VirtualTimeScheduler';
-export { AjaxRequest, AjaxResponse, AjaxError, AjaxTimeoutError } from './observable/dom/AjaxObservable';
-export { pipe } from './util/pipe';
-import { AsapScheduler } from './scheduler/AsapScheduler';
-import { AsyncScheduler } from './scheduler/AsyncScheduler';
-import { QueueScheduler } from './scheduler/QueueScheduler';
-import { AnimationFrameScheduler } from './scheduler/AnimationFrameScheduler';
-import * as _operators from './operators/index';
-export declare const operators: typeof _operators;
-/**
- * @typedef {Object} Rx.Scheduler
- * @property {SchedulerLike} asap Schedules on the micro task queue, which is the same
- * queue used for promises. Basically after the current job, but before the next job.
- * Use this for asynchronous conversions.
- * @property {SchedulerLike} queue Schedules on a queue in the current event frame
- * (trampoline scheduler). Use this for iteration operations.
- * @property {SchedulerLike} animationFrame Schedules work with `requestAnimationFrame`.
- * Use this for synchronizing with the platform's painting.
- * @property {SchedulerLike} async Schedules work with `setInterval`. Use this for
- * time-based operations.
- */
-declare let Scheduler: {
-    asap: AsapScheduler;
-    queue: QueueScheduler;
-    animationFrame: AnimationFrameScheduler;
-    async: AsyncScheduler;
-};
-/**
- * @typedef {Object} Rx.Symbol
- * @property {Symbol|string} rxSubscriber A symbol to use as a property name to
- * retrieve an "Rx safe" Observer from an object. "Rx safety" can be defined as
- * an object that has all of the traits of an Rx Subscriber, including the
- * ability to add and remove subscriptions to the subscription chain and
- * guarantees involving event triggering (can't "next" after unsubscription,
- * etc).
- * @property {Symbol|string} observable A symbol to use as a property name to
- * retrieve an Observable as defined by the [ECMAScript "Observable" spec](https://github.com/zenparsing/es-observable).
- * @property {Symbol|string} iterator The ES6 symbol to use as a property name
- * to retrieve an iterator from an object.
- */
-declare let Symbol: {
-    rxSubscriber: string | symbol;
-    observable: string | symbol;
-    iterator: symbol;
-};
-export { Scheduler, Symbol };
diff --git a/node_modules/rxjs/internal/Rx.js b/node_modules/rxjs/internal/Rx.js
deleted file mode 100644
index 8de0b0f..0000000
--- a/node_modules/rxjs/internal/Rx.js
+++ /dev/null
@@ -1,200 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("./Subject");
-exports.Subject = Subject_1.Subject;
-exports.AnonymousSubject = Subject_1.AnonymousSubject;
-var Observable_1 = require("./Observable");
-exports.Observable = Observable_1.Observable;
-var config_1 = require("./config");
-exports.config = config_1.config;
-require("rxjs-compat/add/observable/bindCallback");
-require("rxjs-compat/add/observable/bindNodeCallback");
-require("rxjs-compat/add/observable/combineLatest");
-require("rxjs-compat/add/observable/concat");
-require("rxjs-compat/add/observable/defer");
-require("rxjs-compat/add/observable/empty");
-require("rxjs-compat/add/observable/forkJoin");
-require("rxjs-compat/add/observable/from");
-require("rxjs-compat/add/observable/fromEvent");
-require("rxjs-compat/add/observable/fromEventPattern");
-require("rxjs-compat/add/observable/fromPromise");
-require("rxjs-compat/add/observable/generate");
-require("rxjs-compat/add/observable/if");
-require("rxjs-compat/add/observable/interval");
-require("rxjs-compat/add/observable/merge");
-require("rxjs-compat/add/observable/race");
-require("rxjs-compat/add/observable/never");
-require("rxjs-compat/add/observable/of");
-require("rxjs-compat/add/observable/onErrorResumeNext");
-require("rxjs-compat/add/observable/pairs");
-require("rxjs-compat/add/observable/range");
-require("rxjs-compat/add/observable/using");
-require("rxjs-compat/add/observable/throw");
-require("rxjs-compat/add/observable/timer");
-require("rxjs-compat/add/observable/zip");
-require("rxjs-compat/add/observable/dom/ajax");
-require("rxjs-compat/add/observable/dom/webSocket");
-require("rxjs-compat/add/operator/buffer");
-require("rxjs-compat/add/operator/bufferCount");
-require("rxjs-compat/add/operator/bufferTime");
-require("rxjs-compat/add/operator/bufferToggle");
-require("rxjs-compat/add/operator/bufferWhen");
-require("rxjs-compat/add/operator/catch");
-require("rxjs-compat/add/operator/combineAll");
-require("rxjs-compat/add/operator/combineLatest");
-require("rxjs-compat/add/operator/concat");
-require("rxjs-compat/add/operator/concatAll");
-require("rxjs-compat/add/operator/concatMap");
-require("rxjs-compat/add/operator/concatMapTo");
-require("rxjs-compat/add/operator/count");
-require("rxjs-compat/add/operator/dematerialize");
-require("rxjs-compat/add/operator/debounce");
-require("rxjs-compat/add/operator/debounceTime");
-require("rxjs-compat/add/operator/defaultIfEmpty");
-require("rxjs-compat/add/operator/delay");
-require("rxjs-compat/add/operator/delayWhen");
-require("rxjs-compat/add/operator/distinct");
-require("rxjs-compat/add/operator/distinctUntilChanged");
-require("rxjs-compat/add/operator/distinctUntilKeyChanged");
-require("rxjs-compat/add/operator/do");
-require("rxjs-compat/add/operator/exhaust");
-require("rxjs-compat/add/operator/exhaustMap");
-require("rxjs-compat/add/operator/expand");
-require("rxjs-compat/add/operator/elementAt");
-require("rxjs-compat/add/operator/filter");
-require("rxjs-compat/add/operator/finally");
-require("rxjs-compat/add/operator/find");
-require("rxjs-compat/add/operator/findIndex");
-require("rxjs-compat/add/operator/first");
-require("rxjs-compat/add/operator/groupBy");
-require("rxjs-compat/add/operator/ignoreElements");
-require("rxjs-compat/add/operator/isEmpty");
-require("rxjs-compat/add/operator/audit");
-require("rxjs-compat/add/operator/auditTime");
-require("rxjs-compat/add/operator/last");
-require("rxjs-compat/add/operator/let");
-require("rxjs-compat/add/operator/every");
-require("rxjs-compat/add/operator/map");
-require("rxjs-compat/add/operator/mapTo");
-require("rxjs-compat/add/operator/materialize");
-require("rxjs-compat/add/operator/max");
-require("rxjs-compat/add/operator/merge");
-require("rxjs-compat/add/operator/mergeAll");
-require("rxjs-compat/add/operator/mergeMap");
-require("rxjs-compat/add/operator/mergeMapTo");
-require("rxjs-compat/add/operator/mergeScan");
-require("rxjs-compat/add/operator/min");
-require("rxjs-compat/add/operator/multicast");
-require("rxjs-compat/add/operator/observeOn");
-require("rxjs-compat/add/operator/onErrorResumeNext");
-require("rxjs-compat/add/operator/pairwise");
-require("rxjs-compat/add/operator/partition");
-require("rxjs-compat/add/operator/pluck");
-require("rxjs-compat/add/operator/publish");
-require("rxjs-compat/add/operator/publishBehavior");
-require("rxjs-compat/add/operator/publishReplay");
-require("rxjs-compat/add/operator/publishLast");
-require("rxjs-compat/add/operator/race");
-require("rxjs-compat/add/operator/reduce");
-require("rxjs-compat/add/operator/repeat");
-require("rxjs-compat/add/operator/repeatWhen");
-require("rxjs-compat/add/operator/retry");
-require("rxjs-compat/add/operator/retryWhen");
-require("rxjs-compat/add/operator/sample");
-require("rxjs-compat/add/operator/sampleTime");
-require("rxjs-compat/add/operator/scan");
-require("rxjs-compat/add/operator/sequenceEqual");
-require("rxjs-compat/add/operator/share");
-require("rxjs-compat/add/operator/shareReplay");
-require("rxjs-compat/add/operator/single");
-require("rxjs-compat/add/operator/skip");
-require("rxjs-compat/add/operator/skipLast");
-require("rxjs-compat/add/operator/skipUntil");
-require("rxjs-compat/add/operator/skipWhile");
-require("rxjs-compat/add/operator/startWith");
-require("rxjs-compat/add/operator/subscribeOn");
-require("rxjs-compat/add/operator/switch");
-require("rxjs-compat/add/operator/switchMap");
-require("rxjs-compat/add/operator/switchMapTo");
-require("rxjs-compat/add/operator/take");
-require("rxjs-compat/add/operator/takeLast");
-require("rxjs-compat/add/operator/takeUntil");
-require("rxjs-compat/add/operator/takeWhile");
-require("rxjs-compat/add/operator/throttle");
-require("rxjs-compat/add/operator/throttleTime");
-require("rxjs-compat/add/operator/timeInterval");
-require("rxjs-compat/add/operator/timeout");
-require("rxjs-compat/add/operator/timeoutWith");
-require("rxjs-compat/add/operator/timestamp");
-require("rxjs-compat/add/operator/toArray");
-require("rxjs-compat/add/operator/toPromise");
-require("rxjs-compat/add/operator/window");
-require("rxjs-compat/add/operator/windowCount");
-require("rxjs-compat/add/operator/windowTime");
-require("rxjs-compat/add/operator/windowToggle");
-require("rxjs-compat/add/operator/windowWhen");
-require("rxjs-compat/add/operator/withLatestFrom");
-require("rxjs-compat/add/operator/zip");
-require("rxjs-compat/add/operator/zipAll");
-var Subscription_1 = require("./Subscription");
-exports.Subscription = Subscription_1.Subscription;
-var Subscriber_1 = require("./Subscriber");
-exports.Subscriber = Subscriber_1.Subscriber;
-var AsyncSubject_1 = require("./AsyncSubject");
-exports.AsyncSubject = AsyncSubject_1.AsyncSubject;
-var ReplaySubject_1 = require("./ReplaySubject");
-exports.ReplaySubject = ReplaySubject_1.ReplaySubject;
-var BehaviorSubject_1 = require("./BehaviorSubject");
-exports.BehaviorSubject = BehaviorSubject_1.BehaviorSubject;
-var ConnectableObservable_1 = require("./observable/ConnectableObservable");
-exports.ConnectableObservable = ConnectableObservable_1.ConnectableObservable;
-var Notification_1 = require("./Notification");
-exports.Notification = Notification_1.Notification;
-exports.NotificationKind = Notification_1.NotificationKind;
-var EmptyError_1 = require("./util/EmptyError");
-exports.EmptyError = EmptyError_1.EmptyError;
-var ArgumentOutOfRangeError_1 = require("./util/ArgumentOutOfRangeError");
-exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
-exports.ObjectUnsubscribedError = ObjectUnsubscribedError_1.ObjectUnsubscribedError;
-var TimeoutError_1 = require("./util/TimeoutError");
-exports.TimeoutError = TimeoutError_1.TimeoutError;
-var UnsubscriptionError_1 = require("./util/UnsubscriptionError");
-exports.UnsubscriptionError = UnsubscriptionError_1.UnsubscriptionError;
-var timeInterval_1 = require("./operators/timeInterval");
-exports.TimeInterval = timeInterval_1.TimeInterval;
-var timestamp_1 = require("./operators/timestamp");
-exports.Timestamp = timestamp_1.Timestamp;
-var TestScheduler_1 = require("./testing/TestScheduler");
-exports.TestScheduler = TestScheduler_1.TestScheduler;
-var VirtualTimeScheduler_1 = require("./scheduler/VirtualTimeScheduler");
-exports.VirtualTimeScheduler = VirtualTimeScheduler_1.VirtualTimeScheduler;
-var AjaxObservable_1 = require("./observable/dom/AjaxObservable");
-exports.AjaxResponse = AjaxObservable_1.AjaxResponse;
-exports.AjaxError = AjaxObservable_1.AjaxError;
-exports.AjaxTimeoutError = AjaxObservable_1.AjaxTimeoutError;
-var pipe_1 = require("./util/pipe");
-exports.pipe = pipe_1.pipe;
-var asap_1 = require("./scheduler/asap");
-var async_1 = require("./scheduler/async");
-var queue_1 = require("./scheduler/queue");
-var animationFrame_1 = require("./scheduler/animationFrame");
-var rxSubscriber_1 = require("./symbol/rxSubscriber");
-var iterator_1 = require("./symbol/iterator");
-var observable_1 = require("./symbol/observable");
-var _operators = require("./operators/index");
-exports.operators = _operators;
-var Scheduler = {
-    asap: asap_1.asap,
-    queue: queue_1.queue,
-    animationFrame: animationFrame_1.animationFrame,
-    async: async_1.async
-};
-exports.Scheduler = Scheduler;
-var Symbol = {
-    rxSubscriber: rxSubscriber_1.rxSubscriber,
-    observable: observable_1.observable,
-    iterator: iterator_1.iterator
-};
-exports.Symbol = Symbol;
-//# sourceMappingURL=Rx.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/Rx.js.map b/node_modules/rxjs/internal/Rx.js.map
deleted file mode 100644
index 98bfde4..0000000
--- a/node_modules/rxjs/internal/Rx.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Rx.js","sources":["../src/internal/Rx.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/Scheduler.d.ts b/node_modules/rxjs/internal/Scheduler.d.ts
deleted file mode 100644
index 47c34db..0000000
--- a/node_modules/rxjs/internal/Scheduler.d.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { Action } from './scheduler/Action';
-import { Subscription } from './Subscription';
-import { SchedulerLike, SchedulerAction } from './types';
-/**
- * An execution context and a data structure to order tasks and schedule their
- * execution. Provides a notion of (potentially virtual) time, through the
- * `now()` getter method.
- *
- * Each unit of work in a Scheduler is called an `Action`.
- *
- * ```ts
- * class Scheduler {
- *   now(): number;
- *   schedule(work, delay?, state?): Subscription;
- * }
- * ```
- *
- * @class Scheduler
- * @deprecated Scheduler is an internal implementation detail of RxJS, and
- * should not be used directly. Rather, create your own class and implement
- * {@link SchedulerLike}
- */
-export declare class Scheduler implements SchedulerLike {
-    private SchedulerAction;
-    /**
-     * Note: the extra arrow function wrapper is to make testing by overriding
-     * Date.now easier.
-     * @nocollapse
-     */
-    static now: () => number;
-    constructor(SchedulerAction: typeof Action, now?: () => number);
-    /**
-     * A getter method that returns a number representing the current time
-     * (at the time this function was called) according to the scheduler's own
-     * internal clock.
-     * @return {number} A number that represents the current time. May or may not
-     * have a relation to wall-clock time. May or may not refer to a time unit
-     * (e.g. milliseconds).
-     */
-    now: () => number;
-    /**
-     * Schedules a function, `work`, for execution. May happen at some point in
-     * the future, according to the `delay` parameter, if specified. May be passed
-     * some context object, `state`, which will be passed to the `work` function.
-     *
-     * The given arguments will be processed an stored as an Action object in a
-     * queue of actions.
-     *
-     * @param {function(state: ?T): ?Subscription} work A function representing a
-     * task, or some unit of work to be executed by the Scheduler.
-     * @param {number} [delay] Time to wait before executing the work, where the
-     * time unit is implicit and defined by the Scheduler itself.
-     * @param {T} [state] Some contextual data that the `work` function uses when
-     * called by the Scheduler.
-     * @return {Subscription} A subscription in order to be able to unsubscribe
-     * the scheduled work.
-     */
-    schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay?: number, state?: T): Subscription;
-}
diff --git a/node_modules/rxjs/internal/Scheduler.js b/node_modules/rxjs/internal/Scheduler.js
deleted file mode 100644
index 38b0969..0000000
--- a/node_modules/rxjs/internal/Scheduler.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Scheduler = (function () {
-    function Scheduler(SchedulerAction, now) {
-        if (now === void 0) { now = Scheduler.now; }
-        this.SchedulerAction = SchedulerAction;
-        this.now = now;
-    }
-    Scheduler.prototype.schedule = function (work, delay, state) {
-        if (delay === void 0) { delay = 0; }
-        return new this.SchedulerAction(this, work).schedule(state, delay);
-    };
-    Scheduler.now = function () { return Date.now(); };
-    return Scheduler;
-}());
-exports.Scheduler = Scheduler;
-//# sourceMappingURL=Scheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/Scheduler.js.map b/node_modules/rxjs/internal/Scheduler.js.map
deleted file mode 100644
index de55d2d..0000000
--- a/node_modules/rxjs/internal/Scheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Scheduler.js","sources":["../src/internal/Scheduler.ts"],"names":[],"mappings":";;AAuBA;IASE,mBAAoB,eAA8B,EACtC,GAAiC;QAAjC,oBAAA,EAAA,MAAoB,SAAS,CAAC,GAAG;QADzB,oBAAe,GAAf,eAAe,CAAe;QAEhD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IA6BM,4BAAQ,GAAf,UAAmB,IAAmD,EAAE,KAAiB,EAAE,KAAS;QAA5B,sBAAA,EAAA,SAAiB;QACvF,OAAO,IAAI,IAAI,CAAC,eAAe,CAAI,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;IApCa,aAAG,GAAiB,cAAM,OAAA,IAAI,CAAC,GAAG,EAAE,EAAV,CAAU,CAAC;IAqCrD,gBAAC;CAAA,AA5CD,IA4CC;AA5CY,8BAAS"}
diff --git a/node_modules/rxjs/internal/Subject.d.ts b/node_modules/rxjs/internal/Subject.d.ts
deleted file mode 100644
index dc86c2f..0000000
--- a/node_modules/rxjs/internal/Subject.d.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { Operator } from './Operator';
-import { Observable } from './Observable';
-import { Subscriber } from './Subscriber';
-import { Subscription } from './Subscription';
-import { Observer, SubscriptionLike, TeardownLogic } from './types';
-/**
- * @class SubjectSubscriber<T>
- */
-export declare class SubjectSubscriber<T> extends Subscriber<T> {
-    protected destination: Subject<T>;
-    constructor(destination: Subject<T>);
-}
-/**
- * A Subject is a special type of Observable that allows values to be
- * multicasted to many Observers. Subjects are like EventEmitters.
- *
- * Every Subject is an Observable and an Observer. You can subscribe to a
- * Subject, and you can call next to feed values as well as error and complete.
- *
- * @class Subject<T>
- */
-export declare class Subject<T> extends Observable<T> implements SubscriptionLike {
-    observers: Observer<T>[];
-    closed: boolean;
-    isStopped: boolean;
-    hasError: boolean;
-    thrownError: any;
-    constructor();
-    /**@nocollapse
-     * @deprecated use new Subject() instead
-    */
-    static create: Function;
-    lift<R>(operator: Operator<T, R>): Observable<R>;
-    next(value?: T): void;
-    error(err: any): void;
-    complete(): void;
-    unsubscribe(): void;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _trySubscribe(subscriber: Subscriber<T>): TeardownLogic;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _subscribe(subscriber: Subscriber<T>): Subscription;
-    /**
-     * Creates a new Observable with this Subject as the source. You can do this
-     * to create customize Observer-side logic of the Subject and conceal it from
-     * code that uses the Observable.
-     * @return {Observable} Observable that the Subject casts to
-     */
-    asObservable(): Observable<T>;
-}
-/**
- * @class AnonymousSubject<T>
- */
-export declare class AnonymousSubject<T> extends Subject<T> {
-    protected destination?: Observer<T>;
-    constructor(destination?: Observer<T>, source?: Observable<T>);
-    next(value: T): void;
-    error(err: any): void;
-    complete(): void;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _subscribe(subscriber: Subscriber<T>): Subscription;
-}
diff --git a/node_modules/rxjs/internal/Subject.js b/node_modules/rxjs/internal/Subject.js
deleted file mode 100644
index 644e14d..0000000
--- a/node_modules/rxjs/internal/Subject.js
+++ /dev/null
@@ -1,171 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("./Observable");
-var Subscriber_1 = require("./Subscriber");
-var Subscription_1 = require("./Subscription");
-var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
-var SubjectSubscription_1 = require("./SubjectSubscription");
-var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
-var SubjectSubscriber = (function (_super) {
-    __extends(SubjectSubscriber, _super);
-    function SubjectSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        return _this;
-    }
-    return SubjectSubscriber;
-}(Subscriber_1.Subscriber));
-exports.SubjectSubscriber = SubjectSubscriber;
-var Subject = (function (_super) {
-    __extends(Subject, _super);
-    function Subject() {
-        var _this = _super.call(this) || this;
-        _this.observers = [];
-        _this.closed = false;
-        _this.isStopped = false;
-        _this.hasError = false;
-        _this.thrownError = null;
-        return _this;
-    }
-    Subject.prototype[rxSubscriber_1.rxSubscriber] = function () {
-        return new SubjectSubscriber(this);
-    };
-    Subject.prototype.lift = function (operator) {
-        var subject = new AnonymousSubject(this, this);
-        subject.operator = operator;
-        return subject;
-    };
-    Subject.prototype.next = function (value) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        if (!this.isStopped) {
-            var observers = this.observers;
-            var len = observers.length;
-            var copy = observers.slice();
-            for (var i = 0; i < len; i++) {
-                copy[i].next(value);
-            }
-        }
-    };
-    Subject.prototype.error = function (err) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        this.hasError = true;
-        this.thrownError = err;
-        this.isStopped = true;
-        var observers = this.observers;
-        var len = observers.length;
-        var copy = observers.slice();
-        for (var i = 0; i < len; i++) {
-            copy[i].error(err);
-        }
-        this.observers.length = 0;
-    };
-    Subject.prototype.complete = function () {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        this.isStopped = true;
-        var observers = this.observers;
-        var len = observers.length;
-        var copy = observers.slice();
-        for (var i = 0; i < len; i++) {
-            copy[i].complete();
-        }
-        this.observers.length = 0;
-    };
-    Subject.prototype.unsubscribe = function () {
-        this.isStopped = true;
-        this.closed = true;
-        this.observers = null;
-    };
-    Subject.prototype._trySubscribe = function (subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else {
-            return _super.prototype._trySubscribe.call(this, subscriber);
-        }
-    };
-    Subject.prototype._subscribe = function (subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else if (this.hasError) {
-            subscriber.error(this.thrownError);
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            return new SubjectSubscription_1.SubjectSubscription(this, subscriber);
-        }
-    };
-    Subject.prototype.asObservable = function () {
-        var observable = new Observable_1.Observable();
-        observable.source = this;
-        return observable;
-    };
-    Subject.create = function (destination, source) {
-        return new AnonymousSubject(destination, source);
-    };
-    return Subject;
-}(Observable_1.Observable));
-exports.Subject = Subject;
-var AnonymousSubject = (function (_super) {
-    __extends(AnonymousSubject, _super);
-    function AnonymousSubject(destination, source) {
-        var _this = _super.call(this) || this;
-        _this.destination = destination;
-        _this.source = source;
-        return _this;
-    }
-    AnonymousSubject.prototype.next = function (value) {
-        var destination = this.destination;
-        if (destination && destination.next) {
-            destination.next(value);
-        }
-    };
-    AnonymousSubject.prototype.error = function (err) {
-        var destination = this.destination;
-        if (destination && destination.error) {
-            this.destination.error(err);
-        }
-    };
-    AnonymousSubject.prototype.complete = function () {
-        var destination = this.destination;
-        if (destination && destination.complete) {
-            this.destination.complete();
-        }
-    };
-    AnonymousSubject.prototype._subscribe = function (subscriber) {
-        var source = this.source;
-        if (source) {
-            return this.source.subscribe(subscriber);
-        }
-        else {
-            return Subscription_1.Subscription.EMPTY;
-        }
-    };
-    return AnonymousSubject;
-}(Subject));
-exports.AnonymousSubject = AnonymousSubject;
-//# sourceMappingURL=Subject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/Subject.js.map b/node_modules/rxjs/internal/Subject.js.map
deleted file mode 100644
index 4008ca1..0000000
--- a/node_modules/rxjs/internal/Subject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Subject.js","sources":["../src/internal/Subject.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/SubjectSubscription.d.ts b/node_modules/rxjs/internal/SubjectSubscription.d.ts
deleted file mode 100644
index ed533ee..0000000
--- a/node_modules/rxjs/internal/SubjectSubscription.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Subject } from './Subject';
-import { Observer } from './types';
-import { Subscription } from './Subscription';
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class SubjectSubscription<T> extends Subscription {
-    subject: Subject<T>;
-    subscriber: Observer<T>;
-    closed: boolean;
-    constructor(subject: Subject<T>, subscriber: Observer<T>);
-    unsubscribe(): void;
-}
diff --git a/node_modules/rxjs/internal/SubjectSubscription.js b/node_modules/rxjs/internal/SubjectSubscription.js
deleted file mode 100644
index 2409d40..0000000
--- a/node_modules/rxjs/internal/SubjectSubscription.js
+++ /dev/null
@@ -1,45 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscription_1 = require("./Subscription");
-var SubjectSubscription = (function (_super) {
-    __extends(SubjectSubscription, _super);
-    function SubjectSubscription(subject, subscriber) {
-        var _this = _super.call(this) || this;
-        _this.subject = subject;
-        _this.subscriber = subscriber;
-        _this.closed = false;
-        return _this;
-    }
-    SubjectSubscription.prototype.unsubscribe = function () {
-        if (this.closed) {
-            return;
-        }
-        this.closed = true;
-        var subject = this.subject;
-        var observers = subject.observers;
-        this.subject = null;
-        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
-            return;
-        }
-        var subscriberIndex = observers.indexOf(this.subscriber);
-        if (subscriberIndex !== -1) {
-            observers.splice(subscriberIndex, 1);
-        }
-    };
-    return SubjectSubscription;
-}(Subscription_1.Subscription));
-exports.SubjectSubscription = SubjectSubscription;
-//# sourceMappingURL=SubjectSubscription.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/SubjectSubscription.js.map b/node_modules/rxjs/internal/SubjectSubscription.js.map
deleted file mode 100644
index f1fe1b9..0000000
--- a/node_modules/rxjs/internal/SubjectSubscription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubjectSubscription.js","sources":["../src/internal/SubjectSubscription.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,+CAA8C;AAO9C;IAA4C,uCAAY;IAGtD,6BAAmB,OAAmB,EAAS,UAAuB;QAAtE,YACE,iBAAO,SACR;QAFkB,aAAO,GAAP,OAAO,CAAY;QAAS,gBAAU,GAAV,UAAU,CAAa;QAFtE,YAAM,GAAY,KAAK,CAAC;;IAIxB,CAAC;IAED,yCAAW,GAAX;QACE,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO;SACR;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE;YAC/E,OAAO;SACR;QAED,IAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE3D,IAAI,eAAe,KAAK,CAAC,CAAC,EAAE;YAC1B,SAAS,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;SACtC;IACH,CAAC;IACH,0BAAC;AAAD,CAAC,AA7BD,CAA4C,2BAAY,GA6BvD;AA7BY,kDAAmB"}
diff --git a/node_modules/rxjs/internal/Subscriber.d.ts b/node_modules/rxjs/internal/Subscriber.d.ts
deleted file mode 100644
index d841126..0000000
--- a/node_modules/rxjs/internal/Subscriber.d.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { Observer, PartialObserver } from './types';
-import { Subscription } from './Subscription';
-/**
- * Implements the {@link Observer} interface and extends the
- * {@link Subscription} class. While the {@link Observer} is the public API for
- * consuming the values of an {@link Observable}, all Observers get converted to
- * a Subscriber, in order to provide Subscription-like capabilities such as
- * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for
- * implementing operators, but it is rarely used as a public API.
- *
- * @class Subscriber<T>
- */
-export declare class Subscriber<T> extends Subscription implements Observer<T> {
-    /**
-     * A static factory for a Subscriber, given a (potentially partial) definition
-     * of an Observer.
-     * @param {function(x: ?T): void} [next] The `next` callback of an Observer.
-     * @param {function(e: ?any): void} [error] The `error` callback of an
-     * Observer.
-     * @param {function(): void} [complete] The `complete` callback of an
-     * Observer.
-     * @return {Subscriber<T>} A Subscriber wrapping the (partially defined)
-     * Observer represented by the given arguments.
-     * @nocollapse
-     */
-    static create<T>(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber<T>;
-    /** @internal */ syncErrorValue: any;
-    /** @internal */ syncErrorThrown: boolean;
-    /** @internal */ syncErrorThrowable: boolean;
-    protected isStopped: boolean;
-    protected destination: PartialObserver<any> | Subscriber<any>;
-    /**
-     * @param {Observer|function(value: T): void} [destinationOrNext] A partially
-     * defined Observer or a `next` callback function.
-     * @param {function(e: ?any): void} [error] The `error` callback of an
-     * Observer.
-     * @param {function(): void} [complete] The `complete` callback of an
-     * Observer.
-     */
-    constructor(destinationOrNext?: PartialObserver<any> | ((value: T) => void), error?: (e?: any) => void, complete?: () => void);
-    /**
-     * The {@link Observer} callback to receive notifications of type `next` from
-     * the Observable, with a value. The Observable may call this method 0 or more
-     * times.
-     * @param {T} [value] The `next` value.
-     * @return {void}
-     */
-    next(value?: T): void;
-    /**
-     * The {@link Observer} callback to receive notifications of type `error` from
-     * the Observable, with an attached `Error`. Notifies the Observer that
-     * the Observable has experienced an error condition.
-     * @param {any} [err] The `error` exception.
-     * @return {void}
-     */
-    error(err?: any): void;
-    /**
-     * The {@link Observer} callback to receive a valueless notification of type
-     * `complete` from the Observable. Notifies the Observer that the Observable
-     * has finished sending push-based notifications.
-     * @return {void}
-     */
-    complete(): void;
-    unsubscribe(): void;
-    protected _next(value: T): void;
-    protected _error(err: any): void;
-    protected _complete(): void;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _unsubscribeAndRecycle(): Subscriber<T>;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class SafeSubscriber<T> extends Subscriber<T> {
-    private _parentSubscriber;
-    private _context;
-    constructor(_parentSubscriber: Subscriber<T>, observerOrNext?: PartialObserver<T> | ((value: T) => void), error?: (e?: any) => void, complete?: () => void);
-    next(value?: T): void;
-    error(err?: any): void;
-    complete(): void;
-    private __tryOrUnsub;
-    private __tryOrSetError;
-    /** @internal This is an internal implementation detail, do not use. */
-    _unsubscribe(): void;
-}
diff --git a/node_modules/rxjs/internal/Subscriber.js b/node_modules/rxjs/internal/Subscriber.js
deleted file mode 100644
index 08a57fd..0000000
--- a/node_modules/rxjs/internal/Subscriber.js
+++ /dev/null
@@ -1,246 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var isFunction_1 = require("./util/isFunction");
-var Observer_1 = require("./Observer");
-var Subscription_1 = require("./Subscription");
-var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
-var config_1 = require("./config");
-var hostReportError_1 = require("./util/hostReportError");
-var Subscriber = (function (_super) {
-    __extends(Subscriber, _super);
-    function Subscriber(destinationOrNext, error, complete) {
-        var _this = _super.call(this) || this;
-        _this.syncErrorValue = null;
-        _this.syncErrorThrown = false;
-        _this.syncErrorThrowable = false;
-        _this.isStopped = false;
-        switch (arguments.length) {
-            case 0:
-                _this.destination = Observer_1.empty;
-                break;
-            case 1:
-                if (!destinationOrNext) {
-                    _this.destination = Observer_1.empty;
-                    break;
-                }
-                if (typeof destinationOrNext === 'object') {
-                    if (destinationOrNext instanceof Subscriber) {
-                        _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;
-                        _this.destination = destinationOrNext;
-                        destinationOrNext.add(_this);
-                    }
-                    else {
-                        _this.syncErrorThrowable = true;
-                        _this.destination = new SafeSubscriber(_this, destinationOrNext);
-                    }
-                    break;
-                }
-            default:
-                _this.syncErrorThrowable = true;
-                _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete);
-                break;
-        }
-        return _this;
-    }
-    Subscriber.prototype[rxSubscriber_1.rxSubscriber] = function () { return this; };
-    Subscriber.create = function (next, error, complete) {
-        var subscriber = new Subscriber(next, error, complete);
-        subscriber.syncErrorThrowable = false;
-        return subscriber;
-    };
-    Subscriber.prototype.next = function (value) {
-        if (!this.isStopped) {
-            this._next(value);
-        }
-    };
-    Subscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._error(err);
-        }
-    };
-    Subscriber.prototype.complete = function () {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._complete();
-        }
-    };
-    Subscriber.prototype.unsubscribe = function () {
-        if (this.closed) {
-            return;
-        }
-        this.isStopped = true;
-        _super.prototype.unsubscribe.call(this);
-    };
-    Subscriber.prototype._next = function (value) {
-        this.destination.next(value);
-    };
-    Subscriber.prototype._error = function (err) {
-        this.destination.error(err);
-        this.unsubscribe();
-    };
-    Subscriber.prototype._complete = function () {
-        this.destination.complete();
-        this.unsubscribe();
-    };
-    Subscriber.prototype._unsubscribeAndRecycle = function () {
-        var _parentOrParents = this._parentOrParents;
-        this._parentOrParents = null;
-        this.unsubscribe();
-        this.closed = false;
-        this.isStopped = false;
-        this._parentOrParents = _parentOrParents;
-        return this;
-    };
-    return Subscriber;
-}(Subscription_1.Subscription));
-exports.Subscriber = Subscriber;
-var SafeSubscriber = (function (_super) {
-    __extends(SafeSubscriber, _super);
-    function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) {
-        var _this = _super.call(this) || this;
-        _this._parentSubscriber = _parentSubscriber;
-        var next;
-        var context = _this;
-        if (isFunction_1.isFunction(observerOrNext)) {
-            next = observerOrNext;
-        }
-        else if (observerOrNext) {
-            next = observerOrNext.next;
-            error = observerOrNext.error;
-            complete = observerOrNext.complete;
-            if (observerOrNext !== Observer_1.empty) {
-                context = Object.create(observerOrNext);
-                if (isFunction_1.isFunction(context.unsubscribe)) {
-                    _this.add(context.unsubscribe.bind(context));
-                }
-                context.unsubscribe = _this.unsubscribe.bind(_this);
-            }
-        }
-        _this._context = context;
-        _this._next = next;
-        _this._error = error;
-        _this._complete = complete;
-        return _this;
-    }
-    SafeSubscriber.prototype.next = function (value) {
-        if (!this.isStopped && this._next) {
-            var _parentSubscriber = this._parentSubscriber;
-            if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                this.__tryOrUnsub(this._next, value);
-            }
-            else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var _parentSubscriber = this._parentSubscriber;
-            var useDeprecatedSynchronousErrorHandling = config_1.config.useDeprecatedSynchronousErrorHandling;
-            if (this._error) {
-                if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(this._error, err);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parentSubscriber, this._error, err);
-                    this.unsubscribe();
-                }
-            }
-            else if (!_parentSubscriber.syncErrorThrowable) {
-                this.unsubscribe();
-                if (useDeprecatedSynchronousErrorHandling) {
-                    throw err;
-                }
-                hostReportError_1.hostReportError(err);
-            }
-            else {
-                if (useDeprecatedSynchronousErrorHandling) {
-                    _parentSubscriber.syncErrorValue = err;
-                    _parentSubscriber.syncErrorThrown = true;
-                }
-                else {
-                    hostReportError_1.hostReportError(err);
-                }
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.complete = function () {
-        var _this = this;
-        if (!this.isStopped) {
-            var _parentSubscriber = this._parentSubscriber;
-            if (this._complete) {
-                var wrappedComplete = function () { return _this._complete.call(_this._context); };
-                if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(wrappedComplete);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parentSubscriber, wrappedComplete);
-                    this.unsubscribe();
-                }
-            }
-            else {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            this.unsubscribe();
-            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-                throw err;
-            }
-            else {
-                hostReportError_1.hostReportError(err);
-            }
-        }
-    };
-    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
-        if (!config_1.config.useDeprecatedSynchronousErrorHandling) {
-            throw new Error('bad call');
-        }
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-                parent.syncErrorValue = err;
-                parent.syncErrorThrown = true;
-                return true;
-            }
-            else {
-                hostReportError_1.hostReportError(err);
-                return true;
-            }
-        }
-        return false;
-    };
-    SafeSubscriber.prototype._unsubscribe = function () {
-        var _parentSubscriber = this._parentSubscriber;
-        this._context = null;
-        this._parentSubscriber = null;
-        _parentSubscriber.unsubscribe();
-    };
-    return SafeSubscriber;
-}(Subscriber));
-exports.SafeSubscriber = SafeSubscriber;
-//# sourceMappingURL=Subscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/Subscriber.js.map b/node_modules/rxjs/internal/Subscriber.js.map
deleted file mode 100644
index 3b07b8c..0000000
--- a/node_modules/rxjs/internal/Subscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Subscriber.js","sources":["../src/internal/Subscriber.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,gDAA+C;AAC/C,uCAAoD;AAEpD,+CAA8C;AAC9C,gEAAqF;AACrF,mCAAkC;AAClC,0DAAyD;AAYzD;IAAmC,8BAAY;IAuC7C,oBAAY,iBAA+D,EAC/D,KAAyB,EACzB,QAAqB;QAFjC,YAGE,iBAAO,SA2BR;QA7CgB,oBAAc,GAAQ,IAAI,CAAC;QAC3B,qBAAe,GAAY,KAAK,CAAC;QACjC,wBAAkB,GAAY,KAAK,CAAC;QAE3C,eAAS,GAAY,KAAK,CAAC;QAgBnC,QAAQ,SAAS,CAAC,MAAM,EAAE;YACxB,KAAK,CAAC;gBACJ,KAAI,CAAC,WAAW,GAAG,gBAAa,CAAC;gBACjC,MAAM;YACR,KAAK,CAAC;gBACJ,IAAI,CAAC,iBAAiB,EAAE;oBACtB,KAAI,CAAC,WAAW,GAAG,gBAAa,CAAC;oBACjC,MAAM;iBACP;gBACD,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE;oBACzC,IAAI,iBAAiB,YAAY,UAAU,EAAE;wBAC3C,KAAI,CAAC,kBAAkB,GAAG,iBAAiB,CAAC,kBAAkB,CAAC;wBAC/D,KAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC;wBACrC,iBAAiB,CAAC,GAAG,CAAC,KAAI,CAAC,CAAC;qBAC7B;yBAAM;wBACL,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;wBAC/B,KAAI,CAAC,WAAW,GAAG,IAAI,cAAc,CAAI,KAAI,EAAyB,iBAAiB,CAAC,CAAC;qBAC1F;oBACD,MAAM;iBACP;YACH;gBACE,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAC/B,KAAI,CAAC,WAAW,GAAG,IAAI,cAAc,CAAI,KAAI,EAAyB,iBAAiB,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC1G,MAAM;SACT;;IACH,CAAC;IAnED,qBAAC,2BAAkB,CAAC,GAApB,cAAyB,OAAO,IAAI,CAAC,CAAC,CAAC;IAchC,iBAAM,GAAb,UAAiB,IAAsB,EACtB,KAAyB,EACzB,QAAqB;QACpC,IAAM,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACzD,UAAU,CAAC,kBAAkB,GAAG,KAAK,CAAC;QACtC,OAAO,UAAU,CAAC;IACpB,CAAC;IAwDD,yBAAI,GAAJ,UAAK,KAAS;QACZ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACnB;IACH,CAAC;IASD,0BAAK,GAAL,UAAM,GAAS;QACb,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAClB;IACH,CAAC;IAQD,6BAAQ,GAAR;QACE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,SAAS,EAAE,CAAC;SAClB;IACH,CAAC;IAED,gCAAW,GAAX;QACE,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO;SACR;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,iBAAM,WAAW,WAAE,CAAC;IACtB,CAAC;IAES,0BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAES,2BAAM,GAAhB,UAAiB,GAAQ;QACvB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,8BAAS,GAAnB;QACE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAGD,2CAAsB,GAAtB;QACW,IAAA,wCAAgB,CAAU;QACnC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IACH,iBAAC;AAAD,CAAC,AA/ID,CAAmC,2BAAY,GA+I9C;AA/IY,gCAAU;AAsJvB;IAAuC,kCAAa;IAIlD,wBAAoB,iBAAgC,EACxC,cAA0D,EAC1D,KAAyB,EACzB,QAAqB;QAHjC,YAIE,iBAAO,SAwBR;QA5BmB,uBAAiB,GAAjB,iBAAiB,CAAe;QAMlD,IAAI,IAA0B,CAAC;QAC/B,IAAI,OAAO,GAAQ,KAAI,CAAC;QAExB,IAAI,uBAAU,CAAC,cAAc,CAAC,EAAE;YAC9B,IAAI,GAA2B,cAAe,CAAC;SAChD;aAAM,IAAI,cAAc,EAAE;YACzB,IAAI,GAAyB,cAAe,CAAC,IAAI,CAAC;YAClD,KAAK,GAAyB,cAAe,CAAC,KAAK,CAAC;YACpD,QAAQ,GAAyB,cAAe,CAAC,QAAQ,CAAC;YAC1D,IAAI,cAAc,KAAK,gBAAa,EAAE;gBACpC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gBACxC,IAAI,uBAAU,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;oBACnC,KAAI,CAAC,GAAG,CAAc,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;iBAC1D;gBACD,OAAO,CAAC,WAAW,GAAG,KAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAI,CAAC,CAAC;aACnD;SACF;QAED,KAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,KAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,KAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,KAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;;IAC5B,CAAC;IAED,6BAAI,GAAJ,UAAK,KAAS;QACZ,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE;YACzB,IAAA,0CAAiB,CAAU;YACnC,IAAI,CAAC,eAAM,CAAC,qCAAqC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE;gBAC1F,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;aACtC;iBAAM,IAAI,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;gBACrE,IAAI,CAAC,WAAW,EAAE,CAAC;aACpB;SACF;IACH,CAAC;IAED,8BAAK,GAAL,UAAM,GAAS;QACb,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACX,IAAA,0CAAiB,CAAU;YAC3B,IAAA,6FAAqC,CAAY;YACzD,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,IAAI,CAAC,qCAAqC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE;oBACnF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;oBACpC,IAAI,CAAC,WAAW,EAAE,CAAC;iBACpB;qBAAM;oBACL,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;oBAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;iBACpB;aACF;iBAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE;gBAChD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,IAAI,qCAAqC,EAAE;oBACzC,MAAM,GAAG,CAAC;iBACX;gBACD,iCAAe,CAAC,GAAG,CAAC,CAAC;aACtB;iBAAM;gBACL,IAAI,qCAAqC,EAAE;oBACzC,iBAAiB,CAAC,cAAc,GAAG,GAAG,CAAC;oBACvC,iBAAiB,CAAC,eAAe,GAAG,IAAI,CAAC;iBAC1C;qBAAM;oBACL,iCAAe,CAAC,GAAG,CAAC,CAAC;iBACtB;gBACD,IAAI,CAAC,WAAW,EAAE,CAAC;aACpB;SACF;IACH,CAAC;IAED,iCAAQ,GAAR;QAAA,iBAiBC;QAhBC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACX,IAAA,0CAAiB,CAAU;YACnC,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,IAAM,eAAe,GAAG,cAAM,OAAA,KAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAI,CAAC,QAAQ,CAAC,EAAlC,CAAkC,CAAC;gBAEjE,IAAI,CAAC,eAAM,CAAC,qCAAqC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE;oBAC1F,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;oBACnC,IAAI,CAAC,WAAW,EAAE,CAAC;iBACpB;qBAAM;oBACL,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;oBACzD,IAAI,CAAC,WAAW,EAAE,CAAC;iBACpB;aACF;iBAAM;gBACL,IAAI,CAAC,WAAW,EAAE,CAAC;aACpB;SACF;IACH,CAAC;IAEO,qCAAY,GAApB,UAAqB,EAAY,EAAE,KAAW;QAC5C,IAAI;YACF,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;SAC/B;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,eAAM,CAAC,qCAAqC,EAAE;gBAChD,MAAM,GAAG,CAAC;aACX;iBAAM;gBACL,iCAAe,CAAC,GAAG,CAAC,CAAC;aACtB;SACF;IACH,CAAC;IAEO,wCAAe,GAAvB,UAAwB,MAAqB,EAAE,EAAY,EAAE,KAAW;QACtE,IAAI,CAAC,eAAM,CAAC,qCAAqC,EAAE;YACjD,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;SAC7B;QACD,IAAI;YACF,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;SAC/B;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,eAAM,CAAC,qCAAqC,EAAE;gBAChD,MAAM,CAAC,cAAc,GAAG,GAAG,CAAC;gBAC5B,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC9B,OAAO,IAAI,CAAC;aACb;iBAAM;gBACL,iCAAe,CAAC,GAAG,CAAC,CAAC;gBACrB,OAAO,IAAI,CAAC;aACb;SACF;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAGD,qCAAY,GAAZ;QACU,IAAA,0CAAiB,CAAU;QACnC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,iBAAiB,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC;IACH,qBAAC;AAAD,CAAC,AArID,CAAuC,UAAU,GAqIhD;AArIY,wCAAc"}
diff --git a/node_modules/rxjs/internal/Subscription.d.ts b/node_modules/rxjs/internal/Subscription.d.ts
deleted file mode 100644
index bf8ccca..0000000
--- a/node_modules/rxjs/internal/Subscription.d.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import { SubscriptionLike, TeardownLogic } from './types';
-/**
- * Represents a disposable resource, such as the execution of an Observable. A
- * Subscription has one important method, `unsubscribe`, that takes no argument
- * and just disposes the resource held by the subscription.
- *
- * Additionally, subscriptions may be grouped together through the `add()`
- * method, which will attach a child Subscription to the current Subscription.
- * When a Subscription is unsubscribed, all its children (and its grandchildren)
- * will be unsubscribed as well.
- *
- * @class Subscription
- */
-export declare class Subscription implements SubscriptionLike {
-    /** @nocollapse */
-    static EMPTY: Subscription;
-    /**
-     * A flag to indicate whether this Subscription has already been unsubscribed.
-     * @type {boolean}
-     */
-    closed: boolean;
-    /** @internal */
-    protected _parentOrParents: Subscription | Subscription[];
-    /** @internal */
-    private _subscriptions;
-    /**
-     * @param {function(): void} [unsubscribe] A function describing how to
-     * perform the disposal of resources when the `unsubscribe` method is called.
-     */
-    constructor(unsubscribe?: () => void);
-    /**
-     * Disposes the resources held by the subscription. May, for instance, cancel
-     * an ongoing Observable execution or cancel any other type of work that
-     * started when the Subscription was created.
-     * @return {void}
-     */
-    unsubscribe(): void;
-    /**
-     * Adds a tear down to be called during the unsubscribe() of this
-     * Subscription. Can also be used to add a child subscription.
-     *
-     * If the tear down being added is a subscription that is already
-     * unsubscribed, is the same reference `add` is being called on, or is
-     * `Subscription.EMPTY`, it will not be added.
-     *
-     * If this subscription is already in an `closed` state, the passed
-     * tear down logic will be executed immediately.
-     *
-     * When a parent subscription is unsubscribed, any child subscriptions that were added to it are also unsubscribed.
-     *
-     * @param {TeardownLogic} teardown The additional logic to execute on
-     * teardown.
-     * @return {Subscription} Returns the Subscription used or created to be
-     * added to the inner subscriptions list. This Subscription can be used with
-     * `remove()` to remove the passed teardown logic from the inner subscriptions
-     * list.
-     */
-    add(teardown: TeardownLogic): Subscription;
-    /**
-     * Removes a Subscription from the internal list of subscriptions that will
-     * unsubscribe during the unsubscribe process of this Subscription.
-     * @param {Subscription} subscription The subscription to remove.
-     * @return {void}
-     */
-    remove(subscription: Subscription): void;
-}
diff --git a/node_modules/rxjs/internal/Subscription.js b/node_modules/rxjs/internal/Subscription.js
deleted file mode 100644
index d2d68a5..0000000
--- a/node_modules/rxjs/internal/Subscription.js
+++ /dev/null
@@ -1,137 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("./util/isArray");
-var isObject_1 = require("./util/isObject");
-var isFunction_1 = require("./util/isFunction");
-var UnsubscriptionError_1 = require("./util/UnsubscriptionError");
-var Subscription = (function () {
-    function Subscription(unsubscribe) {
-        this.closed = false;
-        this._parentOrParents = null;
-        this._subscriptions = null;
-        if (unsubscribe) {
-            this._unsubscribe = unsubscribe;
-        }
-    }
-    Subscription.prototype.unsubscribe = function () {
-        var errors;
-        if (this.closed) {
-            return;
-        }
-        var _a = this, _parentOrParents = _a._parentOrParents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;
-        this.closed = true;
-        this._parentOrParents = null;
-        this._subscriptions = null;
-        if (_parentOrParents instanceof Subscription) {
-            _parentOrParents.remove(this);
-        }
-        else if (_parentOrParents !== null) {
-            for (var index = 0; index < _parentOrParents.length; ++index) {
-                var parent_1 = _parentOrParents[index];
-                parent_1.remove(this);
-            }
-        }
-        if (isFunction_1.isFunction(_unsubscribe)) {
-            try {
-                _unsubscribe.call(this);
-            }
-            catch (e) {
-                errors = e instanceof UnsubscriptionError_1.UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];
-            }
-        }
-        if (isArray_1.isArray(_subscriptions)) {
-            var index = -1;
-            var len = _subscriptions.length;
-            while (++index < len) {
-                var sub = _subscriptions[index];
-                if (isObject_1.isObject(sub)) {
-                    try {
-                        sub.unsubscribe();
-                    }
-                    catch (e) {
-                        errors = errors || [];
-                        if (e instanceof UnsubscriptionError_1.UnsubscriptionError) {
-                            errors = errors.concat(flattenUnsubscriptionErrors(e.errors));
-                        }
-                        else {
-                            errors.push(e);
-                        }
-                    }
-                }
-            }
-        }
-        if (errors) {
-            throw new UnsubscriptionError_1.UnsubscriptionError(errors);
-        }
-    };
-    Subscription.prototype.add = function (teardown) {
-        var subscription = teardown;
-        if (!teardown) {
-            return Subscription.EMPTY;
-        }
-        switch (typeof teardown) {
-            case 'function':
-                subscription = new Subscription(teardown);
-            case 'object':
-                if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {
-                    return subscription;
-                }
-                else if (this.closed) {
-                    subscription.unsubscribe();
-                    return subscription;
-                }
-                else if (!(subscription instanceof Subscription)) {
-                    var tmp = subscription;
-                    subscription = new Subscription();
-                    subscription._subscriptions = [tmp];
-                }
-                break;
-            default: {
-                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
-            }
-        }
-        var _parentOrParents = subscription._parentOrParents;
-        if (_parentOrParents === null) {
-            subscription._parentOrParents = this;
-        }
-        else if (_parentOrParents instanceof Subscription) {
-            if (_parentOrParents === this) {
-                return subscription;
-            }
-            subscription._parentOrParents = [_parentOrParents, this];
-        }
-        else if (_parentOrParents.indexOf(this) === -1) {
-            _parentOrParents.push(this);
-        }
-        else {
-            return subscription;
-        }
-        var subscriptions = this._subscriptions;
-        if (subscriptions === null) {
-            this._subscriptions = [subscription];
-        }
-        else {
-            subscriptions.push(subscription);
-        }
-        return subscription;
-    };
-    Subscription.prototype.remove = function (subscription) {
-        var subscriptions = this._subscriptions;
-        if (subscriptions) {
-            var subscriptionIndex = subscriptions.indexOf(subscription);
-            if (subscriptionIndex !== -1) {
-                subscriptions.splice(subscriptionIndex, 1);
-            }
-        }
-    };
-    Subscription.EMPTY = (function (empty) {
-        empty.closed = true;
-        return empty;
-    }(new Subscription()));
-    return Subscription;
-}());
-exports.Subscription = Subscription;
-function flattenUnsubscriptionErrors(errors) {
-    return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []);
-}
-//# sourceMappingURL=Subscription.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/Subscription.js.map b/node_modules/rxjs/internal/Subscription.js.map
deleted file mode 100644
index f5974c9..0000000
--- a/node_modules/rxjs/internal/Subscription.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Subscription.js","sources":["../src/internal/Subscription.ts"],"names":[],"mappings":";;AAAA,0CAAyC;AACzC,4CAA2C;AAC3C,gDAA+C;AAC/C,kEAAiE;AAejE;IAsBE,sBAAY,WAAwB;QAX7B,WAAM,GAAY,KAAK,CAAC;QAGrB,qBAAgB,GAAkC,IAAI,CAAC;QAEzD,mBAAc,GAAuB,IAAI,CAAC;QAOhD,IAAI,WAAW,EAAE;YACR,IAAK,CAAC,YAAY,GAAG,WAAW,CAAC;SACzC;IACH,CAAC;IAQD,kCAAW,GAAX;QACE,IAAI,MAAa,CAAC;QAElB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO;SACR;QAEG,IAAA,SAAiE,EAA/D,sCAAgB,EAAE,8BAAY,EAAE,kCAAc,CAAkB;QAEtE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAG7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAE3B,IAAI,gBAAgB,YAAY,YAAY,EAAE;YAC5C,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC/B;aAAM,IAAI,gBAAgB,KAAK,IAAI,EAAE;YACpC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE;gBAC5D,IAAM,QAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACvC,QAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;aACrB;SACF;QAED,IAAI,uBAAU,CAAC,YAAY,CAAC,EAAE;YAC5B,IAAI;gBACF,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACzB;YAAC,OAAO,CAAC,EAAE;gBACV,MAAM,GAAG,CAAC,YAAY,yCAAmB,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACzF;SACF;QAED,IAAI,iBAAO,CAAC,cAAc,CAAC,EAAE;YAC3B,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YACf,IAAI,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC;YAEhC,OAAO,EAAE,KAAK,GAAG,GAAG,EAAE;gBACpB,IAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;gBAClC,IAAI,mBAAQ,CAAC,GAAG,CAAC,EAAE;oBACjB,IAAI;wBACF,GAAG,CAAC,WAAW,EAAE,CAAC;qBACnB;oBAAC,OAAO,CAAC,EAAE;wBACV,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;wBACtB,IAAI,CAAC,YAAY,yCAAmB,EAAE;4BACpC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;yBAC/D;6BAAM;4BACL,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;yBAChB;qBACF;iBACF;aACF;SACF;QAED,IAAI,MAAM,EAAE;YACV,MAAM,IAAI,yCAAmB,CAAC,MAAM,CAAC,CAAC;SACvC;IACH,CAAC;IAsBD,0BAAG,GAAH,UAAI,QAAuB;QACzB,IAAI,YAAY,GAAkB,QAAS,CAAC;QAE5C,IAAI,CAAO,QAAS,EAAE;YACpB,OAAO,YAAY,CAAC,KAAK,CAAC;SAC3B;QAED,QAAQ,OAAO,QAAQ,EAAE;YACvB,KAAK,UAAU;gBACb,YAAY,GAAG,IAAI,YAAY,CAAe,QAAQ,CAAC,CAAC;YAC1D,KAAK,QAAQ;gBACX,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,MAAM,IAAI,OAAO,YAAY,CAAC,WAAW,KAAK,UAAU,EAAE;oBAElG,OAAO,YAAY,CAAC;iBACrB;qBAAM,IAAI,IAAI,CAAC,MAAM,EAAE;oBACtB,YAAY,CAAC,WAAW,EAAE,CAAC;oBAC3B,OAAO,YAAY,CAAC;iBACrB;qBAAM,IAAI,CAAC,CAAC,YAAY,YAAY,YAAY,CAAC,EAAE;oBAClD,IAAM,GAAG,GAAG,YAAY,CAAC;oBACzB,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;oBAClC,YAAY,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC;iBACrC;gBACD,MAAM;YACR,OAAO,CAAC,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,QAAQ,GAAG,yBAAyB,CAAC,CAAC;aAClF;SACF;QAGK,IAAA,gDAAgB,CAAkB;QACxC,IAAI,gBAAgB,KAAK,IAAI,EAAE;YAG7B,YAAY,CAAC,gBAAgB,GAAG,IAAI,CAAC;SACtC;aAAM,IAAI,gBAAgB,YAAY,YAAY,EAAE;YACnD,IAAI,gBAAgB,KAAK,IAAI,EAAE;gBAE7B,OAAO,YAAY,CAAC;aACrB;YAGD,YAAY,CAAC,gBAAgB,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;SAC1D;aAAM,IAAI,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YAEhD,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7B;aAAM;YAEL,OAAO,YAAY,CAAC;SACrB;QAGD,IAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,aAAa,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC,cAAc,GAAG,CAAC,YAAY,CAAC,CAAC;SACtC;aAAM;YACL,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAClC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAQD,6BAAM,GAAN,UAAO,YAA0B;QAC/B,IAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,aAAa,EAAE;YACjB,IAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC9D,IAAI,iBAAiB,KAAK,CAAC,CAAC,EAAE;gBAC5B,aAAa,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;aAC5C;SACF;IACH,CAAC;IAzLa,kBAAK,GAAiB,CAAC,UAAS,KAAU;QACtD,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC;IAuLzB,mBAAC;CAAA,AA5LD,IA4LC;AA5LY,oCAAY;AA8LzB,SAAS,2BAA2B,CAAC,MAAa;IACjD,OAAO,MAAM,CAAC,MAAM,CAAC,UAAC,IAAI,EAAE,GAAG,IAAK,OAAA,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,YAAY,yCAAmB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAApE,CAAoE,EAAE,EAAE,CAAC,CAAC;AAC/G,CAAC"}
diff --git a/node_modules/rxjs/internal/config.d.ts b/node_modules/rxjs/internal/config.d.ts
deleted file mode 100644
index 7e62207..0000000
--- a/node_modules/rxjs/internal/config.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * The global configuration object for RxJS, used to configure things
- * like what Promise contructor should used to create Promises
- */
-export declare const config: {
-    /**
-     * The promise constructor used by default for methods such as
-     * {@link toPromise} and {@link forEach}
-     */
-    Promise: PromiseConstructorLike;
-    /**
-     * If true, turns on synchronous error rethrowing, which is a deprecated behavior
-     * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe
-     * call in a try/catch block. It also enables producer interference, a nasty bug
-     * where a multicast can be broken for all observers by a downstream consumer with
-     * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BY TIME
-     * FOR MIGRATION REASONS.
-     */
-    useDeprecatedSynchronousErrorHandling: boolean;
-};
diff --git a/node_modules/rxjs/internal/config.js b/node_modules/rxjs/internal/config.js
deleted file mode 100644
index ec56be9..0000000
--- a/node_modules/rxjs/internal/config.js
+++ /dev/null
@@ -1,20 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var _enable_super_gross_mode_that_will_cause_bad_things = false;
-exports.config = {
-    Promise: undefined,
-    set useDeprecatedSynchronousErrorHandling(value) {
-        if (value) {
-            var error = new Error();
-            console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack);
-        }
-        else if (_enable_super_gross_mode_that_will_cause_bad_things) {
-            console.log('RxJS: Back to a better error behavior. Thank you. <3');
-        }
-        _enable_super_gross_mode_that_will_cause_bad_things = value;
-    },
-    get useDeprecatedSynchronousErrorHandling() {
-        return _enable_super_gross_mode_that_will_cause_bad_things;
-    },
-};
-//# sourceMappingURL=config.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/config.js.map b/node_modules/rxjs/internal/config.js.map
deleted file mode 100644
index d8f2929..0000000
--- a/node_modules/rxjs/internal/config.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"config.js","sources":["../src/internal/config.ts"],"names":[],"mappings":";;AAAA,IAAI,mDAAmD,GAAG,KAAK,CAAC;AAMnD,QAAA,MAAM,GAAG;IAKpB,OAAO,EAAE,SAAmC;IAU5C,IAAI,qCAAqC,CAAC,KAAc;QACtD,IAAI,KAAK,EAAE;YACT,IAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,+FAA+F,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;SAC7H;aAAM,IAAI,mDAAmD,EAAE;YAC9D,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;SACrE;QACD,mDAAmD,GAAG,KAAK,CAAC;IAC9D,CAAC;IAED,IAAI,qCAAqC;QACvC,OAAO,mDAAmD,CAAC;IAC7D,CAAC;CACF,CAAC"}
diff --git a/node_modules/rxjs/internal/observable/ConnectableObservable.d.ts b/node_modules/rxjs/internal/observable/ConnectableObservable.d.ts
deleted file mode 100644
index fe3a8e8..0000000
--- a/node_modules/rxjs/internal/observable/ConnectableObservable.d.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Subject } from '../Subject';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-/**
- * @class ConnectableObservable<T>
- */
-export declare class ConnectableObservable<T> extends Observable<T> {
-    source: Observable<T>;
-    protected subjectFactory: () => Subject<T>;
-    protected _subject: Subject<T>;
-    protected _refCount: number;
-    protected _connection: Subscription;
-    /** @internal */
-    _isComplete: boolean;
-    constructor(source: Observable<T>, subjectFactory: () => Subject<T>);
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _subscribe(subscriber: Subscriber<T>): Subscription;
-    protected getSubject(): Subject<T>;
-    connect(): Subscription;
-    refCount(): Observable<T>;
-}
-export declare const connectableObservableDescriptor: PropertyDescriptorMap;
diff --git a/node_modules/rxjs/internal/observable/ConnectableObservable.js b/node_modules/rxjs/internal/observable/ConnectableObservable.js
deleted file mode 100644
index 9772f58..0000000
--- a/node_modules/rxjs/internal/observable/ConnectableObservable.js
+++ /dev/null
@@ -1,155 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var Observable_1 = require("../Observable");
-var Subscriber_1 = require("../Subscriber");
-var Subscription_1 = require("../Subscription");
-var refCount_1 = require("../operators/refCount");
-var ConnectableObservable = (function (_super) {
-    __extends(ConnectableObservable, _super);
-    function ConnectableObservable(source, subjectFactory) {
-        var _this = _super.call(this) || this;
-        _this.source = source;
-        _this.subjectFactory = subjectFactory;
-        _this._refCount = 0;
-        _this._isComplete = false;
-        return _this;
-    }
-    ConnectableObservable.prototype._subscribe = function (subscriber) {
-        return this.getSubject().subscribe(subscriber);
-    };
-    ConnectableObservable.prototype.getSubject = function () {
-        var subject = this._subject;
-        if (!subject || subject.isStopped) {
-            this._subject = this.subjectFactory();
-        }
-        return this._subject;
-    };
-    ConnectableObservable.prototype.connect = function () {
-        var connection = this._connection;
-        if (!connection) {
-            this._isComplete = false;
-            connection = this._connection = new Subscription_1.Subscription();
-            connection.add(this.source
-                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
-            if (connection.closed) {
-                this._connection = null;
-                connection = Subscription_1.Subscription.EMPTY;
-            }
-        }
-        return connection;
-    };
-    ConnectableObservable.prototype.refCount = function () {
-        return refCount_1.refCount()(this);
-    };
-    return ConnectableObservable;
-}(Observable_1.Observable));
-exports.ConnectableObservable = ConnectableObservable;
-exports.connectableObservableDescriptor = (function () {
-    var connectableProto = ConnectableObservable.prototype;
-    return {
-        operator: { value: null },
-        _refCount: { value: 0, writable: true },
-        _subject: { value: null, writable: true },
-        _connection: { value: null, writable: true },
-        _subscribe: { value: connectableProto._subscribe },
-        _isComplete: { value: connectableProto._isComplete, writable: true },
-        getSubject: { value: connectableProto.getSubject },
-        connect: { value: connectableProto.connect },
-        refCount: { value: connectableProto.refCount }
-    };
-})();
-var ConnectableSubscriber = (function (_super) {
-    __extends(ConnectableSubscriber, _super);
-    function ConnectableSubscriber(destination, connectable) {
-        var _this = _super.call(this, destination) || this;
-        _this.connectable = connectable;
-        return _this;
-    }
-    ConnectableSubscriber.prototype._error = function (err) {
-        this._unsubscribe();
-        _super.prototype._error.call(this, err);
-    };
-    ConnectableSubscriber.prototype._complete = function () {
-        this.connectable._isComplete = true;
-        this._unsubscribe();
-        _super.prototype._complete.call(this);
-    };
-    ConnectableSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (connectable) {
-            this.connectable = null;
-            var connection = connectable._connection;
-            connectable._refCount = 0;
-            connectable._subject = null;
-            connectable._connection = null;
-            if (connection) {
-                connection.unsubscribe();
-            }
-        }
-    };
-    return ConnectableSubscriber;
-}(Subject_1.SubjectSubscriber));
-var RefCountOperator = (function () {
-    function RefCountOperator(connectable) {
-        this.connectable = connectable;
-    }
-    RefCountOperator.prototype.call = function (subscriber, source) {
-        var connectable = this.connectable;
-        connectable._refCount++;
-        var refCounter = new RefCountSubscriber(subscriber, connectable);
-        var subscription = source.subscribe(refCounter);
-        if (!refCounter.closed) {
-            refCounter.connection = connectable.connect();
-        }
-        return subscription;
-    };
-    return RefCountOperator;
-}());
-var RefCountSubscriber = (function (_super) {
-    __extends(RefCountSubscriber, _super);
-    function RefCountSubscriber(destination, connectable) {
-        var _this = _super.call(this, destination) || this;
-        _this.connectable = connectable;
-        return _this;
-    }
-    RefCountSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (!connectable) {
-            this.connection = null;
-            return;
-        }
-        this.connectable = null;
-        var refCount = connectable._refCount;
-        if (refCount <= 0) {
-            this.connection = null;
-            return;
-        }
-        connectable._refCount = refCount - 1;
-        if (refCount > 1) {
-            this.connection = null;
-            return;
-        }
-        var connection = this.connection;
-        var sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    };
-    return RefCountSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=ConnectableObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/ConnectableObservable.js.map b/node_modules/rxjs/internal/observable/ConnectableObservable.js.map
deleted file mode 100644
index b8b17ac..0000000
--- a/node_modules/rxjs/internal/observable/ConnectableObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ConnectableObservable.js","sources":["../../src/internal/observable/ConnectableObservable.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/observable/SubscribeOnObservable.d.ts b/node_modules/rxjs/internal/observable/SubscribeOnObservable.d.ts
deleted file mode 100644
index 0a42c0e..0000000
--- a/node_modules/rxjs/internal/observable/SubscribeOnObservable.d.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { SchedulerLike, SchedulerAction } from '../types';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { Observable } from '../Observable';
-export interface DispatchArg<T> {
-    source: Observable<T>;
-    subscriber: Subscriber<T>;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-export declare class SubscribeOnObservable<T> extends Observable<T> {
-    source: Observable<T>;
-    private delayTime;
-    private scheduler;
-    /** @nocollapse */
-    static create<T>(source: Observable<T>, delay?: number, scheduler?: SchedulerLike): Observable<T>;
-    /** @nocollapse */
-    static dispatch<T>(this: SchedulerAction<T>, arg: DispatchArg<T>): Subscription;
-    constructor(source: Observable<T>, delayTime?: number, scheduler?: SchedulerLike);
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _subscribe(subscriber: Subscriber<T>): Subscription;
-}
diff --git a/node_modules/rxjs/internal/observable/SubscribeOnObservable.js b/node_modules/rxjs/internal/observable/SubscribeOnObservable.js
deleted file mode 100644
index e79b2d2..0000000
--- a/node_modules/rxjs/internal/observable/SubscribeOnObservable.js
+++ /dev/null
@@ -1,56 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var asap_1 = require("../scheduler/asap");
-var isNumeric_1 = require("../util/isNumeric");
-var SubscribeOnObservable = (function (_super) {
-    __extends(SubscribeOnObservable, _super);
-    function SubscribeOnObservable(source, delayTime, scheduler) {
-        if (delayTime === void 0) { delayTime = 0; }
-        if (scheduler === void 0) { scheduler = asap_1.asap; }
-        var _this = _super.call(this) || this;
-        _this.source = source;
-        _this.delayTime = delayTime;
-        _this.scheduler = scheduler;
-        if (!isNumeric_1.isNumeric(delayTime) || delayTime < 0) {
-            _this.delayTime = 0;
-        }
-        if (!scheduler || typeof scheduler.schedule !== 'function') {
-            _this.scheduler = asap_1.asap;
-        }
-        return _this;
-    }
-    SubscribeOnObservable.create = function (source, delay, scheduler) {
-        if (delay === void 0) { delay = 0; }
-        if (scheduler === void 0) { scheduler = asap_1.asap; }
-        return new SubscribeOnObservable(source, delay, scheduler);
-    };
-    SubscribeOnObservable.dispatch = function (arg) {
-        var source = arg.source, subscriber = arg.subscriber;
-        return this.add(source.subscribe(subscriber));
-    };
-    SubscribeOnObservable.prototype._subscribe = function (subscriber) {
-        var delay = this.delayTime;
-        var source = this.source;
-        var scheduler = this.scheduler;
-        return scheduler.schedule(SubscribeOnObservable.dispatch, delay, {
-            source: source, subscriber: subscriber
-        });
-    };
-    return SubscribeOnObservable;
-}(Observable_1.Observable));
-exports.SubscribeOnObservable = SubscribeOnObservable;
-//# sourceMappingURL=SubscribeOnObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/SubscribeOnObservable.js.map b/node_modules/rxjs/internal/observable/SubscribeOnObservable.js.map
deleted file mode 100644
index de7d5ea..0000000
--- a/node_modules/rxjs/internal/observable/SubscribeOnObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubscribeOnObservable.js","sources":["../../src/internal/observable/SubscribeOnObservable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,4CAA2C;AAC3C,0CAAyC;AACzC,+CAA8C;AAY9C;IAA8C,yCAAa;IAYzD,+BAAmB,MAAqB,EACpB,SAAqB,EACrB,SAA+B;QAD/B,0BAAA,EAAA,aAAqB;QACrB,0BAAA,EAAA,YAA2B,WAAI;QAFnD,YAGE,iBAAO,SAOR;QAVkB,YAAM,GAAN,MAAM,CAAe;QACpB,eAAS,GAAT,SAAS,CAAY;QACrB,eAAS,GAAT,SAAS,CAAsB;QAEjD,IAAI,CAAC,qBAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE;YAC1C,KAAI,CAAC,SAAS,GAAG,CAAC,CAAC;SACpB;QACD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE;YAC1D,KAAI,CAAC,SAAS,GAAG,WAAI,CAAC;SACvB;;IACH,CAAC;IApBM,4BAAM,GAAb,UAAiB,MAAqB,EAAE,KAAiB,EAAE,SAA+B;QAAlD,sBAAA,EAAA,SAAiB;QAAE,0BAAA,EAAA,YAA2B,WAAI;QACxF,OAAO,IAAI,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAGM,8BAAQ,GAAf,UAA6C,GAAmB;QACtD,IAAA,mBAAM,EAAE,2BAAU,CAAS;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IAChD,CAAC;IAeD,0CAAU,GAAV,UAAW,UAAyB;QAClC,IAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAEjC,OAAO,SAAS,CAAC,QAAQ,CAAmB,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE;YACjF,MAAM,QAAA,EAAE,UAAU,YAAA;SACnB,CAAC,CAAC;IACL,CAAC;IACH,4BAAC;AAAD,CAAC,AAlCD,CAA8C,uBAAU,GAkCvD;AAlCY,sDAAqB"}
diff --git a/node_modules/rxjs/internal/observable/bindCallback.d.ts b/node_modules/rxjs/internal/observable/bindCallback.d.ts
deleted file mode 100644
index 39fd17f..0000000
--- a/node_modules/rxjs/internal/observable/bindCallback.d.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { SchedulerLike } from '../types';
-import { Observable } from '../Observable';
-/** @deprecated resultSelector is no longer supported, use a mapping function. */
-export declare function bindCallback(callbackFunc: Function, resultSelector: Function, scheduler?: SchedulerLike): (...args: any[]) => Observable<any>;
-export declare function bindCallback<R1, R2, R3, R4>(callbackFunc: (callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): () => Observable<any[]>;
-export declare function bindCallback<R1, R2, R3>(callbackFunc: (callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): () => Observable<[R1, R2, R3]>;
-export declare function bindCallback<R1, R2>(callbackFunc: (callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): () => Observable<[R1, R2]>;
-export declare function bindCallback<R1>(callbackFunc: (callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): () => Observable<R1>;
-export declare function bindCallback(callbackFunc: (callback: () => any) => any, scheduler?: SchedulerLike): () => Observable<void>;
-export declare function bindCallback<A1, R1, R2, R3, R4>(callbackFunc: (arg1: A1, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<any[]>;
-export declare function bindCallback<A1, R1, R2, R3>(callbackFunc: (arg1: A1, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<[R1, R2, R3]>;
-export declare function bindCallback<A1, R1, R2>(callbackFunc: (arg1: A1, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<[R1, R2]>;
-export declare function bindCallback<A1, R1>(callbackFunc: (arg1: A1, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<R1>;
-export declare function bindCallback<A1>(callbackFunc: (arg1: A1, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<void>;
-export declare function bindCallback<A1, A2, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<any[]>;
-export declare function bindCallback<A1, A2, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<[R1, R2, R3]>;
-export declare function bindCallback<A1, A2, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<[R1, R2]>;
-export declare function bindCallback<A1, A2, R1>(callbackFunc: (arg1: A1, arg2: A2, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<R1>;
-export declare function bindCallback<A1, A2>(callbackFunc: (arg1: A1, arg2: A2, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<void>;
-export declare function bindCallback<A1, A2, A3, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<any[]>;
-export declare function bindCallback<A1, A2, A3, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<[R1, R2, R3]>;
-export declare function bindCallback<A1, A2, A3, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<[R1, R2]>;
-export declare function bindCallback<A1, A2, A3, R1>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<R1>;
-export declare function bindCallback<A1, A2, A3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<void>;
-export declare function bindCallback<A1, A2, A3, A4, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<any[]>;
-export declare function bindCallback<A1, A2, A3, A4, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<[R1, R2, R3]>;
-export declare function bindCallback<A1, A2, A3, A4, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<[R1, R2]>;
-export declare function bindCallback<A1, A2, A3, A4, R1>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<R1>;
-export declare function bindCallback<A1, A2, A3, A4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<void>;
-export declare function bindCallback<A1, A2, A3, A4, A5, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<any[]>;
-export declare function bindCallback<A1, A2, A3, A4, A5, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<[R1, R2, R3]>;
-export declare function bindCallback<A1, A2, A3, A4, A5, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<[R1, R2]>;
-export declare function bindCallback<A1, A2, A3, A4, A5, R1>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<R1>;
-export declare function bindCallback<A1, A2, A3, A4, A5>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<void>;
-export declare function bindCallback<A, R>(callbackFunc: (...args: Array<A | ((result: R) => any)>) => any, scheduler?: SchedulerLike): (...args: A[]) => Observable<R>;
-export declare function bindCallback<A, R>(callbackFunc: (...args: Array<A | ((...results: R[]) => any)>) => any, scheduler?: SchedulerLike): (...args: A[]) => Observable<R[]>;
-export declare function bindCallback(callbackFunc: Function, scheduler?: SchedulerLike): (...args: any[]) => Observable<any>;
diff --git a/node_modules/rxjs/internal/observable/bindCallback.js b/node_modules/rxjs/internal/observable/bindCallback.js
deleted file mode 100644
index ac6efeb..0000000
--- a/node_modules/rxjs/internal/observable/bindCallback.js
+++ /dev/null
@@ -1,107 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var AsyncSubject_1 = require("../AsyncSubject");
-var map_1 = require("../operators/map");
-var canReportError_1 = require("../util/canReportError");
-var isArray_1 = require("../util/isArray");
-var isScheduler_1 = require("../util/isScheduler");
-function bindCallback(callbackFunc, resultSelector, scheduler) {
-    if (resultSelector) {
-        if (isScheduler_1.isScheduler(resultSelector)) {
-            scheduler = resultSelector;
-        }
-        else {
-            return function () {
-                var args = [];
-                for (var _i = 0; _i < arguments.length; _i++) {
-                    args[_i] = arguments[_i];
-                }
-                return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-            };
-        }
-    }
-    return function () {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        var context = this;
-        var subject;
-        var params = {
-            context: context,
-            subject: subject,
-            callbackFunc: callbackFunc,
-            scheduler: scheduler,
-        };
-        return new Observable_1.Observable(function (subscriber) {
-            if (!scheduler) {
-                if (!subject) {
-                    subject = new AsyncSubject_1.AsyncSubject();
-                    var handler = function () {
-                        var innerArgs = [];
-                        for (var _i = 0; _i < arguments.length; _i++) {
-                            innerArgs[_i] = arguments[_i];
-                        }
-                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-                        subject.complete();
-                    };
-                    try {
-                        callbackFunc.apply(context, args.concat([handler]));
-                    }
-                    catch (err) {
-                        if (canReportError_1.canReportError(subject)) {
-                            subject.error(err);
-                        }
-                        else {
-                            console.warn(err);
-                        }
-                    }
-                }
-                return subject.subscribe(subscriber);
-            }
-            else {
-                var state = {
-                    args: args, subscriber: subscriber, params: params,
-                };
-                return scheduler.schedule(dispatch, 0, state);
-            }
-        });
-    };
-}
-exports.bindCallback = bindCallback;
-function dispatch(state) {
-    var _this = this;
-    var self = this;
-    var args = state.args, subscriber = state.subscriber, params = state.params;
-    var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler;
-    var subject = params.subject;
-    if (!subject) {
-        subject = params.subject = new AsyncSubject_1.AsyncSubject();
-        var handler = function () {
-            var innerArgs = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                innerArgs[_i] = arguments[_i];
-            }
-            var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-            _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
-        };
-        try {
-            callbackFunc.apply(context, args.concat([handler]));
-        }
-        catch (err) {
-            subject.error(err);
-        }
-    }
-    this.add(subject.subscribe(subscriber));
-}
-function dispatchNext(state) {
-    var value = state.value, subject = state.subject;
-    subject.next(value);
-    subject.complete();
-}
-function dispatchError(state) {
-    var err = state.err, subject = state.subject;
-    subject.error(err);
-}
-//# sourceMappingURL=bindCallback.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/bindCallback.js.map b/node_modules/rxjs/internal/observable/bindCallback.js.map
deleted file mode 100644
index 52b31da..0000000
--- a/node_modules/rxjs/internal/observable/bindCallback.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bindCallback.js","sources":["../../src/internal/observable/bindCallback.ts"],"names":[],"mappings":";;AACA,4CAA2C;AAC3C,gDAA+C;AAE/C,wCAAuC;AACvC,yDAAwD;AACxD,2CAA0C;AAC1C,mDAAkD;AA4KlD,SAAgB,YAAY,CAC1B,YAAsB,EACtB,cAAuC,EACvC,SAAyB;IAEzB,IAAI,cAAc,EAAE;QAClB,IAAI,yBAAW,CAAC,cAAc,CAAC,EAAE;YAC/B,SAAS,GAAG,cAAc,CAAC;SAC5B;aAAM;YAEL,OAAO;gBAAC,cAAc;qBAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;oBAAd,yBAAc;;gBAAK,OAAA,YAAY,CAAC,YAAY,EAAE,SAAS,CAAC,eAAI,IAAI,EAAE,IAAI,CAC5E,SAAG,CAAC,UAAC,IAAI,IAAK,OAAA,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,eAAI,IAAI,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EAA9D,CAA8D,CAAC,CAC9E;YAF0B,CAE1B,CAAC;SACH;KACF;IAED,OAAO;QAAqB,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QACxC,IAAM,OAAO,GAAG,IAAI,CAAC;QACrB,IAAI,OAAwB,CAAC;QAC7B,IAAM,MAAM,GAAG;YACb,OAAO,SAAA;YACP,OAAO,SAAA;YACP,YAAY,cAAA;YACZ,SAAS,WAAA;SACV,CAAC;QACF,OAAO,IAAI,uBAAU,CAAI,UAAA,UAAU;YACjC,IAAI,CAAC,SAAS,EAAE;gBACd,IAAI,CAAC,OAAO,EAAE;oBACZ,OAAO,GAAG,IAAI,2BAAY,EAAK,CAAC;oBAChC,IAAM,OAAO,GAAG;wBAAC,mBAAmB;6BAAnB,UAAmB,EAAnB,qBAAmB,EAAnB,IAAmB;4BAAnB,8BAAmB;;wBAClC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;wBAC/D,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACrB,CAAC,CAAC;oBAEF,IAAI;wBACF,YAAY,CAAC,KAAK,CAAC,OAAO,EAAM,IAAI,SAAE,OAAO,GAAE,CAAC;qBACjD;oBAAC,OAAO,GAAG,EAAE;wBACZ,IAAI,+BAAc,CAAC,OAAO,CAAC,EAAE;4BAC3B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;yBACpB;6BAAM;4BACL,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;yBACnB;qBACF;iBACF;gBACD,OAAO,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;aACtC;iBAAM;gBACL,IAAM,KAAK,GAAqB;oBAC9B,IAAI,MAAA,EAAE,UAAU,YAAA,EAAE,MAAM,QAAA;iBACzB,CAAC;gBACF,OAAO,SAAS,CAAC,QAAQ,CAAmB,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;aACjE;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AArDD,oCAqDC;AAeD,SAAS,QAAQ,CAA6C,KAAuB;IAArF,iBAqBC;IApBC,IAAM,IAAI,GAAG,IAAI,CAAC;IACV,IAAA,iBAAI,EAAE,6BAAU,EAAE,qBAAM,CAAW;IACnC,IAAA,kCAAY,EAAE,wBAAO,EAAE,4BAAS,CAAY;IAC9C,IAAA,wBAAO,CAAY;IACzB,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,2BAAY,EAAK,CAAC;QAEjD,IAAM,OAAO,GAAG;YAAC,mBAAmB;iBAAnB,UAAmB,EAAnB,qBAAmB,EAAnB,IAAmB;gBAAnB,8BAAmB;;YAClC,IAAM,KAAK,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/D,KAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAe,YAAY,EAAE,CAAC,EAAE,EAAE,KAAK,OAAA,EAAE,OAAO,SAAA,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC,CAAC;QAEF,IAAI;YACF,YAAY,CAAC,KAAK,CAAC,OAAO,EAAM,IAAI,SAAE,OAAO,GAAE,CAAC;SACjD;QAAC,OAAO,GAAG,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACpB;KACF;IAED,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;AAC1C,CAAC;AAOD,SAAS,YAAY,CAAyC,KAAmB;IACvE,IAAA,mBAAK,EAAE,uBAAO,CAAW;IACjC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,OAAO,CAAC,QAAQ,EAAE,CAAC;AACrB,CAAC;AAOD,SAAS,aAAa,CAA0C,KAAoB;IAC1E,IAAA,eAAG,EAAE,uBAAO,CAAW;IAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
diff --git a/node_modules/rxjs/internal/observable/bindNodeCallback.d.ts b/node_modules/rxjs/internal/observable/bindNodeCallback.d.ts
deleted file mode 100644
index 5a2f62b..0000000
--- a/node_modules/rxjs/internal/observable/bindNodeCallback.d.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-/** @deprecated resultSelector is deprecated, pipe to map instead */
-export declare function bindNodeCallback(callbackFunc: Function, resultSelector: Function, scheduler?: SchedulerLike): (...args: any[]) => Observable<any>;
-export declare function bindNodeCallback<R1, R2, R3, R4>(callbackFunc: (callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-export declare function bindNodeCallback<R1, R2, R3>(callbackFunc: (callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): () => Observable<[R1, R2, R3]>;
-export declare function bindNodeCallback<R1, R2>(callbackFunc: (callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): () => Observable<[R1, R2]>;
-export declare function bindNodeCallback<R1>(callbackFunc: (callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): () => Observable<R1>;
-export declare function bindNodeCallback(callbackFunc: (callback: (err: any) => any) => any, scheduler?: SchedulerLike): () => Observable<void>;
-export declare function bindNodeCallback<A1, R1, R2, R3, R4>(callbackFunc: (arg1: A1, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-export declare function bindNodeCallback<A1, R1, R2, R3>(callbackFunc: (arg1: A1, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<[R1, R2, R3]>;
-export declare function bindNodeCallback<A1, R1, R2>(callbackFunc: (arg1: A1, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<[R1, R2]>;
-export declare function bindNodeCallback<A1, R1>(callbackFunc: (arg1: A1, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<R1>;
-export declare function bindNodeCallback<A1>(callbackFunc: (arg1: A1, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<void>;
-export declare function bindNodeCallback<A1, A2, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-export declare function bindNodeCallback<A1, A2, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<[R1, R2, R3]>;
-export declare function bindNodeCallback<A1, A2, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<[R1, R2]>;
-export declare function bindNodeCallback<A1, A2, R1>(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<R1>;
-export declare function bindNodeCallback<A1, A2>(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<void>;
-export declare function bindNodeCallback<A1, A2, A3, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-export declare function bindNodeCallback<A1, A2, A3, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<[R1, R2, R3]>;
-export declare function bindNodeCallback<A1, A2, A3, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<[R1, R2]>;
-export declare function bindNodeCallback<A1, A2, A3, R1>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<R1>;
-export declare function bindNodeCallback<A1, A2, A3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<void>;
-export declare function bindNodeCallback<A1, A2, A3, A4, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-export declare function bindNodeCallback<A1, A2, A3, A4, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<[R1, R2, R3]>;
-export declare function bindNodeCallback<A1, A2, A3, A4, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<[R1, R2]>;
-export declare function bindNodeCallback<A1, A2, A3, A4, R1>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<R1>;
-export declare function bindNodeCallback<A1, A2, A3, A4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<void>;
-export declare function bindNodeCallback<A1, A2, A3, A4, A5, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-export declare function bindNodeCallback<A1, A2, A3, A4, A5, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<[R1, R2, R3]>;
-export declare function bindNodeCallback<A1, A2, A3, A4, A5, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<[R1, R2]>;
-export declare function bindNodeCallback<A1, A2, A3, A4, A5, R1>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<R1>;
-export declare function bindNodeCallback<A1, A2, A3, A4, A5>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<void>;
-export declare function bindNodeCallback(callbackFunc: Function, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
diff --git a/node_modules/rxjs/internal/observable/bindNodeCallback.js b/node_modules/rxjs/internal/observable/bindNodeCallback.js
deleted file mode 100644
index 135bbd2..0000000
--- a/node_modules/rxjs/internal/observable/bindNodeCallback.js
+++ /dev/null
@@ -1,115 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var AsyncSubject_1 = require("../AsyncSubject");
-var map_1 = require("../operators/map");
-var canReportError_1 = require("../util/canReportError");
-var isScheduler_1 = require("../util/isScheduler");
-var isArray_1 = require("../util/isArray");
-function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
-    if (resultSelector) {
-        if (isScheduler_1.isScheduler(resultSelector)) {
-            scheduler = resultSelector;
-        }
-        else {
-            return function () {
-                var args = [];
-                for (var _i = 0; _i < arguments.length; _i++) {
-                    args[_i] = arguments[_i];
-                }
-                return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-            };
-        }
-    }
-    return function () {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        var params = {
-            subject: undefined,
-            args: args,
-            callbackFunc: callbackFunc,
-            scheduler: scheduler,
-            context: this,
-        };
-        return new Observable_1.Observable(function (subscriber) {
-            var context = params.context;
-            var subject = params.subject;
-            if (!scheduler) {
-                if (!subject) {
-                    subject = params.subject = new AsyncSubject_1.AsyncSubject();
-                    var handler = function () {
-                        var innerArgs = [];
-                        for (var _i = 0; _i < arguments.length; _i++) {
-                            innerArgs[_i] = arguments[_i];
-                        }
-                        var err = innerArgs.shift();
-                        if (err) {
-                            subject.error(err);
-                            return;
-                        }
-                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-                        subject.complete();
-                    };
-                    try {
-                        callbackFunc.apply(context, args.concat([handler]));
-                    }
-                    catch (err) {
-                        if (canReportError_1.canReportError(subject)) {
-                            subject.error(err);
-                        }
-                        else {
-                            console.warn(err);
-                        }
-                    }
-                }
-                return subject.subscribe(subscriber);
-            }
-            else {
-                return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context });
-            }
-        });
-    };
-}
-exports.bindNodeCallback = bindNodeCallback;
-function dispatch(state) {
-    var _this = this;
-    var params = state.params, subscriber = state.subscriber, context = state.context;
-    var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler;
-    var subject = params.subject;
-    if (!subject) {
-        subject = params.subject = new AsyncSubject_1.AsyncSubject();
-        var handler = function () {
-            var innerArgs = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                innerArgs[_i] = arguments[_i];
-            }
-            var err = innerArgs.shift();
-            if (err) {
-                _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
-            }
-            else {
-                var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-                _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
-            }
-        };
-        try {
-            callbackFunc.apply(context, args.concat([handler]));
-        }
-        catch (err) {
-            this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
-        }
-    }
-    this.add(subject.subscribe(subscriber));
-}
-function dispatchNext(arg) {
-    var value = arg.value, subject = arg.subject;
-    subject.next(value);
-    subject.complete();
-}
-function dispatchError(arg) {
-    var err = arg.err, subject = arg.subject;
-    subject.error(err);
-}
-//# sourceMappingURL=bindNodeCallback.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/bindNodeCallback.js.map b/node_modules/rxjs/internal/observable/bindNodeCallback.js.map
deleted file mode 100644
index 025fdc5..0000000
--- a/node_modules/rxjs/internal/observable/bindNodeCallback.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bindNodeCallback.js","sources":["../../src/internal/observable/bindNodeCallback.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/observable/combineLatest.d.ts b/node_modules/rxjs/internal/observable/combineLatest.d.ts
deleted file mode 100644
index e17d8df..0000000
--- a/node_modules/rxjs/internal/observable/combineLatest.d.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput, SchedulerLike, ObservedValueOf } from '../types';
-import { Subscriber } from '../Subscriber';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { Operator } from '../Operator';
-import { InnerSubscriber } from '../InnerSubscriber';
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, R>(sources: [O1], resultSelector: (v1: ObservedValueOf<O1>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, R>(sources: [O1, O2], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, R>(sources: [O1, O2, O3], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, R>(sources: [O1, O2, O3, O4], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, R>(sources: [O1, O2, O3, O4, O5], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>, R>(sources: [O1, O2, O3, O4, O5, O6], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>, v6: ObservedValueOf<O6>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O extends ObservableInput<any>, R>(sources: O[], resultSelector: (...args: ObservedValueOf<O>[]) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, R>(v1: O1, resultSelector: (v1: ObservedValueOf<O1>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, R>(v1: O1, v2: O2, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>, v6: ObservedValueOf<O6>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export declare function combineLatest<O1 extends ObservableInput<any>>(sources: [O1], scheduler: SchedulerLike): Observable<[ObservedValueOf<O1>]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(sources: [O1, O2], scheduler: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(sources: [O1, O2, O3], scheduler: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(sources: [O1, O2, O3, O4], scheduler: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(sources: [O1, O2, O3, O4, O5], scheduler: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(sources: [O1, O2, O3, O4, O5, O6], scheduler: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>, ObservedValueOf<O6>]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export declare function combineLatest<O extends ObservableInput<any>>(sources: O[], scheduler: SchedulerLike): Observable<ObservedValueOf<O>[]>;
-export declare function combineLatest<O1 extends ObservableInput<any>>(sources: [O1]): Observable<[ObservedValueOf<O1>]>;
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(sources: [O1, O2]): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>]>;
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(sources: [O1, O2, O3]): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>]>;
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(sources: [O1, O2, O3, O4]): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>]>;
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(sources: [O1, O2, O3, O4, O5]): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>]>;
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(sources: [O1, O2, O3, O4, O5, O6]): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>, ObservedValueOf<O6>]>;
-export declare function combineLatest<O extends ObservableInput<any>>(sources: O[]): Observable<ObservedValueOf<O>[]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export declare function combineLatest<O1 extends ObservableInput<any>>(v1: O1, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(v1: O1, v2: O2, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export declare function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>, ObservedValueOf<O6>]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export declare function combineLatest<O extends ObservableInput<any>>(...observables: O[]): Observable<any[]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export declare function combineLatest<O extends ObservableInput<any>, R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function combineLatest<O extends ObservableInput<any>, R>(array: O[], resultSelector: (...values: ObservedValueOf<O>[]) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export declare function combineLatest<O extends ObservableInput<any>>(...observables: Array<O | SchedulerLike>): Observable<any[]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export declare function combineLatest<O extends ObservableInput<any>, R>(...observables: Array<O | ((...values: ObservedValueOf<O>[]) => R) | SchedulerLike>): Observable<R>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export declare function combineLatest<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R) | SchedulerLike>): Observable<R>;
-export declare class CombineLatestOperator<T, R> implements Operator<T, R> {
-    private resultSelector?;
-    constructor(resultSelector?: (...values: Array<any>) => R);
-    call(subscriber: Subscriber<R>, source: any): any;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class CombineLatestSubscriber<T, R> extends OuterSubscriber<T, R> {
-    private resultSelector?;
-    private active;
-    private values;
-    private observables;
-    private toRespond;
-    constructor(destination: Subscriber<R>, resultSelector?: (...values: Array<any>) => R);
-    protected _next(observable: any): void;
-    protected _complete(): void;
-    notifyComplete(unused: Subscriber<R>): void;
-    notifyNext(outerValue: T, innerValue: R, outerIndex: number, innerIndex: number, innerSub: InnerSubscriber<T, R>): void;
-    private _tryResultSelector;
-}
diff --git a/node_modules/rxjs/internal/observable/combineLatest.js b/node_modules/rxjs/internal/observable/combineLatest.js
deleted file mode 100644
index 2308236..0000000
--- a/node_modules/rxjs/internal/observable/combineLatest.js
+++ /dev/null
@@ -1,115 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var isScheduler_1 = require("../util/isScheduler");
-var isArray_1 = require("../util/isArray");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var fromArray_1 = require("./fromArray");
-var NONE = {};
-function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var resultSelector = null;
-    var scheduler = null;
-    if (isScheduler_1.isScheduler(observables[observables.length - 1])) {
-        scheduler = observables.pop();
-    }
-    if (typeof observables[observables.length - 1] === 'function') {
-        resultSelector = observables.pop();
-    }
-    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-        observables = observables[0];
-    }
-    return fromArray_1.fromArray(observables, scheduler).lift(new CombineLatestOperator(resultSelector));
-}
-exports.combineLatest = combineLatest;
-var CombineLatestOperator = (function () {
-    function CombineLatestOperator(resultSelector) {
-        this.resultSelector = resultSelector;
-    }
-    CombineLatestOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));
-    };
-    return CombineLatestOperator;
-}());
-exports.CombineLatestOperator = CombineLatestOperator;
-var CombineLatestSubscriber = (function (_super) {
-    __extends(CombineLatestSubscriber, _super);
-    function CombineLatestSubscriber(destination, resultSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.resultSelector = resultSelector;
-        _this.active = 0;
-        _this.values = [];
-        _this.observables = [];
-        return _this;
-    }
-    CombineLatestSubscriber.prototype._next = function (observable) {
-        this.values.push(NONE);
-        this.observables.push(observable);
-    };
-    CombineLatestSubscriber.prototype._complete = function () {
-        var observables = this.observables;
-        var len = observables.length;
-        if (len === 0) {
-            this.destination.complete();
-        }
-        else {
-            this.active = len;
-            this.toRespond = len;
-            for (var i = 0; i < len; i++) {
-                var observable = observables[i];
-                this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));
-            }
-        }
-    };
-    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {
-        if ((this.active -= 1) === 0) {
-            this.destination.complete();
-        }
-    };
-    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var values = this.values;
-        var oldVal = values[outerIndex];
-        var toRespond = !this.toRespond
-            ? 0
-            : oldVal === NONE ? --this.toRespond : this.toRespond;
-        values[outerIndex] = innerValue;
-        if (toRespond === 0) {
-            if (this.resultSelector) {
-                this._tryResultSelector(values);
-            }
-            else {
-                this.destination.next(values.slice());
-            }
-        }
-    };
-    CombineLatestSubscriber.prototype._tryResultSelector = function (values) {
-        var result;
-        try {
-            result = this.resultSelector.apply(this, values);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return CombineLatestSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.CombineLatestSubscriber = CombineLatestSubscriber;
-//# sourceMappingURL=combineLatest.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/combineLatest.js.map b/node_modules/rxjs/internal/observable/combineLatest.js.map
deleted file mode 100644
index 3d2d9da..0000000
--- a/node_modules/rxjs/internal/observable/combineLatest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineLatest.js","sources":["../../src/internal/observable/combineLatest.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/observable/concat.d.ts b/node_modules/rxjs/internal/observable/concat.d.ts
deleted file mode 100644
index c547774..0000000
--- a/node_modules/rxjs/internal/observable/concat.d.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput, SchedulerLike, ObservedValueOf } from '../types';
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export declare function concat<O1 extends ObservableInput<any>>(v1: O1, scheduler: SchedulerLike): Observable<ObservedValueOf<O1>>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export declare function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(v1: O1, v2: O2, scheduler: SchedulerLike): Observable<ObservedValueOf<O1> | ObservedValueOf<O2>>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export declare function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, scheduler: SchedulerLike): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3>>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export declare function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, scheduler: SchedulerLike): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3> | ObservedValueOf<O4>>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export declare function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, scheduler: SchedulerLike): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3> | ObservedValueOf<O4> | ObservedValueOf<O5>>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export declare function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, scheduler: SchedulerLike): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3> | ObservedValueOf<O4> | ObservedValueOf<O5> | ObservedValueOf<O6>>;
-export declare function concat<O1 extends ObservableInput<any>>(v1: O1): Observable<ObservedValueOf<O1>>;
-export declare function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(v1: O1, v2: O2): Observable<ObservedValueOf<O1> | ObservedValueOf<O2>>;
-export declare function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3>>;
-export declare function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3> | ObservedValueOf<O4>>;
-export declare function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3> | ObservedValueOf<O4> | ObservedValueOf<O5>>;
-export declare function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3> | ObservedValueOf<O4> | ObservedValueOf<O5> | ObservedValueOf<O6>>;
-export declare function concat<O extends ObservableInput<any>>(...observables: O[]): Observable<ObservedValueOf<O>>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export declare function concat<O extends ObservableInput<any>>(...observables: (O | SchedulerLike)[]): Observable<ObservedValueOf<O>>;
-export declare function concat<R>(...observables: ObservableInput<any>[]): Observable<R>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export declare function concat<R>(...observables: (ObservableInput<any> | SchedulerLike)[]): Observable<R>;
diff --git a/node_modules/rxjs/internal/observable/concat.js b/node_modules/rxjs/internal/observable/concat.js
deleted file mode 100644
index 2f1061b..0000000
--- a/node_modules/rxjs/internal/observable/concat.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var of_1 = require("./of");
-var concatAll_1 = require("../operators/concatAll");
-function concat() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return concatAll_1.concatAll()(of_1.of.apply(void 0, observables));
-}
-exports.concat = concat;
-//# sourceMappingURL=concat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/concat.js.map b/node_modules/rxjs/internal/observable/concat.js.map
deleted file mode 100644
index 4337db2..0000000
--- a/node_modules/rxjs/internal/observable/concat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concat.js","sources":["../../src/internal/observable/concat.ts"],"names":[],"mappings":";;AAGA,2BAA0B;AAE1B,oDAAmD;AA2InD,SAAgB,MAAM;IAAoC,qBAAwC;SAAxC,UAAwC,EAAxC,qBAAwC,EAAxC,IAAwC;QAAxC,gCAAwC;;IAChG,OAAO,qBAAS,EAAK,CAAC,OAAE,eAAI,WAAW,EAAE,CAAC;AAC5C,CAAC;AAFD,wBAEC"}
diff --git a/node_modules/rxjs/internal/observable/defer.d.ts b/node_modules/rxjs/internal/observable/defer.d.ts
deleted file mode 100644
index 67ca07e..0000000
--- a/node_modules/rxjs/internal/observable/defer.d.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservedValueOf, ObservableInput } from '../types';
-/**
- * Creates an Observable that, on subscribe, calls an Observable factory to
- * make an Observable for each new Observer.
- *
- * <span class="informal">Creates the Observable lazily, that is, only when it
- * is subscribed.
- * </span>
- *
- * ![](defer.png)
- *
- * `defer` allows you to create the Observable only when the Observer
- * subscribes, and create a fresh Observable for each Observer. It waits until
- * an Observer subscribes to it, and then it generates an Observable,
- * typically with an Observable factory function. It does this afresh for each
- * subscriber, so although each subscriber may think it is subscribing to the
- * same Observable, in fact each subscriber gets its own individual
- * Observable.
- *
- * ## Example
- * ### Subscribe to either an Observable of clicks or an Observable of interval, at random
- * ```ts
- * import { defer, fromEvent, interval } from 'rxjs';
- *
- * const clicksOrInterval = defer(function () {
- *   return Math.random() > 0.5
- *     ? fromEvent(document, 'click')
- *     : interval(1000);
- * });
- * clicksOrInterval.subscribe(x => console.log(x));
- *
- * // Results in the following behavior:
- * // If the result of Math.random() is greater than 0.5 it will listen
- * // for clicks anywhere on the "document"; when document is clicked it
- * // will log a MouseEvent object to the console. If the result is less
- * // than 0.5 it will emit ascending numbers, one every second(1000ms).
- * ```
- *
- * @see {@link Observable}
- *
- * @param {function(): SubscribableOrPromise} observableFactory The Observable
- * factory function to invoke for each Observer that subscribes to the output
- * Observable. May also return a Promise, which will be converted on the fly
- * to an Observable.
- * @return {Observable} An Observable whose Observers' subscriptions trigger
- * an invocation of the given Observable factory function.
- * @static true
- * @name defer
- * @owner Observable
- */
-export declare function defer<R extends ObservableInput<any> | void>(observableFactory: () => R): Observable<ObservedValueOf<R>>;
diff --git a/node_modules/rxjs/internal/observable/defer.js b/node_modules/rxjs/internal/observable/defer.js
deleted file mode 100644
index 7278515..0000000
--- a/node_modules/rxjs/internal/observable/defer.js
+++ /dev/null
@@ -1,21 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var from_1 = require("./from");
-var empty_1 = require("./empty");
-function defer(observableFactory) {
-    return new Observable_1.Observable(function (subscriber) {
-        var input;
-        try {
-            input = observableFactory();
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        var source = input ? from_1.from(input) : empty_1.empty();
-        return source.subscribe(subscriber);
-    });
-}
-exports.defer = defer;
-//# sourceMappingURL=defer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/defer.js.map b/node_modules/rxjs/internal/observable/defer.js.map
deleted file mode 100644
index 8a635af..0000000
--- a/node_modules/rxjs/internal/observable/defer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"defer.js","sources":["../../src/internal/observable/defer.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAE3C,+BAA8B;AAC9B,iCAAgC;AAmDhC,SAAgB,KAAK,CAAwC,iBAA0B;IACrF,OAAO,IAAI,uBAAU,CAAqB,UAAA,UAAU;QAClD,IAAI,KAAe,CAAC;QACpB,IAAI;YACF,KAAK,GAAG,iBAAiB,EAAE,CAAC;SAC7B;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QACD,IAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,WAAI,CAAC,KAA4C,CAAC,CAAC,CAAC,CAAC,aAAK,EAAE,CAAC;QACpF,OAAO,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAZD,sBAYC"}
diff --git a/node_modules/rxjs/internal/observable/dom/AjaxObservable.d.ts b/node_modules/rxjs/internal/observable/dom/AjaxObservable.d.ts
deleted file mode 100644
index a88eda7..0000000
--- a/node_modules/rxjs/internal/observable/dom/AjaxObservable.d.ts
+++ /dev/null
@@ -1,151 +0,0 @@
-import { Observable } from '../../Observable';
-import { Subscriber } from '../../Subscriber';
-import { TeardownLogic } from '../../types';
-export interface AjaxRequest {
-    url?: string;
-    body?: any;
-    user?: string;
-    async?: boolean;
-    method?: string;
-    headers?: Object;
-    timeout?: number;
-    password?: string;
-    hasContent?: boolean;
-    crossDomain?: boolean;
-    withCredentials?: boolean;
-    createXHR?: () => XMLHttpRequest;
-    progressSubscriber?: Subscriber<any>;
-    responseType?: string;
-}
-export interface AjaxCreationMethod {
-    (urlOrRequest: string | AjaxRequest): Observable<AjaxResponse>;
-    get(url: string, headers?: Object): Observable<AjaxResponse>;
-    post(url: string, body?: any, headers?: Object): Observable<AjaxResponse>;
-    put(url: string, body?: any, headers?: Object): Observable<AjaxResponse>;
-    patch(url: string, body?: any, headers?: Object): Observable<AjaxResponse>;
-    delete(url: string, headers?: Object): Observable<AjaxResponse>;
-    getJSON<T>(url: string, headers?: Object): Observable<T>;
-}
-export declare function ajaxGet(url: string, headers?: Object): AjaxObservable<AjaxResponse>;
-export declare function ajaxPost(url: string, body?: any, headers?: Object): Observable<AjaxResponse>;
-export declare function ajaxDelete(url: string, headers?: Object): Observable<AjaxResponse>;
-export declare function ajaxPut(url: string, body?: any, headers?: Object): Observable<AjaxResponse>;
-export declare function ajaxPatch(url: string, body?: any, headers?: Object): Observable<AjaxResponse>;
-export declare function ajaxGetJSON<T>(url: string, headers?: Object): Observable<T>;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-export declare class AjaxObservable<T> extends Observable<T> {
-    /**
-     * Creates an observable for an Ajax request with either a request object with
-     * url, headers, etc or a string for a URL.
-     *
-     * ## Example
-     * ```ts
-     * import { ajax } from 'rxjs/ajax';
-   *
-     * const source1 = ajax('/products');
-     * const source2 = ajax({ url: 'products', method: 'GET' });
-     * ```
-     *
-     * @param {string|Object} request Can be one of the following:
-     *   A string of the URL to make the Ajax call.
-     *   An object with the following properties
-     *   - url: URL of the request
-     *   - body: The body of the request
-     *   - method: Method of the request, such as GET, POST, PUT, PATCH, DELETE
-     *   - async: Whether the request is async
-     *   - headers: Optional headers
-     *   - crossDomain: true if a cross domain request, else false
-     *   - createXHR: a function to override if you need to use an alternate
-     *   XMLHttpRequest implementation.
-     *   - resultSelector: a function to use to alter the output value type of
-     *   the Observable. Gets {@link AjaxResponse} as an argument.
-     * @return {Observable} An observable sequence containing the XMLHttpRequest.
-     * @static true
-     * @name ajax
-     * @owner Observable
-     * @nocollapse
-    */
-    static create: AjaxCreationMethod;
-    private request;
-    constructor(urlOrRequest: string | AjaxRequest);
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _subscribe(subscriber: Subscriber<T>): TeardownLogic;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class AjaxSubscriber<T> extends Subscriber<Event> {
-    request: AjaxRequest;
-    private xhr;
-    private done;
-    constructor(destination: Subscriber<T>, request: AjaxRequest);
-    next(e: Event): void;
-    private send;
-    private serializeBody;
-    private setHeaders;
-    private getHeader;
-    private setupEvents;
-    unsubscribe(): void;
-}
-/**
- * A normalized AJAX response.
- *
- * @see {@link ajax}
- *
- * @class AjaxResponse
- */
-export declare class AjaxResponse {
-    originalEvent: Event;
-    xhr: XMLHttpRequest;
-    request: AjaxRequest;
-    /** @type {number} The HTTP status code */
-    status: number;
-    /** @type {string|ArrayBuffer|Document|object|any} The response data */
-    response: any;
-    /** @type {string} The raw responseText */
-    responseText: string;
-    /** @type {string} The responseType (e.g. 'json', 'arraybuffer', or 'xml') */
-    responseType: string;
-    constructor(originalEvent: Event, xhr: XMLHttpRequest, request: AjaxRequest);
-}
-export declare type AjaxErrorNames = 'AjaxError' | 'AjaxTimeoutError';
-/**
- * A normalized AJAX error.
- *
- * @see {@link ajax}
- *
- * @class AjaxError
- */
-export interface AjaxError extends Error {
-    /** @type {XMLHttpRequest} The XHR instance associated with the error */
-    xhr: XMLHttpRequest;
-    /** @type {AjaxRequest} The AjaxRequest associated with the error */
-    request: AjaxRequest;
-    /** @type {number} The HTTP status code */
-    status: number;
-    /** @type {string} The responseType (e.g. 'json', 'arraybuffer', or 'xml') */
-    responseType: string;
-    /** @type {string|ArrayBuffer|Document|object|any} The response data */
-    response: any;
-}
-export interface AjaxErrorCtor {
-    new (message: string, xhr: XMLHttpRequest, request: AjaxRequest): AjaxError;
-}
-export declare const AjaxError: AjaxErrorCtor;
-export interface AjaxTimeoutError extends AjaxError {
-}
-export interface AjaxTimeoutErrorCtor {
-    new (xhr: XMLHttpRequest, request: AjaxRequest): AjaxTimeoutError;
-}
-/**
- * @see {@link ajax}
- *
- * @class AjaxTimeoutError
- */
-export declare const AjaxTimeoutError: AjaxTimeoutErrorCtor;
diff --git a/node_modules/rxjs/internal/observable/dom/AjaxObservable.js b/node_modules/rxjs/internal/observable/dom/AjaxObservable.js
deleted file mode 100644
index 432d777..0000000
--- a/node_modules/rxjs/internal/observable/dom/AjaxObservable.js
+++ /dev/null
@@ -1,391 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var root_1 = require("../../util/root");
-var Observable_1 = require("../../Observable");
-var Subscriber_1 = require("../../Subscriber");
-var map_1 = require("../../operators/map");
-function getCORSRequest() {
-    if (root_1.root.XMLHttpRequest) {
-        return new root_1.root.XMLHttpRequest();
-    }
-    else if (!!root_1.root.XDomainRequest) {
-        return new root_1.root.XDomainRequest();
-    }
-    else {
-        throw new Error('CORS is not supported by your browser');
-    }
-}
-function getXMLHttpRequest() {
-    if (root_1.root.XMLHttpRequest) {
-        return new root_1.root.XMLHttpRequest();
-    }
-    else {
-        var progId = void 0;
-        try {
-            var progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
-            for (var i = 0; i < 3; i++) {
-                try {
-                    progId = progIds[i];
-                    if (new root_1.root.ActiveXObject(progId)) {
-                        break;
-                    }
-                }
-                catch (e) {
-                }
-            }
-            return new root_1.root.ActiveXObject(progId);
-        }
-        catch (e) {
-            throw new Error('XMLHttpRequest is not supported by your browser');
-        }
-    }
-}
-function ajaxGet(url, headers) {
-    if (headers === void 0) { headers = null; }
-    return new AjaxObservable({ method: 'GET', url: url, headers: headers });
-}
-exports.ajaxGet = ajaxGet;
-function ajaxPost(url, body, headers) {
-    return new AjaxObservable({ method: 'POST', url: url, body: body, headers: headers });
-}
-exports.ajaxPost = ajaxPost;
-function ajaxDelete(url, headers) {
-    return new AjaxObservable({ method: 'DELETE', url: url, headers: headers });
-}
-exports.ajaxDelete = ajaxDelete;
-function ajaxPut(url, body, headers) {
-    return new AjaxObservable({ method: 'PUT', url: url, body: body, headers: headers });
-}
-exports.ajaxPut = ajaxPut;
-function ajaxPatch(url, body, headers) {
-    return new AjaxObservable({ method: 'PATCH', url: url, body: body, headers: headers });
-}
-exports.ajaxPatch = ajaxPatch;
-var mapResponse = map_1.map(function (x, index) { return x.response; });
-function ajaxGetJSON(url, headers) {
-    return mapResponse(new AjaxObservable({
-        method: 'GET',
-        url: url,
-        responseType: 'json',
-        headers: headers
-    }));
-}
-exports.ajaxGetJSON = ajaxGetJSON;
-var AjaxObservable = (function (_super) {
-    __extends(AjaxObservable, _super);
-    function AjaxObservable(urlOrRequest) {
-        var _this = _super.call(this) || this;
-        var request = {
-            async: true,
-            createXHR: function () {
-                return this.crossDomain ? getCORSRequest() : getXMLHttpRequest();
-            },
-            crossDomain: true,
-            withCredentials: false,
-            headers: {},
-            method: 'GET',
-            responseType: 'json',
-            timeout: 0
-        };
-        if (typeof urlOrRequest === 'string') {
-            request.url = urlOrRequest;
-        }
-        else {
-            for (var prop in urlOrRequest) {
-                if (urlOrRequest.hasOwnProperty(prop)) {
-                    request[prop] = urlOrRequest[prop];
-                }
-            }
-        }
-        _this.request = request;
-        return _this;
-    }
-    AjaxObservable.prototype._subscribe = function (subscriber) {
-        return new AjaxSubscriber(subscriber, this.request);
-    };
-    AjaxObservable.create = (function () {
-        var create = function (urlOrRequest) {
-            return new AjaxObservable(urlOrRequest);
-        };
-        create.get = ajaxGet;
-        create.post = ajaxPost;
-        create.delete = ajaxDelete;
-        create.put = ajaxPut;
-        create.patch = ajaxPatch;
-        create.getJSON = ajaxGetJSON;
-        return create;
-    })();
-    return AjaxObservable;
-}(Observable_1.Observable));
-exports.AjaxObservable = AjaxObservable;
-var AjaxSubscriber = (function (_super) {
-    __extends(AjaxSubscriber, _super);
-    function AjaxSubscriber(destination, request) {
-        var _this = _super.call(this, destination) || this;
-        _this.request = request;
-        _this.done = false;
-        var headers = request.headers = request.headers || {};
-        if (!request.crossDomain && !_this.getHeader(headers, 'X-Requested-With')) {
-            headers['X-Requested-With'] = 'XMLHttpRequest';
-        }
-        var contentTypeHeader = _this.getHeader(headers, 'Content-Type');
-        if (!contentTypeHeader && !(root_1.root.FormData && request.body instanceof root_1.root.FormData) && typeof request.body !== 'undefined') {
-            headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
-        }
-        request.body = _this.serializeBody(request.body, _this.getHeader(request.headers, 'Content-Type'));
-        _this.send();
-        return _this;
-    }
-    AjaxSubscriber.prototype.next = function (e) {
-        this.done = true;
-        var _a = this, xhr = _a.xhr, request = _a.request, destination = _a.destination;
-        var result;
-        try {
-            result = new AjaxResponse(e, xhr, request);
-        }
-        catch (err) {
-            return destination.error(err);
-        }
-        destination.next(result);
-    };
-    AjaxSubscriber.prototype.send = function () {
-        var _a = this, request = _a.request, _b = _a.request, user = _b.user, method = _b.method, url = _b.url, async = _b.async, password = _b.password, headers = _b.headers, body = _b.body;
-        try {
-            var xhr = this.xhr = request.createXHR();
-            this.setupEvents(xhr, request);
-            if (user) {
-                xhr.open(method, url, async, user, password);
-            }
-            else {
-                xhr.open(method, url, async);
-            }
-            if (async) {
-                xhr.timeout = request.timeout;
-                xhr.responseType = request.responseType;
-            }
-            if ('withCredentials' in xhr) {
-                xhr.withCredentials = !!request.withCredentials;
-            }
-            this.setHeaders(xhr, headers);
-            if (body) {
-                xhr.send(body);
-            }
-            else {
-                xhr.send();
-            }
-        }
-        catch (err) {
-            this.error(err);
-        }
-    };
-    AjaxSubscriber.prototype.serializeBody = function (body, contentType) {
-        if (!body || typeof body === 'string') {
-            return body;
-        }
-        else if (root_1.root.FormData && body instanceof root_1.root.FormData) {
-            return body;
-        }
-        if (contentType) {
-            var splitIndex = contentType.indexOf(';');
-            if (splitIndex !== -1) {
-                contentType = contentType.substring(0, splitIndex);
-            }
-        }
-        switch (contentType) {
-            case 'application/x-www-form-urlencoded':
-                return Object.keys(body).map(function (key) { return encodeURIComponent(key) + "=" + encodeURIComponent(body[key]); }).join('&');
-            case 'application/json':
-                return JSON.stringify(body);
-            default:
-                return body;
-        }
-    };
-    AjaxSubscriber.prototype.setHeaders = function (xhr, headers) {
-        for (var key in headers) {
-            if (headers.hasOwnProperty(key)) {
-                xhr.setRequestHeader(key, headers[key]);
-            }
-        }
-    };
-    AjaxSubscriber.prototype.getHeader = function (headers, headerName) {
-        for (var key in headers) {
-            if (key.toLowerCase() === headerName.toLowerCase()) {
-                return headers[key];
-            }
-        }
-        return undefined;
-    };
-    AjaxSubscriber.prototype.setupEvents = function (xhr, request) {
-        var progressSubscriber = request.progressSubscriber;
-        function xhrTimeout(e) {
-            var _a = xhrTimeout, subscriber = _a.subscriber, progressSubscriber = _a.progressSubscriber, request = _a.request;
-            if (progressSubscriber) {
-                progressSubscriber.error(e);
-            }
-            var error;
-            try {
-                error = new exports.AjaxTimeoutError(this, request);
-            }
-            catch (err) {
-                error = err;
-            }
-            subscriber.error(error);
-        }
-        xhr.ontimeout = xhrTimeout;
-        xhrTimeout.request = request;
-        xhrTimeout.subscriber = this;
-        xhrTimeout.progressSubscriber = progressSubscriber;
-        if (xhr.upload && 'withCredentials' in xhr) {
-            if (progressSubscriber) {
-                var xhrProgress_1;
-                xhrProgress_1 = function (e) {
-                    var progressSubscriber = xhrProgress_1.progressSubscriber;
-                    progressSubscriber.next(e);
-                };
-                if (root_1.root.XDomainRequest) {
-                    xhr.onprogress = xhrProgress_1;
-                }
-                else {
-                    xhr.upload.onprogress = xhrProgress_1;
-                }
-                xhrProgress_1.progressSubscriber = progressSubscriber;
-            }
-            var xhrError_1;
-            xhrError_1 = function (e) {
-                var _a = xhrError_1, progressSubscriber = _a.progressSubscriber, subscriber = _a.subscriber, request = _a.request;
-                if (progressSubscriber) {
-                    progressSubscriber.error(e);
-                }
-                var error;
-                try {
-                    error = new exports.AjaxError('ajax error', this, request);
-                }
-                catch (err) {
-                    error = err;
-                }
-                subscriber.error(error);
-            };
-            xhr.onerror = xhrError_1;
-            xhrError_1.request = request;
-            xhrError_1.subscriber = this;
-            xhrError_1.progressSubscriber = progressSubscriber;
-        }
-        function xhrReadyStateChange(e) {
-            return;
-        }
-        xhr.onreadystatechange = xhrReadyStateChange;
-        xhrReadyStateChange.subscriber = this;
-        xhrReadyStateChange.progressSubscriber = progressSubscriber;
-        xhrReadyStateChange.request = request;
-        function xhrLoad(e) {
-            var _a = xhrLoad, subscriber = _a.subscriber, progressSubscriber = _a.progressSubscriber, request = _a.request;
-            if (this.readyState === 4) {
-                var status_1 = this.status === 1223 ? 204 : this.status;
-                var response = (this.responseType === 'text' ? (this.response || this.responseText) : this.response);
-                if (status_1 === 0) {
-                    status_1 = response ? 200 : 0;
-                }
-                if (status_1 < 400) {
-                    if (progressSubscriber) {
-                        progressSubscriber.complete();
-                    }
-                    subscriber.next(e);
-                    subscriber.complete();
-                }
-                else {
-                    if (progressSubscriber) {
-                        progressSubscriber.error(e);
-                    }
-                    var error = void 0;
-                    try {
-                        error = new exports.AjaxError('ajax error ' + status_1, this, request);
-                    }
-                    catch (err) {
-                        error = err;
-                    }
-                    subscriber.error(error);
-                }
-            }
-        }
-        xhr.onload = xhrLoad;
-        xhrLoad.subscriber = this;
-        xhrLoad.progressSubscriber = progressSubscriber;
-        xhrLoad.request = request;
-    };
-    AjaxSubscriber.prototype.unsubscribe = function () {
-        var _a = this, done = _a.done, xhr = _a.xhr;
-        if (!done && xhr && xhr.readyState !== 4 && typeof xhr.abort === 'function') {
-            xhr.abort();
-        }
-        _super.prototype.unsubscribe.call(this);
-    };
-    return AjaxSubscriber;
-}(Subscriber_1.Subscriber));
-exports.AjaxSubscriber = AjaxSubscriber;
-var AjaxResponse = (function () {
-    function AjaxResponse(originalEvent, xhr, request) {
-        this.originalEvent = originalEvent;
-        this.xhr = xhr;
-        this.request = request;
-        this.status = xhr.status;
-        this.responseType = xhr.responseType || request.responseType;
-        this.response = parseXhrResponse(this.responseType, xhr);
-    }
-    return AjaxResponse;
-}());
-exports.AjaxResponse = AjaxResponse;
-var AjaxErrorImpl = (function () {
-    function AjaxErrorImpl(message, xhr, request) {
-        Error.call(this);
-        this.message = message;
-        this.name = 'AjaxError';
-        this.xhr = xhr;
-        this.request = request;
-        this.status = xhr.status;
-        this.responseType = xhr.responseType || request.responseType;
-        this.response = parseXhrResponse(this.responseType, xhr);
-        return this;
-    }
-    AjaxErrorImpl.prototype = Object.create(Error.prototype);
-    return AjaxErrorImpl;
-})();
-exports.AjaxError = AjaxErrorImpl;
-function parseJson(xhr) {
-    if ('response' in xhr) {
-        return xhr.responseType ? xhr.response : JSON.parse(xhr.response || xhr.responseText || 'null');
-    }
-    else {
-        return JSON.parse(xhr.responseText || 'null');
-    }
-}
-function parseXhrResponse(responseType, xhr) {
-    switch (responseType) {
-        case 'json':
-            return parseJson(xhr);
-        case 'xml':
-            return xhr.responseXML;
-        case 'text':
-        default:
-            return ('response' in xhr) ? xhr.response : xhr.responseText;
-    }
-}
-function AjaxTimeoutErrorImpl(xhr, request) {
-    exports.AjaxError.call(this, 'ajax timeout', xhr, request);
-    this.name = 'AjaxTimeoutError';
-    return this;
-}
-exports.AjaxTimeoutError = AjaxTimeoutErrorImpl;
-//# sourceMappingURL=AjaxObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/dom/AjaxObservable.js.map b/node_modules/rxjs/internal/observable/dom/AjaxObservable.js.map
deleted file mode 100644
index 3c5a93e..0000000
--- a/node_modules/rxjs/internal/observable/dom/AjaxObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AjaxObservable.js","sources":["../../../src/internal/observable/dom/AjaxObservable.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/observable/dom/WebSocketSubject.d.ts b/node_modules/rxjs/internal/observable/dom/WebSocketSubject.d.ts
deleted file mode 100644
index 84cc6f1..0000000
--- a/node_modules/rxjs/internal/observable/dom/WebSocketSubject.d.ts
+++ /dev/null
@@ -1,170 +0,0 @@
-import { Subject, AnonymousSubject } from '../../Subject';
-import { Subscriber } from '../../Subscriber';
-import { Observable } from '../../Observable';
-import { Subscription } from '../../Subscription';
-import { Operator } from '../../Operator';
-import { Observer, NextObserver } from '../../types';
-/**
- * WebSocketSubjectConfig is a plain Object that allows us to make our
- * webSocket configurable.
- *
- * <span class="informal">Provides flexibility to {@link webSocket}</span>
- *
- * It defines a set of properties to provide custom behavior in specific
- * moments of the socket's lifecycle. When the connection opens we can
- * use `openObserver`, when the connection is closed `closeObserver`, if we
- * are interested in listening for data comming from server: `deserializer`,
- * which allows us to customize the deserialization strategy of data before passing it
- * to the socket client. By default `deserializer` is going to apply `JSON.parse` to each message comming
- * from the Server.
- *
- * ## Example
- * **deserializer**, the default for this property is `JSON.parse` but since there are just two options
- * for incomming data, either be text or binarydata. We can apply a custom deserialization strategy
- * or just simply skip the default behaviour.
- * ```ts
- * import { webSocket } from 'rxjs/webSocket';
- *
- * const wsSubject = webSocket({
- *     url: 'ws://localhost:8081',
- * //Apply any transformation of your choice.
- *     deserializer: ({data}) => data
- * });
- *
- * wsSubject.subscribe(console.log);
- *
- * // Let's suppose we have this on the Server: ws.send("This is a msg from the server")
- * //output
- * //
- * // This is a msg from the server
- * ```
- *
- * **serializer** allows us tom apply custom serialization strategy but for the outgoing messages
- * ```ts
- * import { webSocket } from 'rxjs/webSocket';
- *
- * const wsSubject = webSocket({
- *     url: 'ws://localhost:8081',
- * //Apply any transformation of your choice.
- *     serializer: msg => JSON.stringify({channel: "webDevelopment", msg: msg})
- * });
- *
- * wsSubject.subscribe(() => subject.next("msg to the server"));
- *
- * // Let's suppose we have this on the Server: ws.send("This is a msg from the server")
- * //output
- * //
- * // {"channel":"webDevelopment","msg":"msg to the server"}
- * ```
- *
- * **closeObserver** allows us to set a custom error when an error raise up.
- * ```ts
- * import { webSocket } from 'rxjs/webSocket';
- *
- * const wsSubject = webSocket({
- *     url: 'ws://localhost:8081',
- *     closeObserver: {
-        next(closeEvent) {
-            const customError = { code: 6666, reason: "Custom evil reason" }
-            console.log(`code: ${customError.code}, reason: ${customError.reason}`);
-        }
-    }
- * });
- *
- * //output
- * // code: 6666, reason: Custom evil reason
- * ```
- *
- * **openObserver**, Let's say we need to make some kind of init task before sending/receiving msgs to the
- * webSocket or sending notification that the connection was successful, this is when
- * openObserver is usefull for.
- * ```ts
- * import { webSocket } from 'rxjs/webSocket';
- *
- * const wsSubject = webSocket({
- *     url: 'ws://localhost:8081',
- *     openObserver: {
- *         next: () => {
- *             console.log('connetion ok');
- *         }
- *     },
- * });
- *
- * //output
- * // connetion ok`
- * ```
- * */
-export interface WebSocketSubjectConfig<T> {
-    /** The url of the socket server to connect to */
-    url: string;
-    /** The protocol to use to connect */
-    protocol?: string | Array<string>;
-    /** @deprecated use {@link deserializer} */
-    resultSelector?: (e: MessageEvent) => T;
-    /**
-     * A serializer used to create messages from passed values before the
-     * messages are sent to the server. Defaults to JSON.stringify.
-     */
-    serializer?: (value: T) => WebSocketMessage;
-    /**
-     * A deserializer used for messages arriving on the socket from the
-     * server. Defaults to JSON.parse.
-     */
-    deserializer?: (e: MessageEvent) => T;
-    /**
-     * An Observer that watches when open events occur on the underlying web socket.
-     */
-    openObserver?: NextObserver<Event>;
-    /**
-     * An Observer than watches when close events occur on the underlying webSocket
-     */
-    closeObserver?: NextObserver<CloseEvent>;
-    /**
-     * An Observer that watches when a close is about to occur due to
-     * unsubscription.
-     */
-    closingObserver?: NextObserver<void>;
-    /**
-     * A WebSocket constructor to use. This is useful for situations like using a
-     * WebSocket impl in Node (WebSocket is a DOM API), or for mocking a WebSocket
-     * for testing purposes
-     */
-    WebSocketCtor?: {
-        new (url: string, protocols?: string | string[]): WebSocket;
-    };
-    /** Sets the `binaryType` property of the underlying WebSocket. */
-    binaryType?: 'blob' | 'arraybuffer';
-}
-export declare type WebSocketMessage = string | ArrayBuffer | Blob | ArrayBufferView;
-export declare class WebSocketSubject<T> extends AnonymousSubject<T> {
-    private _config;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _output: Subject<T>;
-    private _socket;
-    constructor(urlConfigOrSource: string | WebSocketSubjectConfig<T> | Observable<T>, destination?: Observer<T>);
-    lift<R>(operator: Operator<T, R>): WebSocketSubject<R>;
-    private _resetState;
-    /**
-     * Creates an {@link Observable}, that when subscribed to, sends a message,
-     * defined by the `subMsg` function, to the server over the socket to begin a
-     * subscription to data over that socket. Once data arrives, the
-     * `messageFilter` argument will be used to select the appropriate data for
-     * the resulting Observable. When teardown occurs, either due to
-     * unsubscription, completion or error, a message defined by the `unsubMsg`
-     * argument will be send to the server over the WebSocketSubject.
-     *
-     * @param subMsg A function to generate the subscription message to be sent to
-     * the server. This will still be processed by the serializer in the
-     * WebSocketSubject's config. (Which defaults to JSON serialization)
-     * @param unsubMsg A function to generate the unsubscription message to be
-     * sent to the server at teardown. This will still be processed by the
-     * serializer in the WebSocketSubject's config.
-     * @param messageFilter A predicate for selecting the appropriate messages
-     * from the server for the output stream.
-     */
-    multiplex(subMsg: () => any, unsubMsg: () => any, messageFilter: (value: T) => boolean): Observable<any>;
-    private _connectSocket;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _subscribe(subscriber: Subscriber<T>): Subscription;
-    unsubscribe(): void;
-}
diff --git a/node_modules/rxjs/internal/observable/dom/WebSocketSubject.js b/node_modules/rxjs/internal/observable/dom/WebSocketSubject.js
deleted file mode 100644
index d3edd3c..0000000
--- a/node_modules/rxjs/internal/observable/dom/WebSocketSubject.js
+++ /dev/null
@@ -1,241 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-var __assign = (this && this.__assign) || function () {
-    __assign = Object.assign || function(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
-                t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../../Subject");
-var Subscriber_1 = require("../../Subscriber");
-var Observable_1 = require("../../Observable");
-var Subscription_1 = require("../../Subscription");
-var ReplaySubject_1 = require("../../ReplaySubject");
-var DEFAULT_WEBSOCKET_CONFIG = {
-    url: '',
-    deserializer: function (e) { return JSON.parse(e.data); },
-    serializer: function (value) { return JSON.stringify(value); },
-};
-var WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT = 'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';
-var WebSocketSubject = (function (_super) {
-    __extends(WebSocketSubject, _super);
-    function WebSocketSubject(urlConfigOrSource, destination) {
-        var _this = _super.call(this) || this;
-        if (urlConfigOrSource instanceof Observable_1.Observable) {
-            _this.destination = destination;
-            _this.source = urlConfigOrSource;
-        }
-        else {
-            var config = _this._config = __assign({}, DEFAULT_WEBSOCKET_CONFIG);
-            _this._output = new Subject_1.Subject();
-            if (typeof urlConfigOrSource === 'string') {
-                config.url = urlConfigOrSource;
-            }
-            else {
-                for (var key in urlConfigOrSource) {
-                    if (urlConfigOrSource.hasOwnProperty(key)) {
-                        config[key] = urlConfigOrSource[key];
-                    }
-                }
-            }
-            if (!config.WebSocketCtor && WebSocket) {
-                config.WebSocketCtor = WebSocket;
-            }
-            else if (!config.WebSocketCtor) {
-                throw new Error('no WebSocket constructor can be found');
-            }
-            _this.destination = new ReplaySubject_1.ReplaySubject();
-        }
-        return _this;
-    }
-    WebSocketSubject.prototype.lift = function (operator) {
-        var sock = new WebSocketSubject(this._config, this.destination);
-        sock.operator = operator;
-        sock.source = this;
-        return sock;
-    };
-    WebSocketSubject.prototype._resetState = function () {
-        this._socket = null;
-        if (!this.source) {
-            this.destination = new ReplaySubject_1.ReplaySubject();
-        }
-        this._output = new Subject_1.Subject();
-    };
-    WebSocketSubject.prototype.multiplex = function (subMsg, unsubMsg, messageFilter) {
-        var self = this;
-        return new Observable_1.Observable(function (observer) {
-            try {
-                self.next(subMsg());
-            }
-            catch (err) {
-                observer.error(err);
-            }
-            var subscription = self.subscribe(function (x) {
-                try {
-                    if (messageFilter(x)) {
-                        observer.next(x);
-                    }
-                }
-                catch (err) {
-                    observer.error(err);
-                }
-            }, function (err) { return observer.error(err); }, function () { return observer.complete(); });
-            return function () {
-                try {
-                    self.next(unsubMsg());
-                }
-                catch (err) {
-                    observer.error(err);
-                }
-                subscription.unsubscribe();
-            };
-        });
-    };
-    WebSocketSubject.prototype._connectSocket = function () {
-        var _this = this;
-        var _a = this._config, WebSocketCtor = _a.WebSocketCtor, protocol = _a.protocol, url = _a.url, binaryType = _a.binaryType;
-        var observer = this._output;
-        var socket = null;
-        try {
-            socket = protocol ?
-                new WebSocketCtor(url, protocol) :
-                new WebSocketCtor(url);
-            this._socket = socket;
-            if (binaryType) {
-                this._socket.binaryType = binaryType;
-            }
-        }
-        catch (e) {
-            observer.error(e);
-            return;
-        }
-        var subscription = new Subscription_1.Subscription(function () {
-            _this._socket = null;
-            if (socket && socket.readyState === 1) {
-                socket.close();
-            }
-        });
-        socket.onopen = function (e) {
-            var _socket = _this._socket;
-            if (!_socket) {
-                socket.close();
-                _this._resetState();
-                return;
-            }
-            var openObserver = _this._config.openObserver;
-            if (openObserver) {
-                openObserver.next(e);
-            }
-            var queue = _this.destination;
-            _this.destination = Subscriber_1.Subscriber.create(function (x) {
-                if (socket.readyState === 1) {
-                    try {
-                        var serializer = _this._config.serializer;
-                        socket.send(serializer(x));
-                    }
-                    catch (e) {
-                        _this.destination.error(e);
-                    }
-                }
-            }, function (e) {
-                var closingObserver = _this._config.closingObserver;
-                if (closingObserver) {
-                    closingObserver.next(undefined);
-                }
-                if (e && e.code) {
-                    socket.close(e.code, e.reason);
-                }
-                else {
-                    observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));
-                }
-                _this._resetState();
-            }, function () {
-                var closingObserver = _this._config.closingObserver;
-                if (closingObserver) {
-                    closingObserver.next(undefined);
-                }
-                socket.close();
-                _this._resetState();
-            });
-            if (queue && queue instanceof ReplaySubject_1.ReplaySubject) {
-                subscription.add(queue.subscribe(_this.destination));
-            }
-        };
-        socket.onerror = function (e) {
-            _this._resetState();
-            observer.error(e);
-        };
-        socket.onclose = function (e) {
-            _this._resetState();
-            var closeObserver = _this._config.closeObserver;
-            if (closeObserver) {
-                closeObserver.next(e);
-            }
-            if (e.wasClean) {
-                observer.complete();
-            }
-            else {
-                observer.error(e);
-            }
-        };
-        socket.onmessage = function (e) {
-            try {
-                var deserializer = _this._config.deserializer;
-                observer.next(deserializer(e));
-            }
-            catch (err) {
-                observer.error(err);
-            }
-        };
-    };
-    WebSocketSubject.prototype._subscribe = function (subscriber) {
-        var _this = this;
-        var source = this.source;
-        if (source) {
-            return source.subscribe(subscriber);
-        }
-        if (!this._socket) {
-            this._connectSocket();
-        }
-        this._output.subscribe(subscriber);
-        subscriber.add(function () {
-            var _socket = _this._socket;
-            if (_this._output.observers.length === 0) {
-                if (_socket && _socket.readyState === 1) {
-                    _socket.close();
-                }
-                _this._resetState();
-            }
-        });
-        return subscriber;
-    };
-    WebSocketSubject.prototype.unsubscribe = function () {
-        var _socket = this._socket;
-        if (_socket && _socket.readyState === 1) {
-            _socket.close();
-        }
-        this._resetState();
-        _super.prototype.unsubscribe.call(this);
-    };
-    return WebSocketSubject;
-}(Subject_1.AnonymousSubject));
-exports.WebSocketSubject = WebSocketSubject;
-//# sourceMappingURL=WebSocketSubject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/dom/WebSocketSubject.js.map b/node_modules/rxjs/internal/observable/dom/WebSocketSubject.js.map
deleted file mode 100644
index da0ce6a..0000000
--- a/node_modules/rxjs/internal/observable/dom/WebSocketSubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"WebSocketSubject.js","sources":["../../../src/internal/observable/dom/WebSocketSubject.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAA0D;AAC1D,+CAA8C;AAC9C,+CAA8C;AAC9C,mDAAkD;AAElD,qDAAoD;AAsIpD,IAAM,wBAAwB,GAAgC;IAC5D,GAAG,EAAE,EAAE;IACP,YAAY,EAAE,UAAC,CAAe,IAAK,OAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAlB,CAAkB;IACrD,UAAU,EAAE,UAAC,KAAU,IAAK,OAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAArB,CAAqB;CAClD,CAAC;AAEF,IAAM,qCAAqC,GACzC,mIAAmI,CAAC;AAItI;IAAyC,oCAAmB;IAS1D,0BAAY,iBAAqE,EAAE,WAAyB;QAA5G,YACE,iBAAO,SAwBR;QAvBC,IAAI,iBAAiB,YAAY,uBAAU,EAAE;YAC3C,KAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YAC/B,KAAI,CAAC,MAAM,GAAG,iBAAkC,CAAC;SAClD;aAAM;YACL,IAAM,MAAM,GAAG,KAAI,CAAC,OAAO,gBAAQ,wBAAwB,CAAE,CAAC;YAC9D,KAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,EAAK,CAAC;YAChC,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE;gBACzC,MAAM,CAAC,GAAG,GAAG,iBAAiB,CAAC;aAChC;iBAAM;gBACL,KAAK,IAAI,GAAG,IAAI,iBAAiB,EAAE;oBACjC,IAAI,iBAAiB,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;wBACzC,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;qBACtC;iBACF;aACF;YAED,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,EAAE;gBACtC,MAAM,CAAC,aAAa,GAAG,SAAS,CAAC;aAClC;iBAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;gBAChC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;aAC1D;YACD,KAAI,CAAC,WAAW,GAAG,IAAI,6BAAa,EAAE,CAAC;SACxC;;IACH,CAAC;IAED,+BAAI,GAAJ,UAAQ,QAAwB;QAC9B,IAAM,IAAI,GAAG,IAAI,gBAAgB,CAAI,IAAI,CAAC,OAAsC,EAAQ,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1G,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,sCAAW,GAAnB;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,WAAW,GAAG,IAAI,6BAAa,EAAE,CAAC;SACxC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,EAAK,CAAC;IAClC,CAAC;IAoBD,oCAAS,GAAT,UAAU,MAAiB,EAAE,QAAmB,EAAE,aAAoC;QACpF,IAAM,IAAI,GAAG,IAAI,CAAC;QAClB,OAAO,IAAI,uBAAU,CAAC,UAAC,QAAuB;YAC5C,IAAI;gBACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;aACrB;YAAC,OAAO,GAAG,EAAE;gBACZ,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACrB;YAED,IAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,UAAA,CAAC;gBACnC,IAAI;oBACF,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE;wBACpB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;qBAClB;iBACF;gBAAC,OAAO,GAAG,EAAE;oBACZ,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;iBACrB;YACH,CAAC,EACC,UAAA,GAAG,IAAI,OAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAnB,CAAmB,EAC1B,cAAM,OAAA,QAAQ,CAAC,QAAQ,EAAE,EAAnB,CAAmB,CAAC,CAAC;YAE7B,OAAO;gBACL,IAAI;oBACF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;iBACvB;gBAAC,OAAO,GAAG,EAAE;oBACZ,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;iBACrB;gBACD,YAAY,CAAC,WAAW,EAAE,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,yCAAc,GAAtB;QAAA,iBAuGC;QAtGO,IAAA,iBAA2D,EAAzD,gCAAa,EAAE,sBAAQ,EAAE,YAAG,EAAE,0BAAU,CAAkB;QAClE,IAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;QAE9B,IAAI,MAAM,GAAc,IAAI,CAAC;QAC7B,IAAI;YACF,MAAM,GAAG,QAAQ,CAAC,CAAC;gBACjB,IAAI,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAClC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;YACtB,IAAI,UAAU,EAAE;gBACd,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;aACtC;SACF;QAAC,OAAO,CAAC,EAAE;YACV,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,OAAO;SACR;QAED,IAAM,YAAY,GAAG,IAAI,2BAAY,CAAC;YACpC,KAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE;gBACrC,MAAM,CAAC,KAAK,EAAE,CAAC;aAChB;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,GAAG,UAAC,CAAQ;YACf,IAAA,uBAAO,CAAU;YACzB,IAAI,CAAC,OAAO,EAAE;gBACZ,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,KAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,OAAO;aACR;YACO,IAAA,yCAAY,CAAkB;YACtC,IAAI,YAAY,EAAE;gBAChB,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACtB;YAED,IAAM,KAAK,GAAG,KAAI,CAAC,WAAW,CAAC;YAE/B,KAAI,CAAC,WAAW,GAAG,uBAAU,CAAC,MAAM,CAClC,UAAC,CAAC;gBACA,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE;oBAC3B,IAAI;wBACM,IAAA,qCAAU,CAAkB;wBACpC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;qBAC1B;oBAAC,OAAO,CAAC,EAAE;wBACZ,KAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;qBAC3B;iBACF;YACH,CAAC,EACD,UAAC,CAAC;gBACQ,IAAA,+CAAe,CAAkB;gBACzC,IAAI,eAAe,EAAE;oBACnB,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iBACjC;gBACD,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;oBACf,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;iBAChC;qBAAM;oBACL,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAC,CAAC;iBACtE;gBACD,KAAI,CAAC,WAAW,EAAE,CAAC;YACrB,CAAC,EACD;gBACU,IAAA,+CAAe,CAAkB;gBACzC,IAAI,eAAe,EAAE;oBACnB,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iBACjC;gBACD,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,KAAI,CAAC,WAAW,EAAE,CAAC;YACrB,CAAC,CACiB,CAAC;YAErB,IAAI,KAAK,IAAI,KAAK,YAAY,6BAAa,EAAE;gBAC3C,YAAY,CAAC,GAAG,CAAoB,KAAM,CAAC,SAAS,CAAC,KAAI,CAAC,WAAW,CAAC,CAAC,CAAC;aACzE;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,OAAO,GAAG,UAAC,CAAQ;YACxB,KAAI,CAAC,WAAW,EAAE,CAAC;YACnB,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC;QAEF,MAAM,CAAC,OAAO,GAAG,UAAC,CAAa;YAC7B,KAAI,CAAC,WAAW,EAAE,CAAC;YACX,IAAA,2CAAa,CAAkB;YACvC,IAAI,aAAa,EAAE;gBACjB,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACvB;YACD,IAAI,CAAC,CAAC,QAAQ,EAAE;gBACd,QAAQ,CAAC,QAAQ,EAAE,CAAC;aACrB;iBAAM;gBACL,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACnB;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,SAAS,GAAG,UAAC,CAAe;YACjC,IAAI;gBACM,IAAA,yCAAY,CAAkB;gBACtC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;aAChC;YAAC,OAAO,GAAG,EAAE;gBACZ,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACrB;QACH,CAAC,CAAC;IACJ,CAAC;IAGD,qCAAU,GAAV,UAAW,UAAyB;QAApC,iBAmBC;QAlBS,IAAA,oBAAM,CAAU;QACxB,IAAI,MAAM,EAAE;YACV,OAAO,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;SACrC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,cAAc,EAAE,CAAC;SACvB;QACD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnC,UAAU,CAAC,GAAG,CAAC;YACL,IAAA,uBAAO,CAAU;YACzB,IAAI,KAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvC,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,CAAC,EAAE;oBACvC,OAAO,CAAC,KAAK,EAAE,CAAC;iBACjB;gBACD,KAAI,CAAC,WAAW,EAAE,CAAC;aACpB;QACH,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,sCAAW,GAAX;QACU,IAAA,sBAAO,CAAU;QACzB,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,CAAC,EAAE;YACvC,OAAO,CAAC,KAAK,EAAE,CAAC;SACjB;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,iBAAM,WAAW,WAAE,CAAC;IACtB,CAAC;IACH,uBAAC;AAAD,CAAC,AA5OD,CAAyC,0BAAgB,GA4OxD;AA5OY,4CAAgB"}
diff --git a/node_modules/rxjs/internal/observable/dom/ajax.d.ts b/node_modules/rxjs/internal/observable/dom/ajax.d.ts
deleted file mode 100644
index 72e29f4..0000000
--- a/node_modules/rxjs/internal/observable/dom/ajax.d.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { AjaxCreationMethod } from './AjaxObservable';
-/**
- * There is an ajax operator on the Rx object.
- *
- * It creates an observable for an Ajax request with either a request object with
- * url, headers, etc or a string for a URL.
- *
- *
- * ## Using ajax() to fetch the response object that is being returned from API.
- * ```ts
- * import { ajax } from 'rxjs/ajax';
- * import { map, catchError } from 'rxjs/operators';
- * import { of } from 'rxjs';
- *
- * const obs$ = ajax(`https://api.github.com/users?per_page=5`).pipe(
- *   map(userResponse => console.log('users: ', userResponse)),
- *   catchError(error => {
- *     console.log('error: ', error);
- *     return of(error);
- *   })
- * );
- *
- * ```
- *
- * ## Using ajax.getJSON() to fetch data from API.
- * ```ts
- * import { ajax } from 'rxjs/ajax';
- * import { map, catchError } from 'rxjs/operators';
- * import { of } from 'rxjs';
- *
- * const obs$ = ajax.getJSON(`https://api.github.com/users?per_page=5`).pipe(
- *   map(userResponse => console.log('users: ', userResponse)),
- *   catchError(error => {
- *     console.log('error: ', error);
- *     return of(error);
- *   })
- * );
- *
- * ```
- *
- * ## Using ajax() with object as argument and method POST with a two seconds delay.
- * ```ts
- * import { ajax } from 'rxjs/ajax';
- * import { of } from 'rxjs';
- *
- * const users = ajax({
- *   url: 'https://httpbin.org/delay/2',
- *   method: 'POST',
- *   headers: {
- *     'Content-Type': 'application/json',
- *     'rxjs-custom-header': 'Rxjs'
- *   },
- *   body: {
- *     rxjs: 'Hello World!'
- *   }
- * }).pipe(
- *   map(response => console.log('response: ', response)),
- *   catchError(error => {
- *     console.log('error: ', error);
- *     return of(error);
- *   })
- * );
- *
- * ```
- *
- * ## Using ajax() to fetch. An error object that is being returned from the request.
- * ```ts
- * import { ajax } from 'rxjs/ajax';
- * import { map, catchError } from 'rxjs/operators';
- * import { of } from 'rxjs';
- *
- * const obs$ = ajax(`https://api.github.com/404`).pipe(
- *   map(userResponse => console.log('users: ', userResponse)),
- *   catchError(error => {
- *     console.log('error: ', error);
- *     return of(error);
- *   })
- * );
- *
- * ```
- */
-export declare const ajax: AjaxCreationMethod;
diff --git a/node_modules/rxjs/internal/observable/dom/ajax.js b/node_modules/rxjs/internal/observable/dom/ajax.js
deleted file mode 100644
index b7399e1..0000000
--- a/node_modules/rxjs/internal/observable/dom/ajax.js
+++ /dev/null
@@ -1,5 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AjaxObservable_1 = require("./AjaxObservable");
-exports.ajax = (function () { return AjaxObservable_1.AjaxObservable.create; })();
-//# sourceMappingURL=ajax.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/dom/ajax.js.map b/node_modules/rxjs/internal/observable/dom/ajax.js.map
deleted file mode 100644
index 8f4e299..0000000
--- a/node_modules/rxjs/internal/observable/dom/ajax.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ajax.js","sources":["../../../src/internal/observable/dom/ajax.ts"],"names":[],"mappings":";;AAAA,mDAAwE;AAiF3D,QAAA,IAAI,GAAuB,CAAC,cAAM,OAAA,+BAAc,CAAC,MAAM,EAArB,CAAqB,CAAC,EAAE,CAAC"}
diff --git a/node_modules/rxjs/internal/observable/dom/fetch.d.ts b/node_modules/rxjs/internal/observable/dom/fetch.d.ts
deleted file mode 100644
index 9713f42..0000000
--- a/node_modules/rxjs/internal/observable/dom/fetch.d.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { Observable } from '../../Observable';
-/**
- * Uses [the Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) to
- * make an HTTP request.
- *
- * **WARNING** Parts of the fetch API are still experimental. `AbortController` is
- * required for this implementation to work and use cancellation appropriately.
- *
- * Will automatically set up an internal [AbortController](https://developer.mozilla.org/en-US/docs/Web/API/AbortController)
- * in order to teardown the internal `fetch` when the subscription tears down.
- *
- * If a `signal` is provided via the `init` argument, it will behave like it usually does with
- * `fetch`. If the provided `signal` aborts, the error that `fetch` normally rejects with
- * in that scenario will be emitted as an error from the observable.
- *
- * ### Basic Use
- *
- * ```ts
- * import { of } from 'rxjs';
- * import { fromFetch } from 'rxjs/fetch';
- * import { switchMap, catchError } from 'rxjs/operators';
- *
- * const data$ = fromFetch('https://api.github.com/users?per_page=5').pipe(
- *  switchMap(response => {
- *    if (response.ok) {
- *      // OK return data
- *      return response.json();
- *    } else {
- *      // Server is returning a status requiring the client to try something else.
- *      return of({ error: true, message: `Error ${response.status}` });
- *    }
- *  }),
- *  catchError(err => {
- *    // Network or other error, handle appropriately
- *    console.error(err);
- *    return of({ error: true, message: err.message })
- *  })
- * );
- *
- * data$.subscribe({
- *  next: result => console.log(result),
- *  complete: () => console.log('done')
- * })
- * ```
- *
- * @param input The resource you would like to fetch. Can be a url or a request object.
- * @param init A configuration object for the fetch.
- * [See MDN for more details](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)
- * @returns An Observable, that when subscribed to performs an HTTP request using the native `fetch`
- * function. The {@link Subscription} is tied to an `AbortController` for the the fetch.
- */
-export declare function fromFetch(input: string | Request, init?: RequestInit): Observable<Response>;
diff --git a/node_modules/rxjs/internal/observable/dom/fetch.js b/node_modules/rxjs/internal/observable/dom/fetch.js
deleted file mode 100644
index 4a5b258..0000000
--- a/node_modules/rxjs/internal/observable/dom/fetch.js
+++ /dev/null
@@ -1,60 +0,0 @@
-"use strict";
-var __assign = (this && this.__assign) || function () {
-    __assign = Object.assign || function(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
-                t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../../Observable");
-function fromFetch(input, init) {
-    return new Observable_1.Observable(function (subscriber) {
-        var controller = new AbortController();
-        var signal = controller.signal;
-        var outerSignalHandler;
-        var abortable = true;
-        var unsubscribed = false;
-        if (init) {
-            if (init.signal) {
-                if (init.signal.aborted) {
-                    controller.abort();
-                }
-                else {
-                    outerSignalHandler = function () {
-                        if (!signal.aborted) {
-                            controller.abort();
-                        }
-                    };
-                    init.signal.addEventListener('abort', outerSignalHandler);
-                }
-            }
-            init = __assign({}, init, { signal: signal });
-        }
-        else {
-            init = { signal: signal };
-        }
-        fetch(input, init).then(function (response) {
-            abortable = false;
-            subscriber.next(response);
-            subscriber.complete();
-        }).catch(function (err) {
-            abortable = false;
-            if (!unsubscribed) {
-                subscriber.error(err);
-            }
-        });
-        return function () {
-            unsubscribed = true;
-            if (abortable) {
-                controller.abort();
-            }
-        };
-    });
-}
-exports.fromFetch = fromFetch;
-//# sourceMappingURL=fetch.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/dom/fetch.js.map b/node_modules/rxjs/internal/observable/dom/fetch.js.map
deleted file mode 100644
index 2263a1e..0000000
--- a/node_modules/rxjs/internal/observable/dom/fetch.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fetch.js","sources":["../../../src/internal/observable/dom/fetch.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,+CAA8C;AAoD9C,SAAgB,SAAS,CAAC,KAAuB,EAAE,IAAkB;IACnE,OAAO,IAAI,uBAAU,CAAW,UAAA,UAAU;QACxC,IAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,IAAI,kBAA8B,CAAC;QACnC,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,IAAI,IAAI,EAAE;YAER,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;oBACvB,UAAU,CAAC,KAAK,EAAE,CAAC;iBACpB;qBAAM;oBACL,kBAAkB,GAAG;wBACnB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;4BACnB,UAAU,CAAC,KAAK,EAAE,CAAC;yBACpB;oBACH,CAAC,CAAC;oBACF,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;iBAC3D;aACF;YACD,IAAI,gBAAQ,IAAI,IAAE,MAAM,QAAA,GAAE,CAAC;SAC5B;aAAM;YACL,IAAI,GAAG,EAAE,MAAM,QAAA,EAAE,CAAC;SACnB;QAED,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAA,QAAQ;YAC9B,SAAS,GAAG,KAAK,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC,KAAK,CAAC,UAAA,GAAG;YACV,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,YAAY,EAAE;gBAEjB,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACvB;QACH,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,YAAY,GAAG,IAAI,CAAC;YACpB,IAAI,SAAS,EAAE;gBACb,UAAU,CAAC,KAAK,EAAE,CAAC;aACpB;QACH,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AA9CD,8BA8CC"}
diff --git a/node_modules/rxjs/internal/observable/dom/webSocket.d.ts b/node_modules/rxjs/internal/observable/dom/webSocket.d.ts
deleted file mode 100644
index e78db13..0000000
--- a/node_modules/rxjs/internal/observable/dom/webSocket.d.ts
+++ /dev/null
@@ -1,153 +0,0 @@
-import { WebSocketSubject, WebSocketSubjectConfig } from './WebSocketSubject';
-/**
- * Wrapper around the w3c-compatible WebSocket object provided by the browser.
- *
- * <span class="informal">{@link Subject} that communicates with a server via WebSocket</span>
- *
- * `webSocket` is a factory function that produces a `WebSocketSubject`,
- * which can be used to make WebSocket connection with an arbitrary endpoint.
- * `webSocket` accepts as an argument either a string with url of WebSocket endpoint, or an
- * {@link WebSocketSubjectConfig} object for providing additional configuration, as
- * well as Observers for tracking lifecycle of WebSocket connection.
- *
- * When `WebSocketSubject` is subscribed, it attempts to make a socket connection,
- * unless there is one made already. This means that many subscribers will always listen
- * on the same socket, thus saving resources. If however, two instances are made of `WebSocketSubject`,
- * even if these two were provided with the same url, they will attempt to make separate
- * connections. When consumer of a `WebSocketSubject` unsubscribes, socket connection is closed,
- * only if there are no more subscribers still listening. If after some time a consumer starts
- * subscribing again, connection is reestablished.
- *
- * Once connection is made, whenever a new message comes from the server, `WebSocketSubject` will emit that
- * message as a value in the stream. By default, a message from the socket is parsed via `JSON.parse`. If you
- * want to customize how deserialization is handled (if at all), you can provide custom `resultSelector`
- * function in {@link WebSocketSubject}. When connection closes, stream will complete, provided it happened without
- * any errors. If at any point (starting, maintaining or closing a connection) there is an error,
- * stream will also error with whatever WebSocket API has thrown.
- *
- * By virtue of being a {@link Subject}, `WebSocketSubject` allows for receiving and sending messages from the server. In order
- * to communicate with a connected endpoint, use `next`, `error` and `complete` methods. `next` sends a value to the server, so bear in mind
- * that this value will not be serialized beforehand. Because of This, `JSON.stringify` will have to be called on a value by hand,
- * before calling `next` with a result. Note also that if at the moment of nexting value
- * there is no socket connection (for example no one is subscribing), those values will be buffered, and sent when connection
- * is finally established. `complete` method closes socket connection. `error` does the same,
- * as well as notifying the server that something went wrong via status code and string with details of what happened.
- * Since status code is required in WebSocket API, `WebSocketSubject` does not allow, like regular `Subject`,
- * arbitrary values being passed to the `error` method. It needs to be called with an object that has `code`
- * property with status code number and optional `reason` property with string describing details
- * of an error.
- *
- * Calling `next` does not affect subscribers of `WebSocketSubject` - they have no
- * information that something was sent to the server (unless of course the server
- * responds somehow to a message). On the other hand, since calling `complete` triggers
- * an attempt to close socket connection. If that connection is closed without any errors, stream will
- * complete, thus notifying all subscribers. And since calling `error` closes
- * socket connection as well, just with a different status code for the server, if closing itself proceeds
- * without errors, subscribed Observable will not error, as one might expect, but complete as usual. In both cases
- * (calling `complete` or `error`), if process of closing socket connection results in some errors, *then* stream
- * will error.
- *
- * **Multiplexing**
- *
- * `WebSocketSubject` has an additional operator, not found in other Subjects. It is called `multiplex` and it is
- * used to simulate opening several socket connections, while in reality maintaining only one.
- * For example, an application has both chat panel and real-time notifications about sport news. Since these are two distinct functions,
- * it would make sense to have two separate connections for each. Perhaps there could even be two separate services with WebSocket
- * endpoints, running on separate machines with only GUI combining them together. Having a socket connection
- * for each functionality could become too resource expensive. It is a common pattern to have single
- * WebSocket endpoint that acts as a gateway for the other services (in this case chat and sport news services).
- * Even though there is a single connection in a client app, having the ability to manipulate streams as if it
- * were two separate sockets is desirable. This eliminates manually registering and unregistering in a gateway for
- * given service and filter out messages of interest. This is exactly what `multiplex` method is for.
- *
- * Method accepts three parameters. First two are functions returning subscription and unsubscription messages
- * respectively. These are messages that will be sent to the server, whenever consumer of resulting Observable
- * subscribes and unsubscribes. Server can use them to verify that some kind of messages should start or stop
- * being forwarded to the client. In case of the above example application, after getting subscription message with proper identifier,
- * gateway server can decide that it should connect to real sport news service and start forwarding messages from it.
- * Note that both messages will be sent as returned by the functions, they are by default serialized using JSON.stringify, just
- * as messages pushed via `next`. Also bear in mind that these messages will be sent on *every* subscription and
- * unsubscription. This is potentially dangerous, because one consumer of an Observable may unsubscribe and the server
- * might stop sending messages, since it got unsubscription message. This needs to be handled
- * on the server or using {@link publish} on a Observable returned from 'multiplex'.
- *
- * Last argument to `multiplex` is a `messageFilter` function which should return a boolean. It is used to filter out messages
- * sent by the server to only those that belong to simulated WebSocket stream. For example, server might mark these
- * messages with some kind of string identifier on a message object and `messageFilter` would return `true`
- * if there is such identifier on an object emitted by the socket. Messages which returns `false` in `messageFilter` are simply skipped,
- * and are not passed down the stream.
- *
- * Return value of `multiplex` is an Observable with messages incoming from emulated socket connection. Note that this
- * is not a `WebSocketSubject`, so calling `next` or `multiplex` again will fail. For pushing values to the
- * server, use root `WebSocketSubject`.
- *
- * ### Examples
- * #### Listening for messages from the server
- * ```ts
- * import { webSocket } from "rxjs/webSocket";
- * const subject = webSocket("ws://localhost:8081");
- *
- * subject.subscribe(
- *    msg => console.log('message received: ' + msg), // Called whenever there is a message from the server.
- *    err => console.log(err), // Called if at any point WebSocket API signals some kind of error.
- *    () => console.log('complete') // Called when connection is closed (for whatever reason).
- *  );
- * ```
- *
- * #### Pushing messages to the server
- * ```ts
- * import { webSocket } from "rxjs/webSocket";
- * const subject = webSocket('ws://localhost:8081');
- *
- * subject.subscribe();
- * // Note that at least one consumer has to subscribe to the created subject - otherwise "nexted" values will be just buffered and not sent,
- * // since no connection was established!
- *
- * subject.next({message: 'some message'});
- * // This will send a message to the server once a connection is made. Remember value is serialized with JSON.stringify by default!
- *
- * subject.complete(); // Closes the connection.
- *
- * subject.error({code: 4000, reason: 'I think our app just broke!'});
- * // Also closes the connection, but let's the server know that this closing is caused by some error.
- * ```
- *
- * #### Multiplexing WebSocket
- * ```ts
- * import { webSocket } from "rxjs/webSocket";
- * const subject = webSocket('ws://localhost:8081');
- *
- * const observableA = subject.multiplex(
- *   () => ({subscribe: 'A'}), // When server gets this message, it will start sending messages for 'A'...
- *   () => ({unsubscribe: 'A'}), // ...and when gets this one, it will stop.
- *   message => message.type === 'A' // If the function returns `true` message is passed down the stream. Skipped if the function returns false.
- * );
- *
- * const observableB = subject.multiplex( // And the same goes for 'B'.
- *   () => ({subscribe: 'B'}),
- *   () => ({unsubscribe: 'B'}),
- *   message => message.type === 'B'
- * );
- *
- * const subA = observableA.subscribe(messageForA => console.log(messageForA));
- * // At this moment WebSocket connection is established. Server gets '{"subscribe": "A"}' message and starts sending messages for 'A',
- * // which we log here.
- *
- * const subB = observableB.subscribe(messageForB => console.log(messageForB));
- * // Since we already have a connection, we just send '{"subscribe": "B"}' message to the server. It starts sending messages for 'B',
- * // which we log here.
- *
- * subB.unsubscribe();
- * // Message '{"unsubscribe": "B"}' is sent to the server, which stops sending 'B' messages.
- *
- * subA.unsubscribe();
- * // Message '{"unsubscribe": "A"}' makes the server stop sending messages for 'A'. Since there is no more subscribers to root Subject,
- * // socket connection closes.
- * ```
- *
- *
- * @param {string|WebSocketSubjectConfig} urlConfigOrSource The WebSocket endpoint as an url or an object with
- * configuration and additional Observers.
- * @return {WebSocketSubject} Subject which allows to both send and receive messages via WebSocket connection.
- */
-export declare function webSocket<T>(urlConfigOrSource: string | WebSocketSubjectConfig<T>): WebSocketSubject<T>;
diff --git a/node_modules/rxjs/internal/observable/dom/webSocket.js b/node_modules/rxjs/internal/observable/dom/webSocket.js
deleted file mode 100644
index 714cf95..0000000
--- a/node_modules/rxjs/internal/observable/dom/webSocket.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var WebSocketSubject_1 = require("./WebSocketSubject");
-function webSocket(urlConfigOrSource) {
-    return new WebSocketSubject_1.WebSocketSubject(urlConfigOrSource);
-}
-exports.webSocket = webSocket;
-//# sourceMappingURL=webSocket.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/dom/webSocket.js.map b/node_modules/rxjs/internal/observable/dom/webSocket.js.map
deleted file mode 100644
index 1d0f249..0000000
--- a/node_modules/rxjs/internal/observable/dom/webSocket.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"webSocket.js","sources":["../../../src/internal/observable/dom/webSocket.ts"],"names":[],"mappings":";;AAAA,uDAA8E;AAyJ9E,SAAgB,SAAS,CAAI,iBAAqD;IAChF,OAAO,IAAI,mCAAgB,CAAI,iBAAiB,CAAC,CAAC;AACpD,CAAC;AAFD,8BAEC"}
diff --git a/node_modules/rxjs/internal/observable/empty.d.ts b/node_modules/rxjs/internal/observable/empty.d.ts
deleted file mode 100644
index 0a370e9..0000000
--- a/node_modules/rxjs/internal/observable/empty.d.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-/**
- * The same Observable instance returned by any call to {@link empty} without a
- * `scheduler`. It is preferrable to use this over `empty()`.
- */
-export declare const EMPTY: Observable<never>;
-/**
- * Creates an Observable that emits no items to the Observer and immediately
- * emits a complete notification.
- *
- * <span class="informal">Just emits 'complete', and nothing else.
- * </span>
- *
- * ![](empty.png)
- *
- * This static operator is useful for creating a simple Observable that only
- * emits the complete notification. It can be used for composing with other
- * Observables, such as in a {@link mergeMap}.
- *
- * ## Examples
- * ### Emit the number 7, then complete
- * ```ts
- * import { empty } from 'rxjs';
- * import { startWith } from 'rxjs/operators';
- *
- * const result = empty().pipe(startWith(7));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * ### Map and flatten only odd numbers to the sequence 'a', 'b', 'c'
- * ```ts
- * import { empty, interval, of } from 'rxjs';
- * import { mergeMap } from 'rxjs/operators';
- *
- * const interval$ = interval(1000);
- * const result = interval$.pipe(
- *   mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : empty()),
- * );
- * result.subscribe(x => console.log(x));
- *
- * // Results in the following to the console:
- * // x is equal to the count on the interval eg(0,1,2,3,...)
- * // x will occur every 1000ms
- * // if x % 2 is equal to 1 print abc
- * // if x % 2 is not equal to 1 nothing will be output
- * ```
- *
- * @see {@link Observable}
- * @see {@link never}
- * @see {@link of}
- * @see {@link throwError}
- *
- * @param scheduler A {@link SchedulerLike} to use for scheduling
- * the emission of the complete notification.
- * @return An "empty" Observable: emits only the complete
- * notification.
- * @deprecated Deprecated in favor of using {@link EMPTY} constant, or {@link scheduled} (e.g. `scheduled([], scheduler)`)
- */
-export declare function empty(scheduler?: SchedulerLike): Observable<never>;
diff --git a/node_modules/rxjs/internal/observable/empty.js b/node_modules/rxjs/internal/observable/empty.js
deleted file mode 100644
index cfa90b6..0000000
--- a/node_modules/rxjs/internal/observable/empty.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-exports.EMPTY = new Observable_1.Observable(function (subscriber) { return subscriber.complete(); });
-function empty(scheduler) {
-    return scheduler ? emptyScheduled(scheduler) : exports.EMPTY;
-}
-exports.empty = empty;
-function emptyScheduled(scheduler) {
-    return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });
-}
-//# sourceMappingURL=empty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/empty.js.map b/node_modules/rxjs/internal/observable/empty.js.map
deleted file mode 100644
index 7192f67..0000000
--- a/node_modules/rxjs/internal/observable/empty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"empty.js","sources":["../../src/internal/observable/empty.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAO9B,QAAA,KAAK,GAAG,IAAI,uBAAU,CAAQ,UAAA,UAAU,IAAI,OAAA,UAAU,CAAC,QAAQ,EAAE,EAArB,CAAqB,CAAC,CAAC;AAsDhF,SAAgB,KAAK,CAAC,SAAyB;IAC7C,OAAO,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAK,CAAC;AACvD,CAAC;AAFD,sBAEC;AAED,SAAS,cAAc,CAAC,SAAwB;IAC9C,OAAO,IAAI,uBAAU,CAAQ,UAAA,UAAU,IAAI,OAAA,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,UAAU,CAAC,QAAQ,EAAE,EAArB,CAAqB,CAAC,EAA/C,CAA+C,CAAC,CAAC;AAC9F,CAAC"}
diff --git a/node_modules/rxjs/internal/observable/forkJoin.d.ts b/node_modules/rxjs/internal/observable/forkJoin.d.ts
deleted file mode 100644
index 176490a..0000000
--- a/node_modules/rxjs/internal/observable/forkJoin.d.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput, ObservedValuesFromArray, ObservedValueOf, SubscribableOrPromise } from '../types';
-/** @deprecated Use the version that takes an array of Observables instead */
-export declare function forkJoin<T>(v1: SubscribableOrPromise<T>): Observable<[T]>;
-/** @deprecated Use the version that takes an array of Observables instead */
-export declare function forkJoin<T, T2>(v1: ObservableInput<T>, v2: ObservableInput<T2>): Observable<[T, T2]>;
-/** @deprecated Use the version that takes an array of Observables instead */
-export declare function forkJoin<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>): Observable<[T, T2, T3]>;
-/** @deprecated Use the version that takes an array of Observables instead */
-export declare function forkJoin<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<[T, T2, T3, T4]>;
-/** @deprecated Use the version that takes an array of Observables instead */
-export declare function forkJoin<T, T2, T3, T4, T5>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): Observable<[T, T2, T3, T4, T5]>;
-/** @deprecated Use the version that takes an array of Observables instead */
-export declare function forkJoin<T, T2, T3, T4, T5, T6>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): Observable<[T, T2, T3, T4, T5, T6]>;
-export declare function forkJoin<A>(sources: [ObservableInput<A>]): Observable<[A]>;
-export declare function forkJoin<A, B>(sources: [ObservableInput<A>, ObservableInput<B>]): Observable<[A, B]>;
-export declare function forkJoin<A, B, C>(sources: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>]): Observable<[A, B, C]>;
-export declare function forkJoin<A, B, C, D>(sources: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>]): Observable<[A, B, C, D]>;
-export declare function forkJoin<A, B, C, D, E>(sources: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>, ObservableInput<E>]): Observable<[A, B, C, D, E]>;
-export declare function forkJoin<A, B, C, D, E, F>(sources: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>, ObservableInput<E>, ObservableInput<F>]): Observable<[A, B, C, D, E, F]>;
-export declare function forkJoin<A extends ObservableInput<any>[]>(sources: A): Observable<ObservedValuesFromArray<A>[]>;
-export declare function forkJoin(sourcesObject: {}): Observable<never>;
-export declare function forkJoin<T, K extends keyof T>(sourcesObject: T): Observable<{
-    [K in keyof T]: ObservedValueOf<T[K]>;
-}>;
-/** @deprecated resultSelector is deprecated, pipe to map instead */
-export declare function forkJoin(...args: Array<ObservableInput<any> | Function>): Observable<any>;
-/** @deprecated Use the version that takes an array of Observables instead */
-export declare function forkJoin<T>(...sources: ObservableInput<T>[]): Observable<T[]>;
diff --git a/node_modules/rxjs/internal/observable/forkJoin.js b/node_modules/rxjs/internal/observable/forkJoin.js
deleted file mode 100644
index 40870ad..0000000
--- a/node_modules/rxjs/internal/observable/forkJoin.js
+++ /dev/null
@@ -1,71 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isArray_1 = require("../util/isArray");
-var map_1 = require("../operators/map");
-var isObject_1 = require("../util/isObject");
-var from_1 = require("./from");
-function forkJoin() {
-    var sources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        sources[_i] = arguments[_i];
-    }
-    if (sources.length === 1) {
-        var first_1 = sources[0];
-        if (isArray_1.isArray(first_1)) {
-            return forkJoinInternal(first_1, null);
-        }
-        if (isObject_1.isObject(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) {
-            var keys = Object.keys(first_1);
-            return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys);
-        }
-    }
-    if (typeof sources[sources.length - 1] === 'function') {
-        var resultSelector_1 = sources.pop();
-        sources = (sources.length === 1 && isArray_1.isArray(sources[0])) ? sources[0] : sources;
-        return forkJoinInternal(sources, null).pipe(map_1.map(function (args) { return resultSelector_1.apply(void 0, args); }));
-    }
-    return forkJoinInternal(sources, null);
-}
-exports.forkJoin = forkJoin;
-function forkJoinInternal(sources, keys) {
-    return new Observable_1.Observable(function (subscriber) {
-        var len = sources.length;
-        if (len === 0) {
-            subscriber.complete();
-            return;
-        }
-        var values = new Array(len);
-        var completed = 0;
-        var emitted = 0;
-        var _loop_1 = function (i) {
-            var source = from_1.from(sources[i]);
-            var hasValue = false;
-            subscriber.add(source.subscribe({
-                next: function (value) {
-                    if (!hasValue) {
-                        hasValue = true;
-                        emitted++;
-                    }
-                    values[i] = value;
-                },
-                error: function (err) { return subscriber.error(err); },
-                complete: function () {
-                    completed++;
-                    if (completed === len || !hasValue) {
-                        if (emitted === len) {
-                            subscriber.next(keys ?
-                                keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) :
-                                values);
-                        }
-                        subscriber.complete();
-                    }
-                }
-            }));
-        };
-        for (var i = 0; i < len; i++) {
-            _loop_1(i);
-        }
-    });
-}
-//# sourceMappingURL=forkJoin.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/forkJoin.js.map b/node_modules/rxjs/internal/observable/forkJoin.js.map
deleted file mode 100644
index 8d99a74..0000000
--- a/node_modules/rxjs/internal/observable/forkJoin.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"forkJoin.js","sources":["../../src/internal/observable/forkJoin.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/observable/from.d.ts b/node_modules/rxjs/internal/observable/from.d.ts
deleted file mode 100644
index 8691d02..0000000
--- a/node_modules/rxjs/internal/observable/from.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput, SchedulerLike, ObservedValueOf } from '../types';
-export declare function from<O extends ObservableInput<any>>(input: O): Observable<ObservedValueOf<O>>;
-/** @deprecated use {@link scheduled} instead. */
-export declare function from<O extends ObservableInput<any>>(input: O, scheduler: SchedulerLike): Observable<ObservedValueOf<O>>;
diff --git a/node_modules/rxjs/internal/observable/from.js b/node_modules/rxjs/internal/observable/from.js
deleted file mode 100644
index 4f6069f..0000000
--- a/node_modules/rxjs/internal/observable/from.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var subscribeTo_1 = require("../util/subscribeTo");
-var scheduled_1 = require("../scheduled/scheduled");
-function from(input, scheduler) {
-    if (!scheduler) {
-        if (input instanceof Observable_1.Observable) {
-            return input;
-        }
-        return new Observable_1.Observable(subscribeTo_1.subscribeTo(input));
-    }
-    else {
-        return scheduled_1.scheduled(input, scheduler);
-    }
-}
-exports.from = from;
-//# sourceMappingURL=from.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/from.js.map b/node_modules/rxjs/internal/observable/from.js.map
deleted file mode 100644
index effad4d..0000000
--- a/node_modules/rxjs/internal/observable/from.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"from.js","sources":["../../src/internal/observable/from.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAC3C,mDAAkD;AAElD,oDAAmD;AAyGnD,SAAgB,IAAI,CAAI,KAAyB,EAAE,SAAyB;IAC1E,IAAI,CAAC,SAAS,EAAE;QACd,IAAI,KAAK,YAAY,uBAAU,EAAE;YAC/B,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,uBAAU,CAAI,yBAAW,CAAC,KAAK,CAAC,CAAC,CAAC;KAC9C;SAAM;QACL,OAAO,qBAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;KACpC;AACH,CAAC;AATD,oBASC"}
diff --git a/node_modules/rxjs/internal/observable/fromArray.d.ts b/node_modules/rxjs/internal/observable/fromArray.d.ts
deleted file mode 100644
index 76b4ffe..0000000
--- a/node_modules/rxjs/internal/observable/fromArray.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-export declare function fromArray<T>(input: ArrayLike<T>, scheduler?: SchedulerLike): Observable<T>;
diff --git a/node_modules/rxjs/internal/observable/fromArray.js b/node_modules/rxjs/internal/observable/fromArray.js
deleted file mode 100644
index 545e587..0000000
--- a/node_modules/rxjs/internal/observable/fromArray.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var subscribeToArray_1 = require("../util/subscribeToArray");
-var scheduleArray_1 = require("../scheduled/scheduleArray");
-function fromArray(input, scheduler) {
-    if (!scheduler) {
-        return new Observable_1.Observable(subscribeToArray_1.subscribeToArray(input));
-    }
-    else {
-        return scheduleArray_1.scheduleArray(input, scheduler);
-    }
-}
-exports.fromArray = fromArray;
-//# sourceMappingURL=fromArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/fromArray.js.map b/node_modules/rxjs/internal/observable/fromArray.js.map
deleted file mode 100644
index a1dde84..0000000
--- a/node_modules/rxjs/internal/observable/fromArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromArray.js","sources":["../../src/internal/observable/fromArray.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAE3C,6DAA4D;AAC5D,4DAA2D;AAE3D,SAAgB,SAAS,CAAI,KAAmB,EAAE,SAAyB;IACzE,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,uBAAU,CAAI,mCAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;KACnD;SAAM;QACL,OAAO,6BAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;KACxC;AACH,CAAC;AAND,8BAMC"}
diff --git a/node_modules/rxjs/internal/observable/fromEvent.d.ts b/node_modules/rxjs/internal/observable/fromEvent.d.ts
deleted file mode 100644
index a093358..0000000
--- a/node_modules/rxjs/internal/observable/fromEvent.d.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { Observable } from '../Observable';
-export interface NodeStyleEventEmitter {
-    addListener: (eventName: string | symbol, handler: NodeEventHandler) => this;
-    removeListener: (eventName: string | symbol, handler: NodeEventHandler) => this;
-}
-export declare type NodeEventHandler = (...args: any[]) => void;
-export interface NodeCompatibleEventEmitter {
-    addListener: (eventName: string, handler: NodeEventHandler) => void | {};
-    removeListener: (eventName: string, handler: NodeEventHandler) => void | {};
-}
-export interface JQueryStyleEventEmitter {
-    on: (eventName: string, handler: Function) => void;
-    off: (eventName: string, handler: Function) => void;
-}
-export interface HasEventTargetAddRemove<E> {
-    addEventListener(type: string, listener: ((evt: E) => void) | null, options?: boolean | AddEventListenerOptions): void;
-    removeEventListener(type: string, listener?: ((evt: E) => void) | null, options?: EventListenerOptions | boolean): void;
-}
-export declare type EventTargetLike<T> = HasEventTargetAddRemove<T> | NodeStyleEventEmitter | NodeCompatibleEventEmitter | JQueryStyleEventEmitter;
-export declare type FromEventTarget<T> = EventTargetLike<T> | ArrayLike<EventTargetLike<T>>;
-export interface EventListenerOptions {
-    capture?: boolean;
-    passive?: boolean;
-    once?: boolean;
-}
-export interface AddEventListenerOptions extends EventListenerOptions {
-    once?: boolean;
-    passive?: boolean;
-}
-export declare function fromEvent<T>(target: FromEventTarget<T>, eventName: string): Observable<T>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function fromEvent<T>(target: FromEventTarget<T>, eventName: string, resultSelector: (...args: any[]) => T): Observable<T>;
-export declare function fromEvent<T>(target: FromEventTarget<T>, eventName: string, options: EventListenerOptions): Observable<T>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function fromEvent<T>(target: FromEventTarget<T>, eventName: string, options: EventListenerOptions, resultSelector: (...args: any[]) => T): Observable<T>;
diff --git a/node_modules/rxjs/internal/observable/fromEvent.js b/node_modules/rxjs/internal/observable/fromEvent.js
deleted file mode 100644
index 5355c43..0000000
--- a/node_modules/rxjs/internal/observable/fromEvent.js
+++ /dev/null
@@ -1,65 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isArray_1 = require("../util/isArray");
-var isFunction_1 = require("../util/isFunction");
-var map_1 = require("../operators/map");
-var toString = (function () { return Object.prototype.toString; })();
-function fromEvent(target, eventName, options, resultSelector) {
-    if (isFunction_1.isFunction(options)) {
-        resultSelector = options;
-        options = undefined;
-    }
-    if (resultSelector) {
-        return fromEvent(target, eventName, options).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        function handler(e) {
-            if (arguments.length > 1) {
-                subscriber.next(Array.prototype.slice.call(arguments));
-            }
-            else {
-                subscriber.next(e);
-            }
-        }
-        setupSubscription(target, eventName, handler, subscriber, options);
-    });
-}
-exports.fromEvent = fromEvent;
-function setupSubscription(sourceObj, eventName, handler, subscriber, options) {
-    var unsubscribe;
-    if (isEventTarget(sourceObj)) {
-        var source_1 = sourceObj;
-        sourceObj.addEventListener(eventName, handler, options);
-        unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); };
-    }
-    else if (isJQueryStyleEventEmitter(sourceObj)) {
-        var source_2 = sourceObj;
-        sourceObj.on(eventName, handler);
-        unsubscribe = function () { return source_2.off(eventName, handler); };
-    }
-    else if (isNodeStyleEventEmitter(sourceObj)) {
-        var source_3 = sourceObj;
-        sourceObj.addListener(eventName, handler);
-        unsubscribe = function () { return source_3.removeListener(eventName, handler); };
-    }
-    else if (sourceObj && sourceObj.length) {
-        for (var i = 0, len = sourceObj.length; i < len; i++) {
-            setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
-        }
-    }
-    else {
-        throw new TypeError('Invalid event target');
-    }
-    subscriber.add(unsubscribe);
-}
-function isNodeStyleEventEmitter(sourceObj) {
-    return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';
-}
-function isJQueryStyleEventEmitter(sourceObj) {
-    return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';
-}
-function isEventTarget(sourceObj) {
-    return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
-}
-//# sourceMappingURL=fromEvent.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/fromEvent.js.map b/node_modules/rxjs/internal/observable/fromEvent.js.map
deleted file mode 100644
index 9e948ef..0000000
--- a/node_modules/rxjs/internal/observable/fromEvent.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromEvent.js","sources":["../../src/internal/observable/fromEvent.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAC3C,2CAA0C;AAC1C,iDAAgD;AAEhD,wCAAuC;AAEvC,IAAM,QAAQ,GAAa,CAAC,cAAM,OAAA,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAzB,CAAyB,CAAC,EAAE,CAAC;AA0K/D,SAAgB,SAAS,CACvB,MAA0B,EAC1B,SAAiB,EACjB,OAAwD,EACxD,cAAwC;IAGxC,IAAI,uBAAU,CAAC,OAAO,CAAC,EAAE;QAEvB,cAAc,GAAG,OAAO,CAAC;QACzB,OAAO,GAAG,SAAS,CAAC;KACrB;IACD,IAAI,cAAc,EAAE;QAElB,OAAO,SAAS,CAAI,MAAM,EAAE,SAAS,EAAoC,OAAO,CAAC,CAAC,IAAI,CACpF,SAAG,CAAC,UAAA,IAAI,IAAI,OAAA,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,eAAI,IAAI,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EAA9D,CAA8D,CAAC,CAC5E,CAAC;KACH;IAED,OAAO,IAAI,uBAAU,CAAI,UAAA,UAAU;QACjC,SAAS,OAAO,CAAC,CAAI;YACnB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;aACxD;iBAAM;gBACL,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACpB;QACH,CAAC;QACD,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAA+B,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;AACL,CAAC;AA7BD,8BA6BC;AAED,SAAS,iBAAiB,CAAI,SAA6B,EAAE,SAAiB,EAChD,OAAiC,EAAE,UAAyB,EAC5D,OAA8B;IAC1D,IAAI,WAAuB,CAAC;IAC5B,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE;QAC5B,IAAM,QAAM,GAAG,SAAS,CAAC;QACzB,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxD,WAAW,GAAG,cAAM,OAAA,QAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAvD,CAAuD,CAAC;KAC7E;SAAM,IAAI,yBAAyB,CAAC,SAAS,CAAC,EAAE;QAC/C,IAAM,QAAM,GAAG,SAAS,CAAC;QACzB,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjC,WAAW,GAAG,cAAM,OAAA,QAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,EAA9B,CAA8B,CAAC;KACpD;SAAM,IAAI,uBAAuB,CAAC,SAAS,CAAC,EAAE;QAC7C,IAAM,QAAM,GAAG,SAAS,CAAC;QACzB,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,OAA2B,CAAC,CAAC;QAC9D,WAAW,GAAG,cAAM,OAAA,QAAM,CAAC,cAAc,CAAC,SAAS,EAAE,OAA2B,CAAC,EAA7D,CAA6D,CAAC;KACnF;SAAM,IAAI,SAAS,IAAK,SAAiB,CAAC,MAAM,EAAE;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAI,SAAiB,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YAC7D,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;SAC1E;KACF;SAAM;QACL,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;KAC7C;IAED,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,uBAAuB,CAAC,SAAc;IAC7C,OAAO,SAAS,IAAI,OAAO,SAAS,CAAC,WAAW,KAAK,UAAU,IAAI,OAAO,SAAS,CAAC,cAAc,KAAK,UAAU,CAAC;AACpH,CAAC;AAED,SAAS,yBAAyB,CAAC,SAAc;IAC/C,OAAO,SAAS,IAAI,OAAO,SAAS,CAAC,EAAE,KAAK,UAAU,IAAI,OAAO,SAAS,CAAC,GAAG,KAAK,UAAU,CAAC;AAChG,CAAC;AAED,SAAS,aAAa,CAAC,SAAc;IACnC,OAAO,SAAS,IAAI,OAAO,SAAS,CAAC,gBAAgB,KAAK,UAAU,IAAI,OAAO,SAAS,CAAC,mBAAmB,KAAK,UAAU,CAAC;AAC9H,CAAC"}
diff --git a/node_modules/rxjs/internal/observable/fromEventPattern.d.ts b/node_modules/rxjs/internal/observable/fromEventPattern.d.ts
deleted file mode 100644
index e8b8247..0000000
--- a/node_modules/rxjs/internal/observable/fromEventPattern.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { Observable } from '../Observable';
-import { NodeEventHandler } from './fromEvent';
-export declare function fromEventPattern<T>(addHandler: (handler: NodeEventHandler) => any, removeHandler?: (handler: NodeEventHandler, signal?: any) => void): Observable<T>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export declare function fromEventPattern<T>(addHandler: (handler: NodeEventHandler) => any, removeHandler?: (handler: NodeEventHandler, signal?: any) => void, resultSelector?: (...args: any[]) => T): Observable<T>;
diff --git a/node_modules/rxjs/internal/observable/fromEventPattern.js b/node_modules/rxjs/internal/observable/fromEventPattern.js
deleted file mode 100644
index 6cb21b1..0000000
--- a/node_modules/rxjs/internal/observable/fromEventPattern.js
+++ /dev/null
@@ -1,34 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isArray_1 = require("../util/isArray");
-var isFunction_1 = require("../util/isFunction");
-var map_1 = require("../operators/map");
-function fromEventPattern(addHandler, removeHandler, resultSelector) {
-    if (resultSelector) {
-        return fromEventPattern(addHandler, removeHandler).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var handler = function () {
-            var e = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                e[_i] = arguments[_i];
-            }
-            return subscriber.next(e.length === 1 ? e[0] : e);
-        };
-        var retValue;
-        try {
-            retValue = addHandler(handler);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        if (!isFunction_1.isFunction(removeHandler)) {
-            return undefined;
-        }
-        return function () { return removeHandler(handler, retValue); };
-    });
-}
-exports.fromEventPattern = fromEventPattern;
-//# sourceMappingURL=fromEventPattern.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/fromEventPattern.js.map b/node_modules/rxjs/internal/observable/fromEventPattern.js.map
deleted file mode 100644
index f49bcb0..0000000
--- a/node_modules/rxjs/internal/observable/fromEventPattern.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromEventPattern.js","sources":["../../src/internal/observable/fromEventPattern.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAC3C,2CAA0C;AAC1C,iDAAgD;AAEhD,wCAAuC;AAwIvC,SAAgB,gBAAgB,CAAI,UAA8C,EAC9C,aAAiE,EACjE,cAAsC;IAExE,IAAI,cAAc,EAAE;QAElB,OAAO,gBAAgB,CAAI,UAAU,EAAE,aAAa,CAAC,CAAC,IAAI,CACxD,SAAG,CAAC,UAAA,IAAI,IAAI,OAAA,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,eAAI,IAAI,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EAA9D,CAA8D,CAAC,CAC5E,CAAC;KACH;IAED,OAAO,IAAI,uBAAU,CAAU,UAAA,UAAU;QACvC,IAAM,OAAO,GAAG;YAAC,WAAS;iBAAT,UAAS,EAAT,qBAAS,EAAT,IAAS;gBAAT,sBAAS;;YAAK,OAAA,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAA1C,CAA0C,CAAC;QAE1E,IAAI,QAAa,CAAC;QAClB,IAAI;YACF,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;SAChC;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,CAAC,uBAAU,CAAC,aAAa,CAAC,EAAE;YAC9B,OAAO,SAAS,CAAC;SAClB;QAED,OAAO,cAAM,OAAA,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAhC,CAAgC,CAAE;IACjD,CAAC,CAAC,CAAC;AACL,CAAC;AA5BD,4CA4BC"}
diff --git a/node_modules/rxjs/internal/observable/fromIterable.d.ts b/node_modules/rxjs/internal/observable/fromIterable.d.ts
deleted file mode 100644
index f36d19a..0000000
--- a/node_modules/rxjs/internal/observable/fromIterable.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-export declare function fromIterable<T>(input: Iterable<T>, scheduler?: SchedulerLike): Observable<T>;
diff --git a/node_modules/rxjs/internal/observable/fromIterable.js b/node_modules/rxjs/internal/observable/fromIterable.js
deleted file mode 100644
index 8d319a4..0000000
--- a/node_modules/rxjs/internal/observable/fromIterable.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var subscribeToIterable_1 = require("../util/subscribeToIterable");
-var scheduleIterable_1 = require("../scheduled/scheduleIterable");
-function fromIterable(input, scheduler) {
-    if (!input) {
-        throw new Error('Iterable cannot be null');
-    }
-    if (!scheduler) {
-        return new Observable_1.Observable(subscribeToIterable_1.subscribeToIterable(input));
-    }
-    else {
-        return scheduleIterable_1.scheduleIterable(input, scheduler);
-    }
-}
-exports.fromIterable = fromIterable;
-//# sourceMappingURL=fromIterable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/fromIterable.js.map b/node_modules/rxjs/internal/observable/fromIterable.js.map
deleted file mode 100644
index 59e88a4..0000000
--- a/node_modules/rxjs/internal/observable/fromIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromIterable.js","sources":["../../src/internal/observable/fromIterable.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAE3C,mEAAkE;AAClE,kEAAiE;AAEjE,SAAgB,YAAY,CAAI,KAAkB,EAAE,SAAyB;IAC3E,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;KAC5C;IACD,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,uBAAU,CAAI,yCAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;KACtD;SAAM;QACL,OAAO,mCAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;KAC3C;AACH,CAAC;AATD,oCASC"}
diff --git a/node_modules/rxjs/internal/observable/fromPromise.d.ts b/node_modules/rxjs/internal/observable/fromPromise.d.ts
deleted file mode 100644
index 2220b09..0000000
--- a/node_modules/rxjs/internal/observable/fromPromise.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-export declare function fromPromise<T>(input: PromiseLike<T>, scheduler?: SchedulerLike): Observable<T>;
diff --git a/node_modules/rxjs/internal/observable/fromPromise.js b/node_modules/rxjs/internal/observable/fromPromise.js
deleted file mode 100644
index 2d15d4c..0000000
--- a/node_modules/rxjs/internal/observable/fromPromise.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var subscribeToPromise_1 = require("../util/subscribeToPromise");
-var schedulePromise_1 = require("../scheduled/schedulePromise");
-function fromPromise(input, scheduler) {
-    if (!scheduler) {
-        return new Observable_1.Observable(subscribeToPromise_1.subscribeToPromise(input));
-    }
-    else {
-        return schedulePromise_1.schedulePromise(input, scheduler);
-    }
-}
-exports.fromPromise = fromPromise;
-//# sourceMappingURL=fromPromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/fromPromise.js.map b/node_modules/rxjs/internal/observable/fromPromise.js.map
deleted file mode 100644
index c4a2fdf..0000000
--- a/node_modules/rxjs/internal/observable/fromPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromPromise.js","sources":["../../src/internal/observable/fromPromise.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAE3C,iEAAgE;AAChE,gEAA+D;AAE/D,SAAgB,WAAW,CAAI,KAAqB,EAAE,SAAyB;IAC7E,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,uBAAU,CAAI,uCAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;KACrD;SAAM;QACL,OAAO,iCAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;KAC1C;AACH,CAAC;AAND,kCAMC"}
diff --git a/node_modules/rxjs/internal/observable/generate.d.ts b/node_modules/rxjs/internal/observable/generate.d.ts
deleted file mode 100644
index 301c39d..0000000
--- a/node_modules/rxjs/internal/observable/generate.d.ts
+++ /dev/null
@@ -1,231 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-export declare type ConditionFunc<S> = (state: S) => boolean;
-export declare type IterateFunc<S> = (state: S) => S;
-export declare type ResultFunc<S, T> = (state: S) => T;
-export interface GenerateBaseOptions<S> {
-    /**
-     * Initial state.
-     */
-    initialState: S;
-    /**
-     * Condition function that accepts state and returns boolean.
-     * When it returns false, the generator stops.
-     * If not specified, a generator never stops.
-     */
-    condition?: ConditionFunc<S>;
-    /**
-     * Iterate function that accepts state and returns new state.
-     */
-    iterate: IterateFunc<S>;
-    /**
-     * SchedulerLike to use for generation process.
-     * By default, a generator starts immediately.
-     */
-    scheduler?: SchedulerLike;
-}
-export interface GenerateOptions<T, S> extends GenerateBaseOptions<S> {
-    /**
-     * Result selection function that accepts state and returns a value to emit.
-     */
-    resultSelector: ResultFunc<S, T>;
-}
-/**
- * Generates an observable sequence by running a state-driven loop
- * producing the sequence's elements, using the specified scheduler
- * to send out observer messages.
- *
- * ![](generate.png)
- *
- * @example <caption>Produces sequence of 0, 1, 2, ... 9, then completes.</caption>
- * const res = generate(0, x => x < 10, x => x + 1, x => x);
- *
- * @example <caption>Using asap scheduler, produces sequence of 2, 3, 5, then completes.</caption>
- * const res = generate(1, x => x < 5, x => x * 2, x => x + 1, asap);
- *
- * @see {@link from}
- * @see {@link Observable}
- *
- * @param {S} initialState Initial state.
- * @param {function (state: S): boolean} condition Condition to terminate generation (upon returning false).
- * @param {function (state: S): S} iterate Iteration step function.
- * @param {function (state: S): T} resultSelector Selector function for results produced in the sequence. (deprecated)
- * @param {SchedulerLike} [scheduler] A {@link SchedulerLike} on which to run the generator loop. If not provided, defaults to emit immediately.
- * @returns {Observable<T>} The generated sequence.
- */
-export declare function generate<T, S>(initialState: S, condition: ConditionFunc<S>, iterate: IterateFunc<S>, resultSelector: ResultFunc<S, T>, scheduler?: SchedulerLike): Observable<T>;
-/**
- * Generates an Observable by running a state-driven loop
- * that emits an element on each iteration.
- *
- * <span class="informal">Use it instead of nexting values in a for loop.</span>
- *
- * <img src="./img/generate.png" width="100%">
- *
- * `generate` allows you to create stream of values generated with a loop very similar to
- * traditional for loop. First argument of `generate` is a beginning value. Second argument
- * is a function that accepts this value and tests if some condition still holds. If it does,
- * loop continues, if not, it stops. Third value is a function which takes previously defined
- * value and modifies it in some way on each iteration. Note how these three parameters
- * are direct equivalents of three expressions in regular for loop: first expression
- * initializes some state (for example numeric index), second tests if loop can make next
- * iteration (for example if index is lower than 10) and third states how defined value
- * will be modified on every step (index will be incremented by one).
- *
- * Return value of a `generate` operator is an Observable that on each loop iteration
- * emits a value. First, condition function is ran. If it returned true, Observable
- * emits currently stored value (initial value at the first iteration) and then updates
- * that value with iterate function. If at some point condition returned false, Observable
- * completes at that moment.
- *
- * Optionally you can pass fourth parameter to `generate` - a result selector function which allows you
- * to immediately map value that would normally be emitted by an Observable.
- *
- * If you find three anonymous functions in `generate` call hard to read, you can provide
- * single object to the operator instead. That object has properties: `initialState`,
- * `condition`, `iterate` and `resultSelector`, which should have respective values that you
- * would normally pass to `generate`. `resultSelector` is still optional, but that form
- * of calling `generate` allows you to omit `condition` as well. If you omit it, that means
- * condition always holds, so output Observable will never complete.
- *
- * Both forms of `generate` can optionally accept a scheduler. In case of multi-parameter call,
- * scheduler simply comes as a last argument (no matter if there is resultSelector
- * function or not). In case of single-parameter call, you can provide it as a
- * `scheduler` property on object passed to the operator. In both cases scheduler decides when
- * next iteration of the loop will happen and therefore when next value will be emitted
- * by the Observable. For example to ensure that each value is pushed to the observer
- * on separate task in event loop, you could use `async` scheduler. Note that
- * by default (when no scheduler is passed) values are simply emitted synchronously.
- *
- *
- * @example <caption>Use with condition and iterate functions.</caption>
- * const generated = generate(0, x => x < 3, x => x + 1);
- *
- * generated.subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('Yo!')
- * );
- *
- * // Logs:
- * // 0
- * // 1
- * // 2
- * // "Yo!"
- *
- *
- * @example <caption>Use with condition, iterate and resultSelector functions.</caption>
- * const generated = generate(0, x => x < 3, x => x + 1, x => x * 1000);
- *
- * generated.subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('Yo!')
- * );
- *
- * // Logs:
- * // 0
- * // 1000
- * // 2000
- * // "Yo!"
- *
- *
- * @example <caption>Use with options object.</caption>
- * const generated = generate({
- *   initialState: 0,
- *   condition(value) { return value < 3; },
- *   iterate(value) { return value + 1; },
- *   resultSelector(value) { return value * 1000; }
- * });
- *
- * generated.subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('Yo!')
- * );
- *
- * // Logs:
- * // 0
- * // 1000
- * // 2000
- * // "Yo!"
- *
- * @example <caption>Use options object without condition function.</caption>
- * const generated = generate({
- *   initialState: 0,
- *   iterate(value) { return value + 1; },
- *   resultSelector(value) { return value * 1000; }
- * });
- *
- * generated.subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('Yo!') // This will never run.
- * );
- *
- * // Logs:
- * // 0
- * // 1000
- * // 2000
- * // 3000
- * // ...and never stops.
- *
- *
- * @see {@link from}
- * @see {@link index/Observable.create}
- *
- * @param {S} initialState Initial state.
- * @param {function (state: S): boolean} condition Condition to terminate generation (upon returning false).
- * @param {function (state: S): S} iterate Iteration step function.
- * @param {function (state: S): T} [resultSelector] Selector function for results produced in the sequence.
- * @param {Scheduler} [scheduler] A {@link Scheduler} on which to run the generator loop. If not provided, defaults to emitting immediately.
- * @return {Observable<T>} The generated sequence.
- */
-export declare function generate<S>(initialState: S, condition: ConditionFunc<S>, iterate: IterateFunc<S>, scheduler?: SchedulerLike): Observable<S>;
-/**
- * Generates an observable sequence by running a state-driven loop
- * producing the sequence's elements, using the specified scheduler
- * to send out observer messages.
- * The overload accepts options object that might contain initial state, iterate,
- * condition and scheduler.
- *
- * ![](generate.png)
- *
- * @example <caption>Produces sequence of 0, 1, 2, ... 9, then completes.</caption>
- * const res = generate({
- *   initialState: 0,
- *   condition: x => x < 10,
- *   iterate: x => x + 1,
- * });
- *
- * @see {@link from}
- * @see {@link Observable}
- *
- * @param {GenerateBaseOptions<S>} options Object that must contain initialState, iterate and might contain condition and scheduler.
- * @returns {Observable<S>} The generated sequence.
- */
-export declare function generate<S>(options: GenerateBaseOptions<S>): Observable<S>;
-/**
- * Generates an observable sequence by running a state-driven loop
- * producing the sequence's elements, using the specified scheduler
- * to send out observer messages.
- * The overload accepts options object that might contain initial state, iterate,
- * condition, result selector and scheduler.
- *
- * ![](generate.png)
- *
- * @example <caption>Produces sequence of 0, 1, 2, ... 9, then completes.</caption>
- * const res = generate({
- *   initialState: 0,
- *   condition: x => x < 10,
- *   iterate: x => x + 1,
- *   resultSelector: x => x,
- * });
- *
- * @see {@link from}
- * @see {@link Observable}
- *
- * @param {GenerateOptions<T, S>} options Object that must contain initialState, iterate, resultSelector and might contain condition and scheduler.
- * @returns {Observable<T>} The generated sequence.
- */
-export declare function generate<T, S>(options: GenerateOptions<T, S>): Observable<T>;
diff --git a/node_modules/rxjs/internal/observable/generate.js b/node_modules/rxjs/internal/observable/generate.js
deleted file mode 100644
index 4aa193e..0000000
--- a/node_modules/rxjs/internal/observable/generate.js
+++ /dev/null
@@ -1,127 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var identity_1 = require("../util/identity");
-var isScheduler_1 = require("../util/isScheduler");
-function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {
-    var resultSelector;
-    var initialState;
-    if (arguments.length == 1) {
-        var options = initialStateOrOptions;
-        initialState = options.initialState;
-        condition = options.condition;
-        iterate = options.iterate;
-        resultSelector = options.resultSelector || identity_1.identity;
-        scheduler = options.scheduler;
-    }
-    else if (resultSelectorOrObservable === undefined || isScheduler_1.isScheduler(resultSelectorOrObservable)) {
-        initialState = initialStateOrOptions;
-        resultSelector = identity_1.identity;
-        scheduler = resultSelectorOrObservable;
-    }
-    else {
-        initialState = initialStateOrOptions;
-        resultSelector = resultSelectorOrObservable;
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var state = initialState;
-        if (scheduler) {
-            return scheduler.schedule(dispatch, 0, {
-                subscriber: subscriber,
-                iterate: iterate,
-                condition: condition,
-                resultSelector: resultSelector,
-                state: state
-            });
-        }
-        do {
-            if (condition) {
-                var conditionResult = void 0;
-                try {
-                    conditionResult = condition(state);
-                }
-                catch (err) {
-                    subscriber.error(err);
-                    return undefined;
-                }
-                if (!conditionResult) {
-                    subscriber.complete();
-                    break;
-                }
-            }
-            var value = void 0;
-            try {
-                value = resultSelector(state);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-            subscriber.next(value);
-            if (subscriber.closed) {
-                break;
-            }
-            try {
-                state = iterate(state);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-        } while (true);
-        return undefined;
-    });
-}
-exports.generate = generate;
-function dispatch(state) {
-    var subscriber = state.subscriber, condition = state.condition;
-    if (subscriber.closed) {
-        return undefined;
-    }
-    if (state.needIterate) {
-        try {
-            state.state = state.iterate(state.state);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-    }
-    else {
-        state.needIterate = true;
-    }
-    if (condition) {
-        var conditionResult = void 0;
-        try {
-            conditionResult = condition(state.state);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        if (!conditionResult) {
-            subscriber.complete();
-            return undefined;
-        }
-        if (subscriber.closed) {
-            return undefined;
-        }
-    }
-    var value;
-    try {
-        value = state.resultSelector(state.state);
-    }
-    catch (err) {
-        subscriber.error(err);
-        return undefined;
-    }
-    if (subscriber.closed) {
-        return undefined;
-    }
-    subscriber.next(value);
-    if (subscriber.closed) {
-        return undefined;
-    }
-    return this.schedule(state);
-}
-//# sourceMappingURL=generate.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/generate.js.map b/node_modules/rxjs/internal/observable/generate.js.map
deleted file mode 100644
index 9286ebf..0000000
--- a/node_modules/rxjs/internal/observable/generate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"generate.js","sources":["../../src/internal/observable/generate.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/observable/iif.d.ts b/node_modules/rxjs/internal/observable/iif.d.ts
deleted file mode 100644
index 2efbe10..0000000
--- a/node_modules/rxjs/internal/observable/iif.d.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import { Observable } from '../Observable';
-import { SubscribableOrPromise } from '../types';
-/**
- * Decides at subscription time which Observable will actually be subscribed.
- *
- * <span class="informal">`If` statement for Observables.</span>
- *
- * `iif` accepts a condition function and two Observables. When
- * an Observable returned by the operator is subscribed, condition function will be called.
- * Based on what boolean it returns at that moment, consumer will subscribe either to
- * the first Observable (if condition was true) or to the second (if condition was false). Condition
- * function may also not return anything - in that case condition will be evaluated as false and
- * second Observable will be subscribed.
- *
- * Note that Observables for both cases (true and false) are optional. If condition points to an Observable that
- * was left undefined, resulting stream will simply complete immediately. That allows you to, rather
- * than controlling which Observable will be subscribed, decide at runtime if consumer should have access
- * to given Observable or not.
- *
- * If you have more complex logic that requires decision between more than two Observables, {@link defer}
- * will probably be a better choice. Actually `iif` can be easily implemented with {@link defer}
- * and exists only for convenience and readability reasons.
- *
- *
- * ## Examples
- * ### Change at runtime which Observable will be subscribed
- * ```ts
- * import { iif, of } from 'rxjs';
- *
- * let subscribeToFirst;
- * const firstOrSecond = iif(
- *   () => subscribeToFirst,
- *   of('first'),
- *   of('second'),
- * );
- *
- * subscribeToFirst = true;
- * firstOrSecond.subscribe(value => console.log(value));
- *
- * // Logs:
- * // "first"
- *
- * subscribeToFirst = false;
- * firstOrSecond.subscribe(value => console.log(value));
- *
- * // Logs:
- * // "second"
- *
- * ```
- *
- * ### Control an access to an Observable
- * ```ts
- * let accessGranted;
- * const observableIfYouHaveAccess = iif(
- *   () => accessGranted,
- *   of('It seems you have an access...'), // Note that only one Observable is passed to the operator.
- * );
- *
- * accessGranted = true;
- * observableIfYouHaveAccess.subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('The end'),
- * );
- *
- * // Logs:
- * // "It seems you have an access..."
- * // "The end"
- *
- * accessGranted = false;
- * observableIfYouHaveAccess.subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('The end'),
- * );
- *
- * // Logs:
- * // "The end"
- * ```
- *
- * @see {@link defer}
- *
- * @param {function(): boolean} condition Condition which Observable should be chosen.
- * @param {Observable} [trueObservable] An Observable that will be subscribed if condition is true.
- * @param {Observable} [falseObservable] An Observable that will be subscribed if condition is false.
- * @return {Observable} Either first or second Observable, depending on condition.
- * @static true
- * @name iif
- * @owner Observable
-*/
-export declare function iif<T = never, F = never>(condition: () => boolean, trueResult?: SubscribableOrPromise<T>, falseResult?: SubscribableOrPromise<F>): Observable<T | F>;
diff --git a/node_modules/rxjs/internal/observable/iif.js b/node_modules/rxjs/internal/observable/iif.js
deleted file mode 100644
index 48341d5..0000000
--- a/node_modules/rxjs/internal/observable/iif.js
+++ /dev/null
@@ -1,11 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var defer_1 = require("./defer");
-var empty_1 = require("./empty");
-function iif(condition, trueResult, falseResult) {
-    if (trueResult === void 0) { trueResult = empty_1.EMPTY; }
-    if (falseResult === void 0) { falseResult = empty_1.EMPTY; }
-    return defer_1.defer(function () { return condition() ? trueResult : falseResult; });
-}
-exports.iif = iif;
-//# sourceMappingURL=iif.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/iif.js.map b/node_modules/rxjs/internal/observable/iif.js.map
deleted file mode 100644
index 0b39bff..0000000
--- a/node_modules/rxjs/internal/observable/iif.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"iif.js","sources":["../../src/internal/observable/iif.ts"],"names":[],"mappings":";;AACA,iCAAgC;AAChC,iCAAgC;AA2FhC,SAAgB,GAAG,CACjB,SAAwB,EACxB,UAA4C,EAC5C,WAA6C;IAD7C,2BAAA,EAAA,aAAuC,aAAK;IAC5C,4BAAA,EAAA,cAAwC,aAAK;IAE7C,OAAO,aAAK,CAAC,cAAM,OAAA,SAAS,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAtC,CAAsC,CAAC,CAAC;AAC7D,CAAC;AAND,kBAMC"}
diff --git a/node_modules/rxjs/internal/observable/interval.d.ts b/node_modules/rxjs/internal/observable/interval.d.ts
deleted file mode 100644
index 3881ab9..0000000
--- a/node_modules/rxjs/internal/observable/interval.d.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-/**
- * Creates an Observable that emits sequential numbers every specified
- * interval of time, on a specified {@link SchedulerLike}.
- *
- * <span class="informal">Emits incremental numbers periodically in time.
- * </span>
- *
- * ![](interval.png)
- *
- * `interval` returns an Observable that emits an infinite sequence of
- * ascending integers, with a constant interval of time of your choosing
- * between those emissions. The first emission is not sent immediately, but
- * only after the first period has passed. By default, this operator uses the
- * `async` {@link SchedulerLike} to provide a notion of time, but you may pass any
- * {@link SchedulerLike} to it.
- *
- * ## Example
- * Emits ascending numbers, one every second (1000ms) up to the number 3
- * ```ts
- * import { interval } from 'rxjs';
- * import { take } from 'rxjs/operators';
- *
- * const numbers = interval(1000);
- *
- * const takeFourNumbers = numbers.pipe(take(4));
- *
- * takeFourNumbers.subscribe(x => console.log('Next: ', x));
- *
- * // Logs:
- * // Next: 0
- * // Next: 1
- * // Next: 2
- * // Next: 3
- * ```
- *
- * @see {@link timer}
- * @see {@link delay}
- *
- * @param {number} [period=0] The interval size in milliseconds (by default)
- * or the time unit determined by the scheduler's clock.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for scheduling
- * the emission of values, and providing a notion of "time".
- * @return {Observable} An Observable that emits a sequential number each time
- * interval.
- * @static true
- * @name interval
- * @owner Observable
- */
-export declare function interval(period?: number, scheduler?: SchedulerLike): Observable<number>;
diff --git a/node_modules/rxjs/internal/observable/interval.js b/node_modules/rxjs/internal/observable/interval.js
deleted file mode 100644
index 7e8a836..0000000
--- a/node_modules/rxjs/internal/observable/interval.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var async_1 = require("../scheduler/async");
-var isNumeric_1 = require("../util/isNumeric");
-function interval(period, scheduler) {
-    if (period === void 0) { period = 0; }
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    if (!isNumeric_1.isNumeric(period) || period < 0) {
-        period = 0;
-    }
-    if (!scheduler || typeof scheduler.schedule !== 'function') {
-        scheduler = async_1.async;
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period }));
-        return subscriber;
-    });
-}
-exports.interval = interval;
-function dispatch(state) {
-    var subscriber = state.subscriber, counter = state.counter, period = state.period;
-    subscriber.next(counter);
-    this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period);
-}
-//# sourceMappingURL=interval.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/interval.js.map b/node_modules/rxjs/internal/observable/interval.js.map
deleted file mode 100644
index b0d3b87..0000000
--- a/node_modules/rxjs/internal/observable/interval.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"interval.js","sources":["../../src/internal/observable/interval.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAC3C,4CAA2C;AAE3C,+CAA8C;AAmD9C,SAAgB,QAAQ,CAAC,MAAU,EACV,SAAgC;IADhC,uBAAA,EAAA,UAAU;IACV,0BAAA,EAAA,YAA2B,aAAK;IACvD,IAAI,CAAC,qBAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE;QACpC,MAAM,GAAG,CAAC,CAAC;KACZ;IAED,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,CAAC,QAAQ,KAAK,UAAU,EAAE;QAC1D,SAAS,GAAG,aAAK,CAAC;KACnB;IAED,OAAO,IAAI,uBAAU,CAAS,UAAA,UAAU;QACtC,UAAU,CAAC,GAAG,CACZ,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,YAAA,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,QAAA,EAAE,CAAC,CACzE,CAAC;QACF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC;AAhBD,4BAgBC;AAED,SAAS,QAAQ,CAAuC,KAAoB;IAClE,IAAA,6BAAU,EAAE,uBAAO,EAAE,qBAAM,CAAW;IAC9C,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,YAAA,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,MAAM,QAAA,EAAE,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC"}
diff --git a/node_modules/rxjs/internal/observable/merge.d.ts b/node_modules/rxjs/internal/observable/merge.d.ts
deleted file mode 100644
index 14bf24e..0000000
--- a/node_modules/rxjs/internal/observable/merge.d.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput, SchedulerLike } from '../types';
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T>(v1: ObservableInput<T>, scheduler: SchedulerLike): Observable<T>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T>(v1: ObservableInput<T>, concurrent: number, scheduler: SchedulerLike): Observable<T>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T, T2>(v1: ObservableInput<T>, v2: ObservableInput<T2>, scheduler: SchedulerLike): Observable<T | T2>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T, T2>(v1: ObservableInput<T>, v2: ObservableInput<T2>, concurrent: number, scheduler: SchedulerLike): Observable<T | T2>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, scheduler: SchedulerLike): Observable<T | T2 | T3>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, concurrent: number, scheduler: SchedulerLike): Observable<T | T2 | T3>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, concurrent: number, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T, T2, T3, T4, T5>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T, T2, T3, T4, T5>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, concurrent: number, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T, T2, T3, T4, T5, T6>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5 | T6>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T, T2, T3, T4, T5, T6>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, concurrent: number, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5 | T6>;
-export declare function merge<T>(v1: ObservableInput<T>): Observable<T>;
-export declare function merge<T>(v1: ObservableInput<T>, concurrent?: number): Observable<T>;
-export declare function merge<T, T2>(v1: ObservableInput<T>, v2: ObservableInput<T2>): Observable<T | T2>;
-export declare function merge<T, T2>(v1: ObservableInput<T>, v2: ObservableInput<T2>, concurrent?: number): Observable<T | T2>;
-export declare function merge<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>): Observable<T | T2 | T3>;
-export declare function merge<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, concurrent?: number): Observable<T | T2 | T3>;
-export declare function merge<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<T | T2 | T3 | T4>;
-export declare function merge<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, concurrent?: number): Observable<T | T2 | T3 | T4>;
-export declare function merge<T, T2, T3, T4, T5>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): Observable<T | T2 | T3 | T4 | T5>;
-export declare function merge<T, T2, T3, T4, T5>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, concurrent?: number): Observable<T | T2 | T3 | T4 | T5>;
-export declare function merge<T, T2, T3, T4, T5, T6>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): Observable<T | T2 | T3 | T4 | T5 | T6>;
-export declare function merge<T, T2, T3, T4, T5, T6>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, concurrent?: number): Observable<T | T2 | T3 | T4 | T5 | T6>;
-export declare function merge<T>(...observables: (ObservableInput<T> | number)[]): Observable<T>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T>(...observables: (ObservableInput<T> | SchedulerLike | number)[]): Observable<T>;
-export declare function merge<T, R>(...observables: (ObservableInput<any> | number)[]): Observable<R>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export declare function merge<T, R>(...observables: (ObservableInput<any> | SchedulerLike | number)[]): Observable<R>;
diff --git a/node_modules/rxjs/internal/observable/merge.js b/node_modules/rxjs/internal/observable/merge.js
deleted file mode 100644
index 89d5e8e..0000000
--- a/node_modules/rxjs/internal/observable/merge.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isScheduler_1 = require("../util/isScheduler");
-var mergeAll_1 = require("../operators/mergeAll");
-var fromArray_1 = require("./fromArray");
-function merge() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var concurrent = Number.POSITIVE_INFINITY;
-    var scheduler = null;
-    var last = observables[observables.length - 1];
-    if (isScheduler_1.isScheduler(last)) {
-        scheduler = observables.pop();
-        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
-            concurrent = observables.pop();
-        }
-    }
-    else if (typeof last === 'number') {
-        concurrent = observables.pop();
-    }
-    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {
-        return observables[0];
-    }
-    return mergeAll_1.mergeAll(concurrent)(fromArray_1.fromArray(observables, scheduler));
-}
-exports.merge = merge;
-//# sourceMappingURL=merge.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/merge.js.map b/node_modules/rxjs/internal/observable/merge.js.map
deleted file mode 100644
index bfd65e0..0000000
--- a/node_modules/rxjs/internal/observable/merge.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"merge.js","sources":["../../src/internal/observable/merge.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAE3C,mDAAkD;AAClD,kDAAiD;AACjD,yCAAwC;AAqHxC,SAAgB,KAAK;IAAO,qBAAoE;SAApE,UAAoE,EAApE,qBAAoE,EAApE,IAAoE;QAApE,gCAAoE;;IAC/F,IAAI,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAC1C,IAAI,SAAS,GAAkB,IAAI,CAAC;IACnC,IAAI,IAAI,GAAQ,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpD,IAAI,yBAAW,CAAC,IAAI,CAAC,EAAE;QACrB,SAAS,GAAkB,WAAW,CAAC,GAAG,EAAE,CAAC;QAC7C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,QAAQ,EAAE;YACrF,UAAU,GAAW,WAAW,CAAC,GAAG,EAAE,CAAC;SACxC;KACF;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,UAAU,GAAW,WAAW,CAAC,GAAG,EAAE,CAAC;KACxC;IAED,IAAI,SAAS,KAAK,IAAI,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,YAAY,uBAAU,EAAE;QAC1F,OAAsB,WAAW,CAAC,CAAC,CAAC,CAAC;KACtC;IAED,OAAO,mBAAQ,CAAI,UAAU,CAAC,CAAC,qBAAS,CAAM,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AACzE,CAAC;AAlBD,sBAkBC"}
diff --git a/node_modules/rxjs/internal/observable/never.d.ts b/node_modules/rxjs/internal/observable/never.d.ts
deleted file mode 100644
index b080ec4..0000000
--- a/node_modules/rxjs/internal/observable/never.d.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Observable } from '../Observable';
-/**
- * An Observable that emits no items to the Observer and never completes.
- *
- * ![](never.png)
- *
- * A simple Observable that emits neither values nor errors nor the completion
- * notification. It can be used for testing purposes or for composing with other
- * Observables. Please note that by never emitting a complete notification, this
- * Observable keeps the subscription from being disposed automatically.
- * Subscriptions need to be manually disposed.
- *
- * ##  Example
- * ### Emit the number 7, then never emit anything else (not even complete)
- * ```ts
- * import { NEVER } from 'rxjs';
- * import { startWith } from 'rxjs/operators';
- *
- * function info() {
- *   console.log('Will not be called');
- * }
- * const result = NEVER.pipe(startWith(7));
- * result.subscribe(x => console.log(x), info, info);
- *
- * ```
- *
- * @see {@link Observable}
- * @see {@link index/EMPTY}
- * @see {@link of}
- * @see {@link throwError}
- */
-export declare const NEVER: Observable<never>;
-/**
- * @deprecated Deprecated in favor of using {@link NEVER} constant.
- */
-export declare function never(): Observable<never>;
diff --git a/node_modules/rxjs/internal/observable/never.js b/node_modules/rxjs/internal/observable/never.js
deleted file mode 100644
index 13e437c..0000000
--- a/node_modules/rxjs/internal/observable/never.js
+++ /dev/null
@@ -1,10 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var noop_1 = require("../util/noop");
-exports.NEVER = new Observable_1.Observable(noop_1.noop);
-function never() {
-    return exports.NEVER;
-}
-exports.never = never;
-//# sourceMappingURL=never.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/never.js.map b/node_modules/rxjs/internal/observable/never.js.map
deleted file mode 100644
index 8c023d1..0000000
--- a/node_modules/rxjs/internal/observable/never.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"never.js","sources":["../../src/internal/observable/never.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAC3C,qCAAoC;AAgCvB,QAAA,KAAK,GAAG,IAAI,uBAAU,CAAQ,WAAI,CAAC,CAAC;AAKjD,SAAgB,KAAK;IACnB,OAAO,aAAK,CAAC;AACf,CAAC;AAFD,sBAEC"}
diff --git a/node_modules/rxjs/internal/observable/of.d.ts b/node_modules/rxjs/internal/observable/of.d.ts
deleted file mode 100644
index f3337db..0000000
--- a/node_modules/rxjs/internal/observable/of.d.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { SchedulerLike } from '../types';
-import { Observable } from '../Observable';
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export declare function of<T>(a: T, scheduler: SchedulerLike): Observable<T>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export declare function of<T, T2>(a: T, b: T2, scheduler: SchedulerLike): Observable<T | T2>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export declare function of<T, T2, T3>(a: T, b: T2, c: T3, scheduler: SchedulerLike): Observable<T | T2 | T3>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export declare function of<T, T2, T3, T4>(a: T, b: T2, c: T3, d: T4, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export declare function of<T, T2, T3, T4, T5>(a: T, b: T2, c: T3, d: T4, e: T5, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export declare function of<T, T2, T3, T4, T5, T6>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5 | T6>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export declare function of<T, T2, T3, T4, T5, T6, T7>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5 | T6 | T7>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export declare function of<T, T2, T3, T4, T5, T6, T7, T8>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, h: T8, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5 | T6 | T7 | T8>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export declare function of<T, T2, T3, T4, T5, T6, T7, T8, T9>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, h: T8, i: T9, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9>;
-export declare function of<T>(...args: (T | SchedulerLike)[]): Observable<T>;
-export declare function of<T>(a: T): Observable<T>;
-export declare function of<T, T2>(a: T, b: T2): Observable<T | T2>;
-export declare function of<T, T2, T3>(a: T, b: T2, c: T3): Observable<T | T2 | T3>;
-export declare function of<T, T2, T3, T4>(a: T, b: T2, c: T3, d: T4): Observable<T | T2 | T3 | T4>;
-export declare function of<T, T2, T3, T4, T5>(a: T, b: T2, c: T3, d: T4, e: T5): Observable<T | T2 | T3 | T4 | T5>;
-export declare function of<T, T2, T3, T4, T5, T6>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6): Observable<T | T2 | T3 | T4 | T5 | T6>;
-export declare function of<T, T2, T3, T4, T5, T6, T7>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7): Observable<T | T2 | T3 | T4 | T5 | T6 | T7>;
-export declare function of<T, T2, T3, T4, T5, T6, T7, T8>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, h: T8): Observable<T | T2 | T3 | T4 | T5 | T6 | T7 | T8>;
-export declare function of<T, T2, T3, T4, T5, T6, T7, T8, T9>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, h: T8, i: T9): Observable<T | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9>;
-export declare function of<T>(...args: T[]): Observable<T>;
diff --git a/node_modules/rxjs/internal/observable/of.js b/node_modules/rxjs/internal/observable/of.js
deleted file mode 100644
index 05ab045..0000000
--- a/node_modules/rxjs/internal/observable/of.js
+++ /dev/null
@@ -1,21 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isScheduler_1 = require("../util/isScheduler");
-var fromArray_1 = require("./fromArray");
-var scheduleArray_1 = require("../scheduled/scheduleArray");
-function of() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i] = arguments[_i];
-    }
-    var scheduler = args[args.length - 1];
-    if (isScheduler_1.isScheduler(scheduler)) {
-        args.pop();
-        return scheduleArray_1.scheduleArray(args, scheduler);
-    }
-    else {
-        return fromArray_1.fromArray(args);
-    }
-}
-exports.of = of;
-//# sourceMappingURL=of.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/of.js.map b/node_modules/rxjs/internal/observable/of.js.map
deleted file mode 100644
index 5a30ddd..0000000
--- a/node_modules/rxjs/internal/observable/of.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"of.js","sources":["../../src/internal/observable/of.ts"],"names":[],"mappings":";;AACA,mDAAkD;AAClD,yCAAwC;AAExC,4DAA2D;AAiG3D,SAAgB,EAAE;IAAI,cAAiC;SAAjC,UAAiC,EAAjC,qBAAiC,EAAjC,IAAiC;QAAjC,yBAAiC;;IACrD,IAAI,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAkB,CAAC;IACvD,IAAI,yBAAW,CAAC,SAAS,CAAC,EAAE;QAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,OAAO,6BAAa,CAAC,IAAW,EAAE,SAAS,CAAC,CAAC;KAC9C;SAAM;QACL,OAAO,qBAAS,CAAC,IAAW,CAAC,CAAC;KAC/B;AACH,CAAC;AARD,gBAQC"}
diff --git a/node_modules/rxjs/internal/observable/onErrorResumeNext.d.ts b/node_modules/rxjs/internal/observable/onErrorResumeNext.d.ts
deleted file mode 100644
index 5b81cce..0000000
--- a/node_modules/rxjs/internal/observable/onErrorResumeNext.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput } from '../types';
-export declare function onErrorResumeNext<R>(v: ObservableInput<R>): Observable<R>;
-export declare function onErrorResumeNext<T2, T3, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>): Observable<R>;
-export declare function onErrorResumeNext<T2, T3, T4, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<R>;
-export declare function onErrorResumeNext<T2, T3, T4, T5, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): Observable<R>;
-export declare function onErrorResumeNext<T2, T3, T4, T5, T6, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): Observable<R>;
-export declare function onErrorResumeNext<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): Observable<R>;
-export declare function onErrorResumeNext<R>(array: ObservableInput<any>[]): Observable<R>;
diff --git a/node_modules/rxjs/internal/observable/onErrorResumeNext.js b/node_modules/rxjs/internal/observable/onErrorResumeNext.js
deleted file mode 100644
index 3eba9e2..0000000
--- a/node_modules/rxjs/internal/observable/onErrorResumeNext.js
+++ /dev/null
@@ -1,29 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var from_1 = require("./from");
-var isArray_1 = require("../util/isArray");
-var empty_1 = require("./empty");
-function onErrorResumeNext() {
-    var sources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        sources[_i] = arguments[_i];
-    }
-    if (sources.length === 0) {
-        return empty_1.EMPTY;
-    }
-    var first = sources[0], remainder = sources.slice(1);
-    if (sources.length === 1 && isArray_1.isArray(first)) {
-        return onErrorResumeNext.apply(void 0, first);
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); };
-        return from_1.from(first).subscribe({
-            next: function (value) { subscriber.next(value); },
-            error: subNext,
-            complete: subNext,
-        });
-    });
-}
-exports.onErrorResumeNext = onErrorResumeNext;
-//# sourceMappingURL=onErrorResumeNext.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/onErrorResumeNext.js.map b/node_modules/rxjs/internal/observable/onErrorResumeNext.js.map
deleted file mode 100644
index 9305eb6..0000000
--- a/node_modules/rxjs/internal/observable/onErrorResumeNext.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"onErrorResumeNext.js","sources":["../../src/internal/observable/onErrorResumeNext.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAE3C,+BAA8B;AAC9B,2CAA0C;AAC1C,iCAAgC;AAwEhC,SAAgB,iBAAiB;IAAO,iBAEqD;SAFrD,UAEqD,EAFrD,qBAEqD,EAFrD,IAEqD;QAFrD,4BAEqD;;IAE3F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,aAAK,CAAC;KACd;IAEO,IAAA,kBAAK,EAAE,4BAAY,CAAa;IAExC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAO,CAAC,KAAK,CAAC,EAAE;QAC1C,OAAO,iBAAiB,eAAI,KAAK,EAAE;KACpC;IAED,OAAO,IAAI,uBAAU,CAAC,UAAA,UAAU;QAC9B,IAAM,OAAO,GAAG,cAAM,OAAA,UAAU,CAAC,GAAG,CAClC,iBAAiB,eAAI,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,CACtD,EAFqB,CAErB,CAAC;QAEF,OAAO,WAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;YAC3B,IAAI,YAAC,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvC,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAzBD,8CAyBC"}
diff --git a/node_modules/rxjs/internal/observable/pairs.d.ts b/node_modules/rxjs/internal/observable/pairs.d.ts
deleted file mode 100644
index 5e915e6..0000000
--- a/node_modules/rxjs/internal/observable/pairs.d.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerAction, SchedulerLike } from '../types';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-/**
- * Convert an object into an Observable of `[key, value]` pairs.
- *
- * <span class="informal">Turn entries of an object into a stream.</span>
- *
- * <img src="./img/pairs.png" width="100%">
- *
- * `pairs` takes an arbitrary object and returns an Observable that emits arrays. Each
- * emitted array has exactly two elements - the first is a key from the object
- * and the second is a value corresponding to that key. Keys are extracted from
- * an object via `Object.keys` function, which means that they will be only
- * enumerable keys that are present on an object directly - not ones inherited
- * via prototype chain.
- *
- * By default these arrays are emitted synchronously. To change that you can
- * pass a {@link SchedulerLike} as a second argument to `pairs`.
- *
- * @example <caption>Converts a javascript object to an Observable</caption>
- * ```ts
- * import { pairs } from 'rxjs';
- *
- * const obj = {
- *   foo: 42,
- *   bar: 56,
- *   baz: 78
- * };
- *
- * pairs(obj)
- * .subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('the end!')
- * );
- *
- * // Logs:
- * // ["foo", 42],
- * // ["bar", 56],
- * // ["baz", 78],
- * // "the end!"
- * ```
- *
- * @param {Object} obj The object to inspect and turn into an
- * Observable sequence.
- * @param {Scheduler} [scheduler] An optional IScheduler to schedule
- * when resulting Observable will emit values.
- * @returns {(Observable<Array<string|T>>)} An observable sequence of
- * [key, value] pairs from the object.
- */
-export declare function pairs<T>(obj: Object, scheduler?: SchedulerLike): Observable<[string, T]>;
-/** @internal */
-export declare function dispatch<T>(this: SchedulerAction<any>, state: {
-    keys: string[];
-    index: number;
-    subscriber: Subscriber<[string, T]>;
-    subscription: Subscription;
-    obj: Object;
-}): void;
diff --git a/node_modules/rxjs/internal/observable/pairs.js b/node_modules/rxjs/internal/observable/pairs.js
deleted file mode 100644
index 10037fe..0000000
--- a/node_modules/rxjs/internal/observable/pairs.js
+++ /dev/null
@@ -1,42 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-function pairs(obj, scheduler) {
-    if (!scheduler) {
-        return new Observable_1.Observable(function (subscriber) {
-            var keys = Object.keys(obj);
-            for (var i = 0; i < keys.length && !subscriber.closed; i++) {
-                var key = keys[i];
-                if (obj.hasOwnProperty(key)) {
-                    subscriber.next([key, obj[key]]);
-                }
-            }
-            subscriber.complete();
-        });
-    }
-    else {
-        return new Observable_1.Observable(function (subscriber) {
-            var keys = Object.keys(obj);
-            var subscription = new Subscription_1.Subscription();
-            subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj }));
-            return subscription;
-        });
-    }
-}
-exports.pairs = pairs;
-function dispatch(state) {
-    var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj;
-    if (!subscriber.closed) {
-        if (index < keys.length) {
-            var key = keys[index];
-            subscriber.next([key, obj[key]]);
-            subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj }));
-        }
-        else {
-            subscriber.complete();
-        }
-    }
-}
-exports.dispatch = dispatch;
-//# sourceMappingURL=pairs.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/pairs.js.map b/node_modules/rxjs/internal/observable/pairs.js.map
deleted file mode 100644
index 12065a4..0000000
--- a/node_modules/rxjs/internal/observable/pairs.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pairs.js","sources":["../../src/internal/observable/pairs.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAG3C,gDAA+C;AAkD/C,SAAgB,KAAK,CAAI,GAAW,EAAE,SAAyB;IAC7D,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,uBAAU,CAAc,UAAA,UAAU;YAC3C,IAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC1D,IAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;oBAC3B,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAClC;aACF;YACD,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;KACJ;SAAM;QACL,OAAO,IAAI,uBAAU,CAAc,UAAA,UAAU;YAC3C,IAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAM,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;YACxC,YAAY,CAAC,GAAG,CACd,SAAS,CAAC,QAAQ,CACf,QAAQ,EAAE,CAAC,EAAE,EAAE,IAAI,MAAA,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,YAAA,EAAE,YAAY,cAAA,EAAE,GAAG,KAAA,EAAE,CAAC,CAAC,CAAC;YACtE,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC;KACJ;AACH,CAAC;AAtBD,sBAsBC;AAGD,SAAgB,QAAQ,CACI,KAAsH;IACxI,IAAA,iBAAI,EAAE,mBAAK,EAAE,6BAAU,EAAE,iCAAY,EAAE,eAAG,CAAW;IAC7D,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QACtB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;YACvB,IAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,MAAA,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,UAAU,YAAA,EAAE,YAAY,cAAA,EAAE,GAAG,KAAA,EAAE,CAAC,CAAC,CAAC;SAC5F;aAAM;YACL,UAAU,CAAC,QAAQ,EAAE,CAAC;SACvB;KACF;AACH,CAAC;AAZD,4BAYC"}
diff --git a/node_modules/rxjs/internal/observable/partition.d.ts b/node_modules/rxjs/internal/observable/partition.d.ts
deleted file mode 100644
index e750027..0000000
--- a/node_modules/rxjs/internal/observable/partition.d.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { ObservableInput } from '../types';
-import { Observable } from '../Observable';
-/**
- * Splits the source Observable into two, one with values that satisfy a
- * predicate, and another with values that don't satisfy the predicate.
- *
- * <span class="informal">It's like {@link filter}, but returns two Observables:
- * one like the output of {@link filter}, and the other with values that did not
- * pass the condition.</span>
- *
- * ![](partition.png)
- *
- * `partition` outputs an array with two Observables that partition the values
- * from the source Observable through the given `predicate` function. The first
- * Observable in that array emits source values for which the predicate argument
- * returns true. The second Observable emits source values for which the
- * predicate returns false. The first behaves like {@link filter} and the second
- * behaves like {@link filter} with the predicate negated.
- *
- * ## Example
- * Partition a set of numbers into odds and evens observables
- * ```ts
- * import { of, partition } from 'rxjs';
- *
- * const observableValues = of(1, 2, 3, 4, 5, 6);
- * const [evens$, odds$] = partition(observableValues, (value, index) => value % 2 === 0);
- *
- * odds$.subscribe(x => console.log('odds', x));
- * evens$.subscribe(x => console.log('evens', x));
- *
- * // Logs:
- * // odds 1
- * // odds 3
- * // odds 5
- * // evens 2
- * // evens 4
- * // evens 6
- * ```
- *
- * @see {@link filter}
- *
- * @param {function(value: T, index: number): boolean} predicate A function that
- * evaluates each value emitted by the source Observable. If it returns `true`,
- * the value is emitted on the first Observable in the returned array, if
- * `false` the value is emitted on the second Observable in the array. The
- * `index` parameter is the number `i` for the i-th source emission that has
- * happened since the subscription, starting from the number `0`.
- * @param {any} [thisArg] An optional argument to determine the value of `this`
- * in the `predicate` function.
- * @return {[Observable<T>, Observable<T>]} An array with two Observables: one
- * with values that passed the predicate, and another with values that did not
- * pass the predicate.
- */
-export declare function partition<T>(source: ObservableInput<T>, predicate: (value: T, index: number) => boolean, thisArg?: any): [Observable<T>, Observable<T>];
diff --git a/node_modules/rxjs/internal/observable/partition.js b/node_modules/rxjs/internal/observable/partition.js
deleted file mode 100644
index dc33aff..0000000
--- a/node_modules/rxjs/internal/observable/partition.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var not_1 = require("../util/not");
-var subscribeTo_1 = require("../util/subscribeTo");
-var filter_1 = require("../operators/filter");
-var Observable_1 = require("../Observable");
-function partition(source, predicate, thisArg) {
-    return [
-        filter_1.filter(predicate, thisArg)(new Observable_1.Observable(subscribeTo_1.subscribeTo(source))),
-        filter_1.filter(not_1.not(predicate, thisArg))(new Observable_1.Observable(subscribeTo_1.subscribeTo(source)))
-    ];
-}
-exports.partition = partition;
-//# sourceMappingURL=partition.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/partition.js.map b/node_modules/rxjs/internal/observable/partition.js.map
deleted file mode 100644
index 91ed70e..0000000
--- a/node_modules/rxjs/internal/observable/partition.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"partition.js","sources":["../../src/internal/observable/partition.ts"],"names":[],"mappings":";;AAAA,mCAAkC;AAClC,mDAAkD;AAClD,8CAA6C;AAE7C,4CAA2C;AAqD3C,SAAgB,SAAS,CACvB,MAA0B,EAC1B,SAA+C,EAC/C,OAAa;IAEb,OAAO;QACL,eAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,uBAAU,CAAI,yBAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAClE,eAAM,CAAC,SAAG,CAAC,SAAS,EAAE,OAAO,CAAQ,CAAC,CAAC,IAAI,uBAAU,CAAI,yBAAW,CAAC,MAAM,CAAC,CAAC,CAAC;KAC7C,CAAC;AACtC,CAAC;AATD,8BASC"}
diff --git a/node_modules/rxjs/internal/observable/race.d.ts b/node_modules/rxjs/internal/observable/race.d.ts
deleted file mode 100644
index b9f9a55..0000000
--- a/node_modules/rxjs/internal/observable/race.d.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { TeardownLogic, ObservableInput } from '../types';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-export declare function race<A>(arg: [ObservableInput<A>]): Observable<A>;
-export declare function race<A, B>(arg: [ObservableInput<A>, ObservableInput<B>]): Observable<A | B>;
-export declare function race<A, B, C>(arg: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>]): Observable<A | B | C>;
-export declare function race<A, B, C, D>(arg: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>]): Observable<A | B | C | D>;
-export declare function race<A, B, C, D, E>(arg: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>, ObservableInput<E>]): Observable<A | B | C | D | E>;
-export declare function race<T>(arg: ObservableInput<T>[]): Observable<T>;
-export declare function race(arg: ObservableInput<any>[]): Observable<{}>;
-export declare function race<A>(a: ObservableInput<A>): Observable<A>;
-export declare function race<A, B>(a: ObservableInput<A>, b: ObservableInput<B>): Observable<A | B>;
-export declare function race<A, B, C>(a: ObservableInput<A>, b: ObservableInput<B>, c: ObservableInput<C>): Observable<A | B | C>;
-export declare function race<A, B, C, D>(a: ObservableInput<A>, b: ObservableInput<B>, c: ObservableInput<C>, d: ObservableInput<D>): Observable<A | B | C | D>;
-export declare function race<A, B, C, D, E>(a: ObservableInput<A>, b: ObservableInput<B>, c: ObservableInput<C>, d: ObservableInput<D>, e: ObservableInput<E>): Observable<A | B | C | D | E>;
-export declare function race<T>(observables: ObservableInput<T>[]): Observable<T>;
-export declare function race(observables: ObservableInput<any>[]): Observable<{}>;
-export declare function race<T>(...observables: ObservableInput<T>[]): Observable<T>;
-export declare function race(...observables: ObservableInput<any>[]): Observable<{}>;
-export declare class RaceOperator<T> implements Operator<T, T> {
-    call(subscriber: Subscriber<T>, source: any): TeardownLogic;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class RaceSubscriber<T> extends OuterSubscriber<T, T> {
-    private hasFirst;
-    private observables;
-    private subscriptions;
-    constructor(destination: Subscriber<T>);
-    protected _next(observable: any): void;
-    protected _complete(): void;
-    notifyNext(outerValue: T, innerValue: T, outerIndex: number, innerIndex: number, innerSub: InnerSubscriber<T, T>): void;
-}
diff --git a/node_modules/rxjs/internal/observable/race.js b/node_modules/rxjs/internal/observable/race.js
deleted file mode 100644
index b4319d3..0000000
--- a/node_modules/rxjs/internal/observable/race.js
+++ /dev/null
@@ -1,92 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("../util/isArray");
-var fromArray_1 = require("./fromArray");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function race() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    if (observables.length === 1) {
-        if (isArray_1.isArray(observables[0])) {
-            observables = observables[0];
-        }
-        else {
-            return observables[0];
-        }
-    }
-    return fromArray_1.fromArray(observables, undefined).lift(new RaceOperator());
-}
-exports.race = race;
-var RaceOperator = (function () {
-    function RaceOperator() {
-    }
-    RaceOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RaceSubscriber(subscriber));
-    };
-    return RaceOperator;
-}());
-exports.RaceOperator = RaceOperator;
-var RaceSubscriber = (function (_super) {
-    __extends(RaceSubscriber, _super);
-    function RaceSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasFirst = false;
-        _this.observables = [];
-        _this.subscriptions = [];
-        return _this;
-    }
-    RaceSubscriber.prototype._next = function (observable) {
-        this.observables.push(observable);
-    };
-    RaceSubscriber.prototype._complete = function () {
-        var observables = this.observables;
-        var len = observables.length;
-        if (len === 0) {
-            this.destination.complete();
-        }
-        else {
-            for (var i = 0; i < len && !this.hasFirst; i++) {
-                var observable = observables[i];
-                var subscription = subscribeToResult_1.subscribeToResult(this, observable, observable, i);
-                if (this.subscriptions) {
-                    this.subscriptions.push(subscription);
-                }
-                this.add(subscription);
-            }
-            this.observables = null;
-        }
-    };
-    RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (!this.hasFirst) {
-            this.hasFirst = true;
-            for (var i = 0; i < this.subscriptions.length; i++) {
-                if (i !== outerIndex) {
-                    var subscription = this.subscriptions[i];
-                    subscription.unsubscribe();
-                    this.remove(subscription);
-                }
-            }
-            this.subscriptions = null;
-        }
-        this.destination.next(innerValue);
-    };
-    return RaceSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.RaceSubscriber = RaceSubscriber;
-//# sourceMappingURL=race.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/race.js.map b/node_modules/rxjs/internal/observable/race.js.map
deleted file mode 100644
index d77440d..0000000
--- a/node_modules/rxjs/internal/observable/race.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"race.js","sources":["../../src/internal/observable/race.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/observable/range.d.ts b/node_modules/rxjs/internal/observable/range.d.ts
deleted file mode 100644
index 8aad405..0000000
--- a/node_modules/rxjs/internal/observable/range.d.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { SchedulerAction, SchedulerLike } from '../types';
-import { Observable } from '../Observable';
-/**
- * Creates an Observable that emits a sequence of numbers within a specified
- * range.
- *
- * <span class="informal">Emits a sequence of numbers in a range.</span>
- *
- * ![](range.png)
- *
- * `range` operator emits a range of sequential integers, in order, where you
- * select the `start` of the range and its `length`. By default, uses no
- * {@link SchedulerLike} and just delivers the notifications synchronously, but may use
- * an optional {@link SchedulerLike} to regulate those deliveries.
- *
- * ## Example
- * Emits the numbers 1 to 10</caption>
- * ```ts
- * import { range } from 'rxjs';
- *
- * const numbers = range(1, 10);
- * numbers.subscribe(x => console.log(x));
- * ```
- * @see {@link timer}
- * @see {@link index/interval}
- *
- * @param {number} [start=0] The value of the first integer in the sequence.
- * @param {number} count The number of sequential integers to generate.
- * @param {SchedulerLike} [scheduler] A {@link SchedulerLike} to use for scheduling
- * the emissions of the notifications.
- * @return {Observable} An Observable of numbers that emits a finite range of
- * sequential integers.
- * @static true
- * @name range
- * @owner Observable
- */
-export declare function range(start?: number, count?: number, scheduler?: SchedulerLike): Observable<number>;
-/** @internal */
-export declare function dispatch(this: SchedulerAction<any>, state: any): void;
diff --git a/node_modules/rxjs/internal/observable/range.js b/node_modules/rxjs/internal/observable/range.js
deleted file mode 100644
index 8e5c0df..0000000
--- a/node_modules/rxjs/internal/observable/range.js
+++ /dev/null
@@ -1,49 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-function range(start, count, scheduler) {
-    if (start === void 0) { start = 0; }
-    return new Observable_1.Observable(function (subscriber) {
-        if (count === undefined) {
-            count = start;
-            start = 0;
-        }
-        var index = 0;
-        var current = start;
-        if (scheduler) {
-            return scheduler.schedule(dispatch, 0, {
-                index: index, count: count, start: start, subscriber: subscriber
-            });
-        }
-        else {
-            do {
-                if (index++ >= count) {
-                    subscriber.complete();
-                    break;
-                }
-                subscriber.next(current++);
-                if (subscriber.closed) {
-                    break;
-                }
-            } while (true);
-        }
-        return undefined;
-    });
-}
-exports.range = range;
-function dispatch(state) {
-    var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber;
-    if (index >= count) {
-        subscriber.complete();
-        return;
-    }
-    subscriber.next(start);
-    if (subscriber.closed) {
-        return;
-    }
-    state.index = index + 1;
-    state.start = start + 1;
-    this.schedule(state);
-}
-exports.dispatch = dispatch;
-//# sourceMappingURL=range.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/range.js.map b/node_modules/rxjs/internal/observable/range.js.map
deleted file mode 100644
index 01cde87..0000000
--- a/node_modules/rxjs/internal/observable/range.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"range.js","sources":["../../src/internal/observable/range.ts"],"names":[],"mappings":";;AACA,4CAA2C;AAoC3C,SAAgB,KAAK,CAAC,KAAiB,EACjB,KAAc,EACd,SAAyB;IAFzB,sBAAA,EAAA,SAAiB;IAGrC,OAAO,IAAI,uBAAU,CAAS,UAAA,UAAU;QACtC,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,KAAK,GAAG,KAAK,CAAC;YACd,KAAK,GAAG,CAAC,CAAC;SACX;QAED,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,SAAS,EAAE;YACb,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE;gBACrC,KAAK,OAAA,EAAE,KAAK,OAAA,EAAE,KAAK,OAAA,EAAE,UAAU,YAAA;aAChC,CAAC,CAAC;SACJ;aAAM;YACL,GAAG;gBACD,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE;oBACpB,UAAU,CAAC,QAAQ,EAAE,CAAC;oBACtB,MAAM;iBACP;gBACD,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3B,IAAI,UAAU,CAAC,MAAM,EAAE;oBACrB,MAAM;iBACP;aACF,QAAQ,IAAI,EAAE;SAChB;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AA/BD,sBA+BC;AAGD,SAAgB,QAAQ,CAA6B,KAAU;IACrD,IAAA,mBAAK,EAAE,mBAAK,EAAE,mBAAK,EAAE,6BAAU,CAAW;IAElD,IAAI,KAAK,IAAI,KAAK,EAAE;QAClB,UAAU,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO;KACR;IAED,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEvB,IAAI,UAAU,CAAC,MAAM,EAAE;QACrB,OAAO;KACR;IAED,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IACxB,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IAExB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAlBD,4BAkBC"}
diff --git a/node_modules/rxjs/internal/observable/throwError.d.ts b/node_modules/rxjs/internal/observable/throwError.d.ts
deleted file mode 100644
index cb833c4..0000000
--- a/node_modules/rxjs/internal/observable/throwError.d.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-/**
- * Creates an Observable that emits no items to the Observer and immediately
- * emits an error notification.
- *
- * <span class="informal">Just emits 'error', and nothing else.
- * </span>
- *
- * ![](throw.png)
- *
- * This static operator is useful for creating a simple Observable that only
- * emits the error notification. It can be used for composing with other
- * Observables, such as in a {@link mergeMap}.
- *
- * ## Examples
- * ### Emit the number 7, then emit an error
- * ```ts
- * import { throwError, concat, of } from 'rxjs';
- *
- * const result = concat(of(7), throwError(new Error('oops!')));
- * result.subscribe(x => console.log(x), e => console.error(e));
- *
- * // Logs:
- * // 7
- * // Error: oops!
- * ```
- *
- * ---
- *
- * ### Map and flatten numbers to the sequence 'a', 'b', 'c', but throw an error for 2
- * ```ts
- * import { throwError, interval, of } from 'rxjs';
- * import { mergeMap } from 'rxjs/operators';
- *
- * interval(1000).pipe(
- *   mergeMap(x => x === 2
- *     ? throwError('Twos are bad')
- *     : of('a', 'b', 'c')
- *   ),
- * ).subscribe(x => console.log(x), e => console.error(e));
- *
- * // Logs:
- * // a
- * // b
- * // c
- * // a
- * // b
- * // c
- * // Twos are bad
- * ```
- *
- * @see {@link Observable}
- * @see {@link empty}
- * @see {@link never}
- * @see {@link of}
- *
- * @param {any} error The particular Error to pass to the error notification.
- * @param {SchedulerLike} [scheduler] A {@link SchedulerLike} to use for scheduling
- * the emission of the error notification.
- * @return {Observable} An error Observable: emits only the error notification
- * using the given error argument.
- * @static true
- * @name throwError
- * @owner Observable
- */
-export declare function throwError(error: any, scheduler?: SchedulerLike): Observable<never>;
diff --git a/node_modules/rxjs/internal/observable/throwError.js b/node_modules/rxjs/internal/observable/throwError.js
deleted file mode 100644
index 0d28544..0000000
--- a/node_modules/rxjs/internal/observable/throwError.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-function throwError(error, scheduler) {
-    if (!scheduler) {
-        return new Observable_1.Observable(function (subscriber) { return subscriber.error(error); });
-    }
-    else {
-        return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); });
-    }
-}
-exports.throwError = throwError;
-function dispatch(_a) {
-    var error = _a.error, subscriber = _a.subscriber;
-    subscriber.error(error);
-}
-//# sourceMappingURL=throwError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/throwError.js.map b/node_modules/rxjs/internal/observable/throwError.js.map
deleted file mode 100644
index def5d43..0000000
--- a/node_modules/rxjs/internal/observable/throwError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throwError.js","sources":["../../src/internal/observable/throwError.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAoE3C,SAAgB,UAAU,CAAC,KAAU,EAAE,SAAyB;IAC9D,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,IAAI,uBAAU,CAAC,UAAA,UAAU,IAAI,OAAA,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAvB,CAAuB,CAAC,CAAC;KAC9D;SAAM;QACL,OAAO,IAAI,uBAAU,CAAC,UAAA,UAAU,IAAI,OAAA,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,KAAK,OAAA,EAAE,UAAU,YAAA,EAAE,CAAC,EAAtD,CAAsD,CAAC,CAAC;KAC7F;AACH,CAAC;AAND,gCAMC;AAOD,SAAS,QAAQ,CAAC,EAAkC;QAAhC,gBAAK,EAAE,0BAAU;IACnC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC"}
diff --git a/node_modules/rxjs/internal/observable/timer.d.ts b/node_modules/rxjs/internal/observable/timer.d.ts
deleted file mode 100644
index ce684a3..0000000
--- a/node_modules/rxjs/internal/observable/timer.d.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-/**
- * Creates an Observable that starts emitting after an `dueTime` and
- * emits ever increasing numbers after each `period` of time thereafter.
- *
- * <span class="informal">Its like {@link index/interval}, but you can specify when
- * should the emissions start.</span>
- *
- * ![](timer.png)
- *
- * `timer` returns an Observable that emits an infinite sequence of ascending
- * integers, with a constant interval of time, `period` of your choosing
- * between those emissions. The first emission happens after the specified
- * `dueTime`. The initial delay may be a `Date`. By default, this
- * operator uses the {@link asyncScheduler} {@link SchedulerLike} to provide a notion of time, but you
- * may pass any {@link SchedulerLike} to it. If `period` is not specified, the output
- * Observable emits only one value, `0`. Otherwise, it emits an infinite
- * sequence.
- *
- * ## Examples
- * ### Emits ascending numbers, one every second (1000ms), starting after 3 seconds
- * ```ts
- * import { timer } from 'rxjs';
- *
- * const numbers = timer(3000, 1000);
- * numbers.subscribe(x => console.log(x));
- * ```
- *
- * ### Emits one number after five seconds
- * ```ts
- * import { timer } from 'rxjs';
- *
- * const numbers = timer(5000);
- * numbers.subscribe(x => console.log(x));
- * ```
- * @see {@link index/interval}
- * @see {@link delay}
- *
- * @param {number|Date} [dueTime] The initial delay time specified as a Date object or as an integer denoting
- * milliseconds to wait before emitting the first value of 0`.
- * @param {number|SchedulerLike} [periodOrScheduler] The period of time between emissions of the
- * subsequent numbers.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for scheduling
- * the emission of values, and providing a notion of "time".
- * @return {Observable} An Observable that emits a `0` after the
- * `dueTime` and ever increasing numbers after each `period` of time
- * thereafter.
- * @static true
- * @name timer
- * @owner Observable
- */
-export declare function timer(dueTime?: number | Date, periodOrScheduler?: number | SchedulerLike, scheduler?: SchedulerLike): Observable<number>;
diff --git a/node_modules/rxjs/internal/observable/timer.js b/node_modules/rxjs/internal/observable/timer.js
deleted file mode 100644
index f7a928d..0000000
--- a/node_modules/rxjs/internal/observable/timer.js
+++ /dev/null
@@ -1,41 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var async_1 = require("../scheduler/async");
-var isNumeric_1 = require("../util/isNumeric");
-var isScheduler_1 = require("../util/isScheduler");
-function timer(dueTime, periodOrScheduler, scheduler) {
-    if (dueTime === void 0) { dueTime = 0; }
-    var period = -1;
-    if (isNumeric_1.isNumeric(periodOrScheduler)) {
-        period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);
-    }
-    else if (isScheduler_1.isScheduler(periodOrScheduler)) {
-        scheduler = periodOrScheduler;
-    }
-    if (!isScheduler_1.isScheduler(scheduler)) {
-        scheduler = async_1.async;
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var due = isNumeric_1.isNumeric(dueTime)
-            ? dueTime
-            : (+dueTime - scheduler.now());
-        return scheduler.schedule(dispatch, due, {
-            index: 0, period: period, subscriber: subscriber
-        });
-    });
-}
-exports.timer = timer;
-function dispatch(state) {
-    var index = state.index, period = state.period, subscriber = state.subscriber;
-    subscriber.next(index);
-    if (subscriber.closed) {
-        return;
-    }
-    else if (period === -1) {
-        return subscriber.complete();
-    }
-    state.index = index + 1;
-    this.schedule(state, period);
-}
-//# sourceMappingURL=timer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/timer.js.map b/node_modules/rxjs/internal/observable/timer.js.map
deleted file mode 100644
index adf2a57..0000000
--- a/node_modules/rxjs/internal/observable/timer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timer.js","sources":["../../src/internal/observable/timer.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAE3C,4CAA2C;AAC3C,+CAA8C;AAC9C,mDAAkD;AAqDlD,SAAgB,KAAK,CAAC,OAA0B,EAC1B,iBAA0C,EAC1C,SAAyB;IAFzB,wBAAA,EAAA,WAA0B;IAG9C,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;IAChB,IAAI,qBAAS,CAAC,iBAAiB,CAAC,EAAE;QAChC,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC;KAC1E;SAAM,IAAI,yBAAW,CAAC,iBAAiB,CAAC,EAAE;QACzC,SAAS,GAAG,iBAAwB,CAAC;KACtC;IAED,IAAI,CAAC,yBAAW,CAAC,SAAS,CAAC,EAAE;QAC3B,SAAS,GAAG,aAAK,CAAC;KACnB;IAED,OAAO,IAAI,uBAAU,CAAC,UAAA,UAAU;QAC9B,IAAM,GAAG,GAAG,qBAAS,CAAC,OAAO,CAAC;YAC5B,CAAC,CAAE,OAAkB;YACrB,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QAEjC,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;YACvC,KAAK,EAAE,CAAC,EAAE,MAAM,QAAA,EAAE,UAAU,YAAA;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAvBD,sBAuBC;AAQD,SAAS,QAAQ,CAAoC,KAAiB;IAC5D,IAAA,mBAAK,EAAE,qBAAM,EAAE,6BAAU,CAAW;IAC5C,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEvB,IAAI,UAAU,CAAC,MAAM,EAAE;QACrB,OAAO;KACR;SAAM,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE;QACxB,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC;KAC9B;IAED,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC"}
diff --git a/node_modules/rxjs/internal/observable/using.d.ts b/node_modules/rxjs/internal/observable/using.d.ts
deleted file mode 100644
index 21014e4..0000000
--- a/node_modules/rxjs/internal/observable/using.d.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Observable } from '../Observable';
-import { Unsubscribable, ObservableInput } from '../types';
-/**
- * Creates an Observable that uses a resource which will be disposed at the same time as the Observable.
- *
- * <span class="informal">Use it when you catch yourself cleaning up after an Observable.</span>
- *
- * `using` is a factory operator, which accepts two functions. First function returns a disposable resource.
- * It can be an arbitrary object that implements `unsubscribe` method. Second function will be injected with
- * that object and should return an Observable. That Observable can use resource object during its execution.
- * Both functions passed to `using` will be called every time someone subscribes - neither an Observable nor
- * resource object will be shared in any way between subscriptions.
- *
- * When Observable returned by `using` is subscribed, Observable returned from the second function will be subscribed
- * as well. All its notifications (nexted values, completion and error events) will be emitted unchanged by the output
- * Observable. If however someone unsubscribes from the Observable or source Observable completes or errors by itself,
- * the `unsubscribe` method on resource object will be called. This can be used to do any necessary clean up, which
- * otherwise would have to be handled by hand. Note that complete or error notifications are not emitted when someone
- * cancels subscription to an Observable via `unsubscribe`, so `using` can be used as a hook, allowing you to make
- * sure that all resources which need to exist during an Observable execution will be disposed at appropriate time.
- *
- * @see {@link defer}
- *
- * @param {function(): ISubscription} resourceFactory A function which creates any resource object
- * that implements `unsubscribe` method.
- * @param {function(resource: ISubscription): Observable<T>} observableFactory A function which
- * creates an Observable, that can use injected resource object.
- * @return {Observable<T>} An Observable that behaves the same as Observable returned by `observableFactory`, but
- * which - when completed, errored or unsubscribed - will also call `unsubscribe` on created resource object.
- */
-export declare function using<T>(resourceFactory: () => Unsubscribable | void, observableFactory: (resource: Unsubscribable | void) => ObservableInput<T> | void): Observable<T>;
diff --git a/node_modules/rxjs/internal/observable/using.js b/node_modules/rxjs/internal/observable/using.js
deleted file mode 100644
index 063ca57..0000000
--- a/node_modules/rxjs/internal/observable/using.js
+++ /dev/null
@@ -1,35 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var from_1 = require("./from");
-var empty_1 = require("./empty");
-function using(resourceFactory, observableFactory) {
-    return new Observable_1.Observable(function (subscriber) {
-        var resource;
-        try {
-            resource = resourceFactory();
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        var result;
-        try {
-            result = observableFactory(resource);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        var source = result ? from_1.from(result) : empty_1.EMPTY;
-        var subscription = source.subscribe(subscriber);
-        return function () {
-            subscription.unsubscribe();
-            if (resource) {
-                resource.unsubscribe();
-            }
-        };
-    });
-}
-exports.using = using;
-//# sourceMappingURL=using.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/using.js.map b/node_modules/rxjs/internal/observable/using.js.map
deleted file mode 100644
index 4747304..0000000
--- a/node_modules/rxjs/internal/observable/using.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"using.js","sources":["../../src/internal/observable/using.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAE3C,+BAA8B;AAC9B,iCAAgC;AA8BhC,SAAgB,KAAK,CAAI,eAA4C,EAC5C,iBAAiF;IACxG,OAAO,IAAI,uBAAU,CAAI,UAAA,UAAU;QACjC,IAAI,QAA+B,CAAC;QAEpC,IAAI;YACF,QAAQ,GAAG,eAAe,EAAE,CAAC;SAC9B;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QAED,IAAI,MAAiC,CAAC;QACtC,IAAI;YACF,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;SACtC;QAAC,OAAO,GAAG,EAAE;YACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;SAClB;QAED,IAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,WAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAK,CAAC;QAC7C,IAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAClD,OAAO;YACL,YAAY,CAAC,WAAW,EAAE,CAAC;YAC3B,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,WAAW,EAAE,CAAC;aACxB;QACH,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AA7BD,sBA6BC"}
diff --git a/node_modules/rxjs/internal/observable/zip.d.ts b/node_modules/rxjs/internal/observable/zip.d.ts
deleted file mode 100644
index 27da764..0000000
--- a/node_modules/rxjs/internal/observable/zip.d.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { ObservableInput, ObservedValueOf } from '../types';
-import { Subscriber } from '../Subscriber';
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export declare function zip<O1 extends ObservableInput<any>, R>(v1: O1, resultSelector: (v1: ObservedValueOf<O1>) => R): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export declare function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, R>(v1: O1, v2: O2, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>) => R): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export declare function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>) => R): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export declare function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>) => R): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export declare function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>) => R): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export declare function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>, v6: ObservedValueOf<O6>) => R): Observable<R>;
-export declare function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(v1: O1, v2: O2): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>]>;
-export declare function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>]>;
-export declare function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>]>;
-export declare function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>]>;
-export declare function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>, ObservedValueOf<O6>]>;
-export declare function zip<O extends ObservableInput<any>>(array: O[]): Observable<ObservedValueOf<O>[]>;
-export declare function zip<R>(array: ObservableInput<any>[]): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export declare function zip<O extends ObservableInput<any>, R>(array: O[], resultSelector: (...values: ObservedValueOf<O>[]) => R): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export declare function zip<R>(array: ObservableInput<any>[], resultSelector: (...values: any[]) => R): Observable<R>;
-export declare function zip<O extends ObservableInput<any>>(...observables: O[]): Observable<ObservedValueOf<O>[]>;
-export declare function zip<O extends ObservableInput<any>, R>(...observables: Array<O | ((...values: ObservedValueOf<O>[]) => R)>): Observable<R>;
-export declare function zip<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): Observable<R>;
-export declare class ZipOperator<T, R> implements Operator<T, R> {
-    resultSelector: (...values: Array<any>) => R;
-    constructor(resultSelector?: (...values: Array<any>) => R);
-    call(subscriber: Subscriber<R>, source: any): any;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class ZipSubscriber<T, R> extends Subscriber<T> {
-    private values;
-    private resultSelector;
-    private iterators;
-    private active;
-    constructor(destination: Subscriber<R>, resultSelector?: (...values: Array<any>) => R, values?: any);
-    protected _next(value: any): void;
-    protected _complete(): void;
-    notifyInactive(): void;
-    checkIterators(): void;
-    protected _tryresultSelector(args: any[]): void;
-}
diff --git a/node_modules/rxjs/internal/observable/zip.js b/node_modules/rxjs/internal/observable/zip.js
deleted file mode 100644
index 1bfd530..0000000
--- a/node_modules/rxjs/internal/observable/zip.js
+++ /dev/null
@@ -1,230 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var fromArray_1 = require("./fromArray");
-var isArray_1 = require("../util/isArray");
-var Subscriber_1 = require("../Subscriber");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var iterator_1 = require("../../internal/symbol/iterator");
-function zip() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var resultSelector = observables[observables.length - 1];
-    if (typeof resultSelector === 'function') {
-        observables.pop();
-    }
-    return fromArray_1.fromArray(observables, undefined).lift(new ZipOperator(resultSelector));
-}
-exports.zip = zip;
-var ZipOperator = (function () {
-    function ZipOperator(resultSelector) {
-        this.resultSelector = resultSelector;
-    }
-    ZipOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));
-    };
-    return ZipOperator;
-}());
-exports.ZipOperator = ZipOperator;
-var ZipSubscriber = (function (_super) {
-    __extends(ZipSubscriber, _super);
-    function ZipSubscriber(destination, resultSelector, values) {
-        if (values === void 0) { values = Object.create(null); }
-        var _this = _super.call(this, destination) || this;
-        _this.iterators = [];
-        _this.active = 0;
-        _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null;
-        _this.values = values;
-        return _this;
-    }
-    ZipSubscriber.prototype._next = function (value) {
-        var iterators = this.iterators;
-        if (isArray_1.isArray(value)) {
-            iterators.push(new StaticArrayIterator(value));
-        }
-        else if (typeof value[iterator_1.iterator] === 'function') {
-            iterators.push(new StaticIterator(value[iterator_1.iterator]()));
-        }
-        else {
-            iterators.push(new ZipBufferIterator(this.destination, this, value));
-        }
-    };
-    ZipSubscriber.prototype._complete = function () {
-        var iterators = this.iterators;
-        var len = iterators.length;
-        this.unsubscribe();
-        if (len === 0) {
-            this.destination.complete();
-            return;
-        }
-        this.active = len;
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (iterator.stillUnsubscribed) {
-                var destination = this.destination;
-                destination.add(iterator.subscribe(iterator, i));
-            }
-            else {
-                this.active--;
-            }
-        }
-    };
-    ZipSubscriber.prototype.notifyInactive = function () {
-        this.active--;
-        if (this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    ZipSubscriber.prototype.checkIterators = function () {
-        var iterators = this.iterators;
-        var len = iterators.length;
-        var destination = this.destination;
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {
-                return;
-            }
-        }
-        var shouldComplete = false;
-        var args = [];
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            var result = iterator.next();
-            if (iterator.hasCompleted()) {
-                shouldComplete = true;
-            }
-            if (result.done) {
-                destination.complete();
-                return;
-            }
-            args.push(result.value);
-        }
-        if (this.resultSelector) {
-            this._tryresultSelector(args);
-        }
-        else {
-            destination.next(args);
-        }
-        if (shouldComplete) {
-            destination.complete();
-        }
-    };
-    ZipSubscriber.prototype._tryresultSelector = function (args) {
-        var result;
-        try {
-            result = this.resultSelector.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return ZipSubscriber;
-}(Subscriber_1.Subscriber));
-exports.ZipSubscriber = ZipSubscriber;
-var StaticIterator = (function () {
-    function StaticIterator(iterator) {
-        this.iterator = iterator;
-        this.nextResult = iterator.next();
-    }
-    StaticIterator.prototype.hasValue = function () {
-        return true;
-    };
-    StaticIterator.prototype.next = function () {
-        var result = this.nextResult;
-        this.nextResult = this.iterator.next();
-        return result;
-    };
-    StaticIterator.prototype.hasCompleted = function () {
-        var nextResult = this.nextResult;
-        return nextResult && nextResult.done;
-    };
-    return StaticIterator;
-}());
-var StaticArrayIterator = (function () {
-    function StaticArrayIterator(array) {
-        this.array = array;
-        this.index = 0;
-        this.length = 0;
-        this.length = array.length;
-    }
-    StaticArrayIterator.prototype[iterator_1.iterator] = function () {
-        return this;
-    };
-    StaticArrayIterator.prototype.next = function (value) {
-        var i = this.index++;
-        var array = this.array;
-        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
-    };
-    StaticArrayIterator.prototype.hasValue = function () {
-        return this.array.length > this.index;
-    };
-    StaticArrayIterator.prototype.hasCompleted = function () {
-        return this.array.length === this.index;
-    };
-    return StaticArrayIterator;
-}());
-var ZipBufferIterator = (function (_super) {
-    __extends(ZipBufferIterator, _super);
-    function ZipBufferIterator(destination, parent, observable) {
-        var _this = _super.call(this, destination) || this;
-        _this.parent = parent;
-        _this.observable = observable;
-        _this.stillUnsubscribed = true;
-        _this.buffer = [];
-        _this.isComplete = false;
-        return _this;
-    }
-    ZipBufferIterator.prototype[iterator_1.iterator] = function () {
-        return this;
-    };
-    ZipBufferIterator.prototype.next = function () {
-        var buffer = this.buffer;
-        if (buffer.length === 0 && this.isComplete) {
-            return { value: null, done: true };
-        }
-        else {
-            return { value: buffer.shift(), done: false };
-        }
-    };
-    ZipBufferIterator.prototype.hasValue = function () {
-        return this.buffer.length > 0;
-    };
-    ZipBufferIterator.prototype.hasCompleted = function () {
-        return this.buffer.length === 0 && this.isComplete;
-    };
-    ZipBufferIterator.prototype.notifyComplete = function () {
-        if (this.buffer.length > 0) {
-            this.isComplete = true;
-            this.parent.notifyInactive();
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.buffer.push(innerValue);
-        this.parent.checkIterators();
-    };
-    ZipBufferIterator.prototype.subscribe = function (value, index) {
-        return subscribeToResult_1.subscribeToResult(this, this.observable, this, index);
-    };
-    return ZipBufferIterator;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=zip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/observable/zip.js.map b/node_modules/rxjs/internal/observable/zip.js.map
deleted file mode 100644
index 55b78fd..0000000
--- a/node_modules/rxjs/internal/observable/zip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zip.js","sources":["../../src/internal/observable/zip.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/audit.d.ts b/node_modules/rxjs/internal/operators/audit.d.ts
deleted file mode 100644
index d7b250a..0000000
--- a/node_modules/rxjs/internal/operators/audit.d.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { MonoTypeOperatorFunction, SubscribableOrPromise } from '../types';
-/**
- * Ignores source values for a duration determined by another Observable, then
- * emits the most recent value from the source Observable, then repeats this
- * process.
- *
- * <span class="informal">It's like {@link auditTime}, but the silencing
- * duration is determined by a second Observable.</span>
- *
- * ![](audit.png)
- *
- * `audit` is similar to `throttle`, but emits the last value from the silenced
- * time window, instead of the first value. `audit` emits the most recent value
- * from the source Observable on the output Observable as soon as its internal
- * timer becomes disabled, and ignores source values while the timer is enabled.
- * Initially, the timer is disabled. As soon as the first source value arrives,
- * the timer is enabled by calling the `durationSelector` function with the
- * source value, which returns the "duration" Observable. When the duration
- * Observable emits a value or completes, the timer is disabled, then the most
- * recent source value is emitted on the output Observable, and this process
- * repeats for the next source value.
- *
- * ## Example
- *
- * Emit clicks at a rate of at most one click per second
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { audit } from 'rxjs/operators'
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(audit(ev => interval(1000)));
- * result.subscribe(x => console.log(x));
- * ```
- * @see {@link auditTime}
- * @see {@link debounce}
- * @see {@link delayWhen}
- * @see {@link sample}
- * @see {@link throttle}
- *
- * @param {function(value: T): SubscribableOrPromise} durationSelector A function
- * that receives a value from the source Observable, for computing the silencing
- * duration, returned as an Observable or a Promise.
- * @return {Observable<T>} An Observable that performs rate-limiting of
- * emissions from the source Observable.
- * @method audit
- * @owner Observable
- */
-export declare function audit<T>(durationSelector: (value: T) => SubscribableOrPromise<any>): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/audit.js b/node_modules/rxjs/internal/operators/audit.js
deleted file mode 100644
index e6e13ca..0000000
--- a/node_modules/rxjs/internal/operators/audit.js
+++ /dev/null
@@ -1,83 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function audit(durationSelector) {
-    return function auditOperatorFunction(source) {
-        return source.lift(new AuditOperator(durationSelector));
-    };
-}
-exports.audit = audit;
-var AuditOperator = (function () {
-    function AuditOperator(durationSelector) {
-        this.durationSelector = durationSelector;
-    }
-    AuditOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector));
-    };
-    return AuditOperator;
-}());
-var AuditSubscriber = (function (_super) {
-    __extends(AuditSubscriber, _super);
-    function AuditSubscriber(destination, durationSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.durationSelector = durationSelector;
-        _this.hasValue = false;
-        return _this;
-    }
-    AuditSubscriber.prototype._next = function (value) {
-        this.value = value;
-        this.hasValue = true;
-        if (!this.throttled) {
-            var duration = void 0;
-            try {
-                var durationSelector = this.durationSelector;
-                duration = durationSelector(value);
-            }
-            catch (err) {
-                return this.destination.error(err);
-            }
-            var innerSubscription = subscribeToResult_1.subscribeToResult(this, duration);
-            if (!innerSubscription || innerSubscription.closed) {
-                this.clearThrottle();
-            }
-            else {
-                this.add(this.throttled = innerSubscription);
-            }
-        }
-    };
-    AuditSubscriber.prototype.clearThrottle = function () {
-        var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled;
-        if (throttled) {
-            this.remove(throttled);
-            this.throttled = null;
-            throttled.unsubscribe();
-        }
-        if (hasValue) {
-            this.value = null;
-            this.hasValue = false;
-            this.destination.next(value);
-        }
-    };
-    AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {
-        this.clearThrottle();
-    };
-    AuditSubscriber.prototype.notifyComplete = function () {
-        this.clearThrottle();
-    };
-    return AuditSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=audit.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/audit.js.map b/node_modules/rxjs/internal/operators/audit.js.map
deleted file mode 100644
index 2ecdf90..0000000
--- a/node_modules/rxjs/internal/operators/audit.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"audit.js","sources":["../../src/internal/operators/audit.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAMA,sDAAqD;AACrD,+DAA8D;AAgD9D,SAAgB,KAAK,CAAI,gBAA0D;IACjF,OAAO,SAAS,qBAAqB,CAAC,MAAqB;QACzD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC;AAJD,sBAIC;AAED;IACE,uBAAoB,gBAA0D;QAA1D,qBAAgB,GAAhB,gBAAgB,CAA0C;IAC9E,CAAC;IAED,4BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAO,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACxF,CAAC;IACH,oBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAoC,mCAAqB;IAMvD,yBAAY,WAA0B,EAClB,gBAA0D;QAD9E,YAEE,kBAAM,WAAW,CAAC,SACnB;QAFmB,sBAAgB,GAAhB,gBAAgB,CAA0C;QAJtE,cAAQ,GAAY,KAAK,CAAC;;IAMlC,CAAC;IAES,+BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,QAAQ,SAAA,CAAC;YACb,IAAI;gBACM,IAAA,wCAAgB,CAAU;gBAClC,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;aACpC;YAAC,OAAO,GAAG,EAAE;gBACZ,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACpC;YACD,IAAM,iBAAiB,GAAG,qCAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC5D,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,EAAE;gBAClD,IAAI,CAAC,aAAa,EAAE,CAAC;aACtB;iBAAM;gBACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,CAAC;aAC9C;SACF;IACH,CAAC;IAED,uCAAa,GAAb;QACQ,IAAA,SAAqC,EAAnC,gBAAK,EAAE,sBAAQ,EAAE,wBAAS,CAAU;QAC5C,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,SAAS,CAAC,WAAW,EAAE,CAAC;SACzB;QACD,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IAED,oCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAAE,UAAkB,EAAE,UAAkB;QAC7E,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,wCAAc,GAAd;QACE,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IACH,sBAAC;AAAD,CAAC,AApDD,CAAoC,iCAAe,GAoDlD"}
diff --git a/node_modules/rxjs/internal/operators/auditTime.d.ts b/node_modules/rxjs/internal/operators/auditTime.d.ts
deleted file mode 100644
index 5c2f910..0000000
--- a/node_modules/rxjs/internal/operators/auditTime.d.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
-/**
- * Ignores source values for `duration` milliseconds, then emits the most recent
- * value from the source Observable, then repeats this process.
- *
- * <span class="informal">When it sees a source value, it ignores that plus
- * the next ones for `duration` milliseconds, and then it emits the most recent
- * value from the source.</span>
- *
- * ![](auditTime.png)
- *
- * `auditTime` is similar to `throttleTime`, but emits the last value from the
- * silenced time window, instead of the first value. `auditTime` emits the most
- * recent value from the source Observable on the output Observable as soon as
- * its internal timer becomes disabled, and ignores source values while the
- * timer is enabled. Initially, the timer is disabled. As soon as the first
- * source value arrives, the timer is enabled. After `duration` milliseconds (or
- * the time unit determined internally by the optional `scheduler`) has passed,
- * the timer is disabled, then the most recent source value is emitted on the
- * output Observable, and this process repeats for the next source value.
- * Optionally takes a {@link SchedulerLike} for managing timers.
- *
- * ## Example
- *
- * Emit clicks at a rate of at most one click per second
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { auditTime } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(auditTime(1000));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link audit}
- * @see {@link debounceTime}
- * @see {@link delay}
- * @see {@link sampleTime}
- * @see {@link throttleTime}
- *
- * @param {number} duration Time to wait before emitting the most recent source
- * value, measured in milliseconds or the time unit determined internally
- * by the optional `scheduler`.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
- * managing the timers that handle the rate-limiting behavior.
- * @return {Observable<T>} An Observable that performs rate-limiting of
- * emissions from the source Observable.
- * @method auditTime
- * @owner Observable
- */
-export declare function auditTime<T>(duration: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/auditTime.js b/node_modules/rxjs/internal/operators/auditTime.js
deleted file mode 100644
index 195f261..0000000
--- a/node_modules/rxjs/internal/operators/auditTime.js
+++ /dev/null
@@ -1,11 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var audit_1 = require("./audit");
-var timer_1 = require("../observable/timer");
-function auditTime(duration, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return audit_1.audit(function () { return timer_1.timer(duration, scheduler); });
-}
-exports.auditTime = auditTime;
-//# sourceMappingURL=auditTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/auditTime.js.map b/node_modules/rxjs/internal/operators/auditTime.js.map
deleted file mode 100644
index 7042a37..0000000
--- a/node_modules/rxjs/internal/operators/auditTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"auditTime.js","sources":["../../src/internal/operators/auditTime.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAC3C,iCAAgC;AAChC,6CAA4C;AAoD5C,SAAgB,SAAS,CAAI,QAAgB,EAAE,SAAgC;IAAhC,0BAAA,EAAA,YAA2B,aAAK;IAC7E,OAAO,aAAK,CAAC,cAAM,OAAA,aAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,EAA1B,CAA0B,CAAC,CAAC;AACjD,CAAC;AAFD,8BAEC"}
diff --git a/node_modules/rxjs/internal/operators/buffer.d.ts b/node_modules/rxjs/internal/operators/buffer.d.ts
deleted file mode 100644
index ee4f507..0000000
--- a/node_modules/rxjs/internal/operators/buffer.d.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-/**
- * Buffers the source Observable values until `closingNotifier` emits.
- *
- * <span class="informal">Collects values from the past as an array, and emits
- * that array only when another Observable emits.</span>
- *
- * ![](buffer.png)
- *
- * Buffers the incoming Observable values until the given `closingNotifier`
- * Observable emits a value, at which point it emits the buffer on the output
- * Observable and starts a new buffer internally, awaiting the next time
- * `closingNotifier` emits.
- *
- * ## Example
- *
- * On every click, emit array of most recent interval events
- *
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { buffer } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const intervalEvents = interval(1000);
- * const buffered = intervalEvents.pipe(buffer(clicks));
- * buffered.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link bufferCount}
- * @see {@link bufferTime}
- * @see {@link bufferToggle}
- * @see {@link bufferWhen}
- * @see {@link window}
- *
- * @param {Observable<any>} closingNotifier An Observable that signals the
- * buffer to be emitted on the output Observable.
- * @return {Observable<T[]>} An Observable of buffers, which are arrays of
- * values.
- * @method buffer
- * @owner Observable
- */
-export declare function buffer<T>(closingNotifier: Observable<any>): OperatorFunction<T, T[]>;
diff --git a/node_modules/rxjs/internal/operators/buffer.js b/node_modules/rxjs/internal/operators/buffer.js
deleted file mode 100644
index d978765..0000000
--- a/node_modules/rxjs/internal/operators/buffer.js
+++ /dev/null
@@ -1,51 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function buffer(closingNotifier) {
-    return function bufferOperatorFunction(source) {
-        return source.lift(new BufferOperator(closingNotifier));
-    };
-}
-exports.buffer = buffer;
-var BufferOperator = (function () {
-    function BufferOperator(closingNotifier) {
-        this.closingNotifier = closingNotifier;
-    }
-    BufferOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
-    };
-    return BufferOperator;
-}());
-var BufferSubscriber = (function (_super) {
-    __extends(BufferSubscriber, _super);
-    function BufferSubscriber(destination, closingNotifier) {
-        var _this = _super.call(this, destination) || this;
-        _this.buffer = [];
-        _this.add(subscribeToResult_1.subscribeToResult(_this, closingNotifier));
-        return _this;
-    }
-    BufferSubscriber.prototype._next = function (value) {
-        this.buffer.push(value);
-    };
-    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var buffer = this.buffer;
-        this.buffer = [];
-        this.destination.next(buffer);
-    };
-    return BufferSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=buffer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/buffer.js.map b/node_modules/rxjs/internal/operators/buffer.js.map
deleted file mode 100644
index d9a54cb..0000000
--- a/node_modules/rxjs/internal/operators/buffer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"buffer.js","sources":["../../src/internal/operators/buffer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,sDAAqD;AAErD,+DAA8D;AA2C9D,SAAgB,MAAM,CAAI,eAAgC;IACxD,OAAO,SAAS,sBAAsB,CAAC,MAAqB;QAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAI,eAAe,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAJD,wBAIC;AAED;IAEE,wBAAoB,eAAgC;QAAhC,oBAAe,GAAf,eAAe,CAAiB;IACpD,CAAC;IAED,6BAAI,GAAJ,UAAK,UAA2B,EAAE,MAAW;QAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAClF,CAAC;IACH,qBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAkC,oCAAuB;IAGvD,0BAAY,WAA4B,EAAE,eAAgC;QAA1E,YACE,kBAAM,WAAW,CAAC,SAEnB;QALO,YAAM,GAAQ,EAAE,CAAC;QAIvB,KAAI,CAAC,GAAG,CAAC,qCAAiB,CAAC,KAAI,EAAE,eAAe,CAAC,CAAC,CAAC;;IACrD,CAAC;IAES,gCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,qCAAU,GAAV,UAAW,UAAa,EAAE,UAAe,EAC9B,UAAkB,EAAE,UAAkB,EACtC,QAAiC;QAC1C,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACH,uBAAC;AAAD,CAAC,AAnBD,CAAkC,iCAAe,GAmBhD"}
diff --git a/node_modules/rxjs/internal/operators/bufferCount.d.ts b/node_modules/rxjs/internal/operators/bufferCount.d.ts
deleted file mode 100644
index dd764e6..0000000
--- a/node_modules/rxjs/internal/operators/bufferCount.d.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { OperatorFunction } from '../types';
-/**
- * Buffers the source Observable values until the size hits the maximum
- * `bufferSize` given.
- *
- * <span class="informal">Collects values from the past as an array, and emits
- * that array only when its size reaches `bufferSize`.</span>
- *
- * ![](bufferCount.png)
- *
- * Buffers a number of values from the source Observable by `bufferSize` then
- * emits the buffer and clears it, and starts a new buffer each
- * `startBufferEvery` values. If `startBufferEvery` is not provided or is
- * `null`, then new buffers are started immediately at the start of the source
- * and when each buffer closes and is emitted.
- *
- * ## Examples
- *
- * Emit the last two click events as an array
- *
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { bufferCount } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const buffered = clicks.pipe(bufferCount(2));
- * buffered.subscribe(x => console.log(x));
- * ```
- *
- * On every click, emit the last two click events as an array
- *
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { bufferCount } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const buffered = clicks.pipe(bufferCount(2, 1));
- * buffered.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link buffer}
- * @see {@link bufferTime}
- * @see {@link bufferToggle}
- * @see {@link bufferWhen}
- * @see {@link pairwise}
- * @see {@link windowCount}
- *
- * @param {number} bufferSize The maximum size of the buffer emitted.
- * @param {number} [startBufferEvery] Interval at which to start a new buffer.
- * For example if `startBufferEvery` is `2`, then a new buffer will be started
- * on every other value from the source. A new buffer is started at the
- * beginning of the source by default.
- * @return {Observable<T[]>} An Observable of arrays of buffered values.
- * @method bufferCount
- * @owner Observable
- */
-export declare function bufferCount<T>(bufferSize: number, startBufferEvery?: number): OperatorFunction<T, T[]>;
diff --git a/node_modules/rxjs/internal/operators/bufferCount.js b/node_modules/rxjs/internal/operators/bufferCount.js
deleted file mode 100644
index 39dd40e..0000000
--- a/node_modules/rxjs/internal/operators/bufferCount.js
+++ /dev/null
@@ -1,102 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function bufferCount(bufferSize, startBufferEvery) {
-    if (startBufferEvery === void 0) { startBufferEvery = null; }
-    return function bufferCountOperatorFunction(source) {
-        return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));
-    };
-}
-exports.bufferCount = bufferCount;
-var BufferCountOperator = (function () {
-    function BufferCountOperator(bufferSize, startBufferEvery) {
-        this.bufferSize = bufferSize;
-        this.startBufferEvery = startBufferEvery;
-        if (!startBufferEvery || bufferSize === startBufferEvery) {
-            this.subscriberClass = BufferCountSubscriber;
-        }
-        else {
-            this.subscriberClass = BufferSkipCountSubscriber;
-        }
-    }
-    BufferCountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
-    };
-    return BufferCountOperator;
-}());
-var BufferCountSubscriber = (function (_super) {
-    __extends(BufferCountSubscriber, _super);
-    function BufferCountSubscriber(destination, bufferSize) {
-        var _this = _super.call(this, destination) || this;
-        _this.bufferSize = bufferSize;
-        _this.buffer = [];
-        return _this;
-    }
-    BufferCountSubscriber.prototype._next = function (value) {
-        var buffer = this.buffer;
-        buffer.push(value);
-        if (buffer.length == this.bufferSize) {
-            this.destination.next(buffer);
-            this.buffer = [];
-        }
-    };
-    BufferCountSubscriber.prototype._complete = function () {
-        var buffer = this.buffer;
-        if (buffer.length > 0) {
-            this.destination.next(buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferCountSubscriber;
-}(Subscriber_1.Subscriber));
-var BufferSkipCountSubscriber = (function (_super) {
-    __extends(BufferSkipCountSubscriber, _super);
-    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {
-        var _this = _super.call(this, destination) || this;
-        _this.bufferSize = bufferSize;
-        _this.startBufferEvery = startBufferEvery;
-        _this.buffers = [];
-        _this.count = 0;
-        return _this;
-    }
-    BufferSkipCountSubscriber.prototype._next = function (value) {
-        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;
-        this.count++;
-        if (count % startBufferEvery === 0) {
-            buffers.push([]);
-        }
-        for (var i = buffers.length; i--;) {
-            var buffer = buffers[i];
-            buffer.push(value);
-            if (buffer.length === bufferSize) {
-                buffers.splice(i, 1);
-                this.destination.next(buffer);
-            }
-        }
-    };
-    BufferSkipCountSubscriber.prototype._complete = function () {
-        var _a = this, buffers = _a.buffers, destination = _a.destination;
-        while (buffers.length > 0) {
-            var buffer = buffers.shift();
-            if (buffer.length > 0) {
-                destination.next(buffer);
-            }
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferSkipCountSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=bufferCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/bufferCount.js.map b/node_modules/rxjs/internal/operators/bufferCount.js.map
deleted file mode 100644
index dcaa26f..0000000
--- a/node_modules/rxjs/internal/operators/bufferCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferCount.js","sources":["../../src/internal/operators/bufferCount.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/bufferTime.d.ts b/node_modules/rxjs/internal/operators/bufferTime.d.ts
deleted file mode 100644
index b68efb1..0000000
--- a/node_modules/rxjs/internal/operators/bufferTime.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { OperatorFunction, SchedulerLike } from '../types';
-export declare function bufferTime<T>(bufferTimeSpan: number, scheduler?: SchedulerLike): OperatorFunction<T, T[]>;
-export declare function bufferTime<T>(bufferTimeSpan: number, bufferCreationInterval: number | null | undefined, scheduler?: SchedulerLike): OperatorFunction<T, T[]>;
-export declare function bufferTime<T>(bufferTimeSpan: number, bufferCreationInterval: number | null | undefined, maxBufferSize: number, scheduler?: SchedulerLike): OperatorFunction<T, T[]>;
diff --git a/node_modules/rxjs/internal/operators/bufferTime.js b/node_modules/rxjs/internal/operators/bufferTime.js
deleted file mode 100644
index 1cd2203..0000000
--- a/node_modules/rxjs/internal/operators/bufferTime.js
+++ /dev/null
@@ -1,162 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var Subscriber_1 = require("../Subscriber");
-var isScheduler_1 = require("../util/isScheduler");
-function bufferTime(bufferTimeSpan) {
-    var length = arguments.length;
-    var scheduler = async_1.async;
-    if (isScheduler_1.isScheduler(arguments[arguments.length - 1])) {
-        scheduler = arguments[arguments.length - 1];
-        length--;
-    }
-    var bufferCreationInterval = null;
-    if (length >= 2) {
-        bufferCreationInterval = arguments[1];
-    }
-    var maxBufferSize = Number.POSITIVE_INFINITY;
-    if (length >= 3) {
-        maxBufferSize = arguments[2];
-    }
-    return function bufferTimeOperatorFunction(source) {
-        return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));
-    };
-}
-exports.bufferTime = bufferTime;
-var BufferTimeOperator = (function () {
-    function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
-        this.bufferTimeSpan = bufferTimeSpan;
-        this.bufferCreationInterval = bufferCreationInterval;
-        this.maxBufferSize = maxBufferSize;
-        this.scheduler = scheduler;
-    }
-    BufferTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler));
-    };
-    return BufferTimeOperator;
-}());
-var Context = (function () {
-    function Context() {
-        this.buffer = [];
-    }
-    return Context;
-}());
-var BufferTimeSubscriber = (function (_super) {
-    __extends(BufferTimeSubscriber, _super);
-    function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.bufferTimeSpan = bufferTimeSpan;
-        _this.bufferCreationInterval = bufferCreationInterval;
-        _this.maxBufferSize = maxBufferSize;
-        _this.scheduler = scheduler;
-        _this.contexts = [];
-        var context = _this.openContext();
-        _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;
-        if (_this.timespanOnly) {
-            var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan };
-            _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-        }
-        else {
-            var closeState = { subscriber: _this, context: context };
-            var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler };
-            _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState));
-            _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState));
-        }
-        return _this;
-    }
-    BufferTimeSubscriber.prototype._next = function (value) {
-        var contexts = this.contexts;
-        var len = contexts.length;
-        var filledBufferContext;
-        for (var i = 0; i < len; i++) {
-            var context_1 = contexts[i];
-            var buffer = context_1.buffer;
-            buffer.push(value);
-            if (buffer.length == this.maxBufferSize) {
-                filledBufferContext = context_1;
-            }
-        }
-        if (filledBufferContext) {
-            this.onBufferFull(filledBufferContext);
-        }
-    };
-    BufferTimeSubscriber.prototype._error = function (err) {
-        this.contexts.length = 0;
-        _super.prototype._error.call(this, err);
-    };
-    BufferTimeSubscriber.prototype._complete = function () {
-        var _a = this, contexts = _a.contexts, destination = _a.destination;
-        while (contexts.length > 0) {
-            var context_2 = contexts.shift();
-            destination.next(context_2.buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    BufferTimeSubscriber.prototype._unsubscribe = function () {
-        this.contexts = null;
-    };
-    BufferTimeSubscriber.prototype.onBufferFull = function (context) {
-        this.closeContext(context);
-        var closeAction = context.closeAction;
-        closeAction.unsubscribe();
-        this.remove(closeAction);
-        if (!this.closed && this.timespanOnly) {
-            context = this.openContext();
-            var bufferTimeSpan = this.bufferTimeSpan;
-            var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan };
-            this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-        }
-    };
-    BufferTimeSubscriber.prototype.openContext = function () {
-        var context = new Context();
-        this.contexts.push(context);
-        return context;
-    };
-    BufferTimeSubscriber.prototype.closeContext = function (context) {
-        this.destination.next(context.buffer);
-        var contexts = this.contexts;
-        var spliceIndex = contexts ? contexts.indexOf(context) : -1;
-        if (spliceIndex >= 0) {
-            contexts.splice(contexts.indexOf(context), 1);
-        }
-    };
-    return BufferTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchBufferTimeSpanOnly(state) {
-    var subscriber = state.subscriber;
-    var prevContext = state.context;
-    if (prevContext) {
-        subscriber.closeContext(prevContext);
-    }
-    if (!subscriber.closed) {
-        state.context = subscriber.openContext();
-        state.context.closeAction = this.schedule(state, state.bufferTimeSpan);
-    }
-}
-function dispatchBufferCreation(state) {
-    var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler;
-    var context = subscriber.openContext();
-    var action = this;
-    if (!subscriber.closed) {
-        subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context }));
-        action.schedule(state, bufferCreationInterval);
-    }
-}
-function dispatchBufferClose(arg) {
-    var subscriber = arg.subscriber, context = arg.context;
-    subscriber.closeContext(context);
-}
-//# sourceMappingURL=bufferTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/bufferTime.js.map b/node_modules/rxjs/internal/operators/bufferTime.js.map
deleted file mode 100644
index a94eba2..0000000
--- a/node_modules/rxjs/internal/operators/bufferTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferTime.js","sources":["../../src/internal/operators/bufferTime.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/bufferToggle.d.ts b/node_modules/rxjs/internal/operators/bufferToggle.d.ts
deleted file mode 100644
index 87afb80..0000000
--- a/node_modules/rxjs/internal/operators/bufferToggle.d.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { OperatorFunction, SubscribableOrPromise } from '../types';
-/**
- * Buffers the source Observable values starting from an emission from
- * `openings` and ending when the output of `closingSelector` emits.
- *
- * <span class="informal">Collects values from the past as an array. Starts
- * collecting only when `opening` emits, and calls the `closingSelector`
- * function to get an Observable that tells when to close the buffer.</span>
- *
- * ![](bufferToggle.png)
- *
- * Buffers values from the source by opening the buffer via signals from an
- * Observable provided to `openings`, and closing and sending the buffers when
- * a Subscribable or Promise returned by the `closingSelector` function emits.
- *
- * ## Example
- *
- * Every other second, emit the click events from the next 500ms
- *
- * ```ts
- * import { fromEvent, interval, EMPTY } from 'rxjs';
- * import { bufferToggle } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const openings = interval(1000);
- * const buffered = clicks.pipe(bufferToggle(openings, i =>
- *   i % 2 ? interval(500) : EMPTY
- * ));
- * buffered.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link buffer}
- * @see {@link bufferCount}
- * @see {@link bufferTime}
- * @see {@link bufferWhen}
- * @see {@link windowToggle}
- *
- * @param {SubscribableOrPromise<O>} openings A Subscribable or Promise of notifications to start new
- * buffers.
- * @param {function(value: O): SubscribableOrPromise} closingSelector A function that takes
- * the value emitted by the `openings` observable and returns a Subscribable or Promise,
- * which, when it emits, signals that the associated buffer should be emitted
- * and cleared.
- * @return {Observable<T[]>} An observable of arrays of buffered values.
- * @method bufferToggle
- * @owner Observable
- */
-export declare function bufferToggle<T, O>(openings: SubscribableOrPromise<O>, closingSelector: (value: O) => SubscribableOrPromise<any>): OperatorFunction<T, T[]>;
diff --git a/node_modules/rxjs/internal/operators/bufferToggle.js b/node_modules/rxjs/internal/operators/bufferToggle.js
deleted file mode 100644
index 2cdc9fa..0000000
--- a/node_modules/rxjs/internal/operators/bufferToggle.js
+++ /dev/null
@@ -1,121 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscription_1 = require("../Subscription");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-function bufferToggle(openings, closingSelector) {
-    return function bufferToggleOperatorFunction(source) {
-        return source.lift(new BufferToggleOperator(openings, closingSelector));
-    };
-}
-exports.bufferToggle = bufferToggle;
-var BufferToggleOperator = (function () {
-    function BufferToggleOperator(openings, closingSelector) {
-        this.openings = openings;
-        this.closingSelector = closingSelector;
-    }
-    BufferToggleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));
-    };
-    return BufferToggleOperator;
-}());
-var BufferToggleSubscriber = (function (_super) {
-    __extends(BufferToggleSubscriber, _super);
-    function BufferToggleSubscriber(destination, openings, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.openings = openings;
-        _this.closingSelector = closingSelector;
-        _this.contexts = [];
-        _this.add(subscribeToResult_1.subscribeToResult(_this, openings));
-        return _this;
-    }
-    BufferToggleSubscriber.prototype._next = function (value) {
-        var contexts = this.contexts;
-        var len = contexts.length;
-        for (var i = 0; i < len; i++) {
-            contexts[i].buffer.push(value);
-        }
-    };
-    BufferToggleSubscriber.prototype._error = function (err) {
-        var contexts = this.contexts;
-        while (contexts.length > 0) {
-            var context_1 = contexts.shift();
-            context_1.subscription.unsubscribe();
-            context_1.buffer = null;
-            context_1.subscription = null;
-        }
-        this.contexts = null;
-        _super.prototype._error.call(this, err);
-    };
-    BufferToggleSubscriber.prototype._complete = function () {
-        var contexts = this.contexts;
-        while (contexts.length > 0) {
-            var context_2 = contexts.shift();
-            this.destination.next(context_2.buffer);
-            context_2.subscription.unsubscribe();
-            context_2.buffer = null;
-            context_2.subscription = null;
-        }
-        this.contexts = null;
-        _super.prototype._complete.call(this);
-    };
-    BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
-    };
-    BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.closeBuffer(innerSub.context);
-    };
-    BufferToggleSubscriber.prototype.openBuffer = function (value) {
-        try {
-            var closingSelector = this.closingSelector;
-            var closingNotifier = closingSelector.call(this, value);
-            if (closingNotifier) {
-                this.trySubscribe(closingNotifier);
-            }
-        }
-        catch (err) {
-            this._error(err);
-        }
-    };
-    BufferToggleSubscriber.prototype.closeBuffer = function (context) {
-        var contexts = this.contexts;
-        if (contexts && context) {
-            var buffer = context.buffer, subscription = context.subscription;
-            this.destination.next(buffer);
-            contexts.splice(contexts.indexOf(context), 1);
-            this.remove(subscription);
-            subscription.unsubscribe();
-        }
-    };
-    BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) {
-        var contexts = this.contexts;
-        var buffer = [];
-        var subscription = new Subscription_1.Subscription();
-        var context = { buffer: buffer, subscription: subscription };
-        contexts.push(context);
-        var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context);
-        if (!innerSubscription || innerSubscription.closed) {
-            this.closeBuffer(context);
-        }
-        else {
-            innerSubscription.context = context;
-            this.add(innerSubscription);
-            subscription.add(innerSubscription);
-        }
-    };
-    return BufferToggleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=bufferToggle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/bufferToggle.js.map b/node_modules/rxjs/internal/operators/bufferToggle.js.map
deleted file mode 100644
index 41cced9..0000000
--- a/node_modules/rxjs/internal/operators/bufferToggle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferToggle.js","sources":["../../src/internal/operators/bufferToggle.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,gDAA+C;AAC/C,+DAA8D;AAC9D,sDAAqD;AAkDrD,SAAgB,YAAY,CAC1B,QAAkC,EAClC,eAAyD;IAEzD,OAAO,SAAS,4BAA4B,CAAC,MAAqB;QAChE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAO,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC;AACJ,CAAC;AAPD,oCAOC;AAED;IAEE,8BAAoB,QAAkC,EAClC,eAAyD;QADzD,aAAQ,GAAR,QAAQ,CAA0B;QAClC,oBAAe,GAAf,eAAe,CAA0C;IAC7E,CAAC;IAED,mCAAI,GAAJ,UAAK,UAA2B,EAAE,MAAW;QAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACvG,CAAC;IACH,2BAAC;AAAD,CAAC,AATD,IASC;AAYD;IAA2C,0CAAqB;IAG9D,gCAAY,WAA4B,EACpB,QAAkC,EAClC,eAAgE;QAFpF,YAGE,kBAAM,WAAW,CAAC,SAEnB;QAJmB,cAAQ,GAAR,QAAQ,CAA0B;QAClC,qBAAe,GAAf,eAAe,CAAiD;QAJ5E,cAAQ,GAA4B,EAAE,CAAC;QAM7C,KAAI,CAAC,GAAG,CAAC,qCAAiB,CAAC,KAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;;IAC9C,CAAC;IAES,sCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YAC5B,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAChC;IACH,CAAC;IAES,uCAAM,GAAhB,UAAiB,GAAQ;QACvB,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,IAAM,SAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjC,SAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YACnC,SAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YACtB,SAAO,CAAC,YAAY,GAAG,IAAI,CAAC;SAC7B;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,iBAAM,MAAM,YAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAES,0CAAS,GAAnB;QACE,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,IAAM,SAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAO,CAAC,MAAM,CAAC,CAAC;YACtC,SAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YACnC,SAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YACtB,SAAO,CAAC,YAAY,GAAG,IAAI,CAAC;SAC7B;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,iBAAM,SAAS,WAAE,CAAC;IACpB,CAAC;IAED,2CAAU,GAAV,UAAW,UAAe,EAAE,UAAa,EAC9B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC1E,CAAC;IAED,+CAAc,GAAd,UAAe,QAA+B;QAC5C,IAAI,CAAC,WAAW,CAAQ,QAAS,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEO,2CAAU,GAAlB,UAAmB,KAAQ;QACzB,IAAI;YACF,IAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;YAC7C,IAAM,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1D,IAAI,eAAe,EAAE;gBACnB,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;aACpC;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAClB;IACH,CAAC;IAEO,4CAAW,GAAnB,UAAoB,OAAyB;QAC3C,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,IAAI,QAAQ,IAAI,OAAO,EAAE;YACf,IAAA,uBAAM,EAAE,mCAAY,CAAa;YACzC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9B,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC1B,YAAY,CAAC,WAAW,EAAE,CAAC;SAC5B;IACH,CAAC;IAEO,6CAAY,GAApB,UAAqB,eAAoB;QACvC,IAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,IAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAM,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;QACxC,IAAM,OAAO,GAAG,EAAE,MAAM,QAAA,EAAE,YAAY,cAAA,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEvB,IAAM,iBAAiB,GAAG,qCAAiB,CAAC,IAAI,EAAE,eAAe,EAAO,OAAO,CAAC,CAAC;QAEjF,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,EAAE;YAClD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;SAC3B;aAAM;YACE,iBAAkB,CAAC,OAAO,GAAG,OAAO,CAAC;YAE5C,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC5B,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;SACrC;IACH,CAAC;IACH,6BAAC;AAAD,CAAC,AAhGD,CAA2C,iCAAe,GAgGzD"}
diff --git a/node_modules/rxjs/internal/operators/bufferWhen.d.ts b/node_modules/rxjs/internal/operators/bufferWhen.d.ts
deleted file mode 100644
index cffbe35..0000000
--- a/node_modules/rxjs/internal/operators/bufferWhen.d.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-/**
- * Buffers the source Observable values, using a factory function of closing
- * Observables to determine when to close, emit, and reset the buffer.
- *
- * <span class="informal">Collects values from the past as an array. When it
- * starts collecting values, it calls a function that returns an Observable that
- * tells when to close the buffer and restart collecting.</span>
- *
- * ![](bufferWhen.png)
- *
- * Opens a buffer immediately, then closes the buffer when the observable
- * returned by calling `closingSelector` function emits a value. When it closes
- * the buffer, it immediately opens a new buffer and repeats the process.
- *
- * ## Example
- *
- * Emit an array of the last clicks every [1-5] random seconds
- *
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { bufferWhen } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const buffered = clicks.pipe(bufferWhen(() =>
- *   interval(1000 + Math.random() * 4000)
- * ));
- * buffered.subscribe(x => console.log(x));
- * ```
- *
- *
- * @see {@link buffer}
- * @see {@link bufferCount}
- * @see {@link bufferTime}
- * @see {@link bufferToggle}
- * @see {@link windowWhen}
- *
- * @param {function(): Observable} closingSelector A function that takes no
- * arguments and returns an Observable that signals buffer closure.
- * @return {Observable<T[]>} An observable of arrays of buffered values.
- * @method bufferWhen
- * @owner Observable
- */
-export declare function bufferWhen<T>(closingSelector: () => Observable<any>): OperatorFunction<T, T[]>;
diff --git a/node_modules/rxjs/internal/operators/bufferWhen.js b/node_modules/rxjs/internal/operators/bufferWhen.js
deleted file mode 100644
index 159f2fc..0000000
--- a/node_modules/rxjs/internal/operators/bufferWhen.js
+++ /dev/null
@@ -1,96 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscription_1 = require("../Subscription");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function bufferWhen(closingSelector) {
-    return function (source) {
-        return source.lift(new BufferWhenOperator(closingSelector));
-    };
-}
-exports.bufferWhen = bufferWhen;
-var BufferWhenOperator = (function () {
-    function BufferWhenOperator(closingSelector) {
-        this.closingSelector = closingSelector;
-    }
-    BufferWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));
-    };
-    return BufferWhenOperator;
-}());
-var BufferWhenSubscriber = (function (_super) {
-    __extends(BufferWhenSubscriber, _super);
-    function BufferWhenSubscriber(destination, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.closingSelector = closingSelector;
-        _this.subscribing = false;
-        _this.openBuffer();
-        return _this;
-    }
-    BufferWhenSubscriber.prototype._next = function (value) {
-        this.buffer.push(value);
-    };
-    BufferWhenSubscriber.prototype._complete = function () {
-        var buffer = this.buffer;
-        if (buffer) {
-            this.destination.next(buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    BufferWhenSubscriber.prototype._unsubscribe = function () {
-        this.buffer = null;
-        this.subscribing = false;
-    };
-    BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openBuffer();
-    };
-    BufferWhenSubscriber.prototype.notifyComplete = function () {
-        if (this.subscribing) {
-            this.complete();
-        }
-        else {
-            this.openBuffer();
-        }
-    };
-    BufferWhenSubscriber.prototype.openBuffer = function () {
-        var closingSubscription = this.closingSubscription;
-        if (closingSubscription) {
-            this.remove(closingSubscription);
-            closingSubscription.unsubscribe();
-        }
-        var buffer = this.buffer;
-        if (this.buffer) {
-            this.destination.next(buffer);
-        }
-        this.buffer = [];
-        var closingNotifier;
-        try {
-            var closingSelector = this.closingSelector;
-            closingNotifier = closingSelector();
-        }
-        catch (err) {
-            return this.error(err);
-        }
-        closingSubscription = new Subscription_1.Subscription();
-        this.closingSubscription = closingSubscription;
-        this.add(closingSubscription);
-        this.subscribing = true;
-        closingSubscription.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));
-        this.subscribing = false;
-    };
-    return BufferWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=bufferWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/bufferWhen.js.map b/node_modules/rxjs/internal/operators/bufferWhen.js.map
deleted file mode 100644
index 4098d1b..0000000
--- a/node_modules/rxjs/internal/operators/bufferWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferWhen.js","sources":["../../src/internal/operators/bufferWhen.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,gDAA+C;AAC/C,sDAAqD;AAErD,+DAA8D;AA6C9D,SAAgB,UAAU,CAAI,eAAsC;IAClE,OAAO,UAAU,MAAqB;QACpC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;AACJ,CAAC;AAJD,gCAIC;AAED;IAEE,4BAAoB,eAAsC;QAAtC,oBAAe,GAAf,eAAe,CAAuB;IAC1D,CAAC;IAED,iCAAI,GAAJ,UAAK,UAA2B,EAAE,MAAW;QAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACtF,CAAC;IACH,yBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAsC,wCAAuB;IAK3D,8BAAY,WAA4B,EAAU,eAAsC;QAAxF,YACE,kBAAM,WAAW,CAAC,SAEnB;QAHiD,qBAAe,GAAf,eAAe,CAAuB;QAHhF,iBAAW,GAAY,KAAK,CAAC;QAKnC,KAAI,CAAC,UAAU,EAAE,CAAC;;IACpB,CAAC;IAES,oCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAES,wCAAS,GAAnB;QACE,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC/B;QACD,iBAAM,SAAS,WAAE,CAAC;IACpB,CAAC;IAGD,2CAAY,GAAZ;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,yCAAU,GAAV,UAAW,UAAa,EAAE,UAAe,EAC9B,UAAkB,EAAE,UAAkB,EACtC,QAAiC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,6CAAc,GAAd;QACE,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,QAAQ,EAAE,CAAC;SACjB;aAAM;YACL,IAAI,CAAC,UAAU,EAAE,CAAC;SACnB;IACH,CAAC;IAED,yCAAU,GAAV;QACQ,IAAA,8CAAmB,CAAU;QAEnC,IAAI,mBAAmB,EAAE;YACvB,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACjC,mBAAmB,CAAC,WAAW,EAAE,CAAC;SACnC;QAED,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC/B;QAED,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QAEjB,IAAI,eAAe,CAAC;QACpB,IAAI;YACM,IAAA,sCAAe,CAAU;YACjC,eAAe,GAAG,eAAe,EAAE,CAAC;SACrC;QAAC,OAAO,GAAG,EAAE;YACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACxB;QACD,mBAAmB,GAAG,IAAI,2BAAY,EAAE,CAAC;QACzC,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,mBAAmB,CAAC,GAAG,CAAC,qCAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IACH,2BAAC;AAAD,CAAC,AAvED,CAAsC,iCAAe,GAuEpD"}
diff --git a/node_modules/rxjs/internal/operators/catchError.d.ts b/node_modules/rxjs/internal/operators/catchError.d.ts
deleted file mode 100644
index 3c4759b..0000000
--- a/node_modules/rxjs/internal/operators/catchError.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-export declare function catchError<T, O extends ObservableInput<any>>(selector: (err: any, caught: Observable<T>) => O): OperatorFunction<T, T | ObservedValueOf<O>>;
diff --git a/node_modules/rxjs/internal/operators/catchError.js b/node_modules/rxjs/internal/operators/catchError.js
deleted file mode 100644
index 55a06a0..0000000
--- a/node_modules/rxjs/internal/operators/catchError.js
+++ /dev/null
@@ -1,65 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function catchError(selector) {
-    return function catchErrorOperatorFunction(source) {
-        var operator = new CatchOperator(selector);
-        var caught = source.lift(operator);
-        return (operator.caught = caught);
-    };
-}
-exports.catchError = catchError;
-var CatchOperator = (function () {
-    function CatchOperator(selector) {
-        this.selector = selector;
-    }
-    CatchOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));
-    };
-    return CatchOperator;
-}());
-var CatchSubscriber = (function (_super) {
-    __extends(CatchSubscriber, _super);
-    function CatchSubscriber(destination, selector, caught) {
-        var _this = _super.call(this, destination) || this;
-        _this.selector = selector;
-        _this.caught = caught;
-        return _this;
-    }
-    CatchSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var result = void 0;
-            try {
-                result = this.selector(err, this.caught);
-            }
-            catch (err2) {
-                _super.prototype.error.call(this, err2);
-                return;
-            }
-            this._unsubscribeAndRecycle();
-            var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
-            this.add(innerSubscriber);
-            var innerSubscription = subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-            if (innerSubscription !== innerSubscriber) {
-                this.add(innerSubscription);
-            }
-        }
-    };
-    return CatchSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=catchError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/catchError.js.map b/node_modules/rxjs/internal/operators/catchError.js.map
deleted file mode 100644
index 9a8694d..0000000
--- a/node_modules/rxjs/internal/operators/catchError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"catchError.js","sources":["../../src/internal/operators/catchError.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAIA,sDAAqD;AACrD,sDAAqD;AACrD,+DAA8D;AAmF9D,SAAgB,UAAU,CACxB,QAAgD;IAEhD,OAAO,SAAS,0BAA0B,CAAC,MAAqB;QAC9D,IAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAuB,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC;AARD,gCAQC;AAED;IAGE,uBAAoB,QAAqE;QAArE,aAAQ,GAAR,QAAQ,CAA6D;IACzF,CAAC;IAED,4BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACvF,CAAC;IACH,oBAAC;AAAD,CAAC,AATD,IASC;AAOD;IAAoC,mCAAyB;IAC3D,yBAAY,WAA4B,EACpB,QAAqE,EACrE,MAAqB;QAFzC,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,cAAQ,GAAR,QAAQ,CAA6D;QACrE,YAAM,GAAN,MAAM,CAAe;;IAEzC,CAAC;IAOD,+BAAK,GAAL,UAAM,GAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,MAAM,SAAK,CAAC;YAChB,IAAI;gBACF,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;aAC1C;YAAC,OAAO,IAAI,EAAE;gBACb,iBAAM,KAAK,YAAC,IAAI,CAAC,CAAC;gBAClB,OAAO;aACR;YACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAM,eAAe,GAAG,IAAI,iCAAe,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACxE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC1B,IAAM,iBAAiB,GAAG,qCAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;YAIjG,IAAI,iBAAiB,KAAK,eAAe,EAAE;gBACzC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;aAC7B;SACF;IACH,CAAC;IACH,sBAAC;AAAD,CAAC,AAjCD,CAAoC,iCAAe,GAiClD"}
diff --git a/node_modules/rxjs/internal/operators/combineAll.d.ts b/node_modules/rxjs/internal/operators/combineAll.d.ts
deleted file mode 100644
index ba3b82f..0000000
--- a/node_modules/rxjs/internal/operators/combineAll.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { OperatorFunction, ObservableInput } from '../types';
-export declare function combineAll<T>(): OperatorFunction<ObservableInput<T>, T[]>;
-export declare function combineAll<T>(): OperatorFunction<any, T[]>;
-export declare function combineAll<T, R>(project: (...values: T[]) => R): OperatorFunction<ObservableInput<T>, R>;
-export declare function combineAll<R>(project: (...values: Array<any>) => R): OperatorFunction<any, R>;
diff --git a/node_modules/rxjs/internal/operators/combineAll.js b/node_modules/rxjs/internal/operators/combineAll.js
deleted file mode 100644
index aa6f42e..0000000
--- a/node_modules/rxjs/internal/operators/combineAll.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var combineLatest_1 = require("../observable/combineLatest");
-function combineAll(project) {
-    return function (source) { return source.lift(new combineLatest_1.CombineLatestOperator(project)); };
-}
-exports.combineAll = combineAll;
-//# sourceMappingURL=combineAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/combineAll.js.map b/node_modules/rxjs/internal/operators/combineAll.js.map
deleted file mode 100644
index a19279a..0000000
--- a/node_modules/rxjs/internal/operators/combineAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineAll.js","sources":["../../src/internal/operators/combineAll.ts"],"names":[],"mappings":";;AAAA,6DAAoE;AAsDpE,SAAgB,UAAU,CAAO,OAAsC;IACrE,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,qCAAqB,CAAC,OAAO,CAAC,CAAC,EAA/C,CAA+C,CAAC;AACpF,CAAC;AAFD,gCAEC"}
diff --git a/node_modules/rxjs/internal/operators/combineLatest.d.ts b/node_modules/rxjs/internal/operators/combineLatest.d.ts
deleted file mode 100644
index d087978..0000000
--- a/node_modules/rxjs/internal/operators/combineLatest.d.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { ObservableInput, OperatorFunction } from '../types';
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, R>(project: (v1: T) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, T2, R>(v2: ObservableInput<T2>, project: (v1: T, v2: T2) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, T2, T3, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, project: (v1: T, v2: T2, v3: T3) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, T2, T3, T4, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, project: (v1: T, v2: T2, v3: T3, v4: T4) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, T2, T3, T4, T5, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, T2, T3, T4, T5, T6, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, T2>(v2: ObservableInput<T2>): OperatorFunction<T, [T, T2]>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, T2, T3>(v2: ObservableInput<T2>, v3: ObservableInput<T3>): OperatorFunction<T, [T, T2, T3]>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, T2, T3, T4>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): OperatorFunction<T, [T, T2, T3, T4]>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, T2, T3, T4, T5>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): OperatorFunction<T, [T, T2, T3, T4, T5]>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, T2, T3, T4, T5, T6>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): OperatorFunction<T, [T, T2, T3, T4, T5, T6]>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, R>(...observables: Array<ObservableInput<T> | ((...values: Array<T>) => R)>): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, R>(array: ObservableInput<T>[]): OperatorFunction<T, Array<T>>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export declare function combineLatest<T, TOther, R>(array: ObservableInput<TOther>[], project: (v1: T, ...values: Array<TOther>) => R): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/combineLatest.js b/node_modules/rxjs/internal/operators/combineLatest.js
deleted file mode 100644
index 7902e0a..0000000
--- a/node_modules/rxjs/internal/operators/combineLatest.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("../util/isArray");
-var combineLatest_1 = require("../observable/combineLatest");
-var from_1 = require("../observable/from");
-var none = {};
-function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var project = null;
-    if (typeof observables[observables.length - 1] === 'function') {
-        project = observables.pop();
-    }
-    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-        observables = observables[0].slice();
-    }
-    return function (source) { return source.lift.call(from_1.from([source].concat(observables)), new combineLatest_1.CombineLatestOperator(project)); };
-}
-exports.combineLatest = combineLatest;
-//# sourceMappingURL=combineLatest.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/combineLatest.js.map b/node_modules/rxjs/internal/operators/combineLatest.js.map
deleted file mode 100644
index b4d58f0..0000000
--- a/node_modules/rxjs/internal/operators/combineLatest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineLatest.js","sources":["../../src/internal/operators/combineLatest.ts"],"names":[],"mappings":";;AACA,2CAA0C;AAC1C,6DAAoE;AACpE,2CAA0C;AAI1C,IAAM,IAAI,GAAG,EAAE,CAAC;AAoChB,SAAgB,aAAa;IAAO,qBAE+C;SAF/C,UAE+C,EAF/C,qBAE+C,EAF/C,IAE+C;QAF/C,gCAE+C;;IACjF,IAAI,OAAO,GAAiC,IAAI,CAAC;IACjD,IAAI,OAAO,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,UAAU,EAAE;QAC7D,OAAO,GAAiC,WAAW,CAAC,GAAG,EAAE,CAAC;KAC3D;IAID,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;QACvD,WAAW,GAAS,WAAW,CAAC,CAAC,CAAE,CAAC,KAAK,EAAE,CAAC;KAC7C;IAED,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAI,EAAE,MAAM,SAAK,WAAW,EAAE,EAAE,IAAI,qCAAqB,CAAC,OAAO,CAAC,CAAC,EAApF,CAAoF,CAAC;AACzH,CAAC;AAfD,sCAeC"}
diff --git a/node_modules/rxjs/internal/operators/concat.d.ts b/node_modules/rxjs/internal/operators/concat.d.ts
deleted file mode 100644
index 2b588f7..0000000
--- a/node_modules/rxjs/internal/operators/concat.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { ObservableInput, OperatorFunction, MonoTypeOperatorFunction, SchedulerLike } from '../types';
-/** @deprecated Deprecated in favor of static concat. */
-export declare function concat<T>(scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static concat. */
-export declare function concat<T, T2>(v2: ObservableInput<T2>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2>;
-/** @deprecated Deprecated in favor of static concat. */
-export declare function concat<T, T2, T3>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3>;
-/** @deprecated Deprecated in favor of static concat. */
-export declare function concat<T, T2, T3, T4>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4>;
-/** @deprecated Deprecated in favor of static concat. */
-export declare function concat<T, T2, T3, T4, T5>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4 | T5>;
-/** @deprecated Deprecated in favor of static concat. */
-export declare function concat<T, T2, T3, T4, T5, T6>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4 | T5 | T6>;
-/** @deprecated Deprecated in favor of static concat. */
-export declare function concat<T>(...observables: Array<ObservableInput<T> | SchedulerLike>): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static concat. */
-export declare function concat<T, R>(...observables: Array<ObservableInput<any> | SchedulerLike>): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/concat.js b/node_modules/rxjs/internal/operators/concat.js
deleted file mode 100644
index f3b05e5..0000000
--- a/node_modules/rxjs/internal/operators/concat.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var concat_1 = require("../observable/concat");
-function concat() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function (source) { return source.lift.call(concat_1.concat.apply(void 0, [source].concat(observables))); };
-}
-exports.concat = concat;
-//# sourceMappingURL=concat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/concat.js.map b/node_modules/rxjs/internal/operators/concat.js.map
deleted file mode 100644
index 01ef183..0000000
--- a/node_modules/rxjs/internal/operators/concat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concat.js","sources":["../../src/internal/operators/concat.ts"],"names":[],"mappings":";;AAAA,+CAA+D;AA0B/D,SAAgB,MAAM;IAAO,qBAA2D;SAA3D,UAA2D,EAA3D,qBAA2D,EAA3D,IAA2D;QAA3D,gCAA2D;;IACtF,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAY,gBAAC,MAAM,SAAK,WAAW,GAAE,EAAtD,CAAsD,CAAC;AAC3F,CAAC;AAFD,wBAEC"}
diff --git a/node_modules/rxjs/internal/operators/concatAll.d.ts b/node_modules/rxjs/internal/operators/concatAll.d.ts
deleted file mode 100644
index 7b7d929..0000000
--- a/node_modules/rxjs/internal/operators/concatAll.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { OperatorFunction, ObservableInput } from '../types';
-export declare function concatAll<T>(): OperatorFunction<ObservableInput<T>, T>;
-export declare function concatAll<R>(): OperatorFunction<any, R>;
diff --git a/node_modules/rxjs/internal/operators/concatAll.js b/node_modules/rxjs/internal/operators/concatAll.js
deleted file mode 100644
index fb98840..0000000
--- a/node_modules/rxjs/internal/operators/concatAll.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var mergeAll_1 = require("./mergeAll");
-function concatAll() {
-    return mergeAll_1.mergeAll(1);
-}
-exports.concatAll = concatAll;
-//# sourceMappingURL=concatAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/concatAll.js.map b/node_modules/rxjs/internal/operators/concatAll.js.map
deleted file mode 100644
index e79dff9..0000000
--- a/node_modules/rxjs/internal/operators/concatAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatAll.js","sources":["../../src/internal/operators/concatAll.ts"],"names":[],"mappings":";;AACA,uCAAsC;AAgEtC,SAAgB,SAAS;IACvB,OAAO,mBAAQ,CAAI,CAAC,CAAC,CAAC;AACxB,CAAC;AAFD,8BAEC"}
diff --git a/node_modules/rxjs/internal/operators/concatMap.d.ts b/node_modules/rxjs/internal/operators/concatMap.d.ts
deleted file mode 100644
index 9dcf300..0000000
--- a/node_modules/rxjs/internal/operators/concatMap.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-export declare function concatMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector no longer supported, use inner map instead */
-export declare function concatMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: undefined): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector no longer supported, use inner map instead */
-export declare function concatMap<T, R, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/concatMap.js b/node_modules/rxjs/internal/operators/concatMap.js
deleted file mode 100644
index 91ac226..0000000
--- a/node_modules/rxjs/internal/operators/concatMap.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var mergeMap_1 = require("./mergeMap");
-function concatMap(project, resultSelector) {
-    return mergeMap_1.mergeMap(project, resultSelector, 1);
-}
-exports.concatMap = concatMap;
-//# sourceMappingURL=concatMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/concatMap.js.map b/node_modules/rxjs/internal/operators/concatMap.js.map
deleted file mode 100644
index 3e80fad..0000000
--- a/node_modules/rxjs/internal/operators/concatMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatMap.js","sources":["../../src/internal/operators/concatMap.ts"],"names":[],"mappings":";;AAAA,uCAAsC;AAuEtC,SAAgB,SAAS,CACvB,OAAuC,EACvC,cAA6G;IAE7G,OAAO,mBAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AALD,8BAKC"}
diff --git a/node_modules/rxjs/internal/operators/concatMapTo.d.ts b/node_modules/rxjs/internal/operators/concatMapTo.d.ts
deleted file mode 100644
index ab69336..0000000
--- a/node_modules/rxjs/internal/operators/concatMapTo.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-export declare function concatMapTo<T, O extends ObservableInput<any>>(observable: O): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated */
-export declare function concatMapTo<T, O extends ObservableInput<any>>(observable: O, resultSelector: undefined): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated */
-export declare function concatMapTo<T, R, O extends ObservableInput<any>>(observable: O, resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/concatMapTo.js b/node_modules/rxjs/internal/operators/concatMapTo.js
deleted file mode 100644
index fe4d95c..0000000
--- a/node_modules/rxjs/internal/operators/concatMapTo.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var concatMap_1 = require("./concatMap");
-function concatMapTo(innerObservable, resultSelector) {
-    return concatMap_1.concatMap(function () { return innerObservable; }, resultSelector);
-}
-exports.concatMapTo = concatMapTo;
-//# sourceMappingURL=concatMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/concatMapTo.js.map b/node_modules/rxjs/internal/operators/concatMapTo.js.map
deleted file mode 100644
index fc24b2c..0000000
--- a/node_modules/rxjs/internal/operators/concatMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatMapTo.js","sources":["../../src/internal/operators/concatMapTo.ts"],"names":[],"mappings":";;AAAA,yCAAwC;AAmExC,SAAgB,WAAW,CACzB,eAAkB,EAClB,cAA6G;IAE7G,OAAO,qBAAS,CAAC,cAAM,OAAA,eAAe,EAAf,CAAe,EAAE,cAAc,CAAC,CAAC;AAC1D,CAAC;AALD,kCAKC"}
diff --git a/node_modules/rxjs/internal/operators/count.d.ts b/node_modules/rxjs/internal/operators/count.d.ts
deleted file mode 100644
index b6f5e32..0000000
--- a/node_modules/rxjs/internal/operators/count.d.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-/**
- * Counts the number of emissions on the source and emits that number when the
- * source completes.
- *
- * <span class="informal">Tells how many values were emitted, when the source
- * completes.</span>
- *
- * ![](count.png)
- *
- * `count` transforms an Observable that emits values into an Observable that
- * emits a single value that represents the number of values emitted by the
- * source Observable. If the source Observable terminates with an error, `count`
- * will pass this error notification along without emitting a value first. If
- * the source Observable does not terminate at all, `count` will neither emit
- * a value nor terminate. This operator takes an optional `predicate` function
- * as argument, in which case the output emission will represent the number of
- * source values that matched `true` with the `predicate`.
- *
- * ## Examples
- *
- * Counts how many seconds have passed before the first click happened
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { count, takeUntil } from 'rxjs/operators';
- *
- * const seconds = interval(1000);
- * const clicks = fromEvent(document, 'click');
- * const secondsBeforeClick = seconds.pipe(takeUntil(clicks));
- * const result = secondsBeforeClick.pipe(count());
- * result.subscribe(x => console.log(x));
- * ```
- *
- * Counts how many odd numbers are there between 1 and 7
- * ```ts
- * import { range } from 'rxjs';
- * import { count } from 'rxjs/operators';
- *
- * const numbers = range(1, 7);
- * const result = numbers.pipe(count(i => i % 2 === 1));
- * result.subscribe(x => console.log(x));
- * // Results in:
- * // 4
- * ```
- *
- * @see {@link max}
- * @see {@link min}
- * @see {@link reduce}
- *
- * @param {function(value: T, i: number, source: Observable<T>): boolean} [predicate] A
- * boolean function to select what values are to be counted. It is provided with
- * arguments of:
- * - `value`: the value from the source Observable.
- * - `index`: the (zero-based) "index" of the value from the source Observable.
- * - `source`: the source Observable instance itself.
- * @return {Observable} An Observable of one number that represents the count as
- * described above.
- * @method count
- * @owner Observable
- */
-export declare function count<T>(predicate?: (value: T, index: number, source: Observable<T>) => boolean): OperatorFunction<T, number>;
diff --git a/node_modules/rxjs/internal/operators/count.js b/node_modules/rxjs/internal/operators/count.js
deleted file mode 100644
index 2dfc616..0000000
--- a/node_modules/rxjs/internal/operators/count.js
+++ /dev/null
@@ -1,68 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function count(predicate) {
-    return function (source) { return source.lift(new CountOperator(predicate, source)); };
-}
-exports.count = count;
-var CountOperator = (function () {
-    function CountOperator(predicate, source) {
-        this.predicate = predicate;
-        this.source = source;
-    }
-    CountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));
-    };
-    return CountOperator;
-}());
-var CountSubscriber = (function (_super) {
-    __extends(CountSubscriber, _super);
-    function CountSubscriber(destination, predicate, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.source = source;
-        _this.count = 0;
-        _this.index = 0;
-        return _this;
-    }
-    CountSubscriber.prototype._next = function (value) {
-        if (this.predicate) {
-            this._tryPredicate(value);
-        }
-        else {
-            this.count++;
-        }
-    };
-    CountSubscriber.prototype._tryPredicate = function (value) {
-        var result;
-        try {
-            result = this.predicate(value, this.index++, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this.count++;
-        }
-    };
-    CountSubscriber.prototype._complete = function () {
-        this.destination.next(this.count);
-        this.destination.complete();
-    };
-    return CountSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=count.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/count.js.map b/node_modules/rxjs/internal/operators/count.js.map
deleted file mode 100644
index 9d09853..0000000
--- a/node_modules/rxjs/internal/operators/count.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"count.js","sources":["../../src/internal/operators/count.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,4CAA2C;AA6D3C,SAAgB,KAAK,CAAI,SAAuE;IAC9F,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAjD,CAAiD,CAAC;AACtF,CAAC;AAFD,sBAEC;AAED;IACE,uBAAoB,SAAuE,EACvE,MAAsB;QADtB,cAAS,GAAT,SAAS,CAA8D;QACvE,WAAM,GAAN,MAAM,CAAgB;IAC1C,CAAC;IAED,4BAAI,GAAJ,UAAK,UAA8B,EAAE,MAAW;QAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACxF,CAAC;IACH,oBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAiC,mCAAa;IAI5C,yBAAY,WAA6B,EACrB,SAAuE,EACvE,MAAsB;QAF1C,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,eAAS,GAAT,SAAS,CAA8D;QACvE,YAAM,GAAN,MAAM,CAAgB;QALlC,WAAK,GAAW,CAAC,CAAC;QAClB,WAAK,GAAW,CAAC,CAAC;;IAM1B,CAAC;IAES,+BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SAC3B;aAAM;YACL,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;IACH,CAAC;IAEO,uCAAa,GAArB,UAAsB,KAAQ;QAC5B,IAAI,MAAW,CAAC;QAEhB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SAC3D;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QAED,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,KAAK,EAAE,CAAC;SACd;IACH,CAAC;IAES,mCAAS,GAAnB;QACE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IACH,sBAAC;AAAD,CAAC,AArCD,CAAiC,uBAAU,GAqC1C"}
diff --git a/node_modules/rxjs/internal/operators/debounce.d.ts b/node_modules/rxjs/internal/operators/debounce.d.ts
deleted file mode 100644
index 3ef496b..0000000
--- a/node_modules/rxjs/internal/operators/debounce.d.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { MonoTypeOperatorFunction, SubscribableOrPromise } from '../types';
-/**
- * Emits a value from the source Observable only after a particular time span
- * determined by another Observable has passed without another source emission.
- *
- * <span class="informal">It's like {@link debounceTime}, but the time span of
- * emission silence is determined by a second Observable.</span>
- *
- * ![](debounce.png)
- *
- * `debounce` delays values emitted by the source Observable, but drops previous
- * pending delayed emissions if a new value arrives on the source Observable.
- * This operator keeps track of the most recent value from the source
- * Observable, and spawns a duration Observable by calling the
- * `durationSelector` function. The value is emitted only when the duration
- * Observable emits a value or completes, and if no other value was emitted on
- * the source Observable since the duration Observable was spawned. If a new
- * value appears before the duration Observable emits, the previous value will
- * be dropped and will not be emitted on the output Observable.
- *
- * Like {@link debounceTime}, this is a rate-limiting operator, and also a
- * delay-like operator since output emissions do not necessarily occur at the
- * same time as they did on the source Observable.
- *
- * ## Example
- * Emit the most recent click after a burst of clicks
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { debounce } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(debounce(() => interval(1000)));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link audit}
- * @see {@link debounceTime}
- * @see {@link delayWhen}
- * @see {@link throttle}
- *
- * @param {function(value: T): SubscribableOrPromise} durationSelector A function
- * that receives a value from the source Observable, for computing the timeout
- * duration for each source value, returned as an Observable or a Promise.
- * @return {Observable} An Observable that delays the emissions of the source
- * Observable by the specified duration Observable returned by
- * `durationSelector`, and may drop some values if they occur too frequently.
- * @method debounce
- * @owner Observable
- */
-export declare function debounce<T>(durationSelector: (value: T) => SubscribableOrPromise<any>): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/debounce.js b/node_modules/rxjs/internal/operators/debounce.js
deleted file mode 100644
index 4568bc0..0000000
--- a/node_modules/rxjs/internal/operators/debounce.js
+++ /dev/null
@@ -1,90 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function debounce(durationSelector) {
-    return function (source) { return source.lift(new DebounceOperator(durationSelector)); };
-}
-exports.debounce = debounce;
-var DebounceOperator = (function () {
-    function DebounceOperator(durationSelector) {
-        this.durationSelector = durationSelector;
-    }
-    DebounceOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));
-    };
-    return DebounceOperator;
-}());
-var DebounceSubscriber = (function (_super) {
-    __extends(DebounceSubscriber, _super);
-    function DebounceSubscriber(destination, durationSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.durationSelector = durationSelector;
-        _this.hasValue = false;
-        _this.durationSubscription = null;
-        return _this;
-    }
-    DebounceSubscriber.prototype._next = function (value) {
-        try {
-            var result = this.durationSelector.call(this, value);
-            if (result) {
-                this._tryNext(value, result);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    DebounceSubscriber.prototype._complete = function () {
-        this.emitValue();
-        this.destination.complete();
-    };
-    DebounceSubscriber.prototype._tryNext = function (value, duration) {
-        var subscription = this.durationSubscription;
-        this.value = value;
-        this.hasValue = true;
-        if (subscription) {
-            subscription.unsubscribe();
-            this.remove(subscription);
-        }
-        subscription = subscribeToResult_1.subscribeToResult(this, duration);
-        if (subscription && !subscription.closed) {
-            this.add(this.durationSubscription = subscription);
-        }
-    };
-    DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.emitValue();
-    };
-    DebounceSubscriber.prototype.notifyComplete = function () {
-        this.emitValue();
-    };
-    DebounceSubscriber.prototype.emitValue = function () {
-        if (this.hasValue) {
-            var value = this.value;
-            var subscription = this.durationSubscription;
-            if (subscription) {
-                this.durationSubscription = null;
-                subscription.unsubscribe();
-                this.remove(subscription);
-            }
-            this.value = null;
-            this.hasValue = false;
-            _super.prototype._next.call(this, value);
-        }
-    };
-    return DebounceSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=debounce.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/debounce.js.map b/node_modules/rxjs/internal/operators/debounce.js.map
deleted file mode 100644
index fdc463d..0000000
--- a/node_modules/rxjs/internal/operators/debounce.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounce.js","sources":["../../src/internal/operators/debounce.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/debounceTime.d.ts b/node_modules/rxjs/internal/operators/debounceTime.d.ts
deleted file mode 100644
index cc9bc7b..0000000
--- a/node_modules/rxjs/internal/operators/debounceTime.d.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
-/**
- * Emits a value from the source Observable only after a particular time span
- * has passed without another source emission.
- *
- * <span class="informal">It's like {@link delay}, but passes only the most
- * recent value from each burst of emissions.</span>
- *
- * ![](debounceTime.png)
- *
- * `debounceTime` delays values emitted by the source Observable, but drops
- * previous pending delayed emissions if a new value arrives on the source
- * Observable. This operator keeps track of the most recent value from the
- * source Observable, and emits that only when `dueTime` enough time has passed
- * without any other value appearing on the source Observable. If a new value
- * appears before `dueTime` silence occurs, the previous value will be dropped
- * and will not be emitted on the output Observable.
- *
- * This is a rate-limiting operator, because it is impossible for more than one
- * value to be emitted in any time window of duration `dueTime`, but it is also
- * a delay-like operator since output emissions do not occur at the same time as
- * they did on the source Observable. Optionally takes a {@link SchedulerLike} for
- * managing timers.
- *
- * ## Example
- * Emit the most recent click after a burst of clicks
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { debounceTime } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(debounceTime(1000));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link auditTime}
- * @see {@link debounce}
- * @see {@link delay}
- * @see {@link sampleTime}
- * @see {@link throttleTime}
- *
- * @param {number} dueTime The timeout duration in milliseconds (or the time
- * unit determined internally by the optional `scheduler`) for the window of
- * time required to wait for emission silence before emitting the most recent
- * source value.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
- * managing the timers that handle the timeout for each value.
- * @return {Observable} An Observable that delays the emissions of the source
- * Observable by the specified `dueTime`, and may drop some values if they occur
- * too frequently.
- * @method debounceTime
- * @owner Observable
- */
-export declare function debounceTime<T>(dueTime: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/debounceTime.js b/node_modules/rxjs/internal/operators/debounceTime.js
deleted file mode 100644
index df37b18..0000000
--- a/node_modules/rxjs/internal/operators/debounceTime.js
+++ /dev/null
@@ -1,76 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var async_1 = require("../scheduler/async");
-function debounceTime(dueTime, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); };
-}
-exports.debounceTime = debounceTime;
-var DebounceTimeOperator = (function () {
-    function DebounceTimeOperator(dueTime, scheduler) {
-        this.dueTime = dueTime;
-        this.scheduler = scheduler;
-    }
-    DebounceTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
-    };
-    return DebounceTimeOperator;
-}());
-var DebounceTimeSubscriber = (function (_super) {
-    __extends(DebounceTimeSubscriber, _super);
-    function DebounceTimeSubscriber(destination, dueTime, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.dueTime = dueTime;
-        _this.scheduler = scheduler;
-        _this.debouncedSubscription = null;
-        _this.lastValue = null;
-        _this.hasValue = false;
-        return _this;
-    }
-    DebounceTimeSubscriber.prototype._next = function (value) {
-        this.clearDebounce();
-        this.lastValue = value;
-        this.hasValue = true;
-        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
-    };
-    DebounceTimeSubscriber.prototype._complete = function () {
-        this.debouncedNext();
-        this.destination.complete();
-    };
-    DebounceTimeSubscriber.prototype.debouncedNext = function () {
-        this.clearDebounce();
-        if (this.hasValue) {
-            var lastValue = this.lastValue;
-            this.lastValue = null;
-            this.hasValue = false;
-            this.destination.next(lastValue);
-        }
-    };
-    DebounceTimeSubscriber.prototype.clearDebounce = function () {
-        var debouncedSubscription = this.debouncedSubscription;
-        if (debouncedSubscription !== null) {
-            this.remove(debouncedSubscription);
-            debouncedSubscription.unsubscribe();
-            this.debouncedSubscription = null;
-        }
-    };
-    return DebounceTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNext(subscriber) {
-    subscriber.debouncedNext();
-}
-//# sourceMappingURL=debounceTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/debounceTime.js.map b/node_modules/rxjs/internal/operators/debounceTime.js.map
deleted file mode 100644
index ea09c21..0000000
--- a/node_modules/rxjs/internal/operators/debounceTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounceTime.js","sources":["../../src/internal/operators/debounceTime.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AAE3C,4CAA2C;AAuD3C,SAAgB,YAAY,CAAI,OAAe,EAAE,SAAgC;IAAhC,0BAAA,EAAA,YAA2B,aAAK;IAC/E,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,EAAzD,CAAyD,CAAC;AAC9F,CAAC;AAFD,oCAEC;AAED;IACE,8BAAoB,OAAe,EAAU,SAAwB;QAAjD,YAAO,GAAP,OAAO,CAAQ;QAAU,cAAS,GAAT,SAAS,CAAe;IACrE,CAAC;IAED,mCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAChG,CAAC;IACH,2BAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAwC,0CAAa;IAKnD,gCAAY,WAA0B,EAClB,OAAe,EACf,SAAwB;QAF5C,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,aAAO,GAAP,OAAO,CAAQ;QACf,eAAS,GAAT,SAAS,CAAe;QANpC,2BAAqB,GAAiB,IAAI,CAAC;QAC3C,eAAS,GAAM,IAAI,CAAC;QACpB,cAAQ,GAAY,KAAK,CAAC;;IAMlC,CAAC;IAES,sCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACnG,CAAC;IAES,0CAAS,GAAnB;QACE,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,8CAAa,GAAb;QACE,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,IAAI,CAAC,QAAQ,EAAE;YACT,IAAA,0BAAS,CAAU;YAM3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAClC;IACH,CAAC;IAEO,8CAAa,GAArB;QACE,IAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAEzD,IAAI,qBAAqB,KAAK,IAAI,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACnC,qBAAqB,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;SACnC;IACH,CAAC;IACH,6BAAC;AAAD,CAAC,AAhDD,CAAwC,uBAAU,GAgDjD;AAED,SAAS,YAAY,CAAC,UAAuC;IAC3D,UAAU,CAAC,aAAa,EAAE,CAAC;AAC7B,CAAC"}
diff --git a/node_modules/rxjs/internal/operators/defaultIfEmpty.d.ts b/node_modules/rxjs/internal/operators/defaultIfEmpty.d.ts
deleted file mode 100644
index bd66791..0000000
--- a/node_modules/rxjs/internal/operators/defaultIfEmpty.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { OperatorFunction, MonoTypeOperatorFunction } from '../types';
-export declare function defaultIfEmpty<T>(defaultValue?: T): MonoTypeOperatorFunction<T>;
-export declare function defaultIfEmpty<T, R>(defaultValue?: R): OperatorFunction<T, T | R>;
diff --git a/node_modules/rxjs/internal/operators/defaultIfEmpty.js b/node_modules/rxjs/internal/operators/defaultIfEmpty.js
deleted file mode 100644
index 5c955f3..0000000
--- a/node_modules/rxjs/internal/operators/defaultIfEmpty.js
+++ /dev/null
@@ -1,51 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function defaultIfEmpty(defaultValue) {
-    if (defaultValue === void 0) { defaultValue = null; }
-    return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); };
-}
-exports.defaultIfEmpty = defaultIfEmpty;
-var DefaultIfEmptyOperator = (function () {
-    function DefaultIfEmptyOperator(defaultValue) {
-        this.defaultValue = defaultValue;
-    }
-    DefaultIfEmptyOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));
-    };
-    return DefaultIfEmptyOperator;
-}());
-var DefaultIfEmptySubscriber = (function (_super) {
-    __extends(DefaultIfEmptySubscriber, _super);
-    function DefaultIfEmptySubscriber(destination, defaultValue) {
-        var _this = _super.call(this, destination) || this;
-        _this.defaultValue = defaultValue;
-        _this.isEmpty = true;
-        return _this;
-    }
-    DefaultIfEmptySubscriber.prototype._next = function (value) {
-        this.isEmpty = false;
-        this.destination.next(value);
-    };
-    DefaultIfEmptySubscriber.prototype._complete = function () {
-        if (this.isEmpty) {
-            this.destination.next(this.defaultValue);
-        }
-        this.destination.complete();
-    };
-    return DefaultIfEmptySubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=defaultIfEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/defaultIfEmpty.js.map b/node_modules/rxjs/internal/operators/defaultIfEmpty.js.map
deleted file mode 100644
index 4af7d5d..0000000
--- a/node_modules/rxjs/internal/operators/defaultIfEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"defaultIfEmpty.js","sources":["../../src/internal/operators/defaultIfEmpty.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AA4C3C,SAAgB,cAAc,CAAO,YAAsB;IAAtB,6BAAA,EAAA,mBAAsB;IACzD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,YAAY,CAAC,CAAsB,EAA1E,CAA0E,CAAC;AAC/G,CAAC;AAFD,wCAEC;AAED;IAEE,gCAAoB,YAAe;QAAf,iBAAY,GAAZ,YAAY,CAAG;IACnC,CAAC;IAED,qCAAI,GAAJ,UAAK,UAA6B,EAAE,MAAW;QAC7C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,wBAAwB,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACvF,CAAC;IACH,6BAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAA6C,4CAAa;IAGxD,kCAAY,WAA8B,EAAU,YAAe;QAAnE,YACE,kBAAM,WAAW,CAAC,SACnB;QAFmD,kBAAY,GAAZ,YAAY,CAAG;QAF3D,aAAO,GAAY,IAAI,CAAC;;IAIhC,CAAC;IAES,wCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAES,4CAAS,GAAnB;QACE,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAC1C;QACD,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IACH,+BAAC;AAAD,CAAC,AAlBD,CAA6C,uBAAU,GAkBtD"}
diff --git a/node_modules/rxjs/internal/operators/delay.d.ts b/node_modules/rxjs/internal/operators/delay.d.ts
deleted file mode 100644
index 4b3e2f0..0000000
--- a/node_modules/rxjs/internal/operators/delay.d.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
-/**
- * Delays the emission of items from the source Observable by a given timeout or
- * until a given Date.
- *
- * <span class="informal">Time shifts each item by some specified amount of
- * milliseconds.</span>
- *
- * ![](delay.png)
- *
- * If the delay argument is a Number, this operator time shifts the source
- * Observable by that amount of time expressed in milliseconds. The relative
- * time intervals between the values are preserved.
- *
- * If the delay argument is a Date, this operator time shifts the start of the
- * Observable execution until the given date occurs.
- *
- * ## Examples
- * Delay each click by one second
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { delay } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const delayedClicks = clicks.pipe(delay(1000)); // each click emitted after 1 second
- * delayedClicks.subscribe(x => console.log(x));
- * ```
- *
- * Delay all clicks until a future date happens
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { delay } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const date = new Date('March 15, 2050 12:00:00'); // in the future
- * const delayedClicks = clicks.pipe(delay(date)); // click emitted only after that date
- * delayedClicks.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link debounceTime}
- * @see {@link delayWhen}
- *
- * @param {number|Date} delay The delay duration in milliseconds (a `number`) or
- * a `Date` until which the emission of the source items is delayed.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
- * managing the timers that handle the time-shift for each item.
- * @return {Observable} An Observable that delays the emissions of the source
- * Observable by the specified timeout or Date.
- * @method delay
- * @owner Observable
- */
-export declare function delay<T>(delay: number | Date, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/delay.js b/node_modules/rxjs/internal/operators/delay.js
deleted file mode 100644
index b05d8b8..0000000
--- a/node_modules/rxjs/internal/operators/delay.js
+++ /dev/null
@@ -1,105 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var isDate_1 = require("../util/isDate");
-var Subscriber_1 = require("../Subscriber");
-var Notification_1 = require("../Notification");
-function delay(delay, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    var absoluteDelay = isDate_1.isDate(delay);
-    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);
-    return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); };
-}
-exports.delay = delay;
-var DelayOperator = (function () {
-    function DelayOperator(delay, scheduler) {
-        this.delay = delay;
-        this.scheduler = scheduler;
-    }
-    DelayOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));
-    };
-    return DelayOperator;
-}());
-var DelaySubscriber = (function (_super) {
-    __extends(DelaySubscriber, _super);
-    function DelaySubscriber(destination, delay, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.delay = delay;
-        _this.scheduler = scheduler;
-        _this.queue = [];
-        _this.active = false;
-        _this.errored = false;
-        return _this;
-    }
-    DelaySubscriber.dispatch = function (state) {
-        var source = state.source;
-        var queue = source.queue;
-        var scheduler = state.scheduler;
-        var destination = state.destination;
-        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {
-            queue.shift().notification.observe(destination);
-        }
-        if (queue.length > 0) {
-            var delay_1 = Math.max(0, queue[0].time - scheduler.now());
-            this.schedule(state, delay_1);
-        }
-        else {
-            this.unsubscribe();
-            source.active = false;
-        }
-    };
-    DelaySubscriber.prototype._schedule = function (scheduler) {
-        this.active = true;
-        var destination = this.destination;
-        destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {
-            source: this, destination: this.destination, scheduler: scheduler
-        }));
-    };
-    DelaySubscriber.prototype.scheduleNotification = function (notification) {
-        if (this.errored === true) {
-            return;
-        }
-        var scheduler = this.scheduler;
-        var message = new DelayMessage(scheduler.now() + this.delay, notification);
-        this.queue.push(message);
-        if (this.active === false) {
-            this._schedule(scheduler);
-        }
-    };
-    DelaySubscriber.prototype._next = function (value) {
-        this.scheduleNotification(Notification_1.Notification.createNext(value));
-    };
-    DelaySubscriber.prototype._error = function (err) {
-        this.errored = true;
-        this.queue = [];
-        this.destination.error(err);
-        this.unsubscribe();
-    };
-    DelaySubscriber.prototype._complete = function () {
-        this.scheduleNotification(Notification_1.Notification.createComplete());
-        this.unsubscribe();
-    };
-    return DelaySubscriber;
-}(Subscriber_1.Subscriber));
-var DelayMessage = (function () {
-    function DelayMessage(time, notification) {
-        this.time = time;
-        this.notification = notification;
-    }
-    return DelayMessage;
-}());
-//# sourceMappingURL=delay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/delay.js.map b/node_modules/rxjs/internal/operators/delay.js.map
deleted file mode 100644
index 5453347..0000000
--- a/node_modules/rxjs/internal/operators/delay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"delay.js","sources":["../../src/internal/operators/delay.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/delayWhen.d.ts b/node_modules/rxjs/internal/operators/delayWhen.d.ts
deleted file mode 100644
index 8ead9aa..0000000
--- a/node_modules/rxjs/internal/operators/delayWhen.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction } from '../types';
-/** @deprecated In future versions, empty notifiers will no longer re-emit the source value on the output observable. */
-export declare function delayWhen<T>(delayDurationSelector: (value: T, index: number) => Observable<never>, subscriptionDelay?: Observable<any>): MonoTypeOperatorFunction<T>;
-export declare function delayWhen<T>(delayDurationSelector: (value: T, index: number) => Observable<any>, subscriptionDelay?: Observable<any>): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/delayWhen.js b/node_modules/rxjs/internal/operators/delayWhen.js
deleted file mode 100644
index c7451da..0000000
--- a/node_modules/rxjs/internal/operators/delayWhen.js
+++ /dev/null
@@ -1,146 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Observable_1 = require("../Observable");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function delayWhen(delayDurationSelector, subscriptionDelay) {
-    if (subscriptionDelay) {
-        return function (source) {
-            return new SubscriptionDelayObservable(source, subscriptionDelay)
-                .lift(new DelayWhenOperator(delayDurationSelector));
-        };
-    }
-    return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); };
-}
-exports.delayWhen = delayWhen;
-var DelayWhenOperator = (function () {
-    function DelayWhenOperator(delayDurationSelector) {
-        this.delayDurationSelector = delayDurationSelector;
-    }
-    DelayWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));
-    };
-    return DelayWhenOperator;
-}());
-var DelayWhenSubscriber = (function (_super) {
-    __extends(DelayWhenSubscriber, _super);
-    function DelayWhenSubscriber(destination, delayDurationSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.delayDurationSelector = delayDurationSelector;
-        _this.completed = false;
-        _this.delayNotifierSubscriptions = [];
-        _this.index = 0;
-        return _this;
-    }
-    DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(outerValue);
-        this.removeSubscription(innerSub);
-        this.tryComplete();
-    };
-    DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) {
-        var value = this.removeSubscription(innerSub);
-        if (value) {
-            this.destination.next(value);
-        }
-        this.tryComplete();
-    };
-    DelayWhenSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        try {
-            var delayNotifier = this.delayDurationSelector(value, index);
-            if (delayNotifier) {
-                this.tryDelay(delayNotifier, value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    DelayWhenSubscriber.prototype._complete = function () {
-        this.completed = true;
-        this.tryComplete();
-        this.unsubscribe();
-    };
-    DelayWhenSubscriber.prototype.removeSubscription = function (subscription) {
-        subscription.unsubscribe();
-        var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);
-        if (subscriptionIdx !== -1) {
-            this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);
-        }
-        return subscription.outerValue;
-    };
-    DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) {
-        var notifierSubscription = subscribeToResult_1.subscribeToResult(this, delayNotifier, value);
-        if (notifierSubscription && !notifierSubscription.closed) {
-            var destination = this.destination;
-            destination.add(notifierSubscription);
-            this.delayNotifierSubscriptions.push(notifierSubscription);
-        }
-    };
-    DelayWhenSubscriber.prototype.tryComplete = function () {
-        if (this.completed && this.delayNotifierSubscriptions.length === 0) {
-            this.destination.complete();
-        }
-    };
-    return DelayWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-var SubscriptionDelayObservable = (function (_super) {
-    __extends(SubscriptionDelayObservable, _super);
-    function SubscriptionDelayObservable(source, subscriptionDelay) {
-        var _this = _super.call(this) || this;
-        _this.source = source;
-        _this.subscriptionDelay = subscriptionDelay;
-        return _this;
-    }
-    SubscriptionDelayObservable.prototype._subscribe = function (subscriber) {
-        this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));
-    };
-    return SubscriptionDelayObservable;
-}(Observable_1.Observable));
-var SubscriptionDelaySubscriber = (function (_super) {
-    __extends(SubscriptionDelaySubscriber, _super);
-    function SubscriptionDelaySubscriber(parent, source) {
-        var _this = _super.call(this) || this;
-        _this.parent = parent;
-        _this.source = source;
-        _this.sourceSubscribed = false;
-        return _this;
-    }
-    SubscriptionDelaySubscriber.prototype._next = function (unused) {
-        this.subscribeToSource();
-    };
-    SubscriptionDelaySubscriber.prototype._error = function (err) {
-        this.unsubscribe();
-        this.parent.error(err);
-    };
-    SubscriptionDelaySubscriber.prototype._complete = function () {
-        this.unsubscribe();
-        this.subscribeToSource();
-    };
-    SubscriptionDelaySubscriber.prototype.subscribeToSource = function () {
-        if (!this.sourceSubscribed) {
-            this.sourceSubscribed = true;
-            this.unsubscribe();
-            this.source.subscribe(this.parent);
-        }
-    };
-    return SubscriptionDelaySubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=delayWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/delayWhen.js.map b/node_modules/rxjs/internal/operators/delayWhen.js.map
deleted file mode 100644
index e34ba76..0000000
--- a/node_modules/rxjs/internal/operators/delayWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"delayWhen.js","sources":["../../src/internal/operators/delayWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/dematerialize.d.ts b/node_modules/rxjs/internal/operators/dematerialize.d.ts
deleted file mode 100644
index 063d26d..0000000
--- a/node_modules/rxjs/internal/operators/dematerialize.d.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { Notification } from '../Notification';
-import { OperatorFunction } from '../types';
-/**
- * Converts an Observable of {@link Notification} objects into the emissions
- * that they represent.
- *
- * <span class="informal">Unwraps {@link Notification} objects as actual `next`,
- * `error` and `complete` emissions. The opposite of {@link materialize}.</span>
- *
- * ![](dematerialize.png)
- *
- * `dematerialize` is assumed to operate an Observable that only emits
- * {@link Notification} objects as `next` emissions, and does not emit any
- * `error`. Such Observable is the output of a `materialize` operation. Those
- * notifications are then unwrapped using the metadata they contain, and emitted
- * as `next`, `error`, and `complete` on the output Observable.
- *
- * Use this operator in conjunction with {@link materialize}.
- *
- * ## Example
- * Convert an Observable of Notifications to an actual Observable
- * ```ts
- * import { of, Notification } from 'rxjs';
- * import { dematerialize } from 'rxjs/operators';
- *
- * const notifA = new Notification('N', 'A');
- * const notifB = new Notification('N', 'B');
- * const notifE = new Notification('E', undefined,
- *   new TypeError('x.toUpperCase is not a function')
- * );
- * const materialized = of(notifA, notifB, notifE);
- * const upperCase = materialized.pipe(dematerialize());
- * upperCase.subscribe(x => console.log(x), e => console.error(e));
- *
- * // Results in:
- * // A
- * // B
- * // TypeError: x.toUpperCase is not a function
- * ```
- *
- * @see {@link Notification}
- * @see {@link materialize}
- *
- * @return {Observable} An Observable that emits items and notifications
- * embedded in Notification objects emitted by the source Observable.
- * @method dematerialize
- * @owner Observable
- */
-export declare function dematerialize<T>(): OperatorFunction<Notification<T>, T>;
diff --git a/node_modules/rxjs/internal/operators/dematerialize.js b/node_modules/rxjs/internal/operators/dematerialize.js
deleted file mode 100644
index c43aa3f..0000000
--- a/node_modules/rxjs/internal/operators/dematerialize.js
+++ /dev/null
@@ -1,41 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function dematerialize() {
-    return function dematerializeOperatorFunction(source) {
-        return source.lift(new DeMaterializeOperator());
-    };
-}
-exports.dematerialize = dematerialize;
-var DeMaterializeOperator = (function () {
-    function DeMaterializeOperator() {
-    }
-    DeMaterializeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DeMaterializeSubscriber(subscriber));
-    };
-    return DeMaterializeOperator;
-}());
-var DeMaterializeSubscriber = (function (_super) {
-    __extends(DeMaterializeSubscriber, _super);
-    function DeMaterializeSubscriber(destination) {
-        return _super.call(this, destination) || this;
-    }
-    DeMaterializeSubscriber.prototype._next = function (value) {
-        value.observe(this.destination);
-    };
-    return DeMaterializeSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=dematerialize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/dematerialize.js.map b/node_modules/rxjs/internal/operators/dematerialize.js.map
deleted file mode 100644
index 0e28116..0000000
--- a/node_modules/rxjs/internal/operators/dematerialize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"dematerialize.js","sources":["../../src/internal/operators/dematerialize.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AAkD3C,SAAgB,aAAa;IAC3B,OAAO,SAAS,6BAA6B,CAAC,MAAmC;QAC/E,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC;AAJD,sCAIC;AAED;IAAA;IAIA,CAAC;IAHC,oCAAI,GAAJ,UAAK,UAA2B,EAAE,MAAW;QAC3C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC;IACnE,CAAC;IACH,4BAAC;AAAD,CAAC,AAJD,IAIC;AAOD;IAAmE,2CAAa;IAC9E,iCAAY,WAA4B;eACtC,kBAAM,WAAW,CAAC;IACpB,CAAC;IAES,uCAAK,GAAf,UAAgB,KAAQ;QACtB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IACH,8BAAC;AAAD,CAAC,AARD,CAAmE,uBAAU,GAQ5E"}
diff --git a/node_modules/rxjs/internal/operators/distinct.d.ts b/node_modules/rxjs/internal/operators/distinct.d.ts
deleted file mode 100644
index 3356046..0000000
--- a/node_modules/rxjs/internal/operators/distinct.d.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items.
- *
- * If a keySelector function is provided, then it will project each value from the source observable into a new value that it will
- * check for equality with previously projected values. If a keySelector function is not provided, it will use each value from the
- * source observable directly with an equality check against previous values.
- *
- * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking.
- *
- * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the
- * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct`
- * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so
- * that the internal `Set` can be "flushed", basically clearing it of values.
- *
- * ## Examples
- * A simple example with numbers
- * ```ts
- * import { of } from 'rxjs';
- * import { distinct } from 'rxjs/operators';
- *
- * of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1).pipe(
- *     distinct(),
- *   )
- *   .subscribe(x => console.log(x)); // 1, 2, 3, 4
- * ```
- *
- * An example using a keySelector function
- * ```typescript
- * import { of } from 'rxjs';
- * import { distinct } from 'rxjs/operators';
- *
- * interface Person {
- *    age: number,
- *    name: string
- * }
- *
- * of<Person>(
- *     { age: 4, name: 'Foo'},
- *     { age: 7, name: 'Bar'},
- *     { age: 5, name: 'Foo'},
- *   ).pipe(
- *     distinct((p: Person) => p.name),
- *   )
- *   .subscribe(x => console.log(x));
- *
- * // displays:
- * // { age: 4, name: 'Foo' }
- * // { age: 7, name: 'Bar' }
- * ```
- * @see {@link distinctUntilChanged}
- * @see {@link distinctUntilKeyChanged}
- *
- * @param {function} [keySelector] Optional function to select which value you want to check as distinct.
- * @param {Observable} [flushes] Optional Observable for flushing the internal HashSet of the operator.
- * @return {Observable} An Observable that emits items from the source Observable with distinct values.
- * @method distinct
- * @owner Observable
- */
-export declare function distinct<T, K>(keySelector?: (value: T) => K, flushes?: Observable<any>): MonoTypeOperatorFunction<T>;
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class DistinctSubscriber<T, K> extends OuterSubscriber<T, T> {
-    private keySelector;
-    private values;
-    constructor(destination: Subscriber<T>, keySelector: (value: T) => K, flushes: Observable<any>);
-    notifyNext(outerValue: T, innerValue: T, outerIndex: number, innerIndex: number, innerSub: InnerSubscriber<T, T>): void;
-    notifyError(error: any, innerSub: InnerSubscriber<T, T>): void;
-    protected _next(value: T): void;
-    private _useKeySelector;
-    private _finalizeNext;
-}
diff --git a/node_modules/rxjs/internal/operators/distinct.js b/node_modules/rxjs/internal/operators/distinct.js
deleted file mode 100644
index f9c7d84..0000000
--- a/node_modules/rxjs/internal/operators/distinct.js
+++ /dev/null
@@ -1,79 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function distinct(keySelector, flushes) {
-    return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); };
-}
-exports.distinct = distinct;
-var DistinctOperator = (function () {
-    function DistinctOperator(keySelector, flushes) {
-        this.keySelector = keySelector;
-        this.flushes = flushes;
-    }
-    DistinctOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));
-    };
-    return DistinctOperator;
-}());
-var DistinctSubscriber = (function (_super) {
-    __extends(DistinctSubscriber, _super);
-    function DistinctSubscriber(destination, keySelector, flushes) {
-        var _this = _super.call(this, destination) || this;
-        _this.keySelector = keySelector;
-        _this.values = new Set();
-        if (flushes) {
-            _this.add(subscribeToResult_1.subscribeToResult(_this, flushes));
-        }
-        return _this;
-    }
-    DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values.clear();
-    };
-    DistinctSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    DistinctSubscriber.prototype._next = function (value) {
-        if (this.keySelector) {
-            this._useKeySelector(value);
-        }
-        else {
-            this._finalizeNext(value, value);
-        }
-    };
-    DistinctSubscriber.prototype._useKeySelector = function (value) {
-        var key;
-        var destination = this.destination;
-        try {
-            key = this.keySelector(value);
-        }
-        catch (err) {
-            destination.error(err);
-            return;
-        }
-        this._finalizeNext(key, value);
-    };
-    DistinctSubscriber.prototype._finalizeNext = function (key, value) {
-        var values = this.values;
-        if (!values.has(key)) {
-            values.add(key);
-            this.destination.next(value);
-        }
-    };
-    return DistinctSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.DistinctSubscriber = DistinctSubscriber;
-//# sourceMappingURL=distinct.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/distinct.js.map b/node_modules/rxjs/internal/operators/distinct.js.map
deleted file mode 100644
index 390ca98..0000000
--- a/node_modules/rxjs/internal/operators/distinct.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinct.js","sources":["../../src/internal/operators/distinct.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,sDAAqD;AAErD,+DAA8D;AA6D9D,SAAgB,QAAQ,CAAO,WAA6B,EAC7B,OAAyB;IACtD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EAAvD,CAAuD,CAAC;AAC5F,CAAC;AAHD,4BAGC;AAED;IACE,0BAAoB,WAA4B,EAAU,OAAwB;QAA9D,gBAAW,GAAX,WAAW,CAAiB;QAAU,YAAO,GAAP,OAAO,CAAiB;IAClF,CAAC;IAED,+BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9F,CAAC;IACH,uBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAA8C,sCAAqB;IAGjE,4BAAY,WAA0B,EAAU,WAA4B,EAAE,OAAwB;QAAtG,YACE,kBAAM,WAAW,CAAC,SAKnB;QAN+C,iBAAW,GAAX,WAAW,CAAiB;QAFpE,YAAM,GAAG,IAAI,GAAG,EAAK,CAAC;QAK5B,IAAI,OAAO,EAAE;YACX,KAAI,CAAC,GAAG,CAAC,qCAAiB,CAAC,KAAI,EAAE,OAAO,CAAC,CAAC,CAAC;SAC5C;;IACH,CAAC;IAED,uCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,wCAAW,GAAX,UAAY,KAAU,EAAE,QAA+B;QACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAES,kCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;SAC7B;aAAM;YACL,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAClC;IACH,CAAC;IAEO,4CAAe,GAAvB,UAAwB,KAAQ;QAC9B,IAAI,GAAM,CAAC;QACH,IAAA,8BAAW,CAAU;QAC7B,IAAI;YACF,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC/B;QAAC,OAAO,GAAG,EAAE;YACZ,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO;SACR;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAEO,0CAAa,GAArB,UAAsB,GAAQ,EAAE,KAAQ;QAC9B,IAAA,oBAAM,CAAU;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAI,GAAG,CAAC,EAAE;YACvB,MAAM,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IAEH,yBAAC;AAAD,CAAC,AAjDD,CAA8C,iCAAe,GAiD5D;AAjDY,gDAAkB"}
diff --git a/node_modules/rxjs/internal/operators/distinctUntilChanged.d.ts b/node_modules/rxjs/internal/operators/distinctUntilChanged.d.ts
deleted file mode 100644
index 74eb5e9..0000000
--- a/node_modules/rxjs/internal/operators/distinctUntilChanged.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-export declare function distinctUntilChanged<T>(compare?: (x: T, y: T) => boolean): MonoTypeOperatorFunction<T>;
-export declare function distinctUntilChanged<T, K>(compare: (x: K, y: K) => boolean, keySelector: (x: T) => K): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/distinctUntilChanged.js b/node_modules/rxjs/internal/operators/distinctUntilChanged.js
deleted file mode 100644
index 58ef57a..0000000
--- a/node_modules/rxjs/internal/operators/distinctUntilChanged.js
+++ /dev/null
@@ -1,74 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function distinctUntilChanged(compare, keySelector) {
-    return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); };
-}
-exports.distinctUntilChanged = distinctUntilChanged;
-var DistinctUntilChangedOperator = (function () {
-    function DistinctUntilChangedOperator(compare, keySelector) {
-        this.compare = compare;
-        this.keySelector = keySelector;
-    }
-    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
-    };
-    return DistinctUntilChangedOperator;
-}());
-var DistinctUntilChangedSubscriber = (function (_super) {
-    __extends(DistinctUntilChangedSubscriber, _super);
-    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.keySelector = keySelector;
-        _this.hasKey = false;
-        if (typeof compare === 'function') {
-            _this.compare = compare;
-        }
-        return _this;
-    }
-    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {
-        return x === y;
-    };
-    DistinctUntilChangedSubscriber.prototype._next = function (value) {
-        var key;
-        try {
-            var keySelector = this.keySelector;
-            key = keySelector ? keySelector(value) : value;
-        }
-        catch (err) {
-            return this.destination.error(err);
-        }
-        var result = false;
-        if (this.hasKey) {
-            try {
-                var compare = this.compare;
-                result = compare(this.key, key);
-            }
-            catch (err) {
-                return this.destination.error(err);
-            }
-        }
-        else {
-            this.hasKey = true;
-        }
-        if (!result) {
-            this.key = key;
-            this.destination.next(value);
-        }
-    };
-    return DistinctUntilChangedSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=distinctUntilChanged.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/distinctUntilChanged.js.map b/node_modules/rxjs/internal/operators/distinctUntilChanged.js.map
deleted file mode 100644
index df1be47..0000000
--- a/node_modules/rxjs/internal/operators/distinctUntilChanged.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinctUntilChanged.js","sources":["../../src/internal/operators/distinctUntilChanged.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AA8D3C,SAAgB,oBAAoB,CAAO,OAAiC,EAAE,WAAyB;IACrG,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,4BAA4B,CAAO,OAAO,EAAE,WAAW,CAAC,CAAC,EAAzE,CAAyE,CAAC;AAC9G,CAAC;AAFD,oDAEC;AAED;IACE,sCAAoB,OAAgC,EAChC,WAAwB;QADxB,YAAO,GAAP,OAAO,CAAyB;QAChC,gBAAW,GAAX,WAAW,CAAa;IAC5C,CAAC;IAED,2CAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,8BAA8B,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,CAAC;IACH,mCAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAmD,kDAAa;IAI9D,wCAAY,WAA0B,EAC1B,OAAgC,EACxB,WAAwB;QAF5C,YAGE,kBAAM,WAAW,CAAC,SAInB;QALmB,iBAAW,GAAX,WAAW,CAAa;QAJpC,YAAM,GAAY,KAAK,CAAC;QAM9B,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;YACjC,KAAI,CAAC,OAAO,GAAG,OAAO,CAAC;SACxB;;IACH,CAAC;IAEO,gDAAO,GAAf,UAAgB,CAAM,EAAE,CAAM;QAC5B,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAES,8CAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,GAAQ,CAAC;QACb,IAAI;YACM,IAAA,8BAAW,CAAU;YAC7B,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SAChD;QAAC,OAAO,GAAG,EAAE;YACZ,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACpC;QACD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI;gBACM,IAAA,sBAAO,CAAU;gBACzB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;aACjC;YAAC,OAAO,GAAG,EAAE;gBACZ,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACpC;SACF;aAAM;YACL,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;SACpB;QACD,IAAI,CAAC,MAAM,EAAE;YACX,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IACH,qCAAC;AAAD,CAAC,AAzCD,CAAmD,uBAAU,GAyC5D"}
diff --git a/node_modules/rxjs/internal/operators/distinctUntilKeyChanged.d.ts b/node_modules/rxjs/internal/operators/distinctUntilKeyChanged.d.ts
deleted file mode 100644
index bfe67a8..0000000
--- a/node_modules/rxjs/internal/operators/distinctUntilKeyChanged.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-export declare function distinctUntilKeyChanged<T>(key: keyof T): MonoTypeOperatorFunction<T>;
-export declare function distinctUntilKeyChanged<T, K extends keyof T>(key: K, compare: (x: T[K], y: T[K]) => boolean): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/distinctUntilKeyChanged.js b/node_modules/rxjs/internal/operators/distinctUntilKeyChanged.js
deleted file mode 100644
index f63e466..0000000
--- a/node_modules/rxjs/internal/operators/distinctUntilKeyChanged.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var distinctUntilChanged_1 = require("./distinctUntilChanged");
-function distinctUntilKeyChanged(key, compare) {
-    return distinctUntilChanged_1.distinctUntilChanged(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });
-}
-exports.distinctUntilKeyChanged = distinctUntilKeyChanged;
-//# sourceMappingURL=distinctUntilKeyChanged.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/distinctUntilKeyChanged.js.map b/node_modules/rxjs/internal/operators/distinctUntilKeyChanged.js.map
deleted file mode 100644
index b631320..0000000
--- a/node_modules/rxjs/internal/operators/distinctUntilKeyChanged.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinctUntilKeyChanged.js","sources":["../../src/internal/operators/distinctUntilKeyChanged.ts"],"names":[],"mappings":";;AAAA,+DAA8D;AA8E9D,SAAgB,uBAAuB,CAAuB,GAAM,EAAE,OAAuC;IAC3G,OAAO,2CAAoB,CAAC,UAAC,CAAI,EAAE,CAAI,IAAK,OAAA,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAArD,CAAqD,CAAC,CAAC;AACrG,CAAC;AAFD,0DAEC"}
diff --git a/node_modules/rxjs/internal/operators/elementAt.d.ts b/node_modules/rxjs/internal/operators/elementAt.d.ts
deleted file mode 100644
index 0b96023..0000000
--- a/node_modules/rxjs/internal/operators/elementAt.d.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Emits the single value at the specified `index` in a sequence of emissions
- * from the source Observable.
- *
- * <span class="informal">Emits only the i-th value, then completes.</span>
- *
- * ![](elementAt.png)
- *
- * `elementAt` returns an Observable that emits the item at the specified
- * `index` in the source Observable, or a default value if that `index` is out
- * of range and the `default` argument is provided. If the `default` argument is
- * not given and the `index` is out of range, the output Observable will emit an
- * `ArgumentOutOfRangeError` error.
- *
- * ## Example
- * Emit only the third click event
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { elementAt } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(elementAt(2));
- * result.subscribe(x => console.log(x));
- *
- * // Results in:
- * // click 1 = nothing
- * // click 2 = nothing
- * // click 3 = MouseEvent object logged to console
- * ```
- *
- * @see {@link first}
- * @see {@link last}
- * @see {@link skip}
- * @see {@link single}
- * @see {@link take}
- *
- * @throws {ArgumentOutOfRangeError} When using `elementAt(i)`, it delivers an
- * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0` or the
- * Observable has completed before emitting the i-th `next` notification.
- *
- * @param {number} index Is the number `i` for the i-th source emission that has
- * happened since the subscription, starting from the number `0`.
- * @param {T} [defaultValue] The default value returned for missing indices.
- * @return {Observable} An Observable that emits a single item, if it is found.
- * Otherwise, will emit the default value if given. If not, then emits an error.
- * @method elementAt
- * @owner Observable
- */
-export declare function elementAt<T>(index: number, defaultValue?: T): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/elementAt.js b/node_modules/rxjs/internal/operators/elementAt.js
deleted file mode 100644
index 55ff96c..0000000
--- a/node_modules/rxjs/internal/operators/elementAt.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
-var filter_1 = require("./filter");
-var throwIfEmpty_1 = require("./throwIfEmpty");
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-var take_1 = require("./take");
-function elementAt(index, defaultValue) {
-    if (index < 0) {
-        throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError();
-    }
-    var hasDefaultValue = arguments.length >= 2;
-    return function (source) { return source.pipe(filter_1.filter(function (v, i) { return i === index; }), take_1.take(1), hasDefaultValue
-        ? defaultIfEmpty_1.defaultIfEmpty(defaultValue)
-        : throwIfEmpty_1.throwIfEmpty(function () { return new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError(); })); };
-}
-exports.elementAt = elementAt;
-//# sourceMappingURL=elementAt.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/elementAt.js.map b/node_modules/rxjs/internal/operators/elementAt.js.map
deleted file mode 100644
index 853a912..0000000
--- a/node_modules/rxjs/internal/operators/elementAt.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"elementAt.js","sources":["../../src/internal/operators/elementAt.ts"],"names":[],"mappings":";;AAEA,2EAA0E;AAG1E,mCAAkC;AAClC,+CAA8C;AAC9C,mDAAkD;AAClD,+BAA8B;AAkD9B,SAAgB,SAAS,CAAI,KAAa,EAAE,YAAgB;IAC1D,IAAI,KAAK,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,iDAAuB,EAAE,CAAC;KAAE;IACvD,IAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9C,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAC3C,eAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,KAAK,KAAK,EAAX,CAAW,CAAC,EAC7B,WAAI,CAAC,CAAC,CAAC,EACP,eAAe;QACb,CAAC,CAAC,+BAAc,CAAC,YAAY,CAAC;QAC9B,CAAC,CAAC,2BAAY,CAAC,cAAM,OAAA,IAAI,iDAAuB,EAAE,EAA7B,CAA6B,CAAC,CACtD,EANiC,CAMjC,CAAC;AACJ,CAAC;AAVD,8BAUC"}
diff --git a/node_modules/rxjs/internal/operators/endWith.d.ts b/node_modules/rxjs/internal/operators/endWith.d.ts
deleted file mode 100644
index 4fbb425..0000000
--- a/node_modules/rxjs/internal/operators/endWith.d.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { MonoTypeOperatorFunction, SchedulerLike, OperatorFunction } from '../types';
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export declare function endWith<T>(scheduler: SchedulerLike): MonoTypeOperatorFunction<T>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export declare function endWith<T, A>(v1: A, scheduler: SchedulerLike): OperatorFunction<T, T | A>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export declare function endWith<T, A, B>(v1: A, v2: B, scheduler: SchedulerLike): OperatorFunction<T, T | A | B>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export declare function endWith<T, A, B, C>(v1: A, v2: B, v3: C, scheduler: SchedulerLike): OperatorFunction<T, T | A | B | C>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export declare function endWith<T, A, B, C, D>(v1: A, v2: B, v3: C, v4: D, scheduler: SchedulerLike): OperatorFunction<T, T | A | B | C | D>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export declare function endWith<T, A, B, C, D, E>(v1: A, v2: B, v3: C, v4: D, v5: E, scheduler: SchedulerLike): OperatorFunction<T, T | A | B | C | D | E>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export declare function endWith<T, A, B, C, D, E, F>(v1: A, v2: B, v3: C, v4: D, v5: E, v6: F, scheduler: SchedulerLike): OperatorFunction<T, T | A | B | C | D | E | F>;
-export declare function endWith<T, A>(v1: A): OperatorFunction<T, T | A>;
-export declare function endWith<T, A, B>(v1: A, v2: B): OperatorFunction<T, T | A | B>;
-export declare function endWith<T, A, B, C>(v1: A, v2: B, v3: C): OperatorFunction<T, T | A | B | C>;
-export declare function endWith<T, A, B, C, D>(v1: A, v2: B, v3: C, v4: D): OperatorFunction<T, T | A | B | C | D>;
-export declare function endWith<T, A, B, C, D, E>(v1: A, v2: B, v3: C, v4: D, v5: E): OperatorFunction<T, T | A | B | C | D | E>;
-export declare function endWith<T, A, B, C, D, E, F>(v1: A, v2: B, v3: C, v4: D, v5: E, v6: F): OperatorFunction<T, T | A | B | C | D | E | F>;
-export declare function endWith<T, Z = T>(...array: Z[]): OperatorFunction<T, T | Z>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export declare function endWith<T, Z = T>(...array: Array<Z | SchedulerLike>): OperatorFunction<T, T | Z>;
diff --git a/node_modules/rxjs/internal/operators/endWith.js b/node_modules/rxjs/internal/operators/endWith.js
deleted file mode 100644
index 028bd4e..0000000
--- a/node_modules/rxjs/internal/operators/endWith.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var concat_1 = require("../observable/concat");
-var of_1 = require("../observable/of");
-function endWith() {
-    var array = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        array[_i] = arguments[_i];
-    }
-    return function (source) { return concat_1.concat(source, of_1.of.apply(void 0, array)); };
-}
-exports.endWith = endWith;
-//# sourceMappingURL=endWith.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/endWith.js.map b/node_modules/rxjs/internal/operators/endWith.js.map
deleted file mode 100644
index 67e08f6..0000000
--- a/node_modules/rxjs/internal/operators/endWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"endWith.js","sources":["../../src/internal/operators/endWith.ts"],"names":[],"mappings":";;AACA,+CAA8C;AAC9C,uCAAsC;AA8DtC,SAAgB,OAAO;IAAI,eAAkC;SAAlC,UAAkC,EAAlC,qBAAkC,EAAlC,IAAkC;QAAlC,0BAAkC;;IAC3D,OAAO,UAAC,MAAqB,IAAK,OAAA,eAAM,CAAC,MAAM,EAAE,OAAE,eAAI,KAAK,EAAmB,EAA7C,CAA6C,CAAC;AAClF,CAAC;AAFD,0BAEC"}
diff --git a/node_modules/rxjs/internal/operators/every.d.ts b/node_modules/rxjs/internal/operators/every.d.ts
deleted file mode 100644
index a99efaa..0000000
--- a/node_modules/rxjs/internal/operators/every.d.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-/**
- * Returns an Observable that emits whether or not every item of the source satisfies the condition specified.
- *
- * ## Example
- * A simple example emitting true if all elements are less than 5, false otherwise
- * ```ts
- * import { of } from 'rxjs';
- * import { every } from 'rxjs/operators';
- *
- *  of(1, 2, 3, 4, 5, 6).pipe(
- *     every(x => x < 5),
- * )
- * .subscribe(x => console.log(x)); // -> false
- * ```
- *
- * @param {function} predicate A function for determining if an item meets a specified condition.
- * @param {any} [thisArg] Optional object to use for `this` in the callback.
- * @return {Observable} An Observable of booleans that determines if all items of the source Observable meet the condition specified.
- * @method every
- * @owner Observable
- */
-export declare function every<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean, thisArg?: any): OperatorFunction<T, boolean>;
diff --git a/node_modules/rxjs/internal/operators/every.js b/node_modules/rxjs/internal/operators/every.js
deleted file mode 100644
index 9189215..0000000
--- a/node_modules/rxjs/internal/operators/every.js
+++ /dev/null
@@ -1,65 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function every(predicate, thisArg) {
-    return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); };
-}
-exports.every = every;
-var EveryOperator = (function () {
-    function EveryOperator(predicate, thisArg, source) {
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-        this.source = source;
-    }
-    EveryOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));
-    };
-    return EveryOperator;
-}());
-var EverySubscriber = (function (_super) {
-    __extends(EverySubscriber, _super);
-    function EverySubscriber(destination, predicate, thisArg, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.thisArg = thisArg;
-        _this.source = source;
-        _this.index = 0;
-        _this.thisArg = thisArg || _this;
-        return _this;
-    }
-    EverySubscriber.prototype.notifyComplete = function (everyValueMatch) {
-        this.destination.next(everyValueMatch);
-        this.destination.complete();
-    };
-    EverySubscriber.prototype._next = function (value) {
-        var result = false;
-        try {
-            result = this.predicate.call(this.thisArg, value, this.index++, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (!result) {
-            this.notifyComplete(false);
-        }
-    };
-    EverySubscriber.prototype._complete = function () {
-        this.notifyComplete(true);
-    };
-    return EverySubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=every.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/every.js.map b/node_modules/rxjs/internal/operators/every.js.map
deleted file mode 100644
index 502036e..0000000
--- a/node_modules/rxjs/internal/operators/every.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"every.js","sources":["../../src/internal/operators/every.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AAwB3C,SAAgB,KAAK,CAAI,SAAsE,EACtE,OAAa;IACpC,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,EAA1D,CAA0D,CAAC;AAC/F,CAAC;AAHD,sBAGC;AAED;IACE,uBAAoB,SAAsE,EACtE,OAAa,EACb,MAAsB;QAFtB,cAAS,GAAT,SAAS,CAA6D;QACtE,YAAO,GAAP,OAAO,CAAM;QACb,WAAM,GAAN,MAAM,CAAgB;IAC1C,CAAC;IAED,4BAAI,GAAJ,UAAK,QAA6B,EAAE,MAAW;QAC7C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpG,CAAC;IACH,oBAAC;AAAD,CAAC,AATD,IASC;AAOD;IAAiC,mCAAa;IAG5C,yBAAY,WAA8B,EACtB,SAAsE,EACtE,OAAY,EACZ,MAAsB;QAH1C,YAIE,kBAAM,WAAW,CAAC,SAEnB;QALmB,eAAS,GAAT,SAAS,CAA6D;QACtE,aAAO,GAAP,OAAO,CAAK;QACZ,YAAM,GAAN,MAAM,CAAgB;QALlC,WAAK,GAAW,CAAC,CAAC;QAOxB,KAAI,CAAC,OAAO,GAAG,OAAO,IAAI,KAAI,CAAC;;IACjC,CAAC;IAEO,wCAAc,GAAtB,UAAuB,eAAwB;QAC7C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAES,+BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SAC9E;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QAED,IAAI,CAAC,MAAM,EAAE;YACX,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;SAC5B;IACH,CAAC;IAES,mCAAS,GAAnB;QACE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACH,sBAAC;AAAD,CAAC,AAjCD,CAAiC,uBAAU,GAiC1C"}
diff --git a/node_modules/rxjs/internal/operators/exhaust.d.ts b/node_modules/rxjs/internal/operators/exhaust.d.ts
deleted file mode 100644
index d4a1e67..0000000
--- a/node_modules/rxjs/internal/operators/exhaust.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { ObservableInput, OperatorFunction } from '../types';
-export declare function exhaust<T>(): OperatorFunction<ObservableInput<T>, T>;
-export declare function exhaust<R>(): OperatorFunction<any, R>;
diff --git a/node_modules/rxjs/internal/operators/exhaust.js b/node_modules/rxjs/internal/operators/exhaust.js
deleted file mode 100644
index 8b1c1ef..0000000
--- a/node_modules/rxjs/internal/operators/exhaust.js
+++ /dev/null
@@ -1,59 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function exhaust() {
-    return function (source) { return source.lift(new SwitchFirstOperator()); };
-}
-exports.exhaust = exhaust;
-var SwitchFirstOperator = (function () {
-    function SwitchFirstOperator() {
-    }
-    SwitchFirstOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SwitchFirstSubscriber(subscriber));
-    };
-    return SwitchFirstOperator;
-}());
-var SwitchFirstSubscriber = (function (_super) {
-    __extends(SwitchFirstSubscriber, _super);
-    function SwitchFirstSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasCompleted = false;
-        _this.hasSubscription = false;
-        return _this;
-    }
-    SwitchFirstSubscriber.prototype._next = function (value) {
-        if (!this.hasSubscription) {
-            this.hasSubscription = true;
-            this.add(subscribeToResult_1.subscribeToResult(this, value));
-        }
-    };
-    SwitchFirstSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (!this.hasSubscription) {
-            this.destination.complete();
-        }
-    };
-    SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.remove(innerSub);
-        this.hasSubscription = false;
-        if (this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return SwitchFirstSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=exhaust.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/exhaust.js.map b/node_modules/rxjs/internal/operators/exhaust.js.map
deleted file mode 100644
index 12e163c..0000000
--- a/node_modules/rxjs/internal/operators/exhaust.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exhaust.js","sources":["../../src/internal/operators/exhaust.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAIA,sDAAqD;AACrD,+DAA8D;AAkD9D,SAAgB,OAAO;IACrB,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAK,CAAC,EAAzC,CAAyC,CAAC;AAC9E,CAAC;AAFD,0BAEC;AAED;IAAA;IAIA,CAAC;IAHC,kCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;IACH,0BAAC;AAAD,CAAC,AAJD,IAIC;AAOD;IAAuC,yCAAqB;IAI1D,+BAAY,WAA0B;QAAtC,YACE,kBAAM,WAAW,CAAC,SACnB;QALO,kBAAY,GAAY,KAAK,CAAC;QAC9B,qBAAe,GAAY,KAAK,CAAC;;IAIzC,CAAC;IAES,qCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,qCAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;SAC1C;IACH,CAAC;IAES,yCAAS,GAAnB;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;IACH,CAAC;IAED,8CAAc,GAAd,UAAe,QAAsB;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SAC7B;IACH,CAAC;IACH,4BAAC;AAAD,CAAC,AA7BD,CAAuC,iCAAe,GA6BrD"}
diff --git a/node_modules/rxjs/internal/operators/exhaustMap.d.ts b/node_modules/rxjs/internal/operators/exhaustMap.d.ts
deleted file mode 100644
index 840948a..0000000
--- a/node_modules/rxjs/internal/operators/exhaustMap.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-export declare function exhaustMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector is no longer supported. Use inner map instead. */
-export declare function exhaustMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: undefined): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector is no longer supported. Use inner map instead. */
-export declare function exhaustMap<T, I, R>(project: (value: T, index: number) => ObservableInput<I>, resultSelector: (outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/exhaustMap.js b/node_modules/rxjs/internal/operators/exhaustMap.js
deleted file mode 100644
index 1560618..0000000
--- a/node_modules/rxjs/internal/operators/exhaustMap.js
+++ /dev/null
@@ -1,99 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var map_1 = require("./map");
-var from_1 = require("../observable/from");
-function exhaustMap(project, resultSelector) {
-    if (resultSelector) {
-        return function (source) { return source.pipe(exhaustMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
-    }
-    return function (source) {
-        return source.lift(new ExhaustMapOperator(project));
-    };
-}
-exports.exhaustMap = exhaustMap;
-var ExhaustMapOperator = (function () {
-    function ExhaustMapOperator(project) {
-        this.project = project;
-    }
-    ExhaustMapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project));
-    };
-    return ExhaustMapOperator;
-}());
-var ExhaustMapSubscriber = (function (_super) {
-    __extends(ExhaustMapSubscriber, _super);
-    function ExhaustMapSubscriber(destination, project) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.hasSubscription = false;
-        _this.hasCompleted = false;
-        _this.index = 0;
-        return _this;
-    }
-    ExhaustMapSubscriber.prototype._next = function (value) {
-        if (!this.hasSubscription) {
-            this.tryNext(value);
-        }
-    };
-    ExhaustMapSubscriber.prototype.tryNext = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.hasSubscription = true;
-        this._innerSub(result, value, index);
-    };
-    ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) {
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        var innerSubscription = subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            destination.add(innerSubscription);
-        }
-    };
-    ExhaustMapSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (!this.hasSubscription) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    ExhaustMapSubscriber.prototype.notifyError = function (err) {
-        this.destination.error(err);
-    };
-    ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.hasSubscription = false;
-        if (this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return ExhaustMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=exhaustMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/exhaustMap.js.map b/node_modules/rxjs/internal/operators/exhaustMap.js.map
deleted file mode 100644
index f957e58..0000000
--- a/node_modules/rxjs/internal/operators/exhaustMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exhaustMap.js","sources":["../../src/internal/operators/exhaustMap.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/expand.d.ts b/node_modules/rxjs/internal/operators/expand.d.ts
deleted file mode 100644
index 9164357..0000000
--- a/node_modules/rxjs/internal/operators/expand.d.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { MonoTypeOperatorFunction, OperatorFunction, ObservableInput, SchedulerLike } from '../types';
-export declare function expand<T, R>(project: (value: T, index: number) => ObservableInput<R>, concurrent?: number, scheduler?: SchedulerLike): OperatorFunction<T, R>;
-export declare function expand<T>(project: (value: T, index: number) => ObservableInput<T>, concurrent?: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
-export declare class ExpandOperator<T, R> implements Operator<T, R> {
-    private project;
-    private concurrent;
-    private scheduler;
-    constructor(project: (value: T, index: number) => ObservableInput<R>, concurrent: number, scheduler: SchedulerLike);
-    call(subscriber: Subscriber<R>, source: any): any;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class ExpandSubscriber<T, R> extends OuterSubscriber<T, R> {
-    private project;
-    private concurrent;
-    private scheduler;
-    private index;
-    private active;
-    private hasCompleted;
-    private buffer;
-    constructor(destination: Subscriber<R>, project: (value: T, index: number) => ObservableInput<R>, concurrent: number, scheduler: SchedulerLike);
-    private static dispatch;
-    protected _next(value: any): void;
-    private subscribeToProjection;
-    protected _complete(): void;
-    notifyNext(outerValue: T, innerValue: R, outerIndex: number, innerIndex: number, innerSub: InnerSubscriber<T, R>): void;
-    notifyComplete(innerSub: Subscription): void;
-}
diff --git a/node_modules/rxjs/internal/operators/expand.js b/node_modules/rxjs/internal/operators/expand.js
deleted file mode 100644
index adcbb31..0000000
--- a/node_modules/rxjs/internal/operators/expand.js
+++ /dev/null
@@ -1,115 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function expand(project, concurrent, scheduler) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (scheduler === void 0) { scheduler = undefined; }
-    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
-    return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); };
-}
-exports.expand = expand;
-var ExpandOperator = (function () {
-    function ExpandOperator(project, concurrent, scheduler) {
-        this.project = project;
-        this.concurrent = concurrent;
-        this.scheduler = scheduler;
-    }
-    ExpandOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));
-    };
-    return ExpandOperator;
-}());
-exports.ExpandOperator = ExpandOperator;
-var ExpandSubscriber = (function (_super) {
-    __extends(ExpandSubscriber, _super);
-    function ExpandSubscriber(destination, project, concurrent, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.concurrent = concurrent;
-        _this.scheduler = scheduler;
-        _this.index = 0;
-        _this.active = 0;
-        _this.hasCompleted = false;
-        if (concurrent < Number.POSITIVE_INFINITY) {
-            _this.buffer = [];
-        }
-        return _this;
-    }
-    ExpandSubscriber.dispatch = function (arg) {
-        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;
-        subscriber.subscribeToProjection(result, value, index);
-    };
-    ExpandSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        if (destination.closed) {
-            this._complete();
-            return;
-        }
-        var index = this.index++;
-        if (this.active < this.concurrent) {
-            destination.next(value);
-            try {
-                var project = this.project;
-                var result = project(value, index);
-                if (!this.scheduler) {
-                    this.subscribeToProjection(result, value, index);
-                }
-                else {
-                    var state = { subscriber: this, result: result, value: value, index: index };
-                    var destination_1 = this.destination;
-                    destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));
-                }
-            }
-            catch (e) {
-                destination.error(e);
-            }
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {
-        this.active++;
-        var destination = this.destination;
-        destination.add(subscribeToResult_1.subscribeToResult(this, result, value, index));
-    };
-    ExpandSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this._next(innerValue);
-    };
-    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.active--;
-        if (buffer && buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    return ExpandSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.ExpandSubscriber = ExpandSubscriber;
-//# sourceMappingURL=expand.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/expand.js.map b/node_modules/rxjs/internal/operators/expand.js.map
deleted file mode 100644
index f9c7a6e..0000000
--- a/node_modules/rxjs/internal/operators/expand.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"expand.js","sources":["../../src/internal/operators/expand.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/filter.d.ts b/node_modules/rxjs/internal/operators/filter.d.ts
deleted file mode 100644
index b4c9bba..0000000
--- a/node_modules/rxjs/internal/operators/filter.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { OperatorFunction, MonoTypeOperatorFunction } from '../types';
-export declare function filter<T, S extends T>(predicate: (value: T, index: number) => value is S, thisArg?: any): OperatorFunction<T, S>;
-export declare function filter<T>(predicate: (value: T, index: number) => boolean, thisArg?: any): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/filter.js b/node_modules/rxjs/internal/operators/filter.js
deleted file mode 100644
index 11ebd79..0000000
--- a/node_modules/rxjs/internal/operators/filter.js
+++ /dev/null
@@ -1,57 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function filter(predicate, thisArg) {
-    return function filterOperatorFunction(source) {
-        return source.lift(new FilterOperator(predicate, thisArg));
-    };
-}
-exports.filter = filter;
-var FilterOperator = (function () {
-    function FilterOperator(predicate, thisArg) {
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-    }
-    FilterOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));
-    };
-    return FilterOperator;
-}());
-var FilterSubscriber = (function (_super) {
-    __extends(FilterSubscriber, _super);
-    function FilterSubscriber(destination, predicate, thisArg) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.thisArg = thisArg;
-        _this.count = 0;
-        return _this;
-    }
-    FilterSubscriber.prototype._next = function (value) {
-        var result;
-        try {
-            result = this.predicate.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this.destination.next(value);
-        }
-    };
-    return FilterSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=filter.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/filter.js.map b/node_modules/rxjs/internal/operators/filter.js.map
deleted file mode 100644
index 3d84b19..0000000
--- a/node_modules/rxjs/internal/operators/filter.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"filter.js","sources":["../../src/internal/operators/filter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AAwD3C,SAAgB,MAAM,CAAI,SAA+C,EAC/C,OAAa;IACrC,OAAO,SAAS,sBAAsB,CAAC,MAAqB;QAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AALD,wBAKC;AAED;IACE,wBAAoB,SAA+C,EAC/C,OAAa;QADb,cAAS,GAAT,SAAS,CAAsC;QAC/C,YAAO,GAAP,OAAO,CAAM;IACjC,CAAC;IAED,6BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1F,CAAC;IACH,qBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAkC,oCAAa;IAI7C,0BAAY,WAA0B,EAClB,SAA+C,EAC/C,OAAY;QAFhC,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,eAAS,GAAT,SAAS,CAAsC;QAC/C,aAAO,GAAP,OAAO,CAAK;QAJhC,WAAK,GAAW,CAAC,CAAC;;IAMlB,CAAC;IAIS,gCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,MAAW,CAAC;QAChB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SACjE;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QACD,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAxBD,CAAkC,uBAAU,GAwB3C"}
diff --git a/node_modules/rxjs/internal/operators/finalize.d.ts b/node_modules/rxjs/internal/operators/finalize.d.ts
deleted file mode 100644
index 0dcc0f5..0000000
--- a/node_modules/rxjs/internal/operators/finalize.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Returns an Observable that mirrors the source Observable, but will call a specified function when
- * the source terminates on complete or error.
- * @param {function} callback Function to be called when source terminates.
- * @return {Observable} An Observable that mirrors the source, but will call the specified function on termination.
- * @method finally
- * @owner Observable
- */
-export declare function finalize<T>(callback: () => void): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/finalize.js b/node_modules/rxjs/internal/operators/finalize.js
deleted file mode 100644
index 855db40..0000000
--- a/node_modules/rxjs/internal/operators/finalize.js
+++ /dev/null
@@ -1,40 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Subscription_1 = require("../Subscription");
-function finalize(callback) {
-    return function (source) { return source.lift(new FinallyOperator(callback)); };
-}
-exports.finalize = finalize;
-var FinallyOperator = (function () {
-    function FinallyOperator(callback) {
-        this.callback = callback;
-    }
-    FinallyOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new FinallySubscriber(subscriber, this.callback));
-    };
-    return FinallyOperator;
-}());
-var FinallySubscriber = (function (_super) {
-    __extends(FinallySubscriber, _super);
-    function FinallySubscriber(destination, callback) {
-        var _this = _super.call(this, destination) || this;
-        _this.add(new Subscription_1.Subscription(callback));
-        return _this;
-    }
-    return FinallySubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=finalize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/finalize.js.map b/node_modules/rxjs/internal/operators/finalize.js.map
deleted file mode 100644
index ef4f02c..0000000
--- a/node_modules/rxjs/internal/operators/finalize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"finalize.js","sources":["../../src/internal/operators/finalize.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AAC3C,gDAA+C;AAY/C,SAAgB,QAAQ,CAAI,QAAoB;IAC9C,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,EAA1C,CAA0C,CAAC;AAC/E,CAAC;AAFD,4BAEC;AAED;IACE,yBAAoB,QAAoB;QAApB,aAAQ,GAAR,QAAQ,CAAY;IACxC,CAAC;IAED,8BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5E,CAAC;IACH,sBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAmC,qCAAa;IAC9C,2BAAY,WAA0B,EAAE,QAAoB;QAA5D,YACE,kBAAM,WAAW,CAAC,SAEnB;QADC,KAAI,CAAC,GAAG,CAAC,IAAI,2BAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;;IACvC,CAAC;IACH,wBAAC;AAAD,CAAC,AALD,CAAmC,uBAAU,GAK5C"}
diff --git a/node_modules/rxjs/internal/operators/find.d.ts b/node_modules/rxjs/internal/operators/find.d.ts
deleted file mode 100644
index 9da6850..0000000
--- a/node_modules/rxjs/internal/operators/find.d.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { OperatorFunction } from '../types';
-export declare function find<T, S extends T>(predicate: (value: T, index: number, source: Observable<T>) => value is S, thisArg?: any): OperatorFunction<T, S | undefined>;
-export declare function find<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean, thisArg?: any): OperatorFunction<T, T | undefined>;
-export declare class FindValueOperator<T> implements Operator<T, T | number | undefined> {
-    private predicate;
-    private source;
-    private yieldIndex;
-    private thisArg?;
-    constructor(predicate: (value: T, index: number, source: Observable<T>) => boolean, source: Observable<T>, yieldIndex: boolean, thisArg?: any);
-    call(observer: Subscriber<T>, source: any): any;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class FindValueSubscriber<T> extends Subscriber<T> {
-    private predicate;
-    private source;
-    private yieldIndex;
-    private thisArg?;
-    private index;
-    constructor(destination: Subscriber<T>, predicate: (value: T, index: number, source: Observable<T>) => boolean, source: Observable<T>, yieldIndex: boolean, thisArg?: any);
-    private notifyComplete;
-    protected _next(value: T): void;
-    protected _complete(): void;
-}
diff --git a/node_modules/rxjs/internal/operators/find.js b/node_modules/rxjs/internal/operators/find.js
deleted file mode 100644
index 899eb8e..0000000
--- a/node_modules/rxjs/internal/operators/find.js
+++ /dev/null
@@ -1,73 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function find(predicate, thisArg) {
-    if (typeof predicate !== 'function') {
-        throw new TypeError('predicate is not a function');
-    }
-    return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); };
-}
-exports.find = find;
-var FindValueOperator = (function () {
-    function FindValueOperator(predicate, source, yieldIndex, thisArg) {
-        this.predicate = predicate;
-        this.source = source;
-        this.yieldIndex = yieldIndex;
-        this.thisArg = thisArg;
-    }
-    FindValueOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));
-    };
-    return FindValueOperator;
-}());
-exports.FindValueOperator = FindValueOperator;
-var FindValueSubscriber = (function (_super) {
-    __extends(FindValueSubscriber, _super);
-    function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.source = source;
-        _this.yieldIndex = yieldIndex;
-        _this.thisArg = thisArg;
-        _this.index = 0;
-        return _this;
-    }
-    FindValueSubscriber.prototype.notifyComplete = function (value) {
-        var destination = this.destination;
-        destination.next(value);
-        destination.complete();
-        this.unsubscribe();
-    };
-    FindValueSubscriber.prototype._next = function (value) {
-        var _a = this, predicate = _a.predicate, thisArg = _a.thisArg;
-        var index = this.index++;
-        try {
-            var result = predicate.call(thisArg || this, value, index, this.source);
-            if (result) {
-                this.notifyComplete(this.yieldIndex ? index : value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    FindValueSubscriber.prototype._complete = function () {
-        this.notifyComplete(this.yieldIndex ? -1 : undefined);
-    };
-    return FindValueSubscriber;
-}(Subscriber_1.Subscriber));
-exports.FindValueSubscriber = FindValueSubscriber;
-//# sourceMappingURL=find.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/find.js.map b/node_modules/rxjs/internal/operators/find.js.map
deleted file mode 100644
index ab62452..0000000
--- a/node_modules/rxjs/internal/operators/find.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"find.js","sources":["../../src/internal/operators/find.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAAyC;AA8CzC,SAAgB,IAAI,CAAI,SAAsE,EACtE,OAAa;IACnC,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;QACnC,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;KACpD;IACD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAA8B,EAAlG,CAAkG,CAAC;AACvI,CAAC;AAND,oBAMC;AAED;IACE,2BAAoB,SAAsE,EACtE,MAAqB,EACrB,UAAmB,EACnB,OAAa;QAHb,cAAS,GAAT,SAAS,CAA6D;QACtE,WAAM,GAAN,MAAM,CAAe;QACrB,eAAU,GAAV,UAAU,CAAS;QACnB,YAAO,GAAP,OAAO,CAAM;IACjC,CAAC;IAED,gCAAI,GAAJ,UAAK,QAAuB,EAAE,MAAW;QACvC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACzH,CAAC;IACH,wBAAC;AAAD,CAAC,AAVD,IAUC;AAVY,8CAAiB;AAiB9B;IAA4C,uCAAa;IAGvD,6BAAY,WAA0B,EAClB,SAAsE,EACtE,MAAqB,EACrB,UAAmB,EACnB,OAAa;QAJjC,YAKE,kBAAM,WAAW,CAAC,SACnB;QALmB,eAAS,GAAT,SAAS,CAA6D;QACtE,YAAM,GAAN,MAAM,CAAe;QACrB,gBAAU,GAAV,UAAU,CAAS;QACnB,aAAO,GAAP,OAAO,CAAM;QANzB,WAAK,GAAW,CAAC,CAAC;;IAQ1B,CAAC;IAEO,4CAAc,GAAtB,UAAuB,KAAU;QAC/B,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAErC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,WAAW,CAAC,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,mCAAK,GAAf,UAAgB,KAAQ;QAChB,IAAA,SAA2B,EAA1B,wBAAS,EAAE,oBAAO,CAAS;QAClC,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI;YACF,IAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1E,IAAI,MAAM,EAAE;gBACV,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aACtD;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;IACH,CAAC;IAES,uCAAS,GAAnB;QACE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IACH,0BAAC;AAAD,CAAC,AAnCD,CAA4C,uBAAU,GAmCrD;AAnCY,kDAAmB"}
diff --git a/node_modules/rxjs/internal/operators/findIndex.d.ts b/node_modules/rxjs/internal/operators/findIndex.d.ts
deleted file mode 100644
index 036117e..0000000
--- a/node_modules/rxjs/internal/operators/findIndex.d.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-/**
- * Emits only the index of the first value emitted by the source Observable that
- * meets some condition.
- *
- * <span class="informal">It's like {@link find}, but emits the index of the
- * found value, not the value itself.</span>
- *
- * ![](findIndex.png)
- *
- * `findIndex` searches for the first item in the source Observable that matches
- * the specified condition embodied by the `predicate`, and returns the
- * (zero-based) index of the first occurrence in the source. Unlike
- * {@link first}, the `predicate` is required in `findIndex`, and does not emit
- * an error if a valid value is not found.
- *
- * ## Example
- * Emit the index of first click that happens on a DIV element
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { findIndex } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(findIndex(ev => ev.target.tagName === 'DIV'));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link filter}
- * @see {@link find}
- * @see {@link first}
- * @see {@link take}
- *
- * @param {function(value: T, index: number, source: Observable<T>): boolean} predicate
- * A function called with each item to test for condition matching.
- * @param {any} [thisArg] An optional argument to determine the value of `this`
- * in the `predicate` function.
- * @return {Observable} An Observable of the index of the first item that
- * matches the condition.
- * @method find
- * @owner Observable
- */
-export declare function findIndex<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean, thisArg?: any): OperatorFunction<T, number>;
diff --git a/node_modules/rxjs/internal/operators/findIndex.js b/node_modules/rxjs/internal/operators/findIndex.js
deleted file mode 100644
index 255982c..0000000
--- a/node_modules/rxjs/internal/operators/findIndex.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var find_1 = require("../operators/find");
-function findIndex(predicate, thisArg) {
-    return function (source) { return source.lift(new find_1.FindValueOperator(predicate, source, true, thisArg)); };
-}
-exports.findIndex = findIndex;
-//# sourceMappingURL=findIndex.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/findIndex.js.map b/node_modules/rxjs/internal/operators/findIndex.js.map
deleted file mode 100644
index be3d4c9..0000000
--- a/node_modules/rxjs/internal/operators/findIndex.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"findIndex.js","sources":["../../src/internal/operators/findIndex.ts"],"names":[],"mappings":";;AACA,0CAAsD;AA0CtD,SAAgB,SAAS,CAAI,SAAsE,EACtE,OAAa;IACxC,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,wBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAoB,EAAvF,CAAuF,CAAC;AAC5H,CAAC;AAHD,8BAGC"}
diff --git a/node_modules/rxjs/internal/operators/first.d.ts b/node_modules/rxjs/internal/operators/first.d.ts
deleted file mode 100644
index 53523e5..0000000
--- a/node_modules/rxjs/internal/operators/first.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../../internal/types';
-export declare function first<T, D = T>(predicate?: null, defaultValue?: D): OperatorFunction<T, T | D>;
-export declare function first<T, S extends T>(predicate: (value: T, index: number, source: Observable<T>) => value is S, defaultValue?: S): OperatorFunction<T, S>;
-export declare function first<T, D = T>(predicate: (value: T, index: number, source: Observable<T>) => boolean, defaultValue?: D): OperatorFunction<T, T | D>;
diff --git a/node_modules/rxjs/internal/operators/first.js b/node_modules/rxjs/internal/operators/first.js
deleted file mode 100644
index 1eb7f09..0000000
--- a/node_modules/rxjs/internal/operators/first.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var EmptyError_1 = require("../util/EmptyError");
-var filter_1 = require("./filter");
-var take_1 = require("./take");
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-var throwIfEmpty_1 = require("./throwIfEmpty");
-var identity_1 = require("../util/identity");
-function first(predicate, defaultValue) {
-    var hasDefaultValue = arguments.length >= 2;
-    return function (source) { return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, take_1.take(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); })); };
-}
-exports.first = first;
-//# sourceMappingURL=first.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/first.js.map b/node_modules/rxjs/internal/operators/first.js.map
deleted file mode 100644
index 56d058f..0000000
--- a/node_modules/rxjs/internal/operators/first.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"first.js","sources":["../../src/internal/operators/first.ts"],"names":[],"mappings":";;AAGA,iDAAgD;AAEhD,mCAAkC;AAClC,+BAA8B;AAC9B,mDAAkD;AAClD,+CAA8C;AAC9C,6CAA4C;AAuE5C,SAAgB,KAAK,CACnB,SAAgF,EAChF,YAAgB;IAEhB,IAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9C,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAC3C,SAAS,CAAC,CAAC,CAAC,eAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAvB,CAAuB,CAAC,CAAC,CAAC,CAAC,mBAAQ,EAChE,WAAI,CAAC,CAAC,CAAC,EACP,eAAe,CAAC,CAAC,CAAC,+BAAc,CAAQ,YAAY,CAAC,CAAC,CAAC,CAAC,2BAAY,CAAC,cAAM,OAAA,IAAI,uBAAU,EAAE,EAAhB,CAAgB,CAAC,CAC7F,EAJiC,CAIjC,CAAC;AACJ,CAAC;AAVD,sBAUC"}
diff --git a/node_modules/rxjs/internal/operators/groupBy.d.ts b/node_modules/rxjs/internal/operators/groupBy.d.ts
deleted file mode 100644
index 2125bab..0000000
--- a/node_modules/rxjs/internal/operators/groupBy.d.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { Observable } from '../Observable';
-import { Subject } from '../Subject';
-import { OperatorFunction } from '../types';
-export declare function groupBy<T, K>(keySelector: (value: T) => K): OperatorFunction<T, GroupedObservable<K, T>>;
-export declare function groupBy<T, K>(keySelector: (value: T) => K, elementSelector: void, durationSelector: (grouped: GroupedObservable<K, T>) => Observable<any>): OperatorFunction<T, GroupedObservable<K, T>>;
-export declare function groupBy<T, K, R>(keySelector: (value: T) => K, elementSelector?: (value: T) => R, durationSelector?: (grouped: GroupedObservable<K, R>) => Observable<any>): OperatorFunction<T, GroupedObservable<K, R>>;
-export declare function groupBy<T, K, R>(keySelector: (value: T) => K, elementSelector?: (value: T) => R, durationSelector?: (grouped: GroupedObservable<K, R>) => Observable<any>, subjectSelector?: () => Subject<R>): OperatorFunction<T, GroupedObservable<K, R>>;
-export interface RefCountSubscription {
-    count: number;
-    unsubscribe: () => void;
-    closed: boolean;
-    attemptedToUnsubscribe: boolean;
-}
-/**
- * An Observable representing values belonging to the same group represented by
- * a common key. The values emitted by a GroupedObservable come from the source
- * Observable. The common key is available as the field `key` on a
- * GroupedObservable instance.
- *
- * @class GroupedObservable<K, T>
- */
-export declare class GroupedObservable<K, T> extends Observable<T> {
-    key: K;
-    private groupSubject;
-    private refCountSubscription?;
-    /** @deprecated Do not construct this type. Internal use only */
-    constructor(key: K, groupSubject: Subject<T>, refCountSubscription?: RefCountSubscription);
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _subscribe(subscriber: Subscriber<T>): Subscription;
-}
diff --git a/node_modules/rxjs/internal/operators/groupBy.js b/node_modules/rxjs/internal/operators/groupBy.js
deleted file mode 100644
index 116ddab..0000000
--- a/node_modules/rxjs/internal/operators/groupBy.js
+++ /dev/null
@@ -1,196 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Subscription_1 = require("../Subscription");
-var Observable_1 = require("../Observable");
-var Subject_1 = require("../Subject");
-function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {
-    return function (source) {
-        return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));
-    };
-}
-exports.groupBy = groupBy;
-var GroupByOperator = (function () {
-    function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) {
-        this.keySelector = keySelector;
-        this.elementSelector = elementSelector;
-        this.durationSelector = durationSelector;
-        this.subjectSelector = subjectSelector;
-    }
-    GroupByOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));
-    };
-    return GroupByOperator;
-}());
-var GroupBySubscriber = (function (_super) {
-    __extends(GroupBySubscriber, _super);
-    function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.keySelector = keySelector;
-        _this.elementSelector = elementSelector;
-        _this.durationSelector = durationSelector;
-        _this.subjectSelector = subjectSelector;
-        _this.groups = null;
-        _this.attemptedToUnsubscribe = false;
-        _this.count = 0;
-        return _this;
-    }
-    GroupBySubscriber.prototype._next = function (value) {
-        var key;
-        try {
-            key = this.keySelector(value);
-        }
-        catch (err) {
-            this.error(err);
-            return;
-        }
-        this._group(value, key);
-    };
-    GroupBySubscriber.prototype._group = function (value, key) {
-        var groups = this.groups;
-        if (!groups) {
-            groups = this.groups = new Map();
-        }
-        var group = groups.get(key);
-        var element;
-        if (this.elementSelector) {
-            try {
-                element = this.elementSelector(value);
-            }
-            catch (err) {
-                this.error(err);
-            }
-        }
-        else {
-            element = value;
-        }
-        if (!group) {
-            group = (this.subjectSelector ? this.subjectSelector() : new Subject_1.Subject());
-            groups.set(key, group);
-            var groupedObservable = new GroupedObservable(key, group, this);
-            this.destination.next(groupedObservable);
-            if (this.durationSelector) {
-                var duration = void 0;
-                try {
-                    duration = this.durationSelector(new GroupedObservable(key, group));
-                }
-                catch (err) {
-                    this.error(err);
-                    return;
-                }
-                this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));
-            }
-        }
-        if (!group.closed) {
-            group.next(element);
-        }
-    };
-    GroupBySubscriber.prototype._error = function (err) {
-        var groups = this.groups;
-        if (groups) {
-            groups.forEach(function (group, key) {
-                group.error(err);
-            });
-            groups.clear();
-        }
-        this.destination.error(err);
-    };
-    GroupBySubscriber.prototype._complete = function () {
-        var groups = this.groups;
-        if (groups) {
-            groups.forEach(function (group, key) {
-                group.complete();
-            });
-            groups.clear();
-        }
-        this.destination.complete();
-    };
-    GroupBySubscriber.prototype.removeGroup = function (key) {
-        this.groups.delete(key);
-    };
-    GroupBySubscriber.prototype.unsubscribe = function () {
-        if (!this.closed) {
-            this.attemptedToUnsubscribe = true;
-            if (this.count === 0) {
-                _super.prototype.unsubscribe.call(this);
-            }
-        }
-    };
-    return GroupBySubscriber;
-}(Subscriber_1.Subscriber));
-var GroupDurationSubscriber = (function (_super) {
-    __extends(GroupDurationSubscriber, _super);
-    function GroupDurationSubscriber(key, group, parent) {
-        var _this = _super.call(this, group) || this;
-        _this.key = key;
-        _this.group = group;
-        _this.parent = parent;
-        return _this;
-    }
-    GroupDurationSubscriber.prototype._next = function (value) {
-        this.complete();
-    };
-    GroupDurationSubscriber.prototype._unsubscribe = function () {
-        var _a = this, parent = _a.parent, key = _a.key;
-        this.key = this.parent = null;
-        if (parent) {
-            parent.removeGroup(key);
-        }
-    };
-    return GroupDurationSubscriber;
-}(Subscriber_1.Subscriber));
-var GroupedObservable = (function (_super) {
-    __extends(GroupedObservable, _super);
-    function GroupedObservable(key, groupSubject, refCountSubscription) {
-        var _this = _super.call(this) || this;
-        _this.key = key;
-        _this.groupSubject = groupSubject;
-        _this.refCountSubscription = refCountSubscription;
-        return _this;
-    }
-    GroupedObservable.prototype._subscribe = function (subscriber) {
-        var subscription = new Subscription_1.Subscription();
-        var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject;
-        if (refCountSubscription && !refCountSubscription.closed) {
-            subscription.add(new InnerRefCountSubscription(refCountSubscription));
-        }
-        subscription.add(groupSubject.subscribe(subscriber));
-        return subscription;
-    };
-    return GroupedObservable;
-}(Observable_1.Observable));
-exports.GroupedObservable = GroupedObservable;
-var InnerRefCountSubscription = (function (_super) {
-    __extends(InnerRefCountSubscription, _super);
-    function InnerRefCountSubscription(parent) {
-        var _this = _super.call(this) || this;
-        _this.parent = parent;
-        parent.count++;
-        return _this;
-    }
-    InnerRefCountSubscription.prototype.unsubscribe = function () {
-        var parent = this.parent;
-        if (!parent.closed && !this.closed) {
-            _super.prototype.unsubscribe.call(this);
-            parent.count -= 1;
-            if (parent.count === 0 && parent.attemptedToUnsubscribe) {
-                parent.unsubscribe();
-            }
-        }
-    };
-    return InnerRefCountSubscription;
-}(Subscription_1.Subscription));
-//# sourceMappingURL=groupBy.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/groupBy.js.map b/node_modules/rxjs/internal/operators/groupBy.js.map
deleted file mode 100644
index 95f7fe2..0000000
--- a/node_modules/rxjs/internal/operators/groupBy.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"groupBy.js","sources":["../../src/internal/operators/groupBy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,4CAA2C;AAC3C,gDAA+C;AAC/C,4CAA2C;AAE3C,sCAAqC;AAoGrC,SAAgB,OAAO,CAAU,WAA4B,EAC5B,eAA0C,EAC1C,gBAAwE,EACxE,eAAkC;IACjE,OAAO,UAAC,MAAqB;QAC3B,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAAjG,CAAiG,CAAC;AACtG,CAAC;AAND,0BAMC;AASD;IACE,yBAAoB,WAA4B,EAC5B,eAA0C,EAC1C,gBAAwE,EACxE,eAAkC;QAHlC,gBAAW,GAAX,WAAW,CAAiB;QAC5B,oBAAe,GAAf,eAAe,CAA2B;QAC1C,qBAAgB,GAAhB,gBAAgB,CAAwD;QACxE,oBAAe,GAAf,eAAe,CAAmB;IACtD,CAAC;IAED,8BAAI,GAAJ,UAAK,UAA+C,EAAE,MAAW;QAC/D,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAC3C,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAChG,CAAC,CAAC;IACL,CAAC;IACH,sBAAC;AAAD,CAAC,AAZD,IAYC;AAOD;IAAyC,qCAAa;IAKpD,2BAAY,WAAgD,EACxC,WAA4B,EAC5B,eAA0C,EAC1C,gBAAwE,EACxE,eAAkC;QAJtD,YAKE,kBAAM,WAAW,CAAC,SACnB;QALmB,iBAAW,GAAX,WAAW,CAAiB;QAC5B,qBAAe,GAAf,eAAe,CAA2B;QAC1C,sBAAgB,GAAhB,gBAAgB,CAAwD;QACxE,qBAAe,GAAf,eAAe,CAAmB;QAR9C,YAAM,GAA2B,IAAI,CAAC;QACvC,4BAAsB,GAAY,KAAK,CAAC;QACxC,WAAK,GAAW,CAAC,CAAC;;IAQzB,CAAC;IAES,iCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,GAAM,CAAC;QACX,IAAI;YACF,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC/B;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO;SACR;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC;IAEO,kCAAM,GAAd,UAAe,KAAQ,EAAE,GAAM;QAC7B,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAEzB,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;SACrD;QAED,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE5B,IAAI,OAAU,CAAC;QACf,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI;gBACF,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;aACvC;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACjB;SACF;aAAM;YACL,OAAO,GAAQ,KAAK,CAAC;SACtB;QAED,IAAI,CAAC,KAAK,EAAE;YACV,KAAK,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,iBAAO,EAAK,CAAmB,CAAC;YAC7F,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,IAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAClE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBACzB,IAAI,QAAQ,SAAK,CAAC;gBAClB,IAAI;oBACF,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,iBAAiB,CAAO,GAAG,EAAc,KAAK,CAAC,CAAC,CAAC;iBACvF;gBAAC,OAAO,GAAG,EAAE;oBACZ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAChB,OAAO;iBACR;gBACD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,uBAAuB,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;aAC7E;SACF;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACjB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACrB;IACH,CAAC;IAES,kCAAM,GAAhB,UAAiB,GAAQ;QACvB,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,MAAM,EAAE;YACV,MAAM,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,GAAG;gBACxB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,EAAE,CAAC;SAChB;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAES,qCAAS,GAAnB;QACE,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,MAAM,EAAE;YACV,MAAM,CAAC,OAAO,CAAC,UAAC,KAAK,EAAE,GAAG;gBACxB,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,EAAE,CAAC;SAChB;QACD,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,uCAAW,GAAX,UAAY,GAAM;QAChB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,uCAAW,GAAX;QACE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;YACnC,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE;gBACpB,iBAAM,WAAW,WAAE,CAAC;aACrB;SACF;IACH,CAAC;IACH,wBAAC;AAAD,CAAC,AAvGD,CAAyC,uBAAU,GAuGlD;AAOD;IAA4C,2CAAa;IACvD,iCAAoB,GAAM,EACN,KAAiB,EACjB,MAA0C;QAF9D,YAGE,kBAAM,KAAK,CAAC,SACb;QAJmB,SAAG,GAAH,GAAG,CAAG;QACN,WAAK,GAAL,KAAK,CAAY;QACjB,YAAM,GAAN,MAAM,CAAoC;;IAE9D,CAAC;IAES,uCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAGD,8CAAY,GAAZ;QACQ,IAAA,SAAsB,EAApB,kBAAM,EAAE,YAAG,CAAU;QAC7B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAC9B,IAAI,MAAM,EAAE;YACV,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;SACzB;IACH,CAAC;IACH,8BAAC;AAAD,CAAC,AAnBD,CAA4C,uBAAU,GAmBrD;AAUD;IAA6C,qCAAa;IAExD,2BAAmB,GAAM,EACL,YAAwB,EACxB,oBAA2C;QAF/D,YAGE,iBAAO,SACR;QAJkB,SAAG,GAAH,GAAG,CAAG;QACL,kBAAY,GAAZ,YAAY,CAAY;QACxB,0BAAoB,GAApB,oBAAoB,CAAuB;;IAE/D,CAAC;IAGD,sCAAU,GAAV,UAAW,UAAyB;QAClC,IAAM,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;QAClC,IAAA,SAA6C,EAA3C,8CAAoB,EAAE,8BAAY,CAAU;QACpD,IAAI,oBAAoB,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE;YACxD,YAAY,CAAC,GAAG,CAAC,IAAI,yBAAyB,CAAC,oBAAoB,CAAC,CAAC,CAAC;SACvE;QACD,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QACrD,OAAO,YAAY,CAAC;IACtB,CAAC;IACH,wBAAC;AAAD,CAAC,AAlBD,CAA6C,uBAAU,GAkBtD;AAlBY,8CAAiB;AAyB9B;IAAwC,6CAAY;IAClD,mCAAoB,MAA4B;QAAhD,YACE,iBAAO,SAER;QAHmB,YAAM,GAAN,MAAM,CAAsB;QAE9C,MAAM,CAAC,KAAK,EAAE,CAAC;;IACjB,CAAC;IAED,+CAAW,GAAX;QACE,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAClC,iBAAM,WAAW,WAAE,CAAC;YACpB,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAClB,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,sBAAsB,EAAE;gBACvD,MAAM,CAAC,WAAW,EAAE,CAAC;aACtB;SACF;IACH,CAAC;IACH,gCAAC;AAAD,CAAC,AAhBD,CAAwC,2BAAY,GAgBnD"}
diff --git a/node_modules/rxjs/internal/operators/ignoreElements.d.ts b/node_modules/rxjs/internal/operators/ignoreElements.d.ts
deleted file mode 100644
index ba78b73..0000000
--- a/node_modules/rxjs/internal/operators/ignoreElements.d.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { OperatorFunction } from '../types';
-/**
- * Ignores all items emitted by the source Observable and only passes calls of `complete` or `error`.
- *
- * ![](ignoreElements.png)
- *
- * ## Examples
- * ### Ignores emitted values, reacts to observable's completion.
- * ```ts
- * import { of } from 'rxjs';
- * import { ignoreElements } from 'rxjs/operators';
- *
- * of('you', 'talking', 'to', 'me').pipe(
- *   ignoreElements(),
- * )
- * .subscribe(
- *   word => console.log(word),
- *   err => console.log('error:', err),
- *   () => console.log('the end'),
- * );
- * // result:
- * // 'the end'
- * ```
- * @return {Observable} An empty Observable that only calls `complete`
- * or `error`, based on which one is called by the source Observable.
- * @method ignoreElements
- * @owner Observable
- */
-export declare function ignoreElements(): OperatorFunction<any, never>;
diff --git a/node_modules/rxjs/internal/operators/ignoreElements.js b/node_modules/rxjs/internal/operators/ignoreElements.js
deleted file mode 100644
index ea43cd2..0000000
--- a/node_modules/rxjs/internal/operators/ignoreElements.js
+++ /dev/null
@@ -1,40 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function ignoreElements() {
-    return function ignoreElementsOperatorFunction(source) {
-        return source.lift(new IgnoreElementsOperator());
-    };
-}
-exports.ignoreElements = ignoreElements;
-var IgnoreElementsOperator = (function () {
-    function IgnoreElementsOperator() {
-    }
-    IgnoreElementsOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new IgnoreElementsSubscriber(subscriber));
-    };
-    return IgnoreElementsOperator;
-}());
-var IgnoreElementsSubscriber = (function (_super) {
-    __extends(IgnoreElementsSubscriber, _super);
-    function IgnoreElementsSubscriber() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    IgnoreElementsSubscriber.prototype._next = function (unused) {
-    };
-    return IgnoreElementsSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=ignoreElements.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/ignoreElements.js.map b/node_modules/rxjs/internal/operators/ignoreElements.js.map
deleted file mode 100644
index 94a3ed8..0000000
--- a/node_modules/rxjs/internal/operators/ignoreElements.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ignoreElements.js","sources":["../../src/internal/operators/ignoreElements.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AA8B3C,SAAgB,cAAc;IAC5B,OAAO,SAAS,8BAA8B,CAAC,MAAuB;QACpE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC;AAJD,wCAIC;AAED;IAAA;IAIA,CAAC;IAHC,qCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAAC;IACpE,CAAC;IACH,6BAAC;AAAD,CAAC,AAJD,IAIC;AAOD;IAA0C,4CAAa;IAAvD;;IAIA,CAAC;IAHW,wCAAK,GAAf,UAAgB,MAAS;IAEzB,CAAC;IACH,+BAAC;AAAD,CAAC,AAJD,CAA0C,uBAAU,GAInD"}
diff --git a/node_modules/rxjs/internal/operators/index.d.ts b/node_modules/rxjs/internal/operators/index.d.ts
deleted file mode 100644
index 7321559..0000000
--- a/node_modules/rxjs/internal/operators/index.d.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-export { audit } from './audit';
-export { auditTime } from './auditTime';
-export { buffer } from './buffer';
-export { bufferCount } from './bufferCount';
-export { bufferTime } from './bufferTime';
-export { bufferToggle } from './bufferToggle';
-export { bufferWhen } from './bufferWhen';
-export { catchError } from './catchError';
-export { combineAll } from './combineAll';
-export { combineLatest } from './combineLatest';
-export { concat } from './concat';
-export { concatAll } from './concatAll';
-export { concatMap } from './concatMap';
-export { concatMapTo } from './concatMapTo';
-export { count } from './count';
-export { debounce } from './debounce';
-export { debounceTime } from './debounceTime';
-export { defaultIfEmpty } from './defaultIfEmpty';
-export { delay } from './delay';
-export { delayWhen } from './delayWhen';
-export { dematerialize } from './dematerialize';
-export { distinct } from './distinct';
-export { distinctUntilChanged } from './distinctUntilChanged';
-export { distinctUntilKeyChanged } from './distinctUntilKeyChanged';
-export { elementAt } from './elementAt';
-export { every } from './every';
-export { exhaust } from './exhaust';
-export { exhaustMap } from './exhaustMap';
-export { expand } from './expand';
-export { filter } from './filter';
-export { finalize } from './finalize';
-export { find } from './find';
-export { findIndex } from './findIndex';
-export { first } from './first';
-export { groupBy } from './groupBy';
-export { ignoreElements } from './ignoreElements';
-export { isEmpty } from './isEmpty';
-export { last } from './last';
-export { map } from './map';
-export { mapTo } from './mapTo';
-export { materialize } from './materialize';
-export { max } from './max';
-export { merge } from './merge';
-export { mergeAll } from './mergeAll';
-export { mergeMap } from './mergeMap';
-export { mergeMap as flatMap } from './mergeMap';
-export { mergeMapTo } from './mergeMapTo';
-export { mergeScan } from './mergeScan';
-export { min } from './min';
-export { multicast } from './multicast';
-export { observeOn } from './observeOn';
-export { onErrorResumeNext } from './onErrorResumeNext';
-export { pairwise } from './pairwise';
-export { partition } from './partition';
-export { pluck } from './pluck';
-export { publish } from './publish';
-export { publishBehavior } from './publishBehavior';
-export { publishLast } from './publishLast';
-export { publishReplay } from './publishReplay';
-export { race } from './race';
-export { reduce } from './reduce';
-export { repeat } from './repeat';
-export { repeatWhen } from './repeatWhen';
-export { retry } from './retry';
-export { retryWhen } from './retryWhen';
-export { refCount } from './refCount';
-export { sample } from './sample';
-export { sampleTime } from './sampleTime';
-export { scan } from './scan';
-export { sequenceEqual } from './sequenceEqual';
-export { share } from './share';
-export { shareReplay } from './shareReplay';
-export { single } from './single';
-export { skip } from './skip';
-export { skipLast } from './skipLast';
-export { skipUntil } from './skipUntil';
-export { skipWhile } from './skipWhile';
-export { startWith } from './startWith';
-export { subscribeOn } from './subscribeOn';
-export { switchAll } from './switchAll';
-export { switchMap } from './switchMap';
-export { switchMapTo } from './switchMapTo';
-export { take } from './take';
-export { takeLast } from './takeLast';
-export { takeUntil } from './takeUntil';
-export { takeWhile } from './takeWhile';
-export { tap } from './tap';
-export { throttle } from './throttle';
-export { throttleTime } from './throttleTime';
-export { timeInterval } from './timeInterval';
-export { timeout } from './timeout';
-export { timeoutWith } from './timeoutWith';
-export { timestamp } from './timestamp';
-export { toArray } from './toArray';
-export { window } from './window';
-export { windowCount } from './windowCount';
-export { windowTime } from './windowTime';
-export { windowToggle } from './windowToggle';
-export { windowWhen } from './windowWhen';
-export { withLatestFrom } from './withLatestFrom';
-export { zip } from './zip';
-export { zipAll } from './zipAll';
diff --git a/node_modules/rxjs/internal/operators/index.js b/node_modules/rxjs/internal/operators/index.js
deleted file mode 100644
index b83f946..0000000
--- a/node_modules/rxjs/internal/operators/index.js
+++ /dev/null
@@ -1,207 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var audit_1 = require("./audit");
-exports.audit = audit_1.audit;
-var auditTime_1 = require("./auditTime");
-exports.auditTime = auditTime_1.auditTime;
-var buffer_1 = require("./buffer");
-exports.buffer = buffer_1.buffer;
-var bufferCount_1 = require("./bufferCount");
-exports.bufferCount = bufferCount_1.bufferCount;
-var bufferTime_1 = require("./bufferTime");
-exports.bufferTime = bufferTime_1.bufferTime;
-var bufferToggle_1 = require("./bufferToggle");
-exports.bufferToggle = bufferToggle_1.bufferToggle;
-var bufferWhen_1 = require("./bufferWhen");
-exports.bufferWhen = bufferWhen_1.bufferWhen;
-var catchError_1 = require("./catchError");
-exports.catchError = catchError_1.catchError;
-var combineAll_1 = require("./combineAll");
-exports.combineAll = combineAll_1.combineAll;
-var combineLatest_1 = require("./combineLatest");
-exports.combineLatest = combineLatest_1.combineLatest;
-var concat_1 = require("./concat");
-exports.concat = concat_1.concat;
-var concatAll_1 = require("./concatAll");
-exports.concatAll = concatAll_1.concatAll;
-var concatMap_1 = require("./concatMap");
-exports.concatMap = concatMap_1.concatMap;
-var concatMapTo_1 = require("./concatMapTo");
-exports.concatMapTo = concatMapTo_1.concatMapTo;
-var count_1 = require("./count");
-exports.count = count_1.count;
-var debounce_1 = require("./debounce");
-exports.debounce = debounce_1.debounce;
-var debounceTime_1 = require("./debounceTime");
-exports.debounceTime = debounceTime_1.debounceTime;
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-exports.defaultIfEmpty = defaultIfEmpty_1.defaultIfEmpty;
-var delay_1 = require("./delay");
-exports.delay = delay_1.delay;
-var delayWhen_1 = require("./delayWhen");
-exports.delayWhen = delayWhen_1.delayWhen;
-var dematerialize_1 = require("./dematerialize");
-exports.dematerialize = dematerialize_1.dematerialize;
-var distinct_1 = require("./distinct");
-exports.distinct = distinct_1.distinct;
-var distinctUntilChanged_1 = require("./distinctUntilChanged");
-exports.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged;
-var distinctUntilKeyChanged_1 = require("./distinctUntilKeyChanged");
-exports.distinctUntilKeyChanged = distinctUntilKeyChanged_1.distinctUntilKeyChanged;
-var elementAt_1 = require("./elementAt");
-exports.elementAt = elementAt_1.elementAt;
-var every_1 = require("./every");
-exports.every = every_1.every;
-var exhaust_1 = require("./exhaust");
-exports.exhaust = exhaust_1.exhaust;
-var exhaustMap_1 = require("./exhaustMap");
-exports.exhaustMap = exhaustMap_1.exhaustMap;
-var expand_1 = require("./expand");
-exports.expand = expand_1.expand;
-var filter_1 = require("./filter");
-exports.filter = filter_1.filter;
-var finalize_1 = require("./finalize");
-exports.finalize = finalize_1.finalize;
-var find_1 = require("./find");
-exports.find = find_1.find;
-var findIndex_1 = require("./findIndex");
-exports.findIndex = findIndex_1.findIndex;
-var first_1 = require("./first");
-exports.first = first_1.first;
-var groupBy_1 = require("./groupBy");
-exports.groupBy = groupBy_1.groupBy;
-var ignoreElements_1 = require("./ignoreElements");
-exports.ignoreElements = ignoreElements_1.ignoreElements;
-var isEmpty_1 = require("./isEmpty");
-exports.isEmpty = isEmpty_1.isEmpty;
-var last_1 = require("./last");
-exports.last = last_1.last;
-var map_1 = require("./map");
-exports.map = map_1.map;
-var mapTo_1 = require("./mapTo");
-exports.mapTo = mapTo_1.mapTo;
-var materialize_1 = require("./materialize");
-exports.materialize = materialize_1.materialize;
-var max_1 = require("./max");
-exports.max = max_1.max;
-var merge_1 = require("./merge");
-exports.merge = merge_1.merge;
-var mergeAll_1 = require("./mergeAll");
-exports.mergeAll = mergeAll_1.mergeAll;
-var mergeMap_1 = require("./mergeMap");
-exports.mergeMap = mergeMap_1.mergeMap;
-var mergeMap_2 = require("./mergeMap");
-exports.flatMap = mergeMap_2.mergeMap;
-var mergeMapTo_1 = require("./mergeMapTo");
-exports.mergeMapTo = mergeMapTo_1.mergeMapTo;
-var mergeScan_1 = require("./mergeScan");
-exports.mergeScan = mergeScan_1.mergeScan;
-var min_1 = require("./min");
-exports.min = min_1.min;
-var multicast_1 = require("./multicast");
-exports.multicast = multicast_1.multicast;
-var observeOn_1 = require("./observeOn");
-exports.observeOn = observeOn_1.observeOn;
-var onErrorResumeNext_1 = require("./onErrorResumeNext");
-exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
-var pairwise_1 = require("./pairwise");
-exports.pairwise = pairwise_1.pairwise;
-var partition_1 = require("./partition");
-exports.partition = partition_1.partition;
-var pluck_1 = require("./pluck");
-exports.pluck = pluck_1.pluck;
-var publish_1 = require("./publish");
-exports.publish = publish_1.publish;
-var publishBehavior_1 = require("./publishBehavior");
-exports.publishBehavior = publishBehavior_1.publishBehavior;
-var publishLast_1 = require("./publishLast");
-exports.publishLast = publishLast_1.publishLast;
-var publishReplay_1 = require("./publishReplay");
-exports.publishReplay = publishReplay_1.publishReplay;
-var race_1 = require("./race");
-exports.race = race_1.race;
-var reduce_1 = require("./reduce");
-exports.reduce = reduce_1.reduce;
-var repeat_1 = require("./repeat");
-exports.repeat = repeat_1.repeat;
-var repeatWhen_1 = require("./repeatWhen");
-exports.repeatWhen = repeatWhen_1.repeatWhen;
-var retry_1 = require("./retry");
-exports.retry = retry_1.retry;
-var retryWhen_1 = require("./retryWhen");
-exports.retryWhen = retryWhen_1.retryWhen;
-var refCount_1 = require("./refCount");
-exports.refCount = refCount_1.refCount;
-var sample_1 = require("./sample");
-exports.sample = sample_1.sample;
-var sampleTime_1 = require("./sampleTime");
-exports.sampleTime = sampleTime_1.sampleTime;
-var scan_1 = require("./scan");
-exports.scan = scan_1.scan;
-var sequenceEqual_1 = require("./sequenceEqual");
-exports.sequenceEqual = sequenceEqual_1.sequenceEqual;
-var share_1 = require("./share");
-exports.share = share_1.share;
-var shareReplay_1 = require("./shareReplay");
-exports.shareReplay = shareReplay_1.shareReplay;
-var single_1 = require("./single");
-exports.single = single_1.single;
-var skip_1 = require("./skip");
-exports.skip = skip_1.skip;
-var skipLast_1 = require("./skipLast");
-exports.skipLast = skipLast_1.skipLast;
-var skipUntil_1 = require("./skipUntil");
-exports.skipUntil = skipUntil_1.skipUntil;
-var skipWhile_1 = require("./skipWhile");
-exports.skipWhile = skipWhile_1.skipWhile;
-var startWith_1 = require("./startWith");
-exports.startWith = startWith_1.startWith;
-var subscribeOn_1 = require("./subscribeOn");
-exports.subscribeOn = subscribeOn_1.subscribeOn;
-var switchAll_1 = require("./switchAll");
-exports.switchAll = switchAll_1.switchAll;
-var switchMap_1 = require("./switchMap");
-exports.switchMap = switchMap_1.switchMap;
-var switchMapTo_1 = require("./switchMapTo");
-exports.switchMapTo = switchMapTo_1.switchMapTo;
-var take_1 = require("./take");
-exports.take = take_1.take;
-var takeLast_1 = require("./takeLast");
-exports.takeLast = takeLast_1.takeLast;
-var takeUntil_1 = require("./takeUntil");
-exports.takeUntil = takeUntil_1.takeUntil;
-var takeWhile_1 = require("./takeWhile");
-exports.takeWhile = takeWhile_1.takeWhile;
-var tap_1 = require("./tap");
-exports.tap = tap_1.tap;
-var throttle_1 = require("./throttle");
-exports.throttle = throttle_1.throttle;
-var throttleTime_1 = require("./throttleTime");
-exports.throttleTime = throttleTime_1.throttleTime;
-var timeInterval_1 = require("./timeInterval");
-exports.timeInterval = timeInterval_1.timeInterval;
-var timeout_1 = require("./timeout");
-exports.timeout = timeout_1.timeout;
-var timeoutWith_1 = require("./timeoutWith");
-exports.timeoutWith = timeoutWith_1.timeoutWith;
-var timestamp_1 = require("./timestamp");
-exports.timestamp = timestamp_1.timestamp;
-var toArray_1 = require("./toArray");
-exports.toArray = toArray_1.toArray;
-var window_1 = require("./window");
-exports.window = window_1.window;
-var windowCount_1 = require("./windowCount");
-exports.windowCount = windowCount_1.windowCount;
-var windowTime_1 = require("./windowTime");
-exports.windowTime = windowTime_1.windowTime;
-var windowToggle_1 = require("./windowToggle");
-exports.windowToggle = windowToggle_1.windowToggle;
-var windowWhen_1 = require("./windowWhen");
-exports.windowWhen = windowWhen_1.windowWhen;
-var withLatestFrom_1 = require("./withLatestFrom");
-exports.withLatestFrom = withLatestFrom_1.withLatestFrom;
-var zip_1 = require("./zip");
-exports.zip = zip_1.zip;
-var zipAll_1 = require("./zipAll");
-exports.zipAll = zipAll_1.zipAll;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/index.js.map b/node_modules/rxjs/internal/operators/index.js.map
deleted file mode 100644
index d2d604f..0000000
--- a/node_modules/rxjs/internal/operators/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../../src/internal/operators/index.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/isEmpty.d.ts b/node_modules/rxjs/internal/operators/isEmpty.d.ts
deleted file mode 100644
index 404d14c..0000000
--- a/node_modules/rxjs/internal/operators/isEmpty.d.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { OperatorFunction } from '../types';
-/**
- * Emits false if the input observable emits any values, or emits true if the
- * input observable completes without emitting any values.
- *
- * <span class="informal">Tells whether any values are emitted by an observable</span>
- *
- * ![](isEmpty.png)
- *
- * `isEmpty` transforms an Observable that emits values into an Observable that
- * emits a single boolean value representing whether or not any values were
- * emitted by the source Observable. As soon as the source Observable emits a
- * value, `isEmpty` will emit a `false` and complete.  If the source Observable
- * completes having not emitted anything, `isEmpty` will emit a `true` and
- * complete.
- *
- * A similar effect could be achieved with {@link count}, but `isEmpty` can emit
- * a `false` value sooner.
- *
- * ## Examples
- *
- * Emit `false` for a non-empty Observable
- * ```javascript
- * import { Subject } from 'rxjs';
- * import { isEmpty } from 'rxjs/operators';
- *
- * const source = new Subject<string>();
- * const result = source.pipe(isEmpty());
- * source.subscribe(x => console.log(x));
- * result.subscribe(x => console.log(x));
- * source.next('a');
- * source.next('b');
- * source.next('c');
- * source.complete();
- *
- * // Results in:
- * // a
- * // false
- * // b
- * // c
- * ```
- *
- * Emit `true` for an empty Observable
- * ```javascript
- * import { EMPTY } from 'rxjs';
- * import { isEmpty } from 'rxjs/operators';
- *
- * const result = EMPTY.pipe(isEmpty());
- * result.subscribe(x => console.log(x));
- * // Results in:
- * // true
- * ```
- *
- * @see {@link count}
- * @see {@link EMPTY}
- *
- * @return {OperatorFunction<T, boolean>} An Observable of a boolean value indicating whether observable was empty or not
- * @method isEmpty
- * @owner Observable
- */
-export declare function isEmpty<T>(): OperatorFunction<T, boolean>;
diff --git a/node_modules/rxjs/internal/operators/isEmpty.js b/node_modules/rxjs/internal/operators/isEmpty.js
deleted file mode 100644
index 8309141..0000000
--- a/node_modules/rxjs/internal/operators/isEmpty.js
+++ /dev/null
@@ -1,47 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function isEmpty() {
-    return function (source) { return source.lift(new IsEmptyOperator()); };
-}
-exports.isEmpty = isEmpty;
-var IsEmptyOperator = (function () {
-    function IsEmptyOperator() {
-    }
-    IsEmptyOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new IsEmptySubscriber(observer));
-    };
-    return IsEmptyOperator;
-}());
-var IsEmptySubscriber = (function (_super) {
-    __extends(IsEmptySubscriber, _super);
-    function IsEmptySubscriber(destination) {
-        return _super.call(this, destination) || this;
-    }
-    IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) {
-        var destination = this.destination;
-        destination.next(isEmpty);
-        destination.complete();
-    };
-    IsEmptySubscriber.prototype._next = function (value) {
-        this.notifyComplete(false);
-    };
-    IsEmptySubscriber.prototype._complete = function () {
-        this.notifyComplete(true);
-    };
-    return IsEmptySubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=isEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/isEmpty.js.map b/node_modules/rxjs/internal/operators/isEmpty.js.map
deleted file mode 100644
index e37d07f..0000000
--- a/node_modules/rxjs/internal/operators/isEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isEmpty.js","sources":["../../src/internal/operators/isEmpty.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AAgE3C,SAAgB,OAAO;IACrB,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,EAAE,CAAC,EAAlC,CAAkC,CAAC;AACvE,CAAC;AAFD,0BAEC;AAED;IAAA;IAIA,CAAC;IAHC,8BAAI,GAAJ,UAAM,QAA6B,EAAE,MAAW;QAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,CAAC;IACH,sBAAC;AAAD,CAAC,AAJD,IAIC;AAOD;IAAgC,qCAAe;IAC7C,2BAAY,WAAgC;eAC1C,kBAAM,WAAW,CAAC;IACpB,CAAC;IAEO,0CAAc,GAAtB,UAAuB,OAAgB;QACrC,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAErC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,WAAW,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAES,iCAAK,GAAf,UAAgB,KAAc;QAC5B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAES,qCAAS,GAAnB;QACE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACH,wBAAC;AAAD,CAAC,AAnBD,CAAgC,uBAAU,GAmBzC"}
diff --git a/node_modules/rxjs/internal/operators/last.d.ts b/node_modules/rxjs/internal/operators/last.d.ts
deleted file mode 100644
index b34069f..0000000
--- a/node_modules/rxjs/internal/operators/last.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../../internal/types';
-export declare function last<T, D = T>(predicate?: null, defaultValue?: D): OperatorFunction<T, T | D>;
-export declare function last<T, S extends T>(predicate: (value: T, index: number, source: Observable<T>) => value is S, defaultValue?: S): OperatorFunction<T, S>;
-export declare function last<T, D = T>(predicate: (value: T, index: number, source: Observable<T>) => boolean, defaultValue?: D): OperatorFunction<T, T | D>;
diff --git a/node_modules/rxjs/internal/operators/last.js b/node_modules/rxjs/internal/operators/last.js
deleted file mode 100644
index 19fc0a9..0000000
--- a/node_modules/rxjs/internal/operators/last.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var EmptyError_1 = require("../util/EmptyError");
-var filter_1 = require("./filter");
-var takeLast_1 = require("./takeLast");
-var throwIfEmpty_1 = require("./throwIfEmpty");
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-var identity_1 = require("../util/identity");
-function last(predicate, defaultValue) {
-    var hasDefaultValue = arguments.length >= 2;
-    return function (source) { return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, takeLast_1.takeLast(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); })); };
-}
-exports.last = last;
-//# sourceMappingURL=last.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/last.js.map b/node_modules/rxjs/internal/operators/last.js.map
deleted file mode 100644
index 966952b..0000000
--- a/node_modules/rxjs/internal/operators/last.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"last.js","sources":["../../src/internal/operators/last.ts"],"names":[],"mappings":";;AAGA,iDAAgD;AAEhD,mCAAkC;AAClC,uCAAsC;AACtC,+CAA8C;AAC9C,mDAAkD;AAClD,6CAA4C;AAkC5C,SAAgB,IAAI,CAClB,SAAgF,EAChF,YAAgB;IAEhB,IAAM,eAAe,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9C,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAC3C,SAAS,CAAC,CAAC,CAAC,eAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,EAAvB,CAAuB,CAAC,CAAC,CAAC,CAAC,mBAAQ,EAChE,mBAAQ,CAAC,CAAC,CAAC,EACX,eAAe,CAAC,CAAC,CAAC,+BAAc,CAAQ,YAAY,CAAC,CAAC,CAAC,CAAC,2BAAY,CAAC,cAAM,OAAA,IAAI,uBAAU,EAAE,EAAhB,CAAgB,CAAC,CAC7F,EAJiC,CAIjC,CAAC;AACJ,CAAC;AAVD,oBAUC"}
diff --git a/node_modules/rxjs/internal/operators/map.d.ts b/node_modules/rxjs/internal/operators/map.d.ts
deleted file mode 100644
index 6a4e0ab..0000000
--- a/node_modules/rxjs/internal/operators/map.d.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { OperatorFunction } from '../types';
-/**
- * Applies a given `project` function to each value emitted by the source
- * Observable, and emits the resulting values as an Observable.
- *
- * <span class="informal">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),
- * it passes each source value through a transformation function to get
- * corresponding output values.</span>
- *
- * ![](map.png)
- *
- * Similar to the well known `Array.prototype.map` function, this operator
- * applies a projection to each value and emits that projection in the output
- * Observable.
- *
- * ## Example
- * Map every click to the clientX position of that click
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { map } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const positions = clicks.pipe(map(ev => ev.clientX));
- * positions.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link mapTo}
- * @see {@link pluck}
- *
- * @param {function(value: T, index: number): R} project The function to apply
- * to each `value` emitted by the source Observable. The `index` parameter is
- * the number `i` for the i-th emission that has happened since the
- * subscription, starting from the number `0`.
- * @param {any} [thisArg] An optional argument to define what `this` is in the
- * `project` function.
- * @return {Observable<R>} An Observable that emits the values from the source
- * Observable transformed by the given `project` function.
- * @method map
- * @owner Observable
- */
-export declare function map<T, R>(project: (value: T, index: number) => R, thisArg?: any): OperatorFunction<T, R>;
-export declare class MapOperator<T, R> implements Operator<T, R> {
-    private project;
-    private thisArg;
-    constructor(project: (value: T, index: number) => R, thisArg: any);
-    call(subscriber: Subscriber<R>, source: any): any;
-}
diff --git a/node_modules/rxjs/internal/operators/map.js b/node_modules/rxjs/internal/operators/map.js
deleted file mode 100644
index 29bb166..0000000
--- a/node_modules/rxjs/internal/operators/map.js
+++ /dev/null
@@ -1,59 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function map(project, thisArg) {
-    return function mapOperation(source) {
-        if (typeof project !== 'function') {
-            throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
-        }
-        return source.lift(new MapOperator(project, thisArg));
-    };
-}
-exports.map = map;
-var MapOperator = (function () {
-    function MapOperator(project, thisArg) {
-        this.project = project;
-        this.thisArg = thisArg;
-    }
-    MapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
-    };
-    return MapOperator;
-}());
-exports.MapOperator = MapOperator;
-var MapSubscriber = (function (_super) {
-    __extends(MapSubscriber, _super);
-    function MapSubscriber(destination, project, thisArg) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.count = 0;
-        _this.thisArg = thisArg || _this;
-        return _this;
-    }
-    MapSubscriber.prototype._next = function (value) {
-        var result;
-        try {
-            result = this.project.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return MapSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=map.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/map.js.map b/node_modules/rxjs/internal/operators/map.js.map
deleted file mode 100644
index e8e5dde..0000000
--- a/node_modules/rxjs/internal/operators/map.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"map.js","sources":["../../src/internal/operators/map.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AA2C3C,SAAgB,GAAG,CAAO,OAAuC,EAAE,OAAa;IAC9E,OAAO,SAAS,YAAY,CAAC,MAAqB;QAChD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;YACjC,MAAM,IAAI,SAAS,CAAC,4DAA4D,CAAC,CAAC;SACnF;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC;AACJ,CAAC;AAPD,kBAOC;AAED;IACE,qBAAoB,OAAuC,EAAU,OAAY;QAA7D,YAAO,GAAP,OAAO,CAAgC;QAAU,YAAO,GAAP,OAAO,CAAK;IACjF,CAAC;IAED,0BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrF,CAAC;IACH,kBAAC;AAAD,CAAC,AAPD,IAOC;AAPY,kCAAW;AAcxB;IAAkC,iCAAa;IAI7C,uBAAY,WAA0B,EAClB,OAAuC,EAC/C,OAAY;QAFxB,YAGE,kBAAM,WAAW,CAAC,SAEnB;QAJmB,aAAO,GAAP,OAAO,CAAgC;QAJ3D,WAAK,GAAW,CAAC,CAAC;QAOhB,KAAI,CAAC,OAAO,GAAG,OAAO,IAAI,KAAI,CAAC;;IACjC,CAAC;IAIS,6BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,MAAS,CAAC;QACd,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SAC/D;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;SACR;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACH,oBAAC;AAAD,CAAC,AAvBD,CAAkC,uBAAU,GAuB3C"}
diff --git a/node_modules/rxjs/internal/operators/mapTo.d.ts b/node_modules/rxjs/internal/operators/mapTo.d.ts
deleted file mode 100644
index f4cf9f6..0000000
--- a/node_modules/rxjs/internal/operators/mapTo.d.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { OperatorFunction } from '../types';
-/**
- * Emits the given constant value on the output Observable every time the source
- * Observable emits a value.
- *
- * <span class="informal">Like {@link map}, but it maps every source value to
- * the same output value every time.</span>
- *
- * ![](mapTo.png)
- *
- * Takes a constant `value` as argument, and emits that whenever the source
- * Observable emits a value. In other words, ignores the actual source value,
- * and simply uses the emission moment to know when to emit the given `value`.
- *
- * ## Example
- * Map every click to the string 'Hi'
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { mapTo } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const greetings = clicks.pipe(mapTo('Hi'));
- * greetings.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link map}
- *
- * @param {any} value The value to map each source value to.
- * @return {Observable} An Observable that emits the given `value` every time
- * the source Observable emits something.
- * @method mapTo
- * @owner Observable
- */
-export declare function mapTo<T, R>(value: R): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/mapTo.js b/node_modules/rxjs/internal/operators/mapTo.js
deleted file mode 100644
index 1433a34..0000000
--- a/node_modules/rxjs/internal/operators/mapTo.js
+++ /dev/null
@@ -1,42 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function mapTo(value) {
-    return function (source) { return source.lift(new MapToOperator(value)); };
-}
-exports.mapTo = mapTo;
-var MapToOperator = (function () {
-    function MapToOperator(value) {
-        this.value = value;
-    }
-    MapToOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MapToSubscriber(subscriber, this.value));
-    };
-    return MapToOperator;
-}());
-var MapToSubscriber = (function (_super) {
-    __extends(MapToSubscriber, _super);
-    function MapToSubscriber(destination, value) {
-        var _this = _super.call(this, destination) || this;
-        _this.value = value;
-        return _this;
-    }
-    MapToSubscriber.prototype._next = function (x) {
-        this.destination.next(this.value);
-    };
-    return MapToSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=mapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/mapTo.js.map b/node_modules/rxjs/internal/operators/mapTo.js.map
deleted file mode 100644
index 803ca32..0000000
--- a/node_modules/rxjs/internal/operators/mapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mapTo.js","sources":["../../src/internal/operators/mapTo.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AAoC3C,SAAgB,KAAK,CAAO,KAAQ;IAClC,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,EAArC,CAAqC,CAAC;AAC1E,CAAC;AAFD,sBAEC;AAED;IAIE,uBAAY,KAAQ;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,4BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IACH,oBAAC;AAAD,CAAC,AAXD,IAWC;AAOD;IAAoC,mCAAa;IAI/C,yBAAY,WAA0B,EAAE,KAAQ;QAAhD,YACE,kBAAM,WAAW,CAAC,SAEnB;QADC,KAAI,CAAC,KAAK,GAAG,KAAK,CAAC;;IACrB,CAAC;IAES,+BAAK,GAAf,UAAgB,CAAI;QAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IACH,sBAAC;AAAD,CAAC,AAZD,CAAoC,uBAAU,GAY7C"}
diff --git a/node_modules/rxjs/internal/operators/materialize.d.ts b/node_modules/rxjs/internal/operators/materialize.d.ts
deleted file mode 100644
index 82b9e5a..0000000
--- a/node_modules/rxjs/internal/operators/materialize.d.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { Notification } from '../Notification';
-import { OperatorFunction } from '../types';
-/**
- * Represents all of the notifications from the source Observable as `next`
- * emissions marked with their original types within {@link Notification}
- * objects.
- *
- * <span class="informal">Wraps `next`, `error` and `complete` emissions in
- * {@link Notification} objects, emitted as `next` on the output Observable.
- * </span>
- *
- * ![](materialize.png)
- *
- * `materialize` returns an Observable that emits a `next` notification for each
- * `next`, `error`, or `complete` emission of the source Observable. When the
- * source Observable emits `complete`, the output Observable will emit `next` as
- * a Notification of type "complete", and then it will emit `complete` as well.
- * When the source Observable emits `error`, the output will emit `next` as a
- * Notification of type "error", and then `complete`.
- *
- * This operator is useful for producing metadata of the source Observable, to
- * be consumed as `next` emissions. Use it in conjunction with
- * {@link dematerialize}.
- *
- * ## Example
- * Convert a faulty Observable to an Observable of Notifications
- * ```ts
- * import { of } from 'rxjs';
- * import { materialize, map } from 'rxjs/operators';
- *
- * const letters = of('a', 'b', 13, 'd');
- * const upperCase = letters.pipe(map(x => x.toUpperCase()));
- * const materialized = upperCase.pipe(materialize());
- * materialized.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // - Notification {kind: "N", value: "A", error: undefined, hasValue: true}
- * // - Notification {kind: "N", value: "B", error: undefined, hasValue: true}
- * // - Notification {kind: "E", value: undefined, error: TypeError:
- * //   x.toUpperCase is not a function at MapSubscriber.letters.map.x
- * //   [as project] (http://1…, hasValue: false}
- * ```
- *
- * @see {@link Notification}
- * @see {@link dematerialize}
- *
- * @return {Observable<Notification<T>>} An Observable that emits
- * {@link Notification} objects that wrap the original emissions from the source
- * Observable with metadata.
- * @method materialize
- * @owner Observable
- */
-export declare function materialize<T>(): OperatorFunction<T, Notification<T>>;
diff --git a/node_modules/rxjs/internal/operators/materialize.js b/node_modules/rxjs/internal/operators/materialize.js
deleted file mode 100644
index 61aeb68..0000000
--- a/node_modules/rxjs/internal/operators/materialize.js
+++ /dev/null
@@ -1,52 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Notification_1 = require("../Notification");
-function materialize() {
-    return function materializeOperatorFunction(source) {
-        return source.lift(new MaterializeOperator());
-    };
-}
-exports.materialize = materialize;
-var MaterializeOperator = (function () {
-    function MaterializeOperator() {
-    }
-    MaterializeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MaterializeSubscriber(subscriber));
-    };
-    return MaterializeOperator;
-}());
-var MaterializeSubscriber = (function (_super) {
-    __extends(MaterializeSubscriber, _super);
-    function MaterializeSubscriber(destination) {
-        return _super.call(this, destination) || this;
-    }
-    MaterializeSubscriber.prototype._next = function (value) {
-        this.destination.next(Notification_1.Notification.createNext(value));
-    };
-    MaterializeSubscriber.prototype._error = function (err) {
-        var destination = this.destination;
-        destination.next(Notification_1.Notification.createError(err));
-        destination.complete();
-    };
-    MaterializeSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        destination.next(Notification_1.Notification.createComplete());
-        destination.complete();
-    };
-    return MaterializeSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=materialize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/materialize.js.map b/node_modules/rxjs/internal/operators/materialize.js.map
deleted file mode 100644
index 5e4171d..0000000
--- a/node_modules/rxjs/internal/operators/materialize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"materialize.js","sources":["../../src/internal/operators/materialize.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AAC3C,gDAA+C;AAqD/C,SAAgB,WAAW;IACzB,OAAO,SAAS,2BAA2B,CAAC,MAAqB;QAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC;AACJ,CAAC;AAJD,kCAIC;AAED;IAAA;IAIA,CAAC;IAHC,kCAAI,GAAJ,UAAK,UAAuC,EAAE,MAAW;QACvD,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC;IACH,0BAAC;AAAD,CAAC,AAJD,IAIC;AAOD;IAAuC,yCAAa;IAClD,+BAAY,WAAwC;eAClD,kBAAM,WAAW,CAAC;IACpB,CAAC;IAES,qCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,2BAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAES,sCAAM,GAAhB,UAAiB,GAAQ;QACvB,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,WAAW,CAAC,IAAI,CAAC,2BAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,WAAW,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAES,yCAAS,GAAnB;QACE,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,WAAW,CAAC,IAAI,CAAC,2BAAY,CAAC,cAAc,EAAE,CAAC,CAAC;QAChD,WAAW,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IACH,4BAAC;AAAD,CAAC,AApBD,CAAuC,uBAAU,GAoBhD"}
diff --git a/node_modules/rxjs/internal/operators/max.d.ts b/node_modules/rxjs/internal/operators/max.d.ts
deleted file mode 100644
index 460413d..0000000
--- a/node_modules/rxjs/internal/operators/max.d.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * The Max operator operates on an Observable that emits numbers (or items that can be compared with a provided function),
- * and when source Observable completes it emits a single item: the item with the largest value.
- *
- * ![](max.png)
- *
- * ## Examples
- * Get the maximal value of a series of numbers
- * ```ts
- * import { of } from 'rxjs';
- * import { max } from 'rxjs/operators';
- *
- * of(5, 4, 7, 2, 8).pipe(
- *   max(),
- * )
- * .subscribe(x => console.log(x)); // -> 8
- * ```
- *
- * Use a comparer function to get the maximal item
- * ```typescript
- * import { of } from 'rxjs';
- * import { max } from 'rxjs/operators';
- *
- * interface Person {
- *   age: number,
- *   name: string
- * }
- * of<Person>(
- *   {age: 7, name: 'Foo'},
- *   {age: 5, name: 'Bar'},
- *   {age: 9, name: 'Beer'},
- * ).pipe(
- *   max<Person>((a: Person, b: Person) => a.age < b.age ? -1 : 1),
- * )
- * .subscribe((x: Person) => console.log(x.name)); // -> 'Beer'
- * ```
- *
- * @see {@link min}
- *
- * @param {Function} [comparer] - Optional comparer function that it will use instead of its default to compare the
- * value of two items.
- * @return {Observable} An Observable that emits item with the largest value.
- * @method max
- * @owner Observable
- */
-export declare function max<T>(comparer?: (x: T, y: T) => number): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/max.js b/node_modules/rxjs/internal/operators/max.js
deleted file mode 100644
index a91824d..0000000
--- a/node_modules/rxjs/internal/operators/max.js
+++ /dev/null
@@ -1,11 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var reduce_1 = require("./reduce");
-function max(comparer) {
-    var max = (typeof comparer === 'function')
-        ? function (x, y) { return comparer(x, y) > 0 ? x : y; }
-        : function (x, y) { return x > y ? x : y; };
-    return reduce_1.reduce(max);
-}
-exports.max = max;
-//# sourceMappingURL=max.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/max.js.map b/node_modules/rxjs/internal/operators/max.js.map
deleted file mode 100644
index 44da4c9..0000000
--- a/node_modules/rxjs/internal/operators/max.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"max.js","sources":["../../src/internal/operators/max.ts"],"names":[],"mappings":";;AAAA,mCAAkC;AAgDlC,SAAgB,GAAG,CAAI,QAAiC;IACtD,IAAM,GAAG,GAAsB,CAAC,OAAO,QAAQ,KAAK,UAAU,CAAC;QAC7D,CAAC,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAA1B,CAA0B;QACtC,CAAC,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAb,CAAa,CAAC;IAE5B,OAAO,eAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAND,kBAMC"}
diff --git a/node_modules/rxjs/internal/operators/merge.d.ts b/node_modules/rxjs/internal/operators/merge.d.ts
deleted file mode 100644
index eff80b8..0000000
--- a/node_modules/rxjs/internal/operators/merge.d.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { ObservableInput, OperatorFunction, MonoTypeOperatorFunction, SchedulerLike } from '../types';
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T>(scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T>(concurrent?: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T, T2>(v2: ObservableInput<T2>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T, T2>(v2: ObservableInput<T2>, concurrent?: number, scheduler?: SchedulerLike): OperatorFunction<T, T | T2>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T, T2, T3>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T, T2, T3>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, concurrent?: number, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T, T2, T3, T4>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T, T2, T3, T4>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, concurrent?: number, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T, T2, T3, T4, T5>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4 | T5>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T, T2, T3, T4, T5>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, concurrent?: number, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4 | T5>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T, T2, T3, T4, T5, T6>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4 | T5 | T6>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T, T2, T3, T4, T5, T6>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, concurrent?: number, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4 | T5 | T6>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T>(...observables: Array<ObservableInput<T> | SchedulerLike | number>): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static merge. */
-export declare function merge<T, R>(...observables: Array<ObservableInput<any> | SchedulerLike | number>): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/merge.js b/node_modules/rxjs/internal/operators/merge.js
deleted file mode 100644
index 29cabb3..0000000
--- a/node_modules/rxjs/internal/operators/merge.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var merge_1 = require("../observable/merge");
-function merge() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function (source) { return source.lift.call(merge_1.merge.apply(void 0, [source].concat(observables))); };
-}
-exports.merge = merge;
-//# sourceMappingURL=merge.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/merge.js.map b/node_modules/rxjs/internal/operators/merge.js.map
deleted file mode 100644
index a93c984..0000000
--- a/node_modules/rxjs/internal/operators/merge.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"merge.js","sources":["../../src/internal/operators/merge.ts"],"names":[],"mappings":";;AAAA,6CAA2D;AAsC3D,SAAgB,KAAK;IAAO,qBAAoE;SAApE,UAAoE,EAApE,qBAAoE,EAApE,IAAoE;QAApE,gCAAoE;;IAC9F,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAW,gBAAC,MAAM,SAAK,WAAW,GAAE,EAArD,CAAqD,CAAC;AAC1F,CAAC;AAFD,sBAEC"}
diff --git a/node_modules/rxjs/internal/operators/mergeAll.d.ts b/node_modules/rxjs/internal/operators/mergeAll.d.ts
deleted file mode 100644
index 0d2a8f3..0000000
--- a/node_modules/rxjs/internal/operators/mergeAll.d.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { OperatorFunction, ObservableInput } from '../types';
-/**
- * Converts a higher-order Observable into a first-order Observable which
- * concurrently delivers all values that are emitted on the inner Observables.
- *
- * <span class="informal">Flattens an Observable-of-Observables.</span>
- *
- * ![](mergeAll.png)
- *
- * `mergeAll` subscribes to an Observable that emits Observables, also known as
- * a higher-order Observable. Each time it observes one of these emitted inner
- * Observables, it subscribes to that and delivers all the values from the
- * inner Observable on the output Observable. The output Observable only
- * completes once all inner Observables have completed. Any error delivered by
- * a inner Observable will be immediately emitted on the output Observable.
- *
- * ## Examples
- * Spawn a new interval Observable for each click event, and blend their outputs as one Observable
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { map, mergeAll } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const higherOrder = clicks.pipe(map((ev) => interval(1000)));
- * const firstOrder = higherOrder.pipe(mergeAll());
- * firstOrder.subscribe(x => console.log(x));
- * ```
- *
- * Count from 0 to 9 every second for each click, but only allow 2 concurrent timers
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { take, map, mergeAll } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const higherOrder = clicks.pipe(
- *   map((ev) => interval(1000).pipe(take(10))),
- * );
- * const firstOrder = higherOrder.pipe(mergeAll(2));
- * firstOrder.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link combineAll}
- * @see {@link concatAll}
- * @see {@link exhaust}
- * @see {@link merge}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- * @see {@link switchAll}
- * @see {@link switchMap}
- * @see {@link zipAll}
- *
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner
- * Observables being subscribed to concurrently.
- * @return {Observable} An Observable that emits values coming from all the
- * inner Observables emitted by the source Observable.
- * @method mergeAll
- * @owner Observable
- */
-export declare function mergeAll<T>(concurrent?: number): OperatorFunction<ObservableInput<T>, T>;
diff --git a/node_modules/rxjs/internal/operators/mergeAll.js b/node_modules/rxjs/internal/operators/mergeAll.js
deleted file mode 100644
index 4c732d2..0000000
--- a/node_modules/rxjs/internal/operators/mergeAll.js
+++ /dev/null
@@ -1,10 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var mergeMap_1 = require("./mergeMap");
-var identity_1 = require("../util/identity");
-function mergeAll(concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    return mergeMap_1.mergeMap(identity_1.identity, concurrent);
-}
-exports.mergeAll = mergeAll;
-//# sourceMappingURL=mergeAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/mergeAll.js.map b/node_modules/rxjs/internal/operators/mergeAll.js.map
deleted file mode 100644
index 726ab22..0000000
--- a/node_modules/rxjs/internal/operators/mergeAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeAll.js","sources":["../../src/internal/operators/mergeAll.ts"],"names":[],"mappings":";;AACA,uCAAsC;AACtC,6CAA4C;AA6D5C,SAAgB,QAAQ,CAAI,UAA6C;IAA7C,2BAAA,EAAA,aAAqB,MAAM,CAAC,iBAAiB;IACvE,OAAO,mBAAQ,CAAC,mBAAQ,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC;AAFD,4BAEC"}
diff --git a/node_modules/rxjs/internal/operators/mergeMap.d.ts b/node_modules/rxjs/internal/operators/mergeMap.d.ts
deleted file mode 100644
index f2fb80d..0000000
--- a/node_modules/rxjs/internal/operators/mergeMap.d.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-export declare function mergeMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O, concurrent?: number): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector no longer supported, use inner map instead */
-export declare function mergeMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: undefined, concurrent?: number): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector no longer supported, use inner map instead */
-export declare function mergeMap<T, R, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R, concurrent?: number): OperatorFunction<T, R>;
-export declare class MergeMapOperator<T, R> implements Operator<T, R> {
-    private project;
-    private concurrent;
-    constructor(project: (value: T, index: number) => ObservableInput<R>, concurrent?: number);
-    call(observer: Subscriber<R>, source: any): any;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class MergeMapSubscriber<T, R> extends OuterSubscriber<T, R> {
-    private project;
-    private concurrent;
-    private hasCompleted;
-    private buffer;
-    private active;
-    protected index: number;
-    constructor(destination: Subscriber<R>, project: (value: T, index: number) => ObservableInput<R>, concurrent?: number);
-    protected _next(value: T): void;
-    protected _tryNext(value: T): void;
-    private _innerSub;
-    protected _complete(): void;
-    notifyNext(outerValue: T, innerValue: R, outerIndex: number, innerIndex: number, innerSub: InnerSubscriber<T, R>): void;
-    notifyComplete(innerSub: Subscription): void;
-}
diff --git a/node_modules/rxjs/internal/operators/mergeMap.js b/node_modules/rxjs/internal/operators/mergeMap.js
deleted file mode 100644
index 4e2c6aa..0000000
--- a/node_modules/rxjs/internal/operators/mergeMap.js
+++ /dev/null
@@ -1,111 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var map_1 = require("./map");
-var from_1 = require("../observable/from");
-function mergeMap(project, resultSelector, concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (typeof resultSelector === 'function') {
-        return function (source) { return source.pipe(mergeMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); };
-    }
-    else if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-    }
-    return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); };
-}
-exports.mergeMap = mergeMap;
-var MergeMapOperator = (function () {
-    function MergeMapOperator(project, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        this.project = project;
-        this.concurrent = concurrent;
-    }
-    MergeMapOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));
-    };
-    return MergeMapOperator;
-}());
-exports.MergeMapOperator = MergeMapOperator;
-var MergeMapSubscriber = (function (_super) {
-    __extends(MergeMapSubscriber, _super);
-    function MergeMapSubscriber(destination, project, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.concurrent = concurrent;
-        _this.hasCompleted = false;
-        _this.buffer = [];
-        _this.active = 0;
-        _this.index = 0;
-        return _this;
-    }
-    MergeMapSubscriber.prototype._next = function (value) {
-        if (this.active < this.concurrent) {
-            this._tryNext(value);
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    MergeMapSubscriber.prototype._tryNext = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.active++;
-        this._innerSub(result, value, index);
-    };
-    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        var innerSubscription = subscribeToResult_1.subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            destination.add(innerSubscription);
-        }
-    };
-    MergeMapSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        this.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return MergeMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.MergeMapSubscriber = MergeMapSubscriber;
-//# sourceMappingURL=mergeMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/mergeMap.js.map b/node_modules/rxjs/internal/operators/mergeMap.js.map
deleted file mode 100644
index fb90613..0000000
--- a/node_modules/rxjs/internal/operators/mergeMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeMap.js","sources":["../../src/internal/operators/mergeMap.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/mergeMapTo.d.ts b/node_modules/rxjs/internal/operators/mergeMapTo.d.ts
deleted file mode 100644
index cd1d5a1..0000000
--- a/node_modules/rxjs/internal/operators/mergeMapTo.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { OperatorFunction, ObservedValueOf } from '../../internal/types';
-import { ObservableInput } from '../types';
-export declare function mergeMapTo<T, O extends ObservableInput<any>>(innerObservable: O, concurrent?: number): OperatorFunction<any, ObservedValueOf<O>>;
-/** @deprecated */
-export declare function mergeMapTo<T, R, O extends ObservableInput<any>>(innerObservable: O, resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R, concurrent?: number): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/mergeMapTo.js b/node_modules/rxjs/internal/operators/mergeMapTo.js
deleted file mode 100644
index c3522a2..0000000
--- a/node_modules/rxjs/internal/operators/mergeMapTo.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var mergeMap_1 = require("./mergeMap");
-function mergeMapTo(innerObservable, resultSelector, concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (typeof resultSelector === 'function') {
-        return mergeMap_1.mergeMap(function () { return innerObservable; }, resultSelector, concurrent);
-    }
-    if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-    }
-    return mergeMap_1.mergeMap(function () { return innerObservable; }, concurrent);
-}
-exports.mergeMapTo = mergeMapTo;
-//# sourceMappingURL=mergeMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/mergeMapTo.js.map b/node_modules/rxjs/internal/operators/mergeMapTo.js.map
deleted file mode 100644
index bb4a5ab..0000000
--- a/node_modules/rxjs/internal/operators/mergeMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeMapTo.js","sources":["../../src/internal/operators/mergeMapTo.ts"],"names":[],"mappings":";;AAEA,uCAAsC;AAiDtC,SAAgB,UAAU,CACxB,eAAkB,EAClB,cAAwH,EACxH,UAA6C;IAA7C,2BAAA,EAAA,aAAqB,MAAM,CAAC,iBAAiB;IAE7C,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE;QACxC,OAAO,mBAAQ,CAAC,cAAM,OAAA,eAAe,EAAf,CAAe,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;KACpE;IACD,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;QACtC,UAAU,GAAG,cAAc,CAAC;KAC7B;IACD,OAAO,mBAAQ,CAAC,cAAM,OAAA,eAAe,EAAf,CAAe,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC;AAZD,gCAYC"}
diff --git a/node_modules/rxjs/internal/operators/mergeScan.d.ts b/node_modules/rxjs/internal/operators/mergeScan.d.ts
deleted file mode 100644
index eeabf3b..0000000
--- a/node_modules/rxjs/internal/operators/mergeScan.d.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { ObservableInput, OperatorFunction } from '../types';
-/**
- * Applies an accumulator function over the source Observable where the
- * accumulator function itself returns an Observable, then each intermediate
- * Observable returned is merged into the output Observable.
- *
- * <span class="informal">It's like {@link scan}, but the Observables returned
- * by the accumulator are merged into the outer Observable.</span>
- *
- * ## Example
- * Count the number of click events
- * ```ts
- * import { fromEvent, of } from 'rxjs';
- * import { mapTo, mergeScan } from 'rxjs/operators';
- *
- * const click$ = fromEvent(document, 'click');
- * const one$ = click$.pipe(mapTo(1));
- * const seed = 0;
- * const count$ = one$.pipe(
- *   mergeScan((acc, one) => of(acc + one), seed),
- * );
- * count$.subscribe(x => console.log(x));
- *
- * // Results:
- * // 1
- * // 2
- * // 3
- * // 4
- * // ...and so on for each click
- * ```
- *
- * @param {function(acc: R, value: T): Observable<R>} accumulator
- * The accumulator function called on each source value.
- * @param seed The initial accumulation value.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of
- * input Observables being subscribed to concurrently.
- * @return {Observable<R>} An observable of the accumulated values.
- * @method mergeScan
- * @owner Observable
- */
-export declare function mergeScan<T, R>(accumulator: (acc: R, value: T, index: number) => ObservableInput<R>, seed: R, concurrent?: number): OperatorFunction<T, R>;
-export declare class MergeScanOperator<T, R> implements Operator<T, R> {
-    private accumulator;
-    private seed;
-    private concurrent;
-    constructor(accumulator: (acc: R, value: T, index: number) => ObservableInput<R>, seed: R, concurrent: number);
-    call(subscriber: Subscriber<R>, source: any): any;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class MergeScanSubscriber<T, R> extends OuterSubscriber<T, R> {
-    private accumulator;
-    private acc;
-    private concurrent;
-    private hasValue;
-    private hasCompleted;
-    private buffer;
-    private active;
-    protected index: number;
-    constructor(destination: Subscriber<R>, accumulator: (acc: R, value: T, index: number) => ObservableInput<R>, acc: R, concurrent: number);
-    protected _next(value: any): void;
-    private _innerSub;
-    protected _complete(): void;
-    notifyNext(outerValue: T, innerValue: R, outerIndex: number, innerIndex: number, innerSub: InnerSubscriber<T, R>): void;
-    notifyComplete(innerSub: Subscription): void;
-}
diff --git a/node_modules/rxjs/internal/operators/mergeScan.js b/node_modules/rxjs/internal/operators/mergeScan.js
deleted file mode 100644
index 523eb4a..0000000
--- a/node_modules/rxjs/internal/operators/mergeScan.js
+++ /dev/null
@@ -1,112 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-function mergeScan(accumulator, seed, concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); };
-}
-exports.mergeScan = mergeScan;
-var MergeScanOperator = (function () {
-    function MergeScanOperator(accumulator, seed, concurrent) {
-        this.accumulator = accumulator;
-        this.seed = seed;
-        this.concurrent = concurrent;
-    }
-    MergeScanOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));
-    };
-    return MergeScanOperator;
-}());
-exports.MergeScanOperator = MergeScanOperator;
-var MergeScanSubscriber = (function (_super) {
-    __extends(MergeScanSubscriber, _super);
-    function MergeScanSubscriber(destination, accumulator, acc, concurrent) {
-        var _this = _super.call(this, destination) || this;
-        _this.accumulator = accumulator;
-        _this.acc = acc;
-        _this.concurrent = concurrent;
-        _this.hasValue = false;
-        _this.hasCompleted = false;
-        _this.buffer = [];
-        _this.active = 0;
-        _this.index = 0;
-        return _this;
-    }
-    MergeScanSubscriber.prototype._next = function (value) {
-        if (this.active < this.concurrent) {
-            var index = this.index++;
-            var destination = this.destination;
-            var ish = void 0;
-            try {
-                var accumulator = this.accumulator;
-                ish = accumulator(this.acc, value, index);
-            }
-            catch (e) {
-                return destination.error(e);
-            }
-            this.active++;
-            this._innerSub(ish, value, index);
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    MergeScanSubscriber.prototype._innerSub = function (ish, value, index) {
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        var innerSubscription = subscribeToResult_1.subscribeToResult(this, ish, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            destination.add(innerSubscription);
-        }
-    };
-    MergeScanSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            if (this.hasValue === false) {
-                this.destination.next(this.acc);
-            }
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var destination = this.destination;
-        this.acc = innerValue;
-        this.hasValue = true;
-        destination.next(innerValue);
-    };
-    MergeScanSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            if (this.hasValue === false) {
-                this.destination.next(this.acc);
-            }
-            this.destination.complete();
-        }
-    };
-    return MergeScanSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.MergeScanSubscriber = MergeScanSubscriber;
-//# sourceMappingURL=mergeScan.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/mergeScan.js.map b/node_modules/rxjs/internal/operators/mergeScan.js.map
deleted file mode 100644
index a20a90f..0000000
--- a/node_modules/rxjs/internal/operators/mergeScan.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeScan.js","sources":["../../src/internal/operators/mergeScan.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/min.d.ts b/node_modules/rxjs/internal/operators/min.d.ts
deleted file mode 100644
index 72abf65..0000000
--- a/node_modules/rxjs/internal/operators/min.d.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * The Min operator operates on an Observable that emits numbers (or items that can be compared with a provided function),
- * and when source Observable completes it emits a single item: the item with the smallest value.
- *
- * ![](min.png)
- *
- * ## Examples
- * Get the minimal value of a series of numbers
- * ```ts
- * import { of } from 'rxjs';
- * import { min } from 'rxjs/operators';
- *
- * of(5, 4, 7, 2, 8).pipe(
- *   min(),
- * )
- * .subscribe(x => console.log(x)); // -> 2
- * ```
- *
- * Use a comparer function to get the minimal item
- * ```typescript
- * import { of } from 'rxjs';
- * import { min } from 'rxjs/operators';
- *
- * interface Person {
- *   age: number,
- *   name: string
- * }
- * of<Person>(
- *   {age: 7, name: 'Foo'},
- *   {age: 5, name: 'Bar'},
- *   {age: 9, name: 'Beer'},
- * ).pipe(
- *   min<Person>( (a: Person, b: Person) => a.age < b.age ? -1 : 1),
- * )
- * .subscribe((x: Person) => console.log(x.name)); // -> 'Bar'
- * ```
- * @see {@link max}
- *
- * @param {Function} [comparer] - Optional comparer function that it will use instead of its default to compare the
- * value of two items.
- * @return {Observable<R>} An Observable that emits item with the smallest value.
- * @method min
- * @owner Observable
- */
-export declare function min<T>(comparer?: (x: T, y: T) => number): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/min.js b/node_modules/rxjs/internal/operators/min.js
deleted file mode 100644
index 780cf3e..0000000
--- a/node_modules/rxjs/internal/operators/min.js
+++ /dev/null
@@ -1,11 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var reduce_1 = require("./reduce");
-function min(comparer) {
-    var min = (typeof comparer === 'function')
-        ? function (x, y) { return comparer(x, y) < 0 ? x : y; }
-        : function (x, y) { return x < y ? x : y; };
-    return reduce_1.reduce(min);
-}
-exports.min = min;
-//# sourceMappingURL=min.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/min.js.map b/node_modules/rxjs/internal/operators/min.js.map
deleted file mode 100644
index f17a17e..0000000
--- a/node_modules/rxjs/internal/operators/min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"min.js","sources":["../../src/internal/operators/min.ts"],"names":[],"mappings":";;AAAA,mCAAkC;AA+ClC,SAAgB,GAAG,CAAI,QAAiC;IACtD,IAAM,GAAG,GAAsB,CAAC,OAAO,QAAQ,KAAK,UAAU,CAAC;QAC7D,CAAC,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAA1B,CAA0B;QACtC,CAAC,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAb,CAAa,CAAC;IAC5B,OAAO,eAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AALD,kBAKC"}
diff --git a/node_modules/rxjs/internal/operators/multicast.d.ts b/node_modules/rxjs/internal/operators/multicast.d.ts
deleted file mode 100644
index e00592e..0000000
--- a/node_modules/rxjs/internal/operators/multicast.d.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Subject } from '../Subject';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { ConnectableObservable } from '../observable/ConnectableObservable';
-import { OperatorFunction, UnaryFunction, ObservedValueOf, ObservableInput } from '../types';
-export declare function multicast<T>(subject: Subject<T>): UnaryFunction<Observable<T>, ConnectableObservable<T>>;
-export declare function multicast<T, O extends ObservableInput<any>>(subject: Subject<T>, selector: (shared: Observable<T>) => O): UnaryFunction<Observable<T>, ConnectableObservable<ObservedValueOf<O>>>;
-export declare function multicast<T>(subjectFactory: (this: Observable<T>) => Subject<T>): UnaryFunction<Observable<T>, ConnectableObservable<T>>;
-export declare function multicast<T, O extends ObservableInput<any>>(SubjectFactory: (this: Observable<T>) => Subject<T>, selector: (shared: Observable<T>) => O): OperatorFunction<T, ObservedValueOf<O>>;
-export declare class MulticastOperator<T, R> implements Operator<T, R> {
-    private subjectFactory;
-    private selector;
-    constructor(subjectFactory: () => Subject<T>, selector: (source: Observable<T>) => Observable<R>);
-    call(subscriber: Subscriber<R>, source: any): any;
-}
diff --git a/node_modules/rxjs/internal/operators/multicast.js b/node_modules/rxjs/internal/operators/multicast.js
deleted file mode 100644
index 2782102..0000000
--- a/node_modules/rxjs/internal/operators/multicast.js
+++ /dev/null
@@ -1,40 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ConnectableObservable_1 = require("../observable/ConnectableObservable");
-function multicast(subjectOrSubjectFactory, selector) {
-    return function multicastOperatorFunction(source) {
-        var subjectFactory;
-        if (typeof subjectOrSubjectFactory === 'function') {
-            subjectFactory = subjectOrSubjectFactory;
-        }
-        else {
-            subjectFactory = function subjectFactory() {
-                return subjectOrSubjectFactory;
-            };
-        }
-        if (typeof selector === 'function') {
-            return source.lift(new MulticastOperator(subjectFactory, selector));
-        }
-        var connectable = Object.create(source, ConnectableObservable_1.connectableObservableDescriptor);
-        connectable.source = source;
-        connectable.subjectFactory = subjectFactory;
-        return connectable;
-    };
-}
-exports.multicast = multicast;
-var MulticastOperator = (function () {
-    function MulticastOperator(subjectFactory, selector) {
-        this.subjectFactory = subjectFactory;
-        this.selector = selector;
-    }
-    MulticastOperator.prototype.call = function (subscriber, source) {
-        var selector = this.selector;
-        var subject = this.subjectFactory();
-        var subscription = selector(subject).subscribe(subscriber);
-        subscription.add(source.subscribe(subject));
-        return subscription;
-    };
-    return MulticastOperator;
-}());
-exports.MulticastOperator = MulticastOperator;
-//# sourceMappingURL=multicast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/multicast.js.map b/node_modules/rxjs/internal/operators/multicast.js.map
deleted file mode 100644
index e2cc508..0000000
--- a/node_modules/rxjs/internal/operators/multicast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"multicast.js","sources":["../../src/internal/operators/multicast.ts"],"names":[],"mappings":";;AAIA,6EAA6G;AA6B7G,SAAgB,SAAS,CAAO,uBAAwD,EACxD,QAAmD;IACjF,OAAO,SAAS,yBAAyB,CAAC,MAAqB;QAC7D,IAAI,cAAgC,CAAC;QACrC,IAAI,OAAO,uBAAuB,KAAK,UAAU,EAAE;YACjD,cAAc,GAAqB,uBAAuB,CAAC;SAC5D;aAAM;YACL,cAAc,GAAG,SAAS,cAAc;gBACtC,OAAmB,uBAAuB,CAAC;YAC7C,CAAC,CAAC;SACH;QAED,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;YAClC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;SACrE;QAED,IAAM,WAAW,GAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,uDAA+B,CAAC,CAAC;QAChF,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;QAC5B,WAAW,CAAC,cAAc,GAAG,cAAc,CAAC;QAE5C,OAAkC,WAAW,CAAC;IAChD,CAAC,CAAC;AACJ,CAAC;AAtBD,8BAsBC;AAED;IACE,2BAAoB,cAAgC,EAChC,QAAkD;QADlD,mBAAc,GAAd,cAAc,CAAkB;QAChC,aAAQ,GAAR,QAAQ,CAA0C;IACtE,CAAC;IACD,gCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACjC,IAAA,wBAAQ,CAAU;QAC1B,IAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACtC,IAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC7D,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,OAAO,YAAY,CAAC;IACtB,CAAC;IACH,wBAAC;AAAD,CAAC,AAXD,IAWC;AAXY,8CAAiB"}
diff --git a/node_modules/rxjs/internal/operators/observeOn.d.ts b/node_modules/rxjs/internal/operators/observeOn.d.ts
deleted file mode 100644
index 3034ace..0000000
--- a/node_modules/rxjs/internal/operators/observeOn.d.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Notification } from '../Notification';
-import { MonoTypeOperatorFunction, PartialObserver, SchedulerAction, SchedulerLike, TeardownLogic } from '../types';
-/**
- *
- * Re-emits all notifications from source Observable with specified scheduler.
- *
- * <span class="informal">Ensure a specific scheduler is used, from outside of an Observable.</span>
- *
- * `observeOn` is an operator that accepts a scheduler as a first parameter, which will be used to reschedule
- * notifications emitted by the source Observable. It might be useful, if you do not have control over
- * internal scheduler of a given Observable, but want to control when its values are emitted nevertheless.
- *
- * Returned Observable emits the same notifications (nexted values, complete and error events) as the source Observable,
- * but rescheduled with provided scheduler. Note that this doesn't mean that source Observables internal
- * scheduler will be replaced in any way. Original scheduler still will be used, but when the source Observable emits
- * notification, it will be immediately scheduled again - this time with scheduler passed to `observeOn`.
- * An anti-pattern would be calling `observeOn` on Observable that emits lots of values synchronously, to split
- * that emissions into asynchronous chunks. For this to happen, scheduler would have to be passed into the source
- * Observable directly (usually into the operator that creates it). `observeOn` simply delays notifications a
- * little bit more, to ensure that they are emitted at expected moments.
- *
- * As a matter of fact, `observeOn` accepts second parameter, which specifies in milliseconds with what delay notifications
- * will be emitted. The main difference between {@link delay} operator and `observeOn` is that `observeOn`
- * will delay all notifications - including error notifications - while `delay` will pass through error
- * from source Observable immediately when it is emitted. In general it is highly recommended to use `delay` operator
- * for any kind of delaying of values in the stream, while using `observeOn` to specify which scheduler should be used
- * for notification emissions in general.
- *
- * ## Example
- * Ensure values in subscribe are called just before browser repaint.
- * ```ts
- * import { interval } from 'rxjs';
- * import { observeOn } from 'rxjs/operators';
- *
- * const intervals = interval(10);                // Intervals are scheduled
- *                                                // with async scheduler by default...
- * intervals.pipe(
- *   observeOn(animationFrameScheduler),          // ...but we will observe on animationFrame
- * )                                              // scheduler to ensure smooth animation.
- * .subscribe(val => {
- *   someDiv.style.height = val + 'px';
- * });
- * ```
- *
- * @see {@link delay}
- *
- * @param {SchedulerLike} scheduler Scheduler that will be used to reschedule notifications from source Observable.
- * @param {number} [delay] Number of milliseconds that states with what delay every notification should be rescheduled.
- * @return {Observable<T>} Observable that emits the same notifications as the source Observable,
- * but with provided scheduler.
- *
- * @method observeOn
- * @owner Observable
- */
-export declare function observeOn<T>(scheduler: SchedulerLike, delay?: number): MonoTypeOperatorFunction<T>;
-export declare class ObserveOnOperator<T> implements Operator<T, T> {
-    private scheduler;
-    private delay;
-    constructor(scheduler: SchedulerLike, delay?: number);
-    call(subscriber: Subscriber<T>, source: any): TeardownLogic;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class ObserveOnSubscriber<T> extends Subscriber<T> {
-    private scheduler;
-    private delay;
-    /** @nocollapse */
-    static dispatch(this: SchedulerAction<ObserveOnMessage>, arg: ObserveOnMessage): void;
-    constructor(destination: Subscriber<T>, scheduler: SchedulerLike, delay?: number);
-    private scheduleMessage;
-    protected _next(value: T): void;
-    protected _error(err: any): void;
-    protected _complete(): void;
-}
-export declare class ObserveOnMessage {
-    notification: Notification<any>;
-    destination: PartialObserver<any>;
-    constructor(notification: Notification<any>, destination: PartialObserver<any>);
-}
diff --git a/node_modules/rxjs/internal/operators/observeOn.js b/node_modules/rxjs/internal/operators/observeOn.js
deleted file mode 100644
index 3ace8fb..0000000
--- a/node_modules/rxjs/internal/operators/observeOn.js
+++ /dev/null
@@ -1,77 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Notification_1 = require("../Notification");
-function observeOn(scheduler, delay) {
-    if (delay === void 0) { delay = 0; }
-    return function observeOnOperatorFunction(source) {
-        return source.lift(new ObserveOnOperator(scheduler, delay));
-    };
-}
-exports.observeOn = observeOn;
-var ObserveOnOperator = (function () {
-    function ObserveOnOperator(scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    ObserveOnOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
-    };
-    return ObserveOnOperator;
-}());
-exports.ObserveOnOperator = ObserveOnOperator;
-var ObserveOnSubscriber = (function (_super) {
-    __extends(ObserveOnSubscriber, _super);
-    function ObserveOnSubscriber(destination, scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        var _this = _super.call(this, destination) || this;
-        _this.scheduler = scheduler;
-        _this.delay = delay;
-        return _this;
-    }
-    ObserveOnSubscriber.dispatch = function (arg) {
-        var notification = arg.notification, destination = arg.destination;
-        notification.observe(destination);
-        this.unsubscribe();
-    };
-    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {
-        var destination = this.destination;
-        destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));
-    };
-    ObserveOnSubscriber.prototype._next = function (value) {
-        this.scheduleMessage(Notification_1.Notification.createNext(value));
-    };
-    ObserveOnSubscriber.prototype._error = function (err) {
-        this.scheduleMessage(Notification_1.Notification.createError(err));
-        this.unsubscribe();
-    };
-    ObserveOnSubscriber.prototype._complete = function () {
-        this.scheduleMessage(Notification_1.Notification.createComplete());
-        this.unsubscribe();
-    };
-    return ObserveOnSubscriber;
-}(Subscriber_1.Subscriber));
-exports.ObserveOnSubscriber = ObserveOnSubscriber;
-var ObserveOnMessage = (function () {
-    function ObserveOnMessage(notification, destination) {
-        this.notification = notification;
-        this.destination = destination;
-    }
-    return ObserveOnMessage;
-}());
-exports.ObserveOnMessage = ObserveOnMessage;
-//# sourceMappingURL=observeOn.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/observeOn.js.map b/node_modules/rxjs/internal/operators/observeOn.js.map
deleted file mode 100644
index 8d5b133..0000000
--- a/node_modules/rxjs/internal/operators/observeOn.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"observeOn.js","sources":["../../src/internal/operators/observeOn.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AAE3C,gDAA+C;AAuD/C,SAAgB,SAAS,CAAI,SAAwB,EAAE,KAAiB;IAAjB,sBAAA,EAAA,SAAiB;IACtE,OAAO,SAAS,yBAAyB,CAAC,MAAqB;QAC7D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;AACJ,CAAC;AAJD,8BAIC;AAED;IACE,2BAAoB,SAAwB,EAAU,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAAnD,cAAS,GAAT,SAAS,CAAe;QAAU,UAAK,GAAL,KAAK,CAAY;IACvE,CAAC;IAED,gCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3F,CAAC;IACH,wBAAC;AAAD,CAAC,AAPD,IAOC;AAPY,8CAAiB;AAc9B;IAA4C,uCAAa;IAQvD,6BAAY,WAA0B,EAClB,SAAwB,EACxB,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAFrC,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,eAAS,GAAT,SAAS,CAAe;QACxB,WAAK,GAAL,KAAK,CAAY;;IAErC,CAAC;IAVM,4BAAQ,GAAf,UAAyD,GAAqB;QACpE,IAAA,+BAAY,EAAE,6BAAW,CAAS;QAC1C,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAQO,6CAAe,GAAvB,UAAwB,YAA+B;QACrD,IAAM,WAAW,GAAG,IAAI,CAAC,WAA2B,CAAC;QACrD,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CACrC,mBAAmB,CAAC,QAAQ,EAC5B,IAAI,CAAC,KAAK,EACV,IAAI,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CACrD,CAAC,CAAC;IACL,CAAC;IAES,mCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,eAAe,CAAC,2BAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAES,oCAAM,GAAhB,UAAiB,GAAQ;QACvB,IAAI,CAAC,eAAe,CAAC,2BAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAES,uCAAS,GAAnB;QACE,IAAI,CAAC,eAAe,CAAC,2BAAY,CAAC,cAAc,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IACH,0BAAC;AAAD,CAAC,AApCD,CAA4C,uBAAU,GAoCrD;AApCY,kDAAmB;AAsChC;IACE,0BAAmB,YAA+B,EAC/B,WAAiC;QADjC,iBAAY,GAAZ,YAAY,CAAmB;QAC/B,gBAAW,GAAX,WAAW,CAAsB;IACpD,CAAC;IACH,uBAAC;AAAD,CAAC,AAJD,IAIC;AAJY,4CAAgB"}
diff --git a/node_modules/rxjs/internal/operators/onErrorResumeNext.d.ts b/node_modules/rxjs/internal/operators/onErrorResumeNext.d.ts
deleted file mode 100644
index 2c2bf86..0000000
--- a/node_modules/rxjs/internal/operators/onErrorResumeNext.d.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput, OperatorFunction } from '../types';
-export declare function onErrorResumeNext<T>(): OperatorFunction<T, T>;
-export declare function onErrorResumeNext<T, T2>(v: ObservableInput<T2>): OperatorFunction<T, T | T2>;
-export declare function onErrorResumeNext<T, T2, T3>(v: ObservableInput<T2>, v2: ObservableInput<T3>): OperatorFunction<T, T | T2 | T3>;
-export declare function onErrorResumeNext<T, T2, T3, T4>(v: ObservableInput<T2>, v2: ObservableInput<T3>, v3: ObservableInput<T4>): OperatorFunction<T, T | T2 | T3 | T4>;
-export declare function onErrorResumeNext<T, T2, T3, T4, T5>(v: ObservableInput<T2>, v2: ObservableInput<T3>, v3: ObservableInput<T4>, v4: ObservableInput<T5>): OperatorFunction<T, T | T2 | T3 | T4 | T5>;
-export declare function onErrorResumeNext<T, T2, T3, T4, T5, T6>(v: ObservableInput<T2>, v2: ObservableInput<T3>, v3: ObservableInput<T4>, v4: ObservableInput<T5>, v5: ObservableInput<T6>): OperatorFunction<T, T | T2 | T3 | T4 | T5 | T6>;
-export declare function onErrorResumeNext<T, T2, T3, T4, T5, T6, T7>(v: ObservableInput<T2>, v2: ObservableInput<T3>, v3: ObservableInput<T4>, v4: ObservableInput<T5>, v5: ObservableInput<T6>, v6: ObservableInput<T7>): OperatorFunction<T, T | T2 | T3 | T4 | T5 | T6 | T7>;
-export declare function onErrorResumeNext<T, R>(...observables: Array<ObservableInput<any>>): OperatorFunction<T, T | R>;
-export declare function onErrorResumeNext<T, R>(array: ObservableInput<any>[]): OperatorFunction<T, T | R>;
-export declare function onErrorResumeNextStatic<R>(v: ObservableInput<R>): Observable<R>;
-export declare function onErrorResumeNextStatic<T2, T3, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>): Observable<R>;
-export declare function onErrorResumeNextStatic<T2, T3, T4, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<R>;
-export declare function onErrorResumeNextStatic<T2, T3, T4, T5, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): Observable<R>;
-export declare function onErrorResumeNextStatic<T2, T3, T4, T5, T6, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): Observable<R>;
-export declare function onErrorResumeNextStatic<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): Observable<R>;
-export declare function onErrorResumeNextStatic<R>(array: ObservableInput<any>[]): Observable<R>;
diff --git a/node_modules/rxjs/internal/operators/onErrorResumeNext.js b/node_modules/rxjs/internal/operators/onErrorResumeNext.js
deleted file mode 100644
index b4dfcbf..0000000
--- a/node_modules/rxjs/internal/operators/onErrorResumeNext.js
+++ /dev/null
@@ -1,93 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var from_1 = require("../observable/from");
-var isArray_1 = require("../util/isArray");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function onErrorResumeNext() {
-    var nextSources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        nextSources[_i] = arguments[_i];
-    }
-    if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {
-        nextSources = nextSources[0];
-    }
-    return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); };
-}
-exports.onErrorResumeNext = onErrorResumeNext;
-function onErrorResumeNextStatic() {
-    var nextSources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        nextSources[_i] = arguments[_i];
-    }
-    var source = null;
-    if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {
-        nextSources = nextSources[0];
-    }
-    source = nextSources.shift();
-    return from_1.from(source, null).lift(new OnErrorResumeNextOperator(nextSources));
-}
-exports.onErrorResumeNextStatic = onErrorResumeNextStatic;
-var OnErrorResumeNextOperator = (function () {
-    function OnErrorResumeNextOperator(nextSources) {
-        this.nextSources = nextSources;
-    }
-    OnErrorResumeNextOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));
-    };
-    return OnErrorResumeNextOperator;
-}());
-var OnErrorResumeNextSubscriber = (function (_super) {
-    __extends(OnErrorResumeNextSubscriber, _super);
-    function OnErrorResumeNextSubscriber(destination, nextSources) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.nextSources = nextSources;
-        return _this;
-    }
-    OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) {
-        this.subscribeToNextSource();
-    };
-    OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.subscribeToNextSource();
-    };
-    OnErrorResumeNextSubscriber.prototype._error = function (err) {
-        this.subscribeToNextSource();
-        this.unsubscribe();
-    };
-    OnErrorResumeNextSubscriber.prototype._complete = function () {
-        this.subscribeToNextSource();
-        this.unsubscribe();
-    };
-    OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () {
-        var next = this.nextSources.shift();
-        if (!!next) {
-            var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
-            var destination = this.destination;
-            destination.add(innerSubscriber);
-            var innerSubscription = subscribeToResult_1.subscribeToResult(this, next, undefined, undefined, innerSubscriber);
-            if (innerSubscription !== innerSubscriber) {
-                destination.add(innerSubscription);
-            }
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    return OnErrorResumeNextSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=onErrorResumeNext.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/onErrorResumeNext.js.map b/node_modules/rxjs/internal/operators/onErrorResumeNext.js.map
deleted file mode 100644
index aba1fc7..0000000
--- a/node_modules/rxjs/internal/operators/onErrorResumeNext.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"onErrorResumeNext.js","sources":["../../src/internal/operators/onErrorResumeNext.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/pairwise.d.ts b/node_modules/rxjs/internal/operators/pairwise.d.ts
deleted file mode 100644
index 901aac1..0000000
--- a/node_modules/rxjs/internal/operators/pairwise.d.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { OperatorFunction } from '../types';
-/**
- * Groups pairs of consecutive emissions together and emits them as an array of
- * two values.
- *
- * <span class="informal">Puts the current value and previous value together as
- * an array, and emits that.</span>
- *
- * ![](pairwise.png)
- *
- * The Nth emission from the source Observable will cause the output Observable
- * to emit an array [(N-1)th, Nth] of the previous and the current value, as a
- * pair. For this reason, `pairwise` emits on the second and subsequent
- * emissions from the source Observable, but not on the first emission, because
- * there is no previous value in that case.
- *
- * ## Example
- * On every click (starting from the second), emit the relative distance to the previous click
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { pairwise, map } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const pairs = clicks.pipe(pairwise());
- * const distance = pairs.pipe(
- *   map(pair => {
- *     const x0 = pair[0].clientX;
- *     const y0 = pair[0].clientY;
- *     const x1 = pair[1].clientX;
- *     const y1 = pair[1].clientY;
- *     return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));
- *   }),
- * );
- * distance.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link buffer}
- * @see {@link bufferCount}
- *
- * @return {Observable<Array<T>>} An Observable of pairs (as arrays) of
- * consecutive values from the source Observable.
- * @method pairwise
- * @owner Observable
- */
-export declare function pairwise<T>(): OperatorFunction<T, [T, T]>;
diff --git a/node_modules/rxjs/internal/operators/pairwise.js b/node_modules/rxjs/internal/operators/pairwise.js
deleted file mode 100644
index 1311dfe..0000000
--- a/node_modules/rxjs/internal/operators/pairwise.js
+++ /dev/null
@@ -1,51 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function pairwise() {
-    return function (source) { return source.lift(new PairwiseOperator()); };
-}
-exports.pairwise = pairwise;
-var PairwiseOperator = (function () {
-    function PairwiseOperator() {
-    }
-    PairwiseOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new PairwiseSubscriber(subscriber));
-    };
-    return PairwiseOperator;
-}());
-var PairwiseSubscriber = (function (_super) {
-    __extends(PairwiseSubscriber, _super);
-    function PairwiseSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasPrev = false;
-        return _this;
-    }
-    PairwiseSubscriber.prototype._next = function (value) {
-        var pair;
-        if (this.hasPrev) {
-            pair = [this.prev, value];
-        }
-        else {
-            this.hasPrev = true;
-        }
-        this.prev = value;
-        if (pair) {
-            this.destination.next(pair);
-        }
-    };
-    return PairwiseSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=pairwise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/pairwise.js.map b/node_modules/rxjs/internal/operators/pairwise.js.map
deleted file mode 100644
index bfd8233..0000000
--- a/node_modules/rxjs/internal/operators/pairwise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pairwise.js","sources":["../../src/internal/operators/pairwise.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AA8C3C,SAAgB,QAAQ;IACtB,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,EAAE,CAAC,EAAnC,CAAmC,CAAC;AACxE,CAAC;AAFD,4BAEC;AAED;IAAA;IAIA,CAAC;IAHC,+BAAI,GAAJ,UAAK,UAA8B,EAAE,MAAW;QAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9D,CAAC;IACH,uBAAC;AAAD,CAAC,AAJD,IAIC;AAOD;IAAoC,sCAAa;IAI/C,4BAAY,WAA+B;QAA3C,YACE,kBAAM,WAAW,CAAC,SACnB;QAJO,aAAO,GAAY,KAAK,CAAC;;IAIjC,CAAC;IAED,kCAAK,GAAL,UAAM,KAAQ;QACZ,IAAI,IAAwB,CAAC;QAE7B,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SAC3B;aAAM;YACL,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;SACrB;QAED,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAElB,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC7B;IACH,CAAC;IACH,yBAAC;AAAD,CAAC,AAvBD,CAAoC,uBAAU,GAuB7C"}
diff --git a/node_modules/rxjs/internal/operators/partition.d.ts b/node_modules/rxjs/internal/operators/partition.d.ts
deleted file mode 100644
index 0022014..0000000
--- a/node_modules/rxjs/internal/operators/partition.d.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { Observable } from '../Observable';
-import { UnaryFunction } from '../types';
-/**
- * Splits the source Observable into two, one with values that satisfy a
- * predicate, and another with values that don't satisfy the predicate.
- *
- * <span class="informal">It's like {@link filter}, but returns two Observables:
- * one like the output of {@link filter}, and the other with values that did not
- * pass the condition.</span>
- *
- * ![](partition.png)
- *
- * `partition` outputs an array with two Observables that partition the values
- * from the source Observable through the given `predicate` function. The first
- * Observable in that array emits source values for which the predicate argument
- * returns true. The second Observable emits source values for which the
- * predicate returns false. The first behaves like {@link filter} and the second
- * behaves like {@link filter} with the predicate negated.
- *
- * ## Example
- * Partition click events into those on DIV elements and those elsewhere
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { partition } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const parts = clicks.pipe(partition(ev => ev.target.tagName === 'DIV'));
- * const clicksOnDivs = parts[0];
- * const clicksElsewhere = parts[1];
- * clicksOnDivs.subscribe(x => console.log('DIV clicked: ', x));
- * clicksElsewhere.subscribe(x => console.log('Other clicked: ', x));
- * ```
- *
- * @see {@link filter}
- *
- * @param {function(value: T, index: number): boolean} predicate A function that
- * evaluates each value emitted by the source Observable. If it returns `true`,
- * the value is emitted on the first Observable in the returned array, if
- * `false` the value is emitted on the second Observable in the array. The
- * `index` parameter is the number `i` for the i-th source emission that has
- * happened since the subscription, starting from the number `0`.
- * @param {any} [thisArg] An optional argument to determine the value of `this`
- * in the `predicate` function.
- * @return {[Observable<T>, Observable<T>]} An array with two Observables: one
- * with values that passed the predicate, and another with values that did not
- * pass the predicate.
- * @method partition
- * @owner Observable
- * @deprecated use `partition` static creation function instead
- */
-export declare function partition<T>(predicate: (value: T, index: number) => boolean, thisArg?: any): UnaryFunction<Observable<T>, [Observable<T>, Observable<T>]>;
diff --git a/node_modules/rxjs/internal/operators/partition.js b/node_modules/rxjs/internal/operators/partition.js
deleted file mode 100644
index ae96c71..0000000
--- a/node_modules/rxjs/internal/operators/partition.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var not_1 = require("../util/not");
-var filter_1 = require("./filter");
-function partition(predicate, thisArg) {
-    return function (source) { return [
-        filter_1.filter(predicate, thisArg)(source),
-        filter_1.filter(not_1.not(predicate, thisArg))(source)
-    ]; };
-}
-exports.partition = partition;
-//# sourceMappingURL=partition.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/partition.js.map b/node_modules/rxjs/internal/operators/partition.js.map
deleted file mode 100644
index b1241fe..0000000
--- a/node_modules/rxjs/internal/operators/partition.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"partition.js","sources":["../../src/internal/operators/partition.ts"],"names":[],"mappings":";;AAAA,mCAAkC;AAClC,mCAAkC;AAoDlC,SAAgB,SAAS,CAAI,SAA+C,EAC/C,OAAa;IACxC,OAAO,UAAC,MAAqB,IAAK,OAAA;QAChC,eAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC;QAClC,eAAM,CAAC,SAAG,CAAC,SAAS,EAAE,OAAO,CAAQ,CAAC,CAAC,MAAM,CAAC;KACb,EAHD,CAGC,CAAC;AACtC,CAAC;AAND,8BAMC"}
diff --git a/node_modules/rxjs/internal/operators/pluck.d.ts b/node_modules/rxjs/internal/operators/pluck.d.ts
deleted file mode 100644
index 301780e..0000000
--- a/node_modules/rxjs/internal/operators/pluck.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { OperatorFunction } from '../types';
-export declare function pluck<T, K1 extends keyof T>(k1: K1): OperatorFunction<T, T[K1]>;
-export declare function pluck<T, K1 extends keyof T, K2 extends keyof T[K1]>(k1: K1, k2: K2): OperatorFunction<T, T[K1][K2]>;
-export declare function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(k1: K1, k2: K2, k3: K3): OperatorFunction<T, T[K1][K2][K3]>;
-export declare function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(k1: K1, k2: K2, k3: K3, k4: K4): OperatorFunction<T, T[K1][K2][K3][K4]>;
-export declare function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4]>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5): OperatorFunction<T, T[K1][K2][K3][K4][K5]>;
-export declare function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5]>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6): OperatorFunction<T, T[K1][K2][K3][K4][K5][K6]>;
-export declare function pluck<T, R>(...properties: string[]): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/pluck.js b/node_modules/rxjs/internal/operators/pluck.js
deleted file mode 100644
index bddb581..0000000
--- a/node_modules/rxjs/internal/operators/pluck.js
+++ /dev/null
@@ -1,32 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var map_1 = require("./map");
-function pluck() {
-    var properties = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        properties[_i] = arguments[_i];
-    }
-    var length = properties.length;
-    if (length === 0) {
-        throw new Error('list of properties cannot be empty.');
-    }
-    return function (source) { return map_1.map(plucker(properties, length))(source); };
-}
-exports.pluck = pluck;
-function plucker(props, length) {
-    var mapper = function (x) {
-        var currentProp = x;
-        for (var i = 0; i < length; i++) {
-            var p = currentProp[props[i]];
-            if (typeof p !== 'undefined') {
-                currentProp = p;
-            }
-            else {
-                return undefined;
-            }
-        }
-        return currentProp;
-    };
-    return mapper;
-}
-//# sourceMappingURL=pluck.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/pluck.js.map b/node_modules/rxjs/internal/operators/pluck.js.map
deleted file mode 100644
index 262c7cb..0000000
--- a/node_modules/rxjs/internal/operators/pluck.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pluck.js","sources":["../../src/internal/operators/pluck.ts"],"names":[],"mappings":";;AACA,6BAA4B;AA6C5B,SAAgB,KAAK;IAAO,oBAAuB;SAAvB,UAAuB,EAAvB,qBAAuB,EAAvB,IAAuB;QAAvB,+BAAuB;;IACjD,IAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IACjC,IAAI,MAAM,KAAK,CAAC,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;KACxD;IACD,OAAO,UAAC,MAAqB,IAAK,OAAA,SAAG,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,MAAa,CAAC,EAA/C,CAA+C,CAAC;AACpF,CAAC;AAND,sBAMC;AAED,SAAS,OAAO,CAAC,KAAe,EAAE,MAAc;IAC9C,IAAM,MAAM,GAAG,UAAC,CAAS;QACvB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YAC/B,IAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE;gBAC5B,WAAW,GAAG,CAAC,CAAC;aACjB;iBAAM;gBACL,OAAO,SAAS,CAAC;aAClB;SACF;QACD,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
diff --git a/node_modules/rxjs/internal/operators/publish.d.ts b/node_modules/rxjs/internal/operators/publish.d.ts
deleted file mode 100644
index 7757de5..0000000
--- a/node_modules/rxjs/internal/operators/publish.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { Observable } from '../Observable';
-import { ConnectableObservable } from '../observable/ConnectableObservable';
-import { MonoTypeOperatorFunction, OperatorFunction, UnaryFunction, ObservableInput, ObservedValueOf } from '../types';
-export declare function publish<T>(): UnaryFunction<Observable<T>, ConnectableObservable<T>>;
-export declare function publish<T, O extends ObservableInput<any>>(selector: (shared: Observable<T>) => O): OperatorFunction<T, ObservedValueOf<O>>;
-export declare function publish<T>(selector: MonoTypeOperatorFunction<T>): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/publish.js b/node_modules/rxjs/internal/operators/publish.js
deleted file mode 100644
index a921c25..0000000
--- a/node_modules/rxjs/internal/operators/publish.js
+++ /dev/null
@@ -1,11 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var multicast_1 = require("./multicast");
-function publish(selector) {
-    return selector ?
-        multicast_1.multicast(function () { return new Subject_1.Subject(); }, selector) :
-        multicast_1.multicast(new Subject_1.Subject());
-}
-exports.publish = publish;
-//# sourceMappingURL=publish.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/publish.js.map b/node_modules/rxjs/internal/operators/publish.js.map
deleted file mode 100644
index ab2c9b1..0000000
--- a/node_modules/rxjs/internal/operators/publish.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publish.js","sources":["../../src/internal/operators/publish.ts"],"names":[],"mappings":";;AACA,sCAAqC;AACrC,yCAAwC;AA4DxC,SAAgB,OAAO,CAAO,QAAiC;IAC7D,OAAO,QAAQ,CAAC,CAAC;QACf,qBAAS,CAAC,cAAM,OAAA,IAAI,iBAAO,EAAK,EAAhB,CAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7C,qBAAS,CAAC,IAAI,iBAAO,EAAK,CAAC,CAAC;AAChC,CAAC;AAJD,0BAIC"}
diff --git a/node_modules/rxjs/internal/operators/publishBehavior.d.ts b/node_modules/rxjs/internal/operators/publishBehavior.d.ts
deleted file mode 100644
index e1d44d6..0000000
--- a/node_modules/rxjs/internal/operators/publishBehavior.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Observable } from '../Observable';
-import { ConnectableObservable } from '../observable/ConnectableObservable';
-import { UnaryFunction } from '../types';
-/**
- * @param value
- * @return {ConnectableObservable<T>}
- * @method publishBehavior
- * @owner Observable
- */
-export declare function publishBehavior<T>(value: T): UnaryFunction<Observable<T>, ConnectableObservable<T>>;
diff --git a/node_modules/rxjs/internal/operators/publishBehavior.js b/node_modules/rxjs/internal/operators/publishBehavior.js
deleted file mode 100644
index 6131a40..0000000
--- a/node_modules/rxjs/internal/operators/publishBehavior.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var BehaviorSubject_1 = require("../BehaviorSubject");
-var multicast_1 = require("./multicast");
-function publishBehavior(value) {
-    return function (source) { return multicast_1.multicast(new BehaviorSubject_1.BehaviorSubject(value))(source); };
-}
-exports.publishBehavior = publishBehavior;
-//# sourceMappingURL=publishBehavior.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/publishBehavior.js.map b/node_modules/rxjs/internal/operators/publishBehavior.js.map
deleted file mode 100644
index a831305..0000000
--- a/node_modules/rxjs/internal/operators/publishBehavior.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishBehavior.js","sources":["../../src/internal/operators/publishBehavior.ts"],"names":[],"mappings":";;AACA,sDAAqD;AACrD,yCAAwC;AAUxC,SAAgB,eAAe,CAAI,KAAQ;IACzC,OAAO,UAAC,MAAqB,IAAK,OAAA,qBAAS,CAAC,IAAI,iCAAe,CAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAA6B,EAA5E,CAA4E,CAAC;AACjH,CAAC;AAFD,0CAEC"}
diff --git a/node_modules/rxjs/internal/operators/publishLast.d.ts b/node_modules/rxjs/internal/operators/publishLast.d.ts
deleted file mode 100644
index 0012786..0000000
--- a/node_modules/rxjs/internal/operators/publishLast.d.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { Observable } from '../Observable';
-import { ConnectableObservable } from '../observable/ConnectableObservable';
-import { UnaryFunction } from '../types';
-/**
- * Returns a connectable observable sequence that shares a single subscription to the
- * underlying sequence containing only the last notification.
- *
- * ![](publishLast.png)
- *
- * Similar to {@link publish}, but it waits until the source observable completes and stores
- * the last emitted value.
- * Similarly to {@link publishReplay} and {@link publishBehavior}, this keeps storing the last
- * value even if it has no more subscribers. If subsequent subscriptions happen, they will
- * immediately get that last stored value and complete.
- *
- * ## Example
- *
- * ```ts
- * import { interval } from 'rxjs';
- * import { publishLast, tap, take } from 'rxjs/operators';
- *
- * const connectable =
- *   interval(1000)
- *     .pipe(
- *       tap(x => console.log("side effect", x)),
- *       take(3),
- *       publishLast());
- *
- * connectable.subscribe(
- *   x => console.log(  "Sub. A", x),
- *   err => console.log("Sub. A Error", err),
- *   () => console.log( "Sub. A Complete"));
- *
- * connectable.subscribe(
- *   x => console.log(  "Sub. B", x),
- *   err => console.log("Sub. B Error", err),
- *   () => console.log( "Sub. B Complete"));
- *
- * connectable.connect();
- *
- * // Results:
- * //    "side effect 0"
- * //    "side effect 1"
- * //    "side effect 2"
- * //    "Sub. A 2"
- * //    "Sub. B 2"
- * //    "Sub. A Complete"
- * //    "Sub. B Complete"
- * ```
- *
- * @see {@link ConnectableObservable}
- * @see {@link publish}
- * @see {@link publishReplay}
- * @see {@link publishBehavior}
- *
- * @return {ConnectableObservable} An observable sequence that contains the elements of a
- * sequence produced by multicasting the source sequence.
- * @method publishLast
- * @owner Observable
- */
-export declare function publishLast<T>(): UnaryFunction<Observable<T>, ConnectableObservable<T>>;
diff --git a/node_modules/rxjs/internal/operators/publishLast.js b/node_modules/rxjs/internal/operators/publishLast.js
deleted file mode 100644
index 2765417..0000000
--- a/node_modules/rxjs/internal/operators/publishLast.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncSubject_1 = require("../AsyncSubject");
-var multicast_1 = require("./multicast");
-function publishLast() {
-    return function (source) { return multicast_1.multicast(new AsyncSubject_1.AsyncSubject())(source); };
-}
-exports.publishLast = publishLast;
-//# sourceMappingURL=publishLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/publishLast.js.map b/node_modules/rxjs/internal/operators/publishLast.js.map
deleted file mode 100644
index d8ad7ef..0000000
--- a/node_modules/rxjs/internal/operators/publishLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishLast.js","sources":["../../src/internal/operators/publishLast.ts"],"names":[],"mappings":";;AACA,gDAA+C;AAC/C,yCAAwC;AA8DxC,SAAgB,WAAW;IACzB,OAAO,UAAC,MAAqB,IAAK,OAAA,qBAAS,CAAC,IAAI,2BAAY,EAAK,CAAC,CAAC,MAAM,CAAC,EAAxC,CAAwC,CAAC;AAC7E,CAAC;AAFD,kCAEC"}
diff --git a/node_modules/rxjs/internal/operators/publishReplay.d.ts b/node_modules/rxjs/internal/operators/publishReplay.d.ts
deleted file mode 100644
index 6e39cff..0000000
--- a/node_modules/rxjs/internal/operators/publishReplay.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction, OperatorFunction, SchedulerLike, ObservableInput, ObservedValueOf } from '../types';
-export declare function publishReplay<T>(bufferSize?: number, windowTime?: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
-export declare function publishReplay<T, O extends ObservableInput<any>>(bufferSize?: number, windowTime?: number, selector?: (shared: Observable<T>) => O, scheduler?: SchedulerLike): OperatorFunction<T, ObservedValueOf<O>>;
diff --git a/node_modules/rxjs/internal/operators/publishReplay.js b/node_modules/rxjs/internal/operators/publishReplay.js
deleted file mode 100644
index bae5b00..0000000
--- a/node_modules/rxjs/internal/operators/publishReplay.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ReplaySubject_1 = require("../ReplaySubject");
-var multicast_1 = require("./multicast");
-function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {
-    if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {
-        scheduler = selectorOrScheduler;
-    }
-    var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;
-    var subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
-    return function (source) { return multicast_1.multicast(function () { return subject; }, selector)(source); };
-}
-exports.publishReplay = publishReplay;
-//# sourceMappingURL=publishReplay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/publishReplay.js.map b/node_modules/rxjs/internal/operators/publishReplay.js.map
deleted file mode 100644
index 1c95a44..0000000
--- a/node_modules/rxjs/internal/operators/publishReplay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishReplay.js","sources":["../../src/internal/operators/publishReplay.ts"],"names":[],"mappings":";;AACA,kDAAiD;AACjD,yCAAwC;AASxC,SAAgB,aAAa,CAAO,UAAmB,EACnB,UAAmB,EACnB,mBAA4D,EAC5D,SAAyB;IAE3D,IAAI,mBAAmB,IAAI,OAAO,mBAAmB,KAAK,UAAU,EAAE;QACpE,SAAS,GAAG,mBAAmB,CAAC;KACjC;IAED,IAAM,QAAQ,GAAG,OAAO,mBAAmB,KAAK,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7F,IAAM,OAAO,GAAG,IAAI,6BAAa,CAAI,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAExE,OAAO,UAAC,MAAqB,IAAK,OAAA,qBAAS,CAAC,cAAM,OAAA,OAAO,EAAP,CAAO,EAAE,QAAQ,CAAC,CAAC,MAAM,CAA6B,EAAtE,CAAsE,CAAC;AAC3G,CAAC;AAbD,sCAaC"}
diff --git a/node_modules/rxjs/internal/operators/race.d.ts b/node_modules/rxjs/internal/operators/race.d.ts
deleted file mode 100644
index 6020a76..0000000
--- a/node_modules/rxjs/internal/operators/race.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction, OperatorFunction } from '../types';
-/** @deprecated Deprecated in favor of static race. */
-export declare function race<T>(observables: Array<Observable<T>>): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static race. */
-export declare function race<T, R>(observables: Array<Observable<T>>): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static race. */
-export declare function race<T>(...observables: Array<Observable<T> | Array<Observable<T>>>): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static race. */
-export declare function race<T, R>(...observables: Array<Observable<any> | Array<Observable<any>>>): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/race.js b/node_modules/rxjs/internal/operators/race.js
deleted file mode 100644
index b59dcf5..0000000
--- a/node_modules/rxjs/internal/operators/race.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("../util/isArray");
-var race_1 = require("../observable/race");
-function race() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function raceOperatorFunction(source) {
-        if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-            observables = observables[0];
-        }
-        return source.lift.call(race_1.race.apply(void 0, [source].concat(observables)));
-    };
-}
-exports.race = race;
-//# sourceMappingURL=race.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/race.js.map b/node_modules/rxjs/internal/operators/race.js.map
deleted file mode 100644
index 3e37321..0000000
--- a/node_modules/rxjs/internal/operators/race.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"race.js","sources":["../../src/internal/operators/race.ts"],"names":[],"mappings":";;AACA,2CAA0C;AAE1C,2CAAwD;AAsBxD,SAAgB,IAAI;IAAI,qBAAmD;SAAnD,UAAmD,EAAnD,qBAAmD,EAAnD,IAAmD;QAAnD,gCAAmD;;IACzE,OAAO,SAAS,oBAAoB,CAAC,MAAqB;QAGxD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;YACvD,WAAW,GAAG,WAAW,CAAC,CAAC,CAAoB,CAAC;SACjD;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAU,gBAAC,MAAM,SAAM,WAA+B,GAAE,CAAC;IACnF,CAAC,CAAC;AACJ,CAAC;AAVD,oBAUC"}
diff --git a/node_modules/rxjs/internal/operators/reduce.d.ts b/node_modules/rxjs/internal/operators/reduce.d.ts
deleted file mode 100644
index da75389..0000000
--- a/node_modules/rxjs/internal/operators/reduce.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { OperatorFunction, MonoTypeOperatorFunction } from '../types';
-export declare function reduce<T, R>(accumulator: (acc: R, value: T, index: number) => R, seed: R): OperatorFunction<T, R>;
-export declare function reduce<T>(accumulator: (acc: T, value: T, index: number) => T, seed?: T): MonoTypeOperatorFunction<T>;
-export declare function reduce<T, R>(accumulator: (acc: R, value: T, index: number) => R): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/reduce.js b/node_modules/rxjs/internal/operators/reduce.js
deleted file mode 100644
index 63296cf..0000000
--- a/node_modules/rxjs/internal/operators/reduce.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var scan_1 = require("./scan");
-var takeLast_1 = require("./takeLast");
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-var pipe_1 = require("../util/pipe");
-function reduce(accumulator, seed) {
-    if (arguments.length >= 2) {
-        return function reduceOperatorFunctionWithSeed(source) {
-            return pipe_1.pipe(scan_1.scan(accumulator, seed), takeLast_1.takeLast(1), defaultIfEmpty_1.defaultIfEmpty(seed))(source);
-        };
-    }
-    return function reduceOperatorFunction(source) {
-        return pipe_1.pipe(scan_1.scan(function (acc, value, index) { return accumulator(acc, value, index + 1); }), takeLast_1.takeLast(1))(source);
-    };
-}
-exports.reduce = reduce;
-//# sourceMappingURL=reduce.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/reduce.js.map b/node_modules/rxjs/internal/operators/reduce.js.map
deleted file mode 100644
index 93baad8..0000000
--- a/node_modules/rxjs/internal/operators/reduce.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"reduce.js","sources":["../../src/internal/operators/reduce.ts"],"names":[],"mappings":";;AACA,+BAA8B;AAC9B,uCAAsC;AACtC,mDAAkD;AAElD,qCAAoC;AA2DpC,SAAgB,MAAM,CAAO,WAA4D,EAAE,IAAY;IAMrG,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACzB,OAAO,SAAS,8BAA8B,CAAC,MAAqB;YAClE,OAAO,WAAI,CAAC,WAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,mBAAQ,CAAC,CAAC,CAAC,EAAE,+BAAc,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAClF,CAAC,CAAC;KACH;IACD,OAAO,SAAS,sBAAsB,CAAC,MAAqB;QAC1D,OAAO,WAAI,CACT,WAAI,CAAW,UAAC,GAAG,EAAE,KAAK,EAAE,KAAK,IAAK,OAAA,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,EAAlC,CAAkC,CAAC,EACzE,mBAAQ,CAAC,CAAC,CAAC,CACZ,CAAC,MAAM,CAAC,CAAC;IACZ,CAAC,CAAC;AACJ,CAAC;AAjBD,wBAiBC"}
diff --git a/node_modules/rxjs/internal/operators/refCount.d.ts b/node_modules/rxjs/internal/operators/refCount.d.ts
deleted file mode 100644
index e74e9ec..0000000
--- a/node_modules/rxjs/internal/operators/refCount.d.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Make a {@link ConnectableObservable} behave like a ordinary observable and automates the way
- * you can connect to it.
- *
- * Internally it counts the subscriptions to the observable and subscribes (only once) to the source if
- * the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it
- * unsubscribes from the source. This way you can make sure that everything before the *published*
- * refCount has only a single subscription independently of the number of subscribers to the target
- * observable.
- *
- * Note that using the {@link share} operator is exactly the same as using the *publish* operator
- * (making the observable hot) and the *refCount* operator in a sequence.
- *
- * ![](refCount.png)
- *
- * ## Example
- *
- * In the following example there are two intervals turned into connectable observables
- * by using the *publish* operator. The first one uses the *refCount* operator, the
- * second one does not use it. You will notice that a connectable observable does nothing
- * until you call its connect function.
- *
- * ```ts
- * import { interval } from 'rxjs';
- * import { tap, publish, refCount } from 'rxjs/operators';
- *
- * // Turn the interval observable into a ConnectableObservable (hot)
- * const refCountInterval = interval(400).pipe(
- *   tap((num) => console.log(`refCount ${num}`)),
- *   publish(),
- *   refCount()
- * );
- *
- * const publishedInterval = interval(400).pipe(
- *   tap((num) => console.log(`publish ${num}`)),
- *   publish()
- * );
- *
- * refCountInterval.subscribe();
- * refCountInterval.subscribe();
- * // 'refCount 0' -----> 'refCount 1' -----> etc
- * // All subscriptions will receive the same value and the tap (and
- * // every other operator) before the publish operator will be executed
- * // only once per event independently of the number of subscriptions.
- *
- * publishedInterval.subscribe();
- * // Nothing happens until you call .connect() on the observable.
- * ```
- *
- * @see {@link ConnectableObservable}
- * @see {@link share}
- * @see {@link publish}
- */
-export declare function refCount<T>(): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/refCount.js b/node_modules/rxjs/internal/operators/refCount.js
deleted file mode 100644
index 5684ba9..0000000
--- a/node_modules/rxjs/internal/operators/refCount.js
+++ /dev/null
@@ -1,72 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function refCount() {
-    return function refCountOperatorFunction(source) {
-        return source.lift(new RefCountOperator(source));
-    };
-}
-exports.refCount = refCount;
-var RefCountOperator = (function () {
-    function RefCountOperator(connectable) {
-        this.connectable = connectable;
-    }
-    RefCountOperator.prototype.call = function (subscriber, source) {
-        var connectable = this.connectable;
-        connectable._refCount++;
-        var refCounter = new RefCountSubscriber(subscriber, connectable);
-        var subscription = source.subscribe(refCounter);
-        if (!refCounter.closed) {
-            refCounter.connection = connectable.connect();
-        }
-        return subscription;
-    };
-    return RefCountOperator;
-}());
-var RefCountSubscriber = (function (_super) {
-    __extends(RefCountSubscriber, _super);
-    function RefCountSubscriber(destination, connectable) {
-        var _this = _super.call(this, destination) || this;
-        _this.connectable = connectable;
-        return _this;
-    }
-    RefCountSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (!connectable) {
-            this.connection = null;
-            return;
-        }
-        this.connectable = null;
-        var refCount = connectable._refCount;
-        if (refCount <= 0) {
-            this.connection = null;
-            return;
-        }
-        connectable._refCount = refCount - 1;
-        if (refCount > 1) {
-            this.connection = null;
-            return;
-        }
-        var connection = this.connection;
-        var sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    };
-    return RefCountSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=refCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/refCount.js.map b/node_modules/rxjs/internal/operators/refCount.js.map
deleted file mode 100644
index bbc4ca6..0000000
--- a/node_modules/rxjs/internal/operators/refCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"refCount.js","sources":["../../src/internal/operators/refCount.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AA2D3C,SAAgB,QAAQ;IACtB,OAAO,SAAS,wBAAwB,CAAC,MAAgC;QACvE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,CAAgC,CAAC;AACnC,CAAC;AAJD,4BAIC;AAED;IACE,0BAAoB,WAAqC;QAArC,gBAAW,GAAX,WAAW,CAA0B;IACzD,CAAC;IACD,+BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QAEjC,IAAA,8BAAW,CAAU;QACtB,WAAY,CAAC,SAAS,EAAE,CAAC;QAEhC,IAAM,UAAU,GAAG,IAAI,kBAAkB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACnE,IAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAElD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACf,UAAW,CAAC,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;SACvD;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IACH,uBAAC;AAAD,CAAC,AAjBD,IAiBC;AAED;IAAoC,sCAAa;IAI/C,4BAAY,WAA0B,EAClB,WAAqC;QADzD,YAEE,kBAAM,WAAW,CAAC,SACnB;QAFmB,iBAAW,GAAX,WAAW,CAA0B;;IAEzD,CAAC;IAES,yCAAY,GAAtB;QAEU,IAAA,8BAAW,CAAU;QAC7B,IAAI,CAAC,WAAW,EAAE;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO;SACR;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAM,QAAQ,GAAU,WAAY,CAAC,SAAS,CAAC;QAC/C,IAAI,QAAQ,IAAI,CAAC,EAAE;YACjB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO;SACR;QAEM,WAAY,CAAC,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC7C,IAAI,QAAQ,GAAG,CAAC,EAAE;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO;SACR;QA0BO,IAAA,4BAAU,CAAU;QAC5B,IAAM,gBAAgB,GAAU,WAAY,CAAC,WAAW,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,gBAAgB,IAAI,CAAC,CAAC,UAAU,IAAI,gBAAgB,KAAK,UAAU,CAAC,EAAE;YACxE,gBAAgB,CAAC,WAAW,EAAE,CAAC;SAChC;IACH,CAAC;IACH,yBAAC;AAAD,CAAC,AA9DD,CAAoC,uBAAU,GA8D7C"}
diff --git a/node_modules/rxjs/internal/operators/repeat.d.ts b/node_modules/rxjs/internal/operators/repeat.d.ts
deleted file mode 100644
index d1ecb28..0000000
--- a/node_modules/rxjs/internal/operators/repeat.d.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Returns an Observable that will resubscribe to the source stream when the source stream completes, at most count times.
- *
- * <span class="informal">Repeats all values emitted on the source. It's like {@link retry}, but for non error cases.</span>
- *
- * ![](repeat.png)
- *
- * Similar to {@link retry}, this operator repeats the stream of items emitted by the source for non error cases.
- * Repeat can be useful for creating observables that are meant to have some repeated pattern or rhythm.
- *
- * Note: `repeat(0)` returns an empty observable and `repeat()` will repeat forever
- *
- * ## Example
- * Repeat a message stream
- * ```ts
- * import { of } from 'rxjs';
- * import { repeat, delay } from 'rxjs/operators';
- *
- * const source = of('Repeat message');
- * const example = source.pipe(repeat(3));
- * example.subscribe(x => console.log(x));
- *
- * // Results
- * // Repeat message
- * // Repeat message
- * // Repeat message
- * ```
- *
- * Repeat 3 values, 2 times
- * ```ts
- * import { interval } from 'rxjs';
- * import { repeat, take } from 'rxjs/operators';
- *
- * const source = interval(1000);
- * const example = source.pipe(take(3), repeat(2));
- * example.subscribe(x => console.log(x));
- *
- * // Results every second
- * // 0
- * // 1
- * // 2
- * // 0
- * // 1
- * // 2
- * ```
- *
- * @see {@link repeatWhen}
- * @see {@link retry}
- *
- * @param {number} [count] The number of times the source Observable items are repeated, a count of 0 will yield
- * an empty Observable.
- * @return {Observable} An Observable that will resubscribe to the source stream when the source stream completes
- * , at most count times.
- * @method repeat
- * @owner Observable
- */
-export declare function repeat<T>(count?: number): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/repeat.js b/node_modules/rxjs/internal/operators/repeat.js
deleted file mode 100644
index 0460a95..0000000
--- a/node_modules/rxjs/internal/operators/repeat.js
+++ /dev/null
@@ -1,65 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var empty_1 = require("../observable/empty");
-function repeat(count) {
-    if (count === void 0) { count = -1; }
-    return function (source) {
-        if (count === 0) {
-            return empty_1.empty();
-        }
-        else if (count < 0) {
-            return source.lift(new RepeatOperator(-1, source));
-        }
-        else {
-            return source.lift(new RepeatOperator(count - 1, source));
-        }
-    };
-}
-exports.repeat = repeat;
-var RepeatOperator = (function () {
-    function RepeatOperator(count, source) {
-        this.count = count;
-        this.source = source;
-    }
-    RepeatOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));
-    };
-    return RepeatOperator;
-}());
-var RepeatSubscriber = (function (_super) {
-    __extends(RepeatSubscriber, _super);
-    function RepeatSubscriber(destination, count, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.count = count;
-        _this.source = source;
-        return _this;
-    }
-    RepeatSubscriber.prototype.complete = function () {
-        if (!this.isStopped) {
-            var _a = this, source = _a.source, count = _a.count;
-            if (count === 0) {
-                return _super.prototype.complete.call(this);
-            }
-            else if (count > -1) {
-                this.count = count - 1;
-            }
-            source.subscribe(this._unsubscribeAndRecycle());
-        }
-    };
-    return RepeatSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=repeat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/repeat.js.map b/node_modules/rxjs/internal/operators/repeat.js.map
deleted file mode 100644
index a923cdc..0000000
--- a/node_modules/rxjs/internal/operators/repeat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"repeat.js","sources":["../../src/internal/operators/repeat.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AAE3C,6CAA4C;AA2D5C,SAAgB,MAAM,CAAI,KAAkB;IAAlB,sBAAA,EAAA,SAAiB,CAAC;IAC1C,OAAO,UAAC,MAAqB;QAC3B,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,OAAO,aAAK,EAAE,CAAC;SAChB;aAAM,IAAI,KAAK,GAAG,CAAC,EAAE;YACpB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;SACpD;aAAM;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;SAC3D;IACH,CAAC,CAAC;AACJ,CAAC;AAVD,wBAUC;AAED;IACE,wBAAoB,KAAa,EACb,MAAqB;QADrB,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAe;IACzC,CAAC;IACD,6BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACrF,CAAC;IACH,qBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAkC,oCAAa;IAC7C,0BAAY,WAA4B,EACpB,KAAa,EACb,MAAqB;QAFzC,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,WAAK,GAAL,KAAK,CAAQ;QACb,YAAM,GAAN,MAAM,CAAe;;IAEzC,CAAC;IACD,mCAAQ,GAAR;QACE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACb,IAAA,SAAwB,EAAtB,kBAAM,EAAE,gBAAK,CAAU;YAC/B,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,OAAO,iBAAM,QAAQ,WAAE,CAAC;aACzB;iBAAM,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;aACxB;YACD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;SACjD;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAjBD,CAAkC,uBAAU,GAiB3C"}
diff --git a/node_modules/rxjs/internal/operators/repeatWhen.d.ts b/node_modules/rxjs/internal/operators/repeatWhen.d.ts
deleted file mode 100644
index 17a225e..0000000
--- a/node_modules/rxjs/internal/operators/repeatWhen.d.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Returns an Observable that mirrors the source Observable with the exception of a `complete`. If the source
- * Observable calls `complete`, this method will emit to the Observable returned from `notifier`. If that Observable
- * calls `complete` or `error`, then this method will call `complete` or `error` on the child subscription. Otherwise
- * this method will resubscribe to the source Observable.
- *
- * ![](repeatWhen.png)
- *
- * ## Example
- * Repeat a message stream on click
- * ```ts
- * import { of, fromEvent } from 'rxjs';
- * import { repeatWhen } from 'rxjs/operators';
- *
- * const source = of('Repeat message');
- * const documentClick$ = fromEvent(document, 'click');
- *
- * source.pipe(repeatWhen(() => documentClick$)
- * ).subscribe(data => console.log(data))
- * ```
- * @see {@link repeat}
- * @see {@link retry}
- * @see {@link retryWhen}
- *
- * @param {function(notifications: Observable): Observable} notifier - Receives an Observable of notifications with
- * which a user can `complete` or `error`, aborting the repetition.
- * @return {Observable} The source Observable modified with repeat logic.
- * @method repeatWhen
- * @owner Observable
- */
-export declare function repeatWhen<T>(notifier: (notifications: Observable<any>) => Observable<any>): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/repeatWhen.js b/node_modules/rxjs/internal/operators/repeatWhen.js
deleted file mode 100644
index 1c1d12e..0000000
--- a/node_modules/rxjs/internal/operators/repeatWhen.js
+++ /dev/null
@@ -1,97 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function repeatWhen(notifier) {
-    return function (source) { return source.lift(new RepeatWhenOperator(notifier)); };
-}
-exports.repeatWhen = repeatWhen;
-var RepeatWhenOperator = (function () {
-    function RepeatWhenOperator(notifier) {
-        this.notifier = notifier;
-    }
-    RepeatWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));
-    };
-    return RepeatWhenOperator;
-}());
-var RepeatWhenSubscriber = (function (_super) {
-    __extends(RepeatWhenSubscriber, _super);
-    function RepeatWhenSubscriber(destination, notifier, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.notifier = notifier;
-        _this.source = source;
-        _this.sourceIsBeingSubscribedTo = true;
-        return _this;
-    }
-    RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.sourceIsBeingSubscribedTo = true;
-        this.source.subscribe(this);
-    };
-    RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) {
-        if (this.sourceIsBeingSubscribedTo === false) {
-            return _super.prototype.complete.call(this);
-        }
-    };
-    RepeatWhenSubscriber.prototype.complete = function () {
-        this.sourceIsBeingSubscribedTo = false;
-        if (!this.isStopped) {
-            if (!this.retries) {
-                this.subscribeToRetries();
-            }
-            if (!this.retriesSubscription || this.retriesSubscription.closed) {
-                return _super.prototype.complete.call(this);
-            }
-            this._unsubscribeAndRecycle();
-            this.notifications.next();
-        }
-    };
-    RepeatWhenSubscriber.prototype._unsubscribe = function () {
-        var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription;
-        if (notifications) {
-            notifications.unsubscribe();
-            this.notifications = null;
-        }
-        if (retriesSubscription) {
-            retriesSubscription.unsubscribe();
-            this.retriesSubscription = null;
-        }
-        this.retries = null;
-    };
-    RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () {
-        var _unsubscribe = this._unsubscribe;
-        this._unsubscribe = null;
-        _super.prototype._unsubscribeAndRecycle.call(this);
-        this._unsubscribe = _unsubscribe;
-        return this;
-    };
-    RepeatWhenSubscriber.prototype.subscribeToRetries = function () {
-        this.notifications = new Subject_1.Subject();
-        var retries;
-        try {
-            var notifier = this.notifier;
-            retries = notifier(this.notifications);
-        }
-        catch (e) {
-            return _super.prototype.complete.call(this);
-        }
-        this.retries = retries;
-        this.retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);
-    };
-    return RepeatWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=repeatWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/repeatWhen.js.map b/node_modules/rxjs/internal/operators/repeatWhen.js.map
deleted file mode 100644
index bb4620d..0000000
--- a/node_modules/rxjs/internal/operators/repeatWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"repeatWhen.js","sources":["../../src/internal/operators/repeatWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/retry.d.ts b/node_modules/rxjs/internal/operators/retry.d.ts
deleted file mode 100644
index 0608256..0000000
--- a/node_modules/rxjs/internal/operators/retry.d.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable
- * calls `error`, this method will resubscribe to the source Observable for a maximum of `count` resubscriptions (given
- * as a number parameter) rather than propagating the `error` call.
- *
- * ![](retry.png)
- *
- * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted
- * during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second
- * time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications
- * would be: [1, 2, 1, 2, 3, 4, 5, `complete`].
- *
- * ## Example
- * ```ts
- * import { interval, of, throwError } from 'rxjs';
- * import { mergeMap, retry } from 'rxjs/operators';
- *
- * const source = interval(1000);
- * const example = source.pipe(
- *   mergeMap(val => {
- *     if(val > 5){
- *       return throwError('Error!');
- *     }
- *     return of(val);
- *   }),
- *   //retry 2 times on error
- *   retry(2)
- * );
- *
- * const subscribe = example.subscribe({
- *   next: val => console.log(val),
- *   error: val => console.log(`${val}: Retried 2 times then quit!`)
- * });
- *
- * // Output:
- * // 0..1..2..3..4..5..
- * // 0..1..2..3..4..5..
- * // 0..1..2..3..4..5..
- * // "Error!: Retried 2 times then quit!"
- * ```
- *
- * @param {number} count - Number of retry attempts before failing.
- * @return {Observable} The source Observable modified with the retry logic.
- * @method retry
- * @owner Observable
- */
-export declare function retry<T>(count?: number): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/retry.js b/node_modules/rxjs/internal/operators/retry.js
deleted file mode 100644
index 6f0e873..0000000
--- a/node_modules/rxjs/internal/operators/retry.js
+++ /dev/null
@@ -1,54 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function retry(count) {
-    if (count === void 0) { count = -1; }
-    return function (source) { return source.lift(new RetryOperator(count, source)); };
-}
-exports.retry = retry;
-var RetryOperator = (function () {
-    function RetryOperator(count, source) {
-        this.count = count;
-        this.source = source;
-    }
-    RetryOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));
-    };
-    return RetryOperator;
-}());
-var RetrySubscriber = (function (_super) {
-    __extends(RetrySubscriber, _super);
-    function RetrySubscriber(destination, count, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.count = count;
-        _this.source = source;
-        return _this;
-    }
-    RetrySubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var _a = this, source = _a.source, count = _a.count;
-            if (count === 0) {
-                return _super.prototype.error.call(this, err);
-            }
-            else if (count > -1) {
-                this.count = count - 1;
-            }
-            source.subscribe(this._unsubscribeAndRecycle());
-        }
-    };
-    return RetrySubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=retry.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/retry.js.map b/node_modules/rxjs/internal/operators/retry.js.map
deleted file mode 100644
index 0551f61..0000000
--- a/node_modules/rxjs/internal/operators/retry.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"retry.js","sources":["../../src/internal/operators/retry.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AAmD3C,SAAgB,KAAK,CAAI,KAAkB;IAAlB,sBAAA,EAAA,SAAiB,CAAC;IACzC,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAA7C,CAA6C,CAAC;AAClF,CAAC;AAFD,sBAEC;AAED;IACE,uBAAoB,KAAa,EACb,MAAqB;QADrB,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAe;IACzC,CAAC;IAED,4BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpF,CAAC;IACH,oBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAiC,mCAAa;IAC5C,yBAAY,WAA4B,EACpB,KAAa,EACb,MAAqB;QAFzC,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,WAAK,GAAL,KAAK,CAAQ;QACb,YAAM,GAAN,MAAM,CAAe;;IAEzC,CAAC;IACD,+BAAK,GAAL,UAAM,GAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACb,IAAA,SAAwB,EAAtB,kBAAM,EAAE,gBAAK,CAAU;YAC/B,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,OAAO,iBAAM,KAAK,YAAC,GAAG,CAAC,CAAC;aACzB;iBAAM,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;gBACrB,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;aACxB;YACD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;SACjD;IACH,CAAC;IACH,sBAAC;AAAD,CAAC,AAjBD,CAAiC,uBAAU,GAiB1C"}
diff --git a/node_modules/rxjs/internal/operators/retryWhen.d.ts b/node_modules/rxjs/internal/operators/retryWhen.d.ts
deleted file mode 100644
index cb55ffe..0000000
--- a/node_modules/rxjs/internal/operators/retryWhen.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable
- * calls `error`, this method will emit the Throwable that caused the error to the Observable returned from `notifier`.
- * If that Observable calls `complete` or `error` then this method will call `complete` or `error` on the child
- * subscription. Otherwise this method will resubscribe to the source Observable.
- *
- * ![](retryWhen.png)
- *
- * @param {function(errors: Observable): Observable} notifier - Receives an Observable of notifications with which a
- * user can `complete` or `error`, aborting the retry.
- * @return {Observable} The source Observable modified with retry logic.
- * @method retryWhen
- * @owner Observable
- */
-export declare function retryWhen<T>(notifier: (errors: Observable<any>) => Observable<any>): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/retryWhen.js b/node_modules/rxjs/internal/operators/retryWhen.js
deleted file mode 100644
index b543dd1..0000000
--- a/node_modules/rxjs/internal/operators/retryWhen.js
+++ /dev/null
@@ -1,89 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function retryWhen(notifier) {
-    return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); };
-}
-exports.retryWhen = retryWhen;
-var RetryWhenOperator = (function () {
-    function RetryWhenOperator(notifier, source) {
-        this.notifier = notifier;
-        this.source = source;
-    }
-    RetryWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));
-    };
-    return RetryWhenOperator;
-}());
-var RetryWhenSubscriber = (function (_super) {
-    __extends(RetryWhenSubscriber, _super);
-    function RetryWhenSubscriber(destination, notifier, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.notifier = notifier;
-        _this.source = source;
-        return _this;
-    }
-    RetryWhenSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var errors = this.errors;
-            var retries = this.retries;
-            var retriesSubscription = this.retriesSubscription;
-            if (!retries) {
-                errors = new Subject_1.Subject();
-                try {
-                    var notifier = this.notifier;
-                    retries = notifier(errors);
-                }
-                catch (e) {
-                    return _super.prototype.error.call(this, e);
-                }
-                retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);
-            }
-            else {
-                this.errors = null;
-                this.retriesSubscription = null;
-            }
-            this._unsubscribeAndRecycle();
-            this.errors = errors;
-            this.retries = retries;
-            this.retriesSubscription = retriesSubscription;
-            errors.next(err);
-        }
-    };
-    RetryWhenSubscriber.prototype._unsubscribe = function () {
-        var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription;
-        if (errors) {
-            errors.unsubscribe();
-            this.errors = null;
-        }
-        if (retriesSubscription) {
-            retriesSubscription.unsubscribe();
-            this.retriesSubscription = null;
-        }
-        this.retries = null;
-    };
-    RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var _unsubscribe = this._unsubscribe;
-        this._unsubscribe = null;
-        this._unsubscribeAndRecycle();
-        this._unsubscribe = _unsubscribe;
-        this.source.subscribe(this);
-    };
-    return RetryWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=retryWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/retryWhen.js.map b/node_modules/rxjs/internal/operators/retryWhen.js.map
deleted file mode 100644
index a412bea..0000000
--- a/node_modules/rxjs/internal/operators/retryWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"retryWhen.js","sources":["../../src/internal/operators/retryWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/sample.d.ts b/node_modules/rxjs/internal/operators/sample.d.ts
deleted file mode 100644
index f2ba124..0000000
--- a/node_modules/rxjs/internal/operators/sample.d.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Emits the most recently emitted value from the source Observable whenever
- * another Observable, the `notifier`, emits.
- *
- * <span class="informal">It's like {@link sampleTime}, but samples whenever
- * the `notifier` Observable emits something.</span>
- *
- * ![](sample.png)
- *
- * Whenever the `notifier` Observable emits a value or completes, `sample`
- * looks at the source Observable and emits whichever value it has most recently
- * emitted since the previous sampling, unless the source has not emitted
- * anything since the previous sampling. The `notifier` is subscribed to as soon
- * as the output Observable is subscribed.
- *
- * ## Example
- * On every click, sample the most recent "seconds" timer
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { sample } from 'rxjs/operators';
- *
- * const seconds = interval(1000);
- * const clicks = fromEvent(document, 'click');
- * const result = seconds.pipe(sample(clicks));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link audit}
- * @see {@link debounce}
- * @see {@link sampleTime}
- * @see {@link throttle}
- *
- * @param {Observable<any>} notifier The Observable to use for sampling the
- * source Observable.
- * @return {Observable<T>} An Observable that emits the results of sampling the
- * values emitted by the source Observable whenever the notifier Observable
- * emits value or completes.
- * @method sample
- * @owner Observable
- */
-export declare function sample<T>(notifier: Observable<any>): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/sample.js b/node_modules/rxjs/internal/operators/sample.js
deleted file mode 100644
index 127273d..0000000
--- a/node_modules/rxjs/internal/operators/sample.js
+++ /dev/null
@@ -1,59 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function sample(notifier) {
-    return function (source) { return source.lift(new SampleOperator(notifier)); };
-}
-exports.sample = sample;
-var SampleOperator = (function () {
-    function SampleOperator(notifier) {
-        this.notifier = notifier;
-    }
-    SampleOperator.prototype.call = function (subscriber, source) {
-        var sampleSubscriber = new SampleSubscriber(subscriber);
-        var subscription = source.subscribe(sampleSubscriber);
-        subscription.add(subscribeToResult_1.subscribeToResult(sampleSubscriber, this.notifier));
-        return subscription;
-    };
-    return SampleOperator;
-}());
-var SampleSubscriber = (function (_super) {
-    __extends(SampleSubscriber, _super);
-    function SampleSubscriber() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this.hasValue = false;
-        return _this;
-    }
-    SampleSubscriber.prototype._next = function (value) {
-        this.value = value;
-        this.hasValue = true;
-    };
-    SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.emitValue();
-    };
-    SampleSubscriber.prototype.notifyComplete = function () {
-        this.emitValue();
-    };
-    SampleSubscriber.prototype.emitValue = function () {
-        if (this.hasValue) {
-            this.hasValue = false;
-            this.destination.next(this.value);
-        }
-    };
-    return SampleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=sample.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/sample.js.map b/node_modules/rxjs/internal/operators/sample.js.map
deleted file mode 100644
index 18b9212..0000000
--- a/node_modules/rxjs/internal/operators/sample.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sample.js","sources":["../../src/internal/operators/sample.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,sDAAqD;AAErD,+DAA8D;AA4C9D,SAAgB,MAAM,CAAI,QAAyB;IACjD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAzC,CAAyC,CAAC;AAC9E,CAAC;AAFD,wBAEC;AAED;IACE,wBAAoB,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAC7C,CAAC;IAED,6BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,IAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxD,YAAY,CAAC,GAAG,CAAC,qCAAiB,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrE,OAAO,YAAY,CAAC;IACtB,CAAC;IACH,qBAAC;AAAD,CAAC,AAVD,IAUC;AAOD;IAAqC,oCAAqB;IAA1D;QAAA,qEAyBC;QAvBS,cAAQ,GAAY,KAAK,CAAC;;IAuBpC,CAAC;IArBW,gCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,qCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,yCAAc,GAAd;QACE,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,oCAAS,GAAT;QACE,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACnC;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAzBD,CAAqC,iCAAe,GAyBnD"}
diff --git a/node_modules/rxjs/internal/operators/sampleTime.d.ts b/node_modules/rxjs/internal/operators/sampleTime.d.ts
deleted file mode 100644
index 9083f1e..0000000
--- a/node_modules/rxjs/internal/operators/sampleTime.d.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
-/**
- * Emits the most recently emitted value from the source Observable within
- * periodic time intervals.
- *
- * <span class="informal">Samples the source Observable at periodic time
- * intervals, emitting what it samples.</span>
- *
- * ![](sampleTime.png)
- *
- * `sampleTime` periodically looks at the source Observable and emits whichever
- * value it has most recently emitted since the previous sampling, unless the
- * source has not emitted anything since the previous sampling. The sampling
- * happens periodically in time every `period` milliseconds (or the time unit
- * defined by the optional `scheduler` argument). The sampling starts as soon as
- * the output Observable is subscribed.
- *
- * ## Example
- * Every second, emit the most recent click at most once
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { sampleTime } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(sampleTime(1000));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link auditTime}
- * @see {@link debounceTime}
- * @see {@link delay}
- * @see {@link sample}
- * @see {@link throttleTime}
- *
- * @param {number} period The sampling period expressed in milliseconds or the
- * time unit determined internally by the optional `scheduler`.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
- * managing the timers that handle the sampling.
- * @return {Observable<T>} An Observable that emits the results of sampling the
- * values emitted by the source Observable at the specified time interval.
- * @method sampleTime
- * @owner Observable
- */
-export declare function sampleTime<T>(period: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/sampleTime.js b/node_modules/rxjs/internal/operators/sampleTime.js
deleted file mode 100644
index 525580b..0000000
--- a/node_modules/rxjs/internal/operators/sampleTime.js
+++ /dev/null
@@ -1,60 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var async_1 = require("../scheduler/async");
-function sampleTime(period, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); };
-}
-exports.sampleTime = sampleTime;
-var SampleTimeOperator = (function () {
-    function SampleTimeOperator(period, scheduler) {
-        this.period = period;
-        this.scheduler = scheduler;
-    }
-    SampleTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));
-    };
-    return SampleTimeOperator;
-}());
-var SampleTimeSubscriber = (function (_super) {
-    __extends(SampleTimeSubscriber, _super);
-    function SampleTimeSubscriber(destination, period, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.period = period;
-        _this.scheduler = scheduler;
-        _this.hasValue = false;
-        _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period }));
-        return _this;
-    }
-    SampleTimeSubscriber.prototype._next = function (value) {
-        this.lastValue = value;
-        this.hasValue = true;
-    };
-    SampleTimeSubscriber.prototype.notifyNext = function () {
-        if (this.hasValue) {
-            this.hasValue = false;
-            this.destination.next(this.lastValue);
-        }
-    };
-    return SampleTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNotification(state) {
-    var subscriber = state.subscriber, period = state.period;
-    subscriber.notifyNext();
-    this.schedule(state, period);
-}
-//# sourceMappingURL=sampleTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/sampleTime.js.map b/node_modules/rxjs/internal/operators/sampleTime.js.map
deleted file mode 100644
index 071346b..0000000
--- a/node_modules/rxjs/internal/operators/sampleTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sampleTime.js","sources":["../../src/internal/operators/sampleTime.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AAC3C,4CAA2C;AA6C3C,SAAgB,UAAU,CAAI,MAAc,EAAE,SAAgC;IAAhC,0BAAA,EAAA,YAA2B,aAAK;IAC5E,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAtD,CAAsD,CAAC;AAC3F,CAAC;AAFD,gCAEC;AAED;IACE,4BAAoB,MAAc,EACd,SAAwB;QADxB,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAAe;IAC5C,CAAC;IAED,iCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7F,CAAC;IACH,yBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAsC,wCAAa;IAIjD,8BAAY,WAA0B,EAClB,MAAc,EACd,SAAwB;QAF5C,YAGE,kBAAM,WAAW,CAAC,SAEnB;QAJmB,YAAM,GAAN,MAAM,CAAQ;QACd,eAAS,GAAT,SAAS,CAAe;QAJ5C,cAAQ,GAAY,KAAK,CAAC;QAMxB,KAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,KAAI,EAAE,MAAM,QAAA,EAAE,CAAC,CAAC,CAAC;;IAC3F,CAAC;IAES,oCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,yCAAU,GAAV;QACE,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACvC;IACH,CAAC;IACH,2BAAC;AAAD,CAAC,AAtBD,CAAsC,uBAAU,GAsB/C;AAED,SAAS,oBAAoB,CAAgC,KAAU;IAC/D,IAAA,6BAAU,EAAE,qBAAM,CAAW;IACnC,UAAU,CAAC,UAAU,EAAE,CAAC;IACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC"}
diff --git a/node_modules/rxjs/internal/operators/scan.d.ts b/node_modules/rxjs/internal/operators/scan.d.ts
deleted file mode 100644
index 8e03bc5..0000000
--- a/node_modules/rxjs/internal/operators/scan.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { OperatorFunction, MonoTypeOperatorFunction } from '../types';
-export declare function scan<T, R>(accumulator: (acc: R, value: T, index: number) => R, seed: R): OperatorFunction<T, R>;
-export declare function scan<T>(accumulator: (acc: T, value: T, index: number) => T, seed?: T): MonoTypeOperatorFunction<T>;
-export declare function scan<T, R>(accumulator: (acc: R, value: T, index: number) => R): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/scan.js b/node_modules/rxjs/internal/operators/scan.js
deleted file mode 100644
index b43c1b7..0000000
--- a/node_modules/rxjs/internal/operators/scan.js
+++ /dev/null
@@ -1,83 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function scan(accumulator, seed) {
-    var hasSeed = false;
-    if (arguments.length >= 2) {
-        hasSeed = true;
-    }
-    return function scanOperatorFunction(source) {
-        return source.lift(new ScanOperator(accumulator, seed, hasSeed));
-    };
-}
-exports.scan = scan;
-var ScanOperator = (function () {
-    function ScanOperator(accumulator, seed, hasSeed) {
-        if (hasSeed === void 0) { hasSeed = false; }
-        this.accumulator = accumulator;
-        this.seed = seed;
-        this.hasSeed = hasSeed;
-    }
-    ScanOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));
-    };
-    return ScanOperator;
-}());
-var ScanSubscriber = (function (_super) {
-    __extends(ScanSubscriber, _super);
-    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {
-        var _this = _super.call(this, destination) || this;
-        _this.accumulator = accumulator;
-        _this._seed = _seed;
-        _this.hasSeed = hasSeed;
-        _this.index = 0;
-        return _this;
-    }
-    Object.defineProperty(ScanSubscriber.prototype, "seed", {
-        get: function () {
-            return this._seed;
-        },
-        set: function (value) {
-            this.hasSeed = true;
-            this._seed = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    ScanSubscriber.prototype._next = function (value) {
-        if (!this.hasSeed) {
-            this.seed = value;
-            this.destination.next(value);
-        }
-        else {
-            return this._tryNext(value);
-        }
-    };
-    ScanSubscriber.prototype._tryNext = function (value) {
-        var index = this.index++;
-        var result;
-        try {
-            result = this.accumulator(this.seed, value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-        this.seed = result;
-        this.destination.next(result);
-    };
-    return ScanSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=scan.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/scan.js.map b/node_modules/rxjs/internal/operators/scan.js.map
deleted file mode 100644
index a27e6bf..0000000
--- a/node_modules/rxjs/internal/operators/scan.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scan.js","sources":["../../src/internal/operators/scan.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AAoD3C,SAAgB,IAAI,CAAO,WAAmD,EAAE,IAAY;IAC1F,IAAI,OAAO,GAAG,KAAK,CAAC;IAMpB,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACzB,OAAO,GAAG,IAAI,CAAC;KAChB;IAED,OAAO,SAAS,oBAAoB,CAAC,MAAqB;QACxD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC;AAdD,oBAcC;AAED;IACE,sBAAoB,WAAmD,EAAU,IAAY,EAAU,OAAwB;QAAxB,wBAAA,EAAA,eAAwB;QAA3G,gBAAW,GAAX,WAAW,CAAwC;QAAU,SAAI,GAAJ,IAAI,CAAQ;QAAU,YAAO,GAAP,OAAO,CAAiB;IAAG,CAAC;IAEnI,2BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrG,CAAC;IACH,mBAAC;AAAD,CAAC,AAND,IAMC;AAOD;IAAmC,kCAAa;IAY9C,wBAAY,WAA0B,EAAU,WAAmD,EAAU,KAAY,EACrG,OAAgB;QADpC,YAEE,kBAAM,WAAW,CAAC,SACnB;QAH+C,iBAAW,GAAX,WAAW,CAAwC;QAAU,WAAK,GAAL,KAAK,CAAO;QACrG,aAAO,GAAP,OAAO,CAAS;QAZ5B,WAAK,GAAW,CAAC,CAAC;;IAc1B,CAAC;IAZD,sBAAI,gCAAI;aAAR;YACE,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;aAED,UAAS,KAAY;YACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;;;OALA;IAYS,8BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;aAAM;YACL,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAC7B;IACH,CAAC;IAEO,iCAAQ,GAAhB,UAAiB,KAAQ;QACvB,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,MAAW,CAAC;QAChB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,WAAW,CAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SACvD;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;QACD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACH,qBAAC;AAAD,CAAC,AArCD,CAAmC,uBAAU,GAqC5C"}
diff --git a/node_modules/rxjs/internal/operators/sequenceEqual.d.ts b/node_modules/rxjs/internal/operators/sequenceEqual.d.ts
deleted file mode 100644
index 67ee97b..0000000
--- a/node_modules/rxjs/internal/operators/sequenceEqual.d.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Observer, OperatorFunction } from '../types';
-/**
- * Compares all values of two observables in sequence using an optional comparator function
- * and returns an observable of a single boolean value representing whether or not the two sequences
- * are equal.
- *
- * <span class="informal">Checks to see of all values emitted by both observables are equal, in order.</span>
- *
- * ![](sequenceEqual.png)
- *
- * `sequenceEqual` subscribes to two observables and buffers incoming values from each observable. Whenever either
- * observable emits a value, the value is buffered and the buffers are shifted and compared from the bottom
- * up; If any value pair doesn't match, the returned observable will emit `false` and complete. If one of the
- * observables completes, the operator will wait for the other observable to complete; If the other
- * observable emits before completing, the returned observable will emit `false` and complete. If one observable never
- * completes or emits after the other complets, the returned observable will never complete.
- *
- * ## Example
- * figure out if the Konami code matches
- * ```ts
- * import { from, fromEvent } from 'rxjs';
- * import { sequenceEqual, bufferCount, mergeMap, map } from 'rxjs/operators';
- *
- * const codes = from([
- *   'ArrowUp',
- *   'ArrowUp',
- *   'ArrowDown',
- *   'ArrowDown',
- *   'ArrowLeft',
- *   'ArrowRight',
- *   'ArrowLeft',
- *   'ArrowRight',
- *   'KeyB',
- *   'KeyA',
- *   'Enter', // no start key, clearly.
- * ]);
- *
- * const keys = fromEvent(document, 'keyup').pipe(map(e => e.code));
- * const matches = keys.pipe(
- *   bufferCount(11, 1),
- *   mergeMap(
- *     last11 => from(last11).pipe(sequenceEqual(codes)),
- *   ),
- * );
- * matches.subscribe(matched => console.log('Successful cheat at Contra? ', matched));
- * ```
- *
- * @see {@link combineLatest}
- * @see {@link zip}
- * @see {@link withLatestFrom}
- *
- * @param {Observable} compareTo The observable sequence to compare the source sequence to.
- * @param {function} [comparator] An optional function to compare each value pair
- * @return {Observable} An Observable of a single boolean value representing whether or not
- * the values emitted by both observables were equal in sequence.
- * @method sequenceEqual
- * @owner Observable
- */
-export declare function sequenceEqual<T>(compareTo: Observable<T>, comparator?: (a: T, b: T) => boolean): OperatorFunction<T, boolean>;
-export declare class SequenceEqualOperator<T> implements Operator<T, boolean> {
-    private compareTo;
-    private comparator;
-    constructor(compareTo: Observable<T>, comparator: (a: T, b: T) => boolean);
-    call(subscriber: Subscriber<boolean>, source: any): any;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class SequenceEqualSubscriber<T, R> extends Subscriber<T> {
-    private compareTo;
-    private comparator;
-    private _a;
-    private _b;
-    private _oneComplete;
-    constructor(destination: Observer<R>, compareTo: Observable<T>, comparator: (a: T, b: T) => boolean);
-    protected _next(value: T): void;
-    _complete(): void;
-    checkValues(): void;
-    emit(value: boolean): void;
-    nextB(value: T): void;
-    completeB(): void;
-}
diff --git a/node_modules/rxjs/internal/operators/sequenceEqual.js b/node_modules/rxjs/internal/operators/sequenceEqual.js
deleted file mode 100644
index dbb6bce..0000000
--- a/node_modules/rxjs/internal/operators/sequenceEqual.js
+++ /dev/null
@@ -1,124 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function sequenceEqual(compareTo, comparator) {
-    return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); };
-}
-exports.sequenceEqual = sequenceEqual;
-var SequenceEqualOperator = (function () {
-    function SequenceEqualOperator(compareTo, comparator) {
-        this.compareTo = compareTo;
-        this.comparator = comparator;
-    }
-    SequenceEqualOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator));
-    };
-    return SequenceEqualOperator;
-}());
-exports.SequenceEqualOperator = SequenceEqualOperator;
-var SequenceEqualSubscriber = (function (_super) {
-    __extends(SequenceEqualSubscriber, _super);
-    function SequenceEqualSubscriber(destination, compareTo, comparator) {
-        var _this = _super.call(this, destination) || this;
-        _this.compareTo = compareTo;
-        _this.comparator = comparator;
-        _this._a = [];
-        _this._b = [];
-        _this._oneComplete = false;
-        _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this)));
-        return _this;
-    }
-    SequenceEqualSubscriber.prototype._next = function (value) {
-        if (this._oneComplete && this._b.length === 0) {
-            this.emit(false);
-        }
-        else {
-            this._a.push(value);
-            this.checkValues();
-        }
-    };
-    SequenceEqualSubscriber.prototype._complete = function () {
-        if (this._oneComplete) {
-            this.emit(this._a.length === 0 && this._b.length === 0);
-        }
-        else {
-            this._oneComplete = true;
-        }
-        this.unsubscribe();
-    };
-    SequenceEqualSubscriber.prototype.checkValues = function () {
-        var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator;
-        while (_a.length > 0 && _b.length > 0) {
-            var a = _a.shift();
-            var b = _b.shift();
-            var areEqual = false;
-            try {
-                areEqual = comparator ? comparator(a, b) : a === b;
-            }
-            catch (e) {
-                this.destination.error(e);
-            }
-            if (!areEqual) {
-                this.emit(false);
-            }
-        }
-    };
-    SequenceEqualSubscriber.prototype.emit = function (value) {
-        var destination = this.destination;
-        destination.next(value);
-        destination.complete();
-    };
-    SequenceEqualSubscriber.prototype.nextB = function (value) {
-        if (this._oneComplete && this._a.length === 0) {
-            this.emit(false);
-        }
-        else {
-            this._b.push(value);
-            this.checkValues();
-        }
-    };
-    SequenceEqualSubscriber.prototype.completeB = function () {
-        if (this._oneComplete) {
-            this.emit(this._a.length === 0 && this._b.length === 0);
-        }
-        else {
-            this._oneComplete = true;
-        }
-    };
-    return SequenceEqualSubscriber;
-}(Subscriber_1.Subscriber));
-exports.SequenceEqualSubscriber = SequenceEqualSubscriber;
-var SequenceEqualCompareToSubscriber = (function (_super) {
-    __extends(SequenceEqualCompareToSubscriber, _super);
-    function SequenceEqualCompareToSubscriber(destination, parent) {
-        var _this = _super.call(this, destination) || this;
-        _this.parent = parent;
-        return _this;
-    }
-    SequenceEqualCompareToSubscriber.prototype._next = function (value) {
-        this.parent.nextB(value);
-    };
-    SequenceEqualCompareToSubscriber.prototype._error = function (err) {
-        this.parent.error(err);
-        this.unsubscribe();
-    };
-    SequenceEqualCompareToSubscriber.prototype._complete = function () {
-        this.parent.completeB();
-        this.unsubscribe();
-    };
-    return SequenceEqualCompareToSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=sequenceEqual.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/sequenceEqual.js.map b/node_modules/rxjs/internal/operators/sequenceEqual.js.map
deleted file mode 100644
index 7ec29c1..0000000
--- a/node_modules/rxjs/internal/operators/sequenceEqual.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sequenceEqual.js","sources":["../../src/internal/operators/sequenceEqual.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/share.d.ts b/node_modules/rxjs/internal/operators/share.d.ts
deleted file mode 100644
index e8439ab..0000000
--- a/node_modules/rxjs/internal/operators/share.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one
- * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will
- * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.
- * This is an alias for `multicast(() => new Subject()), refCount()`.
- *
- * ![](share.png)
- *
- * @return {Observable<T>} An Observable that upon connection causes the source Observable to emit items to its Observers.
- * @method share
- * @owner Observable
- */
-export declare function share<T>(): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/share.js b/node_modules/rxjs/internal/operators/share.js
deleted file mode 100644
index 398eeb8..0000000
--- a/node_modules/rxjs/internal/operators/share.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var multicast_1 = require("./multicast");
-var refCount_1 = require("./refCount");
-var Subject_1 = require("../Subject");
-function shareSubjectFactory() {
-    return new Subject_1.Subject();
-}
-function share() {
-    return function (source) { return refCount_1.refCount()(multicast_1.multicast(shareSubjectFactory)(source)); };
-}
-exports.share = share;
-//# sourceMappingURL=share.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/share.js.map b/node_modules/rxjs/internal/operators/share.js.map
deleted file mode 100644
index aaf1dea..0000000
--- a/node_modules/rxjs/internal/operators/share.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"share.js","sources":["../../src/internal/operators/share.ts"],"names":[],"mappings":";;AACA,yCAAwC;AACxC,uCAAsC;AACtC,sCAAqC;AAIrC,SAAS,mBAAmB;IAC1B,OAAO,IAAI,iBAAO,EAAE,CAAC;AACvB,CAAC;AAcD,SAAgB,KAAK;IACnB,OAAO,UAAC,MAAqB,IAAK,OAAA,mBAAQ,EAAE,CAAC,qBAAS,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAkB,EAAnE,CAAmE,CAAC;AACxG,CAAC;AAFD,sBAEC"}
diff --git a/node_modules/rxjs/internal/operators/shareReplay.d.ts b/node_modules/rxjs/internal/operators/shareReplay.d.ts
deleted file mode 100644
index 2b52778..0000000
--- a/node_modules/rxjs/internal/operators/shareReplay.d.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
-export interface ShareReplayConfig {
-    bufferSize?: number;
-    windowTime?: number;
-    refCount: boolean;
-    scheduler?: SchedulerLike;
-}
-/**
- * Share source and replay specified number of emissions on subscription.
- *
- * This operator is a specialization of `replay` that connects to a source observable
- * and multicasts through a `ReplaySubject` constructed with the specified arguments.
- * A successfully completed source will stay cached in the `shareReplayed observable` forever,
- * but an errored source can be retried.
- *
- * ## Why use shareReplay?
- * You generally want to use `shareReplay` when you have side-effects or taxing computations
- * that you do not wish to be executed amongst multiple subscribers.
- * It may also be valuable in situations where you know you will have late subscribers to
- * a stream that need access to previously emitted values.
- * This ability to replay values on subscription is what differentiates {@link share} and `shareReplay`.
- *
- * ![](shareReplay.png)
- *
- * ## Example
- * ```ts
- * import { interval } from 'rxjs';
- * import { shareReplay, take } from 'rxjs/operators';
- *
- * const obs$ = interval(1000);
- * const shared$ = obs$.pipe(
- *   take(4),
- *   shareReplay(3)
- * );
- * shared$.subscribe(x => console.log('source A: ', x));
- * shared$.subscribe(y => console.log('source B: ', y));
- *
- * ```
- *
- * @see {@link publish}
- * @see {@link share}
- * @see {@link publishReplay}
- *
- * @param {Number} [bufferSize=Number.POSITIVE_INFINITY] Maximum element count of the replay buffer.
- * @param {Number} [windowTime=Number.POSITIVE_INFINITY] Maximum time length of the replay buffer in milliseconds.
- * @param {Scheduler} [scheduler] Scheduler where connected observers within the selector function
- * will be invoked on.
- * @return {Observable} An observable sequence that contains the elements of a sequence produced
- * by multicasting the source sequence within a selector function.
- * @method shareReplay
- * @owner Observable
- */
-export declare function shareReplay<T>(config: ShareReplayConfig): MonoTypeOperatorFunction<T>;
-export declare function shareReplay<T>(bufferSize?: number, windowTime?: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/shareReplay.js b/node_modules/rxjs/internal/operators/shareReplay.js
deleted file mode 100644
index 93d515b..0000000
--- a/node_modules/rxjs/internal/operators/shareReplay.js
+++ /dev/null
@@ -1,57 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ReplaySubject_1 = require("../ReplaySubject");
-function shareReplay(configOrBufferSize, windowTime, scheduler) {
-    var config;
-    if (configOrBufferSize && typeof configOrBufferSize === 'object') {
-        config = configOrBufferSize;
-    }
-    else {
-        config = {
-            bufferSize: configOrBufferSize,
-            windowTime: windowTime,
-            refCount: false,
-            scheduler: scheduler
-        };
-    }
-    return function (source) { return source.lift(shareReplayOperator(config)); };
-}
-exports.shareReplay = shareReplay;
-function shareReplayOperator(_a) {
-    var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler;
-    var subject;
-    var refCount = 0;
-    var subscription;
-    var hasError = false;
-    var isComplete = false;
-    return function shareReplayOperation(source) {
-        refCount++;
-        if (!subject || hasError) {
-            hasError = false;
-            subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
-            subscription = source.subscribe({
-                next: function (value) { subject.next(value); },
-                error: function (err) {
-                    hasError = true;
-                    subject.error(err);
-                },
-                complete: function () {
-                    isComplete = true;
-                    subscription = undefined;
-                    subject.complete();
-                },
-            });
-        }
-        var innerSub = subject.subscribe(this);
-        this.add(function () {
-            refCount--;
-            innerSub.unsubscribe();
-            if (subscription && !isComplete && useRefCount && refCount === 0) {
-                subscription.unsubscribe();
-                subscription = undefined;
-                subject = undefined;
-            }
-        });
-    };
-}
-//# sourceMappingURL=shareReplay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/shareReplay.js.map b/node_modules/rxjs/internal/operators/shareReplay.js.map
deleted file mode 100644
index 2d5df70..0000000
--- a/node_modules/rxjs/internal/operators/shareReplay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"shareReplay.js","sources":["../../src/internal/operators/shareReplay.ts"],"names":[],"mappings":";;AACA,kDAAiD;AA2DjD,SAAgB,WAAW,CACzB,kBAA+C,EAC/C,UAAmB,EACnB,SAAyB;IAEzB,IAAI,MAAyB,CAAC;IAC9B,IAAI,kBAAkB,IAAI,OAAO,kBAAkB,KAAK,QAAQ,EAAE;QAChE,MAAM,GAAG,kBAAuC,CAAC;KAClD;SAAM;QACL,MAAM,GAAG;YACP,UAAU,EAAE,kBAAwC;YACpD,UAAU,YAAA;YACV,QAAQ,EAAE,KAAK;YACf,SAAS,WAAA;SACV,CAAC;KACH;IACD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,EAAxC,CAAwC,CAAC;AAC7E,CAAC;AAjBD,kCAiBC;AAED,SAAS,mBAAmB,CAAI,EAKZ;QAJlB,kBAAqC,EAArC,0DAAqC,EACrC,kBAAqC,EAArC,0DAAqC,EACrC,yBAAqB,EACrB,wBAAS;IAET,IAAI,OAAqC,CAAC;IAC1C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,YAAsC,CAAC;IAC3C,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,OAAO,SAAS,oBAAoB,CAAsB,MAAqB;QAC7E,QAAQ,EAAE,CAAC;QACX,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE;YACxB,QAAQ,GAAG,KAAK,CAAC;YACjB,OAAO,GAAG,IAAI,6BAAa,CAAI,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;YAClE,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC;gBAC9B,IAAI,YAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACpC,KAAK,YAAC,GAAG;oBACP,QAAQ,GAAG,IAAI,CAAC;oBAChB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,QAAQ;oBACN,UAAU,GAAG,IAAI,CAAC;oBAClB,YAAY,GAAG,SAAS,CAAC;oBACzB,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,CAAC;aACF,CAAC,CAAC;SACJ;QAED,IAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC;YACP,QAAQ,EAAE,CAAC;YACX,QAAQ,CAAC,WAAW,EAAE,CAAC;YACvB,IAAI,YAAY,IAAI,CAAC,UAAU,IAAI,WAAW,IAAI,QAAQ,KAAK,CAAC,EAAE;gBAChE,YAAY,CAAC,WAAW,EAAE,CAAC;gBAC3B,YAAY,GAAG,SAAS,CAAC;gBACzB,OAAO,GAAG,SAAS,CAAC;aACrB;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
diff --git a/node_modules/rxjs/internal/operators/single.d.ts b/node_modules/rxjs/internal/operators/single.d.ts
deleted file mode 100644
index d5deef7..0000000
--- a/node_modules/rxjs/internal/operators/single.d.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Returns an Observable that emits the single item emitted by the source Observable that matches a specified
- * predicate, if that Observable emits one such item. If the source Observable emits more than one such item or no
- * items, notify of an IllegalArgumentException or NoSuchElementException respectively. If the source Observable
- * emits items but none match the specified predicate then `undefined` is emitted.
- *
- * <span class="informal">Like {@link first}, but emit with error notification if there is more than one value.</span>
- * ![](single.png)
- *
- * ## Example
- * emits 'error'
- * ```ts
- * import { range } from 'rxjs';
- * import { single } from 'rxjs/operators';
- *
- * const numbers = range(1,5).pipe(single());
- * numbers.subscribe(x => console.log('never get called'), e => console.log('error'));
- * // result
- * // 'error'
- * ```
- *
- * emits 'undefined'
- * ```ts
- * import { range } from 'rxjs';
- * import { single } from 'rxjs/operators';
- *
- * const numbers = range(1,5).pipe(single(x => x === 10));
- * numbers.subscribe(x => console.log(x));
- * // result
- * // 'undefined'
- * ```
- *
- * @see {@link first}
- * @see {@link find}
- * @see {@link findIndex}
- * @see {@link elementAt}
- *
- * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
- * callback if the Observable completes before any `next` notification was sent.
- * @param {Function} predicate - A predicate function to evaluate items emitted by the source Observable.
- * @return {Observable<T>} An Observable that emits the single item emitted by the source Observable that matches
- * the predicate or `undefined` when no items match.
- *
- * @method single
- * @owner Observable
- */
-export declare function single<T>(predicate?: (value: T, index: number, source: Observable<T>) => boolean): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/single.js b/node_modules/rxjs/internal/operators/single.js
deleted file mode 100644
index b99c2d8..0000000
--- a/node_modules/rxjs/internal/operators/single.js
+++ /dev/null
@@ -1,82 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var EmptyError_1 = require("../util/EmptyError");
-function single(predicate) {
-    return function (source) { return source.lift(new SingleOperator(predicate, source)); };
-}
-exports.single = single;
-var SingleOperator = (function () {
-    function SingleOperator(predicate, source) {
-        this.predicate = predicate;
-        this.source = source;
-    }
-    SingleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));
-    };
-    return SingleOperator;
-}());
-var SingleSubscriber = (function (_super) {
-    __extends(SingleSubscriber, _super);
-    function SingleSubscriber(destination, predicate, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.source = source;
-        _this.seenValue = false;
-        _this.index = 0;
-        return _this;
-    }
-    SingleSubscriber.prototype.applySingleValue = function (value) {
-        if (this.seenValue) {
-            this.destination.error('Sequence contains more than one element');
-        }
-        else {
-            this.seenValue = true;
-            this.singleValue = value;
-        }
-    };
-    SingleSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        if (this.predicate) {
-            this.tryNext(value, index);
-        }
-        else {
-            this.applySingleValue(value);
-        }
-    };
-    SingleSubscriber.prototype.tryNext = function (value, index) {
-        try {
-            if (this.predicate(value, index, this.source)) {
-                this.applySingleValue(value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    SingleSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        if (this.index > 0) {
-            destination.next(this.seenValue ? this.singleValue : undefined);
-            destination.complete();
-        }
-        else {
-            destination.error(new EmptyError_1.EmptyError);
-        }
-    };
-    return SingleSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=single.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/single.js.map b/node_modules/rxjs/internal/operators/single.js.map
deleted file mode 100644
index 1ad14fb..0000000
--- a/node_modules/rxjs/internal/operators/single.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"single.js","sources":["../../src/internal/operators/single.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AAC3C,iDAAgD;AAkDhD,SAAgB,MAAM,CAAI,SAAuE;IAC/F,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAlD,CAAkD,CAAC;AACvF,CAAC;AAFD,wBAEC;AAED;IACE,wBAAoB,SAAuE,EACvE,MAAsB;QADtB,cAAS,GAAT,SAAS,CAA8D;QACvE,WAAM,GAAN,MAAM,CAAgB;IAC1C,CAAC;IAED,6BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACzF,CAAC;IACH,qBAAC;AAAD,CAAC,AARD,IAQC;AAOD;IAAkC,oCAAa;IAK7C,0BAAY,WAAwB,EAChB,SAAuE,EACvE,MAAsB;QAF1C,YAGE,kBAAM,WAAW,CAAC,SACnB;QAHmB,eAAS,GAAT,SAAS,CAA8D;QACvE,YAAM,GAAN,MAAM,CAAgB;QANlC,eAAS,GAAY,KAAK,CAAC;QAE3B,WAAK,GAAW,CAAC,CAAC;;IAM1B,CAAC;IAEO,2CAAgB,GAAxB,UAAyB,KAAQ;QAC/B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;SACnE;aAAM;YACL,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;SAC1B;IACH,CAAC;IAES,gCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SAC5B;aAAM;YACL,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC9B;IACH,CAAC;IAEO,kCAAO,GAAf,UAAgB,KAAQ,EAAE,KAAa;QACrC,IAAI;YACF,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;gBAC7C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;aAC9B;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;IACH,CAAC;IAES,oCAAS,GAAnB;QACE,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAErC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;YAClB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAChE,WAAW,CAAC,QAAQ,EAAE,CAAC;SACxB;aAAM;YACL,WAAW,CAAC,KAAK,CAAC,IAAI,uBAAU,CAAC,CAAC;SACnC;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAlDD,CAAkC,uBAAU,GAkD3C"}
diff --git a/node_modules/rxjs/internal/operators/skip.d.ts b/node_modules/rxjs/internal/operators/skip.d.ts
deleted file mode 100644
index dedad7d..0000000
--- a/node_modules/rxjs/internal/operators/skip.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Returns an Observable that skips the first `count` items emitted by the source Observable.
- *
- * ![](skip.png)
- *
- * @param {Number} count - The number of times, items emitted by source Observable should be skipped.
- * @return {Observable} An Observable that skips values emitted by the source Observable.
- *
- * @method skip
- * @owner Observable
- */
-export declare function skip<T>(count: number): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/skip.js b/node_modules/rxjs/internal/operators/skip.js
deleted file mode 100644
index 0bd54a0..0000000
--- a/node_modules/rxjs/internal/operators/skip.js
+++ /dev/null
@@ -1,45 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function skip(count) {
-    return function (source) { return source.lift(new SkipOperator(count)); };
-}
-exports.skip = skip;
-var SkipOperator = (function () {
-    function SkipOperator(total) {
-        this.total = total;
-    }
-    SkipOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SkipSubscriber(subscriber, this.total));
-    };
-    return SkipOperator;
-}());
-var SkipSubscriber = (function (_super) {
-    __extends(SkipSubscriber, _super);
-    function SkipSubscriber(destination, total) {
-        var _this = _super.call(this, destination) || this;
-        _this.total = total;
-        _this.count = 0;
-        return _this;
-    }
-    SkipSubscriber.prototype._next = function (x) {
-        if (++this.count > this.total) {
-            this.destination.next(x);
-        }
-    };
-    return SkipSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=skip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/skip.js.map b/node_modules/rxjs/internal/operators/skip.js.map
deleted file mode 100644
index 5a7a06e..0000000
--- a/node_modules/rxjs/internal/operators/skip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skip.js","sources":["../../src/internal/operators/skip.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AAe3C,SAAgB,IAAI,CAAI,KAAa;IACnC,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,EAApC,CAAoC,CAAC;AACzE,CAAC;AAFD,oBAEC;AAED;IACE,sBAAoB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IACjC,CAAC;IAED,2BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IACH,mBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAgC,kCAAa;IAG3C,wBAAY,WAA0B,EAAU,KAAa;QAA7D,YACE,kBAAM,WAAW,CAAC,SACnB;QAF+C,WAAK,GAAL,KAAK,CAAQ;QAF7D,WAAK,GAAW,CAAC,CAAC;;IAIlB,CAAC;IAES,8BAAK,GAAf,UAAgB,CAAI;QAClB,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;YAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC1B;IACH,CAAC;IACH,qBAAC;AAAD,CAAC,AAZD,CAAgC,uBAAU,GAYzC"}
diff --git a/node_modules/rxjs/internal/operators/skipLast.d.ts b/node_modules/rxjs/internal/operators/skipLast.d.ts
deleted file mode 100644
index 46ab8c2..0000000
--- a/node_modules/rxjs/internal/operators/skipLast.d.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Skip the last `count` values emitted by the source Observable.
- *
- * ![](skipLast.png)
- *
- * `skipLast` returns an Observable that accumulates a queue with a length
- * enough to store the first `count` values. As more values are received,
- * values are taken from the front of the queue and produced on the result
- * sequence. This causes values to be delayed.
- *
- * ## Example
- * Skip the last 2 values of an Observable with many values
- * ```ts
- * import { range } from 'rxjs';
- * import { skipLast } from 'rxjs/operators';
- *
- * const many = range(1, 5);
- * const skipLastTwo = many.pipe(skipLast(2));
- * skipLastTwo.subscribe(x => console.log(x));
- *
- * // Results in:
- * // 1 2 3
- * ```
- *
- * @see {@link skip}
- * @see {@link skipUntil}
- * @see {@link skipWhile}
- * @see {@link take}
- *
- * @throws {ArgumentOutOfRangeError} When using `skipLast(i)`, it throws
- * ArgumentOutOrRangeError if `i < 0`.
- *
- * @param {number} count Number of elements to skip from the end of the source Observable.
- * @returns {Observable<T>} An Observable that skips the last count values
- * emitted by the source Observable.
- * @method skipLast
- * @owner Observable
- */
-export declare function skipLast<T>(count: number): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/skipLast.js b/node_modules/rxjs/internal/operators/skipLast.js
deleted file mode 100644
index 4e407ab..0000000
--- a/node_modules/rxjs/internal/operators/skipLast.js
+++ /dev/null
@@ -1,64 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
-function skipLast(count) {
-    return function (source) { return source.lift(new SkipLastOperator(count)); };
-}
-exports.skipLast = skipLast;
-var SkipLastOperator = (function () {
-    function SkipLastOperator(_skipCount) {
-        this._skipCount = _skipCount;
-        if (this._skipCount < 0) {
-            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-        }
-    }
-    SkipLastOperator.prototype.call = function (subscriber, source) {
-        if (this._skipCount === 0) {
-            return source.subscribe(new Subscriber_1.Subscriber(subscriber));
-        }
-        else {
-            return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount));
-        }
-    };
-    return SkipLastOperator;
-}());
-var SkipLastSubscriber = (function (_super) {
-    __extends(SkipLastSubscriber, _super);
-    function SkipLastSubscriber(destination, _skipCount) {
-        var _this = _super.call(this, destination) || this;
-        _this._skipCount = _skipCount;
-        _this._count = 0;
-        _this._ring = new Array(_skipCount);
-        return _this;
-    }
-    SkipLastSubscriber.prototype._next = function (value) {
-        var skipCount = this._skipCount;
-        var count = this._count++;
-        if (count < skipCount) {
-            this._ring[count] = value;
-        }
-        else {
-            var currentIndex = count % skipCount;
-            var ring = this._ring;
-            var oldValue = ring[currentIndex];
-            ring[currentIndex] = value;
-            this.destination.next(oldValue);
-        }
-    };
-    return SkipLastSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=skipLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/skipLast.js.map b/node_modules/rxjs/internal/operators/skipLast.js.map
deleted file mode 100644
index aa08a67..0000000
--- a/node_modules/rxjs/internal/operators/skipLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipLast.js","sources":["../../src/internal/operators/skipLast.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AAC3C,2EAA0E;AA0C1E,SAAgB,QAAQ,CAAI,KAAa;IACvC,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAxC,CAAwC,CAAC;AAC7E,CAAC;AAFD,4BAEC;AAED;IACE,0BAAoB,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;QACpC,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE;YACvB,MAAM,IAAI,iDAAuB,CAAC;SACnC;IACH,CAAC;IAED,+BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;YAGzB,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,uBAAU,CAAC,UAAU,CAAC,CAAC,CAAC;SACrD;aAAM;YACL,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;SAC9E;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAhBD,IAgBC;AAOD;IAAoC,sCAAa;IAI/C,4BAAY,WAA0B,EAAU,UAAkB;QAAlE,YACE,kBAAM,WAAW,CAAC,SAEnB;QAH+C,gBAAU,GAAV,UAAU,CAAQ;QAF1D,YAAM,GAAW,CAAC,CAAC;QAIzB,KAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAI,UAAU,CAAC,CAAC;;IACxC,CAAC;IAES,kCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAE5B,IAAI,KAAK,GAAG,SAAS,EAAE;YACrB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;SAC3B;aAAM;YACL,IAAM,YAAY,GAAG,KAAK,GAAG,SAAS,CAAC;YACvC,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YACxB,IAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;YAEpC,IAAI,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACjC;IACH,CAAC;IACH,yBAAC;AAAD,CAAC,AAxBD,CAAoC,uBAAU,GAwB7C"}
diff --git a/node_modules/rxjs/internal/operators/skipUntil.d.ts b/node_modules/rxjs/internal/operators/skipUntil.d.ts
deleted file mode 100644
index bd9be1b..0000000
--- a/node_modules/rxjs/internal/operators/skipUntil.d.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item.
- *
- * The `skipUntil` operator causes the observable stream to skip the emission of values ​​until the passed in observable emits the first value.
- * This can be particularly useful in combination with user interactions, responses of http requests or waiting for specific times to pass by.
- *
- * ![](skipUntil.png)
- *
- * Internally the `skipUntil` operator subscribes to the passed in observable (in the following called *notifier*) in order to recognize the emission
- * of its first value. When this happens, the operator unsubscribes from the *notifier* and starts emitting the values of the *source*
- * observable. It will never let the *source* observable emit any values if the *notifier* completes or throws an error without emitting
- * a value before.
- *
- * ## Example
- *
- * In the following example, all emitted values ​​of the interval observable are skipped until the user clicks anywhere within the page.
- *
- * ```ts
- * import { interval, fromEvent } from 'rxjs';
- * import { skipUntil } from 'rxjs/operators';
- *
- * const intervalObservable = interval(1000);
- * const click = fromEvent(document, 'click');
- *
- * const emitAfterClick = intervalObservable.pipe(
- *   skipUntil(click)
- * );
- * // clicked at 4.6s. output: 5...6...7...8........ or
- * // clicked at 7.3s. output: 8...9...10..11.......
- * const subscribe = emitAfterClick.subscribe(value => console.log(value));
- * ```
- *
- * @param {Observable} notifier - The second Observable that has to emit an item before the source Observable's elements begin to
- * be mirrored by the resulting Observable.
- * @return {Observable<T>} An Observable that skips items from the source Observable until the second Observable emits
- * an item, then emits the remaining items.
- * @method skipUntil
- * @owner Observable
- */
-export declare function skipUntil<T>(notifier: Observable<any>): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/skipUntil.js b/node_modules/rxjs/internal/operators/skipUntil.js
deleted file mode 100644
index fefbdd7..0000000
--- a/node_modules/rxjs/internal/operators/skipUntil.js
+++ /dev/null
@@ -1,62 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function skipUntil(notifier) {
-    return function (source) { return source.lift(new SkipUntilOperator(notifier)); };
-}
-exports.skipUntil = skipUntil;
-var SkipUntilOperator = (function () {
-    function SkipUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    SkipUntilOperator.prototype.call = function (destination, source) {
-        return source.subscribe(new SkipUntilSubscriber(destination, this.notifier));
-    };
-    return SkipUntilOperator;
-}());
-var SkipUntilSubscriber = (function (_super) {
-    __extends(SkipUntilSubscriber, _super);
-    function SkipUntilSubscriber(destination, notifier) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasValue = false;
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(_this, undefined, undefined);
-        _this.add(innerSubscriber);
-        _this.innerSubscription = innerSubscriber;
-        var innerSubscription = subscribeToResult_1.subscribeToResult(_this, notifier, undefined, undefined, innerSubscriber);
-        if (innerSubscription !== innerSubscriber) {
-            _this.add(innerSubscription);
-            _this.innerSubscription = innerSubscription;
-        }
-        return _this;
-    }
-    SkipUntilSubscriber.prototype._next = function (value) {
-        if (this.hasValue) {
-            _super.prototype._next.call(this, value);
-        }
-    };
-    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.hasValue = true;
-        if (this.innerSubscription) {
-            this.innerSubscription.unsubscribe();
-        }
-    };
-    SkipUntilSubscriber.prototype.notifyComplete = function () {
-    };
-    return SkipUntilSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=skipUntil.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/skipUntil.js.map b/node_modules/rxjs/internal/operators/skipUntil.js.map
deleted file mode 100644
index 871b4cc..0000000
--- a/node_modules/rxjs/internal/operators/skipUntil.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipUntil.js","sources":["../../src/internal/operators/skipUntil.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,sDAAqD;AACrD,sDAAqD;AACrD,+DAA8D;AA2C9D,SAAgB,SAAS,CAAI,QAAyB;IACpD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAA5C,CAA4C,CAAC;AACjF,CAAC;AAFD,8BAEC;AAED;IACE,2BAAoB,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAC7C,CAAC;IAED,gCAAI,GAAJ,UAAK,WAA0B,EAAE,MAAW;QAC1C,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/E,CAAC;IACH,wBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAwC,uCAAqB;IAK3D,6BAAY,WAA0B,EAAE,QAA8B;QAAtE,YACE,kBAAM,WAAW,CAAC,SAYnB;QAhBO,cAAQ,GAAY,KAAK,CAAC;QAKhC,IAAM,eAAe,GAAG,IAAI,iCAAe,CAAC,KAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACxE,KAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC1B,KAAI,CAAC,iBAAiB,GAAG,eAAe,CAAC;QACzC,IAAM,iBAAiB,GAAG,qCAAiB,CAAC,KAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAInG,IAAI,iBAAiB,KAAK,eAAe,EAAE;YACzC,KAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC5B,KAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;SAC5C;;IACH,CAAC;IAES,mCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,iBAAM,KAAK,YAAC,KAAK,CAAC,CAAC;SACpB;IACH,CAAC;IAED,wCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC;SACtC;IACH,CAAC;IAED,4CAAc,GAAd;IAEA,CAAC;IACH,0BAAC;AAAD,CAAC,AAtCD,CAAwC,iCAAe,GAsCtD"}
diff --git a/node_modules/rxjs/internal/operators/skipWhile.d.ts b/node_modules/rxjs/internal/operators/skipWhile.d.ts
deleted file mode 100644
index a5ae21b..0000000
--- a/node_modules/rxjs/internal/operators/skipWhile.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds
- * true, but emits all further source items as soon as the condition becomes false.
- *
- * ![](skipWhile.png)
- *
- * @param {Function} predicate - A function to test each item emitted from the source Observable.
- * @return {Observable<T>} An Observable that begins emitting items emitted by the source Observable when the
- * specified predicate becomes false.
- * @method skipWhile
- * @owner Observable
- */
-export declare function skipWhile<T>(predicate: (value: T, index: number) => boolean): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/skipWhile.js b/node_modules/rxjs/internal/operators/skipWhile.js
deleted file mode 100644
index 8196342..0000000
--- a/node_modules/rxjs/internal/operators/skipWhile.js
+++ /dev/null
@@ -1,59 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function skipWhile(predicate) {
-    return function (source) { return source.lift(new SkipWhileOperator(predicate)); };
-}
-exports.skipWhile = skipWhile;
-var SkipWhileOperator = (function () {
-    function SkipWhileOperator(predicate) {
-        this.predicate = predicate;
-    }
-    SkipWhileOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));
-    };
-    return SkipWhileOperator;
-}());
-var SkipWhileSubscriber = (function (_super) {
-    __extends(SkipWhileSubscriber, _super);
-    function SkipWhileSubscriber(destination, predicate) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.skipping = true;
-        _this.index = 0;
-        return _this;
-    }
-    SkipWhileSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        if (this.skipping) {
-            this.tryCallPredicate(value);
-        }
-        if (!this.skipping) {
-            destination.next(value);
-        }
-    };
-    SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {
-        try {
-            var result = this.predicate(value, this.index++);
-            this.skipping = Boolean(result);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    return SkipWhileSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=skipWhile.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/skipWhile.js.map b/node_modules/rxjs/internal/operators/skipWhile.js.map
deleted file mode 100644
index f22aaca..0000000
--- a/node_modules/rxjs/internal/operators/skipWhile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipWhile.js","sources":["../../src/internal/operators/skipWhile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AAe3C,SAAgB,SAAS,CAAI,SAA+C;IAC1E,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAA7C,CAA6C,CAAC;AAClF,CAAC;AAFD,8BAEC;AAED;IACE,2BAAoB,SAA+C;QAA/C,cAAS,GAAT,SAAS,CAAsC;IACnE,CAAC;IAED,gCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/E,CAAC;IACH,wBAAC;AAAD,CAAC,AAPD,IAOC;AAOD;IAAqC,uCAAa;IAIhD,6BAAY,WAA0B,EAClB,SAA+C;QADnE,YAEE,kBAAM,WAAW,CAAC,SACnB;QAFmB,eAAS,GAAT,SAAS,CAAsC;QAJ3D,cAAQ,GAAY,IAAI,CAAC;QACzB,WAAK,GAAW,CAAC,CAAC;;IAK1B,CAAC;IAES,mCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC9B;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACzB;IACH,CAAC;IAEO,8CAAgB,GAAxB,UAAyB,KAAQ;QAC/B,IAAI;YACF,IAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;SACjC;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;IACH,CAAC;IACH,0BAAC;AAAD,CAAC,AA5BD,CAAqC,uBAAU,GA4B9C"}
diff --git a/node_modules/rxjs/internal/operators/startWith.d.ts b/node_modules/rxjs/internal/operators/startWith.d.ts
deleted file mode 100644
index e3c2c8c..0000000
--- a/node_modules/rxjs/internal/operators/startWith.d.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { MonoTypeOperatorFunction, OperatorFunction, SchedulerLike } from '../types';
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export declare function startWith<T>(scheduler: SchedulerLike): MonoTypeOperatorFunction<T>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export declare function startWith<T, D>(v1: D, scheduler: SchedulerLike): OperatorFunction<T, T | D>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export declare function startWith<T, D, E>(v1: D, v2: E, scheduler: SchedulerLike): OperatorFunction<T, T | D | E>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export declare function startWith<T, D, E, F>(v1: D, v2: E, v3: F, scheduler: SchedulerLike): OperatorFunction<T, T | D | E | F>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export declare function startWith<T, D, E, F, G>(v1: D, v2: E, v3: F, v4: G, scheduler: SchedulerLike): OperatorFunction<T, T | D | E | F | G>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export declare function startWith<T, D, E, F, G, H>(v1: D, v2: E, v3: F, v4: G, v5: H, scheduler: SchedulerLike): OperatorFunction<T, T | D | E | F | G | H>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export declare function startWith<T, D, E, F, G, H, I>(v1: D, v2: E, v3: F, v4: G, v5: H, v6: I, scheduler: SchedulerLike): OperatorFunction<T, T | D | E | F | G | H | I>;
-export declare function startWith<T, D>(v1: D): OperatorFunction<T, T | D>;
-export declare function startWith<T, D, E>(v1: D, v2: E): OperatorFunction<T, T | D | E>;
-export declare function startWith<T, D, E, F>(v1: D, v2: E, v3: F): OperatorFunction<T, T | D | E | F>;
-export declare function startWith<T, D, E, F, G>(v1: D, v2: E, v3: F, v4: G): OperatorFunction<T, T | D | E | F | G>;
-export declare function startWith<T, D, E, F, G, H>(v1: D, v2: E, v3: F, v4: G, v5: H): OperatorFunction<T, T | D | E | F | G | H>;
-export declare function startWith<T, D, E, F, G, H, I>(v1: D, v2: E, v3: F, v4: G, v5: H, v6: I): OperatorFunction<T, T | D | E | F | G | H | I>;
-export declare function startWith<T, D = T>(...array: D[]): OperatorFunction<T, T | D>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export declare function startWith<T, D = T>(...array: Array<D | SchedulerLike>): OperatorFunction<T, T | D>;
diff --git a/node_modules/rxjs/internal/operators/startWith.js b/node_modules/rxjs/internal/operators/startWith.js
deleted file mode 100644
index fd72f0c..0000000
--- a/node_modules/rxjs/internal/operators/startWith.js
+++ /dev/null
@@ -1,20 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var concat_1 = require("../observable/concat");
-var isScheduler_1 = require("../util/isScheduler");
-function startWith() {
-    var array = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        array[_i] = arguments[_i];
-    }
-    var scheduler = array[array.length - 1];
-    if (isScheduler_1.isScheduler(scheduler)) {
-        array.pop();
-        return function (source) { return concat_1.concat(array, source, scheduler); };
-    }
-    else {
-        return function (source) { return concat_1.concat(array, source); };
-    }
-}
-exports.startWith = startWith;
-//# sourceMappingURL=startWith.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/startWith.js.map b/node_modules/rxjs/internal/operators/startWith.js.map
deleted file mode 100644
index 542326a..0000000
--- a/node_modules/rxjs/internal/operators/startWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"startWith.js","sources":["../../src/internal/operators/startWith.ts"],"names":[],"mappings":";;AACA,+CAA8C;AAC9C,mDAAkD;AAiElD,SAAgB,SAAS;IAAO,eAAkC;SAAlC,UAAkC,EAAlC,qBAAkC,EAAlC,IAAkC;QAAlC,0BAAkC;;IAChE,IAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAkB,CAAC;IAC3D,IAAI,yBAAW,CAAC,SAAS,CAAC,EAAE;QAE1B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,OAAO,UAAC,MAAqB,IAAK,OAAA,eAAM,CAAC,KAAY,EAAE,MAAM,EAAE,SAAS,CAAC,EAAvC,CAAuC,CAAC;KAC3E;SAAM;QACL,OAAO,UAAC,MAAqB,IAAK,OAAA,eAAM,CAAC,KAAY,EAAE,MAAM,CAAC,EAA5B,CAA4B,CAAC;KAChE;AACH,CAAC;AATD,8BASC"}
diff --git a/node_modules/rxjs/internal/operators/subscribeOn.d.ts b/node_modules/rxjs/internal/operators/subscribeOn.d.ts
deleted file mode 100644
index b67954e..0000000
--- a/node_modules/rxjs/internal/operators/subscribeOn.d.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
-/**
- * Asynchronously subscribes Observers to this Observable on the specified {@link SchedulerLike}.
- *
- * With `subscribeOn` you can decide what type of scheduler a specific Observable will be using when it is subscribed to.
- *
- * Schedulers control the speed and order of emissions to observers from an Observable stream.
- *
- * ![](subscribeOn.png)
- *
- * ## Example
- * Given the following code:
- * ```javascript
- * import { of, merge } from 'rxjs';
- *
- * const a = of(1, 2, 3, 4);
- * const b = of(5, 6, 7, 8, 9);
- * merge(a, b).subscribe(console.log);
- * ```
- *
- * Both Observable `a` and `b` will emit their values directly and synchronously once they are subscribed to.
- * This will result in the output of `1 2 3 4 5 6 7 8 9`.
- *
- * But if we instead us the `subscribeOn` operator declaring that we want to use the {@link asyncScheduler} for values emited by Observable `a`:
- * ```javascript
- * import { of, merge, asyncScheduler } from 'rxjs';
- * import { subscribeOn } from 'rxjs/operators';
- *
- * const a = of(1, 2, 3, 4).pipe(subscribeOn(asyncScheduler));
- * const b = of(5, 6, 7, 8, 9);
- * merge(a, b).subscribe(console.log);
- * ```
- *
- * The output will instead be `5 6 7 8 9 1 2 3 4`.
- * The reason for this is that Observable `b` emits its values directly and synchronously like before
- * but the emissions from `a` are scheduled on the event loop because we are now using the {@link asyncScheduler} for that specific Observable.
- *
- * @param {SchedulerLike} scheduler - The {@link SchedulerLike} to perform subscription actions on.
- * @return {Observable<T>} The source Observable modified so that its subscriptions happen on the specified {@link SchedulerLike}.
- .
- * @method subscribeOn
- * @owner Observable
- */
-export declare function subscribeOn<T>(scheduler: SchedulerLike, delay?: number): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/subscribeOn.js b/node_modules/rxjs/internal/operators/subscribeOn.js
deleted file mode 100644
index 92042f5..0000000
--- a/node_modules/rxjs/internal/operators/subscribeOn.js
+++ /dev/null
@@ -1,21 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var SubscribeOnObservable_1 = require("../observable/SubscribeOnObservable");
-function subscribeOn(scheduler, delay) {
-    if (delay === void 0) { delay = 0; }
-    return function subscribeOnOperatorFunction(source) {
-        return source.lift(new SubscribeOnOperator(scheduler, delay));
-    };
-}
-exports.subscribeOn = subscribeOn;
-var SubscribeOnOperator = (function () {
-    function SubscribeOnOperator(scheduler, delay) {
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    SubscribeOnOperator.prototype.call = function (subscriber, source) {
-        return new SubscribeOnObservable_1.SubscribeOnObservable(source, this.delay, this.scheduler).subscribe(subscriber);
-    };
-    return SubscribeOnOperator;
-}());
-//# sourceMappingURL=subscribeOn.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/subscribeOn.js.map b/node_modules/rxjs/internal/operators/subscribeOn.js.map
deleted file mode 100644
index d4bd464..0000000
--- a/node_modules/rxjs/internal/operators/subscribeOn.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeOn.js","sources":["../../src/internal/operators/subscribeOn.ts"],"names":[],"mappings":";;AAGA,6EAA4E;AA6C5E,SAAgB,WAAW,CAAI,SAAwB,EAAE,KAAiB;IAAjB,sBAAA,EAAA,SAAiB;IACxE,OAAO,SAAS,2BAA2B,CAAC,MAAqB;QAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAI,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC;AACJ,CAAC;AAJD,kCAIC;AAED;IACE,6BAAoB,SAAwB,EACxB,KAAa;QADb,cAAS,GAAT,SAAS,CAAe;QACxB,UAAK,GAAL,KAAK,CAAQ;IACjC,CAAC;IACD,kCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,IAAI,6CAAqB,CAC9B,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CACnC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IACH,0BAAC;AAAD,CAAC,AATD,IASC"}
diff --git a/node_modules/rxjs/internal/operators/switchAll.d.ts b/node_modules/rxjs/internal/operators/switchAll.d.ts
deleted file mode 100644
index a184147..0000000
--- a/node_modules/rxjs/internal/operators/switchAll.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { OperatorFunction, ObservableInput } from '../types';
-export declare function switchAll<T>(): OperatorFunction<ObservableInput<T>, T>;
-export declare function switchAll<R>(): OperatorFunction<any, R>;
diff --git a/node_modules/rxjs/internal/operators/switchAll.js b/node_modules/rxjs/internal/operators/switchAll.js
deleted file mode 100644
index f01f86d..0000000
--- a/node_modules/rxjs/internal/operators/switchAll.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var switchMap_1 = require("./switchMap");
-var identity_1 = require("../util/identity");
-function switchAll() {
-    return switchMap_1.switchMap(identity_1.identity);
-}
-exports.switchAll = switchAll;
-//# sourceMappingURL=switchAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/switchAll.js.map b/node_modules/rxjs/internal/operators/switchAll.js.map
deleted file mode 100644
index 509b3ee..0000000
--- a/node_modules/rxjs/internal/operators/switchAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchAll.js","sources":["../../src/internal/operators/switchAll.ts"],"names":[],"mappings":";;AACA,yCAAwC;AACxC,6CAA4C;AA4D5C,SAAgB,SAAS;IACvB,OAAO,qBAAS,CAAC,mBAAQ,CAAC,CAAC;AAC7B,CAAC;AAFD,8BAEC"}
diff --git a/node_modules/rxjs/internal/operators/switchMap.d.ts b/node_modules/rxjs/internal/operators/switchMap.d.ts
deleted file mode 100644
index ecf9c96..0000000
--- a/node_modules/rxjs/internal/operators/switchMap.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-export declare function switchMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector is no longer supported, use inner map instead */
-export declare function switchMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: undefined): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector is no longer supported, use inner map instead */
-export declare function switchMap<T, R, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/switchMap.js b/node_modules/rxjs/internal/operators/switchMap.js
deleted file mode 100644
index f522e8c..0000000
--- a/node_modules/rxjs/internal/operators/switchMap.js
+++ /dev/null
@@ -1,93 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var map_1 = require("./map");
-var from_1 = require("../observable/from");
-function switchMap(project, resultSelector) {
-    if (typeof resultSelector === 'function') {
-        return function (source) { return source.pipe(switchMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
-    }
-    return function (source) { return source.lift(new SwitchMapOperator(project)); };
-}
-exports.switchMap = switchMap;
-var SwitchMapOperator = (function () {
-    function SwitchMapOperator(project) {
-        this.project = project;
-    }
-    SwitchMapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));
-    };
-    return SwitchMapOperator;
-}());
-var SwitchMapSubscriber = (function (_super) {
-    __extends(SwitchMapSubscriber, _super);
-    function SwitchMapSubscriber(destination, project) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.index = 0;
-        return _this;
-    }
-    SwitchMapSubscriber.prototype._next = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (error) {
-            this.destination.error(error);
-            return;
-        }
-        this._innerSub(result, value, index);
-    };
-    SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {
-        var innerSubscription = this.innerSubscription;
-        if (innerSubscription) {
-            innerSubscription.unsubscribe();
-        }
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, value, index);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-        if (this.innerSubscription !== innerSubscriber) {
-            destination.add(this.innerSubscription);
-        }
-    };
-    SwitchMapSubscriber.prototype._complete = function () {
-        var innerSubscription = this.innerSubscription;
-        if (!innerSubscription || innerSubscription.closed) {
-            _super.prototype._complete.call(this);
-        }
-        this.unsubscribe();
-    };
-    SwitchMapSubscriber.prototype._unsubscribe = function () {
-        this.innerSubscription = null;
-    };
-    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.innerSubscription = null;
-        if (this.isStopped) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    return SwitchMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=switchMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/switchMap.js.map b/node_modules/rxjs/internal/operators/switchMap.js.map
deleted file mode 100644
index f57106f..0000000
--- a/node_modules/rxjs/internal/operators/switchMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchMap.js","sources":["../../src/internal/operators/switchMap.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/switchMapTo.d.ts b/node_modules/rxjs/internal/operators/switchMapTo.d.ts
deleted file mode 100644
index 798178e..0000000
--- a/node_modules/rxjs/internal/operators/switchMapTo.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { ObservableInput, OperatorFunction } from '../types';
-export declare function switchMapTo<R>(observable: ObservableInput<R>): OperatorFunction<any, R>;
-/** @deprecated resultSelector is no longer supported. Switch to using switchMap with an inner map */
-export declare function switchMapTo<T, R>(observable: ObservableInput<R>, resultSelector: undefined): OperatorFunction<T, R>;
-/** @deprecated resultSelector is no longer supported. Switch to using switchMap with an inner map */
-export declare function switchMapTo<T, I, R>(observable: ObservableInput<I>, resultSelector: (outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/switchMapTo.js b/node_modules/rxjs/internal/operators/switchMapTo.js
deleted file mode 100644
index 2874b69..0000000
--- a/node_modules/rxjs/internal/operators/switchMapTo.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var switchMap_1 = require("./switchMap");
-function switchMapTo(innerObservable, resultSelector) {
-    return resultSelector ? switchMap_1.switchMap(function () { return innerObservable; }, resultSelector) : switchMap_1.switchMap(function () { return innerObservable; });
-}
-exports.switchMapTo = switchMapTo;
-//# sourceMappingURL=switchMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/switchMapTo.js.map b/node_modules/rxjs/internal/operators/switchMapTo.js.map
deleted file mode 100644
index 606527e..0000000
--- a/node_modules/rxjs/internal/operators/switchMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchMapTo.js","sources":["../../src/internal/operators/switchMapTo.ts"],"names":[],"mappings":";;AAQA,yCAAwC;AAkDxC,SAAgB,WAAW,CACzB,eAAmC,EACnC,cAA4F;IAE5F,OAAO,cAAc,CAAC,CAAC,CAAC,qBAAS,CAAC,cAAM,OAAA,eAAe,EAAf,CAAe,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,qBAAS,CAAC,cAAM,OAAA,eAAe,EAAf,CAAe,CAAC,CAAC;AAC9G,CAAC;AALD,kCAKC"}
diff --git a/node_modules/rxjs/internal/operators/take.d.ts b/node_modules/rxjs/internal/operators/take.d.ts
deleted file mode 100644
index 35ec284..0000000
--- a/node_modules/rxjs/internal/operators/take.d.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Emits only the first `count` values emitted by the source Observable.
- *
- * <span class="informal">Takes the first `count` values from the source, then
- * completes.</span>
- *
- * ![](take.png)
- *
- * `take` returns an Observable that emits only the first `count` values emitted
- * by the source Observable. If the source emits fewer than `count` values then
- * all of its values are emitted. After that, it completes, regardless if the
- * source completes.
- *
- * ## Example
- * Take the first 5 seconds of an infinite 1-second interval Observable
- * ```ts
- * import { interval } from 'rxjs';
- * import { take } from 'rxjs/operators';
- *
- * const intervalCount = interval(1000);
- * const takeFive = intervalCount.pipe(take(5));
- * takeFive.subscribe(x => console.log(x));
- *
- * // Logs:
- * // 0
- * // 1
- * // 2
- * // 3
- * // 4
- * ```
- *
- * @see {@link takeLast}
- * @see {@link takeUntil}
- * @see {@link takeWhile}
- * @see {@link skip}
- *
- * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an
- * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.
- *
- * @param {number} count The maximum number of `next` values to emit.
- * @return {Observable<T>} An Observable that emits only the first `count`
- * values emitted by the source Observable, or all of the values from the source
- * if the source emits fewer than `count` values.
- * @method take
- * @owner Observable
- */
-export declare function take<T>(count: number): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/take.js b/node_modules/rxjs/internal/operators/take.js
deleted file mode 100644
index 745296a..0000000
--- a/node_modules/rxjs/internal/operators/take.js
+++ /dev/null
@@ -1,63 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
-var empty_1 = require("../observable/empty");
-function take(count) {
-    return function (source) {
-        if (count === 0) {
-            return empty_1.empty();
-        }
-        else {
-            return source.lift(new TakeOperator(count));
-        }
-    };
-}
-exports.take = take;
-var TakeOperator = (function () {
-    function TakeOperator(total) {
-        this.total = total;
-        if (this.total < 0) {
-            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-        }
-    }
-    TakeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeSubscriber(subscriber, this.total));
-    };
-    return TakeOperator;
-}());
-var TakeSubscriber = (function (_super) {
-    __extends(TakeSubscriber, _super);
-    function TakeSubscriber(destination, total) {
-        var _this = _super.call(this, destination) || this;
-        _this.total = total;
-        _this.count = 0;
-        return _this;
-    }
-    TakeSubscriber.prototype._next = function (value) {
-        var total = this.total;
-        var count = ++this.count;
-        if (count <= total) {
-            this.destination.next(value);
-            if (count === total) {
-                this.destination.complete();
-                this.unsubscribe();
-            }
-        }
-    };
-    return TakeSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=take.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/take.js.map b/node_modules/rxjs/internal/operators/take.js.map
deleted file mode 100644
index 0f11175..0000000
--- a/node_modules/rxjs/internal/operators/take.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"take.js","sources":["../../src/internal/operators/take.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AAC3C,2EAA0E;AAC1E,6CAA4C;AAkD5C,SAAgB,IAAI,CAAI,KAAa;IACnC,OAAO,UAAC,MAAqB;QAC3B,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,OAAO,aAAK,EAAE,CAAC;SAChB;aAAM;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;SAC7C;IACH,CAAC,CAAC;AACJ,CAAC;AARD,oBAQC;AAED;IACE,sBAAoB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QAC/B,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;YAClB,MAAM,IAAI,iDAAuB,CAAC;SACnC;IACH,CAAC;IAED,2BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IACH,mBAAC;AAAD,CAAC,AAVD,IAUC;AAOD;IAAgC,kCAAa;IAG3C,wBAAY,WAA0B,EAAU,KAAa;QAA7D,YACE,kBAAM,WAAW,CAAC,SACnB;QAF+C,WAAK,GAAL,KAAK,CAAQ;QAFrD,WAAK,GAAW,CAAC,CAAC;;IAI1B,CAAC;IAES,8BAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAM,KAAK,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;QAC3B,IAAI,KAAK,IAAI,KAAK,EAAE;YAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,KAAK,KAAK,KAAK,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;aACpB;SACF;IACH,CAAC;IACH,qBAAC;AAAD,CAAC,AAlBD,CAAgC,uBAAU,GAkBzC"}
diff --git a/node_modules/rxjs/internal/operators/takeLast.d.ts b/node_modules/rxjs/internal/operators/takeLast.d.ts
deleted file mode 100644
index e6e127a..0000000
--- a/node_modules/rxjs/internal/operators/takeLast.d.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Emits only the last `count` values emitted by the source Observable.
- *
- * <span class="informal">Remembers the latest `count` values, then emits those
- * only when the source completes.</span>
- *
- * ![](takeLast.png)
- *
- * `takeLast` returns an Observable that emits at most the last `count` values
- * emitted by the source Observable. If the source emits fewer than `count`
- * values then all of its values are emitted. This operator must wait until the
- * `complete` notification emission from the source in order to emit the `next`
- * values on the output Observable, because otherwise it is impossible to know
- * whether or not more values will be emitted on the source. For this reason,
- * all values are emitted synchronously, followed by the complete notification.
- *
- * ## Example
- * Take the last 3 values of an Observable with many values
- * ```ts
- * import { range } from 'rxjs';
- * import { takeLast } from 'rxjs/operators';
- *
- * const many = range(1, 100);
- * const lastThree = many.pipe(takeLast(3));
- * lastThree.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link take}
- * @see {@link takeUntil}
- * @see {@link takeWhile}
- * @see {@link skip}
- *
- * @throws {ArgumentOutOfRangeError} When using `takeLast(i)`, it delivers an
- * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.
- *
- * @param {number} count The maximum number of values to emit from the end of
- * the sequence of values emitted by the source Observable.
- * @return {Observable<T>} An Observable that emits at most the last count
- * values emitted by the source Observable.
- * @method takeLast
- * @owner Observable
- */
-export declare function takeLast<T>(count: number): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/takeLast.js b/node_modules/rxjs/internal/operators/takeLast.js
deleted file mode 100644
index 8ab4475..0000000
--- a/node_modules/rxjs/internal/operators/takeLast.js
+++ /dev/null
@@ -1,78 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
-var empty_1 = require("../observable/empty");
-function takeLast(count) {
-    return function takeLastOperatorFunction(source) {
-        if (count === 0) {
-            return empty_1.empty();
-        }
-        else {
-            return source.lift(new TakeLastOperator(count));
-        }
-    };
-}
-exports.takeLast = takeLast;
-var TakeLastOperator = (function () {
-    function TakeLastOperator(total) {
-        this.total = total;
-        if (this.total < 0) {
-            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-        }
-    }
-    TakeLastOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeLastSubscriber(subscriber, this.total));
-    };
-    return TakeLastOperator;
-}());
-var TakeLastSubscriber = (function (_super) {
-    __extends(TakeLastSubscriber, _super);
-    function TakeLastSubscriber(destination, total) {
-        var _this = _super.call(this, destination) || this;
-        _this.total = total;
-        _this.ring = new Array();
-        _this.count = 0;
-        return _this;
-    }
-    TakeLastSubscriber.prototype._next = function (value) {
-        var ring = this.ring;
-        var total = this.total;
-        var count = this.count++;
-        if (ring.length < total) {
-            ring.push(value);
-        }
-        else {
-            var index = count % total;
-            ring[index] = value;
-        }
-    };
-    TakeLastSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        var count = this.count;
-        if (count > 0) {
-            var total = this.count >= this.total ? this.total : this.count;
-            var ring = this.ring;
-            for (var i = 0; i < total; i++) {
-                var idx = (count++) % total;
-                destination.next(ring[idx]);
-            }
-        }
-        destination.complete();
-    };
-    return TakeLastSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=takeLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/takeLast.js.map b/node_modules/rxjs/internal/operators/takeLast.js.map
deleted file mode 100644
index 9a6b3a8..0000000
--- a/node_modules/rxjs/internal/operators/takeLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeLast.js","sources":["../../src/internal/operators/takeLast.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,4CAA2C;AAC3C,2EAA0E;AAC1E,6CAA4C;AA8C5C,SAAgB,QAAQ,CAAI,KAAa;IACvC,OAAO,SAAS,wBAAwB,CAAC,MAAqB;QAC5D,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,OAAO,aAAK,EAAE,CAAC;SAChB;aAAM;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;SACjD;IACH,CAAC,CAAC;AACJ,CAAC;AARD,4BAQC;AAED;IACE,0BAAoB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QAC/B,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;YAClB,MAAM,IAAI,iDAAuB,CAAC;SACnC;IACH,CAAC;IAED,+BAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1E,CAAC;IACH,uBAAC;AAAD,CAAC,AAVD,IAUC;AAOD;IAAoC,sCAAa;IAI/C,4BAAY,WAA0B,EAAU,KAAa;QAA7D,YACE,kBAAM,WAAW,CAAC,SACnB;QAF+C,WAAK,GAAL,KAAK,CAAQ;QAHrD,UAAI,GAAa,IAAI,KAAK,EAAE,CAAC;QAC7B,WAAK,GAAW,CAAC,CAAC;;IAI1B,CAAC;IAES,kCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAClB;aAAM;YACL,IAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;SACrB;IACH,CAAC;IAES,sCAAS,GAAnB;QACE,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEvB,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YACjE,IAAM,IAAI,GAAI,IAAI,CAAC,IAAI,CAAC;YAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC9B,IAAM,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;gBAC9B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;aAC7B;SACF;QAED,WAAW,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IACH,yBAAC;AAAD,CAAC,AArCD,CAAoC,uBAAU,GAqC7C"}
diff --git a/node_modules/rxjs/internal/operators/takeUntil.d.ts b/node_modules/rxjs/internal/operators/takeUntil.d.ts
deleted file mode 100644
index 8bff772..0000000
--- a/node_modules/rxjs/internal/operators/takeUntil.d.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * Emits the values emitted by the source Observable until a `notifier`
- * Observable emits a value.
- *
- * <span class="informal">Lets values pass until a second Observable,
- * `notifier`, emits a value. Then, it completes.</span>
- *
- * ![](takeUntil.png)
- *
- * `takeUntil` subscribes and begins mirroring the source Observable. It also
- * monitors a second Observable, `notifier` that you provide. If the `notifier`
- * emits a value, the output Observable stops mirroring the source Observable
- * and completes. If the `notifier` doesn't emit any value and completes
- * then `takeUntil` will pass all values.
- *
- * ## Example
- * Tick every second until the first click happens
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { takeUntil } from 'rxjs/operators';
- *
- * const source = interval(1000);
- * const clicks = fromEvent(document, 'click');
- * const result = source.pipe(takeUntil(clicks));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link take}
- * @see {@link takeLast}
- * @see {@link takeWhile}
- * @see {@link skip}
- *
- * @param {Observable} notifier The Observable whose first emitted value will
- * cause the output Observable of `takeUntil` to stop emitting values from the
- * source Observable.
- * @return {Observable<T>} An Observable that emits the values from the source
- * Observable until such time as `notifier` emits its first value.
- * @method takeUntil
- * @owner Observable
- */
-export declare function takeUntil<T>(notifier: Observable<any>): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/takeUntil.js b/node_modules/rxjs/internal/operators/takeUntil.js
deleted file mode 100644
index 6add143..0000000
--- a/node_modules/rxjs/internal/operators/takeUntil.js
+++ /dev/null
@@ -1,52 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function takeUntil(notifier) {
-    return function (source) { return source.lift(new TakeUntilOperator(notifier)); };
-}
-exports.takeUntil = takeUntil;
-var TakeUntilOperator = (function () {
-    function TakeUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    TakeUntilOperator.prototype.call = function (subscriber, source) {
-        var takeUntilSubscriber = new TakeUntilSubscriber(subscriber);
-        var notifierSubscription = subscribeToResult_1.subscribeToResult(takeUntilSubscriber, this.notifier);
-        if (notifierSubscription && !takeUntilSubscriber.seenValue) {
-            takeUntilSubscriber.add(notifierSubscription);
-            return source.subscribe(takeUntilSubscriber);
-        }
-        return takeUntilSubscriber;
-    };
-    return TakeUntilOperator;
-}());
-var TakeUntilSubscriber = (function (_super) {
-    __extends(TakeUntilSubscriber, _super);
-    function TakeUntilSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.seenValue = false;
-        return _this;
-    }
-    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.seenValue = true;
-        this.complete();
-    };
-    TakeUntilSubscriber.prototype.notifyComplete = function () {
-    };
-    return TakeUntilSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=takeUntil.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/takeUntil.js.map b/node_modules/rxjs/internal/operators/takeUntil.js.map
deleted file mode 100644
index f95db7b..0000000
--- a/node_modules/rxjs/internal/operators/takeUntil.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeUntil.js","sources":["../../src/internal/operators/takeUntil.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAIA,sDAAqD;AAErD,+DAA8D;AA4C9D,SAAgB,SAAS,CAAI,QAAyB;IACpD,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAA5C,CAA4C,CAAC;AACjF,CAAC;AAFD,8BAEC;AAED;IACE,2BAAoB,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAC7C,CAAC;IAED,gCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,IAAM,mBAAmB,GAAG,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAChE,IAAM,oBAAoB,GAAG,qCAAiB,CAAC,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnF,IAAI,oBAAoB,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE;YAC1D,mBAAmB,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;SAC9C;QACD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IACH,wBAAC;AAAD,CAAC,AAbD,IAaC;AAOD;IAAwC,uCAAqB;IAG3D,6BAAY,WAA4B;QAAxC,YACE,kBAAM,WAAW,CAAC,SACnB;QAJD,eAAS,GAAG,KAAK,CAAC;;IAIlB,CAAC;IAED,wCAAU,GAAV,UAAW,UAAa,EAAE,UAAa,EAC5B,UAAkB,EAAE,UAAkB,EACtC,QAA+B;QACxC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,4CAAc,GAAd;IAEA,CAAC;IACH,0BAAC;AAAD,CAAC,AAjBD,CAAwC,iCAAe,GAiBtD"}
diff --git a/node_modules/rxjs/internal/operators/takeWhile.d.ts b/node_modules/rxjs/internal/operators/takeWhile.d.ts
deleted file mode 100644
index 324812c..0000000
--- a/node_modules/rxjs/internal/operators/takeWhile.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { OperatorFunction, MonoTypeOperatorFunction } from '../types';
-export declare function takeWhile<T, S extends T>(predicate: (value: T, index: number) => value is S): OperatorFunction<T, S>;
-export declare function takeWhile<T, S extends T>(predicate: (value: T, index: number) => value is S, inclusive: false): OperatorFunction<T, S>;
-export declare function takeWhile<T>(predicate: (value: T, index: number) => boolean, inclusive?: boolean): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/takeWhile.js b/node_modules/rxjs/internal/operators/takeWhile.js
deleted file mode 100644
index 360da38..0000000
--- a/node_modules/rxjs/internal/operators/takeWhile.js
+++ /dev/null
@@ -1,69 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function takeWhile(predicate, inclusive) {
-    if (inclusive === void 0) { inclusive = false; }
-    return function (source) {
-        return source.lift(new TakeWhileOperator(predicate, inclusive));
-    };
-}
-exports.takeWhile = takeWhile;
-var TakeWhileOperator = (function () {
-    function TakeWhileOperator(predicate, inclusive) {
-        this.predicate = predicate;
-        this.inclusive = inclusive;
-    }
-    TakeWhileOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive));
-    };
-    return TakeWhileOperator;
-}());
-var TakeWhileSubscriber = (function (_super) {
-    __extends(TakeWhileSubscriber, _super);
-    function TakeWhileSubscriber(destination, predicate, inclusive) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.inclusive = inclusive;
-        _this.index = 0;
-        return _this;
-    }
-    TakeWhileSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        var result;
-        try {
-            result = this.predicate(value, this.index++);
-        }
-        catch (err) {
-            destination.error(err);
-            return;
-        }
-        this.nextOrComplete(value, result);
-    };
-    TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {
-        var destination = this.destination;
-        if (Boolean(predicateResult)) {
-            destination.next(value);
-        }
-        else {
-            if (this.inclusive) {
-                destination.next(value);
-            }
-            destination.complete();
-        }
-    };
-    return TakeWhileSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=takeWhile.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/takeWhile.js.map b/node_modules/rxjs/internal/operators/takeWhile.js.map
deleted file mode 100644
index 74291cc..0000000
--- a/node_modules/rxjs/internal/operators/takeWhile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeWhile.js","sources":["../../src/internal/operators/takeWhile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AAmD3C,SAAgB,SAAS,CACrB,SAA+C,EAC/C,SAAiB;IAAjB,0BAAA,EAAA,iBAAiB;IACnB,OAAO,UAAC,MAAqB;QAClB,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAAxD,CAAwD,CAAC;AACtE,CAAC;AALD,8BAKC;AAED;IACE,2BACY,SAA+C,EAC/C,SAAkB;QADlB,cAAS,GAAT,SAAS,CAAsC;QAC/C,cAAS,GAAT,SAAS,CAAS;IAAG,CAAC;IAElC,gCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CACnB,IAAI,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3E,CAAC;IACH,wBAAC;AAAD,CAAC,AATD,IASC;AAOD;IAAqC,uCAAa;IAGhD,6BACI,WAA0B,EAClB,SAA+C,EAC/C,SAAkB;QAH9B,YAIE,kBAAM,WAAW,CAAC,SACnB;QAHW,eAAS,GAAT,SAAS,CAAsC;QAC/C,eAAS,GAAT,SAAS,CAAS;QALtB,WAAK,GAAW,CAAC,CAAC;;IAO1B,CAAC;IAES,mCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,MAAe,CAAC;QACpB,IAAI;YACF,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SAC9C;QAAC,OAAO,GAAG,EAAE;YACZ,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO;SACR;QACD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAEO,4CAAc,GAAtB,UAAuB,KAAQ,EAAE,eAAwB;QACvD,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE;YAC5B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACzB;aAAM;YACL,IAAI,IAAI,CAAC,SAAS,EAAE;gBAClB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aACzB;YACD,WAAW,CAAC,QAAQ,EAAE,CAAC;SACxB;IACH,CAAC;IACH,0BAAC;AAAD,CAAC,AAjCD,CAAqC,uBAAU,GAiC9C"}
diff --git a/node_modules/rxjs/internal/operators/tap.d.ts b/node_modules/rxjs/internal/operators/tap.d.ts
deleted file mode 100644
index 72a4db2..0000000
--- a/node_modules/rxjs/internal/operators/tap.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { MonoTypeOperatorFunction, PartialObserver } from '../types';
-/** @deprecated Use an observer instead of a complete callback */
-export declare function tap<T>(next: null | undefined, error: null | undefined, complete: () => void): MonoTypeOperatorFunction<T>;
-/** @deprecated Use an observer instead of an error callback */
-export declare function tap<T>(next: null | undefined, error: (error: any) => void, complete?: () => void): MonoTypeOperatorFunction<T>;
-/** @deprecated Use an observer instead of a complete callback */
-export declare function tap<T>(next: (value: T) => void, error: null | undefined, complete: () => void): MonoTypeOperatorFunction<T>;
-export declare function tap<T>(next?: (x: T) => void, error?: (e: any) => void, complete?: () => void): MonoTypeOperatorFunction<T>;
-export declare function tap<T>(observer: PartialObserver<T>): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/tap.js b/node_modules/rxjs/internal/operators/tap.js
deleted file mode 100644
index 01eec10..0000000
--- a/node_modules/rxjs/internal/operators/tap.js
+++ /dev/null
@@ -1,89 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var noop_1 = require("../util/noop");
-var isFunction_1 = require("../util/isFunction");
-function tap(nextOrObserver, error, complete) {
-    return function tapOperatorFunction(source) {
-        return source.lift(new DoOperator(nextOrObserver, error, complete));
-    };
-}
-exports.tap = tap;
-var DoOperator = (function () {
-    function DoOperator(nextOrObserver, error, complete) {
-        this.nextOrObserver = nextOrObserver;
-        this.error = error;
-        this.complete = complete;
-    }
-    DoOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
-    };
-    return DoOperator;
-}());
-var TapSubscriber = (function (_super) {
-    __extends(TapSubscriber, _super);
-    function TapSubscriber(destination, observerOrNext, error, complete) {
-        var _this = _super.call(this, destination) || this;
-        _this._tapNext = noop_1.noop;
-        _this._tapError = noop_1.noop;
-        _this._tapComplete = noop_1.noop;
-        _this._tapError = error || noop_1.noop;
-        _this._tapComplete = complete || noop_1.noop;
-        if (isFunction_1.isFunction(observerOrNext)) {
-            _this._context = _this;
-            _this._tapNext = observerOrNext;
-        }
-        else if (observerOrNext) {
-            _this._context = observerOrNext;
-            _this._tapNext = observerOrNext.next || noop_1.noop;
-            _this._tapError = observerOrNext.error || noop_1.noop;
-            _this._tapComplete = observerOrNext.complete || noop_1.noop;
-        }
-        return _this;
-    }
-    TapSubscriber.prototype._next = function (value) {
-        try {
-            this._tapNext.call(this._context, value);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(value);
-    };
-    TapSubscriber.prototype._error = function (err) {
-        try {
-            this._tapError.call(this._context, err);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.error(err);
-    };
-    TapSubscriber.prototype._complete = function () {
-        try {
-            this._tapComplete.call(this._context);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        return this.destination.complete();
-    };
-    return TapSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=tap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/tap.js.map b/node_modules/rxjs/internal/operators/tap.js.map
deleted file mode 100644
index fc7c148..0000000
--- a/node_modules/rxjs/internal/operators/tap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"tap.js","sources":["../../src/internal/operators/tap.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/throttle.d.ts b/node_modules/rxjs/internal/operators/throttle.d.ts
deleted file mode 100644
index 5a3302f..0000000
--- a/node_modules/rxjs/internal/operators/throttle.d.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { MonoTypeOperatorFunction, SubscribableOrPromise } from '../types';
-export interface ThrottleConfig {
-    leading?: boolean;
-    trailing?: boolean;
-}
-export declare const defaultThrottleConfig: ThrottleConfig;
-/**
- * Emits a value from the source Observable, then ignores subsequent source
- * values for a duration determined by another Observable, then repeats this
- * process.
- *
- * <span class="informal">It's like {@link throttleTime}, but the silencing
- * duration is determined by a second Observable.</span>
- *
- * ![](throttle.png)
- *
- * `throttle` emits the source Observable values on the output Observable
- * when its internal timer is disabled, and ignores source values when the timer
- * is enabled. Initially, the timer is disabled. As soon as the first source
- * value arrives, it is forwarded to the output Observable, and then the timer
- * is enabled by calling the `durationSelector` function with the source value,
- * which returns the "duration" Observable. When the duration Observable emits a
- * value or completes, the timer is disabled, and this process repeats for the
- * next source value.
- *
- * ## Example
- * Emit clicks at a rate of at most one click per second
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { throttle } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(throttle(ev => interval(1000)));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link audit}
- * @see {@link debounce}
- * @see {@link delayWhen}
- * @see {@link sample}
- * @see {@link throttleTime}
- *
- * @param {function(value: T): SubscribableOrPromise} durationSelector A function
- * that receives a value from the source Observable, for computing the silencing
- * duration for each source value, returned as an Observable or a Promise.
- * @param {Object} config a configuration object to define `leading` and `trailing` behavior. Defaults
- * to `{ leading: true, trailing: false }`.
- * @return {Observable<T>} An Observable that performs the throttle operation to
- * limit the rate of emissions from the source.
- * @method throttle
- * @owner Observable
- */
-export declare function throttle<T>(durationSelector: (value: T) => SubscribableOrPromise<any>, config?: ThrottleConfig): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/throttle.js b/node_modules/rxjs/internal/operators/throttle.js
deleted file mode 100644
index 4347483..0000000
--- a/node_modules/rxjs/internal/operators/throttle.js
+++ /dev/null
@@ -1,103 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-exports.defaultThrottleConfig = {
-    leading: true,
-    trailing: false
-};
-function throttle(durationSelector, config) {
-    if (config === void 0) { config = exports.defaultThrottleConfig; }
-    return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); };
-}
-exports.throttle = throttle;
-var ThrottleOperator = (function () {
-    function ThrottleOperator(durationSelector, leading, trailing) {
-        this.durationSelector = durationSelector;
-        this.leading = leading;
-        this.trailing = trailing;
-    }
-    ThrottleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));
-    };
-    return ThrottleOperator;
-}());
-var ThrottleSubscriber = (function (_super) {
-    __extends(ThrottleSubscriber, _super);
-    function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.durationSelector = durationSelector;
-        _this._leading = _leading;
-        _this._trailing = _trailing;
-        _this._hasValue = false;
-        return _this;
-    }
-    ThrottleSubscriber.prototype._next = function (value) {
-        this._hasValue = true;
-        this._sendValue = value;
-        if (!this._throttled) {
-            if (this._leading) {
-                this.send();
-            }
-            else {
-                this.throttle(value);
-            }
-        }
-    };
-    ThrottleSubscriber.prototype.send = function () {
-        var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue;
-        if (_hasValue) {
-            this.destination.next(_sendValue);
-            this.throttle(_sendValue);
-        }
-        this._hasValue = false;
-        this._sendValue = null;
-    };
-    ThrottleSubscriber.prototype.throttle = function (value) {
-        var duration = this.tryDurationSelector(value);
-        if (!!duration) {
-            this.add(this._throttled = subscribeToResult_1.subscribeToResult(this, duration));
-        }
-    };
-    ThrottleSubscriber.prototype.tryDurationSelector = function (value) {
-        try {
-            return this.durationSelector(value);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return null;
-        }
-    };
-    ThrottleSubscriber.prototype.throttlingDone = function () {
-        var _a = this, _throttled = _a._throttled, _trailing = _a._trailing;
-        if (_throttled) {
-            _throttled.unsubscribe();
-        }
-        this._throttled = null;
-        if (_trailing) {
-            this.send();
-        }
-    };
-    ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.throttlingDone();
-    };
-    ThrottleSubscriber.prototype.notifyComplete = function () {
-        this.throttlingDone();
-    };
-    return ThrottleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=throttle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/throttle.js.map b/node_modules/rxjs/internal/operators/throttle.js.map
deleted file mode 100644
index 1bfaeca..0000000
--- a/node_modules/rxjs/internal/operators/throttle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throttle.js","sources":["../../src/internal/operators/throttle.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/throttleTime.d.ts b/node_modules/rxjs/internal/operators/throttleTime.d.ts
deleted file mode 100644
index af02ffa..0000000
--- a/node_modules/rxjs/internal/operators/throttleTime.d.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { ThrottleConfig } from './throttle';
-import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
-/**
- * Emits a value from the source Observable, then ignores subsequent source
- * values for `duration` milliseconds, then repeats this process.
- *
- * <span class="informal">Lets a value pass, then ignores source values for the
- * next `duration` milliseconds.</span>
- *
- * ![](throttleTime.png)
- *
- * `throttleTime` emits the source Observable values on the output Observable
- * when its internal timer is disabled, and ignores source values when the timer
- * is enabled. Initially, the timer is disabled. As soon as the first source
- * value arrives, it is forwarded to the output Observable, and then the timer
- * is enabled. After `duration` milliseconds (or the time unit determined
- * internally by the optional `scheduler`) has passed, the timer is disabled,
- * and this process repeats for the next source value. Optionally takes a
- * {@link SchedulerLike} for managing timers.
- *
- * ## Examples
- *
- * #### Limit click rate
- *
- * Emit clicks at a rate of at most one click per second
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { throttleTime } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(throttleTime(1000));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * #### Double Click
- *
- * The following example only emits clicks which happen within a subsequent
- * delay of 400ms of the previous click. This for example can emulate a double
- * click. It makes use of the `trailing` parameter of the throttle configuration.
- *
- * ```ts
- * import { fromEvent, asyncScheduler } from 'rxjs';
- * import { throttleTime, withLatestFrom } from 'rxjs/operators';
- *
- * // defaultThottleConfig = { leading: true, trailing: false }
- * const throttleConfig = {
- *   leading: false,
- *   trailing: true
- * }
- *
- * const click = fromEvent(document, 'click');
- * const doubleClick = click.pipe(
- *   throttleTime(400, asyncScheduler, throttleConfig)
- * );
- *
- * doubleClick.subscribe((throttleValue: Event) => {
- *   console.log(`Double-clicked! Timestamp: ${throttleValue.timeStamp}`);
- * });
- * ```
- *
- * If you enable the `leading` parameter in this example, the output would be the primary click and
- * the double click, but restricts additional clicks within 400ms.
- *
- * @see {@link auditTime}
- * @see {@link debounceTime}
- * @see {@link delay}
- * @see {@link sampleTime}
- * @see {@link throttle}
- *
- * @param {number} duration Time to wait before emitting another value after
- * emitting the last value, measured in milliseconds or the time unit determined
- * internally by the optional `scheduler`.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
- * managing the timers that handle the throttling.
- * @param {Object} config a configuration object to define `leading` and
- * `trailing` behavior. Defaults to `{ leading: true, trailing: false }`.
- * @return {Observable<T>} An Observable that performs the throttle operation to
- * limit the rate of emissions from the source.
- * @method throttleTime
- * @owner Observable
- */
-export declare function throttleTime<T>(duration: number, scheduler?: SchedulerLike, config?: ThrottleConfig): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/throttleTime.js b/node_modules/rxjs/internal/operators/throttleTime.js
deleted file mode 100644
index 156c44b..0000000
--- a/node_modules/rxjs/internal/operators/throttleTime.js
+++ /dev/null
@@ -1,95 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var async_1 = require("../scheduler/async");
-var throttle_1 = require("./throttle");
-function throttleTime(duration, scheduler, config) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    if (config === void 0) { config = throttle_1.defaultThrottleConfig; }
-    return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); };
-}
-exports.throttleTime = throttleTime;
-var ThrottleTimeOperator = (function () {
-    function ThrottleTimeOperator(duration, scheduler, leading, trailing) {
-        this.duration = duration;
-        this.scheduler = scheduler;
-        this.leading = leading;
-        this.trailing = trailing;
-    }
-    ThrottleTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));
-    };
-    return ThrottleTimeOperator;
-}());
-var ThrottleTimeSubscriber = (function (_super) {
-    __extends(ThrottleTimeSubscriber, _super);
-    function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {
-        var _this = _super.call(this, destination) || this;
-        _this.duration = duration;
-        _this.scheduler = scheduler;
-        _this.leading = leading;
-        _this.trailing = trailing;
-        _this._hasTrailingValue = false;
-        _this._trailingValue = null;
-        return _this;
-    }
-    ThrottleTimeSubscriber.prototype._next = function (value) {
-        if (this.throttled) {
-            if (this.trailing) {
-                this._trailingValue = value;
-                this._hasTrailingValue = true;
-            }
-        }
-        else {
-            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));
-            if (this.leading) {
-                this.destination.next(value);
-            }
-            else if (this.trailing) {
-                this._trailingValue = value;
-                this._hasTrailingValue = true;
-            }
-        }
-    };
-    ThrottleTimeSubscriber.prototype._complete = function () {
-        if (this._hasTrailingValue) {
-            this.destination.next(this._trailingValue);
-            this.destination.complete();
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    ThrottleTimeSubscriber.prototype.clearThrottle = function () {
-        var throttled = this.throttled;
-        if (throttled) {
-            if (this.trailing && this._hasTrailingValue) {
-                this.destination.next(this._trailingValue);
-                this._trailingValue = null;
-                this._hasTrailingValue = false;
-            }
-            throttled.unsubscribe();
-            this.remove(throttled);
-            this.throttled = null;
-        }
-    };
-    return ThrottleTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNext(arg) {
-    var subscriber = arg.subscriber;
-    subscriber.clearThrottle();
-}
-//# sourceMappingURL=throttleTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/throttleTime.js.map b/node_modules/rxjs/internal/operators/throttleTime.js.map
deleted file mode 100644
index 343f02d..0000000
--- a/node_modules/rxjs/internal/operators/throttleTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throttleTime.js","sources":["../../src/internal/operators/throttleTime.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/throwIfEmpty.d.ts b/node_modules/rxjs/internal/operators/throwIfEmpty.d.ts
deleted file mode 100644
index 1238bca..0000000
--- a/node_modules/rxjs/internal/operators/throwIfEmpty.d.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { MonoTypeOperatorFunction } from '../types';
-/**
- * If the source observable completes without emitting a value, it will emit
- * an error. The error will be created at that time by the optional
- * `errorFactory` argument, otherwise, the error will be {@link EmptyError}.
- *
- * ![](throwIfEmpty.png)
- *
- * ## Example
- * ```ts
- * import { fromEvent, timer } from 'rxjs';
- * import { throwIfEmpty, takeUntil } from 'rxjs/operators';
- *
- * const click$ = fromEvent(document, 'click');
- *
- * click$.pipe(
- *   takeUntil(timer(1000)),
- *   throwIfEmpty(
- *     () => new Error('the document was not clicked within 1 second')
- *   ),
- * )
- * .subscribe({
- *   next() { console.log('The button was clicked'); },
- *   error(err) { console.error(err); }
- * });
- * ```
- *
- * @param errorFactory A factory function called to produce the
- * error to be thrown when the source observable completes without emitting a
- * value.
- */
-export declare function throwIfEmpty<T>(errorFactory?: (() => any)): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/throwIfEmpty.js b/node_modules/rxjs/internal/operators/throwIfEmpty.js
deleted file mode 100644
index 7722c34..0000000
--- a/node_modules/rxjs/internal/operators/throwIfEmpty.js
+++ /dev/null
@@ -1,66 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var EmptyError_1 = require("../util/EmptyError");
-var Subscriber_1 = require("../Subscriber");
-function throwIfEmpty(errorFactory) {
-    if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }
-    return function (source) {
-        return source.lift(new ThrowIfEmptyOperator(errorFactory));
-    };
-}
-exports.throwIfEmpty = throwIfEmpty;
-var ThrowIfEmptyOperator = (function () {
-    function ThrowIfEmptyOperator(errorFactory) {
-        this.errorFactory = errorFactory;
-    }
-    ThrowIfEmptyOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory));
-    };
-    return ThrowIfEmptyOperator;
-}());
-var ThrowIfEmptySubscriber = (function (_super) {
-    __extends(ThrowIfEmptySubscriber, _super);
-    function ThrowIfEmptySubscriber(destination, errorFactory) {
-        var _this = _super.call(this, destination) || this;
-        _this.errorFactory = errorFactory;
-        _this.hasValue = false;
-        return _this;
-    }
-    ThrowIfEmptySubscriber.prototype._next = function (value) {
-        this.hasValue = true;
-        this.destination.next(value);
-    };
-    ThrowIfEmptySubscriber.prototype._complete = function () {
-        if (!this.hasValue) {
-            var err = void 0;
-            try {
-                err = this.errorFactory();
-            }
-            catch (e) {
-                err = e;
-            }
-            this.destination.error(err);
-        }
-        else {
-            return this.destination.complete();
-        }
-    };
-    return ThrowIfEmptySubscriber;
-}(Subscriber_1.Subscriber));
-function defaultErrorFactory() {
-    return new EmptyError_1.EmptyError();
-}
-//# sourceMappingURL=throwIfEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/throwIfEmpty.js.map b/node_modules/rxjs/internal/operators/throwIfEmpty.js.map
deleted file mode 100644
index 5817ed7..0000000
--- a/node_modules/rxjs/internal/operators/throwIfEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throwIfEmpty.js","sources":["../../src/internal/operators/throwIfEmpty.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,iDAAgD;AAGhD,4CAA2C;AAiC3C,SAAgB,YAAY,CAAK,YAA+C;IAA/C,6BAAA,EAAA,kCAA+C;IAC9E,OAAO,UAAC,MAAqB;QAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAJD,oCAIC;AAED;IACE,8BAAoB,YAAuB;QAAvB,iBAAY,GAAZ,YAAY,CAAW;IAC3C,CAAC;IAED,mCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACrF,CAAC;IACH,2BAAC;AAAD,CAAC,AAPD,IAOC;AAED;IAAwC,0CAAa;IAGnD,gCAAY,WAA0B,EAAU,YAAuB;QAAvE,YACE,kBAAM,WAAW,CAAC,SACnB;QAF+C,kBAAY,GAAZ,YAAY,CAAW;QAF/D,cAAQ,GAAY,KAAK,CAAC;;IAIlC,CAAC;IAES,sCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAES,0CAAS,GAAnB;QACE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,GAAG,SAAK,CAAC;YACb,IAAI;gBACF,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;aAC3B;YAAC,OAAO,CAAC,EAAE;gBACV,GAAG,GAAG,CAAC,CAAC;aACT;YACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC7B;aAAM;YACH,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;SACtC;IACH,CAAC;IACH,6BAAC;AAAD,CAAC,AAzBD,CAAwC,uBAAU,GAyBjD;AAED,SAAS,mBAAmB;IAC1B,OAAO,IAAI,uBAAU,EAAE,CAAC;AAC1B,CAAC"}
diff --git a/node_modules/rxjs/internal/operators/timeInterval.d.ts b/node_modules/rxjs/internal/operators/timeInterval.d.ts
deleted file mode 100644
index 029c2e2..0000000
--- a/node_modules/rxjs/internal/operators/timeInterval.d.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { SchedulerLike, OperatorFunction } from '../types';
-/**
- *
- * Emits an object containing the current value, and the time that has
- * passed between emitting the current value and the previous value, which is
- * calculated by using the provided `scheduler`'s `now()` method to retrieve
- * the current time at each emission, then calculating the difference. The `scheduler`
- * defaults to {@link asyncScheduler}, so by default, the `interval` will be in
- * milliseconds.
- *
- * <span class="informal">Convert an Observable that emits items into one that
- * emits indications of the amount of time elapsed between those emissions.</span>
- *
- * ![](timeinterval.png)
- *
- * ## Examples
- * Emit inteval between current value with the last value
- *
- * ```ts
- * const seconds = interval(1000);
- *
- * seconds.pipe(timeInterval())
- * .subscribe(
- *     value => console.log(value),
- *     err => console.log(err),
- * );
- *
- * seconds.pipe(timeout(900))
- * .subscribe(
- *     value => console.log(value),
- *     err => console.log(err),
- * );
- *
- * // NOTE: The values will never be this precise,
- * // intervals created with `interval` or `setInterval`
- * // are non-deterministic.
- *
- * // {value: 0, interval: 1000}
- * // {value: 1, interval: 1000}
- * // {value: 2, interval: 1000}
- * ```
- *
- * @param {SchedulerLike} [scheduler] Scheduler used to get the current time.
- * @return {Observable<{ interval: number, value: T }>} Observable that emit infomation about value and interval
- * @method timeInterval
- */
-export declare function timeInterval<T>(scheduler?: SchedulerLike): OperatorFunction<T, TimeInterval<T>>;
-/**
- * @deprecated exposed API, use as interface only.
- */
-export declare class TimeInterval<T> {
-    value: T;
-    interval: number;
-    constructor(value: T, interval: number);
-}
diff --git a/node_modules/rxjs/internal/operators/timeInterval.js b/node_modules/rxjs/internal/operators/timeInterval.js
deleted file mode 100644
index 9ed2bc0..0000000
--- a/node_modules/rxjs/internal/operators/timeInterval.js
+++ /dev/null
@@ -1,28 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var scan_1 = require("./scan");
-var defer_1 = require("../observable/defer");
-var map_1 = require("./map");
-function timeInterval(scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return function (source) { return defer_1.defer(function () {
-        return source.pipe(scan_1.scan(function (_a, value) {
-            var current = _a.current;
-            return ({ value: value, current: scheduler.now(), last: current });
-        }, { current: scheduler.now(), value: undefined, last: undefined }), map_1.map(function (_a) {
-            var current = _a.current, last = _a.last, value = _a.value;
-            return new TimeInterval(value, current - last);
-        }));
-    }); };
-}
-exports.timeInterval = timeInterval;
-var TimeInterval = (function () {
-    function TimeInterval(value, interval) {
-        this.value = value;
-        this.interval = interval;
-    }
-    return TimeInterval;
-}());
-exports.TimeInterval = TimeInterval;
-//# sourceMappingURL=timeInterval.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/timeInterval.js.map b/node_modules/rxjs/internal/operators/timeInterval.js.map
deleted file mode 100644
index d915b13..0000000
--- a/node_modules/rxjs/internal/operators/timeInterval.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeInterval.js","sources":["../../src/internal/operators/timeInterval.ts"],"names":[],"mappings":";;AAEA,4CAA2C;AAE3C,+BAA8B;AAC9B,6CAA4C;AAC5C,6BAA4B;AA+C5B,SAAgB,YAAY,CAAI,SAAgC;IAAhC,0BAAA,EAAA,YAA2B,aAAK;IAC9D,OAAO,UAAC,MAAqB,IAAK,OAAA,aAAK,CAAC;QACtC,OAAO,MAAM,CAAC,IAAI,CAEhB,WAAI,CACF,UAAC,EAAW,EAAE,KAAK;gBAAhB,oBAAO;YAAc,OAAA,CAAC,EAAE,KAAK,OAAA,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAApD,CAAoD,EAC5E,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAG,IAAI,EAAE,SAAS,EAAE,CAC1D,EACR,SAAG,CAAuB,UAAC,EAAwB;gBAAtB,oBAAO,EAAE,cAAI,EAAE,gBAAK;YAAO,OAAA,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;QAAvC,CAAuC,CAAC,CACjG,CAAC;IACJ,CAAC,CAAC,EATgC,CAShC,CAAC;AACL,CAAC;AAXD,oCAWC;AAQD;IACE,sBAAmB,KAAQ,EAAS,QAAgB;QAAjC,UAAK,GAAL,KAAK,CAAG;QAAS,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAC1D,mBAAC;AAAD,CAAC,AAFD,IAEC;AAFY,oCAAY"}
diff --git a/node_modules/rxjs/internal/operators/timeout.d.ts b/node_modules/rxjs/internal/operators/timeout.d.ts
deleted file mode 100644
index 8d4ac4e..0000000
--- a/node_modules/rxjs/internal/operators/timeout.d.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
-/**
- *
- * Errors if Observable does not emit a value in given time span.
- *
- * <span class="informal">Timeouts on Observable that doesn't emit values fast enough.</span>
- *
- * ![](timeout.png)
- *
- * `timeout` operator accepts as an argument either a number or a Date.
- *
- * If number was provided, it returns an Observable that behaves like a source
- * Observable, unless there is a period of time where there is no value emitted.
- * So if you provide `100` as argument and first value comes after 50ms from
- * the moment of subscription, this value will be simply re-emitted by the resulting
- * Observable. If however after that 100ms passes without a second value being emitted,
- * stream will end with an error and source Observable will be unsubscribed.
- * These checks are performed throughout whole lifecycle of Observable - from the moment
- * it was subscribed to, until it completes or errors itself. Thus every value must be
- * emitted within specified period since previous value.
- *
- * If provided argument was Date, returned Observable behaves differently. It throws
- * if Observable did not complete before provided Date. This means that periods between
- * emission of particular values do not matter in this case. If Observable did not complete
- * before provided Date, source Observable will be unsubscribed. Other than that, resulting
- * stream behaves just as source Observable.
- *
- * `timeout` accepts also a Scheduler as a second parameter. It is used to schedule moment (or moments)
- * when returned Observable will check if source stream emitted value or completed.
- *
- * ## Examples
- * Check if ticks are emitted within certain timespan
- * ```ts
- * import { interval } from 'rxjs';
- * import { timeout } from 'rxjs/operators';
- *
- * const seconds = interval(1000);
- *
- * seconds.pipe(timeout(1100))      // Let's use bigger timespan to be safe,
- *                                  // since `interval` might fire a bit later then scheduled.
- * .subscribe(
- *     value => console.log(value), // Will emit numbers just as regular `interval` would.
- *     err => console.log(err),     // Will never be called.
- * );
- *
- * seconds.pipe(timeout(900))
- * .subscribe(
- *     value => console.log(value), // Will never be called.
- *     err => console.log(err),     // Will emit error before even first value is emitted,
- *                                  // since it did not arrive within 900ms period.
- * );
- * ```
- *
- * Use Date to check if Observable completed
- * ```ts
- * import { interval } from 'rxjs';
- * import { timeout } from 'rxjs/operators';
- *
- * const seconds = interval(1000);
- *
- * seconds.pipe(
- *   timeout(new Date("December 17, 2020 03:24:00")),
- * )
- * .subscribe(
- *     value => console.log(value), // Will emit values as regular `interval` would
- *                                  // until December 17, 2020 at 03:24:00.
- *     err => console.log(err)      // On December 17, 2020 at 03:24:00 it will emit an error,
- *                                  // since Observable did not complete by then.
- * );
- * ```
- * @see {@link timeoutWith}
- *
- * @param {number|Date} due Number specifying period within which Observable must emit values
- *                          or Date specifying before when Observable should complete
- * @param {SchedulerLike} [scheduler] Scheduler controlling when timeout checks occur.
- * @return {Observable<T>} Observable that mirrors behaviour of source, unless timeout checks fail.
- * @method timeout
- * @owner Observable
- */
-export declare function timeout<T>(due: number | Date, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
diff --git a/node_modules/rxjs/internal/operators/timeout.js b/node_modules/rxjs/internal/operators/timeout.js
deleted file mode 100644
index 0241d2a..0000000
--- a/node_modules/rxjs/internal/operators/timeout.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var TimeoutError_1 = require("../util/TimeoutError");
-var timeoutWith_1 = require("./timeoutWith");
-var throwError_1 = require("../observable/throwError");
-function timeout(due, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return timeoutWith_1.timeoutWith(due, throwError_1.throwError(new TimeoutError_1.TimeoutError()), scheduler);
-}
-exports.timeout = timeout;
-//# sourceMappingURL=timeout.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/timeout.js.map b/node_modules/rxjs/internal/operators/timeout.js.map
deleted file mode 100644
index 8935e58..0000000
--- a/node_modules/rxjs/internal/operators/timeout.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeout.js","sources":["../../src/internal/operators/timeout.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAK3C,qDAAoD;AAEpD,6CAA4C;AAC5C,uDAAsD;AAgFtD,SAAgB,OAAO,CAAI,GAAkB,EAClB,SAAgC;IAAhC,0BAAA,EAAA,YAA2B,aAAK;IACzD,OAAO,yBAAW,CAAC,GAAG,EAAE,uBAAU,CAAC,IAAI,2BAAY,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;AACrE,CAAC;AAHD,0BAGC"}
diff --git a/node_modules/rxjs/internal/operators/timeoutWith.d.ts b/node_modules/rxjs/internal/operators/timeoutWith.d.ts
deleted file mode 100644
index 05ea509..0000000
--- a/node_modules/rxjs/internal/operators/timeoutWith.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { ObservableInput, OperatorFunction, SchedulerLike } from '../types';
-export declare function timeoutWith<T, R>(due: number | Date, withObservable: ObservableInput<R>, scheduler?: SchedulerLike): OperatorFunction<T, T | R>;
diff --git a/node_modules/rxjs/internal/operators/timeoutWith.js b/node_modules/rxjs/internal/operators/timeoutWith.js
deleted file mode 100644
index 3d4727e..0000000
--- a/node_modules/rxjs/internal/operators/timeoutWith.js
+++ /dev/null
@@ -1,80 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var isDate_1 = require("../util/isDate");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function timeoutWith(due, withObservable, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return function (source) {
-        var absoluteTimeout = isDate_1.isDate(due);
-        var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);
-        return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));
-    };
-}
-exports.timeoutWith = timeoutWith;
-var TimeoutWithOperator = (function () {
-    function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) {
-        this.waitFor = waitFor;
-        this.absoluteTimeout = absoluteTimeout;
-        this.withObservable = withObservable;
-        this.scheduler = scheduler;
-    }
-    TimeoutWithOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler));
-    };
-    return TimeoutWithOperator;
-}());
-var TimeoutWithSubscriber = (function (_super) {
-    __extends(TimeoutWithSubscriber, _super);
-    function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.absoluteTimeout = absoluteTimeout;
-        _this.waitFor = waitFor;
-        _this.withObservable = withObservable;
-        _this.scheduler = scheduler;
-        _this.action = null;
-        _this.scheduleTimeout();
-        return _this;
-    }
-    TimeoutWithSubscriber.dispatchTimeout = function (subscriber) {
-        var withObservable = subscriber.withObservable;
-        subscriber._unsubscribeAndRecycle();
-        subscriber.add(subscribeToResult_1.subscribeToResult(subscriber, withObservable));
-    };
-    TimeoutWithSubscriber.prototype.scheduleTimeout = function () {
-        var action = this.action;
-        if (action) {
-            this.action = action.schedule(this, this.waitFor);
-        }
-        else {
-            this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this));
-        }
-    };
-    TimeoutWithSubscriber.prototype._next = function (value) {
-        if (!this.absoluteTimeout) {
-            this.scheduleTimeout();
-        }
-        _super.prototype._next.call(this, value);
-    };
-    TimeoutWithSubscriber.prototype._unsubscribe = function () {
-        this.action = null;
-        this.scheduler = null;
-        this.withObservable = null;
-    };
-    return TimeoutWithSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=timeoutWith.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/timeoutWith.js.map b/node_modules/rxjs/internal/operators/timeoutWith.js.map
deleted file mode 100644
index 426c577..0000000
--- a/node_modules/rxjs/internal/operators/timeoutWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeoutWith.js","sources":["../../src/internal/operators/timeoutWith.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,4CAA2C;AAE3C,yCAAwC;AACxC,sDAAqD;AACrD,+DAA8D;AA4D9D,SAAgB,WAAW,CAAO,GAAkB,EAClB,cAAkC,EAClC,SAAgC;IAAhC,0BAAA,EAAA,YAA2B,aAAK;IAChE,OAAO,UAAC,MAAqB;QAC3B,IAAI,eAAe,GAAG,eAAM,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAS,GAAG,CAAC,CAAC;QACjF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IACnG,CAAC,CAAC;AACJ,CAAC;AARD,kCAQC;AAED;IACE,6BAAoB,OAAe,EACf,eAAwB,EACxB,cAAoC,EACpC,SAAwB;QAHxB,YAAO,GAAP,OAAO,CAAQ;QACf,oBAAe,GAAf,eAAe,CAAS;QACxB,mBAAc,GAAd,cAAc,CAAsB;QACpC,cAAS,GAAT,SAAS,CAAe;IAC5C,CAAC;IAED,kCAAI,GAAJ,UAAK,UAAyB,EAAE,MAAW;QACzC,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAC/C,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CACpF,CAAC,CAAC;IACL,CAAC;IACH,0BAAC;AAAD,CAAC,AAZD,IAYC;AAOD;IAA0C,yCAAqB;IAI7D,+BAAY,WAA0B,EAClB,eAAwB,EACxB,OAAe,EACf,cAAoC,EACpC,SAAwB;QAJ5C,YAKE,kBAAM,WAAW,CAAC,SAEnB;QANmB,qBAAe,GAAf,eAAe,CAAS;QACxB,aAAO,GAAP,OAAO,CAAQ;QACf,oBAAc,GAAd,cAAc,CAAsB;QACpC,eAAS,GAAT,SAAS,CAAe;QANpC,YAAM,GAAiD,IAAI,CAAC;QAQlE,KAAI,CAAC,eAAe,EAAE,CAAC;;IACzB,CAAC;IAEc,qCAAe,GAA9B,UAAqC,UAAuC;QAClE,IAAA,0CAAc,CAAgB;QAC/B,UAAW,CAAC,sBAAsB,EAAE,CAAC;QAC5C,UAAU,CAAC,GAAG,CAAC,qCAAiB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,+CAAe,GAAvB;QACU,IAAA,oBAAM,CAAU;QACxB,IAAI,MAAM,EAAE;YAMV,IAAI,CAAC,MAAM,GAAmD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAE,CAAC;SACpG;aAAM;YACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAmD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAC5F,qBAAqB,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CACzD,CAAC,CAAC;SACL;IACH,CAAC;IAES,qCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;QACD,iBAAM,KAAK,YAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAGD,4CAAY,GAAZ;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IACH,4BAAC;AAAD,CAAC,AAhDD,CAA0C,iCAAe,GAgDxD"}
diff --git a/node_modules/rxjs/internal/operators/timestamp.d.ts b/node_modules/rxjs/internal/operators/timestamp.d.ts
deleted file mode 100644
index f7e5ee7..0000000
--- a/node_modules/rxjs/internal/operators/timestamp.d.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { OperatorFunction, SchedulerLike, Timestamp as TimestampInterface } from '../types';
-/**
- * Attaches a timestamp to each item emitted by an observable indicating when it was emitted
- *
- * The `timestamp` operator maps the *source* observable stream to an object of type
- * `{value: T, timestamp: R}`. The properties are generically typed. The `value` property contains the value
- * and type of the *source* observable. The `timestamp` is generated by the schedulers `now` function. By
- * default it uses the *async* scheduler which simply returns `Date.now()` (milliseconds since 1970/01/01
- * 00:00:00:000) and therefore is of type `number`.
- *
- * ![](timestamp.png)
- *
- * ## Example
- *
- * In this example there is a timestamp attached to the documents click event.
- *
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { timestamp } from 'rxjs/operators';
- *
- * const clickWithTimestamp = fromEvent(document, 'click').pipe(
- *   timestamp()
- * );
- *
- * // Emits data of type {value: MouseEvent, timestamp: number}
- * clickWithTimestamp.subscribe(data => {
- *   console.log(data);
- * });
- * ```
- *
- * @param scheduler
- * @return {Observable<Timestamp<any>>|WebSocketSubject<T>|Observable<T>}
- * @method timestamp
- * @owner Observable
- */
-export declare function timestamp<T>(scheduler?: SchedulerLike): OperatorFunction<T, Timestamp<T>>;
-export declare class Timestamp<T> implements TimestampInterface<T> {
-    value: T;
-    timestamp: number;
-    constructor(value: T, timestamp: number);
-}
diff --git a/node_modules/rxjs/internal/operators/timestamp.js b/node_modules/rxjs/internal/operators/timestamp.js
deleted file mode 100644
index 52bb279..0000000
--- a/node_modules/rxjs/internal/operators/timestamp.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var map_1 = require("./map");
-function timestamp(scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return map_1.map(function (value) { return new Timestamp(value, scheduler.now()); });
-}
-exports.timestamp = timestamp;
-var Timestamp = (function () {
-    function Timestamp(value, timestamp) {
-        this.value = value;
-        this.timestamp = timestamp;
-    }
-    return Timestamp;
-}());
-exports.Timestamp = Timestamp;
-//# sourceMappingURL=timestamp.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/timestamp.js.map b/node_modules/rxjs/internal/operators/timestamp.js.map
deleted file mode 100644
index 66f136a..0000000
--- a/node_modules/rxjs/internal/operators/timestamp.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timestamp.js","sources":["../../src/internal/operators/timestamp.ts"],"names":[],"mappings":";;AACA,4CAA2C;AAE3C,6BAA4B;AAoC5B,SAAgB,SAAS,CAAI,SAAgC;IAAhC,0BAAA,EAAA,YAA2B,aAAK;IAC3D,OAAO,SAAG,CAAC,UAAC,KAAQ,IAAK,OAAA,IAAI,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,EAArC,CAAqC,CAAC,CAAC;AAElE,CAAC;AAHD,8BAGC;AAED;IACE,mBAAmB,KAAQ,EAAS,SAAiB;QAAlC,UAAK,GAAL,KAAK,CAAG;QAAS,cAAS,GAAT,SAAS,CAAQ;IACrD,CAAC;IACH,gBAAC;AAAD,CAAC,AAHD,IAGC;AAHY,8BAAS"}
diff --git a/node_modules/rxjs/internal/operators/toArray.d.ts b/node_modules/rxjs/internal/operators/toArray.d.ts
deleted file mode 100644
index 2103751..0000000
--- a/node_modules/rxjs/internal/operators/toArray.d.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { OperatorFunction } from '../types';
-/**
- * Collects all source emissions and emits them as an array when the source completes.
- *
- * <span class="informal">Get all values inside an array when the source completes</span>
- *
- * ![](toArray.png)
- *
- * `toArray` will wait until the source Observable completes before emitting
- * the array containing all emissions. When the source Observable errors no
- * array will be emitted.
- *
- *  ## Example
- * ```ts
- * import { interval } from 'rxjs';
- * import { toArray, take } from 'rxjs/operators';
- *
- * const source = interval(1000);
- * const example = source.pipe(
- *   take(10),
- *   toArray()
- * );
- *
- * const subscribe = example.subscribe(val => console.log(val));
- *
- * // output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- *
- * ```
-* @return An array from an observable sequence.
-* @method toArray
-* @owner Observable
-*/
-export declare function toArray<T>(): OperatorFunction<T, T[]>;
diff --git a/node_modules/rxjs/internal/operators/toArray.js b/node_modules/rxjs/internal/operators/toArray.js
deleted file mode 100644
index ca6639f..0000000
--- a/node_modules/rxjs/internal/operators/toArray.js
+++ /dev/null
@@ -1,15 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var reduce_1 = require("./reduce");
-function toArrayReducer(arr, item, index) {
-    if (index === 0) {
-        return [item];
-    }
-    arr.push(item);
-    return arr;
-}
-function toArray() {
-    return reduce_1.reduce(toArrayReducer, []);
-}
-exports.toArray = toArray;
-//# sourceMappingURL=toArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/toArray.js.map b/node_modules/rxjs/internal/operators/toArray.js.map
deleted file mode 100644
index 5064cfa..0000000
--- a/node_modules/rxjs/internal/operators/toArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"toArray.js","sources":["../../src/internal/operators/toArray.ts"],"names":[],"mappings":";;AAAA,mCAAkC;AAGlC,SAAS,cAAc,CAAI,GAAQ,EAAE,IAAO,EAAE,KAAa;IACzD,IAAI,KAAK,KAAK,CAAC,EAAE;QACf,OAAO,CAAC,IAAI,CAAC,CAAC;KACf;IACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC;AAiCD,SAAgB,OAAO;IACrB,OAAO,eAAM,CAAC,cAAc,EAAE,EAAS,CAAC,CAAC;AAC3C,CAAC;AAFD,0BAEC"}
diff --git a/node_modules/rxjs/internal/operators/window.d.ts b/node_modules/rxjs/internal/operators/window.d.ts
deleted file mode 100644
index ae29815..0000000
--- a/node_modules/rxjs/internal/operators/window.d.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-/**
- * Branch out the source Observable values as a nested Observable whenever
- * `windowBoundaries` emits.
- *
- * <span class="informal">It's like {@link buffer}, but emits a nested Observable
- * instead of an array.</span>
- *
- * ![](window.png)
- *
- * Returns an Observable that emits windows of items it collects from the source
- * Observable. The output Observable emits connected, non-overlapping
- * windows. It emits the current window and opens a new one whenever the
- * Observable `windowBoundaries` emits an item. Because each window is an
- * Observable, the output is a higher-order Observable.
- *
- * ## Example
- * In every window of 1 second each, emit at most 2 click events
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { window, mergeAll, map, take } from 'rxjs/operators';
- *
- *  const clicks = fromEvent(document, 'click');
- *  const sec = interval(1000);
- *  const result = clicks.pipe(
- *      window(sec),
- *      map(win => win.pipe(take(2))), // each window has at most 2 emissions
- *      mergeAll(),              // flatten the Observable-of-Observables
- *  );
- *  result.subscribe(x => console.log(x));
- * ```
- * @see {@link windowCount}
- * @see {@link windowTime}
- * @see {@link windowToggle}
- * @see {@link windowWhen}
- * @see {@link buffer}
- *
- * @param {Observable<any>} windowBoundaries An Observable that completes the
- * previous window and starts a new window.
- * @return {Observable<Observable<T>>} An Observable of windows, which are
- * Observables emitting values of the source Observable.
- * @method window
- * @owner Observable
- */
-export declare function window<T>(windowBoundaries: Observable<any>): OperatorFunction<T, Observable<T>>;
diff --git a/node_modules/rxjs/internal/operators/window.js b/node_modules/rxjs/internal/operators/window.js
deleted file mode 100644
index 338b9fe..0000000
--- a/node_modules/rxjs/internal/operators/window.js
+++ /dev/null
@@ -1,81 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function window(windowBoundaries) {
-    return function windowOperatorFunction(source) {
-        return source.lift(new WindowOperator(windowBoundaries));
-    };
-}
-exports.window = window;
-var WindowOperator = (function () {
-    function WindowOperator(windowBoundaries) {
-        this.windowBoundaries = windowBoundaries;
-    }
-    WindowOperator.prototype.call = function (subscriber, source) {
-        var windowSubscriber = new WindowSubscriber(subscriber);
-        var sourceSubscription = source.subscribe(windowSubscriber);
-        if (!sourceSubscription.closed) {
-            windowSubscriber.add(subscribeToResult_1.subscribeToResult(windowSubscriber, this.windowBoundaries));
-        }
-        return sourceSubscription;
-    };
-    return WindowOperator;
-}());
-var WindowSubscriber = (function (_super) {
-    __extends(WindowSubscriber, _super);
-    function WindowSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.window = new Subject_1.Subject();
-        destination.next(_this.window);
-        return _this;
-    }
-    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openWindow();
-    };
-    WindowSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
-        this._complete();
-    };
-    WindowSubscriber.prototype._next = function (value) {
-        this.window.next(value);
-    };
-    WindowSubscriber.prototype._error = function (err) {
-        this.window.error(err);
-        this.destination.error(err);
-    };
-    WindowSubscriber.prototype._complete = function () {
-        this.window.complete();
-        this.destination.complete();
-    };
-    WindowSubscriber.prototype._unsubscribe = function () {
-        this.window = null;
-    };
-    WindowSubscriber.prototype.openWindow = function () {
-        var prevWindow = this.window;
-        if (prevWindow) {
-            prevWindow.complete();
-        }
-        var destination = this.destination;
-        var newWindow = this.window = new Subject_1.Subject();
-        destination.next(newWindow);
-    };
-    return WindowSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=window.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/window.js.map b/node_modules/rxjs/internal/operators/window.js.map
deleted file mode 100644
index 0b6b505..0000000
--- a/node_modules/rxjs/internal/operators/window.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"window.js","sources":["../../src/internal/operators/window.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,sCAAqC;AAErC,sDAAqD;AAErD,+DAA8D;AA8C9D,SAAgB,MAAM,CAAI,gBAAiC;IACzD,OAAO,SAAS,sBAAsB,CAAC,MAAqB;QAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC;AACJ,CAAC;AAJD,wBAIC;AAED;IAEE,wBAAoB,gBAAiC;QAAjC,qBAAgB,GAAhB,gBAAgB,CAAiB;IACrD,CAAC;IAED,6BAAI,GAAJ,UAAK,UAAqC,EAAE,MAAW;QACrD,IAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAM,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC9D,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YAC9B,gBAAgB,CAAC,GAAG,CAAC,qCAAiB,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;SAClF;QACD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACH,qBAAC;AAAD,CAAC,AAbD,IAaC;AAOD;IAAkC,oCAAuB;IAIvD,0BAAY,WAAsC;QAAlD,YACE,kBAAM,WAAW,CAAC,SAEnB;QALO,YAAM,GAAe,IAAI,iBAAO,EAAK,CAAC;QAI5C,WAAW,CAAC,IAAI,CAAC,KAAI,CAAC,MAAM,CAAC,CAAC;;IAChC,CAAC;IAED,qCAAU,GAAV,UAAW,UAAa,EAAE,UAAe,EAC9B,UAAkB,EAAE,UAAkB,EACtC,QAAiC;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,sCAAW,GAAX,UAAY,KAAU,EAAE,QAAiC;QACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,yCAAc,GAAd,UAAe,QAAiC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAES,gCAAK,GAAf,UAAgB,KAAQ;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAES,iCAAM,GAAhB,UAAiB,GAAQ;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAES,oCAAS,GAAnB;QACE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAGD,uCAAY,GAAZ;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAEO,qCAAU,GAAlB;QACE,IAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC/B,IAAI,UAAU,EAAE;YACd,UAAU,CAAC,QAAQ,EAAE,CAAC;SACvB;QACD,IAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAO,EAAK,CAAC;QACjD,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IACH,uBAAC;AAAD,CAAC,AAnDD,CAAkC,iCAAe,GAmDhD"}
diff --git a/node_modules/rxjs/internal/operators/windowCount.d.ts b/node_modules/rxjs/internal/operators/windowCount.d.ts
deleted file mode 100644
index 3e5ed18..0000000
--- a/node_modules/rxjs/internal/operators/windowCount.d.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-/**
- * Branch out the source Observable values as a nested Observable with each
- * nested Observable emitting at most `windowSize` values.
- *
- * <span class="informal">It's like {@link bufferCount}, but emits a nested
- * Observable instead of an array.</span>
- *
- * ![](windowCount.png)
- *
- * Returns an Observable that emits windows of items it collects from the source
- * Observable. The output Observable emits windows every `startWindowEvery`
- * items, each containing no more than `windowSize` items. When the source
- * Observable completes or encounters an error, the output Observable emits
- * the current window and propagates the notification from the source
- * Observable. If `startWindowEvery` is not provided, then new windows are
- * started immediately at the start of the source and when each window completes
- * with size `windowSize`.
- *
- * ## Examples
- * Ignore every 3rd click event, starting from the first one
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { windowCount, map, mergeAll, skip } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   windowCount(3),
- *   map(win => win.pipe(skip(1))), // skip first of every 3 clicks
- *   mergeAll()                     // flatten the Observable-of-Observables
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * Ignore every 3rd click event, starting from the third one
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { windowCount, mergeAll } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   windowCount(2, 3),
- *   mergeAll(),              // flatten the Observable-of-Observables
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link window}
- * @see {@link windowTime}
- * @see {@link windowToggle}
- * @see {@link windowWhen}
- * @see {@link bufferCount}
- *
- * @param {number} windowSize The maximum number of values emitted by each
- * window.
- * @param {number} [startWindowEvery] Interval at which to start a new window.
- * For example if `startWindowEvery` is `2`, then a new window will be started
- * on every other value from the source. A new window is started at the
- * beginning of the source by default.
- * @return {Observable<Observable<T>>} An Observable of windows, which in turn
- * are Observable of values.
- * @method windowCount
- * @owner Observable
- */
-export declare function windowCount<T>(windowSize: number, startWindowEvery?: number): OperatorFunction<T, Observable<T>>;
diff --git a/node_modules/rxjs/internal/operators/windowCount.js b/node_modules/rxjs/internal/operators/windowCount.js
deleted file mode 100644
index 0bc25a0..0000000
--- a/node_modules/rxjs/internal/operators/windowCount.js
+++ /dev/null
@@ -1,90 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Subject_1 = require("../Subject");
-function windowCount(windowSize, startWindowEvery) {
-    if (startWindowEvery === void 0) { startWindowEvery = 0; }
-    return function windowCountOperatorFunction(source) {
-        return source.lift(new WindowCountOperator(windowSize, startWindowEvery));
-    };
-}
-exports.windowCount = windowCount;
-var WindowCountOperator = (function () {
-    function WindowCountOperator(windowSize, startWindowEvery) {
-        this.windowSize = windowSize;
-        this.startWindowEvery = startWindowEvery;
-    }
-    WindowCountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));
-    };
-    return WindowCountOperator;
-}());
-var WindowCountSubscriber = (function (_super) {
-    __extends(WindowCountSubscriber, _super);
-    function WindowCountSubscriber(destination, windowSize, startWindowEvery) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.windowSize = windowSize;
-        _this.startWindowEvery = startWindowEvery;
-        _this.windows = [new Subject_1.Subject()];
-        _this.count = 0;
-        destination.next(_this.windows[0]);
-        return _this;
-    }
-    WindowCountSubscriber.prototype._next = function (value) {
-        var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;
-        var destination = this.destination;
-        var windowSize = this.windowSize;
-        var windows = this.windows;
-        var len = windows.length;
-        for (var i = 0; i < len && !this.closed; i++) {
-            windows[i].next(value);
-        }
-        var c = this.count - windowSize + 1;
-        if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {
-            windows.shift().complete();
-        }
-        if (++this.count % startWindowEvery === 0 && !this.closed) {
-            var window_1 = new Subject_1.Subject();
-            windows.push(window_1);
-            destination.next(window_1);
-        }
-    };
-    WindowCountSubscriber.prototype._error = function (err) {
-        var windows = this.windows;
-        if (windows) {
-            while (windows.length > 0 && !this.closed) {
-                windows.shift().error(err);
-            }
-        }
-        this.destination.error(err);
-    };
-    WindowCountSubscriber.prototype._complete = function () {
-        var windows = this.windows;
-        if (windows) {
-            while (windows.length > 0 && !this.closed) {
-                windows.shift().complete();
-            }
-        }
-        this.destination.complete();
-    };
-    WindowCountSubscriber.prototype._unsubscribe = function () {
-        this.count = 0;
-        this.windows = null;
-    };
-    return WindowCountSubscriber;
-}(Subscriber_1.Subscriber));
-//# sourceMappingURL=windowCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/windowCount.js.map b/node_modules/rxjs/internal/operators/windowCount.js.map
deleted file mode 100644
index 5ac86c0..0000000
--- a/node_modules/rxjs/internal/operators/windowCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowCount.js","sources":["../../src/internal/operators/windowCount.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/windowTime.d.ts b/node_modules/rxjs/internal/operators/windowTime.d.ts
deleted file mode 100644
index 2d793d5..0000000
--- a/node_modules/rxjs/internal/operators/windowTime.d.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction, SchedulerLike } from '../types';
-/**
- * Branch out the source Observable values as a nested Observable periodically
- * in time.
- *
- * <span class="informal">It's like {@link bufferTime}, but emits a nested
- * Observable instead of an array.</span>
- *
- * ![](windowTime.png)
- *
- * Returns an Observable that emits windows of items it collects from the source
- * Observable. The output Observable starts a new window periodically, as
- * determined by the `windowCreationInterval` argument. It emits each window
- * after a fixed timespan, specified by the `windowTimeSpan` argument. When the
- * source Observable completes or encounters an error, the output Observable
- * emits the current window and propagates the notification from the source
- * Observable. If `windowCreationInterval` is not provided, the output
- * Observable starts a new window when the previous window of duration
- * `windowTimeSpan` completes. If `maxWindowCount` is provided, each window
- * will emit at most fixed number of values. Window will complete immediately
- * after emitting last value and next one still will open as specified by
- * `windowTimeSpan` and `windowCreationInterval` arguments.
- *
- * ## Examples
- * In every window of 1 second each, emit at most 2 click events
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { windowTime, map, mergeAll, take } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   windowTime(1000),
- *   map(win => win.pipe(take(2))), // each window has at most 2 emissions
- *   mergeAll(),                    // flatten the Observable-of-Observables
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * Every 5 seconds start a window 1 second long, and emit at most 2 click events per window
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { windowTime, map, mergeAll, take } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   windowTime(1000, 5000),
- *   map(win => win.pipe(take(2))), // each window has at most 2 emissions
- *   mergeAll(),                    // flatten the Observable-of-Observables
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * Same as example above but with maxWindowCount instead of take
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { windowTime, mergeAll } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   windowTime(1000, 5000, 2), // each window has still at most 2 emissions
- *   mergeAll(),                // flatten the Observable-of-Observables
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link window}
- * @see {@link windowCount}
- * @see {@link windowToggle}
- * @see {@link windowWhen}
- * @see {@link bufferTime}
- *
- * @param {number} windowTimeSpan The amount of time to fill each window.
- * @param {number} [windowCreationInterval] The interval at which to start new
- * windows.
- * @param {number} [maxWindowSize=Number.POSITIVE_INFINITY] Max number of
- * values each window can emit before completion.
- * @param {SchedulerLike} [scheduler=async] The scheduler on which to schedule the
- * intervals that determine window boundaries.
- * @return {Observable<Observable<T>>} An observable of windows, which in turn
- * are Observables.
- * @method windowTime
- * @owner Observable
- */
-export declare function windowTime<T>(windowTimeSpan: number, scheduler?: SchedulerLike): OperatorFunction<T, Observable<T>>;
-export declare function windowTime<T>(windowTimeSpan: number, windowCreationInterval: number, scheduler?: SchedulerLike): OperatorFunction<T, Observable<T>>;
-export declare function windowTime<T>(windowTimeSpan: number, windowCreationInterval: number, maxWindowSize: number, scheduler?: SchedulerLike): OperatorFunction<T, Observable<T>>;
diff --git a/node_modules/rxjs/internal/operators/windowTime.js b/node_modules/rxjs/internal/operators/windowTime.js
deleted file mode 100644
index aa1ac21..0000000
--- a/node_modules/rxjs/internal/operators/windowTime.js
+++ /dev/null
@@ -1,169 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var async_1 = require("../scheduler/async");
-var Subscriber_1 = require("../Subscriber");
-var isNumeric_1 = require("../util/isNumeric");
-var isScheduler_1 = require("../util/isScheduler");
-function windowTime(windowTimeSpan) {
-    var scheduler = async_1.async;
-    var windowCreationInterval = null;
-    var maxWindowSize = Number.POSITIVE_INFINITY;
-    if (isScheduler_1.isScheduler(arguments[3])) {
-        scheduler = arguments[3];
-    }
-    if (isScheduler_1.isScheduler(arguments[2])) {
-        scheduler = arguments[2];
-    }
-    else if (isNumeric_1.isNumeric(arguments[2])) {
-        maxWindowSize = arguments[2];
-    }
-    if (isScheduler_1.isScheduler(arguments[1])) {
-        scheduler = arguments[1];
-    }
-    else if (isNumeric_1.isNumeric(arguments[1])) {
-        windowCreationInterval = arguments[1];
-    }
-    return function windowTimeOperatorFunction(source) {
-        return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler));
-    };
-}
-exports.windowTime = windowTime;
-var WindowTimeOperator = (function () {
-    function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
-        this.windowTimeSpan = windowTimeSpan;
-        this.windowCreationInterval = windowCreationInterval;
-        this.maxWindowSize = maxWindowSize;
-        this.scheduler = scheduler;
-    }
-    WindowTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler));
-    };
-    return WindowTimeOperator;
-}());
-var CountedSubject = (function (_super) {
-    __extends(CountedSubject, _super);
-    function CountedSubject() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this._numberOfNextedValues = 0;
-        return _this;
-    }
-    CountedSubject.prototype.next = function (value) {
-        this._numberOfNextedValues++;
-        _super.prototype.next.call(this, value);
-    };
-    Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", {
-        get: function () {
-            return this._numberOfNextedValues;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return CountedSubject;
-}(Subject_1.Subject));
-var WindowTimeSubscriber = (function (_super) {
-    __extends(WindowTimeSubscriber, _super);
-    function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.windowTimeSpan = windowTimeSpan;
-        _this.windowCreationInterval = windowCreationInterval;
-        _this.maxWindowSize = maxWindowSize;
-        _this.scheduler = scheduler;
-        _this.windows = [];
-        var window = _this.openWindow();
-        if (windowCreationInterval !== null && windowCreationInterval >= 0) {
-            var closeState = { subscriber: _this, window: window, context: null };
-            var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler };
-            _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState));
-            _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState));
-        }
-        else {
-            var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan };
-            _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));
-        }
-        return _this;
-    }
-    WindowTimeSubscriber.prototype._next = function (value) {
-        var windows = this.windows;
-        var len = windows.length;
-        for (var i = 0; i < len; i++) {
-            var window_1 = windows[i];
-            if (!window_1.closed) {
-                window_1.next(value);
-                if (window_1.numberOfNextedValues >= this.maxWindowSize) {
-                    this.closeWindow(window_1);
-                }
-            }
-        }
-    };
-    WindowTimeSubscriber.prototype._error = function (err) {
-        var windows = this.windows;
-        while (windows.length > 0) {
-            windows.shift().error(err);
-        }
-        this.destination.error(err);
-    };
-    WindowTimeSubscriber.prototype._complete = function () {
-        var windows = this.windows;
-        while (windows.length > 0) {
-            var window_2 = windows.shift();
-            if (!window_2.closed) {
-                window_2.complete();
-            }
-        }
-        this.destination.complete();
-    };
-    WindowTimeSubscriber.prototype.openWindow = function () {
-        var window = new CountedSubject();
-        this.windows.push(window);
-        var destination = this.destination;
-        destination.next(window);
-        return window;
-    };
-    WindowTimeSubscriber.prototype.closeWindow = function (window) {
-        window.complete();
-        var windows = this.windows;
-        windows.splice(windows.indexOf(window), 1);
-    };
-    return WindowTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchWindowTimeSpanOnly(state) {
-    var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window;
-    if (window) {
-        subscriber.closeWindow(window);
-    }
-    state.window = subscriber.openWindow();
-    this.schedule(state, windowTimeSpan);
-}
-function dispatchWindowCreation(state) {
-    var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval;
-    var window = subscriber.openWindow();
-    var action = this;
-    var context = { action: action, subscription: null };
-    var timeSpanState = { subscriber: subscriber, window: window, context: context };
-    context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState);
-    action.add(context.subscription);
-    action.schedule(state, windowCreationInterval);
-}
-function dispatchWindowClose(state) {
-    var subscriber = state.subscriber, window = state.window, context = state.context;
-    if (context && context.action && context.subscription) {
-        context.action.remove(context.subscription);
-    }
-    subscriber.closeWindow(window);
-}
-//# sourceMappingURL=windowTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/windowTime.js.map b/node_modules/rxjs/internal/operators/windowTime.js.map
deleted file mode 100644
index 549193c..0000000
--- a/node_modules/rxjs/internal/operators/windowTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowTime.js","sources":["../../src/internal/operators/windowTime.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/windowToggle.d.ts b/node_modules/rxjs/internal/operators/windowToggle.d.ts
deleted file mode 100644
index b71f351..0000000
--- a/node_modules/rxjs/internal/operators/windowToggle.d.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-/**
- * Branch out the source Observable values as a nested Observable starting from
- * an emission from `openings` and ending when the output of `closingSelector`
- * emits.
- *
- * <span class="informal">It's like {@link bufferToggle}, but emits a nested
- * Observable instead of an array.</span>
- *
- * ![](windowToggle.png)
- *
- * Returns an Observable that emits windows of items it collects from the source
- * Observable. The output Observable emits windows that contain those items
- * emitted by the source Observable between the time when the `openings`
- * Observable emits an item and when the Observable returned by
- * `closingSelector` emits an item.
- *
- * ## Example
- * Every other second, emit the click events from the next 500ms
- * ```ts
- * import { fromEvent, interval, EMPTY } from 'rxjs';
- * import { windowToggle, mergeAll } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const openings = interval(1000);
- * const result = clicks.pipe(
- *   windowToggle(openings, i => i % 2 ? interval(500) : EMPTY),
- *   mergeAll()
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link window}
- * @see {@link windowCount}
- * @see {@link windowTime}
- * @see {@link windowWhen}
- * @see {@link bufferToggle}
- *
- * @param {Observable<O>} openings An observable of notifications to start new
- * windows.
- * @param {function(value: O): Observable} closingSelector A function that takes
- * the value emitted by the `openings` observable and returns an Observable,
- * which, when it emits (either `next` or `complete`), signals that the
- * associated window should complete.
- * @return {Observable<Observable<T>>} An observable of windows, which in turn
- * are Observables.
- * @method windowToggle
- * @owner Observable
- */
-export declare function windowToggle<T, O>(openings: Observable<O>, closingSelector: (openValue: O) => Observable<any>): OperatorFunction<T, Observable<T>>;
diff --git a/node_modules/rxjs/internal/operators/windowToggle.js b/node_modules/rxjs/internal/operators/windowToggle.js
deleted file mode 100644
index c0d144a..0000000
--- a/node_modules/rxjs/internal/operators/windowToggle.js
+++ /dev/null
@@ -1,143 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var Subscription_1 = require("../Subscription");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function windowToggle(openings, closingSelector) {
-    return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); };
-}
-exports.windowToggle = windowToggle;
-var WindowToggleOperator = (function () {
-    function WindowToggleOperator(openings, closingSelector) {
-        this.openings = openings;
-        this.closingSelector = closingSelector;
-    }
-    WindowToggleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector));
-    };
-    return WindowToggleOperator;
-}());
-var WindowToggleSubscriber = (function (_super) {
-    __extends(WindowToggleSubscriber, _super);
-    function WindowToggleSubscriber(destination, openings, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.openings = openings;
-        _this.closingSelector = closingSelector;
-        _this.contexts = [];
-        _this.add(_this.openSubscription = subscribeToResult_1.subscribeToResult(_this, openings, openings));
-        return _this;
-    }
-    WindowToggleSubscriber.prototype._next = function (value) {
-        var contexts = this.contexts;
-        if (contexts) {
-            var len = contexts.length;
-            for (var i = 0; i < len; i++) {
-                contexts[i].window.next(value);
-            }
-        }
-    };
-    WindowToggleSubscriber.prototype._error = function (err) {
-        var contexts = this.contexts;
-        this.contexts = null;
-        if (contexts) {
-            var len = contexts.length;
-            var index = -1;
-            while (++index < len) {
-                var context_1 = contexts[index];
-                context_1.window.error(err);
-                context_1.subscription.unsubscribe();
-            }
-        }
-        _super.prototype._error.call(this, err);
-    };
-    WindowToggleSubscriber.prototype._complete = function () {
-        var contexts = this.contexts;
-        this.contexts = null;
-        if (contexts) {
-            var len = contexts.length;
-            var index = -1;
-            while (++index < len) {
-                var context_2 = contexts[index];
-                context_2.window.complete();
-                context_2.subscription.unsubscribe();
-            }
-        }
-        _super.prototype._complete.call(this);
-    };
-    WindowToggleSubscriber.prototype._unsubscribe = function () {
-        var contexts = this.contexts;
-        this.contexts = null;
-        if (contexts) {
-            var len = contexts.length;
-            var index = -1;
-            while (++index < len) {
-                var context_3 = contexts[index];
-                context_3.window.unsubscribe();
-                context_3.subscription.unsubscribe();
-            }
-        }
-    };
-    WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (outerValue === this.openings) {
-            var closingNotifier = void 0;
-            try {
-                var closingSelector = this.closingSelector;
-                closingNotifier = closingSelector(innerValue);
-            }
-            catch (e) {
-                return this.error(e);
-            }
-            var window_1 = new Subject_1.Subject();
-            var subscription = new Subscription_1.Subscription();
-            var context_4 = { window: window_1, subscription: subscription };
-            this.contexts.push(context_4);
-            var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context_4);
-            if (innerSubscription.closed) {
-                this.closeWindow(this.contexts.length - 1);
-            }
-            else {
-                innerSubscription.context = context_4;
-                subscription.add(innerSubscription);
-            }
-            this.destination.next(window_1);
-        }
-        else {
-            this.closeWindow(this.contexts.indexOf(outerValue));
-        }
-    };
-    WindowToggleSubscriber.prototype.notifyError = function (err) {
-        this.error(err);
-    };
-    WindowToggleSubscriber.prototype.notifyComplete = function (inner) {
-        if (inner !== this.openSubscription) {
-            this.closeWindow(this.contexts.indexOf(inner.context));
-        }
-    };
-    WindowToggleSubscriber.prototype.closeWindow = function (index) {
-        if (index === -1) {
-            return;
-        }
-        var contexts = this.contexts;
-        var context = contexts[index];
-        var window = context.window, subscription = context.subscription;
-        contexts.splice(index, 1);
-        window.complete();
-        subscription.unsubscribe();
-    };
-    return WindowToggleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=windowToggle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/windowToggle.js.map b/node_modules/rxjs/internal/operators/windowToggle.js.map
deleted file mode 100644
index 7cd4830..0000000
--- a/node_modules/rxjs/internal/operators/windowToggle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowToggle.js","sources":["../../src/internal/operators/windowToggle.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/windowWhen.d.ts b/node_modules/rxjs/internal/operators/windowWhen.d.ts
deleted file mode 100644
index bb92a73..0000000
--- a/node_modules/rxjs/internal/operators/windowWhen.d.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-/**
- * Branch out the source Observable values as a nested Observable using a
- * factory function of closing Observables to determine when to start a new
- * window.
- *
- * <span class="informal">It's like {@link bufferWhen}, but emits a nested
- * Observable instead of an array.</span>
- *
- * ![](windowWhen.png)
- *
- * Returns an Observable that emits windows of items it collects from the source
- * Observable. The output Observable emits connected, non-overlapping windows.
- * It emits the current window and opens a new one whenever the Observable
- * produced by the specified `closingSelector` function emits an item. The first
- * window is opened immediately when subscribing to the output Observable.
- *
- * ## Example
- * Emit only the first two clicks events in every window of [1-5] random seconds
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { windowWhen, map, mergeAll, take } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   windowWhen(() => interval(1000 + Math.random() * 4000)),
- *   map(win => win.pipe(take(2))),     // each window has at most 2 emissions
- *   mergeAll()                         // flatten the Observable-of-Observables
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link window}
- * @see {@link windowCount}
- * @see {@link windowTime}
- * @see {@link windowToggle}
- * @see {@link bufferWhen}
- *
- * @param {function(): Observable} closingSelector A function that takes no
- * arguments and returns an Observable that signals (on either `next` or
- * `complete`) when to close the previous window and start a new one.
- * @return {Observable<Observable<T>>} An observable of windows, which in turn
- * are Observables.
- * @method windowWhen
- * @owner Observable
- */
-export declare function windowWhen<T>(closingSelector: () => Observable<any>): OperatorFunction<T, Observable<T>>;
diff --git a/node_modules/rxjs/internal/operators/windowWhen.js b/node_modules/rxjs/internal/operators/windowWhen.js
deleted file mode 100644
index acd73c4..0000000
--- a/node_modules/rxjs/internal/operators/windowWhen.js
+++ /dev/null
@@ -1,96 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function windowWhen(closingSelector) {
-    return function windowWhenOperatorFunction(source) {
-        return source.lift(new WindowOperator(closingSelector));
-    };
-}
-exports.windowWhen = windowWhen;
-var WindowOperator = (function () {
-    function WindowOperator(closingSelector) {
-        this.closingSelector = closingSelector;
-    }
-    WindowOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector));
-    };
-    return WindowOperator;
-}());
-var WindowSubscriber = (function (_super) {
-    __extends(WindowSubscriber, _super);
-    function WindowSubscriber(destination, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.closingSelector = closingSelector;
-        _this.openWindow();
-        return _this;
-    }
-    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openWindow(innerSub);
-    };
-    WindowSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.openWindow(innerSub);
-    };
-    WindowSubscriber.prototype._next = function (value) {
-        this.window.next(value);
-    };
-    WindowSubscriber.prototype._error = function (err) {
-        this.window.error(err);
-        this.destination.error(err);
-        this.unsubscribeClosingNotification();
-    };
-    WindowSubscriber.prototype._complete = function () {
-        this.window.complete();
-        this.destination.complete();
-        this.unsubscribeClosingNotification();
-    };
-    WindowSubscriber.prototype.unsubscribeClosingNotification = function () {
-        if (this.closingNotification) {
-            this.closingNotification.unsubscribe();
-        }
-    };
-    WindowSubscriber.prototype.openWindow = function (innerSub) {
-        if (innerSub === void 0) { innerSub = null; }
-        if (innerSub) {
-            this.remove(innerSub);
-            innerSub.unsubscribe();
-        }
-        var prevWindow = this.window;
-        if (prevWindow) {
-            prevWindow.complete();
-        }
-        var window = this.window = new Subject_1.Subject();
-        this.destination.next(window);
-        var closingNotifier;
-        try {
-            var closingSelector = this.closingSelector;
-            closingNotifier = closingSelector();
-        }
-        catch (e) {
-            this.destination.error(e);
-            this.window.error(e);
-            return;
-        }
-        this.add(this.closingNotification = subscribeToResult_1.subscribeToResult(this, closingNotifier));
-    };
-    return WindowSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=windowWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/windowWhen.js.map b/node_modules/rxjs/internal/operators/windowWhen.js.map
deleted file mode 100644
index 3e37ef0..0000000
--- a/node_modules/rxjs/internal/operators/windowWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowWhen.js","sources":["../../src/internal/operators/windowWhen.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/withLatestFrom.d.ts b/node_modules/rxjs/internal/operators/withLatestFrom.d.ts
deleted file mode 100644
index 7732a85..0000000
--- a/node_modules/rxjs/internal/operators/withLatestFrom.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-export declare function withLatestFrom<T, R>(project: (v1: T) => R): OperatorFunction<T, R>;
-export declare function withLatestFrom<T, O2 extends ObservableInput<any>, R>(source2: O2, project: (v1: T, v2: ObservedValueOf<O2>) => R): OperatorFunction<T, R>;
-export declare function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, R>(v2: O2, v3: O3, project: (v1: T, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>) => R): OperatorFunction<T, R>;
-export declare function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, R>(v2: O2, v3: O3, v4: O4, project: (v1: T, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>) => R): OperatorFunction<T, R>;
-export declare function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, R>(v2: O2, v3: O3, v4: O4, v5: O5, project: (v1: T, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>) => R): OperatorFunction<T, R>;
-export declare function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>, R>(v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, project: (v1: T, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>, v6: ObservedValueOf<O6>) => R): OperatorFunction<T, R>;
-export declare function withLatestFrom<T, O2 extends ObservableInput<any>>(source2: O2): OperatorFunction<T, [T, ObservedValueOf<O2>]>;
-export declare function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(v2: O2, v3: O3): OperatorFunction<T, [T, ObservedValueOf<O2>, ObservedValueOf<O3>]>;
-export declare function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(v2: O2, v3: O3, v4: O4): OperatorFunction<T, [T, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>]>;
-export declare function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(v2: O2, v3: O3, v4: O4, v5: O5): OperatorFunction<T, [T, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>]>;
-export declare function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(v2: O2, v3: O3, v4: O4, v5: O5, v6: O6): OperatorFunction<T, [T, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>, ObservedValueOf<O6>]>;
-export declare function withLatestFrom<T, R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): OperatorFunction<T, R>;
-export declare function withLatestFrom<T, R>(array: ObservableInput<any>[]): OperatorFunction<T, R>;
-export declare function withLatestFrom<T, R>(array: ObservableInput<any>[], project: (...values: Array<any>) => R): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/withLatestFrom.js b/node_modules/rxjs/internal/operators/withLatestFrom.js
deleted file mode 100644
index 100c92c..0000000
--- a/node_modules/rxjs/internal/operators/withLatestFrom.js
+++ /dev/null
@@ -1,97 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function withLatestFrom() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i] = arguments[_i];
-    }
-    return function (source) {
-        var project;
-        if (typeof args[args.length - 1] === 'function') {
-            project = args.pop();
-        }
-        var observables = args;
-        return source.lift(new WithLatestFromOperator(observables, project));
-    };
-}
-exports.withLatestFrom = withLatestFrom;
-var WithLatestFromOperator = (function () {
-    function WithLatestFromOperator(observables, project) {
-        this.observables = observables;
-        this.project = project;
-    }
-    WithLatestFromOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));
-    };
-    return WithLatestFromOperator;
-}());
-var WithLatestFromSubscriber = (function (_super) {
-    __extends(WithLatestFromSubscriber, _super);
-    function WithLatestFromSubscriber(destination, observables, project) {
-        var _this = _super.call(this, destination) || this;
-        _this.observables = observables;
-        _this.project = project;
-        _this.toRespond = [];
-        var len = observables.length;
-        _this.values = new Array(len);
-        for (var i = 0; i < len; i++) {
-            _this.toRespond.push(i);
-        }
-        for (var i = 0; i < len; i++) {
-            var observable = observables[i];
-            _this.add(subscribeToResult_1.subscribeToResult(_this, observable, observable, i));
-        }
-        return _this;
-    }
-    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values[outerIndex] = innerValue;
-        var toRespond = this.toRespond;
-        if (toRespond.length > 0) {
-            var found = toRespond.indexOf(outerIndex);
-            if (found !== -1) {
-                toRespond.splice(found, 1);
-            }
-        }
-    };
-    WithLatestFromSubscriber.prototype.notifyComplete = function () {
-    };
-    WithLatestFromSubscriber.prototype._next = function (value) {
-        if (this.toRespond.length === 0) {
-            var args = [value].concat(this.values);
-            if (this.project) {
-                this._tryProject(args);
-            }
-            else {
-                this.destination.next(args);
-            }
-        }
-    };
-    WithLatestFromSubscriber.prototype._tryProject = function (args) {
-        var result;
-        try {
-            result = this.project.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return WithLatestFromSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-//# sourceMappingURL=withLatestFrom.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/withLatestFrom.js.map b/node_modules/rxjs/internal/operators/withLatestFrom.js.map
deleted file mode 100644
index 6547f7e..0000000
--- a/node_modules/rxjs/internal/operators/withLatestFrom.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"withLatestFrom.js","sources":["../../src/internal/operators/withLatestFrom.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/operators/zip.d.ts b/node_modules/rxjs/internal/operators/zip.d.ts
deleted file mode 100644
index eadea67..0000000
--- a/node_modules/rxjs/internal/operators/zip.d.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { ObservableInput, OperatorFunction } from '../types';
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, R>(project: (v1: T) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, T2, R>(v2: ObservableInput<T2>, project: (v1: T, v2: T2) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, T2, T3, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, project: (v1: T, v2: T2, v3: T3) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, T2, T3, T4, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, project: (v1: T, v2: T2, v3: T3, v4: T4) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, T2, T3, T4, T5, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, T2, T3, T4, T5, T6, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, T2>(v2: ObservableInput<T2>): OperatorFunction<T, [T, T2]>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, T2, T3>(v2: ObservableInput<T2>, v3: ObservableInput<T3>): OperatorFunction<T, [T, T2, T3]>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, T2, T3, T4>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): OperatorFunction<T, [T, T2, T3, T4]>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, T2, T3, T4, T5>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): OperatorFunction<T, [T, T2, T3, T4, T5]>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, T2, T3, T4, T5, T6>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): OperatorFunction<T, [T, T2, T3, T4, T5, T6]>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, R>(...observables: Array<ObservableInput<T> | ((...values: Array<T>) => R)>): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, R>(array: Array<ObservableInput<T>>): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export declare function zip<T, TOther, R>(array: Array<ObservableInput<TOther>>, project: (v1: T, ...values: Array<TOther>) => R): OperatorFunction<T, R>;
diff --git a/node_modules/rxjs/internal/operators/zip.js b/node_modules/rxjs/internal/operators/zip.js
deleted file mode 100644
index 8e0620e..0000000
--- a/node_modules/rxjs/internal/operators/zip.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var zip_1 = require("../observable/zip");
-function zip() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function zipOperatorFunction(source) {
-        return source.lift.call(zip_1.zip.apply(void 0, [source].concat(observables)));
-    };
-}
-exports.zip = zip;
-//# sourceMappingURL=zip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/zip.js.map b/node_modules/rxjs/internal/operators/zip.js.map
deleted file mode 100644
index 3396fe7..0000000
--- a/node_modules/rxjs/internal/operators/zip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zip.js","sources":["../../src/internal/operators/zip.ts"],"names":[],"mappings":";;AAAA,yCAAqD;AAsCrD,SAAgB,GAAG;IAAO,qBAA4E;SAA5E,UAA4E,EAA5E,qBAA4E,EAA5E,IAA4E;QAA5E,gCAA4E;;IACpG,OAAO,SAAS,mBAAmB,CAAC,MAAqB;QACvD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,gBAAI,MAAM,SAAK,WAAW,GAAE,CAAC;IAChE,CAAC,CAAC;AACJ,CAAC;AAJD,kBAIC"}
diff --git a/node_modules/rxjs/internal/operators/zipAll.d.ts b/node_modules/rxjs/internal/operators/zipAll.d.ts
deleted file mode 100644
index d14e5aa..0000000
--- a/node_modules/rxjs/internal/operators/zipAll.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { OperatorFunction, ObservableInput } from '../types';
-export declare function zipAll<T>(): OperatorFunction<ObservableInput<T>, T[]>;
-export declare function zipAll<T>(): OperatorFunction<any, T[]>;
-export declare function zipAll<T, R>(project: (...values: T[]) => R): OperatorFunction<ObservableInput<T>, R>;
-export declare function zipAll<R>(project: (...values: Array<any>) => R): OperatorFunction<any, R>;
diff --git a/node_modules/rxjs/internal/operators/zipAll.js b/node_modules/rxjs/internal/operators/zipAll.js
deleted file mode 100644
index 40f88aa..0000000
--- a/node_modules/rxjs/internal/operators/zipAll.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var zip_1 = require("../observable/zip");
-function zipAll(project) {
-    return function (source) { return source.lift(new zip_1.ZipOperator(project)); };
-}
-exports.zipAll = zipAll;
-//# sourceMappingURL=zipAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/operators/zipAll.js.map b/node_modules/rxjs/internal/operators/zipAll.js.map
deleted file mode 100644
index b2e5895..0000000
--- a/node_modules/rxjs/internal/operators/zipAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zipAll.js","sources":["../../src/internal/operators/zipAll.ts"],"names":[],"mappings":";;AAAA,yCAAgD;AAShD,SAAgB,MAAM,CAAO,OAAsC;IACjE,OAAO,UAAC,MAAqB,IAAK,OAAA,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAW,CAAC,OAAO,CAAC,CAAC,EAArC,CAAqC,CAAC;AAC1E,CAAC;AAFD,wBAEC"}
diff --git a/node_modules/rxjs/internal/scheduled/scheduleArray.d.ts b/node_modules/rxjs/internal/scheduled/scheduleArray.d.ts
deleted file mode 100644
index bd519ce..0000000
--- a/node_modules/rxjs/internal/scheduled/scheduleArray.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-export declare function scheduleArray<T>(input: ArrayLike<T>, scheduler: SchedulerLike): Observable<T>;
diff --git a/node_modules/rxjs/internal/scheduled/scheduleArray.js b/node_modules/rxjs/internal/scheduled/scheduleArray.js
deleted file mode 100644
index 31938d2..0000000
--- a/node_modules/rxjs/internal/scheduled/scheduleArray.js
+++ /dev/null
@@ -1,23 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-function scheduleArray(input, scheduler) {
-    return new Observable_1.Observable(function (subscriber) {
-        var sub = new Subscription_1.Subscription();
-        var i = 0;
-        sub.add(scheduler.schedule(function () {
-            if (i === input.length) {
-                subscriber.complete();
-                return;
-            }
-            subscriber.next(input[i++]);
-            if (!subscriber.closed) {
-                sub.add(this.schedule());
-            }
-        }));
-        return sub;
-    });
-}
-exports.scheduleArray = scheduleArray;
-//# sourceMappingURL=scheduleArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduled/scheduleArray.js.map b/node_modules/rxjs/internal/scheduled/scheduleArray.js.map
deleted file mode 100644
index 4fb17f3..0000000
--- a/node_modules/rxjs/internal/scheduled/scheduleArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scheduleArray.js","sources":["../../src/internal/scheduled/scheduleArray.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAE3C,gDAA+C;AAE/C,SAAgB,aAAa,CAAI,KAAmB,EAAE,SAAwB;IAC5E,OAAO,IAAI,uBAAU,CAAI,UAAA,UAAU;QACjC,IAAM,GAAG,GAAG,IAAI,2BAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;YACzB,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE;gBACtB,UAAU,CAAC,QAAQ,EAAE,CAAC;gBACtB,OAAO;aACR;YACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;gBACtB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;aAC1B;QACH,CAAC,CAAC,CAAC,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAhBD,sCAgBC"}
diff --git a/node_modules/rxjs/internal/scheduled/scheduleIterable.d.ts b/node_modules/rxjs/internal/scheduled/scheduleIterable.d.ts
deleted file mode 100644
index baf3d96..0000000
--- a/node_modules/rxjs/internal/scheduled/scheduleIterable.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-export declare function scheduleIterable<T>(input: Iterable<T>, scheduler: SchedulerLike): Observable<T>;
diff --git a/node_modules/rxjs/internal/scheduled/scheduleIterable.js b/node_modules/rxjs/internal/scheduled/scheduleIterable.js
deleted file mode 100644
index 3cf6bc0..0000000
--- a/node_modules/rxjs/internal/scheduled/scheduleIterable.js
+++ /dev/null
@@ -1,48 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-var iterator_1 = require("../symbol/iterator");
-function scheduleIterable(input, scheduler) {
-    if (!input) {
-        throw new Error('Iterable cannot be null');
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var sub = new Subscription_1.Subscription();
-        var iterator;
-        sub.add(function () {
-            if (iterator && typeof iterator.return === 'function') {
-                iterator.return();
-            }
-        });
-        sub.add(scheduler.schedule(function () {
-            iterator = input[iterator_1.iterator]();
-            sub.add(scheduler.schedule(function () {
-                if (subscriber.closed) {
-                    return;
-                }
-                var value;
-                var done;
-                try {
-                    var result = iterator.next();
-                    value = result.value;
-                    done = result.done;
-                }
-                catch (err) {
-                    subscriber.error(err);
-                    return;
-                }
-                if (done) {
-                    subscriber.complete();
-                }
-                else {
-                    subscriber.next(value);
-                    this.schedule();
-                }
-            }));
-        }));
-        return sub;
-    });
-}
-exports.scheduleIterable = scheduleIterable;
-//# sourceMappingURL=scheduleIterable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduled/scheduleIterable.js.map b/node_modules/rxjs/internal/scheduled/scheduleIterable.js.map
deleted file mode 100644
index 018a115..0000000
--- a/node_modules/rxjs/internal/scheduled/scheduleIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scheduleIterable.js","sources":["../../src/internal/scheduled/scheduleIterable.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAE3C,gDAA+C;AAC/C,+CAAiE;AAEjE,SAAgB,gBAAgB,CAAI,KAAkB,EAAE,SAAwB;IAC9E,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;KAC5C;IACD,OAAO,IAAI,uBAAU,CAAI,UAAA,UAAU;QACjC,IAAM,GAAG,GAAG,IAAI,2BAAY,EAAE,CAAC;QAC/B,IAAI,QAAqB,CAAC;QAC1B,GAAG,CAAC,GAAG,CAAC;YAEN,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE;gBACrD,QAAQ,CAAC,MAAM,EAAE,CAAC;aACnB;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;YACzB,QAAQ,GAAG,KAAK,CAAC,mBAAe,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;gBACzB,IAAI,UAAU,CAAC,MAAM,EAAE;oBACrB,OAAO;iBACR;gBACD,IAAI,KAAQ,CAAC;gBACb,IAAI,IAAa,CAAC;gBAClB,IAAI;oBACF,IAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;oBAC/B,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;oBACrB,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;iBACpB;gBAAC,OAAO,GAAG,EAAE;oBACZ,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACtB,OAAO;iBACR;gBACD,IAAI,IAAI,EAAE;oBACR,UAAU,CAAC,QAAQ,EAAE,CAAC;iBACvB;qBAAM;oBACL,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;iBACjB;YACH,CAAC,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,CAAC,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAvCD,4CAuCC"}
diff --git a/node_modules/rxjs/internal/scheduled/scheduleObservable.d.ts b/node_modules/rxjs/internal/scheduled/scheduleObservable.d.ts
deleted file mode 100644
index 22b23b1..0000000
--- a/node_modules/rxjs/internal/scheduled/scheduleObservable.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { Observable } from '../Observable';
-import { InteropObservable, SchedulerLike } from '../types';
-export declare function scheduleObservable<T>(input: InteropObservable<T>, scheduler: SchedulerLike): Observable<T>;
diff --git a/node_modules/rxjs/internal/scheduled/scheduleObservable.js b/node_modules/rxjs/internal/scheduled/scheduleObservable.js
deleted file mode 100644
index 83e49c8..0000000
--- a/node_modules/rxjs/internal/scheduled/scheduleObservable.js
+++ /dev/null
@@ -1,21 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-var observable_1 = require("../symbol/observable");
-function scheduleObservable(input, scheduler) {
-    return new Observable_1.Observable(function (subscriber) {
-        var sub = new Subscription_1.Subscription();
-        sub.add(scheduler.schedule(function () {
-            var observable = input[observable_1.observable]();
-            sub.add(observable.subscribe({
-                next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); },
-                error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); },
-                complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); },
-            }));
-        }));
-        return sub;
-    });
-}
-exports.scheduleObservable = scheduleObservable;
-//# sourceMappingURL=scheduleObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduled/scheduleObservable.js.map b/node_modules/rxjs/internal/scheduled/scheduleObservable.js.map
deleted file mode 100644
index 14955a9..0000000
--- a/node_modules/rxjs/internal/scheduled/scheduleObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scheduleObservable.js","sources":["../../src/internal/scheduled/scheduleObservable.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAC3C,gDAA+C;AAC/C,mDAAuE;AAGvE,SAAgB,kBAAkB,CAAI,KAA2B,EAAE,SAAwB;IACzF,OAAO,IAAI,uBAAU,CAAI,UAAA,UAAU;QACjC,IAAM,GAAG,GAAG,IAAI,2BAAY,EAAE,CAAC;QAC/B,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;YACzB,IAAM,UAAU,GAAoB,KAAK,CAAC,uBAAiB,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;gBAC3B,IAAI,YAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAtB,CAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1E,KAAK,YAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAArB,CAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,QAAQ,gBAAK,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,UAAU,CAAC,QAAQ,EAAE,EAArB,CAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;aACzE,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,CAAC,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAbD,gDAaC"}
diff --git a/node_modules/rxjs/internal/scheduled/schedulePromise.d.ts b/node_modules/rxjs/internal/scheduled/schedulePromise.d.ts
deleted file mode 100644
index 9d56ab0..0000000
--- a/node_modules/rxjs/internal/scheduled/schedulePromise.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-export declare function schedulePromise<T>(input: PromiseLike<T>, scheduler: SchedulerLike): Observable<T>;
diff --git a/node_modules/rxjs/internal/scheduled/schedulePromise.js b/node_modules/rxjs/internal/scheduled/schedulePromise.js
deleted file mode 100644
index 826910d..0000000
--- a/node_modules/rxjs/internal/scheduled/schedulePromise.js
+++ /dev/null
@@ -1,20 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-function schedulePromise(input, scheduler) {
-    return new Observable_1.Observable(function (subscriber) {
-        var sub = new Subscription_1.Subscription();
-        sub.add(scheduler.schedule(function () { return input.then(function (value) {
-            sub.add(scheduler.schedule(function () {
-                subscriber.next(value);
-                sub.add(scheduler.schedule(function () { return subscriber.complete(); }));
-            }));
-        }, function (err) {
-            sub.add(scheduler.schedule(function () { return subscriber.error(err); }));
-        }); }));
-        return sub;
-    });
-}
-exports.schedulePromise = schedulePromise;
-//# sourceMappingURL=schedulePromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduled/schedulePromise.js.map b/node_modules/rxjs/internal/scheduled/schedulePromise.js.map
deleted file mode 100644
index f38e834..0000000
--- a/node_modules/rxjs/internal/scheduled/schedulePromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"schedulePromise.js","sources":["../../src/internal/scheduled/schedulePromise.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAE3C,gDAA+C;AAE/C,SAAgB,eAAe,CAAI,KAAqB,EAAE,SAAwB;IAChF,OAAO,IAAI,uBAAU,CAAI,UAAA,UAAU;QACjC,IAAM,GAAG,GAAG,IAAI,2BAAY,EAAE,CAAC;QAC/B,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,KAAK,CAAC,IAAI,CACzC,UAAA,KAAK;YACH,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;gBACzB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,UAAU,CAAC,QAAQ,EAAE,EAArB,CAAqB,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC,CAAC;QACN,CAAC,EACD,UAAA,GAAG;YACD,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAM,OAAA,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAArB,CAAqB,CAAC,CAAC,CAAC;QAC3D,CAAC,CACF,EAVgC,CAUhC,CAAC,CAAC,CAAC;QACJ,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAhBD,0CAgBC"}
diff --git a/node_modules/rxjs/internal/scheduled/scheduled.d.ts b/node_modules/rxjs/internal/scheduled/scheduled.d.ts
deleted file mode 100644
index 2f95c4e..0000000
--- a/node_modules/rxjs/internal/scheduled/scheduled.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { ObservableInput, SchedulerLike, Observable } from 'rxjs';
-/**
- * Converts from a common {@link ObservableInput} type to an observable where subscription and emissions
- * are scheduled on the provided scheduler.
- *
- * @see from
- * @see of
- *
- * @param input The observable, array, promise, iterable, etc you would like to schedule
- * @param scheduler The scheduler to use to schedule the subscription and emissions from
- * the returned observable.
- */
-export declare function scheduled<T>(input: ObservableInput<T>, scheduler: SchedulerLike): Observable<T>;
diff --git a/node_modules/rxjs/internal/scheduled/scheduled.js b/node_modules/rxjs/internal/scheduled/scheduled.js
deleted file mode 100644
index 4fd1554..0000000
--- a/node_modules/rxjs/internal/scheduled/scheduled.js
+++ /dev/null
@@ -1,29 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var scheduleObservable_1 = require("./scheduleObservable");
-var schedulePromise_1 = require("./schedulePromise");
-var scheduleArray_1 = require("./scheduleArray");
-var scheduleIterable_1 = require("./scheduleIterable");
-var isInteropObservable_1 = require("../util/isInteropObservable");
-var isPromise_1 = require("../util/isPromise");
-var isArrayLike_1 = require("../util/isArrayLike");
-var isIterable_1 = require("../util/isIterable");
-function scheduled(input, scheduler) {
-    if (input != null) {
-        if (isInteropObservable_1.isInteropObservable(input)) {
-            return scheduleObservable_1.scheduleObservable(input, scheduler);
-        }
-        else if (isPromise_1.isPromise(input)) {
-            return schedulePromise_1.schedulePromise(input, scheduler);
-        }
-        else if (isArrayLike_1.isArrayLike(input)) {
-            return scheduleArray_1.scheduleArray(input, scheduler);
-        }
-        else if (isIterable_1.isIterable(input) || typeof input === 'string') {
-            return scheduleIterable_1.scheduleIterable(input, scheduler);
-        }
-    }
-    throw new TypeError((input !== null && typeof input || input) + ' is not observable');
-}
-exports.scheduled = scheduled;
-//# sourceMappingURL=scheduled.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduled/scheduled.js.map b/node_modules/rxjs/internal/scheduled/scheduled.js.map
deleted file mode 100644
index 5d9e86c..0000000
--- a/node_modules/rxjs/internal/scheduled/scheduled.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scheduled.js","sources":["../../src/internal/scheduled/scheduled.ts"],"names":[],"mappings":";;AAAA,2DAA0D;AAC1D,qDAAoD;AACpD,iDAAgD;AAChD,uDAAsD;AAEtD,mEAAkE;AAClE,+CAA8C;AAC9C,mDAAkD;AAClD,iDAAgD;AAahD,SAAgB,SAAS,CAAI,KAAyB,EAAE,SAAwB;IAC9E,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,IAAI,yCAAmB,CAAC,KAAK,CAAC,EAAE;YAC9B,OAAO,uCAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SAC7C;aAAM,IAAI,qBAAS,CAAC,KAAK,CAAC,EAAE;YAC3B,OAAO,iCAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SAC1C;aAAM,IAAI,yBAAW,CAAC,KAAK,CAAC,EAAE;YAC7B,OAAO,6BAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SACxC;aAAO,IAAI,uBAAU,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC1D,OAAO,mCAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;SAC3C;KACF;IAED,MAAM,IAAI,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,KAAK,CAAC,GAAG,oBAAoB,CAAC,CAAC;AACxF,CAAC;AAdD,8BAcC"}
diff --git a/node_modules/rxjs/internal/scheduler/Action.d.ts b/node_modules/rxjs/internal/scheduler/Action.d.ts
deleted file mode 100644
index f1a860a..0000000
--- a/node_modules/rxjs/internal/scheduler/Action.d.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Scheduler } from '../Scheduler';
-import { Subscription } from '../Subscription';
-import { SchedulerAction } from '../types';
-/**
- * A unit of work to be executed in a `scheduler`. An action is typically
- * created from within a {@link SchedulerLike} and an RxJS user does not need to concern
- * themselves about creating and manipulating an Action.
- *
- * ```ts
- * class Action<T> extends Subscription {
- *   new (scheduler: Scheduler, work: (state?: T) => void);
- *   schedule(state?: T, delay: number = 0): Subscription;
- * }
- * ```
- *
- * @class Action<T>
- */
-export declare class Action<T> extends Subscription {
-    constructor(scheduler: Scheduler, work: (this: SchedulerAction<T>, state?: T) => void);
-    /**
-     * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed
-     * some context object, `state`. May happen at some point in the future,
-     * according to the `delay` parameter, if specified.
-     * @param {T} [state] Some contextual data that the `work` function uses when
-     * called by the Scheduler.
-     * @param {number} [delay] Time to wait before executing the work, where the
-     * time unit is implicit and defined by the Scheduler.
-     * @return {void}
-     */
-    schedule(state?: T, delay?: number): Subscription;
-}
diff --git a/node_modules/rxjs/internal/scheduler/Action.js b/node_modules/rxjs/internal/scheduler/Action.js
deleted file mode 100644
index 6c4e62c..0000000
--- a/node_modules/rxjs/internal/scheduler/Action.js
+++ /dev/null
@@ -1,29 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscription_1 = require("../Subscription");
-var Action = (function (_super) {
-    __extends(Action, _super);
-    function Action(scheduler, work) {
-        return _super.call(this) || this;
-    }
-    Action.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        return this;
-    };
-    return Action;
-}(Subscription_1.Subscription));
-exports.Action = Action;
-//# sourceMappingURL=Action.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/Action.js.map b/node_modules/rxjs/internal/scheduler/Action.js.map
deleted file mode 100644
index bd02c3a..0000000
--- a/node_modules/rxjs/internal/scheduler/Action.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Action.js","sources":["../../src/internal/scheduler/Action.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,gDAA+C;AAiB/C;IAA+B,0BAAY;IACzC,gBAAY,SAAoB,EAAE,IAAmD;eACnF,iBAAO;IACT,CAAC;IAWM,yBAAQ,GAAf,UAAgB,KAAS,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACH,aAAC;AAAD,CAAC,AAjBD,CAA+B,2BAAY,GAiB1C;AAjBY,wBAAM"}
diff --git a/node_modules/rxjs/internal/scheduler/AnimationFrameAction.d.ts b/node_modules/rxjs/internal/scheduler/AnimationFrameAction.d.ts
deleted file mode 100644
index 5ff0afa..0000000
--- a/node_modules/rxjs/internal/scheduler/AnimationFrameAction.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { AnimationFrameScheduler } from './AnimationFrameScheduler';
-import { SchedulerAction } from '../types';
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class AnimationFrameAction<T> extends AsyncAction<T> {
-    protected scheduler: AnimationFrameScheduler;
-    protected work: (this: SchedulerAction<T>, state?: T) => void;
-    constructor(scheduler: AnimationFrameScheduler, work: (this: SchedulerAction<T>, state?: T) => void);
-    protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: any, delay?: number): any;
-    protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: any, delay?: number): any;
-}
diff --git a/node_modules/rxjs/internal/scheduler/AnimationFrameAction.js b/node_modules/rxjs/internal/scheduler/AnimationFrameAction.js
deleted file mode 100644
index 92625aa..0000000
--- a/node_modules/rxjs/internal/scheduler/AnimationFrameAction.js
+++ /dev/null
@@ -1,47 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncAction_1 = require("./AsyncAction");
-var AnimationFrameAction = (function (_super) {
-    __extends(AnimationFrameAction, _super);
-    function AnimationFrameAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        return _this;
-    }
-    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay !== null && delay > 0) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        scheduler.actions.push(this);
-        return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); }));
-    };
-    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
-        }
-        if (scheduler.actions.length === 0) {
-            cancelAnimationFrame(id);
-            scheduler.scheduled = undefined;
-        }
-        return undefined;
-    };
-    return AnimationFrameAction;
-}(AsyncAction_1.AsyncAction));
-exports.AnimationFrameAction = AnimationFrameAction;
-//# sourceMappingURL=AnimationFrameAction.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/AnimationFrameAction.js.map b/node_modules/rxjs/internal/scheduler/AnimationFrameAction.js.map
deleted file mode 100644
index 570c451..0000000
--- a/node_modules/rxjs/internal/scheduler/AnimationFrameAction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AnimationFrameAction.js","sources":["../../src/internal/scheduler/AnimationFrameAction.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6CAA4C;AAS5C;IAA6C,wCAAc;IAEzD,8BAAsB,SAAkC,EAClC,IAAmD;QADzE,YAEE,kBAAM,SAAS,EAAE,IAAI,CAAC,SACvB;QAHqB,eAAS,GAAT,SAAS,CAAyB;QAClC,UAAI,GAAJ,IAAI,CAA+C;;IAEzE,CAAC;IAES,6CAAc,GAAxB,UAAyB,SAAkC,EAAE,EAAQ,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAEtF,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE;YAC/B,OAAO,iBAAM,cAAc,YAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAED,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAI7B,OAAO,SAAS,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,qBAAqB,CACxE,cAAM,OAAA,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAArB,CAAqB,CAAC,CAAC,CAAC;IAClC,CAAC;IACS,6CAAc,GAAxB,UAAyB,SAAkC,EAAE,EAAQ,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAItF,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE;YACvE,OAAO,iBAAM,cAAc,YAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAID,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YAClC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YACzB,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;SACjC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IACH,2BAAC;AAAD,CAAC,AArCD,CAA6C,yBAAW,GAqCvD;AArCY,oDAAoB"}
diff --git a/node_modules/rxjs/internal/scheduler/AnimationFrameScheduler.d.ts b/node_modules/rxjs/internal/scheduler/AnimationFrameScheduler.d.ts
deleted file mode 100644
index ff6d5fb..0000000
--- a/node_modules/rxjs/internal/scheduler/AnimationFrameScheduler.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { AsyncScheduler } from './AsyncScheduler';
-export declare class AnimationFrameScheduler extends AsyncScheduler {
-    flush(action?: AsyncAction<any>): void;
-}
diff --git a/node_modules/rxjs/internal/scheduler/AnimationFrameScheduler.js b/node_modules/rxjs/internal/scheduler/AnimationFrameScheduler.js
deleted file mode 100644
index 79ffe05..0000000
--- a/node_modules/rxjs/internal/scheduler/AnimationFrameScheduler.js
+++ /dev/null
@@ -1,46 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncScheduler_1 = require("./AsyncScheduler");
-var AnimationFrameScheduler = (function (_super) {
-    __extends(AnimationFrameScheduler, _super);
-    function AnimationFrameScheduler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    AnimationFrameScheduler.prototype.flush = function (action) {
-        this.active = true;
-        this.scheduled = undefined;
-        var actions = this.actions;
-        var error;
-        var index = -1;
-        var count = actions.length;
-        action = action || actions.shift();
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (++index < count && (action = actions.shift()));
-        this.active = false;
-        if (error) {
-            while (++index < count && (action = actions.shift())) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AnimationFrameScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.AnimationFrameScheduler = AnimationFrameScheduler;
-//# sourceMappingURL=AnimationFrameScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/AnimationFrameScheduler.js.map b/node_modules/rxjs/internal/scheduler/AnimationFrameScheduler.js.map
deleted file mode 100644
index 7f5bfa5..0000000
--- a/node_modules/rxjs/internal/scheduler/AnimationFrameScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AnimationFrameScheduler.js","sources":["../../src/internal/scheduler/AnimationFrameScheduler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,mDAAkD;AAElD;IAA6C,2CAAc;IAA3D;;IA2BA,CAAC;IA1BQ,uCAAK,GAAZ,UAAa,MAAyB;QAEpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAEpB,IAAA,sBAAO,CAAS;QACvB,IAAI,KAAU,CAAC;QACf,IAAI,KAAK,GAAW,CAAC,CAAC,CAAC;QACvB,IAAI,KAAK,GAAW,OAAO,CAAC,MAAM,CAAC;QACnC,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAEnC,GAAG;YACD,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtD,MAAM;aACP;SACF,QAAQ,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;QAExD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,KAAK,EAAE;YACT,OAAO,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;gBACpD,MAAM,CAAC,WAAW,EAAE,CAAC;aACtB;YACD,MAAM,KAAK,CAAC;SACb;IACH,CAAC;IACH,8BAAC;AAAD,CAAC,AA3BD,CAA6C,+BAAc,GA2B1D;AA3BY,0DAAuB"}
diff --git a/node_modules/rxjs/internal/scheduler/AsapAction.d.ts b/node_modules/rxjs/internal/scheduler/AsapAction.d.ts
deleted file mode 100644
index cafb969..0000000
--- a/node_modules/rxjs/internal/scheduler/AsapAction.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { AsapScheduler } from './AsapScheduler';
-import { SchedulerAction } from '../types';
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class AsapAction<T> extends AsyncAction<T> {
-    protected scheduler: AsapScheduler;
-    protected work: (this: SchedulerAction<T>, state?: T) => void;
-    constructor(scheduler: AsapScheduler, work: (this: SchedulerAction<T>, state?: T) => void);
-    protected requestAsyncId(scheduler: AsapScheduler, id?: any, delay?: number): any;
-    protected recycleAsyncId(scheduler: AsapScheduler, id?: any, delay?: number): any;
-}
diff --git a/node_modules/rxjs/internal/scheduler/AsapAction.js b/node_modules/rxjs/internal/scheduler/AsapAction.js
deleted file mode 100644
index 021809e..0000000
--- a/node_modules/rxjs/internal/scheduler/AsapAction.js
+++ /dev/null
@@ -1,48 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Immediate_1 = require("../util/Immediate");
-var AsyncAction_1 = require("./AsyncAction");
-var AsapAction = (function (_super) {
-    __extends(AsapAction, _super);
-    function AsapAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        return _this;
-    }
-    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay !== null && delay > 0) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        scheduler.actions.push(this);
-        return scheduler.scheduled || (scheduler.scheduled = Immediate_1.Immediate.setImmediate(scheduler.flush.bind(scheduler, null)));
-    };
-    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
-        }
-        if (scheduler.actions.length === 0) {
-            Immediate_1.Immediate.clearImmediate(id);
-            scheduler.scheduled = undefined;
-        }
-        return undefined;
-    };
-    return AsapAction;
-}(AsyncAction_1.AsyncAction));
-exports.AsapAction = AsapAction;
-//# sourceMappingURL=AsapAction.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/AsapAction.js.map b/node_modules/rxjs/internal/scheduler/AsapAction.js.map
deleted file mode 100644
index 2c8f130..0000000
--- a/node_modules/rxjs/internal/scheduler/AsapAction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsapAction.js","sources":["../../src/internal/scheduler/AsapAction.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+CAA8C;AAC9C,6CAA4C;AAQ5C;IAAmC,8BAAc;IAE/C,oBAAsB,SAAwB,EACxB,IAAmD;QADzE,YAEE,kBAAM,SAAS,EAAE,IAAI,CAAC,SACvB;QAHqB,eAAS,GAAT,SAAS,CAAe;QACxB,UAAI,GAAJ,IAAI,CAA+C;;IAEzE,CAAC;IAES,mCAAc,GAAxB,UAAyB,SAAwB,EAAE,EAAQ,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAE5E,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE;YAC/B,OAAO,iBAAM,cAAc,YAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAED,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAI7B,OAAO,SAAS,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,qBAAS,CAAC,YAAY,CACzE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CACtC,CAAC,CAAC;IACL,CAAC;IACS,mCAAc,GAAxB,UAAyB,SAAwB,EAAE,EAAQ,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAI5E,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE;YACvE,OAAO,iBAAM,cAAc,YAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAID,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YAClC,qBAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC7B,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;SACjC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IACH,iBAAC;AAAD,CAAC,AAtCD,CAAmC,yBAAW,GAsC7C;AAtCY,gCAAU"}
diff --git a/node_modules/rxjs/internal/scheduler/AsapScheduler.d.ts b/node_modules/rxjs/internal/scheduler/AsapScheduler.d.ts
deleted file mode 100644
index 708c6c9..0000000
--- a/node_modules/rxjs/internal/scheduler/AsapScheduler.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { AsyncScheduler } from './AsyncScheduler';
-export declare class AsapScheduler extends AsyncScheduler {
-    flush(action?: AsyncAction<any>): void;
-}
diff --git a/node_modules/rxjs/internal/scheduler/AsapScheduler.js b/node_modules/rxjs/internal/scheduler/AsapScheduler.js
deleted file mode 100644
index b66249d..0000000
--- a/node_modules/rxjs/internal/scheduler/AsapScheduler.js
+++ /dev/null
@@ -1,46 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncScheduler_1 = require("./AsyncScheduler");
-var AsapScheduler = (function (_super) {
-    __extends(AsapScheduler, _super);
-    function AsapScheduler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    AsapScheduler.prototype.flush = function (action) {
-        this.active = true;
-        this.scheduled = undefined;
-        var actions = this.actions;
-        var error;
-        var index = -1;
-        var count = actions.length;
-        action = action || actions.shift();
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (++index < count && (action = actions.shift()));
-        this.active = false;
-        if (error) {
-            while (++index < count && (action = actions.shift())) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AsapScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.AsapScheduler = AsapScheduler;
-//# sourceMappingURL=AsapScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/AsapScheduler.js.map b/node_modules/rxjs/internal/scheduler/AsapScheduler.js.map
deleted file mode 100644
index 193eb05..0000000
--- a/node_modules/rxjs/internal/scheduler/AsapScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsapScheduler.js","sources":["../../src/internal/scheduler/AsapScheduler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,mDAAkD;AAElD;IAAmC,iCAAc;IAAjD;;IA2BA,CAAC;IA1BQ,6BAAK,GAAZ,UAAa,MAAyB;QAEpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAEpB,IAAA,sBAAO,CAAS;QACvB,IAAI,KAAU,CAAC;QACf,IAAI,KAAK,GAAW,CAAC,CAAC,CAAC;QACvB,IAAI,KAAK,GAAW,OAAO,CAAC,MAAM,CAAC;QACnC,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAEnC,GAAG;YACD,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtD,MAAM;aACP;SACF,QAAQ,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;QAExD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,KAAK,EAAE;YACT,OAAO,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE;gBACpD,MAAM,CAAC,WAAW,EAAE,CAAC;aACtB;YACD,MAAM,KAAK,CAAC;SACb;IACH,CAAC;IACH,oBAAC;AAAD,CAAC,AA3BD,CAAmC,+BAAc,GA2BhD;AA3BY,sCAAa"}
diff --git a/node_modules/rxjs/internal/scheduler/AsyncAction.d.ts b/node_modules/rxjs/internal/scheduler/AsyncAction.d.ts
deleted file mode 100644
index b4f5d0c..0000000
--- a/node_modules/rxjs/internal/scheduler/AsyncAction.d.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { Action } from './Action';
-import { SchedulerAction } from '../types';
-import { Subscription } from '../Subscription';
-import { AsyncScheduler } from './AsyncScheduler';
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class AsyncAction<T> extends Action<T> {
-    protected scheduler: AsyncScheduler;
-    protected work: (this: SchedulerAction<T>, state?: T) => void;
-    id: any;
-    state: T;
-    delay: number;
-    protected pending: boolean;
-    constructor(scheduler: AsyncScheduler, work: (this: SchedulerAction<T>, state?: T) => void);
-    schedule(state?: T, delay?: number): Subscription;
-    protected requestAsyncId(scheduler: AsyncScheduler, id?: any, delay?: number): any;
-    protected recycleAsyncId(scheduler: AsyncScheduler, id: any, delay?: number): any;
-    /**
-     * Immediately executes this action and the `work` it contains.
-     * @return {any}
-     */
-    execute(state: T, delay: number): any;
-    protected _execute(state: T, delay: number): any;
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _unsubscribe(): void;
-}
diff --git a/node_modules/rxjs/internal/scheduler/AsyncAction.js b/node_modules/rxjs/internal/scheduler/AsyncAction.js
deleted file mode 100644
index 123d707..0000000
--- a/node_modules/rxjs/internal/scheduler/AsyncAction.js
+++ /dev/null
@@ -1,102 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Action_1 = require("./Action");
-var AsyncAction = (function (_super) {
-    __extends(AsyncAction, _super);
-    function AsyncAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        _this.pending = false;
-        return _this;
-    }
-    AsyncAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (this.closed) {
-            return this;
-        }
-        this.state = state;
-        var id = this.id;
-        var scheduler = this.scheduler;
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, delay);
-        }
-        this.pending = true;
-        this.delay = delay;
-        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
-        return this;
-    };
-    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        return setInterval(scheduler.flush.bind(scheduler, this), delay);
-    };
-    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay !== null && this.delay === delay && this.pending === false) {
-            return id;
-        }
-        clearInterval(id);
-        return undefined;
-    };
-    AsyncAction.prototype.execute = function (state, delay) {
-        if (this.closed) {
-            return new Error('executing a cancelled action');
-        }
-        this.pending = false;
-        var error = this._execute(state, delay);
-        if (error) {
-            return error;
-        }
-        else if (this.pending === false && this.id != null) {
-            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
-        }
-    };
-    AsyncAction.prototype._execute = function (state, delay) {
-        var errored = false;
-        var errorValue = undefined;
-        try {
-            this.work(state);
-        }
-        catch (e) {
-            errored = true;
-            errorValue = !!e && e || new Error(e);
-        }
-        if (errored) {
-            this.unsubscribe();
-            return errorValue;
-        }
-    };
-    AsyncAction.prototype._unsubscribe = function () {
-        var id = this.id;
-        var scheduler = this.scheduler;
-        var actions = scheduler.actions;
-        var index = actions.indexOf(this);
-        this.work = null;
-        this.state = null;
-        this.pending = false;
-        this.scheduler = null;
-        if (index !== -1) {
-            actions.splice(index, 1);
-        }
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, null);
-        }
-        this.delay = null;
-    };
-    return AsyncAction;
-}(Action_1.Action));
-exports.AsyncAction = AsyncAction;
-//# sourceMappingURL=AsyncAction.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/AsyncAction.js.map b/node_modules/rxjs/internal/scheduler/AsyncAction.js.map
deleted file mode 100644
index 65b5273..0000000
--- a/node_modules/rxjs/internal/scheduler/AsyncAction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsyncAction.js","sources":["../../src/internal/scheduler/AsyncAction.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/scheduler/AsyncScheduler.d.ts b/node_modules/rxjs/internal/scheduler/AsyncScheduler.d.ts
deleted file mode 100644
index 950adea..0000000
--- a/node_modules/rxjs/internal/scheduler/AsyncScheduler.d.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { Scheduler } from '../Scheduler';
-import { Action } from './Action';
-import { AsyncAction } from './AsyncAction';
-import { SchedulerAction } from '../types';
-import { Subscription } from '../Subscription';
-export declare class AsyncScheduler extends Scheduler {
-    static delegate?: Scheduler;
-    actions: Array<AsyncAction<any>>;
-    /**
-     * A flag to indicate whether the Scheduler is currently executing a batch of
-     * queued actions.
-     * @type {boolean}
-     * @deprecated internal use only
-     */
-    active: boolean;
-    /**
-     * An internal ID used to track the latest asynchronous task such as those
-     * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and
-     * others.
-     * @type {any}
-     * @deprecated internal use only
-     */
-    scheduled: any;
-    constructor(SchedulerAction: typeof Action, now?: () => number);
-    schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay?: number, state?: T): Subscription;
-    flush(action: AsyncAction<any>): void;
-}
diff --git a/node_modules/rxjs/internal/scheduler/AsyncScheduler.js b/node_modules/rxjs/internal/scheduler/AsyncScheduler.js
deleted file mode 100644
index 10e9a12..0000000
--- a/node_modules/rxjs/internal/scheduler/AsyncScheduler.js
+++ /dev/null
@@ -1,67 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Scheduler_1 = require("../Scheduler");
-var AsyncScheduler = (function (_super) {
-    __extends(AsyncScheduler, _super);
-    function AsyncScheduler(SchedulerAction, now) {
-        if (now === void 0) { now = Scheduler_1.Scheduler.now; }
-        var _this = _super.call(this, SchedulerAction, function () {
-            if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) {
-                return AsyncScheduler.delegate.now();
-            }
-            else {
-                return now();
-            }
-        }) || this;
-        _this.actions = [];
-        _this.active = false;
-        _this.scheduled = undefined;
-        return _this;
-    }
-    AsyncScheduler.prototype.schedule = function (work, delay, state) {
-        if (delay === void 0) { delay = 0; }
-        if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
-            return AsyncScheduler.delegate.schedule(work, delay, state);
-        }
-        else {
-            return _super.prototype.schedule.call(this, work, delay, state);
-        }
-    };
-    AsyncScheduler.prototype.flush = function (action) {
-        var actions = this.actions;
-        if (this.active) {
-            actions.push(action);
-            return;
-        }
-        var error;
-        this.active = true;
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (action = actions.shift());
-        this.active = false;
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AsyncScheduler;
-}(Scheduler_1.Scheduler));
-exports.AsyncScheduler = AsyncScheduler;
-//# sourceMappingURL=AsyncScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/AsyncScheduler.js.map b/node_modules/rxjs/internal/scheduler/AsyncScheduler.js.map
deleted file mode 100644
index c710074..0000000
--- a/node_modules/rxjs/internal/scheduler/AsyncScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AsyncScheduler.js","sources":["../../src/internal/scheduler/AsyncScheduler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,0CAAyC;AAMzC;IAAoC,kCAAS;IAmB3C,wBAAY,eAA8B,EAC9B,GAAiC;QAAjC,oBAAA,EAAA,MAAoB,qBAAS,CAAC,GAAG;QAD7C,YAEE,kBAAM,eAAe,EAAE;YACrB,IAAI,cAAc,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,KAAK,KAAI,EAAE;gBAC/D,OAAO,cAAc,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;aACtC;iBAAM;gBACL,OAAO,GAAG,EAAE,CAAC;aACd;QACH,CAAC,CAAC,SACH;QA1BM,aAAO,GAA4B,EAAE,CAAC;QAOtC,YAAM,GAAY,KAAK,CAAC;QAQxB,eAAS,GAAQ,SAAS,CAAC;;IAWlC,CAAC;IAEM,iCAAQ,GAAf,UAAmB,IAAmD,EAAE,KAAiB,EAAE,KAAS;QAA5B,sBAAA,EAAA,SAAiB;QACvF,IAAI,cAAc,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,KAAK,IAAI,EAAE;YAC/D,OAAO,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC7D;aAAM;YACL,OAAO,iBAAM,QAAQ,YAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC3C;IACH,CAAC;IAEM,8BAAK,GAAZ,UAAa,MAAwB;QAE5B,IAAA,sBAAO,CAAS;QAEvB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO;SACR;QAED,IAAI,KAAU,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,GAAG;YACD,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtD,MAAM;aACP;SACF,QAAQ,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE;QAEnC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,KAAK,EAAE;YACT,OAAO,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE;gBAC/B,MAAM,CAAC,WAAW,EAAE,CAAC;aACtB;YACD,MAAM,KAAK,CAAC;SACb;IACH,CAAC;IACH,qBAAC;AAAD,CAAC,AAjED,CAAoC,qBAAS,GAiE5C;AAjEY,wCAAc"}
diff --git a/node_modules/rxjs/internal/scheduler/QueueAction.d.ts b/node_modules/rxjs/internal/scheduler/QueueAction.d.ts
deleted file mode 100644
index e263c30..0000000
--- a/node_modules/rxjs/internal/scheduler/QueueAction.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { Subscription } from '../Subscription';
-import { QueueScheduler } from './QueueScheduler';
-import { SchedulerAction } from '../types';
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class QueueAction<T> extends AsyncAction<T> {
-    protected scheduler: QueueScheduler;
-    protected work: (this: SchedulerAction<T>, state?: T) => void;
-    constructor(scheduler: QueueScheduler, work: (this: SchedulerAction<T>, state?: T) => void);
-    schedule(state?: T, delay?: number): Subscription;
-    execute(state: T, delay: number): any;
-    protected requestAsyncId(scheduler: QueueScheduler, id?: any, delay?: number): any;
-}
diff --git a/node_modules/rxjs/internal/scheduler/QueueAction.js b/node_modules/rxjs/internal/scheduler/QueueAction.js
deleted file mode 100644
index ded9219..0000000
--- a/node_modules/rxjs/internal/scheduler/QueueAction.js
+++ /dev/null
@@ -1,50 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncAction_1 = require("./AsyncAction");
-var QueueAction = (function (_super) {
-    __extends(QueueAction, _super);
-    function QueueAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        return _this;
-    }
-    QueueAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay > 0) {
-            return _super.prototype.schedule.call(this, state, delay);
-        }
-        this.delay = delay;
-        this.state = state;
-        this.scheduler.flush(this);
-        return this;
-    };
-    QueueAction.prototype.execute = function (state, delay) {
-        return (delay > 0 || this.closed) ?
-            _super.prototype.execute.call(this, state, delay) :
-            this._execute(state, delay);
-    };
-    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        return scheduler.flush(this);
-    };
-    return QueueAction;
-}(AsyncAction_1.AsyncAction));
-exports.QueueAction = QueueAction;
-//# sourceMappingURL=QueueAction.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/QueueAction.js.map b/node_modules/rxjs/internal/scheduler/QueueAction.js.map
deleted file mode 100644
index bf808e1..0000000
--- a/node_modules/rxjs/internal/scheduler/QueueAction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"QueueAction.js","sources":["../../src/internal/scheduler/QueueAction.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6CAA4C;AAU5C;IAAoC,+BAAc;IAEhD,qBAAsB,SAAyB,EACzB,IAAmD;QADzE,YAEE,kBAAM,SAAS,EAAE,IAAI,CAAC,SACvB;QAHqB,eAAS,GAAT,SAAS,CAAgB;QACzB,UAAI,GAAJ,IAAI,CAA+C;;IAEzE,CAAC;IAEM,8BAAQ,GAAf,UAAgB,KAAS,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAC1C,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,OAAO,iBAAM,QAAQ,YAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACrC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,6BAAO,GAAd,UAAe,KAAQ,EAAE,KAAa;QACpC,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACjC,iBAAM,OAAO,YAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAE;IACjC,CAAC;IAES,oCAAc,GAAxB,UAAyB,SAAyB,EAAE,EAAQ,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAI7E,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE;YACvE,OAAO,iBAAM,cAAc,YAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;SACnD;QAED,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACH,kBAAC;AAAD,CAAC,AAjCD,CAAoC,yBAAW,GAiC9C;AAjCY,kCAAW"}
diff --git a/node_modules/rxjs/internal/scheduler/QueueScheduler.d.ts b/node_modules/rxjs/internal/scheduler/QueueScheduler.d.ts
deleted file mode 100644
index bdde0f6..0000000
--- a/node_modules/rxjs/internal/scheduler/QueueScheduler.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { AsyncScheduler } from './AsyncScheduler';
-export declare class QueueScheduler extends AsyncScheduler {
-}
diff --git a/node_modules/rxjs/internal/scheduler/QueueScheduler.js b/node_modules/rxjs/internal/scheduler/QueueScheduler.js
deleted file mode 100644
index e831d1d..0000000
--- a/node_modules/rxjs/internal/scheduler/QueueScheduler.js
+++ /dev/null
@@ -1,25 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncScheduler_1 = require("./AsyncScheduler");
-var QueueScheduler = (function (_super) {
-    __extends(QueueScheduler, _super);
-    function QueueScheduler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    return QueueScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.QueueScheduler = QueueScheduler;
-//# sourceMappingURL=QueueScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/QueueScheduler.js.map b/node_modules/rxjs/internal/scheduler/QueueScheduler.js.map
deleted file mode 100644
index 618ceec..0000000
--- a/node_modules/rxjs/internal/scheduler/QueueScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"QueueScheduler.js","sources":["../../src/internal/scheduler/QueueScheduler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mDAAkD;AAElD;IAAoC,kCAAc;IAAlD;;IACA,CAAC;IAAD,qBAAC;AAAD,CAAC,AADD,CAAoC,+BAAc,GACjD;AADY,wCAAc"}
diff --git a/node_modules/rxjs/internal/scheduler/VirtualTimeScheduler.d.ts b/node_modules/rxjs/internal/scheduler/VirtualTimeScheduler.d.ts
deleted file mode 100644
index ef062b1..0000000
--- a/node_modules/rxjs/internal/scheduler/VirtualTimeScheduler.d.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { Subscription } from '../Subscription';
-import { AsyncScheduler } from './AsyncScheduler';
-import { SchedulerAction } from '../types';
-export declare class VirtualTimeScheduler extends AsyncScheduler {
-    maxFrames: number;
-    protected static frameTimeFactor: number;
-    frame: number;
-    index: number;
-    constructor(SchedulerAction?: typeof AsyncAction, maxFrames?: number);
-    /**
-     * Prompt the Scheduler to execute all of its queued actions, therefore
-     * clearing its queue.
-     * @return {void}
-     */
-    flush(): void;
-}
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @nodoc
- */
-export declare class VirtualAction<T> extends AsyncAction<T> {
-    protected scheduler: VirtualTimeScheduler;
-    protected work: (this: SchedulerAction<T>, state?: T) => void;
-    protected index: number;
-    protected active: boolean;
-    constructor(scheduler: VirtualTimeScheduler, work: (this: SchedulerAction<T>, state?: T) => void, index?: number);
-    schedule(state?: T, delay?: number): Subscription;
-    protected requestAsyncId(scheduler: VirtualTimeScheduler, id?: any, delay?: number): any;
-    protected recycleAsyncId(scheduler: VirtualTimeScheduler, id?: any, delay?: number): any;
-    protected _execute(state: T, delay: number): any;
-    static sortActions<T>(a: VirtualAction<T>, b: VirtualAction<T>): 1 | 0 | -1;
-}
diff --git a/node_modules/rxjs/internal/scheduler/VirtualTimeScheduler.js b/node_modules/rxjs/internal/scheduler/VirtualTimeScheduler.js
deleted file mode 100644
index fcf7da0..0000000
--- a/node_modules/rxjs/internal/scheduler/VirtualTimeScheduler.js
+++ /dev/null
@@ -1,111 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncAction_1 = require("./AsyncAction");
-var AsyncScheduler_1 = require("./AsyncScheduler");
-var VirtualTimeScheduler = (function (_super) {
-    __extends(VirtualTimeScheduler, _super);
-    function VirtualTimeScheduler(SchedulerAction, maxFrames) {
-        if (SchedulerAction === void 0) { SchedulerAction = VirtualAction; }
-        if (maxFrames === void 0) { maxFrames = Number.POSITIVE_INFINITY; }
-        var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this;
-        _this.maxFrames = maxFrames;
-        _this.frame = 0;
-        _this.index = -1;
-        return _this;
-    }
-    VirtualTimeScheduler.prototype.flush = function () {
-        var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
-        var error, action;
-        while ((action = actions[0]) && action.delay <= maxFrames) {
-            actions.shift();
-            this.frame = action.delay;
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        }
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    VirtualTimeScheduler.frameTimeFactor = 10;
-    return VirtualTimeScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.VirtualTimeScheduler = VirtualTimeScheduler;
-var VirtualAction = (function (_super) {
-    __extends(VirtualAction, _super);
-    function VirtualAction(scheduler, work, index) {
-        if (index === void 0) { index = scheduler.index += 1; }
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        _this.index = index;
-        _this.active = true;
-        _this.index = scheduler.index = index;
-        return _this;
-    }
-    VirtualAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (!this.id) {
-            return _super.prototype.schedule.call(this, state, delay);
-        }
-        this.active = false;
-        var action = new VirtualAction(this.scheduler, this.work);
-        this.add(action);
-        return action.schedule(state, delay);
-    };
-    VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        this.delay = scheduler.frame + delay;
-        var actions = scheduler.actions;
-        actions.push(this);
-        actions.sort(VirtualAction.sortActions);
-        return true;
-    };
-    VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        return undefined;
-    };
-    VirtualAction.prototype._execute = function (state, delay) {
-        if (this.active === true) {
-            return _super.prototype._execute.call(this, state, delay);
-        }
-    };
-    VirtualAction.sortActions = function (a, b) {
-        if (a.delay === b.delay) {
-            if (a.index === b.index) {
-                return 0;
-            }
-            else if (a.index > b.index) {
-                return 1;
-            }
-            else {
-                return -1;
-            }
-        }
-        else if (a.delay > b.delay) {
-            return 1;
-        }
-        else {
-            return -1;
-        }
-    };
-    return VirtualAction;
-}(AsyncAction_1.AsyncAction));
-exports.VirtualAction = VirtualAction;
-//# sourceMappingURL=VirtualTimeScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/VirtualTimeScheduler.js.map b/node_modules/rxjs/internal/scheduler/VirtualTimeScheduler.js.map
deleted file mode 100644
index 2f0c0f0..0000000
--- a/node_modules/rxjs/internal/scheduler/VirtualTimeScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"VirtualTimeScheduler.js","sources":["../../src/internal/scheduler/VirtualTimeScheduler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6CAA4C;AAE5C,mDAAkD;AAGlD;IAA0C,wCAAc;IAOtD,8BAAY,eAA0D,EACnD,SAA4C;QADnD,gCAAA,EAAA,kBAAsC,aAAoB;QACnD,0BAAA,EAAA,YAAoB,MAAM,CAAC,iBAAiB;QAD/D,YAEE,kBAAM,eAAe,EAAE,cAAM,OAAA,KAAI,CAAC,KAAK,EAAV,CAAU,CAAC,SACzC;QAFkB,eAAS,GAAT,SAAS,CAAmC;QAJxD,WAAK,GAAW,CAAC,CAAC;QAClB,WAAK,GAAW,CAAC,CAAC,CAAC;;IAK1B,CAAC;IAOM,oCAAK,GAAZ;QAEQ,IAAA,SAA2B,EAA1B,oBAAO,EAAE,wBAAS,CAAS;QAClC,IAAI,KAAU,EAAE,MAAwB,CAAC;QAEzC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE;YACzD,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAE1B,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtD,MAAM;aACP;SACF;QAED,IAAI,KAAK,EAAE;YACT,OAAO,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE;gBAC/B,MAAM,CAAC,WAAW,EAAE,CAAC;aACtB;YACD,MAAM,KAAK,CAAC;SACb;IACH,CAAC;IAnCgB,oCAAe,GAAW,EAAE,CAAC;IAoChD,2BAAC;CAAA,AAtCD,CAA0C,+BAAc,GAsCvD;AAtCY,oDAAoB;AA4CjC;IAAsC,iCAAc;IAIlD,uBAAsB,SAA+B,EAC/B,IAAmD,EACnD,KAAoC;QAApC,sBAAA,EAAA,QAAgB,SAAS,CAAC,KAAK,IAAI,CAAC;QAF1D,YAGE,kBAAM,SAAS,EAAE,IAAI,CAAC,SAEvB;QALqB,eAAS,GAAT,SAAS,CAAsB;QAC/B,UAAI,GAAJ,IAAI,CAA+C;QACnD,WAAK,GAAL,KAAK,CAA+B;QAJhD,YAAM,GAAY,IAAI,CAAC;QAM/B,KAAI,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;;IACvC,CAAC;IAEM,gCAAQ,GAAf,UAAgB,KAAS,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;YACZ,OAAO,iBAAM,QAAQ,YAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACrC;QACD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAKpB,IAAM,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjB,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAES,sCAAc,GAAxB,UAAyB,SAA+B,EAAE,EAAQ,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QACnF,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;QAC9B,IAAA,2BAAO,CAAc;QAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,OAAmC,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAES,sCAAc,GAAxB,UAAyB,SAA+B,EAAE,EAAQ,EAAE,KAAiB;QAAjB,sBAAA,EAAA,SAAiB;QACnF,OAAO,SAAS,CAAC;IACnB,CAAC;IAES,gCAAQ,GAAlB,UAAmB,KAAQ,EAAE,KAAa;QACxC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;YACxB,OAAO,iBAAM,QAAQ,YAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACrC;IACH,CAAC;IAEa,yBAAW,GAAzB,UAA6B,CAAmB,EAAE,CAAmB;QACnE,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE;YACvB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE;gBACvB,OAAO,CAAC,CAAC;aACV;iBAAM,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE;gBAC5B,OAAO,CAAC,CAAC;aACV;iBAAM;gBACL,OAAO,CAAC,CAAC,CAAC;aACX;SACF;aAAM,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE;YAC5B,OAAO,CAAC,CAAC;SACV;aAAM;YACL,OAAO,CAAC,CAAC,CAAC;SACX;IACH,CAAC;IACH,oBAAC;AAAD,CAAC,AA1DD,CAAsC,yBAAW,GA0DhD;AA1DY,sCAAa"}
diff --git a/node_modules/rxjs/internal/scheduler/animationFrame.d.ts b/node_modules/rxjs/internal/scheduler/animationFrame.d.ts
deleted file mode 100644
index 5ca2936..0000000
--- a/node_modules/rxjs/internal/scheduler/animationFrame.d.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { AnimationFrameScheduler } from './AnimationFrameScheduler';
-/**
- *
- * Animation Frame Scheduler
- *
- * <span class="informal">Perform task when `window.requestAnimationFrame` would fire</span>
- *
- * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler
- * behaviour.
- *
- * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.
- * It makes sure scheduled task will happen just before next browser content repaint,
- * thus performing animations as efficiently as possible.
- *
- * ## Example
- * Schedule div height animation
- * ```ts
- * // html: <div style="background: #0ff;"></div>
- * import { animationFrameScheduler } from 'rxjs';
- *
- * const div = document.querySelector('div');
- *
- * animationFrameScheduler.schedule(function(height) {
- *   div.style.height = height + "px";
- *
- *   this.schedule(height + 1);  // `this` references currently executing Action,
- *                               // which we reschedule with new state
- * }, 0, 0);
- *
- * // You will see a div element growing in height
- * ```
- *
- * @static true
- * @name animationFrame
- * @owner Scheduler
- */
-export declare const animationFrame: AnimationFrameScheduler;
diff --git a/node_modules/rxjs/internal/scheduler/animationFrame.js b/node_modules/rxjs/internal/scheduler/animationFrame.js
deleted file mode 100644
index b1329a0..0000000
--- a/node_modules/rxjs/internal/scheduler/animationFrame.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AnimationFrameAction_1 = require("./AnimationFrameAction");
-var AnimationFrameScheduler_1 = require("./AnimationFrameScheduler");
-exports.animationFrame = new AnimationFrameScheduler_1.AnimationFrameScheduler(AnimationFrameAction_1.AnimationFrameAction);
-//# sourceMappingURL=animationFrame.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/animationFrame.js.map b/node_modules/rxjs/internal/scheduler/animationFrame.js.map
deleted file mode 100644
index cdbd954..0000000
--- a/node_modules/rxjs/internal/scheduler/animationFrame.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"animationFrame.js","sources":["../../src/internal/scheduler/animationFrame.ts"],"names":[],"mappings":";;AAAA,+DAA8D;AAC9D,qEAAoE;AAsCvD,QAAA,cAAc,GAAG,IAAI,iDAAuB,CAAC,2CAAoB,CAAC,CAAC"}
diff --git a/node_modules/rxjs/internal/scheduler/asap.d.ts b/node_modules/rxjs/internal/scheduler/asap.d.ts
deleted file mode 100644
index c423fe5..0000000
--- a/node_modules/rxjs/internal/scheduler/asap.d.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { AsapScheduler } from './AsapScheduler';
-/**
- *
- * Asap Scheduler
- *
- * <span class="informal">Perform task as fast as it can be performed asynchronously</span>
- *
- * `asap` scheduler behaves the same as {@link asyncScheduler} scheduler when you use it to delay task
- * in time. If however you set delay to `0`, `asap` will wait for current synchronously executing
- * code to end and then it will try to execute given task as fast as possible.
- *
- * `asap` scheduler will do its best to minimize time between end of currently executing code
- * and start of scheduled task. This makes it best candidate for performing so called "deferring".
- * Traditionally this was achieved by calling `setTimeout(deferredTask, 0)`, but that technique involves
- * some (although minimal) unwanted delay.
- *
- * Note that using `asap` scheduler does not necessarily mean that your task will be first to process
- * after currently executing code. In particular, if some task was also scheduled with `asap` before,
- * that task will execute first. That being said, if you need to schedule task asynchronously, but
- * as soon as possible, `asap` scheduler is your best bet.
- *
- * ## Example
- * Compare async and asap scheduler<
- * ```ts
- * import { asapScheduler, asyncScheduler } from 'rxjs';
- *
- * asyncScheduler.schedule(() => console.log('async')); // scheduling 'async' first...
- * asapScheduler.schedule(() => console.log('asap'));
- *
- * // Logs:
- * // "asap"
- * // "async"
- * // ... but 'asap' goes first!
- * ```
- * @static true
- * @name asap
- * @owner Scheduler
- */
-export declare const asap: AsapScheduler;
diff --git a/node_modules/rxjs/internal/scheduler/asap.js b/node_modules/rxjs/internal/scheduler/asap.js
deleted file mode 100644
index 5fe7d29..0000000
--- a/node_modules/rxjs/internal/scheduler/asap.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsapAction_1 = require("./AsapAction");
-var AsapScheduler_1 = require("./AsapScheduler");
-exports.asap = new AsapScheduler_1.AsapScheduler(AsapAction_1.AsapAction);
-//# sourceMappingURL=asap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/asap.js.map b/node_modules/rxjs/internal/scheduler/asap.js.map
deleted file mode 100644
index 1e2595b..0000000
--- a/node_modules/rxjs/internal/scheduler/asap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"asap.js","sources":["../../src/internal/scheduler/asap.ts"],"names":[],"mappings":";;AAAA,2CAA0C;AAC1C,iDAAgD;AAwCnC,QAAA,IAAI,GAAG,IAAI,6BAAa,CAAC,uBAAU,CAAC,CAAC"}
diff --git a/node_modules/rxjs/internal/scheduler/async.d.ts b/node_modules/rxjs/internal/scheduler/async.d.ts
deleted file mode 100644
index 8700792..0000000
--- a/node_modules/rxjs/internal/scheduler/async.d.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { AsyncScheduler } from './AsyncScheduler';
-/**
- *
- * Async Scheduler
- *
- * <span class="informal">Schedule task as if you used setTimeout(task, duration)</span>
- *
- * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript
- * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating
- * in intervals.
- *
- * If you just want to "defer" task, that is to perform it right after currently
- * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),
- * better choice will be the {@link asapScheduler} scheduler.
- *
- * ## Examples
- * Use async scheduler to delay task
- * ```ts
- * import { asyncScheduler } from 'rxjs';
- *
- * const task = () => console.log('it works!');
- *
- * asyncScheduler.schedule(task, 2000);
- *
- * // After 2 seconds logs:
- * // "it works!"
- * ```
- *
- * Use async scheduler to repeat task in intervals
- * ```ts
- * import { asyncScheduler } from 'rxjs';
- *
- * function task(state) {
- *   console.log(state);
- *   this.schedule(state + 1, 1000); // `this` references currently executing Action,
- *                                   // which we reschedule with new state and delay
- * }
- *
- * asyncScheduler.schedule(task, 3000, 0);
- *
- * // Logs:
- * // 0 after 3s
- * // 1 after 4s
- * // 2 after 5s
- * // 3 after 6s
- * ```
- *
- * @static true
- * @name async
- * @owner Scheduler
- */
-export declare const async: AsyncScheduler;
diff --git a/node_modules/rxjs/internal/scheduler/async.js b/node_modules/rxjs/internal/scheduler/async.js
deleted file mode 100644
index 2a91f47..0000000
--- a/node_modules/rxjs/internal/scheduler/async.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncAction_1 = require("./AsyncAction");
-var AsyncScheduler_1 = require("./AsyncScheduler");
-exports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);
-//# sourceMappingURL=async.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/async.js.map b/node_modules/rxjs/internal/scheduler/async.js.map
deleted file mode 100644
index 6618989..0000000
--- a/node_modules/rxjs/internal/scheduler/async.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"async.js","sources":["../../src/internal/scheduler/async.ts"],"names":[],"mappings":";;AAAA,6CAA4C;AAC5C,mDAAkD;AAqDrC,QAAA,KAAK,GAAG,IAAI,+BAAc,CAAC,yBAAW,CAAC,CAAC"}
diff --git a/node_modules/rxjs/internal/scheduler/queue.d.ts b/node_modules/rxjs/internal/scheduler/queue.d.ts
deleted file mode 100644
index 1a59c06..0000000
--- a/node_modules/rxjs/internal/scheduler/queue.d.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-import { QueueScheduler } from './QueueScheduler';
-/**
- *
- * Queue Scheduler
- *
- * <span class="informal">Put every next task on a queue, instead of executing it immediately</span>
- *
- * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.
- *
- * When used without delay, it schedules given task synchronously - executes it right when
- * it is scheduled. However when called recursively, that is when inside the scheduled task,
- * another task is scheduled with queue scheduler, instead of executing immediately as well,
- * that task will be put on a queue and wait for current one to finish.
- *
- * This means that when you execute task with `queue` scheduler, you are sure it will end
- * before any other task scheduled with that scheduler will start.
- *
- * ## Examples
- * Schedule recursively first, then do something
- * ```ts
- * import { queueScheduler } from 'rxjs';
- *
- * queueScheduler.schedule(() => {
- *   queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue
- *
- *   console.log('first');
- * });
- *
- * // Logs:
- * // "first"
- * // "second"
- * ```
- *
- * Reschedule itself recursively
- * ```ts
- * import { queueScheduler } from 'rxjs';
- *
- * queueScheduler.schedule(function(state) {
- *   if (state !== 0) {
- *     console.log('before', state);
- *     this.schedule(state - 1); // `this` references currently executing Action,
- *                               // which we reschedule with new state
- *     console.log('after', state);
- *   }
- * }, 0, 3);
- *
- * // In scheduler that runs recursively, you would expect:
- * // "before", 3
- * // "before", 2
- * // "before", 1
- * // "after", 1
- * // "after", 2
- * // "after", 3
- *
- * // But with queue it logs:
- * // "before", 3
- * // "after", 3
- * // "before", 2
- * // "after", 2
- * // "before", 1
- * // "after", 1
- * ```
- *
- * @static true
- * @name queue
- * @owner Scheduler
- */
-export declare const queue: QueueScheduler;
diff --git a/node_modules/rxjs/internal/scheduler/queue.js b/node_modules/rxjs/internal/scheduler/queue.js
deleted file mode 100644
index 4a08520..0000000
--- a/node_modules/rxjs/internal/scheduler/queue.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var QueueAction_1 = require("./QueueAction");
-var QueueScheduler_1 = require("./QueueScheduler");
-exports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);
-//# sourceMappingURL=queue.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/scheduler/queue.js.map b/node_modules/rxjs/internal/scheduler/queue.js.map
deleted file mode 100644
index 2ef8154..0000000
--- a/node_modules/rxjs/internal/scheduler/queue.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"queue.js","sources":["../../src/internal/scheduler/queue.ts"],"names":[],"mappings":";;AAAA,6CAA4C;AAC5C,mDAAkD;AAqErC,QAAA,KAAK,GAAG,IAAI,+BAAc,CAAC,yBAAW,CAAC,CAAC"}
diff --git a/node_modules/rxjs/internal/symbol/iterator.d.ts b/node_modules/rxjs/internal/symbol/iterator.d.ts
deleted file mode 100644
index edce2b4..0000000
--- a/node_modules/rxjs/internal/symbol/iterator.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export declare function getSymbolIterator(): symbol;
-export declare const iterator: symbol;
-/**
- * @deprecated use {@link iterator} instead
- */
-export declare const $$iterator: symbol;
diff --git a/node_modules/rxjs/internal/symbol/iterator.js b/node_modules/rxjs/internal/symbol/iterator.js
deleted file mode 100644
index 3855934..0000000
--- a/node_modules/rxjs/internal/symbol/iterator.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function getSymbolIterator() {
-    if (typeof Symbol !== 'function' || !Symbol.iterator) {
-        return '@@iterator';
-    }
-    return Symbol.iterator;
-}
-exports.getSymbolIterator = getSymbolIterator;
-exports.iterator = getSymbolIterator();
-exports.$$iterator = exports.iterator;
-//# sourceMappingURL=iterator.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/symbol/iterator.js.map b/node_modules/rxjs/internal/symbol/iterator.js.map
deleted file mode 100644
index c140dc4..0000000
--- a/node_modules/rxjs/internal/symbol/iterator.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"iterator.js","sources":["../../src/internal/symbol/iterator.ts"],"names":[],"mappings":";;AAAA,SAAgB,iBAAiB;IAC/B,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;QACpD,OAAO,YAAmB,CAAC;KAC5B;IAED,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAND,8CAMC;AAEY,QAAA,QAAQ,GAAG,iBAAiB,EAAE,CAAC;AAK/B,QAAA,UAAU,GAAG,gBAAQ,CAAC"}
diff --git a/node_modules/rxjs/internal/symbol/observable.d.ts b/node_modules/rxjs/internal/symbol/observable.d.ts
deleted file mode 100644
index 7d27016..0000000
--- a/node_modules/rxjs/internal/symbol/observable.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/** Symbol.observable addition */
-declare global {
-    interface SymbolConstructor {
-        readonly observable: symbol;
-    }
-}
-/** Symbol.observable or a string "@@observable". Used for interop */
-export declare const observable: string | symbol;
diff --git a/node_modules/rxjs/internal/symbol/observable.js b/node_modules/rxjs/internal/symbol/observable.js
deleted file mode 100644
index ddf72de..0000000
--- a/node_modules/rxjs/internal/symbol/observable.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.observable = (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })();
-//# sourceMappingURL=observable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/symbol/observable.js.map b/node_modules/rxjs/internal/symbol/observable.js.map
deleted file mode 100644
index 49e2047..0000000
--- a/node_modules/rxjs/internal/symbol/observable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"observable.js","sources":["../../src/internal/symbol/observable.ts"],"names":[],"mappings":";;AAUa,QAAA,UAAU,GAAG,CAAC,cAAM,OAAA,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,UAAU,IAAI,cAAc,EAAnE,CAAmE,CAAC,EAAE,CAAC"}
diff --git a/node_modules/rxjs/internal/symbol/rxSubscriber.d.ts b/node_modules/rxjs/internal/symbol/rxSubscriber.d.ts
deleted file mode 100644
index 20da948..0000000
--- a/node_modules/rxjs/internal/symbol/rxSubscriber.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-/** @deprecated do not use, this is no longer checked by RxJS internals */
-export declare const rxSubscriber: string | symbol;
-/**
- * @deprecated use rxSubscriber instead
- */
-export declare const $$rxSubscriber: string | symbol;
diff --git a/node_modules/rxjs/internal/symbol/rxSubscriber.js b/node_modules/rxjs/internal/symbol/rxSubscriber.js
deleted file mode 100644
index dfddcd1..0000000
--- a/node_modules/rxjs/internal/symbol/rxSubscriber.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.rxSubscriber = (function () {
-    return typeof Symbol === 'function'
-        ? Symbol('rxSubscriber')
-        : '@@rxSubscriber_' + Math.random();
-})();
-exports.$$rxSubscriber = exports.rxSubscriber;
-//# sourceMappingURL=rxSubscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/symbol/rxSubscriber.js.map b/node_modules/rxjs/internal/symbol/rxSubscriber.js.map
deleted file mode 100644
index f739995..0000000
--- a/node_modules/rxjs/internal/symbol/rxSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"rxSubscriber.js","sources":["../../src/internal/symbol/rxSubscriber.ts"],"names":[],"mappings":";;AACa,QAAA,YAAY,GAAG,CAAC;IAC3B,OAAA,OAAO,MAAM,KAAK,UAAU;QAC1B,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;QACxB,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC,MAAM,EAAE;AAFrC,CAEqC,CAAC,EAAE,CAAC;AAK9B,QAAA,cAAc,GAAG,oBAAY,CAAC"}
diff --git a/node_modules/rxjs/internal/testing/ColdObservable.d.ts b/node_modules/rxjs/internal/testing/ColdObservable.d.ts
deleted file mode 100644
index b1d4a76..0000000
--- a/node_modules/rxjs/internal/testing/ColdObservable.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { Observable } from '../Observable';
-import { Scheduler } from '../Scheduler';
-import { TestMessage } from './TestMessage';
-import { SubscriptionLog } from './SubscriptionLog';
-import { SubscriptionLoggable } from './SubscriptionLoggable';
-import { Subscriber } from '../Subscriber';
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class ColdObservable<T> extends Observable<T> implements SubscriptionLoggable {
-    messages: TestMessage[];
-    subscriptions: SubscriptionLog[];
-    scheduler: Scheduler;
-    logSubscribedFrame: () => number;
-    logUnsubscribedFrame: (index: number) => void;
-    constructor(messages: TestMessage[], scheduler: Scheduler);
-    scheduleMessages(subscriber: Subscriber<any>): void;
-}
diff --git a/node_modules/rxjs/internal/testing/ColdObservable.js b/node_modules/rxjs/internal/testing/ColdObservable.js
deleted file mode 100644
index 7829307..0000000
--- a/node_modules/rxjs/internal/testing/ColdObservable.js
+++ /dev/null
@@ -1,52 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-var SubscriptionLoggable_1 = require("./SubscriptionLoggable");
-var applyMixins_1 = require("../util/applyMixins");
-var ColdObservable = (function (_super) {
-    __extends(ColdObservable, _super);
-    function ColdObservable(messages, scheduler) {
-        var _this = _super.call(this, function (subscriber) {
-            var observable = this;
-            var index = observable.logSubscribedFrame();
-            var subscription = new Subscription_1.Subscription();
-            subscription.add(new Subscription_1.Subscription(function () {
-                observable.logUnsubscribedFrame(index);
-            }));
-            observable.scheduleMessages(subscriber);
-            return subscription;
-        }) || this;
-        _this.messages = messages;
-        _this.subscriptions = [];
-        _this.scheduler = scheduler;
-        return _this;
-    }
-    ColdObservable.prototype.scheduleMessages = function (subscriber) {
-        var messagesLength = this.messages.length;
-        for (var i = 0; i < messagesLength; i++) {
-            var message = this.messages[i];
-            subscriber.add(this.scheduler.schedule(function (_a) {
-                var message = _a.message, subscriber = _a.subscriber;
-                message.notification.observe(subscriber);
-            }, message.frame, { message: message, subscriber: subscriber }));
-        }
-    };
-    return ColdObservable;
-}(Observable_1.Observable));
-exports.ColdObservable = ColdObservable;
-applyMixins_1.applyMixins(ColdObservable, [SubscriptionLoggable_1.SubscriptionLoggable]);
-//# sourceMappingURL=ColdObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/testing/ColdObservable.js.map b/node_modules/rxjs/internal/testing/ColdObservable.js.map
deleted file mode 100644
index 9de5e97..0000000
--- a/node_modules/rxjs/internal/testing/ColdObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ColdObservable.js","sources":["../../src/internal/testing/ColdObservable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,4CAA2C;AAC3C,gDAA+C;AAI/C,+DAA8D;AAC9D,mDAAkD;AAQlD;IAAuC,kCAAa;IAMlD,wBAAmB,QAAuB,EAC9B,SAAoB;QADhC,YAEE,kBAAM,UAA+B,UAA2B;YAC9D,IAAM,UAAU,GAAsB,IAAW,CAAC;YAClD,IAAM,KAAK,GAAG,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAC9C,IAAM,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;YACxC,YAAY,CAAC,GAAG,CAAC,IAAI,2BAAY,CAAC;gBAChC,UAAU,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC,CAAC;YACJ,UAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACxC,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC,SAEH;QAbkB,cAAQ,GAAR,QAAQ,CAAe;QALnC,mBAAa,GAAsB,EAAE,CAAC;QAiB3C,KAAI,CAAC,SAAS,GAAG,SAAS,CAAC;;IAC7B,CAAC;IAED,yCAAgB,GAAhB,UAAiB,UAA2B;QAC1C,IAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE;YACvC,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACjC,UAAU,CAAC,GAAG,CACZ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAC,EAAuB;oBAArB,oBAAO,EAAE,0BAAU;gBAAS,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAAC,CAAC,EAChG,OAAO,CAAC,KAAK,EACb,EAAE,OAAO,SAAA,EAAE,UAAU,YAAA,EAAE,CAAC,CAC3B,CAAC;SACH;IACH,CAAC;IACH,qBAAC;AAAD,CAAC,AAhCD,CAAuC,uBAAU,GAgChD;AAhCY,wCAAc;AAiC3B,yBAAW,CAAC,cAAc,EAAE,CAAC,2CAAoB,CAAC,CAAC,CAAC"}
diff --git a/node_modules/rxjs/internal/testing/HotObservable.d.ts b/node_modules/rxjs/internal/testing/HotObservable.d.ts
deleted file mode 100644
index 083d11e..0000000
--- a/node_modules/rxjs/internal/testing/HotObservable.d.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Subject } from '../Subject';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { Scheduler } from '../Scheduler';
-import { TestMessage } from './TestMessage';
-import { SubscriptionLog } from './SubscriptionLog';
-import { SubscriptionLoggable } from './SubscriptionLoggable';
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export declare class HotObservable<T> extends Subject<T> implements SubscriptionLoggable {
-    messages: TestMessage[];
-    subscriptions: SubscriptionLog[];
-    scheduler: Scheduler;
-    logSubscribedFrame: () => number;
-    logUnsubscribedFrame: (index: number) => void;
-    constructor(messages: TestMessage[], scheduler: Scheduler);
-    /** @deprecated This is an internal implementation detail, do not use. */
-    _subscribe(subscriber: Subscriber<any>): Subscription;
-    setup(): void;
-}
diff --git a/node_modules/rxjs/internal/testing/HotObservable.js b/node_modules/rxjs/internal/testing/HotObservable.js
deleted file mode 100644
index f387cef..0000000
--- a/node_modules/rxjs/internal/testing/HotObservable.js
+++ /dev/null
@@ -1,53 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var Subscription_1 = require("../Subscription");
-var SubscriptionLoggable_1 = require("./SubscriptionLoggable");
-var applyMixins_1 = require("../util/applyMixins");
-var HotObservable = (function (_super) {
-    __extends(HotObservable, _super);
-    function HotObservable(messages, scheduler) {
-        var _this = _super.call(this) || this;
-        _this.messages = messages;
-        _this.subscriptions = [];
-        _this.scheduler = scheduler;
-        return _this;
-    }
-    HotObservable.prototype._subscribe = function (subscriber) {
-        var subject = this;
-        var index = subject.logSubscribedFrame();
-        var subscription = new Subscription_1.Subscription();
-        subscription.add(new Subscription_1.Subscription(function () {
-            subject.logUnsubscribedFrame(index);
-        }));
-        subscription.add(_super.prototype._subscribe.call(this, subscriber));
-        return subscription;
-    };
-    HotObservable.prototype.setup = function () {
-        var subject = this;
-        var messagesLength = subject.messages.length;
-        for (var i = 0; i < messagesLength; i++) {
-            (function () {
-                var message = subject.messages[i];
-                subject.scheduler.schedule(function () { message.notification.observe(subject); }, message.frame);
-            })();
-        }
-    };
-    return HotObservable;
-}(Subject_1.Subject));
-exports.HotObservable = HotObservable;
-applyMixins_1.applyMixins(HotObservable, [SubscriptionLoggable_1.SubscriptionLoggable]);
-//# sourceMappingURL=HotObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/testing/HotObservable.js.map b/node_modules/rxjs/internal/testing/HotObservable.js.map
deleted file mode 100644
index 12c26c7..0000000
--- a/node_modules/rxjs/internal/testing/HotObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"HotObservable.js","sources":["../../src/internal/testing/HotObservable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sCAAqC;AAErC,gDAA+C;AAI/C,+DAA8D;AAC9D,mDAAkD;AAOlD;IAAsC,iCAAU;IAM9C,uBAAmB,QAAuB,EAC9B,SAAoB;QADhC,YAEE,iBAAO,SAER;QAJkB,cAAQ,GAAR,QAAQ,CAAe;QALnC,mBAAa,GAAsB,EAAE,CAAC;QAQ3C,KAAI,CAAC,SAAS,GAAG,SAAS,CAAC;;IAC7B,CAAC;IAGD,kCAAU,GAAV,UAAW,UAA2B;QACpC,IAAM,OAAO,GAAqB,IAAI,CAAC;QACvC,IAAM,KAAK,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC3C,IAAM,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;QACxC,YAAY,CAAC,GAAG,CAAC,IAAI,2BAAY,CAAC;YAChC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC;QACJ,YAAY,CAAC,GAAG,CAAC,iBAAM,UAAU,YAAC,UAAU,CAAC,CAAC,CAAC;QAC/C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,6BAAK,GAAL;QACE,IAAM,OAAO,GAAG,IAAI,CAAC;QACrB,IAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE;YACvC,CAAC;gBACC,IAAI,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAElC,OAAO,CAAC,SAAS,CAAC,QAAQ,CACxB,cAAQ,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAChD,OAAO,CAAC,KAAK,CACd,CAAC;YACJ,CAAC,CAAC,EAAE,CAAC;SACN;IACH,CAAC;IACH,oBAAC;AAAD,CAAC,AAvCD,CAAsC,iBAAO,GAuC5C;AAvCY,sCAAa;AAwC1B,yBAAW,CAAC,aAAa,EAAE,CAAC,2CAAoB,CAAC,CAAC,CAAC"}
diff --git a/node_modules/rxjs/internal/testing/SubscriptionLog.d.ts b/node_modules/rxjs/internal/testing/SubscriptionLog.d.ts
deleted file mode 100644
index 73b23b4..0000000
--- a/node_modules/rxjs/internal/testing/SubscriptionLog.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export declare class SubscriptionLog {
-    subscribedFrame: number;
-    unsubscribedFrame: number;
-    constructor(subscribedFrame: number, unsubscribedFrame?: number);
-}
diff --git a/node_modules/rxjs/internal/testing/SubscriptionLog.js b/node_modules/rxjs/internal/testing/SubscriptionLog.js
deleted file mode 100644
index 718a1dd..0000000
--- a/node_modules/rxjs/internal/testing/SubscriptionLog.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var SubscriptionLog = (function () {
-    function SubscriptionLog(subscribedFrame, unsubscribedFrame) {
-        if (unsubscribedFrame === void 0) { unsubscribedFrame = Number.POSITIVE_INFINITY; }
-        this.subscribedFrame = subscribedFrame;
-        this.unsubscribedFrame = unsubscribedFrame;
-    }
-    return SubscriptionLog;
-}());
-exports.SubscriptionLog = SubscriptionLog;
-//# sourceMappingURL=SubscriptionLog.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/testing/SubscriptionLog.js.map b/node_modules/rxjs/internal/testing/SubscriptionLog.js.map
deleted file mode 100644
index cbffe53..0000000
--- a/node_modules/rxjs/internal/testing/SubscriptionLog.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubscriptionLog.js","sources":["../../src/internal/testing/SubscriptionLog.ts"],"names":[],"mappings":";;AAAA;IACE,yBAAmB,eAAuB,EACvB,iBAAoD;QAApD,kCAAA,EAAA,oBAA4B,MAAM,CAAC,iBAAiB;QADpD,oBAAe,GAAf,eAAe,CAAQ;QACvB,sBAAiB,GAAjB,iBAAiB,CAAmC;IACvE,CAAC;IACH,sBAAC;AAAD,CAAC,AAJD,IAIC;AAJY,0CAAe"}
diff --git a/node_modules/rxjs/internal/testing/SubscriptionLoggable.d.ts b/node_modules/rxjs/internal/testing/SubscriptionLoggable.d.ts
deleted file mode 100644
index cc95434..0000000
--- a/node_modules/rxjs/internal/testing/SubscriptionLoggable.d.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { Scheduler } from '../Scheduler';
-import { SubscriptionLog } from './SubscriptionLog';
-export declare class SubscriptionLoggable {
-    subscriptions: SubscriptionLog[];
-    scheduler: Scheduler;
-    logSubscribedFrame(): number;
-    logUnsubscribedFrame(index: number): void;
-}
diff --git a/node_modules/rxjs/internal/testing/SubscriptionLoggable.js b/node_modules/rxjs/internal/testing/SubscriptionLoggable.js
deleted file mode 100644
index fd8597f..0000000
--- a/node_modules/rxjs/internal/testing/SubscriptionLoggable.js
+++ /dev/null
@@ -1,20 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var SubscriptionLog_1 = require("./SubscriptionLog");
-var SubscriptionLoggable = (function () {
-    function SubscriptionLoggable() {
-        this.subscriptions = [];
-    }
-    SubscriptionLoggable.prototype.logSubscribedFrame = function () {
-        this.subscriptions.push(new SubscriptionLog_1.SubscriptionLog(this.scheduler.now()));
-        return this.subscriptions.length - 1;
-    };
-    SubscriptionLoggable.prototype.logUnsubscribedFrame = function (index) {
-        var subscriptionLogs = this.subscriptions;
-        var oldSubscriptionLog = subscriptionLogs[index];
-        subscriptionLogs[index] = new SubscriptionLog_1.SubscriptionLog(oldSubscriptionLog.subscribedFrame, this.scheduler.now());
-    };
-    return SubscriptionLoggable;
-}());
-exports.SubscriptionLoggable = SubscriptionLoggable;
-//# sourceMappingURL=SubscriptionLoggable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/testing/SubscriptionLoggable.js.map b/node_modules/rxjs/internal/testing/SubscriptionLoggable.js.map
deleted file mode 100644
index c3f4734..0000000
--- a/node_modules/rxjs/internal/testing/SubscriptionLoggable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubscriptionLoggable.js","sources":["../../src/internal/testing/SubscriptionLoggable.ts"],"names":[],"mappings":";;AACA,qDAAoD;AAEpD;IAAA;QACS,kBAAa,GAAsB,EAAE,CAAC;IAgB/C,CAAC;IAbC,iDAAkB,GAAlB;QACE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,iCAAe,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,mDAAoB,GAApB,UAAqB,KAAa;QAChC,IAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;QAC5C,IAAM,kBAAkB,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACnD,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,iCAAe,CAC3C,kBAAkB,CAAC,eAAe,EAClC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CACrB,CAAC;IACJ,CAAC;IACH,2BAAC;AAAD,CAAC,AAjBD,IAiBC;AAjBY,oDAAoB"}
diff --git a/node_modules/rxjs/internal/testing/TestMessage.d.ts b/node_modules/rxjs/internal/testing/TestMessage.d.ts
deleted file mode 100644
index 1181d60..0000000
--- a/node_modules/rxjs/internal/testing/TestMessage.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { Notification } from '../Notification';
-export interface TestMessage {
-    frame: number;
-    notification: Notification<any>;
-    isGhost?: boolean;
-}
diff --git a/node_modules/rxjs/internal/testing/TestMessage.js b/node_modules/rxjs/internal/testing/TestMessage.js
deleted file mode 100644
index 7bb158d..0000000
--- a/node_modules/rxjs/internal/testing/TestMessage.js
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=TestMessage.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/testing/TestMessage.js.map b/node_modules/rxjs/internal/testing/TestMessage.js.map
deleted file mode 100644
index ae60ae3..0000000
--- a/node_modules/rxjs/internal/testing/TestMessage.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TestMessage.js","sources":["../../src/internal/testing/TestMessage.ts"],"names":[],"mappings":""}
diff --git a/node_modules/rxjs/internal/testing/TestScheduler.d.ts b/node_modules/rxjs/internal/testing/TestScheduler.d.ts
deleted file mode 100644
index a2a40c3..0000000
--- a/node_modules/rxjs/internal/testing/TestScheduler.d.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { Observable } from '../Observable';
-import { ColdObservable } from './ColdObservable';
-import { HotObservable } from './HotObservable';
-import { TestMessage } from './TestMessage';
-import { SubscriptionLog } from './SubscriptionLog';
-import { VirtualTimeScheduler } from '../scheduler/VirtualTimeScheduler';
-export interface RunHelpers {
-    cold: typeof TestScheduler.prototype.createColdObservable;
-    hot: typeof TestScheduler.prototype.createHotObservable;
-    flush: typeof TestScheduler.prototype.flush;
-    expectObservable: typeof TestScheduler.prototype.expectObservable;
-    expectSubscriptions: typeof TestScheduler.prototype.expectSubscriptions;
-}
-export declare type observableToBeFn = (marbles: string, values?: any, errorValue?: any) => void;
-export declare type subscriptionLogsToBeFn = (marbles: string | string[]) => void;
-export declare class TestScheduler extends VirtualTimeScheduler {
-    assertDeepEqual: (actual: any, expected: any) => boolean | void;
-    readonly hotObservables: HotObservable<any>[];
-    readonly coldObservables: ColdObservable<any>[];
-    private flushTests;
-    private runMode;
-    constructor(assertDeepEqual: (actual: any, expected: any) => boolean | void);
-    createTime(marbles: string): number;
-    /**
-     * @param marbles A diagram in the marble DSL. Letters map to keys in `values` if provided.
-     * @param values Values to use for the letters in `marbles`. If ommitted, the letters themselves are used.
-     * @param error The error to use for the `#` marble (if present).
-     */
-    createColdObservable<T = string>(marbles: string, values?: {
-        [marble: string]: T;
-    }, error?: any): ColdObservable<T>;
-    /**
-     * @param marbles A diagram in the marble DSL. Letters map to keys in `values` if provided.
-     * @param values Values to use for the letters in `marbles`. If ommitted, the letters themselves are used.
-     * @param error The error to use for the `#` marble (if present).
-     */
-    createHotObservable<T = string>(marbles: string, values?: {
-        [marble: string]: T;
-    }, error?: any): HotObservable<T>;
-    private materializeInnerObservable;
-    expectObservable(observable: Observable<any>, subscriptionMarbles?: string): ({
-        toBe: observableToBeFn;
-    });
-    expectSubscriptions(actualSubscriptionLogs: SubscriptionLog[]): ({
-        toBe: subscriptionLogsToBeFn;
-    });
-    flush(): void;
-    /** @nocollapse */
-    static parseMarblesAsSubscriptions(marbles: string, runMode?: boolean): SubscriptionLog;
-    /** @nocollapse */
-    static parseMarbles(marbles: string, values?: any, errorValue?: any, materializeInnerObservables?: boolean, runMode?: boolean): TestMessage[];
-    run<T>(callback: (helpers: RunHelpers) => T): T;
-}
diff --git a/node_modules/rxjs/internal/testing/TestScheduler.js b/node_modules/rxjs/internal/testing/TestScheduler.js
deleted file mode 100644
index 6bf509c..0000000
--- a/node_modules/rxjs/internal/testing/TestScheduler.js
+++ /dev/null
@@ -1,364 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Notification_1 = require("../Notification");
-var ColdObservable_1 = require("./ColdObservable");
-var HotObservable_1 = require("./HotObservable");
-var SubscriptionLog_1 = require("./SubscriptionLog");
-var VirtualTimeScheduler_1 = require("../scheduler/VirtualTimeScheduler");
-var AsyncScheduler_1 = require("../scheduler/AsyncScheduler");
-var defaultMaxFrame = 750;
-var TestScheduler = (function (_super) {
-    __extends(TestScheduler, _super);
-    function TestScheduler(assertDeepEqual) {
-        var _this = _super.call(this, VirtualTimeScheduler_1.VirtualAction, defaultMaxFrame) || this;
-        _this.assertDeepEqual = assertDeepEqual;
-        _this.hotObservables = [];
-        _this.coldObservables = [];
-        _this.flushTests = [];
-        _this.runMode = false;
-        return _this;
-    }
-    TestScheduler.prototype.createTime = function (marbles) {
-        var indexOf = marbles.indexOf('|');
-        if (indexOf === -1) {
-            throw new Error('marble diagram for time should have a completion marker "|"');
-        }
-        return indexOf * TestScheduler.frameTimeFactor;
-    };
-    TestScheduler.prototype.createColdObservable = function (marbles, values, error) {
-        if (marbles.indexOf('^') !== -1) {
-            throw new Error('cold observable cannot have subscription offset "^"');
-        }
-        if (marbles.indexOf('!') !== -1) {
-            throw new Error('cold observable cannot have unsubscription marker "!"');
-        }
-        var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
-        var cold = new ColdObservable_1.ColdObservable(messages, this);
-        this.coldObservables.push(cold);
-        return cold;
-    };
-    TestScheduler.prototype.createHotObservable = function (marbles, values, error) {
-        if (marbles.indexOf('!') !== -1) {
-            throw new Error('hot observable cannot have unsubscription marker "!"');
-        }
-        var messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
-        var subject = new HotObservable_1.HotObservable(messages, this);
-        this.hotObservables.push(subject);
-        return subject;
-    };
-    TestScheduler.prototype.materializeInnerObservable = function (observable, outerFrame) {
-        var _this = this;
-        var messages = [];
-        observable.subscribe(function (value) {
-            messages.push({ frame: _this.frame - outerFrame, notification: Notification_1.Notification.createNext(value) });
-        }, function (err) {
-            messages.push({ frame: _this.frame - outerFrame, notification: Notification_1.Notification.createError(err) });
-        }, function () {
-            messages.push({ frame: _this.frame - outerFrame, notification: Notification_1.Notification.createComplete() });
-        });
-        return messages;
-    };
-    TestScheduler.prototype.expectObservable = function (observable, subscriptionMarbles) {
-        var _this = this;
-        if (subscriptionMarbles === void 0) { subscriptionMarbles = null; }
-        var actual = [];
-        var flushTest = { actual: actual, ready: false };
-        var subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);
-        var subscriptionFrame = subscriptionParsed.subscribedFrame === Number.POSITIVE_INFINITY ?
-            0 : subscriptionParsed.subscribedFrame;
-        var unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;
-        var subscription;
-        this.schedule(function () {
-            subscription = observable.subscribe(function (x) {
-                var value = x;
-                if (x instanceof Observable_1.Observable) {
-                    value = _this.materializeInnerObservable(value, _this.frame);
-                }
-                actual.push({ frame: _this.frame, notification: Notification_1.Notification.createNext(value) });
-            }, function (err) {
-                actual.push({ frame: _this.frame, notification: Notification_1.Notification.createError(err) });
-            }, function () {
-                actual.push({ frame: _this.frame, notification: Notification_1.Notification.createComplete() });
-            });
-        }, subscriptionFrame);
-        if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {
-            this.schedule(function () { return subscription.unsubscribe(); }, unsubscriptionFrame);
-        }
-        this.flushTests.push(flushTest);
-        var runMode = this.runMode;
-        return {
-            toBe: function (marbles, values, errorValue) {
-                flushTest.ready = true;
-                flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);
-            }
-        };
-    };
-    TestScheduler.prototype.expectSubscriptions = function (actualSubscriptionLogs) {
-        var flushTest = { actual: actualSubscriptionLogs, ready: false };
-        this.flushTests.push(flushTest);
-        var runMode = this.runMode;
-        return {
-            toBe: function (marbles) {
-                var marblesArray = (typeof marbles === 'string') ? [marbles] : marbles;
-                flushTest.ready = true;
-                flushTest.expected = marblesArray.map(function (marbles) {
-                    return TestScheduler.parseMarblesAsSubscriptions(marbles, runMode);
-                });
-            }
-        };
-    };
-    TestScheduler.prototype.flush = function () {
-        var _this = this;
-        var hotObservables = this.hotObservables;
-        while (hotObservables.length > 0) {
-            hotObservables.shift().setup();
-        }
-        _super.prototype.flush.call(this);
-        this.flushTests = this.flushTests.filter(function (test) {
-            if (test.ready) {
-                _this.assertDeepEqual(test.actual, test.expected);
-                return false;
-            }
-            return true;
-        });
-    };
-    TestScheduler.parseMarblesAsSubscriptions = function (marbles, runMode) {
-        var _this = this;
-        if (runMode === void 0) { runMode = false; }
-        if (typeof marbles !== 'string') {
-            return new SubscriptionLog_1.SubscriptionLog(Number.POSITIVE_INFINITY);
-        }
-        var len = marbles.length;
-        var groupStart = -1;
-        var subscriptionFrame = Number.POSITIVE_INFINITY;
-        var unsubscriptionFrame = Number.POSITIVE_INFINITY;
-        var frame = 0;
-        var _loop_1 = function (i) {
-            var nextFrame = frame;
-            var advanceFrameBy = function (count) {
-                nextFrame += count * _this.frameTimeFactor;
-            };
-            var c = marbles[i];
-            switch (c) {
-                case ' ':
-                    if (!runMode) {
-                        advanceFrameBy(1);
-                    }
-                    break;
-                case '-':
-                    advanceFrameBy(1);
-                    break;
-                case '(':
-                    groupStart = frame;
-                    advanceFrameBy(1);
-                    break;
-                case ')':
-                    groupStart = -1;
-                    advanceFrameBy(1);
-                    break;
-                case '^':
-                    if (subscriptionFrame !== Number.POSITIVE_INFINITY) {
-                        throw new Error('found a second subscription point \'^\' in a ' +
-                            'subscription marble diagram. There can only be one.');
-                    }
-                    subscriptionFrame = groupStart > -1 ? groupStart : frame;
-                    advanceFrameBy(1);
-                    break;
-                case '!':
-                    if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {
-                        throw new Error('found a second subscription point \'^\' in a ' +
-                            'subscription marble diagram. There can only be one.');
-                    }
-                    unsubscriptionFrame = groupStart > -1 ? groupStart : frame;
-                    break;
-                default:
-                    if (runMode && c.match(/^[0-9]$/)) {
-                        if (i === 0 || marbles[i - 1] === ' ') {
-                            var buffer = marbles.slice(i);
-                            var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
-                            if (match) {
-                                i += match[0].length - 1;
-                                var duration = parseFloat(match[1]);
-                                var unit = match[2];
-                                var durationInMs = void 0;
-                                switch (unit) {
-                                    case 'ms':
-                                        durationInMs = duration;
-                                        break;
-                                    case 's':
-                                        durationInMs = duration * 1000;
-                                        break;
-                                    case 'm':
-                                        durationInMs = duration * 1000 * 60;
-                                        break;
-                                    default:
-                                        break;
-                                }
-                                advanceFrameBy(durationInMs / this_1.frameTimeFactor);
-                                break;
-                            }
-                        }
-                    }
-                    throw new Error('there can only be \'^\' and \'!\' markers in a ' +
-                        'subscription marble diagram. Found instead \'' + c + '\'.');
-            }
-            frame = nextFrame;
-            out_i_1 = i;
-        };
-        var this_1 = this, out_i_1;
-        for (var i = 0; i < len; i++) {
-            _loop_1(i);
-            i = out_i_1;
-        }
-        if (unsubscriptionFrame < 0) {
-            return new SubscriptionLog_1.SubscriptionLog(subscriptionFrame);
-        }
-        else {
-            return new SubscriptionLog_1.SubscriptionLog(subscriptionFrame, unsubscriptionFrame);
-        }
-    };
-    TestScheduler.parseMarbles = function (marbles, values, errorValue, materializeInnerObservables, runMode) {
-        var _this = this;
-        if (materializeInnerObservables === void 0) { materializeInnerObservables = false; }
-        if (runMode === void 0) { runMode = false; }
-        if (marbles.indexOf('!') !== -1) {
-            throw new Error('conventional marble diagrams cannot have the ' +
-                'unsubscription marker "!"');
-        }
-        var len = marbles.length;
-        var testMessages = [];
-        var subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');
-        var frame = subIndex === -1 ? 0 : (subIndex * -this.frameTimeFactor);
-        var getValue = typeof values !== 'object' ?
-            function (x) { return x; } :
-            function (x) {
-                if (materializeInnerObservables && values[x] instanceof ColdObservable_1.ColdObservable) {
-                    return values[x].messages;
-                }
-                return values[x];
-            };
-        var groupStart = -1;
-        var _loop_2 = function (i) {
-            var nextFrame = frame;
-            var advanceFrameBy = function (count) {
-                nextFrame += count * _this.frameTimeFactor;
-            };
-            var notification = void 0;
-            var c = marbles[i];
-            switch (c) {
-                case ' ':
-                    if (!runMode) {
-                        advanceFrameBy(1);
-                    }
-                    break;
-                case '-':
-                    advanceFrameBy(1);
-                    break;
-                case '(':
-                    groupStart = frame;
-                    advanceFrameBy(1);
-                    break;
-                case ')':
-                    groupStart = -1;
-                    advanceFrameBy(1);
-                    break;
-                case '|':
-                    notification = Notification_1.Notification.createComplete();
-                    advanceFrameBy(1);
-                    break;
-                case '^':
-                    advanceFrameBy(1);
-                    break;
-                case '#':
-                    notification = Notification_1.Notification.createError(errorValue || 'error');
-                    advanceFrameBy(1);
-                    break;
-                default:
-                    if (runMode && c.match(/^[0-9]$/)) {
-                        if (i === 0 || marbles[i - 1] === ' ') {
-                            var buffer = marbles.slice(i);
-                            var match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
-                            if (match) {
-                                i += match[0].length - 1;
-                                var duration = parseFloat(match[1]);
-                                var unit = match[2];
-                                var durationInMs = void 0;
-                                switch (unit) {
-                                    case 'ms':
-                                        durationInMs = duration;
-                                        break;
-                                    case 's':
-                                        durationInMs = duration * 1000;
-                                        break;
-                                    case 'm':
-                                        durationInMs = duration * 1000 * 60;
-                                        break;
-                                    default:
-                                        break;
-                                }
-                                advanceFrameBy(durationInMs / this_2.frameTimeFactor);
-                                break;
-                            }
-                        }
-                    }
-                    notification = Notification_1.Notification.createNext(getValue(c));
-                    advanceFrameBy(1);
-                    break;
-            }
-            if (notification) {
-                testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification: notification });
-            }
-            frame = nextFrame;
-            out_i_2 = i;
-        };
-        var this_2 = this, out_i_2;
-        for (var i = 0; i < len; i++) {
-            _loop_2(i);
-            i = out_i_2;
-        }
-        return testMessages;
-    };
-    TestScheduler.prototype.run = function (callback) {
-        var prevFrameTimeFactor = TestScheduler.frameTimeFactor;
-        var prevMaxFrames = this.maxFrames;
-        TestScheduler.frameTimeFactor = 1;
-        this.maxFrames = Number.POSITIVE_INFINITY;
-        this.runMode = true;
-        AsyncScheduler_1.AsyncScheduler.delegate = this;
-        var helpers = {
-            cold: this.createColdObservable.bind(this),
-            hot: this.createHotObservable.bind(this),
-            flush: this.flush.bind(this),
-            expectObservable: this.expectObservable.bind(this),
-            expectSubscriptions: this.expectSubscriptions.bind(this),
-        };
-        try {
-            var ret = callback(helpers);
-            this.flush();
-            return ret;
-        }
-        finally {
-            TestScheduler.frameTimeFactor = prevFrameTimeFactor;
-            this.maxFrames = prevMaxFrames;
-            this.runMode = false;
-            AsyncScheduler_1.AsyncScheduler.delegate = undefined;
-        }
-    };
-    return TestScheduler;
-}(VirtualTimeScheduler_1.VirtualTimeScheduler));
-exports.TestScheduler = TestScheduler;
-//# sourceMappingURL=TestScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/testing/TestScheduler.js.map b/node_modules/rxjs/internal/testing/TestScheduler.js.map
deleted file mode 100644
index 4fe018c..0000000
--- a/node_modules/rxjs/internal/testing/TestScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TestScheduler.js","sources":["../../src/internal/testing/TestScheduler.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/internal/types.d.ts b/node_modules/rxjs/internal/types.d.ts
deleted file mode 100644
index 145d2d5..0000000
--- a/node_modules/rxjs/internal/types.d.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { Observable } from './Observable';
-import { Subscription } from './Subscription';
-/** OPERATOR INTERFACES */
-export interface UnaryFunction<T, R> {
-    (source: T): R;
-}
-export interface OperatorFunction<T, R> extends UnaryFunction<Observable<T>, Observable<R>> {
-}
-export declare type FactoryOrValue<T> = T | (() => T);
-export interface MonoTypeOperatorFunction<T> extends OperatorFunction<T, T> {
-}
-export interface Timestamp<T> {
-    value: T;
-    timestamp: number;
-}
-export interface TimeInterval<T> {
-    value: T;
-    interval: number;
-}
-/** SUBSCRIPTION INTERFACES */
-export interface Unsubscribable {
-    unsubscribe(): void;
-}
-export declare type TeardownLogic = Unsubscribable | Function | void;
-export interface SubscriptionLike extends Unsubscribable {
-    unsubscribe(): void;
-    readonly closed: boolean;
-}
-export declare type SubscribableOrPromise<T> = Subscribable<T> | Subscribable<never> | PromiseLike<T> | InteropObservable<T>;
-/** OBSERVABLE INTERFACES */
-export interface Subscribable<T> {
-    subscribe(observer?: PartialObserver<T>): Unsubscribable;
-    /** @deprecated Use an observer instead of a complete callback */
-    subscribe(next: null | undefined, error: null | undefined, complete: () => void): Unsubscribable;
-    /** @deprecated Use an observer instead of an error callback */
-    subscribe(next: null | undefined, error: (error: any) => void, complete?: () => void): Unsubscribable;
-    /** @deprecated Use an observer instead of a complete callback */
-    subscribe(next: (value: T) => void, error: null | undefined, complete: () => void): Unsubscribable;
-    subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Unsubscribable;
-}
-export declare type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T> | Iterable<T>;
-/** @deprecated use {@link InteropObservable } */
-export declare type ObservableLike<T> = InteropObservable<T>;
-export declare type InteropObservable<T> = {
-    [Symbol.observable]: () => Subscribable<T>;
-};
-/** OBSERVER INTERFACES */
-export interface NextObserver<T> {
-    closed?: boolean;
-    next: (value: T) => void;
-    error?: (err: any) => void;
-    complete?: () => void;
-}
-export interface ErrorObserver<T> {
-    closed?: boolean;
-    next?: (value: T) => void;
-    error: (err: any) => void;
-    complete?: () => void;
-}
-export interface CompletionObserver<T> {
-    closed?: boolean;
-    next?: (value: T) => void;
-    error?: (err: any) => void;
-    complete: () => void;
-}
-export declare type PartialObserver<T> = NextObserver<T> | ErrorObserver<T> | CompletionObserver<T>;
-export interface Observer<T> {
-    closed?: boolean;
-    next: (value: T) => void;
-    error: (err: any) => void;
-    complete: () => void;
-}
-/** SCHEDULER INTERFACES */
-export interface SchedulerLike {
-    now(): number;
-    schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay?: number, state?: T): Subscription;
-}
-export interface SchedulerAction<T> extends Subscription {
-    schedule(state?: T, delay?: number): Subscription;
-}
-export declare type ObservedValueOf<O> = O extends ObservableInput<infer T> ? T : never;
-export declare type ObservedValuesFromArray<X> = X extends Array<ObservableInput<infer T>> ? T : never;
diff --git a/node_modules/rxjs/internal/types.js b/node_modules/rxjs/internal/types.js
deleted file mode 100644
index 11e638d..0000000
--- a/node_modules/rxjs/internal/types.js
+++ /dev/null
@@ -1,3 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-//# sourceMappingURL=types.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/types.js.map b/node_modules/rxjs/internal/types.js.map
deleted file mode 100644
index 92d4483..0000000
--- a/node_modules/rxjs/internal/types.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"types.js","sources":["../src/internal/types.ts"],"names":[],"mappings":""}
diff --git a/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.d.ts b/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.d.ts
deleted file mode 100644
index 830b291..0000000
--- a/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.d.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-export interface ArgumentOutOfRangeError extends Error {
-}
-export interface ArgumentOutOfRangeErrorCtor {
-    new (): ArgumentOutOfRangeError;
-}
-/**
- * An error thrown when an element was queried at a certain index of an
- * Observable, but no such index or position exists in that sequence.
- *
- * @see {@link elementAt}
- * @see {@link take}
- * @see {@link takeLast}
- *
- * @class ArgumentOutOfRangeError
- */
-export declare const ArgumentOutOfRangeError: ArgumentOutOfRangeErrorCtor;
diff --git a/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.js b/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.js
deleted file mode 100644
index 121be11..0000000
--- a/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ArgumentOutOfRangeErrorImpl = (function () {
-    function ArgumentOutOfRangeErrorImpl() {
-        Error.call(this);
-        this.message = 'argument out of range';
-        this.name = 'ArgumentOutOfRangeError';
-        return this;
-    }
-    ArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype);
-    return ArgumentOutOfRangeErrorImpl;
-})();
-exports.ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl;
-//# sourceMappingURL=ArgumentOutOfRangeError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.js.map b/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.js.map
deleted file mode 100644
index 1beb7e5..0000000
--- a/node_modules/rxjs/internal/util/ArgumentOutOfRangeError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ArgumentOutOfRangeError.js","sources":["../../src/internal/util/ArgumentOutOfRangeError.ts"],"names":[],"mappings":";;AAOA,IAAM,2BAA2B,GAAG,CAAC;IACnC,SAAS,2BAA2B;QAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,uBAAuB,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO,2BAA2B,CAAC;AACrC,CAAC,CAAC,EAAE,CAAC;AAYQ,QAAA,uBAAuB,GAAgC,2BAAkC,CAAC"}
diff --git a/node_modules/rxjs/internal/util/EmptyError.d.ts b/node_modules/rxjs/internal/util/EmptyError.d.ts
deleted file mode 100644
index f3b499e..0000000
--- a/node_modules/rxjs/internal/util/EmptyError.d.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-export interface EmptyError extends Error {
-}
-export interface EmptyErrorCtor {
-    new (): EmptyError;
-}
-/**
- * An error thrown when an Observable or a sequence was queried but has no
- * elements.
- *
- * @see {@link first}
- * @see {@link last}
- * @see {@link single}
- *
- * @class EmptyError
- */
-export declare const EmptyError: EmptyErrorCtor;
diff --git a/node_modules/rxjs/internal/util/EmptyError.js b/node_modules/rxjs/internal/util/EmptyError.js
deleted file mode 100644
index 1824ca8..0000000
--- a/node_modules/rxjs/internal/util/EmptyError.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var EmptyErrorImpl = (function () {
-    function EmptyErrorImpl() {
-        Error.call(this);
-        this.message = 'no elements in sequence';
-        this.name = 'EmptyError';
-        return this;
-    }
-    EmptyErrorImpl.prototype = Object.create(Error.prototype);
-    return EmptyErrorImpl;
-})();
-exports.EmptyError = EmptyErrorImpl;
-//# sourceMappingURL=EmptyError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/EmptyError.js.map b/node_modules/rxjs/internal/util/EmptyError.js.map
deleted file mode 100644
index 3cdbb22..0000000
--- a/node_modules/rxjs/internal/util/EmptyError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"EmptyError.js","sources":["../../src/internal/util/EmptyError.ts"],"names":[],"mappings":";;AAOA,IAAM,cAAc,GAAG,CAAC;IACtB,SAAS,cAAc;QACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,yBAAyB,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE1D,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC,EAAE,CAAC;AAYQ,QAAA,UAAU,GAAmB,cAAqB,CAAC"}
diff --git a/node_modules/rxjs/internal/util/Immediate.d.ts b/node_modules/rxjs/internal/util/Immediate.d.ts
deleted file mode 100644
index 87fc247..0000000
--- a/node_modules/rxjs/internal/util/Immediate.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * Helper functions to schedule and unschedule microtasks.
- */
-export declare const Immediate: {
-    setImmediate(cb: () => void): number;
-    clearImmediate(handle: number): void;
-};
-/**
- * Used for internal testing purposes only. Do not export from library.
- */
-export declare const TestTools: {
-    pending(): number;
-};
diff --git a/node_modules/rxjs/internal/util/Immediate.js b/node_modules/rxjs/internal/util/Immediate.js
deleted file mode 100644
index 02ccec2..0000000
--- a/node_modules/rxjs/internal/util/Immediate.js
+++ /dev/null
@@ -1,29 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var nextHandle = 1;
-var RESOLVED = (function () { return Promise.resolve(); })();
-var activeHandles = {};
-function findAndClearHandle(handle) {
-    if (handle in activeHandles) {
-        delete activeHandles[handle];
-        return true;
-    }
-    return false;
-}
-exports.Immediate = {
-    setImmediate: function (cb) {
-        var handle = nextHandle++;
-        activeHandles[handle] = true;
-        RESOLVED.then(function () { return findAndClearHandle(handle) && cb(); });
-        return handle;
-    },
-    clearImmediate: function (handle) {
-        findAndClearHandle(handle);
-    },
-};
-exports.TestTools = {
-    pending: function () {
-        return Object.keys(activeHandles).length;
-    }
-};
-//# sourceMappingURL=Immediate.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/Immediate.js.map b/node_modules/rxjs/internal/util/Immediate.js.map
deleted file mode 100644
index 659e145..0000000
--- a/node_modules/rxjs/internal/util/Immediate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Immediate.js","sources":["../../src/internal/util/Immediate.ts"],"names":[],"mappings":";;AAAA,IAAI,UAAU,GAAG,CAAC,CAAC;AACnB,IAAM,QAAQ,GAAG,CAAC,cAAM,OAAA,OAAO,CAAC,OAAO,EAAE,EAAjB,CAAiB,CAAC,EAAE,CAAC;AAC7C,IAAM,aAAa,GAA2B,EAAE,CAAC;AAOjD,SAAS,kBAAkB,CAAC,MAAc;IACxC,IAAI,MAAM,IAAI,aAAa,EAAE;QAC3B,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;KACb;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAKY,QAAA,SAAS,GAAG;IACvB,YAAY,EAAZ,UAAa,EAAc;QACzB,IAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,cAAM,OAAA,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAlC,CAAkC,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,cAAc,EAAd,UAAe,MAAc;QAC3B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC;AAKW,QAAA,SAAS,GAAG;IACvB,OAAO;QACL,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;IAC3C,CAAC;CACF,CAAC"}
diff --git a/node_modules/rxjs/internal/util/ObjectUnsubscribedError.d.ts b/node_modules/rxjs/internal/util/ObjectUnsubscribedError.d.ts
deleted file mode 100644
index b94c151..0000000
--- a/node_modules/rxjs/internal/util/ObjectUnsubscribedError.d.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-export interface ObjectUnsubscribedError extends Error {
-}
-export interface ObjectUnsubscribedErrorCtor {
-    new (): ObjectUnsubscribedError;
-}
-/**
- * An error thrown when an action is invalid because the object has been
- * unsubscribed.
- *
- * @see {@link Subject}
- * @see {@link BehaviorSubject}
- *
- * @class ObjectUnsubscribedError
- */
-export declare const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor;
diff --git a/node_modules/rxjs/internal/util/ObjectUnsubscribedError.js b/node_modules/rxjs/internal/util/ObjectUnsubscribedError.js
deleted file mode 100644
index 3838aa4..0000000
--- a/node_modules/rxjs/internal/util/ObjectUnsubscribedError.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ObjectUnsubscribedErrorImpl = (function () {
-    function ObjectUnsubscribedErrorImpl() {
-        Error.call(this);
-        this.message = 'object unsubscribed';
-        this.name = 'ObjectUnsubscribedError';
-        return this;
-    }
-    ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);
-    return ObjectUnsubscribedErrorImpl;
-})();
-exports.ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;
-//# sourceMappingURL=ObjectUnsubscribedError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/ObjectUnsubscribedError.js.map b/node_modules/rxjs/internal/util/ObjectUnsubscribedError.js.map
deleted file mode 100644
index c9125ba..0000000
--- a/node_modules/rxjs/internal/util/ObjectUnsubscribedError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ObjectUnsubscribedError.js","sources":["../../src/internal/util/ObjectUnsubscribedError.ts"],"names":[],"mappings":";;AAOA,IAAM,2BAA2B,GAAG,CAAC;IACnC,SAAS,2BAA2B;QAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,qBAAqB,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2BAA2B,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO,2BAA2B,CAAC;AACrC,CAAC,CAAC,EAAE,CAAC;AAWQ,QAAA,uBAAuB,GAAgC,2BAAkC,CAAC"}
diff --git a/node_modules/rxjs/internal/util/TimeoutError.d.ts b/node_modules/rxjs/internal/util/TimeoutError.d.ts
deleted file mode 100644
index e42ab0d..0000000
--- a/node_modules/rxjs/internal/util/TimeoutError.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-export interface TimeoutError extends Error {
-}
-export interface TimeoutErrorCtor {
-    new (): TimeoutError;
-}
-/**
- * An error thrown when duetime elapses.
- *
- * @see {@link operators/timeout}
- *
- * @class TimeoutError
- */
-export declare const TimeoutError: TimeoutErrorCtor;
diff --git a/node_modules/rxjs/internal/util/TimeoutError.js b/node_modules/rxjs/internal/util/TimeoutError.js
deleted file mode 100644
index 3127694..0000000
--- a/node_modules/rxjs/internal/util/TimeoutError.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var TimeoutErrorImpl = (function () {
-    function TimeoutErrorImpl() {
-        Error.call(this);
-        this.message = 'Timeout has occurred';
-        this.name = 'TimeoutError';
-        return this;
-    }
-    TimeoutErrorImpl.prototype = Object.create(Error.prototype);
-    return TimeoutErrorImpl;
-})();
-exports.TimeoutError = TimeoutErrorImpl;
-//# sourceMappingURL=TimeoutError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/TimeoutError.js.map b/node_modules/rxjs/internal/util/TimeoutError.js.map
deleted file mode 100644
index ff38247..0000000
--- a/node_modules/rxjs/internal/util/TimeoutError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TimeoutError.js","sources":["../../src/internal/util/TimeoutError.ts"],"names":[],"mappings":";;AAOA,IAAM,gBAAgB,GAAG,CAAC;IACxB,SAAS,gBAAgB;QACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,sBAAsB,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE5D,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC,EAAE,CAAC;AASQ,QAAA,YAAY,GAAqB,gBAAuB,CAAC"}
diff --git a/node_modules/rxjs/internal/util/UnsubscriptionError.d.ts b/node_modules/rxjs/internal/util/UnsubscriptionError.d.ts
deleted file mode 100644
index c10c91c..0000000
--- a/node_modules/rxjs/internal/util/UnsubscriptionError.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export interface UnsubscriptionError extends Error {
-    readonly errors: any[];
-}
-export interface UnsubscriptionErrorCtor {
-    new (errors: any[]): UnsubscriptionError;
-}
-/**
- * An error thrown when one or more errors have occurred during the
- * `unsubscribe` of a {@link Subscription}.
- */
-export declare const UnsubscriptionError: UnsubscriptionErrorCtor;
diff --git a/node_modules/rxjs/internal/util/UnsubscriptionError.js b/node_modules/rxjs/internal/util/UnsubscriptionError.js
deleted file mode 100644
index 34c8c27..0000000
--- a/node_modules/rxjs/internal/util/UnsubscriptionError.js
+++ /dev/null
@@ -1,16 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var UnsubscriptionErrorImpl = (function () {
-    function UnsubscriptionErrorImpl(errors) {
-        Error.call(this);
-        this.message = errors ?
-            errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n  ') : '';
-        this.name = 'UnsubscriptionError';
-        this.errors = errors;
-        return this;
-    }
-    UnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);
-    return UnsubscriptionErrorImpl;
-})();
-exports.UnsubscriptionError = UnsubscriptionErrorImpl;
-//# sourceMappingURL=UnsubscriptionError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/UnsubscriptionError.js.map b/node_modules/rxjs/internal/util/UnsubscriptionError.js.map
deleted file mode 100644
index 6d0170b..0000000
--- a/node_modules/rxjs/internal/util/UnsubscriptionError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"UnsubscriptionError.js","sources":["../../src/internal/util/UnsubscriptionError.ts"],"names":[],"mappings":";;AAQA,IAAM,uBAAuB,GAAG,CAAC;IAC/B,SAAS,uBAAuB,CAAY,MAAa;QACvD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;YAClB,MAAM,CAAC,MAAM,iDACpB,MAAM,CAAC,GAAG,CAAC,UAAC,GAAG,EAAE,CAAC,IAAK,OAAG,CAAC,GAAG,CAAC,UAAK,GAAG,CAAC,QAAQ,EAAI,EAA7B,CAA6B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAEnE,OAAO,uBAAuB,CAAC;AACjC,CAAC,CAAC,EAAE,CAAC;AAMQ,QAAA,mBAAmB,GAA4B,uBAA8B,CAAC"}
diff --git a/node_modules/rxjs/internal/util/applyMixins.d.ts b/node_modules/rxjs/internal/util/applyMixins.d.ts
deleted file mode 100644
index aaefdf3..0000000
--- a/node_modules/rxjs/internal/util/applyMixins.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare function applyMixins(derivedCtor: any, baseCtors: any[]): void;
diff --git a/node_modules/rxjs/internal/util/applyMixins.js b/node_modules/rxjs/internal/util/applyMixins.js
deleted file mode 100644
index 6c6114a..0000000
--- a/node_modules/rxjs/internal/util/applyMixins.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function applyMixins(derivedCtor, baseCtors) {
-    for (var i = 0, len = baseCtors.length; i < len; i++) {
-        var baseCtor = baseCtors[i];
-        var propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);
-        for (var j = 0, len2 = propertyKeys.length; j < len2; j++) {
-            var name_1 = propertyKeys[j];
-            derivedCtor.prototype[name_1] = baseCtor.prototype[name_1];
-        }
-    }
-}
-exports.applyMixins = applyMixins;
-//# sourceMappingURL=applyMixins.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/applyMixins.js.map b/node_modules/rxjs/internal/util/applyMixins.js.map
deleted file mode 100644
index 7981377..0000000
--- a/node_modules/rxjs/internal/util/applyMixins.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"applyMixins.js","sources":["../../src/internal/util/applyMixins.ts"],"names":[],"mappings":";;AAAA,SAAgB,WAAW,CAAC,WAAgB,EAAE,SAAgB;IAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;QACpD,IAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAM,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YACzD,IAAM,MAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,WAAW,CAAC,SAAS,CAAC,MAAI,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAI,CAAC,CAAC;SACxD;KACF;AACH,CAAC;AATD,kCASC"}
diff --git a/node_modules/rxjs/internal/util/canReportError.d.ts b/node_modules/rxjs/internal/util/canReportError.d.ts
deleted file mode 100644
index 0757e79..0000000
--- a/node_modules/rxjs/internal/util/canReportError.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { Subject } from '../Subject';
-/**
- * Determines whether the ErrorObserver is closed or stopped or has a
- * destination that is closed or stopped - in which case errors will
- * need to be reported via a different mechanism.
- * @param observer the observer
- */
-export declare function canReportError(observer: Subscriber<any> | Subject<any>): boolean;
diff --git a/node_modules/rxjs/internal/util/canReportError.js b/node_modules/rxjs/internal/util/canReportError.js
deleted file mode 100644
index 971f871..0000000
--- a/node_modules/rxjs/internal/util/canReportError.js
+++ /dev/null
@@ -1,20 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function canReportError(observer) {
-    while (observer) {
-        var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped;
-        if (closed_1 || isStopped) {
-            return false;
-        }
-        else if (destination && destination instanceof Subscriber_1.Subscriber) {
-            observer = destination;
-        }
-        else {
-            observer = null;
-        }
-    }
-    return true;
-}
-exports.canReportError = canReportError;
-//# sourceMappingURL=canReportError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/canReportError.js.map b/node_modules/rxjs/internal/util/canReportError.js.map
deleted file mode 100644
index 01531e9..0000000
--- a/node_modules/rxjs/internal/util/canReportError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"canReportError.js","sources":["../../src/internal/util/canReportError.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAS3C,SAAgB,cAAc,CAAC,QAAwC;IACrE,OAAO,QAAQ,EAAE;QACT,IAAA,aAAoD,EAAlD,oBAAM,EAAE,4BAAW,EAAE,wBAAS,CAAqB;QAC3D,IAAI,QAAM,IAAI,SAAS,EAAE;YACvB,OAAO,KAAK,CAAC;SACd;aAAM,IAAI,WAAW,IAAI,WAAW,YAAY,uBAAU,EAAE;YAC3D,QAAQ,GAAG,WAAW,CAAC;SACxB;aAAM;YACL,QAAQ,GAAG,IAAI,CAAC;SACjB;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAZD,wCAYC"}
diff --git a/node_modules/rxjs/internal/util/errorObject.d.ts b/node_modules/rxjs/internal/util/errorObject.d.ts
deleted file mode 100644
index d9dcd08..0000000
--- a/node_modules/rxjs/internal/util/errorObject.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare const errorObject: any;
diff --git a/node_modules/rxjs/internal/util/errorObject.js b/node_modules/rxjs/internal/util/errorObject.js
deleted file mode 100644
index e77b450..0000000
--- a/node_modules/rxjs/internal/util/errorObject.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.errorObject = { e: {} };
-//# sourceMappingURL=errorObject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/errorObject.js.map b/node_modules/rxjs/internal/util/errorObject.js.map
deleted file mode 100644
index dd3398f..0000000
--- a/node_modules/rxjs/internal/util/errorObject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"errorObject.js","sources":["../../src/internal/util/errorObject.ts"],"names":[],"mappings":";;AACa,QAAA,WAAW,GAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC"}
diff --git a/node_modules/rxjs/internal/util/hostReportError.d.ts b/node_modules/rxjs/internal/util/hostReportError.d.ts
deleted file mode 100644
index 5ab22b1..0000000
--- a/node_modules/rxjs/internal/util/hostReportError.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * Throws an error on another job so that it's picked up by the runtime's
- * uncaught error handling mechanism.
- * @param err the error to throw
- */
-export declare function hostReportError(err: any): void;
diff --git a/node_modules/rxjs/internal/util/hostReportError.js b/node_modules/rxjs/internal/util/hostReportError.js
deleted file mode 100644
index 2fb7fa5..0000000
--- a/node_modules/rxjs/internal/util/hostReportError.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function hostReportError(err) {
-    setTimeout(function () { throw err; }, 0);
-}
-exports.hostReportError = hostReportError;
-//# sourceMappingURL=hostReportError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/hostReportError.js.map b/node_modules/rxjs/internal/util/hostReportError.js.map
deleted file mode 100644
index 3f018e2..0000000
--- a/node_modules/rxjs/internal/util/hostReportError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"hostReportError.js","sources":["../../src/internal/util/hostReportError.ts"],"names":[],"mappings":";;AAKA,SAAgB,eAAe,CAAC,GAAQ;IACtC,UAAU,CAAC,cAAQ,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAFD,0CAEC"}
diff --git a/node_modules/rxjs/internal/util/identity.d.ts b/node_modules/rxjs/internal/util/identity.d.ts
deleted file mode 100644
index 1b8a3fc..0000000
--- a/node_modules/rxjs/internal/util/identity.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare function identity<T>(x: T): T;
diff --git a/node_modules/rxjs/internal/util/identity.js b/node_modules/rxjs/internal/util/identity.js
deleted file mode 100644
index dd4e60f..0000000
--- a/node_modules/rxjs/internal/util/identity.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function identity(x) {
-    return x;
-}
-exports.identity = identity;
-//# sourceMappingURL=identity.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/identity.js.map b/node_modules/rxjs/internal/util/identity.js.map
deleted file mode 100644
index 57e80c4..0000000
--- a/node_modules/rxjs/internal/util/identity.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"identity.js","sources":["../../src/internal/util/identity.ts"],"names":[],"mappings":";;AAAA,SAAgB,QAAQ,CAAI,CAAI;IAC9B,OAAO,CAAC,CAAC;AACX,CAAC;AAFD,4BAEC"}
diff --git a/node_modules/rxjs/internal/util/isArray.d.ts b/node_modules/rxjs/internal/util/isArray.d.ts
deleted file mode 100644
index a920d3f..0000000
--- a/node_modules/rxjs/internal/util/isArray.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare const isArray: (arg: any) => arg is any[];
diff --git a/node_modules/rxjs/internal/util/isArray.js b/node_modules/rxjs/internal/util/isArray.js
deleted file mode 100644
index e9c093c..0000000
--- a/node_modules/rxjs/internal/util/isArray.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.isArray = (function () { return Array.isArray || (function (x) { return x && typeof x.length === 'number'; }); })();
-//# sourceMappingURL=isArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/isArray.js.map b/node_modules/rxjs/internal/util/isArray.js.map
deleted file mode 100644
index 87b20b0..0000000
--- a/node_modules/rxjs/internal/util/isArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isArray.js","sources":["../../src/internal/util/isArray.ts"],"names":[],"mappings":";;AAAa,QAAA,OAAO,GAAG,CAAC,cAAM,OAAA,KAAK,CAAC,OAAO,IAAI,CAAC,UAAI,CAAM,IAAe,OAAA,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAjC,CAAiC,CAAC,EAA7E,CAA6E,CAAC,EAAE,CAAC"}
diff --git a/node_modules/rxjs/internal/util/isArrayLike.d.ts b/node_modules/rxjs/internal/util/isArrayLike.d.ts
deleted file mode 100644
index 2a0fa76..0000000
--- a/node_modules/rxjs/internal/util/isArrayLike.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare const isArrayLike: <T>(x: any) => x is ArrayLike<T>;
diff --git a/node_modules/rxjs/internal/util/isArrayLike.js b/node_modules/rxjs/internal/util/isArrayLike.js
deleted file mode 100644
index 1013f97..0000000
--- a/node_modules/rxjs/internal/util/isArrayLike.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });
-//# sourceMappingURL=isArrayLike.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/isArrayLike.js.map b/node_modules/rxjs/internal/util/isArrayLike.js.map
deleted file mode 100644
index 933e980..0000000
--- a/node_modules/rxjs/internal/util/isArrayLike.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isArrayLike.js","sources":["../../src/internal/util/isArrayLike.ts"],"names":[],"mappings":";;AAAa,QAAA,WAAW,GAAG,CAAC,UAAI,CAAM,IAAwB,OAAA,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,UAAU,EAA5D,CAA4D,CAAC,CAAC"}
diff --git a/node_modules/rxjs/internal/util/isDate.d.ts b/node_modules/rxjs/internal/util/isDate.d.ts
deleted file mode 100644
index 1cfe00f..0000000
--- a/node_modules/rxjs/internal/util/isDate.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare function isDate(value: any): value is Date;
diff --git a/node_modules/rxjs/internal/util/isDate.js b/node_modules/rxjs/internal/util/isDate.js
deleted file mode 100644
index 7c8970a..0000000
--- a/node_modules/rxjs/internal/util/isDate.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isDate(value) {
-    return value instanceof Date && !isNaN(+value);
-}
-exports.isDate = isDate;
-//# sourceMappingURL=isDate.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/isDate.js.map b/node_modules/rxjs/internal/util/isDate.js.map
deleted file mode 100644
index e7b060f..0000000
--- a/node_modules/rxjs/internal/util/isDate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isDate.js","sources":["../../src/internal/util/isDate.ts"],"names":[],"mappings":";;AAAA,SAAgB,MAAM,CAAC,KAAU;IAC/B,OAAO,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC;AAFD,wBAEC"}
diff --git a/node_modules/rxjs/internal/util/isFunction.d.ts b/node_modules/rxjs/internal/util/isFunction.d.ts
deleted file mode 100644
index 190c29e..0000000
--- a/node_modules/rxjs/internal/util/isFunction.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare function isFunction(x: any): x is Function;
diff --git a/node_modules/rxjs/internal/util/isFunction.js b/node_modules/rxjs/internal/util/isFunction.js
deleted file mode 100644
index 8868691..0000000
--- a/node_modules/rxjs/internal/util/isFunction.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isFunction(x) {
-    return typeof x === 'function';
-}
-exports.isFunction = isFunction;
-//# sourceMappingURL=isFunction.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/isFunction.js.map b/node_modules/rxjs/internal/util/isFunction.js.map
deleted file mode 100644
index a90c244..0000000
--- a/node_modules/rxjs/internal/util/isFunction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isFunction.js","sources":["../../src/internal/util/isFunction.ts"],"names":[],"mappings":";;AAAA,SAAgB,UAAU,CAAC,CAAM;IAC/B,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC;AACjC,CAAC;AAFD,gCAEC"}
diff --git a/node_modules/rxjs/internal/util/isInteropObservable.d.ts b/node_modules/rxjs/internal/util/isInteropObservable.d.ts
deleted file mode 100644
index e34e59e..0000000
--- a/node_modules/rxjs/internal/util/isInteropObservable.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { InteropObservable } from '../types';
-/** Identifies an input as being Observable (but not necessary an Rx Observable) */
-export declare function isInteropObservable(input: any): input is InteropObservable<any>;
diff --git a/node_modules/rxjs/internal/util/isInteropObservable.js b/node_modules/rxjs/internal/util/isInteropObservable.js
deleted file mode 100644
index ea65a07..0000000
--- a/node_modules/rxjs/internal/util/isInteropObservable.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var observable_1 = require("../symbol/observable");
-function isInteropObservable(input) {
-    return input && typeof input[observable_1.observable] === 'function';
-}
-exports.isInteropObservable = isInteropObservable;
-//# sourceMappingURL=isInteropObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/isInteropObservable.js.map b/node_modules/rxjs/internal/util/isInteropObservable.js.map
deleted file mode 100644
index 0a4094e..0000000
--- a/node_modules/rxjs/internal/util/isInteropObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isInteropObservable.js","sources":["../../src/internal/util/isInteropObservable.ts"],"names":[],"mappings":";;AACA,mDAAuE;AAGvE,SAAgB,mBAAmB,CAAC,KAAU;IAC5C,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC,uBAAiB,CAAC,KAAK,UAAU,CAAC;AACjE,CAAC;AAFD,kDAEC"}
diff --git a/node_modules/rxjs/internal/util/isIterable.d.ts b/node_modules/rxjs/internal/util/isIterable.d.ts
deleted file mode 100644
index 38764c3..0000000
--- a/node_modules/rxjs/internal/util/isIterable.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-/** Identifies an input as being an Iterable */
-export declare function isIterable(input: any): input is Iterable<any>;
diff --git a/node_modules/rxjs/internal/util/isIterable.js b/node_modules/rxjs/internal/util/isIterable.js
deleted file mode 100644
index afcc62f..0000000
--- a/node_modules/rxjs/internal/util/isIterable.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var iterator_1 = require("../symbol/iterator");
-function isIterable(input) {
-    return input && typeof input[iterator_1.iterator] === 'function';
-}
-exports.isIterable = isIterable;
-//# sourceMappingURL=isIterable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/isIterable.js.map b/node_modules/rxjs/internal/util/isIterable.js.map
deleted file mode 100644
index a0eb186..0000000
--- a/node_modules/rxjs/internal/util/isIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isIterable.js","sources":["../../src/internal/util/isIterable.ts"],"names":[],"mappings":";;AAAA,+CAAiE;AAGjE,SAAgB,UAAU,CAAC,KAAU;IACnC,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC,mBAAe,CAAC,KAAK,UAAU,CAAC;AAC/D,CAAC;AAFD,gCAEC"}
diff --git a/node_modules/rxjs/internal/util/isNumeric.d.ts b/node_modules/rxjs/internal/util/isNumeric.d.ts
deleted file mode 100644
index c9b173d..0000000
--- a/node_modules/rxjs/internal/util/isNumeric.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare function isNumeric(val: any): val is number | string;
diff --git a/node_modules/rxjs/internal/util/isNumeric.js b/node_modules/rxjs/internal/util/isNumeric.js
deleted file mode 100644
index 22fb0e5..0000000
--- a/node_modules/rxjs/internal/util/isNumeric.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("./isArray");
-function isNumeric(val) {
-    return !isArray_1.isArray(val) && (val - parseFloat(val) + 1) >= 0;
-}
-exports.isNumeric = isNumeric;
-//# sourceMappingURL=isNumeric.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/isNumeric.js.map b/node_modules/rxjs/internal/util/isNumeric.js.map
deleted file mode 100644
index 5ec1c26..0000000
--- a/node_modules/rxjs/internal/util/isNumeric.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isNumeric.js","sources":["../../src/internal/util/isNumeric.ts"],"names":[],"mappings":";;AAAA,qCAAoC;AAEpC,SAAgB,SAAS,CAAC,GAAQ;IAKhC,OAAO,CAAC,iBAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC;AAND,8BAMC"}
diff --git a/node_modules/rxjs/internal/util/isObject.d.ts b/node_modules/rxjs/internal/util/isObject.d.ts
deleted file mode 100644
index 124e1ad..0000000
--- a/node_modules/rxjs/internal/util/isObject.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare function isObject(x: any): x is Object;
diff --git a/node_modules/rxjs/internal/util/isObject.js b/node_modules/rxjs/internal/util/isObject.js
deleted file mode 100644
index 58fe8dd..0000000
--- a/node_modules/rxjs/internal/util/isObject.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isObject(x) {
-    return x !== null && typeof x === 'object';
-}
-exports.isObject = isObject;
-//# sourceMappingURL=isObject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/isObject.js.map b/node_modules/rxjs/internal/util/isObject.js.map
deleted file mode 100644
index acc3a6c..0000000
--- a/node_modules/rxjs/internal/util/isObject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isObject.js","sources":["../../src/internal/util/isObject.ts"],"names":[],"mappings":";;AAAA,SAAgB,QAAQ,CAAC,CAAM;IAC7B,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;AAC7C,CAAC;AAFD,4BAEC"}
diff --git a/node_modules/rxjs/internal/util/isObservable.d.ts b/node_modules/rxjs/internal/util/isObservable.d.ts
deleted file mode 100644
index d370834..0000000
--- a/node_modules/rxjs/internal/util/isObservable.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { Observable } from '../Observable';
-/**
- * Tests to see if the object is an RxJS {@link Observable}
- * @param obj the object to test
- */
-export declare function isObservable<T>(obj: any): obj is Observable<T>;
diff --git a/node_modules/rxjs/internal/util/isObservable.js b/node_modules/rxjs/internal/util/isObservable.js
deleted file mode 100644
index c4c522a..0000000
--- a/node_modules/rxjs/internal/util/isObservable.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-function isObservable(obj) {
-    return !!obj && (obj instanceof Observable_1.Observable || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));
-}
-exports.isObservable = isObservable;
-//# sourceMappingURL=isObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/isObservable.js.map b/node_modules/rxjs/internal/util/isObservable.js.map
deleted file mode 100644
index 787db5c..0000000
--- a/node_modules/rxjs/internal/util/isObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isObservable.js","sources":["../../src/internal/util/isObservable.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAO3C,SAAgB,YAAY,CAAI,GAAQ;IACtC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,YAAY,uBAAU,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC;AACzH,CAAC;AAFD,oCAEC"}
diff --git a/node_modules/rxjs/internal/util/isPromise.d.ts b/node_modules/rxjs/internal/util/isPromise.d.ts
deleted file mode 100644
index 11f1972..0000000
--- a/node_modules/rxjs/internal/util/isPromise.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * Tests to see if the object is an ES2015 (ES6) Promise
- * @see {@link https://www.ecma-international.org/ecma-262/6.0/#sec-promise-objects}
- * @param value the object to test
- */
-export declare function isPromise(value: any): value is PromiseLike<any>;
diff --git a/node_modules/rxjs/internal/util/isPromise.js b/node_modules/rxjs/internal/util/isPromise.js
deleted file mode 100644
index 916910d..0000000
--- a/node_modules/rxjs/internal/util/isPromise.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isPromise(value) {
-    return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
-}
-exports.isPromise = isPromise;
-//# sourceMappingURL=isPromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/isPromise.js.map b/node_modules/rxjs/internal/util/isPromise.js.map
deleted file mode 100644
index e5e836f..0000000
--- a/node_modules/rxjs/internal/util/isPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isPromise.js","sources":["../../src/internal/util/isPromise.ts"],"names":[],"mappings":";;AAKA,SAAgB,SAAS,CAAC,KAAU;IAClC,OAAO,CAAC,CAAC,KAAK,IAAI,OAAa,KAAM,CAAC,SAAS,KAAK,UAAU,IAAI,OAAQ,KAAa,CAAC,IAAI,KAAK,UAAU,CAAC;AAC9G,CAAC;AAFD,8BAEC"}
diff --git a/node_modules/rxjs/internal/util/isScheduler.d.ts b/node_modules/rxjs/internal/util/isScheduler.d.ts
deleted file mode 100644
index 8acc3ab..0000000
--- a/node_modules/rxjs/internal/util/isScheduler.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { SchedulerLike } from '../types';
-export declare function isScheduler(value: any): value is SchedulerLike;
diff --git a/node_modules/rxjs/internal/util/isScheduler.js b/node_modules/rxjs/internal/util/isScheduler.js
deleted file mode 100644
index 5e05a9e..0000000
--- a/node_modules/rxjs/internal/util/isScheduler.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isScheduler(value) {
-    return value && typeof value.schedule === 'function';
-}
-exports.isScheduler = isScheduler;
-//# sourceMappingURL=isScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/isScheduler.js.map b/node_modules/rxjs/internal/util/isScheduler.js.map
deleted file mode 100644
index a955773..0000000
--- a/node_modules/rxjs/internal/util/isScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isScheduler.js","sources":["../../src/internal/util/isScheduler.ts"],"names":[],"mappings":";;AAEA,SAAgB,WAAW,CAAC,KAAU;IACpC,OAAO,KAAK,IAAI,OAAa,KAAM,CAAC,QAAQ,KAAK,UAAU,CAAC;AAC9D,CAAC;AAFD,kCAEC"}
diff --git a/node_modules/rxjs/internal/util/noop.d.ts b/node_modules/rxjs/internal/util/noop.d.ts
deleted file mode 100644
index 940809c..0000000
--- a/node_modules/rxjs/internal/util/noop.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare function noop(): void;
diff --git a/node_modules/rxjs/internal/util/noop.js b/node_modules/rxjs/internal/util/noop.js
deleted file mode 100644
index 043ca7f..0000000
--- a/node_modules/rxjs/internal/util/noop.js
+++ /dev/null
@@ -1,5 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function noop() { }
-exports.noop = noop;
-//# sourceMappingURL=noop.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/noop.js.map b/node_modules/rxjs/internal/util/noop.js.map
deleted file mode 100644
index 91af752..0000000
--- a/node_modules/rxjs/internal/util/noop.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"noop.js","sources":["../../src/internal/util/noop.ts"],"names":[],"mappings":";;AACA,SAAgB,IAAI,KAAK,CAAC;AAA1B,oBAA0B"}
diff --git a/node_modules/rxjs/internal/util/not.d.ts b/node_modules/rxjs/internal/util/not.d.ts
deleted file mode 100644
index 5369220..0000000
--- a/node_modules/rxjs/internal/util/not.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare function not(pred: Function, thisArg: any): Function;
diff --git a/node_modules/rxjs/internal/util/not.js b/node_modules/rxjs/internal/util/not.js
deleted file mode 100644
index e2518ad..0000000
--- a/node_modules/rxjs/internal/util/not.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function not(pred, thisArg) {
-    function notPred() {
-        return !(notPred.pred.apply(notPred.thisArg, arguments));
-    }
-    notPred.pred = pred;
-    notPred.thisArg = thisArg;
-    return notPred;
-}
-exports.not = not;
-//# sourceMappingURL=not.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/not.js.map b/node_modules/rxjs/internal/util/not.js.map
deleted file mode 100644
index f177040..0000000
--- a/node_modules/rxjs/internal/util/not.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"not.js","sources":["../../src/internal/util/not.ts"],"names":[],"mappings":";;AAAA,SAAgB,GAAG,CAAC,IAAc,EAAE,OAAY;IAC9C,SAAS,OAAO;QACd,OAAO,CAAC,CAAQ,OAAQ,CAAC,IAAI,CAAC,KAAK,CAAQ,OAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3E,CAAC;IACM,OAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,OAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAClC,OAAO,OAAO,CAAC;AACjB,CAAC;AAPD,kBAOC"}
diff --git a/node_modules/rxjs/internal/util/pipe.d.ts b/node_modules/rxjs/internal/util/pipe.d.ts
deleted file mode 100644
index 2ec1b79..0000000
--- a/node_modules/rxjs/internal/util/pipe.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { UnaryFunction } from '../types';
-export declare function pipe<T>(): UnaryFunction<T, T>;
-export declare function pipe<T, A>(fn1: UnaryFunction<T, A>): UnaryFunction<T, A>;
-export declare function pipe<T, A, B>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>): UnaryFunction<T, B>;
-export declare function pipe<T, A, B, C>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>): UnaryFunction<T, C>;
-export declare function pipe<T, A, B, C, D>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>): UnaryFunction<T, D>;
-export declare function pipe<T, A, B, C, D, E>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>, fn5: UnaryFunction<D, E>): UnaryFunction<T, E>;
-export declare function pipe<T, A, B, C, D, E, F>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>, fn5: UnaryFunction<D, E>, fn6: UnaryFunction<E, F>): UnaryFunction<T, F>;
-export declare function pipe<T, A, B, C, D, E, F, G>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>, fn5: UnaryFunction<D, E>, fn6: UnaryFunction<E, F>, fn7: UnaryFunction<F, G>): UnaryFunction<T, G>;
-export declare function pipe<T, A, B, C, D, E, F, G, H>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>, fn5: UnaryFunction<D, E>, fn6: UnaryFunction<E, F>, fn7: UnaryFunction<F, G>, fn8: UnaryFunction<G, H>): UnaryFunction<T, H>;
-export declare function pipe<T, A, B, C, D, E, F, G, H, I>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>, fn5: UnaryFunction<D, E>, fn6: UnaryFunction<E, F>, fn7: UnaryFunction<F, G>, fn8: UnaryFunction<G, H>, fn9: UnaryFunction<H, I>): UnaryFunction<T, I>;
-export declare function pipe<T, A, B, C, D, E, F, G, H, I>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>, fn5: UnaryFunction<D, E>, fn6: UnaryFunction<E, F>, fn7: UnaryFunction<F, G>, fn8: UnaryFunction<G, H>, fn9: UnaryFunction<H, I>, ...fns: UnaryFunction<any, any>[]): UnaryFunction<T, {}>;
-/** @internal */
-export declare function pipeFromArray<T, R>(fns: Array<UnaryFunction<T, R>>): UnaryFunction<T, R>;
diff --git a/node_modules/rxjs/internal/util/pipe.js b/node_modules/rxjs/internal/util/pipe.js
deleted file mode 100644
index 5305efd..0000000
--- a/node_modules/rxjs/internal/util/pipe.js
+++ /dev/null
@@ -1,24 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var noop_1 = require("./noop");
-function pipe() {
-    var fns = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        fns[_i] = arguments[_i];
-    }
-    return pipeFromArray(fns);
-}
-exports.pipe = pipe;
-function pipeFromArray(fns) {
-    if (!fns) {
-        return noop_1.noop;
-    }
-    if (fns.length === 1) {
-        return fns[0];
-    }
-    return function piped(input) {
-        return fns.reduce(function (prev, fn) { return fn(prev); }, input);
-    };
-}
-exports.pipeFromArray = pipeFromArray;
-//# sourceMappingURL=pipe.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/pipe.js.map b/node_modules/rxjs/internal/util/pipe.js.map
deleted file mode 100644
index 1782d00..0000000
--- a/node_modules/rxjs/internal/util/pipe.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pipe.js","sources":["../../src/internal/util/pipe.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAiB9B,SAAgB,IAAI;IAAC,aAAsC;SAAtC,UAAsC,EAAtC,qBAAsC,EAAtC,IAAsC;QAAtC,wBAAsC;;IACzD,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAFD,oBAEC;AAGD,SAAgB,aAAa,CAAO,GAA+B;IACjE,IAAI,CAAC,GAAG,EAAE;QACR,OAAO,WAA+B,CAAC;KACxC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;QACpB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;KACf;IAED,OAAO,SAAS,KAAK,CAAC,KAAQ;QAC5B,OAAO,GAAG,CAAC,MAAM,CAAC,UAAC,IAAS,EAAE,EAAuB,IAAK,OAAA,EAAE,CAAC,IAAI,CAAC,EAAR,CAAQ,EAAE,KAAY,CAAC,CAAC;IACpF,CAAC,CAAC;AACJ,CAAC;AAZD,sCAYC"}
diff --git a/node_modules/rxjs/internal/util/root.d.ts b/node_modules/rxjs/internal/util/root.d.ts
deleted file mode 100644
index 7501631..0000000
--- a/node_modules/rxjs/internal/util/root.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const _root: any;
-export { _root as root };
diff --git a/node_modules/rxjs/internal/util/root.js b/node_modules/rxjs/internal/util/root.js
deleted file mode 100644
index 506861e..0000000
--- a/node_modules/rxjs/internal/util/root.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var __window = typeof window !== 'undefined' && window;
-var __self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&
-    self instanceof WorkerGlobalScope && self;
-var __global = typeof global !== 'undefined' && global;
-var _root = __window || __global || __self;
-exports.root = _root;
-(function () {
-    if (!_root) {
-        throw new Error('RxJS could not find any global context (window, self, global)');
-    }
-})();
-//# sourceMappingURL=root.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/root.js.map b/node_modules/rxjs/internal/util/root.js.map
deleted file mode 100644
index 71fca0b..0000000
--- a/node_modules/rxjs/internal/util/root.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"root.js","sources":["../../src/internal/util/root.ts"],"names":[],"mappings":";;AAeA,IAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC;AACzD,IAAM,MAAM,GAAG,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,iBAAiB,KAAK,WAAW;IAClF,IAAI,YAAY,iBAAiB,IAAI,IAAI,CAAC;AAC9C,IAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC;AACzD,IAAM,KAAK,GAAQ,QAAQ,IAAI,QAAQ,IAAI,MAAM,CAAC;AAWhC,qBAAI;AANtB,CAAC;IACC,IAAI,CAAC,KAAK,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;KAClF;AACH,CAAC,CAAC,EAAE,CAAC"}
diff --git a/node_modules/rxjs/internal/util/subscribeTo.d.ts b/node_modules/rxjs/internal/util/subscribeTo.d.ts
deleted file mode 100644
index 491b43a..0000000
--- a/node_modules/rxjs/internal/util/subscribeTo.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { ObservableInput } from '../types';
-import { Subscription } from '../Subscription';
-import { Subscriber } from '../Subscriber';
-export declare const subscribeTo: <T>(result: ObservableInput<T>) => (subscriber: Subscriber<T>) => void | Subscription;
diff --git a/node_modules/rxjs/internal/util/subscribeTo.js b/node_modules/rxjs/internal/util/subscribeTo.js
deleted file mode 100644
index b5ffb57..0000000
--- a/node_modules/rxjs/internal/util/subscribeTo.js
+++ /dev/null
@@ -1,32 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var subscribeToArray_1 = require("./subscribeToArray");
-var subscribeToPromise_1 = require("./subscribeToPromise");
-var subscribeToIterable_1 = require("./subscribeToIterable");
-var subscribeToObservable_1 = require("./subscribeToObservable");
-var isArrayLike_1 = require("./isArrayLike");
-var isPromise_1 = require("./isPromise");
-var isObject_1 = require("./isObject");
-var iterator_1 = require("../symbol/iterator");
-var observable_1 = require("../symbol/observable");
-exports.subscribeTo = function (result) {
-    if (!!result && typeof result[observable_1.observable] === 'function') {
-        return subscribeToObservable_1.subscribeToObservable(result);
-    }
-    else if (isArrayLike_1.isArrayLike(result)) {
-        return subscribeToArray_1.subscribeToArray(result);
-    }
-    else if (isPromise_1.isPromise(result)) {
-        return subscribeToPromise_1.subscribeToPromise(result);
-    }
-    else if (!!result && typeof result[iterator_1.iterator] === 'function') {
-        return subscribeToIterable_1.subscribeToIterable(result);
-    }
-    else {
-        var value = isObject_1.isObject(result) ? 'an invalid object' : "'" + result + "'";
-        var msg = "You provided " + value + " where a stream was expected."
-            + ' You can provide an Observable, Promise, Array, or Iterable.';
-        throw new TypeError(msg);
-    }
-};
-//# sourceMappingURL=subscribeTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/subscribeTo.js.map b/node_modules/rxjs/internal/util/subscribeTo.js.map
deleted file mode 100644
index 9654d86..0000000
--- a/node_modules/rxjs/internal/util/subscribeTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeTo.js","sources":["../../src/internal/util/subscribeTo.ts"],"names":[],"mappings":";;AACA,uDAAsD;AACtD,2DAA0D;AAC1D,6DAA4D;AAC5D,iEAAgE;AAChE,6CAA4C;AAC5C,yCAAwC;AACxC,uCAAsC;AACtC,+CAAiE;AACjE,mDAAuE;AAI1D,QAAA,WAAW,GAAG,UAAI,MAA0B;IACvD,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,uBAAiB,CAAC,KAAK,UAAU,EAAE;QAC/D,OAAO,6CAAqB,CAAC,MAAa,CAAC,CAAC;KAC7C;SAAM,IAAI,yBAAW,CAAC,MAAM,CAAC,EAAE;QAC9B,OAAO,mCAAgB,CAAC,MAAM,CAAC,CAAC;KACjC;SAAM,IAAI,qBAAS,CAAC,MAAM,CAAC,EAAE;QAC5B,OAAO,uCAAkB,CAAC,MAAsB,CAAC,CAAC;KACnD;SAAM,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,mBAAe,CAAC,KAAK,UAAU,EAAE;QACpE,OAAO,yCAAmB,CAAC,MAAa,CAAC,CAAC;KAC3C;SAAM;QACL,IAAM,KAAK,GAAG,mBAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAI,MAAM,MAAG,CAAC;QACrE,IAAM,GAAG,GAAG,kBAAgB,KAAK,kCAA+B;cAC5D,8DAA8D,CAAC;QACnE,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;KAC1B;AACH,CAAC,CAAC"}
diff --git a/node_modules/rxjs/internal/util/subscribeToArray.d.ts b/node_modules/rxjs/internal/util/subscribeToArray.d.ts
deleted file mode 100644
index ddc93fd..0000000
--- a/node_modules/rxjs/internal/util/subscribeToArray.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { Subscriber } from '../Subscriber';
-/**
- * Subscribes to an ArrayLike with a subscriber
- * @param array The array or array-like to subscribe to
- */
-export declare const subscribeToArray: <T>(array: ArrayLike<T>) => (subscriber: Subscriber<T>) => void;
diff --git a/node_modules/rxjs/internal/util/subscribeToArray.js b/node_modules/rxjs/internal/util/subscribeToArray.js
deleted file mode 100644
index 029c232..0000000
--- a/node_modules/rxjs/internal/util/subscribeToArray.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.subscribeToArray = function (array) { return function (subscriber) {
-    for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) {
-        subscriber.next(array[i]);
-    }
-    subscriber.complete();
-}; };
-//# sourceMappingURL=subscribeToArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/subscribeToArray.js.map b/node_modules/rxjs/internal/util/subscribeToArray.js.map
deleted file mode 100644
index 4c659e2..0000000
--- a/node_modules/rxjs/internal/util/subscribeToArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToArray.js","sources":["../../src/internal/util/subscribeToArray.ts"],"names":[],"mappings":";;AAMa,QAAA,gBAAgB,GAAG,UAAI,KAAmB,IAAK,OAAA,UAAC,UAAyB;IACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC3B;IACD,UAAU,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,EAL2D,CAK3D,CAAC"}
diff --git a/node_modules/rxjs/internal/util/subscribeToIterable.d.ts b/node_modules/rxjs/internal/util/subscribeToIterable.d.ts
deleted file mode 100644
index 948a705..0000000
--- a/node_modules/rxjs/internal/util/subscribeToIterable.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export declare const subscribeToIterable: <T>(iterable: Iterable<T>) => (subscriber: Subscriber<T>) => Subscriber<T>;
diff --git a/node_modules/rxjs/internal/util/subscribeToIterable.js b/node_modules/rxjs/internal/util/subscribeToIterable.js
deleted file mode 100644
index ba7d546..0000000
--- a/node_modules/rxjs/internal/util/subscribeToIterable.js
+++ /dev/null
@@ -1,26 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var iterator_1 = require("../symbol/iterator");
-exports.subscribeToIterable = function (iterable) { return function (subscriber) {
-    var iterator = iterable[iterator_1.iterator]();
-    do {
-        var item = iterator.next();
-        if (item.done) {
-            subscriber.complete();
-            break;
-        }
-        subscriber.next(item.value);
-        if (subscriber.closed) {
-            break;
-        }
-    } while (true);
-    if (typeof iterator.return === 'function') {
-        subscriber.add(function () {
-            if (iterator.return) {
-                iterator.return();
-            }
-        });
-    }
-    return subscriber;
-}; };
-//# sourceMappingURL=subscribeToIterable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/subscribeToIterable.js.map b/node_modules/rxjs/internal/util/subscribeToIterable.js.map
deleted file mode 100644
index 33a4490..0000000
--- a/node_modules/rxjs/internal/util/subscribeToIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToIterable.js","sources":["../../src/internal/util/subscribeToIterable.ts"],"names":[],"mappings":";;AACA,+CAAiE;AAEpD,QAAA,mBAAmB,GAAG,UAAI,QAAqB,IAAK,OAAA,UAAC,UAAyB;IACzF,IAAM,QAAQ,GAAG,QAAQ,CAAC,mBAAe,CAAC,EAAE,CAAC;IAC7C,GAAG;QACD,IAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,UAAU,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM;SACP;QACD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,UAAU,CAAC,MAAM,EAAE;YACrB,MAAM;SACP;KACF,QAAQ,IAAI,EAAE;IAGf,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE;QACzC,UAAU,CAAC,GAAG,CAAC;YACb,IAAI,QAAQ,CAAC,MAAM,EAAE;gBACnB,QAAQ,CAAC,MAAM,EAAE,CAAC;aACnB;QACH,CAAC,CAAC,CAAC;KACJ;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,EAxBgE,CAwBhE,CAAC"}
diff --git a/node_modules/rxjs/internal/util/subscribeToObservable.d.ts b/node_modules/rxjs/internal/util/subscribeToObservable.d.ts
deleted file mode 100644
index 9cbc1e3..0000000
--- a/node_modules/rxjs/internal/util/subscribeToObservable.d.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { Subscriber } from '../Subscriber';
-/**
- * Subscribes to an object that implements Symbol.observable with the given
- * Subscriber.
- * @param obj An object that implements Symbol.observable
- */
-export declare const subscribeToObservable: <T>(obj: any) => (subscriber: Subscriber<T>) => any;
diff --git a/node_modules/rxjs/internal/util/subscribeToObservable.js b/node_modules/rxjs/internal/util/subscribeToObservable.js
deleted file mode 100644
index 9fd034f..0000000
--- a/node_modules/rxjs/internal/util/subscribeToObservable.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var observable_1 = require("../symbol/observable");
-exports.subscribeToObservable = function (obj) { return function (subscriber) {
-    var obs = obj[observable_1.observable]();
-    if (typeof obs.subscribe !== 'function') {
-        throw new TypeError('Provided object does not correctly implement Symbol.observable');
-    }
-    else {
-        return obs.subscribe(subscriber);
-    }
-}; };
-//# sourceMappingURL=subscribeToObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/subscribeToObservable.js.map b/node_modules/rxjs/internal/util/subscribeToObservable.js.map
deleted file mode 100644
index 8ca42bb..0000000
--- a/node_modules/rxjs/internal/util/subscribeToObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToObservable.js","sources":["../../src/internal/util/subscribeToObservable.ts"],"names":[],"mappings":";;AACA,mDAAuE;AAO1D,QAAA,qBAAqB,GAAG,UAAI,GAAQ,IAAK,OAAA,UAAC,UAAyB;IAC9E,IAAM,GAAG,GAAG,GAAG,CAAC,uBAAiB,CAAC,EAAE,CAAC;IACrC,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,EAAE;QAEvC,MAAM,IAAI,SAAS,CAAC,gEAAgE,CAAC,CAAC;KACvF;SAAM;QACL,OAAO,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;KAClC;AACH,CAAC,EARqD,CAQrD,CAAC"}
diff --git a/node_modules/rxjs/internal/util/subscribeToPromise.d.ts b/node_modules/rxjs/internal/util/subscribeToPromise.d.ts
deleted file mode 100644
index dae7811..0000000
--- a/node_modules/rxjs/internal/util/subscribeToPromise.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { Subscriber } from '../Subscriber';
-export declare const subscribeToPromise: <T>(promise: PromiseLike<T>) => (subscriber: Subscriber<T>) => Subscriber<T>;
diff --git a/node_modules/rxjs/internal/util/subscribeToPromise.js b/node_modules/rxjs/internal/util/subscribeToPromise.js
deleted file mode 100644
index 6125789..0000000
--- a/node_modules/rxjs/internal/util/subscribeToPromise.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var hostReportError_1 = require("./hostReportError");
-exports.subscribeToPromise = function (promise) { return function (subscriber) {
-    promise.then(function (value) {
-        if (!subscriber.closed) {
-            subscriber.next(value);
-            subscriber.complete();
-        }
-    }, function (err) { return subscriber.error(err); })
-        .then(null, hostReportError_1.hostReportError);
-    return subscriber;
-}; };
-//# sourceMappingURL=subscribeToPromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/subscribeToPromise.js.map b/node_modules/rxjs/internal/util/subscribeToPromise.js.map
deleted file mode 100644
index ad8dd81..0000000
--- a/node_modules/rxjs/internal/util/subscribeToPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToPromise.js","sources":["../../src/internal/util/subscribeToPromise.ts"],"names":[],"mappings":";;AACA,qDAAoD;AAEvC,QAAA,kBAAkB,GAAG,UAAI,OAAuB,IAAK,OAAA,UAAC,UAAyB;IAC1F,OAAO,CAAC,IAAI,CACV,UAAC,KAAK;QACJ,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACtB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,UAAU,CAAC,QAAQ,EAAE,CAAC;SACvB;IACH,CAAC,EACD,UAAC,GAAQ,IAAK,OAAA,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAArB,CAAqB,CACpC;SACA,IAAI,CAAC,IAAI,EAAE,iCAAe,CAAC,CAAC;IAC7B,OAAO,UAAU,CAAC;AACpB,CAAC,EAZiE,CAYjE,CAAC"}
diff --git a/node_modules/rxjs/internal/util/subscribeToResult.d.ts b/node_modules/rxjs/internal/util/subscribeToResult.d.ts
deleted file mode 100644
index 859f416..0000000
--- a/node_modules/rxjs/internal/util/subscribeToResult.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { Subscription } from '../Subscription';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { OuterSubscriber } from '../OuterSubscriber';
-export declare function subscribeToResult<T, R>(outerSubscriber: OuterSubscriber<T, R>, result: any, outerValue: undefined, outerIndex: undefined, innerSubscriber: InnerSubscriber<T, R>): Subscription | undefined;
-export declare function subscribeToResult<T, R>(outerSubscriber: OuterSubscriber<T, R>, result: any, outerValue?: T, outerIndex?: number): Subscription | undefined;
diff --git a/node_modules/rxjs/internal/util/subscribeToResult.js b/node_modules/rxjs/internal/util/subscribeToResult.js
deleted file mode 100644
index 421ce98..0000000
--- a/node_modules/rxjs/internal/util/subscribeToResult.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeTo_1 = require("./subscribeTo");
-var Observable_1 = require("../Observable");
-function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, innerSubscriber) {
-    if (innerSubscriber === void 0) { innerSubscriber = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex); }
-    if (innerSubscriber.closed) {
-        return undefined;
-    }
-    if (result instanceof Observable_1.Observable) {
-        return result.subscribe(innerSubscriber);
-    }
-    return subscribeTo_1.subscribeTo(result)(innerSubscriber);
-}
-exports.subscribeToResult = subscribeToResult;
-//# sourceMappingURL=subscribeToResult.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/subscribeToResult.js.map b/node_modules/rxjs/internal/util/subscribeToResult.js.map
deleted file mode 100644
index 9f66d74..0000000
--- a/node_modules/rxjs/internal/util/subscribeToResult.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToResult.js","sources":["../../src/internal/util/subscribeToResult.ts"],"names":[],"mappings":";;AACA,sDAAqD;AAGrD,6CAA4C;AAC5C,4CAA2C;AAiB3C,SAAgB,iBAAiB,CAC/B,eAAsC,EACtC,MAAW,EACX,UAAc,EACd,UAAmB,EACnB,eAA6F;IAA7F,gCAAA,EAAA,sBAAqC,iCAAe,CAAC,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC;IAE7F,IAAI,eAAe,CAAC,MAAM,EAAE;QAC1B,OAAO,SAAS,CAAC;KAClB;IACD,IAAI,MAAM,YAAY,uBAAU,EAAE;QAChC,OAAO,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;KAC1C;IACD,OAAO,yBAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAiB,CAAC;AAC9D,CAAC;AAdD,8CAcC"}
diff --git a/node_modules/rxjs/internal/util/toSubscriber.d.ts b/node_modules/rxjs/internal/util/toSubscriber.d.ts
deleted file mode 100644
index 6ae2897..0000000
--- a/node_modules/rxjs/internal/util/toSubscriber.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { PartialObserver } from '../types';
-export declare function toSubscriber<T>(nextOrObserver?: PartialObserver<T> | ((value: T) => void), error?: (error: any) => void, complete?: () => void): Subscriber<T>;
diff --git a/node_modules/rxjs/internal/util/toSubscriber.js b/node_modules/rxjs/internal/util/toSubscriber.js
deleted file mode 100644
index 07fd52c..0000000
--- a/node_modules/rxjs/internal/util/toSubscriber.js
+++ /dev/null
@@ -1,21 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var rxSubscriber_1 = require("../symbol/rxSubscriber");
-var Observer_1 = require("../Observer");
-function toSubscriber(nextOrObserver, error, complete) {
-    if (nextOrObserver) {
-        if (nextOrObserver instanceof Subscriber_1.Subscriber) {
-            return nextOrObserver;
-        }
-        if (nextOrObserver[rxSubscriber_1.rxSubscriber]) {
-            return nextOrObserver[rxSubscriber_1.rxSubscriber]();
-        }
-    }
-    if (!nextOrObserver && !error && !complete) {
-        return new Subscriber_1.Subscriber(Observer_1.empty);
-    }
-    return new Subscriber_1.Subscriber(nextOrObserver, error, complete);
-}
-exports.toSubscriber = toSubscriber;
-//# sourceMappingURL=toSubscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/toSubscriber.js.map b/node_modules/rxjs/internal/util/toSubscriber.js.map
deleted file mode 100644
index 7e9793a..0000000
--- a/node_modules/rxjs/internal/util/toSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"toSubscriber.js","sources":["../../src/internal/util/toSubscriber.ts"],"names":[],"mappings":";;AAAA,4CAA2C;AAC3C,uDAA4E;AAC5E,wCAAqD;AAGrD,SAAgB,YAAY,CAC1B,cAA0D,EAC1D,KAA4B,EAC5B,QAAqB;IAErB,IAAI,cAAc,EAAE;QAClB,IAAI,cAAc,YAAY,uBAAU,EAAE;YACxC,OAAwB,cAAe,CAAC;SACzC;QAED,IAAI,cAAc,CAAC,2BAAkB,CAAC,EAAE;YACtC,OAAO,cAAc,CAAC,2BAAkB,CAAC,EAAE,CAAC;SAC7C;KACF;IAED,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE;QAC1C,OAAO,IAAI,uBAAU,CAAC,gBAAa,CAAC,CAAC;KACtC;IAED,OAAO,IAAI,uBAAU,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC;AApBD,oCAoBC"}
diff --git a/node_modules/rxjs/internal/util/tryCatch.d.ts b/node_modules/rxjs/internal/util/tryCatch.d.ts
deleted file mode 100644
index e241e6e..0000000
--- a/node_modules/rxjs/internal/util/tryCatch.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export declare function tryCatch<T extends Function>(fn: T): T;
diff --git a/node_modules/rxjs/internal/util/tryCatch.js b/node_modules/rxjs/internal/util/tryCatch.js
deleted file mode 100644
index 42f2191..0000000
--- a/node_modules/rxjs/internal/util/tryCatch.js
+++ /dev/null
@@ -1,23 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var errorObject_1 = require("./errorObject");
-var tryCatchTarget;
-function tryCatcher() {
-    errorObject_1.errorObject.e = undefined;
-    try {
-        return tryCatchTarget.apply(this, arguments);
-    }
-    catch (e) {
-        errorObject_1.errorObject.e = e;
-        return errorObject_1.errorObject;
-    }
-    finally {
-        tryCatchTarget = undefined;
-    }
-}
-function tryCatch(fn) {
-    tryCatchTarget = fn;
-    return tryCatcher;
-}
-exports.tryCatch = tryCatch;
-//# sourceMappingURL=tryCatch.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/internal/util/tryCatch.js.map b/node_modules/rxjs/internal/util/tryCatch.js.map
deleted file mode 100644
index 4f5ccde..0000000
--- a/node_modules/rxjs/internal/util/tryCatch.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"tryCatch.js","sources":["../../src/internal/util/tryCatch.ts"],"names":[],"mappings":";;AAAA,6CAA4C;AAE5C,IAAI,cAAwB,CAAC;AAE7B,SAAS,UAAU;IACjB,yBAAW,CAAC,CAAC,GAAG,SAAS,CAAC;IAC1B,IAAI;QACF,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;KAC9C;IAAC,OAAO,CAAC,EAAE;QACV,yBAAW,CAAC,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,yBAAW,CAAC;KACpB;YAAS;QACR,cAAc,GAAG,SAAS,CAAC;KAC5B;AACH,CAAC;AAED,SAAgB,QAAQ,CAAqB,EAAK;IAChD,cAAc,GAAG,EAAE,CAAC;IACpB,OAAY,UAAU,CAAC;AACzB,CAAC;AAHD,4BAGC"}
diff --git a/node_modules/rxjs/migrations/collection.json b/node_modules/rxjs/migrations/collection.json
deleted file mode 100644
index 7eb1124..0000000
--- a/node_modules/rxjs/migrations/collection.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "schematics": {
-    "rxjs-migration-01": {
-      "description": "Adds rxjs-compat package to the project to ensure compatability with RxJS 5",
-      "version": "6.0.0-rc.0",
-      "factory": "./update-6_0_0/index#rxjsV6MigrationSchematic"
-    }
-  }
-}
diff --git a/node_modules/rxjs/migrations/update-6_0_0/index.js b/node_modules/rxjs/migrations/update-6_0_0/index.js
deleted file mode 100644
index acf57b5..0000000
--- a/node_modules/rxjs/migrations/update-6_0_0/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var schematics_1 = require("@angular-devkit/schematics");
-var tasks_1 = require("@angular-devkit/schematics/tasks");
-var rxjsCompatVersion = '^6.0.0-rc.0';
-function rxjsV6MigrationSchematic(_options) {
-    return function (tree, context) {
-        var pkgPath = '/package.json';
-        var buffer = tree.read(pkgPath);
-        if (buffer == null) {
-            throw new schematics_1.SchematicsException('Could not read package.json');
-        }
-        var content = buffer.toString();
-        var pkg = JSON.parse(content);
-        if (pkg === null || typeof pkg !== 'object' || Array.isArray(pkg)) {
-            throw new schematics_1.SchematicsException('Error reading package.json');
-        }
-        if (!pkg.dependencies) {
-            pkg.dependencies = {};
-        }
-        pkg.dependencies['rxjs-compat'] = rxjsCompatVersion;
-        tree.overwrite(pkgPath, JSON.stringify(pkg, null, 2));
-        context.addTask(new tasks_1.NodePackageInstallTask());
-        return tree;
-    };
-}
-exports.rxjsV6MigrationSchematic = rxjsV6MigrationSchematic;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/migrations/update-6_0_0/index.js.map b/node_modules/rxjs/migrations/update-6_0_0/index.js.map
deleted file mode 100644
index 50d6d87..0000000
--- a/node_modules/rxjs/migrations/update-6_0_0/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../migrations/update-6_0_0/index.ts"],"names":[],"mappings":";;AAAA,yDAAwG;AACxG,0DAA0E;AAE1E,IAAM,iBAAiB,GAAG,aAAa,CAAC;AAExC,SAAgB,wBAAwB,CAAC,QAAa;IACpD,OAAO,UAAC,IAAU,EAAE,OAAyB;QACzC,IAAM,OAAO,GAAG,eAAe,CAAC;QAChC,IAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,MAAM,IAAI,IAAI,EAAE;YAClB,MAAM,IAAI,gCAAmB,CAAC,6BAA6B,CAAC,CAAC;SAC9D;QACD,IAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEhC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACjE,MAAM,IAAI,gCAAmB,CAAC,4BAA4B,CAAC,CAAC;SAC7D;QAED,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACrB,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC;SACvB;QAED,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,iBAAiB,CAAC;QAEpD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,OAAO,CAAC,IAAI,8BAAsB,EAAE,CAAC,CAAC;QAE9C,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAzBD,4DAyBC"}
\ No newline at end of file
diff --git a/node_modules/rxjs/node_modules/tslib/CopyrightNotice.txt b/node_modules/rxjs/node_modules/tslib/CopyrightNotice.txt
deleted file mode 100644
index 0f6db1f..0000000
--- a/node_modules/rxjs/node_modules/tslib/CopyrightNotice.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved. 
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0  
- 
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, 
-MERCHANTABLITY OR NON-INFRINGEMENT. 
- 
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-
diff --git a/node_modules/rxjs/node_modules/tslib/LICENSE.txt b/node_modules/rxjs/node_modules/tslib/LICENSE.txt
deleted file mode 100644
index 8746124..0000000
--- a/node_modules/rxjs/node_modules/tslib/LICENSE.txt
+++ /dev/null
@@ -1,55 +0,0 @@
-Apache License
-
-Version 2.0, January 2004
-
-http://www.apache.org/licenses/ 
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
-
-"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
-
-You must give any other recipients of the Work or Derivative Works a copy of this License; and
-
-You must cause any modified files to carry prominent notices stating that You changed the files; and
-
-You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
-
-If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
diff --git a/node_modules/rxjs/node_modules/tslib/README.md b/node_modules/rxjs/node_modules/tslib/README.md
deleted file mode 100644
index a6b55e7..0000000
--- a/node_modules/rxjs/node_modules/tslib/README.md
+++ /dev/null
@@ -1,144 +0,0 @@
-# tslib
-
-This is a runtime library for [TypeScript](http://www.typescriptlang.org/) that contains all of the TypeScript helper functions.
-
-This library is primarily used by the `--importHelpers` flag in TypeScript.
-When using `--importHelpers`, a module that uses helper functions like `__extends` and `__assign` in the following emitted file:
-
-```ts
-var __assign = (this && this.__assign) || Object.assign || function(t) {
-    for (var s, i = 1, n = arguments.length; i < n; i++) {
-        s = arguments[i];
-        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
-            t[p] = s[p];
-    }
-    return t;
-};
-exports.x = {};
-exports.y = __assign({}, exports.x);
-
-```
-
-will instead be emitted as something like the following:
-
-```ts
-var tslib_1 = require("tslib");
-exports.x = {};
-exports.y = tslib_1.__assign({}, exports.x);
-```
-
-Because this can avoid duplicate declarations of things like `__extends`, `__assign`, etc., this means delivering users smaller files on average, as well as less runtime overhead.
-For optimized bundles with TypeScript, you should absolutely consider using `tslib` and `--importHelpers`.
-
-# Installing
-
-For the latest stable version, run:
-
-## npm
-
-```sh
-# TypeScript 2.3.3 or later
-npm install --save tslib
-
-# TypeScript 2.3.2 or earlier
-npm install --save tslib@1.6.1
-```
-
-## yarn
-
-```sh
-# TypeScript 2.3.3 or later
-yarn add tslib
-
-# TypeScript 2.3.2 or earlier
-yarn add tslib@1.6.1
-```
-
-## bower
-
-```sh
-# TypeScript 2.3.3 or later
-bower install tslib
-
-# TypeScript 2.3.2 or earlier
-bower install tslib@1.6.1
-```
-
-## JSPM
-
-```sh
-# TypeScript 2.3.3 or later
-jspm install tslib
-
-# TypeScript 2.3.2 or earlier
-jspm install tslib@1.6.1
-```
-
-# Usage
-
-Set the `importHelpers` compiler option on the command line:
-
-```
-tsc --importHelpers file.ts
-```
-
-or in your tsconfig.json:
-
-```json
-{
-    "compilerOptions": {
-        "importHelpers": true
-    }
-}
-```
-
-#### For bower and JSPM users
-
-You will need to add a `paths` mapping for `tslib`, e.g. For Bower users:
-
-```json
-{
-    "compilerOptions": {
-        "module": "amd",
-        "importHelpers": true,
-        "baseUrl": "./",
-        "paths": {
-            "tslib" : ["bower_components/tslib/tslib.d.ts"]
-        }
-    }
-}
-```
-
-For JSPM users:
-
-```json
-{
-    "compilerOptions": {
-        "module": "system",
-        "importHelpers": true,
-        "baseUrl": "./",
-        "paths": {
-            "tslib" : ["jspm_packages/npm/tslib@1.11.1/tslib.d.ts"]
-        }
-    }
-}
-```
-
-
-# Contribute
-
-There are many ways to [contribute](https://github.com/Microsoft/TypeScript/blob/master/CONTRIBUTING.md) to TypeScript.
-
-* [Submit bugs](https://github.com/Microsoft/TypeScript/issues) and help us verify fixes as they are checked in.
-* Review the [source code changes](https://github.com/Microsoft/TypeScript/pulls).
-* Engage with other TypeScript users and developers on [StackOverflow](http://stackoverflow.com/questions/tagged/typescript).
-* Join the [#typescript](http://twitter.com/#!/search/realtime/%23typescript) discussion on Twitter.
-* [Contribute bug fixes](https://github.com/Microsoft/TypeScript/blob/master/CONTRIBUTING.md).
-* Read the language specification ([docx](http://go.microsoft.com/fwlink/?LinkId=267121), [pdf](http://go.microsoft.com/fwlink/?LinkId=267238)).
-
-# Documentation
-
-* [Quick tutorial](http://www.typescriptlang.org/Tutorial)
-* [Programming handbook](http://www.typescriptlang.org/Handbook)
-* [Language specification](https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md)
-* [Homepage](http://www.typescriptlang.org/)
diff --git a/node_modules/rxjs/node_modules/tslib/package.json b/node_modules/rxjs/node_modules/tslib/package.json
deleted file mode 100644
index 7d3b98c..0000000
--- a/node_modules/rxjs/node_modules/tslib/package.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-    "name": "tslib",
-    "author": "Microsoft Corp.",
-    "homepage": "https://www.typescriptlang.org/",
-    "version": "1.11.1",
-    "license": "Apache-2.0",
-    "description": "Runtime library for TypeScript helper functions",
-    "keywords": [
-        "TypeScript",
-        "Microsoft",
-        "compiler",
-        "language",
-        "javascript",
-        "tslib",
-        "runtime"
-    ],
-    "bugs": {
-        "url": "https://github.com/Microsoft/TypeScript/issues"
-    },
-    "repository": {
-        "type": "git",
-        "url": "https://github.com/Microsoft/tslib.git"
-    },
-    "main": "tslib.js",
-    "module": "tslib.es6.js",
-    "jsnext:main": "tslib.es6.js",
-    "typings": "tslib.d.ts",
-    "sideEffects": false
-}
diff --git a/node_modules/rxjs/node_modules/tslib/tslib.d.ts b/node_modules/rxjs/node_modules/tslib/tslib.d.ts
deleted file mode 100644
index fbfded6..0000000
--- a/node_modules/rxjs/node_modules/tslib/tslib.d.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-export declare function __extends(d: Function, b: Function): void;
-export declare function __assign(t: any, ...sources: any[]): any;
-export declare function __rest(t: any, propertyNames: (string | symbol)[]): any;
-export declare function __decorate(decorators: Function[], target: any, key?: string | symbol, desc?: any): any;
-export declare function __param(paramIndex: number, decorator: Function): Function;
-export declare function __metadata(metadataKey: any, metadataValue: any): Function;
-export declare function __awaiter(thisArg: any, _arguments: any, P: Function, generator: Function): any;
-export declare function __generator(thisArg: any, body: Function): any;
-export declare function __exportStar(m: any, exports: any): void;
-export declare function __values(o: any): any;
-export declare function __read(o: any, n?: number): any[];
-export declare function __spread(...args: any[][]): any[];
-export declare function __spreadArrays(...args: any[][]): any[];
-export declare function __await(v: any): any;
-export declare function __asyncGenerator(thisArg: any, _arguments: any, generator: Function): any;
-export declare function __asyncDelegator(o: any): any;
-export declare function __asyncValues(o: any): any;
-export declare function __makeTemplateObject(cooked: string[], raw: string[]): TemplateStringsArray;
-export declare function __importStar<T>(mod: T): T;
-export declare function __importDefault<T>(mod: T): T | { default: T };
-export declare function __classPrivateFieldGet<T extends object, V>(receiver: T, privateMap: { has(o: T): boolean, get(o: T): V | undefined }): V;
-export declare function __classPrivateFieldSet<T extends object, V>(receiver: T, privateMap: { has(o: T): boolean, set(o: T, value: V): any }, value: V): V;
diff --git a/node_modules/rxjs/node_modules/tslib/tslib.es6.html b/node_modules/rxjs/node_modules/tslib/tslib.es6.html
deleted file mode 100644
index b122e41..0000000
--- a/node_modules/rxjs/node_modules/tslib/tslib.es6.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="tslib.es6.js"></script>
\ No newline at end of file
diff --git a/node_modules/rxjs/node_modules/tslib/tslib.es6.js b/node_modules/rxjs/node_modules/tslib/tslib.es6.js
deleted file mode 100644
index 4d84182..0000000
--- a/node_modules/rxjs/node_modules/tslib/tslib.es6.js
+++ /dev/null
@@ -1,213 +0,0 @@
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-export function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-export var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    }
-    return __assign.apply(this, arguments);
-}
-
-export function __rest(s, e) {
-    var t = {};
-    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
-        t[p] = s[p];
-    if (s != null && typeof Object.getOwnPropertySymbols === "function")
-        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
-            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
-                t[p[i]] = s[p[i]];
-        }
-    return t;
-}
-
-export function __decorate(decorators, target, key, desc) {
-    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
-    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
-    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
-    return c > 3 && r && Object.defineProperty(target, key, r), r;
-}
-
-export function __param(paramIndex, decorator) {
-    return function (target, key) { decorator(target, key, paramIndex); }
-}
-
-export function __metadata(metadataKey, metadataValue) {
-    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
-}
-
-export function __awaiter(thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-}
-
-export function __generator(thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (_) try {
-            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [op[0] & 2, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-}
-
-export function __exportStar(m, exports) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-
-export function __values(o) {
-    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
-    if (m) return m.call(o);
-    if (o && typeof o.length === "number") return {
-        next: function () {
-            if (o && i >= o.length) o = void 0;
-            return { value: o && o[i++], done: !o };
-        }
-    };
-    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
-}
-
-export function __read(o, n) {
-    var m = typeof Symbol === "function" && o[Symbol.iterator];
-    if (!m) return o;
-    var i = m.call(o), r, ar = [], e;
-    try {
-        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
-    }
-    catch (error) { e = { error: error }; }
-    finally {
-        try {
-            if (r && !r.done && (m = i["return"])) m.call(i);
-        }
-        finally { if (e) throw e.error; }
-    }
-    return ar;
-}
-
-export function __spread() {
-    for (var ar = [], i = 0; i < arguments.length; i++)
-        ar = ar.concat(__read(arguments[i]));
-    return ar;
-}
-
-export function __spreadArrays() {
-    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
-    for (var r = Array(s), k = 0, i = 0; i < il; i++)
-        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
-            r[k] = a[j];
-    return r;
-};
-
-export function __await(v) {
-    return this instanceof __await ? (this.v = v, this) : new __await(v);
-}
-
-export function __asyncGenerator(thisArg, _arguments, generator) {
-    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
-    var g = generator.apply(thisArg, _arguments || []), i, q = [];
-    return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
-    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
-    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
-    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
-    function fulfill(value) { resume("next", value); }
-    function reject(value) { resume("throw", value); }
-    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
-}
-
-export function __asyncDelegator(o) {
-    var i, p;
-    return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
-    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
-}
-
-export function __asyncValues(o) {
-    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
-    var m = o[Symbol.asyncIterator], i;
-    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
-    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
-    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
-}
-
-export function __makeTemplateObject(cooked, raw) {
-    if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
-    return cooked;
-};
-
-export function __importStar(mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-    result.default = mod;
-    return result;
-}
-
-export function __importDefault(mod) {
-    return (mod && mod.__esModule) ? mod : { default: mod };
-}
-
-export function __classPrivateFieldGet(receiver, privateMap) {
-    if (!privateMap.has(receiver)) {
-        throw new TypeError("attempted to get private field on non-instance");
-    }
-    return privateMap.get(receiver);
-}
-
-export function __classPrivateFieldSet(receiver, privateMap, value) {
-    if (!privateMap.has(receiver)) {
-        throw new TypeError("attempted to set private field on non-instance");
-    }
-    privateMap.set(receiver, value);
-    return value;
-}
diff --git a/node_modules/rxjs/node_modules/tslib/tslib.html b/node_modules/rxjs/node_modules/tslib/tslib.html
deleted file mode 100644
index 44c9ba5..0000000
--- a/node_modules/rxjs/node_modules/tslib/tslib.html
+++ /dev/null
@@ -1 +0,0 @@
-<script src="tslib.js"></script>
\ No newline at end of file
diff --git a/node_modules/rxjs/node_modules/tslib/tslib.js b/node_modules/rxjs/node_modules/tslib/tslib.js
deleted file mode 100644
index 459b59e..0000000
--- a/node_modules/rxjs/node_modules/tslib/tslib.js
+++ /dev/null
@@ -1,276 +0,0 @@
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global global, define, System, Reflect, Promise */
-var __extends;
-var __assign;
-var __rest;
-var __decorate;
-var __param;
-var __metadata;
-var __awaiter;
-var __generator;
-var __exportStar;
-var __values;
-var __read;
-var __spread;
-var __spreadArrays;
-var __await;
-var __asyncGenerator;
-var __asyncDelegator;
-var __asyncValues;
-var __makeTemplateObject;
-var __importStar;
-var __importDefault;
-var __classPrivateFieldGet;
-var __classPrivateFieldSet;
-(function (factory) {
-    var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {};
-    if (typeof define === "function" && define.amd) {
-        define("tslib", ["exports"], function (exports) { factory(createExporter(root, createExporter(exports))); });
-    }
-    else if (typeof module === "object" && typeof module.exports === "object") {
-        factory(createExporter(root, createExporter(module.exports)));
-    }
-    else {
-        factory(createExporter(root));
-    }
-    function createExporter(exports, previous) {
-        if (exports !== root) {
-            if (typeof Object.create === "function") {
-                Object.defineProperty(exports, "__esModule", { value: true });
-            }
-            else {
-                exports.__esModule = true;
-            }
-        }
-        return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };
-    }
-})
-(function (exporter) {
-    var extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-
-    __extends = function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-
-    __assign = Object.assign || function (t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-
-    __rest = function (s, e) {
-        var t = {};
-        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
-            t[p] = s[p];
-        if (s != null && typeof Object.getOwnPropertySymbols === "function")
-            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
-                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
-                    t[p[i]] = s[p[i]];
-            }
-        return t;
-    };
-
-    __decorate = function (decorators, target, key, desc) {
-        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
-        if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
-        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
-        return c > 3 && r && Object.defineProperty(target, key, r), r;
-    };
-
-    __param = function (paramIndex, decorator) {
-        return function (target, key) { decorator(target, key, paramIndex); }
-    };
-
-    __metadata = function (metadataKey, metadataValue) {
-        if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
-    };
-
-    __awaiter = function (thisArg, _arguments, P, generator) {
-        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-        return new (P || (P = Promise))(function (resolve, reject) {
-            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-            function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-            step((generator = generator.apply(thisArg, _arguments || [])).next());
-        });
-    };
-
-    __generator = function (thisArg, body) {
-        var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-        return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-        function verb(n) { return function (v) { return step([n, v]); }; }
-        function step(op) {
-            if (f) throw new TypeError("Generator is already executing.");
-            while (_) try {
-                if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
-                if (y = 0, t) op = [op[0] & 2, t.value];
-                switch (op[0]) {
-                    case 0: case 1: t = op; break;
-                    case 4: _.label++; return { value: op[1], done: false };
-                    case 5: _.label++; y = op[1]; op = [0]; continue;
-                    case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                    default:
-                        if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                        if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                        if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                        if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                        if (t[2]) _.ops.pop();
-                        _.trys.pop(); continue;
-                }
-                op = body.call(thisArg, _);
-            } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-            if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-        }
-    };
-
-    __exportStar = function (m, exports) {
-        for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-    };
-
-    __values = function (o) {
-        var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
-        if (m) return m.call(o);
-        if (o && typeof o.length === "number") return {
-            next: function () {
-                if (o && i >= o.length) o = void 0;
-                return { value: o && o[i++], done: !o };
-            }
-        };
-        throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
-    };
-
-    __read = function (o, n) {
-        var m = typeof Symbol === "function" && o[Symbol.iterator];
-        if (!m) return o;
-        var i = m.call(o), r, ar = [], e;
-        try {
-            while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
-        }
-        catch (error) { e = { error: error }; }
-        finally {
-            try {
-                if (r && !r.done && (m = i["return"])) m.call(i);
-            }
-            finally { if (e) throw e.error; }
-        }
-        return ar;
-    };
-
-    __spread = function () {
-        for (var ar = [], i = 0; i < arguments.length; i++)
-            ar = ar.concat(__read(arguments[i]));
-        return ar;
-    };
-
-    __spreadArrays = function () {
-        for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
-        for (var r = Array(s), k = 0, i = 0; i < il; i++)
-            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
-                r[k] = a[j];
-        return r;
-    };
-
-    __await = function (v) {
-        return this instanceof __await ? (this.v = v, this) : new __await(v);
-    };
-
-    __asyncGenerator = function (thisArg, _arguments, generator) {
-        if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
-        var g = generator.apply(thisArg, _arguments || []), i, q = [];
-        return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
-        function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
-        function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
-        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);  }
-        function fulfill(value) { resume("next", value); }
-        function reject(value) { resume("throw", value); }
-        function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
-    };
-
-    __asyncDelegator = function (o) {
-        var i, p;
-        return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
-        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
-    };
-
-    __asyncValues = function (o) {
-        if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
-        var m = o[Symbol.asyncIterator], i;
-        return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
-        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
-        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
-    };
-
-    __makeTemplateObject = function (cooked, raw) {
-        if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
-        return cooked;
-    };
-
-    __importStar = function (mod) {
-        if (mod && mod.__esModule) return mod;
-        var result = {};
-        if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
-        result["default"] = mod;
-        return result;
-    };
-
-    __importDefault = function (mod) {
-        return (mod && mod.__esModule) ? mod : { "default": mod };
-    };
-
-    __classPrivateFieldGet = function (receiver, privateMap) {
-        if (!privateMap.has(receiver)) {
-            throw new TypeError("attempted to get private field on non-instance");
-        }
-        return privateMap.get(receiver);
-    };
-
-    __classPrivateFieldSet = function (receiver, privateMap, value) {
-        if (!privateMap.has(receiver)) {
-            throw new TypeError("attempted to set private field on non-instance");
-        }
-        privateMap.set(receiver, value);
-        return value;
-    }
-
-    exporter("__extends", __extends);
-    exporter("__assign", __assign);
-    exporter("__rest", __rest);
-    exporter("__decorate", __decorate);
-    exporter("__param", __param);
-    exporter("__metadata", __metadata);
-    exporter("__awaiter", __awaiter);
-    exporter("__generator", __generator);
-    exporter("__exportStar", __exportStar);
-    exporter("__values", __values);
-    exporter("__read", __read);
-    exporter("__spread", __spread);
-    exporter("__spreadArrays", __spreadArrays);
-    exporter("__await", __await);
-    exporter("__asyncGenerator", __asyncGenerator);
-    exporter("__asyncDelegator", __asyncDelegator);
-    exporter("__asyncValues", __asyncValues);
-    exporter("__makeTemplateObject", __makeTemplateObject);
-    exporter("__importStar", __importStar);
-    exporter("__importDefault", __importDefault);
-    exporter("__classPrivateFieldGet", __classPrivateFieldGet);
-    exporter("__classPrivateFieldSet", __classPrivateFieldSet);
-});
diff --git a/node_modules/rxjs/observable/ArrayLikeObservable.d.ts b/node_modules/rxjs/observable/ArrayLikeObservable.d.ts
deleted file mode 100644
index 30da288..0000000
--- a/node_modules/rxjs/observable/ArrayLikeObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/ArrayLikeObservable';
diff --git a/node_modules/rxjs/observable/ArrayLikeObservable.js b/node_modules/rxjs/observable/ArrayLikeObservable.js
deleted file mode 100644
index b280ef6..0000000
--- a/node_modules/rxjs/observable/ArrayLikeObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/ArrayLikeObservable"));
-//# sourceMappingURL=ArrayLikeObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/ArrayLikeObservable.js.map b/node_modules/rxjs/observable/ArrayLikeObservable.js.map
deleted file mode 100644
index 4012874..0000000
--- a/node_modules/rxjs/observable/ArrayLikeObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ArrayLikeObservable.js","sources":["../src/observable/ArrayLikeObservable.ts"],"names":[],"mappings":";;;;;AAAA,gEAA2D"}
diff --git a/node_modules/rxjs/observable/ArrayObservable.d.ts b/node_modules/rxjs/observable/ArrayObservable.d.ts
deleted file mode 100644
index ce2da26..0000000
--- a/node_modules/rxjs/observable/ArrayObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/ArrayObservable';
diff --git a/node_modules/rxjs/observable/ArrayObservable.js b/node_modules/rxjs/observable/ArrayObservable.js
deleted file mode 100644
index 7b3b628..0000000
--- a/node_modules/rxjs/observable/ArrayObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/ArrayObservable"));
-//# sourceMappingURL=ArrayObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/ArrayObservable.js.map b/node_modules/rxjs/observable/ArrayObservable.js.map
deleted file mode 100644
index 5ba74a5..0000000
--- a/node_modules/rxjs/observable/ArrayObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ArrayObservable.js","sources":["../src/observable/ArrayObservable.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuD"}
diff --git a/node_modules/rxjs/observable/BoundCallbackObservable.d.ts b/node_modules/rxjs/observable/BoundCallbackObservable.d.ts
deleted file mode 100644
index 1790306..0000000
--- a/node_modules/rxjs/observable/BoundCallbackObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/BoundCallbackObservable';
diff --git a/node_modules/rxjs/observable/BoundCallbackObservable.js b/node_modules/rxjs/observable/BoundCallbackObservable.js
deleted file mode 100644
index e68ac03..0000000
--- a/node_modules/rxjs/observable/BoundCallbackObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/BoundCallbackObservable"));
-//# sourceMappingURL=BoundCallbackObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/BoundCallbackObservable.js.map b/node_modules/rxjs/observable/BoundCallbackObservable.js.map
deleted file mode 100644
index 46f11d4..0000000
--- a/node_modules/rxjs/observable/BoundCallbackObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"BoundCallbackObservable.js","sources":["../src/observable/BoundCallbackObservable.ts"],"names":[],"mappings":";;;;;AAAA,oEAA+D"}
diff --git a/node_modules/rxjs/observable/BoundNodeCallbackObservable.d.ts b/node_modules/rxjs/observable/BoundNodeCallbackObservable.d.ts
deleted file mode 100644
index 7d0eb03..0000000
--- a/node_modules/rxjs/observable/BoundNodeCallbackObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/BoundNodeCallbackObservable';
diff --git a/node_modules/rxjs/observable/BoundNodeCallbackObservable.js b/node_modules/rxjs/observable/BoundNodeCallbackObservable.js
deleted file mode 100644
index f6efca6..0000000
--- a/node_modules/rxjs/observable/BoundNodeCallbackObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/BoundNodeCallbackObservable"));
-//# sourceMappingURL=BoundNodeCallbackObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/BoundNodeCallbackObservable.js.map b/node_modules/rxjs/observable/BoundNodeCallbackObservable.js.map
deleted file mode 100644
index 44975e5..0000000
--- a/node_modules/rxjs/observable/BoundNodeCallbackObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"BoundNodeCallbackObservable.js","sources":["../src/observable/BoundNodeCallbackObservable.ts"],"names":[],"mappings":";;;;;AAAA,wEAAmE"}
diff --git a/node_modules/rxjs/observable/ConnectableObservable.d.ts b/node_modules/rxjs/observable/ConnectableObservable.d.ts
deleted file mode 100644
index a21b3cc..0000000
--- a/node_modules/rxjs/observable/ConnectableObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/ConnectableObservable';
diff --git a/node_modules/rxjs/observable/ConnectableObservable.js b/node_modules/rxjs/observable/ConnectableObservable.js
deleted file mode 100644
index a90ea58..0000000
--- a/node_modules/rxjs/observable/ConnectableObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/ConnectableObservable"));
-//# sourceMappingURL=ConnectableObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/ConnectableObservable.js.map b/node_modules/rxjs/observable/ConnectableObservable.js.map
deleted file mode 100644
index 04ca51d..0000000
--- a/node_modules/rxjs/observable/ConnectableObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ConnectableObservable.js","sources":["../src/observable/ConnectableObservable.ts"],"names":[],"mappings":";;;;;AAAA,kEAA6D"}
diff --git a/node_modules/rxjs/observable/DeferObservable.d.ts b/node_modules/rxjs/observable/DeferObservable.d.ts
deleted file mode 100644
index cec9147..0000000
--- a/node_modules/rxjs/observable/DeferObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/DeferObservable';
diff --git a/node_modules/rxjs/observable/DeferObservable.js b/node_modules/rxjs/observable/DeferObservable.js
deleted file mode 100644
index e03517f..0000000
--- a/node_modules/rxjs/observable/DeferObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/DeferObservable"));
-//# sourceMappingURL=DeferObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/DeferObservable.js.map b/node_modules/rxjs/observable/DeferObservable.js.map
deleted file mode 100644
index 7b92c50..0000000
--- a/node_modules/rxjs/observable/DeferObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"DeferObservable.js","sources":["../src/observable/DeferObservable.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuD"}
diff --git a/node_modules/rxjs/observable/EmptyObservable.d.ts b/node_modules/rxjs/observable/EmptyObservable.d.ts
deleted file mode 100644
index 6f9f0ba..0000000
--- a/node_modules/rxjs/observable/EmptyObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/EmptyObservable';
diff --git a/node_modules/rxjs/observable/EmptyObservable.js b/node_modules/rxjs/observable/EmptyObservable.js
deleted file mode 100644
index 309ce0c..0000000
--- a/node_modules/rxjs/observable/EmptyObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/EmptyObservable"));
-//# sourceMappingURL=EmptyObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/EmptyObservable.js.map b/node_modules/rxjs/observable/EmptyObservable.js.map
deleted file mode 100644
index 7d46670..0000000
--- a/node_modules/rxjs/observable/EmptyObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"EmptyObservable.js","sources":["../src/observable/EmptyObservable.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuD"}
diff --git a/node_modules/rxjs/observable/ErrorObservable.d.ts b/node_modules/rxjs/observable/ErrorObservable.d.ts
deleted file mode 100644
index 68a7dce..0000000
--- a/node_modules/rxjs/observable/ErrorObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/ErrorObservable';
diff --git a/node_modules/rxjs/observable/ErrorObservable.js b/node_modules/rxjs/observable/ErrorObservable.js
deleted file mode 100644
index 1943818..0000000
--- a/node_modules/rxjs/observable/ErrorObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/ErrorObservable"));
-//# sourceMappingURL=ErrorObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/ErrorObservable.js.map b/node_modules/rxjs/observable/ErrorObservable.js.map
deleted file mode 100644
index d263732..0000000
--- a/node_modules/rxjs/observable/ErrorObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ErrorObservable.js","sources":["../src/observable/ErrorObservable.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuD"}
diff --git a/node_modules/rxjs/observable/ForkJoinObservable.d.ts b/node_modules/rxjs/observable/ForkJoinObservable.d.ts
deleted file mode 100644
index c9fa4dd..0000000
--- a/node_modules/rxjs/observable/ForkJoinObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/ForkJoinObservable';
diff --git a/node_modules/rxjs/observable/ForkJoinObservable.js b/node_modules/rxjs/observable/ForkJoinObservable.js
deleted file mode 100644
index e7962f5..0000000
--- a/node_modules/rxjs/observable/ForkJoinObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/ForkJoinObservable"));
-//# sourceMappingURL=ForkJoinObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/ForkJoinObservable.js.map b/node_modules/rxjs/observable/ForkJoinObservable.js.map
deleted file mode 100644
index 14eb12b..0000000
--- a/node_modules/rxjs/observable/ForkJoinObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ForkJoinObservable.js","sources":["../src/observable/ForkJoinObservable.ts"],"names":[],"mappings":";;;;;AAAA,+DAA0D"}
diff --git a/node_modules/rxjs/observable/FromEventObservable.d.ts b/node_modules/rxjs/observable/FromEventObservable.d.ts
deleted file mode 100644
index 04291ab..0000000
--- a/node_modules/rxjs/observable/FromEventObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/FromEventObservable';
diff --git a/node_modules/rxjs/observable/FromEventObservable.js b/node_modules/rxjs/observable/FromEventObservable.js
deleted file mode 100644
index a25de71..0000000
--- a/node_modules/rxjs/observable/FromEventObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/FromEventObservable"));
-//# sourceMappingURL=FromEventObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/FromEventObservable.js.map b/node_modules/rxjs/observable/FromEventObservable.js.map
deleted file mode 100644
index 77b8c5e..0000000
--- a/node_modules/rxjs/observable/FromEventObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"FromEventObservable.js","sources":["../src/observable/FromEventObservable.ts"],"names":[],"mappings":";;;;;AAAA,gEAA2D"}
diff --git a/node_modules/rxjs/observable/FromEventPatternObservable.d.ts b/node_modules/rxjs/observable/FromEventPatternObservable.d.ts
deleted file mode 100644
index e0a473c..0000000
--- a/node_modules/rxjs/observable/FromEventPatternObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/FromEventPatternObservable';
diff --git a/node_modules/rxjs/observable/FromEventPatternObservable.js b/node_modules/rxjs/observable/FromEventPatternObservable.js
deleted file mode 100644
index b45e61b..0000000
--- a/node_modules/rxjs/observable/FromEventPatternObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/FromEventPatternObservable"));
-//# sourceMappingURL=FromEventPatternObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/FromEventPatternObservable.js.map b/node_modules/rxjs/observable/FromEventPatternObservable.js.map
deleted file mode 100644
index 213645a..0000000
--- a/node_modules/rxjs/observable/FromEventPatternObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"FromEventPatternObservable.js","sources":["../src/observable/FromEventPatternObservable.ts"],"names":[],"mappings":";;;;;AAAA,uEAAkE"}
diff --git a/node_modules/rxjs/observable/FromObservable.d.ts b/node_modules/rxjs/observable/FromObservable.d.ts
deleted file mode 100644
index c4ec664..0000000
--- a/node_modules/rxjs/observable/FromObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/FromObservable';
diff --git a/node_modules/rxjs/observable/FromObservable.js b/node_modules/rxjs/observable/FromObservable.js
deleted file mode 100644
index 036e800..0000000
--- a/node_modules/rxjs/observable/FromObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/FromObservable"));
-//# sourceMappingURL=FromObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/FromObservable.js.map b/node_modules/rxjs/observable/FromObservable.js.map
deleted file mode 100644
index 63805da..0000000
--- a/node_modules/rxjs/observable/FromObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"FromObservable.js","sources":["../src/observable/FromObservable.ts"],"names":[],"mappings":";;;;;AAAA,2DAAsD"}
diff --git a/node_modules/rxjs/observable/GenerateObservable.d.ts b/node_modules/rxjs/observable/GenerateObservable.d.ts
deleted file mode 100644
index 8441d24..0000000
--- a/node_modules/rxjs/observable/GenerateObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/GenerateObservable';
diff --git a/node_modules/rxjs/observable/GenerateObservable.js b/node_modules/rxjs/observable/GenerateObservable.js
deleted file mode 100644
index ad7086c..0000000
--- a/node_modules/rxjs/observable/GenerateObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/GenerateObservable"));
-//# sourceMappingURL=GenerateObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/GenerateObservable.js.map b/node_modules/rxjs/observable/GenerateObservable.js.map
deleted file mode 100644
index de2b2a5..0000000
--- a/node_modules/rxjs/observable/GenerateObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"GenerateObservable.js","sources":["../src/observable/GenerateObservable.ts"],"names":[],"mappings":";;;;;AAAA,+DAA0D"}
diff --git a/node_modules/rxjs/observable/IfObservable.d.ts b/node_modules/rxjs/observable/IfObservable.d.ts
deleted file mode 100644
index 5eb484a..0000000
--- a/node_modules/rxjs/observable/IfObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/IfObservable';
diff --git a/node_modules/rxjs/observable/IfObservable.js b/node_modules/rxjs/observable/IfObservable.js
deleted file mode 100644
index cdb4680..0000000
--- a/node_modules/rxjs/observable/IfObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/IfObservable"));
-//# sourceMappingURL=IfObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/IfObservable.js.map b/node_modules/rxjs/observable/IfObservable.js.map
deleted file mode 100644
index 28c6ea8..0000000
--- a/node_modules/rxjs/observable/IfObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"IfObservable.js","sources":["../src/observable/IfObservable.ts"],"names":[],"mappings":";;;;;AAAA,yDAAoD"}
diff --git a/node_modules/rxjs/observable/IntervalObservable.d.ts b/node_modules/rxjs/observable/IntervalObservable.d.ts
deleted file mode 100644
index dfe181f..0000000
--- a/node_modules/rxjs/observable/IntervalObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/IntervalObservable';
diff --git a/node_modules/rxjs/observable/IntervalObservable.js b/node_modules/rxjs/observable/IntervalObservable.js
deleted file mode 100644
index afc8a95..0000000
--- a/node_modules/rxjs/observable/IntervalObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/IntervalObservable"));
-//# sourceMappingURL=IntervalObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/IntervalObservable.js.map b/node_modules/rxjs/observable/IntervalObservable.js.map
deleted file mode 100644
index dcff25e..0000000
--- a/node_modules/rxjs/observable/IntervalObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"IntervalObservable.js","sources":["../src/observable/IntervalObservable.ts"],"names":[],"mappings":";;;;;AAAA,+DAA0D"}
diff --git a/node_modules/rxjs/observable/IteratorObservable.d.ts b/node_modules/rxjs/observable/IteratorObservable.d.ts
deleted file mode 100644
index 860fbef..0000000
--- a/node_modules/rxjs/observable/IteratorObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/IteratorObservable';
diff --git a/node_modules/rxjs/observable/IteratorObservable.js b/node_modules/rxjs/observable/IteratorObservable.js
deleted file mode 100644
index 643ea91..0000000
--- a/node_modules/rxjs/observable/IteratorObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/IteratorObservable"));
-//# sourceMappingURL=IteratorObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/IteratorObservable.js.map b/node_modules/rxjs/observable/IteratorObservable.js.map
deleted file mode 100644
index 1864fbc..0000000
--- a/node_modules/rxjs/observable/IteratorObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"IteratorObservable.js","sources":["../src/observable/IteratorObservable.ts"],"names":[],"mappings":";;;;;AAAA,+DAA0D"}
diff --git a/node_modules/rxjs/observable/NeverObservable.d.ts b/node_modules/rxjs/observable/NeverObservable.d.ts
deleted file mode 100644
index de44057..0000000
--- a/node_modules/rxjs/observable/NeverObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/NeverObservable';
diff --git a/node_modules/rxjs/observable/NeverObservable.js b/node_modules/rxjs/observable/NeverObservable.js
deleted file mode 100644
index a53c68a..0000000
--- a/node_modules/rxjs/observable/NeverObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/NeverObservable"));
-//# sourceMappingURL=NeverObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/NeverObservable.js.map b/node_modules/rxjs/observable/NeverObservable.js.map
deleted file mode 100644
index 70245d1..0000000
--- a/node_modules/rxjs/observable/NeverObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"NeverObservable.js","sources":["../src/observable/NeverObservable.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuD"}
diff --git a/node_modules/rxjs/observable/PairsObservable.d.ts b/node_modules/rxjs/observable/PairsObservable.d.ts
deleted file mode 100644
index d030788..0000000
--- a/node_modules/rxjs/observable/PairsObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/PairsObservable';
diff --git a/node_modules/rxjs/observable/PairsObservable.js b/node_modules/rxjs/observable/PairsObservable.js
deleted file mode 100644
index a352afb..0000000
--- a/node_modules/rxjs/observable/PairsObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/PairsObservable"));
-//# sourceMappingURL=PairsObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/PairsObservable.js.map b/node_modules/rxjs/observable/PairsObservable.js.map
deleted file mode 100644
index b35691d..0000000
--- a/node_modules/rxjs/observable/PairsObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"PairsObservable.js","sources":["../src/observable/PairsObservable.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuD"}
diff --git a/node_modules/rxjs/observable/PromiseObservable.d.ts b/node_modules/rxjs/observable/PromiseObservable.d.ts
deleted file mode 100644
index ae0aac2..0000000
--- a/node_modules/rxjs/observable/PromiseObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/PromiseObservable';
diff --git a/node_modules/rxjs/observable/PromiseObservable.js b/node_modules/rxjs/observable/PromiseObservable.js
deleted file mode 100644
index 2660a27..0000000
--- a/node_modules/rxjs/observable/PromiseObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/PromiseObservable"));
-//# sourceMappingURL=PromiseObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/PromiseObservable.js.map b/node_modules/rxjs/observable/PromiseObservable.js.map
deleted file mode 100644
index 05f774a..0000000
--- a/node_modules/rxjs/observable/PromiseObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"PromiseObservable.js","sources":["../src/observable/PromiseObservable.ts"],"names":[],"mappings":";;;;;AAAA,8DAAyD"}
diff --git a/node_modules/rxjs/observable/RangeObservable.d.ts b/node_modules/rxjs/observable/RangeObservable.d.ts
deleted file mode 100644
index f500c0a..0000000
--- a/node_modules/rxjs/observable/RangeObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/RangeObservable';
diff --git a/node_modules/rxjs/observable/RangeObservable.js b/node_modules/rxjs/observable/RangeObservable.js
deleted file mode 100644
index f24002a..0000000
--- a/node_modules/rxjs/observable/RangeObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/RangeObservable"));
-//# sourceMappingURL=RangeObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/RangeObservable.js.map b/node_modules/rxjs/observable/RangeObservable.js.map
deleted file mode 100644
index 9432594..0000000
--- a/node_modules/rxjs/observable/RangeObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"RangeObservable.js","sources":["../src/observable/RangeObservable.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuD"}
diff --git a/node_modules/rxjs/observable/ScalarObservable.d.ts b/node_modules/rxjs/observable/ScalarObservable.d.ts
deleted file mode 100644
index a353068..0000000
--- a/node_modules/rxjs/observable/ScalarObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/ScalarObservable';
diff --git a/node_modules/rxjs/observable/ScalarObservable.js b/node_modules/rxjs/observable/ScalarObservable.js
deleted file mode 100644
index be97f28..0000000
--- a/node_modules/rxjs/observable/ScalarObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/ScalarObservable"));
-//# sourceMappingURL=ScalarObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/ScalarObservable.js.map b/node_modules/rxjs/observable/ScalarObservable.js.map
deleted file mode 100644
index 4c560ad..0000000
--- a/node_modules/rxjs/observable/ScalarObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ScalarObservable.js","sources":["../src/observable/ScalarObservable.ts"],"names":[],"mappings":";;;;;AAAA,6DAAwD"}
diff --git a/node_modules/rxjs/observable/SubscribeOnObservable.d.ts b/node_modules/rxjs/observable/SubscribeOnObservable.d.ts
deleted file mode 100644
index 6435727..0000000
--- a/node_modules/rxjs/observable/SubscribeOnObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/SubscribeOnObservable';
diff --git a/node_modules/rxjs/observable/SubscribeOnObservable.js b/node_modules/rxjs/observable/SubscribeOnObservable.js
deleted file mode 100644
index f354b93..0000000
--- a/node_modules/rxjs/observable/SubscribeOnObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/SubscribeOnObservable"));
-//# sourceMappingURL=SubscribeOnObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/SubscribeOnObservable.js.map b/node_modules/rxjs/observable/SubscribeOnObservable.js.map
deleted file mode 100644
index a9f14f3..0000000
--- a/node_modules/rxjs/observable/SubscribeOnObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"SubscribeOnObservable.js","sources":["../src/observable/SubscribeOnObservable.ts"],"names":[],"mappings":";;;;;AAAA,kEAA6D"}
diff --git a/node_modules/rxjs/observable/TimerObservable.d.ts b/node_modules/rxjs/observable/TimerObservable.d.ts
deleted file mode 100644
index 02b4a51..0000000
--- a/node_modules/rxjs/observable/TimerObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/TimerObservable';
diff --git a/node_modules/rxjs/observable/TimerObservable.js b/node_modules/rxjs/observable/TimerObservable.js
deleted file mode 100644
index 5058bef..0000000
--- a/node_modules/rxjs/observable/TimerObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/TimerObservable"));
-//# sourceMappingURL=TimerObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/TimerObservable.js.map b/node_modules/rxjs/observable/TimerObservable.js.map
deleted file mode 100644
index fc5ea45..0000000
--- a/node_modules/rxjs/observable/TimerObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TimerObservable.js","sources":["../src/observable/TimerObservable.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuD"}
diff --git a/node_modules/rxjs/observable/UsingObservable.d.ts b/node_modules/rxjs/observable/UsingObservable.d.ts
deleted file mode 100644
index c24410f..0000000
--- a/node_modules/rxjs/observable/UsingObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/UsingObservable';
diff --git a/node_modules/rxjs/observable/UsingObservable.js b/node_modules/rxjs/observable/UsingObservable.js
deleted file mode 100644
index fbb19bc..0000000
--- a/node_modules/rxjs/observable/UsingObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/UsingObservable"));
-//# sourceMappingURL=UsingObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/UsingObservable.js.map b/node_modules/rxjs/observable/UsingObservable.js.map
deleted file mode 100644
index a94931e..0000000
--- a/node_modules/rxjs/observable/UsingObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"UsingObservable.js","sources":["../src/observable/UsingObservable.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuD"}
diff --git a/node_modules/rxjs/observable/bindCallback.d.ts b/node_modules/rxjs/observable/bindCallback.d.ts
deleted file mode 100644
index aab5734..0000000
--- a/node_modules/rxjs/observable/bindCallback.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/bindCallback';
diff --git a/node_modules/rxjs/observable/bindCallback.js b/node_modules/rxjs/observable/bindCallback.js
deleted file mode 100644
index fb1bde4..0000000
--- a/node_modules/rxjs/observable/bindCallback.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/bindCallback"));
-//# sourceMappingURL=bindCallback.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/bindCallback.js.map b/node_modules/rxjs/observable/bindCallback.js.map
deleted file mode 100644
index b9438f4..0000000
--- a/node_modules/rxjs/observable/bindCallback.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bindCallback.js","sources":["../src/observable/bindCallback.ts"],"names":[],"mappings":";;;;;AAAA,yDAAoD"}
diff --git a/node_modules/rxjs/observable/bindNodeCallback.d.ts b/node_modules/rxjs/observable/bindNodeCallback.d.ts
deleted file mode 100644
index d5bfe5d..0000000
--- a/node_modules/rxjs/observable/bindNodeCallback.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/bindNodeCallback';
diff --git a/node_modules/rxjs/observable/bindNodeCallback.js b/node_modules/rxjs/observable/bindNodeCallback.js
deleted file mode 100644
index 826c090..0000000
--- a/node_modules/rxjs/observable/bindNodeCallback.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/bindNodeCallback"));
-//# sourceMappingURL=bindNodeCallback.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/bindNodeCallback.js.map b/node_modules/rxjs/observable/bindNodeCallback.js.map
deleted file mode 100644
index e9420ef..0000000
--- a/node_modules/rxjs/observable/bindNodeCallback.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bindNodeCallback.js","sources":["../src/observable/bindNodeCallback.ts"],"names":[],"mappings":";;;;;AAAA,6DAAwD"}
diff --git a/node_modules/rxjs/observable/combineLatest.d.ts b/node_modules/rxjs/observable/combineLatest.d.ts
deleted file mode 100644
index d4b7033..0000000
--- a/node_modules/rxjs/observable/combineLatest.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/combineLatest';
diff --git a/node_modules/rxjs/observable/combineLatest.js b/node_modules/rxjs/observable/combineLatest.js
deleted file mode 100644
index e6424b4..0000000
--- a/node_modules/rxjs/observable/combineLatest.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/combineLatest"));
-//# sourceMappingURL=combineLatest.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/combineLatest.js.map b/node_modules/rxjs/observable/combineLatest.js.map
deleted file mode 100644
index bf27da3..0000000
--- a/node_modules/rxjs/observable/combineLatest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineLatest.js","sources":["../src/observable/combineLatest.ts"],"names":[],"mappings":";;;;;AAAA,0DAAqD"}
diff --git a/node_modules/rxjs/observable/concat.d.ts b/node_modules/rxjs/observable/concat.d.ts
deleted file mode 100644
index 673b315..0000000
--- a/node_modules/rxjs/observable/concat.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/concat';
diff --git a/node_modules/rxjs/observable/concat.js b/node_modules/rxjs/observable/concat.js
deleted file mode 100644
index 766857a..0000000
--- a/node_modules/rxjs/observable/concat.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/concat"));
-//# sourceMappingURL=concat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/concat.js.map b/node_modules/rxjs/observable/concat.js.map
deleted file mode 100644
index 6b7a005..0000000
--- a/node_modules/rxjs/observable/concat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concat.js","sources":["../src/observable/concat.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/observable/defer.d.ts b/node_modules/rxjs/observable/defer.d.ts
deleted file mode 100644
index 1a02f81..0000000
--- a/node_modules/rxjs/observable/defer.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/defer';
diff --git a/node_modules/rxjs/observable/defer.js b/node_modules/rxjs/observable/defer.js
deleted file mode 100644
index 4ada85e..0000000
--- a/node_modules/rxjs/observable/defer.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/defer"));
-//# sourceMappingURL=defer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/defer.js.map b/node_modules/rxjs/observable/defer.js.map
deleted file mode 100644
index 4826a98..0000000
--- a/node_modules/rxjs/observable/defer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"defer.js","sources":["../src/observable/defer.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/observable/dom/AjaxObservable.d.ts b/node_modules/rxjs/observable/dom/AjaxObservable.d.ts
deleted file mode 100644
index e216730..0000000
--- a/node_modules/rxjs/observable/dom/AjaxObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/dom/AjaxObservable';
diff --git a/node_modules/rxjs/observable/dom/AjaxObservable.js b/node_modules/rxjs/observable/dom/AjaxObservable.js
deleted file mode 100644
index 91ef18a..0000000
--- a/node_modules/rxjs/observable/dom/AjaxObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/dom/AjaxObservable"));
-//# sourceMappingURL=AjaxObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/dom/AjaxObservable.js.map b/node_modules/rxjs/observable/dom/AjaxObservable.js.map
deleted file mode 100644
index 2e838d7..0000000
--- a/node_modules/rxjs/observable/dom/AjaxObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AjaxObservable.js","sources":["../../src/observable/dom/AjaxObservable.ts"],"names":[],"mappings":";;;;;AAAA,+DAA0D"}
diff --git a/node_modules/rxjs/observable/dom/WebSocketSubject.d.ts b/node_modules/rxjs/observable/dom/WebSocketSubject.d.ts
deleted file mode 100644
index d528bf5..0000000
--- a/node_modules/rxjs/observable/dom/WebSocketSubject.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/dom/WebSocketSubject';
diff --git a/node_modules/rxjs/observable/dom/WebSocketSubject.js b/node_modules/rxjs/observable/dom/WebSocketSubject.js
deleted file mode 100644
index bf02ae9..0000000
--- a/node_modules/rxjs/observable/dom/WebSocketSubject.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/dom/WebSocketSubject"));
-//# sourceMappingURL=WebSocketSubject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/dom/WebSocketSubject.js.map b/node_modules/rxjs/observable/dom/WebSocketSubject.js.map
deleted file mode 100644
index 60a64ee..0000000
--- a/node_modules/rxjs/observable/dom/WebSocketSubject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"WebSocketSubject.js","sources":["../../src/observable/dom/WebSocketSubject.ts"],"names":[],"mappings":";;;;;AAAA,iEAA4D"}
diff --git a/node_modules/rxjs/observable/dom/ajax.d.ts b/node_modules/rxjs/observable/dom/ajax.d.ts
deleted file mode 100644
index 495c98d..0000000
--- a/node_modules/rxjs/observable/dom/ajax.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/dom/ajax';
diff --git a/node_modules/rxjs/observable/dom/ajax.js b/node_modules/rxjs/observable/dom/ajax.js
deleted file mode 100644
index cd1cc87..0000000
--- a/node_modules/rxjs/observable/dom/ajax.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/dom/ajax"));
-//# sourceMappingURL=ajax.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/dom/ajax.js.map b/node_modules/rxjs/observable/dom/ajax.js.map
deleted file mode 100644
index 1b33988..0000000
--- a/node_modules/rxjs/observable/dom/ajax.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ajax.js","sources":["../../src/observable/dom/ajax.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/observable/dom/webSocket.d.ts b/node_modules/rxjs/observable/dom/webSocket.d.ts
deleted file mode 100644
index c2fa408..0000000
--- a/node_modules/rxjs/observable/dom/webSocket.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/dom/webSocket';
diff --git a/node_modules/rxjs/observable/dom/webSocket.js b/node_modules/rxjs/observable/dom/webSocket.js
deleted file mode 100644
index 36b767b..0000000
--- a/node_modules/rxjs/observable/dom/webSocket.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/dom/webSocket"));
-//# sourceMappingURL=webSocket.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/dom/webSocket.js.map b/node_modules/rxjs/observable/dom/webSocket.js.map
deleted file mode 100644
index 6933d74..0000000
--- a/node_modules/rxjs/observable/dom/webSocket.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"webSocket.js","sources":["../../src/observable/dom/webSocket.ts"],"names":[],"mappings":";;;;;AAAA,0DAAqD"}
diff --git a/node_modules/rxjs/observable/empty.d.ts b/node_modules/rxjs/observable/empty.d.ts
deleted file mode 100644
index d7ed9cb..0000000
--- a/node_modules/rxjs/observable/empty.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/empty';
diff --git a/node_modules/rxjs/observable/empty.js b/node_modules/rxjs/observable/empty.js
deleted file mode 100644
index 02a2c46..0000000
--- a/node_modules/rxjs/observable/empty.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/empty"));
-//# sourceMappingURL=empty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/empty.js.map b/node_modules/rxjs/observable/empty.js.map
deleted file mode 100644
index 27530bf..0000000
--- a/node_modules/rxjs/observable/empty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"empty.js","sources":["../src/observable/empty.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/observable/forkJoin.d.ts b/node_modules/rxjs/observable/forkJoin.d.ts
deleted file mode 100644
index 3720625..0000000
--- a/node_modules/rxjs/observable/forkJoin.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/forkJoin';
diff --git a/node_modules/rxjs/observable/forkJoin.js b/node_modules/rxjs/observable/forkJoin.js
deleted file mode 100644
index c036f46..0000000
--- a/node_modules/rxjs/observable/forkJoin.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/forkJoin"));
-//# sourceMappingURL=forkJoin.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/forkJoin.js.map b/node_modules/rxjs/observable/forkJoin.js.map
deleted file mode 100644
index 53dc311..0000000
--- a/node_modules/rxjs/observable/forkJoin.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"forkJoin.js","sources":["../src/observable/forkJoin.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/observable/from.d.ts b/node_modules/rxjs/observable/from.d.ts
deleted file mode 100644
index 37d2b3a..0000000
--- a/node_modules/rxjs/observable/from.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/from';
diff --git a/node_modules/rxjs/observable/from.js b/node_modules/rxjs/observable/from.js
deleted file mode 100644
index d9a0f58..0000000
--- a/node_modules/rxjs/observable/from.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/from"));
-//# sourceMappingURL=from.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/from.js.map b/node_modules/rxjs/observable/from.js.map
deleted file mode 100644
index f4e79c4..0000000
--- a/node_modules/rxjs/observable/from.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"from.js","sources":["../src/observable/from.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/observable/fromArray.d.ts b/node_modules/rxjs/observable/fromArray.d.ts
deleted file mode 100644
index 97f8377..0000000
--- a/node_modules/rxjs/observable/fromArray.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/fromArray';
diff --git a/node_modules/rxjs/observable/fromArray.js b/node_modules/rxjs/observable/fromArray.js
deleted file mode 100644
index cf2bdc8..0000000
--- a/node_modules/rxjs/observable/fromArray.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/fromArray"));
-//# sourceMappingURL=fromArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/fromArray.js.map b/node_modules/rxjs/observable/fromArray.js.map
deleted file mode 100644
index bad30db..0000000
--- a/node_modules/rxjs/observable/fromArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromArray.js","sources":["../src/observable/fromArray.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/observable/fromEvent.d.ts b/node_modules/rxjs/observable/fromEvent.d.ts
deleted file mode 100644
index 0312e3e..0000000
--- a/node_modules/rxjs/observable/fromEvent.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/fromEvent';
diff --git a/node_modules/rxjs/observable/fromEvent.js b/node_modules/rxjs/observable/fromEvent.js
deleted file mode 100644
index bb8a1b0..0000000
--- a/node_modules/rxjs/observable/fromEvent.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/fromEvent"));
-//# sourceMappingURL=fromEvent.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/fromEvent.js.map b/node_modules/rxjs/observable/fromEvent.js.map
deleted file mode 100644
index 5417b2b..0000000
--- a/node_modules/rxjs/observable/fromEvent.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromEvent.js","sources":["../src/observable/fromEvent.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/observable/fromEventPattern.d.ts b/node_modules/rxjs/observable/fromEventPattern.d.ts
deleted file mode 100644
index 6662550..0000000
--- a/node_modules/rxjs/observable/fromEventPattern.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/fromEventPattern';
diff --git a/node_modules/rxjs/observable/fromEventPattern.js b/node_modules/rxjs/observable/fromEventPattern.js
deleted file mode 100644
index fe42d97..0000000
--- a/node_modules/rxjs/observable/fromEventPattern.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/fromEventPattern"));
-//# sourceMappingURL=fromEventPattern.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/fromEventPattern.js.map b/node_modules/rxjs/observable/fromEventPattern.js.map
deleted file mode 100644
index ae39447..0000000
--- a/node_modules/rxjs/observable/fromEventPattern.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromEventPattern.js","sources":["../src/observable/fromEventPattern.ts"],"names":[],"mappings":";;;;;AAAA,6DAAwD"}
diff --git a/node_modules/rxjs/observable/fromIterable.d.ts b/node_modules/rxjs/observable/fromIterable.d.ts
deleted file mode 100644
index ee359a2..0000000
--- a/node_modules/rxjs/observable/fromIterable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/fromIterable';
diff --git a/node_modules/rxjs/observable/fromIterable.js b/node_modules/rxjs/observable/fromIterable.js
deleted file mode 100644
index fe33fa5..0000000
--- a/node_modules/rxjs/observable/fromIterable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/fromIterable"));
-//# sourceMappingURL=fromIterable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/fromIterable.js.map b/node_modules/rxjs/observable/fromIterable.js.map
deleted file mode 100644
index 64c2777..0000000
--- a/node_modules/rxjs/observable/fromIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromIterable.js","sources":["../src/observable/fromIterable.ts"],"names":[],"mappings":";;;;;AAAA,yDAAoD"}
diff --git a/node_modules/rxjs/observable/fromPromise.d.ts b/node_modules/rxjs/observable/fromPromise.d.ts
deleted file mode 100644
index b580adc..0000000
--- a/node_modules/rxjs/observable/fromPromise.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/fromPromise';
diff --git a/node_modules/rxjs/observable/fromPromise.js b/node_modules/rxjs/observable/fromPromise.js
deleted file mode 100644
index d0c6e20..0000000
--- a/node_modules/rxjs/observable/fromPromise.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/fromPromise"));
-//# sourceMappingURL=fromPromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/fromPromise.js.map b/node_modules/rxjs/observable/fromPromise.js.map
deleted file mode 100644
index 8affd77..0000000
--- a/node_modules/rxjs/observable/fromPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"fromPromise.js","sources":["../src/observable/fromPromise.ts"],"names":[],"mappings":";;;;;AAAA,wDAAmD"}
diff --git a/node_modules/rxjs/observable/generate.d.ts b/node_modules/rxjs/observable/generate.d.ts
deleted file mode 100644
index ad23753..0000000
--- a/node_modules/rxjs/observable/generate.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/generate';
diff --git a/node_modules/rxjs/observable/generate.js b/node_modules/rxjs/observable/generate.js
deleted file mode 100644
index 719f66f..0000000
--- a/node_modules/rxjs/observable/generate.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/generate"));
-//# sourceMappingURL=generate.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/generate.js.map b/node_modules/rxjs/observable/generate.js.map
deleted file mode 100644
index ee7be9d..0000000
--- a/node_modules/rxjs/observable/generate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"generate.js","sources":["../src/observable/generate.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/observable/if.d.ts b/node_modules/rxjs/observable/if.d.ts
deleted file mode 100644
index 71a71a4..0000000
--- a/node_modules/rxjs/observable/if.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/if';
diff --git a/node_modules/rxjs/observable/if.js b/node_modules/rxjs/observable/if.js
deleted file mode 100644
index 2d260ed..0000000
--- a/node_modules/rxjs/observable/if.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/if"));
-//# sourceMappingURL=if.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/if.js.map b/node_modules/rxjs/observable/if.js.map
deleted file mode 100644
index d64bec1..0000000
--- a/node_modules/rxjs/observable/if.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"if.js","sources":["../src/observable/if.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/observable/interval.d.ts b/node_modules/rxjs/observable/interval.d.ts
deleted file mode 100644
index 273374a..0000000
--- a/node_modules/rxjs/observable/interval.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/interval';
diff --git a/node_modules/rxjs/observable/interval.js b/node_modules/rxjs/observable/interval.js
deleted file mode 100644
index b746865..0000000
--- a/node_modules/rxjs/observable/interval.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/interval"));
-//# sourceMappingURL=interval.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/interval.js.map b/node_modules/rxjs/observable/interval.js.map
deleted file mode 100644
index ed258a4..0000000
--- a/node_modules/rxjs/observable/interval.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"interval.js","sources":["../src/observable/interval.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/observable/merge.d.ts b/node_modules/rxjs/observable/merge.d.ts
deleted file mode 100644
index 5cbace9..0000000
--- a/node_modules/rxjs/observable/merge.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/merge';
diff --git a/node_modules/rxjs/observable/merge.js b/node_modules/rxjs/observable/merge.js
deleted file mode 100644
index 39ccb55..0000000
--- a/node_modules/rxjs/observable/merge.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/merge"));
-//# sourceMappingURL=merge.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/merge.js.map b/node_modules/rxjs/observable/merge.js.map
deleted file mode 100644
index 01c6ef4..0000000
--- a/node_modules/rxjs/observable/merge.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"merge.js","sources":["../src/observable/merge.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/observable/never.d.ts b/node_modules/rxjs/observable/never.d.ts
deleted file mode 100644
index 8d8b24c..0000000
--- a/node_modules/rxjs/observable/never.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/never';
diff --git a/node_modules/rxjs/observable/never.js b/node_modules/rxjs/observable/never.js
deleted file mode 100644
index dd4b5f6..0000000
--- a/node_modules/rxjs/observable/never.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/never"));
-//# sourceMappingURL=never.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/never.js.map b/node_modules/rxjs/observable/never.js.map
deleted file mode 100644
index 22eda3d..0000000
--- a/node_modules/rxjs/observable/never.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"never.js","sources":["../src/observable/never.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/observable/of.d.ts b/node_modules/rxjs/observable/of.d.ts
deleted file mode 100644
index b61ca78..0000000
--- a/node_modules/rxjs/observable/of.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/of';
diff --git a/node_modules/rxjs/observable/of.js b/node_modules/rxjs/observable/of.js
deleted file mode 100644
index 7c2d953..0000000
--- a/node_modules/rxjs/observable/of.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/of"));
-//# sourceMappingURL=of.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/of.js.map b/node_modules/rxjs/observable/of.js.map
deleted file mode 100644
index bd1d12e..0000000
--- a/node_modules/rxjs/observable/of.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"of.js","sources":["../src/observable/of.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/observable/onErrorResumeNext.d.ts b/node_modules/rxjs/observable/onErrorResumeNext.d.ts
deleted file mode 100644
index 8b46336..0000000
--- a/node_modules/rxjs/observable/onErrorResumeNext.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/onErrorResumeNext';
diff --git a/node_modules/rxjs/observable/onErrorResumeNext.js b/node_modules/rxjs/observable/onErrorResumeNext.js
deleted file mode 100644
index 5b4c7e5..0000000
--- a/node_modules/rxjs/observable/onErrorResumeNext.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/onErrorResumeNext"));
-//# sourceMappingURL=onErrorResumeNext.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/onErrorResumeNext.js.map b/node_modules/rxjs/observable/onErrorResumeNext.js.map
deleted file mode 100644
index cb1ccc3..0000000
--- a/node_modules/rxjs/observable/onErrorResumeNext.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"onErrorResumeNext.js","sources":["../src/observable/onErrorResumeNext.ts"],"names":[],"mappings":";;;;;AAAA,8DAAyD"}
diff --git a/node_modules/rxjs/observable/pairs.d.ts b/node_modules/rxjs/observable/pairs.d.ts
deleted file mode 100644
index 59ea93e..0000000
--- a/node_modules/rxjs/observable/pairs.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/pairs';
diff --git a/node_modules/rxjs/observable/pairs.js b/node_modules/rxjs/observable/pairs.js
deleted file mode 100644
index 836bddd..0000000
--- a/node_modules/rxjs/observable/pairs.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/pairs"));
-//# sourceMappingURL=pairs.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/pairs.js.map b/node_modules/rxjs/observable/pairs.js.map
deleted file mode 100644
index 71bd4e2..0000000
--- a/node_modules/rxjs/observable/pairs.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pairs.js","sources":["../src/observable/pairs.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/observable/race.d.ts b/node_modules/rxjs/observable/race.d.ts
deleted file mode 100644
index 5c05cde..0000000
--- a/node_modules/rxjs/observable/race.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/race';
diff --git a/node_modules/rxjs/observable/race.js b/node_modules/rxjs/observable/race.js
deleted file mode 100644
index 4272a67..0000000
--- a/node_modules/rxjs/observable/race.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/race"));
-//# sourceMappingURL=race.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/race.js.map b/node_modules/rxjs/observable/race.js.map
deleted file mode 100644
index 13c3366..0000000
--- a/node_modules/rxjs/observable/race.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"race.js","sources":["../src/observable/race.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/observable/range.d.ts b/node_modules/rxjs/observable/range.d.ts
deleted file mode 100644
index 297046c..0000000
--- a/node_modules/rxjs/observable/range.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/range';
diff --git a/node_modules/rxjs/observable/range.js b/node_modules/rxjs/observable/range.js
deleted file mode 100644
index cd4af4a..0000000
--- a/node_modules/rxjs/observable/range.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/range"));
-//# sourceMappingURL=range.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/range.js.map b/node_modules/rxjs/observable/range.js.map
deleted file mode 100644
index 0fbcf41..0000000
--- a/node_modules/rxjs/observable/range.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"range.js","sources":["../src/observable/range.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/observable/throw.d.ts b/node_modules/rxjs/observable/throw.d.ts
deleted file mode 100644
index 30d4362..0000000
--- a/node_modules/rxjs/observable/throw.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/throw';
diff --git a/node_modules/rxjs/observable/throw.js b/node_modules/rxjs/observable/throw.js
deleted file mode 100644
index 9a2fb7e..0000000
--- a/node_modules/rxjs/observable/throw.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/throw"));
-//# sourceMappingURL=throw.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/throw.js.map b/node_modules/rxjs/observable/throw.js.map
deleted file mode 100644
index b8fee0b..0000000
--- a/node_modules/rxjs/observable/throw.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throw.js","sources":["../src/observable/throw.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/observable/timer.d.ts b/node_modules/rxjs/observable/timer.d.ts
deleted file mode 100644
index ac3d484..0000000
--- a/node_modules/rxjs/observable/timer.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/timer';
diff --git a/node_modules/rxjs/observable/timer.js b/node_modules/rxjs/observable/timer.js
deleted file mode 100644
index 340ae41..0000000
--- a/node_modules/rxjs/observable/timer.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/timer"));
-//# sourceMappingURL=timer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/timer.js.map b/node_modules/rxjs/observable/timer.js.map
deleted file mode 100644
index 4a5f8b4..0000000
--- a/node_modules/rxjs/observable/timer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timer.js","sources":["../src/observable/timer.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/observable/using.d.ts b/node_modules/rxjs/observable/using.d.ts
deleted file mode 100644
index 2a9d0e7..0000000
--- a/node_modules/rxjs/observable/using.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/using';
diff --git a/node_modules/rxjs/observable/using.js b/node_modules/rxjs/observable/using.js
deleted file mode 100644
index 423a870..0000000
--- a/node_modules/rxjs/observable/using.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/using"));
-//# sourceMappingURL=using.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/using.js.map b/node_modules/rxjs/observable/using.js.map
deleted file mode 100644
index 268d152..0000000
--- a/node_modules/rxjs/observable/using.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"using.js","sources":["../src/observable/using.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/observable/zip.d.ts b/node_modules/rxjs/observable/zip.d.ts
deleted file mode 100644
index 286e225..0000000
--- a/node_modules/rxjs/observable/zip.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/zip';
diff --git a/node_modules/rxjs/observable/zip.js b/node_modules/rxjs/observable/zip.js
deleted file mode 100644
index 907f828..0000000
--- a/node_modules/rxjs/observable/zip.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/observable/zip"));
-//# sourceMappingURL=zip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/observable/zip.js.map b/node_modules/rxjs/observable/zip.js.map
deleted file mode 100644
index 45beb4c..0000000
--- a/node_modules/rxjs/observable/zip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zip.js","sources":["../src/observable/zip.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operator/audit.d.ts b/node_modules/rxjs/operator/audit.d.ts
deleted file mode 100644
index f99039c..0000000
--- a/node_modules/rxjs/operator/audit.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/audit';
diff --git a/node_modules/rxjs/operator/audit.js b/node_modules/rxjs/operator/audit.js
deleted file mode 100644
index 88b896f..0000000
--- a/node_modules/rxjs/operator/audit.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/audit"));
-//# sourceMappingURL=audit.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/audit.js.map b/node_modules/rxjs/operator/audit.js.map
deleted file mode 100644
index 554885c..0000000
--- a/node_modules/rxjs/operator/audit.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"audit.js","sources":["../src/operator/audit.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operator/auditTime.d.ts b/node_modules/rxjs/operator/auditTime.d.ts
deleted file mode 100644
index 16dcc21..0000000
--- a/node_modules/rxjs/operator/auditTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/auditTime';
diff --git a/node_modules/rxjs/operator/auditTime.js b/node_modules/rxjs/operator/auditTime.js
deleted file mode 100644
index e263d78..0000000
--- a/node_modules/rxjs/operator/auditTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/auditTime"));
-//# sourceMappingURL=auditTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/auditTime.js.map b/node_modules/rxjs/operator/auditTime.js.map
deleted file mode 100644
index 650a742..0000000
--- a/node_modules/rxjs/operator/auditTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"auditTime.js","sources":["../src/operator/auditTime.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/buffer.d.ts b/node_modules/rxjs/operator/buffer.d.ts
deleted file mode 100644
index ae0e349..0000000
--- a/node_modules/rxjs/operator/buffer.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/buffer';
diff --git a/node_modules/rxjs/operator/buffer.js b/node_modules/rxjs/operator/buffer.js
deleted file mode 100644
index 77268c1..0000000
--- a/node_modules/rxjs/operator/buffer.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/buffer"));
-//# sourceMappingURL=buffer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/buffer.js.map b/node_modules/rxjs/operator/buffer.js.map
deleted file mode 100644
index eb49020..0000000
--- a/node_modules/rxjs/operator/buffer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"buffer.js","sources":["../src/operator/buffer.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operator/bufferCount.d.ts b/node_modules/rxjs/operator/bufferCount.d.ts
deleted file mode 100644
index 9883c58..0000000
--- a/node_modules/rxjs/operator/bufferCount.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/bufferCount';
diff --git a/node_modules/rxjs/operator/bufferCount.js b/node_modules/rxjs/operator/bufferCount.js
deleted file mode 100644
index dfbf90d..0000000
--- a/node_modules/rxjs/operator/bufferCount.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/bufferCount"));
-//# sourceMappingURL=bufferCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/bufferCount.js.map b/node_modules/rxjs/operator/bufferCount.js.map
deleted file mode 100644
index 7f5908c..0000000
--- a/node_modules/rxjs/operator/bufferCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferCount.js","sources":["../src/operator/bufferCount.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operator/bufferTime.d.ts b/node_modules/rxjs/operator/bufferTime.d.ts
deleted file mode 100644
index 74845b4..0000000
--- a/node_modules/rxjs/operator/bufferTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/bufferTime';
diff --git a/node_modules/rxjs/operator/bufferTime.js b/node_modules/rxjs/operator/bufferTime.js
deleted file mode 100644
index 4800190..0000000
--- a/node_modules/rxjs/operator/bufferTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/bufferTime"));
-//# sourceMappingURL=bufferTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/bufferTime.js.map b/node_modules/rxjs/operator/bufferTime.js.map
deleted file mode 100644
index 732765b..0000000
--- a/node_modules/rxjs/operator/bufferTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferTime.js","sources":["../src/operator/bufferTime.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operator/bufferToggle.d.ts b/node_modules/rxjs/operator/bufferToggle.d.ts
deleted file mode 100644
index 3a3ccff..0000000
--- a/node_modules/rxjs/operator/bufferToggle.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/bufferToggle';
diff --git a/node_modules/rxjs/operator/bufferToggle.js b/node_modules/rxjs/operator/bufferToggle.js
deleted file mode 100644
index d2d957f..0000000
--- a/node_modules/rxjs/operator/bufferToggle.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/bufferToggle"));
-//# sourceMappingURL=bufferToggle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/bufferToggle.js.map b/node_modules/rxjs/operator/bufferToggle.js.map
deleted file mode 100644
index 8e48646..0000000
--- a/node_modules/rxjs/operator/bufferToggle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferToggle.js","sources":["../src/operator/bufferToggle.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operator/bufferWhen.d.ts b/node_modules/rxjs/operator/bufferWhen.d.ts
deleted file mode 100644
index f394a58..0000000
--- a/node_modules/rxjs/operator/bufferWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/bufferWhen';
diff --git a/node_modules/rxjs/operator/bufferWhen.js b/node_modules/rxjs/operator/bufferWhen.js
deleted file mode 100644
index dc48cf7..0000000
--- a/node_modules/rxjs/operator/bufferWhen.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/bufferWhen"));
-//# sourceMappingURL=bufferWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/bufferWhen.js.map b/node_modules/rxjs/operator/bufferWhen.js.map
deleted file mode 100644
index 3f532c0..0000000
--- a/node_modules/rxjs/operator/bufferWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferWhen.js","sources":["../src/operator/bufferWhen.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operator/catch.d.ts b/node_modules/rxjs/operator/catch.d.ts
deleted file mode 100644
index 39c2412..0000000
--- a/node_modules/rxjs/operator/catch.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/catch';
diff --git a/node_modules/rxjs/operator/catch.js b/node_modules/rxjs/operator/catch.js
deleted file mode 100644
index f9bfb59..0000000
--- a/node_modules/rxjs/operator/catch.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/catch"));
-//# sourceMappingURL=catch.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/catch.js.map b/node_modules/rxjs/operator/catch.js.map
deleted file mode 100644
index f72afa7..0000000
--- a/node_modules/rxjs/operator/catch.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"catch.js","sources":["../src/operator/catch.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operator/combineAll.d.ts b/node_modules/rxjs/operator/combineAll.d.ts
deleted file mode 100644
index 47ead4a..0000000
--- a/node_modules/rxjs/operator/combineAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/combineAll';
diff --git a/node_modules/rxjs/operator/combineAll.js b/node_modules/rxjs/operator/combineAll.js
deleted file mode 100644
index febfab5..0000000
--- a/node_modules/rxjs/operator/combineAll.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/combineAll"));
-//# sourceMappingURL=combineAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/combineAll.js.map b/node_modules/rxjs/operator/combineAll.js.map
deleted file mode 100644
index 5826513..0000000
--- a/node_modules/rxjs/operator/combineAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineAll.js","sources":["../src/operator/combineAll.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operator/combineLatest.d.ts b/node_modules/rxjs/operator/combineLatest.d.ts
deleted file mode 100644
index 5719796..0000000
--- a/node_modules/rxjs/operator/combineLatest.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/combineLatest';
diff --git a/node_modules/rxjs/operator/combineLatest.js b/node_modules/rxjs/operator/combineLatest.js
deleted file mode 100644
index 1ab3ad1..0000000
--- a/node_modules/rxjs/operator/combineLatest.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/combineLatest"));
-//# sourceMappingURL=combineLatest.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/combineLatest.js.map b/node_modules/rxjs/operator/combineLatest.js.map
deleted file mode 100644
index 776b9c6..0000000
--- a/node_modules/rxjs/operator/combineLatest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineLatest.js","sources":["../src/operator/combineLatest.ts"],"names":[],"mappings":";;;;;AAAA,wDAAmD"}
diff --git a/node_modules/rxjs/operator/concat.d.ts b/node_modules/rxjs/operator/concat.d.ts
deleted file mode 100644
index 7937d7a..0000000
--- a/node_modules/rxjs/operator/concat.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/concat';
diff --git a/node_modules/rxjs/operator/concat.js b/node_modules/rxjs/operator/concat.js
deleted file mode 100644
index 5ab71fa..0000000
--- a/node_modules/rxjs/operator/concat.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/concat"));
-//# sourceMappingURL=concat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/concat.js.map b/node_modules/rxjs/operator/concat.js.map
deleted file mode 100644
index 64da967..0000000
--- a/node_modules/rxjs/operator/concat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concat.js","sources":["../src/operator/concat.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operator/concatAll.d.ts b/node_modules/rxjs/operator/concatAll.d.ts
deleted file mode 100644
index ac3f202..0000000
--- a/node_modules/rxjs/operator/concatAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/concatAll';
diff --git a/node_modules/rxjs/operator/concatAll.js b/node_modules/rxjs/operator/concatAll.js
deleted file mode 100644
index c7bedea..0000000
--- a/node_modules/rxjs/operator/concatAll.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/concatAll"));
-//# sourceMappingURL=concatAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/concatAll.js.map b/node_modules/rxjs/operator/concatAll.js.map
deleted file mode 100644
index 7567e9e..0000000
--- a/node_modules/rxjs/operator/concatAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatAll.js","sources":["../src/operator/concatAll.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/concatMap.d.ts b/node_modules/rxjs/operator/concatMap.d.ts
deleted file mode 100644
index 96cf01f..0000000
--- a/node_modules/rxjs/operator/concatMap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/concatMap';
diff --git a/node_modules/rxjs/operator/concatMap.js b/node_modules/rxjs/operator/concatMap.js
deleted file mode 100644
index 80fa956..0000000
--- a/node_modules/rxjs/operator/concatMap.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/concatMap"));
-//# sourceMappingURL=concatMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/concatMap.js.map b/node_modules/rxjs/operator/concatMap.js.map
deleted file mode 100644
index 6ea83a3..0000000
--- a/node_modules/rxjs/operator/concatMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatMap.js","sources":["../src/operator/concatMap.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/concatMapTo.d.ts b/node_modules/rxjs/operator/concatMapTo.d.ts
deleted file mode 100644
index ccc3cd5..0000000
--- a/node_modules/rxjs/operator/concatMapTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/concatMapTo';
diff --git a/node_modules/rxjs/operator/concatMapTo.js b/node_modules/rxjs/operator/concatMapTo.js
deleted file mode 100644
index 1af3dbc..0000000
--- a/node_modules/rxjs/operator/concatMapTo.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/concatMapTo"));
-//# sourceMappingURL=concatMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/concatMapTo.js.map b/node_modules/rxjs/operator/concatMapTo.js.map
deleted file mode 100644
index 44c0185..0000000
--- a/node_modules/rxjs/operator/concatMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatMapTo.js","sources":["../src/operator/concatMapTo.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operator/count.d.ts b/node_modules/rxjs/operator/count.d.ts
deleted file mode 100644
index d9b4699..0000000
--- a/node_modules/rxjs/operator/count.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/count';
diff --git a/node_modules/rxjs/operator/count.js b/node_modules/rxjs/operator/count.js
deleted file mode 100644
index dced2d3..0000000
--- a/node_modules/rxjs/operator/count.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/count"));
-//# sourceMappingURL=count.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/count.js.map b/node_modules/rxjs/operator/count.js.map
deleted file mode 100644
index 8464a9f..0000000
--- a/node_modules/rxjs/operator/count.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"count.js","sources":["../src/operator/count.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operator/debounce.d.ts b/node_modules/rxjs/operator/debounce.d.ts
deleted file mode 100644
index 69fffd9..0000000
--- a/node_modules/rxjs/operator/debounce.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/debounce';
diff --git a/node_modules/rxjs/operator/debounce.js b/node_modules/rxjs/operator/debounce.js
deleted file mode 100644
index f79e230..0000000
--- a/node_modules/rxjs/operator/debounce.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/debounce"));
-//# sourceMappingURL=debounce.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/debounce.js.map b/node_modules/rxjs/operator/debounce.js.map
deleted file mode 100644
index a79e6ac..0000000
--- a/node_modules/rxjs/operator/debounce.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounce.js","sources":["../src/operator/debounce.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operator/debounceTime.d.ts b/node_modules/rxjs/operator/debounceTime.d.ts
deleted file mode 100644
index 5e51c65..0000000
--- a/node_modules/rxjs/operator/debounceTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/debounceTime';
diff --git a/node_modules/rxjs/operator/debounceTime.js b/node_modules/rxjs/operator/debounceTime.js
deleted file mode 100644
index 547fcf8..0000000
--- a/node_modules/rxjs/operator/debounceTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/debounceTime"));
-//# sourceMappingURL=debounceTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/debounceTime.js.map b/node_modules/rxjs/operator/debounceTime.js.map
deleted file mode 100644
index 1d4370b..0000000
--- a/node_modules/rxjs/operator/debounceTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounceTime.js","sources":["../src/operator/debounceTime.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operator/defaultIfEmpty.d.ts b/node_modules/rxjs/operator/defaultIfEmpty.d.ts
deleted file mode 100644
index 6f5c620..0000000
--- a/node_modules/rxjs/operator/defaultIfEmpty.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/defaultIfEmpty';
diff --git a/node_modules/rxjs/operator/defaultIfEmpty.js b/node_modules/rxjs/operator/defaultIfEmpty.js
deleted file mode 100644
index 136ea11..0000000
--- a/node_modules/rxjs/operator/defaultIfEmpty.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/defaultIfEmpty"));
-//# sourceMappingURL=defaultIfEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/defaultIfEmpty.js.map b/node_modules/rxjs/operator/defaultIfEmpty.js.map
deleted file mode 100644
index df88f6c..0000000
--- a/node_modules/rxjs/operator/defaultIfEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"defaultIfEmpty.js","sources":["../src/operator/defaultIfEmpty.ts"],"names":[],"mappings":";;;;;AAAA,yDAAoD"}
diff --git a/node_modules/rxjs/operator/delay.d.ts b/node_modules/rxjs/operator/delay.d.ts
deleted file mode 100644
index 823ded3..0000000
--- a/node_modules/rxjs/operator/delay.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/delay';
diff --git a/node_modules/rxjs/operator/delay.js b/node_modules/rxjs/operator/delay.js
deleted file mode 100644
index e5ac4f4..0000000
--- a/node_modules/rxjs/operator/delay.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/delay"));
-//# sourceMappingURL=delay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/delay.js.map b/node_modules/rxjs/operator/delay.js.map
deleted file mode 100644
index 0bde8f5..0000000
--- a/node_modules/rxjs/operator/delay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"delay.js","sources":["../src/operator/delay.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operator/delayWhen.d.ts b/node_modules/rxjs/operator/delayWhen.d.ts
deleted file mode 100644
index b28322a..0000000
--- a/node_modules/rxjs/operator/delayWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/delayWhen';
diff --git a/node_modules/rxjs/operator/delayWhen.js b/node_modules/rxjs/operator/delayWhen.js
deleted file mode 100644
index afe0bf4..0000000
--- a/node_modules/rxjs/operator/delayWhen.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/delayWhen"));
-//# sourceMappingURL=delayWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/delayWhen.js.map b/node_modules/rxjs/operator/delayWhen.js.map
deleted file mode 100644
index 994f496..0000000
--- a/node_modules/rxjs/operator/delayWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"delayWhen.js","sources":["../src/operator/delayWhen.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/dematerialize.d.ts b/node_modules/rxjs/operator/dematerialize.d.ts
deleted file mode 100644
index 83f8da9..0000000
--- a/node_modules/rxjs/operator/dematerialize.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/dematerialize';
diff --git a/node_modules/rxjs/operator/dematerialize.js b/node_modules/rxjs/operator/dematerialize.js
deleted file mode 100644
index 2092fd4..0000000
--- a/node_modules/rxjs/operator/dematerialize.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/dematerialize"));
-//# sourceMappingURL=dematerialize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/dematerialize.js.map b/node_modules/rxjs/operator/dematerialize.js.map
deleted file mode 100644
index 75c1c99..0000000
--- a/node_modules/rxjs/operator/dematerialize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"dematerialize.js","sources":["../src/operator/dematerialize.ts"],"names":[],"mappings":";;;;;AAAA,wDAAmD"}
diff --git a/node_modules/rxjs/operator/distinct.d.ts b/node_modules/rxjs/operator/distinct.d.ts
deleted file mode 100644
index b97b8ee..0000000
--- a/node_modules/rxjs/operator/distinct.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/distinct';
diff --git a/node_modules/rxjs/operator/distinct.js b/node_modules/rxjs/operator/distinct.js
deleted file mode 100644
index 5c8afd9..0000000
--- a/node_modules/rxjs/operator/distinct.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/distinct"));
-//# sourceMappingURL=distinct.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/distinct.js.map b/node_modules/rxjs/operator/distinct.js.map
deleted file mode 100644
index 7e21988..0000000
--- a/node_modules/rxjs/operator/distinct.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinct.js","sources":["../src/operator/distinct.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operator/distinctUntilChanged.d.ts b/node_modules/rxjs/operator/distinctUntilChanged.d.ts
deleted file mode 100644
index 3a5bbc3..0000000
--- a/node_modules/rxjs/operator/distinctUntilChanged.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/distinctUntilChanged';
diff --git a/node_modules/rxjs/operator/distinctUntilChanged.js b/node_modules/rxjs/operator/distinctUntilChanged.js
deleted file mode 100644
index 846fb6c..0000000
--- a/node_modules/rxjs/operator/distinctUntilChanged.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/distinctUntilChanged"));
-//# sourceMappingURL=distinctUntilChanged.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/distinctUntilChanged.js.map b/node_modules/rxjs/operator/distinctUntilChanged.js.map
deleted file mode 100644
index 2b851f7..0000000
--- a/node_modules/rxjs/operator/distinctUntilChanged.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinctUntilChanged.js","sources":["../src/operator/distinctUntilChanged.ts"],"names":[],"mappings":";;;;;AAAA,+DAA0D"}
diff --git a/node_modules/rxjs/operator/distinctUntilKeyChanged.d.ts b/node_modules/rxjs/operator/distinctUntilKeyChanged.d.ts
deleted file mode 100644
index 22d42b1..0000000
--- a/node_modules/rxjs/operator/distinctUntilKeyChanged.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/distinctUntilKeyChanged';
diff --git a/node_modules/rxjs/operator/distinctUntilKeyChanged.js b/node_modules/rxjs/operator/distinctUntilKeyChanged.js
deleted file mode 100644
index c6e9dbd..0000000
--- a/node_modules/rxjs/operator/distinctUntilKeyChanged.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/distinctUntilKeyChanged"));
-//# sourceMappingURL=distinctUntilKeyChanged.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/distinctUntilKeyChanged.js.map b/node_modules/rxjs/operator/distinctUntilKeyChanged.js.map
deleted file mode 100644
index 5fb6b8d..0000000
--- a/node_modules/rxjs/operator/distinctUntilKeyChanged.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinctUntilKeyChanged.js","sources":["../src/operator/distinctUntilKeyChanged.ts"],"names":[],"mappings":";;;;;AAAA,kEAA6D"}
diff --git a/node_modules/rxjs/operator/do.d.ts b/node_modules/rxjs/operator/do.d.ts
deleted file mode 100644
index 3b3a79b..0000000
--- a/node_modules/rxjs/operator/do.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/do';
diff --git a/node_modules/rxjs/operator/do.js b/node_modules/rxjs/operator/do.js
deleted file mode 100644
index 27b13bb..0000000
--- a/node_modules/rxjs/operator/do.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/do"));
-//# sourceMappingURL=do.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/do.js.map b/node_modules/rxjs/operator/do.js.map
deleted file mode 100644
index e4984e8..0000000
--- a/node_modules/rxjs/operator/do.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"do.js","sources":["../src/operator/do.ts"],"names":[],"mappings":";;;;;AAAA,6CAAwC"}
diff --git a/node_modules/rxjs/operator/elementAt.d.ts b/node_modules/rxjs/operator/elementAt.d.ts
deleted file mode 100644
index bcdf798..0000000
--- a/node_modules/rxjs/operator/elementAt.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/elementAt';
diff --git a/node_modules/rxjs/operator/elementAt.js b/node_modules/rxjs/operator/elementAt.js
deleted file mode 100644
index 8536820..0000000
--- a/node_modules/rxjs/operator/elementAt.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/elementAt"));
-//# sourceMappingURL=elementAt.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/elementAt.js.map b/node_modules/rxjs/operator/elementAt.js.map
deleted file mode 100644
index e293593..0000000
--- a/node_modules/rxjs/operator/elementAt.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"elementAt.js","sources":["../src/operator/elementAt.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/every.d.ts b/node_modules/rxjs/operator/every.d.ts
deleted file mode 100644
index af7e790..0000000
--- a/node_modules/rxjs/operator/every.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/every';
diff --git a/node_modules/rxjs/operator/every.js b/node_modules/rxjs/operator/every.js
deleted file mode 100644
index 44ae6ea..0000000
--- a/node_modules/rxjs/operator/every.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/every"));
-//# sourceMappingURL=every.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/every.js.map b/node_modules/rxjs/operator/every.js.map
deleted file mode 100644
index b205b7c..0000000
--- a/node_modules/rxjs/operator/every.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"every.js","sources":["../src/operator/every.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operator/exhaust.d.ts b/node_modules/rxjs/operator/exhaust.d.ts
deleted file mode 100644
index 7af3d2f..0000000
--- a/node_modules/rxjs/operator/exhaust.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/exhaust';
diff --git a/node_modules/rxjs/operator/exhaust.js b/node_modules/rxjs/operator/exhaust.js
deleted file mode 100644
index 20713a3..0000000
--- a/node_modules/rxjs/operator/exhaust.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/exhaust"));
-//# sourceMappingURL=exhaust.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/exhaust.js.map b/node_modules/rxjs/operator/exhaust.js.map
deleted file mode 100644
index 339cfeb..0000000
--- a/node_modules/rxjs/operator/exhaust.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exhaust.js","sources":["../src/operator/exhaust.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operator/exhaustMap.d.ts b/node_modules/rxjs/operator/exhaustMap.d.ts
deleted file mode 100644
index 822438a..0000000
--- a/node_modules/rxjs/operator/exhaustMap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/exhaustMap';
diff --git a/node_modules/rxjs/operator/exhaustMap.js b/node_modules/rxjs/operator/exhaustMap.js
deleted file mode 100644
index 203ff36..0000000
--- a/node_modules/rxjs/operator/exhaustMap.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/exhaustMap"));
-//# sourceMappingURL=exhaustMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/exhaustMap.js.map b/node_modules/rxjs/operator/exhaustMap.js.map
deleted file mode 100644
index 62db5c3..0000000
--- a/node_modules/rxjs/operator/exhaustMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exhaustMap.js","sources":["../src/operator/exhaustMap.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operator/expand.d.ts b/node_modules/rxjs/operator/expand.d.ts
deleted file mode 100644
index 11df701..0000000
--- a/node_modules/rxjs/operator/expand.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/expand';
diff --git a/node_modules/rxjs/operator/expand.js b/node_modules/rxjs/operator/expand.js
deleted file mode 100644
index 9068f9d..0000000
--- a/node_modules/rxjs/operator/expand.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/expand"));
-//# sourceMappingURL=expand.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/expand.js.map b/node_modules/rxjs/operator/expand.js.map
deleted file mode 100644
index 339c0f2..0000000
--- a/node_modules/rxjs/operator/expand.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"expand.js","sources":["../src/operator/expand.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operator/filter.d.ts b/node_modules/rxjs/operator/filter.d.ts
deleted file mode 100644
index ccc2f24..0000000
--- a/node_modules/rxjs/operator/filter.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/filter';
diff --git a/node_modules/rxjs/operator/filter.js b/node_modules/rxjs/operator/filter.js
deleted file mode 100644
index 9c52bd7..0000000
--- a/node_modules/rxjs/operator/filter.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/filter"));
-//# sourceMappingURL=filter.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/filter.js.map b/node_modules/rxjs/operator/filter.js.map
deleted file mode 100644
index 6caec4d..0000000
--- a/node_modules/rxjs/operator/filter.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"filter.js","sources":["../src/operator/filter.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operator/finally.d.ts b/node_modules/rxjs/operator/finally.d.ts
deleted file mode 100644
index a21b3e1..0000000
--- a/node_modules/rxjs/operator/finally.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/finally';
diff --git a/node_modules/rxjs/operator/finally.js b/node_modules/rxjs/operator/finally.js
deleted file mode 100644
index ab766d9..0000000
--- a/node_modules/rxjs/operator/finally.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/finally"));
-//# sourceMappingURL=finally.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/finally.js.map b/node_modules/rxjs/operator/finally.js.map
deleted file mode 100644
index 5454dfb..0000000
--- a/node_modules/rxjs/operator/finally.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"finally.js","sources":["../src/operator/finally.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operator/find.d.ts b/node_modules/rxjs/operator/find.d.ts
deleted file mode 100644
index face44b..0000000
--- a/node_modules/rxjs/operator/find.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/find';
diff --git a/node_modules/rxjs/operator/find.js b/node_modules/rxjs/operator/find.js
deleted file mode 100644
index 03d1ccd..0000000
--- a/node_modules/rxjs/operator/find.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/find"));
-//# sourceMappingURL=find.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/find.js.map b/node_modules/rxjs/operator/find.js.map
deleted file mode 100644
index 1da869d..0000000
--- a/node_modules/rxjs/operator/find.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"find.js","sources":["../src/operator/find.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/operator/findIndex.d.ts b/node_modules/rxjs/operator/findIndex.d.ts
deleted file mode 100644
index dd0297a..0000000
--- a/node_modules/rxjs/operator/findIndex.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/findIndex';
diff --git a/node_modules/rxjs/operator/findIndex.js b/node_modules/rxjs/operator/findIndex.js
deleted file mode 100644
index 94311e3..0000000
--- a/node_modules/rxjs/operator/findIndex.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/findIndex"));
-//# sourceMappingURL=findIndex.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/findIndex.js.map b/node_modules/rxjs/operator/findIndex.js.map
deleted file mode 100644
index a69337e..0000000
--- a/node_modules/rxjs/operator/findIndex.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"findIndex.js","sources":["../src/operator/findIndex.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/first.d.ts b/node_modules/rxjs/operator/first.d.ts
deleted file mode 100644
index 86843ed..0000000
--- a/node_modules/rxjs/operator/first.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/first';
diff --git a/node_modules/rxjs/operator/first.js b/node_modules/rxjs/operator/first.js
deleted file mode 100644
index 051ee8e..0000000
--- a/node_modules/rxjs/operator/first.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/first"));
-//# sourceMappingURL=first.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/first.js.map b/node_modules/rxjs/operator/first.js.map
deleted file mode 100644
index cdadf42..0000000
--- a/node_modules/rxjs/operator/first.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"first.js","sources":["../src/operator/first.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operator/groupBy.d.ts b/node_modules/rxjs/operator/groupBy.d.ts
deleted file mode 100644
index 648fac9..0000000
--- a/node_modules/rxjs/operator/groupBy.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/groupBy';
diff --git a/node_modules/rxjs/operator/groupBy.js b/node_modules/rxjs/operator/groupBy.js
deleted file mode 100644
index 4bb164a..0000000
--- a/node_modules/rxjs/operator/groupBy.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/groupBy"));
-//# sourceMappingURL=groupBy.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/groupBy.js.map b/node_modules/rxjs/operator/groupBy.js.map
deleted file mode 100644
index 64094ed..0000000
--- a/node_modules/rxjs/operator/groupBy.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"groupBy.js","sources":["../src/operator/groupBy.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operator/ignoreElements.d.ts b/node_modules/rxjs/operator/ignoreElements.d.ts
deleted file mode 100644
index b9c3eef..0000000
--- a/node_modules/rxjs/operator/ignoreElements.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/ignoreElements';
diff --git a/node_modules/rxjs/operator/ignoreElements.js b/node_modules/rxjs/operator/ignoreElements.js
deleted file mode 100644
index 99e70f5..0000000
--- a/node_modules/rxjs/operator/ignoreElements.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/ignoreElements"));
-//# sourceMappingURL=ignoreElements.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/ignoreElements.js.map b/node_modules/rxjs/operator/ignoreElements.js.map
deleted file mode 100644
index f5c6715..0000000
--- a/node_modules/rxjs/operator/ignoreElements.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ignoreElements.js","sources":["../src/operator/ignoreElements.ts"],"names":[],"mappings":";;;;;AAAA,yDAAoD"}
diff --git a/node_modules/rxjs/operator/isEmpty.d.ts b/node_modules/rxjs/operator/isEmpty.d.ts
deleted file mode 100644
index 03da532..0000000
--- a/node_modules/rxjs/operator/isEmpty.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/isEmpty';
diff --git a/node_modules/rxjs/operator/isEmpty.js b/node_modules/rxjs/operator/isEmpty.js
deleted file mode 100644
index ccdc3f3..0000000
--- a/node_modules/rxjs/operator/isEmpty.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/isEmpty"));
-//# sourceMappingURL=isEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/isEmpty.js.map b/node_modules/rxjs/operator/isEmpty.js.map
deleted file mode 100644
index f321f6d..0000000
--- a/node_modules/rxjs/operator/isEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isEmpty.js","sources":["../src/operator/isEmpty.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operator/last.d.ts b/node_modules/rxjs/operator/last.d.ts
deleted file mode 100644
index 2d42da8..0000000
--- a/node_modules/rxjs/operator/last.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/last';
diff --git a/node_modules/rxjs/operator/last.js b/node_modules/rxjs/operator/last.js
deleted file mode 100644
index f2e9c4d..0000000
--- a/node_modules/rxjs/operator/last.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/last"));
-//# sourceMappingURL=last.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/last.js.map b/node_modules/rxjs/operator/last.js.map
deleted file mode 100644
index df2ee70..0000000
--- a/node_modules/rxjs/operator/last.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"last.js","sources":["../src/operator/last.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/operator/let.d.ts b/node_modules/rxjs/operator/let.d.ts
deleted file mode 100644
index 0f25011..0000000
--- a/node_modules/rxjs/operator/let.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/let';
diff --git a/node_modules/rxjs/operator/let.js b/node_modules/rxjs/operator/let.js
deleted file mode 100644
index 0d9ac56..0000000
--- a/node_modules/rxjs/operator/let.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/let"));
-//# sourceMappingURL=let.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/let.js.map b/node_modules/rxjs/operator/let.js.map
deleted file mode 100644
index cec78e6..0000000
--- a/node_modules/rxjs/operator/let.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"let.js","sources":["../src/operator/let.ts"],"names":[],"mappings":";;;;;AAAA,8CAAyC"}
diff --git a/node_modules/rxjs/operator/map.d.ts b/node_modules/rxjs/operator/map.d.ts
deleted file mode 100644
index 00af2a0..0000000
--- a/node_modules/rxjs/operator/map.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/map';
diff --git a/node_modules/rxjs/operator/map.js b/node_modules/rxjs/operator/map.js
deleted file mode 100644
index 00a3de5..0000000
--- a/node_modules/rxjs/operator/map.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/map"));
-//# sourceMappingURL=map.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/map.js.map b/node_modules/rxjs/operator/map.js.map
deleted file mode 100644
index 2e5a328..0000000
--- a/node_modules/rxjs/operator/map.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"map.js","sources":["../src/operator/map.ts"],"names":[],"mappings":";;;;;AAAA,8CAAyC"}
diff --git a/node_modules/rxjs/operator/mapTo.d.ts b/node_modules/rxjs/operator/mapTo.d.ts
deleted file mode 100644
index ad51274..0000000
--- a/node_modules/rxjs/operator/mapTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/mapTo';
diff --git a/node_modules/rxjs/operator/mapTo.js b/node_modules/rxjs/operator/mapTo.js
deleted file mode 100644
index bd36257..0000000
--- a/node_modules/rxjs/operator/mapTo.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/mapTo"));
-//# sourceMappingURL=mapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/mapTo.js.map b/node_modules/rxjs/operator/mapTo.js.map
deleted file mode 100644
index 4e0bb6d..0000000
--- a/node_modules/rxjs/operator/mapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mapTo.js","sources":["../src/operator/mapTo.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operator/materialize.d.ts b/node_modules/rxjs/operator/materialize.d.ts
deleted file mode 100644
index 57d501d..0000000
--- a/node_modules/rxjs/operator/materialize.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/materialize';
diff --git a/node_modules/rxjs/operator/materialize.js b/node_modules/rxjs/operator/materialize.js
deleted file mode 100644
index f9de722..0000000
--- a/node_modules/rxjs/operator/materialize.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/materialize"));
-//# sourceMappingURL=materialize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/materialize.js.map b/node_modules/rxjs/operator/materialize.js.map
deleted file mode 100644
index 8609265..0000000
--- a/node_modules/rxjs/operator/materialize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"materialize.js","sources":["../src/operator/materialize.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operator/max.d.ts b/node_modules/rxjs/operator/max.d.ts
deleted file mode 100644
index e7efcd7..0000000
--- a/node_modules/rxjs/operator/max.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/max';
diff --git a/node_modules/rxjs/operator/max.js b/node_modules/rxjs/operator/max.js
deleted file mode 100644
index abbad54..0000000
--- a/node_modules/rxjs/operator/max.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/max"));
-//# sourceMappingURL=max.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/max.js.map b/node_modules/rxjs/operator/max.js.map
deleted file mode 100644
index c359d66..0000000
--- a/node_modules/rxjs/operator/max.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"max.js","sources":["../src/operator/max.ts"],"names":[],"mappings":";;;;;AAAA,8CAAyC"}
diff --git a/node_modules/rxjs/operator/merge.d.ts b/node_modules/rxjs/operator/merge.d.ts
deleted file mode 100644
index 039a0d2..0000000
--- a/node_modules/rxjs/operator/merge.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/merge';
diff --git a/node_modules/rxjs/operator/merge.js b/node_modules/rxjs/operator/merge.js
deleted file mode 100644
index 00b6dc4..0000000
--- a/node_modules/rxjs/operator/merge.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/merge"));
-//# sourceMappingURL=merge.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/merge.js.map b/node_modules/rxjs/operator/merge.js.map
deleted file mode 100644
index 78f822b..0000000
--- a/node_modules/rxjs/operator/merge.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"merge.js","sources":["../src/operator/merge.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operator/mergeAll.d.ts b/node_modules/rxjs/operator/mergeAll.d.ts
deleted file mode 100644
index 1527cc9..0000000
--- a/node_modules/rxjs/operator/mergeAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/mergeAll';
diff --git a/node_modules/rxjs/operator/mergeAll.js b/node_modules/rxjs/operator/mergeAll.js
deleted file mode 100644
index a989c61..0000000
--- a/node_modules/rxjs/operator/mergeAll.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/mergeAll"));
-//# sourceMappingURL=mergeAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/mergeAll.js.map b/node_modules/rxjs/operator/mergeAll.js.map
deleted file mode 100644
index 20c167c..0000000
--- a/node_modules/rxjs/operator/mergeAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeAll.js","sources":["../src/operator/mergeAll.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operator/mergeMap.d.ts b/node_modules/rxjs/operator/mergeMap.d.ts
deleted file mode 100644
index d091762..0000000
--- a/node_modules/rxjs/operator/mergeMap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/mergeMap';
diff --git a/node_modules/rxjs/operator/mergeMap.js b/node_modules/rxjs/operator/mergeMap.js
deleted file mode 100644
index f980c46..0000000
--- a/node_modules/rxjs/operator/mergeMap.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/mergeMap"));
-//# sourceMappingURL=mergeMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/mergeMap.js.map b/node_modules/rxjs/operator/mergeMap.js.map
deleted file mode 100644
index c371a3a..0000000
--- a/node_modules/rxjs/operator/mergeMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeMap.js","sources":["../src/operator/mergeMap.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operator/mergeMapTo.d.ts b/node_modules/rxjs/operator/mergeMapTo.d.ts
deleted file mode 100644
index 2503ab4..0000000
--- a/node_modules/rxjs/operator/mergeMapTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/mergeMapTo';
diff --git a/node_modules/rxjs/operator/mergeMapTo.js b/node_modules/rxjs/operator/mergeMapTo.js
deleted file mode 100644
index 949cc81..0000000
--- a/node_modules/rxjs/operator/mergeMapTo.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/mergeMapTo"));
-//# sourceMappingURL=mergeMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/mergeMapTo.js.map b/node_modules/rxjs/operator/mergeMapTo.js.map
deleted file mode 100644
index 78c2f57..0000000
--- a/node_modules/rxjs/operator/mergeMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeMapTo.js","sources":["../src/operator/mergeMapTo.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operator/mergeScan.d.ts b/node_modules/rxjs/operator/mergeScan.d.ts
deleted file mode 100644
index f8fd1be..0000000
--- a/node_modules/rxjs/operator/mergeScan.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/mergeScan';
diff --git a/node_modules/rxjs/operator/mergeScan.js b/node_modules/rxjs/operator/mergeScan.js
deleted file mode 100644
index 1f004ab..0000000
--- a/node_modules/rxjs/operator/mergeScan.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/mergeScan"));
-//# sourceMappingURL=mergeScan.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/mergeScan.js.map b/node_modules/rxjs/operator/mergeScan.js.map
deleted file mode 100644
index 83e1600..0000000
--- a/node_modules/rxjs/operator/mergeScan.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeScan.js","sources":["../src/operator/mergeScan.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/min.d.ts b/node_modules/rxjs/operator/min.d.ts
deleted file mode 100644
index b082666..0000000
--- a/node_modules/rxjs/operator/min.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/min';
diff --git a/node_modules/rxjs/operator/min.js b/node_modules/rxjs/operator/min.js
deleted file mode 100644
index 16a81e6..0000000
--- a/node_modules/rxjs/operator/min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/min"));
-//# sourceMappingURL=min.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/min.js.map b/node_modules/rxjs/operator/min.js.map
deleted file mode 100644
index 645b413..0000000
--- a/node_modules/rxjs/operator/min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"min.js","sources":["../src/operator/min.ts"],"names":[],"mappings":";;;;;AAAA,8CAAyC"}
diff --git a/node_modules/rxjs/operator/multicast.d.ts b/node_modules/rxjs/operator/multicast.d.ts
deleted file mode 100644
index 16822ab..0000000
--- a/node_modules/rxjs/operator/multicast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/multicast';
diff --git a/node_modules/rxjs/operator/multicast.js b/node_modules/rxjs/operator/multicast.js
deleted file mode 100644
index f3fca31..0000000
--- a/node_modules/rxjs/operator/multicast.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/multicast"));
-//# sourceMappingURL=multicast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/multicast.js.map b/node_modules/rxjs/operator/multicast.js.map
deleted file mode 100644
index 23aae0a..0000000
--- a/node_modules/rxjs/operator/multicast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"multicast.js","sources":["../src/operator/multicast.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/observeOn.d.ts b/node_modules/rxjs/operator/observeOn.d.ts
deleted file mode 100644
index 49d52cf..0000000
--- a/node_modules/rxjs/operator/observeOn.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/observeOn';
diff --git a/node_modules/rxjs/operator/observeOn.js b/node_modules/rxjs/operator/observeOn.js
deleted file mode 100644
index 2f7b797..0000000
--- a/node_modules/rxjs/operator/observeOn.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/observeOn"));
-//# sourceMappingURL=observeOn.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/observeOn.js.map b/node_modules/rxjs/operator/observeOn.js.map
deleted file mode 100644
index ebe37d5..0000000
--- a/node_modules/rxjs/operator/observeOn.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"observeOn.js","sources":["../src/operator/observeOn.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/onErrorResumeNext.d.ts b/node_modules/rxjs/operator/onErrorResumeNext.d.ts
deleted file mode 100644
index dee5c58..0000000
--- a/node_modules/rxjs/operator/onErrorResumeNext.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/onErrorResumeNext';
diff --git a/node_modules/rxjs/operator/onErrorResumeNext.js b/node_modules/rxjs/operator/onErrorResumeNext.js
deleted file mode 100644
index e6b1b6b..0000000
--- a/node_modules/rxjs/operator/onErrorResumeNext.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/onErrorResumeNext"));
-//# sourceMappingURL=onErrorResumeNext.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/onErrorResumeNext.js.map b/node_modules/rxjs/operator/onErrorResumeNext.js.map
deleted file mode 100644
index ff363fb..0000000
--- a/node_modules/rxjs/operator/onErrorResumeNext.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"onErrorResumeNext.js","sources":["../src/operator/onErrorResumeNext.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuD"}
diff --git a/node_modules/rxjs/operator/pairwise.d.ts b/node_modules/rxjs/operator/pairwise.d.ts
deleted file mode 100644
index 2db66e0..0000000
--- a/node_modules/rxjs/operator/pairwise.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/pairwise';
diff --git a/node_modules/rxjs/operator/pairwise.js b/node_modules/rxjs/operator/pairwise.js
deleted file mode 100644
index c65339a..0000000
--- a/node_modules/rxjs/operator/pairwise.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/pairwise"));
-//# sourceMappingURL=pairwise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/pairwise.js.map b/node_modules/rxjs/operator/pairwise.js.map
deleted file mode 100644
index 2bcd50d..0000000
--- a/node_modules/rxjs/operator/pairwise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pairwise.js","sources":["../src/operator/pairwise.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operator/partition.d.ts b/node_modules/rxjs/operator/partition.d.ts
deleted file mode 100644
index ffb693b..0000000
--- a/node_modules/rxjs/operator/partition.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/partition';
diff --git a/node_modules/rxjs/operator/partition.js b/node_modules/rxjs/operator/partition.js
deleted file mode 100644
index 5127c15..0000000
--- a/node_modules/rxjs/operator/partition.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/partition"));
-//# sourceMappingURL=partition.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/partition.js.map b/node_modules/rxjs/operator/partition.js.map
deleted file mode 100644
index 1a025ca..0000000
--- a/node_modules/rxjs/operator/partition.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"partition.js","sources":["../src/operator/partition.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/pluck.d.ts b/node_modules/rxjs/operator/pluck.d.ts
deleted file mode 100644
index cd308f2..0000000
--- a/node_modules/rxjs/operator/pluck.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/pluck';
diff --git a/node_modules/rxjs/operator/pluck.js b/node_modules/rxjs/operator/pluck.js
deleted file mode 100644
index 023f73d..0000000
--- a/node_modules/rxjs/operator/pluck.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/pluck"));
-//# sourceMappingURL=pluck.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/pluck.js.map b/node_modules/rxjs/operator/pluck.js.map
deleted file mode 100644
index 1dd7d98..0000000
--- a/node_modules/rxjs/operator/pluck.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pluck.js","sources":["../src/operator/pluck.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operator/publish.d.ts b/node_modules/rxjs/operator/publish.d.ts
deleted file mode 100644
index 44f7a52..0000000
--- a/node_modules/rxjs/operator/publish.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/publish';
diff --git a/node_modules/rxjs/operator/publish.js b/node_modules/rxjs/operator/publish.js
deleted file mode 100644
index d7ba991..0000000
--- a/node_modules/rxjs/operator/publish.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/publish"));
-//# sourceMappingURL=publish.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/publish.js.map b/node_modules/rxjs/operator/publish.js.map
deleted file mode 100644
index a28014f..0000000
--- a/node_modules/rxjs/operator/publish.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publish.js","sources":["../src/operator/publish.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operator/publishBehavior.d.ts b/node_modules/rxjs/operator/publishBehavior.d.ts
deleted file mode 100644
index ae6df51..0000000
--- a/node_modules/rxjs/operator/publishBehavior.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/publishBehavior';
diff --git a/node_modules/rxjs/operator/publishBehavior.js b/node_modules/rxjs/operator/publishBehavior.js
deleted file mode 100644
index c506071..0000000
--- a/node_modules/rxjs/operator/publishBehavior.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/publishBehavior"));
-//# sourceMappingURL=publishBehavior.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/publishBehavior.js.map b/node_modules/rxjs/operator/publishBehavior.js.map
deleted file mode 100644
index 2e06416..0000000
--- a/node_modules/rxjs/operator/publishBehavior.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishBehavior.js","sources":["../src/operator/publishBehavior.ts"],"names":[],"mappings":";;;;;AAAA,0DAAqD"}
diff --git a/node_modules/rxjs/operator/publishLast.d.ts b/node_modules/rxjs/operator/publishLast.d.ts
deleted file mode 100644
index b8b857f..0000000
--- a/node_modules/rxjs/operator/publishLast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/publishLast';
diff --git a/node_modules/rxjs/operator/publishLast.js b/node_modules/rxjs/operator/publishLast.js
deleted file mode 100644
index c627f74..0000000
--- a/node_modules/rxjs/operator/publishLast.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/publishLast"));
-//# sourceMappingURL=publishLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/publishLast.js.map b/node_modules/rxjs/operator/publishLast.js.map
deleted file mode 100644
index 7a5491e..0000000
--- a/node_modules/rxjs/operator/publishLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishLast.js","sources":["../src/operator/publishLast.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operator/publishReplay.d.ts b/node_modules/rxjs/operator/publishReplay.d.ts
deleted file mode 100644
index d515665..0000000
--- a/node_modules/rxjs/operator/publishReplay.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/publishReplay';
diff --git a/node_modules/rxjs/operator/publishReplay.js b/node_modules/rxjs/operator/publishReplay.js
deleted file mode 100644
index 5c1e4bd..0000000
--- a/node_modules/rxjs/operator/publishReplay.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/publishReplay"));
-//# sourceMappingURL=publishReplay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/publishReplay.js.map b/node_modules/rxjs/operator/publishReplay.js.map
deleted file mode 100644
index cc770ca..0000000
--- a/node_modules/rxjs/operator/publishReplay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishReplay.js","sources":["../src/operator/publishReplay.ts"],"names":[],"mappings":";;;;;AAAA,wDAAmD"}
diff --git a/node_modules/rxjs/operator/race.d.ts b/node_modules/rxjs/operator/race.d.ts
deleted file mode 100644
index 1371230..0000000
--- a/node_modules/rxjs/operator/race.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/race';
diff --git a/node_modules/rxjs/operator/race.js b/node_modules/rxjs/operator/race.js
deleted file mode 100644
index 038bf34..0000000
--- a/node_modules/rxjs/operator/race.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/race"));
-//# sourceMappingURL=race.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/race.js.map b/node_modules/rxjs/operator/race.js.map
deleted file mode 100644
index 374e415..0000000
--- a/node_modules/rxjs/operator/race.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"race.js","sources":["../src/operator/race.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/operator/reduce.d.ts b/node_modules/rxjs/operator/reduce.d.ts
deleted file mode 100644
index 3051a59..0000000
--- a/node_modules/rxjs/operator/reduce.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/reduce';
diff --git a/node_modules/rxjs/operator/reduce.js b/node_modules/rxjs/operator/reduce.js
deleted file mode 100644
index 47c6002..0000000
--- a/node_modules/rxjs/operator/reduce.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/reduce"));
-//# sourceMappingURL=reduce.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/reduce.js.map b/node_modules/rxjs/operator/reduce.js.map
deleted file mode 100644
index af7569e..0000000
--- a/node_modules/rxjs/operator/reduce.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"reduce.js","sources":["../src/operator/reduce.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operator/repeat.d.ts b/node_modules/rxjs/operator/repeat.d.ts
deleted file mode 100644
index 3cf8344..0000000
--- a/node_modules/rxjs/operator/repeat.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/repeat';
diff --git a/node_modules/rxjs/operator/repeat.js b/node_modules/rxjs/operator/repeat.js
deleted file mode 100644
index 8ab3b5a..0000000
--- a/node_modules/rxjs/operator/repeat.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/repeat"));
-//# sourceMappingURL=repeat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/repeat.js.map b/node_modules/rxjs/operator/repeat.js.map
deleted file mode 100644
index b1b305d..0000000
--- a/node_modules/rxjs/operator/repeat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"repeat.js","sources":["../src/operator/repeat.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operator/repeatWhen.d.ts b/node_modules/rxjs/operator/repeatWhen.d.ts
deleted file mode 100644
index c8ab403..0000000
--- a/node_modules/rxjs/operator/repeatWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/repeatWhen';
diff --git a/node_modules/rxjs/operator/repeatWhen.js b/node_modules/rxjs/operator/repeatWhen.js
deleted file mode 100644
index 1285196..0000000
--- a/node_modules/rxjs/operator/repeatWhen.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/repeatWhen"));
-//# sourceMappingURL=repeatWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/repeatWhen.js.map b/node_modules/rxjs/operator/repeatWhen.js.map
deleted file mode 100644
index 83becb3..0000000
--- a/node_modules/rxjs/operator/repeatWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"repeatWhen.js","sources":["../src/operator/repeatWhen.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operator/retry.d.ts b/node_modules/rxjs/operator/retry.d.ts
deleted file mode 100644
index ea76932..0000000
--- a/node_modules/rxjs/operator/retry.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/retry';
diff --git a/node_modules/rxjs/operator/retry.js b/node_modules/rxjs/operator/retry.js
deleted file mode 100644
index 7c8febb..0000000
--- a/node_modules/rxjs/operator/retry.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/retry"));
-//# sourceMappingURL=retry.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/retry.js.map b/node_modules/rxjs/operator/retry.js.map
deleted file mode 100644
index d27a262..0000000
--- a/node_modules/rxjs/operator/retry.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"retry.js","sources":["../src/operator/retry.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operator/retryWhen.d.ts b/node_modules/rxjs/operator/retryWhen.d.ts
deleted file mode 100644
index c1c4a4d..0000000
--- a/node_modules/rxjs/operator/retryWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/retryWhen';
diff --git a/node_modules/rxjs/operator/retryWhen.js b/node_modules/rxjs/operator/retryWhen.js
deleted file mode 100644
index 918d177..0000000
--- a/node_modules/rxjs/operator/retryWhen.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/retryWhen"));
-//# sourceMappingURL=retryWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/retryWhen.js.map b/node_modules/rxjs/operator/retryWhen.js.map
deleted file mode 100644
index e6126f6..0000000
--- a/node_modules/rxjs/operator/retryWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"retryWhen.js","sources":["../src/operator/retryWhen.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/sample.d.ts b/node_modules/rxjs/operator/sample.d.ts
deleted file mode 100644
index 50c4485..0000000
--- a/node_modules/rxjs/operator/sample.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/sample';
diff --git a/node_modules/rxjs/operator/sample.js b/node_modules/rxjs/operator/sample.js
deleted file mode 100644
index f0b65f7..0000000
--- a/node_modules/rxjs/operator/sample.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/sample"));
-//# sourceMappingURL=sample.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/sample.js.map b/node_modules/rxjs/operator/sample.js.map
deleted file mode 100644
index 1f24b84..0000000
--- a/node_modules/rxjs/operator/sample.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sample.js","sources":["../src/operator/sample.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operator/sampleTime.d.ts b/node_modules/rxjs/operator/sampleTime.d.ts
deleted file mode 100644
index 6a88266..0000000
--- a/node_modules/rxjs/operator/sampleTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/sampleTime';
diff --git a/node_modules/rxjs/operator/sampleTime.js b/node_modules/rxjs/operator/sampleTime.js
deleted file mode 100644
index b46e3b3..0000000
--- a/node_modules/rxjs/operator/sampleTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/sampleTime"));
-//# sourceMappingURL=sampleTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/sampleTime.js.map b/node_modules/rxjs/operator/sampleTime.js.map
deleted file mode 100644
index 383ebf0..0000000
--- a/node_modules/rxjs/operator/sampleTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sampleTime.js","sources":["../src/operator/sampleTime.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operator/scan.d.ts b/node_modules/rxjs/operator/scan.d.ts
deleted file mode 100644
index 07d5f63..0000000
--- a/node_modules/rxjs/operator/scan.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/scan';
diff --git a/node_modules/rxjs/operator/scan.js b/node_modules/rxjs/operator/scan.js
deleted file mode 100644
index 09347a2..0000000
--- a/node_modules/rxjs/operator/scan.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/scan"));
-//# sourceMappingURL=scan.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/scan.js.map b/node_modules/rxjs/operator/scan.js.map
deleted file mode 100644
index cec991e..0000000
--- a/node_modules/rxjs/operator/scan.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scan.js","sources":["../src/operator/scan.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/operator/sequenceEqual.d.ts b/node_modules/rxjs/operator/sequenceEqual.d.ts
deleted file mode 100644
index 8a324c2..0000000
--- a/node_modules/rxjs/operator/sequenceEqual.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/sequenceEqual';
diff --git a/node_modules/rxjs/operator/sequenceEqual.js b/node_modules/rxjs/operator/sequenceEqual.js
deleted file mode 100644
index 42e3723..0000000
--- a/node_modules/rxjs/operator/sequenceEqual.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/sequenceEqual"));
-//# sourceMappingURL=sequenceEqual.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/sequenceEqual.js.map b/node_modules/rxjs/operator/sequenceEqual.js.map
deleted file mode 100644
index 18a613d..0000000
--- a/node_modules/rxjs/operator/sequenceEqual.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sequenceEqual.js","sources":["../src/operator/sequenceEqual.ts"],"names":[],"mappings":";;;;;AAAA,wDAAmD"}
diff --git a/node_modules/rxjs/operator/share.d.ts b/node_modules/rxjs/operator/share.d.ts
deleted file mode 100644
index 7dcde39..0000000
--- a/node_modules/rxjs/operator/share.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/share';
diff --git a/node_modules/rxjs/operator/share.js b/node_modules/rxjs/operator/share.js
deleted file mode 100644
index d94a634..0000000
--- a/node_modules/rxjs/operator/share.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/share"));
-//# sourceMappingURL=share.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/share.js.map b/node_modules/rxjs/operator/share.js.map
deleted file mode 100644
index c5eb0b5..0000000
--- a/node_modules/rxjs/operator/share.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"share.js","sources":["../src/operator/share.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operator/shareReplay.d.ts b/node_modules/rxjs/operator/shareReplay.d.ts
deleted file mode 100644
index 7889029..0000000
--- a/node_modules/rxjs/operator/shareReplay.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/shareReplay';
diff --git a/node_modules/rxjs/operator/shareReplay.js b/node_modules/rxjs/operator/shareReplay.js
deleted file mode 100644
index d3a1717..0000000
--- a/node_modules/rxjs/operator/shareReplay.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/shareReplay"));
-//# sourceMappingURL=shareReplay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/shareReplay.js.map b/node_modules/rxjs/operator/shareReplay.js.map
deleted file mode 100644
index 9c032b9..0000000
--- a/node_modules/rxjs/operator/shareReplay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"shareReplay.js","sources":["../src/operator/shareReplay.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operator/single.d.ts b/node_modules/rxjs/operator/single.d.ts
deleted file mode 100644
index 0b289da..0000000
--- a/node_modules/rxjs/operator/single.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/single';
diff --git a/node_modules/rxjs/operator/single.js b/node_modules/rxjs/operator/single.js
deleted file mode 100644
index 0d9761e..0000000
--- a/node_modules/rxjs/operator/single.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/single"));
-//# sourceMappingURL=single.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/single.js.map b/node_modules/rxjs/operator/single.js.map
deleted file mode 100644
index 477a990..0000000
--- a/node_modules/rxjs/operator/single.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"single.js","sources":["../src/operator/single.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operator/skip.d.ts b/node_modules/rxjs/operator/skip.d.ts
deleted file mode 100644
index 830890c..0000000
--- a/node_modules/rxjs/operator/skip.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/skip';
diff --git a/node_modules/rxjs/operator/skip.js b/node_modules/rxjs/operator/skip.js
deleted file mode 100644
index 955b451..0000000
--- a/node_modules/rxjs/operator/skip.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/skip"));
-//# sourceMappingURL=skip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/skip.js.map b/node_modules/rxjs/operator/skip.js.map
deleted file mode 100644
index 31c1010..0000000
--- a/node_modules/rxjs/operator/skip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skip.js","sources":["../src/operator/skip.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/operator/skipLast.d.ts b/node_modules/rxjs/operator/skipLast.d.ts
deleted file mode 100644
index 504d7d7..0000000
--- a/node_modules/rxjs/operator/skipLast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/skipLast';
diff --git a/node_modules/rxjs/operator/skipLast.js b/node_modules/rxjs/operator/skipLast.js
deleted file mode 100644
index 3e7d601..0000000
--- a/node_modules/rxjs/operator/skipLast.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/skipLast"));
-//# sourceMappingURL=skipLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/skipLast.js.map b/node_modules/rxjs/operator/skipLast.js.map
deleted file mode 100644
index 1a84e51..0000000
--- a/node_modules/rxjs/operator/skipLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipLast.js","sources":["../src/operator/skipLast.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operator/skipUntil.d.ts b/node_modules/rxjs/operator/skipUntil.d.ts
deleted file mode 100644
index c942abc..0000000
--- a/node_modules/rxjs/operator/skipUntil.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/skipUntil';
diff --git a/node_modules/rxjs/operator/skipUntil.js b/node_modules/rxjs/operator/skipUntil.js
deleted file mode 100644
index b4e7b0e..0000000
--- a/node_modules/rxjs/operator/skipUntil.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/skipUntil"));
-//# sourceMappingURL=skipUntil.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/skipUntil.js.map b/node_modules/rxjs/operator/skipUntil.js.map
deleted file mode 100644
index 4b9a445..0000000
--- a/node_modules/rxjs/operator/skipUntil.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipUntil.js","sources":["../src/operator/skipUntil.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/skipWhile.d.ts b/node_modules/rxjs/operator/skipWhile.d.ts
deleted file mode 100644
index 1ec1baf..0000000
--- a/node_modules/rxjs/operator/skipWhile.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/skipWhile';
diff --git a/node_modules/rxjs/operator/skipWhile.js b/node_modules/rxjs/operator/skipWhile.js
deleted file mode 100644
index d737910..0000000
--- a/node_modules/rxjs/operator/skipWhile.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/skipWhile"));
-//# sourceMappingURL=skipWhile.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/skipWhile.js.map b/node_modules/rxjs/operator/skipWhile.js.map
deleted file mode 100644
index 89540c4..0000000
--- a/node_modules/rxjs/operator/skipWhile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipWhile.js","sources":["../src/operator/skipWhile.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/startWith.d.ts b/node_modules/rxjs/operator/startWith.d.ts
deleted file mode 100644
index 88b22fb..0000000
--- a/node_modules/rxjs/operator/startWith.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/startWith';
diff --git a/node_modules/rxjs/operator/startWith.js b/node_modules/rxjs/operator/startWith.js
deleted file mode 100644
index f4f88ab..0000000
--- a/node_modules/rxjs/operator/startWith.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/startWith"));
-//# sourceMappingURL=startWith.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/startWith.js.map b/node_modules/rxjs/operator/startWith.js.map
deleted file mode 100644
index c8c02e2..0000000
--- a/node_modules/rxjs/operator/startWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"startWith.js","sources":["../src/operator/startWith.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/subscribeOn.d.ts b/node_modules/rxjs/operator/subscribeOn.d.ts
deleted file mode 100644
index d5fe5c3..0000000
--- a/node_modules/rxjs/operator/subscribeOn.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/subscribeOn';
diff --git a/node_modules/rxjs/operator/subscribeOn.js b/node_modules/rxjs/operator/subscribeOn.js
deleted file mode 100644
index bd9c58c..0000000
--- a/node_modules/rxjs/operator/subscribeOn.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/subscribeOn"));
-//# sourceMappingURL=subscribeOn.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/subscribeOn.js.map b/node_modules/rxjs/operator/subscribeOn.js.map
deleted file mode 100644
index 359d96f..0000000
--- a/node_modules/rxjs/operator/subscribeOn.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeOn.js","sources":["../src/operator/subscribeOn.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operator/switch.d.ts b/node_modules/rxjs/operator/switch.d.ts
deleted file mode 100644
index 2cbae8f..0000000
--- a/node_modules/rxjs/operator/switch.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/switch';
diff --git a/node_modules/rxjs/operator/switch.js b/node_modules/rxjs/operator/switch.js
deleted file mode 100644
index d08843a..0000000
--- a/node_modules/rxjs/operator/switch.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/switch"));
-//# sourceMappingURL=switch.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/switch.js.map b/node_modules/rxjs/operator/switch.js.map
deleted file mode 100644
index 7967958..0000000
--- a/node_modules/rxjs/operator/switch.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switch.js","sources":["../src/operator/switch.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operator/switchMap.d.ts b/node_modules/rxjs/operator/switchMap.d.ts
deleted file mode 100644
index cd5ce95..0000000
--- a/node_modules/rxjs/operator/switchMap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/switchMap';
diff --git a/node_modules/rxjs/operator/switchMap.js b/node_modules/rxjs/operator/switchMap.js
deleted file mode 100644
index 5cca87e..0000000
--- a/node_modules/rxjs/operator/switchMap.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/switchMap"));
-//# sourceMappingURL=switchMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/switchMap.js.map b/node_modules/rxjs/operator/switchMap.js.map
deleted file mode 100644
index fc40d12..0000000
--- a/node_modules/rxjs/operator/switchMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchMap.js","sources":["../src/operator/switchMap.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/switchMapTo.d.ts b/node_modules/rxjs/operator/switchMapTo.d.ts
deleted file mode 100644
index bd59ce3..0000000
--- a/node_modules/rxjs/operator/switchMapTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/switchMapTo';
diff --git a/node_modules/rxjs/operator/switchMapTo.js b/node_modules/rxjs/operator/switchMapTo.js
deleted file mode 100644
index 855a06e..0000000
--- a/node_modules/rxjs/operator/switchMapTo.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/switchMapTo"));
-//# sourceMappingURL=switchMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/switchMapTo.js.map b/node_modules/rxjs/operator/switchMapTo.js.map
deleted file mode 100644
index d5f1d4b..0000000
--- a/node_modules/rxjs/operator/switchMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchMapTo.js","sources":["../src/operator/switchMapTo.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operator/take.d.ts b/node_modules/rxjs/operator/take.d.ts
deleted file mode 100644
index c915fc3..0000000
--- a/node_modules/rxjs/operator/take.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/take';
diff --git a/node_modules/rxjs/operator/take.js b/node_modules/rxjs/operator/take.js
deleted file mode 100644
index 71296c3..0000000
--- a/node_modules/rxjs/operator/take.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/take"));
-//# sourceMappingURL=take.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/take.js.map b/node_modules/rxjs/operator/take.js.map
deleted file mode 100644
index 44e394a..0000000
--- a/node_modules/rxjs/operator/take.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"take.js","sources":["../src/operator/take.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/operator/takeLast.d.ts b/node_modules/rxjs/operator/takeLast.d.ts
deleted file mode 100644
index 78509e5..0000000
--- a/node_modules/rxjs/operator/takeLast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/takeLast';
diff --git a/node_modules/rxjs/operator/takeLast.js b/node_modules/rxjs/operator/takeLast.js
deleted file mode 100644
index 0bc2a2b..0000000
--- a/node_modules/rxjs/operator/takeLast.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/takeLast"));
-//# sourceMappingURL=takeLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/takeLast.js.map b/node_modules/rxjs/operator/takeLast.js.map
deleted file mode 100644
index cb94a1c..0000000
--- a/node_modules/rxjs/operator/takeLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeLast.js","sources":["../src/operator/takeLast.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operator/takeUntil.d.ts b/node_modules/rxjs/operator/takeUntil.d.ts
deleted file mode 100644
index 38b927b..0000000
--- a/node_modules/rxjs/operator/takeUntil.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/takeUntil';
diff --git a/node_modules/rxjs/operator/takeUntil.js b/node_modules/rxjs/operator/takeUntil.js
deleted file mode 100644
index 107586c..0000000
--- a/node_modules/rxjs/operator/takeUntil.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/takeUntil"));
-//# sourceMappingURL=takeUntil.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/takeUntil.js.map b/node_modules/rxjs/operator/takeUntil.js.map
deleted file mode 100644
index f2d2c0b..0000000
--- a/node_modules/rxjs/operator/takeUntil.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeUntil.js","sources":["../src/operator/takeUntil.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/takeWhile.d.ts b/node_modules/rxjs/operator/takeWhile.d.ts
deleted file mode 100644
index b1772bd..0000000
--- a/node_modules/rxjs/operator/takeWhile.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/takeWhile';
diff --git a/node_modules/rxjs/operator/takeWhile.js b/node_modules/rxjs/operator/takeWhile.js
deleted file mode 100644
index 95bf169..0000000
--- a/node_modules/rxjs/operator/takeWhile.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/takeWhile"));
-//# sourceMappingURL=takeWhile.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/takeWhile.js.map b/node_modules/rxjs/operator/takeWhile.js.map
deleted file mode 100644
index f81cc02..0000000
--- a/node_modules/rxjs/operator/takeWhile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeWhile.js","sources":["../src/operator/takeWhile.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/throttle.d.ts b/node_modules/rxjs/operator/throttle.d.ts
deleted file mode 100644
index 9c2effc..0000000
--- a/node_modules/rxjs/operator/throttle.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/throttle';
diff --git a/node_modules/rxjs/operator/throttle.js b/node_modules/rxjs/operator/throttle.js
deleted file mode 100644
index 00ba913..0000000
--- a/node_modules/rxjs/operator/throttle.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/throttle"));
-//# sourceMappingURL=throttle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/throttle.js.map b/node_modules/rxjs/operator/throttle.js.map
deleted file mode 100644
index 52f17f5..0000000
--- a/node_modules/rxjs/operator/throttle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throttle.js","sources":["../src/operator/throttle.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operator/throttleTime.d.ts b/node_modules/rxjs/operator/throttleTime.d.ts
deleted file mode 100644
index 7385eb0..0000000
--- a/node_modules/rxjs/operator/throttleTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/throttleTime';
diff --git a/node_modules/rxjs/operator/throttleTime.js b/node_modules/rxjs/operator/throttleTime.js
deleted file mode 100644
index 27308d0..0000000
--- a/node_modules/rxjs/operator/throttleTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/throttleTime"));
-//# sourceMappingURL=throttleTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/throttleTime.js.map b/node_modules/rxjs/operator/throttleTime.js.map
deleted file mode 100644
index 136f9fe..0000000
--- a/node_modules/rxjs/operator/throttleTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throttleTime.js","sources":["../src/operator/throttleTime.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operator/timeInterval.d.ts b/node_modules/rxjs/operator/timeInterval.d.ts
deleted file mode 100644
index 5f5283b..0000000
--- a/node_modules/rxjs/operator/timeInterval.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/timeInterval';
diff --git a/node_modules/rxjs/operator/timeInterval.js b/node_modules/rxjs/operator/timeInterval.js
deleted file mode 100644
index ca7eec1..0000000
--- a/node_modules/rxjs/operator/timeInterval.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/timeInterval"));
-//# sourceMappingURL=timeInterval.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/timeInterval.js.map b/node_modules/rxjs/operator/timeInterval.js.map
deleted file mode 100644
index 2696672..0000000
--- a/node_modules/rxjs/operator/timeInterval.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeInterval.js","sources":["../src/operator/timeInterval.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operator/timeout.d.ts b/node_modules/rxjs/operator/timeout.d.ts
deleted file mode 100644
index 56e0cc3..0000000
--- a/node_modules/rxjs/operator/timeout.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/timeout';
diff --git a/node_modules/rxjs/operator/timeout.js b/node_modules/rxjs/operator/timeout.js
deleted file mode 100644
index f2a7dd4..0000000
--- a/node_modules/rxjs/operator/timeout.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/timeout"));
-//# sourceMappingURL=timeout.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/timeout.js.map b/node_modules/rxjs/operator/timeout.js.map
deleted file mode 100644
index 05fb848..0000000
--- a/node_modules/rxjs/operator/timeout.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeout.js","sources":["../src/operator/timeout.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operator/timeoutWith.d.ts b/node_modules/rxjs/operator/timeoutWith.d.ts
deleted file mode 100644
index e746c05..0000000
--- a/node_modules/rxjs/operator/timeoutWith.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/timeoutWith';
diff --git a/node_modules/rxjs/operator/timeoutWith.js b/node_modules/rxjs/operator/timeoutWith.js
deleted file mode 100644
index fb52eed..0000000
--- a/node_modules/rxjs/operator/timeoutWith.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/timeoutWith"));
-//# sourceMappingURL=timeoutWith.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/timeoutWith.js.map b/node_modules/rxjs/operator/timeoutWith.js.map
deleted file mode 100644
index ee855d4..0000000
--- a/node_modules/rxjs/operator/timeoutWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeoutWith.js","sources":["../src/operator/timeoutWith.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operator/timestamp.d.ts b/node_modules/rxjs/operator/timestamp.d.ts
deleted file mode 100644
index 77a94e8..0000000
--- a/node_modules/rxjs/operator/timestamp.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/timestamp';
diff --git a/node_modules/rxjs/operator/timestamp.js b/node_modules/rxjs/operator/timestamp.js
deleted file mode 100644
index bd87451..0000000
--- a/node_modules/rxjs/operator/timestamp.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/timestamp"));
-//# sourceMappingURL=timestamp.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/timestamp.js.map b/node_modules/rxjs/operator/timestamp.js.map
deleted file mode 100644
index 81a1dc1..0000000
--- a/node_modules/rxjs/operator/timestamp.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timestamp.js","sources":["../src/operator/timestamp.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/toArray.d.ts b/node_modules/rxjs/operator/toArray.d.ts
deleted file mode 100644
index 57c8ee1..0000000
--- a/node_modules/rxjs/operator/toArray.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/toArray';
diff --git a/node_modules/rxjs/operator/toArray.js b/node_modules/rxjs/operator/toArray.js
deleted file mode 100644
index 297835e..0000000
--- a/node_modules/rxjs/operator/toArray.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/toArray"));
-//# sourceMappingURL=toArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/toArray.js.map b/node_modules/rxjs/operator/toArray.js.map
deleted file mode 100644
index 0de6115..0000000
--- a/node_modules/rxjs/operator/toArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"toArray.js","sources":["../src/operator/toArray.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operator/toPromise.d.ts b/node_modules/rxjs/operator/toPromise.d.ts
deleted file mode 100644
index b9f8cae..0000000
--- a/node_modules/rxjs/operator/toPromise.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/toPromise';
diff --git a/node_modules/rxjs/operator/toPromise.js b/node_modules/rxjs/operator/toPromise.js
deleted file mode 100644
index c1a450c..0000000
--- a/node_modules/rxjs/operator/toPromise.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/toPromise"));
-//# sourceMappingURL=toPromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/toPromise.js.map b/node_modules/rxjs/operator/toPromise.js.map
deleted file mode 100644
index d7395a3..0000000
--- a/node_modules/rxjs/operator/toPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"toPromise.js","sources":["../src/operator/toPromise.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operator/window.d.ts b/node_modules/rxjs/operator/window.d.ts
deleted file mode 100644
index 937f174..0000000
--- a/node_modules/rxjs/operator/window.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/window';
diff --git a/node_modules/rxjs/operator/window.js b/node_modules/rxjs/operator/window.js
deleted file mode 100644
index b43e00d..0000000
--- a/node_modules/rxjs/operator/window.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/window"));
-//# sourceMappingURL=window.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/window.js.map b/node_modules/rxjs/operator/window.js.map
deleted file mode 100644
index b4bdbc3..0000000
--- a/node_modules/rxjs/operator/window.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"window.js","sources":["../src/operator/window.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operator/windowCount.d.ts b/node_modules/rxjs/operator/windowCount.d.ts
deleted file mode 100644
index 87392c7..0000000
--- a/node_modules/rxjs/operator/windowCount.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/windowCount';
diff --git a/node_modules/rxjs/operator/windowCount.js b/node_modules/rxjs/operator/windowCount.js
deleted file mode 100644
index bce9e1b..0000000
--- a/node_modules/rxjs/operator/windowCount.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/windowCount"));
-//# sourceMappingURL=windowCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/windowCount.js.map b/node_modules/rxjs/operator/windowCount.js.map
deleted file mode 100644
index 6dd2b1a..0000000
--- a/node_modules/rxjs/operator/windowCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowCount.js","sources":["../src/operator/windowCount.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operator/windowTime.d.ts b/node_modules/rxjs/operator/windowTime.d.ts
deleted file mode 100644
index 52798df..0000000
--- a/node_modules/rxjs/operator/windowTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/windowTime';
diff --git a/node_modules/rxjs/operator/windowTime.js b/node_modules/rxjs/operator/windowTime.js
deleted file mode 100644
index 1652b4b..0000000
--- a/node_modules/rxjs/operator/windowTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/windowTime"));
-//# sourceMappingURL=windowTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/windowTime.js.map b/node_modules/rxjs/operator/windowTime.js.map
deleted file mode 100644
index 6ab686e..0000000
--- a/node_modules/rxjs/operator/windowTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowTime.js","sources":["../src/operator/windowTime.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operator/windowToggle.d.ts b/node_modules/rxjs/operator/windowToggle.d.ts
deleted file mode 100644
index c2d8b4e..0000000
--- a/node_modules/rxjs/operator/windowToggle.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/windowToggle';
diff --git a/node_modules/rxjs/operator/windowToggle.js b/node_modules/rxjs/operator/windowToggle.js
deleted file mode 100644
index 5533997..0000000
--- a/node_modules/rxjs/operator/windowToggle.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/windowToggle"));
-//# sourceMappingURL=windowToggle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/windowToggle.js.map b/node_modules/rxjs/operator/windowToggle.js.map
deleted file mode 100644
index ac16ccf..0000000
--- a/node_modules/rxjs/operator/windowToggle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowToggle.js","sources":["../src/operator/windowToggle.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operator/windowWhen.d.ts b/node_modules/rxjs/operator/windowWhen.d.ts
deleted file mode 100644
index 1d4e2ef..0000000
--- a/node_modules/rxjs/operator/windowWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/windowWhen';
diff --git a/node_modules/rxjs/operator/windowWhen.js b/node_modules/rxjs/operator/windowWhen.js
deleted file mode 100644
index 3623a02..0000000
--- a/node_modules/rxjs/operator/windowWhen.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/windowWhen"));
-//# sourceMappingURL=windowWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/windowWhen.js.map b/node_modules/rxjs/operator/windowWhen.js.map
deleted file mode 100644
index 7793ae2..0000000
--- a/node_modules/rxjs/operator/windowWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowWhen.js","sources":["../src/operator/windowWhen.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operator/withLatestFrom.d.ts b/node_modules/rxjs/operator/withLatestFrom.d.ts
deleted file mode 100644
index b31197a..0000000
--- a/node_modules/rxjs/operator/withLatestFrom.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/withLatestFrom';
diff --git a/node_modules/rxjs/operator/withLatestFrom.js b/node_modules/rxjs/operator/withLatestFrom.js
deleted file mode 100644
index 889291a..0000000
--- a/node_modules/rxjs/operator/withLatestFrom.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/withLatestFrom"));
-//# sourceMappingURL=withLatestFrom.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/withLatestFrom.js.map b/node_modules/rxjs/operator/withLatestFrom.js.map
deleted file mode 100644
index 4104e3a..0000000
--- a/node_modules/rxjs/operator/withLatestFrom.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"withLatestFrom.js","sources":["../src/operator/withLatestFrom.ts"],"names":[],"mappings":";;;;;AAAA,yDAAoD"}
diff --git a/node_modules/rxjs/operator/zip.d.ts b/node_modules/rxjs/operator/zip.d.ts
deleted file mode 100644
index 25eea26..0000000
--- a/node_modules/rxjs/operator/zip.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/zip';
diff --git a/node_modules/rxjs/operator/zip.js b/node_modules/rxjs/operator/zip.js
deleted file mode 100644
index be4b205..0000000
--- a/node_modules/rxjs/operator/zip.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/zip"));
-//# sourceMappingURL=zip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/zip.js.map b/node_modules/rxjs/operator/zip.js.map
deleted file mode 100644
index ec90001..0000000
--- a/node_modules/rxjs/operator/zip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zip.js","sources":["../src/operator/zip.ts"],"names":[],"mappings":";;;;;AAAA,8CAAyC"}
diff --git a/node_modules/rxjs/operator/zipAll.d.ts b/node_modules/rxjs/operator/zipAll.d.ts
deleted file mode 100644
index 1098d9d..0000000
--- a/node_modules/rxjs/operator/zipAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/zipAll';
diff --git a/node_modules/rxjs/operator/zipAll.js b/node_modules/rxjs/operator/zipAll.js
deleted file mode 100644
index 5b99781..0000000
--- a/node_modules/rxjs/operator/zipAll.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operator/zipAll"));
-//# sourceMappingURL=zipAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operator/zipAll.js.map b/node_modules/rxjs/operator/zipAll.js.map
deleted file mode 100644
index 9895fc4..0000000
--- a/node_modules/rxjs/operator/zipAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zipAll.js","sources":["../src/operator/zipAll.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operators/audit.d.ts b/node_modules/rxjs/operators/audit.d.ts
deleted file mode 100644
index 0e5b597..0000000
--- a/node_modules/rxjs/operators/audit.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/audit';
diff --git a/node_modules/rxjs/operators/audit.js b/node_modules/rxjs/operators/audit.js
deleted file mode 100644
index 37a4ad6..0000000
--- a/node_modules/rxjs/operators/audit.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/audit"));
-//# sourceMappingURL=audit.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/audit.js.map b/node_modules/rxjs/operators/audit.js.map
deleted file mode 100644
index 4d64b1e..0000000
--- a/node_modules/rxjs/operators/audit.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"audit.js","sources":["../src/operators/audit.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operators/auditTime.d.ts b/node_modules/rxjs/operators/auditTime.d.ts
deleted file mode 100644
index 72a4c00..0000000
--- a/node_modules/rxjs/operators/auditTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/auditTime';
diff --git a/node_modules/rxjs/operators/auditTime.js b/node_modules/rxjs/operators/auditTime.js
deleted file mode 100644
index 25543c3..0000000
--- a/node_modules/rxjs/operators/auditTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/auditTime"));
-//# sourceMappingURL=auditTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/auditTime.js.map b/node_modules/rxjs/operators/auditTime.js.map
deleted file mode 100644
index 007138c..0000000
--- a/node_modules/rxjs/operators/auditTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"auditTime.js","sources":["../src/operators/auditTime.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/buffer.d.ts b/node_modules/rxjs/operators/buffer.d.ts
deleted file mode 100644
index 7007461..0000000
--- a/node_modules/rxjs/operators/buffer.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/buffer';
diff --git a/node_modules/rxjs/operators/buffer.js b/node_modules/rxjs/operators/buffer.js
deleted file mode 100644
index 5feb7da..0000000
--- a/node_modules/rxjs/operators/buffer.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/buffer"));
-//# sourceMappingURL=buffer.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/buffer.js.map b/node_modules/rxjs/operators/buffer.js.map
deleted file mode 100644
index 9f503dd..0000000
--- a/node_modules/rxjs/operators/buffer.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"buffer.js","sources":["../src/operators/buffer.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operators/bufferCount.d.ts b/node_modules/rxjs/operators/bufferCount.d.ts
deleted file mode 100644
index 767b33c..0000000
--- a/node_modules/rxjs/operators/bufferCount.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/bufferCount';
diff --git a/node_modules/rxjs/operators/bufferCount.js b/node_modules/rxjs/operators/bufferCount.js
deleted file mode 100644
index 935b8e3..0000000
--- a/node_modules/rxjs/operators/bufferCount.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/bufferCount"));
-//# sourceMappingURL=bufferCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/bufferCount.js.map b/node_modules/rxjs/operators/bufferCount.js.map
deleted file mode 100644
index 3213996..0000000
--- a/node_modules/rxjs/operators/bufferCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferCount.js","sources":["../src/operators/bufferCount.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operators/bufferTime.d.ts b/node_modules/rxjs/operators/bufferTime.d.ts
deleted file mode 100644
index 085acfb..0000000
--- a/node_modules/rxjs/operators/bufferTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/bufferTime';
diff --git a/node_modules/rxjs/operators/bufferTime.js b/node_modules/rxjs/operators/bufferTime.js
deleted file mode 100644
index 393865b..0000000
--- a/node_modules/rxjs/operators/bufferTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/bufferTime"));
-//# sourceMappingURL=bufferTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/bufferTime.js.map b/node_modules/rxjs/operators/bufferTime.js.map
deleted file mode 100644
index 36c2a33..0000000
--- a/node_modules/rxjs/operators/bufferTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferTime.js","sources":["../src/operators/bufferTime.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operators/bufferToggle.d.ts b/node_modules/rxjs/operators/bufferToggle.d.ts
deleted file mode 100644
index f554f73..0000000
--- a/node_modules/rxjs/operators/bufferToggle.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/bufferToggle';
diff --git a/node_modules/rxjs/operators/bufferToggle.js b/node_modules/rxjs/operators/bufferToggle.js
deleted file mode 100644
index 261ab0f..0000000
--- a/node_modules/rxjs/operators/bufferToggle.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/bufferToggle"));
-//# sourceMappingURL=bufferToggle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/bufferToggle.js.map b/node_modules/rxjs/operators/bufferToggle.js.map
deleted file mode 100644
index eeabae9..0000000
--- a/node_modules/rxjs/operators/bufferToggle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferToggle.js","sources":["../src/operators/bufferToggle.ts"],"names":[],"mappings":";;;;;AAAA,wDAAmD"}
diff --git a/node_modules/rxjs/operators/bufferWhen.d.ts b/node_modules/rxjs/operators/bufferWhen.d.ts
deleted file mode 100644
index 7e0b79f..0000000
--- a/node_modules/rxjs/operators/bufferWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/bufferWhen';
diff --git a/node_modules/rxjs/operators/bufferWhen.js b/node_modules/rxjs/operators/bufferWhen.js
deleted file mode 100644
index 5007f94..0000000
--- a/node_modules/rxjs/operators/bufferWhen.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/bufferWhen"));
-//# sourceMappingURL=bufferWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/bufferWhen.js.map b/node_modules/rxjs/operators/bufferWhen.js.map
deleted file mode 100644
index 8664e61..0000000
--- a/node_modules/rxjs/operators/bufferWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bufferWhen.js","sources":["../src/operators/bufferWhen.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operators/catchError.d.ts b/node_modules/rxjs/operators/catchError.d.ts
deleted file mode 100644
index 4ea9351..0000000
--- a/node_modules/rxjs/operators/catchError.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/catchError';
diff --git a/node_modules/rxjs/operators/catchError.js b/node_modules/rxjs/operators/catchError.js
deleted file mode 100644
index 344f887..0000000
--- a/node_modules/rxjs/operators/catchError.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/catchError"));
-//# sourceMappingURL=catchError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/catchError.js.map b/node_modules/rxjs/operators/catchError.js.map
deleted file mode 100644
index 4eaac47..0000000
--- a/node_modules/rxjs/operators/catchError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"catchError.js","sources":["../src/operators/catchError.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operators/combineAll.d.ts b/node_modules/rxjs/operators/combineAll.d.ts
deleted file mode 100644
index 13f2758..0000000
--- a/node_modules/rxjs/operators/combineAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/combineAll';
diff --git a/node_modules/rxjs/operators/combineAll.js b/node_modules/rxjs/operators/combineAll.js
deleted file mode 100644
index 4f1d270..0000000
--- a/node_modules/rxjs/operators/combineAll.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/combineAll"));
-//# sourceMappingURL=combineAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/combineAll.js.map b/node_modules/rxjs/operators/combineAll.js.map
deleted file mode 100644
index be08874..0000000
--- a/node_modules/rxjs/operators/combineAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineAll.js","sources":["../src/operators/combineAll.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operators/combineLatest.d.ts b/node_modules/rxjs/operators/combineLatest.d.ts
deleted file mode 100644
index cefd4d0..0000000
--- a/node_modules/rxjs/operators/combineLatest.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/combineLatest';
diff --git a/node_modules/rxjs/operators/combineLatest.js b/node_modules/rxjs/operators/combineLatest.js
deleted file mode 100644
index b6a775f..0000000
--- a/node_modules/rxjs/operators/combineLatest.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/combineLatest"));
-//# sourceMappingURL=combineLatest.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/combineLatest.js.map b/node_modules/rxjs/operators/combineLatest.js.map
deleted file mode 100644
index 07d6248..0000000
--- a/node_modules/rxjs/operators/combineLatest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"combineLatest.js","sources":["../src/operators/combineLatest.ts"],"names":[],"mappings":";;;;;AAAA,yDAAoD"}
diff --git a/node_modules/rxjs/operators/concat.d.ts b/node_modules/rxjs/operators/concat.d.ts
deleted file mode 100644
index e2fae80..0000000
--- a/node_modules/rxjs/operators/concat.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/concat';
diff --git a/node_modules/rxjs/operators/concat.js b/node_modules/rxjs/operators/concat.js
deleted file mode 100644
index 7082e98..0000000
--- a/node_modules/rxjs/operators/concat.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/concat"));
-//# sourceMappingURL=concat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/concat.js.map b/node_modules/rxjs/operators/concat.js.map
deleted file mode 100644
index 86ab797..0000000
--- a/node_modules/rxjs/operators/concat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concat.js","sources":["../src/operators/concat.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operators/concatAll.d.ts b/node_modules/rxjs/operators/concatAll.d.ts
deleted file mode 100644
index 4e90bf3..0000000
--- a/node_modules/rxjs/operators/concatAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/concatAll';
diff --git a/node_modules/rxjs/operators/concatAll.js b/node_modules/rxjs/operators/concatAll.js
deleted file mode 100644
index bc95de8..0000000
--- a/node_modules/rxjs/operators/concatAll.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/concatAll"));
-//# sourceMappingURL=concatAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/concatAll.js.map b/node_modules/rxjs/operators/concatAll.js.map
deleted file mode 100644
index 243d55d..0000000
--- a/node_modules/rxjs/operators/concatAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatAll.js","sources":["../src/operators/concatAll.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/concatMap.d.ts b/node_modules/rxjs/operators/concatMap.d.ts
deleted file mode 100644
index fb26bc0..0000000
--- a/node_modules/rxjs/operators/concatMap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/concatMap';
diff --git a/node_modules/rxjs/operators/concatMap.js b/node_modules/rxjs/operators/concatMap.js
deleted file mode 100644
index a5ff308..0000000
--- a/node_modules/rxjs/operators/concatMap.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/concatMap"));
-//# sourceMappingURL=concatMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/concatMap.js.map b/node_modules/rxjs/operators/concatMap.js.map
deleted file mode 100644
index db045ca..0000000
--- a/node_modules/rxjs/operators/concatMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatMap.js","sources":["../src/operators/concatMap.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/concatMapTo.d.ts b/node_modules/rxjs/operators/concatMapTo.d.ts
deleted file mode 100644
index f5aef40..0000000
--- a/node_modules/rxjs/operators/concatMapTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/concatMapTo';
diff --git a/node_modules/rxjs/operators/concatMapTo.js b/node_modules/rxjs/operators/concatMapTo.js
deleted file mode 100644
index c24370a..0000000
--- a/node_modules/rxjs/operators/concatMapTo.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/concatMapTo"));
-//# sourceMappingURL=concatMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/concatMapTo.js.map b/node_modules/rxjs/operators/concatMapTo.js.map
deleted file mode 100644
index 0d92af1..0000000
--- a/node_modules/rxjs/operators/concatMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"concatMapTo.js","sources":["../src/operators/concatMapTo.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operators/count.d.ts b/node_modules/rxjs/operators/count.d.ts
deleted file mode 100644
index db7cfe3..0000000
--- a/node_modules/rxjs/operators/count.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/count';
diff --git a/node_modules/rxjs/operators/count.js b/node_modules/rxjs/operators/count.js
deleted file mode 100644
index e909f54..0000000
--- a/node_modules/rxjs/operators/count.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/count"));
-//# sourceMappingURL=count.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/count.js.map b/node_modules/rxjs/operators/count.js.map
deleted file mode 100644
index b899345..0000000
--- a/node_modules/rxjs/operators/count.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"count.js","sources":["../src/operators/count.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operators/debounce.d.ts b/node_modules/rxjs/operators/debounce.d.ts
deleted file mode 100644
index ed62cb8..0000000
--- a/node_modules/rxjs/operators/debounce.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/debounce';
diff --git a/node_modules/rxjs/operators/debounce.js b/node_modules/rxjs/operators/debounce.js
deleted file mode 100644
index ce3a18e..0000000
--- a/node_modules/rxjs/operators/debounce.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/debounce"));
-//# sourceMappingURL=debounce.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/debounce.js.map b/node_modules/rxjs/operators/debounce.js.map
deleted file mode 100644
index 24240e3..0000000
--- a/node_modules/rxjs/operators/debounce.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounce.js","sources":["../src/operators/debounce.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operators/debounceTime.d.ts b/node_modules/rxjs/operators/debounceTime.d.ts
deleted file mode 100644
index fb73d33..0000000
--- a/node_modules/rxjs/operators/debounceTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/debounceTime';
diff --git a/node_modules/rxjs/operators/debounceTime.js b/node_modules/rxjs/operators/debounceTime.js
deleted file mode 100644
index 0332391..0000000
--- a/node_modules/rxjs/operators/debounceTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/debounceTime"));
-//# sourceMappingURL=debounceTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/debounceTime.js.map b/node_modules/rxjs/operators/debounceTime.js.map
deleted file mode 100644
index 40494b2..0000000
--- a/node_modules/rxjs/operators/debounceTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"debounceTime.js","sources":["../src/operators/debounceTime.ts"],"names":[],"mappings":";;;;;AAAA,wDAAmD"}
diff --git a/node_modules/rxjs/operators/defaultIfEmpty.d.ts b/node_modules/rxjs/operators/defaultIfEmpty.d.ts
deleted file mode 100644
index 04b9e61..0000000
--- a/node_modules/rxjs/operators/defaultIfEmpty.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/defaultIfEmpty';
diff --git a/node_modules/rxjs/operators/defaultIfEmpty.js b/node_modules/rxjs/operators/defaultIfEmpty.js
deleted file mode 100644
index 59a8dec..0000000
--- a/node_modules/rxjs/operators/defaultIfEmpty.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/defaultIfEmpty"));
-//# sourceMappingURL=defaultIfEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/defaultIfEmpty.js.map b/node_modules/rxjs/operators/defaultIfEmpty.js.map
deleted file mode 100644
index 7e3e29b..0000000
--- a/node_modules/rxjs/operators/defaultIfEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"defaultIfEmpty.js","sources":["../src/operators/defaultIfEmpty.ts"],"names":[],"mappings":";;;;;AAAA,0DAAqD"}
diff --git a/node_modules/rxjs/operators/delay.d.ts b/node_modules/rxjs/operators/delay.d.ts
deleted file mode 100644
index d34f33d..0000000
--- a/node_modules/rxjs/operators/delay.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/delay';
diff --git a/node_modules/rxjs/operators/delay.js b/node_modules/rxjs/operators/delay.js
deleted file mode 100644
index 2c431df..0000000
--- a/node_modules/rxjs/operators/delay.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/delay"));
-//# sourceMappingURL=delay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/delay.js.map b/node_modules/rxjs/operators/delay.js.map
deleted file mode 100644
index 6acb026..0000000
--- a/node_modules/rxjs/operators/delay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"delay.js","sources":["../src/operators/delay.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operators/delayWhen.d.ts b/node_modules/rxjs/operators/delayWhen.d.ts
deleted file mode 100644
index 4de1452..0000000
--- a/node_modules/rxjs/operators/delayWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/delayWhen';
diff --git a/node_modules/rxjs/operators/delayWhen.js b/node_modules/rxjs/operators/delayWhen.js
deleted file mode 100644
index 18de036..0000000
--- a/node_modules/rxjs/operators/delayWhen.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/delayWhen"));
-//# sourceMappingURL=delayWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/delayWhen.js.map b/node_modules/rxjs/operators/delayWhen.js.map
deleted file mode 100644
index 9d11aa8..0000000
--- a/node_modules/rxjs/operators/delayWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"delayWhen.js","sources":["../src/operators/delayWhen.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/dematerialize.d.ts b/node_modules/rxjs/operators/dematerialize.d.ts
deleted file mode 100644
index a689bf0..0000000
--- a/node_modules/rxjs/operators/dematerialize.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/dematerialize';
diff --git a/node_modules/rxjs/operators/dematerialize.js b/node_modules/rxjs/operators/dematerialize.js
deleted file mode 100644
index eeb1107..0000000
--- a/node_modules/rxjs/operators/dematerialize.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/dematerialize"));
-//# sourceMappingURL=dematerialize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/dematerialize.js.map b/node_modules/rxjs/operators/dematerialize.js.map
deleted file mode 100644
index 6306ce0..0000000
--- a/node_modules/rxjs/operators/dematerialize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"dematerialize.js","sources":["../src/operators/dematerialize.ts"],"names":[],"mappings":";;;;;AAAA,yDAAoD"}
diff --git a/node_modules/rxjs/operators/distinct.d.ts b/node_modules/rxjs/operators/distinct.d.ts
deleted file mode 100644
index 9d8288a..0000000
--- a/node_modules/rxjs/operators/distinct.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/distinct';
diff --git a/node_modules/rxjs/operators/distinct.js b/node_modules/rxjs/operators/distinct.js
deleted file mode 100644
index c5b7eee..0000000
--- a/node_modules/rxjs/operators/distinct.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/distinct"));
-//# sourceMappingURL=distinct.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/distinct.js.map b/node_modules/rxjs/operators/distinct.js.map
deleted file mode 100644
index 7e6f21c..0000000
--- a/node_modules/rxjs/operators/distinct.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinct.js","sources":["../src/operators/distinct.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operators/distinctUntilChanged.d.ts b/node_modules/rxjs/operators/distinctUntilChanged.d.ts
deleted file mode 100644
index 1fc4eda..0000000
--- a/node_modules/rxjs/operators/distinctUntilChanged.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/distinctUntilChanged';
diff --git a/node_modules/rxjs/operators/distinctUntilChanged.js b/node_modules/rxjs/operators/distinctUntilChanged.js
deleted file mode 100644
index b311cc3..0000000
--- a/node_modules/rxjs/operators/distinctUntilChanged.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/distinctUntilChanged"));
-//# sourceMappingURL=distinctUntilChanged.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/distinctUntilChanged.js.map b/node_modules/rxjs/operators/distinctUntilChanged.js.map
deleted file mode 100644
index b762a0c..0000000
--- a/node_modules/rxjs/operators/distinctUntilChanged.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinctUntilChanged.js","sources":["../src/operators/distinctUntilChanged.ts"],"names":[],"mappings":";;;;;AAAA,gEAA2D"}
diff --git a/node_modules/rxjs/operators/distinctUntilKeyChanged.d.ts b/node_modules/rxjs/operators/distinctUntilKeyChanged.d.ts
deleted file mode 100644
index d8fa76a..0000000
--- a/node_modules/rxjs/operators/distinctUntilKeyChanged.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/distinctUntilKeyChanged';
diff --git a/node_modules/rxjs/operators/distinctUntilKeyChanged.js b/node_modules/rxjs/operators/distinctUntilKeyChanged.js
deleted file mode 100644
index 86a90f8..0000000
--- a/node_modules/rxjs/operators/distinctUntilKeyChanged.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/distinctUntilKeyChanged"));
-//# sourceMappingURL=distinctUntilKeyChanged.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/distinctUntilKeyChanged.js.map b/node_modules/rxjs/operators/distinctUntilKeyChanged.js.map
deleted file mode 100644
index cf3ad89..0000000
--- a/node_modules/rxjs/operators/distinctUntilKeyChanged.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"distinctUntilKeyChanged.js","sources":["../src/operators/distinctUntilKeyChanged.ts"],"names":[],"mappings":";;;;;AAAA,mEAA8D"}
diff --git a/node_modules/rxjs/operators/elementAt.d.ts b/node_modules/rxjs/operators/elementAt.d.ts
deleted file mode 100644
index 4f5d5b3..0000000
--- a/node_modules/rxjs/operators/elementAt.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/elementAt';
diff --git a/node_modules/rxjs/operators/elementAt.js b/node_modules/rxjs/operators/elementAt.js
deleted file mode 100644
index b8088a2..0000000
--- a/node_modules/rxjs/operators/elementAt.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/elementAt"));
-//# sourceMappingURL=elementAt.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/elementAt.js.map b/node_modules/rxjs/operators/elementAt.js.map
deleted file mode 100644
index 9a1673a..0000000
--- a/node_modules/rxjs/operators/elementAt.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"elementAt.js","sources":["../src/operators/elementAt.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/every.d.ts b/node_modules/rxjs/operators/every.d.ts
deleted file mode 100644
index 15b9f46..0000000
--- a/node_modules/rxjs/operators/every.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/every';
diff --git a/node_modules/rxjs/operators/every.js b/node_modules/rxjs/operators/every.js
deleted file mode 100644
index 164b937..0000000
--- a/node_modules/rxjs/operators/every.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/every"));
-//# sourceMappingURL=every.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/every.js.map b/node_modules/rxjs/operators/every.js.map
deleted file mode 100644
index 0cff6cd..0000000
--- a/node_modules/rxjs/operators/every.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"every.js","sources":["../src/operators/every.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operators/exhaust.d.ts b/node_modules/rxjs/operators/exhaust.d.ts
deleted file mode 100644
index 19a3637..0000000
--- a/node_modules/rxjs/operators/exhaust.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/exhaust';
diff --git a/node_modules/rxjs/operators/exhaust.js b/node_modules/rxjs/operators/exhaust.js
deleted file mode 100644
index f0cc429..0000000
--- a/node_modules/rxjs/operators/exhaust.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/exhaust"));
-//# sourceMappingURL=exhaust.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/exhaust.js.map b/node_modules/rxjs/operators/exhaust.js.map
deleted file mode 100644
index 212e77e..0000000
--- a/node_modules/rxjs/operators/exhaust.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exhaust.js","sources":["../src/operators/exhaust.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operators/exhaustMap.d.ts b/node_modules/rxjs/operators/exhaustMap.d.ts
deleted file mode 100644
index cf4ae30..0000000
--- a/node_modules/rxjs/operators/exhaustMap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/exhaustMap';
diff --git a/node_modules/rxjs/operators/exhaustMap.js b/node_modules/rxjs/operators/exhaustMap.js
deleted file mode 100644
index 6a4d4f2..0000000
--- a/node_modules/rxjs/operators/exhaustMap.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/exhaustMap"));
-//# sourceMappingURL=exhaustMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/exhaustMap.js.map b/node_modules/rxjs/operators/exhaustMap.js.map
deleted file mode 100644
index 0a4cd45..0000000
--- a/node_modules/rxjs/operators/exhaustMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exhaustMap.js","sources":["../src/operators/exhaustMap.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operators/expand.d.ts b/node_modules/rxjs/operators/expand.d.ts
deleted file mode 100644
index 0cef04c..0000000
--- a/node_modules/rxjs/operators/expand.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/expand';
diff --git a/node_modules/rxjs/operators/expand.js b/node_modules/rxjs/operators/expand.js
deleted file mode 100644
index cbb1caa..0000000
--- a/node_modules/rxjs/operators/expand.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/expand"));
-//# sourceMappingURL=expand.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/expand.js.map b/node_modules/rxjs/operators/expand.js.map
deleted file mode 100644
index 1a3d2b8..0000000
--- a/node_modules/rxjs/operators/expand.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"expand.js","sources":["../src/operators/expand.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operators/filter.d.ts b/node_modules/rxjs/operators/filter.d.ts
deleted file mode 100644
index 23b8666..0000000
--- a/node_modules/rxjs/operators/filter.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/filter';
diff --git a/node_modules/rxjs/operators/filter.js b/node_modules/rxjs/operators/filter.js
deleted file mode 100644
index a784384..0000000
--- a/node_modules/rxjs/operators/filter.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/filter"));
-//# sourceMappingURL=filter.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/filter.js.map b/node_modules/rxjs/operators/filter.js.map
deleted file mode 100644
index f21633b..0000000
--- a/node_modules/rxjs/operators/filter.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"filter.js","sources":["../src/operators/filter.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operators/finalize.d.ts b/node_modules/rxjs/operators/finalize.d.ts
deleted file mode 100644
index 9c32dfc..0000000
--- a/node_modules/rxjs/operators/finalize.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/finalize';
diff --git a/node_modules/rxjs/operators/finalize.js b/node_modules/rxjs/operators/finalize.js
deleted file mode 100644
index 73fc972..0000000
--- a/node_modules/rxjs/operators/finalize.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/finalize"));
-//# sourceMappingURL=finalize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/finalize.js.map b/node_modules/rxjs/operators/finalize.js.map
deleted file mode 100644
index 92a552d..0000000
--- a/node_modules/rxjs/operators/finalize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"finalize.js","sources":["../src/operators/finalize.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operators/find.d.ts b/node_modules/rxjs/operators/find.d.ts
deleted file mode 100644
index 98a272d..0000000
--- a/node_modules/rxjs/operators/find.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/find';
diff --git a/node_modules/rxjs/operators/find.js b/node_modules/rxjs/operators/find.js
deleted file mode 100644
index 62f15d4..0000000
--- a/node_modules/rxjs/operators/find.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/find"));
-//# sourceMappingURL=find.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/find.js.map b/node_modules/rxjs/operators/find.js.map
deleted file mode 100644
index b830080..0000000
--- a/node_modules/rxjs/operators/find.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"find.js","sources":["../src/operators/find.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operators/findIndex.d.ts b/node_modules/rxjs/operators/findIndex.d.ts
deleted file mode 100644
index 167707f..0000000
--- a/node_modules/rxjs/operators/findIndex.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/findIndex';
diff --git a/node_modules/rxjs/operators/findIndex.js b/node_modules/rxjs/operators/findIndex.js
deleted file mode 100644
index 1a455c2..0000000
--- a/node_modules/rxjs/operators/findIndex.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/findIndex"));
-//# sourceMappingURL=findIndex.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/findIndex.js.map b/node_modules/rxjs/operators/findIndex.js.map
deleted file mode 100644
index 71628ca..0000000
--- a/node_modules/rxjs/operators/findIndex.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"findIndex.js","sources":["../src/operators/findIndex.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/first.d.ts b/node_modules/rxjs/operators/first.d.ts
deleted file mode 100644
index c0266e3..0000000
--- a/node_modules/rxjs/operators/first.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/first';
diff --git a/node_modules/rxjs/operators/first.js b/node_modules/rxjs/operators/first.js
deleted file mode 100644
index cbab035..0000000
--- a/node_modules/rxjs/operators/first.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/first"));
-//# sourceMappingURL=first.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/first.js.map b/node_modules/rxjs/operators/first.js.map
deleted file mode 100644
index b972107..0000000
--- a/node_modules/rxjs/operators/first.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"first.js","sources":["../src/operators/first.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operators/groupBy.d.ts b/node_modules/rxjs/operators/groupBy.d.ts
deleted file mode 100644
index 52c6f58..0000000
--- a/node_modules/rxjs/operators/groupBy.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/groupBy';
diff --git a/node_modules/rxjs/operators/groupBy.js b/node_modules/rxjs/operators/groupBy.js
deleted file mode 100644
index 86f796a..0000000
--- a/node_modules/rxjs/operators/groupBy.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/groupBy"));
-//# sourceMappingURL=groupBy.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/groupBy.js.map b/node_modules/rxjs/operators/groupBy.js.map
deleted file mode 100644
index bf03677..0000000
--- a/node_modules/rxjs/operators/groupBy.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"groupBy.js","sources":["../src/operators/groupBy.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operators/ignoreElements.d.ts b/node_modules/rxjs/operators/ignoreElements.d.ts
deleted file mode 100644
index 590bf88..0000000
--- a/node_modules/rxjs/operators/ignoreElements.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/ignoreElements';
diff --git a/node_modules/rxjs/operators/ignoreElements.js b/node_modules/rxjs/operators/ignoreElements.js
deleted file mode 100644
index a2cd5ba..0000000
--- a/node_modules/rxjs/operators/ignoreElements.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/ignoreElements"));
-//# sourceMappingURL=ignoreElements.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/ignoreElements.js.map b/node_modules/rxjs/operators/ignoreElements.js.map
deleted file mode 100644
index 730e49e..0000000
--- a/node_modules/rxjs/operators/ignoreElements.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ignoreElements.js","sources":["../src/operators/ignoreElements.ts"],"names":[],"mappings":";;;;;AAAA,0DAAqD"}
diff --git a/node_modules/rxjs/operators/index.d.ts b/node_modules/rxjs/operators/index.d.ts
deleted file mode 100644
index efc0708..0000000
--- a/node_modules/rxjs/operators/index.d.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-export { audit } from '../internal/operators/audit';
-export { auditTime } from '../internal/operators/auditTime';
-export { buffer } from '../internal/operators/buffer';
-export { bufferCount } from '../internal/operators/bufferCount';
-export { bufferTime } from '../internal/operators/bufferTime';
-export { bufferToggle } from '../internal/operators/bufferToggle';
-export { bufferWhen } from '../internal/operators/bufferWhen';
-export { catchError } from '../internal/operators/catchError';
-export { combineAll } from '../internal/operators/combineAll';
-export { combineLatest } from '../internal/operators/combineLatest';
-export { concat } from '../internal/operators/concat';
-export { concatAll } from '../internal/operators/concatAll';
-export { concatMap } from '../internal/operators/concatMap';
-export { concatMapTo } from '../internal/operators/concatMapTo';
-export { count } from '../internal/operators/count';
-export { debounce } from '../internal/operators/debounce';
-export { debounceTime } from '../internal/operators/debounceTime';
-export { defaultIfEmpty } from '../internal/operators/defaultIfEmpty';
-export { delay } from '../internal/operators/delay';
-export { delayWhen } from '../internal/operators/delayWhen';
-export { dematerialize } from '../internal/operators/dematerialize';
-export { distinct } from '../internal/operators/distinct';
-export { distinctUntilChanged } from '../internal/operators/distinctUntilChanged';
-export { distinctUntilKeyChanged } from '../internal/operators/distinctUntilKeyChanged';
-export { elementAt } from '../internal/operators/elementAt';
-export { endWith } from '../internal/operators/endWith';
-export { every } from '../internal/operators/every';
-export { exhaust } from '../internal/operators/exhaust';
-export { exhaustMap } from '../internal/operators/exhaustMap';
-export { expand } from '../internal/operators/expand';
-export { filter } from '../internal/operators/filter';
-export { finalize } from '../internal/operators/finalize';
-export { find } from '../internal/operators/find';
-export { findIndex } from '../internal/operators/findIndex';
-export { first } from '../internal/operators/first';
-export { groupBy } from '../internal/operators/groupBy';
-export { ignoreElements } from '../internal/operators/ignoreElements';
-export { isEmpty } from '../internal/operators/isEmpty';
-export { last } from '../internal/operators/last';
-export { map } from '../internal/operators/map';
-export { mapTo } from '../internal/operators/mapTo';
-export { materialize } from '../internal/operators/materialize';
-export { max } from '../internal/operators/max';
-export { merge } from '../internal/operators/merge';
-export { mergeAll } from '../internal/operators/mergeAll';
-export { mergeMap } from '../internal/operators/mergeMap';
-export { mergeMap as flatMap } from '../internal/operators/mergeMap';
-export { mergeMapTo } from '../internal/operators/mergeMapTo';
-export { mergeScan } from '../internal/operators/mergeScan';
-export { min } from '../internal/operators/min';
-export { multicast } from '../internal/operators/multicast';
-export { observeOn } from '../internal/operators/observeOn';
-export { onErrorResumeNext } from '../internal/operators/onErrorResumeNext';
-export { pairwise } from '../internal/operators/pairwise';
-export { partition } from '../internal/operators/partition';
-export { pluck } from '../internal/operators/pluck';
-export { publish } from '../internal/operators/publish';
-export { publishBehavior } from '../internal/operators/publishBehavior';
-export { publishLast } from '../internal/operators/publishLast';
-export { publishReplay } from '../internal/operators/publishReplay';
-export { race } from '../internal/operators/race';
-export { reduce } from '../internal/operators/reduce';
-export { repeat } from '../internal/operators/repeat';
-export { repeatWhen } from '../internal/operators/repeatWhen';
-export { retry } from '../internal/operators/retry';
-export { retryWhen } from '../internal/operators/retryWhen';
-export { refCount } from '../internal/operators/refCount';
-export { sample } from '../internal/operators/sample';
-export { sampleTime } from '../internal/operators/sampleTime';
-export { scan } from '../internal/operators/scan';
-export { sequenceEqual } from '../internal/operators/sequenceEqual';
-export { share } from '../internal/operators/share';
-export { shareReplay } from '../internal/operators/shareReplay';
-export { single } from '../internal/operators/single';
-export { skip } from '../internal/operators/skip';
-export { skipLast } from '../internal/operators/skipLast';
-export { skipUntil } from '../internal/operators/skipUntil';
-export { skipWhile } from '../internal/operators/skipWhile';
-export { startWith } from '../internal/operators/startWith';
-export { subscribeOn } from '../internal/operators/subscribeOn';
-export { switchAll } from '../internal/operators/switchAll';
-export { switchMap } from '../internal/operators/switchMap';
-export { switchMapTo } from '../internal/operators/switchMapTo';
-export { take } from '../internal/operators/take';
-export { takeLast } from '../internal/operators/takeLast';
-export { takeUntil } from '../internal/operators/takeUntil';
-export { takeWhile } from '../internal/operators/takeWhile';
-export { tap } from '../internal/operators/tap';
-export { throttle } from '../internal/operators/throttle';
-export { throttleTime } from '../internal/operators/throttleTime';
-export { throwIfEmpty } from '../internal/operators/throwIfEmpty';
-export { timeInterval } from '../internal/operators/timeInterval';
-export { timeout } from '../internal/operators/timeout';
-export { timeoutWith } from '../internal/operators/timeoutWith';
-export { timestamp } from '../internal/operators/timestamp';
-export { toArray } from '../internal/operators/toArray';
-export { window } from '../internal/operators/window';
-export { windowCount } from '../internal/operators/windowCount';
-export { windowTime } from '../internal/operators/windowTime';
-export { windowToggle } from '../internal/operators/windowToggle';
-export { windowWhen } from '../internal/operators/windowWhen';
-export { withLatestFrom } from '../internal/operators/withLatestFrom';
-export { zip } from '../internal/operators/zip';
-export { zipAll } from '../internal/operators/zipAll';
diff --git a/node_modules/rxjs/operators/index.js b/node_modules/rxjs/operators/index.js
deleted file mode 100644
index 81ce760..0000000
--- a/node_modules/rxjs/operators/index.js
+++ /dev/null
@@ -1,211 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var audit_1 = require("../internal/operators/audit");
-exports.audit = audit_1.audit;
-var auditTime_1 = require("../internal/operators/auditTime");
-exports.auditTime = auditTime_1.auditTime;
-var buffer_1 = require("../internal/operators/buffer");
-exports.buffer = buffer_1.buffer;
-var bufferCount_1 = require("../internal/operators/bufferCount");
-exports.bufferCount = bufferCount_1.bufferCount;
-var bufferTime_1 = require("../internal/operators/bufferTime");
-exports.bufferTime = bufferTime_1.bufferTime;
-var bufferToggle_1 = require("../internal/operators/bufferToggle");
-exports.bufferToggle = bufferToggle_1.bufferToggle;
-var bufferWhen_1 = require("../internal/operators/bufferWhen");
-exports.bufferWhen = bufferWhen_1.bufferWhen;
-var catchError_1 = require("../internal/operators/catchError");
-exports.catchError = catchError_1.catchError;
-var combineAll_1 = require("../internal/operators/combineAll");
-exports.combineAll = combineAll_1.combineAll;
-var combineLatest_1 = require("../internal/operators/combineLatest");
-exports.combineLatest = combineLatest_1.combineLatest;
-var concat_1 = require("../internal/operators/concat");
-exports.concat = concat_1.concat;
-var concatAll_1 = require("../internal/operators/concatAll");
-exports.concatAll = concatAll_1.concatAll;
-var concatMap_1 = require("../internal/operators/concatMap");
-exports.concatMap = concatMap_1.concatMap;
-var concatMapTo_1 = require("../internal/operators/concatMapTo");
-exports.concatMapTo = concatMapTo_1.concatMapTo;
-var count_1 = require("../internal/operators/count");
-exports.count = count_1.count;
-var debounce_1 = require("../internal/operators/debounce");
-exports.debounce = debounce_1.debounce;
-var debounceTime_1 = require("../internal/operators/debounceTime");
-exports.debounceTime = debounceTime_1.debounceTime;
-var defaultIfEmpty_1 = require("../internal/operators/defaultIfEmpty");
-exports.defaultIfEmpty = defaultIfEmpty_1.defaultIfEmpty;
-var delay_1 = require("../internal/operators/delay");
-exports.delay = delay_1.delay;
-var delayWhen_1 = require("../internal/operators/delayWhen");
-exports.delayWhen = delayWhen_1.delayWhen;
-var dematerialize_1 = require("../internal/operators/dematerialize");
-exports.dematerialize = dematerialize_1.dematerialize;
-var distinct_1 = require("../internal/operators/distinct");
-exports.distinct = distinct_1.distinct;
-var distinctUntilChanged_1 = require("../internal/operators/distinctUntilChanged");
-exports.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged;
-var distinctUntilKeyChanged_1 = require("../internal/operators/distinctUntilKeyChanged");
-exports.distinctUntilKeyChanged = distinctUntilKeyChanged_1.distinctUntilKeyChanged;
-var elementAt_1 = require("../internal/operators/elementAt");
-exports.elementAt = elementAt_1.elementAt;
-var endWith_1 = require("../internal/operators/endWith");
-exports.endWith = endWith_1.endWith;
-var every_1 = require("../internal/operators/every");
-exports.every = every_1.every;
-var exhaust_1 = require("../internal/operators/exhaust");
-exports.exhaust = exhaust_1.exhaust;
-var exhaustMap_1 = require("../internal/operators/exhaustMap");
-exports.exhaustMap = exhaustMap_1.exhaustMap;
-var expand_1 = require("../internal/operators/expand");
-exports.expand = expand_1.expand;
-var filter_1 = require("../internal/operators/filter");
-exports.filter = filter_1.filter;
-var finalize_1 = require("../internal/operators/finalize");
-exports.finalize = finalize_1.finalize;
-var find_1 = require("../internal/operators/find");
-exports.find = find_1.find;
-var findIndex_1 = require("../internal/operators/findIndex");
-exports.findIndex = findIndex_1.findIndex;
-var first_1 = require("../internal/operators/first");
-exports.first = first_1.first;
-var groupBy_1 = require("../internal/operators/groupBy");
-exports.groupBy = groupBy_1.groupBy;
-var ignoreElements_1 = require("../internal/operators/ignoreElements");
-exports.ignoreElements = ignoreElements_1.ignoreElements;
-var isEmpty_1 = require("../internal/operators/isEmpty");
-exports.isEmpty = isEmpty_1.isEmpty;
-var last_1 = require("../internal/operators/last");
-exports.last = last_1.last;
-var map_1 = require("../internal/operators/map");
-exports.map = map_1.map;
-var mapTo_1 = require("../internal/operators/mapTo");
-exports.mapTo = mapTo_1.mapTo;
-var materialize_1 = require("../internal/operators/materialize");
-exports.materialize = materialize_1.materialize;
-var max_1 = require("../internal/operators/max");
-exports.max = max_1.max;
-var merge_1 = require("../internal/operators/merge");
-exports.merge = merge_1.merge;
-var mergeAll_1 = require("../internal/operators/mergeAll");
-exports.mergeAll = mergeAll_1.mergeAll;
-var mergeMap_1 = require("../internal/operators/mergeMap");
-exports.mergeMap = mergeMap_1.mergeMap;
-var mergeMap_2 = require("../internal/operators/mergeMap");
-exports.flatMap = mergeMap_2.mergeMap;
-var mergeMapTo_1 = require("../internal/operators/mergeMapTo");
-exports.mergeMapTo = mergeMapTo_1.mergeMapTo;
-var mergeScan_1 = require("../internal/operators/mergeScan");
-exports.mergeScan = mergeScan_1.mergeScan;
-var min_1 = require("../internal/operators/min");
-exports.min = min_1.min;
-var multicast_1 = require("../internal/operators/multicast");
-exports.multicast = multicast_1.multicast;
-var observeOn_1 = require("../internal/operators/observeOn");
-exports.observeOn = observeOn_1.observeOn;
-var onErrorResumeNext_1 = require("../internal/operators/onErrorResumeNext");
-exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
-var pairwise_1 = require("../internal/operators/pairwise");
-exports.pairwise = pairwise_1.pairwise;
-var partition_1 = require("../internal/operators/partition");
-exports.partition = partition_1.partition;
-var pluck_1 = require("../internal/operators/pluck");
-exports.pluck = pluck_1.pluck;
-var publish_1 = require("../internal/operators/publish");
-exports.publish = publish_1.publish;
-var publishBehavior_1 = require("../internal/operators/publishBehavior");
-exports.publishBehavior = publishBehavior_1.publishBehavior;
-var publishLast_1 = require("../internal/operators/publishLast");
-exports.publishLast = publishLast_1.publishLast;
-var publishReplay_1 = require("../internal/operators/publishReplay");
-exports.publishReplay = publishReplay_1.publishReplay;
-var race_1 = require("../internal/operators/race");
-exports.race = race_1.race;
-var reduce_1 = require("../internal/operators/reduce");
-exports.reduce = reduce_1.reduce;
-var repeat_1 = require("../internal/operators/repeat");
-exports.repeat = repeat_1.repeat;
-var repeatWhen_1 = require("../internal/operators/repeatWhen");
-exports.repeatWhen = repeatWhen_1.repeatWhen;
-var retry_1 = require("../internal/operators/retry");
-exports.retry = retry_1.retry;
-var retryWhen_1 = require("../internal/operators/retryWhen");
-exports.retryWhen = retryWhen_1.retryWhen;
-var refCount_1 = require("../internal/operators/refCount");
-exports.refCount = refCount_1.refCount;
-var sample_1 = require("../internal/operators/sample");
-exports.sample = sample_1.sample;
-var sampleTime_1 = require("../internal/operators/sampleTime");
-exports.sampleTime = sampleTime_1.sampleTime;
-var scan_1 = require("../internal/operators/scan");
-exports.scan = scan_1.scan;
-var sequenceEqual_1 = require("../internal/operators/sequenceEqual");
-exports.sequenceEqual = sequenceEqual_1.sequenceEqual;
-var share_1 = require("../internal/operators/share");
-exports.share = share_1.share;
-var shareReplay_1 = require("../internal/operators/shareReplay");
-exports.shareReplay = shareReplay_1.shareReplay;
-var single_1 = require("../internal/operators/single");
-exports.single = single_1.single;
-var skip_1 = require("../internal/operators/skip");
-exports.skip = skip_1.skip;
-var skipLast_1 = require("../internal/operators/skipLast");
-exports.skipLast = skipLast_1.skipLast;
-var skipUntil_1 = require("../internal/operators/skipUntil");
-exports.skipUntil = skipUntil_1.skipUntil;
-var skipWhile_1 = require("../internal/operators/skipWhile");
-exports.skipWhile = skipWhile_1.skipWhile;
-var startWith_1 = require("../internal/operators/startWith");
-exports.startWith = startWith_1.startWith;
-var subscribeOn_1 = require("../internal/operators/subscribeOn");
-exports.subscribeOn = subscribeOn_1.subscribeOn;
-var switchAll_1 = require("../internal/operators/switchAll");
-exports.switchAll = switchAll_1.switchAll;
-var switchMap_1 = require("../internal/operators/switchMap");
-exports.switchMap = switchMap_1.switchMap;
-var switchMapTo_1 = require("../internal/operators/switchMapTo");
-exports.switchMapTo = switchMapTo_1.switchMapTo;
-var take_1 = require("../internal/operators/take");
-exports.take = take_1.take;
-var takeLast_1 = require("../internal/operators/takeLast");
-exports.takeLast = takeLast_1.takeLast;
-var takeUntil_1 = require("../internal/operators/takeUntil");
-exports.takeUntil = takeUntil_1.takeUntil;
-var takeWhile_1 = require("../internal/operators/takeWhile");
-exports.takeWhile = takeWhile_1.takeWhile;
-var tap_1 = require("../internal/operators/tap");
-exports.tap = tap_1.tap;
-var throttle_1 = require("../internal/operators/throttle");
-exports.throttle = throttle_1.throttle;
-var throttleTime_1 = require("../internal/operators/throttleTime");
-exports.throttleTime = throttleTime_1.throttleTime;
-var throwIfEmpty_1 = require("../internal/operators/throwIfEmpty");
-exports.throwIfEmpty = throwIfEmpty_1.throwIfEmpty;
-var timeInterval_1 = require("../internal/operators/timeInterval");
-exports.timeInterval = timeInterval_1.timeInterval;
-var timeout_1 = require("../internal/operators/timeout");
-exports.timeout = timeout_1.timeout;
-var timeoutWith_1 = require("../internal/operators/timeoutWith");
-exports.timeoutWith = timeoutWith_1.timeoutWith;
-var timestamp_1 = require("../internal/operators/timestamp");
-exports.timestamp = timestamp_1.timestamp;
-var toArray_1 = require("../internal/operators/toArray");
-exports.toArray = toArray_1.toArray;
-var window_1 = require("../internal/operators/window");
-exports.window = window_1.window;
-var windowCount_1 = require("../internal/operators/windowCount");
-exports.windowCount = windowCount_1.windowCount;
-var windowTime_1 = require("../internal/operators/windowTime");
-exports.windowTime = windowTime_1.windowTime;
-var windowToggle_1 = require("../internal/operators/windowToggle");
-exports.windowToggle = windowToggle_1.windowToggle;
-var windowWhen_1 = require("../internal/operators/windowWhen");
-exports.windowWhen = windowWhen_1.windowWhen;
-var withLatestFrom_1 = require("../internal/operators/withLatestFrom");
-exports.withLatestFrom = withLatestFrom_1.withLatestFrom;
-var zip_1 = require("../internal/operators/zip");
-exports.zip = zip_1.zip;
-var zipAll_1 = require("../internal/operators/zipAll");
-exports.zipAll = zipAll_1.zipAll;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/index.js.map b/node_modules/rxjs/operators/index.js.map
deleted file mode 100644
index e2c8202..0000000
--- a/node_modules/rxjs/operators/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../src/operators/index.ts"],"names":[],"mappings":"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"}
diff --git a/node_modules/rxjs/operators/isEmpty.d.ts b/node_modules/rxjs/operators/isEmpty.d.ts
deleted file mode 100644
index fd1d1af..0000000
--- a/node_modules/rxjs/operators/isEmpty.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/isEmpty';
diff --git a/node_modules/rxjs/operators/isEmpty.js b/node_modules/rxjs/operators/isEmpty.js
deleted file mode 100644
index 2defbb2..0000000
--- a/node_modules/rxjs/operators/isEmpty.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/isEmpty"));
-//# sourceMappingURL=isEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/isEmpty.js.map b/node_modules/rxjs/operators/isEmpty.js.map
deleted file mode 100644
index 48e47eb..0000000
--- a/node_modules/rxjs/operators/isEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isEmpty.js","sources":["../src/operators/isEmpty.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operators/last.d.ts b/node_modules/rxjs/operators/last.d.ts
deleted file mode 100644
index c8464bf..0000000
--- a/node_modules/rxjs/operators/last.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/last';
diff --git a/node_modules/rxjs/operators/last.js b/node_modules/rxjs/operators/last.js
deleted file mode 100644
index caebab4..0000000
--- a/node_modules/rxjs/operators/last.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/last"));
-//# sourceMappingURL=last.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/last.js.map b/node_modules/rxjs/operators/last.js.map
deleted file mode 100644
index c47a012..0000000
--- a/node_modules/rxjs/operators/last.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"last.js","sources":["../src/operators/last.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operators/map.d.ts b/node_modules/rxjs/operators/map.d.ts
deleted file mode 100644
index 7e8cb1f..0000000
--- a/node_modules/rxjs/operators/map.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/map';
diff --git a/node_modules/rxjs/operators/map.js b/node_modules/rxjs/operators/map.js
deleted file mode 100644
index 38d90af..0000000
--- a/node_modules/rxjs/operators/map.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/map"));
-//# sourceMappingURL=map.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/map.js.map b/node_modules/rxjs/operators/map.js.map
deleted file mode 100644
index a874325..0000000
--- a/node_modules/rxjs/operators/map.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"map.js","sources":["../src/operators/map.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/operators/mapTo.d.ts b/node_modules/rxjs/operators/mapTo.d.ts
deleted file mode 100644
index 72b4d9e..0000000
--- a/node_modules/rxjs/operators/mapTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/mapTo';
diff --git a/node_modules/rxjs/operators/mapTo.js b/node_modules/rxjs/operators/mapTo.js
deleted file mode 100644
index 9433d0c..0000000
--- a/node_modules/rxjs/operators/mapTo.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/mapTo"));
-//# sourceMappingURL=mapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/mapTo.js.map b/node_modules/rxjs/operators/mapTo.js.map
deleted file mode 100644
index a0c6b03..0000000
--- a/node_modules/rxjs/operators/mapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mapTo.js","sources":["../src/operators/mapTo.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operators/materialize.d.ts b/node_modules/rxjs/operators/materialize.d.ts
deleted file mode 100644
index e050f1e..0000000
--- a/node_modules/rxjs/operators/materialize.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/materialize';
diff --git a/node_modules/rxjs/operators/materialize.js b/node_modules/rxjs/operators/materialize.js
deleted file mode 100644
index d0e3267..0000000
--- a/node_modules/rxjs/operators/materialize.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/materialize"));
-//# sourceMappingURL=materialize.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/materialize.js.map b/node_modules/rxjs/operators/materialize.js.map
deleted file mode 100644
index de58757..0000000
--- a/node_modules/rxjs/operators/materialize.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"materialize.js","sources":["../src/operators/materialize.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operators/max.d.ts b/node_modules/rxjs/operators/max.d.ts
deleted file mode 100644
index 044da47..0000000
--- a/node_modules/rxjs/operators/max.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/max';
diff --git a/node_modules/rxjs/operators/max.js b/node_modules/rxjs/operators/max.js
deleted file mode 100644
index e4e8ef4..0000000
--- a/node_modules/rxjs/operators/max.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/max"));
-//# sourceMappingURL=max.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/max.js.map b/node_modules/rxjs/operators/max.js.map
deleted file mode 100644
index 4600fdb..0000000
--- a/node_modules/rxjs/operators/max.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"max.js","sources":["../src/operators/max.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/operators/merge.d.ts b/node_modules/rxjs/operators/merge.d.ts
deleted file mode 100644
index 7583aee..0000000
--- a/node_modules/rxjs/operators/merge.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/merge';
diff --git a/node_modules/rxjs/operators/merge.js b/node_modules/rxjs/operators/merge.js
deleted file mode 100644
index 4a41728..0000000
--- a/node_modules/rxjs/operators/merge.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/merge"));
-//# sourceMappingURL=merge.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/merge.js.map b/node_modules/rxjs/operators/merge.js.map
deleted file mode 100644
index d95ebb9..0000000
--- a/node_modules/rxjs/operators/merge.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"merge.js","sources":["../src/operators/merge.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operators/mergeAll.d.ts b/node_modules/rxjs/operators/mergeAll.d.ts
deleted file mode 100644
index b5c5b38..0000000
--- a/node_modules/rxjs/operators/mergeAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/mergeAll';
diff --git a/node_modules/rxjs/operators/mergeAll.js b/node_modules/rxjs/operators/mergeAll.js
deleted file mode 100644
index 574fd44..0000000
--- a/node_modules/rxjs/operators/mergeAll.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/mergeAll"));
-//# sourceMappingURL=mergeAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/mergeAll.js.map b/node_modules/rxjs/operators/mergeAll.js.map
deleted file mode 100644
index 7cb38bd..0000000
--- a/node_modules/rxjs/operators/mergeAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeAll.js","sources":["../src/operators/mergeAll.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operators/mergeMap.d.ts b/node_modules/rxjs/operators/mergeMap.d.ts
deleted file mode 100644
index af5c7c1..0000000
--- a/node_modules/rxjs/operators/mergeMap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/mergeMap';
diff --git a/node_modules/rxjs/operators/mergeMap.js b/node_modules/rxjs/operators/mergeMap.js
deleted file mode 100644
index a711dec..0000000
--- a/node_modules/rxjs/operators/mergeMap.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/mergeMap"));
-//# sourceMappingURL=mergeMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/mergeMap.js.map b/node_modules/rxjs/operators/mergeMap.js.map
deleted file mode 100644
index b484a44..0000000
--- a/node_modules/rxjs/operators/mergeMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeMap.js","sources":["../src/operators/mergeMap.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operators/mergeMapTo.d.ts b/node_modules/rxjs/operators/mergeMapTo.d.ts
deleted file mode 100644
index 67b6cb7..0000000
--- a/node_modules/rxjs/operators/mergeMapTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/mergeMapTo';
diff --git a/node_modules/rxjs/operators/mergeMapTo.js b/node_modules/rxjs/operators/mergeMapTo.js
deleted file mode 100644
index 13f37f0..0000000
--- a/node_modules/rxjs/operators/mergeMapTo.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/mergeMapTo"));
-//# sourceMappingURL=mergeMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/mergeMapTo.js.map b/node_modules/rxjs/operators/mergeMapTo.js.map
deleted file mode 100644
index dae529f..0000000
--- a/node_modules/rxjs/operators/mergeMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeMapTo.js","sources":["../src/operators/mergeMapTo.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operators/mergeScan.d.ts b/node_modules/rxjs/operators/mergeScan.d.ts
deleted file mode 100644
index ef73adc..0000000
--- a/node_modules/rxjs/operators/mergeScan.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/mergeScan';
diff --git a/node_modules/rxjs/operators/mergeScan.js b/node_modules/rxjs/operators/mergeScan.js
deleted file mode 100644
index 3bde4ec..0000000
--- a/node_modules/rxjs/operators/mergeScan.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/mergeScan"));
-//# sourceMappingURL=mergeScan.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/mergeScan.js.map b/node_modules/rxjs/operators/mergeScan.js.map
deleted file mode 100644
index 00177d7..0000000
--- a/node_modules/rxjs/operators/mergeScan.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"mergeScan.js","sources":["../src/operators/mergeScan.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/min.d.ts b/node_modules/rxjs/operators/min.d.ts
deleted file mode 100644
index 3706e3f..0000000
--- a/node_modules/rxjs/operators/min.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/min';
diff --git a/node_modules/rxjs/operators/min.js b/node_modules/rxjs/operators/min.js
deleted file mode 100644
index f9ae8e9..0000000
--- a/node_modules/rxjs/operators/min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/min"));
-//# sourceMappingURL=min.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/min.js.map b/node_modules/rxjs/operators/min.js.map
deleted file mode 100644
index 8343640..0000000
--- a/node_modules/rxjs/operators/min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"min.js","sources":["../src/operators/min.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/operators/multicast.d.ts b/node_modules/rxjs/operators/multicast.d.ts
deleted file mode 100644
index 9470284..0000000
--- a/node_modules/rxjs/operators/multicast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/multicast';
diff --git a/node_modules/rxjs/operators/multicast.js b/node_modules/rxjs/operators/multicast.js
deleted file mode 100644
index 50944ec..0000000
--- a/node_modules/rxjs/operators/multicast.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/multicast"));
-//# sourceMappingURL=multicast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/multicast.js.map b/node_modules/rxjs/operators/multicast.js.map
deleted file mode 100644
index 81a2af0..0000000
--- a/node_modules/rxjs/operators/multicast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"multicast.js","sources":["../src/operators/multicast.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/observeOn.d.ts b/node_modules/rxjs/operators/observeOn.d.ts
deleted file mode 100644
index 0f6d414..0000000
--- a/node_modules/rxjs/operators/observeOn.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/observeOn';
diff --git a/node_modules/rxjs/operators/observeOn.js b/node_modules/rxjs/operators/observeOn.js
deleted file mode 100644
index 6750c7e..0000000
--- a/node_modules/rxjs/operators/observeOn.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/observeOn"));
-//# sourceMappingURL=observeOn.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/observeOn.js.map b/node_modules/rxjs/operators/observeOn.js.map
deleted file mode 100644
index 8586b76..0000000
--- a/node_modules/rxjs/operators/observeOn.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"observeOn.js","sources":["../src/operators/observeOn.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/onErrorResumeNext.d.ts b/node_modules/rxjs/operators/onErrorResumeNext.d.ts
deleted file mode 100644
index 0b19815..0000000
--- a/node_modules/rxjs/operators/onErrorResumeNext.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/onErrorResumeNext';
diff --git a/node_modules/rxjs/operators/onErrorResumeNext.js b/node_modules/rxjs/operators/onErrorResumeNext.js
deleted file mode 100644
index d112fc4..0000000
--- a/node_modules/rxjs/operators/onErrorResumeNext.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/onErrorResumeNext"));
-//# sourceMappingURL=onErrorResumeNext.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/onErrorResumeNext.js.map b/node_modules/rxjs/operators/onErrorResumeNext.js.map
deleted file mode 100644
index 8ddaa18..0000000
--- a/node_modules/rxjs/operators/onErrorResumeNext.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"onErrorResumeNext.js","sources":["../src/operators/onErrorResumeNext.ts"],"names":[],"mappings":";;;;;AAAA,6DAAwD"}
diff --git a/node_modules/rxjs/operators/package.json b/node_modules/rxjs/operators/package.json
deleted file mode 100644
index eefac38..0000000
--- a/node_modules/rxjs/operators/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "rxjs/operators",
-  "typings": "./index.d.ts",
-  "main": "./index.js",
-  "module": "../_esm5/operators/index.js",
-  "es2015": "../_esm2015/operators/index.js",
-  "sideEffects": false
-}
diff --git a/node_modules/rxjs/operators/pairwise.d.ts b/node_modules/rxjs/operators/pairwise.d.ts
deleted file mode 100644
index f83f732..0000000
--- a/node_modules/rxjs/operators/pairwise.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/pairwise';
diff --git a/node_modules/rxjs/operators/pairwise.js b/node_modules/rxjs/operators/pairwise.js
deleted file mode 100644
index c2c1c47..0000000
--- a/node_modules/rxjs/operators/pairwise.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/pairwise"));
-//# sourceMappingURL=pairwise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/pairwise.js.map b/node_modules/rxjs/operators/pairwise.js.map
deleted file mode 100644
index fcd346e..0000000
--- a/node_modules/rxjs/operators/pairwise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pairwise.js","sources":["../src/operators/pairwise.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operators/partition.d.ts b/node_modules/rxjs/operators/partition.d.ts
deleted file mode 100644
index 3c82843..0000000
--- a/node_modules/rxjs/operators/partition.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/partition';
diff --git a/node_modules/rxjs/operators/partition.js b/node_modules/rxjs/operators/partition.js
deleted file mode 100644
index aebe750..0000000
--- a/node_modules/rxjs/operators/partition.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/partition"));
-//# sourceMappingURL=partition.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/partition.js.map b/node_modules/rxjs/operators/partition.js.map
deleted file mode 100644
index bcaac0b..0000000
--- a/node_modules/rxjs/operators/partition.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"partition.js","sources":["../src/operators/partition.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/pluck.d.ts b/node_modules/rxjs/operators/pluck.d.ts
deleted file mode 100644
index 2ac910a..0000000
--- a/node_modules/rxjs/operators/pluck.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/pluck';
diff --git a/node_modules/rxjs/operators/pluck.js b/node_modules/rxjs/operators/pluck.js
deleted file mode 100644
index 55abcab..0000000
--- a/node_modules/rxjs/operators/pluck.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/pluck"));
-//# sourceMappingURL=pluck.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/pluck.js.map b/node_modules/rxjs/operators/pluck.js.map
deleted file mode 100644
index a9a2a49..0000000
--- a/node_modules/rxjs/operators/pluck.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pluck.js","sources":["../src/operators/pluck.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operators/publish.d.ts b/node_modules/rxjs/operators/publish.d.ts
deleted file mode 100644
index a21951d..0000000
--- a/node_modules/rxjs/operators/publish.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/publish';
diff --git a/node_modules/rxjs/operators/publish.js b/node_modules/rxjs/operators/publish.js
deleted file mode 100644
index 7af4aea..0000000
--- a/node_modules/rxjs/operators/publish.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/publish"));
-//# sourceMappingURL=publish.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/publish.js.map b/node_modules/rxjs/operators/publish.js.map
deleted file mode 100644
index 40530d7..0000000
--- a/node_modules/rxjs/operators/publish.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publish.js","sources":["../src/operators/publish.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operators/publishBehavior.d.ts b/node_modules/rxjs/operators/publishBehavior.d.ts
deleted file mode 100644
index 53cbc37..0000000
--- a/node_modules/rxjs/operators/publishBehavior.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/publishBehavior';
diff --git a/node_modules/rxjs/operators/publishBehavior.js b/node_modules/rxjs/operators/publishBehavior.js
deleted file mode 100644
index cc52d3a..0000000
--- a/node_modules/rxjs/operators/publishBehavior.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/publishBehavior"));
-//# sourceMappingURL=publishBehavior.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/publishBehavior.js.map b/node_modules/rxjs/operators/publishBehavior.js.map
deleted file mode 100644
index 3bca777..0000000
--- a/node_modules/rxjs/operators/publishBehavior.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishBehavior.js","sources":["../src/operators/publishBehavior.ts"],"names":[],"mappings":";;;;;AAAA,2DAAsD"}
diff --git a/node_modules/rxjs/operators/publishLast.d.ts b/node_modules/rxjs/operators/publishLast.d.ts
deleted file mode 100644
index 0fcb439..0000000
--- a/node_modules/rxjs/operators/publishLast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/publishLast';
diff --git a/node_modules/rxjs/operators/publishLast.js b/node_modules/rxjs/operators/publishLast.js
deleted file mode 100644
index e9c94d6..0000000
--- a/node_modules/rxjs/operators/publishLast.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/publishLast"));
-//# sourceMappingURL=publishLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/publishLast.js.map b/node_modules/rxjs/operators/publishLast.js.map
deleted file mode 100644
index f3fab1a..0000000
--- a/node_modules/rxjs/operators/publishLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishLast.js","sources":["../src/operators/publishLast.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operators/publishReplay.d.ts b/node_modules/rxjs/operators/publishReplay.d.ts
deleted file mode 100644
index ff87a2d..0000000
--- a/node_modules/rxjs/operators/publishReplay.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/publishReplay';
diff --git a/node_modules/rxjs/operators/publishReplay.js b/node_modules/rxjs/operators/publishReplay.js
deleted file mode 100644
index f280e18..0000000
--- a/node_modules/rxjs/operators/publishReplay.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/publishReplay"));
-//# sourceMappingURL=publishReplay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/publishReplay.js.map b/node_modules/rxjs/operators/publishReplay.js.map
deleted file mode 100644
index 50c7316..0000000
--- a/node_modules/rxjs/operators/publishReplay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"publishReplay.js","sources":["../src/operators/publishReplay.ts"],"names":[],"mappings":";;;;;AAAA,yDAAoD"}
diff --git a/node_modules/rxjs/operators/race.d.ts b/node_modules/rxjs/operators/race.d.ts
deleted file mode 100644
index 95047c7..0000000
--- a/node_modules/rxjs/operators/race.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/race';
diff --git a/node_modules/rxjs/operators/race.js b/node_modules/rxjs/operators/race.js
deleted file mode 100644
index dae6776..0000000
--- a/node_modules/rxjs/operators/race.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/race"));
-//# sourceMappingURL=race.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/race.js.map b/node_modules/rxjs/operators/race.js.map
deleted file mode 100644
index 4e14245..0000000
--- a/node_modules/rxjs/operators/race.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"race.js","sources":["../src/operators/race.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operators/reduce.d.ts b/node_modules/rxjs/operators/reduce.d.ts
deleted file mode 100644
index abb05c3..0000000
--- a/node_modules/rxjs/operators/reduce.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/reduce';
diff --git a/node_modules/rxjs/operators/reduce.js b/node_modules/rxjs/operators/reduce.js
deleted file mode 100644
index 83c2fab..0000000
--- a/node_modules/rxjs/operators/reduce.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/reduce"));
-//# sourceMappingURL=reduce.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/reduce.js.map b/node_modules/rxjs/operators/reduce.js.map
deleted file mode 100644
index c1424d3..0000000
--- a/node_modules/rxjs/operators/reduce.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"reduce.js","sources":["../src/operators/reduce.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operators/refCount.d.ts b/node_modules/rxjs/operators/refCount.d.ts
deleted file mode 100644
index 3c38baa..0000000
--- a/node_modules/rxjs/operators/refCount.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/refCount';
diff --git a/node_modules/rxjs/operators/refCount.js b/node_modules/rxjs/operators/refCount.js
deleted file mode 100644
index 7dc9b93..0000000
--- a/node_modules/rxjs/operators/refCount.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/refCount"));
-//# sourceMappingURL=refCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/refCount.js.map b/node_modules/rxjs/operators/refCount.js.map
deleted file mode 100644
index 03f81ae..0000000
--- a/node_modules/rxjs/operators/refCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"refCount.js","sources":["../src/operators/refCount.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operators/repeat.d.ts b/node_modules/rxjs/operators/repeat.d.ts
deleted file mode 100644
index 1f36353..0000000
--- a/node_modules/rxjs/operators/repeat.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/repeat';
diff --git a/node_modules/rxjs/operators/repeat.js b/node_modules/rxjs/operators/repeat.js
deleted file mode 100644
index 614eee6..0000000
--- a/node_modules/rxjs/operators/repeat.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/repeat"));
-//# sourceMappingURL=repeat.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/repeat.js.map b/node_modules/rxjs/operators/repeat.js.map
deleted file mode 100644
index 0571937..0000000
--- a/node_modules/rxjs/operators/repeat.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"repeat.js","sources":["../src/operators/repeat.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operators/repeatWhen.d.ts b/node_modules/rxjs/operators/repeatWhen.d.ts
deleted file mode 100644
index df052ac..0000000
--- a/node_modules/rxjs/operators/repeatWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/repeatWhen';
diff --git a/node_modules/rxjs/operators/repeatWhen.js b/node_modules/rxjs/operators/repeatWhen.js
deleted file mode 100644
index 25b5348..0000000
--- a/node_modules/rxjs/operators/repeatWhen.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/repeatWhen"));
-//# sourceMappingURL=repeatWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/repeatWhen.js.map b/node_modules/rxjs/operators/repeatWhen.js.map
deleted file mode 100644
index 261d64f..0000000
--- a/node_modules/rxjs/operators/repeatWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"repeatWhen.js","sources":["../src/operators/repeatWhen.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operators/retry.d.ts b/node_modules/rxjs/operators/retry.d.ts
deleted file mode 100644
index b8d2fee..0000000
--- a/node_modules/rxjs/operators/retry.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/retry';
diff --git a/node_modules/rxjs/operators/retry.js b/node_modules/rxjs/operators/retry.js
deleted file mode 100644
index 32e814e..0000000
--- a/node_modules/rxjs/operators/retry.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/retry"));
-//# sourceMappingURL=retry.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/retry.js.map b/node_modules/rxjs/operators/retry.js.map
deleted file mode 100644
index e714e35..0000000
--- a/node_modules/rxjs/operators/retry.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"retry.js","sources":["../src/operators/retry.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operators/retryWhen.d.ts b/node_modules/rxjs/operators/retryWhen.d.ts
deleted file mode 100644
index 00f9bdf..0000000
--- a/node_modules/rxjs/operators/retryWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/retryWhen';
diff --git a/node_modules/rxjs/operators/retryWhen.js b/node_modules/rxjs/operators/retryWhen.js
deleted file mode 100644
index 1f2912e..0000000
--- a/node_modules/rxjs/operators/retryWhen.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/retryWhen"));
-//# sourceMappingURL=retryWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/retryWhen.js.map b/node_modules/rxjs/operators/retryWhen.js.map
deleted file mode 100644
index 8d736e4..0000000
--- a/node_modules/rxjs/operators/retryWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"retryWhen.js","sources":["../src/operators/retryWhen.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/sample.d.ts b/node_modules/rxjs/operators/sample.d.ts
deleted file mode 100644
index 0e05a4b..0000000
--- a/node_modules/rxjs/operators/sample.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/sample';
diff --git a/node_modules/rxjs/operators/sample.js b/node_modules/rxjs/operators/sample.js
deleted file mode 100644
index 0160e20..0000000
--- a/node_modules/rxjs/operators/sample.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/sample"));
-//# sourceMappingURL=sample.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/sample.js.map b/node_modules/rxjs/operators/sample.js.map
deleted file mode 100644
index 5d09870..0000000
--- a/node_modules/rxjs/operators/sample.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sample.js","sources":["../src/operators/sample.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operators/sampleTime.d.ts b/node_modules/rxjs/operators/sampleTime.d.ts
deleted file mode 100644
index 5041a51..0000000
--- a/node_modules/rxjs/operators/sampleTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/sampleTime';
diff --git a/node_modules/rxjs/operators/sampleTime.js b/node_modules/rxjs/operators/sampleTime.js
deleted file mode 100644
index 8686c55..0000000
--- a/node_modules/rxjs/operators/sampleTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/sampleTime"));
-//# sourceMappingURL=sampleTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/sampleTime.js.map b/node_modules/rxjs/operators/sampleTime.js.map
deleted file mode 100644
index 986c3d6..0000000
--- a/node_modules/rxjs/operators/sampleTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sampleTime.js","sources":["../src/operators/sampleTime.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operators/scan.d.ts b/node_modules/rxjs/operators/scan.d.ts
deleted file mode 100644
index acaee73..0000000
--- a/node_modules/rxjs/operators/scan.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/scan';
diff --git a/node_modules/rxjs/operators/scan.js b/node_modules/rxjs/operators/scan.js
deleted file mode 100644
index 68d2483..0000000
--- a/node_modules/rxjs/operators/scan.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/scan"));
-//# sourceMappingURL=scan.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/scan.js.map b/node_modules/rxjs/operators/scan.js.map
deleted file mode 100644
index 322d5c0..0000000
--- a/node_modules/rxjs/operators/scan.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"scan.js","sources":["../src/operators/scan.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operators/sequenceEqual.d.ts b/node_modules/rxjs/operators/sequenceEqual.d.ts
deleted file mode 100644
index 0a6e3cb..0000000
--- a/node_modules/rxjs/operators/sequenceEqual.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/sequenceEqual';
diff --git a/node_modules/rxjs/operators/sequenceEqual.js b/node_modules/rxjs/operators/sequenceEqual.js
deleted file mode 100644
index 1a7bc9c..0000000
--- a/node_modules/rxjs/operators/sequenceEqual.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/sequenceEqual"));
-//# sourceMappingURL=sequenceEqual.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/sequenceEqual.js.map b/node_modules/rxjs/operators/sequenceEqual.js.map
deleted file mode 100644
index 0eb7640..0000000
--- a/node_modules/rxjs/operators/sequenceEqual.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"sequenceEqual.js","sources":["../src/operators/sequenceEqual.ts"],"names":[],"mappings":";;;;;AAAA,yDAAoD"}
diff --git a/node_modules/rxjs/operators/share.d.ts b/node_modules/rxjs/operators/share.d.ts
deleted file mode 100644
index fd113fd..0000000
--- a/node_modules/rxjs/operators/share.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/share';
diff --git a/node_modules/rxjs/operators/share.js b/node_modules/rxjs/operators/share.js
deleted file mode 100644
index 1884717..0000000
--- a/node_modules/rxjs/operators/share.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/share"));
-//# sourceMappingURL=share.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/share.js.map b/node_modules/rxjs/operators/share.js.map
deleted file mode 100644
index 31089f1..0000000
--- a/node_modules/rxjs/operators/share.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"share.js","sources":["../src/operators/share.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/operators/shareReplay.d.ts b/node_modules/rxjs/operators/shareReplay.d.ts
deleted file mode 100644
index d489c81..0000000
--- a/node_modules/rxjs/operators/shareReplay.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/shareReplay';
diff --git a/node_modules/rxjs/operators/shareReplay.js b/node_modules/rxjs/operators/shareReplay.js
deleted file mode 100644
index 4cd6e79..0000000
--- a/node_modules/rxjs/operators/shareReplay.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/shareReplay"));
-//# sourceMappingURL=shareReplay.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/shareReplay.js.map b/node_modules/rxjs/operators/shareReplay.js.map
deleted file mode 100644
index e21e1fa..0000000
--- a/node_modules/rxjs/operators/shareReplay.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"shareReplay.js","sources":["../src/operators/shareReplay.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operators/single.d.ts b/node_modules/rxjs/operators/single.d.ts
deleted file mode 100644
index 096d4b4..0000000
--- a/node_modules/rxjs/operators/single.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/single';
diff --git a/node_modules/rxjs/operators/single.js b/node_modules/rxjs/operators/single.js
deleted file mode 100644
index 8558c1a..0000000
--- a/node_modules/rxjs/operators/single.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/single"));
-//# sourceMappingURL=single.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/single.js.map b/node_modules/rxjs/operators/single.js.map
deleted file mode 100644
index 177faad..0000000
--- a/node_modules/rxjs/operators/single.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"single.js","sources":["../src/operators/single.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operators/skip.d.ts b/node_modules/rxjs/operators/skip.d.ts
deleted file mode 100644
index 002baeb..0000000
--- a/node_modules/rxjs/operators/skip.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/skip';
diff --git a/node_modules/rxjs/operators/skip.js b/node_modules/rxjs/operators/skip.js
deleted file mode 100644
index 36aedaf..0000000
--- a/node_modules/rxjs/operators/skip.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/skip"));
-//# sourceMappingURL=skip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/skip.js.map b/node_modules/rxjs/operators/skip.js.map
deleted file mode 100644
index c205efa..0000000
--- a/node_modules/rxjs/operators/skip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skip.js","sources":["../src/operators/skip.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operators/skipLast.d.ts b/node_modules/rxjs/operators/skipLast.d.ts
deleted file mode 100644
index 15d1c49..0000000
--- a/node_modules/rxjs/operators/skipLast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/skipLast';
diff --git a/node_modules/rxjs/operators/skipLast.js b/node_modules/rxjs/operators/skipLast.js
deleted file mode 100644
index 1cc0d95..0000000
--- a/node_modules/rxjs/operators/skipLast.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/skipLast"));
-//# sourceMappingURL=skipLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/skipLast.js.map b/node_modules/rxjs/operators/skipLast.js.map
deleted file mode 100644
index 3681a82..0000000
--- a/node_modules/rxjs/operators/skipLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipLast.js","sources":["../src/operators/skipLast.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operators/skipUntil.d.ts b/node_modules/rxjs/operators/skipUntil.d.ts
deleted file mode 100644
index 4193fe2..0000000
--- a/node_modules/rxjs/operators/skipUntil.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/skipUntil';
diff --git a/node_modules/rxjs/operators/skipUntil.js b/node_modules/rxjs/operators/skipUntil.js
deleted file mode 100644
index 8c3a835..0000000
--- a/node_modules/rxjs/operators/skipUntil.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/skipUntil"));
-//# sourceMappingURL=skipUntil.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/skipUntil.js.map b/node_modules/rxjs/operators/skipUntil.js.map
deleted file mode 100644
index 7a5b403..0000000
--- a/node_modules/rxjs/operators/skipUntil.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipUntil.js","sources":["../src/operators/skipUntil.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/skipWhile.d.ts b/node_modules/rxjs/operators/skipWhile.d.ts
deleted file mode 100644
index 34fb4d6..0000000
--- a/node_modules/rxjs/operators/skipWhile.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/skipWhile';
diff --git a/node_modules/rxjs/operators/skipWhile.js b/node_modules/rxjs/operators/skipWhile.js
deleted file mode 100644
index ef5af62..0000000
--- a/node_modules/rxjs/operators/skipWhile.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/skipWhile"));
-//# sourceMappingURL=skipWhile.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/skipWhile.js.map b/node_modules/rxjs/operators/skipWhile.js.map
deleted file mode 100644
index af6476f..0000000
--- a/node_modules/rxjs/operators/skipWhile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"skipWhile.js","sources":["../src/operators/skipWhile.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/startWith.d.ts b/node_modules/rxjs/operators/startWith.d.ts
deleted file mode 100644
index 901bbba..0000000
--- a/node_modules/rxjs/operators/startWith.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/startWith';
diff --git a/node_modules/rxjs/operators/startWith.js b/node_modules/rxjs/operators/startWith.js
deleted file mode 100644
index 91f8d0f..0000000
--- a/node_modules/rxjs/operators/startWith.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/startWith"));
-//# sourceMappingURL=startWith.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/startWith.js.map b/node_modules/rxjs/operators/startWith.js.map
deleted file mode 100644
index df03b11..0000000
--- a/node_modules/rxjs/operators/startWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"startWith.js","sources":["../src/operators/startWith.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/subscribeOn.d.ts b/node_modules/rxjs/operators/subscribeOn.d.ts
deleted file mode 100644
index eb1c233..0000000
--- a/node_modules/rxjs/operators/subscribeOn.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/subscribeOn';
diff --git a/node_modules/rxjs/operators/subscribeOn.js b/node_modules/rxjs/operators/subscribeOn.js
deleted file mode 100644
index 76672d6..0000000
--- a/node_modules/rxjs/operators/subscribeOn.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/subscribeOn"));
-//# sourceMappingURL=subscribeOn.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/subscribeOn.js.map b/node_modules/rxjs/operators/subscribeOn.js.map
deleted file mode 100644
index 347c48e..0000000
--- a/node_modules/rxjs/operators/subscribeOn.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeOn.js","sources":["../src/operators/subscribeOn.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operators/switchAll.d.ts b/node_modules/rxjs/operators/switchAll.d.ts
deleted file mode 100644
index 37a8c20..0000000
--- a/node_modules/rxjs/operators/switchAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/switchAll';
diff --git a/node_modules/rxjs/operators/switchAll.js b/node_modules/rxjs/operators/switchAll.js
deleted file mode 100644
index 5545f36..0000000
--- a/node_modules/rxjs/operators/switchAll.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/switchAll"));
-//# sourceMappingURL=switchAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/switchAll.js.map b/node_modules/rxjs/operators/switchAll.js.map
deleted file mode 100644
index b2c25f7..0000000
--- a/node_modules/rxjs/operators/switchAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchAll.js","sources":["../src/operators/switchAll.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/switchMap.d.ts b/node_modules/rxjs/operators/switchMap.d.ts
deleted file mode 100644
index 840c2c7..0000000
--- a/node_modules/rxjs/operators/switchMap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/switchMap';
diff --git a/node_modules/rxjs/operators/switchMap.js b/node_modules/rxjs/operators/switchMap.js
deleted file mode 100644
index 0b32ced..0000000
--- a/node_modules/rxjs/operators/switchMap.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/switchMap"));
-//# sourceMappingURL=switchMap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/switchMap.js.map b/node_modules/rxjs/operators/switchMap.js.map
deleted file mode 100644
index 6cf7fe0..0000000
--- a/node_modules/rxjs/operators/switchMap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchMap.js","sources":["../src/operators/switchMap.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/switchMapTo.d.ts b/node_modules/rxjs/operators/switchMapTo.d.ts
deleted file mode 100644
index fbefdfe..0000000
--- a/node_modules/rxjs/operators/switchMapTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/switchMapTo';
diff --git a/node_modules/rxjs/operators/switchMapTo.js b/node_modules/rxjs/operators/switchMapTo.js
deleted file mode 100644
index 73735d7..0000000
--- a/node_modules/rxjs/operators/switchMapTo.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/switchMapTo"));
-//# sourceMappingURL=switchMapTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/switchMapTo.js.map b/node_modules/rxjs/operators/switchMapTo.js.map
deleted file mode 100644
index 45d2c8b..0000000
--- a/node_modules/rxjs/operators/switchMapTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"switchMapTo.js","sources":["../src/operators/switchMapTo.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operators/take.d.ts b/node_modules/rxjs/operators/take.d.ts
deleted file mode 100644
index 1176ad7..0000000
--- a/node_modules/rxjs/operators/take.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/take';
diff --git a/node_modules/rxjs/operators/take.js b/node_modules/rxjs/operators/take.js
deleted file mode 100644
index 8877ecd..0000000
--- a/node_modules/rxjs/operators/take.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/take"));
-//# sourceMappingURL=take.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/take.js.map b/node_modules/rxjs/operators/take.js.map
deleted file mode 100644
index f577342..0000000
--- a/node_modules/rxjs/operators/take.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"take.js","sources":["../src/operators/take.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/operators/takeLast.d.ts b/node_modules/rxjs/operators/takeLast.d.ts
deleted file mode 100644
index 35e85f2..0000000
--- a/node_modules/rxjs/operators/takeLast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/takeLast';
diff --git a/node_modules/rxjs/operators/takeLast.js b/node_modules/rxjs/operators/takeLast.js
deleted file mode 100644
index 4f0c1c7..0000000
--- a/node_modules/rxjs/operators/takeLast.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/takeLast"));
-//# sourceMappingURL=takeLast.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/takeLast.js.map b/node_modules/rxjs/operators/takeLast.js.map
deleted file mode 100644
index 3d8dd40..0000000
--- a/node_modules/rxjs/operators/takeLast.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeLast.js","sources":["../src/operators/takeLast.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operators/takeUntil.d.ts b/node_modules/rxjs/operators/takeUntil.d.ts
deleted file mode 100644
index 828abef..0000000
--- a/node_modules/rxjs/operators/takeUntil.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/takeUntil';
diff --git a/node_modules/rxjs/operators/takeUntil.js b/node_modules/rxjs/operators/takeUntil.js
deleted file mode 100644
index e22bd65..0000000
--- a/node_modules/rxjs/operators/takeUntil.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/takeUntil"));
-//# sourceMappingURL=takeUntil.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/takeUntil.js.map b/node_modules/rxjs/operators/takeUntil.js.map
deleted file mode 100644
index e1866a7..0000000
--- a/node_modules/rxjs/operators/takeUntil.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeUntil.js","sources":["../src/operators/takeUntil.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/takeWhile.d.ts b/node_modules/rxjs/operators/takeWhile.d.ts
deleted file mode 100644
index c3edb4e..0000000
--- a/node_modules/rxjs/operators/takeWhile.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/takeWhile';
diff --git a/node_modules/rxjs/operators/takeWhile.js b/node_modules/rxjs/operators/takeWhile.js
deleted file mode 100644
index 57dd0bd..0000000
--- a/node_modules/rxjs/operators/takeWhile.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/takeWhile"));
-//# sourceMappingURL=takeWhile.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/takeWhile.js.map b/node_modules/rxjs/operators/takeWhile.js.map
deleted file mode 100644
index bcb90c4..0000000
--- a/node_modules/rxjs/operators/takeWhile.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"takeWhile.js","sources":["../src/operators/takeWhile.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/tap.d.ts b/node_modules/rxjs/operators/tap.d.ts
deleted file mode 100644
index 6190e75..0000000
--- a/node_modules/rxjs/operators/tap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/tap';
diff --git a/node_modules/rxjs/operators/tap.js b/node_modules/rxjs/operators/tap.js
deleted file mode 100644
index 03e5305..0000000
--- a/node_modules/rxjs/operators/tap.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/tap"));
-//# sourceMappingURL=tap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/tap.js.map b/node_modules/rxjs/operators/tap.js.map
deleted file mode 100644
index fbbdbcc..0000000
--- a/node_modules/rxjs/operators/tap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"tap.js","sources":["../src/operators/tap.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/operators/throttle.d.ts b/node_modules/rxjs/operators/throttle.d.ts
deleted file mode 100644
index f887a2f..0000000
--- a/node_modules/rxjs/operators/throttle.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/throttle';
diff --git a/node_modules/rxjs/operators/throttle.js b/node_modules/rxjs/operators/throttle.js
deleted file mode 100644
index 6d22ee1..0000000
--- a/node_modules/rxjs/operators/throttle.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/throttle"));
-//# sourceMappingURL=throttle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/throttle.js.map b/node_modules/rxjs/operators/throttle.js.map
deleted file mode 100644
index 719fa20..0000000
--- a/node_modules/rxjs/operators/throttle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throttle.js","sources":["../src/operators/throttle.ts"],"names":[],"mappings":";;;;;AAAA,oDAA+C"}
diff --git a/node_modules/rxjs/operators/throttleTime.d.ts b/node_modules/rxjs/operators/throttleTime.d.ts
deleted file mode 100644
index 8fbd3c8..0000000
--- a/node_modules/rxjs/operators/throttleTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/throttleTime';
diff --git a/node_modules/rxjs/operators/throttleTime.js b/node_modules/rxjs/operators/throttleTime.js
deleted file mode 100644
index f8678a7..0000000
--- a/node_modules/rxjs/operators/throttleTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/throttleTime"));
-//# sourceMappingURL=throttleTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/throttleTime.js.map b/node_modules/rxjs/operators/throttleTime.js.map
deleted file mode 100644
index b72849c..0000000
--- a/node_modules/rxjs/operators/throttleTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throttleTime.js","sources":["../src/operators/throttleTime.ts"],"names":[],"mappings":";;;;;AAAA,wDAAmD"}
diff --git a/node_modules/rxjs/operators/throwIfEmpty.d.ts b/node_modules/rxjs/operators/throwIfEmpty.d.ts
deleted file mode 100644
index 6bb64cd..0000000
--- a/node_modules/rxjs/operators/throwIfEmpty.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/throwIfEmpty';
diff --git a/node_modules/rxjs/operators/throwIfEmpty.js b/node_modules/rxjs/operators/throwIfEmpty.js
deleted file mode 100644
index cbbedaf..0000000
--- a/node_modules/rxjs/operators/throwIfEmpty.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/throwIfEmpty"));
-//# sourceMappingURL=throwIfEmpty.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/throwIfEmpty.js.map b/node_modules/rxjs/operators/throwIfEmpty.js.map
deleted file mode 100644
index 97ff196..0000000
--- a/node_modules/rxjs/operators/throwIfEmpty.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"throwIfEmpty.js","sources":["../src/operators/throwIfEmpty.ts"],"names":[],"mappings":";;;;;AAAA,wDAAmD"}
diff --git a/node_modules/rxjs/operators/timeInterval.d.ts b/node_modules/rxjs/operators/timeInterval.d.ts
deleted file mode 100644
index 6af3911..0000000
--- a/node_modules/rxjs/operators/timeInterval.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/timeInterval';
diff --git a/node_modules/rxjs/operators/timeInterval.js b/node_modules/rxjs/operators/timeInterval.js
deleted file mode 100644
index a26261c..0000000
--- a/node_modules/rxjs/operators/timeInterval.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/timeInterval"));
-//# sourceMappingURL=timeInterval.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/timeInterval.js.map b/node_modules/rxjs/operators/timeInterval.js.map
deleted file mode 100644
index dbc2e59..0000000
--- a/node_modules/rxjs/operators/timeInterval.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeInterval.js","sources":["../src/operators/timeInterval.ts"],"names":[],"mappings":";;;;;AAAA,wDAAmD"}
diff --git a/node_modules/rxjs/operators/timeout.d.ts b/node_modules/rxjs/operators/timeout.d.ts
deleted file mode 100644
index c4a43f1..0000000
--- a/node_modules/rxjs/operators/timeout.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/timeout';
diff --git a/node_modules/rxjs/operators/timeout.js b/node_modules/rxjs/operators/timeout.js
deleted file mode 100644
index f16b42e..0000000
--- a/node_modules/rxjs/operators/timeout.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/timeout"));
-//# sourceMappingURL=timeout.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/timeout.js.map b/node_modules/rxjs/operators/timeout.js.map
deleted file mode 100644
index d7840c6..0000000
--- a/node_modules/rxjs/operators/timeout.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeout.js","sources":["../src/operators/timeout.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operators/timeoutWith.d.ts b/node_modules/rxjs/operators/timeoutWith.d.ts
deleted file mode 100644
index 2cfcad8..0000000
--- a/node_modules/rxjs/operators/timeoutWith.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/timeoutWith';
diff --git a/node_modules/rxjs/operators/timeoutWith.js b/node_modules/rxjs/operators/timeoutWith.js
deleted file mode 100644
index 44b98a6..0000000
--- a/node_modules/rxjs/operators/timeoutWith.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/timeoutWith"));
-//# sourceMappingURL=timeoutWith.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/timeoutWith.js.map b/node_modules/rxjs/operators/timeoutWith.js.map
deleted file mode 100644
index e0d8e13..0000000
--- a/node_modules/rxjs/operators/timeoutWith.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timeoutWith.js","sources":["../src/operators/timeoutWith.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operators/timestamp.d.ts b/node_modules/rxjs/operators/timestamp.d.ts
deleted file mode 100644
index 6580e38..0000000
--- a/node_modules/rxjs/operators/timestamp.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/timestamp';
diff --git a/node_modules/rxjs/operators/timestamp.js b/node_modules/rxjs/operators/timestamp.js
deleted file mode 100644
index 503edd0..0000000
--- a/node_modules/rxjs/operators/timestamp.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/timestamp"));
-//# sourceMappingURL=timestamp.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/timestamp.js.map b/node_modules/rxjs/operators/timestamp.js.map
deleted file mode 100644
index 1b99816..0000000
--- a/node_modules/rxjs/operators/timestamp.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"timestamp.js","sources":["../src/operators/timestamp.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/operators/toArray.d.ts b/node_modules/rxjs/operators/toArray.d.ts
deleted file mode 100644
index 7f678db..0000000
--- a/node_modules/rxjs/operators/toArray.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/toArray';
diff --git a/node_modules/rxjs/operators/toArray.js b/node_modules/rxjs/operators/toArray.js
deleted file mode 100644
index c7ddd80..0000000
--- a/node_modules/rxjs/operators/toArray.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/toArray"));
-//# sourceMappingURL=toArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/toArray.js.map b/node_modules/rxjs/operators/toArray.js.map
deleted file mode 100644
index fde0f54..0000000
--- a/node_modules/rxjs/operators/toArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"toArray.js","sources":["../src/operators/toArray.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/operators/window.d.ts b/node_modules/rxjs/operators/window.d.ts
deleted file mode 100644
index 2642141..0000000
--- a/node_modules/rxjs/operators/window.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/window';
diff --git a/node_modules/rxjs/operators/window.js b/node_modules/rxjs/operators/window.js
deleted file mode 100644
index a9a47f1..0000000
--- a/node_modules/rxjs/operators/window.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/window"));
-//# sourceMappingURL=window.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/window.js.map b/node_modules/rxjs/operators/window.js.map
deleted file mode 100644
index 826df0d..0000000
--- a/node_modules/rxjs/operators/window.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"window.js","sources":["../src/operators/window.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/operators/windowCount.d.ts b/node_modules/rxjs/operators/windowCount.d.ts
deleted file mode 100644
index b774707..0000000
--- a/node_modules/rxjs/operators/windowCount.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/windowCount';
diff --git a/node_modules/rxjs/operators/windowCount.js b/node_modules/rxjs/operators/windowCount.js
deleted file mode 100644
index fce57b9..0000000
--- a/node_modules/rxjs/operators/windowCount.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/windowCount"));
-//# sourceMappingURL=windowCount.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/windowCount.js.map b/node_modules/rxjs/operators/windowCount.js.map
deleted file mode 100644
index 413156a..0000000
--- a/node_modules/rxjs/operators/windowCount.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowCount.js","sources":["../src/operators/windowCount.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/operators/windowTime.d.ts b/node_modules/rxjs/operators/windowTime.d.ts
deleted file mode 100644
index 2cbf76f..0000000
--- a/node_modules/rxjs/operators/windowTime.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/windowTime';
diff --git a/node_modules/rxjs/operators/windowTime.js b/node_modules/rxjs/operators/windowTime.js
deleted file mode 100644
index 3befdf0..0000000
--- a/node_modules/rxjs/operators/windowTime.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/windowTime"));
-//# sourceMappingURL=windowTime.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/windowTime.js.map b/node_modules/rxjs/operators/windowTime.js.map
deleted file mode 100644
index 4da1799..0000000
--- a/node_modules/rxjs/operators/windowTime.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowTime.js","sources":["../src/operators/windowTime.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operators/windowToggle.d.ts b/node_modules/rxjs/operators/windowToggle.d.ts
deleted file mode 100644
index b116f17..0000000
--- a/node_modules/rxjs/operators/windowToggle.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/windowToggle';
diff --git a/node_modules/rxjs/operators/windowToggle.js b/node_modules/rxjs/operators/windowToggle.js
deleted file mode 100644
index d055c84..0000000
--- a/node_modules/rxjs/operators/windowToggle.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/windowToggle"));
-//# sourceMappingURL=windowToggle.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/windowToggle.js.map b/node_modules/rxjs/operators/windowToggle.js.map
deleted file mode 100644
index 8724be9..0000000
--- a/node_modules/rxjs/operators/windowToggle.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowToggle.js","sources":["../src/operators/windowToggle.ts"],"names":[],"mappings":";;;;;AAAA,wDAAmD"}
diff --git a/node_modules/rxjs/operators/windowWhen.d.ts b/node_modules/rxjs/operators/windowWhen.d.ts
deleted file mode 100644
index 782d4dc..0000000
--- a/node_modules/rxjs/operators/windowWhen.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/windowWhen';
diff --git a/node_modules/rxjs/operators/windowWhen.js b/node_modules/rxjs/operators/windowWhen.js
deleted file mode 100644
index f786334..0000000
--- a/node_modules/rxjs/operators/windowWhen.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/windowWhen"));
-//# sourceMappingURL=windowWhen.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/windowWhen.js.map b/node_modules/rxjs/operators/windowWhen.js.map
deleted file mode 100644
index f05c5ae..0000000
--- a/node_modules/rxjs/operators/windowWhen.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"windowWhen.js","sources":["../src/operators/windowWhen.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/operators/withLatestFrom.d.ts b/node_modules/rxjs/operators/withLatestFrom.d.ts
deleted file mode 100644
index 15f7450..0000000
--- a/node_modules/rxjs/operators/withLatestFrom.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/withLatestFrom';
diff --git a/node_modules/rxjs/operators/withLatestFrom.js b/node_modules/rxjs/operators/withLatestFrom.js
deleted file mode 100644
index f39e3de..0000000
--- a/node_modules/rxjs/operators/withLatestFrom.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/withLatestFrom"));
-//# sourceMappingURL=withLatestFrom.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/withLatestFrom.js.map b/node_modules/rxjs/operators/withLatestFrom.js.map
deleted file mode 100644
index 1175b2e..0000000
--- a/node_modules/rxjs/operators/withLatestFrom.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"withLatestFrom.js","sources":["../src/operators/withLatestFrom.ts"],"names":[],"mappings":";;;;;AAAA,0DAAqD"}
diff --git a/node_modules/rxjs/operators/zip.d.ts b/node_modules/rxjs/operators/zip.d.ts
deleted file mode 100644
index c75d56f..0000000
--- a/node_modules/rxjs/operators/zip.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/zip';
diff --git a/node_modules/rxjs/operators/zip.js b/node_modules/rxjs/operators/zip.js
deleted file mode 100644
index eabdfa4..0000000
--- a/node_modules/rxjs/operators/zip.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/zip"));
-//# sourceMappingURL=zip.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/zip.js.map b/node_modules/rxjs/operators/zip.js.map
deleted file mode 100644
index 24f8f22..0000000
--- a/node_modules/rxjs/operators/zip.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zip.js","sources":["../src/operators/zip.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/operators/zipAll.d.ts b/node_modules/rxjs/operators/zipAll.d.ts
deleted file mode 100644
index 3e69835..0000000
--- a/node_modules/rxjs/operators/zipAll.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/zipAll';
diff --git a/node_modules/rxjs/operators/zipAll.js b/node_modules/rxjs/operators/zipAll.js
deleted file mode 100644
index 2a5ebe6..0000000
--- a/node_modules/rxjs/operators/zipAll.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/operators/zipAll"));
-//# sourceMappingURL=zipAll.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/operators/zipAll.js.map b/node_modules/rxjs/operators/zipAll.js.map
deleted file mode 100644
index c6e0168..0000000
--- a/node_modules/rxjs/operators/zipAll.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"zipAll.js","sources":["../src/operators/zipAll.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/package.json b/node_modules/rxjs/package.json
deleted file mode 100644
index 5b49a01..0000000
--- a/node_modules/rxjs/package.json
+++ /dev/null
@@ -1,180 +0,0 @@
-{
-  "name": "rxjs",
-  "version": "6.5.4",
-  "description": "Reactive Extensions for modern JavaScript",
-  "main": "./index.js",
-  "sideEffects": false,
-  "config": {
-    "commitizen": {
-      "path": "cz-conventional-changelog"
-    }
-  },
-  "nyc": {
-    "include": [
-      "src/*.ts",
-      "src/**/*.ts"
-    ],
-    "exclude": [
-      "node_modules",
-      "dist",
-      "*.d.ts",
-      "src/**/MiscJSDoc.ts"
-    ],
-    "extension": [
-      ".ts"
-    ],
-    "reporter": [
-      "html"
-    ],
-    "all": true
-  },
-  "lint-staged": {
-    "linters": {
-      "*.@(js)": [
-        "eslint --fix",
-        "git add"
-      ],
-      "*.@(ts)": [
-        "tslint --fix",
-        "git add"
-      ]
-    },
-    "ignore": [
-      "spec-dtslint/**/*.{js,ts}"
-    ]
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/reactivex/rxjs.git"
-  },
-  "keywords": [
-    "Rx",
-    "RxJS",
-    "ReactiveX",
-    "ReactiveExtensions",
-    "Streams",
-    "Observables",
-    "Observable",
-    "Stream",
-    "ES6",
-    "ES2015"
-  ],
-  "author": "Ben Lesh <ben@benlesh.com>",
-  "contributors": [
-    {
-      "name": "Ben Lesh",
-      "email": "ben@benlesh.com"
-    },
-    {
-      "name": "Paul Taylor",
-      "email": "paul.e.taylor@me.com"
-    },
-    {
-      "name": "Jeff Cross",
-      "email": "crossj@google.com"
-    },
-    {
-      "name": "Matthew Podwysocki",
-      "email": "matthewp@microsoft.com"
-    },
-    {
-      "name": "OJ Kwon",
-      "email": "kwon.ohjoong@gmail.com"
-    },
-    {
-      "name": "Andre Staltz",
-      "email": "andre@staltz.com"
-    }
-  ],
-  "license": "Apache-2.0",
-  "bugs": {
-    "url": "https://github.com/ReactiveX/RxJS/issues"
-  },
-  "homepage": "https://github.com/ReactiveX/RxJS",
-  "dependencies": {
-    "tslib": "^1.9.0"
-  },
-  "devDependencies": {
-    "@angular-devkit/build-optimizer": "0.4.6",
-    "@angular-devkit/schematics": "^0.5.4",
-    "@types/chai": "4.1.2",
-    "@types/lodash": "4.14.102",
-    "@types/mocha": "2.2.48",
-    "@types/node": "9.4.5",
-    "@types/sinon": "4.1.3",
-    "@types/sinon-chai": "2.7.29",
-    "@types/source-map": "^0.5.2",
-    "babel-polyfill": "6.26.0",
-    "benchmark": "2.1.0",
-    "benchpress": "2.0.0-beta.1",
-    "chai": "4.1.2",
-    "check-side-effects": "0.0.20",
-    "color": "3.0.0",
-    "colors": "1.1.2",
-    "commitizen": "2.9.6",
-    "coveralls": "3.0.0",
-    "cross-env": "5.1.3",
-    "cz-conventional-changelog": "1.2.0",
-    "danger": "1.1.0",
-    "dependency-cruiser": "2.13.0",
-    "doctoc": "1.3.0",
-    "dtslint": "0.6.1",
-    "escape-string-regexp": "1.0.5",
-    "esdoc": "0.4.7",
-    "eslint": "4.17.0",
-    "eslint-plugin-jasmine": "^2.10.1",
-    "fs-extra": "5.0.0",
-    "get-folder-size": "1.0.1",
-    "glob": "7.1.2",
-    "gm": "1.23.1",
-    "google-closure-compiler-js": "20170218.0.0",
-    "gzip-size": "4.1.0",
-    "http-server": "0.11.1",
-    "husky": "0.14.3",
-    "klaw-sync": "3.0.2",
-    "lint-staged": "7.1.1",
-    "lodash": "4.17.5",
-    "markdown-doctest": "0.9.1",
-    "minimist": "1.2.0",
-    "mkdirp": "0.5.1",
-    "mocha": "5.0.0",
-    "mocha-in-sauce": "0.0.1",
-    "npm-run-all": "4.1.2",
-    "nyc": "11.4.1",
-    "opn-cli": "3.1.0",
-    "platform": "1.3.5",
-    "promise": "8.0.1",
-    "protractor": "3.1.1",
-    "rollup": "0.66.6",
-    "rollup-plugin-alias": "1.4.0",
-    "rollup-plugin-inject": "2.0.0",
-    "rollup-plugin-node-resolve": "2.0.0",
-    "rx": "latest",
-    "rxjs": "^5.5.7",
-    "shx": "0.2.2",
-    "sinon": "4.3.0",
-    "sinon-chai": "2.14.0",
-    "source-map-support": "0.5.3",
-    "symbol-observable": "1.0.1",
-    "systemjs": "^0.21.0",
-    "ts-node": "6.1.0",
-    "tsconfig-paths": "3.2.0",
-    "tslint": "5.9.1",
-    "tslint-etc": "1.2.6",
-    "tslint-no-toplevel-property-access": "0.0.2",
-    "tslint-no-unused-expression-chai": "0.0.3",
-    "typescript": "^3.0.1",
-    "validate-commit-msg": "2.14.0",
-    "webpack": "1.13.1",
-    "xmlhttprequest": "1.8.0"
-  },
-  "engines": {
-    "npm": ">=2.0.0"
-  },
-  "typings": "./index.d.ts",
-  "ng-update": {
-    "migrations": "./migrations/collection.json"
-  },
-  "module": "./_esm5/index.js",
-  "es2015": "./_esm2015/index.js"
-}
diff --git a/node_modules/rxjs/scheduler/animationFrame.d.ts b/node_modules/rxjs/scheduler/animationFrame.d.ts
deleted file mode 100644
index f293624..0000000
--- a/node_modules/rxjs/scheduler/animationFrame.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/scheduler/animationFrame';
diff --git a/node_modules/rxjs/scheduler/animationFrame.js b/node_modules/rxjs/scheduler/animationFrame.js
deleted file mode 100644
index c010af9..0000000
--- a/node_modules/rxjs/scheduler/animationFrame.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/scheduler/animationFrame"));
-//# sourceMappingURL=animationFrame.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/scheduler/animationFrame.js.map b/node_modules/rxjs/scheduler/animationFrame.js.map
deleted file mode 100644
index 9e0de76..0000000
--- a/node_modules/rxjs/scheduler/animationFrame.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"animationFrame.js","sources":["../src/scheduler/animationFrame.ts"],"names":[],"mappings":";;;;;AAAA,0DAAqD"}
diff --git a/node_modules/rxjs/scheduler/asap.d.ts b/node_modules/rxjs/scheduler/asap.d.ts
deleted file mode 100644
index 934d4b5..0000000
--- a/node_modules/rxjs/scheduler/asap.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/scheduler/asap';
diff --git a/node_modules/rxjs/scheduler/asap.js b/node_modules/rxjs/scheduler/asap.js
deleted file mode 100644
index 287a6f8..0000000
--- a/node_modules/rxjs/scheduler/asap.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/scheduler/asap"));
-//# sourceMappingURL=asap.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/scheduler/asap.js.map b/node_modules/rxjs/scheduler/asap.js.map
deleted file mode 100644
index 115c33e..0000000
--- a/node_modules/rxjs/scheduler/asap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"asap.js","sources":["../src/scheduler/asap.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/scheduler/async.d.ts b/node_modules/rxjs/scheduler/async.d.ts
deleted file mode 100644
index ed5a613..0000000
--- a/node_modules/rxjs/scheduler/async.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/scheduler/async';
diff --git a/node_modules/rxjs/scheduler/async.js b/node_modules/rxjs/scheduler/async.js
deleted file mode 100644
index a60a16c..0000000
--- a/node_modules/rxjs/scheduler/async.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/scheduler/async"));
-//# sourceMappingURL=async.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/scheduler/async.js.map b/node_modules/rxjs/scheduler/async.js.map
deleted file mode 100644
index 35f600b..0000000
--- a/node_modules/rxjs/scheduler/async.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"async.js","sources":["../src/scheduler/async.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/scheduler/queue.d.ts b/node_modules/rxjs/scheduler/queue.d.ts
deleted file mode 100644
index daea584..0000000
--- a/node_modules/rxjs/scheduler/queue.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/scheduler/queue';
diff --git a/node_modules/rxjs/scheduler/queue.js b/node_modules/rxjs/scheduler/queue.js
deleted file mode 100644
index 3d8dcb9..0000000
--- a/node_modules/rxjs/scheduler/queue.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/scheduler/queue"));
-//# sourceMappingURL=queue.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/scheduler/queue.js.map b/node_modules/rxjs/scheduler/queue.js.map
deleted file mode 100644
index 2278582..0000000
--- a/node_modules/rxjs/scheduler/queue.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"queue.js","sources":["../src/scheduler/queue.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/src/AsyncSubject.ts b/node_modules/rxjs/src/AsyncSubject.ts
deleted file mode 100644
index 2c4d977..0000000
--- a/node_modules/rxjs/src/AsyncSubject.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/AsyncSubject';
diff --git a/node_modules/rxjs/src/BehaviorSubject.ts b/node_modules/rxjs/src/BehaviorSubject.ts
deleted file mode 100644
index f8b4f44..0000000
--- a/node_modules/rxjs/src/BehaviorSubject.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/BehaviorSubject';
diff --git a/node_modules/rxjs/src/InnerSubscriber.ts b/node_modules/rxjs/src/InnerSubscriber.ts
deleted file mode 100644
index 79e3b4a..0000000
--- a/node_modules/rxjs/src/InnerSubscriber.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/InnerSubscriber';
diff --git a/node_modules/rxjs/src/LICENSE.txt b/node_modules/rxjs/src/LICENSE.txt
deleted file mode 100644
index 031ce38..0000000
--- a/node_modules/rxjs/src/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-                               Apache License
-                         Version 2.0, January 2004
-                      http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
-    "License" shall mean the terms and conditions for use, reproduction,
-    and distribution as defined by Sections 1 through 9 of this document.
-
-    "Licensor" shall mean the copyright owner or entity authorized by
-    the copyright owner that is granting the License.
-
-    "Legal Entity" shall mean the union of the acting entity and all
-    other entities that control, are controlled by, or are under common
-    control with that entity. For the purposes of this definition,
-    "control" means (i) the power, direct or indirect, to cause the
-    direction or management of such entity, whether by contract or
-    otherwise, or (ii) ownership of fifty percent (50%) or more of the
-    outstanding shares, or (iii) beneficial ownership of such entity.
-
-    "You" (or "Your") shall mean an individual or Legal Entity
-    exercising permissions granted by this License.
-
-    "Source" form shall mean the preferred form for making modifications,
-    including but not limited to software source code, documentation
-    source, and configuration files.
-
-    "Object" form shall mean any form resulting from mechanical
-    transformation or translation of a Source form, including but
-    not limited to compiled object code, generated documentation,
-    and conversions to other media types.
-
-    "Work" shall mean the work of authorship, whether in Source or
-    Object form, made available under the License, as indicated by a
-    copyright notice that is included in or attached to the work
-    (an example is provided in the Appendix below).
-
-    "Derivative Works" shall mean any work, whether in Source or Object
-    form, that is based on (or derived from) the Work and for which the
-    editorial revisions, annotations, elaborations, or other modifications
-    represent, as a whole, an original work of authorship. For the purposes
-    of this License, Derivative Works shall not include works that remain
-    separable from, or merely link (or bind by name) to the interfaces of,
-    the Work and Derivative Works thereof.
-
-    "Contribution" shall mean any work of authorship, including
-    the original version of the Work and any modifications or additions
-    to that Work or Derivative Works thereof, that is intentionally
-    submitted to Licensor for inclusion in the Work by the copyright owner
-    or by an individual or Legal Entity authorized to submit on behalf of
-    the copyright owner. For the purposes of this definition, "submitted"
-    means any form of electronic, verbal, or written communication sent
-    to the Licensor or its representatives, including but not limited to
-    communication on electronic mailing lists, source code control systems,
-    and issue tracking systems that are managed by, or on behalf of, the
-    Licensor for the purpose of discussing and improving the Work, but
-    excluding communication that is conspicuously marked or otherwise
-    designated in writing by the copyright owner as "Not a Contribution."
-
-    "Contributor" shall mean Licensor and any individual or Legal Entity
-    on behalf of whom a Contribution has been received by Licensor and
-    subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    copyright license to reproduce, prepare Derivative Works of,
-    publicly display, publicly perform, sublicense, and distribute the
-    Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-    (except as stated in this section) patent license to make, have made,
-    use, offer to sell, sell, import, and otherwise transfer the Work,
-    where such license applies only to those patent claims licensable
-    by such Contributor that are necessarily infringed by their
-    Contribution(s) alone or by combination of their Contribution(s)
-    with the Work to which such Contribution(s) was submitted. If You
-    institute patent litigation against any entity (including a
-    cross-claim or counterclaim in a lawsuit) alleging that the Work
-    or a Contribution incorporated within the Work constitutes direct
-    or contributory patent infringement, then any patent licenses
-    granted to You under this License for that Work shall terminate
-    as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
-    Work or Derivative Works thereof in any medium, with or without
-    modifications, and in Source or Object form, provided that You
-    meet the following conditions:
-
-    (a) You must give any other recipients of the Work or
-        Derivative Works a copy of this License; and
-
-    (b) You must cause any modified files to carry prominent notices
-        stating that You changed the files; and
-
-    (c) You must retain, in the Source form of any Derivative Works
-        that You distribute, all copyright, patent, trademark, and
-        attribution notices from the Source form of the Work,
-        excluding those notices that do not pertain to any part of
-        the Derivative Works; and
-
-    (d) If the Work includes a "NOTICE" text file as part of its
-        distribution, then any Derivative Works that You distribute must
-        include a readable copy of the attribution notices contained
-        within such NOTICE file, excluding those notices that do not
-        pertain to any part of the Derivative Works, in at least one
-        of the following places: within a NOTICE text file distributed
-        as part of the Derivative Works; within the Source form or
-        documentation, if provided along with the Derivative Works; or,
-        within a display generated by the Derivative Works, if and
-        wherever such third-party notices normally appear. The contents
-        of the NOTICE file are for informational purposes only and
-        do not modify the License. You may add Your own attribution
-        notices within Derivative Works that You distribute, alongside
-        or as an addendum to the NOTICE text from the Work, provided
-        that such additional attribution notices cannot be construed
-        as modifying the License.
-
-    You may add Your own copyright statement to Your modifications and
-    may provide additional or different license terms and conditions
-    for use, reproduction, or distribution of Your modifications, or
-    for any such Derivative Works as a whole, provided Your use,
-    reproduction, and distribution of the Work otherwise complies with
-    the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
-    any Contribution intentionally submitted for inclusion in the Work
-    by You to the Licensor shall be under the terms and conditions of
-    this License, without any additional terms or conditions.
-    Notwithstanding the above, nothing herein shall supersede or modify
-    the terms of any separate license agreement you may have executed
-    with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
-    names, trademarks, service marks, or product names of the Licensor,
-    except as required for reasonable and customary use in describing the
-    origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
-    agreed to in writing, Licensor provides the Work (and each
-    Contributor provides its Contributions) on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-    implied, including, without limitation, any warranties or conditions
-    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-    PARTICULAR PURPOSE. You are solely responsible for determining the
-    appropriateness of using or redistributing the Work and assume any
-    risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
-    whether in tort (including negligence), contract, or otherwise,
-    unless required by applicable law (such as deliberate and grossly
-    negligent acts) or agreed to in writing, shall any Contributor be
-    liable to You for damages, including any direct, indirect, special,
-    incidental, or consequential damages of any character arising as a
-    result of this License or out of the use or inability to use the
-    Work (including but not limited to damages for loss of goodwill,
-    work stoppage, computer failure or malfunction, or any and all
-    other commercial damages or losses), even if such Contributor
-    has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
-    the Work or Derivative Works thereof, You may choose to offer,
-    and charge a fee for, acceptance of support, warranty, indemnity,
-    or other liability obligations and/or rights consistent with this
-    License. However, in accepting such obligations, You may act only
-    on Your own behalf and on Your sole responsibility, not on behalf
-    of any other Contributor, and only if You agree to indemnify,
-    defend, and hold each Contributor harmless for any liability
-    incurred by, or claims asserted against, such Contributor by reason
-    of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
-    To apply the Apache License to your work, attach the following
-    boilerplate notice, with the fields enclosed by brackets "[]"
-    replaced with your own identifying information. (Don't include
-    the brackets!)  The text should be enclosed in the appropriate
-    comment syntax for the file format. We also recommend that a
-    file or class name and description of purpose be included on the
-    same "printed page" as the copyright notice for easier
-    identification within third-party archives.
-
- Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- 
diff --git a/node_modules/rxjs/src/MiscJSDoc.ts b/node_modules/rxjs/src/MiscJSDoc.ts
deleted file mode 100644
index 5cf5d67..0000000
--- a/node_modules/rxjs/src/MiscJSDoc.ts
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * This file and its definitions are needed just so that ESDoc sees these
- * JSDoc documentation comments. Originally they were meant for some TypeScript
- * interfaces, but TypeScript strips away JSDoc comments near interfaces. Hence,
- * we need these bogus classes, which are not stripped away. This file on the
- * other hand, is not included in the release bundle.
- */
-import { Observer, TeardownLogic } from './internal/types';
-import { Observable } from './internal/Observable';
-import './internal/observable/dom/MiscJSDoc';
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-export class ObservableDoc {
-  /**
-   * Creates a new Observable, that will execute the specified function when an
-   * {@link Observer} subscribes to it.
-   *
-   * <span class="informal">Create custom Observable, that does whatever you like.</span>
-   *
-   * ![](create.png)
-   *
-   * `create` converts an `onSubscription` function to an actual Observable.
-   * Whenever someone subscribes to that Observable, the function will be called
-   * with an {@link Observer} instance as a first and only parameter. `onSubscription` should
-   * then invoke the Observers `next`, `error` and `complete` methods.
-   *
-   * Calling `next` with a value will emit that value to the observer. Calling `complete`
-   * means that Observable finished emitting and will not do anything else.
-   * Calling `error` means that something went wrong - value passed to `error` method should
-   * provide details on what exactly happened.
-   *
-   * A well-formed Observable can emit as many values as it needs via `next` method,
-   * but `complete` and `error` methods can be called only once and nothing else can be called
-   * thereafter. If you try to invoke `next`, `complete` or `error` methods after created
-   * Observable already completed or ended with an error, these calls will be ignored to
-   * preserve so called *Observable Contract*. Note that you are not required to call
-   * `complete` at any point - it is perfectly fine to create an Observable that never ends,
-   * depending on your needs.
-   *
-   * `onSubscription` can optionally return either a function or an object with
-   * `unsubscribe` method. In both cases function or method will be called when
-   * subscription to Observable is being cancelled and should be used to clean up all
-   * resources. So, for example, if you are using `setTimeout` in your custom
-   * Observable, when someone unsubscribes, you can clear planned timeout, so that
-   * it does not fire needlessly and browser (or other environment) does not waste
-   * computing power on timing event that no one will listen to anyways.
-   *
-   * Most of the times you should not need to use `create`, because existing
-   * operators allow you to create an Observable for most of the use cases.
-   * That being said, `create` is low-level mechanism allowing you to create
-   * any Observable, if you have very specific needs.
-   *
-   * **TypeScript signature issue**
-   *
-   * Because Observable extends class which already has defined static `create` function,
-   * but with different type signature, it was impossible to assign proper signature to
-   * `Observable.create`. Because of that, it has very general type `Function` and thus
-   * function passed to `create` will not be type checked, unless you explicitly state
-   * what signature it should have.
-   *
-   * When using TypeScript we recommend to declare type signature of function passed to
-   * `create` as `(observer: Observer) => TeardownLogic`, where {@link Observer}
-   * and {@link TeardownLogic} are interfaces provided by the library.
-   *
-   * @example <caption>Emit three numbers, then complete.</caption>
-   * var observable = Rx.Observable.create(function (observer) {
-   *   observer.next(1);
-   *   observer.next(2);
-   *   observer.next(3);
-   *   observer.complete();
-   * });
-   * observable.subscribe(
-   *   value => console.log(value),
-   *   err => {},
-   *   () => console.log('this is the end')
-   * );
-   *
-   * // Logs
-   * // 1
-   * // 2
-   * // 3
-   * // "this is the end"
-   *
-   *
-   * @example <caption>Emit an error</caption>
-   * const observable = Rx.Observable.create((observer) => {
-   *   observer.error('something went really wrong...');
-   * });
-   *
-   * observable.subscribe(
-   *   value => console.log(value), // will never be called
-   *   err => console.log(err),
-   *   () => console.log('complete') // will never be called
-   * );
-   *
-   * // Logs
-   * // "something went really wrong..."
-   *
-   *
-   * @example <caption>Return unsubscribe function</caption>
-   *
-   * const observable = Rx.Observable.create(observer => {
-   *   const id = setTimeout(() => observer.next('...'), 5000); // emit value after 5s
-   *
-   *   return () => { clearTimeout(id); console.log('cleared!'); };
-   * });
-   *
-   * const subscription = observable.subscribe(value => console.log(value));
-   *
-   * setTimeout(() => subscription.unsubscribe(), 3000); // cancel subscription after 3s
-   *
-   * // Logs:
-   * // "cleared!" after 3s
-   *
-   * // Never logs "..."
-   *
-   *
-   * @see {@link empty}
-   * @see {@link never}
-   * @see {@link of}
-   * @see {@link throw}
-   *
-   * @param {function(observer: Observer): TeardownLogic} onSubscription A
-   * function that accepts an Observer, and invokes its `next`,
-   * `error`, and `complete` methods as appropriate, and optionally returns some
-   * logic for cleaning up resources.
-   * @return {Observable} An Observable that, whenever subscribed, will execute the
-   * specified function.
-   * @static true
-   * @name create
-   * @owner Observable
-   * @nocollapse
-   */
-  static create<T>(onSubscription: <R>(observer: Observer<R>) => TeardownLogic): Observable<T> {
-    return new Observable<T>(onSubscription);
-  }
-}
-
-/**
- * An interface for a consumer of push-based notifications delivered by an
- * {@link Observable}.
- *
- * ```ts
- * interface Observer<T> {
- *   closed?: boolean;
- *   next: (value: T) => void;
- *   error: (err: any) => void;
- *   complete: () => void;
- * }
- * ```
- *
- * An object conforming to the Observer interface is usually
- * given to the `observable.subscribe(observer)` method, and the Observable will
- * call the Observer's `next(value)` method to provide notifications. A
- * well-behaved Observable will call an Observer's `complete()` method exactly
- * once or the Observer's `error(err)` method exactly once, as the last
- * notification delivered.
- *
- * @interface
- * @name Observer
- * @noimport true
- */
-export class ObserverDoc<T> {
-  /**
-   * An optional flag to indicate whether this Observer, when used as a
-   * subscriber, has already been unsubscribed from its Observable.
-   * @type {boolean}
-   */
-  closed: boolean = false;
-  /**
-   * The callback to receive notifications of type `next` from the Observable,
-   * with a value. The Observable may call this method 0 or more times.
-   * @param {T} value The `next` value.
-   * @return {void}
-   */
-  next(value: T): void {
-    return void 0;
-  }
-  /**
-   * The callback to receive notifications of type `error` from the Observable,
-   * with an attached {@link Error}. Notifies the Observer that the Observable
-   * has experienced an error condition.
-   * @param {any} err The `error` exception.
-   * @return {void}
-   */
-  error(err: any): void {
-    return void 0;
-  }
-  /**
-   * The callback to receive a valueless notification of type `complete` from
-   * the Observable. Notifies the Observer that the Observable has finished
-   * sending push-based notifications.
-   * @return {void}
-   */
-  complete(): void {
-    return void 0;
-  }
-}
-
-/**
- * `SubscribableOrPromise` interface describes values that behave like either
- * Observables or Promises. Every operator that accepts arguments annotated
- * with this interface, can be also used with parameters that are not necessarily
- * RxJS Observables.
- *
- * Following types of values might be passed to operators expecting this interface:
- *
- * ## Observable
- *
- * RxJS {@link Observable} instance.
- *
- * ## Observable-like (Subscribable)
- *
- * This might be any object that has `Symbol.observable` method. This method,
- * when called, should return object with `subscribe` method on it, which should
- * behave the same as RxJS `Observable.subscribe`.
- *
- * `Symbol.observable` is part of https://github.com/tc39/proposal-observable proposal.
- * Since currently it is not supported natively, and every symbol is equal only to itself,
- * you should use https://github.com/blesh/symbol-observable polyfill, when implementing
- * custom Observable-likes.
- *
- * **TypeScript Subscribable interface issue**
- *
- * Although TypeScript interface claims that Subscribable is an object that has `subscribe`
- * method declared directly on it, passing custom objects that have `subscribe`
- * method but not `Symbol.observable` method will fail at runtime. Conversely, passing
- * objects with `Symbol.observable` but without `subscribe` will fail at compile time
- * (if you use TypeScript).
- *
- * TypeScript has problem supporting interfaces with methods defined as symbol
- * properties. To get around that, you should implement `subscribe` directly on
- * passed object, and make `Symbol.observable` method simply return `this`. That way
- * everything will work as expected, and compiler will not complain. If you really
- * do not want to put `subscribe` directly on your object, you will have to type cast
- * it to `any`, before passing it to an operator.
- *
- * When this issue is resolved, Subscribable interface will only permit Observable-like
- * objects with `Symbol.observable` defined, no matter if they themselves implement
- * `subscribe` method or not.
- *
- * ## ES6 Promise
- *
- * Promise can be interpreted as Observable that emits value and completes
- * when it is resolved or errors when it is rejected.
- *
- * ## Promise-like (Thenable)
- *
- * Promises passed to operators do not have to be native ES6 Promises.
- * They can be implementations from popular Promise libraries, polyfills
- * or even custom ones. They just need to have `then` method that works
- * as the same as ES6 Promise `then`.
- *
- * @example <caption>Use merge and then map with non-RxJS observable</caption>
- * const nonRxJSObservable = {
- *   subscribe(observer) {
- *     observer.next(1000);
- *     observer.complete();
- *   },
- *   [Symbol.observable]() {
- *     return this;
- *   }
- * };
- *
- * Rx.Observable.merge(nonRxJSObservable)
- * .map(value => "This value is " + value)
- * .subscribe(result => console.log(result)); // Logs "This value is 1000"
- *
- *
- * @example <caption>Use combineLatest with ES6 Promise</caption>
- * Rx.Observable.combineLatest(Promise.resolve(5), Promise.resolve(10), Promise.resolve(15))
- * .subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('the end!')
- * );
- * // Logs
- * // [5, 10, 15]
- * // "the end!"
- *
- *
- * @interface
- * @name SubscribableOrPromise
- * @noimport true
- */
-export class SubscribableOrPromiseDoc<T> {
-
-}
-
-/**
- * `ObservableInput` interface describes all values that are either an
- * {@link SubscribableOrPromise} or some kind of collection of values that
- * can be transformed to Observable emitting that values. Every operator that
- * accepts arguments annotated with this interface, can be also used with
- * parameters that are not necessarily RxJS Observables.
- *
- * `ObservableInput` extends {@link SubscribableOrPromise} with following types:
- *
- * ## Array
- *
- * Arrays can be interpreted as observables that emit all values in array one by one,
- * from left to right, and then complete immediately.
- *
- * ## Array-like
- *
- * Arrays passed to operators do not have to be built-in JavaScript Arrays. They
- * can be also, for example, `arguments` property available inside every function,
- * [DOM NodeList](https://developer.mozilla.org/pl/docs/Web/API/NodeList),
- * or, actually, any object that has `length` property (which is a number)
- * and stores values under non-negative (zero and up) integers.
- *
- * ## ES6 Iterable
- *
- * Operators will accept both built-in and custom ES6 Iterables, by treating them as
- * observables that emit all its values in order of iteration and then complete
- * when iteration ends. Note that contrary to arrays, Iterables do not have to
- * necessarily be finite, so creating Observables that never complete is possible as well.
- *
- * Note that you can make iterator an instance of Iterable by having it return itself
- * in `Symbol.iterator` method. It means that every operator accepting Iterables accepts,
- * though indirectly, iterators themselves as well. All native ES6 iterators are instances
- * of Iterable by default, so you do not have to implement their `Symbol.iterator` method
- * yourself.
- *
- * **TypeScript Iterable interface issue**
- *
- * TypeScript `ObservableInput` interface actually lacks type signature for Iterables,
- * because of issues it caused in some projects (see [this issue](https://github.com/ReactiveX/rxjs/issues/2306)).
- * If you want to use Iterable as argument for operator, cast it to `any` first.
- * Remember of course that, because of casting, you have to yourself ensure that passed
- * argument really implements said interface.
- *
- *
- * @example <caption>Use merge with arrays</caption>
- * Rx.Observable.merge([1, 2], [4], [5, 6])
- * .subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('ta dam!')
- * );
- *
- * // Logs
- * // 1
- * // 2
- * // 3
- * // 4
- * // 5
- * // 6
- * // "ta dam!"
- *
- *
- * @example <caption>Use merge with array-like</caption>
- * Rx.Observable.merge({0: 1, 1: 2, length: 2}, {0: 3, length: 1})
- * .subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('nice, huh?')
- * );
- *
- * // Logs
- * // 1
- * // 2
- * // 3
- * // "nice, huh?"
- *
- * @example <caption>Use merge with an Iterable (Map)</caption>
- * const firstMap = new Map([[1, 'a'], [2, 'b']]);
- * const secondMap = new Map([[3, 'c'], [4, 'd']]);
- *
- * Rx.Observable.merge(
- *   firstMap,          // pass Iterable
- *   secondMap.values() // pass iterator, which is itself an Iterable
- * ).subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('yup!')
- * );
- *
- * // Logs
- * // [1, "a"]
- * // [2, "b"]
- * // "c"
- * // "d"
- * // "yup!"
- *
- * @example <caption>Use from with generator (returning infinite iterator)</caption>
- * // infinite stream of incrementing numbers
- * const infinite = function* () {
- *   let i = 0;
- *
- *   while (true) {
- *     yield i++;
- *   }
- * };
- *
- * Rx.Observable.from(infinite())
- * .take(3) // only take 3, cause this is infinite
- * .subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('ta dam!')
- * );
- *
- * // Logs
- * // 0
- * // 1
- * // 2
- * // "ta dam!"
- *
- * @interface
- * @name ObservableInput
- * @noimport true
- */
-export class ObservableInputDoc<T> {
-
-}
-
-/**
- *
- * This interface describes what should be returned by function passed to Observable
- * constructor or static {@link create} function. Value of that interface will be used
- * to cancel subscription for given Observable.
- *
- * `TeardownLogic` can be:
- *
- * ## Function
- *
- * Function that takes no parameters. When consumer of created Observable calls `unsubscribe`,
- * that function will be called
- *
- * ## AnonymousSubscription
- *
- * `AnonymousSubscription` is simply an object with `unsubscribe` method on it. That method
- * will work the same as function
- *
- * ## void
- *
- * If created Observable does not have any resources to clean up, function does not have to
- * return anything.
- *
- * @interface
- * @name TeardownLogic
- * @noimport true
- */
-export class TeardownLogicDoc {
-
-}
diff --git a/node_modules/rxjs/src/Notification.ts b/node_modules/rxjs/src/Notification.ts
deleted file mode 100644
index 5d9956d..0000000
--- a/node_modules/rxjs/src/Notification.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Notification';
diff --git a/node_modules/rxjs/src/Observable.ts b/node_modules/rxjs/src/Observable.ts
deleted file mode 100644
index cc1e68d..0000000
--- a/node_modules/rxjs/src/Observable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Observable';
diff --git a/node_modules/rxjs/src/Observer.ts b/node_modules/rxjs/src/Observer.ts
deleted file mode 100644
index 867ce2f..0000000
--- a/node_modules/rxjs/src/Observer.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Observer';
diff --git a/node_modules/rxjs/src/Operator.ts b/node_modules/rxjs/src/Operator.ts
deleted file mode 100644
index fb9a9f9..0000000
--- a/node_modules/rxjs/src/Operator.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Operator';
diff --git a/node_modules/rxjs/src/OuterSubscriber.ts b/node_modules/rxjs/src/OuterSubscriber.ts
deleted file mode 100644
index 9060ae7..0000000
--- a/node_modules/rxjs/src/OuterSubscriber.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/OuterSubscriber';
diff --git a/node_modules/rxjs/src/README.md b/node_modules/rxjs/src/README.md
deleted file mode 100644
index e9204f0..0000000
--- a/node_modules/rxjs/src/README.md
+++ /dev/null
@@ -1,145 +0,0 @@
-<img src="doc/asset/Rx_Logo_S.png" alt="RxJS Logo" width="86" height="86"> RxJS: Reactive Extensions For JavaScript
-======================================
-
-
-[![CircleCI](https://circleci.com/gh/ReactiveX/rxjs/tree/6.x.svg?style=svg)](https://circleci.com/gh/ReactiveX/rxjs/tree/6.x)
-[![npm version](https://badge.fury.io/js/%40reactivex%2Frxjs.svg)](http://badge.fury.io/js/%40reactivex%2Frxjs)
-[![Join the chat at https://gitter.im/Reactive-Extensions/RxJS](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Reactive-Extensions/RxJS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-# RxJS 6 Stable
-
-### MIGRATION AND RELEASE INFORMATION:
-
-Find out how to update to v6, **automatically update your TypeScript code**, and more!
-
-- [Current home is MIGRATION.md](./docs_app/content/guide/v6/migration.md)
-
-### FOR V 5.X PLEASE GO TO [THE 5.0 BRANCH](https://github.com/ReactiveX/rxjs/tree/5.x)
-
-Reactive Extensions Library for JavaScript. This is a rewrite of [Reactive-Extensions/RxJS](https://github.com/Reactive-Extensions/RxJS) and is the latest production-ready version of RxJS. This rewrite is meant to have better performance, better modularity, better debuggable call stacks, while staying mostly backwards compatible, with some breaking changes that reduce the API surface.
-
-[Apache 2.0 License](LICENSE.txt)
-
-- [Code of Conduct](CODE_OF_CONDUCT.md)
-- [Contribution Guidelines](CONTRIBUTING.md)
-- [Maintainer Guidelines](doc/maintainer-guidelines.md)
-- [Creating Operators](doc/operator-creation.md)
-- [API Documentation (WIP)](https://rxjs.dev/)
-
-## Versions In This Repository
-
-- [master](https://github.com/ReactiveX/rxjs/commits/master) - This is all of the current, unreleased work, which is against v6 of RxJS right now
-- [stable](https://github.com/ReactiveX/rxjs/commits/stable) - This is the branch for the latest version you'd get if you do `npm install rxjs`
-
-## Important
-
-By contributing or commenting on issues in this repository, whether you've read them or not, you're agreeing to the [Contributor Code of Conduct](CODE_OF_CONDUCT.md). Much like traffic laws, ignorance doesn't grant you immunity.
-
-## Installation and Usage
-
-### ES6 via npm
-
-```sh
-npm install rxjs
-```
-
-It's recommended to pull in the Observable creation methods you need directly from `'rxjs'` as shown below with `range`. And you can pull in any operator you need from one spot, under `'rxjs/operators'`.
-
-```js
-import { range } from 'rxjs';
-import { map, filter } from 'rxjs/operators';
-
-range(1, 200).pipe(
-  filter(x => x % 2 === 1),
-  map(x => x + x)
-).subscribe(x => console.log(x));
-```
-
-Here, we're using the built-in `pipe` method on Observables to combine operators. See [pipeable operators](https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md) for more information.
-
-### CommonJS via npm
-
-To install this library for CommonJS (CJS) usage, use the following command:
-
-```sh
-npm install rxjs
-```
-
-(Note: destructuring available in Node 8+)
-
-```js
-const { range } = require('rxjs');
-const { map, filter } = require('rxjs/operators');
-
-range(1, 200).pipe(
-  filter(x => x % 2 === 1),
-  map(x => x + x)
-).subscribe(x => console.log(x));
-```
-
-### CDN
-
-For CDN, you can use [unpkg](https://unpkg.com/):
-
-https://unpkg.com/rxjs/bundles/rxjs.umd.min.js
-
-The global namespace for rxjs is `rxjs`:
-
-```js
-const { range } = rxjs;
-const { map, filter } = rxjs.operators;
-
-range(1, 200).pipe(
-  filter(x => x % 2 === 1),
-  map(x => x + x)
-).subscribe(x => console.log(x));
-```
-
-## Goals
-
-- Smaller overall bundles sizes
-- Provide better performance than preceding versions of RxJS
-- To model/follow the [Observable Spec Proposal](https://github.com/zenparsing/es-observable) to the observable
-- Provide more modular file structure in a variety of formats
-- Provide more debuggable call stacks than preceding versions of RxJS
-
-## Building/Testing
-
-- `npm run build_all` - builds everything
-- `npm test` - runs tests
-- `npm run test_no_cache` - run test with `ts-node` set to false
-
-## Performance Tests
-
-Run `npm run build_perf` or `npm run perf` to run the performance tests with `protractor`.
-
-Run `npm run perf_micro [operator]` to run micro performance test benchmarking operator.
-
-## Adding documentation
-We appreciate all contributions to the documentation of any type. All of the information needed to get the docs app up and running locally as well as how to contribute can be found in the [documentation directory](./docs_app).
-
-## Generating PNG marble diagrams
-
-The script `npm run tests2png` requires some native packages installed locally: `imagemagick`, `graphicsmagick`, and `ghostscript`.
-
-For Mac OS X with [Homebrew](http://brew.sh/):
-
-- `brew install imagemagick`
-- `brew install graphicsmagick`
-- `brew install ghostscript`
-- You may need to install the Ghostscript fonts manually:
-  - Download the tarball from the [gs-fonts project](https://sourceforge.net/projects/gs-fonts)
-  - `mkdir -p /usr/local/share/ghostscript && tar zxvf /path/to/ghostscript-fonts.tar.gz -C /usr/local/share/ghostscript`
-
-For Debian Linux:
-
-- `sudo add-apt-repository ppa:dhor/myway`
-- `apt-get install imagemagick`
-- `apt-get install graphicsmagick`
-- `apt-get install ghostscript`
-
-For Windows and other Operating Systems, check the download instructions here:
-
-- http://imagemagick.org
-- http://www.graphicsmagick.org
-- http://www.ghostscript.com/
diff --git a/node_modules/rxjs/src/ReplaySubject.ts b/node_modules/rxjs/src/ReplaySubject.ts
deleted file mode 100644
index b66aea9..0000000
--- a/node_modules/rxjs/src/ReplaySubject.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/ReplaySubject';
diff --git a/node_modules/rxjs/src/Rx.global.js b/node_modules/rxjs/src/Rx.global.js
deleted file mode 100644
index d75682b..0000000
--- a/node_modules/rxjs/src/Rx.global.js
+++ /dev/null
@@ -1,5 +0,0 @@
-(function (root, factory) {
-  root.Rx = factory();
-})(window || global || this, function () {
-  return require('../dist/package/Rx');
-});
\ No newline at end of file
diff --git a/node_modules/rxjs/src/Rx.ts b/node_modules/rxjs/src/Rx.ts
deleted file mode 100644
index e04c752..0000000
--- a/node_modules/rxjs/src/Rx.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-
-export * from 'rxjs-compat';
diff --git a/node_modules/rxjs/src/Scheduler.ts b/node_modules/rxjs/src/Scheduler.ts
deleted file mode 100644
index c21eb1f..0000000
--- a/node_modules/rxjs/src/Scheduler.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Scheduler';
diff --git a/node_modules/rxjs/src/Subject.ts b/node_modules/rxjs/src/Subject.ts
deleted file mode 100644
index 7448233..0000000
--- a/node_modules/rxjs/src/Subject.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Subject';
diff --git a/node_modules/rxjs/src/SubjectSubscription.ts b/node_modules/rxjs/src/SubjectSubscription.ts
deleted file mode 100644
index 4f481ce..0000000
--- a/node_modules/rxjs/src/SubjectSubscription.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/SubjectSubscription';
diff --git a/node_modules/rxjs/src/Subscriber.ts b/node_modules/rxjs/src/Subscriber.ts
deleted file mode 100644
index 15356d5..0000000
--- a/node_modules/rxjs/src/Subscriber.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Subscriber';
diff --git a/node_modules/rxjs/src/Subscription.ts b/node_modules/rxjs/src/Subscription.ts
deleted file mode 100644
index 028cf4c..0000000
--- a/node_modules/rxjs/src/Subscription.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/Subscription';
diff --git a/node_modules/rxjs/src/add/observable/bindCallback.ts b/node_modules/rxjs/src/add/observable/bindCallback.ts
deleted file mode 100644
index 7926a09..0000000
--- a/node_modules/rxjs/src/add/observable/bindCallback.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/bindCallback';
diff --git a/node_modules/rxjs/src/add/observable/bindNodeCallback.ts b/node_modules/rxjs/src/add/observable/bindNodeCallback.ts
deleted file mode 100644
index 049f9a7..0000000
--- a/node_modules/rxjs/src/add/observable/bindNodeCallback.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/bindNodeCallback';
diff --git a/node_modules/rxjs/src/add/observable/combineLatest.ts b/node_modules/rxjs/src/add/observable/combineLatest.ts
deleted file mode 100644
index 7163d7a..0000000
--- a/node_modules/rxjs/src/add/observable/combineLatest.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/combineLatest';
diff --git a/node_modules/rxjs/src/add/observable/concat.ts b/node_modules/rxjs/src/add/observable/concat.ts
deleted file mode 100644
index b392cb2..0000000
--- a/node_modules/rxjs/src/add/observable/concat.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/concat';
diff --git a/node_modules/rxjs/src/add/observable/defer.ts b/node_modules/rxjs/src/add/observable/defer.ts
deleted file mode 100644
index b4e2966..0000000
--- a/node_modules/rxjs/src/add/observable/defer.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/defer';
diff --git a/node_modules/rxjs/src/add/observable/dom/ajax.ts b/node_modules/rxjs/src/add/observable/dom/ajax.ts
deleted file mode 100644
index 2b32efe..0000000
--- a/node_modules/rxjs/src/add/observable/dom/ajax.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/dom/ajax';
diff --git a/node_modules/rxjs/src/add/observable/dom/webSocket.ts b/node_modules/rxjs/src/add/observable/dom/webSocket.ts
deleted file mode 100644
index bc5d3f3..0000000
--- a/node_modules/rxjs/src/add/observable/dom/webSocket.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/dom/webSocket';
diff --git a/node_modules/rxjs/src/add/observable/empty.ts b/node_modules/rxjs/src/add/observable/empty.ts
deleted file mode 100644
index d261ad7..0000000
--- a/node_modules/rxjs/src/add/observable/empty.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/empty';
diff --git a/node_modules/rxjs/src/add/observable/forkJoin.ts b/node_modules/rxjs/src/add/observable/forkJoin.ts
deleted file mode 100644
index 2a581e2..0000000
--- a/node_modules/rxjs/src/add/observable/forkJoin.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/forkJoin';
diff --git a/node_modules/rxjs/src/add/observable/from.ts b/node_modules/rxjs/src/add/observable/from.ts
deleted file mode 100644
index 06572d8..0000000
--- a/node_modules/rxjs/src/add/observable/from.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/from';
diff --git a/node_modules/rxjs/src/add/observable/fromEvent.ts b/node_modules/rxjs/src/add/observable/fromEvent.ts
deleted file mode 100644
index 0d6e05b..0000000
--- a/node_modules/rxjs/src/add/observable/fromEvent.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/fromEvent';
diff --git a/node_modules/rxjs/src/add/observable/fromEventPattern.ts b/node_modules/rxjs/src/add/observable/fromEventPattern.ts
deleted file mode 100644
index c7241f8..0000000
--- a/node_modules/rxjs/src/add/observable/fromEventPattern.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/fromEventPattern';
diff --git a/node_modules/rxjs/src/add/observable/fromPromise.ts b/node_modules/rxjs/src/add/observable/fromPromise.ts
deleted file mode 100644
index c262242..0000000
--- a/node_modules/rxjs/src/add/observable/fromPromise.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/fromPromise';
diff --git a/node_modules/rxjs/src/add/observable/generate.ts b/node_modules/rxjs/src/add/observable/generate.ts
deleted file mode 100644
index 3203a9b..0000000
--- a/node_modules/rxjs/src/add/observable/generate.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/generate';
diff --git a/node_modules/rxjs/src/add/observable/if.ts b/node_modules/rxjs/src/add/observable/if.ts
deleted file mode 100644
index 5767d74..0000000
--- a/node_modules/rxjs/src/add/observable/if.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/if';
diff --git a/node_modules/rxjs/src/add/observable/interval.ts b/node_modules/rxjs/src/add/observable/interval.ts
deleted file mode 100644
index 6cd2b31..0000000
--- a/node_modules/rxjs/src/add/observable/interval.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/interval';
diff --git a/node_modules/rxjs/src/add/observable/merge.ts b/node_modules/rxjs/src/add/observable/merge.ts
deleted file mode 100644
index 7a111a5..0000000
--- a/node_modules/rxjs/src/add/observable/merge.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/merge';
diff --git a/node_modules/rxjs/src/add/observable/never.ts b/node_modules/rxjs/src/add/observable/never.ts
deleted file mode 100644
index 4c464d0..0000000
--- a/node_modules/rxjs/src/add/observable/never.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/never';
diff --git a/node_modules/rxjs/src/add/observable/of.ts b/node_modules/rxjs/src/add/observable/of.ts
deleted file mode 100644
index c0720f6..0000000
--- a/node_modules/rxjs/src/add/observable/of.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/of';
diff --git a/node_modules/rxjs/src/add/observable/onErrorResumeNext.ts b/node_modules/rxjs/src/add/observable/onErrorResumeNext.ts
deleted file mode 100644
index 80a4d91..0000000
--- a/node_modules/rxjs/src/add/observable/onErrorResumeNext.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/onErrorResumeNext';
diff --git a/node_modules/rxjs/src/add/observable/pairs.ts b/node_modules/rxjs/src/add/observable/pairs.ts
deleted file mode 100644
index 3af25b6..0000000
--- a/node_modules/rxjs/src/add/observable/pairs.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/pairs';
diff --git a/node_modules/rxjs/src/add/observable/race.ts b/node_modules/rxjs/src/add/observable/race.ts
deleted file mode 100644
index 9b45c4e..0000000
--- a/node_modules/rxjs/src/add/observable/race.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/race';
diff --git a/node_modules/rxjs/src/add/observable/range.ts b/node_modules/rxjs/src/add/observable/range.ts
deleted file mode 100644
index 2ae274e..0000000
--- a/node_modules/rxjs/src/add/observable/range.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/range';
diff --git a/node_modules/rxjs/src/add/observable/throw.ts b/node_modules/rxjs/src/add/observable/throw.ts
deleted file mode 100644
index 7405653..0000000
--- a/node_modules/rxjs/src/add/observable/throw.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/throw';
diff --git a/node_modules/rxjs/src/add/observable/timer.ts b/node_modules/rxjs/src/add/observable/timer.ts
deleted file mode 100644
index 60e2f9b..0000000
--- a/node_modules/rxjs/src/add/observable/timer.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/timer';
diff --git a/node_modules/rxjs/src/add/observable/using.ts b/node_modules/rxjs/src/add/observable/using.ts
deleted file mode 100644
index c7ac49a..0000000
--- a/node_modules/rxjs/src/add/observable/using.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/using';
diff --git a/node_modules/rxjs/src/add/observable/zip.ts b/node_modules/rxjs/src/add/observable/zip.ts
deleted file mode 100644
index 5c72041..0000000
--- a/node_modules/rxjs/src/add/observable/zip.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/observable/zip';
diff --git a/node_modules/rxjs/src/add/operator/audit.ts b/node_modules/rxjs/src/add/operator/audit.ts
deleted file mode 100644
index a3eb5a4..0000000
--- a/node_modules/rxjs/src/add/operator/audit.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/audit';
diff --git a/node_modules/rxjs/src/add/operator/auditTime.ts b/node_modules/rxjs/src/add/operator/auditTime.ts
deleted file mode 100644
index 41f68da..0000000
--- a/node_modules/rxjs/src/add/operator/auditTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/auditTime';
diff --git a/node_modules/rxjs/src/add/operator/buffer.ts b/node_modules/rxjs/src/add/operator/buffer.ts
deleted file mode 100644
index b501cae..0000000
--- a/node_modules/rxjs/src/add/operator/buffer.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/buffer';
diff --git a/node_modules/rxjs/src/add/operator/bufferCount.ts b/node_modules/rxjs/src/add/operator/bufferCount.ts
deleted file mode 100644
index 96237e5..0000000
--- a/node_modules/rxjs/src/add/operator/bufferCount.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/bufferCount';
diff --git a/node_modules/rxjs/src/add/operator/bufferTime.ts b/node_modules/rxjs/src/add/operator/bufferTime.ts
deleted file mode 100644
index abd78ab..0000000
--- a/node_modules/rxjs/src/add/operator/bufferTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/bufferTime';
diff --git a/node_modules/rxjs/src/add/operator/bufferToggle.ts b/node_modules/rxjs/src/add/operator/bufferToggle.ts
deleted file mode 100644
index 2dbdf86..0000000
--- a/node_modules/rxjs/src/add/operator/bufferToggle.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/bufferToggle';
diff --git a/node_modules/rxjs/src/add/operator/bufferWhen.ts b/node_modules/rxjs/src/add/operator/bufferWhen.ts
deleted file mode 100644
index 4ad636f..0000000
--- a/node_modules/rxjs/src/add/operator/bufferWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/bufferWhen';
diff --git a/node_modules/rxjs/src/add/operator/catch.ts b/node_modules/rxjs/src/add/operator/catch.ts
deleted file mode 100644
index 316a29e..0000000
--- a/node_modules/rxjs/src/add/operator/catch.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/catch';
diff --git a/node_modules/rxjs/src/add/operator/combineAll.ts b/node_modules/rxjs/src/add/operator/combineAll.ts
deleted file mode 100644
index 0cf4be8..0000000
--- a/node_modules/rxjs/src/add/operator/combineAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/combineAll';
diff --git a/node_modules/rxjs/src/add/operator/combineLatest.ts b/node_modules/rxjs/src/add/operator/combineLatest.ts
deleted file mode 100644
index 88333e7..0000000
--- a/node_modules/rxjs/src/add/operator/combineLatest.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/combineLatest';
diff --git a/node_modules/rxjs/src/add/operator/concat.ts b/node_modules/rxjs/src/add/operator/concat.ts
deleted file mode 100644
index c743a6b..0000000
--- a/node_modules/rxjs/src/add/operator/concat.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/concat';
diff --git a/node_modules/rxjs/src/add/operator/concatAll.ts b/node_modules/rxjs/src/add/operator/concatAll.ts
deleted file mode 100644
index cf9157f..0000000
--- a/node_modules/rxjs/src/add/operator/concatAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/concatAll';
diff --git a/node_modules/rxjs/src/add/operator/concatMap.ts b/node_modules/rxjs/src/add/operator/concatMap.ts
deleted file mode 100644
index dadc722..0000000
--- a/node_modules/rxjs/src/add/operator/concatMap.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/concatMap';
diff --git a/node_modules/rxjs/src/add/operator/concatMapTo.ts b/node_modules/rxjs/src/add/operator/concatMapTo.ts
deleted file mode 100644
index 9a843a6..0000000
--- a/node_modules/rxjs/src/add/operator/concatMapTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/concatMapTo';
diff --git a/node_modules/rxjs/src/add/operator/count.ts b/node_modules/rxjs/src/add/operator/count.ts
deleted file mode 100644
index 85c6832..0000000
--- a/node_modules/rxjs/src/add/operator/count.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/count';
diff --git a/node_modules/rxjs/src/add/operator/debounce.ts b/node_modules/rxjs/src/add/operator/debounce.ts
deleted file mode 100644
index e5ff5db..0000000
--- a/node_modules/rxjs/src/add/operator/debounce.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/debounce';
diff --git a/node_modules/rxjs/src/add/operator/debounceTime.ts b/node_modules/rxjs/src/add/operator/debounceTime.ts
deleted file mode 100644
index 8ffedf9..0000000
--- a/node_modules/rxjs/src/add/operator/debounceTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/debounceTime';
diff --git a/node_modules/rxjs/src/add/operator/defaultIfEmpty.ts b/node_modules/rxjs/src/add/operator/defaultIfEmpty.ts
deleted file mode 100644
index d8e0070..0000000
--- a/node_modules/rxjs/src/add/operator/defaultIfEmpty.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/defaultIfEmpty';
diff --git a/node_modules/rxjs/src/add/operator/delay.ts b/node_modules/rxjs/src/add/operator/delay.ts
deleted file mode 100644
index 96d2017..0000000
--- a/node_modules/rxjs/src/add/operator/delay.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/delay';
diff --git a/node_modules/rxjs/src/add/operator/delayWhen.ts b/node_modules/rxjs/src/add/operator/delayWhen.ts
deleted file mode 100644
index a50cebb..0000000
--- a/node_modules/rxjs/src/add/operator/delayWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/delayWhen';
diff --git a/node_modules/rxjs/src/add/operator/dematerialize.ts b/node_modules/rxjs/src/add/operator/dematerialize.ts
deleted file mode 100644
index 18f368b..0000000
--- a/node_modules/rxjs/src/add/operator/dematerialize.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/dematerialize';
diff --git a/node_modules/rxjs/src/add/operator/distinct.ts b/node_modules/rxjs/src/add/operator/distinct.ts
deleted file mode 100644
index 330f8f9..0000000
--- a/node_modules/rxjs/src/add/operator/distinct.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/distinct';
diff --git a/node_modules/rxjs/src/add/operator/distinctUntilChanged.ts b/node_modules/rxjs/src/add/operator/distinctUntilChanged.ts
deleted file mode 100644
index 8273e9e..0000000
--- a/node_modules/rxjs/src/add/operator/distinctUntilChanged.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/distinctUntilChanged';
diff --git a/node_modules/rxjs/src/add/operator/distinctUntilKeyChanged.ts b/node_modules/rxjs/src/add/operator/distinctUntilKeyChanged.ts
deleted file mode 100644
index f556b82..0000000
--- a/node_modules/rxjs/src/add/operator/distinctUntilKeyChanged.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/distinctUntilKeyChanged';
diff --git a/node_modules/rxjs/src/add/operator/do.ts b/node_modules/rxjs/src/add/operator/do.ts
deleted file mode 100644
index 9eee7cd..0000000
--- a/node_modules/rxjs/src/add/operator/do.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/do';
diff --git a/node_modules/rxjs/src/add/operator/elementAt.ts b/node_modules/rxjs/src/add/operator/elementAt.ts
deleted file mode 100644
index 8fe8f29..0000000
--- a/node_modules/rxjs/src/add/operator/elementAt.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/elementAt';
diff --git a/node_modules/rxjs/src/add/operator/every.ts b/node_modules/rxjs/src/add/operator/every.ts
deleted file mode 100644
index 789d3c1..0000000
--- a/node_modules/rxjs/src/add/operator/every.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/every';
diff --git a/node_modules/rxjs/src/add/operator/exhaust.ts b/node_modules/rxjs/src/add/operator/exhaust.ts
deleted file mode 100644
index d0cae89..0000000
--- a/node_modules/rxjs/src/add/operator/exhaust.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/exhaust';
diff --git a/node_modules/rxjs/src/add/operator/exhaustMap.ts b/node_modules/rxjs/src/add/operator/exhaustMap.ts
deleted file mode 100644
index 6e231be..0000000
--- a/node_modules/rxjs/src/add/operator/exhaustMap.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/exhaustMap';
diff --git a/node_modules/rxjs/src/add/operator/expand.ts b/node_modules/rxjs/src/add/operator/expand.ts
deleted file mode 100644
index 035ea49..0000000
--- a/node_modules/rxjs/src/add/operator/expand.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/expand';
diff --git a/node_modules/rxjs/src/add/operator/filter.ts b/node_modules/rxjs/src/add/operator/filter.ts
deleted file mode 100644
index 1cfe74a..0000000
--- a/node_modules/rxjs/src/add/operator/filter.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/filter';
diff --git a/node_modules/rxjs/src/add/operator/finally.ts b/node_modules/rxjs/src/add/operator/finally.ts
deleted file mode 100644
index 7db9d99..0000000
--- a/node_modules/rxjs/src/add/operator/finally.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/finally';
diff --git a/node_modules/rxjs/src/add/operator/find.ts b/node_modules/rxjs/src/add/operator/find.ts
deleted file mode 100644
index 2255ba4..0000000
--- a/node_modules/rxjs/src/add/operator/find.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/find';
diff --git a/node_modules/rxjs/src/add/operator/findIndex.ts b/node_modules/rxjs/src/add/operator/findIndex.ts
deleted file mode 100644
index 8d98469..0000000
--- a/node_modules/rxjs/src/add/operator/findIndex.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/findIndex';
diff --git a/node_modules/rxjs/src/add/operator/first.ts b/node_modules/rxjs/src/add/operator/first.ts
deleted file mode 100644
index b12264f..0000000
--- a/node_modules/rxjs/src/add/operator/first.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/first';
diff --git a/node_modules/rxjs/src/add/operator/groupBy.ts b/node_modules/rxjs/src/add/operator/groupBy.ts
deleted file mode 100644
index 932d1f4..0000000
--- a/node_modules/rxjs/src/add/operator/groupBy.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/groupBy';
diff --git a/node_modules/rxjs/src/add/operator/ignoreElements.ts b/node_modules/rxjs/src/add/operator/ignoreElements.ts
deleted file mode 100644
index 28b04ba..0000000
--- a/node_modules/rxjs/src/add/operator/ignoreElements.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/ignoreElements';
diff --git a/node_modules/rxjs/src/add/operator/isEmpty.ts b/node_modules/rxjs/src/add/operator/isEmpty.ts
deleted file mode 100644
index b84aaa9..0000000
--- a/node_modules/rxjs/src/add/operator/isEmpty.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/isEmpty';
diff --git a/node_modules/rxjs/src/add/operator/last.ts b/node_modules/rxjs/src/add/operator/last.ts
deleted file mode 100644
index 0b222df..0000000
--- a/node_modules/rxjs/src/add/operator/last.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/last';
diff --git a/node_modules/rxjs/src/add/operator/let.ts b/node_modules/rxjs/src/add/operator/let.ts
deleted file mode 100644
index 5b92015..0000000
--- a/node_modules/rxjs/src/add/operator/let.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/let';
diff --git a/node_modules/rxjs/src/add/operator/map.ts b/node_modules/rxjs/src/add/operator/map.ts
deleted file mode 100644
index e9f2a7f..0000000
--- a/node_modules/rxjs/src/add/operator/map.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/map';
diff --git a/node_modules/rxjs/src/add/operator/mapTo.ts b/node_modules/rxjs/src/add/operator/mapTo.ts
deleted file mode 100644
index a49f787..0000000
--- a/node_modules/rxjs/src/add/operator/mapTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/mapTo';
diff --git a/node_modules/rxjs/src/add/operator/materialize.ts b/node_modules/rxjs/src/add/operator/materialize.ts
deleted file mode 100644
index e773199..0000000
--- a/node_modules/rxjs/src/add/operator/materialize.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/materialize';
diff --git a/node_modules/rxjs/src/add/operator/max.ts b/node_modules/rxjs/src/add/operator/max.ts
deleted file mode 100644
index c66f7ae..0000000
--- a/node_modules/rxjs/src/add/operator/max.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/max';
diff --git a/node_modules/rxjs/src/add/operator/merge.ts b/node_modules/rxjs/src/add/operator/merge.ts
deleted file mode 100644
index dfa5c46..0000000
--- a/node_modules/rxjs/src/add/operator/merge.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/merge';
diff --git a/node_modules/rxjs/src/add/operator/mergeAll.ts b/node_modules/rxjs/src/add/operator/mergeAll.ts
deleted file mode 100644
index 06cdc4f..0000000
--- a/node_modules/rxjs/src/add/operator/mergeAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/mergeAll';
diff --git a/node_modules/rxjs/src/add/operator/mergeMap.ts b/node_modules/rxjs/src/add/operator/mergeMap.ts
deleted file mode 100644
index d8ec3cc..0000000
--- a/node_modules/rxjs/src/add/operator/mergeMap.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/mergeMap';
diff --git a/node_modules/rxjs/src/add/operator/mergeMapTo.ts b/node_modules/rxjs/src/add/operator/mergeMapTo.ts
deleted file mode 100644
index 0d8e15f..0000000
--- a/node_modules/rxjs/src/add/operator/mergeMapTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/mergeMapTo';
diff --git a/node_modules/rxjs/src/add/operator/mergeScan.ts b/node_modules/rxjs/src/add/operator/mergeScan.ts
deleted file mode 100644
index 17c5fcc..0000000
--- a/node_modules/rxjs/src/add/operator/mergeScan.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/mergeScan';
diff --git a/node_modules/rxjs/src/add/operator/min.ts b/node_modules/rxjs/src/add/operator/min.ts
deleted file mode 100644
index 5fa91d5..0000000
--- a/node_modules/rxjs/src/add/operator/min.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/min';
diff --git a/node_modules/rxjs/src/add/operator/multicast.ts b/node_modules/rxjs/src/add/operator/multicast.ts
deleted file mode 100644
index 03b0670..0000000
--- a/node_modules/rxjs/src/add/operator/multicast.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/multicast';
diff --git a/node_modules/rxjs/src/add/operator/observeOn.ts b/node_modules/rxjs/src/add/operator/observeOn.ts
deleted file mode 100644
index 4ade085..0000000
--- a/node_modules/rxjs/src/add/operator/observeOn.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/observeOn';
diff --git a/node_modules/rxjs/src/add/operator/onErrorResumeNext.ts b/node_modules/rxjs/src/add/operator/onErrorResumeNext.ts
deleted file mode 100644
index 0d2aa97..0000000
--- a/node_modules/rxjs/src/add/operator/onErrorResumeNext.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/onErrorResumeNext';
diff --git a/node_modules/rxjs/src/add/operator/pairwise.ts b/node_modules/rxjs/src/add/operator/pairwise.ts
deleted file mode 100644
index 2930fd3..0000000
--- a/node_modules/rxjs/src/add/operator/pairwise.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/pairwise';
diff --git a/node_modules/rxjs/src/add/operator/partition.ts b/node_modules/rxjs/src/add/operator/partition.ts
deleted file mode 100644
index 7b8c869..0000000
--- a/node_modules/rxjs/src/add/operator/partition.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/partition';
diff --git a/node_modules/rxjs/src/add/operator/pluck.ts b/node_modules/rxjs/src/add/operator/pluck.ts
deleted file mode 100644
index 0af0f3b..0000000
--- a/node_modules/rxjs/src/add/operator/pluck.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/pluck';
diff --git a/node_modules/rxjs/src/add/operator/publish.ts b/node_modules/rxjs/src/add/operator/publish.ts
deleted file mode 100644
index b7198cc..0000000
--- a/node_modules/rxjs/src/add/operator/publish.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/publish';
diff --git a/node_modules/rxjs/src/add/operator/publishBehavior.ts b/node_modules/rxjs/src/add/operator/publishBehavior.ts
deleted file mode 100644
index 3bc5e01..0000000
--- a/node_modules/rxjs/src/add/operator/publishBehavior.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/publishBehavior';
diff --git a/node_modules/rxjs/src/add/operator/publishLast.ts b/node_modules/rxjs/src/add/operator/publishLast.ts
deleted file mode 100644
index 243d07c..0000000
--- a/node_modules/rxjs/src/add/operator/publishLast.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/publishLast';
diff --git a/node_modules/rxjs/src/add/operator/publishReplay.ts b/node_modules/rxjs/src/add/operator/publishReplay.ts
deleted file mode 100644
index 06bc922..0000000
--- a/node_modules/rxjs/src/add/operator/publishReplay.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/publishReplay';
diff --git a/node_modules/rxjs/src/add/operator/race.ts b/node_modules/rxjs/src/add/operator/race.ts
deleted file mode 100644
index b113466..0000000
--- a/node_modules/rxjs/src/add/operator/race.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/race';
diff --git a/node_modules/rxjs/src/add/operator/reduce.ts b/node_modules/rxjs/src/add/operator/reduce.ts
deleted file mode 100644
index c8db530..0000000
--- a/node_modules/rxjs/src/add/operator/reduce.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/reduce';
diff --git a/node_modules/rxjs/src/add/operator/repeat.ts b/node_modules/rxjs/src/add/operator/repeat.ts
deleted file mode 100644
index 4290613..0000000
--- a/node_modules/rxjs/src/add/operator/repeat.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/repeat';
diff --git a/node_modules/rxjs/src/add/operator/repeatWhen.ts b/node_modules/rxjs/src/add/operator/repeatWhen.ts
deleted file mode 100644
index ca5471a..0000000
--- a/node_modules/rxjs/src/add/operator/repeatWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/repeatWhen';
diff --git a/node_modules/rxjs/src/add/operator/retry.ts b/node_modules/rxjs/src/add/operator/retry.ts
deleted file mode 100644
index fb9316b..0000000
--- a/node_modules/rxjs/src/add/operator/retry.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/retry';
diff --git a/node_modules/rxjs/src/add/operator/retryWhen.ts b/node_modules/rxjs/src/add/operator/retryWhen.ts
deleted file mode 100644
index c455337..0000000
--- a/node_modules/rxjs/src/add/operator/retryWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/retryWhen';
diff --git a/node_modules/rxjs/src/add/operator/sample.ts b/node_modules/rxjs/src/add/operator/sample.ts
deleted file mode 100644
index 441255f..0000000
--- a/node_modules/rxjs/src/add/operator/sample.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/sample';
diff --git a/node_modules/rxjs/src/add/operator/sampleTime.ts b/node_modules/rxjs/src/add/operator/sampleTime.ts
deleted file mode 100644
index 153d8b0..0000000
--- a/node_modules/rxjs/src/add/operator/sampleTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/sampleTime';
diff --git a/node_modules/rxjs/src/add/operator/scan.ts b/node_modules/rxjs/src/add/operator/scan.ts
deleted file mode 100644
index baf8162..0000000
--- a/node_modules/rxjs/src/add/operator/scan.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/scan';
diff --git a/node_modules/rxjs/src/add/operator/sequenceEqual.ts b/node_modules/rxjs/src/add/operator/sequenceEqual.ts
deleted file mode 100644
index f47a31d..0000000
--- a/node_modules/rxjs/src/add/operator/sequenceEqual.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/sequenceEqual';
diff --git a/node_modules/rxjs/src/add/operator/share.ts b/node_modules/rxjs/src/add/operator/share.ts
deleted file mode 100644
index 6db65af..0000000
--- a/node_modules/rxjs/src/add/operator/share.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/share';
diff --git a/node_modules/rxjs/src/add/operator/shareReplay.ts b/node_modules/rxjs/src/add/operator/shareReplay.ts
deleted file mode 100644
index 7f31ff4..0000000
--- a/node_modules/rxjs/src/add/operator/shareReplay.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/shareReplay';
diff --git a/node_modules/rxjs/src/add/operator/single.ts b/node_modules/rxjs/src/add/operator/single.ts
deleted file mode 100644
index d35b3cd..0000000
--- a/node_modules/rxjs/src/add/operator/single.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/single';
diff --git a/node_modules/rxjs/src/add/operator/skip.ts b/node_modules/rxjs/src/add/operator/skip.ts
deleted file mode 100644
index 1456f1e..0000000
--- a/node_modules/rxjs/src/add/operator/skip.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/skip';
diff --git a/node_modules/rxjs/src/add/operator/skipLast.ts b/node_modules/rxjs/src/add/operator/skipLast.ts
deleted file mode 100644
index 0c432c9..0000000
--- a/node_modules/rxjs/src/add/operator/skipLast.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/skipLast';
diff --git a/node_modules/rxjs/src/add/operator/skipUntil.ts b/node_modules/rxjs/src/add/operator/skipUntil.ts
deleted file mode 100644
index 21ea6b2..0000000
--- a/node_modules/rxjs/src/add/operator/skipUntil.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/skipUntil';
diff --git a/node_modules/rxjs/src/add/operator/skipWhile.ts b/node_modules/rxjs/src/add/operator/skipWhile.ts
deleted file mode 100644
index 496218b..0000000
--- a/node_modules/rxjs/src/add/operator/skipWhile.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/skipWhile';
diff --git a/node_modules/rxjs/src/add/operator/startWith.ts b/node_modules/rxjs/src/add/operator/startWith.ts
deleted file mode 100644
index 9c9e670..0000000
--- a/node_modules/rxjs/src/add/operator/startWith.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/startWith';
diff --git a/node_modules/rxjs/src/add/operator/subscribeOn.ts b/node_modules/rxjs/src/add/operator/subscribeOn.ts
deleted file mode 100644
index a1b5d6d..0000000
--- a/node_modules/rxjs/src/add/operator/subscribeOn.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/subscribeOn';
diff --git a/node_modules/rxjs/src/add/operator/switch.ts b/node_modules/rxjs/src/add/operator/switch.ts
deleted file mode 100644
index d2d3f48..0000000
--- a/node_modules/rxjs/src/add/operator/switch.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/switch';
diff --git a/node_modules/rxjs/src/add/operator/switchMap.ts b/node_modules/rxjs/src/add/operator/switchMap.ts
deleted file mode 100644
index b1dfdfa..0000000
--- a/node_modules/rxjs/src/add/operator/switchMap.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/switchMap';
diff --git a/node_modules/rxjs/src/add/operator/switchMapTo.ts b/node_modules/rxjs/src/add/operator/switchMapTo.ts
deleted file mode 100644
index 320b844..0000000
--- a/node_modules/rxjs/src/add/operator/switchMapTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/switchMapTo';
diff --git a/node_modules/rxjs/src/add/operator/take.ts b/node_modules/rxjs/src/add/operator/take.ts
deleted file mode 100644
index 08c3bcb..0000000
--- a/node_modules/rxjs/src/add/operator/take.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/take';
diff --git a/node_modules/rxjs/src/add/operator/takeLast.ts b/node_modules/rxjs/src/add/operator/takeLast.ts
deleted file mode 100644
index 13d0816..0000000
--- a/node_modules/rxjs/src/add/operator/takeLast.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/takeLast';
diff --git a/node_modules/rxjs/src/add/operator/takeUntil.ts b/node_modules/rxjs/src/add/operator/takeUntil.ts
deleted file mode 100644
index 78c8e55..0000000
--- a/node_modules/rxjs/src/add/operator/takeUntil.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/takeUntil';
diff --git a/node_modules/rxjs/src/add/operator/takeWhile.ts b/node_modules/rxjs/src/add/operator/takeWhile.ts
deleted file mode 100644
index 06ff174..0000000
--- a/node_modules/rxjs/src/add/operator/takeWhile.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/takeWhile';
diff --git a/node_modules/rxjs/src/add/operator/throttle.ts b/node_modules/rxjs/src/add/operator/throttle.ts
deleted file mode 100644
index 825457b..0000000
--- a/node_modules/rxjs/src/add/operator/throttle.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/throttle';
diff --git a/node_modules/rxjs/src/add/operator/throttleTime.ts b/node_modules/rxjs/src/add/operator/throttleTime.ts
deleted file mode 100644
index c683297..0000000
--- a/node_modules/rxjs/src/add/operator/throttleTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/throttleTime';
diff --git a/node_modules/rxjs/src/add/operator/timeInterval.ts b/node_modules/rxjs/src/add/operator/timeInterval.ts
deleted file mode 100644
index 198a616..0000000
--- a/node_modules/rxjs/src/add/operator/timeInterval.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/timeInterval';
diff --git a/node_modules/rxjs/src/add/operator/timeout.ts b/node_modules/rxjs/src/add/operator/timeout.ts
deleted file mode 100644
index 2a69ffd..0000000
--- a/node_modules/rxjs/src/add/operator/timeout.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/timeout';
diff --git a/node_modules/rxjs/src/add/operator/timeoutWith.ts b/node_modules/rxjs/src/add/operator/timeoutWith.ts
deleted file mode 100644
index cd4ec44..0000000
--- a/node_modules/rxjs/src/add/operator/timeoutWith.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/timeoutWith';
diff --git a/node_modules/rxjs/src/add/operator/timestamp.ts b/node_modules/rxjs/src/add/operator/timestamp.ts
deleted file mode 100644
index 16402c8..0000000
--- a/node_modules/rxjs/src/add/operator/timestamp.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/timestamp';
diff --git a/node_modules/rxjs/src/add/operator/toArray.ts b/node_modules/rxjs/src/add/operator/toArray.ts
deleted file mode 100644
index a0f1a4f..0000000
--- a/node_modules/rxjs/src/add/operator/toArray.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/toArray';
diff --git a/node_modules/rxjs/src/add/operator/toPromise.ts b/node_modules/rxjs/src/add/operator/toPromise.ts
deleted file mode 100644
index cc7b16e..0000000
--- a/node_modules/rxjs/src/add/operator/toPromise.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/toPromise';
diff --git a/node_modules/rxjs/src/add/operator/window.ts b/node_modules/rxjs/src/add/operator/window.ts
deleted file mode 100644
index 450c41f..0000000
--- a/node_modules/rxjs/src/add/operator/window.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/window';
diff --git a/node_modules/rxjs/src/add/operator/windowCount.ts b/node_modules/rxjs/src/add/operator/windowCount.ts
deleted file mode 100644
index da7eccf..0000000
--- a/node_modules/rxjs/src/add/operator/windowCount.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/windowCount';
diff --git a/node_modules/rxjs/src/add/operator/windowTime.ts b/node_modules/rxjs/src/add/operator/windowTime.ts
deleted file mode 100644
index 1d82ec6..0000000
--- a/node_modules/rxjs/src/add/operator/windowTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/windowTime';
diff --git a/node_modules/rxjs/src/add/operator/windowToggle.ts b/node_modules/rxjs/src/add/operator/windowToggle.ts
deleted file mode 100644
index 9ed25df..0000000
--- a/node_modules/rxjs/src/add/operator/windowToggle.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/windowToggle';
diff --git a/node_modules/rxjs/src/add/operator/windowWhen.ts b/node_modules/rxjs/src/add/operator/windowWhen.ts
deleted file mode 100644
index f5d8564..0000000
--- a/node_modules/rxjs/src/add/operator/windowWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/windowWhen';
diff --git a/node_modules/rxjs/src/add/operator/withLatestFrom.ts b/node_modules/rxjs/src/add/operator/withLatestFrom.ts
deleted file mode 100644
index 9f71574..0000000
--- a/node_modules/rxjs/src/add/operator/withLatestFrom.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/withLatestFrom';
diff --git a/node_modules/rxjs/src/add/operator/zip.ts b/node_modules/rxjs/src/add/operator/zip.ts
deleted file mode 100644
index 414202a..0000000
--- a/node_modules/rxjs/src/add/operator/zip.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/zip';
diff --git a/node_modules/rxjs/src/add/operator/zipAll.ts b/node_modules/rxjs/src/add/operator/zipAll.ts
deleted file mode 100644
index cf8877f..0000000
--- a/node_modules/rxjs/src/add/operator/zipAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-import 'rxjs-compat/add/operator/zipAll';
diff --git a/node_modules/rxjs/src/ajax/index.ts b/node_modules/rxjs/src/ajax/index.ts
deleted file mode 100644
index 73cb0cc..0000000
--- a/node_modules/rxjs/src/ajax/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { ajax } from '../internal/observable/dom/ajax';
-export { AjaxRequest, AjaxResponse, AjaxError, AjaxTimeoutError } from '../internal/observable/dom/AjaxObservable';
diff --git a/node_modules/rxjs/src/ajax/package.json b/node_modules/rxjs/src/ajax/package.json
deleted file mode 100644
index 898cd05..0000000
--- a/node_modules/rxjs/src/ajax/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "rxjs/ajax",
-  "typings": "./index.d.ts",
-  "main": "./index.js",
-  "module": "../_esm5/ajax/index.js",
-  "es2015": "../_esm2015/ajax/index.js",
-  "sideEffects": false
-}
diff --git a/node_modules/rxjs/src/fetch/index.ts b/node_modules/rxjs/src/fetch/index.ts
deleted file mode 100644
index e6ff01d..0000000
--- a/node_modules/rxjs/src/fetch/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { fromFetch } from '../internal/observable/dom/fetch';
diff --git a/node_modules/rxjs/src/fetch/package.json b/node_modules/rxjs/src/fetch/package.json
deleted file mode 100644
index dff5519..0000000
--- a/node_modules/rxjs/src/fetch/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "rxjs/fetch",
-  "typings": "./index.d.ts",
-  "main": "./index.js",
-  "module": "../_esm5/fetch/index.js",
-  "es2015": "../_esm2015/fetch/index.js",
-  "sideEffects": false
-}
diff --git a/node_modules/rxjs/src/index.ts b/node_modules/rxjs/src/index.ts
deleted file mode 100644
index 624a92b..0000000
--- a/node_modules/rxjs/src/index.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Observable */
-export { Observable } from './internal/Observable';
-export { ConnectableObservable } from './internal/observable/ConnectableObservable';
-export { GroupedObservable } from './internal/operators/groupBy';
-export { Operator } from './internal/Operator';
-export { observable } from './internal/symbol/observable';
-
-/* Subjects */
-export { Subject } from './internal/Subject';
-export { BehaviorSubject } from './internal/BehaviorSubject';
-export { ReplaySubject } from './internal/ReplaySubject';
-export { AsyncSubject } from './internal/AsyncSubject';
-
-/* Schedulers */
-export { asap as asapScheduler } from './internal/scheduler/asap';
-export { async as asyncScheduler } from './internal/scheduler/async';
-export { queue as queueScheduler } from './internal/scheduler/queue';
-export { animationFrame as animationFrameScheduler } from './internal/scheduler/animationFrame';
-export { VirtualTimeScheduler, VirtualAction } from './internal/scheduler/VirtualTimeScheduler';
-export { Scheduler } from './internal/Scheduler';
-
-/* Subscription */
-export { Subscription } from './internal/Subscription';
-export { Subscriber } from './internal/Subscriber';
-
-/* Notification */
-export { Notification, NotificationKind } from './internal/Notification';
-
-/* Utils */
-export { pipe } from './internal/util/pipe';
-export { noop } from './internal/util/noop';
-export { identity } from './internal/util/identity';
-export { isObservable } from './internal/util/isObservable';
-
-/* Error types */
-export { ArgumentOutOfRangeError } from './internal/util/ArgumentOutOfRangeError';
-export { EmptyError } from './internal/util/EmptyError';
-export { ObjectUnsubscribedError } from './internal/util/ObjectUnsubscribedError';
-export { UnsubscriptionError } from './internal/util/UnsubscriptionError';
-export { TimeoutError } from './internal/util/TimeoutError';
-
-/* Static observable creation exports */
-export { bindCallback } from './internal/observable/bindCallback';
-export { bindNodeCallback } from './internal/observable/bindNodeCallback';
-export { combineLatest } from './internal/observable/combineLatest';
-export { concat } from './internal/observable/concat';
-export { defer } from './internal/observable/defer';
-export { empty } from './internal/observable/empty';
-export { forkJoin } from './internal/observable/forkJoin';
-export { from } from './internal/observable/from';
-export { fromEvent } from './internal/observable/fromEvent';
-export { fromEventPattern } from './internal/observable/fromEventPattern';
-export { generate } from './internal/observable/generate';
-export { iif } from './internal/observable/iif';
-export { interval } from './internal/observable/interval';
-export { merge } from './internal/observable/merge';
-export { never } from './internal/observable/never';
-export { of } from './internal/observable/of';
-export { onErrorResumeNext } from './internal/observable/onErrorResumeNext';
-export { pairs } from './internal/observable/pairs';
-export { partition } from './internal/observable/partition';
-export { race } from './internal/observable/race';
-export { range } from './internal/observable/range';
-export { throwError } from './internal/observable/throwError';
-export { timer } from './internal/observable/timer';
-export { using } from './internal/observable/using';
-export { zip } from './internal/observable/zip';
-export { scheduled } from './internal/scheduled/scheduled';
-
-/* Constants */
-export { EMPTY } from './internal/observable/empty';
-export { NEVER } from './internal/observable/never';
-
-/* Types */
-export * from './internal/types';
-
-/* Config */
-export { config } from './internal/config';
diff --git a/node_modules/rxjs/src/interfaces.ts b/node_modules/rxjs/src/interfaces.ts
deleted file mode 100644
index 5d5821d..0000000
--- a/node_modules/rxjs/src/interfaces.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/interfaces';
diff --git a/node_modules/rxjs/src/internal-compatibility/index.ts b/node_modules/rxjs/src/internal-compatibility/index.ts
deleted file mode 100644
index c7b0058..0000000
--- a/node_modules/rxjs/src/internal-compatibility/index.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-
-export { config } from '../internal/config';
-export { InnerSubscriber } from '../internal/InnerSubscriber';
-export { OuterSubscriber } from '../internal/OuterSubscriber';
-export { Scheduler } from '../internal/Scheduler';
-export { AnonymousSubject } from '../internal/Subject';
-export { SubjectSubscription } from '../internal/SubjectSubscription';
-export { Subscriber } from '../internal/Subscriber';
-
-export { fromPromise } from '../internal/observable/fromPromise';
-export { fromIterable } from '../internal/observable/fromIterable';
-export { ajax } from '../internal/observable/dom/ajax';
-export { webSocket } from '../internal/observable/dom/webSocket';
-export { AjaxRequest, AjaxCreationMethod, ajaxGet, ajaxPost, ajaxDelete, ajaxPut, ajaxPatch, ajaxGetJSON,
-  AjaxObservable, AjaxSubscriber, AjaxResponse, AjaxError, AjaxTimeoutError } from '../internal/observable/dom/AjaxObservable';
-export { WebSocketSubjectConfig, WebSocketSubject } from '../internal/observable/dom/WebSocketSubject';
-export { CombineLatestOperator } from '../internal/observable/combineLatest';
-export { EventTargetLike } from '../internal/observable/fromEvent';
-export { ConditionFunc, IterateFunc, ResultFunc, GenerateBaseOptions, GenerateOptions } from '../internal/observable/generate';
-export { dispatch } from '../internal/observable/range';
-export { SubscribeOnObservable } from '../internal/observable/SubscribeOnObservable';
-
-export { Timestamp } from '../internal/operators/timestamp';
-export { TimeInterval } from '../internal/operators/timeInterval';
-export { GroupedObservable } from '../internal/operators/groupBy';
-export { ShareReplayConfig } from '../internal/operators/shareReplay';
-export { ThrottleConfig, defaultThrottleConfig } from '../internal/operators/throttle';
-
-export { rxSubscriber } from '../internal/symbol/rxSubscriber';
-export { iterator } from '../internal/symbol/iterator';
-export { observable } from '../internal/symbol/observable';
-
-export { ArgumentOutOfRangeError } from '../internal/util/ArgumentOutOfRangeError';
-export { EmptyError } from '../internal/util/EmptyError';
-export { Immediate } from '../internal/util/Immediate';
-export { ObjectUnsubscribedError } from '../internal/util/ObjectUnsubscribedError';
-export { TimeoutError } from '../internal/util/TimeoutError';
-export { UnsubscriptionError } from '../internal/util/UnsubscriptionError';
-export { applyMixins } from '../internal/util/applyMixins';
-export { errorObject } from '../internal/util/errorObject';
-export { hostReportError } from '../internal/util/hostReportError';
-export { identity } from '../internal/util/identity';
-export { isArray } from '../internal/util/isArray';
-export { isArrayLike } from '../internal/util/isArrayLike';
-export { isDate } from '../internal/util/isDate';
-export { isFunction } from '../internal/util/isFunction';
-export { isIterable } from '../internal/util/isIterable';
-export { isNumeric } from '../internal/util/isNumeric';
-export { isObject } from '../internal/util/isObject';
-export { isInteropObservable as isObservable } from '../internal/util/isInteropObservable';
-export { isPromise } from '../internal/util/isPromise';
-export { isScheduler } from '../internal/util/isScheduler';
-export { noop } from '../internal/util/noop';
-export { not } from '../internal/util/not';
-export { pipe } from '../internal/util/pipe';
-export { root } from '../internal/util/root';
-export { subscribeTo } from '../internal/util/subscribeTo';
-export { subscribeToArray } from '../internal/util/subscribeToArray';
-export { subscribeToIterable } from '../internal/util/subscribeToIterable';
-export { subscribeToObservable } from '../internal/util/subscribeToObservable';
-export { subscribeToPromise } from '../internal/util/subscribeToPromise';
-export { subscribeToResult } from '../internal/util/subscribeToResult';
-export { toSubscriber } from '../internal/util/toSubscriber';
-export { tryCatch } from '../internal/util/tryCatch';
diff --git a/node_modules/rxjs/src/internal-compatibility/package.json b/node_modules/rxjs/src/internal-compatibility/package.json
deleted file mode 100644
index 5ff05a6..0000000
--- a/node_modules/rxjs/src/internal-compatibility/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "rxjs/internal-compatibility",
-  "typings": "./index.d.ts",
-  "main": "./index.js",
-  "module": "../_esm5/internal-compatibility/index.js",
-  "es2015": "../_esm2015/internal-compatibility/index.js",
-  "sideEffects": false
-}
diff --git a/node_modules/rxjs/src/internal/AsyncSubject.ts b/node_modules/rxjs/src/internal/AsyncSubject.ts
deleted file mode 100644
index 218e8d2..0000000
--- a/node_modules/rxjs/src/internal/AsyncSubject.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { Subject } from './Subject';
-import { Subscriber } from './Subscriber';
-import { Subscription } from './Subscription';
-
-/**
- * A variant of Subject that only emits a value when it completes. It will emit
- * its latest value to all its observers on completion.
- *
- * @class AsyncSubject<T>
- */
-export class AsyncSubject<T> extends Subject<T> {
-  private value: T = null;
-  private hasNext: boolean = false;
-  private hasCompleted: boolean = false;
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<any>): Subscription {
-    if (this.hasError) {
-      subscriber.error(this.thrownError);
-      return Subscription.EMPTY;
-    } else if (this.hasCompleted && this.hasNext) {
-      subscriber.next(this.value);
-      subscriber.complete();
-      return Subscription.EMPTY;
-    }
-    return super._subscribe(subscriber);
-  }
-
-  next(value: T): void {
-    if (!this.hasCompleted) {
-      this.value = value;
-      this.hasNext = true;
-    }
-  }
-
-  error(error: any): void {
-    if (!this.hasCompleted) {
-      super.error(error);
-    }
-  }
-
-  complete(): void {
-    this.hasCompleted = true;
-    if (this.hasNext) {
-      super.next(this.value);
-    }
-    super.complete();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/BehaviorSubject.ts b/node_modules/rxjs/src/internal/BehaviorSubject.ts
deleted file mode 100644
index 20de21c..0000000
--- a/node_modules/rxjs/src/internal/BehaviorSubject.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { Subject } from './Subject';
-import { Subscriber } from './Subscriber';
-import { Subscription } from './Subscription';
-import { SubscriptionLike } from './types';
-import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
-
-/**
- * A variant of Subject that requires an initial value and emits its current
- * value whenever it is subscribed to.
- *
- * @class BehaviorSubject<T>
- */
-export class BehaviorSubject<T> extends Subject<T> {
-
-  constructor(private _value: T) {
-    super();
-  }
-
-  get value(): T {
-    return this.getValue();
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<T>): Subscription {
-    const subscription = super._subscribe(subscriber);
-    if (subscription && !(<SubscriptionLike>subscription).closed) {
-      subscriber.next(this._value);
-    }
-    return subscription;
-  }
-
-  getValue(): T {
-    if (this.hasError) {
-      throw this.thrownError;
-    } else if (this.closed) {
-      throw new ObjectUnsubscribedError();
-    } else {
-      return this._value;
-    }
-  }
-
-  next(value: T): void {
-    super.next(this._value = value);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/InnerSubscriber.ts b/node_modules/rxjs/src/internal/InnerSubscriber.ts
deleted file mode 100644
index 048e9a3..0000000
--- a/node_modules/rxjs/src/internal/InnerSubscriber.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { Subscriber } from './Subscriber';
-import { OuterSubscriber } from './OuterSubscriber';
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class InnerSubscriber<T, R> extends Subscriber<R> {
-  private index = 0;
-
-  constructor(private parent: OuterSubscriber<T, R>, public outerValue: T, public outerIndex: number) {
-    super();
-  }
-
-  protected _next(value: R): void {
-    this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
-  }
-
-  protected _error(error: any): void {
-    this.parent.notifyError(error, this);
-    this.unsubscribe();
-  }
-
-  protected _complete(): void {
-    this.parent.notifyComplete(this);
-    this.unsubscribe();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/Notification.ts b/node_modules/rxjs/src/internal/Notification.ts
deleted file mode 100644
index f65f70c..0000000
--- a/node_modules/rxjs/src/internal/Notification.ts
+++ /dev/null
@@ -1,148 +0,0 @@
-import { PartialObserver } from './types';
-import { Observable } from './Observable';
-import { empty } from './observable/empty';
-import { of } from './observable/of';
-import { throwError } from './observable/throwError';
-import { deprecate } from 'util';
-
-// TODO: When this enum is removed, replace it with a type alias. See #4556.
-/**
- * @deprecated NotificationKind is deprecated as const enums are not compatible with isolated modules. Use a string literal instead.
- */
-export enum NotificationKind {
-  NEXT = 'N',
-  ERROR = 'E',
-  COMPLETE = 'C',
-}
-
-/**
- * Represents a push-based event or value that an {@link Observable} can emit.
- * This class is particularly useful for operators that manage notifications,
- * like {@link materialize}, {@link dematerialize}, {@link observeOn}, and
- * others. Besides wrapping the actual delivered value, it also annotates it
- * with metadata of, for instance, what type of push message it is (`next`,
- * `error`, or `complete`).
- *
- * @see {@link materialize}
- * @see {@link dematerialize}
- * @see {@link observeOn}
- *
- * @class Notification<T>
- */
-export class Notification<T> {
-  hasValue: boolean;
-
-  constructor(public kind: 'N' | 'E' | 'C', public value?: T, public error?: any) {
-    this.hasValue = kind === 'N';
-  }
-
-  /**
-   * Delivers to the given `observer` the value wrapped by this Notification.
-   * @param {Observer} observer
-   * @return
-   */
-  observe(observer: PartialObserver<T>): any {
-    switch (this.kind) {
-      case 'N':
-        return observer.next && observer.next(this.value);
-      case 'E':
-        return observer.error && observer.error(this.error);
-      case 'C':
-        return observer.complete && observer.complete();
-    }
-  }
-
-  /**
-   * Given some {@link Observer} callbacks, deliver the value represented by the
-   * current Notification to the correctly corresponding callback.
-   * @param {function(value: T): void} next An Observer `next` callback.
-   * @param {function(err: any): void} [error] An Observer `error` callback.
-   * @param {function(): void} [complete] An Observer `complete` callback.
-   * @return {any}
-   */
-  do(next: (value: T) => void, error?: (err: any) => void, complete?: () => void): any {
-    const kind = this.kind;
-    switch (kind) {
-      case 'N':
-        return next && next(this.value);
-      case 'E':
-        return error && error(this.error);
-      case 'C':
-        return complete && complete();
-    }
-  }
-
-  /**
-   * Takes an Observer or its individual callback functions, and calls `observe`
-   * or `do` methods accordingly.
-   * @param {Observer|function(value: T): void} nextOrObserver An Observer or
-   * the `next` callback.
-   * @param {function(err: any): void} [error] An Observer `error` callback.
-   * @param {function(): void} [complete] An Observer `complete` callback.
-   * @return {any}
-   */
-  accept(nextOrObserver: PartialObserver<T> | ((value: T) => void), error?: (err: any) => void, complete?: () => void) {
-    if (nextOrObserver && typeof (<PartialObserver<T>>nextOrObserver).next === 'function') {
-      return this.observe(<PartialObserver<T>>nextOrObserver);
-    } else {
-      return this.do(<(value: T) => void>nextOrObserver, error, complete);
-    }
-  }
-
-  /**
-   * Returns a simple Observable that just delivers the notification represented
-   * by this Notification instance.
-   * @return {any}
-   */
-  toObservable(): Observable<T> {
-    const kind = this.kind;
-    switch (kind) {
-      case 'N':
-        return of(this.value);
-      case 'E':
-        return throwError(this.error);
-      case 'C':
-        return empty();
-    }
-    throw new Error('unexpected notification kind value');
-  }
-
-  private static completeNotification: Notification<any> = new Notification('C');
-  private static undefinedValueNotification: Notification<any> = new Notification('N', undefined);
-
-  /**
-   * A shortcut to create a Notification instance of the type `next` from a
-   * given value.
-   * @param {T} value The `next` value.
-   * @return {Notification<T>} The "next" Notification representing the
-   * argument.
-   * @nocollapse
-   */
-  static createNext<T>(value: T): Notification<T> {
-    if (typeof value !== 'undefined') {
-      return new Notification('N', value);
-    }
-    return Notification.undefinedValueNotification;
-  }
-
-  /**
-   * A shortcut to create a Notification instance of the type `error` from a
-   * given error.
-   * @param {any} [err] The `error` error.
-   * @return {Notification<T>} The "error" Notification representing the
-   * argument.
-   * @nocollapse
-   */
-  static createError<T>(err?: any): Notification<T> {
-    return new Notification('E', undefined, err);
-  }
-
-  /**
-   * A shortcut to create a Notification instance of the type `complete`.
-   * @return {Notification<any>} The valueless "complete" Notification.
-   * @nocollapse
-   */
-  static createComplete(): Notification<any> {
-    return Notification.completeNotification;
-  }
-}
diff --git a/node_modules/rxjs/src/internal/Observable.ts b/node_modules/rxjs/src/internal/Observable.ts
deleted file mode 100644
index c677428..0000000
--- a/node_modules/rxjs/src/internal/Observable.ts
+++ /dev/null
@@ -1,382 +0,0 @@
-import { Operator } from './Operator';
-import { Subscriber } from './Subscriber';
-import { Subscription } from './Subscription';
-import { TeardownLogic, OperatorFunction, PartialObserver, Subscribable } from './types';
-import { canReportError } from './util/canReportError';
-import { toSubscriber } from './util/toSubscriber';
-import { iif } from './observable/iif';
-import { throwError } from './observable/throwError';
-import { observable as Symbol_observable } from './symbol/observable';
-import { pipeFromArray } from './util/pipe';
-import { config } from './config';
-
-/**
- * A representation of any set of values over any amount of time. This is the most basic building block
- * of RxJS.
- *
- * @class Observable<T>
- */
-export class Observable<T> implements Subscribable<T> {
-
-  /** Internal implementation detail, do not use directly. */
-  public _isScalar: boolean = false;
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  source: Observable<any>;
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  operator: Operator<any, T>;
-
-  /**
-   * @constructor
-   * @param {Function} subscribe the function that is called when the Observable is
-   * initially subscribed to. This function is given a Subscriber, to which new values
-   * can be `next`ed, or an `error` method can be called to raise an error, or
-   * `complete` can be called to notify of a successful completion.
-   */
-  constructor(subscribe?: (this: Observable<T>, subscriber: Subscriber<T>) => TeardownLogic) {
-    if (subscribe) {
-      this._subscribe = subscribe;
-    }
-  }
-
-  // HACK: Since TypeScript inherits static properties too, we have to
-  // fight against TypeScript here so Subject can have a different static create signature
-  /**
-   * Creates a new cold Observable by calling the Observable constructor
-   * @static true
-   * @owner Observable
-   * @method create
-   * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor
-   * @return {Observable} a new cold observable
-   * @nocollapse
-   * @deprecated use new Observable() instead
-   */
-  static create: Function = <T>(subscribe?: (subscriber: Subscriber<T>) => TeardownLogic) => {
-    return new Observable<T>(subscribe);
-  }
-
-  /**
-   * Creates a new Observable, with this Observable as the source, and the passed
-   * operator defined as the new observable's operator.
-   * @method lift
-   * @param {Operator} operator the operator defining the operation to take on the observable
-   * @return {Observable} a new observable with the Operator applied
-   */
-  lift<R>(operator: Operator<T, R>): Observable<R> {
-    const observable = new Observable<R>();
-    observable.source = this;
-    observable.operator = operator;
-    return observable;
-  }
-
-  subscribe(observer?: PartialObserver<T>): Subscription;
-  /** @deprecated Use an observer instead of a complete callback */
-  subscribe(next: null | undefined, error: null | undefined, complete: () => void): Subscription;
-  /** @deprecated Use an observer instead of an error callback */
-  subscribe(next: null | undefined, error: (error: any) => void, complete?: () => void): Subscription;
-  /** @deprecated Use an observer instead of a complete callback */
-  subscribe(next: (value: T) => void, error: null | undefined, complete: () => void): Subscription;
-  subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;
-  /**
-   * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.
-   *
-   * <span class="informal">Use it when you have all these Observables, but still nothing is happening.</span>
-   *
-   * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It
-   * might be for example a function that you passed to Observable's constructor, but most of the time it is
-   * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means
-   * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often
-   * the thought.
-   *
-   * Apart from starting the execution of an Observable, this method allows you to listen for values
-   * that an Observable emits, as well as for when it completes or errors. You can achieve this in two
-   * of the following ways.
-   *
-   * The first way is creating an object that implements {@link Observer} interface. It should have methods
-   * defined by that interface, but note that it should be just a regular JavaScript object, which you can create
-   * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular do
-   * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also
-   * that your object does not have to implement all methods. If you find yourself creating a method that doesn't
-   * do anything, you can simply omit it. Note however, if the `error` method is not provided, all errors will
-   * be left uncaught.
-   *
-   * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.
-   * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent
-   * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of Observer,
-   * if you do not need to listen for something, you can omit a function, preferably by passing `undefined` or `null`,
-   * since `subscribe` recognizes these functions by where they were placed in function call. When it comes
-   * to `error` function, just as before, if not provided, errors emitted by an Observable will be thrown.
-   *
-   * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.
-   * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean
-   * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback
-   * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.
-   *
-   * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.
-   * It is an Observable itself that decides when these functions will be called. For example {@link of}
-   * by default emits all its values synchronously. Always check documentation for how given Observable
-   * will behave when subscribed and if its default behavior can be modified with a `scheduler`.
-   *
-   * ## Example
-   * ### Subscribe with an Observer
-   * ```ts
-   * import { of } from 'rxjs';
-   *
-   * const sumObserver = {
-   *   sum: 0,
-   *   next(value) {
-   *     console.log('Adding: ' + value);
-   *     this.sum = this.sum + value;
-   *   },
-   *   error() {
-   *     // We actually could just remove this method,
-   *     // since we do not really care about errors right now.
-   *   },
-   *   complete() {
-   *     console.log('Sum equals: ' + this.sum);
-   *   }
-   * };
-   *
-   * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.
-   *   .subscribe(sumObserver);
-   *
-   * // Logs:
-   * // "Adding: 1"
-   * // "Adding: 2"
-   * // "Adding: 3"
-   * // "Sum equals: 6"
-   * ```
-   *
-   * ### Subscribe with functions
-   * ```ts
-   * import { of } from 'rxjs'
-   *
-   * let sum = 0;
-   *
-   * of(1, 2, 3).subscribe(
-   *   value => {
-   *     console.log('Adding: ' + value);
-   *     sum = sum + value;
-   *   },
-   *   undefined,
-   *   () => console.log('Sum equals: ' + sum)
-   * );
-   *
-   * // Logs:
-   * // "Adding: 1"
-   * // "Adding: 2"
-   * // "Adding: 3"
-   * // "Sum equals: 6"
-   * ```
-   *
-   * ### Cancel a subscription
-   * ```ts
-   * import { interval } from 'rxjs';
-   *
-   * const subscription = interval(1000).subscribe(
-   *   num => console.log(num),
-   *   undefined,
-   *   () => {
-   *     // Will not be called, even when cancelling subscription.
-   *     console.log('completed!');
-   *   }
-   * );
-   *
-   * setTimeout(() => {
-   *   subscription.unsubscribe();
-   *   console.log('unsubscribed!');
-   * }, 2500);
-   *
-   * // Logs:
-   * // 0 after 1s
-   * // 1 after 2s
-   * // "unsubscribed!" after 2.5s
-   * ```
-   *
-   * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,
-   *  or the first of three possible handlers, which is the handler for each value emitted from the subscribed
-   *  Observable.
-   * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,
-   *  the error will be thrown as unhandled.
-   * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.
-   * @return {ISubscription} a subscription reference to the registered handlers
-   * @method subscribe
-   */
-  subscribe(observerOrNext?: PartialObserver<T> | ((value: T) => void),
-            error?: (error: any) => void,
-            complete?: () => void): Subscription {
-
-    const { operator } = this;
-    const sink = toSubscriber(observerOrNext, error, complete);
-
-    if (operator) {
-      sink.add(operator.call(sink, this.source));
-    } else {
-      sink.add(
-        this.source || (config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?
-        this._subscribe(sink) :
-        this._trySubscribe(sink)
-      );
-    }
-
-    if (config.useDeprecatedSynchronousErrorHandling) {
-      if (sink.syncErrorThrowable) {
-        sink.syncErrorThrowable = false;
-        if (sink.syncErrorThrown) {
-          throw sink.syncErrorValue;
-        }
-      }
-    }
-
-    return sink;
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _trySubscribe(sink: Subscriber<T>): TeardownLogic {
-    try {
-      return this._subscribe(sink);
-    } catch (err) {
-      if (config.useDeprecatedSynchronousErrorHandling) {
-        sink.syncErrorThrown = true;
-        sink.syncErrorValue = err;
-      }
-      if (canReportError(sink)) {
-        sink.error(err);
-      } else {
-        console.warn(err);
-      }
-    }
-  }
-
-  /**
-   * @method forEach
-   * @param {Function} next a handler for each value emitted by the observable
-   * @param {PromiseConstructor} [promiseCtor] a constructor function used to instantiate the Promise
-   * @return {Promise} a promise that either resolves on observable completion or
-   *  rejects with the handled error
-   */
-  forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise<void> {
-    promiseCtor = getPromiseCtor(promiseCtor);
-
-    return new promiseCtor<void>((resolve, reject) => {
-      // Must be declared in a separate statement to avoid a ReferenceError when
-      // accessing subscription below in the closure due to Temporal Dead Zone.
-      let subscription: Subscription;
-      subscription = this.subscribe((value) => {
-        try {
-          next(value);
-        } catch (err) {
-          reject(err);
-          if (subscription) {
-            subscription.unsubscribe();
-          }
-        }
-      }, reject, resolve);
-    }) as Promise<void>;
-  }
-
-  /** @internal This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<any>): TeardownLogic {
-    const { source } = this;
-    return source && source.subscribe(subscriber);
-  }
-
-  // `if` and `throw` are special snow flakes, the compiler sees them as reserved words. Deprecated in
-  // favor of iif and throwError functions.
-  /**
-   * @nocollapse
-   * @deprecated In favor of iif creation function: import { iif } from 'rxjs';
-   */
-  static if: typeof iif;
-  /**
-   * @nocollapse
-   * @deprecated In favor of throwError creation function: import { throwError } from 'rxjs';
-   */
-  static throw: typeof throwError;
-
-  /**
-   * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable
-   * @method Symbol.observable
-   * @return {Observable} this instance of the observable
-   */
-  [Symbol_observable]() {
-    return this;
-  }
-
-  /* tslint:disable:max-line-length */
-  pipe(): Observable<T>;
-  pipe<A>(op1: OperatorFunction<T, A>): Observable<A>;
-  pipe<A, B>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>): Observable<B>;
-  pipe<A, B, C>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>): Observable<C>;
-  pipe<A, B, C, D>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>): Observable<D>;
-  pipe<A, B, C, D, E>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>): Observable<E>;
-  pipe<A, B, C, D, E, F>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>): Observable<F>;
-  pipe<A, B, C, D, E, F, G>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>): Observable<G>;
-  pipe<A, B, C, D, E, F, G, H>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>): Observable<H>;
-  pipe<A, B, C, D, E, F, G, H, I>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>, op9: OperatorFunction<H, I>): Observable<I>;
-  pipe<A, B, C, D, E, F, G, H, I>(op1: OperatorFunction<T, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>, op9: OperatorFunction<H, I>, ...operations: OperatorFunction<any, any>[]): Observable<{}>;
-  /* tslint:enable:max-line-length */
-
-  /**
-   * Used to stitch together functional operators into a chain.
-   * @method pipe
-   * @return {Observable} the Observable result of all of the operators having
-   * been called in the order they were passed in.
-   *
-   * ### Example
-   * ```ts
-   * import { interval } from 'rxjs';
-   * import { map, filter, scan } from 'rxjs/operators';
-   *
-   * interval(1000)
-   *   .pipe(
-   *     filter(x => x % 2 === 0),
-   *     map(x => x + x),
-   *     scan((acc, x) => acc + x)
-   *   )
-   *   .subscribe(x => console.log(x))
-   * ```
-   */
-  pipe(...operations: OperatorFunction<any, any>[]): Observable<any> {
-    if (operations.length === 0) {
-      return this as any;
-    }
-
-    return pipeFromArray(operations)(this);
-  }
-
-  /* tslint:disable:max-line-length */
-  toPromise<T>(this: Observable<T>): Promise<T>;
-  toPromise<T>(this: Observable<T>, PromiseCtor: typeof Promise): Promise<T>;
-  toPromise<T>(this: Observable<T>, PromiseCtor: PromiseConstructorLike): Promise<T>;
-  /* tslint:enable:max-line-length */
-
-  toPromise(promiseCtor?: PromiseConstructorLike): Promise<T> {
-    promiseCtor = getPromiseCtor(promiseCtor);
-
-    return new promiseCtor((resolve, reject) => {
-      let value: any;
-      this.subscribe((x: T) => value = x, (err: any) => reject(err), () => resolve(value));
-    }) as Promise<T>;
-  }
-}
-
-/**
- * Decides between a passed promise constructor from consuming code,
- * A default configured promise constructor, and the native promise
- * constructor and returns it. If nothing can be found, it will throw
- * an error.
- * @param promiseCtor The optional promise constructor to passed by consuming code
- */
-function getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {
-  if (!promiseCtor) {
-    promiseCtor = config.Promise || Promise;
-  }
-
-  if (!promiseCtor) {
-    throw new Error('no Promise impl found');
-  }
-
-  return promiseCtor;
-}
diff --git a/node_modules/rxjs/src/internal/Observer.ts b/node_modules/rxjs/src/internal/Observer.ts
deleted file mode 100644
index 3ae9243..0000000
--- a/node_modules/rxjs/src/internal/Observer.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Observer } from './types';
-import { config } from './config';
-import { hostReportError } from './util/hostReportError';
-
-export const empty: Observer<any> = {
-  closed: true,
-  next(value: any): void { /* noop */},
-  error(err: any): void {
-    if (config.useDeprecatedSynchronousErrorHandling) {
-      throw err;
-    } else {
-      hostReportError(err);
-    }
-  },
-  complete(): void { /*noop*/ }
-};
diff --git a/node_modules/rxjs/src/internal/Operator.ts b/node_modules/rxjs/src/internal/Operator.ts
deleted file mode 100644
index 93b65e6..0000000
--- a/node_modules/rxjs/src/internal/Operator.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { Subscriber } from './Subscriber';
-import { TeardownLogic } from './types';
-
-export interface Operator<T, R> {
-  call(subscriber: Subscriber<R>, source: any): TeardownLogic;
-}
diff --git a/node_modules/rxjs/src/internal/OuterSubscriber.ts b/node_modules/rxjs/src/internal/OuterSubscriber.ts
deleted file mode 100644
index b051321..0000000
--- a/node_modules/rxjs/src/internal/OuterSubscriber.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { Subscriber } from './Subscriber';
-import { InnerSubscriber } from './InnerSubscriber';
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class OuterSubscriber<T, R> extends Subscriber<T> {
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this.destination.next(innerValue);
-  }
-
-  notifyError(error: any, innerSub: InnerSubscriber<T, R>): void {
-    this.destination.error(error);
-  }
-
-  notifyComplete(innerSub: InnerSubscriber<T, R>): void {
-    this.destination.complete();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/ReplaySubject.ts b/node_modules/rxjs/src/internal/ReplaySubject.ts
deleted file mode 100644
index d6d8eb7..0000000
--- a/node_modules/rxjs/src/internal/ReplaySubject.ts
+++ /dev/null
@@ -1,136 +0,0 @@
-import { Subject } from './Subject';
-import { SchedulerLike } from './types';
-import { queue } from './scheduler/queue';
-import { Subscriber } from './Subscriber';
-import { Subscription } from './Subscription';
-import { ObserveOnSubscriber } from './operators/observeOn';
-import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
-import { SubjectSubscription } from './SubjectSubscription';
-/**
- * A variant of Subject that "replays" or emits old values to new subscribers.
- * It buffers a set number of values and will emit those values immediately to
- * any new subscribers in addition to emitting new values to existing subscribers.
- *
- * @class ReplaySubject<T>
- */
-export class ReplaySubject<T> extends Subject<T> {
-  private _events: (ReplayEvent<T> | T)[] = [];
-  private _bufferSize: number;
-  private _windowTime: number;
-  private _infiniteTimeWindow: boolean = false;
-
-  constructor(bufferSize: number = Number.POSITIVE_INFINITY,
-              windowTime: number = Number.POSITIVE_INFINITY,
-              private scheduler?: SchedulerLike) {
-    super();
-    this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
-    this._windowTime = windowTime < 1 ? 1 : windowTime;
-
-    if (windowTime === Number.POSITIVE_INFINITY) {
-      this._infiniteTimeWindow = true;
-      this.next = this.nextInfiniteTimeWindow;
-    } else {
-      this.next = this.nextTimeWindow;
-    }
-  }
-
-  private nextInfiniteTimeWindow(value: T): void {
-    const _events = this._events;
-    _events.push(value);
-    // Since this method is invoked in every next() call than the buffer
-    // can overgrow the max size only by one item
-    if (_events.length > this._bufferSize) {
-      _events.shift();
-    }
-
-    super.next(value);
-  }
-
-  private nextTimeWindow(value: T): void {
-    this._events.push(new ReplayEvent(this._getNow(), value));
-    this._trimBufferThenGetEvents();
-
-    super.next(value);
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<T>): Subscription {
-    // When `_infiniteTimeWindow === true` then the buffer is already trimmed
-    const _infiniteTimeWindow = this._infiniteTimeWindow;
-    const _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();
-    const scheduler = this.scheduler;
-    const len = _events.length;
-    let subscription: Subscription;
-
-    if (this.closed) {
-      throw new ObjectUnsubscribedError();
-    } else if (this.isStopped || this.hasError) {
-      subscription = Subscription.EMPTY;
-    } else {
-      this.observers.push(subscriber);
-      subscription = new SubjectSubscription(this, subscriber);
-    }
-
-    if (scheduler) {
-      subscriber.add(subscriber = new ObserveOnSubscriber<T>(subscriber, scheduler));
-    }
-
-    if (_infiniteTimeWindow) {
-      for (let i = 0; i < len && !subscriber.closed; i++) {
-        subscriber.next(<T>_events[i]);
-      }
-    } else {
-      for (let i = 0; i < len && !subscriber.closed; i++) {
-        subscriber.next((<ReplayEvent<T>>_events[i]).value);
-      }
-    }
-
-    if (this.hasError) {
-      subscriber.error(this.thrownError);
-    } else if (this.isStopped) {
-      subscriber.complete();
-    }
-
-    return subscription;
-  }
-
-  _getNow(): number {
-    return (this.scheduler || queue).now();
-  }
-
-  private _trimBufferThenGetEvents(): ReplayEvent<T>[] {
-    const now = this._getNow();
-    const _bufferSize = this._bufferSize;
-    const _windowTime = this._windowTime;
-    const _events = <ReplayEvent<T>[]>this._events;
-
-    const eventsCount = _events.length;
-    let spliceCount = 0;
-
-    // Trim events that fall out of the time window.
-    // Start at the front of the list. Break early once
-    // we encounter an event that falls within the window.
-    while (spliceCount < eventsCount) {
-      if ((now - _events[spliceCount].time) < _windowTime) {
-        break;
-      }
-      spliceCount++;
-    }
-
-    if (eventsCount > _bufferSize) {
-      spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);
-    }
-
-    if (spliceCount > 0) {
-      _events.splice(0, spliceCount);
-    }
-
-    return _events;
-  }
-
-}
-
-class ReplayEvent<T> {
-  constructor(public time: number, public value: T) {
-  }
-}
diff --git a/node_modules/rxjs/src/internal/Rx.ts b/node_modules/rxjs/src/internal/Rx.ts
deleted file mode 100644
index ee6ef89..0000000
--- a/node_modules/rxjs/src/internal/Rx.ts
+++ /dev/null
@@ -1,228 +0,0 @@
-/* tslint:disable:no-unused-variable */
-// Subject imported before Observable to bypass circular dependency issue since
-// Subject extends Observable and Observable references Subject in it's
-// definition
-export {Subject, AnonymousSubject} from './Subject';
-/* tslint:enable:no-unused-variable */
-export {Observable} from './Observable';
-
-export { config } from './config';
-
-// statics
-/* tslint:disable:no-use-before-declare */
-import 'rxjs-compat/add/observable/bindCallback';
-import 'rxjs-compat/add/observable/bindNodeCallback';
-import 'rxjs-compat/add/observable/combineLatest';
-import 'rxjs-compat/add/observable/concat';
-import 'rxjs-compat/add/observable/defer';
-import 'rxjs-compat/add/observable/empty';
-import 'rxjs-compat/add/observable/forkJoin';
-import 'rxjs-compat/add/observable/from';
-import 'rxjs-compat/add/observable/fromEvent';
-import 'rxjs-compat/add/observable/fromEventPattern';
-import 'rxjs-compat/add/observable/fromPromise';
-import 'rxjs-compat/add/observable/generate';
-import 'rxjs-compat/add/observable/if';
-import 'rxjs-compat/add/observable/interval';
-import 'rxjs-compat/add/observable/merge';
-import 'rxjs-compat/add/observable/race';
-import 'rxjs-compat/add/observable/never';
-import 'rxjs-compat/add/observable/of';
-import 'rxjs-compat/add/observable/onErrorResumeNext';
-import 'rxjs-compat/add/observable/pairs';
-import 'rxjs-compat/add/observable/range';
-import 'rxjs-compat/add/observable/using';
-import 'rxjs-compat/add/observable/throw';
-import 'rxjs-compat/add/observable/timer';
-import 'rxjs-compat/add/observable/zip';
-
-//dom
-import 'rxjs-compat/add/observable/dom/ajax';
-import 'rxjs-compat/add/observable/dom/webSocket';
-
-//internal/operators
-import 'rxjs-compat/add/operator/buffer';
-import 'rxjs-compat/add/operator/bufferCount';
-import 'rxjs-compat/add/operator/bufferTime';
-import 'rxjs-compat/add/operator/bufferToggle';
-import 'rxjs-compat/add/operator/bufferWhen';
-import 'rxjs-compat/add/operator/catch';
-import 'rxjs-compat/add/operator/combineAll';
-import 'rxjs-compat/add/operator/combineLatest';
-import 'rxjs-compat/add/operator/concat';
-import 'rxjs-compat/add/operator/concatAll';
-import 'rxjs-compat/add/operator/concatMap';
-import 'rxjs-compat/add/operator/concatMapTo';
-import 'rxjs-compat/add/operator/count';
-import 'rxjs-compat/add/operator/dematerialize';
-import 'rxjs-compat/add/operator/debounce';
-import 'rxjs-compat/add/operator/debounceTime';
-import 'rxjs-compat/add/operator/defaultIfEmpty';
-import 'rxjs-compat/add/operator/delay';
-import 'rxjs-compat/add/operator/delayWhen';
-import 'rxjs-compat/add/operator/distinct';
-import 'rxjs-compat/add/operator/distinctUntilChanged';
-import 'rxjs-compat/add/operator/distinctUntilKeyChanged';
-import 'rxjs-compat/add/operator/do';
-import 'rxjs-compat/add/operator/exhaust';
-import 'rxjs-compat/add/operator/exhaustMap';
-import 'rxjs-compat/add/operator/expand';
-import 'rxjs-compat/add/operator/elementAt';
-import 'rxjs-compat/add/operator/filter';
-import 'rxjs-compat/add/operator/finally';
-import 'rxjs-compat/add/operator/find';
-import 'rxjs-compat/add/operator/findIndex';
-import 'rxjs-compat/add/operator/first';
-import 'rxjs-compat/add/operator/groupBy';
-import 'rxjs-compat/add/operator/ignoreElements';
-import 'rxjs-compat/add/operator/isEmpty';
-import 'rxjs-compat/add/operator/audit';
-import 'rxjs-compat/add/operator/auditTime';
-import 'rxjs-compat/add/operator/last';
-import 'rxjs-compat/add/operator/let';
-import 'rxjs-compat/add/operator/every';
-import 'rxjs-compat/add/operator/map';
-import 'rxjs-compat/add/operator/mapTo';
-import 'rxjs-compat/add/operator/materialize';
-import 'rxjs-compat/add/operator/max';
-import 'rxjs-compat/add/operator/merge';
-import 'rxjs-compat/add/operator/mergeAll';
-import 'rxjs-compat/add/operator/mergeMap';
-import 'rxjs-compat/add/operator/mergeMapTo';
-import 'rxjs-compat/add/operator/mergeScan';
-import 'rxjs-compat/add/operator/min';
-import 'rxjs-compat/add/operator/multicast';
-import 'rxjs-compat/add/operator/observeOn';
-import 'rxjs-compat/add/operator/onErrorResumeNext';
-import 'rxjs-compat/add/operator/pairwise';
-import 'rxjs-compat/add/operator/partition';
-import 'rxjs-compat/add/operator/pluck';
-import 'rxjs-compat/add/operator/publish';
-import 'rxjs-compat/add/operator/publishBehavior';
-import 'rxjs-compat/add/operator/publishReplay';
-import 'rxjs-compat/add/operator/publishLast';
-import 'rxjs-compat/add/operator/race';
-import 'rxjs-compat/add/operator/reduce';
-import 'rxjs-compat/add/operator/repeat';
-import 'rxjs-compat/add/operator/repeatWhen';
-import 'rxjs-compat/add/operator/retry';
-import 'rxjs-compat/add/operator/retryWhen';
-import 'rxjs-compat/add/operator/sample';
-import 'rxjs-compat/add/operator/sampleTime';
-import 'rxjs-compat/add/operator/scan';
-import 'rxjs-compat/add/operator/sequenceEqual';
-import 'rxjs-compat/add/operator/share';
-import 'rxjs-compat/add/operator/shareReplay';
-import 'rxjs-compat/add/operator/single';
-import 'rxjs-compat/add/operator/skip';
-import 'rxjs-compat/add/operator/skipLast';
-import 'rxjs-compat/add/operator/skipUntil';
-import 'rxjs-compat/add/operator/skipWhile';
-import 'rxjs-compat/add/operator/startWith';
-import 'rxjs-compat/add/operator/subscribeOn';
-import 'rxjs-compat/add/operator/switch';
-import 'rxjs-compat/add/operator/switchMap';
-import 'rxjs-compat/add/operator/switchMapTo';
-import 'rxjs-compat/add/operator/take';
-import 'rxjs-compat/add/operator/takeLast';
-import 'rxjs-compat/add/operator/takeUntil';
-import 'rxjs-compat/add/operator/takeWhile';
-import 'rxjs-compat/add/operator/throttle';
-import 'rxjs-compat/add/operator/throttleTime';
-import 'rxjs-compat/add/operator/timeInterval';
-import 'rxjs-compat/add/operator/timeout';
-import 'rxjs-compat/add/operator/timeoutWith';
-import 'rxjs-compat/add/operator/timestamp';
-import 'rxjs-compat/add/operator/toArray';
-import 'rxjs-compat/add/operator/toPromise';
-import 'rxjs-compat/add/operator/window';
-import 'rxjs-compat/add/operator/windowCount';
-import 'rxjs-compat/add/operator/windowTime';
-import 'rxjs-compat/add/operator/windowToggle';
-import 'rxjs-compat/add/operator/windowWhen';
-import 'rxjs-compat/add/operator/withLatestFrom';
-import 'rxjs-compat/add/operator/zip';
-import 'rxjs-compat/add/operator/zipAll';
-
-/* tslint:disable:no-unused-variable */
-export {Operator} from './Operator';
-export {Observer} from './types';
-export {Subscription} from './Subscription';
-export {Subscriber} from './Subscriber';
-export {AsyncSubject} from './AsyncSubject';
-export {ReplaySubject} from './ReplaySubject';
-export {BehaviorSubject} from './BehaviorSubject';
-export {ConnectableObservable} from './observable/ConnectableObservable';
-export {Notification, NotificationKind} from './Notification';
-export {EmptyError} from './util/EmptyError';
-export {ArgumentOutOfRangeError} from './util/ArgumentOutOfRangeError';
-export {ObjectUnsubscribedError} from './util/ObjectUnsubscribedError';
-export {TimeoutError} from './util/TimeoutError';
-export {UnsubscriptionError} from './util/UnsubscriptionError';
-export {TimeInterval} from './operators/timeInterval';
-export {Timestamp} from './operators/timestamp';
-export {TestScheduler} from './testing/TestScheduler';
-export {VirtualTimeScheduler} from './scheduler/VirtualTimeScheduler';
-export {AjaxRequest, AjaxResponse, AjaxError, AjaxTimeoutError} from './observable/dom/AjaxObservable';
-export { pipe } from './util/pipe';
-
-import { asap } from './scheduler/asap';
-import { async } from './scheduler/async';
-import { queue } from './scheduler/queue';
-import { animationFrame } from './scheduler/animationFrame';
-import { AsapScheduler } from './scheduler/AsapScheduler';
-import { AsyncScheduler } from './scheduler/AsyncScheduler';
-import { QueueScheduler } from './scheduler/QueueScheduler';
-import { AnimationFrameScheduler } from './scheduler/AnimationFrameScheduler';
-import { rxSubscriber } from './symbol/rxSubscriber';
-import { iterator } from './symbol/iterator';
-import { observable } from './symbol/observable';
-
-import * as _operators from './operators/index';
-
-export const operators = _operators;
-
-/* tslint:enable:no-unused-variable */
-
-/**
- * @typedef {Object} Rx.Scheduler
- * @property {SchedulerLike} asap Schedules on the micro task queue, which is the same
- * queue used for promises. Basically after the current job, but before the next job.
- * Use this for asynchronous conversions.
- * @property {SchedulerLike} queue Schedules on a queue in the current event frame
- * (trampoline scheduler). Use this for iteration operations.
- * @property {SchedulerLike} animationFrame Schedules work with `requestAnimationFrame`.
- * Use this for synchronizing with the platform's painting.
- * @property {SchedulerLike} async Schedules work with `setInterval`. Use this for
- * time-based operations.
- */
-let Scheduler = {
-  asap,
-  queue,
-  animationFrame,
-  async
-};
-
-/**
- * @typedef {Object} Rx.Symbol
- * @property {Symbol|string} rxSubscriber A symbol to use as a property name to
- * retrieve an "Rx safe" Observer from an object. "Rx safety" can be defined as
- * an object that has all of the traits of an Rx Subscriber, including the
- * ability to add and remove subscriptions to the subscription chain and
- * guarantees involving event triggering (can't "next" after unsubscription,
- * etc).
- * @property {Symbol|string} observable A symbol to use as a property name to
- * retrieve an Observable as defined by the [ECMAScript "Observable" spec](https://github.com/zenparsing/es-observable).
- * @property {Symbol|string} iterator The ES6 symbol to use as a property name
- * to retrieve an iterator from an object.
- */
-let Symbol = {
-  rxSubscriber,
-  observable,
-  iterator
-};
-
-export {
-    Scheduler,
-    Symbol
-};
diff --git a/node_modules/rxjs/src/internal/Scheduler.ts b/node_modules/rxjs/src/internal/Scheduler.ts
deleted file mode 100644
index e41e41b..0000000
--- a/node_modules/rxjs/src/internal/Scheduler.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-import { Action } from './scheduler/Action';
-import { Subscription } from './Subscription';
-import { SchedulerLike, SchedulerAction } from './types';
-
-/**
- * An execution context and a data structure to order tasks and schedule their
- * execution. Provides a notion of (potentially virtual) time, through the
- * `now()` getter method.
- *
- * Each unit of work in a Scheduler is called an `Action`.
- *
- * ```ts
- * class Scheduler {
- *   now(): number;
- *   schedule(work, delay?, state?): Subscription;
- * }
- * ```
- *
- * @class Scheduler
- * @deprecated Scheduler is an internal implementation detail of RxJS, and
- * should not be used directly. Rather, create your own class and implement
- * {@link SchedulerLike}
- */
-export class Scheduler implements SchedulerLike {
-
-  /**
-   * Note: the extra arrow function wrapper is to make testing by overriding
-   * Date.now easier.
-   * @nocollapse
-   */
-  public static now: () => number = () => Date.now();
-
-  constructor(private SchedulerAction: typeof Action,
-              now: () => number = Scheduler.now) {
-    this.now = now;
-  }
-
-  /**
-   * A getter method that returns a number representing the current time
-   * (at the time this function was called) according to the scheduler's own
-   * internal clock.
-   * @return {number} A number that represents the current time. May or may not
-   * have a relation to wall-clock time. May or may not refer to a time unit
-   * (e.g. milliseconds).
-   */
-  public now: () => number;
-
-  /**
-   * Schedules a function, `work`, for execution. May happen at some point in
-   * the future, according to the `delay` parameter, if specified. May be passed
-   * some context object, `state`, which will be passed to the `work` function.
-   *
-   * The given arguments will be processed an stored as an Action object in a
-   * queue of actions.
-   *
-   * @param {function(state: ?T): ?Subscription} work A function representing a
-   * task, or some unit of work to be executed by the Scheduler.
-   * @param {number} [delay] Time to wait before executing the work, where the
-   * time unit is implicit and defined by the Scheduler itself.
-   * @param {T} [state] Some contextual data that the `work` function uses when
-   * called by the Scheduler.
-   * @return {Subscription} A subscription in order to be able to unsubscribe
-   * the scheduled work.
-   */
-  public schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay: number = 0, state?: T): Subscription {
-    return new this.SchedulerAction<T>(this, work).schedule(state, delay);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/Subject.ts b/node_modules/rxjs/src/internal/Subject.ts
deleted file mode 100644
index d5b4734..0000000
--- a/node_modules/rxjs/src/internal/Subject.ts
+++ /dev/null
@@ -1,188 +0,0 @@
-import { Operator } from './Operator';
-import { Observable } from './Observable';
-import { Subscriber } from './Subscriber';
-import { Subscription } from './Subscription';
-import { Observer, SubscriptionLike, TeardownLogic } from './types';
-import { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';
-import { SubjectSubscription } from './SubjectSubscription';
-import { rxSubscriber as rxSubscriberSymbol } from '../internal/symbol/rxSubscriber';
-
-/**
- * @class SubjectSubscriber<T>
- */
-export class SubjectSubscriber<T> extends Subscriber<T> {
-  constructor(protected destination: Subject<T>) {
-    super(destination);
-  }
-}
-
-/**
- * A Subject is a special type of Observable that allows values to be
- * multicasted to many Observers. Subjects are like EventEmitters.
- *
- * Every Subject is an Observable and an Observer. You can subscribe to a
- * Subject, and you can call next to feed values as well as error and complete.
- *
- * @class Subject<T>
- */
-export class Subject<T> extends Observable<T> implements SubscriptionLike {
-
-  [rxSubscriberSymbol]() {
-    return new SubjectSubscriber(this);
-  }
-
-  observers: Observer<T>[] = [];
-
-  closed = false;
-
-  isStopped = false;
-
-  hasError = false;
-
-  thrownError: any = null;
-
-  constructor() {
-    super();
-  }
-
-  /**@nocollapse
-   * @deprecated use new Subject() instead
-  */
-  static create: Function = <T>(destination: Observer<T>, source: Observable<T>): AnonymousSubject<T> => {
-    return new AnonymousSubject<T>(destination, source);
-  }
-
-  lift<R>(operator: Operator<T, R>): Observable<R> {
-    const subject = new AnonymousSubject(this, this);
-    subject.operator = <any>operator;
-    return <any>subject;
-  }
-
-  next(value?: T) {
-    if (this.closed) {
-      throw new ObjectUnsubscribedError();
-    }
-    if (!this.isStopped) {
-      const { observers } = this;
-      const len = observers.length;
-      const copy = observers.slice();
-      for (let i = 0; i < len; i++) {
-        copy[i].next(value);
-      }
-    }
-  }
-
-  error(err: any) {
-    if (this.closed) {
-      throw new ObjectUnsubscribedError();
-    }
-    this.hasError = true;
-    this.thrownError = err;
-    this.isStopped = true;
-    const { observers } = this;
-    const len = observers.length;
-    const copy = observers.slice();
-    for (let i = 0; i < len; i++) {
-      copy[i].error(err);
-    }
-    this.observers.length = 0;
-  }
-
-  complete() {
-    if (this.closed) {
-      throw new ObjectUnsubscribedError();
-    }
-    this.isStopped = true;
-    const { observers } = this;
-    const len = observers.length;
-    const copy = observers.slice();
-    for (let i = 0; i < len; i++) {
-      copy[i].complete();
-    }
-    this.observers.length = 0;
-  }
-
-  unsubscribe() {
-    this.isStopped = true;
-    this.closed = true;
-    this.observers = null;
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _trySubscribe(subscriber: Subscriber<T>): TeardownLogic {
-    if (this.closed) {
-      throw new ObjectUnsubscribedError();
-    } else {
-      return super._trySubscribe(subscriber);
-    }
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<T>): Subscription {
-    if (this.closed) {
-      throw new ObjectUnsubscribedError();
-    } else if (this.hasError) {
-      subscriber.error(this.thrownError);
-      return Subscription.EMPTY;
-    } else if (this.isStopped) {
-      subscriber.complete();
-      return Subscription.EMPTY;
-    } else {
-      this.observers.push(subscriber);
-      return new SubjectSubscription(this, subscriber);
-    }
-  }
-
-  /**
-   * Creates a new Observable with this Subject as the source. You can do this
-   * to create customize Observer-side logic of the Subject and conceal it from
-   * code that uses the Observable.
-   * @return {Observable} Observable that the Subject casts to
-   */
-  asObservable(): Observable<T> {
-    const observable = new Observable<T>();
-    (<any>observable).source = this;
-    return observable;
-  }
-}
-
-/**
- * @class AnonymousSubject<T>
- */
-export class AnonymousSubject<T> extends Subject<T> {
-  constructor(protected destination?: Observer<T>, source?: Observable<T>) {
-    super();
-    this.source = source;
-  }
-
-  next(value: T) {
-    const { destination } = this;
-    if (destination && destination.next) {
-      destination.next(value);
-    }
-  }
-
-  error(err: any) {
-    const { destination } = this;
-    if (destination && destination.error) {
-      this.destination.error(err);
-    }
-  }
-
-  complete() {
-    const { destination } = this;
-    if (destination && destination.complete) {
-      this.destination.complete();
-    }
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<T>): Subscription {
-    const { source } = this;
-    if (source) {
-      return this.source.subscribe(subscriber);
-    } else {
-      return Subscription.EMPTY;
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/SubjectSubscription.ts b/node_modules/rxjs/src/internal/SubjectSubscription.ts
deleted file mode 100644
index 99af066..0000000
--- a/node_modules/rxjs/src/internal/SubjectSubscription.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import { Subject } from './Subject';
-import { Observer } from './types';
-import { Subscription } from './Subscription';
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class SubjectSubscription<T> extends Subscription {
-  closed: boolean = false;
-
-  constructor(public subject: Subject<T>, public subscriber: Observer<T>) {
-    super();
-  }
-
-  unsubscribe() {
-    if (this.closed) {
-      return;
-    }
-
-    this.closed = true;
-
-    const subject = this.subject;
-    const observers = subject.observers;
-
-    this.subject = null;
-
-    if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
-      return;
-    }
-
-    const subscriberIndex = observers.indexOf(this.subscriber);
-
-    if (subscriberIndex !== -1) {
-      observers.splice(subscriberIndex, 1);
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/Subscriber.ts b/node_modules/rxjs/src/internal/Subscriber.ts
deleted file mode 100644
index 4e65584..0000000
--- a/node_modules/rxjs/src/internal/Subscriber.ts
+++ /dev/null
@@ -1,302 +0,0 @@
-import { isFunction } from './util/isFunction';
-import { empty as emptyObserver } from './Observer';
-import { Observer, PartialObserver, TeardownLogic } from './types';
-import { Subscription } from './Subscription';
-import { rxSubscriber as rxSubscriberSymbol } from '../internal/symbol/rxSubscriber';
-import { config } from './config';
-import { hostReportError } from './util/hostReportError';
-
-/**
- * Implements the {@link Observer} interface and extends the
- * {@link Subscription} class. While the {@link Observer} is the public API for
- * consuming the values of an {@link Observable}, all Observers get converted to
- * a Subscriber, in order to provide Subscription-like capabilities such as
- * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for
- * implementing operators, but it is rarely used as a public API.
- *
- * @class Subscriber<T>
- */
-export class Subscriber<T> extends Subscription implements Observer<T> {
-
-  [rxSubscriberSymbol]() { return this; }
-
-  /**
-   * A static factory for a Subscriber, given a (potentially partial) definition
-   * of an Observer.
-   * @param {function(x: ?T): void} [next] The `next` callback of an Observer.
-   * @param {function(e: ?any): void} [error] The `error` callback of an
-   * Observer.
-   * @param {function(): void} [complete] The `complete` callback of an
-   * Observer.
-   * @return {Subscriber<T>} A Subscriber wrapping the (partially defined)
-   * Observer represented by the given arguments.
-   * @nocollapse
-   */
-  static create<T>(next?: (x?: T) => void,
-                   error?: (e?: any) => void,
-                   complete?: () => void): Subscriber<T> {
-    const subscriber = new Subscriber(next, error, complete);
-    subscriber.syncErrorThrowable = false;
-    return subscriber;
-  }
-
-  /** @internal */ syncErrorValue: any = null;
-  /** @internal */ syncErrorThrown: boolean = false;
-  /** @internal */ syncErrorThrowable: boolean = false;
-
-  protected isStopped: boolean = false;
-  protected destination: PartialObserver<any> | Subscriber<any>; // this `any` is the escape hatch to erase extra type param (e.g. R)
-
-  /**
-   * @param {Observer|function(value: T): void} [destinationOrNext] A partially
-   * defined Observer or a `next` callback function.
-   * @param {function(e: ?any): void} [error] The `error` callback of an
-   * Observer.
-   * @param {function(): void} [complete] The `complete` callback of an
-   * Observer.
-   */
-  constructor(destinationOrNext?: PartialObserver<any> | ((value: T) => void),
-              error?: (e?: any) => void,
-              complete?: () => void) {
-    super();
-
-    switch (arguments.length) {
-      case 0:
-        this.destination = emptyObserver;
-        break;
-      case 1:
-        if (!destinationOrNext) {
-          this.destination = emptyObserver;
-          break;
-        }
-        if (typeof destinationOrNext === 'object') {
-          if (destinationOrNext instanceof Subscriber) {
-            this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;
-            this.destination = destinationOrNext;
-            destinationOrNext.add(this);
-          } else {
-            this.syncErrorThrowable = true;
-            this.destination = new SafeSubscriber<T>(this, <PartialObserver<any>> destinationOrNext);
-          }
-          break;
-        }
-      default:
-        this.syncErrorThrowable = true;
-        this.destination = new SafeSubscriber<T>(this, <((value: T) => void)> destinationOrNext, error, complete);
-        break;
-    }
-  }
-
-  /**
-   * The {@link Observer} callback to receive notifications of type `next` from
-   * the Observable, with a value. The Observable may call this method 0 or more
-   * times.
-   * @param {T} [value] The `next` value.
-   * @return {void}
-   */
-  next(value?: T): void {
-    if (!this.isStopped) {
-      this._next(value);
-    }
-  }
-
-  /**
-   * The {@link Observer} callback to receive notifications of type `error` from
-   * the Observable, with an attached `Error`. Notifies the Observer that
-   * the Observable has experienced an error condition.
-   * @param {any} [err] The `error` exception.
-   * @return {void}
-   */
-  error(err?: any): void {
-    if (!this.isStopped) {
-      this.isStopped = true;
-      this._error(err);
-    }
-  }
-
-  /**
-   * The {@link Observer} callback to receive a valueless notification of type
-   * `complete` from the Observable. Notifies the Observer that the Observable
-   * has finished sending push-based notifications.
-   * @return {void}
-   */
-  complete(): void {
-    if (!this.isStopped) {
-      this.isStopped = true;
-      this._complete();
-    }
-  }
-
-  unsubscribe(): void {
-    if (this.closed) {
-      return;
-    }
-    this.isStopped = true;
-    super.unsubscribe();
-  }
-
-  protected _next(value: T): void {
-    this.destination.next(value);
-  }
-
-  protected _error(err: any): void {
-    this.destination.error(err);
-    this.unsubscribe();
-  }
-
-  protected _complete(): void {
-    this.destination.complete();
-    this.unsubscribe();
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _unsubscribeAndRecycle(): Subscriber<T> {
-    const {  _parentOrParents } = this;
-    this._parentOrParents = null;
-    this.unsubscribe();
-    this.closed = false;
-    this.isStopped = false;
-    this._parentOrParents = _parentOrParents;
-    return this;
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class SafeSubscriber<T> extends Subscriber<T> {
-
-  private _context: any;
-
-  constructor(private _parentSubscriber: Subscriber<T>,
-              observerOrNext?: PartialObserver<T> | ((value: T) => void),
-              error?: (e?: any) => void,
-              complete?: () => void) {
-    super();
-
-    let next: ((value: T) => void);
-    let context: any = this;
-
-    if (isFunction(observerOrNext)) {
-      next = (<((value: T) => void)> observerOrNext);
-    } else if (observerOrNext) {
-      next = (<PartialObserver<T>> observerOrNext).next;
-      error = (<PartialObserver<T>> observerOrNext).error;
-      complete = (<PartialObserver<T>> observerOrNext).complete;
-      if (observerOrNext !== emptyObserver) {
-        context = Object.create(observerOrNext);
-        if (isFunction(context.unsubscribe)) {
-          this.add(<() => void> context.unsubscribe.bind(context));
-        }
-        context.unsubscribe = this.unsubscribe.bind(this);
-      }
-    }
-
-    this._context = context;
-    this._next = next;
-    this._error = error;
-    this._complete = complete;
-  }
-
-  next(value?: T): void {
-    if (!this.isStopped && this._next) {
-      const { _parentSubscriber } = this;
-      if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-        this.__tryOrUnsub(this._next, value);
-      } else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
-        this.unsubscribe();
-      }
-    }
-  }
-
-  error(err?: any): void {
-    if (!this.isStopped) {
-      const { _parentSubscriber } = this;
-      const { useDeprecatedSynchronousErrorHandling } = config;
-      if (this._error) {
-        if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-          this.__tryOrUnsub(this._error, err);
-          this.unsubscribe();
-        } else {
-          this.__tryOrSetError(_parentSubscriber, this._error, err);
-          this.unsubscribe();
-        }
-      } else if (!_parentSubscriber.syncErrorThrowable) {
-        this.unsubscribe();
-        if (useDeprecatedSynchronousErrorHandling) {
-          throw err;
-        }
-        hostReportError(err);
-      } else {
-        if (useDeprecatedSynchronousErrorHandling) {
-          _parentSubscriber.syncErrorValue = err;
-          _parentSubscriber.syncErrorThrown = true;
-        } else {
-          hostReportError(err);
-        }
-        this.unsubscribe();
-      }
-    }
-  }
-
-  complete(): void {
-    if (!this.isStopped) {
-      const { _parentSubscriber } = this;
-      if (this._complete) {
-        const wrappedComplete = () => this._complete.call(this._context);
-
-        if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-          this.__tryOrUnsub(wrappedComplete);
-          this.unsubscribe();
-        } else {
-          this.__tryOrSetError(_parentSubscriber, wrappedComplete);
-          this.unsubscribe();
-        }
-      } else {
-        this.unsubscribe();
-      }
-    }
-  }
-
-  private __tryOrUnsub(fn: Function, value?: any): void {
-    try {
-      fn.call(this._context, value);
-    } catch (err) {
-      this.unsubscribe();
-      if (config.useDeprecatedSynchronousErrorHandling) {
-        throw err;
-      } else {
-        hostReportError(err);
-      }
-    }
-  }
-
-  private __tryOrSetError(parent: Subscriber<T>, fn: Function, value?: any): boolean {
-    if (!config.useDeprecatedSynchronousErrorHandling) {
-      throw new Error('bad call');
-    }
-    try {
-      fn.call(this._context, value);
-    } catch (err) {
-      if (config.useDeprecatedSynchronousErrorHandling) {
-        parent.syncErrorValue = err;
-        parent.syncErrorThrown = true;
-        return true;
-      } else {
-        hostReportError(err);
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /** @internal This is an internal implementation detail, do not use. */
-  _unsubscribe(): void {
-    const { _parentSubscriber } = this;
-    this._context = null;
-    this._parentSubscriber = null;
-    _parentSubscriber.unsubscribe();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/Subscription.ts b/node_modules/rxjs/src/internal/Subscription.ts
deleted file mode 100644
index 1a07ffa..0000000
--- a/node_modules/rxjs/src/internal/Subscription.ts
+++ /dev/null
@@ -1,211 +0,0 @@
-import { isArray } from './util/isArray';
-import { isObject } from './util/isObject';
-import { isFunction } from './util/isFunction';
-import { UnsubscriptionError } from './util/UnsubscriptionError';
-import { SubscriptionLike, TeardownLogic } from './types';
-
-/**
- * Represents a disposable resource, such as the execution of an Observable. A
- * Subscription has one important method, `unsubscribe`, that takes no argument
- * and just disposes the resource held by the subscription.
- *
- * Additionally, subscriptions may be grouped together through the `add()`
- * method, which will attach a child Subscription to the current Subscription.
- * When a Subscription is unsubscribed, all its children (and its grandchildren)
- * will be unsubscribed as well.
- *
- * @class Subscription
- */
-export class Subscription implements SubscriptionLike {
-  /** @nocollapse */
-  public static EMPTY: Subscription = (function(empty: any) {
-    empty.closed = true;
-    return empty;
-  }(new Subscription()));
-
-  /**
-   * A flag to indicate whether this Subscription has already been unsubscribed.
-   * @type {boolean}
-   */
-  public closed: boolean = false;
-
-  /** @internal */
-  protected _parentOrParents: Subscription | Subscription[] = null;
-  /** @internal */
-  private _subscriptions: SubscriptionLike[] = null;
-
-  /**
-   * @param {function(): void} [unsubscribe] A function describing how to
-   * perform the disposal of resources when the `unsubscribe` method is called.
-   */
-  constructor(unsubscribe?: () => void) {
-    if (unsubscribe) {
-      (<any> this)._unsubscribe = unsubscribe;
-    }
-  }
-
-  /**
-   * Disposes the resources held by the subscription. May, for instance, cancel
-   * an ongoing Observable execution or cancel any other type of work that
-   * started when the Subscription was created.
-   * @return {void}
-   */
-  unsubscribe(): void {
-    let errors: any[];
-
-    if (this.closed) {
-      return;
-    }
-
-    let { _parentOrParents, _unsubscribe, _subscriptions } = (<any> this);
-
-    this.closed = true;
-    this._parentOrParents = null;
-    // null out _subscriptions first so any child subscriptions that attempt
-    // to remove themselves from this subscription will noop
-    this._subscriptions = null;
-
-    if (_parentOrParents instanceof Subscription) {
-      _parentOrParents.remove(this);
-    } else if (_parentOrParents !== null) {
-      for (let index = 0; index < _parentOrParents.length; ++index) {
-        const parent = _parentOrParents[index];
-        parent.remove(this);
-      }
-    }
-
-    if (isFunction(_unsubscribe)) {
-      try {
-        _unsubscribe.call(this);
-      } catch (e) {
-        errors = e instanceof UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];
-      }
-    }
-
-    if (isArray(_subscriptions)) {
-      let index = -1;
-      let len = _subscriptions.length;
-
-      while (++index < len) {
-        const sub = _subscriptions[index];
-        if (isObject(sub)) {
-          try {
-            sub.unsubscribe();
-          } catch (e) {
-            errors = errors || [];
-            if (e instanceof UnsubscriptionError) {
-              errors = errors.concat(flattenUnsubscriptionErrors(e.errors));
-            } else {
-              errors.push(e);
-            }
-          }
-        }
-      }
-    }
-
-    if (errors) {
-      throw new UnsubscriptionError(errors);
-    }
-  }
-
-  /**
-   * Adds a tear down to be called during the unsubscribe() of this
-   * Subscription. Can also be used to add a child subscription.
-   *
-   * If the tear down being added is a subscription that is already
-   * unsubscribed, is the same reference `add` is being called on, or is
-   * `Subscription.EMPTY`, it will not be added.
-   *
-   * If this subscription is already in an `closed` state, the passed
-   * tear down logic will be executed immediately.
-   *
-   * When a parent subscription is unsubscribed, any child subscriptions that were added to it are also unsubscribed.
-   *
-   * @param {TeardownLogic} teardown The additional logic to execute on
-   * teardown.
-   * @return {Subscription} Returns the Subscription used or created to be
-   * added to the inner subscriptions list. This Subscription can be used with
-   * `remove()` to remove the passed teardown logic from the inner subscriptions
-   * list.
-   */
-  add(teardown: TeardownLogic): Subscription {
-    let subscription = (<Subscription>teardown);
-
-    if (!(<any>teardown)) {
-      return Subscription.EMPTY;
-    }
-
-    switch (typeof teardown) {
-      case 'function':
-        subscription = new Subscription(<(() => void)>teardown);
-      case 'object':
-        if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {
-          // This also covers the case where `subscription` is `Subscription.EMPTY`, which is always in `closed` state.
-          return subscription;
-        } else if (this.closed) {
-          subscription.unsubscribe();
-          return subscription;
-        } else if (!(subscription instanceof Subscription)) {
-          const tmp = subscription;
-          subscription = new Subscription();
-          subscription._subscriptions = [tmp];
-        }
-        break;
-      default: {
-        throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
-      }
-    }
-
-    // Add `this` as parent of `subscription` if that's not already the case.
-    let { _parentOrParents } = subscription;
-    if (_parentOrParents === null) {
-      // If we don't have a parent, then set `subscription._parents` to
-      // the `this`, which is the common case that we optimize for.
-      subscription._parentOrParents = this;
-    } else if (_parentOrParents instanceof Subscription) {
-      if (_parentOrParents === this) {
-        // The `subscription` already has `this` as a parent.
-        return subscription;
-      }
-      // If there's already one parent, but not multiple, allocate an
-      // Array to store the rest of the parent Subscriptions.
-      subscription._parentOrParents = [_parentOrParents, this];
-    } else if (_parentOrParents.indexOf(this) === -1) {
-      // Only add `this` to the _parentOrParents list if it's not already there.
-      _parentOrParents.push(this);
-    } else {
-      // The `subscription` already has `this` as a parent.
-      return subscription;
-    }
-
-    // Optimize for the common case when adding the first subscription.
-    const subscriptions = this._subscriptions;
-    if (subscriptions === null) {
-      this._subscriptions = [subscription];
-    } else {
-      subscriptions.push(subscription);
-    }
-
-    return subscription;
-  }
-
-  /**
-   * Removes a Subscription from the internal list of subscriptions that will
-   * unsubscribe during the unsubscribe process of this Subscription.
-   * @param {Subscription} subscription The subscription to remove.
-   * @return {void}
-   */
-  remove(subscription: Subscription): void {
-    const subscriptions = this._subscriptions;
-    if (subscriptions) {
-      const subscriptionIndex = subscriptions.indexOf(subscription);
-      if (subscriptionIndex !== -1) {
-        subscriptions.splice(subscriptionIndex, 1);
-      }
-    }
-  }
-}
-
-function flattenUnsubscriptionErrors(errors: any[]) {
- return errors.reduce((errs, err) => errs.concat((err instanceof UnsubscriptionError) ? err.errors : err), []);
-}
diff --git a/node_modules/rxjs/src/internal/config.ts b/node_modules/rxjs/src/internal/config.ts
deleted file mode 100644
index bb38008..0000000
--- a/node_modules/rxjs/src/internal/config.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-let _enable_super_gross_mode_that_will_cause_bad_things = false;
-
-/**
- * The global configuration object for RxJS, used to configure things
- * like what Promise contructor should used to create Promises
- */
-export const config = {
-  /**
-   * The promise constructor used by default for methods such as
-   * {@link toPromise} and {@link forEach}
-   */
-  Promise: undefined as PromiseConstructorLike,
-
-  /**
-   * If true, turns on synchronous error rethrowing, which is a deprecated behavior
-   * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe
-   * call in a try/catch block. It also enables producer interference, a nasty bug
-   * where a multicast can be broken for all observers by a downstream consumer with
-   * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BY TIME
-   * FOR MIGRATION REASONS.
-   */
-  set useDeprecatedSynchronousErrorHandling(value: boolean) {
-    if (value) {
-      const error = new Error();
-      console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack);
-    } else if (_enable_super_gross_mode_that_will_cause_bad_things) {
-      console.log('RxJS: Back to a better error behavior. Thank you. <3');
-    }
-    _enable_super_gross_mode_that_will_cause_bad_things = value;
-  },
-
-  get useDeprecatedSynchronousErrorHandling() {
-    return _enable_super_gross_mode_that_will_cause_bad_things;
-  },
-};
diff --git a/node_modules/rxjs/src/internal/observable/ConnectableObservable.ts b/node_modules/rxjs/src/internal/observable/ConnectableObservable.ts
deleted file mode 100644
index 4e7ffbf..0000000
--- a/node_modules/rxjs/src/internal/observable/ConnectableObservable.ts
+++ /dev/null
@@ -1,182 +0,0 @@
-import { Subject, SubjectSubscriber } from '../Subject';
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { TeardownLogic } from '../types';
-import { refCount as higherOrderRefCount } from '../operators/refCount';
-
-/**
- * @class ConnectableObservable<T>
- */
-export class ConnectableObservable<T> extends Observable<T> {
-
-  protected _subject: Subject<T>;
-  protected _refCount: number = 0;
-  protected _connection: Subscription;
-  /** @internal */
-  _isComplete = false;
-
-  constructor(public source: Observable<T>,
-              protected subjectFactory: () => Subject<T>) {
-    super();
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<T>) {
-    return this.getSubject().subscribe(subscriber);
-  }
-
-  protected getSubject(): Subject<T> {
-    const subject = this._subject;
-    if (!subject || subject.isStopped) {
-      this._subject = this.subjectFactory();
-    }
-    return this._subject;
-  }
-
-  connect(): Subscription {
-    let connection = this._connection;
-    if (!connection) {
-      this._isComplete = false;
-      connection = this._connection = new Subscription();
-      connection.add(this.source
-        .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
-      if (connection.closed) {
-        this._connection = null;
-        connection = Subscription.EMPTY;
-      }
-    }
-    return connection;
-  }
-
-  refCount(): Observable<T> {
-    return higherOrderRefCount()(this) as Observable<T>;
-  }
-}
-
-export const connectableObservableDescriptor: PropertyDescriptorMap = (() => {
-  const connectableProto = <any>ConnectableObservable.prototype;
-  return {
-    operator: { value: null as null },
-    _refCount: { value: 0, writable: true },
-    _subject: { value: null as null, writable: true },
-    _connection: { value: null as null, writable: true },
-    _subscribe: { value: connectableProto._subscribe },
-    _isComplete: { value: connectableProto._isComplete, writable: true },
-    getSubject: { value: connectableProto.getSubject },
-    connect: { value: connectableProto.connect },
-    refCount: { value: connectableProto.refCount }
-  };
-})();
-
-class ConnectableSubscriber<T> extends SubjectSubscriber<T> {
-  constructor(destination: Subject<T>,
-              private connectable: ConnectableObservable<T>) {
-    super(destination);
-  }
-  protected _error(err: any): void {
-    this._unsubscribe();
-    super._error(err);
-  }
-  protected _complete(): void {
-    this.connectable._isComplete = true;
-    this._unsubscribe();
-    super._complete();
-  }
-  protected _unsubscribe() {
-    const connectable = <any>this.connectable;
-    if (connectable) {
-      this.connectable = null;
-      const connection = connectable._connection;
-      connectable._refCount = 0;
-      connectable._subject = null;
-      connectable._connection = null;
-      if (connection) {
-        connection.unsubscribe();
-      }
-    }
-  }
-}
-
-class RefCountOperator<T> implements Operator<T, T> {
-  constructor(private connectable: ConnectableObservable<T>) {
-  }
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-
-    const { connectable } = this;
-    (<any> connectable)._refCount++;
-
-    const refCounter = new RefCountSubscriber(subscriber, connectable);
-    const subscription = source.subscribe(refCounter);
-
-    if (!refCounter.closed) {
-      (<any> refCounter).connection = connectable.connect();
-    }
-
-    return subscription;
-  }
-}
-
-class RefCountSubscriber<T> extends Subscriber<T> {
-
-  private connection: Subscription;
-
-  constructor(destination: Subscriber<T>,
-              private connectable: ConnectableObservable<T>) {
-    super(destination);
-  }
-
-  protected _unsubscribe() {
-
-    const { connectable } = this;
-    if (!connectable) {
-      this.connection = null;
-      return;
-    }
-
-    this.connectable = null;
-    const refCount = (<any> connectable)._refCount;
-    if (refCount <= 0) {
-      this.connection = null;
-      return;
-    }
-
-    (<any> connectable)._refCount = refCount - 1;
-    if (refCount > 1) {
-      this.connection = null;
-      return;
-    }
-
-    ///
-    // Compare the local RefCountSubscriber's connection Subscription to the
-    // connection Subscription on the shared ConnectableObservable. In cases
-    // where the ConnectableObservable source synchronously emits values, and
-    // the RefCountSubscriber's downstream Observers synchronously unsubscribe,
-    // execution continues to here before the RefCountOperator has a chance to
-    // supply the RefCountSubscriber with the shared connection Subscription.
-    // For example:
-    // ```
-    // range(0, 10).pipe(
-    //   publish(),
-    //   refCount(),
-    //   take(5),
-    // ).subscribe();
-    // ```
-    // In order to account for this case, RefCountSubscriber should only dispose
-    // the ConnectableObservable's shared connection Subscription if the
-    // connection Subscription exists, *and* either:
-    //   a. RefCountSubscriber doesn't have a reference to the shared connection
-    //      Subscription yet, or,
-    //   b. RefCountSubscriber's connection Subscription reference is identical
-    //      to the shared connection Subscription
-    ///
-    const { connection } = this;
-    const sharedConnection = (<any> connectable)._connection;
-    this.connection = null;
-
-    if (sharedConnection && (!connection || sharedConnection === connection)) {
-      sharedConnection.unsubscribe();
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/observable/SubscribeOnObservable.ts b/node_modules/rxjs/src/internal/observable/SubscribeOnObservable.ts
deleted file mode 100644
index d66e3b1..0000000
--- a/node_modules/rxjs/src/internal/observable/SubscribeOnObservable.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { SchedulerLike, SchedulerAction } from '../types';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { Observable } from '../Observable';
-import { asap } from '../scheduler/asap';
-import { isNumeric } from '../util/isNumeric';
-
-export interface DispatchArg<T> {
-  source: Observable<T>;
-  subscriber: Subscriber<T>;
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-export class SubscribeOnObservable<T> extends Observable<T> {
-  /** @nocollapse */
-  static create<T>(source: Observable<T>, delay: number = 0, scheduler: SchedulerLike = asap): Observable<T> {
-    return new SubscribeOnObservable(source, delay, scheduler);
-  }
-
-  /** @nocollapse */
-  static dispatch<T>(this: SchedulerAction<T>, arg: DispatchArg<T>): Subscription {
-    const { source, subscriber } = arg;
-    return this.add(source.subscribe(subscriber));
-  }
-
-  constructor(public source: Observable<T>,
-              private delayTime: number = 0,
-              private scheduler: SchedulerLike = asap) {
-    super();
-    if (!isNumeric(delayTime) || delayTime < 0) {
-      this.delayTime = 0;
-    }
-    if (!scheduler || typeof scheduler.schedule !== 'function') {
-      this.scheduler = asap;
-    }
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<T>) {
-    const delay = this.delayTime;
-    const source = this.source;
-    const scheduler = this.scheduler;
-
-    return scheduler.schedule<DispatchArg<any>>(SubscribeOnObservable.dispatch, delay, {
-      source, subscriber
-    });
-  }
-}
diff --git a/node_modules/rxjs/src/internal/observable/bindCallback.ts b/node_modules/rxjs/src/internal/observable/bindCallback.ts
deleted file mode 100644
index b48801d..0000000
--- a/node_modules/rxjs/src/internal/observable/bindCallback.ts
+++ /dev/null
@@ -1,290 +0,0 @@
-import { SchedulerLike, SchedulerAction } from '../types';
-import { Observable } from '../Observable';
-import { AsyncSubject } from '../AsyncSubject';
-import { Subscriber } from '../Subscriber';
-import { map } from '../operators/map';
-import { canReportError } from '../util/canReportError';
-import { isArray } from '../util/isArray';
-import { isScheduler } from '../util/isScheduler';
-
-// tslint:disable:max-line-length
-/** @deprecated resultSelector is no longer supported, use a mapping function. */
-export function bindCallback(callbackFunc: Function, resultSelector: Function, scheduler?: SchedulerLike): (...args: any[]) => Observable<any>;
-
-export function bindCallback<R1, R2, R3, R4>(callbackFunc: (callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): () => Observable<any[]>;
-export function bindCallback<R1, R2, R3>(callbackFunc: (callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): () => Observable<[R1, R2, R3]>;
-export function bindCallback<R1, R2>(callbackFunc: (callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): () => Observable<[R1, R2]>;
-export function bindCallback<R1>(callbackFunc: (callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): () => Observable<R1>;
-export function bindCallback(callbackFunc: (callback: () => any) => any, scheduler?: SchedulerLike): () => Observable<void>;
-
-export function bindCallback<A1, R1, R2, R3, R4>(callbackFunc: (arg1: A1, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<any[]>;
-export function bindCallback<A1, R1, R2, R3>(callbackFunc: (arg1: A1, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<[R1, R2, R3]>;
-export function bindCallback<A1, R1, R2>(callbackFunc: (arg1: A1, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<[R1, R2]>;
-export function bindCallback<A1, R1>(callbackFunc: (arg1: A1, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<R1>;
-export function bindCallback<A1>(callbackFunc: (arg1: A1, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<void>;
-
-export function bindCallback<A1, A2, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<any[]>;
-export function bindCallback<A1, A2, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<[R1, R2, R3]>;
-export function bindCallback<A1, A2, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<[R1, R2]>;
-export function bindCallback<A1, A2, R1>(callbackFunc: (arg1: A1, arg2: A2, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<R1>;
-export function bindCallback<A1, A2>(callbackFunc: (arg1: A1, arg2: A2, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<void>;
-
-export function bindCallback<A1, A2, A3, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<any[]>;
-export function bindCallback<A1, A2, A3, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<[R1, R2, R3]>;
-export function bindCallback<A1, A2, A3, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<[R1, R2]>;
-export function bindCallback<A1, A2, A3, R1>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<R1>;
-export function bindCallback<A1, A2, A3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<void>;
-
-export function bindCallback<A1, A2, A3, A4, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<any[]>;
-export function bindCallback<A1, A2, A3, A4, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<[R1, R2, R3]>;
-export function bindCallback<A1, A2, A3, A4, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<[R1, R2]>;
-export function bindCallback<A1, A2, A3, A4, R1>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<R1>;
-export function bindCallback<A1, A2, A3, A4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<void>;
-
-export function bindCallback<A1, A2, A3, A4, A5, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<any[]>;
-export function bindCallback<A1, A2, A3, A4, A5, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<[R1, R2, R3]>;
-export function bindCallback<A1, A2, A3, A4, A5, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<[R1, R2]>;
-export function bindCallback<A1, A2, A3, A4, A5, R1>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<R1>;
-export function bindCallback<A1, A2, A3, A4, A5>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<void>;
-
-export function bindCallback<A, R>(callbackFunc: (...args: Array<A | ((result: R) => any)>) => any, scheduler?: SchedulerLike): (...args: A[]) => Observable<R>;
-export function bindCallback<A, R>(callbackFunc: (...args: Array<A | ((...results: R[]) => any)>) => any, scheduler?: SchedulerLike): (...args: A[]) => Observable<R[]>;
-
-export function bindCallback(callbackFunc: Function, scheduler?: SchedulerLike): (...args: any[]) => Observable<any>;
-
-// tslint:enable:max-line-length
-
-/**
- * Converts a callback API to a function that returns an Observable.
- *
- * <span class="informal">Give it a function `f` of type `f(x, callback)` and
- * it will return a function `g` that when called as `g(x)` will output an
- * Observable.</span>
- *
- * `bindCallback` is not an operator because its input and output are not
- * Observables. The input is a function `func` with some parameters. The
- * last parameter must be a callback function that `func` calls when it is
- * done.
- *
- * The output of `bindCallback` is a function that takes the same parameters
- * as `func`, except the last one (the callback). When the output function
- * is called with arguments it will return an Observable. If function `func`
- * calls its callback with one argument, the Observable will emit that value.
- * If on the other hand the callback is called with multiple values the resulting
- * Observable will emit an array with said values as arguments.
- *
- * It is **very important** to remember that input function `func` is not called
- * when the output function is, but rather when the Observable returned by the output
- * function is subscribed. This means if `func` makes an AJAX request, that request
- * will be made every time someone subscribes to the resulting Observable, but not before.
- *
- * The last optional parameter - `scheduler` - can be used to control when the call
- * to `func` happens after someone subscribes to Observable, as well as when results
- * passed to callback will be emitted. By default, the subscription to an Observable calls `func`
- * synchronously, but using {@link asyncScheduler} as the last parameter will defer the call to `func`,
- * just like wrapping the call in `setTimeout` with a timeout of `0` would. If you were to use the async Scheduler
- * and call `subscribe` on the output Observable, all function calls that are currently executing
- * will end before `func` is invoked.
- *
- * By default, results passed to the callback are emitted immediately after `func` invokes the callback.
- * In particular, if the callback is called synchronously, then the subscription of the resulting Observable
- * will call the `next` function synchronously as well.  If you want to defer that call,
- * you may use {@link asyncScheduler} just as before.  This means that by using `Scheduler.async` you can
- * ensure that `func` always calls its callback asynchronously, thus avoiding terrifying Zalgo.
- *
- * Note that the Observable created by the output function will always emit a single value
- * and then complete immediately. If `func` calls the callback multiple times, values from subsequent
- * calls will not appear in the stream. If you need to listen for multiple calls,
- *  you probably want to use {@link fromEvent} or {@link fromEventPattern} instead.
- *
- * If `func` depends on some context (`this` property) and is not already bound, the context of `func`
- * will be the context that the output function has at call time. In particular, if `func`
- * is called as a method of some objec and if `func` is not already bound, in order to preserve the context
- * it is recommended that the context of the output function is set to that object as well.
- *
- * If the input function calls its callback in the "node style" (i.e. first argument to callback is
- * optional error parameter signaling whether the call failed or not), {@link bindNodeCallback}
- * provides convenient error handling and probably is a better choice.
- * `bindCallback` will treat such functions the same as any other and error parameters
- * (whether passed or not) will always be interpreted as regular callback argument.
- *
- * ## Examples
- *
- * ### Convert jQuery's getJSON to an Observable API
- * ```ts
- * import { bindCallback } from 'rxjs';
- * import * as jQuery from 'jquery';
- *
- * // Suppose we have jQuery.getJSON('/my/url', callback)
- * const getJSONAsObservable = bindCallback(jQuery.getJSON);
- * const result = getJSONAsObservable('/my/url');
- * result.subscribe(x => console.log(x), e => console.error(e));
- * ```
- *
- * ### Receive an array of arguments passed to a callback
- * ```ts
- * import { bindCallback } from 'rxjs';
- *
- * const someFunction = (a, b, c) => {
- *   console.log(a); // 5
- *   console.log(b); // 'some string'
- *   console.log(c); // {someProperty: 'someValue'}
- * };
- *
- * const boundSomeFunction = bindCallback(someFunction);
- * boundSomeFunction().subscribe(values => {
- *   console.log(values) // [5, 'some string', {someProperty: 'someValue'}]
- * });
- * ```
- *
- * ### Compare behaviour with and without async Scheduler
- * ```ts
- * import { bindCallback } from 'rxjs';
- *
- * function iCallMyCallbackSynchronously(cb) {
- *   cb();
- * }
- *
- * const boundSyncFn = bindCallback(iCallMyCallbackSynchronously);
- * const boundAsyncFn = bindCallback(iCallMyCallbackSynchronously, null, Rx.Scheduler.async);
- *
- * boundSyncFn().subscribe(() => console.log('I was sync!'));
- * boundAsyncFn().subscribe(() => console.log('I was async!'));
- * console.log('This happened...');
- *
- * // Logs:
- * // I was sync!
- * // This happened...
- * // I was async!
- * ```
- *
- * ### Use bindCallback on an object method
- * ```ts
- * import { bindCallback } from 'rxjs';
- *
- * const boundMethod = bindCallback(someObject.methodWithCallback);
- * boundMethod.call(someObject) // make sure methodWithCallback has access to someObject
- * .subscribe(subscriber);
- * ```
- *
- * @see {@link bindNodeCallback}
- * @see {@link from}
- *
- * @param {function} func A function with a callback as the last parameter.
- * @param {SchedulerLike} [scheduler] The scheduler on which to schedule the
- * callbacks.
- * @return {function(...params: *): Observable} A function which returns the
- * Observable that delivers the same values the callback would deliver.
- * @name bindCallback
- */
-export function bindCallback<T>(
-  callbackFunc: Function,
-  resultSelector?: Function|SchedulerLike,
-  scheduler?: SchedulerLike
-): (...args: any[]) => Observable<T> {
-  if (resultSelector) {
-    if (isScheduler(resultSelector)) {
-      scheduler = resultSelector;
-    } else {
-      // DEPRECATED PATH
-      return (...args: any[]) => bindCallback(callbackFunc, scheduler)(...args).pipe(
-        map((args) => isArray(args) ? resultSelector(...args) : resultSelector(args)),
-      );
-    }
-  }
-
-  return function (this: any, ...args: any[]): Observable<T> {
-    const context = this;
-    let subject: AsyncSubject<T>;
-    const params = {
-      context,
-      subject,
-      callbackFunc,
-      scheduler,
-    };
-    return new Observable<T>(subscriber => {
-      if (!scheduler) {
-        if (!subject) {
-          subject = new AsyncSubject<T>();
-          const handler = (...innerArgs: any[]) => {
-            subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-            subject.complete();
-          };
-
-          try {
-            callbackFunc.apply(context, [...args, handler]);
-          } catch (err) {
-            if (canReportError(subject)) {
-              subject.error(err);
-            } else {
-              console.warn(err);
-            }
-          }
-        }
-        return subject.subscribe(subscriber);
-      } else {
-        const state: DispatchState<T> = {
-          args, subscriber, params,
-        };
-        return scheduler.schedule<DispatchState<T>>(dispatch, 0, state);
-      }
-    });
-  };
-}
-
-interface DispatchState<T> {
-  args: any[];
-  subscriber: Subscriber<T>;
-  params: ParamsContext<T>;
-}
-
-interface ParamsContext<T> {
-  callbackFunc: Function;
-  scheduler: SchedulerLike;
-  context: any;
-  subject: AsyncSubject<T>;
-}
-
-function dispatch<T>(this: SchedulerAction<DispatchState<T>>, state: DispatchState<T>) {
-  const self = this;
-  const { args, subscriber, params } = state;
-  const { callbackFunc, context, scheduler } = params;
-  let { subject } = params;
-  if (!subject) {
-    subject = params.subject = new AsyncSubject<T>();
-
-    const handler = (...innerArgs: any[]) => {
-      const value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-      this.add(scheduler.schedule<NextState<T>>(dispatchNext, 0, { value, subject }));
-    };
-
-    try {
-      callbackFunc.apply(context, [...args, handler]);
-    } catch (err) {
-      subject.error(err);
-    }
-  }
-
-  this.add(subject.subscribe(subscriber));
-}
-
-interface NextState<T> {
-  subject: AsyncSubject<T>;
-  value: T;
-}
-
-function dispatchNext<T>(this: SchedulerAction<NextState<T>>, state: NextState<T>) {
-  const { value, subject } = state;
-  subject.next(value);
-  subject.complete();
-}
-
-interface ErrorState<T> {
-  subject: AsyncSubject<T>;
-  err: any;
-}
-
-function dispatchError<T>(this: SchedulerAction<ErrorState<T>>, state: ErrorState<T>) {
-  const { err, subject } = state;
-  subject.error(err);
-}
diff --git a/node_modules/rxjs/src/internal/observable/bindNodeCallback.ts b/node_modules/rxjs/src/internal/observable/bindNodeCallback.ts
deleted file mode 100644
index 605961a..0000000
--- a/node_modules/rxjs/src/internal/observable/bindNodeCallback.ts
+++ /dev/null
@@ -1,278 +0,0 @@
-import { Observable } from '../Observable';
-import { AsyncSubject } from '../AsyncSubject';
-import { Subscriber } from '../Subscriber';
-import { SchedulerAction, SchedulerLike } from '../types';
-import { map } from '../operators/map';
-import { canReportError } from '../util/canReportError';
-import { isScheduler } from '../util/isScheduler';
-import { isArray } from '../util/isArray';
-
-/* tslint:disable:max-line-length */
-/** @deprecated resultSelector is deprecated, pipe to map instead */
-export function bindNodeCallback(callbackFunc: Function, resultSelector: Function, scheduler?: SchedulerLike): (...args: any[]) => Observable<any>;
-
-export function bindNodeCallback<R1, R2, R3, R4>(callbackFunc: (callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-export function bindNodeCallback<R1, R2, R3>(callbackFunc: (callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): () => Observable<[R1, R2, R3]>;
-export function bindNodeCallback<R1, R2>(callbackFunc: (callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): () => Observable<[R1, R2]>;
-export function bindNodeCallback<R1>(callbackFunc: (callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): () => Observable<R1>;
-export function bindNodeCallback(callbackFunc: (callback: (err: any) => any) => any, scheduler?: SchedulerLike): () => Observable<void>;
-
-export function bindNodeCallback<A1, R1, R2, R3, R4>(callbackFunc: (arg1: A1, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-export function bindNodeCallback<A1, R1, R2, R3>(callbackFunc: (arg1: A1, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<[R1, R2, R3]>;
-export function bindNodeCallback<A1, R1, R2>(callbackFunc: (arg1: A1, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<[R1, R2]>;
-export function bindNodeCallback<A1, R1>(callbackFunc: (arg1: A1, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<R1>;
-export function bindNodeCallback<A1>(callbackFunc: (arg1: A1, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<void>;
-
-export function bindNodeCallback<A1, A2, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-export function bindNodeCallback<A1, A2, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<[R1, R2, R3]>;
-export function bindNodeCallback<A1, A2, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<[R1, R2]>;
-export function bindNodeCallback<A1, A2, R1>(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<R1>;
-export function bindNodeCallback<A1, A2>(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<void>;
-
-export function bindNodeCallback<A1, A2, A3, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-export function bindNodeCallback<A1, A2, A3, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<[R1, R2, R3]>;
-export function bindNodeCallback<A1, A2, A3, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<[R1, R2]>;
-export function bindNodeCallback<A1, A2, A3, R1>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<R1>;
-export function bindNodeCallback<A1, A2, A3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<void>;
-
-export function bindNodeCallback<A1, A2, A3, A4, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-export function bindNodeCallback<A1, A2, A3, A4, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<[R1, R2, R3]>;
-export function bindNodeCallback<A1, A2, A3, A4, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<[R1, R2]>;
-export function bindNodeCallback<A1, A2, A3, A4, R1>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<R1>;
-export function bindNodeCallback<A1, A2, A3, A4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<void>;
-
-export function bindNodeCallback<A1, A2, A3, A4, A5, R1, R2, R3, R4>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-export function bindNodeCallback<A1, A2, A3, A4, A5, R1, R2, R3>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<[R1, R2, R3]>;
-export function bindNodeCallback<A1, A2, A3, A4, A5, R1, R2>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<[R1, R2]>;
-export function bindNodeCallback<A1, A2, A3, A4, A5, R1>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<R1>;
-export function bindNodeCallback<A1, A2, A3, A4, A5>(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<void>; /* tslint:enable:max-line-length */
-
-export function bindNodeCallback(callbackFunc: Function, scheduler?: SchedulerLike): (...args: any[]) => Observable<any[]>;
-/**
- * Converts a Node.js-style callback API to a function that returns an
- * Observable.
- *
- * <span class="informal">It's just like {@link bindCallback}, but the
- * callback is expected to be of type `callback(error, result)`.</span>
- *
- * `bindNodeCallback` is not an operator because its input and output are not
- * Observables. The input is a function `func` with some parameters, but the
- * last parameter must be a callback function that `func` calls when it is
- * done. The callback function is expected to follow Node.js conventions,
- * where the first argument to the callback is an error object, signaling
- * whether call was successful. If that object is passed to callback, it means
- * something went wrong.
- *
- * The output of `bindNodeCallback` is a function that takes the same
- * parameters as `func`, except the last one (the callback). When the output
- * function is called with arguments, it will return an Observable.
- * If `func` calls its callback with error parameter present, Observable will
- * error with that value as well. If error parameter is not passed, Observable will emit
- * second parameter. If there are more parameters (third and so on),
- * Observable will emit an array with all arguments, except first error argument.
- *
- * Note that `func` will not be called at the same time output function is,
- * but rather whenever resulting Observable is subscribed. By default call to
- * `func` will happen synchronously after subscription, but that can be changed
- * with proper `scheduler` provided as optional third parameter. {@link SchedulerLike}
- * can also control when values from callback will be emitted by Observable.
- * To find out more, check out documentation for {@link bindCallback}, where
- * {@link SchedulerLike} works exactly the same.
- *
- * As in {@link bindCallback}, context (`this` property) of input function will be set to context
- * of returned function, when it is called.
- *
- * After Observable emits value, it will complete immediately. This means
- * even if `func` calls callback again, values from second and consecutive
- * calls will never appear on the stream. If you need to handle functions
- * that call callbacks multiple times, check out {@link fromEvent} or
- * {@link fromEventPattern} instead.
- *
- * Note that `bindNodeCallback` can be used in non-Node.js environments as well.
- * "Node.js-style" callbacks are just a convention, so if you write for
- * browsers or any other environment and API you use implements that callback style,
- * `bindNodeCallback` can be safely used on that API functions as well.
- *
- * Remember that Error object passed to callback does not have to be an instance
- * of JavaScript built-in `Error` object. In fact, it does not even have to an object.
- * Error parameter of callback function is interpreted as "present", when value
- * of that parameter is truthy. It could be, for example, non-zero number, non-empty
- * string or boolean `true`. In all of these cases resulting Observable would error
- * with that value. This means usually regular style callbacks will fail very often when
- * `bindNodeCallback` is used. If your Observable errors much more often then you
- * would expect, check if callback really is called in Node.js-style and, if not,
- * switch to {@link bindCallback} instead.
- *
- * Note that even if error parameter is technically present in callback, but its value
- * is falsy, it still won't appear in array emitted by Observable.
- *
- * ## Examples
- * ###  Read a file from the filesystem and get the data as an Observable
- * ```ts
- * import * as fs from 'fs';
- * const readFileAsObservable = bindNodeCallback(fs.readFile);
- * const result = readFileAsObservable('./roadNames.txt', 'utf8');
- * result.subscribe(x => console.log(x), e => console.error(e));
- * ```
- *
- * ### Use on function calling callback with multiple arguments
- * ```ts
- * someFunction((err, a, b) => {
- *   console.log(err); // null
- *   console.log(a); // 5
- *   console.log(b); // "some string"
- * });
- * const boundSomeFunction = bindNodeCallback(someFunction);
- * boundSomeFunction()
- * .subscribe(value => {
- *   console.log(value); // [5, "some string"]
- * });
- * ```
- *
- * ### Use on function calling callback in regular style
- * ```ts
- * someFunction(a => {
- *   console.log(a); // 5
- * });
- * const boundSomeFunction = bindNodeCallback(someFunction);
- * boundSomeFunction()
- * .subscribe(
- *   value => {}             // never gets called
- *   err => console.log(err) // 5
- * );
- * ```
- *
- * @see {@link bindCallback}
- * @see {@link from}
- *
- * @param {function} func Function with a Node.js-style callback as the last parameter.
- * @param {SchedulerLike} [scheduler] The scheduler on which to schedule the
- * callbacks.
- * @return {function(...params: *): Observable} A function which returns the
- * Observable that delivers the same values the Node.js callback would
- * deliver.
- * @name bindNodeCallback
- */
-export function bindNodeCallback<T>(
-  callbackFunc: Function,
-  resultSelector: Function|SchedulerLike,
-  scheduler?: SchedulerLike
-): (...args: any[]) => Observable<T> {
-
-  if (resultSelector) {
-    if (isScheduler(resultSelector)) {
-      scheduler = resultSelector;
-    } else {
-      // DEPRECATED PATH
-      return (...args: any[]) => bindNodeCallback(callbackFunc, scheduler)(...args).pipe(
-        map(args => isArray(args) ? resultSelector(...args) : resultSelector(args))
-      );
-    }
-  }
-
-  return function(this: any, ...args: any[]): Observable<T> {
-    const params: ParamsState<T> = {
-      subject: undefined,
-      args,
-      callbackFunc,
-      scheduler,
-      context: this,
-    };
-    return new Observable<T>(subscriber => {
-      const { context } = params;
-      let { subject } = params;
-      if (!scheduler) {
-        if (!subject) {
-          subject = params.subject = new AsyncSubject<T>();
-          const handler = (...innerArgs: any[]) => {
-            const err = innerArgs.shift();
-
-            if (err) {
-              subject.error(err);
-              return;
-            }
-
-            subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-            subject.complete();
-          };
-
-          try {
-            callbackFunc.apply(context, [...args, handler]);
-          } catch (err) {
-            if (canReportError(subject)) {
-              subject.error(err);
-            } else {
-              console.warn(err);
-            }
-          }
-        }
-        return subject.subscribe(subscriber);
-      } else {
-        return scheduler.schedule<DispatchState<T>>(dispatch, 0, { params, subscriber, context });
-      }
-    });
-  };
-}
-
-interface DispatchState<T> {
-  subscriber: Subscriber<T>;
-  context: any;
-  params: ParamsState<T>;
-}
-
-interface ParamsState<T> {
-  callbackFunc: Function;
-  args: any[];
-  scheduler: SchedulerLike;
-  subject: AsyncSubject<T>;
-  context: any;
-}
-
-function dispatch<T>(this: SchedulerAction<DispatchState<T>>, state: DispatchState<T>) {
-  const { params, subscriber, context } = state;
-  const { callbackFunc, args, scheduler } = params;
-  let subject = params.subject;
-
-  if (!subject) {
-    subject = params.subject = new AsyncSubject<T>();
-
-    const handler = (...innerArgs: any[]) => {
-      const err = innerArgs.shift();
-      if (err) {
-        this.add(scheduler.schedule<DispatchErrorArg<T>>(dispatchError, 0, { err, subject }));
-      } else {
-        const value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-        this.add(scheduler.schedule<DispatchNextArg<T>>(dispatchNext, 0, { value, subject }));
-      }
-    };
-
-    try {
-      callbackFunc.apply(context, [...args, handler]);
-    } catch (err) {
-      this.add(scheduler.schedule<DispatchErrorArg<T>>(dispatchError, 0, { err, subject }));
-    }
-  }
-
-  this.add(subject.subscribe(subscriber));
-}
-
-interface DispatchNextArg<T> {
-  subject: AsyncSubject<T>;
-  value: T;
-}
-
-function dispatchNext<T>(arg: DispatchNextArg<T>) {
-  const { value, subject } = arg;
-  subject.next(value);
-  subject.complete();
-}
-
-interface DispatchErrorArg<T> {
-  subject: AsyncSubject<T>;
-  err: any;
-}
-
-function dispatchError<T>(arg: DispatchErrorArg<T>) {
-  const { err, subject } = arg;
-  subject.error(err);
-}
diff --git a/node_modules/rxjs/src/internal/observable/combineLatest.ts b/node_modules/rxjs/src/internal/observable/combineLatest.ts
deleted file mode 100644
index ce093c9..0000000
--- a/node_modules/rxjs/src/internal/observable/combineLatest.ts
+++ /dev/null
@@ -1,328 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput, SchedulerLike, ObservedValueOf } from '../types';
-import { isScheduler  } from '../util/isScheduler';
-import { isArray  } from '../util/isArray';
-import { Subscriber } from '../Subscriber';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { Operator } from '../Operator';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { fromArray } from './fromArray';
-
-const NONE = {};
-
-/* tslint:disable:max-line-length */
-
-// If called with a single array, it "auto-spreads" the array, with result selector
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O1 extends ObservableInput<any>, R>(sources: [O1], resultSelector: (v1: ObservedValueOf<O1>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, R>(sources: [O1, O2], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, R>(sources: [O1, O2, O3], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, R>(sources: [O1, O2, O3, O4], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, R>(sources: [O1, O2, O3, O4, O5], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>, R>(sources: [O1, O2, O3, O4, O5, O6], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>, v6: ObservedValueOf<O6>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O extends ObservableInput<any>, R>(sources: O[], resultSelector: (...args: ObservedValueOf<O>[]) => R, scheduler?: SchedulerLike): Observable<R>;
-
-// standard call, but with a result selector
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O1 extends ObservableInput<any>, R>(v1: O1, resultSelector: (v1: ObservedValueOf<O1>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, R>(v1: O1, v2: O2, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>) => R, scheduler?: SchedulerLike): Observable<R>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>, v6: ObservedValueOf<O6>) => R, scheduler?: SchedulerLike): Observable<R>;
-
-// With a scheduler (deprecated)
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export function combineLatest<O1 extends ObservableInput<any>>(sources: [O1], scheduler: SchedulerLike): Observable<[ObservedValueOf<O1>]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(sources: [O1, O2], scheduler: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(sources: [O1, O2, O3], scheduler: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(sources: [O1, O2, O3, O4], scheduler: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(sources: [O1, O2, O3, O4, O5], scheduler: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(sources: [O1, O2, O3, O4, O5, O6], scheduler: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>, ObservedValueOf<O6>]>;
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export function combineLatest<O extends ObservableInput<any>>(sources: O[], scheduler: SchedulerLike): Observable<ObservedValueOf<O>[]>;
-
-// Best case
-export function combineLatest<O1 extends ObservableInput<any>>(sources: [O1]): Observable<[ObservedValueOf<O1>]>;
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(sources: [O1, O2]): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>]>;
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(sources: [O1, O2, O3]): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>]>;
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(sources: [O1, O2, O3, O4]): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>]>;
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(sources: [O1, O2, O3, O4, O5]): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>]>;
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(sources: [O1, O2, O3, O4, O5, O6]): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>, ObservedValueOf<O6>]>;
-export function combineLatest<O extends ObservableInput<any>>(sources: O[]): Observable<ObservedValueOf<O>[]>;
-
-// Standard calls
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export function combineLatest<O1 extends ObservableInput<any>>(v1: O1, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(v1: O1, v2: O2, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>]>;
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>, ObservedValueOf<O6>]>;
-
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export function combineLatest<O extends ObservableInput<any>>(...observables: O[]): Observable<any[]>;
-
-/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */
-export function combineLatest<O extends ObservableInput<any>, R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): Observable<R>;
-
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function combineLatest<O extends ObservableInput<any>, R>(array: O[], resultSelector: (...values: ObservedValueOf<O>[]) => R, scheduler?: SchedulerLike): Observable<R>;
-
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export function combineLatest<O extends ObservableInput<any>>(...observables: Array<O | SchedulerLike>): Observable<any[]>;
-
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export function combineLatest<O extends ObservableInput<any>, R>(...observables: Array<O | ((...values: ObservedValueOf<O>[]) => R) | SchedulerLike>): Observable<R>;
-
-/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */
-export function combineLatest<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R) | SchedulerLike>): Observable<R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Combines multiple Observables to create an Observable whose values are
- * calculated from the latest values of each of its input Observables.
- *
- * <span class="informal">Whenever any input Observable emits a value, it
- * computes a formula using the latest values from all the inputs, then emits
- * the output of that formula.</span>
- *
- * ![](combineLatest.png)
- *
- * `combineLatest` combines the values from all the Observables passed as
- * arguments. This is done by subscribing to each Observable in order and,
- * whenever any Observable emits, collecting an array of the most recent
- * values from each Observable. So if you pass `n` Observables to operator,
- * returned Observable will always emit an array of `n` values, in order
- * corresponding to order of passed Observables (value from the first Observable
- * on the first place and so on).
- *
- * Static version of `combineLatest` accepts either an array of Observables
- * or each Observable can be put directly as an argument. Note that array of
- * Observables is good choice, if you don't know beforehand how many Observables
- * you will combine. Passing empty array will result in Observable that
- * completes immediately.
- *
- * To ensure output array has always the same length, `combineLatest` will
- * actually wait for all input Observables to emit at least once,
- * before it starts emitting results. This means if some Observable emits
- * values before other Observables started emitting, all these values but the last
- * will be lost. On the other hand, if some Observable does not emit a value but
- * completes, resulting Observable will complete at the same moment without
- * emitting anything, since it will be now impossible to include value from
- * completed Observable in resulting array. Also, if some input Observable does
- * not emit any value and never completes, `combineLatest` will also never emit
- * and never complete, since, again, it will wait for all streams to emit some
- * value.
- *
- * If at least one Observable was passed to `combineLatest` and all passed Observables
- * emitted something, resulting Observable will complete when all combined
- * streams complete. So even if some Observable completes, result of
- * `combineLatest` will still emit values when other Observables do. In case
- * of completed Observable, its value from now on will always be the last
- * emitted value. On the other hand, if any Observable errors, `combineLatest`
- * will error immediately as well, and all other Observables will be unsubscribed.
- *
- * `combineLatest` accepts as optional parameter `project` function, which takes
- * as arguments all values that would normally be emitted by resulting Observable.
- * `project` can return any kind of value, which will be then emitted by Observable
- * instead of default array. Note that `project` does not take as argument that array
- * of values, but values themselves. That means default `project` can be imagined
- * as function that takes all its arguments and puts them into an array.
- *
- * ## Examples
- * ### Combine two timer Observables
- * ```ts
- * import { combineLatest, timer } from 'rxjs';
- *
- * const firstTimer = timer(0, 1000); // emit 0, 1, 2... after every second, starting from now
- * const secondTimer = timer(500, 1000); // emit 0, 1, 2... after every second, starting 0,5s from now
- * const combinedTimers = combineLatest(firstTimer, secondTimer);
- * combinedTimers.subscribe(value => console.log(value));
- * // Logs
- * // [0, 0] after 0.5s
- * // [1, 0] after 1s
- * // [1, 1] after 1.5s
- * // [2, 1] after 2s
- * ```
- *
- * ### Combine an array of Observables
- * ```ts
- * import { combineLatest, of } from 'rxjs';
- * import { delay, starWith } from 'rxjs/operators';
- *
- * const observables = [1, 5, 10].map(
- *   n => of(n).pipe(
- *     delay(n * 1000),   // emit 0 and then emit n after n seconds
- *     startWith(0),
- *   )
- * );
- * const combined = combineLatest(observables);
- * combined.subscribe(value => console.log(value));
- * // Logs
- * // [0, 0, 0] immediately
- * // [1, 0, 0] after 1s
- * // [1, 5, 0] after 5s
- * // [1, 5, 10] after 10s
- * ```
- *
- *
- * ### Use project function to dynamically calculate the Body-Mass Index
- * ```ts
- * import { combineLatest, of } from 'rxjs';
- * import { map } from 'rxjs/operators';
- *
- * const weight = of(70, 72, 76, 79, 75);
- * const height = of(1.76, 1.77, 1.78);
- * const bmi = combineLatest(weight, height).pipe(
- *   map(([w, h]) => w / (h * h)),
- * );
- * bmi.subscribe(x => console.log('BMI is ' + x));
- *
- * // With output to console:
- * // BMI is 24.212293388429753
- * // BMI is 23.93948099205209
- * // BMI is 23.671253629592222
- * ```
- *
- * @see {@link combineAll}
- * @see {@link merge}
- * @see {@link withLatestFrom}
- *
- * @param {ObservableInput} observable1 An input Observable to combine with other Observables.
- * @param {ObservableInput} observable2 An input Observable to combine with other Observables.
- * More than one input Observables may be given as arguments
- * or an array of Observables may be given as the first argument.
- * @param {function} [project] An optional function to project the values from
- * the combined latest values into a new value on the output Observable.
- * @param {SchedulerLike} [scheduler=null] The {@link SchedulerLike} to use for subscribing to
- * each input Observable.
- * @return {Observable} An Observable of projected values from the most recent
- * values from each input Observable, or an array of the most recent values from
- * each input Observable.
- */
-export function combineLatest<O extends ObservableInput<any>, R>(
-  ...observables: (O | ((...values: ObservedValueOf<O>[]) => R) | SchedulerLike)[]
-): Observable<R> {
-  let resultSelector: (...values: Array<any>) => R =  null;
-  let scheduler: SchedulerLike = null;
-
-  if (isScheduler(observables[observables.length - 1])) {
-    scheduler = observables.pop() as SchedulerLike;
-  }
-
-  if (typeof observables[observables.length - 1] === 'function') {
-    resultSelector = observables.pop() as (...values: Array<any>) => R;
-  }
-
-  // if the first and only other argument besides the resultSelector is an array
-  // assume it's been called with `combineLatest([obs1, obs2, obs3], resultSelector)`
-  if (observables.length === 1 && isArray(observables[0])) {
-    observables = observables[0] as any;
-  }
-
-  return fromArray(observables, scheduler).lift(new CombineLatestOperator<ObservedValueOf<O>, R>(resultSelector));
-}
-
-export class CombineLatestOperator<T, R> implements Operator<T, R> {
-  constructor(private resultSelector?: (...values: Array<any>) => R) {
-  }
-
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class CombineLatestSubscriber<T, R> extends OuterSubscriber<T, R> {
-  private active: number = 0;
-  private values: any[] = [];
-  private observables: any[] = [];
-  private toRespond: number;
-
-  constructor(destination: Subscriber<R>, private resultSelector?: (...values: Array<any>) => R) {
-    super(destination);
-  }
-
-  protected _next(observable: any) {
-    this.values.push(NONE);
-    this.observables.push(observable);
-  }
-
-  protected _complete() {
-    const observables = this.observables;
-    const len = observables.length;
-    if (len === 0) {
-      this.destination.complete();
-    } else {
-      this.active = len;
-      this.toRespond = len;
-      for (let i = 0; i < len; i++) {
-        const observable = observables[i];
-        this.add(subscribeToResult(this, observable, observable, i));
-      }
-    }
-  }
-
-  notifyComplete(unused: Subscriber<R>): void {
-    if ((this.active -= 1) === 0) {
-      this.destination.complete();
-    }
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    const values = this.values;
-    const oldVal = values[outerIndex];
-    const toRespond = !this.toRespond
-      ? 0
-      : oldVal === NONE ? --this.toRespond : this.toRespond;
-    values[outerIndex] = innerValue;
-
-    if (toRespond === 0) {
-      if (this.resultSelector) {
-        this._tryResultSelector(values);
-      } else {
-        this.destination.next(values.slice());
-      }
-    }
-  }
-
-  private _tryResultSelector(values: any[]) {
-    let result: any;
-    try {
-      result = this.resultSelector.apply(this, values);
-    } catch (err) {
-      this.destination.error(err);
-      return;
-    }
-    this.destination.next(result);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/observable/concat.ts b/node_modules/rxjs/src/internal/observable/concat.ts
deleted file mode 100644
index 5949742..0000000
--- a/node_modules/rxjs/src/internal/observable/concat.ts
+++ /dev/null
@@ -1,147 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput, SchedulerLike, ObservedValueOf } from '../types';
-import { isScheduler } from '../util/isScheduler';
-import { of } from './of';
-import { from } from './from';
-import { concatAll } from '../operators/concatAll';
-
-/* tslint:disable:max-line-length */
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export function concat<O1 extends ObservableInput<any>>(v1: O1, scheduler: SchedulerLike): Observable<ObservedValueOf<O1>>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(v1: O1, v2: O2, scheduler: SchedulerLike): Observable<ObservedValueOf<O1> | ObservedValueOf<O2>>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, scheduler: SchedulerLike): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3>>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, scheduler: SchedulerLike): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3> | ObservedValueOf<O4>>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, scheduler: SchedulerLike): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3> | ObservedValueOf<O4> | ObservedValueOf<O5>>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, scheduler: SchedulerLike): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3> | ObservedValueOf<O4> | ObservedValueOf<O5> | ObservedValueOf<O6>>;
-
-export function concat<O1 extends ObservableInput<any>>(v1: O1): Observable<ObservedValueOf<O1>>;
-export function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(v1: O1, v2: O2): Observable<ObservedValueOf<O1> | ObservedValueOf<O2>>;
-export function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3>>;
-export function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3> | ObservedValueOf<O4>>;
-export function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3> | ObservedValueOf<O4> | ObservedValueOf<O5>>;
-export function concat<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6): Observable<ObservedValueOf<O1> | ObservedValueOf<O2> | ObservedValueOf<O3> | ObservedValueOf<O4> | ObservedValueOf<O5> | ObservedValueOf<O6>>;
-export function concat<O extends ObservableInput<any>>(...observables: O[]): Observable<ObservedValueOf<O>>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export function concat<O extends ObservableInput<any>>(...observables: (O | SchedulerLike)[]): Observable<ObservedValueOf<O>>;
-export function concat<R>(...observables: ObservableInput<any>[]): Observable<R>;
-/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */
-export function concat<R>(...observables: (ObservableInput<any> | SchedulerLike)[]): Observable<R>;
-/* tslint:enable:max-line-length */
-/**
- * Creates an output Observable which sequentially emits all values from given
- * Observable and then moves on to the next.
- *
- * <span class="informal">Concatenates multiple Observables together by
- * sequentially emitting their values, one Observable after the other.</span>
- *
- * ![](concat.png)
- *
- * `concat` joins multiple Observables together, by subscribing to them one at a time and
- * merging their results into the output Observable. You can pass either an array of
- * Observables, or put them directly as arguments. Passing an empty array will result
- * in Observable that completes immediately.
- *
- * `concat` will subscribe to first input Observable and emit all its values, without
- * changing or affecting them in any way. When that Observable completes, it will
- * subscribe to then next Observable passed and, again, emit its values. This will be
- * repeated, until the operator runs out of Observables. When last input Observable completes,
- * `concat` will complete as well. At any given moment only one Observable passed to operator
- * emits values. If you would like to emit values from passed Observables concurrently, check out
- * {@link merge} instead, especially with optional `concurrent` parameter. As a matter of fact,
- * `concat` is an equivalent of `merge` operator with `concurrent` parameter set to `1`.
- *
- * Note that if some input Observable never completes, `concat` will also never complete
- * and Observables following the one that did not complete will never be subscribed. On the other
- * hand, if some Observable simply completes immediately after it is subscribed, it will be
- * invisible for `concat`, which will just move on to the next Observable.
- *
- * If any Observable in chain errors, instead of passing control to the next Observable,
- * `concat` will error immediately as well. Observables that would be subscribed after
- * the one that emitted error, never will.
- *
- * If you pass to `concat` the same Observable many times, its stream of values
- * will be "replayed" on every subscription, which means you can repeat given Observable
- * as many times as you like. If passing the same Observable to `concat` 1000 times becomes tedious,
- * you can always use {@link repeat}.
- *
- * ## Examples
- * ### Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10
- * ```ts
- * import { concat, interval, range } from 'rxjs';
- * import { take } from 'rxjs/operators';
- *
- * const timer = interval(1000).pipe(take(4));
- * const sequence = range(1, 10);
- * const result = concat(timer, sequence);
- * result.subscribe(x => console.log(x));
- *
- * // results in:
- * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10
- * ```
- *
- * ### Concatenate 3 Observables
- * ```ts
- * import { concat, interval } from 'rxjs';
- * import { take } from 'rxjs/operators';
- *
- * const timer1 = interval(1000).pipe(take(10));
- * const timer2 = interval(2000).pipe(take(6));
- * const timer3 = interval(500).pipe(take(10));
- *
- * const result = concat(timer1, timer2, timer3);
- * result.subscribe(x => console.log(x));
- *
- * // results in the following:
- * // (Prints to console sequentially)
- * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9
- * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5
- * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9
- * ```
- *
- * ### Concatenate the same Observable to repeat it
- * ```ts
- * import { concat, interval } from 'rxjs';
- * import { take } from 'rxjs/operators';
- *
- * const timer = interval(1000).pipe(take(2));
- *
- * concat(timer, timer) // concatenating the same Observable!
- * .subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('...and it is done!')
- * );
- *
- * // Logs:
- * // 0 after 1s
- * // 1 after 2s
- * // 0 after 3s
- * // 1 after 4s
- * // "...and it is done!" also after 4s
- * ```
- *
- * @see {@link concatAll}
- * @see {@link concatMap}
- * @see {@link concatMapTo}
- * @see {@link startWith}
- * @see {@link endWith}
- *
- * @param {ObservableInput} input1 An input Observable to concatenate with others.
- * @param {ObservableInput} input2 An input Observable to concatenate with others.
- * More than one input Observables may be given as argument.
- * @param {SchedulerLike} [scheduler=null] An optional {@link SchedulerLike} to schedule each
- * Observable subscription on.
- * @return {Observable} All values of each passed Observable merged into a
- * single Observable, in order, in serial fashion.
- * @static true
- * @name concat
- * @owner Observable
- */
-export function concat<O extends ObservableInput<any>, R>(...observables: Array<O | SchedulerLike>): Observable<ObservedValueOf<O> | R> {
-  return concatAll<R>()(of(...observables));
-}
diff --git a/node_modules/rxjs/src/internal/observable/defer.ts b/node_modules/rxjs/src/internal/observable/defer.ts
deleted file mode 100644
index df6c7aa..0000000
--- a/node_modules/rxjs/src/internal/observable/defer.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { Observable } from '../Observable';
-import { SubscribableOrPromise, ObservedValueOf, ObservableInput } from '../types';
-import { from } from './from'; // lol
-import { empty } from './empty';
-
-/**
- * Creates an Observable that, on subscribe, calls an Observable factory to
- * make an Observable for each new Observer.
- *
- * <span class="informal">Creates the Observable lazily, that is, only when it
- * is subscribed.
- * </span>
- *
- * ![](defer.png)
- *
- * `defer` allows you to create the Observable only when the Observer
- * subscribes, and create a fresh Observable for each Observer. It waits until
- * an Observer subscribes to it, and then it generates an Observable,
- * typically with an Observable factory function. It does this afresh for each
- * subscriber, so although each subscriber may think it is subscribing to the
- * same Observable, in fact each subscriber gets its own individual
- * Observable.
- *
- * ## Example
- * ### Subscribe to either an Observable of clicks or an Observable of interval, at random
- * ```ts
- * import { defer, fromEvent, interval } from 'rxjs';
- *
- * const clicksOrInterval = defer(function () {
- *   return Math.random() > 0.5
- *     ? fromEvent(document, 'click')
- *     : interval(1000);
- * });
- * clicksOrInterval.subscribe(x => console.log(x));
- *
- * // Results in the following behavior:
- * // If the result of Math.random() is greater than 0.5 it will listen
- * // for clicks anywhere on the "document"; when document is clicked it
- * // will log a MouseEvent object to the console. If the result is less
- * // than 0.5 it will emit ascending numbers, one every second(1000ms).
- * ```
- *
- * @see {@link Observable}
- *
- * @param {function(): SubscribableOrPromise} observableFactory The Observable
- * factory function to invoke for each Observer that subscribes to the output
- * Observable. May also return a Promise, which will be converted on the fly
- * to an Observable.
- * @return {Observable} An Observable whose Observers' subscriptions trigger
- * an invocation of the given Observable factory function.
- * @static true
- * @name defer
- * @owner Observable
- */
-export function defer<R extends ObservableInput<any> | void>(observableFactory: () => R): Observable<ObservedValueOf<R>> {
-  return new Observable<ObservedValueOf<R>>(subscriber => {
-    let input: R | void;
-    try {
-      input = observableFactory();
-    } catch (err) {
-      subscriber.error(err);
-      return undefined;
-    }
-    const source = input ? from(input as ObservableInput<ObservedValueOf<R>>) : empty();
-    return source.subscribe(subscriber);
-  });
-}
diff --git a/node_modules/rxjs/src/internal/observable/dom/AjaxObservable.ts b/node_modules/rxjs/src/internal/observable/dom/AjaxObservable.ts
deleted file mode 100644
index d1f3f91..0000000
--- a/node_modules/rxjs/src/internal/observable/dom/AjaxObservable.ts
+++ /dev/null
@@ -1,550 +0,0 @@
-import { root } from '../../util/root';
-import { Observable } from '../../Observable';
-import { Subscriber } from '../../Subscriber';
-import { TeardownLogic } from '../../types';
-import { map } from '../../operators/map';
-
-export interface AjaxRequest {
-  url?: string;
-  body?: any;
-  user?: string;
-  async?: boolean;
-  method?: string;
-  headers?: Object;
-  timeout?: number;
-  password?: string;
-  hasContent?: boolean;
-  crossDomain?: boolean;
-  withCredentials?: boolean;
-  createXHR?: () => XMLHttpRequest;
-  progressSubscriber?: Subscriber<any>;
-  responseType?: string;
-}
-
-function getCORSRequest(): XMLHttpRequest {
-  if (root.XMLHttpRequest) {
-    return new root.XMLHttpRequest();
-  } else if (!!root.XDomainRequest) {
-    return new root.XDomainRequest();
-  } else {
-    throw new Error('CORS is not supported by your browser');
-  }
-}
-
-function getXMLHttpRequest(): XMLHttpRequest {
-  if (root.XMLHttpRequest) {
-    return new root.XMLHttpRequest();
-  } else {
-    let progId: string;
-    try {
-      const progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
-      for (let i = 0; i < 3; i++) {
-        try {
-          progId = progIds[i];
-          if (new root.ActiveXObject(progId)) {
-            break;
-          }
-        } catch (e) {
-          //suppress exceptions
-        }
-      }
-      return new root.ActiveXObject(progId);
-    } catch (e) {
-      throw new Error('XMLHttpRequest is not supported by your browser');
-    }
-  }
-}
-
-export interface AjaxCreationMethod {
-  (urlOrRequest: string | AjaxRequest): Observable<AjaxResponse>;
-  get(url: string, headers?: Object): Observable<AjaxResponse>;
-  post(url: string, body?: any, headers?: Object): Observable<AjaxResponse>;
-  put(url: string, body?: any, headers?: Object): Observable<AjaxResponse>;
-  patch(url: string, body?: any, headers?: Object): Observable<AjaxResponse>;
-  delete(url: string, headers?: Object): Observable<AjaxResponse>;
-  getJSON<T>(url: string, headers?: Object): Observable<T>;
-}
-
-export function ajaxGet(url: string, headers: Object = null) {
-  return new AjaxObservable<AjaxResponse>({ method: 'GET', url, headers });
-}
-
-export function ajaxPost(url: string, body?: any, headers?: Object): Observable<AjaxResponse> {
-  return new AjaxObservable<AjaxResponse>({ method: 'POST', url, body, headers });
-}
-
-export function ajaxDelete(url: string, headers?: Object): Observable<AjaxResponse> {
-  return new AjaxObservable<AjaxResponse>({ method: 'DELETE', url, headers });
-}
-
-export function ajaxPut(url: string, body?: any, headers?: Object): Observable<AjaxResponse> {
-  return new AjaxObservable<AjaxResponse>({ method: 'PUT', url, body, headers });
-}
-
-export function ajaxPatch(url: string, body?: any, headers?: Object): Observable<AjaxResponse> {
-  return new AjaxObservable<AjaxResponse>({ method: 'PATCH', url, body, headers });
-}
-
-const mapResponse = map((x: AjaxResponse, index: number) => x.response);
-
-export function ajaxGetJSON<T>(url: string, headers?: Object): Observable<T> {
-  return mapResponse(
-    new AjaxObservable<AjaxResponse>({
-      method: 'GET',
-      url,
-      responseType: 'json',
-      headers
-    })
-  );
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @extends {Ignored}
- * @hide true
- */
-export class AjaxObservable<T> extends Observable<T> {
-  /**
-   * Creates an observable for an Ajax request with either a request object with
-   * url, headers, etc or a string for a URL.
-   *
-   * ## Example
-   * ```ts
-   * import { ajax } from 'rxjs/ajax';
- *
-   * const source1 = ajax('/products');
-   * const source2 = ajax({ url: 'products', method: 'GET' });
-   * ```
-   *
-   * @param {string|Object} request Can be one of the following:
-   *   A string of the URL to make the Ajax call.
-   *   An object with the following properties
-   *   - url: URL of the request
-   *   - body: The body of the request
-   *   - method: Method of the request, such as GET, POST, PUT, PATCH, DELETE
-   *   - async: Whether the request is async
-   *   - headers: Optional headers
-   *   - crossDomain: true if a cross domain request, else false
-   *   - createXHR: a function to override if you need to use an alternate
-   *   XMLHttpRequest implementation.
-   *   - resultSelector: a function to use to alter the output value type of
-   *   the Observable. Gets {@link AjaxResponse} as an argument.
-   * @return {Observable} An observable sequence containing the XMLHttpRequest.
-   * @static true
-   * @name ajax
-   * @owner Observable
-   * @nocollapse
-  */
-  static create: AjaxCreationMethod = (() => {
-    const create: any = (urlOrRequest: string | AjaxRequest) => {
-      return new AjaxObservable(urlOrRequest);
-    };
-
-    create.get = ajaxGet;
-    create.post = ajaxPost;
-    create.delete = ajaxDelete;
-    create.put = ajaxPut;
-    create.patch = ajaxPatch;
-    create.getJSON = ajaxGetJSON;
-
-    return <AjaxCreationMethod>create;
-  })();
-
-  private request: AjaxRequest;
-
-  constructor(urlOrRequest: string | AjaxRequest) {
-    super();
-
-    const request: AjaxRequest = {
-      async: true,
-      createXHR: function(this: AjaxRequest) {
-        return this.crossDomain ? getCORSRequest() : getXMLHttpRequest();
-      },
-      crossDomain: true,
-      withCredentials: false,
-      headers: {},
-      method: 'GET',
-      responseType: 'json',
-      timeout: 0
-    };
-
-    if (typeof urlOrRequest === 'string') {
-      request.url = urlOrRequest;
-    } else {
-      for (const prop in urlOrRequest) {
-        if (urlOrRequest.hasOwnProperty(prop)) {
-          request[prop] = urlOrRequest[prop];
-        }
-      }
-    }
-
-    this.request = request;
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<T>): TeardownLogic {
-    return new AjaxSubscriber(subscriber, this.request);
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class AjaxSubscriber<T> extends Subscriber<Event> {
-  private xhr: XMLHttpRequest;
-  private done: boolean = false;
-
-  constructor(destination: Subscriber<T>, public request: AjaxRequest) {
-    super(destination);
-
-    const headers = request.headers = request.headers || {};
-
-    // force CORS if requested
-    if (!request.crossDomain && !this.getHeader(headers, 'X-Requested-With')) {
-      headers['X-Requested-With'] = 'XMLHttpRequest';
-    }
-
-    // ensure content type is set
-    let contentTypeHeader = this.getHeader(headers, 'Content-Type');
-    if (!contentTypeHeader && !(root.FormData && request.body instanceof root.FormData) && typeof request.body !== 'undefined') {
-      headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
-    }
-
-    // properly serialize body
-    request.body = this.serializeBody(request.body, this.getHeader(request.headers, 'Content-Type'));
-
-    this.send();
-  }
-
-  next(e: Event): void {
-    this.done = true;
-    const { xhr, request, destination } = this;
-    let result;
-    try {
-      result = new AjaxResponse(e, xhr, request);
-    } catch (err) {
-      return destination.error(err);
-    }
-    destination.next(result);
-  }
-
-  private send(): void {
-    const {
-      request,
-      request: { user, method, url, async, password, headers, body }
-    } = this;
-    try {
-      const xhr = this.xhr = request.createXHR();
-
-      // set up the events before open XHR
-      // https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest
-      // You need to add the event listeners before calling open() on the request.
-      // Otherwise the progress events will not fire.
-      this.setupEvents(xhr, request);
-      // open XHR
-      if (user) {
-        xhr.open(method, url, async, user, password);
-      } else {
-        xhr.open(method, url, async);
-      }
-
-      // timeout, responseType and withCredentials can be set once the XHR is open
-      if (async) {
-        xhr.timeout = request.timeout;
-        xhr.responseType = request.responseType as any;
-      }
-
-      if ('withCredentials' in xhr) {
-        xhr.withCredentials = !!request.withCredentials;
-      }
-
-      // set headers
-      this.setHeaders(xhr, headers);
-
-      // finally send the request
-      if (body) {
-        xhr.send(body);
-      } else {
-        xhr.send();
-      }
-    } catch (err) {
-      this.error(err);
-    }
-  }
-
-  private serializeBody(body: any, contentType?: string) {
-    if (!body || typeof body === 'string') {
-      return body;
-    } else if (root.FormData && body instanceof root.FormData) {
-      return body;
-    }
-
-    if (contentType) {
-      const splitIndex = contentType.indexOf(';');
-      if (splitIndex !== -1) {
-        contentType = contentType.substring(0, splitIndex);
-      }
-    }
-
-    switch (contentType) {
-      case 'application/x-www-form-urlencoded':
-        return Object.keys(body).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(body[key])}`).join('&');
-      case 'application/json':
-        return JSON.stringify(body);
-      default:
-        return body;
-    }
-  }
-
-  private setHeaders(xhr: XMLHttpRequest, headers: Object) {
-    for (let key in headers) {
-      if (headers.hasOwnProperty(key)) {
-        xhr.setRequestHeader(key, headers[key]);
-      }
-    }
-  }
-
-  private getHeader(headers: {}, headerName: string): any {
-    for (let key in headers) {
-      if (key.toLowerCase() === headerName.toLowerCase()) {
-        return headers[key];
-      }
-    }
-
-    return undefined;
-  }
-
-  private setupEvents(xhr: XMLHttpRequest, request: AjaxRequest) {
-    const progressSubscriber = request.progressSubscriber;
-
-    function xhrTimeout(this: XMLHttpRequest, e: ProgressEvent): void {
-      const {subscriber, progressSubscriber, request } = (<any>xhrTimeout);
-      if (progressSubscriber) {
-        progressSubscriber.error(e);
-      }
-      let error;
-      try {
-        error = new AjaxTimeoutError(this, request); // TODO: Make betterer.
-      } catch (err) {
-        error = err;
-      }
-      subscriber.error(error);
-    }
-    xhr.ontimeout = xhrTimeout;
-    (<any>xhrTimeout).request = request;
-    (<any>xhrTimeout).subscriber = this;
-    (<any>xhrTimeout).progressSubscriber = progressSubscriber;
-    if (xhr.upload && 'withCredentials' in xhr) {
-      if (progressSubscriber) {
-        let xhrProgress: (e: ProgressEvent) => void;
-        xhrProgress = function(e: ProgressEvent) {
-          const { progressSubscriber } = (<any>xhrProgress);
-          progressSubscriber.next(e);
-        };
-        if (root.XDomainRequest) {
-          xhr.onprogress = xhrProgress;
-        } else {
-          xhr.upload.onprogress = xhrProgress;
-        }
-        (<any>xhrProgress).progressSubscriber = progressSubscriber;
-      }
-      let xhrError: (e: any) => void;
-      xhrError = function(this: XMLHttpRequest, e: ErrorEvent) {
-        const { progressSubscriber, subscriber, request } = (<any>xhrError);
-        if (progressSubscriber) {
-          progressSubscriber.error(e);
-        }
-        let error;
-        try {
-          error = new AjaxError('ajax error', this, request);
-        } catch (err) {
-          error = err;
-        }
-        subscriber.error(error);
-      };
-      xhr.onerror = xhrError;
-      (<any>xhrError).request = request;
-      (<any>xhrError).subscriber = this;
-      (<any>xhrError).progressSubscriber = progressSubscriber;
-    }
-
-    function xhrReadyStateChange(this: XMLHttpRequest, e: Event) {
-      return;
-    }
-    xhr.onreadystatechange = xhrReadyStateChange;
-    (<any>xhrReadyStateChange).subscriber = this;
-    (<any>xhrReadyStateChange).progressSubscriber = progressSubscriber;
-    (<any>xhrReadyStateChange).request = request;
-
-    function xhrLoad(this: XMLHttpRequest, e: Event) {
-      const { subscriber, progressSubscriber, request } = (<any>xhrLoad);
-      if (this.readyState === 4) {
-        // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
-        let status: number = this.status === 1223 ? 204 : this.status;
-        let response: any = (this.responseType === 'text' ?  (
-          this.response || this.responseText) : this.response);
-
-        // fix status code when it is 0 (0 status is undocumented).
-        // Occurs when accessing file resources or on Android 4.1 stock browser
-        // while retrieving files from application cache.
-        if (status === 0) {
-          status = response ? 200 : 0;
-        }
-
-        // 4xx and 5xx should error (https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)
-        if (status < 400) {
-          if (progressSubscriber) {
-            progressSubscriber.complete();
-          }
-          subscriber.next(e);
-          subscriber.complete();
-        } else {
-          if (progressSubscriber) {
-            progressSubscriber.error(e);
-          }
-          let error;
-          try {
-            error = new AjaxError('ajax error ' + status, this, request);
-          } catch (err) {
-            error = err;
-          }
-          subscriber.error(error);
-        }
-      }
-    }
-    xhr.onload = xhrLoad;
-    (<any>xhrLoad).subscriber = this;
-    (<any>xhrLoad).progressSubscriber = progressSubscriber;
-    (<any>xhrLoad).request = request;
-  }
-
-  unsubscribe() {
-    const { done, xhr } = this;
-    if (!done && xhr && xhr.readyState !== 4 && typeof xhr.abort === 'function') {
-      xhr.abort();
-    }
-    super.unsubscribe();
-  }
-}
-
-/**
- * A normalized AJAX response.
- *
- * @see {@link ajax}
- *
- * @class AjaxResponse
- */
-export class AjaxResponse {
-  /** @type {number} The HTTP status code */
-  status: number;
-
-  /** @type {string|ArrayBuffer|Document|object|any} The response data */
-  response: any;
-
-  /** @type {string} The raw responseText */
-  responseText: string;
-
-  /** @type {string} The responseType (e.g. 'json', 'arraybuffer', or 'xml') */
-  responseType: string;
-
-  constructor(public originalEvent: Event, public xhr: XMLHttpRequest, public request: AjaxRequest) {
-    this.status = xhr.status;
-    this.responseType = xhr.responseType || request.responseType;
-    this.response = parseXhrResponse(this.responseType, xhr);
-  }
-}
-
-export type AjaxErrorNames = 'AjaxError' | 'AjaxTimeoutError';
-
-/**
- * A normalized AJAX error.
- *
- * @see {@link ajax}
- *
- * @class AjaxError
- */
-export interface AjaxError extends Error {
-  /** @type {XMLHttpRequest} The XHR instance associated with the error */
-  xhr: XMLHttpRequest;
-
-  /** @type {AjaxRequest} The AjaxRequest associated with the error */
-  request: AjaxRequest;
-
-  /** @type {number} The HTTP status code */
-  status: number;
-
-  /** @type {string} The responseType (e.g. 'json', 'arraybuffer', or 'xml') */
-  responseType: string;
-
-  /** @type {string|ArrayBuffer|Document|object|any} The response data */
-  response: any;
-}
-
-export interface AjaxErrorCtor {
-  new(message: string, xhr: XMLHttpRequest, request: AjaxRequest): AjaxError;
-}
-
-const AjaxErrorImpl = (() => {
-  function AjaxErrorImpl(this: any, message: string, xhr: XMLHttpRequest, request: AjaxRequest): AjaxError {
-    Error.call(this);
-    this.message = message;
-    this.name = 'AjaxError';
-    this.xhr = xhr;
-    this.request = request;
-    this.status = xhr.status;
-    this.responseType = xhr.responseType || request.responseType;
-    this.response = parseXhrResponse(this.responseType, xhr);
-    return this;
-  }
-  AjaxErrorImpl.prototype = Object.create(Error.prototype);
-  return AjaxErrorImpl;
-})();
-
-export const AjaxError: AjaxErrorCtor = AjaxErrorImpl as any;
-
-function parseJson(xhr: XMLHttpRequest) {
-  // HACK(benlesh): TypeScript shennanigans
-  // tslint:disable-next-line:no-any XMLHttpRequest is defined to always have 'response' inferring xhr as never for the else clause.
-  if ('response' in (xhr as any)) {
-    //IE does not support json as responseType, parse it internally
-    return xhr.responseType ? xhr.response : JSON.parse(xhr.response || xhr.responseText || 'null');
-  } else {
-    return JSON.parse((xhr as any).responseText || 'null');
-  }
-}
-
-function parseXhrResponse(responseType: string, xhr: XMLHttpRequest) {
-  switch (responseType) {
-    case 'json':
-        return parseJson(xhr);
-      case 'xml':
-        return xhr.responseXML;
-      case 'text':
-      default:
-          // HACK(benlesh): TypeScript shennanigans
-          // tslint:disable-next-line:no-any XMLHttpRequest is defined to always have 'response' inferring xhr as never for the else sub-expression.
-          return  ('response' in (xhr as any)) ? xhr.response : xhr.responseText;
-  }
-}
-
-export interface AjaxTimeoutError extends AjaxError {
-}
-
-export interface AjaxTimeoutErrorCtor {
-  new(xhr: XMLHttpRequest, request: AjaxRequest): AjaxTimeoutError;
-}
-
-function AjaxTimeoutErrorImpl(this: any, xhr: XMLHttpRequest, request: AjaxRequest) {
-  AjaxError.call(this, 'ajax timeout', xhr, request);
-  this.name = 'AjaxTimeoutError';
-  return this;
-}
-
-/**
- * @see {@link ajax}
- *
- * @class AjaxTimeoutError
- */
-export const AjaxTimeoutError: AjaxTimeoutErrorCtor = AjaxTimeoutErrorImpl as any;
diff --git a/node_modules/rxjs/src/internal/observable/dom/MiscJSDoc.ts b/node_modules/rxjs/src/internal/observable/dom/MiscJSDoc.ts
deleted file mode 100644
index 6fe7e81..0000000
--- a/node_modules/rxjs/src/internal/observable/dom/MiscJSDoc.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import { Subscriber } from '../../Subscriber';
-import { AjaxResponse } from './AjaxObservable';
-
-/**
- * @see {@link ajax}
- *
- * @interface
- * @name AjaxRequest
- * @noimport true
- */
-export class AjaxRequestDoc {
-  /**
-   * @type {string}
-   */
-  url: string = '';
-  /**
-   * @type {number}
-   */
-  body: any = 0;
-  /**
-   * @type {string}
-   */
-  user: string = '';
-  /**
-   * @type {boolean}
-   */
-  async: boolean = false;
-  /**
-   * @type {string}
-   */
-  method: string = '';
-  /**
-   * @type {Object}
-   */
-  headers: Object = null;
-  /**
-   * @type {number}
-   */
-  timeout: number = 0;
-  /**
-   * @type {string}
-   */
-  password: string = '';
-  /**
-   * @type {boolean}
-   */
-  hasContent: boolean = false;
-  /**
-   * @type {boolean}
-   */
-  crossDomain: boolean = false;
-  /**
-   * @type {boolean}
-   */
-  withCredentials: boolean = false;
-  /**
-   * @return {XMLHttpRequest}
-   */
-  createXHR(): XMLHttpRequest {
-    return null;
-  }
-  /**
-   * @type {Subscriber}
-   */
-  progressSubscriber: Subscriber<any> = null;
-  /**
-   * @param {AjaxResponse} response
-   * @return {T}
-   */
-  resultSelector<T>(response: AjaxResponse): T {
-    return null;
-  }
-  /**
-   * @type {string}
-   */
-  responseType: string = '';
-}
diff --git a/node_modules/rxjs/src/internal/observable/dom/WebSocketSubject.ts b/node_modules/rxjs/src/internal/observable/dom/WebSocketSubject.ts
deleted file mode 100644
index 0700382..0000000
--- a/node_modules/rxjs/src/internal/observable/dom/WebSocketSubject.ts
+++ /dev/null
@@ -1,387 +0,0 @@
-import { Subject, AnonymousSubject } from '../../Subject';
-import { Subscriber } from '../../Subscriber';
-import { Observable } from '../../Observable';
-import { Subscription } from '../../Subscription';
-import { Operator } from '../../Operator';
-import { ReplaySubject } from '../../ReplaySubject';
-import { Observer, NextObserver } from '../../types';
-
-/**
- * WebSocketSubjectConfig is a plain Object that allows us to make our
- * webSocket configurable.
- *
- * <span class="informal">Provides flexibility to {@link webSocket}</span>
- *
- * It defines a set of properties to provide custom behavior in specific
- * moments of the socket's lifecycle. When the connection opens we can
- * use `openObserver`, when the connection is closed `closeObserver`, if we
- * are interested in listening for data comming from server: `deserializer`,
- * which allows us to customize the deserialization strategy of data before passing it
- * to the socket client. By default `deserializer` is going to apply `JSON.parse` to each message comming
- * from the Server.
- *
- * ## Example
- * **deserializer**, the default for this property is `JSON.parse` but since there are just two options
- * for incomming data, either be text or binarydata. We can apply a custom deserialization strategy
- * or just simply skip the default behaviour.
- * ```ts
- * import { webSocket } from 'rxjs/webSocket';
- *
- * const wsSubject = webSocket({
- *     url: 'ws://localhost:8081',
- * //Apply any transformation of your choice.
- *     deserializer: ({data}) => data
- * });
- *
- * wsSubject.subscribe(console.log);
- *
- * // Let's suppose we have this on the Server: ws.send("This is a msg from the server")
- * //output
- * //
- * // This is a msg from the server
- * ```
- *
- * **serializer** allows us tom apply custom serialization strategy but for the outgoing messages
- * ```ts
- * import { webSocket } from 'rxjs/webSocket';
- *
- * const wsSubject = webSocket({
- *     url: 'ws://localhost:8081',
- * //Apply any transformation of your choice.
- *     serializer: msg => JSON.stringify({channel: "webDevelopment", msg: msg})
- * });
- *
- * wsSubject.subscribe(() => subject.next("msg to the server"));
- *
- * // Let's suppose we have this on the Server: ws.send("This is a msg from the server")
- * //output
- * //
- * // {"channel":"webDevelopment","msg":"msg to the server"}
- * ```
- *
- * **closeObserver** allows us to set a custom error when an error raise up.
- * ```ts
- * import { webSocket } from 'rxjs/webSocket';
- *
- * const wsSubject = webSocket({
- *     url: 'ws://localhost:8081',
- *     closeObserver: {
-        next(closeEvent) {
-            const customError = { code: 6666, reason: "Custom evil reason" }
-            console.log(`code: ${customError.code}, reason: ${customError.reason}`);
-        }
-    }
- * });
- *
- * //output
- * // code: 6666, reason: Custom evil reason
- * ```
- *
- * **openObserver**, Let's say we need to make some kind of init task before sending/receiving msgs to the
- * webSocket or sending notification that the connection was successful, this is when
- * openObserver is usefull for.
- * ```ts
- * import { webSocket } from 'rxjs/webSocket';
- *
- * const wsSubject = webSocket({
- *     url: 'ws://localhost:8081',
- *     openObserver: {
- *         next: () => {
- *             console.log('connetion ok');
- *         }
- *     },
- * });
- *
- * //output
- * // connetion ok`
- * ```
- * */
-
-export interface WebSocketSubjectConfig<T> {
-  /** The url of the socket server to connect to */
-  url: string;
-  /** The protocol to use to connect */
-  protocol?: string | Array<string>;
-  /** @deprecated use {@link deserializer} */
-  resultSelector?: (e: MessageEvent) => T;
-  /**
-   * A serializer used to create messages from passed values before the
-   * messages are sent to the server. Defaults to JSON.stringify.
-   */
-  serializer?: (value: T) => WebSocketMessage;
-  /**
-   * A deserializer used for messages arriving on the socket from the
-   * server. Defaults to JSON.parse.
-   */
-  deserializer?: (e: MessageEvent) => T;
-  /**
-   * An Observer that watches when open events occur on the underlying web socket.
-   */
-  openObserver?: NextObserver<Event>;
-  /**
-   * An Observer than watches when close events occur on the underlying webSocket
-   */
-  closeObserver?: NextObserver<CloseEvent>;
-  /**
-   * An Observer that watches when a close is about to occur due to
-   * unsubscription.
-   */
-  closingObserver?: NextObserver<void>;
-  /**
-   * A WebSocket constructor to use. This is useful for situations like using a
-   * WebSocket impl in Node (WebSocket is a DOM API), or for mocking a WebSocket
-   * for testing purposes
-   */
-  WebSocketCtor?: { new(url: string, protocols?: string|string[]): WebSocket };
-  /** Sets the `binaryType` property of the underlying WebSocket. */
-  binaryType?: 'blob' | 'arraybuffer';
-}
-
-const DEFAULT_WEBSOCKET_CONFIG: WebSocketSubjectConfig<any> = {
-  url: '',
-  deserializer: (e: MessageEvent) => JSON.parse(e.data),
-  serializer: (value: any) => JSON.stringify(value),
-};
-
-const WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT =
-  'WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }';
-
-export type WebSocketMessage = string | ArrayBuffer | Blob | ArrayBufferView;
-
-export class WebSocketSubject<T> extends AnonymousSubject<T> {
-
-  private _config: WebSocketSubjectConfig<T>;
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _output: Subject<T>;
-
-  private _socket: WebSocket;
-
-  constructor(urlConfigOrSource: string | WebSocketSubjectConfig<T> | Observable<T>, destination?: Observer<T>) {
-    super();
-    if (urlConfigOrSource instanceof Observable) {
-      this.destination = destination;
-      this.source = urlConfigOrSource as Observable<T>;
-    } else {
-      const config = this._config = { ...DEFAULT_WEBSOCKET_CONFIG };
-      this._output = new Subject<T>();
-      if (typeof urlConfigOrSource === 'string') {
-        config.url = urlConfigOrSource;
-      } else {
-        for (let key in urlConfigOrSource) {
-          if (urlConfigOrSource.hasOwnProperty(key)) {
-            config[key] = urlConfigOrSource[key];
-          }
-        }
-      }
-
-      if (!config.WebSocketCtor && WebSocket) {
-        config.WebSocketCtor = WebSocket;
-      } else if (!config.WebSocketCtor) {
-        throw new Error('no WebSocket constructor can be found');
-      }
-      this.destination = new ReplaySubject();
-    }
-  }
-
-  lift<R>(operator: Operator<T, R>): WebSocketSubject<R> {
-    const sock = new WebSocketSubject<R>(this._config as WebSocketSubjectConfig<any>, <any> this.destination);
-    sock.operator = operator;
-    sock.source = this;
-    return sock;
-  }
-
-  private _resetState() {
-    this._socket = null;
-    if (!this.source) {
-      this.destination = new ReplaySubject();
-    }
-    this._output = new Subject<T>();
-  }
-
-  /**
-   * Creates an {@link Observable}, that when subscribed to, sends a message,
-   * defined by the `subMsg` function, to the server over the socket to begin a
-   * subscription to data over that socket. Once data arrives, the
-   * `messageFilter` argument will be used to select the appropriate data for
-   * the resulting Observable. When teardown occurs, either due to
-   * unsubscription, completion or error, a message defined by the `unsubMsg`
-   * argument will be send to the server over the WebSocketSubject.
-   *
-   * @param subMsg A function to generate the subscription message to be sent to
-   * the server. This will still be processed by the serializer in the
-   * WebSocketSubject's config. (Which defaults to JSON serialization)
-   * @param unsubMsg A function to generate the unsubscription message to be
-   * sent to the server at teardown. This will still be processed by the
-   * serializer in the WebSocketSubject's config.
-   * @param messageFilter A predicate for selecting the appropriate messages
-   * from the server for the output stream.
-   */
-  multiplex(subMsg: () => any, unsubMsg: () => any, messageFilter: (value: T) => boolean) {
-    const self = this;
-    return new Observable((observer: Observer<any>) => {
-      try {
-        self.next(subMsg());
-      } catch (err) {
-        observer.error(err);
-      }
-
-      const subscription = self.subscribe(x => {
-        try {
-          if (messageFilter(x)) {
-            observer.next(x);
-          }
-        } catch (err) {
-          observer.error(err);
-        }
-      },
-        err => observer.error(err),
-        () => observer.complete());
-
-      return () => {
-        try {
-          self.next(unsubMsg());
-        } catch (err) {
-          observer.error(err);
-        }
-        subscription.unsubscribe();
-      };
-    });
-  }
-
-  private _connectSocket() {
-    const { WebSocketCtor, protocol, url, binaryType } = this._config;
-    const observer = this._output;
-
-    let socket: WebSocket = null;
-    try {
-      socket = protocol ?
-        new WebSocketCtor(url, protocol) :
-        new WebSocketCtor(url);
-      this._socket = socket;
-      if (binaryType) {
-        this._socket.binaryType = binaryType;
-      }
-    } catch (e) {
-      observer.error(e);
-      return;
-    }
-
-    const subscription = new Subscription(() => {
-      this._socket = null;
-      if (socket && socket.readyState === 1) {
-        socket.close();
-      }
-    });
-
-    socket.onopen = (e: Event) => {
-      const { _socket } = this;
-      if (!_socket) {
-        socket.close();
-        this._resetState();
-        return;
-      }
-      const { openObserver } = this._config;
-      if (openObserver) {
-        openObserver.next(e);
-      }
-
-      const queue = this.destination;
-
-      this.destination = Subscriber.create<T>(
-        (x) => {
-          if (socket.readyState === 1) {
-            try {
-              const { serializer } = this._config;
-              socket.send(serializer(x));
-              } catch (e) {
-              this.destination.error(e);
-            }
-          }
-        },
-        (e) => {
-          const { closingObserver } = this._config;
-          if (closingObserver) {
-            closingObserver.next(undefined);
-          }
-          if (e && e.code) {
-            socket.close(e.code, e.reason);
-          } else {
-            observer.error(new TypeError(WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT));
-          }
-          this._resetState();
-        },
-        () => {
-          const { closingObserver } = this._config;
-          if (closingObserver) {
-            closingObserver.next(undefined);
-          }
-          socket.close();
-          this._resetState();
-        }
-      ) as Subscriber<any>;
-
-      if (queue && queue instanceof ReplaySubject) {
-        subscription.add((<ReplaySubject<T>>queue).subscribe(this.destination));
-      }
-    };
-
-    socket.onerror = (e: Event) => {
-      this._resetState();
-      observer.error(e);
-    };
-
-    socket.onclose = (e: CloseEvent) => {
-      this._resetState();
-      const { closeObserver } = this._config;
-      if (closeObserver) {
-        closeObserver.next(e);
-      }
-      if (e.wasClean) {
-        observer.complete();
-      } else {
-        observer.error(e);
-      }
-    };
-
-    socket.onmessage = (e: MessageEvent) => {
-      try {
-        const { deserializer } = this._config;
-        observer.next(deserializer(e));
-      } catch (err) {
-        observer.error(err);
-      }
-    };
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<T>): Subscription {
-    const { source } = this;
-    if (source) {
-      return source.subscribe(subscriber);
-    }
-    if (!this._socket) {
-      this._connectSocket();
-    }
-    this._output.subscribe(subscriber);
-    subscriber.add(() => {
-      const { _socket } = this;
-      if (this._output.observers.length === 0) {
-        if (_socket && _socket.readyState === 1) {
-          _socket.close();
-        }
-        this._resetState();
-      }
-    });
-    return subscriber;
-  }
-
-  unsubscribe() {
-    const { _socket } = this;
-    if (_socket && _socket.readyState === 1) {
-      _socket.close();
-    }
-    this._resetState();
-    super.unsubscribe();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/observable/dom/ajax.ts b/node_modules/rxjs/src/internal/observable/dom/ajax.ts
deleted file mode 100644
index d0885c1..0000000
--- a/node_modules/rxjs/src/internal/observable/dom/ajax.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import {  AjaxObservable, AjaxCreationMethod  } from './AjaxObservable';
-/**
- * There is an ajax operator on the Rx object.
- *
- * It creates an observable for an Ajax request with either a request object with
- * url, headers, etc or a string for a URL.
- *
- *
- * ## Using ajax() to fetch the response object that is being returned from API.
- * ```ts
- * import { ajax } from 'rxjs/ajax';
- * import { map, catchError } from 'rxjs/operators';
- * import { of } from 'rxjs';
- *
- * const obs$ = ajax(`https://api.github.com/users?per_page=5`).pipe(
- *   map(userResponse => console.log('users: ', userResponse)),
- *   catchError(error => {
- *     console.log('error: ', error);
- *     return of(error);
- *   })
- * );
- *
- * ```
- *
- * ## Using ajax.getJSON() to fetch data from API.
- * ```ts
- * import { ajax } from 'rxjs/ajax';
- * import { map, catchError } from 'rxjs/operators';
- * import { of } from 'rxjs';
- *
- * const obs$ = ajax.getJSON(`https://api.github.com/users?per_page=5`).pipe(
- *   map(userResponse => console.log('users: ', userResponse)),
- *   catchError(error => {
- *     console.log('error: ', error);
- *     return of(error);
- *   })
- * );
- *
- * ```
- *
- * ## Using ajax() with object as argument and method POST with a two seconds delay.
- * ```ts
- * import { ajax } from 'rxjs/ajax';
- * import { of } from 'rxjs';
- *
- * const users = ajax({
- *   url: 'https://httpbin.org/delay/2',
- *   method: 'POST',
- *   headers: {
- *     'Content-Type': 'application/json',
- *     'rxjs-custom-header': 'Rxjs'
- *   },
- *   body: {
- *     rxjs: 'Hello World!'
- *   }
- * }).pipe(
- *   map(response => console.log('response: ', response)),
- *   catchError(error => {
- *     console.log('error: ', error);
- *     return of(error);
- *   })
- * );
- *
- * ```
- *
- * ## Using ajax() to fetch. An error object that is being returned from the request.
- * ```ts
- * import { ajax } from 'rxjs/ajax';
- * import { map, catchError } from 'rxjs/operators';
- * import { of } from 'rxjs';
- *
- * const obs$ = ajax(`https://api.github.com/404`).pipe(
- *   map(userResponse => console.log('users: ', userResponse)),
- *   catchError(error => {
- *     console.log('error: ', error);
- *     return of(error);
- *   })
- * );
- *
- * ```
- */
-export const ajax: AjaxCreationMethod = (() => AjaxObservable.create)();
diff --git a/node_modules/rxjs/src/internal/observable/dom/fetch.ts b/node_modules/rxjs/src/internal/observable/dom/fetch.ts
deleted file mode 100644
index b91f8a7..0000000
--- a/node_modules/rxjs/src/internal/observable/dom/fetch.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-import { Observable } from '../../Observable';
-
-/**
- * Uses [the Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) to
- * make an HTTP request.
- *
- * **WARNING** Parts of the fetch API are still experimental. `AbortController` is
- * required for this implementation to work and use cancellation appropriately.
- *
- * Will automatically set up an internal [AbortController](https://developer.mozilla.org/en-US/docs/Web/API/AbortController)
- * in order to teardown the internal `fetch` when the subscription tears down.
- *
- * If a `signal` is provided via the `init` argument, it will behave like it usually does with
- * `fetch`. If the provided `signal` aborts, the error that `fetch` normally rejects with
- * in that scenario will be emitted as an error from the observable.
- *
- * ### Basic Use
- *
- * ```ts
- * import { of } from 'rxjs';
- * import { fromFetch } from 'rxjs/fetch';
- * import { switchMap, catchError } from 'rxjs/operators';
- *
- * const data$ = fromFetch('https://api.github.com/users?per_page=5').pipe(
- *  switchMap(response => {
- *    if (response.ok) {
- *      // OK return data
- *      return response.json();
- *    } else {
- *      // Server is returning a status requiring the client to try something else.
- *      return of({ error: true, message: `Error ${response.status}` });
- *    }
- *  }),
- *  catchError(err => {
- *    // Network or other error, handle appropriately
- *    console.error(err);
- *    return of({ error: true, message: err.message })
- *  })
- * );
- *
- * data$.subscribe({
- *  next: result => console.log(result),
- *  complete: () => console.log('done')
- * })
- * ```
- *
- * @param input The resource you would like to fetch. Can be a url or a request object.
- * @param init A configuration object for the fetch.
- * [See MDN for more details](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)
- * @returns An Observable, that when subscribed to performs an HTTP request using the native `fetch`
- * function. The {@link Subscription} is tied to an `AbortController` for the the fetch.
- */
-export function fromFetch(input: string | Request, init?: RequestInit): Observable<Response> {
-  return new Observable<Response>(subscriber => {
-    const controller = new AbortController();
-    const signal = controller.signal;
-    let outerSignalHandler: () => void;
-    let abortable = true;
-    let unsubscribed = false;
-
-    if (init) {
-      // If a signal is provided, just have it teardown. It's a cancellation token, basically.
-      if (init.signal) {
-        if (init.signal.aborted) {
-          controller.abort();
-        } else {
-          outerSignalHandler = () => {
-            if (!signal.aborted) {
-              controller.abort();
-            }
-          };
-          init.signal.addEventListener('abort', outerSignalHandler);
-        }
-      }
-      init = { ...init, signal };
-    } else {
-      init = { signal };
-    }
-
-    fetch(input, init).then(response => {
-      abortable = false;
-      subscriber.next(response);
-      subscriber.complete();
-    }).catch(err => {
-      abortable = false;
-      if (!unsubscribed) {
-        // Only forward the error if it wasn't an abort.
-        subscriber.error(err);
-      }
-    });
-
-    return () => {
-      unsubscribed = true;
-      if (abortable) {
-        controller.abort();
-      }
-    };
-  });
-}
diff --git a/node_modules/rxjs/src/internal/observable/dom/webSocket.ts b/node_modules/rxjs/src/internal/observable/dom/webSocket.ts
deleted file mode 100644
index e115607..0000000
--- a/node_modules/rxjs/src/internal/observable/dom/webSocket.ts
+++ /dev/null
@@ -1,156 +0,0 @@
-import { WebSocketSubject, WebSocketSubjectConfig } from './WebSocketSubject';
-
-/**
- * Wrapper around the w3c-compatible WebSocket object provided by the browser.
- *
- * <span class="informal">{@link Subject} that communicates with a server via WebSocket</span>
- *
- * `webSocket` is a factory function that produces a `WebSocketSubject`,
- * which can be used to make WebSocket connection with an arbitrary endpoint.
- * `webSocket` accepts as an argument either a string with url of WebSocket endpoint, or an
- * {@link WebSocketSubjectConfig} object for providing additional configuration, as
- * well as Observers for tracking lifecycle of WebSocket connection.
- *
- * When `WebSocketSubject` is subscribed, it attempts to make a socket connection,
- * unless there is one made already. This means that many subscribers will always listen
- * on the same socket, thus saving resources. If however, two instances are made of `WebSocketSubject`,
- * even if these two were provided with the same url, they will attempt to make separate
- * connections. When consumer of a `WebSocketSubject` unsubscribes, socket connection is closed,
- * only if there are no more subscribers still listening. If after some time a consumer starts
- * subscribing again, connection is reestablished.
- *
- * Once connection is made, whenever a new message comes from the server, `WebSocketSubject` will emit that
- * message as a value in the stream. By default, a message from the socket is parsed via `JSON.parse`. If you
- * want to customize how deserialization is handled (if at all), you can provide custom `resultSelector`
- * function in {@link WebSocketSubject}. When connection closes, stream will complete, provided it happened without
- * any errors. If at any point (starting, maintaining or closing a connection) there is an error,
- * stream will also error with whatever WebSocket API has thrown.
- *
- * By virtue of being a {@link Subject}, `WebSocketSubject` allows for receiving and sending messages from the server. In order
- * to communicate with a connected endpoint, use `next`, `error` and `complete` methods. `next` sends a value to the server, so bear in mind
- * that this value will not be serialized beforehand. Because of This, `JSON.stringify` will have to be called on a value by hand,
- * before calling `next` with a result. Note also that if at the moment of nexting value
- * there is no socket connection (for example no one is subscribing), those values will be buffered, and sent when connection
- * is finally established. `complete` method closes socket connection. `error` does the same,
- * as well as notifying the server that something went wrong via status code and string with details of what happened.
- * Since status code is required in WebSocket API, `WebSocketSubject` does not allow, like regular `Subject`,
- * arbitrary values being passed to the `error` method. It needs to be called with an object that has `code`
- * property with status code number and optional `reason` property with string describing details
- * of an error.
- *
- * Calling `next` does not affect subscribers of `WebSocketSubject` - they have no
- * information that something was sent to the server (unless of course the server
- * responds somehow to a message). On the other hand, since calling `complete` triggers
- * an attempt to close socket connection. If that connection is closed without any errors, stream will
- * complete, thus notifying all subscribers. And since calling `error` closes
- * socket connection as well, just with a different status code for the server, if closing itself proceeds
- * without errors, subscribed Observable will not error, as one might expect, but complete as usual. In both cases
- * (calling `complete` or `error`), if process of closing socket connection results in some errors, *then* stream
- * will error.
- *
- * **Multiplexing**
- *
- * `WebSocketSubject` has an additional operator, not found in other Subjects. It is called `multiplex` and it is
- * used to simulate opening several socket connections, while in reality maintaining only one.
- * For example, an application has both chat panel and real-time notifications about sport news. Since these are two distinct functions,
- * it would make sense to have two separate connections for each. Perhaps there could even be two separate services with WebSocket
- * endpoints, running on separate machines with only GUI combining them together. Having a socket connection
- * for each functionality could become too resource expensive. It is a common pattern to have single
- * WebSocket endpoint that acts as a gateway for the other services (in this case chat and sport news services).
- * Even though there is a single connection in a client app, having the ability to manipulate streams as if it
- * were two separate sockets is desirable. This eliminates manually registering and unregistering in a gateway for
- * given service and filter out messages of interest. This is exactly what `multiplex` method is for.
- *
- * Method accepts three parameters. First two are functions returning subscription and unsubscription messages
- * respectively. These are messages that will be sent to the server, whenever consumer of resulting Observable
- * subscribes and unsubscribes. Server can use them to verify that some kind of messages should start or stop
- * being forwarded to the client. In case of the above example application, after getting subscription message with proper identifier,
- * gateway server can decide that it should connect to real sport news service and start forwarding messages from it.
- * Note that both messages will be sent as returned by the functions, they are by default serialized using JSON.stringify, just
- * as messages pushed via `next`. Also bear in mind that these messages will be sent on *every* subscription and
- * unsubscription. This is potentially dangerous, because one consumer of an Observable may unsubscribe and the server
- * might stop sending messages, since it got unsubscription message. This needs to be handled
- * on the server or using {@link publish} on a Observable returned from 'multiplex'.
- *
- * Last argument to `multiplex` is a `messageFilter` function which should return a boolean. It is used to filter out messages
- * sent by the server to only those that belong to simulated WebSocket stream. For example, server might mark these
- * messages with some kind of string identifier on a message object and `messageFilter` would return `true`
- * if there is such identifier on an object emitted by the socket. Messages which returns `false` in `messageFilter` are simply skipped,
- * and are not passed down the stream.
- *
- * Return value of `multiplex` is an Observable with messages incoming from emulated socket connection. Note that this
- * is not a `WebSocketSubject`, so calling `next` or `multiplex` again will fail. For pushing values to the
- * server, use root `WebSocketSubject`.
- *
- * ### Examples
- * #### Listening for messages from the server
- * ```ts
- * import { webSocket } from "rxjs/webSocket";
- * const subject = webSocket("ws://localhost:8081");
- *
- * subject.subscribe(
- *    msg => console.log('message received: ' + msg), // Called whenever there is a message from the server.
- *    err => console.log(err), // Called if at any point WebSocket API signals some kind of error.
- *    () => console.log('complete') // Called when connection is closed (for whatever reason).
- *  );
- * ```
- *
- * #### Pushing messages to the server
- * ```ts
- * import { webSocket } from "rxjs/webSocket";
- * const subject = webSocket('ws://localhost:8081');
- *
- * subject.subscribe();
- * // Note that at least one consumer has to subscribe to the created subject - otherwise "nexted" values will be just buffered and not sent,
- * // since no connection was established!
- *
- * subject.next({message: 'some message'});
- * // This will send a message to the server once a connection is made. Remember value is serialized with JSON.stringify by default!
- *
- * subject.complete(); // Closes the connection.
- *
- * subject.error({code: 4000, reason: 'I think our app just broke!'});
- * // Also closes the connection, but let's the server know that this closing is caused by some error.
- * ```
- *
- * #### Multiplexing WebSocket
- * ```ts
- * import { webSocket } from "rxjs/webSocket";
- * const subject = webSocket('ws://localhost:8081');
- *
- * const observableA = subject.multiplex(
- *   () => ({subscribe: 'A'}), // When server gets this message, it will start sending messages for 'A'...
- *   () => ({unsubscribe: 'A'}), // ...and when gets this one, it will stop.
- *   message => message.type === 'A' // If the function returns `true` message is passed down the stream. Skipped if the function returns false.
- * );
- *
- * const observableB = subject.multiplex( // And the same goes for 'B'.
- *   () => ({subscribe: 'B'}),
- *   () => ({unsubscribe: 'B'}),
- *   message => message.type === 'B'
- * );
- *
- * const subA = observableA.subscribe(messageForA => console.log(messageForA));
- * // At this moment WebSocket connection is established. Server gets '{"subscribe": "A"}' message and starts sending messages for 'A',
- * // which we log here.
- *
- * const subB = observableB.subscribe(messageForB => console.log(messageForB));
- * // Since we already have a connection, we just send '{"subscribe": "B"}' message to the server. It starts sending messages for 'B',
- * // which we log here.
- *
- * subB.unsubscribe();
- * // Message '{"unsubscribe": "B"}' is sent to the server, which stops sending 'B' messages.
- *
- * subA.unsubscribe();
- * // Message '{"unsubscribe": "A"}' makes the server stop sending messages for 'A'. Since there is no more subscribers to root Subject,
- * // socket connection closes.
- * ```
- *
- *
- * @param {string|WebSocketSubjectConfig} urlConfigOrSource The WebSocket endpoint as an url or an object with
- * configuration and additional Observers.
- * @return {WebSocketSubject} Subject which allows to both send and receive messages via WebSocket connection.
- */
-export function webSocket<T>(urlConfigOrSource: string | WebSocketSubjectConfig<T>): WebSocketSubject<T> {
-  return new WebSocketSubject<T>(urlConfigOrSource);
-}
diff --git a/node_modules/rxjs/src/internal/observable/empty.ts b/node_modules/rxjs/src/internal/observable/empty.ts
deleted file mode 100644
index 179afe6..0000000
--- a/node_modules/rxjs/src/internal/observable/empty.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-
-/**
- * The same Observable instance returned by any call to {@link empty} without a
- * `scheduler`. It is preferrable to use this over `empty()`.
- */
-export const EMPTY = new Observable<never>(subscriber => subscriber.complete());
-
-/**
- * Creates an Observable that emits no items to the Observer and immediately
- * emits a complete notification.
- *
- * <span class="informal">Just emits 'complete', and nothing else.
- * </span>
- *
- * ![](empty.png)
- *
- * This static operator is useful for creating a simple Observable that only
- * emits the complete notification. It can be used for composing with other
- * Observables, such as in a {@link mergeMap}.
- *
- * ## Examples
- * ### Emit the number 7, then complete
- * ```ts
- * import { empty } from 'rxjs';
- * import { startWith } from 'rxjs/operators';
- *
- * const result = empty().pipe(startWith(7));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * ### Map and flatten only odd numbers to the sequence 'a', 'b', 'c'
- * ```ts
- * import { empty, interval, of } from 'rxjs';
- * import { mergeMap } from 'rxjs/operators';
- *
- * const interval$ = interval(1000);
- * const result = interval$.pipe(
- *   mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : empty()),
- * );
- * result.subscribe(x => console.log(x));
- *
- * // Results in the following to the console:
- * // x is equal to the count on the interval eg(0,1,2,3,...)
- * // x will occur every 1000ms
- * // if x % 2 is equal to 1 print abc
- * // if x % 2 is not equal to 1 nothing will be output
- * ```
- *
- * @see {@link Observable}
- * @see {@link never}
- * @see {@link of}
- * @see {@link throwError}
- *
- * @param scheduler A {@link SchedulerLike} to use for scheduling
- * the emission of the complete notification.
- * @return An "empty" Observable: emits only the complete
- * notification.
- * @deprecated Deprecated in favor of using {@link EMPTY} constant, or {@link scheduled} (e.g. `scheduled([], scheduler)`)
- */
-export function empty(scheduler?: SchedulerLike) {
-  return scheduler ? emptyScheduled(scheduler) : EMPTY;
-}
-
-function emptyScheduled(scheduler: SchedulerLike) {
-  return new Observable<never>(subscriber => scheduler.schedule(() => subscriber.complete()));
-}
diff --git a/node_modules/rxjs/src/internal/observable/forkJoin.ts b/node_modules/rxjs/src/internal/observable/forkJoin.ts
deleted file mode 100644
index 400e54f..0000000
--- a/node_modules/rxjs/src/internal/observable/forkJoin.ts
+++ /dev/null
@@ -1,204 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput, ObservedValuesFromArray, ObservedValueOf, SubscribableOrPromise } from '../types';
-import { isArray } from '../util/isArray';
-import { map } from '../operators/map';
-import { isObject } from '../util/isObject';
-import { isObservable } from '../util/isObservable';
-import { from } from './from';
-
-/* tslint:disable:max-line-length */
-
-// forkJoin(a$, b$, c$)
-/** @deprecated Use the version that takes an array of Observables instead */
-export function forkJoin<T>(v1: SubscribableOrPromise<T>): Observable<[T]>;
-/** @deprecated Use the version that takes an array of Observables instead */
-export function forkJoin<T, T2>(v1: ObservableInput<T>, v2: ObservableInput<T2>): Observable<[T, T2]>;
-/** @deprecated Use the version that takes an array of Observables instead */
-export function forkJoin<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>): Observable<[T, T2, T3]>;
-/** @deprecated Use the version that takes an array of Observables instead */
-export function forkJoin<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<[T, T2, T3, T4]>;
-/** @deprecated Use the version that takes an array of Observables instead */
-export function forkJoin<T, T2, T3, T4, T5>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): Observable<[T, T2, T3, T4, T5]>;
-/** @deprecated Use the version that takes an array of Observables instead */
-export function forkJoin<T, T2, T3, T4, T5, T6>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): Observable<[T, T2, T3, T4, T5, T6]>;
-
-// forkJoin([a$, b$, c$]);
-// TODO(benlesh): Uncomment for TS 3.0
-// export function forkJoin(sources: []): Observable<never>;
-export function forkJoin<A>(sources: [ObservableInput<A>]): Observable<[A]>;
-export function forkJoin<A, B>(sources: [ObservableInput<A>, ObservableInput<B>]): Observable<[A, B]>;
-export function forkJoin<A, B, C>(sources: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>]): Observable<[A, B, C]>;
-export function forkJoin<A, B, C, D>(sources: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>]): Observable<[A, B, C, D]>;
-export function forkJoin<A, B, C, D, E>(sources: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>, ObservableInput<E>]): Observable<[A, B, C, D, E]>;
-export function forkJoin<A, B, C, D, E, F>(sources: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>, ObservableInput<E>, ObservableInput<F>]): Observable<[A, B, C, D, E, F]>;
-export function forkJoin<A extends ObservableInput<any>[]>(sources: A): Observable<ObservedValuesFromArray<A>[]>;
-
-// forkJoin({})
-export function forkJoin(sourcesObject: {}): Observable<never>;
-export function forkJoin<T, K extends keyof T>(sourcesObject: T): Observable<{ [K in keyof T]: ObservedValueOf<T[K]> }>;
-
-/** @deprecated resultSelector is deprecated, pipe to map instead */
-export function forkJoin(...args: Array<ObservableInput<any>|Function>): Observable<any>;
-/** @deprecated Use the version that takes an array of Observables instead */
-export function forkJoin<T>(...sources: ObservableInput<T>[]): Observable<T[]>;
-/* tslint:enable:max-line-length */
-
-/**
- * Accepts an `Array` of {@link ObservableInput} or a dictionary `Object` of {@link ObservableInput} and returns
- * an {@link Observable} that emits either an array of values in the exact same order as the passed array,
- * or a dictionary of values in the same shape as the passed dictionary.
- *
- * <span class="informal">Wait for Observables to complete and then combine last values they emitted.</span>
- *
- * ![](forkJoin.png)
- *
- * `forkJoin` is an operator that takes any number of input observables which can be passed either as an array
- * or a dictionary of input observables. If no input observables are provided, resulting stream will complete
- * immediately.
- *
- * `forkJoin` will wait for all passed observables to complete and then it will emit an array or an object with last
- * values from corresponding observables.
- *
- * If you pass an array of `n` observables to the operator, resulting
- * array will have `n` values, where first value is the last thing emitted by the first observable,
- * second value is the last thing emitted by the second observable and so on.
- *
- * If you pass a dictionary of observables to the operator, resulting
- * objects will have the same keys as the dictionary passed, with their last values they've emitted
- * located at the corresponding key.
- *
- * That means `forkJoin` will not emit more than once and it will complete after that. If you need to emit combined
- * values not only at the end of lifecycle of passed observables, but also throughout it, try out {@link combineLatest}
- * or {@link zip} instead.
- *
- * In order for resulting array to have the same length as the number of input observables, whenever any of
- * that observables completes without emitting any value, `forkJoin` will complete at that moment as well
- * and it will not emit anything either, even if it already has some last values from other observables.
- * Conversely, if there is an observable that never completes, `forkJoin` will never complete as well,
- * unless at any point some other observable completes without emitting value, which brings us back to
- * the previous case. Overall, in order for `forkJoin` to emit a value, all observables passed as arguments
- * have to emit something at least once and complete.
- *
- * If any input observable errors at some point, `forkJoin` will error as well and all other observables
- * will be immediately unsubscribed.
- *
- * Optionally `forkJoin` accepts project function, that will be called with values which normally
- * would land in emitted array. Whatever is returned by project function, will appear in output
- * observable instead. This means that default project can be thought of as a function that takes
- * all its arguments and puts them into an array. Note that project function will be called only
- * when output observable is supposed to emit a result.
- *
- * ## Examples
- *
- * ### Use forkJoin with a dictionary of observable inputs
- * ```ts
- * import { forkJoin, of, timer } from 'rxjs';
- *
- * const observable = forkJoin({
- *   foo: of(1, 2, 3, 4),
- *   bar: Promise.resolve(8),
- *   baz: timer(4000),
- * });
- * observable.subscribe({
- *  next: value => console.log(value),
- *  complete: () => console.log('This is how it ends!'),
- * });
- *
- * // Logs:
- * // { foo: 4, bar: 8, baz: 0 } after 4 seconds
- * // "This is how it ends!" immediately after
- * ```
- *
- * ### Use forkJoin with an array of observable inputs
- * ```ts
- * import { forkJoin, of } from 'rxjs';
- *
- * const observable = forkJoin([
- *   of(1, 2, 3, 4),
- *   Promise.resolve(8),
- *   timer(4000),
- * ]);
- * observable.subscribe({
- *  next: value => console.log(value),
- *  complete: () => console.log('This is how it ends!'),
- * });
- *
- * // Logs:
- * // [4, 8, 0] after 4 seconds
- * // "This is how it ends!" immediately after
- * ```
- *
- * @see {@link combineLatest}
- * @see {@link zip}
- *
- * @param {...ObservableInput} sources Any number of Observables provided either as an array or as an arguments
- * passed directly to the operator.
- * @param {function} [project] Function that takes values emitted by input Observables and returns value
- * that will appear in resulting Observable instead of default array.
- * @return {Observable} Observable emitting either an array of last values emitted by passed Observables
- * or value from project function.
- */
-export function forkJoin(
-  ...sources: any[]
-): Observable<any> {
-  if (sources.length === 1) {
-    const first = sources[0];
-    if (isArray(first)) {
-      return forkJoinInternal(first, null);
-    }
-    // TODO(benlesh): isObservable check will not be necessary when deprecated path is removed.
-    if (isObject(first) && Object.getPrototypeOf(first) === Object.prototype) {
-      const keys = Object.keys(first);
-      return forkJoinInternal(keys.map(key => first[key]), keys);
-    }
-  }
-
-  // DEPRECATED PATHS BELOW HERE
-  if (typeof sources[sources.length - 1] === 'function') {
-    const resultSelector = sources.pop() as Function;
-    sources = (sources.length === 1 && isArray(sources[0])) ? sources[0] : sources;
-    return forkJoinInternal(sources, null).pipe(
-      map((args: any[]) => resultSelector(...args))
-    );
-  }
-
-  return forkJoinInternal(sources, null);
-}
-
-function forkJoinInternal(sources: ObservableInput<any>[], keys: string[] | null): Observable<any> {
-  return new Observable(subscriber => {
-    const len = sources.length;
-    if (len === 0) {
-      subscriber.complete();
-      return;
-    }
-    const values = new Array(len);
-    let completed = 0;
-    let emitted = 0;
-    for (let i = 0; i < len; i++) {
-      const source = from(sources[i]);
-      let hasValue = false;
-      subscriber.add(source.subscribe({
-        next: value => {
-          if (!hasValue) {
-            hasValue = true;
-            emitted++;
-          }
-          values[i] = value;
-        },
-        error: err => subscriber.error(err),
-        complete: () => {
-          completed++;
-          if (completed === len || !hasValue) {
-            if (emitted === len) {
-              subscriber.next(keys ?
-                keys.reduce((result, key, i) => (result[key] = values[i], result), {}) :
-                values);
-            }
-            subscriber.complete();
-          }
-        }
-      }));
-    }
-  });
-}
diff --git a/node_modules/rxjs/src/internal/observable/from.ts b/node_modules/rxjs/src/internal/observable/from.ts
deleted file mode 100644
index 697e928..0000000
--- a/node_modules/rxjs/src/internal/observable/from.ts
+++ /dev/null
@@ -1,118 +0,0 @@
-import { Observable } from '../Observable';
-import { subscribeTo } from '../util/subscribeTo';
-import { ObservableInput, SchedulerLike, ObservedValueOf } from '../types';
-import { scheduled } from '../scheduled/scheduled';
-
-export function from<O extends ObservableInput<any>>(input: O): Observable<ObservedValueOf<O>>;
-/** @deprecated use {@link scheduled} instead. */
-export function from<O extends ObservableInput<any>>(input: O, scheduler: SchedulerLike): Observable<ObservedValueOf<O>>;
-
-/**
- * Creates an Observable from an Array, an array-like object, a Promise, an iterable object, or an Observable-like object.
- *
- * <span class="informal">Converts almost anything to an Observable.</span>
- *
- * ![](from.png)
- *
- * `from` converts various other objects and data types into Observables. It also converts a Promise, an array-like, or an
- * <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable" target="_blank">iterable</a>
- * object into an Observable that emits the items in that promise, array, or iterable. A String, in this context, is treated
- * as an array of characters. Observable-like objects (contains a function named with the ES2015 Symbol for Observable) can also be
- * converted through this operator.
- *
- * ## Examples
- *
- * ### Converts an array to an Observable
- *
- * ```ts
- * import { from } from 'rxjs';
- *
- * const array = [10, 20, 30];
- * const result = from(array);
- *
- * result.subscribe(x => console.log(x));
- *
- * // Logs:
- * // 10
- * // 20
- * // 30
- * ```
- *
- * ---
- *
- * ### Convert an infinite iterable (from a generator) to an Observable
- *
- * ```ts
- * import { from } from 'rxjs';
- * import { take } from 'rxjs/operators';
- *
- * function* generateDoubles(seed) {
- *    let i = seed;
- *    while (true) {
- *      yield i;
- *      i = 2 * i; // double it
- *    }
- * }
- *
- * const iterator = generateDoubles(3);
- * const result = from(iterator).pipe(take(10));
- *
- * result.subscribe(x => console.log(x));
- *
- * // Logs:
- * // 3
- * // 6
- * // 12
- * // 24
- * // 48
- * // 96
- * // 192
- * // 384
- * // 768
- * // 1536
- * ```
- *
- * ---
- *
- * ### With async scheduler
- *
- * ```ts
- * import { from, asyncScheduler } from 'rxjs';
- *
- * console.log('start');
- *
- * const array = [10, 20, 30];
- * const result = from(array, asyncScheduler);
- *
- * result.subscribe(x => console.log(x));
- *
- * console.log('end');
- *
- * // Logs:
- * // start
- * // end
- * // 10
- * // 20
- * // 30
- * ```
- *
- * @see {@link fromEvent}
- * @see {@link fromEventPattern}
- *
- * @param {ObservableInput<T>} A subscription object, a Promise, an Observable-like,
- * an Array, an iterable, or an array-like object to be converted.
- * @param {SchedulerLike} An optional {@link SchedulerLike} on which to schedule the emission of values.
- * @return {Observable<T>}
- * @name from
- * @owner Observable
- */
-export function from<T>(input: ObservableInput<T>, scheduler?: SchedulerLike): Observable<T> {
-  if (!scheduler) {
-    if (input instanceof Observable) {
-      return input;
-    }
-    return new Observable<T>(subscribeTo(input));
-  } else {
-    return scheduled(input, scheduler);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/observable/fromArray.ts b/node_modules/rxjs/src/internal/observable/fromArray.ts
deleted file mode 100644
index b5953be..0000000
--- a/node_modules/rxjs/src/internal/observable/fromArray.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-import { subscribeToArray } from '../util/subscribeToArray';
-import { scheduleArray } from '../scheduled/scheduleArray';
-
-export function fromArray<T>(input: ArrayLike<T>, scheduler?: SchedulerLike) {
-  if (!scheduler) {
-    return new Observable<T>(subscribeToArray(input));
-  } else {
-    return scheduleArray(input, scheduler);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/observable/fromEvent.ts b/node_modules/rxjs/src/internal/observable/fromEvent.ts
deleted file mode 100644
index 015f56c..0000000
--- a/node_modules/rxjs/src/internal/observable/fromEvent.ts
+++ /dev/null
@@ -1,245 +0,0 @@
-import { Observable } from '../Observable';
-import { isArray } from '../util/isArray';
-import { isFunction } from '../util/isFunction';
-import { Subscriber } from '../Subscriber';
-import { map } from '../operators/map';
-
-const toString: Function = (() => Object.prototype.toString)();
-
-export interface NodeStyleEventEmitter {
-  addListener: (eventName: string | symbol, handler: NodeEventHandler) => this;
-  removeListener: (eventName: string | symbol, handler: NodeEventHandler) => this;
-}
-
-export type NodeEventHandler = (...args: any[]) => void;
-
-// For APIs that implement `addListener` and `removeListener` methods that may
-// not use the same arguments or return EventEmitter values
-// such as React Native
-export interface NodeCompatibleEventEmitter {
-  addListener: (eventName: string, handler: NodeEventHandler) => void | {};
-  removeListener: (eventName: string, handler: NodeEventHandler) => void | {};
-}
-
-export interface JQueryStyleEventEmitter {
-  on: (eventName: string, handler: Function) => void;
-  off: (eventName: string, handler: Function) => void;
-}
-
-export interface HasEventTargetAddRemove<E> {
-  addEventListener(type: string, listener: ((evt: E) => void) | null, options?: boolean | AddEventListenerOptions): void;
-  removeEventListener(type: string, listener?: ((evt: E) => void) | null, options?: EventListenerOptions | boolean): void;
-}
-
-export type EventTargetLike<T> = HasEventTargetAddRemove<T> | NodeStyleEventEmitter | NodeCompatibleEventEmitter | JQueryStyleEventEmitter;
-
-export type FromEventTarget<T> = EventTargetLike<T> | ArrayLike<EventTargetLike<T>>;
-
-export interface EventListenerOptions {
-  capture?: boolean;
-  passive?: boolean;
-  once?: boolean;
-}
-
-export interface AddEventListenerOptions extends EventListenerOptions {
-  once?: boolean;
-  passive?: boolean;
-}
-
-/* tslint:disable:max-line-length */
-export function fromEvent<T>(target: FromEventTarget<T>, eventName: string): Observable<T>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function fromEvent<T>(target: FromEventTarget<T>, eventName: string, resultSelector: (...args: any[]) => T): Observable<T>;
-export function fromEvent<T>(target: FromEventTarget<T>, eventName: string, options: EventListenerOptions): Observable<T>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function fromEvent<T>(target: FromEventTarget<T>, eventName: string, options: EventListenerOptions, resultSelector: (...args: any[]) => T): Observable<T>;
-/* tslint:enable:max-line-length */
-
-/**
- * Creates an Observable that emits events of a specific type coming from the
- * given event target.
- *
- * <span class="informal">Creates an Observable from DOM events, or Node.js
- * EventEmitter events or others.</span>
- *
- * ![](fromEvent.png)
- *
- * `fromEvent` accepts as a first argument event target, which is an object with methods
- * for registering event handler functions. As a second argument it takes string that indicates
- * type of event we want to listen for. `fromEvent` supports selected types of event targets,
- * which are described in detail below. If your event target does not match any of the ones listed,
- * you should use {@link fromEventPattern}, which can be used on arbitrary APIs.
- * When it comes to APIs supported by `fromEvent`, their methods for adding and removing event
- * handler functions have different names, but they all accept a string describing event type
- * and function itself, which will be called whenever said event happens.
- *
- * Every time resulting Observable is subscribed, event handler function will be registered
- * to event target on given event type. When that event fires, value
- * passed as a first argument to registered function will be emitted by output Observable.
- * When Observable is unsubscribed, function will be unregistered from event target.
- *
- * Note that if event target calls registered function with more than one argument, second
- * and following arguments will not appear in resulting stream. In order to get access to them,
- * you can pass to `fromEvent` optional project function, which will be called with all arguments
- * passed to event handler. Output Observable will then emit value returned by project function,
- * instead of the usual value.
- *
- * Remember that event targets listed below are checked via duck typing. It means that
- * no matter what kind of object you have and no matter what environment you work in,
- * you can safely use `fromEvent` on that object if it exposes described methods (provided
- * of course they behave as was described above). So for example if Node.js library exposes
- * event target which has the same method names as DOM EventTarget, `fromEvent` is still
- * a good choice.
- *
- * If the API you use is more callback then event handler oriented (subscribed
- * callback function fires only once and thus there is no need to manually
- * unregister it), you should use {@link bindCallback} or {@link bindNodeCallback}
- * instead.
- *
- * `fromEvent` supports following types of event targets:
- *
- * **DOM EventTarget**
- *
- * This is an object with `addEventListener` and `removeEventListener` methods.
- *
- * In the browser, `addEventListener` accepts - apart from event type string and event
- * handler function arguments - optional third parameter, which is either an object or boolean,
- * both used for additional configuration how and when passed function will be called. When
- * `fromEvent` is used with event target of that type, you can provide this values
- * as third parameter as well.
- *
- * **Node.js EventEmitter**
- *
- * An object with `addListener` and `removeListener` methods.
- *
- * **JQuery-style event target**
- *
- * An object with `on` and `off` methods
- *
- * **DOM NodeList**
- *
- * List of DOM Nodes, returned for example by `document.querySelectorAll` or `Node.childNodes`.
- *
- * Although this collection is not event target in itself, `fromEvent` will iterate over all Nodes
- * it contains and install event handler function in every of them. When returned Observable
- * is unsubscribed, function will be removed from all Nodes.
- *
- * **DOM HtmlCollection**
- *
- * Just as in case of NodeList it is a collection of DOM nodes. Here as well event handler function is
- * installed and removed in each of elements.
- *
- *
- * ## Examples
- * ### Emits clicks happening on the DOM document
- * ```ts
- * import { fromEvent } from 'rxjs';
- *
- * const clicks = fromEvent(document, 'click');
- * clicks.subscribe(x => console.log(x));
- *
- * // Results in:
- * // MouseEvent object logged to console every time a click
- * // occurs on the document.
- * ```
- *
- * ### Use addEventListener with capture option
- * ```ts
- * import { fromEvent } from 'rxjs';
- *
- * const clicksInDocument = fromEvent(document, 'click', true); // note optional configuration parameter
- *                                                              // which will be passed to addEventListener
- * const clicksInDiv = fromEvent(someDivInDocument, 'click');
- *
- * clicksInDocument.subscribe(() => console.log('document'));
- * clicksInDiv.subscribe(() => console.log('div'));
- *
- * // By default events bubble UP in DOM tree, so normally
- * // when we would click on div in document
- * // "div" would be logged first and then "document".
- * // Since we specified optional `capture` option, document
- * // will catch event when it goes DOWN DOM tree, so console
- * // will log "document" and then "div".
- * ```
- *
- * @see {@link bindCallback}
- * @see {@link bindNodeCallback}
- * @see {@link fromEventPattern}
- *
- * @param {FromEventTarget<T>} target The DOM EventTarget, Node.js
- * EventEmitter, JQuery-like event target, NodeList or HTMLCollection to attach the event handler to.
- * @param {string} eventName The event name of interest, being emitted by the
- * `target`.
- * @param {EventListenerOptions} [options] Options to pass through to addEventListener
- * @return {Observable<T>}
- * @name fromEvent
- */
-export function fromEvent<T>(
-  target: FromEventTarget<T>,
-  eventName: string,
-  options?: EventListenerOptions | ((...args: any[]) => T),
-  resultSelector?: ((...args: any[]) => T)
-): Observable<T> {
-
-  if (isFunction(options)) {
-    // DEPRECATED PATH
-    resultSelector = options;
-    options = undefined;
-  }
-  if (resultSelector) {
-    // DEPRECATED PATH
-    return fromEvent<T>(target, eventName, <EventListenerOptions | undefined>options).pipe(
-      map(args => isArray(args) ? resultSelector(...args) : resultSelector(args))
-    );
-  }
-
-  return new Observable<T>(subscriber => {
-    function handler(e: T) {
-      if (arguments.length > 1) {
-        subscriber.next(Array.prototype.slice.call(arguments));
-      } else {
-        subscriber.next(e);
-      }
-    }
-    setupSubscription(target, eventName, handler, subscriber, options as EventListenerOptions);
-  });
-}
-
-function setupSubscription<T>(sourceObj: FromEventTarget<T>, eventName: string,
-                              handler: (...args: any[]) => void, subscriber: Subscriber<T>,
-                              options?: EventListenerOptions) {
-  let unsubscribe: () => void;
-  if (isEventTarget(sourceObj)) {
-    const source = sourceObj;
-    sourceObj.addEventListener(eventName, handler, options);
-    unsubscribe = () => source.removeEventListener(eventName, handler, options);
-  } else if (isJQueryStyleEventEmitter(sourceObj)) {
-    const source = sourceObj;
-    sourceObj.on(eventName, handler);
-    unsubscribe = () => source.off(eventName, handler);
-  } else if (isNodeStyleEventEmitter(sourceObj)) {
-    const source = sourceObj;
-    sourceObj.addListener(eventName, handler as NodeEventHandler);
-    unsubscribe = () => source.removeListener(eventName, handler as NodeEventHandler);
-  } else if (sourceObj && (sourceObj as any).length) {
-    for (let i = 0, len = (sourceObj as any).length; i < len; i++) {
-      setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
-    }
-  } else {
-    throw new TypeError('Invalid event target');
-  }
-
-  subscriber.add(unsubscribe);
-}
-
-function isNodeStyleEventEmitter(sourceObj: any): sourceObj is NodeStyleEventEmitter {
-  return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';
-}
-
-function isJQueryStyleEventEmitter(sourceObj: any): sourceObj is JQueryStyleEventEmitter {
-  return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';
-}
-
-function isEventTarget(sourceObj: any): sourceObj is HasEventTargetAddRemove<any> {
-  return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
-}
diff --git a/node_modules/rxjs/src/internal/observable/fromEventPattern.ts b/node_modules/rxjs/src/internal/observable/fromEventPattern.ts
deleted file mode 100644
index f83b8d4..0000000
--- a/node_modules/rxjs/src/internal/observable/fromEventPattern.ts
+++ /dev/null
@@ -1,169 +0,0 @@
-import { Observable } from '../Observable';
-import { isArray } from '../util/isArray';
-import { isFunction } from '../util/isFunction';
-import { NodeEventHandler } from './fromEvent';
-import { map } from '../operators/map';
-
-/* tslint:disable:max-line-length */
-export function fromEventPattern<T>(addHandler: (handler: NodeEventHandler) => any, removeHandler?: (handler: NodeEventHandler, signal?: any) => void): Observable<T>;
-/** @deprecated resultSelector no longer supported, pipe to map instead */
-export function fromEventPattern<T>(addHandler: (handler: NodeEventHandler) => any, removeHandler?: (handler: NodeEventHandler, signal?: any) => void, resultSelector?: (...args: any[]) => T): Observable<T>;
-/* tslint:enable:max-line-length */
-
-/**
- * Creates an Observable from an arbitrary API for registering event handlers.
- *
- * <span class="informal">When that method for adding event handler was something {@link fromEvent}
- * was not prepared for.</span>
- *
- * ![](fromEventPattern.png)
- *
- * `fromEventPattern` allows you to convert into an Observable any API that supports registering handler functions
- * for events. It is similar to {@link fromEvent}, but far
- * more flexible. In fact, all use cases of {@link fromEvent} could be easily handled by
- * `fromEventPattern` (although in slightly more verbose way).
- *
- * This operator accepts as a first argument an `addHandler` function, which will be injected with
- * handler parameter. That handler is actually an event handler function that you now can pass
- * to API expecting it. `addHandler` will be called whenever Observable
- * returned by the operator is subscribed, so registering handler in API will not
- * necessarily happen when `fromEventPattern` is called.
- *
- * After registration, every time an event that we listen to happens,
- * Observable returned by `fromEventPattern` will emit value that event handler
- * function was called with. Note that if event handler was called with more
- * then one argument, second and following arguments will not appear in the Observable.
- *
- * If API you are using allows to unregister event handlers as well, you can pass to `fromEventPattern`
- * another function - `removeHandler` - as a second parameter. It will be injected
- * with the same handler function as before, which now you can use to unregister
- * it from the API. `removeHandler` will be called when consumer of resulting Observable
- * unsubscribes from it.
- *
- * In some APIs unregistering is actually handled differently. Method registering an event handler
- * returns some kind of token, which is later used to identify which function should
- * be unregistered or it itself has method that unregisters event handler.
- * If that is the case with your API, make sure token returned
- * by registering method is returned by `addHandler`. Then it will be passed
- * as a second argument to `removeHandler`, where you will be able to use it.
- *
- * If you need access to all event handler parameters (not only the first one),
- * or you need to transform them in any way, you can call `fromEventPattern` with optional
- * third parameter - project function which will accept all arguments passed to
- * event handler when it is called. Whatever is returned from project function will appear on
- * resulting stream instead of usual event handlers first argument. This means
- * that default project can be thought of as function that takes its first parameter
- * and ignores the rest.
- *
- * ## Example
- * ### Emits clicks happening on the DOM document
- *
- * ```ts
- * import { fromEventPattern } from 'rxjs';
- *
- * function addClickHandler(handler) {
- *   document.addEventListener('click', handler);
- * }
- *
- * function removeClickHandler(handler) {
- *   document.removeEventListener('click', handler);
- * }
- *
- * const clicks = fromEventPattern(
- *   addClickHandler,
- *   removeClickHandler
- * );
- * clicks.subscribe(x => console.log(x));
- *
- * // Whenever you click anywhere in the browser, DOM MouseEvent
- * // object will be logged.
- * ```
- *
- * ## Example
- * ### Use with API that returns cancellation token
- *
- * ```ts
- * import { fromEventPattern } from 'rxjs';
- *
- * const token = someAPI.registerEventHandler(function() {});
- * someAPI.unregisterEventHandler(token); // this APIs cancellation method accepts
- *                                        // not handler itself, but special token.
- *
- * const someAPIObservable = fromEventPattern(
- *   function(handler) { return someAPI.registerEventHandler(handler); }, // Note that we return the token here...
- *   function(handler, token) { someAPI.unregisterEventHandler(token); }  // ...to then use it here.
- * );
- * ```
- *
- * ## Example
- * ### Use with project function
- *
- * ```ts
- * import { fromEventPattern } from 'rxjs';
- *
- * someAPI.registerEventHandler((eventType, eventMessage) => {
- *   console.log(eventType, eventMessage); // Logs "EVENT_TYPE" "EVENT_MESSAGE" to console.
- * });
- *
- * const someAPIObservable = fromEventPattern(
- *   handler => someAPI.registerEventHandler(handler),
- *   handler => someAPI.unregisterEventHandler(handler)
- *   (eventType, eventMessage) => eventType + " --- " + eventMessage // without that function only "EVENT_TYPE"
- * );                                                                // would be emitted by the Observable
- *
- * someAPIObservable.subscribe(value => console.log(value));
- *
- * // Logs:
- * // "EVENT_TYPE --- EVENT_MESSAGE"
- * ```
- *
- * @see {@link fromEvent}
- * @see {@link bindCallback}
- * @see {@link bindNodeCallback}
- *
- * @param {function(handler: Function): any} addHandler A function that takes
- * a `handler` function as argument and attaches it somehow to the actual
- * source of events.
- * @param {function(handler: Function, token?: any): void} [removeHandler] A function that
- * takes a `handler` function as an argument and removes it from the event source. If `addHandler`
- * returns some kind of token, `removeHandler` function will have it as a second parameter.
- * @param {function(...args: any): T} [project] A function to
- * transform results. It takes the arguments from the event handler and
- * should return a single value.
- * @return {Observable<T>} Observable which, when an event happens, emits first parameter
- * passed to registered event handler. Alternatively it emits whatever project function returns
- * at that moment.
- * @static true
- * @name fromEventPattern
- * @owner Observable
- */
-
-export function fromEventPattern<T>(addHandler: (handler: NodeEventHandler) => any,
-                                    removeHandler?: (handler: NodeEventHandler, signal?: any) => void,
-                                    resultSelector?: (...args: any[]) => T): Observable<T | T[]> {
-
-  if (resultSelector) {
-    // DEPRECATED PATH
-    return fromEventPattern<T>(addHandler, removeHandler).pipe(
-      map(args => isArray(args) ? resultSelector(...args) : resultSelector(args))
-    );
-  }
-
-  return new Observable<T | T[]>(subscriber => {
-    const handler = (...e: T[]) => subscriber.next(e.length === 1 ? e[0] : e);
-
-    let retValue: any;
-    try {
-      retValue = addHandler(handler);
-    } catch (err) {
-      subscriber.error(err);
-      return undefined;
-    }
-
-    if (!isFunction(removeHandler)) {
-      return undefined;
-    }
-
-    return () => removeHandler(handler, retValue) ;
-  });
-}
diff --git a/node_modules/rxjs/src/internal/observable/fromIterable.ts b/node_modules/rxjs/src/internal/observable/fromIterable.ts
deleted file mode 100644
index e7ffd2b..0000000
--- a/node_modules/rxjs/src/internal/observable/fromIterable.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-import { subscribeToIterable } from '../util/subscribeToIterable';
-import { scheduleIterable } from '../scheduled/scheduleIterable';
-
-export function fromIterable<T>(input: Iterable<T>, scheduler?: SchedulerLike) {
-  if (!input) {
-    throw new Error('Iterable cannot be null');
-  }
-  if (!scheduler) {
-    return new Observable<T>(subscribeToIterable(input));
-  } else {
-    return scheduleIterable(input, scheduler);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/observable/fromObservable.ts b/node_modules/rxjs/src/internal/observable/fromObservable.ts
deleted file mode 100644
index 6a297b4..0000000
--- a/node_modules/rxjs/src/internal/observable/fromObservable.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Observable } from '../Observable';
-import { subscribeToObservable } from '../util/subscribeToObservable';
-import { InteropObservable, SchedulerLike } from '../types';
-import { scheduleObservable } from '../scheduled/scheduleObservable';
-
-export function fromObservable<T>(input: InteropObservable<T>, scheduler?: SchedulerLike) {
-  if (!scheduler) {
-    return new Observable<T>(subscribeToObservable(input));
-  } else {
-    return scheduleObservable(input, scheduler);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/observable/fromPromise.ts b/node_modules/rxjs/src/internal/observable/fromPromise.ts
deleted file mode 100644
index 28ebef6..0000000
--- a/node_modules/rxjs/src/internal/observable/fromPromise.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-import { subscribeToPromise } from '../util/subscribeToPromise';
-import { schedulePromise } from '../scheduled/schedulePromise';
-
-export function fromPromise<T>(input: PromiseLike<T>, scheduler?: SchedulerLike) {
-  if (!scheduler) {
-    return new Observable<T>(subscribeToPromise(input));
-  } else {
-    return schedulePromise(input, scheduler);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/observable/generate.ts b/node_modules/rxjs/src/internal/observable/generate.ts
deleted file mode 100644
index c160c18..0000000
--- a/node_modules/rxjs/src/internal/observable/generate.ts
+++ /dev/null
@@ -1,379 +0,0 @@
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { identity } from '../util/identity';
-import { SchedulerAction, SchedulerLike } from '../types';
-import { isScheduler } from '../util/isScheduler';
-
-export type ConditionFunc<S> = (state: S) => boolean;
-export type IterateFunc<S> = (state: S) => S;
-export type ResultFunc<S, T> = (state: S) => T;
-
-interface SchedulerState<T, S> {
-  needIterate?: boolean;
-  state: S;
-  subscriber: Subscriber<T>;
-  condition?: ConditionFunc<S>;
-  iterate: IterateFunc<S>;
-  resultSelector: ResultFunc<S, T>;
-}
-
-export interface GenerateBaseOptions<S> {
-  /**
-   * Initial state.
-   */
-  initialState: S;
-  /**
-   * Condition function that accepts state and returns boolean.
-   * When it returns false, the generator stops.
-   * If not specified, a generator never stops.
-   */
-  condition?: ConditionFunc<S>;
-  /**
-   * Iterate function that accepts state and returns new state.
-   */
-  iterate: IterateFunc<S>;
-  /**
-   * SchedulerLike to use for generation process.
-   * By default, a generator starts immediately.
-   */
-  scheduler?: SchedulerLike;
-}
-
-export interface GenerateOptions<T, S> extends GenerateBaseOptions<S> {
-  /**
-   * Result selection function that accepts state and returns a value to emit.
-   */
-  resultSelector: ResultFunc<S, T>;
-}
-
-/**
- * Generates an observable sequence by running a state-driven loop
- * producing the sequence's elements, using the specified scheduler
- * to send out observer messages.
- *
- * ![](generate.png)
- *
- * @example <caption>Produces sequence of 0, 1, 2, ... 9, then completes.</caption>
- * const res = generate(0, x => x < 10, x => x + 1, x => x);
- *
- * @example <caption>Using asap scheduler, produces sequence of 2, 3, 5, then completes.</caption>
- * const res = generate(1, x => x < 5, x => x * 2, x => x + 1, asap);
- *
- * @see {@link from}
- * @see {@link Observable}
- *
- * @param {S} initialState Initial state.
- * @param {function (state: S): boolean} condition Condition to terminate generation (upon returning false).
- * @param {function (state: S): S} iterate Iteration step function.
- * @param {function (state: S): T} resultSelector Selector function for results produced in the sequence. (deprecated)
- * @param {SchedulerLike} [scheduler] A {@link SchedulerLike} on which to run the generator loop. If not provided, defaults to emit immediately.
- * @returns {Observable<T>} The generated sequence.
- */
-  export function generate<T, S>(initialState: S,
-                                 condition: ConditionFunc<S>,
-                                 iterate: IterateFunc<S>,
-                                 resultSelector: ResultFunc<S, T>,
-                                 scheduler?: SchedulerLike): Observable<T>;
-
-/**
- * Generates an Observable by running a state-driven loop
- * that emits an element on each iteration.
- *
- * <span class="informal">Use it instead of nexting values in a for loop.</span>
- *
- * <img src="./img/generate.png" width="100%">
- *
- * `generate` allows you to create stream of values generated with a loop very similar to
- * traditional for loop. First argument of `generate` is a beginning value. Second argument
- * is a function that accepts this value and tests if some condition still holds. If it does,
- * loop continues, if not, it stops. Third value is a function which takes previously defined
- * value and modifies it in some way on each iteration. Note how these three parameters
- * are direct equivalents of three expressions in regular for loop: first expression
- * initializes some state (for example numeric index), second tests if loop can make next
- * iteration (for example if index is lower than 10) and third states how defined value
- * will be modified on every step (index will be incremented by one).
- *
- * Return value of a `generate` operator is an Observable that on each loop iteration
- * emits a value. First, condition function is ran. If it returned true, Observable
- * emits currently stored value (initial value at the first iteration) and then updates
- * that value with iterate function. If at some point condition returned false, Observable
- * completes at that moment.
- *
- * Optionally you can pass fourth parameter to `generate` - a result selector function which allows you
- * to immediately map value that would normally be emitted by an Observable.
- *
- * If you find three anonymous functions in `generate` call hard to read, you can provide
- * single object to the operator instead. That object has properties: `initialState`,
- * `condition`, `iterate` and `resultSelector`, which should have respective values that you
- * would normally pass to `generate`. `resultSelector` is still optional, but that form
- * of calling `generate` allows you to omit `condition` as well. If you omit it, that means
- * condition always holds, so output Observable will never complete.
- *
- * Both forms of `generate` can optionally accept a scheduler. In case of multi-parameter call,
- * scheduler simply comes as a last argument (no matter if there is resultSelector
- * function or not). In case of single-parameter call, you can provide it as a
- * `scheduler` property on object passed to the operator. In both cases scheduler decides when
- * next iteration of the loop will happen and therefore when next value will be emitted
- * by the Observable. For example to ensure that each value is pushed to the observer
- * on separate task in event loop, you could use `async` scheduler. Note that
- * by default (when no scheduler is passed) values are simply emitted synchronously.
- *
- *
- * @example <caption>Use with condition and iterate functions.</caption>
- * const generated = generate(0, x => x < 3, x => x + 1);
- *
- * generated.subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('Yo!')
- * );
- *
- * // Logs:
- * // 0
- * // 1
- * // 2
- * // "Yo!"
- *
- *
- * @example <caption>Use with condition, iterate and resultSelector functions.</caption>
- * const generated = generate(0, x => x < 3, x => x + 1, x => x * 1000);
- *
- * generated.subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('Yo!')
- * );
- *
- * // Logs:
- * // 0
- * // 1000
- * // 2000
- * // "Yo!"
- *
- *
- * @example <caption>Use with options object.</caption>
- * const generated = generate({
- *   initialState: 0,
- *   condition(value) { return value < 3; },
- *   iterate(value) { return value + 1; },
- *   resultSelector(value) { return value * 1000; }
- * });
- *
- * generated.subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('Yo!')
- * );
- *
- * // Logs:
- * // 0
- * // 1000
- * // 2000
- * // "Yo!"
- *
- * @example <caption>Use options object without condition function.</caption>
- * const generated = generate({
- *   initialState: 0,
- *   iterate(value) { return value + 1; },
- *   resultSelector(value) { return value * 1000; }
- * });
- *
- * generated.subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('Yo!') // This will never run.
- * );
- *
- * // Logs:
- * // 0
- * // 1000
- * // 2000
- * // 3000
- * // ...and never stops.
- *
- *
- * @see {@link from}
- * @see {@link index/Observable.create}
- *
- * @param {S} initialState Initial state.
- * @param {function (state: S): boolean} condition Condition to terminate generation (upon returning false).
- * @param {function (state: S): S} iterate Iteration step function.
- * @param {function (state: S): T} [resultSelector] Selector function for results produced in the sequence.
- * @param {Scheduler} [scheduler] A {@link Scheduler} on which to run the generator loop. If not provided, defaults to emitting immediately.
- * @return {Observable<T>} The generated sequence.
- */
-export function generate<S>(initialState: S,
-                            condition: ConditionFunc<S>,
-                            iterate: IterateFunc<S>,
-                            scheduler?: SchedulerLike): Observable<S>;
-
-/**
- * Generates an observable sequence by running a state-driven loop
- * producing the sequence's elements, using the specified scheduler
- * to send out observer messages.
- * The overload accepts options object that might contain initial state, iterate,
- * condition and scheduler.
- *
- * ![](generate.png)
- *
- * @example <caption>Produces sequence of 0, 1, 2, ... 9, then completes.</caption>
- * const res = generate({
- *   initialState: 0,
- *   condition: x => x < 10,
- *   iterate: x => x + 1,
- * });
- *
- * @see {@link from}
- * @see {@link Observable}
- *
- * @param {GenerateBaseOptions<S>} options Object that must contain initialState, iterate and might contain condition and scheduler.
- * @returns {Observable<S>} The generated sequence.
- */
-export function generate<S>(options: GenerateBaseOptions<S>): Observable<S>;
-
-/**
- * Generates an observable sequence by running a state-driven loop
- * producing the sequence's elements, using the specified scheduler
- * to send out observer messages.
- * The overload accepts options object that might contain initial state, iterate,
- * condition, result selector and scheduler.
- *
- * ![](generate.png)
- *
- * @example <caption>Produces sequence of 0, 1, 2, ... 9, then completes.</caption>
- * const res = generate({
- *   initialState: 0,
- *   condition: x => x < 10,
- *   iterate: x => x + 1,
- *   resultSelector: x => x,
- * });
- *
- * @see {@link from}
- * @see {@link Observable}
- *
- * @param {GenerateOptions<T, S>} options Object that must contain initialState, iterate, resultSelector and might contain condition and scheduler.
- * @returns {Observable<T>} The generated sequence.
- */
-export function generate<T, S>(options: GenerateOptions<T, S>): Observable<T>;
-
-export function generate<T, S>(initialStateOrOptions: S | GenerateOptions<T, S>,
-                               condition?: ConditionFunc<S>,
-                               iterate?: IterateFunc<S>,
-                               resultSelectorOrObservable?: (ResultFunc<S, T>) | SchedulerLike,
-                               scheduler?: SchedulerLike): Observable<T> {
-
-  let resultSelector: ResultFunc<S, T>;
-  let initialState: S;
-
-  if (arguments.length == 1) {
-    const options = initialStateOrOptions as GenerateOptions<T, S>;
-    initialState = options.initialState;
-    condition = options.condition;
-    iterate = options.iterate;
-    resultSelector = options.resultSelector || identity as ResultFunc<S, T>;
-    scheduler = options.scheduler;
-  } else if (resultSelectorOrObservable === undefined || isScheduler(resultSelectorOrObservable)) {
-    initialState = initialStateOrOptions as S;
-    resultSelector = identity as ResultFunc<S, T>;
-    scheduler = resultSelectorOrObservable as SchedulerLike;
-  } else {
-    initialState = initialStateOrOptions as S;
-    resultSelector = resultSelectorOrObservable as ResultFunc<S, T>;
-  }
-
-  return new Observable<T>(subscriber => {
-    let state = initialState;
-    if (scheduler) {
-      return scheduler.schedule<SchedulerState<T, S>>(dispatch, 0, {
-        subscriber,
-        iterate,
-        condition,
-        resultSelector,
-        state
-      });
-    }
-
-    do {
-      if (condition) {
-        let conditionResult: boolean;
-        try {
-          conditionResult = condition(state);
-        } catch (err) {
-          subscriber.error(err);
-          return undefined;
-        }
-        if (!conditionResult) {
-          subscriber.complete();
-          break;
-        }
-      }
-      let value: T;
-      try {
-        value = resultSelector(state);
-      } catch (err) {
-        subscriber.error(err);
-        return undefined;
-      }
-      subscriber.next(value);
-      if (subscriber.closed) {
-        break;
-      }
-      try {
-        state = iterate(state);
-      } catch (err) {
-        subscriber.error(err);
-        return undefined;
-      }
-    } while (true);
-
-    return undefined;
-  });
-}
-
-function dispatch<T, S>(this: SchedulerAction<SchedulerState<T, S>>, state: SchedulerState<T, S>) {
-  const { subscriber, condition } = state;
-  if (subscriber.closed) {
-    return undefined;
-  }
-  if (state.needIterate) {
-    try {
-      state.state = state.iterate(state.state);
-    } catch (err) {
-      subscriber.error(err);
-      return undefined;
-    }
-  } else {
-    state.needIterate = true;
-  }
-  if (condition) {
-    let conditionResult: boolean;
-    try {
-      conditionResult = condition(state.state);
-    } catch (err) {
-      subscriber.error(err);
-      return undefined;
-    }
-    if (!conditionResult) {
-      subscriber.complete();
-      return undefined;
-    }
-    if (subscriber.closed) {
-      return undefined;
-    }
-  }
-  let value: T;
-  try {
-    value = state.resultSelector(state.state);
-  } catch (err) {
-    subscriber.error(err);
-    return undefined;
-  }
-  if (subscriber.closed) {
-    return undefined;
-  }
-  subscriber.next(value);
-  if (subscriber.closed) {
-    return undefined;
-  }
-  return this.schedule(state);
-}
diff --git a/node_modules/rxjs/src/internal/observable/iif.ts b/node_modules/rxjs/src/internal/observable/iif.ts
deleted file mode 100644
index 6618739..0000000
--- a/node_modules/rxjs/src/internal/observable/iif.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-import { Observable } from '../Observable';
-import { defer } from './defer';
-import { EMPTY } from './empty';
-import { SubscribableOrPromise } from '../types';
-
-/**
- * Decides at subscription time which Observable will actually be subscribed.
- *
- * <span class="informal">`If` statement for Observables.</span>
- *
- * `iif` accepts a condition function and two Observables. When
- * an Observable returned by the operator is subscribed, condition function will be called.
- * Based on what boolean it returns at that moment, consumer will subscribe either to
- * the first Observable (if condition was true) or to the second (if condition was false). Condition
- * function may also not return anything - in that case condition will be evaluated as false and
- * second Observable will be subscribed.
- *
- * Note that Observables for both cases (true and false) are optional. If condition points to an Observable that
- * was left undefined, resulting stream will simply complete immediately. That allows you to, rather
- * than controlling which Observable will be subscribed, decide at runtime if consumer should have access
- * to given Observable or not.
- *
- * If you have more complex logic that requires decision between more than two Observables, {@link defer}
- * will probably be a better choice. Actually `iif` can be easily implemented with {@link defer}
- * and exists only for convenience and readability reasons.
- *
- *
- * ## Examples
- * ### Change at runtime which Observable will be subscribed
- * ```ts
- * import { iif, of } from 'rxjs';
- *
- * let subscribeToFirst;
- * const firstOrSecond = iif(
- *   () => subscribeToFirst,
- *   of('first'),
- *   of('second'),
- * );
- *
- * subscribeToFirst = true;
- * firstOrSecond.subscribe(value => console.log(value));
- *
- * // Logs:
- * // "first"
- *
- * subscribeToFirst = false;
- * firstOrSecond.subscribe(value => console.log(value));
- *
- * // Logs:
- * // "second"
- *
- * ```
- *
- * ### Control an access to an Observable
- * ```ts
- * let accessGranted;
- * const observableIfYouHaveAccess = iif(
- *   () => accessGranted,
- *   of('It seems you have an access...'), // Note that only one Observable is passed to the operator.
- * );
- *
- * accessGranted = true;
- * observableIfYouHaveAccess.subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('The end'),
- * );
- *
- * // Logs:
- * // "It seems you have an access..."
- * // "The end"
- *
- * accessGranted = false;
- * observableIfYouHaveAccess.subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('The end'),
- * );
- *
- * // Logs:
- * // "The end"
- * ```
- *
- * @see {@link defer}
- *
- * @param {function(): boolean} condition Condition which Observable should be chosen.
- * @param {Observable} [trueObservable] An Observable that will be subscribed if condition is true.
- * @param {Observable} [falseObservable] An Observable that will be subscribed if condition is false.
- * @return {Observable} Either first or second Observable, depending on condition.
- * @static true
- * @name iif
- * @owner Observable
-*/
-export function iif<T = never, F = never>(
-  condition: () => boolean,
-  trueResult: SubscribableOrPromise<T> = EMPTY,
-  falseResult: SubscribableOrPromise<F> = EMPTY
-): Observable<T|F> {
-  return defer(() => condition() ? trueResult : falseResult);
-}
diff --git a/node_modules/rxjs/src/internal/observable/interval.ts b/node_modules/rxjs/src/internal/observable/interval.ts
deleted file mode 100644
index fc9d3f9..0000000
--- a/node_modules/rxjs/src/internal/observable/interval.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-import { Observable } from '../Observable';
-import { async } from '../scheduler/async';
-import { SchedulerAction, SchedulerLike } from '../types';
-import { isNumeric } from '../util/isNumeric';
-import { Subscriber } from '../Subscriber';
-
-/**
- * Creates an Observable that emits sequential numbers every specified
- * interval of time, on a specified {@link SchedulerLike}.
- *
- * <span class="informal">Emits incremental numbers periodically in time.
- * </span>
- *
- * ![](interval.png)
- *
- * `interval` returns an Observable that emits an infinite sequence of
- * ascending integers, with a constant interval of time of your choosing
- * between those emissions. The first emission is not sent immediately, but
- * only after the first period has passed. By default, this operator uses the
- * `async` {@link SchedulerLike} to provide a notion of time, but you may pass any
- * {@link SchedulerLike} to it.
- *
- * ## Example
- * Emits ascending numbers, one every second (1000ms) up to the number 3
- * ```ts
- * import { interval } from 'rxjs';
- * import { take } from 'rxjs/operators';
- *
- * const numbers = interval(1000);
- *
- * const takeFourNumbers = numbers.pipe(take(4));
- *
- * takeFourNumbers.subscribe(x => console.log('Next: ', x));
- *
- * // Logs:
- * // Next: 0
- * // Next: 1
- * // Next: 2
- * // Next: 3
- * ```
- *
- * @see {@link timer}
- * @see {@link delay}
- *
- * @param {number} [period=0] The interval size in milliseconds (by default)
- * or the time unit determined by the scheduler's clock.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for scheduling
- * the emission of values, and providing a notion of "time".
- * @return {Observable} An Observable that emits a sequential number each time
- * interval.
- * @static true
- * @name interval
- * @owner Observable
- */
-export function interval(period = 0,
-                         scheduler: SchedulerLike = async): Observable<number> {
-  if (!isNumeric(period) || period < 0) {
-    period = 0;
-  }
-
-  if (!scheduler || typeof scheduler.schedule !== 'function') {
-    scheduler = async;
-  }
-
-  return new Observable<number>(subscriber => {
-    subscriber.add(
-      scheduler.schedule(dispatch, period, { subscriber, counter: 0, period })
-    );
-    return subscriber;
-  });
-}
-
-function dispatch(this: SchedulerAction<IntervalState>, state: IntervalState) {
-  const { subscriber, counter, period } = state;
-  subscriber.next(counter);
-  this.schedule({ subscriber, counter: counter + 1, period }, period);
-}
-
-interface IntervalState {
-  subscriber: Subscriber<number>;
-  counter: number;
-  period: number;
-}
diff --git a/node_modules/rxjs/src/internal/observable/merge.ts b/node_modules/rxjs/src/internal/observable/merge.ts
deleted file mode 100644
index f9f1faa..0000000
--- a/node_modules/rxjs/src/internal/observable/merge.ts
+++ /dev/null
@@ -1,140 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput, SchedulerLike} from '../types';
-import { isScheduler } from '../util/isScheduler';
-import { mergeAll } from '../operators/mergeAll';
-import { fromArray } from './fromArray';
-
-/* tslint:disable:max-line-length */
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T>(v1: ObservableInput<T>, scheduler: SchedulerLike): Observable<T>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T>(v1: ObservableInput<T>, concurrent: number, scheduler: SchedulerLike): Observable<T>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T, T2>(v1: ObservableInput<T>, v2: ObservableInput<T2>, scheduler: SchedulerLike): Observable<T | T2>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T, T2>(v1: ObservableInput<T>, v2: ObservableInput<T2>, concurrent: number, scheduler: SchedulerLike): Observable<T | T2>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, scheduler: SchedulerLike): Observable<T | T2 | T3>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, concurrent: number, scheduler: SchedulerLike): Observable<T | T2 | T3>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, concurrent: number, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T, T2, T3, T4, T5>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T, T2, T3, T4, T5>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, concurrent: number, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T, T2, T3, T4, T5, T6>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5 | T6>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T, T2, T3, T4, T5, T6>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, concurrent: number, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5 | T6>;
-
-export function merge<T>(v1: ObservableInput<T>): Observable<T>;
-export function merge<T>(v1: ObservableInput<T>, concurrent?: number): Observable<T>;
-export function merge<T, T2>(v1: ObservableInput<T>, v2: ObservableInput<T2>): Observable<T | T2>;
-export function merge<T, T2>(v1: ObservableInput<T>, v2: ObservableInput<T2>, concurrent?: number): Observable<T | T2>;
-export function merge<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>): Observable<T | T2 | T3>;
-export function merge<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, concurrent?: number): Observable<T | T2 | T3>;
-export function merge<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<T | T2 | T3 | T4>;
-export function merge<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, concurrent?: number): Observable<T | T2 | T3 | T4>;
-export function merge<T, T2, T3, T4, T5>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): Observable<T | T2 | T3 | T4 | T5>;
-export function merge<T, T2, T3, T4, T5>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, concurrent?: number): Observable<T | T2 | T3 | T4 | T5>;
-export function merge<T, T2, T3, T4, T5, T6>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): Observable<T | T2 | T3 | T4 | T5 | T6>;
-export function merge<T, T2, T3, T4, T5, T6>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, concurrent?: number): Observable<T | T2 | T3 | T4 | T5 | T6>;
-export function merge<T>(...observables: (ObservableInput<T> | number)[]): Observable<T>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T>(...observables: (ObservableInput<T> | SchedulerLike | number)[]): Observable<T>;
-export function merge<T, R>(...observables: (ObservableInput<any> | number)[]): Observable<R>;
-/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/
-export function merge<T, R>(...observables: (ObservableInput<any> | SchedulerLike | number)[]): Observable<R>;
-/* tslint:enable:max-line-length */
-/**
- * Creates an output Observable which concurrently emits all values from every
- * given input Observable.
- *
- * <span class="informal">Flattens multiple Observables together by blending
- * their values into one Observable.</span>
- *
- * ![](merge.png)
- *
- * `merge` subscribes to each given input Observable (as arguments), and simply
- * forwards (without doing any transformation) all the values from all the input
- * Observables to the output Observable. The output Observable only completes
- * once all input Observables have completed. Any error delivered by an input
- * Observable will be immediately emitted on the output Observable.
- *
- * ## Examples
- * ### Merge together two Observables: 1s interval and clicks
- * ```ts
- * import { merge, fromEvent, interval } from 'rxjs';
- *
- * const clicks = fromEvent(document, 'click');
- * const timer = interval(1000);
- * const clicksOrTimer = merge(clicks, timer);
- * clicksOrTimer.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // timer will emit ascending values, one every second(1000ms) to console
- * // clicks logs MouseEvents to console everytime the "document" is clicked
- * // Since the two streams are merged you see these happening
- * // as they occur.
- * ```
- *
- * ### Merge together 3 Observables, but only 2 run concurrently
- * ```ts
- * import { merge, interval } from 'rxjs';
- * import { take } from 'rxjs/operators';
- *
- * const timer1 = interval(1000).pipe(take(10));
- * const timer2 = interval(2000).pipe(take(6));
- * const timer3 = interval(500).pipe(take(10));
- * const concurrent = 2; // the argument
- * const merged = merge(timer1, timer2, timer3, concurrent);
- * merged.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // - First timer1 and timer2 will run concurrently
- * // - timer1 will emit a value every 1000ms for 10 iterations
- * // - timer2 will emit a value every 2000ms for 6 iterations
- * // - after timer1 hits it's max iteration, timer2 will
- * //   continue, and timer3 will start to run concurrently with timer2
- * // - when timer2 hits it's max iteration it terminates, and
- * //   timer3 will continue to emit a value every 500ms until it is complete
- * ```
- *
- * @see {@link mergeAll}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- *
- * @param {...ObservableInput} observables Input Observables to merge together.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @param {SchedulerLike} [scheduler=null] The {@link SchedulerLike} to use for managing
- * concurrency of input Observables.
- * @return {Observable} an Observable that emits items that are the result of
- * every input Observable.
- * @static true
- * @name merge
- * @owner Observable
- */
-export function merge<T, R>(...observables: Array<ObservableInput<any> | SchedulerLike | number>): Observable<R> {
- let concurrent = Number.POSITIVE_INFINITY;
- let scheduler: SchedulerLike = null;
-  let last: any = observables[observables.length - 1];
-  if (isScheduler(last)) {
-    scheduler = <SchedulerLike>observables.pop();
-    if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
-      concurrent = <number>observables.pop();
-    }
-  } else if (typeof last === 'number') {
-    concurrent = <number>observables.pop();
-  }
-
-  if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable) {
-    return <Observable<R>>observables[0];
-  }
-
-  return mergeAll<R>(concurrent)(fromArray<any>(observables, scheduler));
-}
diff --git a/node_modules/rxjs/src/internal/observable/never.ts b/node_modules/rxjs/src/internal/observable/never.ts
deleted file mode 100644
index 280ea4e..0000000
--- a/node_modules/rxjs/src/internal/observable/never.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { Observable } from '../Observable';
-import { noop } from '../util/noop';
-
-/**
- * An Observable that emits no items to the Observer and never completes.
- *
- * ![](never.png)
- *
- * A simple Observable that emits neither values nor errors nor the completion
- * notification. It can be used for testing purposes or for composing with other
- * Observables. Please note that by never emitting a complete notification, this
- * Observable keeps the subscription from being disposed automatically.
- * Subscriptions need to be manually disposed.
- *
- * ##  Example
- * ### Emit the number 7, then never emit anything else (not even complete)
- * ```ts
- * import { NEVER } from 'rxjs';
- * import { startWith } from 'rxjs/operators';
- *
- * function info() {
- *   console.log('Will not be called');
- * }
- * const result = NEVER.pipe(startWith(7));
- * result.subscribe(x => console.log(x), info, info);
- *
- * ```
- *
- * @see {@link Observable}
- * @see {@link index/EMPTY}
- * @see {@link of}
- * @see {@link throwError}
- */
-export const NEVER = new Observable<never>(noop);
-
-/**
- * @deprecated Deprecated in favor of using {@link NEVER} constant.
- */
-export function never () {
-  return NEVER;
-}
diff --git a/node_modules/rxjs/src/internal/observable/of.ts b/node_modules/rxjs/src/internal/observable/of.ts
deleted file mode 100644
index 752d4a2..0000000
--- a/node_modules/rxjs/src/internal/observable/of.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-import { SchedulerLike } from '../types';
-import { isScheduler } from '../util/isScheduler';
-import { fromArray } from './fromArray';
-import { Observable } from '../Observable';
-import { scheduleArray } from '../scheduled/scheduleArray';
-
-/* tslint:disable:max-line-length */
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export function of<T>(a: T, scheduler: SchedulerLike): Observable<T>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export function of<T, T2>(a: T, b: T2, scheduler: SchedulerLike): Observable<T | T2>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export function of<T, T2, T3>(a: T, b: T2, c: T3, scheduler: SchedulerLike): Observable<T | T2 | T3>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export function of<T, T2, T3, T4>(a: T, b: T2, c: T3, d: T4, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export function of<T, T2, T3, T4, T5>(a: T, b: T2, c: T3, d: T4, e: T5, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export function of<T, T2, T3, T4, T5, T6>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, scheduler: SchedulerLike): Observable<T | T2 | T3 | T4 | T5 | T6>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export function of<T, T2, T3, T4, T5, T6, T7>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, scheduler: SchedulerLike):
-  Observable<T | T2 | T3 | T4 | T5 | T6 | T7>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export function of<T, T2, T3, T4, T5, T6, T7, T8>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, h: T8, scheduler: SchedulerLike):
-  Observable<T | T2 | T3 | T4 | T5 | T6 | T7 | T8>;
-/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */
-export function of<T, T2, T3, T4, T5, T6, T7, T8, T9>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, h: T8, i: T9, scheduler: SchedulerLike):
-  Observable<T | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9>;
-export function of<T>(...args: (T | SchedulerLike)[]): Observable<T>;
-
-// TODO(benlesh): Update the typings for this when we can switch to TS 3.x
-export function of<T>(a: T): Observable<T>;
-export function of<T, T2>(a: T, b: T2): Observable<T | T2>;
-export function of<T, T2, T3>(a: T, b: T2, c: T3): Observable<T | T2 | T3>;
-export function of<T, T2, T3, T4>(a: T, b: T2, c: T3, d: T4): Observable<T | T2 | T3 | T4>;
-export function of<T, T2, T3, T4, T5>(a: T, b: T2, c: T3, d: T4, e: T5): Observable<T | T2 | T3 | T4 | T5>;
-export function of<T, T2, T3, T4, T5, T6>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6): Observable<T | T2 | T3 | T4 | T5 | T6>;
-export function of<T, T2, T3, T4, T5, T6, T7>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7):
-  Observable<T | T2 | T3 | T4 | T5 | T6 | T7>;
-export function of<T, T2, T3, T4, T5, T6, T7, T8>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, h: T8):
-  Observable<T | T2 | T3 | T4 | T5 | T6 | T7 | T8>;
-export function of<T, T2, T3, T4, T5, T6, T7, T8, T9>(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, h: T8, i: T9):
-  Observable<T | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9>;
-export function of<T>(...args: T[]): Observable<T>;
-/* tslint:enable:max-line-length */
-
-/**
- * Converts the arguments to an observable sequence.
- *
- * <span class="informal">Each argument becomes a `next` notification.</span>
- *
- * ![](of.png)
- *
- * Unlike {@link from}, it does not do any flattening and emits each argument in whole
- * as a separate `next` notification.
- *
- * ## Examples
- *
- * Emit the values `10, 20, 30`
- *
- * ```ts
- * import { of } from 'rxjs';
- *
- * of(10, 20, 30)
- * .subscribe(
- *   next => console.log('next:', next),
- *   err => console.log('error:', err),
- *   () => console.log('the end'),
- * );
- * // result:
- * // 'next: 10'
- * // 'next: 20'
- * // 'next: 30'
- *
- * ```
- *
- * Emit the array `[1,2,3]`
- *
- * ```ts
- * import { of } from 'rxjs';
- *
- * of([1,2,3])
- * .subscribe(
- *   next => console.log('next:', next),
- *   err => console.log('error:', err),
- *   () => console.log('the end'),
- * );
- * // result:
- * // 'next: [1,2,3]'
- * ```
- *
- * @see {@link from}
- * @see {@link range}
- *
- * @param {...T} values A comma separated list of arguments you want to be emitted
- * @return {Observable} An Observable that emits the arguments
- * described above and then completes.
- * @method of
- * @owner Observable
- */
-
-export function of<T>(...args: Array<T | SchedulerLike>): Observable<T> {
-  let scheduler = args[args.length - 1] as SchedulerLike;
-  if (isScheduler(scheduler)) {
-    args.pop();
-    return scheduleArray(args as T[], scheduler);
-  } else {
-    return fromArray(args as T[]);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/observable/onErrorResumeNext.ts b/node_modules/rxjs/src/internal/observable/onErrorResumeNext.ts
deleted file mode 100644
index 9f0900e..0000000
--- a/node_modules/rxjs/src/internal/observable/onErrorResumeNext.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput } from '../types';
-import { from } from './from';
-import { isArray } from '../util/isArray';
-import { EMPTY } from './empty';
-
-/* tslint:disable:max-line-length */
-export function onErrorResumeNext<R>(v: ObservableInput<R>): Observable<R>;
-export function onErrorResumeNext<T2, T3, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>): Observable<R>;
-export function onErrorResumeNext<T2, T3, T4, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<R>;
-export function onErrorResumeNext<T2, T3, T4, T5, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): Observable<R>;
-export function onErrorResumeNext<T2, T3, T4, T5, T6, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): Observable<R>;
-
-export function onErrorResumeNext<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): Observable<R>;
-export function onErrorResumeNext<R>(array: ObservableInput<any>[]): Observable<R>;
-/* tslint:enable:max-line-length */
-
-/**
- * When any of the provided Observable emits an complete or error notification, it immediately subscribes to the next one
- * that was passed.
- *
- * <span class="informal">Execute series of Observables no matter what, even if it means swallowing errors.</span>
- *
- * ![](onErrorResumeNext.png)
- *
- * `onErrorResumeNext` Will subscribe to each observable source it is provided, in order.
- * If the source it's subscribed to emits an error or completes, it will move to the next source
- * without error.
- *
- * If `onErrorResumeNext` is provided no arguments, or a single, empty array, it will return {@link index/EMPTY}.
- *
- * `onErrorResumeNext` is basically {@link concat}, only it will continue, even if one of its
- * sources emits an error.
- *
- * Note that there is no way to handle any errors thrown by sources via the result of
- * `onErrorResumeNext`. If you want to handle errors thrown in any given source, you can
- * always use the {@link catchError} operator on them before passing them into `onErrorResumeNext`.
- *
- * ## Example
- * Subscribe to the next Observable after map fails</caption>
- * ```ts
- * import { onErrorResumeNext, of } from 'rxjs';
- * import { map } from 'rxjs/operators';
- *
- * onErrorResumeNext(
- *  of(1, 2, 3, 0).pipe(
- *    map(x => {
- *      if (x === 0) throw Error();
- *      return 10 / x;
- *    })
- *  ),
- *  of(1, 2, 3),
- * )
- * .subscribe(
- *   val => console.log(val),
- *   err => console.log(err),          // Will never be called.
- *   () => console.log('done'),
- * );
- *
- * // Logs:
- * // 10
- * // 5
- * // 3.3333333333333335
- * // 1
- * // 2
- * // 3
- * // "done"
- * ```
- *
- * @see {@link concat}
- * @see {@link catchError}
- *
- * @param {...ObservableInput} sources Observables (or anything that *is* observable) passed either directly or as an array.
- * @return {Observable} An Observable that concatenates all sources, one after the other,
- * ignoring all errors, such that any error causes it to move on to the next source.
- */
-export function onErrorResumeNext<T, R>(...sources: Array<ObservableInput<any> |
-                                                              Array<ObservableInput<any>> |
-                                                              ((...values: Array<any>) => R)>): Observable<R> {
-
-  if (sources.length === 0) {
-    return EMPTY;
-  }
-
-  const [ first, ...remainder ] = sources;
-
-  if (sources.length === 1 && isArray(first)) {
-    return onErrorResumeNext(...first);
-  }
-
-  return new Observable(subscriber => {
-    const subNext = () => subscriber.add(
-      onErrorResumeNext(...remainder).subscribe(subscriber)
-    );
-
-    return from(first).subscribe({
-      next(value) { subscriber.next(value); },
-      error: subNext,
-      complete: subNext,
-    });
-  });
-}
diff --git a/node_modules/rxjs/src/internal/observable/pairs.ts b/node_modules/rxjs/src/internal/observable/pairs.ts
deleted file mode 100644
index 85bd81c..0000000
--- a/node_modules/rxjs/src/internal/observable/pairs.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerAction, SchedulerLike } from '../types';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-
-/**
- * Convert an object into an Observable of `[key, value]` pairs.
- *
- * <span class="informal">Turn entries of an object into a stream.</span>
- *
- * <img src="./img/pairs.png" width="100%">
- *
- * `pairs` takes an arbitrary object and returns an Observable that emits arrays. Each
- * emitted array has exactly two elements - the first is a key from the object
- * and the second is a value corresponding to that key. Keys are extracted from
- * an object via `Object.keys` function, which means that they will be only
- * enumerable keys that are present on an object directly - not ones inherited
- * via prototype chain.
- *
- * By default these arrays are emitted synchronously. To change that you can
- * pass a {@link SchedulerLike} as a second argument to `pairs`.
- *
- * @example <caption>Converts a javascript object to an Observable</caption>
- * ```ts
- * import { pairs } from 'rxjs';
- *
- * const obj = {
- *   foo: 42,
- *   bar: 56,
- *   baz: 78
- * };
- *
- * pairs(obj)
- * .subscribe(
- *   value => console.log(value),
- *   err => {},
- *   () => console.log('the end!')
- * );
- *
- * // Logs:
- * // ["foo", 42],
- * // ["bar", 56],
- * // ["baz", 78],
- * // "the end!"
- * ```
- *
- * @param {Object} obj The object to inspect and turn into an
- * Observable sequence.
- * @param {Scheduler} [scheduler] An optional IScheduler to schedule
- * when resulting Observable will emit values.
- * @returns {(Observable<Array<string|T>>)} An observable sequence of
- * [key, value] pairs from the object.
- */
-export function pairs<T>(obj: Object, scheduler?: SchedulerLike): Observable<[string, T]> {
-  if (!scheduler) {
-    return new Observable<[string, T]>(subscriber => {
-      const keys = Object.keys(obj);
-      for (let i = 0; i < keys.length && !subscriber.closed; i++) {
-        const key = keys[i];
-        if (obj.hasOwnProperty(key)) {
-          subscriber.next([key, obj[key]]);
-        }
-      }
-      subscriber.complete();
-    });
-  } else {
-    return new Observable<[string, T]>(subscriber => {
-      const keys = Object.keys(obj);
-      const subscription = new Subscription();
-      subscription.add(
-        scheduler.schedule<{ keys: string[], index: number, subscriber: Subscriber<[string, T]>, subscription: Subscription, obj: Object }>
-          (dispatch, 0, { keys, index: 0, subscriber, subscription, obj }));
-      return subscription;
-    });
-  }
-}
-
-/** @internal */
-export function dispatch<T>(this: SchedulerAction<any>,
-                            state: { keys: string[], index: number, subscriber: Subscriber<[string, T]>, subscription: Subscription, obj: Object }) {
-  const { keys, index, subscriber, subscription, obj } = state;
-  if (!subscriber.closed) {
-    if (index < keys.length) {
-      const key = keys[index];
-      subscriber.next([key, obj[key]]);
-      subscription.add(this.schedule({ keys, index: index + 1, subscriber, subscription, obj }));
-    } else {
-      subscriber.complete();
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/observable/partition.ts b/node_modules/rxjs/src/internal/observable/partition.ts
deleted file mode 100644
index 637172f..0000000
--- a/node_modules/rxjs/src/internal/observable/partition.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { not } from '../util/not';
-import { subscribeTo } from '../util/subscribeTo';
-import { filter } from '../operators/filter';
-import { ObservableInput } from '../types';
-import { Observable } from '../Observable';
-
-/**
- * Splits the source Observable into two, one with values that satisfy a
- * predicate, and another with values that don't satisfy the predicate.
- *
- * <span class="informal">It's like {@link filter}, but returns two Observables:
- * one like the output of {@link filter}, and the other with values that did not
- * pass the condition.</span>
- *
- * ![](partition.png)
- *
- * `partition` outputs an array with two Observables that partition the values
- * from the source Observable through the given `predicate` function. The first
- * Observable in that array emits source values for which the predicate argument
- * returns true. The second Observable emits source values for which the
- * predicate returns false. The first behaves like {@link filter} and the second
- * behaves like {@link filter} with the predicate negated.
- *
- * ## Example
- * Partition a set of numbers into odds and evens observables
- * ```ts
- * import { of, partition } from 'rxjs';
- *
- * const observableValues = of(1, 2, 3, 4, 5, 6);
- * const [evens$, odds$] = partition(observableValues, (value, index) => value % 2 === 0);
- *
- * odds$.subscribe(x => console.log('odds', x));
- * evens$.subscribe(x => console.log('evens', x));
- *
- * // Logs:
- * // odds 1
- * // odds 3
- * // odds 5
- * // evens 2
- * // evens 4
- * // evens 6
- * ```
- *
- * @see {@link filter}
- *
- * @param {function(value: T, index: number): boolean} predicate A function that
- * evaluates each value emitted by the source Observable. If it returns `true`,
- * the value is emitted on the first Observable in the returned array, if
- * `false` the value is emitted on the second Observable in the array. The
- * `index` parameter is the number `i` for the i-th source emission that has
- * happened since the subscription, starting from the number `0`.
- * @param {any} [thisArg] An optional argument to determine the value of `this`
- * in the `predicate` function.
- * @return {[Observable<T>, Observable<T>]} An array with two Observables: one
- * with values that passed the predicate, and another with values that did not
- * pass the predicate.
- */
-export function partition<T>(
-  source: ObservableInput<T>,
-  predicate: (value: T, index: number) => boolean,
-  thisArg?: any
-): [Observable<T>, Observable<T>] {
-  return [
-    filter(predicate, thisArg)(new Observable<T>(subscribeTo(source))),
-    filter(not(predicate, thisArg) as any)(new Observable<T>(subscribeTo(source)))
-  ] as [Observable<T>, Observable<T>];
-}
diff --git a/node_modules/rxjs/src/internal/observable/race.ts b/node_modules/rxjs/src/internal/observable/race.ts
deleted file mode 100644
index e6e13de..0000000
--- a/node_modules/rxjs/src/internal/observable/race.ts
+++ /dev/null
@@ -1,140 +0,0 @@
-import { Observable } from '../Observable';
-import { isArray } from '../util/isArray';
-import { fromArray } from './fromArray';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { TeardownLogic, ObservableInput } from '../types';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-
-// tslint:disable:max-line-length
-export function race<A>(arg: [ObservableInput<A>]): Observable<A>;
-export function race<A, B>(arg: [ObservableInput<A>, ObservableInput<B>]): Observable<A | B>;
-export function race<A, B, C>(arg: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>]): Observable<A | B | C>;
-export function race<A, B, C, D>(arg: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>]): Observable<A | B | C | D>;
-export function race<A, B, C, D, E>(arg: [ObservableInput<A>, ObservableInput<B>, ObservableInput<C>, ObservableInput<D>, ObservableInput<E>]): Observable<A | B | C | D | E>;
-export function race<T>(arg: ObservableInput<T>[]): Observable<T>;
-export function race(arg: ObservableInput<any>[]): Observable<{}>;
-
-export function race<A>(a: ObservableInput<A>): Observable<A>;
-export function race<A, B>(a: ObservableInput<A>, b: ObservableInput<B>): Observable<A | B>;
-export function race<A, B, C>(a: ObservableInput<A>, b: ObservableInput<B>, c: ObservableInput<C>): Observable<A | B | C>;
-export function race<A, B, C, D>(a: ObservableInput<A>, b: ObservableInput<B>, c: ObservableInput<C>, d: ObservableInput<D>): Observable<A | B | C | D>;
-export function race<A, B, C, D, E>(a: ObservableInput<A>, b: ObservableInput<B>, c: ObservableInput<C>, d: ObservableInput<D>, e: ObservableInput<E>): Observable<A | B | C | D | E>;
-// tslint:enable:max-line-length
-
-export function race<T>(observables: ObservableInput<T>[]): Observable<T>;
-export function race(observables: ObservableInput<any>[]): Observable<{}>;
-export function race<T>(...observables: ObservableInput<T>[]): Observable<T>;
-export function race(...observables: ObservableInput<any>[]): Observable<{}>;
-
-/**
- * Returns an Observable that mirrors the first source Observable to emit an item.
- *
- * ## Example
- * ### Subscribes to the observable that was the first to start emitting.
- *
- * ```ts
- * import { race, interval } from 'rxjs';
- * import { mapTo } from 'rxjs/operators';
- *
- * const obs1 = interval(1000).pipe(mapTo('fast one'));
- * const obs2 = interval(3000).pipe(mapTo('medium one'));
- * const obs3 = interval(5000).pipe(mapTo('slow one'));
- *
- * race(obs3, obs1, obs2)
- * .subscribe(
- *   winner => console.log(winner)
- * );
- *
- * // result:
- * // a series of 'fast one'
- * ```
- *
- * @param {...Observables} ...observables sources used to race for which Observable emits first.
- * @return {Observable} an Observable that mirrors the output of the first Observable to emit an item.
- * @static true
- * @name race
- * @owner Observable
- */
-export function race<T>(...observables: ObservableInput<any>[]): Observable<T> {
-  // if the only argument is an array, it was most likely called with
-  // `race([obs1, obs2, ...])`
-  if (observables.length === 1) {
-    if (isArray(observables[0])) {
-      observables = observables[0] as Observable<any>[];
-    } else {
-      return observables[0] as Observable<T>;
-    }
-  }
-
-  return fromArray(observables, undefined).lift(new RaceOperator<T>());
-}
-
-export class RaceOperator<T> implements Operator<T, T> {
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new RaceSubscriber(subscriber));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class RaceSubscriber<T> extends OuterSubscriber<T, T> {
-  private hasFirst: boolean = false;
-  private observables: Observable<any>[] = [];
-  private subscriptions: Subscription[] = [];
-
-  constructor(destination: Subscriber<T>) {
-    super(destination);
-  }
-
-  protected _next(observable: any): void {
-    this.observables.push(observable);
-  }
-
-  protected _complete() {
-    const observables = this.observables;
-    const len = observables.length;
-
-    if (len === 0) {
-      this.destination.complete();
-    } else {
-      for (let i = 0; i < len && !this.hasFirst; i++) {
-        let observable = observables[i];
-        let subscription = subscribeToResult(this, observable, observable as any, i);
-
-        if (this.subscriptions) {
-          this.subscriptions.push(subscription);
-        }
-        this.add(subscription);
-      }
-      this.observables = null;
-    }
-  }
-
-  notifyNext(outerValue: T, innerValue: T,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, T>): void {
-    if (!this.hasFirst) {
-      this.hasFirst = true;
-
-      for (let i = 0; i < this.subscriptions.length; i++) {
-        if (i !== outerIndex) {
-          let subscription = this.subscriptions[i];
-
-          subscription.unsubscribe();
-          this.remove(subscription);
-        }
-      }
-
-      this.subscriptions = null;
-    }
-
-    this.destination.next(innerValue);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/observable/range.ts b/node_modules/rxjs/src/internal/observable/range.ts
deleted file mode 100644
index 316d378..0000000
--- a/node_modules/rxjs/src/internal/observable/range.ts
+++ /dev/null
@@ -1,90 +0,0 @@
-import { SchedulerAction, SchedulerLike } from '../types';
-import { Observable } from '../Observable';
-
-/**
- * Creates an Observable that emits a sequence of numbers within a specified
- * range.
- *
- * <span class="informal">Emits a sequence of numbers in a range.</span>
- *
- * ![](range.png)
- *
- * `range` operator emits a range of sequential integers, in order, where you
- * select the `start` of the range and its `length`. By default, uses no
- * {@link SchedulerLike} and just delivers the notifications synchronously, but may use
- * an optional {@link SchedulerLike} to regulate those deliveries.
- *
- * ## Example
- * Emits the numbers 1 to 10</caption>
- * ```ts
- * import { range } from 'rxjs';
- *
- * const numbers = range(1, 10);
- * numbers.subscribe(x => console.log(x));
- * ```
- * @see {@link timer}
- * @see {@link index/interval}
- *
- * @param {number} [start=0] The value of the first integer in the sequence.
- * @param {number} count The number of sequential integers to generate.
- * @param {SchedulerLike} [scheduler] A {@link SchedulerLike} to use for scheduling
- * the emissions of the notifications.
- * @return {Observable} An Observable of numbers that emits a finite range of
- * sequential integers.
- * @static true
- * @name range
- * @owner Observable
- */
-export function range(start: number = 0,
-                      count?: number,
-                      scheduler?: SchedulerLike): Observable<number> {
-  return new Observable<number>(subscriber => {
-    if (count === undefined) {
-      count = start;
-      start = 0;
-    }
-
-    let index = 0;
-    let current = start;
-
-    if (scheduler) {
-      return scheduler.schedule(dispatch, 0, {
-        index, count, start, subscriber
-      });
-    } else {
-      do {
-        if (index++ >= count) {
-          subscriber.complete();
-          break;
-        }
-        subscriber.next(current++);
-        if (subscriber.closed) {
-          break;
-        }
-      } while (true);
-    }
-
-    return undefined;
-  });
-}
-
-/** @internal */
-export function dispatch(this: SchedulerAction<any>, state: any) {
-  const { start, index, count, subscriber } = state;
-
-  if (index >= count) {
-    subscriber.complete();
-    return;
-  }
-
-  subscriber.next(start);
-
-  if (subscriber.closed) {
-    return;
-  }
-
-  state.index = index + 1;
-  state.start = start + 1;
-
-  this.schedule(state);
-}
diff --git a/node_modules/rxjs/src/internal/observable/throwError.ts b/node_modules/rxjs/src/internal/observable/throwError.ts
deleted file mode 100644
index 4beb397..0000000
--- a/node_modules/rxjs/src/internal/observable/throwError.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-import { Subscriber } from '../Subscriber';
-
-/**
- * Creates an Observable that emits no items to the Observer and immediately
- * emits an error notification.
- *
- * <span class="informal">Just emits 'error', and nothing else.
- * </span>
- *
- * ![](throw.png)
- *
- * This static operator is useful for creating a simple Observable that only
- * emits the error notification. It can be used for composing with other
- * Observables, such as in a {@link mergeMap}.
- *
- * ## Examples
- * ### Emit the number 7, then emit an error
- * ```ts
- * import { throwError, concat, of } from 'rxjs';
- *
- * const result = concat(of(7), throwError(new Error('oops!')));
- * result.subscribe(x => console.log(x), e => console.error(e));
- *
- * // Logs:
- * // 7
- * // Error: oops!
- * ```
- *
- * ---
- *
- * ### Map and flatten numbers to the sequence 'a', 'b', 'c', but throw an error for 2
- * ```ts
- * import { throwError, interval, of } from 'rxjs';
- * import { mergeMap } from 'rxjs/operators';
- *
- * interval(1000).pipe(
- *   mergeMap(x => x === 2
- *     ? throwError('Twos are bad')
- *     : of('a', 'b', 'c')
- *   ),
- * ).subscribe(x => console.log(x), e => console.error(e));
- *
- * // Logs:
- * // a
- * // b
- * // c
- * // a
- * // b
- * // c
- * // Twos are bad
- * ```
- *
- * @see {@link Observable}
- * @see {@link empty}
- * @see {@link never}
- * @see {@link of}
- *
- * @param {any} error The particular Error to pass to the error notification.
- * @param {SchedulerLike} [scheduler] A {@link SchedulerLike} to use for scheduling
- * the emission of the error notification.
- * @return {Observable} An error Observable: emits only the error notification
- * using the given error argument.
- * @static true
- * @name throwError
- * @owner Observable
- */
-export function throwError(error: any, scheduler?: SchedulerLike): Observable<never> {
-  if (!scheduler) {
-    return new Observable(subscriber => subscriber.error(error));
-  } else {
-    return new Observable(subscriber => scheduler.schedule(dispatch, 0, { error, subscriber }));
-  }
-}
-
-interface DispatchArg {
-  error: any;
-  subscriber: Subscriber<any>;
-}
-
-function dispatch({ error, subscriber }: DispatchArg) {
-  subscriber.error(error);
-}
diff --git a/node_modules/rxjs/src/internal/observable/timer.ts b/node_modules/rxjs/src/internal/observable/timer.ts
deleted file mode 100644
index a061060..0000000
--- a/node_modules/rxjs/src/internal/observable/timer.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerAction, SchedulerLike } from '../types';
-import { async } from '../scheduler/async';
-import { isNumeric } from '../util/isNumeric';
-import { isScheduler } from '../util/isScheduler';
-import { Subscriber } from '../Subscriber';
-
-/**
- * Creates an Observable that starts emitting after an `dueTime` and
- * emits ever increasing numbers after each `period` of time thereafter.
- *
- * <span class="informal">Its like {@link index/interval}, but you can specify when
- * should the emissions start.</span>
- *
- * ![](timer.png)
- *
- * `timer` returns an Observable that emits an infinite sequence of ascending
- * integers, with a constant interval of time, `period` of your choosing
- * between those emissions. The first emission happens after the specified
- * `dueTime`. The initial delay may be a `Date`. By default, this
- * operator uses the {@link asyncScheduler} {@link SchedulerLike} to provide a notion of time, but you
- * may pass any {@link SchedulerLike} to it. If `period` is not specified, the output
- * Observable emits only one value, `0`. Otherwise, it emits an infinite
- * sequence.
- *
- * ## Examples
- * ### Emits ascending numbers, one every second (1000ms), starting after 3 seconds
- * ```ts
- * import { timer } from 'rxjs';
- *
- * const numbers = timer(3000, 1000);
- * numbers.subscribe(x => console.log(x));
- * ```
- *
- * ### Emits one number after five seconds
- * ```ts
- * import { timer } from 'rxjs';
- *
- * const numbers = timer(5000);
- * numbers.subscribe(x => console.log(x));
- * ```
- * @see {@link index/interval}
- * @see {@link delay}
- *
- * @param {number|Date} [dueTime] The initial delay time specified as a Date object or as an integer denoting
- * milliseconds to wait before emitting the first value of 0`.
- * @param {number|SchedulerLike} [periodOrScheduler] The period of time between emissions of the
- * subsequent numbers.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for scheduling
- * the emission of values, and providing a notion of "time".
- * @return {Observable} An Observable that emits a `0` after the
- * `dueTime` and ever increasing numbers after each `period` of time
- * thereafter.
- * @static true
- * @name timer
- * @owner Observable
- */
-export function timer(dueTime: number | Date = 0,
-                      periodOrScheduler?: number | SchedulerLike,
-                      scheduler?: SchedulerLike): Observable<number> {
-  let period = -1;
-  if (isNumeric(periodOrScheduler)) {
-    period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);
-  } else if (isScheduler(periodOrScheduler)) {
-    scheduler = periodOrScheduler as any;
-  }
-
-  if (!isScheduler(scheduler)) {
-    scheduler = async;
-  }
-
-  return new Observable(subscriber => {
-    const due = isNumeric(dueTime)
-      ? (dueTime as number)
-      : (+dueTime - scheduler.now());
-
-    return scheduler.schedule(dispatch, due, {
-      index: 0, period, subscriber
-    });
-  });
-}
-
-interface TimerState {
-  index: number;
-  period: number;
-  subscriber: Subscriber<number>;
-}
-
-function dispatch(this: SchedulerAction<TimerState>, state: TimerState) {
-  const { index, period, subscriber } = state;
-  subscriber.next(index);
-
-  if (subscriber.closed) {
-    return;
-  } else if (period === -1) {
-    return subscriber.complete();
-  }
-
-  state.index = index + 1;
-  this.schedule(state, period);
-}
diff --git a/node_modules/rxjs/src/internal/observable/using.ts b/node_modules/rxjs/src/internal/observable/using.ts
deleted file mode 100644
index 568d7a8..0000000
--- a/node_modules/rxjs/src/internal/observable/using.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { Observable } from '../Observable';
-import { Unsubscribable, ObservableInput } from '../types';
-import { from } from './from'; // from from from! LAWL
-import { EMPTY } from './empty';
-
-/**
- * Creates an Observable that uses a resource which will be disposed at the same time as the Observable.
- *
- * <span class="informal">Use it when you catch yourself cleaning up after an Observable.</span>
- *
- * `using` is a factory operator, which accepts two functions. First function returns a disposable resource.
- * It can be an arbitrary object that implements `unsubscribe` method. Second function will be injected with
- * that object and should return an Observable. That Observable can use resource object during its execution.
- * Both functions passed to `using` will be called every time someone subscribes - neither an Observable nor
- * resource object will be shared in any way between subscriptions.
- *
- * When Observable returned by `using` is subscribed, Observable returned from the second function will be subscribed
- * as well. All its notifications (nexted values, completion and error events) will be emitted unchanged by the output
- * Observable. If however someone unsubscribes from the Observable or source Observable completes or errors by itself,
- * the `unsubscribe` method on resource object will be called. This can be used to do any necessary clean up, which
- * otherwise would have to be handled by hand. Note that complete or error notifications are not emitted when someone
- * cancels subscription to an Observable via `unsubscribe`, so `using` can be used as a hook, allowing you to make
- * sure that all resources which need to exist during an Observable execution will be disposed at appropriate time.
- *
- * @see {@link defer}
- *
- * @param {function(): ISubscription} resourceFactory A function which creates any resource object
- * that implements `unsubscribe` method.
- * @param {function(resource: ISubscription): Observable<T>} observableFactory A function which
- * creates an Observable, that can use injected resource object.
- * @return {Observable<T>} An Observable that behaves the same as Observable returned by `observableFactory`, but
- * which - when completed, errored or unsubscribed - will also call `unsubscribe` on created resource object.
- */
-export function using<T>(resourceFactory: () => Unsubscribable | void,
-                         observableFactory: (resource: Unsubscribable | void) => ObservableInput<T> | void): Observable<T> {
-  return new Observable<T>(subscriber => {
-    let resource: Unsubscribable | void;
-
-    try {
-      resource = resourceFactory();
-    } catch (err) {
-      subscriber.error(err);
-      return undefined;
-    }
-
-    let result: ObservableInput<T> | void;
-    try {
-      result = observableFactory(resource);
-    } catch (err) {
-      subscriber.error(err);
-      return undefined;
-    }
-
-    const source = result ? from(result) : EMPTY;
-    const subscription = source.subscribe(subscriber);
-    return () => {
-      subscription.unsubscribe();
-      if (resource) {
-        resource.unsubscribe();
-      }
-    };
-  });
-}
diff --git a/node_modules/rxjs/src/internal/observable/zip.ts b/node_modules/rxjs/src/internal/observable/zip.ts
deleted file mode 100644
index fbe0756..0000000
--- a/node_modules/rxjs/src/internal/observable/zip.ts
+++ /dev/null
@@ -1,330 +0,0 @@
-import { Observable } from '../Observable';
-import { fromArray } from './fromArray';
-import { isArray } from '../util/isArray';
-import { Operator } from '../Operator';
-import { ObservableInput, PartialObserver, ObservedValueOf } from '../types';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { iterator as Symbol_iterator } from '../../internal/symbol/iterator';
-
-/* tslint:disable:max-line-length */
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export function zip<O1 extends ObservableInput<any>, R>(v1: O1, resultSelector: (v1: ObservedValueOf<O1>) => R): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, R>(v1: O1, v2: O2, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>) => R): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>) => R): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>) => R): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>) => R): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>, v6: ObservedValueOf<O6>) => R): Observable<R>;
-
-export function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(v1: O1, v2: O2): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>]>;
-export function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>]>;
-export function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>]>;
-export function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>]>;
-export function zip<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>, ObservedValueOf<O6>]>;
-
-export function zip<O extends ObservableInput<any>>(array: O[]): Observable<ObservedValueOf<O>[]>;
-export function zip<R>(array: ObservableInput<any>[]): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export function zip<O extends ObservableInput<any>, R>(array: O[], resultSelector: (...values: ObservedValueOf<O>[]) => R): Observable<R>;
-/** @deprecated resultSelector is no longer supported, pipe to map instead */
-export function zip<R>(array: ObservableInput<any>[], resultSelector: (...values: any[]) => R): Observable<R>;
-
-export function zip<O extends ObservableInput<any>>(...observables: O[]): Observable<ObservedValueOf<O>[]>;
-export function zip<O extends ObservableInput<any>, R>(...observables: Array<O | ((...values: ObservedValueOf<O>[]) => R)>): Observable<R>;
-export function zip<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): Observable<R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each
- * of its input Observables.
- *
- * If the last parameter is a function, this function is used to compute the created value from the input values.
- * Otherwise, an array of the input values is returned.
- *
- * ## Example
- * Combine age and name from different sources
- * ```ts
- * import { zip, of } from 'rxjs';
- * import { map } from 'rxjs/operators';
- *
- * let age$ = of<number>(27, 25, 29);
- * let name$ = of<string>('Foo', 'Bar', 'Beer');
- * let isDev$ = of<boolean>(true, true, false);
- *
- * zip(age$, name$, isDev$).pipe(
- *   map(([age, name, isDev]) => ({ age, name, isDev })),
- * )
- * .subscribe(x => console.log(x));
- *
- * // outputs
- * // { age: 27, name: 'Foo', isDev: true }
- * // { age: 25, name: 'Bar', isDev: true }
- * // { age: 29, name: 'Beer', isDev: false }
- * ```
- * @param observables
- * @return {Observable<R>}
- * @static true
- * @name zip
- * @owner Observable
- */
-export function zip<O extends ObservableInput<any>, R>(
-  ...observables: Array<O | ((...values: ObservedValueOf<O>[]) => R)>
-): Observable<ObservedValueOf<O>[]|R> {
-  const resultSelector = <((...ys: Array<any>) => R)> observables[observables.length - 1];
-  if (typeof resultSelector === 'function') {
-    observables.pop();
-  }
-  return fromArray(observables, undefined).lift(new ZipOperator(resultSelector));
-}
-
-export class ZipOperator<T, R> implements Operator<T, R> {
-
-  resultSelector: (...values: Array<any>) => R;
-
-  constructor(resultSelector?: (...values: Array<any>) => R) {
-    this.resultSelector = resultSelector;
-  }
-
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class ZipSubscriber<T, R> extends Subscriber<T> {
-  private values: any;
-  private resultSelector: (...values: Array<any>) => R;
-  private iterators: LookAheadIterator<any>[] = [];
-  private active = 0;
-
-  constructor(destination: Subscriber<R>,
-              resultSelector?: (...values: Array<any>) => R,
-              values: any = Object.create(null)) {
-    super(destination);
-    this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null;
-    this.values = values;
-  }
-
-  protected _next(value: any) {
-    const iterators = this.iterators;
-    if (isArray(value)) {
-      iterators.push(new StaticArrayIterator(value));
-    } else if (typeof value[Symbol_iterator] === 'function') {
-      iterators.push(new StaticIterator(value[Symbol_iterator]()));
-    } else {
-      iterators.push(new ZipBufferIterator(this.destination, this, value));
-    }
-  }
-
-  protected _complete() {
-    const iterators = this.iterators;
-    const len = iterators.length;
-
-    this.unsubscribe();
-
-    if (len === 0) {
-      this.destination.complete();
-      return;
-    }
-
-    this.active = len;
-    for (let i = 0; i < len; i++) {
-      let iterator: ZipBufferIterator<any, any> = <any>iterators[i];
-      if (iterator.stillUnsubscribed) {
-        const destination = this.destination as Subscription;
-        destination.add(iterator.subscribe(iterator, i));
-      } else {
-        this.active--; // not an observable
-      }
-    }
-  }
-
-  notifyInactive() {
-    this.active--;
-    if (this.active === 0) {
-      this.destination.complete();
-    }
-  }
-
-  checkIterators() {
-    const iterators = this.iterators;
-    const len = iterators.length;
-    const destination = this.destination;
-
-    // abort if not all of them have values
-    for (let i = 0; i < len; i++) {
-      let iterator = iterators[i];
-      if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {
-        return;
-      }
-    }
-
-    let shouldComplete = false;
-    const args: any[] = [];
-    for (let i = 0; i < len; i++) {
-      let iterator = iterators[i];
-      let result = iterator.next();
-
-      // check to see if it's completed now that you've gotten
-      // the next value.
-      if (iterator.hasCompleted()) {
-        shouldComplete = true;
-      }
-
-      if (result.done) {
-        destination.complete();
-        return;
-      }
-
-      args.push(result.value);
-    }
-
-    if (this.resultSelector) {
-      this._tryresultSelector(args);
-    } else {
-      destination.next(args);
-    }
-
-    if (shouldComplete) {
-      destination.complete();
-    }
-  }
-
-  protected _tryresultSelector(args: any[]) {
-    let result: any;
-    try {
-      result = this.resultSelector.apply(this, args);
-    } catch (err) {
-      this.destination.error(err);
-      return;
-    }
-    this.destination.next(result);
-  }
-}
-
-interface LookAheadIterator<T> extends Iterator<T> {
-  hasValue(): boolean;
-  hasCompleted(): boolean;
-}
-
-class StaticIterator<T> implements LookAheadIterator<T> {
-  private nextResult: IteratorResult<T>;
-
-  constructor(private iterator: Iterator<T>) {
-    this.nextResult = iterator.next();
-  }
-
-  hasValue() {
-    return true;
-  }
-
-  next(): IteratorResult<T> {
-    const result = this.nextResult;
-    this.nextResult = this.iterator.next();
-    return result;
-  }
-
-  hasCompleted() {
-    const nextResult = this.nextResult;
-    return nextResult && nextResult.done;
-  }
-}
-
-class StaticArrayIterator<T> implements LookAheadIterator<T> {
-  private index = 0;
-  private length = 0;
-
-  constructor(private array: T[]) {
-    this.length = array.length;
-  }
-
-  [Symbol_iterator]() {
-    return this;
-  }
-
-  next(value?: any): IteratorResult<T> {
-    const i = this.index++;
-    const array = this.array;
-    return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
-  }
-
-  hasValue() {
-    return this.array.length > this.index;
-  }
-
-  hasCompleted() {
-    return this.array.length === this.index;
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class ZipBufferIterator<T, R> extends OuterSubscriber<T, R> implements LookAheadIterator<T> {
-  stillUnsubscribed = true;
-  buffer: T[] = [];
-  isComplete = false;
-
-  constructor(destination: PartialObserver<T>,
-              private parent: ZipSubscriber<T, R>,
-              private observable: Observable<T>) {
-    super(destination);
-  }
-
-  [Symbol_iterator]() {
-    return this;
-  }
-
-  // NOTE: there is actually a name collision here with Subscriber.next and Iterator.next
-  //    this is legit because `next()` will never be called by a subscription in this case.
-  next(): IteratorResult<T> {
-    const buffer = this.buffer;
-    if (buffer.length === 0 && this.isComplete) {
-      return { value: null, done: true };
-    } else {
-      return { value: buffer.shift(), done: false };
-    }
-  }
-
-  hasValue() {
-    return this.buffer.length > 0;
-  }
-
-  hasCompleted() {
-    return this.buffer.length === 0 && this.isComplete;
-  }
-
-  notifyComplete() {
-    if (this.buffer.length > 0) {
-      this.isComplete = true;
-      this.parent.notifyInactive();
-    } else {
-      this.destination.complete();
-    }
-  }
-
-  notifyNext(outerValue: T, innerValue: any,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this.buffer.push(innerValue);
-    this.parent.checkIterators();
-  }
-
-  subscribe(value: any, index: number) {
-    return subscribeToResult<any, any>(this, this.observable, this, index);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/audit.ts b/node_modules/rxjs/src/internal/operators/audit.ts
deleted file mode 100644
index 9028abd..0000000
--- a/node_modules/rxjs/src/internal/operators/audit.ts
+++ /dev/null
@@ -1,128 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { MonoTypeOperatorFunction, SubscribableOrPromise, TeardownLogic } from '../types';
-
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-
-/**
- * Ignores source values for a duration determined by another Observable, then
- * emits the most recent value from the source Observable, then repeats this
- * process.
- *
- * <span class="informal">It's like {@link auditTime}, but the silencing
- * duration is determined by a second Observable.</span>
- *
- * ![](audit.png)
- *
- * `audit` is similar to `throttle`, but emits the last value from the silenced
- * time window, instead of the first value. `audit` emits the most recent value
- * from the source Observable on the output Observable as soon as its internal
- * timer becomes disabled, and ignores source values while the timer is enabled.
- * Initially, the timer is disabled. As soon as the first source value arrives,
- * the timer is enabled by calling the `durationSelector` function with the
- * source value, which returns the "duration" Observable. When the duration
- * Observable emits a value or completes, the timer is disabled, then the most
- * recent source value is emitted on the output Observable, and this process
- * repeats for the next source value.
- *
- * ## Example
- *
- * Emit clicks at a rate of at most one click per second
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { audit } from 'rxjs/operators'
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(audit(ev => interval(1000)));
- * result.subscribe(x => console.log(x));
- * ```
- * @see {@link auditTime}
- * @see {@link debounce}
- * @see {@link delayWhen}
- * @see {@link sample}
- * @see {@link throttle}
- *
- * @param {function(value: T): SubscribableOrPromise} durationSelector A function
- * that receives a value from the source Observable, for computing the silencing
- * duration, returned as an Observable or a Promise.
- * @return {Observable<T>} An Observable that performs rate-limiting of
- * emissions from the source Observable.
- * @method audit
- * @owner Observable
- */
-export function audit<T>(durationSelector: (value: T) => SubscribableOrPromise<any>): MonoTypeOperatorFunction<T> {
-  return function auditOperatorFunction(source: Observable<T>) {
-    return source.lift(new AuditOperator(durationSelector));
-  };
-}
-
-class AuditOperator<T> implements Operator<T, T> {
-  constructor(private durationSelector: (value: T) => SubscribableOrPromise<any>) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new AuditSubscriber<T, T>(subscriber, this.durationSelector));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class AuditSubscriber<T, R> extends OuterSubscriber<T, R> {
-
-  private value: T;
-  private hasValue: boolean = false;
-  private throttled: Subscription;
-
-  constructor(destination: Subscriber<T>,
-              private durationSelector: (value: T) => SubscribableOrPromise<any>) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    this.value = value;
-    this.hasValue = true;
-    if (!this.throttled) {
-      let duration;
-      try {
-        const { durationSelector } = this;
-        duration = durationSelector(value);
-      } catch (err) {
-        return this.destination.error(err);
-      }
-      const innerSubscription = subscribeToResult(this, duration);
-      if (!innerSubscription || innerSubscription.closed) {
-        this.clearThrottle();
-      } else {
-        this.add(this.throttled = innerSubscription);
-      }
-    }
-  }
-
-  clearThrottle() {
-    const { value, hasValue, throttled } = this;
-    if (throttled) {
-      this.remove(throttled);
-      this.throttled = null;
-      throttled.unsubscribe();
-    }
-    if (hasValue) {
-      this.value = null;
-      this.hasValue = false;
-      this.destination.next(value);
-    }
-  }
-
-  notifyNext(outerValue: T, innerValue: R, outerIndex: number, innerIndex: number): void {
-    this.clearThrottle();
-  }
-
-  notifyComplete(): void {
-    this.clearThrottle();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/auditTime.ts b/node_modules/rxjs/src/internal/operators/auditTime.ts
deleted file mode 100644
index 50facdc..0000000
--- a/node_modules/rxjs/src/internal/operators/auditTime.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { async } from '../scheduler/async';
-import { audit } from './audit';
-import { timer } from '../observable/timer';
-import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
-
-/**
- * Ignores source values for `duration` milliseconds, then emits the most recent
- * value from the source Observable, then repeats this process.
- *
- * <span class="informal">When it sees a source value, it ignores that plus
- * the next ones for `duration` milliseconds, and then it emits the most recent
- * value from the source.</span>
- *
- * ![](auditTime.png)
- *
- * `auditTime` is similar to `throttleTime`, but emits the last value from the
- * silenced time window, instead of the first value. `auditTime` emits the most
- * recent value from the source Observable on the output Observable as soon as
- * its internal timer becomes disabled, and ignores source values while the
- * timer is enabled. Initially, the timer is disabled. As soon as the first
- * source value arrives, the timer is enabled. After `duration` milliseconds (or
- * the time unit determined internally by the optional `scheduler`) has passed,
- * the timer is disabled, then the most recent source value is emitted on the
- * output Observable, and this process repeats for the next source value.
- * Optionally takes a {@link SchedulerLike} for managing timers.
- *
- * ## Example
- *
- * Emit clicks at a rate of at most one click per second
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { auditTime } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(auditTime(1000));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link audit}
- * @see {@link debounceTime}
- * @see {@link delay}
- * @see {@link sampleTime}
- * @see {@link throttleTime}
- *
- * @param {number} duration Time to wait before emitting the most recent source
- * value, measured in milliseconds or the time unit determined internally
- * by the optional `scheduler`.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
- * managing the timers that handle the rate-limiting behavior.
- * @return {Observable<T>} An Observable that performs rate-limiting of
- * emissions from the source Observable.
- * @method auditTime
- * @owner Observable
- */
-export function auditTime<T>(duration: number, scheduler: SchedulerLike = async): MonoTypeOperatorFunction<T> {
-  return audit(() => timer(duration, scheduler));
-}
diff --git a/node_modules/rxjs/src/internal/operators/buffer.ts b/node_modules/rxjs/src/internal/operators/buffer.ts
deleted file mode 100644
index a1abae4..0000000
--- a/node_modules/rxjs/src/internal/operators/buffer.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OperatorFunction } from '../types';
-
-/**
- * Buffers the source Observable values until `closingNotifier` emits.
- *
- * <span class="informal">Collects values from the past as an array, and emits
- * that array only when another Observable emits.</span>
- *
- * ![](buffer.png)
- *
- * Buffers the incoming Observable values until the given `closingNotifier`
- * Observable emits a value, at which point it emits the buffer on the output
- * Observable and starts a new buffer internally, awaiting the next time
- * `closingNotifier` emits.
- *
- * ## Example
- *
- * On every click, emit array of most recent interval events
- *
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { buffer } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const intervalEvents = interval(1000);
- * const buffered = intervalEvents.pipe(buffer(clicks));
- * buffered.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link bufferCount}
- * @see {@link bufferTime}
- * @see {@link bufferToggle}
- * @see {@link bufferWhen}
- * @see {@link window}
- *
- * @param {Observable<any>} closingNotifier An Observable that signals the
- * buffer to be emitted on the output Observable.
- * @return {Observable<T[]>} An Observable of buffers, which are arrays of
- * values.
- * @method buffer
- * @owner Observable
- */
-export function buffer<T>(closingNotifier: Observable<any>): OperatorFunction<T, T[]> {
-  return function bufferOperatorFunction(source: Observable<T>) {
-    return source.lift(new BufferOperator<T>(closingNotifier));
-  };
-}
-
-class BufferOperator<T> implements Operator<T, T[]> {
-
-  constructor(private closingNotifier: Observable<any>) {
-  }
-
-  call(subscriber: Subscriber<T[]>, source: any): any {
-    return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class BufferSubscriber<T> extends OuterSubscriber<T, any> {
-  private buffer: T[] = [];
-
-  constructor(destination: Subscriber<T[]>, closingNotifier: Observable<any>) {
-    super(destination);
-    this.add(subscribeToResult(this, closingNotifier));
-  }
-
-  protected _next(value: T) {
-    this.buffer.push(value);
-  }
-
-  notifyNext(outerValue: T, innerValue: any,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, any>): void {
-    const buffer = this.buffer;
-    this.buffer = [];
-    this.destination.next(buffer);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/bufferCount.ts b/node_modules/rxjs/src/internal/operators/bufferCount.ts
deleted file mode 100644
index ea01b6a..0000000
--- a/node_modules/rxjs/src/internal/operators/bufferCount.ts
+++ /dev/null
@@ -1,158 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { OperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Buffers the source Observable values until the size hits the maximum
- * `bufferSize` given.
- *
- * <span class="informal">Collects values from the past as an array, and emits
- * that array only when its size reaches `bufferSize`.</span>
- *
- * ![](bufferCount.png)
- *
- * Buffers a number of values from the source Observable by `bufferSize` then
- * emits the buffer and clears it, and starts a new buffer each
- * `startBufferEvery` values. If `startBufferEvery` is not provided or is
- * `null`, then new buffers are started immediately at the start of the source
- * and when each buffer closes and is emitted.
- *
- * ## Examples
- *
- * Emit the last two click events as an array
- *
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { bufferCount } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const buffered = clicks.pipe(bufferCount(2));
- * buffered.subscribe(x => console.log(x));
- * ```
- *
- * On every click, emit the last two click events as an array
- *
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { bufferCount } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const buffered = clicks.pipe(bufferCount(2, 1));
- * buffered.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link buffer}
- * @see {@link bufferTime}
- * @see {@link bufferToggle}
- * @see {@link bufferWhen}
- * @see {@link pairwise}
- * @see {@link windowCount}
- *
- * @param {number} bufferSize The maximum size of the buffer emitted.
- * @param {number} [startBufferEvery] Interval at which to start a new buffer.
- * For example if `startBufferEvery` is `2`, then a new buffer will be started
- * on every other value from the source. A new buffer is started at the
- * beginning of the source by default.
- * @return {Observable<T[]>} An Observable of arrays of buffered values.
- * @method bufferCount
- * @owner Observable
- */
-export function bufferCount<T>(bufferSize: number, startBufferEvery: number = null): OperatorFunction<T, T[]> {
-  return function bufferCountOperatorFunction(source: Observable<T>) {
-    return source.lift(new BufferCountOperator<T>(bufferSize, startBufferEvery));
-  };
-}
-
-class BufferCountOperator<T> implements Operator<T, T[]> {
-  private subscriberClass: any;
-
-  constructor(private bufferSize: number, private startBufferEvery: number) {
-    if (!startBufferEvery || bufferSize === startBufferEvery) {
-      this.subscriberClass = BufferCountSubscriber;
-    } else {
-      this.subscriberClass = BufferSkipCountSubscriber;
-    }
-  }
-
-  call(subscriber: Subscriber<T[]>, source: any): TeardownLogic {
-    return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class BufferCountSubscriber<T> extends Subscriber<T> {
-  private buffer: T[] = [];
-
-  constructor(destination: Subscriber<T[]>, private bufferSize: number) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    const buffer = this.buffer;
-
-    buffer.push(value);
-
-    if (buffer.length == this.bufferSize) {
-      this.destination.next(buffer);
-      this.buffer = [];
-    }
-  }
-
-  protected _complete(): void {
-    const buffer = this.buffer;
-    if (buffer.length > 0) {
-      this.destination.next(buffer);
-    }
-    super._complete();
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class BufferSkipCountSubscriber<T> extends Subscriber<T> {
-  private buffers: Array<T[]> = [];
-  private count: number = 0;
-
-  constructor(destination: Subscriber<T[]>, private bufferSize: number, private startBufferEvery: number) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    const { bufferSize, startBufferEvery, buffers, count } = this;
-
-    this.count++;
-    if (count % startBufferEvery === 0) {
-      buffers.push([]);
-    }
-
-    for (let i = buffers.length; i--; ) {
-      const buffer = buffers[i];
-      buffer.push(value);
-      if (buffer.length === bufferSize) {
-        buffers.splice(i, 1);
-        this.destination.next(buffer);
-      }
-    }
-  }
-
-  protected _complete(): void {
-    const { buffers, destination } = this;
-
-    while (buffers.length > 0) {
-      let buffer = buffers.shift();
-      if (buffer.length > 0) {
-        destination.next(buffer);
-      }
-    }
-    super._complete();
-  }
-
-}
diff --git a/node_modules/rxjs/src/internal/operators/bufferTime.ts b/node_modules/rxjs/src/internal/operators/bufferTime.ts
deleted file mode 100644
index 6edc64b..0000000
--- a/node_modules/rxjs/src/internal/operators/bufferTime.ts
+++ /dev/null
@@ -1,250 +0,0 @@
-import { Operator } from '../Operator';
-import { async } from '../scheduler/async';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { isScheduler } from '../util/isScheduler';
-import { OperatorFunction, SchedulerAction, SchedulerLike } from '../types';
-
-/* tslint:disable:max-line-length */
-export function bufferTime<T>(bufferTimeSpan: number, scheduler?: SchedulerLike): OperatorFunction<T, T[]>;
-export function bufferTime<T>(bufferTimeSpan: number, bufferCreationInterval: number | null | undefined, scheduler?: SchedulerLike): OperatorFunction<T, T[]>;
-export function bufferTime<T>(bufferTimeSpan: number, bufferCreationInterval: number | null | undefined, maxBufferSize: number, scheduler?: SchedulerLike): OperatorFunction<T, T[]>;
-/* tslint:enable:max-line-length */
-
-/**
- * Buffers the source Observable values for a specific time period.
- *
- * <span class="informal">Collects values from the past as an array, and emits
- * those arrays periodically in time.</span>
- *
- * ![](bufferTime.png)
- *
- * Buffers values from the source for a specific time duration `bufferTimeSpan`.
- * Unless the optional argument `bufferCreationInterval` is given, it emits and
- * resets the buffer every `bufferTimeSpan` milliseconds. If
- * `bufferCreationInterval` is given, this operator opens the buffer every
- * `bufferCreationInterval` milliseconds and closes (emits and resets) the
- * buffer every `bufferTimeSpan` milliseconds. When the optional argument
- * `maxBufferSize` is specified, the buffer will be closed either after
- * `bufferTimeSpan` milliseconds or when it contains `maxBufferSize` elements.
- *
- * ## Examples
- *
- * Every second, emit an array of the recent click events
- *
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { bufferTime } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const buffered = clicks.pipe(bufferTime(1000));
- * buffered.subscribe(x => console.log(x));
- * ```
- *
- * Every 5 seconds, emit the click events from the next 2 seconds
- *
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { bufferTime } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const buffered = clicks.pipe(bufferTime(2000, 5000));
- * buffered.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link buffer}
- * @see {@link bufferCount}
- * @see {@link bufferToggle}
- * @see {@link bufferWhen}
- * @see {@link windowTime}
- *
- * @param {number} bufferTimeSpan The amount of time to fill each buffer array.
- * @param {number} [bufferCreationInterval] The interval at which to start new
- * buffers.
- * @param {number} [maxBufferSize] The maximum buffer size.
- * @param {SchedulerLike} [scheduler=async] The scheduler on which to schedule the
- * intervals that determine buffer boundaries.
- * @return {Observable<T[]>} An observable of arrays of buffered values.
- * @method bufferTime
- * @owner Observable
- */
-export function bufferTime<T>(bufferTimeSpan: number): OperatorFunction<T, T[]> {
-  let length: number = arguments.length;
-
-  let scheduler: SchedulerLike = async;
-  if (isScheduler(arguments[arguments.length - 1])) {
-    scheduler = arguments[arguments.length - 1];
-    length--;
-  }
-
-  let bufferCreationInterval: number = null;
-  if (length >= 2) {
-    bufferCreationInterval = arguments[1];
-  }
-
-  let maxBufferSize: number = Number.POSITIVE_INFINITY;
-  if (length >= 3) {
-    maxBufferSize = arguments[2];
-  }
-
-  return function bufferTimeOperatorFunction(source: Observable<T>) {
-    return source.lift(new BufferTimeOperator<T>(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));
-  };
-}
-
-class BufferTimeOperator<T> implements Operator<T, T[]> {
-  constructor(private bufferTimeSpan: number,
-              private bufferCreationInterval: number,
-              private maxBufferSize: number,
-              private scheduler: SchedulerLike) {
-  }
-
-  call(subscriber: Subscriber<T[]>, source: any): any {
-    return source.subscribe(new BufferTimeSubscriber(
-      subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler
-    ));
-  }
-}
-
-class Context<T> {
-  buffer: T[] = [];
-  closeAction: Subscription;
-}
-
-interface DispatchCreateArg<T> {
-  bufferTimeSpan: number;
-  bufferCreationInterval: number;
-  subscriber: BufferTimeSubscriber<T>;
-  scheduler: SchedulerLike;
-}
-
-interface DispatchCloseArg<T> {
-  subscriber: BufferTimeSubscriber<T>;
-  context: Context<T>;
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class BufferTimeSubscriber<T> extends Subscriber<T> {
-  private contexts: Array<Context<T>> = [];
-  private timespanOnly: boolean;
-
-  constructor(destination: Subscriber<T[]>,
-              private bufferTimeSpan: number,
-              private bufferCreationInterval: number,
-              private maxBufferSize: number,
-              private scheduler: SchedulerLike) {
-    super(destination);
-    const context = this.openContext();
-    this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;
-    if (this.timespanOnly) {
-      const timeSpanOnlyState = { subscriber: this, context, bufferTimeSpan };
-      this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-    } else {
-      const closeState = { subscriber: this, context };
-      const creationState: DispatchCreateArg<T> = { bufferTimeSpan, bufferCreationInterval, subscriber: this, scheduler };
-      this.add(context.closeAction = scheduler.schedule<DispatchCloseArg<T>>(dispatchBufferClose, bufferTimeSpan, closeState));
-      this.add(scheduler.schedule<DispatchCreateArg<T>>(dispatchBufferCreation, bufferCreationInterval, creationState));
-    }
-  }
-
-  protected _next(value: T) {
-    const contexts = this.contexts;
-    const len = contexts.length;
-    let filledBufferContext: Context<T>;
-    for (let i = 0; i < len; i++) {
-      const context = contexts[i];
-      const buffer = context.buffer;
-      buffer.push(value);
-      if (buffer.length == this.maxBufferSize) {
-        filledBufferContext = context;
-      }
-    }
-
-    if (filledBufferContext) {
-      this.onBufferFull(filledBufferContext);
-    }
-  }
-
-  protected _error(err: any) {
-    this.contexts.length = 0;
-    super._error(err);
-  }
-
-  protected _complete() {
-    const { contexts, destination } = this;
-    while (contexts.length > 0) {
-      const context = contexts.shift();
-      destination.next(context.buffer);
-    }
-    super._complete();
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _unsubscribe() {
-    this.contexts = null;
-  }
-
-  protected onBufferFull(context: Context<T>) {
-    this.closeContext(context);
-    const closeAction = context.closeAction;
-    closeAction.unsubscribe();
-    this.remove(closeAction);
-
-    if (!this.closed && this.timespanOnly) {
-      context = this.openContext();
-      const bufferTimeSpan = this.bufferTimeSpan;
-      const timeSpanOnlyState = { subscriber: this, context, bufferTimeSpan };
-      this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-    }
-  }
-
-  openContext(): Context<T> {
-    const context: Context<T> = new Context<T>();
-    this.contexts.push(context);
-    return context;
-  }
-
-  closeContext(context: Context<T>) {
-    this.destination.next(context.buffer);
-    const contexts = this.contexts;
-
-    const spliceIndex = contexts ? contexts.indexOf(context) : -1;
-    if (spliceIndex >= 0) {
-      contexts.splice(contexts.indexOf(context), 1);
-    }
-  }
-}
-
-function dispatchBufferTimeSpanOnly(this: SchedulerAction<any>, state: any) {
-  const subscriber: BufferTimeSubscriber<any> = state.subscriber;
-
-  const prevContext = state.context;
-  if (prevContext) {
-    subscriber.closeContext(prevContext);
-  }
-
-  if (!subscriber.closed) {
-    state.context = subscriber.openContext();
-    state.context.closeAction = this.schedule(state, state.bufferTimeSpan);
-  }
-}
-
-function dispatchBufferCreation<T>(this: SchedulerAction<DispatchCreateArg<T>>, state: DispatchCreateArg<T>) {
-  const { bufferCreationInterval, bufferTimeSpan, subscriber, scheduler } = state;
-  const context = subscriber.openContext();
-  const action = <SchedulerAction<DispatchCreateArg<T>>>this;
-  if (!subscriber.closed) {
-    subscriber.add(context.closeAction = scheduler.schedule<DispatchCloseArg<T>>(dispatchBufferClose, bufferTimeSpan, { subscriber, context }));
-    action.schedule(state, bufferCreationInterval);
-  }
-}
-
-function dispatchBufferClose<T>(arg: DispatchCloseArg<T>) {
-  const { subscriber, context } = arg;
-  subscriber.closeContext(context);
-}
diff --git a/node_modules/rxjs/src/internal/operators/bufferToggle.ts b/node_modules/rxjs/src/internal/operators/bufferToggle.ts
deleted file mode 100644
index 8676fa7..0000000
--- a/node_modules/rxjs/src/internal/operators/bufferToggle.ts
+++ /dev/null
@@ -1,182 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { OperatorFunction, SubscribableOrPromise } from '../types';
-
-/**
- * Buffers the source Observable values starting from an emission from
- * `openings` and ending when the output of `closingSelector` emits.
- *
- * <span class="informal">Collects values from the past as an array. Starts
- * collecting only when `opening` emits, and calls the `closingSelector`
- * function to get an Observable that tells when to close the buffer.</span>
- *
- * ![](bufferToggle.png)
- *
- * Buffers values from the source by opening the buffer via signals from an
- * Observable provided to `openings`, and closing and sending the buffers when
- * a Subscribable or Promise returned by the `closingSelector` function emits.
- *
- * ## Example
- *
- * Every other second, emit the click events from the next 500ms
- *
- * ```ts
- * import { fromEvent, interval, EMPTY } from 'rxjs';
- * import { bufferToggle } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const openings = interval(1000);
- * const buffered = clicks.pipe(bufferToggle(openings, i =>
- *   i % 2 ? interval(500) : EMPTY
- * ));
- * buffered.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link buffer}
- * @see {@link bufferCount}
- * @see {@link bufferTime}
- * @see {@link bufferWhen}
- * @see {@link windowToggle}
- *
- * @param {SubscribableOrPromise<O>} openings A Subscribable or Promise of notifications to start new
- * buffers.
- * @param {function(value: O): SubscribableOrPromise} closingSelector A function that takes
- * the value emitted by the `openings` observable and returns a Subscribable or Promise,
- * which, when it emits, signals that the associated buffer should be emitted
- * and cleared.
- * @return {Observable<T[]>} An observable of arrays of buffered values.
- * @method bufferToggle
- * @owner Observable
- */
-export function bufferToggle<T, O>(
-  openings: SubscribableOrPromise<O>,
-  closingSelector: (value: O) => SubscribableOrPromise<any>
-): OperatorFunction<T, T[]> {
-  return function bufferToggleOperatorFunction(source: Observable<T>) {
-    return source.lift(new BufferToggleOperator<T, O>(openings, closingSelector));
-  };
-}
-
-class BufferToggleOperator<T, O> implements Operator<T, T[]> {
-
-  constructor(private openings: SubscribableOrPromise<O>,
-              private closingSelector: (value: O) => SubscribableOrPromise<any>) {
-  }
-
-  call(subscriber: Subscriber<T[]>, source: any): any {
-    return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));
-  }
-}
-
-interface BufferContext<T> {
-  buffer: T[];
-  subscription: Subscription;
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class BufferToggleSubscriber<T, O> extends OuterSubscriber<T, O> {
-  private contexts: Array<BufferContext<T>> = [];
-
-  constructor(destination: Subscriber<T[]>,
-              private openings: SubscribableOrPromise<O>,
-              private closingSelector: (value: O) => SubscribableOrPromise<any> | void) {
-    super(destination);
-    this.add(subscribeToResult(this, openings));
-  }
-
-  protected _next(value: T): void {
-    const contexts = this.contexts;
-    const len = contexts.length;
-    for (let i = 0; i < len; i++) {
-      contexts[i].buffer.push(value);
-    }
-  }
-
-  protected _error(err: any): void {
-    const contexts = this.contexts;
-    while (contexts.length > 0) {
-      const context = contexts.shift();
-      context.subscription.unsubscribe();
-      context.buffer = null;
-      context.subscription = null;
-    }
-    this.contexts = null;
-    super._error(err);
-  }
-
-  protected _complete(): void {
-    const contexts = this.contexts;
-    while (contexts.length > 0) {
-      const context = contexts.shift();
-      this.destination.next(context.buffer);
-      context.subscription.unsubscribe();
-      context.buffer = null;
-      context.subscription = null;
-    }
-    this.contexts = null;
-    super._complete();
-  }
-
-  notifyNext(outerValue: any, innerValue: O,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, O>): void {
-    outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
-  }
-
-  notifyComplete(innerSub: InnerSubscriber<T, O>): void {
-    this.closeBuffer((<any> innerSub).context);
-  }
-
-  private openBuffer(value: O): void {
-    try {
-      const closingSelector = this.closingSelector;
-      const closingNotifier = closingSelector.call(this, value);
-      if (closingNotifier) {
-        this.trySubscribe(closingNotifier);
-      }
-    } catch (err) {
-      this._error(err);
-    }
-  }
-
-  private closeBuffer(context: BufferContext<T>): void {
-    const contexts = this.contexts;
-
-    if (contexts && context) {
-      const { buffer, subscription } = context;
-      this.destination.next(buffer);
-      contexts.splice(contexts.indexOf(context), 1);
-      this.remove(subscription);
-      subscription.unsubscribe();
-    }
-  }
-
-  private trySubscribe(closingNotifier: any): void {
-    const contexts = this.contexts;
-
-    const buffer: Array<T> = [];
-    const subscription = new Subscription();
-    const context = { buffer, subscription };
-    contexts.push(context);
-
-    const innerSubscription = subscribeToResult(this, closingNotifier, <any>context);
-
-    if (!innerSubscription || innerSubscription.closed) {
-      this.closeBuffer(context);
-    } else {
-      (<any> innerSubscription).context = context;
-
-      this.add(innerSubscription);
-      subscription.add(innerSubscription);
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/bufferWhen.ts b/node_modules/rxjs/src/internal/operators/bufferWhen.ts
deleted file mode 100644
index 2c3e96b..0000000
--- a/node_modules/rxjs/src/internal/operators/bufferWhen.ts
+++ /dev/null
@@ -1,144 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OperatorFunction } from '../types';
-
-/**
- * Buffers the source Observable values, using a factory function of closing
- * Observables to determine when to close, emit, and reset the buffer.
- *
- * <span class="informal">Collects values from the past as an array. When it
- * starts collecting values, it calls a function that returns an Observable that
- * tells when to close the buffer and restart collecting.</span>
- *
- * ![](bufferWhen.png)
- *
- * Opens a buffer immediately, then closes the buffer when the observable
- * returned by calling `closingSelector` function emits a value. When it closes
- * the buffer, it immediately opens a new buffer and repeats the process.
- *
- * ## Example
- *
- * Emit an array of the last clicks every [1-5] random seconds
- *
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { bufferWhen } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const buffered = clicks.pipe(bufferWhen(() =>
- *   interval(1000 + Math.random() * 4000)
- * ));
- * buffered.subscribe(x => console.log(x));
- * ```
- *
- *
- * @see {@link buffer}
- * @see {@link bufferCount}
- * @see {@link bufferTime}
- * @see {@link bufferToggle}
- * @see {@link windowWhen}
- *
- * @param {function(): Observable} closingSelector A function that takes no
- * arguments and returns an Observable that signals buffer closure.
- * @return {Observable<T[]>} An observable of arrays of buffered values.
- * @method bufferWhen
- * @owner Observable
- */
-export function bufferWhen<T>(closingSelector: () => Observable<any>): OperatorFunction<T, T[]> {
-  return function (source: Observable<T>) {
-    return source.lift(new BufferWhenOperator(closingSelector));
-  };
-}
-
-class BufferWhenOperator<T> implements Operator<T, T[]> {
-
-  constructor(private closingSelector: () => Observable<any>) {
-  }
-
-  call(subscriber: Subscriber<T[]>, source: any): any {
-    return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class BufferWhenSubscriber<T> extends OuterSubscriber<T, any> {
-  private buffer: T[];
-  private subscribing: boolean = false;
-  private closingSubscription: Subscription;
-
-  constructor(destination: Subscriber<T[]>, private closingSelector: () => Observable<any>) {
-    super(destination);
-    this.openBuffer();
-  }
-
-  protected _next(value: T) {
-    this.buffer.push(value);
-  }
-
-  protected _complete() {
-    const buffer = this.buffer;
-    if (buffer) {
-      this.destination.next(buffer);
-    }
-    super._complete();
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _unsubscribe() {
-    this.buffer = null;
-    this.subscribing = false;
-  }
-
-  notifyNext(outerValue: T, innerValue: any,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, any>): void {
-    this.openBuffer();
-  }
-
-  notifyComplete(): void {
-    if (this.subscribing) {
-      this.complete();
-    } else {
-      this.openBuffer();
-    }
-  }
-
-  openBuffer() {
-    let { closingSubscription } = this;
-
-    if (closingSubscription) {
-      this.remove(closingSubscription);
-      closingSubscription.unsubscribe();
-    }
-
-    const buffer = this.buffer;
-    if (this.buffer) {
-      this.destination.next(buffer);
-    }
-
-    this.buffer = [];
-
-    let closingNotifier;
-    try {
-      const { closingSelector } = this;
-      closingNotifier = closingSelector();
-    } catch (err) {
-      return this.error(err);
-    }
-    closingSubscription = new Subscription();
-    this.closingSubscription = closingSubscription;
-    this.add(closingSubscription);
-    this.subscribing = true;
-    closingSubscription.add(subscribeToResult(this, closingNotifier));
-    this.subscribing = false;
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/catchError.ts b/node_modules/rxjs/src/internal/operators/catchError.ts
deleted file mode 100644
index 5aeb76f..0000000
--- a/node_modules/rxjs/src/internal/operators/catchError.ts
+++ /dev/null
@@ -1,149 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-
-/* tslint:disable:max-line-length */
-export function catchError<T, O extends ObservableInput<any>>(selector: (err: any, caught: Observable<T>) => O): OperatorFunction<T, T | ObservedValueOf<O>>;
-/* tslint:enable:max-line-length */
-
-/**
- * Catches errors on the observable to be handled by returning a new observable or throwing an error.
- *
- * ![](catch.png)
- *
- * ## Examples
- * Continues with a different Observable when there's an error
- *
- * ```ts
- * import { of } from 'rxjs';
- * import { map, catchError } from 'rxjs/operators';
- *
- * of(1, 2, 3, 4, 5).pipe(
- *     map(n => {
- *   	   if (n === 4) {
- * 	       throw 'four!';
- *       }
- *	     return n;
- *     }),
- *     catchError(err => of('I', 'II', 'III', 'IV', 'V')),
- *   )
- *   .subscribe(x => console.log(x));
- *   // 1, 2, 3, I, II, III, IV, V
- * ```
- *
- * Retries the caught source Observable again in case of error, similar to retry() operator
- *
- * ```ts
- * import { of } from 'rxjs';
- * import { map, catchError, take } from 'rxjs/operators';
- *
- * of(1, 2, 3, 4, 5).pipe(
- *     map(n => {
- *   	   if (n === 4) {
- *   	     throw 'four!';
- *       }
- * 	     return n;
- *     }),
- *     catchError((err, caught) => caught),
- *     take(30),
- *   )
- *   .subscribe(x => console.log(x));
- *   // 1, 2, 3, 1, 2, 3, ...
- * ```
- *
- * Throws a new error when the source Observable throws an error
- *
- * ```ts
- * import { of } from 'rxjs';
- * import { map, catchError } from 'rxjs/operators';
- *
- * of(1, 2, 3, 4, 5).pipe(
- *     map(n => {
- *       if (n === 4) {
- *         throw 'four!';
- *       }
- *       return n;
- *     }),
- *     catchError(err => {
- *       throw 'error in source. Details: ' + err;
- *     }),
- *   )
- *   .subscribe(
- *     x => console.log(x),
- *     err => console.log(err)
- *   );
- *   // 1, 2, 3, error in source. Details: four!
- * ```
- *
- *  @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which
- *  is the source observable, in case you'd like to "retry" that observable by returning it again. Whatever observable
- *  is returned by the `selector` will be used to continue the observable chain.
- * @return {Observable} An observable that originates from either the source or the observable returned by the
- *  catch `selector` function.
- * @name catchError
- */
-export function catchError<T, O extends ObservableInput<any>>(
-  selector: (err: any, caught: Observable<T>) => O
-): OperatorFunction<T, T | ObservedValueOf<O>> {
-  return function catchErrorOperatorFunction(source: Observable<T>): Observable<T | ObservedValueOf<O>> {
-    const operator = new CatchOperator(selector);
-    const caught = source.lift(operator);
-    return (operator.caught = caught as Observable<T>);
-  };
-}
-
-class CatchOperator<T, R> implements Operator<T, T | R> {
-  caught: Observable<T>;
-
-  constructor(private selector: (err: any, caught: Observable<T>) => ObservableInput<T | R>) {
-  }
-
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class CatchSubscriber<T, R> extends OuterSubscriber<T, T | R> {
-  constructor(destination: Subscriber<any>,
-              private selector: (err: any, caught: Observable<T>) => ObservableInput<T | R>,
-              private caught: Observable<T>) {
-    super(destination);
-  }
-
-  // NOTE: overriding `error` instead of `_error` because we don't want
-  // to have this flag this subscriber as `isStopped`. We can mimic the
-  // behavior of the RetrySubscriber (from the `retry` operator), where
-  // we unsubscribe from our source chain, reset our Subscriber flags,
-  // then subscribe to the selector result.
-  error(err: any) {
-    if (!this.isStopped) {
-      let result: any;
-      try {
-        result = this.selector(err, this.caught);
-      } catch (err2) {
-        super.error(err2);
-        return;
-      }
-      this._unsubscribeAndRecycle();
-      const innerSubscriber = new InnerSubscriber(this, undefined, undefined);
-      this.add(innerSubscriber);
-      const innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-      // The returned subscription will usually be the subscriber that was
-      // passed. However, interop subscribers will be wrapped and for
-      // unsubscriptions to chain correctly, the wrapper needs to be added, too.
-      if (innerSubscription !== innerSubscriber) {
-        this.add(innerSubscription);
-      }
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/combineAll.ts b/node_modules/rxjs/src/internal/operators/combineAll.ts
deleted file mode 100644
index f696000..0000000
--- a/node_modules/rxjs/src/internal/operators/combineAll.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import { CombineLatestOperator } from '../observable/combineLatest';
-import { Observable } from '../Observable';
-import { OperatorFunction, ObservableInput } from '../types';
-
-export function combineAll<T>(): OperatorFunction<ObservableInput<T>, T[]>;
-export function combineAll<T>(): OperatorFunction<any, T[]>;
-export function combineAll<T, R>(project: (...values: T[]) => R): OperatorFunction<ObservableInput<T>, R>;
-export function combineAll<R>(project: (...values: Array<any>) => R): OperatorFunction<any, R>;
-/**
- * Flattens an Observable-of-Observables by applying {@link combineLatest} when the Observable-of-Observables completes.
- *
- * ![](combineAll.png)
- *
- * `combineAll` takes an Observable of Observables, and collects all Observables from it. Once the outer Observable completes,
- * it subscribes to all collected Observables and combines their values using the {@link combineLatest}</a> strategy, such that:
- *
- * * Every time an inner Observable emits, the output Observable emits
- * * When the returned observable emits, it emits all of the latest values by:
- *    * If a `project` function is provided, it is called with each recent value from each inner Observable in whatever order they
- *      arrived, and the result of the `project` function is what is emitted by the output Observable.
- *    * If there is no `project` function, an array of all the most recent values is emitted by the output Observable.
- *
- * ---
- *
- * ## Examples
- *
- * ### Map two click events to a finite interval Observable, then apply `combineAll`
- *
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { map, combineAll, take } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const higherOrder = clicks.pipe(
- *   map(ev =>
- *      interval(Math.random() * 2000).pipe(take(3))
- *   ),
- *   take(2)
- * );
- * const result = higherOrder.pipe(
- *   combineAll()
- * );
- *
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link combineLatest}
- * @see {@link mergeAll}
- *
- * @param {function(...values: Array<any>)} An optional function to map the most recent values from each inner Observable into a new result.
- * Takes each of the most recent values from each collected inner Observable as arguments, in order.
- * @return {Observable<T>}
- * @name combineAll
- */
-export function combineAll<T, R>(project?: (...values: Array<any>) => R): OperatorFunction<T, R> {
-  return (source: Observable<T>) => source.lift(new CombineLatestOperator(project));
-}
diff --git a/node_modules/rxjs/src/internal/operators/combineLatest.ts b/node_modules/rxjs/src/internal/operators/combineLatest.ts
deleted file mode 100644
index ad984f6..0000000
--- a/node_modules/rxjs/src/internal/operators/combineLatest.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-
-import { isArray } from '../util/isArray';
-import { CombineLatestOperator } from '../observable/combineLatest';
-import { from } from '../observable/from';
-import { Observable } from '../Observable';
-import { ObservableInput, OperatorFunction } from '../types';
-
-const none = {};
-
-/* tslint:disable:max-line-length */
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, R>(project: (v1: T) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, T2, R>(v2: ObservableInput<T2>, project: (v1: T, v2: T2) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, T2, T3, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, project: (v1: T, v2: T2, v3: T3) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, T2, T3, T4, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, project: (v1: T, v2: T2, v3: T3, v4: T4) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, T2, T3, T4, T5, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, T2, T3, T4, T5, T6, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => R): OperatorFunction<T, R> ;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, T2>(v2: ObservableInput<T2>): OperatorFunction<T, [T, T2]>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, T2, T3>(v2: ObservableInput<T2>, v3: ObservableInput<T3>): OperatorFunction<T, [T, T2, T3]>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, T2, T3, T4>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): OperatorFunction<T, [T, T2, T3, T4]>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, T2, T3, T4, T5>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): OperatorFunction<T, [T, T2, T3, T4, T5]>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, T2, T3, T4, T5, T6>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): OperatorFunction<T, [T, T2, T3, T4, T5, T6]> ;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, R>(...observables: Array<ObservableInput<T> | ((...values: Array<T>) => R)>): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, R>(array: ObservableInput<T>[]): OperatorFunction<T, Array<T>>;
-/** @deprecated Deprecated in favor of static combineLatest. */
-export function combineLatest<T, TOther, R>(array: ObservableInput<TOther>[], project: (v1: T, ...values: Array<TOther>) => R): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * @deprecated Deprecated in favor of static {@link combineLatest}.
- */
-export function combineLatest<T, R>(...observables: Array<ObservableInput<any> |
-                                                    Array<ObservableInput<any>> |
-                                                    ((...values: Array<any>) => R)>): OperatorFunction<T, R> {
-  let project: (...values: Array<any>) => R = null;
-  if (typeof observables[observables.length - 1] === 'function') {
-    project = <(...values: Array<any>) => R>observables.pop();
-  }
-
-  // if the first and only other argument besides the resultSelector is an array
-  // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`
-  if (observables.length === 1 && isArray(observables[0])) {
-    observables = (<any>observables[0]).slice();
-  }
-
-  return (source: Observable<T>) => source.lift.call(from([source, ...observables]), new CombineLatestOperator(project));
-}
diff --git a/node_modules/rxjs/src/internal/operators/concat.ts b/node_modules/rxjs/src/internal/operators/concat.ts
deleted file mode 100644
index aee6466..0000000
--- a/node_modules/rxjs/src/internal/operators/concat.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import {  concat as concatStatic } from '../observable/concat';
-import { Observable } from '../Observable';
-import { ObservableInput, OperatorFunction, MonoTypeOperatorFunction, SchedulerLike } from '../types';
-
-/* tslint:disable:max-line-length */
-/** @deprecated Deprecated in favor of static concat. */
-export function concat<T>(scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static concat. */
-export function concat<T, T2>(v2: ObservableInput<T2>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2>;
-/** @deprecated Deprecated in favor of static concat. */
-export function concat<T, T2, T3>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3>;
-/** @deprecated Deprecated in favor of static concat. */
-export function concat<T, T2, T3, T4>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4>;
-/** @deprecated Deprecated in favor of static concat. */
-export function concat<T, T2, T3, T4, T5>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4 | T5>;
-/** @deprecated Deprecated in favor of static concat. */
-export function concat<T, T2, T3, T4, T5, T6>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4 | T5 | T6>;
-/** @deprecated Deprecated in favor of static concat. */
-export function concat<T>(...observables: Array<ObservableInput<T> | SchedulerLike>): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static concat. */
-export function concat<T, R>(...observables: Array<ObservableInput<any> | SchedulerLike>): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * @deprecated Deprecated in favor of static {@link concat}.
- */
-export function concat<T, R>(...observables: Array<ObservableInput<any> | SchedulerLike>): OperatorFunction<T, R> {
-  return (source: Observable<T>) => source.lift.call(concatStatic(source, ...observables));
-}
diff --git a/node_modules/rxjs/src/internal/operators/concatAll.ts b/node_modules/rxjs/src/internal/operators/concatAll.ts
deleted file mode 100644
index a6716bb..0000000
--- a/node_modules/rxjs/src/internal/operators/concatAll.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-
-import { mergeAll } from './mergeAll';
-import { OperatorFunction, ObservableInput } from '../types';
-
-export function concatAll<T>(): OperatorFunction<ObservableInput<T>, T>;
-export function concatAll<R>(): OperatorFunction<any, R>;
-
-/**
- * Converts a higher-order Observable into a first-order Observable by
- * concatenating the inner Observables in order.
- *
- * <span class="informal">Flattens an Observable-of-Observables by putting one
- * inner Observable after the other.</span>
- *
- * ![](concatAll.png)
- *
- * Joins every Observable emitted by the source (a higher-order Observable), in
- * a serial fashion. It subscribes to each inner Observable only after the
- * previous inner Observable has completed, and merges all of their values into
- * the returned observable.
- *
- * __Warning:__ If the source Observable emits Observables quickly and
- * endlessly, and the inner Observables it emits generally complete slower than
- * the source emits, you can run into memory issues as the incoming Observables
- * collect in an unbounded buffer.
- *
- * Note: `concatAll` is equivalent to `mergeAll` with concurrency parameter set
- * to `1`.
- *
- * ## Example
- *
- * For each click event, tick every second from 0 to 3, with no concurrency
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { map, take, concatAll } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const higherOrder = clicks.pipe(
- *   map(ev => interval(1000).pipe(take(4))),
- * );
- * const firstOrder = higherOrder.pipe(concatAll());
- * firstOrder.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // (results are not concurrent)
- * // For every click on the "document" it will emit values 0 to 3 spaced
- * // on a 1000ms interval
- * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3
- * ```
- *
- * @see {@link combineAll}
- * @see {@link concat}
- * @see {@link concatMap}
- * @see {@link concatMapTo}
- * @see {@link exhaust}
- * @see {@link mergeAll}
- * @see {@link switchAll}
- * @see {@link switchMap}
- * @see {@link zipAll}
- *
- * @return {Observable} An Observable emitting values from all the inner
- * Observables concatenated.
- * @method concatAll
- * @owner Observable
- */
-export function concatAll<T>(): OperatorFunction<ObservableInput<T>, T> {
-  return mergeAll<T>(1);
-}
diff --git a/node_modules/rxjs/src/internal/operators/concatMap.ts b/node_modules/rxjs/src/internal/operators/concatMap.ts
deleted file mode 100644
index 64b0ba0..0000000
--- a/node_modules/rxjs/src/internal/operators/concatMap.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import { mergeMap } from './mergeMap';
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-
-/* tslint:disable:max-line-length */
-export function concatMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) =>  O): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector no longer supported, use inner map instead */
-export function concatMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: undefined): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector no longer supported, use inner map instead */
-export function concatMap<T, R, O extends ObservableInput<any>>(project: (value: T, index: number) =>  O, resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Projects each source value to an Observable which is merged in the output
- * Observable, in a serialized fashion waiting for each one to complete before
- * merging the next.
- *
- * <span class="informal">Maps each value to an Observable, then flattens all of
- * these inner Observables using {@link concatAll}.</span>
- *
- * ![](concatMap.png)
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an (so-called "inner") Observable. Each new inner Observable is
- * concatenated with the previous inner Observable.
- *
- * __Warning:__ if source values arrive endlessly and faster than their
- * corresponding inner Observables can complete, it will result in memory issues
- * as inner Observables amass in an unbounded buffer waiting for their turn to
- * be subscribed to.
- *
- * Note: `concatMap` is equivalent to `mergeMap` with concurrency parameter set
- * to `1`.
- *
- * ## Example
- * For each click event, tick every second from 0 to 3, with no concurrency
- *
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { concatMap, take } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   concatMap(ev => interval(1000).pipe(take(4)))
- * );
- * result.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // (results are not concurrent)
- * // For every click on the "document" it will emit values 0 to 3 spaced
- * // on a 1000ms interval
- * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3
- * ```
- *
- * @see {@link concat}
- * @see {@link concatAll}
- * @see {@link concatMapTo}
- * @see {@link exhaustMap}
- * @see {@link mergeMap}
- * @see {@link switchMap}
- *
- * @param {function(value: T, ?index: number): ObservableInput} project A function
- * that, when applied to an item emitted by the source Observable, returns an
- * Observable.
- * @return {Observable} An Observable that emits the result of applying the
- * projection function (and the optional deprecated `resultSelector`) to each item emitted
- * by the source Observable and taking values from each projected inner
- * Observable sequentially.
- * @method concatMap
- * @owner Observable
- */
-export function concatMap<T, R, O extends ObservableInput<any>>(
-  project: (value: T, index: number) => O,
-  resultSelector?: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
-): OperatorFunction<T, ObservedValueOf<O>|R> {
-  return mergeMap(project, resultSelector, 1);
-}
diff --git a/node_modules/rxjs/src/internal/operators/concatMapTo.ts b/node_modules/rxjs/src/internal/operators/concatMapTo.ts
deleted file mode 100644
index 3f52fc6..0000000
--- a/node_modules/rxjs/src/internal/operators/concatMapTo.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import { concatMap } from './concatMap';
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-
-/* tslint:disable:max-line-length */
-export function concatMapTo<T, O extends ObservableInput<any>>(observable: O): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated */
-export function concatMapTo<T, O extends ObservableInput<any>>(observable: O, resultSelector: undefined): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated */
-export function concatMapTo<T, R, O extends ObservableInput<any>>(observable: O, resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Projects each source value to the same Observable which is merged multiple
- * times in a serialized fashion on the output Observable.
- *
- * <span class="informal">It's like {@link concatMap}, but maps each value
- * always to the same inner Observable.</span>
- *
- * ![](concatMapTo.png)
- *
- * Maps each source value to the given Observable `innerObservable` regardless
- * of the source value, and then flattens those resulting Observables into one
- * single Observable, which is the output Observable. Each new `innerObservable`
- * instance emitted on the output Observable is concatenated with the previous
- * `innerObservable` instance.
- *
- * __Warning:__ if source values arrive endlessly and faster than their
- * corresponding inner Observables can complete, it will result in memory issues
- * as inner Observables amass in an unbounded buffer waiting for their turn to
- * be subscribed to.
- *
- * Note: `concatMapTo` is equivalent to `mergeMapTo` with concurrency parameter
- * set to `1`.
- *
- * ## Example
- * For each click event, tick every second from 0 to 3, with no concurrency
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { concatMapTo, take } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   concatMapTo(interval(1000).pipe(take(4))),
- * );
- * result.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // (results are not concurrent)
- * // For every click on the "document" it will emit values 0 to 3 spaced
- * // on a 1000ms interval
- * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3
- * ```
- *
- * @see {@link concat}
- * @see {@link concatAll}
- * @see {@link concatMap}
- * @see {@link mergeMapTo}
- * @see {@link switchMapTo}
- *
- * @param {ObservableInput} innerObservable An Observable to replace each value from
- * the source Observable.
- * @return {Observable} An observable of values merged together by joining the
- * passed observable with itself, one after the other, for each value emitted
- * from the source.
- * @method concatMapTo
- * @owner Observable
- */
-export function concatMapTo<T, R, O extends ObservableInput<any>>(
-  innerObservable: O,
-  resultSelector?: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R
-): OperatorFunction<T, ObservedValueOf<O>|R> {
-  return concatMap(() => innerObservable, resultSelector);
-}
diff --git a/node_modules/rxjs/src/internal/operators/count.ts b/node_modules/rxjs/src/internal/operators/count.ts
deleted file mode 100644
index 1c33a9a..0000000
--- a/node_modules/rxjs/src/internal/operators/count.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Observer, OperatorFunction } from '../types';
-import { Subscriber } from '../Subscriber';
-/**
- * Counts the number of emissions on the source and emits that number when the
- * source completes.
- *
- * <span class="informal">Tells how many values were emitted, when the source
- * completes.</span>
- *
- * ![](count.png)
- *
- * `count` transforms an Observable that emits values into an Observable that
- * emits a single value that represents the number of values emitted by the
- * source Observable. If the source Observable terminates with an error, `count`
- * will pass this error notification along without emitting a value first. If
- * the source Observable does not terminate at all, `count` will neither emit
- * a value nor terminate. This operator takes an optional `predicate` function
- * as argument, in which case the output emission will represent the number of
- * source values that matched `true` with the `predicate`.
- *
- * ## Examples
- *
- * Counts how many seconds have passed before the first click happened
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { count, takeUntil } from 'rxjs/operators';
- *
- * const seconds = interval(1000);
- * const clicks = fromEvent(document, 'click');
- * const secondsBeforeClick = seconds.pipe(takeUntil(clicks));
- * const result = secondsBeforeClick.pipe(count());
- * result.subscribe(x => console.log(x));
- * ```
- *
- * Counts how many odd numbers are there between 1 and 7
- * ```ts
- * import { range } from 'rxjs';
- * import { count } from 'rxjs/operators';
- *
- * const numbers = range(1, 7);
- * const result = numbers.pipe(count(i => i % 2 === 1));
- * result.subscribe(x => console.log(x));
- * // Results in:
- * // 4
- * ```
- *
- * @see {@link max}
- * @see {@link min}
- * @see {@link reduce}
- *
- * @param {function(value: T, i: number, source: Observable<T>): boolean} [predicate] A
- * boolean function to select what values are to be counted. It is provided with
- * arguments of:
- * - `value`: the value from the source Observable.
- * - `index`: the (zero-based) "index" of the value from the source Observable.
- * - `source`: the source Observable instance itself.
- * @return {Observable} An Observable of one number that represents the count as
- * described above.
- * @method count
- * @owner Observable
- */
-
-export function count<T>(predicate?: (value: T, index: number, source: Observable<T>) => boolean): OperatorFunction<T, number> {
-  return (source: Observable<T>) => source.lift(new CountOperator(predicate, source));
-}
-
-class CountOperator<T> implements Operator<T, number> {
-  constructor(private predicate?: (value: T, index: number, source: Observable<T>) => boolean,
-              private source?: Observable<T>) {
-  }
-
-  call(subscriber: Subscriber<number>, source: any): any {
-    return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class CountSubscriber<T> extends Subscriber<T> {
-  private count: number = 0;
-  private index: number = 0;
-
-  constructor(destination: Observer<number>,
-              private predicate?: (value: T, index: number, source: Observable<T>) => boolean,
-              private source?: Observable<T>) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    if (this.predicate) {
-      this._tryPredicate(value);
-    } else {
-      this.count++;
-    }
-  }
-
-  private _tryPredicate(value: T) {
-    let result: any;
-
-    try {
-      result = this.predicate(value, this.index++, this.source);
-    } catch (err) {
-      this.destination.error(err);
-      return;
-    }
-
-    if (result) {
-      this.count++;
-    }
-  }
-
-  protected _complete(): void {
-    this.destination.next(this.count);
-    this.destination.complete();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/debounce.ts b/node_modules/rxjs/src/internal/operators/debounce.ts
deleted file mode 100644
index be2167d..0000000
--- a/node_modules/rxjs/src/internal/operators/debounce.ts
+++ /dev/null
@@ -1,148 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { MonoTypeOperatorFunction, SubscribableOrPromise, TeardownLogic } from '../types';
-
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-
-/**
- * Emits a value from the source Observable only after a particular time span
- * determined by another Observable has passed without another source emission.
- *
- * <span class="informal">It's like {@link debounceTime}, but the time span of
- * emission silence is determined by a second Observable.</span>
- *
- * ![](debounce.png)
- *
- * `debounce` delays values emitted by the source Observable, but drops previous
- * pending delayed emissions if a new value arrives on the source Observable.
- * This operator keeps track of the most recent value from the source
- * Observable, and spawns a duration Observable by calling the
- * `durationSelector` function. The value is emitted only when the duration
- * Observable emits a value or completes, and if no other value was emitted on
- * the source Observable since the duration Observable was spawned. If a new
- * value appears before the duration Observable emits, the previous value will
- * be dropped and will not be emitted on the output Observable.
- *
- * Like {@link debounceTime}, this is a rate-limiting operator, and also a
- * delay-like operator since output emissions do not necessarily occur at the
- * same time as they did on the source Observable.
- *
- * ## Example
- * Emit the most recent click after a burst of clicks
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { debounce } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(debounce(() => interval(1000)));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link audit}
- * @see {@link debounceTime}
- * @see {@link delayWhen}
- * @see {@link throttle}
- *
- * @param {function(value: T): SubscribableOrPromise} durationSelector A function
- * that receives a value from the source Observable, for computing the timeout
- * duration for each source value, returned as an Observable or a Promise.
- * @return {Observable} An Observable that delays the emissions of the source
- * Observable by the specified duration Observable returned by
- * `durationSelector`, and may drop some values if they occur too frequently.
- * @method debounce
- * @owner Observable
- */
-export function debounce<T>(durationSelector: (value: T) => SubscribableOrPromise<any>): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new DebounceOperator(durationSelector));
-}
-
-class DebounceOperator<T> implements Operator<T, T> {
-  constructor(private durationSelector: (value: T) => SubscribableOrPromise<any>) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class DebounceSubscriber<T, R> extends OuterSubscriber<T, R> {
-  private value: T;
-  private hasValue: boolean = false;
-  private durationSubscription: Subscription = null;
-
-  constructor(destination: Subscriber<R>,
-              private durationSelector: (value: T) => SubscribableOrPromise<any>) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    try {
-      const result = this.durationSelector.call(this, value);
-
-      if (result) {
-        this._tryNext(value, result);
-      }
-    } catch (err) {
-      this.destination.error(err);
-    }
-  }
-
-  protected _complete(): void {
-    this.emitValue();
-    this.destination.complete();
-  }
-
-  private _tryNext(value: T, duration: SubscribableOrPromise<any>): void {
-    let subscription = this.durationSubscription;
-    this.value = value;
-    this.hasValue = true;
-    if (subscription) {
-      subscription.unsubscribe();
-      this.remove(subscription);
-    }
-
-    subscription = subscribeToResult(this, duration);
-    if (subscription && !subscription.closed) {
-      this.add(this.durationSubscription = subscription);
-    }
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this.emitValue();
-  }
-
-  notifyComplete(): void {
-    this.emitValue();
-  }
-
-  emitValue(): void {
-    if (this.hasValue) {
-      const value = this.value;
-      const subscription = this.durationSubscription;
-      if (subscription) {
-        this.durationSubscription = null;
-        subscription.unsubscribe();
-        this.remove(subscription);
-      }
-      // This must be done *before* passing the value
-      // along to the destination because it's possible for
-      // the value to synchronously re-enter this operator
-      // recursively if the duration selector Observable
-      // emits synchronously
-      this.value = null;
-      this.hasValue = false;
-      super._next(value);
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/debounceTime.ts b/node_modules/rxjs/src/internal/operators/debounceTime.ts
deleted file mode 100644
index 8244d49..0000000
--- a/node_modules/rxjs/src/internal/operators/debounceTime.ts
+++ /dev/null
@@ -1,130 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { async } from '../scheduler/async';
-import { MonoTypeOperatorFunction, SchedulerLike, TeardownLogic } from '../types';
-
-/**
- * Emits a value from the source Observable only after a particular time span
- * has passed without another source emission.
- *
- * <span class="informal">It's like {@link delay}, but passes only the most
- * recent value from each burst of emissions.</span>
- *
- * ![](debounceTime.png)
- *
- * `debounceTime` delays values emitted by the source Observable, but drops
- * previous pending delayed emissions if a new value arrives on the source
- * Observable. This operator keeps track of the most recent value from the
- * source Observable, and emits that only when `dueTime` enough time has passed
- * without any other value appearing on the source Observable. If a new value
- * appears before `dueTime` silence occurs, the previous value will be dropped
- * and will not be emitted on the output Observable.
- *
- * This is a rate-limiting operator, because it is impossible for more than one
- * value to be emitted in any time window of duration `dueTime`, but it is also
- * a delay-like operator since output emissions do not occur at the same time as
- * they did on the source Observable. Optionally takes a {@link SchedulerLike} for
- * managing timers.
- *
- * ## Example
- * Emit the most recent click after a burst of clicks
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { debounceTime } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(debounceTime(1000));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link auditTime}
- * @see {@link debounce}
- * @see {@link delay}
- * @see {@link sampleTime}
- * @see {@link throttleTime}
- *
- * @param {number} dueTime The timeout duration in milliseconds (or the time
- * unit determined internally by the optional `scheduler`) for the window of
- * time required to wait for emission silence before emitting the most recent
- * source value.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
- * managing the timers that handle the timeout for each value.
- * @return {Observable} An Observable that delays the emissions of the source
- * Observable by the specified `dueTime`, and may drop some values if they occur
- * too frequently.
- * @method debounceTime
- * @owner Observable
- */
-export function debounceTime<T>(dueTime: number, scheduler: SchedulerLike = async): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new DebounceTimeOperator(dueTime, scheduler));
-}
-
-class DebounceTimeOperator<T> implements Operator<T, T> {
-  constructor(private dueTime: number, private scheduler: SchedulerLike) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class DebounceTimeSubscriber<T> extends Subscriber<T> {
-  private debouncedSubscription: Subscription = null;
-  private lastValue: T = null;
-  private hasValue: boolean = false;
-
-  constructor(destination: Subscriber<T>,
-              private dueTime: number,
-              private scheduler: SchedulerLike) {
-    super(destination);
-  }
-
-  protected _next(value: T) {
-    this.clearDebounce();
-    this.lastValue = value;
-    this.hasValue = true;
-    this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
-  }
-
-  protected _complete() {
-    this.debouncedNext();
-    this.destination.complete();
-  }
-
-  debouncedNext(): void {
-    this.clearDebounce();
-
-    if (this.hasValue) {
-      const { lastValue } = this;
-      // This must be done *before* passing the value
-      // along to the destination because it's possible for
-      // the value to synchronously re-enter this operator
-      // recursively when scheduled with things like
-      // VirtualScheduler/TestScheduler.
-      this.lastValue = null;
-      this.hasValue = false;
-      this.destination.next(lastValue);
-    }
-  }
-
-  private clearDebounce(): void {
-    const debouncedSubscription = this.debouncedSubscription;
-
-    if (debouncedSubscription !== null) {
-      this.remove(debouncedSubscription);
-      debouncedSubscription.unsubscribe();
-      this.debouncedSubscription = null;
-    }
-  }
-}
-
-function dispatchNext(subscriber: DebounceTimeSubscriber<any>) {
-  subscriber.debouncedNext();
-}
diff --git a/node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts b/node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts
deleted file mode 100644
index 6d6123e..0000000
--- a/node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { OperatorFunction, MonoTypeOperatorFunction } from '../types';
-
-/* tslint:disable:max-line-length */
-export function defaultIfEmpty<T>(defaultValue?: T): MonoTypeOperatorFunction<T>;
-export function defaultIfEmpty<T, R>(defaultValue?: R): OperatorFunction<T, T | R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Emits a given value if the source Observable completes without emitting any
- * `next` value, otherwise mirrors the source Observable.
- *
- * <span class="informal">If the source Observable turns out to be empty, then
- * this operator will emit a default value.</span>
- *
- * ![](defaultIfEmpty.png)
- *
- * `defaultIfEmpty` emits the values emitted by the source Observable or a
- * specified default value if the source Observable is empty (completes without
- * having emitted any `next` value).
- *
- * ## Example
- * If no clicks happen in 5 seconds, then emit "no clicks"
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { defaultIfEmpty, takeUntil } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const clicksBeforeFive = clicks.pipe(takeUntil(interval(5000)));
- * const result = clicksBeforeFive.pipe(defaultIfEmpty('no clicks'));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link empty}
- * @see {@link last}
- *
- * @param {any} [defaultValue=null] The default value used if the source
- * Observable is empty.
- * @return {Observable} An Observable that emits either the specified
- * `defaultValue` if the source Observable emits no items, or the values emitted
- * by the source Observable.
- * @method defaultIfEmpty
- * @owner Observable
- */
-export function defaultIfEmpty<T, R>(defaultValue: R = null): OperatorFunction<T, T | R> {
-  return (source: Observable<T>) => source.lift(new DefaultIfEmptyOperator(defaultValue)) as Observable<T | R>;
-}
-
-class DefaultIfEmptyOperator<T, R> implements Operator<T, T | R> {
-
-  constructor(private defaultValue: R) {
-  }
-
-  call(subscriber: Subscriber<T | R>, source: any): any {
-    return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class DefaultIfEmptySubscriber<T, R> extends Subscriber<T> {
-  private isEmpty: boolean = true;
-
-  constructor(destination: Subscriber<T | R>, private defaultValue: R) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    this.isEmpty = false;
-    this.destination.next(value);
-  }
-
-  protected _complete(): void {
-    if (this.isEmpty) {
-      this.destination.next(this.defaultValue);
-    }
-    this.destination.complete();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/delay.ts b/node_modules/rxjs/src/internal/operators/delay.ts
deleted file mode 100644
index 0f10f18..0000000
--- a/node_modules/rxjs/src/internal/operators/delay.ts
+++ /dev/null
@@ -1,161 +0,0 @@
-import { async } from '../scheduler/async';
-import { isDate } from '../util/isDate';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { Notification } from '../Notification';
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction, PartialObserver, SchedulerAction, SchedulerLike, TeardownLogic } from '../types';
-
-/**
- * Delays the emission of items from the source Observable by a given timeout or
- * until a given Date.
- *
- * <span class="informal">Time shifts each item by some specified amount of
- * milliseconds.</span>
- *
- * ![](delay.png)
- *
- * If the delay argument is a Number, this operator time shifts the source
- * Observable by that amount of time expressed in milliseconds. The relative
- * time intervals between the values are preserved.
- *
- * If the delay argument is a Date, this operator time shifts the start of the
- * Observable execution until the given date occurs.
- *
- * ## Examples
- * Delay each click by one second
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { delay } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const delayedClicks = clicks.pipe(delay(1000)); // each click emitted after 1 second
- * delayedClicks.subscribe(x => console.log(x));
- * ```
- *
- * Delay all clicks until a future date happens
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { delay } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const date = new Date('March 15, 2050 12:00:00'); // in the future
- * const delayedClicks = clicks.pipe(delay(date)); // click emitted only after that date
- * delayedClicks.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link debounceTime}
- * @see {@link delayWhen}
- *
- * @param {number|Date} delay The delay duration in milliseconds (a `number`) or
- * a `Date` until which the emission of the source items is delayed.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
- * managing the timers that handle the time-shift for each item.
- * @return {Observable} An Observable that delays the emissions of the source
- * Observable by the specified timeout or Date.
- * @method delay
- * @owner Observable
- */
-export function delay<T>(delay: number|Date,
-                         scheduler: SchedulerLike = async): MonoTypeOperatorFunction<T> {
-  const absoluteDelay = isDate(delay);
-  const delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(<number>delay);
-  return (source: Observable<T>) => source.lift(new DelayOperator(delayFor, scheduler));
-}
-
-class DelayOperator<T> implements Operator<T, T> {
-  constructor(private delay: number,
-              private scheduler: SchedulerLike) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));
-  }
-}
-
-interface DelayState<T> {
-  source: DelaySubscriber<T>;
-  destination: PartialObserver<T>;
-  scheduler: SchedulerLike;
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class DelaySubscriber<T> extends Subscriber<T> {
-  private queue: Array<DelayMessage<T>> = [];
-  private active: boolean = false;
-  private errored: boolean = false;
-
-  private static dispatch<T>(this: SchedulerAction<DelayState<T>>, state: DelayState<T>): void {
-    const source = state.source;
-    const queue = source.queue;
-    const scheduler = state.scheduler;
-    const destination = state.destination;
-
-    while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {
-      queue.shift().notification.observe(destination);
-    }
-
-    if (queue.length > 0) {
-      const delay = Math.max(0, queue[0].time - scheduler.now());
-      this.schedule(state, delay);
-    } else {
-      this.unsubscribe();
-      source.active = false;
-    }
-  }
-
-  constructor(destination: Subscriber<T>,
-              private delay: number,
-              private scheduler: SchedulerLike) {
-    super(destination);
-  }
-
-  private _schedule(scheduler: SchedulerLike): void {
-    this.active = true;
-    const destination = this.destination as Subscription;
-    destination.add(scheduler.schedule<DelayState<T>>(DelaySubscriber.dispatch, this.delay, {
-      source: this, destination: this.destination, scheduler: scheduler
-    }));
-  }
-
-  private scheduleNotification(notification: Notification<T>): void {
-    if (this.errored === true) {
-      return;
-    }
-
-    const scheduler = this.scheduler;
-    const message = new DelayMessage(scheduler.now() + this.delay, notification);
-    this.queue.push(message);
-
-    if (this.active === false) {
-      this._schedule(scheduler);
-    }
-  }
-
-  protected _next(value: T) {
-    this.scheduleNotification(Notification.createNext(value));
-  }
-
-  protected _error(err: any) {
-    this.errored = true;
-    this.queue = [];
-    this.destination.error(err);
-    this.unsubscribe();
-  }
-
-  protected _complete() {
-    this.scheduleNotification(Notification.createComplete());
-    this.unsubscribe();
-  }
-}
-
-class DelayMessage<T> {
-  constructor(public readonly time: number,
-              public readonly notification: Notification<T>) {
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/delayWhen.ts b/node_modules/rxjs/src/internal/operators/delayWhen.ts
deleted file mode 100644
index ce41541..0000000
--- a/node_modules/rxjs/src/internal/operators/delayWhen.ts
+++ /dev/null
@@ -1,225 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/* tslint:disable:max-line-length */
-/** @deprecated In future versions, empty notifiers will no longer re-emit the source value on the output observable. */
-export function delayWhen<T>(delayDurationSelector: (value: T, index: number) => Observable<never>, subscriptionDelay?: Observable<any>): MonoTypeOperatorFunction<T>;
-export function delayWhen<T>(delayDurationSelector: (value: T, index: number) => Observable<any>, subscriptionDelay?: Observable<any>): MonoTypeOperatorFunction<T>;
-/* tslint:disable:max-line-length */
-
-/**
- * Delays the emission of items from the source Observable by a given time span
- * determined by the emissions of another Observable.
- *
- * <span class="informal">It's like {@link delay}, but the time span of the
- * delay duration is determined by a second Observable.</span>
- *
- * ![](delayWhen.png)
- *
- * `delayWhen` time shifts each emitted value from the source Observable by a
- * time span determined by another Observable. When the source emits a value,
- * the `delayDurationSelector` function is called with the source value as
- * argument, and should return an Observable, called the "duration" Observable.
- * The source value is emitted on the output Observable only when the duration
- * Observable emits a value or completes.
- * The completion of the notifier triggering the emission of the source value
- * is deprecated behavior and will be removed in future versions.
- *
- * Optionally, `delayWhen` takes a second argument, `subscriptionDelay`, which
- * is an Observable. When `subscriptionDelay` emits its first value or
- * completes, the source Observable is subscribed to and starts behaving like
- * described in the previous paragraph. If `subscriptionDelay` is not provided,
- * `delayWhen` will subscribe to the source Observable as soon as the output
- * Observable is subscribed.
- *
- * ## Example
- * Delay each click by a random amount of time, between 0 and 5 seconds
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { delayWhen } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const delayedClicks = clicks.pipe(
- *   delayWhen(event => interval(Math.random() * 5000)),
- * );
- * delayedClicks.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link delay}
- * @see {@link throttle}
- * @see {@link throttleTime}
- * @see {@link debounce}
- * @see {@link debounceTime}
- * @see {@link sample}
- * @see {@link sampleTime}
- * @see {@link audit}
- * @see {@link auditTime}
- *
- * @param {function(value: T, index: number): Observable} delayDurationSelector A function that
- * returns an Observable for each value emitted by the source Observable, which
- * is then used to delay the emission of that item on the output Observable
- * until the Observable returned from this function emits a value.
- * @param {Observable} subscriptionDelay An Observable that triggers the
- * subscription to the source Observable once it emits any value.
- * @return {Observable} An Observable that delays the emissions of the source
- * Observable by an amount of time specified by the Observable returned by
- * `delayDurationSelector`.
- * @method delayWhen
- * @owner Observable
- */
-export function delayWhen<T>(delayDurationSelector: (value: T, index: number) => Observable<any>,
-                             subscriptionDelay?: Observable<any>): MonoTypeOperatorFunction<T> {
-  if (subscriptionDelay) {
-    return (source: Observable<T>) =>
-      new SubscriptionDelayObservable(source, subscriptionDelay)
-        .lift(new DelayWhenOperator(delayDurationSelector));
-  }
-  return (source: Observable<T>) => source.lift(new DelayWhenOperator(delayDurationSelector));
-}
-
-class DelayWhenOperator<T> implements Operator<T, T> {
-  constructor(private delayDurationSelector: (value: T, index: number) => Observable<any>) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class DelayWhenSubscriber<T, R> extends OuterSubscriber<T, R> {
-  private completed: boolean = false;
-  private delayNotifierSubscriptions: Array<Subscription> = [];
-  private index: number = 0;
-
-  constructor(destination: Subscriber<T>,
-              private delayDurationSelector: (value: T, index: number) => Observable<any>) {
-    super(destination);
-  }
-
-  notifyNext(outerValue: T, innerValue: any,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this.destination.next(outerValue);
-    this.removeSubscription(innerSub);
-    this.tryComplete();
-  }
-
-  notifyError(error: any, innerSub: InnerSubscriber<T, R>): void {
-    this._error(error);
-  }
-
-  notifyComplete(innerSub: InnerSubscriber<T, R>): void {
-    const value = this.removeSubscription(innerSub);
-    if (value) {
-      this.destination.next(value);
-    }
-    this.tryComplete();
-  }
-
-  protected _next(value: T): void {
-    const index = this.index++;
-    try {
-      const delayNotifier = this.delayDurationSelector(value, index);
-      if (delayNotifier) {
-        this.tryDelay(delayNotifier, value);
-      }
-    } catch (err) {
-      this.destination.error(err);
-    }
-  }
-
-  protected _complete(): void {
-    this.completed = true;
-    this.tryComplete();
-    this.unsubscribe();
-  }
-
-  private removeSubscription(subscription: InnerSubscriber<T, R>): T {
-    subscription.unsubscribe();
-
-    const subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);
-    if (subscriptionIdx !== -1) {
-      this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);
-    }
-
-    return subscription.outerValue;
-  }
-
-  private tryDelay(delayNotifier: Observable<any>, value: T): void {
-    const notifierSubscription = subscribeToResult(this, delayNotifier, value);
-
-    if (notifierSubscription && !notifierSubscription.closed) {
-      const destination = this.destination as Subscription;
-      destination.add(notifierSubscription);
-      this.delayNotifierSubscriptions.push(notifierSubscription);
-    }
-  }
-
-  private tryComplete(): void {
-    if (this.completed && this.delayNotifierSubscriptions.length === 0) {
-      this.destination.complete();
-    }
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class SubscriptionDelayObservable<T> extends Observable<T> {
-  constructor(public source: Observable<T>, private subscriptionDelay: Observable<any>) {
-    super();
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<T>) {
-    this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class SubscriptionDelaySubscriber<T> extends Subscriber<T> {
-  private sourceSubscribed: boolean = false;
-
-  constructor(private parent: Subscriber<T>, private source: Observable<T>) {
-    super();
-  }
-
-  protected _next(unused: any) {
-    this.subscribeToSource();
-  }
-
-  protected _error(err: any) {
-    this.unsubscribe();
-    this.parent.error(err);
-  }
-
-  protected _complete() {
-    this.unsubscribe();
-    this.subscribeToSource();
-  }
-
-  private subscribeToSource(): void {
-    if (!this.sourceSubscribed) {
-      this.sourceSubscribed = true;
-      this.unsubscribe();
-      this.source.subscribe(this.parent);
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/dematerialize.ts b/node_modules/rxjs/src/internal/operators/dematerialize.ts
deleted file mode 100644
index ba1dcb1..0000000
--- a/node_modules/rxjs/src/internal/operators/dematerialize.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Notification } from '../Notification';
-import { OperatorFunction } from '../types';
-
-/**
- * Converts an Observable of {@link Notification} objects into the emissions
- * that they represent.
- *
- * <span class="informal">Unwraps {@link Notification} objects as actual `next`,
- * `error` and `complete` emissions. The opposite of {@link materialize}.</span>
- *
- * ![](dematerialize.png)
- *
- * `dematerialize` is assumed to operate an Observable that only emits
- * {@link Notification} objects as `next` emissions, and does not emit any
- * `error`. Such Observable is the output of a `materialize` operation. Those
- * notifications are then unwrapped using the metadata they contain, and emitted
- * as `next`, `error`, and `complete` on the output Observable.
- *
- * Use this operator in conjunction with {@link materialize}.
- *
- * ## Example
- * Convert an Observable of Notifications to an actual Observable
- * ```ts
- * import { of, Notification } from 'rxjs';
- * import { dematerialize } from 'rxjs/operators';
- *
- * const notifA = new Notification('N', 'A');
- * const notifB = new Notification('N', 'B');
- * const notifE = new Notification('E', undefined,
- *   new TypeError('x.toUpperCase is not a function')
- * );
- * const materialized = of(notifA, notifB, notifE);
- * const upperCase = materialized.pipe(dematerialize());
- * upperCase.subscribe(x => console.log(x), e => console.error(e));
- *
- * // Results in:
- * // A
- * // B
- * // TypeError: x.toUpperCase is not a function
- * ```
- *
- * @see {@link Notification}
- * @see {@link materialize}
- *
- * @return {Observable} An Observable that emits items and notifications
- * embedded in Notification objects emitted by the source Observable.
- * @method dematerialize
- * @owner Observable
- */
-export function dematerialize<T>(): OperatorFunction<Notification<T>, T> {
-  return function dematerializeOperatorFunction(source: Observable<Notification<T>>) {
-    return source.lift(new DeMaterializeOperator());
-  };
-}
-
-class DeMaterializeOperator<T extends Notification<any>, R> implements Operator<T, R> {
-  call(subscriber: Subscriber<any>, source: any): any {
-    return source.subscribe(new DeMaterializeSubscriber(subscriber));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class DeMaterializeSubscriber<T extends Notification<any>> extends Subscriber<T> {
-  constructor(destination: Subscriber<any>) {
-    super(destination);
-  }
-
-  protected _next(value: T) {
-    value.observe(this.destination);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/distinct.ts b/node_modules/rxjs/src/internal/operators/distinct.ts
deleted file mode 100644
index b464420..0000000
--- a/node_modules/rxjs/src/internal/operators/distinct.ts
+++ /dev/null
@@ -1,135 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from previous items.
- *
- * If a keySelector function is provided, then it will project each value from the source observable into a new value that it will
- * check for equality with previously projected values. If a keySelector function is not provided, it will use each value from the
- * source observable directly with an equality check against previous values.
- *
- * In JavaScript runtimes that support `Set`, this operator will use a `Set` to improve performance of the distinct value checking.
- *
- * In other runtimes, this operator will use a minimal implementation of `Set` that relies on an `Array` and `indexOf` under the
- * hood, so performance will degrade as more values are checked for distinction. Even in newer browsers, a long-running `distinct`
- * use might result in memory leaks. To help alleviate this in some scenarios, an optional `flushes` parameter is also provided so
- * that the internal `Set` can be "flushed", basically clearing it of values.
- *
- * ## Examples
- * A simple example with numbers
- * ```ts
- * import { of } from 'rxjs';
- * import { distinct } from 'rxjs/operators';
- *
- * of(1, 1, 2, 2, 2, 1, 2, 3, 4, 3, 2, 1).pipe(
- *     distinct(),
- *   )
- *   .subscribe(x => console.log(x)); // 1, 2, 3, 4
- * ```
- *
- * An example using a keySelector function
- * ```typescript
- * import { of } from 'rxjs';
- * import { distinct } from 'rxjs/operators';
- *
- * interface Person {
- *    age: number,
- *    name: string
- * }
- *
- * of<Person>(
- *     { age: 4, name: 'Foo'},
- *     { age: 7, name: 'Bar'},
- *     { age: 5, name: 'Foo'},
- *   ).pipe(
- *     distinct((p: Person) => p.name),
- *   )
- *   .subscribe(x => console.log(x));
- *
- * // displays:
- * // { age: 4, name: 'Foo' }
- * // { age: 7, name: 'Bar' }
- * ```
- * @see {@link distinctUntilChanged}
- * @see {@link distinctUntilKeyChanged}
- *
- * @param {function} [keySelector] Optional function to select which value you want to check as distinct.
- * @param {Observable} [flushes] Optional Observable for flushing the internal HashSet of the operator.
- * @return {Observable} An Observable that emits items from the source Observable with distinct values.
- * @method distinct
- * @owner Observable
- */
-export function distinct<T, K>(keySelector?: (value: T) => K,
-                               flushes?: Observable<any>): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new DistinctOperator(keySelector, flushes));
-}
-
-class DistinctOperator<T, K> implements Operator<T, T> {
-  constructor(private keySelector: (value: T) => K, private flushes: Observable<any>) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class DistinctSubscriber<T, K> extends OuterSubscriber<T, T> {
-  private values = new Set<K>();
-
-  constructor(destination: Subscriber<T>, private keySelector: (value: T) => K, flushes: Observable<any>) {
-    super(destination);
-
-    if (flushes) {
-      this.add(subscribeToResult(this, flushes));
-    }
-  }
-
-  notifyNext(outerValue: T, innerValue: T,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, T>): void {
-    this.values.clear();
-  }
-
-  notifyError(error: any, innerSub: InnerSubscriber<T, T>): void {
-    this._error(error);
-  }
-
-  protected _next(value: T): void {
-    if (this.keySelector) {
-      this._useKeySelector(value);
-    } else {
-      this._finalizeNext(value, value);
-    }
-  }
-
-  private _useKeySelector(value: T): void {
-    let key: K;
-    const { destination } = this;
-    try {
-      key = this.keySelector(value);
-    } catch (err) {
-      destination.error(err);
-      return;
-    }
-    this._finalizeNext(key, value);
-  }
-
-  private _finalizeNext(key: K|T, value: T) {
-    const { values } = this;
-    if (!values.has(<K>key)) {
-      values.add(<K>key);
-      this.destination.next(value);
-    }
-  }
-
-}
diff --git a/node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts b/node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts
deleted file mode 100644
index 6eef0b2..0000000
--- a/node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts
+++ /dev/null
@@ -1,124 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/* tslint:disable:max-line-length */
-export function distinctUntilChanged<T>(compare?: (x: T, y: T) => boolean): MonoTypeOperatorFunction<T>;
-export function distinctUntilChanged<T, K>(compare: (x: K, y: K) => boolean, keySelector: (x: T) => K): MonoTypeOperatorFunction<T>;
-/* tslint:enable:max-line-length */
-
-/**
- * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item.
- *
- * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.
- *
- * If a comparator function is not provided, an equality check is used by default.
- *
- * ## Example
- * A simple example with numbers
- * ```ts
- * import { of } from 'rxjs';
- * import { distinctUntilChanged } from 'rxjs/operators';
- *
- * of(1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 4).pipe(
- *     distinctUntilChanged(),
- *   )
- *   .subscribe(x => console.log(x)); // 1, 2, 1, 2, 3, 4
- * ```
- *
- * An example using a compare function
- * ```typescript
- * import { of } from 'rxjs';
- * import { distinctUntilChanged } from 'rxjs/operators';
- *
- * interface Person {
- *    age: number,
- *    name: string
- * }
- *
- * of<Person>(
- *     { age: 4, name: 'Foo'},
- *     { age: 7, name: 'Bar'},
- *     { age: 5, name: 'Foo'},
- *     { age: 6, name: 'Foo'},
- *   ).pipe(
- *     distinctUntilChanged((p: Person, q: Person) => p.name === q.name),
- *   )
- *   .subscribe(x => console.log(x));
- *
- * // displays:
- * // { age: 4, name: 'Foo' }
- * // { age: 7, name: 'Bar' }
- * // { age: 5, name: 'Foo' }
- * ```
- *
- * @see {@link distinct}
- * @see {@link distinctUntilKeyChanged}
- *
- * @param {function} [compare] Optional comparison function called to test if an item is distinct from the previous item in the source.
- * @return {Observable} An Observable that emits items from the source Observable with distinct values.
- * @method distinctUntilChanged
- * @owner Observable
- */
-export function distinctUntilChanged<T, K>(compare?: (x: K, y: K) => boolean, keySelector?: (x: T) => K): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new DistinctUntilChangedOperator<T, K>(compare, keySelector));
-}
-
-class DistinctUntilChangedOperator<T, K> implements Operator<T, T> {
-  constructor(private compare: (x: K, y: K) => boolean,
-              private keySelector: (x: T) => K) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class DistinctUntilChangedSubscriber<T, K> extends Subscriber<T> {
-  private key: K;
-  private hasKey: boolean = false;
-
-  constructor(destination: Subscriber<T>,
-              compare: (x: K, y: K) => boolean,
-              private keySelector: (x: T) => K) {
-    super(destination);
-    if (typeof compare === 'function') {
-      this.compare = compare;
-    }
-  }
-
-  private compare(x: any, y: any): boolean {
-    return x === y;
-  }
-
-  protected _next(value: T): void {
-    let key: any;
-    try {
-      const { keySelector } = this;
-      key = keySelector ? keySelector(value) : value;
-    } catch (err) {
-      return this.destination.error(err);
-    }
-    let result = false;
-    if (this.hasKey) {
-      try {
-        const { compare } = this;
-        result = compare(this.key, key);
-      } catch (err) {
-        return this.destination.error(err);
-      }
-    } else {
-      this.hasKey = true;
-    }
-    if (!result) {
-      this.key = key;
-      this.destination.next(value);
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts b/node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts
deleted file mode 100644
index b649fc5..0000000
--- a/node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { distinctUntilChanged } from './distinctUntilChanged';
-import { MonoTypeOperatorFunction } from '../types';
-
-/* tslint:disable:max-line-length */
-export function distinctUntilKeyChanged<T>(key: keyof T): MonoTypeOperatorFunction<T>;
-export function distinctUntilKeyChanged<T, K extends keyof T>(key: K, compare: (x: T[K], y: T[K]) => boolean): MonoTypeOperatorFunction<T>;
-/* tslint:enable:max-line-length */
-
-/**
- * Returns an Observable that emits all items emitted by the source Observable that are distinct by comparison from the previous item,
- * using a property accessed by using the key provided to check if the two items are distinct.
- *
- * If a comparator function is provided, then it will be called for each item to test for whether or not that value should be emitted.
- *
- * If a comparator function is not provided, an equality check is used by default.
- *
- * ## Examples
- * An example comparing the name of persons
- * ```typescript
- * import { of } from 'rxjs';
- * import { distinctUntilKeyChanged } from 'rxjs/operators';
- *
- *  interface Person {
- *     age: number,
- *     name: string
- *  }
- *
- * of<Person>(
- *     { age: 4, name: 'Foo'},
- *     { age: 7, name: 'Bar'},
- *     { age: 5, name: 'Foo'},
- *     { age: 6, name: 'Foo'},
- *   ).pipe(
- *     distinctUntilKeyChanged('name'),
- *   )
- *   .subscribe(x => console.log(x));
- *
- * // displays:
- * // { age: 4, name: 'Foo' }
- * // { age: 7, name: 'Bar' }
- * // { age: 5, name: 'Foo' }
- * ```
- *
- * An example comparing the first letters of the name
- * ```typescript
- * import { of } from 'rxjs';
- * import { distinctUntilKeyChanged } from 'rxjs/operators';
- *
- * interface Person {
- *     age: number,
- *     name: string
- *  }
- *
- * of<Person>(
- *     { age: 4, name: 'Foo1'},
- *     { age: 7, name: 'Bar'},
- *     { age: 5, name: 'Foo2'},
- *     { age: 6, name: 'Foo3'},
- *   ).pipe(
- *     distinctUntilKeyChanged('name', (x: string, y: string) => x.substring(0, 3) === y.substring(0, 3)),
- *   )
- *   .subscribe(x => console.log(x));
- *
- * // displays:
- * // { age: 4, name: 'Foo1' }
- * // { age: 7, name: 'Bar' }
- * // { age: 5, name: 'Foo2' }
- * ```
- *
- * @see {@link distinct}
- * @see {@link distinctUntilChanged}
- *
- * @param {string} key String key for object property lookup on each item.
- * @param {function} [compare] Optional comparison function called to test if an item is distinct from the previous item in the source.
- * @return {Observable} An Observable that emits items from the source Observable with distinct values based on the key specified.
- * @method distinctUntilKeyChanged
- * @owner Observable
- */
-export function distinctUntilKeyChanged<T, K extends keyof T>(key: K, compare?: (x: T[K], y: T[K]) => boolean): MonoTypeOperatorFunction<T> {
-  return distinctUntilChanged((x: T, y: T) => compare ? compare(x[key], y[key]) : x[key] === y[key]);
-}
diff --git a/node_modules/rxjs/src/internal/operators/elementAt.ts b/node_modules/rxjs/src/internal/operators/elementAt.ts
deleted file mode 100644
index 5cee983..0000000
--- a/node_modules/rxjs/src/internal/operators/elementAt.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-import { filter } from './filter';
-import { throwIfEmpty } from './throwIfEmpty';
-import { defaultIfEmpty } from './defaultIfEmpty';
-import { take } from './take';
-
-/**
- * Emits the single value at the specified `index` in a sequence of emissions
- * from the source Observable.
- *
- * <span class="informal">Emits only the i-th value, then completes.</span>
- *
- * ![](elementAt.png)
- *
- * `elementAt` returns an Observable that emits the item at the specified
- * `index` in the source Observable, or a default value if that `index` is out
- * of range and the `default` argument is provided. If the `default` argument is
- * not given and the `index` is out of range, the output Observable will emit an
- * `ArgumentOutOfRangeError` error.
- *
- * ## Example
- * Emit only the third click event
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { elementAt } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(elementAt(2));
- * result.subscribe(x => console.log(x));
- *
- * // Results in:
- * // click 1 = nothing
- * // click 2 = nothing
- * // click 3 = MouseEvent object logged to console
- * ```
- *
- * @see {@link first}
- * @see {@link last}
- * @see {@link skip}
- * @see {@link single}
- * @see {@link take}
- *
- * @throws {ArgumentOutOfRangeError} When using `elementAt(i)`, it delivers an
- * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0` or the
- * Observable has completed before emitting the i-th `next` notification.
- *
- * @param {number} index Is the number `i` for the i-th source emission that has
- * happened since the subscription, starting from the number `0`.
- * @param {T} [defaultValue] The default value returned for missing indices.
- * @return {Observable} An Observable that emits a single item, if it is found.
- * Otherwise, will emit the default value if given. If not, then emits an error.
- * @method elementAt
- * @owner Observable
- */
-export function elementAt<T>(index: number, defaultValue?: T): MonoTypeOperatorFunction<T> {
-  if (index < 0) { throw new ArgumentOutOfRangeError(); }
-  const hasDefaultValue = arguments.length >= 2;
-  return (source: Observable<T>) => source.pipe(
-    filter((v, i) => i === index),
-    take(1),
-    hasDefaultValue
-      ? defaultIfEmpty(defaultValue)
-      : throwIfEmpty(() => new ArgumentOutOfRangeError()),
-  );
-}
diff --git a/node_modules/rxjs/src/internal/operators/endWith.ts b/node_modules/rxjs/src/internal/operators/endWith.ts
deleted file mode 100644
index 46aa651..0000000
--- a/node_modules/rxjs/src/internal/operators/endWith.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { Observable } from '../Observable';
-import { concat } from '../observable/concat';
-import { of } from '../observable/of';
-import { MonoTypeOperatorFunction, SchedulerLike, OperatorFunction } from '../types';
-
-/* tslint:disable:max-line-length */
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export function endWith<T>(scheduler: SchedulerLike): MonoTypeOperatorFunction<T>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export function endWith<T, A>(v1: A, scheduler: SchedulerLike): OperatorFunction<T, T | A>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export function endWith<T, A, B>(v1: A, v2: B, scheduler: SchedulerLike): OperatorFunction<T, T | A | B>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export function endWith<T, A, B, C>(v1: A, v2: B, v3: C, scheduler: SchedulerLike): OperatorFunction<T, T | A | B | C>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export function endWith<T, A, B, C, D>(v1: A, v2: B, v3: C, v4: D, scheduler: SchedulerLike): OperatorFunction<T, T | A | B | C | D>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export function endWith<T, A, B, C, D, E>(v1: A, v2: B, v3: C, v4: D, v5: E, scheduler: SchedulerLike): OperatorFunction<T, T | A | B | C | D | E>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export function endWith<T, A, B, C, D, E, F>(v1: A, v2: B, v3: C, v4: D, v5: E, v6: F, scheduler: SchedulerLike): OperatorFunction<T, T | A | B | C | D | E | F>;
-
-export function endWith<T, A>(v1: A): OperatorFunction<T, T | A>;
-export function endWith<T, A, B>(v1: A, v2: B): OperatorFunction<T, T | A | B>;
-export function endWith<T, A, B, C>(v1: A, v2: B, v3: C): OperatorFunction<T, T | A | B | C>;
-export function endWith<T, A, B, C, D>(v1: A, v2: B, v3: C, v4: D): OperatorFunction<T, T | A | B | C | D>;
-export function endWith<T, A, B, C, D, E>(v1: A, v2: B, v3: C, v4: D, v5: E): OperatorFunction<T, T | A | B | C | D | E>;
-export function endWith<T, A, B, C, D, E, F>(v1: A, v2: B, v3: C, v4: D, v5: E, v6: F): OperatorFunction<T, T | A | B | C | D | E | F>;
-export function endWith<T, Z = T>(...array: Z[]): OperatorFunction<T, T | Z>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([source, [a, b, c]], scheduler).pipe(concatAll())`) */
-export function endWith<T, Z = T>(...array: Array<Z | SchedulerLike>): OperatorFunction<T, T | Z>;
-/* tslint:enable:max-line-length */
-
-/**
- * Returns an Observable that emits the items you specify as arguments after it finishes emitting
- * items emitted by the source Observable.
- *
- * ![](endWith.png)
- *
- * ## Example
- * ### After the source observable completes, appends an emission and then completes too.
- *
- * ```ts
- * import { of } from 'rxjs';
- * import { endWith } from 'rxjs/operators';
- *
- * of('hi', 'how are you?', 'sorry, I have to go now').pipe(
- *   endWith('goodbye!'),
- * )
- * .subscribe(word => console.log(word));
- * // result:
- * // 'hi'
- * // 'how are you?'
- * // 'sorry, I have to go now'
- * // 'goodbye!'
- * ```
- *
- * @param {...T} values - Items you want the modified Observable to emit last.
- * @param {SchedulerLike} [scheduler] - A {@link SchedulerLike} to use for scheduling
- * the emissions of the `next` notifications.
- * @return {Observable} An Observable that emits the items emitted by the source Observable
- *  and then emits the items in the specified Iterable.
- * @method endWith
- * @owner Observable
- */
-export function endWith<T>(...array: Array<T | SchedulerLike>): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => concat(source, of(...array)) as Observable<T>;
-}
diff --git a/node_modules/rxjs/src/internal/operators/every.ts b/node_modules/rxjs/src/internal/operators/every.ts
deleted file mode 100644
index 5e2c9a6..0000000
--- a/node_modules/rxjs/src/internal/operators/every.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Observer, OperatorFunction } from '../types';
-
-/**
- * Returns an Observable that emits whether or not every item of the source satisfies the condition specified.
- *
- * ## Example
- * A simple example emitting true if all elements are less than 5, false otherwise
- * ```ts
- * import { of } from 'rxjs';
- * import { every } from 'rxjs/operators';
- *
- *  of(1, 2, 3, 4, 5, 6).pipe(
- *     every(x => x < 5),
- * )
- * .subscribe(x => console.log(x)); // -> false
- * ```
- *
- * @param {function} predicate A function for determining if an item meets a specified condition.
- * @param {any} [thisArg] Optional object to use for `this` in the callback.
- * @return {Observable} An Observable of booleans that determines if all items of the source Observable meet the condition specified.
- * @method every
- * @owner Observable
- */
-export function every<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean,
-                         thisArg?: any): OperatorFunction<T, boolean> {
-  return (source: Observable<T>) => source.lift(new EveryOperator(predicate, thisArg, source));
-}
-
-class EveryOperator<T> implements Operator<T, boolean> {
-  constructor(private predicate: (value: T, index: number, source: Observable<T>) => boolean,
-              private thisArg?: any,
-              private source?: Observable<T>) {
-  }
-
-  call(observer: Subscriber<boolean>, source: any): any {
-    return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class EverySubscriber<T> extends Subscriber<T> {
-  private index: number = 0;
-
-  constructor(destination: Observer<boolean>,
-              private predicate: (value: T, index: number, source: Observable<T>) => boolean,
-              private thisArg: any,
-              private source?: Observable<T>) {
-    super(destination);
-    this.thisArg = thisArg || this;
-  }
-
-  private notifyComplete(everyValueMatch: boolean): void {
-    this.destination.next(everyValueMatch);
-    this.destination.complete();
-  }
-
-  protected _next(value: T): void {
-    let result = false;
-    try {
-      result = this.predicate.call(this.thisArg, value, this.index++, this.source);
-    } catch (err) {
-      this.destination.error(err);
-      return;
-    }
-
-    if (!result) {
-      this.notifyComplete(false);
-    }
-  }
-
-  protected _complete(): void {
-    this.notifyComplete(true);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/exhaust.ts b/node_modules/rxjs/src/internal/operators/exhaust.ts
deleted file mode 100644
index ad14b76..0000000
--- a/node_modules/rxjs/src/internal/operators/exhaust.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { ObservableInput, OperatorFunction, TeardownLogic } from '../types';
-
-export function exhaust<T>(): OperatorFunction<ObservableInput<T>, T>;
-export function exhaust<R>(): OperatorFunction<any, R>;
-
-/**
- * Converts a higher-order Observable into a first-order Observable by dropping
- * inner Observables while the previous inner Observable has not yet completed.
- *
- * <span class="informal">Flattens an Observable-of-Observables by dropping the
- * next inner Observables while the current inner is still executing.</span>
- *
- * ![](exhaust.png)
- *
- * `exhaust` subscribes to an Observable that emits Observables, also known as a
- * higher-order Observable. Each time it observes one of these emitted inner
- * Observables, the output Observable begins emitting the items emitted by that
- * inner Observable. So far, it behaves like {@link mergeAll}. However,
- * `exhaust` ignores every new inner Observable if the previous Observable has
- * not yet completed. Once that one completes, it will accept and flatten the
- * next inner Observable and repeat this process.
- *
- * ## Example
- * Run a finite timer for each click, only if there is no currently active timer
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { exhaust, map, take } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const higherOrder = clicks.pipe(
- *   map((ev) => interval(1000).pipe(take(5))),
- * );
- * const result = higherOrder.pipe(exhaust());
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link combineAll}
- * @see {@link concatAll}
- * @see {@link switchAll}
- * @see {@link switchMap}
- * @see {@link mergeAll}
- * @see {@link exhaustMap}
- * @see {@link zipAll}
- *
- * @return {Observable} An Observable that takes a source of Observables and propagates the first observable
- * exclusively until it completes before subscribing to the next.
- * @method exhaust
- * @owner Observable
- */
-export function exhaust<T>(): OperatorFunction<any, T> {
-  return (source: Observable<T>) => source.lift(new SwitchFirstOperator<T>());
-}
-
-class SwitchFirstOperator<T> implements Operator<T, T> {
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new SwitchFirstSubscriber(subscriber));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class SwitchFirstSubscriber<T> extends OuterSubscriber<T, T> {
-  private hasCompleted: boolean = false;
-  private hasSubscription: boolean = false;
-
-  constructor(destination: Subscriber<T>) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    if (!this.hasSubscription) {
-      this.hasSubscription = true;
-      this.add(subscribeToResult(this, value));
-    }
-  }
-
-  protected _complete(): void {
-    this.hasCompleted = true;
-    if (!this.hasSubscription) {
-      this.destination.complete();
-    }
-  }
-
-  notifyComplete(innerSub: Subscription): void {
-    this.remove(innerSub);
-    this.hasSubscription = false;
-    if (this.hasCompleted) {
-      this.destination.complete();
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/exhaustMap.ts b/node_modules/rxjs/src/internal/operators/exhaustMap.ts
deleted file mode 100644
index 3bf6ff4..0000000
--- a/node_modules/rxjs/src/internal/operators/exhaustMap.ts
+++ /dev/null
@@ -1,164 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-import { map } from './map';
-import { from } from '../observable/from';
-
-/* tslint:disable:max-line-length */
-export function exhaustMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector is no longer supported. Use inner map instead. */
-export function exhaustMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: undefined): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector is no longer supported. Use inner map instead. */
-export function exhaustMap<T, I, R>(project: (value: T, index: number) => ObservableInput<I>, resultSelector: (outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Projects each source value to an Observable which is merged in the output
- * Observable only if the previous projected Observable has completed.
- *
- * <span class="informal">Maps each value to an Observable, then flattens all of
- * these inner Observables using {@link exhaust}.</span>
- *
- * ![](exhaustMap.png)
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an (so-called "inner") Observable. When it projects a source value to
- * an Observable, the output Observable begins emitting the items emitted by
- * that projected Observable. However, `exhaustMap` ignores every new projected
- * Observable if the previous projected Observable has not yet completed. Once
- * that one completes, it will accept and flatten the next projected Observable
- * and repeat this process.
- *
- * ## Example
- * Run a finite timer for each click, only if there is no currently active timer
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { exhaustMap, take } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   exhaustMap(ev => interval(1000).pipe(take(5)))
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link concatMap}
- * @see {@link exhaust}
- * @see {@link mergeMap}
- * @see {@link switchMap}
- *
- * @param {function(value: T, ?index: number): ObservableInput} project A function
- * that, when applied to an item emitted by the source Observable, returns an
- * Observable.
- * @return {Observable} An Observable containing projected Observables
- * of each item of the source, ignoring projected Observables that start before
- * their preceding Observable has completed.
- * @method exhaustMap
- * @owner Observable
- */
-export function exhaustMap<T, R, O extends ObservableInput<any>>(
-  project: (value: T, index: number) => O,
-  resultSelector?: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R,
-): OperatorFunction<T, ObservedValueOf<O>|R> {
-  if (resultSelector) {
-    // DEPRECATED PATH
-    return (source: Observable<T>) => source.pipe(
-      exhaustMap((a, i) => from(project(a, i)).pipe(
-        map((b: any, ii: any) => resultSelector(a, b, i, ii)),
-      )),
-    );
-  }
-  return (source: Observable<T>) =>
-    source.lift(new ExhaustMapOperator(project));
-}
-
-class ExhaustMapOperator<T, R> implements Operator<T, R> {
-  constructor(private project: (value: T, index: number) => ObservableInput<R>) {
-  }
-
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class ExhaustMapSubscriber<T, R> extends OuterSubscriber<T, R> {
-  private hasSubscription = false;
-  private hasCompleted = false;
-  private index = 0;
-
-  constructor(destination: Subscriber<R>,
-              private project: (value: T, index: number) => ObservableInput<R>) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    if (!this.hasSubscription) {
-      this.tryNext(value);
-    }
-  }
-
-  private tryNext(value: T): void {
-    let result: ObservableInput<R>;
-    const index = this.index++;
-    try {
-      result = this.project(value, index);
-    } catch (err) {
-      this.destination.error(err);
-      return;
-    }
-    this.hasSubscription = true;
-    this._innerSub(result, value, index);
-  }
-
-  private _innerSub(result: ObservableInput<R>, value: T, index: number): void {
-    const innerSubscriber = new InnerSubscriber(this, value, index);
-    const destination = this.destination as Subscription;
-    destination.add(innerSubscriber);
-    const innerSubscription = subscribeToResult<T, R>(this, result, undefined, undefined, innerSubscriber);
-    // The returned subscription will usually be the subscriber that was
-    // passed. However, interop subscribers will be wrapped and for
-    // unsubscriptions to chain correctly, the wrapper needs to be added, too.
-    if (innerSubscription !== innerSubscriber) {
-      destination.add(innerSubscription);
-    }
-  }
-
-  protected _complete(): void {
-    this.hasCompleted = true;
-    if (!this.hasSubscription) {
-      this.destination.complete();
-    }
-    this.unsubscribe();
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this.destination.next(innerValue);
-  }
-
-  notifyError(err: any): void {
-    this.destination.error(err);
-  }
-
-  notifyComplete(innerSub: Subscription): void {
-    const destination = this.destination as Subscription;
-    destination.remove(innerSub);
-
-    this.hasSubscription = false;
-    if (this.hasCompleted) {
-      this.destination.complete();
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/expand.ts b/node_modules/rxjs/src/internal/operators/expand.ts
deleted file mode 100644
index b686d61..0000000
--- a/node_modules/rxjs/src/internal/operators/expand.ts
+++ /dev/null
@@ -1,180 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { MonoTypeOperatorFunction, OperatorFunction, ObservableInput, SchedulerLike } from '../types';
-
-/* tslint:disable:max-line-length */
-export function expand<T, R>(project: (value: T, index: number) => ObservableInput<R>, concurrent?: number, scheduler?: SchedulerLike): OperatorFunction<T, R>;
-export function expand<T>(project: (value: T, index: number) => ObservableInput<T>, concurrent?: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
-/* tslint:enable:max-line-length */
-
-/**
- * Recursively projects each source value to an Observable which is merged in
- * the output Observable.
- *
- * <span class="informal">It's similar to {@link mergeMap}, but applies the
- * projection function to every source value as well as every output value.
- * It's recursive.</span>
- *
- * ![](expand.png)
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an Observable, and then merging those resulting Observables and
- * emitting the results of this merger. *Expand* will re-emit on the output
- * Observable every source value. Then, each output value is given to the
- * `project` function which returns an inner Observable to be merged on the
- * output Observable. Those output values resulting from the projection are also
- * given to the `project` function to produce new output values. This is how
- * *expand* behaves recursively.
- *
- * ## Example
- * Start emitting the powers of two on every click, at most 10 of them
- * ```ts
- * import { fromEvent, of } from 'rxjs';
- * import { expand, mapTo, delay, take } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const powersOfTwo = clicks.pipe(
- *   mapTo(1),
- *   expand(x => of(2 * x).pipe(delay(1000))),
- *   take(10),
- * );
- * powersOfTwo.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link mergeMap}
- * @see {@link mergeScan}
- *
- * @param {function(value: T, index: number) => Observable} project A function
- * that, when applied to an item emitted by the source or the output Observable,
- * returns an Observable.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @param {SchedulerLike} [scheduler=null] The {@link SchedulerLike} to use for subscribing to
- * each projected inner Observable.
- * @return {Observable} An Observable that emits the source values and also
- * result of applying the projection function to each value emitted on the
- * output Observable and and merging the results of the Observables obtained
- * from this transformation.
- * @method expand
- * @owner Observable
- */
-export function expand<T, R>(project: (value: T, index: number) => ObservableInput<R>,
-                             concurrent: number = Number.POSITIVE_INFINITY,
-                             scheduler: SchedulerLike = undefined): OperatorFunction<T, R> {
-  concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
-
-  return (source: Observable<T>) => source.lift(new ExpandOperator(project, concurrent, scheduler));
-}
-
-export class ExpandOperator<T, R> implements Operator<T, R> {
-  constructor(private project: (value: T, index: number) => ObservableInput<R>,
-              private concurrent: number,
-              private scheduler: SchedulerLike) {
-  }
-
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));
-  }
-}
-
-interface DispatchArg<T, R> {
-  subscriber: ExpandSubscriber<T, R>;
-  result: ObservableInput<R>;
-  value: any;
-  index: number;
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class ExpandSubscriber<T, R> extends OuterSubscriber<T, R> {
-  private index: number = 0;
-  private active: number = 0;
-  private hasCompleted: boolean = false;
-  private buffer: any[];
-
-  constructor(destination: Subscriber<R>,
-              private project: (value: T, index: number) => ObservableInput<R>,
-              private concurrent: number,
-              private scheduler: SchedulerLike) {
-    super(destination);
-    if (concurrent < Number.POSITIVE_INFINITY) {
-      this.buffer = [];
-    }
-  }
-
-  private static dispatch<T, R>(arg: DispatchArg<T, R>): void {
-    const {subscriber, result, value, index} = arg;
-    subscriber.subscribeToProjection(result, value, index);
-  }
-
-  protected _next(value: any): void {
-    const destination = this.destination;
-
-    if (destination.closed) {
-      this._complete();
-      return;
-    }
-
-    const index = this.index++;
-    if (this.active < this.concurrent) {
-      destination.next(value);
-      try {
-        const { project } = this;
-        const result = project(value, index);
-        if (!this.scheduler) {
-          this.subscribeToProjection(result, value, index);
-        } else {
-          const state: DispatchArg<T, R> = { subscriber: this, result, value, index };
-          const destination = this.destination as Subscription;
-          destination.add(this.scheduler.schedule<DispatchArg<T, R>>(ExpandSubscriber.dispatch, 0, state));
-        }
-      } catch (e) {
-        destination.error(e);
-      }
-    } else {
-      this.buffer.push(value);
-    }
-  }
-
-  private subscribeToProjection(result: any, value: T, index: number): void {
-    this.active++;
-    const destination = this.destination as Subscription;
-    destination.add(subscribeToResult<T, R>(this, result, value, index));
-  }
-
-  protected _complete(): void {
-    this.hasCompleted = true;
-    if (this.hasCompleted && this.active === 0) {
-      this.destination.complete();
-    }
-    this.unsubscribe();
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this._next(innerValue);
-  }
-
-  notifyComplete(innerSub: Subscription): void {
-    const buffer = this.buffer;
-    const destination = this.destination as Subscription;
-    destination.remove(innerSub);
-    this.active--;
-    if (buffer && buffer.length > 0) {
-      this._next(buffer.shift());
-    }
-    if (this.hasCompleted && this.active === 0) {
-      this.destination.complete();
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/filter.ts b/node_modules/rxjs/src/internal/operators/filter.ts
deleted file mode 100644
index 953aacc..0000000
--- a/node_modules/rxjs/src/internal/operators/filter.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { OperatorFunction, MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/* tslint:disable:max-line-length */
-export function filter<T, S extends T>(predicate: (value: T, index: number) => value is S,
-                                       thisArg?: any): OperatorFunction<T, S>;
-export function filter<T>(predicate: (value: T, index: number) => boolean,
-                          thisArg?: any): MonoTypeOperatorFunction<T>;
-/* tslint:enable:max-line-length */
-
-/**
- * Filter items emitted by the source Observable by only emitting those that
- * satisfy a specified predicate.
- *
- * <span class="informal">Like
- * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),
- * it only emits a value from the source if it passes a criterion function.</span>
- *
- * ![](filter.png)
- *
- * Similar to the well-known `Array.prototype.filter` method, this operator
- * takes values from the source Observable, passes them through a `predicate`
- * function and only emits those values that yielded `true`.
- *
- * ## Example
- * Emit only click events whose target was a DIV element
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { filter } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const clicksOnDivs = clicks.pipe(filter(ev => ev.target.tagName === 'DIV'));
- * clicksOnDivs.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link distinct}
- * @see {@link distinctUntilChanged}
- * @see {@link distinctUntilKeyChanged}
- * @see {@link ignoreElements}
- * @see {@link partition}
- * @see {@link skip}
- *
- * @param {function(value: T, index: number): boolean} predicate A function that
- * evaluates each value emitted by the source Observable. If it returns `true`,
- * the value is emitted, if `false` the value is not passed to the output
- * Observable. The `index` parameter is the number `i` for the i-th source
- * emission that has happened since the subscription, starting from the number
- * `0`.
- * @param {any} [thisArg] An optional argument to determine the value of `this`
- * in the `predicate` function.
- * @return {Observable} An Observable of values from the source that were
- * allowed by the `predicate` function.
- * @method filter
- * @owner Observable
- */
-export function filter<T>(predicate: (value: T, index: number) => boolean,
-                          thisArg?: any): MonoTypeOperatorFunction<T> {
-  return function filterOperatorFunction(source: Observable<T>): Observable<T> {
-    return source.lift(new FilterOperator(predicate, thisArg));
-  };
-}
-
-class FilterOperator<T> implements Operator<T, T> {
-  constructor(private predicate: (value: T, index: number) => boolean,
-              private thisArg?: any) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class FilterSubscriber<T> extends Subscriber<T> {
-
-  count: number = 0;
-
-  constructor(destination: Subscriber<T>,
-              private predicate: (value: T, index: number) => boolean,
-              private thisArg: any) {
-    super(destination);
-  }
-
-  // the try catch block below is left specifically for
-  // optimization and perf reasons. a tryCatcher is not necessary here.
-  protected _next(value: T) {
-    let result: any;
-    try {
-      result = this.predicate.call(this.thisArg, value, this.count++);
-    } catch (err) {
-      this.destination.error(err);
-      return;
-    }
-    if (result) {
-      this.destination.next(value);
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/finalize.ts b/node_modules/rxjs/src/internal/operators/finalize.ts
deleted file mode 100644
index d19d613..0000000
--- a/node_modules/rxjs/src/internal/operators/finalize.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Returns an Observable that mirrors the source Observable, but will call a specified function when
- * the source terminates on complete or error.
- * @param {function} callback Function to be called when source terminates.
- * @return {Observable} An Observable that mirrors the source, but will call the specified function on termination.
- * @method finally
- * @owner Observable
- */
-export function finalize<T>(callback: () => void): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new FinallyOperator(callback));
-}
-
-class FinallyOperator<T> implements Operator<T, T> {
-  constructor(private callback: () => void) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new FinallySubscriber(subscriber, this.callback));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class FinallySubscriber<T> extends Subscriber<T> {
-  constructor(destination: Subscriber<T>, callback: () => void) {
-    super(destination);
-    this.add(new Subscription(callback));
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/find.ts b/node_modules/rxjs/src/internal/operators/find.ts
deleted file mode 100644
index 31cd7cc..0000000
--- a/node_modules/rxjs/src/internal/operators/find.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-import {Observable} from '../Observable';
-import {Operator} from '../Operator';
-import {Subscriber} from '../Subscriber';
-import {OperatorFunction} from '../types';
-
-export function find<T, S extends T>(predicate: (value: T, index: number, source: Observable<T>) => value is S,
-                                     thisArg?: any): OperatorFunction<T, S | undefined>;
-export function find<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean,
-                        thisArg?: any): OperatorFunction<T, T | undefined>;
-/**
- * Emits only the first value emitted by the source Observable that meets some
- * condition.
- *
- * <span class="informal">Finds the first value that passes some test and emits
- * that.</span>
- *
- * ![](find.png)
- *
- * `find` searches for the first item in the source Observable that matches the
- * specified condition embodied by the `predicate`, and returns the first
- * occurrence in the source. Unlike {@link first}, the `predicate` is required
- * in `find`, and does not emit an error if a valid value is not found.
- *
- * ## Example
- * Find and emit the first click that happens on a DIV element
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { find } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(find(ev => ev.target.tagName === 'DIV'));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link filter}
- * @see {@link first}
- * @see {@link findIndex}
- * @see {@link take}
- *
- * @param {function(value: T, index: number, source: Observable<T>): boolean} predicate
- * A function called with each item to test for condition matching.
- * @param {any} [thisArg] An optional argument to determine the value of `this`
- * in the `predicate` function.
- * @return {Observable<T>} An Observable of the first item that matches the
- * condition.
- * @method find
- * @owner Observable
- */
-export function find<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean,
-                        thisArg?: any): OperatorFunction<T, T | undefined> {
-  if (typeof predicate !== 'function') {
-    throw new TypeError('predicate is not a function');
-  }
-  return (source: Observable<T>) => source.lift(new FindValueOperator(predicate, source, false, thisArg)) as Observable<T | undefined>;
-}
-
-export class FindValueOperator<T> implements Operator<T, T | number | undefined> {
-  constructor(private predicate: (value: T, index: number, source: Observable<T>) => boolean,
-              private source: Observable<T>,
-              private yieldIndex: boolean,
-              private thisArg?: any) {
-  }
-
-  call(observer: Subscriber<T>, source: any): any {
-    return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class FindValueSubscriber<T> extends Subscriber<T> {
-  private index: number = 0;
-
-  constructor(destination: Subscriber<T>,
-              private predicate: (value: T, index: number, source: Observable<T>) => boolean,
-              private source: Observable<T>,
-              private yieldIndex: boolean,
-              private thisArg?: any) {
-    super(destination);
-  }
-
-  private notifyComplete(value: any): void {
-    const destination = this.destination;
-
-    destination.next(value);
-    destination.complete();
-    this.unsubscribe();
-  }
-
-  protected _next(value: T): void {
-    const {predicate, thisArg} = this;
-    const index = this.index++;
-    try {
-      const result = predicate.call(thisArg || this, value, index, this.source);
-      if (result) {
-        this.notifyComplete(this.yieldIndex ? index : value);
-      }
-    } catch (err) {
-      this.destination.error(err);
-    }
-  }
-
-  protected _complete(): void {
-    this.notifyComplete(this.yieldIndex ? -1 : undefined);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/findIndex.ts b/node_modules/rxjs/src/internal/operators/findIndex.ts
deleted file mode 100644
index bdb62d4..0000000
--- a/node_modules/rxjs/src/internal/operators/findIndex.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { Observable } from '../Observable';
-import { FindValueOperator } from '../operators/find';
-import { OperatorFunction } from '../types';
-/**
- * Emits only the index of the first value emitted by the source Observable that
- * meets some condition.
- *
- * <span class="informal">It's like {@link find}, but emits the index of the
- * found value, not the value itself.</span>
- *
- * ![](findIndex.png)
- *
- * `findIndex` searches for the first item in the source Observable that matches
- * the specified condition embodied by the `predicate`, and returns the
- * (zero-based) index of the first occurrence in the source. Unlike
- * {@link first}, the `predicate` is required in `findIndex`, and does not emit
- * an error if a valid value is not found.
- *
- * ## Example
- * Emit the index of first click that happens on a DIV element
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { findIndex } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(findIndex(ev => ev.target.tagName === 'DIV'));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link filter}
- * @see {@link find}
- * @see {@link first}
- * @see {@link take}
- *
- * @param {function(value: T, index: number, source: Observable<T>): boolean} predicate
- * A function called with each item to test for condition matching.
- * @param {any} [thisArg] An optional argument to determine the value of `this`
- * in the `predicate` function.
- * @return {Observable} An Observable of the index of the first item that
- * matches the condition.
- * @method find
- * @owner Observable
- */
-export function findIndex<T>(predicate: (value: T, index: number, source: Observable<T>) => boolean,
-                             thisArg?: any): OperatorFunction<T, number> {
-  return (source: Observable<T>) => source.lift(new FindValueOperator(predicate, source, true, thisArg)) as Observable<any>;
-}
diff --git a/node_modules/rxjs/src/internal/operators/first.ts b/node_modules/rxjs/src/internal/operators/first.ts
deleted file mode 100644
index 80ad111..0000000
--- a/node_modules/rxjs/src/internal/operators/first.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { EmptyError } from '../util/EmptyError';
-import { OperatorFunction } from '../../internal/types';
-import { filter } from './filter';
-import { take } from './take';
-import { defaultIfEmpty } from './defaultIfEmpty';
-import { throwIfEmpty } from './throwIfEmpty';
-import { identity } from '../util/identity';
-
-/* tslint:disable:max-line-length */
-export function first<T, D = T>(
-  predicate?: null,
-  defaultValue?: D
-): OperatorFunction<T, T | D>;
-export function first<T, S extends T>(
-  predicate: (value: T, index: number, source: Observable<T>) => value is S,
-  defaultValue?: S
-): OperatorFunction<T, S>;
-export function first<T, D = T>(
-  predicate: (value: T, index: number, source: Observable<T>) => boolean,
-  defaultValue?: D
-): OperatorFunction<T, T | D>;
-/* tslint:enable:max-line-length */
-
-/**
- * Emits only the first value (or the first value that meets some condition)
- * emitted by the source Observable.
- *
- * <span class="informal">Emits only the first value. Or emits only the first
- * value that passes some test.</span>
- *
- * ![](first.png)
- *
- * If called with no arguments, `first` emits the first value of the source
- * Observable, then completes. If called with a `predicate` function, `first`
- * emits the first value of the source that matches the specified condition. It
- * may also take a deprecated `resultSelector` function to produce the output
- * value from the input value, and a `defaultValue` to emit in case the source
- * completes before it is able to emit a valid value. Throws an error if
- * `defaultValue` was not provided and a matching element is not found.
- *
- * ## Examples
- * Emit only the first click that happens on the DOM
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { first } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(first());
- * result.subscribe(x => console.log(x));
- * ```
- *
- * Emits the first click that happens on a DIV
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { first } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(first(ev => ev.target.tagName === 'DIV'));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link filter}
- * @see {@link find}
- * @see {@link take}
- *
- * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
- * callback if the Observable completes before any `next` notification was sent.
- *
- * @param {function(value: T, index: number, source: Observable<T>): boolean} [predicate]
- * An optional function called with each item to test for condition matching.
- * @param {R} [defaultValue] The default value emitted in case no valid value
- * was found on the source.
- * @return {Observable<T|R>} An Observable of the first item that matches the
- * condition.
- * @method first
- * @owner Observable
- */
-export function first<T, D>(
-  predicate?: ((value: T, index: number, source: Observable<T>) => boolean) | null,
-  defaultValue?: D
-): OperatorFunction<T, T | D> {
-  const hasDefaultValue = arguments.length >= 2;
-  return (source: Observable<T>) => source.pipe(
-    predicate ? filter((v, i) => predicate(v, i, source)) : identity,
-    take(1),
-    hasDefaultValue ? defaultIfEmpty<T | D>(defaultValue) : throwIfEmpty(() => new EmptyError()),
-  );
-}
diff --git a/node_modules/rxjs/src/internal/operators/groupBy.ts b/node_modules/rxjs/src/internal/operators/groupBy.ts
deleted file mode 100644
index 3f6343f..0000000
--- a/node_modules/rxjs/src/internal/operators/groupBy.ts
+++ /dev/null
@@ -1,319 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subject } from '../Subject';
-import { OperatorFunction } from '../types';
-
-/* tslint:disable:max-line-length */
-export function groupBy<T, K>(keySelector: (value: T) => K): OperatorFunction<T, GroupedObservable<K, T>>;
-export function groupBy<T, K>(keySelector: (value: T) => K, elementSelector: void, durationSelector: (grouped: GroupedObservable<K, T>) => Observable<any>): OperatorFunction<T, GroupedObservable<K, T>>;
-export function groupBy<T, K, R>(keySelector: (value: T) => K, elementSelector?: (value: T) => R, durationSelector?: (grouped: GroupedObservable<K, R>) => Observable<any>): OperatorFunction<T, GroupedObservable<K, R>>;
-export function groupBy<T, K, R>(keySelector: (value: T) => K, elementSelector?: (value: T) => R, durationSelector?: (grouped: GroupedObservable<K, R>) => Observable<any>, subjectSelector?: () => Subject<R>): OperatorFunction<T, GroupedObservable<K, R>>;
-/* tslint:enable:max-line-length */
-
-/**
- * Groups the items emitted by an Observable according to a specified criterion,
- * and emits these grouped items as `GroupedObservables`, one
- * {@link GroupedObservable} per group.
- *
- * ![](groupBy.png)
- *
- * When the Observable emits an item, a key is computed for this item with the keySelector function.
- *
- * If a {@link GroupedObservable} for this key exists, this {@link GroupedObservable} emits. Elsewhere, a new
- * {@link GroupedObservable} for this key is created and emits.
- *
- * A {@link GroupedObservable} represents values belonging to the same group represented by a common key. The common
- * key is available as the key field of a {@link GroupedObservable} instance.
- *
- * The elements emitted by {@link GroupedObservable}s are by default the items emitted by the Observable, or elements
- * returned by the elementSelector function.
- *
- * ## Examples
- *
- * ### Group objects by id and return as array
- *
- * ```ts
- * import { of } from 'rxjs';
- * import { mergeMap, groupBy, reduce } from 'rxjs/operators';
- *
- * of(
- *   {id: 1, name: 'JavaScript'},
- *   {id: 2, name: 'Parcel'},
- *   {id: 2, name: 'webpack'},
- *   {id: 1, name: 'TypeScript'},
- *   {id: 3, name: 'TSLint'}
- * ).pipe(
- *   groupBy(p => p.id),
- *   mergeMap((group$) => group$.pipe(reduce((acc, cur) => [...acc, cur], []))),
- * )
- * .subscribe(p => console.log(p));
- *
- * // displays:
- * // [ { id: 1, name: 'JavaScript'},
- * //   { id: 1, name: 'TypeScript'} ]
- * //
- * // [ { id: 2, name: 'Parcel'},
- * //   { id: 2, name: 'webpack'} ]
- * //
- * // [ { id: 3, name: 'TSLint'} ]
- * ```
- *
- * ### Pivot data on the id field
- *
- * ```ts
- * import { of } from 'rxjs';
- * import { groupBy, map, mergeMap, reduce } from 'rxjs/operators';
- *
- * of(
- *   { id: 1, name: 'JavaScript' },
- *   { id: 2, name: 'Parcel' },
- *   { id: 2, name: 'webpack' },
- *   { id: 1, name: 'TypeScript' },
- *   { id: 3, name: 'TSLint' }
- * )
- *   .pipe(
- *     groupBy(p => p.id, p => p.name),
- *     mergeMap(group$ =>
- *       group$.pipe(reduce((acc, cur) => [...acc, cur], [`${group$.key}`]))
- *     ),
- *     map(arr => ({ id: parseInt(arr[0], 10), values: arr.slice(1) }))
- *  )
- *  .subscribe(p => console.log(p));
- *
- * // displays:
- * // { id: 1, values: [ 'JavaScript', 'TypeScript' ] }
- * // { id: 2, values: [ 'Parcel', 'webpack' ] }
- * // { id: 3, values: [ 'TSLint' ] }
- * ```
- *
- * @param {function(value: T): K} keySelector A function that extracts the key
- * for each item.
- * @param {function(value: T): R} [elementSelector] A function that extracts the
- * return element for each item.
- * @param {function(grouped: GroupedObservable<K,R>): Observable<any>} [durationSelector]
- * A function that returns an Observable to determine how long each group should
- * exist.
- * @return {Observable<GroupedObservable<K,R>>} An Observable that emits
- * GroupedObservables, each of which corresponds to a unique key value and each
- * of which emits those items from the source Observable that share that key
- * value.
- * @method groupBy
- * @owner Observable
- */
-export function groupBy<T, K, R>(keySelector: (value: T) => K,
-                                 elementSelector?: ((value: T) => R) | void,
-                                 durationSelector?: (grouped: GroupedObservable<K, R>) => Observable<any>,
-                                 subjectSelector?: () => Subject<R>): OperatorFunction<T, GroupedObservable<K, R>> {
-  return (source: Observable<T>) =>
-    source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));
-}
-
-export interface RefCountSubscription {
-  count: number;
-  unsubscribe: () => void;
-  closed: boolean;
-  attemptedToUnsubscribe: boolean;
-}
-
-class GroupByOperator<T, K, R> implements Operator<T, GroupedObservable<K, R>> {
-  constructor(private keySelector: (value: T) => K,
-              private elementSelector?: ((value: T) => R) | void,
-              private durationSelector?: (grouped: GroupedObservable<K, R>) => Observable<any>,
-              private subjectSelector?: () => Subject<R>) {
-  }
-
-  call(subscriber: Subscriber<GroupedObservable<K, R>>, source: any): any {
-    return source.subscribe(new GroupBySubscriber(
-      subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector
-    ));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class GroupBySubscriber<T, K, R> extends Subscriber<T> implements RefCountSubscription {
-  private groups: Map<K, Subject<T | R>> = null;
-  public attemptedToUnsubscribe: boolean = false;
-  public count: number = 0;
-
-  constructor(destination: Subscriber<GroupedObservable<K, R>>,
-              private keySelector: (value: T) => K,
-              private elementSelector?: ((value: T) => R) | void,
-              private durationSelector?: (grouped: GroupedObservable<K, R>) => Observable<any>,
-              private subjectSelector?: () => Subject<R>) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    let key: K;
-    try {
-      key = this.keySelector(value);
-    } catch (err) {
-      this.error(err);
-      return;
-    }
-
-    this._group(value, key);
-  }
-
-  private _group(value: T, key: K) {
-    let groups = this.groups;
-
-    if (!groups) {
-      groups = this.groups = new Map<K, Subject<T | R>>();
-    }
-
-    let group = groups.get(key);
-
-    let element: R;
-    if (this.elementSelector) {
-      try {
-        element = this.elementSelector(value);
-      } catch (err) {
-        this.error(err);
-      }
-    } else {
-      element = <any>value;
-    }
-
-    if (!group) {
-      group = (this.subjectSelector ? this.subjectSelector() : new Subject<R>()) as Subject<T | R>;
-      groups.set(key, group);
-      const groupedObservable = new GroupedObservable(key, group, this);
-      this.destination.next(groupedObservable);
-      if (this.durationSelector) {
-        let duration: any;
-        try {
-          duration = this.durationSelector(new GroupedObservable<K, R>(key, <Subject<R>>group));
-        } catch (err) {
-          this.error(err);
-          return;
-        }
-        this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));
-      }
-    }
-
-    if (!group.closed) {
-      group.next(element);
-    }
-  }
-
-  protected _error(err: any): void {
-    const groups = this.groups;
-    if (groups) {
-      groups.forEach((group, key) => {
-        group.error(err);
-      });
-
-      groups.clear();
-    }
-    this.destination.error(err);
-  }
-
-  protected _complete(): void {
-    const groups = this.groups;
-    if (groups) {
-      groups.forEach((group, key) => {
-        group.complete();
-      });
-
-      groups.clear();
-    }
-    this.destination.complete();
-  }
-
-  removeGroup(key: K): void {
-    this.groups.delete(key);
-  }
-
-  unsubscribe() {
-    if (!this.closed) {
-      this.attemptedToUnsubscribe = true;
-      if (this.count === 0) {
-        super.unsubscribe();
-      }
-    }
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class GroupDurationSubscriber<K, T> extends Subscriber<T> {
-  constructor(private key: K,
-              private group: Subject<T>,
-              private parent: GroupBySubscriber<any, K, T | any>) {
-    super(group);
-  }
-
-  protected _next(value: T): void {
-    this.complete();
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _unsubscribe() {
-    const { parent, key } = this;
-    this.key = this.parent = null;
-    if (parent) {
-      parent.removeGroup(key);
-    }
-  }
-}
-
-/**
- * An Observable representing values belonging to the same group represented by
- * a common key. The values emitted by a GroupedObservable come from the source
- * Observable. The common key is available as the field `key` on a
- * GroupedObservable instance.
- *
- * @class GroupedObservable<K, T>
- */
-export class GroupedObservable<K, T> extends Observable<T> {
-  /** @deprecated Do not construct this type. Internal use only */
-  constructor(public key: K,
-              private groupSubject: Subject<T>,
-              private refCountSubscription?: RefCountSubscription) {
-    super();
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<T>) {
-    const subscription = new Subscription();
-    const { refCountSubscription, groupSubject } = this;
-    if (refCountSubscription && !refCountSubscription.closed) {
-      subscription.add(new InnerRefCountSubscription(refCountSubscription));
-    }
-    subscription.add(groupSubject.subscribe(subscriber));
-    return subscription;
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class InnerRefCountSubscription extends Subscription {
-  constructor(private parent: RefCountSubscription) {
-    super();
-    parent.count++;
-  }
-
-  unsubscribe() {
-    const parent = this.parent;
-    if (!parent.closed && !this.closed) {
-      super.unsubscribe();
-      parent.count -= 1;
-      if (parent.count === 0 && parent.attemptedToUnsubscribe) {
-        parent.unsubscribe();
-      }
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/ignoreElements.ts b/node_modules/rxjs/src/internal/operators/ignoreElements.ts
deleted file mode 100644
index e153e77..0000000
--- a/node_modules/rxjs/src/internal/operators/ignoreElements.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { OperatorFunction } from '../types';
-
-/**
- * Ignores all items emitted by the source Observable and only passes calls of `complete` or `error`.
- *
- * ![](ignoreElements.png)
- *
- * ## Examples
- * ### Ignores emitted values, reacts to observable's completion.
- * ```ts
- * import { of } from 'rxjs';
- * import { ignoreElements } from 'rxjs/operators';
- *
- * of('you', 'talking', 'to', 'me').pipe(
- *   ignoreElements(),
- * )
- * .subscribe(
- *   word => console.log(word),
- *   err => console.log('error:', err),
- *   () => console.log('the end'),
- * );
- * // result:
- * // 'the end'
- * ```
- * @return {Observable} An empty Observable that only calls `complete`
- * or `error`, based on which one is called by the source Observable.
- * @method ignoreElements
- * @owner Observable
- */
-export function ignoreElements(): OperatorFunction<any, never> {
-  return function ignoreElementsOperatorFunction(source: Observable<any>) {
-    return source.lift(new IgnoreElementsOperator());
-  };
-}
-
-class IgnoreElementsOperator<T, R> implements Operator<T, R> {
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new IgnoreElementsSubscriber(subscriber));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class IgnoreElementsSubscriber<T> extends Subscriber<T> {
-  protected _next(unused: T): void {
-    // Do nothing
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/index.ts b/node_modules/rxjs/src/internal/operators/index.ts
deleted file mode 100644
index 7321559..0000000
--- a/node_modules/rxjs/src/internal/operators/index.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-export { audit } from './audit';
-export { auditTime } from './auditTime';
-export { buffer } from './buffer';
-export { bufferCount } from './bufferCount';
-export { bufferTime } from './bufferTime';
-export { bufferToggle } from './bufferToggle';
-export { bufferWhen } from './bufferWhen';
-export { catchError } from './catchError';
-export { combineAll } from './combineAll';
-export { combineLatest } from './combineLatest';
-export { concat } from './concat';
-export { concatAll } from './concatAll';
-export { concatMap } from './concatMap';
-export { concatMapTo } from './concatMapTo';
-export { count } from './count';
-export { debounce } from './debounce';
-export { debounceTime } from './debounceTime';
-export { defaultIfEmpty } from './defaultIfEmpty';
-export { delay } from './delay';
-export { delayWhen } from './delayWhen';
-export { dematerialize } from './dematerialize';
-export { distinct } from './distinct';
-export { distinctUntilChanged } from './distinctUntilChanged';
-export { distinctUntilKeyChanged } from './distinctUntilKeyChanged';
-export { elementAt } from './elementAt';
-export { every } from './every';
-export { exhaust } from './exhaust';
-export { exhaustMap } from './exhaustMap';
-export { expand } from './expand';
-export { filter } from './filter';
-export { finalize } from './finalize';
-export { find } from './find';
-export { findIndex } from './findIndex';
-export { first } from './first';
-export { groupBy } from './groupBy';
-export { ignoreElements } from './ignoreElements';
-export { isEmpty } from './isEmpty';
-export { last } from './last';
-export { map } from './map';
-export { mapTo } from './mapTo';
-export { materialize } from './materialize';
-export { max } from './max';
-export { merge } from './merge';
-export { mergeAll } from './mergeAll';
-export { mergeMap } from './mergeMap';
-export { mergeMap as flatMap } from './mergeMap';
-export { mergeMapTo } from './mergeMapTo';
-export { mergeScan } from './mergeScan';
-export { min } from './min';
-export { multicast } from './multicast';
-export { observeOn } from './observeOn';
-export { onErrorResumeNext } from './onErrorResumeNext';
-export { pairwise } from './pairwise';
-export { partition } from './partition';
-export { pluck } from './pluck';
-export { publish } from './publish';
-export { publishBehavior } from './publishBehavior';
-export { publishLast } from './publishLast';
-export { publishReplay } from './publishReplay';
-export { race } from './race';
-export { reduce } from './reduce';
-export { repeat } from './repeat';
-export { repeatWhen } from './repeatWhen';
-export { retry } from './retry';
-export { retryWhen } from './retryWhen';
-export { refCount } from './refCount';
-export { sample } from './sample';
-export { sampleTime } from './sampleTime';
-export { scan } from './scan';
-export { sequenceEqual } from './sequenceEqual';
-export { share } from './share';
-export { shareReplay } from './shareReplay';
-export { single } from './single';
-export { skip } from './skip';
-export { skipLast } from './skipLast';
-export { skipUntil } from './skipUntil';
-export { skipWhile } from './skipWhile';
-export { startWith } from './startWith';
-export { subscribeOn } from './subscribeOn';
-export { switchAll } from './switchAll';
-export { switchMap } from './switchMap';
-export { switchMapTo } from './switchMapTo';
-export { take } from './take';
-export { takeLast } from './takeLast';
-export { takeUntil } from './takeUntil';
-export { takeWhile } from './takeWhile';
-export { tap } from './tap';
-export { throttle } from './throttle';
-export { throttleTime } from './throttleTime';
-export { timeInterval } from './timeInterval';
-export { timeout } from './timeout';
-export { timeoutWith } from './timeoutWith';
-export { timestamp } from './timestamp';
-export { toArray } from './toArray';
-export { window } from './window';
-export { windowCount } from './windowCount';
-export { windowTime } from './windowTime';
-export { windowToggle } from './windowToggle';
-export { windowWhen } from './windowWhen';
-export { withLatestFrom } from './withLatestFrom';
-export { zip } from './zip';
-export { zipAll } from './zipAll';
diff --git a/node_modules/rxjs/src/internal/operators/isEmpty.ts b/node_modules/rxjs/src/internal/operators/isEmpty.ts
deleted file mode 100644
index 37a0467..0000000
--- a/node_modules/rxjs/src/internal/operators/isEmpty.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-
-/**
- * Emits false if the input observable emits any values, or emits true if the
- * input observable completes without emitting any values.
- *
- * <span class="informal">Tells whether any values are emitted by an observable</span>
- *
- * ![](isEmpty.png)
- *
- * `isEmpty` transforms an Observable that emits values into an Observable that
- * emits a single boolean value representing whether or not any values were
- * emitted by the source Observable. As soon as the source Observable emits a
- * value, `isEmpty` will emit a `false` and complete.  If the source Observable
- * completes having not emitted anything, `isEmpty` will emit a `true` and
- * complete.
- *
- * A similar effect could be achieved with {@link count}, but `isEmpty` can emit
- * a `false` value sooner.
- *
- * ## Examples
- *
- * Emit `false` for a non-empty Observable
- * ```javascript
- * import { Subject } from 'rxjs';
- * import { isEmpty } from 'rxjs/operators';
- *
- * const source = new Subject<string>();
- * const result = source.pipe(isEmpty());
- * source.subscribe(x => console.log(x));
- * result.subscribe(x => console.log(x));
- * source.next('a');
- * source.next('b');
- * source.next('c');
- * source.complete();
- *
- * // Results in:
- * // a
- * // false
- * // b
- * // c
- * ```
- *
- * Emit `true` for an empty Observable
- * ```javascript
- * import { EMPTY } from 'rxjs';
- * import { isEmpty } from 'rxjs/operators';
- *
- * const result = EMPTY.pipe(isEmpty());
- * result.subscribe(x => console.log(x));
- * // Results in:
- * // true
- * ```
- *
- * @see {@link count}
- * @see {@link EMPTY}
- *
- * @return {OperatorFunction<T, boolean>} An Observable of a boolean value indicating whether observable was empty or not
- * @method isEmpty
- * @owner Observable
- */
-
-export function isEmpty<T>(): OperatorFunction<T, boolean> {
-  return (source: Observable<T>) => source.lift(new IsEmptyOperator());
-}
-
-class IsEmptyOperator implements Operator<any, boolean> {
-  call (observer: Subscriber<boolean>, source: any): any {
-    return source.subscribe(new IsEmptySubscriber(observer));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class IsEmptySubscriber extends Subscriber<any> {
-  constructor(destination: Subscriber<boolean>) {
-    super(destination);
-  }
-
-  private notifyComplete(isEmpty: boolean): void {
-    const destination = this.destination;
-
-    destination.next(isEmpty);
-    destination.complete();
-  }
-
-  protected _next(value: boolean) {
-    this.notifyComplete(false);
-  }
-
-  protected _complete() {
-    this.notifyComplete(true);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/last.ts b/node_modules/rxjs/src/internal/operators/last.ts
deleted file mode 100644
index 23626c5..0000000
--- a/node_modules/rxjs/src/internal/operators/last.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { EmptyError } from '../util/EmptyError';
-import { OperatorFunction } from '../../internal/types';
-import { filter } from './filter';
-import { takeLast } from './takeLast';
-import { throwIfEmpty } from './throwIfEmpty';
-import { defaultIfEmpty } from './defaultIfEmpty';
-import { identity } from '../util/identity';
-
-/* tslint:disable:max-line-length */
-export function last<T, D = T>(
-  predicate?: null,
-  defaultValue?: D
-): OperatorFunction<T, T | D>;
-export function last<T, S extends T>(
-  predicate: (value: T, index: number, source: Observable<T>) => value is S,
-  defaultValue?: S
-): OperatorFunction<T, S>;
-export function last<T, D = T>(
-  predicate: (value: T, index: number, source: Observable<T>) => boolean,
-  defaultValue?: D
-): OperatorFunction<T, T | D>;
-/* tslint:enable:max-line-length */
-
-/**
- * Returns an Observable that emits only the last item emitted by the source Observable.
- * It optionally takes a predicate function as a parameter, in which case, rather than emitting
- * the last item from the source Observable, the resulting Observable will emit the last item
- * from the source Observable that satisfies the predicate.
- *
- * ![](last.png)
- *
- * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
- * callback if the Observable completes before any `next` notification was sent.
- * @param {function} [predicate] - The condition any source emitted item has to satisfy.
- * @param {any} [defaultValue] - An optional default value to provide if last
- * predicate isn't met or no values were emitted.
- * @return {Observable} An Observable that emits only the last item satisfying the given condition
- * from the source, or an NoSuchElementException if no such items are emitted.
- * @throws - Throws if no items that match the predicate are emitted by the source Observable.
- */
-export function last<T, D>(
-  predicate?: ((value: T, index: number, source: Observable<T>) => boolean) | null,
-  defaultValue?: D
-): OperatorFunction<T, T | D> {
-  const hasDefaultValue = arguments.length >= 2;
-  return (source: Observable<T>) => source.pipe(
-    predicate ? filter((v, i) => predicate(v, i, source)) : identity,
-    takeLast(1),
-    hasDefaultValue ? defaultIfEmpty<T | D>(defaultValue) : throwIfEmpty(() => new EmptyError()),
-  );
-}
diff --git a/node_modules/rxjs/src/internal/operators/map.ts b/node_modules/rxjs/src/internal/operators/map.ts
deleted file mode 100644
index f969ed6..0000000
--- a/node_modules/rxjs/src/internal/operators/map.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-
-/**
- * Applies a given `project` function to each value emitted by the source
- * Observable, and emits the resulting values as an Observable.
- *
- * <span class="informal">Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),
- * it passes each source value through a transformation function to get
- * corresponding output values.</span>
- *
- * ![](map.png)
- *
- * Similar to the well known `Array.prototype.map` function, this operator
- * applies a projection to each value and emits that projection in the output
- * Observable.
- *
- * ## Example
- * Map every click to the clientX position of that click
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { map } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const positions = clicks.pipe(map(ev => ev.clientX));
- * positions.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link mapTo}
- * @see {@link pluck}
- *
- * @param {function(value: T, index: number): R} project The function to apply
- * to each `value` emitted by the source Observable. The `index` parameter is
- * the number `i` for the i-th emission that has happened since the
- * subscription, starting from the number `0`.
- * @param {any} [thisArg] An optional argument to define what `this` is in the
- * `project` function.
- * @return {Observable<R>} An Observable that emits the values from the source
- * Observable transformed by the given `project` function.
- * @method map
- * @owner Observable
- */
-export function map<T, R>(project: (value: T, index: number) => R, thisArg?: any): OperatorFunction<T, R> {
-  return function mapOperation(source: Observable<T>): Observable<R> {
-    if (typeof project !== 'function') {
-      throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
-    }
-    return source.lift(new MapOperator(project, thisArg));
-  };
-}
-
-export class MapOperator<T, R> implements Operator<T, R> {
-  constructor(private project: (value: T, index: number) => R, private thisArg: any) {
-  }
-
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class MapSubscriber<T, R> extends Subscriber<T> {
-  count: number = 0;
-  private thisArg: any;
-
-  constructor(destination: Subscriber<R>,
-              private project: (value: T, index: number) => R,
-              thisArg: any) {
-    super(destination);
-    this.thisArg = thisArg || this;
-  }
-
-  // NOTE: This looks unoptimized, but it's actually purposefully NOT
-  // using try/catch optimizations.
-  protected _next(value: T) {
-    let result: R;
-    try {
-      result = this.project.call(this.thisArg, value, this.count++);
-    } catch (err) {
-      this.destination.error(err);
-      return;
-    }
-    this.destination.next(result);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/mapTo.ts b/node_modules/rxjs/src/internal/operators/mapTo.ts
deleted file mode 100644
index a072604..0000000
--- a/node_modules/rxjs/src/internal/operators/mapTo.ts
+++ /dev/null
@@ -1,72 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-
-/**
- * Emits the given constant value on the output Observable every time the source
- * Observable emits a value.
- *
- * <span class="informal">Like {@link map}, but it maps every source value to
- * the same output value every time.</span>
- *
- * ![](mapTo.png)
- *
- * Takes a constant `value` as argument, and emits that whenever the source
- * Observable emits a value. In other words, ignores the actual source value,
- * and simply uses the emission moment to know when to emit the given `value`.
- *
- * ## Example
- * Map every click to the string 'Hi'
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { mapTo } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const greetings = clicks.pipe(mapTo('Hi'));
- * greetings.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link map}
- *
- * @param {any} value The value to map each source value to.
- * @return {Observable} An Observable that emits the given `value` every time
- * the source Observable emits something.
- * @method mapTo
- * @owner Observable
- */
-export function mapTo<T, R>(value: R): OperatorFunction<T, R> {
-  return (source: Observable<T>) => source.lift(new MapToOperator(value));
-}
-
-class MapToOperator<T, R> implements Operator<T, R> {
-
-  value: R;
-
-  constructor(value: R) {
-    this.value = value;
-  }
-
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new MapToSubscriber(subscriber, this.value));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class MapToSubscriber<T, R> extends Subscriber<T> {
-
-  value: R;
-
-  constructor(destination: Subscriber<R>, value: R) {
-    super(destination);
-    this.value = value;
-  }
-
-  protected _next(x: T) {
-    this.destination.next(this.value);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/materialize.ts b/node_modules/rxjs/src/internal/operators/materialize.ts
deleted file mode 100644
index deff345..0000000
--- a/node_modules/rxjs/src/internal/operators/materialize.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Notification } from '../Notification';
-import { OperatorFunction } from '../types';
-
-/**
- * Represents all of the notifications from the source Observable as `next`
- * emissions marked with their original types within {@link Notification}
- * objects.
- *
- * <span class="informal">Wraps `next`, `error` and `complete` emissions in
- * {@link Notification} objects, emitted as `next` on the output Observable.
- * </span>
- *
- * ![](materialize.png)
- *
- * `materialize` returns an Observable that emits a `next` notification for each
- * `next`, `error`, or `complete` emission of the source Observable. When the
- * source Observable emits `complete`, the output Observable will emit `next` as
- * a Notification of type "complete", and then it will emit `complete` as well.
- * When the source Observable emits `error`, the output will emit `next` as a
- * Notification of type "error", and then `complete`.
- *
- * This operator is useful for producing metadata of the source Observable, to
- * be consumed as `next` emissions. Use it in conjunction with
- * {@link dematerialize}.
- *
- * ## Example
- * Convert a faulty Observable to an Observable of Notifications
- * ```ts
- * import { of } from 'rxjs';
- * import { materialize, map } from 'rxjs/operators';
- *
- * const letters = of('a', 'b', 13, 'd');
- * const upperCase = letters.pipe(map(x => x.toUpperCase()));
- * const materialized = upperCase.pipe(materialize());
- * materialized.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // - Notification {kind: "N", value: "A", error: undefined, hasValue: true}
- * // - Notification {kind: "N", value: "B", error: undefined, hasValue: true}
- * // - Notification {kind: "E", value: undefined, error: TypeError:
- * //   x.toUpperCase is not a function at MapSubscriber.letters.map.x
- * //   [as project] (http://1…, hasValue: false}
- * ```
- *
- * @see {@link Notification}
- * @see {@link dematerialize}
- *
- * @return {Observable<Notification<T>>} An Observable that emits
- * {@link Notification} objects that wrap the original emissions from the source
- * Observable with metadata.
- * @method materialize
- * @owner Observable
- */
-export function materialize<T>(): OperatorFunction<T, Notification<T>> {
-  return function materializeOperatorFunction(source: Observable<T>) {
-    return source.lift(new MaterializeOperator());
-  };
-}
-
-class MaterializeOperator<T> implements Operator<T, Notification<T>> {
-  call(subscriber: Subscriber<Notification<T>>, source: any): any {
-    return source.subscribe(new MaterializeSubscriber(subscriber));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class MaterializeSubscriber<T> extends Subscriber<T> {
-  constructor(destination: Subscriber<Notification<T>>) {
-    super(destination);
-  }
-
-  protected _next(value: T) {
-    this.destination.next(Notification.createNext(value));
-  }
-
-  protected _error(err: any) {
-    const destination = this.destination;
-    destination.next(Notification.createError(err));
-    destination.complete();
-  }
-
-  protected _complete() {
-    const destination = this.destination;
-    destination.next(Notification.createComplete());
-    destination.complete();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/max.ts b/node_modules/rxjs/src/internal/operators/max.ts
deleted file mode 100644
index d135aa6..0000000
--- a/node_modules/rxjs/src/internal/operators/max.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { reduce } from './reduce';
-import { MonoTypeOperatorFunction } from '../types';
-
-/**
- * The Max operator operates on an Observable that emits numbers (or items that can be compared with a provided function),
- * and when source Observable completes it emits a single item: the item with the largest value.
- *
- * ![](max.png)
- *
- * ## Examples
- * Get the maximal value of a series of numbers
- * ```ts
- * import { of } from 'rxjs';
- * import { max } from 'rxjs/operators';
- *
- * of(5, 4, 7, 2, 8).pipe(
- *   max(),
- * )
- * .subscribe(x => console.log(x)); // -> 8
- * ```
- *
- * Use a comparer function to get the maximal item
- * ```typescript
- * import { of } from 'rxjs';
- * import { max } from 'rxjs/operators';
- *
- * interface Person {
- *   age: number,
- *   name: string
- * }
- * of<Person>(
- *   {age: 7, name: 'Foo'},
- *   {age: 5, name: 'Bar'},
- *   {age: 9, name: 'Beer'},
- * ).pipe(
- *   max<Person>((a: Person, b: Person) => a.age < b.age ? -1 : 1),
- * )
- * .subscribe((x: Person) => console.log(x.name)); // -> 'Beer'
- * ```
- *
- * @see {@link min}
- *
- * @param {Function} [comparer] - Optional comparer function that it will use instead of its default to compare the
- * value of two items.
- * @return {Observable} An Observable that emits item with the largest value.
- * @method max
- * @owner Observable
- */
-export function max<T>(comparer?: (x: T, y: T) => number): MonoTypeOperatorFunction<T> {
-  const max: (x: T, y: T) => T = (typeof comparer === 'function')
-    ? (x, y) => comparer(x, y) > 0 ? x : y
-    : (x, y) => x > y ? x : y;
-
-  return reduce(max);
-}
diff --git a/node_modules/rxjs/src/internal/operators/merge.ts b/node_modules/rxjs/src/internal/operators/merge.ts
deleted file mode 100644
index cb628cf..0000000
--- a/node_modules/rxjs/src/internal/operators/merge.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import { merge as mergeStatic } from '../observable/merge';
-import { Observable } from '../Observable';
-import { ObservableInput, OperatorFunction, MonoTypeOperatorFunction, SchedulerLike } from '../types';
-
-/* tslint:disable:max-line-length */
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T>(scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T>(concurrent?: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T, T2>(v2: ObservableInput<T2>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T, T2>(v2: ObservableInput<T2>, concurrent?: number, scheduler?: SchedulerLike): OperatorFunction<T, T | T2>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T, T2, T3>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T, T2, T3>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, concurrent?: number, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T, T2, T3, T4>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T, T2, T3, T4>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, concurrent?: number, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T, T2, T3, T4, T5>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4 | T5>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T, T2, T3, T4, T5>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, concurrent?: number, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4 | T5>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T, T2, T3, T4, T5, T6>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4 | T5 | T6>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T, T2, T3, T4, T5, T6>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, concurrent?: number, scheduler?: SchedulerLike): OperatorFunction<T, T | T2 | T3 | T4 | T5 | T6>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T>(...observables: Array<ObservableInput<T> | SchedulerLike | number>): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static merge. */
-export function merge<T, R>(...observables: Array<ObservableInput<any> | SchedulerLike | number>): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * @deprecated Deprecated in favor of static {@link merge}.
- */
-export function merge<T, R>(...observables: Array<ObservableInput<any> | SchedulerLike | number>): OperatorFunction<T, R> {
-  return (source: Observable<T>) => source.lift.call(mergeStatic(source, ...observables));
-}
diff --git a/node_modules/rxjs/src/internal/operators/mergeAll.ts b/node_modules/rxjs/src/internal/operators/mergeAll.ts
deleted file mode 100644
index 6659290..0000000
--- a/node_modules/rxjs/src/internal/operators/mergeAll.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-
-import { mergeMap } from './mergeMap';
-import { identity } from '../util/identity';
-import { OperatorFunction, ObservableInput } from '../types';
-
-/**
- * Converts a higher-order Observable into a first-order Observable which
- * concurrently delivers all values that are emitted on the inner Observables.
- *
- * <span class="informal">Flattens an Observable-of-Observables.</span>
- *
- * ![](mergeAll.png)
- *
- * `mergeAll` subscribes to an Observable that emits Observables, also known as
- * a higher-order Observable. Each time it observes one of these emitted inner
- * Observables, it subscribes to that and delivers all the values from the
- * inner Observable on the output Observable. The output Observable only
- * completes once all inner Observables have completed. Any error delivered by
- * a inner Observable will be immediately emitted on the output Observable.
- *
- * ## Examples
- * Spawn a new interval Observable for each click event, and blend their outputs as one Observable
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { map, mergeAll } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const higherOrder = clicks.pipe(map((ev) => interval(1000)));
- * const firstOrder = higherOrder.pipe(mergeAll());
- * firstOrder.subscribe(x => console.log(x));
- * ```
- *
- * Count from 0 to 9 every second for each click, but only allow 2 concurrent timers
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { take, map, mergeAll } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const higherOrder = clicks.pipe(
- *   map((ev) => interval(1000).pipe(take(10))),
- * );
- * const firstOrder = higherOrder.pipe(mergeAll(2));
- * firstOrder.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link combineAll}
- * @see {@link concatAll}
- * @see {@link exhaust}
- * @see {@link merge}
- * @see {@link mergeMap}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- * @see {@link switchAll}
- * @see {@link switchMap}
- * @see {@link zipAll}
- *
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner
- * Observables being subscribed to concurrently.
- * @return {Observable} An Observable that emits values coming from all the
- * inner Observables emitted by the source Observable.
- * @method mergeAll
- * @owner Observable
- */
-export function mergeAll<T>(concurrent: number = Number.POSITIVE_INFINITY): OperatorFunction<ObservableInput<T>, T> {
-  return mergeMap(identity, concurrent);
-}
diff --git a/node_modules/rxjs/src/internal/operators/mergeMap.ts b/node_modules/rxjs/src/internal/operators/mergeMap.ts
deleted file mode 100644
index b8360ce..0000000
--- a/node_modules/rxjs/src/internal/operators/mergeMap.ts
+++ /dev/null
@@ -1,181 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-import { map } from './map';
-import { from } from '../observable/from';
-
-/* tslint:disable:max-line-length */
-export function mergeMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O, concurrent?: number): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector no longer supported, use inner map instead */
-export function mergeMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: undefined, concurrent?: number): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector no longer supported, use inner map instead */
-export function mergeMap<T, R, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R, concurrent?: number): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Projects each source value to an Observable which is merged in the output
- * Observable.
- *
- * <span class="informal">Maps each value to an Observable, then flattens all of
- * these inner Observables using {@link mergeAll}.</span>
- *
- * ![](mergeMap.png)
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an Observable, and then merging those resulting Observables and
- * emitting the results of this merger.
- *
- * ## Example
- * Map and flatten each letter to an Observable ticking every 1 second
- * ```ts
- * import { of, interval } from 'rxjs';
- * import { mergeMap, map } from 'rxjs/operators';
- *
- * const letters = of('a', 'b', 'c');
- * const result = letters.pipe(
- *   mergeMap(x => interval(1000).pipe(map(i => x+i))),
- * );
- * result.subscribe(x => console.log(x));
- *
- * // Results in the following:
- * // a0
- * // b0
- * // c0
- * // a1
- * // b1
- * // c1
- * // continues to list a,b,c with respective ascending integers
- * ```
- *
- * @see {@link concatMap}
- * @see {@link exhaustMap}
- * @see {@link merge}
- * @see {@link mergeAll}
- * @see {@link mergeMapTo}
- * @see {@link mergeScan}
- * @see {@link switchMap}
- *
- * @param {function(value: T, ?index: number): ObservableInput} project A function
- * that, when applied to an item emitted by the source Observable, returns an
- * Observable.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @return {Observable} An Observable that emits the result of applying the
- * projection function (and the optional deprecated `resultSelector`) to each item
- * emitted by the source Observable and merging the results of the Observables
- * obtained from this transformation.
- * @method mergeMap
- * @owner Observable
- */
-export function mergeMap<T, R, O extends ObservableInput<any>>(
-  project: (value: T, index: number) => O,
-  resultSelector?: ((outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R) | number,
-  concurrent: number = Number.POSITIVE_INFINITY
-): OperatorFunction<T, ObservedValueOf<O>|R> {
-  if (typeof resultSelector === 'function') {
-    // DEPRECATED PATH
-    return (source: Observable<T>) => source.pipe(
-      mergeMap((a, i) => from(project(a, i)).pipe(
-        map((b: any, ii: number) => resultSelector(a, b, i, ii)),
-      ), concurrent)
-    );
-  } else if (typeof resultSelector === 'number') {
-    concurrent = resultSelector;
-  }
-  return (source: Observable<T>) => source.lift(new MergeMapOperator(project, concurrent));
-}
-
-export class MergeMapOperator<T, R> implements Operator<T, R> {
-  constructor(private project: (value: T, index: number) => ObservableInput<R>,
-              private concurrent: number = Number.POSITIVE_INFINITY) {
-  }
-
-  call(observer: Subscriber<R>, source: any): any {
-    return source.subscribe(new MergeMapSubscriber(
-      observer, this.project, this.concurrent
-    ));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class MergeMapSubscriber<T, R> extends OuterSubscriber<T, R> {
-  private hasCompleted: boolean = false;
-  private buffer: T[] = [];
-  private active: number = 0;
-  protected index: number = 0;
-
-  constructor(destination: Subscriber<R>,
-              private project: (value: T, index: number) => ObservableInput<R>,
-              private concurrent: number = Number.POSITIVE_INFINITY) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    if (this.active < this.concurrent) {
-      this._tryNext(value);
-    } else {
-      this.buffer.push(value);
-    }
-  }
-
-  protected _tryNext(value: T) {
-    let result: ObservableInput<R>;
-    const index = this.index++;
-    try {
-      result = this.project(value, index);
-    } catch (err) {
-      this.destination.error(err);
-      return;
-    }
-    this.active++;
-    this._innerSub(result, value, index);
-  }
-
-  private _innerSub(ish: ObservableInput<R>, value: T, index: number): void {
-    const innerSubscriber = new InnerSubscriber(this, value, index);
-    const destination = this.destination as Subscription;
-    destination.add(innerSubscriber);
-    const innerSubscription = subscribeToResult<T, R>(this, ish, undefined, undefined, innerSubscriber);
-    // The returned subscription will usually be the subscriber that was
-    // passed. However, interop subscribers will be wrapped and for
-    // unsubscriptions to chain correctly, the wrapper needs to be added, too.
-    if (innerSubscription !== innerSubscriber) {
-      destination.add(innerSubscription);
-    }
-  }
-
-  protected _complete(): void {
-    this.hasCompleted = true;
-    if (this.active === 0 && this.buffer.length === 0) {
-      this.destination.complete();
-    }
-    this.unsubscribe();
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this.destination.next(innerValue);
-  }
-
-  notifyComplete(innerSub: Subscription): void {
-    const buffer = this.buffer;
-    this.remove(innerSub);
-    this.active--;
-    if (buffer.length > 0) {
-      this._next(buffer.shift());
-    } else if (this.active === 0 && this.hasCompleted) {
-      this.destination.complete();
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/mergeMapTo.ts b/node_modules/rxjs/src/internal/operators/mergeMapTo.ts
deleted file mode 100644
index 6f7e62f..0000000
--- a/node_modules/rxjs/src/internal/operators/mergeMapTo.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction, ObservedValueOf } from '../../internal/types';
-import { mergeMap } from './mergeMap';
-import { ObservableInput } from '../types';
-
-/* tslint:disable:max-line-length */
-export function mergeMapTo<T, O extends ObservableInput<any>>(innerObservable: O, concurrent?: number): OperatorFunction<any, ObservedValueOf<O>>;
-/** @deprecated */
-export function mergeMapTo<T, R, O extends ObservableInput<any>>(innerObservable: O, resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R, concurrent?: number): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Projects each source value to the same Observable which is merged multiple
- * times in the output Observable.
- *
- * <span class="informal">It's like {@link mergeMap}, but maps each value always
- * to the same inner Observable.</span>
- *
- * ![](mergeMapTo.png)
- *
- * Maps each source value to the given Observable `innerObservable` regardless
- * of the source value, and then merges those resulting Observables into one
- * single Observable, which is the output Observable.
- *
- * ## Example
- * For each click event, start an interval Observable ticking every 1 second
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { mergeMapTo } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(mergeMapTo(interval(1000)));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link concatMapTo}
- * @see {@link merge}
- * @see {@link mergeAll}
- * @see {@link mergeMap}
- * @see {@link mergeScan}
- * @see {@link switchMapTo}
- *
- * @param {ObservableInput} innerObservable An Observable to replace each value from
- * the source Observable.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input
- * Observables being subscribed to concurrently.
- * @return {Observable} An Observable that emits items from the given
- * `innerObservable`
- * @method mergeMapTo
- * @owner Observable
- */
-export function mergeMapTo<T, R, O extends ObservableInput<any>>(
-  innerObservable: O,
-  resultSelector?: ((outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R) | number,
-  concurrent: number = Number.POSITIVE_INFINITY
-): OperatorFunction<T, ObservedValueOf<O>|R> {
-  if (typeof resultSelector === 'function') {
-    return mergeMap(() => innerObservable, resultSelector, concurrent);
-  }
-  if (typeof resultSelector === 'number') {
-    concurrent = resultSelector;
-  }
-  return mergeMap(() => innerObservable, concurrent);
-}
diff --git a/node_modules/rxjs/src/internal/operators/mergeScan.ts b/node_modules/rxjs/src/internal/operators/mergeScan.ts
deleted file mode 100644
index 60ff288..0000000
--- a/node_modules/rxjs/src/internal/operators/mergeScan.ts
+++ /dev/null
@@ -1,152 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { ObservableInput, OperatorFunction } from '../types';
-
-/**
- * Applies an accumulator function over the source Observable where the
- * accumulator function itself returns an Observable, then each intermediate
- * Observable returned is merged into the output Observable.
- *
- * <span class="informal">It's like {@link scan}, but the Observables returned
- * by the accumulator are merged into the outer Observable.</span>
- *
- * ## Example
- * Count the number of click events
- * ```ts
- * import { fromEvent, of } from 'rxjs';
- * import { mapTo, mergeScan } from 'rxjs/operators';
- *
- * const click$ = fromEvent(document, 'click');
- * const one$ = click$.pipe(mapTo(1));
- * const seed = 0;
- * const count$ = one$.pipe(
- *   mergeScan((acc, one) => of(acc + one), seed),
- * );
- * count$.subscribe(x => console.log(x));
- *
- * // Results:
- * // 1
- * // 2
- * // 3
- * // 4
- * // ...and so on for each click
- * ```
- *
- * @param {function(acc: R, value: T): Observable<R>} accumulator
- * The accumulator function called on each source value.
- * @param seed The initial accumulation value.
- * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of
- * input Observables being subscribed to concurrently.
- * @return {Observable<R>} An observable of the accumulated values.
- * @method mergeScan
- * @owner Observable
- */
-export function mergeScan<T, R>(accumulator: (acc: R, value: T, index: number) => ObservableInput<R>,
-                                seed: R,
-                                concurrent: number = Number.POSITIVE_INFINITY): OperatorFunction<T, R> {
-  return (source: Observable<T>) => source.lift(new MergeScanOperator(accumulator, seed, concurrent));
-}
-
-export class MergeScanOperator<T, R> implements Operator<T, R> {
-  constructor(private accumulator: (acc: R, value: T, index: number) => ObservableInput<R>,
-              private seed: R,
-              private concurrent: number) {
-  }
-
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new MergeScanSubscriber(
-      subscriber, this.accumulator, this.seed, this.concurrent
-    ));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class MergeScanSubscriber<T, R> extends OuterSubscriber<T, R> {
-  private hasValue: boolean = false;
-  private hasCompleted: boolean = false;
-  private buffer: Observable<any>[] = [];
-  private active: number = 0;
-  protected index: number = 0;
-
-  constructor(destination: Subscriber<R>,
-              private accumulator: (acc: R, value: T, index: number) => ObservableInput<R>,
-              private acc: R,
-              private concurrent: number) {
-    super(destination);
-  }
-
-  protected _next(value: any): void {
-    if (this.active < this.concurrent) {
-      const index = this.index++;
-      const destination = this.destination;
-      let ish;
-      try {
-        const { accumulator } = this;
-        ish = accumulator(this.acc, value, index);
-      } catch (e) {
-        return destination.error(e);
-      }
-      this.active++;
-      this._innerSub(ish, value, index);
-    } else {
-      this.buffer.push(value);
-    }
-  }
-
-  private _innerSub(ish: any, value: T, index: number): void {
-    const innerSubscriber = new InnerSubscriber(this, value, index);
-    const destination = this.destination as Subscription;
-    destination.add(innerSubscriber);
-    const innerSubscription = subscribeToResult<T, R>(this, ish, undefined, undefined, innerSubscriber);
-    // The returned subscription will usually be the subscriber that was
-    // passed. However, interop subscribers will be wrapped and for
-    // unsubscriptions to chain correctly, the wrapper needs to be added, too.
-    if (innerSubscription !== innerSubscriber) {
-      destination.add(innerSubscription);
-    }
-  }
-
-  protected _complete(): void {
-    this.hasCompleted = true;
-    if (this.active === 0 && this.buffer.length === 0) {
-      if (this.hasValue === false) {
-        this.destination.next(this.acc);
-      }
-      this.destination.complete();
-    }
-    this.unsubscribe();
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    const { destination } = this;
-    this.acc = innerValue;
-    this.hasValue = true;
-    destination.next(innerValue);
-  }
-
-  notifyComplete(innerSub: Subscription): void {
-    const buffer = this.buffer;
-    const destination = this.destination as Subscription;
-    destination.remove(innerSub);
-    this.active--;
-    if (buffer.length > 0) {
-      this._next(buffer.shift());
-    } else if (this.active === 0 && this.hasCompleted) {
-      if (this.hasValue === false) {
-        this.destination.next(this.acc);
-      }
-      this.destination.complete();
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/min.ts b/node_modules/rxjs/src/internal/operators/min.ts
deleted file mode 100644
index c7c0e2c..0000000
--- a/node_modules/rxjs/src/internal/operators/min.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { reduce } from './reduce';
-import { MonoTypeOperatorFunction } from '../types';
-
-/**
- * The Min operator operates on an Observable that emits numbers (or items that can be compared with a provided function),
- * and when source Observable completes it emits a single item: the item with the smallest value.
- *
- * ![](min.png)
- *
- * ## Examples
- * Get the minimal value of a series of numbers
- * ```ts
- * import { of } from 'rxjs';
- * import { min } from 'rxjs/operators';
- *
- * of(5, 4, 7, 2, 8).pipe(
- *   min(),
- * )
- * .subscribe(x => console.log(x)); // -> 2
- * ```
- *
- * Use a comparer function to get the minimal item
- * ```typescript
- * import { of } from 'rxjs';
- * import { min } from 'rxjs/operators';
- *
- * interface Person {
- *   age: number,
- *   name: string
- * }
- * of<Person>(
- *   {age: 7, name: 'Foo'},
- *   {age: 5, name: 'Bar'},
- *   {age: 9, name: 'Beer'},
- * ).pipe(
- *   min<Person>( (a: Person, b: Person) => a.age < b.age ? -1 : 1),
- * )
- * .subscribe((x: Person) => console.log(x.name)); // -> 'Bar'
- * ```
- * @see {@link max}
- *
- * @param {Function} [comparer] - Optional comparer function that it will use instead of its default to compare the
- * value of two items.
- * @return {Observable<R>} An Observable that emits item with the smallest value.
- * @method min
- * @owner Observable
- */
-export function min<T>(comparer?: (x: T, y: T) => number): MonoTypeOperatorFunction<T> {
-  const min: (x: T, y: T) => T = (typeof comparer === 'function')
-    ? (x, y) => comparer(x, y) < 0 ? x : y
-    : (x, y) => x < y ? x : y;
-  return reduce(min);
-}
diff --git a/node_modules/rxjs/src/internal/operators/multicast.ts b/node_modules/rxjs/src/internal/operators/multicast.ts
deleted file mode 100644
index 97d28d5..0000000
--- a/node_modules/rxjs/src/internal/operators/multicast.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { Subject } from '../Subject';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { ConnectableObservable, connectableObservableDescriptor } from '../observable/ConnectableObservable';
-import { MonoTypeOperatorFunction, OperatorFunction, UnaryFunction, ObservedValueOf, ObservableInput } from '../types';
-
-/* tslint:disable:max-line-length */
-export function multicast<T>(subject: Subject<T>): UnaryFunction<Observable<T>, ConnectableObservable<T>>;
-export function multicast<T, O extends ObservableInput<any>>(subject: Subject<T>, selector: (shared: Observable<T>) => O): UnaryFunction<Observable<T>, ConnectableObservable<ObservedValueOf<O>>>;
-export function multicast<T>(subjectFactory: (this: Observable<T>) => Subject<T>): UnaryFunction<Observable<T>, ConnectableObservable<T>>;
-export function multicast<T, O extends ObservableInput<any>>(SubjectFactory: (this: Observable<T>) => Subject<T>, selector: (shared: Observable<T>) => O): OperatorFunction<T, ObservedValueOf<O>>;
-/* tslint:enable:max-line-length */
-
-/**
- * Returns an Observable that emits the results of invoking a specified selector on items
- * emitted by a ConnectableObservable that shares a single subscription to the underlying stream.
- *
- * ![](multicast.png)
- *
- * @param {Function|Subject} subjectOrSubjectFactory - Factory function to create an intermediate subject through
- * which the source sequence's elements will be multicast to the selector function
- * or Subject to push source elements into.
- * @param {Function} [selector] - Optional selector function that can use the multicasted source stream
- * as many times as needed, without causing multiple subscriptions to the source stream.
- * Subscribers to the given source will receive all notifications of the source from the
- * time of the subscription forward.
- * @return {Observable} An Observable that emits the results of invoking the selector
- * on the items emitted by a `ConnectableObservable` that shares a single subscription to
- * the underlying stream.
- * @method multicast
- * @owner Observable
- */
-export function multicast<T, R>(subjectOrSubjectFactory: Subject<T> | (() => Subject<T>),
-                                selector?: (source: Observable<T>) => Observable<R>): OperatorFunction<T, R> {
-  return function multicastOperatorFunction(source: Observable<T>): Observable<R> {
-    let subjectFactory: () => Subject<T>;
-    if (typeof subjectOrSubjectFactory === 'function') {
-      subjectFactory = <() => Subject<T>>subjectOrSubjectFactory;
-    } else {
-      subjectFactory = function subjectFactory() {
-        return <Subject<T>>subjectOrSubjectFactory;
-      };
-    }
-
-    if (typeof selector === 'function') {
-      return source.lift(new MulticastOperator(subjectFactory, selector));
-    }
-
-    const connectable: any = Object.create(source, connectableObservableDescriptor);
-    connectable.source = source;
-    connectable.subjectFactory = subjectFactory;
-
-    return <ConnectableObservable<R>> connectable;
-  };
-}
-
-export class MulticastOperator<T, R> implements Operator<T, R> {
-  constructor(private subjectFactory: () => Subject<T>,
-              private selector: (source: Observable<T>) => Observable<R>) {
-  }
-  call(subscriber: Subscriber<R>, source: any): any {
-    const { selector } = this;
-    const subject = this.subjectFactory();
-    const subscription = selector(subject).subscribe(subscriber);
-    subscription.add(source.subscribe(subject));
-    return subscription;
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/observeOn.ts b/node_modules/rxjs/src/internal/operators/observeOn.ts
deleted file mode 100644
index 8a5bd66..0000000
--- a/node_modules/rxjs/src/internal/operators/observeOn.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { Notification } from '../Notification';
-import { MonoTypeOperatorFunction, PartialObserver, SchedulerAction, SchedulerLike, TeardownLogic } from '../types';
-
-/**
- *
- * Re-emits all notifications from source Observable with specified scheduler.
- *
- * <span class="informal">Ensure a specific scheduler is used, from outside of an Observable.</span>
- *
- * `observeOn` is an operator that accepts a scheduler as a first parameter, which will be used to reschedule
- * notifications emitted by the source Observable. It might be useful, if you do not have control over
- * internal scheduler of a given Observable, but want to control when its values are emitted nevertheless.
- *
- * Returned Observable emits the same notifications (nexted values, complete and error events) as the source Observable,
- * but rescheduled with provided scheduler. Note that this doesn't mean that source Observables internal
- * scheduler will be replaced in any way. Original scheduler still will be used, but when the source Observable emits
- * notification, it will be immediately scheduled again - this time with scheduler passed to `observeOn`.
- * An anti-pattern would be calling `observeOn` on Observable that emits lots of values synchronously, to split
- * that emissions into asynchronous chunks. For this to happen, scheduler would have to be passed into the source
- * Observable directly (usually into the operator that creates it). `observeOn` simply delays notifications a
- * little bit more, to ensure that they are emitted at expected moments.
- *
- * As a matter of fact, `observeOn` accepts second parameter, which specifies in milliseconds with what delay notifications
- * will be emitted. The main difference between {@link delay} operator and `observeOn` is that `observeOn`
- * will delay all notifications - including error notifications - while `delay` will pass through error
- * from source Observable immediately when it is emitted. In general it is highly recommended to use `delay` operator
- * for any kind of delaying of values in the stream, while using `observeOn` to specify which scheduler should be used
- * for notification emissions in general.
- *
- * ## Example
- * Ensure values in subscribe are called just before browser repaint.
- * ```ts
- * import { interval } from 'rxjs';
- * import { observeOn } from 'rxjs/operators';
- *
- * const intervals = interval(10);                // Intervals are scheduled
- *                                                // with async scheduler by default...
- * intervals.pipe(
- *   observeOn(animationFrameScheduler),          // ...but we will observe on animationFrame
- * )                                              // scheduler to ensure smooth animation.
- * .subscribe(val => {
- *   someDiv.style.height = val + 'px';
- * });
- * ```
- *
- * @see {@link delay}
- *
- * @param {SchedulerLike} scheduler Scheduler that will be used to reschedule notifications from source Observable.
- * @param {number} [delay] Number of milliseconds that states with what delay every notification should be rescheduled.
- * @return {Observable<T>} Observable that emits the same notifications as the source Observable,
- * but with provided scheduler.
- *
- * @method observeOn
- * @owner Observable
- */
-export function observeOn<T>(scheduler: SchedulerLike, delay: number = 0): MonoTypeOperatorFunction<T> {
-  return function observeOnOperatorFunction(source: Observable<T>): Observable<T> {
-    return source.lift(new ObserveOnOperator(scheduler, delay));
-  };
-}
-
-export class ObserveOnOperator<T> implements Operator<T, T> {
-  constructor(private scheduler: SchedulerLike, private delay: number = 0) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class ObserveOnSubscriber<T> extends Subscriber<T> {
-  /** @nocollapse */
-  static dispatch(this: SchedulerAction<ObserveOnMessage>, arg: ObserveOnMessage) {
-    const { notification, destination } = arg;
-    notification.observe(destination);
-    this.unsubscribe();
-  }
-
-  constructor(destination: Subscriber<T>,
-              private scheduler: SchedulerLike,
-              private delay: number = 0) {
-    super(destination);
-  }
-
-  private scheduleMessage(notification: Notification<any>): void {
-    const destination = this.destination as Subscription;
-    destination.add(this.scheduler.schedule(
-      ObserveOnSubscriber.dispatch,
-      this.delay,
-      new ObserveOnMessage(notification, this.destination)
-    ));
-  }
-
-  protected _next(value: T): void {
-    this.scheduleMessage(Notification.createNext(value));
-  }
-
-  protected _error(err: any): void {
-    this.scheduleMessage(Notification.createError(err));
-    this.unsubscribe();
-  }
-
-  protected _complete(): void {
-    this.scheduleMessage(Notification.createComplete());
-    this.unsubscribe();
-  }
-}
-
-export class ObserveOnMessage {
-  constructor(public notification: Notification<any>,
-              public destination: PartialObserver<any>) {
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/onErrorResumeNext.ts b/node_modules/rxjs/src/internal/operators/onErrorResumeNext.ts
deleted file mode 100644
index 058ca8e..0000000
--- a/node_modules/rxjs/src/internal/operators/onErrorResumeNext.ts
+++ /dev/null
@@ -1,176 +0,0 @@
-import { Observable } from '../Observable';
-import { from } from '../observable/from';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { isArray } from '../util/isArray';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { ObservableInput, OperatorFunction } from '../types';
-
-/* tslint:disable:max-line-length */
-export function onErrorResumeNext<T>(): OperatorFunction<T, T>;
-export function onErrorResumeNext<T, T2>(v: ObservableInput<T2>): OperatorFunction<T, T | T2>;
-export function onErrorResumeNext<T, T2, T3>(v: ObservableInput<T2>, v2: ObservableInput<T3>): OperatorFunction<T, T | T2 | T3>;
-export function onErrorResumeNext<T, T2, T3, T4>(v: ObservableInput<T2>, v2: ObservableInput<T3>, v3: ObservableInput<T4>): OperatorFunction<T, T | T2 | T3 | T4>;
-export function onErrorResumeNext<T, T2, T3, T4, T5>(v: ObservableInput<T2>, v2: ObservableInput<T3>, v3: ObservableInput<T4>, v4: ObservableInput<T5>): OperatorFunction<T, T | T2 | T3 | T4 | T5>;
-export function onErrorResumeNext<T, T2, T3, T4, T5, T6>(v: ObservableInput<T2>, v2: ObservableInput<T3>, v3: ObservableInput<T4>, v4: ObservableInput<T5>, v5: ObservableInput<T6>): OperatorFunction<T, T | T2 | T3 | T4 | T5 | T6>;
-export function onErrorResumeNext<T, T2, T3, T4, T5, T6, T7>(v: ObservableInput<T2>, v2: ObservableInput<T3>, v3: ObservableInput<T4>, v4: ObservableInput<T5>, v5: ObservableInput<T6>, v6: ObservableInput<T7>): OperatorFunction<T, T | T2 | T3 | T4 | T5 | T6 | T7>;
-export function onErrorResumeNext<T, R>(...observables: Array<ObservableInput<any>>): OperatorFunction<T, T | R>;
-export function onErrorResumeNext<T, R>(array: ObservableInput<any>[]): OperatorFunction<T, T | R>;
-/* tslint:enable:max-line-length */
-
-/**
- * When any of the provided Observable emits an complete or error notification, it immediately subscribes to the next one
- * that was passed.
- *
- * <span class="informal">Execute series of Observables no matter what, even if it means swallowing errors.</span>
- *
- * ![](onErrorResumeNext.png)
- *
- * `onErrorResumeNext` is an operator that accepts a series of Observables, provided either directly as
- * arguments or as an array. If no single Observable is provided, returned Observable will simply behave the same
- * as the source.
- *
- * `onErrorResumeNext` returns an Observable that starts by subscribing and re-emitting values from the source Observable.
- * When its stream of values ends - no matter if Observable completed or emitted an error - `onErrorResumeNext`
- * will subscribe to the first Observable that was passed as an argument to the method. It will start re-emitting
- * its values as well and - again - when that stream ends, `onErrorResumeNext` will proceed to subscribing yet another
- * Observable in provided series, no matter if previous Observable completed or ended with an error. This will
- * be happening until there is no more Observables left in the series, at which point returned Observable will
- * complete - even if the last subscribed stream ended with an error.
- *
- * `onErrorResumeNext` can be therefore thought of as version of {@link concat} operator, which is more permissive
- * when it comes to the errors emitted by its input Observables. While `concat` subscribes to the next Observable
- * in series only if previous one successfully completed, `onErrorResumeNext` subscribes even if it ended with
- * an error.
- *
- * Note that you do not get any access to errors emitted by the Observables. In particular do not
- * expect these errors to appear in error callback passed to {@link Observable#subscribe}. If you want to take
- * specific actions based on what error was emitted by an Observable, you should try out {@link catchError} instead.
- *
- *
- * ## Example
- * Subscribe to the next Observable after map fails
- * ```ts
- * import { of } from 'rxjs';
- * import { onErrorResumeNext, map } from 'rxjs/operators';
- *
- * of(1, 2, 3, 0).pipe(
- *   map(x => {
- *       if (x === 0) { throw Error(); }
- *        return 10 / x;
- *   }),
- *   onErrorResumeNext(of(1, 2, 3)),
- * )
- * .subscribe(
- *   val => console.log(val),
- *   err => console.log(err),          // Will never be called.
- *   () => console.log('that\'s it!')
- * );
- *
- * // Logs:
- * // 10
- * // 5
- * // 3.3333333333333335
- * // 1
- * // 2
- * // 3
- * // "that's it!"
- * ```
- *
- * @see {@link concat}
- * @see {@link catchError}
- *
- * @param {...ObservableInput} observables Observables passed either directly or as an array.
- * @return {Observable} An Observable that emits values from source Observable, but - if it errors - subscribes
- * to the next passed Observable and so on, until it completes or runs out of Observables.
- * @method onErrorResumeNext
- * @owner Observable
- */
-
-export function onErrorResumeNext<T, R>(...nextSources: Array<ObservableInput<any> |
-                                                       Array<ObservableInput<any>>>): OperatorFunction<T, R> {
-  if (nextSources.length === 1 && isArray(nextSources[0])) {
-    nextSources = <Array<Observable<any>>>nextSources[0];
-  }
-
-  return (source: Observable<T>) => source.lift(new OnErrorResumeNextOperator<T, R>(nextSources));
-}
-
-/* tslint:disable:max-line-length */
-export function onErrorResumeNextStatic<R>(v: ObservableInput<R>): Observable<R>;
-export function onErrorResumeNextStatic<T2, T3, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>): Observable<R>;
-export function onErrorResumeNextStatic<T2, T3, T4, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<R>;
-export function onErrorResumeNextStatic<T2, T3, T4, T5, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): Observable<R>;
-export function onErrorResumeNextStatic<T2, T3, T4, T5, T6, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): Observable<R>;
-
-export function onErrorResumeNextStatic<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): Observable<R>;
-export function onErrorResumeNextStatic<R>(array: ObservableInput<any>[]): Observable<R>;
-/* tslint:enable:max-line-length */
-
-export function onErrorResumeNextStatic<T, R>(...nextSources: Array<ObservableInput<any> |
-  Array<ObservableInput<any>> |
-  ((...values: Array<any>) => R)>): Observable<R> {
-  let source: ObservableInput<any> = null;
-
-  if (nextSources.length === 1 && isArray(nextSources[0])) {
-    nextSources = <Array<ObservableInput<any>>>nextSources[0];
-  }
-  source = nextSources.shift();
-
-  return from(source, null).lift(new OnErrorResumeNextOperator<T, R>(nextSources));
-}
-
-class OnErrorResumeNextOperator<T, R> implements Operator<T, R> {
-  constructor(private nextSources: Array<ObservableInput<any>>) {
-  }
-
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));
-  }
-}
-
-class OnErrorResumeNextSubscriber<T, R> extends OuterSubscriber<T, R> {
-  constructor(protected destination: Subscriber<T>,
-              private nextSources: Array<ObservableInput<any>>) {
-    super(destination);
-  }
-
-  notifyError(error: any, innerSub: InnerSubscriber<T, any>): void {
-    this.subscribeToNextSource();
-  }
-
-  notifyComplete(innerSub: InnerSubscriber<T, any>): void {
-    this.subscribeToNextSource();
-  }
-
-  protected _error(err: any): void {
-    this.subscribeToNextSource();
-    this.unsubscribe();
-  }
-
-  protected _complete(): void {
-    this.subscribeToNextSource();
-    this.unsubscribe();
-  }
-
-  private subscribeToNextSource(): void {
-    const next = this.nextSources.shift();
-    if (!!next) {
-      const innerSubscriber = new InnerSubscriber(this, undefined, undefined);
-      const destination = this.destination as Subscription;
-      destination.add(innerSubscriber);
-      const innerSubscription = subscribeToResult(this, next, undefined, undefined, innerSubscriber);
-      // The returned subscription will usually be the subscriber that was
-      // passed. However, interop subscribers will be wrapped and for
-      // unsubscriptions to chain correctly, the wrapper needs to be added, too.
-      if (innerSubscription !== innerSubscriber) {
-        destination.add(innerSubscription);
-      }
-    } else {
-      this.destination.complete();
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/pairwise.ts b/node_modules/rxjs/src/internal/operators/pairwise.ts
deleted file mode 100644
index 8c2eb26..0000000
--- a/node_modules/rxjs/src/internal/operators/pairwise.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { OperatorFunction } from '../types';
-
-/**
- * Groups pairs of consecutive emissions together and emits them as an array of
- * two values.
- *
- * <span class="informal">Puts the current value and previous value together as
- * an array, and emits that.</span>
- *
- * ![](pairwise.png)
- *
- * The Nth emission from the source Observable will cause the output Observable
- * to emit an array [(N-1)th, Nth] of the previous and the current value, as a
- * pair. For this reason, `pairwise` emits on the second and subsequent
- * emissions from the source Observable, but not on the first emission, because
- * there is no previous value in that case.
- *
- * ## Example
- * On every click (starting from the second), emit the relative distance to the previous click
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { pairwise, map } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const pairs = clicks.pipe(pairwise());
- * const distance = pairs.pipe(
- *   map(pair => {
- *     const x0 = pair[0].clientX;
- *     const y0 = pair[0].clientY;
- *     const x1 = pair[1].clientX;
- *     const y1 = pair[1].clientY;
- *     return Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));
- *   }),
- * );
- * distance.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link buffer}
- * @see {@link bufferCount}
- *
- * @return {Observable<Array<T>>} An Observable of pairs (as arrays) of
- * consecutive values from the source Observable.
- * @method pairwise
- * @owner Observable
- */
-export function pairwise<T>(): OperatorFunction<T, [T, T]> {
-  return (source: Observable<T>) => source.lift(new PairwiseOperator());
-}
-
-class PairwiseOperator<T> implements Operator<T, [T, T]> {
-  call(subscriber: Subscriber<[T, T]>, source: any): any {
-    return source.subscribe(new PairwiseSubscriber(subscriber));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class PairwiseSubscriber<T> extends Subscriber<T> {
-  private prev: T;
-  private hasPrev: boolean = false;
-
-  constructor(destination: Subscriber<[T, T]>) {
-    super(destination);
-  }
-
-  _next(value: T): void {
-    let pair: [T, T] | undefined;
-
-    if (this.hasPrev) {
-      pair = [this.prev, value];
-    } else {
-      this.hasPrev = true;
-    }
-
-    this.prev = value;
-
-    if (pair) {
-      this.destination.next(pair);
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/partition.ts b/node_modules/rxjs/src/internal/operators/partition.ts
deleted file mode 100644
index c2aef15..0000000
--- a/node_modules/rxjs/src/internal/operators/partition.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { not } from '../util/not';
-import { filter } from './filter';
-import { Observable } from '../Observable';
-import { UnaryFunction } from '../types';
-
-/**
- * Splits the source Observable into two, one with values that satisfy a
- * predicate, and another with values that don't satisfy the predicate.
- *
- * <span class="informal">It's like {@link filter}, but returns two Observables:
- * one like the output of {@link filter}, and the other with values that did not
- * pass the condition.</span>
- *
- * ![](partition.png)
- *
- * `partition` outputs an array with two Observables that partition the values
- * from the source Observable through the given `predicate` function. The first
- * Observable in that array emits source values for which the predicate argument
- * returns true. The second Observable emits source values for which the
- * predicate returns false. The first behaves like {@link filter} and the second
- * behaves like {@link filter} with the predicate negated.
- *
- * ## Example
- * Partition click events into those on DIV elements and those elsewhere
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { partition } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const parts = clicks.pipe(partition(ev => ev.target.tagName === 'DIV'));
- * const clicksOnDivs = parts[0];
- * const clicksElsewhere = parts[1];
- * clicksOnDivs.subscribe(x => console.log('DIV clicked: ', x));
- * clicksElsewhere.subscribe(x => console.log('Other clicked: ', x));
- * ```
- *
- * @see {@link filter}
- *
- * @param {function(value: T, index: number): boolean} predicate A function that
- * evaluates each value emitted by the source Observable. If it returns `true`,
- * the value is emitted on the first Observable in the returned array, if
- * `false` the value is emitted on the second Observable in the array. The
- * `index` parameter is the number `i` for the i-th source emission that has
- * happened since the subscription, starting from the number `0`.
- * @param {any} [thisArg] An optional argument to determine the value of `this`
- * in the `predicate` function.
- * @return {[Observable<T>, Observable<T>]} An array with two Observables: one
- * with values that passed the predicate, and another with values that did not
- * pass the predicate.
- * @method partition
- * @owner Observable
- * @deprecated use `partition` static creation function instead
- */
-export function partition<T>(predicate: (value: T, index: number) => boolean,
-                             thisArg?: any): UnaryFunction<Observable<T>, [Observable<T>, Observable<T>]> {
-  return (source: Observable<T>) => [
-    filter(predicate, thisArg)(source),
-    filter(not(predicate, thisArg) as any)(source)
-  ] as [Observable<T>, Observable<T>];
-}
diff --git a/node_modules/rxjs/src/internal/operators/pluck.ts b/node_modules/rxjs/src/internal/operators/pluck.ts
deleted file mode 100644
index dbe050f..0000000
--- a/node_modules/rxjs/src/internal/operators/pluck.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-import { Observable } from '../Observable';
-import { map } from './map';
-import { OperatorFunction } from '../types';
-
-/* tslint:disable:max-line-length */
-export function pluck<T, K1 extends keyof T>(k1: K1): OperatorFunction<T, T[K1]>;
-export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1]>(k1: K1, k2: K2): OperatorFunction<T, T[K1][K2]>;
-export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2]>(k1: K1, k2: K2, k3: K3): OperatorFunction<T, T[K1][K2][K3]>;
-export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3]>(k1: K1, k2: K2, k3: K3, k4: K4): OperatorFunction<T, T[K1][K2][K3][K4]>;
-export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4]>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5): OperatorFunction<T, T[K1][K2][K3][K4][K5]>;
-export function pluck<T, K1 extends keyof T, K2 extends keyof T[K1], K3 extends keyof T[K1][K2], K4 extends keyof T[K1][K2][K3], K5 extends keyof T[K1][K2][K3][K4], K6 extends keyof T[K1][K2][K3][K4][K5]>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6): OperatorFunction<T, T[K1][K2][K3][K4][K5][K6]>;
-export function pluck<T, R>(...properties: string[]): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Maps each source value (an object) to its specified nested property.
- *
- * <span class="informal">Like {@link map}, but meant only for picking one of
- * the nested properties of every emitted object.</span>
- *
- * ![](pluck.png)
- *
- * Given a list of strings describing a path to an object property, retrieves
- * the value of a specified nested property from all values in the source
- * Observable. If a property can't be resolved, it will return `undefined` for
- * that value.
- *
- * ## Example
- * Map every click to the tagName of the clicked target element
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { pluck } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const tagNames = clicks.pipe(pluck('target', 'tagName'));
- * tagNames.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link map}
- *
- * @param {...string} properties The nested properties to pluck from each source
- * value (an object).
- * @return {Observable} A new Observable of property values from the source values.
- * @method pluck
- * @owner Observable
- */
-export function pluck<T, R>(...properties: string[]): OperatorFunction<T, R> {
-  const length = properties.length;
-  if (length === 0) {
-    throw new Error('list of properties cannot be empty.');
-  }
-  return (source: Observable<T>) => map(plucker(properties, length))(source as any);
-}
-
-function plucker(props: string[], length: number): (x: string) => any {
-  const mapper = (x: string) => {
-    let currentProp = x;
-    for (let i = 0; i < length; i++) {
-      const p = currentProp[props[i]];
-      if (typeof p !== 'undefined') {
-        currentProp = p;
-      } else {
-        return undefined;
-      }
-    }
-    return currentProp;
-  };
-
-  return mapper;
-}
diff --git a/node_modules/rxjs/src/internal/operators/publish.ts b/node_modules/rxjs/src/internal/operators/publish.ts
deleted file mode 100644
index e4596f3..0000000
--- a/node_modules/rxjs/src/internal/operators/publish.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { Observable } from '../Observable';
-import { Subject } from '../Subject';
-import { multicast } from './multicast';
-import { ConnectableObservable } from '../observable/ConnectableObservable';
-import { MonoTypeOperatorFunction, OperatorFunction, UnaryFunction, ObservableInput, ObservedValueOf } from '../types';
-
-/* tslint:disable:max-line-length */
-export function publish<T>(): UnaryFunction<Observable<T>, ConnectableObservable<T>>;
-export function publish<T, O extends ObservableInput<any>>(selector: (shared: Observable<T>) => O): OperatorFunction<T, ObservedValueOf<O>>;
-export function publish<T>(selector: MonoTypeOperatorFunction<T>): MonoTypeOperatorFunction<T>;
-/* tslint:enable:max-line-length */
-
-/**
- * Returns a ConnectableObservable, which is a variety of Observable that waits until its connect method is called
- * before it begins emitting items to those Observers that have subscribed to it.
- *
- * <span class="informal">Makes a cold Observable hot</span>
- *
- * ![](publish.png)
- *
- * ## Examples
- * Make source$ hot by applying publish operator, then merge each inner observable into a single one
- * and subscribe.
- * ```ts
- * import { of, zip, interval, merge } from "rxjs";
- * import { map, publish, tap } from "rxjs/operators";
- *
- * const source$ = zip(interval(2000), of(1, 2, 3, 4, 5, 6, 7, 8, 9)).pipe(
- *   map(values => values[1])
- * );
- *
- * source$
- *   .pipe(
- *     publish(multicasted$ =>
- *       merge(
- *         multicasted$.pipe(tap(x => console.log('Stream 1:', x))),
- *         multicasted$.pipe(tap(x => console.log('Stream 2:', x))),
- *         multicasted$.pipe(tap(x => console.log('Stream 3:', x))),
- *       )
- *     )
- *   )
- *   .subscribe();
- *
- * // Results every two seconds
- * // Stream 1: 1
- * // Stream 2: 1
- * // Stream 3: 1
- * // ...
- * // Stream 1: 9
- * // Stream 2: 9
- * // Stream 3: 9
- * ```
- *
- * @param {Function} [selector] - Optional selector function which can use the multicasted source sequence as many times
- * as needed, without causing multiple subscriptions to the source sequence.
- * Subscribers to the given source will receive all notifications of the source from the time of the subscription on.
- * @return A ConnectableObservable that upon connection causes the source Observable to emit items to its Observers.
- * @method publish
- * @owner Observable
- *
- *
- */
-export function publish<T, R>(selector?: OperatorFunction<T, R>): MonoTypeOperatorFunction<T> | OperatorFunction<T, R> {
-  return selector ?
-    multicast(() => new Subject<T>(), selector) :
-    multicast(new Subject<T>());
-}
diff --git a/node_modules/rxjs/src/internal/operators/publishBehavior.ts b/node_modules/rxjs/src/internal/operators/publishBehavior.ts
deleted file mode 100644
index 792b315..0000000
--- a/node_modules/rxjs/src/internal/operators/publishBehavior.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Observable } from '../Observable';
-import { BehaviorSubject } from '../BehaviorSubject';
-import { multicast } from './multicast';
-import { ConnectableObservable } from '../observable/ConnectableObservable';
-import { UnaryFunction } from '../types';
-
-/**
- * @param value
- * @return {ConnectableObservable<T>}
- * @method publishBehavior
- * @owner Observable
- */
-export function publishBehavior<T>(value: T):  UnaryFunction<Observable<T>, ConnectableObservable<T>> {
-  return (source: Observable<T>) => multicast(new BehaviorSubject<T>(value))(source) as ConnectableObservable<T>;
-}
diff --git a/node_modules/rxjs/src/internal/operators/publishLast.ts b/node_modules/rxjs/src/internal/operators/publishLast.ts
deleted file mode 100644
index e431657..0000000
--- a/node_modules/rxjs/src/internal/operators/publishLast.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { Observable } from '../Observable';
-import { AsyncSubject } from '../AsyncSubject';
-import { multicast } from './multicast';
-import { ConnectableObservable } from '../observable/ConnectableObservable';
-import { UnaryFunction } from '../types';
-
-/**
- * Returns a connectable observable sequence that shares a single subscription to the
- * underlying sequence containing only the last notification.
- *
- * ![](publishLast.png)
- *
- * Similar to {@link publish}, but it waits until the source observable completes and stores
- * the last emitted value.
- * Similarly to {@link publishReplay} and {@link publishBehavior}, this keeps storing the last
- * value even if it has no more subscribers. If subsequent subscriptions happen, they will
- * immediately get that last stored value and complete.
- *
- * ## Example
- *
- * ```ts
- * import { interval } from 'rxjs';
- * import { publishLast, tap, take } from 'rxjs/operators';
- *
- * const connectable =
- *   interval(1000)
- *     .pipe(
- *       tap(x => console.log("side effect", x)),
- *       take(3),
- *       publishLast());
- *
- * connectable.subscribe(
- *   x => console.log(  "Sub. A", x),
- *   err => console.log("Sub. A Error", err),
- *   () => console.log( "Sub. A Complete"));
- *
- * connectable.subscribe(
- *   x => console.log(  "Sub. B", x),
- *   err => console.log("Sub. B Error", err),
- *   () => console.log( "Sub. B Complete"));
- *
- * connectable.connect();
- *
- * // Results:
- * //    "side effect 0"
- * //    "side effect 1"
- * //    "side effect 2"
- * //    "Sub. A 2"
- * //    "Sub. B 2"
- * //    "Sub. A Complete"
- * //    "Sub. B Complete"
- * ```
- *
- * @see {@link ConnectableObservable}
- * @see {@link publish}
- * @see {@link publishReplay}
- * @see {@link publishBehavior}
- *
- * @return {ConnectableObservable} An observable sequence that contains the elements of a
- * sequence produced by multicasting the source sequence.
- * @method publishLast
- * @owner Observable
- */
-
-export function publishLast<T>(): UnaryFunction<Observable<T>, ConnectableObservable<T>> {
-  return (source: Observable<T>) => multicast(new AsyncSubject<T>())(source);
-}
diff --git a/node_modules/rxjs/src/internal/operators/publishReplay.ts b/node_modules/rxjs/src/internal/operators/publishReplay.ts
deleted file mode 100644
index a64b52a..0000000
--- a/node_modules/rxjs/src/internal/operators/publishReplay.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { Observable } from '../Observable';
-import { ReplaySubject } from '../ReplaySubject';
-import { multicast } from './multicast';
-import { ConnectableObservable } from '../observable/ConnectableObservable';
-import { UnaryFunction, MonoTypeOperatorFunction, OperatorFunction, SchedulerLike, ObservableInput, ObservedValueOf } from '../types';
-
-/* tslint:disable:max-line-length */
-export function publishReplay<T>(bufferSize?: number, windowTime?: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
-export function publishReplay<T, O extends ObservableInput<any>>(bufferSize?: number, windowTime?: number, selector?: (shared: Observable<T>) => O, scheduler?: SchedulerLike): OperatorFunction<T, ObservedValueOf<O>>;
-/* tslint:enable:max-line-length */
-
-export function publishReplay<T, R>(bufferSize?: number,
-                                    windowTime?: number,
-                                    selectorOrScheduler?: SchedulerLike | OperatorFunction<T, R>,
-                                    scheduler?: SchedulerLike): UnaryFunction<Observable<T>, ConnectableObservable<R>> {
-
-  if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {
-    scheduler = selectorOrScheduler;
-  }
-
-  const selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;
-  const subject = new ReplaySubject<T>(bufferSize, windowTime, scheduler);
-
-  return (source: Observable<T>) => multicast(() => subject, selector)(source) as ConnectableObservable<R>;
-}
diff --git a/node_modules/rxjs/src/internal/operators/race.ts b/node_modules/rxjs/src/internal/operators/race.ts
deleted file mode 100644
index 75b51d3..0000000
--- a/node_modules/rxjs/src/internal/operators/race.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Observable } from '../Observable';
-import { isArray } from '../util/isArray';
-import { MonoTypeOperatorFunction, OperatorFunction } from '../types';
-import { race as raceStatic } from '../observable/race';
-
-/* tslint:disable:max-line-length */
-/** @deprecated Deprecated in favor of static race. */
-export function race<T>(observables: Array<Observable<T>>): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static race. */
-export function race<T, R>(observables: Array<Observable<T>>): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static race. */
-export function race<T>(...observables: Array<Observable<T> | Array<Observable<T>>>): MonoTypeOperatorFunction<T>;
-/** @deprecated Deprecated in favor of static race. */
-export function race<T, R>(...observables: Array<Observable<any> | Array<Observable<any>>>): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Returns an Observable that mirrors the first source Observable to emit a next,
- * error or complete notification from the combination of this Observable and supplied Observables.
- * @param {...Observables} ...observables Sources used to race for which Observable emits first.
- * @return {Observable} An Observable that mirrors the output of the first Observable to emit an item.
- * @method race
- * @owner Observable
- * @deprecated Deprecated in favor of static {@link race}.
- */
-export function race<T>(...observables: (Observable<T> | Observable<T>[])[]): MonoTypeOperatorFunction<T> {
-  return function raceOperatorFunction(source: Observable<T>) {
-    // if the only argument is an array, it was most likely called with
-    // `pair([obs1, obs2, ...])`
-    if (observables.length === 1 && isArray(observables[0])) {
-      observables = observables[0] as Observable<T>[];
-    }
-
-    return source.lift.call(raceStatic(source, ...(observables as Observable<T>[])));
-  };
-}
diff --git a/node_modules/rxjs/src/internal/operators/reduce.ts b/node_modules/rxjs/src/internal/operators/reduce.ts
deleted file mode 100644
index 6039fdb..0000000
--- a/node_modules/rxjs/src/internal/operators/reduce.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { Observable } from '../Observable';
-import { scan } from './scan';
-import { takeLast } from './takeLast';
-import { defaultIfEmpty } from './defaultIfEmpty';
-import { OperatorFunction, MonoTypeOperatorFunction } from '../types';
-import { pipe } from '../util/pipe';
-
-/* tslint:disable:max-line-length */
-export function reduce<T, R>(accumulator: (acc: R, value: T, index: number) => R, seed: R): OperatorFunction<T, R>;
-export function reduce<T>(accumulator: (acc: T, value: T, index: number) => T, seed?: T): MonoTypeOperatorFunction<T>;
-export function reduce<T, R>(accumulator: (acc: R, value: T, index: number) => R): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Applies an accumulator function over the source Observable, and returns the
- * accumulated result when the source completes, given an optional seed value.
- *
- * <span class="informal">Combines together all values emitted on the source,
- * using an accumulator function that knows how to join a new source value into
- * the accumulation from the past.</span>
- *
- * ![](reduce.png)
- *
- * Like
- * [Array.prototype.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce),
- * `reduce` applies an `accumulator` function against an accumulation and each
- * value of the source Observable (from the past) to reduce it to a single
- * value, emitted on the output Observable. Note that `reduce` will only emit
- * one value, only when the source Observable completes. It is equivalent to
- * applying operator {@link scan} followed by operator {@link last}.
- *
- * Returns an Observable that applies a specified `accumulator` function to each
- * item emitted by the source Observable. If a `seed` value is specified, then
- * that value will be used as the initial value for the accumulator. If no seed
- * value is specified, the first item of the source is used as the seed.
- *
- * ## Example
- * Count the number of click events that happened in 5 seconds
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { reduce, takeUntil, mapTo } from 'rxjs/operators';
- *
- * const clicksInFiveSeconds = fromEvent(document, 'click').pipe(
- *   takeUntil(interval(5000)),
- * );
- * const ones = clicksInFiveSeconds.pipe(mapTo(1));
- * const seed = 0;
- * const count = ones.pipe(reduce((acc, one) => acc + one, seed));
- * count.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link count}
- * @see {@link expand}
- * @see {@link mergeScan}
- * @see {@link scan}
- *
- * @param {function(acc: R, value: T, index: number): R} accumulator The accumulator function
- * called on each source value.
- * @param {R} [seed] The initial accumulation value.
- * @return {Observable<R>} An Observable that emits a single value that is the
- * result of accumulating the values emitted by the source Observable.
- * @method reduce
- * @owner Observable
- */
-export function reduce<T, R>(accumulator: (acc: T | R, value: T, index?: number) => T | R, seed?: T | R): OperatorFunction<T, T | R> {
-  // providing a seed of `undefined` *should* be valid and trigger
-  // hasSeed! so don't use `seed !== undefined` checks!
-  // For this reason, we have to check it here at the original call site
-  // otherwise inside Operator/Subscriber we won't know if `undefined`
-  // means they didn't provide anything or if they literally provided `undefined`
-  if (arguments.length >= 2) {
-    return function reduceOperatorFunctionWithSeed(source: Observable<T>): Observable<T | R> {
-      return pipe(scan(accumulator, seed), takeLast(1), defaultIfEmpty(seed))(source);
-    };
-  }
-  return function reduceOperatorFunction(source: Observable<T>): Observable<T | R> {
-    return pipe(
-      scan<T, T | R>((acc, value, index) => accumulator(acc, value, index + 1)),
-      takeLast(1),
-    )(source);
-  };
-}
diff --git a/node_modules/rxjs/src/internal/operators/refCount.ts b/node_modules/rxjs/src/internal/operators/refCount.ts
deleted file mode 100644
index 227c366..0000000
--- a/node_modules/rxjs/src/internal/operators/refCount.ts
+++ /dev/null
@@ -1,148 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-import { ConnectableObservable } from '../observable/ConnectableObservable';
-import { Observable } from '../Observable';
-
-/**
- * Make a {@link ConnectableObservable} behave like a ordinary observable and automates the way
- * you can connect to it.
- *
- * Internally it counts the subscriptions to the observable and subscribes (only once) to the source if
- * the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it
- * unsubscribes from the source. This way you can make sure that everything before the *published*
- * refCount has only a single subscription independently of the number of subscribers to the target
- * observable.
- *
- * Note that using the {@link share} operator is exactly the same as using the *publish* operator
- * (making the observable hot) and the *refCount* operator in a sequence.
- *
- * ![](refCount.png)
- *
- * ## Example
- *
- * In the following example there are two intervals turned into connectable observables
- * by using the *publish* operator. The first one uses the *refCount* operator, the
- * second one does not use it. You will notice that a connectable observable does nothing
- * until you call its connect function.
- *
- * ```ts
- * import { interval } from 'rxjs';
- * import { tap, publish, refCount } from 'rxjs/operators';
- *
- * // Turn the interval observable into a ConnectableObservable (hot)
- * const refCountInterval = interval(400).pipe(
- *   tap((num) => console.log(`refCount ${num}`)),
- *   publish(),
- *   refCount()
- * );
- *
- * const publishedInterval = interval(400).pipe(
- *   tap((num) => console.log(`publish ${num}`)),
- *   publish()
- * );
- *
- * refCountInterval.subscribe();
- * refCountInterval.subscribe();
- * // 'refCount 0' -----> 'refCount 1' -----> etc
- * // All subscriptions will receive the same value and the tap (and
- * // every other operator) before the publish operator will be executed
- * // only once per event independently of the number of subscriptions.
- *
- * publishedInterval.subscribe();
- * // Nothing happens until you call .connect() on the observable.
- * ```
- *
- * @see {@link ConnectableObservable}
- * @see {@link share}
- * @see {@link publish}
- */
-export function refCount<T>(): MonoTypeOperatorFunction<T> {
-  return function refCountOperatorFunction(source: ConnectableObservable<T>): Observable<T> {
-    return source.lift(new RefCountOperator(source));
-  } as MonoTypeOperatorFunction<T>;
-}
-
-class RefCountOperator<T> implements Operator<T, T> {
-  constructor(private connectable: ConnectableObservable<T>) {
-  }
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-
-    const { connectable } = this;
-    (<any> connectable)._refCount++;
-
-    const refCounter = new RefCountSubscriber(subscriber, connectable);
-    const subscription = source.subscribe(refCounter);
-
-    if (!refCounter.closed) {
-      (<any> refCounter).connection = connectable.connect();
-    }
-
-    return subscription;
-  }
-}
-
-class RefCountSubscriber<T> extends Subscriber<T> {
-
-  private connection: Subscription;
-
-  constructor(destination: Subscriber<T>,
-              private connectable: ConnectableObservable<T>) {
-    super(destination);
-  }
-
-  protected _unsubscribe() {
-
-    const { connectable } = this;
-    if (!connectable) {
-      this.connection = null;
-      return;
-    }
-
-    this.connectable = null;
-    const refCount = (<any> connectable)._refCount;
-    if (refCount <= 0) {
-      this.connection = null;
-      return;
-    }
-
-    (<any> connectable)._refCount = refCount - 1;
-    if (refCount > 1) {
-      this.connection = null;
-      return;
-    }
-
-    ///
-    // Compare the local RefCountSubscriber's connection Subscription to the
-    // connection Subscription on the shared ConnectableObservable. In cases
-    // where the ConnectableObservable source synchronously emits values, and
-    // the RefCountSubscriber's downstream Observers synchronously unsubscribe,
-    // execution continues to here before the RefCountOperator has a chance to
-    // supply the RefCountSubscriber with the shared connection Subscription.
-    // For example:
-    // ```
-    // range(0, 10).pipe(
-    //   publish(),
-    //   refCount(),
-    //   take(5),
-    // )
-    // .subscribe();
-    // ```
-    // In order to account for this case, RefCountSubscriber should only dispose
-    // the ConnectableObservable's shared connection Subscription if the
-    // connection Subscription exists, *and* either:
-    //   a. RefCountSubscriber doesn't have a reference to the shared connection
-    //      Subscription yet, or,
-    //   b. RefCountSubscriber's connection Subscription reference is identical
-    //      to the shared connection Subscription
-    ///
-    const { connection } = this;
-    const sharedConnection = (<any> connectable)._connection;
-    this.connection = null;
-
-    if (sharedConnection && (!connection || sharedConnection === connection)) {
-      sharedConnection.unsubscribe();
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/repeat.ts b/node_modules/rxjs/src/internal/operators/repeat.ts
deleted file mode 100644
index 7bde309..0000000
--- a/node_modules/rxjs/src/internal/operators/repeat.ts
+++ /dev/null
@@ -1,106 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { empty } from '../observable/empty';
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Returns an Observable that will resubscribe to the source stream when the source stream completes, at most count times.
- *
- * <span class="informal">Repeats all values emitted on the source. It's like {@link retry}, but for non error cases.</span>
- *
- * ![](repeat.png)
- *
- * Similar to {@link retry}, this operator repeats the stream of items emitted by the source for non error cases.
- * Repeat can be useful for creating observables that are meant to have some repeated pattern or rhythm.
- *
- * Note: `repeat(0)` returns an empty observable and `repeat()` will repeat forever
- *
- * ## Example
- * Repeat a message stream
- * ```ts
- * import { of } from 'rxjs';
- * import { repeat, delay } from 'rxjs/operators';
- *
- * const source = of('Repeat message');
- * const example = source.pipe(repeat(3));
- * example.subscribe(x => console.log(x));
- *
- * // Results
- * // Repeat message
- * // Repeat message
- * // Repeat message
- * ```
- *
- * Repeat 3 values, 2 times
- * ```ts
- * import { interval } from 'rxjs';
- * import { repeat, take } from 'rxjs/operators';
- *
- * const source = interval(1000);
- * const example = source.pipe(take(3), repeat(2));
- * example.subscribe(x => console.log(x));
- *
- * // Results every second
- * // 0
- * // 1
- * // 2
- * // 0
- * // 1
- * // 2
- * ```
- *
- * @see {@link repeatWhen}
- * @see {@link retry}
- *
- * @param {number} [count] The number of times the source Observable items are repeated, a count of 0 will yield
- * an empty Observable.
- * @return {Observable} An Observable that will resubscribe to the source stream when the source stream completes
- * , at most count times.
- * @method repeat
- * @owner Observable
- */
-export function repeat<T>(count: number = -1): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => {
-    if (count === 0) {
-      return empty();
-    } else if (count < 0) {
-      return source.lift(new RepeatOperator(-1, source));
-    } else {
-      return source.lift(new RepeatOperator(count - 1, source));
-    }
-  };
-}
-
-class RepeatOperator<T> implements Operator<T, T> {
-  constructor(private count: number,
-              private source: Observable<T>) {
-  }
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class RepeatSubscriber<T> extends Subscriber<T> {
-  constructor(destination: Subscriber<any>,
-              private count: number,
-              private source: Observable<T>) {
-    super(destination);
-  }
-  complete() {
-    if (!this.isStopped) {
-      const { source, count } = this;
-      if (count === 0) {
-        return super.complete();
-      } else if (count > -1) {
-        this.count = count - 1;
-      }
-      source.subscribe(this._unsubscribeAndRecycle());
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/repeatWhen.ts b/node_modules/rxjs/src/internal/operators/repeatWhen.ts
deleted file mode 100644
index ecdbe31..0000000
--- a/node_modules/rxjs/src/internal/operators/repeatWhen.ts
+++ /dev/null
@@ -1,140 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { Subject } from '../Subject';
-import { Subscription } from '../Subscription';
-
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Returns an Observable that mirrors the source Observable with the exception of a `complete`. If the source
- * Observable calls `complete`, this method will emit to the Observable returned from `notifier`. If that Observable
- * calls `complete` or `error`, then this method will call `complete` or `error` on the child subscription. Otherwise
- * this method will resubscribe to the source Observable.
- *
- * ![](repeatWhen.png)
- *
- * ## Example
- * Repeat a message stream on click
- * ```ts
- * import { of, fromEvent } from 'rxjs';
- * import { repeatWhen } from 'rxjs/operators';
- *
- * const source = of('Repeat message');
- * const documentClick$ = fromEvent(document, 'click');
- *
- * source.pipe(repeatWhen(() => documentClick$)
- * ).subscribe(data => console.log(data))
- * ```
- * @see {@link repeat}
- * @see {@link retry}
- * @see {@link retryWhen}
- *
- * @param {function(notifications: Observable): Observable} notifier - Receives an Observable of notifications with
- * which a user can `complete` or `error`, aborting the repetition.
- * @return {Observable} The source Observable modified with repeat logic.
- * @method repeatWhen
- * @owner Observable
- */
-export function repeatWhen<T>(notifier: (notifications: Observable<any>) => Observable<any>): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new RepeatWhenOperator(notifier));
-}
-
-class RepeatWhenOperator<T> implements Operator<T, T> {
-  constructor(protected notifier: (notifications: Observable<any>) => Observable<any>) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class RepeatWhenSubscriber<T, R> extends OuterSubscriber<T, R> {
-
-  private notifications: Subject<any>;
-  private retries: Observable<any>;
-  private retriesSubscription: Subscription;
-  private sourceIsBeingSubscribedTo: boolean = true;
-
-  constructor(destination: Subscriber<R>,
-              private notifier: (notifications: Observable<any>) => Observable<any>,
-              private source: Observable<T>) {
-    super(destination);
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this.sourceIsBeingSubscribedTo = true;
-    this.source.subscribe(this);
-  }
-
-  notifyComplete(innerSub: InnerSubscriber<T, R>): void {
-    if (this.sourceIsBeingSubscribedTo === false) {
-      return super.complete();
-    }
-  }
-
-  complete() {
-    this.sourceIsBeingSubscribedTo = false;
-
-    if (!this.isStopped) {
-      if (!this.retries) {
-        this.subscribeToRetries();
-      }
-      if (!this.retriesSubscription || this.retriesSubscription.closed) {
-        return super.complete();
-      }
-
-      this._unsubscribeAndRecycle();
-      this.notifications.next();
-    }
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _unsubscribe() {
-    const { notifications, retriesSubscription } = this;
-    if (notifications) {
-      notifications.unsubscribe();
-      this.notifications = null;
-    }
-    if (retriesSubscription) {
-      retriesSubscription.unsubscribe();
-      this.retriesSubscription = null;
-    }
-    this.retries = null;
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _unsubscribeAndRecycle(): Subscriber<T> {
-    const { _unsubscribe } = this;
-
-    this._unsubscribe = null;
-    super._unsubscribeAndRecycle();
-    this._unsubscribe = _unsubscribe;
-
-    return this;
-  }
-
-  private subscribeToRetries() {
-    this.notifications = new Subject();
-    let retries;
-    try {
-      const { notifier } = this;
-      retries = notifier(this.notifications);
-    } catch (e) {
-      return super.complete();
-    }
-    this.retries = retries;
-    this.retriesSubscription = subscribeToResult(this, retries);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/retry.ts b/node_modules/rxjs/src/internal/operators/retry.ts
deleted file mode 100644
index a6ce566..0000000
--- a/node_modules/rxjs/src/internal/operators/retry.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable
- * calls `error`, this method will resubscribe to the source Observable for a maximum of `count` resubscriptions (given
- * as a number parameter) rather than propagating the `error` call.
- *
- * ![](retry.png)
- *
- * Any and all items emitted by the source Observable will be emitted by the resulting Observable, even those emitted
- * during failed subscriptions. For example, if an Observable fails at first but emits [1, 2] then succeeds the second
- * time and emits: [1, 2, 3, 4, 5] then the complete stream of emissions and notifications
- * would be: [1, 2, 1, 2, 3, 4, 5, `complete`].
- *
- * ## Example
- * ```ts
- * import { interval, of, throwError } from 'rxjs';
- * import { mergeMap, retry } from 'rxjs/operators';
- *
- * const source = interval(1000);
- * const example = source.pipe(
- *   mergeMap(val => {
- *     if(val > 5){
- *       return throwError('Error!');
- *     }
- *     return of(val);
- *   }),
- *   //retry 2 times on error
- *   retry(2)
- * );
- *
- * const subscribe = example.subscribe({
- *   next: val => console.log(val),
- *   error: val => console.log(`${val}: Retried 2 times then quit!`)
- * });
- *
- * // Output:
- * // 0..1..2..3..4..5..
- * // 0..1..2..3..4..5..
- * // 0..1..2..3..4..5..
- * // "Error!: Retried 2 times then quit!"
- * ```
- *
- * @param {number} count - Number of retry attempts before failing.
- * @return {Observable} The source Observable modified with the retry logic.
- * @method retry
- * @owner Observable
- */
-export function retry<T>(count: number = -1): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new RetryOperator(count, source));
-}
-
-class RetryOperator<T> implements Operator<T, T> {
-  constructor(private count: number,
-              private source: Observable<T>) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class RetrySubscriber<T> extends Subscriber<T> {
-  constructor(destination: Subscriber<any>,
-              private count: number,
-              private source: Observable<T>) {
-    super(destination);
-  }
-  error(err: any) {
-    if (!this.isStopped) {
-      const { source, count } = this;
-      if (count === 0) {
-        return super.error(err);
-      } else if (count > -1) {
-        this.count = count - 1;
-      }
-      source.subscribe(this._unsubscribeAndRecycle());
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/retryWhen.ts b/node_modules/rxjs/src/internal/operators/retryWhen.ts
deleted file mode 100644
index 325742d..0000000
--- a/node_modules/rxjs/src/internal/operators/retryWhen.ts
+++ /dev/null
@@ -1,114 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { Subject } from '../Subject';
-import { Subscription } from '../Subscription';
-
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable
- * calls `error`, this method will emit the Throwable that caused the error to the Observable returned from `notifier`.
- * If that Observable calls `complete` or `error` then this method will call `complete` or `error` on the child
- * subscription. Otherwise this method will resubscribe to the source Observable.
- *
- * ![](retryWhen.png)
- *
- * @param {function(errors: Observable): Observable} notifier - Receives an Observable of notifications with which a
- * user can `complete` or `error`, aborting the retry.
- * @return {Observable} The source Observable modified with retry logic.
- * @method retryWhen
- * @owner Observable
- */
-export function retryWhen<T>(notifier: (errors: Observable<any>) => Observable<any>): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new RetryWhenOperator(notifier, source));
-}
-
-class RetryWhenOperator<T> implements Operator<T, T> {
-  constructor(protected notifier: (errors: Observable<any>) => Observable<any>,
-              protected source: Observable<T>) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class RetryWhenSubscriber<T, R> extends OuterSubscriber<T, R> {
-
-  private errors: Subject<any>;
-  private retries: Observable<any>;
-  private retriesSubscription: Subscription;
-
-  constructor(destination: Subscriber<R>,
-              private notifier: (errors: Observable<any>) => Observable<any>,
-              private source: Observable<T>) {
-    super(destination);
-  }
-
-  error(err: any) {
-    if (!this.isStopped) {
-
-      let errors = this.errors;
-      let retries: any = this.retries;
-      let retriesSubscription = this.retriesSubscription;
-
-      if (!retries) {
-        errors = new Subject();
-        try {
-          const { notifier } = this;
-          retries = notifier(errors);
-        } catch (e) {
-          return super.error(e);
-        }
-        retriesSubscription = subscribeToResult(this, retries);
-      } else {
-        this.errors = null;
-        this.retriesSubscription = null;
-      }
-
-      this._unsubscribeAndRecycle();
-
-      this.errors = errors;
-      this.retries = retries;
-      this.retriesSubscription = retriesSubscription;
-
-      errors.next(err);
-    }
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _unsubscribe() {
-    const { errors, retriesSubscription } = this;
-    if (errors) {
-      errors.unsubscribe();
-      this.errors = null;
-    }
-    if (retriesSubscription) {
-      retriesSubscription.unsubscribe();
-      this.retriesSubscription = null;
-    }
-    this.retries = null;
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    const { _unsubscribe } = this;
-
-    this._unsubscribe = null;
-    this._unsubscribeAndRecycle();
-    this._unsubscribe = _unsubscribe;
-
-    this.source.subscribe(this);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/sample.ts b/node_modules/rxjs/src/internal/operators/sample.ts
deleted file mode 100644
index 5665dec..0000000
--- a/node_modules/rxjs/src/internal/operators/sample.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Emits the most recently emitted value from the source Observable whenever
- * another Observable, the `notifier`, emits.
- *
- * <span class="informal">It's like {@link sampleTime}, but samples whenever
- * the `notifier` Observable emits something.</span>
- *
- * ![](sample.png)
- *
- * Whenever the `notifier` Observable emits a value or completes, `sample`
- * looks at the source Observable and emits whichever value it has most recently
- * emitted since the previous sampling, unless the source has not emitted
- * anything since the previous sampling. The `notifier` is subscribed to as soon
- * as the output Observable is subscribed.
- *
- * ## Example
- * On every click, sample the most recent "seconds" timer
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { sample } from 'rxjs/operators';
- *
- * const seconds = interval(1000);
- * const clicks = fromEvent(document, 'click');
- * const result = seconds.pipe(sample(clicks));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link audit}
- * @see {@link debounce}
- * @see {@link sampleTime}
- * @see {@link throttle}
- *
- * @param {Observable<any>} notifier The Observable to use for sampling the
- * source Observable.
- * @return {Observable<T>} An Observable that emits the results of sampling the
- * values emitted by the source Observable whenever the notifier Observable
- * emits value or completes.
- * @method sample
- * @owner Observable
- */
-export function sample<T>(notifier: Observable<any>): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new SampleOperator(notifier));
-}
-
-class SampleOperator<T> implements Operator<T, T> {
-  constructor(private notifier: Observable<any>) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    const sampleSubscriber = new SampleSubscriber(subscriber);
-    const subscription = source.subscribe(sampleSubscriber);
-    subscription.add(subscribeToResult(sampleSubscriber, this.notifier));
-    return subscription;
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class SampleSubscriber<T, R> extends OuterSubscriber<T, R> {
-  private value: T;
-  private hasValue: boolean = false;
-
-  protected _next(value: T) {
-    this.value = value;
-    this.hasValue = true;
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this.emitValue();
-  }
-
-  notifyComplete(): void {
-    this.emitValue();
-  }
-
-  emitValue() {
-    if (this.hasValue) {
-      this.hasValue = false;
-      this.destination.next(this.value);
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/sampleTime.ts b/node_modules/rxjs/src/internal/operators/sampleTime.ts
deleted file mode 100644
index 0ff1227..0000000
--- a/node_modules/rxjs/src/internal/operators/sampleTime.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { async } from '../scheduler/async';
-import { MonoTypeOperatorFunction, SchedulerAction, SchedulerLike, TeardownLogic } from '../types';
-
-/**
- * Emits the most recently emitted value from the source Observable within
- * periodic time intervals.
- *
- * <span class="informal">Samples the source Observable at periodic time
- * intervals, emitting what it samples.</span>
- *
- * ![](sampleTime.png)
- *
- * `sampleTime` periodically looks at the source Observable and emits whichever
- * value it has most recently emitted since the previous sampling, unless the
- * source has not emitted anything since the previous sampling. The sampling
- * happens periodically in time every `period` milliseconds (or the time unit
- * defined by the optional `scheduler` argument). The sampling starts as soon as
- * the output Observable is subscribed.
- *
- * ## Example
- * Every second, emit the most recent click at most once
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { sampleTime } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(sampleTime(1000));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link auditTime}
- * @see {@link debounceTime}
- * @see {@link delay}
- * @see {@link sample}
- * @see {@link throttleTime}
- *
- * @param {number} period The sampling period expressed in milliseconds or the
- * time unit determined internally by the optional `scheduler`.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
- * managing the timers that handle the sampling.
- * @return {Observable<T>} An Observable that emits the results of sampling the
- * values emitted by the source Observable at the specified time interval.
- * @method sampleTime
- * @owner Observable
- */
-export function sampleTime<T>(period: number, scheduler: SchedulerLike = async): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new SampleTimeOperator(period, scheduler));
-}
-
-class SampleTimeOperator<T> implements Operator<T, T> {
-  constructor(private period: number,
-              private scheduler: SchedulerLike) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class SampleTimeSubscriber<T> extends Subscriber<T> {
-  lastValue: T;
-  hasValue: boolean = false;
-
-  constructor(destination: Subscriber<T>,
-              private period: number,
-              private scheduler: SchedulerLike) {
-    super(destination);
-    this.add(scheduler.schedule(dispatchNotification, period, { subscriber: this, period }));
-  }
-
-  protected _next(value: T) {
-    this.lastValue = value;
-    this.hasValue = true;
-  }
-
-  notifyNext() {
-    if (this.hasValue) {
-      this.hasValue = false;
-      this.destination.next(this.lastValue);
-    }
-  }
-}
-
-function dispatchNotification<T>(this: SchedulerAction<any>, state: any) {
-  let { subscriber, period } = state;
-  subscriber.notifyNext();
-  this.schedule(state, period);
-}
diff --git a/node_modules/rxjs/src/internal/operators/scan.ts b/node_modules/rxjs/src/internal/operators/scan.ts
deleted file mode 100644
index a1eb511..0000000
--- a/node_modules/rxjs/src/internal/operators/scan.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { OperatorFunction, MonoTypeOperatorFunction } from '../types';
-
-/* tslint:disable:max-line-length */
-export function scan<T, R>(accumulator: (acc: R, value: T, index: number) => R, seed: R): OperatorFunction<T, R>;
-export function scan<T>(accumulator: (acc: T, value: T, index: number) => T, seed?: T): MonoTypeOperatorFunction<T>;
-export function scan<T, R>(accumulator: (acc: R, value: T, index: number) => R): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Applies an accumulator function over the source Observable, and returns each
- * intermediate result, with an optional seed value.
- *
- * <span class="informal">It's like {@link reduce}, but emits the current
- * accumulation whenever the source emits a value.</span>
- *
- * ![](scan.png)
- *
- * Combines together all values emitted on the source, using an accumulator
- * function that knows how to join a new source value into the accumulation from
- * the past. Is similar to {@link reduce}, but emits the intermediate
- * accumulations.
- *
- * Returns an Observable that applies a specified `accumulator` function to each
- * item emitted by the source Observable. If a `seed` value is specified, then
- * that value will be used as the initial value for the accumulator. If no seed
- * value is specified, the first item of the source is used as the seed.
- *
- * ## Example
- * Count the number of click events
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { scan, mapTo } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const ones = clicks.pipe(mapTo(1));
- * const seed = 0;
- * const count = ones.pipe(scan((acc, one) => acc + one, seed));
- * count.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link expand}
- * @see {@link mergeScan}
- * @see {@link reduce}
- *
- * @param {function(acc: R, value: T, index: number): R} accumulator
- * The accumulator function called on each source value.
- * @param {T|R} [seed] The initial accumulation value.
- * @return {Observable<R>} An observable of the accumulated values.
- * @method scan
- * @owner Observable
- */
-export function scan<T, R>(accumulator: (acc: R, value: T, index: number) => R, seed?: T | R): OperatorFunction<T, R> {
-  let hasSeed = false;
-  // providing a seed of `undefined` *should* be valid and trigger
-  // hasSeed! so don't use `seed !== undefined` checks!
-  // For this reason, we have to check it here at the original call site
-  // otherwise inside Operator/Subscriber we won't know if `undefined`
-  // means they didn't provide anything or if they literally provided `undefined`
-  if (arguments.length >= 2) {
-    hasSeed = true;
-  }
-
-  return function scanOperatorFunction(source: Observable<T>): Observable<R> {
-    return source.lift(new ScanOperator(accumulator, seed, hasSeed));
-  };
-}
-
-class ScanOperator<T, R> implements Operator<T, R> {
-  constructor(private accumulator: (acc: R, value: T, index: number) => R, private seed?: T | R, private hasSeed: boolean = false) {}
-
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class ScanSubscriber<T, R> extends Subscriber<T> {
-  private index: number = 0;
-
-  get seed(): T | R {
-    return this._seed;
-  }
-
-  set seed(value: T | R) {
-    this.hasSeed = true;
-    this._seed = value;
-  }
-
-  constructor(destination: Subscriber<R>, private accumulator: (acc: R, value: T, index: number) => R, private _seed: T | R,
-              private hasSeed: boolean) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    if (!this.hasSeed) {
-      this.seed = value;
-      this.destination.next(value);
-    } else {
-      return this._tryNext(value);
-    }
-  }
-
-  private _tryNext(value: T): void {
-    const index = this.index++;
-    let result: any;
-    try {
-      result = this.accumulator(<R>this.seed, value, index);
-    } catch (err) {
-      this.destination.error(err);
-    }
-    this.seed = result;
-    this.destination.next(result);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/sequenceEqual.ts b/node_modules/rxjs/src/internal/operators/sequenceEqual.ts
deleted file mode 100644
index a614c49..0000000
--- a/node_modules/rxjs/src/internal/operators/sequenceEqual.ts
+++ /dev/null
@@ -1,174 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-
-import { Observer, OperatorFunction } from '../types';
-
-/**
- * Compares all values of two observables in sequence using an optional comparator function
- * and returns an observable of a single boolean value representing whether or not the two sequences
- * are equal.
- *
- * <span class="informal">Checks to see of all values emitted by both observables are equal, in order.</span>
- *
- * ![](sequenceEqual.png)
- *
- * `sequenceEqual` subscribes to two observables and buffers incoming values from each observable. Whenever either
- * observable emits a value, the value is buffered and the buffers are shifted and compared from the bottom
- * up; If any value pair doesn't match, the returned observable will emit `false` and complete. If one of the
- * observables completes, the operator will wait for the other observable to complete; If the other
- * observable emits before completing, the returned observable will emit `false` and complete. If one observable never
- * completes or emits after the other complets, the returned observable will never complete.
- *
- * ## Example
- * figure out if the Konami code matches
- * ```ts
- * import { from, fromEvent } from 'rxjs';
- * import { sequenceEqual, bufferCount, mergeMap, map } from 'rxjs/operators';
- *
- * const codes = from([
- *   'ArrowUp',
- *   'ArrowUp',
- *   'ArrowDown',
- *   'ArrowDown',
- *   'ArrowLeft',
- *   'ArrowRight',
- *   'ArrowLeft',
- *   'ArrowRight',
- *   'KeyB',
- *   'KeyA',
- *   'Enter', // no start key, clearly.
- * ]);
- *
- * const keys = fromEvent(document, 'keyup').pipe(map(e => e.code));
- * const matches = keys.pipe(
- *   bufferCount(11, 1),
- *   mergeMap(
- *     last11 => from(last11).pipe(sequenceEqual(codes)),
- *   ),
- * );
- * matches.subscribe(matched => console.log('Successful cheat at Contra? ', matched));
- * ```
- *
- * @see {@link combineLatest}
- * @see {@link zip}
- * @see {@link withLatestFrom}
- *
- * @param {Observable} compareTo The observable sequence to compare the source sequence to.
- * @param {function} [comparator] An optional function to compare each value pair
- * @return {Observable} An Observable of a single boolean value representing whether or not
- * the values emitted by both observables were equal in sequence.
- * @method sequenceEqual
- * @owner Observable
- */
-export function sequenceEqual<T>(compareTo: Observable<T>,
-                                 comparator?: (a: T, b: T) => boolean): OperatorFunction<T, boolean> {
-  return (source: Observable<T>) => source.lift(new SequenceEqualOperator(compareTo, comparator));
-}
-
-export class SequenceEqualOperator<T> implements Operator<T, boolean> {
-  constructor(private compareTo: Observable<T>,
-              private comparator: (a: T, b: T) => boolean) {
-  }
-
-  call(subscriber: Subscriber<boolean>, source: any): any {
-    return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class SequenceEqualSubscriber<T, R> extends Subscriber<T> {
-  private _a: T[] = [];
-  private _b: T[] = [];
-  private _oneComplete = false;
-
-  constructor(destination: Observer<R>,
-              private compareTo: Observable<T>,
-              private comparator: (a: T, b: T) => boolean) {
-    super(destination);
-    (this.destination as Subscription).add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, this)));
-  }
-
-  protected _next(value: T): void {
-    if (this._oneComplete && this._b.length === 0) {
-      this.emit(false);
-    } else {
-      this._a.push(value);
-      this.checkValues();
-    }
-  }
-
-  public _complete(): void {
-    if (this._oneComplete) {
-      this.emit(this._a.length === 0 && this._b.length === 0);
-    } else {
-      this._oneComplete = true;
-    }
-    this.unsubscribe();
-  }
-
-  checkValues() {
-    const { _a, _b, comparator } = this;
-    while (_a.length > 0 && _b.length > 0) {
-      let a = _a.shift();
-      let b = _b.shift();
-      let areEqual = false;
-      try {
-        areEqual = comparator ? comparator(a, b) : a === b;
-      } catch (e) {
-        this.destination.error(e);
-      }
-      if (!areEqual) {
-        this.emit(false);
-      }
-    }
-  }
-
-  emit(value: boolean) {
-    const { destination } = this;
-    destination.next(value);
-    destination.complete();
-  }
-
-  nextB(value: T) {
-    if (this._oneComplete && this._a.length === 0) {
-      this.emit(false);
-    } else {
-      this._b.push(value);
-      this.checkValues();
-    }
-  }
-
-  completeB() {
-    if (this._oneComplete) {
-      this.emit(this._a.length === 0 && this._b.length === 0);
-    } else {
-      this._oneComplete = true;
-    }
-  }
-}
-
-class SequenceEqualCompareToSubscriber<T, R> extends Subscriber<T> {
-  constructor(destination: Observer<R>, private parent: SequenceEqualSubscriber<T, R>) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    this.parent.nextB(value);
-  }
-
-  protected _error(err: any): void {
-    this.parent.error(err);
-    this.unsubscribe();
-  }
-
-  protected _complete(): void {
-    this.parent.completeB();
-    this.unsubscribe();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/share.ts b/node_modules/rxjs/src/internal/operators/share.ts
deleted file mode 100644
index f055968..0000000
--- a/node_modules/rxjs/src/internal/operators/share.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { Observable } from '../Observable';
-import { multicast } from './multicast';
-import { refCount } from './refCount';
-import { Subject } from '../Subject';
-
-import { MonoTypeOperatorFunction } from '../types';
-
-function shareSubjectFactory() {
-  return new Subject();
-}
-
-/**
- * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one
- * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will
- * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.
- * This is an alias for `multicast(() => new Subject()), refCount()`.
- *
- * ![](share.png)
- *
- * @return {Observable<T>} An Observable that upon connection causes the source Observable to emit items to its Observers.
- * @method share
- * @owner Observable
- */
-export function share<T>(): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => refCount()(multicast(shareSubjectFactory)(source)) as Observable<T>;
-}
diff --git a/node_modules/rxjs/src/internal/operators/shareReplay.ts b/node_modules/rxjs/src/internal/operators/shareReplay.ts
deleted file mode 100644
index 400ddc8..0000000
--- a/node_modules/rxjs/src/internal/operators/shareReplay.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-import { Observable } from '../Observable';
-import { ReplaySubject } from '../ReplaySubject';
-import { Subscription } from '../Subscription';
-import { MonoTypeOperatorFunction, SchedulerLike } from '../types';
-import { Subscriber } from '../Subscriber';
-
-export interface ShareReplayConfig {
-  bufferSize?: number;
-  windowTime?: number;
-  refCount: boolean;
-  scheduler?: SchedulerLike;
-}
-
-/**
- * Share source and replay specified number of emissions on subscription.
- *
- * This operator is a specialization of `replay` that connects to a source observable
- * and multicasts through a `ReplaySubject` constructed with the specified arguments.
- * A successfully completed source will stay cached in the `shareReplayed observable` forever,
- * but an errored source can be retried.
- *
- * ## Why use shareReplay?
- * You generally want to use `shareReplay` when you have side-effects or taxing computations
- * that you do not wish to be executed amongst multiple subscribers.
- * It may also be valuable in situations where you know you will have late subscribers to
- * a stream that need access to previously emitted values.
- * This ability to replay values on subscription is what differentiates {@link share} and `shareReplay`.
- *
- * ![](shareReplay.png)
- *
- * ## Example
- * ```ts
- * import { interval } from 'rxjs';
- * import { shareReplay, take } from 'rxjs/operators';
- *
- * const obs$ = interval(1000);
- * const shared$ = obs$.pipe(
- *   take(4),
- *   shareReplay(3)
- * );
- * shared$.subscribe(x => console.log('source A: ', x));
- * shared$.subscribe(y => console.log('source B: ', y));
- *
- * ```
- *
- * @see {@link publish}
- * @see {@link share}
- * @see {@link publishReplay}
- *
- * @param {Number} [bufferSize=Number.POSITIVE_INFINITY] Maximum element count of the replay buffer.
- * @param {Number} [windowTime=Number.POSITIVE_INFINITY] Maximum time length of the replay buffer in milliseconds.
- * @param {Scheduler} [scheduler] Scheduler where connected observers within the selector function
- * will be invoked on.
- * @return {Observable} An observable sequence that contains the elements of a sequence produced
- * by multicasting the source sequence within a selector function.
- * @method shareReplay
- * @owner Observable
- */
-export function shareReplay<T>(config: ShareReplayConfig): MonoTypeOperatorFunction<T>;
-export function shareReplay<T>(bufferSize?: number, windowTime?: number, scheduler?: SchedulerLike): MonoTypeOperatorFunction<T>;
-export function shareReplay<T>(
-  configOrBufferSize?: ShareReplayConfig | number,
-  windowTime?: number,
-  scheduler?: SchedulerLike
-): MonoTypeOperatorFunction<T> {
-  let config: ShareReplayConfig;
-  if (configOrBufferSize && typeof configOrBufferSize === 'object') {
-    config = configOrBufferSize as ShareReplayConfig;
-  } else {
-    config = {
-      bufferSize: configOrBufferSize as number | undefined,
-      windowTime,
-      refCount: false,
-      scheduler
-    };
-  }
-  return (source: Observable<T>) => source.lift(shareReplayOperator(config));
-}
-
-function shareReplayOperator<T>({
-  bufferSize = Number.POSITIVE_INFINITY,
-  windowTime = Number.POSITIVE_INFINITY,
-  refCount: useRefCount,
-  scheduler
-}: ShareReplayConfig) {
-  let subject: ReplaySubject<T> | undefined;
-  let refCount = 0;
-  let subscription: Subscription | undefined;
-  let hasError = false;
-  let isComplete = false;
-
-  return function shareReplayOperation(this: Subscriber<T>, source: Observable<T>) {
-    refCount++;
-    if (!subject || hasError) {
-      hasError = false;
-      subject = new ReplaySubject<T>(bufferSize, windowTime, scheduler);
-      subscription = source.subscribe({
-        next(value) { subject.next(value); },
-        error(err) {
-          hasError = true;
-          subject.error(err);
-        },
-        complete() {
-          isComplete = true;
-          subscription = undefined;
-          subject.complete();
-        },
-      });
-    }
-
-    const innerSub = subject.subscribe(this);
-    this.add(() => {
-      refCount--;
-      innerSub.unsubscribe();
-      if (subscription && !isComplete && useRefCount && refCount === 0) {
-        subscription.unsubscribe();
-        subscription = undefined;
-        subject = undefined;
-      }
-    });
-  };
-}
diff --git a/node_modules/rxjs/src/internal/operators/single.ts b/node_modules/rxjs/src/internal/operators/single.ts
deleted file mode 100644
index e23e147..0000000
--- a/node_modules/rxjs/src/internal/operators/single.ts
+++ /dev/null
@@ -1,123 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { EmptyError } from '../util/EmptyError';
-
-import { Observer, MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Returns an Observable that emits the single item emitted by the source Observable that matches a specified
- * predicate, if that Observable emits one such item. If the source Observable emits more than one such item or no
- * items, notify of an IllegalArgumentException or NoSuchElementException respectively. If the source Observable
- * emits items but none match the specified predicate then `undefined` is emitted.
- *
- * <span class="informal">Like {@link first}, but emit with error notification if there is more than one value.</span>
- * ![](single.png)
- *
- * ## Example
- * emits 'error'
- * ```ts
- * import { range } from 'rxjs';
- * import { single } from 'rxjs/operators';
- *
- * const numbers = range(1,5).pipe(single());
- * numbers.subscribe(x => console.log('never get called'), e => console.log('error'));
- * // result
- * // 'error'
- * ```
- *
- * emits 'undefined'
- * ```ts
- * import { range } from 'rxjs';
- * import { single } from 'rxjs/operators';
- *
- * const numbers = range(1,5).pipe(single(x => x === 10));
- * numbers.subscribe(x => console.log(x));
- * // result
- * // 'undefined'
- * ```
- *
- * @see {@link first}
- * @see {@link find}
- * @see {@link findIndex}
- * @see {@link elementAt}
- *
- * @throws {EmptyError} Delivers an EmptyError to the Observer's `error`
- * callback if the Observable completes before any `next` notification was sent.
- * @param {Function} predicate - A predicate function to evaluate items emitted by the source Observable.
- * @return {Observable<T>} An Observable that emits the single item emitted by the source Observable that matches
- * the predicate or `undefined` when no items match.
- *
- * @method single
- * @owner Observable
- */
-export function single<T>(predicate?: (value: T, index: number, source: Observable<T>) => boolean): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new SingleOperator(predicate, source));
-}
-
-class SingleOperator<T> implements Operator<T, T> {
-  constructor(private predicate?: (value: T, index: number, source: Observable<T>) => boolean,
-              private source?: Observable<T>) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class SingleSubscriber<T> extends Subscriber<T> {
-  private seenValue: boolean = false;
-  private singleValue: T;
-  private index: number = 0;
-
-  constructor(destination: Observer<T>,
-              private predicate?: (value: T, index: number, source: Observable<T>) => boolean,
-              private source?: Observable<T>) {
-    super(destination);
-  }
-
-  private applySingleValue(value: T): void {
-    if (this.seenValue) {
-      this.destination.error('Sequence contains more than one element');
-    } else {
-      this.seenValue = true;
-      this.singleValue = value;
-    }
-  }
-
-  protected _next(value: T): void {
-    const index = this.index++;
-
-    if (this.predicate) {
-      this.tryNext(value, index);
-    } else {
-      this.applySingleValue(value);
-    }
-  }
-
-  private tryNext(value: T, index: number): void {
-    try {
-      if (this.predicate(value, index, this.source)) {
-        this.applySingleValue(value);
-      }
-    } catch (err) {
-      this.destination.error(err);
-    }
-  }
-
-  protected _complete(): void {
-    const destination = this.destination;
-
-    if (this.index > 0) {
-      destination.next(this.seenValue ? this.singleValue : undefined);
-      destination.complete();
-    } else {
-      destination.error(new EmptyError);
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/skip.ts b/node_modules/rxjs/src/internal/operators/skip.ts
deleted file mode 100644
index b5b7f2a..0000000
--- a/node_modules/rxjs/src/internal/operators/skip.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Returns an Observable that skips the first `count` items emitted by the source Observable.
- *
- * ![](skip.png)
- *
- * @param {Number} count - The number of times, items emitted by source Observable should be skipped.
- * @return {Observable} An Observable that skips values emitted by the source Observable.
- *
- * @method skip
- * @owner Observable
- */
-export function skip<T>(count: number): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new SkipOperator(count));
-}
-
-class SkipOperator<T> implements Operator<T, T> {
-  constructor(private total: number) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new SkipSubscriber(subscriber, this.total));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class SkipSubscriber<T> extends Subscriber<T> {
-  count: number = 0;
-
-  constructor(destination: Subscriber<T>, private total: number) {
-    super(destination);
-  }
-
-  protected _next(x: T) {
-    if (++this.count > this.total) {
-      this.destination.next(x);
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/skipLast.ts b/node_modules/rxjs/src/internal/operators/skipLast.ts
deleted file mode 100644
index 60b6087..0000000
--- a/node_modules/rxjs/src/internal/operators/skipLast.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Skip the last `count` values emitted by the source Observable.
- *
- * ![](skipLast.png)
- *
- * `skipLast` returns an Observable that accumulates a queue with a length
- * enough to store the first `count` values. As more values are received,
- * values are taken from the front of the queue and produced on the result
- * sequence. This causes values to be delayed.
- *
- * ## Example
- * Skip the last 2 values of an Observable with many values
- * ```ts
- * import { range } from 'rxjs';
- * import { skipLast } from 'rxjs/operators';
- *
- * const many = range(1, 5);
- * const skipLastTwo = many.pipe(skipLast(2));
- * skipLastTwo.subscribe(x => console.log(x));
- *
- * // Results in:
- * // 1 2 3
- * ```
- *
- * @see {@link skip}
- * @see {@link skipUntil}
- * @see {@link skipWhile}
- * @see {@link take}
- *
- * @throws {ArgumentOutOfRangeError} When using `skipLast(i)`, it throws
- * ArgumentOutOrRangeError if `i < 0`.
- *
- * @param {number} count Number of elements to skip from the end of the source Observable.
- * @returns {Observable<T>} An Observable that skips the last count values
- * emitted by the source Observable.
- * @method skipLast
- * @owner Observable
- */
-export function skipLast<T>(count: number): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new SkipLastOperator(count));
-}
-
-class SkipLastOperator<T> implements Operator<T, T> {
-  constructor(private _skipCount: number) {
-    if (this._skipCount < 0) {
-      throw new ArgumentOutOfRangeError;
-    }
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    if (this._skipCount === 0) {
-      // If we don't want to skip any values then just subscribe
-      // to Subscriber without any further logic.
-      return source.subscribe(new Subscriber(subscriber));
-    } else {
-      return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount));
-    }
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class SkipLastSubscriber<T> extends Subscriber<T> {
-  private _ring: T[];
-  private _count: number = 0;
-
-  constructor(destination: Subscriber<T>, private _skipCount: number) {
-    super(destination);
-    this._ring = new Array<T>(_skipCount);
-  }
-
-  protected _next(value: T): void {
-    const skipCount = this._skipCount;
-    const count = this._count++;
-
-    if (count < skipCount) {
-      this._ring[count] = value;
-    } else {
-      const currentIndex = count % skipCount;
-      const ring = this._ring;
-      const oldValue = ring[currentIndex];
-
-      ring[currentIndex] = value;
-      this.destination.next(oldValue);
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/skipUntil.ts b/node_modules/rxjs/src/internal/operators/skipUntil.ts
deleted file mode 100644
index 8310adc..0000000
--- a/node_modules/rxjs/src/internal/operators/skipUntil.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { MonoTypeOperatorFunction, TeardownLogic, ObservableInput } from '../types';
-import { Subscription } from '../Subscription';
-
-/**
- * Returns an Observable that skips items emitted by the source Observable until a second Observable emits an item.
- *
- * The `skipUntil` operator causes the observable stream to skip the emission of values ​​until the passed in observable emits the first value.
- * This can be particularly useful in combination with user interactions, responses of http requests or waiting for specific times to pass by.
- *
- * ![](skipUntil.png)
- *
- * Internally the `skipUntil` operator subscribes to the passed in observable (in the following called *notifier*) in order to recognize the emission
- * of its first value. When this happens, the operator unsubscribes from the *notifier* and starts emitting the values of the *source*
- * observable. It will never let the *source* observable emit any values if the *notifier* completes or throws an error without emitting
- * a value before.
- *
- * ## Example
- *
- * In the following example, all emitted values ​​of the interval observable are skipped until the user clicks anywhere within the page.
- *
- * ```ts
- * import { interval, fromEvent } from 'rxjs';
- * import { skipUntil } from 'rxjs/operators';
- *
- * const intervalObservable = interval(1000);
- * const click = fromEvent(document, 'click');
- *
- * const emitAfterClick = intervalObservable.pipe(
- *   skipUntil(click)
- * );
- * // clicked at 4.6s. output: 5...6...7...8........ or
- * // clicked at 7.3s. output: 8...9...10..11.......
- * const subscribe = emitAfterClick.subscribe(value => console.log(value));
- * ```
- *
- * @param {Observable} notifier - The second Observable that has to emit an item before the source Observable's elements begin to
- * be mirrored by the resulting Observable.
- * @return {Observable<T>} An Observable that skips items from the source Observable until the second Observable emits
- * an item, then emits the remaining items.
- * @method skipUntil
- * @owner Observable
- */
-export function skipUntil<T>(notifier: Observable<any>): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new SkipUntilOperator(notifier));
-}
-
-class SkipUntilOperator<T> implements Operator<T, T> {
-  constructor(private notifier: Observable<any>) {
-  }
-
-  call(destination: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new SkipUntilSubscriber(destination, this.notifier));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class SkipUntilSubscriber<T, R> extends OuterSubscriber<T, R> {
-
-  private hasValue: boolean = false;
-  private innerSubscription: Subscription;
-
-  constructor(destination: Subscriber<R>, notifier: ObservableInput<any>) {
-    super(destination);
-    const innerSubscriber = new InnerSubscriber(this, undefined, undefined);
-    this.add(innerSubscriber);
-    this.innerSubscription = innerSubscriber;
-    const innerSubscription = subscribeToResult(this, notifier, undefined, undefined, innerSubscriber);
-    // The returned subscription will usually be the subscriber that was
-    // passed. However, interop subscribers will be wrapped and for
-    // unsubscriptions to chain correctly, the wrapper needs to be added, too.
-    if (innerSubscription !== innerSubscriber) {
-      this.add(innerSubscription);
-      this.innerSubscription = innerSubscription;
-    }
-  }
-
-  protected _next(value: T) {
-    if (this.hasValue) {
-      super._next(value);
-    }
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this.hasValue = true;
-    if (this.innerSubscription) {
-      this.innerSubscription.unsubscribe();
-    }
-  }
-
-  notifyComplete() {
-    /* do nothing */
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/skipWhile.ts b/node_modules/rxjs/src/internal/operators/skipWhile.ts
deleted file mode 100644
index 5647f13..0000000
--- a/node_modules/rxjs/src/internal/operators/skipWhile.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Returns an Observable that skips all items emitted by the source Observable as long as a specified condition holds
- * true, but emits all further source items as soon as the condition becomes false.
- *
- * ![](skipWhile.png)
- *
- * @param {Function} predicate - A function to test each item emitted from the source Observable.
- * @return {Observable<T>} An Observable that begins emitting items emitted by the source Observable when the
- * specified predicate becomes false.
- * @method skipWhile
- * @owner Observable
- */
-export function skipWhile<T>(predicate: (value: T, index: number) => boolean): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new SkipWhileOperator(predicate));
-}
-
-class SkipWhileOperator<T> implements Operator<T, T> {
-  constructor(private predicate: (value: T, index: number) => boolean) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class SkipWhileSubscriber<T> extends Subscriber<T> {
-  private skipping: boolean = true;
-  private index: number = 0;
-
-  constructor(destination: Subscriber<T>,
-              private predicate: (value: T, index: number) => boolean) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    const destination = this.destination;
-    if (this.skipping) {
-      this.tryCallPredicate(value);
-    }
-
-    if (!this.skipping) {
-      destination.next(value);
-    }
-  }
-
-  private tryCallPredicate(value: T): void {
-    try {
-      const result = this.predicate(value, this.index++);
-      this.skipping = Boolean(result);
-    } catch (err) {
-      this.destination.error(err);
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/startWith.ts b/node_modules/rxjs/src/internal/operators/startWith.ts
deleted file mode 100644
index 81ce063..0000000
--- a/node_modules/rxjs/src/internal/operators/startWith.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import { Observable } from '../Observable';
-import { concat } from '../observable/concat';
-import { isScheduler } from '../util/isScheduler';
-import { MonoTypeOperatorFunction, OperatorFunction, SchedulerLike } from '../types';
-
-/* tslint:disable:max-line-length */
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export function startWith<T>(scheduler: SchedulerLike): MonoTypeOperatorFunction<T>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export function startWith<T, D>(v1: D, scheduler: SchedulerLike): OperatorFunction<T, T | D>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export function startWith<T, D, E>(v1: D, v2: E, scheduler: SchedulerLike): OperatorFunction<T, T | D | E>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export function startWith<T, D, E, F>(v1: D, v2: E, v3: F, scheduler: SchedulerLike): OperatorFunction<T, T | D | E | F>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export function startWith<T, D, E, F, G>(v1: D, v2:  E, v3: F, v4: G, scheduler: SchedulerLike): OperatorFunction<T, T | D | E | F | G>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export function startWith<T, D, E, F, G, H>(v1: D, v2: E, v3: F, v4: G, v5: H, scheduler: SchedulerLike): OperatorFunction<T, T | D | E | F | G | H>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export function startWith<T, D, E, F, G, H, I>(v1: D, v2: E, v3: F, v4: G, v5: H, v6: I, scheduler: SchedulerLike): OperatorFunction<T, T | D | E | F | G | H | I>;
-
-export function startWith<T, D>(v1: D): OperatorFunction<T, T | D>;
-export function startWith<T, D, E>(v1: D, v2: E): OperatorFunction<T, T | D | E>;
-export function startWith<T, D, E, F>(v1: D, v2: E, v3: F): OperatorFunction<T, T | D | E | F>;
-export function startWith<T, D, E, F, G>(v1: D, v2:  E, v3: F, v4: G): OperatorFunction<T, T | D | E | F | G>;
-export function startWith<T, D, E, F, G, H>(v1: D, v2: E, v3: F, v4: G, v5: H): OperatorFunction<T, T | D | E | F | G | H>;
-export function startWith<T, D, E, F, G, H, I>(v1: D, v2: E, v3: F, v4: G, v5: H, v6: I): OperatorFunction<T, T | D | E | F | G | H | I>;
-export function startWith<T, D = T>(...array: D[]): OperatorFunction<T, T | D>;
-/** @deprecated use {@link scheduled} and {@link concatAll} (e.g. `scheduled([[a, b, c], source], scheduler).pipe(concatAll())`) */
-export function startWith<T, D = T>(...array: Array<D | SchedulerLike>): OperatorFunction<T, T | D>;
-/* tslint:enable:max-line-length */
-
-/**
- * Returns an Observable that emits the items you specify as arguments before it begins to emit
- * items emitted by the source Observable.
- *
- * <span class="informal">First emits its arguments in order, and then any
- * emissions from the source.</span>
- *
- * ![](startWith.png)
- *
- * ## Examples
- *
- * Start the chain of emissions with `"first"`, `"second"`
- *
- * ```ts
- * import { of } from 'rxjs';
- * import { startWith } from 'rxjs/operators';
- *
- * of("from source")
- *   .pipe(startWith("first", "second"))
- *   .subscribe(x => console.log(x));
- *
- * // results:
- * //   "first"
- * //   "second"
- * //   "from source"
- * ```
- *
- * @param {...T} values - Items you want the modified Observable to emit first.
- * @param {SchedulerLike} [scheduler] - A {@link SchedulerLike} to use for scheduling
- * the emissions of the `next` notifications.
- * @return {Observable} An Observable that emits the items in the specified Iterable and then emits the items
- * emitted by the source Observable.
- * @method startWith
- * @owner Observable
- */
-export function startWith<T, D>(...array: Array<T | SchedulerLike>): OperatorFunction<T, T | D> {
-  const scheduler = array[array.length - 1] as SchedulerLike;
-  if (isScheduler(scheduler)) {
-    // deprecated path
-    array.pop();
-    return (source: Observable<T>) => concat(array as T[], source, scheduler);
-  } else {
-    return (source: Observable<T>) => concat(array as T[], source);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/subscribeOn.ts b/node_modules/rxjs/src/internal/operators/subscribeOn.ts
deleted file mode 100644
index 3c5a4c1..0000000
--- a/node_modules/rxjs/src/internal/operators/subscribeOn.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { SubscribeOnObservable } from '../observable/SubscribeOnObservable';
-import { MonoTypeOperatorFunction, SchedulerLike, TeardownLogic } from '../types';
-
-/**
- * Asynchronously subscribes Observers to this Observable on the specified {@link SchedulerLike}.
- *
- * With `subscribeOn` you can decide what type of scheduler a specific Observable will be using when it is subscribed to.
- *
- * Schedulers control the speed and order of emissions to observers from an Observable stream.
- *
- * ![](subscribeOn.png)
- *
- * ## Example
- * Given the following code:
- * ```javascript
- * import { of, merge } from 'rxjs';
- *
- * const a = of(1, 2, 3, 4);
- * const b = of(5, 6, 7, 8, 9);
- * merge(a, b).subscribe(console.log);
- * ```
- *
- * Both Observable `a` and `b` will emit their values directly and synchronously once they are subscribed to.
- * This will result in the output of `1 2 3 4 5 6 7 8 9`.
- *
- * But if we instead us the `subscribeOn` operator declaring that we want to use the {@link asyncScheduler} for values emited by Observable `a`:
- * ```javascript
- * import { of, merge, asyncScheduler } from 'rxjs';
- * import { subscribeOn } from 'rxjs/operators';
- *
- * const a = of(1, 2, 3, 4).pipe(subscribeOn(asyncScheduler));
- * const b = of(5, 6, 7, 8, 9);
- * merge(a, b).subscribe(console.log);
- * ```
- *
- * The output will instead be `5 6 7 8 9 1 2 3 4`.
- * The reason for this is that Observable `b` emits its values directly and synchronously like before
- * but the emissions from `a` are scheduled on the event loop because we are now using the {@link asyncScheduler} for that specific Observable.
- *
- * @param {SchedulerLike} scheduler - The {@link SchedulerLike} to perform subscription actions on.
- * @return {Observable<T>} The source Observable modified so that its subscriptions happen on the specified {@link SchedulerLike}.
- .
- * @method subscribeOn
- * @owner Observable
- */
-export function subscribeOn<T>(scheduler: SchedulerLike, delay: number = 0): MonoTypeOperatorFunction<T> {
-  return function subscribeOnOperatorFunction(source: Observable<T>): Observable<T> {
-    return source.lift(new SubscribeOnOperator<T>(scheduler, delay));
-  };
-}
-
-class SubscribeOnOperator<T> implements Operator<T, T> {
-  constructor(private scheduler: SchedulerLike,
-              private delay: number) {
-  }
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return new SubscribeOnObservable<T>(
-      source, this.delay, this.scheduler
-    ).subscribe(subscriber);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/switchAll.ts b/node_modules/rxjs/src/internal/operators/switchAll.ts
deleted file mode 100644
index 5fd82a4..0000000
--- a/node_modules/rxjs/src/internal/operators/switchAll.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import {OperatorFunction, ObservableInput} from '../types';
-import { switchMap } from './switchMap';
-import { identity } from '../util/identity';
-
-export function switchAll<T>(): OperatorFunction<ObservableInput<T>, T>;
-export function switchAll<R>(): OperatorFunction<any, R>;
-
-/**
- * Converts a higher-order Observable into a first-order Observable
- * producing values only from the most recent observable sequence
- *
- * <span class="informal">Flattens an Observable-of-Observables.</span>
- *
- * ![](switchAll.png)
- *
- * `switchAll` subscribes to a source that is an observable of observables, also known as a
- * "higher-order observable" (or `Observable<Observable<T>>`). It subscribes to the most recently
- * provided "inner observable" emitted by the source, unsubscribing from any previously subscribed
- * to inner observable, such that only the most recent inner observable may be subscribed to at
- * any point in time. The resulting observable returned by `switchAll` will only complete if the
- * source observable completes, *and* any currently subscribed to inner observable also has completed,
- * if there are any.
- *
- * ## Examples
- * Spawn a new interval observable for each click event, but for every new
- * click, cancel the previous interval and subscribe to the new one.
- *
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { switchAll, map, tap } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click').pipe(tap(() => console.log('click')));
- * const source = clicks.pipe(map((ev) => interval(1000)));
- *
- * source.pipe(
- *   switchAll()
- * ).subscribe(x => console.log(x));
- *
- /* Output
- *  click
- *  1
- *  2
- *  3
- *  4
- *  ...
- *  click
- *  1
- *  2
- *  3
- *  ...
- *  click
- *  ...
- * ```
- *
- * @see {@link combineAll}
- * @see {@link concatAll}
- * @see {@link exhaust}
- * @see {@link switchMap}
- * @see {@link switchMapTo}
- * @see {@link mergeAll}
- */
-
-export function switchAll<T>(): OperatorFunction<ObservableInput<T>, T> {
-  return switchMap(identity);
-}
diff --git a/node_modules/rxjs/src/internal/operators/switchMap.ts b/node_modules/rxjs/src/internal/operators/switchMap.ts
deleted file mode 100644
index c3c831a..0000000
--- a/node_modules/rxjs/src/internal/operators/switchMap.ts
+++ /dev/null
@@ -1,174 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-import { map } from './map';
-import { from } from '../observable/from';
-
-/* tslint:disable:max-line-length */
-export function switchMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector is no longer supported, use inner map instead */
-export function switchMap<T, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: undefined): OperatorFunction<T, ObservedValueOf<O>>;
-/** @deprecated resultSelector is no longer supported, use inner map instead */
-export function switchMap<T, R, O extends ObservableInput<any>>(project: (value: T, index: number) => O, resultSelector: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Projects each source value to an Observable which is merged in the output
- * Observable, emitting values only from the most recently projected Observable.
- *
- * <span class="informal">Maps each value to an Observable, then flattens all of
- * these inner Observables.</span>
- *
- * ![](switchMap.png)
- *
- * Returns an Observable that emits items based on applying a function that you
- * supply to each item emitted by the source Observable, where that function
- * returns an (so-called "inner") Observable. Each time it observes one of these
- * inner Observables, the output Observable begins emitting the items emitted by
- * that inner Observable. When a new inner Observable is emitted, `switchMap`
- * stops emitting items from the earlier-emitted inner Observable and begins
- * emitting items from the new one. It continues to behave like this for
- * subsequent inner Observables.
- *
- * ## Example
- * Generate new Observable according to source Observable values
- * ```typescript
- * import { of } from 'rxjs';
- * import { switchMap } from 'rxjs/operators';
- *
- * const switched = of(1, 2, 3).pipe(switchMap((x: number) => of(x, x ** 2, x ** 3)));
- * switched.subscribe(x => console.log(x));
- * // outputs
- * // 1
- * // 1
- * // 1
- * // 2
- * // 4
- * // 8
- * // ... and so on
- * ```
- *
- * Rerun an interval Observable on every click event
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { switchMap } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(switchMap((ev) => interval(1000)));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link concatMap}
- * @see {@link exhaustMap}
- * @see {@link mergeMap}
- * @see {@link switchAll}
- * @see {@link switchMapTo}
- *
- * @param {function(value: T, ?index: number): ObservableInput} project A function
- * that, when applied to an item emitted by the source Observable, returns an
- * Observable.
- * @return {Observable} An Observable that emits the result of applying the
- * projection function (and the optional deprecated `resultSelector`) to each item
- * emitted by the source Observable and taking only the values from the most recently
- * projected inner Observable.
- * @method switchMap
- * @owner Observable
- */
-export function switchMap<T, R, O extends ObservableInput<any>>(
-  project: (value: T, index: number) => O,
-  resultSelector?: (outerValue: T, innerValue: ObservedValueOf<O>, outerIndex: number, innerIndex: number) => R,
-): OperatorFunction<T, ObservedValueOf<O>|R> {
-  if (typeof resultSelector === 'function') {
-    return (source: Observable<T>) => source.pipe(
-      switchMap((a, i) => from(project(a, i)).pipe(
-        map((b, ii) => resultSelector(a, b, i, ii))
-      ))
-    );
-  }
-  return (source: Observable<T>) => source.lift(new SwitchMapOperator(project));
-}
-
-class SwitchMapOperator<T, R> implements Operator<T, R> {
-  constructor(private project: (value: T, index: number) => ObservableInput<R>) {
-  }
-
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class SwitchMapSubscriber<T, R> extends OuterSubscriber<T, R> {
-  private index: number = 0;
-  private innerSubscription: Subscription;
-
-  constructor(destination: Subscriber<R>,
-              private project: (value: T, index: number) => ObservableInput<R>) {
-    super(destination);
-  }
-
-  protected _next(value: T) {
-    let result: ObservableInput<R>;
-    const index = this.index++;
-    try {
-      result = this.project(value, index);
-    } catch (error) {
-      this.destination.error(error);
-      return;
-    }
-    this._innerSub(result, value, index);
-  }
-
-  private _innerSub(result: ObservableInput<R>, value: T, index: number) {
-    const innerSubscription = this.innerSubscription;
-    if (innerSubscription) {
-      innerSubscription.unsubscribe();
-    }
-    const innerSubscriber = new InnerSubscriber(this, value, index);
-    const destination = this.destination as Subscription;
-    destination.add(innerSubscriber);
-    this.innerSubscription = subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-    // The returned subscription will usually be the subscriber that was
-    // passed. However, interop subscribers will be wrapped and for
-    // unsubscriptions to chain correctly, the wrapper needs to be added, too.
-    if (this.innerSubscription !== innerSubscriber) {
-      destination.add(this.innerSubscription);
-    }
-  }
-
-  protected _complete(): void {
-    const {innerSubscription} = this;
-    if (!innerSubscription || innerSubscription.closed) {
-      super._complete();
-    }
-    this.unsubscribe();
-  }
-
-  protected _unsubscribe() {
-    this.innerSubscription = null;
-  }
-
-  notifyComplete(innerSub: Subscription): void {
-    const destination = this.destination as Subscription;
-    destination.remove(innerSub);
-    this.innerSubscription = null;
-    if (this.isStopped) {
-      super._complete();
-    }
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-      this.destination.next(innerValue);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/switchMapTo.ts b/node_modules/rxjs/src/internal/operators/switchMapTo.ts
deleted file mode 100644
index 8442474..0000000
--- a/node_modules/rxjs/src/internal/operators/switchMapTo.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { ObservableInput, OperatorFunction } from '../types';
-import { switchMap } from './switchMap';
-
-/* tslint:disable:max-line-length */
-export function switchMapTo<R>(observable: ObservableInput<R>): OperatorFunction<any, R>;
-/** @deprecated resultSelector is no longer supported. Switch to using switchMap with an inner map */
-export function switchMapTo<T, R>(observable: ObservableInput<R>, resultSelector: undefined): OperatorFunction<T, R>;
-/** @deprecated resultSelector is no longer supported. Switch to using switchMap with an inner map */
-export function switchMapTo<T, I, R>(observable: ObservableInput<I>, resultSelector: (outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * Projects each source value to the same Observable which is flattened multiple
- * times with {@link switchMap} in the output Observable.
- *
- * <span class="informal">It's like {@link switchMap}, but maps each value
- * always to the same inner Observable.</span>
- *
- * ![](switchMapTo.png)
- *
- * Maps each source value to the given Observable `innerObservable` regardless
- * of the source value, and then flattens those resulting Observables into one
- * single Observable, which is the output Observable. The output Observables
- * emits values only from the most recently emitted instance of
- * `innerObservable`.
- *
- * ## Example
- * Rerun an interval Observable on every click event
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { switchMapTo } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(switchMapTo(interval(1000)));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link concatMapTo}
- * @see {@link switchAll}
- * @see {@link switchMap}
- * @see {@link mergeMapTo}
- *
- * @param {ObservableInput} innerObservable An Observable to replace each value from
- * the source Observable.
- * @return {Observable} An Observable that emits items from the given
- * `innerObservable` (and optionally transformed through the deprecated `resultSelector`)
- * every time a value is emitted on the source Observable, and taking only the values
- * from the most recently projected inner Observable.
- * @method switchMapTo
- * @owner Observable
- */
-export function switchMapTo<T, I, R>(
-  innerObservable: ObservableInput<I>,
-  resultSelector?: (outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R
-): OperatorFunction<T, I|R> {
-  return resultSelector ? switchMap(() => innerObservable, resultSelector) : switchMap(() => innerObservable);
-}
diff --git a/node_modules/rxjs/src/internal/operators/take.ts b/node_modules/rxjs/src/internal/operators/take.ts
deleted file mode 100644
index b43205c..0000000
--- a/node_modules/rxjs/src/internal/operators/take.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
-import { empty } from '../observable/empty';
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Emits only the first `count` values emitted by the source Observable.
- *
- * <span class="informal">Takes the first `count` values from the source, then
- * completes.</span>
- *
- * ![](take.png)
- *
- * `take` returns an Observable that emits only the first `count` values emitted
- * by the source Observable. If the source emits fewer than `count` values then
- * all of its values are emitted. After that, it completes, regardless if the
- * source completes.
- *
- * ## Example
- * Take the first 5 seconds of an infinite 1-second interval Observable
- * ```ts
- * import { interval } from 'rxjs';
- * import { take } from 'rxjs/operators';
- *
- * const intervalCount = interval(1000);
- * const takeFive = intervalCount.pipe(take(5));
- * takeFive.subscribe(x => console.log(x));
- *
- * // Logs:
- * // 0
- * // 1
- * // 2
- * // 3
- * // 4
- * ```
- *
- * @see {@link takeLast}
- * @see {@link takeUntil}
- * @see {@link takeWhile}
- * @see {@link skip}
- *
- * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an
- * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.
- *
- * @param {number} count The maximum number of `next` values to emit.
- * @return {Observable<T>} An Observable that emits only the first `count`
- * values emitted by the source Observable, or all of the values from the source
- * if the source emits fewer than `count` values.
- * @method take
- * @owner Observable
- */
-export function take<T>(count: number): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => {
-    if (count === 0) {
-      return empty();
-    } else {
-      return source.lift(new TakeOperator(count));
-    }
-  };
-}
-
-class TakeOperator<T> implements Operator<T, T> {
-  constructor(private total: number) {
-    if (this.total < 0) {
-      throw new ArgumentOutOfRangeError;
-    }
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new TakeSubscriber(subscriber, this.total));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class TakeSubscriber<T> extends Subscriber<T> {
-  private count: number = 0;
-
-  constructor(destination: Subscriber<T>, private total: number) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    const total = this.total;
-    const count = ++this.count;
-    if (count <= total) {
-      this.destination.next(value);
-      if (count === total) {
-        this.destination.complete();
-        this.unsubscribe();
-      }
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/takeLast.ts b/node_modules/rxjs/src/internal/operators/takeLast.ts
deleted file mode 100644
index 5d215f6..0000000
--- a/node_modules/rxjs/src/internal/operators/takeLast.ts
+++ /dev/null
@@ -1,114 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';
-import { empty } from '../observable/empty';
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Emits only the last `count` values emitted by the source Observable.
- *
- * <span class="informal">Remembers the latest `count` values, then emits those
- * only when the source completes.</span>
- *
- * ![](takeLast.png)
- *
- * `takeLast` returns an Observable that emits at most the last `count` values
- * emitted by the source Observable. If the source emits fewer than `count`
- * values then all of its values are emitted. This operator must wait until the
- * `complete` notification emission from the source in order to emit the `next`
- * values on the output Observable, because otherwise it is impossible to know
- * whether or not more values will be emitted on the source. For this reason,
- * all values are emitted synchronously, followed by the complete notification.
- *
- * ## Example
- * Take the last 3 values of an Observable with many values
- * ```ts
- * import { range } from 'rxjs';
- * import { takeLast } from 'rxjs/operators';
- *
- * const many = range(1, 100);
- * const lastThree = many.pipe(takeLast(3));
- * lastThree.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link take}
- * @see {@link takeUntil}
- * @see {@link takeWhile}
- * @see {@link skip}
- *
- * @throws {ArgumentOutOfRangeError} When using `takeLast(i)`, it delivers an
- * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.
- *
- * @param {number} count The maximum number of values to emit from the end of
- * the sequence of values emitted by the source Observable.
- * @return {Observable<T>} An Observable that emits at most the last count
- * values emitted by the source Observable.
- * @method takeLast
- * @owner Observable
- */
-export function takeLast<T>(count: number): MonoTypeOperatorFunction<T> {
-  return function takeLastOperatorFunction(source: Observable<T>): Observable<T> {
-    if (count === 0) {
-      return empty();
-    } else {
-      return source.lift(new TakeLastOperator(count));
-    }
-  };
-}
-
-class TakeLastOperator<T> implements Operator<T, T> {
-  constructor(private total: number) {
-    if (this.total < 0) {
-      throw new ArgumentOutOfRangeError;
-    }
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new TakeLastSubscriber(subscriber, this.total));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class TakeLastSubscriber<T> extends Subscriber<T> {
-  private ring: Array<T> = new Array();
-  private count: number = 0;
-
-  constructor(destination: Subscriber<T>, private total: number) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    const ring = this.ring;
-    const total = this.total;
-    const count = this.count++;
-
-    if (ring.length < total) {
-      ring.push(value);
-    } else {
-      const index = count % total;
-      ring[index] = value;
-    }
-  }
-
-  protected _complete(): void {
-    const destination = this.destination;
-    let count = this.count;
-
-    if (count > 0) {
-      const total = this.count >= this.total ? this.total : this.count;
-      const ring  = this.ring;
-
-      for (let i = 0; i < total; i++) {
-        const idx = (count++) % total;
-        destination.next(ring[idx]);
-      }
-    }
-
-    destination.complete();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/takeUntil.ts b/node_modules/rxjs/src/internal/operators/takeUntil.ts
deleted file mode 100644
index 84ea1c7..0000000
--- a/node_modules/rxjs/src/internal/operators/takeUntil.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-
-import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-/**
- * Emits the values emitted by the source Observable until a `notifier`
- * Observable emits a value.
- *
- * <span class="informal">Lets values pass until a second Observable,
- * `notifier`, emits a value. Then, it completes.</span>
- *
- * ![](takeUntil.png)
- *
- * `takeUntil` subscribes and begins mirroring the source Observable. It also
- * monitors a second Observable, `notifier` that you provide. If the `notifier`
- * emits a value, the output Observable stops mirroring the source Observable
- * and completes. If the `notifier` doesn't emit any value and completes
- * then `takeUntil` will pass all values.
- *
- * ## Example
- * Tick every second until the first click happens
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { takeUntil } from 'rxjs/operators';
- *
- * const source = interval(1000);
- * const clicks = fromEvent(document, 'click');
- * const result = source.pipe(takeUntil(clicks));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link take}
- * @see {@link takeLast}
- * @see {@link takeWhile}
- * @see {@link skip}
- *
- * @param {Observable} notifier The Observable whose first emitted value will
- * cause the output Observable of `takeUntil` to stop emitting values from the
- * source Observable.
- * @return {Observable<T>} An Observable that emits the values from the source
- * Observable until such time as `notifier` emits its first value.
- * @method takeUntil
- * @owner Observable
- */
-export function takeUntil<T>(notifier: Observable<any>): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new TakeUntilOperator(notifier));
-}
-
-class TakeUntilOperator<T> implements Operator<T, T> {
-  constructor(private notifier: Observable<any>) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    const takeUntilSubscriber = new TakeUntilSubscriber(subscriber);
-    const notifierSubscription = subscribeToResult(takeUntilSubscriber, this.notifier);
-    if (notifierSubscription && !takeUntilSubscriber.seenValue) {
-      takeUntilSubscriber.add(notifierSubscription);
-      return source.subscribe(takeUntilSubscriber);
-    }
-    return takeUntilSubscriber;
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class TakeUntilSubscriber<T, R> extends OuterSubscriber<T, R> {
-  seenValue = false;
-
-  constructor(destination: Subscriber<any>, ) {
-    super(destination);
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this.seenValue = true;
-    this.complete();
-  }
-
-  notifyComplete(): void {
-    // noop
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/takeWhile.ts b/node_modules/rxjs/src/internal/operators/takeWhile.ts
deleted file mode 100644
index 473169b..0000000
--- a/node_modules/rxjs/src/internal/operators/takeWhile.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { OperatorFunction, MonoTypeOperatorFunction, TeardownLogic } from '../types';
-
-export function takeWhile<T, S extends T>(predicate: (value: T, index: number) => value is S): OperatorFunction<T, S>;
-export function takeWhile<T, S extends T>(predicate: (value: T, index: number) => value is S, inclusive: false): OperatorFunction<T, S>;
-export function takeWhile<T>(predicate: (value: T, index: number) => boolean, inclusive?: boolean): MonoTypeOperatorFunction<T>;
-
-/**
- * Emits values emitted by the source Observable so long as each value satisfies
- * the given `predicate`, and then completes as soon as this `predicate` is not
- * satisfied.
- *
- * <span class="informal">Takes values from the source only while they pass the
- * condition given. When the first value does not satisfy, it completes.</span>
- *
- * ![](takeWhile.png)
- *
- * `takeWhile` subscribes and begins mirroring the source Observable. Each value
- * emitted on the source is given to the `predicate` function which returns a
- * boolean, representing a condition to be satisfied by the source values. The
- * output Observable emits the source values until such time as the `predicate`
- * returns false, at which point `takeWhile` stops mirroring the source
- * Observable and completes the output Observable.
- *
- * ## Example
- * Emit click events only while the clientX property is greater than 200
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { takeWhile } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(takeWhile(ev => ev.clientX > 200));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link take}
- * @see {@link takeLast}
- * @see {@link takeUntil}
- * @see {@link skip}
- *
- * @param {function(value: T, index: number): boolean} predicate A function that
- * evaluates a value emitted by the source Observable and returns a boolean.
- * Also takes the (zero-based) index as the second argument.
- * @param {boolean} inclusive When set to `true` the value that caused
- * `predicate` to return `false` will also be emitted.
- * @return {Observable<T>} An Observable that emits the values from the source
- * Observable so long as each value satisfies the condition defined by the
- * `predicate`, then completes.
- * @method takeWhile
- * @owner Observable
- */
-export function takeWhile<T>(
-    predicate: (value: T, index: number) => boolean,
-    inclusive = false): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) =>
-             source.lift(new TakeWhileOperator(predicate, inclusive));
-}
-
-class TakeWhileOperator<T> implements Operator<T, T> {
-  constructor(
-      private predicate: (value: T, index: number) => boolean,
-      private inclusive: boolean) {}
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(
-        new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class TakeWhileSubscriber<T> extends Subscriber<T> {
-  private index: number = 0;
-
-  constructor(
-      destination: Subscriber<T>,
-      private predicate: (value: T, index: number) => boolean,
-      private inclusive: boolean) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    const destination = this.destination;
-    let result: boolean;
-    try {
-      result = this.predicate(value, this.index++);
-    } catch (err) {
-      destination.error(err);
-      return;
-    }
-    this.nextOrComplete(value, result);
-  }
-
-  private nextOrComplete(value: T, predicateResult: boolean): void {
-    const destination = this.destination;
-    if (Boolean(predicateResult)) {
-      destination.next(value);
-    } else {
-      if (this.inclusive) {
-        destination.next(value);
-      }
-      destination.complete();
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/tap.ts b/node_modules/rxjs/src/internal/operators/tap.ts
deleted file mode 100644
index 57087a0..0000000
--- a/node_modules/rxjs/src/internal/operators/tap.ts
+++ /dev/null
@@ -1,147 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { MonoTypeOperatorFunction, PartialObserver, TeardownLogic } from '../types';
-import { noop } from '../util/noop';
-import { isFunction } from '../util/isFunction';
-
-/* tslint:disable:max-line-length */
-/** @deprecated Use an observer instead of a complete callback */
-export function tap<T>(next: null | undefined, error: null | undefined, complete: () => void): MonoTypeOperatorFunction<T>;
-/** @deprecated Use an observer instead of an error callback */
-export function tap<T>(next: null | undefined, error: (error: any) => void, complete?: () => void): MonoTypeOperatorFunction<T>;
-/** @deprecated Use an observer instead of a complete callback */
-export function tap<T>(next: (value: T) => void, error: null | undefined, complete: () => void): MonoTypeOperatorFunction<T>;
-export function tap<T>(next?: (x: T) => void, error?: (e: any) => void, complete?: () => void): MonoTypeOperatorFunction<T>;
-export function tap<T>(observer: PartialObserver<T>): MonoTypeOperatorFunction<T>;
-/* tslint:enable:max-line-length */
-
-/**
- * Perform a side effect for every emission on the source Observable, but return
- * an Observable that is identical to the source.
- *
- * <span class="informal">Intercepts each emission on the source and runs a
- * function, but returns an output which is identical to the source as long as errors don't occur.</span>
- *
- * ![](do.png)
- *
- * Returns a mirrored Observable of the source Observable, but modified so that
- * the provided Observer is called to perform a side effect for every value,
- * error, and completion emitted by the source. Any errors that are thrown in
- * the aforementioned Observer or handlers are safely sent down the error path
- * of the output Observable.
- *
- * This operator is useful for debugging your Observables for the correct values
- * or performing other side effects.
- *
- * Note: this is different to a `subscribe` on the Observable. If the Observable
- * returned by `tap` is not subscribed, the side effects specified by the
- * Observer will never happen. `tap` therefore simply spies on existing
- * execution, it does not trigger an execution to happen like `subscribe` does.
- *
- * ## Example
- * Map every click to the clientX position of that click, while also logging the click event
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { tap, map } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const positions = clicks.pipe(
- *   tap(ev => console.log(ev)),
- *   map(ev => ev.clientX),
- * );
- * positions.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link map}
- * @see {@link Observable#subscribe}
- *
- * @param {Observer|function} [nextOrObserver] A normal Observer object or a
- * callback for `next`.
- * @param {function} [error] Callback for errors in the source.
- * @param {function} [complete] Callback for the completion of the source.
- * @return {Observable} An Observable identical to the source, but runs the
- * specified Observer or callback(s) for each item.
- * @name tap
- */
-export function tap<T>(nextOrObserver?: PartialObserver<T> | ((x: T) => void),
-                       error?: (e: any) => void,
-                       complete?: () => void): MonoTypeOperatorFunction<T> {
-  return function tapOperatorFunction(source: Observable<T>): Observable<T> {
-    return source.lift(new DoOperator(nextOrObserver, error, complete));
-  };
-}
-
-class DoOperator<T> implements Operator<T, T> {
-  constructor(private nextOrObserver?: PartialObserver<T> | ((x: T) => void),
-              private error?: (e: any) => void,
-              private complete?: () => void) {
-  }
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-
-class TapSubscriber<T> extends Subscriber<T> {
-  private _context: any;
-
-  private _tapNext: ((value: T) => void) = noop;
-
-  private _tapError: ((err: any) => void) = noop;
-
-  private _tapComplete: (() => void) = noop;
-
-  constructor(destination: Subscriber<T>,
-              observerOrNext?: PartialObserver<T> | ((value: T) => void),
-              error?: (e?: any) => void,
-              complete?: () => void) {
-      super(destination);
-      this._tapError = error || noop;
-      this._tapComplete = complete || noop;
-      if (isFunction(observerOrNext)) {
-        this._context = this;
-        this._tapNext = observerOrNext;
-      } else if (observerOrNext) {
-        this._context = observerOrNext;
-        this._tapNext = observerOrNext.next || noop;
-        this._tapError = observerOrNext.error || noop;
-        this._tapComplete = observerOrNext.complete || noop;
-      }
-    }
-
-  _next(value: T) {
-    try {
-      this._tapNext.call(this._context, value);
-    } catch (err) {
-      this.destination.error(err);
-      return;
-    }
-    this.destination.next(value);
-  }
-
-  _error(err: any) {
-    try {
-      this._tapError.call(this._context, err);
-    } catch (err) {
-      this.destination.error(err);
-      return;
-    }
-    this.destination.error(err);
-  }
-
-  _complete() {
-    try {
-      this._tapComplete.call(this._context, );
-    } catch (err) {
-      this.destination.error(err);
-      return;
-    }
-    return this.destination.complete();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/throttle.ts b/node_modules/rxjs/src/internal/operators/throttle.ts
deleted file mode 100644
index e855ff0..0000000
--- a/node_modules/rxjs/src/internal/operators/throttle.ts
+++ /dev/null
@@ -1,163 +0,0 @@
-import { Operator } from '../Operator';
-import { Observable } from '../Observable';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-
-import { MonoTypeOperatorFunction, SubscribableOrPromise, TeardownLogic } from '../types';
-
-export interface ThrottleConfig {
-  leading?: boolean;
-  trailing?: boolean;
-}
-
-export const defaultThrottleConfig: ThrottleConfig = {
-  leading: true,
-  trailing: false
-};
-
-/**
- * Emits a value from the source Observable, then ignores subsequent source
- * values for a duration determined by another Observable, then repeats this
- * process.
- *
- * <span class="informal">It's like {@link throttleTime}, but the silencing
- * duration is determined by a second Observable.</span>
- *
- * ![](throttle.png)
- *
- * `throttle` emits the source Observable values on the output Observable
- * when its internal timer is disabled, and ignores source values when the timer
- * is enabled. Initially, the timer is disabled. As soon as the first source
- * value arrives, it is forwarded to the output Observable, and then the timer
- * is enabled by calling the `durationSelector` function with the source value,
- * which returns the "duration" Observable. When the duration Observable emits a
- * value or completes, the timer is disabled, and this process repeats for the
- * next source value.
- *
- * ## Example
- * Emit clicks at a rate of at most one click per second
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { throttle } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(throttle(ev => interval(1000)));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link audit}
- * @see {@link debounce}
- * @see {@link delayWhen}
- * @see {@link sample}
- * @see {@link throttleTime}
- *
- * @param {function(value: T): SubscribableOrPromise} durationSelector A function
- * that receives a value from the source Observable, for computing the silencing
- * duration for each source value, returned as an Observable or a Promise.
- * @param {Object} config a configuration object to define `leading` and `trailing` behavior. Defaults
- * to `{ leading: true, trailing: false }`.
- * @return {Observable<T>} An Observable that performs the throttle operation to
- * limit the rate of emissions from the source.
- * @method throttle
- * @owner Observable
- */
-export function throttle<T>(durationSelector: (value: T) => SubscribableOrPromise<any>,
-                            config: ThrottleConfig = defaultThrottleConfig): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing));
-}
-
-class ThrottleOperator<T> implements Operator<T, T> {
-  constructor(private durationSelector: (value: T) => SubscribableOrPromise<any>,
-              private leading: boolean,
-              private trailing: boolean) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(
-      new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing)
-    );
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc
- * @ignore
- * @extends {Ignored}
- */
-class ThrottleSubscriber<T, R> extends OuterSubscriber<T, R> {
-  private _throttled: Subscription;
-  private _sendValue: T;
-  private _hasValue = false;
-
-  constructor(protected destination: Subscriber<T>,
-              private durationSelector: (value: T) => SubscribableOrPromise<number>,
-              private _leading: boolean,
-              private _trailing: boolean) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    this._hasValue = true;
-    this._sendValue = value;
-
-    if (!this._throttled) {
-      if (this._leading) {
-        this.send();
-      } else {
-        this.throttle(value);
-      }
-    }
-  }
-
-  private send() {
-    const { _hasValue, _sendValue } = this;
-    if (_hasValue) {
-      this.destination.next(_sendValue);
-      this.throttle(_sendValue);
-    }
-    this._hasValue = false;
-    this._sendValue = null;
-  }
-
-  private throttle(value: T): void {
-    const duration = this.tryDurationSelector(value);
-    if (!!duration) {
-      this.add(this._throttled = subscribeToResult(this, duration));
-    }
-  }
-
-  private tryDurationSelector(value: T): SubscribableOrPromise<any> {
-    try {
-      return this.durationSelector(value);
-    } catch (err) {
-      this.destination.error(err);
-      return null;
-    }
-  }
-
-  private throttlingDone() {
-    const { _throttled, _trailing } = this;
-    if (_throttled) {
-      _throttled.unsubscribe();
-    }
-    this._throttled = null;
-
-    if (_trailing) {
-      this.send();
-    }
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this.throttlingDone();
-  }
-
-  notifyComplete(): void {
-    this.throttlingDone();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/throttleTime.ts b/node_modules/rxjs/src/internal/operators/throttleTime.ts
deleted file mode 100644
index baed778..0000000
--- a/node_modules/rxjs/src/internal/operators/throttleTime.ts
+++ /dev/null
@@ -1,174 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { async } from '../scheduler/async';
-import { Observable } from '../Observable';
-import { ThrottleConfig, defaultThrottleConfig } from './throttle';
-import { MonoTypeOperatorFunction, SchedulerLike, TeardownLogic } from '../types';
-
-/**
- * Emits a value from the source Observable, then ignores subsequent source
- * values for `duration` milliseconds, then repeats this process.
- *
- * <span class="informal">Lets a value pass, then ignores source values for the
- * next `duration` milliseconds.</span>
- *
- * ![](throttleTime.png)
- *
- * `throttleTime` emits the source Observable values on the output Observable
- * when its internal timer is disabled, and ignores source values when the timer
- * is enabled. Initially, the timer is disabled. As soon as the first source
- * value arrives, it is forwarded to the output Observable, and then the timer
- * is enabled. After `duration` milliseconds (or the time unit determined
- * internally by the optional `scheduler`) has passed, the timer is disabled,
- * and this process repeats for the next source value. Optionally takes a
- * {@link SchedulerLike} for managing timers.
- *
- * ## Examples
- *
- * #### Limit click rate
- *
- * Emit clicks at a rate of at most one click per second
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { throttleTime } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(throttleTime(1000));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * #### Double Click
- *
- * The following example only emits clicks which happen within a subsequent
- * delay of 400ms of the previous click. This for example can emulate a double
- * click. It makes use of the `trailing` parameter of the throttle configuration.
- *
- * ```ts
- * import { fromEvent, asyncScheduler } from 'rxjs';
- * import { throttleTime, withLatestFrom } from 'rxjs/operators';
- *
- * // defaultThottleConfig = { leading: true, trailing: false }
- * const throttleConfig = {
- *   leading: false,
- *   trailing: true
- * }
- *
- * const click = fromEvent(document, 'click');
- * const doubleClick = click.pipe(
- *   throttleTime(400, asyncScheduler, throttleConfig)
- * );
- *
- * doubleClick.subscribe((throttleValue: Event) => {
- *   console.log(`Double-clicked! Timestamp: ${throttleValue.timeStamp}`);
- * });
- * ```
- *
- * If you enable the `leading` parameter in this example, the output would be the primary click and
- * the double click, but restricts additional clicks within 400ms.
- *
- * @see {@link auditTime}
- * @see {@link debounceTime}
- * @see {@link delay}
- * @see {@link sampleTime}
- * @see {@link throttle}
- *
- * @param {number} duration Time to wait before emitting another value after
- * emitting the last value, measured in milliseconds or the time unit determined
- * internally by the optional `scheduler`.
- * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for
- * managing the timers that handle the throttling.
- * @param {Object} config a configuration object to define `leading` and
- * `trailing` behavior. Defaults to `{ leading: true, trailing: false }`.
- * @return {Observable<T>} An Observable that performs the throttle operation to
- * limit the rate of emissions from the source.
- * @method throttleTime
- * @owner Observable
- */
-export function throttleTime<T>(duration: number,
-                                scheduler: SchedulerLike = async,
-                                config: ThrottleConfig = defaultThrottleConfig): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing));
-}
-
-class ThrottleTimeOperator<T> implements Operator<T, T> {
-  constructor(private duration: number,
-              private scheduler: SchedulerLike,
-              private leading: boolean,
-              private trailing: boolean) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(
-      new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing)
-    );
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class ThrottleTimeSubscriber<T> extends Subscriber<T> {
-  private throttled: Subscription;
-  private _hasTrailingValue: boolean = false;
-  private _trailingValue: T = null;
-
-  constructor(destination: Subscriber<T>,
-              private duration: number,
-              private scheduler: SchedulerLike,
-              private leading: boolean,
-              private trailing: boolean) {
-    super(destination);
-  }
-
-  protected _next(value: T) {
-    if (this.throttled) {
-      if (this.trailing) {
-        this._trailingValue = value;
-        this._hasTrailingValue = true;
-      }
-    } else {
-      this.add(this.throttled = this.scheduler.schedule<DispatchArg<T>>(dispatchNext, this.duration, { subscriber: this }));
-      if (this.leading) {
-        this.destination.next(value);
-      } else if (this.trailing) {
-        this._trailingValue = value;
-        this._hasTrailingValue = true;
-      }
-    }
-  }
-
-  protected _complete() {
-    if (this._hasTrailingValue) {
-      this.destination.next(this._trailingValue);
-      this.destination.complete();
-    } else {
-      this.destination.complete();
-    }
-  }
-
-  clearThrottle() {
-    const throttled = this.throttled;
-    if (throttled) {
-      if (this.trailing && this._hasTrailingValue) {
-        this.destination.next(this._trailingValue);
-        this._trailingValue = null;
-        this._hasTrailingValue = false;
-      }
-      throttled.unsubscribe();
-      this.remove(throttled);
-      this.throttled = null;
-    }
-  }
-}
-
-interface DispatchArg<T> {
-  subscriber: ThrottleTimeSubscriber<T>;
-}
-
-function dispatchNext<T>(arg: DispatchArg<T>) {
-  const { subscriber } = arg;
-  subscriber.clearThrottle();
-}
diff --git a/node_modules/rxjs/src/internal/operators/throwIfEmpty.ts b/node_modules/rxjs/src/internal/operators/throwIfEmpty.ts
deleted file mode 100644
index 7f39c4e..0000000
--- a/node_modules/rxjs/src/internal/operators/throwIfEmpty.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { EmptyError } from '../util/EmptyError';
-import { Observable } from '../Observable';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { TeardownLogic, MonoTypeOperatorFunction } from '../types';
-
-/**
- * If the source observable completes without emitting a value, it will emit
- * an error. The error will be created at that time by the optional
- * `errorFactory` argument, otherwise, the error will be {@link EmptyError}.
- *
- * ![](throwIfEmpty.png)
- *
- * ## Example
- * ```ts
- * import { fromEvent, timer } from 'rxjs';
- * import { throwIfEmpty, takeUntil } from 'rxjs/operators';
- *
- * const click$ = fromEvent(document, 'click');
- *
- * click$.pipe(
- *   takeUntil(timer(1000)),
- *   throwIfEmpty(
- *     () => new Error('the document was not clicked within 1 second')
- *   ),
- * )
- * .subscribe({
- *   next() { console.log('The button was clicked'); },
- *   error(err) { console.error(err); }
- * });
- * ```
- *
- * @param errorFactory A factory function called to produce the
- * error to be thrown when the source observable completes without emitting a
- * value.
- */
-export function throwIfEmpty <T>(errorFactory: (() => any) = defaultErrorFactory): MonoTypeOperatorFunction<T> {
-  return (source: Observable<T>) => {
-    return source.lift(new ThrowIfEmptyOperator(errorFactory));
-  };
-}
-
-class ThrowIfEmptyOperator<T> implements Operator<T, T> {
-  constructor(private errorFactory: () => any) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory));
-  }
-}
-
-class ThrowIfEmptySubscriber<T> extends Subscriber<T> {
-  private hasValue: boolean = false;
-
-  constructor(destination: Subscriber<T>, private errorFactory: () => any) {
-    super(destination);
-  }
-
-  protected _next(value: T): void {
-    this.hasValue = true;
-    this.destination.next(value);
-  }
-
-  protected _complete() {
-    if (!this.hasValue) {
-      let err: any;
-      try {
-        err = this.errorFactory();
-      } catch (e) {
-        err = e;
-      }
-      this.destination.error(err);
-    } else {
-        return this.destination.complete();
-    }
-  }
-}
-
-function defaultErrorFactory() {
-  return new EmptyError();
-}
diff --git a/node_modules/rxjs/src/internal/operators/timeInterval.ts b/node_modules/rxjs/src/internal/operators/timeInterval.ts
deleted file mode 100644
index 02e77ce..0000000
--- a/node_modules/rxjs/src/internal/operators/timeInterval.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-
-import { Observable } from '../Observable';
-import { async } from '../scheduler/async';
-import { SchedulerLike, OperatorFunction } from '../types';
-import { scan } from './scan';
-import { defer } from '../observable/defer';
-import { map } from './map';
-
-/**
- *
- * Emits an object containing the current value, and the time that has
- * passed between emitting the current value and the previous value, which is
- * calculated by using the provided `scheduler`'s `now()` method to retrieve
- * the current time at each emission, then calculating the difference. The `scheduler`
- * defaults to {@link asyncScheduler}, so by default, the `interval` will be in
- * milliseconds.
- *
- * <span class="informal">Convert an Observable that emits items into one that
- * emits indications of the amount of time elapsed between those emissions.</span>
- *
- * ![](timeinterval.png)
- *
- * ## Examples
- * Emit inteval between current value with the last value
- *
- * ```ts
- * const seconds = interval(1000);
- *
- * seconds.pipe(timeInterval())
- * .subscribe(
- *     value => console.log(value),
- *     err => console.log(err),
- * );
- *
- * seconds.pipe(timeout(900))
- * .subscribe(
- *     value => console.log(value),
- *     err => console.log(err),
- * );
- *
- * // NOTE: The values will never be this precise,
- * // intervals created with `interval` or `setInterval`
- * // are non-deterministic.
- *
- * // {value: 0, interval: 1000}
- * // {value: 1, interval: 1000}
- * // {value: 2, interval: 1000}
- * ```
- *
- * @param {SchedulerLike} [scheduler] Scheduler used to get the current time.
- * @return {Observable<{ interval: number, value: T }>} Observable that emit infomation about value and interval
- * @method timeInterval
- */
-export function timeInterval<T>(scheduler: SchedulerLike = async): OperatorFunction<T, TimeInterval<T>> {
-  return (source: Observable<T>) => defer(() => {
-    return source.pipe(
-      // TODO(benlesh): correct these typings.
-      scan(
-        ({ current }, value) => ({ value, current: scheduler.now(), last: current }),
-        { current: scheduler.now(), value: undefined,  last: undefined }
-      ) as any,
-      map<any, TimeInterval<T>>(({ current, last, value }) => new TimeInterval(value, current - last)),
-    );
-  });
-}
-
-// TODO(benlesh): make this an interface, export the interface, but not the implemented class,
-// there's no reason users should be manually creating this type.
-
-/**
- * @deprecated exposed API, use as interface only.
- */
-export class TimeInterval<T> {
-  constructor(public value: T, public interval: number) {}
-}
diff --git a/node_modules/rxjs/src/internal/operators/timeout.ts b/node_modules/rxjs/src/internal/operators/timeout.ts
deleted file mode 100644
index b049e73..0000000
--- a/node_modules/rxjs/src/internal/operators/timeout.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import { async } from '../scheduler/async';
-import { isDate } from '../util/isDate';
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { TimeoutError } from '../util/TimeoutError';
-import { MonoTypeOperatorFunction, SchedulerAction, SchedulerLike, TeardownLogic } from '../types';
-import { timeoutWith } from './timeoutWith';
-import { throwError } from '../observable/throwError';
-
-/**
- *
- * Errors if Observable does not emit a value in given time span.
- *
- * <span class="informal">Timeouts on Observable that doesn't emit values fast enough.</span>
- *
- * ![](timeout.png)
- *
- * `timeout` operator accepts as an argument either a number or a Date.
- *
- * If number was provided, it returns an Observable that behaves like a source
- * Observable, unless there is a period of time where there is no value emitted.
- * So if you provide `100` as argument and first value comes after 50ms from
- * the moment of subscription, this value will be simply re-emitted by the resulting
- * Observable. If however after that 100ms passes without a second value being emitted,
- * stream will end with an error and source Observable will be unsubscribed.
- * These checks are performed throughout whole lifecycle of Observable - from the moment
- * it was subscribed to, until it completes or errors itself. Thus every value must be
- * emitted within specified period since previous value.
- *
- * If provided argument was Date, returned Observable behaves differently. It throws
- * if Observable did not complete before provided Date. This means that periods between
- * emission of particular values do not matter in this case. If Observable did not complete
- * before provided Date, source Observable will be unsubscribed. Other than that, resulting
- * stream behaves just as source Observable.
- *
- * `timeout` accepts also a Scheduler as a second parameter. It is used to schedule moment (or moments)
- * when returned Observable will check if source stream emitted value or completed.
- *
- * ## Examples
- * Check if ticks are emitted within certain timespan
- * ```ts
- * import { interval } from 'rxjs';
- * import { timeout } from 'rxjs/operators';
- *
- * const seconds = interval(1000);
- *
- * seconds.pipe(timeout(1100))      // Let's use bigger timespan to be safe,
- *                                  // since `interval` might fire a bit later then scheduled.
- * .subscribe(
- *     value => console.log(value), // Will emit numbers just as regular `interval` would.
- *     err => console.log(err),     // Will never be called.
- * );
- *
- * seconds.pipe(timeout(900))
- * .subscribe(
- *     value => console.log(value), // Will never be called.
- *     err => console.log(err),     // Will emit error before even first value is emitted,
- *                                  // since it did not arrive within 900ms period.
- * );
- * ```
- *
- * Use Date to check if Observable completed
- * ```ts
- * import { interval } from 'rxjs';
- * import { timeout } from 'rxjs/operators';
- *
- * const seconds = interval(1000);
- *
- * seconds.pipe(
- *   timeout(new Date("December 17, 2020 03:24:00")),
- * )
- * .subscribe(
- *     value => console.log(value), // Will emit values as regular `interval` would
- *                                  // until December 17, 2020 at 03:24:00.
- *     err => console.log(err)      // On December 17, 2020 at 03:24:00 it will emit an error,
- *                                  // since Observable did not complete by then.
- * );
- * ```
- * @see {@link timeoutWith}
- *
- * @param {number|Date} due Number specifying period within which Observable must emit values
- *                          or Date specifying before when Observable should complete
- * @param {SchedulerLike} [scheduler] Scheduler controlling when timeout checks occur.
- * @return {Observable<T>} Observable that mirrors behaviour of source, unless timeout checks fail.
- * @method timeout
- * @owner Observable
- */
-export function timeout<T>(due: number | Date,
-                           scheduler: SchedulerLike = async): MonoTypeOperatorFunction<T> {
-  return timeoutWith(due, throwError(new TimeoutError()), scheduler);
-}
diff --git a/node_modules/rxjs/src/internal/operators/timeoutWith.ts b/node_modules/rxjs/src/internal/operators/timeoutWith.ts
deleted file mode 100644
index 753b167..0000000
--- a/node_modules/rxjs/src/internal/operators/timeoutWith.ts
+++ /dev/null
@@ -1,144 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { async } from '../scheduler/async';
-import { Observable } from '../Observable';
-import { isDate } from '../util/isDate';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { ObservableInput, OperatorFunction, MonoTypeOperatorFunction, SchedulerAction, SchedulerLike, TeardownLogic } from '../types';
-
-/* tslint:disable:max-line-length */
-export function timeoutWith<T, R>(due: number | Date, withObservable: ObservableInput<R>, scheduler?: SchedulerLike): OperatorFunction<T, T | R>;
-/* tslint:enable:max-line-length */
-
-/**
- *
- * Errors if Observable does not emit a value in given time span, in case of which
- * subscribes to the second Observable.
- *
- * <span class="informal">It's a version of `timeout` operator that let's you specify fallback Observable.</span>
- *
- * ![](timeoutWith.png)
- *
- * `timeoutWith` is a variation of `timeout` operator. It behaves exactly the same,
- * still accepting as a first argument either a number or a Date, which control - respectively -
- * when values of source Observable should be emitted or when it should complete.
- *
- * The only difference is that it accepts a second, required parameter. This parameter
- * should be an Observable which will be subscribed when source Observable fails any timeout check.
- * So whenever regular `timeout` would emit an error, `timeoutWith` will instead start re-emitting
- * values from second Observable. Note that this fallback Observable is not checked for timeouts
- * itself, so it can emit values and complete at arbitrary points in time. From the moment of a second
- * subscription, Observable returned from `timeoutWith` simply mirrors fallback stream. When that
- * stream completes, it completes as well.
- *
- * Scheduler, which in case of `timeout` is provided as as second argument, can be still provided
- * here - as a third, optional parameter. It still is used to schedule timeout checks and -
- * as a consequence - when second Observable will be subscribed, since subscription happens
- * immediately after failing check.
- *
- * ## Example
- * Add fallback observable
- * ```ts
- * import { intrerval } from 'rxjs';
- * import { timeoutWith } from 'rxjs/operators';
- *
- * const seconds = interval(1000);
- * const minutes = interval(60 * 1000);
- *
- * seconds.pipe(timeoutWith(900, minutes))
- *   .subscribe(
- *     value => console.log(value), // After 900ms, will start emitting `minutes`,
- *                                  // since first value of `seconds` will not arrive fast enough.
- *     err => console.log(err),     // Would be called after 900ms in case of `timeout`,
- *                                  // but here will never be called.
- *   );
- * ```
- *
- * @param {number|Date} due Number specifying period within which Observable must emit values
- *                          or Date specifying before when Observable should complete
- * @param {Observable<T>} withObservable Observable which will be subscribed if source fails timeout check.
- * @param {SchedulerLike} [scheduler] Scheduler controlling when timeout checks occur.
- * @return {Observable<T>} Observable that mirrors behaviour of source or, when timeout check fails, of an Observable
- *                          passed as a second parameter.
- * @method timeoutWith
- * @owner Observable
- */
-export function timeoutWith<T, R>(due: number | Date,
-                                  withObservable: ObservableInput<R>,
-                                  scheduler: SchedulerLike = async): OperatorFunction<T, T | R> {
-  return (source: Observable<T>) => {
-    let absoluteTimeout = isDate(due);
-    let waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(<number>due);
-    return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));
-  };
-}
-
-class TimeoutWithOperator<T> implements Operator<T, T> {
-  constructor(private waitFor: number,
-              private absoluteTimeout: boolean,
-              private withObservable: ObservableInput<any>,
-              private scheduler: SchedulerLike) {
-  }
-
-  call(subscriber: Subscriber<T>, source: any): TeardownLogic {
-    return source.subscribe(new TimeoutWithSubscriber(
-      subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler
-    ));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class TimeoutWithSubscriber<T, R> extends OuterSubscriber<T, R> {
-
-  private action: SchedulerAction<TimeoutWithSubscriber<T, R>> = null;
-
-  constructor(destination: Subscriber<T>,
-              private absoluteTimeout: boolean,
-              private waitFor: number,
-              private withObservable: ObservableInput<any>,
-              private scheduler: SchedulerLike) {
-    super(destination);
-    this.scheduleTimeout();
-  }
-
-  private static dispatchTimeout<T, R>(subscriber: TimeoutWithSubscriber<T, R>): void {
-    const { withObservable } = subscriber;
-    (<any> subscriber)._unsubscribeAndRecycle();
-    subscriber.add(subscribeToResult(subscriber, withObservable));
-  }
-
-  private scheduleTimeout(): void {
-    const { action } = this;
-    if (action) {
-      // Recycle the action if we've already scheduled one. All the production
-      // Scheduler Actions mutate their state/delay time and return themeselves.
-      // VirtualActions are immutable, so they create and return a clone. In this
-      // case, we need to set the action reference to the most recent VirtualAction,
-      // to ensure that's the one we clone from next time.
-      this.action = (<SchedulerAction<TimeoutWithSubscriber<T, R>>> action.schedule(this, this.waitFor));
-    } else {
-      this.add(this.action = (<SchedulerAction<TimeoutWithSubscriber<T, R>>> this.scheduler.schedule<TimeoutWithSubscriber<T, R>>(
-        TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this
-      )));
-    }
-  }
-
-  protected _next(value: T): void {
-    if (!this.absoluteTimeout) {
-      this.scheduleTimeout();
-    }
-    super._next(value);
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _unsubscribe() {
-    this.action = null;
-    this.scheduler = null;
-    this.withObservable = null;
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/timestamp.ts b/node_modules/rxjs/src/internal/operators/timestamp.ts
deleted file mode 100644
index d4061c8..0000000
--- a/node_modules/rxjs/src/internal/operators/timestamp.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-
-import { async } from '../scheduler/async';
-import { OperatorFunction, SchedulerLike, Timestamp as TimestampInterface } from '../types';
-import { map } from './map';
-
-/**
- * Attaches a timestamp to each item emitted by an observable indicating when it was emitted
- *
- * The `timestamp` operator maps the *source* observable stream to an object of type
- * `{value: T, timestamp: R}`. The properties are generically typed. The `value` property contains the value
- * and type of the *source* observable. The `timestamp` is generated by the schedulers `now` function. By
- * default it uses the *async* scheduler which simply returns `Date.now()` (milliseconds since 1970/01/01
- * 00:00:00:000) and therefore is of type `number`.
- *
- * ![](timestamp.png)
- *
- * ## Example
- *
- * In this example there is a timestamp attached to the documents click event.
- *
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { timestamp } from 'rxjs/operators';
- *
- * const clickWithTimestamp = fromEvent(document, 'click').pipe(
- *   timestamp()
- * );
- *
- * // Emits data of type {value: MouseEvent, timestamp: number}
- * clickWithTimestamp.subscribe(data => {
- *   console.log(data);
- * });
- * ```
- *
- * @param scheduler
- * @return {Observable<Timestamp<any>>|WebSocketSubject<T>|Observable<T>}
- * @method timestamp
- * @owner Observable
- */
-export function timestamp<T>(scheduler: SchedulerLike = async): OperatorFunction<T, Timestamp<T>> {
-  return map((value: T) => new Timestamp(value, scheduler.now()));
-  // return (source: Observable<T>) => source.lift(new TimestampOperator(scheduler));
-}
-
-export class Timestamp<T> implements TimestampInterface<T> {
-  constructor(public value: T, public timestamp: number) {
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/toArray.ts b/node_modules/rxjs/src/internal/operators/toArray.ts
deleted file mode 100644
index 40d0560..0000000
--- a/node_modules/rxjs/src/internal/operators/toArray.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { reduce } from './reduce';
-import { OperatorFunction } from '../types';
-
-function toArrayReducer<T>(arr: T[], item: T, index: number) {
-  if (index === 0) {
-    return [item];
-  }
-  arr.push(item);
-  return arr;
-}
-
-/**
- * Collects all source emissions and emits them as an array when the source completes.
- *
- * <span class="informal">Get all values inside an array when the source completes</span>
- *
- * ![](toArray.png)
- *
- * `toArray` will wait until the source Observable completes before emitting
- * the array containing all emissions. When the source Observable errors no
- * array will be emitted.
- *
- *  ## Example
- * ```ts
- * import { interval } from 'rxjs';
- * import { toArray, take } from 'rxjs/operators';
- *
- * const source = interval(1000);
- * const example = source.pipe(
- *   take(10),
- *   toArray()
- * );
- *
- * const subscribe = example.subscribe(val => console.log(val));
- *
- * // output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- *
- * ```
-* @return An array from an observable sequence.
-* @method toArray
-* @owner Observable
-*/
-export function toArray<T>(): OperatorFunction<T, T[]> {
-  return reduce(toArrayReducer, [] as T[]);
-}
diff --git a/node_modules/rxjs/src/internal/operators/window.ts b/node_modules/rxjs/src/internal/operators/window.ts
deleted file mode 100644
index f373dbc..0000000
--- a/node_modules/rxjs/src/internal/operators/window.ts
+++ /dev/null
@@ -1,130 +0,0 @@
-import { Observable } from '../Observable';
-import { OperatorFunction } from '../types';
-import { Subject } from '../Subject';
-import { Subscriber } from '../Subscriber';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { Operator } from '../Operator';
-
-/**
- * Branch out the source Observable values as a nested Observable whenever
- * `windowBoundaries` emits.
- *
- * <span class="informal">It's like {@link buffer}, but emits a nested Observable
- * instead of an array.</span>
- *
- * ![](window.png)
- *
- * Returns an Observable that emits windows of items it collects from the source
- * Observable. The output Observable emits connected, non-overlapping
- * windows. It emits the current window and opens a new one whenever the
- * Observable `windowBoundaries` emits an item. Because each window is an
- * Observable, the output is a higher-order Observable.
- *
- * ## Example
- * In every window of 1 second each, emit at most 2 click events
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { window, mergeAll, map, take } from 'rxjs/operators';
- *
- *  const clicks = fromEvent(document, 'click');
- *  const sec = interval(1000);
- *  const result = clicks.pipe(
- *      window(sec),
- *      map(win => win.pipe(take(2))), // each window has at most 2 emissions
- *      mergeAll(),              // flatten the Observable-of-Observables
- *  );
- *  result.subscribe(x => console.log(x));
- * ```
- * @see {@link windowCount}
- * @see {@link windowTime}
- * @see {@link windowToggle}
- * @see {@link windowWhen}
- * @see {@link buffer}
- *
- * @param {Observable<any>} windowBoundaries An Observable that completes the
- * previous window and starts a new window.
- * @return {Observable<Observable<T>>} An Observable of windows, which are
- * Observables emitting values of the source Observable.
- * @method window
- * @owner Observable
- */
-export function window<T>(windowBoundaries: Observable<any>): OperatorFunction<T, Observable<T>> {
-  return function windowOperatorFunction(source: Observable<T>) {
-    return source.lift(new WindowOperator(windowBoundaries));
-  };
-}
-
-class WindowOperator<T> implements Operator<T, Observable<T>> {
-
-  constructor(private windowBoundaries: Observable<any>) {
-  }
-
-  call(subscriber: Subscriber<Observable<T>>, source: any): any {
-    const windowSubscriber = new WindowSubscriber(subscriber);
-    const sourceSubscription = source.subscribe(windowSubscriber);
-    if (!sourceSubscription.closed) {
-      windowSubscriber.add(subscribeToResult(windowSubscriber, this.windowBoundaries));
-    }
-    return sourceSubscription;
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class WindowSubscriber<T> extends OuterSubscriber<T, any> {
-
-  private window: Subject<T> = new Subject<T>();
-
-  constructor(destination: Subscriber<Observable<T>>) {
-    super(destination);
-    destination.next(this.window);
-  }
-
-  notifyNext(outerValue: T, innerValue: any,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, any>): void {
-    this.openWindow();
-  }
-
-  notifyError(error: any, innerSub: InnerSubscriber<T, any>): void {
-    this._error(error);
-  }
-
-  notifyComplete(innerSub: InnerSubscriber<T, any>): void {
-    this._complete();
-  }
-
-  protected _next(value: T): void {
-    this.window.next(value);
-  }
-
-  protected _error(err: any): void {
-    this.window.error(err);
-    this.destination.error(err);
-  }
-
-  protected _complete(): void {
-    this.window.complete();
-    this.destination.complete();
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _unsubscribe() {
-    this.window = null;
-  }
-
-  private openWindow(): void  {
-    const prevWindow = this.window;
-    if (prevWindow) {
-      prevWindow.complete();
-    }
-    const destination = this.destination;
-    const newWindow = this.window = new Subject<T>();
-    destination.next(newWindow);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/windowCount.ts b/node_modules/rxjs/src/internal/operators/windowCount.ts
deleted file mode 100644
index cccfd35..0000000
--- a/node_modules/rxjs/src/internal/operators/windowCount.ts
+++ /dev/null
@@ -1,149 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { Subject } from '../Subject';
-import { OperatorFunction } from '../types';
-
-/**
- * Branch out the source Observable values as a nested Observable with each
- * nested Observable emitting at most `windowSize` values.
- *
- * <span class="informal">It's like {@link bufferCount}, but emits a nested
- * Observable instead of an array.</span>
- *
- * ![](windowCount.png)
- *
- * Returns an Observable that emits windows of items it collects from the source
- * Observable. The output Observable emits windows every `startWindowEvery`
- * items, each containing no more than `windowSize` items. When the source
- * Observable completes or encounters an error, the output Observable emits
- * the current window and propagates the notification from the source
- * Observable. If `startWindowEvery` is not provided, then new windows are
- * started immediately at the start of the source and when each window completes
- * with size `windowSize`.
- *
- * ## Examples
- * Ignore every 3rd click event, starting from the first one
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { windowCount, map, mergeAll, skip } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   windowCount(3),
- *   map(win => win.pipe(skip(1))), // skip first of every 3 clicks
- *   mergeAll()                     // flatten the Observable-of-Observables
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * Ignore every 3rd click event, starting from the third one
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { windowCount, mergeAll } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   windowCount(2, 3),
- *   mergeAll(),              // flatten the Observable-of-Observables
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link window}
- * @see {@link windowTime}
- * @see {@link windowToggle}
- * @see {@link windowWhen}
- * @see {@link bufferCount}
- *
- * @param {number} windowSize The maximum number of values emitted by each
- * window.
- * @param {number} [startWindowEvery] Interval at which to start a new window.
- * For example if `startWindowEvery` is `2`, then a new window will be started
- * on every other value from the source. A new window is started at the
- * beginning of the source by default.
- * @return {Observable<Observable<T>>} An Observable of windows, which in turn
- * are Observable of values.
- * @method windowCount
- * @owner Observable
- */
-export function windowCount<T>(windowSize: number,
-                               startWindowEvery: number = 0): OperatorFunction<T, Observable<T>> {
-  return function windowCountOperatorFunction(source: Observable<T>) {
-    return source.lift(new WindowCountOperator<T>(windowSize, startWindowEvery));
-  };
-}
-
-class WindowCountOperator<T> implements Operator<T, Observable<T>> {
-
-  constructor(private windowSize: number,
-              private startWindowEvery: number) {
-  }
-
-  call(subscriber: Subscriber<Observable<T>>, source: any): any {
-    return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class WindowCountSubscriber<T> extends Subscriber<T> {
-  private windows: Subject<T>[] = [ new Subject<T>() ];
-  private count: number = 0;
-
-  constructor(protected destination: Subscriber<Observable<T>>,
-              private windowSize: number,
-              private startWindowEvery: number) {
-    super(destination);
-    destination.next(this.windows[0]);
-  }
-
-  protected _next(value: T) {
-    const startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;
-    const destination = this.destination;
-    const windowSize = this.windowSize;
-    const windows = this.windows;
-    const len = windows.length;
-
-    for (let i = 0; i < len && !this.closed; i++) {
-      windows[i].next(value);
-    }
-    const c = this.count - windowSize + 1;
-    if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {
-      windows.shift().complete();
-    }
-    if (++this.count % startWindowEvery === 0 && !this.closed) {
-      const window = new Subject<T>();
-      windows.push(window);
-      destination.next(window);
-    }
-  }
-
-  protected _error(err: any) {
-    const windows = this.windows;
-    if (windows) {
-      while (windows.length > 0 && !this.closed) {
-        windows.shift().error(err);
-      }
-    }
-    this.destination.error(err);
-  }
-
-  protected _complete() {
-    const windows = this.windows;
-    if (windows) {
-      while (windows.length > 0 && !this.closed) {
-        windows.shift().complete();
-      }
-    }
-    this.destination.complete();
-  }
-
-  protected _unsubscribe() {
-    this.count = 0;
-    this.windows = null;
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/windowTime.ts b/node_modules/rxjs/src/internal/operators/windowTime.ts
deleted file mode 100644
index 46c1252..0000000
--- a/node_modules/rxjs/src/internal/operators/windowTime.ts
+++ /dev/null
@@ -1,282 +0,0 @@
-import { Subject } from '../Subject';
-import { Operator } from '../Operator';
-import { async } from '../scheduler/async';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { isNumeric } from '../util/isNumeric';
-import { isScheduler } from '../util/isScheduler';
-import { OperatorFunction, SchedulerLike, SchedulerAction } from '../types';
-
-/**
- * Branch out the source Observable values as a nested Observable periodically
- * in time.
- *
- * <span class="informal">It's like {@link bufferTime}, but emits a nested
- * Observable instead of an array.</span>
- *
- * ![](windowTime.png)
- *
- * Returns an Observable that emits windows of items it collects from the source
- * Observable. The output Observable starts a new window periodically, as
- * determined by the `windowCreationInterval` argument. It emits each window
- * after a fixed timespan, specified by the `windowTimeSpan` argument. When the
- * source Observable completes or encounters an error, the output Observable
- * emits the current window and propagates the notification from the source
- * Observable. If `windowCreationInterval` is not provided, the output
- * Observable starts a new window when the previous window of duration
- * `windowTimeSpan` completes. If `maxWindowCount` is provided, each window
- * will emit at most fixed number of values. Window will complete immediately
- * after emitting last value and next one still will open as specified by
- * `windowTimeSpan` and `windowCreationInterval` arguments.
- *
- * ## Examples
- * In every window of 1 second each, emit at most 2 click events
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { windowTime, map, mergeAll, take } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   windowTime(1000),
- *   map(win => win.pipe(take(2))), // each window has at most 2 emissions
- *   mergeAll(),                    // flatten the Observable-of-Observables
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * Every 5 seconds start a window 1 second long, and emit at most 2 click events per window
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { windowTime, map, mergeAll, take } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   windowTime(1000, 5000),
- *   map(win => win.pipe(take(2))), // each window has at most 2 emissions
- *   mergeAll(),                    // flatten the Observable-of-Observables
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * Same as example above but with maxWindowCount instead of take
- * ```ts
- * import { fromEvent } from 'rxjs';
- * import { windowTime, mergeAll } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   windowTime(1000, 5000, 2), // each window has still at most 2 emissions
- *   mergeAll(),                // flatten the Observable-of-Observables
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link window}
- * @see {@link windowCount}
- * @see {@link windowToggle}
- * @see {@link windowWhen}
- * @see {@link bufferTime}
- *
- * @param {number} windowTimeSpan The amount of time to fill each window.
- * @param {number} [windowCreationInterval] The interval at which to start new
- * windows.
- * @param {number} [maxWindowSize=Number.POSITIVE_INFINITY] Max number of
- * values each window can emit before completion.
- * @param {SchedulerLike} [scheduler=async] The scheduler on which to schedule the
- * intervals that determine window boundaries.
- * @return {Observable<Observable<T>>} An observable of windows, which in turn
- * are Observables.
- * @method windowTime
- * @owner Observable
- */
-export function windowTime<T>(windowTimeSpan: number,
-                              scheduler?: SchedulerLike): OperatorFunction<T, Observable<T>>;
-export function windowTime<T>(windowTimeSpan: number,
-                              windowCreationInterval: number,
-                              scheduler?: SchedulerLike): OperatorFunction<T, Observable<T>>;
-export function windowTime<T>(windowTimeSpan: number,
-                              windowCreationInterval: number,
-                              maxWindowSize: number,
-                              scheduler?: SchedulerLike): OperatorFunction<T, Observable<T>>;
-
-export function windowTime<T>(windowTimeSpan: number): OperatorFunction<T, Observable<T>> {
-  let scheduler: SchedulerLike = async;
-  let windowCreationInterval: number = null;
-  let maxWindowSize: number = Number.POSITIVE_INFINITY;
-
-  if (isScheduler(arguments[3])) {
-    scheduler = arguments[3];
-  }
-
-  if (isScheduler(arguments[2])) {
-    scheduler = arguments[2];
-  } else if (isNumeric(arguments[2])) {
-    maxWindowSize = arguments[2];
-  }
-
-  if (isScheduler(arguments[1])) {
-    scheduler = arguments[1];
-  } else if (isNumeric(arguments[1])) {
-    windowCreationInterval = arguments[1];
-  }
-
-  return function windowTimeOperatorFunction(source: Observable<T>) {
-    return source.lift(new WindowTimeOperator<T>(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler));
-  };
-}
-
-class WindowTimeOperator<T> implements Operator<T, Observable<T>> {
-
-  constructor(private windowTimeSpan: number,
-              private windowCreationInterval: number | null,
-              private maxWindowSize: number,
-              private scheduler: SchedulerLike) {
-  }
-
-  call(subscriber: Subscriber<Observable<T>>, source: any): any {
-    return source.subscribe(new WindowTimeSubscriber(
-      subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler
-    ));
-  }
-}
-
-interface CreationState<T> {
-  windowTimeSpan: number;
-  windowCreationInterval: number;
-  subscriber: WindowTimeSubscriber<T>;
-  scheduler: SchedulerLike;
-}
-
-interface TimeSpanOnlyState<T> {
-    window: CountedSubject<T>;
-    windowTimeSpan: number;
-    subscriber: WindowTimeSubscriber<T>;
-  }
-
-interface CloseWindowContext<T> {
-  action: SchedulerAction<CreationState<T>>;
-  subscription: Subscription;
-}
-
-interface CloseState<T> {
-  subscriber: WindowTimeSubscriber<T>;
-  window: CountedSubject<T>;
-  context: CloseWindowContext<T>;
-}
-
-class CountedSubject<T> extends Subject<T> {
-  private _numberOfNextedValues: number = 0;
-
-  next(value?: T): void {
-    this._numberOfNextedValues++;
-    super.next(value);
-  }
-
-  get numberOfNextedValues(): number {
-    return this._numberOfNextedValues;
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class WindowTimeSubscriber<T> extends Subscriber<T> {
-  private windows: CountedSubject<T>[] = [];
-
-  constructor(protected destination: Subscriber<Observable<T>>,
-              private windowTimeSpan: number,
-              private windowCreationInterval: number | null,
-              private maxWindowSize: number,
-              private scheduler: SchedulerLike) {
-    super(destination);
-
-    const window = this.openWindow();
-    if (windowCreationInterval !== null && windowCreationInterval >= 0) {
-      const closeState: CloseState<T> = { subscriber: this, window, context: <any>null };
-      const creationState: CreationState<T> = { windowTimeSpan, windowCreationInterval, subscriber: this, scheduler };
-      this.add(scheduler.schedule<CloseState<T>>(dispatchWindowClose, windowTimeSpan, closeState));
-      this.add(scheduler.schedule<CreationState<T>>(dispatchWindowCreation, windowCreationInterval, creationState));
-    } else {
-      const timeSpanOnlyState: TimeSpanOnlyState<T> = { subscriber: this, window, windowTimeSpan };
-      this.add(scheduler.schedule<TimeSpanOnlyState<T>>(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));
-    }
-  }
-
-  protected _next(value: T): void {
-    const windows = this.windows;
-    const len = windows.length;
-    for (let i = 0; i < len; i++) {
-      const window = windows[i];
-      if (!window.closed) {
-        window.next(value);
-        if (window.numberOfNextedValues >= this.maxWindowSize) {
-          this.closeWindow(window);
-        }
-      }
-    }
-  }
-
-  protected _error(err: any): void {
-    const windows = this.windows;
-    while (windows.length > 0) {
-      windows.shift().error(err);
-    }
-    this.destination.error(err);
-  }
-
-  protected _complete(): void {
-    const windows = this.windows;
-    while (windows.length > 0) {
-      const window = windows.shift();
-      if (!window.closed) {
-        window.complete();
-      }
-    }
-    this.destination.complete();
-  }
-
-  public openWindow(): CountedSubject<T> {
-    const window = new CountedSubject<T>();
-    this.windows.push(window);
-    const destination = this.destination;
-    destination.next(window);
-    return window;
-  }
-
-  public closeWindow(window: CountedSubject<T>): void {
-    window.complete();
-    const windows = this.windows;
-    windows.splice(windows.indexOf(window), 1);
-  }
-}
-
-function dispatchWindowTimeSpanOnly<T>(this: SchedulerAction<TimeSpanOnlyState<T>>, state: TimeSpanOnlyState<T>): void {
-  const { subscriber, windowTimeSpan, window } = state;
-  if (window) {
-    subscriber.closeWindow(window);
-  }
-  state.window = subscriber.openWindow();
-  this.schedule(state, windowTimeSpan);
-}
-
-function dispatchWindowCreation<T>(this: SchedulerAction<CreationState<T>>, state: CreationState<T>): void {
-  const { windowTimeSpan, subscriber, scheduler, windowCreationInterval } = state;
-  const window = subscriber.openWindow();
-  const action = this;
-  let context: CloseWindowContext<T> = { action, subscription: <any>null };
-  const timeSpanState: CloseState<T> = { subscriber, window, context };
-  context.subscription = scheduler.schedule<CloseState<T>>(dispatchWindowClose, windowTimeSpan, timeSpanState);
-  action.add(context.subscription);
-  action.schedule(state, windowCreationInterval);
-}
-
-function dispatchWindowClose<T>(state: CloseState<T>): void {
-  const { subscriber, window, context } = state;
-  if (context && context.action && context.subscription) {
-    context.action.remove(context.subscription);
-  }
-  subscriber.closeWindow(window);
-}
diff --git a/node_modules/rxjs/src/internal/operators/windowToggle.ts b/node_modules/rxjs/src/internal/operators/windowToggle.ts
deleted file mode 100644
index c2fc218..0000000
--- a/node_modules/rxjs/src/internal/operators/windowToggle.ts
+++ /dev/null
@@ -1,211 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { Subject } from '../Subject';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OperatorFunction } from '../types';
-
-/**
- * Branch out the source Observable values as a nested Observable starting from
- * an emission from `openings` and ending when the output of `closingSelector`
- * emits.
- *
- * <span class="informal">It's like {@link bufferToggle}, but emits a nested
- * Observable instead of an array.</span>
- *
- * ![](windowToggle.png)
- *
- * Returns an Observable that emits windows of items it collects from the source
- * Observable. The output Observable emits windows that contain those items
- * emitted by the source Observable between the time when the `openings`
- * Observable emits an item and when the Observable returned by
- * `closingSelector` emits an item.
- *
- * ## Example
- * Every other second, emit the click events from the next 500ms
- * ```ts
- * import { fromEvent, interval, EMPTY } from 'rxjs';
- * import { windowToggle, mergeAll } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const openings = interval(1000);
- * const result = clicks.pipe(
- *   windowToggle(openings, i => i % 2 ? interval(500) : EMPTY),
- *   mergeAll()
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link window}
- * @see {@link windowCount}
- * @see {@link windowTime}
- * @see {@link windowWhen}
- * @see {@link bufferToggle}
- *
- * @param {Observable<O>} openings An observable of notifications to start new
- * windows.
- * @param {function(value: O): Observable} closingSelector A function that takes
- * the value emitted by the `openings` observable and returns an Observable,
- * which, when it emits (either `next` or `complete`), signals that the
- * associated window should complete.
- * @return {Observable<Observable<T>>} An observable of windows, which in turn
- * are Observables.
- * @method windowToggle
- * @owner Observable
- */
-export function windowToggle<T, O>(openings: Observable<O>,
-                                   closingSelector: (openValue: O) => Observable<any>): OperatorFunction<T, Observable<T>> {
-  return (source: Observable<T>) => source.lift(new WindowToggleOperator<T, O>(openings, closingSelector));
-}
-
-class WindowToggleOperator<T, O> implements Operator<T, Observable<T>> {
-
-  constructor(private openings: Observable<O>,
-              private closingSelector: (openValue: O) => Observable<any>) {
-  }
-
-  call(subscriber: Subscriber<Observable<T>>, source: any): any {
-    return source.subscribe(new WindowToggleSubscriber(
-      subscriber, this.openings, this.closingSelector
-    ));
-  }
-}
-
-interface WindowContext<T> {
-  window: Subject<T>;
-  subscription: Subscription;
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class WindowToggleSubscriber<T, O> extends OuterSubscriber<T, any> {
-  private contexts: WindowContext<T>[] = [];
-  private openSubscription: Subscription;
-
-  constructor(destination: Subscriber<Observable<T>>,
-              private openings: Observable<O>,
-              private closingSelector: (openValue: O) => Observable<any>) {
-    super(destination);
-    this.add(this.openSubscription = subscribeToResult(this, openings, openings as any));
-  }
-
-  protected _next(value: T) {
-    const { contexts } = this;
-    if (contexts) {
-      const len = contexts.length;
-      for (let i = 0; i < len; i++) {
-        contexts[i].window.next(value);
-      }
-    }
-  }
-
-  protected _error(err: any) {
-
-    const { contexts } = this;
-    this.contexts = null;
-
-    if (contexts) {
-      const len = contexts.length;
-      let index = -1;
-
-      while (++index < len) {
-        const context = contexts[index];
-        context.window.error(err);
-        context.subscription.unsubscribe();
-      }
-    }
-
-    super._error(err);
-  }
-
-  protected _complete() {
-    const { contexts } = this;
-    this.contexts = null;
-    if (contexts) {
-      const len = contexts.length;
-      let index = -1;
-      while (++index < len) {
-        const context = contexts[index];
-        context.window.complete();
-        context.subscription.unsubscribe();
-      }
-    }
-    super._complete();
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _unsubscribe() {
-    const { contexts } = this;
-    this.contexts = null;
-    if (contexts) {
-      const len = contexts.length;
-      let index = -1;
-      while (++index < len) {
-        const context = contexts[index];
-        context.window.unsubscribe();
-        context.subscription.unsubscribe();
-      }
-    }
-  }
-
-  notifyNext(outerValue: any, innerValue: any,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, any>): void {
-
-    if (outerValue === this.openings) {
-      let closingNotifier;
-      try {
-        const { closingSelector } = this;
-        closingNotifier = closingSelector(innerValue);
-      } catch (e) {
-        return this.error(e);
-      }
-
-      const window = new Subject<T>();
-      const subscription = new Subscription();
-      const context = { window, subscription };
-      this.contexts.push(context);
-      const innerSubscription = subscribeToResult(this, closingNotifier, context as any);
-
-      if (innerSubscription.closed) {
-        this.closeWindow(this.contexts.length - 1);
-      } else {
-        (<any>innerSubscription).context = context;
-        subscription.add(innerSubscription);
-      }
-
-      this.destination.next(window);
-    } else {
-      this.closeWindow(this.contexts.indexOf(outerValue));
-    }
-  }
-
-  notifyError(err: any): void {
-    this.error(err);
-  }
-
-  notifyComplete(inner: Subscription): void {
-    if (inner !== this.openSubscription) {
-      this.closeWindow(this.contexts.indexOf((<any> inner).context));
-    }
-  }
-
-  private closeWindow(index: number): void {
-    if (index === -1) {
-      return;
-    }
-
-    const { contexts } = this;
-    const context = contexts[index];
-    const { window, subscription } = context;
-    contexts.splice(index, 1);
-    window.complete();
-    subscription.unsubscribe();
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/windowWhen.ts b/node_modules/rxjs/src/internal/operators/windowWhen.ts
deleted file mode 100644
index aa0cf2c..0000000
--- a/node_modules/rxjs/src/internal/operators/windowWhen.ts
+++ /dev/null
@@ -1,147 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { Subject } from '../Subject';
-import { Subscription } from '../Subscription';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { OperatorFunction } from '../types';
-
-/**
- * Branch out the source Observable values as a nested Observable using a
- * factory function of closing Observables to determine when to start a new
- * window.
- *
- * <span class="informal">It's like {@link bufferWhen}, but emits a nested
- * Observable instead of an array.</span>
- *
- * ![](windowWhen.png)
- *
- * Returns an Observable that emits windows of items it collects from the source
- * Observable. The output Observable emits connected, non-overlapping windows.
- * It emits the current window and opens a new one whenever the Observable
- * produced by the specified `closingSelector` function emits an item. The first
- * window is opened immediately when subscribing to the output Observable.
- *
- * ## Example
- * Emit only the first two clicks events in every window of [1-5] random seconds
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { windowWhen, map, mergeAll, take } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const result = clicks.pipe(
- *   windowWhen(() => interval(1000 + Math.random() * 4000)),
- *   map(win => win.pipe(take(2))),     // each window has at most 2 emissions
- *   mergeAll()                         // flatten the Observable-of-Observables
- * );
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link window}
- * @see {@link windowCount}
- * @see {@link windowTime}
- * @see {@link windowToggle}
- * @see {@link bufferWhen}
- *
- * @param {function(): Observable} closingSelector A function that takes no
- * arguments and returns an Observable that signals (on either `next` or
- * `complete`) when to close the previous window and start a new one.
- * @return {Observable<Observable<T>>} An observable of windows, which in turn
- * are Observables.
- * @method windowWhen
- * @owner Observable
- */
-export function windowWhen<T>(closingSelector: () => Observable<any>): OperatorFunction<T, Observable<T>> {
-  return function windowWhenOperatorFunction(source: Observable<T>) {
-    return source.lift(new WindowOperator<T>(closingSelector));
-  };
-}
-
-class WindowOperator<T> implements Operator<T, Observable<T>> {
-  constructor(private closingSelector: () => Observable<any>) {
-  }
-
-  call(subscriber: Subscriber<Observable<T>>, source: any): any {
-    return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class WindowSubscriber<T> extends OuterSubscriber<T, any> {
-  private window: Subject<T>;
-  private closingNotification: Subscription;
-
-  constructor(protected destination: Subscriber<Observable<T>>,
-              private closingSelector: () => Observable<any>) {
-    super(destination);
-    this.openWindow();
-  }
-
-  notifyNext(outerValue: T, innerValue: any,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, any>): void {
-    this.openWindow(innerSub);
-  }
-
-  notifyError(error: any, innerSub: InnerSubscriber<T, any>): void {
-    this._error(error);
-  }
-
-  notifyComplete(innerSub: InnerSubscriber<T, any>): void {
-    this.openWindow(innerSub);
-  }
-
-  protected _next(value: T): void {
-    this.window.next(value);
-  }
-
-  protected _error(err: any): void {
-    this.window.error(err);
-    this.destination.error(err);
-    this.unsubscribeClosingNotification();
-  }
-
-  protected _complete(): void {
-    this.window.complete();
-    this.destination.complete();
-    this.unsubscribeClosingNotification();
-  }
-
-  private unsubscribeClosingNotification(): void {
-    if (this.closingNotification) {
-      this.closingNotification.unsubscribe();
-    }
-  }
-
-  private openWindow(innerSub: InnerSubscriber<T, any> = null): void {
-    if (innerSub) {
-      this.remove(innerSub);
-      innerSub.unsubscribe();
-    }
-
-    const prevWindow = this.window;
-    if (prevWindow) {
-      prevWindow.complete();
-    }
-
-    const window = this.window = new Subject<T>();
-    this.destination.next(window);
-
-    let closingNotifier;
-    try {
-      const { closingSelector } = this;
-      closingNotifier = closingSelector();
-    } catch (e) {
-      this.destination.error(e);
-      this.window.error(e);
-      return;
-    }
-    this.add(this.closingNotification = subscribeToResult(this, closingNotifier));
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/withLatestFrom.ts b/node_modules/rxjs/src/internal/operators/withLatestFrom.ts
deleted file mode 100644
index 85586b3..0000000
--- a/node_modules/rxjs/src/internal/operators/withLatestFrom.ts
+++ /dev/null
@@ -1,156 +0,0 @@
-import { Operator } from '../Operator';
-import { Subscriber } from '../Subscriber';
-import { Observable } from '../Observable';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { subscribeToResult } from '../util/subscribeToResult';
-import { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';
-
-/* tslint:disable:max-line-length */
-export function withLatestFrom<T, R>(project: (v1: T) => R): OperatorFunction<T, R>;
-export function withLatestFrom<T, O2 extends ObservableInput<any>, R>(source2: O2, project: (v1: T, v2: ObservedValueOf<O2>) => R): OperatorFunction<T, R>;
-export function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, R>(v2: O2, v3: O3, project: (v1: T, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>) => R): OperatorFunction<T, R>;
-export function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, R>(v2: O2, v3: O3, v4: O4, project: (v1: T, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>) => R): OperatorFunction<T, R>;
-export function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, R>(v2: O2, v3: O3, v4: O4, v5: O5, project: (v1: T, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>) => R): OperatorFunction<T, R>;
-export function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>, R>(v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, project: (v1: T, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>, v6: ObservedValueOf<O6>) => R): OperatorFunction<T, R>;
-export function withLatestFrom<T, O2 extends ObservableInput<any>>(source2: O2): OperatorFunction<T, [T, ObservedValueOf<O2>]>;
-export function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(v2: O2, v3: O3): OperatorFunction<T, [T, ObservedValueOf<O2>, ObservedValueOf<O3>]>;
-export function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(v2: O2, v3: O3, v4: O4): OperatorFunction<T, [T, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>]>;
-export function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(v2: O2, v3: O3, v4: O4, v5: O5): OperatorFunction<T, [T, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>]>;
-export function withLatestFrom<T, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(v2: O2, v3: O3, v4: O4, v5: O5, v6: O6): OperatorFunction<T, [T, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>, ObservedValueOf<O6>]>;
-export function withLatestFrom<T, R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): OperatorFunction<T, R>;
-export function withLatestFrom<T, R>(array: ObservableInput<any>[]): OperatorFunction<T, R>;
-export function withLatestFrom<T, R>(array: ObservableInput<any>[], project: (...values: Array<any>) => R): OperatorFunction<T, R>;
-
-/* tslint:enable:max-line-length */
-
-/**
- * Combines the source Observable with other Observables to create an Observable
- * whose values are calculated from the latest values of each, only when the
- * source emits.
- *
- * <span class="informal">Whenever the source Observable emits a value, it
- * computes a formula using that value plus the latest values from other input
- * Observables, then emits the output of that formula.</span>
- *
- * ![](withLatestFrom.png)
- *
- * `withLatestFrom` combines each value from the source Observable (the
- * instance) with the latest values from the other input Observables only when
- * the source emits a value, optionally using a `project` function to determine
- * the value to be emitted on the output Observable. All input Observables must
- * emit at least one value before the output Observable will emit a value.
- *
- * ## Example
- * On every click event, emit an array with the latest timer event plus the click event
- * ```ts
- * import { fromEvent, interval } from 'rxjs';
- * import { withLatestFrom } from 'rxjs/operators';
- *
- * const clicks = fromEvent(document, 'click');
- * const timer = interval(1000);
- * const result = clicks.pipe(withLatestFrom(timer));
- * result.subscribe(x => console.log(x));
- * ```
- *
- * @see {@link combineLatest}
- *
- * @param {ObservableInput} other An input Observable to combine with the source
- * Observable. More than one input Observables may be given as argument.
- * @param {Function} [project] Projection function for combining values
- * together. Receives all values in order of the Observables passed, where the
- * first parameter is a value from the source Observable. (e.g.
- * `a.pipe(withLatestFrom(b, c), map(([a1, b1, c1]) => a1 + b1 + c1))`). If this is not
- * passed, arrays will be emitted on the output Observable.
- * @return {Observable} An Observable of projected values from the most recent
- * values from each input Observable, or an array of the most recent values from
- * each input Observable.
- * @method withLatestFrom
- * @owner Observable
- */
-export function withLatestFrom<T, R>(...args: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): OperatorFunction<T, R> {
-  return (source: Observable<T>) => {
-    let project: any;
-    if (typeof args[args.length - 1] === 'function') {
-      project = args.pop();
-    }
-    const observables = <Observable<any>[]>args;
-    return source.lift(new WithLatestFromOperator(observables, project));
-  };
-}
-
-class WithLatestFromOperator<T, R> implements Operator<T, R> {
-  constructor(private observables: Observable<any>[],
-              private project?: (...values: any[]) => Observable<R>) {
-  }
-
-  call(subscriber: Subscriber<R>, source: any): any {
-    return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-class WithLatestFromSubscriber<T, R> extends OuterSubscriber<T, R> {
-  private values: any[];
-  private toRespond: number[] = [];
-
-  constructor(destination: Subscriber<R>,
-              private observables: Observable<any>[],
-              private project?: (...values: any[]) => Observable<R>) {
-    super(destination);
-    const len = observables.length;
-    this.values = new Array(len);
-
-    for (let i = 0; i < len; i++) {
-      this.toRespond.push(i);
-    }
-
-    for (let i = 0; i < len; i++) {
-      let observable = observables[i];
-      this.add(subscribeToResult<T, R>(this, observable, <any>observable, i));
-    }
-  }
-
-  notifyNext(outerValue: T, innerValue: R,
-             outerIndex: number, innerIndex: number,
-             innerSub: InnerSubscriber<T, R>): void {
-    this.values[outerIndex] = innerValue;
-    const toRespond = this.toRespond;
-    if (toRespond.length > 0) {
-      const found = toRespond.indexOf(outerIndex);
-      if (found !== -1) {
-        toRespond.splice(found, 1);
-      }
-    }
-  }
-
-  notifyComplete() {
-    // noop
-  }
-
-  protected _next(value: T) {
-    if (this.toRespond.length === 0) {
-      const args = [value, ...this.values];
-      if (this.project) {
-        this._tryProject(args);
-      } else {
-        this.destination.next(args);
-      }
-    }
-  }
-
-  private _tryProject(args: any[]) {
-    let result: any;
-    try {
-      result = this.project.apply(this, args);
-    } catch (err) {
-      this.destination.error(err);
-      return;
-    }
-    this.destination.next(result);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/operators/zip.ts b/node_modules/rxjs/src/internal/operators/zip.ts
deleted file mode 100644
index b02ffc9..0000000
--- a/node_modules/rxjs/src/internal/operators/zip.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { zip as zipStatic } from '../observable/zip';
-import { Observable } from '../Observable';
-import { ObservableInput, OperatorFunction } from '../types';
-
-/* tslint:disable:max-line-length */
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, R>(project: (v1: T) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, T2, R>(v2: ObservableInput<T2>, project: (v1: T, v2: T2) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, T2, T3, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, project: (v1: T, v2: T2, v3: T3) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, T2, T3, T4, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, project: (v1: T, v2: T2, v3: T3, v4: T4) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, T2, T3, T4, T5, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => R): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, T2, T3, T4, T5, T6, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => R): OperatorFunction<T, R> ;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, T2>(v2: ObservableInput<T2>): OperatorFunction<T, [T, T2]>;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, T2, T3>(v2: ObservableInput<T2>, v3: ObservableInput<T3>): OperatorFunction<T, [T, T2, T3]>;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, T2, T3, T4>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): OperatorFunction<T, [T, T2, T3, T4]>;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, T2, T3, T4, T5>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): OperatorFunction<T, [T, T2, T3, T4, T5]>;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, T2, T3, T4, T5, T6>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): OperatorFunction<T, [T, T2, T3, T4, T5, T6]> ;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, R>(...observables: Array<ObservableInput<T> | ((...values: Array<T>) => R)>): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, R>(array: Array<ObservableInput<T>>): OperatorFunction<T, R>;
-/** @deprecated Deprecated in favor of static zip. */
-export function zip<T, TOther, R>(array: Array<ObservableInput<TOther>>, project: (v1: T, ...values: Array<TOther>) => R): OperatorFunction<T, R>;
-/* tslint:enable:max-line-length */
-
-/**
- * @deprecated Deprecated in favor of static {@link zip}.
- */
-export function zip<T, R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): OperatorFunction<T, R> {
-  return function zipOperatorFunction(source: Observable<T>) {
-    return source.lift.call(zipStatic<R>(source, ...observables));
-  };
-}
\ No newline at end of file
diff --git a/node_modules/rxjs/src/internal/operators/zipAll.ts b/node_modules/rxjs/src/internal/operators/zipAll.ts
deleted file mode 100644
index 163ae43..0000000
--- a/node_modules/rxjs/src/internal/operators/zipAll.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { ZipOperator } from '../observable/zip';
-import { Observable } from '../Observable';
-import { OperatorFunction, ObservableInput } from '../types';
-
-export function zipAll<T>(): OperatorFunction<ObservableInput<T>, T[]>;
-export function zipAll<T>(): OperatorFunction<any, T[]>;
-export function zipAll<T, R>(project: (...values: T[]) => R): OperatorFunction<ObservableInput<T>, R>;
-export function zipAll<R>(project: (...values: Array<any>) => R): OperatorFunction<any, R>;
-
-export function zipAll<T, R>(project?: (...values: Array<any>) => R): OperatorFunction<T, R> {
-  return (source: Observable<T>) => source.lift(new ZipOperator(project));
-}
diff --git a/node_modules/rxjs/src/internal/scheduled/scheduleArray.ts b/node_modules/rxjs/src/internal/scheduled/scheduleArray.ts
deleted file mode 100644
index 1b56860..0000000
--- a/node_modules/rxjs/src/internal/scheduled/scheduleArray.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-import { Subscription } from '../Subscription';
-
-export function scheduleArray<T>(input: ArrayLike<T>, scheduler: SchedulerLike) {
-  return new Observable<T>(subscriber => {
-    const sub = new Subscription();
-    let i = 0;
-    sub.add(scheduler.schedule(function () {
-      if (i === input.length) {
-        subscriber.complete();
-        return;
-      }
-      subscriber.next(input[i++]);
-      if (!subscriber.closed) {
-        sub.add(this.schedule());
-      }
-    }));
-    return sub;
-  });
-}
diff --git a/node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts b/node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts
deleted file mode 100644
index dc90438..0000000
--- a/node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-import { Subscription } from '../Subscription';
-import { iterator as Symbol_iterator } from '../symbol/iterator';
-
-export function scheduleIterable<T>(input: Iterable<T>, scheduler: SchedulerLike) {
-  if (!input) {
-    throw new Error('Iterable cannot be null');
-  }
-  return new Observable<T>(subscriber => {
-    const sub = new Subscription();
-    let iterator: Iterator<T>;
-    sub.add(() => {
-      // Finalize generators
-      if (iterator && typeof iterator.return === 'function') {
-        iterator.return();
-      }
-    });
-    sub.add(scheduler.schedule(() => {
-      iterator = input[Symbol_iterator]();
-      sub.add(scheduler.schedule(function () {
-        if (subscriber.closed) {
-          return;
-        }
-        let value: T;
-        let done: boolean;
-        try {
-          const result = iterator.next();
-          value = result.value;
-          done = result.done;
-        } catch (err) {
-          subscriber.error(err);
-          return;
-        }
-        if (done) {
-          subscriber.complete();
-        } else {
-          subscriber.next(value);
-          this.schedule();
-        }
-      }));
-    }));
-    return sub;
-  });
-}
diff --git a/node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts b/node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts
deleted file mode 100644
index 9e970c0..0000000
--- a/node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { observable as Symbol_observable } from '../symbol/observable';
-import { InteropObservable, SchedulerLike, Subscribable } from '../types';
-
-export function scheduleObservable<T>(input: InteropObservable<T>, scheduler: SchedulerLike) {
-  return new Observable<T>(subscriber => {
-    const sub = new Subscription();
-    sub.add(scheduler.schedule(() => {
-      const observable: Subscribable<T> = input[Symbol_observable]();
-      sub.add(observable.subscribe({
-        next(value) { sub.add(scheduler.schedule(() => subscriber.next(value))); },
-        error(err) { sub.add(scheduler.schedule(() => subscriber.error(err))); },
-        complete() { sub.add(scheduler.schedule(() => subscriber.complete())); },
-      }));
-    }));
-    return sub;
-  });
-}
diff --git a/node_modules/rxjs/src/internal/scheduled/schedulePromise.ts b/node_modules/rxjs/src/internal/scheduled/schedulePromise.ts
deleted file mode 100644
index ec1bfaf..0000000
--- a/node_modules/rxjs/src/internal/scheduled/schedulePromise.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { Observable } from '../Observable';
-import { SchedulerLike } from '../types';
-import { Subscription } from '../Subscription';
-
-export function schedulePromise<T>(input: PromiseLike<T>, scheduler: SchedulerLike) {
-  return new Observable<T>(subscriber => {
-    const sub = new Subscription();
-    sub.add(scheduler.schedule(() => input.then(
-      value => {
-        sub.add(scheduler.schedule(() => {
-          subscriber.next(value);
-          sub.add(scheduler.schedule(() => subscriber.complete()));
-        }));
-      },
-      err => {
-        sub.add(scheduler.schedule(() => subscriber.error(err)));
-      }
-    )));
-    return sub;
-  });
-}
diff --git a/node_modules/rxjs/src/internal/scheduled/scheduled.ts b/node_modules/rxjs/src/internal/scheduled/scheduled.ts
deleted file mode 100644
index ec819f7..0000000
--- a/node_modules/rxjs/src/internal/scheduled/scheduled.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { scheduleObservable } from './scheduleObservable';
-import { schedulePromise } from './schedulePromise';
-import { scheduleArray } from './scheduleArray';
-import { scheduleIterable } from './scheduleIterable';
-import { ObservableInput, SchedulerLike, Observable } from 'rxjs';
-import { isInteropObservable } from '../util/isInteropObservable';
-import { isPromise } from '../util/isPromise';
-import { isArrayLike } from '../util/isArrayLike';
-import { isIterable } from '../util/isIterable';
-
-/**
- * Converts from a common {@link ObservableInput} type to an observable where subscription and emissions
- * are scheduled on the provided scheduler.
- *
- * @see from
- * @see of
- *
- * @param input The observable, array, promise, iterable, etc you would like to schedule
- * @param scheduler The scheduler to use to schedule the subscription and emissions from
- * the returned observable.
- */
-export function scheduled<T>(input: ObservableInput<T>, scheduler: SchedulerLike): Observable<T> {
-  if (input != null) {
-    if (isInteropObservable(input)) {
-      return scheduleObservable(input, scheduler);
-    } else if (isPromise(input)) {
-      return schedulePromise(input, scheduler);
-    } else if (isArrayLike(input)) {
-      return scheduleArray(input, scheduler);
-    }  else if (isIterable(input) || typeof input === 'string') {
-      return scheduleIterable(input, scheduler);
-    }
-  }
-
-  throw new TypeError((input !== null && typeof input || input) + ' is not observable');
-}
diff --git a/node_modules/rxjs/src/internal/scheduler/Action.ts b/node_modules/rxjs/src/internal/scheduler/Action.ts
deleted file mode 100644
index 6cf91bc..0000000
--- a/node_modules/rxjs/src/internal/scheduler/Action.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { Scheduler } from '../Scheduler';
-import { Subscription } from '../Subscription';
-import { SchedulerAction } from '../types';
-
-/**
- * A unit of work to be executed in a `scheduler`. An action is typically
- * created from within a {@link SchedulerLike} and an RxJS user does not need to concern
- * themselves about creating and manipulating an Action.
- *
- * ```ts
- * class Action<T> extends Subscription {
- *   new (scheduler: Scheduler, work: (state?: T) => void);
- *   schedule(state?: T, delay: number = 0): Subscription;
- * }
- * ```
- *
- * @class Action<T>
- */
-export class Action<T> extends Subscription {
-  constructor(scheduler: Scheduler, work: (this: SchedulerAction<T>, state?: T) => void) {
-    super();
-  }
-  /**
-   * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed
-   * some context object, `state`. May happen at some point in the future,
-   * according to the `delay` parameter, if specified.
-   * @param {T} [state] Some contextual data that the `work` function uses when
-   * called by the Scheduler.
-   * @param {number} [delay] Time to wait before executing the work, where the
-   * time unit is implicit and defined by the Scheduler.
-   * @return {void}
-   */
-  public schedule(state?: T, delay: number = 0): Subscription {
-    return this;
-  }
-}
diff --git a/node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts b/node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts
deleted file mode 100644
index e9ea64f..0000000
--- a/node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { AnimationFrameScheduler } from './AnimationFrameScheduler';
-import { SchedulerAction } from '../types';
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class AnimationFrameAction<T> extends AsyncAction<T> {
-
-  constructor(protected scheduler: AnimationFrameScheduler,
-              protected work: (this: SchedulerAction<T>, state?: T) => void) {
-    super(scheduler, work);
-  }
-
-  protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: any, delay: number = 0): any {
-    // If delay is greater than 0, request as an async action.
-    if (delay !== null && delay > 0) {
-      return super.requestAsyncId(scheduler, id, delay);
-    }
-    // Push the action to the end of the scheduler queue.
-    scheduler.actions.push(this);
-    // If an animation frame has already been requested, don't request another
-    // one. If an animation frame hasn't been requested yet, request one. Return
-    // the current animation frame request id.
-    return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(
-      () => scheduler.flush(null)));
-  }
-  protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: any, delay: number = 0): any {
-    // If delay exists and is greater than 0, or if the delay is null (the
-    // action wasn't rescheduled) but was originally scheduled as an async
-    // action, then recycle as an async action.
-    if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-      return super.recycleAsyncId(scheduler, id, delay);
-    }
-    // If the scheduler queue is empty, cancel the requested animation frame and
-    // set the scheduled flag to undefined so the next AnimationFrameAction will
-    // request its own.
-    if (scheduler.actions.length === 0) {
-      cancelAnimationFrame(id);
-      scheduler.scheduled = undefined;
-    }
-    // Return undefined so the action knows to request a new async id if it's rescheduled.
-    return undefined;
-  }
-}
diff --git a/node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts b/node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts
deleted file mode 100644
index c550429..0000000
--- a/node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { AsyncScheduler } from './AsyncScheduler';
-
-export class AnimationFrameScheduler extends AsyncScheduler {
-  public flush(action?: AsyncAction<any>): void {
-
-    this.active = true;
-    this.scheduled = undefined;
-
-    const {actions} = this;
-    let error: any;
-    let index: number = -1;
-    let count: number = actions.length;
-    action = action || actions.shift();
-
-    do {
-      if (error = action.execute(action.state, action.delay)) {
-        break;
-      }
-    } while (++index < count && (action = actions.shift()));
-
-    this.active = false;
-
-    if (error) {
-      while (++index < count && (action = actions.shift())) {
-        action.unsubscribe();
-      }
-      throw error;
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/scheduler/AsapAction.ts b/node_modules/rxjs/src/internal/scheduler/AsapAction.ts
deleted file mode 100644
index 1fe1622..0000000
--- a/node_modules/rxjs/src/internal/scheduler/AsapAction.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { Immediate } from '../util/Immediate';
-import { AsyncAction } from './AsyncAction';
-import { AsapScheduler } from './AsapScheduler';
-import { SchedulerAction } from '../types';
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class AsapAction<T> extends AsyncAction<T> {
-
-  constructor(protected scheduler: AsapScheduler,
-              protected work: (this: SchedulerAction<T>, state?: T) => void) {
-    super(scheduler, work);
-  }
-
-  protected requestAsyncId(scheduler: AsapScheduler, id?: any, delay: number = 0): any {
-    // If delay is greater than 0, request as an async action.
-    if (delay !== null && delay > 0) {
-      return super.requestAsyncId(scheduler, id, delay);
-    }
-    // Push the action to the end of the scheduler queue.
-    scheduler.actions.push(this);
-    // If a microtask has already been scheduled, don't schedule another
-    // one. If a microtask hasn't been scheduled yet, schedule one now. Return
-    // the current scheduled microtask id.
-    return scheduler.scheduled || (scheduler.scheduled = Immediate.setImmediate(
-      scheduler.flush.bind(scheduler, null)
-    ));
-  }
-  protected recycleAsyncId(scheduler: AsapScheduler, id?: any, delay: number = 0): any {
-    // If delay exists and is greater than 0, or if the delay is null (the
-    // action wasn't rescheduled) but was originally scheduled as an async
-    // action, then recycle as an async action.
-    if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-      return super.recycleAsyncId(scheduler, id, delay);
-    }
-    // If the scheduler queue is empty, cancel the requested microtask and
-    // set the scheduled flag to undefined so the next AsapAction will schedule
-    // its own.
-    if (scheduler.actions.length === 0) {
-      Immediate.clearImmediate(id);
-      scheduler.scheduled = undefined;
-    }
-    // Return undefined so the action knows to request a new async id if it's rescheduled.
-    return undefined;
-  }
-}
diff --git a/node_modules/rxjs/src/internal/scheduler/AsapScheduler.ts b/node_modules/rxjs/src/internal/scheduler/AsapScheduler.ts
deleted file mode 100644
index 659aa58..0000000
--- a/node_modules/rxjs/src/internal/scheduler/AsapScheduler.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { AsyncScheduler } from './AsyncScheduler';
-
-export class AsapScheduler extends AsyncScheduler {
-  public flush(action?: AsyncAction<any>): void {
-
-    this.active = true;
-    this.scheduled = undefined;
-
-    const {actions} = this;
-    let error: any;
-    let index: number = -1;
-    let count: number = actions.length;
-    action = action || actions.shift();
-
-    do {
-      if (error = action.execute(action.state, action.delay)) {
-        break;
-      }
-    } while (++index < count && (action = actions.shift()));
-
-    this.active = false;
-
-    if (error) {
-      while (++index < count && (action = actions.shift())) {
-        action.unsubscribe();
-      }
-      throw error;
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/scheduler/AsyncAction.ts b/node_modules/rxjs/src/internal/scheduler/AsyncAction.ts
deleted file mode 100644
index 05f128f..0000000
--- a/node_modules/rxjs/src/internal/scheduler/AsyncAction.ts
+++ /dev/null
@@ -1,156 +0,0 @@
-import { Action } from './Action';
-import { SchedulerAction } from '../types';
-import { Subscription } from '../Subscription';
-import { AsyncScheduler } from './AsyncScheduler';
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class AsyncAction<T> extends Action<T> {
-
-  public id: any;
-  public state: T;
-  public delay: number;
-  protected pending: boolean = false;
-
-  constructor(protected scheduler: AsyncScheduler,
-              protected work: (this: SchedulerAction<T>, state?: T) => void) {
-    super(scheduler, work);
-  }
-
-  public schedule(state?: T, delay: number = 0): Subscription {
-
-    if (this.closed) {
-      return this;
-    }
-
-    // Always replace the current state with the new state.
-    this.state = state;
-
-    const id = this.id;
-    const scheduler = this.scheduler;
-
-    //
-    // Important implementation note:
-    //
-    // Actions only execute once by default, unless rescheduled from within the
-    // scheduled callback. This allows us to implement single and repeat
-    // actions via the same code path, without adding API surface area, as well
-    // as mimic traditional recursion but across asynchronous boundaries.
-    //
-    // However, JS runtimes and timers distinguish between intervals achieved by
-    // serial `setTimeout` calls vs. a single `setInterval` call. An interval of
-    // serial `setTimeout` calls can be individually delayed, which delays
-    // scheduling the next `setTimeout`, and so on. `setInterval` attempts to
-    // guarantee the interval callback will be invoked more precisely to the
-    // interval period, regardless of load.
-    //
-    // Therefore, we use `setInterval` to schedule single and repeat actions.
-    // If the action reschedules itself with the same delay, the interval is not
-    // canceled. If the action doesn't reschedule, or reschedules with a
-    // different delay, the interval will be canceled after scheduled callback
-    // execution.
-    //
-    if (id != null) {
-      this.id = this.recycleAsyncId(scheduler, id, delay);
-    }
-
-    // Set the pending flag indicating that this action has been scheduled, or
-    // has recursively rescheduled itself.
-    this.pending = true;
-
-    this.delay = delay;
-    // If this action has already an async Id, don't request a new one.
-    this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
-
-    return this;
-  }
-
-  protected requestAsyncId(scheduler: AsyncScheduler, id?: any, delay: number = 0): any {
-    return setInterval(scheduler.flush.bind(scheduler, this), delay);
-  }
-
-  protected recycleAsyncId(scheduler: AsyncScheduler, id: any, delay: number = 0): any {
-    // If this action is rescheduled with the same delay time, don't clear the interval id.
-    if (delay !== null && this.delay === delay && this.pending === false) {
-      return id;
-    }
-    // Otherwise, if the action's delay time is different from the current delay,
-    // or the action has been rescheduled before it's executed, clear the interval id
-    clearInterval(id);
-    return undefined;
-  }
-
-  /**
-   * Immediately executes this action and the `work` it contains.
-   * @return {any}
-   */
-  public execute(state: T, delay: number): any {
-
-    if (this.closed) {
-      return new Error('executing a cancelled action');
-    }
-
-    this.pending = false;
-    const error = this._execute(state, delay);
-    if (error) {
-      return error;
-    } else if (this.pending === false && this.id != null) {
-      // Dequeue if the action didn't reschedule itself. Don't call
-      // unsubscribe(), because the action could reschedule later.
-      // For example:
-      // ```
-      // scheduler.schedule(function doWork(counter) {
-      //   /* ... I'm a busy worker bee ... */
-      //   var originalAction = this;
-      //   /* wait 100ms before rescheduling the action */
-      //   setTimeout(function () {
-      //     originalAction.schedule(counter + 1);
-      //   }, 100);
-      // }, 1000);
-      // ```
-      this.id = this.recycleAsyncId(this.scheduler, this.id, null);
-    }
-  }
-
-  protected _execute(state: T, delay: number): any {
-    let errored: boolean = false;
-    let errorValue: any = undefined;
-    try {
-      this.work(state);
-    } catch (e) {
-      errored = true;
-      errorValue = !!e && e || new Error(e);
-    }
-    if (errored) {
-      this.unsubscribe();
-      return errorValue;
-    }
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _unsubscribe() {
-
-    const id = this.id;
-    const scheduler = this.scheduler;
-    const actions = scheduler.actions;
-    const index = actions.indexOf(this);
-
-    this.work  = null;
-    this.state = null;
-    this.pending = false;
-    this.scheduler = null;
-
-    if (index !== -1) {
-      actions.splice(index, 1);
-    }
-
-    if (id != null) {
-      this.id = this.recycleAsyncId(scheduler, id, null);
-    }
-
-    this.delay = null;
-  }
-}
diff --git a/node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts b/node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts
deleted file mode 100644
index aad77ea..0000000
--- a/node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts
+++ /dev/null
@@ -1,72 +0,0 @@
-import { Scheduler } from '../Scheduler';
-import { Action } from './Action';
-import { AsyncAction } from './AsyncAction';
-import { SchedulerAction } from '../types';
-import { Subscription } from '../Subscription';
-
-export class AsyncScheduler extends Scheduler {
-  public static delegate?: Scheduler;
-  public actions: Array<AsyncAction<any>> = [];
-  /**
-   * A flag to indicate whether the Scheduler is currently executing a batch of
-   * queued actions.
-   * @type {boolean}
-   * @deprecated internal use only
-   */
-  public active: boolean = false;
-  /**
-   * An internal ID used to track the latest asynchronous task such as those
-   * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and
-   * others.
-   * @type {any}
-   * @deprecated internal use only
-   */
-  public scheduled: any = undefined;
-
-  constructor(SchedulerAction: typeof Action,
-              now: () => number = Scheduler.now) {
-    super(SchedulerAction, () => {
-      if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
-        return AsyncScheduler.delegate.now();
-      } else {
-        return now();
-      }
-    });
-  }
-
-  public schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay: number = 0, state?: T): Subscription {
-    if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
-      return AsyncScheduler.delegate.schedule(work, delay, state);
-    } else {
-      return super.schedule(work, delay, state);
-    }
-  }
-
-  public flush(action: AsyncAction<any>): void {
-
-    const {actions} = this;
-
-    if (this.active) {
-      actions.push(action);
-      return;
-    }
-
-    let error: any;
-    this.active = true;
-
-    do {
-      if (error = action.execute(action.state, action.delay)) {
-        break;
-      }
-    } while (action = actions.shift()); // exhaust the scheduler queue
-
-    this.active = false;
-
-    if (error) {
-      while (action = actions.shift()) {
-        action.unsubscribe();
-      }
-      throw error;
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/scheduler/QueueAction.ts b/node_modules/rxjs/src/internal/scheduler/QueueAction.ts
deleted file mode 100644
index b5a8b51..0000000
--- a/node_modules/rxjs/src/internal/scheduler/QueueAction.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { Subscription } from '../Subscription';
-import { QueueScheduler } from './QueueScheduler';
-import { SchedulerAction } from '../types';
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class QueueAction<T> extends AsyncAction<T> {
-
-  constructor(protected scheduler: QueueScheduler,
-              protected work: (this: SchedulerAction<T>, state?: T) => void) {
-    super(scheduler, work);
-  }
-
-  public schedule(state?: T, delay: number = 0): Subscription {
-    if (delay > 0) {
-      return super.schedule(state, delay);
-    }
-    this.delay = delay;
-    this.state = state;
-    this.scheduler.flush(this);
-    return this;
-  }
-
-  public execute(state: T, delay: number): any {
-    return (delay > 0 || this.closed) ?
-      super.execute(state, delay) :
-      this._execute(state, delay) ;
-  }
-
-  protected requestAsyncId(scheduler: QueueScheduler, id?: any, delay: number = 0): any {
-    // If delay exists and is greater than 0, or if the delay is null (the
-    // action wasn't rescheduled) but was originally scheduled as an async
-    // action, then recycle as an async action.
-    if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-      return super.requestAsyncId(scheduler, id, delay);
-    }
-    // Otherwise flush the scheduler starting with this action.
-    return scheduler.flush(this);
-  }
-}
diff --git a/node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts b/node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts
deleted file mode 100644
index e9dab3d..0000000
--- a/node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-import { AsyncScheduler } from './AsyncScheduler';
-
-export class QueueScheduler extends AsyncScheduler {
-}
diff --git a/node_modules/rxjs/src/internal/scheduler/VirtualTimeScheduler.ts b/node_modules/rxjs/src/internal/scheduler/VirtualTimeScheduler.ts
deleted file mode 100644
index 7017ea5..0000000
--- a/node_modules/rxjs/src/internal/scheduler/VirtualTimeScheduler.ts
+++ /dev/null
@@ -1,108 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { Subscription } from '../Subscription';
-import { AsyncScheduler } from './AsyncScheduler';
-import { SchedulerAction } from '../types';
-
-export class VirtualTimeScheduler extends AsyncScheduler {
-
-  protected static frameTimeFactor: number = 10;
-
-  public frame: number = 0;
-  public index: number = -1;
-
-  constructor(SchedulerAction: typeof AsyncAction = VirtualAction as any,
-              public maxFrames: number = Number.POSITIVE_INFINITY) {
-    super(SchedulerAction, () => this.frame);
-  }
-
-  /**
-   * Prompt the Scheduler to execute all of its queued actions, therefore
-   * clearing its queue.
-   * @return {void}
-   */
-  public flush(): void {
-
-    const {actions, maxFrames} = this;
-    let error: any, action: AsyncAction<any>;
-
-    while ((action = actions[0]) && action.delay <= maxFrames) {
-      actions.shift();
-      this.frame = action.delay;
-
-      if (error = action.execute(action.state, action.delay)) {
-        break;
-      }
-    }
-
-    if (error) {
-      while (action = actions.shift()) {
-        action.unsubscribe();
-      }
-      throw error;
-    }
-  }
-}
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @nodoc
- */
-export class VirtualAction<T> extends AsyncAction<T> {
-
-  protected active: boolean = true;
-
-  constructor(protected scheduler: VirtualTimeScheduler,
-              protected work: (this: SchedulerAction<T>, state?: T) => void,
-              protected index: number = scheduler.index += 1) {
-    super(scheduler, work);
-    this.index = scheduler.index = index;
-  }
-
-  public schedule(state?: T, delay: number = 0): Subscription {
-    if (!this.id) {
-      return super.schedule(state, delay);
-    }
-    this.active = false;
-    // If an action is rescheduled, we save allocations by mutating its state,
-    // pushing it to the end of the scheduler queue, and recycling the action.
-    // But since the VirtualTimeScheduler is used for testing, VirtualActions
-    // must be immutable so they can be inspected later.
-    const action = new VirtualAction(this.scheduler, this.work);
-    this.add(action);
-    return action.schedule(state, delay);
-  }
-
-  protected requestAsyncId(scheduler: VirtualTimeScheduler, id?: any, delay: number = 0): any {
-    this.delay = scheduler.frame + delay;
-    const {actions} = scheduler;
-    actions.push(this);
-    (actions as Array<VirtualAction<T>>).sort(VirtualAction.sortActions);
-    return true;
-  }
-
-  protected recycleAsyncId(scheduler: VirtualTimeScheduler, id?: any, delay: number = 0): any {
-    return undefined;
-  }
-
-  protected _execute(state: T, delay: number): any {
-    if (this.active === true) {
-      return super._execute(state, delay);
-    }
-  }
-
-  public static sortActions<T>(a: VirtualAction<T>, b: VirtualAction<T>) {
-    if (a.delay === b.delay) {
-      if (a.index === b.index) {
-        return 0;
-      } else if (a.index > b.index) {
-        return 1;
-      } else {
-        return -1;
-      }
-    } else if (a.delay > b.delay) {
-      return 1;
-    } else {
-      return -1;
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/scheduler/animationFrame.ts b/node_modules/rxjs/src/internal/scheduler/animationFrame.ts
deleted file mode 100644
index 6f16fd6..0000000
--- a/node_modules/rxjs/src/internal/scheduler/animationFrame.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { AnimationFrameAction } from './AnimationFrameAction';
-import { AnimationFrameScheduler } from './AnimationFrameScheduler';
-
-/**
- *
- * Animation Frame Scheduler
- *
- * <span class="informal">Perform task when `window.requestAnimationFrame` would fire</span>
- *
- * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler
- * behaviour.
- *
- * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.
- * It makes sure scheduled task will happen just before next browser content repaint,
- * thus performing animations as efficiently as possible.
- *
- * ## Example
- * Schedule div height animation
- * ```ts
- * // html: <div style="background: #0ff;"></div>
- * import { animationFrameScheduler } from 'rxjs';
- *
- * const div = document.querySelector('div');
- *
- * animationFrameScheduler.schedule(function(height) {
- *   div.style.height = height + "px";
- *
- *   this.schedule(height + 1);  // `this` references currently executing Action,
- *                               // which we reschedule with new state
- * }, 0, 0);
- *
- * // You will see a div element growing in height
- * ```
- *
- * @static true
- * @name animationFrame
- * @owner Scheduler
- */
-
-export const animationFrame = new AnimationFrameScheduler(AnimationFrameAction);
diff --git a/node_modules/rxjs/src/internal/scheduler/asap.ts b/node_modules/rxjs/src/internal/scheduler/asap.ts
deleted file mode 100644
index 93878a1..0000000
--- a/node_modules/rxjs/src/internal/scheduler/asap.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { AsapAction } from './AsapAction';
-import { AsapScheduler } from './AsapScheduler';
-
-/**
- *
- * Asap Scheduler
- *
- * <span class="informal">Perform task as fast as it can be performed asynchronously</span>
- *
- * `asap` scheduler behaves the same as {@link asyncScheduler} scheduler when you use it to delay task
- * in time. If however you set delay to `0`, `asap` will wait for current synchronously executing
- * code to end and then it will try to execute given task as fast as possible.
- *
- * `asap` scheduler will do its best to minimize time between end of currently executing code
- * and start of scheduled task. This makes it best candidate for performing so called "deferring".
- * Traditionally this was achieved by calling `setTimeout(deferredTask, 0)`, but that technique involves
- * some (although minimal) unwanted delay.
- *
- * Note that using `asap` scheduler does not necessarily mean that your task will be first to process
- * after currently executing code. In particular, if some task was also scheduled with `asap` before,
- * that task will execute first. That being said, if you need to schedule task asynchronously, but
- * as soon as possible, `asap` scheduler is your best bet.
- *
- * ## Example
- * Compare async and asap scheduler<
- * ```ts
- * import { asapScheduler, asyncScheduler } from 'rxjs';
- *
- * asyncScheduler.schedule(() => console.log('async')); // scheduling 'async' first...
- * asapScheduler.schedule(() => console.log('asap'));
- *
- * // Logs:
- * // "asap"
- * // "async"
- * // ... but 'asap' goes first!
- * ```
- * @static true
- * @name asap
- * @owner Scheduler
- */
-
-export const asap = new AsapScheduler(AsapAction);
diff --git a/node_modules/rxjs/src/internal/scheduler/async.ts b/node_modules/rxjs/src/internal/scheduler/async.ts
deleted file mode 100644
index 0a8257a..0000000
--- a/node_modules/rxjs/src/internal/scheduler/async.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { AsyncAction } from './AsyncAction';
-import { AsyncScheduler } from './AsyncScheduler';
-
-/**
- *
- * Async Scheduler
- *
- * <span class="informal">Schedule task as if you used setTimeout(task, duration)</span>
- *
- * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript
- * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating
- * in intervals.
- *
- * If you just want to "defer" task, that is to perform it right after currently
- * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),
- * better choice will be the {@link asapScheduler} scheduler.
- *
- * ## Examples
- * Use async scheduler to delay task
- * ```ts
- * import { asyncScheduler } from 'rxjs';
- *
- * const task = () => console.log('it works!');
- *
- * asyncScheduler.schedule(task, 2000);
- *
- * // After 2 seconds logs:
- * // "it works!"
- * ```
- *
- * Use async scheduler to repeat task in intervals
- * ```ts
- * import { asyncScheduler } from 'rxjs';
- *
- * function task(state) {
- *   console.log(state);
- *   this.schedule(state + 1, 1000); // `this` references currently executing Action,
- *                                   // which we reschedule with new state and delay
- * }
- *
- * asyncScheduler.schedule(task, 3000, 0);
- *
- * // Logs:
- * // 0 after 3s
- * // 1 after 4s
- * // 2 after 5s
- * // 3 after 6s
- * ```
- *
- * @static true
- * @name async
- * @owner Scheduler
- */
-
-export const async = new AsyncScheduler(AsyncAction);
diff --git a/node_modules/rxjs/src/internal/scheduler/queue.ts b/node_modules/rxjs/src/internal/scheduler/queue.ts
deleted file mode 100644
index f11002f..0000000
--- a/node_modules/rxjs/src/internal/scheduler/queue.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import { QueueAction } from './QueueAction';
-import { QueueScheduler } from './QueueScheduler';
-
-/**
- *
- * Queue Scheduler
- *
- * <span class="informal">Put every next task on a queue, instead of executing it immediately</span>
- *
- * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.
- *
- * When used without delay, it schedules given task synchronously - executes it right when
- * it is scheduled. However when called recursively, that is when inside the scheduled task,
- * another task is scheduled with queue scheduler, instead of executing immediately as well,
- * that task will be put on a queue and wait for current one to finish.
- *
- * This means that when you execute task with `queue` scheduler, you are sure it will end
- * before any other task scheduled with that scheduler will start.
- *
- * ## Examples
- * Schedule recursively first, then do something
- * ```ts
- * import { queueScheduler } from 'rxjs';
- *
- * queueScheduler.schedule(() => {
- *   queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue
- *
- *   console.log('first');
- * });
- *
- * // Logs:
- * // "first"
- * // "second"
- * ```
- *
- * Reschedule itself recursively
- * ```ts
- * import { queueScheduler } from 'rxjs';
- *
- * queueScheduler.schedule(function(state) {
- *   if (state !== 0) {
- *     console.log('before', state);
- *     this.schedule(state - 1); // `this` references currently executing Action,
- *                               // which we reschedule with new state
- *     console.log('after', state);
- *   }
- * }, 0, 3);
- *
- * // In scheduler that runs recursively, you would expect:
- * // "before", 3
- * // "before", 2
- * // "before", 1
- * // "after", 1
- * // "after", 2
- * // "after", 3
- *
- * // But with queue it logs:
- * // "before", 3
- * // "after", 3
- * // "before", 2
- * // "after", 2
- * // "before", 1
- * // "after", 1
- * ```
- *
- * @static true
- * @name queue
- * @owner Scheduler
- */
-
-export const queue = new QueueScheduler(QueueAction);
diff --git a/node_modules/rxjs/src/internal/symbol/iterator.ts b/node_modules/rxjs/src/internal/symbol/iterator.ts
deleted file mode 100644
index 8e9871a..0000000
--- a/node_modules/rxjs/src/internal/symbol/iterator.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-export function getSymbolIterator(): symbol {
-  if (typeof Symbol !== 'function' || !Symbol.iterator) {
-    return '@@iterator' as any;
-  }
-
-  return Symbol.iterator;
-}
-
-export const iterator = getSymbolIterator();
-
-/**
- * @deprecated use {@link iterator} instead
- */
-export const $$iterator = iterator;
diff --git a/node_modules/rxjs/src/internal/symbol/observable.ts b/node_modules/rxjs/src/internal/symbol/observable.ts
deleted file mode 100644
index a321d71..0000000
--- a/node_modules/rxjs/src/internal/symbol/observable.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-/** Symbol.observable addition */
-/* Note: This will add Symbol.observable globally for all TypeScript users,
-  however, we are no longer polyfilling Symbol.observable */
-declare global {
-  interface SymbolConstructor {
-    readonly observable: symbol;
-  }
-}
-
-/** Symbol.observable or a string "@@observable". Used for interop */
-export const observable = (() => typeof Symbol === 'function' && Symbol.observable || '@@observable')();
diff --git a/node_modules/rxjs/src/internal/symbol/rxSubscriber.ts b/node_modules/rxjs/src/internal/symbol/rxSubscriber.ts
deleted file mode 100644
index 3a558e3..0000000
--- a/node_modules/rxjs/src/internal/symbol/rxSubscriber.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-/** @deprecated do not use, this is no longer checked by RxJS internals */
-export const rxSubscriber = (() =>
-  typeof Symbol === 'function'
-    ? Symbol('rxSubscriber')
-    : '@@rxSubscriber_' + Math.random())();
-
-/**
- * @deprecated use rxSubscriber instead
- */
-export const $$rxSubscriber = rxSubscriber;
diff --git a/node_modules/rxjs/src/internal/testing/ColdObservable.ts b/node_modules/rxjs/src/internal/testing/ColdObservable.ts
deleted file mode 100644
index 29f620e..0000000
--- a/node_modules/rxjs/src/internal/testing/ColdObservable.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { Observable } from '../Observable';
-import { Subscription } from '../Subscription';
-import { Scheduler } from '../Scheduler';
-import { TestMessage } from './TestMessage';
-import { SubscriptionLog } from './SubscriptionLog';
-import { SubscriptionLoggable } from './SubscriptionLoggable';
-import { applyMixins } from '../util/applyMixins';
-import { Subscriber } from '../Subscriber';
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class ColdObservable<T> extends Observable<T> implements SubscriptionLoggable {
-  public subscriptions: SubscriptionLog[] = [];
-  scheduler: Scheduler;
-  logSubscribedFrame: () => number;
-  logUnsubscribedFrame: (index: number) => void;
-
-  constructor(public messages: TestMessage[],
-              scheduler: Scheduler) {
-    super(function (this: Observable<T>, subscriber: Subscriber<any>) {
-      const observable: ColdObservable<T> = this as any;
-      const index = observable.logSubscribedFrame();
-      const subscription = new Subscription();
-      subscription.add(new Subscription(() => {
-        observable.logUnsubscribedFrame(index);
-      }));
-      observable.scheduleMessages(subscriber);
-      return subscription;
-    });
-    this.scheduler = scheduler;
-  }
-
-  scheduleMessages(subscriber: Subscriber<any>) {
-    const messagesLength = this.messages.length;
-    for (let i = 0; i < messagesLength; i++) {
-      const message = this.messages[i];
-      subscriber.add(
-        this.scheduler.schedule(({ message, subscriber }) => { message.notification.observe(subscriber); },
-          message.frame,
-          { message, subscriber })
-      );
-    }
-  }
-}
-applyMixins(ColdObservable, [SubscriptionLoggable]);
diff --git a/node_modules/rxjs/src/internal/testing/HotObservable.ts b/node_modules/rxjs/src/internal/testing/HotObservable.ts
deleted file mode 100644
index 34dcb60..0000000
--- a/node_modules/rxjs/src/internal/testing/HotObservable.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { Subject } from '../Subject';
-import { Subscriber } from '../Subscriber';
-import { Subscription } from '../Subscription';
-import { Scheduler } from '../Scheduler';
-import { TestMessage } from './TestMessage';
-import { SubscriptionLog } from './SubscriptionLog';
-import { SubscriptionLoggable } from './SubscriptionLoggable';
-import { applyMixins } from '../util/applyMixins';
-
-/**
- * We need this JSDoc comment for affecting ESDoc.
- * @ignore
- * @extends {Ignored}
- */
-export class HotObservable<T> extends Subject<T> implements SubscriptionLoggable {
-  public subscriptions: SubscriptionLog[] = [];
-  scheduler: Scheduler;
-  logSubscribedFrame: () => number;
-  logUnsubscribedFrame: (index: number) => void;
-
-  constructor(public messages: TestMessage[],
-              scheduler: Scheduler) {
-    super();
-    this.scheduler = scheduler;
-  }
-
-  /** @deprecated This is an internal implementation detail, do not use. */
-  _subscribe(subscriber: Subscriber<any>): Subscription {
-    const subject: HotObservable<T> = this;
-    const index = subject.logSubscribedFrame();
-    const subscription = new Subscription();
-    subscription.add(new Subscription(() => {
-      subject.logUnsubscribedFrame(index);
-    }));
-    subscription.add(super._subscribe(subscriber));
-    return subscription;
-  }
-
-  setup() {
-    const subject = this;
-    const messagesLength = subject.messages.length;
-    /* tslint:disable:no-var-keyword */
-    for (var i = 0; i < messagesLength; i++) {
-      (() => {
-        var message = subject.messages[i];
-   /* tslint:enable */
-        subject.scheduler.schedule(
-          () => { message.notification.observe(subject); },
-          message.frame
-        );
-      })();
-    }
-  }
-}
-applyMixins(HotObservable, [SubscriptionLoggable]);
diff --git a/node_modules/rxjs/src/internal/testing/SubscriptionLog.ts b/node_modules/rxjs/src/internal/testing/SubscriptionLog.ts
deleted file mode 100644
index 03858bf..0000000
--- a/node_modules/rxjs/src/internal/testing/SubscriptionLog.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export class SubscriptionLog {
-  constructor(public subscribedFrame: number,
-              public unsubscribedFrame: number = Number.POSITIVE_INFINITY) {
-  }
-}
\ No newline at end of file
diff --git a/node_modules/rxjs/src/internal/testing/SubscriptionLoggable.ts b/node_modules/rxjs/src/internal/testing/SubscriptionLoggable.ts
deleted file mode 100644
index 1724137..0000000
--- a/node_modules/rxjs/src/internal/testing/SubscriptionLoggable.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { Scheduler } from '../Scheduler';
-import { SubscriptionLog } from './SubscriptionLog';
-
-export class SubscriptionLoggable {
-  public subscriptions: SubscriptionLog[] = [];
-  scheduler: Scheduler;
-
-  logSubscribedFrame(): number {
-    this.subscriptions.push(new SubscriptionLog(this.scheduler.now()));
-    return this.subscriptions.length - 1;
-  }
-
-  logUnsubscribedFrame(index: number) {
-    const subscriptionLogs = this.subscriptions;
-    const oldSubscriptionLog = subscriptionLogs[index];
-    subscriptionLogs[index] = new SubscriptionLog(
-      oldSubscriptionLog.subscribedFrame,
-      this.scheduler.now()
-    );
-  }
-}
diff --git a/node_modules/rxjs/src/internal/testing/TestMessage.ts b/node_modules/rxjs/src/internal/testing/TestMessage.ts
deleted file mode 100644
index a95c71c..0000000
--- a/node_modules/rxjs/src/internal/testing/TestMessage.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { Notification } from '../Notification';
-
-export interface TestMessage {
-  frame: number;
-  notification: Notification<any>;
-  isGhost?: boolean;
-}
diff --git a/node_modules/rxjs/src/internal/testing/TestScheduler.ts b/node_modules/rxjs/src/internal/testing/TestScheduler.ts
deleted file mode 100644
index 7c7dc9e..0000000
--- a/node_modules/rxjs/src/internal/testing/TestScheduler.ts
+++ /dev/null
@@ -1,401 +0,0 @@
-import { Observable } from '../Observable';
-import { Notification } from '../Notification';
-import { ColdObservable } from './ColdObservable';
-import { HotObservable } from './HotObservable';
-import { TestMessage } from './TestMessage';
-import { SubscriptionLog } from './SubscriptionLog';
-import { Subscription } from '../Subscription';
-import { VirtualTimeScheduler, VirtualAction } from '../scheduler/VirtualTimeScheduler';
-import { AsyncScheduler } from '../scheduler/AsyncScheduler';
-
-const defaultMaxFrame: number = 750;
-
-export interface RunHelpers {
-  cold: typeof TestScheduler.prototype.createColdObservable;
-  hot: typeof TestScheduler.prototype.createHotObservable;
-  flush: typeof TestScheduler.prototype.flush;
-  expectObservable: typeof TestScheduler.prototype.expectObservable;
-  expectSubscriptions: typeof TestScheduler.prototype.expectSubscriptions;
-}
-
-interface FlushableTest {
-  ready: boolean;
-  actual?: any[];
-  expected?: any[];
-}
-
-export type observableToBeFn = (marbles: string, values?: any, errorValue?: any) => void;
-export type subscriptionLogsToBeFn = (marbles: string | string[]) => void;
-
-export class TestScheduler extends VirtualTimeScheduler {
-  public readonly hotObservables: HotObservable<any>[] = [];
-  public readonly coldObservables: ColdObservable<any>[] = [];
-  private flushTests: FlushableTest[] = [];
-  private runMode = false;
-
-  constructor(public assertDeepEqual: (actual: any, expected: any) => boolean | void) {
-    super(VirtualAction, defaultMaxFrame);
-  }
-
-  createTime(marbles: string): number {
-    const indexOf: number = marbles.indexOf('|');
-    if (indexOf === -1) {
-      throw new Error('marble diagram for time should have a completion marker "|"');
-    }
-    return indexOf * TestScheduler.frameTimeFactor;
-  }
-
-  /**
-   * @param marbles A diagram in the marble DSL. Letters map to keys in `values` if provided.
-   * @param values Values to use for the letters in `marbles`. If ommitted, the letters themselves are used.
-   * @param error The error to use for the `#` marble (if present).
-   */
-  createColdObservable<T = string>(marbles: string, values?: { [marble: string]: T }, error?: any): ColdObservable<T> {
-    if (marbles.indexOf('^') !== -1) {
-      throw new Error('cold observable cannot have subscription offset "^"');
-    }
-    if (marbles.indexOf('!') !== -1) {
-      throw new Error('cold observable cannot have unsubscription marker "!"');
-    }
-    const messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
-    const cold = new ColdObservable<T>(messages, this);
-    this.coldObservables.push(cold);
-    return cold;
-  }
-
-  /**
-   * @param marbles A diagram in the marble DSL. Letters map to keys in `values` if provided.
-   * @param values Values to use for the letters in `marbles`. If ommitted, the letters themselves are used.
-   * @param error The error to use for the `#` marble (if present).
-   */
-  createHotObservable<T = string>(marbles: string, values?: { [marble: string]: T }, error?: any): HotObservable<T> {
-    if (marbles.indexOf('!') !== -1) {
-      throw new Error('hot observable cannot have unsubscription marker "!"');
-    }
-    const messages = TestScheduler.parseMarbles(marbles, values, error, undefined, this.runMode);
-    const subject = new HotObservable<T>(messages, this);
-    this.hotObservables.push(subject);
-    return subject;
-  }
-
-  private materializeInnerObservable(observable: Observable<any>,
-                                     outerFrame: number): TestMessage[] {
-    const messages: TestMessage[] = [];
-    observable.subscribe((value) => {
-      messages.push({ frame: this.frame - outerFrame, notification: Notification.createNext(value) });
-    }, (err) => {
-      messages.push({ frame: this.frame - outerFrame, notification: Notification.createError(err) });
-    }, () => {
-      messages.push({ frame: this.frame - outerFrame, notification: Notification.createComplete() });
-    });
-    return messages;
-  }
-
-  expectObservable(observable: Observable<any>,
-                   subscriptionMarbles: string = null): ({ toBe: observableToBeFn }) {
-    const actual: TestMessage[] = [];
-    const flushTest: FlushableTest = { actual, ready: false };
-    const subscriptionParsed = TestScheduler.parseMarblesAsSubscriptions(subscriptionMarbles, this.runMode);
-    const subscriptionFrame = subscriptionParsed.subscribedFrame === Number.POSITIVE_INFINITY ?
-      0 : subscriptionParsed.subscribedFrame;
-    const unsubscriptionFrame = subscriptionParsed.unsubscribedFrame;
-    let subscription: Subscription;
-
-    this.schedule(() => {
-      subscription = observable.subscribe(x => {
-        let value = x;
-        // Support Observable-of-Observables
-        if (x instanceof Observable) {
-          value = this.materializeInnerObservable(value, this.frame);
-        }
-        actual.push({ frame: this.frame, notification: Notification.createNext(value) });
-      }, (err) => {
-        actual.push({ frame: this.frame, notification: Notification.createError(err) });
-      }, () => {
-        actual.push({ frame: this.frame, notification: Notification.createComplete() });
-      });
-    }, subscriptionFrame);
-
-    if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {
-      this.schedule(() => subscription.unsubscribe(), unsubscriptionFrame);
-    }
-
-    this.flushTests.push(flushTest);
-    const { runMode } = this;
-
-    return {
-      toBe(marbles: string, values?: any, errorValue?: any) {
-        flushTest.ready = true;
-        flushTest.expected = TestScheduler.parseMarbles(marbles, values, errorValue, true, runMode);
-      }
-    };
-  }
-
-  expectSubscriptions(actualSubscriptionLogs: SubscriptionLog[]): ({ toBe: subscriptionLogsToBeFn }) {
-    const flushTest: FlushableTest = { actual: actualSubscriptionLogs, ready: false };
-    this.flushTests.push(flushTest);
-    const { runMode } = this;
-    return {
-      toBe(marbles: string | string[]) {
-        const marblesArray: string[] = (typeof marbles === 'string') ? [marbles] : marbles;
-        flushTest.ready = true;
-        flushTest.expected = marblesArray.map(marbles =>
-          TestScheduler.parseMarblesAsSubscriptions(marbles, runMode)
-        );
-      }
-    };
-  }
-
-  flush() {
-    const hotObservables = this.hotObservables;
-    while (hotObservables.length > 0) {
-      hotObservables.shift().setup();
-    }
-
-    super.flush();
-
-    this.flushTests = this.flushTests.filter(test => {
-      if (test.ready) {
-        this.assertDeepEqual(test.actual, test.expected);
-        return false;
-      }
-      return true;
-    });
-  }
-
-  /** @nocollapse */
-  static parseMarblesAsSubscriptions(marbles: string, runMode = false): SubscriptionLog {
-    if (typeof marbles !== 'string') {
-      return new SubscriptionLog(Number.POSITIVE_INFINITY);
-    }
-    const len = marbles.length;
-    let groupStart = -1;
-    let subscriptionFrame = Number.POSITIVE_INFINITY;
-    let unsubscriptionFrame = Number.POSITIVE_INFINITY;
-    let frame = 0;
-
-    for (let i = 0; i < len; i++) {
-      let nextFrame = frame;
-      const advanceFrameBy = (count: number) => {
-        nextFrame += count * this.frameTimeFactor;
-      };
-      const c = marbles[i];
-      switch (c) {
-        case ' ':
-          // Whitespace no longer advances time
-          if (!runMode) {
-            advanceFrameBy(1);
-          }
-          break;
-        case '-':
-          advanceFrameBy(1);
-          break;
-        case '(':
-          groupStart = frame;
-          advanceFrameBy(1);
-          break;
-        case ')':
-          groupStart = -1;
-          advanceFrameBy(1);
-          break;
-        case '^':
-          if (subscriptionFrame !== Number.POSITIVE_INFINITY) {
-            throw new Error('found a second subscription point \'^\' in a ' +
-              'subscription marble diagram. There can only be one.');
-          }
-          subscriptionFrame = groupStart > -1 ? groupStart : frame;
-          advanceFrameBy(1);
-          break;
-        case '!':
-          if (unsubscriptionFrame !== Number.POSITIVE_INFINITY) {
-            throw new Error('found a second subscription point \'^\' in a ' +
-              'subscription marble diagram. There can only be one.');
-          }
-          unsubscriptionFrame = groupStart > -1 ? groupStart : frame;
-          break;
-        default:
-          // time progression syntax
-          if (runMode && c.match(/^[0-9]$/)) {
-            // Time progression must be preceeded by at least one space
-            // if it's not at the beginning of the diagram
-            if (i === 0 || marbles[i - 1] === ' ') {
-              const buffer = marbles.slice(i);
-              const match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
-              if (match) {
-                i += match[0].length - 1;
-                const duration = parseFloat(match[1]);
-                const unit = match[2];
-                let durationInMs: number;
-
-                switch (unit) {
-                  case 'ms':
-                    durationInMs = duration;
-                    break;
-                  case 's':
-                    durationInMs = duration * 1000;
-                    break;
-                  case 'm':
-                    durationInMs = duration * 1000 * 60;
-                    break;
-                  default:
-                    break;
-                }
-
-                advanceFrameBy(durationInMs / this.frameTimeFactor);
-                break;
-              }
-            }
-          }
-
-          throw new Error('there can only be \'^\' and \'!\' markers in a ' +
-            'subscription marble diagram. Found instead \'' + c + '\'.');
-      }
-
-      frame = nextFrame;
-    }
-
-    if (unsubscriptionFrame < 0) {
-      return new SubscriptionLog(subscriptionFrame);
-    } else {
-      return new SubscriptionLog(subscriptionFrame, unsubscriptionFrame);
-    }
-  }
-
-  /** @nocollapse */
-  static parseMarbles(marbles: string,
-                      values?: any,
-                      errorValue?: any,
-                      materializeInnerObservables: boolean = false,
-                      runMode = false): TestMessage[] {
-    if (marbles.indexOf('!') !== -1) {
-      throw new Error('conventional marble diagrams cannot have the ' +
-        'unsubscription marker "!"');
-    }
-    const len = marbles.length;
-    const testMessages: TestMessage[] = [];
-    const subIndex = runMode ? marbles.replace(/^[ ]+/, '').indexOf('^') : marbles.indexOf('^');
-    let frame = subIndex === -1 ? 0 : (subIndex * -this.frameTimeFactor);
-    const getValue = typeof values !== 'object' ?
-      (x: any) => x :
-      (x: any) => {
-        // Support Observable-of-Observables
-        if (materializeInnerObservables && values[x] instanceof ColdObservable) {
-          return values[x].messages;
-        }
-        return values[x];
-      };
-    let groupStart = -1;
-
-    for (let i = 0; i < len; i++) {
-      let nextFrame = frame;
-      const advanceFrameBy = (count: number) => {
-        nextFrame += count * this.frameTimeFactor;
-      };
-
-      let notification: Notification<any>;
-      const c = marbles[i];
-      switch (c) {
-        case ' ':
-          // Whitespace no longer advances time
-          if (!runMode) {
-            advanceFrameBy(1);
-          }
-          break;
-        case '-':
-          advanceFrameBy(1);
-          break;
-        case '(':
-          groupStart = frame;
-          advanceFrameBy(1);
-          break;
-        case ')':
-          groupStart = -1;
-          advanceFrameBy(1);
-          break;
-        case '|':
-          notification = Notification.createComplete();
-          advanceFrameBy(1);
-          break;
-        case '^':
-          advanceFrameBy(1);
-          break;
-        case '#':
-          notification = Notification.createError(errorValue || 'error');
-          advanceFrameBy(1);
-          break;
-        default:
-          // Might be time progression syntax, or a value literal
-          if (runMode && c.match(/^[0-9]$/)) {
-            // Time progression must be preceeded by at least one space
-            // if it's not at the beginning of the diagram
-            if (i === 0 || marbles[i - 1] === ' ') {
-              const buffer = marbles.slice(i);
-              const match = buffer.match(/^([0-9]+(?:\.[0-9]+)?)(ms|s|m) /);
-              if (match) {
-                i += match[0].length - 1;
-                const duration = parseFloat(match[1]);
-                const unit = match[2];
-                let durationInMs: number;
-
-                switch (unit) {
-                  case 'ms':
-                    durationInMs = duration;
-                    break;
-                  case 's':
-                    durationInMs = duration * 1000;
-                    break;
-                  case 'm':
-                    durationInMs = duration * 1000 * 60;
-                    break;
-                  default:
-                    break;
-                }
-
-                advanceFrameBy(durationInMs / this.frameTimeFactor);
-                break;
-              }
-            }
-          }
-
-          notification = Notification.createNext(getValue(c));
-          advanceFrameBy(1);
-          break;
-      }
-
-      if (notification) {
-        testMessages.push({ frame: groupStart > -1 ? groupStart : frame, notification });
-      }
-
-      frame = nextFrame;
-    }
-    return testMessages;
-  }
-
-  run<T>(callback: (helpers: RunHelpers) => T): T {
-    const prevFrameTimeFactor = TestScheduler.frameTimeFactor;
-    const prevMaxFrames = this.maxFrames;
-
-    TestScheduler.frameTimeFactor = 1;
-    this.maxFrames = Number.POSITIVE_INFINITY;
-    this.runMode = true;
-    AsyncScheduler.delegate = this;
-
-    const helpers = {
-      cold: this.createColdObservable.bind(this),
-      hot: this.createHotObservable.bind(this),
-      flush: this.flush.bind(this),
-      expectObservable: this.expectObservable.bind(this),
-      expectSubscriptions: this.expectSubscriptions.bind(this),
-    };
-    try {
-      const ret = callback(helpers);
-      this.flush();
-      return ret;
-    } finally {
-      TestScheduler.frameTimeFactor = prevFrameTimeFactor;
-      this.maxFrames = prevMaxFrames;
-      this.runMode = false;
-      AsyncScheduler.delegate = undefined;
-    }
-  }
-}
diff --git a/node_modules/rxjs/src/internal/types.ts b/node_modules/rxjs/src/internal/types.ts
deleted file mode 100644
index e532dc8..0000000
--- a/node_modules/rxjs/src/internal/types.ts
+++ /dev/null
@@ -1,103 +0,0 @@
-import { Observable } from './Observable';
-import { Subscription } from './Subscription';
-
-/** OPERATOR INTERFACES */
-
-export interface UnaryFunction<T, R> { (source: T): R; }
-
-export interface OperatorFunction<T, R> extends UnaryFunction<Observable<T>, Observable<R>> {}
-
-export type FactoryOrValue<T> = T | (() => T);
-
-export interface MonoTypeOperatorFunction<T> extends OperatorFunction<T, T> {}
-
-export interface Timestamp<T> {
-  value: T;
-  timestamp: number;
-}
-
-export interface TimeInterval<T> {
-  value: T;
-  interval: number;
-}
-
-/** SUBSCRIPTION INTERFACES */
-
-export interface Unsubscribable {
-  unsubscribe(): void;
-}
-
-export type TeardownLogic = Unsubscribable | Function | void;
-
-export interface SubscriptionLike extends Unsubscribable {
-  unsubscribe(): void;
-  readonly closed: boolean;
-}
-
-export type SubscribableOrPromise<T> = Subscribable<T> | Subscribable<never> | PromiseLike<T> | InteropObservable<T>;
-
-/** OBSERVABLE INTERFACES */
-
-export interface Subscribable<T> {
-  subscribe(observer?: PartialObserver<T>): Unsubscribable;
-  /** @deprecated Use an observer instead of a complete callback */
-  subscribe(next: null | undefined, error: null | undefined, complete: () => void): Unsubscribable;
-  /** @deprecated Use an observer instead of an error callback */
-  subscribe(next: null | undefined, error: (error: any) => void, complete?: () => void): Unsubscribable;
-  /** @deprecated Use an observer instead of a complete callback */
-  subscribe(next: (value: T) => void, error: null | undefined, complete: () => void): Unsubscribable;
-  subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Unsubscribable;
-}
-
-export type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T> | Iterable<T>;
-
-/** @deprecated use {@link InteropObservable } */
-export type ObservableLike<T> = InteropObservable<T>;
-
-export type InteropObservable<T> = { [Symbol.observable]: () => Subscribable<T>; };
-
-/** OBSERVER INTERFACES */
-
-export interface NextObserver<T> {
-  closed?: boolean;
-  next: (value: T) => void;
-  error?: (err: any) => void;
-  complete?: () => void;
-}
-
-export interface ErrorObserver<T> {
-  closed?: boolean;
-  next?: (value: T) => void;
-  error: (err: any) => void;
-  complete?: () => void;
-}
-
-export interface CompletionObserver<T> {
-  closed?: boolean;
-  next?: (value: T) => void;
-  error?: (err: any) => void;
-  complete: () => void;
-}
-
-export type PartialObserver<T> = NextObserver<T> | ErrorObserver<T> | CompletionObserver<T>;
-
-export interface Observer<T> {
-  closed?: boolean;
-  next: (value: T) => void;
-  error: (err: any) => void;
-  complete: () => void;
-}
-
-/** SCHEDULER INTERFACES */
-
-export interface SchedulerLike {
-  now(): number;
-  schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay?: number, state?: T): Subscription;
-}
-export interface SchedulerAction<T> extends Subscription {
-  schedule(state?: T, delay?: number): Subscription;
-}
-
-export type ObservedValueOf<O> = O extends ObservableInput<infer T> ? T : never;
-
-export type ObservedValuesFromArray<X> = X extends Array<ObservableInput<infer T>> ? T : never;
diff --git a/node_modules/rxjs/src/internal/umd.ts b/node_modules/rxjs/src/internal/umd.ts
deleted file mode 100644
index e81c574..0000000
--- a/node_modules/rxjs/src/internal/umd.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-  NOTE: This is the global export file for rxjs v6 and higher.
- */
-
-/* rxjs */
-export * from '../index';
-
-/* rxjs.operators */
-import * as _operators from '../operators/index';
-export const operators = _operators;
-
-/* rxjs.testing */
-import * as _testing from '../testing/index';
-export const testing = _testing;
-
-/* rxjs.ajax */
-import * as _ajax from '../ajax/index';
-export const ajax = _ajax;
-
-/* rxjs.webSocket */
-import * as _webSocket from '../webSocket/index';
-export const webSocket = _webSocket;
-
-/* rxjs.fetch */
-import * as _fetch from '../fetch/index';
-export const fetch = _fetch;
diff --git a/node_modules/rxjs/src/internal/util/ArgumentOutOfRangeError.ts b/node_modules/rxjs/src/internal/util/ArgumentOutOfRangeError.ts
deleted file mode 100644
index b9bd72d..0000000
--- a/node_modules/rxjs/src/internal/util/ArgumentOutOfRangeError.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-export interface ArgumentOutOfRangeError extends Error {
-}
-
-export interface ArgumentOutOfRangeErrorCtor {
-  new(): ArgumentOutOfRangeError;
-}
-
-const ArgumentOutOfRangeErrorImpl = (() => {
-  function ArgumentOutOfRangeErrorImpl(this: any) {
-    Error.call(this);
-    this.message = 'argument out of range';
-    this.name = 'ArgumentOutOfRangeError';
-    return this;
-  }
-
-  ArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype);
-
-  return ArgumentOutOfRangeErrorImpl;
-})();
-
-/**
- * An error thrown when an element was queried at a certain index of an
- * Observable, but no such index or position exists in that sequence.
- *
- * @see {@link elementAt}
- * @see {@link take}
- * @see {@link takeLast}
- *
- * @class ArgumentOutOfRangeError
- */
-export const ArgumentOutOfRangeError: ArgumentOutOfRangeErrorCtor = ArgumentOutOfRangeErrorImpl as any;
\ No newline at end of file
diff --git a/node_modules/rxjs/src/internal/util/EmptyError.ts b/node_modules/rxjs/src/internal/util/EmptyError.ts
deleted file mode 100644
index 6eb1d07..0000000
--- a/node_modules/rxjs/src/internal/util/EmptyError.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-export interface EmptyError extends Error {
-}
-
-export interface EmptyErrorCtor {
-  new(): EmptyError;
-}
-
-const EmptyErrorImpl = (() => {
-  function EmptyErrorImpl(this: any) {
-    Error.call(this);
-    this.message = 'no elements in sequence';
-    this.name = 'EmptyError';
-    return this;
-  }
-
-  EmptyErrorImpl.prototype = Object.create(Error.prototype);
-
-  return EmptyErrorImpl;
-})();
-
-/**
- * An error thrown when an Observable or a sequence was queried but has no
- * elements.
- *
- * @see {@link first}
- * @see {@link last}
- * @see {@link single}
- *
- * @class EmptyError
- */
-export const EmptyError: EmptyErrorCtor = EmptyErrorImpl as any;
\ No newline at end of file
diff --git a/node_modules/rxjs/src/internal/util/Immediate.ts b/node_modules/rxjs/src/internal/util/Immediate.ts
deleted file mode 100644
index ba29661..0000000
--- a/node_modules/rxjs/src/internal/util/Immediate.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-let nextHandle = 1;
-const RESOLVED = (() => Promise.resolve())();
-const activeHandles: { [key: number]: any } = {};
-
-/**
- * Finds the handle in the list of active handles, and removes it.
- * Returns `true` if found, `false` otherwise. Used both to clear
- * Immediate scheduled tasks, and to identify if a task should be scheduled.
- */
-function findAndClearHandle(handle: number): boolean {
-  if (handle in activeHandles) {
-    delete activeHandles[handle];
-    return true;
-  }
-  return false;
-}
-
-/**
- * Helper functions to schedule and unschedule microtasks.
- */
-export const Immediate = {
-  setImmediate(cb: () => void): number {
-    const handle = nextHandle++;
-    activeHandles[handle] = true;
-    RESOLVED.then(() => findAndClearHandle(handle) && cb());
-    return handle;
-  },
-
-  clearImmediate(handle: number): void {
-    findAndClearHandle(handle);
-  },
-};
-
-/**
- * Used for internal testing purposes only. Do not export from library.
- */
-export const TestTools = {
-  pending() {
-    return Object.keys(activeHandles).length;
-  }
-};
diff --git a/node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts b/node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts
deleted file mode 100644
index 45d2066..0000000
--- a/node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-export interface ObjectUnsubscribedError extends Error {
-}
-
-export interface ObjectUnsubscribedErrorCtor {
-  new(): ObjectUnsubscribedError;
-}
-
-const ObjectUnsubscribedErrorImpl = (() => {
-  function ObjectUnsubscribedErrorImpl(this: any) {
-    Error.call(this);
-    this.message = 'object unsubscribed';
-    this.name = 'ObjectUnsubscribedError';
-    return this;
-  }
-
-  ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);
-
-  return ObjectUnsubscribedErrorImpl;
-})();
-
-/**
- * An error thrown when an action is invalid because the object has been
- * unsubscribed.
- *
- * @see {@link Subject}
- * @see {@link BehaviorSubject}
- *
- * @class ObjectUnsubscribedError
- */
-export const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = ObjectUnsubscribedErrorImpl as any;
\ No newline at end of file
diff --git a/node_modules/rxjs/src/internal/util/TimeoutError.ts b/node_modules/rxjs/src/internal/util/TimeoutError.ts
deleted file mode 100644
index fd0ae50..0000000
--- a/node_modules/rxjs/src/internal/util/TimeoutError.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-export interface TimeoutError extends Error {
-}
-
-export interface TimeoutErrorCtor {
-  new(): TimeoutError;
-}
-
-const TimeoutErrorImpl = (() => {
-  function TimeoutErrorImpl(this: any) {
-    Error.call(this);
-    this.message = 'Timeout has occurred';
-    this.name = 'TimeoutError';
-    return this;
-  }
-
-  TimeoutErrorImpl.prototype = Object.create(Error.prototype);
-
-  return TimeoutErrorImpl;
-})();
-
-/**
- * An error thrown when duetime elapses.
- *
- * @see {@link operators/timeout}
- *
- * @class TimeoutError
- */
-export const TimeoutError: TimeoutErrorCtor = TimeoutErrorImpl as any;
diff --git a/node_modules/rxjs/src/internal/util/UnsubscriptionError.ts b/node_modules/rxjs/src/internal/util/UnsubscriptionError.ts
deleted file mode 100644
index 02f1a0d..0000000
--- a/node_modules/rxjs/src/internal/util/UnsubscriptionError.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-export interface UnsubscriptionError extends Error {
-  readonly errors: any[];
-}
-
-export interface UnsubscriptionErrorCtor {
-  new(errors: any[]): UnsubscriptionError;
-}
-
-const UnsubscriptionErrorImpl = (() => {
-  function UnsubscriptionErrorImpl(this: any, errors: any[]) {
-    Error.call(this);
-    this.message = errors ?
-      `${errors.length} errors occurred during unsubscription:
-${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\n  ')}` : '';
-    this.name = 'UnsubscriptionError';
-    this.errors = errors;
-    return this;
-  }
-
-  UnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);
-
-  return UnsubscriptionErrorImpl;
-})();
-
-/**
- * An error thrown when one or more errors have occurred during the
- * `unsubscribe` of a {@link Subscription}.
- */
-export const UnsubscriptionError: UnsubscriptionErrorCtor = UnsubscriptionErrorImpl as any;
\ No newline at end of file
diff --git a/node_modules/rxjs/src/internal/util/applyMixins.ts b/node_modules/rxjs/src/internal/util/applyMixins.ts
deleted file mode 100644
index 7c1ed24..0000000
--- a/node_modules/rxjs/src/internal/util/applyMixins.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export function applyMixins(derivedCtor: any, baseCtors: any[]) {
-  for (let i = 0, len = baseCtors.length; i < len; i++) {
-    const baseCtor = baseCtors[i];
-    const propertyKeys = Object.getOwnPropertyNames(baseCtor.prototype);
-    for (let j = 0, len2 = propertyKeys.length; j < len2; j++) {
-      const name = propertyKeys[j];
-      derivedCtor.prototype[name] = baseCtor.prototype[name];
-    }
-  }
-}
\ No newline at end of file
diff --git a/node_modules/rxjs/src/internal/util/canReportError.ts b/node_modules/rxjs/src/internal/util/canReportError.ts
deleted file mode 100644
index deed48e..0000000
--- a/node_modules/rxjs/src/internal/util/canReportError.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { Subject } from '../Subject';
-
-/**
- * Determines whether the ErrorObserver is closed or stopped or has a
- * destination that is closed or stopped - in which case errors will
- * need to be reported via a different mechanism.
- * @param observer the observer
- */
-export function canReportError(observer: Subscriber<any> | Subject<any>): boolean {
-  while (observer) {
-    const { closed, destination, isStopped } = observer as any;
-    if (closed || isStopped) {
-      return false;
-    } else if (destination && destination instanceof Subscriber) {
-      observer = destination;
-    } else {
-      observer = null;
-    }
-  }
-  return true;
-}
diff --git a/node_modules/rxjs/src/internal/util/errorObject.ts b/node_modules/rxjs/src/internal/util/errorObject.ts
deleted file mode 100644
index 63e2c7f..0000000
--- a/node_modules/rxjs/src/internal/util/errorObject.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-// typeof any so that it we don't have to cast when comparing a result to the error object
-export const errorObject: any = { e: {} };
\ No newline at end of file
diff --git a/node_modules/rxjs/src/internal/util/hostReportError.ts b/node_modules/rxjs/src/internal/util/hostReportError.ts
deleted file mode 100644
index 6d0082a..0000000
--- a/node_modules/rxjs/src/internal/util/hostReportError.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Throws an error on another job so that it's picked up by the runtime's
- * uncaught error handling mechanism.
- * @param err the error to throw
- */
-export function hostReportError(err: any) {
-  setTimeout(() => { throw err; }, 0);
-}
\ No newline at end of file
diff --git a/node_modules/rxjs/src/internal/util/identity.ts b/node_modules/rxjs/src/internal/util/identity.ts
deleted file mode 100644
index 6589842..0000000
--- a/node_modules/rxjs/src/internal/util/identity.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export function identity<T>(x: T): T {
-  return x;
-}
diff --git a/node_modules/rxjs/src/internal/util/isArray.ts b/node_modules/rxjs/src/internal/util/isArray.ts
deleted file mode 100644
index 092f8a2..0000000
--- a/node_modules/rxjs/src/internal/util/isArray.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const isArray = (() => Array.isArray || (<T>(x: any): x is T[] => x && typeof x.length === 'number'))();
diff --git a/node_modules/rxjs/src/internal/util/isArrayLike.ts b/node_modules/rxjs/src/internal/util/isArrayLike.ts
deleted file mode 100644
index 6f634d4..0000000
--- a/node_modules/rxjs/src/internal/util/isArrayLike.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const isArrayLike = (<T>(x: any): x is ArrayLike<T> => x && typeof x.length === 'number' && typeof x !== 'function');
\ No newline at end of file
diff --git a/node_modules/rxjs/src/internal/util/isDate.ts b/node_modules/rxjs/src/internal/util/isDate.ts
deleted file mode 100644
index b18edf0..0000000
--- a/node_modules/rxjs/src/internal/util/isDate.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export function isDate(value: any): value is Date {
-  return value instanceof Date && !isNaN(+value);
-}
diff --git a/node_modules/rxjs/src/internal/util/isFunction.ts b/node_modules/rxjs/src/internal/util/isFunction.ts
deleted file mode 100644
index 287e887..0000000
--- a/node_modules/rxjs/src/internal/util/isFunction.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export function isFunction(x: any): x is Function {
-  return typeof x === 'function';
-}
diff --git a/node_modules/rxjs/src/internal/util/isInteropObservable.ts b/node_modules/rxjs/src/internal/util/isInteropObservable.ts
deleted file mode 100644
index fbd8fc4..0000000
--- a/node_modules/rxjs/src/internal/util/isInteropObservable.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { InteropObservable } from '../types';
-import { observable as Symbol_observable } from '../symbol/observable';
-
-/** Identifies an input as being Observable (but not necessary an Rx Observable) */
-export function isInteropObservable(input: any): input is InteropObservable<any> {
-  return input && typeof input[Symbol_observable] === 'function';
-}
diff --git a/node_modules/rxjs/src/internal/util/isIterable.ts b/node_modules/rxjs/src/internal/util/isIterable.ts
deleted file mode 100644
index fc8fd07..0000000
--- a/node_modules/rxjs/src/internal/util/isIterable.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { iterator as Symbol_iterator } from '../symbol/iterator';
-
-/** Identifies an input as being an Iterable */
-export function isIterable(input: any): input is Iterable<any> {
-  return input && typeof input[Symbol_iterator] === 'function';
-}
diff --git a/node_modules/rxjs/src/internal/util/isNumeric.ts b/node_modules/rxjs/src/internal/util/isNumeric.ts
deleted file mode 100644
index 7983f47..0000000
--- a/node_modules/rxjs/src/internal/util/isNumeric.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { isArray } from './isArray';
-
-export function isNumeric(val: any): val is number | string {
-  // parseFloat NaNs numeric-cast false positives (null|true|false|"")
-  // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
-  // subtraction forces infinities to NaN
-  // adding 1 corrects loss of precision from parseFloat (#15100)
-  return !isArray(val) && (val - parseFloat(val) + 1) >= 0;
-}
diff --git a/node_modules/rxjs/src/internal/util/isObject.ts b/node_modules/rxjs/src/internal/util/isObject.ts
deleted file mode 100644
index 536a52e..0000000
--- a/node_modules/rxjs/src/internal/util/isObject.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export function isObject(x: any): x is Object {
-  return x !== null && typeof x === 'object';
-}
diff --git a/node_modules/rxjs/src/internal/util/isObservable.ts b/node_modules/rxjs/src/internal/util/isObservable.ts
deleted file mode 100644
index f3df524..0000000
--- a/node_modules/rxjs/src/internal/util/isObservable.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Observable } from '../Observable';
-import { ObservableInput } from '../types';
-
-/**
- * Tests to see if the object is an RxJS {@link Observable}
- * @param obj the object to test
- */
-export function isObservable<T>(obj: any): obj is Observable<T> {
-  return !!obj && (obj instanceof Observable || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));
-}
diff --git a/node_modules/rxjs/src/internal/util/isPromise.ts b/node_modules/rxjs/src/internal/util/isPromise.ts
deleted file mode 100644
index 20ee36d..0000000
--- a/node_modules/rxjs/src/internal/util/isPromise.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Tests to see if the object is an ES2015 (ES6) Promise
- * @see {@link https://www.ecma-international.org/ecma-262/6.0/#sec-promise-objects}
- * @param value the object to test
- */
-export function isPromise(value: any): value is PromiseLike<any> {
-  return !!value && typeof (<any>value).subscribe !== 'function' && typeof (value as any).then === 'function';
-}
diff --git a/node_modules/rxjs/src/internal/util/isScheduler.ts b/node_modules/rxjs/src/internal/util/isScheduler.ts
deleted file mode 100644
index 594f195..0000000
--- a/node_modules/rxjs/src/internal/util/isScheduler.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { SchedulerLike } from '../types';
-
-export function isScheduler(value: any): value is SchedulerLike {
-  return value && typeof (<any>value).schedule === 'function';
-}
diff --git a/node_modules/rxjs/src/internal/util/noop.ts b/node_modules/rxjs/src/internal/util/noop.ts
deleted file mode 100644
index fc857f2..0000000
--- a/node_modules/rxjs/src/internal/util/noop.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-/* tslint:disable:no-empty */
-export function noop() { }
diff --git a/node_modules/rxjs/src/internal/util/not.ts b/node_modules/rxjs/src/internal/util/not.ts
deleted file mode 100644
index e5e6952..0000000
--- a/node_modules/rxjs/src/internal/util/not.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export function not(pred: Function, thisArg: any): Function {
-  function notPred(): any {
-    return !((<any> notPred).pred.apply((<any> notPred).thisArg, arguments));
-  }
-  (<any> notPred).pred = pred;
-  (<any> notPred).thisArg = thisArg;
-  return notPred;
-}
\ No newline at end of file
diff --git a/node_modules/rxjs/src/internal/util/pipe.ts b/node_modules/rxjs/src/internal/util/pipe.ts
deleted file mode 100644
index 206f566..0000000
--- a/node_modules/rxjs/src/internal/util/pipe.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { noop } from './noop';
-import { UnaryFunction } from '../types';
-
-/* tslint:disable:max-line-length */
-export function pipe<T>(): UnaryFunction<T, T>;
-export function pipe<T, A>(fn1: UnaryFunction<T, A>): UnaryFunction<T, A>;
-export function pipe<T, A, B>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>): UnaryFunction<T, B>;
-export function pipe<T, A, B, C>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>): UnaryFunction<T, C>;
-export function pipe<T, A, B, C, D>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>): UnaryFunction<T, D>;
-export function pipe<T, A, B, C, D, E>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>, fn5: UnaryFunction<D, E>): UnaryFunction<T, E>;
-export function pipe<T, A, B, C, D, E, F>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>, fn5: UnaryFunction<D, E>, fn6: UnaryFunction<E, F>): UnaryFunction<T, F>;
-export function pipe<T, A, B, C, D, E, F, G>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>, fn5: UnaryFunction<D, E>, fn6: UnaryFunction<E, F>, fn7: UnaryFunction<F, G>): UnaryFunction<T, G>;
-export function pipe<T, A, B, C, D, E, F, G, H>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>, fn5: UnaryFunction<D, E>, fn6: UnaryFunction<E, F>, fn7: UnaryFunction<F, G>, fn8: UnaryFunction<G, H>): UnaryFunction<T, H>;
-export function pipe<T, A, B, C, D, E, F, G, H, I>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>, fn5: UnaryFunction<D, E>, fn6: UnaryFunction<E, F>, fn7: UnaryFunction<F, G>, fn8: UnaryFunction<G, H>, fn9: UnaryFunction<H, I>): UnaryFunction<T, I>;
-export function pipe<T, A, B, C, D, E, F, G, H, I>(fn1: UnaryFunction<T, A>, fn2: UnaryFunction<A, B>, fn3: UnaryFunction<B, C>, fn4: UnaryFunction<C, D>, fn5: UnaryFunction<D, E>, fn6: UnaryFunction<E, F>, fn7: UnaryFunction<F, G>, fn8: UnaryFunction<G, H>, fn9: UnaryFunction<H, I>, ...fns: UnaryFunction<any, any>[]): UnaryFunction<T, {}>;
-/* tslint:enable:max-line-length */
-
-export function pipe(...fns: Array<UnaryFunction<any, any>>): UnaryFunction<any, any> {
-  return pipeFromArray(fns);
-}
-
-/** @internal */
-export function pipeFromArray<T, R>(fns: Array<UnaryFunction<T, R>>): UnaryFunction<T, R> {
-  if (!fns) {
-    return noop as UnaryFunction<any, any>;
-  }
-
-  if (fns.length === 1) {
-    return fns[0];
-  }
-
-  return function piped(input: T): R {
-    return fns.reduce((prev: any, fn: UnaryFunction<T, R>) => fn(prev), input as any);
-  };
-}
diff --git a/node_modules/rxjs/src/internal/util/root.ts b/node_modules/rxjs/src/internal/util/root.ts
deleted file mode 100644
index 7ab51e5..0000000
--- a/node_modules/rxjs/src/internal/util/root.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-declare let global: any;
-
-/**
- * @license
- * Copyright Google Inc. All Rights Reserved.
- *
- * Use of this source code is governed by an MIT-style license that can be
- * found in the LICENSE file at https://angular.io/license
- */
-
-declare var WorkerGlobalScope: any;
-// CommonJS / Node have global context exposed as "global" variable.
-// We don't want to include the whole node.d.ts this this compilation unit so we'll just fake
-// the global "global" var for now.
-
-const __window = typeof window !== 'undefined' && window;
-const __self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&
-    self instanceof WorkerGlobalScope && self;
-const __global = typeof global !== 'undefined' && global;
-const _root: any = __window || __global || __self;
-
-// Workaround Closure Compiler restriction: The body of a goog.module cannot use throw.
-// This is needed when used with angular/tsickle which inserts a goog.module statement.
-// Wrap in IIFE
-(function () {
-  if (!_root) {
-    throw new Error('RxJS could not find any global context (window, self, global)');
-  }
-})();
-
-export { _root as root };
\ No newline at end of file
diff --git a/node_modules/rxjs/src/internal/util/subscribeTo.ts b/node_modules/rxjs/src/internal/util/subscribeTo.ts
deleted file mode 100644
index c872f6a..0000000
--- a/node_modules/rxjs/src/internal/util/subscribeTo.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { ObservableInput } from '../types';
-import { subscribeToArray } from './subscribeToArray';
-import { subscribeToPromise } from './subscribeToPromise';
-import { subscribeToIterable } from './subscribeToIterable';
-import { subscribeToObservable } from './subscribeToObservable';
-import { isArrayLike } from './isArrayLike';
-import { isPromise } from './isPromise';
-import { isObject } from './isObject';
-import { iterator as Symbol_iterator } from '../symbol/iterator';
-import { observable as Symbol_observable } from '../symbol/observable';
-import { Subscription } from '../Subscription';
-import { Subscriber } from '../Subscriber';
-
-export const subscribeTo = <T>(result: ObservableInput<T>): (subscriber: Subscriber<T>) => Subscription | void => {
-  if (!!result && typeof result[Symbol_observable] === 'function') {
-    return subscribeToObservable(result as any);
-  } else if (isArrayLike(result)) {
-    return subscribeToArray(result);
-  } else if (isPromise(result)) {
-    return subscribeToPromise(result as Promise<any>);
-  } else if (!!result && typeof result[Symbol_iterator] === 'function') {
-    return subscribeToIterable(result as any);
-  } else {
-    const value = isObject(result) ? 'an invalid object' : `'${result}'`;
-    const msg = `You provided ${value} where a stream was expected.`
-      + ' You can provide an Observable, Promise, Array, or Iterable.';
-    throw new TypeError(msg);
-  }
-};
diff --git a/node_modules/rxjs/src/internal/util/subscribeToArray.ts b/node_modules/rxjs/src/internal/util/subscribeToArray.ts
deleted file mode 100644
index 0ca5294..0000000
--- a/node_modules/rxjs/src/internal/util/subscribeToArray.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Subscriber } from '../Subscriber';
-
-/**
- * Subscribes to an ArrayLike with a subscriber
- * @param array The array or array-like to subscribe to
- */
-export const subscribeToArray = <T>(array: ArrayLike<T>) => (subscriber: Subscriber<T>) => {
-  for (let i = 0, len = array.length; i < len && !subscriber.closed; i++) {
-    subscriber.next(array[i]);
-  }
-  subscriber.complete();
-};
diff --git a/node_modules/rxjs/src/internal/util/subscribeToIterable.ts b/node_modules/rxjs/src/internal/util/subscribeToIterable.ts
deleted file mode 100644
index 6d20f68..0000000
--- a/node_modules/rxjs/src/internal/util/subscribeToIterable.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { iterator as Symbol_iterator } from '../symbol/iterator';
-
-export const subscribeToIterable = <T>(iterable: Iterable<T>) => (subscriber: Subscriber<T>) => {
-  const iterator = iterable[Symbol_iterator]();
-  do {
-    const item = iterator.next();
-    if (item.done) {
-      subscriber.complete();
-      break;
-    }
-    subscriber.next(item.value);
-    if (subscriber.closed) {
-      break;
-    }
-  } while (true);
-
-  // Finalize the iterator if it happens to be a Generator
-  if (typeof iterator.return === 'function') {
-    subscriber.add(() => {
-      if (iterator.return) {
-        iterator.return();
-      }
-    });
-  }
-
-  return subscriber;
-};
diff --git a/node_modules/rxjs/src/internal/util/subscribeToObservable.ts b/node_modules/rxjs/src/internal/util/subscribeToObservable.ts
deleted file mode 100644
index b53c566..0000000
--- a/node_modules/rxjs/src/internal/util/subscribeToObservable.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { observable as Symbol_observable } from '../symbol/observable';
-
-/**
- * Subscribes to an object that implements Symbol.observable with the given
- * Subscriber.
- * @param obj An object that implements Symbol.observable
- */
-export const subscribeToObservable = <T>(obj: any) => (subscriber: Subscriber<T>) => {
-  const obs = obj[Symbol_observable]();
-  if (typeof obs.subscribe !== 'function') {
-    // Should be caught by observable subscribe function error handling.
-    throw new TypeError('Provided object does not correctly implement Symbol.observable');
-  } else {
-    return obs.subscribe(subscriber);
-  }
-};
diff --git a/node_modules/rxjs/src/internal/util/subscribeToPromise.ts b/node_modules/rxjs/src/internal/util/subscribeToPromise.ts
deleted file mode 100644
index c64c850..0000000
--- a/node_modules/rxjs/src/internal/util/subscribeToPromise.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { hostReportError } from './hostReportError';
-
-export const subscribeToPromise = <T>(promise: PromiseLike<T>) => (subscriber: Subscriber<T>) => {
-  promise.then(
-    (value) => {
-      if (!subscriber.closed) {
-        subscriber.next(value);
-        subscriber.complete();
-      }
-    },
-    (err: any) => subscriber.error(err)
-  )
-  .then(null, hostReportError);
-  return subscriber;
-};
diff --git a/node_modules/rxjs/src/internal/util/subscribeToResult.ts b/node_modules/rxjs/src/internal/util/subscribeToResult.ts
deleted file mode 100644
index 31368ce..0000000
--- a/node_modules/rxjs/src/internal/util/subscribeToResult.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { Subscription } from '../Subscription';
-import { InnerSubscriber } from '../InnerSubscriber';
-import { OuterSubscriber } from '../OuterSubscriber';
-import { Subscriber } from '../Subscriber';
-import { subscribeTo } from './subscribeTo';
-import { Observable } from '../Observable';
-
-export function subscribeToResult<T, R>(
-  outerSubscriber: OuterSubscriber<T, R>,
-  result: any,
-  outerValue: undefined,
-  outerIndex: undefined,
-  innerSubscriber: InnerSubscriber<T, R>
-): Subscription | undefined;
-
-export function subscribeToResult<T, R>(
-  outerSubscriber: OuterSubscriber<T, R>,
-  result: any,
-  outerValue?: T,
-  outerIndex?: number
-): Subscription | undefined;
-
-export function subscribeToResult<T, R>(
-  outerSubscriber: OuterSubscriber<T, R>,
-  result: any,
-  outerValue?: T,
-  outerIndex?: number,
-  innerSubscriber: Subscriber<R> = new InnerSubscriber(outerSubscriber, outerValue, outerIndex)
-): Subscription | undefined {
-  if (innerSubscriber.closed) {
-    return undefined;
-  }
-  if (result instanceof Observable) {
-    return result.subscribe(innerSubscriber);
-  }
-  return subscribeTo(result)(innerSubscriber) as Subscription;
-}
diff --git a/node_modules/rxjs/src/internal/util/toSubscriber.ts b/node_modules/rxjs/src/internal/util/toSubscriber.ts
deleted file mode 100644
index e03d140..0000000
--- a/node_modules/rxjs/src/internal/util/toSubscriber.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { Subscriber } from '../Subscriber';
-import { rxSubscriber as rxSubscriberSymbol } from '../symbol/rxSubscriber';
-import { empty as emptyObserver } from '../Observer';
-import { PartialObserver } from '../types';
-
-export function toSubscriber<T>(
-  nextOrObserver?: PartialObserver<T> | ((value: T) => void),
-  error?: (error: any) => void,
-  complete?: () => void): Subscriber<T> {
-
-  if (nextOrObserver) {
-    if (nextOrObserver instanceof Subscriber) {
-      return (<Subscriber<T>> nextOrObserver);
-    }
-
-    if (nextOrObserver[rxSubscriberSymbol]) {
-      return nextOrObserver[rxSubscriberSymbol]();
-    }
-  }
-
-  if (!nextOrObserver && !error && !complete) {
-    return new Subscriber(emptyObserver);
-  }
-
-  return new Subscriber(nextOrObserver, error, complete);
-}
diff --git a/node_modules/rxjs/src/internal/util/tryCatch.ts b/node_modules/rxjs/src/internal/util/tryCatch.ts
deleted file mode 100644
index 1745421..0000000
--- a/node_modules/rxjs/src/internal/util/tryCatch.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { errorObject } from './errorObject';
-
-let tryCatchTarget: Function;
-
-function tryCatcher(this: any): any {
-  errorObject.e = undefined;
-  try {
-    return tryCatchTarget.apply(this, arguments);
-  } catch (e) {
-    errorObject.e = e;
-    return errorObject;
-  } finally {
-    tryCatchTarget = undefined;
-  }
-}
-
-export function tryCatch<T extends Function>(fn: T): T {
-  tryCatchTarget = fn;
-  return <any>tryCatcher;
-}
diff --git a/node_modules/rxjs/src/observable/ArrayLikeObservable.ts b/node_modules/rxjs/src/observable/ArrayLikeObservable.ts
deleted file mode 100644
index 30da288..0000000
--- a/node_modules/rxjs/src/observable/ArrayLikeObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/ArrayLikeObservable';
diff --git a/node_modules/rxjs/src/observable/ArrayObservable.ts b/node_modules/rxjs/src/observable/ArrayObservable.ts
deleted file mode 100644
index ce2da26..0000000
--- a/node_modules/rxjs/src/observable/ArrayObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/ArrayObservable';
diff --git a/node_modules/rxjs/src/observable/BoundCallbackObservable.ts b/node_modules/rxjs/src/observable/BoundCallbackObservable.ts
deleted file mode 100644
index 1790306..0000000
--- a/node_modules/rxjs/src/observable/BoundCallbackObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/BoundCallbackObservable';
diff --git a/node_modules/rxjs/src/observable/BoundNodeCallbackObservable.ts b/node_modules/rxjs/src/observable/BoundNodeCallbackObservable.ts
deleted file mode 100644
index 7d0eb03..0000000
--- a/node_modules/rxjs/src/observable/BoundNodeCallbackObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/BoundNodeCallbackObservable';
diff --git a/node_modules/rxjs/src/observable/ConnectableObservable.ts b/node_modules/rxjs/src/observable/ConnectableObservable.ts
deleted file mode 100644
index a21b3cc..0000000
--- a/node_modules/rxjs/src/observable/ConnectableObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/ConnectableObservable';
diff --git a/node_modules/rxjs/src/observable/DeferObservable.ts b/node_modules/rxjs/src/observable/DeferObservable.ts
deleted file mode 100644
index cec9147..0000000
--- a/node_modules/rxjs/src/observable/DeferObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/DeferObservable';
diff --git a/node_modules/rxjs/src/observable/EmptyObservable.ts b/node_modules/rxjs/src/observable/EmptyObservable.ts
deleted file mode 100644
index 6f9f0ba..0000000
--- a/node_modules/rxjs/src/observable/EmptyObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/EmptyObservable';
diff --git a/node_modules/rxjs/src/observable/ErrorObservable.ts b/node_modules/rxjs/src/observable/ErrorObservable.ts
deleted file mode 100644
index 68a7dce..0000000
--- a/node_modules/rxjs/src/observable/ErrorObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/ErrorObservable';
diff --git a/node_modules/rxjs/src/observable/ForkJoinObservable.ts b/node_modules/rxjs/src/observable/ForkJoinObservable.ts
deleted file mode 100644
index c9fa4dd..0000000
--- a/node_modules/rxjs/src/observable/ForkJoinObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/ForkJoinObservable';
diff --git a/node_modules/rxjs/src/observable/FromEventObservable.ts b/node_modules/rxjs/src/observable/FromEventObservable.ts
deleted file mode 100644
index 04291ab..0000000
--- a/node_modules/rxjs/src/observable/FromEventObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/FromEventObservable';
diff --git a/node_modules/rxjs/src/observable/FromEventPatternObservable.ts b/node_modules/rxjs/src/observable/FromEventPatternObservable.ts
deleted file mode 100644
index e0a473c..0000000
--- a/node_modules/rxjs/src/observable/FromEventPatternObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/FromEventPatternObservable';
diff --git a/node_modules/rxjs/src/observable/FromObservable.ts b/node_modules/rxjs/src/observable/FromObservable.ts
deleted file mode 100644
index c4ec664..0000000
--- a/node_modules/rxjs/src/observable/FromObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/FromObservable';
diff --git a/node_modules/rxjs/src/observable/GenerateObservable.ts b/node_modules/rxjs/src/observable/GenerateObservable.ts
deleted file mode 100644
index 8441d24..0000000
--- a/node_modules/rxjs/src/observable/GenerateObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/GenerateObservable';
diff --git a/node_modules/rxjs/src/observable/IfObservable.ts b/node_modules/rxjs/src/observable/IfObservable.ts
deleted file mode 100644
index 5eb484a..0000000
--- a/node_modules/rxjs/src/observable/IfObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/IfObservable';
diff --git a/node_modules/rxjs/src/observable/IntervalObservable.ts b/node_modules/rxjs/src/observable/IntervalObservable.ts
deleted file mode 100644
index dfe181f..0000000
--- a/node_modules/rxjs/src/observable/IntervalObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/IntervalObservable';
diff --git a/node_modules/rxjs/src/observable/IteratorObservable.ts b/node_modules/rxjs/src/observable/IteratorObservable.ts
deleted file mode 100644
index 860fbef..0000000
--- a/node_modules/rxjs/src/observable/IteratorObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/IteratorObservable';
diff --git a/node_modules/rxjs/src/observable/NeverObservable.ts b/node_modules/rxjs/src/observable/NeverObservable.ts
deleted file mode 100644
index de44057..0000000
--- a/node_modules/rxjs/src/observable/NeverObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/NeverObservable';
diff --git a/node_modules/rxjs/src/observable/PairsObservable.ts b/node_modules/rxjs/src/observable/PairsObservable.ts
deleted file mode 100644
index d030788..0000000
--- a/node_modules/rxjs/src/observable/PairsObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/PairsObservable';
diff --git a/node_modules/rxjs/src/observable/PromiseObservable.ts b/node_modules/rxjs/src/observable/PromiseObservable.ts
deleted file mode 100644
index ae0aac2..0000000
--- a/node_modules/rxjs/src/observable/PromiseObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/PromiseObservable';
diff --git a/node_modules/rxjs/src/observable/RangeObservable.ts b/node_modules/rxjs/src/observable/RangeObservable.ts
deleted file mode 100644
index f500c0a..0000000
--- a/node_modules/rxjs/src/observable/RangeObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/RangeObservable';
diff --git a/node_modules/rxjs/src/observable/ScalarObservable.ts b/node_modules/rxjs/src/observable/ScalarObservable.ts
deleted file mode 100644
index a353068..0000000
--- a/node_modules/rxjs/src/observable/ScalarObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/ScalarObservable';
diff --git a/node_modules/rxjs/src/observable/SubscribeOnObservable.ts b/node_modules/rxjs/src/observable/SubscribeOnObservable.ts
deleted file mode 100644
index 6435727..0000000
--- a/node_modules/rxjs/src/observable/SubscribeOnObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/SubscribeOnObservable';
diff --git a/node_modules/rxjs/src/observable/TimerObservable.ts b/node_modules/rxjs/src/observable/TimerObservable.ts
deleted file mode 100644
index 02b4a51..0000000
--- a/node_modules/rxjs/src/observable/TimerObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/TimerObservable';
diff --git a/node_modules/rxjs/src/observable/UsingObservable.ts b/node_modules/rxjs/src/observable/UsingObservable.ts
deleted file mode 100644
index c24410f..0000000
--- a/node_modules/rxjs/src/observable/UsingObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/UsingObservable';
diff --git a/node_modules/rxjs/src/observable/bindCallback.ts b/node_modules/rxjs/src/observable/bindCallback.ts
deleted file mode 100644
index aab5734..0000000
--- a/node_modules/rxjs/src/observable/bindCallback.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/bindCallback';
diff --git a/node_modules/rxjs/src/observable/bindNodeCallback.ts b/node_modules/rxjs/src/observable/bindNodeCallback.ts
deleted file mode 100644
index d5bfe5d..0000000
--- a/node_modules/rxjs/src/observable/bindNodeCallback.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/bindNodeCallback';
diff --git a/node_modules/rxjs/src/observable/combineLatest.ts b/node_modules/rxjs/src/observable/combineLatest.ts
deleted file mode 100644
index d4b7033..0000000
--- a/node_modules/rxjs/src/observable/combineLatest.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/combineLatest';
diff --git a/node_modules/rxjs/src/observable/concat.ts b/node_modules/rxjs/src/observable/concat.ts
deleted file mode 100644
index 673b315..0000000
--- a/node_modules/rxjs/src/observable/concat.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/concat';
diff --git a/node_modules/rxjs/src/observable/defer.ts b/node_modules/rxjs/src/observable/defer.ts
deleted file mode 100644
index 1a02f81..0000000
--- a/node_modules/rxjs/src/observable/defer.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/defer';
diff --git a/node_modules/rxjs/src/observable/dom/AjaxObservable.ts b/node_modules/rxjs/src/observable/dom/AjaxObservable.ts
deleted file mode 100644
index 5325060..0000000
--- a/node_modules/rxjs/src/observable/dom/AjaxObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/dom/AjaxObservable';
\ No newline at end of file
diff --git a/node_modules/rxjs/src/observable/dom/WebSocketSubject.ts b/node_modules/rxjs/src/observable/dom/WebSocketSubject.ts
deleted file mode 100644
index fb01a6b..0000000
--- a/node_modules/rxjs/src/observable/dom/WebSocketSubject.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/dom/WebSocketSubject';
\ No newline at end of file
diff --git a/node_modules/rxjs/src/observable/dom/ajax.ts b/node_modules/rxjs/src/observable/dom/ajax.ts
deleted file mode 100644
index fd13b94..0000000
--- a/node_modules/rxjs/src/observable/dom/ajax.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/dom/ajax';
\ No newline at end of file
diff --git a/node_modules/rxjs/src/observable/dom/webSocket.ts b/node_modules/rxjs/src/observable/dom/webSocket.ts
deleted file mode 100644
index 9656f0f..0000000
--- a/node_modules/rxjs/src/observable/dom/webSocket.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/dom/webSocket';
\ No newline at end of file
diff --git a/node_modules/rxjs/src/observable/empty.ts b/node_modules/rxjs/src/observable/empty.ts
deleted file mode 100644
index d7ed9cb..0000000
--- a/node_modules/rxjs/src/observable/empty.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/empty';
diff --git a/node_modules/rxjs/src/observable/forkJoin.ts b/node_modules/rxjs/src/observable/forkJoin.ts
deleted file mode 100644
index 3720625..0000000
--- a/node_modules/rxjs/src/observable/forkJoin.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/forkJoin';
diff --git a/node_modules/rxjs/src/observable/from.ts b/node_modules/rxjs/src/observable/from.ts
deleted file mode 100644
index 37d2b3a..0000000
--- a/node_modules/rxjs/src/observable/from.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/from';
diff --git a/node_modules/rxjs/src/observable/fromArray.ts b/node_modules/rxjs/src/observable/fromArray.ts
deleted file mode 100644
index 97f8377..0000000
--- a/node_modules/rxjs/src/observable/fromArray.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/fromArray';
diff --git a/node_modules/rxjs/src/observable/fromEvent.ts b/node_modules/rxjs/src/observable/fromEvent.ts
deleted file mode 100644
index 0312e3e..0000000
--- a/node_modules/rxjs/src/observable/fromEvent.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/fromEvent';
diff --git a/node_modules/rxjs/src/observable/fromEventPattern.ts b/node_modules/rxjs/src/observable/fromEventPattern.ts
deleted file mode 100644
index 6662550..0000000
--- a/node_modules/rxjs/src/observable/fromEventPattern.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/fromEventPattern';
diff --git a/node_modules/rxjs/src/observable/fromIterable.ts b/node_modules/rxjs/src/observable/fromIterable.ts
deleted file mode 100644
index ee359a2..0000000
--- a/node_modules/rxjs/src/observable/fromIterable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/fromIterable';
diff --git a/node_modules/rxjs/src/observable/fromPromise.ts b/node_modules/rxjs/src/observable/fromPromise.ts
deleted file mode 100644
index b580adc..0000000
--- a/node_modules/rxjs/src/observable/fromPromise.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/fromPromise';
diff --git a/node_modules/rxjs/src/observable/generate.ts b/node_modules/rxjs/src/observable/generate.ts
deleted file mode 100644
index ad23753..0000000
--- a/node_modules/rxjs/src/observable/generate.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/generate';
diff --git a/node_modules/rxjs/src/observable/if.ts b/node_modules/rxjs/src/observable/if.ts
deleted file mode 100644
index 71a71a4..0000000
--- a/node_modules/rxjs/src/observable/if.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/if';
diff --git a/node_modules/rxjs/src/observable/interval.ts b/node_modules/rxjs/src/observable/interval.ts
deleted file mode 100644
index 273374a..0000000
--- a/node_modules/rxjs/src/observable/interval.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/interval';
diff --git a/node_modules/rxjs/src/observable/merge.ts b/node_modules/rxjs/src/observable/merge.ts
deleted file mode 100644
index 5cbace9..0000000
--- a/node_modules/rxjs/src/observable/merge.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/merge';
diff --git a/node_modules/rxjs/src/observable/never.ts b/node_modules/rxjs/src/observable/never.ts
deleted file mode 100644
index 8d8b24c..0000000
--- a/node_modules/rxjs/src/observable/never.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/never';
diff --git a/node_modules/rxjs/src/observable/of.ts b/node_modules/rxjs/src/observable/of.ts
deleted file mode 100644
index b61ca78..0000000
--- a/node_modules/rxjs/src/observable/of.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/of';
diff --git a/node_modules/rxjs/src/observable/onErrorResumeNext.ts b/node_modules/rxjs/src/observable/onErrorResumeNext.ts
deleted file mode 100644
index 8b46336..0000000
--- a/node_modules/rxjs/src/observable/onErrorResumeNext.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/onErrorResumeNext';
diff --git a/node_modules/rxjs/src/observable/pairs.ts b/node_modules/rxjs/src/observable/pairs.ts
deleted file mode 100644
index 59ea93e..0000000
--- a/node_modules/rxjs/src/observable/pairs.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/pairs';
diff --git a/node_modules/rxjs/src/observable/race.ts b/node_modules/rxjs/src/observable/race.ts
deleted file mode 100644
index 5c05cde..0000000
--- a/node_modules/rxjs/src/observable/race.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/race';
diff --git a/node_modules/rxjs/src/observable/range.ts b/node_modules/rxjs/src/observable/range.ts
deleted file mode 100644
index 297046c..0000000
--- a/node_modules/rxjs/src/observable/range.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/range';
diff --git a/node_modules/rxjs/src/observable/throw.ts b/node_modules/rxjs/src/observable/throw.ts
deleted file mode 100644
index 30d4362..0000000
--- a/node_modules/rxjs/src/observable/throw.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/throw';
diff --git a/node_modules/rxjs/src/observable/timer.ts b/node_modules/rxjs/src/observable/timer.ts
deleted file mode 100644
index ac3d484..0000000
--- a/node_modules/rxjs/src/observable/timer.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/timer';
diff --git a/node_modules/rxjs/src/observable/using.ts b/node_modules/rxjs/src/observable/using.ts
deleted file mode 100644
index 2a9d0e7..0000000
--- a/node_modules/rxjs/src/observable/using.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/using';
diff --git a/node_modules/rxjs/src/observable/zip.ts b/node_modules/rxjs/src/observable/zip.ts
deleted file mode 100644
index 286e225..0000000
--- a/node_modules/rxjs/src/observable/zip.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/observable/zip';
diff --git a/node_modules/rxjs/src/operator/audit.ts b/node_modules/rxjs/src/operator/audit.ts
deleted file mode 100644
index f99039c..0000000
--- a/node_modules/rxjs/src/operator/audit.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/audit';
diff --git a/node_modules/rxjs/src/operator/auditTime.ts b/node_modules/rxjs/src/operator/auditTime.ts
deleted file mode 100644
index 16dcc21..0000000
--- a/node_modules/rxjs/src/operator/auditTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/auditTime';
diff --git a/node_modules/rxjs/src/operator/buffer.ts b/node_modules/rxjs/src/operator/buffer.ts
deleted file mode 100644
index ae0e349..0000000
--- a/node_modules/rxjs/src/operator/buffer.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/buffer';
diff --git a/node_modules/rxjs/src/operator/bufferCount.ts b/node_modules/rxjs/src/operator/bufferCount.ts
deleted file mode 100644
index 9883c58..0000000
--- a/node_modules/rxjs/src/operator/bufferCount.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/bufferCount';
diff --git a/node_modules/rxjs/src/operator/bufferTime.ts b/node_modules/rxjs/src/operator/bufferTime.ts
deleted file mode 100644
index 74845b4..0000000
--- a/node_modules/rxjs/src/operator/bufferTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/bufferTime';
diff --git a/node_modules/rxjs/src/operator/bufferToggle.ts b/node_modules/rxjs/src/operator/bufferToggle.ts
deleted file mode 100644
index 3a3ccff..0000000
--- a/node_modules/rxjs/src/operator/bufferToggle.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/bufferToggle';
diff --git a/node_modules/rxjs/src/operator/bufferWhen.ts b/node_modules/rxjs/src/operator/bufferWhen.ts
deleted file mode 100644
index f394a58..0000000
--- a/node_modules/rxjs/src/operator/bufferWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/bufferWhen';
diff --git a/node_modules/rxjs/src/operator/catch.ts b/node_modules/rxjs/src/operator/catch.ts
deleted file mode 100644
index 39c2412..0000000
--- a/node_modules/rxjs/src/operator/catch.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/catch';
diff --git a/node_modules/rxjs/src/operator/combineAll.ts b/node_modules/rxjs/src/operator/combineAll.ts
deleted file mode 100644
index 47ead4a..0000000
--- a/node_modules/rxjs/src/operator/combineAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/combineAll';
diff --git a/node_modules/rxjs/src/operator/combineLatest.ts b/node_modules/rxjs/src/operator/combineLatest.ts
deleted file mode 100644
index 5719796..0000000
--- a/node_modules/rxjs/src/operator/combineLatest.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/combineLatest';
diff --git a/node_modules/rxjs/src/operator/concat.ts b/node_modules/rxjs/src/operator/concat.ts
deleted file mode 100644
index 7937d7a..0000000
--- a/node_modules/rxjs/src/operator/concat.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/concat';
diff --git a/node_modules/rxjs/src/operator/concatAll.ts b/node_modules/rxjs/src/operator/concatAll.ts
deleted file mode 100644
index ac3f202..0000000
--- a/node_modules/rxjs/src/operator/concatAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/concatAll';
diff --git a/node_modules/rxjs/src/operator/concatMap.ts b/node_modules/rxjs/src/operator/concatMap.ts
deleted file mode 100644
index 96cf01f..0000000
--- a/node_modules/rxjs/src/operator/concatMap.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/concatMap';
diff --git a/node_modules/rxjs/src/operator/concatMapTo.ts b/node_modules/rxjs/src/operator/concatMapTo.ts
deleted file mode 100644
index ccc3cd5..0000000
--- a/node_modules/rxjs/src/operator/concatMapTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/concatMapTo';
diff --git a/node_modules/rxjs/src/operator/count.ts b/node_modules/rxjs/src/operator/count.ts
deleted file mode 100644
index d9b4699..0000000
--- a/node_modules/rxjs/src/operator/count.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/count';
diff --git a/node_modules/rxjs/src/operator/debounce.ts b/node_modules/rxjs/src/operator/debounce.ts
deleted file mode 100644
index 69fffd9..0000000
--- a/node_modules/rxjs/src/operator/debounce.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/debounce';
diff --git a/node_modules/rxjs/src/operator/debounceTime.ts b/node_modules/rxjs/src/operator/debounceTime.ts
deleted file mode 100644
index 5e51c65..0000000
--- a/node_modules/rxjs/src/operator/debounceTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/debounceTime';
diff --git a/node_modules/rxjs/src/operator/defaultIfEmpty.ts b/node_modules/rxjs/src/operator/defaultIfEmpty.ts
deleted file mode 100644
index 6f5c620..0000000
--- a/node_modules/rxjs/src/operator/defaultIfEmpty.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/defaultIfEmpty';
diff --git a/node_modules/rxjs/src/operator/delay.ts b/node_modules/rxjs/src/operator/delay.ts
deleted file mode 100644
index 823ded3..0000000
--- a/node_modules/rxjs/src/operator/delay.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/delay';
diff --git a/node_modules/rxjs/src/operator/delayWhen.ts b/node_modules/rxjs/src/operator/delayWhen.ts
deleted file mode 100644
index b28322a..0000000
--- a/node_modules/rxjs/src/operator/delayWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/delayWhen';
diff --git a/node_modules/rxjs/src/operator/dematerialize.ts b/node_modules/rxjs/src/operator/dematerialize.ts
deleted file mode 100644
index 83f8da9..0000000
--- a/node_modules/rxjs/src/operator/dematerialize.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/dematerialize';
diff --git a/node_modules/rxjs/src/operator/distinct.ts b/node_modules/rxjs/src/operator/distinct.ts
deleted file mode 100644
index b97b8ee..0000000
--- a/node_modules/rxjs/src/operator/distinct.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/distinct';
diff --git a/node_modules/rxjs/src/operator/distinctUntilChanged.ts b/node_modules/rxjs/src/operator/distinctUntilChanged.ts
deleted file mode 100644
index 3a5bbc3..0000000
--- a/node_modules/rxjs/src/operator/distinctUntilChanged.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/distinctUntilChanged';
diff --git a/node_modules/rxjs/src/operator/distinctUntilKeyChanged.ts b/node_modules/rxjs/src/operator/distinctUntilKeyChanged.ts
deleted file mode 100644
index 22d42b1..0000000
--- a/node_modules/rxjs/src/operator/distinctUntilKeyChanged.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/distinctUntilKeyChanged';
diff --git a/node_modules/rxjs/src/operator/do.ts b/node_modules/rxjs/src/operator/do.ts
deleted file mode 100644
index 3b3a79b..0000000
--- a/node_modules/rxjs/src/operator/do.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/do';
diff --git a/node_modules/rxjs/src/operator/elementAt.ts b/node_modules/rxjs/src/operator/elementAt.ts
deleted file mode 100644
index bcdf798..0000000
--- a/node_modules/rxjs/src/operator/elementAt.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/elementAt';
diff --git a/node_modules/rxjs/src/operator/every.ts b/node_modules/rxjs/src/operator/every.ts
deleted file mode 100644
index af7e790..0000000
--- a/node_modules/rxjs/src/operator/every.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/every';
diff --git a/node_modules/rxjs/src/operator/exhaust.ts b/node_modules/rxjs/src/operator/exhaust.ts
deleted file mode 100644
index 7af3d2f..0000000
--- a/node_modules/rxjs/src/operator/exhaust.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/exhaust';
diff --git a/node_modules/rxjs/src/operator/exhaustMap.ts b/node_modules/rxjs/src/operator/exhaustMap.ts
deleted file mode 100644
index 822438a..0000000
--- a/node_modules/rxjs/src/operator/exhaustMap.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/exhaustMap';
diff --git a/node_modules/rxjs/src/operator/expand.ts b/node_modules/rxjs/src/operator/expand.ts
deleted file mode 100644
index 11df701..0000000
--- a/node_modules/rxjs/src/operator/expand.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/expand';
diff --git a/node_modules/rxjs/src/operator/filter.ts b/node_modules/rxjs/src/operator/filter.ts
deleted file mode 100644
index ccc2f24..0000000
--- a/node_modules/rxjs/src/operator/filter.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/filter';
diff --git a/node_modules/rxjs/src/operator/finally.ts b/node_modules/rxjs/src/operator/finally.ts
deleted file mode 100644
index a21b3e1..0000000
--- a/node_modules/rxjs/src/operator/finally.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/finally';
diff --git a/node_modules/rxjs/src/operator/find.ts b/node_modules/rxjs/src/operator/find.ts
deleted file mode 100644
index face44b..0000000
--- a/node_modules/rxjs/src/operator/find.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/find';
diff --git a/node_modules/rxjs/src/operator/findIndex.ts b/node_modules/rxjs/src/operator/findIndex.ts
deleted file mode 100644
index dd0297a..0000000
--- a/node_modules/rxjs/src/operator/findIndex.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/findIndex';
diff --git a/node_modules/rxjs/src/operator/first.ts b/node_modules/rxjs/src/operator/first.ts
deleted file mode 100644
index 86843ed..0000000
--- a/node_modules/rxjs/src/operator/first.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/first';
diff --git a/node_modules/rxjs/src/operator/groupBy.ts b/node_modules/rxjs/src/operator/groupBy.ts
deleted file mode 100644
index 648fac9..0000000
--- a/node_modules/rxjs/src/operator/groupBy.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/groupBy';
diff --git a/node_modules/rxjs/src/operator/ignoreElements.ts b/node_modules/rxjs/src/operator/ignoreElements.ts
deleted file mode 100644
index b9c3eef..0000000
--- a/node_modules/rxjs/src/operator/ignoreElements.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/ignoreElements';
diff --git a/node_modules/rxjs/src/operator/isEmpty.ts b/node_modules/rxjs/src/operator/isEmpty.ts
deleted file mode 100644
index 03da532..0000000
--- a/node_modules/rxjs/src/operator/isEmpty.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/isEmpty';
diff --git a/node_modules/rxjs/src/operator/last.ts b/node_modules/rxjs/src/operator/last.ts
deleted file mode 100644
index 2d42da8..0000000
--- a/node_modules/rxjs/src/operator/last.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/last';
diff --git a/node_modules/rxjs/src/operator/let.ts b/node_modules/rxjs/src/operator/let.ts
deleted file mode 100644
index 0f25011..0000000
--- a/node_modules/rxjs/src/operator/let.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/let';
diff --git a/node_modules/rxjs/src/operator/map.ts b/node_modules/rxjs/src/operator/map.ts
deleted file mode 100644
index 00af2a0..0000000
--- a/node_modules/rxjs/src/operator/map.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/map';
diff --git a/node_modules/rxjs/src/operator/mapTo.ts b/node_modules/rxjs/src/operator/mapTo.ts
deleted file mode 100644
index ad51274..0000000
--- a/node_modules/rxjs/src/operator/mapTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/mapTo';
diff --git a/node_modules/rxjs/src/operator/materialize.ts b/node_modules/rxjs/src/operator/materialize.ts
deleted file mode 100644
index 57d501d..0000000
--- a/node_modules/rxjs/src/operator/materialize.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/materialize';
diff --git a/node_modules/rxjs/src/operator/max.ts b/node_modules/rxjs/src/operator/max.ts
deleted file mode 100644
index e7efcd7..0000000
--- a/node_modules/rxjs/src/operator/max.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/max';
diff --git a/node_modules/rxjs/src/operator/merge.ts b/node_modules/rxjs/src/operator/merge.ts
deleted file mode 100644
index 039a0d2..0000000
--- a/node_modules/rxjs/src/operator/merge.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/merge';
diff --git a/node_modules/rxjs/src/operator/mergeAll.ts b/node_modules/rxjs/src/operator/mergeAll.ts
deleted file mode 100644
index 1527cc9..0000000
--- a/node_modules/rxjs/src/operator/mergeAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/mergeAll';
diff --git a/node_modules/rxjs/src/operator/mergeMap.ts b/node_modules/rxjs/src/operator/mergeMap.ts
deleted file mode 100644
index d091762..0000000
--- a/node_modules/rxjs/src/operator/mergeMap.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/mergeMap';
diff --git a/node_modules/rxjs/src/operator/mergeMapTo.ts b/node_modules/rxjs/src/operator/mergeMapTo.ts
deleted file mode 100644
index 2503ab4..0000000
--- a/node_modules/rxjs/src/operator/mergeMapTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/mergeMapTo';
diff --git a/node_modules/rxjs/src/operator/mergeScan.ts b/node_modules/rxjs/src/operator/mergeScan.ts
deleted file mode 100644
index f8fd1be..0000000
--- a/node_modules/rxjs/src/operator/mergeScan.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/mergeScan';
diff --git a/node_modules/rxjs/src/operator/min.ts b/node_modules/rxjs/src/operator/min.ts
deleted file mode 100644
index b082666..0000000
--- a/node_modules/rxjs/src/operator/min.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/min';
diff --git a/node_modules/rxjs/src/operator/multicast.ts b/node_modules/rxjs/src/operator/multicast.ts
deleted file mode 100644
index 16822ab..0000000
--- a/node_modules/rxjs/src/operator/multicast.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/multicast';
diff --git a/node_modules/rxjs/src/operator/observeOn.ts b/node_modules/rxjs/src/operator/observeOn.ts
deleted file mode 100644
index 49d52cf..0000000
--- a/node_modules/rxjs/src/operator/observeOn.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/observeOn';
diff --git a/node_modules/rxjs/src/operator/onErrorResumeNext.ts b/node_modules/rxjs/src/operator/onErrorResumeNext.ts
deleted file mode 100644
index dee5c58..0000000
--- a/node_modules/rxjs/src/operator/onErrorResumeNext.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/onErrorResumeNext';
diff --git a/node_modules/rxjs/src/operator/pairwise.ts b/node_modules/rxjs/src/operator/pairwise.ts
deleted file mode 100644
index 2db66e0..0000000
--- a/node_modules/rxjs/src/operator/pairwise.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/pairwise';
diff --git a/node_modules/rxjs/src/operator/partition.ts b/node_modules/rxjs/src/operator/partition.ts
deleted file mode 100644
index ffb693b..0000000
--- a/node_modules/rxjs/src/operator/partition.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/partition';
diff --git a/node_modules/rxjs/src/operator/pluck.ts b/node_modules/rxjs/src/operator/pluck.ts
deleted file mode 100644
index cd308f2..0000000
--- a/node_modules/rxjs/src/operator/pluck.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/pluck';
diff --git a/node_modules/rxjs/src/operator/publish.ts b/node_modules/rxjs/src/operator/publish.ts
deleted file mode 100644
index 44f7a52..0000000
--- a/node_modules/rxjs/src/operator/publish.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/publish';
diff --git a/node_modules/rxjs/src/operator/publishBehavior.ts b/node_modules/rxjs/src/operator/publishBehavior.ts
deleted file mode 100644
index ae6df51..0000000
--- a/node_modules/rxjs/src/operator/publishBehavior.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/publishBehavior';
diff --git a/node_modules/rxjs/src/operator/publishLast.ts b/node_modules/rxjs/src/operator/publishLast.ts
deleted file mode 100644
index b8b857f..0000000
--- a/node_modules/rxjs/src/operator/publishLast.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/publishLast';
diff --git a/node_modules/rxjs/src/operator/publishReplay.ts b/node_modules/rxjs/src/operator/publishReplay.ts
deleted file mode 100644
index d515665..0000000
--- a/node_modules/rxjs/src/operator/publishReplay.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/publishReplay';
diff --git a/node_modules/rxjs/src/operator/race.ts b/node_modules/rxjs/src/operator/race.ts
deleted file mode 100644
index 1371230..0000000
--- a/node_modules/rxjs/src/operator/race.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/race';
diff --git a/node_modules/rxjs/src/operator/reduce.ts b/node_modules/rxjs/src/operator/reduce.ts
deleted file mode 100644
index 3051a59..0000000
--- a/node_modules/rxjs/src/operator/reduce.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/reduce';
diff --git a/node_modules/rxjs/src/operator/repeat.ts b/node_modules/rxjs/src/operator/repeat.ts
deleted file mode 100644
index 3cf8344..0000000
--- a/node_modules/rxjs/src/operator/repeat.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/repeat';
diff --git a/node_modules/rxjs/src/operator/repeatWhen.ts b/node_modules/rxjs/src/operator/repeatWhen.ts
deleted file mode 100644
index c8ab403..0000000
--- a/node_modules/rxjs/src/operator/repeatWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/repeatWhen';
diff --git a/node_modules/rxjs/src/operator/retry.ts b/node_modules/rxjs/src/operator/retry.ts
deleted file mode 100644
index ea76932..0000000
--- a/node_modules/rxjs/src/operator/retry.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/retry';
diff --git a/node_modules/rxjs/src/operator/retryWhen.ts b/node_modules/rxjs/src/operator/retryWhen.ts
deleted file mode 100644
index c1c4a4d..0000000
--- a/node_modules/rxjs/src/operator/retryWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/retryWhen';
diff --git a/node_modules/rxjs/src/operator/sample.ts b/node_modules/rxjs/src/operator/sample.ts
deleted file mode 100644
index 50c4485..0000000
--- a/node_modules/rxjs/src/operator/sample.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/sample';
diff --git a/node_modules/rxjs/src/operator/sampleTime.ts b/node_modules/rxjs/src/operator/sampleTime.ts
deleted file mode 100644
index 6a88266..0000000
--- a/node_modules/rxjs/src/operator/sampleTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/sampleTime';
diff --git a/node_modules/rxjs/src/operator/scan.ts b/node_modules/rxjs/src/operator/scan.ts
deleted file mode 100644
index 07d5f63..0000000
--- a/node_modules/rxjs/src/operator/scan.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/scan';
diff --git a/node_modules/rxjs/src/operator/sequenceEqual.ts b/node_modules/rxjs/src/operator/sequenceEqual.ts
deleted file mode 100644
index 8a324c2..0000000
--- a/node_modules/rxjs/src/operator/sequenceEqual.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/sequenceEqual';
diff --git a/node_modules/rxjs/src/operator/share.ts b/node_modules/rxjs/src/operator/share.ts
deleted file mode 100644
index 7dcde39..0000000
--- a/node_modules/rxjs/src/operator/share.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/share';
diff --git a/node_modules/rxjs/src/operator/shareReplay.ts b/node_modules/rxjs/src/operator/shareReplay.ts
deleted file mode 100644
index 7889029..0000000
--- a/node_modules/rxjs/src/operator/shareReplay.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/shareReplay';
diff --git a/node_modules/rxjs/src/operator/single.ts b/node_modules/rxjs/src/operator/single.ts
deleted file mode 100644
index 0b289da..0000000
--- a/node_modules/rxjs/src/operator/single.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/single';
diff --git a/node_modules/rxjs/src/operator/skip.ts b/node_modules/rxjs/src/operator/skip.ts
deleted file mode 100644
index 830890c..0000000
--- a/node_modules/rxjs/src/operator/skip.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/skip';
diff --git a/node_modules/rxjs/src/operator/skipLast.ts b/node_modules/rxjs/src/operator/skipLast.ts
deleted file mode 100644
index 504d7d7..0000000
--- a/node_modules/rxjs/src/operator/skipLast.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/skipLast';
diff --git a/node_modules/rxjs/src/operator/skipUntil.ts b/node_modules/rxjs/src/operator/skipUntil.ts
deleted file mode 100644
index c942abc..0000000
--- a/node_modules/rxjs/src/operator/skipUntil.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/skipUntil';
diff --git a/node_modules/rxjs/src/operator/skipWhile.ts b/node_modules/rxjs/src/operator/skipWhile.ts
deleted file mode 100644
index 1ec1baf..0000000
--- a/node_modules/rxjs/src/operator/skipWhile.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/skipWhile';
diff --git a/node_modules/rxjs/src/operator/startWith.ts b/node_modules/rxjs/src/operator/startWith.ts
deleted file mode 100644
index 88b22fb..0000000
--- a/node_modules/rxjs/src/operator/startWith.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/startWith';
diff --git a/node_modules/rxjs/src/operator/subscribeOn.ts b/node_modules/rxjs/src/operator/subscribeOn.ts
deleted file mode 100644
index d5fe5c3..0000000
--- a/node_modules/rxjs/src/operator/subscribeOn.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/subscribeOn';
diff --git a/node_modules/rxjs/src/operator/switch.ts b/node_modules/rxjs/src/operator/switch.ts
deleted file mode 100644
index 2cbae8f..0000000
--- a/node_modules/rxjs/src/operator/switch.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/switch';
diff --git a/node_modules/rxjs/src/operator/switchMap.ts b/node_modules/rxjs/src/operator/switchMap.ts
deleted file mode 100644
index cd5ce95..0000000
--- a/node_modules/rxjs/src/operator/switchMap.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/switchMap';
diff --git a/node_modules/rxjs/src/operator/switchMapTo.ts b/node_modules/rxjs/src/operator/switchMapTo.ts
deleted file mode 100644
index bd59ce3..0000000
--- a/node_modules/rxjs/src/operator/switchMapTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/switchMapTo';
diff --git a/node_modules/rxjs/src/operator/take.ts b/node_modules/rxjs/src/operator/take.ts
deleted file mode 100644
index c915fc3..0000000
--- a/node_modules/rxjs/src/operator/take.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/take';
diff --git a/node_modules/rxjs/src/operator/takeLast.ts b/node_modules/rxjs/src/operator/takeLast.ts
deleted file mode 100644
index 78509e5..0000000
--- a/node_modules/rxjs/src/operator/takeLast.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/takeLast';
diff --git a/node_modules/rxjs/src/operator/takeUntil.ts b/node_modules/rxjs/src/operator/takeUntil.ts
deleted file mode 100644
index 38b927b..0000000
--- a/node_modules/rxjs/src/operator/takeUntil.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/takeUntil';
diff --git a/node_modules/rxjs/src/operator/takeWhile.ts b/node_modules/rxjs/src/operator/takeWhile.ts
deleted file mode 100644
index b1772bd..0000000
--- a/node_modules/rxjs/src/operator/takeWhile.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/takeWhile';
diff --git a/node_modules/rxjs/src/operator/throttle.ts b/node_modules/rxjs/src/operator/throttle.ts
deleted file mode 100644
index 9c2effc..0000000
--- a/node_modules/rxjs/src/operator/throttle.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/throttle';
diff --git a/node_modules/rxjs/src/operator/throttleTime.ts b/node_modules/rxjs/src/operator/throttleTime.ts
deleted file mode 100644
index 7385eb0..0000000
--- a/node_modules/rxjs/src/operator/throttleTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/throttleTime';
diff --git a/node_modules/rxjs/src/operator/timeInterval.ts b/node_modules/rxjs/src/operator/timeInterval.ts
deleted file mode 100644
index 5f5283b..0000000
--- a/node_modules/rxjs/src/operator/timeInterval.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/timeInterval';
diff --git a/node_modules/rxjs/src/operator/timeout.ts b/node_modules/rxjs/src/operator/timeout.ts
deleted file mode 100644
index 56e0cc3..0000000
--- a/node_modules/rxjs/src/operator/timeout.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/timeout';
diff --git a/node_modules/rxjs/src/operator/timeoutWith.ts b/node_modules/rxjs/src/operator/timeoutWith.ts
deleted file mode 100644
index e746c05..0000000
--- a/node_modules/rxjs/src/operator/timeoutWith.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/timeoutWith';
diff --git a/node_modules/rxjs/src/operator/timestamp.ts b/node_modules/rxjs/src/operator/timestamp.ts
deleted file mode 100644
index 77a94e8..0000000
--- a/node_modules/rxjs/src/operator/timestamp.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/timestamp';
diff --git a/node_modules/rxjs/src/operator/toArray.ts b/node_modules/rxjs/src/operator/toArray.ts
deleted file mode 100644
index 57c8ee1..0000000
--- a/node_modules/rxjs/src/operator/toArray.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/toArray';
diff --git a/node_modules/rxjs/src/operator/toPromise.ts b/node_modules/rxjs/src/operator/toPromise.ts
deleted file mode 100644
index b9f8cae..0000000
--- a/node_modules/rxjs/src/operator/toPromise.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/toPromise';
diff --git a/node_modules/rxjs/src/operator/window.ts b/node_modules/rxjs/src/operator/window.ts
deleted file mode 100644
index 937f174..0000000
--- a/node_modules/rxjs/src/operator/window.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/window';
diff --git a/node_modules/rxjs/src/operator/windowCount.ts b/node_modules/rxjs/src/operator/windowCount.ts
deleted file mode 100644
index 87392c7..0000000
--- a/node_modules/rxjs/src/operator/windowCount.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/windowCount';
diff --git a/node_modules/rxjs/src/operator/windowTime.ts b/node_modules/rxjs/src/operator/windowTime.ts
deleted file mode 100644
index 52798df..0000000
--- a/node_modules/rxjs/src/operator/windowTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/windowTime';
diff --git a/node_modules/rxjs/src/operator/windowToggle.ts b/node_modules/rxjs/src/operator/windowToggle.ts
deleted file mode 100644
index c2d8b4e..0000000
--- a/node_modules/rxjs/src/operator/windowToggle.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/windowToggle';
diff --git a/node_modules/rxjs/src/operator/windowWhen.ts b/node_modules/rxjs/src/operator/windowWhen.ts
deleted file mode 100644
index 1d4e2ef..0000000
--- a/node_modules/rxjs/src/operator/windowWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/windowWhen';
diff --git a/node_modules/rxjs/src/operator/withLatestFrom.ts b/node_modules/rxjs/src/operator/withLatestFrom.ts
deleted file mode 100644
index b31197a..0000000
--- a/node_modules/rxjs/src/operator/withLatestFrom.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/withLatestFrom';
diff --git a/node_modules/rxjs/src/operator/zip.ts b/node_modules/rxjs/src/operator/zip.ts
deleted file mode 100644
index 25eea26..0000000
--- a/node_modules/rxjs/src/operator/zip.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/zip';
diff --git a/node_modules/rxjs/src/operator/zipAll.ts b/node_modules/rxjs/src/operator/zipAll.ts
deleted file mode 100644
index 1098d9d..0000000
--- a/node_modules/rxjs/src/operator/zipAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operator/zipAll';
diff --git a/node_modules/rxjs/src/operators/audit.ts b/node_modules/rxjs/src/operators/audit.ts
deleted file mode 100644
index 0e5b597..0000000
--- a/node_modules/rxjs/src/operators/audit.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/audit';
diff --git a/node_modules/rxjs/src/operators/auditTime.ts b/node_modules/rxjs/src/operators/auditTime.ts
deleted file mode 100644
index 72a4c00..0000000
--- a/node_modules/rxjs/src/operators/auditTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/auditTime';
diff --git a/node_modules/rxjs/src/operators/buffer.ts b/node_modules/rxjs/src/operators/buffer.ts
deleted file mode 100644
index 7007461..0000000
--- a/node_modules/rxjs/src/operators/buffer.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/buffer';
diff --git a/node_modules/rxjs/src/operators/bufferCount.ts b/node_modules/rxjs/src/operators/bufferCount.ts
deleted file mode 100644
index 767b33c..0000000
--- a/node_modules/rxjs/src/operators/bufferCount.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/bufferCount';
diff --git a/node_modules/rxjs/src/operators/bufferTime.ts b/node_modules/rxjs/src/operators/bufferTime.ts
deleted file mode 100644
index 085acfb..0000000
--- a/node_modules/rxjs/src/operators/bufferTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/bufferTime';
diff --git a/node_modules/rxjs/src/operators/bufferToggle.ts b/node_modules/rxjs/src/operators/bufferToggle.ts
deleted file mode 100644
index f554f73..0000000
--- a/node_modules/rxjs/src/operators/bufferToggle.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/bufferToggle';
diff --git a/node_modules/rxjs/src/operators/bufferWhen.ts b/node_modules/rxjs/src/operators/bufferWhen.ts
deleted file mode 100644
index 7e0b79f..0000000
--- a/node_modules/rxjs/src/operators/bufferWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/bufferWhen';
diff --git a/node_modules/rxjs/src/operators/catchError.ts b/node_modules/rxjs/src/operators/catchError.ts
deleted file mode 100644
index 4ea9351..0000000
--- a/node_modules/rxjs/src/operators/catchError.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/catchError';
diff --git a/node_modules/rxjs/src/operators/combineAll.ts b/node_modules/rxjs/src/operators/combineAll.ts
deleted file mode 100644
index 13f2758..0000000
--- a/node_modules/rxjs/src/operators/combineAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/combineAll';
diff --git a/node_modules/rxjs/src/operators/combineLatest.ts b/node_modules/rxjs/src/operators/combineLatest.ts
deleted file mode 100644
index cefd4d0..0000000
--- a/node_modules/rxjs/src/operators/combineLatest.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/combineLatest';
diff --git a/node_modules/rxjs/src/operators/concat.ts b/node_modules/rxjs/src/operators/concat.ts
deleted file mode 100644
index d2b7050..0000000
--- a/node_modules/rxjs/src/operators/concat.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/concat';
\ No newline at end of file
diff --git a/node_modules/rxjs/src/operators/concatAll.ts b/node_modules/rxjs/src/operators/concatAll.ts
deleted file mode 100644
index 4e90bf3..0000000
--- a/node_modules/rxjs/src/operators/concatAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/concatAll';
diff --git a/node_modules/rxjs/src/operators/concatMap.ts b/node_modules/rxjs/src/operators/concatMap.ts
deleted file mode 100644
index fb26bc0..0000000
--- a/node_modules/rxjs/src/operators/concatMap.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/concatMap';
diff --git a/node_modules/rxjs/src/operators/concatMapTo.ts b/node_modules/rxjs/src/operators/concatMapTo.ts
deleted file mode 100644
index f5aef40..0000000
--- a/node_modules/rxjs/src/operators/concatMapTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/concatMapTo';
diff --git a/node_modules/rxjs/src/operators/count.ts b/node_modules/rxjs/src/operators/count.ts
deleted file mode 100644
index db7cfe3..0000000
--- a/node_modules/rxjs/src/operators/count.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/count';
diff --git a/node_modules/rxjs/src/operators/debounce.ts b/node_modules/rxjs/src/operators/debounce.ts
deleted file mode 100644
index ed62cb8..0000000
--- a/node_modules/rxjs/src/operators/debounce.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/debounce';
diff --git a/node_modules/rxjs/src/operators/debounceTime.ts b/node_modules/rxjs/src/operators/debounceTime.ts
deleted file mode 100644
index fb73d33..0000000
--- a/node_modules/rxjs/src/operators/debounceTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/debounceTime';
diff --git a/node_modules/rxjs/src/operators/defaultIfEmpty.ts b/node_modules/rxjs/src/operators/defaultIfEmpty.ts
deleted file mode 100644
index 04b9e61..0000000
--- a/node_modules/rxjs/src/operators/defaultIfEmpty.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/defaultIfEmpty';
diff --git a/node_modules/rxjs/src/operators/delay.ts b/node_modules/rxjs/src/operators/delay.ts
deleted file mode 100644
index d34f33d..0000000
--- a/node_modules/rxjs/src/operators/delay.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/delay';
diff --git a/node_modules/rxjs/src/operators/delayWhen.ts b/node_modules/rxjs/src/operators/delayWhen.ts
deleted file mode 100644
index 4de1452..0000000
--- a/node_modules/rxjs/src/operators/delayWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/delayWhen';
diff --git a/node_modules/rxjs/src/operators/dematerialize.ts b/node_modules/rxjs/src/operators/dematerialize.ts
deleted file mode 100644
index a689bf0..0000000
--- a/node_modules/rxjs/src/operators/dematerialize.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/dematerialize';
diff --git a/node_modules/rxjs/src/operators/distinct.ts b/node_modules/rxjs/src/operators/distinct.ts
deleted file mode 100644
index 9d8288a..0000000
--- a/node_modules/rxjs/src/operators/distinct.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/distinct';
diff --git a/node_modules/rxjs/src/operators/distinctUntilChanged.ts b/node_modules/rxjs/src/operators/distinctUntilChanged.ts
deleted file mode 100644
index 1fc4eda..0000000
--- a/node_modules/rxjs/src/operators/distinctUntilChanged.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/distinctUntilChanged';
diff --git a/node_modules/rxjs/src/operators/distinctUntilKeyChanged.ts b/node_modules/rxjs/src/operators/distinctUntilKeyChanged.ts
deleted file mode 100644
index d8fa76a..0000000
--- a/node_modules/rxjs/src/operators/distinctUntilKeyChanged.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/distinctUntilKeyChanged';
diff --git a/node_modules/rxjs/src/operators/elementAt.ts b/node_modules/rxjs/src/operators/elementAt.ts
deleted file mode 100644
index 4f5d5b3..0000000
--- a/node_modules/rxjs/src/operators/elementAt.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/elementAt';
diff --git a/node_modules/rxjs/src/operators/every.ts b/node_modules/rxjs/src/operators/every.ts
deleted file mode 100644
index 15b9f46..0000000
--- a/node_modules/rxjs/src/operators/every.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/every';
diff --git a/node_modules/rxjs/src/operators/exhaust.ts b/node_modules/rxjs/src/operators/exhaust.ts
deleted file mode 100644
index 19a3637..0000000
--- a/node_modules/rxjs/src/operators/exhaust.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/exhaust';
diff --git a/node_modules/rxjs/src/operators/exhaustMap.ts b/node_modules/rxjs/src/operators/exhaustMap.ts
deleted file mode 100644
index cf4ae30..0000000
--- a/node_modules/rxjs/src/operators/exhaustMap.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/exhaustMap';
diff --git a/node_modules/rxjs/src/operators/expand.ts b/node_modules/rxjs/src/operators/expand.ts
deleted file mode 100644
index 0cef04c..0000000
--- a/node_modules/rxjs/src/operators/expand.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/expand';
diff --git a/node_modules/rxjs/src/operators/filter.ts b/node_modules/rxjs/src/operators/filter.ts
deleted file mode 100644
index 23b8666..0000000
--- a/node_modules/rxjs/src/operators/filter.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/filter';
diff --git a/node_modules/rxjs/src/operators/finalize.ts b/node_modules/rxjs/src/operators/finalize.ts
deleted file mode 100644
index 9c32dfc..0000000
--- a/node_modules/rxjs/src/operators/finalize.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/finalize';
diff --git a/node_modules/rxjs/src/operators/find.ts b/node_modules/rxjs/src/operators/find.ts
deleted file mode 100644
index 98a272d..0000000
--- a/node_modules/rxjs/src/operators/find.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/find';
diff --git a/node_modules/rxjs/src/operators/findIndex.ts b/node_modules/rxjs/src/operators/findIndex.ts
deleted file mode 100644
index 167707f..0000000
--- a/node_modules/rxjs/src/operators/findIndex.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/findIndex';
diff --git a/node_modules/rxjs/src/operators/first.ts b/node_modules/rxjs/src/operators/first.ts
deleted file mode 100644
index c0266e3..0000000
--- a/node_modules/rxjs/src/operators/first.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/first';
diff --git a/node_modules/rxjs/src/operators/groupBy.ts b/node_modules/rxjs/src/operators/groupBy.ts
deleted file mode 100644
index 52c6f58..0000000
--- a/node_modules/rxjs/src/operators/groupBy.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/groupBy';
diff --git a/node_modules/rxjs/src/operators/ignoreElements.ts b/node_modules/rxjs/src/operators/ignoreElements.ts
deleted file mode 100644
index 590bf88..0000000
--- a/node_modules/rxjs/src/operators/ignoreElements.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/ignoreElements';
diff --git a/node_modules/rxjs/src/operators/index.ts b/node_modules/rxjs/src/operators/index.ts
deleted file mode 100644
index 53b8e69..0000000
--- a/node_modules/rxjs/src/operators/index.ts
+++ /dev/null
@@ -1,106 +0,0 @@
-
-/* Operator exports */
-export { audit } from '../internal/operators/audit';
-export { auditTime } from '../internal/operators/auditTime';
-export { buffer } from '../internal/operators/buffer';
-export { bufferCount } from '../internal/operators/bufferCount';
-export { bufferTime } from '../internal/operators/bufferTime';
-export { bufferToggle } from '../internal/operators/bufferToggle';
-export { bufferWhen } from '../internal/operators/bufferWhen';
-export { catchError } from '../internal/operators/catchError';
-export { combineAll } from '../internal/operators/combineAll';
-export { combineLatest } from '../internal/operators/combineLatest';
-export { concat } from '../internal/operators/concat';
-export { concatAll } from '../internal/operators/concatAll';
-export { concatMap } from '../internal/operators/concatMap';
-export { concatMapTo } from '../internal/operators/concatMapTo';
-export { count } from '../internal/operators/count';
-export { debounce } from '../internal/operators/debounce';
-export { debounceTime } from '../internal/operators/debounceTime';
-export { defaultIfEmpty } from '../internal/operators/defaultIfEmpty';
-export { delay } from '../internal/operators/delay';
-export { delayWhen } from '../internal/operators/delayWhen';
-export { dematerialize } from '../internal/operators/dematerialize';
-export { distinct } from '../internal/operators/distinct';
-export { distinctUntilChanged } from '../internal/operators/distinctUntilChanged';
-export { distinctUntilKeyChanged } from '../internal/operators/distinctUntilKeyChanged';
-export { elementAt } from '../internal/operators/elementAt';
-export { endWith } from '../internal/operators/endWith';
-export { every } from '../internal/operators/every';
-export { exhaust } from '../internal/operators/exhaust';
-export { exhaustMap } from '../internal/operators/exhaustMap';
-export { expand } from '../internal/operators/expand';
-export { filter } from '../internal/operators/filter';
-export { finalize } from '../internal/operators/finalize';
-export { find } from '../internal/operators/find';
-export { findIndex } from '../internal/operators/findIndex';
-export { first } from '../internal/operators/first';
-export { groupBy } from '../internal/operators/groupBy';
-export { ignoreElements } from '../internal/operators/ignoreElements';
-export { isEmpty } from '../internal/operators/isEmpty';
-export { last } from '../internal/operators/last';
-export { map } from '../internal/operators/map';
-export { mapTo } from '../internal/operators/mapTo';
-export { materialize } from '../internal/operators/materialize';
-export { max } from '../internal/operators/max';
-export { merge } from '../internal/operators/merge';
-export { mergeAll } from '../internal/operators/mergeAll';
-export { mergeMap } from '../internal/operators/mergeMap';
-export { mergeMap as flatMap } from '../internal/operators/mergeMap';
-export { mergeMapTo } from '../internal/operators/mergeMapTo';
-export { mergeScan } from '../internal/operators/mergeScan';
-export { min } from '../internal/operators/min';
-export { multicast } from '../internal/operators/multicast';
-export { observeOn } from '../internal/operators/observeOn';
-export { onErrorResumeNext } from '../internal/operators/onErrorResumeNext';
-export { pairwise } from '../internal/operators/pairwise';
-export { partition } from '../internal/operators/partition';
-export { pluck } from '../internal/operators/pluck';
-export { publish } from '../internal/operators/publish';
-export { publishBehavior } from '../internal/operators/publishBehavior';
-export { publishLast } from '../internal/operators/publishLast';
-export { publishReplay } from '../internal/operators/publishReplay';
-export { race } from '../internal/operators/race';
-export { reduce } from '../internal/operators/reduce';
-export { repeat } from '../internal/operators/repeat';
-export { repeatWhen } from '../internal/operators/repeatWhen';
-export { retry } from '../internal/operators/retry';
-export { retryWhen } from '../internal/operators/retryWhen';
-export { refCount } from '../internal/operators/refCount';
-export { sample } from '../internal/operators/sample';
-export { sampleTime } from '../internal/operators/sampleTime';
-export { scan } from '../internal/operators/scan';
-export { sequenceEqual } from '../internal/operators/sequenceEqual';
-export { share } from '../internal/operators/share';
-export { shareReplay } from '../internal/operators/shareReplay';
-export { single } from '../internal/operators/single';
-export { skip } from '../internal/operators/skip';
-export { skipLast } from '../internal/operators/skipLast';
-export { skipUntil } from '../internal/operators/skipUntil';
-export { skipWhile } from '../internal/operators/skipWhile';
-export { startWith } from '../internal/operators/startWith';
-export { subscribeOn } from '../internal/operators/subscribeOn';
-export { switchAll } from '../internal/operators/switchAll';
-export { switchMap } from '../internal/operators/switchMap';
-export { switchMapTo } from '../internal/operators/switchMapTo';
-export { take } from '../internal/operators/take';
-export { takeLast } from '../internal/operators/takeLast';
-export { takeUntil } from '../internal/operators/takeUntil';
-export { takeWhile } from '../internal/operators/takeWhile';
-export { tap } from '../internal/operators/tap';
-export { throttle } from '../internal/operators/throttle';
-export { throttleTime } from '../internal/operators/throttleTime';
-export { throwIfEmpty } from '../internal/operators/throwIfEmpty';
-export { timeInterval } from '../internal/operators/timeInterval';
-export { timeout } from '../internal/operators/timeout';
-export { timeoutWith } from '../internal/operators/timeoutWith';
-export { timestamp } from '../internal/operators/timestamp';
-export { toArray } from '../internal/operators/toArray';
-export { window } from '../internal/operators/window';
-export { windowCount } from '../internal/operators/windowCount';
-export { windowTime } from '../internal/operators/windowTime';
-export { windowToggle } from '../internal/operators/windowToggle';
-export { windowWhen } from '../internal/operators/windowWhen';
-export { withLatestFrom } from '../internal/operators/withLatestFrom';
-export { zip } from '../internal/operators/zip';
-export { zipAll } from '../internal/operators/zipAll';
diff --git a/node_modules/rxjs/src/operators/isEmpty.ts b/node_modules/rxjs/src/operators/isEmpty.ts
deleted file mode 100644
index fd1d1af..0000000
--- a/node_modules/rxjs/src/operators/isEmpty.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/isEmpty';
diff --git a/node_modules/rxjs/src/operators/last.ts b/node_modules/rxjs/src/operators/last.ts
deleted file mode 100644
index c8464bf..0000000
--- a/node_modules/rxjs/src/operators/last.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/last';
diff --git a/node_modules/rxjs/src/operators/map.ts b/node_modules/rxjs/src/operators/map.ts
deleted file mode 100644
index 7e8cb1f..0000000
--- a/node_modules/rxjs/src/operators/map.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/map';
diff --git a/node_modules/rxjs/src/operators/mapTo.ts b/node_modules/rxjs/src/operators/mapTo.ts
deleted file mode 100644
index 72b4d9e..0000000
--- a/node_modules/rxjs/src/operators/mapTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/mapTo';
diff --git a/node_modules/rxjs/src/operators/materialize.ts b/node_modules/rxjs/src/operators/materialize.ts
deleted file mode 100644
index e050f1e..0000000
--- a/node_modules/rxjs/src/operators/materialize.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/materialize';
diff --git a/node_modules/rxjs/src/operators/max.ts b/node_modules/rxjs/src/operators/max.ts
deleted file mode 100644
index 044da47..0000000
--- a/node_modules/rxjs/src/operators/max.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/max';
diff --git a/node_modules/rxjs/src/operators/merge.ts b/node_modules/rxjs/src/operators/merge.ts
deleted file mode 100644
index 7d9f674..0000000
--- a/node_modules/rxjs/src/operators/merge.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/merge';
\ No newline at end of file
diff --git a/node_modules/rxjs/src/operators/mergeAll.ts b/node_modules/rxjs/src/operators/mergeAll.ts
deleted file mode 100644
index b5c5b38..0000000
--- a/node_modules/rxjs/src/operators/mergeAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/mergeAll';
diff --git a/node_modules/rxjs/src/operators/mergeMap.ts b/node_modules/rxjs/src/operators/mergeMap.ts
deleted file mode 100644
index af5c7c1..0000000
--- a/node_modules/rxjs/src/operators/mergeMap.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/mergeMap';
diff --git a/node_modules/rxjs/src/operators/mergeMapTo.ts b/node_modules/rxjs/src/operators/mergeMapTo.ts
deleted file mode 100644
index 67b6cb7..0000000
--- a/node_modules/rxjs/src/operators/mergeMapTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/mergeMapTo';
diff --git a/node_modules/rxjs/src/operators/mergeScan.ts b/node_modules/rxjs/src/operators/mergeScan.ts
deleted file mode 100644
index ef73adc..0000000
--- a/node_modules/rxjs/src/operators/mergeScan.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/mergeScan';
diff --git a/node_modules/rxjs/src/operators/min.ts b/node_modules/rxjs/src/operators/min.ts
deleted file mode 100644
index 3706e3f..0000000
--- a/node_modules/rxjs/src/operators/min.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/min';
diff --git a/node_modules/rxjs/src/operators/multicast.ts b/node_modules/rxjs/src/operators/multicast.ts
deleted file mode 100644
index 9470284..0000000
--- a/node_modules/rxjs/src/operators/multicast.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/multicast';
diff --git a/node_modules/rxjs/src/operators/observeOn.ts b/node_modules/rxjs/src/operators/observeOn.ts
deleted file mode 100644
index 0f6d414..0000000
--- a/node_modules/rxjs/src/operators/observeOn.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/observeOn';
diff --git a/node_modules/rxjs/src/operators/onErrorResumeNext.ts b/node_modules/rxjs/src/operators/onErrorResumeNext.ts
deleted file mode 100644
index 0b19815..0000000
--- a/node_modules/rxjs/src/operators/onErrorResumeNext.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/onErrorResumeNext';
diff --git a/node_modules/rxjs/src/operators/package.json b/node_modules/rxjs/src/operators/package.json
deleted file mode 100644
index eefac38..0000000
--- a/node_modules/rxjs/src/operators/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "rxjs/operators",
-  "typings": "./index.d.ts",
-  "main": "./index.js",
-  "module": "../_esm5/operators/index.js",
-  "es2015": "../_esm2015/operators/index.js",
-  "sideEffects": false
-}
diff --git a/node_modules/rxjs/src/operators/pairwise.ts b/node_modules/rxjs/src/operators/pairwise.ts
deleted file mode 100644
index f83f732..0000000
--- a/node_modules/rxjs/src/operators/pairwise.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/pairwise';
diff --git a/node_modules/rxjs/src/operators/partition.ts b/node_modules/rxjs/src/operators/partition.ts
deleted file mode 100644
index 3c82843..0000000
--- a/node_modules/rxjs/src/operators/partition.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/partition';
diff --git a/node_modules/rxjs/src/operators/pluck.ts b/node_modules/rxjs/src/operators/pluck.ts
deleted file mode 100644
index 2ac910a..0000000
--- a/node_modules/rxjs/src/operators/pluck.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/pluck';
diff --git a/node_modules/rxjs/src/operators/publish.ts b/node_modules/rxjs/src/operators/publish.ts
deleted file mode 100644
index a21951d..0000000
--- a/node_modules/rxjs/src/operators/publish.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/publish';
diff --git a/node_modules/rxjs/src/operators/publishBehavior.ts b/node_modules/rxjs/src/operators/publishBehavior.ts
deleted file mode 100644
index 53cbc37..0000000
--- a/node_modules/rxjs/src/operators/publishBehavior.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/publishBehavior';
diff --git a/node_modules/rxjs/src/operators/publishLast.ts b/node_modules/rxjs/src/operators/publishLast.ts
deleted file mode 100644
index 0fcb439..0000000
--- a/node_modules/rxjs/src/operators/publishLast.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/publishLast';
diff --git a/node_modules/rxjs/src/operators/publishReplay.ts b/node_modules/rxjs/src/operators/publishReplay.ts
deleted file mode 100644
index ff87a2d..0000000
--- a/node_modules/rxjs/src/operators/publishReplay.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/publishReplay';
diff --git a/node_modules/rxjs/src/operators/race.ts b/node_modules/rxjs/src/operators/race.ts
deleted file mode 100644
index 95047c7..0000000
--- a/node_modules/rxjs/src/operators/race.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/race';
diff --git a/node_modules/rxjs/src/operators/reduce.ts b/node_modules/rxjs/src/operators/reduce.ts
deleted file mode 100644
index abb05c3..0000000
--- a/node_modules/rxjs/src/operators/reduce.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/reduce';
diff --git a/node_modules/rxjs/src/operators/refCount.ts b/node_modules/rxjs/src/operators/refCount.ts
deleted file mode 100644
index 3c38baa..0000000
--- a/node_modules/rxjs/src/operators/refCount.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/refCount';
diff --git a/node_modules/rxjs/src/operators/repeat.ts b/node_modules/rxjs/src/operators/repeat.ts
deleted file mode 100644
index 1f36353..0000000
--- a/node_modules/rxjs/src/operators/repeat.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/repeat';
diff --git a/node_modules/rxjs/src/operators/repeatWhen.ts b/node_modules/rxjs/src/operators/repeatWhen.ts
deleted file mode 100644
index df052ac..0000000
--- a/node_modules/rxjs/src/operators/repeatWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/repeatWhen';
diff --git a/node_modules/rxjs/src/operators/retry.ts b/node_modules/rxjs/src/operators/retry.ts
deleted file mode 100644
index b8d2fee..0000000
--- a/node_modules/rxjs/src/operators/retry.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/retry';
diff --git a/node_modules/rxjs/src/operators/retryWhen.ts b/node_modules/rxjs/src/operators/retryWhen.ts
deleted file mode 100644
index 00f9bdf..0000000
--- a/node_modules/rxjs/src/operators/retryWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/retryWhen';
diff --git a/node_modules/rxjs/src/operators/sample.ts b/node_modules/rxjs/src/operators/sample.ts
deleted file mode 100644
index 0e05a4b..0000000
--- a/node_modules/rxjs/src/operators/sample.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/sample';
diff --git a/node_modules/rxjs/src/operators/sampleTime.ts b/node_modules/rxjs/src/operators/sampleTime.ts
deleted file mode 100644
index 5041a51..0000000
--- a/node_modules/rxjs/src/operators/sampleTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/sampleTime';
diff --git a/node_modules/rxjs/src/operators/scan.ts b/node_modules/rxjs/src/operators/scan.ts
deleted file mode 100644
index acaee73..0000000
--- a/node_modules/rxjs/src/operators/scan.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/scan';
diff --git a/node_modules/rxjs/src/operators/sequenceEqual.ts b/node_modules/rxjs/src/operators/sequenceEqual.ts
deleted file mode 100644
index 0a6e3cb..0000000
--- a/node_modules/rxjs/src/operators/sequenceEqual.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/sequenceEqual';
diff --git a/node_modules/rxjs/src/operators/share.ts b/node_modules/rxjs/src/operators/share.ts
deleted file mode 100644
index fd113fd..0000000
--- a/node_modules/rxjs/src/operators/share.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/share';
diff --git a/node_modules/rxjs/src/operators/shareReplay.ts b/node_modules/rxjs/src/operators/shareReplay.ts
deleted file mode 100644
index d489c81..0000000
--- a/node_modules/rxjs/src/operators/shareReplay.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/shareReplay';
diff --git a/node_modules/rxjs/src/operators/single.ts b/node_modules/rxjs/src/operators/single.ts
deleted file mode 100644
index 096d4b4..0000000
--- a/node_modules/rxjs/src/operators/single.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/single';
diff --git a/node_modules/rxjs/src/operators/skip.ts b/node_modules/rxjs/src/operators/skip.ts
deleted file mode 100644
index 002baeb..0000000
--- a/node_modules/rxjs/src/operators/skip.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/skip';
diff --git a/node_modules/rxjs/src/operators/skipLast.ts b/node_modules/rxjs/src/operators/skipLast.ts
deleted file mode 100644
index 15d1c49..0000000
--- a/node_modules/rxjs/src/operators/skipLast.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/skipLast';
diff --git a/node_modules/rxjs/src/operators/skipUntil.ts b/node_modules/rxjs/src/operators/skipUntil.ts
deleted file mode 100644
index 4193fe2..0000000
--- a/node_modules/rxjs/src/operators/skipUntil.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/skipUntil';
diff --git a/node_modules/rxjs/src/operators/skipWhile.ts b/node_modules/rxjs/src/operators/skipWhile.ts
deleted file mode 100644
index 34fb4d6..0000000
--- a/node_modules/rxjs/src/operators/skipWhile.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/skipWhile';
diff --git a/node_modules/rxjs/src/operators/startWith.ts b/node_modules/rxjs/src/operators/startWith.ts
deleted file mode 100644
index 901bbba..0000000
--- a/node_modules/rxjs/src/operators/startWith.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/startWith';
diff --git a/node_modules/rxjs/src/operators/subscribeOn.ts b/node_modules/rxjs/src/operators/subscribeOn.ts
deleted file mode 100644
index eb1c233..0000000
--- a/node_modules/rxjs/src/operators/subscribeOn.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/subscribeOn';
diff --git a/node_modules/rxjs/src/operators/switchAll.ts b/node_modules/rxjs/src/operators/switchAll.ts
deleted file mode 100644
index 37a8c20..0000000
--- a/node_modules/rxjs/src/operators/switchAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/switchAll';
diff --git a/node_modules/rxjs/src/operators/switchMap.ts b/node_modules/rxjs/src/operators/switchMap.ts
deleted file mode 100644
index 840c2c7..0000000
--- a/node_modules/rxjs/src/operators/switchMap.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/switchMap';
diff --git a/node_modules/rxjs/src/operators/switchMapTo.ts b/node_modules/rxjs/src/operators/switchMapTo.ts
deleted file mode 100644
index fbefdfe..0000000
--- a/node_modules/rxjs/src/operators/switchMapTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/switchMapTo';
diff --git a/node_modules/rxjs/src/operators/take.ts b/node_modules/rxjs/src/operators/take.ts
deleted file mode 100644
index 1176ad7..0000000
--- a/node_modules/rxjs/src/operators/take.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/take';
diff --git a/node_modules/rxjs/src/operators/takeLast.ts b/node_modules/rxjs/src/operators/takeLast.ts
deleted file mode 100644
index 35e85f2..0000000
--- a/node_modules/rxjs/src/operators/takeLast.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/takeLast';
diff --git a/node_modules/rxjs/src/operators/takeUntil.ts b/node_modules/rxjs/src/operators/takeUntil.ts
deleted file mode 100644
index 828abef..0000000
--- a/node_modules/rxjs/src/operators/takeUntil.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/takeUntil';
diff --git a/node_modules/rxjs/src/operators/takeWhile.ts b/node_modules/rxjs/src/operators/takeWhile.ts
deleted file mode 100644
index c3edb4e..0000000
--- a/node_modules/rxjs/src/operators/takeWhile.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/takeWhile';
diff --git a/node_modules/rxjs/src/operators/tap.ts b/node_modules/rxjs/src/operators/tap.ts
deleted file mode 100644
index 6190e75..0000000
--- a/node_modules/rxjs/src/operators/tap.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/tap';
diff --git a/node_modules/rxjs/src/operators/throttle.ts b/node_modules/rxjs/src/operators/throttle.ts
deleted file mode 100644
index f887a2f..0000000
--- a/node_modules/rxjs/src/operators/throttle.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/throttle';
diff --git a/node_modules/rxjs/src/operators/throttleTime.ts b/node_modules/rxjs/src/operators/throttleTime.ts
deleted file mode 100644
index 8fbd3c8..0000000
--- a/node_modules/rxjs/src/operators/throttleTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/throttleTime';
diff --git a/node_modules/rxjs/src/operators/throwIfEmpty.ts b/node_modules/rxjs/src/operators/throwIfEmpty.ts
deleted file mode 100644
index 6bb64cd..0000000
--- a/node_modules/rxjs/src/operators/throwIfEmpty.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/throwIfEmpty';
diff --git a/node_modules/rxjs/src/operators/timeInterval.ts b/node_modules/rxjs/src/operators/timeInterval.ts
deleted file mode 100644
index 6af3911..0000000
--- a/node_modules/rxjs/src/operators/timeInterval.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/timeInterval';
diff --git a/node_modules/rxjs/src/operators/timeout.ts b/node_modules/rxjs/src/operators/timeout.ts
deleted file mode 100644
index c4a43f1..0000000
--- a/node_modules/rxjs/src/operators/timeout.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/timeout';
diff --git a/node_modules/rxjs/src/operators/timeoutWith.ts b/node_modules/rxjs/src/operators/timeoutWith.ts
deleted file mode 100644
index 2cfcad8..0000000
--- a/node_modules/rxjs/src/operators/timeoutWith.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/timeoutWith';
diff --git a/node_modules/rxjs/src/operators/timestamp.ts b/node_modules/rxjs/src/operators/timestamp.ts
deleted file mode 100644
index 6580e38..0000000
--- a/node_modules/rxjs/src/operators/timestamp.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/timestamp';
diff --git a/node_modules/rxjs/src/operators/toArray.ts b/node_modules/rxjs/src/operators/toArray.ts
deleted file mode 100644
index 7f678db..0000000
--- a/node_modules/rxjs/src/operators/toArray.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/toArray';
diff --git a/node_modules/rxjs/src/operators/window.ts b/node_modules/rxjs/src/operators/window.ts
deleted file mode 100644
index 2642141..0000000
--- a/node_modules/rxjs/src/operators/window.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/window';
diff --git a/node_modules/rxjs/src/operators/windowCount.ts b/node_modules/rxjs/src/operators/windowCount.ts
deleted file mode 100644
index b774707..0000000
--- a/node_modules/rxjs/src/operators/windowCount.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/windowCount';
diff --git a/node_modules/rxjs/src/operators/windowTime.ts b/node_modules/rxjs/src/operators/windowTime.ts
deleted file mode 100644
index 2cbf76f..0000000
--- a/node_modules/rxjs/src/operators/windowTime.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/windowTime';
diff --git a/node_modules/rxjs/src/operators/windowToggle.ts b/node_modules/rxjs/src/operators/windowToggle.ts
deleted file mode 100644
index b116f17..0000000
--- a/node_modules/rxjs/src/operators/windowToggle.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/windowToggle';
diff --git a/node_modules/rxjs/src/operators/windowWhen.ts b/node_modules/rxjs/src/operators/windowWhen.ts
deleted file mode 100644
index 782d4dc..0000000
--- a/node_modules/rxjs/src/operators/windowWhen.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/windowWhen';
diff --git a/node_modules/rxjs/src/operators/withLatestFrom.ts b/node_modules/rxjs/src/operators/withLatestFrom.ts
deleted file mode 100644
index 15f7450..0000000
--- a/node_modules/rxjs/src/operators/withLatestFrom.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/withLatestFrom';
diff --git a/node_modules/rxjs/src/operators/zip.ts b/node_modules/rxjs/src/operators/zip.ts
deleted file mode 100644
index c75d56f..0000000
--- a/node_modules/rxjs/src/operators/zip.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/zip';
diff --git a/node_modules/rxjs/src/operators/zipAll.ts b/node_modules/rxjs/src/operators/zipAll.ts
deleted file mode 100644
index 3e69835..0000000
--- a/node_modules/rxjs/src/operators/zipAll.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/operators/zipAll';
diff --git a/node_modules/rxjs/src/scheduler/animationFrame.ts b/node_modules/rxjs/src/scheduler/animationFrame.ts
deleted file mode 100644
index f293624..0000000
--- a/node_modules/rxjs/src/scheduler/animationFrame.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/scheduler/animationFrame';
diff --git a/node_modules/rxjs/src/scheduler/asap.ts b/node_modules/rxjs/src/scheduler/asap.ts
deleted file mode 100644
index 934d4b5..0000000
--- a/node_modules/rxjs/src/scheduler/asap.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/scheduler/asap';
diff --git a/node_modules/rxjs/src/scheduler/async.ts b/node_modules/rxjs/src/scheduler/async.ts
deleted file mode 100644
index ed5a613..0000000
--- a/node_modules/rxjs/src/scheduler/async.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/scheduler/async';
diff --git a/node_modules/rxjs/src/scheduler/queue.ts b/node_modules/rxjs/src/scheduler/queue.ts
deleted file mode 100644
index daea584..0000000
--- a/node_modules/rxjs/src/scheduler/queue.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/scheduler/queue';
diff --git a/node_modules/rxjs/src/symbol/iterator.ts b/node_modules/rxjs/src/symbol/iterator.ts
deleted file mode 100644
index 7090360..0000000
--- a/node_modules/rxjs/src/symbol/iterator.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/symbol/iterator';
diff --git a/node_modules/rxjs/src/symbol/observable.ts b/node_modules/rxjs/src/symbol/observable.ts
deleted file mode 100644
index c5fc191..0000000
--- a/node_modules/rxjs/src/symbol/observable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/symbol/observable';
diff --git a/node_modules/rxjs/src/symbol/rxSubscriber.ts b/node_modules/rxjs/src/symbol/rxSubscriber.ts
deleted file mode 100644
index cf3866a..0000000
--- a/node_modules/rxjs/src/symbol/rxSubscriber.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/symbol/rxSubscriber';
diff --git a/node_modules/rxjs/src/testing/index.ts b/node_modules/rxjs/src/testing/index.ts
deleted file mode 100644
index 4c23a72..0000000
--- a/node_modules/rxjs/src/testing/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { TestScheduler } from '../internal/testing/TestScheduler';
diff --git a/node_modules/rxjs/src/testing/package.json b/node_modules/rxjs/src/testing/package.json
deleted file mode 100644
index 1a11a9f..0000000
--- a/node_modules/rxjs/src/testing/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "rxjs/testing",
-  "typings": "./index.d.ts",
-  "main": "./index.js",
-  "module": "../_esm5/testing/index.js",
-  "es2015": "../_esm2015/testing/index.js",
-  "sideEffects": false
-}
diff --git a/node_modules/rxjs/src/tsconfig.json b/node_modules/rxjs/src/tsconfig.json
deleted file mode 100644
index 14e7621..0000000
--- a/node_modules/rxjs/src/tsconfig.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "compilerOptions": {
-    "removeComments": true,
-    "preserveConstEnums": true,
-    "sourceMap": true,
-    "strictFunctionTypes": true,
-    "noImplicitAny": true,
-    "noImplicitReturns": true,
-    "noImplicitThis": true,
-    "suppressImplicitAnyIndexErrors": true,
-    "moduleResolution": "node",
-    "stripInternal": false,
-    "target": "es5",
-    "outDir": "./.out",
-    "lib": [
-      "es5",
-      "es2015.iterable",
-      "es2015.collection",
-      "es2015.promise",
-      "es2015.symbol",
-      "es2015.symbol.wellknown",
-      "dom"
-    ]
-  },
-  "formatCodeOptions": {
-    "indentSize": 2,
-    "tabSize": 2
-  },
-  "bazelOptions": {
-    "suppressTsconfigOverrideWarnings": true
-  }
-}
diff --git a/node_modules/rxjs/src/util/ArgumentOutOfRangeError.ts b/node_modules/rxjs/src/util/ArgumentOutOfRangeError.ts
deleted file mode 100644
index 48e4712..0000000
--- a/node_modules/rxjs/src/util/ArgumentOutOfRangeError.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/ArgumentOutOfRangeError';
diff --git a/node_modules/rxjs/src/util/EmptyError.ts b/node_modules/rxjs/src/util/EmptyError.ts
deleted file mode 100644
index 8d25892..0000000
--- a/node_modules/rxjs/src/util/EmptyError.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/EmptyError';
diff --git a/node_modules/rxjs/src/util/Immediate.ts b/node_modules/rxjs/src/util/Immediate.ts
deleted file mode 100644
index 2bfaf13..0000000
--- a/node_modules/rxjs/src/util/Immediate.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/Immediate';
diff --git a/node_modules/rxjs/src/util/ObjectUnsubscribedError.ts b/node_modules/rxjs/src/util/ObjectUnsubscribedError.ts
deleted file mode 100644
index 3ae25a9..0000000
--- a/node_modules/rxjs/src/util/ObjectUnsubscribedError.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/ObjectUnsubscribedError';
diff --git a/node_modules/rxjs/src/util/TimeoutError.ts b/node_modules/rxjs/src/util/TimeoutError.ts
deleted file mode 100644
index 31aae0b..0000000
--- a/node_modules/rxjs/src/util/TimeoutError.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/TimeoutError';
diff --git a/node_modules/rxjs/src/util/UnsubscriptionError.ts b/node_modules/rxjs/src/util/UnsubscriptionError.ts
deleted file mode 100644
index fbf4c1c..0000000
--- a/node_modules/rxjs/src/util/UnsubscriptionError.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/UnsubscriptionError';
diff --git a/node_modules/rxjs/src/util/applyMixins.ts b/node_modules/rxjs/src/util/applyMixins.ts
deleted file mode 100644
index b5ef81c..0000000
--- a/node_modules/rxjs/src/util/applyMixins.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/applyMixins';
diff --git a/node_modules/rxjs/src/util/errorObject.ts b/node_modules/rxjs/src/util/errorObject.ts
deleted file mode 100644
index 3dad2b9..0000000
--- a/node_modules/rxjs/src/util/errorObject.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/errorObject';
diff --git a/node_modules/rxjs/src/util/hostReportError.ts b/node_modules/rxjs/src/util/hostReportError.ts
deleted file mode 100644
index 74d0de4..0000000
--- a/node_modules/rxjs/src/util/hostReportError.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/hostReportError';
diff --git a/node_modules/rxjs/src/util/identity.ts b/node_modules/rxjs/src/util/identity.ts
deleted file mode 100644
index 685e462..0000000
--- a/node_modules/rxjs/src/util/identity.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/identity';
diff --git a/node_modules/rxjs/src/util/isArray.ts b/node_modules/rxjs/src/util/isArray.ts
deleted file mode 100644
index 5ca2e21..0000000
--- a/node_modules/rxjs/src/util/isArray.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isArray';
diff --git a/node_modules/rxjs/src/util/isArrayLike.ts b/node_modules/rxjs/src/util/isArrayLike.ts
deleted file mode 100644
index a8b03d2..0000000
--- a/node_modules/rxjs/src/util/isArrayLike.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isArrayLike';
diff --git a/node_modules/rxjs/src/util/isDate.ts b/node_modules/rxjs/src/util/isDate.ts
deleted file mode 100644
index c5ebb01..0000000
--- a/node_modules/rxjs/src/util/isDate.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isDate';
diff --git a/node_modules/rxjs/src/util/isFunction.ts b/node_modules/rxjs/src/util/isFunction.ts
deleted file mode 100644
index 7b4a54a..0000000
--- a/node_modules/rxjs/src/util/isFunction.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isFunction';
diff --git a/node_modules/rxjs/src/util/isIterable.ts b/node_modules/rxjs/src/util/isIterable.ts
deleted file mode 100644
index e7ffaae..0000000
--- a/node_modules/rxjs/src/util/isIterable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isIterable';
diff --git a/node_modules/rxjs/src/util/isNumeric.ts b/node_modules/rxjs/src/util/isNumeric.ts
deleted file mode 100644
index eeefcc2..0000000
--- a/node_modules/rxjs/src/util/isNumeric.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isNumeric';
diff --git a/node_modules/rxjs/src/util/isObject.ts b/node_modules/rxjs/src/util/isObject.ts
deleted file mode 100644
index 4b57d81..0000000
--- a/node_modules/rxjs/src/util/isObject.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isObject';
diff --git a/node_modules/rxjs/src/util/isObservable.ts b/node_modules/rxjs/src/util/isObservable.ts
deleted file mode 100644
index cdf34ca..0000000
--- a/node_modules/rxjs/src/util/isObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isObservable';
diff --git a/node_modules/rxjs/src/util/isPromise.ts b/node_modules/rxjs/src/util/isPromise.ts
deleted file mode 100644
index 1494a4b..0000000
--- a/node_modules/rxjs/src/util/isPromise.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isPromise';
diff --git a/node_modules/rxjs/src/util/isScheduler.ts b/node_modules/rxjs/src/util/isScheduler.ts
deleted file mode 100644
index fd1a1f2..0000000
--- a/node_modules/rxjs/src/util/isScheduler.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isScheduler';
diff --git a/node_modules/rxjs/src/util/noop.ts b/node_modules/rxjs/src/util/noop.ts
deleted file mode 100644
index 0fe22e1..0000000
--- a/node_modules/rxjs/src/util/noop.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/noop';
diff --git a/node_modules/rxjs/src/util/not.ts b/node_modules/rxjs/src/util/not.ts
deleted file mode 100644
index 3831576..0000000
--- a/node_modules/rxjs/src/util/not.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/not';
diff --git a/node_modules/rxjs/src/util/pipe.ts b/node_modules/rxjs/src/util/pipe.ts
deleted file mode 100644
index da6342a..0000000
--- a/node_modules/rxjs/src/util/pipe.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/pipe';
diff --git a/node_modules/rxjs/src/util/root.ts b/node_modules/rxjs/src/util/root.ts
deleted file mode 100644
index 25b6c79..0000000
--- a/node_modules/rxjs/src/util/root.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/root';
diff --git a/node_modules/rxjs/src/util/subscribeTo.ts b/node_modules/rxjs/src/util/subscribeTo.ts
deleted file mode 100644
index 471f192..0000000
--- a/node_modules/rxjs/src/util/subscribeTo.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/subscribeTo';
diff --git a/node_modules/rxjs/src/util/subscribeToArray.ts b/node_modules/rxjs/src/util/subscribeToArray.ts
deleted file mode 100644
index 9220f62..0000000
--- a/node_modules/rxjs/src/util/subscribeToArray.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/subscribeToArray';
diff --git a/node_modules/rxjs/src/util/subscribeToIterable.ts b/node_modules/rxjs/src/util/subscribeToIterable.ts
deleted file mode 100644
index 6edb1ef..0000000
--- a/node_modules/rxjs/src/util/subscribeToIterable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/subscribeToIterable';
diff --git a/node_modules/rxjs/src/util/subscribeToObservable.ts b/node_modules/rxjs/src/util/subscribeToObservable.ts
deleted file mode 100644
index 88495b8..0000000
--- a/node_modules/rxjs/src/util/subscribeToObservable.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/subscribeToObservable';
diff --git a/node_modules/rxjs/src/util/subscribeToPromise.ts b/node_modules/rxjs/src/util/subscribeToPromise.ts
deleted file mode 100644
index 4540e11..0000000
--- a/node_modules/rxjs/src/util/subscribeToPromise.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/subscribeToPromise';
diff --git a/node_modules/rxjs/src/util/subscribeToResult.ts b/node_modules/rxjs/src/util/subscribeToResult.ts
deleted file mode 100644
index 2ab44cc..0000000
--- a/node_modules/rxjs/src/util/subscribeToResult.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/subscribeToResult';
diff --git a/node_modules/rxjs/src/util/toSubscriber.ts b/node_modules/rxjs/src/util/toSubscriber.ts
deleted file mode 100644
index 61e1c7f..0000000
--- a/node_modules/rxjs/src/util/toSubscriber.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/toSubscriber';
diff --git a/node_modules/rxjs/src/util/tryCatch.ts b/node_modules/rxjs/src/util/tryCatch.ts
deleted file mode 100644
index 57c45c7..0000000
--- a/node_modules/rxjs/src/util/tryCatch.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/tryCatch';
diff --git a/node_modules/rxjs/src/webSocket/index.ts b/node_modules/rxjs/src/webSocket/index.ts
deleted file mode 100644
index 833d950..0000000
--- a/node_modules/rxjs/src/webSocket/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { webSocket as webSocket } from '../internal/observable/dom/webSocket';
-export { WebSocketSubject, WebSocketSubjectConfig } from '../internal/observable/dom/WebSocketSubject';
diff --git a/node_modules/rxjs/src/webSocket/package.json b/node_modules/rxjs/src/webSocket/package.json
deleted file mode 100644
index 34020bd..0000000
--- a/node_modules/rxjs/src/webSocket/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "rxjs/webSocket",
-  "typings": "./index.d.ts",
-  "main": "./index.js",
-  "module": "../_esm5/webSocket/index.js",
-  "es2015": "../_esm2015/webSocket/index.js",
-  "sideEffects": false
-}
diff --git a/node_modules/rxjs/symbol/iterator.d.ts b/node_modules/rxjs/symbol/iterator.d.ts
deleted file mode 100644
index 7090360..0000000
--- a/node_modules/rxjs/symbol/iterator.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/symbol/iterator';
diff --git a/node_modules/rxjs/symbol/iterator.js b/node_modules/rxjs/symbol/iterator.js
deleted file mode 100644
index e843ac9..0000000
--- a/node_modules/rxjs/symbol/iterator.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/symbol/iterator"));
-//# sourceMappingURL=iterator.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/symbol/iterator.js.map b/node_modules/rxjs/symbol/iterator.js.map
deleted file mode 100644
index 0ed8d47..0000000
--- a/node_modules/rxjs/symbol/iterator.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"iterator.js","sources":["../src/symbol/iterator.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/symbol/observable.d.ts b/node_modules/rxjs/symbol/observable.d.ts
deleted file mode 100644
index c5fc191..0000000
--- a/node_modules/rxjs/symbol/observable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/symbol/observable';
diff --git a/node_modules/rxjs/symbol/observable.js b/node_modules/rxjs/symbol/observable.js
deleted file mode 100644
index 1cccc45..0000000
--- a/node_modules/rxjs/symbol/observable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/symbol/observable"));
-//# sourceMappingURL=observable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/symbol/observable.js.map b/node_modules/rxjs/symbol/observable.js.map
deleted file mode 100644
index 03c9bd7..0000000
--- a/node_modules/rxjs/symbol/observable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"observable.js","sources":["../src/symbol/observable.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/symbol/rxSubscriber.d.ts b/node_modules/rxjs/symbol/rxSubscriber.d.ts
deleted file mode 100644
index cf3866a..0000000
--- a/node_modules/rxjs/symbol/rxSubscriber.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/symbol/rxSubscriber';
diff --git a/node_modules/rxjs/symbol/rxSubscriber.js b/node_modules/rxjs/symbol/rxSubscriber.js
deleted file mode 100644
index fe2c8fb..0000000
--- a/node_modules/rxjs/symbol/rxSubscriber.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/symbol/rxSubscriber"));
-//# sourceMappingURL=rxSubscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/symbol/rxSubscriber.js.map b/node_modules/rxjs/symbol/rxSubscriber.js.map
deleted file mode 100644
index a044a41..0000000
--- a/node_modules/rxjs/symbol/rxSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"rxSubscriber.js","sources":["../src/symbol/rxSubscriber.ts"],"names":[],"mappings":";;;;;AAAA,qDAAgD"}
diff --git a/node_modules/rxjs/testing/index.d.ts b/node_modules/rxjs/testing/index.d.ts
deleted file mode 100644
index 4c23a72..0000000
--- a/node_modules/rxjs/testing/index.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { TestScheduler } from '../internal/testing/TestScheduler';
diff --git a/node_modules/rxjs/testing/index.js b/node_modules/rxjs/testing/index.js
deleted file mode 100644
index 755148d..0000000
--- a/node_modules/rxjs/testing/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var TestScheduler_1 = require("../internal/testing/TestScheduler");
-exports.TestScheduler = TestScheduler_1.TestScheduler;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/testing/index.js.map b/node_modules/rxjs/testing/index.js.map
deleted file mode 100644
index 910637e..0000000
--- a/node_modules/rxjs/testing/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../src/testing/index.ts"],"names":[],"mappings":";;AAAA,mEAAkE;AAAzD,wCAAA,aAAa,CAAA"}
diff --git a/node_modules/rxjs/testing/package.json b/node_modules/rxjs/testing/package.json
deleted file mode 100644
index 1a11a9f..0000000
--- a/node_modules/rxjs/testing/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "rxjs/testing",
-  "typings": "./index.d.ts",
-  "main": "./index.js",
-  "module": "../_esm5/testing/index.js",
-  "es2015": "../_esm2015/testing/index.js",
-  "sideEffects": false
-}
diff --git a/node_modules/rxjs/util/ArgumentOutOfRangeError.d.ts b/node_modules/rxjs/util/ArgumentOutOfRangeError.d.ts
deleted file mode 100644
index 48e4712..0000000
--- a/node_modules/rxjs/util/ArgumentOutOfRangeError.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/ArgumentOutOfRangeError';
diff --git a/node_modules/rxjs/util/ArgumentOutOfRangeError.js b/node_modules/rxjs/util/ArgumentOutOfRangeError.js
deleted file mode 100644
index 493a895..0000000
--- a/node_modules/rxjs/util/ArgumentOutOfRangeError.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/ArgumentOutOfRangeError"));
-//# sourceMappingURL=ArgumentOutOfRangeError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/ArgumentOutOfRangeError.js.map b/node_modules/rxjs/util/ArgumentOutOfRangeError.js.map
deleted file mode 100644
index fc8bea3..0000000
--- a/node_modules/rxjs/util/ArgumentOutOfRangeError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ArgumentOutOfRangeError.js","sources":["../src/util/ArgumentOutOfRangeError.ts"],"names":[],"mappings":";;;;;AAAA,8DAAyD"}
diff --git a/node_modules/rxjs/util/EmptyError.d.ts b/node_modules/rxjs/util/EmptyError.d.ts
deleted file mode 100644
index 8d25892..0000000
--- a/node_modules/rxjs/util/EmptyError.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/EmptyError';
diff --git a/node_modules/rxjs/util/EmptyError.js b/node_modules/rxjs/util/EmptyError.js
deleted file mode 100644
index 781eaac..0000000
--- a/node_modules/rxjs/util/EmptyError.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/EmptyError"));
-//# sourceMappingURL=EmptyError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/EmptyError.js.map b/node_modules/rxjs/util/EmptyError.js.map
deleted file mode 100644
index 43f933f..0000000
--- a/node_modules/rxjs/util/EmptyError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"EmptyError.js","sources":["../src/util/EmptyError.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/util/Immediate.d.ts b/node_modules/rxjs/util/Immediate.d.ts
deleted file mode 100644
index 2bfaf13..0000000
--- a/node_modules/rxjs/util/Immediate.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/Immediate';
diff --git a/node_modules/rxjs/util/Immediate.js b/node_modules/rxjs/util/Immediate.js
deleted file mode 100644
index 763687f..0000000
--- a/node_modules/rxjs/util/Immediate.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/Immediate"));
-//# sourceMappingURL=Immediate.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/Immediate.js.map b/node_modules/rxjs/util/Immediate.js.map
deleted file mode 100644
index 58b1722..0000000
--- a/node_modules/rxjs/util/Immediate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Immediate.js","sources":["../src/util/Immediate.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/util/ObjectUnsubscribedError.d.ts b/node_modules/rxjs/util/ObjectUnsubscribedError.d.ts
deleted file mode 100644
index 3ae25a9..0000000
--- a/node_modules/rxjs/util/ObjectUnsubscribedError.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/ObjectUnsubscribedError';
diff --git a/node_modules/rxjs/util/ObjectUnsubscribedError.js b/node_modules/rxjs/util/ObjectUnsubscribedError.js
deleted file mode 100644
index 3f694db..0000000
--- a/node_modules/rxjs/util/ObjectUnsubscribedError.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/ObjectUnsubscribedError"));
-//# sourceMappingURL=ObjectUnsubscribedError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/ObjectUnsubscribedError.js.map b/node_modules/rxjs/util/ObjectUnsubscribedError.js.map
deleted file mode 100644
index 65e5099..0000000
--- a/node_modules/rxjs/util/ObjectUnsubscribedError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ObjectUnsubscribedError.js","sources":["../src/util/ObjectUnsubscribedError.ts"],"names":[],"mappings":";;;;;AAAA,8DAAyD"}
diff --git a/node_modules/rxjs/util/TimeoutError.d.ts b/node_modules/rxjs/util/TimeoutError.d.ts
deleted file mode 100644
index 31aae0b..0000000
--- a/node_modules/rxjs/util/TimeoutError.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/TimeoutError';
diff --git a/node_modules/rxjs/util/TimeoutError.js b/node_modules/rxjs/util/TimeoutError.js
deleted file mode 100644
index 11ddb2d..0000000
--- a/node_modules/rxjs/util/TimeoutError.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/TimeoutError"));
-//# sourceMappingURL=TimeoutError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/TimeoutError.js.map b/node_modules/rxjs/util/TimeoutError.js.map
deleted file mode 100644
index 6fcb847..0000000
--- a/node_modules/rxjs/util/TimeoutError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TimeoutError.js","sources":["../src/util/TimeoutError.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/util/UnsubscriptionError.d.ts b/node_modules/rxjs/util/UnsubscriptionError.d.ts
deleted file mode 100644
index fbf4c1c..0000000
--- a/node_modules/rxjs/util/UnsubscriptionError.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/UnsubscriptionError';
diff --git a/node_modules/rxjs/util/UnsubscriptionError.js b/node_modules/rxjs/util/UnsubscriptionError.js
deleted file mode 100644
index 53d3e1d..0000000
--- a/node_modules/rxjs/util/UnsubscriptionError.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/UnsubscriptionError"));
-//# sourceMappingURL=UnsubscriptionError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/UnsubscriptionError.js.map b/node_modules/rxjs/util/UnsubscriptionError.js.map
deleted file mode 100644
index 58684c5..0000000
--- a/node_modules/rxjs/util/UnsubscriptionError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"UnsubscriptionError.js","sources":["../src/util/UnsubscriptionError.ts"],"names":[],"mappings":";;;;;AAAA,0DAAqD"}
diff --git a/node_modules/rxjs/util/applyMixins.d.ts b/node_modules/rxjs/util/applyMixins.d.ts
deleted file mode 100644
index b5ef81c..0000000
--- a/node_modules/rxjs/util/applyMixins.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/applyMixins';
diff --git a/node_modules/rxjs/util/applyMixins.js b/node_modules/rxjs/util/applyMixins.js
deleted file mode 100644
index 96dd781..0000000
--- a/node_modules/rxjs/util/applyMixins.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/applyMixins"));
-//# sourceMappingURL=applyMixins.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/applyMixins.js.map b/node_modules/rxjs/util/applyMixins.js.map
deleted file mode 100644
index 31bdb17..0000000
--- a/node_modules/rxjs/util/applyMixins.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"applyMixins.js","sources":["../src/util/applyMixins.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/util/errorObject.d.ts b/node_modules/rxjs/util/errorObject.d.ts
deleted file mode 100644
index 3dad2b9..0000000
--- a/node_modules/rxjs/util/errorObject.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/errorObject';
diff --git a/node_modules/rxjs/util/errorObject.js b/node_modules/rxjs/util/errorObject.js
deleted file mode 100644
index 01dec18..0000000
--- a/node_modules/rxjs/util/errorObject.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/errorObject"));
-//# sourceMappingURL=errorObject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/errorObject.js.map b/node_modules/rxjs/util/errorObject.js.map
deleted file mode 100644
index 1806438..0000000
--- a/node_modules/rxjs/util/errorObject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"errorObject.js","sources":["../src/util/errorObject.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/util/hostReportError.d.ts b/node_modules/rxjs/util/hostReportError.d.ts
deleted file mode 100644
index 74d0de4..0000000
--- a/node_modules/rxjs/util/hostReportError.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/hostReportError';
diff --git a/node_modules/rxjs/util/hostReportError.js b/node_modules/rxjs/util/hostReportError.js
deleted file mode 100644
index 670bc65..0000000
--- a/node_modules/rxjs/util/hostReportError.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/hostReportError"));
-//# sourceMappingURL=hostReportError.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/hostReportError.js.map b/node_modules/rxjs/util/hostReportError.js.map
deleted file mode 100644
index f4eb9bd..0000000
--- a/node_modules/rxjs/util/hostReportError.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"hostReportError.js","sources":["../src/util/hostReportError.ts"],"names":[],"mappings":";;;;;AAAA,sDAAiD"}
diff --git a/node_modules/rxjs/util/identity.d.ts b/node_modules/rxjs/util/identity.d.ts
deleted file mode 100644
index 685e462..0000000
--- a/node_modules/rxjs/util/identity.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/identity';
diff --git a/node_modules/rxjs/util/identity.js b/node_modules/rxjs/util/identity.js
deleted file mode 100644
index f021096..0000000
--- a/node_modules/rxjs/util/identity.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/identity"));
-//# sourceMappingURL=identity.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/identity.js.map b/node_modules/rxjs/util/identity.js.map
deleted file mode 100644
index e437626..0000000
--- a/node_modules/rxjs/util/identity.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"identity.js","sources":["../src/util/identity.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/util/isArray.d.ts b/node_modules/rxjs/util/isArray.d.ts
deleted file mode 100644
index 5ca2e21..0000000
--- a/node_modules/rxjs/util/isArray.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isArray';
diff --git a/node_modules/rxjs/util/isArray.js b/node_modules/rxjs/util/isArray.js
deleted file mode 100644
index 123665b..0000000
--- a/node_modules/rxjs/util/isArray.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/isArray"));
-//# sourceMappingURL=isArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/isArray.js.map b/node_modules/rxjs/util/isArray.js.map
deleted file mode 100644
index 4b49835..0000000
--- a/node_modules/rxjs/util/isArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isArray.js","sources":["../src/util/isArray.ts"],"names":[],"mappings":";;;;;AAAA,8CAAyC"}
diff --git a/node_modules/rxjs/util/isArrayLike.d.ts b/node_modules/rxjs/util/isArrayLike.d.ts
deleted file mode 100644
index a8b03d2..0000000
--- a/node_modules/rxjs/util/isArrayLike.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isArrayLike';
diff --git a/node_modules/rxjs/util/isArrayLike.js b/node_modules/rxjs/util/isArrayLike.js
deleted file mode 100644
index 83f5ecf..0000000
--- a/node_modules/rxjs/util/isArrayLike.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/isArrayLike"));
-//# sourceMappingURL=isArrayLike.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/isArrayLike.js.map b/node_modules/rxjs/util/isArrayLike.js.map
deleted file mode 100644
index 541be63..0000000
--- a/node_modules/rxjs/util/isArrayLike.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isArrayLike.js","sources":["../src/util/isArrayLike.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/util/isDate.d.ts b/node_modules/rxjs/util/isDate.d.ts
deleted file mode 100644
index c5ebb01..0000000
--- a/node_modules/rxjs/util/isDate.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isDate';
diff --git a/node_modules/rxjs/util/isDate.js b/node_modules/rxjs/util/isDate.js
deleted file mode 100644
index 8ab33c3..0000000
--- a/node_modules/rxjs/util/isDate.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/isDate"));
-//# sourceMappingURL=isDate.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/isDate.js.map b/node_modules/rxjs/util/isDate.js.map
deleted file mode 100644
index 668a2c2..0000000
--- a/node_modules/rxjs/util/isDate.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isDate.js","sources":["../src/util/isDate.ts"],"names":[],"mappings":";;;;;AAAA,6CAAwC"}
diff --git a/node_modules/rxjs/util/isFunction.d.ts b/node_modules/rxjs/util/isFunction.d.ts
deleted file mode 100644
index 7b4a54a..0000000
--- a/node_modules/rxjs/util/isFunction.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isFunction';
diff --git a/node_modules/rxjs/util/isFunction.js b/node_modules/rxjs/util/isFunction.js
deleted file mode 100644
index 0f720e9..0000000
--- a/node_modules/rxjs/util/isFunction.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/isFunction"));
-//# sourceMappingURL=isFunction.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/isFunction.js.map b/node_modules/rxjs/util/isFunction.js.map
deleted file mode 100644
index 1662a61..0000000
--- a/node_modules/rxjs/util/isFunction.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isFunction.js","sources":["../src/util/isFunction.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/util/isIterable.d.ts b/node_modules/rxjs/util/isIterable.d.ts
deleted file mode 100644
index e7ffaae..0000000
--- a/node_modules/rxjs/util/isIterable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isIterable';
diff --git a/node_modules/rxjs/util/isIterable.js b/node_modules/rxjs/util/isIterable.js
deleted file mode 100644
index 59afc85..0000000
--- a/node_modules/rxjs/util/isIterable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/isIterable"));
-//# sourceMappingURL=isIterable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/isIterable.js.map b/node_modules/rxjs/util/isIterable.js.map
deleted file mode 100644
index a7c5645..0000000
--- a/node_modules/rxjs/util/isIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isIterable.js","sources":["../src/util/isIterable.ts"],"names":[],"mappings":";;;;;AAAA,iDAA4C"}
diff --git a/node_modules/rxjs/util/isNumeric.d.ts b/node_modules/rxjs/util/isNumeric.d.ts
deleted file mode 100644
index eeefcc2..0000000
--- a/node_modules/rxjs/util/isNumeric.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isNumeric';
diff --git a/node_modules/rxjs/util/isNumeric.js b/node_modules/rxjs/util/isNumeric.js
deleted file mode 100644
index ada8604..0000000
--- a/node_modules/rxjs/util/isNumeric.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/isNumeric"));
-//# sourceMappingURL=isNumeric.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/isNumeric.js.map b/node_modules/rxjs/util/isNumeric.js.map
deleted file mode 100644
index 4156a54..0000000
--- a/node_modules/rxjs/util/isNumeric.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isNumeric.js","sources":["../src/util/isNumeric.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/util/isObject.d.ts b/node_modules/rxjs/util/isObject.d.ts
deleted file mode 100644
index 4b57d81..0000000
--- a/node_modules/rxjs/util/isObject.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isObject';
diff --git a/node_modules/rxjs/util/isObject.js b/node_modules/rxjs/util/isObject.js
deleted file mode 100644
index 0a0d27f..0000000
--- a/node_modules/rxjs/util/isObject.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/isObject"));
-//# sourceMappingURL=isObject.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/isObject.js.map b/node_modules/rxjs/util/isObject.js.map
deleted file mode 100644
index 957d301..0000000
--- a/node_modules/rxjs/util/isObject.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isObject.js","sources":["../src/util/isObject.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/util/isObservable.d.ts b/node_modules/rxjs/util/isObservable.d.ts
deleted file mode 100644
index cdf34ca..0000000
--- a/node_modules/rxjs/util/isObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isObservable';
diff --git a/node_modules/rxjs/util/isObservable.js b/node_modules/rxjs/util/isObservable.js
deleted file mode 100644
index 82aaee1..0000000
--- a/node_modules/rxjs/util/isObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/isObservable"));
-//# sourceMappingURL=isObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/isObservable.js.map b/node_modules/rxjs/util/isObservable.js.map
deleted file mode 100644
index 0f49141..0000000
--- a/node_modules/rxjs/util/isObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isObservable.js","sources":["../src/util/isObservable.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/util/isPromise.d.ts b/node_modules/rxjs/util/isPromise.d.ts
deleted file mode 100644
index 1494a4b..0000000
--- a/node_modules/rxjs/util/isPromise.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isPromise';
diff --git a/node_modules/rxjs/util/isPromise.js b/node_modules/rxjs/util/isPromise.js
deleted file mode 100644
index 9c20b95..0000000
--- a/node_modules/rxjs/util/isPromise.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/isPromise"));
-//# sourceMappingURL=isPromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/isPromise.js.map b/node_modules/rxjs/util/isPromise.js.map
deleted file mode 100644
index 0bf0d89..0000000
--- a/node_modules/rxjs/util/isPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isPromise.js","sources":["../src/util/isPromise.ts"],"names":[],"mappings":";;;;;AAAA,gDAA2C"}
diff --git a/node_modules/rxjs/util/isScheduler.d.ts b/node_modules/rxjs/util/isScheduler.d.ts
deleted file mode 100644
index fd1a1f2..0000000
--- a/node_modules/rxjs/util/isScheduler.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/isScheduler';
diff --git a/node_modules/rxjs/util/isScheduler.js b/node_modules/rxjs/util/isScheduler.js
deleted file mode 100644
index addd047..0000000
--- a/node_modules/rxjs/util/isScheduler.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/isScheduler"));
-//# sourceMappingURL=isScheduler.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/isScheduler.js.map b/node_modules/rxjs/util/isScheduler.js.map
deleted file mode 100644
index 2b8dfb0..0000000
--- a/node_modules/rxjs/util/isScheduler.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"isScheduler.js","sources":["../src/util/isScheduler.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/util/noop.d.ts b/node_modules/rxjs/util/noop.d.ts
deleted file mode 100644
index 0fe22e1..0000000
--- a/node_modules/rxjs/util/noop.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/noop';
diff --git a/node_modules/rxjs/util/noop.js b/node_modules/rxjs/util/noop.js
deleted file mode 100644
index c8c32ae..0000000
--- a/node_modules/rxjs/util/noop.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/noop"));
-//# sourceMappingURL=noop.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/noop.js.map b/node_modules/rxjs/util/noop.js.map
deleted file mode 100644
index 55d6e35..0000000
--- a/node_modules/rxjs/util/noop.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"noop.js","sources":["../src/util/noop.ts"],"names":[],"mappings":";;;;;AAAA,2CAAsC"}
diff --git a/node_modules/rxjs/util/not.d.ts b/node_modules/rxjs/util/not.d.ts
deleted file mode 100644
index 3831576..0000000
--- a/node_modules/rxjs/util/not.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/not';
diff --git a/node_modules/rxjs/util/not.js b/node_modules/rxjs/util/not.js
deleted file mode 100644
index 5ab75a3..0000000
--- a/node_modules/rxjs/util/not.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/not"));
-//# sourceMappingURL=not.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/not.js.map b/node_modules/rxjs/util/not.js.map
deleted file mode 100644
index 0b543b5..0000000
--- a/node_modules/rxjs/util/not.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"not.js","sources":["../src/util/not.ts"],"names":[],"mappings":";;;;;AAAA,0CAAqC"}
diff --git a/node_modules/rxjs/util/pipe.d.ts b/node_modules/rxjs/util/pipe.d.ts
deleted file mode 100644
index da6342a..0000000
--- a/node_modules/rxjs/util/pipe.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/pipe';
diff --git a/node_modules/rxjs/util/pipe.js b/node_modules/rxjs/util/pipe.js
deleted file mode 100644
index aab054c..0000000
--- a/node_modules/rxjs/util/pipe.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/pipe"));
-//# sourceMappingURL=pipe.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/pipe.js.map b/node_modules/rxjs/util/pipe.js.map
deleted file mode 100644
index 6808847..0000000
--- a/node_modules/rxjs/util/pipe.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"pipe.js","sources":["../src/util/pipe.ts"],"names":[],"mappings":";;;;;AAAA,2CAAsC"}
diff --git a/node_modules/rxjs/util/root.d.ts b/node_modules/rxjs/util/root.d.ts
deleted file mode 100644
index 25b6c79..0000000
--- a/node_modules/rxjs/util/root.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/root';
diff --git a/node_modules/rxjs/util/root.js b/node_modules/rxjs/util/root.js
deleted file mode 100644
index 03e889e..0000000
--- a/node_modules/rxjs/util/root.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/root"));
-//# sourceMappingURL=root.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/root.js.map b/node_modules/rxjs/util/root.js.map
deleted file mode 100644
index fe0aa14..0000000
--- a/node_modules/rxjs/util/root.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"root.js","sources":["../src/util/root.ts"],"names":[],"mappings":";;;;;AAAA,2CAAsC"}
diff --git a/node_modules/rxjs/util/subscribeTo.d.ts b/node_modules/rxjs/util/subscribeTo.d.ts
deleted file mode 100644
index 471f192..0000000
--- a/node_modules/rxjs/util/subscribeTo.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/subscribeTo';
diff --git a/node_modules/rxjs/util/subscribeTo.js b/node_modules/rxjs/util/subscribeTo.js
deleted file mode 100644
index f206984..0000000
--- a/node_modules/rxjs/util/subscribeTo.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/subscribeTo"));
-//# sourceMappingURL=subscribeTo.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/subscribeTo.js.map b/node_modules/rxjs/util/subscribeTo.js.map
deleted file mode 100644
index f916ff9..0000000
--- a/node_modules/rxjs/util/subscribeTo.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeTo.js","sources":["../src/util/subscribeTo.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C"}
diff --git a/node_modules/rxjs/util/subscribeToArray.d.ts b/node_modules/rxjs/util/subscribeToArray.d.ts
deleted file mode 100644
index 9220f62..0000000
--- a/node_modules/rxjs/util/subscribeToArray.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/subscribeToArray';
diff --git a/node_modules/rxjs/util/subscribeToArray.js b/node_modules/rxjs/util/subscribeToArray.js
deleted file mode 100644
index a64fea5..0000000
--- a/node_modules/rxjs/util/subscribeToArray.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/subscribeToArray"));
-//# sourceMappingURL=subscribeToArray.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/subscribeToArray.js.map b/node_modules/rxjs/util/subscribeToArray.js.map
deleted file mode 100644
index c0715f3..0000000
--- a/node_modules/rxjs/util/subscribeToArray.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToArray.js","sources":["../src/util/subscribeToArray.ts"],"names":[],"mappings":";;;;;AAAA,uDAAkD"}
diff --git a/node_modules/rxjs/util/subscribeToIterable.d.ts b/node_modules/rxjs/util/subscribeToIterable.d.ts
deleted file mode 100644
index 6edb1ef..0000000
--- a/node_modules/rxjs/util/subscribeToIterable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/subscribeToIterable';
diff --git a/node_modules/rxjs/util/subscribeToIterable.js b/node_modules/rxjs/util/subscribeToIterable.js
deleted file mode 100644
index 1c47e68..0000000
--- a/node_modules/rxjs/util/subscribeToIterable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/subscribeToIterable"));
-//# sourceMappingURL=subscribeToIterable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/subscribeToIterable.js.map b/node_modules/rxjs/util/subscribeToIterable.js.map
deleted file mode 100644
index ed148b7..0000000
--- a/node_modules/rxjs/util/subscribeToIterable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToIterable.js","sources":["../src/util/subscribeToIterable.ts"],"names":[],"mappings":";;;;;AAAA,0DAAqD"}
diff --git a/node_modules/rxjs/util/subscribeToObservable.d.ts b/node_modules/rxjs/util/subscribeToObservable.d.ts
deleted file mode 100644
index 88495b8..0000000
--- a/node_modules/rxjs/util/subscribeToObservable.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/subscribeToObservable';
diff --git a/node_modules/rxjs/util/subscribeToObservable.js b/node_modules/rxjs/util/subscribeToObservable.js
deleted file mode 100644
index c25a8d5..0000000
--- a/node_modules/rxjs/util/subscribeToObservable.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/subscribeToObservable"));
-//# sourceMappingURL=subscribeToObservable.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/subscribeToObservable.js.map b/node_modules/rxjs/util/subscribeToObservable.js.map
deleted file mode 100644
index c7419fd..0000000
--- a/node_modules/rxjs/util/subscribeToObservable.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToObservable.js","sources":["../src/util/subscribeToObservable.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuD"}
diff --git a/node_modules/rxjs/util/subscribeToPromise.d.ts b/node_modules/rxjs/util/subscribeToPromise.d.ts
deleted file mode 100644
index 4540e11..0000000
--- a/node_modules/rxjs/util/subscribeToPromise.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/subscribeToPromise';
diff --git a/node_modules/rxjs/util/subscribeToPromise.js b/node_modules/rxjs/util/subscribeToPromise.js
deleted file mode 100644
index 15c6aa3..0000000
--- a/node_modules/rxjs/util/subscribeToPromise.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/subscribeToPromise"));
-//# sourceMappingURL=subscribeToPromise.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/subscribeToPromise.js.map b/node_modules/rxjs/util/subscribeToPromise.js.map
deleted file mode 100644
index cf2f9cc..0000000
--- a/node_modules/rxjs/util/subscribeToPromise.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToPromise.js","sources":["../src/util/subscribeToPromise.ts"],"names":[],"mappings":";;;;;AAAA,yDAAoD"}
diff --git a/node_modules/rxjs/util/subscribeToResult.d.ts b/node_modules/rxjs/util/subscribeToResult.d.ts
deleted file mode 100644
index 2ab44cc..0000000
--- a/node_modules/rxjs/util/subscribeToResult.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/subscribeToResult';
diff --git a/node_modules/rxjs/util/subscribeToResult.js b/node_modules/rxjs/util/subscribeToResult.js
deleted file mode 100644
index 0ce16c8..0000000
--- a/node_modules/rxjs/util/subscribeToResult.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/subscribeToResult"));
-//# sourceMappingURL=subscribeToResult.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/subscribeToResult.js.map b/node_modules/rxjs/util/subscribeToResult.js.map
deleted file mode 100644
index dad2ba6..0000000
--- a/node_modules/rxjs/util/subscribeToResult.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"subscribeToResult.js","sources":["../src/util/subscribeToResult.ts"],"names":[],"mappings":";;;;;AAAA,wDAAmD"}
diff --git a/node_modules/rxjs/util/toSubscriber.d.ts b/node_modules/rxjs/util/toSubscriber.d.ts
deleted file mode 100644
index 61e1c7f..0000000
--- a/node_modules/rxjs/util/toSubscriber.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/toSubscriber';
diff --git a/node_modules/rxjs/util/toSubscriber.js b/node_modules/rxjs/util/toSubscriber.js
deleted file mode 100644
index be519c1..0000000
--- a/node_modules/rxjs/util/toSubscriber.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/toSubscriber"));
-//# sourceMappingURL=toSubscriber.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/toSubscriber.js.map b/node_modules/rxjs/util/toSubscriber.js.map
deleted file mode 100644
index 616740e..0000000
--- a/node_modules/rxjs/util/toSubscriber.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"toSubscriber.js","sources":["../src/util/toSubscriber.ts"],"names":[],"mappings":";;;;;AAAA,mDAA8C"}
diff --git a/node_modules/rxjs/util/tryCatch.d.ts b/node_modules/rxjs/util/tryCatch.d.ts
deleted file mode 100644
index 57c45c7..0000000
--- a/node_modules/rxjs/util/tryCatch.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from 'rxjs-compat/util/tryCatch';
diff --git a/node_modules/rxjs/util/tryCatch.js b/node_modules/rxjs/util/tryCatch.js
deleted file mode 100644
index 58e4f2b..0000000
--- a/node_modules/rxjs/util/tryCatch.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("rxjs-compat/util/tryCatch"));
-//# sourceMappingURL=tryCatch.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/util/tryCatch.js.map b/node_modules/rxjs/util/tryCatch.js.map
deleted file mode 100644
index 34f3abf..0000000
--- a/node_modules/rxjs/util/tryCatch.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"tryCatch.js","sources":["../src/util/tryCatch.ts"],"names":[],"mappings":";;;;;AAAA,+CAA0C"}
diff --git a/node_modules/rxjs/webSocket/index.d.ts b/node_modules/rxjs/webSocket/index.d.ts
deleted file mode 100644
index 833d950..0000000
--- a/node_modules/rxjs/webSocket/index.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { webSocket as webSocket } from '../internal/observable/dom/webSocket';
-export { WebSocketSubject, WebSocketSubjectConfig } from '../internal/observable/dom/WebSocketSubject';
diff --git a/node_modules/rxjs/webSocket/index.js b/node_modules/rxjs/webSocket/index.js
deleted file mode 100644
index 475f11b..0000000
--- a/node_modules/rxjs/webSocket/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var webSocket_1 = require("../internal/observable/dom/webSocket");
-exports.webSocket = webSocket_1.webSocket;
-var WebSocketSubject_1 = require("../internal/observable/dom/WebSocketSubject");
-exports.WebSocketSubject = WebSocketSubject_1.WebSocketSubject;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/rxjs/webSocket/index.js.map b/node_modules/rxjs/webSocket/index.js.map
deleted file mode 100644
index be7b7db..0000000
--- a/node_modules/rxjs/webSocket/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sources":["../src/webSocket/index.ts"],"names":[],"mappings":";;AAAA,kEAA8E;AAArE,gCAAA,SAAS,CAAa;AAC/B,gFAAuG;AAA9F,8CAAA,gBAAgB,CAAA"}
diff --git a/node_modules/rxjs/webSocket/package.json b/node_modules/rxjs/webSocket/package.json
deleted file mode 100644
index 34020bd..0000000
--- a/node_modules/rxjs/webSocket/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "name": "rxjs/webSocket",
-  "typings": "./index.d.ts",
-  "main": "./index.js",
-  "module": "../_esm5/webSocket/index.js",
-  "es2015": "../_esm2015/webSocket/index.js",
-  "sideEffects": false
-}
diff --git a/node_modules/side-channel/.eslintrc b/node_modules/side-channel/.eslintrc
deleted file mode 100644
index 850ac1f..0000000
--- a/node_modules/side-channel/.eslintrc
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"max-lines-per-function": 0,
-		"max-params": 0,
-		"new-cap": [2, { "capIsNewExceptions": ["GetIntrinsic"] }],
-	},
-}
diff --git a/node_modules/side-channel/.github/FUNDING.yml b/node_modules/side-channel/.github/FUNDING.yml
deleted file mode 100644
index 2a94840..0000000
--- a/node_modules/side-channel/.github/FUNDING.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# These are supported funding model platforms
-
-github: [ljharb]
-patreon: # Replace with a single Patreon username
-open_collective: # Replace with a single Open Collective username
-ko_fi: # Replace with a single Ko-fi username
-tidelift: npm/side-channel
-community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
-liberapay: # Replace with a single Liberapay username
-issuehunt: # Replace with a single IssueHunt username
-otechie: # Replace with a single Otechie username
-custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/node_modules/side-channel/.github/workflows/rebase.yml b/node_modules/side-channel/.github/workflows/rebase.yml
deleted file mode 100644
index 436cb79..0000000
--- a/node_modules/side-channel/.github/workflows/rebase.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: Automatic Rebase
-
-on: [pull_request]
-
-jobs:
-  _:
-    name: "Automatic Rebase"
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v1
-    - uses: ljharb/rebase@master
-      env:
-        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/node_modules/side-channel/.travis.yml b/node_modules/side-channel/.travis.yml
deleted file mode 100644
index 5ed0fa5..0000000
--- a/node_modules/side-channel/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-version: ~> 1.0
-language: node_js
-os:
- - linux
-import:
- - ljharb/travis-ci:node/all.yml
- - ljharb/travis-ci:node/pretest.yml
- - ljharb/travis-ci:node/posttest.yml
diff --git a/node_modules/side-channel/CHANGELOG.md b/node_modules/side-channel/CHANGELOG.md
deleted file mode 100644
index 705d80c..0000000
--- a/node_modules/side-channel/CHANGELOG.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# Changelog
-
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
-and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-
-Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
-
-## [v1.0.2](https://github.com/ljharb/side-channel/compare/v1.0.1...v1.0.2) - 2019-12-20
-
-### Commits
-
-- [Dev Deps] update `@ljharb/eslint-config`, `tape` [`4a526df`](https://github.com/ljharb/side-channel/commit/4a526df44e4701566ed001ec78546193f818b082)
-- [Deps] update `es-abstract` [`d4f6e62`](https://github.com/ljharb/side-channel/commit/d4f6e629b6fb93a07415db7f30d3c90fd7f264fe)
-
-## [v1.0.1](https://github.com/ljharb/side-channel/compare/v1.0.0...v1.0.1) - 2019-12-02
-
-### Commits
-
-- [Fix] add missing "exports" [`d212907`](https://github.com/ljharb/side-channel/commit/d2129073abf0701a5343bf28aa2145617604dc2e)
-
-## v1.0.0 - 2019-12-02
-
-### Commits
-
-- Initial implementation [`dbebd3a`](https://github.com/ljharb/side-channel/commit/dbebd3a4b5ed64242f9a6810efe7c4214cd8cde4)
-- Initial tests [`73bdefe`](https://github.com/ljharb/side-channel/commit/73bdefe568c9076cf8c0b8719bc2141aec0e19b8)
-- Initial commit [`43c03e1`](https://github.com/ljharb/side-channel/commit/43c03e1c2849ec50a87b7a5cd76238a62b0b8770)
-- npm init [`5c090a7`](https://github.com/ljharb/side-channel/commit/5c090a765d66a5527d9889b89aeff78dee91348c)
-- [meta] add `auto-changelog` [`a5c4e56`](https://github.com/ljharb/side-channel/commit/a5c4e5675ec02d5eb4d84b4243aeea2a1d38fbec)
-- [actions] add automatic rebasing / merge commit blocking [`bab1683`](https://github.com/ljharb/side-channel/commit/bab1683d8f9754b086e94397699fdc645e0d7077)
-- [meta] add `funding` field; create FUNDING.yml [`63d7aea`](https://github.com/ljharb/side-channel/commit/63d7aeaf34f5650650ae97ca4b9fae685bd0937c)
-- [Tests] add `npm run lint` [`46a5a81`](https://github.com/ljharb/side-channel/commit/46a5a81705cd2664f83df232c01dbbf2ee952885)
-- Only apps should have lockfiles [`8b16b03`](https://github.com/ljharb/side-channel/commit/8b16b0305f00895d90c4e2e5773c854cfea0e448)
-- [meta] add `safe-publish-latest` [`2f098ef`](https://github.com/ljharb/side-channel/commit/2f098ef092a39399cfe548b19a1fc03c2fd2f490)
diff --git a/node_modules/side-channel/LICENSE b/node_modules/side-channel/LICENSE
deleted file mode 100644
index 3900dd7..0000000
--- a/node_modules/side-channel/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2019 Jordan Harband
-
-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/node_modules/side-channel/README.md b/node_modules/side-channel/README.md
deleted file mode 100644
index 7fa4f06..0000000
--- a/node_modules/side-channel/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-# side-channel
-Store information about any JS value in a side channel. Uses WeakMap if available.
diff --git a/node_modules/side-channel/index.js b/node_modules/side-channel/index.js
deleted file mode 100644
index e1fc174..0000000
--- a/node_modules/side-channel/index.js
+++ /dev/null
@@ -1,107 +0,0 @@
-'use strict';
-
-var GetIntrinsic = require('es-abstract/GetIntrinsic');
-var callBound = require('es-abstract/helpers/callBound');
-var inspect = require('object-inspect');
-
-var $TypeError = GetIntrinsic('%TypeError%');
-var $WeakMap = GetIntrinsic('%WeakMap%', true);
-var $Map = GetIntrinsic('%Map%', true);
-var $push = callBound('Array.prototype.push');
-
-var $weakMapGet = callBound('WeakMap.prototype.get', true);
-var $weakMapSet = callBound('WeakMap.prototype.set', true);
-var $weakMapHas = callBound('WeakMap.prototype.has', true);
-var $mapGet = callBound('Map.prototype.get', true);
-var $mapSet = callBound('Map.prototype.set', true);
-var $mapHas = callBound('Map.prototype.has', true);
-var objectGet = function (objects, key) { // eslint-disable-line consistent-return
-	for (var i = 0; i < objects.length; i += 1) {
-		if (objects[i].key === key) {
-			return objects[i].value;
-		}
-	}
-};
-var objectSet = function (objects, key, value) {
-	for (var i = 0; i < objects.length; i += 1) {
-		if (objects[i].key === key) {
-			objects[i].value = value; // eslint-disable-line no-param-reassign
-			return;
-		}
-	}
-	$push(objects, {
-		key: key,
-		value: value
-	});
-};
-var objectHas = function (objects, key) {
-	for (var i = 0; i < objects.length; i += 1) {
-		if (objects[i].key === key) {
-			return true;
-		}
-	}
-	return false;
-};
-
-module.exports = function getSideChannel() {
-	var $wm;
-	var $m;
-	var $o;
-	var channel = {
-		assert: function (key) {
-			if (!channel.has(key)) {
-				throw new $TypeError('Side channel does not contain ' + inspect(key));
-			}
-		},
-		get: function (key) { // eslint-disable-line consistent-return
-			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
-				if ($wm) {
-					return $weakMapGet($wm, key);
-				}
-			} else if ($Map) {
-				if ($m) {
-					return $mapGet($m, key);
-				}
-			} else {
-				if ($o) { // eslint-disable-line no-lonely-if
-					return objectGet($o, key);
-				}
-			}
-		},
-		has: function (key) {
-			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
-				if ($wm) {
-					return $weakMapHas($wm, key);
-				}
-			} else if ($Map) {
-				if ($m) {
-					return $mapHas($m, key);
-				}
-			} else {
-				if ($o) { // eslint-disable-line no-lonely-if
-					return objectHas($o, key);
-				}
-			}
-			return false;
-		},
-		set: function (key, value) {
-			if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
-				if (!$wm) {
-					$wm = new $WeakMap();
-				}
-				$weakMapSet($wm, key, value);
-			} else if ($Map) {
-				if (!$m) {
-					$m = new $Map();
-				}
-				$mapSet($m, key, value);
-			} else {
-				if (!$o) {
-					$o = [];
-				}
-				objectSet($o, key, value);
-			}
-		}
-	};
-	return channel;
-};
diff --git a/node_modules/side-channel/package.json b/node_modules/side-channel/package.json
deleted file mode 100644
index 3c3ce7f..0000000
--- a/node_modules/side-channel/package.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
-	"name": "side-channel",
-	"version": "1.0.2",
-	"description": "Store information about any JS value in a side channel. Uses WeakMap if available.",
-	"main": "index.js",
-	"exports": {
-		".": [
-			{
-				"default": "./index.js"
-			},
-			"./index.js"
-		]
-	},
-	"scripts": {
-		"prepublish": "safe-publish-latest",
-		"lint": "eslint .",
-		"pretest": "npm run lint",
-		"tests-only": "node test",
-		"test": "npm run tests-only",
-		"posttest": "npx aud",
-		"version": "auto-changelog && git add CHANGELOG.md",
-		"postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
-	},
-	"repository": {
-		"type": "git",
-		"url": "git+https://github.com/ljharb/side-channel.git"
-	},
-	"keywords": [
-		"weakmap",
-		"map",
-		"side",
-		"channel",
-		"metadata"
-	],
-	"author": "Jordan Harband <ljharb@gmail.com>",
-	"funding": {
-		"url": "https://github.com/sponsors/ljharb"
-	},
-	"license": "MIT",
-	"bugs": {
-		"url": "https://github.com/ljharb/side-channel/issues"
-	},
-	"homepage": "https://github.com/ljharb/side-channel#readme",
-	"devDependencies": {
-		"@ljharb/eslint-config": "^15.1.0",
-		"auto-changelog": "^1.16.2",
-		"eslint": "^6.7.2",
-		"safe-publish-latest": "^1.1.4",
-		"tape": "^4.12.0"
-	},
-	"dependencies": {
-		"es-abstract": "^1.17.0-next.1",
-		"object-inspect": "^1.7.0"
-	},
-	"auto-changelog": {
-		"output": "CHANGELOG.md",
-		"template": "keepachangelog",
-		"unreleased": false,
-		"commitLimit": false,
-		"backfillLimit": false
-	}
-}
diff --git a/node_modules/side-channel/test/index.js b/node_modules/side-channel/test/index.js
deleted file mode 100644
index 064f4a2..0000000
--- a/node_modules/side-channel/test/index.js
+++ /dev/null
@@ -1,69 +0,0 @@
-'use strict';
-
-var test = require('tape');
-
-var getSideChannel = require('../');
-
-test('export', function (t) {
-	t.equal(typeof getSideChannel, 'function', 'is a function');
-	t.equal(getSideChannel.length, 0, 'takes no arguments');
-
-	var channel = getSideChannel();
-	t.ok(channel, 'is truthy');
-	t.equal(typeof channel, 'object', 'is an object');
-
-	t.end();
-});
-
-test('assert', function (t) {
-	var channel = getSideChannel();
-	t['throws'](
-		function () { channel.assert({}); },
-		TypeError,
-		'nonexistent value throws'
-	);
-
-	var o = {};
-	channel.set(o, 'data');
-	t.doesNotThrow(function () { channel.assert(o); }, 'existent value noops');
-
-	t.end();
-});
-
-test('has', function (t) {
-	var channel = getSideChannel();
-	var o = [];
-
-	t.equal(channel.has(o), false, 'nonexistent value yields false');
-
-	channel.set(o, 'foo');
-	t.equal(channel.has(o), true, 'existent value yields true');
-
-	t.end();
-});
-
-test('get', function (t) {
-	var channel = getSideChannel();
-	var o = {};
-	t.equal(channel.get(o), undefined, 'nonexistent value yields undefined');
-
-	var data = {};
-	channel.set(o, data);
-	t.equal(channel.get(o), data, '"get" yields data set by "set"');
-
-	t.end();
-});
-
-test('set', function (t) {
-	var channel = getSideChannel();
-	var o = function () {};
-	t.equal(channel.get(o), undefined, 'value not set');
-
-	channel.set(o, 42);
-	t.equal(channel.get(o), 42, 'value was set');
-
-	channel.set(o, Infinity);
-	t.equal(channel.get(o), Infinity, 'value was set again');
-
-	t.end();
-});
diff --git a/node_modules/string-width/node_modules/emoji-regex/README.md b/node_modules/string-width/node_modules/emoji-regex/README.md
deleted file mode 100644
index f10e173..0000000
--- a/node_modules/string-width/node_modules/emoji-regex/README.md
+++ /dev/null
@@ -1,73 +0,0 @@
-# emoji-regex [![Build status](https://travis-ci.org/mathiasbynens/emoji-regex.svg?branch=master)](https://travis-ci.org/mathiasbynens/emoji-regex)
-
-_emoji-regex_ offers a regular expression to match all emoji symbols (including textual representations of emoji) as per the Unicode Standard.
-
-This repository contains a script that generates this regular expression based on [the data from Unicode v12](https://github.com/mathiasbynens/unicode-12.0.0). Because of this, the regular expression can easily be updated whenever new emoji are added to the Unicode standard.
-
-## Installation
-
-Via [npm](https://www.npmjs.com/):
-
-```bash
-npm install emoji-regex
-```
-
-In [Node.js](https://nodejs.org/):
-
-```js
-const emojiRegex = require('emoji-regex');
-// Note: because the regular expression has the global flag set, this module
-// exports a function that returns the regex rather than exporting the regular
-// expression itself, to make it impossible to (accidentally) mutate the
-// original regular expression.
-
-const text = `
-\u{231A}: ⌚ default emoji presentation character (Emoji_Presentation)
-\u{2194}\u{FE0F}: ↔️ default text presentation character rendered as emoji
-\u{1F469}: 👩 emoji modifier base (Emoji_Modifier_Base)
-\u{1F469}\u{1F3FF}: 👩🏿 emoji modifier base followed by a modifier
-`;
-
-const regex = emojiRegex();
-let match;
-while (match = regex.exec(text)) {
-  const emoji = match[0];
-  console.log(`Matched sequence ${ emoji } — code points: ${ [...emoji].length }`);
-}
-```
-
-Console output:
-
-```
-Matched sequence ⌚ — code points: 1
-Matched sequence ⌚ — code points: 1
-Matched sequence ↔️ — code points: 2
-Matched sequence ↔️ — code points: 2
-Matched sequence 👩 — code points: 1
-Matched sequence 👩 — code points: 1
-Matched sequence 👩🏿 — code points: 2
-Matched sequence 👩🏿 — code points: 2
-```
-
-To match emoji in their textual representation as well (i.e. emoji that are not `Emoji_Presentation` symbols and that aren’t forced to render as emoji by a variation selector), `require` the other regex:
-
-```js
-const emojiRegex = require('emoji-regex/text.js');
-```
-
-Additionally, in environments which support ES2015 Unicode escapes, you may `require` ES2015-style versions of the regexes:
-
-```js
-const emojiRegex = require('emoji-regex/es2015/index.js');
-const emojiRegexText = require('emoji-regex/es2015/text.js');
-```
-
-## Author
-
-| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") |
-|---|
-| [Mathias Bynens](https://mathiasbynens.be/) |
-
-## License
-
-_emoji-regex_ is available under the [MIT](https://mths.be/mit) license.
diff --git a/node_modules/string-width/node_modules/emoji-regex/es2015/index.js b/node_modules/string-width/node_modules/emoji-regex/es2015/index.js
deleted file mode 100644
index b4cf3dc..0000000
--- a/node_modules/string-width/node_modules/emoji-regex/es2015/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-
-module.exports = () => {
-  // https://mths.be/emoji
-  return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0073}\u{E0063}\u{E0074}|\u{E0077}\u{E006C}\u{E0073})\u{E007F}|\u{1F468}(?:\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}\u{1F3FB}|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|[\u{1F3FB}-\u{1F3FF}])|(?:\u{1F9D1}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F469})\u{1F3FB}|\u{1F9D1}(?:\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u200D\u{1F91D}\u200D\u{1F9D1})|(?:\u{1F9D1}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}\u{1F3FC}]|\u{1F469}(?:\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FB}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|(?:\u{1F9D1}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}-\u{1F3FD}]|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F3F4}\u200D\u2620)\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F415}\u200D\u{1F9BA}|\u{1F469}\u200D\u{1F466}|\u{1F469}\u200D\u{1F467}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F1F6}\u{1F1E6}|[#\*0-9]\uFE0F\u20E3|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6D5}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6D5}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]\uFE0F|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93C}-\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9BB}\u{1F9CD}-\u{1F9CF}\u{1F9D1}-\u{1F9DD}]/gu;
-};
diff --git a/node_modules/string-width/node_modules/emoji-regex/es2015/text.js b/node_modules/string-width/node_modules/emoji-regex/es2015/text.js
deleted file mode 100644
index 780309d..0000000
--- a/node_modules/string-width/node_modules/emoji-regex/es2015/text.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-
-module.exports = () => {
-  // https://mths.be/emoji
-  return /\u{1F3F4}\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0073}\u{E0063}\u{E0074}|\u{E0077}\u{E006C}\u{E0073})\u{E007F}|\u{1F468}(?:\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}\u{1F3FB}|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FE}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u2695\u2696\u2708]\uFE0F|[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|(?:\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F3FB}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}]|[\u{1F3FB}-\u{1F3FF}])|(?:\u{1F9D1}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F469})\u{1F3FB}|\u{1F9D1}(?:\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u200D\u{1F91D}\u200D\u{1F9D1})|(?:\u{1F9D1}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D[\u{1F468}\u{1F469}])[\u{1F3FB}-\u{1F3FE}]|(?:\u{1F9D1}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}\u{1F3FC}]|\u{1F469}(?:\u{1F3FE}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}-\u{1F3FD}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FC}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FD}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FB}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FC}-\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FD}\u200D(?:\u{1F91D}\u200D\u{1F468}[\u{1F3FB}\u{1F3FC}\u{1F3FE}\u{1F3FF}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F3FF}\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9AF}-\u{1F9B3}\u{1F9BC}\u{1F9BD}])|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|(?:\u{1F9D1}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F9D1}|\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F469})[\u{1F3FB}-\u{1F3FD}]|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}(?:\u{1F3FF}\u200D[\u2695\u2696\u2708]|\u{1F3FE}\u200D[\u2695\u2696\u2708]|\u{1F3FC}\u200D[\u2695\u2696\u2708]|\u{1F3FB}\u200D[\u2695\u2696\u2708]|\u{1F3FD}\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F3F4}\u200D\u2620)\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F415}\u200D\u{1F9BA}|\u{1F469}\u200D\u{1F466}|\u{1F469}\u200D\u{1F467}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F1F6}\u{1F1E6}|[#\*0-9]\uFE0F\u20E3|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F9D1}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9CD}-\u{1F9CF}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F46B}-\u{1F46D}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9BB}\u{1F9D2}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6D5}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6D5}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6FA}\u{1F7E0}-\u{1F7EB}\u{1F90D}-\u{1F93A}\u{1F93C}-\u{1F945}\u{1F947}-\u{1F971}\u{1F973}-\u{1F976}\u{1F97A}-\u{1F9A2}\u{1F9A5}-\u{1F9AA}\u{1F9AE}-\u{1F9CA}\u{1F9CD}-\u{1F9FF}\u{1FA70}-\u{1FA73}\u{1FA78}-\u{1FA7A}\u{1FA80}-\u{1FA82}\u{1FA90}-\u{1FA95}]\uFE0F?|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F48F}\u{1F491}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F90F}\u{1F918}-\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93C}-\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9BB}\u{1F9CD}-\u{1F9CF}\u{1F9D1}-\u{1F9DD}]/gu;
-};
diff --git a/node_modules/string-width/node_modules/emoji-regex/index.d.ts b/node_modules/string-width/node_modules/emoji-regex/index.d.ts
deleted file mode 100644
index 1955b47..0000000
--- a/node_modules/string-width/node_modules/emoji-regex/index.d.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-declare module 'emoji-regex' {
-    function emojiRegex(): RegExp;
-
-    export default emojiRegex;
-}
-
-declare module 'emoji-regex/text' {
-    function emojiRegex(): RegExp;
-
-    export default emojiRegex;
-}
-
-declare module 'emoji-regex/es2015' {
-    function emojiRegex(): RegExp;
-
-    export default emojiRegex;
-}
-
-declare module 'emoji-regex/es2015/text' {
-    function emojiRegex(): RegExp;
-
-    export default emojiRegex;
-}
diff --git a/node_modules/string-width/node_modules/emoji-regex/index.js b/node_modules/string-width/node_modules/emoji-regex/index.js
deleted file mode 100644
index d993a3a..0000000
--- a/node_modules/string-width/node_modules/emoji-regex/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-
-module.exports = function () {
-  // https://mths.be/emoji
-  return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
-};
diff --git a/node_modules/string-width/node_modules/emoji-regex/package.json b/node_modules/string-width/node_modules/emoji-regex/package.json
deleted file mode 100644
index 6d32352..0000000
--- a/node_modules/string-width/node_modules/emoji-regex/package.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
-  "name": "emoji-regex",
-  "version": "8.0.0",
-  "description": "A regular expression to match all Emoji-only symbols as per the Unicode Standard.",
-  "homepage": "https://mths.be/emoji-regex",
-  "main": "index.js",
-  "types": "index.d.ts",
-  "keywords": [
-    "unicode",
-    "regex",
-    "regexp",
-    "regular expressions",
-    "code points",
-    "symbols",
-    "characters",
-    "emoji"
-  ],
-  "license": "MIT",
-  "author": {
-    "name": "Mathias Bynens",
-    "url": "https://mathiasbynens.be/"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/mathiasbynens/emoji-regex.git"
-  },
-  "bugs": "https://github.com/mathiasbynens/emoji-regex/issues",
-  "files": [
-    "LICENSE-MIT.txt",
-    "index.js",
-    "index.d.ts",
-    "text.js",
-    "es2015/index.js",
-    "es2015/text.js"
-  ],
-  "scripts": {
-    "build": "rm -rf -- es2015; babel src -d .; NODE_ENV=es2015 babel src -d ./es2015; node script/inject-sequences.js",
-    "test": "mocha",
-    "test:watch": "npm run test -- --watch"
-  },
-  "devDependencies": {
-    "@babel/cli": "^7.2.3",
-    "@babel/core": "^7.3.4",
-    "@babel/plugin-proposal-unicode-property-regex": "^7.2.0",
-    "@babel/preset-env": "^7.3.4",
-    "mocha": "^6.0.2",
-    "regexgen": "^1.3.0",
-    "unicode-12.0.0": "^0.7.9"
-  }
-}
diff --git a/node_modules/string-width/node_modules/emoji-regex/text.js b/node_modules/string-width/node_modules/emoji-regex/text.js
deleted file mode 100644
index 0a55ce2..0000000
--- a/node_modules/string-width/node_modules/emoji-regex/text.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-
-module.exports = function () {
-  // https://mths.be/emoji
-  return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F?|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
-};
diff --git a/node_modules/string.prototype.matchall/.eslintignore b/node_modules/string.prototype.matchall/.eslintignore
deleted file mode 100644
index 4ebc8ae..0000000
--- a/node_modules/string.prototype.matchall/.eslintignore
+++ /dev/null
@@ -1 +0,0 @@
-coverage
diff --git a/node_modules/string.prototype.matchall/.eslintrc b/node_modules/string.prototype.matchall/.eslintrc
deleted file mode 100644
index a966149..0000000
--- a/node_modules/string.prototype.matchall/.eslintrc
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"complexity": [2, 12],
-		"func-name-matching": 0,
-		"id-length": 0,
-		"max-nested-callbacks": [2, 3],
-		"max-params": [2, 4],
-		"max-statements-per-line": [2, { "max": 2 }],
-		"max-statements": [2, 24],
-		"new-cap": [2, {
-			"capIsNewExceptions": [
-				"AdvanceStringIndex",
-				"Call",
-				"Construct",
-				"CreateIterResultObject",
-				"CreateRegExpStringIterator",
-				"Get",
-				"GetIntrinsic",
-				"GetMethod",
-				"Invoke",
-				"IsRegExp",
-				"MatchAllIterator",
-				"ObjectCreate",
-				"RegExpExec",
-				"RequireObjectCoercible",
-				"Set",
-				"SpeciesConstructor",
-				"ToBoolean",
-				"ToLength",
-				"ToString",
-				"Type",
-			],
-		}],
-		"no-restricted-syntax": [2, "BreakStatement", "ContinueStatement", "DebuggerStatement", "LabeledStatement", "WithStatement"],
-		"operator-linebreak": [2, "before"],
-	},
-
-	"overrides": [
-		{
-			"files": "test/**",
-			"rules": {
-				"max-lines-per-function": 0,
-				"max-nested-callbacks": 0,
-				"prefer-regex-literals": 0,
-			},
-		},
-	],
-}
diff --git a/node_modules/string.prototype.matchall/.github/FUNDING.yml b/node_modules/string.prototype.matchall/.github/FUNDING.yml
deleted file mode 100644
index 48a1cbc..0000000
--- a/node_modules/string.prototype.matchall/.github/FUNDING.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# These are supported funding model platforms
-
-github: [ljharb]
-patreon: # Replace with a single Patreon username
-open_collective: # Replace with a single Open Collective username
-ko_fi: # Replace with a single Ko-fi username
-tidelift: npm/string.prototype.matchall
-community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
-liberapay: # Replace with a single Liberapay username
-issuehunt: # Replace with a single IssueHunt username
-otechie: # Replace with a single Otechie username
-custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/node_modules/string.prototype.matchall/.github/workflows/rebase.yml b/node_modules/string.prototype.matchall/.github/workflows/rebase.yml
deleted file mode 100644
index 436cb79..0000000
--- a/node_modules/string.prototype.matchall/.github/workflows/rebase.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: Automatic Rebase
-
-on: [pull_request]
-
-jobs:
-  _:
-    name: "Automatic Rebase"
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v1
-    - uses: ljharb/rebase@master
-      env:
-        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/node_modules/string.prototype.matchall/.travis.yml b/node_modules/string.prototype.matchall/.travis.yml
deleted file mode 100644
index 2d1c1d2..0000000
--- a/node_modules/string.prototype.matchall/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-version: ~> 1.0
-language: node_js
-os:
- - linux
-import:
- - ljharb/travis-ci:node/all.yml
- - ljharb/travis-ci:node/pretest.yml
- - ljharb/travis-ci:node/posttest.yml
- - ljharb/travis-ci:node/coverage.yml
-matrix:
-  allow_failures:
-    - env: COVERAGE=true
diff --git a/node_modules/string.prototype.matchall/CHANGELOG.md b/node_modules/string.prototype.matchall/CHANGELOG.md
deleted file mode 100644
index f2979a5..0000000
--- a/node_modules/string.prototype.matchall/CHANGELOG.md
+++ /dev/null
@@ -1,64 +0,0 @@
-4.0.2 / 2019-12-22
-==================
-  * [Refactor] use `internal-slot`
-  * [Refactor] use `side-channel` instead of "hidden" helper
-  * [Deps] update `es-abstract`, `internal-slot`, `regexp.prototype.flags`, `side-channel`
-  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`
-
-4.0.1 / 2019-12-13
-==================
-  * [Refactor] use split-up `es-abstract` (61% bundle size decrease)
-  * [Fix] fix error message: matchAll requires *global*
-  * [Deps] update `es-abstract`, `has-symbols`
-  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `functions-have-names`, `object-inspect`, `evalmd`, `object.entries`; add `safe-publish-latest`
-  * [meta] add `funding` field
-  * [Tests] use shared travis-ci configs
-  * [actions] add automatic rebasing / merge commit blocking
-
-4.0.0 / 2019-10-03
-==================
-  * [Breaking] throw on non-global/nullish flags
-  * [Deps] update `es-abstract`
-
-3.0.2 / 2019-10-02
-==================
-  * [Fix] ensure that `flagsGetter` is only used when there is no `flags` property on the regex
-  * [Fix] `RegExp.prototype[Symbol.matchAll]`: ToString the `flags` property
-  * [Refactor] provide a consistent way to determine the polyfill for `RegExp.prototype[Symbol.matchAll]`
-  * [meta] create FUNDING.yml
-  * [Deps] update `es-abstract`
-  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `evalmd`, `functions-have-names`, `es5-shim`, `es6-shim`, `object.entries`, `tape`
-  * [Tests] up to `node` `v12.11`, `v11.15`, `v10.16`, `v8.16`, `v6.17`
-  * [Tests] use `functions-have-names`
-  * [Tests] bump audit level, due to https://github.com/reggi/evalmd/issues/13
-  * [Tests] use `npx aud` instead of `npm audit` with hoops
-
-3.0.1 / 2018-12-11
-==================
-  * [Fix] update spec to follow committee feedback
-  * [Deps] update `define-properties`
-  * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `es5-shim`, `es6-shim`, `tape`
-  * [Tests] use `npm audit` instead of `nsp`
-  * [Tests] up to `node` `v11.4`, `v10.14`, `v8.14`, `v6.15`
-
-3.0.0 / 2018-05-31
-==================
-  * [Breaking] update to match latest spec
-  * [Deps] update `es-abstract`
-  * [Dev Deps] update `eslint`, `nsp`, `object-inspect`, `tape`
-  * [Tests] up to `node` `v10.3`, `v9.11`, `v8.11`, `v6.14`, `v4.9`
-  * [Tests] regexes now have a "groups" property in ES2018
-  * [Tests] run evalmd in prelint
-
-2.0.0 / 2018-01-24
-==================
-  * [Breaking] change to handle nonmatching regexes
-  * [Breaking] non-regex arguments that are thus coerced to RegExp now get the global flag
-  * [Deps] update `es-abstract`, `regexp.prototype.flags`
-  * [Dev Deps] update `es5-shim`, `eslint`, `object.assign`
-  * [Tests] up to `node` `v9.4`, `v8.9`, `v6.12`; pin included builds to LTS
-  * [Tests] improve and correct tests and failure messages
-
-1.0.0 / 2017-09-28
-==================
-  * Initial release
diff --git a/node_modules/string.prototype.matchall/LICENSE b/node_modules/string.prototype.matchall/LICENSE
deleted file mode 100644
index b43df44..0000000
--- a/node_modules/string.prototype.matchall/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Jordan Harband
-
-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/node_modules/string.prototype.matchall/README.md b/node_modules/string.prototype.matchall/README.md
deleted file mode 100644
index cacaf3e..0000000
--- a/node_modules/string.prototype.matchall/README.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# string.prototype.matchall <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
-
-[![Build Status][travis-svg]][travis-url]
-[![dependency status][deps-svg]][deps-url]
-[![dev dependency status][dev-deps-svg]][dev-deps-url]
-[![License][license-image]][license-url]
-[![Downloads][downloads-image]][downloads-url]
-
-[![npm badge][npm-badge-png]][package-url]
-
-[![browser support][testling-svg]][testling-url]
-
-ES Proposal spec-compliant shim for String.prototype.matchAll. Invoke its "shim" method to shim `String.prototype.matchAll` if it is unavailable or noncompliant.
-
-This package implements the [es-shim API](https://github.com/es-shims/api) interface. It works in an ES3-supported environment, and complies with the [proposed spec](https://github.com/tc39/proposal-string-matchall).
-
-Most common usage:
-```js
-const assert = require('assert');
-const matchAll = require('string.prototype.matchall');
-
-const str = 'aabc';
-const nonRegexStr = 'ab';
-const globalRegex = /[ac]/g;
-const nonGlobalRegex = /[bc]/i;
-
-// non-regex arguments are coerced into a global regex
-assert.deepEqual(
-	[...matchAll(str, nonRegexStr)],
-	[...matchAll(str, new RegExp(nonRegexStr, 'g'))]
-);
-
-assert.deepEqual([...matchAll(str, globalRegex)], [
-	Object.assign(['a'], { index: 0, input: str, groups: undefined }),
-	Object.assign(['a'], { index: 1, input: str, groups: undefined }),
-	Object.assign(['c'], { index: 3, input: str, groups: undefined }),
-]);
-
-assert.throws(() => matchAll(str, nonGlobalRegex)); // non-global regexes throw
-
-matchAll.shim(); // will be a no-op if not needed
-
-// non-regex arguments are coerced into a global regex
-assert.deepEqual(
-	[...str.matchAll(nonRegexStr)],
-	[...str.matchAll(new RegExp(nonRegexStr, 'g'))]
-);
-
-assert.deepEqual([...str.matchAll(globalRegex)], [
-	Object.assign(['a'], { index: 0, input: str, groups: undefined }),
-	Object.assign(['a'], { index: 1, input: str, groups: undefined }),
-	Object.assign(['c'], { index: 3, input: str, groups: undefined }),
-]);
-
-assert.throws(() => matchAll(str, nonGlobalRegex)); // non-global regexes throw
-
-```
-
-## Tests
-Simply clone the repo, `npm install`, and run `npm test`
-
-[package-url]: https://npmjs.com/package/string.prototype.matchall
-[npm-version-svg]: http://versionbadg.es/es-shims/String.prototype.matchAll.svg
-[travis-svg]: https://travis-ci.org/es-shims/String.prototype.matchAll.svg
-[travis-url]: https://travis-ci.org/es-shims/String.prototype.matchAll
-[deps-svg]: https://david-dm.org/es-shims/String.prototype.matchAll.svg
-[deps-url]: https://david-dm.org/es-shims/String.prototype.matchAll
-[dev-deps-svg]: https://david-dm.org/es-shims/String.prototype.matchAll/dev-status.svg
-[dev-deps-url]: https://david-dm.org/es-shims/String.prototype.matchAll#info=devDependencies
-[testling-svg]: https://ci.testling.com/es-shims/String.prototype.matchAll.png
-[testling-url]: https://ci.testling.com/es-shims/String.prototype.matchAll
-[npm-badge-png]: https://nodei.co/npm/string.prototype.matchall.png?downloads=true&stars=true
-[license-image]: http://img.shields.io/npm/l/string.prototype.matchall.svg
-[license-url]: LICENSE
-[downloads-image]: http://img.shields.io/npm/dm/string.prototype.matchall.svg
-[downloads-url]: http://npm-stat.com/charts.html?package=string.prototype.matchall
diff --git a/node_modules/string.prototype.matchall/auto.js b/node_modules/string.prototype.matchall/auto.js
deleted file mode 100644
index 8ebf606..0000000
--- a/node_modules/string.prototype.matchall/auto.js
+++ /dev/null
@@ -1,3 +0,0 @@
-'use strict';
-
-require('./shim')();
diff --git a/node_modules/string.prototype.matchall/helpers/MatchAllIterator.js b/node_modules/string.prototype.matchall/helpers/MatchAllIterator.js
deleted file mode 100644
index 193c24c..0000000
--- a/node_modules/string.prototype.matchall/helpers/MatchAllIterator.js
+++ /dev/null
@@ -1,44 +0,0 @@
-'use strict';
-
-var Get = require('es-abstract/2019/Get');
-var IsRegExp = require('es-abstract/2019/IsRegExp');
-var Set = require('es-abstract/2019/Set');
-var SpeciesConstructor = require('es-abstract/2019/SpeciesConstructor');
-var ToBoolean = require('es-abstract/2019/ToBoolean');
-var ToLength = require('es-abstract/2019/ToLength');
-var ToString = require('es-abstract/2019/ToString');
-var flagsGetter = require('regexp.prototype.flags');
-
-var RegExpStringIterator = require('./RegExpStringIterator');
-var OrigRegExp = RegExp;
-
-module.exports = function MatchAllIterator(R, O) {
-	var S = ToString(O);
-
-	var matcher, global, fullUnicode, flags;
-	if (IsRegExp(R)) {
-		var C = SpeciesConstructor(R, OrigRegExp);
-		flags = Get(R, 'flags');
-		if (typeof flags === 'string') {
-			matcher = new C(R, flags); // Construct(C, [R, flags]);
-		} else if (C === OrigRegExp) {
-			// workaround for older engines that lack RegExp.prototype.flags
-			matcher = new C(R.source, flagsGetter(R)); // Construct(C, [R.source, flagsGetter(R)]);
-		} else {
-			matcher = new C(R, flagsGetter(R)); // Construct(C, [R, flagsGetter(R)]);
-		}
-		global = ToBoolean(Get(matcher, 'global'));
-		fullUnicode = ToBoolean(Get(matcher, 'unicode'));
-		var lastIndex = ToLength(Get(R, 'lastIndex'));
-		Set(matcher, 'lastIndex', lastIndex, true);
-	} else {
-		flags = 'g';
-		matcher = new OrigRegExp(R, flags);
-		global = true;
-		fullUnicode = false;
-		if (Get(matcher, 'lastIndex') !== 0) {
-			throw new TypeError('Assertion failed: newly constructed RegExp had a lastIndex !== 0. Please report this!');
-		}
-	}
-	return new RegExpStringIterator(matcher, S, global, fullUnicode);
-};
diff --git a/node_modules/string.prototype.matchall/helpers/RegExpStringIterator.js b/node_modules/string.prototype.matchall/helpers/RegExpStringIterator.js
deleted file mode 100644
index 674e965..0000000
--- a/node_modules/string.prototype.matchall/helpers/RegExpStringIterator.js
+++ /dev/null
@@ -1,110 +0,0 @@
-'use strict';
-
-var define = require('define-properties');
-var AdvanceStringIndex = require('es-abstract/2019/AdvanceStringIndex');
-var CreateIterResultObject = require('es-abstract/2019/CreateIterResultObject');
-var Get = require('es-abstract/2019/Get');
-var GetIntrinsic = require('es-abstract/GetIntrinsic');
-var ObjectCreate = require('es-abstract/2019/ObjectCreate');
-var RegExpExec = require('es-abstract/2019/RegExpExec');
-var Set = require('es-abstract/2019/Set');
-var ToLength = require('es-abstract/2019/ToLength');
-var ToString = require('es-abstract/2019/ToString');
-var Type = require('es-abstract/2019/Type');
-var hasSymbols = require('has-symbols')();
-
-var SLOT = require('internal-slot');
-var undefined;
-
-var RegExpStringIterator = function RegExpStringIterator(R, S, global, fullUnicode) {
-	if (Type(S) !== 'String') {
-		throw new TypeError('S must be a string');
-	}
-	if (Type(global) !== 'Boolean') {
-		throw new TypeError('global must be a boolean');
-	}
-	if (Type(fullUnicode) !== 'Boolean') {
-		throw new TypeError('fullUnicode must be a boolean');
-	}
-	SLOT.set(this, '[[IteratingRegExp]]', R);
-	SLOT.set(this, '[[IteratedString]]', S);
-	SLOT.set(this, '[[Global]]', global);
-	SLOT.set(this, '[[Unicode]]', fullUnicode);
-	SLOT.set(this, '[[Done]]', false);
-};
-
-var IteratorPrototype = GetIntrinsic('%IteratorPrototype%', true);
-if (IteratorPrototype) {
-	RegExpStringIterator.prototype = ObjectCreate(IteratorPrototype);
-}
-
-define(RegExpStringIterator.prototype, {
-	next: function next() {
-		var O = this;
-		if (Type(O) !== 'Object') {
-			throw new TypeError('receiver must be an object');
-		}
-		if (
-			!(O instanceof RegExpStringIterator)
-			|| !SLOT.has(O, '[[IteratingRegExp]]')
-			|| !SLOT.has(O, '[[IteratedString]]')
-			|| !SLOT.has(O, '[[Global]]')
-			|| !SLOT.has(O, '[[Unicode]]')
-			|| !SLOT.has(O, '[[Done]]')
-		) {
-			throw new TypeError('"this" value must be a RegExpStringIterator instance');
-		}
-		if (SLOT.get(O, '[[Done]]')) {
-			return CreateIterResultObject(undefined, true);
-		}
-		var R = SLOT.get(O, '[[IteratingRegExp]]');
-		var S = SLOT.get(O, '[[IteratedString]]');
-		var global = SLOT.get(O, '[[Global]]');
-		var fullUnicode = SLOT.get(O, '[[Unicode]]');
-		var match = RegExpExec(R, S);
-		if (match === null) {
-			SLOT.set(O, '[[Done]]', true);
-			return CreateIterResultObject(undefined, true);
-		}
-		if (global) {
-			var matchStr = ToString(Get(match, '0'));
-			if (matchStr === '') {
-				var thisIndex = ToLength(Get(R, 'lastIndex'));
-				var nextIndex = AdvanceStringIndex(S, thisIndex, fullUnicode);
-				Set(R, 'lastIndex', nextIndex, true);
-			}
-			return CreateIterResultObject(match, false);
-		}
-		SLOT.set(O, '[[Done]]', true);
-		return CreateIterResultObject(match, false);
-	}
-});
-if (hasSymbols) {
-	var defineP = Object.defineProperty;
-	if (Symbol.toStringTag) {
-		if (defineP) {
-			defineP(RegExpStringIterator.prototype, Symbol.toStringTag, {
-				configurable: true,
-				enumerable: false,
-				value: 'RegExp String Iterator',
-				writable: false
-			});
-		} else {
-			RegExpStringIterator.prototype[Symbol.toStringTag] = 'RegExp String Iterator';
-		}
-	}
-
-	if (!IteratorPrototype && Symbol.iterator) {
-		var func = {};
-		func[Symbol.iterator] = RegExpStringIterator.prototype[Symbol.iterator] || function SymbolIterator() {
-			return this;
-		};
-		var predicate = {};
-		predicate[Symbol.iterator] = function () {
-			return RegExpStringIterator.prototype[Symbol.iterator] !== func[Symbol.iterator];
-		};
-		define(RegExpStringIterator.prototype, func, predicate);
-	}
-}
-
-module.exports = RegExpStringIterator;
diff --git a/node_modules/string.prototype.matchall/helpers/hidden.js b/node_modules/string.prototype.matchall/helpers/hidden.js
deleted file mode 100644
index fbdad0e..0000000
--- a/node_modules/string.prototype.matchall/helpers/hidden.js
+++ /dev/null
@@ -1,5 +0,0 @@
-'use strict';
-
-// TODO, semver-major: delete this file
-
-module.exports = require('side-channel');
diff --git a/node_modules/string.prototype.matchall/implementation.js b/node_modules/string.prototype.matchall/implementation.js
deleted file mode 100644
index 76b3f88..0000000
--- a/node_modules/string.prototype.matchall/implementation.js
+++ /dev/null
@@ -1,56 +0,0 @@
-'use strict';
-
-var Call = require('es-abstract/2019/Call');
-var Get = require('es-abstract/2019/Get');
-var GetMethod = require('es-abstract/2019/GetMethod');
-var IsRegExp = require('es-abstract/2019/IsRegExp');
-var ToString = require('es-abstract/2019/ToString');
-var RequireObjectCoercible = require('es-abstract/2019/RequireObjectCoercible');
-var callBound = require('es-abstract/helpers/callBound');
-var hasSymbols = require('has-symbols')();
-var flagsGetter = require('regexp.prototype.flags');
-
-var $indexOf = callBound('String.prototype.indexOf');
-
-var regexpMatchAllPolyfill = require('./polyfill-regexp-matchall');
-
-var getMatcher = function getMatcher(regexp) { // eslint-disable-line consistent-return
-	var matcherPolyfill = regexpMatchAllPolyfill();
-	if (hasSymbols && typeof Symbol.matchAll === 'symbol') {
-		var matcher = GetMethod(regexp, Symbol.matchAll);
-		if (matcher === RegExp.prototype[Symbol.matchAll] && matcher !== matcherPolyfill) {
-			return matcherPolyfill;
-		}
-		return matcher;
-	}
-	// fallback for pre-Symbol.matchAll environments
-	if (IsRegExp(regexp)) {
-		return matcherPolyfill;
-	}
-};
-
-module.exports = function matchAll(regexp) {
-	var O = RequireObjectCoercible(this);
-
-	if (typeof regexp !== 'undefined' && regexp !== null) {
-		var isRegExp = IsRegExp(regexp);
-		if (isRegExp) {
-			// workaround for older engines that lack RegExp.prototype.flags
-			var flags = 'flags' in regexp ? Get(regexp, 'flags') : flagsGetter(regexp);
-			RequireObjectCoercible(flags);
-			if ($indexOf(ToString(flags), 'g') < 0) {
-				throw new TypeError('matchAll requires a global regular expression');
-			}
-		}
-
-		var matcher = getMatcher(regexp);
-		if (typeof matcher !== 'undefined') {
-			return Call(matcher, regexp, [O]);
-		}
-	}
-
-	var S = ToString(O);
-	// var rx = RegExpCreate(regexp, 'g');
-	var rx = new RegExp(regexp, 'g');
-	return Call(getMatcher(rx), rx, [S]);
-};
diff --git a/node_modules/string.prototype.matchall/index.js b/node_modules/string.prototype.matchall/index.js
deleted file mode 100644
index e0ece12..0000000
--- a/node_modules/string.prototype.matchall/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-
-var callBind = require('es-abstract/helpers/callBind');
-var define = require('define-properties');
-
-var implementation = require('./implementation');
-var getPolyfill = require('./polyfill');
-var shim = require('./shim');
-
-var boundMatchAll = callBind(implementation);
-
-define(boundMatchAll, {
-	getPolyfill: getPolyfill,
-	implementation: implementation,
-	shim: shim
-});
-
-module.exports = boundMatchAll;
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/.eslintrc b/node_modules/string.prototype.matchall/node_modules/has-symbols/.eslintrc
deleted file mode 100644
index 2d9a66a..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/.eslintrc
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"max-statements-per-line": [2, { "max": 2 }],
-		"no-magic-numbers": 0,
-		"multiline-comment-style": 0,
-	}
-}
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/.github/FUNDING.yml b/node_modules/string.prototype.matchall/node_modules/has-symbols/.github/FUNDING.yml
deleted file mode 100644
index 04cf87e..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/.github/FUNDING.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# These are supported funding model platforms
-
-github: [ljharb]
-patreon: # Replace with a single Patreon username
-open_collective: # Replace with a single Open Collective username
-ko_fi: # Replace with a single Ko-fi username
-tidelift: npm/has-symbols
-community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
-liberapay: # Replace with a single Liberapay username
-issuehunt: # Replace with a single IssueHunt username
-otechie: # Replace with a single Otechie username
-custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/.github/workflows/rebase.yml b/node_modules/string.prototype.matchall/node_modules/has-symbols/.github/workflows/rebase.yml
deleted file mode 100644
index 436cb79..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/.github/workflows/rebase.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: Automatic Rebase
-
-on: [pull_request]
-
-jobs:
-  _:
-    name: "Automatic Rebase"
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v1
-    - uses: ljharb/rebase@master
-      env:
-        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/.travis.yml b/node_modules/string.prototype.matchall/node_modules/has-symbols/.travis.yml
deleted file mode 100644
index 2d1c1d2..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-version: ~> 1.0
-language: node_js
-os:
- - linux
-import:
- - ljharb/travis-ci:node/all.yml
- - ljharb/travis-ci:node/pretest.yml
- - ljharb/travis-ci:node/posttest.yml
- - ljharb/travis-ci:node/coverage.yml
-matrix:
-  allow_failures:
-    - env: COVERAGE=true
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/CHANGELOG.md b/node_modules/string.prototype.matchall/node_modules/has-symbols/CHANGELOG.md
deleted file mode 100644
index 4dcac04..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/CHANGELOG.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# Changelog
-
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
-and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-
-Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
-
-## [v1.0.1](https://github.com/inspect-js/has-symbols/compare/v1.0.0...v1.0.1) - 2019-11-17
-
-### Commits
-
-- [Tests] use shared travis-ci configs [`ce396c9`](https://github.com/inspect-js/has-symbols/commit/ce396c9419ff11c43d0da5d05cdbb79f7fb42229)
-- [Tests] up to `node` `v12.4`, `v11.15`, `v10.15`, `v9.11`, `v8.15`, `v7.10`, `v6.17`, `v4.9`; use `nvm install-latest-npm` [`0690732`](https://github.com/inspect-js/has-symbols/commit/0690732801f47ab429f39ba1962f522d5c462d6b)
-- [meta] add `auto-changelog` [`2163d0b`](https://github.com/inspect-js/has-symbols/commit/2163d0b7f36343076b8f947cd1667dd1750f26fc)
-- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `core-js`, `safe-publish-latest`, `tape` [`8e0951f`](https://github.com/inspect-js/has-symbols/commit/8e0951f1a7a2e52068222b7bb73511761e6e4d9c)
-- [actions] add automatic rebasing / merge commit blocking [`b09cdb7`](https://github.com/inspect-js/has-symbols/commit/b09cdb7cd7ee39e7a769878f56e2d6066f5ccd1d)
-- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `core-js`, `get-own-property-symbols`, `tape` [`1dd42cd`](https://github.com/inspect-js/has-symbols/commit/1dd42cd86183ed0c50f99b1062345c458babca91)
-- [meta] create FUNDING.yml [`aa57a17`](https://github.com/inspect-js/has-symbols/commit/aa57a17b19708906d1927f821ea8e73394d84ca4)
-- Only apps should have lockfiles [`a2d8bea`](https://github.com/inspect-js/has-symbols/commit/a2d8bea23a97d15c09eaf60f5b107fcf9a4d57aa)
-- [Tests] use `npx aud` instead of `nsp` or `npm audit` with hoops [`9e96cb7`](https://github.com/inspect-js/has-symbols/commit/9e96cb783746cbed0c10ef78e599a8eaa7ebe193)
-- [meta] add `funding` field [`a0b32cf`](https://github.com/inspect-js/has-symbols/commit/a0b32cf68e803f963c1639b6d47b0a9d6440bab0)
-- [Dev Deps] update `safe-publish-latest` [`cb9f0a5`](https://github.com/inspect-js/has-symbols/commit/cb9f0a521a3a1790f1064d437edd33bb6c3d6af0)
-
-## v1.0.0 - 2016-09-19
-
-### Commits
-
-- Tests. [`ecb6eb9`](https://github.com/inspect-js/has-symbols/commit/ecb6eb934e4883137f3f93b965ba5e0a98df430d)
-- package.json [`88a337c`](https://github.com/inspect-js/has-symbols/commit/88a337cee0864a0da35f5d19e69ff0ef0150e46a)
-- Initial commit [`42e1e55`](https://github.com/inspect-js/has-symbols/commit/42e1e5502536a2b8ac529c9443984acd14836b1c)
-- Initial implementation. [`33f5cc6`](https://github.com/inspect-js/has-symbols/commit/33f5cc6cdff86e2194b081ee842bfdc63caf43fb)
-- read me [`01f1170`](https://github.com/inspect-js/has-symbols/commit/01f1170188ff7cb1558aa297f6ba5b516c6d7b0c)
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/LICENSE b/node_modules/string.prototype.matchall/node_modules/has-symbols/LICENSE
deleted file mode 100644
index df31cbf..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2016 Jordan Harband
-
-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/node_modules/string.prototype.matchall/node_modules/has-symbols/README.md b/node_modules/string.prototype.matchall/node_modules/has-symbols/README.md
deleted file mode 100644
index b27b31a..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/README.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# has-symbols <sup>[![Version Badge][2]][1]</sup>
-
-[![Build Status][3]][4]
-[![dependency status][5]][6]
-[![dev dependency status][7]][8]
-[![License][license-image]][license-url]
-[![Downloads][downloads-image]][downloads-url]
-
-[![npm badge][11]][1]
-
-Determine if the JS environment has Symbol support. Supports spec, or shams.
-
-## Example
-
-```js
-var hasSymbols = require('has-symbols');
-
-hasSymbols() === true; // if the environment has native Symbol support. Not polyfillable, not forgeable.
-
-var hasSymbolsKinda = require('has-symbols/shams');
-hasSymbolsKinda() === true; // if the environment has a Symbol sham that mostly follows the spec.
-```
-
-## Supported Symbol shams
- - get-own-property-symbols [npm](https://www.npmjs.com/package/get-own-property-symbols) | [github](https://github.com/WebReflection/get-own-property-symbols)
- - core-js [npm](https://www.npmjs.com/package/core-js) | [github](https://github.com/zloirock/core-js)
-
-## Tests
-Simply clone the repo, `npm install`, and run `npm test`
-
-[1]: https://npmjs.org/package/has-symbols
-[2]: http://versionbadg.es/ljharb/has-symbols.svg
-[3]: https://travis-ci.org/ljharb/has-symbols.svg
-[4]: https://travis-ci.org/ljharb/has-symbols
-[5]: https://david-dm.org/ljharb/has-symbols.svg
-[6]: https://david-dm.org/ljharb/has-symbols
-[7]: https://david-dm.org/ljharb/has-symbols/dev-status.svg
-[8]: https://david-dm.org/ljharb/has-symbols#info=devDependencies
-[9]: https://ci.testling.com/ljharb/has-symbols.png
-[10]: https://ci.testling.com/ljharb/has-symbols
-[11]: https://nodei.co/npm/has-symbols.png?downloads=true&stars=true
-[license-image]: http://img.shields.io/npm/l/has-symbols.svg
-[license-url]: LICENSE
-[downloads-image]: http://img.shields.io/npm/dm/has-symbols.svg
-[downloads-url]: http://npm-stat.com/charts.html?package=has-symbols
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/index.js b/node_modules/string.prototype.matchall/node_modules/has-symbols/index.js
deleted file mode 100644
index f72159e..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/index.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-
-var origSymbol = global.Symbol;
-var hasSymbolSham = require('./shams');
-
-module.exports = function hasNativeSymbols() {
-	if (typeof origSymbol !== 'function') { return false; }
-	if (typeof Symbol !== 'function') { return false; }
-	if (typeof origSymbol('foo') !== 'symbol') { return false; }
-	if (typeof Symbol('bar') !== 'symbol') { return false; }
-
-	return hasSymbolSham();
-};
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/package.json b/node_modules/string.prototype.matchall/node_modules/has-symbols/package.json
deleted file mode 100644
index d15b512..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/package.json
+++ /dev/null
@@ -1,89 +0,0 @@
-{
-	"name": "has-symbols",
-	"version": "1.0.1",
-	"author": {
-		"name": "Jordan Harband",
-		"email": "ljharb@gmail.com",
-		"url": "http://ljharb.codes"
-	},
-	"funding": {
-		"url": "https://github.com/sponsors/ljharb"
-	},
-	"contributors": [
-		{
-			"name": "Jordan Harband",
-			"email": "ljharb@gmail.com",
-			"url": "http://ljharb.codes"
-		}
-	],
-	"description": "Determine if the JS environment has Symbol support. Supports spec, or shams.",
-	"license": "MIT",
-	"main": "index.js",
-	"scripts": {
-		"prepublish": "safe-publish-latest",
-		"pretest": "npm run --silent lint",
-		"test": "npm run --silent tests-only",
-		"posttest": "npx aud",
-		"tests-only": "npm run --silent test:stock && npm run --silent test:staging && npm run --silent test:shams",
-		"test:stock": "node test",
-		"test:staging": "node --harmony --es-staging test",
-		"test:shams": "npm run --silent test:shams:getownpropertysymbols && npm run --silent test:shams:corejs",
-		"test:shams:corejs": "node test/shams/core-js.js",
-		"test:shams:getownpropertysymbols": "node test/shams/get-own-property-symbols.js",
-		"lint": "eslint *.js",
-		"version": "auto-changelog && git add CHANGELOG.md",
-		"postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
-	},
-	"repository": {
-		"type": "git",
-		"url": "git://github.com/ljharb/has-symbols.git"
-	},
-	"keywords": [
-		"Symbol",
-		"symbols",
-		"typeof",
-		"sham",
-		"polyfill",
-		"native",
-		"core-js",
-		"ES6"
-	],
-	"dependencies": {},
-	"devDependencies": {
-		"@ljharb/eslint-config": "^15.0.1",
-		"auto-changelog": "^1.16.2",
-		"core-js": "^2.6.10",
-		"eslint": "^6.6.0",
-		"get-own-property-symbols": "^0.9.4",
-		"safe-publish-latest": "^1.1.4",
-		"tape": "^4.11.0"
-	},
-	"testling": {
-		"files": "test/index.js",
-		"browsers": [
-			"iexplore/6.0..latest",
-			"firefox/3.0..6.0",
-			"firefox/15.0..latest",
-			"firefox/nightly",
-			"chrome/4.0..10.0",
-			"chrome/20.0..latest",
-			"chrome/canary",
-			"opera/10.0..latest",
-			"opera/next",
-			"safari/4.0..latest",
-			"ipad/6.0..latest",
-			"iphone/6.0..latest",
-			"android-browser/4.2"
-		]
-	},
-	"engines": {
-		"node": ">= 0.4"
-	},
-	"auto-changelog": {
-		"output": "CHANGELOG.md",
-		"template": "keepachangelog",
-		"unreleased": false,
-		"commitLimit": false,
-		"backfillLimit": false
-	}
-}
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/shams.js b/node_modules/string.prototype.matchall/node_modules/has-symbols/shams.js
deleted file mode 100644
index 9f80f79..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/shams.js
+++ /dev/null
@@ -1,42 +0,0 @@
-'use strict';
-
-/* eslint complexity: [2, 18], max-statements: [2, 33] */
-module.exports = function hasSymbols() {
-	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
-	if (typeof Symbol.iterator === 'symbol') { return true; }
-
-	var obj = {};
-	var sym = Symbol('test');
-	var symObj = Object(sym);
-	if (typeof sym === 'string') { return false; }
-
-	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
-	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
-
-	// temp disabled per https://github.com/ljharb/object.assign/issues/17
-	// if (sym instanceof Symbol) { return false; }
-	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
-	// if (!(symObj instanceof Symbol)) { return false; }
-
-	// if (typeof Symbol.prototype.toString !== 'function') { return false; }
-	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
-
-	var symVal = 42;
-	obj[sym] = symVal;
-	for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax
-	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
-
-	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
-
-	var syms = Object.getOwnPropertySymbols(obj);
-	if (syms.length !== 1 || syms[0] !== sym) { return false; }
-
-	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
-
-	if (typeof Object.getOwnPropertyDescriptor === 'function') {
-		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
-		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
-	}
-
-	return true;
-};
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/test/index.js b/node_modules/string.prototype.matchall/node_modules/has-symbols/test/index.js
deleted file mode 100644
index fc32aff..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/test/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-
-var test = require('tape');
-var hasSymbols = require('../');
-var runSymbolTests = require('./tests');
-
-test('interface', function (t) {
- 	t.equal(typeof hasSymbols, 'function', 'is a function');
-	t.equal(typeof hasSymbols(), 'boolean', 'returns a boolean');
-	t.end();
-});
-
-test('Symbols are supported', { skip: !hasSymbols() }, function (t) {
-	runSymbolTests(t);
-	t.end();
-});
-
-test('Symbols are not supported', { skip: hasSymbols() }, function (t) {
-	t.equal(typeof Symbol, 'undefined', 'global Symbol is undefined');
-	t.equal(typeof Object.getOwnPropertySymbols, 'undefined', 'Object.getOwnPropertySymbols does not exist');
-	t.end();
-});
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/test/shams/core-js.js b/node_modules/string.prototype.matchall/node_modules/has-symbols/test/shams/core-js.js
deleted file mode 100644
index df5365c..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/test/shams/core-js.js
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict';
-
-var test = require('tape');
-
-if (typeof Symbol === 'function' && typeof Symbol() === 'symbol') {
-	test('has native Symbol support', function (t) {
-		t.equal(typeof Symbol, 'function');
-		t.equal(typeof Symbol(), 'symbol');
-		t.end();
-	});
-	return;
-}
-
-var hasSymbols = require('../../shams');
-
-test('polyfilled Symbols', function (t) {
-	/* eslint-disable global-require */
-	t.equal(hasSymbols(), false, 'hasSymbols is false before polyfilling');
-	require('core-js/fn/symbol');
-	require('core-js/fn/symbol/to-string-tag');
-
-	require('../tests')(t);
-
-	var hasSymbolsAfter = hasSymbols();
-	t.equal(hasSymbolsAfter, true, 'hasSymbols is true after polyfilling');
-	/* eslint-enable global-require */
-	t.end();
-});
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/test/shams/get-own-property-symbols.js b/node_modules/string.prototype.matchall/node_modules/has-symbols/test/shams/get-own-property-symbols.js
deleted file mode 100644
index 9191b24..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/test/shams/get-own-property-symbols.js
+++ /dev/null
@@ -1,28 +0,0 @@
-'use strict';
-
-var test = require('tape');
-
-if (typeof Symbol === 'function' && typeof Symbol() === 'symbol') {
-	test('has native Symbol support', function (t) {
-		t.equal(typeof Symbol, 'function');
-		t.equal(typeof Symbol(), 'symbol');
-		t.end();
-	});
-	return;
-}
-
-var hasSymbols = require('../../shams');
-
-test('polyfilled Symbols', function (t) {
-	/* eslint-disable global-require */
-	t.equal(hasSymbols(), false, 'hasSymbols is false before polyfilling');
-
-	require('get-own-property-symbols');
-
-	require('../tests')(t);
-
-	var hasSymbolsAfter = hasSymbols();
-	t.equal(hasSymbolsAfter, true, 'hasSymbols is true after polyfilling');
-	/* eslint-enable global-require */
-	t.end();
-});
diff --git a/node_modules/string.prototype.matchall/node_modules/has-symbols/test/tests.js b/node_modules/string.prototype.matchall/node_modules/has-symbols/test/tests.js
deleted file mode 100644
index 93ff0ea..0000000
--- a/node_modules/string.prototype.matchall/node_modules/has-symbols/test/tests.js
+++ /dev/null
@@ -1,54 +0,0 @@
-'use strict';
-
-module.exports = function runSymbolTests(t) {
-	t.equal(typeof Symbol, 'function', 'global Symbol is a function');
-
-	if (typeof Symbol !== 'function') { return false };
-
-	t.notEqual(Symbol(), Symbol(), 'two symbols are not equal');
-
-	/*
-	t.equal(
-		Symbol.prototype.toString.call(Symbol('foo')),
-		Symbol.prototype.toString.call(Symbol('foo')),
-		'two symbols with the same description stringify the same'
-	);
-	*/
-
-	var foo = Symbol('foo');
-
-	/*
-	t.notEqual(
-		String(foo),
-		String(Symbol('bar')),
-		'two symbols with different descriptions do not stringify the same'
-	);
-	*/
-
-	t.equal(typeof Symbol.prototype.toString, 'function', 'Symbol#toString is a function');
-	// t.equal(String(foo), Symbol.prototype.toString.call(foo), 'Symbol#toString equals String of the same symbol');
-
-	t.equal(typeof Object.getOwnPropertySymbols, 'function', 'Object.getOwnPropertySymbols is a function');
-
-	var obj = {};
-	var sym = Symbol('test');
-	var symObj = Object(sym);
-	t.notEqual(typeof sym, 'string', 'Symbol is not a string');
-	t.equal(Object.prototype.toString.call(sym), '[object Symbol]', 'symbol primitive Object#toStrings properly');
-	t.equal(Object.prototype.toString.call(symObj), '[object Symbol]', 'symbol primitive Object#toStrings properly');
-
-	var symVal = 42;
-	obj[sym] = symVal;
-	for (sym in obj) { t.fail('symbol property key was found in for..in of object'); }
-
-	t.deepEqual(Object.keys(obj), [], 'no enumerable own keys on symbol-valued object');
-	t.deepEqual(Object.getOwnPropertyNames(obj), [], 'no own names on symbol-valued object');
-	t.deepEqual(Object.getOwnPropertySymbols(obj), [sym], 'one own symbol on symbol-valued object');
-	t.equal(Object.prototype.propertyIsEnumerable.call(obj, sym), true, 'symbol is enumerable');
-	t.deepEqual(Object.getOwnPropertyDescriptor(obj, sym), {
-		configurable: true,
-		enumerable: true,
-		value: 42,
-		writable: true
-	}, 'property descriptor is correct');
-};
diff --git a/node_modules/string.prototype.matchall/package.json b/node_modules/string.prototype.matchall/package.json
deleted file mode 100644
index de943d4..0000000
--- a/node_modules/string.prototype.matchall/package.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-	"name": "string.prototype.matchall",
-	"version": "4.0.2",
-	"description": "Spec-compliant polyfill for String.prototype.matchAll ESnext proposal.",
-	"main": "index.js",
-	"scripts": {
-		"prepublish": "safe-publish-latest",
-		"pretest": "npm run lint",
-		"test": "es-shim-api --bound && npm run tests-only",
-		"posttest": "npx aud",
-		"tests-only": "npm run test:module && npm run test:shim",
-		"test:module": "node test",
-		"test:shim": "node test/shimmed",
-		"prelint": "evalmd *.md",
-		"lint": "eslint ."
-	},
-	"repository": {
-		"type": "git",
-		"url": "git+https://github.com/ljharb/String.prototype.matchAll.git"
-	},
-	"keywords": [
-		"String.prototype.matchAll",
-		"matchAll",
-		"match",
-		"regex",
-		"regexp",
-		"regular",
-		"expression",
-		"matches"
-	],
-	"author": "Jordan Harband <ljharb@gmail.com>",
-	"funding": {
-		"url": "https://github.com/sponsors/ljharb"
-	},
-	"license": "MIT",
-	"bugs": {
-		"url": "https://github.com/ljharb/String.prototype.matchAll/issues"
-	},
-	"homepage": "https://github.com/ljharb/String.prototype.matchAll#readme",
-	"dependencies": {
-		"define-properties": "^1.1.3",
-		"es-abstract": "^1.17.0",
-		"has-symbols": "^1.0.1",
-		"internal-slot": "^1.0.2",
-		"regexp.prototype.flags": "^1.3.0",
-		"side-channel": "^1.0.2"
-	},
-	"devDependencies": {
-		"@es-shims/api": "^2.1.2",
-		"@ljharb/eslint-config": "^15.1.0",
-		"es5-shim": "^4.5.13",
-		"es6-shim": "^0.35.5",
-		"eslint": "^6.8.0",
-		"evalmd": "0.0.19",
-		"foreach": "^2.0.5",
-		"function-bind": "^1.1.1",
-		"functions-have-names": "^1.2.0",
-		"object-inspect": "^1.7.0",
-		"object.assign": "^4.1.0",
-		"object.entries": "^1.1.1",
-		"safe-publish-latest": "^1.1.4",
-		"tape": "^4.12.0"
-	}
-}
diff --git a/node_modules/string.prototype.matchall/polyfill-regexp-matchall.js b/node_modules/string.prototype.matchall/polyfill-regexp-matchall.js
deleted file mode 100644
index 6c39baf..0000000
--- a/node_modules/string.prototype.matchall/polyfill-regexp-matchall.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-
-var hasSymbols = require('has-symbols')();
-var regexpMatchAll = require('./regexp-matchall');
-
-module.exports = function getRegExpMatchAllPolyfill() {
-	if (!hasSymbols || typeof Symbol.matchAll !== 'symbol' || typeof RegExp.prototype[Symbol.matchAll] !== 'function') {
-		return regexpMatchAll;
-	}
-	return RegExp.prototype[Symbol.matchAll];
-};
diff --git a/node_modules/string.prototype.matchall/polyfill.js b/node_modules/string.prototype.matchall/polyfill.js
deleted file mode 100644
index c9e0df4..0000000
--- a/node_modules/string.prototype.matchall/polyfill.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-
-var implementation = require('./implementation');
-
-module.exports = function getPolyfill() {
-	if (String.prototype.matchAll) {
-		try {
-			''.matchAll(RegExp.prototype);
-		} catch (e) {
-			return String.prototype.matchAll;
-		}
-	}
-	return implementation;
-};
diff --git a/node_modules/string.prototype.matchall/regexp-matchall.js b/node_modules/string.prototype.matchall/regexp-matchall.js
deleted file mode 100644
index c474f31..0000000
--- a/node_modules/string.prototype.matchall/regexp-matchall.js
+++ /dev/null
@@ -1,78 +0,0 @@
-'use strict';
-
-// var Construct = require('es-abstract/2019/Construct');
-var Get = require('es-abstract/2019/Get');
-var Set = require('es-abstract/2019/Set');
-var SpeciesConstructor = require('es-abstract/2019/SpeciesConstructor');
-var ToLength = require('es-abstract/2019/ToLength');
-var ToString = require('es-abstract/2019/ToString');
-var Type = require('es-abstract/2019/Type');
-var flagsGetter = require('regexp.prototype.flags');
-
-var RegExpStringIterator = require('./helpers/RegExpStringIterator');
-var OrigRegExp = RegExp;
-
-var CreateRegExpStringIterator = function CreateRegExpStringIterator(R, S, global, fullUnicode) {
-	if (Type(S) !== 'String') {
-		throw new TypeError('"S" value must be a String');
-	}
-	if (Type(global) !== 'Boolean') {
-		throw new TypeError('"global" value must be a Boolean');
-	}
-	if (Type(fullUnicode) !== 'Boolean') {
-		throw new TypeError('"fullUnicode" value must be a Boolean');
-	}
-
-	var iterator = new RegExpStringIterator(R, S, global, fullUnicode);
-	return iterator;
-};
-
-var supportsConstructingWithFlags = 'flags' in RegExp.prototype;
-
-var constructRegexWithFlags = function constructRegex(C, R) {
-	var matcher;
-	// workaround for older engines that lack RegExp.prototype.flags
-	var flags = 'flags' in R ? Get(R, 'flags') : ToString(flagsGetter(R));
-	if (supportsConstructingWithFlags && typeof flags === 'string') {
-		matcher = new C(R, flags);
-	} else if (C === OrigRegExp) {
-		// workaround for older engines that can not construct a RegExp with flags
-		matcher = new C(R.source, flags);
-	} else {
-		matcher = new C(R, flags);
-	}
-	return { flags: flags, matcher: matcher };
-};
-
-var regexMatchAll = function SymbolMatchAll(string) {
-	var R = this;
-	if (Type(R) !== 'Object') {
-		throw new TypeError('"this" value must be an Object');
-	}
-	var S = ToString(string);
-	var C = SpeciesConstructor(R, OrigRegExp);
-
-	var tmp = constructRegexWithFlags(C, R);
-	// var flags = ToString(Get(R, 'flags'));
-	var flags = tmp.flags;
-	// var matcher = Construct(C, [R, flags]);
-	var matcher = tmp.matcher;
-
-	var lastIndex = ToLength(Get(R, 'lastIndex'));
-	Set(matcher, 'lastIndex', lastIndex, true);
-	var global = flags.indexOf('g') > -1;
-	var fullUnicode = flags.indexOf('u') > -1;
-	return CreateRegExpStringIterator(matcher, S, global, fullUnicode);
-};
-
-var defineP = Object.defineProperty;
-var gOPD = Object.getOwnPropertyDescriptor;
-
-if (defineP && gOPD) {
-	var desc = gOPD(regexMatchAll, 'name');
-	if (desc && desc.configurable) {
-		defineP(regexMatchAll, 'name', { value: '[Symbol.matchAll]' });
-	}
-}
-
-module.exports = regexMatchAll;
diff --git a/node_modules/string.prototype.matchall/shim.js b/node_modules/string.prototype.matchall/shim.js
deleted file mode 100644
index 2dd4a24..0000000
--- a/node_modules/string.prototype.matchall/shim.js
+++ /dev/null
@@ -1,49 +0,0 @@
-'use strict';
-
-var define = require('define-properties');
-var hasSymbols = require('has-symbols')();
-var getPolyfill = require('./polyfill');
-var regexpMatchAllPolyfill = require('./polyfill-regexp-matchall');
-
-var defineP = Object.defineProperty;
-var gOPD = Object.getOwnPropertyDescriptor;
-
-module.exports = function shimMatchAll() {
-	var polyfill = getPolyfill();
-	define(
-		String.prototype,
-		{ matchAll: polyfill },
-		{ matchAll: function () { return String.prototype.matchAll !== polyfill; } }
-	);
-	if (hasSymbols) {
-		// eslint-disable-next-line no-restricted-properties
-		var symbol = Symbol.matchAll || (Symbol['for'] ? Symbol['for']('Symbol.matchAll') : Symbol('Symbol.matchAll'));
-		define(
-			Symbol,
-			{ matchAll: symbol },
-			{ matchAll: function () { return Symbol.matchAll !== symbol; } }
-		);
-
-		if (defineP && gOPD) {
-			var desc = gOPD(Symbol, symbol);
-			if (!desc || desc.configurable) {
-				defineP(Symbol, symbol, {
-					configurable: false,
-					enumerable: false,
-					value: symbol,
-					writable: false
-				});
-			}
-		}
-
-		var regexpMatchAll = regexpMatchAllPolyfill();
-		var func = {};
-		func[symbol] = regexpMatchAll;
-		var predicate = {};
-		predicate[symbol] = function () {
-			return RegExp.prototype[symbol] !== regexpMatchAll;
-		};
-		define(RegExp.prototype, func, predicate);
-	}
-	return polyfill;
-};
diff --git a/node_modules/string.prototype.matchall/test/index.js b/node_modules/string.prototype.matchall/test/index.js
deleted file mode 100644
index 86daec8..0000000
--- a/node_modules/string.prototype.matchall/test/index.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-
-var matchAllShim = require('../');
-var regexMatchAll = require('../regexp-matchall');
-var test = require('tape');
-
-var runTests = require('./tests');
-
-test('as a function', function (t) {
-	runTests(matchAllShim, regexMatchAll, t);
-
-	t.end();
-});
diff --git a/node_modules/string.prototype.matchall/test/shimmed.js b/node_modules/string.prototype.matchall/test/shimmed.js
deleted file mode 100644
index f6b2f7c..0000000
--- a/node_modules/string.prototype.matchall/test/shimmed.js
+++ /dev/null
@@ -1,77 +0,0 @@
-'use strict';
-
-require('es5-shim');
-require('es6-shim');
-var matchAllShim = require('../');
-matchAllShim.shim();
-
-var test = require('tape');
-var defineProperties = require('define-properties');
-var bind = require('function-bind');
-var hasSymbols = require('has-symbols')();
-var regexMatchAll = require('../regexp-matchall');
-
-var isEnumerable = Object.prototype.propertyIsEnumerable;
-var functionsHaveNames = require('functions-have-names')();
-var functionNamesConfigurable = require('functions-have-names').functionsHaveConfigurableNames();
-
-var runTests = require('./tests');
-
-test('shimmed', function (t) {
-	t.equal(String.prototype.matchAll.length, 1, 'String#matchAll has a length of 1');
-	t.test('Function name', { skip: !functionsHaveNames }, function (st) {
-		st.equal(String.prototype.matchAll.name, 'matchAll', 'String#matchAll has name "matchAll"');
-		st.end();
-	});
-
-	t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
-		et.equal(false, isEnumerable.call(String.prototype, 'matchAll'), 'String#matchAll is not enumerable');
-		et.end();
-	});
-
-	t.test('Symbol.matchAll', { skip: !hasSymbols }, function (st) {
-		st.equal(typeof Symbol.matchAll, 'symbol', 'Symbol.matchAll is a symbol');
-
-		st.equal(typeof RegExp.prototype[Symbol.matchAll], 'function', 'Symbol.matchAll function is on RegExp.prototype');
-
-		st.test('Function name', { skip: !functionsHaveNames }, function (s2t) {
-			if (functionNamesConfigurable) {
-				s2t.equal(RegExp.prototype[Symbol.matchAll].name, '[Symbol.matchAll]', 'RegExp.prototype[Symbol.matchAll] has name "[Symbol.matchAll]"');
-			} else {
-				s2t.equal(RegExp.prototype[Symbol.matchAll].name, 'SymbolMatchAll', 'RegExp.prototype[Symbol.matchAll] has best guess name "SymbolMatchAll"');
-			}
-			s2t.end();
-		});
-
-		st.test('no symbol present', function (s2t) {
-			var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, Symbol.matchAll);
-
-			s2t.doesNotThrow(function () { 'abc'.matchAll('b'); }, 'does not throw on string input, with the symbol on regex prototype');
-
-			// eslint-disable-next-line no-extend-native
-			Object.defineProperty(RegExp.prototype, Symbol.matchAll, {
-				configurable: true,
-				enumerable: false,
-				value: undefined,
-				writable: true
-			});
-
-			s2t['throws'](function () { 'abc'.matchAll('b'); }, 'throws on string input, without the symbol on regex prototype');
-
-			// eslint-disable-next-line no-extend-native
-			Object.defineProperty(RegExp.prototype, Symbol.matchAll, desc);
-
-			s2t.end();
-		});
-
-		st.end();
-	});
-
-	runTests(
-		bind.call(Function.call, String.prototype.matchAll),
-		bind.call(Function.call, hasSymbols ? RegExp.prototype[Symbol.matchAll] : regexMatchAll),
-		t
-	);
-
-	t.end();
-});
diff --git a/node_modules/string.prototype.matchall/test/tests.js b/node_modules/string.prototype.matchall/test/tests.js
deleted file mode 100644
index 7214b47..0000000
--- a/node_modules/string.prototype.matchall/test/tests.js
+++ /dev/null
@@ -1,247 +0,0 @@
-'use strict';
-
-var forEach = require('foreach');
-var has = Object.prototype.hasOwnProperty;
-var assign = require('object.assign');
-var define = require('define-properties');
-var entries = require('object.entries');
-var inspect = require('object-inspect');
-
-var hasSticky = typeof (/a/).sticky === 'boolean';
-var hasGroups = 'groups' in (/a/).exec('a');
-
-var groups = function groups(matchObject) {
-	return hasGroups ? assign(matchObject, { groups: matchObject.groups }, matchObject) : matchObject;
-};
-
-var arraySpread = function arraySpread(iterator) {
-	if (Array.isArray(iterator)) { return iterator; }
-	var result;
-	var values = [];
-	do {
-		result = iterator.next();
-		values.push(result);
-	} while (!result.done);
-	return values;
-};
-
-var testResults = function (t, iterator, expectedResults, item) {
-	var prefix = arguments.length > 3 ? inspect(item) + ': ' : '';
-	var results = arraySpread(iterator);
-	var expecteds = arraySpread(expectedResults);
-	t.test(prefix + 'actual vs expected result lengths', function (st) {
-		st.equal(results.length, expecteds.length, 'actual and expected result counts are the same');
-		st.end();
-	});
-	t.test(prefix + 'actual vs expected results', { skip: results.length !== expecteds.length }, function (st) {
-		forEach(expecteds, function (expected, index) {
-			var result = results.shift();
-			st.equal(result.done, expected.done, 'result ' + (index + 1) + ' is ' + (expected.done ? '' : 'not ') + 'done');
-			st.test('result ' + (index + 1), { skip: result.done !== expected.done }, function (s2t) {
-				if (expected.done) {
-					s2t.equal(result.value, undefined, 'result ' + (index + 1) + ' value is undefined');
-				} else {
-					s2t.equal(Array.isArray(result.value), true, 'result ' + (index + 1) + ' value is an array');
-					s2t.deepEqual(entries(result.value || {}), entries(expected.value || {}), 'result ' + (index + 1) + ' has the same entries');
-					s2t.deepEqual(result.value, expected.value, 'result ' + (index + 1) + ' value is expected value');
-				}
-				s2t.end();
-			});
-		});
-	});
-};
-
-module.exports = function (matchAll, regexMatchAll, t) {
-	t.test('non-regexes', function (st) {
-		var notRegexes = [
-			[null, [{ value: undefined, done: true }]],
-			[undefined, [
-				{ value: assign([''], groups({ index: 0, input: 'abc' })), done: false },
-				{ value: assign([''], groups({ index: 1, input: 'abc' })), done: false },
-				{ value: assign([''], groups({ index: 2, input: 'abc' })), done: false },
-				{ value: assign([''], groups({ index: 3, input: 'abc' })), done: false },
-				{ value: undefined, done: true }
-			]],
-			[NaN, [{ value: undefined, done: true }]],
-			[42, [{ value: undefined, done: true }]],
-			[new Date(), [{ value: undefined, done: true }]],
-			[{}, [
-				{ value: assign(['b'], groups({ index: 1, input: 'abc' })), done: false },
-				{ value: assign(['c'], groups({ index: 2, input: 'abc' })), done: false },
-				{ value: undefined, done: true }
-			]],
-			[[], [
-				{ value: assign([''], groups({ index: 0, input: 'abc' })), done: false },
-				{ value: assign([''], groups({ index: 1, input: 'abc' })), done: false },
-				{ value: assign([''], groups({ index: 2, input: 'abc' })), done: false },
-				{ value: assign([''], groups({ index: 3, input: 'abc' })), done: false },
-				{ value: undefined, done: true }
-			]]
-		];
-		var str = 'abc';
-		forEach(notRegexes, function (notRegex) {
-			testResults(st, matchAll(str, notRegex[0]), notRegex[1], notRegex[0]);
-		});
-		st.end();
-	});
-
-	t.test('passing a string instead of a regex', function (st) {
-		var str = 'aabcaba';
-		testResults(st, matchAll(str, 'a'), matchAll(str, /a/g));
-		st.end();
-	});
-
-	t.test('ToString-able objects', function (st) {
-		var str = 'aabc';
-		var strObj = { toString: function () { return str; } };
-		var regex = /[ac]/g;
-		var expectedResults = [
-			{ value: assign(['a'], groups({ index: 0, input: str })), done: false },
-			{ value: assign(['a'], groups({ index: 1, input: str })), done: false },
-			{ value: assign(['c'], groups({ index: 3, input: str })), done: false },
-			{ value: undefined, done: true }
-		];
-		testResults(st, matchAll(strObj, regex), expectedResults);
-		st.end();
-	});
-
-	t.test('#flags', function (st) {
-		st.test('without a flags property', function (s2t) {
-			var str = 'aabc';
-			var regex = /[ac]/g;
-			if (define.supportsDescriptors) {
-				Object.defineProperty(regex, 'flags', { value: undefined });
-			}
-			s2t.equal(regex.flags, undefined, 'regex has an undefined "flags" property');
-			s2t['throws'](
-				function () { matchAll(str, regex); },
-				'undefined flags throws'
-			);
-			s2t.end();
-		});
-
-		st.test('with a static flags property', function (s2t) {
-			var str = 'AaBC';
-			var regex = /[ac]/;
-			define(regex, { flags: 'ig' }, { flags: function () { return true; } });
-			try {
-				define(regex, { global: true }, { global: function () { return true; } });
-				s2t.equal(regex.global, true);
-			} catch (e) {
-				s2t.comment('# SKIP in node < 6, `global` is not configurable on regexes');
-				return s2t.end();
-			}
-			s2t.equal(regex.flags, 'ig');
-			var expectedResults = [
-				{ value: assign(['A'], groups({ index: 0, input: str })), done: false },
-				{ value: assign(['a'], groups({ index: 1, input: str })), done: false },
-				{ value: assign(['C'], groups({ index: 3, input: str })), done: false },
-				{ value: undefined, done: true }
-			];
-			testResults(s2t, matchAll(str, regex), expectedResults);
-			return s2t.end();
-		});
-
-		st.test('respects flags', function (s2t) {
-			var str = 'A\na\nb\nC';
-			var regex = /^[ac]/img;
-			var expectedResults = [
-				{ value: assign(['A'], groups({ index: 0, input: str })), done: false },
-				{ value: assign(['a'], groups({ index: 2, input: str })), done: false },
-				{ value: assign(['C'], groups({ index: 6, input: str })), done: false },
-				{ value: undefined, done: true }
-			];
-			testResults(s2t, matchAll(str, regex), expectedResults);
-			s2t.end();
-		});
-
-		st.test('throws with a non-global regex', function (s2t) {
-			var str = 'AaBbCc';
-			var regex = /[bc]/i;
-			s2t['throws'](
-				function () { matchAll(str, regex); },
-				TypeError,
-				'a non-global regex throws'
-			);
-			s2t.end();
-		});
-
-		st.test('works with a global non-sticky regex', function (s2t) {
-			var str = 'AaBbCc';
-			var regex = /[bc]/gi;
-			var expectedResults = [
-				{ value: assign(['B'], groups({ index: 2, input: str })), done: false },
-				{ value: assign(['b'], groups({ index: 3, input: str })), done: false },
-				{ value: assign(['C'], groups({ index: 4, input: str })), done: false },
-				{ value: assign(['c'], groups({ index: 5, input: str })), done: false },
-				{ value: undefined, done: true }
-			];
-			testResults(s2t, matchAll(str, regex), expectedResults);
-			s2t.end();
-		});
-	});
-
-	t.test('returns an iterator', function (st) {
-		var str = 'aabc';
-		var iterator = matchAll(str, /[ac]/g);
-		st.ok(iterator, 'iterator is truthy');
-		st.equal(has.call(iterator, 'next'), false, 'iterator does not have own property "next"');
-		for (var key in iterator) {
-			st.fail('iterator has enumerable properties: ' + key);
-		}
-		var expectedResults = [
-			{ value: assign(['a'], groups({ index: 0, input: str })), done: false },
-			{ value: assign(['a'], groups({ index: 1, input: str })), done: false },
-			{ value: assign(['c'], groups({ index: 3, input: str })), done: false },
-			{ value: undefined, done: true }
-		];
-		testResults(st, iterator, expectedResults);
-		st.end();
-	});
-
-	t.test('zero-width matches', function (st) {
-		var str = 'abcde';
-
-		st.test('global', function (s2t) {
-			var expectedResults = [
-				{ value: assign([''], groups({ index: 1, input: str })), done: false },
-				{ value: assign([''], groups({ index: 2, input: str })), done: false },
-				{ value: assign([''], groups({ index: 3, input: str })), done: false },
-				{ value: assign([''], groups({ index: 4, input: str })), done: false },
-				{ value: undefined, done: true }
-			];
-			testResults(s2t, matchAll(str, /\B/g), expectedResults);
-			s2t.end();
-		});
-
-		st.test('sticky', { skip: !hasSticky }, function (s2t) {
-			var expectedResults = [
-				{ value: undefined, done: true }
-			];
-
-			/* eslint no-invalid-regexp: [2, { "allowConstructorFlags": ["y"] }] */
-			var regex = new RegExp('\\B', 'y');
-			s2t['throws'](
-				function () { matchAll(str, regex); },
-				TypeError,
-				'non-global sticky regex throws'
-			);
-
-			/* eslint no-invalid-regexp: [2, { "allowConstructorFlags": ["y"] }] */
-			testResults(s2t, matchAll(str, new RegExp('\\B', 'gy')), expectedResults);
-
-			s2t.end();
-		});
-
-		st.test('unflagged', function (s2t) {
-			s2t['throws'](
-				function () { matchAll(str, /\B/); },
-				TypeError,
-				'unflagged regex throws'
-			);
-			s2t.end();
-		});
-
-		st.end();
-	});
-};
diff --git a/node_modules/strip-bom/index.js b/node_modules/strip-bom/index.js
index 82f9175..b00feb9 100644
--- a/node_modules/strip-bom/index.js
+++ b/node_modules/strip-bom/index.js
@@ -1,15 +1,14 @@
 'use strict';
-
-module.exports = string => {
-	if (typeof string !== 'string') {
-		throw new TypeError(`Expected a string, got ${typeof string}`);
+module.exports = x => {
+	if (typeof x !== 'string') {
+		throw new TypeError('Expected a string, got ' + typeof x);
 	}
 
 	// Catches EFBBBF (UTF-8 BOM) because the buffer-to-string
 	// conversion translates it to FEFF (UTF-16 BOM)
-	if (string.charCodeAt(0) === 0xFEFF) {
-		return string.slice(1);
+	if (x.charCodeAt(0) === 0xFEFF) {
+		return x.slice(1);
 	}
 
-	return string;
+	return x;
 };
diff --git a/node_modules/strip-bom/license b/node_modules/strip-bom/license
index e7af2f7..654d0bf 100644
--- a/node_modules/strip-bom/license
+++ b/node_modules/strip-bom/license
@@ -1,9 +1,21 @@
-MIT License
+The MIT License (MIT)
 
 Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
 
-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:
+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 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.
+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/node_modules/strip-bom/package.json b/node_modules/strip-bom/package.json
index f96ba34..10f8fdd 100644
--- a/node_modules/strip-bom/package.json
+++ b/node_modules/strip-bom/package.json
@@ -1,42 +1,40 @@
 {
-	"name": "strip-bom",
-	"version": "4.0.0",
-	"description": "Strip UTF-8 byte order mark (BOM) from a string",
-	"license": "MIT",
-	"repository": "sindresorhus/strip-bom",
-	"author": {
-		"name": "Sindre Sorhus",
-		"email": "sindresorhus@gmail.com",
-		"url": "sindresorhus.com"
-	},
-	"engines": {
-		"node": ">=8"
-	},
-	"scripts": {
-		"test": "xo && ava && tsd"
-	},
-	"files": [
-		"index.js",
-		"index.d.ts"
-	],
-	"keywords": [
-		"strip",
-		"bom",
-		"byte",
-		"order",
-		"mark",
-		"unicode",
-		"utf8",
-		"utf-8",
-		"remove",
-		"delete",
-		"trim",
-		"text",
-		"string"
-	],
-	"devDependencies": {
-		"ava": "^1.4.1",
-		"tsd": "^0.7.2",
-		"xo": "^0.24.0"
-	}
+  "name": "strip-bom",
+  "version": "3.0.0",
+  "description": "Strip UTF-8 byte order mark (BOM) from a string",
+  "license": "MIT",
+  "repository": "sindresorhus/strip-bom",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "files": [
+    "index.js"
+  ],
+  "keywords": [
+    "strip",
+    "bom",
+    "byte",
+    "order",
+    "mark",
+    "unicode",
+    "utf8",
+    "utf-8",
+    "remove",
+    "delete",
+    "trim",
+    "text",
+    "string"
+  ],
+  "devDependencies": {
+    "ava": "*",
+    "xo": "*"
+  }
 }
diff --git a/node_modules/strip-bom/readme.md b/node_modules/strip-bom/readme.md
index e826851..812a980 100644
--- a/node_modules/strip-bom/readme.md
+++ b/node_modules/strip-bom/readme.md
@@ -1,29 +1,16 @@
 # strip-bom [![Build Status](https://travis-ci.org/sindresorhus/strip-bom.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-bom)
 
-> Strip UTF-8 [byte order mark](https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8) (BOM) from a string
+> Strip UTF-8 [byte order mark](http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8) (BOM) from a string
 
 From Wikipedia:
 
 > The Unicode Standard permits the BOM in UTF-8, but does not require nor recommend its use. Byte order has no meaning in UTF-8.
 
----
-
-<div align="center">
-	<b>
-		<a href="https://tidelift.com/subscription/pkg/npm-strip-bom?utm_source=npm-strip-bom&utm_medium=referral&utm_campaign=readme">Get professional support for 'strip-bom' with a Tidelift subscription</a>
-	</b>
-	<br>
-	<sub>
-		Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
-	</sub>
-</div>
-
----
 
 ## Install
 
 ```
-$ npm install strip-bom
+$ npm install --save strip-bom
 ```
 
 
@@ -37,11 +24,6 @@
 ```
 
 
-## Security
-
-To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure.
-
-
 ## Related
 
 - [strip-bom-cli](https://github.com/sindresorhus/strip-bom-cli) - CLI for this module
diff --git a/node_modules/string-width/node_modules/emoji-regex/LICENSE-MIT.txt b/node_modules/table/node_modules/emoji-regex/LICENSE-MIT.txt
similarity index 100%
rename from node_modules/string-width/node_modules/emoji-regex/LICENSE-MIT.txt
rename to node_modules/table/node_modules/emoji-regex/LICENSE-MIT.txt
diff --git a/node_modules/table/node_modules/emoji-regex/README.md b/node_modules/table/node_modules/emoji-regex/README.md
new file mode 100644
index 0000000..37cf14e
--- /dev/null
+++ b/node_modules/table/node_modules/emoji-regex/README.md
@@ -0,0 +1,73 @@
+# emoji-regex [![Build status](https://travis-ci.org/mathiasbynens/emoji-regex.svg?branch=master)](https://travis-ci.org/mathiasbynens/emoji-regex)
+
+_emoji-regex_ offers a regular expression to match all emoji symbols (including textual representations of emoji) as per the Unicode Standard.
+
+This repository contains a script that generates this regular expression based on [the data from Unicode Technical Report #51](https://github.com/mathiasbynens/unicode-tr51). Because of this, the regular expression can easily be updated whenever new emoji are added to the Unicode standard.
+
+## Installation
+
+Via [npm](https://www.npmjs.com/):
+
+```bash
+npm install emoji-regex
+```
+
+In [Node.js](https://nodejs.org/):
+
+```js
+const emojiRegex = require('emoji-regex');
+// Note: because the regular expression has the global flag set, this module
+// exports a function that returns the regex rather than exporting the regular
+// expression itself, to make it impossible to (accidentally) mutate the
+// original regular expression.
+
+const text = `
+\u{231A}: ⌚ default emoji presentation character (Emoji_Presentation)
+\u{2194}\u{FE0F}: ↔️ default text presentation character rendered as emoji
+\u{1F469}: 👩 emoji modifier base (Emoji_Modifier_Base)
+\u{1F469}\u{1F3FF}: 👩🏿 emoji modifier base followed by a modifier
+`;
+
+const regex = emojiRegex();
+let match;
+while (match = regex.exec(text)) {
+  const emoji = match[0];
+  console.log(`Matched sequence ${ emoji } — code points: ${ [...emoji].length }`);
+}
+```
+
+Console output:
+
+```
+Matched sequence ⌚ — code points: 1
+Matched sequence ⌚ — code points: 1
+Matched sequence ↔️ — code points: 2
+Matched sequence ↔️ — code points: 2
+Matched sequence 👩 — code points: 1
+Matched sequence 👩 — code points: 1
+Matched sequence 👩🏿 — code points: 2
+Matched sequence 👩🏿 — code points: 2
+```
+
+To match emoji in their textual representation as well (i.e. emoji that are not `Emoji_Presentation` symbols and that aren’t forced to render as emoji by a variation selector), `require` the other regex:
+
+```js
+const emojiRegex = require('emoji-regex/text.js');
+```
+
+Additionally, in environments which support ES2015 Unicode escapes, you may `require` ES2015-style versions of the regexes:
+
+```js
+const emojiRegex = require('emoji-regex/es2015/index.js');
+const emojiRegexText = require('emoji-regex/es2015/text.js');
+```
+
+## Author
+
+| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") |
+|---|
+| [Mathias Bynens](https://mathiasbynens.be/) |
+
+## License
+
+_emoji-regex_ is available under the [MIT](https://mths.be/mit) license.
diff --git a/node_modules/table/node_modules/emoji-regex/es2015/index.js b/node_modules/table/node_modules/emoji-regex/es2015/index.js
new file mode 100644
index 0000000..0216db9
--- /dev/null
+++ b/node_modules/table/node_modules/emoji-regex/es2015/index.js
@@ -0,0 +1,6 @@
+"use strict";
+
+module.exports = () => {
+  // https://mths.be/emoji
+  return /\u{1F3F4}(?:\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074})\u{E007F}|\u200D\u2620\uFE0F)|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F468}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u{1F468}(?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F469}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F468}(?:\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|[\u{1F3FB}-\u{1F3FF}])|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u{1F469}\u200D\u{1F466}|\u{1F1F6}\u{1F1E6}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9D1}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]\uFE0F|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F469}\u{1F46E}\u{1F470}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9D1}-\u{1F9DD}]/gu;
+};
diff --git a/node_modules/table/node_modules/emoji-regex/es2015/text.js b/node_modules/table/node_modules/emoji-regex/es2015/text.js
new file mode 100644
index 0000000..d0a771d
--- /dev/null
+++ b/node_modules/table/node_modules/emoji-regex/es2015/text.js
@@ -0,0 +1,6 @@
+"use strict";
+
+module.exports = () => {
+  // https://mths.be/emoji
+  return /\u{1F3F4}(?:\u{E0067}\u{E0062}(?:\u{E0065}\u{E006E}\u{E0067}|\u{E0077}\u{E006C}\u{E0073}|\u{E0073}\u{E0063}\u{E0074})\u{E007F}|\u200D\u2620\uFE0F)|\u{1F469}\u200D\u{1F469}\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F468}(?:\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D)?\u{1F468}|[\u{1F468}\u{1F469}]\u200D(?:\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}])|\u{1F466}\u200D\u{1F466}|\u{1F467}\u200D[\u{1F466}\u{1F467}]|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D(?:\u2764\uFE0F\u200D(?:\u{1F48B}\u200D[\u{1F468}\u{1F469}]|[\u{1F468}\u{1F469}])|[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}])|\u{1F469}\u200D\u{1F466}\u200D\u{1F466}|(?:\u{1F441}\uFE0F\u200D\u{1F5E8}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u{1F468}(?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}]\uFE0F|[\u{1F46F}\u{1F93C}\u{1F9DE}\u{1F9DF}])\u200D[\u2640\u2642]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}](?:[\u{1F3FB}-\u{1F3FF}]\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\u{1F469}\u200D[\u2695\u2696\u2708])\uFE0F|\u{1F469}\u200D\u{1F467}\u200D[\u{1F466}\u{1F467}]|\u{1F469}\u200D\u{1F469}\u200D[\u{1F466}\u{1F467}]|\u{1F468}(?:\u200D(?:[\u{1F468}\u{1F469}]\u200D[\u{1F466}\u{1F467}]|[\u{1F466}\u{1F467}])|[\u{1F3FB}-\u{1F3FF}])|\u{1F3F3}\uFE0F\u200D\u{1F308}|\u{1F469}\u200D\u{1F467}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]\u200D[\u{1F33E}\u{1F373}\u{1F393}\u{1F3A4}\u{1F3A8}\u{1F3EB}\u{1F3ED}\u{1F4BB}\u{1F4BC}\u{1F527}\u{1F52C}\u{1F680}\u{1F692}\u{1F9B0}-\u{1F9B3}]|\u{1F469}\u200D\u{1F466}|\u{1F1F6}\u{1F1E6}|\u{1F1FD}\u{1F1F0}|\u{1F1F4}\u{1F1F2}|\u{1F469}[\u{1F3FB}-\u{1F3FF}]|\u{1F1ED}[\u{1F1F0}\u{1F1F2}\u{1F1F3}\u{1F1F7}\u{1F1F9}\u{1F1FA}]|\u{1F1EC}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EE}\u{1F1F1}-\u{1F1F3}\u{1F1F5}-\u{1F1FA}\u{1F1FC}\u{1F1FE}]|\u{1F1EA}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1ED}\u{1F1F7}-\u{1F1FA}]|\u{1F1E8}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1EE}\u{1F1F0}-\u{1F1F5}\u{1F1F7}\u{1F1FA}-\u{1F1FF}]|\u{1F1F2}[\u{1F1E6}\u{1F1E8}-\u{1F1ED}\u{1F1F0}-\u{1F1FF}]|\u{1F1F3}[\u{1F1E6}\u{1F1E8}\u{1F1EA}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F4}\u{1F1F5}\u{1F1F7}\u{1F1FA}\u{1F1FF}]|\u{1F1FC}[\u{1F1EB}\u{1F1F8}]|\u{1F1FA}[\u{1F1E6}\u{1F1EC}\u{1F1F2}\u{1F1F3}\u{1F1F8}\u{1F1FE}\u{1F1FF}]|\u{1F1F0}[\u{1F1EA}\u{1F1EC}-\u{1F1EE}\u{1F1F2}\u{1F1F3}\u{1F1F5}\u{1F1F7}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|\u{1F1EF}[\u{1F1EA}\u{1F1F2}\u{1F1F4}\u{1F1F5}]|\u{1F1F8}[\u{1F1E6}-\u{1F1EA}\u{1F1EC}-\u{1F1F4}\u{1F1F7}-\u{1F1F9}\u{1F1FB}\u{1F1FD}-\u{1F1FF}]|\u{1F1EE}[\u{1F1E8}-\u{1F1EA}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}]|\u{1F1FF}[\u{1F1E6}\u{1F1F2}\u{1F1FC}]|\u{1F1EB}[\u{1F1EE}-\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1F7}]|\u{1F1F5}[\u{1F1E6}\u{1F1EA}-\u{1F1ED}\u{1F1F0}-\u{1F1F3}\u{1F1F7}-\u{1F1F9}\u{1F1FC}\u{1F1FE}]|\u{1F1E9}[\u{1F1EA}\u{1F1EC}\u{1F1EF}\u{1F1F0}\u{1F1F2}\u{1F1F4}\u{1F1FF}]|\u{1F1F9}[\u{1F1E6}\u{1F1E8}\u{1F1E9}\u{1F1EB}-\u{1F1ED}\u{1F1EF}-\u{1F1F4}\u{1F1F7}\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FF}]|\u{1F1E7}[\u{1F1E6}\u{1F1E7}\u{1F1E9}-\u{1F1EF}\u{1F1F1}-\u{1F1F4}\u{1F1F6}-\u{1F1F9}\u{1F1FB}\u{1F1FC}\u{1F1FE}\u{1F1FF}]|[#\*0-9]\uFE0F\u20E3|\u{1F1F1}[\u{1F1E6}-\u{1F1E8}\u{1F1EE}\u{1F1F0}\u{1F1F7}-\u{1F1FB}\u{1F1FE}]|\u{1F1E6}[\u{1F1E8}-\u{1F1EC}\u{1F1EE}\u{1F1F1}\u{1F1F2}\u{1F1F4}\u{1F1F6}-\u{1F1FA}\u{1F1FC}\u{1F1FD}\u{1F1FF}]|\u{1F1F7}[\u{1F1EA}\u{1F1F4}\u{1F1F8}\u{1F1FA}\u{1F1FC}]|\u{1F1FB}[\u{1F1E6}\u{1F1E8}\u{1F1EA}\u{1F1EC}\u{1F1EE}\u{1F1F3}\u{1F1FA}]|\u{1F1FE}[\u{1F1EA}\u{1F1F9}]|[\u{1F3C3}\u{1F3C4}\u{1F3CA}\u{1F46E}\u{1F471}\u{1F473}\u{1F477}\u{1F481}\u{1F482}\u{1F486}\u{1F487}\u{1F645}-\u{1F647}\u{1F64B}\u{1F64D}\u{1F64E}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F926}\u{1F937}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B8}\u{1F9B9}\u{1F9D6}-\u{1F9DD}][\u{1F3FB}-\u{1F3FF}]|[\u26F9\u{1F3CB}\u{1F3CC}\u{1F575}][\u{1F3FB}-\u{1F3FF}]|[\u261D\u270A-\u270D\u{1F385}\u{1F3C2}\u{1F3C7}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}\u{1F467}\u{1F470}\u{1F472}\u{1F474}-\u{1F476}\u{1F478}\u{1F47C}\u{1F483}\u{1F485}\u{1F4AA}\u{1F574}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F64C}\u{1F64F}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F930}-\u{1F936}\u{1F9B5}\u{1F9B6}\u{1F9D1}-\u{1F9D5}][\u{1F3FB}-\u{1F3FF}]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55\u{1F004}\u{1F0CF}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F236}\u{1F238}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F320}\u{1F32D}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F37E}-\u{1F393}\u{1F3A0}-\u{1F3CA}\u{1F3CF}-\u{1F3D3}\u{1F3E0}-\u{1F3F0}\u{1F3F4}\u{1F3F8}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4FC}\u{1F4FF}-\u{1F53D}\u{1F54B}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F57A}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5FB}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CC}\u{1F6D0}-\u{1F6D2}\u{1F6EB}\u{1F6EC}\u{1F6F4}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]|[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299\u{1F004}\u{1F0CF}\u{1F170}\u{1F171}\u{1F17E}\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E6}-\u{1F1FF}\u{1F201}\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}\u{1F251}\u{1F300}-\u{1F321}\u{1F324}-\u{1F393}\u{1F396}\u{1F397}\u{1F399}-\u{1F39B}\u{1F39E}-\u{1F3F0}\u{1F3F3}-\u{1F3F5}\u{1F3F7}-\u{1F4FD}\u{1F4FF}-\u{1F53D}\u{1F549}-\u{1F54E}\u{1F550}-\u{1F567}\u{1F56F}\u{1F570}\u{1F573}-\u{1F57A}\u{1F587}\u{1F58A}-\u{1F58D}\u{1F590}\u{1F595}\u{1F596}\u{1F5A4}\u{1F5A5}\u{1F5A8}\u{1F5B1}\u{1F5B2}\u{1F5BC}\u{1F5C2}-\u{1F5C4}\u{1F5D1}-\u{1F5D3}\u{1F5DC}-\u{1F5DE}\u{1F5E1}\u{1F5E3}\u{1F5E8}\u{1F5EF}\u{1F5F3}\u{1F5FA}-\u{1F64F}\u{1F680}-\u{1F6C5}\u{1F6CB}-\u{1F6D2}\u{1F6E0}-\u{1F6E5}\u{1F6E9}\u{1F6EB}\u{1F6EC}\u{1F6F0}\u{1F6F3}-\u{1F6F9}\u{1F910}-\u{1F93A}\u{1F93C}-\u{1F93E}\u{1F940}-\u{1F945}\u{1F947}-\u{1F970}\u{1F973}-\u{1F976}\u{1F97A}\u{1F97C}-\u{1F9A2}\u{1F9B0}-\u{1F9B9}\u{1F9C0}-\u{1F9C2}\u{1F9D0}-\u{1F9FF}]\uFE0F?|[\u261D\u26F9\u270A-\u270D\u{1F385}\u{1F3C2}-\u{1F3C4}\u{1F3C7}\u{1F3CA}-\u{1F3CC}\u{1F442}\u{1F443}\u{1F446}-\u{1F450}\u{1F466}-\u{1F469}\u{1F46E}\u{1F470}-\u{1F478}\u{1F47C}\u{1F481}-\u{1F483}\u{1F485}-\u{1F487}\u{1F4AA}\u{1F574}\u{1F575}\u{1F57A}\u{1F590}\u{1F595}\u{1F596}\u{1F645}-\u{1F647}\u{1F64B}-\u{1F64F}\u{1F6A3}\u{1F6B4}-\u{1F6B6}\u{1F6C0}\u{1F6CC}\u{1F918}-\u{1F91C}\u{1F91E}\u{1F91F}\u{1F926}\u{1F930}-\u{1F939}\u{1F93D}\u{1F93E}\u{1F9B5}\u{1F9B6}\u{1F9B8}\u{1F9B9}\u{1F9D1}-\u{1F9DD}]/gu;
+};
diff --git a/node_modules/table/node_modules/emoji-regex/index.d.ts b/node_modules/table/node_modules/emoji-regex/index.d.ts
new file mode 100644
index 0000000..2c317cd
--- /dev/null
+++ b/node_modules/table/node_modules/emoji-regex/index.d.ts
@@ -0,0 +1,5 @@
+declare module 'emoji-regex' {
+    function emojiRegex(): RegExp;
+
+    export default emojiRegex;
+}
diff --git a/node_modules/table/node_modules/emoji-regex/index.js b/node_modules/table/node_modules/emoji-regex/index.js
new file mode 100644
index 0000000..e2237a4
--- /dev/null
+++ b/node_modules/table/node_modules/emoji-regex/index.js
@@ -0,0 +1,6 @@
+"use strict";
+
+module.exports = function () {
+  // https://mths.be/emoji
+  return /\uD83C\uDFF4(?:\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74)\uDB40\uDC7F|\u200D\u2620\uFE0F)|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC68(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3]))|\uD83D\uDC69\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\uD83D\uDC68(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83D\uDC69\u200D[\u2695\u2696\u2708])\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC68(?:\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDD1-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC69\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD26\uDD30-\uDD39\uDD3D\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDD1-\uDDDD])/g;
+};
diff --git a/node_modules/table/node_modules/emoji-regex/package.json b/node_modules/table/node_modules/emoji-regex/package.json
new file mode 100644
index 0000000..ed68e52
--- /dev/null
+++ b/node_modules/table/node_modules/emoji-regex/package.json
@@ -0,0 +1,51 @@
+{
+  "name": "emoji-regex",
+  "version": "7.0.3",
+  "description": "A regular expression to match all Emoji-only symbols as per the Unicode Standard.",
+  "homepage": "https://mths.be/emoji-regex",
+  "main": "index.js",
+  "types": "index.d.ts",
+  "keywords": [
+    "unicode",
+    "regex",
+    "regexp",
+    "regular expressions",
+    "code points",
+    "symbols",
+    "characters",
+    "emoji"
+  ],
+  "license": "MIT",
+  "author": {
+    "name": "Mathias Bynens",
+    "url": "https://mathiasbynens.be/"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/mathiasbynens/emoji-regex.git"
+  },
+  "bugs": "https://github.com/mathiasbynens/emoji-regex/issues",
+  "files": [
+    "LICENSE-MIT.txt",
+    "index.js",
+    "index.d.ts",
+    "text.js",
+    "es2015/index.js",
+    "es2015/text.js"
+  ],
+  "scripts": {
+    "build": "rm -rf -- es2015; babel src -d .; NODE_ENV=es2015 babel src -d ./es2015; node script/inject-sequences.js",
+    "test": "mocha",
+    "test:watch": "npm run test -- --watch"
+  },
+  "devDependencies": {
+    "@babel/cli": "^7.0.0",
+    "@babel/core": "^7.0.0",
+    "@babel/plugin-proposal-unicode-property-regex": "^7.0.0",
+    "@babel/preset-env": "^7.0.0",
+    "mocha": "^5.2.0",
+    "regexgen": "^1.3.0",
+    "unicode-11.0.0": "^0.7.7",
+    "unicode-tr51": "^9.0.1"
+  }
+}
diff --git a/node_modules/table/node_modules/emoji-regex/text.js b/node_modules/table/node_modules/emoji-regex/text.js
new file mode 100644
index 0000000..199ae3b
--- /dev/null
+++ b/node_modules/table/node_modules/emoji-regex/text.js
@@ -0,0 +1,6 @@
+"use strict";
+
+module.exports = function () {
+  // https://mths.be/emoji
+  return /\uD83C\uDFF4(?:\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74)\uDB40\uDC7F|\u200D\u2620\uFE0F)|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC68(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3]))|\uD83D\uDC69\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\uD83D\uDC68(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83D\uDC69\u200D[\u2695\u2696\u2708])\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC68(?:\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDB0-\uDDB3])|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDD1-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEF9]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD70\uDD73-\uDD76\uDD7A\uDD7C-\uDDA2\uDDB0-\uDDB9\uDDC0-\uDDC2\uDDD0-\uDDFF])\uFE0F?|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC69\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD26\uDD30-\uDD39\uDD3D\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDD1-\uDDDD])/g;
+};
diff --git a/node_modules/through/.travis.yml b/node_modules/through/.travis.yml
deleted file mode 100644
index c693a93..0000000
--- a/node_modules/through/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-node_js:
-  - 0.6
-  - 0.8
-  - "0.10"
diff --git a/node_modules/through/LICENSE.APACHE2 b/node_modules/through/LICENSE.APACHE2
deleted file mode 100644
index 6366c04..0000000
--- a/node_modules/through/LICENSE.APACHE2
+++ /dev/null
@@ -1,15 +0,0 @@
-Apache License, Version 2.0
-
-Copyright (c) 2011 Dominic Tarr
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
diff --git a/node_modules/through/LICENSE.MIT b/node_modules/through/LICENSE.MIT
deleted file mode 100644
index 6eafbd7..0000000
--- a/node_modules/through/LICENSE.MIT
+++ /dev/null
@@ -1,24 +0,0 @@
-The MIT License
-
-Copyright (c) 2011 Dominic Tarr
-
-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/node_modules/through/index.js b/node_modules/through/index.js
deleted file mode 100644
index ca5fc59..0000000
--- a/node_modules/through/index.js
+++ /dev/null
@@ -1,108 +0,0 @@
-var Stream = require('stream')
-
-// through
-//
-// a stream that does nothing but re-emit the input.
-// useful for aggregating a series of changing but not ending streams into one stream)
-
-exports = module.exports = through
-through.through = through
-
-//create a readable writable stream.
-
-function through (write, end, opts) {
-  write = write || function (data) { this.queue(data) }
-  end = end || function () { this.queue(null) }
-
-  var ended = false, destroyed = false, buffer = [], _ended = false
-  var stream = new Stream()
-  stream.readable = stream.writable = true
-  stream.paused = false
-
-//  stream.autoPause   = !(opts && opts.autoPause   === false)
-  stream.autoDestroy = !(opts && opts.autoDestroy === false)
-
-  stream.write = function (data) {
-    write.call(this, data)
-    return !stream.paused
-  }
-
-  function drain() {
-    while(buffer.length && !stream.paused) {
-      var data = buffer.shift()
-      if(null === data)
-        return stream.emit('end')
-      else
-        stream.emit('data', data)
-    }
-  }
-
-  stream.queue = stream.push = function (data) {
-//    console.error(ended)
-    if(_ended) return stream
-    if(data === null) _ended = true
-    buffer.push(data)
-    drain()
-    return stream
-  }
-
-  //this will be registered as the first 'end' listener
-  //must call destroy next tick, to make sure we're after any
-  //stream piped from here.
-  //this is only a problem if end is not emitted synchronously.
-  //a nicer way to do this is to make sure this is the last listener for 'end'
-
-  stream.on('end', function () {
-    stream.readable = false
-    if(!stream.writable && stream.autoDestroy)
-      process.nextTick(function () {
-        stream.destroy()
-      })
-  })
-
-  function _end () {
-    stream.writable = false
-    end.call(stream)
-    if(!stream.readable && stream.autoDestroy)
-      stream.destroy()
-  }
-
-  stream.end = function (data) {
-    if(ended) return
-    ended = true
-    if(arguments.length) stream.write(data)
-    _end() // will emit or queue
-    return stream
-  }
-
-  stream.destroy = function () {
-    if(destroyed) return
-    destroyed = true
-    ended = true
-    buffer.length = 0
-    stream.writable = stream.readable = false
-    stream.emit('close')
-    return stream
-  }
-
-  stream.pause = function () {
-    if(stream.paused) return
-    stream.paused = true
-    return stream
-  }
-
-  stream.resume = function () {
-    if(stream.paused) {
-      stream.paused = false
-      stream.emit('resume')
-    }
-    drain()
-    //may have become paused again,
-    //as drain emits 'data'.
-    if(!stream.paused)
-      stream.emit('drain')
-    return stream
-  }
-  return stream
-}
-
diff --git a/node_modules/through/package.json b/node_modules/through/package.json
deleted file mode 100644
index 9862189..0000000
--- a/node_modules/through/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "name": "through",
-  "version": "2.3.8",
-  "description": "simplified stream construction",
-  "main": "index.js",
-  "scripts": {
-    "test": "set -e; for t in test/*.js; do node $t; done"
-  },
-  "devDependencies": {
-    "stream-spec": "~0.3.5",
-    "tape": "~2.3.2",
-    "from": "~0.1.3"
-  },
-  "keywords": [
-    "stream",
-    "streams",
-    "user-streams",
-    "pipe"
-  ],
-  "author": "Dominic Tarr <dominic.tarr@gmail.com> (dominictarr.com)",
-  "license": "MIT",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/dominictarr/through.git"
-  },
-  "homepage": "https://github.com/dominictarr/through",
-  "testling": {
-    "browsers": [
-      "ie/8..latest",
-      "ff/15..latest",
-      "chrome/20..latest",
-      "safari/5.1..latest"
-    ],
-    "files": "test/*.js"
-  }
-}
diff --git a/node_modules/through/readme.markdown b/node_modules/through/readme.markdown
deleted file mode 100644
index cb34c81..0000000
--- a/node_modules/through/readme.markdown
+++ /dev/null
@@ -1,64 +0,0 @@
-#through
-
-[![build status](https://secure.travis-ci.org/dominictarr/through.png)](http://travis-ci.org/dominictarr/through)
-[![testling badge](https://ci.testling.com/dominictarr/through.png)](https://ci.testling.com/dominictarr/through)
-
-Easy way to create a `Stream` that is both `readable` and `writable`. 
-
-* Pass in optional `write` and `end` methods.
-* `through` takes care of pause/resume logic if you use `this.queue(data)` instead of `this.emit('data', data)`.
-* Use `this.pause()` and `this.resume()` to manage flow.
-* Check `this.paused` to see current flow state. (`write` always returns `!this.paused`).
-
-This function is the basis for most of the synchronous streams in 
-[event-stream](http://github.com/dominictarr/event-stream).
-
-``` js
-var through = require('through')
-
-through(function write(data) {
-    this.queue(data) //data *must* not be null
-  },
-  function end () { //optional
-    this.queue(null)
-  })
-```
-
-Or, can also be used _without_ buffering on pause, use `this.emit('data', data)`,
-and this.emit('end')
-
-``` js
-var through = require('through')
-
-through(function write(data) {
-    this.emit('data', data)
-    //this.pause() 
-  },
-  function end () { //optional
-    this.emit('end')
-  })
-```
-
-## Extended Options
-
-You will probably not need these 99% of the time.
-
-### autoDestroy=false
-
-By default, `through` emits close when the writable
-and readable side of the stream has ended.
-If that is not desired, set `autoDestroy=false`.
-
-``` js
-var through = require('through')
-
-//like this
-var ts = through(write, end, {autoDestroy: false})
-//or like this
-var ts = through(write, end)
-ts.autoDestroy = false
-```
-
-## License
-
-MIT / Apache2
diff --git a/node_modules/through/test/async.js b/node_modules/through/test/async.js
deleted file mode 100644
index 46bdbae..0000000
--- a/node_modules/through/test/async.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var from = require('from')
-var through = require('../')
-
-var tape = require('tape')
-
-tape('simple async example', function (t) {
- 
-  var n = 0, expected = [1,2,3,4,5], actual = []
-  from(expected)
-  .pipe(through(function(data) {
-    this.pause()
-    n ++
-    setTimeout(function(){
-      console.log('pushing data', data)
-      this.push(data)
-      this.resume()
-    }.bind(this), 300)
-  })).pipe(through(function(data) {
-    console.log('pushing data second time', data);
-    this.push(data)
-  })).on('data', function (d) {
-    actual.push(d)
-  }).on('end', function() {
-    t.deepEqual(actual, expected)
-    t.end()
-  })
-
-})
diff --git a/node_modules/through/test/auto-destroy.js b/node_modules/through/test/auto-destroy.js
deleted file mode 100644
index 9a8fd00..0000000
--- a/node_modules/through/test/auto-destroy.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var test = require('tape')
-var through = require('../')
-
-// must emit end before close.
-
-test('end before close', function (assert) {
-  var ts = through()
-  ts.autoDestroy = false
-  var ended = false, closed = false
-
-  ts.on('end', function () {
-    assert.ok(!closed)
-    ended = true
-  })
-  ts.on('close', function () {
-    assert.ok(ended)
-    closed = true
-  })
-
-  ts.write(1)
-  ts.write(2)
-  ts.write(3)
-  ts.end()
-  assert.ok(ended)
-  assert.notOk(closed)
-  ts.destroy()
-  assert.ok(closed)
-  assert.end()
-})
-
diff --git a/node_modules/through/test/buffering.js b/node_modules/through/test/buffering.js
deleted file mode 100644
index b0084bf..0000000
--- a/node_modules/through/test/buffering.js
+++ /dev/null
@@ -1,71 +0,0 @@
-var test = require('tape')
-var through = require('../')
-
-// must emit end before close.
-
-test('buffering', function(assert) {
-  var ts = through(function (data) {
-    this.queue(data)
-  }, function () {
-    this.queue(null)
-  })
-
-  var ended = false,  actual = []
-
-  ts.on('data', actual.push.bind(actual))
-  ts.on('end', function () {
-    ended = true
-  })
-
-  ts.write(1)
-  ts.write(2)
-  ts.write(3)
-  assert.deepEqual(actual, [1, 2, 3])
-  ts.pause()
-  ts.write(4)
-  ts.write(5)
-  ts.write(6)
-  assert.deepEqual(actual, [1, 2, 3])
-  ts.resume()
-  assert.deepEqual(actual, [1, 2, 3, 4, 5, 6])
-  ts.pause()
-  ts.end()
-  assert.ok(!ended)
-  ts.resume()
-  assert.ok(ended)
-  assert.end()
-})
-
-test('buffering has data in queue, when ends', function (assert) {
-
-  /*
-   * If stream ends while paused with data in the queue,
-   * stream should still emit end after all data is written
-   * on resume.
-   */
-
-  var ts = through(function (data) {
-    this.queue(data)
-  }, function () {
-    this.queue(null)
-  })
-
-  var ended = false,  actual = []
-
-  ts.on('data', actual.push.bind(actual))
-  ts.on('end', function () {
-    ended = true
-  })
-
-  ts.pause()
-  ts.write(1)
-  ts.write(2)
-  ts.write(3)
-  ts.end()
-  assert.deepEqual(actual, [], 'no data written yet, still paused')
-  assert.ok(!ended, 'end not emitted yet, still paused')
-  ts.resume()
-  assert.deepEqual(actual, [1, 2, 3], 'resumed, all data should be delivered')
-  assert.ok(ended, 'end should be emitted once all data was delivered')
-  assert.end();
-})
diff --git a/node_modules/through/test/end.js b/node_modules/through/test/end.js
deleted file mode 100644
index fa113f5..0000000
--- a/node_modules/through/test/end.js
+++ /dev/null
@@ -1,45 +0,0 @@
-var test = require('tape')
-var through = require('../')
-
-// must emit end before close.
-
-test('end before close', function (assert) {
-  var ts = through()
-  var ended = false, closed = false
-
-  ts.on('end', function () {
-    assert.ok(!closed)
-    ended = true
-  })
-  ts.on('close', function () {
-    assert.ok(ended)
-    closed = true
-  })
-
-  ts.write(1)
-  ts.write(2)
-  ts.write(3)
-  ts.end()
-  assert.ok(ended)
-  assert.ok(closed)
-  assert.end()
-})
-
-test('end only once', function (t) {
-
-  var ts = through()
-  var ended = false, closed = false
-
-  ts.on('end', function () {
-    t.equal(ended, false)
-    ended = true
-  })
-
-  ts.queue(null)
-  ts.queue(null)
-  ts.queue(null)
-
-  ts.resume()
-
-  t.end()
-})
diff --git a/node_modules/through/test/index.js b/node_modules/through/test/index.js
deleted file mode 100644
index 96da82f..0000000
--- a/node_modules/through/test/index.js
+++ /dev/null
@@ -1,133 +0,0 @@
-
-var test = require('tape')
-var spec = require('stream-spec')
-var through = require('../')
-
-/*
-  I'm using these two functions, and not streams and pipe
-  so there is less to break. if this test fails it must be
-  the implementation of _through_
-*/
-
-function write(array, stream) {
-  array = array.slice()
-  function next() {
-    while(array.length)
-      if(stream.write(array.shift()) === false)
-        return stream.once('drain', next)
-    
-    stream.end()
-  }
-
-  next()
-}
-
-function read(stream, callback) {
-  var actual = []
-  stream.on('data', function (data) {
-    actual.push(data)
-  })
-  stream.once('end', function () {
-    callback(null, actual)
-  })
-  stream.once('error', function (err) {
-    callback(err)
-  })
-}
-
-test('simple defaults', function(assert) {
-
-  var l = 1000
-    , expected = []
-
-  while(l--) expected.push(l * Math.random())
-
-  var t = through()
-  var s = spec(t).through().pausable()
-
-  read(t, function (err, actual) {
-    assert.ifError(err)
-    assert.deepEqual(actual, expected)
-    assert.end()
-  })
-
-  t.on('close', s.validate)
-
-  write(expected, t)
-});
-
-test('simple functions', function(assert) {
-
-  var l = 1000
-    , expected = [] 
-
-  while(l--) expected.push(l * Math.random())
-
-  var t = through(function (data) {
-      this.emit('data', data*2)
-    }) 
-  var s = spec(t).through().pausable()
-      
-
-  read(t, function (err, actual) {
-    assert.ifError(err)
-    assert.deepEqual(actual, expected.map(function (data) {
-      return data*2
-    }))
-    assert.end()
-  })
-
-  t.on('close', s.validate)
-
-  write(expected, t)
-})
-
-test('pauses', function(assert) {
-
-  var l = 1000
-    , expected = [] 
-
-  while(l--) expected.push(l) //Math.random())
-
-  var t = through()    
- 
-  var s = spec(t)
-      .through()
-      .pausable()
-
-  t.on('data', function () {
-    if(Math.random() > 0.1) return
-    t.pause()
-    process.nextTick(function () {
-      t.resume()
-    })
-  })
-
-  read(t, function (err, actual) {
-    assert.ifError(err)
-    assert.deepEqual(actual, expected)
-  })
-
-  t.on('close', function () {
-    s.validate()
-    assert.end()
-  })
-
-  write(expected, t)
-})
-
-test('does not soft-end on `undefined`', function(assert) {
-  var stream = through()
-    , count = 0
-
-  stream.on('data', function (data) {
-    count++
-  })
-
-  stream.write(undefined)
-  stream.write(undefined)
-
-  assert.equal(count, 2)
-
-  assert.end()
-})
diff --git a/node_modules/tmp/LICENSE b/node_modules/tmp/LICENSE
deleted file mode 100644
index 72418bd..0000000
--- a/node_modules/tmp/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 KARASZI István
-
-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/node_modules/tmp/README.md b/node_modules/tmp/README.md
deleted file mode 100644
index 810b048..0000000
--- a/node_modules/tmp/README.md
+++ /dev/null
@@ -1,314 +0,0 @@
-# Tmp
-
-A simple temporary file and directory creator for [node.js.][1]
-
-[![Build Status](https://travis-ci.org/raszi/node-tmp.svg?branch=master)](https://travis-ci.org/raszi/node-tmp)
-[![Dependencies](https://david-dm.org/raszi/node-tmp.svg)](https://david-dm.org/raszi/node-tmp)
-[![npm version](https://badge.fury.io/js/tmp.svg)](https://badge.fury.io/js/tmp)
-[![API documented](https://img.shields.io/badge/API-documented-brightgreen.svg)](https://raszi.github.io/node-tmp/)
-[![Known Vulnerabilities](https://snyk.io/test/npm/tmp/badge.svg)](https://snyk.io/test/npm/tmp)
-
-## About
-
-This is a [widely used library][2] to create temporary files and directories
-in a [node.js][1] environment.
-
-Tmp offers both an asynchronous and a synchronous API. For all API calls, all
-the parameters are optional. There also exists a promisified version of the
-API, see (5) under references below.
-
-Tmp uses crypto for determining random file names, or, when using templates,
-a six letter random identifier. And just in case that you do not have that much
-entropy left on your system, Tmp will fall back to pseudo random numbers.
-
-You can set whether you want to remove the temporary file on process exit or
-not, and the destination directory can also be set.
-
-## How to install
-
-```bash
-npm install tmp
-```
-
-## Usage
-
-Please also check [API docs][4].
-
-### Asynchronous file creation
-
-Simple temporary file creation, the file will be closed and unlinked on process exit.
-
-```javascript
-var tmp = require('tmp');
-
-tmp.file(function _tempFileCreated(err, path, fd, cleanupCallback) {
-  if (err) throw err;
-
-  console.log('File: ', path);
-  console.log('Filedescriptor: ', fd);
-  
-  // If we don't need the file anymore we could manually call the cleanupCallback
-  // But that is not necessary if we didn't pass the keep option because the library
-  // will clean after itself.
-  cleanupCallback();
-});
-```
-
-### Synchronous file creation
-
-A synchronous version of the above.
-
-```javascript
-var tmp = require('tmp');
-
-var tmpobj = tmp.fileSync();
-console.log('File: ', tmpobj.name);
-console.log('Filedescriptor: ', tmpobj.fd);
-  
-// If we don't need the file anymore we could manually call the removeCallback
-// But that is not necessary if we didn't pass the keep option because the library
-// will clean after itself.
-tmpobj.removeCallback();
-```
-
-Note that this might throw an exception if either the maximum limit of retries
-for creating a temporary name fails, or, in case that you do not have the permission
-to write to the directory where the temporary file should be created in.
-
-### Asynchronous directory creation
-
-Simple temporary directory creation, it will be removed on process exit.
-
-If the directory still contains items on process exit, then it won't be removed.
-
-```javascript
-var tmp = require('tmp');
-
-tmp.dir(function _tempDirCreated(err, path, cleanupCallback) {
-  if (err) throw err;
-
-  console.log('Dir: ', path);
-  
-  // Manual cleanup
-  cleanupCallback();
-});
-```
-
-If you want to cleanup the directory even when there are entries in it, then
-you can pass the `unsafeCleanup` option when creating it.
-
-### Synchronous directory creation
-
-A synchronous version of the above.
-
-```javascript
-var tmp = require('tmp');
-
-var tmpobj = tmp.dirSync();
-console.log('Dir: ', tmpobj.name);
-// Manual cleanup
-tmpobj.removeCallback();
-```
-
-Note that this might throw an exception if either the maximum limit of retries
-for creating a temporary name fails, or, in case that you do not have the permission
-to write to the directory where the temporary directory should be created in.
-
-### Asynchronous filename generation
-
-It is possible with this library to generate a unique filename in the specified
-directory.
-
-```javascript
-var tmp = require('tmp');
-
-tmp.tmpName(function _tempNameGenerated(err, path) {
-    if (err) throw err;
-
-    console.log('Created temporary filename: ', path);
-});
-```
-
-### Synchronous filename generation
-
-A synchronous version of the above.
-
-```javascript
-var tmp = require('tmp');
-
-var name = tmp.tmpNameSync();
-console.log('Created temporary filename: ', name);
-```
-
-## Advanced usage
-
-### Asynchronous file creation
-
-Creates a file with mode `0644`, prefix will be `prefix-` and postfix will be `.txt`.
-
-```javascript
-var tmp = require('tmp');
-
-tmp.file({ mode: 0644, prefix: 'prefix-', postfix: '.txt' }, function _tempFileCreated(err, path, fd) {
-  if (err) throw err;
-
-  console.log('File: ', path);
-  console.log('Filedescriptor: ', fd);
-});
-```
-
-### Synchronous file creation
-
-A synchronous version of the above.
-
-```javascript
-var tmp = require('tmp');
-
-var tmpobj = tmp.fileSync({ mode: 0644, prefix: 'prefix-', postfix: '.txt' });
-console.log('File: ', tmpobj.name);
-console.log('Filedescriptor: ', tmpobj.fd);
-```
-
-### Controlling the Descriptor
-
-As a side effect of creating a unique file `tmp` gets a file descriptor that is
-returned to the user as the `fd` parameter.  The descriptor may be used by the
-application and is closed when the `removeCallback` is invoked.
-
-In some use cases the application does not need the descriptor, needs to close it
-without removing the file, or needs to remove the file without closing the
-descriptor.  Two options control how the descriptor is managed:
-
-* `discardDescriptor` - if `true` causes `tmp` to close the descriptor after the file
-  is created.  In this case the `fd` parameter is undefined.
-* `detachDescriptor` - if `true` causes `tmp` to return the descriptor in the `fd`
-  parameter, but it is the application's responsibility to close it when it is no
-  longer needed.
-
-```javascript
-var tmp = require('tmp');
-
-tmp.file({ discardDescriptor: true }, function _tempFileCreated(err, path, fd, cleanupCallback) {
-  if (err) throw err;
-  // fd will be undefined, allowing application to use fs.createReadStream(path)
-  // without holding an unused descriptor open.
-});
-```
-
-```javascript
-var tmp = require('tmp');
-
-tmp.file({ detachDescriptor: true }, function _tempFileCreated(err, path, fd, cleanupCallback) {
-  if (err) throw err;
-
-  cleanupCallback();
-  // Application can store data through fd here; the space used will automatically
-  // be reclaimed by the operating system when the descriptor is closed or program
-  // terminates.
-});
-```
-
-### Asynchronous directory creation
-
-Creates a directory with mode `0755`, prefix will be `myTmpDir_`.
-
-```javascript
-var tmp = require('tmp');
-
-tmp.dir({ mode: 0750, prefix: 'myTmpDir_' }, function _tempDirCreated(err, path) {
-  if (err) throw err;
-
-  console.log('Dir: ', path);
-});
-```
-
-### Synchronous directory creation
-
-Again, a synchronous version of the above.
-
-```javascript
-var tmp = require('tmp');
-
-var tmpobj = tmp.dirSync({ mode: 0750, prefix: 'myTmpDir_' });
-console.log('Dir: ', tmpobj.name);
-```
-
-### mkstemp like, asynchronously
-
-Creates a new temporary directory with mode `0700` and filename like `/tmp/tmp-nk2J1u`.
-
-```javascript
-var tmp = require('tmp');
-
-tmp.dir({ template: '/tmp/tmp-XXXXXX' }, function _tempDirCreated(err, path) {
-  if (err) throw err;
-
-  console.log('Dir: ', path);
-});
-```
-
-### mkstemp like, synchronously
-
-This will behave similarly to the asynchronous version.
-
-```javascript
-var tmp = require('tmp');
-
-var tmpobj = tmp.dirSync({ template: '/tmp/tmp-XXXXXX' });
-console.log('Dir: ', tmpobj.name);
-```
-
-### Asynchronous filename generation
-
-The `tmpName()` function accepts the `prefix`, `postfix`, `dir`, etc. parameters also:
-
-```javascript
-var tmp = require('tmp');
-
-tmp.tmpName({ template: '/tmp/tmp-XXXXXX' }, function _tempNameGenerated(err, path) {
-    if (err) throw err;
-
-    console.log('Created temporary filename: ', path);
-});
-```
-
-### Synchronous filename generation
-
-The `tmpNameSync()` function works similarly to `tmpName()`.
-
-```javascript
-var tmp = require('tmp');
-var tmpname = tmp.tmpNameSync({ template: '/tmp/tmp-XXXXXX' });
-console.log('Created temporary filename: ', tmpname);
-```
-
-## Graceful cleanup
-
-One may want to cleanup the temporary files even when an uncaught exception
-occurs. To enforce this, you can call the `setGracefulCleanup()` method:
-
-```javascript
-var tmp = require('tmp');
-
-tmp.setGracefulCleanup();
-```
-
-## Options
-
-All options are optional :)
-
-  * `mode`: the file mode to create with, it fallbacks to `0600` on file creation and `0700` on directory creation
-  * `prefix`: the optional prefix, fallbacks to `tmp-` if not provided
-  * `postfix`: the optional postfix, fallbacks to `.tmp` on file creation
-  * `template`: [`mkstemp`][3] like filename template, no default
-  * `dir`: the optional temporary directory, fallbacks to system default (guesses from environment)
-  * `tries`: how many times should the function try to get a unique filename before giving up, default `3`
-  * `keep`: signals that the temporary file or directory should not be deleted on exit, default is `false`, means delete
-    * Please keep in mind that it is recommended in this case to call the provided `cleanupCallback` function manually.
-  * `unsafeCleanup`: recursively removes the created temporary directory, even when it's not empty. default is `false`
-
-[1]: http://nodejs.org/
-[2]: https://www.npmjs.com/browse/depended/tmp
-[3]: http://www.kernel.org/doc/man-pages/online/pages/man3/mkstemp.3.html
-[4]: https://raszi.github.io/node-tmp/
-[5]: https://github.com/benjamingr/tmp-promise
diff --git a/node_modules/tmp/lib/tmp.js b/node_modules/tmp/lib/tmp.js
deleted file mode 100644
index 41b83db..0000000
--- a/node_modules/tmp/lib/tmp.js
+++ /dev/null
@@ -1,611 +0,0 @@
-/*!
- * Tmp
- *
- * Copyright (c) 2011-2017 KARASZI Istvan <github@spam.raszi.hu>
- *
- * MIT Licensed
- */
-
-/*
- * Module dependencies.
- */
-const fs = require('fs');
-const path = require('path');
-const crypto = require('crypto');
-const osTmpDir = require('os-tmpdir');
-const _c = process.binding('constants');
-
-/*
- * The working inner variables.
- */
-const
-  /**
-   * The temporary directory.
-   * @type {string}
-   */
-  tmpDir = osTmpDir(),
-
-  // the random characters to choose from
-  RANDOM_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
-
-  TEMPLATE_PATTERN = /XXXXXX/,
-
-  DEFAULT_TRIES = 3,
-
-  CREATE_FLAGS = (_c.O_CREAT || _c.fs.O_CREAT) | (_c.O_EXCL || _c.fs.O_EXCL) | (_c.O_RDWR || _c.fs.O_RDWR),
-
-  EBADF = _c.EBADF || _c.os.errno.EBADF,
-  ENOENT = _c.ENOENT || _c.os.errno.ENOENT,
-
-  DIR_MODE = 448 /* 0o700 */,
-  FILE_MODE = 384 /* 0o600 */,
-
-  // this will hold the objects need to be removed on exit
-  _removeObjects = [];
-
-var
-  _gracefulCleanup = false,
-  _uncaughtException = false;
-
-/**
- * Random name generator based on crypto.
- * Adapted from http://blog.tompawlak.org/how-to-generate-random-values-nodejs-javascript
- *
- * @param {number} howMany
- * @returns {string} the generated random name
- * @private
- */
-function _randomChars(howMany) {
-  var
-    value = [],
-    rnd = null;
-
-  // make sure that we do not fail because we ran out of entropy
-  try {
-    rnd = crypto.randomBytes(howMany);
-  } catch (e) {
-    rnd = crypto.pseudoRandomBytes(howMany);
-  }
-
-  for (var i = 0; i < howMany; i++) {
-    value.push(RANDOM_CHARS[rnd[i] % RANDOM_CHARS.length]);
-  }
-
-  return value.join('');
-}
-
-/**
- * Checks whether the `obj` parameter is defined or not.
- *
- * @param {Object} obj
- * @returns {boolean} true if the object is undefined
- * @private
- */
-function _isUndefined(obj) {
-  return typeof obj === 'undefined';
-}
-
-/**
- * Parses the function arguments.
- *
- * This function helps to have optional arguments.
- *
- * @param {(Options|Function)} options
- * @param {Function} callback
- * @returns {Array} parsed arguments
- * @private
- */
-function _parseArguments(options, callback) {
-  if (typeof options == 'function') {
-    return [callback || {}, options];
-  }
-
-  if (_isUndefined(options)) {
-    return [{}, callback];
-  }
-
-  return [options, callback];
-}
-
-/**
- * Generates a new temporary name.
- *
- * @param {Object} opts
- * @returns {string} the new random name according to opts
- * @private
- */
-function _generateTmpName(opts) {
-  if (opts.name) {
-    return path.join(opts.dir || tmpDir, opts.name);
-  }
-
-  // mkstemps like template
-  if (opts.template) {
-    return opts.template.replace(TEMPLATE_PATTERN, _randomChars(6));
-  }
-
-  // prefix and postfix
-  const name = [
-    opts.prefix || 'tmp-',
-    process.pid,
-    _randomChars(12),
-    opts.postfix || ''
-  ].join('');
-
-  return path.join(opts.dir || tmpDir, name);
-}
-
-/**
- * Gets a temporary file name.
- *
- * @param {(Options|tmpNameCallback)} options options or callback
- * @param {?tmpNameCallback} callback the callback function
- */
-function tmpName(options, callback) {
-  var
-    args = _parseArguments(options, callback),
-    opts = args[0],
-    cb = args[1],
-    tries = opts.name ? 1 : opts.tries || DEFAULT_TRIES;
-
-  if (isNaN(tries) || tries < 0)
-    return cb(new Error('Invalid tries'));
-
-  if (opts.template && !opts.template.match(TEMPLATE_PATTERN))
-    return cb(new Error('Invalid template provided'));
-
-  (function _getUniqueName() {
-    const name = _generateTmpName(opts);
-
-    // check whether the path exists then retry if needed
-    fs.stat(name, function (err) {
-      if (!err) {
-        if (tries-- > 0) return _getUniqueName();
-
-        return cb(new Error('Could not get a unique tmp filename, max tries reached ' + name));
-      }
-
-      cb(null, name);
-    });
-  }());
-}
-
-/**
- * Synchronous version of tmpName.
- *
- * @param {Object} options
- * @returns {string} the generated random name
- * @throws {Error} if the options are invalid or could not generate a filename
- */
-function tmpNameSync(options) {
-  var
-    args = _parseArguments(options),
-    opts = args[0],
-    tries = opts.name ? 1 : opts.tries || DEFAULT_TRIES;
-
-  if (isNaN(tries) || tries < 0)
-    throw new Error('Invalid tries');
-
-  if (opts.template && !opts.template.match(TEMPLATE_PATTERN))
-    throw new Error('Invalid template provided');
-
-  do {
-    const name = _generateTmpName(opts);
-    try {
-      fs.statSync(name);
-    } catch (e) {
-      return name;
-    }
-  } while (tries-- > 0);
-
-  throw new Error('Could not get a unique tmp filename, max tries reached');
-}
-
-/**
- * Creates and opens a temporary file.
- *
- * @param {(Options|fileCallback)} options the config options or the callback function
- * @param {?fileCallback} callback
- */
-function file(options, callback) {
-  var
-    args = _parseArguments(options, callback),
-    opts = args[0],
-    cb = args[1];
-
-  opts.postfix = (_isUndefined(opts.postfix)) ? '.tmp' : opts.postfix;
-
-  // gets a temporary filename
-  tmpName(opts, function _tmpNameCreated(err, name) {
-    if (err) return cb(err);
-
-    // create and open the file
-    fs.open(name, CREATE_FLAGS, opts.mode || FILE_MODE, function _fileCreated(err, fd) {
-      if (err) return cb(err);
-
-      if (opts.discardDescriptor) {
-        return fs.close(fd, function _discardCallback(err) {
-          if (err) {
-            // Low probability, and the file exists, so this could be
-            // ignored.  If it isn't we certainly need to unlink the
-            // file, and if that fails too its error is more
-            // important.
-            try {
-              fs.unlinkSync(name);
-            } catch (e) {
-              if (!isENOENT(e)) {
-                err = e;
-              }
-            }
-            return cb(err);
-          }
-          cb(null, name, undefined, _prepareTmpFileRemoveCallback(name, -1, opts));
-        });
-      }
-      if (opts.detachDescriptor) {
-        return cb(null, name, fd, _prepareTmpFileRemoveCallback(name, -1, opts));
-      }
-      cb(null, name, fd, _prepareTmpFileRemoveCallback(name, fd, opts));
-    });
-  });
-}
-
-/**
- * Synchronous version of file.
- *
- * @param {Options} options
- * @returns {FileSyncObject} object consists of name, fd and removeCallback
- * @throws {Error} if cannot create a file
- */
-function fileSync(options) {
-  var
-    args = _parseArguments(options),
-    opts = args[0];
-
-  opts.postfix = opts.postfix || '.tmp';
-
-  const discardOrDetachDescriptor = opts.discardDescriptor || opts.detachDescriptor;
-  const name = tmpNameSync(opts);
-  var fd = fs.openSync(name, CREATE_FLAGS, opts.mode || FILE_MODE);
-  if (opts.discardDescriptor) {
-    fs.closeSync(fd); 
-    fd = undefined;
-  }
-
-  return {
-    name: name,
-    fd: fd,
-    removeCallback: _prepareTmpFileRemoveCallback(name, discardOrDetachDescriptor ? -1 : fd, opts)
-  };
-}
-
-/**
- * Removes files and folders in a directory recursively.
- *
- * @param {string} root
- * @private
- */
-function _rmdirRecursiveSync(root) {
-  const dirs = [root];
-
-  do {
-    var
-      dir = dirs.pop(),
-      deferred = false,
-      files = fs.readdirSync(dir);
-
-    for (var i = 0, length = files.length; i < length; i++) {
-      var
-        file = path.join(dir, files[i]),
-        stat = fs.lstatSync(file); // lstat so we don't recurse into symlinked directories
-
-      if (stat.isDirectory()) {
-        if (!deferred) {
-          deferred = true;
-          dirs.push(dir);
-        }
-        dirs.push(file);
-      } else {
-        fs.unlinkSync(file);
-      }
-    }
-
-    if (!deferred) {
-      fs.rmdirSync(dir);
-    }
-  } while (dirs.length !== 0);
-}
-
-/**
- * Creates a temporary directory.
- *
- * @param {(Options|dirCallback)} options the options or the callback function
- * @param {?dirCallback} callback
- */
-function dir(options, callback) {
-  var
-    args = _parseArguments(options, callback),
-    opts = args[0],
-    cb = args[1];
-
-  // gets a temporary filename
-  tmpName(opts, function _tmpNameCreated(err, name) {
-    if (err) return cb(err);
-
-    // create the directory
-    fs.mkdir(name, opts.mode || DIR_MODE, function _dirCreated(err) {
-      if (err) return cb(err);
-
-      cb(null, name, _prepareTmpDirRemoveCallback(name, opts));
-    });
-  });
-}
-
-/**
- * Synchronous version of dir.
- *
- * @param {Options} options
- * @returns {DirSyncObject} object consists of name and removeCallback
- * @throws {Error} if it cannot create a directory
- */
-function dirSync(options) {
-  var
-    args = _parseArguments(options),
-    opts = args[0];
-
-  const name = tmpNameSync(opts);
-  fs.mkdirSync(name, opts.mode || DIR_MODE);
-
-  return {
-    name: name,
-    removeCallback: _prepareTmpDirRemoveCallback(name, opts)
-  };
-}
-
-/**
- * Prepares the callback for removal of the temporary file.
- *
- * @param {string} name the path of the file
- * @param {number} fd file descriptor
- * @param {Object} opts
- * @returns {fileCallback}
- * @private
- */
-function _prepareTmpFileRemoveCallback(name, fd, opts) {
-  const removeCallback = _prepareRemoveCallback(function _removeCallback(fdPath) {
-    try {
-      if (0 <= fdPath[0]) {
-        fs.closeSync(fdPath[0]);
-      }
-    }
-    catch (e) {
-      // under some node/windows related circumstances, a temporary file
-      // may have not be created as expected or the file was already closed
-      // by the user, in which case we will simply ignore the error
-      if (!isEBADF(e) && !isENOENT(e)) {
-        // reraise any unanticipated error
-        throw e;
-      }
-    }
-    try {
-      fs.unlinkSync(fdPath[1]);
-    }
-    catch (e) {
-      if (!isENOENT(e)) {
-        // reraise any unanticipated error
-        throw e;
-      }
-    }
-  }, [fd, name]);
-
-  if (!opts.keep) {
-    _removeObjects.unshift(removeCallback);
-  }
-
-  return removeCallback;
-}
-
-/**
- * Prepares the callback for removal of the temporary directory.
- *
- * @param {string} name
- * @param {Object} opts
- * @returns {Function} the callback
- * @private
- */
-function _prepareTmpDirRemoveCallback(name, opts) {
-  const removeFunction = opts.unsafeCleanup ? _rmdirRecursiveSync : fs.rmdirSync.bind(fs);
-  const removeCallback = _prepareRemoveCallback(removeFunction, name);
-
-  if (!opts.keep) {
-    _removeObjects.unshift(removeCallback);
-  }
-
-  return removeCallback;
-}
-
-/**
- * Creates a guarded function wrapping the removeFunction call.
- *
- * @param {Function} removeFunction
- * @param {Object} arg
- * @returns {Function}
- * @private
- */
-function _prepareRemoveCallback(removeFunction, arg) {
-  var called = false;
-
-  return function _cleanupCallback(next) {
-    if (!called) {
-      const index = _removeObjects.indexOf(_cleanupCallback);
-      if (index >= 0) {
-        _removeObjects.splice(index, 1);
-      }
-
-      called = true;
-      removeFunction(arg);
-    }
-
-    if (next) next(null);
-  };
-}
-
-/**
- * The garbage collector.
- *
- * @private
- */
-function _garbageCollector() {
-  if (_uncaughtException && !_gracefulCleanup) {
-    return;
-  }
-
-  // the function being called removes itself from _removeObjects,
-  // loop until _removeObjects is empty
-  while (_removeObjects.length) {
-    try {
-      _removeObjects[0].call(null);
-    } catch (e) {
-      // already removed?
-    }
-  }
-}
-
-/**
- * Helper for testing against EBADF to compensate changes made to Node 7.x under Windows.
- */
-function isEBADF(error) {
-  return isExpectedError(error, -EBADF, 'EBADF');
-}
-
-/**
- * Helper for testing against ENOENT to compensate changes made to Node 7.x under Windows.
- */
-function isENOENT(error) {
-  return isExpectedError(error, -ENOENT, 'ENOENT');
-}
-
-/**
- * Helper to determine whether the expected error code matches the actual code and errno,
- * which will differ between the supported node versions.
- *
- * - Node >= 7.0:
- *   error.code {String}
- *   error.errno {String|Number} any numerical value will be negated
- *
- * - Node >= 6.0 < 7.0:
- *   error.code {String}
- *   error.errno {Number} negated
- *
- * - Node >= 4.0 < 6.0: introduces SystemError
- *   error.code {String}
- *   error.errno {Number} negated
- *
- * - Node >= 0.10 < 4.0:
- *   error.code {Number} negated
- *   error.errno n/a
- */
-function isExpectedError(error, code, errno) {
-  return error.code == code || error.code == errno;
-}
-
-/**
- * Sets the graceful cleanup.
- *
- * Also removes the created files and directories when an uncaught exception occurs.
- */
-function setGracefulCleanup() {
-  _gracefulCleanup = true;
-}
-
-const version = process.versions.node.split('.').map(function (value) {
-  return parseInt(value, 10);
-});
-
-if (version[0] === 0 && (version[1] < 9 || version[1] === 9 && version[2] < 5)) {
-  process.addListener('uncaughtException', function _uncaughtExceptionThrown(err) {
-    _uncaughtException = true;
-    _garbageCollector();
-
-    throw err;
-  });
-}
-
-process.addListener('exit', function _exit(code) {
-  if (code) _uncaughtException = true;
-  _garbageCollector();
-});
-
-/**
- * Configuration options.
- *
- * @typedef {Object} Options
- * @property {?number} tries the number of tries before give up the name generation
- * @property {?string} template the "mkstemp" like filename template
- * @property {?string} name fix name
- * @property {?string} dir the tmp directory to use
- * @property {?string} prefix prefix for the generated name
- * @property {?string} postfix postfix for the generated name
- */
-
-/**
- * @typedef {Object} FileSyncObject
- * @property {string} name the name of the file
- * @property {string} fd the file descriptor
- * @property {fileCallback} removeCallback the callback function to remove the file
- */
-
-/**
- * @typedef {Object} DirSyncObject
- * @property {string} name the name of the directory
- * @property {fileCallback} removeCallback the callback function to remove the directory
- */
-
-/**
- * @callback tmpNameCallback
- * @param {?Error} err the error object if anything goes wrong
- * @param {string} name the temporary file name
- */
-
-/**
- * @callback fileCallback
- * @param {?Error} err the error object if anything goes wrong
- * @param {string} name the temporary file name
- * @param {number} fd the file descriptor
- * @param {cleanupCallback} fn the cleanup callback function
- */
-
-/**
- * @callback dirCallback
- * @param {?Error} err the error object if anything goes wrong
- * @param {string} name the temporary file name
- * @param {cleanupCallback} fn the cleanup callback function
- */
-
-/**
- * Removes the temporary created file or directory.
- *
- * @callback cleanupCallback
- * @param {simpleCallback} [next] function to call after entry was removed
- */
-
-/**
- * Callback function for function composition.
- * @see {@link https://github.com/raszi/node-tmp/issues/57|raszi/node-tmp#57}
- *
- * @callback simpleCallback
- */
-
-// exporting all the needed methods
-module.exports.tmpdir = tmpDir;
-
-module.exports.dir = dir;
-module.exports.dirSync = dirSync;
-
-module.exports.file = file;
-module.exports.fileSync = fileSync;
-
-module.exports.tmpName = tmpName;
-module.exports.tmpNameSync = tmpNameSync;
-
-module.exports.setGracefulCleanup = setGracefulCleanup;
diff --git a/node_modules/tmp/package.json b/node_modules/tmp/package.json
deleted file mode 100644
index e8aaf3b..0000000
--- a/node_modules/tmp/package.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "tmp",
-  "version": "0.0.33",
-  "description": "Temporary file and directory creator",
-  "author": "KARASZI István <github@spam.raszi.hu> (http://raszi.hu/)",
-  "keywords": [
-    "temporary",
-    "tmp",
-    "temp",
-    "tempdir",
-    "tempfile",
-    "tmpdir",
-    "tmpfile"
-  ],
-  "license": "MIT",
-  "repository": "raszi/node-tmp",
-  "homepage": "http://github.com/raszi/node-tmp",
-  "bugs": {
-    "url": "http://github.com/raszi/node-tmp/issues"
-  },
-  "engines": {
-    "node": ">=0.6.0"
-  },
-  "dependencies": {
-    "os-tmpdir": "~1.0.2"
-  },
-  "devDependencies": {
-    "vows": "~0.7.0"
-  },
-  "main": "lib/tmp.js",
-  "files": [
-    "lib/"
-  ],
-  "scripts": {
-    "test": "vows test/*-test.js",
-    "doc": "jsdoc -c .jsdoc.json"
-  }
-}
diff --git a/node_modules/tsconfig-paths/.nycrc.json b/node_modules/tsconfig-paths/.nycrc.json
new file mode 100644
index 0000000..08e0ea0
--- /dev/null
+++ b/node_modules/tsconfig-paths/.nycrc.json
@@ -0,0 +1,8 @@
+{
+  "include": ["src/**/*.{ts,tsx}"],
+  "exclude": ["src/register.ts"],
+  "extension": [".ts", ".tsx"],
+  "reporter": ["json"],
+  "sourceMap": true,
+  "all": true
+}
diff --git a/node_modules/tsconfig-paths/CHANGELOG.md b/node_modules/tsconfig-paths/CHANGELOG.md
new file mode 100644
index 0000000..03bdc18
--- /dev/null
+++ b/node_modules/tsconfig-paths/CHANGELOG.md
@@ -0,0 +1,307 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/)
+and this project adheres to [Semantic Versioning](http://semver.org/).
+
+## [Unreleased]
+
+## [3.8.0] - 2019-02-05
+
+### Added
+
+- Add option to avoid adding a match-all rule. See PR [#73](https://github.com/dividab/tsconfig-paths/pull/73) and issue [72](https://github.com/dividab/tsconfig-paths/issues/72). Thanks to [@Swatinem](https://github.com/Swatinem) for this addition!
+
+## [3.7.0] - 2018-11-11
+
+### Added
+
+- Allow cleanup of register(). See PR [#64](https://github.com/dividab/tsconfig-paths/pull/64) and issue [63](https://github.com/dividab/tsconfig-paths/issues/63). Thanks to [@TylorS](https://github.com/TylorS) for this addition!
+
+## [3.6.0] - 2018-09-10
+
+### Added
+
+- Prefer Node's core modules over file modules. See PR [#60](https://github.com/dividab/tsconfig-paths/pull/60) and issue [56](https://github.com/dividab/tsconfig-paths/issues/56). Thanks to @ljani for this addition!
+
+## [3.5.0] - 2018-07-28
+
+### Added
+
+- Add support for trailing commas in tsconfig.json (use JSON5 to parse). See issue [#48](https://github.com/dividab/tsconfig-paths/issues/48), and PR [#58](https://github.com/dividab/tsconfig-paths/pull/58). Thanks to [@jshado1](https://github.com/jshado1) for this addition!
+
+## [3.4.2] - 2018-06-30
+
+### Fixed
+
+- Do not resolve directories, only files, sse issue [#51](https://github.com/dividab/tsconfig-paths/issues/51).
+
+## [3.4.1] - 2018-06-24
+
+### Fixed
+
+- Ignore field name mappings in package.json files that are not paths of existing files [#46](https://github.com/dividab/tsconfig-paths/pull/45). Thanks to [@christoffer](https://github.com/christoffer) for this fix!
+
+## [3.4.0] - 2018-06-12
+
+### Added
+
+- Add support for providing a list of field names to try instead of just using "main", [#45](https://github.com/dividab/tsconfig-paths/pull/45). Thanks to [@christoffer-dropbox](https://github.com/christoffer-dropbox) for this addition!
+
+## [3.3.2] - 2018-05-07
+
+### Fixed
+
+- Adding json file extention to extends property, [#40](https://github.com/dividab/tsconfig-paths/pull/40). Thanks to [@cwhite-connectfirst](https://github.com/cwhite-connectfirst) for this fixing this!
+
+## [3.3.1] - 2018-04-17
+
+### Fixed
+
+- Fix project undefined error when calling register, [#37](https://github.com/dividab/tsconfig-paths/issues/37). Thanks to [@natedanner](https://github.com/natedanner) for this fixing this!
+
+## [3.3.0] - 2018-04-14
+
+### Added
+
+- Add possibility to indicate explicitly tsconfig location, [#35](https://github.com/dividab/tsconfig-paths/issues/35). Thanks to [@procopenco](https://github.com/procopenco) for this adding this!
+
+## [3.2.0] - 2018-03-31
+
+### Added
+
+- Added support for passing a filename as cwd, see issue [#31](https://github.com/dividab/tsconfig-paths/issues/31) and PR [#32](https://github.com/dividab/tsconfig-paths/pull/32). Thanks to [@amodm](https://github.com/amodm) for this adding this!
+
+## [3.1.3] - 2018-03-14
+
+### Fixed
+
+- Fix async recursion, see [#30](https://github.com/dividab/tsconfig-paths/pull/30). Thanks to [@Nayni](https://github.com/Nayni) for this fix!
+
+## [3.1.2] - 2018-03-13
+
+### Fixed
+
+- Fix a forgotten return when doneCallback is invoked, see [#29](https://github.com/dividab/tsconfig-paths/pull/29). Thanks to [@Nayni](https://github.com/Nayni) for this fix!
+
+## [3.1.1] - 2018-01-13
+
+### Fixed
+
+- Fix read json async when it does not exist
+
+## [3.1.0] - 2018-01-13
+
+### Added
+
+- Implement default async json reader function.
+
+## [3.0.0] - 2018-01-13
+
+### Changed
+
+- Remove parameter `absoluteSourceFileName` from the `MatchPath` and `matchFromAbsolutePaths` functions. It was not used internally.
+- `matchFromAbsolutePaths` now accepts a pre-sorted array of `MappingEntry`s instead of a dictionary. This was done so the sorting could be done once which should give better performance.
+
+### Added
+
+- `createMatchPathAsync`, creates an async version of the `MatchPath` function. Can be used for example by webpack plugins.
+- `matchFromAbsolutePathsAsync`, async version of `matchFromAbsolutePaths`.
+
+## [2.7.3]
+
+### Fixed
+
+- Only resolve path if tsconfig present [#25](https://github.com/dividab/tsconfig-paths/pull/25). Thanks to @nicoschoenmaker for the PR.
+
+## [2.7.2]
+
+### Fixed
+
+- Return absolute path to tsconfig.json.
+
+## [2.7.1]
+
+### Fixed
+
+- Remove left over console.log.
+
+## [2.7.0]
+
+### Added
+
+- Support `baseUrl` to exist in base tsconfig.json when using `extends`, see [#23](https://github.com/dividab/tsconfig-paths/issues/23).
+
+## [2.6.0]
+
+### Added
+
+- Add `baseUrl` and `configFileAbsolutePath` to the result of `loadConfig`.
+
+## [2.5.0]
+
+### Added
+
+- New function in Programmatic API `loadConfig`.
+
+## [2.4.3]
+
+### Fixed
+
+- Export MatchPth typing.
+
+## [2.4.2]
+
+### Fixed
+
+- Add missing types field in package.json.
+
+## [2.4.1]
+
+### Fixed
+
+- Include declaration files. Fixes [#22](https://github.com/dividab/tsconfig-paths/issues/22).
+
+## [2.4.0]
+
+### Changed
+
+- Removed dependency for package `tsconfig`.
+
+### Fixed
+
+- Support for config inheritance with `extends`. Fixes [#17](https://github.com/dividab/tsconfig-paths/issues/17).
+
+## [2.2.0]
+
+### Fixed
+
+- Fixed issue [#7](https://github.com/dividab/tsconfig-paths/issues/7).
+
+## [2.1.2]
+
+### Fixed
+
+- Fixed issue [#6](https://github.com/dividab/tsconfig-paths/issues/6).
+
+## [2.1.1]
+
+### Fixed
+
+- Fixed issue [#4](https://github.com/dividab/tsconfig-paths/issues/4)
+
+## [2.1.0]
+
+### Fixed
+
+- Fixed issue [#3](https://github.com/dividab/tsconfig-paths/issues/3)
+
+## [2.0.0]
+
+### Added
+
+- We now look at `process.env.TS_NODE_PROJECT`
+- Functionality to bootstrap tsconfig-paths. Documentation in [README](https://github.com/dividab/tsconfig-paths/blob/master/README.md)
+
+### Changed
+
+- Changed signature for `createMatchPath`. Now only takes absoluteUrl and paths.
+
+## [1.1.0]
+
+### Added
+
+- More explanation to readme.
+- Match all extensions in require.extensions.
+- Match longest pattern prefix first as typesript does.
+- Match file in main field of package.json.
+- Check for index files explicitly.
+
+## [1.0.0] - 2016-12-30
+
+- First stable release.
+
+## [0.4.0] - 2016-12-30
+
+### Changed
+
+- Renamed project to `tsocnfig-paths`.
+
+## [0.3.0] - 2016-12-30
+
+### Added
+
+- API documentation.
+- `createMatchPath` function.
+- `matchFromAbsolutePaths` function.
+
+### Removed
+
+- `findPath` function.
+
+## [0.2.1] - 2016-12-29
+
+### Fixed
+
+- `tsconfig-paths/register` was not available.
+
+## [0.2.0] - 2016-12-29
+
+### Fixed
+
+- Paths for files in sub-dirs.
+
+### Added
+
+- Programmatic use.
+
+## [0.1.2] - 2016-12-28
+
+### Fixed
+
+- Fixed wrong name of the package in README.
+- Add missing files on publish.
+
+## [0.1.1] - 2016-12-28
+
+### Added
+
+- Loading of tsconfig.
+- Example.
+- Publish scripts.
+
+## [0.1.0] - 2016-12-28
+
+- Initial version.
+
+[unreleased]: https://github.com/dividab/tsconfig-paths/compare/3.8.0...master
+[3.8.0]: https://github.com/dividab/tsconfig-paths/compare/3.7.0...3.8.0
+[3.7.0]: https://github.com/dividab/tsconfig-paths/compare/3.6.0...3.7.0
+[3.6.0]: https://github.com/dividab/tsconfig-paths/compare/3.5.0...3.6.0
+[3.5.0]: https://github.com/dividab/tsconfig-paths/compare/3.4.2...3.5.0
+[3.4.2]: https://github.com/dividab/tsconfig-paths/compare/3.4.1...3.4.2
+[3.4.1]: https://github.com/dividab/tsconfig-paths/compare/3.4.0...3.4.1
+[3.4.0]: https://github.com/dividab/tsconfig-paths/compare/3.3.2...3.4.0
+[3.3.2]: https://github.com/dividab/tsconfig-paths/compare/3.3.1...3.3.2
+[3.3.1]: https://github.com/dividab/tsconfig-paths/compare/3.3.0...3.3.1
+[3.3.0]: https://github.com/dividab/tsconfig-paths/compare/3.2.0...3.3.0
+[3.2.0]: https://github.com/dividab/tsconfig-paths/compare/3.1.3...3.2.0
+[3.1.3]: https://github.com/dividab/tsconfig-paths/compare/3.1.2...3.1.3
+[3.1.2]: https://github.com/dividab/tsconfig-paths/compare/3.1.1...3.1.2
+[3.1.1]: https://github.com/dividab/tsconfig-paths/compare/3.1.0...3.1.1
+[3.1.0]: https://github.com/dividab/tsconfig-paths/compare/3.0.0...3.1.0
+[3.0.0]: https://github.com/dividab/tsconfig-paths/compare/2.7.3...3.0.0
+[2.7.3]: https://github.com/dividab/tsconfig-paths/compare/2.7.2...2.7.3
+[2.7.2]: https://github.com/dividab/tsconfig-paths/compare/2.7.1...2.7.2
+[2.7.1]: https://github.com/dividab/tsconfig-paths/compare/2.7.0...2.7.1
+[2.7.0]: https://github.com/dividab/tsconfig-paths/compare/2.6.0...2.7.0
+[2.6.0]: https://github.com/dividab/tsconfig-paths/compare/2.5.0...2.6.0
+[2.5.0]: https://github.com/dividab/tsconfig-paths/compare/2.4.3...2.5.0
+[2.4.3]: https://github.com/dividab/tsconfig-paths/compare/2.4.2...2.4.3
+[2.4.2]: https://github.com/dividab/tsconfig-paths/compare/2.4.1...2.4.2
+[2.4.1]: https://github.com/dividab/tsconfig-paths/compare/2.4.0...2.4.1
+[2.4.0]: https://github.com/dividab/tsconfig-paths/compare/2.2.0...2.4.0
+[2.2.0]: https://github.com/dividab/tsconfig-paths/compare/2.1.2...2.2.0
+[2.1.2]: https://github.com/dividab/tsconfig-paths/compare/2.1.1...2.1.2
+[2.1.1]: https://github.com/dividab/tsconfig-paths/compare/2.1.0...2.1.1
diff --git a/node_modules/tsconfig-paths/LICENSE b/node_modules/tsconfig-paths/LICENSE
new file mode 100644
index 0000000..884c7e3
--- /dev/null
+++ b/node_modules/tsconfig-paths/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Jonas Kello
+
+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/node_modules/tsconfig-paths/README.md b/node_modules/tsconfig-paths/README.md
new file mode 100644
index 0000000..491e637
--- /dev/null
+++ b/node_modules/tsconfig-paths/README.md
@@ -0,0 +1,231 @@
+# tsconfig-paths
+
+[![npm version][version-image]][version-url]
+[![travis build][travis-image]][travis-url]
+[![Coverage Status][codecov-image]][codecov-url]
+[![MIT license][license-image]][license-url]
+[![code style: prettier][prettier-image]][prettier-url]
+
+Use this to load modules whose location is specified in the `paths` section of `tsconfig.json`. Both loading at run-time and via API are supported.
+
+Typescript by default mimics the Node.js runtime resolution strategy of modules. But it also allows the use of [path mapping](https://www.typescriptlang.org/docs/handbook/module-resolution.html) which allows arbitrary module paths (that doesn't start with "/" or ".") to be specified and mapped to physical paths in the filesystem. The typescript compiler can resolve these paths from `tsconfig` so it will compile OK. But if you then try to execute the compiled files with node (or ts-node), it will only look in the `node_modules` folders all the way up to the root of the filesystem and thus will not find the modules specified by `paths` in `tsconfig`.
+
+If you require this package's `tsconfig-paths/register` module it will read the `paths` from `tsconfig.json` and convert node's module loading calls into to physcial file paths that node can load.
+
+## How to install
+
+```
+yarn add --dev tsconfig-paths
+```
+
+or
+
+```
+npm install --save-dev tsconfig-paths
+```
+
+## How to use
+
+### With node
+
+`node -r tsconfig-paths/register main.js`
+
+### With ts-node
+
+`ts-node -r tsconfig-paths/register main.ts`
+
+If `process.env.TS_NODE_PROJECT` is set it will be used to resolved tsconfig.json
+
+### With webpack
+
+For webpack please use the [tsconfig-paths-webpack-plugin](https://github.com/dividab/tsconfig-paths-webpack-plugin).
+
+### With mocha and ts-node
+
+As of Mocha >= 4.0.0 the `--compiler` was [deprecated](https://github.com/mochajs/mocha/wiki/compilers-deprecation). Instead `--require` should be used. You also have to specify a glob that includes `.ts` files because mocha looks after files with `.js` extension by default.
+
+```bash
+mocha -r ts-node/register -r tsconfig-paths/register "test/**/*.ts"
+```
+
+### With other commands
+
+As long as the command has something similar to a `--require` option that can load a module before it starts, tsconfig-paths should be able to work with it.
+
+## Bootstraping with explicit params
+
+If you want more granular control over tsconfig-paths you can bootstrap it. This can be useful if you for instance have compiled with `tsc` to another directory where `tsconfig.json` doesn't exists.
+
+```javascript
+const tsConfig = require("./tsconfig.json");
+const tsConfigPaths = require("tsconfig-paths");
+
+const baseUrl = "./"; // Either absolute or relative path. If relative it's resolved to current working directory.
+const cleanup = tsConfigPaths.register({
+  baseUrl,
+  paths: tsConfig.compilerOptions.paths
+});
+
+// When path registration is no longer needed
+cleanup();
+```
+
+Then run with:
+
+`node -r ./tsconfig-paths-bootstrap.js main.js`
+
+## Configuration Options
+
+You can set options by passing them before the script path, via programmatic usage or via environment variables.
+
+```bash
+ts-node --project customLocation/tsconfig.json -r tsconfig-paths/register "test/**/*.ts"
+```
+
+### CLI and Programmatic Options
+
+_Environment variable denoted in parentheses._
+
+- `-P, --project [path]` Path to TypeScript JSON project file (`TS_NODE_PROJECT`)
+
+## Config loading process
+
+1.  Use explicit params passed to register
+2.  Use `process.env.TS_NODE_PROJECT` to resolve tsConfig.json and the specified baseUrl and paths.
+3.  Resolves tsconfig.json from current working directory and the specified baseUrl and paths.
+
+## Programmatic use
+
+The public API consists of these functions:
+
+- [register](#register)
+- [loadConfig](#loadConfig)
+- [createMatchPath](#createMatchPath) / [createMatchPathAsync](#createMatchPathAsync)
+- [matchFromAbsolutePaths](#matchFromAbsolutePaths) / [matchFromAbsolutePathsAsync](#matchFromAbsolutePathsAsync)
+
+### register
+
+```typescript
+export interface ExplicitParams {
+  baseUrl: string;
+  paths: { [key: string]: Array<string> };
+  mainFields?: Array<string>;
+  addMatchAll?: boolean;
+}
+
+/**
+ * Installs a custom module load function that can adhere to paths in tsconfig.
+ */
+export function register(explicitParams: ExplicitParams): () => void;
+```
+
+This function will patch the node's module loading so it will look for modules in paths specified by tsconfig.json.
+A function is returned for you to reinstate Node's original module loading.
+
+### loadConfig
+
+```typescript
+export function loadConfig(cwd: string = process.cwd()): ConfigLoaderResult;
+
+export type ConfigLoaderResult =
+  | ConfigLoaderSuccessResult
+  | ConfigLoaderFailResult;
+
+export interface ConfigLoaderSuccessResult {
+  resultType: "success";
+  absoluteBaseUrl: string;
+  paths: { [key: string]: Array<string> };
+}
+
+export interface ConfigLoaderFailResult {
+  resultType: "failed";
+  message: string;
+}
+```
+
+This function loads the tsconfig.json. It will start searching from the specified `cwd` directory. Passing the tsconfig.json file directly instead of a directory also works.
+
+### createMatchPath
+
+```typescript
+/**
+ * Function that can match a path
+ */
+export interface MatchPath {
+  (
+    requestedModule: string,
+    readJson?: Filesystem.ReadJsonSync,
+    fileExists?: (name: string) => boolean,
+    extensions?: ReadonlyArray<string>
+  ): string | undefined;
+}
+
+/**
+ * Creates a function that can resolve paths according to tsconfig paths property.
+ * @param absoluteBaseUrl Absolute version of baseUrl as specified in tsconfig.
+ * @param paths The paths as specified in tsconfig.
+ * @param mainFields A list of package.json field names to try when resolving module files.
+ * @param addMatchAll Add a match-all "*" rule if none is present
+ * @returns a function that can resolve paths.
+ */
+export function createMatchPath(
+  absoluteBaseUrl: string,
+  paths: { [key: string]: Array<string> },
+  mainFields: string[] = ["main"],
+  addMatchAll: boolean = true
+): MatchPath {
+```
+
+The `createMatchPath` function will create a function that can match paths. It accepts `baseUrl` and `paths` directly as they are specified in tsconfig and will handle resolving paths to absolute form. The created function has the signare specified by the type `MatchPath` above.
+
+### matchFromAbsolutePaths
+
+```typescript
+/**
+ * Finds a path from tsconfig that matches a module load request.
+ * @param absolutePathMappings The paths to try as specified in tsconfig but resolved to absolute form.
+ * @param requestedModule The required module name.
+ * @param readJson Function that can read json from a path (useful for testing).
+ * @param fileExists Function that checks for existance of a file at a path (useful for testing).
+ * @param extensions File extensions to probe for (useful for testing).
+ * @param mainFields A list of package.json field names to try when resolving module files.
+ * @returns the found path, or undefined if no path was found.
+ */
+export function matchFromAbsolutePaths(
+  absolutePathMappings: ReadonlyArray<MappingEntry.MappingEntry>,
+  requestedModule: string,
+  readJson: Filesystem.ReadJsonSync = Filesystem.readJsonFromDiskSync,
+  fileExists: Filesystem.FileExistsSync = Filesystem.fileExistsSync,
+  extensions: Array<string> = Object.keys(require.extensions),
+  mainFields: string[] = ["main"]
+): string | undefined {
+```
+
+This function is lower level and requries that the paths as already been resolved to absolute form and sorted in correct order into an array.
+
+### createMatchPathAsync
+
+This is the async version of `createMatchPath`. It has the same signature but with a callback parameter for the result.
+
+### matchFromAbsolutePathsAsync
+
+This is the async version of `matchFromAbsolutePaths`. It has the same signature but with a callback parameter for the result.
+
+## How to publish
+
+```
+yarn version --patch
+yarn version --minor
+yarn version --major
+```
+
+[version-image]: https://img.shields.io/npm/v/tsconfig-paths.svg?style=flat
+[version-url]: https://www.npmjs.com/package/tsconfig-paths
+[travis-image]: https://travis-ci.com/dividab/tsconfig-paths.svg?branch=master&style=flat
+[travis-url]: https://travis-ci.com/dividab/tsconfig-paths
+[codecov-image]: https://codecov.io/gh/dividab/tsconfig-paths/branch/master/graph/badge.svg
+[codecov-url]: https://codecov.io/gh/dividab/tsconfig-paths
+[license-image]: https://img.shields.io/github/license/dividab/tsconfig-paths.svg?style=flat
+[license-url]: https://opensource.org/licenses/MIT
+[prettier-image]: https://img.shields.io/badge/code_style-prettier-ff69b4.svg
+[prettier-url]: https://github.com/prettier/prettier
diff --git a/node_modules/tsconfig-paths/lib/config-loader.d.ts b/node_modules/tsconfig-paths/lib/config-loader.d.ts
new file mode 100644
index 0000000..537ac22
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/config-loader.d.ts
@@ -0,0 +1,33 @@
+import * as TsConfigLoader from "./tsconfig-loader";
+export interface ExplicitParams {
+    baseUrl: string;
+    paths: {
+        [key: string]: Array<string>;
+    };
+    mainFields?: Array<string>;
+    addMatchAll?: boolean;
+}
+export declare type TsConfigLoader = (params: TsConfigLoader.TsConfigLoaderParams) => TsConfigLoader.TsConfigLoaderResult;
+export interface ConfigLoaderParams {
+    cwd: string;
+    explicitParams?: ExplicitParams;
+    tsConfigLoader?: TsConfigLoader;
+}
+export interface ConfigLoaderSuccessResult {
+    resultType: "success";
+    configFileAbsolutePath: string;
+    baseUrl: string;
+    absoluteBaseUrl: string;
+    paths: {
+        [key: string]: Array<string>;
+    };
+    mainFields?: Array<string>;
+    addMatchAll?: boolean;
+}
+export interface ConfigLoaderFailResult {
+    resultType: "failed";
+    message: string;
+}
+export declare type ConfigLoaderResult = ConfigLoaderSuccessResult | ConfigLoaderFailResult;
+export declare function loadConfig(cwd?: string): ConfigLoaderResult;
+export declare function configLoader({ cwd, explicitParams, tsConfigLoader }: ConfigLoaderParams): ConfigLoaderResult;
diff --git a/node_modules/tsconfig-paths/lib/config-loader.js b/node_modules/tsconfig-paths/lib/config-loader.js
new file mode 100644
index 0000000..aa145b6
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/config-loader.js
@@ -0,0 +1,55 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var TsConfigLoader = require("./tsconfig-loader");
+var path = require("path");
+var options_1 = require("./options");
+function loadConfig(cwd) {
+    if (cwd === void 0) { cwd = options_1.options.cwd; }
+    return configLoader({ cwd: cwd });
+}
+exports.loadConfig = loadConfig;
+function configLoader(_a) {
+    var cwd = _a.cwd, explicitParams = _a.explicitParams, _b = _a.tsConfigLoader, tsConfigLoader = _b === void 0 ? TsConfigLoader.tsConfigLoader : _b;
+    if (explicitParams) {
+        // tslint:disable-next-line:no-shadowed-variable
+        var absoluteBaseUrl_1 = path.isAbsolute(explicitParams.baseUrl)
+            ? explicitParams.baseUrl
+            : path.join(cwd, explicitParams.baseUrl);
+        return {
+            resultType: "success",
+            configFileAbsolutePath: "",
+            baseUrl: explicitParams.baseUrl,
+            absoluteBaseUrl: absoluteBaseUrl_1,
+            paths: explicitParams.paths,
+            mainFields: explicitParams.mainFields,
+            addMatchAll: explicitParams.addMatchAll
+        };
+    }
+    // Load tsconfig and create path matching function
+    var loadResult = tsConfigLoader({
+        cwd: cwd,
+        getEnv: function (key) { return process.env[key]; }
+    });
+    if (!loadResult.tsConfigPath) {
+        return {
+            resultType: "failed",
+            message: "Couldn't find tsconfig.json"
+        };
+    }
+    if (!loadResult.baseUrl) {
+        return {
+            resultType: "failed",
+            message: "Missing baseUrl in compilerOptions"
+        };
+    }
+    var tsConfigDir = path.dirname(loadResult.tsConfigPath);
+    var absoluteBaseUrl = path.join(tsConfigDir, loadResult.baseUrl);
+    return {
+        resultType: "success",
+        configFileAbsolutePath: loadResult.tsConfigPath,
+        baseUrl: loadResult.baseUrl,
+        absoluteBaseUrl: absoluteBaseUrl,
+        paths: loadResult.paths || {}
+    };
+}
+exports.configLoader = configLoader;
diff --git a/node_modules/tsconfig-paths/lib/filesystem.d.ts b/node_modules/tsconfig-paths/lib/filesystem.d.ts
new file mode 100644
index 0000000..44cfdae
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/filesystem.d.ts
@@ -0,0 +1,33 @@
+/**
+ * Typing for the fields of package.json we care about
+ */
+export interface PackageJson {
+    [key: string]: string;
+}
+/**
+ * A function that json from a file
+ */
+export interface ReadJsonSync {
+    (packageJsonPath: string): any | undefined;
+}
+export interface FileExistsSync {
+    (name: string): boolean;
+}
+export interface FileExistsAsync {
+    (path: string, callback: (err?: Error, exists?: boolean) => void): void;
+}
+export interface ReadJsonAsyncCallback {
+    (err?: Error, content?: any): void;
+}
+export interface ReadJsonAsync {
+    (path: string, callback: ReadJsonAsyncCallback): void;
+}
+export declare function fileExistsSync(path: string): boolean;
+/**
+ * Reads package.json from disk
+ * @param file Path to package.json
+ */
+export declare function readJsonFromDiskSync(packageJsonPath: string): any | undefined;
+export declare function readJsonFromDiskAsync(path: string, callback: (err?: Error, content?: any) => void): void;
+export declare function fileExistsAsync(path2: string, callback2: (err?: Error, exists?: boolean) => void): void;
+export declare function removeExtension(path: string): string;
diff --git a/node_modules/tsconfig-paths/lib/filesystem.js b/node_modules/tsconfig-paths/lib/filesystem.js
new file mode 100644
index 0000000..eb6397d
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/filesystem.js
@@ -0,0 +1,53 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var fs = require("fs");
+function fileExistsSync(path) {
+    try {
+        var stats = fs.statSync(path);
+        return stats.isFile();
+    }
+    catch (err) {
+        // If error, assume file did not exist
+        return false;
+    }
+}
+exports.fileExistsSync = fileExistsSync;
+/**
+ * Reads package.json from disk
+ * @param file Path to package.json
+ */
+// tslint:disable-next-line:no-any
+function readJsonFromDiskSync(packageJsonPath) {
+    if (!fs.existsSync(packageJsonPath)) {
+        return undefined;
+    }
+    return require(packageJsonPath);
+}
+exports.readJsonFromDiskSync = readJsonFromDiskSync;
+function readJsonFromDiskAsync(path, 
+// tslint:disable-next-line:no-any
+callback) {
+    fs.readFile(path, "utf8", function (err, result) {
+        // If error, assume file did not exist
+        if (err || !result) {
+            return callback();
+        }
+        var json = JSON.parse(result);
+        return callback(undefined, json);
+    });
+}
+exports.readJsonFromDiskAsync = readJsonFromDiskAsync;
+function fileExistsAsync(path2, callback2) {
+    fs.stat(path2, function (err, stats) {
+        if (err) {
+            // If error assume file does not exist
+            return callback2(undefined, false);
+        }
+        callback2(undefined, stats ? stats.isFile() : false);
+    });
+}
+exports.fileExistsAsync = fileExistsAsync;
+function removeExtension(path) {
+    return path.substring(0, path.lastIndexOf(".")) || path;
+}
+exports.removeExtension = removeExtension;
diff --git a/node_modules/tsconfig-paths/lib/index.d.ts b/node_modules/tsconfig-paths/lib/index.d.ts
new file mode 100644
index 0000000..02373e9
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/index.d.ts
@@ -0,0 +1,5 @@
+export { createMatchPath, matchFromAbsolutePaths, MatchPath } from "./match-path-sync";
+export { createMatchPathAsync, matchFromAbsolutePathsAsync, MatchPathAsync } from "./match-path-async";
+export { register } from "./register";
+export { loadConfig, ConfigLoaderResult, ConfigLoaderSuccessResult, ConfigLoaderFailResult } from "./config-loader";
+export { ReadJsonSync, ReadJsonAsync, FileExistsSync, FileExistsAsync } from "./filesystem";
diff --git a/node_modules/tsconfig-paths/lib/index.js b/node_modules/tsconfig-paths/lib/index.js
new file mode 100644
index 0000000..c08ca7f
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/index.js
@@ -0,0 +1,13 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+// register is used from register.js in root dir
+var match_path_sync_1 = require("./match-path-sync");
+exports.createMatchPath = match_path_sync_1.createMatchPath;
+exports.matchFromAbsolutePaths = match_path_sync_1.matchFromAbsolutePaths;
+var match_path_async_1 = require("./match-path-async");
+exports.createMatchPathAsync = match_path_async_1.createMatchPathAsync;
+exports.matchFromAbsolutePathsAsync = match_path_async_1.matchFromAbsolutePathsAsync;
+var register_1 = require("./register");
+exports.register = register_1.register;
+var config_loader_1 = require("./config-loader");
+exports.loadConfig = config_loader_1.loadConfig;
diff --git a/node_modules/tsconfig-paths/lib/mapping-entry.d.ts b/node_modules/tsconfig-paths/lib/mapping-entry.d.ts
new file mode 100644
index 0000000..35669f7
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/mapping-entry.d.ts
@@ -0,0 +1,17 @@
+export interface MappingEntry {
+    readonly pattern: string;
+    readonly paths: ReadonlyArray<string>;
+}
+export interface Paths {
+    readonly [key: string]: ReadonlyArray<string>;
+}
+/**
+ * Converts an absolute baseUrl and paths to an array of absolute mapping entries.
+ * The array is sorted by longest prefix.
+ * Having an array with entries allows us to keep a sorting order rather than
+ * sort by keys each time we use the mappings.
+ * @param absoluteBaseUrl
+ * @param paths
+ * @param addMatchAll
+ */
+export declare function getAbsoluteMappingEntries(absoluteBaseUrl: string, paths: Paths, addMatchAll: boolean): ReadonlyArray<MappingEntry>;
diff --git a/node_modules/tsconfig-paths/lib/mapping-entry.js b/node_modules/tsconfig-paths/lib/mapping-entry.js
new file mode 100644
index 0000000..a8762f7
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/mapping-entry.js
@@ -0,0 +1,51 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var path = require("path");
+/**
+ * Converts an absolute baseUrl and paths to an array of absolute mapping entries.
+ * The array is sorted by longest prefix.
+ * Having an array with entries allows us to keep a sorting order rather than
+ * sort by keys each time we use the mappings.
+ * @param absoluteBaseUrl
+ * @param paths
+ * @param addMatchAll
+ */
+function getAbsoluteMappingEntries(absoluteBaseUrl, paths, addMatchAll) {
+    // Resolve all paths to absolute form once here, and sort them by
+    // longest prefix once here, this saves time on each request later.
+    // We need to put them in an array to preseve the sorting order.
+    var sortedKeys = sortByLongestPrefix(Object.keys(paths));
+    var absolutePaths = [];
+    for (var _i = 0, sortedKeys_1 = sortedKeys; _i < sortedKeys_1.length; _i++) {
+        var key = sortedKeys_1[_i];
+        absolutePaths.push({
+            pattern: key,
+            paths: paths[key].map(function (pathToResolve) {
+                return path.join(absoluteBaseUrl, pathToResolve);
+            })
+        });
+    }
+    // If there is no match-all path specified in the paths section of tsconfig, then try to match
+    // all paths relative to baseUrl, this is how typescript works.
+    if (!paths["*"] && addMatchAll) {
+        absolutePaths.push({
+            pattern: "*",
+            paths: [absoluteBaseUrl.replace(/\/$/, "") + "/*"]
+        });
+    }
+    return absolutePaths;
+}
+exports.getAbsoluteMappingEntries = getAbsoluteMappingEntries;
+/**
+ * Sort path patterns.
+ * If a module name can be matched with multiple patterns then pattern with the longest prefix will be picked.
+ */
+function sortByLongestPrefix(arr) {
+    return arr
+        .concat()
+        .sort(function (a, b) { return getPrefixLength(b) - getPrefixLength(a); });
+}
+function getPrefixLength(pattern) {
+    var prefixLength = pattern.indexOf("*");
+    return pattern.substr(0, prefixLength).length;
+}
diff --git a/node_modules/tsconfig-paths/lib/match-path-async.d.ts b/node_modules/tsconfig-paths/lib/match-path-async.d.ts
new file mode 100644
index 0000000..c199f9f
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/match-path-async.d.ts
@@ -0,0 +1,21 @@
+import * as MappingEntry from "./mapping-entry";
+import * as Filesystem from "./filesystem";
+/**
+ * Function that can match a path async
+ */
+export interface MatchPathAsync {
+    (requestedModule: string, readJson: Filesystem.ReadJsonAsync | undefined, fileExists: Filesystem.FileExistsAsync | undefined, extensions: ReadonlyArray<string> | undefined, callback: MatchPathAsyncCallback): void;
+}
+export interface MatchPathAsyncCallback {
+    (err?: Error, path?: string): void;
+}
+/**
+ * See the sync version for docs.
+ */
+export declare function createMatchPathAsync(absoluteBaseUrl: string, paths: {
+    [key: string]: Array<string>;
+}, mainFields?: string[], addMatchAll?: boolean): MatchPathAsync;
+/**
+ * See the sync version for docs.
+ */
+export declare function matchFromAbsolutePathsAsync(absolutePathMappings: ReadonlyArray<MappingEntry.MappingEntry>, requestedModule: string, readJson: Filesystem.ReadJsonAsync | undefined, fileExists: Filesystem.FileExistsAsync | undefined, extensions: ReadonlyArray<string> | undefined, callback: MatchPathAsyncCallback, mainFields?: string[]): void;
diff --git a/node_modules/tsconfig-paths/lib/match-path-async.js b/node_modules/tsconfig-paths/lib/match-path-async.js
new file mode 100644
index 0000000..511cfb7
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/match-path-async.js
@@ -0,0 +1,113 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var path = require("path");
+var TryPath = require("./try-path");
+var MappingEntry = require("./mapping-entry");
+var Filesystem = require("./filesystem");
+/**
+ * See the sync version for docs.
+ */
+function createMatchPathAsync(absoluteBaseUrl, paths, mainFields, addMatchAll) {
+    if (mainFields === void 0) { mainFields = ["main"]; }
+    if (addMatchAll === void 0) { addMatchAll = true; }
+    var absolutePaths = MappingEntry.getAbsoluteMappingEntries(absoluteBaseUrl, paths, addMatchAll);
+    return function (requestedModule, readJson, fileExists, extensions, callback) {
+        return matchFromAbsolutePathsAsync(absolutePaths, requestedModule, readJson, fileExists, extensions, callback, mainFields);
+    };
+}
+exports.createMatchPathAsync = createMatchPathAsync;
+/**
+ * See the sync version for docs.
+ */
+function matchFromAbsolutePathsAsync(absolutePathMappings, requestedModule, readJson, fileExists, extensions, callback, mainFields) {
+    if (readJson === void 0) { readJson = Filesystem.readJsonFromDiskAsync; }
+    if (fileExists === void 0) { fileExists = Filesystem.fileExistsAsync; }
+    if (extensions === void 0) { extensions = Object.keys(require.extensions); }
+    if (mainFields === void 0) { mainFields = ["main"]; }
+    var tryPaths = TryPath.getPathsToTry(extensions, absolutePathMappings, requestedModule);
+    if (!tryPaths) {
+        return callback();
+    }
+    findFirstExistingPath(tryPaths, readJson, fileExists, callback, 0, mainFields);
+}
+exports.matchFromAbsolutePathsAsync = matchFromAbsolutePathsAsync;
+function findFirstExistingMainFieldMappedFile(packageJson, mainFields, packageJsonPath, fileExistsAsync, doneCallback, index) {
+    if (index === void 0) { index = 0; }
+    if (index >= mainFields.length) {
+        return doneCallback(undefined, undefined);
+    }
+    var tryNext = function () {
+        return findFirstExistingMainFieldMappedFile(packageJson, mainFields, packageJsonPath, fileExistsAsync, doneCallback, index + 1);
+    };
+    var mainFieldMapping = packageJson[mainFields[index]];
+    if (typeof mainFieldMapping !== "string") {
+        // Skip mappings that are not pointers to replacement files
+        return tryNext();
+    }
+    var mappedFilePath = path.join(path.dirname(packageJsonPath), mainFieldMapping);
+    fileExistsAsync(mappedFilePath, function (err, exists) {
+        if (err) {
+            return doneCallback(err);
+        }
+        if (exists) {
+            return doneCallback(undefined, mappedFilePath);
+        }
+        return tryNext();
+    });
+}
+// Recursive loop to probe for physical files
+function findFirstExistingPath(tryPaths, readJson, fileExists, doneCallback, index, mainFields) {
+    if (index === void 0) { index = 0; }
+    if (mainFields === void 0) { mainFields = ["main"]; }
+    var tryPath = tryPaths[index];
+    if (tryPath.type === "file" ||
+        tryPath.type === "extension" ||
+        tryPath.type === "index") {
+        fileExists(tryPath.path, function (err, exists) {
+            if (err) {
+                return doneCallback(err);
+            }
+            if (exists) {
+                // Not sure why we don't just return the full path? Why strip it?
+                return doneCallback(undefined, TryPath.getStrippedPath(tryPath));
+            }
+            if (index === tryPaths.length - 1) {
+                return doneCallback();
+            }
+            // Continue with the next path
+            return findFirstExistingPath(tryPaths, readJson, fileExists, doneCallback, index + 1, mainFields);
+        });
+    }
+    else if (tryPath.type === "package") {
+        readJson(tryPath.path, function (err, packageJson) {
+            if (err) {
+                return doneCallback(err);
+            }
+            if (packageJson) {
+                return findFirstExistingMainFieldMappedFile(packageJson, mainFields, tryPath.path, fileExists, function (mainFieldErr, mainFieldMappedFile) {
+                    if (mainFieldErr) {
+                        return doneCallback(mainFieldErr);
+                    }
+                    if (mainFieldMappedFile) {
+                        // Not sure why we don't just return the full path? Why strip it?
+                        return doneCallback(undefined, Filesystem.removeExtension(mainFieldMappedFile));
+                    }
+                    // No field in package json was a valid option. Continue with the next path.
+                    return findFirstExistingPath(tryPaths, readJson, fileExists, doneCallback, index + 1, mainFields);
+                });
+            }
+            // This is async code, we need to return unconditionally, otherwise the code still falls
+            // through and keeps recursing. While this might work in general, libraries that use neo-async
+            // like Webpack will actually not allow you to call the same callback twice.
+            //
+            // An example of where this caused issues:
+            // https://github.com/dividab/tsconfig-paths-webpack-plugin/issues/11
+            //
+            // Continue with the next path
+            return findFirstExistingPath(tryPaths, readJson, fileExists, doneCallback, index + 1, mainFields);
+        });
+    }
+    else {
+        TryPath.exhaustiveTypeException(tryPath.type);
+    }
+}
diff --git a/node_modules/tsconfig-paths/lib/match-path-sync.d.ts b/node_modules/tsconfig-paths/lib/match-path-sync.d.ts
new file mode 100644
index 0000000..090d438
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/match-path-sync.d.ts
@@ -0,0 +1,30 @@
+import * as Filesystem from "./filesystem";
+import * as MappingEntry from "./mapping-entry";
+/**
+ * Function that can match a path
+ */
+export interface MatchPath {
+    (requestedModule: string, readJson?: Filesystem.ReadJsonSync, fileExists?: (name: string) => boolean, extensions?: ReadonlyArray<string>): string | undefined;
+}
+/**
+ * Creates a function that can resolve paths according to tsconfig paths property.
+ * @param absoluteBaseUrl Absolute version of baseUrl as specified in tsconfig.
+ * @param paths The paths as specified in tsconfig.
+ * @param mainFields A list of package.json field names to try when resolving module files.
+ * @param addMatchAll Add a match-all "*" rule if none is present
+ * @returns a function that can resolve paths.
+ */
+export declare function createMatchPath(absoluteBaseUrl: string, paths: {
+    [key: string]: Array<string>;
+}, mainFields?: string[], addMatchAll?: boolean): MatchPath;
+/**
+ * Finds a path from tsconfig that matches a module load request.
+ * @param absolutePathMappings The paths to try as specified in tsconfig but resolved to absolute form.
+ * @param requestedModule The required module name.
+ * @param readJson Function that can read json from a path (useful for testing).
+ * @param fileExists Function that checks for existance of a file at a path (useful for testing).
+ * @param extensions File extensions to probe for (useful for testing).
+ * @param mainFields A list of package.json field names to try when resolving module files.
+ * @returns the found path, or undefined if no path was found.
+ */
+export declare function matchFromAbsolutePaths(absolutePathMappings: ReadonlyArray<MappingEntry.MappingEntry>, requestedModule: string, readJson?: Filesystem.ReadJsonSync, fileExists?: Filesystem.FileExistsSync, extensions?: Array<string>, mainFields?: string[]): string | undefined;
diff --git a/node_modules/tsconfig-paths/lib/match-path-sync.js b/node_modules/tsconfig-paths/lib/match-path-sync.js
new file mode 100644
index 0000000..b701337
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/match-path-sync.js
@@ -0,0 +1,87 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var path = require("path");
+var Filesystem = require("./filesystem");
+var MappingEntry = require("./mapping-entry");
+var TryPath = require("./try-path");
+/**
+ * Creates a function that can resolve paths according to tsconfig paths property.
+ * @param absoluteBaseUrl Absolute version of baseUrl as specified in tsconfig.
+ * @param paths The paths as specified in tsconfig.
+ * @param mainFields A list of package.json field names to try when resolving module files.
+ * @param addMatchAll Add a match-all "*" rule if none is present
+ * @returns a function that can resolve paths.
+ */
+function createMatchPath(absoluteBaseUrl, paths, mainFields, addMatchAll) {
+    if (mainFields === void 0) { mainFields = ["main"]; }
+    if (addMatchAll === void 0) { addMatchAll = true; }
+    var absolutePaths = MappingEntry.getAbsoluteMappingEntries(absoluteBaseUrl, paths, addMatchAll);
+    return function (requestedModule, readJson, fileExists, extensions) {
+        return matchFromAbsolutePaths(absolutePaths, requestedModule, readJson, fileExists, extensions, mainFields);
+    };
+}
+exports.createMatchPath = createMatchPath;
+/**
+ * Finds a path from tsconfig that matches a module load request.
+ * @param absolutePathMappings The paths to try as specified in tsconfig but resolved to absolute form.
+ * @param requestedModule The required module name.
+ * @param readJson Function that can read json from a path (useful for testing).
+ * @param fileExists Function that checks for existance of a file at a path (useful for testing).
+ * @param extensions File extensions to probe for (useful for testing).
+ * @param mainFields A list of package.json field names to try when resolving module files.
+ * @returns the found path, or undefined if no path was found.
+ */
+function matchFromAbsolutePaths(absolutePathMappings, requestedModule, readJson, fileExists, extensions, mainFields) {
+    if (readJson === void 0) { readJson = Filesystem.readJsonFromDiskSync; }
+    if (fileExists === void 0) { fileExists = Filesystem.fileExistsSync; }
+    if (extensions === void 0) { extensions = Object.keys(require.extensions); }
+    if (mainFields === void 0) { mainFields = ["main"]; }
+    var tryPaths = TryPath.getPathsToTry(extensions, absolutePathMappings, requestedModule);
+    if (!tryPaths) {
+        return undefined;
+    }
+    return findFirstExistingPath(tryPaths, readJson, fileExists, mainFields);
+}
+exports.matchFromAbsolutePaths = matchFromAbsolutePaths;
+function findFirstExistingMainFieldMappedFile(packageJson, mainFields, packageJsonPath, fileExists) {
+    for (var index = 0; index < mainFields.length; index++) {
+        var mainFieldName = mainFields[index];
+        var candidateMapping = packageJson[mainFieldName];
+        if (candidateMapping && typeof candidateMapping === "string") {
+            var candidateFilePath = path.join(path.dirname(packageJsonPath), candidateMapping);
+            if (fileExists(candidateFilePath)) {
+                return candidateFilePath;
+            }
+        }
+    }
+    return undefined;
+}
+function findFirstExistingPath(tryPaths, readJson, fileExists, mainFields) {
+    if (readJson === void 0) { readJson = Filesystem.readJsonFromDiskSync; }
+    if (mainFields === void 0) { mainFields = ["main"]; }
+    for (var _i = 0, tryPaths_1 = tryPaths; _i < tryPaths_1.length; _i++) {
+        var tryPath = tryPaths_1[_i];
+        if (tryPath.type === "file" ||
+            tryPath.type === "extension" ||
+            tryPath.type === "index") {
+            if (fileExists(tryPath.path)) {
+                // Not sure why we don't just return the full path? Why strip it?
+                return TryPath.getStrippedPath(tryPath);
+            }
+        }
+        else if (tryPath.type === "package") {
+            var packageJson = readJson(tryPath.path);
+            if (packageJson) {
+                var mainFieldMappedFile = findFirstExistingMainFieldMappedFile(packageJson, mainFields, tryPath.path, fileExists);
+                if (mainFieldMappedFile) {
+                    // Not sure why we don't just return the full path? Why strip it?
+                    return Filesystem.removeExtension(mainFieldMappedFile);
+                }
+            }
+        }
+        else {
+            TryPath.exhaustiveTypeException(tryPath.type);
+        }
+    }
+    return undefined;
+}
diff --git a/node_modules/tsconfig-paths/lib/options.d.ts b/node_modules/tsconfig-paths/lib/options.d.ts
new file mode 100644
index 0000000..dc7748e
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/options.d.ts
@@ -0,0 +1,4 @@
+export interface Options {
+    cwd: string;
+}
+export declare const options: Options;
diff --git a/node_modules/tsconfig-paths/lib/options.js b/node_modules/tsconfig-paths/lib/options.js
new file mode 100644
index 0000000..2581f9a
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/options.js
@@ -0,0 +1,13 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var minimist = require("minimist");
+var argv = minimist(process.argv.slice(2), {
+    string: ["project"],
+    alias: {
+        project: ["P"]
+    }
+});
+var project = argv && argv.project;
+exports.options = {
+    cwd: project || process.cwd()
+};
diff --git a/node_modules/tsconfig-paths/lib/register.d.ts b/node_modules/tsconfig-paths/lib/register.d.ts
new file mode 100644
index 0000000..7487226
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/register.d.ts
@@ -0,0 +1,6 @@
+import { ExplicitParams } from "./config-loader";
+/**
+ * Installs a custom module load function that can adhere to paths in tsconfig.
+ * Returns a function to undo paths registration.
+ */
+export declare function register(explicitParams: ExplicitParams): () => void;
diff --git a/node_modules/tsconfig-paths/lib/register.js b/node_modules/tsconfig-paths/lib/register.js
new file mode 100644
index 0000000..c12b996
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/register.js
@@ -0,0 +1,82 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var match_path_sync_1 = require("./match-path-sync");
+var config_loader_1 = require("./config-loader");
+var options_1 = require("./options");
+var noOp = function () { return void 0; };
+function getCoreModules(builtinModules) {
+    builtinModules = builtinModules || [
+        "assert",
+        "buffer",
+        "child_process",
+        "cluster",
+        "crypto",
+        "dgram",
+        "dns",
+        "domain",
+        "events",
+        "fs",
+        "http",
+        "https",
+        "net",
+        "os",
+        "path",
+        "punycode",
+        "querystring",
+        "readline",
+        "stream",
+        "string_decoder",
+        "tls",
+        "tty",
+        "url",
+        "util",
+        "v8",
+        "vm",
+        "zlib"
+    ];
+    var coreModules = {};
+    for (var _i = 0, builtinModules_1 = builtinModules; _i < builtinModules_1.length; _i++) {
+        var module_1 = builtinModules_1[_i];
+        coreModules[module_1] = true;
+    }
+    return coreModules;
+}
+/**
+ * Installs a custom module load function that can adhere to paths in tsconfig.
+ * Returns a function to undo paths registration.
+ */
+function register(explicitParams) {
+    var configLoaderResult = config_loader_1.configLoader({
+        cwd: options_1.options.cwd,
+        explicitParams: explicitParams
+    });
+    if (configLoaderResult.resultType === "failed") {
+        console.warn(configLoaderResult.message + ". tsconfig-paths will be skipped");
+        return noOp;
+    }
+    var matchPath = match_path_sync_1.createMatchPath(configLoaderResult.absoluteBaseUrl, configLoaderResult.paths, configLoaderResult.mainFields, configLoaderResult.addMatchAll);
+    // Patch node's module loading
+    // tslint:disable-next-line:no-require-imports variable-name
+    var Module = require("module");
+    var originalResolveFilename = Module._resolveFilename;
+    var coreModules = getCoreModules(Module.builtinModules);
+    // tslint:disable-next-line:no-any
+    Module._resolveFilename = function (request, _parent) {
+        var isCoreModule = coreModules.hasOwnProperty(request);
+        if (!isCoreModule) {
+            var found = matchPath(request);
+            if (found) {
+                var modifiedArguments = [found].concat([].slice.call(arguments, 1)); // Passes all arguments. Even those that is not specified above.
+                // tslint:disable-next-line:no-invalid-this
+                return originalResolveFilename.apply(this, modifiedArguments);
+            }
+        }
+        // tslint:disable-next-line:no-invalid-this
+        return originalResolveFilename.apply(this, arguments);
+    };
+    return function () {
+        // Return node's module loading to original state.
+        Module._resolveFilename = originalResolveFilename;
+    };
+}
+exports.register = register;
diff --git a/node_modules/tsconfig-paths/lib/try-path.d.ts b/node_modules/tsconfig-paths/lib/try-path.d.ts
new file mode 100644
index 0000000..5130fc5
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/try-path.d.ts
@@ -0,0 +1,15 @@
+import { MappingEntry } from "./mapping-entry";
+export interface TryPath {
+    readonly type: "file" | "extension" | "index" | "package";
+    readonly path: string;
+}
+/**
+ * Builds a list of all physical paths to try by:
+ * 1. Check for file named exactly as request.
+ * 2. Check for files named as request ending in any of the extensions.
+ * 3. Check for file specified in package.json's main property.
+ * 4. Check for files named as request ending in "index" with any of the extensions.
+ */
+export declare function getPathsToTry(extensions: ReadonlyArray<string>, absolutePathMappings: ReadonlyArray<MappingEntry>, requestedModule: string): ReadonlyArray<TryPath> | undefined;
+export declare function getStrippedPath(tryPath: TryPath): string;
+export declare function exhaustiveTypeException(check: never): never;
diff --git a/node_modules/tsconfig-paths/lib/try-path.js b/node_modules/tsconfig-paths/lib/try-path.js
new file mode 100644
index 0000000..26d4b21
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/try-path.js
@@ -0,0 +1,91 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var path = require("path");
+var path_1 = require("path");
+var filesystem_1 = require("./filesystem");
+/**
+ * Builds a list of all physical paths to try by:
+ * 1. Check for file named exactly as request.
+ * 2. Check for files named as request ending in any of the extensions.
+ * 3. Check for file specified in package.json's main property.
+ * 4. Check for files named as request ending in "index" with any of the extensions.
+ */
+function getPathsToTry(extensions, absolutePathMappings, requestedModule) {
+    if (!absolutePathMappings ||
+        !requestedModule ||
+        requestedModule[0] === "." ||
+        requestedModule[0] === path.sep) {
+        return undefined;
+    }
+    var pathsToTry = [];
+    for (var _i = 0, absolutePathMappings_1 = absolutePathMappings; _i < absolutePathMappings_1.length; _i++) {
+        var entry = absolutePathMappings_1[_i];
+        var starMatch = entry.pattern === requestedModule
+            ? ""
+            : matchStar(entry.pattern, requestedModule);
+        if (starMatch !== undefined) {
+            var _loop_1 = function (physicalPathPattern) {
+                var physicalPath = physicalPathPattern.replace("*", starMatch);
+                pathsToTry.push({ type: "file", path: physicalPath });
+                pathsToTry.push.apply(pathsToTry, extensions.map(function (e) { return ({ type: "extension", path: physicalPath + e }); }));
+                pathsToTry.push({
+                    type: "package",
+                    path: path.join(physicalPath, "/package.json")
+                });
+                var indexPath = path.join(physicalPath, "/index");
+                pathsToTry.push.apply(pathsToTry, extensions.map(function (e) { return ({ type: "index", path: indexPath + e }); }));
+            };
+            for (var _a = 0, _b = entry.paths; _a < _b.length; _a++) {
+                var physicalPathPattern = _b[_a];
+                _loop_1(physicalPathPattern);
+            }
+        }
+    }
+    return pathsToTry.length === 0 ? undefined : pathsToTry;
+}
+exports.getPathsToTry = getPathsToTry;
+// Not sure why we don't just return the full found path?
+function getStrippedPath(tryPath) {
+    return tryPath.type === "index"
+        ? path_1.dirname(tryPath.path)
+        : tryPath.type === "file"
+            ? tryPath.path
+            : tryPath.type === "extension"
+                ? filesystem_1.removeExtension(tryPath.path)
+                : tryPath.type === "package"
+                    ? tryPath.path
+                    : exhaustiveTypeException(tryPath.type);
+}
+exports.getStrippedPath = getStrippedPath;
+function exhaustiveTypeException(check) {
+    throw new Error("Unknown type " + check);
+}
+exports.exhaustiveTypeException = exhaustiveTypeException;
+/**
+ * Matches pattern with a single star against search.
+ * Star must match at least one character to be considered a match.
+ * @param patttern for example "foo*"
+ * @param search for example "fooawesomebar"
+ * @returns the part of search that * matches, or undefined if no match.
+ */
+function matchStar(pattern, search) {
+    if (search.length < pattern.length) {
+        return undefined;
+    }
+    if (pattern === "*") {
+        return search;
+    }
+    var star = pattern.indexOf("*");
+    if (star === -1) {
+        return undefined;
+    }
+    var part1 = pattern.substring(0, star);
+    var part2 = pattern.substring(star + 1);
+    if (search.substr(0, star) !== part1) {
+        return undefined;
+    }
+    if (search.substr(search.length - part2.length) !== part2) {
+        return undefined;
+    }
+    return search.substr(star, search.length - part2.length);
+}
diff --git a/node_modules/tsconfig-paths/lib/tsconfig-loader.d.ts b/node_modules/tsconfig-paths/lib/tsconfig-loader.d.ts
new file mode 100644
index 0000000..bcf5ace
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/tsconfig-loader.d.ts
@@ -0,0 +1,28 @@
+/**
+ * Typing for the parts of tsconfig that we care about
+ */
+export interface Tsconfig {
+    extends?: string;
+    compilerOptions?: {
+        baseUrl?: string;
+        paths?: {
+            [key: string]: Array<string>;
+        };
+        strict?: boolean;
+    };
+}
+export interface TsConfigLoaderResult {
+    tsConfigPath: string | undefined;
+    baseUrl: string | undefined;
+    paths: {
+        [key: string]: Array<string>;
+    } | undefined;
+}
+export interface TsConfigLoaderParams {
+    getEnv: (key: string) => string | undefined;
+    cwd: string;
+    loadSync?(cwd: string, filename?: string): TsConfigLoaderResult;
+}
+export declare function tsConfigLoader({ getEnv, cwd, loadSync }: TsConfigLoaderParams): TsConfigLoaderResult;
+export declare function walkForTsConfig(directory: string, existsSync?: (path: string) => boolean): string | undefined;
+export declare function loadTsconfig(configFilePath: string, existsSync?: (path: string) => boolean, readFileSync?: (filename: string) => string): Tsconfig | undefined;
diff --git a/node_modules/tsconfig-paths/lib/tsconfig-loader.js b/node_modules/tsconfig-paths/lib/tsconfig-loader.js
new file mode 100644
index 0000000..684247d
--- /dev/null
+++ b/node_modules/tsconfig-paths/lib/tsconfig-loader.js
@@ -0,0 +1,97 @@
+"use strict";
+var __assign = (this && this.__assign) || Object.assign || function(t) {
+    for (var s, i = 1, n = arguments.length; i < n; i++) {
+        s = arguments[i];
+        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+            t[p] = s[p];
+    }
+    return t;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var path = require("path");
+var fs = require("fs");
+// tslint:disable:no-require-imports
+var JSON5 = require("json5");
+var StripBom = require("strip-bom");
+function tsConfigLoader(_a) {
+    var getEnv = _a.getEnv, cwd = _a.cwd, _b = _a.loadSync, loadSync = _b === void 0 ? loadSyncDefault : _b;
+    var TS_NODE_PROJECT = getEnv("TS_NODE_PROJECT");
+    // tsconfig.loadSync handles if TS_NODE_PROJECT is a file or directory
+    var loadResult = loadSync(cwd, TS_NODE_PROJECT);
+    return loadResult;
+}
+exports.tsConfigLoader = tsConfigLoader;
+function loadSyncDefault(cwd, filename) {
+    // Tsconfig.loadSync uses path.resolve. This is why we can use an absolute path as filename
+    var configPath = resolveConfigPath(cwd, filename);
+    if (!configPath) {
+        return {
+            tsConfigPath: undefined,
+            baseUrl: undefined,
+            paths: undefined
+        };
+    }
+    var config = loadTsconfig(configPath);
+    return {
+        tsConfigPath: configPath,
+        baseUrl: config && config.compilerOptions && config.compilerOptions.baseUrl,
+        paths: config && config.compilerOptions && config.compilerOptions.paths
+    };
+}
+function resolveConfigPath(cwd, filename) {
+    if (filename) {
+        var absolutePath = fs.lstatSync(filename).isDirectory()
+            ? path.resolve(filename, "./tsconfig.json")
+            : path.resolve(cwd, filename);
+        return absolutePath;
+    }
+    if (fs.statSync(cwd).isFile()) {
+        return path.resolve(cwd);
+    }
+    var configAbsolutePath = walkForTsConfig(cwd);
+    return configAbsolutePath ? path.resolve(configAbsolutePath) : undefined;
+}
+function walkForTsConfig(directory, existsSync) {
+    if (existsSync === void 0) { existsSync = fs.existsSync; }
+    var configPath = path.join(directory, "./tsconfig.json");
+    if (existsSync(configPath)) {
+        return configPath;
+    }
+    var parentDirectory = path.join(directory, "../");
+    // If we reached the top
+    if (directory === parentDirectory) {
+        return undefined;
+    }
+    return walkForTsConfig(parentDirectory, existsSync);
+}
+exports.walkForTsConfig = walkForTsConfig;
+function loadTsconfig(configFilePath, existsSync, readFileSync) {
+    if (existsSync === void 0) { existsSync = fs.existsSync; }
+    if (readFileSync === void 0) { readFileSync = function (filename) {
+        return fs.readFileSync(filename, "utf8");
+    }; }
+    if (!existsSync(configFilePath)) {
+        return undefined;
+    }
+    var configString = readFileSync(configFilePath);
+    var cleanedJson = StripBom(configString);
+    var config = JSON5.parse(cleanedJson);
+    var extendedConfig = config.extends;
+    if (extendedConfig) {
+        if (typeof extendedConfig === "string" &&
+            extendedConfig.indexOf(".json") === -1) {
+            extendedConfig += ".json";
+        }
+        var currentDir = path.dirname(configFilePath);
+        var base = loadTsconfig(path.join(currentDir, extendedConfig), existsSync, readFileSync) || {};
+        // baseUrl should be interpreted as relative to the base tsconfig,
+        // but we need to update it so it is relative to the original tsconfig being loaded
+        if (base && base.compilerOptions && base.compilerOptions.baseUrl) {
+            var extendsDir = path.dirname(extendedConfig);
+            base.compilerOptions.baseUrl = path.join(extendsDir, base.compilerOptions.baseUrl);
+        }
+        return __assign({}, base, config, { compilerOptions: __assign({}, base.compilerOptions, config.compilerOptions) });
+    }
+    return config;
+}
+exports.loadTsconfig = loadTsconfig;
diff --git a/node_modules/tsconfig-paths/node_modules/.bin/json5 b/node_modules/tsconfig-paths/node_modules/.bin/json5
new file mode 120000
index 0000000..217f379
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/.bin/json5
@@ -0,0 +1 @@
+../json5/lib/cli.js
\ No newline at end of file
diff --git a/node_modules/tsconfig-paths/node_modules/json5/CHANGELOG.md b/node_modules/tsconfig-paths/node_modules/json5/CHANGELOG.md
new file mode 100644
index 0000000..be9e98d
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/CHANGELOG.md
@@ -0,0 +1,274 @@
+### v1.0.1 [[code][c1.0.1], [diff][d1.0.1]]
+
+[c1.0.1]: https://github.com/json5/json5/tree/v1.0.1
+[d1.0.1]: https://github.com/json5/json5/compare/v1.0.0...v1.0.1
+
+This release includes a bug fix and minor change.
+
+- Fix: `parse` throws on unclosed objects and arrays.
+
+- New: `package.json5` has been removed until an easier way to keep it in sync
+  with `package.json` is found.
+
+
+### v1.0.0 [[code][c1.0.0], [diff][d1.0.0]]
+
+[c1.0.0]: https://github.com/json5/json5/tree/v1.0.0
+[d1.0.0]: https://github.com/json5/json5/compare/v0.5.1...v1.0.0
+
+This release includes major internal changes and public API enhancements.
+
+- **Major** JSON5 officially supports Node.js v4 and later. Support for Node.js
+  v0.10 and v0.12 have been dropped.
+
+- New: Unicode property names and Unicode escapes in property names are
+  supported. ([#1])
+
+- New: `stringify` outputs trailing commas in objects and arrays when a `space`
+  option is provided. ([#66])
+
+- New: JSON5 allows line and paragraph separator characters (U+2028 and U+2029)
+  in strings in order to be compatible with JSON. However, ES5 does not allow
+  these characters in strings, so JSON5 gives a warning when they are parsed and
+  escapes them when they are stringified. ([#70])
+
+- New: `stringify` accepts an options object as its second argument. The
+  supported options are `replacer`, `space`, and a new `quote` option that
+  specifies the quote character used in strings. ([#71])
+
+- New: The CLI supports STDIN and STDOUT and adds `--out-file`, `--space`, and
+  `--validate` options. See `json5 --help` for more information. ([#72], [#84],
+  and [#108])
+
+- New: In addition to the white space characters space `\t`, `\v`, `\f`, `\n`,
+  `\r`, and `\xA0`, the additional white space characters `\u2028`, `\u2029`,
+  and all other characters in the Space Separator Unicode category are allowed.
+
+- New: In addition to the character escapes `\'`, `\"`, `\\`, `\b`, `\f`, `\n`,
+  `\r`, and `\t`, the additional character escapes `\v` and `\0`, hexadecimal
+  escapes like `\x0F`, and unnecessary escapes like `\a` are allowed in string
+  values and string property names.
+
+- New: `stringify` outputs strings with single quotes by default but
+  intelligently uses double quotes if there are more single quotes than double
+  quotes inside the string. (i.e. `stringify('Stay here.')` outputs
+  `'Stay here.'` while `stringify('Let\'s go.')` outputs `"Let's go."`)
+
+- New: When a character is not allowed in a string, `stringify` outputs a
+  character escape like `\t` when available, a hexadecimal escape like `\x0F`
+  when the Unicode code point is less than 256, or a Unicode character escape
+  like `\u01FF`, in that order.
+
+- New: `stringify` checks for a `toJSON5` method on objects and, if it exists,
+  stringifies its return value instead of the object. `toJSON5` overrides
+  `toJSON` if they both exist.
+
+- New: To `require` or `import` JSON5 files, use `require('json5/lib/register')`
+  or `import 'json5/lib/register'`. Previous versions used `json5/lib/require`,
+  which still exists for backward compatibility but is deprecated and will give
+  a warning.
+
+- New: To use JSON5 in browsers, use the file at `dist/index.js` or
+  `https://unpkg.com/json5@^1.0.0`.
+
+- Fix: `stringify` properly outputs `Infinity` and `NaN`. ([#67])
+
+- Fix: `isWord` no longer becomes a property of `JSON5` after calling
+  `stringify`. ([#68] and [#89])
+
+- Fix: `stringify` no longer throws when an object does not have a `prototype`.
+  ([#154])
+
+- Fix: `stringify` properly handles the `key` argument of `toJSON(key)` methods.
+  `toJSON5(key)` follows this pattern.
+
+- Fix: `stringify` accepts `Number` and `String` objects as its `space`
+  argument.
+
+- Fix: In addition to a function, `stringify` also accepts an array of keys to
+  include in the output as its `replacer` argument. Numbers, `Number` objects,
+  and `String` objects will be converted to a string if they are given as array
+  values.
+
+
+### v0.5.1 [[code][c0.5.1], [diff][d0.5.1]]
+
+[c0.5.1]: https://github.com/json5/json5/tree/v0.5.1
+[d0.5.1]: https://github.com/json5/json5/compare/v0.5.0...v0.5.1
+
+This release includes a minor fix for indentations when stringifying empty
+arrays.
+
+- Fix: Indents no longer appear in empty arrays when stringified. ([#134])
+
+
+### v0.5.0 [[code][c0.5.0], [diff][d0.5.0]]
+
+[c0.5.0]: https://github.com/json5/json5/tree/v0.5.0
+[d0.5.0]: https://github.com/json5/json5/compare/v0.4.0...v0.5.0
+
+This release includes major internal changes and public API enhancements.
+
+- **Major:** JSON5 officially supports Node.js v4 LTS and v5. Support for
+  Node.js v0.6 and v0.8 have been dropped, while support for v0.10 and v0.12
+  remain.
+
+- Fix: YUI Compressor no longer fails when compressing json5.js. ([#97])
+
+- New: `parse` and the CLI provide line and column numbers when displaying error
+  messages. ([#101]; awesome work by [@amb26].)
+
+
+### v0.4.0 [[code][c0.4.0], [diff][d0.4.0]]
+
+[c0.4.0]: https://github.com/json5/json5/tree/v0.4.0
+[d0.4.0]: https://github.com/json5/json5/compare/v0.2.0...v0.4.0
+
+Note that v0.3.0 was tagged, but never published to npm, so this v0.4.0
+changelog entry includes v0.3.0 features.
+
+This is a massive release that adds `stringify` support, among other things.
+
+- **Major:** `JSON5.stringify()` now exists!
+  This method is analogous to the native `JSON.stringify()`;
+  it just avoids quoting keys where possible.
+  See the [usage documentation](./README.md#usage) for more.
+  ([#32]; huge thanks and props [@aeisenberg]!)
+
+- New: `NaN` and `-NaN` are now allowed number literals.
+  ([#30]; thanks [@rowanhill].)
+
+- New: Duplicate object keys are now allowed; the last value is used.
+  This is the same behavior as JSON. ([#57]; thanks [@jordanbtucker].)
+
+- Fix: Properly handle various whitespace and newline cases now.
+  E.g. JSON5 now properly supports escaped CR and CRLF newlines in strings,
+  and JSON5 now accepts the same whitespace as JSON (stricter than ES5).
+  ([#58], [#60], and [#63]; thanks [@jordanbtucker].)
+
+- New: Negative hexadecimal numbers (e.g. `-0xC8`) are allowed again.
+  (They were disallowed in v0.2.0; see below.)
+  It turns out they *are* valid in ES5, so JSON5 supports them now too.
+  ([#36]; thanks [@jordanbtucker]!)
+
+
+### v0.2.0 [[code][c0.2.0], [diff][d0.2.0]]
+
+[c0.2.0]: https://github.com/json5/json5/tree/v0.2.0
+[d0.2.0]: https://github.com/json5/json5/compare/v0.1.0...v0.2.0
+
+This release fixes some bugs and adds some more utility features to help you
+express data more easily:
+
+- **Breaking:** Negative hexadecimal numbers (e.g. `-0xC8`) are rejected now.
+  While V8 (e.g. Chrome and Node) supported them, it turns out they're invalid
+  in ES5. This has been [fixed in V8][v8-hex-fix] (and by extension, Chrome
+  and Node), so JSON5 officially rejects them now, too. ([#36])
+
+- New: Trailing decimal points in decimal numbers are allowed again.
+  (They were disallowed in v0.1.0; see below.)
+  They're allowed by ES5, and differentiating between integers and floats may
+  make sense on some platforms. ([#16]; thanks [@Midar].)
+
+- New: `Infinity` and `-Infinity` are now allowed number literals.
+  ([#30]; thanks [@pepkin88].)
+
+- New: Plus signs (`+`) in front of numbers are now allowed, since it can
+  be helpful in some contexts to explicitly mark numbers as positive.
+  (E.g. when a property represents changes or deltas.)
+
+- Fix: unescaped newlines in strings are rejected now.
+  ([#24]; thanks [@Midar].)
+
+
+### v0.1.0 [[code][c0.1.0], [diff][d0.1.0]]
+
+[c0.1.0]: https://github.com/json5/json5/tree/v0.1.0
+[d0.1.0]: https://github.com/json5/json5/compare/v0.0.1...v0.1.0
+
+This release tightens JSON5 support and adds helpful utility features:
+
+- New: Support hexadecimal numbers. (Thanks [@MaxNanasy].)
+
+- Fix: Reject octal numbers properly now. Previously, they were accepted but
+  improperly parsed as base-10 numbers. (Thanks [@MaxNanasy].)
+
+- **Breaking:** Reject "noctal" numbers now (base-10 numbers that begin with a
+  leading zero). These are disallowed by both JSON5 and JSON, as well as by
+  ES5's strict mode. (Thanks [@MaxNanasy].)
+
+- New: Support leading decimal points in decimal numbers.
+  (Thanks [@MaxNanasy].)
+
+- **Breaking:** Reject trailing decimal points in decimal numbers now. These
+  are disallowed by both JSON5 and JSON. (Thanks [@MaxNanasy].)
+
+- **Breaking:** Reject omitted elements in arrays now. These are disallowed by
+  both JSON5 and JSON.
+
+- Fix: Throw proper `SyntaxError` instances on errors now.
+
+- New: Add Node.js `require()` hook. Register via `json5/lib/require`.
+
+- New: Add Node.js `json5` executable to compile JSON5 files to JSON.
+
+
+### v0.0.1 [[code][c0.0.1], [diff][d0.0.1]]
+
+[c0.0.1]: https://github.com/json5/json5/tree/v0.0.1
+[d0.0.1]: https://github.com/json5/json5/compare/v0.0.0...v0.0.1
+
+This was the first implementation of this JSON5 parser.
+
+- Support unquoted object keys, including reserved words. Unicode characters
+  and escape sequences sequences aren't yet supported.
+
+- Support single-quoted strings.
+
+- Support multi-line strings.
+
+- Support trailing commas in arrays and objects.
+
+- Support comments, both inline and block.
+
+
+### v0.0.0 [[code](https://github.com/json5/json5/tree/v0.0.0)]
+
+Let's consider this to be Douglas Crockford's original [json_parse.js] — a
+parser for the regular JSON format.
+
+
+[json_parse.js]: https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js
+[v8-hex-fix]: http://code.google.com/p/v8/issues/detail?id=2240
+
+[@MaxNanasy]: https://github.com/MaxNanasy
+[@Midar]: https://github.com/Midar
+[@pepkin88]: https://github.com/pepkin88
+[@rowanhill]: https://github.com/rowanhill
+[@aeisenberg]: https://github.com/aeisenberg
+[@jordanbtucker]: https://github.com/jordanbtucker
+[@amb26]: https://github.com/amb26
+
+[#1]: https://github.com/json5/json5/issues/1
+[#16]: https://github.com/json5/json5/issues/16
+[#24]: https://github.com/json5/json5/issues/24
+[#30]: https://github.com/json5/json5/issues/30
+[#32]: https://github.com/json5/json5/issues/32
+[#36]: https://github.com/json5/json5/issues/36
+[#57]: https://github.com/json5/json5/issues/57
+[#58]: https://github.com/json5/json5/pull/58
+[#60]: https://github.com/json5/json5/pull/60
+[#63]: https://github.com/json5/json5/pull/63
+[#66]: https://github.com/json5/json5/issues/66
+[#67]: https://github.com/json5/json5/issues/67
+[#68]: https://github.com/json5/json5/issues/68
+[#70]: https://github.com/json5/json5/issues/70
+[#71]: https://github.com/json5/json5/issues/71
+[#72]: https://github.com/json5/json5/issues/72
+[#84]: https://github.com/json5/json5/pull/84
+[#89]: https://github.com/json5/json5/pull/89
+[#97]: https://github.com/json5/json5/pull/97
+[#101]: https://github.com/json5/json5/pull/101
+[#108]: https://github.com/json5/json5/pull/108
+[#134]: https://github.com/json5/json5/pull/134
+[#154]: https://github.com/json5/json5/issues/154
diff --git a/node_modules/tsconfig-paths/node_modules/json5/LICENSE.md b/node_modules/tsconfig-paths/node_modules/json5/LICENSE.md
new file mode 100644
index 0000000..2171aca
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/LICENSE.md
@@ -0,0 +1,23 @@
+MIT License
+
+Copyright (c) 2012-2018 Aseem Kishore, and [others].
+
+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.
+
+[others]: https://github.com/json5/json5/contributors
diff --git a/node_modules/tsconfig-paths/node_modules/json5/README.md b/node_modules/tsconfig-paths/node_modules/json5/README.md
new file mode 100644
index 0000000..8e03554
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/README.md
@@ -0,0 +1,234 @@
+# JSON5 – JSON for Humans
+
+[![Build Status](https://travis-ci.org/json5/json5.svg)][Build Status]
+[![Coverage
+Status](https://coveralls.io/repos/github/json5/json5/badge.svg)][Coverage
+Status]
+
+The JSON5 Data Interchange Format (JSON5) is a superset of [JSON] that aims to
+alleviate some of the limitations of JSON by expanding its syntax to include
+some productions from [ECMAScript 5.1].
+
+This JavaScript library is the official reference implementation for JSON5
+parsing and serialization libraries.
+
+[Build Status]: https://travis-ci.org/json5/json5
+
+[Coverage Status]: https://coveralls.io/github/json5/json5
+
+[JSON]: https://tools.ietf.org/html/rfc7159
+
+[ECMAScript 5.1]: https://www.ecma-international.org/ecma-262/5.1/
+
+## Summary of Features
+The following ECMAScript 5.1 features, which are not supported in JSON, have
+been extended to JSON5.
+
+### Objects
+- Object keys may be an ECMAScript 5.1 _[IdentifierName]_.
+- Objects may have a single trailing comma.
+
+### Arrays
+- Arrays may have a single trailing comma.
+
+### Strings
+- Strings may be single quoted.
+- Strings may span multiple lines by escaping new line characters.
+- Strings may include character escapes.
+
+### Numbers
+- Numbers may be hexadecimal.
+- Numbers may have a leading or trailing decimal point.
+- Numbers may be [IEEE 754] positive infinity, negative infinity, and NaN.
+- Numbers may begin with an explicit plus sign.
+
+### Comments
+- Single and multi-line comments are allowed.
+
+### White Space
+- Additional white space characters are allowed.
+
+[IdentifierName]: https://www.ecma-international.org/ecma-262/5.1/#sec-7.6
+
+[IEEE 754]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933
+
+## Short Example
+```js
+{
+  // comments
+  unquoted: 'and you can quote me on that',
+  singleQuotes: 'I can use "double quotes" here',
+  lineBreaks: "Look, Mom! \
+No \\n's!",
+  hexadecimal: 0xdecaf,
+  leadingDecimalPoint: .8675309, andTrailing: 8675309.,
+  positiveSign: +1,
+  trailingComma: 'in objects', andIn: ['arrays',],
+  "backwardsCompatible": "with JSON",
+}
+```
+
+## Specification
+For a detailed explanation of the JSON5 format, please read the [official
+specification](https://json5.github.io/json5-spec/).
+
+## Installation
+### Node.js
+```sh
+npm install json5
+```
+
+```js
+const JSON5 = require('json5')
+```
+
+### Browsers
+```html
+<script src="https://unpkg.com/json5@^1.0.0"></script>
+```
+
+This will create a global `JSON5` variable.
+
+## API
+The JSON5 API is compatible with the [JSON API].
+
+[JSON API]:
+https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON
+
+### JSON5.parse()
+Parses a JSON5 string, constructing the JavaScript value or object described by
+the string. An optional reviver function can be provided to perform a
+transformation on the resulting object before it is returned.
+
+#### Syntax
+    JSON5.parse(text[, reviver])
+
+#### Parameters
+- `text`: The string to parse as JSON5.
+- `reviver`: If a function, this prescribes how the value originally produced by
+  parsing is transformed, before being returned.
+
+#### Return value
+The object corresponding to the given JSON5 text.
+
+### JSON5.stringify()
+Converts a JavaScript value to a JSON5 string, optionally replacing values if a
+replacer function is specified, or optionally including only the specified
+properties if a replacer array is specified.
+
+#### Syntax
+    JSON5.stringify(value[, replacer[, space]])
+    JSON5.stringify(value[, options])
+
+#### Parameters
+- `value`: The value to convert to a JSON5 string.
+- `replacer`: A function that alters the behavior of the stringification
+  process, or an array of String and Number objects that serve as a whitelist
+  for selecting/filtering the properties of the value object to be included in
+  the JSON5 string. If this value is null or not provided, all properties of the
+  object are included in the resulting JSON5 string.
+- `space`: A String or Number object that's used to insert white space into the
+  output JSON5 string for readability purposes. If this is a Number, it
+  indicates the number of space characters to use as white space; this number is
+  capped at 10 (if it is greater, the value is just 10). Values less than 1
+  indicate that no space should be used. If this is a String, the string (or the
+  first 10 characters of the string, if it's longer than that) is used as white
+  space. If this parameter is not provided (or is null), no white space is used.
+  If white space is used, trailing commas will be used in objects and arrays.
+- `options`: An object with the following properties:
+  - `replacer`: Same as the `replacer` parameter.
+  - `space`: Same as the `space` parameter.
+  - `quote`: A String representing the quote character to use when serializing
+    strings.
+
+#### Return value
+A JSON5 string representing the value.
+
+### Node.js `require()` JSON5 files
+When using Node.js, you can `require()` JSON5 files by adding the following
+statement.
+
+```js
+require('json5/lib/register')
+```
+
+Then you can load a JSON5 file with a Node.js `require()` statement. For
+example:
+
+```js
+const config = require('./config.json5')
+```
+
+## CLI
+Since JSON is more widely used than JSON5, this package includes a CLI for
+converting JSON5 to JSON and for validating the syntax of JSON5 documents.
+
+### Installation
+```sh
+npm install --global json5
+```
+
+### Usage
+```sh
+json5 [options] <file>
+```
+
+If `<file>` is not provided, then STDIN is used.
+
+#### Options:
+- `-s`, `--space`: The number of spaces to indent or `t` for tabs
+- `-o`, `--out-file [file]`: Output to the specified file, otherwise STDOUT
+- `-v`, `--validate`: Validate JSON5 but do not output JSON
+- `-V`, `--version`: Output the version number
+- `-h`, `--help`: Output usage information
+
+## Contibuting
+### Development
+```sh
+git clone https://github.com/json5/json5
+cd json5
+npm install
+```
+
+When contributing code, please write relevant tests and run `npm test` and `npm
+run lint` before submitting pull requests. Please use an editor that supports
+[EditorConfig](http://editorconfig.org/).
+
+### Issues
+To report bugs or request features regarding the JSON5 data format, please
+submit an issue to the [official specification
+repository](https://github.com/json5/json5-spec).
+
+To report bugs or request features regarding the JavaScript implentation of
+JSON5, please submit an issue to this repository.
+
+## License
+MIT. See [LICENSE.md](./LICENSE.md) for details.
+
+## Credits
+[Assem Kishore](https://github.com/aseemk) founded this project.
+
+[Michael Bolin](http://bolinfest.com/) independently arrived at and published
+some of these same ideas with awesome explanations and detail. Recommended
+reading: [Suggested Improvements to JSON](http://bolinfest.com/essays/json.html)
+
+[Douglas Crockford](http://www.crockford.com/) of course designed and built
+JSON, but his state machine diagrams on the [JSON website](http://json.org/), as
+cheesy as it may sound, gave us motivation and confidence that building a new
+parser to implement these ideas was within reach! The original
+implementation of JSON5 was also modeled directly off of Doug’s open-source
+[json_parse.js] parser. We’re grateful for that clean and well-documented
+code.
+
+[json_parse.js]:
+https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js
+
+[Max Nanasy](https://github.com/MaxNanasy) has been an early and prolific
+supporter, contributing multiple patches and ideas.
+
+[Andrew Eisenberg](https://github.com/aeisenberg) contributed the original
+`stringify` method.
+
+[Jordan Tucker](https://github.com/jordanbtucker) has aligned JSON5 more closely
+with ES5, wrote the official JSON5 specification, completely rewrote the
+codebase from the ground up, and is actively maintaining this project.
diff --git a/node_modules/tsconfig-paths/node_modules/json5/dist/index.js b/node_modules/tsconfig-paths/node_modules/json5/dist/index.js
new file mode 100644
index 0000000..bfc960b
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/dist/index.js
@@ -0,0 +1 @@
+!function(u,D){"object"==typeof exports&&"undefined"!=typeof module?module.exports=D():"function"==typeof define&&define.amd?define(D):u.JSON5=D()}(this,function(){"use strict";var u,D,F=(function(u,D){Object.defineProperty(D,"__esModule",{value:!0});D.Space_Separator=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,D.ID_Start=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/,D.ID_Continue=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/}(u={exports:{}},u.exports),u.exports);(D=F)&&D.__esModule&&Object.prototype.hasOwnProperty.call(D,"default")&&D.default;var e=F.Space_Separator,C=F.ID_Start,A=F.ID_Continue;function r(u){return u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||C.test(u)}function t(u){return u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"‌"===u||"‍"===u||A.test(u)}function E(u){return/[0-9]/.test(u)}function n(u){return/[0-9A-Fa-f]/.test(u)}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(u){return typeof u}:function(u){return u&&"function"==typeof Symbol&&u.constructor===Symbol&&u!==Symbol.prototype?"symbol":typeof u},o=void 0,a=void 0,B=void 0,c=void 0,s=void 0,f=void 0,d=void 0,l=void 0,v=void 0;var m=void 0,p=void 0,h=void 0,y=void 0,w=void 0;function b(){for(m="default",p="",h=!1,y=1;;){w=g();var u=x[m]();if(u)return u}}function g(){if(o[c])return String.fromCodePoint(o.codePointAt(c))}function S(){var u=g();return"\n"===u?(s++,f=0):u?f+=u.length:f++,u&&(c+=u.length),u}var x={default:function(){switch(w){case"\t":case"\v":case"\f":case" ":case" ":case"\ufeff":case"\n":case"\r":case"\u2028":case"\u2029":return void S();case"/":return S(),void(m="comment");case void 0:return S(),N("eof")}if(!function(u){return e.test(u)}(w))return x[a]();S()},comment:function(){switch(w){case"*":return S(),void(m="multiLineComment");case"/":return S(),void(m="singleLineComment")}throw j(S())},multiLineComment:function(){switch(w){case"*":return S(),void(m="multiLineCommentAsterisk");case void 0:throw j(S())}S()},multiLineCommentAsterisk:function(){switch(w){case"*":return void S();case"/":return S(),void(m="default");case void 0:throw j(S())}S(),m="multiLineComment"},singleLineComment:function(){switch(w){case"\n":case"\r":case"\u2028":case"\u2029":return S(),void(m="default");case void 0:return S(),N("eof")}S()},value:function(){switch(w){case"{":case"[":return N("punctuator",S());case"n":return S(),P("ull"),N("null",null);case"t":return S(),P("rue"),N("boolean",!0);case"f":return S(),P("alse"),N("boolean",!1);case"-":case"+":return"-"===S()&&(y=-1),void(m="sign");case".":return p=S(),void(m="decimalPointLeading");case"0":return p=S(),void(m="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return p=S(),void(m="decimalInteger");case"I":return S(),P("nfinity"),N("numeric",1/0);case"N":return S(),P("aN"),N("numeric",NaN);case'"':case"'":return h='"'===S(),p="",void(m="string")}throw j(S())},identifierNameStartEscape:function(){if("u"!==w)throw j(S());S();var u=O();switch(u){case"$":case"_":break;default:if(!r(u))throw L()}p+=u,m="identifierName"},identifierName:function(){switch(w){case"$":case"_":case"‌":case"‍":return void(p+=S());case"\\":return S(),void(m="identifierNameEscape")}if(!t(w))return N("identifier",p);p+=S()},identifierNameEscape:function(){if("u"!==w)throw j(S());S();var u=O();switch(u){case"$":case"_":case"‌":case"‍":break;default:if(!t(u))throw L()}p+=u,m="identifierName"},sign:function(){switch(w){case".":return p=S(),void(m="decimalPointLeading");case"0":return p=S(),void(m="zero");case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return p=S(),void(m="decimalInteger");case"I":return S(),P("nfinity"),N("numeric",y*(1/0));case"N":return S(),P("aN"),N("numeric",NaN)}throw j(S())},zero:function(){switch(w){case".":return p+=S(),void(m="decimalPoint");case"e":case"E":return p+=S(),void(m="decimalExponent");case"x":case"X":return p+=S(),void(m="hexadecimal")}return N("numeric",0*y)},decimalInteger:function(){switch(w){case".":return p+=S(),void(m="decimalPoint");case"e":case"E":return p+=S(),void(m="decimalExponent")}if(!E(w))return N("numeric",y*Number(p));p+=S()},decimalPointLeading:function(){if(E(w))return p+=S(),void(m="decimalFraction");throw j(S())},decimalPoint:function(){switch(w){case"e":case"E":return p+=S(),void(m="decimalExponent")}return E(w)?(p+=S(),void(m="decimalFraction")):N("numeric",y*Number(p))},decimalFraction:function(){switch(w){case"e":case"E":return p+=S(),void(m="decimalExponent")}if(!E(w))return N("numeric",y*Number(p));p+=S()},decimalExponent:function(){switch(w){case"+":case"-":return p+=S(),void(m="decimalExponentSign")}if(E(w))return p+=S(),void(m="decimalExponentInteger");throw j(S())},decimalExponentSign:function(){if(E(w))return p+=S(),void(m="decimalExponentInteger");throw j(S())},decimalExponentInteger:function(){if(!E(w))return N("numeric",y*Number(p));p+=S()},hexadecimal:function(){if(n(w))return p+=S(),void(m="hexadecimalInteger");throw j(S())},hexadecimalInteger:function(){if(!n(w))return N("numeric",y*Number(p));p+=S()},string:function(){switch(w){case"\\":return S(),void(p+=function(){switch(g()){case"b":return S(),"\b";case"f":return S(),"\f";case"n":return S(),"\n";case"r":return S(),"\r";case"t":return S(),"\t";case"v":return S(),"\v";case"0":if(S(),E(g()))throw j(S());return"\0";case"x":return S(),function(){var u="",D=g();if(!n(D))throw j(S());if(u+=S(),!n(D=g()))throw j(S());return u+=S(),String.fromCodePoint(parseInt(u,16))}();case"u":return S(),O();case"\n":case"\u2028":case"\u2029":return S(),"";case"\r":return S(),"\n"===g()&&S(),"";case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case void 0:throw j(S())}return S()}());case'"':return h?(S(),N("string",p)):void(p+=S());case"'":return h?void(p+=S()):(S(),N("string",p));case"\n":case"\r":throw j(S());case"\u2028":case"\u2029":!function(u){console.warn("JSON5: '"+u+"' is not valid ECMAScript; consider escaping")}(w);break;case void 0:throw j(S())}p+=S()},start:function(){switch(w){case"{":case"[":return N("punctuator",S())}m="value"},beforePropertyName:function(){switch(w){case"$":case"_":return p=S(),void(m="identifierName");case"\\":return S(),void(m="identifierNameStartEscape");case"}":return N("punctuator",S());case'"':case"'":return h='"'===S(),void(m="string")}if(r(w))return p+=S(),void(m="identifierName");throw j(S())},afterPropertyName:function(){if(":"===w)return N("punctuator",S());throw j(S())},beforePropertyValue:function(){m="value"},afterPropertyValue:function(){switch(w){case",":case"}":return N("punctuator",S())}throw j(S())},beforeArrayValue:function(){if("]"===w)return N("punctuator",S());m="value"},afterArrayValue:function(){switch(w){case",":case"]":return N("punctuator",S())}throw j(S())},end:function(){throw j(S())}};function N(u,D){return{type:u,value:D,line:s,column:f}}function P(u){var D=!0,F=!1,e=void 0;try{for(var C,A=u[Symbol.iterator]();!(D=(C=A.next()).done);D=!0){var r=C.value;if(g()!==r)throw j(S());S()}}catch(u){F=!0,e=u}finally{try{!D&&A.return&&A.return()}finally{if(F)throw e}}}function O(){for(var u="",D=4;D-- >0;){if(!n(g()))throw j(S());u+=S()}return String.fromCodePoint(parseInt(u,16))}var I={start:function(){if("eof"===d.type)throw J();_()},beforePropertyName:function(){switch(d.type){case"identifier":case"string":return l=d.value,void(a="afterPropertyName");case"punctuator":return void V();case"eof":throw J()}},afterPropertyName:function(){if("eof"===d.type)throw J();a="beforePropertyValue"},beforePropertyValue:function(){if("eof"===d.type)throw J();_()},beforeArrayValue:function(){if("eof"===d.type)throw J();"punctuator"!==d.type||"]"!==d.value?_():V()},afterPropertyValue:function(){if("eof"===d.type)throw J();switch(d.value){case",":return void(a="beforePropertyName");case"}":V()}},afterArrayValue:function(){if("eof"===d.type)throw J();switch(d.value){case",":return void(a="beforeArrayValue");case"]":V()}},end:function(){}};function _(){var u=void 0;switch(d.type){case"punctuator":switch(d.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=d.value}if(void 0===v)v=u;else{var D=B[B.length-1];Array.isArray(D)?D.push(u):D[l]=u}if(null!==u&&"object"===(void 0===u?"undefined":i(u)))B.push(u),a=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{var F=B[B.length-1];a=null==F?"end":Array.isArray(F)?"afterArrayValue":"afterPropertyValue"}}function V(){B.pop();var u=B[B.length-1];a=null==u?"end":Array.isArray(u)?"afterArrayValue":"afterPropertyValue"}function j(u){return k(void 0===u?"JSON5: invalid end of input at "+s+":"+f:"JSON5: invalid character '"+function(u){var D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){var F=u.charCodeAt(0).toString(16);return"\\x"+("00"+F).substring(F.length)}return u}(u)+"' at "+s+":"+f)}function J(){return k("JSON5: invalid end of input at "+s+":"+f)}function L(){return k("JSON5: invalid identifier character at "+s+":"+(f-=5))}function k(u){var D=new SyntaxError(u);return D.lineNumber=s,D.columnNumber=f,D}return{parse:function(u,D){o=String(u),a="start",B=[],c=0,s=1,f=0,d=void 0,l=void 0,v=void 0;do{d=b(),I[a]()}while("eof"!==d.type);return"function"==typeof D?function u(D,F,e){var C=D[F];if(null!=C&&"object"===(void 0===C?"undefined":i(C)))for(var A in C){var r=u(C,A,e);void 0===r?delete C[A]:C[A]=r}return e.call(D,F,C)}({"":v},"",D):v},stringify:function(u,D,F){var e=[],C="",A=void 0,E=void 0,n="",o=void 0;if(null==D||"object"!==(void 0===D?"undefined":i(D))||Array.isArray(D)||(F=D.space,o=D.quote,D=D.replacer),"function"==typeof D)E=D;else if(Array.isArray(D)){A=[];var a=!0,B=!1,c=void 0;try{for(var s,f=D[Symbol.iterator]();!(a=(s=f.next()).done);a=!0){var d=s.value,l=void 0;"string"==typeof d?l=d:("number"==typeof d||d instanceof String||d instanceof Number)&&(l=String(d)),void 0!==l&&A.indexOf(l)<0&&A.push(l)}}catch(u){B=!0,c=u}finally{try{!a&&f.return&&f.return()}finally{if(B)throw c}}}return F instanceof Number?F=Number(F):F instanceof String&&(F=String(F)),"number"==typeof F?F>0&&(F=Math.min(10,Math.floor(F)),n="          ".substr(0,F)):"string"==typeof F&&(n=F.substr(0,10)),v("",{"":u});function v(u,D){var F=D[u];switch(null!=F&&("function"==typeof F.toJSON5?F=F.toJSON5(u):"function"==typeof F.toJSON&&(F=F.toJSON(u))),E&&(F=E.call(D,u,F)),F instanceof Number?F=Number(F):F instanceof String?F=String(F):F instanceof Boolean&&(F=F.valueOf()),F){case null:return"null";case!0:return"true";case!1:return"false"}return"string"==typeof F?m(F):"number"==typeof F?String(F):"object"===(void 0===F?"undefined":i(F))?Array.isArray(F)?function(u){if(e.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");e.push(u);var D=C;C+=n;for(var F=[],A=0;A<u.length;A++){var r=v(String(A),u);F.push(void 0!==r?r:"null")}var t=void 0;if(0===F.length)t="[]";else if(""===n){var E=F.join(",");t="["+E+"]"}else{var i=",\n"+C,o=F.join(i);t="[\n"+C+o+",\n"+D+"]"}return e.pop(),C=D,t}(F):function(u){if(e.indexOf(u)>=0)throw TypeError("Converting circular structure to JSON5");e.push(u);var D=C;C+=n;var F=A||Object.keys(u),r=[],t=!0,E=!1,i=void 0;try{for(var o,a=F[Symbol.iterator]();!(t=(o=a.next()).done);t=!0){var B=o.value,c=v(B,u);if(void 0!==c){var s=p(B)+":";""!==n&&(s+=" "),s+=c,r.push(s)}}}catch(u){E=!0,i=u}finally{try{!t&&a.return&&a.return()}finally{if(E)throw i}}var f=void 0;if(0===r.length)f="{}";else{var d=void 0;if(""===n)d=r.join(","),f="{"+d+"}";else{var l=",\n"+C;d=r.join(l),f="{\n"+C+d+",\n"+D+"}"}}return e.pop(),C=D,f}(F):void 0}function m(u){var D={"'":.1,'"':.2},F={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"},e="",C=!0,A=!1,r=void 0;try{for(var t,E=u[Symbol.iterator]();!(C=(t=E.next()).done);C=!0){var n=t.value;switch(n){case"'":case'"':D[n]++,e+=n;continue}if(F[n])e+=F[n];else if(n<" "){var i=n.charCodeAt(0).toString(16);e+="\\x"+("00"+i).substring(i.length)}else e+=n}}catch(u){A=!0,r=u}finally{try{!C&&E.return&&E.return()}finally{if(A)throw r}}var a=o||Object.keys(D).reduce(function(u,F){return D[u]<D[F]?u:F});return a+(e=e.replace(new RegExp(a,"g"),F[a]))+a}function p(u){if(0===u.length)return m(u);var D=String.fromCodePoint(u.codePointAt(0));if(!r(D))return m(u);for(var F=D.length;F<u.length;F++)if(!t(String.fromCodePoint(u.codePointAt(F))))return m(u);return u}}}});
diff --git a/node_modules/tsconfig-paths/node_modules/json5/lib/cli.js b/node_modules/tsconfig-paths/node_modules/json5/lib/cli.js
new file mode 100755
index 0000000..d15aef0
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/lib/cli.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+'use strict';var _fs=require('fs');var _fs2=_interopRequireDefault(_fs);var _path=require('path');var _path2=_interopRequireDefault(_path);var _minimist=require('minimist');var _minimist2=_interopRequireDefault(_minimist);var _package=require('../package.json');var _package2=_interopRequireDefault(_package);var _=require('./');var _2=_interopRequireDefault(_);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var argv=(0,_minimist2.default)(process.argv.slice(2),{alias:{'convert':'c','space':'s','validate':'v','out-file':'o','version':'V','help':'h'},boolean:['convert','validate','version','help'],string:['space','out-file']});if(argv.version){version()}else if(argv.help){usage()}else{var inFilename=argv._[0];var readStream=void 0;if(inFilename){readStream=_fs2.default.createReadStream(inFilename)}else{readStream=process.stdin}var json5='';readStream.on('data',function(data){json5+=data});readStream.on('end',function(){var space=void 0;if(argv.space==='t'||argv.space==='tab'){space='\t'}else{space=Number(argv.space)}var value=void 0;try{value=_2.default.parse(json5);if(!argv.validate){var json=JSON.stringify(value,null,space);var writeStream=void 0;if(argv.convert&&inFilename&&!argv.o){var parsedFilename=_path2.default.parse(inFilename);var outFilename=_path2.default.format(Object.assign(parsedFilename,{base:_path2.default.basename(parsedFilename.base,parsedFilename.ext)+'.json'}));writeStream=_fs2.default.createWriteStream(outFilename)}else if(argv.o){writeStream=_fs2.default.createWriteStream(argv.o)}else{writeStream=process.stdout}writeStream.write(json)}}catch(err){console.error(err.message);process.exit(1)}})}function version(){console.log(_package2.default.version)}function usage(){console.log('\n  Usage: json5 [options] <file>\n\n  If <file> is not provided, then STDIN is used.\n\n  Options:\n\n    -s, --space              The number of spaces to indent or \'t\' for tabs\n    -o, --out-file [file]    Output to the specified file, otherwise STDOUT\n    -v, --validate           Validate JSON5 but do not output JSON\n    -V, --version            Output the version number\n    -h, --help               Output usage information')}
\ No newline at end of file
diff --git a/node_modules/tsconfig-paths/node_modules/json5/lib/index.js b/node_modules/tsconfig-paths/node_modules/json5/lib/index.js
new file mode 100644
index 0000000..c943e65
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/lib/index.js
@@ -0,0 +1 @@
+'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _parse=require('./parse');var _parse2=_interopRequireDefault(_parse);var _stringify=require('./stringify');var _stringify2=_interopRequireDefault(_stringify);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}exports.default={parse:_parse2.default,stringify:_stringify2.default};module.exports=exports['default'];
\ No newline at end of file
diff --git a/node_modules/tsconfig-paths/node_modules/json5/lib/parse.js b/node_modules/tsconfig-paths/node_modules/json5/lib/parse.js
new file mode 100644
index 0000000..a1f756f
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/lib/parse.js
@@ -0,0 +1 @@
+'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _typeof=typeof Symbol==='function'&&typeof Symbol.iterator==='symbol'?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==='function'&&obj.constructor===Symbol&&obj!==Symbol.prototype?'symbol':typeof obj};exports.default=parse;var _util=require('./util');var util=_interopRequireWildcard(_util);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key]}}newObj.default=obj;return newObj}}var source=void 0;var parseState=void 0;var stack=void 0;var pos=void 0;var line=void 0;var column=void 0;var token=void 0;var key=void 0;var root=void 0;function parse(text,reviver){source=String(text);parseState='start';stack=[];pos=0;line=1;column=0;token=undefined;key=undefined;root=undefined;do{token=lex();parseStates[parseState]()}while(token.type!=='eof');if(typeof reviver==='function'){return internalize({'':root},'',reviver)}return root}function internalize(holder,name,reviver){var value=holder[name];if(value!=null&&(typeof value==='undefined'?'undefined':_typeof(value))==='object'){for(var _key in value){var replacement=internalize(value,_key,reviver);if(replacement===undefined){delete value[_key]}else{value[_key]=replacement}}}return reviver.call(holder,name,value)}var lexState=void 0;var buffer=void 0;var doubleQuote=void 0;var _sign=void 0;var c=void 0;function lex(){lexState='default';buffer='';doubleQuote=false;_sign=1;for(;;){c=peek();var _token=lexStates[lexState]();if(_token){return _token}}}function peek(){if(source[pos]){return String.fromCodePoint(source.codePointAt(pos))}}function read(){var c=peek();if(c==='\n'){line++;column=0}else if(c){column+=c.length}else{column++}if(c){pos+=c.length}return c}var lexStates={default:function _default(){switch(c){case'\t':case'\x0B':case'\f':case' ':case'\xA0':case'\uFEFF':case'\n':case'\r':case'\u2028':case'\u2029':read();return;case'/':read();lexState='comment';return;case undefined:read();return newToken('eof');}if(util.isSpaceSeparator(c)){read();return}return lexStates[parseState]()},comment:function comment(){switch(c){case'*':read();lexState='multiLineComment';return;case'/':read();lexState='singleLineComment';return;}throw invalidChar(read())},multiLineComment:function multiLineComment(){switch(c){case'*':read();lexState='multiLineCommentAsterisk';return;case undefined:throw invalidChar(read());}read()},multiLineCommentAsterisk:function multiLineCommentAsterisk(){switch(c){case'*':read();return;case'/':read();lexState='default';return;case undefined:throw invalidChar(read());}read();lexState='multiLineComment'},singleLineComment:function singleLineComment(){switch(c){case'\n':case'\r':case'\u2028':case'\u2029':read();lexState='default';return;case undefined:read();return newToken('eof');}read()},value:function value(){switch(c){case'{':case'[':return newToken('punctuator',read());case'n':read();literal('ull');return newToken('null',null);case't':read();literal('rue');return newToken('boolean',true);case'f':read();literal('alse');return newToken('boolean',false);case'-':case'+':if(read()==='-'){_sign=-1}lexState='sign';return;case'.':buffer=read();lexState='decimalPointLeading';return;case'0':buffer=read();lexState='zero';return;case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':buffer=read();lexState='decimalInteger';return;case'I':read();literal('nfinity');return newToken('numeric',Infinity);case'N':read();literal('aN');return newToken('numeric',NaN);case'"':case'\'':doubleQuote=read()==='"';buffer='';lexState='string';return;}throw invalidChar(read())},identifierNameStartEscape:function identifierNameStartEscape(){if(c!=='u'){throw invalidChar(read())}read();var u=unicodeEscape();switch(u){case'$':case'_':break;default:if(!util.isIdStartChar(u)){throw invalidIdentifier()}break;}buffer+=u;lexState='identifierName'},identifierName:function identifierName(){switch(c){case'$':case'_':case'\u200C':case'\u200D':buffer+=read();return;case'\\':read();lexState='identifierNameEscape';return;}if(util.isIdContinueChar(c)){buffer+=read();return}return newToken('identifier',buffer)},identifierNameEscape:function identifierNameEscape(){if(c!=='u'){throw invalidChar(read())}read();var u=unicodeEscape();switch(u){case'$':case'_':case'\u200C':case'\u200D':break;default:if(!util.isIdContinueChar(u)){throw invalidIdentifier()}break;}buffer+=u;lexState='identifierName'},sign:function sign(){switch(c){case'.':buffer=read();lexState='decimalPointLeading';return;case'0':buffer=read();lexState='zero';return;case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':buffer=read();lexState='decimalInteger';return;case'I':read();literal('nfinity');return newToken('numeric',_sign*Infinity);case'N':read();literal('aN');return newToken('numeric',NaN);}throw invalidChar(read())},zero:function zero(){switch(c){case'.':buffer+=read();lexState='decimalPoint';return;case'e':case'E':buffer+=read();lexState='decimalExponent';return;case'x':case'X':buffer+=read();lexState='hexadecimal';return;}return newToken('numeric',_sign*0)},decimalInteger:function decimalInteger(){switch(c){case'.':buffer+=read();lexState='decimalPoint';return;case'e':case'E':buffer+=read();lexState='decimalExponent';return;}if(util.isDigit(c)){buffer+=read();return}return newToken('numeric',_sign*Number(buffer))},decimalPointLeading:function decimalPointLeading(){if(util.isDigit(c)){buffer+=read();lexState='decimalFraction';return}throw invalidChar(read())},decimalPoint:function decimalPoint(){switch(c){case'e':case'E':buffer+=read();lexState='decimalExponent';return;}if(util.isDigit(c)){buffer+=read();lexState='decimalFraction';return}return newToken('numeric',_sign*Number(buffer))},decimalFraction:function decimalFraction(){switch(c){case'e':case'E':buffer+=read();lexState='decimalExponent';return;}if(util.isDigit(c)){buffer+=read();return}return newToken('numeric',_sign*Number(buffer))},decimalExponent:function decimalExponent(){switch(c){case'+':case'-':buffer+=read();lexState='decimalExponentSign';return;}if(util.isDigit(c)){buffer+=read();lexState='decimalExponentInteger';return}throw invalidChar(read())},decimalExponentSign:function decimalExponentSign(){if(util.isDigit(c)){buffer+=read();lexState='decimalExponentInteger';return}throw invalidChar(read())},decimalExponentInteger:function decimalExponentInteger(){if(util.isDigit(c)){buffer+=read();return}return newToken('numeric',_sign*Number(buffer))},hexadecimal:function hexadecimal(){if(util.isHexDigit(c)){buffer+=read();lexState='hexadecimalInteger';return}throw invalidChar(read())},hexadecimalInteger:function hexadecimalInteger(){if(util.isHexDigit(c)){buffer+=read();return}return newToken('numeric',_sign*Number(buffer))},string:function string(){switch(c){case'\\':read();buffer+=escape();return;case'"':if(doubleQuote){read();return newToken('string',buffer)}buffer+=read();return;case'\'':if(!doubleQuote){read();return newToken('string',buffer)}buffer+=read();return;case'\n':case'\r':throw invalidChar(read());case'\u2028':case'\u2029':separatorChar(c);break;case undefined:throw invalidChar(read());}buffer+=read()},start:function start(){switch(c){case'{':case'[':return newToken('punctuator',read());}lexState='value'},beforePropertyName:function beforePropertyName(){switch(c){case'$':case'_':buffer=read();lexState='identifierName';return;case'\\':read();lexState='identifierNameStartEscape';return;case'}':return newToken('punctuator',read());case'"':case'\'':doubleQuote=read()==='"';lexState='string';return;}if(util.isIdStartChar(c)){buffer+=read();lexState='identifierName';return}throw invalidChar(read())},afterPropertyName:function afterPropertyName(){if(c===':'){return newToken('punctuator',read())}throw invalidChar(read())},beforePropertyValue:function beforePropertyValue(){lexState='value'},afterPropertyValue:function afterPropertyValue(){switch(c){case',':case'}':return newToken('punctuator',read());}throw invalidChar(read())},beforeArrayValue:function beforeArrayValue(){if(c===']'){return newToken('punctuator',read())}lexState='value'},afterArrayValue:function afterArrayValue(){switch(c){case',':case']':return newToken('punctuator',read());}throw invalidChar(read())},end:function end(){throw invalidChar(read())}};function newToken(type,value){return{type:type,value:value,line:line,column:column}}function literal(s){var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=s[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var _c=_step.value;var p=peek();if(p!==_c){throw invalidChar(read())}read()}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}}function escape(){var c=peek();switch(c){case'b':read();return'\b';case'f':read();return'\f';case'n':read();return'\n';case'r':read();return'\r';case't':read();return'\t';case'v':read();return'\x0B';case'0':read();if(util.isDigit(peek())){throw invalidChar(read())}return'\0';case'x':read();return hexEscape();case'u':read();return unicodeEscape();case'\n':case'\u2028':case'\u2029':read();return'';case'\r':read();if(peek()==='\n'){read()}return'';case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':throw invalidChar(read());case undefined:throw invalidChar(read());}return read()}function hexEscape(){var buffer='';var c=peek();if(!util.isHexDigit(c)){throw invalidChar(read())}buffer+=read();c=peek();if(!util.isHexDigit(c)){throw invalidChar(read())}buffer+=read();return String.fromCodePoint(parseInt(buffer,16))}function unicodeEscape(){var buffer='';var count=4;while(count-->0){var _c2=peek();if(!util.isHexDigit(_c2)){throw invalidChar(read())}buffer+=read()}return String.fromCodePoint(parseInt(buffer,16))}var parseStates={start:function start(){if(token.type==='eof'){throw invalidEOF()}push()},beforePropertyName:function beforePropertyName(){switch(token.type){case'identifier':case'string':key=token.value;parseState='afterPropertyName';return;case'punctuator':pop();return;case'eof':throw invalidEOF();}},afterPropertyName:function afterPropertyName(){if(token.type==='eof'){throw invalidEOF()}parseState='beforePropertyValue'},beforePropertyValue:function beforePropertyValue(){if(token.type==='eof'){throw invalidEOF()}push()},beforeArrayValue:function beforeArrayValue(){if(token.type==='eof'){throw invalidEOF()}if(token.type==='punctuator'&&token.value===']'){pop();return}push()},afterPropertyValue:function afterPropertyValue(){if(token.type==='eof'){throw invalidEOF()}switch(token.value){case',':parseState='beforePropertyName';return;case'}':pop();}},afterArrayValue:function afterArrayValue(){if(token.type==='eof'){throw invalidEOF()}switch(token.value){case',':parseState='beforeArrayValue';return;case']':pop();}},end:function end(){}};function push(){var value=void 0;switch(token.type){case'punctuator':switch(token.value){case'{':value={};break;case'[':value=[];break;}break;case'null':case'boolean':case'numeric':case'string':value=token.value;break;}if(root===undefined){root=value}else{var parent=stack[stack.length-1];if(Array.isArray(parent)){parent.push(value)}else{parent[key]=value}}if(value!==null&&(typeof value==='undefined'?'undefined':_typeof(value))==='object'){stack.push(value);if(Array.isArray(value)){parseState='beforeArrayValue'}else{parseState='beforePropertyName'}}else{var current=stack[stack.length-1];if(current==null){parseState='end'}else if(Array.isArray(current)){parseState='afterArrayValue'}else{parseState='afterPropertyValue'}}}function pop(){stack.pop();var current=stack[stack.length-1];if(current==null){parseState='end'}else if(Array.isArray(current)){parseState='afterArrayValue'}else{parseState='afterPropertyValue'}}function invalidChar(c){if(c===undefined){return syntaxError('JSON5: invalid end of input at '+line+':'+column)}return syntaxError('JSON5: invalid character \''+formatChar(c)+'\' at '+line+':'+column)}function invalidEOF(){return syntaxError('JSON5: invalid end of input at '+line+':'+column)}function invalidIdentifier(){column-=5;return syntaxError('JSON5: invalid identifier character at '+line+':'+column)}function separatorChar(c){console.warn('JSON5: \''+c+'\' is not valid ECMAScript; consider escaping')}function formatChar(c){var replacements={'\'':'\\\'','"':'\\"','\\':'\\\\','\b':'\\b','\f':'\\f','\n':'\\n','\r':'\\r','\t':'\\t','\x0B':'\\v','\0':'\\0','\u2028':'\\u2028','\u2029':'\\u2029'};if(replacements[c]){return replacements[c]}if(c<' '){var hexString=c.charCodeAt(0).toString(16);return'\\x'+('00'+hexString).substring(hexString.length)}return c}function syntaxError(message){var err=new SyntaxError(message);err.lineNumber=line;err.columnNumber=column;return err}module.exports=exports['default'];
\ No newline at end of file
diff --git a/node_modules/tsconfig-paths/node_modules/json5/lib/register.js b/node_modules/tsconfig-paths/node_modules/json5/lib/register.js
new file mode 100644
index 0000000..aa16e96
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/lib/register.js
@@ -0,0 +1 @@
+'use strict';var _fs=require('fs');var _fs2=_interopRequireDefault(_fs);var _=require('./');var _2=_interopRequireDefault(_);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}require.extensions['.json5']=function(module,filename){var content=_fs2.default.readFileSync(filename,'utf8');try{module.exports=_2.default.parse(content)}catch(err){err.message=filename+': '+err.message;throw err}};
\ No newline at end of file
diff --git a/node_modules/tsconfig-paths/node_modules/json5/lib/require.js b/node_modules/tsconfig-paths/node_modules/json5/lib/require.js
new file mode 100644
index 0000000..dfdc039
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/lib/require.js
@@ -0,0 +1 @@
+"use strict";require("./register");console.warn("'json5/require' is deprecated. Please use 'json5/register' instead.");
\ No newline at end of file
diff --git a/node_modules/tsconfig-paths/node_modules/json5/lib/stringify.js b/node_modules/tsconfig-paths/node_modules/json5/lib/stringify.js
new file mode 100644
index 0000000..ce6917e
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/lib/stringify.js
@@ -0,0 +1 @@
+'use strict';Object.defineProperty(exports,'__esModule',{value:true});var _typeof=typeof Symbol==='function'&&typeof Symbol.iterator==='symbol'?function(obj){return typeof obj}:function(obj){return obj&&typeof Symbol==='function'&&obj.constructor===Symbol&&obj!==Symbol.prototype?'symbol':typeof obj};exports.default=stringify;var _util=require('./util');var util=_interopRequireWildcard(_util);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key]}}newObj.default=obj;return newObj}}function stringify(value,replacer,space){var stack=[];var indent='';var propertyList=void 0;var replacerFunc=void 0;var gap='';var quote=void 0;if(replacer!=null&&(typeof replacer==='undefined'?'undefined':_typeof(replacer))==='object'&&!Array.isArray(replacer)){space=replacer.space;quote=replacer.quote;replacer=replacer.replacer}if(typeof replacer==='function'){replacerFunc=replacer}else if(Array.isArray(replacer)){propertyList=[];var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=replacer[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var v=_step.value;var item=void 0;if(typeof v==='string'){item=v}else if(typeof v==='number'||v instanceof String||v instanceof Number){item=String(v)}if(item!==undefined&&propertyList.indexOf(item)<0){propertyList.push(item)}}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator.return){_iterator.return()}}finally{if(_didIteratorError){throw _iteratorError}}}}if(space instanceof Number){space=Number(space)}else if(space instanceof String){space=String(space)}if(typeof space==='number'){if(space>0){space=Math.min(10,Math.floor(space));gap='          '.substr(0,space)}}else if(typeof space==='string'){gap=space.substr(0,10)}return serializeProperty('',{'':value});function serializeProperty(key,holder){var value=holder[key];if(value!=null){if(typeof value.toJSON5==='function'){value=value.toJSON5(key)}else if(typeof value.toJSON==='function'){value=value.toJSON(key)}}if(replacerFunc){value=replacerFunc.call(holder,key,value)}if(value instanceof Number){value=Number(value)}else if(value instanceof String){value=String(value)}else if(value instanceof Boolean){value=value.valueOf()}switch(value){case null:return'null';case true:return'true';case false:return'false';}if(typeof value==='string'){return quoteString(value,false)}if(typeof value==='number'){return String(value)}if((typeof value==='undefined'?'undefined':_typeof(value))==='object'){return Array.isArray(value)?serializeArray(value):serializeObject(value)}return undefined}function quoteString(value){var quotes={'\'':0.1,'"':0.2};var replacements={'\'':'\\\'','"':'\\"','\\':'\\\\','\b':'\\b','\f':'\\f','\n':'\\n','\r':'\\r','\t':'\\t','\x0B':'\\v','\0':'\\0','\u2028':'\\u2028','\u2029':'\\u2029'};var product='';var _iteratorNormalCompletion2=true;var _didIteratorError2=false;var _iteratorError2=undefined;try{for(var _iterator2=value[Symbol.iterator](),_step2;!(_iteratorNormalCompletion2=(_step2=_iterator2.next()).done);_iteratorNormalCompletion2=true){var c=_step2.value;switch(c){case'\'':case'"':quotes[c]++;product+=c;continue;}if(replacements[c]){product+=replacements[c];continue}if(c<' '){var hexString=c.charCodeAt(0).toString(16);product+='\\x'+('00'+hexString).substring(hexString.length);continue}product+=c}}catch(err){_didIteratorError2=true;_iteratorError2=err}finally{try{if(!_iteratorNormalCompletion2&&_iterator2.return){_iterator2.return()}}finally{if(_didIteratorError2){throw _iteratorError2}}}var quoteChar=quote||Object.keys(quotes).reduce(function(a,b){return quotes[a]<quotes[b]?a:b});product=product.replace(new RegExp(quoteChar,'g'),replacements[quoteChar]);return quoteChar+product+quoteChar}function serializeObject(value){if(stack.indexOf(value)>=0){throw TypeError('Converting circular structure to JSON5')}stack.push(value);var stepback=indent;indent=indent+gap;var keys=propertyList||Object.keys(value);var partial=[];var _iteratorNormalCompletion3=true;var _didIteratorError3=false;var _iteratorError3=undefined;try{for(var _iterator3=keys[Symbol.iterator](),_step3;!(_iteratorNormalCompletion3=(_step3=_iterator3.next()).done);_iteratorNormalCompletion3=true){var key=_step3.value;var propertyString=serializeProperty(key,value);if(propertyString!==undefined){var member=serializeKey(key)+':';if(gap!==''){member+=' '}member+=propertyString;partial.push(member)}}}catch(err){_didIteratorError3=true;_iteratorError3=err}finally{try{if(!_iteratorNormalCompletion3&&_iterator3.return){_iterator3.return()}}finally{if(_didIteratorError3){throw _iteratorError3}}}var final=void 0;if(partial.length===0){final='{}'}else{var properties=void 0;if(gap===''){properties=partial.join(',');final='{'+properties+'}'}else{var separator=',\n'+indent;properties=partial.join(separator);final='{\n'+indent+properties+',\n'+stepback+'}'}}stack.pop();indent=stepback;return final}function serializeKey(key){if(key.length===0){return quoteString(key,true)}var firstChar=String.fromCodePoint(key.codePointAt(0));if(!util.isIdStartChar(firstChar)){return quoteString(key,true)}for(var i=firstChar.length;i<key.length;i++){if(!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))){return quoteString(key,true)}}return key}function serializeArray(value){if(stack.indexOf(value)>=0){throw TypeError('Converting circular structure to JSON5')}stack.push(value);var stepback=indent;indent=indent+gap;var partial=[];for(var i=0;i<value.length;i++){var propertyString=serializeProperty(String(i),value);partial.push(propertyString!==undefined?propertyString:'null')}var final=void 0;if(partial.length===0){final='[]'}else{if(gap===''){var properties=partial.join(',');final='['+properties+']'}else{var separator=',\n'+indent;var _properties=partial.join(separator);final='[\n'+indent+_properties+',\n'+stepback+']'}}stack.pop();indent=stepback;return final}}module.exports=exports['default'];
\ No newline at end of file
diff --git a/node_modules/tsconfig-paths/node_modules/json5/lib/unicode.js b/node_modules/tsconfig-paths/node_modules/json5/lib/unicode.js
new file mode 100644
index 0000000..fa664cf
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/lib/unicode.js
@@ -0,0 +1 @@
+"use strict";Object.defineProperty(exports,"__esModule",{value:true});var Space_Separator=exports.Space_Separator=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/;var ID_Start=exports.ID_Start=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/;var ID_Continue=exports.ID_Continue=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/;
\ No newline at end of file
diff --git a/node_modules/tsconfig-paths/node_modules/json5/lib/util.js b/node_modules/tsconfig-paths/node_modules/json5/lib/util.js
new file mode 100644
index 0000000..d884887
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/lib/util.js
@@ -0,0 +1 @@
+'use strict';Object.defineProperty(exports,'__esModule',{value:true});exports.isSpaceSeparator=isSpaceSeparator;exports.isIdStartChar=isIdStartChar;exports.isIdContinueChar=isIdContinueChar;exports.isDigit=isDigit;exports.isHexDigit=isHexDigit;var _unicode=require('../lib/unicode');var unicode=_interopRequireWildcard(_unicode);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key]}}newObj.default=obj;return newObj}}function isSpaceSeparator(c){return unicode.Space_Separator.test(c)}function isIdStartChar(c){return c>='a'&&c<='z'||c>='A'&&c<='Z'||c==='$'||c==='_'||unicode.ID_Start.test(c)}function isIdContinueChar(c){return c>='a'&&c<='z'||c>='A'&&c<='Z'||c>='0'&&c<='9'||c==='$'||c==='_'||c==='\u200C'||c==='\u200D'||unicode.ID_Continue.test(c)}function isDigit(c){return /[0-9]/.test(c)}function isHexDigit(c){return /[0-9A-Fa-f]/.test(c)}
\ No newline at end of file
diff --git a/node_modules/tsconfig-paths/node_modules/json5/package.json b/node_modules/tsconfig-paths/node_modules/json5/package.json
new file mode 100644
index 0000000..b51b762
--- /dev/null
+++ b/node_modules/tsconfig-paths/node_modules/json5/package.json
@@ -0,0 +1,76 @@
+{
+  "name": "json5",
+  "version": "1.0.1",
+  "description": "JSON for humans.",
+  "main": "lib/index.js",
+  "bin": "lib/cli.js",
+  "browser": "dist/index.js",
+  "files": [
+    "lib/",
+    "dist/"
+  ],
+  "scripts": {
+    "build": "babel-node build/build.js && babel src -d lib && rollup -c",
+    "coverage": "nyc report --reporter=text-lcov | coveralls",
+    "lint": "eslint --fix build src",
+    "prepublishOnly": "npm run lint && npm test && npm run production",
+    "pretest": "cross-env NODE_ENV=test npm run build",
+    "preversion": "npm run lint && npm test && npm run production",
+    "production": "cross-env NODE_ENV=production npm run build",
+    "test": "nyc --reporter=html --reporter=text mocha"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/json5/json5.git"
+  },
+  "keywords": [
+    "json",
+    "json5",
+    "es5",
+    "es2015",
+    "ecmascript"
+  ],
+  "author": "Aseem Kishore <aseem.kishore@gmail.com>",
+  "contributors": [
+    "Max Nanasy <max.nanasy@gmail.com>",
+    "Andrew Eisenberg <andrew@eisenberg.as>",
+    "Jordan Tucker <jordanbtucker@gmail.com>"
+  ],
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/json5/json5/issues"
+  },
+  "homepage": "http://json5.org/",
+  "dependencies": {
+    "minimist": "^1.2.0"
+  },
+  "devDependencies": {
+    "babel-cli": "^6.26.0",
+    "babel-core": "^6.26.0",
+    "babel-plugin-add-module-exports": "^0.2.1",
+    "babel-plugin-external-helpers": "^6.22.0",
+    "babel-plugin-istanbul": "^4.1.5",
+    "babel-preset-env": "^1.6.1",
+    "babel-register": "^6.26.0",
+    "babelrc-rollup": "^3.0.0",
+    "coveralls": "^3.0.0",
+    "cross-env": "^5.1.4",
+    "del": "^3.0.0",
+    "eslint": "^4.18.2",
+    "eslint-config-standard": "^11.0.0",
+    "eslint-plugin-import": "^2.9.0",
+    "eslint-plugin-node": "^6.0.1",
+    "eslint-plugin-promise": "^3.7.0",
+    "eslint-plugin-standard": "^3.0.1",
+    "mocha": "^5.0.4",
+    "nyc": "^11.4.1",
+    "regenerate": "^1.3.3",
+    "rollup": "^0.56.5",
+    "rollup-plugin-babel": "^3.0.3",
+    "rollup-plugin-commonjs": "^9.0.0",
+    "rollup-plugin-node-resolve": "^3.2.0",
+    "rollup-plugin-uglify": "^3.0.0",
+    "sinon": "^4.4.2",
+    "unicode-9.0.0": "^0.7.5"
+  }
+}
diff --git a/node_modules/tsconfig-paths/package.json b/node_modules/tsconfig-paths/package.json
new file mode 100644
index 0000000..0a0b49a
--- /dev/null
+++ b/node_modules/tsconfig-paths/package.json
@@ -0,0 +1,63 @@
+{
+  "name": "tsconfig-paths",
+  "version": "3.9.0",
+  "description": "Load node modules according to tsconfig paths, in run-time or via API.",
+  "main": "lib/index.js",
+  "types": "lib/index",
+  "author": "Jonas Kello",
+  "license": "MIT",
+  "repository": "https://github.com/dividab/tsconfig-paths",
+  "devDependencies": {
+    "@types/chai": "^4.1.4",
+    "@types/minimist": "^1.2.0",
+    "@types/mocha": "^5.2.3",
+    "@types/node": "^6.0.54",
+    "@types/strip-bom": "^3.0.0",
+    "@types/strip-json-comments": "^0.0.30",
+    "chai": "^4.1.2",
+    "codecov": "^3.1.0",
+    "husky": "^0.14.3",
+    "lint-staged": "^4.3.0",
+    "mocha": "^5.2.0",
+    "nyc": "^11.4.1",
+    "prettier": "1.7.4",
+    "rimraf": "^2.6.2",
+    "shelljs": "^0.7.5",
+    "ts-node": "^7.0.0",
+    "tslint": "^5.8.0",
+    "typescript": "^2.4.1"
+  },
+  "dependencies": {
+    "@types/json5": "^0.0.29",
+    "json5": "^1.0.1",
+    "minimist": "^1.2.0",
+    "strip-bom": "^3.0.0"
+  },
+  "scripts": {
+    "start": "cd src && ts-node index.ts",
+    "example:node": "yarn build && cd ./example/node && ts-node -r ../register.js main.ts",
+    "example:project": "yarn build && ts-node -r ./register.js -P ./example/project/tsconfig.json ./example/project/main.ts",
+    "example:api": "cd example/api && ts-node main.ts",
+    "example:perf": "cd example/perf && ts-node main.ts",
+    "test": "mocha",
+    "build": "rimraf lib && tsc -p src",
+    "build:test": "rimraf ./test/js_out && tsc -p test",
+    "lint": "tslint './{src,tests}/**/*.ts{,x}'",
+    "verify": "yarn build && yarn lint && yarn coverage",
+    "coverage": "rimraf coverage .nyc_output && nyc yarn test",
+    "report-coverage": "codecov -f coverage/*.json",
+    "precommit": "lint-staged",
+    "publish:major": "yarn build && node scripts/publish.js major",
+    "publish:minor": "yarn build && node scripts/publish.js minor",
+    "publish:patch": "yarn build && node scripts/publish.js patch",
+    "preversion": "yarn verify",
+    "postversion": "git push --tags && yarn publish --new-version $npm_package_version && git push && echo \"Successfully released version $npm_package_version!\""
+  },
+  "lint-staged": {
+    "*.ts": [
+      "tslint",
+      "prettier --write",
+      "git add"
+    ]
+  }
+}
diff --git a/node_modules/tsconfig-paths/register.js b/node_modules/tsconfig-paths/register.js
new file mode 100644
index 0000000..c7d41ea
--- /dev/null
+++ b/node_modules/tsconfig-paths/register.js
@@ -0,0 +1 @@
+require('./').register();
diff --git a/node_modules/tsconfig-paths/test/config-loader-tests.ts b/node_modules/tsconfig-paths/test/config-loader-tests.ts
new file mode 100644
index 0000000..483ba43
--- /dev/null
+++ b/node_modules/tsconfig-paths/test/config-loader-tests.ts
@@ -0,0 +1,90 @@
+import { assert } from "chai";
+import {
+  configLoader,
+  loadConfig,
+  ConfigLoaderFailResult,
+  ConfigLoaderSuccessResult
+} from "../src/config-loader";
+import { join } from "path";
+
+describe("config-loader", (): void => {
+  it("should use explicitParams when set", () => {
+    const result = configLoader({
+      explicitParams: {
+        baseUrl: "/foo/bar",
+        paths: {
+          asd: ["asd"]
+        }
+      },
+      cwd: "/baz"
+    });
+
+    const successResult = result as ConfigLoaderSuccessResult;
+    assert.equal(successResult.resultType, "success");
+    assert.equal(successResult.absoluteBaseUrl, "/foo/bar");
+    assert.equal(successResult.paths["asd"][0], "asd");
+  });
+
+  it("should use explicitParams when set and add cwd when path is relative", () => {
+    const result = configLoader({
+      explicitParams: {
+        baseUrl: "bar/",
+        paths: {
+          asd: ["asd"]
+        }
+      },
+      cwd: "/baz"
+    });
+
+    const successResult = result as ConfigLoaderSuccessResult;
+    assert.equal(successResult.resultType, "success");
+    assert.equal(successResult.absoluteBaseUrl, join("/baz", "bar/"));
+  });
+
+  it("should fallback to tsConfigLoader when explicitParams is not set", () => {
+    const result = configLoader({
+      explicitParams: undefined,
+      cwd: "/baz",
+      // tslint:disable-next-line:no-any
+      tsConfigLoader: (_: any) => ({
+        tsConfigPath: "/baz/tsconfig.json",
+        baseUrl: "./src",
+        paths: {}
+      })
+    });
+
+    const successResult = result as ConfigLoaderSuccessResult;
+    assert.equal(successResult.resultType, "success");
+    assert.equal(successResult.absoluteBaseUrl, join("/baz", "src"));
+  });
+
+  it("should show an error message when baseUrl is missing", () => {
+    const result = configLoader({
+      explicitParams: undefined,
+      cwd: "/baz",
+      // tslint:disable-next-line:no-any
+      tsConfigLoader: (_: any) => ({
+        tsConfigPath: "/baz/tsconfig.json",
+        baseUrl: undefined,
+        paths: {}
+      })
+    });
+
+    const failResult = result as ConfigLoaderFailResult;
+    assert.equal(failResult.resultType, "failed");
+    assert.isTrue(failResult.message.indexOf("baseUrl") > -1);
+  });
+
+  it("should presume cwd to be a tsconfig file when loadConfig is called with absolute path to tsconfig.json", () => {
+    // using tsconfig-named.json to ensure that future changes to fix
+    // https://github.com/dividab/tsconfig-paths/issues/31
+    // do not pass this test case just because of a directory walk looking
+    // for tsconfig.json
+    const configFile = join(__dirname, "tsconfig-named.json");
+    const result = loadConfig(configFile);
+
+    const successResult = result as ConfigLoaderSuccessResult;
+    assert.equal(successResult.resultType, "success");
+    assert.equal(successResult.configFileAbsolutePath, configFile);
+  });
+});
diff --git a/node_modules/tsconfig-paths/test/data/match-path-data.ts b/node_modules/tsconfig-paths/test/data/match-path-data.ts
new file mode 100644
index 0000000..d0c60a1
--- /dev/null
+++ b/node_modules/tsconfig-paths/test/data/match-path-data.ts
@@ -0,0 +1,212 @@
+import { join, dirname } from "path";
+import { removeExtension } from "../../src/filesystem";
+
+export interface OneTest {
+  readonly name: string;
+  readonly only?: boolean;
+  readonly skip?: boolean;
+  readonly absoluteBaseUrl: string;
+  readonly paths: { [key: string]: Array<string> };
+  readonly mainFields?: string[];
+  readonly addMatchAll?: boolean;
+  readonly existingFiles: ReadonlyArray<string>;
+  readonly requestedModule: string;
+  readonly extensions?: ReadonlyArray<string>;
+  readonly packageJson?: {};
+  readonly expectedPath: string | undefined;
+}
+
+export const tests: ReadonlyArray<OneTest> = [
+  {
+    name: "should locate path that matches with star and exists",
+    absoluteBaseUrl: "/root/",
+    paths: {
+      "lib/*": ["location/*"]
+    },
+    existingFiles: [join("/root", "location", "mylib", "index.ts")],
+    requestedModule: "lib/mylib",
+    expectedPath: dirname(join("/root", "location", "mylib", "index.ts"))
+  },
+  {
+    name: "should resolve to correct path when many are specified",
+    absoluteBaseUrl: "/root/",
+    paths: {
+      "lib/*": ["foo1/*", "foo2/*", "location/*", "foo3/*"]
+    },
+    existingFiles: [join("/root", "location", "mylib", "index.ts")],
+    requestedModule: "lib/mylib",
+    extensions: [".ts"],
+    expectedPath: dirname(join("/root", "location", "mylib", "index.ts"))
+  },
+  {
+    name:
+      "should locate path that matches with star and prioritize pattern with longest prefix",
+    absoluteBaseUrl: "/root/",
+    paths: {
+      "*": ["location/*"],
+      "lib/*": ["location/*"]
+    },
+    existingFiles: [
+      join("/root", "location", "lib", "mylib", "index.ts"),
+      join("/root", "location", "mylib", "index.ts")
+    ],
+    requestedModule: "lib/mylib",
+    expectedPath: dirname(join("/root", "location", "mylib", "index.ts"))
+  },
+  {
+    name: "should locate path that matches with star and exists with extension",
+    absoluteBaseUrl: "/root/",
+    paths: { "lib/*": ["location/*"] },
+    existingFiles: [join("/root", "location", "mylib.myext")],
+    requestedModule: "lib/mylib",
+    extensions: [".js", ".myext"],
+    expectedPath: removeExtension(join("/root", "location", "mylib.myext"))
+  },
+  {
+    name: "should resolve request with extension specified",
+    absoluteBaseUrl: "/root/",
+    paths: { "lib/*": ["location/*"] },
+    existingFiles: [join("/root", "location", "test.jpg")],
+    requestedModule: "lib/test.jpg",
+    expectedPath: join("/root", "location", "test.jpg")
+  },
+  {
+    name: "should locate path that matches without star and exists",
+    absoluteBaseUrl: "/root/",
+    paths: {
+      "lib/foo": ["location/foo"]
+    },
+    existingFiles: [join("/root", "location", "foo.ts")],
+    requestedModule: "lib/foo",
+    expectedPath: removeExtension(join("/root", "location", "foo.ts"))
+  },
+  {
+    name: "should resolve to parent folder when filename is in subfolder",
+    absoluteBaseUrl: "/root/",
+    paths: { "lib/*": ["location/*"] },
+    existingFiles: [join("/root", "location", "mylib", "index.ts")],
+    requestedModule: "lib/mylib",
+    expectedPath: dirname(join("/root", "location", "mylib", "index.ts"))
+  },
+  {
+    name: "should resolve from main field in package.json",
+    absoluteBaseUrl: "/root/",
+    paths: { "lib/*": ["location/*"] },
+    existingFiles: [join("/root", "location", "mylib", "kalle.ts")],
+    packageJson: { main: "./kalle.ts" },
+    requestedModule: "lib/mylib",
+    expectedPath: removeExtension(
+      join("/root", "location", "mylib", "kalle.ts")
+    )
+  },
+  {
+    name: "should resolve from main field in package.json (js)",
+    absoluteBaseUrl: "/root",
+    paths: { "lib/*": ["location/*"] },
+    existingFiles: [join("/root", "location", "mylib.js", "kalle.js")],
+    packageJson: { main: "./kalle.js" },
+    requestedModule: "lib/mylib.js",
+    extensions: [".ts", ".js"],
+    expectedPath: removeExtension(
+      join("/root", "location", "mylib.js", "kalle.js")
+    )
+  },
+  {
+    name:
+      "should resolve from main field in package.json and correctly remove file extension",
+    absoluteBaseUrl: "/root/",
+    paths: { "lib/*": ["location/*"] },
+    existingFiles: [join("/root", "location", "mylibjs", "kalle.js")],
+    packageJson: { main: "./kalle.js" },
+    extensions: [".ts", ".js"],
+    requestedModule: "lib/mylibjs",
+    expectedPath: removeExtension(
+      join("/root", "location", "mylibjs", "kalle.js")
+    )
+  },
+  {
+    name: "should resolve from list of fields by priority in package.json",
+    absoluteBaseUrl: "/root/",
+    paths: { "lib/*": ["location/*"] },
+    mainFields: ["missing", "browser", "main"],
+    packageJson: { main: "./main.js", browser: "./browser.js" },
+    existingFiles: [
+      join("/root", "location", "mylibjs", "main.js"), // mainFilePath
+      join("/root", "location", "mylibjs", "browser.js") // browserFilePath
+    ],
+    extensions: [".ts", ".js"],
+    requestedModule: "lib/mylibjs",
+    expectedPath: removeExtension(
+      join("/root", "location", "mylibjs", "browser.js")
+    )
+  },
+  {
+    name: "should ignore field mappings to missing files in package.json",
+    absoluteBaseUrl: "/root/",
+    paths: { "lib/*": ["location/*"] },
+    mainFields: ["browser", "main"],
+    existingFiles: [join("/root", "location", "mylibjs", "kalle.js")],
+    requestedModule: "lib/mylibjs",
+    packageJson: {
+      main: "./kalle.js",
+      browser: "./nope.js"
+    },
+    extensions: [".ts", ".js"],
+    expectedPath: removeExtension(
+      join("/root", "location", "mylibjs", "kalle.js")
+    )
+  },
+  {
+    name: "should ignore advanced field mappings in package.json",
+    absoluteBaseUrl: "/root/",
+    paths: { "lib/*": ["location/*"] },
+    existingFiles: [
+      join("/root", "location", "mylibjs", "kalle.js"),
+      join("/root", "location", "mylibjs", "browser.js")
+    ],
+    requestedModule: "lib/mylibjs",
+    packageJson: {
+      main: "./kalle.js",
+      browser: { mylibjs: "./browser.js", "./kalle.js": "./browser.js" }
+    },
+    extensions: [".ts", ".js"],
+    expectedPath: removeExtension(
+      join("/root", "location", "mylibjs", "kalle.js")
+    )
+  },
+  {
+    name: "should resolve to with the help of baseUrl when not explicitly set",
+    absoluteBaseUrl: "/root/",
+    paths: {},
+    existingFiles: [join("/root", "mylib", "index.ts")],
+    requestedModule: "mylib",
+    expectedPath: dirname(join("/root", "mylib", "index.ts"))
+  },
+  {
+    name: "should not resolve with the help of baseUrl when asked not to",
+    absoluteBaseUrl: "/root/",
+    paths: {},
+    addMatchAll: false,
+    existingFiles: [join("/root", "mylib", "index.ts")],
+    requestedModule: "mylib",
+    expectedPath: undefined
+  },
+  {
+    name: "should not locate path that does not match",
+    absoluteBaseUrl: "/root/",
+    paths: { "lib/*": ["location/*"] },
+    existingFiles: [join("root", "location", "mylib")],
+    requestedModule: "mylib",
+    expectedPath: undefined
+  },
+  {
+    name: "should not resolve typings file (index.d.ts)",
+    absoluteBaseUrl: "/root/",
+    paths: {
+      "lib/*": ["location/*"]
+    },
+    existingFiles: [join("/root", "location", "mylib", "index.d.ts")],
+    requestedModule: "lib/mylib",
+    expectedPath: undefined
+  }
+];
diff --git a/node_modules/tsconfig-paths/test/filesystem-tests.ts b/node_modules/tsconfig-paths/test/filesystem-tests.ts
new file mode 100644
index 0000000..49d6058
--- /dev/null
+++ b/node_modules/tsconfig-paths/test/filesystem-tests.ts
@@ -0,0 +1,46 @@
+import { assert } from "chai";
+import * as Filesystem from "../src/filesystem";
+import * as path from "path";
+
+describe("filesystem", () => {
+  const fileThatExists = path.join(__dirname, "../package.json");
+  const fileThatNotExists = path.join(__dirname, "../package2.json");
+
+  it("should find file that exists, sync", () => {
+    const result = Filesystem.fileExistsSync(fileThatExists);
+    assert.equal(result, true);
+  });
+
+  it("should not find file that not exists, sync", () => {
+    const result = Filesystem.fileExistsSync(fileThatNotExists);
+    assert.equal(result, false);
+  });
+
+  it("should find file that exists, async", done => {
+    Filesystem.fileExistsAsync(fileThatExists, (_err, result) => {
+      assert.equal(result, true);
+      done();
+    });
+  });
+
+  it("should not find file that not exists, async", done => {
+    Filesystem.fileExistsAsync(fileThatNotExists, (_err, result) => {
+      assert.equal(result, false);
+      done();
+    });
+  });
+
+  it("should load json, sync", () => {
+    const result = Filesystem.readJsonFromDiskSync(fileThatExists);
+    assert.isOk(result);
+    assert.equal(result.main, "lib/index.js");
+  });
+
+  it("should load json, async", done => {
+    Filesystem.readJsonFromDiskAsync(fileThatExists, (_err, result) => {
+      assert.isOk(result);
+      assert.equal(result.main, "lib/index.js");
+      done();
+    });
+  });
+});
diff --git a/node_modules/tsconfig-paths/test/mapping-entry-test.ts b/node_modules/tsconfig-paths/test/mapping-entry-test.ts
new file mode 100644
index 0000000..004888f
--- /dev/null
+++ b/node_modules/tsconfig-paths/test/mapping-entry-test.ts
@@ -0,0 +1,47 @@
+import { assert } from "chai";
+import { getAbsoluteMappingEntries } from "../src/mapping-entry";
+import { join } from "path";
+
+describe("mapping-entry", () => {
+  it("should change to absolute paths and sort in longest prefix order", () => {
+    const result = getAbsoluteMappingEntries(
+      "/absolute/base/url",
+      {
+        "*": ["/foo1", "/foo2"],
+        "longest/pre/fix/*": ["/foo2/bar"],
+        "pre/fix/*": ["/foo3"]
+      },
+      true
+    );
+    assert.deepEqual(result, [
+      {
+        pattern: "longest/pre/fix/*",
+        paths: [join("/absolute", "base", "url", "foo2", "bar")]
+      },
+      {
+        pattern: "pre/fix/*",
+        paths: [join("/absolute", "base", "url", "foo3")]
+      },
+      {
+        pattern: "*",
+        paths: [
+          join("/absolute", "base", "url", "foo1"),
+          join("/absolute", "base", "url", "foo2")
+        ]
+      }
+    ]);
+  });
+
+  it("should should add a match-all pattern when requested", () => {
+    let result = getAbsoluteMappingEntries("/absolute/base/url", {}, true);
+    assert.deepEqual(result, [
+      {
+        pattern: "*",
+        paths: [join("/absolute", "base", "url", "*")]
+      }
+    ]);
+
+    result = getAbsoluteMappingEntries("/absolute/base/url", {}, false);
+    assert.deepEqual(result, []);
+  });
+});
diff --git a/node_modules/tsconfig-paths/test/match-path-async-tests.ts b/node_modules/tsconfig-paths/test/match-path-async-tests.ts
new file mode 100644
index 0000000..e55bcc6
--- /dev/null
+++ b/node_modules/tsconfig-paths/test/match-path-async-tests.ts
@@ -0,0 +1,27 @@
+import { assert } from "chai";
+import { createMatchPathAsync } from "../src/match-path-async";
+import * as Tests from "./data/match-path-data";
+
+describe("match-path-async", () => {
+  Tests.tests.forEach(t =>
+    it(t.name, done => {
+      const matchPath = createMatchPathAsync(
+        t.absoluteBaseUrl,
+        t.paths,
+        t.mainFields,
+        t.addMatchAll
+      );
+      matchPath(
+        t.requestedModule,
+        (_path, callback) => callback(undefined, t.packageJson),
+        (path, callback) =>
+          callback(undefined, t.existingFiles.indexOf(path) !== -1),
+        t.extensions,
+        (_err, result) => {
+          assert.equal(result, t.expectedPath);
+          done();
+        }
+      );
+    })
+  );
+});
diff --git a/node_modules/tsconfig-paths/test/match-path-sync-tests.ts b/node_modules/tsconfig-paths/test/match-path-sync-tests.ts
new file mode 100644
index 0000000..668bc4a
--- /dev/null
+++ b/node_modules/tsconfig-paths/test/match-path-sync-tests.ts
@@ -0,0 +1,23 @@
+import { assert } from "chai";
+import { createMatchPath } from "../src/match-path-sync";
+import * as Tests from "./data/match-path-data";
+
+describe("match-path-sync", () => {
+  Tests.tests.forEach(t =>
+    it(t.name, () => {
+      const matchPath = createMatchPath(
+        t.absoluteBaseUrl,
+        t.paths,
+        t.mainFields,
+        t.addMatchAll
+      );
+      const result = matchPath(
+        t.requestedModule,
+        (_: string) => t.packageJson,
+        (name: string) => t.existingFiles.indexOf(name) !== -1, // fileExists
+        t.extensions
+      );
+      assert.equal(result, t.expectedPath);
+    })
+  );
+});
diff --git a/node_modules/tsconfig-paths/test/mocha.opts b/node_modules/tsconfig-paths/test/mocha.opts
new file mode 100644
index 0000000..1c00f5f
--- /dev/null
+++ b/node_modules/tsconfig-paths/test/mocha.opts
@@ -0,0 +1,3 @@
+--require ts-node/register
+--recursive test/
+test/**/*.ts
diff --git a/node_modules/tsconfig-paths/test/try-path-tests.ts b/node_modules/tsconfig-paths/test/try-path-tests.ts
new file mode 100644
index 0000000..da8efdf
--- /dev/null
+++ b/node_modules/tsconfig-paths/test/try-path-tests.ts
@@ -0,0 +1,99 @@
+import { assert } from "chai";
+import { getPathsToTry } from "../src/try-path";
+import { join } from "path";
+
+describe("mapping-entry", () => {
+  const abosolutePathMappings = [
+    {
+      pattern: "longest/pre/fix/*",
+      paths: [join("/absolute", "base", "url", "foo2", "bar")]
+    },
+    { pattern: "pre/fix/*", paths: [join("/absolute", "base", "url", "foo3")] },
+    { pattern: "*", paths: [join("/absolute", "base", "url", "foo1")] }
+  ];
+  it("should return no paths for relative requested module", () => {
+    const result = getPathsToTry(
+      [".ts", "tsx"],
+      abosolutePathMappings,
+      "./requested-module"
+    );
+    assert.deepEqual(result, undefined);
+  });
+
+  it("should return no paths if no pattern match the requested module", () => {
+    const result = getPathsToTry(
+      [".ts", "tsx"],
+      [
+        {
+          pattern: "longest/pre/fix/*",
+          paths: [join("/absolute", "base", "url", "foo2", "bar")]
+        },
+        {
+          pattern: "pre/fix/*",
+          paths: [join("/absolute", "base", "url", "foo3")]
+        }
+      ],
+      "requested-module"
+    );
+    assert.deepEqual(result, undefined);
+  });
+
+  it("should get all paths that matches requested module", () => {
+    const result = getPathsToTry(
+      [".ts", ".tsx"],
+      abosolutePathMappings,
+      "longest/pre/fix/requested-module"
+    );
+    assert.deepEqual(result, [
+      // "longest/pre/fix/*"
+      { type: "file", path: join("/absolute", "base", "url", "foo2", "bar") },
+      {
+        type: "extension",
+        path: join("/absolute", "base", "url", "foo2", "bar.ts")
+      },
+      {
+        type: "extension",
+        path: join("/absolute", "base", "url", "foo2", "bar.tsx")
+      },
+      {
+        type: "package",
+        path: join("/absolute", "base", "url", "foo2", "bar", "package.json")
+      },
+      {
+        type: "index",
+        path: join("/absolute", "base", "url", "foo2", "bar", "index.ts")
+      },
+      {
+        type: "index",
+        path: join("/absolute", "base", "url", "foo2", "bar", "index.tsx")
+      },
+      // "*"
+      { type: "file", path: join("/absolute", "base", "url", "foo1") },
+      { type: "extension", path: join("/absolute", "base", "url", "foo1.ts") },
+      { type: "extension", path: join("/absolute", "base", "url", "foo1.tsx") },
+      {
+        type: "package",
+        path: join("/absolute", "base", "url", "foo1", "package.json")
+      },
+      {
+        type: "index",
+        path: join("/absolute", "base", "url", "foo1", "index.ts")
+      },
+      {
+        type: "index",
+        path: join("/absolute", "base", "url", "foo1", "index.tsx")
+      }
+    ]);
+  });
+});
+
+// describe("match-star", () => {
+//   it("should match star in last position", () => {
+//     const result = matchStar("lib/*", "lib/mylib");
+//     assert.equal(result, "mylib");
+//   });
+//   it("should match star in first position", () => {
+//     const result = matchStar("*/lib", "mylib/lib");
+//     assert.equal(result, "mylib");
+//   });
+// });
diff --git a/node_modules/tsconfig-paths/test/tsconfig-loader-tests.ts b/node_modules/tsconfig-paths/test/tsconfig-loader-tests.ts
new file mode 100644
index 0000000..002bcb4
--- /dev/null
+++ b/node_modules/tsconfig-paths/test/tsconfig-loader-tests.ts
@@ -0,0 +1,203 @@
+import { assert } from "chai";
+import {
+  loadTsconfig,
+  tsConfigLoader,
+  walkForTsConfig
+} from "../src/tsconfig-loader";
+import { join } from "path";
+
+describe("tsconfig-loader", () => {
+  it("should find tsconfig in cwd", () => {
+    const result = tsConfigLoader({
+      cwd: "/foo/bar",
+      getEnv: (_: string) => undefined,
+      loadSync: (cwd: string) => {
+        return {
+          tsConfigPath: `${cwd}/tsconfig.json`,
+          baseUrl: "./",
+          paths: {}
+        };
+      }
+    });
+
+    assert.equal(result.tsConfigPath, "/foo/bar/tsconfig.json");
+  });
+
+  it("should return loaderResult.tsConfigPath as undefined when not found", () => {
+    const result = tsConfigLoader({
+      cwd: "/foo/bar",
+      getEnv: (_: string) => undefined,
+      loadSync: (_: string) => {
+        return {
+          tsConfigPath: undefined,
+          baseUrl: "./",
+          paths: {}
+        };
+      }
+    });
+
+    assert.isUndefined(result.tsConfigPath);
+  });
+
+  it("should use TS_NODE_PROJECT env if exists", () => {
+    const result = tsConfigLoader({
+      cwd: "/foo/bar",
+      getEnv: (key: string) =>
+        key === "TS_NODE_PROJECT" ? "/foo/baz" : undefined,
+      loadSync: (cwd: string, fileName: string) => {
+        if (cwd === "/foo/bar" && fileName === "/foo/baz") {
+          return {
+            tsConfigPath: "/foo/baz/tsconfig.json",
+            baseUrl: "./",
+            paths: {}
+          };
+        }
+
+        return {
+          tsConfigPath: undefined,
+          baseUrl: "./",
+          paths: {}
+        };
+      }
+    });
+
+    assert.equal(result.tsConfigPath, "/foo/baz/tsconfig.json");
+  });
+});
+
+describe("walkForTsConfig", () => {
+  it("should find tsconfig in starting directory", () => {
+    const pathToTsconfig = join("/root", "dir1", "tsconfig.json");
+    const res = walkForTsConfig(
+      join("/root", "dir1"),
+      path => path === pathToTsconfig
+    );
+    assert.equal(res, pathToTsconfig);
+  });
+
+  it("should find tsconfig in parent directory", () => {
+    const pathToTsconfig = join("/root", "tsconfig.json");
+    const res = walkForTsConfig(
+      join("/root", "dir1"),
+      path => path === pathToTsconfig
+    );
+    assert.equal(res, pathToTsconfig);
+  });
+
+  it("should return undefined when reaching the top", () => {
+    const res = walkForTsConfig(join("/root", "dir1", "kalle"), () => false);
+    assert.equal(res, undefined);
+  });
+});
+
+describe("loadConfig", () => {
+  it("It should load a config", () => {
+    const config = { compilerOptions: { baseUrl: "hej" } };
+    const res = loadTsconfig(
+      "/root/dir1/tsconfig.json",
+      path => path === "/root/dir1/tsconfig.json",
+      _ => JSON.stringify(config)
+    );
+    assert.deepEqual(res, config);
+  });
+
+  it("It should load a config with comments", () => {
+    const config = { compilerOptions: { baseUrl: "hej" } };
+    const res = loadTsconfig(
+      "/root/dir1/tsconfig.json",
+      path => path === "/root/dir1/tsconfig.json",
+      _ => `{
+          // my comment
+          "compilerOptions": { 
+            "baseUrl": "hej"
+          }
+        }`
+    );
+    assert.deepEqual(res, config);
+  });
+
+  it("It should load a config with trailing commas", () => {
+    const config = { compilerOptions: { baseUrl: "hej" } };
+    const res = loadTsconfig(
+      "/root/dir1/tsconfig.json",
+      path => path === "/root/dir1/tsconfig.json",
+      _ => `{
+          "compilerOptions": { 
+            "baseUrl": "hej",
+          },
+        }`
+    );
+    assert.deepEqual(res, config);
+  });
+
+  it("It should load a config with extends and overwrite all options", () => {
+    const firstConfig = {
+      extends: "../base-config.json",
+      compilerOptions: { baseUrl: "kalle", paths: { foo: ["bar2"] } }
+    };
+    const firstConfigPath = join("/root", "dir1", "tsconfig.json");
+    const baseConfig = {
+      compilerOptions: {
+        baseUrl: "olle",
+        paths: { foo: ["bar1"] },
+        strict: true
+      }
+    };
+    const baseConfigPath = join("/root", "base-config.json");
+    const res = loadTsconfig(
+      join("/root", "dir1", "tsconfig.json"),
+      path => path === firstConfigPath || path === baseConfigPath,
+      path => {
+        if (path === firstConfigPath) {
+          return JSON.stringify(firstConfig);
+        }
+        if (path === baseConfigPath) {
+          return JSON.stringify(baseConfig);
+        }
+        return "";
+      }
+    );
+
+    assert.deepEqual(res, {
+      extends: "../base-config.json",
+      compilerOptions: {
+        baseUrl: "kalle",
+        paths: { foo: ["bar2"] },
+        strict: true
+      }
+    });
+  });
+
+  it("Should use baseUrl relative to location of extended tsconfig", () => {
+    const firstConfig = { compilerOptions: { baseUrl: "." } };
+    const firstConfigPath = join("/root", "first-config.json");
+    const secondConfig = { extends: "../first-config.json" };
+    const secondConfigPath = join("/root", "dir1", "second-config.json");
+    const thirdConfig = { extends: "../second-config.json" };
+    const thirdConfigPath = join("/root", "dir1", "dir2", "third-config.json");
+    const res = loadTsconfig(
+      join("/root", "dir1", "dir2", "third-config.json"),
+      path =>
+        path === firstConfigPath ||
+        path === secondConfigPath ||
+        path === thirdConfigPath,
+      path => {
+        if (path === firstConfigPath) {
+          return JSON.stringify(firstConfig);
+        }
+        if (path === secondConfigPath) {
+          return JSON.stringify(secondConfig);
+        }
+        if (path === thirdConfigPath) {
+          return JSON.stringify(thirdConfig);
+        }
+        return "";
+      }
+    );
+
+    assert.deepEqual(res, {
+      extends: "../second-config.json",
+      compilerOptions: { baseUrl: join("..", "..") }
+    });
+  });
+});
diff --git a/node_modules/tsconfig-paths/test/tsconfig-named.json b/node_modules/tsconfig-paths/test/tsconfig-named.json
new file mode 100644
index 0000000..a337580
--- /dev/null
+++ b/node_modules/tsconfig-paths/test/tsconfig-named.json
@@ -0,0 +1,10 @@
+{
+  "extends": "../base-tsconfig.json",
+  "compilerOptions": {
+    "baseUrl": ".",
+    "module": "commonjs",
+    "target": "es6",
+    "sourceMap": true,
+    "outDir": "./js_out"
+  }
+}
diff --git a/node_modules/tsconfig-paths/test/tsconfig.json b/node_modules/tsconfig-paths/test/tsconfig.json
new file mode 100644
index 0000000..12f379d
--- /dev/null
+++ b/node_modules/tsconfig-paths/test/tsconfig.json
@@ -0,0 +1,9 @@
+{
+  "extends": "../base-tsconfig.json",
+  "compilerOptions": {
+    "module": "commonjs",
+    "target": "es6",
+    "sourceMap": true,
+    "outDir": "./js_out"
+  }
+}
diff --git a/node_modules/tsconfig-paths/tslint.json b/node_modules/tsconfig-paths/tslint.json
new file mode 100644
index 0000000..4cb0bca
--- /dev/null
+++ b/node_modules/tsconfig-paths/tslint.json
@@ -0,0 +1,88 @@
+{
+  "rules": {
+    "no-any": true,
+    "no-internal-module": true,
+    "no-namespace": true,
+    "no-reference": true,
+    "no-var-requires": true,
+    "typedef": [true, "call-signature", "parameter", "property-declaration"],
+    "typedef-whitespace": [
+      true,
+      {
+        "call-signature": "nospace",
+        "index-signature": "nospace",
+        "parameter": "nospace",
+        "property-declaration": "nospace",
+        "variable-declaration": "nospace"
+      },
+      {
+        "call-signature": "onespace",
+        "index-signature": "onespace",
+        "parameter": "onespace",
+        "property-declaration": "onespace",
+        "variable-declaration": "onespace"
+      }
+    ],
+    "curly": true,
+    "forin": true,
+    "label-position": true,
+    "no-arg": true,
+    "no-bitwise": true,
+    "no-conditional-assignment": true,
+    // "no-console": [
+    //   true,
+    //   "log"
+    // ],
+    "no-construct": true,
+    "no-debugger": true,
+    "no-duplicate-variable": true,
+    "no-empty": true,
+    "no-eval": true,
+    "no-invalid-this": true,
+    // "no-null-keyword": true,
+    "no-shadowed-variable": true,
+    // "no-string-literal": true,
+    "no-switch-case-fall-through": true,
+    "no-unsafe-finally": true,
+    "no-unused-expression": true,
+    "no-var-keyword": true,
+    "radix": true,
+    "switch-default": true,
+    "triple-equals": true,
+    "use-isnan": true,
+    "eofline": true,
+    "indent": [true, "spaces"],
+    "max-file-line-count": [true, 800],
+    "max-line-length": [true, 160],
+    "no-default-export": true,
+    "no-mergeable-namespace": true,
+    "no-require-imports": true,
+    "align": [true, "statements"],
+    //"arrow-parens": true,
+    "class-name": true,
+    "jsdoc-format": true,
+    "new-parens": true,
+    "no-angle-bracket-type-assertion": true,
+    "no-consecutive-blank-lines": [true, 1],
+    "no-parameter-properties": true,
+    // "object-literal-key-quotes": [
+    //   true,
+    //   "as-needed"
+    // ],
+    "one-line": [
+      true,
+      "check-catch",
+      "check-finally",
+      "check-else",
+      "check-open-brace",
+      "check-whitespace"
+    ],
+    "one-variable-per-declaration": [true],
+    "variable-name": [
+      true,
+      "ban-keywords",
+      "check-format",
+      "allow-leading-underscore"
+    ]
+  }
+}
diff --git a/node_modules/whatwg-fetch/LICENSE b/node_modules/whatwg-fetch/LICENSE
deleted file mode 100644
index 0e319d5..0000000
--- a/node_modules/whatwg-fetch/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2014-2016 GitHub, Inc.
-
-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/node_modules/whatwg-fetch/README.md b/node_modules/whatwg-fetch/README.md
deleted file mode 100644
index 32cc3c2..0000000
--- a/node_modules/whatwg-fetch/README.md
+++ /dev/null
@@ -1,283 +0,0 @@
-# window.fetch polyfill
-
-The `fetch()` function is a Promise-based mechanism for programmatically making
-web requests in the browser. This project is a polyfill that implements a subset
-of the standard [Fetch specification][], enough to make `fetch` a viable
-replacement for most uses of XMLHttpRequest in traditional web applications.
-
-This project adheres to the [Open Code of Conduct][]. By participating, you are
-expected to uphold this code.
-
-## Table of Contents
-
-* [Read this first](#read-this-first)
-* [Installation](#installation)
-* [Usage](#usage)
-  * [HTML](#html)
-  * [JSON](#json)
-  * [Response metadata](#response-metadata)
-  * [Post form](#post-form)
-  * [Post JSON](#post-json)
-  * [File upload](#file-upload)
-  * [Caveats](#caveats)
-    * [Handling HTTP error statuses](#handling-http-error-statuses)
-    * [Sending cookies](#sending-cookies)
-    * [Receiving cookies](#receiving-cookies)
-    * [Obtaining the Response URL](#obtaining-the-response-url)
-* [Browser Support](#browser-support)
-
-## Read this first
-
-* If you believe you found a bug with how `fetch` behaves in Chrome or Firefox,
-  please **don't open an issue in this repository**. This project is a
-  _polyfill_, and since Chrome and Firefox both implement the `window.fetch`
-  function natively, no code from this project actually takes any effect in
-  these browsers. See [Browser support](#browser-support) for detailed
-  information.
-
-* If you have trouble **making a request to another domain** (a different
-  subdomain or port number also constitutes another domain), please familiarize
-  yourself with all the intricacies and limitations of [CORS][] requests.
-  Because CORS requires participation of the server by implementing specific
-  HTTP response headers, it is often nontrivial to set up or debug. CORS is
-  exclusively handled by the browser's internal mechanisms which this polyfill
-  cannot influence.
-
-* If you have trouble **maintaining the user's session** or [CSRF][] protection
-  through `fetch` requests, please ensure that you've read and understood the
-  [Sending cookies](#sending-cookies) section. `fetch` doesn't send cookies
-  unless you ask it to.
-
-* This project **doesn't work under Node.js environments**. It's meant for web
-  browsers only. You should ensure that your application doesn't try to package
-  and run this on the server.
-
-* If you have an idea for a new feature of `fetch`, **submit your feature
-  requests** to the [specification's repository](https://github.com/whatwg/fetch/issues).
-  We only add features and APIs that are part of the [Fetch specification][].
-
-## Installation
-
-* `npm install whatwg-fetch --save`; or
-
-* `bower install fetch`; or
-
-* `yarn add whatwg-fetch`.
-
-You will also need a Promise polyfill for [older browsers](http://caniuse.com/#feat=promises).
-We recommend [taylorhakes/promise-polyfill](https://github.com/taylorhakes/promise-polyfill)
-for its small size and Promises/A+ compatibility.
-
-For use with webpack, add this package in the `entry` configuration option
-before your application entry point:
-
-```javascript
-entry: ['whatwg-fetch', ...]
-```
-
-For Babel and ES2015+, make sure to import the file:
-
-```javascript
-import 'whatwg-fetch'
-```
-
-## Usage
-
-For a more comprehensive API reference that this polyfill supports, refer to
-https://github.github.io/fetch/.
-
-### HTML
-
-```javascript
-fetch('/users.html')
-  .then(function(response) {
-    return response.text()
-  }).then(function(body) {
-    document.body.innerHTML = body
-  })
-```
-
-### JSON
-
-```javascript
-fetch('/users.json')
-  .then(function(response) {
-    return response.json()
-  }).then(function(json) {
-    console.log('parsed json', json)
-  }).catch(function(ex) {
-    console.log('parsing failed', ex)
-  })
-```
-
-### Response metadata
-
-```javascript
-fetch('/users.json').then(function(response) {
-  console.log(response.headers.get('Content-Type'))
-  console.log(response.headers.get('Date'))
-  console.log(response.status)
-  console.log(response.statusText)
-})
-```
-
-### Post form
-
-```javascript
-var form = document.querySelector('form')
-
-fetch('/users', {
-  method: 'POST',
-  body: new FormData(form)
-})
-```
-
-### Post JSON
-
-```javascript
-fetch('/users', {
-  method: 'POST',
-  headers: {
-    'Content-Type': 'application/json'
-  },
-  body: JSON.stringify({
-    name: 'Hubot',
-    login: 'hubot',
-  })
-})
-```
-
-### File upload
-
-```javascript
-var input = document.querySelector('input[type="file"]')
-
-var data = new FormData()
-data.append('file', input.files[0])
-data.append('user', 'hubot')
-
-fetch('/avatars', {
-  method: 'POST',
-  body: data
-})
-```
-
-### Caveats
-
-The `fetch` specification differs from `jQuery.ajax()` in mainly two ways that
-bear keeping in mind:
-
-* The Promise returned from `fetch()` **won't reject on HTTP error status**
-  even if the response is an HTTP 404 or 500. Instead, it will resolve normally,
-  and it will only reject on network failure or if anything prevented the
-  request from completing.
-
-* By default, `fetch` **won't send or receive any cookies** from the server,
-  resulting in unauthenticated requests if the site relies on maintaining a user
-  session. See [Sending cookies](#sending-cookies) for how to opt into cookie
-  handling.
-
-#### Handling HTTP error statuses
-
-To have `fetch` Promise reject on HTTP error statuses, i.e. on any non-2xx
-status, define a custom response handler:
-
-```javascript
-function checkStatus(response) {
-  if (response.status >= 200 && response.status < 300) {
-    return response
-  } else {
-    var error = new Error(response.statusText)
-    error.response = response
-    throw error
-  }
-}
-
-function parseJSON(response) {
-  return response.json()
-}
-
-fetch('/users')
-  .then(checkStatus)
-  .then(parseJSON)
-  .then(function(data) {
-    console.log('request succeeded with JSON response', data)
-  }).catch(function(error) {
-    console.log('request failed', error)
-  })
-```
-
-#### Sending cookies
-
-To automatically send cookies for the current domain, the `credentials` option
-must be provided:
-
-```javascript
-fetch('/users', {
-  credentials: 'same-origin'
-})
-```
-
-The "same-origin" value makes `fetch` behave similarly to XMLHttpRequest with
-regards to cookies. Otherwise, cookies won't get sent, resulting in these
-requests not preserving the authentication session.
-
-For [CORS][] requests, use the "include" value to allow sending credentials to
-other domains:
-
-```javascript
-fetch('https://example.com:1234/users', {
-  credentials: 'include'
-})
-```
-
-#### Receiving cookies
-
-As with XMLHttpRequest, the `Set-Cookie` response header returned from the
-server is a [forbidden header name][] and therefore can't be programmatically
-read with `response.headers.get()`. Instead, it's the browser's responsibility
-to handle new cookies being set (if applicable to the current URL). Unless they
-are HTTP-only, new cookies will be available through `document.cookie`.
-
-Bear in mind that the default behavior of `fetch` is to ignore the `Set-Cookie`
-header completely. To opt into accepting cookies from the server, you must use
-the `credentials` option.
-
-#### Obtaining the Response URL
-
-Due to limitations of XMLHttpRequest, the `response.url` value might not be
-reliable after HTTP redirects on older browsers.
-
-The solution is to configure the server to set the response HTTP header
-`X-Request-URL` to the current URL after any redirect that might have happened.
-It should be safe to set it unconditionally.
-
-``` ruby
-# Ruby on Rails controller example
-response.headers['X-Request-URL'] = request.url
-```
-
-This server workaround is necessary if you need reliable `response.url` in
-Firefox < 32, Chrome < 37, Safari, or IE.
-
-## Browser Support
-
-- Chrome
-- Firefox
-- Safari 6.1+
-- Internet Explorer 10+
-
-Note: modern browsers such as Chrome, Firefox, Microsoft Edge, and Safari contain native
-implementations of `window.fetch`, therefore the code from this polyfill doesn't
-have any effect on those browsers. If you believe you've encountered an error
-with how `window.fetch` is implemented in any of these browsers, you should file
-an issue with that browser vendor instead of this project.
-
-
-  [fetch specification]: https://fetch.spec.whatwg.org
-  [open code of conduct]: http://todogroup.org/opencodeofconduct/#fetch/opensource@github.com
-  [cors]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
-    "Cross-origin resource sharing"
-  [csrf]: https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet
-    "Cross-site request forgery"
-  [forbidden header name]: https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name
diff --git a/node_modules/whatwg-fetch/fetch.js b/node_modules/whatwg-fetch/fetch.js
deleted file mode 100644
index f2f466d..0000000
--- a/node_modules/whatwg-fetch/fetch.js
+++ /dev/null
@@ -1,466 +0,0 @@
-(function(self) {
-  'use strict';
-
-  if (self.fetch) {
-    return
-  }
-
-  var support = {
-    searchParams: 'URLSearchParams' in self,
-    iterable: 'Symbol' in self && 'iterator' in Symbol,
-    blob: 'FileReader' in self && 'Blob' in self && (function() {
-      try {
-        new Blob()
-        return true
-      } catch(e) {
-        return false
-      }
-    })(),
-    formData: 'FormData' in self,
-    arrayBuffer: 'ArrayBuffer' in self
-  }
-
-  if (support.arrayBuffer) {
-    var viewClasses = [
-      '[object Int8Array]',
-      '[object Uint8Array]',
-      '[object Uint8ClampedArray]',
-      '[object Int16Array]',
-      '[object Uint16Array]',
-      '[object Int32Array]',
-      '[object Uint32Array]',
-      '[object Float32Array]',
-      '[object Float64Array]'
-    ]
-
-    var isDataView = function(obj) {
-      return obj && DataView.prototype.isPrototypeOf(obj)
-    }
-
-    var isArrayBufferView = ArrayBuffer.isView || function(obj) {
-      return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
-    }
-  }
-
-  function normalizeName(name) {
-    if (typeof name !== 'string') {
-      name = String(name)
-    }
-    if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
-      throw new TypeError('Invalid character in header field name')
-    }
-    return name.toLowerCase()
-  }
-
-  function normalizeValue(value) {
-    if (typeof value !== 'string') {
-      value = String(value)
-    }
-    return value
-  }
-
-  // Build a destructive iterator for the value list
-  function iteratorFor(items) {
-    var iterator = {
-      next: function() {
-        var value = items.shift()
-        return {done: value === undefined, value: value}
-      }
-    }
-
-    if (support.iterable) {
-      iterator[Symbol.iterator] = function() {
-        return iterator
-      }
-    }
-
-    return iterator
-  }
-
-  function Headers(headers) {
-    this.map = {}
-
-    if (headers instanceof Headers) {
-      headers.forEach(function(value, name) {
-        this.append(name, value)
-      }, this)
-    } else if (Array.isArray(headers)) {
-      headers.forEach(function(header) {
-        this.append(header[0], header[1])
-      }, this)
-    } else if (headers) {
-      Object.getOwnPropertyNames(headers).forEach(function(name) {
-        this.append(name, headers[name])
-      }, this)
-    }
-  }
-
-  Headers.prototype.append = function(name, value) {
-    name = normalizeName(name)
-    value = normalizeValue(value)
-    var oldValue = this.map[name]
-    this.map[name] = oldValue ? oldValue+','+value : value
-  }
-
-  Headers.prototype['delete'] = function(name) {
-    delete this.map[normalizeName(name)]
-  }
-
-  Headers.prototype.get = function(name) {
-    name = normalizeName(name)
-    return this.has(name) ? this.map[name] : null
-  }
-
-  Headers.prototype.has = function(name) {
-    return this.map.hasOwnProperty(normalizeName(name))
-  }
-
-  Headers.prototype.set = function(name, value) {
-    this.map[normalizeName(name)] = normalizeValue(value)
-  }
-
-  Headers.prototype.forEach = function(callback, thisArg) {
-    for (var name in this.map) {
-      if (this.map.hasOwnProperty(name)) {
-        callback.call(thisArg, this.map[name], name, this)
-      }
-    }
-  }
-
-  Headers.prototype.keys = function() {
-    var items = []
-    this.forEach(function(value, name) { items.push(name) })
-    return iteratorFor(items)
-  }
-
-  Headers.prototype.values = function() {
-    var items = []
-    this.forEach(function(value) { items.push(value) })
-    return iteratorFor(items)
-  }
-
-  Headers.prototype.entries = function() {
-    var items = []
-    this.forEach(function(value, name) { items.push([name, value]) })
-    return iteratorFor(items)
-  }
-
-  if (support.iterable) {
-    Headers.prototype[Symbol.iterator] = Headers.prototype.entries
-  }
-
-  function consumed(body) {
-    if (body.bodyUsed) {
-      return Promise.reject(new TypeError('Already read'))
-    }
-    body.bodyUsed = true
-  }
-
-  function fileReaderReady(reader) {
-    return new Promise(function(resolve, reject) {
-      reader.onload = function() {
-        resolve(reader.result)
-      }
-      reader.onerror = function() {
-        reject(reader.error)
-      }
-    })
-  }
-
-  function readBlobAsArrayBuffer(blob) {
-    var reader = new FileReader()
-    var promise = fileReaderReady(reader)
-    reader.readAsArrayBuffer(blob)
-    return promise
-  }
-
-  function readBlobAsText(blob) {
-    var reader = new FileReader()
-    var promise = fileReaderReady(reader)
-    reader.readAsText(blob)
-    return promise
-  }
-
-  function readArrayBufferAsText(buf) {
-    var view = new Uint8Array(buf)
-    var chars = new Array(view.length)
-
-    for (var i = 0; i < view.length; i++) {
-      chars[i] = String.fromCharCode(view[i])
-    }
-    return chars.join('')
-  }
-
-  function bufferClone(buf) {
-    if (buf.slice) {
-      return buf.slice(0)
-    } else {
-      var view = new Uint8Array(buf.byteLength)
-      view.set(new Uint8Array(buf))
-      return view.buffer
-    }
-  }
-
-  function Body() {
-    this.bodyUsed = false
-
-    this._initBody = function(body) {
-      this._bodyInit = body
-      if (!body) {
-        this._bodyText = ''
-      } else if (typeof body === 'string') {
-        this._bodyText = body
-      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
-        this._bodyBlob = body
-      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
-        this._bodyFormData = body
-      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
-        this._bodyText = body.toString()
-      } else if (support.arrayBuffer && support.blob && isDataView(body)) {
-        this._bodyArrayBuffer = bufferClone(body.buffer)
-        // IE 10-11 can't handle a DataView body.
-        this._bodyInit = new Blob([this._bodyArrayBuffer])
-      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
-        this._bodyArrayBuffer = bufferClone(body)
-      } else {
-        throw new Error('unsupported BodyInit type')
-      }
-
-      if (!this.headers.get('content-type')) {
-        if (typeof body === 'string') {
-          this.headers.set('content-type', 'text/plain;charset=UTF-8')
-        } else if (this._bodyBlob && this._bodyBlob.type) {
-          this.headers.set('content-type', this._bodyBlob.type)
-        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
-          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
-        }
-      }
-    }
-
-    if (support.blob) {
-      this.blob = function() {
-        var rejected = consumed(this)
-        if (rejected) {
-          return rejected
-        }
-
-        if (this._bodyBlob) {
-          return Promise.resolve(this._bodyBlob)
-        } else if (this._bodyArrayBuffer) {
-          return Promise.resolve(new Blob([this._bodyArrayBuffer]))
-        } else if (this._bodyFormData) {
-          throw new Error('could not read FormData body as blob')
-        } else {
-          return Promise.resolve(new Blob([this._bodyText]))
-        }
-      }
-
-      this.arrayBuffer = function() {
-        if (this._bodyArrayBuffer) {
-          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
-        } else {
-          return this.blob().then(readBlobAsArrayBuffer)
-        }
-      }
-    }
-
-    this.text = function() {
-      var rejected = consumed(this)
-      if (rejected) {
-        return rejected
-      }
-
-      if (this._bodyBlob) {
-        return readBlobAsText(this._bodyBlob)
-      } else if (this._bodyArrayBuffer) {
-        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
-      } else if (this._bodyFormData) {
-        throw new Error('could not read FormData body as text')
-      } else {
-        return Promise.resolve(this._bodyText)
-      }
-    }
-
-    if (support.formData) {
-      this.formData = function() {
-        return this.text().then(decode)
-      }
-    }
-
-    this.json = function() {
-      return this.text().then(JSON.parse)
-    }
-
-    return this
-  }
-
-  // HTTP methods whose capitalization should be normalized
-  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
-
-  function normalizeMethod(method) {
-    var upcased = method.toUpperCase()
-    return (methods.indexOf(upcased) > -1) ? upcased : method
-  }
-
-  function Request(input, options) {
-    options = options || {}
-    var body = options.body
-
-    if (input instanceof Request) {
-      if (input.bodyUsed) {
-        throw new TypeError('Already read')
-      }
-      this.url = input.url
-      this.credentials = input.credentials
-      if (!options.headers) {
-        this.headers = new Headers(input.headers)
-      }
-      this.method = input.method
-      this.mode = input.mode
-      if (!body && input._bodyInit != null) {
-        body = input._bodyInit
-        input.bodyUsed = true
-      }
-    } else {
-      this.url = String(input)
-    }
-
-    this.credentials = options.credentials || this.credentials || 'omit'
-    if (options.headers || !this.headers) {
-      this.headers = new Headers(options.headers)
-    }
-    this.method = normalizeMethod(options.method || this.method || 'GET')
-    this.mode = options.mode || this.mode || null
-    this.referrer = null
-
-    if ((this.method === 'GET' || this.method === 'HEAD') && body) {
-      throw new TypeError('Body not allowed for GET or HEAD requests')
-    }
-    this._initBody(body)
-  }
-
-  Request.prototype.clone = function() {
-    return new Request(this, { body: this._bodyInit })
-  }
-
-  function decode(body) {
-    var form = new FormData()
-    body.trim().split('&').forEach(function(bytes) {
-      if (bytes) {
-        var split = bytes.split('=')
-        var name = split.shift().replace(/\+/g, ' ')
-        var value = split.join('=').replace(/\+/g, ' ')
-        form.append(decodeURIComponent(name), decodeURIComponent(value))
-      }
-    })
-    return form
-  }
-
-  function parseHeaders(rawHeaders) {
-    var headers = new Headers()
-    // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
-    // https://tools.ietf.org/html/rfc7230#section-3.2
-    var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ')
-    preProcessedHeaders.split(/\r?\n/).forEach(function(line) {
-      var parts = line.split(':')
-      var key = parts.shift().trim()
-      if (key) {
-        var value = parts.join(':').trim()
-        headers.append(key, value)
-      }
-    })
-    return headers
-  }
-
-  Body.call(Request.prototype)
-
-  function Response(bodyInit, options) {
-    if (!options) {
-      options = {}
-    }
-
-    this.type = 'default'
-    this.status = options.status === undefined ? 200 : options.status
-    this.ok = this.status >= 200 && this.status < 300
-    this.statusText = 'statusText' in options ? options.statusText : 'OK'
-    this.headers = new Headers(options.headers)
-    this.url = options.url || ''
-    this._initBody(bodyInit)
-  }
-
-  Body.call(Response.prototype)
-
-  Response.prototype.clone = function() {
-    return new Response(this._bodyInit, {
-      status: this.status,
-      statusText: this.statusText,
-      headers: new Headers(this.headers),
-      url: this.url
-    })
-  }
-
-  Response.error = function() {
-    var response = new Response(null, {status: 0, statusText: ''})
-    response.type = 'error'
-    return response
-  }
-
-  var redirectStatuses = [301, 302, 303, 307, 308]
-
-  Response.redirect = function(url, status) {
-    if (redirectStatuses.indexOf(status) === -1) {
-      throw new RangeError('Invalid status code')
-    }
-
-    return new Response(null, {status: status, headers: {location: url}})
-  }
-
-  self.Headers = Headers
-  self.Request = Request
-  self.Response = Response
-
-  self.fetch = function(input, init) {
-    return new Promise(function(resolve, reject) {
-      var request = new Request(input, init)
-      var xhr = new XMLHttpRequest()
-
-      xhr.onload = function() {
-        var options = {
-          status: xhr.status,
-          statusText: xhr.statusText,
-          headers: parseHeaders(xhr.getAllResponseHeaders() || '')
-        }
-        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')
-        var body = 'response' in xhr ? xhr.response : xhr.responseText
-        resolve(new Response(body, options))
-      }
-
-      xhr.onerror = function() {
-        reject(new TypeError('Network request failed'))
-      }
-
-      xhr.ontimeout = function() {
-        reject(new TypeError('Network request failed'))
-      }
-
-      xhr.open(request.method, request.url, true)
-
-      if (request.credentials === 'include') {
-        xhr.withCredentials = true
-      } else if (request.credentials === 'omit') {
-        xhr.withCredentials = false
-      }
-
-      if ('responseType' in xhr && support.blob) {
-        xhr.responseType = 'blob'
-      }
-
-      request.headers.forEach(function(value, name) {
-        xhr.setRequestHeader(name, value)
-      })
-
-      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
-    })
-  }
-  self.fetch.polyfill = true
-})(typeof self !== 'undefined' ? self : this);
diff --git a/node_modules/whatwg-fetch/package.json b/node_modules/whatwg-fetch/package.json
deleted file mode 100644
index d9581eb..0000000
--- a/node_modules/whatwg-fetch/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "name": "whatwg-fetch",
-  "description": "A window.fetch polyfill.",
-  "version": "2.0.4",
-  "main": "fetch.js",
-  "repository": "github/fetch",
-  "license": "MIT",
-  "devDependencies": {
-    "chai": "1.10.0",
-    "jshint": "2.8.0",
-    "mocha": "2.1.0",
-    "mocha-phantomjs-core": "2.0.1",
-    "promise-polyfill": "6.0.2",
-    "url-search-params": "0.6.1"
-  },
-  "files": [
-    "LICENSE",
-    "fetch.js"
-  ],
-  "scripts": {
-    "test": "make"
-  }
-}
diff --git a/node_modules/xregexp/LICENSE b/node_modules/xregexp/LICENSE
deleted file mode 100644
index 4d80338..0000000
--- a/node_modules/xregexp/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License
-
-Copyright (c) 2007-present Steven Levithan <http://xregexp.com/>
-
-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/node_modules/xregexp/README.md b/node_modules/xregexp/README.md
deleted file mode 100644
index e4dccde..0000000
--- a/node_modules/xregexp/README.md
+++ /dev/null
@@ -1,241 +0,0 @@
-# XRegExp 4.3.0
-
-[![Build Status](https://travis-ci.org/slevithan/xregexp.svg?branch=master)](https://travis-ci.org/slevithan/xregexp)
-
-XRegExp provides augmented (and extensible) JavaScript regular expressions. You get modern syntax and flags beyond what browsers support natively. XRegExp is also a regex utility belt with tools to make your grepping and parsing easier, while freeing you from regex cross-browser inconsistencies and other annoyances.
-
-XRegExp supports all native ES6 regular expression syntax. It supports ES5+ browsers, and you can use it with Node.js or as a RequireJS module.
-
-## Performance
-
-XRegExp compiles to native `RegExp` objects. Therefore regexes built with XRegExp perform just as fast as native regular expressions. There is a tiny extra cost when compiling a pattern for the first time.
-
-## Usage examples
-
-```js
-// Using named capture and flag x for free-spacing and line comments
-const date = XRegExp(
-    `(?<year>  [0-9]{4} ) -?  # year
-     (?<month> [0-9]{2} ) -?  # month
-     (?<day>   [0-9]{2} )     # day`, 'x');
-
-// XRegExp.exec gives you named backreferences on the match result
-let match = XRegExp.exec('2017-02-22', date);
-match.year; // -> '2017'
-
-// It also includes optional pos and sticky arguments
-let pos = 3;
-const result = [];
-while (match = XRegExp.exec('<1><2><3>4<5>', /<(\d+)>/, pos, 'sticky')) {
-    result.push(match[1]);
-    pos = match.index + match[0].length;
-}
-// result -> ['2', '3']
-
-// XRegExp.replace allows named backreferences in replacements
-XRegExp.replace('2017-02-22', date, '$<month>/$<day>/$<year>');
-// -> '02/22/2017'
-XRegExp.replace('2017-02-22', date, (match) => {
-    return `${match.month}/${match.day}/${match.year}`;
-});
-// -> '02/22/2017'
-
-// XRegExps compile to RegExps and work perfectly with native methods
-date.test('2017-02-22');
-// -> true
-
-// The only caveat is that named captures must be referenced using
-// numbered backreferences if used with native methods
-'2017-02-22'.replace(date, '$2/$3/$1');
-// -> '02/22/2017'
-
-// Use XRegExp.forEach to extract every other digit from a string
-const evens = [];
-XRegExp.forEach('1a2345', /\d/, (match, i) => {
-    if (i % 2) evens.push(+match[0]);
-});
-// evens -> [2, 4]
-
-// Use XRegExp.matchChain to get numbers within <b> tags
-XRegExp.matchChain('1 <b>2</b> 3 <B>4 \n 56</B>', [
-    XRegExp('(?is)<b>.*?</b>'),
-    /\d+/
-]);
-// -> ['2', '4', '56']
-
-// You can also pass forward and return specific backreferences
-const html =
-    `<a href="http://xregexp.com/">XRegExp</a>
-     <a href="http://www.google.com/">Google</a>`;
-XRegExp.matchChain(html, [
-    {regex: /<a href="([^"]+)">/i, backref: 1},
-    {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}
-]);
-// -> ['xregexp.com', 'www.google.com']
-
-// Merge strings and regexes, with updated backreferences
-XRegExp.union(['m+a*n', /(bear)\1/, /(pig)\1/], 'i', {conjunction: 'or'});
-// -> /m\+a\*n|(bear)\1|(pig)\2/i
-```
-
-These examples give the flavor of what's possible, but XRegExp has more syntax, flags, methods, options, and browser fixes that aren't shown here. You can also augment XRegExp's regular expression syntax with addons (see below) or write your own. See [xregexp.com](http://xregexp.com/) for details.
-
-## Addons
-
-You can either load addons individually, or bundle all addons with XRegExp by loading `xregexp-all.js` from https://unpkg.com/xregexp/xregexp-all.js.
-
-### Unicode
-
-If not using `xregexp-all.js`, first include the Unicode Base script and then one or more of the addons for Unicode blocks, categories, properties, or scripts.
-
-Then you can do this:
-
-```js
-// Test the Unicode category L (Letter)
-const unicodeWord = XRegExp('^\\pL+$');
-unicodeWord.test('Русский'); // -> true
-unicodeWord.test('日本語'); // -> true
-unicodeWord.test('العربية'); // -> true
-
-// Test some Unicode scripts
-XRegExp('^\\p{Hiragana}+$').test('ひらがな'); // -> true
-XRegExp('^[\\p{Latin}\\p{Common}]+$').test('Über Café.'); // -> true
-```
-
-By default, `\p{…}` and `\P{…}` support the Basic Multilingual Plane (i.e. code points up to `U+FFFF`). You can opt-in to full 21-bit Unicode support (with code points up to `U+10FFFF`) on a per-regex basis by using flag `A`. This is called *astral mode*. You can automatically add flag `A` for all new regexes by running `XRegExp.install('astral')`. When in astral mode, `\p{…}` and `\P{…}` always match a full code point rather than a code unit, using surrogate pairs for code points above `U+FFFF`.
-
-```js
-// Using flag A to match astral code points
-XRegExp('^\\pS$').test('💩'); // -> false
-XRegExp('^\\pS$', 'A').test('💩'); // -> true
-XRegExp('(?A)^\\pS$').test('💩'); // -> true
-// Using surrogate pair U+D83D U+DCA9 to represent U+1F4A9 (pile of poo)
-XRegExp('(?A)^\\pS$').test('\uD83D\uDCA9'); // -> true
-
-// Implicit flag A
-XRegExp.install('astral');
-XRegExp('^\\pS$').test('💩'); // -> true
-```
-
-Opting in to astral mode disables the use of `\p{…}` and `\P{…}` within character classes. In astral mode, use e.g. `(\pL|[0-9_])+` instead of `[\pL0-9_]+`.
-
-XRegExp uses Unicode 12.1.0.
-
-### XRegExp.build
-
-Build regular expressions using named subpatterns, for readability and pattern reuse:
-
-```js
-const time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {
-    hours: XRegExp.build('{{h12}} : | {{h24}}', {
-        h12: /1[0-2]|0?[1-9]/,
-        h24: /2[0-3]|[01][0-9]/
-    }),
-    minutes: /^[0-5][0-9]$/
-});
-
-time.test('10:59'); // -> true
-XRegExp.exec('10:59', time).minutes; // -> '59'
-```
-
-Named subpatterns can be provided as strings or regex objects. A leading `^` and trailing unescaped `$` are stripped from subpatterns if both are present, which allows embedding independently-useful anchored patterns. `{{…}}` tokens can be quantified as a single unit. Any backreferences in the outer pattern or provided subpatterns are automatically renumbered to work correctly within the larger combined pattern. The syntax `({{name}})` works as shorthand for named capture via `(?<name>{{name}})`. Named subpatterns cannot be embedded within character classes.
-
-#### XRegExp.tag (included with XRegExp.build)
-
-Provides tagged template literals that create regexes with XRegExp syntax and flags:
-
-```js
-const h12 = /1[0-2]|0?[1-9]/;
-const h24 = /2[0-3]|[01][0-9]/;
-const hours = XRegExp.tag('x')`${h12} : | ${h24}`;
-const minutes = /^[0-5][0-9]$/;
-// Note that explicitly naming the 'minutes' group is required for named backreferences
-const time = XRegExp.tag('x')`^ ${hours} (?<minutes>${minutes}) $`;
-time.test('10:59'); // -> true
-XRegExp.exec('10:59', time).minutes; // -> '59'
-```
-
-XRegExp.tag does more than just basic interpolation. For starters, you get all the XRegExp syntax and flags. Even better, since `XRegExp.tag` uses your pattern as a raw string, you no longer need to escape all your backslashes. And since it relies on `XRegExp.build` under the hood, you get all of its extras for free. Leading `^` and trailing unescaped `$` are stripped from interpolated patterns if both are present (to allow embedding independently useful anchored regexes), interpolating into a character class is an error (to avoid unintended meaning in edge cases), interpolated patterns are treated as atomic units when quantified, interpolated strings have their special characters escaped, and any backreferences within an interpolated regex are rewritten to work within the overall pattern.
-
-### XRegExp.matchRecursive
-
-Match recursive constructs using XRegExp pattern strings as left and right delimiters:
-
-```js
-const str1 = '(t((e))s)t()(ing)';
-XRegExp.matchRecursive(str1, '\\(', '\\)', 'g');
-// -> ['t((e))s', '', 'ing']
-
-// Extended information mode with valueNames
-const str2 = 'Here is <div> <div>an</div></div> example';
-XRegExp.matchRecursive(str2, '<div\\s*>', '</div>', 'gi', {
-    valueNames: ['between', 'left', 'match', 'right']
-});
-/* -> [
-{name: 'between', value: 'Here is ',       start: 0,  end: 8},
-{name: 'left',    value: '<div>',          start: 8,  end: 13},
-{name: 'match',   value: ' <div>an</div>', start: 13, end: 27},
-{name: 'right',   value: '</div>',         start: 27, end: 33},
-{name: 'between', value: ' example',       start: 33, end: 41}
-] */
-
-// Omitting unneeded parts with null valueNames, and using escapeChar
-const str3 = '...{1}.\\{{function(x,y){return {y:x}}}';
-XRegExp.matchRecursive(str3, '{', '}', 'g', {
-    valueNames: ['literal', null, 'value', null],
-    escapeChar: '\\'
-});
-/* -> [
-{name: 'literal', value: '...',  start: 0, end: 3},
-{name: 'value',   value: '1',    start: 4, end: 5},
-{name: 'literal', value: '.\\{', start: 6, end: 9},
-{name: 'value',   value: 'function(x,y){return {y:x}}', start: 10, end: 37}
-] */
-
-// Sticky mode via flag y
-const str4 = '<1><<<2>>><3>4<5>';
-XRegExp.matchRecursive(str4, '<', '>', 'gy');
-// -> ['1', '<<2>>', '3']
-```
-
-`XRegExp.matchRecursive` throws an error if it scans past an unbalanced delimiter in the target string.
-
-## Installation and usage
-
-In browsers (bundle XRegExp with all of its addons):
-
-```html
-<script src="https://unpkg.com/xregexp/xregexp-all.js"></script>
-```
-
-Using [npm](https://www.npmjs.com/):
-
-```bash
-npm install xregexp
-```
-
-In [Node.js](http://nodejs.org/):
-
-```js
-const XRegExp = require('xregexp');
-```
-
-In an AMD loader like [RequireJS](http://requirejs.org/):
-
-```js
-require({paths: {xregexp: 'xregexp-all'}}, ['xregexp'], (XRegExp) => {
-    console.log(XRegExp.version);
-});
-```
-
-## Credits
-
-XRegExp project collaborators are:
-
-- [Steven Levithan](http://stevenlevithan.com/)
-- [Joseph Frazier](https://github.com/josephfrazier)
-- [Mathias Bynens](https://mathiasbynens.be/)
-
-Thanks to all contributors and others who have submitted code, provided feedback, reported bugs, and inspired new features.
-
-XRegExp is released under the [MIT License](https://mit-license.org/). Learn more at [xregexp.com](http://xregexp.com/).
diff --git a/node_modules/xregexp/lib/addons/build.js b/node_modules/xregexp/lib/addons/build.js
deleted file mode 100644
index eece31f..0000000
--- a/node_modules/xregexp/lib/addons/build.js
+++ /dev/null
@@ -1,260 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
-
-var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
-
-var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
-
-var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));
-
-/*!
- * XRegExp.build 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2012-present MIT License
- */
-var _default = function _default(XRegExp) {
-  var REGEX_DATA = 'xregexp';
-  var subParts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g;
-  var parts = XRegExp.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/, subParts], 'g', {
-    conjunction: 'or'
-  });
-  /**
-   * Strips a leading `^` and trailing unescaped `$`, if both are present.
-   *
-   * @private
-   * @param {String} pattern Pattern to process.
-   * @returns {String} Pattern with edge anchors removed.
-   */
-
-  function deanchor(pattern) {
-    // Allow any number of empty noncapturing groups before/after anchors, because regexes
-    // built/generated by XRegExp sometimes include them
-    var leadingAnchor = /^(?:\(\?:\))*\^/;
-    var trailingAnchor = /\$(?:\(\?:\))*$/;
-
-    if (leadingAnchor.test(pattern) && trailingAnchor.test(pattern) && // Ensure that the trailing `$` isn't escaped
-    trailingAnchor.test(pattern.replace(/\\[\s\S]/g, ''))) {
-      return pattern.replace(leadingAnchor, '').replace(trailingAnchor, '');
-    }
-
-    return pattern;
-  }
-  /**
-   * Converts the provided value to an XRegExp. Native RegExp flags are not preserved.
-   *
-   * @private
-   * @param {String|RegExp} value Value to convert.
-   * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not
-   *   already a regex generated by XRegExp
-   * @returns {RegExp} XRegExp object with XRegExp syntax applied.
-   */
-
-
-  function asXRegExp(value, addFlagX) {
-    var flags = addFlagX ? 'x' : '';
-    return XRegExp.isRegExp(value) ? value[REGEX_DATA] && value[REGEX_DATA].captureNames ? // Don't recompile, to preserve capture names
-    value : // Recompile as XRegExp
-    XRegExp(value.source, flags) : // Compile string as XRegExp
-    XRegExp(value, flags);
-  }
-
-  function interpolate(substitution) {
-    return substitution instanceof RegExp ? substitution : XRegExp.escape(substitution);
-  }
-
-  function reduceToSubpatternsObject(subpatterns, interpolated, subpatternIndex) {
-    subpatterns["subpattern".concat(subpatternIndex)] = interpolated;
-    return subpatterns;
-  }
-
-  function embedSubpatternAfter(raw, subpatternIndex, rawLiterals) {
-    var hasSubpattern = subpatternIndex < rawLiterals.length - 1;
-    return raw + (hasSubpattern ? "{{subpattern".concat(subpatternIndex, "}}") : '');
-  }
-  /**
-   * Provides tagged template literals that create regexes with XRegExp syntax and flags. The
-   * provided pattern is handled as a raw string, so backslashes don't need to be escaped.
-   *
-   * Interpolation of strings and regexes shares the features of `XRegExp.build`. Interpolated
-   * patterns are treated as atomic units when quantified, interpolated strings have their special
-   * characters escaped, a leading `^` and trailing unescaped `$` are stripped from interpolated
-   * regexes if both are present, and any backreferences within an interpolated regex are
-   * rewritten to work within the overall pattern.
-   *
-   * @memberOf XRegExp
-   * @param {String} [flags] Any combination of XRegExp flags.
-   * @returns {Function} Handler for template literals that construct regexes with XRegExp syntax.
-   * @example
-   *
-   * const h12 = /1[0-2]|0?[1-9]/;
-   * const h24 = /2[0-3]|[01][0-9]/;
-   * const hours = XRegExp.tag('x')`${h12} : | ${h24}`;
-   * const minutes = /^[0-5][0-9]$/;
-   * // Note that explicitly naming the 'minutes' group is required for named backreferences
-   * const time = XRegExp.tag('x')`^ ${hours} (?<minutes>${minutes}) $`;
-   * time.test('10:59'); // -> true
-   * XRegExp.exec('10:59', time).minutes; // -> '59'
-   */
-
-
-  XRegExp.tag = function (flags) {
-    return function (literals) {
-      var _context, _context2;
-
-      for (var _len = arguments.length, substitutions = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
-        substitutions[_key - 1] = arguments[_key];
-      }
-
-      var subpatterns = (0, _reduce.default)(_context = (0, _map.default)(substitutions).call(substitutions, interpolate)).call(_context, reduceToSubpatternsObject, {});
-      var pattern = (0, _map.default)(_context2 = literals.raw).call(_context2, embedSubpatternAfter).join('');
-      return XRegExp.build(pattern, subpatterns, flags);
-    };
-  };
-  /**
-   * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in
-   * the outer pattern and provided subpatterns are automatically renumbered to work correctly.
-   * Native flags used by provided subpatterns are ignored in favor of the `flags` argument.
-   *
-   * @memberOf XRegExp
-   * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows
-   *   `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within
-   *   character classes.
-   * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A
-   *   leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present.
-   * @param {String} [flags] Any combination of XRegExp flags.
-   * @returns {RegExp} Regex with interpolated subpatterns.
-   * @example
-   *
-   * const time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {
-   *   hours: XRegExp.build('{{h12}} : | {{h24}}', {
-   *     h12: /1[0-2]|0?[1-9]/,
-   *     h24: /2[0-3]|[01][0-9]/
-   *   }, 'x'),
-   *   minutes: /^[0-5][0-9]$/
-   * });
-   * time.test('10:59'); // -> true
-   * XRegExp.exec('10:59', time).minutes; // -> '59'
-   */
-
-
-  XRegExp.build = function (pattern, subs, flags) {
-    flags = flags || ''; // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how
-    // some browsers convert `RegExp('\n')` to a regex that contains the literal characters `\`
-    // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>.
-
-    var addFlagX = (0, _includes.default)(flags).call(flags, 'x');
-    var inlineFlags = /^\(\?([\w$]+)\)/.exec(pattern); // Add flags within a leading mode modifier to the overall pattern's flags
-
-    if (inlineFlags) {
-      flags = XRegExp._clipDuplicates(flags + inlineFlags[1]);
-    }
-
-    var data = {};
-
-    for (var p in subs) {
-      if (subs.hasOwnProperty(p)) {
-        // Passing to XRegExp enables extended syntax and ensures independent validity,
-        // lest an unescaped `(`, `)`, `[`, or trailing `\` breaks the `(?:)` wrapper. For
-        // subpatterns provided as native regexes, it dies on octals and adds the property
-        // used to hold extended regex instance data, for simplicity.
-        var sub = asXRegExp(subs[p], addFlagX);
-        data[p] = {
-          // Deanchoring allows embedding independently useful anchored regexes. If you
-          // really need to keep your anchors, double them (i.e., `^^...$$`).
-          pattern: deanchor(sub.source),
-          names: sub[REGEX_DATA].captureNames || []
-        };
-      }
-    } // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid;
-    // helps keep this simple. Named captures will be put back.
-
-
-    var patternAsRegex = asXRegExp(pattern, addFlagX); // 'Caps' is short for 'captures'
-
-    var numCaps = 0;
-    var numPriorCaps;
-    var numOuterCaps = 0;
-    var outerCapsMap = [0];
-    var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || [];
-    var output = patternAsRegex.source.replace(parts, function ($0, $1, $2, $3, $4) {
-      var subName = $1 || $2;
-      var capName;
-      var intro;
-      var localCapIndex; // Named subpattern
-
-      if (subName) {
-        var _context3;
-
-        if (!data.hasOwnProperty(subName)) {
-          throw new ReferenceError("Undefined property ".concat($0));
-        } // Named subpattern was wrapped in a capturing group
-
-
-        if ($1) {
-          capName = outerCapNames[numOuterCaps];
-          outerCapsMap[++numOuterCaps] = ++numCaps; // If it's a named group, preserve the name. Otherwise, use the subpattern name
-          // as the capture name
-
-          intro = "(?<".concat(capName || subName, ">");
-        } else {
-          intro = '(?:';
-        }
-
-        numPriorCaps = numCaps;
-        var rewrittenSubpattern = data[subName].pattern.replace(subParts, function (match, paren, backref) {
-          // Capturing group
-          if (paren) {
-            capName = data[subName].names[numCaps - numPriorCaps];
-            ++numCaps; // If the current capture has a name, preserve the name
-
-            if (capName) {
-              return "(?<".concat(capName, ">");
-            } // Backreference
-
-          } else if (backref) {
-            localCapIndex = +backref - 1; // Rewrite the backreference
-
-            return data[subName].names[localCapIndex] ? // Need to preserve the backreference name in case using flag `n`
-            "\\k<".concat(data[subName].names[localCapIndex], ">") : "\\".concat(+backref + numPriorCaps);
-          }
-
-          return match;
-        });
-        return (0, _concat.default)(_context3 = "".concat(intro)).call(_context3, rewrittenSubpattern, ")");
-      } // Capturing group
-
-
-      if ($3) {
-        capName = outerCapNames[numOuterCaps];
-        outerCapsMap[++numOuterCaps] = ++numCaps; // If the current capture has a name, preserve the name
-
-        if (capName) {
-          return "(?<".concat(capName, ">");
-        } // Backreference
-
-      } else if ($4) {
-        localCapIndex = +$4 - 1; // Rewrite the backreference
-
-        return outerCapNames[localCapIndex] ? // Need to preserve the backreference name in case using flag `n`
-        "\\k<".concat(outerCapNames[localCapIndex], ">") : "\\".concat(outerCapsMap[+$4]);
-      }
-
-      return $0;
-    });
-    return XRegExp(output, flags);
-  };
-};
-
-exports.default = _default;
-module.exports = exports["default"];
\ No newline at end of file
diff --git a/node_modules/xregexp/lib/addons/matchrecursive.js b/node_modules/xregexp/lib/addons/matchrecursive.js
deleted file mode 100644
index 897847e..0000000
--- a/node_modules/xregexp/lib/addons/matchrecursive.js
+++ /dev/null
@@ -1,229 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
-
-var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
-
-var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
-
-/*!
- * XRegExp.matchRecursive 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2009-present MIT License
- */
-var _default = function _default(XRegExp) {
-  /**
-   * Returns a match detail object composed of the provided values.
-   *
-   * @private
-   */
-  function row(name, value, start, end) {
-    return {
-      name: name,
-      value: value,
-      start: start,
-      end: end
-    };
-  }
-  /**
-   * Returns an array of match strings between outermost left and right delimiters, or an array of
-   * objects with detailed match parts and position data. An error is thrown if delimiters are
-   * unbalanced within the data.
-   *
-   * @memberOf XRegExp
-   * @param {String} str String to search.
-   * @param {String} left Left delimiter as an XRegExp pattern.
-   * @param {String} right Right delimiter as an XRegExp pattern.
-   * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters.
-   * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options.
-   * @returns {Array} Array of matches, or an empty array.
-   * @example
-   *
-   * // Basic usage
-   * let str = '(t((e))s)t()(ing)';
-   * XRegExp.matchRecursive(str, '\\(', '\\)', 'g');
-   * // -> ['t((e))s', '', 'ing']
-   *
-   * // Extended information mode with valueNames
-   * str = 'Here is <div> <div>an</div></div> example';
-   * XRegExp.matchRecursive(str, '<div\\s*>', '</div>', 'gi', {
-   *   valueNames: ['between', 'left', 'match', 'right']
-   * });
-   * // -> [
-   * // {name: 'between', value: 'Here is ',       start: 0,  end: 8},
-   * // {name: 'left',    value: '<div>',          start: 8,  end: 13},
-   * // {name: 'match',   value: ' <div>an</div>', start: 13, end: 27},
-   * // {name: 'right',   value: '</div>',         start: 27, end: 33},
-   * // {name: 'between', value: ' example',       start: 33, end: 41}
-   * // ]
-   *
-   * // Omitting unneeded parts with null valueNames, and using escapeChar
-   * str = '...{1}.\\{{function(x,y){return {y:x}}}';
-   * XRegExp.matchRecursive(str, '{', '}', 'g', {
-   *   valueNames: ['literal', null, 'value', null],
-   *   escapeChar: '\\'
-   * });
-   * // -> [
-   * // {name: 'literal', value: '...',  start: 0, end: 3},
-   * // {name: 'value',   value: '1',    start: 4, end: 5},
-   * // {name: 'literal', value: '.\\{', start: 6, end: 9},
-   * // {name: 'value',   value: 'function(x,y){return {y:x}}', start: 10, end: 37}
-   * // ]
-   *
-   * // Sticky mode via flag y
-   * str = '<1><<<2>>><3>4<5>';
-   * XRegExp.matchRecursive(str, '<', '>', 'gy');
-   * // -> ['1', '<<2>>', '3']
-   */
-
-
-  XRegExp.matchRecursive = function (str, left, right, flags, options) {
-    flags = flags || '';
-    options = options || {};
-    var global = (0, _includes.default)(flags).call(flags, 'g');
-    var sticky = (0, _includes.default)(flags).call(flags, 'y'); // Flag `y` is controlled internally
-
-    var basicFlags = flags.replace(/y/g, '');
-    var _options = options,
-        escapeChar = _options.escapeChar;
-    var vN = options.valueNames;
-    var output = [];
-    var openTokens = 0;
-    var delimStart = 0;
-    var delimEnd = 0;
-    var lastOuterEnd = 0;
-    var outerStart;
-    var innerStart;
-    var leftMatch;
-    var rightMatch;
-    var esc;
-    left = XRegExp(left, basicFlags);
-    right = XRegExp(right, basicFlags);
-
-    if (escapeChar) {
-      var _context, _context2;
-
-      if (escapeChar.length > 1) {
-        throw new Error('Cannot use more than one escape character');
-      }
-
-      escapeChar = XRegExp.escape(escapeChar); // Example of concatenated `esc` regex:
-      // `escapeChar`: '%'
-      // `left`: '<'
-      // `right`: '>'
-      // Regex is: /(?:%[\S\s]|(?:(?!<|>)[^%])+)+/
-
-      esc = new RegExp((0, _concat.default)(_context = (0, _concat.default)(_context2 = "(?:".concat(escapeChar, "[\\S\\s]|(?:(?!")).call(_context2, // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`.
-      // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax
-      // transformation resulting from those flags was already applied to `left` and
-      // `right` when they were passed through the XRegExp constructor above.
-      XRegExp.union([left, right], '', {
-        conjunction: 'or'
-      }).source, ")[^")).call(_context, escapeChar, "])+)+"), // Flags `gy` not needed here
-      flags.replace(/[^imu]+/g, ''));
-    }
-
-    while (true) {
-      // If using an escape character, advance to the delimiter's next starting position,
-      // skipping any escaped characters in between
-      if (escapeChar) {
-        delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length;
-      }
-
-      leftMatch = XRegExp.exec(str, left, delimEnd);
-      rightMatch = XRegExp.exec(str, right, delimEnd); // Keep the leftmost match only
-
-      if (leftMatch && rightMatch) {
-        if (leftMatch.index <= rightMatch.index) {
-          rightMatch = null;
-        } else {
-          leftMatch = null;
-        }
-      } // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens):
-      // LM | RM | OT | Result
-      // 1  | 0  | 1  | loop
-      // 1  | 0  | 0  | loop
-      // 0  | 1  | 1  | loop
-      // 0  | 1  | 0  | throw
-      // 0  | 0  | 1  | throw
-      // 0  | 0  | 0  | break
-      // The paths above don't include the sticky mode special case. The loop ends after the
-      // first completed match if not `global`.
-
-
-      if (leftMatch || rightMatch) {
-        delimStart = (leftMatch || rightMatch).index;
-        delimEnd = delimStart + (leftMatch || rightMatch)[0].length;
-      } else if (!openTokens) {
-        break;
-      }
-
-      if (sticky && !openTokens && delimStart > lastOuterEnd) {
-        break;
-      }
-
-      if (leftMatch) {
-        if (!openTokens) {
-          outerStart = delimStart;
-          innerStart = delimEnd;
-        }
-
-        ++openTokens;
-      } else if (rightMatch && openTokens) {
-        if (! --openTokens) {
-          if (vN) {
-            if (vN[0] && outerStart > lastOuterEnd) {
-              output.push(row(vN[0], (0, _slice.default)(str).call(str, lastOuterEnd, outerStart), lastOuterEnd, outerStart));
-            }
-
-            if (vN[1]) {
-              output.push(row(vN[1], (0, _slice.default)(str).call(str, outerStart, innerStart), outerStart, innerStart));
-            }
-
-            if (vN[2]) {
-              output.push(row(vN[2], (0, _slice.default)(str).call(str, innerStart, delimStart), innerStart, delimStart));
-            }
-
-            if (vN[3]) {
-              output.push(row(vN[3], (0, _slice.default)(str).call(str, delimStart, delimEnd), delimStart, delimEnd));
-            }
-          } else {
-            output.push((0, _slice.default)(str).call(str, innerStart, delimStart));
-          }
-
-          lastOuterEnd = delimEnd;
-
-          if (!global) {
-            break;
-          }
-        }
-      } else {
-        throw new Error('Unbalanced delimiter found in string');
-      } // If the delimiter matched an empty string, avoid an infinite loop
-
-
-      if (delimStart === delimEnd) {
-        ++delimEnd;
-      }
-    }
-
-    if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) {
-      output.push(row(vN[0], (0, _slice.default)(str).call(str, lastOuterEnd), lastOuterEnd, str.length));
-    }
-
-    return output;
-  };
-};
-
-exports.default = _default;
-module.exports = exports["default"];
\ No newline at end of file
diff --git a/node_modules/xregexp/lib/addons/unicode-base.js b/node_modules/xregexp/lib/addons/unicode-base.js
deleted file mode 100644
index b52fd53..0000000
--- a/node_modules/xregexp/lib/addons/unicode-base.js
+++ /dev/null
@@ -1,292 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));
-
-var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
-
-var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
-
-var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
-
-/*!
- * XRegExp Unicode Base 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2008-present MIT License
- */
-var _default = function _default(XRegExp) {
-  /**
-   * Adds base support for Unicode matching:
-   * - Adds syntax `\p{..}` for matching Unicode tokens. Tokens can be inverted using `\P{..}` or
-   *   `\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the
-   *   braces for token names that are a single letter (e.g. `\pL` or `PL`).
-   * - Adds flag A (astral), which enables 21-bit Unicode support.
-   * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data.
-   *
-   * Unicode Base relies on externally provided Unicode character data. Official addons are
-   * available to provide data for Unicode categories, scripts, blocks, and properties.
-   *
-   * @requires XRegExp
-   */
-  // ==--------------------------==
-  // Private stuff
-  // ==--------------------------==
-  // Storage for Unicode data
-  var unicode = {}; // Reuse utils
-
-  var dec = XRegExp._dec;
-  var hex = XRegExp._hex;
-  var pad4 = XRegExp._pad4; // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed
-
-  function normalize(name) {
-    return name.replace(/[- _]+/g, '').toLowerCase();
-  } // Gets the decimal code of a literal code unit, \xHH, \uHHHH, or a backslash-escaped literal
-
-
-  function charCode(chr) {
-    var esc = /^\\[xu](.+)/.exec(chr);
-    return esc ? dec(esc[1]) : chr.charCodeAt(chr[0] === '\\' ? 1 : 0);
-  } // Inverts a list of ordered BMP characters and ranges
-
-
-  function invertBmp(range) {
-    var output = '';
-    var lastEnd = -1;
-    (0, _forEach.default)(XRegExp).call(XRegExp, range, /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/, function (m) {
-      var start = charCode(m[1]);
-
-      if (start > lastEnd + 1) {
-        output += "\\u".concat(pad4(hex(lastEnd + 1)));
-
-        if (start > lastEnd + 2) {
-          output += "-\\u".concat(pad4(hex(start - 1)));
-        }
-      }
-
-      lastEnd = charCode(m[2] || m[1]);
-    });
-
-    if (lastEnd < 0xFFFF) {
-      output += "\\u".concat(pad4(hex(lastEnd + 1)));
-
-      if (lastEnd < 0xFFFE) {
-        output += '-\\uFFFF';
-      }
-    }
-
-    return output;
-  } // Generates an inverted BMP range on first use
-
-
-  function cacheInvertedBmp(slug) {
-    var prop = 'b!';
-    return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp));
-  } // Combines and optionally negates BMP and astral data
-
-
-  function buildAstral(slug, isNegated) {
-    var item = unicode[slug];
-    var combined = '';
-
-    if (item.bmp && !item.isBmpLast) {
-      var _context;
-
-      combined = (0, _concat.default)(_context = "[".concat(item.bmp, "]")).call(_context, item.astral ? '|' : '');
-    }
-
-    if (item.astral) {
-      combined += item.astral;
-    }
-
-    if (item.isBmpLast && item.bmp) {
-      var _context2;
-
-      combined += (0, _concat.default)(_context2 = "".concat(item.astral ? '|' : '', "[")).call(_context2, item.bmp, "]");
-    } // Astral Unicode tokens always match a code point, never a code unit
-
-
-    return isNegated ? "(?:(?!".concat(combined, ")(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-\uFFFF]))") : "(?:".concat(combined, ")");
-  } // Builds a complete astral pattern on first use
-
-
-  function cacheAstral(slug, isNegated) {
-    var prop = isNegated ? 'a!' : 'a=';
-    return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated));
-  } // ==--------------------------==
-  // Core functionality
-  // ==--------------------------==
-
-  /*
-   * Add astral mode (flag A) and Unicode token syntax: `\p{..}`, `\P{..}`, `\p{^..}`, `\pC`.
-   */
-
-
-  XRegExp.addToken( // Use `*` instead of `+` to avoid capturing `^` as the token name in `\p{^}`
-  /\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/, function (match, scope, flags) {
-    var ERR_DOUBLE_NEG = 'Invalid double negation ';
-    var ERR_UNKNOWN_NAME = 'Unknown Unicode token ';
-    var ERR_UNKNOWN_REF = 'Unicode token missing data ';
-    var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token ';
-    var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes'; // Negated via \P{..} or \p{^..}
-
-    var isNegated = match[1] === 'P' || !!match[2]; // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A
-
-    var isAstralMode = (0, _includes.default)(flags).call(flags, 'A'); // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\p{}`
-
-    var slug = normalize(match[4] || match[3]); // Token data object
-
-    var item = unicode[slug];
-
-    if (match[1] === 'P' && match[2]) {
-      throw new SyntaxError(ERR_DOUBLE_NEG + match[0]);
-    }
-
-    if (!unicode.hasOwnProperty(slug)) {
-      throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]);
-    } // Switch to the negated form of the referenced Unicode token
-
-
-    if (item.inverseOf) {
-      slug = normalize(item.inverseOf);
-
-      if (!unicode.hasOwnProperty(slug)) {
-        var _context3;
-
-        throw new ReferenceError((0, _concat.default)(_context3 = "".concat(ERR_UNKNOWN_REF + match[0], " -> ")).call(_context3, item.inverseOf));
-      }
-
-      item = unicode[slug];
-      isNegated = !isNegated;
-    }
-
-    if (!(item.bmp || isAstralMode)) {
-      throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]);
-    }
-
-    if (isAstralMode) {
-      if (scope === 'class') {
-        throw new SyntaxError(ERR_ASTRAL_IN_CLASS);
-      }
-
-      return cacheAstral(slug, isNegated);
-    }
-
-    return scope === 'class' ? isNegated ? cacheInvertedBmp(slug) : item.bmp : "".concat((isNegated ? '[^' : '[') + item.bmp, "]");
-  }, {
-    scope: 'all',
-    optionalFlags: 'A',
-    leadChar: '\\'
-  });
-  /**
-   * Adds to the list of Unicode tokens that XRegExp regexes can match via `\p` or `\P`.
-   *
-   * @memberOf XRegExp
-   * @param {Array} data Objects with named character ranges. Each object may have properties
-   *   `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are
-   *   optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If
-   *   `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent,
-   *   the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are
-   *   provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and
-   *   `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan
-   *   high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and
-   *   `astral` data should be a combination of literal characters and `\xHH` or `\uHHHH` escape
-   *   sequences, with hyphens to create ranges. Any regex metacharacters in the data should be
-   *   escaped, apart from range-creating hyphens. The `astral` data can additionally use
-   *   character classes and alternation, and should use surrogate pairs to represent astral code
-   *   points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is
-   *   defined as the exact inverse of another token.
-   * @example
-   *
-   * // Basic use
-   * XRegExp.addUnicodeData([{
-   *   name: 'XDigit',
-   *   alias: 'Hexadecimal',
-   *   bmp: '0-9A-Fa-f'
-   * }]);
-   * XRegExp('\\p{XDigit}:\\p{Hexadecimal}+').test('0:3D'); // -> true
-   */
-
-  XRegExp.addUnicodeData = function (data) {
-    var ERR_NO_NAME = 'Unicode token requires name';
-    var ERR_NO_DATA = 'Unicode token has no character data ';
-    var _iteratorNormalCompletion = true;
-    var _didIteratorError = false;
-    var _iteratorError = undefined;
-
-    try {
-      for (var _iterator = (0, _getIterator2.default)(data), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-        var item = _step.value;
-
-        if (!item.name) {
-          throw new Error(ERR_NO_NAME);
-        }
-
-        if (!(item.inverseOf || item.bmp || item.astral)) {
-          throw new Error(ERR_NO_DATA + item.name);
-        }
-
-        unicode[normalize(item.name)] = item;
-
-        if (item.alias) {
-          unicode[normalize(item.alias)] = item;
-        }
-      } // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and
-      // flags might now produce different results
-
-    } catch (err) {
-      _didIteratorError = true;
-      _iteratorError = err;
-    } finally {
-      try {
-        if (!_iteratorNormalCompletion && _iterator.return != null) {
-          _iterator.return();
-        }
-      } finally {
-        if (_didIteratorError) {
-          throw _iteratorError;
-        }
-      }
-    }
-
-    XRegExp.cache.flush('patterns');
-  };
-  /**
-   * @ignore
-   *
-   * Return a reference to the internal Unicode definition structure for the given Unicode
-   * Property if the given name is a legal Unicode Property for use in XRegExp `\p` or `\P` regex
-   * constructs.
-   *
-   * @memberOf XRegExp
-   * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive),
-   *   e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode
-   *   Properties and Property Aliases.
-   * @returns {Object} Reference to definition structure when the name matches a Unicode Property.
-   *
-   * @note
-   * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories.
-   *
-   * @note
-   * This method is *not* part of the officially documented API and may change or be removed in
-   * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode
-   * structures set up by XRegExp.
-   */
-
-
-  XRegExp._getUnicodeProperty = function (name) {
-    var slug = normalize(name);
-    return unicode[slug];
-  };
-};
-
-exports.default = _default;
-module.exports = exports["default"];
\ No newline at end of file
diff --git a/node_modules/xregexp/lib/addons/unicode-blocks.js b/node_modules/xregexp/lib/addons/unicode-blocks.js
deleted file mode 100644
index 8321593..0000000
--- a/node_modules/xregexp/lib/addons/unicode-blocks.js
+++ /dev/null
@@ -1,39 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _blocks = _interopRequireDefault(require("../../tools/output/blocks"));
-
-/*!
- * XRegExp Unicode Blocks 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2010-present MIT License
- * Unicode data by Mathias Bynens <mathiasbynens.be>
- */
-var _default = function _default(XRegExp) {
-  /**
-   * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g.,
-   * `\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and
-   * underscores are ignored.
-   *
-   * Uses Unicode 12.1.0.
-   *
-   * @requires XRegExp, Unicode Base
-   */
-  if (!XRegExp.addUnicodeData) {
-    throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks');
-  }
-
-  XRegExp.addUnicodeData(_blocks.default);
-};
-
-exports.default = _default;
-module.exports = exports["default"];
\ No newline at end of file
diff --git a/node_modules/xregexp/lib/addons/unicode-categories.js b/node_modules/xregexp/lib/addons/unicode-categories.js
deleted file mode 100644
index 9fdc383..0000000
--- a/node_modules/xregexp/lib/addons/unicode-categories.js
+++ /dev/null
@@ -1,39 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _categories = _interopRequireDefault(require("../../tools/output/categories"));
-
-/*!
- * XRegExp Unicode Categories 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2010-present MIT License
- * Unicode data by Mathias Bynens <mathiasbynens.be>
- */
-var _default = function _default(XRegExp) {
-  /**
-   * Adds support for Unicode's general categories. E.g., `\p{Lu}` or `\p{Uppercase Letter}`. See
-   * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token
-   * names are case insensitive, and any spaces, hyphens, and underscores are ignored.
-   *
-   * Uses Unicode 12.1.0.
-   *
-   * @requires XRegExp, Unicode Base
-   */
-  if (!XRegExp.addUnicodeData) {
-    throw new ReferenceError('Unicode Base must be loaded before Unicode Categories');
-  }
-
-  XRegExp.addUnicodeData(_categories.default);
-};
-
-exports.default = _default;
-module.exports = exports["default"];
\ No newline at end of file
diff --git a/node_modules/xregexp/lib/addons/unicode-properties.js b/node_modules/xregexp/lib/addons/unicode-properties.js
deleted file mode 100644
index 26c9ef5..0000000
--- a/node_modules/xregexp/lib/addons/unicode-properties.js
+++ /dev/null
@@ -1,76 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _properties = _interopRequireDefault(require("../../tools/output/properties"));
-
-/*!
- * XRegExp Unicode Properties 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2012-present MIT License
- * Unicode data by Mathias Bynens <mathiasbynens.be>
- */
-var _default = function _default(XRegExp) {
-  /**
-   * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See
-   * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from
-   * UAX #44 <http://unicode.org/reports/tr44/>:
-   *
-   * - Alphabetic
-   *   Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm +
-   *   Lo + Nl + Other_Alphabetic.
-   *
-   * - Default_Ignorable_Code_Point
-   *   For programmatic determination of default ignorable code points. New characters that should
-   *   be ignored in rendering (unless explicitly supported) will be assigned in these ranges,
-   *   permitting programs to correctly handle the default rendering of such characters when not
-   *   otherwise supported.
-   *
-   * - Lowercase
-   *   Characters with the Lowercase property. Generated from: Ll + Other_Lowercase.
-   *
-   * - Noncharacter_Code_Point
-   *   Code points permanently reserved for internal use.
-   *
-   * - Uppercase
-   *   Characters with the Uppercase property. Generated from: Lu + Other_Uppercase.
-   *
-   * - White_Space
-   *   Spaces, separator characters and other control characters which should be treated by
-   *   programming languages as "white space" for the purpose of parsing elements.
-   *
-   * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS
-   * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are
-   * included in XRegExp's Unicode Categories and Unicode Scripts addons.
-   *
-   * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored.
-   *
-   * Uses Unicode 12.1.0.
-   *
-   * @requires XRegExp, Unicode Base
-   */
-  if (!XRegExp.addUnicodeData) {
-    throw new ReferenceError('Unicode Base must be loaded before Unicode Properties');
-  }
-
-  var unicodeData = _properties.default; // Add non-generated data
-
-  unicodeData.push({
-    name: 'Assigned',
-    // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode
-    // Categories addon is required to use this property
-    inverseOf: 'Cn'
-  });
-  XRegExp.addUnicodeData(unicodeData);
-};
-
-exports.default = _default;
-module.exports = exports["default"];
\ No newline at end of file
diff --git a/node_modules/xregexp/lib/addons/unicode-scripts.js b/node_modules/xregexp/lib/addons/unicode-scripts.js
deleted file mode 100644
index b4dc30c..0000000
--- a/node_modules/xregexp/lib/addons/unicode-scripts.js
+++ /dev/null
@@ -1,38 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _scripts = _interopRequireDefault(require("../../tools/output/scripts"));
-
-/*!
- * XRegExp Unicode Scripts 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2010-present MIT License
- * Unicode data by Mathias Bynens <mathiasbynens.be>
- */
-var _default = function _default(XRegExp) {
-  /**
-   * Adds support for all Unicode scripts. E.g., `\p{Latin}`. Token names are case insensitive,
-   * and any spaces, hyphens, and underscores are ignored.
-   *
-   * Uses Unicode 12.1.0.
-   *
-   * @requires XRegExp, Unicode Base
-   */
-  if (!XRegExp.addUnicodeData) {
-    throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts');
-  }
-
-  XRegExp.addUnicodeData(_scripts.default);
-};
-
-exports.default = _default;
-module.exports = exports["default"];
\ No newline at end of file
diff --git a/node_modules/xregexp/lib/index.js b/node_modules/xregexp/lib/index.js
deleted file mode 100644
index c72bbb4..0000000
--- a/node_modules/xregexp/lib/index.js
+++ /dev/null
@@ -1,38 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _xregexp = _interopRequireDefault(require("./xregexp"));
-
-var _build = _interopRequireDefault(require("./addons/build"));
-
-var _matchrecursive = _interopRequireDefault(require("./addons/matchrecursive"));
-
-var _unicodeBase = _interopRequireDefault(require("./addons/unicode-base"));
-
-var _unicodeBlocks = _interopRequireDefault(require("./addons/unicode-blocks"));
-
-var _unicodeCategories = _interopRequireDefault(require("./addons/unicode-categories"));
-
-var _unicodeProperties = _interopRequireDefault(require("./addons/unicode-properties"));
-
-var _unicodeScripts = _interopRequireDefault(require("./addons/unicode-scripts"));
-
-(0, _build.default)(_xregexp.default);
-(0, _matchrecursive.default)(_xregexp.default);
-(0, _unicodeBase.default)(_xregexp.default);
-(0, _unicodeBlocks.default)(_xregexp.default);
-(0, _unicodeCategories.default)(_xregexp.default);
-(0, _unicodeProperties.default)(_xregexp.default);
-(0, _unicodeScripts.default)(_xregexp.default);
-var _default = _xregexp.default;
-exports.default = _default;
-module.exports = exports["default"];
\ No newline at end of file
diff --git a/node_modules/xregexp/lib/xregexp.js b/node_modules/xregexp/lib/xregexp.js
deleted file mode 100644
index 2ec4fe5..0000000
--- a/node_modules/xregexp/lib/xregexp.js
+++ /dev/null
@@ -1,2046 +0,0 @@
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
-
-var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));
-
-var _create = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/create"));
-
-var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
-
-var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
-
-var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));
-
-var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
-
-var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));
-
-var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
-
-var _sort = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort"));
-
-var _flags = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/flags"));
-
-/*!
- * XRegExp 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2007-present MIT License
- */
-
-/**
- * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and
- * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to
- * make your client-side grepping simpler and more powerful, while freeing you from related
- * cross-browser inconsistencies.
- */
-// ==--------------------------==
-// Private stuff
-// ==--------------------------==
-// Property name used for extended regex instance data
-var REGEX_DATA = 'xregexp'; // Optional features that can be installed and uninstalled
-
-var features = {
-  astral: false,
-  namespacing: false
-}; // Native methods to use and restore ('native' is an ES3 reserved keyword)
-
-var nativ = {
-  exec: RegExp.prototype.exec,
-  test: RegExp.prototype.test,
-  match: String.prototype.match,
-  replace: String.prototype.replace,
-  split: String.prototype.split
-}; // Storage for fixed/extended native methods
-
-var fixed = {}; // Storage for regexes cached by `XRegExp.cache`
-
-var regexCache = {}; // Storage for pattern details cached by the `XRegExp` constructor
-
-var patternCache = {}; // Storage for regex syntax tokens added internally or by `XRegExp.addToken`
-
-var tokens = []; // Token scopes
-
-var defaultScope = 'default';
-var classScope = 'class'; // Regexes that match native regex syntax, including octals
-
-var nativeTokens = {
-  // Any native multicharacter token in default scope, or any single character
-  'default': /\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,
-  // Any native multicharacter token in character class scope, or any single character
-  'class': /\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/
-}; // Any backreference or dollar-prefixed character in replacement strings
-
-var replacementToken = /\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g; // Check for correct `exec` handling of nonparticipating capturing groups
-
-var correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined; // Check for ES6 `flags` prop support
-
-var hasFlagsProp = (0, _flags.default)(/x/) !== undefined; // Shortcut to `Object.prototype.toString`
-
-var _ref = {},
-    toString = _ref.toString;
-
-function hasNativeFlag(flag) {
-  // Can't check based on the presence of properties/getters since browsers might support such
-  // properties even when they don't support the corresponding flag in regex construction (tested
-  // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u`
-  // throws an error)
-  var isSupported = true;
-
-  try {
-    // Can't use regex literals for testing even in a `try` because regex literals with
-    // unsupported flags cause a compilation error in IE
-    new RegExp('', flag);
-  } catch (exception) {
-    isSupported = false;
-  }
-
-  return isSupported;
-} // Check for ES6 `u` flag support
-
-
-var hasNativeU = hasNativeFlag('u'); // Check for ES6 `y` flag support
-
-var hasNativeY = hasNativeFlag('y'); // Tracker for known flags, including addon flags
-
-var registeredFlags = {
-  g: true,
-  i: true,
-  m: true,
-  u: hasNativeU,
-  y: hasNativeY
-};
-/**
- * Attaches extended data and `XRegExp.prototype` properties to a regex object.
- *
- * @private
- * @param {RegExp} regex Regex to augment.
- * @param {Array} captureNames Array with capture names, or `null`.
- * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A.
- * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A.
- * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal
- *   operations, and never exposed to users. For internal-only regexes, we can improve perf by
- *   skipping some operations like attaching `XRegExp.prototype` properties.
- * @returns {RegExp} Augmented regex.
- */
-
-function augment(regex, captureNames, xSource, xFlags, isInternalOnly) {
-  var _context;
-
-  regex[REGEX_DATA] = {
-    captureNames: captureNames
-  };
-
-  if (isInternalOnly) {
-    return regex;
-  } // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value
-
-
-  if (regex.__proto__) {
-    regex.__proto__ = XRegExp.prototype;
-  } else {
-    for (var p in XRegExp.prototype) {
-      // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this
-      // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype`
-      // extensions exist on `regex.prototype` anyway
-      regex[p] = XRegExp.prototype[p];
-    }
-  }
-
-  regex[REGEX_DATA].source = xSource; // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order
-
-  regex[REGEX_DATA].flags = xFlags ? (0, _sort.default)(_context = xFlags.split('')).call(_context).join('') : xFlags;
-  return regex;
-}
-/**
- * Removes any duplicate characters from the provided string.
- *
- * @private
- * @param {String} str String to remove duplicate characters from.
- * @returns {String} String with any duplicate characters removed.
- */
-
-
-function clipDuplicates(str) {
-  return nativ.replace.call(str, /([\s\S])(?=[\s\S]*\1)/g, '');
-}
-/**
- * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype`
- * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing
- * flags g and y while copying the regex.
- *
- * @private
- * @param {RegExp} regex Regex to copy.
- * @param {Object} [options] Options object with optional properties:
- *   - `addG` {Boolean} Add flag g while copying the regex.
- *   - `addY` {Boolean} Add flag y while copying the regex.
- *   - `removeG` {Boolean} Remove flag g while copying the regex.
- *   - `removeY` {Boolean} Remove flag y while copying the regex.
- *   - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal
- *     operations, and never exposed to users. For internal-only regexes, we can improve perf by
- *     skipping some operations like attaching `XRegExp.prototype` properties.
- *   - `source` {String} Overrides `<regex>.source`, for special cases.
- * @returns {RegExp} Copy of the provided regex, possibly with modified flags.
- */
-
-
-function copyRegex(regex, options) {
-  var _context2;
-
-  if (!XRegExp.isRegExp(regex)) {
-    throw new TypeError('Type RegExp expected');
-  }
-
-  var xData = regex[REGEX_DATA] || {};
-  var flags = getNativeFlags(regex);
-  var flagsToAdd = '';
-  var flagsToRemove = '';
-  var xregexpSource = null;
-  var xregexpFlags = null;
-  options = options || {};
-
-  if (options.removeG) {
-    flagsToRemove += 'g';
-  }
-
-  if (options.removeY) {
-    flagsToRemove += 'y';
-  }
-
-  if (flagsToRemove) {
-    flags = nativ.replace.call(flags, new RegExp("[".concat(flagsToRemove, "]+"), 'g'), '');
-  }
-
-  if (options.addG) {
-    flagsToAdd += 'g';
-  }
-
-  if (options.addY) {
-    flagsToAdd += 'y';
-  }
-
-  if (flagsToAdd) {
-    flags = clipDuplicates(flags + flagsToAdd);
-  }
-
-  if (!options.isInternalOnly) {
-    if (xData.source !== undefined) {
-      xregexpSource = xData.source;
-    } // null or undefined; don't want to add to `flags` if the previous value was null, since
-    // that indicates we're not tracking original precompilation flags
-
-
-    if ((0, _flags.default)(xData) != null) {
-      // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never
-      // removed for non-internal regexes, so don't need to handle it
-      xregexpFlags = flagsToAdd ? clipDuplicates((0, _flags.default)(xData) + flagsToAdd) : (0, _flags.default)(xData);
-    }
-  } // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid
-  // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and
-  // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the
-  // translation to native regex syntax
-
-
-  regex = augment(new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? (0, _slice.default)(_context2 = xData.captureNames).call(_context2, 0) : null, xregexpSource, xregexpFlags, options.isInternalOnly);
-  return regex;
-}
-/**
- * Converts hexadecimal to decimal.
- *
- * @private
- * @param {String} hex
- * @returns {Number}
- */
-
-
-function dec(hex) {
-  return (0, _parseInt2.default)(hex, 16);
-}
-/**
- * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an
- * inline comment or whitespace with flag x. This is used directly as a token handler function
- * passed to `XRegExp.addToken`.
- *
- * @private
- * @param {String} match Match arg of `XRegExp.addToken` handler
- * @param {String} scope Scope arg of `XRegExp.addToken` handler
- * @param {String} flags Flags arg of `XRegExp.addToken` handler
- * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match.
- */
-
-
-function getContextualTokenSeparator(match, scope, flags) {
-  if ( // No need to separate tokens if at the beginning or end of a group
-  match.input[match.index - 1] === '(' || match.input[match.index + match[0].length] === ')' || // No need to separate tokens if before or after a `|`
-  match.input[match.index - 1] === '|' || match.input[match.index + match[0].length] === '|' || // No need to separate tokens if at the beginning or end of the pattern
-  match.index < 1 || match.index + match[0].length >= match.input.length || // No need to separate tokens if at the beginning of a noncapturing group or lookahead.
-  // The way this is written relies on:
-  // - The search regex matching only 3-char strings.
-  // - Although `substr` gives chars from the end of the string if given a negative index,
-  //   the resulting substring will be too short to match. Ex: `'abcd'.substr(-1, 3) === 'd'`
-  nativ.test.call(/^\(\?[:=!]/, match.input.substr(match.index - 3, 3)) || // Avoid separating tokens when the following token is a quantifier
-  isQuantifierNext(match.input, match.index + match[0].length, flags)) {
-    return '';
-  } // Keep tokens separated. This avoids e.g. inadvertedly changing `\1 1` or `\1(?#)1` to `\11`.
-  // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax
-  // error `(? :` into `(?:`.
-
-
-  return '(?:)';
-}
-/**
- * Returns native `RegExp` flags used by a regex object.
- *
- * @private
- * @param {RegExp} regex Regex to check.
- * @returns {String} Native flags in use.
- */
-
-
-function getNativeFlags(regex) {
-  return hasFlagsProp ? (0, _flags.default)(regex) : // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation
-  // with an empty string) allows this to continue working predictably when
-  // `XRegExp.proptotype.toString` is overridden
-  nativ.exec.call(/\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1];
-}
-/**
- * Determines whether a regex has extended instance data used to track capture names.
- *
- * @private
- * @param {RegExp} regex Regex to check.
- * @returns {Boolean} Whether the regex uses named capture.
- */
-
-
-function hasNamedCapture(regex) {
-  return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames);
-}
-/**
- * Converts decimal to hexadecimal.
- *
- * @private
- * @param {Number|String} dec
- * @returns {String}
- */
-
-
-function hex(dec) {
-  return (0, _parseInt2.default)(dec, 10).toString(16);
-}
-/**
- * Checks whether the next nonignorable token after the specified position is a quantifier.
- *
- * @private
- * @param {String} pattern Pattern to search within.
- * @param {Number} pos Index in `pattern` to search at.
- * @param {String} flags Flags used by the pattern.
- * @returns {Boolean} Whether the next nonignorable token is a quantifier.
- */
-
-
-function isQuantifierNext(pattern, pos, flags) {
-  var inlineCommentPattern = '\\(\\?#[^)]*\\)';
-  var lineCommentPattern = '#[^#\\n]*';
-  var quantifierPattern = '[?*+]|{\\d+(?:,\\d*)?}';
-  return nativ.test.call((0, _includes.default)(flags).call(flags, 'x') ? // Ignore any leading whitespace, line comments, and inline comments
-  /^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/ : // Ignore any leading inline comments
-  /^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/, (0, _slice.default)(pattern).call(pattern, pos));
-}
-/**
- * Determines whether a value is of the specified type, by resolving its internal [[Class]].
- *
- * @private
- * @param {*} value Object to check.
- * @param {String} type Type to check for, in TitleCase.
- * @returns {Boolean} Whether the object matches the type.
- */
-
-
-function isType(value, type) {
-  return toString.call(value) === "[object ".concat(type, "]");
-}
-/**
- * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values.
- *
- * @private
- * @param {String} str
- * @returns {String}
- */
-
-
-function pad4(str) {
-  while (str.length < 4) {
-    str = "0".concat(str);
-  }
-
-  return str;
-}
-/**
- * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads
- * the flag preparation logic from the `XRegExp` constructor.
- *
- * @private
- * @param {String} pattern Regex pattern, possibly with a leading mode modifier.
- * @param {String} flags Any combination of flags.
- * @returns {Object} Object with properties `pattern` and `flags`.
- */
-
-
-function prepareFlags(pattern, flags) {
-  // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags
-  if (clipDuplicates(flags) !== flags) {
-    throw new SyntaxError("Invalid duplicate regex flag ".concat(flags));
-  } // Strip and apply a leading mode modifier with any combination of flags except g or y
-
-
-  pattern = nativ.replace.call(pattern, /^\(\?([\w$]+)\)/, function ($0, $1) {
-    if (nativ.test.call(/[gy]/, $1)) {
-      throw new SyntaxError("Cannot use flag g or y in mode modifier ".concat($0));
-    } // Allow duplicate flags within the mode modifier
-
-
-    flags = clipDuplicates(flags + $1);
-    return '';
-  }); // Throw on unknown native or nonnative flags
-
-  var _iteratorNormalCompletion = true;
-  var _didIteratorError = false;
-  var _iteratorError = undefined;
-
-  try {
-    for (var _iterator = (0, _getIterator2.default)(flags), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-      var flag = _step.value;
-
-      if (!registeredFlags[flag]) {
-        throw new SyntaxError("Unknown regex flag ".concat(flag));
-      }
-    }
-  } catch (err) {
-    _didIteratorError = true;
-    _iteratorError = err;
-  } finally {
-    try {
-      if (!_iteratorNormalCompletion && _iterator.return != null) {
-        _iterator.return();
-      }
-    } finally {
-      if (_didIteratorError) {
-        throw _iteratorError;
-      }
-    }
-  }
-
-  return {
-    pattern: pattern,
-    flags: flags
-  };
-}
-/**
- * Prepares an options object from the given value.
- *
- * @private
- * @param {String|Object} value Value to convert to an options object.
- * @returns {Object} Options object.
- */
-
-
-function prepareOptions(value) {
-  var options = {};
-
-  if (isType(value, 'String')) {
-    (0, _forEach.default)(XRegExp).call(XRegExp, value, /[^\s,]+/, function (match) {
-      options[match] = true;
-    });
-    return options;
-  }
-
-  return value;
-}
-/**
- * Registers a flag so it doesn't throw an 'unknown flag' error.
- *
- * @private
- * @param {String} flag Single-character flag to register.
- */
-
-
-function registerFlag(flag) {
-  if (!/^[\w$]$/.test(flag)) {
-    throw new Error('Flag must be a single character A-Za-z0-9_$');
-  }
-
-  registeredFlags[flag] = true;
-}
-/**
- * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified
- * position, until a match is found.
- *
- * @private
- * @param {String} pattern Original pattern from which an XRegExp object is being built.
- * @param {String} flags Flags being used to construct the regex.
- * @param {Number} pos Position to search for tokens within `pattern`.
- * @param {Number} scope Regex scope to apply: 'default' or 'class'.
- * @param {Object} context Context object to use for token handler functions.
- * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`.
- */
-
-
-function runTokens(pattern, flags, pos, scope, context) {
-  var i = tokens.length;
-  var leadChar = pattern[pos];
-  var result = null;
-  var match;
-  var t; // Run in reverse insertion order
-
-  while (i--) {
-    t = tokens[i];
-
-    if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope && t.scope !== 'all' || t.flag && !(0, _includes.default)(flags).call(flags, t.flag)) {
-      continue;
-    }
-
-    match = XRegExp.exec(pattern, t.regex, pos, 'sticky');
-
-    if (match) {
-      result = {
-        matchLength: match[0].length,
-        output: t.handler.call(context, match, scope, flags),
-        reparse: t.reparse
-      }; // Finished with token tests
-
-      break;
-    }
-  }
-
-  return result;
-}
-/**
- * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to
- * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if
- * the Unicode Base addon is not available, since flag A is registered by that addon.
- *
- * @private
- * @param {Boolean} on `true` to enable; `false` to disable.
- */
-
-
-function setAstral(on) {
-  features.astral = on;
-}
-/**
- * Adds named capture groups to the `groups` property of match arrays. See here for details:
- * https://github.com/tc39/proposal-regexp-named-groups
- *
- * @private
- * @param {Boolean} on `true` to enable; `false` to disable.
- */
-
-
-function setNamespacing(on) {
-  features.namespacing = on;
-}
-/**
- * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow
- * the ES5 abstract operation `ToObject`.
- *
- * @private
- * @param {*} value Object to check and return.
- * @returns {*} The provided object.
- */
-
-
-function toObject(value) {
-  // null or undefined
-  if (value == null) {
-    throw new TypeError('Cannot convert null or undefined to object');
-  }
-
-  return value;
-} // ==--------------------------==
-// Constructor
-// ==--------------------------==
-
-/**
- * Creates an extended regular expression object for matching text with a pattern. Differs from a
- * native regular expression in that additional syntax and flags are supported. The returned object
- * is in fact a native `RegExp` and works with all native methods.
- *
- * @class XRegExp
- * @constructor
- * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy.
- * @param {String} [flags] Any combination of flags.
- *   Native flags:
- *     - `g` - global
- *     - `i` - ignore case
- *     - `m` - multiline anchors
- *     - `u` - unicode (ES6)
- *     - `y` - sticky (Firefox 3+, ES6)
- *   Additional XRegExp flags:
- *     - `n` - explicit capture
- *     - `s` - dot matches all (aka singleline)
- *     - `x` - free-spacing and line comments (aka extended)
- *     - `A` - astral (requires the Unicode Base addon)
- *   Flags cannot be provided when constructing one `RegExp` from another.
- * @returns {RegExp} Extended regular expression object.
- * @example
- *
- * // With named capture and flag x
- * XRegExp(`(?<year>  [0-9]{4} ) -?  # year
- *          (?<month> [0-9]{2} ) -?  # month
- *          (?<day>   [0-9]{2} )     # day`, 'x');
- *
- * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp)
- * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and
- * // have fresh `lastIndex` properties (set to zero).
- * XRegExp(/regex/);
- */
-
-
-function XRegExp(pattern, flags) {
-  if (XRegExp.isRegExp(pattern)) {
-    if (flags !== undefined) {
-      throw new TypeError('Cannot supply flags when copying a RegExp');
-    }
-
-    return copyRegex(pattern);
-  } // Copy the argument behavior of `RegExp`
-
-
-  pattern = pattern === undefined ? '' : String(pattern);
-  flags = flags === undefined ? '' : String(flags);
-
-  if (XRegExp.isInstalled('astral') && !(0, _includes.default)(flags).call(flags, 'A')) {
-    // This causes an error to be thrown if the Unicode Base addon is not available
-    flags += 'A';
-  }
-
-  if (!patternCache[pattern]) {
-    patternCache[pattern] = {};
-  }
-
-  if (!patternCache[pattern][flags]) {
-    var context = {
-      hasNamedCapture: false,
-      captureNames: []
-    };
-    var scope = defaultScope;
-    var output = '';
-    var pos = 0;
-    var result; // Check for flag-related errors, and strip/apply flags in a leading mode modifier
-
-    var applied = prepareFlags(pattern, flags);
-    var appliedPattern = applied.pattern;
-    var appliedFlags = (0, _flags.default)(applied); // Use XRegExp's tokens to translate the pattern to a native regex pattern.
-    // `appliedPattern.length` may change on each iteration if tokens use `reparse`
-
-    while (pos < appliedPattern.length) {
-      do {
-        // Check for custom tokens at the current position
-        result = runTokens(appliedPattern, appliedFlags, pos, scope, context); // If the matched token used the `reparse` option, splice its output into the
-        // pattern before running tokens again at the same position
-
-        if (result && result.reparse) {
-          appliedPattern = (0, _slice.default)(appliedPattern).call(appliedPattern, 0, pos) + result.output + (0, _slice.default)(appliedPattern).call(appliedPattern, pos + result.matchLength);
-        }
-      } while (result && result.reparse);
-
-      if (result) {
-        output += result.output;
-        pos += result.matchLength || 1;
-      } else {
-        // Get the native token at the current position
-        var _XRegExp$exec = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky'),
-            _XRegExp$exec2 = (0, _slicedToArray2.default)(_XRegExp$exec, 1),
-            token = _XRegExp$exec2[0];
-
-        output += token;
-        pos += token.length;
-
-        if (token === '[' && scope === defaultScope) {
-          scope = classScope;
-        } else if (token === ']' && scope === classScope) {
-          scope = defaultScope;
-        }
-      }
-    }
-
-    patternCache[pattern][flags] = {
-      // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty
-      // groups are sometimes inserted during regex transpilation in order to keep tokens
-      // separated. However, more than one empty group in a row is never needed.
-      pattern: nativ.replace.call(output, /(?:\(\?:\))+/g, '(?:)'),
-      // Strip all but native flags
-      flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''),
-      // `context.captureNames` has an item for each capturing group, even if unnamed
-      captures: context.hasNamedCapture ? context.captureNames : null
-    };
-  }
-
-  var generated = patternCache[pattern][flags];
-  return augment(new RegExp(generated.pattern, (0, _flags.default)(generated)), generated.captures, pattern, flags);
-} // Add `RegExp.prototype` to the prototype chain
-
-
-XRegExp.prototype = /(?:)/; // ==--------------------------==
-// Public properties
-// ==--------------------------==
-
-/**
- * The XRegExp version number as a string containing three dot-separated parts. For example,
- * '2.0.0-beta-3'.
- *
- * @static
- * @memberOf XRegExp
- * @type String
- */
-
-XRegExp.version = '4.3.0'; // ==--------------------------==
-// Public methods
-// ==--------------------------==
-// Intentionally undocumented; used in tests and addons
-
-XRegExp._clipDuplicates = clipDuplicates;
-XRegExp._hasNativeFlag = hasNativeFlag;
-XRegExp._dec = dec;
-XRegExp._hex = hex;
-XRegExp._pad4 = pad4;
-/**
- * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to
- * create XRegExp addons. If more than one token can match the same string, the last added wins.
- *
- * @memberOf XRegExp
- * @param {RegExp} regex Regex object that matches the new token.
- * @param {Function} handler Function that returns a new pattern string (using native regex syntax)
- *   to replace the matched token within all future XRegExp regexes. Has access to persistent
- *   properties of the regex being built, through `this`. Invoked with three arguments:
- *   - The match array, with named backreference properties.
- *   - The regex scope where the match was found: 'default' or 'class'.
- *   - The flags used by the regex, including any flags in a leading mode modifier.
- *   The handler function becomes part of the XRegExp construction process, so be careful not to
- *   construct XRegExps within the function or you will trigger infinite recursion.
- * @param {Object} [options] Options object with optional properties:
- *   - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'.
- *   - `flag` {String} Single-character flag that triggers the token. This also registers the
- *     flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used.
- *   - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are
- *     not required to trigger the token. This registers the flags, to prevent XRegExp from
- *     throwing an 'unknown flag' error when any of the flags are used.
- *   - `reparse` {Boolean} Whether the `handler` function's output should not be treated as
- *     final, and instead be reparseable by other tokens (including the current token). Allows
- *     token chaining or deferring.
- *   - `leadChar` {String} Single character that occurs at the beginning of any successful match
- *     of the token (not always applicable). This doesn't change the behavior of the token unless
- *     you provide an erroneous value. However, providing it can increase the token's performance
- *     since the token can be skipped at any positions where this character doesn't appear.
- * @example
- *
- * // Basic usage: Add \a for the ALERT control code
- * XRegExp.addToken(
- *   /\\a/,
- *   () => '\\x07',
- *   {scope: 'all'}
- * );
- * XRegExp('\\a[\\a-\\n]+').test('\x07\n\x07'); // -> true
- *
- * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers.
- * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of
- * // character classes only)
- * XRegExp.addToken(
- *   /([?*+]|{\d+(?:,\d*)?})(\??)/,
- *   (match) => `${match[1]}${match[2] ? '' : '?'}`,
- *   {flag: 'U'}
- * );
- * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a'
- * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa'
- */
-
-XRegExp.addToken = function (regex, handler, options) {
-  options = options || {};
-  var _options = options,
-      optionalFlags = _options.optionalFlags;
-
-  if (options.flag) {
-    registerFlag(options.flag);
-  }
-
-  if (optionalFlags) {
-    optionalFlags = nativ.split.call(optionalFlags, '');
-    var _iteratorNormalCompletion2 = true;
-    var _didIteratorError2 = false;
-    var _iteratorError2 = undefined;
-
-    try {
-      for (var _iterator2 = (0, _getIterator2.default)(optionalFlags), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
-        var flag = _step2.value;
-        registerFlag(flag);
-      }
-    } catch (err) {
-      _didIteratorError2 = true;
-      _iteratorError2 = err;
-    } finally {
-      try {
-        if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
-          _iterator2.return();
-        }
-      } finally {
-        if (_didIteratorError2) {
-          throw _iteratorError2;
-        }
-      }
-    }
-  } // Add to the private list of syntax tokens
-
-
-  tokens.push({
-    regex: copyRegex(regex, {
-      addG: true,
-      addY: hasNativeY,
-      isInternalOnly: true
-    }),
-    handler: handler,
-    scope: options.scope || defaultScope,
-    flag: options.flag,
-    reparse: options.reparse,
-    leadChar: options.leadChar
-  }); // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags
-  // might now produce different results
-
-  XRegExp.cache.flush('patterns');
-};
-/**
- * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with
- * the same pattern and flag combination, the cached copy of the regex is returned.
- *
- * @memberOf XRegExp
- * @param {String} pattern Regex pattern string.
- * @param {String} [flags] Any combination of XRegExp flags.
- * @returns {RegExp} Cached XRegExp object.
- * @example
- *
- * while (match = XRegExp.cache('.', 'gs').exec(str)) {
- *   // The regex is compiled once only
- * }
- */
-
-
-XRegExp.cache = function (pattern, flags) {
-  if (!regexCache[pattern]) {
-    regexCache[pattern] = {};
-  }
-
-  return regexCache[pattern][flags] || (regexCache[pattern][flags] = XRegExp(pattern, flags));
-}; // Intentionally undocumented; used in tests
-
-
-XRegExp.cache.flush = function (cacheName) {
-  if (cacheName === 'patterns') {
-    // Flush the pattern cache used by the `XRegExp` constructor
-    patternCache = {};
-  } else {
-    // Flush the regex cache populated by `XRegExp.cache`
-    regexCache = {};
-  }
-};
-/**
- * Escapes any regular expression metacharacters, for use when matching literal strings. The result
- * can safely be used at any point within a regex that uses any flags.
- *
- * @memberOf XRegExp
- * @param {String} str String to escape.
- * @returns {String} String with regex metacharacters escaped.
- * @example
- *
- * XRegExp.escape('Escaped? <.>');
- * // -> 'Escaped\?\ <\.>'
- */
-
-
-XRegExp.escape = function (str) {
-  return nativ.replace.call(toObject(str), /[-\[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
-};
-/**
- * Executes a regex search in a specified string. Returns a match array or `null`. If the provided
- * regex uses named capture, named backreference properties are included on the match array.
- * Optional `pos` and `sticky` arguments specify the search start position, and whether the match
- * must start at the specified position only. The `lastIndex` property of the provided regex is not
- * used, but is updated for compatibility. Also fixes browser bugs compared to the native
- * `RegExp.prototype.exec` and can be used reliably cross-browser.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp} regex Regex to search with.
- * @param {Number} [pos=0] Zero-based index at which to start the search.
- * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position
- *   only. The string `'sticky'` is accepted as an alternative to `true`.
- * @returns {Array} Match array with named backreference properties, or `null`.
- * @example
- *
- * // Basic use, with named backreference
- * let match = XRegExp.exec('U+2620', XRegExp('U\\+(?<hex>[0-9A-F]{4})'));
- * match.hex; // -> '2620'
- *
- * // With pos and sticky, in a loop
- * let pos = 2, result = [], match;
- * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\d)>/, pos, 'sticky')) {
- *   result.push(match[1]);
- *   pos = match.index + match[0].length;
- * }
- * // result -> ['2', '3', '4']
- */
-
-
-XRegExp.exec = function (str, regex, pos, sticky) {
-  var cacheKey = 'g';
-  var addY = false;
-  var fakeY = false;
-  var match;
-  addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false);
-
-  if (addY) {
-    cacheKey += 'y';
-  } else if (sticky) {
-    // Simulate sticky matching by appending an empty capture to the original regex. The
-    // resulting regex will succeed no matter what at the current index (set with `lastIndex`),
-    // and will not search the rest of the subject string. We'll know that the original regex
-    // has failed if that last capture is `''` rather than `undefined` (i.e., if that last
-    // capture participated in the match).
-    fakeY = true;
-    cacheKey += 'FakeY';
-  }
-
-  regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.match`/`replace`
-
-  var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {
-    addG: true,
-    addY: addY,
-    source: fakeY ? "".concat(regex.source, "|()") : undefined,
-    removeY: sticky === false,
-    isInternalOnly: true
-  }));
-  pos = pos || 0;
-  r2.lastIndex = pos; // Fixed `exec` required for `lastIndex` fix, named backreferences, etc.
-
-  match = fixed.exec.call(r2, str); // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means
-  // the original regexp failed (see above).
-
-  if (fakeY && match && match.pop() === '') {
-    match = null;
-  }
-
-  if (regex.global) {
-    regex.lastIndex = match ? r2.lastIndex : 0;
-  }
-
-  return match;
-};
-/**
- * Executes a provided function once per regex match. Searches always start at the beginning of the
- * string and continue until the end, regardless of the state of the regex's `global` property and
- * initial `lastIndex`.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp} regex Regex to search with.
- * @param {Function} callback Function to execute for each match. Invoked with four arguments:
- *   - The match array, with named backreference properties.
- *   - The zero-based match index.
- *   - The string being traversed.
- *   - The regex object being used to traverse the string.
- * @example
- *
- * // Extracts every other digit from a string
- * const evens = [];
- * XRegExp.forEach('1a2345', /\d/, (match, i) => {
- *   if (i % 2) evens.push(+match[0]);
- * });
- * // evens -> [2, 4]
- */
-
-
-XRegExp.forEach = function (str, regex, callback) {
-  var pos = 0;
-  var i = -1;
-  var match;
-
-  while (match = XRegExp.exec(str, regex, pos)) {
-    // Because `regex` is provided to `callback`, the function could use the deprecated/
-    // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec`
-    // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop,
-    // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of
-    // regexes, mutating the regex will not have any effect on the iteration or matched strings,
-    // which is a nice side effect that brings extra safety.
-    callback(match, ++i, str, regex);
-    pos = match.index + (match[0].length || 1);
-  }
-};
-/**
- * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with
- * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native
- * regexes are not recompiled using XRegExp syntax.
- *
- * @memberOf XRegExp
- * @param {RegExp} regex Regex to globalize.
- * @returns {RegExp} Copy of the provided regex with flag `g` added.
- * @example
- *
- * const globalCopy = XRegExp.globalize(/regex/);
- * globalCopy.global; // -> true
- */
-
-
-XRegExp.globalize = function (regex) {
-  return copyRegex(regex, {
-    addG: true
-  });
-};
-/**
- * Installs optional features according to the specified options. Can be undone using
- * `XRegExp.uninstall`.
- *
- * @memberOf XRegExp
- * @param {Object|String} options Options object or string.
- * @example
- *
- * // With an options object
- * XRegExp.install({
- *   // Enables support for astral code points in Unicode addons (implicitly sets flag A)
- *   astral: true,
- *
- *   // Adds named capture groups to the `groups` property of matches
- *   namespacing: true
- * });
- *
- * // With an options string
- * XRegExp.install('astral namespacing');
- */
-
-
-XRegExp.install = function (options) {
-  options = prepareOptions(options);
-
-  if (!features.astral && options.astral) {
-    setAstral(true);
-  }
-
-  if (!features.namespacing && options.namespacing) {
-    setNamespacing(true);
-  }
-};
-/**
- * Checks whether an individual optional feature is installed.
- *
- * @memberOf XRegExp
- * @param {String} feature Name of the feature to check. One of:
- *   - `astral`
- *   - `namespacing`
- * @returns {Boolean} Whether the feature is installed.
- * @example
- *
- * XRegExp.isInstalled('astral');
- */
-
-
-XRegExp.isInstalled = function (feature) {
-  return !!features[feature];
-};
-/**
- * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes
- * created in another frame, when `instanceof` and `constructor` checks would fail.
- *
- * @memberOf XRegExp
- * @param {*} value Object to check.
- * @returns {Boolean} Whether the object is a `RegExp` object.
- * @example
- *
- * XRegExp.isRegExp('string'); // -> false
- * XRegExp.isRegExp(/regex/i); // -> true
- * XRegExp.isRegExp(RegExp('^', 'm')); // -> true
- * XRegExp.isRegExp(XRegExp('(?s).')); // -> true
- */
-
-
-XRegExp.isRegExp = function (value) {
-  return toString.call(value) === '[object RegExp]';
-}; // isType(value, 'RegExp');
-
-/**
- * Returns the first matched string, or in global mode, an array containing all matched strings.
- * This is essentially a more convenient re-implementation of `String.prototype.match` that gives
- * the result types you actually want (string instead of `exec`-style array in match-first mode,
- * and an empty array instead of `null` when no matches are found in match-all mode). It also lets
- * you override flag g and ignore `lastIndex`, and fixes browser bugs.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp} regex Regex to search with.
- * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to
- *   return an array of all matched strings. If not explicitly specified and `regex` uses flag g,
- *   `scope` is 'all'.
- * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all
- *   mode: Array of all matched strings, or an empty array.
- * @example
- *
- * // Match first
- * XRegExp.match('abc', /\w/); // -> 'a'
- * XRegExp.match('abc', /\w/g, 'one'); // -> 'a'
- * XRegExp.match('abc', /x/g, 'one'); // -> null
- *
- * // Match all
- * XRegExp.match('abc', /\w/g); // -> ['a', 'b', 'c']
- * XRegExp.match('abc', /\w/, 'all'); // -> ['a', 'b', 'c']
- * XRegExp.match('abc', /x/, 'all'); // -> []
- */
-
-
-XRegExp.match = function (str, regex, scope) {
-  var global = regex.global && scope !== 'one' || scope === 'all';
-  var cacheKey = (global ? 'g' : '') + (regex.sticky ? 'y' : '') || 'noGY';
-  regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`replace`
-
-  var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {
-    addG: !!global,
-    removeG: scope === 'one',
-    isInternalOnly: true
-  }));
-  var result = nativ.match.call(toObject(str), r2);
-
-  if (regex.global) {
-    regex.lastIndex = scope === 'one' && result ? // Can't use `r2.lastIndex` since `r2` is nonglobal in this case
-    result.index + result[0].length : 0;
-  }
-
-  return global ? result || [] : result && result[0];
-};
-/**
- * Retrieves the matches from searching a string using a chain of regexes that successively search
- * within previous matches. The provided `chain` array can contain regexes and or objects with
- * `regex` and `backref` properties. When a backreference is specified, the named or numbered
- * backreference is passed forward to the next regex or returned.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {Array} chain Regexes that each search for matches within preceding results.
- * @returns {Array} Matches by the last regex in the chain, or an empty array.
- * @example
- *
- * // Basic usage; matches numbers within <b> tags
- * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [
- *   XRegExp('(?is)<b>.*?</b>'),
- *   /\d+/
- * ]);
- * // -> ['2', '4', '56']
- *
- * // Passing forward and returning specific backreferences
- * html = '<a href="http://xregexp.com/api/">XRegExp</a>\
- *         <a href="http://www.google.com/">Google</a>';
- * XRegExp.matchChain(html, [
- *   {regex: /<a href="([^"]+)">/i, backref: 1},
- *   {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}
- * ]);
- * // -> ['xregexp.com', 'www.google.com']
- */
-
-
-XRegExp.matchChain = function (str, chain) {
-  return function recurseChain(values, level) {
-    var item = chain[level].regex ? chain[level] : {
-      regex: chain[level]
-    };
-    var matches = [];
-
-    function addMatch(match) {
-      if (item.backref) {
-        var ERR_UNDEFINED_GROUP = "Backreference to undefined group: ".concat(item.backref);
-        var isNamedBackref = isNaN(item.backref);
-
-        if (isNamedBackref && XRegExp.isInstalled('namespacing')) {
-          // `groups` has `null` as prototype, so using `in` instead of `hasOwnProperty`
-          if (!(item.backref in match.groups)) {
-            throw new ReferenceError(ERR_UNDEFINED_GROUP);
-          }
-        } else if (!match.hasOwnProperty(item.backref)) {
-          throw new ReferenceError(ERR_UNDEFINED_GROUP);
-        }
-
-        var backrefValue = isNamedBackref && XRegExp.isInstalled('namespacing') ? match.groups[item.backref] : match[item.backref];
-        matches.push(backrefValue || '');
-      } else {
-        matches.push(match[0]);
-      }
-    }
-
-    var _iteratorNormalCompletion3 = true;
-    var _didIteratorError3 = false;
-    var _iteratorError3 = undefined;
-
-    try {
-      for (var _iterator3 = (0, _getIterator2.default)(values), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
-        var value = _step3.value;
-        (0, _forEach.default)(XRegExp).call(XRegExp, value, item.regex, addMatch);
-      }
-    } catch (err) {
-      _didIteratorError3 = true;
-      _iteratorError3 = err;
-    } finally {
-      try {
-        if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
-          _iterator3.return();
-        }
-      } finally {
-        if (_didIteratorError3) {
-          throw _iteratorError3;
-        }
-      }
-    }
-
-    return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1);
-  }([str], 0);
-};
-/**
- * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string
- * or regex, and the replacement can be a string or a function to be called for each match. To
- * perform a global search and replace, use the optional `scope` argument or include flag g if using
- * a regex. Replacement strings can use `${n}` or `$<n>` for named and numbered backreferences.
- * Replacement functions can use named backreferences via `arguments[0].name`. Also fixes browser
- * bugs compared to the native `String.prototype.replace` and can be used reliably cross-browser.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp|String} search Search pattern to be replaced.
- * @param {String|Function} replacement Replacement string or a function invoked to create it.
- *   Replacement strings can include special replacement syntax:
- *     - $$ - Inserts a literal $ character.
- *     - $&, $0 - Inserts the matched substring.
- *     - $` - Inserts the string that precedes the matched substring (left context).
- *     - $' - Inserts the string that follows the matched substring (right context).
- *     - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts
- *       backreference n/nn.
- *     - ${n}, $<n> - Where n is a name or any number of digits that reference an existent capturing
- *       group, inserts backreference n.
- *   Replacement functions are invoked with three or more arguments:
- *     - The matched substring (corresponds to $& above). Named backreferences are accessible as
- *       properties of this first argument.
- *     - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above).
- *     - The zero-based index of the match within the total search string.
- *     - The total string being searched.
- * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not
- *   explicitly specified and using a regex with flag g, `scope` is 'all'.
- * @returns {String} New string with one or all matches replaced.
- * @example
- *
- * // Regex search, using named backreferences in replacement string
- * const name = XRegExp('(?<first>\\w+) (?<last>\\w+)');
- * XRegExp.replace('John Smith', name, '$<last>, $<first>');
- * // -> 'Smith, John'
- *
- * // Regex search, using named backreferences in replacement function
- * XRegExp.replace('John Smith', name, (match) => `${match.last}, ${match.first}`);
- * // -> 'Smith, John'
- *
- * // String search, with replace-all
- * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all');
- * // -> 'XRegExp builds XRegExps'
- */
-
-
-XRegExp.replace = function (str, search, replacement, scope) {
-  var isRegex = XRegExp.isRegExp(search);
-  var global = search.global && scope !== 'one' || scope === 'all';
-  var cacheKey = (global ? 'g' : '') + (search.sticky ? 'y' : '') || 'noGY';
-  var s2 = search;
-
-  if (isRegex) {
-    search[REGEX_DATA] = search[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s
-    // `lastIndex` isn't updated *during* replacement iterations
-
-    s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, {
-      addG: !!global,
-      removeG: scope === 'one',
-      isInternalOnly: true
-    }));
-  } else if (global) {
-    s2 = new RegExp(XRegExp.escape(String(search)), 'g');
-  } // Fixed `replace` required for named backreferences, etc.
-
-
-  var result = fixed.replace.call(toObject(str), s2, replacement);
-
-  if (isRegex && search.global) {
-    // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)
-    search.lastIndex = 0;
-  }
-
-  return result;
-};
-/**
- * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an
- * array of replacement details. Later replacements operate on the output of earlier replacements.
- * Replacement details are accepted as an array with a regex or string to search for, the
- * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp
- * replacement text syntax, which supports named backreference properties via `${name}` or
- * `$<name>`.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {Array} replacements Array of replacement detail arrays.
- * @returns {String} New string with all replacements.
- * @example
- *
- * str = XRegExp.replaceEach(str, [
- *   [XRegExp('(?<name>a)'), 'z${name}'],
- *   [/b/gi, 'y'],
- *   [/c/g, 'x', 'one'], // scope 'one' overrides /g
- *   [/d/, 'w', 'all'],  // scope 'all' overrides lack of /g
- *   ['e', 'v', 'all'],  // scope 'all' allows replace-all for strings
- *   [/f/g, ($0) => $0.toUpperCase()]
- * ]);
- */
-
-
-XRegExp.replaceEach = function (str, replacements) {
-  var _iteratorNormalCompletion4 = true;
-  var _didIteratorError4 = false;
-  var _iteratorError4 = undefined;
-
-  try {
-    for (var _iterator4 = (0, _getIterator2.default)(replacements), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
-      var r = _step4.value;
-      str = XRegExp.replace(str, r[0], r[1], r[2]);
-    }
-  } catch (err) {
-    _didIteratorError4 = true;
-    _iteratorError4 = err;
-  } finally {
-    try {
-      if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
-        _iterator4.return();
-      }
-    } finally {
-      if (_didIteratorError4) {
-        throw _iteratorError4;
-      }
-    }
-  }
-
-  return str;
-};
-/**
- * Splits a string into an array of strings using a regex or string separator. Matches of the
- * separator are not included in the result array. However, if `separator` is a regex that contains
- * capturing groups, backreferences are spliced into the result each time `separator` is matched.
- * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably
- * cross-browser.
- *
- * @memberOf XRegExp
- * @param {String} str String to split.
- * @param {RegExp|String} separator Regex or string to use for separating the string.
- * @param {Number} [limit] Maximum number of items to include in the result array.
- * @returns {Array} Array of substrings.
- * @example
- *
- * // Basic use
- * XRegExp.split('a b c', ' ');
- * // -> ['a', 'b', 'c']
- *
- * // With limit
- * XRegExp.split('a b c', ' ', 2);
- * // -> ['a', 'b']
- *
- * // Backreferences in result array
- * XRegExp.split('..word1..', /([a-z]+)(\d+)/i);
- * // -> ['..', 'word', '1', '..']
- */
-
-
-XRegExp.split = function (str, separator, limit) {
-  return fixed.split.call(toObject(str), separator, limit);
-};
-/**
- * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and
- * `sticky` arguments specify the search start position, and whether the match must start at the
- * specified position only. The `lastIndex` property of the provided regex is not used, but is
- * updated for compatibility. Also fixes browser bugs compared to the native
- * `RegExp.prototype.test` and can be used reliably cross-browser.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp} regex Regex to search with.
- * @param {Number} [pos=0] Zero-based index at which to start the search.
- * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position
- *   only. The string `'sticky'` is accepted as an alternative to `true`.
- * @returns {Boolean} Whether the regex matched the provided value.
- * @example
- *
- * // Basic use
- * XRegExp.test('abc', /c/); // -> true
- *
- * // With pos and sticky
- * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false
- * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true
- */
-// Do this the easy way :-)
-
-
-XRegExp.test = function (str, regex, pos, sticky) {
-  return !!XRegExp.exec(str, regex, pos, sticky);
-};
-/**
- * Uninstalls optional features according to the specified options. All optional features start out
- * uninstalled, so this is used to undo the actions of `XRegExp.install`.
- *
- * @memberOf XRegExp
- * @param {Object|String} options Options object or string.
- * @example
- *
- * // With an options object
- * XRegExp.uninstall({
- *   // Disables support for astral code points in Unicode addons
- *   astral: true,
- *
- *   // Don't add named capture groups to the `groups` property of matches
- *   namespacing: true
- * });
- *
- * // With an options string
- * XRegExp.uninstall('astral namespacing');
- */
-
-
-XRegExp.uninstall = function (options) {
-  options = prepareOptions(options);
-
-  if (features.astral && options.astral) {
-    setAstral(false);
-  }
-
-  if (features.namespacing && options.namespacing) {
-    setNamespacing(false);
-  }
-};
-/**
- * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as
- * regex objects or strings. Metacharacters are escaped in patterns provided as strings.
- * Backreferences in provided regex objects are automatically renumbered to work correctly within
- * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the
- * `flags` argument.
- *
- * @memberOf XRegExp
- * @param {Array} patterns Regexes and strings to combine.
- * @param {String} [flags] Any combination of XRegExp flags.
- * @param {Object} [options] Options object with optional properties:
- *   - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'.
- * @returns {RegExp} Union of the provided regexes and strings.
- * @example
- *
- * XRegExp.union(['a+b*c', /(dogs)\1/, /(cats)\1/], 'i');
- * // -> /a\+b\*c|(dogs)\1|(cats)\2/i
- *
- * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'});
- * // -> /manbearpig/i
- */
-
-
-XRegExp.union = function (patterns, flags, options) {
-  options = options || {};
-  var conjunction = options.conjunction || 'or';
-  var numCaptures = 0;
-  var numPriorCaptures;
-  var captureNames;
-
-  function rewrite(match, paren, backref) {
-    var name = captureNames[numCaptures - numPriorCaptures]; // Capturing group
-
-    if (paren) {
-      ++numCaptures; // If the current capture has a name, preserve the name
-
-      if (name) {
-        return "(?<".concat(name, ">");
-      } // Backreference
-
-    } else if (backref) {
-      // Rewrite the backreference
-      return "\\".concat(+backref + numPriorCaptures);
-    }
-
-    return match;
-  }
-
-  if (!(isType(patterns, 'Array') && patterns.length)) {
-    throw new TypeError('Must provide a nonempty array of patterns to merge');
-  }
-
-  var parts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g;
-  var output = [];
-  var _iteratorNormalCompletion5 = true;
-  var _didIteratorError5 = false;
-  var _iteratorError5 = undefined;
-
-  try {
-    for (var _iterator5 = (0, _getIterator2.default)(patterns), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
-      var pattern = _step5.value;
-
-      if (XRegExp.isRegExp(pattern)) {
-        numPriorCaptures = numCaptures;
-        captureNames = pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames || []; // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are
-        // independently valid; helps keep this simple. Named captures are put back
-
-        output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite));
-      } else {
-        output.push(XRegExp.escape(pattern));
-      }
-    }
-  } catch (err) {
-    _didIteratorError5 = true;
-    _iteratorError5 = err;
-  } finally {
-    try {
-      if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
-        _iterator5.return();
-      }
-    } finally {
-      if (_didIteratorError5) {
-        throw _iteratorError5;
-      }
-    }
-  }
-
-  var separator = conjunction === 'none' ? '' : '|';
-  return XRegExp(output.join(separator), flags);
-}; // ==--------------------------==
-// Fixed/extended native methods
-// ==--------------------------==
-
-/**
- * Adds named capture support (with backreferences returned as `result.name`), and fixes browser
- * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`.
- *
- * @memberOf RegExp
- * @param {String} str String to search.
- * @returns {Array} Match array with named backreference properties, or `null`.
- */
-
-
-fixed.exec = function (str) {
-  var origLastIndex = this.lastIndex;
-  var match = nativ.exec.apply(this, arguments);
-
-  if (match) {
-    // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing
-    // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9
-    // in standards mode follows the spec.
-    if (!correctExecNpcg && match.length > 1 && (0, _includes.default)(match).call(match, '')) {
-      var _context3;
-
-      var r2 = copyRegex(this, {
-        removeG: true,
-        isInternalOnly: true
-      }); // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed
-      // matching due to characters outside the match
-
-      nativ.replace.call((0, _slice.default)(_context3 = String(str)).call(_context3, match.index), r2, function () {
-        var len = arguments.length; // Skip index 0 and the last 2
-
-        for (var i = 1; i < len - 2; ++i) {
-          if ((i < 0 || arguments.length <= i ? undefined : arguments[i]) === undefined) {
-            match[i] = undefined;
-          }
-        }
-      });
-    } // Attach named capture properties
-
-
-    var groupsObject = match;
-
-    if (XRegExp.isInstalled('namespacing')) {
-      // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec
-      match.groups = (0, _create.default)(null);
-      groupsObject = match.groups;
-    }
-
-    if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) {
-      // Skip index 0
-      for (var i = 1; i < match.length; ++i) {
-        var name = this[REGEX_DATA].captureNames[i - 1];
-
-        if (name) {
-          groupsObject[name] = match[i];
-        }
-      }
-    } // Fix browsers that increment `lastIndex` after zero-length matches
-
-
-    if (this.global && !match[0].length && this.lastIndex > match.index) {
-      this.lastIndex = match.index;
-    }
-  }
-
-  if (!this.global) {
-    // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)
-    this.lastIndex = origLastIndex;
-  }
-
-  return match;
-};
-/**
- * Fixes browser bugs in the native `RegExp.prototype.test`.
- *
- * @memberOf RegExp
- * @param {String} str String to search.
- * @returns {Boolean} Whether the regex matched the provided value.
- */
-
-
-fixed.test = function (str) {
-  // Do this the easy way :-)
-  return !!fixed.exec.call(this, str);
-};
-/**
- * Adds named capture support (with backreferences returned as `result.name`), and fixes browser
- * bugs in the native `String.prototype.match`.
- *
- * @memberOf String
- * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`.
- * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g,
- *   the result of calling `regex.exec(this)`.
- */
-
-
-fixed.match = function (regex) {
-  if (!XRegExp.isRegExp(regex)) {
-    // Use the native `RegExp` rather than `XRegExp`
-    regex = new RegExp(regex);
-  } else if (regex.global) {
-    var result = nativ.match.apply(this, arguments); // Fixes IE bug
-
-    regex.lastIndex = 0;
-    return result;
-  }
-
-  return fixed.exec.call(regex, toObject(this));
-};
-/**
- * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement
- * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also
- * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex
- * search value, and the value of a replacement regex's `lastIndex` property during replacement
- * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third
- * (`flags`) argument. Use via `XRegExp.replace`.
- *
- * @memberOf String
- * @param {RegExp|String} search Search pattern to be replaced.
- * @param {String|Function} replacement Replacement string or a function invoked to create it.
- * @returns {String} New string with one or all matches replaced.
- */
-
-
-fixed.replace = function (search, replacement) {
-  var isRegex = XRegExp.isRegExp(search);
-  var origLastIndex;
-  var captureNames;
-  var result;
-
-  if (isRegex) {
-    if (search[REGEX_DATA]) {
-      captureNames = search[REGEX_DATA].captureNames;
-    } // Only needed if `search` is nonglobal
-
-
-    origLastIndex = search.lastIndex;
-  } else {
-    search += ''; // Type-convert
-  } // Don't use `typeof`; some older browsers return 'function' for regex objects
-
-
-  if (isType(replacement, 'Function')) {
-    // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement
-    // functions isn't type-converted to a string
-    result = nativ.replace.call(String(this), search, function () {
-      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
-        args[_key] = arguments[_key];
-      }
-
-      if (captureNames) {
-        var groupsObject;
-
-        if (XRegExp.isInstalled('namespacing')) {
-          // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec
-          groupsObject = (0, _create.default)(null);
-          args.push(groupsObject);
-        } else {
-          // Change the `args[0]` string primitive to a `String` object that can store
-          // properties. This really does need to use `String` as a constructor
-          args[0] = new String(args[0]);
-          groupsObject = args[0];
-        } // Store named backreferences
-
-
-        for (var i = 0; i < captureNames.length; ++i) {
-          if (captureNames[i]) {
-            groupsObject[captureNames[i]] = args[i + 1];
-          }
-        }
-      } // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari
-      // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1)
-
-
-      if (isRegex && search.global) {
-        search.lastIndex = args[args.length - 2] + args[0].length;
-      } // ES6 specs the context for replacement functions as `undefined`
-
-
-      return replacement.apply(void 0, args);
-    });
-  } else {
-    // Ensure that the last value of `args` will be a string when given nonstring `this`,
-    // while still throwing on null or undefined context
-    result = nativ.replace.call(this == null ? this : String(this), search, function () {
-      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
-        args[_key2] = arguments[_key2];
-      }
-
-      return nativ.replace.call(String(replacement), replacementToken, replacer);
-
-      function replacer($0, bracketed, angled, dollarToken) {
-        bracketed = bracketed || angled; // Named or numbered backreference with curly or angled braces
-
-        if (bracketed) {
-          // XRegExp behavior for `${n}` or `$<n>`:
-          // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the
-          //    entire match. Any number of leading zeros may be used.
-          // 2. Backreference to named capture `n`, if it exists and is not an integer
-          //    overridden by numbered capture. In practice, this does not overlap with
-          //    numbered capture since XRegExp does not allow named capture to use a bare
-          //    integer as the name.
-          // 3. If the name or number does not refer to an existing capturing group, it's
-          //    an error.
-          var n = +bracketed; // Type-convert; drop leading zeros
-
-          if (n <= args.length - 3) {
-            return args[n] || '';
-          } // Groups with the same name is an error, else would need `lastIndexOf`
-
-
-          n = captureNames ? (0, _indexOf.default)(captureNames).call(captureNames, bracketed) : -1;
-
-          if (n < 0) {
-            throw new SyntaxError("Backreference to undefined group ".concat($0));
-          }
-
-          return args[n + 1] || '';
-        } // Else, special variable or numbered backreference without curly braces
-
-
-        if (dollarToken === '$') {
-          // $$
-          return '$';
-        }
-
-        if (dollarToken === '&' || +dollarToken === 0) {
-          // $&, $0 (not followed by 1-9), $00
-          return args[0];
-        }
-
-        if (dollarToken === '`') {
-          var _context4;
-
-          // $` (left context)
-          return (0, _slice.default)(_context4 = args[args.length - 1]).call(_context4, 0, args[args.length - 2]);
-        }
-
-        if (dollarToken === "'") {
-          var _context5;
-
-          // $' (right context)
-          return (0, _slice.default)(_context5 = args[args.length - 1]).call(_context5, args[args.length - 2] + args[0].length);
-        } // Else, numbered backreference without braces
-
-
-        dollarToken = +dollarToken; // Type-convert; drop leading zero
-        // XRegExp behavior for `$n` and `$nn`:
-        // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits.
-        // - `$1` is an error if no capturing groups.
-        // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0`
-        //   instead.
-        // - `$01` is `$1` if at least one capturing group, else it's an error.
-        // - `$0` (not followed by 1-9) and `$00` are the entire match.
-        // Native behavior, for comparison:
-        // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+.
-        // - `$1` is a literal `$1` if no capturing groups.
-        // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups.
-        // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`.
-        // - `$0` is a literal `$0`.
-
-        if (!isNaN(dollarToken)) {
-          if (dollarToken > args.length - 3) {
-            throw new SyntaxError("Backreference to undefined group ".concat($0));
-          }
-
-          return args[dollarToken] || '';
-        } // `$` followed by an unsupported char is an error, unlike native JS
-
-
-        throw new SyntaxError("Invalid token ".concat($0));
-      }
-    });
-  }
-
-  if (isRegex) {
-    if (search.global) {
-      // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)
-      search.lastIndex = 0;
-    } else {
-      // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)
-      search.lastIndex = origLastIndex;
-    }
-  }
-
-  return result;
-};
-/**
- * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`.
- *
- * @memberOf String
- * @param {RegExp|String} separator Regex or string to use for separating the string.
- * @param {Number} [limit] Maximum number of items to include in the result array.
- * @returns {Array} Array of substrings.
- */
-
-
-fixed.split = function (separator, limit) {
-  if (!XRegExp.isRegExp(separator)) {
-    // Browsers handle nonregex split correctly, so use the faster native method
-    return nativ.split.apply(this, arguments);
-  }
-
-  var str = String(this);
-  var output = [];
-  var origLastIndex = separator.lastIndex;
-  var lastLastIndex = 0;
-  var lastLength; // Values for `limit`, per the spec:
-  // If undefined: pow(2,32) - 1
-  // If 0, Infinity, or NaN: 0
-  // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32);
-  // If negative number: pow(2,32) - floor(abs(limit))
-  // If other: Type-convert, then use the above rules
-  // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless
-  // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+
-
-  limit = (limit === undefined ? -1 : limit) >>> 0;
-  (0, _forEach.default)(XRegExp).call(XRegExp, str, separator, function (match) {
-    // This condition is not the same as `if (match[0].length)`
-    if (match.index + match[0].length > lastLastIndex) {
-      output.push((0, _slice.default)(str).call(str, lastLastIndex, match.index));
-
-      if (match.length > 1 && match.index < str.length) {
-        Array.prototype.push.apply(output, (0, _slice.default)(match).call(match, 1));
-      }
-
-      lastLength = match[0].length;
-      lastLastIndex = match.index + lastLength;
-    }
-  });
-
-  if (lastLastIndex === str.length) {
-    if (!nativ.test.call(separator, '') || lastLength) {
-      output.push('');
-    }
-  } else {
-    output.push((0, _slice.default)(str).call(str, lastLastIndex));
-  }
-
-  separator.lastIndex = origLastIndex;
-  return output.length > limit ? (0, _slice.default)(output).call(output, 0, limit) : output;
-}; // ==--------------------------==
-// Built-in syntax/flag tokens
-// ==--------------------------==
-
-/*
- * Letter escapes that natively match literal characters: `\a`, `\A`, etc. These should be
- * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser
- * consistency and to reserve their syntax, but lets them be superseded by addons.
- */
-
-
-XRegExp.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/, function (match, scope) {
-  // \B is allowed in default scope only
-  if (match[1] === 'B' && scope === defaultScope) {
-    return match[0];
-  }
-
-  throw new SyntaxError("Invalid escape ".concat(match[0]));
-}, {
-  scope: 'all',
-  leadChar: '\\'
-});
-/*
- * Unicode code point escape with curly braces: `\u{N..}`. `N..` is any one or more digit
- * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag
- * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to
- * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior
- * if you follow a `\u{N..}` token that references a code point above U+FFFF with a quantifier, or
- * if you use the same in a character class.
- */
-
-XRegExp.addToken(/\\u{([\dA-Fa-f]+)}/, function (match, scope, flags) {
-  var code = dec(match[1]);
-
-  if (code > 0x10FFFF) {
-    throw new SyntaxError("Invalid Unicode code point ".concat(match[0]));
-  }
-
-  if (code <= 0xFFFF) {
-    // Converting to \uNNNN avoids needing to escape the literal character and keep it
-    // separate from preceding tokens
-    return "\\u".concat(pad4(hex(code)));
-  } // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling
-
-
-  if (hasNativeU && (0, _includes.default)(flags).call(flags, 'u')) {
-    return match[0];
-  }
-
-  throw new SyntaxError('Cannot use Unicode code point above \\u{FFFF} without flag u');
-}, {
-  scope: 'all',
-  leadChar: '\\'
-});
-/*
- * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency.
- * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because
- * character class endings can't be determined.
- */
-
-XRegExp.addToken(/\[(\^?)\]/, // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S].
-// (?!) should work like \b\B, but is unreliable in some versions of Firefox
-
-/* eslint-disable no-confusing-arrow */
-function (match) {
-  return match[1] ? '[\\s\\S]' : '\\b\\B';
-},
-/* eslint-enable no-confusing-arrow */
-{
-  leadChar: '['
-});
-/*
- * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in
- * free-spacing mode (flag x).
- */
-
-XRegExp.addToken(/\(\?#[^)]*\)/, getContextualTokenSeparator, {
-  leadChar: '('
-});
-/*
- * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only.
- */
-
-XRegExp.addToken(/\s+|#[^\n]*\n?/, getContextualTokenSeparator, {
-  flag: 'x'
-});
-/*
- * Dot, in dotall mode (aka singleline mode, flag s) only.
- */
-
-XRegExp.addToken(/\./, function () {
-  return '[\\s\\S]';
-}, {
-  flag: 's',
-  leadChar: '.'
-});
-/*
- * Named backreference: `\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _,
- * and $ only. Also allows numbered backreferences as `\k<n>`.
- */
-
-XRegExp.addToken(/\\k<([\w$]+)>/, function (match) {
-  var _context6, _context7;
-
-  // Groups with the same name is an error, else would need `lastIndexOf`
-  var index = isNaN(match[1]) ? (0, _indexOf.default)(_context6 = this.captureNames).call(_context6, match[1]) + 1 : +match[1];
-  var endIndex = match.index + match[0].length;
-
-  if (!index || index > this.captureNames.length) {
-    throw new SyntaxError("Backreference to undefined group ".concat(match[0]));
-  } // Keep backreferences separate from subsequent literal numbers. This avoids e.g.
-  // inadvertedly changing `(?<n>)\k<n>1` to `()\11`.
-
-
-  return (0, _concat.default)(_context7 = "\\".concat(index)).call(_context7, endIndex === match.input.length || isNaN(match.input[endIndex]) ? '' : '(?:)');
-}, {
-  leadChar: '\\'
-});
-/*
- * Numbered backreference or octal, plus any following digits: `\0`, `\11`, etc. Octals except `\0`
- * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches
- * are returned unaltered. IE < 9 doesn't support backreferences above `\99` in regex syntax.
- */
-
-XRegExp.addToken(/\\(\d+)/, function (match, scope) {
-  if (!(scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== '0') {
-    throw new SyntaxError("Cannot use octal escape or backreference to undefined group ".concat(match[0]));
-  }
-
-  return match[0];
-}, {
-  scope: 'all',
-  leadChar: '\\'
-});
-/*
- * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the
- * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style
- * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively
- * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to
- * Python-style named capture as octals.
- */
-
-XRegExp.addToken(/\(\?P?<([\w$]+)>/, function (match) {
-  var _context8;
-
-  // Disallow bare integers as names because named backreferences are added to match arrays
-  // and therefore numeric properties may lead to incorrect lookups
-  if (!isNaN(match[1])) {
-    throw new SyntaxError("Cannot use integer as capture name ".concat(match[0]));
-  }
-
-  if (!XRegExp.isInstalled('namespacing') && (match[1] === 'length' || match[1] === '__proto__')) {
-    throw new SyntaxError("Cannot use reserved word as capture name ".concat(match[0]));
-  }
-
-  if ((0, _includes.default)(_context8 = this.captureNames).call(_context8, match[1])) {
-    throw new SyntaxError("Cannot use same name for multiple groups ".concat(match[0]));
-  }
-
-  this.captureNames.push(match[1]);
-  this.hasNamedCapture = true;
-  return '(';
-}, {
-  leadChar: '('
-});
-/*
- * Capturing group; match the opening parenthesis only. Required for support of named capturing
- * groups. Also adds explicit capture mode (flag n).
- */
-
-XRegExp.addToken(/\((?!\?)/, function (match, scope, flags) {
-  if ((0, _includes.default)(flags).call(flags, 'n')) {
-    return '(?:';
-  }
-
-  this.captureNames.push(null);
-  return '(';
-}, {
-  optionalFlags: 'n',
-  leadChar: '('
-});
-var _default = XRegExp;
-exports.default = _default;
-module.exports = exports["default"];
\ No newline at end of file
diff --git a/node_modules/xregexp/package.json b/node_modules/xregexp/package.json
deleted file mode 100644
index ea8df15..0000000
--- a/node_modules/xregexp/package.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
-  "name": "xregexp",
-  "version": "4.3.0",
-  "description": "Extended regular expressions",
-  "homepage": "http://xregexp.com/",
-  "author": "Steven Levithan <steves_list@hotmail.com>",
-  "license": "MIT",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/slevithan/xregexp.git"
-  },
-  "keywords": [
-    "regex",
-    "regexp",
-    "regular expression",
-    "unicode"
-  ],
-  "main": "./lib",
-  "files": [
-    "src",
-    "lib",
-    "tools/output",
-    "xregexp-all.js"
-  ],
-  "scripts": {
-    "lint": "eslint .",
-    "babel": "babel src -d lib",
-    "build-unicode-data": "node tools/scripts/block-regex.js && node tools/scripts/category-regex.js && node tools/scripts/property-regex.js && node tools/scripts/script-regex.js",
-    "prebuild": "npm run build-unicode-data && npm run lint && npm run babel",
-    "build": "browserify lib/index.js --standalone XRegExp > xregexp-all.js",
-    "pretest": "npm run build",
-    "test": "jasmine JASMINE_CONFIG_PATH=tests/jasmine.json",
-    "test-saucelabs": "npm run pretest && zuul tests/spec/*.js",
-    "test-browser": "npm run test-saucelabs -- --local --open",
-    "prepublish": "npm test"
-  },
-  "devDependencies": {
-    "@babel/cli": "^7.2.3",
-    "@babel/core": "^7.2.2",
-    "@babel/plugin-transform-runtime": "^7.8.3",
-    "@babel/preset-env": "^7.2.3",
-    "babel-plugin-add-module-exports": "^0.2.1",
-    "babel-plugin-array-includes": "^2.0.3",
-    "babel-plugin-transform-xregexp": "^0.0.6",
-    "browserify": "^16.2.0",
-    "eslint": "^4.19.1",
-    "jasmine": "^3.1.0",
-    "jsesc": "^2.5.1",
-    "unicode-12.1.0": "^0.8.0",
-    "unicode-property-value-aliases": "^3.0.0",
-    "zuul": "^3.11.1"
-  },
-  "dependencies": {
-    "@babel/runtime-corejs3": "^7.8.3"
-  }
-}
diff --git a/node_modules/xregexp/src/addons/build.js b/node_modules/xregexp/src/addons/build.js
deleted file mode 100644
index bd07704..0000000
--- a/node_modules/xregexp/src/addons/build.js
+++ /dev/null
@@ -1,234 +0,0 @@
-/*!
- * XRegExp.build 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2012-present MIT License
- */
-
-export default (XRegExp) => {
-    const REGEX_DATA = 'xregexp';
-    const subParts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g;
-    const parts = XRegExp.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/, subParts], 'g', {
-        conjunction: 'or'
-    });
-
-    /**
-     * Strips a leading `^` and trailing unescaped `$`, if both are present.
-     *
-     * @private
-     * @param {String} pattern Pattern to process.
-     * @returns {String} Pattern with edge anchors removed.
-     */
-    function deanchor(pattern) {
-        // Allow any number of empty noncapturing groups before/after anchors, because regexes
-        // built/generated by XRegExp sometimes include them
-        const leadingAnchor = /^(?:\(\?:\))*\^/;
-        const trailingAnchor = /\$(?:\(\?:\))*$/;
-
-        if (
-            leadingAnchor.test(pattern) &&
-            trailingAnchor.test(pattern) &&
-            // Ensure that the trailing `$` isn't escaped
-            trailingAnchor.test(pattern.replace(/\\[\s\S]/g, ''))
-        ) {
-            return pattern.replace(leadingAnchor, '').replace(trailingAnchor, '');
-        }
-
-        return pattern;
-    }
-
-    /**
-     * Converts the provided value to an XRegExp. Native RegExp flags are not preserved.
-     *
-     * @private
-     * @param {String|RegExp} value Value to convert.
-     * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not
-     *   already a regex generated by XRegExp
-     * @returns {RegExp} XRegExp object with XRegExp syntax applied.
-     */
-    function asXRegExp(value, addFlagX) {
-        const flags = addFlagX ? 'x' : '';
-        return XRegExp.isRegExp(value) ?
-            (value[REGEX_DATA] && value[REGEX_DATA].captureNames ?
-                // Don't recompile, to preserve capture names
-                value :
-                // Recompile as XRegExp
-                XRegExp(value.source, flags)
-            ) :
-            // Compile string as XRegExp
-            XRegExp(value, flags);
-    }
-
-    function interpolate(substitution) {
-        return substitution instanceof RegExp ? substitution : XRegExp.escape(substitution);
-    }
-
-    function reduceToSubpatternsObject(subpatterns, interpolated, subpatternIndex) {
-        subpatterns[`subpattern${subpatternIndex}`] = interpolated;
-        return subpatterns;
-    }
-
-    function embedSubpatternAfter(raw, subpatternIndex, rawLiterals) {
-        const hasSubpattern = subpatternIndex < rawLiterals.length - 1;
-        return raw + (hasSubpattern ? `{{subpattern${subpatternIndex}}}` : '');
-    }
-
-    /**
-     * Provides tagged template literals that create regexes with XRegExp syntax and flags. The
-     * provided pattern is handled as a raw string, so backslashes don't need to be escaped.
-     *
-     * Interpolation of strings and regexes shares the features of `XRegExp.build`. Interpolated
-     * patterns are treated as atomic units when quantified, interpolated strings have their special
-     * characters escaped, a leading `^` and trailing unescaped `$` are stripped from interpolated
-     * regexes if both are present, and any backreferences within an interpolated regex are
-     * rewritten to work within the overall pattern.
-     *
-     * @memberOf XRegExp
-     * @param {String} [flags] Any combination of XRegExp flags.
-     * @returns {Function} Handler for template literals that construct regexes with XRegExp syntax.
-     * @example
-     *
-     * const h12 = /1[0-2]|0?[1-9]/;
-     * const h24 = /2[0-3]|[01][0-9]/;
-     * const hours = XRegExp.tag('x')`${h12} : | ${h24}`;
-     * const minutes = /^[0-5][0-9]$/;
-     * // Note that explicitly naming the 'minutes' group is required for named backreferences
-     * const time = XRegExp.tag('x')`^ ${hours} (?<minutes>${minutes}) $`;
-     * time.test('10:59'); // -> true
-     * XRegExp.exec('10:59', time).minutes; // -> '59'
-     */
-    XRegExp.tag = (flags) => (literals, ...substitutions) => {
-        const subpatterns = substitutions.map(interpolate).reduce(reduceToSubpatternsObject, {});
-        const pattern = literals.raw.map(embedSubpatternAfter).join('');
-        return XRegExp.build(pattern, subpatterns, flags);
-    };
-
-    /**
-     * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in
-     * the outer pattern and provided subpatterns are automatically renumbered to work correctly.
-     * Native flags used by provided subpatterns are ignored in favor of the `flags` argument.
-     *
-     * @memberOf XRegExp
-     * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows
-     *   `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within
-     *   character classes.
-     * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A
-     *   leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present.
-     * @param {String} [flags] Any combination of XRegExp flags.
-     * @returns {RegExp} Regex with interpolated subpatterns.
-     * @example
-     *
-     * const time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {
-     *   hours: XRegExp.build('{{h12}} : | {{h24}}', {
-     *     h12: /1[0-2]|0?[1-9]/,
-     *     h24: /2[0-3]|[01][0-9]/
-     *   }, 'x'),
-     *   minutes: /^[0-5][0-9]$/
-     * });
-     * time.test('10:59'); // -> true
-     * XRegExp.exec('10:59', time).minutes; // -> '59'
-     */
-    XRegExp.build = (pattern, subs, flags) => {
-        flags = flags || '';
-        // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how
-        // some browsers convert `RegExp('\n')` to a regex that contains the literal characters `\`
-        // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>.
-        const addFlagX = flags.includes('x');
-        const inlineFlags = /^\(\?([\w$]+)\)/.exec(pattern);
-        // Add flags within a leading mode modifier to the overall pattern's flags
-        if (inlineFlags) {
-            flags = XRegExp._clipDuplicates(flags + inlineFlags[1]);
-        }
-
-        const data = {};
-        for (const p in subs) {
-            if (subs.hasOwnProperty(p)) {
-                // Passing to XRegExp enables extended syntax and ensures independent validity,
-                // lest an unescaped `(`, `)`, `[`, or trailing `\` breaks the `(?:)` wrapper. For
-                // subpatterns provided as native regexes, it dies on octals and adds the property
-                // used to hold extended regex instance data, for simplicity.
-                const sub = asXRegExp(subs[p], addFlagX);
-                data[p] = {
-                    // Deanchoring allows embedding independently useful anchored regexes. If you
-                    // really need to keep your anchors, double them (i.e., `^^...$$`).
-                    pattern: deanchor(sub.source),
-                    names: sub[REGEX_DATA].captureNames || []
-                };
-            }
-        }
-
-        // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid;
-        // helps keep this simple. Named captures will be put back.
-        const patternAsRegex = asXRegExp(pattern, addFlagX);
-
-        // 'Caps' is short for 'captures'
-        let numCaps = 0;
-        let numPriorCaps;
-        let numOuterCaps = 0;
-        const outerCapsMap = [0];
-        const outerCapNames = patternAsRegex[REGEX_DATA].captureNames || [];
-        const output = patternAsRegex.source.replace(parts, ($0, $1, $2, $3, $4) => {
-            const subName = $1 || $2;
-            let capName;
-            let intro;
-            let localCapIndex;
-            // Named subpattern
-            if (subName) {
-                if (!data.hasOwnProperty(subName)) {
-                    throw new ReferenceError(`Undefined property ${$0}`);
-                }
-                // Named subpattern was wrapped in a capturing group
-                if ($1) {
-                    capName = outerCapNames[numOuterCaps];
-                    outerCapsMap[++numOuterCaps] = ++numCaps;
-                    // If it's a named group, preserve the name. Otherwise, use the subpattern name
-                    // as the capture name
-                    intro = `(?<${capName || subName}>`;
-                } else {
-                    intro = '(?:';
-                }
-                numPriorCaps = numCaps;
-                const rewrittenSubpattern = data[subName].pattern.replace(subParts, (match, paren, backref) => {
-                    // Capturing group
-                    if (paren) {
-                        capName = data[subName].names[numCaps - numPriorCaps];
-                        ++numCaps;
-                        // If the current capture has a name, preserve the name
-                        if (capName) {
-                            return `(?<${capName}>`;
-                        }
-                    // Backreference
-                    } else if (backref) {
-                        localCapIndex = +backref - 1;
-                        // Rewrite the backreference
-                        return data[subName].names[localCapIndex] ?
-                            // Need to preserve the backreference name in case using flag `n`
-                            `\\k<${data[subName].names[localCapIndex]}>` :
-                            `\\${+backref + numPriorCaps}`;
-                    }
-                    return match;
-                });
-                return `${intro}${rewrittenSubpattern})`;
-            }
-            // Capturing group
-            if ($3) {
-                capName = outerCapNames[numOuterCaps];
-                outerCapsMap[++numOuterCaps] = ++numCaps;
-                // If the current capture has a name, preserve the name
-                if (capName) {
-                    return `(?<${capName}>`;
-                }
-            // Backreference
-            } else if ($4) {
-                localCapIndex = +$4 - 1;
-                // Rewrite the backreference
-                return outerCapNames[localCapIndex] ?
-                    // Need to preserve the backreference name in case using flag `n`
-                    `\\k<${outerCapNames[localCapIndex]}>` :
-                    `\\${outerCapsMap[+$4]}`;
-            }
-            return $0;
-        });
-
-        return XRegExp(output, flags);
-    };
-};
diff --git a/node_modules/xregexp/src/addons/matchrecursive.js b/node_modules/xregexp/src/addons/matchrecursive.js
deleted file mode 100644
index 8fe927f..0000000
--- a/node_modules/xregexp/src/addons/matchrecursive.js
+++ /dev/null
@@ -1,197 +0,0 @@
-/*!
- * XRegExp.matchRecursive 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2009-present MIT License
- */
-
-export default (XRegExp) => {
-
-    /**
-     * Returns a match detail object composed of the provided values.
-     *
-     * @private
-     */
-    function row(name, value, start, end) {
-        return {
-            name,
-            value,
-            start,
-            end
-        };
-    }
-
-    /**
-     * Returns an array of match strings between outermost left and right delimiters, or an array of
-     * objects with detailed match parts and position data. An error is thrown if delimiters are
-     * unbalanced within the data.
-     *
-     * @memberOf XRegExp
-     * @param {String} str String to search.
-     * @param {String} left Left delimiter as an XRegExp pattern.
-     * @param {String} right Right delimiter as an XRegExp pattern.
-     * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters.
-     * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options.
-     * @returns {Array} Array of matches, or an empty array.
-     * @example
-     *
-     * // Basic usage
-     * let str = '(t((e))s)t()(ing)';
-     * XRegExp.matchRecursive(str, '\\(', '\\)', 'g');
-     * // -> ['t((e))s', '', 'ing']
-     *
-     * // Extended information mode with valueNames
-     * str = 'Here is <div> <div>an</div></div> example';
-     * XRegExp.matchRecursive(str, '<div\\s*>', '</div>', 'gi', {
-     *   valueNames: ['between', 'left', 'match', 'right']
-     * });
-     * // -> [
-     * // {name: 'between', value: 'Here is ',       start: 0,  end: 8},
-     * // {name: 'left',    value: '<div>',          start: 8,  end: 13},
-     * // {name: 'match',   value: ' <div>an</div>', start: 13, end: 27},
-     * // {name: 'right',   value: '</div>',         start: 27, end: 33},
-     * // {name: 'between', value: ' example',       start: 33, end: 41}
-     * // ]
-     *
-     * // Omitting unneeded parts with null valueNames, and using escapeChar
-     * str = '...{1}.\\{{function(x,y){return {y:x}}}';
-     * XRegExp.matchRecursive(str, '{', '}', 'g', {
-     *   valueNames: ['literal', null, 'value', null],
-     *   escapeChar: '\\'
-     * });
-     * // -> [
-     * // {name: 'literal', value: '...',  start: 0, end: 3},
-     * // {name: 'value',   value: '1',    start: 4, end: 5},
-     * // {name: 'literal', value: '.\\{', start: 6, end: 9},
-     * // {name: 'value',   value: 'function(x,y){return {y:x}}', start: 10, end: 37}
-     * // ]
-     *
-     * // Sticky mode via flag y
-     * str = '<1><<<2>>><3>4<5>';
-     * XRegExp.matchRecursive(str, '<', '>', 'gy');
-     * // -> ['1', '<<2>>', '3']
-     */
-    XRegExp.matchRecursive = (str, left, right, flags, options) => {
-        flags = flags || '';
-        options = options || {};
-        const global = flags.includes('g');
-        const sticky = flags.includes('y');
-        // Flag `y` is controlled internally
-        const basicFlags = flags.replace(/y/g, '');
-        let {escapeChar} = options;
-        const vN = options.valueNames;
-        const output = [];
-        let openTokens = 0;
-        let delimStart = 0;
-        let delimEnd = 0;
-        let lastOuterEnd = 0;
-        let outerStart;
-        let innerStart;
-        let leftMatch;
-        let rightMatch;
-        let esc;
-        left = XRegExp(left, basicFlags);
-        right = XRegExp(right, basicFlags);
-
-        if (escapeChar) {
-            if (escapeChar.length > 1) {
-                throw new Error('Cannot use more than one escape character');
-            }
-            escapeChar = XRegExp.escape(escapeChar);
-            // Example of concatenated `esc` regex:
-            // `escapeChar`: '%'
-            // `left`: '<'
-            // `right`: '>'
-            // Regex is: /(?:%[\S\s]|(?:(?!<|>)[^%])+)+/
-            esc = new RegExp(
-                `(?:${escapeChar}[\\S\\s]|(?:(?!${
-                    // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`.
-                    // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax
-                    // transformation resulting from those flags was already applied to `left` and
-                    // `right` when they were passed through the XRegExp constructor above.
-                    XRegExp.union([left, right], '', {conjunction: 'or'}).source
-                })[^${escapeChar}])+)+`,
-                // Flags `gy` not needed here
-                flags.replace(/[^imu]+/g, '')
-            );
-        }
-
-        while (true) {
-            // If using an escape character, advance to the delimiter's next starting position,
-            // skipping any escaped characters in between
-            if (escapeChar) {
-                delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length;
-            }
-            leftMatch = XRegExp.exec(str, left, delimEnd);
-            rightMatch = XRegExp.exec(str, right, delimEnd);
-            // Keep the leftmost match only
-            if (leftMatch && rightMatch) {
-                if (leftMatch.index <= rightMatch.index) {
-                    rightMatch = null;
-                } else {
-                    leftMatch = null;
-                }
-            }
-            // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens):
-            // LM | RM | OT | Result
-            // 1  | 0  | 1  | loop
-            // 1  | 0  | 0  | loop
-            // 0  | 1  | 1  | loop
-            // 0  | 1  | 0  | throw
-            // 0  | 0  | 1  | throw
-            // 0  | 0  | 0  | break
-            // The paths above don't include the sticky mode special case. The loop ends after the
-            // first completed match if not `global`.
-            if (leftMatch || rightMatch) {
-                delimStart = (leftMatch || rightMatch).index;
-                delimEnd = delimStart + (leftMatch || rightMatch)[0].length;
-            } else if (!openTokens) {
-                break;
-            }
-            if (sticky && !openTokens && delimStart > lastOuterEnd) {
-                break;
-            }
-            if (leftMatch) {
-                if (!openTokens) {
-                    outerStart = delimStart;
-                    innerStart = delimEnd;
-                }
-                ++openTokens;
-            } else if (rightMatch && openTokens) {
-                if (!--openTokens) {
-                    if (vN) {
-                        if (vN[0] && outerStart > lastOuterEnd) {
-                            output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart));
-                        }
-                        if (vN[1]) {
-                            output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart));
-                        }
-                        if (vN[2]) {
-                            output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart));
-                        }
-                        if (vN[3]) {
-                            output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd));
-                        }
-                    } else {
-                        output.push(str.slice(innerStart, delimStart));
-                    }
-                    lastOuterEnd = delimEnd;
-                    if (!global) {
-                        break;
-                    }
-                }
-            } else {
-                throw new Error('Unbalanced delimiter found in string');
-            }
-            // If the delimiter matched an empty string, avoid an infinite loop
-            if (delimStart === delimEnd) {
-                ++delimEnd;
-            }
-        }
-
-        if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) {
-            output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length));
-        }
-
-        return output;
-    };
-};
diff --git a/node_modules/xregexp/src/addons/unicode-base.js b/node_modules/xregexp/src/addons/unicode-base.js
deleted file mode 100644
index 19784d7..0000000
--- a/node_modules/xregexp/src/addons/unicode-base.js
+++ /dev/null
@@ -1,256 +0,0 @@
-/*!
- * XRegExp Unicode Base 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2008-present MIT License
- */
-
-export default (XRegExp) => {
-
-    /**
-     * Adds base support for Unicode matching:
-     * - Adds syntax `\p{..}` for matching Unicode tokens. Tokens can be inverted using `\P{..}` or
-     *   `\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the
-     *   braces for token names that are a single letter (e.g. `\pL` or `PL`).
-     * - Adds flag A (astral), which enables 21-bit Unicode support.
-     * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data.
-     *
-     * Unicode Base relies on externally provided Unicode character data. Official addons are
-     * available to provide data for Unicode categories, scripts, blocks, and properties.
-     *
-     * @requires XRegExp
-     */
-
-    // ==--------------------------==
-    // Private stuff
-    // ==--------------------------==
-
-    // Storage for Unicode data
-    const unicode = {};
-
-    // Reuse utils
-    const dec = XRegExp._dec;
-    const hex = XRegExp._hex;
-    const pad4 = XRegExp._pad4;
-
-    // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed
-    function normalize(name) {
-        return name.replace(/[- _]+/g, '').toLowerCase();
-    }
-
-    // Gets the decimal code of a literal code unit, \xHH, \uHHHH, or a backslash-escaped literal
-    function charCode(chr) {
-        const esc = /^\\[xu](.+)/.exec(chr);
-        return esc ?
-            dec(esc[1]) :
-            chr.charCodeAt(chr[0] === '\\' ? 1 : 0);
-    }
-
-    // Inverts a list of ordered BMP characters and ranges
-    function invertBmp(range) {
-        let output = '';
-        let lastEnd = -1;
-
-        XRegExp.forEach(
-            range,
-            /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/,
-            (m) => {
-                const start = charCode(m[1]);
-                if (start > (lastEnd + 1)) {
-                    output += `\\u${pad4(hex(lastEnd + 1))}`;
-                    if (start > (lastEnd + 2)) {
-                        output += `-\\u${pad4(hex(start - 1))}`;
-                    }
-                }
-                lastEnd = charCode(m[2] || m[1]);
-            }
-        );
-
-        if (lastEnd < 0xFFFF) {
-            output += `\\u${pad4(hex(lastEnd + 1))}`;
-            if (lastEnd < 0xFFFE) {
-                output += '-\\uFFFF';
-            }
-        }
-
-        return output;
-    }
-
-    // Generates an inverted BMP range on first use
-    function cacheInvertedBmp(slug) {
-        const prop = 'b!';
-        return (
-            unicode[slug][prop] ||
-            (unicode[slug][prop] = invertBmp(unicode[slug].bmp))
-        );
-    }
-
-    // Combines and optionally negates BMP and astral data
-    function buildAstral(slug, isNegated) {
-        const item = unicode[slug];
-        let combined = '';
-
-        if (item.bmp && !item.isBmpLast) {
-            combined = `[${item.bmp}]${item.astral ? '|' : ''}`;
-        }
-        if (item.astral) {
-            combined += item.astral;
-        }
-        if (item.isBmpLast && item.bmp) {
-            combined += `${item.astral ? '|' : ''}[${item.bmp}]`;
-        }
-
-        // Astral Unicode tokens always match a code point, never a code unit
-        return isNegated ?
-            `(?:(?!${combined})(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-\uFFFF]))` :
-            `(?:${combined})`;
-    }
-
-    // Builds a complete astral pattern on first use
-    function cacheAstral(slug, isNegated) {
-        const prop = isNegated ? 'a!' : 'a=';
-        return (
-            unicode[slug][prop] ||
-            (unicode[slug][prop] = buildAstral(slug, isNegated))
-        );
-    }
-
-    // ==--------------------------==
-    // Core functionality
-    // ==--------------------------==
-
-    /*
-     * Add astral mode (flag A) and Unicode token syntax: `\p{..}`, `\P{..}`, `\p{^..}`, `\pC`.
-     */
-    XRegExp.addToken(
-        // Use `*` instead of `+` to avoid capturing `^` as the token name in `\p{^}`
-        /\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/,
-        (match, scope, flags) => {
-            const ERR_DOUBLE_NEG = 'Invalid double negation ';
-            const ERR_UNKNOWN_NAME = 'Unknown Unicode token ';
-            const ERR_UNKNOWN_REF = 'Unicode token missing data ';
-            const ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token ';
-            const ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes';
-            // Negated via \P{..} or \p{^..}
-            let isNegated = match[1] === 'P' || !!match[2];
-            // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A
-            const isAstralMode = flags.includes('A');
-            // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\p{}`
-            let slug = normalize(match[4] || match[3]);
-            // Token data object
-            let item = unicode[slug];
-
-            if (match[1] === 'P' && match[2]) {
-                throw new SyntaxError(ERR_DOUBLE_NEG + match[0]);
-            }
-            if (!unicode.hasOwnProperty(slug)) {
-                throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]);
-            }
-
-            // Switch to the negated form of the referenced Unicode token
-            if (item.inverseOf) {
-                slug = normalize(item.inverseOf);
-                if (!unicode.hasOwnProperty(slug)) {
-                    throw new ReferenceError(`${ERR_UNKNOWN_REF + match[0]} -> ${item.inverseOf}`);
-                }
-                item = unicode[slug];
-                isNegated = !isNegated;
-            }
-
-            if (!(item.bmp || isAstralMode)) {
-                throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]);
-            }
-            if (isAstralMode) {
-                if (scope === 'class') {
-                    throw new SyntaxError(ERR_ASTRAL_IN_CLASS);
-                }
-
-                return cacheAstral(slug, isNegated);
-            }
-
-            return scope === 'class' ?
-                (isNegated ? cacheInvertedBmp(slug) : item.bmp) :
-                `${(isNegated ? '[^' : '[') + item.bmp}]`;
-        },
-        {
-            scope: 'all',
-            optionalFlags: 'A',
-            leadChar: '\\'
-        }
-    );
-
-    /**
-     * Adds to the list of Unicode tokens that XRegExp regexes can match via `\p` or `\P`.
-     *
-     * @memberOf XRegExp
-     * @param {Array} data Objects with named character ranges. Each object may have properties
-     *   `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are
-     *   optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If
-     *   `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent,
-     *   the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are
-     *   provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and
-     *   `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan
-     *   high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and
-     *   `astral` data should be a combination of literal characters and `\xHH` or `\uHHHH` escape
-     *   sequences, with hyphens to create ranges. Any regex metacharacters in the data should be
-     *   escaped, apart from range-creating hyphens. The `astral` data can additionally use
-     *   character classes and alternation, and should use surrogate pairs to represent astral code
-     *   points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is
-     *   defined as the exact inverse of another token.
-     * @example
-     *
-     * // Basic use
-     * XRegExp.addUnicodeData([{
-     *   name: 'XDigit',
-     *   alias: 'Hexadecimal',
-     *   bmp: '0-9A-Fa-f'
-     * }]);
-     * XRegExp('\\p{XDigit}:\\p{Hexadecimal}+').test('0:3D'); // -> true
-     */
-    XRegExp.addUnicodeData = (data) => {
-        const ERR_NO_NAME = 'Unicode token requires name';
-        const ERR_NO_DATA = 'Unicode token has no character data ';
-
-        for (const item of data) {
-            if (!item.name) {
-                throw new Error(ERR_NO_NAME);
-            }
-            if (!(item.inverseOf || item.bmp || item.astral)) {
-                throw new Error(ERR_NO_DATA + item.name);
-            }
-            unicode[normalize(item.name)] = item;
-            if (item.alias) {
-                unicode[normalize(item.alias)] = item;
-            }
-        }
-
-        // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and
-        // flags might now produce different results
-        XRegExp.cache.flush('patterns');
-    };
-
-    /**
-     * @ignore
-     *
-     * Return a reference to the internal Unicode definition structure for the given Unicode
-     * Property if the given name is a legal Unicode Property for use in XRegExp `\p` or `\P` regex
-     * constructs.
-     *
-     * @memberOf XRegExp
-     * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive),
-     *   e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode
-     *   Properties and Property Aliases.
-     * @returns {Object} Reference to definition structure when the name matches a Unicode Property.
-     *
-     * @note
-     * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories.
-     *
-     * @note
-     * This method is *not* part of the officially documented API and may change or be removed in
-     * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode
-     * structures set up by XRegExp.
-     */
-    XRegExp._getUnicodeProperty = (name) => {
-        const slug = normalize(name);
-        return unicode[slug];
-    };
-};
diff --git a/node_modules/xregexp/src/addons/unicode-blocks.js b/node_modules/xregexp/src/addons/unicode-blocks.js
deleted file mode 100644
index 61f11f9..0000000
--- a/node_modules/xregexp/src/addons/unicode-blocks.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/*!
- * XRegExp Unicode Blocks 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2010-present MIT License
- * Unicode data by Mathias Bynens <mathiasbynens.be>
- */
-
-import blocks from '../../tools/output/blocks';
-
-export default (XRegExp) => {
-
-    /**
-     * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g.,
-     * `\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and
-     * underscores are ignored.
-     *
-     * Uses Unicode 12.1.0.
-     *
-     * @requires XRegExp, Unicode Base
-     */
-
-    if (!XRegExp.addUnicodeData) {
-        throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks');
-    }
-
-    XRegExp.addUnicodeData(blocks);
-};
diff --git a/node_modules/xregexp/src/addons/unicode-categories.js b/node_modules/xregexp/src/addons/unicode-categories.js
deleted file mode 100644
index bdf529b..0000000
--- a/node_modules/xregexp/src/addons/unicode-categories.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/*!
- * XRegExp Unicode Categories 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2010-present MIT License
- * Unicode data by Mathias Bynens <mathiasbynens.be>
- */
-
-import categories from '../../tools/output/categories';
-
-export default (XRegExp) => {
-
-    /**
-     * Adds support for Unicode's general categories. E.g., `\p{Lu}` or `\p{Uppercase Letter}`. See
-     * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token
-     * names are case insensitive, and any spaces, hyphens, and underscores are ignored.
-     *
-     * Uses Unicode 12.1.0.
-     *
-     * @requires XRegExp, Unicode Base
-     */
-
-    if (!XRegExp.addUnicodeData) {
-        throw new ReferenceError('Unicode Base must be loaded before Unicode Categories');
-    }
-
-    XRegExp.addUnicodeData(categories);
-};
diff --git a/node_modules/xregexp/src/addons/unicode-properties.js b/node_modules/xregexp/src/addons/unicode-properties.js
deleted file mode 100644
index c44810a..0000000
--- a/node_modules/xregexp/src/addons/unicode-properties.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*!
- * XRegExp Unicode Properties 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2012-present MIT License
- * Unicode data by Mathias Bynens <mathiasbynens.be>
- */
-
-import properties from '../../tools/output/properties';
-
-export default (XRegExp) => {
-
-    /**
-     * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See
-     * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from
-     * UAX #44 <http://unicode.org/reports/tr44/>:
-     *
-     * - Alphabetic
-     *   Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm +
-     *   Lo + Nl + Other_Alphabetic.
-     *
-     * - Default_Ignorable_Code_Point
-     *   For programmatic determination of default ignorable code points. New characters that should
-     *   be ignored in rendering (unless explicitly supported) will be assigned in these ranges,
-     *   permitting programs to correctly handle the default rendering of such characters when not
-     *   otherwise supported.
-     *
-     * - Lowercase
-     *   Characters with the Lowercase property. Generated from: Ll + Other_Lowercase.
-     *
-     * - Noncharacter_Code_Point
-     *   Code points permanently reserved for internal use.
-     *
-     * - Uppercase
-     *   Characters with the Uppercase property. Generated from: Lu + Other_Uppercase.
-     *
-     * - White_Space
-     *   Spaces, separator characters and other control characters which should be treated by
-     *   programming languages as "white space" for the purpose of parsing elements.
-     *
-     * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS
-     * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are
-     * included in XRegExp's Unicode Categories and Unicode Scripts addons.
-     *
-     * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored.
-     *
-     * Uses Unicode 12.1.0.
-     *
-     * @requires XRegExp, Unicode Base
-     */
-
-    if (!XRegExp.addUnicodeData) {
-        throw new ReferenceError('Unicode Base must be loaded before Unicode Properties');
-    }
-
-    const unicodeData = properties;
-
-    // Add non-generated data
-    unicodeData.push({
-        name: 'Assigned',
-        // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode
-        // Categories addon is required to use this property
-        inverseOf: 'Cn'
-    });
-
-    XRegExp.addUnicodeData(unicodeData);
-};
diff --git a/node_modules/xregexp/src/addons/unicode-scripts.js b/node_modules/xregexp/src/addons/unicode-scripts.js
deleted file mode 100644
index 94806b2..0000000
--- a/node_modules/xregexp/src/addons/unicode-scripts.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/*!
- * XRegExp Unicode Scripts 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2010-present MIT License
- * Unicode data by Mathias Bynens <mathiasbynens.be>
- */
-
-import scripts from '../../tools/output/scripts';
-
-export default (XRegExp) => {
-
-    /**
-     * Adds support for all Unicode scripts. E.g., `\p{Latin}`. Token names are case insensitive,
-     * and any spaces, hyphens, and underscores are ignored.
-     *
-     * Uses Unicode 12.1.0.
-     *
-     * @requires XRegExp, Unicode Base
-     */
-
-    if (!XRegExp.addUnicodeData) {
-        throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts');
-    }
-
-    XRegExp.addUnicodeData(scripts);
-};
diff --git a/node_modules/xregexp/src/index.js b/node_modules/xregexp/src/index.js
deleted file mode 100644
index 8fad874..0000000
--- a/node_modules/xregexp/src/index.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import XRegExp from './xregexp';
-
-import build from './addons/build';
-import matchRecursive from './addons/matchrecursive';
-import unicodeBase from './addons/unicode-base';
-import unicodeBlocks from './addons/unicode-blocks';
-import unicodeCategories from './addons/unicode-categories';
-import unicodeProperties from './addons/unicode-properties';
-import unicodeScripts from './addons/unicode-scripts';
-
-build(XRegExp);
-matchRecursive(XRegExp);
-unicodeBase(XRegExp);
-unicodeBlocks(XRegExp);
-unicodeCategories(XRegExp);
-unicodeProperties(XRegExp);
-unicodeScripts(XRegExp);
-
-export default XRegExp;
diff --git a/node_modules/xregexp/src/xregexp.js b/node_modules/xregexp/src/xregexp.js
deleted file mode 100644
index 4fec6c0..0000000
--- a/node_modules/xregexp/src/xregexp.js
+++ /dev/null
@@ -1,1881 +0,0 @@
-/*!
- * XRegExp 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2007-present MIT License
- */
-
-/**
- * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and
- * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to
- * make your client-side grepping simpler and more powerful, while freeing you from related
- * cross-browser inconsistencies.
- */
-
-// ==--------------------------==
-// Private stuff
-// ==--------------------------==
-
-// Property name used for extended regex instance data
-const REGEX_DATA = 'xregexp';
-// Optional features that can be installed and uninstalled
-const features = {
-    astral: false,
-    namespacing: false
-};
-// Native methods to use and restore ('native' is an ES3 reserved keyword)
-const nativ = {
-    exec: RegExp.prototype.exec,
-    test: RegExp.prototype.test,
-    match: String.prototype.match,
-    replace: String.prototype.replace,
-    split: String.prototype.split
-};
-// Storage for fixed/extended native methods
-const fixed = {};
-// Storage for regexes cached by `XRegExp.cache`
-let regexCache = {};
-// Storage for pattern details cached by the `XRegExp` constructor
-let patternCache = {};
-// Storage for regex syntax tokens added internally or by `XRegExp.addToken`
-const tokens = [];
-// Token scopes
-const defaultScope = 'default';
-const classScope = 'class';
-// Regexes that match native regex syntax, including octals
-const nativeTokens = {
-    // Any native multicharacter token in default scope, or any single character
-    'default': /\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,
-    // Any native multicharacter token in character class scope, or any single character
-    'class': /\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/
-};
-// Any backreference or dollar-prefixed character in replacement strings
-const replacementToken = /\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g;
-// Check for correct `exec` handling of nonparticipating capturing groups
-const correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined;
-// Check for ES6 `flags` prop support
-const hasFlagsProp = /x/.flags !== undefined;
-// Shortcut to `Object.prototype.toString`
-const {toString} = {};
-
-function hasNativeFlag(flag) {
-    // Can't check based on the presence of properties/getters since browsers might support such
-    // properties even when they don't support the corresponding flag in regex construction (tested
-    // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u`
-    // throws an error)
-    let isSupported = true;
-    try {
-        // Can't use regex literals for testing even in a `try` because regex literals with
-        // unsupported flags cause a compilation error in IE
-        new RegExp('', flag);
-    } catch (exception) {
-        isSupported = false;
-    }
-    return isSupported;
-}
-// Check for ES6 `u` flag support
-const hasNativeU = hasNativeFlag('u');
-// Check for ES6 `y` flag support
-const hasNativeY = hasNativeFlag('y');
-// Tracker for known flags, including addon flags
-const registeredFlags = {
-    g: true,
-    i: true,
-    m: true,
-    u: hasNativeU,
-    y: hasNativeY
-};
-
-/**
- * Attaches extended data and `XRegExp.prototype` properties to a regex object.
- *
- * @private
- * @param {RegExp} regex Regex to augment.
- * @param {Array} captureNames Array with capture names, or `null`.
- * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A.
- * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A.
- * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal
- *   operations, and never exposed to users. For internal-only regexes, we can improve perf by
- *   skipping some operations like attaching `XRegExp.prototype` properties.
- * @returns {RegExp} Augmented regex.
- */
-function augment(regex, captureNames, xSource, xFlags, isInternalOnly) {
-    regex[REGEX_DATA] = {
-        captureNames
-    };
-
-    if (isInternalOnly) {
-        return regex;
-    }
-
-    // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value
-    if (regex.__proto__) {
-        regex.__proto__ = XRegExp.prototype;
-    } else {
-        for (const p in XRegExp.prototype) {
-            // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this
-            // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype`
-            // extensions exist on `regex.prototype` anyway
-            regex[p] = XRegExp.prototype[p];
-        }
-    }
-
-    regex[REGEX_DATA].source = xSource;
-    // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order
-    regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags;
-
-    return regex;
-}
-
-/**
- * Removes any duplicate characters from the provided string.
- *
- * @private
- * @param {String} str String to remove duplicate characters from.
- * @returns {String} String with any duplicate characters removed.
- */
-function clipDuplicates(str) {
-    return nativ.replace.call(str, /([\s\S])(?=[\s\S]*\1)/g, '');
-}
-
-/**
- * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype`
- * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing
- * flags g and y while copying the regex.
- *
- * @private
- * @param {RegExp} regex Regex to copy.
- * @param {Object} [options] Options object with optional properties:
- *   - `addG` {Boolean} Add flag g while copying the regex.
- *   - `addY` {Boolean} Add flag y while copying the regex.
- *   - `removeG` {Boolean} Remove flag g while copying the regex.
- *   - `removeY` {Boolean} Remove flag y while copying the regex.
- *   - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal
- *     operations, and never exposed to users. For internal-only regexes, we can improve perf by
- *     skipping some operations like attaching `XRegExp.prototype` properties.
- *   - `source` {String} Overrides `<regex>.source`, for special cases.
- * @returns {RegExp} Copy of the provided regex, possibly with modified flags.
- */
-function copyRegex(regex, options) {
-    if (!XRegExp.isRegExp(regex)) {
-        throw new TypeError('Type RegExp expected');
-    }
-
-    const xData = regex[REGEX_DATA] || {};
-    let flags = getNativeFlags(regex);
-    let flagsToAdd = '';
-    let flagsToRemove = '';
-    let xregexpSource = null;
-    let xregexpFlags = null;
-
-    options = options || {};
-
-    if (options.removeG) {flagsToRemove += 'g';}
-    if (options.removeY) {flagsToRemove += 'y';}
-    if (flagsToRemove) {
-        flags = nativ.replace.call(flags, new RegExp(`[${flagsToRemove}]+`, 'g'), '');
-    }
-
-    if (options.addG) {flagsToAdd += 'g';}
-    if (options.addY) {flagsToAdd += 'y';}
-    if (flagsToAdd) {
-        flags = clipDuplicates(flags + flagsToAdd);
-    }
-
-    if (!options.isInternalOnly) {
-        if (xData.source !== undefined) {
-            xregexpSource = xData.source;
-        }
-        // null or undefined; don't want to add to `flags` if the previous value was null, since
-        // that indicates we're not tracking original precompilation flags
-        if (xData.flags != null) {
-            // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never
-            // removed for non-internal regexes, so don't need to handle it
-            xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags;
-        }
-    }
-
-    // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid
-    // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and
-    // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the
-    // translation to native regex syntax
-    regex = augment(
-        new RegExp(options.source || regex.source, flags),
-        hasNamedCapture(regex) ? xData.captureNames.slice(0) : null,
-        xregexpSource,
-        xregexpFlags,
-        options.isInternalOnly
-    );
-
-    return regex;
-}
-
-/**
- * Converts hexadecimal to decimal.
- *
- * @private
- * @param {String} hex
- * @returns {Number}
- */
-function dec(hex) {
-    return parseInt(hex, 16);
-}
-
-/**
- * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an
- * inline comment or whitespace with flag x. This is used directly as a token handler function
- * passed to `XRegExp.addToken`.
- *
- * @private
- * @param {String} match Match arg of `XRegExp.addToken` handler
- * @param {String} scope Scope arg of `XRegExp.addToken` handler
- * @param {String} flags Flags arg of `XRegExp.addToken` handler
- * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match.
- */
-function getContextualTokenSeparator(match, scope, flags) {
-    if (
-        // No need to separate tokens if at the beginning or end of a group
-        match.input[match.index - 1] === '(' ||
-        match.input[match.index + match[0].length] === ')' ||
-
-        // No need to separate tokens if before or after a `|`
-        match.input[match.index - 1] === '|' ||
-        match.input[match.index + match[0].length] === '|' ||
-
-        // No need to separate tokens if at the beginning or end of the pattern
-        match.index < 1 ||
-        match.index + match[0].length >= match.input.length ||
-
-        // No need to separate tokens if at the beginning of a noncapturing group or lookahead.
-        // The way this is written relies on:
-        // - The search regex matching only 3-char strings.
-        // - Although `substr` gives chars from the end of the string if given a negative index,
-        //   the resulting substring will be too short to match. Ex: `'abcd'.substr(-1, 3) === 'd'`
-        nativ.test.call(/^\(\?[:=!]/, match.input.substr(match.index - 3, 3)) ||
-
-        // Avoid separating tokens when the following token is a quantifier
-        isQuantifierNext(match.input, match.index + match[0].length, flags)
-    ) {
-        return '';
-    }
-    // Keep tokens separated. This avoids e.g. inadvertedly changing `\1 1` or `\1(?#)1` to `\11`.
-    // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax
-    // error `(? :` into `(?:`.
-    return '(?:)';
-}
-
-/**
- * Returns native `RegExp` flags used by a regex object.
- *
- * @private
- * @param {RegExp} regex Regex to check.
- * @returns {String} Native flags in use.
- */
-function getNativeFlags(regex) {
-    return hasFlagsProp ?
-        regex.flags :
-        // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation
-        // with an empty string) allows this to continue working predictably when
-        // `XRegExp.proptotype.toString` is overridden
-        nativ.exec.call(/\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1];
-}
-
-/**
- * Determines whether a regex has extended instance data used to track capture names.
- *
- * @private
- * @param {RegExp} regex Regex to check.
- * @returns {Boolean} Whether the regex uses named capture.
- */
-function hasNamedCapture(regex) {
-    return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames);
-}
-
-/**
- * Converts decimal to hexadecimal.
- *
- * @private
- * @param {Number|String} dec
- * @returns {String}
- */
-function hex(dec) {
-    return parseInt(dec, 10).toString(16);
-}
-
-/**
- * Checks whether the next nonignorable token after the specified position is a quantifier.
- *
- * @private
- * @param {String} pattern Pattern to search within.
- * @param {Number} pos Index in `pattern` to search at.
- * @param {String} flags Flags used by the pattern.
- * @returns {Boolean} Whether the next nonignorable token is a quantifier.
- */
-function isQuantifierNext(pattern, pos, flags) {
-    const inlineCommentPattern = '\\(\\?#[^)]*\\)';
-    const lineCommentPattern = '#[^#\\n]*';
-    const quantifierPattern = '[?*+]|{\\d+(?:,\\d*)?}';
-    return nativ.test.call(
-        flags.includes('x') ?
-            // Ignore any leading whitespace, line comments, and inline comments
-            new RegExp(`^(?:\\s|${lineCommentPattern}|${inlineCommentPattern})*(?:${quantifierPattern})`) :
-            // Ignore any leading inline comments
-            new RegExp(`^(?:${inlineCommentPattern})*(?:${quantifierPattern})`),
-        pattern.slice(pos)
-    );
-}
-
-/**
- * Determines whether a value is of the specified type, by resolving its internal [[Class]].
- *
- * @private
- * @param {*} value Object to check.
- * @param {String} type Type to check for, in TitleCase.
- * @returns {Boolean} Whether the object matches the type.
- */
-function isType(value, type) {
-    return toString.call(value) === `[object ${type}]`;
-}
-
-/**
- * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values.
- *
- * @private
- * @param {String} str
- * @returns {String}
- */
-function pad4(str) {
-    while (str.length < 4) {
-        str = `0${str}`;
-    }
-    return str;
-}
-
-/**
- * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads
- * the flag preparation logic from the `XRegExp` constructor.
- *
- * @private
- * @param {String} pattern Regex pattern, possibly with a leading mode modifier.
- * @param {String} flags Any combination of flags.
- * @returns {Object} Object with properties `pattern` and `flags`.
- */
-function prepareFlags(pattern, flags) {
-    // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags
-    if (clipDuplicates(flags) !== flags) {
-        throw new SyntaxError(`Invalid duplicate regex flag ${flags}`);
-    }
-
-    // Strip and apply a leading mode modifier with any combination of flags except g or y
-    pattern = nativ.replace.call(pattern, /^\(\?([\w$]+)\)/, ($0, $1) => {
-        if (nativ.test.call(/[gy]/, $1)) {
-            throw new SyntaxError(`Cannot use flag g or y in mode modifier ${$0}`);
-        }
-        // Allow duplicate flags within the mode modifier
-        flags = clipDuplicates(flags + $1);
-        return '';
-    });
-
-    // Throw on unknown native or nonnative flags
-    for (const flag of flags) {
-        if (!registeredFlags[flag]) {
-            throw new SyntaxError(`Unknown regex flag ${flag}`);
-        }
-    }
-
-    return {
-        pattern,
-        flags
-    };
-}
-
-/**
- * Prepares an options object from the given value.
- *
- * @private
- * @param {String|Object} value Value to convert to an options object.
- * @returns {Object} Options object.
- */
-function prepareOptions(value) {
-    const options = {};
-
-    if (isType(value, 'String')) {
-        XRegExp.forEach(value, /[^\s,]+/, (match) => {
-            options[match] = true;
-        });
-
-        return options;
-    }
-
-    return value;
-}
-
-/**
- * Registers a flag so it doesn't throw an 'unknown flag' error.
- *
- * @private
- * @param {String} flag Single-character flag to register.
- */
-function registerFlag(flag) {
-    if (!/^[\w$]$/.test(flag)) {
-        throw new Error('Flag must be a single character A-Za-z0-9_$');
-    }
-
-    registeredFlags[flag] = true;
-}
-
-/**
- * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified
- * position, until a match is found.
- *
- * @private
- * @param {String} pattern Original pattern from which an XRegExp object is being built.
- * @param {String} flags Flags being used to construct the regex.
- * @param {Number} pos Position to search for tokens within `pattern`.
- * @param {Number} scope Regex scope to apply: 'default' or 'class'.
- * @param {Object} context Context object to use for token handler functions.
- * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`.
- */
-function runTokens(pattern, flags, pos, scope, context) {
-    let i = tokens.length;
-    const leadChar = pattern[pos];
-    let result = null;
-    let match;
-    let t;
-
-    // Run in reverse insertion order
-    while (i--) {
-        t = tokens[i];
-        if (
-            (t.leadChar && t.leadChar !== leadChar) ||
-            (t.scope !== scope && t.scope !== 'all') ||
-            (t.flag && !flags.includes(t.flag))
-        ) {
-            continue;
-        }
-
-        match = XRegExp.exec(pattern, t.regex, pos, 'sticky');
-        if (match) {
-            result = {
-                matchLength: match[0].length,
-                output: t.handler.call(context, match, scope, flags),
-                reparse: t.reparse
-            };
-            // Finished with token tests
-            break;
-        }
-    }
-
-    return result;
-}
-
-/**
- * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to
- * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if
- * the Unicode Base addon is not available, since flag A is registered by that addon.
- *
- * @private
- * @param {Boolean} on `true` to enable; `false` to disable.
- */
-function setAstral(on) {
-    features.astral = on;
-}
-
-/**
- * Adds named capture groups to the `groups` property of match arrays. See here for details:
- * https://github.com/tc39/proposal-regexp-named-groups
- *
- * @private
- * @param {Boolean} on `true` to enable; `false` to disable.
- */
-function setNamespacing(on) {
-    features.namespacing = on;
-}
-
-/**
- * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow
- * the ES5 abstract operation `ToObject`.
- *
- * @private
- * @param {*} value Object to check and return.
- * @returns {*} The provided object.
- */
-function toObject(value) {
-    // null or undefined
-    if (value == null) {
-        throw new TypeError('Cannot convert null or undefined to object');
-    }
-
-    return value;
-}
-
-// ==--------------------------==
-// Constructor
-// ==--------------------------==
-
-/**
- * Creates an extended regular expression object for matching text with a pattern. Differs from a
- * native regular expression in that additional syntax and flags are supported. The returned object
- * is in fact a native `RegExp` and works with all native methods.
- *
- * @class XRegExp
- * @constructor
- * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy.
- * @param {String} [flags] Any combination of flags.
- *   Native flags:
- *     - `g` - global
- *     - `i` - ignore case
- *     - `m` - multiline anchors
- *     - `u` - unicode (ES6)
- *     - `y` - sticky (Firefox 3+, ES6)
- *   Additional XRegExp flags:
- *     - `n` - explicit capture
- *     - `s` - dot matches all (aka singleline)
- *     - `x` - free-spacing and line comments (aka extended)
- *     - `A` - astral (requires the Unicode Base addon)
- *   Flags cannot be provided when constructing one `RegExp` from another.
- * @returns {RegExp} Extended regular expression object.
- * @example
- *
- * // With named capture and flag x
- * XRegExp(`(?<year>  [0-9]{4} ) -?  # year
- *          (?<month> [0-9]{2} ) -?  # month
- *          (?<day>   [0-9]{2} )     # day`, 'x');
- *
- * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp)
- * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and
- * // have fresh `lastIndex` properties (set to zero).
- * XRegExp(/regex/);
- */
-function XRegExp(pattern, flags) {
-    if (XRegExp.isRegExp(pattern)) {
-        if (flags !== undefined) {
-            throw new TypeError('Cannot supply flags when copying a RegExp');
-        }
-        return copyRegex(pattern);
-    }
-
-    // Copy the argument behavior of `RegExp`
-    pattern = pattern === undefined ? '' : String(pattern);
-    flags = flags === undefined ? '' : String(flags);
-
-    if (XRegExp.isInstalled('astral') && !flags.includes('A')) {
-        // This causes an error to be thrown if the Unicode Base addon is not available
-        flags += 'A';
-    }
-
-    if (!patternCache[pattern]) {
-        patternCache[pattern] = {};
-    }
-
-    if (!patternCache[pattern][flags]) {
-        const context = {
-            hasNamedCapture: false,
-            captureNames: []
-        };
-        let scope = defaultScope;
-        let output = '';
-        let pos = 0;
-        let result;
-
-        // Check for flag-related errors, and strip/apply flags in a leading mode modifier
-        const applied = prepareFlags(pattern, flags);
-        let appliedPattern = applied.pattern;
-        const appliedFlags = applied.flags;
-
-        // Use XRegExp's tokens to translate the pattern to a native regex pattern.
-        // `appliedPattern.length` may change on each iteration if tokens use `reparse`
-        while (pos < appliedPattern.length) {
-            do {
-                // Check for custom tokens at the current position
-                result = runTokens(appliedPattern, appliedFlags, pos, scope, context);
-                // If the matched token used the `reparse` option, splice its output into the
-                // pattern before running tokens again at the same position
-                if (result && result.reparse) {
-                    appliedPattern = appliedPattern.slice(0, pos) +
-                        result.output +
-                        appliedPattern.slice(pos + result.matchLength);
-                }
-            } while (result && result.reparse);
-
-            if (result) {
-                output += result.output;
-                pos += (result.matchLength || 1);
-            } else {
-                // Get the native token at the current position
-                const [token] = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky');
-                output += token;
-                pos += token.length;
-                if (token === '[' && scope === defaultScope) {
-                    scope = classScope;
-                } else if (token === ']' && scope === classScope) {
-                    scope = defaultScope;
-                }
-            }
-        }
-
-        patternCache[pattern][flags] = {
-            // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty
-            // groups are sometimes inserted during regex transpilation in order to keep tokens
-            // separated. However, more than one empty group in a row is never needed.
-            pattern: nativ.replace.call(output, /(?:\(\?:\))+/g, '(?:)'),
-            // Strip all but native flags
-            flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''),
-            // `context.captureNames` has an item for each capturing group, even if unnamed
-            captures: context.hasNamedCapture ? context.captureNames : null
-        };
-    }
-
-    const generated = patternCache[pattern][flags];
-    return augment(
-        new RegExp(generated.pattern, generated.flags),
-        generated.captures,
-        pattern,
-        flags
-    );
-}
-
-// Add `RegExp.prototype` to the prototype chain
-XRegExp.prototype = new RegExp();
-
-// ==--------------------------==
-// Public properties
-// ==--------------------------==
-
-/**
- * The XRegExp version number as a string containing three dot-separated parts. For example,
- * '2.0.0-beta-3'.
- *
- * @static
- * @memberOf XRegExp
- * @type String
- */
-XRegExp.version = '4.3.0';
-
-// ==--------------------------==
-// Public methods
-// ==--------------------------==
-
-// Intentionally undocumented; used in tests and addons
-XRegExp._clipDuplicates = clipDuplicates;
-XRegExp._hasNativeFlag = hasNativeFlag;
-XRegExp._dec = dec;
-XRegExp._hex = hex;
-XRegExp._pad4 = pad4;
-
-/**
- * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to
- * create XRegExp addons. If more than one token can match the same string, the last added wins.
- *
- * @memberOf XRegExp
- * @param {RegExp} regex Regex object that matches the new token.
- * @param {Function} handler Function that returns a new pattern string (using native regex syntax)
- *   to replace the matched token within all future XRegExp regexes. Has access to persistent
- *   properties of the regex being built, through `this`. Invoked with three arguments:
- *   - The match array, with named backreference properties.
- *   - The regex scope where the match was found: 'default' or 'class'.
- *   - The flags used by the regex, including any flags in a leading mode modifier.
- *   The handler function becomes part of the XRegExp construction process, so be careful not to
- *   construct XRegExps within the function or you will trigger infinite recursion.
- * @param {Object} [options] Options object with optional properties:
- *   - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'.
- *   - `flag` {String} Single-character flag that triggers the token. This also registers the
- *     flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used.
- *   - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are
- *     not required to trigger the token. This registers the flags, to prevent XRegExp from
- *     throwing an 'unknown flag' error when any of the flags are used.
- *   - `reparse` {Boolean} Whether the `handler` function's output should not be treated as
- *     final, and instead be reparseable by other tokens (including the current token). Allows
- *     token chaining or deferring.
- *   - `leadChar` {String} Single character that occurs at the beginning of any successful match
- *     of the token (not always applicable). This doesn't change the behavior of the token unless
- *     you provide an erroneous value. However, providing it can increase the token's performance
- *     since the token can be skipped at any positions where this character doesn't appear.
- * @example
- *
- * // Basic usage: Add \a for the ALERT control code
- * XRegExp.addToken(
- *   /\\a/,
- *   () => '\\x07',
- *   {scope: 'all'}
- * );
- * XRegExp('\\a[\\a-\\n]+').test('\x07\n\x07'); // -> true
- *
- * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers.
- * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of
- * // character classes only)
- * XRegExp.addToken(
- *   /([?*+]|{\d+(?:,\d*)?})(\??)/,
- *   (match) => `${match[1]}${match[2] ? '' : '?'}`,
- *   {flag: 'U'}
- * );
- * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a'
- * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa'
- */
-XRegExp.addToken = (regex, handler, options) => {
-    options = options || {};
-    let {optionalFlags} = options;
-
-    if (options.flag) {
-        registerFlag(options.flag);
-    }
-
-    if (optionalFlags) {
-        optionalFlags = nativ.split.call(optionalFlags, '');
-        for (const flag of optionalFlags) {
-            registerFlag(flag);
-        }
-    }
-
-    // Add to the private list of syntax tokens
-    tokens.push({
-        regex: copyRegex(regex, {
-            addG: true,
-            addY: hasNativeY,
-            isInternalOnly: true
-        }),
-        handler,
-        scope: options.scope || defaultScope,
-        flag: options.flag,
-        reparse: options.reparse,
-        leadChar: options.leadChar
-    });
-
-    // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags
-    // might now produce different results
-    XRegExp.cache.flush('patterns');
-};
-
-/**
- * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with
- * the same pattern and flag combination, the cached copy of the regex is returned.
- *
- * @memberOf XRegExp
- * @param {String} pattern Regex pattern string.
- * @param {String} [flags] Any combination of XRegExp flags.
- * @returns {RegExp} Cached XRegExp object.
- * @example
- *
- * while (match = XRegExp.cache('.', 'gs').exec(str)) {
- *   // The regex is compiled once only
- * }
- */
-XRegExp.cache = (pattern, flags) => {
-    if (!regexCache[pattern]) {
-        regexCache[pattern] = {};
-    }
-    return regexCache[pattern][flags] || (
-        regexCache[pattern][flags] = XRegExp(pattern, flags)
-    );
-};
-
-// Intentionally undocumented; used in tests
-XRegExp.cache.flush = (cacheName) => {
-    if (cacheName === 'patterns') {
-        // Flush the pattern cache used by the `XRegExp` constructor
-        patternCache = {};
-    } else {
-        // Flush the regex cache populated by `XRegExp.cache`
-        regexCache = {};
-    }
-};
-
-/**
- * Escapes any regular expression metacharacters, for use when matching literal strings. The result
- * can safely be used at any point within a regex that uses any flags.
- *
- * @memberOf XRegExp
- * @param {String} str String to escape.
- * @returns {String} String with regex metacharacters escaped.
- * @example
- *
- * XRegExp.escape('Escaped? <.>');
- * // -> 'Escaped\?\ <\.>'
- */
-XRegExp.escape = (str) => nativ.replace.call(toObject(str), /[-\[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
-
-/**
- * Executes a regex search in a specified string. Returns a match array or `null`. If the provided
- * regex uses named capture, named backreference properties are included on the match array.
- * Optional `pos` and `sticky` arguments specify the search start position, and whether the match
- * must start at the specified position only. The `lastIndex` property of the provided regex is not
- * used, but is updated for compatibility. Also fixes browser bugs compared to the native
- * `RegExp.prototype.exec` and can be used reliably cross-browser.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp} regex Regex to search with.
- * @param {Number} [pos=0] Zero-based index at which to start the search.
- * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position
- *   only. The string `'sticky'` is accepted as an alternative to `true`.
- * @returns {Array} Match array with named backreference properties, or `null`.
- * @example
- *
- * // Basic use, with named backreference
- * let match = XRegExp.exec('U+2620', XRegExp('U\\+(?<hex>[0-9A-F]{4})'));
- * match.hex; // -> '2620'
- *
- * // With pos and sticky, in a loop
- * let pos = 2, result = [], match;
- * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\d)>/, pos, 'sticky')) {
- *   result.push(match[1]);
- *   pos = match.index + match[0].length;
- * }
- * // result -> ['2', '3', '4']
- */
-XRegExp.exec = (str, regex, pos, sticky) => {
-    let cacheKey = 'g';
-    let addY = false;
-    let fakeY = false;
-    let match;
-
-    addY = hasNativeY && !!(sticky || (regex.sticky && sticky !== false));
-    if (addY) {
-        cacheKey += 'y';
-    } else if (sticky) {
-        // Simulate sticky matching by appending an empty capture to the original regex. The
-        // resulting regex will succeed no matter what at the current index (set with `lastIndex`),
-        // and will not search the rest of the subject string. We'll know that the original regex
-        // has failed if that last capture is `''` rather than `undefined` (i.e., if that last
-        // capture participated in the match).
-        fakeY = true;
-        cacheKey += 'FakeY';
-    }
-
-    regex[REGEX_DATA] = regex[REGEX_DATA] || {};
-
-    // Shares cached copies with `XRegExp.match`/`replace`
-    const r2 = regex[REGEX_DATA][cacheKey] || (
-        regex[REGEX_DATA][cacheKey] = copyRegex(regex, {
-            addG: true,
-            addY,
-            source: fakeY ? `${regex.source}|()` : undefined,
-            removeY: sticky === false,
-            isInternalOnly: true
-        })
-    );
-
-    pos = pos || 0;
-    r2.lastIndex = pos;
-
-    // Fixed `exec` required for `lastIndex` fix, named backreferences, etc.
-    match = fixed.exec.call(r2, str);
-
-    // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means
-    // the original regexp failed (see above).
-    if (fakeY && match && match.pop() === '') {
-        match = null;
-    }
-
-    if (regex.global) {
-        regex.lastIndex = match ? r2.lastIndex : 0;
-    }
-
-    return match;
-};
-
-/**
- * Executes a provided function once per regex match. Searches always start at the beginning of the
- * string and continue until the end, regardless of the state of the regex's `global` property and
- * initial `lastIndex`.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp} regex Regex to search with.
- * @param {Function} callback Function to execute for each match. Invoked with four arguments:
- *   - The match array, with named backreference properties.
- *   - The zero-based match index.
- *   - The string being traversed.
- *   - The regex object being used to traverse the string.
- * @example
- *
- * // Extracts every other digit from a string
- * const evens = [];
- * XRegExp.forEach('1a2345', /\d/, (match, i) => {
- *   if (i % 2) evens.push(+match[0]);
- * });
- * // evens -> [2, 4]
- */
-XRegExp.forEach = (str, regex, callback) => {
-    let pos = 0;
-    let i = -1;
-    let match;
-
-    while ((match = XRegExp.exec(str, regex, pos))) {
-        // Because `regex` is provided to `callback`, the function could use the deprecated/
-        // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec`
-        // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop,
-        // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of
-        // regexes, mutating the regex will not have any effect on the iteration or matched strings,
-        // which is a nice side effect that brings extra safety.
-        callback(match, ++i, str, regex);
-
-        pos = match.index + (match[0].length || 1);
-    }
-};
-
-/**
- * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with
- * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native
- * regexes are not recompiled using XRegExp syntax.
- *
- * @memberOf XRegExp
- * @param {RegExp} regex Regex to globalize.
- * @returns {RegExp} Copy of the provided regex with flag `g` added.
- * @example
- *
- * const globalCopy = XRegExp.globalize(/regex/);
- * globalCopy.global; // -> true
- */
-XRegExp.globalize = (regex) => copyRegex(regex, {addG: true});
-
-/**
- * Installs optional features according to the specified options. Can be undone using
- * `XRegExp.uninstall`.
- *
- * @memberOf XRegExp
- * @param {Object|String} options Options object or string.
- * @example
- *
- * // With an options object
- * XRegExp.install({
- *   // Enables support for astral code points in Unicode addons (implicitly sets flag A)
- *   astral: true,
- *
- *   // Adds named capture groups to the `groups` property of matches
- *   namespacing: true
- * });
- *
- * // With an options string
- * XRegExp.install('astral namespacing');
- */
-XRegExp.install = (options) => {
-    options = prepareOptions(options);
-
-    if (!features.astral && options.astral) {
-        setAstral(true);
-    }
-
-    if (!features.namespacing && options.namespacing) {
-        setNamespacing(true);
-    }
-};
-
-/**
- * Checks whether an individual optional feature is installed.
- *
- * @memberOf XRegExp
- * @param {String} feature Name of the feature to check. One of:
- *   - `astral`
- *   - `namespacing`
- * @returns {Boolean} Whether the feature is installed.
- * @example
- *
- * XRegExp.isInstalled('astral');
- */
-XRegExp.isInstalled = (feature) => !!(features[feature]);
-
-/**
- * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes
- * created in another frame, when `instanceof` and `constructor` checks would fail.
- *
- * @memberOf XRegExp
- * @param {*} value Object to check.
- * @returns {Boolean} Whether the object is a `RegExp` object.
- * @example
- *
- * XRegExp.isRegExp('string'); // -> false
- * XRegExp.isRegExp(/regex/i); // -> true
- * XRegExp.isRegExp(RegExp('^', 'm')); // -> true
- * XRegExp.isRegExp(XRegExp('(?s).')); // -> true
- */
-XRegExp.isRegExp = (value) => toString.call(value) === '[object RegExp]'; // isType(value, 'RegExp');
-
-/**
- * Returns the first matched string, or in global mode, an array containing all matched strings.
- * This is essentially a more convenient re-implementation of `String.prototype.match` that gives
- * the result types you actually want (string instead of `exec`-style array in match-first mode,
- * and an empty array instead of `null` when no matches are found in match-all mode). It also lets
- * you override flag g and ignore `lastIndex`, and fixes browser bugs.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp} regex Regex to search with.
- * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to
- *   return an array of all matched strings. If not explicitly specified and `regex` uses flag g,
- *   `scope` is 'all'.
- * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all
- *   mode: Array of all matched strings, or an empty array.
- * @example
- *
- * // Match first
- * XRegExp.match('abc', /\w/); // -> 'a'
- * XRegExp.match('abc', /\w/g, 'one'); // -> 'a'
- * XRegExp.match('abc', /x/g, 'one'); // -> null
- *
- * // Match all
- * XRegExp.match('abc', /\w/g); // -> ['a', 'b', 'c']
- * XRegExp.match('abc', /\w/, 'all'); // -> ['a', 'b', 'c']
- * XRegExp.match('abc', /x/, 'all'); // -> []
- */
-XRegExp.match = (str, regex, scope) => {
-    const global = (regex.global && scope !== 'one') || scope === 'all';
-    const cacheKey = ((global ? 'g' : '') + (regex.sticky ? 'y' : '')) || 'noGY';
-
-    regex[REGEX_DATA] = regex[REGEX_DATA] || {};
-
-    // Shares cached copies with `XRegExp.exec`/`replace`
-    const r2 = regex[REGEX_DATA][cacheKey] || (
-        regex[REGEX_DATA][cacheKey] = copyRegex(regex, {
-            addG: !!global,
-            removeG: scope === 'one',
-            isInternalOnly: true
-        })
-    );
-
-    const result = nativ.match.call(toObject(str), r2);
-
-    if (regex.global) {
-        regex.lastIndex = (
-            (scope === 'one' && result) ?
-                // Can't use `r2.lastIndex` since `r2` is nonglobal in this case
-                (result.index + result[0].length) : 0
-        );
-    }
-
-    return global ? (result || []) : (result && result[0]);
-};
-
-/**
- * Retrieves the matches from searching a string using a chain of regexes that successively search
- * within previous matches. The provided `chain` array can contain regexes and or objects with
- * `regex` and `backref` properties. When a backreference is specified, the named or numbered
- * backreference is passed forward to the next regex or returned.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {Array} chain Regexes that each search for matches within preceding results.
- * @returns {Array} Matches by the last regex in the chain, or an empty array.
- * @example
- *
- * // Basic usage; matches numbers within <b> tags
- * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [
- *   XRegExp('(?is)<b>.*?</b>'),
- *   /\d+/
- * ]);
- * // -> ['2', '4', '56']
- *
- * // Passing forward and returning specific backreferences
- * html = '<a href="http://xregexp.com/api/">XRegExp</a>\
- *         <a href="http://www.google.com/">Google</a>';
- * XRegExp.matchChain(html, [
- *   {regex: /<a href="([^"]+)">/i, backref: 1},
- *   {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}
- * ]);
- * // -> ['xregexp.com', 'www.google.com']
- */
-XRegExp.matchChain = (str, chain) => (function recurseChain(values, level) {
-    const item = chain[level].regex ? chain[level] : {regex: chain[level]};
-    const matches = [];
-
-    function addMatch(match) {
-        if (item.backref) {
-            const ERR_UNDEFINED_GROUP = `Backreference to undefined group: ${item.backref}`;
-            const isNamedBackref = isNaN(item.backref);
-
-            if (isNamedBackref && XRegExp.isInstalled('namespacing')) {
-                // `groups` has `null` as prototype, so using `in` instead of `hasOwnProperty`
-                if (!(item.backref in match.groups)) {
-                    throw new ReferenceError(ERR_UNDEFINED_GROUP);
-                }
-            } else if (!match.hasOwnProperty(item.backref)) {
-                throw new ReferenceError(ERR_UNDEFINED_GROUP);
-            }
-
-            const backrefValue = isNamedBackref && XRegExp.isInstalled('namespacing') ?
-                match.groups[item.backref] :
-                match[item.backref];
-
-            matches.push(backrefValue || '');
-        } else {
-            matches.push(match[0]);
-        }
-    }
-
-    for (const value of values) {
-        XRegExp.forEach(value, item.regex, addMatch);
-    }
-
-    return ((level === chain.length - 1) || !matches.length) ?
-        matches :
-        recurseChain(matches, level + 1);
-}([str], 0));
-
-/**
- * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string
- * or regex, and the replacement can be a string or a function to be called for each match. To
- * perform a global search and replace, use the optional `scope` argument or include flag g if using
- * a regex. Replacement strings can use `${n}` or `$<n>` for named and numbered backreferences.
- * Replacement functions can use named backreferences via `arguments[0].name`. Also fixes browser
- * bugs compared to the native `String.prototype.replace` and can be used reliably cross-browser.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp|String} search Search pattern to be replaced.
- * @param {String|Function} replacement Replacement string or a function invoked to create it.
- *   Replacement strings can include special replacement syntax:
- *     - $$ - Inserts a literal $ character.
- *     - $&, $0 - Inserts the matched substring.
- *     - $` - Inserts the string that precedes the matched substring (left context).
- *     - $' - Inserts the string that follows the matched substring (right context).
- *     - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts
- *       backreference n/nn.
- *     - ${n}, $<n> - Where n is a name or any number of digits that reference an existent capturing
- *       group, inserts backreference n.
- *   Replacement functions are invoked with three or more arguments:
- *     - The matched substring (corresponds to $& above). Named backreferences are accessible as
- *       properties of this first argument.
- *     - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above).
- *     - The zero-based index of the match within the total search string.
- *     - The total string being searched.
- * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not
- *   explicitly specified and using a regex with flag g, `scope` is 'all'.
- * @returns {String} New string with one or all matches replaced.
- * @example
- *
- * // Regex search, using named backreferences in replacement string
- * const name = XRegExp('(?<first>\\w+) (?<last>\\w+)');
- * XRegExp.replace('John Smith', name, '$<last>, $<first>');
- * // -> 'Smith, John'
- *
- * // Regex search, using named backreferences in replacement function
- * XRegExp.replace('John Smith', name, (match) => `${match.last}, ${match.first}`);
- * // -> 'Smith, John'
- *
- * // String search, with replace-all
- * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all');
- * // -> 'XRegExp builds XRegExps'
- */
-XRegExp.replace = (str, search, replacement, scope) => {
-    const isRegex = XRegExp.isRegExp(search);
-    const global = (search.global && scope !== 'one') || scope === 'all';
-    const cacheKey = ((global ? 'g' : '') + (search.sticky ? 'y' : '')) || 'noGY';
-    let s2 = search;
-
-    if (isRegex) {
-        search[REGEX_DATA] = search[REGEX_DATA] || {};
-
-        // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s
-        // `lastIndex` isn't updated *during* replacement iterations
-        s2 = search[REGEX_DATA][cacheKey] || (
-            search[REGEX_DATA][cacheKey] = copyRegex(search, {
-                addG: !!global,
-                removeG: scope === 'one',
-                isInternalOnly: true
-            })
-        );
-    } else if (global) {
-        s2 = new RegExp(XRegExp.escape(String(search)), 'g');
-    }
-
-    // Fixed `replace` required for named backreferences, etc.
-    const result = fixed.replace.call(toObject(str), s2, replacement);
-
-    if (isRegex && search.global) {
-        // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)
-        search.lastIndex = 0;
-    }
-
-    return result;
-};
-
-/**
- * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an
- * array of replacement details. Later replacements operate on the output of earlier replacements.
- * Replacement details are accepted as an array with a regex or string to search for, the
- * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp
- * replacement text syntax, which supports named backreference properties via `${name}` or
- * `$<name>`.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {Array} replacements Array of replacement detail arrays.
- * @returns {String} New string with all replacements.
- * @example
- *
- * str = XRegExp.replaceEach(str, [
- *   [XRegExp('(?<name>a)'), 'z${name}'],
- *   [/b/gi, 'y'],
- *   [/c/g, 'x', 'one'], // scope 'one' overrides /g
- *   [/d/, 'w', 'all'],  // scope 'all' overrides lack of /g
- *   ['e', 'v', 'all'],  // scope 'all' allows replace-all for strings
- *   [/f/g, ($0) => $0.toUpperCase()]
- * ]);
- */
-XRegExp.replaceEach = (str, replacements) => {
-    for (const r of replacements) {
-        str = XRegExp.replace(str, r[0], r[1], r[2]);
-    }
-
-    return str;
-};
-
-/**
- * Splits a string into an array of strings using a regex or string separator. Matches of the
- * separator are not included in the result array. However, if `separator` is a regex that contains
- * capturing groups, backreferences are spliced into the result each time `separator` is matched.
- * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably
- * cross-browser.
- *
- * @memberOf XRegExp
- * @param {String} str String to split.
- * @param {RegExp|String} separator Regex or string to use for separating the string.
- * @param {Number} [limit] Maximum number of items to include in the result array.
- * @returns {Array} Array of substrings.
- * @example
- *
- * // Basic use
- * XRegExp.split('a b c', ' ');
- * // -> ['a', 'b', 'c']
- *
- * // With limit
- * XRegExp.split('a b c', ' ', 2);
- * // -> ['a', 'b']
- *
- * // Backreferences in result array
- * XRegExp.split('..word1..', /([a-z]+)(\d+)/i);
- * // -> ['..', 'word', '1', '..']
- */
-XRegExp.split = (str, separator, limit) => fixed.split.call(toObject(str), separator, limit);
-
-/**
- * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and
- * `sticky` arguments specify the search start position, and whether the match must start at the
- * specified position only. The `lastIndex` property of the provided regex is not used, but is
- * updated for compatibility. Also fixes browser bugs compared to the native
- * `RegExp.prototype.test` and can be used reliably cross-browser.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp} regex Regex to search with.
- * @param {Number} [pos=0] Zero-based index at which to start the search.
- * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position
- *   only. The string `'sticky'` is accepted as an alternative to `true`.
- * @returns {Boolean} Whether the regex matched the provided value.
- * @example
- *
- * // Basic use
- * XRegExp.test('abc', /c/); // -> true
- *
- * // With pos and sticky
- * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false
- * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true
- */
-// Do this the easy way :-)
-XRegExp.test = (str, regex, pos, sticky) => !!XRegExp.exec(str, regex, pos, sticky);
-
-/**
- * Uninstalls optional features according to the specified options. All optional features start out
- * uninstalled, so this is used to undo the actions of `XRegExp.install`.
- *
- * @memberOf XRegExp
- * @param {Object|String} options Options object or string.
- * @example
- *
- * // With an options object
- * XRegExp.uninstall({
- *   // Disables support for astral code points in Unicode addons
- *   astral: true,
- *
- *   // Don't add named capture groups to the `groups` property of matches
- *   namespacing: true
- * });
- *
- * // With an options string
- * XRegExp.uninstall('astral namespacing');
- */
-XRegExp.uninstall = (options) => {
-    options = prepareOptions(options);
-
-    if (features.astral && options.astral) {
-        setAstral(false);
-    }
-
-    if (features.namespacing && options.namespacing) {
-        setNamespacing(false);
-    }
-};
-
-/**
- * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as
- * regex objects or strings. Metacharacters are escaped in patterns provided as strings.
- * Backreferences in provided regex objects are automatically renumbered to work correctly within
- * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the
- * `flags` argument.
- *
- * @memberOf XRegExp
- * @param {Array} patterns Regexes and strings to combine.
- * @param {String} [flags] Any combination of XRegExp flags.
- * @param {Object} [options] Options object with optional properties:
- *   - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'.
- * @returns {RegExp} Union of the provided regexes and strings.
- * @example
- *
- * XRegExp.union(['a+b*c', /(dogs)\1/, /(cats)\1/], 'i');
- * // -> /a\+b\*c|(dogs)\1|(cats)\2/i
- *
- * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'});
- * // -> /manbearpig/i
- */
-XRegExp.union = (patterns, flags, options) => {
-    options = options || {};
-    const conjunction = options.conjunction || 'or';
-    let numCaptures = 0;
-    let numPriorCaptures;
-    let captureNames;
-
-    function rewrite(match, paren, backref) {
-        const name = captureNames[numCaptures - numPriorCaptures];
-
-        // Capturing group
-        if (paren) {
-            ++numCaptures;
-            // If the current capture has a name, preserve the name
-            if (name) {
-                return `(?<${name}>`;
-            }
-        // Backreference
-        } else if (backref) {
-            // Rewrite the backreference
-            return `\\${+backref + numPriorCaptures}`;
-        }
-
-        return match;
-    }
-
-    if (!(isType(patterns, 'Array') && patterns.length)) {
-        throw new TypeError('Must provide a nonempty array of patterns to merge');
-    }
-
-    const parts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g;
-    const output = [];
-    for (const pattern of patterns) {
-        if (XRegExp.isRegExp(pattern)) {
-            numPriorCaptures = numCaptures;
-            captureNames = (pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames) || [];
-
-            // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are
-            // independently valid; helps keep this simple. Named captures are put back
-            output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite));
-        } else {
-            output.push(XRegExp.escape(pattern));
-        }
-    }
-
-    const separator = conjunction === 'none' ? '' : '|';
-    return XRegExp(output.join(separator), flags);
-};
-
-// ==--------------------------==
-// Fixed/extended native methods
-// ==--------------------------==
-
-/**
- * Adds named capture support (with backreferences returned as `result.name`), and fixes browser
- * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`.
- *
- * @memberOf RegExp
- * @param {String} str String to search.
- * @returns {Array} Match array with named backreference properties, or `null`.
- */
-fixed.exec = function(str) {
-    const origLastIndex = this.lastIndex;
-    const match = nativ.exec.apply(this, arguments);
-
-    if (match) {
-        // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing
-        // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9
-        // in standards mode follows the spec.
-        if (!correctExecNpcg && match.length > 1 && match.includes('')) {
-            const r2 = copyRegex(this, {
-                removeG: true,
-                isInternalOnly: true
-            });
-            // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed
-            // matching due to characters outside the match
-            nativ.replace.call(String(str).slice(match.index), r2, (...args) => {
-                const len = args.length;
-                // Skip index 0 and the last 2
-                for (let i = 1; i < len - 2; ++i) {
-                    if (args[i] === undefined) {
-                        match[i] = undefined;
-                    }
-                }
-            });
-        }
-
-        // Attach named capture properties
-        let groupsObject = match;
-        if (XRegExp.isInstalled('namespacing')) {
-            // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec
-            match.groups = Object.create(null);
-            groupsObject = match.groups;
-        }
-        if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) {
-            // Skip index 0
-            for (let i = 1; i < match.length; ++i) {
-                const name = this[REGEX_DATA].captureNames[i - 1];
-                if (name) {
-                    groupsObject[name] = match[i];
-                }
-            }
-        }
-
-        // Fix browsers that increment `lastIndex` after zero-length matches
-        if (this.global && !match[0].length && (this.lastIndex > match.index)) {
-            this.lastIndex = match.index;
-        }
-    }
-
-    if (!this.global) {
-        // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)
-        this.lastIndex = origLastIndex;
-    }
-
-    return match;
-};
-
-/**
- * Fixes browser bugs in the native `RegExp.prototype.test`.
- *
- * @memberOf RegExp
- * @param {String} str String to search.
- * @returns {Boolean} Whether the regex matched the provided value.
- */
-fixed.test = function(str) {
-    // Do this the easy way :-)
-    return !!fixed.exec.call(this, str);
-};
-
-/**
- * Adds named capture support (with backreferences returned as `result.name`), and fixes browser
- * bugs in the native `String.prototype.match`.
- *
- * @memberOf String
- * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`.
- * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g,
- *   the result of calling `regex.exec(this)`.
- */
-fixed.match = function(regex) {
-    if (!XRegExp.isRegExp(regex)) {
-        // Use the native `RegExp` rather than `XRegExp`
-        regex = new RegExp(regex);
-    } else if (regex.global) {
-        const result = nativ.match.apply(this, arguments);
-        // Fixes IE bug
-        regex.lastIndex = 0;
-
-        return result;
-    }
-
-    return fixed.exec.call(regex, toObject(this));
-};
-
-/**
- * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement
- * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also
- * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex
- * search value, and the value of a replacement regex's `lastIndex` property during replacement
- * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third
- * (`flags`) argument. Use via `XRegExp.replace`.
- *
- * @memberOf String
- * @param {RegExp|String} search Search pattern to be replaced.
- * @param {String|Function} replacement Replacement string or a function invoked to create it.
- * @returns {String} New string with one or all matches replaced.
- */
-fixed.replace = function(search, replacement) {
-    const isRegex = XRegExp.isRegExp(search);
-    let origLastIndex;
-    let captureNames;
-    let result;
-
-    if (isRegex) {
-        if (search[REGEX_DATA]) {
-            ({captureNames} = search[REGEX_DATA]);
-        }
-        // Only needed if `search` is nonglobal
-        origLastIndex = search.lastIndex;
-    } else {
-        search += ''; // Type-convert
-    }
-
-    // Don't use `typeof`; some older browsers return 'function' for regex objects
-    if (isType(replacement, 'Function')) {
-        // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement
-        // functions isn't type-converted to a string
-        result = nativ.replace.call(String(this), search, (...args) => {
-            if (captureNames) {
-                let groupsObject;
-
-                if (XRegExp.isInstalled('namespacing')) {
-                    // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec
-                    groupsObject = Object.create(null);
-                    args.push(groupsObject);
-                } else {
-                    // Change the `args[0]` string primitive to a `String` object that can store
-                    // properties. This really does need to use `String` as a constructor
-                    args[0] = new String(args[0]);
-                    [groupsObject] = args;
-                }
-
-                // Store named backreferences
-                for (let i = 0; i < captureNames.length; ++i) {
-                    if (captureNames[i]) {
-                        groupsObject[captureNames[i]] = args[i + 1];
-                    }
-                }
-            }
-            // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari
-            // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1)
-            if (isRegex && search.global) {
-                search.lastIndex = args[args.length - 2] + args[0].length;
-            }
-            // ES6 specs the context for replacement functions as `undefined`
-            return replacement(...args);
-        });
-    } else {
-        // Ensure that the last value of `args` will be a string when given nonstring `this`,
-        // while still throwing on null or undefined context
-        result = nativ.replace.call(this == null ? this : String(this), search, (...args) => {
-            return nativ.replace.call(String(replacement), replacementToken, replacer);
-
-            function replacer($0, bracketed, angled, dollarToken) {
-                bracketed = bracketed || angled;
-                // Named or numbered backreference with curly or angled braces
-                if (bracketed) {
-                    // XRegExp behavior for `${n}` or `$<n>`:
-                    // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the
-                    //    entire match. Any number of leading zeros may be used.
-                    // 2. Backreference to named capture `n`, if it exists and is not an integer
-                    //    overridden by numbered capture. In practice, this does not overlap with
-                    //    numbered capture since XRegExp does not allow named capture to use a bare
-                    //    integer as the name.
-                    // 3. If the name or number does not refer to an existing capturing group, it's
-                    //    an error.
-                    let n = +bracketed; // Type-convert; drop leading zeros
-                    if (n <= args.length - 3) {
-                        return args[n] || '';
-                    }
-                    // Groups with the same name is an error, else would need `lastIndexOf`
-                    n = captureNames ? captureNames.indexOf(bracketed) : -1;
-                    if (n < 0) {
-                        throw new SyntaxError(`Backreference to undefined group ${$0}`);
-                    }
-                    return args[n + 1] || '';
-                }
-                // Else, special variable or numbered backreference without curly braces
-                if (dollarToken === '$') { // $$
-                    return '$';
-                }
-                if (dollarToken === '&' || +dollarToken === 0) { // $&, $0 (not followed by 1-9), $00
-                    return args[0];
-                }
-                if (dollarToken === '`') { // $` (left context)
-                    return args[args.length - 1].slice(0, args[args.length - 2]);
-                }
-                if (dollarToken === "'") { // $' (right context)
-                    return args[args.length - 1].slice(args[args.length - 2] + args[0].length);
-                }
-                // Else, numbered backreference without braces
-                dollarToken = +dollarToken; // Type-convert; drop leading zero
-                // XRegExp behavior for `$n` and `$nn`:
-                // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits.
-                // - `$1` is an error if no capturing groups.
-                // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0`
-                //   instead.
-                // - `$01` is `$1` if at least one capturing group, else it's an error.
-                // - `$0` (not followed by 1-9) and `$00` are the entire match.
-                // Native behavior, for comparison:
-                // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+.
-                // - `$1` is a literal `$1` if no capturing groups.
-                // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups.
-                // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`.
-                // - `$0` is a literal `$0`.
-                if (!isNaN(dollarToken)) {
-                    if (dollarToken > args.length - 3) {
-                        throw new SyntaxError(`Backreference to undefined group ${$0}`);
-                    }
-                    return args[dollarToken] || '';
-                }
-                // `$` followed by an unsupported char is an error, unlike native JS
-                throw new SyntaxError(`Invalid token ${$0}`);
-            }
-        });
-    }
-
-    if (isRegex) {
-        if (search.global) {
-            // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)
-            search.lastIndex = 0;
-        } else {
-            // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)
-            search.lastIndex = origLastIndex;
-        }
-    }
-
-    return result;
-};
-
-/**
- * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`.
- *
- * @memberOf String
- * @param {RegExp|String} separator Regex or string to use for separating the string.
- * @param {Number} [limit] Maximum number of items to include in the result array.
- * @returns {Array} Array of substrings.
- */
-fixed.split = function(separator, limit) {
-    if (!XRegExp.isRegExp(separator)) {
-        // Browsers handle nonregex split correctly, so use the faster native method
-        return nativ.split.apply(this, arguments);
-    }
-
-    const str = String(this);
-    const output = [];
-    const origLastIndex = separator.lastIndex;
-    let lastLastIndex = 0;
-    let lastLength;
-
-    // Values for `limit`, per the spec:
-    // If undefined: pow(2,32) - 1
-    // If 0, Infinity, or NaN: 0
-    // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32);
-    // If negative number: pow(2,32) - floor(abs(limit))
-    // If other: Type-convert, then use the above rules
-    // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless
-    // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+
-    limit = (limit === undefined ? -1 : limit) >>> 0;
-
-    XRegExp.forEach(str, separator, (match) => {
-        // This condition is not the same as `if (match[0].length)`
-        if ((match.index + match[0].length) > lastLastIndex) {
-            output.push(str.slice(lastLastIndex, match.index));
-            if (match.length > 1 && match.index < str.length) {
-                Array.prototype.push.apply(output, match.slice(1));
-            }
-            lastLength = match[0].length;
-            lastLastIndex = match.index + lastLength;
-        }
-    });
-
-    if (lastLastIndex === str.length) {
-        if (!nativ.test.call(separator, '') || lastLength) {
-            output.push('');
-        }
-    } else {
-        output.push(str.slice(lastLastIndex));
-    }
-
-    separator.lastIndex = origLastIndex;
-    return output.length > limit ? output.slice(0, limit) : output;
-};
-
-// ==--------------------------==
-// Built-in syntax/flag tokens
-// ==--------------------------==
-
-/*
- * Letter escapes that natively match literal characters: `\a`, `\A`, etc. These should be
- * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser
- * consistency and to reserve their syntax, but lets them be superseded by addons.
- */
-XRegExp.addToken(
-    /\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/,
-    (match, scope) => {
-        // \B is allowed in default scope only
-        if (match[1] === 'B' && scope === defaultScope) {
-            return match[0];
-        }
-        throw new SyntaxError(`Invalid escape ${match[0]}`);
-    },
-    {
-        scope: 'all',
-        leadChar: '\\'
-    }
-);
-
-/*
- * Unicode code point escape with curly braces: `\u{N..}`. `N..` is any one or more digit
- * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag
- * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to
- * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior
- * if you follow a `\u{N..}` token that references a code point above U+FFFF with a quantifier, or
- * if you use the same in a character class.
- */
-XRegExp.addToken(
-    /\\u{([\dA-Fa-f]+)}/,
-    (match, scope, flags) => {
-        const code = dec(match[1]);
-        if (code > 0x10FFFF) {
-            throw new SyntaxError(`Invalid Unicode code point ${match[0]}`);
-        }
-        if (code <= 0xFFFF) {
-            // Converting to \uNNNN avoids needing to escape the literal character and keep it
-            // separate from preceding tokens
-            return `\\u${pad4(hex(code))}`;
-        }
-        // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling
-        if (hasNativeU && flags.includes('u')) {
-            return match[0];
-        }
-        throw new SyntaxError('Cannot use Unicode code point above \\u{FFFF} without flag u');
-    },
-    {
-        scope: 'all',
-        leadChar: '\\'
-    }
-);
-
-/*
- * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency.
- * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because
- * character class endings can't be determined.
- */
-XRegExp.addToken(
-    /\[(\^?)\]/,
-    // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S].
-    // (?!) should work like \b\B, but is unreliable in some versions of Firefox
-    /* eslint-disable no-confusing-arrow */
-    (match) => (match[1] ? '[\\s\\S]' : '\\b\\B'),
-    /* eslint-enable no-confusing-arrow */
-    {leadChar: '['}
-);
-
-/*
- * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in
- * free-spacing mode (flag x).
- */
-XRegExp.addToken(
-    /\(\?#[^)]*\)/,
-    getContextualTokenSeparator,
-    {leadChar: '('}
-);
-
-/*
- * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only.
- */
-XRegExp.addToken(
-    /\s+|#[^\n]*\n?/,
-    getContextualTokenSeparator,
-    {flag: 'x'}
-);
-
-/*
- * Dot, in dotall mode (aka singleline mode, flag s) only.
- */
-XRegExp.addToken(
-    /\./,
-    () => '[\\s\\S]',
-    {
-        flag: 's',
-        leadChar: '.'
-    }
-);
-
-/*
- * Named backreference: `\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _,
- * and $ only. Also allows numbered backreferences as `\k<n>`.
- */
-XRegExp.addToken(
-    /\\k<([\w$]+)>/,
-    function(match) {
-        // Groups with the same name is an error, else would need `lastIndexOf`
-        const index = isNaN(match[1]) ? (this.captureNames.indexOf(match[1]) + 1) : +match[1];
-        const endIndex = match.index + match[0].length;
-        if (!index || index > this.captureNames.length) {
-            throw new SyntaxError(`Backreference to undefined group ${match[0]}`);
-        }
-        // Keep backreferences separate from subsequent literal numbers. This avoids e.g.
-        // inadvertedly changing `(?<n>)\k<n>1` to `()\11`.
-        return `\\${index}${
-            endIndex === match.input.length || isNaN(match.input[endIndex]) ?
-                '' : '(?:)'
-        }`;
-    },
-    {leadChar: '\\'}
-);
-
-/*
- * Numbered backreference or octal, plus any following digits: `\0`, `\11`, etc. Octals except `\0`
- * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches
- * are returned unaltered. IE < 9 doesn't support backreferences above `\99` in regex syntax.
- */
-XRegExp.addToken(
-    /\\(\d+)/,
-    function(match, scope) {
-        if (
-            !(
-                scope === defaultScope &&
-                /^[1-9]/.test(match[1]) &&
-                +match[1] <= this.captureNames.length
-            ) &&
-            match[1] !== '0'
-        ) {
-            throw new SyntaxError(`Cannot use octal escape or backreference to undefined group ${match[0]}`);
-        }
-        return match[0];
-    },
-    {
-        scope: 'all',
-        leadChar: '\\'
-    }
-);
-
-/*
- * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the
- * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style
- * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively
- * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to
- * Python-style named capture as octals.
- */
-XRegExp.addToken(
-    /\(\?P?<([\w$]+)>/,
-    function(match) {
-        // Disallow bare integers as names because named backreferences are added to match arrays
-        // and therefore numeric properties may lead to incorrect lookups
-        if (!isNaN(match[1])) {
-            throw new SyntaxError(`Cannot use integer as capture name ${match[0]}`);
-        }
-        if (!XRegExp.isInstalled('namespacing') && (match[1] === 'length' || match[1] === '__proto__')) {
-            throw new SyntaxError(`Cannot use reserved word as capture name ${match[0]}`);
-        }
-        if (this.captureNames.includes(match[1])) {
-            throw new SyntaxError(`Cannot use same name for multiple groups ${match[0]}`);
-        }
-        this.captureNames.push(match[1]);
-        this.hasNamedCapture = true;
-        return '(';
-    },
-    {leadChar: '('}
-);
-
-/*
- * Capturing group; match the opening parenthesis only. Required for support of named capturing
- * groups. Also adds explicit capture mode (flag n).
- */
-XRegExp.addToken(
-    /\((?!\?)/,
-    function(match, scope, flags) {
-        if (flags.includes('n')) {
-            return '(?:';
-        }
-        this.captureNames.push(null);
-        return '(';
-    },
-    {
-        optionalFlags: 'n',
-        leadChar: '('
-    }
-);
-
-export default XRegExp;
diff --git a/node_modules/xregexp/tools/output/blocks.js b/node_modules/xregexp/tools/output/blocks.js
deleted file mode 100644
index 4adac0c..0000000
--- a/node_modules/xregexp/tools/output/blocks.js
+++ /dev/null
@@ -1,1170 +0,0 @@
-module.exports = [
-    {
-        'name': 'InAdlam',
-        'astral': '\uD83A[\uDD00-\uDD5F]'
-    },
-    {
-        'name': 'InAegean_Numbers',
-        'astral': '\uD800[\uDD00-\uDD3F]'
-    },
-    {
-        'name': 'InAhom',
-        'astral': '\uD805[\uDF00-\uDF3F]'
-    },
-    {
-        'name': 'InAlchemical_Symbols',
-        'astral': '\uD83D[\uDF00-\uDF7F]'
-    },
-    {
-        'name': 'InAlphabetic_Presentation_Forms',
-        'bmp': '\uFB00-\uFB4F'
-    },
-    {
-        'name': 'InAnatolian_Hieroglyphs',
-        'astral': '\uD811[\uDC00-\uDE7F]'
-    },
-    {
-        'name': 'InAncient_Greek_Musical_Notation',
-        'astral': '\uD834[\uDE00-\uDE4F]'
-    },
-    {
-        'name': 'InAncient_Greek_Numbers',
-        'astral': '\uD800[\uDD40-\uDD8F]'
-    },
-    {
-        'name': 'InAncient_Symbols',
-        'astral': '\uD800[\uDD90-\uDDCF]'
-    },
-    {
-        'name': 'InArabic',
-        'bmp': '\u0600-\u06FF'
-    },
-    {
-        'name': 'InArabic_Extended_A',
-        'bmp': '\u08A0-\u08FF'
-    },
-    {
-        'name': 'InArabic_Mathematical_Alphabetic_Symbols',
-        'astral': '\uD83B[\uDE00-\uDEFF]'
-    },
-    {
-        'name': 'InArabic_Presentation_Forms_A',
-        'bmp': '\uFB50-\uFDFF'
-    },
-    {
-        'name': 'InArabic_Presentation_Forms_B',
-        'bmp': '\uFE70-\uFEFF'
-    },
-    {
-        'name': 'InArabic_Supplement',
-        'bmp': '\u0750-\u077F'
-    },
-    {
-        'name': 'InArmenian',
-        'bmp': '\u0530-\u058F'
-    },
-    {
-        'name': 'InArrows',
-        'bmp': '\u2190-\u21FF'
-    },
-    {
-        'name': 'InAvestan',
-        'astral': '\uD802[\uDF00-\uDF3F]'
-    },
-    {
-        'name': 'InBalinese',
-        'bmp': '\u1B00-\u1B7F'
-    },
-    {
-        'name': 'InBamum',
-        'bmp': '\uA6A0-\uA6FF'
-    },
-    {
-        'name': 'InBamum_Supplement',
-        'astral': '\uD81A[\uDC00-\uDE3F]'
-    },
-    {
-        'name': 'InBasic_Latin',
-        'bmp': '\0-\x7F'
-    },
-    {
-        'name': 'InBassa_Vah',
-        'astral': '\uD81A[\uDED0-\uDEFF]'
-    },
-    {
-        'name': 'InBatak',
-        'bmp': '\u1BC0-\u1BFF'
-    },
-    {
-        'name': 'InBengali',
-        'bmp': '\u0980-\u09FF'
-    },
-    {
-        'name': 'InBhaiksuki',
-        'astral': '\uD807[\uDC00-\uDC6F]'
-    },
-    {
-        'name': 'InBlock_Elements',
-        'bmp': '\u2580-\u259F'
-    },
-    {
-        'name': 'InBopomofo',
-        'bmp': '\u3100-\u312F'
-    },
-    {
-        'name': 'InBopomofo_Extended',
-        'bmp': '\u31A0-\u31BF'
-    },
-    {
-        'name': 'InBox_Drawing',
-        'bmp': '\u2500-\u257F'
-    },
-    {
-        'name': 'InBrahmi',
-        'astral': '\uD804[\uDC00-\uDC7F]'
-    },
-    {
-        'name': 'InBraille_Patterns',
-        'bmp': '\u2800-\u28FF'
-    },
-    {
-        'name': 'InBuginese',
-        'bmp': '\u1A00-\u1A1F'
-    },
-    {
-        'name': 'InBuhid',
-        'bmp': '\u1740-\u175F'
-    },
-    {
-        'name': 'InByzantine_Musical_Symbols',
-        'astral': '\uD834[\uDC00-\uDCFF]'
-    },
-    {
-        'name': 'InCJK_Compatibility',
-        'bmp': '\u3300-\u33FF'
-    },
-    {
-        'name': 'InCJK_Compatibility_Forms',
-        'bmp': '\uFE30-\uFE4F'
-    },
-    {
-        'name': 'InCJK_Compatibility_Ideographs',
-        'bmp': '\uF900-\uFAFF'
-    },
-    {
-        'name': 'InCJK_Compatibility_Ideographs_Supplement',
-        'astral': '\uD87E[\uDC00-\uDE1F]'
-    },
-    {
-        'name': 'InCJK_Radicals_Supplement',
-        'bmp': '\u2E80-\u2EFF'
-    },
-    {
-        'name': 'InCJK_Strokes',
-        'bmp': '\u31C0-\u31EF'
-    },
-    {
-        'name': 'InCJK_Symbols_And_Punctuation',
-        'bmp': '\u3000-\u303F'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs',
-        'bmp': '\u4E00-\u9FFF'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs_Extension_A',
-        'bmp': '\u3400-\u4DBF'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs_Extension_B',
-        'astral': '[\uD840-\uD868][\uDC00-\uDFFF]|\uD869[\uDC00-\uDEDF]'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs_Extension_C',
-        'astral': '\uD869[\uDF00-\uDFFF]|[\uD86A-\uD86C][\uDC00-\uDFFF]|\uD86D[\uDC00-\uDF3F]'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs_Extension_D',
-        'astral': '\uD86D[\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1F]'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs_Extension_E',
-        'astral': '\uD86E[\uDC20-\uDFFF]|[\uD86F-\uD872][\uDC00-\uDFFF]|\uD873[\uDC00-\uDEAF]'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs_Extension_F',
-        'astral': '\uD873[\uDEB0-\uDFFF]|[\uD874-\uD879][\uDC00-\uDFFF]|\uD87A[\uDC00-\uDFEF]'
-    },
-    {
-        'name': 'InCarian',
-        'astral': '\uD800[\uDEA0-\uDEDF]'
-    },
-    {
-        'name': 'InCaucasian_Albanian',
-        'astral': '\uD801[\uDD30-\uDD6F]'
-    },
-    {
-        'name': 'InChakma',
-        'astral': '\uD804[\uDD00-\uDD4F]'
-    },
-    {
-        'name': 'InCham',
-        'bmp': '\uAA00-\uAA5F'
-    },
-    {
-        'name': 'InCherokee',
-        'bmp': '\u13A0-\u13FF'
-    },
-    {
-        'name': 'InCherokee_Supplement',
-        'bmp': '\uAB70-\uABBF'
-    },
-    {
-        'name': 'InChess_Symbols',
-        'astral': '\uD83E[\uDE00-\uDE6F]'
-    },
-    {
-        'name': 'InCombining_Diacritical_Marks',
-        'bmp': '\u0300-\u036F'
-    },
-    {
-        'name': 'InCombining_Diacritical_Marks_Extended',
-        'bmp': '\u1AB0-\u1AFF'
-    },
-    {
-        'name': 'InCombining_Diacritical_Marks_For_Symbols',
-        'bmp': '\u20D0-\u20FF'
-    },
-    {
-        'name': 'InCombining_Diacritical_Marks_Supplement',
-        'bmp': '\u1DC0-\u1DFF'
-    },
-    {
-        'name': 'InCombining_Half_Marks',
-        'bmp': '\uFE20-\uFE2F'
-    },
-    {
-        'name': 'InCommon_Indic_Number_Forms',
-        'bmp': '\uA830-\uA83F'
-    },
-    {
-        'name': 'InControl_Pictures',
-        'bmp': '\u2400-\u243F'
-    },
-    {
-        'name': 'InCoptic',
-        'bmp': '\u2C80-\u2CFF'
-    },
-    {
-        'name': 'InCoptic_Epact_Numbers',
-        'astral': '\uD800[\uDEE0-\uDEFF]'
-    },
-    {
-        'name': 'InCounting_Rod_Numerals',
-        'astral': '\uD834[\uDF60-\uDF7F]'
-    },
-    {
-        'name': 'InCuneiform',
-        'astral': '\uD808[\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'InCuneiform_Numbers_And_Punctuation',
-        'astral': '\uD809[\uDC00-\uDC7F]'
-    },
-    {
-        'name': 'InCurrency_Symbols',
-        'bmp': '\u20A0-\u20CF'
-    },
-    {
-        'name': 'InCypriot_Syllabary',
-        'astral': '\uD802[\uDC00-\uDC3F]'
-    },
-    {
-        'name': 'InCyrillic',
-        'bmp': '\u0400-\u04FF'
-    },
-    {
-        'name': 'InCyrillic_Extended_A',
-        'bmp': '\u2DE0-\u2DFF'
-    },
-    {
-        'name': 'InCyrillic_Extended_B',
-        'bmp': '\uA640-\uA69F'
-    },
-    {
-        'name': 'InCyrillic_Extended_C',
-        'bmp': '\u1C80-\u1C8F'
-    },
-    {
-        'name': 'InCyrillic_Supplement',
-        'bmp': '\u0500-\u052F'
-    },
-    {
-        'name': 'InDeseret',
-        'astral': '\uD801[\uDC00-\uDC4F]'
-    },
-    {
-        'name': 'InDevanagari',
-        'bmp': '\u0900-\u097F'
-    },
-    {
-        'name': 'InDevanagari_Extended',
-        'bmp': '\uA8E0-\uA8FF'
-    },
-    {
-        'name': 'InDingbats',
-        'bmp': '\u2700-\u27BF'
-    },
-    {
-        'name': 'InDogra',
-        'astral': '\uD806[\uDC00-\uDC4F]'
-    },
-    {
-        'name': 'InDomino_Tiles',
-        'astral': '\uD83C[\uDC30-\uDC9F]'
-    },
-    {
-        'name': 'InDuployan',
-        'astral': '\uD82F[\uDC00-\uDC9F]'
-    },
-    {
-        'name': 'InEarly_Dynastic_Cuneiform',
-        'astral': '\uD809[\uDC80-\uDD4F]'
-    },
-    {
-        'name': 'InEgyptian_Hieroglyphs',
-        'astral': '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F]'
-    },
-    {
-        'name': 'InElbasan',
-        'astral': '\uD801[\uDD00-\uDD2F]'
-    },
-    {
-        'name': 'InEmoticons',
-        'astral': '\uD83D[\uDE00-\uDE4F]'
-    },
-    {
-        'name': 'InEnclosed_Alphanumeric_Supplement',
-        'astral': '\uD83C[\uDD00-\uDDFF]'
-    },
-    {
-        'name': 'InEnclosed_Alphanumerics',
-        'bmp': '\u2460-\u24FF'
-    },
-    {
-        'name': 'InEnclosed_CJK_Letters_And_Months',
-        'bmp': '\u3200-\u32FF'
-    },
-    {
-        'name': 'InEnclosed_Ideographic_Supplement',
-        'astral': '\uD83C[\uDE00-\uDEFF]'
-    },
-    {
-        'name': 'InEthiopic',
-        'bmp': '\u1200-\u137F'
-    },
-    {
-        'name': 'InEthiopic_Extended',
-        'bmp': '\u2D80-\u2DDF'
-    },
-    {
-        'name': 'InEthiopic_Extended_A',
-        'bmp': '\uAB00-\uAB2F'
-    },
-    {
-        'name': 'InEthiopic_Supplement',
-        'bmp': '\u1380-\u139F'
-    },
-    {
-        'name': 'InGeneral_Punctuation',
-        'bmp': '\u2000-\u206F'
-    },
-    {
-        'name': 'InGeometric_Shapes',
-        'bmp': '\u25A0-\u25FF'
-    },
-    {
-        'name': 'InGeometric_Shapes_Extended',
-        'astral': '\uD83D[\uDF80-\uDFFF]'
-    },
-    {
-        'name': 'InGeorgian',
-        'bmp': '\u10A0-\u10FF'
-    },
-    {
-        'name': 'InGeorgian_Extended',
-        'bmp': '\u1C90-\u1CBF'
-    },
-    {
-        'name': 'InGeorgian_Supplement',
-        'bmp': '\u2D00-\u2D2F'
-    },
-    {
-        'name': 'InGlagolitic',
-        'bmp': '\u2C00-\u2C5F'
-    },
-    {
-        'name': 'InGlagolitic_Supplement',
-        'astral': '\uD838[\uDC00-\uDC2F]'
-    },
-    {
-        'name': 'InGothic',
-        'astral': '\uD800[\uDF30-\uDF4F]'
-    },
-    {
-        'name': 'InGrantha',
-        'astral': '\uD804[\uDF00-\uDF7F]'
-    },
-    {
-        'name': 'InGreek_And_Coptic',
-        'bmp': '\u0370-\u03FF'
-    },
-    {
-        'name': 'InGreek_Extended',
-        'bmp': '\u1F00-\u1FFF'
-    },
-    {
-        'name': 'InGujarati',
-        'bmp': '\u0A80-\u0AFF'
-    },
-    {
-        'name': 'InGunjala_Gondi',
-        'astral': '\uD807[\uDD60-\uDDAF]'
-    },
-    {
-        'name': 'InGurmukhi',
-        'bmp': '\u0A00-\u0A7F'
-    },
-    {
-        'name': 'InHalfwidth_And_Fullwidth_Forms',
-        'bmp': '\uFF00-\uFFEF'
-    },
-    {
-        'name': 'InHangul_Compatibility_Jamo',
-        'bmp': '\u3130-\u318F'
-    },
-    {
-        'name': 'InHangul_Jamo',
-        'bmp': '\u1100-\u11FF'
-    },
-    {
-        'name': 'InHangul_Jamo_Extended_A',
-        'bmp': '\uA960-\uA97F'
-    },
-    {
-        'name': 'InHangul_Jamo_Extended_B',
-        'bmp': '\uD7B0-\uD7FF'
-    },
-    {
-        'name': 'InHangul_Syllables',
-        'bmp': '\uAC00-\uD7AF'
-    },
-    {
-        'name': 'InHanifi_Rohingya',
-        'astral': '\uD803[\uDD00-\uDD3F]'
-    },
-    {
-        'name': 'InHanunoo',
-        'bmp': '\u1720-\u173F'
-    },
-    {
-        'name': 'InHatran',
-        'astral': '\uD802[\uDCE0-\uDCFF]'
-    },
-    {
-        'name': 'InHebrew',
-        'bmp': '\u0590-\u05FF'
-    },
-    {
-        'name': 'InHigh_Private_Use_Surrogates',
-        'bmp': '\uDB80-\uDBFF'
-    },
-    {
-        'name': 'InHigh_Surrogates',
-        'bmp': '\uD800-\uDB7F'
-    },
-    {
-        'name': 'InHiragana',
-        'bmp': '\u3040-\u309F'
-    },
-    {
-        'name': 'InIPA_Extensions',
-        'bmp': '\u0250-\u02AF'
-    },
-    {
-        'name': 'InIdeographic_Description_Characters',
-        'bmp': '\u2FF0-\u2FFF'
-    },
-    {
-        'name': 'InIdeographic_Symbols_And_Punctuation',
-        'astral': '\uD81B[\uDFE0-\uDFFF]'
-    },
-    {
-        'name': 'InImperial_Aramaic',
-        'astral': '\uD802[\uDC40-\uDC5F]'
-    },
-    {
-        'name': 'InIndic_Siyaq_Numbers',
-        'astral': '\uD83B[\uDC70-\uDCBF]'
-    },
-    {
-        'name': 'InInscriptional_Pahlavi',
-        'astral': '\uD802[\uDF60-\uDF7F]'
-    },
-    {
-        'name': 'InInscriptional_Parthian',
-        'astral': '\uD802[\uDF40-\uDF5F]'
-    },
-    {
-        'name': 'InJavanese',
-        'bmp': '\uA980-\uA9DF'
-    },
-    {
-        'name': 'InKaithi',
-        'astral': '\uD804[\uDC80-\uDCCF]'
-    },
-    {
-        'name': 'InKana_Extended_A',
-        'astral': '\uD82C[\uDD00-\uDD2F]'
-    },
-    {
-        'name': 'InKana_Supplement',
-        'astral': '\uD82C[\uDC00-\uDCFF]'
-    },
-    {
-        'name': 'InKanbun',
-        'bmp': '\u3190-\u319F'
-    },
-    {
-        'name': 'InKangxi_Radicals',
-        'bmp': '\u2F00-\u2FDF'
-    },
-    {
-        'name': 'InKannada',
-        'bmp': '\u0C80-\u0CFF'
-    },
-    {
-        'name': 'InKatakana',
-        'bmp': '\u30A0-\u30FF'
-    },
-    {
-        'name': 'InKatakana_Phonetic_Extensions',
-        'bmp': '\u31F0-\u31FF'
-    },
-    {
-        'name': 'InKayah_Li',
-        'bmp': '\uA900-\uA92F'
-    },
-    {
-        'name': 'InKharoshthi',
-        'astral': '\uD802[\uDE00-\uDE5F]'
-    },
-    {
-        'name': 'InKhmer',
-        'bmp': '\u1780-\u17FF'
-    },
-    {
-        'name': 'InKhmer_Symbols',
-        'bmp': '\u19E0-\u19FF'
-    },
-    {
-        'name': 'InKhojki',
-        'astral': '\uD804[\uDE00-\uDE4F]'
-    },
-    {
-        'name': 'InKhudawadi',
-        'astral': '\uD804[\uDEB0-\uDEFF]'
-    },
-    {
-        'name': 'InLao',
-        'bmp': '\u0E80-\u0EFF'
-    },
-    {
-        'name': 'InLatin_1_Supplement',
-        'bmp': '\x80-\xFF'
-    },
-    {
-        'name': 'InLatin_Extended_A',
-        'bmp': '\u0100-\u017F'
-    },
-    {
-        'name': 'InLatin_Extended_Additional',
-        'bmp': '\u1E00-\u1EFF'
-    },
-    {
-        'name': 'InLatin_Extended_B',
-        'bmp': '\u0180-\u024F'
-    },
-    {
-        'name': 'InLatin_Extended_C',
-        'bmp': '\u2C60-\u2C7F'
-    },
-    {
-        'name': 'InLatin_Extended_D',
-        'bmp': '\uA720-\uA7FF'
-    },
-    {
-        'name': 'InLatin_Extended_E',
-        'bmp': '\uAB30-\uAB6F'
-    },
-    {
-        'name': 'InLepcha',
-        'bmp': '\u1C00-\u1C4F'
-    },
-    {
-        'name': 'InLetterlike_Symbols',
-        'bmp': '\u2100-\u214F'
-    },
-    {
-        'name': 'InLimbu',
-        'bmp': '\u1900-\u194F'
-    },
-    {
-        'name': 'InLinear_A',
-        'astral': '\uD801[\uDE00-\uDF7F]'
-    },
-    {
-        'name': 'InLinear_B_Ideograms',
-        'astral': '\uD800[\uDC80-\uDCFF]'
-    },
-    {
-        'name': 'InLinear_B_Syllabary',
-        'astral': '\uD800[\uDC00-\uDC7F]'
-    },
-    {
-        'name': 'InLisu',
-        'bmp': '\uA4D0-\uA4FF'
-    },
-    {
-        'name': 'InLow_Surrogates',
-        'bmp': '\uDC00-\uDFFF'
-    },
-    {
-        'name': 'InLycian',
-        'astral': '\uD800[\uDE80-\uDE9F]'
-    },
-    {
-        'name': 'InLydian',
-        'astral': '\uD802[\uDD20-\uDD3F]'
-    },
-    {
-        'name': 'InMahajani',
-        'astral': '\uD804[\uDD50-\uDD7F]'
-    },
-    {
-        'name': 'InMahjong_Tiles',
-        'astral': '\uD83C[\uDC00-\uDC2F]'
-    },
-    {
-        'name': 'InMakasar',
-        'astral': '\uD807[\uDEE0-\uDEFF]'
-    },
-    {
-        'name': 'InMalayalam',
-        'bmp': '\u0D00-\u0D7F'
-    },
-    {
-        'name': 'InMandaic',
-        'bmp': '\u0840-\u085F'
-    },
-    {
-        'name': 'InManichaean',
-        'astral': '\uD802[\uDEC0-\uDEFF]'
-    },
-    {
-        'name': 'InMarchen',
-        'astral': '\uD807[\uDC70-\uDCBF]'
-    },
-    {
-        'name': 'InMasaram_Gondi',
-        'astral': '\uD807[\uDD00-\uDD5F]'
-    },
-    {
-        'name': 'InMathematical_Alphanumeric_Symbols',
-        'astral': '\uD835[\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'InMathematical_Operators',
-        'bmp': '\u2200-\u22FF'
-    },
-    {
-        'name': 'InMayan_Numerals',
-        'astral': '\uD834[\uDEE0-\uDEFF]'
-    },
-    {
-        'name': 'InMedefaidrin',
-        'astral': '\uD81B[\uDE40-\uDE9F]'
-    },
-    {
-        'name': 'InMeetei_Mayek',
-        'bmp': '\uABC0-\uABFF'
-    },
-    {
-        'name': 'InMeetei_Mayek_Extensions',
-        'bmp': '\uAAE0-\uAAFF'
-    },
-    {
-        'name': 'InMende_Kikakui',
-        'astral': '\uD83A[\uDC00-\uDCDF]'
-    },
-    {
-        'name': 'InMeroitic_Cursive',
-        'astral': '\uD802[\uDDA0-\uDDFF]'
-    },
-    {
-        'name': 'InMeroitic_Hieroglyphs',
-        'astral': '\uD802[\uDD80-\uDD9F]'
-    },
-    {
-        'name': 'InMiao',
-        'astral': '\uD81B[\uDF00-\uDF9F]'
-    },
-    {
-        'name': 'InMiscellaneous_Mathematical_Symbols_A',
-        'bmp': '\u27C0-\u27EF'
-    },
-    {
-        'name': 'InMiscellaneous_Mathematical_Symbols_B',
-        'bmp': '\u2980-\u29FF'
-    },
-    {
-        'name': 'InMiscellaneous_Symbols',
-        'bmp': '\u2600-\u26FF'
-    },
-    {
-        'name': 'InMiscellaneous_Symbols_And_Arrows',
-        'bmp': '\u2B00-\u2BFF'
-    },
-    {
-        'name': 'InMiscellaneous_Symbols_And_Pictographs',
-        'astral': '\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF]'
-    },
-    {
-        'name': 'InMiscellaneous_Technical',
-        'bmp': '\u2300-\u23FF'
-    },
-    {
-        'name': 'InModi',
-        'astral': '\uD805[\uDE00-\uDE5F]'
-    },
-    {
-        'name': 'InModifier_Tone_Letters',
-        'bmp': '\uA700-\uA71F'
-    },
-    {
-        'name': 'InMongolian',
-        'bmp': '\u1800-\u18AF'
-    },
-    {
-        'name': 'InMongolian_Supplement',
-        'astral': '\uD805[\uDE60-\uDE7F]'
-    },
-    {
-        'name': 'InMro',
-        'astral': '\uD81A[\uDE40-\uDE6F]'
-    },
-    {
-        'name': 'InMultani',
-        'astral': '\uD804[\uDE80-\uDEAF]'
-    },
-    {
-        'name': 'InMusical_Symbols',
-        'astral': '\uD834[\uDD00-\uDDFF]'
-    },
-    {
-        'name': 'InMyanmar',
-        'bmp': '\u1000-\u109F'
-    },
-    {
-        'name': 'InMyanmar_Extended_A',
-        'bmp': '\uAA60-\uAA7F'
-    },
-    {
-        'name': 'InMyanmar_Extended_B',
-        'bmp': '\uA9E0-\uA9FF'
-    },
-    {
-        'name': 'InNKo',
-        'bmp': '\u07C0-\u07FF'
-    },
-    {
-        'name': 'InNabataean',
-        'astral': '\uD802[\uDC80-\uDCAF]'
-    },
-    {
-        'name': 'InNew_Tai_Lue',
-        'bmp': '\u1980-\u19DF'
-    },
-    {
-        'name': 'InNewa',
-        'astral': '\uD805[\uDC00-\uDC7F]'
-    },
-    {
-        'name': 'InNumber_Forms',
-        'bmp': '\u2150-\u218F'
-    },
-    {
-        'name': 'InNushu',
-        'astral': '\uD82C[\uDD70-\uDEFF]'
-    },
-    {
-        'name': 'InOgham',
-        'bmp': '\u1680-\u169F'
-    },
-    {
-        'name': 'InOl_Chiki',
-        'bmp': '\u1C50-\u1C7F'
-    },
-    {
-        'name': 'InOld_Hungarian',
-        'astral': '\uD803[\uDC80-\uDCFF]'
-    },
-    {
-        'name': 'InOld_Italic',
-        'astral': '\uD800[\uDF00-\uDF2F]'
-    },
-    {
-        'name': 'InOld_North_Arabian',
-        'astral': '\uD802[\uDE80-\uDE9F]'
-    },
-    {
-        'name': 'InOld_Permic',
-        'astral': '\uD800[\uDF50-\uDF7F]'
-    },
-    {
-        'name': 'InOld_Persian',
-        'astral': '\uD800[\uDFA0-\uDFDF]'
-    },
-    {
-        'name': 'InOld_Sogdian',
-        'astral': '\uD803[\uDF00-\uDF2F]'
-    },
-    {
-        'name': 'InOld_South_Arabian',
-        'astral': '\uD802[\uDE60-\uDE7F]'
-    },
-    {
-        'name': 'InOld_Turkic',
-        'astral': '\uD803[\uDC00-\uDC4F]'
-    },
-    {
-        'name': 'InOptical_Character_Recognition',
-        'bmp': '\u2440-\u245F'
-    },
-    {
-        'name': 'InOriya',
-        'bmp': '\u0B00-\u0B7F'
-    },
-    {
-        'name': 'InOrnamental_Dingbats',
-        'astral': '\uD83D[\uDE50-\uDE7F]'
-    },
-    {
-        'name': 'InOsage',
-        'astral': '\uD801[\uDCB0-\uDCFF]'
-    },
-    {
-        'name': 'InOsmanya',
-        'astral': '\uD801[\uDC80-\uDCAF]'
-    },
-    {
-        'name': 'InPahawh_Hmong',
-        'astral': '\uD81A[\uDF00-\uDF8F]'
-    },
-    {
-        'name': 'InPalmyrene',
-        'astral': '\uD802[\uDC60-\uDC7F]'
-    },
-    {
-        'name': 'InPau_Cin_Hau',
-        'astral': '\uD806[\uDEC0-\uDEFF]'
-    },
-    {
-        'name': 'InPhags_Pa',
-        'bmp': '\uA840-\uA87F'
-    },
-    {
-        'name': 'InPhaistos_Disc',
-        'astral': '\uD800[\uDDD0-\uDDFF]'
-    },
-    {
-        'name': 'InPhoenician',
-        'astral': '\uD802[\uDD00-\uDD1F]'
-    },
-    {
-        'name': 'InPhonetic_Extensions',
-        'bmp': '\u1D00-\u1D7F'
-    },
-    {
-        'name': 'InPhonetic_Extensions_Supplement',
-        'bmp': '\u1D80-\u1DBF'
-    },
-    {
-        'name': 'InPlaying_Cards',
-        'astral': '\uD83C[\uDCA0-\uDCFF]'
-    },
-    {
-        'name': 'InPrivate_Use_Area',
-        'bmp': '\uE000-\uF8FF'
-    },
-    {
-        'name': 'InPsalter_Pahlavi',
-        'astral': '\uD802[\uDF80-\uDFAF]'
-    },
-    {
-        'name': 'InRejang',
-        'bmp': '\uA930-\uA95F'
-    },
-    {
-        'name': 'InRumi_Numeral_Symbols',
-        'astral': '\uD803[\uDE60-\uDE7F]'
-    },
-    {
-        'name': 'InRunic',
-        'bmp': '\u16A0-\u16FF'
-    },
-    {
-        'name': 'InSamaritan',
-        'bmp': '\u0800-\u083F'
-    },
-    {
-        'name': 'InSaurashtra',
-        'bmp': '\uA880-\uA8DF'
-    },
-    {
-        'name': 'InSharada',
-        'astral': '\uD804[\uDD80-\uDDDF]'
-    },
-    {
-        'name': 'InShavian',
-        'astral': '\uD801[\uDC50-\uDC7F]'
-    },
-    {
-        'name': 'InShorthand_Format_Controls',
-        'astral': '\uD82F[\uDCA0-\uDCAF]'
-    },
-    {
-        'name': 'InSiddham',
-        'astral': '\uD805[\uDD80-\uDDFF]'
-    },
-    {
-        'name': 'InSinhala',
-        'bmp': '\u0D80-\u0DFF'
-    },
-    {
-        'name': 'InSinhala_Archaic_Numbers',
-        'astral': '\uD804[\uDDE0-\uDDFF]'
-    },
-    {
-        'name': 'InSmall_Form_Variants',
-        'bmp': '\uFE50-\uFE6F'
-    },
-    {
-        'name': 'InSogdian',
-        'astral': '\uD803[\uDF30-\uDF6F]'
-    },
-    {
-        'name': 'InSora_Sompeng',
-        'astral': '\uD804[\uDCD0-\uDCFF]'
-    },
-    {
-        'name': 'InSoyombo',
-        'astral': '\uD806[\uDE50-\uDEAF]'
-    },
-    {
-        'name': 'InSpacing_Modifier_Letters',
-        'bmp': '\u02B0-\u02FF'
-    },
-    {
-        'name': 'InSpecials',
-        'bmp': '\uFFF0-\uFFFF'
-    },
-    {
-        'name': 'InSundanese',
-        'bmp': '\u1B80-\u1BBF'
-    },
-    {
-        'name': 'InSundanese_Supplement',
-        'bmp': '\u1CC0-\u1CCF'
-    },
-    {
-        'name': 'InSuperscripts_And_Subscripts',
-        'bmp': '\u2070-\u209F'
-    },
-    {
-        'name': 'InSupplemental_Arrows_A',
-        'bmp': '\u27F0-\u27FF'
-    },
-    {
-        'name': 'InSupplemental_Arrows_B',
-        'bmp': '\u2900-\u297F'
-    },
-    {
-        'name': 'InSupplemental_Arrows_C',
-        'astral': '\uD83E[\uDC00-\uDCFF]'
-    },
-    {
-        'name': 'InSupplemental_Mathematical_Operators',
-        'bmp': '\u2A00-\u2AFF'
-    },
-    {
-        'name': 'InSupplemental_Punctuation',
-        'bmp': '\u2E00-\u2E7F'
-    },
-    {
-        'name': 'InSupplemental_Symbols_And_Pictographs',
-        'astral': '\uD83E[\uDD00-\uDDFF]'
-    },
-    {
-        'name': 'InSupplementary_Private_Use_Area_A',
-        'astral': '[\uDB80-\uDBBF][\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'InSupplementary_Private_Use_Area_B',
-        'astral': '[\uDBC0-\uDBFF][\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'InSutton_SignWriting',
-        'astral': '\uD836[\uDC00-\uDEAF]'
-    },
-    {
-        'name': 'InSyloti_Nagri',
-        'bmp': '\uA800-\uA82F'
-    },
-    {
-        'name': 'InSyriac',
-        'bmp': '\u0700-\u074F'
-    },
-    {
-        'name': 'InSyriac_Supplement',
-        'bmp': '\u0860-\u086F'
-    },
-    {
-        'name': 'InTagalog',
-        'bmp': '\u1700-\u171F'
-    },
-    {
-        'name': 'InTagbanwa',
-        'bmp': '\u1760-\u177F'
-    },
-    {
-        'name': 'InTags',
-        'astral': '\uDB40[\uDC00-\uDC7F]'
-    },
-    {
-        'name': 'InTai_Le',
-        'bmp': '\u1950-\u197F'
-    },
-    {
-        'name': 'InTai_Tham',
-        'bmp': '\u1A20-\u1AAF'
-    },
-    {
-        'name': 'InTai_Viet',
-        'bmp': '\uAA80-\uAADF'
-    },
-    {
-        'name': 'InTai_Xuan_Jing_Symbols',
-        'astral': '\uD834[\uDF00-\uDF5F]'
-    },
-    {
-        'name': 'InTakri',
-        'astral': '\uD805[\uDE80-\uDECF]'
-    },
-    {
-        'name': 'InTamil',
-        'bmp': '\u0B80-\u0BFF'
-    },
-    {
-        'name': 'InTangut',
-        'astral': '[\uD81C-\uD821][\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'InTangut_Components',
-        'astral': '\uD822[\uDC00-\uDEFF]'
-    },
-    {
-        'name': 'InTelugu',
-        'bmp': '\u0C00-\u0C7F'
-    },
-    {
-        'name': 'InThaana',
-        'bmp': '\u0780-\u07BF'
-    },
-    {
-        'name': 'InThai',
-        'bmp': '\u0E00-\u0E7F'
-    },
-    {
-        'name': 'InTibetan',
-        'bmp': '\u0F00-\u0FFF'
-    },
-    {
-        'name': 'InTifinagh',
-        'bmp': '\u2D30-\u2D7F'
-    },
-    {
-        'name': 'InTirhuta',
-        'astral': '\uD805[\uDC80-\uDCDF]'
-    },
-    {
-        'name': 'InTransport_And_Map_Symbols',
-        'astral': '\uD83D[\uDE80-\uDEFF]'
-    },
-    {
-        'name': 'InUgaritic',
-        'astral': '\uD800[\uDF80-\uDF9F]'
-    },
-    {
-        'name': 'InUnified_Canadian_Aboriginal_Syllabics',
-        'bmp': '\u1400-\u167F'
-    },
-    {
-        'name': 'InUnified_Canadian_Aboriginal_Syllabics_Extended',
-        'bmp': '\u18B0-\u18FF'
-    },
-    {
-        'name': 'InVai',
-        'bmp': '\uA500-\uA63F'
-    },
-    {
-        'name': 'InVariation_Selectors',
-        'bmp': '\uFE00-\uFE0F'
-    },
-    {
-        'name': 'InVariation_Selectors_Supplement',
-        'astral': '\uDB40[\uDD00-\uDDEF]'
-    },
-    {
-        'name': 'InVedic_Extensions',
-        'bmp': '\u1CD0-\u1CFF'
-    },
-    {
-        'name': 'InVertical_Forms',
-        'bmp': '\uFE10-\uFE1F'
-    },
-    {
-        'name': 'InWarang_Citi',
-        'astral': '\uD806[\uDCA0-\uDCFF]'
-    },
-    {
-        'name': 'InYi_Radicals',
-        'bmp': '\uA490-\uA4CF'
-    },
-    {
-        'name': 'InYi_Syllables',
-        'bmp': '\uA000-\uA48F'
-    },
-    {
-        'name': 'InYijing_Hexagram_Symbols',
-        'bmp': '\u4DC0-\u4DFF'
-    },
-    {
-        'name': 'InZanabazar_Square',
-        'astral': '\uD806[\uDE00-\uDE4F]'
-    },
-    {
-        'name': 'Inundefined',
-        'astral': '\uD803[\uDFE0-\uDFFF]|\uD806[\uDDA0-\uDDFF]|\uD807[\uDFC0-\uDFFF]|\uD80D[\uDC30-\uDC3F]|\uD82C[\uDD30-\uDD6F]|\uD838[\uDD00-\uDD4F\uDEC0-\uDEFF]|\uD83B[\uDD00-\uDD4F]|\uD83E[\uDE70-\uDEFF]'
-    }
-];
diff --git a/node_modules/xregexp/tools/output/categories.js b/node_modules/xregexp/tools/output/categories.js
deleted file mode 100644
index ec4e0f8..0000000
--- a/node_modules/xregexp/tools/output/categories.js
+++ /dev/null
@@ -1,217 +0,0 @@
-module.exports = [
-    {
-        'name': 'C',
-        'alias': 'Other',
-        'isBmpLast': true,
-        'bmp': '\0-\x1F\x7F-\x9F\xAD\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EE\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB\u07FC\u082E\u082F\u083F\u085C\u085D\u085F\u086B-\u089F\u08B5\u08BE-\u08D2\u08E2\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A77-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C76\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D04\u0D0D\u0D11\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180E\u180F\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1C8F\u1CBB\u1CBC\u1CC8-\u1CCF\u1CFB-\u1CFF\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20C0-\u20CF\u20F1-\u20FF\u218C-\u218F\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E50-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u4DB6-\u4DBF\u9FF0-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7C0\uA7C1\uA7C7-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB68-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF',
-        'astral': '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE49-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD28-\uDD2F\uDD3A-\uDE5F\uDE7F-\uDEFF\uDF28-\uDF2F\uDF5A-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCBD\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD47-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC60-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB9-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC3C-\uDC9F\uDCF3-\uDCFE\uDD00-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE5-\uDDFF\uDE48-\uDE4F\uDEA3-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF9-\uDFBF\uDFF2-\uDFFE]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD87B-\uD87D\uD87F-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE9B-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE4-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDD1F-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA0-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD73-\uDD7A\uDDE9-\uDDFF\uDE46-\uDEDF\uDEF4-\uDEFF\uDF57-\uDF5F\uDF79-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD50-\uDEBF\uDEFA-\uDEFE\uDF00-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDC70\uDCB5-\uDD00\uDD3E-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD6D-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED6-\uDEDF\uDEED-\uDEEF\uDEFB-\uDEFF\uDF74-\uDF7F\uDFD9-\uDFDF\uDFEC-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDCFF\uDD0C\uDD72\uDD77-\uDD79\uDDA3\uDDA4\uDDAB-\uDDAD\uDDCB\uDDCC\uDE54-\uDE5F\uDE6E\uDE6F\uDE74-\uDE77\uDE7B-\uDE7F\uDE83-\uDE8F\uDE96-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]'
-    },
-    {
-        'name': 'Cc',
-        'alias': 'Control',
-        'bmp': '\0-\x1F\x7F-\x9F'
-    },
-    {
-        'name': 'Cf',
-        'alias': 'Format',
-        'bmp': '\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB',
-        'astral': '\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC38]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]'
-    },
-    {
-        'name': 'Cn',
-        'alias': 'Unassigned',
-        'bmp': '\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EE\u05F5-\u05FF\u061D\u070E\u074B\u074C\u07B2-\u07BF\u07FB\u07FC\u082E\u082F\u083F\u085C\u085D\u085F\u086B-\u089F\u08B5\u08BE-\u08D2\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A77-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C76\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D04\u0D0D\u0D11\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1C8F\u1CBB\u1CBC\u1CC8-\u1CCF\u1CFB-\u1CFF\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u2065\u2072\u2073\u208F\u209D-\u209F\u20C0-\u20CF\u20F1-\u20FF\u218C-\u218F\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E50-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u4DB6-\u4DBF\u9FF0-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7C0\uA7C1\uA7C7-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB68-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD\uFEFE\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFF8\uFFFE\uFFFF',
-        'astral': '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE49-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD28-\uDD2F\uDD3A-\uDE5F\uDE7F-\uDEFF\uDF28-\uDF2F\uDF5A-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCC2-\uDCCC\uDCCE\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD47-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC60-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB9-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC3C-\uDC9F\uDCF3-\uDCFE\uDD00-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE5-\uDDFF\uDE48-\uDE4F\uDEA3-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF9-\uDFBF\uDFF2-\uDFFE]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD87B-\uD87D\uD87F-\uDB3F\uDB41-\uDB7F][\uDC00-\uDFFF]|\uD80D[\uDC2F\uDC39-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE9B-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE4-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDD1F-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDDE9-\uDDFF\uDE46-\uDEDF\uDEF4-\uDEFF\uDF57-\uDF5F\uDF79-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD50-\uDEBF\uDEFA-\uDEFE\uDF00-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDC70\uDCB5-\uDD00\uDD3E-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD6D-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED6-\uDEDF\uDEED-\uDEEF\uDEFB-\uDEFF\uDF74-\uDF7F\uDFD9-\uDFDF\uDFEC-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDCFF\uDD0C\uDD72\uDD77-\uDD79\uDDA3\uDDA4\uDDAB-\uDDAD\uDDCB\uDDCC\uDE54-\uDE5F\uDE6E\uDE6F\uDE74-\uDE77\uDE7B-\uDE7F\uDE83-\uDE8F\uDE96-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00\uDC02-\uDC1F\uDC80-\uDCFF\uDDF0-\uDFFF]|[\uDBBF\uDBFF][\uDFFE\uDFFF]'
-    },
-    {
-        'name': 'Co',
-        'alias': 'Private_Use',
-        'bmp': '\uE000-\uF8FF',
-        'astral': '[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD]'
-    },
-    {
-        'name': 'Cs',
-        'alias': 'Surrogate',
-        'bmp': '\uD800-\uDFFF'
-    },
-    {
-        'name': 'L',
-        'alias': 'Letter',
-        'bmp': 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7C6\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB67\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC',
-        'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDEC0-\uDEEB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]'
-    },
-    {
-        'name': 'LC',
-        'alias': 'Cased_Letter',
-        'bmp': 'A-Za-z\xB5\xC0-\xD6\xD8-\xF6\xF8-\u01BA\u01BC-\u01BF\u01C4-\u0293\u0295-\u02AF\u0370-\u0373\u0376\u0377\u037B-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0560-\u0588\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FD-\u10FF\u13A0-\u13F5\u13F8-\u13FD\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2134\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2C7B\u2C7E-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA640-\uA66D\uA680-\uA69B\uA722-\uA76F\uA771-\uA787\uA78B-\uA78E\uA790-\uA7BF\uA7C2-\uA7C6\uA7FA\uAB30-\uAB5A\uAB60-\uAB67\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF21-\uFF3A\uFF41-\uFF5A',
-        'astral': '\uD801[\uDC00-\uDC4F\uDCB0-\uDCD3\uDCD8-\uDCFB]|\uD803[\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD806[\uDCA0-\uDCDF]|\uD81B[\uDE40-\uDE7F]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDD00-\uDD43]'
-    },
-    {
-        'name': 'Ll',
-        'alias': 'Lowercase_Letter',
-        'bmp': 'a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7BB\uA7BD\uA7BF\uA7C3\uA7FA\uAB30-\uAB5A\uAB60-\uAB67\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A',
-        'astral': '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD81B[\uDE60-\uDE7F]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD83A[\uDD22-\uDD43]'
-    },
-    {
-        'name': 'Lm',
-        'alias': 'Modifier_Letter',
-        'bmp': '\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5\u06E6\u07F4\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C\uA69D\uA717-\uA71F\uA770\uA788\uA7F8\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E\uFF9F',
-        'astral': '\uD81A[\uDF40-\uDF43]|\uD81B[\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD838[\uDD37-\uDD3D]|\uD83A\uDD4B'
-    },
-    {
-        'name': 'Lo',
-        'alias': 'Other_Letter',
-        'bmp': '\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05EF-\u05F2\u0620-\u063F\u0641-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC',
-        'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC50-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDD00-\uDD23\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A]|\uD806[\uDC00-\uDC2B\uDCFF\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF4A\uDF50]|\uD821[\uDC00-\uDFF7]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD838[\uDD00-\uDD2C\uDD4E\uDEC0-\uDEEB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]'
-    },
-    {
-        'name': 'Lt',
-        'alias': 'Titlecase_Letter',
-        'bmp': '\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC'
-    },
-    {
-        'name': 'Lu',
-        'alias': 'Uppercase_Letter',
-        'bmp': 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uA7BA\uA7BC\uA7BE\uA7C2\uA7C4-\uA7C6\uFF21-\uFF3A',
-        'astral': '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD81B[\uDE40-\uDE5F]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]'
-    },
-    {
-        'name': 'M',
-        'alias': 'Mark',
-        'bmp': '\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F',
-        'astral': '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD803[\uDD24-\uDD27\uDF46-\uDF50]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD45\uDD46\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDDC9-\uDDCC\uDE2C-\uDE37\uDE3E\uDEDF-\uDEEA\uDF00-\uDF03\uDF3B\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC35-\uDC46\uDC5E\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDDDC\uDDDD\uDE30-\uDE40\uDEAB-\uDEB7\uDF1D-\uDF2B]|\uD806[\uDC2C-\uDC3A\uDDD1-\uDDD7\uDDDA-\uDDE0\uDDE4\uDE01-\uDE0A\uDE33-\uDE39\uDE3B-\uDE3E\uDE47\uDE51-\uDE5B\uDE8A-\uDE99]|\uD807[\uDC2F-\uDC36\uDC38-\uDC3F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD31-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD45\uDD47\uDD8A-\uDD8E\uDD90\uDD91\uDD93-\uDD97\uDEF3-\uDEF6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF4F\uDF51-\uDF87\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD30-\uDD36\uDEEC-\uDEEF]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]'
-    },
-    {
-        'name': 'Mc',
-        'alias': 'Spacing_Mark',
-        'bmp': '\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E\u094F\u0982\u0983\u09BE-\u09C0\u09C7\u09C8\u09CB\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB\u0ACC\u0B02\u0B03\u0B3E\u0B40\u0B47\u0B48\u0B4B\u0B4C\u0B57\u0BBE\u0BBF\u0BC1\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7\u0CC8\u0CCA\u0CCB\u0CD5\u0CD6\u0D02\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2\u0DF3\u0F3E\u0F3F\u0F7F\u102B\u102C\u1031\u1038\u103B\u103C\u1056\u1057\u1062-\u1064\u1067-\u106D\u1083\u1084\u1087-\u108C\u108F\u109A-\u109C\u17B6\u17BE-\u17C5\u17C7\u17C8\u1923-\u1926\u1929-\u192B\u1930\u1931\u1933-\u1938\u1A19\u1A1A\u1A55\u1A57\u1A61\u1A63\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43\u1B44\u1B82\u1BA1\u1BA6\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2\u1BF3\u1C24-\u1C2B\u1C34\u1C35\u1CE1\u1CF7\u302E\u302F\uA823\uA824\uA827\uA880\uA881\uA8B4-\uA8C3\uA952\uA953\uA983\uA9B4\uA9B5\uA9BA\uA9BB\uA9BE-\uA9C0\uAA2F\uAA30\uAA33\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE\uAAEF\uAAF5\uABE3\uABE4\uABE6\uABE7\uABE9\uABEA\uABEC',
-        'astral': '\uD804[\uDC00\uDC02\uDC82\uDCB0-\uDCB2\uDCB7\uDCB8\uDD2C\uDD45\uDD46\uDD82\uDDB3-\uDDB5\uDDBF\uDDC0\uDE2C-\uDE2E\uDE32\uDE33\uDE35\uDEE0-\uDEE2\uDF02\uDF03\uDF3E\uDF3F\uDF41-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63]|\uD805[\uDC35-\uDC37\uDC40\uDC41\uDC45\uDCB0-\uDCB2\uDCB9\uDCBB-\uDCBE\uDCC1\uDDAF-\uDDB1\uDDB8-\uDDBB\uDDBE\uDE30-\uDE32\uDE3B\uDE3C\uDE3E\uDEAC\uDEAE\uDEAF\uDEB6\uDF20\uDF21\uDF26]|\uD806[\uDC2C-\uDC2E\uDC38\uDDD1-\uDDD3\uDDDC-\uDDDF\uDDE4\uDE39\uDE57\uDE58\uDE97]|\uD807[\uDC2F\uDC3E\uDCA9\uDCB1\uDCB4\uDD8A-\uDD8E\uDD93\uDD94\uDD96\uDEF5\uDEF6]|\uD81B[\uDF51-\uDF87]|\uD834[\uDD65\uDD66\uDD6D-\uDD72]'
-    },
-    {
-        'name': 'Me',
-        'alias': 'Enclosing_Mark',
-        'bmp': '\u0488\u0489\u1ABE\u20DD-\u20E0\u20E2-\u20E4\uA670-\uA672'
-    },
-    {
-        'name': 'Mn',
-        'alias': 'Nonspacing_Mark',
-        'bmp': '\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2\u09E3\u09FE\u0A01\u0A02\u0A3C\u0A41\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7\u0AC8\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C04\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D00\u0D01\u0D3B\u0D3C\u0D41-\u0D44\u0D4D\u0D62\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039\u103A\u103D\u103E\u1058\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193B\u1A17\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80\u1B81\u1BA2-\u1BA5\u1BA8\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099\u309A\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA825\uA826\uA8C4\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9BD\uA9E5\uAA29-\uAA2E\uAA31\uAA32\uAA35\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEC\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F',
-        'astral': '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD803[\uDD24-\uDD27\uDF46-\uDF50]|\uD804[\uDC01\uDC38-\uDC46\uDC7F-\uDC81\uDCB3-\uDCB6\uDCB9\uDCBA\uDD00-\uDD02\uDD27-\uDD2B\uDD2D-\uDD34\uDD73\uDD80\uDD81\uDDB6-\uDDBE\uDDC9-\uDDCC\uDE2F-\uDE31\uDE34\uDE36\uDE37\uDE3E\uDEDF\uDEE3-\uDEEA\uDF00\uDF01\uDF3B\uDF3C\uDF40\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC38-\uDC3F\uDC42-\uDC44\uDC46\uDC5E\uDCB3-\uDCB8\uDCBA\uDCBF\uDCC0\uDCC2\uDCC3\uDDB2-\uDDB5\uDDBC\uDDBD\uDDBF\uDDC0\uDDDC\uDDDD\uDE33-\uDE3A\uDE3D\uDE3F\uDE40\uDEAB\uDEAD\uDEB0-\uDEB5\uDEB7\uDF1D-\uDF1F\uDF22-\uDF25\uDF27-\uDF2B]|\uD806[\uDC2F-\uDC37\uDC39\uDC3A\uDDD4-\uDDD7\uDDDA\uDDDB\uDDE0\uDE01-\uDE0A\uDE33-\uDE38\uDE3B-\uDE3E\uDE47\uDE51-\uDE56\uDE59-\uDE5B\uDE8A-\uDE96\uDE98\uDE99]|\uD807[\uDC30-\uDC36\uDC38-\uDC3D\uDC3F\uDC92-\uDCA7\uDCAA-\uDCB0\uDCB2\uDCB3\uDCB5\uDCB6\uDD31-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD45\uDD47\uDD90\uDD91\uDD95\uDD97\uDEF3\uDEF4]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF4F\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD30-\uDD36\uDEEC-\uDEEF]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]'
-    },
-    {
-        'name': 'N',
-        'alias': 'Number',
-        'bmp': '0-9\xB2\xB3\xB9\xBC-\xBE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D58-\u0D5E\u0D66-\u0D78\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19',
-        'astral': '\uD800[\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23\uDF41\uDF4A\uDFD1-\uDFD5]|\uD801[\uDCA0-\uDCA9]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE48\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDD30-\uDD39\uDE60-\uDE7E\uDF1D-\uDF26\uDF51-\uDF54]|\uD804[\uDC52-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDDE1-\uDDF4\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF3B]|\uD806[\uDCE0-\uDCF2]|\uD807[\uDC50-\uDC6C\uDD50-\uDD59\uDDA0-\uDDA9\uDFC0-\uDFD4]|\uD809[\uDC00-\uDC6E]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59\uDF5B-\uDF61]|\uD81B[\uDE80-\uDE96]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDFCE-\uDFFF]|\uD838[\uDD40-\uDD49\uDEF0-\uDEF9]|\uD83A[\uDCC7-\uDCCF\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D]|\uD83C[\uDD00-\uDD0C]'
-    },
-    {
-        'name': 'Nd',
-        'alias': 'Decimal_Number',
-        'bmp': '0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19',
-        'astral': '\uD801[\uDCA0-\uDCA9]|\uD803[\uDD30-\uDD39]|\uD804[\uDC66-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF39]|\uD806[\uDCE0-\uDCE9]|\uD807[\uDC50-\uDC59\uDD50-\uDD59\uDDA0-\uDDA9]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59]|\uD835[\uDFCE-\uDFFF]|\uD838[\uDD40-\uDD49\uDEF0-\uDEF9]|\uD83A[\uDD50-\uDD59]'
-    },
-    {
-        'name': 'Nl',
-        'alias': 'Letter_Number',
-        'bmp': '\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF',
-        'astral': '\uD800[\uDD40-\uDD74\uDF41\uDF4A\uDFD1-\uDFD5]|\uD809[\uDC00-\uDC6E]'
-    },
-    {
-        'name': 'No',
-        'alias': 'Other_Number',
-        'bmp': '\xB2\xB3\xB9\xBC-\xBE\u09F4-\u09F9\u0B72-\u0B77\u0BF0-\u0BF2\u0C78-\u0C7E\u0D58-\u0D5E\u0D70-\u0D78\u0F2A-\u0F33\u1369-\u137C\u17F0-\u17F9\u19DA\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215F\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA830-\uA835',
-        'astral': '\uD800[\uDD07-\uDD33\uDD75-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE48\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E\uDF1D-\uDF26\uDF51-\uDF54]|\uD804[\uDC52-\uDC65\uDDE1-\uDDF4]|\uD805[\uDF3A\uDF3B]|\uD806[\uDCEA-\uDCF2]|\uD807[\uDC5A-\uDC6C\uDFC0-\uDFD4]|\uD81A[\uDF5B-\uDF61]|\uD81B[\uDE80-\uDE96]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD83A[\uDCC7-\uDCCF]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D]|\uD83C[\uDD00-\uDD0C]'
-    },
-    {
-        'name': 'P',
-        'alias': 'Punctuation',
-        'bmp': '!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65',
-        'astral': '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDFFF]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]'
-    },
-    {
-        'name': 'Pc',
-        'alias': 'Connector_Punctuation',
-        'bmp': '_\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F'
-    },
-    {
-        'name': 'Pd',
-        'alias': 'Dash_Punctuation',
-        'bmp': '\\-\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D'
-    },
-    {
-        'name': 'Pe',
-        'alias': 'Close_Punctuation',
-        'bmp': '\\)\\]\\}\u0F3B\u0F3D\u169C\u2046\u207E\u208E\u2309\u230B\u232A\u2769\u276B\u276D\u276F\u2771\u2773\u2775\u27C6\u27E7\u27E9\u27EB\u27ED\u27EF\u2984\u2986\u2988\u298A\u298C\u298E\u2990\u2992\u2994\u2996\u2998\u29D9\u29DB\u29FD\u2E23\u2E25\u2E27\u2E29\u3009\u300B\u300D\u300F\u3011\u3015\u3017\u3019\u301B\u301E\u301F\uFD3E\uFE18\uFE36\uFE38\uFE3A\uFE3C\uFE3E\uFE40\uFE42\uFE44\uFE48\uFE5A\uFE5C\uFE5E\uFF09\uFF3D\uFF5D\uFF60\uFF63'
-    },
-    {
-        'name': 'Pf',
-        'alias': 'Final_Punctuation',
-        'bmp': '\xBB\u2019\u201D\u203A\u2E03\u2E05\u2E0A\u2E0D\u2E1D\u2E21'
-    },
-    {
-        'name': 'Pi',
-        'alias': 'Initial_Punctuation',
-        'bmp': '\xAB\u2018\u201B\u201C\u201F\u2039\u2E02\u2E04\u2E09\u2E0C\u2E1C\u2E20'
-    },
-    {
-        'name': 'Po',
-        'alias': 'Other_Punctuation',
-        'bmp': '!-#%-\'\\*,\\.\\/:;\\?@\\\xA1\xA7\xB6\xB7\xBF\u037E\u0387\u055A-\u055F\u0589\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u166E\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u1805\u1807-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203B-\u203E\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205E\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00\u2E01\u2E06-\u2E08\u2E0B\u2E0E-\u2E16\u2E18\u2E19\u2E1B\u2E1E\u2E1F\u2E2A-\u2E2E\u2E30-\u2E39\u2E3C-\u2E3F\u2E41\u2E43-\u2E4F\u3001-\u3003\u303D\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFE10-\uFE16\uFE19\uFE30\uFE45\uFE46\uFE49-\uFE4C\uFE50-\uFE52\uFE54-\uFE57\uFE5F-\uFE61\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF07\uFF0A\uFF0C\uFF0E\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3C\uFF61\uFF64\uFF65',
-        'astral': '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDFFF]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]'
-    },
-    {
-        'name': 'Ps',
-        'alias': 'Open_Punctuation',
-        'bmp': '\\(\\[\\{\u0F3A\u0F3C\u169B\u201A\u201E\u2045\u207D\u208D\u2308\u230A\u2329\u2768\u276A\u276C\u276E\u2770\u2772\u2774\u27C5\u27E6\u27E8\u27EA\u27EC\u27EE\u2983\u2985\u2987\u2989\u298B\u298D\u298F\u2991\u2993\u2995\u2997\u29D8\u29DA\u29FC\u2E22\u2E24\u2E26\u2E28\u2E42\u3008\u300A\u300C\u300E\u3010\u3014\u3016\u3018\u301A\u301D\uFD3F\uFE17\uFE35\uFE37\uFE39\uFE3B\uFE3D\uFE3F\uFE41\uFE43\uFE47\uFE59\uFE5B\uFE5D\uFF08\uFF3B\uFF5B\uFF5F\uFF62'
-    },
-    {
-        'name': 'S',
-        'alias': 'Symbol',
-        'bmp': '\\$\\+<->\\^`\\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20BF\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B98-\u2BFF\u2CE5-\u2CEA\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uFB29\uFBB2-\uFBC1\uFDFC\uFDFD\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD',
-        'astral': '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD6C\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED5\uDEE0-\uDEEC\uDEF0-\uDEFA\uDF00-\uDF73\uDF80-\uDFD8\uDFE0-\uDFEB]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD00-\uDD0B\uDD0D-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDE53\uDE60-\uDE6D\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95]'
-    },
-    {
-        'name': 'Sc',
-        'alias': 'Currency_Symbol',
-        'bmp': '\\$\xA2-\xA5\u058F\u060B\u07FE\u07FF\u09F2\u09F3\u09FB\u0AF1\u0BF9\u0E3F\u17DB\u20A0-\u20BF\uA838\uFDFC\uFE69\uFF04\uFFE0\uFFE1\uFFE5\uFFE6',
-        'astral': '\uD807[\uDFDD-\uDFE0]|\uD838\uDEFF|\uD83B\uDCB0'
-    },
-    {
-        'name': 'Sk',
-        'alias': 'Modifier_Symbol',
-        'bmp': '\\^`\xA8\xAF\xB4\xB8\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u309B\u309C\uA700-\uA716\uA720\uA721\uA789\uA78A\uAB5B\uFBB2-\uFBC1\uFF3E\uFF40\uFFE3',
-        'astral': '\uD83C[\uDFFB-\uDFFF]'
-    },
-    {
-        'name': 'Sm',
-        'alias': 'Math_Symbol',
-        'bmp': '\\+<->\\|~\xAC\xB1\xD7\xF7\u03F6\u0606-\u0608\u2044\u2052\u207A-\u207C\u208A-\u208C\u2118\u2140-\u2144\u214B\u2190-\u2194\u219A\u219B\u21A0\u21A3\u21A6\u21AE\u21CE\u21CF\u21D2\u21D4\u21F4-\u22FF\u2320\u2321\u237C\u239B-\u23B3\u23DC-\u23E1\u25B7\u25C1\u25F8-\u25FF\u266F\u27C0-\u27C4\u27C7-\u27E5\u27F0-\u27FF\u2900-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2AFF\u2B30-\u2B44\u2B47-\u2B4C\uFB29\uFE62\uFE64-\uFE66\uFF0B\uFF1C-\uFF1E\uFF5C\uFF5E\uFFE2\uFFE9-\uFFEC',
-        'astral': '\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD83B[\uDEF0\uDEF1]'
-    },
-    {
-        'name': 'So',
-        'alias': 'Other_Symbol',
-        'bmp': '\xA6\xA9\xAE\xB0\u0482\u058D\u058E\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09FA\u0B70\u0BF3-\u0BF8\u0BFA\u0C7F\u0D4F\u0D79\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u214A\u214C\u214D\u214F\u218A\u218B\u2195-\u2199\u219C-\u219F\u21A1\u21A2\u21A4\u21A5\u21A7-\u21AD\u21AF-\u21CD\u21D0\u21D1\u21D3\u21D5-\u21F3\u2300-\u2307\u230C-\u231F\u2322-\u2328\u232B-\u237B\u237D-\u239A\u23B4-\u23DB\u23E2-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u25B6\u25B8-\u25C0\u25C2-\u25F7\u2600-\u266E\u2670-\u2767\u2794-\u27BF\u2800-\u28FF\u2B00-\u2B2F\u2B45\u2B46\u2B4D-\u2B73\u2B76-\u2B95\u2B98-\u2BFF\u2CE5-\u2CEA\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA828-\uA82B\uA836\uA837\uA839\uAA77-\uAA79\uFDFD\uFFE4\uFFE8\uFFED\uFFEE\uFFFC\uFFFD',
-        'astral': '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFDC\uDFE1-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838\uDD4F|\uD83B[\uDCAC\uDD2E]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD6C\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFA]|\uD83D[\uDC00-\uDED5\uDEE0-\uDEEC\uDEF0-\uDEFA\uDF00-\uDF73\uDF80-\uDFD8\uDFE0-\uDFEB]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD00-\uDD0B\uDD0D-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDE53\uDE60-\uDE6D\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95]'
-    },
-    {
-        'name': 'Z',
-        'alias': 'Separator',
-        'bmp': ' \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000'
-    },
-    {
-        'name': 'Zl',
-        'alias': 'Line_Separator',
-        'bmp': '\u2028'
-    },
-    {
-        'name': 'Zp',
-        'alias': 'Paragraph_Separator',
-        'bmp': '\u2029'
-    },
-    {
-        'name': 'Zs',
-        'alias': 'Space_Separator',
-        'bmp': ' \xA0\u1680\u2000-\u200A\u202F\u205F\u3000'
-    }
-];
diff --git a/node_modules/xregexp/tools/output/properties.js b/node_modules/xregexp/tools/output/properties.js
deleted file mode 100644
index fb73a0d..0000000
--- a/node_modules/xregexp/tools/output/properties.js
+++ /dev/null
@@ -1,41 +0,0 @@
-module.exports = [
-    {
-        'name': 'ASCII',
-        'bmp': '\0-\x7F'
-    },
-    {
-        'name': 'Alphabetic',
-        'bmp': 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0345\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05B0-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0657\u0659-\u065F\u066E-\u06D3\u06D5-\u06DC\u06E1-\u06E8\u06ED-\u06EF\u06FA-\u06FC\u06FF\u0710-\u073F\u074D-\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0817\u081A-\u082C\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08DF\u08E3-\u08E9\u08F0-\u093B\u093D-\u094C\u094E-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD-\u09C4\u09C7\u09C8\u09CB\u09CC\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09F0\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3E-\u0A42\u0A47\u0A48\u0A4B\u0A4C\u0A51\u0A59-\u0A5C\u0A5E\u0A70-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD-\u0AC5\u0AC7-\u0AC9\u0ACB\u0ACC\u0AD0\u0AE0-\u0AE3\u0AF9-\u0AFC\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D-\u0B44\u0B47\u0B48\u0B4B\u0B4C\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD0\u0BD7\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4C\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCC\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4C\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E46\u0E4D\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0ECD\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F71-\u0F81\u0F88-\u0F97\u0F99-\u0FBC\u1000-\u1036\u1038\u103B-\u103F\u1050-\u108F\u109A-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17B3\u17B6-\u17C8\u17D7\u17DC\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u1938\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A1B\u1A20-\u1A5E\u1A61-\u1A74\u1AA7\u1B00-\u1B33\u1B35-\u1B43\u1B45-\u1B4B\u1B80-\u1BA9\u1BAC-\u1BAF\u1BBA-\u1BE5\u1BE7-\u1BF1\u1C00-\u1C36\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1DE7-\u1DF4\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u24B6-\u24E9\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA674-\uA67B\uA67F-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7C6\uA7F7-\uA805\uA807-\uA827\uA840-\uA873\uA880-\uA8C3\uA8C5\uA8F2-\uA8F7\uA8FB\uA8FD-\uA8FF\uA90A-\uA92A\uA930-\uA952\uA960-\uA97C\uA980-\uA9B2\uA9B4-\uA9BF\uA9CF\uA9E0-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA60-\uAA76\uAA7A-\uAABE\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF5\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB67\uAB70-\uABEA\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC',
-        'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC45\uDC82-\uDCB8\uDCD0-\uDCE8\uDD00-\uDD32\uDD44-\uDD46\uDD50-\uDD72\uDD76\uDD80-\uDDBF\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE34\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEE8\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D-\uDF44\uDF47\uDF48\uDF4B\uDF4C\uDF50\uDF57\uDF5D-\uDF63]|\uD805[\uDC00-\uDC41\uDC43-\uDC45\uDC47-\uDC4A\uDC5F\uDC80-\uDCC1\uDCC4\uDCC5\uDCC7\uDD80-\uDDB5\uDDB8-\uDDBE\uDDD8-\uDDDD\uDE00-\uDE3E\uDE40\uDE44\uDE80-\uDEB5\uDEB8\uDF00-\uDF1A\uDF1D-\uDF2A]|\uD806[\uDC00-\uDC38\uDCA0-\uDCDF\uDCFF\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDDF\uDDE1\uDDE3\uDDE4\uDE00-\uDE32\uDE35-\uDE3E\uDE50-\uDE97\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC3E\uDC40\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD41\uDD43\uDD46\uDD47\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD96\uDD98\uDEE0-\uDEF6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9E]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDEC0-\uDEEB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD47\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]'
-    },
-    {
-        'name': 'Any',
-        'isBmpLast': true,
-        'bmp': '\0-\uFFFF',
-        'astral': '[\uD800-\uDBFF][\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'Default_Ignorable_Code_Point',
-        'bmp': '\xAD\u034F\u061C\u115F\u1160\u17B4\u17B5\u180B-\u180E\u200B-\u200F\u202A-\u202E\u2060-\u206F\u3164\uFE00-\uFE0F\uFEFF\uFFA0\uFFF0-\uFFF8',
-        'astral': '\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|[\uDB40-\uDB43][\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'Lowercase',
-        'bmp': 'a-z\xAA\xB5\xBA\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02B8\u02C0\u02C1\u02E0-\u02E4\u0345\u0371\u0373\u0377\u037A-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1DBF\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u2071\u207F\u2090-\u209C\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2170-\u217F\u2184\u24D0-\u24E9\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7D\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B-\uA69D\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7BB\uA7BD\uA7BF\uA7C3\uA7F8-\uA7FA\uAB30-\uAB5A\uAB5C-\uAB67\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A',
-        'astral': '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD81B[\uDE60-\uDE7F]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD83A[\uDD22-\uDD43]'
-    },
-    {
-        'name': 'Noncharacter_Code_Point',
-        'bmp': '\uFDD0-\uFDEF\uFFFE\uFFFF',
-        'astral': '[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]'
-    },
-    {
-        'name': 'Uppercase',
-        'bmp': 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2160-\u216F\u2183\u24B6-\u24CF\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uA7BA\uA7BC\uA7BE\uA7C2\uA7C4-\uA7C6\uFF21-\uFF3A',
-        'astral': '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD81B[\uDE40-\uDE5F]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]'
-    },
-    {
-        'name': 'White_Space',
-        'bmp': '\t-\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000'
-    }
-];
diff --git a/node_modules/xregexp/tools/output/scripts.js b/node_modules/xregexp/tools/output/scripts.js
deleted file mode 100644
index 77dabde..0000000
--- a/node_modules/xregexp/tools/output/scripts.js
+++ /dev/null
@@ -1,622 +0,0 @@
-module.exports = [
-    {
-        'name': 'Adlam',
-        'astral': '\uD83A[\uDD00-\uDD4B\uDD50-\uDD59\uDD5E\uDD5F]'
-    },
-    {
-        'name': 'Ahom',
-        'astral': '\uD805[\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF3F]'
-    },
-    {
-        'name': 'Anatolian_Hieroglyphs',
-        'astral': '\uD811[\uDC00-\uDE46]'
-    },
-    {
-        'name': 'Arabic',
-        'bmp': '\u0600-\u0604\u0606-\u060B\u060D-\u061A\u061C\u061E\u0620-\u063F\u0641-\u064A\u0656-\u066F\u0671-\u06DC\u06DE-\u06FF\u0750-\u077F\u08A0-\u08B4\u08B6-\u08BD\u08D3-\u08E1\u08E3-\u08FF\uFB50-\uFBC1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFD\uFE70-\uFE74\uFE76-\uFEFC',
-        'astral': '\uD803[\uDE60-\uDE7E]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB\uDEF0\uDEF1]'
-    },
-    {
-        'name': 'Armenian',
-        'bmp': '\u0531-\u0556\u0559-\u0588\u058A\u058D-\u058F\uFB13-\uFB17'
-    },
-    {
-        'name': 'Avestan',
-        'astral': '\uD802[\uDF00-\uDF35\uDF39-\uDF3F]'
-    },
-    {
-        'name': 'Balinese',
-        'bmp': '\u1B00-\u1B4B\u1B50-\u1B7C'
-    },
-    {
-        'name': 'Bamum',
-        'bmp': '\uA6A0-\uA6F7',
-        'astral': '\uD81A[\uDC00-\uDE38]'
-    },
-    {
-        'name': 'Bassa_Vah',
-        'astral': '\uD81A[\uDED0-\uDEED\uDEF0-\uDEF5]'
-    },
-    {
-        'name': 'Batak',
-        'bmp': '\u1BC0-\u1BF3\u1BFC-\u1BFF'
-    },
-    {
-        'name': 'Bengali',
-        'bmp': '\u0980-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09FE'
-    },
-    {
-        'name': 'Bhaiksuki',
-        'astral': '\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC45\uDC50-\uDC6C]'
-    },
-    {
-        'name': 'Bopomofo',
-        'bmp': '\u02EA\u02EB\u3105-\u312F\u31A0-\u31BA'
-    },
-    {
-        'name': 'Brahmi',
-        'astral': '\uD804[\uDC00-\uDC4D\uDC52-\uDC6F\uDC7F]'
-    },
-    {
-        'name': 'Braille',
-        'bmp': '\u2800-\u28FF'
-    },
-    {
-        'name': 'Buginese',
-        'bmp': '\u1A00-\u1A1B\u1A1E\u1A1F'
-    },
-    {
-        'name': 'Buhid',
-        'bmp': '\u1740-\u1753'
-    },
-    {
-        'name': 'Canadian_Aboriginal',
-        'bmp': '\u1400-\u167F\u18B0-\u18F5'
-    },
-    {
-        'name': 'Carian',
-        'astral': '\uD800[\uDEA0-\uDED0]'
-    },
-    {
-        'name': 'Caucasian_Albanian',
-        'astral': '\uD801[\uDD30-\uDD63\uDD6F]'
-    },
-    {
-        'name': 'Chakma',
-        'astral': '\uD804[\uDD00-\uDD34\uDD36-\uDD46]'
-    },
-    {
-        'name': 'Cham',
-        'bmp': '\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA5C-\uAA5F'
-    },
-    {
-        'name': 'Cherokee',
-        'bmp': '\u13A0-\u13F5\u13F8-\u13FD\uAB70-\uABBF'
-    },
-    {
-        'name': 'Common',
-        'bmp': '\0-@\\[-`\\{-\xA9\xAB-\xB9\xBB-\xBF\xD7\xF7\u02B9-\u02DF\u02E5-\u02E9\u02EC-\u02FF\u0374\u037E\u0385\u0387\u0589\u0605\u060C\u061B\u061F\u0640\u06DD\u08E2\u0964\u0965\u0E3F\u0FD5-\u0FD8\u10FB\u16EB-\u16ED\u1735\u1736\u1802\u1803\u1805\u1CD3\u1CE1\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5-\u1CF7\u1CFA\u2000-\u200B\u200E-\u2064\u2066-\u2070\u2074-\u207E\u2080-\u208E\u20A0-\u20BF\u2100-\u2125\u2127-\u2129\u212C-\u2131\u2133-\u214D\u214F-\u215F\u2189-\u218B\u2190-\u2426\u2440-\u244A\u2460-\u27FF\u2900-\u2B73\u2B76-\u2B95\u2B98-\u2BFF\u2E00-\u2E4F\u2FF0-\u2FFB\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303C-\u303F\u309B\u309C\u30A0\u30FB\u30FC\u3190-\u319F\u31C0-\u31E3\u3220-\u325F\u327F-\u32CF\u32FF\u3358-\u33FF\u4DC0-\u4DFF\uA700-\uA721\uA788-\uA78A\uA830-\uA839\uA92E\uA9CF\uAB5B\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFEFF\uFF01-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFF70\uFF9E\uFF9F\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFF9-\uFFFD',
-        'astral': '\uD800[\uDD00-\uDD02\uDD07-\uDD33\uDD37-\uDD3F\uDD90-\uDD9B\uDDD0-\uDDFC\uDEE1-\uDEFB]|\uD81B[\uDFE2\uDFE3]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD66\uDD6A-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDEE0-\uDEF3\uDF00-\uDF56\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDFCB\uDFCE-\uDFFF]|\uD83B[\uDC71-\uDCB4\uDD01-\uDD3D]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD00-\uDD0C\uDD10-\uDD6C\uDD70-\uDDAC\uDDE6-\uDDFF\uDE01\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED5\uDEE0-\uDEEC\uDEF0-\uDEFA\uDF00-\uDF73\uDF80-\uDFD8\uDFE0-\uDFEB]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD00-\uDD0B\uDD0D-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDE53\uDE60-\uDE6D\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95]|\uDB40[\uDC01\uDC20-\uDC7F]'
-    },
-    {
-        'name': 'Coptic',
-        'bmp': '\u03E2-\u03EF\u2C80-\u2CF3\u2CF9-\u2CFF'
-    },
-    {
-        'name': 'Cuneiform',
-        'astral': '\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC70-\uDC74\uDC80-\uDD43]'
-    },
-    {
-        'name': 'Cypriot',
-        'astral': '\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F]'
-    },
-    {
-        'name': 'Cyrillic',
-        'bmp': '\u0400-\u0484\u0487-\u052F\u1C80-\u1C88\u1D2B\u1D78\u2DE0-\u2DFF\uA640-\uA69F\uFE2E\uFE2F'
-    },
-    {
-        'name': 'Deseret',
-        'astral': '\uD801[\uDC00-\uDC4F]'
-    },
-    {
-        'name': 'Devanagari',
-        'bmp': '\u0900-\u0950\u0955-\u0963\u0966-\u097F\uA8E0-\uA8FF'
-    },
-    {
-        'name': 'Dogra',
-        'astral': '\uD806[\uDC00-\uDC3B]'
-    },
-    {
-        'name': 'Duployan',
-        'astral': '\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9C-\uDC9F]'
-    },
-    {
-        'name': 'Egyptian_Hieroglyphs',
-        'astral': '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E\uDC30-\uDC38]'
-    },
-    {
-        'name': 'Elbasan',
-        'astral': '\uD801[\uDD00-\uDD27]'
-    },
-    {
-        'name': 'Elymaic',
-        'astral': '\uD803[\uDFE0-\uDFF6]'
-    },
-    {
-        'name': 'Ethiopic',
-        'bmp': '\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u137C\u1380-\u1399\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E'
-    },
-    {
-        'name': 'Georgian',
-        'bmp': '\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u10FF\u1C90-\u1CBA\u1CBD-\u1CBF\u2D00-\u2D25\u2D27\u2D2D'
-    },
-    {
-        'name': 'Glagolitic',
-        'bmp': '\u2C00-\u2C2E\u2C30-\u2C5E',
-        'astral': '\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]'
-    },
-    {
-        'name': 'Gothic',
-        'astral': '\uD800[\uDF30-\uDF4A]'
-    },
-    {
-        'name': 'Grantha',
-        'astral': '\uD804[\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]'
-    },
-    {
-        'name': 'Greek',
-        'bmp': '\u0370-\u0373\u0375-\u0377\u037A-\u037D\u037F\u0384\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03E1\u03F0-\u03FF\u1D26-\u1D2A\u1D5D-\u1D61\u1D66-\u1D6A\u1DBF\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FC4\u1FC6-\u1FD3\u1FD6-\u1FDB\u1FDD-\u1FEF\u1FF2-\u1FF4\u1FF6-\u1FFE\u2126\uAB65',
-        'astral': '\uD800[\uDD40-\uDD8E\uDDA0]|\uD834[\uDE00-\uDE45]'
-    },
-    {
-        'name': 'Gujarati',
-        'bmp': '\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AF1\u0AF9-\u0AFF'
-    },
-    {
-        'name': 'Gunjala_Gondi',
-        'astral': '\uD807[\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9]'
-    },
-    {
-        'name': 'Gurmukhi',
-        'bmp': '\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A76'
-    },
-    {
-        'name': 'Han',
-        'bmp': '\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FEF\uF900-\uFA6D\uFA70-\uFAD9',
-        'astral': '[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]'
-    },
-    {
-        'name': 'Hangul',
-        'bmp': '\u1100-\u11FF\u302E\u302F\u3131-\u318E\u3200-\u321E\u3260-\u327E\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC'
-    },
-    {
-        'name': 'Hanifi_Rohingya',
-        'astral': '\uD803[\uDD00-\uDD27\uDD30-\uDD39]'
-    },
-    {
-        'name': 'Hanunoo',
-        'bmp': '\u1720-\u1734'
-    },
-    {
-        'name': 'Hatran',
-        'astral': '\uD802[\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDCFF]'
-    },
-    {
-        'name': 'Hebrew',
-        'bmp': '\u0591-\u05C7\u05D0-\u05EA\u05EF-\u05F4\uFB1D-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFB4F'
-    },
-    {
-        'name': 'Hiragana',
-        'bmp': '\u3041-\u3096\u309D-\u309F',
-        'astral': '\uD82C[\uDC01-\uDD1E\uDD50-\uDD52]|\uD83C\uDE00'
-    },
-    {
-        'name': 'Imperial_Aramaic',
-        'astral': '\uD802[\uDC40-\uDC55\uDC57-\uDC5F]'
-    },
-    {
-        'name': 'Inherited',
-        'bmp': '\u0300-\u036F\u0485\u0486\u064B-\u0655\u0670\u0951-\u0954\u1AB0-\u1ABE\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u200C\u200D\u20D0-\u20F0\u302A-\u302D\u3099\u309A\uFE00-\uFE0F\uFE20-\uFE2D',
-        'astral': '\uD800[\uDDFD\uDEE0]|\uD804\uDF3B|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD]|\uDB40[\uDD00-\uDDEF]'
-    },
-    {
-        'name': 'Inscriptional_Pahlavi',
-        'astral': '\uD802[\uDF60-\uDF72\uDF78-\uDF7F]'
-    },
-    {
-        'name': 'Inscriptional_Parthian',
-        'astral': '\uD802[\uDF40-\uDF55\uDF58-\uDF5F]'
-    },
-    {
-        'name': 'Javanese',
-        'bmp': '\uA980-\uA9CD\uA9D0-\uA9D9\uA9DE\uA9DF'
-    },
-    {
-        'name': 'Kaithi',
-        'astral': '\uD804[\uDC80-\uDCC1\uDCCD]'
-    },
-    {
-        'name': 'Kannada',
-        'bmp': '\u0C80-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2'
-    },
-    {
-        'name': 'Katakana',
-        'bmp': '\u30A1-\u30FA\u30FD-\u30FF\u31F0-\u31FF\u32D0-\u32FE\u3300-\u3357\uFF66-\uFF6F\uFF71-\uFF9D',
-        'astral': '\uD82C[\uDC00\uDD64-\uDD67]'
-    },
-    {
-        'name': 'Kayah_Li',
-        'bmp': '\uA900-\uA92D\uA92F'
-    },
-    {
-        'name': 'Kharoshthi',
-        'astral': '\uD802[\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F-\uDE48\uDE50-\uDE58]'
-    },
-    {
-        'name': 'Khmer',
-        'bmp': '\u1780-\u17DD\u17E0-\u17E9\u17F0-\u17F9\u19E0-\u19FF'
-    },
-    {
-        'name': 'Khojki',
-        'astral': '\uD804[\uDE00-\uDE11\uDE13-\uDE3E]'
-    },
-    {
-        'name': 'Khudawadi',
-        'astral': '\uD804[\uDEB0-\uDEEA\uDEF0-\uDEF9]'
-    },
-    {
-        'name': 'Lao',
-        'bmp': '\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF'
-    },
-    {
-        'name': 'Latin',
-        'bmp': 'A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7BF\uA7C2-\uA7C6\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uAB66\uAB67\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A'
-    },
-    {
-        'name': 'Lepcha',
-        'bmp': '\u1C00-\u1C37\u1C3B-\u1C49\u1C4D-\u1C4F'
-    },
-    {
-        'name': 'Limbu',
-        'bmp': '\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1940\u1944-\u194F'
-    },
-    {
-        'name': 'Linear_A',
-        'astral': '\uD801[\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]'
-    },
-    {
-        'name': 'Linear_B',
-        'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA]'
-    },
-    {
-        'name': 'Lisu',
-        'bmp': '\uA4D0-\uA4FF'
-    },
-    {
-        'name': 'Lycian',
-        'astral': '\uD800[\uDE80-\uDE9C]'
-    },
-    {
-        'name': 'Lydian',
-        'astral': '\uD802[\uDD20-\uDD39\uDD3F]'
-    },
-    {
-        'name': 'Mahajani',
-        'astral': '\uD804[\uDD50-\uDD76]'
-    },
-    {
-        'name': 'Makasar',
-        'astral': '\uD807[\uDEE0-\uDEF8]'
-    },
-    {
-        'name': 'Malayalam',
-        'bmp': '\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4F\u0D54-\u0D63\u0D66-\u0D7F'
-    },
-    {
-        'name': 'Mandaic',
-        'bmp': '\u0840-\u085B\u085E'
-    },
-    {
-        'name': 'Manichaean',
-        'astral': '\uD802[\uDEC0-\uDEE6\uDEEB-\uDEF6]'
-    },
-    {
-        'name': 'Marchen',
-        'astral': '\uD807[\uDC70-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]'
-    },
-    {
-        'name': 'Masaram_Gondi',
-        'astral': '\uD807[\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]'
-    },
-    {
-        'name': 'Medefaidrin',
-        'astral': '\uD81B[\uDE40-\uDE9A]'
-    },
-    {
-        'name': 'Meetei_Mayek',
-        'bmp': '\uAAE0-\uAAF6\uABC0-\uABED\uABF0-\uABF9'
-    },
-    {
-        'name': 'Mende_Kikakui',
-        'astral': '\uD83A[\uDC00-\uDCC4\uDCC7-\uDCD6]'
-    },
-    {
-        'name': 'Meroitic_Cursive',
-        'astral': '\uD802[\uDDA0-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDDFF]'
-    },
-    {
-        'name': 'Meroitic_Hieroglyphs',
-        'astral': '\uD802[\uDD80-\uDD9F]'
-    },
-    {
-        'name': 'Miao',
-        'astral': '\uD81B[\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F]'
-    },
-    {
-        'name': 'Modi',
-        'astral': '\uD805[\uDE00-\uDE44\uDE50-\uDE59]'
-    },
-    {
-        'name': 'Mongolian',
-        'bmp': '\u1800\u1801\u1804\u1806-\u180E\u1810-\u1819\u1820-\u1878\u1880-\u18AA',
-        'astral': '\uD805[\uDE60-\uDE6C]'
-    },
-    {
-        'name': 'Mro',
-        'astral': '\uD81A[\uDE40-\uDE5E\uDE60-\uDE69\uDE6E\uDE6F]'
-    },
-    {
-        'name': 'Multani',
-        'astral': '\uD804[\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA9]'
-    },
-    {
-        'name': 'Myanmar',
-        'bmp': '\u1000-\u109F\uA9E0-\uA9FE\uAA60-\uAA7F'
-    },
-    {
-        'name': 'Nabataean',
-        'astral': '\uD802[\uDC80-\uDC9E\uDCA7-\uDCAF]'
-    },
-    {
-        'name': 'Nandinagari',
-        'astral': '\uD806[\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE4]'
-    },
-    {
-        'name': 'New_Tai_Lue',
-        'bmp': '\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u19DE\u19DF'
-    },
-    {
-        'name': 'Newa',
-        'astral': '\uD805[\uDC00-\uDC59\uDC5B\uDC5D-\uDC5F]'
-    },
-    {
-        'name': 'Nko',
-        'bmp': '\u07C0-\u07FA\u07FD-\u07FF'
-    },
-    {
-        'name': 'Nushu',
-        'astral': '\uD81B\uDFE1|\uD82C[\uDD70-\uDEFB]'
-    },
-    {
-        'name': 'Nyiakeng_Puachue_Hmong',
-        'astral': '\uD838[\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDD4F]'
-    },
-    {
-        'name': 'Ogham',
-        'bmp': '\u1680-\u169C'
-    },
-    {
-        'name': 'Ol_Chiki',
-        'bmp': '\u1C50-\u1C7F'
-    },
-    {
-        'name': 'Old_Hungarian',
-        'astral': '\uD803[\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDCFF]'
-    },
-    {
-        'name': 'Old_Italic',
-        'astral': '\uD800[\uDF00-\uDF23\uDF2D-\uDF2F]'
-    },
-    {
-        'name': 'Old_North_Arabian',
-        'astral': '\uD802[\uDE80-\uDE9F]'
-    },
-    {
-        'name': 'Old_Permic',
-        'astral': '\uD800[\uDF50-\uDF7A]'
-    },
-    {
-        'name': 'Old_Persian',
-        'astral': '\uD800[\uDFA0-\uDFC3\uDFC8-\uDFD5]'
-    },
-    {
-        'name': 'Old_Sogdian',
-        'astral': '\uD803[\uDF00-\uDF27]'
-    },
-    {
-        'name': 'Old_South_Arabian',
-        'astral': '\uD802[\uDE60-\uDE7F]'
-    },
-    {
-        'name': 'Old_Turkic',
-        'astral': '\uD803[\uDC00-\uDC48]'
-    },
-    {
-        'name': 'Oriya',
-        'bmp': '\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B77'
-    },
-    {
-        'name': 'Osage',
-        'astral': '\uD801[\uDCB0-\uDCD3\uDCD8-\uDCFB]'
-    },
-    {
-        'name': 'Osmanya',
-        'astral': '\uD801[\uDC80-\uDC9D\uDCA0-\uDCA9]'
-    },
-    {
-        'name': 'Pahawh_Hmong',
-        'astral': '\uD81A[\uDF00-\uDF45\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]'
-    },
-    {
-        'name': 'Palmyrene',
-        'astral': '\uD802[\uDC60-\uDC7F]'
-    },
-    {
-        'name': 'Pau_Cin_Hau',
-        'astral': '\uD806[\uDEC0-\uDEF8]'
-    },
-    {
-        'name': 'Phags_Pa',
-        'bmp': '\uA840-\uA877'
-    },
-    {
-        'name': 'Phoenician',
-        'astral': '\uD802[\uDD00-\uDD1B\uDD1F]'
-    },
-    {
-        'name': 'Psalter_Pahlavi',
-        'astral': '\uD802[\uDF80-\uDF91\uDF99-\uDF9C\uDFA9-\uDFAF]'
-    },
-    {
-        'name': 'Rejang',
-        'bmp': '\uA930-\uA953\uA95F'
-    },
-    {
-        'name': 'Runic',
-        'bmp': '\u16A0-\u16EA\u16EE-\u16F8'
-    },
-    {
-        'name': 'Samaritan',
-        'bmp': '\u0800-\u082D\u0830-\u083E'
-    },
-    {
-        'name': 'Saurashtra',
-        'bmp': '\uA880-\uA8C5\uA8CE-\uA8D9'
-    },
-    {
-        'name': 'Sharada',
-        'astral': '\uD804[\uDD80-\uDDCD\uDDD0-\uDDDF]'
-    },
-    {
-        'name': 'Shavian',
-        'astral': '\uD801[\uDC50-\uDC7F]'
-    },
-    {
-        'name': 'Siddham',
-        'astral': '\uD805[\uDD80-\uDDB5\uDDB8-\uDDDD]'
-    },
-    {
-        'name': 'SignWriting',
-        'astral': '\uD836[\uDC00-\uDE8B\uDE9B-\uDE9F\uDEA1-\uDEAF]'
-    },
-    {
-        'name': 'Sinhala',
-        'bmp': '\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2-\u0DF4',
-        'astral': '\uD804[\uDDE1-\uDDF4]'
-    },
-    {
-        'name': 'Sogdian',
-        'astral': '\uD803[\uDF30-\uDF59]'
-    },
-    {
-        'name': 'Sora_Sompeng',
-        'astral': '\uD804[\uDCD0-\uDCE8\uDCF0-\uDCF9]'
-    },
-    {
-        'name': 'Soyombo',
-        'astral': '\uD806[\uDE50-\uDEA2]'
-    },
-    {
-        'name': 'Sundanese',
-        'bmp': '\u1B80-\u1BBF\u1CC0-\u1CC7'
-    },
-    {
-        'name': 'Syloti_Nagri',
-        'bmp': '\uA800-\uA82B'
-    },
-    {
-        'name': 'Syriac',
-        'bmp': '\u0700-\u070D\u070F-\u074A\u074D-\u074F\u0860-\u086A'
-    },
-    {
-        'name': 'Tagalog',
-        'bmp': '\u1700-\u170C\u170E-\u1714'
-    },
-    {
-        'name': 'Tagbanwa',
-        'bmp': '\u1760-\u176C\u176E-\u1770\u1772\u1773'
-    },
-    {
-        'name': 'Tai_Le',
-        'bmp': '\u1950-\u196D\u1970-\u1974'
-    },
-    {
-        'name': 'Tai_Tham',
-        'bmp': '\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA0-\u1AAD'
-    },
-    {
-        'name': 'Tai_Viet',
-        'bmp': '\uAA80-\uAAC2\uAADB-\uAADF'
-    },
-    {
-        'name': 'Takri',
-        'astral': '\uD805[\uDE80-\uDEB8\uDEC0-\uDEC9]'
-    },
-    {
-        'name': 'Tamil',
-        'bmp': '\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BFA',
-        'astral': '\uD807[\uDFC0-\uDFF1\uDFFF]'
-    },
-    {
-        'name': 'Tangut',
-        'astral': '\uD81B\uDFE0|[\uD81C-\uD820][\uDC00-\uDFFF]|\uD821[\uDC00-\uDFF7]|\uD822[\uDC00-\uDEF2]'
-    },
-    {
-        'name': 'Telugu',
-        'bmp': '\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C77-\u0C7F'
-    },
-    {
-        'name': 'Thaana',
-        'bmp': '\u0780-\u07B1'
-    },
-    {
-        'name': 'Thai',
-        'bmp': '\u0E01-\u0E3A\u0E40-\u0E5B'
-    },
-    {
-        'name': 'Tibetan',
-        'bmp': '\u0F00-\u0F47\u0F49-\u0F6C\u0F71-\u0F97\u0F99-\u0FBC\u0FBE-\u0FCC\u0FCE-\u0FD4\u0FD9\u0FDA'
-    },
-    {
-        'name': 'Tifinagh',
-        'bmp': '\u2D30-\u2D67\u2D6F\u2D70\u2D7F'
-    },
-    {
-        'name': 'Tirhuta',
-        'astral': '\uD805[\uDC80-\uDCC7\uDCD0-\uDCD9]'
-    },
-    {
-        'name': 'Ugaritic',
-        'astral': '\uD800[\uDF80-\uDF9D\uDF9F]'
-    },
-    {
-        'name': 'Vai',
-        'bmp': '\uA500-\uA62B'
-    },
-    {
-        'name': 'Wancho',
-        'astral': '\uD838[\uDEC0-\uDEF9\uDEFF]'
-    },
-    {
-        'name': 'Warang_Citi',
-        'astral': '\uD806[\uDCA0-\uDCF2\uDCFF]'
-    },
-    {
-        'name': 'Yi',
-        'bmp': '\uA000-\uA48C\uA490-\uA4C6'
-    },
-    {
-        'name': 'Zanabazar_Square',
-        'astral': '\uD806[\uDE00-\uDE47]'
-    }
-];
diff --git a/node_modules/xregexp/xregexp-all.js b/node_modules/xregexp/xregexp-all.js
deleted file mode 100644
index a660831..0000000
--- a/node_modules/xregexp/xregexp-all.js
+++ /dev/null
@@ -1,7470 +0,0 @@
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.XRegExp = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
-
-var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
-
-var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
-
-var _reduce = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/reduce"));
-
-/*!
- * XRegExp.build 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2012-present MIT License
- */
-var _default = function _default(XRegExp) {
-  var REGEX_DATA = 'xregexp';
-  var subParts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g;
-  var parts = XRegExp.union([/\({{([\w$]+)}}\)|{{([\w$]+)}}/, subParts], 'g', {
-    conjunction: 'or'
-  });
-  /**
-   * Strips a leading `^` and trailing unescaped `$`, if both are present.
-   *
-   * @private
-   * @param {String} pattern Pattern to process.
-   * @returns {String} Pattern with edge anchors removed.
-   */
-
-  function deanchor(pattern) {
-    // Allow any number of empty noncapturing groups before/after anchors, because regexes
-    // built/generated by XRegExp sometimes include them
-    var leadingAnchor = /^(?:\(\?:\))*\^/;
-    var trailingAnchor = /\$(?:\(\?:\))*$/;
-
-    if (leadingAnchor.test(pattern) && trailingAnchor.test(pattern) && // Ensure that the trailing `$` isn't escaped
-    trailingAnchor.test(pattern.replace(/\\[\s\S]/g, ''))) {
-      return pattern.replace(leadingAnchor, '').replace(trailingAnchor, '');
-    }
-
-    return pattern;
-  }
-  /**
-   * Converts the provided value to an XRegExp. Native RegExp flags are not preserved.
-   *
-   * @private
-   * @param {String|RegExp} value Value to convert.
-   * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not
-   *   already a regex generated by XRegExp
-   * @returns {RegExp} XRegExp object with XRegExp syntax applied.
-   */
-
-
-  function asXRegExp(value, addFlagX) {
-    var flags = addFlagX ? 'x' : '';
-    return XRegExp.isRegExp(value) ? value[REGEX_DATA] && value[REGEX_DATA].captureNames ? // Don't recompile, to preserve capture names
-    value : // Recompile as XRegExp
-    XRegExp(value.source, flags) : // Compile string as XRegExp
-    XRegExp(value, flags);
-  }
-
-  function interpolate(substitution) {
-    return substitution instanceof RegExp ? substitution : XRegExp.escape(substitution);
-  }
-
-  function reduceToSubpatternsObject(subpatterns, interpolated, subpatternIndex) {
-    subpatterns["subpattern".concat(subpatternIndex)] = interpolated;
-    return subpatterns;
-  }
-
-  function embedSubpatternAfter(raw, subpatternIndex, rawLiterals) {
-    var hasSubpattern = subpatternIndex < rawLiterals.length - 1;
-    return raw + (hasSubpattern ? "{{subpattern".concat(subpatternIndex, "}}") : '');
-  }
-  /**
-   * Provides tagged template literals that create regexes with XRegExp syntax and flags. The
-   * provided pattern is handled as a raw string, so backslashes don't need to be escaped.
-   *
-   * Interpolation of strings and regexes shares the features of `XRegExp.build`. Interpolated
-   * patterns are treated as atomic units when quantified, interpolated strings have their special
-   * characters escaped, a leading `^` and trailing unescaped `$` are stripped from interpolated
-   * regexes if both are present, and any backreferences within an interpolated regex are
-   * rewritten to work within the overall pattern.
-   *
-   * @memberOf XRegExp
-   * @param {String} [flags] Any combination of XRegExp flags.
-   * @returns {Function} Handler for template literals that construct regexes with XRegExp syntax.
-   * @example
-   *
-   * const h12 = /1[0-2]|0?[1-9]/;
-   * const h24 = /2[0-3]|[01][0-9]/;
-   * const hours = XRegExp.tag('x')`${h12} : | ${h24}`;
-   * const minutes = /^[0-5][0-9]$/;
-   * // Note that explicitly naming the 'minutes' group is required for named backreferences
-   * const time = XRegExp.tag('x')`^ ${hours} (?<minutes>${minutes}) $`;
-   * time.test('10:59'); // -> true
-   * XRegExp.exec('10:59', time).minutes; // -> '59'
-   */
-
-
-  XRegExp.tag = function (flags) {
-    return function (literals) {
-      var _context, _context2;
-
-      for (var _len = arguments.length, substitutions = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
-        substitutions[_key - 1] = arguments[_key];
-      }
-
-      var subpatterns = (0, _reduce.default)(_context = (0, _map.default)(substitutions).call(substitutions, interpolate)).call(_context, reduceToSubpatternsObject, {});
-      var pattern = (0, _map.default)(_context2 = literals.raw).call(_context2, embedSubpatternAfter).join('');
-      return XRegExp.build(pattern, subpatterns, flags);
-    };
-  };
-  /**
-   * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in
-   * the outer pattern and provided subpatterns are automatically renumbered to work correctly.
-   * Native flags used by provided subpatterns are ignored in favor of the `flags` argument.
-   *
-   * @memberOf XRegExp
-   * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows
-   *   `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within
-   *   character classes.
-   * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A
-   *   leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present.
-   * @param {String} [flags] Any combination of XRegExp flags.
-   * @returns {RegExp} Regex with interpolated subpatterns.
-   * @example
-   *
-   * const time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {
-   *   hours: XRegExp.build('{{h12}} : | {{h24}}', {
-   *     h12: /1[0-2]|0?[1-9]/,
-   *     h24: /2[0-3]|[01][0-9]/
-   *   }, 'x'),
-   *   minutes: /^[0-5][0-9]$/
-   * });
-   * time.test('10:59'); // -> true
-   * XRegExp.exec('10:59', time).minutes; // -> '59'
-   */
-
-
-  XRegExp.build = function (pattern, subs, flags) {
-    flags = flags || ''; // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how
-    // some browsers convert `RegExp('\n')` to a regex that contains the literal characters `\`
-    // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>.
-
-    var addFlagX = (0, _includes.default)(flags).call(flags, 'x');
-    var inlineFlags = /^\(\?([\w$]+)\)/.exec(pattern); // Add flags within a leading mode modifier to the overall pattern's flags
-
-    if (inlineFlags) {
-      flags = XRegExp._clipDuplicates(flags + inlineFlags[1]);
-    }
-
-    var data = {};
-
-    for (var p in subs) {
-      if (subs.hasOwnProperty(p)) {
-        // Passing to XRegExp enables extended syntax and ensures independent validity,
-        // lest an unescaped `(`, `)`, `[`, or trailing `\` breaks the `(?:)` wrapper. For
-        // subpatterns provided as native regexes, it dies on octals and adds the property
-        // used to hold extended regex instance data, for simplicity.
-        var sub = asXRegExp(subs[p], addFlagX);
-        data[p] = {
-          // Deanchoring allows embedding independently useful anchored regexes. If you
-          // really need to keep your anchors, double them (i.e., `^^...$$`).
-          pattern: deanchor(sub.source),
-          names: sub[REGEX_DATA].captureNames || []
-        };
-      }
-    } // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid;
-    // helps keep this simple. Named captures will be put back.
-
-
-    var patternAsRegex = asXRegExp(pattern, addFlagX); // 'Caps' is short for 'captures'
-
-    var numCaps = 0;
-    var numPriorCaps;
-    var numOuterCaps = 0;
-    var outerCapsMap = [0];
-    var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || [];
-    var output = patternAsRegex.source.replace(parts, function ($0, $1, $2, $3, $4) {
-      var subName = $1 || $2;
-      var capName;
-      var intro;
-      var localCapIndex; // Named subpattern
-
-      if (subName) {
-        var _context3;
-
-        if (!data.hasOwnProperty(subName)) {
-          throw new ReferenceError("Undefined property ".concat($0));
-        } // Named subpattern was wrapped in a capturing group
-
-
-        if ($1) {
-          capName = outerCapNames[numOuterCaps];
-          outerCapsMap[++numOuterCaps] = ++numCaps; // If it's a named group, preserve the name. Otherwise, use the subpattern name
-          // as the capture name
-
-          intro = "(?<".concat(capName || subName, ">");
-        } else {
-          intro = '(?:';
-        }
-
-        numPriorCaps = numCaps;
-        var rewrittenSubpattern = data[subName].pattern.replace(subParts, function (match, paren, backref) {
-          // Capturing group
-          if (paren) {
-            capName = data[subName].names[numCaps - numPriorCaps];
-            ++numCaps; // If the current capture has a name, preserve the name
-
-            if (capName) {
-              return "(?<".concat(capName, ">");
-            } // Backreference
-
-          } else if (backref) {
-            localCapIndex = +backref - 1; // Rewrite the backreference
-
-            return data[subName].names[localCapIndex] ? // Need to preserve the backreference name in case using flag `n`
-            "\\k<".concat(data[subName].names[localCapIndex], ">") : "\\".concat(+backref + numPriorCaps);
-          }
-
-          return match;
-        });
-        return (0, _concat.default)(_context3 = "".concat(intro)).call(_context3, rewrittenSubpattern, ")");
-      } // Capturing group
-
-
-      if ($3) {
-        capName = outerCapNames[numOuterCaps];
-        outerCapsMap[++numOuterCaps] = ++numCaps; // If the current capture has a name, preserve the name
-
-        if (capName) {
-          return "(?<".concat(capName, ">");
-        } // Backreference
-
-      } else if ($4) {
-        localCapIndex = +$4 - 1; // Rewrite the backreference
-
-        return outerCapNames[localCapIndex] ? // Need to preserve the backreference name in case using flag `n`
-        "\\k<".concat(outerCapNames[localCapIndex], ">") : "\\".concat(outerCapsMap[+$4]);
-      }
-
-      return $0;
-    });
-    return XRegExp(output, flags);
-  };
-};
-
-exports.default = _default;
-module.exports = exports["default"];
-},{"@babel/runtime-corejs3/core-js-stable/instance/concat":10,"@babel/runtime-corejs3/core-js-stable/instance/includes":13,"@babel/runtime-corejs3/core-js-stable/instance/map":15,"@babel/runtime-corejs3/core-js-stable/instance/reduce":16,"@babel/runtime-corejs3/core-js-stable/object/define-property":20,"@babel/runtime-corejs3/helpers/interopRequireDefault":26}],2:[function(require,module,exports){
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
-
-var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
-
-var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
-
-/*!
- * XRegExp.matchRecursive 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2009-present MIT License
- */
-var _default = function _default(XRegExp) {
-  /**
-   * Returns a match detail object composed of the provided values.
-   *
-   * @private
-   */
-  function row(name, value, start, end) {
-    return {
-      name: name,
-      value: value,
-      start: start,
-      end: end
-    };
-  }
-  /**
-   * Returns an array of match strings between outermost left and right delimiters, or an array of
-   * objects with detailed match parts and position data. An error is thrown if delimiters are
-   * unbalanced within the data.
-   *
-   * @memberOf XRegExp
-   * @param {String} str String to search.
-   * @param {String} left Left delimiter as an XRegExp pattern.
-   * @param {String} right Right delimiter as an XRegExp pattern.
-   * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters.
-   * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options.
-   * @returns {Array} Array of matches, or an empty array.
-   * @example
-   *
-   * // Basic usage
-   * let str = '(t((e))s)t()(ing)';
-   * XRegExp.matchRecursive(str, '\\(', '\\)', 'g');
-   * // -> ['t((e))s', '', 'ing']
-   *
-   * // Extended information mode with valueNames
-   * str = 'Here is <div> <div>an</div></div> example';
-   * XRegExp.matchRecursive(str, '<div\\s*>', '</div>', 'gi', {
-   *   valueNames: ['between', 'left', 'match', 'right']
-   * });
-   * // -> [
-   * // {name: 'between', value: 'Here is ',       start: 0,  end: 8},
-   * // {name: 'left',    value: '<div>',          start: 8,  end: 13},
-   * // {name: 'match',   value: ' <div>an</div>', start: 13, end: 27},
-   * // {name: 'right',   value: '</div>',         start: 27, end: 33},
-   * // {name: 'between', value: ' example',       start: 33, end: 41}
-   * // ]
-   *
-   * // Omitting unneeded parts with null valueNames, and using escapeChar
-   * str = '...{1}.\\{{function(x,y){return {y:x}}}';
-   * XRegExp.matchRecursive(str, '{', '}', 'g', {
-   *   valueNames: ['literal', null, 'value', null],
-   *   escapeChar: '\\'
-   * });
-   * // -> [
-   * // {name: 'literal', value: '...',  start: 0, end: 3},
-   * // {name: 'value',   value: '1',    start: 4, end: 5},
-   * // {name: 'literal', value: '.\\{', start: 6, end: 9},
-   * // {name: 'value',   value: 'function(x,y){return {y:x}}', start: 10, end: 37}
-   * // ]
-   *
-   * // Sticky mode via flag y
-   * str = '<1><<<2>>><3>4<5>';
-   * XRegExp.matchRecursive(str, '<', '>', 'gy');
-   * // -> ['1', '<<2>>', '3']
-   */
-
-
-  XRegExp.matchRecursive = function (str, left, right, flags, options) {
-    flags = flags || '';
-    options = options || {};
-    var global = (0, _includes.default)(flags).call(flags, 'g');
-    var sticky = (0, _includes.default)(flags).call(flags, 'y'); // Flag `y` is controlled internally
-
-    var basicFlags = flags.replace(/y/g, '');
-    var _options = options,
-        escapeChar = _options.escapeChar;
-    var vN = options.valueNames;
-    var output = [];
-    var openTokens = 0;
-    var delimStart = 0;
-    var delimEnd = 0;
-    var lastOuterEnd = 0;
-    var outerStart;
-    var innerStart;
-    var leftMatch;
-    var rightMatch;
-    var esc;
-    left = XRegExp(left, basicFlags);
-    right = XRegExp(right, basicFlags);
-
-    if (escapeChar) {
-      var _context, _context2;
-
-      if (escapeChar.length > 1) {
-        throw new Error('Cannot use more than one escape character');
-      }
-
-      escapeChar = XRegExp.escape(escapeChar); // Example of concatenated `esc` regex:
-      // `escapeChar`: '%'
-      // `left`: '<'
-      // `right`: '>'
-      // Regex is: /(?:%[\S\s]|(?:(?!<|>)[^%])+)+/
-
-      esc = new RegExp((0, _concat.default)(_context = (0, _concat.default)(_context2 = "(?:".concat(escapeChar, "[\\S\\s]|(?:(?!")).call(_context2, // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`.
-      // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax
-      // transformation resulting from those flags was already applied to `left` and
-      // `right` when they were passed through the XRegExp constructor above.
-      XRegExp.union([left, right], '', {
-        conjunction: 'or'
-      }).source, ")[^")).call(_context, escapeChar, "])+)+"), // Flags `gy` not needed here
-      flags.replace(/[^imu]+/g, ''));
-    }
-
-    while (true) {
-      // If using an escape character, advance to the delimiter's next starting position,
-      // skipping any escaped characters in between
-      if (escapeChar) {
-        delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length;
-      }
-
-      leftMatch = XRegExp.exec(str, left, delimEnd);
-      rightMatch = XRegExp.exec(str, right, delimEnd); // Keep the leftmost match only
-
-      if (leftMatch && rightMatch) {
-        if (leftMatch.index <= rightMatch.index) {
-          rightMatch = null;
-        } else {
-          leftMatch = null;
-        }
-      } // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens):
-      // LM | RM | OT | Result
-      // 1  | 0  | 1  | loop
-      // 1  | 0  | 0  | loop
-      // 0  | 1  | 1  | loop
-      // 0  | 1  | 0  | throw
-      // 0  | 0  | 1  | throw
-      // 0  | 0  | 0  | break
-      // The paths above don't include the sticky mode special case. The loop ends after the
-      // first completed match if not `global`.
-
-
-      if (leftMatch || rightMatch) {
-        delimStart = (leftMatch || rightMatch).index;
-        delimEnd = delimStart + (leftMatch || rightMatch)[0].length;
-      } else if (!openTokens) {
-        break;
-      }
-
-      if (sticky && !openTokens && delimStart > lastOuterEnd) {
-        break;
-      }
-
-      if (leftMatch) {
-        if (!openTokens) {
-          outerStart = delimStart;
-          innerStart = delimEnd;
-        }
-
-        ++openTokens;
-      } else if (rightMatch && openTokens) {
-        if (! --openTokens) {
-          if (vN) {
-            if (vN[0] && outerStart > lastOuterEnd) {
-              output.push(row(vN[0], (0, _slice.default)(str).call(str, lastOuterEnd, outerStart), lastOuterEnd, outerStart));
-            }
-
-            if (vN[1]) {
-              output.push(row(vN[1], (0, _slice.default)(str).call(str, outerStart, innerStart), outerStart, innerStart));
-            }
-
-            if (vN[2]) {
-              output.push(row(vN[2], (0, _slice.default)(str).call(str, innerStart, delimStart), innerStart, delimStart));
-            }
-
-            if (vN[3]) {
-              output.push(row(vN[3], (0, _slice.default)(str).call(str, delimStart, delimEnd), delimStart, delimEnd));
-            }
-          } else {
-            output.push((0, _slice.default)(str).call(str, innerStart, delimStart));
-          }
-
-          lastOuterEnd = delimEnd;
-
-          if (!global) {
-            break;
-          }
-        }
-      } else {
-        throw new Error('Unbalanced delimiter found in string');
-      } // If the delimiter matched an empty string, avoid an infinite loop
-
-
-      if (delimStart === delimEnd) {
-        ++delimEnd;
-      }
-    }
-
-    if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) {
-      output.push(row(vN[0], (0, _slice.default)(str).call(str, lastOuterEnd), lastOuterEnd, str.length));
-    }
-
-    return output;
-  };
-};
-
-exports.default = _default;
-module.exports = exports["default"];
-},{"@babel/runtime-corejs3/core-js-stable/instance/concat":10,"@babel/runtime-corejs3/core-js-stable/instance/includes":13,"@babel/runtime-corejs3/core-js-stable/instance/slice":17,"@babel/runtime-corejs3/core-js-stable/object/define-property":20,"@babel/runtime-corejs3/helpers/interopRequireDefault":26}],3:[function(require,module,exports){
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));
-
-var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
-
-var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
-
-var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
-
-/*!
- * XRegExp Unicode Base 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2008-present MIT License
- */
-var _default = function _default(XRegExp) {
-  /**
-   * Adds base support for Unicode matching:
-   * - Adds syntax `\p{..}` for matching Unicode tokens. Tokens can be inverted using `\P{..}` or
-   *   `\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the
-   *   braces for token names that are a single letter (e.g. `\pL` or `PL`).
-   * - Adds flag A (astral), which enables 21-bit Unicode support.
-   * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data.
-   *
-   * Unicode Base relies on externally provided Unicode character data. Official addons are
-   * available to provide data for Unicode categories, scripts, blocks, and properties.
-   *
-   * @requires XRegExp
-   */
-  // ==--------------------------==
-  // Private stuff
-  // ==--------------------------==
-  // Storage for Unicode data
-  var unicode = {}; // Reuse utils
-
-  var dec = XRegExp._dec;
-  var hex = XRegExp._hex;
-  var pad4 = XRegExp._pad4; // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed
-
-  function normalize(name) {
-    return name.replace(/[- _]+/g, '').toLowerCase();
-  } // Gets the decimal code of a literal code unit, \xHH, \uHHHH, or a backslash-escaped literal
-
-
-  function charCode(chr) {
-    var esc = /^\\[xu](.+)/.exec(chr);
-    return esc ? dec(esc[1]) : chr.charCodeAt(chr[0] === '\\' ? 1 : 0);
-  } // Inverts a list of ordered BMP characters and ranges
-
-
-  function invertBmp(range) {
-    var output = '';
-    var lastEnd = -1;
-    (0, _forEach.default)(XRegExp).call(XRegExp, range, /(\\x..|\\u....|\\?[\s\S])(?:-(\\x..|\\u....|\\?[\s\S]))?/, function (m) {
-      var start = charCode(m[1]);
-
-      if (start > lastEnd + 1) {
-        output += "\\u".concat(pad4(hex(lastEnd + 1)));
-
-        if (start > lastEnd + 2) {
-          output += "-\\u".concat(pad4(hex(start - 1)));
-        }
-      }
-
-      lastEnd = charCode(m[2] || m[1]);
-    });
-
-    if (lastEnd < 0xFFFF) {
-      output += "\\u".concat(pad4(hex(lastEnd + 1)));
-
-      if (lastEnd < 0xFFFE) {
-        output += '-\\uFFFF';
-      }
-    }
-
-    return output;
-  } // Generates an inverted BMP range on first use
-
-
-  function cacheInvertedBmp(slug) {
-    var prop = 'b!';
-    return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp));
-  } // Combines and optionally negates BMP and astral data
-
-
-  function buildAstral(slug, isNegated) {
-    var item = unicode[slug];
-    var combined = '';
-
-    if (item.bmp && !item.isBmpLast) {
-      var _context;
-
-      combined = (0, _concat.default)(_context = "[".concat(item.bmp, "]")).call(_context, item.astral ? '|' : '');
-    }
-
-    if (item.astral) {
-      combined += item.astral;
-    }
-
-    if (item.isBmpLast && item.bmp) {
-      var _context2;
-
-      combined += (0, _concat.default)(_context2 = "".concat(item.astral ? '|' : '', "[")).call(_context2, item.bmp, "]");
-    } // Astral Unicode tokens always match a code point, never a code unit
-
-
-    return isNegated ? "(?:(?!".concat(combined, ")(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[\0-\uFFFF]))") : "(?:".concat(combined, ")");
-  } // Builds a complete astral pattern on first use
-
-
-  function cacheAstral(slug, isNegated) {
-    var prop = isNegated ? 'a!' : 'a=';
-    return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated));
-  } // ==--------------------------==
-  // Core functionality
-  // ==--------------------------==
-
-  /*
-   * Add astral mode (flag A) and Unicode token syntax: `\p{..}`, `\P{..}`, `\p{^..}`, `\pC`.
-   */
-
-
-  XRegExp.addToken( // Use `*` instead of `+` to avoid capturing `^` as the token name in `\p{^}`
-  /\\([pP])(?:{(\^?)([^}]*)}|([A-Za-z]))/, function (match, scope, flags) {
-    var ERR_DOUBLE_NEG = 'Invalid double negation ';
-    var ERR_UNKNOWN_NAME = 'Unknown Unicode token ';
-    var ERR_UNKNOWN_REF = 'Unicode token missing data ';
-    var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token ';
-    var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes'; // Negated via \P{..} or \p{^..}
-
-    var isNegated = match[1] === 'P' || !!match[2]; // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A
-
-    var isAstralMode = (0, _includes.default)(flags).call(flags, 'A'); // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\p{}`
-
-    var slug = normalize(match[4] || match[3]); // Token data object
-
-    var item = unicode[slug];
-
-    if (match[1] === 'P' && match[2]) {
-      throw new SyntaxError(ERR_DOUBLE_NEG + match[0]);
-    }
-
-    if (!unicode.hasOwnProperty(slug)) {
-      throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]);
-    } // Switch to the negated form of the referenced Unicode token
-
-
-    if (item.inverseOf) {
-      slug = normalize(item.inverseOf);
-
-      if (!unicode.hasOwnProperty(slug)) {
-        var _context3;
-
-        throw new ReferenceError((0, _concat.default)(_context3 = "".concat(ERR_UNKNOWN_REF + match[0], " -> ")).call(_context3, item.inverseOf));
-      }
-
-      item = unicode[slug];
-      isNegated = !isNegated;
-    }
-
-    if (!(item.bmp || isAstralMode)) {
-      throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]);
-    }
-
-    if (isAstralMode) {
-      if (scope === 'class') {
-        throw new SyntaxError(ERR_ASTRAL_IN_CLASS);
-      }
-
-      return cacheAstral(slug, isNegated);
-    }
-
-    return scope === 'class' ? isNegated ? cacheInvertedBmp(slug) : item.bmp : "".concat((isNegated ? '[^' : '[') + item.bmp, "]");
-  }, {
-    scope: 'all',
-    optionalFlags: 'A',
-    leadChar: '\\'
-  });
-  /**
-   * Adds to the list of Unicode tokens that XRegExp regexes can match via `\p` or `\P`.
-   *
-   * @memberOf XRegExp
-   * @param {Array} data Objects with named character ranges. Each object may have properties
-   *   `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are
-   *   optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If
-   *   `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent,
-   *   the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are
-   *   provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and
-   *   `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan
-   *   high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and
-   *   `astral` data should be a combination of literal characters and `\xHH` or `\uHHHH` escape
-   *   sequences, with hyphens to create ranges. Any regex metacharacters in the data should be
-   *   escaped, apart from range-creating hyphens. The `astral` data can additionally use
-   *   character classes and alternation, and should use surrogate pairs to represent astral code
-   *   points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is
-   *   defined as the exact inverse of another token.
-   * @example
-   *
-   * // Basic use
-   * XRegExp.addUnicodeData([{
-   *   name: 'XDigit',
-   *   alias: 'Hexadecimal',
-   *   bmp: '0-9A-Fa-f'
-   * }]);
-   * XRegExp('\\p{XDigit}:\\p{Hexadecimal}+').test('0:3D'); // -> true
-   */
-
-  XRegExp.addUnicodeData = function (data) {
-    var ERR_NO_NAME = 'Unicode token requires name';
-    var ERR_NO_DATA = 'Unicode token has no character data ';
-    var _iteratorNormalCompletion = true;
-    var _didIteratorError = false;
-    var _iteratorError = undefined;
-
-    try {
-      for (var _iterator = (0, _getIterator2.default)(data), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-        var item = _step.value;
-
-        if (!item.name) {
-          throw new Error(ERR_NO_NAME);
-        }
-
-        if (!(item.inverseOf || item.bmp || item.astral)) {
-          throw new Error(ERR_NO_DATA + item.name);
-        }
-
-        unicode[normalize(item.name)] = item;
-
-        if (item.alias) {
-          unicode[normalize(item.alias)] = item;
-        }
-      } // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and
-      // flags might now produce different results
-
-    } catch (err) {
-      _didIteratorError = true;
-      _iteratorError = err;
-    } finally {
-      try {
-        if (!_iteratorNormalCompletion && _iterator.return != null) {
-          _iterator.return();
-        }
-      } finally {
-        if (_didIteratorError) {
-          throw _iteratorError;
-        }
-      }
-    }
-
-    XRegExp.cache.flush('patterns');
-  };
-  /**
-   * @ignore
-   *
-   * Return a reference to the internal Unicode definition structure for the given Unicode
-   * Property if the given name is a legal Unicode Property for use in XRegExp `\p` or `\P` regex
-   * constructs.
-   *
-   * @memberOf XRegExp
-   * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive),
-   *   e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode
-   *   Properties and Property Aliases.
-   * @returns {Object} Reference to definition structure when the name matches a Unicode Property.
-   *
-   * @note
-   * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories.
-   *
-   * @note
-   * This method is *not* part of the officially documented API and may change or be removed in
-   * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode
-   * structures set up by XRegExp.
-   */
-
-
-  XRegExp._getUnicodeProperty = function (name) {
-    var slug = normalize(name);
-    return unicode[slug];
-  };
-};
-
-exports.default = _default;
-module.exports = exports["default"];
-},{"@babel/runtime-corejs3/core-js-stable/instance/concat":10,"@babel/runtime-corejs3/core-js-stable/instance/for-each":12,"@babel/runtime-corejs3/core-js-stable/instance/includes":13,"@babel/runtime-corejs3/core-js-stable/object/define-property":20,"@babel/runtime-corejs3/core-js/get-iterator":23,"@babel/runtime-corejs3/helpers/interopRequireDefault":26}],4:[function(require,module,exports){
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _blocks = _interopRequireDefault(require("../../tools/output/blocks"));
-
-/*!
- * XRegExp Unicode Blocks 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2010-present MIT License
- * Unicode data by Mathias Bynens <mathiasbynens.be>
- */
-var _default = function _default(XRegExp) {
-  /**
-   * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g.,
-   * `\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and
-   * underscores are ignored.
-   *
-   * Uses Unicode 12.1.0.
-   *
-   * @requires XRegExp, Unicode Base
-   */
-  if (!XRegExp.addUnicodeData) {
-    throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks');
-  }
-
-  XRegExp.addUnicodeData(_blocks.default);
-};
-
-exports.default = _default;
-module.exports = exports["default"];
-},{"../../tools/output/blocks":171,"@babel/runtime-corejs3/core-js-stable/object/define-property":20,"@babel/runtime-corejs3/helpers/interopRequireDefault":26}],5:[function(require,module,exports){
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _categories = _interopRequireDefault(require("../../tools/output/categories"));
-
-/*!
- * XRegExp Unicode Categories 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2010-present MIT License
- * Unicode data by Mathias Bynens <mathiasbynens.be>
- */
-var _default = function _default(XRegExp) {
-  /**
-   * Adds support for Unicode's general categories. E.g., `\p{Lu}` or `\p{Uppercase Letter}`. See
-   * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token
-   * names are case insensitive, and any spaces, hyphens, and underscores are ignored.
-   *
-   * Uses Unicode 12.1.0.
-   *
-   * @requires XRegExp, Unicode Base
-   */
-  if (!XRegExp.addUnicodeData) {
-    throw new ReferenceError('Unicode Base must be loaded before Unicode Categories');
-  }
-
-  XRegExp.addUnicodeData(_categories.default);
-};
-
-exports.default = _default;
-module.exports = exports["default"];
-},{"../../tools/output/categories":172,"@babel/runtime-corejs3/core-js-stable/object/define-property":20,"@babel/runtime-corejs3/helpers/interopRequireDefault":26}],6:[function(require,module,exports){
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _properties = _interopRequireDefault(require("../../tools/output/properties"));
-
-/*!
- * XRegExp Unicode Properties 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2012-present MIT License
- * Unicode data by Mathias Bynens <mathiasbynens.be>
- */
-var _default = function _default(XRegExp) {
-  /**
-   * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See
-   * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from
-   * UAX #44 <http://unicode.org/reports/tr44/>:
-   *
-   * - Alphabetic
-   *   Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm +
-   *   Lo + Nl + Other_Alphabetic.
-   *
-   * - Default_Ignorable_Code_Point
-   *   For programmatic determination of default ignorable code points. New characters that should
-   *   be ignored in rendering (unless explicitly supported) will be assigned in these ranges,
-   *   permitting programs to correctly handle the default rendering of such characters when not
-   *   otherwise supported.
-   *
-   * - Lowercase
-   *   Characters with the Lowercase property. Generated from: Ll + Other_Lowercase.
-   *
-   * - Noncharacter_Code_Point
-   *   Code points permanently reserved for internal use.
-   *
-   * - Uppercase
-   *   Characters with the Uppercase property. Generated from: Lu + Other_Uppercase.
-   *
-   * - White_Space
-   *   Spaces, separator characters and other control characters which should be treated by
-   *   programming languages as "white space" for the purpose of parsing elements.
-   *
-   * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS
-   * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are
-   * included in XRegExp's Unicode Categories and Unicode Scripts addons.
-   *
-   * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored.
-   *
-   * Uses Unicode 12.1.0.
-   *
-   * @requires XRegExp, Unicode Base
-   */
-  if (!XRegExp.addUnicodeData) {
-    throw new ReferenceError('Unicode Base must be loaded before Unicode Properties');
-  }
-
-  var unicodeData = _properties.default; // Add non-generated data
-
-  unicodeData.push({
-    name: 'Assigned',
-    // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode
-    // Categories addon is required to use this property
-    inverseOf: 'Cn'
-  });
-  XRegExp.addUnicodeData(unicodeData);
-};
-
-exports.default = _default;
-module.exports = exports["default"];
-},{"../../tools/output/properties":173,"@babel/runtime-corejs3/core-js-stable/object/define-property":20,"@babel/runtime-corejs3/helpers/interopRequireDefault":26}],7:[function(require,module,exports){
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _scripts = _interopRequireDefault(require("../../tools/output/scripts"));
-
-/*!
- * XRegExp Unicode Scripts 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2010-present MIT License
- * Unicode data by Mathias Bynens <mathiasbynens.be>
- */
-var _default = function _default(XRegExp) {
-  /**
-   * Adds support for all Unicode scripts. E.g., `\p{Latin}`. Token names are case insensitive,
-   * and any spaces, hyphens, and underscores are ignored.
-   *
-   * Uses Unicode 12.1.0.
-   *
-   * @requires XRegExp, Unicode Base
-   */
-  if (!XRegExp.addUnicodeData) {
-    throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts');
-  }
-
-  XRegExp.addUnicodeData(_scripts.default);
-};
-
-exports.default = _default;
-module.exports = exports["default"];
-},{"../../tools/output/scripts":174,"@babel/runtime-corejs3/core-js-stable/object/define-property":20,"@babel/runtime-corejs3/helpers/interopRequireDefault":26}],8:[function(require,module,exports){
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _xregexp = _interopRequireDefault(require("./xregexp"));
-
-var _build = _interopRequireDefault(require("./addons/build"));
-
-var _matchrecursive = _interopRequireDefault(require("./addons/matchrecursive"));
-
-var _unicodeBase = _interopRequireDefault(require("./addons/unicode-base"));
-
-var _unicodeBlocks = _interopRequireDefault(require("./addons/unicode-blocks"));
-
-var _unicodeCategories = _interopRequireDefault(require("./addons/unicode-categories"));
-
-var _unicodeProperties = _interopRequireDefault(require("./addons/unicode-properties"));
-
-var _unicodeScripts = _interopRequireDefault(require("./addons/unicode-scripts"));
-
-(0, _build.default)(_xregexp.default);
-(0, _matchrecursive.default)(_xregexp.default);
-(0, _unicodeBase.default)(_xregexp.default);
-(0, _unicodeBlocks.default)(_xregexp.default);
-(0, _unicodeCategories.default)(_xregexp.default);
-(0, _unicodeProperties.default)(_xregexp.default);
-(0, _unicodeScripts.default)(_xregexp.default);
-var _default = _xregexp.default;
-exports.default = _default;
-module.exports = exports["default"];
-},{"./addons/build":1,"./addons/matchrecursive":2,"./addons/unicode-base":3,"./addons/unicode-blocks":4,"./addons/unicode-categories":5,"./addons/unicode-properties":6,"./addons/unicode-scripts":7,"./xregexp":9,"@babel/runtime-corejs3/core-js-stable/object/define-property":20,"@babel/runtime-corejs3/helpers/interopRequireDefault":26}],9:[function(require,module,exports){
-"use strict";
-
-var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
-
-var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
-
-_Object$defineProperty(exports, "__esModule", {
-  value: true
-});
-
-exports.default = void 0;
-
-var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
-
-var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));
-
-var _create = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/create"));
-
-var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
-
-var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
-
-var _getIterator2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js/get-iterator"));
-
-var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
-
-var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-int"));
-
-var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
-
-var _sort = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort"));
-
-var _flags = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/flags"));
-
-/*!
- * XRegExp 4.3.0
- * <xregexp.com>
- * Steven Levithan (c) 2007-present MIT License
- */
-
-/**
- * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and
- * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to
- * make your client-side grepping simpler and more powerful, while freeing you from related
- * cross-browser inconsistencies.
- */
-// ==--------------------------==
-// Private stuff
-// ==--------------------------==
-// Property name used for extended regex instance data
-var REGEX_DATA = 'xregexp'; // Optional features that can be installed and uninstalled
-
-var features = {
-  astral: false,
-  namespacing: false
-}; // Native methods to use and restore ('native' is an ES3 reserved keyword)
-
-var nativ = {
-  exec: RegExp.prototype.exec,
-  test: RegExp.prototype.test,
-  match: String.prototype.match,
-  replace: String.prototype.replace,
-  split: String.prototype.split
-}; // Storage for fixed/extended native methods
-
-var fixed = {}; // Storage for regexes cached by `XRegExp.cache`
-
-var regexCache = {}; // Storage for pattern details cached by the `XRegExp` constructor
-
-var patternCache = {}; // Storage for regex syntax tokens added internally or by `XRegExp.addToken`
-
-var tokens = []; // Token scopes
-
-var defaultScope = 'default';
-var classScope = 'class'; // Regexes that match native regex syntax, including octals
-
-var nativeTokens = {
-  // Any native multicharacter token in default scope, or any single character
-  'default': /\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|\(\?(?:[:=!]|<[=!])|[?*+]\?|{\d+(?:,\d*)?}\??|[\s\S]/,
-  // Any native multicharacter token in character class scope, or any single character
-  'class': /\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u(?:[\dA-Fa-f]{4}|{[\dA-Fa-f]+})|c[A-Za-z]|[\s\S])|[\s\S]/
-}; // Any backreference or dollar-prefixed character in replacement strings
-
-var replacementToken = /\$(?:{([\w$]+)}|<([\w$]+)>|(\d\d?|[\s\S]))/g; // Check for correct `exec` handling of nonparticipating capturing groups
-
-var correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined; // Check for ES6 `flags` prop support
-
-var hasFlagsProp = (0, _flags.default)(/x/) !== undefined; // Shortcut to `Object.prototype.toString`
-
-var _ref = {},
-    toString = _ref.toString;
-
-function hasNativeFlag(flag) {
-  // Can't check based on the presence of properties/getters since browsers might support such
-  // properties even when they don't support the corresponding flag in regex construction (tested
-  // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u`
-  // throws an error)
-  var isSupported = true;
-
-  try {
-    // Can't use regex literals for testing even in a `try` because regex literals with
-    // unsupported flags cause a compilation error in IE
-    new RegExp('', flag);
-  } catch (exception) {
-    isSupported = false;
-  }
-
-  return isSupported;
-} // Check for ES6 `u` flag support
-
-
-var hasNativeU = hasNativeFlag('u'); // Check for ES6 `y` flag support
-
-var hasNativeY = hasNativeFlag('y'); // Tracker for known flags, including addon flags
-
-var registeredFlags = {
-  g: true,
-  i: true,
-  m: true,
-  u: hasNativeU,
-  y: hasNativeY
-};
-/**
- * Attaches extended data and `XRegExp.prototype` properties to a regex object.
- *
- * @private
- * @param {RegExp} regex Regex to augment.
- * @param {Array} captureNames Array with capture names, or `null`.
- * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A.
- * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A.
- * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal
- *   operations, and never exposed to users. For internal-only regexes, we can improve perf by
- *   skipping some operations like attaching `XRegExp.prototype` properties.
- * @returns {RegExp} Augmented regex.
- */
-
-function augment(regex, captureNames, xSource, xFlags, isInternalOnly) {
-  var _context;
-
-  regex[REGEX_DATA] = {
-    captureNames: captureNames
-  };
-
-  if (isInternalOnly) {
-    return regex;
-  } // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value
-
-
-  if (regex.__proto__) {
-    regex.__proto__ = XRegExp.prototype;
-  } else {
-    for (var p in XRegExp.prototype) {
-      // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this
-      // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype`
-      // extensions exist on `regex.prototype` anyway
-      regex[p] = XRegExp.prototype[p];
-    }
-  }
-
-  regex[REGEX_DATA].source = xSource; // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order
-
-  regex[REGEX_DATA].flags = xFlags ? (0, _sort.default)(_context = xFlags.split('')).call(_context).join('') : xFlags;
-  return regex;
-}
-/**
- * Removes any duplicate characters from the provided string.
- *
- * @private
- * @param {String} str String to remove duplicate characters from.
- * @returns {String} String with any duplicate characters removed.
- */
-
-
-function clipDuplicates(str) {
-  return nativ.replace.call(str, /([\s\S])(?=[\s\S]*\1)/g, '');
-}
-/**
- * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype`
- * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing
- * flags g and y while copying the regex.
- *
- * @private
- * @param {RegExp} regex Regex to copy.
- * @param {Object} [options] Options object with optional properties:
- *   - `addG` {Boolean} Add flag g while copying the regex.
- *   - `addY` {Boolean} Add flag y while copying the regex.
- *   - `removeG` {Boolean} Remove flag g while copying the regex.
- *   - `removeY` {Boolean} Remove flag y while copying the regex.
- *   - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal
- *     operations, and never exposed to users. For internal-only regexes, we can improve perf by
- *     skipping some operations like attaching `XRegExp.prototype` properties.
- *   - `source` {String} Overrides `<regex>.source`, for special cases.
- * @returns {RegExp} Copy of the provided regex, possibly with modified flags.
- */
-
-
-function copyRegex(regex, options) {
-  var _context2;
-
-  if (!XRegExp.isRegExp(regex)) {
-    throw new TypeError('Type RegExp expected');
-  }
-
-  var xData = regex[REGEX_DATA] || {};
-  var flags = getNativeFlags(regex);
-  var flagsToAdd = '';
-  var flagsToRemove = '';
-  var xregexpSource = null;
-  var xregexpFlags = null;
-  options = options || {};
-
-  if (options.removeG) {
-    flagsToRemove += 'g';
-  }
-
-  if (options.removeY) {
-    flagsToRemove += 'y';
-  }
-
-  if (flagsToRemove) {
-    flags = nativ.replace.call(flags, new RegExp("[".concat(flagsToRemove, "]+"), 'g'), '');
-  }
-
-  if (options.addG) {
-    flagsToAdd += 'g';
-  }
-
-  if (options.addY) {
-    flagsToAdd += 'y';
-  }
-
-  if (flagsToAdd) {
-    flags = clipDuplicates(flags + flagsToAdd);
-  }
-
-  if (!options.isInternalOnly) {
-    if (xData.source !== undefined) {
-      xregexpSource = xData.source;
-    } // null or undefined; don't want to add to `flags` if the previous value was null, since
-    // that indicates we're not tracking original precompilation flags
-
-
-    if ((0, _flags.default)(xData) != null) {
-      // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never
-      // removed for non-internal regexes, so don't need to handle it
-      xregexpFlags = flagsToAdd ? clipDuplicates((0, _flags.default)(xData) + flagsToAdd) : (0, _flags.default)(xData);
-    }
-  } // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid
-  // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and
-  // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the
-  // translation to native regex syntax
-
-
-  regex = augment(new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? (0, _slice.default)(_context2 = xData.captureNames).call(_context2, 0) : null, xregexpSource, xregexpFlags, options.isInternalOnly);
-  return regex;
-}
-/**
- * Converts hexadecimal to decimal.
- *
- * @private
- * @param {String} hex
- * @returns {Number}
- */
-
-
-function dec(hex) {
-  return (0, _parseInt2.default)(hex, 16);
-}
-/**
- * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an
- * inline comment or whitespace with flag x. This is used directly as a token handler function
- * passed to `XRegExp.addToken`.
- *
- * @private
- * @param {String} match Match arg of `XRegExp.addToken` handler
- * @param {String} scope Scope arg of `XRegExp.addToken` handler
- * @param {String} flags Flags arg of `XRegExp.addToken` handler
- * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match.
- */
-
-
-function getContextualTokenSeparator(match, scope, flags) {
-  if ( // No need to separate tokens if at the beginning or end of a group
-  match.input[match.index - 1] === '(' || match.input[match.index + match[0].length] === ')' || // No need to separate tokens if before or after a `|`
-  match.input[match.index - 1] === '|' || match.input[match.index + match[0].length] === '|' || // No need to separate tokens if at the beginning or end of the pattern
-  match.index < 1 || match.index + match[0].length >= match.input.length || // No need to separate tokens if at the beginning of a noncapturing group or lookahead.
-  // The way this is written relies on:
-  // - The search regex matching only 3-char strings.
-  // - Although `substr` gives chars from the end of the string if given a negative index,
-  //   the resulting substring will be too short to match. Ex: `'abcd'.substr(-1, 3) === 'd'`
-  nativ.test.call(/^\(\?[:=!]/, match.input.substr(match.index - 3, 3)) || // Avoid separating tokens when the following token is a quantifier
-  isQuantifierNext(match.input, match.index + match[0].length, flags)) {
-    return '';
-  } // Keep tokens separated. This avoids e.g. inadvertedly changing `\1 1` or `\1(?#)1` to `\11`.
-  // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax
-  // error `(? :` into `(?:`.
-
-
-  return '(?:)';
-}
-/**
- * Returns native `RegExp` flags used by a regex object.
- *
- * @private
- * @param {RegExp} regex Regex to check.
- * @returns {String} Native flags in use.
- */
-
-
-function getNativeFlags(regex) {
-  return hasFlagsProp ? (0, _flags.default)(regex) : // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation
-  // with an empty string) allows this to continue working predictably when
-  // `XRegExp.proptotype.toString` is overridden
-  nativ.exec.call(/\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1];
-}
-/**
- * Determines whether a regex has extended instance data used to track capture names.
- *
- * @private
- * @param {RegExp} regex Regex to check.
- * @returns {Boolean} Whether the regex uses named capture.
- */
-
-
-function hasNamedCapture(regex) {
-  return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames);
-}
-/**
- * Converts decimal to hexadecimal.
- *
- * @private
- * @param {Number|String} dec
- * @returns {String}
- */
-
-
-function hex(dec) {
-  return (0, _parseInt2.default)(dec, 10).toString(16);
-}
-/**
- * Checks whether the next nonignorable token after the specified position is a quantifier.
- *
- * @private
- * @param {String} pattern Pattern to search within.
- * @param {Number} pos Index in `pattern` to search at.
- * @param {String} flags Flags used by the pattern.
- * @returns {Boolean} Whether the next nonignorable token is a quantifier.
- */
-
-
-function isQuantifierNext(pattern, pos, flags) {
-  var inlineCommentPattern = '\\(\\?#[^)]*\\)';
-  var lineCommentPattern = '#[^#\\n]*';
-  var quantifierPattern = '[?*+]|{\\d+(?:,\\d*)?}';
-  return nativ.test.call((0, _includes.default)(flags).call(flags, 'x') ? // Ignore any leading whitespace, line comments, and inline comments
-  /^(?:\s|#[^#\n]*|\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/ : // Ignore any leading inline comments
-  /^(?:\(\?#[^)]*\))*(?:[?*+]|{\d+(?:,\d*)?})/, (0, _slice.default)(pattern).call(pattern, pos));
-}
-/**
- * Determines whether a value is of the specified type, by resolving its internal [[Class]].
- *
- * @private
- * @param {*} value Object to check.
- * @param {String} type Type to check for, in TitleCase.
- * @returns {Boolean} Whether the object matches the type.
- */
-
-
-function isType(value, type) {
-  return toString.call(value) === "[object ".concat(type, "]");
-}
-/**
- * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values.
- *
- * @private
- * @param {String} str
- * @returns {String}
- */
-
-
-function pad4(str) {
-  while (str.length < 4) {
-    str = "0".concat(str);
-  }
-
-  return str;
-}
-/**
- * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads
- * the flag preparation logic from the `XRegExp` constructor.
- *
- * @private
- * @param {String} pattern Regex pattern, possibly with a leading mode modifier.
- * @param {String} flags Any combination of flags.
- * @returns {Object} Object with properties `pattern` and `flags`.
- */
-
-
-function prepareFlags(pattern, flags) {
-  // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags
-  if (clipDuplicates(flags) !== flags) {
-    throw new SyntaxError("Invalid duplicate regex flag ".concat(flags));
-  } // Strip and apply a leading mode modifier with any combination of flags except g or y
-
-
-  pattern = nativ.replace.call(pattern, /^\(\?([\w$]+)\)/, function ($0, $1) {
-    if (nativ.test.call(/[gy]/, $1)) {
-      throw new SyntaxError("Cannot use flag g or y in mode modifier ".concat($0));
-    } // Allow duplicate flags within the mode modifier
-
-
-    flags = clipDuplicates(flags + $1);
-    return '';
-  }); // Throw on unknown native or nonnative flags
-
-  var _iteratorNormalCompletion = true;
-  var _didIteratorError = false;
-  var _iteratorError = undefined;
-
-  try {
-    for (var _iterator = (0, _getIterator2.default)(flags), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
-      var flag = _step.value;
-
-      if (!registeredFlags[flag]) {
-        throw new SyntaxError("Unknown regex flag ".concat(flag));
-      }
-    }
-  } catch (err) {
-    _didIteratorError = true;
-    _iteratorError = err;
-  } finally {
-    try {
-      if (!_iteratorNormalCompletion && _iterator.return != null) {
-        _iterator.return();
-      }
-    } finally {
-      if (_didIteratorError) {
-        throw _iteratorError;
-      }
-    }
-  }
-
-  return {
-    pattern: pattern,
-    flags: flags
-  };
-}
-/**
- * Prepares an options object from the given value.
- *
- * @private
- * @param {String|Object} value Value to convert to an options object.
- * @returns {Object} Options object.
- */
-
-
-function prepareOptions(value) {
-  var options = {};
-
-  if (isType(value, 'String')) {
-    (0, _forEach.default)(XRegExp).call(XRegExp, value, /[^\s,]+/, function (match) {
-      options[match] = true;
-    });
-    return options;
-  }
-
-  return value;
-}
-/**
- * Registers a flag so it doesn't throw an 'unknown flag' error.
- *
- * @private
- * @param {String} flag Single-character flag to register.
- */
-
-
-function registerFlag(flag) {
-  if (!/^[\w$]$/.test(flag)) {
-    throw new Error('Flag must be a single character A-Za-z0-9_$');
-  }
-
-  registeredFlags[flag] = true;
-}
-/**
- * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified
- * position, until a match is found.
- *
- * @private
- * @param {String} pattern Original pattern from which an XRegExp object is being built.
- * @param {String} flags Flags being used to construct the regex.
- * @param {Number} pos Position to search for tokens within `pattern`.
- * @param {Number} scope Regex scope to apply: 'default' or 'class'.
- * @param {Object} context Context object to use for token handler functions.
- * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`.
- */
-
-
-function runTokens(pattern, flags, pos, scope, context) {
-  var i = tokens.length;
-  var leadChar = pattern[pos];
-  var result = null;
-  var match;
-  var t; // Run in reverse insertion order
-
-  while (i--) {
-    t = tokens[i];
-
-    if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope && t.scope !== 'all' || t.flag && !(0, _includes.default)(flags).call(flags, t.flag)) {
-      continue;
-    }
-
-    match = XRegExp.exec(pattern, t.regex, pos, 'sticky');
-
-    if (match) {
-      result = {
-        matchLength: match[0].length,
-        output: t.handler.call(context, match, scope, flags),
-        reparse: t.reparse
-      }; // Finished with token tests
-
-      break;
-    }
-  }
-
-  return result;
-}
-/**
- * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to
- * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if
- * the Unicode Base addon is not available, since flag A is registered by that addon.
- *
- * @private
- * @param {Boolean} on `true` to enable; `false` to disable.
- */
-
-
-function setAstral(on) {
-  features.astral = on;
-}
-/**
- * Adds named capture groups to the `groups` property of match arrays. See here for details:
- * https://github.com/tc39/proposal-regexp-named-groups
- *
- * @private
- * @param {Boolean} on `true` to enable; `false` to disable.
- */
-
-
-function setNamespacing(on) {
-  features.namespacing = on;
-}
-/**
- * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow
- * the ES5 abstract operation `ToObject`.
- *
- * @private
- * @param {*} value Object to check and return.
- * @returns {*} The provided object.
- */
-
-
-function toObject(value) {
-  // null or undefined
-  if (value == null) {
-    throw new TypeError('Cannot convert null or undefined to object');
-  }
-
-  return value;
-} // ==--------------------------==
-// Constructor
-// ==--------------------------==
-
-/**
- * Creates an extended regular expression object for matching text with a pattern. Differs from a
- * native regular expression in that additional syntax and flags are supported. The returned object
- * is in fact a native `RegExp` and works with all native methods.
- *
- * @class XRegExp
- * @constructor
- * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy.
- * @param {String} [flags] Any combination of flags.
- *   Native flags:
- *     - `g` - global
- *     - `i` - ignore case
- *     - `m` - multiline anchors
- *     - `u` - unicode (ES6)
- *     - `y` - sticky (Firefox 3+, ES6)
- *   Additional XRegExp flags:
- *     - `n` - explicit capture
- *     - `s` - dot matches all (aka singleline)
- *     - `x` - free-spacing and line comments (aka extended)
- *     - `A` - astral (requires the Unicode Base addon)
- *   Flags cannot be provided when constructing one `RegExp` from another.
- * @returns {RegExp} Extended regular expression object.
- * @example
- *
- * // With named capture and flag x
- * XRegExp(`(?<year>  [0-9]{4} ) -?  # year
- *          (?<month> [0-9]{2} ) -?  # month
- *          (?<day>   [0-9]{2} )     # day`, 'x');
- *
- * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp)
- * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and
- * // have fresh `lastIndex` properties (set to zero).
- * XRegExp(/regex/);
- */
-
-
-function XRegExp(pattern, flags) {
-  if (XRegExp.isRegExp(pattern)) {
-    if (flags !== undefined) {
-      throw new TypeError('Cannot supply flags when copying a RegExp');
-    }
-
-    return copyRegex(pattern);
-  } // Copy the argument behavior of `RegExp`
-
-
-  pattern = pattern === undefined ? '' : String(pattern);
-  flags = flags === undefined ? '' : String(flags);
-
-  if (XRegExp.isInstalled('astral') && !(0, _includes.default)(flags).call(flags, 'A')) {
-    // This causes an error to be thrown if the Unicode Base addon is not available
-    flags += 'A';
-  }
-
-  if (!patternCache[pattern]) {
-    patternCache[pattern] = {};
-  }
-
-  if (!patternCache[pattern][flags]) {
-    var context = {
-      hasNamedCapture: false,
-      captureNames: []
-    };
-    var scope = defaultScope;
-    var output = '';
-    var pos = 0;
-    var result; // Check for flag-related errors, and strip/apply flags in a leading mode modifier
-
-    var applied = prepareFlags(pattern, flags);
-    var appliedPattern = applied.pattern;
-    var appliedFlags = (0, _flags.default)(applied); // Use XRegExp's tokens to translate the pattern to a native regex pattern.
-    // `appliedPattern.length` may change on each iteration if tokens use `reparse`
-
-    while (pos < appliedPattern.length) {
-      do {
-        // Check for custom tokens at the current position
-        result = runTokens(appliedPattern, appliedFlags, pos, scope, context); // If the matched token used the `reparse` option, splice its output into the
-        // pattern before running tokens again at the same position
-
-        if (result && result.reparse) {
-          appliedPattern = (0, _slice.default)(appliedPattern).call(appliedPattern, 0, pos) + result.output + (0, _slice.default)(appliedPattern).call(appliedPattern, pos + result.matchLength);
-        }
-      } while (result && result.reparse);
-
-      if (result) {
-        output += result.output;
-        pos += result.matchLength || 1;
-      } else {
-        // Get the native token at the current position
-        var _XRegExp$exec = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky'),
-            _XRegExp$exec2 = (0, _slicedToArray2.default)(_XRegExp$exec, 1),
-            token = _XRegExp$exec2[0];
-
-        output += token;
-        pos += token.length;
-
-        if (token === '[' && scope === defaultScope) {
-          scope = classScope;
-        } else if (token === ']' && scope === classScope) {
-          scope = defaultScope;
-        }
-      }
-    }
-
-    patternCache[pattern][flags] = {
-      // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty
-      // groups are sometimes inserted during regex transpilation in order to keep tokens
-      // separated. However, more than one empty group in a row is never needed.
-      pattern: nativ.replace.call(output, /(?:\(\?:\))+/g, '(?:)'),
-      // Strip all but native flags
-      flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''),
-      // `context.captureNames` has an item for each capturing group, even if unnamed
-      captures: context.hasNamedCapture ? context.captureNames : null
-    };
-  }
-
-  var generated = patternCache[pattern][flags];
-  return augment(new RegExp(generated.pattern, (0, _flags.default)(generated)), generated.captures, pattern, flags);
-} // Add `RegExp.prototype` to the prototype chain
-
-
-XRegExp.prototype = /(?:)/; // ==--------------------------==
-// Public properties
-// ==--------------------------==
-
-/**
- * The XRegExp version number as a string containing three dot-separated parts. For example,
- * '2.0.0-beta-3'.
- *
- * @static
- * @memberOf XRegExp
- * @type String
- */
-
-XRegExp.version = '4.3.0'; // ==--------------------------==
-// Public methods
-// ==--------------------------==
-// Intentionally undocumented; used in tests and addons
-
-XRegExp._clipDuplicates = clipDuplicates;
-XRegExp._hasNativeFlag = hasNativeFlag;
-XRegExp._dec = dec;
-XRegExp._hex = hex;
-XRegExp._pad4 = pad4;
-/**
- * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to
- * create XRegExp addons. If more than one token can match the same string, the last added wins.
- *
- * @memberOf XRegExp
- * @param {RegExp} regex Regex object that matches the new token.
- * @param {Function} handler Function that returns a new pattern string (using native regex syntax)
- *   to replace the matched token within all future XRegExp regexes. Has access to persistent
- *   properties of the regex being built, through `this`. Invoked with three arguments:
- *   - The match array, with named backreference properties.
- *   - The regex scope where the match was found: 'default' or 'class'.
- *   - The flags used by the regex, including any flags in a leading mode modifier.
- *   The handler function becomes part of the XRegExp construction process, so be careful not to
- *   construct XRegExps within the function or you will trigger infinite recursion.
- * @param {Object} [options] Options object with optional properties:
- *   - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'.
- *   - `flag` {String} Single-character flag that triggers the token. This also registers the
- *     flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used.
- *   - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are
- *     not required to trigger the token. This registers the flags, to prevent XRegExp from
- *     throwing an 'unknown flag' error when any of the flags are used.
- *   - `reparse` {Boolean} Whether the `handler` function's output should not be treated as
- *     final, and instead be reparseable by other tokens (including the current token). Allows
- *     token chaining or deferring.
- *   - `leadChar` {String} Single character that occurs at the beginning of any successful match
- *     of the token (not always applicable). This doesn't change the behavior of the token unless
- *     you provide an erroneous value. However, providing it can increase the token's performance
- *     since the token can be skipped at any positions where this character doesn't appear.
- * @example
- *
- * // Basic usage: Add \a for the ALERT control code
- * XRegExp.addToken(
- *   /\\a/,
- *   () => '\\x07',
- *   {scope: 'all'}
- * );
- * XRegExp('\\a[\\a-\\n]+').test('\x07\n\x07'); // -> true
- *
- * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers.
- * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of
- * // character classes only)
- * XRegExp.addToken(
- *   /([?*+]|{\d+(?:,\d*)?})(\??)/,
- *   (match) => `${match[1]}${match[2] ? '' : '?'}`,
- *   {flag: 'U'}
- * );
- * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a'
- * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa'
- */
-
-XRegExp.addToken = function (regex, handler, options) {
-  options = options || {};
-  var _options = options,
-      optionalFlags = _options.optionalFlags;
-
-  if (options.flag) {
-    registerFlag(options.flag);
-  }
-
-  if (optionalFlags) {
-    optionalFlags = nativ.split.call(optionalFlags, '');
-    var _iteratorNormalCompletion2 = true;
-    var _didIteratorError2 = false;
-    var _iteratorError2 = undefined;
-
-    try {
-      for (var _iterator2 = (0, _getIterator2.default)(optionalFlags), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
-        var flag = _step2.value;
-        registerFlag(flag);
-      }
-    } catch (err) {
-      _didIteratorError2 = true;
-      _iteratorError2 = err;
-    } finally {
-      try {
-        if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
-          _iterator2.return();
-        }
-      } finally {
-        if (_didIteratorError2) {
-          throw _iteratorError2;
-        }
-      }
-    }
-  } // Add to the private list of syntax tokens
-
-
-  tokens.push({
-    regex: copyRegex(regex, {
-      addG: true,
-      addY: hasNativeY,
-      isInternalOnly: true
-    }),
-    handler: handler,
-    scope: options.scope || defaultScope,
-    flag: options.flag,
-    reparse: options.reparse,
-    leadChar: options.leadChar
-  }); // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags
-  // might now produce different results
-
-  XRegExp.cache.flush('patterns');
-};
-/**
- * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with
- * the same pattern and flag combination, the cached copy of the regex is returned.
- *
- * @memberOf XRegExp
- * @param {String} pattern Regex pattern string.
- * @param {String} [flags] Any combination of XRegExp flags.
- * @returns {RegExp} Cached XRegExp object.
- * @example
- *
- * while (match = XRegExp.cache('.', 'gs').exec(str)) {
- *   // The regex is compiled once only
- * }
- */
-
-
-XRegExp.cache = function (pattern, flags) {
-  if (!regexCache[pattern]) {
-    regexCache[pattern] = {};
-  }
-
-  return regexCache[pattern][flags] || (regexCache[pattern][flags] = XRegExp(pattern, flags));
-}; // Intentionally undocumented; used in tests
-
-
-XRegExp.cache.flush = function (cacheName) {
-  if (cacheName === 'patterns') {
-    // Flush the pattern cache used by the `XRegExp` constructor
-    patternCache = {};
-  } else {
-    // Flush the regex cache populated by `XRegExp.cache`
-    regexCache = {};
-  }
-};
-/**
- * Escapes any regular expression metacharacters, for use when matching literal strings. The result
- * can safely be used at any point within a regex that uses any flags.
- *
- * @memberOf XRegExp
- * @param {String} str String to escape.
- * @returns {String} String with regex metacharacters escaped.
- * @example
- *
- * XRegExp.escape('Escaped? <.>');
- * // -> 'Escaped\?\ <\.>'
- */
-
-
-XRegExp.escape = function (str) {
-  return nativ.replace.call(toObject(str), /[-\[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
-};
-/**
- * Executes a regex search in a specified string. Returns a match array or `null`. If the provided
- * regex uses named capture, named backreference properties are included on the match array.
- * Optional `pos` and `sticky` arguments specify the search start position, and whether the match
- * must start at the specified position only. The `lastIndex` property of the provided regex is not
- * used, but is updated for compatibility. Also fixes browser bugs compared to the native
- * `RegExp.prototype.exec` and can be used reliably cross-browser.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp} regex Regex to search with.
- * @param {Number} [pos=0] Zero-based index at which to start the search.
- * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position
- *   only. The string `'sticky'` is accepted as an alternative to `true`.
- * @returns {Array} Match array with named backreference properties, or `null`.
- * @example
- *
- * // Basic use, with named backreference
- * let match = XRegExp.exec('U+2620', XRegExp('U\\+(?<hex>[0-9A-F]{4})'));
- * match.hex; // -> '2620'
- *
- * // With pos and sticky, in a loop
- * let pos = 2, result = [], match;
- * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\d)>/, pos, 'sticky')) {
- *   result.push(match[1]);
- *   pos = match.index + match[0].length;
- * }
- * // result -> ['2', '3', '4']
- */
-
-
-XRegExp.exec = function (str, regex, pos, sticky) {
-  var cacheKey = 'g';
-  var addY = false;
-  var fakeY = false;
-  var match;
-  addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false);
-
-  if (addY) {
-    cacheKey += 'y';
-  } else if (sticky) {
-    // Simulate sticky matching by appending an empty capture to the original regex. The
-    // resulting regex will succeed no matter what at the current index (set with `lastIndex`),
-    // and will not search the rest of the subject string. We'll know that the original regex
-    // has failed if that last capture is `''` rather than `undefined` (i.e., if that last
-    // capture participated in the match).
-    fakeY = true;
-    cacheKey += 'FakeY';
-  }
-
-  regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.match`/`replace`
-
-  var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {
-    addG: true,
-    addY: addY,
-    source: fakeY ? "".concat(regex.source, "|()") : undefined,
-    removeY: sticky === false,
-    isInternalOnly: true
-  }));
-  pos = pos || 0;
-  r2.lastIndex = pos; // Fixed `exec` required for `lastIndex` fix, named backreferences, etc.
-
-  match = fixed.exec.call(r2, str); // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means
-  // the original regexp failed (see above).
-
-  if (fakeY && match && match.pop() === '') {
-    match = null;
-  }
-
-  if (regex.global) {
-    regex.lastIndex = match ? r2.lastIndex : 0;
-  }
-
-  return match;
-};
-/**
- * Executes a provided function once per regex match. Searches always start at the beginning of the
- * string and continue until the end, regardless of the state of the regex's `global` property and
- * initial `lastIndex`.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp} regex Regex to search with.
- * @param {Function} callback Function to execute for each match. Invoked with four arguments:
- *   - The match array, with named backreference properties.
- *   - The zero-based match index.
- *   - The string being traversed.
- *   - The regex object being used to traverse the string.
- * @example
- *
- * // Extracts every other digit from a string
- * const evens = [];
- * XRegExp.forEach('1a2345', /\d/, (match, i) => {
- *   if (i % 2) evens.push(+match[0]);
- * });
- * // evens -> [2, 4]
- */
-
-
-XRegExp.forEach = function (str, regex, callback) {
-  var pos = 0;
-  var i = -1;
-  var match;
-
-  while (match = XRegExp.exec(str, regex, pos)) {
-    // Because `regex` is provided to `callback`, the function could use the deprecated/
-    // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec`
-    // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop,
-    // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of
-    // regexes, mutating the regex will not have any effect on the iteration or matched strings,
-    // which is a nice side effect that brings extra safety.
-    callback(match, ++i, str, regex);
-    pos = match.index + (match[0].length || 1);
-  }
-};
-/**
- * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with
- * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native
- * regexes are not recompiled using XRegExp syntax.
- *
- * @memberOf XRegExp
- * @param {RegExp} regex Regex to globalize.
- * @returns {RegExp} Copy of the provided regex with flag `g` added.
- * @example
- *
- * const globalCopy = XRegExp.globalize(/regex/);
- * globalCopy.global; // -> true
- */
-
-
-XRegExp.globalize = function (regex) {
-  return copyRegex(regex, {
-    addG: true
-  });
-};
-/**
- * Installs optional features according to the specified options. Can be undone using
- * `XRegExp.uninstall`.
- *
- * @memberOf XRegExp
- * @param {Object|String} options Options object or string.
- * @example
- *
- * // With an options object
- * XRegExp.install({
- *   // Enables support for astral code points in Unicode addons (implicitly sets flag A)
- *   astral: true,
- *
- *   // Adds named capture groups to the `groups` property of matches
- *   namespacing: true
- * });
- *
- * // With an options string
- * XRegExp.install('astral namespacing');
- */
-
-
-XRegExp.install = function (options) {
-  options = prepareOptions(options);
-
-  if (!features.astral && options.astral) {
-    setAstral(true);
-  }
-
-  if (!features.namespacing && options.namespacing) {
-    setNamespacing(true);
-  }
-};
-/**
- * Checks whether an individual optional feature is installed.
- *
- * @memberOf XRegExp
- * @param {String} feature Name of the feature to check. One of:
- *   - `astral`
- *   - `namespacing`
- * @returns {Boolean} Whether the feature is installed.
- * @example
- *
- * XRegExp.isInstalled('astral');
- */
-
-
-XRegExp.isInstalled = function (feature) {
-  return !!features[feature];
-};
-/**
- * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes
- * created in another frame, when `instanceof` and `constructor` checks would fail.
- *
- * @memberOf XRegExp
- * @param {*} value Object to check.
- * @returns {Boolean} Whether the object is a `RegExp` object.
- * @example
- *
- * XRegExp.isRegExp('string'); // -> false
- * XRegExp.isRegExp(/regex/i); // -> true
- * XRegExp.isRegExp(RegExp('^', 'm')); // -> true
- * XRegExp.isRegExp(XRegExp('(?s).')); // -> true
- */
-
-
-XRegExp.isRegExp = function (value) {
-  return toString.call(value) === '[object RegExp]';
-}; // isType(value, 'RegExp');
-
-/**
- * Returns the first matched string, or in global mode, an array containing all matched strings.
- * This is essentially a more convenient re-implementation of `String.prototype.match` that gives
- * the result types you actually want (string instead of `exec`-style array in match-first mode,
- * and an empty array instead of `null` when no matches are found in match-all mode). It also lets
- * you override flag g and ignore `lastIndex`, and fixes browser bugs.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp} regex Regex to search with.
- * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to
- *   return an array of all matched strings. If not explicitly specified and `regex` uses flag g,
- *   `scope` is 'all'.
- * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all
- *   mode: Array of all matched strings, or an empty array.
- * @example
- *
- * // Match first
- * XRegExp.match('abc', /\w/); // -> 'a'
- * XRegExp.match('abc', /\w/g, 'one'); // -> 'a'
- * XRegExp.match('abc', /x/g, 'one'); // -> null
- *
- * // Match all
- * XRegExp.match('abc', /\w/g); // -> ['a', 'b', 'c']
- * XRegExp.match('abc', /\w/, 'all'); // -> ['a', 'b', 'c']
- * XRegExp.match('abc', /x/, 'all'); // -> []
- */
-
-
-XRegExp.match = function (str, regex, scope) {
-  var global = regex.global && scope !== 'one' || scope === 'all';
-  var cacheKey = (global ? 'g' : '') + (regex.sticky ? 'y' : '') || 'noGY';
-  regex[REGEX_DATA] = regex[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`replace`
-
-  var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {
-    addG: !!global,
-    removeG: scope === 'one',
-    isInternalOnly: true
-  }));
-  var result = nativ.match.call(toObject(str), r2);
-
-  if (regex.global) {
-    regex.lastIndex = scope === 'one' && result ? // Can't use `r2.lastIndex` since `r2` is nonglobal in this case
-    result.index + result[0].length : 0;
-  }
-
-  return global ? result || [] : result && result[0];
-};
-/**
- * Retrieves the matches from searching a string using a chain of regexes that successively search
- * within previous matches. The provided `chain` array can contain regexes and or objects with
- * `regex` and `backref` properties. When a backreference is specified, the named or numbered
- * backreference is passed forward to the next regex or returned.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {Array} chain Regexes that each search for matches within preceding results.
- * @returns {Array} Matches by the last regex in the chain, or an empty array.
- * @example
- *
- * // Basic usage; matches numbers within <b> tags
- * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [
- *   XRegExp('(?is)<b>.*?</b>'),
- *   /\d+/
- * ]);
- * // -> ['2', '4', '56']
- *
- * // Passing forward and returning specific backreferences
- * html = '<a href="http://xregexp.com/api/">XRegExp</a>\
- *         <a href="http://www.google.com/">Google</a>';
- * XRegExp.matchChain(html, [
- *   {regex: /<a href="([^"]+)">/i, backref: 1},
- *   {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}
- * ]);
- * // -> ['xregexp.com', 'www.google.com']
- */
-
-
-XRegExp.matchChain = function (str, chain) {
-  return function recurseChain(values, level) {
-    var item = chain[level].regex ? chain[level] : {
-      regex: chain[level]
-    };
-    var matches = [];
-
-    function addMatch(match) {
-      if (item.backref) {
-        var ERR_UNDEFINED_GROUP = "Backreference to undefined group: ".concat(item.backref);
-        var isNamedBackref = isNaN(item.backref);
-
-        if (isNamedBackref && XRegExp.isInstalled('namespacing')) {
-          // `groups` has `null` as prototype, so using `in` instead of `hasOwnProperty`
-          if (!(item.backref in match.groups)) {
-            throw new ReferenceError(ERR_UNDEFINED_GROUP);
-          }
-        } else if (!match.hasOwnProperty(item.backref)) {
-          throw new ReferenceError(ERR_UNDEFINED_GROUP);
-        }
-
-        var backrefValue = isNamedBackref && XRegExp.isInstalled('namespacing') ? match.groups[item.backref] : match[item.backref];
-        matches.push(backrefValue || '');
-      } else {
-        matches.push(match[0]);
-      }
-    }
-
-    var _iteratorNormalCompletion3 = true;
-    var _didIteratorError3 = false;
-    var _iteratorError3 = undefined;
-
-    try {
-      for (var _iterator3 = (0, _getIterator2.default)(values), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
-        var value = _step3.value;
-        (0, _forEach.default)(XRegExp).call(XRegExp, value, item.regex, addMatch);
-      }
-    } catch (err) {
-      _didIteratorError3 = true;
-      _iteratorError3 = err;
-    } finally {
-      try {
-        if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
-          _iterator3.return();
-        }
-      } finally {
-        if (_didIteratorError3) {
-          throw _iteratorError3;
-        }
-      }
-    }
-
-    return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1);
-  }([str], 0);
-};
-/**
- * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string
- * or regex, and the replacement can be a string or a function to be called for each match. To
- * perform a global search and replace, use the optional `scope` argument or include flag g if using
- * a regex. Replacement strings can use `${n}` or `$<n>` for named and numbered backreferences.
- * Replacement functions can use named backreferences via `arguments[0].name`. Also fixes browser
- * bugs compared to the native `String.prototype.replace` and can be used reliably cross-browser.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp|String} search Search pattern to be replaced.
- * @param {String|Function} replacement Replacement string or a function invoked to create it.
- *   Replacement strings can include special replacement syntax:
- *     - $$ - Inserts a literal $ character.
- *     - $&, $0 - Inserts the matched substring.
- *     - $` - Inserts the string that precedes the matched substring (left context).
- *     - $' - Inserts the string that follows the matched substring (right context).
- *     - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts
- *       backreference n/nn.
- *     - ${n}, $<n> - Where n is a name or any number of digits that reference an existent capturing
- *       group, inserts backreference n.
- *   Replacement functions are invoked with three or more arguments:
- *     - The matched substring (corresponds to $& above). Named backreferences are accessible as
- *       properties of this first argument.
- *     - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above).
- *     - The zero-based index of the match within the total search string.
- *     - The total string being searched.
- * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not
- *   explicitly specified and using a regex with flag g, `scope` is 'all'.
- * @returns {String} New string with one or all matches replaced.
- * @example
- *
- * // Regex search, using named backreferences in replacement string
- * const name = XRegExp('(?<first>\\w+) (?<last>\\w+)');
- * XRegExp.replace('John Smith', name, '$<last>, $<first>');
- * // -> 'Smith, John'
- *
- * // Regex search, using named backreferences in replacement function
- * XRegExp.replace('John Smith', name, (match) => `${match.last}, ${match.first}`);
- * // -> 'Smith, John'
- *
- * // String search, with replace-all
- * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all');
- * // -> 'XRegExp builds XRegExps'
- */
-
-
-XRegExp.replace = function (str, search, replacement, scope) {
-  var isRegex = XRegExp.isRegExp(search);
-  var global = search.global && scope !== 'one' || scope === 'all';
-  var cacheKey = (global ? 'g' : '') + (search.sticky ? 'y' : '') || 'noGY';
-  var s2 = search;
-
-  if (isRegex) {
-    search[REGEX_DATA] = search[REGEX_DATA] || {}; // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s
-    // `lastIndex` isn't updated *during* replacement iterations
-
-    s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, {
-      addG: !!global,
-      removeG: scope === 'one',
-      isInternalOnly: true
-    }));
-  } else if (global) {
-    s2 = new RegExp(XRegExp.escape(String(search)), 'g');
-  } // Fixed `replace` required for named backreferences, etc.
-
-
-  var result = fixed.replace.call(toObject(str), s2, replacement);
-
-  if (isRegex && search.global) {
-    // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)
-    search.lastIndex = 0;
-  }
-
-  return result;
-};
-/**
- * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an
- * array of replacement details. Later replacements operate on the output of earlier replacements.
- * Replacement details are accepted as an array with a regex or string to search for, the
- * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp
- * replacement text syntax, which supports named backreference properties via `${name}` or
- * `$<name>`.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {Array} replacements Array of replacement detail arrays.
- * @returns {String} New string with all replacements.
- * @example
- *
- * str = XRegExp.replaceEach(str, [
- *   [XRegExp('(?<name>a)'), 'z${name}'],
- *   [/b/gi, 'y'],
- *   [/c/g, 'x', 'one'], // scope 'one' overrides /g
- *   [/d/, 'w', 'all'],  // scope 'all' overrides lack of /g
- *   ['e', 'v', 'all'],  // scope 'all' allows replace-all for strings
- *   [/f/g, ($0) => $0.toUpperCase()]
- * ]);
- */
-
-
-XRegExp.replaceEach = function (str, replacements) {
-  var _iteratorNormalCompletion4 = true;
-  var _didIteratorError4 = false;
-  var _iteratorError4 = undefined;
-
-  try {
-    for (var _iterator4 = (0, _getIterator2.default)(replacements), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
-      var r = _step4.value;
-      str = XRegExp.replace(str, r[0], r[1], r[2]);
-    }
-  } catch (err) {
-    _didIteratorError4 = true;
-    _iteratorError4 = err;
-  } finally {
-    try {
-      if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
-        _iterator4.return();
-      }
-    } finally {
-      if (_didIteratorError4) {
-        throw _iteratorError4;
-      }
-    }
-  }
-
-  return str;
-};
-/**
- * Splits a string into an array of strings using a regex or string separator. Matches of the
- * separator are not included in the result array. However, if `separator` is a regex that contains
- * capturing groups, backreferences are spliced into the result each time `separator` is matched.
- * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably
- * cross-browser.
- *
- * @memberOf XRegExp
- * @param {String} str String to split.
- * @param {RegExp|String} separator Regex or string to use for separating the string.
- * @param {Number} [limit] Maximum number of items to include in the result array.
- * @returns {Array} Array of substrings.
- * @example
- *
- * // Basic use
- * XRegExp.split('a b c', ' ');
- * // -> ['a', 'b', 'c']
- *
- * // With limit
- * XRegExp.split('a b c', ' ', 2);
- * // -> ['a', 'b']
- *
- * // Backreferences in result array
- * XRegExp.split('..word1..', /([a-z]+)(\d+)/i);
- * // -> ['..', 'word', '1', '..']
- */
-
-
-XRegExp.split = function (str, separator, limit) {
-  return fixed.split.call(toObject(str), separator, limit);
-};
-/**
- * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and
- * `sticky` arguments specify the search start position, and whether the match must start at the
- * specified position only. The `lastIndex` property of the provided regex is not used, but is
- * updated for compatibility. Also fixes browser bugs compared to the native
- * `RegExp.prototype.test` and can be used reliably cross-browser.
- *
- * @memberOf XRegExp
- * @param {String} str String to search.
- * @param {RegExp} regex Regex to search with.
- * @param {Number} [pos=0] Zero-based index at which to start the search.
- * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position
- *   only. The string `'sticky'` is accepted as an alternative to `true`.
- * @returns {Boolean} Whether the regex matched the provided value.
- * @example
- *
- * // Basic use
- * XRegExp.test('abc', /c/); // -> true
- *
- * // With pos and sticky
- * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false
- * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true
- */
-// Do this the easy way :-)
-
-
-XRegExp.test = function (str, regex, pos, sticky) {
-  return !!XRegExp.exec(str, regex, pos, sticky);
-};
-/**
- * Uninstalls optional features according to the specified options. All optional features start out
- * uninstalled, so this is used to undo the actions of `XRegExp.install`.
- *
- * @memberOf XRegExp
- * @param {Object|String} options Options object or string.
- * @example
- *
- * // With an options object
- * XRegExp.uninstall({
- *   // Disables support for astral code points in Unicode addons
- *   astral: true,
- *
- *   // Don't add named capture groups to the `groups` property of matches
- *   namespacing: true
- * });
- *
- * // With an options string
- * XRegExp.uninstall('astral namespacing');
- */
-
-
-XRegExp.uninstall = function (options) {
-  options = prepareOptions(options);
-
-  if (features.astral && options.astral) {
-    setAstral(false);
-  }
-
-  if (features.namespacing && options.namespacing) {
-    setNamespacing(false);
-  }
-};
-/**
- * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as
- * regex objects or strings. Metacharacters are escaped in patterns provided as strings.
- * Backreferences in provided regex objects are automatically renumbered to work correctly within
- * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the
- * `flags` argument.
- *
- * @memberOf XRegExp
- * @param {Array} patterns Regexes and strings to combine.
- * @param {String} [flags] Any combination of XRegExp flags.
- * @param {Object} [options] Options object with optional properties:
- *   - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'.
- * @returns {RegExp} Union of the provided regexes and strings.
- * @example
- *
- * XRegExp.union(['a+b*c', /(dogs)\1/, /(cats)\1/], 'i');
- * // -> /a\+b\*c|(dogs)\1|(cats)\2/i
- *
- * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'});
- * // -> /manbearpig/i
- */
-
-
-XRegExp.union = function (patterns, flags, options) {
-  options = options || {};
-  var conjunction = options.conjunction || 'or';
-  var numCaptures = 0;
-  var numPriorCaptures;
-  var captureNames;
-
-  function rewrite(match, paren, backref) {
-    var name = captureNames[numCaptures - numPriorCaptures]; // Capturing group
-
-    if (paren) {
-      ++numCaptures; // If the current capture has a name, preserve the name
-
-      if (name) {
-        return "(?<".concat(name, ">");
-      } // Backreference
-
-    } else if (backref) {
-      // Rewrite the backreference
-      return "\\".concat(+backref + numPriorCaptures);
-    }
-
-    return match;
-  }
-
-  if (!(isType(patterns, 'Array') && patterns.length)) {
-    throw new TypeError('Must provide a nonempty array of patterns to merge');
-  }
-
-  var parts = /(\()(?!\?)|\\([1-9]\d*)|\\[\s\S]|\[(?:[^\\\]]|\\[\s\S])*\]/g;
-  var output = [];
-  var _iteratorNormalCompletion5 = true;
-  var _didIteratorError5 = false;
-  var _iteratorError5 = undefined;
-
-  try {
-    for (var _iterator5 = (0, _getIterator2.default)(patterns), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
-      var pattern = _step5.value;
-
-      if (XRegExp.isRegExp(pattern)) {
-        numPriorCaptures = numCaptures;
-        captureNames = pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames || []; // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are
-        // independently valid; helps keep this simple. Named captures are put back
-
-        output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite));
-      } else {
-        output.push(XRegExp.escape(pattern));
-      }
-    }
-  } catch (err) {
-    _didIteratorError5 = true;
-    _iteratorError5 = err;
-  } finally {
-    try {
-      if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
-        _iterator5.return();
-      }
-    } finally {
-      if (_didIteratorError5) {
-        throw _iteratorError5;
-      }
-    }
-  }
-
-  var separator = conjunction === 'none' ? '' : '|';
-  return XRegExp(output.join(separator), flags);
-}; // ==--------------------------==
-// Fixed/extended native methods
-// ==--------------------------==
-
-/**
- * Adds named capture support (with backreferences returned as `result.name`), and fixes browser
- * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`.
- *
- * @memberOf RegExp
- * @param {String} str String to search.
- * @returns {Array} Match array with named backreference properties, or `null`.
- */
-
-
-fixed.exec = function (str) {
-  var origLastIndex = this.lastIndex;
-  var match = nativ.exec.apply(this, arguments);
-
-  if (match) {
-    // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing
-    // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9
-    // in standards mode follows the spec.
-    if (!correctExecNpcg && match.length > 1 && (0, _includes.default)(match).call(match, '')) {
-      var _context3;
-
-      var r2 = copyRegex(this, {
-        removeG: true,
-        isInternalOnly: true
-      }); // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed
-      // matching due to characters outside the match
-
-      nativ.replace.call((0, _slice.default)(_context3 = String(str)).call(_context3, match.index), r2, function () {
-        var len = arguments.length; // Skip index 0 and the last 2
-
-        for (var i = 1; i < len - 2; ++i) {
-          if ((i < 0 || arguments.length <= i ? undefined : arguments[i]) === undefined) {
-            match[i] = undefined;
-          }
-        }
-      });
-    } // Attach named capture properties
-
-
-    var groupsObject = match;
-
-    if (XRegExp.isInstalled('namespacing')) {
-      // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec
-      match.groups = (0, _create.default)(null);
-      groupsObject = match.groups;
-    }
-
-    if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) {
-      // Skip index 0
-      for (var i = 1; i < match.length; ++i) {
-        var name = this[REGEX_DATA].captureNames[i - 1];
-
-        if (name) {
-          groupsObject[name] = match[i];
-        }
-      }
-    } // Fix browsers that increment `lastIndex` after zero-length matches
-
-
-    if (this.global && !match[0].length && this.lastIndex > match.index) {
-      this.lastIndex = match.index;
-    }
-  }
-
-  if (!this.global) {
-    // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)
-    this.lastIndex = origLastIndex;
-  }
-
-  return match;
-};
-/**
- * Fixes browser bugs in the native `RegExp.prototype.test`.
- *
- * @memberOf RegExp
- * @param {String} str String to search.
- * @returns {Boolean} Whether the regex matched the provided value.
- */
-
-
-fixed.test = function (str) {
-  // Do this the easy way :-)
-  return !!fixed.exec.call(this, str);
-};
-/**
- * Adds named capture support (with backreferences returned as `result.name`), and fixes browser
- * bugs in the native `String.prototype.match`.
- *
- * @memberOf String
- * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`.
- * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g,
- *   the result of calling `regex.exec(this)`.
- */
-
-
-fixed.match = function (regex) {
-  if (!XRegExp.isRegExp(regex)) {
-    // Use the native `RegExp` rather than `XRegExp`
-    regex = new RegExp(regex);
-  } else if (regex.global) {
-    var result = nativ.match.apply(this, arguments); // Fixes IE bug
-
-    regex.lastIndex = 0;
-    return result;
-  }
-
-  return fixed.exec.call(regex, toObject(this));
-};
-/**
- * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement
- * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also
- * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex
- * search value, and the value of a replacement regex's `lastIndex` property during replacement
- * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third
- * (`flags`) argument. Use via `XRegExp.replace`.
- *
- * @memberOf String
- * @param {RegExp|String} search Search pattern to be replaced.
- * @param {String|Function} replacement Replacement string or a function invoked to create it.
- * @returns {String} New string with one or all matches replaced.
- */
-
-
-fixed.replace = function (search, replacement) {
-  var isRegex = XRegExp.isRegExp(search);
-  var origLastIndex;
-  var captureNames;
-  var result;
-
-  if (isRegex) {
-    if (search[REGEX_DATA]) {
-      captureNames = search[REGEX_DATA].captureNames;
-    } // Only needed if `search` is nonglobal
-
-
-    origLastIndex = search.lastIndex;
-  } else {
-    search += ''; // Type-convert
-  } // Don't use `typeof`; some older browsers return 'function' for regex objects
-
-
-  if (isType(replacement, 'Function')) {
-    // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement
-    // functions isn't type-converted to a string
-    result = nativ.replace.call(String(this), search, function () {
-      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
-        args[_key] = arguments[_key];
-      }
-
-      if (captureNames) {
-        var groupsObject;
-
-        if (XRegExp.isInstalled('namespacing')) {
-          // https://tc39.github.io/proposal-regexp-named-groups/#sec-regexpbuiltinexec
-          groupsObject = (0, _create.default)(null);
-          args.push(groupsObject);
-        } else {
-          // Change the `args[0]` string primitive to a `String` object that can store
-          // properties. This really does need to use `String` as a constructor
-          args[0] = new String(args[0]);
-          groupsObject = args[0];
-        } // Store named backreferences
-
-
-        for (var i = 0; i < captureNames.length; ++i) {
-          if (captureNames[i]) {
-            groupsObject[captureNames[i]] = args[i + 1];
-          }
-        }
-      } // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari
-      // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1)
-
-
-      if (isRegex && search.global) {
-        search.lastIndex = args[args.length - 2] + args[0].length;
-      } // ES6 specs the context for replacement functions as `undefined`
-
-
-      return replacement.apply(void 0, args);
-    });
-  } else {
-    // Ensure that the last value of `args` will be a string when given nonstring `this`,
-    // while still throwing on null or undefined context
-    result = nativ.replace.call(this == null ? this : String(this), search, function () {
-      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
-        args[_key2] = arguments[_key2];
-      }
-
-      return nativ.replace.call(String(replacement), replacementToken, replacer);
-
-      function replacer($0, bracketed, angled, dollarToken) {
-        bracketed = bracketed || angled; // Named or numbered backreference with curly or angled braces
-
-        if (bracketed) {
-          // XRegExp behavior for `${n}` or `$<n>`:
-          // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the
-          //    entire match. Any number of leading zeros may be used.
-          // 2. Backreference to named capture `n`, if it exists and is not an integer
-          //    overridden by numbered capture. In practice, this does not overlap with
-          //    numbered capture since XRegExp does not allow named capture to use a bare
-          //    integer as the name.
-          // 3. If the name or number does not refer to an existing capturing group, it's
-          //    an error.
-          var n = +bracketed; // Type-convert; drop leading zeros
-
-          if (n <= args.length - 3) {
-            return args[n] || '';
-          } // Groups with the same name is an error, else would need `lastIndexOf`
-
-
-          n = captureNames ? (0, _indexOf.default)(captureNames).call(captureNames, bracketed) : -1;
-
-          if (n < 0) {
-            throw new SyntaxError("Backreference to undefined group ".concat($0));
-          }
-
-          return args[n + 1] || '';
-        } // Else, special variable or numbered backreference without curly braces
-
-
-        if (dollarToken === '$') {
-          // $$
-          return '$';
-        }
-
-        if (dollarToken === '&' || +dollarToken === 0) {
-          // $&, $0 (not followed by 1-9), $00
-          return args[0];
-        }
-
-        if (dollarToken === '`') {
-          var _context4;
-
-          // $` (left context)
-          return (0, _slice.default)(_context4 = args[args.length - 1]).call(_context4, 0, args[args.length - 2]);
-        }
-
-        if (dollarToken === "'") {
-          var _context5;
-
-          // $' (right context)
-          return (0, _slice.default)(_context5 = args[args.length - 1]).call(_context5, args[args.length - 2] + args[0].length);
-        } // Else, numbered backreference without braces
-
-
-        dollarToken = +dollarToken; // Type-convert; drop leading zero
-        // XRegExp behavior for `$n` and `$nn`:
-        // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits.
-        // - `$1` is an error if no capturing groups.
-        // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0`
-        //   instead.
-        // - `$01` is `$1` if at least one capturing group, else it's an error.
-        // - `$0` (not followed by 1-9) and `$00` are the entire match.
-        // Native behavior, for comparison:
-        // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+.
-        // - `$1` is a literal `$1` if no capturing groups.
-        // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups.
-        // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`.
-        // - `$0` is a literal `$0`.
-
-        if (!isNaN(dollarToken)) {
-          if (dollarToken > args.length - 3) {
-            throw new SyntaxError("Backreference to undefined group ".concat($0));
-          }
-
-          return args[dollarToken] || '';
-        } // `$` followed by an unsupported char is an error, unlike native JS
-
-
-        throw new SyntaxError("Invalid token ".concat($0));
-      }
-    });
-  }
-
-  if (isRegex) {
-    if (search.global) {
-      // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)
-      search.lastIndex = 0;
-    } else {
-      // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)
-      search.lastIndex = origLastIndex;
-    }
-  }
-
-  return result;
-};
-/**
- * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`.
- *
- * @memberOf String
- * @param {RegExp|String} separator Regex or string to use for separating the string.
- * @param {Number} [limit] Maximum number of items to include in the result array.
- * @returns {Array} Array of substrings.
- */
-
-
-fixed.split = function (separator, limit) {
-  if (!XRegExp.isRegExp(separator)) {
-    // Browsers handle nonregex split correctly, so use the faster native method
-    return nativ.split.apply(this, arguments);
-  }
-
-  var str = String(this);
-  var output = [];
-  var origLastIndex = separator.lastIndex;
-  var lastLastIndex = 0;
-  var lastLength; // Values for `limit`, per the spec:
-  // If undefined: pow(2,32) - 1
-  // If 0, Infinity, or NaN: 0
-  // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32);
-  // If negative number: pow(2,32) - floor(abs(limit))
-  // If other: Type-convert, then use the above rules
-  // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless
-  // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+
-
-  limit = (limit === undefined ? -1 : limit) >>> 0;
-  (0, _forEach.default)(XRegExp).call(XRegExp, str, separator, function (match) {
-    // This condition is not the same as `if (match[0].length)`
-    if (match.index + match[0].length > lastLastIndex) {
-      output.push((0, _slice.default)(str).call(str, lastLastIndex, match.index));
-
-      if (match.length > 1 && match.index < str.length) {
-        Array.prototype.push.apply(output, (0, _slice.default)(match).call(match, 1));
-      }
-
-      lastLength = match[0].length;
-      lastLastIndex = match.index + lastLength;
-    }
-  });
-
-  if (lastLastIndex === str.length) {
-    if (!nativ.test.call(separator, '') || lastLength) {
-      output.push('');
-    }
-  } else {
-    output.push((0, _slice.default)(str).call(str, lastLastIndex));
-  }
-
-  separator.lastIndex = origLastIndex;
-  return output.length > limit ? (0, _slice.default)(output).call(output, 0, limit) : output;
-}; // ==--------------------------==
-// Built-in syntax/flag tokens
-// ==--------------------------==
-
-/*
- * Letter escapes that natively match literal characters: `\a`, `\A`, etc. These should be
- * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser
- * consistency and to reserve their syntax, but lets them be superseded by addons.
- */
-
-
-XRegExp.addToken(/\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\dA-Fa-f]{4}|{[\dA-Fa-f]+})|x(?![\dA-Fa-f]{2}))/, function (match, scope) {
-  // \B is allowed in default scope only
-  if (match[1] === 'B' && scope === defaultScope) {
-    return match[0];
-  }
-
-  throw new SyntaxError("Invalid escape ".concat(match[0]));
-}, {
-  scope: 'all',
-  leadChar: '\\'
-});
-/*
- * Unicode code point escape with curly braces: `\u{N..}`. `N..` is any one or more digit
- * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag
- * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to
- * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior
- * if you follow a `\u{N..}` token that references a code point above U+FFFF with a quantifier, or
- * if you use the same in a character class.
- */
-
-XRegExp.addToken(/\\u{([\dA-Fa-f]+)}/, function (match, scope, flags) {
-  var code = dec(match[1]);
-
-  if (code > 0x10FFFF) {
-    throw new SyntaxError("Invalid Unicode code point ".concat(match[0]));
-  }
-
-  if (code <= 0xFFFF) {
-    // Converting to \uNNNN avoids needing to escape the literal character and keep it
-    // separate from preceding tokens
-    return "\\u".concat(pad4(hex(code)));
-  } // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling
-
-
-  if (hasNativeU && (0, _includes.default)(flags).call(flags, 'u')) {
-    return match[0];
-  }
-
-  throw new SyntaxError('Cannot use Unicode code point above \\u{FFFF} without flag u');
-}, {
-  scope: 'all',
-  leadChar: '\\'
-});
-/*
- * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency.
- * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because
- * character class endings can't be determined.
- */
-
-XRegExp.addToken(/\[(\^?)\]/, // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S].
-// (?!) should work like \b\B, but is unreliable in some versions of Firefox
-
-/* eslint-disable no-confusing-arrow */
-function (match) {
-  return match[1] ? '[\\s\\S]' : '\\b\\B';
-},
-/* eslint-enable no-confusing-arrow */
-{
-  leadChar: '['
-});
-/*
- * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in
- * free-spacing mode (flag x).
- */
-
-XRegExp.addToken(/\(\?#[^)]*\)/, getContextualTokenSeparator, {
-  leadChar: '('
-});
-/*
- * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only.
- */
-
-XRegExp.addToken(/\s+|#[^\n]*\n?/, getContextualTokenSeparator, {
-  flag: 'x'
-});
-/*
- * Dot, in dotall mode (aka singleline mode, flag s) only.
- */
-
-XRegExp.addToken(/\./, function () {
-  return '[\\s\\S]';
-}, {
-  flag: 's',
-  leadChar: '.'
-});
-/*
- * Named backreference: `\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _,
- * and $ only. Also allows numbered backreferences as `\k<n>`.
- */
-
-XRegExp.addToken(/\\k<([\w$]+)>/, function (match) {
-  var _context6, _context7;
-
-  // Groups with the same name is an error, else would need `lastIndexOf`
-  var index = isNaN(match[1]) ? (0, _indexOf.default)(_context6 = this.captureNames).call(_context6, match[1]) + 1 : +match[1];
-  var endIndex = match.index + match[0].length;
-
-  if (!index || index > this.captureNames.length) {
-    throw new SyntaxError("Backreference to undefined group ".concat(match[0]));
-  } // Keep backreferences separate from subsequent literal numbers. This avoids e.g.
-  // inadvertedly changing `(?<n>)\k<n>1` to `()\11`.
-
-
-  return (0, _concat.default)(_context7 = "\\".concat(index)).call(_context7, endIndex === match.input.length || isNaN(match.input[endIndex]) ? '' : '(?:)');
-}, {
-  leadChar: '\\'
-});
-/*
- * Numbered backreference or octal, plus any following digits: `\0`, `\11`, etc. Octals except `\0`
- * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches
- * are returned unaltered. IE < 9 doesn't support backreferences above `\99` in regex syntax.
- */
-
-XRegExp.addToken(/\\(\d+)/, function (match, scope) {
-  if (!(scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== '0') {
-    throw new SyntaxError("Cannot use octal escape or backreference to undefined group ".concat(match[0]));
-  }
-
-  return match[0];
-}, {
-  scope: 'all',
-  leadChar: '\\'
-});
-/*
- * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the
- * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style
- * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively
- * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to
- * Python-style named capture as octals.
- */
-
-XRegExp.addToken(/\(\?P?<([\w$]+)>/, function (match) {
-  var _context8;
-
-  // Disallow bare integers as names because named backreferences are added to match arrays
-  // and therefore numeric properties may lead to incorrect lookups
-  if (!isNaN(match[1])) {
-    throw new SyntaxError("Cannot use integer as capture name ".concat(match[0]));
-  }
-
-  if (!XRegExp.isInstalled('namespacing') && (match[1] === 'length' || match[1] === '__proto__')) {
-    throw new SyntaxError("Cannot use reserved word as capture name ".concat(match[0]));
-  }
-
-  if ((0, _includes.default)(_context8 = this.captureNames).call(_context8, match[1])) {
-    throw new SyntaxError("Cannot use same name for multiple groups ".concat(match[0]));
-  }
-
-  this.captureNames.push(match[1]);
-  this.hasNamedCapture = true;
-  return '(';
-}, {
-  leadChar: '('
-});
-/*
- * Capturing group; match the opening parenthesis only. Required for support of named capturing
- * groups. Also adds explicit capture mode (flag n).
- */
-
-XRegExp.addToken(/\((?!\?)/, function (match, scope, flags) {
-  if ((0, _includes.default)(flags).call(flags, 'n')) {
-    return '(?:';
-  }
-
-  this.captureNames.push(null);
-  return '(';
-}, {
-  optionalFlags: 'n',
-  leadChar: '('
-});
-var _default = XRegExp;
-exports.default = _default;
-module.exports = exports["default"];
-},{"@babel/runtime-corejs3/core-js-stable/instance/concat":10,"@babel/runtime-corejs3/core-js-stable/instance/flags":11,"@babel/runtime-corejs3/core-js-stable/instance/for-each":12,"@babel/runtime-corejs3/core-js-stable/instance/includes":13,"@babel/runtime-corejs3/core-js-stable/instance/index-of":14,"@babel/runtime-corejs3/core-js-stable/instance/slice":17,"@babel/runtime-corejs3/core-js-stable/instance/sort":18,"@babel/runtime-corejs3/core-js-stable/object/create":19,"@babel/runtime-corejs3/core-js-stable/object/define-property":20,"@babel/runtime-corejs3/core-js-stable/parse-int":21,"@babel/runtime-corejs3/core-js/get-iterator":23,"@babel/runtime-corejs3/helpers/interopRequireDefault":26,"@babel/runtime-corejs3/helpers/slicedToArray":29}],10:[function(require,module,exports){
-module.exports = require("core-js-pure/stable/instance/concat");
-},{"core-js-pure/stable/instance/concat":159}],11:[function(require,module,exports){
-module.exports = require("core-js-pure/stable/instance/flags");
-},{"core-js-pure/stable/instance/flags":160}],12:[function(require,module,exports){
-module.exports = require("core-js-pure/stable/instance/for-each");
-},{"core-js-pure/stable/instance/for-each":161}],13:[function(require,module,exports){
-module.exports = require("core-js-pure/stable/instance/includes");
-},{"core-js-pure/stable/instance/includes":162}],14:[function(require,module,exports){
-module.exports = require("core-js-pure/stable/instance/index-of");
-},{"core-js-pure/stable/instance/index-of":163}],15:[function(require,module,exports){
-module.exports = require("core-js-pure/stable/instance/map");
-},{"core-js-pure/stable/instance/map":164}],16:[function(require,module,exports){
-module.exports = require("core-js-pure/stable/instance/reduce");
-},{"core-js-pure/stable/instance/reduce":165}],17:[function(require,module,exports){
-module.exports = require("core-js-pure/stable/instance/slice");
-},{"core-js-pure/stable/instance/slice":166}],18:[function(require,module,exports){
-module.exports = require("core-js-pure/stable/instance/sort");
-},{"core-js-pure/stable/instance/sort":167}],19:[function(require,module,exports){
-module.exports = require("core-js-pure/stable/object/create");
-},{"core-js-pure/stable/object/create":168}],20:[function(require,module,exports){
-module.exports = require("core-js-pure/stable/object/define-property");
-},{"core-js-pure/stable/object/define-property":169}],21:[function(require,module,exports){
-module.exports = require("core-js-pure/stable/parse-int");
-},{"core-js-pure/stable/parse-int":170}],22:[function(require,module,exports){
-module.exports = require("core-js-pure/features/array/is-array");
-},{"core-js-pure/features/array/is-array":52}],23:[function(require,module,exports){
-module.exports = require("core-js-pure/features/get-iterator");
-},{"core-js-pure/features/get-iterator":53}],24:[function(require,module,exports){
-module.exports = require("core-js-pure/features/is-iterable");
-},{"core-js-pure/features/is-iterable":54}],25:[function(require,module,exports){
-var _Array$isArray = require("../core-js/array/is-array");
-
-function _arrayWithHoles(arr) {
-  if (_Array$isArray(arr)) return arr;
-}
-
-module.exports = _arrayWithHoles;
-},{"../core-js/array/is-array":22}],26:[function(require,module,exports){
-function _interopRequireDefault(obj) {
-  return obj && obj.__esModule ? obj : {
-    "default": obj
-  };
-}
-
-module.exports = _interopRequireDefault;
-},{}],27:[function(require,module,exports){
-var _getIterator = require("../core-js/get-iterator");
-
-var _isIterable = require("../core-js/is-iterable");
-
-function _iterableToArrayLimit(arr, i) {
-  if (!(_isIterable(Object(arr)) || Object.prototype.toString.call(arr) === "[object Arguments]")) {
-    return;
-  }
-
-  var _arr = [];
-  var _n = true;
-  var _d = false;
-  var _e = undefined;
-
-  try {
-    for (var _i = _getIterator(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {
-      _arr.push(_s.value);
-
-      if (i && _arr.length === i) break;
-    }
-  } catch (err) {
-    _d = true;
-    _e = err;
-  } finally {
-    try {
-      if (!_n && _i["return"] != null) _i["return"]();
-    } finally {
-      if (_d) throw _e;
-    }
-  }
-
-  return _arr;
-}
-
-module.exports = _iterableToArrayLimit;
-},{"../core-js/get-iterator":23,"../core-js/is-iterable":24}],28:[function(require,module,exports){
-function _nonIterableRest() {
-  throw new TypeError("Invalid attempt to destructure non-iterable instance");
-}
-
-module.exports = _nonIterableRest;
-},{}],29:[function(require,module,exports){
-var arrayWithHoles = require("./arrayWithHoles");
-
-var iterableToArrayLimit = require("./iterableToArrayLimit");
-
-var nonIterableRest = require("./nonIterableRest");
-
-function _slicedToArray(arr, i) {
-  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();
-}
-
-module.exports = _slicedToArray;
-},{"./arrayWithHoles":25,"./iterableToArrayLimit":27,"./nonIterableRest":28}],30:[function(require,module,exports){
-require('../../modules/es.array.is-array');
-var path = require('../../internals/path');
-
-module.exports = path.Array.isArray;
-
-},{"../../internals/path":119,"../../modules/es.array.is-array":145}],31:[function(require,module,exports){
-require('../../../modules/es.array.concat');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').concat;
-
-},{"../../../internals/entry-virtual":81,"../../../modules/es.array.concat":141}],32:[function(require,module,exports){
-require('../../../modules/es.array.for-each');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').forEach;
-
-},{"../../../internals/entry-virtual":81,"../../../modules/es.array.for-each":142}],33:[function(require,module,exports){
-require('../../../modules/es.array.includes');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').includes;
-
-},{"../../../internals/entry-virtual":81,"../../../modules/es.array.includes":143}],34:[function(require,module,exports){
-require('../../../modules/es.array.index-of');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').indexOf;
-
-},{"../../../internals/entry-virtual":81,"../../../modules/es.array.index-of":144}],35:[function(require,module,exports){
-require('../../../modules/es.array.map');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').map;
-
-},{"../../../internals/entry-virtual":81,"../../../modules/es.array.map":147}],36:[function(require,module,exports){
-require('../../../modules/es.array.reduce');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').reduce;
-
-},{"../../../internals/entry-virtual":81,"../../../modules/es.array.reduce":148}],37:[function(require,module,exports){
-require('../../../modules/es.array.slice');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').slice;
-
-},{"../../../internals/entry-virtual":81,"../../../modules/es.array.slice":149}],38:[function(require,module,exports){
-require('../../../modules/es.array.sort');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('Array').sort;
-
-},{"../../../internals/entry-virtual":81,"../../../modules/es.array.sort":150}],39:[function(require,module,exports){
-var concat = require('../array/virtual/concat');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.concat;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.concat) ? concat : own;
-};
-
-},{"../array/virtual/concat":31}],40:[function(require,module,exports){
-var flags = require('../regexp/flags');
-
-var RegExpPrototype = RegExp.prototype;
-
-module.exports = function (it) {
-  return (it === RegExpPrototype || it instanceof RegExp) && !('flags' in it) ? flags(it) : it.flags;
-};
-
-},{"../regexp/flags":50}],41:[function(require,module,exports){
-var arrayIncludes = require('../array/virtual/includes');
-var stringIncludes = require('../string/virtual/includes');
-
-var ArrayPrototype = Array.prototype;
-var StringPrototype = String.prototype;
-
-module.exports = function (it) {
-  var own = it.includes;
-  if (it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.includes)) return arrayIncludes;
-  if (typeof it === 'string' || it === StringPrototype || (it instanceof String && own === StringPrototype.includes)) {
-    return stringIncludes;
-  } return own;
-};
-
-},{"../array/virtual/includes":33,"../string/virtual/includes":51}],42:[function(require,module,exports){
-var indexOf = require('../array/virtual/index-of');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.indexOf;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.indexOf) ? indexOf : own;
-};
-
-},{"../array/virtual/index-of":34}],43:[function(require,module,exports){
-var map = require('../array/virtual/map');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.map;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.map) ? map : own;
-};
-
-},{"../array/virtual/map":35}],44:[function(require,module,exports){
-var reduce = require('../array/virtual/reduce');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.reduce;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.reduce) ? reduce : own;
-};
-
-},{"../array/virtual/reduce":36}],45:[function(require,module,exports){
-var slice = require('../array/virtual/slice');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.slice;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.slice) ? slice : own;
-};
-
-},{"../array/virtual/slice":37}],46:[function(require,module,exports){
-var sort = require('../array/virtual/sort');
-
-var ArrayPrototype = Array.prototype;
-
-module.exports = function (it) {
-  var own = it.sort;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.sort) ? sort : own;
-};
-
-},{"../array/virtual/sort":38}],47:[function(require,module,exports){
-require('../../modules/es.object.create');
-var path = require('../../internals/path');
-
-var Object = path.Object;
-
-module.exports = function create(P, D) {
-  return Object.create(P, D);
-};
-
-},{"../../internals/path":119,"../../modules/es.object.create":151}],48:[function(require,module,exports){
-require('../../modules/es.object.define-property');
-var path = require('../../internals/path');
-
-var Object = path.Object;
-
-var defineProperty = module.exports = function defineProperty(it, key, desc) {
-  return Object.defineProperty(it, key, desc);
-};
-
-if (Object.defineProperty.sham) defineProperty.sham = true;
-
-},{"../../internals/path":119,"../../modules/es.object.define-property":152}],49:[function(require,module,exports){
-require('../modules/es.parse-int');
-var path = require('../internals/path');
-
-module.exports = path.parseInt;
-
-},{"../internals/path":119,"../modules/es.parse-int":153}],50:[function(require,module,exports){
-require('../../modules/es.regexp.flags');
-var flags = require('../../internals/regexp-flags');
-
-module.exports = function (it) {
-  return flags.call(it);
-};
-
-},{"../../internals/regexp-flags":121,"../../modules/es.regexp.flags":154}],51:[function(require,module,exports){
-require('../../../modules/es.string.includes');
-var entryVirtual = require('../../../internals/entry-virtual');
-
-module.exports = entryVirtual('String').includes;
-
-},{"../../../internals/entry-virtual":81,"../../../modules/es.string.includes":155}],52:[function(require,module,exports){
-var parent = require('../../es/array/is-array');
-
-module.exports = parent;
-
-},{"../../es/array/is-array":30}],53:[function(require,module,exports){
-require('../modules/web.dom-collections.iterator');
-require('../modules/es.string.iterator');
-var getIterator = require('../internals/get-iterator');
-
-module.exports = getIterator;
-
-},{"../internals/get-iterator":88,"../modules/es.string.iterator":156,"../modules/web.dom-collections.iterator":157}],54:[function(require,module,exports){
-require('../modules/web.dom-collections.iterator');
-require('../modules/es.string.iterator');
-var isIterable = require('../internals/is-iterable');
-
-module.exports = isIterable;
-
-},{"../internals/is-iterable":99,"../modules/es.string.iterator":156,"../modules/web.dom-collections.iterator":157}],55:[function(require,module,exports){
-module.exports = function (it) {
-  if (typeof it != 'function') {
-    throw TypeError(String(it) + ' is not a function');
-  } return it;
-};
-
-},{}],56:[function(require,module,exports){
-var isObject = require('../internals/is-object');
-
-module.exports = function (it) {
-  if (!isObject(it) && it !== null) {
-    throw TypeError("Can't set " + String(it) + ' as a prototype');
-  } return it;
-};
-
-},{"../internals/is-object":100}],57:[function(require,module,exports){
-module.exports = function () { /* empty */ };
-
-},{}],58:[function(require,module,exports){
-var isObject = require('../internals/is-object');
-
-module.exports = function (it) {
-  if (!isObject(it)) {
-    throw TypeError(String(it) + ' is not an object');
-  } return it;
-};
-
-},{"../internals/is-object":100}],59:[function(require,module,exports){
-'use strict';
-var $forEach = require('../internals/array-iteration').forEach;
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var STRICT_METHOD = arrayMethodIsStrict('forEach');
-var USES_TO_LENGTH = arrayMethodUsesToLength('forEach');
-
-// `Array.prototype.forEach` method implementation
-// https://tc39.github.io/ecma262/#sec-array.prototype.foreach
-module.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {
-  return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
-} : [].forEach;
-
-},{"../internals/array-iteration":61,"../internals/array-method-is-strict":63,"../internals/array-method-uses-to-length":64}],60:[function(require,module,exports){
-var toIndexedObject = require('../internals/to-indexed-object');
-var toLength = require('../internals/to-length');
-var toAbsoluteIndex = require('../internals/to-absolute-index');
-
-// `Array.prototype.{ indexOf, includes }` methods implementation
-var createMethod = function (IS_INCLUDES) {
-  return function ($this, el, fromIndex) {
-    var O = toIndexedObject($this);
-    var length = toLength(O.length);
-    var index = toAbsoluteIndex(fromIndex, length);
-    var value;
-    // Array#includes uses SameValueZero equality algorithm
-    // eslint-disable-next-line no-self-compare
-    if (IS_INCLUDES && el != el) while (length > index) {
-      value = O[index++];
-      // eslint-disable-next-line no-self-compare
-      if (value != value) return true;
-    // Array#indexOf ignores holes, Array#includes - not
-    } else for (;length > index; index++) {
-      if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;
-    } return !IS_INCLUDES && -1;
-  };
-};
-
-module.exports = {
-  // `Array.prototype.includes` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.includes
-  includes: createMethod(true),
-  // `Array.prototype.indexOf` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.indexof
-  indexOf: createMethod(false)
-};
-
-},{"../internals/to-absolute-index":130,"../internals/to-indexed-object":131,"../internals/to-length":133}],61:[function(require,module,exports){
-var bind = require('../internals/function-bind-context');
-var IndexedObject = require('../internals/indexed-object');
-var toObject = require('../internals/to-object');
-var toLength = require('../internals/to-length');
-var arraySpeciesCreate = require('../internals/array-species-create');
-
-var push = [].push;
-
-// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation
-var createMethod = function (TYPE) {
-  var IS_MAP = TYPE == 1;
-  var IS_FILTER = TYPE == 2;
-  var IS_SOME = TYPE == 3;
-  var IS_EVERY = TYPE == 4;
-  var IS_FIND_INDEX = TYPE == 6;
-  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
-  return function ($this, callbackfn, that, specificCreate) {
-    var O = toObject($this);
-    var self = IndexedObject(O);
-    var boundFunction = bind(callbackfn, that, 3);
-    var length = toLength(self.length);
-    var index = 0;
-    var create = specificCreate || arraySpeciesCreate;
-    var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
-    var value, result;
-    for (;length > index; index++) if (NO_HOLES || index in self) {
-      value = self[index];
-      result = boundFunction(value, index, O);
-      if (TYPE) {
-        if (IS_MAP) target[index] = result; // map
-        else if (result) switch (TYPE) {
-          case 3: return true;              // some
-          case 5: return value;             // find
-          case 6: return index;             // findIndex
-          case 2: push.call(target, value); // filter
-        } else if (IS_EVERY) return false;  // every
-      }
-    }
-    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;
-  };
-};
-
-module.exports = {
-  // `Array.prototype.forEach` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.foreach
-  forEach: createMethod(0),
-  // `Array.prototype.map` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.map
-  map: createMethod(1),
-  // `Array.prototype.filter` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.filter
-  filter: createMethod(2),
-  // `Array.prototype.some` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.some
-  some: createMethod(3),
-  // `Array.prototype.every` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.every
-  every: createMethod(4),
-  // `Array.prototype.find` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.find
-  find: createMethod(5),
-  // `Array.prototype.findIndex` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex
-  findIndex: createMethod(6)
-};
-
-},{"../internals/array-species-create":66,"../internals/function-bind-context":85,"../internals/indexed-object":94,"../internals/to-length":133,"../internals/to-object":134}],62:[function(require,module,exports){
-var fails = require('../internals/fails');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var V8_VERSION = require('../internals/engine-v8-version');
-
-var SPECIES = wellKnownSymbol('species');
-
-module.exports = function (METHOD_NAME) {
-  // We can't use this feature detection in V8 since it causes
-  // deoptimization and serious performance degradation
-  // https://github.com/zloirock/core-js/issues/677
-  return V8_VERSION >= 51 || !fails(function () {
-    var array = [];
-    var constructor = array.constructor = {};
-    constructor[SPECIES] = function () {
-      return { foo: 1 };
-    };
-    return array[METHOD_NAME](Boolean).foo !== 1;
-  });
-};
-
-},{"../internals/engine-v8-version":80,"../internals/fails":84,"../internals/well-known-symbol":139}],63:[function(require,module,exports){
-'use strict';
-var fails = require('../internals/fails');
-
-module.exports = function (METHOD_NAME, argument) {
-  var method = [][METHOD_NAME];
-  return !!method && fails(function () {
-    // eslint-disable-next-line no-useless-call,no-throw-literal
-    method.call(null, argument || function () { throw 1; }, 1);
-  });
-};
-
-},{"../internals/fails":84}],64:[function(require,module,exports){
-var DESCRIPTORS = require('../internals/descriptors');
-var fails = require('../internals/fails');
-var has = require('../internals/has');
-
-var defineProperty = Object.defineProperty;
-var cache = {};
-
-var thrower = function (it) { throw it; };
-
-module.exports = function (METHOD_NAME, options) {
-  if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];
-  if (!options) options = {};
-  var method = [][METHOD_NAME];
-  var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;
-  var argument0 = has(options, 0) ? options[0] : thrower;
-  var argument1 = has(options, 1) ? options[1] : undefined;
-
-  return cache[METHOD_NAME] = !!method && !fails(function () {
-    if (ACCESSORS && !DESCRIPTORS) return true;
-    var O = { length: -1 };
-
-    if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });
-    else O[1] = 1;
-
-    method.call(O, argument0, argument1);
-  });
-};
-
-},{"../internals/descriptors":76,"../internals/fails":84,"../internals/has":90}],65:[function(require,module,exports){
-var aFunction = require('../internals/a-function');
-var toObject = require('../internals/to-object');
-var IndexedObject = require('../internals/indexed-object');
-var toLength = require('../internals/to-length');
-
-// `Array.prototype.{ reduce, reduceRight }` methods implementation
-var createMethod = function (IS_RIGHT) {
-  return function (that, callbackfn, argumentsLength, memo) {
-    aFunction(callbackfn);
-    var O = toObject(that);
-    var self = IndexedObject(O);
-    var length = toLength(O.length);
-    var index = IS_RIGHT ? length - 1 : 0;
-    var i = IS_RIGHT ? -1 : 1;
-    if (argumentsLength < 2) while (true) {
-      if (index in self) {
-        memo = self[index];
-        index += i;
-        break;
-      }
-      index += i;
-      if (IS_RIGHT ? index < 0 : length <= index) {
-        throw TypeError('Reduce of empty array with no initial value');
-      }
-    }
-    for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {
-      memo = callbackfn(memo, self[index], index, O);
-    }
-    return memo;
-  };
-};
-
-module.exports = {
-  // `Array.prototype.reduce` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.reduce
-  left: createMethod(false),
-  // `Array.prototype.reduceRight` method
-  // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright
-  right: createMethod(true)
-};
-
-},{"../internals/a-function":55,"../internals/indexed-object":94,"../internals/to-length":133,"../internals/to-object":134}],66:[function(require,module,exports){
-var isObject = require('../internals/is-object');
-var isArray = require('../internals/is-array');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var SPECIES = wellKnownSymbol('species');
-
-// `ArraySpeciesCreate` abstract operation
-// https://tc39.github.io/ecma262/#sec-arrayspeciescreate
-module.exports = function (originalArray, length) {
-  var C;
-  if (isArray(originalArray)) {
-    C = originalArray.constructor;
-    // cross-realm fallback
-    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;
-    else if (isObject(C)) {
-      C = C[SPECIES];
-      if (C === null) C = undefined;
-    }
-  } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);
-};
-
-},{"../internals/is-array":97,"../internals/is-object":100,"../internals/well-known-symbol":139}],67:[function(require,module,exports){
-var toString = {}.toString;
-
-module.exports = function (it) {
-  return toString.call(it).slice(8, -1);
-};
-
-},{}],68:[function(require,module,exports){
-var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');
-var classofRaw = require('../internals/classof-raw');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var TO_STRING_TAG = wellKnownSymbol('toStringTag');
-// ES3 wrong here
-var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';
-
-// fallback for IE11 Script Access Denied error
-var tryGet = function (it, key) {
-  try {
-    return it[key];
-  } catch (error) { /* empty */ }
-};
-
-// getting tag from ES6+ `Object.prototype.toString`
-module.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {
-  var O, tag, result;
-  return it === undefined ? 'Undefined' : it === null ? 'Null'
-    // @@toStringTag case
-    : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag
-    // builtinTag case
-    : CORRECT_ARGUMENTS ? classofRaw(O)
-    // ES3 arguments fallback
-    : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;
-};
-
-},{"../internals/classof-raw":67,"../internals/to-string-tag-support":136,"../internals/well-known-symbol":139}],69:[function(require,module,exports){
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var MATCH = wellKnownSymbol('match');
-
-module.exports = function (METHOD_NAME) {
-  var regexp = /./;
-  try {
-    '/./'[METHOD_NAME](regexp);
-  } catch (e) {
-    try {
-      regexp[MATCH] = false;
-      return '/./'[METHOD_NAME](regexp);
-    } catch (f) { /* empty */ }
-  } return false;
-};
-
-},{"../internals/well-known-symbol":139}],70:[function(require,module,exports){
-var fails = require('../internals/fails');
-
-module.exports = !fails(function () {
-  function F() { /* empty */ }
-  F.prototype.constructor = null;
-  return Object.getPrototypeOf(new F()) !== F.prototype;
-});
-
-},{"../internals/fails":84}],71:[function(require,module,exports){
-'use strict';
-var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;
-var create = require('../internals/object-create');
-var createPropertyDescriptor = require('../internals/create-property-descriptor');
-var setToStringTag = require('../internals/set-to-string-tag');
-var Iterators = require('../internals/iterators');
-
-var returnThis = function () { return this; };
-
-module.exports = function (IteratorConstructor, NAME, next) {
-  var TO_STRING_TAG = NAME + ' Iterator';
-  IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });
-  setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);
-  Iterators[TO_STRING_TAG] = returnThis;
-  return IteratorConstructor;
-};
-
-},{"../internals/create-property-descriptor":73,"../internals/iterators":104,"../internals/iterators-core":103,"../internals/object-create":109,"../internals/set-to-string-tag":124}],72:[function(require,module,exports){
-var DESCRIPTORS = require('../internals/descriptors');
-var definePropertyModule = require('../internals/object-define-property');
-var createPropertyDescriptor = require('../internals/create-property-descriptor');
-
-module.exports = DESCRIPTORS ? function (object, key, value) {
-  return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));
-} : function (object, key, value) {
-  object[key] = value;
-  return object;
-};
-
-},{"../internals/create-property-descriptor":73,"../internals/descriptors":76,"../internals/object-define-property":111}],73:[function(require,module,exports){
-module.exports = function (bitmap, value) {
-  return {
-    enumerable: !(bitmap & 1),
-    configurable: !(bitmap & 2),
-    writable: !(bitmap & 4),
-    value: value
-  };
-};
-
-},{}],74:[function(require,module,exports){
-'use strict';
-var toPrimitive = require('../internals/to-primitive');
-var definePropertyModule = require('../internals/object-define-property');
-var createPropertyDescriptor = require('../internals/create-property-descriptor');
-
-module.exports = function (object, key, value) {
-  var propertyKey = toPrimitive(key);
-  if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));
-  else object[propertyKey] = value;
-};
-
-},{"../internals/create-property-descriptor":73,"../internals/object-define-property":111,"../internals/to-primitive":135}],75:[function(require,module,exports){
-'use strict';
-var $ = require('../internals/export');
-var createIteratorConstructor = require('../internals/create-iterator-constructor');
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-var setPrototypeOf = require('../internals/object-set-prototype-of');
-var setToStringTag = require('../internals/set-to-string-tag');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var redefine = require('../internals/redefine');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var IS_PURE = require('../internals/is-pure');
-var Iterators = require('../internals/iterators');
-var IteratorsCore = require('../internals/iterators-core');
-
-var IteratorPrototype = IteratorsCore.IteratorPrototype;
-var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;
-var ITERATOR = wellKnownSymbol('iterator');
-var KEYS = 'keys';
-var VALUES = 'values';
-var ENTRIES = 'entries';
-
-var returnThis = function () { return this; };
-
-module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {
-  createIteratorConstructor(IteratorConstructor, NAME, next);
-
-  var getIterationMethod = function (KIND) {
-    if (KIND === DEFAULT && defaultIterator) return defaultIterator;
-    if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];
-    switch (KIND) {
-      case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };
-      case VALUES: return function values() { return new IteratorConstructor(this, KIND); };
-      case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };
-    } return function () { return new IteratorConstructor(this); };
-  };
-
-  var TO_STRING_TAG = NAME + ' Iterator';
-  var INCORRECT_VALUES_NAME = false;
-  var IterablePrototype = Iterable.prototype;
-  var nativeIterator = IterablePrototype[ITERATOR]
-    || IterablePrototype['@@iterator']
-    || DEFAULT && IterablePrototype[DEFAULT];
-  var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);
-  var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;
-  var CurrentIteratorPrototype, methods, KEY;
-
-  // fix native
-  if (anyNativeIterator) {
-    CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));
-    if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {
-      if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {
-        if (setPrototypeOf) {
-          setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);
-        } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {
-          createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);
-        }
-      }
-      // Set @@toStringTag to native iterators
-      setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);
-      if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;
-    }
-  }
-
-  // fix Array#{values, @@iterator}.name in V8 / FF
-  if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {
-    INCORRECT_VALUES_NAME = true;
-    defaultIterator = function values() { return nativeIterator.call(this); };
-  }
-
-  // define iterator
-  if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {
-    createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);
-  }
-  Iterators[NAME] = defaultIterator;
-
-  // export additional methods
-  if (DEFAULT) {
-    methods = {
-      values: getIterationMethod(VALUES),
-      keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),
-      entries: getIterationMethod(ENTRIES)
-    };
-    if (FORCED) for (KEY in methods) {
-      if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
-        redefine(IterablePrototype, KEY, methods[KEY]);
-      }
-    } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
-  }
-
-  return methods;
-};
-
-},{"../internals/create-iterator-constructor":71,"../internals/create-non-enumerable-property":72,"../internals/export":83,"../internals/is-pure":101,"../internals/iterators":104,"../internals/iterators-core":103,"../internals/object-get-prototype-of":113,"../internals/object-set-prototype-of":117,"../internals/redefine":120,"../internals/set-to-string-tag":124,"../internals/well-known-symbol":139}],76:[function(require,module,exports){
-var fails = require('../internals/fails');
-
-// Thank's IE8 for his funny defineProperty
-module.exports = !fails(function () {
-  return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;
-});
-
-},{"../internals/fails":84}],77:[function(require,module,exports){
-var global = require('../internals/global');
-var isObject = require('../internals/is-object');
-
-var document = global.document;
-// typeof document.createElement is 'object' in old IE
-var EXISTS = isObject(document) && isObject(document.createElement);
-
-module.exports = function (it) {
-  return EXISTS ? document.createElement(it) : {};
-};
-
-},{"../internals/global":89,"../internals/is-object":100}],78:[function(require,module,exports){
-// iterable DOM collections
-// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods
-module.exports = {
-  CSSRuleList: 0,
-  CSSStyleDeclaration: 0,
-  CSSValueList: 0,
-  ClientRectList: 0,
-  DOMRectList: 0,
-  DOMStringList: 0,
-  DOMTokenList: 1,
-  DataTransferItemList: 0,
-  FileList: 0,
-  HTMLAllCollection: 0,
-  HTMLCollection: 0,
-  HTMLFormElement: 0,
-  HTMLSelectElement: 0,
-  MediaList: 0,
-  MimeTypeArray: 0,
-  NamedNodeMap: 0,
-  NodeList: 1,
-  PaintRequestList: 0,
-  Plugin: 0,
-  PluginArray: 0,
-  SVGLengthList: 0,
-  SVGNumberList: 0,
-  SVGPathSegList: 0,
-  SVGPointList: 0,
-  SVGStringList: 0,
-  SVGTransformList: 0,
-  SourceBufferList: 0,
-  StyleSheetList: 0,
-  TextTrackCueList: 0,
-  TextTrackList: 0,
-  TouchList: 0
-};
-
-},{}],79:[function(require,module,exports){
-var getBuiltIn = require('../internals/get-built-in');
-
-module.exports = getBuiltIn('navigator', 'userAgent') || '';
-
-},{"../internals/get-built-in":86}],80:[function(require,module,exports){
-var global = require('../internals/global');
-var userAgent = require('../internals/engine-user-agent');
-
-var process = global.process;
-var versions = process && process.versions;
-var v8 = versions && versions.v8;
-var match, version;
-
-if (v8) {
-  match = v8.split('.');
-  version = match[0] + match[1];
-} else if (userAgent) {
-  match = userAgent.match(/Edge\/(\d+)/);
-  if (!match || match[1] >= 74) {
-    match = userAgent.match(/Chrome\/(\d+)/);
-    if (match) version = match[1];
-  }
-}
-
-module.exports = version && +version;
-
-},{"../internals/engine-user-agent":79,"../internals/global":89}],81:[function(require,module,exports){
-var path = require('../internals/path');
-
-module.exports = function (CONSTRUCTOR) {
-  return path[CONSTRUCTOR + 'Prototype'];
-};
-
-},{"../internals/path":119}],82:[function(require,module,exports){
-// IE8- don't enum bug keys
-module.exports = [
-  'constructor',
-  'hasOwnProperty',
-  'isPrototypeOf',
-  'propertyIsEnumerable',
-  'toLocaleString',
-  'toString',
-  'valueOf'
-];
-
-},{}],83:[function(require,module,exports){
-'use strict';
-var global = require('../internals/global');
-var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;
-var isForced = require('../internals/is-forced');
-var path = require('../internals/path');
-var bind = require('../internals/function-bind-context');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var has = require('../internals/has');
-
-var wrapConstructor = function (NativeConstructor) {
-  var Wrapper = function (a, b, c) {
-    if (this instanceof NativeConstructor) {
-      switch (arguments.length) {
-        case 0: return new NativeConstructor();
-        case 1: return new NativeConstructor(a);
-        case 2: return new NativeConstructor(a, b);
-      } return new NativeConstructor(a, b, c);
-    } return NativeConstructor.apply(this, arguments);
-  };
-  Wrapper.prototype = NativeConstructor.prototype;
-  return Wrapper;
-};
-
-/*
-  options.target      - name of the target object
-  options.global      - target is the global object
-  options.stat        - export as static methods of target
-  options.proto       - export as prototype methods of target
-  options.real        - real prototype method for the `pure` version
-  options.forced      - export even if the native feature is available
-  options.bind        - bind methods to the target, required for the `pure` version
-  options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version
-  options.unsafe      - use the simple assignment of property instead of delete + defineProperty
-  options.sham        - add a flag to not completely full polyfills
-  options.enumerable  - export as enumerable property
-  options.noTargetGet - prevent calling a getter on target
-*/
-module.exports = function (options, source) {
-  var TARGET = options.target;
-  var GLOBAL = options.global;
-  var STATIC = options.stat;
-  var PROTO = options.proto;
-
-  var nativeSource = GLOBAL ? global : STATIC ? global[TARGET] : (global[TARGET] || {}).prototype;
-
-  var target = GLOBAL ? path : path[TARGET] || (path[TARGET] = {});
-  var targetPrototype = target.prototype;
-
-  var FORCED, USE_NATIVE, VIRTUAL_PROTOTYPE;
-  var key, sourceProperty, targetProperty, nativeProperty, resultProperty, descriptor;
-
-  for (key in source) {
-    FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
-    // contains in native
-    USE_NATIVE = !FORCED && nativeSource && has(nativeSource, key);
-
-    targetProperty = target[key];
-
-    if (USE_NATIVE) if (options.noTargetGet) {
-      descriptor = getOwnPropertyDescriptor(nativeSource, key);
-      nativeProperty = descriptor && descriptor.value;
-    } else nativeProperty = nativeSource[key];
-
-    // export native or implementation
-    sourceProperty = (USE_NATIVE && nativeProperty) ? nativeProperty : source[key];
-
-    if (USE_NATIVE && typeof targetProperty === typeof sourceProperty) continue;
-
-    // bind timers to global for call from export context
-    if (options.bind && USE_NATIVE) resultProperty = bind(sourceProperty, global);
-    // wrap global constructors for prevent changs in this version
-    else if (options.wrap && USE_NATIVE) resultProperty = wrapConstructor(sourceProperty);
-    // make static versions for prototype methods
-    else if (PROTO && typeof sourceProperty == 'function') resultProperty = bind(Function.call, sourceProperty);
-    // default case
-    else resultProperty = sourceProperty;
-
-    // add a flag to not completely full polyfills
-    if (options.sham || (sourceProperty && sourceProperty.sham) || (targetProperty && targetProperty.sham)) {
-      createNonEnumerableProperty(resultProperty, 'sham', true);
-    }
-
-    target[key] = resultProperty;
-
-    if (PROTO) {
-      VIRTUAL_PROTOTYPE = TARGET + 'Prototype';
-      if (!has(path, VIRTUAL_PROTOTYPE)) {
-        createNonEnumerableProperty(path, VIRTUAL_PROTOTYPE, {});
-      }
-      // export virtual prototype methods
-      path[VIRTUAL_PROTOTYPE][key] = sourceProperty;
-      // export real prototype methods
-      if (options.real && targetPrototype && !targetPrototype[key]) {
-        createNonEnumerableProperty(targetPrototype, key, sourceProperty);
-      }
-    }
-  }
-};
-
-},{"../internals/create-non-enumerable-property":72,"../internals/function-bind-context":85,"../internals/global":89,"../internals/has":90,"../internals/is-forced":98,"../internals/object-get-own-property-descriptor":112,"../internals/path":119}],84:[function(require,module,exports){
-module.exports = function (exec) {
-  try {
-    return !!exec();
-  } catch (error) {
-    return true;
-  }
-};
-
-},{}],85:[function(require,module,exports){
-var aFunction = require('../internals/a-function');
-
-// optional / simple context binding
-module.exports = function (fn, that, length) {
-  aFunction(fn);
-  if (that === undefined) return fn;
-  switch (length) {
-    case 0: return function () {
-      return fn.call(that);
-    };
-    case 1: return function (a) {
-      return fn.call(that, a);
-    };
-    case 2: return function (a, b) {
-      return fn.call(that, a, b);
-    };
-    case 3: return function (a, b, c) {
-      return fn.call(that, a, b, c);
-    };
-  }
-  return function (/* ...args */) {
-    return fn.apply(that, arguments);
-  };
-};
-
-},{"../internals/a-function":55}],86:[function(require,module,exports){
-var path = require('../internals/path');
-var global = require('../internals/global');
-
-var aFunction = function (variable) {
-  return typeof variable == 'function' ? variable : undefined;
-};
-
-module.exports = function (namespace, method) {
-  return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])
-    : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];
-};
-
-},{"../internals/global":89,"../internals/path":119}],87:[function(require,module,exports){
-var classof = require('../internals/classof');
-var Iterators = require('../internals/iterators');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var ITERATOR = wellKnownSymbol('iterator');
-
-module.exports = function (it) {
-  if (it != undefined) return it[ITERATOR]
-    || it['@@iterator']
-    || Iterators[classof(it)];
-};
-
-},{"../internals/classof":68,"../internals/iterators":104,"../internals/well-known-symbol":139}],88:[function(require,module,exports){
-var anObject = require('../internals/an-object');
-var getIteratorMethod = require('../internals/get-iterator-method');
-
-module.exports = function (it) {
-  var iteratorMethod = getIteratorMethod(it);
-  if (typeof iteratorMethod != 'function') {
-    throw TypeError(String(it) + ' is not iterable');
-  } return anObject(iteratorMethod.call(it));
-};
-
-},{"../internals/an-object":58,"../internals/get-iterator-method":87}],89:[function(require,module,exports){
-(function (global){
-var check = function (it) {
-  return it && it.Math == Math && it;
-};
-
-// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
-module.exports =
-  // eslint-disable-next-line no-undef
-  check(typeof globalThis == 'object' && globalThis) ||
-  check(typeof window == 'object' && window) ||
-  check(typeof self == 'object' && self) ||
-  check(typeof global == 'object' && global) ||
-  // eslint-disable-next-line no-new-func
-  Function('return this')();
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],90:[function(require,module,exports){
-var hasOwnProperty = {}.hasOwnProperty;
-
-module.exports = function (it, key) {
-  return hasOwnProperty.call(it, key);
-};
-
-},{}],91:[function(require,module,exports){
-module.exports = {};
-
-},{}],92:[function(require,module,exports){
-var getBuiltIn = require('../internals/get-built-in');
-
-module.exports = getBuiltIn('document', 'documentElement');
-
-},{"../internals/get-built-in":86}],93:[function(require,module,exports){
-var DESCRIPTORS = require('../internals/descriptors');
-var fails = require('../internals/fails');
-var createElement = require('../internals/document-create-element');
-
-// Thank's IE8 for his funny defineProperty
-module.exports = !DESCRIPTORS && !fails(function () {
-  return Object.defineProperty(createElement('div'), 'a', {
-    get: function () { return 7; }
-  }).a != 7;
-});
-
-},{"../internals/descriptors":76,"../internals/document-create-element":77,"../internals/fails":84}],94:[function(require,module,exports){
-var fails = require('../internals/fails');
-var classof = require('../internals/classof-raw');
-
-var split = ''.split;
-
-// fallback for non-array-like ES3 and non-enumerable old V8 strings
-module.exports = fails(function () {
-  // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
-  // eslint-disable-next-line no-prototype-builtins
-  return !Object('z').propertyIsEnumerable(0);
-}) ? function (it) {
-  return classof(it) == 'String' ? split.call(it, '') : Object(it);
-} : Object;
-
-},{"../internals/classof-raw":67,"../internals/fails":84}],95:[function(require,module,exports){
-var store = require('../internals/shared-store');
-
-var functionToString = Function.toString;
-
-// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper
-if (typeof store.inspectSource != 'function') {
-  store.inspectSource = function (it) {
-    return functionToString.call(it);
-  };
-}
-
-module.exports = store.inspectSource;
-
-},{"../internals/shared-store":126}],96:[function(require,module,exports){
-var NATIVE_WEAK_MAP = require('../internals/native-weak-map');
-var global = require('../internals/global');
-var isObject = require('../internals/is-object');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var objectHas = require('../internals/has');
-var sharedKey = require('../internals/shared-key');
-var hiddenKeys = require('../internals/hidden-keys');
-
-var WeakMap = global.WeakMap;
-var set, get, has;
-
-var enforce = function (it) {
-  return has(it) ? get(it) : set(it, {});
-};
-
-var getterFor = function (TYPE) {
-  return function (it) {
-    var state;
-    if (!isObject(it) || (state = get(it)).type !== TYPE) {
-      throw TypeError('Incompatible receiver, ' + TYPE + ' required');
-    } return state;
-  };
-};
-
-if (NATIVE_WEAK_MAP) {
-  var store = new WeakMap();
-  var wmget = store.get;
-  var wmhas = store.has;
-  var wmset = store.set;
-  set = function (it, metadata) {
-    wmset.call(store, it, metadata);
-    return metadata;
-  };
-  get = function (it) {
-    return wmget.call(store, it) || {};
-  };
-  has = function (it) {
-    return wmhas.call(store, it);
-  };
-} else {
-  var STATE = sharedKey('state');
-  hiddenKeys[STATE] = true;
-  set = function (it, metadata) {
-    createNonEnumerableProperty(it, STATE, metadata);
-    return metadata;
-  };
-  get = function (it) {
-    return objectHas(it, STATE) ? it[STATE] : {};
-  };
-  has = function (it) {
-    return objectHas(it, STATE);
-  };
-}
-
-module.exports = {
-  set: set,
-  get: get,
-  has: has,
-  enforce: enforce,
-  getterFor: getterFor
-};
-
-},{"../internals/create-non-enumerable-property":72,"../internals/global":89,"../internals/has":90,"../internals/hidden-keys":91,"../internals/is-object":100,"../internals/native-weak-map":106,"../internals/shared-key":125}],97:[function(require,module,exports){
-var classof = require('../internals/classof-raw');
-
-// `IsArray` abstract operation
-// https://tc39.github.io/ecma262/#sec-isarray
-module.exports = Array.isArray || function isArray(arg) {
-  return classof(arg) == 'Array';
-};
-
-},{"../internals/classof-raw":67}],98:[function(require,module,exports){
-var fails = require('../internals/fails');
-
-var replacement = /#|\.prototype\./;
-
-var isForced = function (feature, detection) {
-  var value = data[normalize(feature)];
-  return value == POLYFILL ? true
-    : value == NATIVE ? false
-    : typeof detection == 'function' ? fails(detection)
-    : !!detection;
-};
-
-var normalize = isForced.normalize = function (string) {
-  return String(string).replace(replacement, '.').toLowerCase();
-};
-
-var data = isForced.data = {};
-var NATIVE = isForced.NATIVE = 'N';
-var POLYFILL = isForced.POLYFILL = 'P';
-
-module.exports = isForced;
-
-},{"../internals/fails":84}],99:[function(require,module,exports){
-var classof = require('../internals/classof');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var Iterators = require('../internals/iterators');
-
-var ITERATOR = wellKnownSymbol('iterator');
-
-module.exports = function (it) {
-  var O = Object(it);
-  return O[ITERATOR] !== undefined
-    || '@@iterator' in O
-    // eslint-disable-next-line no-prototype-builtins
-    || Iterators.hasOwnProperty(classof(O));
-};
-
-},{"../internals/classof":68,"../internals/iterators":104,"../internals/well-known-symbol":139}],100:[function(require,module,exports){
-module.exports = function (it) {
-  return typeof it === 'object' ? it !== null : typeof it === 'function';
-};
-
-},{}],101:[function(require,module,exports){
-module.exports = true;
-
-},{}],102:[function(require,module,exports){
-var isObject = require('../internals/is-object');
-var classof = require('../internals/classof-raw');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var MATCH = wellKnownSymbol('match');
-
-// `IsRegExp` abstract operation
-// https://tc39.github.io/ecma262/#sec-isregexp
-module.exports = function (it) {
-  var isRegExp;
-  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');
-};
-
-},{"../internals/classof-raw":67,"../internals/is-object":100,"../internals/well-known-symbol":139}],103:[function(require,module,exports){
-'use strict';
-var getPrototypeOf = require('../internals/object-get-prototype-of');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var has = require('../internals/has');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var IS_PURE = require('../internals/is-pure');
-
-var ITERATOR = wellKnownSymbol('iterator');
-var BUGGY_SAFARI_ITERATORS = false;
-
-var returnThis = function () { return this; };
-
-// `%IteratorPrototype%` object
-// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object
-var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;
-
-if ([].keys) {
-  arrayIterator = [].keys();
-  // Safari 8 has buggy iterators w/o `next`
-  if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;
-  else {
-    PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));
-    if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;
-  }
-}
-
-if (IteratorPrototype == undefined) IteratorPrototype = {};
-
-// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
-if (!IS_PURE && !has(IteratorPrototype, ITERATOR)) {
-  createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);
-}
-
-module.exports = {
-  IteratorPrototype: IteratorPrototype,
-  BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS
-};
-
-},{"../internals/create-non-enumerable-property":72,"../internals/has":90,"../internals/is-pure":101,"../internals/object-get-prototype-of":113,"../internals/well-known-symbol":139}],104:[function(require,module,exports){
-arguments[4][91][0].apply(exports,arguments)
-},{"dup":91}],105:[function(require,module,exports){
-var fails = require('../internals/fails');
-
-module.exports = !!Object.getOwnPropertySymbols && !fails(function () {
-  // Chrome 38 Symbol has incorrect toString conversion
-  // eslint-disable-next-line no-undef
-  return !String(Symbol());
-});
-
-},{"../internals/fails":84}],106:[function(require,module,exports){
-var global = require('../internals/global');
-var inspectSource = require('../internals/inspect-source');
-
-var WeakMap = global.WeakMap;
-
-module.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));
-
-},{"../internals/global":89,"../internals/inspect-source":95}],107:[function(require,module,exports){
-var isRegExp = require('../internals/is-regexp');
-
-module.exports = function (it) {
-  if (isRegExp(it)) {
-    throw TypeError("The method doesn't accept regular expressions");
-  } return it;
-};
-
-},{"../internals/is-regexp":102}],108:[function(require,module,exports){
-var global = require('../internals/global');
-var trim = require('../internals/string-trim').trim;
-var whitespaces = require('../internals/whitespaces');
-
-var $parseInt = global.parseInt;
-var hex = /^[+-]?0[Xx]/;
-var FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22;
-
-// `parseInt` method
-// https://tc39.github.io/ecma262/#sec-parseint-string-radix
-module.exports = FORCED ? function parseInt(string, radix) {
-  var S = trim(String(string));
-  return $parseInt(S, (radix >>> 0) || (hex.test(S) ? 16 : 10));
-} : $parseInt;
-
-},{"../internals/global":89,"../internals/string-trim":129,"../internals/whitespaces":140}],109:[function(require,module,exports){
-var anObject = require('../internals/an-object');
-var defineProperties = require('../internals/object-define-properties');
-var enumBugKeys = require('../internals/enum-bug-keys');
-var hiddenKeys = require('../internals/hidden-keys');
-var html = require('../internals/html');
-var documentCreateElement = require('../internals/document-create-element');
-var sharedKey = require('../internals/shared-key');
-
-var GT = '>';
-var LT = '<';
-var PROTOTYPE = 'prototype';
-var SCRIPT = 'script';
-var IE_PROTO = sharedKey('IE_PROTO');
-
-var EmptyConstructor = function () { /* empty */ };
-
-var scriptTag = function (content) {
-  return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;
-};
-
-// Create object with fake `null` prototype: use ActiveX Object with cleared prototype
-var NullProtoObjectViaActiveX = function (activeXDocument) {
-  activeXDocument.write(scriptTag(''));
-  activeXDocument.close();
-  var temp = activeXDocument.parentWindow.Object;
-  activeXDocument = null; // avoid memory leak
-  return temp;
-};
-
-// Create object with fake `null` prototype: use iframe Object with cleared prototype
-var NullProtoObjectViaIFrame = function () {
-  // Thrash, waste and sodomy: IE GC bug
-  var iframe = documentCreateElement('iframe');
-  var JS = 'java' + SCRIPT + ':';
-  var iframeDocument;
-  iframe.style.display = 'none';
-  html.appendChild(iframe);
-  // https://github.com/zloirock/core-js/issues/475
-  iframe.src = String(JS);
-  iframeDocument = iframe.contentWindow.document;
-  iframeDocument.open();
-  iframeDocument.write(scriptTag('document.F=Object'));
-  iframeDocument.close();
-  return iframeDocument.F;
-};
-
-// Check for document.domain and active x support
-// No need to use active x approach when document.domain is not set
-// see https://github.com/es-shims/es5-shim/issues/150
-// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346
-// avoid IE GC bug
-var activeXDocument;
-var NullProtoObject = function () {
-  try {
-    /* global ActiveXObject */
-    activeXDocument = document.domain && new ActiveXObject('htmlfile');
-  } catch (error) { /* ignore */ }
-  NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();
-  var length = enumBugKeys.length;
-  while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];
-  return NullProtoObject();
-};
-
-hiddenKeys[IE_PROTO] = true;
-
-// `Object.create` method
-// https://tc39.github.io/ecma262/#sec-object.create
-module.exports = Object.create || function create(O, Properties) {
-  var result;
-  if (O !== null) {
-    EmptyConstructor[PROTOTYPE] = anObject(O);
-    result = new EmptyConstructor();
-    EmptyConstructor[PROTOTYPE] = null;
-    // add "__proto__" for Object.getPrototypeOf polyfill
-    result[IE_PROTO] = O;
-  } else result = NullProtoObject();
-  return Properties === undefined ? result : defineProperties(result, Properties);
-};
-
-},{"../internals/an-object":58,"../internals/document-create-element":77,"../internals/enum-bug-keys":82,"../internals/hidden-keys":91,"../internals/html":92,"../internals/object-define-properties":110,"../internals/shared-key":125}],110:[function(require,module,exports){
-var DESCRIPTORS = require('../internals/descriptors');
-var definePropertyModule = require('../internals/object-define-property');
-var anObject = require('../internals/an-object');
-var objectKeys = require('../internals/object-keys');
-
-// `Object.defineProperties` method
-// https://tc39.github.io/ecma262/#sec-object.defineproperties
-module.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {
-  anObject(O);
-  var keys = objectKeys(Properties);
-  var length = keys.length;
-  var index = 0;
-  var key;
-  while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);
-  return O;
-};
-
-},{"../internals/an-object":58,"../internals/descriptors":76,"../internals/object-define-property":111,"../internals/object-keys":115}],111:[function(require,module,exports){
-var DESCRIPTORS = require('../internals/descriptors');
-var IE8_DOM_DEFINE = require('../internals/ie8-dom-define');
-var anObject = require('../internals/an-object');
-var toPrimitive = require('../internals/to-primitive');
-
-var nativeDefineProperty = Object.defineProperty;
-
-// `Object.defineProperty` method
-// https://tc39.github.io/ecma262/#sec-object.defineproperty
-exports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {
-  anObject(O);
-  P = toPrimitive(P, true);
-  anObject(Attributes);
-  if (IE8_DOM_DEFINE) try {
-    return nativeDefineProperty(O, P, Attributes);
-  } catch (error) { /* empty */ }
-  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');
-  if ('value' in Attributes) O[P] = Attributes.value;
-  return O;
-};
-
-},{"../internals/an-object":58,"../internals/descriptors":76,"../internals/ie8-dom-define":93,"../internals/to-primitive":135}],112:[function(require,module,exports){
-var DESCRIPTORS = require('../internals/descriptors');
-var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');
-var createPropertyDescriptor = require('../internals/create-property-descriptor');
-var toIndexedObject = require('../internals/to-indexed-object');
-var toPrimitive = require('../internals/to-primitive');
-var has = require('../internals/has');
-var IE8_DOM_DEFINE = require('../internals/ie8-dom-define');
-
-var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
-
-// `Object.getOwnPropertyDescriptor` method
-// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor
-exports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {
-  O = toIndexedObject(O);
-  P = toPrimitive(P, true);
-  if (IE8_DOM_DEFINE) try {
-    return nativeGetOwnPropertyDescriptor(O, P);
-  } catch (error) { /* empty */ }
-  if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);
-};
-
-},{"../internals/create-property-descriptor":73,"../internals/descriptors":76,"../internals/has":90,"../internals/ie8-dom-define":93,"../internals/object-property-is-enumerable":116,"../internals/to-indexed-object":131,"../internals/to-primitive":135}],113:[function(require,module,exports){
-var has = require('../internals/has');
-var toObject = require('../internals/to-object');
-var sharedKey = require('../internals/shared-key');
-var CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');
-
-var IE_PROTO = sharedKey('IE_PROTO');
-var ObjectPrototype = Object.prototype;
-
-// `Object.getPrototypeOf` method
-// https://tc39.github.io/ecma262/#sec-object.getprototypeof
-module.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {
-  O = toObject(O);
-  if (has(O, IE_PROTO)) return O[IE_PROTO];
-  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
-    return O.constructor.prototype;
-  } return O instanceof Object ? ObjectPrototype : null;
-};
-
-},{"../internals/correct-prototype-getter":70,"../internals/has":90,"../internals/shared-key":125,"../internals/to-object":134}],114:[function(require,module,exports){
-var has = require('../internals/has');
-var toIndexedObject = require('../internals/to-indexed-object');
-var indexOf = require('../internals/array-includes').indexOf;
-var hiddenKeys = require('../internals/hidden-keys');
-
-module.exports = function (object, names) {
-  var O = toIndexedObject(object);
-  var i = 0;
-  var result = [];
-  var key;
-  for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);
-  // Don't enum bug & hidden keys
-  while (names.length > i) if (has(O, key = names[i++])) {
-    ~indexOf(result, key) || result.push(key);
-  }
-  return result;
-};
-
-},{"../internals/array-includes":60,"../internals/has":90,"../internals/hidden-keys":91,"../internals/to-indexed-object":131}],115:[function(require,module,exports){
-var internalObjectKeys = require('../internals/object-keys-internal');
-var enumBugKeys = require('../internals/enum-bug-keys');
-
-// `Object.keys` method
-// https://tc39.github.io/ecma262/#sec-object.keys
-module.exports = Object.keys || function keys(O) {
-  return internalObjectKeys(O, enumBugKeys);
-};
-
-},{"../internals/enum-bug-keys":82,"../internals/object-keys-internal":114}],116:[function(require,module,exports){
-'use strict';
-var nativePropertyIsEnumerable = {}.propertyIsEnumerable;
-var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
-
-// Nashorn ~ JDK8 bug
-var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);
-
-// `Object.prototype.propertyIsEnumerable` method implementation
-// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable
-exports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {
-  var descriptor = getOwnPropertyDescriptor(this, V);
-  return !!descriptor && descriptor.enumerable;
-} : nativePropertyIsEnumerable;
-
-},{}],117:[function(require,module,exports){
-var anObject = require('../internals/an-object');
-var aPossiblePrototype = require('../internals/a-possible-prototype');
-
-// `Object.setPrototypeOf` method
-// https://tc39.github.io/ecma262/#sec-object.setprototypeof
-// Works with __proto__ only. Old v8 can't work with null proto objects.
-/* eslint-disable no-proto */
-module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {
-  var CORRECT_SETTER = false;
-  var test = {};
-  var setter;
-  try {
-    setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;
-    setter.call(test, []);
-    CORRECT_SETTER = test instanceof Array;
-  } catch (error) { /* empty */ }
-  return function setPrototypeOf(O, proto) {
-    anObject(O);
-    aPossiblePrototype(proto);
-    if (CORRECT_SETTER) setter.call(O, proto);
-    else O.__proto__ = proto;
-    return O;
-  };
-}() : undefined);
-
-},{"../internals/a-possible-prototype":56,"../internals/an-object":58}],118:[function(require,module,exports){
-'use strict';
-var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');
-var classof = require('../internals/classof');
-
-// `Object.prototype.toString` method implementation
-// https://tc39.github.io/ecma262/#sec-object.prototype.tostring
-module.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {
-  return '[object ' + classof(this) + ']';
-};
-
-},{"../internals/classof":68,"../internals/to-string-tag-support":136}],119:[function(require,module,exports){
-arguments[4][91][0].apply(exports,arguments)
-},{"dup":91}],120:[function(require,module,exports){
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-
-module.exports = function (target, key, value, options) {
-  if (options && options.enumerable) target[key] = value;
-  else createNonEnumerableProperty(target, key, value);
-};
-
-},{"../internals/create-non-enumerable-property":72}],121:[function(require,module,exports){
-'use strict';
-var anObject = require('../internals/an-object');
-
-// `RegExp.prototype.flags` getter implementation
-// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags
-module.exports = function () {
-  var that = anObject(this);
-  var result = '';
-  if (that.global) result += 'g';
-  if (that.ignoreCase) result += 'i';
-  if (that.multiline) result += 'm';
-  if (that.dotAll) result += 's';
-  if (that.unicode) result += 'u';
-  if (that.sticky) result += 'y';
-  return result;
-};
-
-},{"../internals/an-object":58}],122:[function(require,module,exports){
-// `RequireObjectCoercible` abstract operation
-// https://tc39.github.io/ecma262/#sec-requireobjectcoercible
-module.exports = function (it) {
-  if (it == undefined) throw TypeError("Can't call method on " + it);
-  return it;
-};
-
-},{}],123:[function(require,module,exports){
-var global = require('../internals/global');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-
-module.exports = function (key, value) {
-  try {
-    createNonEnumerableProperty(global, key, value);
-  } catch (error) {
-    global[key] = value;
-  } return value;
-};
-
-},{"../internals/create-non-enumerable-property":72,"../internals/global":89}],124:[function(require,module,exports){
-var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');
-var defineProperty = require('../internals/object-define-property').f;
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var has = require('../internals/has');
-var toString = require('../internals/object-to-string');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var TO_STRING_TAG = wellKnownSymbol('toStringTag');
-
-module.exports = function (it, TAG, STATIC, SET_METHOD) {
-  if (it) {
-    var target = STATIC ? it : it.prototype;
-    if (!has(target, TO_STRING_TAG)) {
-      defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });
-    }
-    if (SET_METHOD && !TO_STRING_TAG_SUPPORT) {
-      createNonEnumerableProperty(target, 'toString', toString);
-    }
-  }
-};
-
-},{"../internals/create-non-enumerable-property":72,"../internals/has":90,"../internals/object-define-property":111,"../internals/object-to-string":118,"../internals/to-string-tag-support":136,"../internals/well-known-symbol":139}],125:[function(require,module,exports){
-var shared = require('../internals/shared');
-var uid = require('../internals/uid');
-
-var keys = shared('keys');
-
-module.exports = function (key) {
-  return keys[key] || (keys[key] = uid(key));
-};
-
-},{"../internals/shared":127,"../internals/uid":137}],126:[function(require,module,exports){
-var global = require('../internals/global');
-var setGlobal = require('../internals/set-global');
-
-var SHARED = '__core-js_shared__';
-var store = global[SHARED] || setGlobal(SHARED, {});
-
-module.exports = store;
-
-},{"../internals/global":89,"../internals/set-global":123}],127:[function(require,module,exports){
-var IS_PURE = require('../internals/is-pure');
-var store = require('../internals/shared-store');
-
-(module.exports = function (key, value) {
-  return store[key] || (store[key] = value !== undefined ? value : {});
-})('versions', []).push({
-  version: '3.6.4',
-  mode: IS_PURE ? 'pure' : 'global',
-  copyright: '© 2020 Denis Pushkarev (zloirock.ru)'
-});
-
-},{"../internals/is-pure":101,"../internals/shared-store":126}],128:[function(require,module,exports){
-var toInteger = require('../internals/to-integer');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-
-// `String.prototype.{ codePointAt, at }` methods implementation
-var createMethod = function (CONVERT_TO_STRING) {
-  return function ($this, pos) {
-    var S = String(requireObjectCoercible($this));
-    var position = toInteger(pos);
-    var size = S.length;
-    var first, second;
-    if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
-    first = S.charCodeAt(position);
-    return first < 0xD800 || first > 0xDBFF || position + 1 === size
-      || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF
-        ? CONVERT_TO_STRING ? S.charAt(position) : first
-        : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
-  };
-};
-
-module.exports = {
-  // `String.prototype.codePointAt` method
-  // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat
-  codeAt: createMethod(false),
-  // `String.prototype.at` method
-  // https://github.com/mathiasbynens/String.prototype.at
-  charAt: createMethod(true)
-};
-
-},{"../internals/require-object-coercible":122,"../internals/to-integer":132}],129:[function(require,module,exports){
-var requireObjectCoercible = require('../internals/require-object-coercible');
-var whitespaces = require('../internals/whitespaces');
-
-var whitespace = '[' + whitespaces + ']';
-var ltrim = RegExp('^' + whitespace + whitespace + '*');
-var rtrim = RegExp(whitespace + whitespace + '*$');
-
-// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation
-var createMethod = function (TYPE) {
-  return function ($this) {
-    var string = String(requireObjectCoercible($this));
-    if (TYPE & 1) string = string.replace(ltrim, '');
-    if (TYPE & 2) string = string.replace(rtrim, '');
-    return string;
-  };
-};
-
-module.exports = {
-  // `String.prototype.{ trimLeft, trimStart }` methods
-  // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart
-  start: createMethod(1),
-  // `String.prototype.{ trimRight, trimEnd }` methods
-  // https://tc39.github.io/ecma262/#sec-string.prototype.trimend
-  end: createMethod(2),
-  // `String.prototype.trim` method
-  // https://tc39.github.io/ecma262/#sec-string.prototype.trim
-  trim: createMethod(3)
-};
-
-},{"../internals/require-object-coercible":122,"../internals/whitespaces":140}],130:[function(require,module,exports){
-var toInteger = require('../internals/to-integer');
-
-var max = Math.max;
-var min = Math.min;
-
-// Helper for a popular repeating case of the spec:
-// Let integer be ? ToInteger(index).
-// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).
-module.exports = function (index, length) {
-  var integer = toInteger(index);
-  return integer < 0 ? max(integer + length, 0) : min(integer, length);
-};
-
-},{"../internals/to-integer":132}],131:[function(require,module,exports){
-// toObject with fallback for non-array-like ES3 strings
-var IndexedObject = require('../internals/indexed-object');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-
-module.exports = function (it) {
-  return IndexedObject(requireObjectCoercible(it));
-};
-
-},{"../internals/indexed-object":94,"../internals/require-object-coercible":122}],132:[function(require,module,exports){
-var ceil = Math.ceil;
-var floor = Math.floor;
-
-// `ToInteger` abstract operation
-// https://tc39.github.io/ecma262/#sec-tointeger
-module.exports = function (argument) {
-  return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);
-};
-
-},{}],133:[function(require,module,exports){
-var toInteger = require('../internals/to-integer');
-
-var min = Math.min;
-
-// `ToLength` abstract operation
-// https://tc39.github.io/ecma262/#sec-tolength
-module.exports = function (argument) {
-  return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
-};
-
-},{"../internals/to-integer":132}],134:[function(require,module,exports){
-var requireObjectCoercible = require('../internals/require-object-coercible');
-
-// `ToObject` abstract operation
-// https://tc39.github.io/ecma262/#sec-toobject
-module.exports = function (argument) {
-  return Object(requireObjectCoercible(argument));
-};
-
-},{"../internals/require-object-coercible":122}],135:[function(require,module,exports){
-var isObject = require('../internals/is-object');
-
-// `ToPrimitive` abstract operation
-// https://tc39.github.io/ecma262/#sec-toprimitive
-// instead of the ES6 spec version, we didn't implement @@toPrimitive case
-// and the second argument - flag - preferred type is a string
-module.exports = function (input, PREFERRED_STRING) {
-  if (!isObject(input)) return input;
-  var fn, val;
-  if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;
-  if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;
-  if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;
-  throw TypeError("Can't convert object to primitive value");
-};
-
-},{"../internals/is-object":100}],136:[function(require,module,exports){
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var TO_STRING_TAG = wellKnownSymbol('toStringTag');
-var test = {};
-
-test[TO_STRING_TAG] = 'z';
-
-module.exports = String(test) === '[object z]';
-
-},{"../internals/well-known-symbol":139}],137:[function(require,module,exports){
-var id = 0;
-var postfix = Math.random();
-
-module.exports = function (key) {
-  return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);
-};
-
-},{}],138:[function(require,module,exports){
-var NATIVE_SYMBOL = require('../internals/native-symbol');
-
-module.exports = NATIVE_SYMBOL
-  // eslint-disable-next-line no-undef
-  && !Symbol.sham
-  // eslint-disable-next-line no-undef
-  && typeof Symbol.iterator == 'symbol';
-
-},{"../internals/native-symbol":105}],139:[function(require,module,exports){
-var global = require('../internals/global');
-var shared = require('../internals/shared');
-var has = require('../internals/has');
-var uid = require('../internals/uid');
-var NATIVE_SYMBOL = require('../internals/native-symbol');
-var USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');
-
-var WellKnownSymbolsStore = shared('wks');
-var Symbol = global.Symbol;
-var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;
-
-module.exports = function (name) {
-  if (!has(WellKnownSymbolsStore, name)) {
-    if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];
-    else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);
-  } return WellKnownSymbolsStore[name];
-};
-
-},{"../internals/global":89,"../internals/has":90,"../internals/native-symbol":105,"../internals/shared":127,"../internals/uid":137,"../internals/use-symbol-as-uid":138}],140:[function(require,module,exports){
-// a string of all valid unicode whitespaces
-// eslint-disable-next-line max-len
-module.exports = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';
-
-},{}],141:[function(require,module,exports){
-'use strict';
-var $ = require('../internals/export');
-var fails = require('../internals/fails');
-var isArray = require('../internals/is-array');
-var isObject = require('../internals/is-object');
-var toObject = require('../internals/to-object');
-var toLength = require('../internals/to-length');
-var createProperty = require('../internals/create-property');
-var arraySpeciesCreate = require('../internals/array-species-create');
-var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var V8_VERSION = require('../internals/engine-v8-version');
-
-var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');
-var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
-var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';
-
-// We can't use this feature detection in V8 since it causes
-// deoptimization and serious performance degradation
-// https://github.com/zloirock/core-js/issues/679
-var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {
-  var array = [];
-  array[IS_CONCAT_SPREADABLE] = false;
-  return array.concat()[0] !== array;
-});
-
-var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');
-
-var isConcatSpreadable = function (O) {
-  if (!isObject(O)) return false;
-  var spreadable = O[IS_CONCAT_SPREADABLE];
-  return spreadable !== undefined ? !!spreadable : isArray(O);
-};
-
-var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;
-
-// `Array.prototype.concat` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.concat
-// with adding support of @@isConcatSpreadable and @@species
-$({ target: 'Array', proto: true, forced: FORCED }, {
-  concat: function concat(arg) { // eslint-disable-line no-unused-vars
-    var O = toObject(this);
-    var A = arraySpeciesCreate(O, 0);
-    var n = 0;
-    var i, k, length, len, E;
-    for (i = -1, length = arguments.length; i < length; i++) {
-      E = i === -1 ? O : arguments[i];
-      if (isConcatSpreadable(E)) {
-        len = toLength(E.length);
-        if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
-        for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);
-      } else {
-        if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
-        createProperty(A, n++, E);
-      }
-    }
-    A.length = n;
-    return A;
-  }
-});
-
-},{"../internals/array-method-has-species-support":62,"../internals/array-species-create":66,"../internals/create-property":74,"../internals/engine-v8-version":80,"../internals/export":83,"../internals/fails":84,"../internals/is-array":97,"../internals/is-object":100,"../internals/to-length":133,"../internals/to-object":134,"../internals/well-known-symbol":139}],142:[function(require,module,exports){
-'use strict';
-var $ = require('../internals/export');
-var forEach = require('../internals/array-for-each');
-
-// `Array.prototype.forEach` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.foreach
-$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {
-  forEach: forEach
-});
-
-},{"../internals/array-for-each":59,"../internals/export":83}],143:[function(require,module,exports){
-'use strict';
-var $ = require('../internals/export');
-var $includes = require('../internals/array-includes').includes;
-var addToUnscopables = require('../internals/add-to-unscopables');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });
-
-// `Array.prototype.includes` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.includes
-$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {
-  includes: function includes(el /* , fromIndex = 0 */) {
-    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
-
-// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
-addToUnscopables('includes');
-
-},{"../internals/add-to-unscopables":57,"../internals/array-includes":60,"../internals/array-method-uses-to-length":64,"../internals/export":83}],144:[function(require,module,exports){
-'use strict';
-var $ = require('../internals/export');
-var $indexOf = require('../internals/array-includes').indexOf;
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var nativeIndexOf = [].indexOf;
-
-var NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;
-var STRICT_METHOD = arrayMethodIsStrict('indexOf');
-var USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });
-
-// `Array.prototype.indexOf` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.indexof
-$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {
-  indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {
-    return NEGATIVE_ZERO
-      // convert -0 to +0
-      ? nativeIndexOf.apply(this, arguments) || 0
-      : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
-
-},{"../internals/array-includes":60,"../internals/array-method-is-strict":63,"../internals/array-method-uses-to-length":64,"../internals/export":83}],145:[function(require,module,exports){
-var $ = require('../internals/export');
-var isArray = require('../internals/is-array');
-
-// `Array.isArray` method
-// https://tc39.github.io/ecma262/#sec-array.isarray
-$({ target: 'Array', stat: true }, {
-  isArray: isArray
-});
-
-},{"../internals/export":83,"../internals/is-array":97}],146:[function(require,module,exports){
-'use strict';
-var toIndexedObject = require('../internals/to-indexed-object');
-var addToUnscopables = require('../internals/add-to-unscopables');
-var Iterators = require('../internals/iterators');
-var InternalStateModule = require('../internals/internal-state');
-var defineIterator = require('../internals/define-iterator');
-
-var ARRAY_ITERATOR = 'Array Iterator';
-var setInternalState = InternalStateModule.set;
-var getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);
-
-// `Array.prototype.entries` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.entries
-// `Array.prototype.keys` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.keys
-// `Array.prototype.values` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.values
-// `Array.prototype[@@iterator]` method
-// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator
-// `CreateArrayIterator` internal method
-// https://tc39.github.io/ecma262/#sec-createarrayiterator
-module.exports = defineIterator(Array, 'Array', function (iterated, kind) {
-  setInternalState(this, {
-    type: ARRAY_ITERATOR,
-    target: toIndexedObject(iterated), // target
-    index: 0,                          // next index
-    kind: kind                         // kind
-  });
-// `%ArrayIteratorPrototype%.next` method
-// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next
-}, function () {
-  var state = getInternalState(this);
-  var target = state.target;
-  var kind = state.kind;
-  var index = state.index++;
-  if (!target || index >= target.length) {
-    state.target = undefined;
-    return { value: undefined, done: true };
-  }
-  if (kind == 'keys') return { value: index, done: false };
-  if (kind == 'values') return { value: target[index], done: false };
-  return { value: [index, target[index]], done: false };
-}, 'values');
-
-// argumentsList[@@iterator] is %ArrayProto_values%
-// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject
-// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject
-Iterators.Arguments = Iterators.Array;
-
-// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables
-addToUnscopables('keys');
-addToUnscopables('values');
-addToUnscopables('entries');
-
-},{"../internals/add-to-unscopables":57,"../internals/define-iterator":75,"../internals/internal-state":96,"../internals/iterators":104,"../internals/to-indexed-object":131}],147:[function(require,module,exports){
-'use strict';
-var $ = require('../internals/export');
-var $map = require('../internals/array-iteration').map;
-var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');
-// FF49- issue
-var USES_TO_LENGTH = arrayMethodUsesToLength('map');
-
-// `Array.prototype.map` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.map
-// with adding support of @@species
-$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
-  map: function map(callbackfn /* , thisArg */) {
-    return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
-
-},{"../internals/array-iteration":61,"../internals/array-method-has-species-support":62,"../internals/array-method-uses-to-length":64,"../internals/export":83}],148:[function(require,module,exports){
-'use strict';
-var $ = require('../internals/export');
-var $reduce = require('../internals/array-reduce').left;
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var STRICT_METHOD = arrayMethodIsStrict('reduce');
-var USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });
-
-// `Array.prototype.reduce` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.reduce
-$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {
-  reduce: function reduce(callbackfn /* , initialValue */) {
-    return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
-
-},{"../internals/array-method-is-strict":63,"../internals/array-method-uses-to-length":64,"../internals/array-reduce":65,"../internals/export":83}],149:[function(require,module,exports){
-'use strict';
-var $ = require('../internals/export');
-var isObject = require('../internals/is-object');
-var isArray = require('../internals/is-array');
-var toAbsoluteIndex = require('../internals/to-absolute-index');
-var toLength = require('../internals/to-length');
-var toIndexedObject = require('../internals/to-indexed-object');
-var createProperty = require('../internals/create-property');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');
-var arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');
-
-var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');
-var USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });
-
-var SPECIES = wellKnownSymbol('species');
-var nativeSlice = [].slice;
-var max = Math.max;
-
-// `Array.prototype.slice` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.slice
-// fallback for not array-like ES3 strings and DOM objects
-$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {
-  slice: function slice(start, end) {
-    var O = toIndexedObject(this);
-    var length = toLength(O.length);
-    var k = toAbsoluteIndex(start, length);
-    var fin = toAbsoluteIndex(end === undefined ? length : end, length);
-    // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible
-    var Constructor, result, n;
-    if (isArray(O)) {
-      Constructor = O.constructor;
-      // cross-realm fallback
-      if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {
-        Constructor = undefined;
-      } else if (isObject(Constructor)) {
-        Constructor = Constructor[SPECIES];
-        if (Constructor === null) Constructor = undefined;
-      }
-      if (Constructor === Array || Constructor === undefined) {
-        return nativeSlice.call(O, k, fin);
-      }
-    }
-    result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));
-    for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);
-    result.length = n;
-    return result;
-  }
-});
-
-},{"../internals/array-method-has-species-support":62,"../internals/array-method-uses-to-length":64,"../internals/create-property":74,"../internals/export":83,"../internals/is-array":97,"../internals/is-object":100,"../internals/to-absolute-index":130,"../internals/to-indexed-object":131,"../internals/to-length":133,"../internals/well-known-symbol":139}],150:[function(require,module,exports){
-'use strict';
-var $ = require('../internals/export');
-var aFunction = require('../internals/a-function');
-var toObject = require('../internals/to-object');
-var fails = require('../internals/fails');
-var arrayMethodIsStrict = require('../internals/array-method-is-strict');
-
-var test = [];
-var nativeSort = test.sort;
-
-// IE8-
-var FAILS_ON_UNDEFINED = fails(function () {
-  test.sort(undefined);
-});
-// V8 bug
-var FAILS_ON_NULL = fails(function () {
-  test.sort(null);
-});
-// Old WebKit
-var STRICT_METHOD = arrayMethodIsStrict('sort');
-
-var FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD;
-
-// `Array.prototype.sort` method
-// https://tc39.github.io/ecma262/#sec-array.prototype.sort
-$({ target: 'Array', proto: true, forced: FORCED }, {
-  sort: function sort(comparefn) {
-    return comparefn === undefined
-      ? nativeSort.call(toObject(this))
-      : nativeSort.call(toObject(this), aFunction(comparefn));
-  }
-});
-
-},{"../internals/a-function":55,"../internals/array-method-is-strict":63,"../internals/export":83,"../internals/fails":84,"../internals/to-object":134}],151:[function(require,module,exports){
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var create = require('../internals/object-create');
-
-// `Object.create` method
-// https://tc39.github.io/ecma262/#sec-object.create
-$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {
-  create: create
-});
-
-},{"../internals/descriptors":76,"../internals/export":83,"../internals/object-create":109}],152:[function(require,module,exports){
-var $ = require('../internals/export');
-var DESCRIPTORS = require('../internals/descriptors');
-var objectDefinePropertyModile = require('../internals/object-define-property');
-
-// `Object.defineProperty` method
-// https://tc39.github.io/ecma262/#sec-object.defineproperty
-$({ target: 'Object', stat: true, forced: !DESCRIPTORS, sham: !DESCRIPTORS }, {
-  defineProperty: objectDefinePropertyModile.f
-});
-
-},{"../internals/descriptors":76,"../internals/export":83,"../internals/object-define-property":111}],153:[function(require,module,exports){
-var $ = require('../internals/export');
-var parseIntImplementation = require('../internals/number-parse-int');
-
-// `parseInt` method
-// https://tc39.github.io/ecma262/#sec-parseint-string-radix
-$({ global: true, forced: parseInt != parseIntImplementation }, {
-  parseInt: parseIntImplementation
-});
-
-},{"../internals/export":83,"../internals/number-parse-int":108}],154:[function(require,module,exports){
-// empty
-
-},{}],155:[function(require,module,exports){
-'use strict';
-var $ = require('../internals/export');
-var notARegExp = require('../internals/not-a-regexp');
-var requireObjectCoercible = require('../internals/require-object-coercible');
-var correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');
-
-// `String.prototype.includes` method
-// https://tc39.github.io/ecma262/#sec-string.prototype.includes
-$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {
-  includes: function includes(searchString /* , position = 0 */) {
-    return !!~String(requireObjectCoercible(this))
-      .indexOf(notARegExp(searchString), arguments.length > 1 ? arguments[1] : undefined);
-  }
-});
-
-},{"../internals/correct-is-regexp-logic":69,"../internals/export":83,"../internals/not-a-regexp":107,"../internals/require-object-coercible":122}],156:[function(require,module,exports){
-'use strict';
-var charAt = require('../internals/string-multibyte').charAt;
-var InternalStateModule = require('../internals/internal-state');
-var defineIterator = require('../internals/define-iterator');
-
-var STRING_ITERATOR = 'String Iterator';
-var setInternalState = InternalStateModule.set;
-var getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);
-
-// `String.prototype[@@iterator]` method
-// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator
-defineIterator(String, 'String', function (iterated) {
-  setInternalState(this, {
-    type: STRING_ITERATOR,
-    string: String(iterated),
-    index: 0
-  });
-// `%StringIteratorPrototype%.next` method
-// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next
-}, function next() {
-  var state = getInternalState(this);
-  var string = state.string;
-  var index = state.index;
-  var point;
-  if (index >= string.length) return { value: undefined, done: true };
-  point = charAt(string, index);
-  state.index += point.length;
-  return { value: point, done: false };
-});
-
-},{"../internals/define-iterator":75,"../internals/internal-state":96,"../internals/string-multibyte":128}],157:[function(require,module,exports){
-require('./es.array.iterator');
-var DOMIterables = require('../internals/dom-iterables');
-var global = require('../internals/global');
-var classof = require('../internals/classof');
-var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
-var Iterators = require('../internals/iterators');
-var wellKnownSymbol = require('../internals/well-known-symbol');
-
-var TO_STRING_TAG = wellKnownSymbol('toStringTag');
-
-for (var COLLECTION_NAME in DOMIterables) {
-  var Collection = global[COLLECTION_NAME];
-  var CollectionPrototype = Collection && Collection.prototype;
-  if (CollectionPrototype && classof(CollectionPrototype) !== TO_STRING_TAG) {
-    createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);
-  }
-  Iterators[COLLECTION_NAME] = Iterators.Array;
-}
-
-},{"../internals/classof":68,"../internals/create-non-enumerable-property":72,"../internals/dom-iterables":78,"../internals/global":89,"../internals/iterators":104,"../internals/well-known-symbol":139,"./es.array.iterator":146}],158:[function(require,module,exports){
-var parent = require('../../../es/array/virtual/for-each');
-
-module.exports = parent;
-
-},{"../../../es/array/virtual/for-each":32}],159:[function(require,module,exports){
-var parent = require('../../es/instance/concat');
-
-module.exports = parent;
-
-},{"../../es/instance/concat":39}],160:[function(require,module,exports){
-var parent = require('../../es/instance/flags');
-
-module.exports = parent;
-
-},{"../../es/instance/flags":40}],161:[function(require,module,exports){
-require('../../modules/web.dom-collections.iterator');
-var forEach = require('../array/virtual/for-each');
-var classof = require('../../internals/classof');
-var ArrayPrototype = Array.prototype;
-
-var DOMIterables = {
-  DOMTokenList: true,
-  NodeList: true
-};
-
-module.exports = function (it) {
-  var own = it.forEach;
-  return it === ArrayPrototype || (it instanceof Array && own === ArrayPrototype.forEach)
-    // eslint-disable-next-line no-prototype-builtins
-    || DOMIterables.hasOwnProperty(classof(it)) ? forEach : own;
-};
-
-},{"../../internals/classof":68,"../../modules/web.dom-collections.iterator":157,"../array/virtual/for-each":158}],162:[function(require,module,exports){
-var parent = require('../../es/instance/includes');
-
-module.exports = parent;
-
-},{"../../es/instance/includes":41}],163:[function(require,module,exports){
-var parent = require('../../es/instance/index-of');
-
-module.exports = parent;
-
-},{"../../es/instance/index-of":42}],164:[function(require,module,exports){
-var parent = require('../../es/instance/map');
-
-module.exports = parent;
-
-},{"../../es/instance/map":43}],165:[function(require,module,exports){
-var parent = require('../../es/instance/reduce');
-
-module.exports = parent;
-
-},{"../../es/instance/reduce":44}],166:[function(require,module,exports){
-var parent = require('../../es/instance/slice');
-
-module.exports = parent;
-
-},{"../../es/instance/slice":45}],167:[function(require,module,exports){
-var parent = require('../../es/instance/sort');
-
-module.exports = parent;
-
-},{"../../es/instance/sort":46}],168:[function(require,module,exports){
-var parent = require('../../es/object/create');
-
-module.exports = parent;
-
-},{"../../es/object/create":47}],169:[function(require,module,exports){
-var parent = require('../../es/object/define-property');
-
-module.exports = parent;
-
-},{"../../es/object/define-property":48}],170:[function(require,module,exports){
-var parent = require('../es/parse-int');
-
-module.exports = parent;
-
-},{"../es/parse-int":49}],171:[function(require,module,exports){
-module.exports = [
-    {
-        'name': 'InAdlam',
-        'astral': '\uD83A[\uDD00-\uDD5F]'
-    },
-    {
-        'name': 'InAegean_Numbers',
-        'astral': '\uD800[\uDD00-\uDD3F]'
-    },
-    {
-        'name': 'InAhom',
-        'astral': '\uD805[\uDF00-\uDF3F]'
-    },
-    {
-        'name': 'InAlchemical_Symbols',
-        'astral': '\uD83D[\uDF00-\uDF7F]'
-    },
-    {
-        'name': 'InAlphabetic_Presentation_Forms',
-        'bmp': '\uFB00-\uFB4F'
-    },
-    {
-        'name': 'InAnatolian_Hieroglyphs',
-        'astral': '\uD811[\uDC00-\uDE7F]'
-    },
-    {
-        'name': 'InAncient_Greek_Musical_Notation',
-        'astral': '\uD834[\uDE00-\uDE4F]'
-    },
-    {
-        'name': 'InAncient_Greek_Numbers',
-        'astral': '\uD800[\uDD40-\uDD8F]'
-    },
-    {
-        'name': 'InAncient_Symbols',
-        'astral': '\uD800[\uDD90-\uDDCF]'
-    },
-    {
-        'name': 'InArabic',
-        'bmp': '\u0600-\u06FF'
-    },
-    {
-        'name': 'InArabic_Extended_A',
-        'bmp': '\u08A0-\u08FF'
-    },
-    {
-        'name': 'InArabic_Mathematical_Alphabetic_Symbols',
-        'astral': '\uD83B[\uDE00-\uDEFF]'
-    },
-    {
-        'name': 'InArabic_Presentation_Forms_A',
-        'bmp': '\uFB50-\uFDFF'
-    },
-    {
-        'name': 'InArabic_Presentation_Forms_B',
-        'bmp': '\uFE70-\uFEFF'
-    },
-    {
-        'name': 'InArabic_Supplement',
-        'bmp': '\u0750-\u077F'
-    },
-    {
-        'name': 'InArmenian',
-        'bmp': '\u0530-\u058F'
-    },
-    {
-        'name': 'InArrows',
-        'bmp': '\u2190-\u21FF'
-    },
-    {
-        'name': 'InAvestan',
-        'astral': '\uD802[\uDF00-\uDF3F]'
-    },
-    {
-        'name': 'InBalinese',
-        'bmp': '\u1B00-\u1B7F'
-    },
-    {
-        'name': 'InBamum',
-        'bmp': '\uA6A0-\uA6FF'
-    },
-    {
-        'name': 'InBamum_Supplement',
-        'astral': '\uD81A[\uDC00-\uDE3F]'
-    },
-    {
-        'name': 'InBasic_Latin',
-        'bmp': '\0-\x7F'
-    },
-    {
-        'name': 'InBassa_Vah',
-        'astral': '\uD81A[\uDED0-\uDEFF]'
-    },
-    {
-        'name': 'InBatak',
-        'bmp': '\u1BC0-\u1BFF'
-    },
-    {
-        'name': 'InBengali',
-        'bmp': '\u0980-\u09FF'
-    },
-    {
-        'name': 'InBhaiksuki',
-        'astral': '\uD807[\uDC00-\uDC6F]'
-    },
-    {
-        'name': 'InBlock_Elements',
-        'bmp': '\u2580-\u259F'
-    },
-    {
-        'name': 'InBopomofo',
-        'bmp': '\u3100-\u312F'
-    },
-    {
-        'name': 'InBopomofo_Extended',
-        'bmp': '\u31A0-\u31BF'
-    },
-    {
-        'name': 'InBox_Drawing',
-        'bmp': '\u2500-\u257F'
-    },
-    {
-        'name': 'InBrahmi',
-        'astral': '\uD804[\uDC00-\uDC7F]'
-    },
-    {
-        'name': 'InBraille_Patterns',
-        'bmp': '\u2800-\u28FF'
-    },
-    {
-        'name': 'InBuginese',
-        'bmp': '\u1A00-\u1A1F'
-    },
-    {
-        'name': 'InBuhid',
-        'bmp': '\u1740-\u175F'
-    },
-    {
-        'name': 'InByzantine_Musical_Symbols',
-        'astral': '\uD834[\uDC00-\uDCFF]'
-    },
-    {
-        'name': 'InCJK_Compatibility',
-        'bmp': '\u3300-\u33FF'
-    },
-    {
-        'name': 'InCJK_Compatibility_Forms',
-        'bmp': '\uFE30-\uFE4F'
-    },
-    {
-        'name': 'InCJK_Compatibility_Ideographs',
-        'bmp': '\uF900-\uFAFF'
-    },
-    {
-        'name': 'InCJK_Compatibility_Ideographs_Supplement',
-        'astral': '\uD87E[\uDC00-\uDE1F]'
-    },
-    {
-        'name': 'InCJK_Radicals_Supplement',
-        'bmp': '\u2E80-\u2EFF'
-    },
-    {
-        'name': 'InCJK_Strokes',
-        'bmp': '\u31C0-\u31EF'
-    },
-    {
-        'name': 'InCJK_Symbols_And_Punctuation',
-        'bmp': '\u3000-\u303F'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs',
-        'bmp': '\u4E00-\u9FFF'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs_Extension_A',
-        'bmp': '\u3400-\u4DBF'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs_Extension_B',
-        'astral': '[\uD840-\uD868][\uDC00-\uDFFF]|\uD869[\uDC00-\uDEDF]'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs_Extension_C',
-        'astral': '\uD869[\uDF00-\uDFFF]|[\uD86A-\uD86C][\uDC00-\uDFFF]|\uD86D[\uDC00-\uDF3F]'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs_Extension_D',
-        'astral': '\uD86D[\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1F]'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs_Extension_E',
-        'astral': '\uD86E[\uDC20-\uDFFF]|[\uD86F-\uD872][\uDC00-\uDFFF]|\uD873[\uDC00-\uDEAF]'
-    },
-    {
-        'name': 'InCJK_Unified_Ideographs_Extension_F',
-        'astral': '\uD873[\uDEB0-\uDFFF]|[\uD874-\uD879][\uDC00-\uDFFF]|\uD87A[\uDC00-\uDFEF]'
-    },
-    {
-        'name': 'InCarian',
-        'astral': '\uD800[\uDEA0-\uDEDF]'
-    },
-    {
-        'name': 'InCaucasian_Albanian',
-        'astral': '\uD801[\uDD30-\uDD6F]'
-    },
-    {
-        'name': 'InChakma',
-        'astral': '\uD804[\uDD00-\uDD4F]'
-    },
-    {
-        'name': 'InCham',
-        'bmp': '\uAA00-\uAA5F'
-    },
-    {
-        'name': 'InCherokee',
-        'bmp': '\u13A0-\u13FF'
-    },
-    {
-        'name': 'InCherokee_Supplement',
-        'bmp': '\uAB70-\uABBF'
-    },
-    {
-        'name': 'InChess_Symbols',
-        'astral': '\uD83E[\uDE00-\uDE6F]'
-    },
-    {
-        'name': 'InCombining_Diacritical_Marks',
-        'bmp': '\u0300-\u036F'
-    },
-    {
-        'name': 'InCombining_Diacritical_Marks_Extended',
-        'bmp': '\u1AB0-\u1AFF'
-    },
-    {
-        'name': 'InCombining_Diacritical_Marks_For_Symbols',
-        'bmp': '\u20D0-\u20FF'
-    },
-    {
-        'name': 'InCombining_Diacritical_Marks_Supplement',
-        'bmp': '\u1DC0-\u1DFF'
-    },
-    {
-        'name': 'InCombining_Half_Marks',
-        'bmp': '\uFE20-\uFE2F'
-    },
-    {
-        'name': 'InCommon_Indic_Number_Forms',
-        'bmp': '\uA830-\uA83F'
-    },
-    {
-        'name': 'InControl_Pictures',
-        'bmp': '\u2400-\u243F'
-    },
-    {
-        'name': 'InCoptic',
-        'bmp': '\u2C80-\u2CFF'
-    },
-    {
-        'name': 'InCoptic_Epact_Numbers',
-        'astral': '\uD800[\uDEE0-\uDEFF]'
-    },
-    {
-        'name': 'InCounting_Rod_Numerals',
-        'astral': '\uD834[\uDF60-\uDF7F]'
-    },
-    {
-        'name': 'InCuneiform',
-        'astral': '\uD808[\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'InCuneiform_Numbers_And_Punctuation',
-        'astral': '\uD809[\uDC00-\uDC7F]'
-    },
-    {
-        'name': 'InCurrency_Symbols',
-        'bmp': '\u20A0-\u20CF'
-    },
-    {
-        'name': 'InCypriot_Syllabary',
-        'astral': '\uD802[\uDC00-\uDC3F]'
-    },
-    {
-        'name': 'InCyrillic',
-        'bmp': '\u0400-\u04FF'
-    },
-    {
-        'name': 'InCyrillic_Extended_A',
-        'bmp': '\u2DE0-\u2DFF'
-    },
-    {
-        'name': 'InCyrillic_Extended_B',
-        'bmp': '\uA640-\uA69F'
-    },
-    {
-        'name': 'InCyrillic_Extended_C',
-        'bmp': '\u1C80-\u1C8F'
-    },
-    {
-        'name': 'InCyrillic_Supplement',
-        'bmp': '\u0500-\u052F'
-    },
-    {
-        'name': 'InDeseret',
-        'astral': '\uD801[\uDC00-\uDC4F]'
-    },
-    {
-        'name': 'InDevanagari',
-        'bmp': '\u0900-\u097F'
-    },
-    {
-        'name': 'InDevanagari_Extended',
-        'bmp': '\uA8E0-\uA8FF'
-    },
-    {
-        'name': 'InDingbats',
-        'bmp': '\u2700-\u27BF'
-    },
-    {
-        'name': 'InDogra',
-        'astral': '\uD806[\uDC00-\uDC4F]'
-    },
-    {
-        'name': 'InDomino_Tiles',
-        'astral': '\uD83C[\uDC30-\uDC9F]'
-    },
-    {
-        'name': 'InDuployan',
-        'astral': '\uD82F[\uDC00-\uDC9F]'
-    },
-    {
-        'name': 'InEarly_Dynastic_Cuneiform',
-        'astral': '\uD809[\uDC80-\uDD4F]'
-    },
-    {
-        'name': 'InEgyptian_Hieroglyphs',
-        'astral': '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F]'
-    },
-    {
-        'name': 'InElbasan',
-        'astral': '\uD801[\uDD00-\uDD2F]'
-    },
-    {
-        'name': 'InEmoticons',
-        'astral': '\uD83D[\uDE00-\uDE4F]'
-    },
-    {
-        'name': 'InEnclosed_Alphanumeric_Supplement',
-        'astral': '\uD83C[\uDD00-\uDDFF]'
-    },
-    {
-        'name': 'InEnclosed_Alphanumerics',
-        'bmp': '\u2460-\u24FF'
-    },
-    {
-        'name': 'InEnclosed_CJK_Letters_And_Months',
-        'bmp': '\u3200-\u32FF'
-    },
-    {
-        'name': 'InEnclosed_Ideographic_Supplement',
-        'astral': '\uD83C[\uDE00-\uDEFF]'
-    },
-    {
-        'name': 'InEthiopic',
-        'bmp': '\u1200-\u137F'
-    },
-    {
-        'name': 'InEthiopic_Extended',
-        'bmp': '\u2D80-\u2DDF'
-    },
-    {
-        'name': 'InEthiopic_Extended_A',
-        'bmp': '\uAB00-\uAB2F'
-    },
-    {
-        'name': 'InEthiopic_Supplement',
-        'bmp': '\u1380-\u139F'
-    },
-    {
-        'name': 'InGeneral_Punctuation',
-        'bmp': '\u2000-\u206F'
-    },
-    {
-        'name': 'InGeometric_Shapes',
-        'bmp': '\u25A0-\u25FF'
-    },
-    {
-        'name': 'InGeometric_Shapes_Extended',
-        'astral': '\uD83D[\uDF80-\uDFFF]'
-    },
-    {
-        'name': 'InGeorgian',
-        'bmp': '\u10A0-\u10FF'
-    },
-    {
-        'name': 'InGeorgian_Extended',
-        'bmp': '\u1C90-\u1CBF'
-    },
-    {
-        'name': 'InGeorgian_Supplement',
-        'bmp': '\u2D00-\u2D2F'
-    },
-    {
-        'name': 'InGlagolitic',
-        'bmp': '\u2C00-\u2C5F'
-    },
-    {
-        'name': 'InGlagolitic_Supplement',
-        'astral': '\uD838[\uDC00-\uDC2F]'
-    },
-    {
-        'name': 'InGothic',
-        'astral': '\uD800[\uDF30-\uDF4F]'
-    },
-    {
-        'name': 'InGrantha',
-        'astral': '\uD804[\uDF00-\uDF7F]'
-    },
-    {
-        'name': 'InGreek_And_Coptic',
-        'bmp': '\u0370-\u03FF'
-    },
-    {
-        'name': 'InGreek_Extended',
-        'bmp': '\u1F00-\u1FFF'
-    },
-    {
-        'name': 'InGujarati',
-        'bmp': '\u0A80-\u0AFF'
-    },
-    {
-        'name': 'InGunjala_Gondi',
-        'astral': '\uD807[\uDD60-\uDDAF]'
-    },
-    {
-        'name': 'InGurmukhi',
-        'bmp': '\u0A00-\u0A7F'
-    },
-    {
-        'name': 'InHalfwidth_And_Fullwidth_Forms',
-        'bmp': '\uFF00-\uFFEF'
-    },
-    {
-        'name': 'InHangul_Compatibility_Jamo',
-        'bmp': '\u3130-\u318F'
-    },
-    {
-        'name': 'InHangul_Jamo',
-        'bmp': '\u1100-\u11FF'
-    },
-    {
-        'name': 'InHangul_Jamo_Extended_A',
-        'bmp': '\uA960-\uA97F'
-    },
-    {
-        'name': 'InHangul_Jamo_Extended_B',
-        'bmp': '\uD7B0-\uD7FF'
-    },
-    {
-        'name': 'InHangul_Syllables',
-        'bmp': '\uAC00-\uD7AF'
-    },
-    {
-        'name': 'InHanifi_Rohingya',
-        'astral': '\uD803[\uDD00-\uDD3F]'
-    },
-    {
-        'name': 'InHanunoo',
-        'bmp': '\u1720-\u173F'
-    },
-    {
-        'name': 'InHatran',
-        'astral': '\uD802[\uDCE0-\uDCFF]'
-    },
-    {
-        'name': 'InHebrew',
-        'bmp': '\u0590-\u05FF'
-    },
-    {
-        'name': 'InHigh_Private_Use_Surrogates',
-        'bmp': '\uDB80-\uDBFF'
-    },
-    {
-        'name': 'InHigh_Surrogates',
-        'bmp': '\uD800-\uDB7F'
-    },
-    {
-        'name': 'InHiragana',
-        'bmp': '\u3040-\u309F'
-    },
-    {
-        'name': 'InIPA_Extensions',
-        'bmp': '\u0250-\u02AF'
-    },
-    {
-        'name': 'InIdeographic_Description_Characters',
-        'bmp': '\u2FF0-\u2FFF'
-    },
-    {
-        'name': 'InIdeographic_Symbols_And_Punctuation',
-        'astral': '\uD81B[\uDFE0-\uDFFF]'
-    },
-    {
-        'name': 'InImperial_Aramaic',
-        'astral': '\uD802[\uDC40-\uDC5F]'
-    },
-    {
-        'name': 'InIndic_Siyaq_Numbers',
-        'astral': '\uD83B[\uDC70-\uDCBF]'
-    },
-    {
-        'name': 'InInscriptional_Pahlavi',
-        'astral': '\uD802[\uDF60-\uDF7F]'
-    },
-    {
-        'name': 'InInscriptional_Parthian',
-        'astral': '\uD802[\uDF40-\uDF5F]'
-    },
-    {
-        'name': 'InJavanese',
-        'bmp': '\uA980-\uA9DF'
-    },
-    {
-        'name': 'InKaithi',
-        'astral': '\uD804[\uDC80-\uDCCF]'
-    },
-    {
-        'name': 'InKana_Extended_A',
-        'astral': '\uD82C[\uDD00-\uDD2F]'
-    },
-    {
-        'name': 'InKana_Supplement',
-        'astral': '\uD82C[\uDC00-\uDCFF]'
-    },
-    {
-        'name': 'InKanbun',
-        'bmp': '\u3190-\u319F'
-    },
-    {
-        'name': 'InKangxi_Radicals',
-        'bmp': '\u2F00-\u2FDF'
-    },
-    {
-        'name': 'InKannada',
-        'bmp': '\u0C80-\u0CFF'
-    },
-    {
-        'name': 'InKatakana',
-        'bmp': '\u30A0-\u30FF'
-    },
-    {
-        'name': 'InKatakana_Phonetic_Extensions',
-        'bmp': '\u31F0-\u31FF'
-    },
-    {
-        'name': 'InKayah_Li',
-        'bmp': '\uA900-\uA92F'
-    },
-    {
-        'name': 'InKharoshthi',
-        'astral': '\uD802[\uDE00-\uDE5F]'
-    },
-    {
-        'name': 'InKhmer',
-        'bmp': '\u1780-\u17FF'
-    },
-    {
-        'name': 'InKhmer_Symbols',
-        'bmp': '\u19E0-\u19FF'
-    },
-    {
-        'name': 'InKhojki',
-        'astral': '\uD804[\uDE00-\uDE4F]'
-    },
-    {
-        'name': 'InKhudawadi',
-        'astral': '\uD804[\uDEB0-\uDEFF]'
-    },
-    {
-        'name': 'InLao',
-        'bmp': '\u0E80-\u0EFF'
-    },
-    {
-        'name': 'InLatin_1_Supplement',
-        'bmp': '\x80-\xFF'
-    },
-    {
-        'name': 'InLatin_Extended_A',
-        'bmp': '\u0100-\u017F'
-    },
-    {
-        'name': 'InLatin_Extended_Additional',
-        'bmp': '\u1E00-\u1EFF'
-    },
-    {
-        'name': 'InLatin_Extended_B',
-        'bmp': '\u0180-\u024F'
-    },
-    {
-        'name': 'InLatin_Extended_C',
-        'bmp': '\u2C60-\u2C7F'
-    },
-    {
-        'name': 'InLatin_Extended_D',
-        'bmp': '\uA720-\uA7FF'
-    },
-    {
-        'name': 'InLatin_Extended_E',
-        'bmp': '\uAB30-\uAB6F'
-    },
-    {
-        'name': 'InLepcha',
-        'bmp': '\u1C00-\u1C4F'
-    },
-    {
-        'name': 'InLetterlike_Symbols',
-        'bmp': '\u2100-\u214F'
-    },
-    {
-        'name': 'InLimbu',
-        'bmp': '\u1900-\u194F'
-    },
-    {
-        'name': 'InLinear_A',
-        'astral': '\uD801[\uDE00-\uDF7F]'
-    },
-    {
-        'name': 'InLinear_B_Ideograms',
-        'astral': '\uD800[\uDC80-\uDCFF]'
-    },
-    {
-        'name': 'InLinear_B_Syllabary',
-        'astral': '\uD800[\uDC00-\uDC7F]'
-    },
-    {
-        'name': 'InLisu',
-        'bmp': '\uA4D0-\uA4FF'
-    },
-    {
-        'name': 'InLow_Surrogates',
-        'bmp': '\uDC00-\uDFFF'
-    },
-    {
-        'name': 'InLycian',
-        'astral': '\uD800[\uDE80-\uDE9F]'
-    },
-    {
-        'name': 'InLydian',
-        'astral': '\uD802[\uDD20-\uDD3F]'
-    },
-    {
-        'name': 'InMahajani',
-        'astral': '\uD804[\uDD50-\uDD7F]'
-    },
-    {
-        'name': 'InMahjong_Tiles',
-        'astral': '\uD83C[\uDC00-\uDC2F]'
-    },
-    {
-        'name': 'InMakasar',
-        'astral': '\uD807[\uDEE0-\uDEFF]'
-    },
-    {
-        'name': 'InMalayalam',
-        'bmp': '\u0D00-\u0D7F'
-    },
-    {
-        'name': 'InMandaic',
-        'bmp': '\u0840-\u085F'
-    },
-    {
-        'name': 'InManichaean',
-        'astral': '\uD802[\uDEC0-\uDEFF]'
-    },
-    {
-        'name': 'InMarchen',
-        'astral': '\uD807[\uDC70-\uDCBF]'
-    },
-    {
-        'name': 'InMasaram_Gondi',
-        'astral': '\uD807[\uDD00-\uDD5F]'
-    },
-    {
-        'name': 'InMathematical_Alphanumeric_Symbols',
-        'astral': '\uD835[\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'InMathematical_Operators',
-        'bmp': '\u2200-\u22FF'
-    },
-    {
-        'name': 'InMayan_Numerals',
-        'astral': '\uD834[\uDEE0-\uDEFF]'
-    },
-    {
-        'name': 'InMedefaidrin',
-        'astral': '\uD81B[\uDE40-\uDE9F]'
-    },
-    {
-        'name': 'InMeetei_Mayek',
-        'bmp': '\uABC0-\uABFF'
-    },
-    {
-        'name': 'InMeetei_Mayek_Extensions',
-        'bmp': '\uAAE0-\uAAFF'
-    },
-    {
-        'name': 'InMende_Kikakui',
-        'astral': '\uD83A[\uDC00-\uDCDF]'
-    },
-    {
-        'name': 'InMeroitic_Cursive',
-        'astral': '\uD802[\uDDA0-\uDDFF]'
-    },
-    {
-        'name': 'InMeroitic_Hieroglyphs',
-        'astral': '\uD802[\uDD80-\uDD9F]'
-    },
-    {
-        'name': 'InMiao',
-        'astral': '\uD81B[\uDF00-\uDF9F]'
-    },
-    {
-        'name': 'InMiscellaneous_Mathematical_Symbols_A',
-        'bmp': '\u27C0-\u27EF'
-    },
-    {
-        'name': 'InMiscellaneous_Mathematical_Symbols_B',
-        'bmp': '\u2980-\u29FF'
-    },
-    {
-        'name': 'InMiscellaneous_Symbols',
-        'bmp': '\u2600-\u26FF'
-    },
-    {
-        'name': 'InMiscellaneous_Symbols_And_Arrows',
-        'bmp': '\u2B00-\u2BFF'
-    },
-    {
-        'name': 'InMiscellaneous_Symbols_And_Pictographs',
-        'astral': '\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF]'
-    },
-    {
-        'name': 'InMiscellaneous_Technical',
-        'bmp': '\u2300-\u23FF'
-    },
-    {
-        'name': 'InModi',
-        'astral': '\uD805[\uDE00-\uDE5F]'
-    },
-    {
-        'name': 'InModifier_Tone_Letters',
-        'bmp': '\uA700-\uA71F'
-    },
-    {
-        'name': 'InMongolian',
-        'bmp': '\u1800-\u18AF'
-    },
-    {
-        'name': 'InMongolian_Supplement',
-        'astral': '\uD805[\uDE60-\uDE7F]'
-    },
-    {
-        'name': 'InMro',
-        'astral': '\uD81A[\uDE40-\uDE6F]'
-    },
-    {
-        'name': 'InMultani',
-        'astral': '\uD804[\uDE80-\uDEAF]'
-    },
-    {
-        'name': 'InMusical_Symbols',
-        'astral': '\uD834[\uDD00-\uDDFF]'
-    },
-    {
-        'name': 'InMyanmar',
-        'bmp': '\u1000-\u109F'
-    },
-    {
-        'name': 'InMyanmar_Extended_A',
-        'bmp': '\uAA60-\uAA7F'
-    },
-    {
-        'name': 'InMyanmar_Extended_B',
-        'bmp': '\uA9E0-\uA9FF'
-    },
-    {
-        'name': 'InNKo',
-        'bmp': '\u07C0-\u07FF'
-    },
-    {
-        'name': 'InNabataean',
-        'astral': '\uD802[\uDC80-\uDCAF]'
-    },
-    {
-        'name': 'InNew_Tai_Lue',
-        'bmp': '\u1980-\u19DF'
-    },
-    {
-        'name': 'InNewa',
-        'astral': '\uD805[\uDC00-\uDC7F]'
-    },
-    {
-        'name': 'InNumber_Forms',
-        'bmp': '\u2150-\u218F'
-    },
-    {
-        'name': 'InNushu',
-        'astral': '\uD82C[\uDD70-\uDEFF]'
-    },
-    {
-        'name': 'InOgham',
-        'bmp': '\u1680-\u169F'
-    },
-    {
-        'name': 'InOl_Chiki',
-        'bmp': '\u1C50-\u1C7F'
-    },
-    {
-        'name': 'InOld_Hungarian',
-        'astral': '\uD803[\uDC80-\uDCFF]'
-    },
-    {
-        'name': 'InOld_Italic',
-        'astral': '\uD800[\uDF00-\uDF2F]'
-    },
-    {
-        'name': 'InOld_North_Arabian',
-        'astral': '\uD802[\uDE80-\uDE9F]'
-    },
-    {
-        'name': 'InOld_Permic',
-        'astral': '\uD800[\uDF50-\uDF7F]'
-    },
-    {
-        'name': 'InOld_Persian',
-        'astral': '\uD800[\uDFA0-\uDFDF]'
-    },
-    {
-        'name': 'InOld_Sogdian',
-        'astral': '\uD803[\uDF00-\uDF2F]'
-    },
-    {
-        'name': 'InOld_South_Arabian',
-        'astral': '\uD802[\uDE60-\uDE7F]'
-    },
-    {
-        'name': 'InOld_Turkic',
-        'astral': '\uD803[\uDC00-\uDC4F]'
-    },
-    {
-        'name': 'InOptical_Character_Recognition',
-        'bmp': '\u2440-\u245F'
-    },
-    {
-        'name': 'InOriya',
-        'bmp': '\u0B00-\u0B7F'
-    },
-    {
-        'name': 'InOrnamental_Dingbats',
-        'astral': '\uD83D[\uDE50-\uDE7F]'
-    },
-    {
-        'name': 'InOsage',
-        'astral': '\uD801[\uDCB0-\uDCFF]'
-    },
-    {
-        'name': 'InOsmanya',
-        'astral': '\uD801[\uDC80-\uDCAF]'
-    },
-    {
-        'name': 'InPahawh_Hmong',
-        'astral': '\uD81A[\uDF00-\uDF8F]'
-    },
-    {
-        'name': 'InPalmyrene',
-        'astral': '\uD802[\uDC60-\uDC7F]'
-    },
-    {
-        'name': 'InPau_Cin_Hau',
-        'astral': '\uD806[\uDEC0-\uDEFF]'
-    },
-    {
-        'name': 'InPhags_Pa',
-        'bmp': '\uA840-\uA87F'
-    },
-    {
-        'name': 'InPhaistos_Disc',
-        'astral': '\uD800[\uDDD0-\uDDFF]'
-    },
-    {
-        'name': 'InPhoenician',
-        'astral': '\uD802[\uDD00-\uDD1F]'
-    },
-    {
-        'name': 'InPhonetic_Extensions',
-        'bmp': '\u1D00-\u1D7F'
-    },
-    {
-        'name': 'InPhonetic_Extensions_Supplement',
-        'bmp': '\u1D80-\u1DBF'
-    },
-    {
-        'name': 'InPlaying_Cards',
-        'astral': '\uD83C[\uDCA0-\uDCFF]'
-    },
-    {
-        'name': 'InPrivate_Use_Area',
-        'bmp': '\uE000-\uF8FF'
-    },
-    {
-        'name': 'InPsalter_Pahlavi',
-        'astral': '\uD802[\uDF80-\uDFAF]'
-    },
-    {
-        'name': 'InRejang',
-        'bmp': '\uA930-\uA95F'
-    },
-    {
-        'name': 'InRumi_Numeral_Symbols',
-        'astral': '\uD803[\uDE60-\uDE7F]'
-    },
-    {
-        'name': 'InRunic',
-        'bmp': '\u16A0-\u16FF'
-    },
-    {
-        'name': 'InSamaritan',
-        'bmp': '\u0800-\u083F'
-    },
-    {
-        'name': 'InSaurashtra',
-        'bmp': '\uA880-\uA8DF'
-    },
-    {
-        'name': 'InSharada',
-        'astral': '\uD804[\uDD80-\uDDDF]'
-    },
-    {
-        'name': 'InShavian',
-        'astral': '\uD801[\uDC50-\uDC7F]'
-    },
-    {
-        'name': 'InShorthand_Format_Controls',
-        'astral': '\uD82F[\uDCA0-\uDCAF]'
-    },
-    {
-        'name': 'InSiddham',
-        'astral': '\uD805[\uDD80-\uDDFF]'
-    },
-    {
-        'name': 'InSinhala',
-        'bmp': '\u0D80-\u0DFF'
-    },
-    {
-        'name': 'InSinhala_Archaic_Numbers',
-        'astral': '\uD804[\uDDE0-\uDDFF]'
-    },
-    {
-        'name': 'InSmall_Form_Variants',
-        'bmp': '\uFE50-\uFE6F'
-    },
-    {
-        'name': 'InSogdian',
-        'astral': '\uD803[\uDF30-\uDF6F]'
-    },
-    {
-        'name': 'InSora_Sompeng',
-        'astral': '\uD804[\uDCD0-\uDCFF]'
-    },
-    {
-        'name': 'InSoyombo',
-        'astral': '\uD806[\uDE50-\uDEAF]'
-    },
-    {
-        'name': 'InSpacing_Modifier_Letters',
-        'bmp': '\u02B0-\u02FF'
-    },
-    {
-        'name': 'InSpecials',
-        'bmp': '\uFFF0-\uFFFF'
-    },
-    {
-        'name': 'InSundanese',
-        'bmp': '\u1B80-\u1BBF'
-    },
-    {
-        'name': 'InSundanese_Supplement',
-        'bmp': '\u1CC0-\u1CCF'
-    },
-    {
-        'name': 'InSuperscripts_And_Subscripts',
-        'bmp': '\u2070-\u209F'
-    },
-    {
-        'name': 'InSupplemental_Arrows_A',
-        'bmp': '\u27F0-\u27FF'
-    },
-    {
-        'name': 'InSupplemental_Arrows_B',
-        'bmp': '\u2900-\u297F'
-    },
-    {
-        'name': 'InSupplemental_Arrows_C',
-        'astral': '\uD83E[\uDC00-\uDCFF]'
-    },
-    {
-        'name': 'InSupplemental_Mathematical_Operators',
-        'bmp': '\u2A00-\u2AFF'
-    },
-    {
-        'name': 'InSupplemental_Punctuation',
-        'bmp': '\u2E00-\u2E7F'
-    },
-    {
-        'name': 'InSupplemental_Symbols_And_Pictographs',
-        'astral': '\uD83E[\uDD00-\uDDFF]'
-    },
-    {
-        'name': 'InSupplementary_Private_Use_Area_A',
-        'astral': '[\uDB80-\uDBBF][\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'InSupplementary_Private_Use_Area_B',
-        'astral': '[\uDBC0-\uDBFF][\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'InSutton_SignWriting',
-        'astral': '\uD836[\uDC00-\uDEAF]'
-    },
-    {
-        'name': 'InSyloti_Nagri',
-        'bmp': '\uA800-\uA82F'
-    },
-    {
-        'name': 'InSyriac',
-        'bmp': '\u0700-\u074F'
-    },
-    {
-        'name': 'InSyriac_Supplement',
-        'bmp': '\u0860-\u086F'
-    },
-    {
-        'name': 'InTagalog',
-        'bmp': '\u1700-\u171F'
-    },
-    {
-        'name': 'InTagbanwa',
-        'bmp': '\u1760-\u177F'
-    },
-    {
-        'name': 'InTags',
-        'astral': '\uDB40[\uDC00-\uDC7F]'
-    },
-    {
-        'name': 'InTai_Le',
-        'bmp': '\u1950-\u197F'
-    },
-    {
-        'name': 'InTai_Tham',
-        'bmp': '\u1A20-\u1AAF'
-    },
-    {
-        'name': 'InTai_Viet',
-        'bmp': '\uAA80-\uAADF'
-    },
-    {
-        'name': 'InTai_Xuan_Jing_Symbols',
-        'astral': '\uD834[\uDF00-\uDF5F]'
-    },
-    {
-        'name': 'InTakri',
-        'astral': '\uD805[\uDE80-\uDECF]'
-    },
-    {
-        'name': 'InTamil',
-        'bmp': '\u0B80-\u0BFF'
-    },
-    {
-        'name': 'InTangut',
-        'astral': '[\uD81C-\uD821][\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'InTangut_Components',
-        'astral': '\uD822[\uDC00-\uDEFF]'
-    },
-    {
-        'name': 'InTelugu',
-        'bmp': '\u0C00-\u0C7F'
-    },
-    {
-        'name': 'InThaana',
-        'bmp': '\u0780-\u07BF'
-    },
-    {
-        'name': 'InThai',
-        'bmp': '\u0E00-\u0E7F'
-    },
-    {
-        'name': 'InTibetan',
-        'bmp': '\u0F00-\u0FFF'
-    },
-    {
-        'name': 'InTifinagh',
-        'bmp': '\u2D30-\u2D7F'
-    },
-    {
-        'name': 'InTirhuta',
-        'astral': '\uD805[\uDC80-\uDCDF]'
-    },
-    {
-        'name': 'InTransport_And_Map_Symbols',
-        'astral': '\uD83D[\uDE80-\uDEFF]'
-    },
-    {
-        'name': 'InUgaritic',
-        'astral': '\uD800[\uDF80-\uDF9F]'
-    },
-    {
-        'name': 'InUnified_Canadian_Aboriginal_Syllabics',
-        'bmp': '\u1400-\u167F'
-    },
-    {
-        'name': 'InUnified_Canadian_Aboriginal_Syllabics_Extended',
-        'bmp': '\u18B0-\u18FF'
-    },
-    {
-        'name': 'InVai',
-        'bmp': '\uA500-\uA63F'
-    },
-    {
-        'name': 'InVariation_Selectors',
-        'bmp': '\uFE00-\uFE0F'
-    },
-    {
-        'name': 'InVariation_Selectors_Supplement',
-        'astral': '\uDB40[\uDD00-\uDDEF]'
-    },
-    {
-        'name': 'InVedic_Extensions',
-        'bmp': '\u1CD0-\u1CFF'
-    },
-    {
-        'name': 'InVertical_Forms',
-        'bmp': '\uFE10-\uFE1F'
-    },
-    {
-        'name': 'InWarang_Citi',
-        'astral': '\uD806[\uDCA0-\uDCFF]'
-    },
-    {
-        'name': 'InYi_Radicals',
-        'bmp': '\uA490-\uA4CF'
-    },
-    {
-        'name': 'InYi_Syllables',
-        'bmp': '\uA000-\uA48F'
-    },
-    {
-        'name': 'InYijing_Hexagram_Symbols',
-        'bmp': '\u4DC0-\u4DFF'
-    },
-    {
-        'name': 'InZanabazar_Square',
-        'astral': '\uD806[\uDE00-\uDE4F]'
-    },
-    {
-        'name': 'Inundefined',
-        'astral': '\uD803[\uDFE0-\uDFFF]|\uD806[\uDDA0-\uDDFF]|\uD807[\uDFC0-\uDFFF]|\uD80D[\uDC30-\uDC3F]|\uD82C[\uDD30-\uDD6F]|\uD838[\uDD00-\uDD4F\uDEC0-\uDEFF]|\uD83B[\uDD00-\uDD4F]|\uD83E[\uDE70-\uDEFF]'
-    }
-];
-
-},{}],172:[function(require,module,exports){
-module.exports = [
-    {
-        'name': 'C',
-        'alias': 'Other',
-        'isBmpLast': true,
-        'bmp': '\0-\x1F\x7F-\x9F\xAD\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EE\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB\u07FC\u082E\u082F\u083F\u085C\u085D\u085F\u086B-\u089F\u08B5\u08BE-\u08D2\u08E2\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A77-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C76\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D04\u0D0D\u0D11\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180E\u180F\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1C8F\u1CBB\u1CBC\u1CC8-\u1CCF\u1CFB-\u1CFF\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20C0-\u20CF\u20F1-\u20FF\u218C-\u218F\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E50-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u4DB6-\u4DBF\u9FF0-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7C0\uA7C1\uA7C7-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB68-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF',
-        'astral': '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE49-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD28-\uDD2F\uDD3A-\uDE5F\uDE7F-\uDEFF\uDF28-\uDF2F\uDF5A-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCBD\uDCC2-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD47-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC60-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB9-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC3C-\uDC9F\uDCF3-\uDCFE\uDD00-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE5-\uDDFF\uDE48-\uDE4F\uDEA3-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF9-\uDFBF\uDFF2-\uDFFE]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD87B-\uD87D\uD87F-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE9B-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE4-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDD1F-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA0-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD73-\uDD7A\uDDE9-\uDDFF\uDE46-\uDEDF\uDEF4-\uDEFF\uDF57-\uDF5F\uDF79-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD50-\uDEBF\uDEFA-\uDEFE\uDF00-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDC70\uDCB5-\uDD00\uDD3E-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD6D-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED6-\uDEDF\uDEED-\uDEEF\uDEFB-\uDEFF\uDF74-\uDF7F\uDFD9-\uDFDF\uDFEC-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDCFF\uDD0C\uDD72\uDD77-\uDD79\uDDA3\uDDA4\uDDAB-\uDDAD\uDDCB\uDDCC\uDE54-\uDE5F\uDE6E\uDE6F\uDE74-\uDE77\uDE7B-\uDE7F\uDE83-\uDE8F\uDE96-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]'
-    },
-    {
-        'name': 'Cc',
-        'alias': 'Control',
-        'bmp': '\0-\x1F\x7F-\x9F'
-    },
-    {
-        'name': 'Cf',
-        'alias': 'Format',
-        'bmp': '\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB',
-        'astral': '\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC38]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]'
-    },
-    {
-        'name': 'Cn',
-        'alias': 'Unassigned',
-        'bmp': '\u0378\u0379\u0380-\u0383\u038B\u038D\u03A2\u0530\u0557\u0558\u058B\u058C\u0590\u05C8-\u05CF\u05EB-\u05EE\u05F5-\u05FF\u061D\u070E\u074B\u074C\u07B2-\u07BF\u07FB\u07FC\u082E\u082F\u083F\u085C\u085D\u085F\u086B-\u089F\u08B5\u08BE-\u08D2\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A77-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0BFF\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C76\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D04\u0D0D\u0D11\u0D45\u0D49\u0D50-\u0D53\u0D64\u0D65\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F6\u13F7\u13FE\u13FF\u169D-\u169F\u16F9-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE\u1AAF\u1ABF-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C89-\u1C8F\u1CBB\u1CBC\u1CC8-\u1CCF\u1CFB-\u1CFF\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u2065\u2072\u2073\u208F\u209D-\u209F\u20C0-\u20CF\u20F1-\u20FF\u218C-\u218F\u2427-\u243F\u244B-\u245F\u2B74\u2B75\u2B96\u2B97\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E50-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u4DB6-\u4DBF\u9FF0-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA6F8-\uA6FF\uA7C0\uA7C1\uA7C7-\uA7F6\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C6-\uA8CD\uA8DA-\uA8DF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB68-\uAB6F\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD\uFEFE\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFF8\uFFFE\uFFFF',
-        'astral': '\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDCFF\uDD03-\uDD06\uDD34-\uDD36\uDD8F\uDD9C-\uDD9F\uDDA1-\uDDCF\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEFC-\uDEFF\uDF24-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDFC4-\uDFC7\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDD6E\uDD70-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56\uDC9F-\uDCA6\uDCB0-\uDCDF\uDCF3\uDCF6-\uDCFA\uDD1C-\uDD1E\uDD3A-\uDD3E\uDD40-\uDD7F\uDDB8-\uDDBB\uDDD0\uDDD1\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE49-\uDE4F\uDE59-\uDE5F\uDEA0-\uDEBF\uDEE7-\uDEEA\uDEF7-\uDEFF\uDF36-\uDF38\uDF56\uDF57\uDF73-\uDF77\uDF92-\uDF98\uDF9D-\uDFA8\uDFB0-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCF9\uDD28-\uDD2F\uDD3A-\uDE5F\uDE7F-\uDEFF\uDF28-\uDF2F\uDF5A-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC4E-\uDC51\uDC70-\uDC7E\uDCC2-\uDCCC\uDCCE\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD47-\uDD4F\uDD77-\uDD7F\uDDCE\uDDCF\uDDE0\uDDF5-\uDDFF\uDE12\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEAA-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC5A\uDC5C\uDC60-\uDC7F\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDDE-\uDDFF\uDE45-\uDE4F\uDE5A-\uDE5F\uDE6D-\uDE7F\uDEB9-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF40-\uDFFF]|\uD806[\uDC3C-\uDC9F\uDCF3-\uDCFE\uDD00-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE5-\uDDFF\uDE48-\uDE4F\uDEA3-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC46-\uDC4F\uDC6D-\uDC6F\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF9-\uDFBF\uDFF2-\uDFFE]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F\uDC75-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD823-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83F\uD87B-\uD87D\uD87F-\uDB3F\uDB41-\uDB7F][\uDC00-\uDFFF]|\uD80D[\uDC2F\uDC39-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDE6D\uDE70-\uDECF\uDEEE\uDEEF\uDEF6-\uDEFF\uDF46-\uDF4F\uDF5A\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE9B-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE4-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD822[\uDEF3-\uDFFF]|\uD82C[\uDD1F-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A\uDC9B\uDCA4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDDE9-\uDDFF\uDE46-\uDEDF\uDEF4-\uDEFF\uDF57-\uDF5F\uDF79-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDFCC\uDFCD]|\uD836[\uDE8C-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD50-\uDEBF\uDEFA-\uDEFE\uDF00-\uDFFF]|\uD83A[\uDCC5\uDCC6\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDC70\uDCB5-\uDD00\uDD3E-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDCFF\uDD0D-\uDD0F\uDD6D-\uDD6F\uDDAD-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED6-\uDEDF\uDEED-\uDEEF\uDEFB-\uDEFF\uDF74-\uDF7F\uDFD9-\uDFDF\uDFEC-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE-\uDCFF\uDD0C\uDD72\uDD77-\uDD79\uDDA3\uDDA4\uDDAB-\uDDAD\uDDCB\uDDCC\uDE54-\uDE5F\uDE6E\uDE6F\uDE74-\uDE77\uDE7B-\uDE7F\uDE83-\uDE8F\uDE96-\uDFFF]|\uD869[\uDED7-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uDB40[\uDC00\uDC02-\uDC1F\uDC80-\uDCFF\uDDF0-\uDFFF]|[\uDBBF\uDBFF][\uDFFE\uDFFF]'
-    },
-    {
-        'name': 'Co',
-        'alias': 'Private_Use',
-        'bmp': '\uE000-\uF8FF',
-        'astral': '[\uDB80-\uDBBE\uDBC0-\uDBFE][\uDC00-\uDFFF]|[\uDBBF\uDBFF][\uDC00-\uDFFD]'
-    },
-    {
-        'name': 'Cs',
-        'alias': 'Surrogate',
-        'bmp': '\uD800-\uDFFF'
-    },
-    {
-        'name': 'L',
-        'alias': 'Letter',
-        'bmp': 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7C6\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB67\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC',
-        'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDEC0-\uDEEB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]'
-    },
-    {
-        'name': 'LC',
-        'alias': 'Cased_Letter',
-        'bmp': 'A-Za-z\xB5\xC0-\xD6\xD8-\xF6\xF8-\u01BA\u01BC-\u01BF\u01C4-\u0293\u0295-\u02AF\u0370-\u0373\u0376\u0377\u037B-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0560-\u0588\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FD-\u10FF\u13A0-\u13F5\u13F8-\u13FD\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2134\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2C7B\u2C7E-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA640-\uA66D\uA680-\uA69B\uA722-\uA76F\uA771-\uA787\uA78B-\uA78E\uA790-\uA7BF\uA7C2-\uA7C6\uA7FA\uAB30-\uAB5A\uAB60-\uAB67\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF21-\uFF3A\uFF41-\uFF5A',
-        'astral': '\uD801[\uDC00-\uDC4F\uDCB0-\uDCD3\uDCD8-\uDCFB]|\uD803[\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD806[\uDCA0-\uDCDF]|\uD81B[\uDE40-\uDE7F]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDD00-\uDD43]'
-    },
-    {
-        'name': 'Ll',
-        'alias': 'Lowercase_Letter',
-        'bmp': 'a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7BB\uA7BD\uA7BF\uA7C3\uA7FA\uAB30-\uAB5A\uAB60-\uAB67\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A',
-        'astral': '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD81B[\uDE60-\uDE7F]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD83A[\uDD22-\uDD43]'
-    },
-    {
-        'name': 'Lm',
-        'alias': 'Modifier_Letter',
-        'bmp': '\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5\u06E6\u07F4\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C\uA69D\uA717-\uA71F\uA770\uA788\uA7F8\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E\uFF9F',
-        'astral': '\uD81A[\uDF40-\uDF43]|\uD81B[\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD838[\uDD37-\uDD3D]|\uD83A\uDD4B'
-    },
-    {
-        'name': 'Lo',
-        'alias': 'Other_Letter',
-        'bmp': '\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05EF-\u05F2\u0620-\u063F\u0641-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E45\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC',
-        'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC50-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDD00-\uDD23\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A]|\uD806[\uDC00-\uDC2B\uDCFF\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF4A\uDF50]|\uD821[\uDC00-\uDFF7]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD838[\uDD00-\uDD2C\uDD4E\uDEC0-\uDEEB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]'
-    },
-    {
-        'name': 'Lt',
-        'alias': 'Titlecase_Letter',
-        'bmp': '\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC'
-    },
-    {
-        'name': 'Lu',
-        'alias': 'Uppercase_Letter',
-        'bmp': 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uA7BA\uA7BC\uA7BE\uA7C2\uA7C4-\uA7C6\uFF21-\uFF3A',
-        'astral': '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD81B[\uDE40-\uDE5F]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]'
-    },
-    {
-        'name': 'M',
-        'alias': 'Mark',
-        'bmp': '\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F',
-        'astral': '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD803[\uDD24-\uDD27\uDF46-\uDF50]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD45\uDD46\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDDC9-\uDDCC\uDE2C-\uDE37\uDE3E\uDEDF-\uDEEA\uDF00-\uDF03\uDF3B\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC35-\uDC46\uDC5E\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDDDC\uDDDD\uDE30-\uDE40\uDEAB-\uDEB7\uDF1D-\uDF2B]|\uD806[\uDC2C-\uDC3A\uDDD1-\uDDD7\uDDDA-\uDDE0\uDDE4\uDE01-\uDE0A\uDE33-\uDE39\uDE3B-\uDE3E\uDE47\uDE51-\uDE5B\uDE8A-\uDE99]|\uD807[\uDC2F-\uDC36\uDC38-\uDC3F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD31-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD45\uDD47\uDD8A-\uDD8E\uDD90\uDD91\uDD93-\uDD97\uDEF3-\uDEF6]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF4F\uDF51-\uDF87\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD30-\uDD36\uDEEC-\uDEEF]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]'
-    },
-    {
-        'name': 'Mc',
-        'alias': 'Spacing_Mark',
-        'bmp': '\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E\u094F\u0982\u0983\u09BE-\u09C0\u09C7\u09C8\u09CB\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB\u0ACC\u0B02\u0B03\u0B3E\u0B40\u0B47\u0B48\u0B4B\u0B4C\u0B57\u0BBE\u0BBF\u0BC1\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7\u0CC8\u0CCA\u0CCB\u0CD5\u0CD6\u0D02\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2\u0DF3\u0F3E\u0F3F\u0F7F\u102B\u102C\u1031\u1038\u103B\u103C\u1056\u1057\u1062-\u1064\u1067-\u106D\u1083\u1084\u1087-\u108C\u108F\u109A-\u109C\u17B6\u17BE-\u17C5\u17C7\u17C8\u1923-\u1926\u1929-\u192B\u1930\u1931\u1933-\u1938\u1A19\u1A1A\u1A55\u1A57\u1A61\u1A63\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43\u1B44\u1B82\u1BA1\u1BA6\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2\u1BF3\u1C24-\u1C2B\u1C34\u1C35\u1CE1\u1CF7\u302E\u302F\uA823\uA824\uA827\uA880\uA881\uA8B4-\uA8C3\uA952\uA953\uA983\uA9B4\uA9B5\uA9BA\uA9BB\uA9BE-\uA9C0\uAA2F\uAA30\uAA33\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE\uAAEF\uAAF5\uABE3\uABE4\uABE6\uABE7\uABE9\uABEA\uABEC',
-        'astral': '\uD804[\uDC00\uDC02\uDC82\uDCB0-\uDCB2\uDCB7\uDCB8\uDD2C\uDD45\uDD46\uDD82\uDDB3-\uDDB5\uDDBF\uDDC0\uDE2C-\uDE2E\uDE32\uDE33\uDE35\uDEE0-\uDEE2\uDF02\uDF03\uDF3E\uDF3F\uDF41-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63]|\uD805[\uDC35-\uDC37\uDC40\uDC41\uDC45\uDCB0-\uDCB2\uDCB9\uDCBB-\uDCBE\uDCC1\uDDAF-\uDDB1\uDDB8-\uDDBB\uDDBE\uDE30-\uDE32\uDE3B\uDE3C\uDE3E\uDEAC\uDEAE\uDEAF\uDEB6\uDF20\uDF21\uDF26]|\uD806[\uDC2C-\uDC2E\uDC38\uDDD1-\uDDD3\uDDDC-\uDDDF\uDDE4\uDE39\uDE57\uDE58\uDE97]|\uD807[\uDC2F\uDC3E\uDCA9\uDCB1\uDCB4\uDD8A-\uDD8E\uDD93\uDD94\uDD96\uDEF5\uDEF6]|\uD81B[\uDF51-\uDF87]|\uD834[\uDD65\uDD66\uDD6D-\uDD72]'
-    },
-    {
-        'name': 'Me',
-        'alias': 'Enclosing_Mark',
-        'bmp': '\u0488\u0489\u1ABE\u20DD-\u20E0\u20E2-\u20E4\uA670-\uA672'
-    },
-    {
-        'name': 'Mn',
-        'alias': 'Nonspacing_Mark',
-        'bmp': '\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2\u09E3\u09FE\u0A01\u0A02\u0A3C\u0A41\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7\u0AC8\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C04\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC\u0CCD\u0CE2\u0CE3\u0D00\u0D01\u0D3B\u0D3C\u0D41-\u0D44\u0D4D\u0D62\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039\u103A\u103D\u103E\u1058\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193B\u1A17\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80\u1B81\u1BA2-\u1BA5\u1BA8\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099\u309A\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA825\uA826\uA8C4\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9BD\uA9E5\uAA29-\uAA2E\uAA31\uAA32\uAA35\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEC\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F',
-        'astral': '\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD803[\uDD24-\uDD27\uDF46-\uDF50]|\uD804[\uDC01\uDC38-\uDC46\uDC7F-\uDC81\uDCB3-\uDCB6\uDCB9\uDCBA\uDD00-\uDD02\uDD27-\uDD2B\uDD2D-\uDD34\uDD73\uDD80\uDD81\uDDB6-\uDDBE\uDDC9-\uDDCC\uDE2F-\uDE31\uDE34\uDE36\uDE37\uDE3E\uDEDF\uDEE3-\uDEEA\uDF00\uDF01\uDF3B\uDF3C\uDF40\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC38-\uDC3F\uDC42-\uDC44\uDC46\uDC5E\uDCB3-\uDCB8\uDCBA\uDCBF\uDCC0\uDCC2\uDCC3\uDDB2-\uDDB5\uDDBC\uDDBD\uDDBF\uDDC0\uDDDC\uDDDD\uDE33-\uDE3A\uDE3D\uDE3F\uDE40\uDEAB\uDEAD\uDEB0-\uDEB5\uDEB7\uDF1D-\uDF1F\uDF22-\uDF25\uDF27-\uDF2B]|\uD806[\uDC2F-\uDC37\uDC39\uDC3A\uDDD4-\uDDD7\uDDDA\uDDDB\uDDE0\uDE01-\uDE0A\uDE33-\uDE38\uDE3B-\uDE3E\uDE47\uDE51-\uDE56\uDE59-\uDE5B\uDE8A-\uDE96\uDE98\uDE99]|\uD807[\uDC30-\uDC36\uDC38-\uDC3D\uDC3F\uDC92-\uDCA7\uDCAA-\uDCB0\uDCB2\uDCB3\uDCB5\uDCB6\uDD31-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD45\uDD47\uDD90\uDD91\uDD95\uDD97\uDEF3\uDEF4]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF4F\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD30-\uDD36\uDEEC-\uDEEF]|\uD83A[\uDCD0-\uDCD6\uDD44-\uDD4A]|\uDB40[\uDD00-\uDDEF]'
-    },
-    {
-        'name': 'N',
-        'alias': 'Number',
-        'bmp': '0-9\xB2\xB3\xB9\xBC-\xBE\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F\u0C78-\u0C7E\u0CE6-\u0CEF\u0D58-\u0D5E\u0D66-\u0D78\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19',
-        'astral': '\uD800[\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23\uDF41\uDF4A\uDFD1-\uDFD5]|\uD801[\uDCA0-\uDCA9]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE48\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDD30-\uDD39\uDE60-\uDE7E\uDF1D-\uDF26\uDF51-\uDF54]|\uD804[\uDC52-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDDE1-\uDDF4\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF3B]|\uD806[\uDCE0-\uDCF2]|\uD807[\uDC50-\uDC6C\uDD50-\uDD59\uDDA0-\uDDA9\uDFC0-\uDFD4]|\uD809[\uDC00-\uDC6E]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59\uDF5B-\uDF61]|\uD81B[\uDE80-\uDE96]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDFCE-\uDFFF]|\uD838[\uDD40-\uDD49\uDEF0-\uDEF9]|\uD83A[\uDCC7-\uDCCF\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D]|\uD83C[\uDD00-\uDD0C]'
-    },
-    {
-        'name': 'Nd',
-        'alias': 'Decimal_Number',
-        'bmp': '0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19',
-        'astral': '\uD801[\uDCA0-\uDCA9]|\uD803[\uDD30-\uDD39]|\uD804[\uDC66-\uDC6F\uDCF0-\uDCF9\uDD36-\uDD3F\uDDD0-\uDDD9\uDEF0-\uDEF9]|\uD805[\uDC50-\uDC59\uDCD0-\uDCD9\uDE50-\uDE59\uDEC0-\uDEC9\uDF30-\uDF39]|\uD806[\uDCE0-\uDCE9]|\uD807[\uDC50-\uDC59\uDD50-\uDD59\uDDA0-\uDDA9]|\uD81A[\uDE60-\uDE69\uDF50-\uDF59]|\uD835[\uDFCE-\uDFFF]|\uD838[\uDD40-\uDD49\uDEF0-\uDEF9]|\uD83A[\uDD50-\uDD59]'
-    },
-    {
-        'name': 'Nl',
-        'alias': 'Letter_Number',
-        'bmp': '\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF',
-        'astral': '\uD800[\uDD40-\uDD74\uDF41\uDF4A\uDFD1-\uDFD5]|\uD809[\uDC00-\uDC6E]'
-    },
-    {
-        'name': 'No',
-        'alias': 'Other_Number',
-        'bmp': '\xB2\xB3\xB9\xBC-\xBE\u09F4-\u09F9\u0B72-\u0B77\u0BF0-\u0BF2\u0C78-\u0C7E\u0D58-\u0D5E\u0D70-\u0D78\u0F2A-\u0F33\u1369-\u137C\u17F0-\u17F9\u19DA\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215F\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\uA830-\uA835',
-        'astral': '\uD800[\uDD07-\uDD33\uDD75-\uDD78\uDD8A\uDD8B\uDEE1-\uDEFB\uDF20-\uDF23]|\uD802[\uDC58-\uDC5F\uDC79-\uDC7F\uDCA7-\uDCAF\uDCFB-\uDCFF\uDD16-\uDD1B\uDDBC\uDDBD\uDDC0-\uDDCF\uDDD2-\uDDFF\uDE40-\uDE48\uDE7D\uDE7E\uDE9D-\uDE9F\uDEEB-\uDEEF\uDF58-\uDF5F\uDF78-\uDF7F\uDFA9-\uDFAF]|\uD803[\uDCFA-\uDCFF\uDE60-\uDE7E\uDF1D-\uDF26\uDF51-\uDF54]|\uD804[\uDC52-\uDC65\uDDE1-\uDDF4]|\uD805[\uDF3A\uDF3B]|\uD806[\uDCEA-\uDCF2]|\uD807[\uDC5A-\uDC6C\uDFC0-\uDFD4]|\uD81A[\uDF5B-\uDF61]|\uD81B[\uDE80-\uDE96]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD83A[\uDCC7-\uDCCF]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D]|\uD83C[\uDD00-\uDD0C]'
-    },
-    {
-        'name': 'P',
-        'alias': 'Punctuation',
-        'bmp': '!-#%-\\*,-\\/:;\\?@\\[-\\]_\\{\\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65',
-        'astral': '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDFFF]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]'
-    },
-    {
-        'name': 'Pc',
-        'alias': 'Connector_Punctuation',
-        'bmp': '_\u203F\u2040\u2054\uFE33\uFE34\uFE4D-\uFE4F\uFF3F'
-    },
-    {
-        'name': 'Pd',
-        'alias': 'Dash_Punctuation',
-        'bmp': '\\-\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D'
-    },
-    {
-        'name': 'Pe',
-        'alias': 'Close_Punctuation',
-        'bmp': '\\)\\]\\}\u0F3B\u0F3D\u169C\u2046\u207E\u208E\u2309\u230B\u232A\u2769\u276B\u276D\u276F\u2771\u2773\u2775\u27C6\u27E7\u27E9\u27EB\u27ED\u27EF\u2984\u2986\u2988\u298A\u298C\u298E\u2990\u2992\u2994\u2996\u2998\u29D9\u29DB\u29FD\u2E23\u2E25\u2E27\u2E29\u3009\u300B\u300D\u300F\u3011\u3015\u3017\u3019\u301B\u301E\u301F\uFD3E\uFE18\uFE36\uFE38\uFE3A\uFE3C\uFE3E\uFE40\uFE42\uFE44\uFE48\uFE5A\uFE5C\uFE5E\uFF09\uFF3D\uFF5D\uFF60\uFF63'
-    },
-    {
-        'name': 'Pf',
-        'alias': 'Final_Punctuation',
-        'bmp': '\xBB\u2019\u201D\u203A\u2E03\u2E05\u2E0A\u2E0D\u2E1D\u2E21'
-    },
-    {
-        'name': 'Pi',
-        'alias': 'Initial_Punctuation',
-        'bmp': '\xAB\u2018\u201B\u201C\u201F\u2039\u2E02\u2E04\u2E09\u2E0C\u2E1C\u2E20'
-    },
-    {
-        'name': 'Po',
-        'alias': 'Other_Punctuation',
-        'bmp': '!-#%-\'\\*,\\.\\/:;\\?@\\\xA1\xA7\xB6\xB7\xBF\u037E\u0387\u055A-\u055F\u0589\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u166E\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u1805\u1807-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203B-\u203E\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205E\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00\u2E01\u2E06-\u2E08\u2E0B\u2E0E-\u2E16\u2E18\u2E19\u2E1B\u2E1E\u2E1F\u2E2A-\u2E2E\u2E30-\u2E39\u2E3C-\u2E3F\u2E41\u2E43-\u2E4F\u3001-\u3003\u303D\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFE10-\uFE16\uFE19\uFE30\uFE45\uFE46\uFE49-\uFE4C\uFE50-\uFE52\uFE54-\uFE57\uFE5F-\uFE61\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF07\uFF0A\uFF0C\uFF0E\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3C\uFF61\uFF64\uFF65',
-        'astral': '\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDFFF]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]'
-    },
-    {
-        'name': 'Ps',
-        'alias': 'Open_Punctuation',
-        'bmp': '\\(\\[\\{\u0F3A\u0F3C\u169B\u201A\u201E\u2045\u207D\u208D\u2308\u230A\u2329\u2768\u276A\u276C\u276E\u2770\u2772\u2774\u27C5\u27E6\u27E8\u27EA\u27EC\u27EE\u2983\u2985\u2987\u2989\u298B\u298D\u298F\u2991\u2993\u2995\u2997\u29D8\u29DA\u29FC\u2E22\u2E24\u2E26\u2E28\u2E42\u3008\u300A\u300C\u300E\u3010\u3014\u3016\u3018\u301A\u301D\uFD3F\uFE17\uFE35\uFE37\uFE39\uFE3B\uFE3D\uFE3F\uFE41\uFE43\uFE47\uFE59\uFE5B\uFE5D\uFF08\uFF3B\uFF5B\uFF5F\uFF62'
-    },
-    {
-        'name': 'S',
-        'alias': 'Symbol',
-        'bmp': '\\$\\+<->\\^`\\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20BF\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B98-\u2BFF\u2CE5-\u2CEA\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uFB29\uFBB2-\uFBC1\uFDFC\uFDFD\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD',
-        'astral': '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD6C\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED5\uDEE0-\uDEEC\uDEF0-\uDEFA\uDF00-\uDF73\uDF80-\uDFD8\uDFE0-\uDFEB]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD00-\uDD0B\uDD0D-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDE53\uDE60-\uDE6D\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95]'
-    },
-    {
-        'name': 'Sc',
-        'alias': 'Currency_Symbol',
-        'bmp': '\\$\xA2-\xA5\u058F\u060B\u07FE\u07FF\u09F2\u09F3\u09FB\u0AF1\u0BF9\u0E3F\u17DB\u20A0-\u20BF\uA838\uFDFC\uFE69\uFF04\uFFE0\uFFE1\uFFE5\uFFE6',
-        'astral': '\uD807[\uDFDD-\uDFE0]|\uD838\uDEFF|\uD83B\uDCB0'
-    },
-    {
-        'name': 'Sk',
-        'alias': 'Modifier_Symbol',
-        'bmp': '\\^`\xA8\xAF\xB4\xB8\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u309B\u309C\uA700-\uA716\uA720\uA721\uA789\uA78A\uAB5B\uFBB2-\uFBC1\uFF3E\uFF40\uFFE3',
-        'astral': '\uD83C[\uDFFB-\uDFFF]'
-    },
-    {
-        'name': 'Sm',
-        'alias': 'Math_Symbol',
-        'bmp': '\\+<->\\|~\xAC\xB1\xD7\xF7\u03F6\u0606-\u0608\u2044\u2052\u207A-\u207C\u208A-\u208C\u2118\u2140-\u2144\u214B\u2190-\u2194\u219A\u219B\u21A0\u21A3\u21A6\u21AE\u21CE\u21CF\u21D2\u21D4\u21F4-\u22FF\u2320\u2321\u237C\u239B-\u23B3\u23DC-\u23E1\u25B7\u25C1\u25F8-\u25FF\u266F\u27C0-\u27C4\u27C7-\u27E5\u27F0-\u27FF\u2900-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2AFF\u2B30-\u2B44\u2B47-\u2B4C\uFB29\uFE62\uFE64-\uFE66\uFF0B\uFF1C-\uFF1E\uFF5C\uFF5E\uFFE2\uFFE9-\uFFEC',
-        'astral': '\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD83B[\uDEF0\uDEF1]'
-    },
-    {
-        'name': 'So',
-        'alias': 'Other_Symbol',
-        'bmp': '\xA6\xA9\xAE\xB0\u0482\u058D\u058E\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u09FA\u0B70\u0BF3-\u0BF8\u0BFA\u0C7F\u0D4F\u0D79\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116\u2117\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u214A\u214C\u214D\u214F\u218A\u218B\u2195-\u2199\u219C-\u219F\u21A1\u21A2\u21A4\u21A5\u21A7-\u21AD\u21AF-\u21CD\u21D0\u21D1\u21D3\u21D5-\u21F3\u2300-\u2307\u230C-\u231F\u2322-\u2328\u232B-\u237B\u237D-\u239A\u23B4-\u23DB\u23E2-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u25B6\u25B8-\u25C0\u25C2-\u25F7\u2600-\u266E\u2670-\u2767\u2794-\u27BF\u2800-\u28FF\u2B00-\u2B2F\u2B45\u2B46\u2B4D-\u2B73\u2B76-\u2B95\u2B98-\u2BFF\u2CE5-\u2CEA\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA828-\uA82B\uA836\uA837\uA839\uAA77-\uAA79\uFDFD\uFFE4\uFFE8\uFFED\uFFEE\uFFFC\uFFFD',
-        'astral': '\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9B\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFDC\uDFE1-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838\uDD4F|\uD83B[\uDCAC\uDD2E]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD10-\uDD6C\uDD70-\uDDAC\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFA]|\uD83D[\uDC00-\uDED5\uDEE0-\uDEEC\uDEF0-\uDEFA\uDF00-\uDF73\uDF80-\uDFD8\uDFE0-\uDFEB]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD00-\uDD0B\uDD0D-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDE53\uDE60-\uDE6D\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95]'
-    },
-    {
-        'name': 'Z',
-        'alias': 'Separator',
-        'bmp': ' \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000'
-    },
-    {
-        'name': 'Zl',
-        'alias': 'Line_Separator',
-        'bmp': '\u2028'
-    },
-    {
-        'name': 'Zp',
-        'alias': 'Paragraph_Separator',
-        'bmp': '\u2029'
-    },
-    {
-        'name': 'Zs',
-        'alias': 'Space_Separator',
-        'bmp': ' \xA0\u1680\u2000-\u200A\u202F\u205F\u3000'
-    }
-];
-
-},{}],173:[function(require,module,exports){
-module.exports = [
-    {
-        'name': 'ASCII',
-        'bmp': '\0-\x7F'
-    },
-    {
-        'name': 'Alphabetic',
-        'bmp': 'A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0345\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05B0-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0657\u0659-\u065F\u066E-\u06D3\u06D5-\u06DC\u06E1-\u06E8\u06ED-\u06EF\u06FA-\u06FC\u06FF\u0710-\u073F\u074D-\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0817\u081A-\u082C\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08DF\u08E3-\u08E9\u08F0-\u093B\u093D-\u094C\u094E-\u0950\u0955-\u0963\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD-\u09C4\u09C7\u09C8\u09CB\u09CC\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09F0\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3E-\u0A42\u0A47\u0A48\u0A4B\u0A4C\u0A51\u0A59-\u0A5C\u0A5E\u0A70-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD-\u0AC5\u0AC7-\u0AC9\u0ACB\u0ACC\u0AD0\u0AE0-\u0AE3\u0AF9-\u0AFC\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D-\u0B44\u0B47\u0B48\u0B4B\u0B4C\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD0\u0BD7\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4C\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCC\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4C\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E46\u0E4D\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0ECD\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F71-\u0F81\u0F88-\u0F97\u0F99-\u0FBC\u1000-\u1036\u1038\u103B-\u103F\u1050-\u108F\u109A-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1713\u1720-\u1733\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17B3\u17B6-\u17C8\u17D7\u17DC\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u1938\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A1B\u1A20-\u1A5E\u1A61-\u1A74\u1AA7\u1B00-\u1B33\u1B35-\u1B43\u1B45-\u1B4B\u1B80-\u1BA9\u1BAC-\u1BAF\u1BBA-\u1BE5\u1BE7-\u1BF1\u1C00-\u1C36\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1DE7-\u1DF4\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u24B6-\u24E9\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA674-\uA67B\uA67F-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7C6\uA7F7-\uA805\uA807-\uA827\uA840-\uA873\uA880-\uA8C3\uA8C5\uA8F2-\uA8F7\uA8FB\uA8FD-\uA8FF\uA90A-\uA92A\uA930-\uA952\uA960-\uA97C\uA980-\uA9B2\uA9B4-\uA9BF\uA9CF\uA9E0-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA60-\uAA76\uAA7A-\uAABE\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF5\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB67\uAB70-\uABEA\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC',
-        'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC45\uDC82-\uDCB8\uDCD0-\uDCE8\uDD00-\uDD32\uDD44-\uDD46\uDD50-\uDD72\uDD76\uDD80-\uDDBF\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE34\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEE8\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D-\uDF44\uDF47\uDF48\uDF4B\uDF4C\uDF50\uDF57\uDF5D-\uDF63]|\uD805[\uDC00-\uDC41\uDC43-\uDC45\uDC47-\uDC4A\uDC5F\uDC80-\uDCC1\uDCC4\uDCC5\uDCC7\uDD80-\uDDB5\uDDB8-\uDDBE\uDDD8-\uDDDD\uDE00-\uDE3E\uDE40\uDE44\uDE80-\uDEB5\uDEB8\uDF00-\uDF1A\uDF1D-\uDF2A]|\uD806[\uDC00-\uDC38\uDCA0-\uDCDF\uDCFF\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDDF\uDDE1\uDDE3\uDDE4\uDE00-\uDE32\uDE35-\uDE3E\uDE50-\uDE97\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC3E\uDC40\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD41\uDD43\uDD46\uDD47\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD96\uDD98\uDEE0-\uDEF6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9E]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDEC0-\uDEEB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD47\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]'
-    },
-    {
-        'name': 'Any',
-        'isBmpLast': true,
-        'bmp': '\0-\uFFFF',
-        'astral': '[\uD800-\uDBFF][\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'Default_Ignorable_Code_Point',
-        'bmp': '\xAD\u034F\u061C\u115F\u1160\u17B4\u17B5\u180B-\u180E\u200B-\u200F\u202A-\u202E\u2060-\u206F\u3164\uFE00-\uFE0F\uFEFF\uFFA0\uFFF0-\uFFF8',
-        'astral': '\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|[\uDB40-\uDB43][\uDC00-\uDFFF]'
-    },
-    {
-        'name': 'Lowercase',
-        'bmp': 'a-z\xAA\xB5\xBA\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02B8\u02C0\u02C1\u02E0-\u02E4\u0345\u0371\u0373\u0377\u037A-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1DBF\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u2071\u207F\u2090-\u209C\u210A\u210E\u210F\u2113\u212F\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2170-\u217F\u2184\u24D0-\u24E9\u2C30-\u2C5E\u2C61\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7D\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B-\uA69D\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7BB\uA7BD\uA7BF\uA7C3\uA7F8-\uA7FA\uAB30-\uAB5A\uAB5C-\uAB67\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A',
-        'astral': '\uD801[\uDC28-\uDC4F\uDCD8-\uDCFB]|\uD803[\uDCC0-\uDCF2]|\uD806[\uDCC0-\uDCDF]|\uD81B[\uDE60-\uDE7F]|\uD835[\uDC1A-\uDC33\uDC4E-\uDC54\uDC56-\uDC67\uDC82-\uDC9B\uDCB6-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDCEA-\uDD03\uDD1E-\uDD37\uDD52-\uDD6B\uDD86-\uDD9F\uDDBA-\uDDD3\uDDEE-\uDE07\uDE22-\uDE3B\uDE56-\uDE6F\uDE8A-\uDEA5\uDEC2-\uDEDA\uDEDC-\uDEE1\uDEFC-\uDF14\uDF16-\uDF1B\uDF36-\uDF4E\uDF50-\uDF55\uDF70-\uDF88\uDF8A-\uDF8F\uDFAA-\uDFC2\uDFC4-\uDFC9\uDFCB]|\uD83A[\uDD22-\uDD43]'
-    },
-    {
-        'name': 'Noncharacter_Code_Point',
-        'bmp': '\uFDD0-\uFDEF\uFFFE\uFFFF',
-        'astral': '[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]'
-    },
-    {
-        'name': 'Uppercase',
-        'bmp': 'A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D\u0181\u0182\u0184\u0186\u0187\u0189-\u018B\u018E-\u0191\u0193\u0194\u0196-\u0198\u019C\u019D\u019F\u01A0\u01A2\u01A4\u01A6\u01A7\u01A9\u01AC\u01AE\u01AF\u01B1-\u01B3\u01B5\u01B7\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A\u023B\u023D\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E\u213F\u2145\u2160-\u216F\u2183\u24B6-\u24CF\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uA7BA\uA7BC\uA7BE\uA7C2\uA7C4-\uA7C6\uFF21-\uFF3A',
-        'astral': '\uD801[\uDC00-\uDC27\uDCB0-\uDCD3]|\uD803[\uDC80-\uDCB2]|\uD806[\uDCA0-\uDCBF]|\uD81B[\uDE40-\uDE5F]|\uD835[\uDC00-\uDC19\uDC34-\uDC4D\uDC68-\uDC81\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB5\uDCD0-\uDCE9\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD38\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD6C-\uDD85\uDDA0-\uDDB9\uDDD4-\uDDED\uDE08-\uDE21\uDE3C-\uDE55\uDE70-\uDE89\uDEA8-\uDEC0\uDEE2-\uDEFA\uDF1C-\uDF34\uDF56-\uDF6E\uDF90-\uDFA8\uDFCA]|\uD83A[\uDD00-\uDD21]|\uD83C[\uDD30-\uDD49\uDD50-\uDD69\uDD70-\uDD89]'
-    },
-    {
-        'name': 'White_Space',
-        'bmp': '\t-\r \x85\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000'
-    }
-];
-
-},{}],174:[function(require,module,exports){
-module.exports = [
-    {
-        'name': 'Adlam',
-        'astral': '\uD83A[\uDD00-\uDD4B\uDD50-\uDD59\uDD5E\uDD5F]'
-    },
-    {
-        'name': 'Ahom',
-        'astral': '\uD805[\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF3F]'
-    },
-    {
-        'name': 'Anatolian_Hieroglyphs',
-        'astral': '\uD811[\uDC00-\uDE46]'
-    },
-    {
-        'name': 'Arabic',
-        'bmp': '\u0600-\u0604\u0606-\u060B\u060D-\u061A\u061C\u061E\u0620-\u063F\u0641-\u064A\u0656-\u066F\u0671-\u06DC\u06DE-\u06FF\u0750-\u077F\u08A0-\u08B4\u08B6-\u08BD\u08D3-\u08E1\u08E3-\u08FF\uFB50-\uFBC1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFD\uFE70-\uFE74\uFE76-\uFEFC',
-        'astral': '\uD803[\uDE60-\uDE7E]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB\uDEF0\uDEF1]'
-    },
-    {
-        'name': 'Armenian',
-        'bmp': '\u0531-\u0556\u0559-\u0588\u058A\u058D-\u058F\uFB13-\uFB17'
-    },
-    {
-        'name': 'Avestan',
-        'astral': '\uD802[\uDF00-\uDF35\uDF39-\uDF3F]'
-    },
-    {
-        'name': 'Balinese',
-        'bmp': '\u1B00-\u1B4B\u1B50-\u1B7C'
-    },
-    {
-        'name': 'Bamum',
-        'bmp': '\uA6A0-\uA6F7',
-        'astral': '\uD81A[\uDC00-\uDE38]'
-    },
-    {
-        'name': 'Bassa_Vah',
-        'astral': '\uD81A[\uDED0-\uDEED\uDEF0-\uDEF5]'
-    },
-    {
-        'name': 'Batak',
-        'bmp': '\u1BC0-\u1BF3\u1BFC-\u1BFF'
-    },
-    {
-        'name': 'Bengali',
-        'bmp': '\u0980-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09FE'
-    },
-    {
-        'name': 'Bhaiksuki',
-        'astral': '\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC45\uDC50-\uDC6C]'
-    },
-    {
-        'name': 'Bopomofo',
-        'bmp': '\u02EA\u02EB\u3105-\u312F\u31A0-\u31BA'
-    },
-    {
-        'name': 'Brahmi',
-        'astral': '\uD804[\uDC00-\uDC4D\uDC52-\uDC6F\uDC7F]'
-    },
-    {
-        'name': 'Braille',
-        'bmp': '\u2800-\u28FF'
-    },
-    {
-        'name': 'Buginese',
-        'bmp': '\u1A00-\u1A1B\u1A1E\u1A1F'
-    },
-    {
-        'name': 'Buhid',
-        'bmp': '\u1740-\u1753'
-    },
-    {
-        'name': 'Canadian_Aboriginal',
-        'bmp': '\u1400-\u167F\u18B0-\u18F5'
-    },
-    {
-        'name': 'Carian',
-        'astral': '\uD800[\uDEA0-\uDED0]'
-    },
-    {
-        'name': 'Caucasian_Albanian',
-        'astral': '\uD801[\uDD30-\uDD63\uDD6F]'
-    },
-    {
-        'name': 'Chakma',
-        'astral': '\uD804[\uDD00-\uDD34\uDD36-\uDD46]'
-    },
-    {
-        'name': 'Cham',
-        'bmp': '\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA5C-\uAA5F'
-    },
-    {
-        'name': 'Cherokee',
-        'bmp': '\u13A0-\u13F5\u13F8-\u13FD\uAB70-\uABBF'
-    },
-    {
-        'name': 'Common',
-        'bmp': '\0-@\\[-`\\{-\xA9\xAB-\xB9\xBB-\xBF\xD7\xF7\u02B9-\u02DF\u02E5-\u02E9\u02EC-\u02FF\u0374\u037E\u0385\u0387\u0589\u0605\u060C\u061B\u061F\u0640\u06DD\u08E2\u0964\u0965\u0E3F\u0FD5-\u0FD8\u10FB\u16EB-\u16ED\u1735\u1736\u1802\u1803\u1805\u1CD3\u1CE1\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5-\u1CF7\u1CFA\u2000-\u200B\u200E-\u2064\u2066-\u2070\u2074-\u207E\u2080-\u208E\u20A0-\u20BF\u2100-\u2125\u2127-\u2129\u212C-\u2131\u2133-\u214D\u214F-\u215F\u2189-\u218B\u2190-\u2426\u2440-\u244A\u2460-\u27FF\u2900-\u2B73\u2B76-\u2B95\u2B98-\u2BFF\u2E00-\u2E4F\u2FF0-\u2FFB\u3000-\u3004\u3006\u3008-\u3020\u3030-\u3037\u303C-\u303F\u309B\u309C\u30A0\u30FB\u30FC\u3190-\u319F\u31C0-\u31E3\u3220-\u325F\u327F-\u32CF\u32FF\u3358-\u33FF\u4DC0-\u4DFF\uA700-\uA721\uA788-\uA78A\uA830-\uA839\uA92E\uA9CF\uAB5B\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFEFF\uFF01-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFF70\uFF9E\uFF9F\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFF9-\uFFFD',
-        'astral': '\uD800[\uDD00-\uDD02\uDD07-\uDD33\uDD37-\uDD3F\uDD90-\uDD9B\uDDD0-\uDDFC\uDEE1-\uDEFB]|\uD81B[\uDFE2\uDFE3]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD66\uDD6A-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDE8\uDEE0-\uDEF3\uDF00-\uDF56\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDFCB\uDFCE-\uDFFF]|\uD83B[\uDC71-\uDCB4\uDD01-\uDD3D]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD00-\uDD0C\uDD10-\uDD6C\uDD70-\uDDAC\uDDE6-\uDDFF\uDE01\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED5\uDEE0-\uDEEC\uDEF0-\uDEFA\uDF00-\uDF73\uDF80-\uDFD8\uDFE0-\uDFEB]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDD00-\uDD0B\uDD0D-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDE53\uDE60-\uDE6D\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95]|\uDB40[\uDC01\uDC20-\uDC7F]'
-    },
-    {
-        'name': 'Coptic',
-        'bmp': '\u03E2-\u03EF\u2C80-\u2CF3\u2CF9-\u2CFF'
-    },
-    {
-        'name': 'Cuneiform',
-        'astral': '\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC70-\uDC74\uDC80-\uDD43]'
-    },
-    {
-        'name': 'Cypriot',
-        'astral': '\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F]'
-    },
-    {
-        'name': 'Cyrillic',
-        'bmp': '\u0400-\u0484\u0487-\u052F\u1C80-\u1C88\u1D2B\u1D78\u2DE0-\u2DFF\uA640-\uA69F\uFE2E\uFE2F'
-    },
-    {
-        'name': 'Deseret',
-        'astral': '\uD801[\uDC00-\uDC4F]'
-    },
-    {
-        'name': 'Devanagari',
-        'bmp': '\u0900-\u0950\u0955-\u0963\u0966-\u097F\uA8E0-\uA8FF'
-    },
-    {
-        'name': 'Dogra',
-        'astral': '\uD806[\uDC00-\uDC3B]'
-    },
-    {
-        'name': 'Duployan',
-        'astral': '\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9C-\uDC9F]'
-    },
-    {
-        'name': 'Egyptian_Hieroglyphs',
-        'astral': '\uD80C[\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E\uDC30-\uDC38]'
-    },
-    {
-        'name': 'Elbasan',
-        'astral': '\uD801[\uDD00-\uDD27]'
-    },
-    {
-        'name': 'Elymaic',
-        'astral': '\uD803[\uDFE0-\uDFF6]'
-    },
-    {
-        'name': 'Ethiopic',
-        'bmp': '\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u137C\u1380-\u1399\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E'
-    },
-    {
-        'name': 'Georgian',
-        'bmp': '\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u10FF\u1C90-\u1CBA\u1CBD-\u1CBF\u2D00-\u2D25\u2D27\u2D2D'
-    },
-    {
-        'name': 'Glagolitic',
-        'bmp': '\u2C00-\u2C2E\u2C30-\u2C5E',
-        'astral': '\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]'
-    },
-    {
-        'name': 'Gothic',
-        'astral': '\uD800[\uDF30-\uDF4A]'
-    },
-    {
-        'name': 'Grantha',
-        'astral': '\uD804[\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]'
-    },
-    {
-        'name': 'Greek',
-        'bmp': '\u0370-\u0373\u0375-\u0377\u037A-\u037D\u037F\u0384\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03E1\u03F0-\u03FF\u1D26-\u1D2A\u1D5D-\u1D61\u1D66-\u1D6A\u1DBF\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FC4\u1FC6-\u1FD3\u1FD6-\u1FDB\u1FDD-\u1FEF\u1FF2-\u1FF4\u1FF6-\u1FFE\u2126\uAB65',
-        'astral': '\uD800[\uDD40-\uDD8E\uDDA0]|\uD834[\uDE00-\uDE45]'
-    },
-    {
-        'name': 'Gujarati',
-        'bmp': '\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AF1\u0AF9-\u0AFF'
-    },
-    {
-        'name': 'Gunjala_Gondi',
-        'astral': '\uD807[\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9]'
-    },
-    {
-        'name': 'Gurmukhi',
-        'bmp': '\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A76'
-    },
-    {
-        'name': 'Han',
-        'bmp': '\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3005\u3007\u3021-\u3029\u3038-\u303B\u3400-\u4DB5\u4E00-\u9FEF\uF900-\uFA6D\uFA70-\uFAD9',
-        'astral': '[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]'
-    },
-    {
-        'name': 'Hangul',
-        'bmp': '\u1100-\u11FF\u302E\u302F\u3131-\u318E\u3200-\u321E\u3260-\u327E\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC'
-    },
-    {
-        'name': 'Hanifi_Rohingya',
-        'astral': '\uD803[\uDD00-\uDD27\uDD30-\uDD39]'
-    },
-    {
-        'name': 'Hanunoo',
-        'bmp': '\u1720-\u1734'
-    },
-    {
-        'name': 'Hatran',
-        'astral': '\uD802[\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDCFF]'
-    },
-    {
-        'name': 'Hebrew',
-        'bmp': '\u0591-\u05C7\u05D0-\u05EA\u05EF-\u05F4\uFB1D-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFB4F'
-    },
-    {
-        'name': 'Hiragana',
-        'bmp': '\u3041-\u3096\u309D-\u309F',
-        'astral': '\uD82C[\uDC01-\uDD1E\uDD50-\uDD52]|\uD83C\uDE00'
-    },
-    {
-        'name': 'Imperial_Aramaic',
-        'astral': '\uD802[\uDC40-\uDC55\uDC57-\uDC5F]'
-    },
-    {
-        'name': 'Inherited',
-        'bmp': '\u0300-\u036F\u0485\u0486\u064B-\u0655\u0670\u0951-\u0954\u1AB0-\u1ABE\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u200C\u200D\u20D0-\u20F0\u302A-\u302D\u3099\u309A\uFE00-\uFE0F\uFE20-\uFE2D',
-        'astral': '\uD800[\uDDFD\uDEE0]|\uD804\uDF3B|\uD834[\uDD67-\uDD69\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD]|\uDB40[\uDD00-\uDDEF]'
-    },
-    {
-        'name': 'Inscriptional_Pahlavi',
-        'astral': '\uD802[\uDF60-\uDF72\uDF78-\uDF7F]'
-    },
-    {
-        'name': 'Inscriptional_Parthian',
-        'astral': '\uD802[\uDF40-\uDF55\uDF58-\uDF5F]'
-    },
-    {
-        'name': 'Javanese',
-        'bmp': '\uA980-\uA9CD\uA9D0-\uA9D9\uA9DE\uA9DF'
-    },
-    {
-        'name': 'Kaithi',
-        'astral': '\uD804[\uDC80-\uDCC1\uDCCD]'
-    },
-    {
-        'name': 'Kannada',
-        'bmp': '\u0C80-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2'
-    },
-    {
-        'name': 'Katakana',
-        'bmp': '\u30A1-\u30FA\u30FD-\u30FF\u31F0-\u31FF\u32D0-\u32FE\u3300-\u3357\uFF66-\uFF6F\uFF71-\uFF9D',
-        'astral': '\uD82C[\uDC00\uDD64-\uDD67]'
-    },
-    {
-        'name': 'Kayah_Li',
-        'bmp': '\uA900-\uA92D\uA92F'
-    },
-    {
-        'name': 'Kharoshthi',
-        'astral': '\uD802[\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F-\uDE48\uDE50-\uDE58]'
-    },
-    {
-        'name': 'Khmer',
-        'bmp': '\u1780-\u17DD\u17E0-\u17E9\u17F0-\u17F9\u19E0-\u19FF'
-    },
-    {
-        'name': 'Khojki',
-        'astral': '\uD804[\uDE00-\uDE11\uDE13-\uDE3E]'
-    },
-    {
-        'name': 'Khudawadi',
-        'astral': '\uD804[\uDEB0-\uDEEA\uDEF0-\uDEF9]'
-    },
-    {
-        'name': 'Lao',
-        'bmp': '\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF'
-    },
-    {
-        'name': 'Latin',
-        'bmp': 'A-Za-z\xAA\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u02E0-\u02E4\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2071\u207F\u2090-\u209C\u212A\u212B\u2132\u214E\u2160-\u2188\u2C60-\u2C7F\uA722-\uA787\uA78B-\uA7BF\uA7C2-\uA7C6\uA7F7-\uA7FF\uAB30-\uAB5A\uAB5C-\uAB64\uAB66\uAB67\uFB00-\uFB06\uFF21-\uFF3A\uFF41-\uFF5A'
-    },
-    {
-        'name': 'Lepcha',
-        'bmp': '\u1C00-\u1C37\u1C3B-\u1C49\u1C4D-\u1C4F'
-    },
-    {
-        'name': 'Limbu',
-        'bmp': '\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1940\u1944-\u194F'
-    },
-    {
-        'name': 'Linear_A',
-        'astral': '\uD801[\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]'
-    },
-    {
-        'name': 'Linear_B',
-        'astral': '\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA]'
-    },
-    {
-        'name': 'Lisu',
-        'bmp': '\uA4D0-\uA4FF'
-    },
-    {
-        'name': 'Lycian',
-        'astral': '\uD800[\uDE80-\uDE9C]'
-    },
-    {
-        'name': 'Lydian',
-        'astral': '\uD802[\uDD20-\uDD39\uDD3F]'
-    },
-    {
-        'name': 'Mahajani',
-        'astral': '\uD804[\uDD50-\uDD76]'
-    },
-    {
-        'name': 'Makasar',
-        'astral': '\uD807[\uDEE0-\uDEF8]'
-    },
-    {
-        'name': 'Malayalam',
-        'bmp': '\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4F\u0D54-\u0D63\u0D66-\u0D7F'
-    },
-    {
-        'name': 'Mandaic',
-        'bmp': '\u0840-\u085B\u085E'
-    },
-    {
-        'name': 'Manichaean',
-        'astral': '\uD802[\uDEC0-\uDEE6\uDEEB-\uDEF6]'
-    },
-    {
-        'name': 'Marchen',
-        'astral': '\uD807[\uDC70-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]'
-    },
-    {
-        'name': 'Masaram_Gondi',
-        'astral': '\uD807[\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]'
-    },
-    {
-        'name': 'Medefaidrin',
-        'astral': '\uD81B[\uDE40-\uDE9A]'
-    },
-    {
-        'name': 'Meetei_Mayek',
-        'bmp': '\uAAE0-\uAAF6\uABC0-\uABED\uABF0-\uABF9'
-    },
-    {
-        'name': 'Mende_Kikakui',
-        'astral': '\uD83A[\uDC00-\uDCC4\uDCC7-\uDCD6]'
-    },
-    {
-        'name': 'Meroitic_Cursive',
-        'astral': '\uD802[\uDDA0-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDDFF]'
-    },
-    {
-        'name': 'Meroitic_Hieroglyphs',
-        'astral': '\uD802[\uDD80-\uDD9F]'
-    },
-    {
-        'name': 'Miao',
-        'astral': '\uD81B[\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F]'
-    },
-    {
-        'name': 'Modi',
-        'astral': '\uD805[\uDE00-\uDE44\uDE50-\uDE59]'
-    },
-    {
-        'name': 'Mongolian',
-        'bmp': '\u1800\u1801\u1804\u1806-\u180E\u1810-\u1819\u1820-\u1878\u1880-\u18AA',
-        'astral': '\uD805[\uDE60-\uDE6C]'
-    },
-    {
-        'name': 'Mro',
-        'astral': '\uD81A[\uDE40-\uDE5E\uDE60-\uDE69\uDE6E\uDE6F]'
-    },
-    {
-        'name': 'Multani',
-        'astral': '\uD804[\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA9]'
-    },
-    {
-        'name': 'Myanmar',
-        'bmp': '\u1000-\u109F\uA9E0-\uA9FE\uAA60-\uAA7F'
-    },
-    {
-        'name': 'Nabataean',
-        'astral': '\uD802[\uDC80-\uDC9E\uDCA7-\uDCAF]'
-    },
-    {
-        'name': 'Nandinagari',
-        'astral': '\uD806[\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE4]'
-    },
-    {
-        'name': 'New_Tai_Lue',
-        'bmp': '\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u19DE\u19DF'
-    },
-    {
-        'name': 'Newa',
-        'astral': '\uD805[\uDC00-\uDC59\uDC5B\uDC5D-\uDC5F]'
-    },
-    {
-        'name': 'Nko',
-        'bmp': '\u07C0-\u07FA\u07FD-\u07FF'
-    },
-    {
-        'name': 'Nushu',
-        'astral': '\uD81B\uDFE1|\uD82C[\uDD70-\uDEFB]'
-    },
-    {
-        'name': 'Nyiakeng_Puachue_Hmong',
-        'astral': '\uD838[\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDD4F]'
-    },
-    {
-        'name': 'Ogham',
-        'bmp': '\u1680-\u169C'
-    },
-    {
-        'name': 'Ol_Chiki',
-        'bmp': '\u1C50-\u1C7F'
-    },
-    {
-        'name': 'Old_Hungarian',
-        'astral': '\uD803[\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDCFF]'
-    },
-    {
-        'name': 'Old_Italic',
-        'astral': '\uD800[\uDF00-\uDF23\uDF2D-\uDF2F]'
-    },
-    {
-        'name': 'Old_North_Arabian',
-        'astral': '\uD802[\uDE80-\uDE9F]'
-    },
-    {
-        'name': 'Old_Permic',
-        'astral': '\uD800[\uDF50-\uDF7A]'
-    },
-    {
-        'name': 'Old_Persian',
-        'astral': '\uD800[\uDFA0-\uDFC3\uDFC8-\uDFD5]'
-    },
-    {
-        'name': 'Old_Sogdian',
-        'astral': '\uD803[\uDF00-\uDF27]'
-    },
-    {
-        'name': 'Old_South_Arabian',
-        'astral': '\uD802[\uDE60-\uDE7F]'
-    },
-    {
-        'name': 'Old_Turkic',
-        'astral': '\uD803[\uDC00-\uDC48]'
-    },
-    {
-        'name': 'Oriya',
-        'bmp': '\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B77'
-    },
-    {
-        'name': 'Osage',
-        'astral': '\uD801[\uDCB0-\uDCD3\uDCD8-\uDCFB]'
-    },
-    {
-        'name': 'Osmanya',
-        'astral': '\uD801[\uDC80-\uDC9D\uDCA0-\uDCA9]'
-    },
-    {
-        'name': 'Pahawh_Hmong',
-        'astral': '\uD81A[\uDF00-\uDF45\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]'
-    },
-    {
-        'name': 'Palmyrene',
-        'astral': '\uD802[\uDC60-\uDC7F]'
-    },
-    {
-        'name': 'Pau_Cin_Hau',
-        'astral': '\uD806[\uDEC0-\uDEF8]'
-    },
-    {
-        'name': 'Phags_Pa',
-        'bmp': '\uA840-\uA877'
-    },
-    {
-        'name': 'Phoenician',
-        'astral': '\uD802[\uDD00-\uDD1B\uDD1F]'
-    },
-    {
-        'name': 'Psalter_Pahlavi',
-        'astral': '\uD802[\uDF80-\uDF91\uDF99-\uDF9C\uDFA9-\uDFAF]'
-    },
-    {
-        'name': 'Rejang',
-        'bmp': '\uA930-\uA953\uA95F'
-    },
-    {
-        'name': 'Runic',
-        'bmp': '\u16A0-\u16EA\u16EE-\u16F8'
-    },
-    {
-        'name': 'Samaritan',
-        'bmp': '\u0800-\u082D\u0830-\u083E'
-    },
-    {
-        'name': 'Saurashtra',
-        'bmp': '\uA880-\uA8C5\uA8CE-\uA8D9'
-    },
-    {
-        'name': 'Sharada',
-        'astral': '\uD804[\uDD80-\uDDCD\uDDD0-\uDDDF]'
-    },
-    {
-        'name': 'Shavian',
-        'astral': '\uD801[\uDC50-\uDC7F]'
-    },
-    {
-        'name': 'Siddham',
-        'astral': '\uD805[\uDD80-\uDDB5\uDDB8-\uDDDD]'
-    },
-    {
-        'name': 'SignWriting',
-        'astral': '\uD836[\uDC00-\uDE8B\uDE9B-\uDE9F\uDEA1-\uDEAF]'
-    },
-    {
-        'name': 'Sinhala',
-        'bmp': '\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2-\u0DF4',
-        'astral': '\uD804[\uDDE1-\uDDF4]'
-    },
-    {
-        'name': 'Sogdian',
-        'astral': '\uD803[\uDF30-\uDF59]'
-    },
-    {
-        'name': 'Sora_Sompeng',
-        'astral': '\uD804[\uDCD0-\uDCE8\uDCF0-\uDCF9]'
-    },
-    {
-        'name': 'Soyombo',
-        'astral': '\uD806[\uDE50-\uDEA2]'
-    },
-    {
-        'name': 'Sundanese',
-        'bmp': '\u1B80-\u1BBF\u1CC0-\u1CC7'
-    },
-    {
-        'name': 'Syloti_Nagri',
-        'bmp': '\uA800-\uA82B'
-    },
-    {
-        'name': 'Syriac',
-        'bmp': '\u0700-\u070D\u070F-\u074A\u074D-\u074F\u0860-\u086A'
-    },
-    {
-        'name': 'Tagalog',
-        'bmp': '\u1700-\u170C\u170E-\u1714'
-    },
-    {
-        'name': 'Tagbanwa',
-        'bmp': '\u1760-\u176C\u176E-\u1770\u1772\u1773'
-    },
-    {
-        'name': 'Tai_Le',
-        'bmp': '\u1950-\u196D\u1970-\u1974'
-    },
-    {
-        'name': 'Tai_Tham',
-        'bmp': '\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA0-\u1AAD'
-    },
-    {
-        'name': 'Tai_Viet',
-        'bmp': '\uAA80-\uAAC2\uAADB-\uAADF'
-    },
-    {
-        'name': 'Takri',
-        'astral': '\uD805[\uDE80-\uDEB8\uDEC0-\uDEC9]'
-    },
-    {
-        'name': 'Tamil',
-        'bmp': '\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BFA',
-        'astral': '\uD807[\uDFC0-\uDFF1\uDFFF]'
-    },
-    {
-        'name': 'Tangut',
-        'astral': '\uD81B\uDFE0|[\uD81C-\uD820][\uDC00-\uDFFF]|\uD821[\uDC00-\uDFF7]|\uD822[\uDC00-\uDEF2]'
-    },
-    {
-        'name': 'Telugu',
-        'bmp': '\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C77-\u0C7F'
-    },
-    {
-        'name': 'Thaana',
-        'bmp': '\u0780-\u07B1'
-    },
-    {
-        'name': 'Thai',
-        'bmp': '\u0E01-\u0E3A\u0E40-\u0E5B'
-    },
-    {
-        'name': 'Tibetan',
-        'bmp': '\u0F00-\u0F47\u0F49-\u0F6C\u0F71-\u0F97\u0F99-\u0FBC\u0FBE-\u0FCC\u0FCE-\u0FD4\u0FD9\u0FDA'
-    },
-    {
-        'name': 'Tifinagh',
-        'bmp': '\u2D30-\u2D67\u2D6F\u2D70\u2D7F'
-    },
-    {
-        'name': 'Tirhuta',
-        'astral': '\uD805[\uDC80-\uDCC7\uDCD0-\uDCD9]'
-    },
-    {
-        'name': 'Ugaritic',
-        'astral': '\uD800[\uDF80-\uDF9D\uDF9F]'
-    },
-    {
-        'name': 'Vai',
-        'bmp': '\uA500-\uA62B'
-    },
-    {
-        'name': 'Wancho',
-        'astral': '\uD838[\uDEC0-\uDEF9\uDEFF]'
-    },
-    {
-        'name': 'Warang_Citi',
-        'astral': '\uD806[\uDCA0-\uDCF2\uDCFF]'
-    },
-    {
-        'name': 'Yi',
-        'bmp': '\uA000-\uA48C\uA490-\uA4C6'
-    },
-    {
-        'name': 'Zanabazar_Square',
-        'astral': '\uD806[\uDE00-\uDE47]'
-    }
-];
-
-},{}]},{},[8])(8)
-});
